ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggOTdmN2I0Zi4uNGU4M2U3YiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTMyLDYgKzMyLDcgQEAKIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAYWNtLm9yZz4KIERhdmlkIEJyb3duZWxsIDxkYXZpZC1iQHBhY2JlbGwubmV0PgogRGF2aWQgV29vZGhvdXNlIDxkd213MkBzaGlueWJvb2suaW5mcmFkZWFkLm9yZz4KK0RtaXRyeSBFcmVtaW4tU29sZW5pa292IDxkYmFyeXNoa292QGdtYWlsLmNvbT4KIERvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgogRG91Z2xhcyBHaWxiZXJ0IDxkb3VnZ0B0b3JxdWUubmV0PgogRWQgTC4gQ2FzaGluIDxlY2FzaGluQGNvcmFpZC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeQppbmRleCA3YTE2ZmUxLi45ZmU5MWMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5CisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1tZW1vcnkKQEAgLTYsNyArNiw2IEBACiAJCWludGVybmFsIHN0YXRlIG9mIHRoZSBrZXJuZWwgbWVtb3J5IGJsb2Nrcy4gRmlsZXMgY291bGQgYmUKIAkJYWRkZWQgb3IgcmVtb3ZlZCBkeW5hbWljYWxseSB0byByZXByZXNlbnQgaG90LWFkZC9yZW1vdmUKIAkJb3BlcmF0aW9ucy4KLQogVXNlcnM6CQlob3RwbHVnIG1lbW9yeSBhZGQvcmVtb3ZlIHRvb2xzCiAJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCiAKQEAgLTE5LDYgKzE4LDU2IEBACiAJCVRoaXMgaXMgdXNlZnVsIGZvciBhIHVzZXItbGV2ZWwgYWdlbnQgdG8gZGV0ZXJtaW5lCiAJCWlkZW50aWZ5IHJlbW92YWJsZSBzZWN0aW9ucyBvZiB0aGUgbWVtb3J5IGJlZm9yZSBhdHRlbXB0aW5nCiAJCXBvdGVudGlhbGx5IGV4cGVuc2l2ZSBob3QtcmVtb3ZlIG1lbW9yeSBvcGVyYXRpb24KLQogVXNlcnM6CQlob3RwbHVnIG1lbW9yeSByZW1vdmUgdG9vbHMKIAkJaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vcHJvamVjdHMvcG93ZXJwYy11dGlscy8KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19kZXZpY2UKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19kZXZpY2UKKwkJaXMgcmVhZC1vbmx5IGFuZCBpcyBkZXNpZ25lZCB0byBzaG93IHRoZSBuYW1lIG9mIHBoeXNpY2FsCisJCW1lbW9yeSBkZXZpY2UuICBJbXBsZW1lbnRhdGlvbiBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19pbmRleAorRGF0ZToJCVNlcHRlbWJlciAyMDA4CitDb250YWN0OglCYWRhcmkgUHVsYXZhcnR5IDxwYmFkYXJpQHVzLmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGZpbGUgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9waHlzX2luZGV4CisJCWlzIHJlYWQtb25seSBhbmQgY29udGFpbnMgdGhlIHNlY3Rpb24gSUQgaW4gaGV4YWRlY2ltYWwKKwkJd2hpY2ggaXMgZXF1aXZhbGVudCB0byBkZWNpbWFsIFggY29udGFpbmVkIGluIHRoZQorCQltZW1vcnkgc2VjdGlvbiBkaXJlY3RvcnkgbmFtZS4KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKKwkJaXMgcmVhZC13cml0ZS4gIFdoZW4gcmVhZCwgaXQncyBjb250ZW50cyBzaG93IHRoZQorCQlvbmxpbmUvb2ZmbGluZSBzdGF0ZSBvZiB0aGUgbWVtb3J5IHNlY3Rpb24uICBXaGVuIHdyaXR0ZW4sCisJCXJvb3QgY2FuIHRvZ2dsZSB0aGUgdGhlIG9ubGluZS9vZmZsaW5lIHN0YXRlIG9mIGEgcmVtb3ZhYmxlCisJCW1lbW9yeSBzZWN0aW9uIChzZWUgcmVtb3ZhYmxlIGZpbGUgZGVzY3JpcHRpb24gYWJvdmUpCisJCXVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuCisJCSMgZWNobyBvbmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCisJCSMgZWNobyBvZmZsaW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9zdGF0ZQorCisJCUZvciBleGFtcGxlLCBpZiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9yZW1vdmFibGUKKwkJY29udGFpbnMgYSB2YWx1ZSBvZiAxIGFuZAorCQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9zdGF0ZSBjb250YWlucyB0aGUKKwkJc3RyaW5nICJvbmxpbmUiIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjYW4gYmUgZXhlY3V0ZWQgYnkKKwkJYnkgcm9vdCB0byBvZmZsaW5lIHRoYXQgc2VjdGlvbi4KKwkJIyBlY2hvIG9mZmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnkyMi9zdGF0ZQorVXNlcnM6CQlob3RwbHVnIG1lbW9yeSByZW1vdmUgdG9vbHMKKwkJaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vcHJvamVjdHMvcG93ZXJwYy11dGlscy8KKworV2hhdDoJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWC9tZW1vcnlZCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUdhcnkgSGFkZSA8Z2FyeWhhZGVAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlXaGVuIENPTkZJR19OVU1BIGlzIGVuYWJsZWQKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGVYL21lbW9yeVkgaXMgYSBzeW1ib2xpYyBsaW5rIHRoYXQKKwkJcG9pbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVkKKwkJbWVtb3J5IHNlY3Rpb24gZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMKKwkJbGluayBpcyBjcmVhdGVkIGZvciBtZW1vcnkgc2VjdGlvbiA5IG9uIG5vZGUwLgorCQkvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZTAvbWVtb3J5OSAtPiAuLi8uLi9tZW1vcnkvbWVtb3J5OQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CmluZGV4IGM3NGZlYzguLmIyYTRkNmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0CkBAIC0yNiw3ICsyNiw3IEBACiB0cmFuc2Zlci4KIAogVGhlIGZvbGxvd2luZyBBUEkgd2lsbCB3b3JrIG9mIGNvdXJzZSBldmVuIG9uIHBsYXRmb3JtcyB3aGVyZSBubyBzdWNoCi1oYXJkd2FyZSBleGlzdHMsIHNlZSBlLmcuIGluY2x1ZGUvYXNtLWkzODYvcGNpLmggZm9yIGhvdyBpdCBpcyBpbXBsZW1lbnRlZCBvbgoraGFyZHdhcmUgZXhpc3RzLCBzZWUgZS5nLiBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBmb3IgaG93IGl0IGlzIGltcGxlbWVudGVkIG9uCiB0b3Agb2YgdGhlIHZpcnRfdG9fYnVzIGludGVyZmFjZS4KIAogRmlyc3Qgb2YgYWxsLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsCmluZGV4IGRmODdkMWIuLmI3ODdlNDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay91aW8taG93dG8udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwKQEAgLTQyLDYgKzQyLDEyIEBACiAKIDxyZXZoaXN0b3J5PgogCTxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjAuNjwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMDgtMTItMDU8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPmhqazwvYXV0aG9yaW5pdGlhbHM+CisJPHJldnJlbWFyaz5BZGRlZCBkZXNjcmlwdGlvbiBvZiBwb3J0aW8gc3lzZnMgYXR0cmlidXRlcy48L3JldnJlbWFyaz4KKwk8L3JldmlzaW9uPgorCTxyZXZpc2lvbj4KIAk8cmV2bnVtYmVyPjAuNTwvcmV2bnVtYmVyPgogCTxkYXRlPjIwMDgtMDUtMjI8L2RhdGU+CiAJPGF1dGhvcmluaXRpYWxzPmhqazwvYXV0aG9yaW5pdGlhbHM+CkBAIC0zMTgsNiArMzI0LDU0IEBACiBvZmZzZXQgPSBOICogZ2V0cGFnZXNpemUoKTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKKzxwYXJhPgorCVNvbWV0aW1lcyB0aGVyZSBpcyBoYXJkd2FyZSB3aXRoIG1lbW9yeS1saWtlIHJlZ2lvbnMgdGhhdCBjYW4gbm90IGJlCisJbWFwcGVkIHdpdGggdGhlIHRlY2huaXF1ZSBkZXNjcmliZWQgaGVyZSwgYnV0IHRoZXJlIGFyZSBzdGlsbCB3YXlzIHRvCisJYWNjZXNzIHRoZW0gZnJvbSB1c2Vyc3BhY2UuIFRoZSBtb3N0IGNvbW1vbiBleGFtcGxlIGFyZSB4ODYgaW9wb3J0cy4KKwlPbiB4ODYgc3lzdGVtcywgdXNlcnNwYWNlIGNhbiBhY2Nlc3MgdGhlc2UgaW9wb3J0cyB1c2luZworCTxmdW5jdGlvbj5pb3Blcm0oKTwvZnVuY3Rpb24+LCA8ZnVuY3Rpb24+aW9wbCgpPC9mdW5jdGlvbj4sCisJPGZ1bmN0aW9uPmluYigpPC9mdW5jdGlvbj4sIDxmdW5jdGlvbj5vdXRiKCk8L2Z1bmN0aW9uPiwgYW5kIHNpbWlsYXIKKwlmdW5jdGlvbnMuCis8L3BhcmE+Cis8cGFyYT4KKwlTaW5jZSB0aGVzZSBpb3BvcnQgcmVnaW9ucyBjYW4gbm90IGJlIG1hcHBlZCwgdGhleSB3aWxsIG5vdCBhcHBlYXIgdW5kZXIKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9tYXBzLzwvZmlsZW5hbWU+IGxpa2UgdGhlIG5vcm1hbCBtZW1vcnkKKwlkZXNjcmliZWQgYWJvdmUuIFdpdGhvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvcnQgcmVnaW9ucyBhIGhhcmR3YXJlCisJaGFzIHRvIG9mZmVyLCBpdCBiZWNvbWVzIGRpZmZpY3VsdCBmb3IgdGhlIHVzZXJzcGFjZSBwYXJ0IG9mIHRoZQorCWRyaXZlciB0byBmaW5kIG91dCB3aGljaCBwb3J0cyBiZWxvbmcgdG8gd2hpY2ggVUlPIGRldmljZS4KKzwvcGFyYT4KKzxwYXJhPgorCVRvIGFkZHJlc3MgdGhpcyBzaXR1YXRpb24sIHRoZSBuZXcgZGlyZWN0b3J5CisJPGZpbGVuYW1lPi9zeXMvY2xhc3MvdWlvL3Vpb1gvcG9ydGlvLzwvZmlsZW5hbWU+IHdhcyBhZGRlZC4gSXQgb25seQorCWV4aXN0cyBpZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgcG9ydAorCXJlZ2lvbnMgdG8gdXNlcnNwYWNlLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBzdWJkaXJlY3RvcmllcyBuYW1lZAorCTxmaWxlbmFtZT5wb3J0MDwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+cG9ydDE8L2ZpbGVuYW1lPiwgYW5kIHNvIG9uLAorCXdpbGwgYXBwZWFyIHVuZGVybmVhdGgKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9wb3J0aW8vPC9maWxlbmFtZT4uCis8L3BhcmE+Cis8cGFyYT4KKwlFYWNoIDxmaWxlbmFtZT5wb3J0WC88L2ZpbGVuYW1lPiBkaXJlY3RvcnkgY29udGFpbnMgdGhyZWUgcmVhZC1vbmx5CisJZmlsZXMgdGhhdCBzaG93IHN0YXJ0LCBzaXplLCBhbmQgdHlwZSBvZiB0aGUgcG9ydCByZWdpb246Cis8L3BhcmE+Cis8aXRlbWl6ZWRsaXN0PgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5zdGFydDwvZmlsZW5hbWU+OiBUaGUgZmlyc3QgcG9ydCBvZiB0aGlzIHJlZ2lvbi4KKwk8L3BhcmE+Cis8L2xpc3RpdGVtPgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5zaXplPC9maWxlbmFtZT46IFRoZSBudW1iZXIgb2YgcG9ydHMgaW4gdGhpcyByZWdpb24uCisJPC9wYXJhPgorPC9saXN0aXRlbT4KKzxsaXN0aXRlbT4KKwk8cGFyYT4KKwk8ZmlsZW5hbWU+cG9ydHR5cGU8L2ZpbGVuYW1lPjogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiBwb3J0LgorCTwvcGFyYT4KKzwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD4KKworCiA8L3NlY3QxPgogPC9jaGFwdGVyPgogCkBAIC0zMzksMTIgKzM5MywxMiBAQAogCiA8aXRlbWl6ZWRsaXN0PgogPGxpc3RpdGVtPjxwYXJhPgotPHZhcm5hbWU+Y2hhciAqbmFtZTwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGUgbmFtZSBvZiB5b3VyIGRyaXZlciBhcworPHZhcm5hbWU+Y29uc3QgY2hhciAqbmFtZTwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGUgbmFtZSBvZiB5b3VyIGRyaXZlciBhcwogaXQgd2lsbCBhcHBlYXIgaW4gc3lzZnMuIEkgcmVjb21tZW5kIHVzaW5nIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlIGZvciB0aGlzLgogPC9wYXJhPjwvbGlzdGl0ZW0+CiAKIDxsaXN0aXRlbT48cGFyYT4KLTx2YXJuYW1lPmNoYXIgKnZlcnNpb248L3Zhcm5hbWU+OiBSZXF1aXJlZC4gVGhpcyBzdHJpbmcgYXBwZWFycyBpbgorPHZhcm5hbWU+Y29uc3QgY2hhciAqdmVyc2lvbjwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGlzIHN0cmluZyBhcHBlYXJzIGluCiA8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC92ZXJzaW9uPC9maWxlbmFtZT4uCiA8L3BhcmE+PC9saXN0aXRlbT4KIApAQCAtMzU2LDYgKzQxMCwxMyBAQAogPC9wYXJhPjwvbGlzdGl0ZW0+CiAKIDxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnN0cnVjdCB1aW9fcG9ydCBwb3J0WyBNQVhfVUlPX1BPUlRTX1JFR0lPTlMgXTwvdmFybmFtZT46IFJlcXVpcmVkCitpZiB5b3Ugd2FudCB0byBwYXNzIGluZm9ybWF0aW9uIGFib3V0IGlvcG9ydHMgdG8gdXNlcnNwYWNlLiBGb3IgZWFjaCBwb3J0CityZWdpb24geW91IG5lZWQgdG8gZmlsbCBvbmUgb2YgdGhlIDx2YXJuYW1lPnVpb19wb3J0PC92YXJuYW1lPiBzdHJ1Y3R1cmVzLgorU2VlIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBmb3IgZGV0YWlscy4KKzwvcGFyYT48L2xpc3RpdGVtPgorCis8bGlzdGl0ZW0+PHBhcmE+CiA8dmFybmFtZT5sb25nIGlycTwvdmFybmFtZT46IFJlcXVpcmVkLiBJZiB5b3VyIGhhcmR3YXJlIGdlbmVyYXRlcyBhbgogaW50ZXJydXB0LCBpdCdzIHlvdXIgbW9kdWxlcyB0YXNrIHRvIGRldGVybWluZSB0aGUgaXJxIG51bWJlciBkdXJpbmcKIGluaXRpYWxpemF0aW9uLiBJZiB5b3UgZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGdlbmVyYXRlZCBpbnRlcnJ1cHQgYnV0CkBAIC00NDgsNiArNTA5LDQyIEBACiA8dmFybmFtZT5zdHJ1Y3QgdWlvX21lbTwvdmFybmFtZT4hIEl0IGlzIHVzZWQgYnkgdGhlIFVJTyBmcmFtZXdvcmsKIHRvIHNldCB1cCBzeXNmcyBmaWxlcyBmb3IgdGhpcyBtYXBwaW5nLiBTaW1wbHkgbGVhdmUgaXQgYWxvbmUuCiA8L3BhcmE+CisKKzxwYXJhPgorU29tZXRpbWVzLCB5b3VyIGRldmljZSBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBwb3J0IHJlZ2lvbnMgd2hpY2ggY2FuIG5vdCBiZQorbWFwcGVkIHRvIHVzZXJzcGFjZS4gQnV0IGlmIHRoZXJlIGFyZSBvdGhlciBwb3NzaWJpbGl0aWVzIGZvciB1c2Vyc3BhY2UgdG8KK2FjY2VzcyB0aGVzZSBwb3J0cywgaXQgbWFrZXMgc2Vuc2UgdG8gbWFrZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydHMKK2F2YWlsYWJsZSBpbiBzeXNmcy4gRm9yIGVhY2ggcmVnaW9uLCB5b3UgaGF2ZSB0byBzZXQgdXAgYQorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPiBpbiB0aGUgPHZhcm5hbWU+cG9ydFtdPC92YXJuYW1lPiBhcnJheS4KK0hlcmUncyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZHMgb2YgPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPjoKKzwvcGFyYT4KKworPGl0ZW1pemVkbGlzdD4KKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPmNoYXIgKnBvcnR0eXBlPC92YXJuYW1lPjogUmVxdWlyZWQuIFNldCB0aGlzIHRvIG9uZSBvZiB0aGUgcHJlZGVmaW5lZAorY29uc3RhbnRzLiBVc2UgPHZhcm5hbWU+VUlPX1BPUlRfWDg2PC92YXJuYW1lPiBmb3IgdGhlIGlvcG9ydHMgZm91bmQgaW4geDg2CithcmNoaXRlY3R1cmVzLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnVuc2lnbmVkIGxvbmcgc3RhcnQ8L3Zhcm5hbWU+OiBSZXF1aXJlZCBpZiB0aGUgcG9ydCByZWdpb24gaXMgdXNlZC4KK0ZpbGwgaW4gdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgcG9ydCBvZiB0aGlzIHJlZ2lvbi4KKzwvcGFyYT48L2xpc3RpdGVtPgorCis8bGlzdGl0ZW0+PHBhcmE+Cis8dmFybmFtZT51bnNpZ25lZCBsb25nIHNpemU8L3Zhcm5hbWU+OiBGaWxsIGluIHRoZSBudW1iZXIgb2YgcG9ydHMgaW4gdGhpcworcmVnaW9uLiBJZiA8dmFybmFtZT5zaXplPC92YXJuYW1lPiBpcyB6ZXJvLCB0aGUgcmVnaW9uIGlzIGNvbnNpZGVyZWQgdW51c2VkLgorTm90ZSB0aGF0IHlvdSA8ZW1waGFzaXM+bXVzdDwvZW1waGFzaXM+IGluaXRpYWxpemUgPHZhcm5hbWU+c2l6ZTwvdmFybmFtZT4KK3dpdGggemVybyBmb3IgYWxsIHVudXNlZCByZWdpb25zLgorPC9wYXJhPjwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD4KKworPHBhcmE+CitQbGVhc2UgZG8gbm90IHRvdWNoIHRoZSA8dmFybmFtZT5wb3J0aW88L3Zhcm5hbWU+IGVsZW1lbnQgb2YKKzx2YXJuYW1lPnN0cnVjdCB1aW9fcG9ydDwvdmFybmFtZT4hIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVUlPCitmcmFtZXdvcmsgdG8gc2V0IHVwIHN5c2ZzIGZpbGVzIGZvciB0aGlzIHJlZ2lvbi4gU2ltcGx5IGxlYXZlIGl0IGFsb25lLgorPC9wYXJhPgorCiA8L3NlY3QxPgogCiA8c2VjdDEgaWQ9ImFkZGluZ19pcnFfaGFuZGxlciI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZGYxOGQ4Ny4uMjE5M2JlNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMzE1LDMgKzMxNSwxNSBAQAogV2h5OglEZXByZWNhdGVkIGJ5IHRoZSBuZXcgKHN0YW5kYXJkKSBkZXZpY2UgZHJpdmVyIGJpbmRpbmcgbW9kZWwuIFVzZQogCWkyY19kcml2ZXItPnByb2JlKCkgYW5kIC0+cmVtb3ZlKCkgaW5zdGVhZC4KIFdobzoJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglTRUxpbnV4ICJjb21wYXRfbmV0IiBmdW5jdGlvbmFsaXR5CitXaGVuOgkyLjYuMzAgYXQgdGhlIGVhcmxpZXN0CitXaHk6CUluIDIuNi4xOCB0aGUgU2VjbWFyayBjb25jZXB0IHdhcyBpbnRyb2R1Y2VkIHRvIHJlcGxhY2UgdGhlICJjb21wYXRfbmV0IgorCW5ldHdvcmsgYWNjZXNzIGNvbnRyb2wgZnVuY3Rpb25hbGl0eSBvZiBTRUxpbnV4LiAgU2VjbWFyayBvZmZlcnMgYm90aAorCWJldHRlciBwZXJmb3JtYW5jZSBhbmQgZ3JlYXRlciBmbGV4aWJpbGl0eSB0aGFuIHRoZSAiY29tcGF0X25ldCIKKwltZWNoYW5pc20uICBOb3cgdGhhdCB0aGUgbWFqb3IgTGludXggZGlzdHJpYnV0aW9ucyBoYXZlIG1vdmVkIHRvCisJU2VjbWFyaywgaXQgaXMgdGltZSB0byBkZXByZWNhdGUgdGhlIG9sZGVyIG1lY2hhbmlzbSBhbmQgc3RhcnQgdGhlCisJcHJvY2VzcyBvZiByZW1vdmluZyB0aGUgb2xkIGNvZGUuCitXaG86CVBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IGNjZWM1NTMuLmNmYmZhMTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTM5Nyw3ICszOTcsNyBAQAogfTsKIAogbG9ja2luZyBydWxlczoKLQlBbGwgZXhjZXB0IC0+cG9sbCgpIG1heSBibG9jay4KKwlBbGwgbWF5IGJsb2NrLgogCQkJQktMCiBsbHNlZWs6CQkJbm8JKHNlZSBiZWxvdykKIHJlYWQ6CQkJbm8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDcxZGYzNTMuLjMyZTk0NjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTM4NSw2ICsxMzg1LDE1IEBACiB0byByZXRhaW4gZGVudHJ5IGFuZCBpbm9kZSBjYWNoZXMuICBJbmNyZWFzaW5nIHZmc19jYWNoZV9wcmVzc3VyZSBiZXlvbmQgMTAwCiBjYXVzZXMgdGhlIGtlcm5lbCB0byBwcmVmZXIgdG8gcmVjbGFpbSBkZW50cmllcyBhbmQgaW5vZGVzLgogCitkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIHRoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrCitkYWVtb24gd2lsbCBzdGFydCB3cml0ZWJhY2suCisKK0lmIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgaXMgd3JpdHRlbiwgZGlydHlfYmFja2dyb3VuZF9yYXRpbyBiZWNvbWVzIGEgZnVuY3Rpb24KK29mIGl0cyB2YWx1ZSAoZGlydHlfYmFja2dyb3VuZF9ieXRlcyAvIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEzOTMsMTQgKzE0MDIsMjkgQEAKIHBhZ2VzIGF0IHdoaWNoIHRoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrIGRhZW1vbiB3aWxsIHN0YXJ0IHdyaXRpbmcgb3V0CiBkaXJ0eSBkYXRhLgogCitJZiBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvIGlzIHdyaXR0ZW4sIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgYmVjb21lcyBhIGZ1bmN0aW9uCitvZiBpdHMgdmFsdWUgKGRpcnR5X2JhY2tncm91bmRfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KKworZGlydHlfYnl0ZXMKKy0tLS0tLS0tLS0tCisKK0NvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIGEgcHJvY2VzcyBnZW5lcmF0aW5nIGRpc2sgd3JpdGVzCit3aWxsIGl0c2VsZiBzdGFydCB3cml0ZWJhY2suCisKK0lmIGRpcnR5X2J5dGVzIGlzIHdyaXR0ZW4sIGRpcnR5X3JhdGlvIGJlY29tZXMgYSBmdW5jdGlvbiBvZiBpdHMgdmFsdWUKKyhkaXJ0eV9ieXRlcyAvIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCiBkaXJ0eV9yYXRpbwotLS0tLS0tLS0tLS0tLS0tLS0KKy0tLS0tLS0tLS0tCiAKIENvbnRhaW5zLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5IChmcmVlIHBhZ2VzICsgbWFwcGVkCiBwYWdlcyArIGZpbGUgY2FjaGUsIG5vdCBpbmNsdWRpbmcgbG9ja2VkIHBhZ2VzIGFuZCBIdWdlUGFnZXMpLCB0aGUgbnVtYmVyIG9mCiBwYWdlcyBhdCB3aGljaCBhIHByb2Nlc3Mgd2hpY2ggaXMgZ2VuZXJhdGluZyBkaXNrIHdyaXRlcyB3aWxsIGl0c2VsZiBzdGFydAogd3JpdGluZyBvdXQgZGlydHkgZGF0YS4KIAorSWYgZGlydHlfcmF0aW8gaXMgd3JpdHRlbiwgZGlydHlfYnl0ZXMgYmVjb21lcyBhIGZ1bmN0aW9uIG9mIGl0cyB2YWx1ZQorKGRpcnR5X3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwCmluZGV4IDc1ZDEzY2EuLjhjZTRhYTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKQEAgLTMxLDE1ICszMSwxMSBAQAogbGltaXQgdmFsdWVzLiBUaGUgQURUNzQ3MCB3aWxsIHNpZ25hbCBhbiBBTEFSTSBpZiBhbnkgbWVhc3VyZWQgdmFsdWUgZXhjZWVkcwogZWl0aGVyIGxpbWl0LgogCi1UaGUgQURUNzQ3MCBET0VTIE5PVCBzYW1wbGUgYWxsIGlucHV0cyBjb250aW51b3VzbHkuICBBIHNpbmdsZSBwaW4gb24gdGhlCi1BRFQ3NDcwIGlzIGNvbm5lY3RlZCB0byBhIG11bHRpdHVkZSBvZiB0aGVybWFsIGRpb2RlcywgYnV0IHRoZSBjaGlwIG11c3QgYmUKLWluc3RydWN0ZWQgZXhwbGljaXRseSB0byByZWFkIHRoZSBtdWx0aXR1ZGUgb2YgZGlvZGVzLiAgSWYgeW91IHdhbnQgdG8gdXNlCi1hdXRvbWF0aWMgZmFuIGNvbnRyb2wgbW9kZSwgeW91IG11c3QgbWFudWFsbHkgcmVhZCBhbnkgb2YgdGhlIHRlbXBlcmF0dXJlCi1zZW5zb3JzIG9yIHRoZSBmYW4gY29udHJvbCBhbGdvcml0aG0gd2lsbCBub3QgcnVuLiAgVGhlIGNoaXAgV0lMTCBOT1QgRE8gVEhJUwotQVVUT01BVElDQUxMWTsgdGhpcyBtdXN0IGJlIGRvbmUgZnJvbSB1c2Vyc3BhY2UuICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiB0aGUgY2hpcAotZGVzaWduLCBnaXZlbiB0aGF0IG1hbnkgb3RoZXIgQUQgY2hpcHMgdGFrZSBjYXJlIG9mIHRoaXMuICBUaGUgZHJpdmVyIHdpbGwgbm90Ci1yZWFkIHRoZSByZWdpc3RlcnMgbW9yZSBvZnRlbiB0aGFuIG9uY2UgZXZlcnkgNSBzZWNvbmRzLiAgRnVydGhlciwKLWNvbmZpZ3VyYXRpb24gZGF0YSBpcyBvbmx5IHJlYWQgb25jZSBwZXIgbWludXRlLgorVGhlIEFEVDc0NzAgc2FtcGxlcyBhbGwgaW5wdXRzIGNvbnRpbnVvdXNseS4gIEEga2VybmVsIHRocmVhZCBpcyBzdGFydGVkIHVwIGZvcgordGhlIHB1cnBvc2Ugb2YgcGVyaW9kaWNhbGx5IHF1ZXJ5aW5nIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCB0aHVzIGFsbG93aW5nIHRoZQorYXV0b21hdGljIGZhbiBwd20gY29udHJvbCB0byBzZXQgdGhlIGZhbiBzcGVlZC4gIFRoZSBkcml2ZXIgd2lsbCBub3QgcmVhZCB0aGUKK3JlZ2lzdGVycyBtb3JlIG9mdGVuIHRoYW4gb25jZSBldmVyeSA1IHNlY29uZHMuICBGdXJ0aGVyLCBjb25maWd1cmF0aW9uIGRhdGEgaXMKK29ubHkgcmVhZCBvbmNlIHBlciBtaW51dGUuCiAKIFNwZWNpYWwgRmVhdHVyZXMKIC0tLS0tLS0tLS0tLS0tLS0KQEAgLTcyLDUgKzY4LDYgQEAKIE5vdGVzCiAtLS0tLQogCi1BcyBzdGF0ZWQgYWJvdmUsIHRoZSB0ZW1wZXJhdHVyZSBpbnB1dHMgbXVzdCBiZSByZWFkIHBlcmlvZGljYWxseSBmcm9tCi11c2Vyc3BhY2UgaW4gb3JkZXIgZm9yIHRoZSBhdXRvbWF0aWMgcHdtIGFsZ29yaXRobSB0byBydW4uCitUaGUgdGVtcGVyYXR1cmUgaW5wdXRzIG5vIGxvbmdlciBuZWVkIHRvIGJlIHJlYWQgcGVyaW9kaWNhbGx5IGZyb20gdXNlcnNwYWNlIGluCitvcmRlciBmb3IgdGhlIGF1dG9tYXRpYyBwd20gYWxnb3JpdGhtIHRvIHJ1bi4gIFRoaXMgd2FzIHRoZSBjYXNlIGZvciBlYXJsaWVyCit2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dCBiL0RvY3VtZW50YXRpb24vaWRlL3dhcm0tcGx1Zy1ob3d0by50eHQKaW5kZXggZDU4ODU0Ni4uOTgxNTJiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lkZS93YXJtLXBsdWctaG93dG8udHh0CkBAIC0xMSwzICsxMSw4IEBACiAjIGVjaG8gLW4gIjEiID4gL3N5cy9jbGFzcy9pZGVfcG9ydC9pZGV4L3NjYW4KIAogZG9uZQorCitOT1RFOiBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgcGFydGl0aW9ucyBhcmUgdW5tb3VudGVkIGFuZCB0aGF0IHRoZXJlIGFyZQorbm8gb3RoZXIgYWN0aXZlIHJlZmVyZW5jZXMgdG8gZGV2aWNlcyBiZWZvcmUgZG9pbmcgImRlbGV0ZV9kZXZpY2VzIiBzdGVwLAorYWxzbyBkbyBub3QgYXR0ZW1wdCAic2NhbiIgc3RlcCBvbiBkZXZpY2VzIGN1cnJlbnRseSBpbiB1c2UgLS0gb3RoZXJ3aXNlCityZXN1bHRzIG1heSBiZSB1bnByZWRpY3RhYmxlIGFuZCBsZWFkIHRvIGRhdGEgbG9zcyBpZiB5b3UncmUgdW5sdWNreQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC93YWxrZXJhMDcwMS50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQyODllCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC93YWxrZXJhMDcwMS50eHQKQEAgLTAsMCArMSwxMDkgQEAKKworV2Fsa2VyYSBXSy0wNzAxIHRyYW5zbWl0dGVyIGlzIHN1cHBsaWVkIHdpdGggYSByZWFkeSB0byBmbHkgV2Fsa2VyYQoraGVsaWNvcHRlcnMgc3VjaCBhcyBITTM2LCBITTM3LCBITTYwLiBUaGUgd2Fsa2VyYTA3MDEgbW9kdWxlIGVuYWJsZXMgdG8gdXNlCit0aGlzIHRyYW5zbWl0dGVyIGFzIGpveXN0aWNrCisKK0RldmVsIGhvbWVwYWdlIGFuZCBkb3dubG9hZDoKK2h0dHA6Ly96dWIuZmVpLnR1a2Uuc2svd2Fsa2VyYS13azA3MDEvCisKK29yIHVzZSBjb2dpdG86CitjZy1jbG9uZSBodHRwOi8venViLmZlaS50dWtlLnNrL0dJVC93YWxrZXJhMDcwMS1qb3lzdGljaworCisKK0Nvbm5lY3RpbmcgdG8gUEM6CisKK0F0IGJhY2sgc2lkZSBvZiB0cmFuc21pdHRlciBTLXZpZGVvIGNvbm5lY3RvciBjYW4gYmUgZm91bmQuIE1vZHVsYXRpb24KK3B1bHNlcyBmcm9tIHByb2Nlc3NvciB0byBIRiBwYXJ0IGNhbiBiZSBmb3VuZCBhdCBwaW4gMiBvZiB0aGlzIGNvbm5lY3RvciwKK3BpbiAzIGlzIEdORC4gQmV0d2VlbiBwaW4gMyBhbmQgQ1BVIDVrNiByZXNpc3RvciBjYW4gYmUgZm91bmQuIFRvIGdldAorbW9kdWxhdGlvbiBwdWxzZXMgdG8gUEMsIHNpZ25hbCBwdWxzZXMgbXVzdCBiZSBhbXBsaWZpZWQuCisKK0NhYmxlOiAod2Fsa2VyYSBUWCB0byBwYXJwb3J0KQorCitXYWxrZXJhIFdLLTA3MDEgVFggUy1WSURFTyBjb25uZWN0b3I6CisgKGJhY2sgc2lkZSBvZiBUWCkKKyAgICAgX18gICBfXyAgICAgICAgICAgICAgUy12aWRlbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub24yNQorICAgIC8gIHxffCAgXCAgICAgICAgICAgICBwaW4gMiAoc2lnbmFsKSAgICAgICAgICAgICAgTlBOICAgICAgICAgICBwYXJwb3J0CisgICAvIE8gNCAzIE8gXCAgICAgICAgICAgIHBpbiAzIChHTkQpICAgICAgICBMRUQgICAgICAgIF9fX19fX19fX19fX19fX18gIDEwIEFDSworICAoIE8gMiAgIDEgTyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEMKKyAgIFwgICBfX18gICAvICAgICAgMiBfX19fX19fX19fX19fX19fX19fX19fX198XHxfX19fX3wvCisgICAgfCBbX19fXSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC98ICAgQiB8XAorICAgICAtLS0tLS0tICAgICAgICAzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fXyAyNSBHTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFCisKKworSSB1c2UgZ3JlZW4gTEVEIGFuZCBCQzEwOSBOUE4gdHJhbnNpc3Rvci4KKworU29mdHdhcmU6CisKK0J1aWxkIGtlcm5lbCB3aXRoIHdhbGtlcmEwNzAxIG1vZHVsZS4gTW9kdWxlIHdhbGtlcmEwNzAxIG5lZWQgZXhjbHVzaXZlCithY2Nlc3MgdG8gcGFycG9ydCwgbW9kdWxlcyBsaWtlIGxwIG11c3QgYmUgdW5sb2FkZWQgYmVmb3JlIGxvYWRpbmcKK3dhbGtlcmEwNzAxIG1vZHVsZSwgY2hlY2sgZG1lc2cgZm9yIGVycm9yIG1lc3NhZ2VzLiBDb25uZWN0IFRYIHRvIFBDIGJ5CitjYWJsZSBhbmQgcnVuIGpzdGVzdCAvZGV2L2lucHV0L2pzMCB0byBzZWUgdmFsdWVzIGZyb20gVFguIElmIG5vIHZhbHVlIGNhbgorYmUgY2hhbmdlZCBieSBUWCAiam95c3RpY2siLCBjaGVjayBvdXRwdXQgZnJvbSAvcHJvYy9pbnRlcnJ1cHRzLiBWYWx1ZSBmb3IKKyh1c3VhbGx5IGlycTcpIHBhcnBvcnQgbXVzdCBpbmNyZWFzZSBpZiBUWCBpcyBvbi4KKworCisKK1RlY2huaWNhbCBkZXRhaWxzOgorCitEcml2ZXIgdXNlIGludGVycnVwdCBmcm9tIHBhcnBvcnQgQUNLIGlucHV0IGJpdCB0byBtZWFzdXJlIHB1bHNlIGxlbmd0aAordXNpbmcgaHJ0aW1lcnMuCisKK0ZyYW1lIGZvcm1hdDoKK0Jhc2VkIG9uIHdhbGtlcmEgV0stMDcwMSBQQ00gRm9ybWF0IGRlc2NyaXB0aW9uIGJ5IFNoYXVsIEVpemlrb3ZpY2guCisoZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuc21hcnRwcm9wb3BsdXMuY29tL0RvY3MvV2Fsa2VyYV9Xay0wNzAxX1BDTS5wZGYpCisKK1NpZ25hbCBwdWxzZXM6CisgICAgICAgICAgICAgICAgICAgKEFOQUxPRykKKyAgICBTWU5DICAgICAgQklOICAgT0NUCisgICstLS0tLS0tLS0rICAgICAgKy0tLS0tLSsKKyAgfCAgICAgICAgIHwgICAgICB8ICAgICAgfAorLS0rICAgICAgICAgKy0tLS0tLSsgICAgICArLS0tCisKK0ZyYW1lOgorIFNZTkMgLCBCSU4xLCBPQ1QxLCBCSU4yLCBPQ1QyIC4uLiBCSU4yNCwgT0NUMjQsIEJJTjI1LCBuZXh0IGZyYW1lIFNZTkMgLi4KKworcHVsc2UgbGVuZ3RoOgorICAgQmluYXJ5IHZhbHVlczoJCUFuYWxvZyBvY3RhbCB2YWx1ZXM6CisKKyAgIDI4OCB1UyBCaW5hcnkgMAkJMzE4IHVTICAgICAgIDAwMAorICAgNDM4IHVTIEJpbmFyeSAxCQkzOTggdVMgICAgICAgMDAxCisJCQkJNDc4IHVTICAgICAgIDAxMAorCQkJCTU1OCB1UyAgICAgICAwMTEKKwkJCQk2MzggdVMgICAgICAgMTAwCisgIDEzMDYgdVMgU1lOQwkJCTcxOCB1UyAgICAgICAxMDEKKwkJCQk3OTggdVMgICAgICAgMTEwCisJCQkJODc4IHVTICAgICAgIDExMQorCisyNCBiaW4rb2N0IHZhbHVlcyArIDEgYmluIHZhbHVlID0gMjQqNCsxIGJpdHMgID0gOTcgYml0cworCisoV2FybmluZywgcHVsc2VzIG9uIEFDSyBhciBpbnZlcnRlZCBieSB0cmFuc2lzdG9yLCBpcnEgaXMgcmlzZWQgdXAgb24gc3luYwordG8gYmluIGNoYW5nZSBvciBvY3RhbCB2YWx1ZSB0byBiaW4gY2hhbmdlKS4KKworQmluYXJ5IGRhdGEgcmVwcmVzZW50YXRpb25zOgorCitPbmUgYmluYXJ5IGFuZCBvY3RhbCB2YWx1ZSBjYW4gYmUgZ3JvdXBlZCB0byBuaWJibGUuIDI0IG5pYmJsZXMgKyBvbmUgYmluYXJ5Cit2YWx1ZXMgY2FuIGJlIHNhbXBsZWQgYmV0d2VlbiBzeW5jIHB1bHNlcy4KKworVmFsdWVzIGZvciBmaXJzdCBmb3VyIGNoYW5uZWxzIChhbmFsb2cgam95c3RpY2sgdmFsdWVzKSBjYW4gYmUgZm91bmQgaW4KK2ZpcnN0IDEwIG5pYmJsZXMuIEFuYWxvZyB2YWx1ZSBpcyByZXByZXNlbnRlZCBieSBvbmUgc2lnbiBiaXQgYW5kIDkgYml0CithYnNvbHV0ZSBiaW5hcnkgdmFsdWUuICgxMCBiaXRzIHBlciBjaGFubmVsKS4gTmV4dCBuaWJibGUgaXMgY2hlY2tzdW0gZm9yCitmaXJzdCB0ZW4gbmliYmxlcy4KKworTmV4dCBuaWJibGVzIDEyIC4uIDIxIHJlcHJlc2VudHMgZm91ciBjaGFubmVscyAobm90IGFsbCBjaGFubmVscyBjYW4gYmUKK2RpcmVjdGx5IGNvbnRyb2xsZWQgZnJvbSBUWCkuIEJpbmFyeSByZXByZXNlbnRhdGlvbnMgYXIgdGhlIHNhbWUgYXMgaW4gZmlyc3QKK2ZvdXIgY2hhbm5lbHMuIEluIG5pYmJsZXMgMjIgYW5kIDIzIGlzIGEgc3BlY2lhbCBtYWdpYyBudW1iZXIuIE5pYmJsZSAyNCBpcworY2hlY2tzdW0gZm9yIG5pYmJsZXMgMTIuLjIzLgorCitBZnRlciBsYXN0IG9jdGFsIHZhbHVlIGZvciBuaWJibGUgMjQgYW5kIG5leHQgc3luYyBwdWxzZSBvbmUgYWRkaXRpb25hbAorYmluYXJ5IHZhbHVlIGNhbiBiZSBzYW1wbGVkLiBUaGlzIGJpdCBhbmQgbWFnaWMgbnVtYmVyIGlzIG5vdCB1c2VkIGluCitzb2Z0d2FyZSBkcml2ZXIuIFNvbWUgZGV0YWlscyBhYm91dCB0aGlzIG1hZ2ljIG51bWJlcnMgY2FuIGJlIGZvdW5kIGluCitXYWxrZXJhX1drLTA3MDFfUENNLnBkZi4KKworQ2hlY2tzdW0gY2FsY3VsYXRpb246CisKK1N1bW1hcnkgb2Ygb2N0YWwgdmFsdWVzIGluIG5pYmJsZXMgbXVzdCBiZSBzYW1lIGFzIG9jdGFsIHZhbHVlIGluIGNoZWNrc3VtCituaWJibGUgKG9ubHkgZmlyc3QgMyBiaXRzIGFyZSB1c2VkKS4gQmluYXJ5IHZhbHVlIGZvciBjaGVja3N1bSBuaWJibGUgaXMKK2NhbGN1bGF0ZWQgYnkgc3VtIG9mIGJpbmFyeSB2YWx1ZXMgaW4gY2hlY2tlZCBuaWJibGVzICsgc3VtIG9mIG9jdGFsIHZhbHVlcworaW4gY2hlY2tlZCBuaWJibGVzIGRpdmlkZWQgYnkgOC4gT25seSBiaXQgMCBvZiB0aGlzIHN1bSBpcyB1c2VkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKaW5kZXggODI0Njk5MS4uZjFkNjM5OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dApAQCAtODQsNyArODQsNyBAQAogJ0InCUMwLUZGCQkJCWFkdmFuY2VkIGJidXMKIAkJCQkJPG1haWx0bzptYWFzc2VuQHVuaS1mcmVpYnVyZy5kZT4KICdDJwlhbGwJbGludXgvc291bmRjYXJkLmgKLSdEJwlhbGwJYXNtLXMzOTAvZGFzZC5oCisnRCcJYWxsCWFyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmgKICdFJwlhbGwJbGludXgvaW5wdXQuaAogJ0YnCWFsbAlsaW51eC9mYi5oCiAnSCcJYWxsCWxpbnV4L2hpZGRldi5oCkBAIC0xMDUsNyArMTA1LDcgQEAKICdTJwk4MC04MQlzY3NpL3Njc2lfaW9jdGwuaAljb25mbGljdCEKICdTJwk4Mi1GRglzY3NpL3Njc2kuaAkJY29uZmxpY3QhCiAnVCcJYWxsCWxpbnV4L3NvdW5kY2FyZC5oCWNvbmZsaWN0IQotJ1QnCWFsbAlhc20taTM4Ni9pb2N0bHMuaAljb25mbGljdCEKKydUJwlhbGwJYXJjaC94ODYvaW5jbHVkZS9hc20vaW9jdGxzLmgJY29uZmxpY3QhCiAnVScJMDAtRUYJbGludXgvZHJpdmVycy91c2IvdXNiLmgKICdWJwlhbGwJbGludXgvdnQuaAogJ1cnCTAwLTFGCWxpbnV4L3dhdGNoZG9nLmgJY29uZmxpY3QhCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJCQkJPG1haWx0bzpuYXRhbGlhQG5pa2hlZmsubmlraGVmLm5sPgogJ2MnCTAwLTdGCWxpbnV4L2NvbXN0YXRzLmgJY29uZmxpY3QhCiAnYycJMDAtN0YJbGludXgvY29kYS5oCQljb25mbGljdCEKLSdjJwk4MC05Rglhc20tczM5MC9jaHNjLmgKKydjJwk4MC05RglhcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hzYy5oCiAnZCcJMDAtRkYJbGludXgvY2hhci9kcm0vZHJtL2gJY29uZmxpY3QhCiAnZCcJMDAtREYJbGludXgvdmlkZW9fZGVjb2Rlci5oCWNvbmZsaWN0IQogJ2QnCUYwLUZGCWxpbnV4L2RpZ2kxLmgKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJCQk8bWFpbHRvOm9lQHBvcnQuZGU+CiAweDgwCTAwLTFGCWxpbnV4L2ZiLmgKIDB4ODEJMDAtMUYJbGludXgvdmlkZW90ZXh0LmgKLTB4ODkJMDAtMDYJYXNtLWkzODYvc29ja2lvcy5oCisweDg5CTAwLTA2CWFyY2gveDg2L2luY2x1ZGUvYXNtL3NvY2tpb3MuaAogMHg4OQkwQi1ERglsaW51eC9zb2NraW9zLmgKIDB4ODkJRTAtRUYJbGludXgvc29ja2lvcy5oCQlTSU9DUFJPVE9QUklWQVRFIHJhbmdlCiAweDg5CUYwLUZGCWxpbnV4L3NvY2tpb3MuaAkJU0lPQ0RFVlBSSVZBVEUgcmFuZ2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAppbmRleCBjNjg0MWVlLi5kNzNmYmQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CkBAIC03MSw2ICs3MSwxMSBAQAogdGhpcyBvcGVuaW5nIHNob3J0IGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGxpbmUsIHdpdGggbm8gaW50ZXJ2ZW5pbmcKIGVtcHR5IGNvbW1lbnQgbGluZXMuCiAKK0lmIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzICIuLi4iICh2YXJhcmdzKSwgaXQgc2hvdWxkIGJlIGxpc3RlZCBpbgora2VybmVsLWRvYyBub3RhdGlvbiBhczoKKyAqIEAuLi46IGRlc2NyaXB0aW9uCisKKwogRXhhbXBsZSBrZXJuZWwtZG9jIGRhdGEgc3RydWN0dXJlIGNvbW1lbnQuCiAKIC8qKgpAQCAtMjgyLDYgKzI4NywzMiBAQAogfTsKIAogCitJbmNsdWRpbmcgZG9jdW1lbnRhdGlvbiBibG9ja3MgaW4gc291cmNlIGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGZhY2lsaXRhdGUgaGF2aW5nIHNvdXJjZSBjb2RlIGFuZCBjb21tZW50cyBjbG9zZSB0b2dldGhlciwgeW91IGNhbgoraW5jbHVkZSBrZXJuZWwtZG9jIGRvY3VtZW50YXRpb24gYmxvY2tzIHRoYXQgYXJlIGZyZWUtZm9ybSBjb21tZW50cworaW5zdGVhZCBvZiBiZWluZyBrZXJuZWwtZG9jIGZvciBmdW5jdGlvbnMsIHN0cnVjdHVyZXMsIHVuaW9ucywKK2VudW1zLCBvciB0eXBlZGVmcy4gIFRoaXMgY291bGQgYmUgdXNlZCBmb3Igc29tZXRoaW5nIGxpa2UgYQordGhlb3J5IG9mIG9wZXJhdGlvbiBmb3IgYSBkcml2ZXIgb3IgbGlicmFyeSBjb2RlLCBmb3IgZXhhbXBsZS4KKworVGhpcyBpcyBkb25lIGJ5IHVzaW5nIGEgRE9DOiBzZWN0aW9uIGtleXdvcmQgd2l0aCBhIHNlY3Rpb24gdGl0bGUuICBFLmcuOgorCisvKioKKyAqIERPQzogVGhlb3J5IG9mIE9wZXJhdGlvbgorICoKKyAqIFRoZSB3aGl6YmFuZyBmb29iYXIgaXMgYSBkaWxseSBvZiBhIGdpem1vLiAgSXQgY2FuIGRvIHdoYXRldmVyIHlvdQorICogd2FudCBpdCB0byBkbywgYXQgYW55IHRpbWUuICBJdCByZWFkcyB5b3VyIG1pbmQuICBIZXJlJ3MgaG93IGl0IHdvcmtzLgorICoKKyAqIGZvbyBiYXIgc3BsYXQKKyAqCisgKiBUaGUgb25seSBkcmF3YmFjayB0byB0aGlzIGdpem1vIGlzIHRoYXQgaXMgY2FuIHNvbWV0aW1lcyBkYW1hZ2UKKyAqIGhhcmR3YXJlLCBzb2Z0d2FyZSwgb3IgaXRzIHN1YmplY3QocykuCisgKi8KKworRE9DOiBzZWN0aW9ucyBhcmUgdXNlZCBpbiBTR01MIHRlbXBsYXRlcyBmaWxlcyBhcyBpbmRpY2F0ZWQgYmVsb3cuCisKKwogSG93IHRvIG1ha2UgbmV3IFNHTUwgdGVtcGxhdGUgZmlsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMwMiw2ICszMzMsOSBAQAogIUY8ZmlsZW5hbWU+IDxmdW5jdGlvbiBbZnVuY3Rpb25zLi4uXT4gaXMgcmVwbGFjZWQgYnkgdGhlCiBkb2N1bWVudGF0aW9uLCBpbiA8ZmlsZW5hbWU+LCBmb3IgdGhlIGZ1bmN0aW9ucyBsaXN0ZWQuCiAKKyFQPGZpbGVuYW1lPiA8c2VjdGlvbiB0aXRsZT4gaXMgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBET0M6CitzZWN0aW9uIHRpdGxlZCA8c2VjdGlvbiB0aXRsZT4gZnJvbSA8ZmlsZW5hbWU+LgorU3BhY2VzIGFyZSBhbGxvd2VkIGluIDxzZWN0aW9uIHRpdGxlPjsgZG8gbm90IHF1b3RlIHRoZSA8c2VjdGlvbiB0aXRsZT4uCiAKIFRpbS4KICovIDx0d2F1Z2hAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggYTJkODgwNS4uMGIzZjY3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTQ2OSw4ICs0NjksOCBAQAogCiAJY2xlYXJjcHVpZD1CSVROVU0gW1g4Nl0KIAkJCURpc2FibGUgQ1BVSUQgZmVhdHVyZSBYIGZvciB0aGUga2VybmVsLiBTZWUKLQkJCWluY2x1ZGUvYXNtLXg4Ni9jcHVmZWF0dXJlLmggZm9yIHRoZSB2YWxpZCBiaXQgbnVtYmVycy4KLQkJCU5vdGUgdGhlIExpbnV4IHNwZWNpZmljIGJpdHMgYXJlIG5vdCBuZWNlc3NhcmlseQorCQkJYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGZvciB0aGUgdmFsaWQgYml0CisJCQludW1iZXJzLiBOb3RlIHRoZSBMaW51eCBzcGVjaWZpYyBiaXRzIGFyZSBub3QgbmVjZXNzYXJpbHkKIAkJCXN0YWJsZSBvdmVyIGtlcm5lbCBvcHRpb25zLCBidXQgdGhlIHZlbmRvciBzcGVjaWZpYwogCQkJb25lcyBzaG91bGQgYmUuCiAJCQlBbHNvIG5vdGUgdGhhdCB1c2VyIHByb2dyYW1zIGNhbGxpbmcgQ1BVSUQgZGlyZWN0bHkKQEAgLTU1MSw2ICs1NTEsMTEgQEAKIAkJCW5vdCB3b3JrIHJlbGlhYmx5IHdpdGggYWxsIGNvbnNvbGVzLCBidXQgaXMga25vd24KIAkJCXRvIHdvcmsgd2l0aCBzZXJpYWwgYW5kIFZHQSBjb25zb2xlcy4KIAorCWNvcmVkdW1wX2ZpbHRlcj0KKwkJCVtLTkxdIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKKwkJCS9wcm9jLzxwaWQ+L2NvcmVkdW1wX2ZpbHRlci4KKwkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQuCisKIAljcGNpaHBfZ2VuZXJpYz0JW0hXLFBDSV0gR2VuZXJpYyBwb3J0IEkvTyBDb21wYWN0UENJIGRyaXZlcgogCQkJRm9ybWF0OgogCQkJPGZpcnN0X3Nsb3Q+LDxsYXN0X3Nsb3Q+LDxwb3J0Piw8ZW51bV9iaXQ+Wyw8ZGVidWc+XQpAQCAtMTExNyw2ICsxMTIyLDggQEAKIAkJCUlmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGluZyBjb25maWd1cmF0aW9ucyBjaGFuZ2luZwogCQkJdGhlIHNhbWUgYXR0cmlidXRlLCB0aGUgbGFzdCBvbmUgaXMgdXNlZC4KIAorCWxtYj1kZWJ1ZwlbS05MXSBFbmFibGUgbG1iIGRlYnVnIG1lc3NhZ2VzLgorCiAJbG9hZF9yYW1kaXNrPQlbUkFNXSBMaXN0IG9mIHJhbWRpc2tzIHRvIGxvYWQgZnJvbSBmbG9wcHkKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3JhbWRpc2sudHh0LgogCkBAIC0xNTY5LDYgKzE1NzYsMTAgQEAKIAogCW5yX3VhcnRzPQlbU0VSSUFMXSBtYXhpbXVtIG51bWJlciBvZiBVQVJUcyB0byBiZSByZWdpc3RlcmVkLgogCisJb2hjaTEzOTRfZG1hPWVhcmx5CVtIV10gZW5hYmxlIGRlYnVnZ2luZyB2aWEgdGhlIG9oY2kxMzk0IGRyaXZlci4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0IGZvciBtb3JlCisJCQlpbmZvLgorCiAJb2xwY19lY190aW1lb3V0PSBbT0xQQ10gbXMgZGVsYXkgd2hlbiBpc3N1aW5nIEVDIGNvbW1hbmRzCiAJCQlSYXRoZXIgdGhhbiB0aW1pbmcgb3V0IGFmdGVyIDIwIG1zIGlmIGFuIEVDCiAJCQljb21tYW5kIGlzIG5vdCBwcm9wZXJseSBBQ0tlZCwgb3ZlcnJpZGUgdGhlIGxlbmd0aApAQCAtMTc5MywxMCArMTgwNCwxMCBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKLQlkeW5hbWljX3ByaW50awotCQkJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgotCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuIFRoZXNlIGNhbiBhbHNvCi0JCQliZSBzd2l0Y2hlZCBvbi9vZmYgdmlhIDxkZWJ1Z2ZzPi9keW5hbWljX3ByaW50ay9tb2R1bGVzCisJZHluYW1pY19wcmludGsJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgorCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuCisJCQlUaGVzZSBjYW4gYWxzbyBiZSBzd2l0Y2hlZCBvbi9vZmYgdmlhCisJCQk8ZGVidWdmcz4vZHluYW1pY19wcmludGsvbW9kdWxlcwogCiAJcHJpbnQtZmF0YWwtc2lnbmFscz0KIAkJCVtLTkxdIGRlYnVnOiBwcmludCBmYXRhbCBzaWduYWxzCkBAIC0xODg0LDcgKzE4OTUsNyBAQAogCiAJcmVib290PQkJW0JVR1M9WDg2LTMyLEJVR1M9QVJNLEJVR1M9SUEtNjRdIFJlYm9vdGluZyBtb2RlCiAJCQlGb3JtYXQ6IDxyZWJvb3RfbW9kZT5bLDxyZWJvb3RfbW9kZTI+WywuLi5dXQotCQkJU2VlIGFyY2gvKi9rZXJuZWwvcmVib290LmMgb3IgYXJjaC8qL2tlcm5lbC9wcm9jZXNzLmMJCQkKKwkJCVNlZSBhcmNoLyova2VybmVsL3JlYm9vdC5jIG9yIGFyY2gvKi9rZXJuZWwvcHJvY2Vzcy5jCiAKIAlyZWxheF9kb21haW5fbGV2ZWw9CiAJCQlbS05MLCBTTVBdIFNldCBzY2hlZHVsZXIncyBkZWZhdWx0IHJlbGF4X2RvbWFpbl9sZXZlbC4KQEAgLTI0MzIsOCArMjQ0Myw4IEBACiAJCQlGb3JtYXQ6CiAJCQk8aXJxPiw8aXJxX21hc2s+LDxpbz4sPGZ1bGxfZHVwbGV4Piw8ZG9fc291bmQ+LDxsb2NrdXBfaGFjaz5bLDxpcnEyPlssPGlycTM+Wyw8aXJxND5dXV0KIAotCW5vcmFuZG1hcHMJRG9uJ3QgdXNlIGFkZHJlc3Mgc3BhY2UgcmFuZG9taXphdGlvbgotCQkJRXF1aXZhbGVudCB0byBlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL3JhbmRvbWl6ZV92YV9zcGFjZQorCW5vcmFuZG1hcHMJRG9uJ3QgdXNlIGFkZHJlc3Mgc3BhY2UgcmFuZG9taXphdGlvbi4gIEVxdWl2YWxlbnQgdG8KKwkJCWVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9taXplX3ZhX3NwYWNlCiAKIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKaW5kZXggZjVkMmFhZC4uYjJlMzc0NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CkBAIC0xMTgsOCArMTE4LDggQEAKIAogICAgIGludCBrb2JqZWN0X3JlbmFtZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCi1Ob3RlIGtvYmplY3RfcmVuYW1lIGRvZXMgcGVyZm9ybSBhbnkgbG9ja2luZyBvciBoYXZlIGEgc29saWQgbm90aW9uIG9mCi13aGF0IG5hbWVzIGFyZSB2YWxpZCBzbyB0aGUgcHJvdmlkZSBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHNhbml0eSBjaGVja2luZwora29iamVjdF9yZW5hbWUgZG9lcyBub3QgcGVyZm9ybSBhbnkgbG9ja2luZyBvciBoYXZlIGEgc29saWQgbm90aW9uIG9mCit3aGF0IG5hbWVzIGFyZSB2YWxpZCBzbyB0aGUgY2FsbGVyIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc2FuaXR5IGNoZWNraW5nCiBhbmQgc2VyaWFsaXphdGlvbi4KIAogVGhlcmUgaXMgYSBmdW5jdGlvbiBjYWxsZWQga29iamVjdF9zZXRfbmFtZSgpIGJ1dCB0aGF0IGlzIGxlZ2FjeSBjcnVmdCBhbmQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IGE3OTYzM2QuLjQ4YjNkZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtNDk3LDcgKzQ5NywxMCBAQAogVGhlIHNlY29uZCBjb2x1bW4gaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBwcm9iZSAoayAtIGtwcm9iZSwgciAtIGtyZXRwcm9iZQogYW5kIGogLSBqcHJvYmUpLCB3aGlsZSB0aGUgdGhpcmQgY29sdW1uIHNwZWNpZmllcyB0aGUgc3ltYm9sK29mZnNldCBvZgogdGhlIHByb2JlLiBJZiB0aGUgcHJvYmVkIGZ1bmN0aW9uIGJlbG9uZ3MgdG8gYSBtb2R1bGUsIHRoZSBtb2R1bGUgbmFtZQotaXMgYWxzbyBzcGVjaWZpZWQuCitpcyBhbHNvIHNwZWNpZmllZC4gRm9sbG93aW5nIGNvbHVtbnMgc2hvdyBwcm9iZSBzdGF0dXMuIElmIHRoZSBwcm9iZSBpcyBvbgorYSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBpcyBubyBsb25nZXIgdmFsaWQgKG1vZHVsZSBpbml0IHNlY3Rpb25zLCBtb2R1bGUKK3ZpcnR1YWwgYWRkcmVzc2VzIHRoYXQgY29ycmVzcG9uZCB0byBtb2R1bGVzIHRoYXQndmUgYmVlbiB1bmxvYWRlZCksCitzdWNoIHByb2JlcyBhcmUgbWFya2VkIHdpdGggW0dPTkVdLgogCiAvZGVidWcva3Byb2Jlcy9lbmFibGVkOiBUdXJuIGtwcm9iZXMgT04vT0ZGCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dAppbmRleCA5NTA3MDAyLi41MDVmMTk2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CkBAIC0xMjUsMTQgKzEyNSwxNCBAQAogUk9VVEVSX01BR0lDICAgICAgICAgIDB4NTI0ZDQxNTcgIHdhbl9kZXZpY2UgICAgICAgIGluY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKIFNDQ19NQUdJQyAgICAgICAgICAgICAweDUyNjk2MzY4ICBnc19wb3J0ICAgICAgICAgICBkcml2ZXJzL2NoYXIvc2NjLmgKIFNBVkVLTVNHX01BR0lDMSAgICAgICAweDUzNDE1NjQ1ICBzYXZla21zZyAgICAgICAgICBhcmNoLyovYW1pZ2EvY29uZmlnLmMKLUdEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vZ2RhLmgKK0dEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vZ2RhLmgKIFJFRF9NQUdJQzEgICAgICAgICAgICAweDVhMmNmMDcxICAoYW55KSAgICAgICAgICAgICBtbS9zbGFiLmMKIFNUTF9QT1JUTUFHSUMgICAgICAgICAweDVhNzE4MmM5ICBzdGxwb3J0ICAgICAgICAgICBpbmNsdWRlL2xpbnV4L3N0YWxsaW9uLmgKIEVFUFJPTV9NQUdJQ19WQUxVRSAgICAweDVhYjQ3OGQyICBsYW5haV9kZXYgICAgICAgICBkcml2ZXJzL2F0bS9sYW5haS5jCiBIRExDRFJWX01BR0lDICAgICAgICAgMHg1YWM2ZTc3OCAgaGRsY2Rydl9zdGF0ZSAgICAgaW5jbHVkZS9saW51eC9oZGxjZHJ2LmgKIEVQQ0FfTUFHSUMgICAgICAgICAgICAweDVjNmRmMTA0ICBjaGFubmVsICAgICAgICAgICBpbmNsdWRlL2xpbnV4L2VwY2EuaAogUENYWF9NQUdJQyAgICAgICAgICAgIDB4NWM2ZGYxMDQgIGNoYW5uZWwgICAgICAgICAgIGRyaXZlcnMvY2hhci9wY3h4LmgKLUtWX01BR0lDICAgICAgICAgICAgICAweDVmNGI1NjVmICBrZXJuZWxfdmFyc19zICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24va2xrZXJudmFycy5oCitLVl9NQUdJQyAgICAgICAgICAgICAgMHg1ZjRiNTY1ZiAga2VybmVsX3ZhcnNfcyAgICAgYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2tsa2VybnZhcnMuaAogSTgxMF9TVEFURV9NQUdJQyAgICAgIDB4NjM2NTczNzMgIGk4MTBfc3RhdGUgICAgICAgIHNvdW5kL29zcy9pODEwX2F1ZGlvLmMKIFRSSURFTlRfU1RBVEVfTUFHSUMgICAweDYzNjU3MzczICB0cmllbnRfc3RhdGUgICAgICBzb3VuZC9vc3MvdHJpZGVudC5jCiBNM19DQVJEX01BR0lDICAgICAgICAgMHg2NDZlNmY1MCAgbTNfY2FyZCAgICAgICAgICAgc291bmQvb3NzL21hZXN0cm8zLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogUVVFVUVfTUFHSUNfRlJFRSAgICAgIDB4ZjdlMWM5YTMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogUVVFVUVfTUFHSUNfVVNFRCAgICAgIDB4ZjdlMWNjMzMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogSFRCX0NNQUdJQyAgICAgICAgICAgIDB4RkVGQUZFRjEgIGh0Yl9jbGFzcyAgICAgICAgIG5ldC9zY2hlZC9zY2hfaHRiLmMKLU5NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vbm1pLmgKK05NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbm1pLmgKIAogTm90ZSB0aGF0IHRoZXJlIGFyZSBhbHNvIGRlZmluZWQgc3BlY2lhbCBwZXItZHJpdmVyIG1hZ2ljIG51bWJlcnMgaW4gc291bmQKIG1lbW9yeSBtYW5hZ2VtZW50LiBTZWUgaW5jbHVkZS9zb3VuZC9zbmRtYWdpYy5oIGZvciBjb21wbGV0ZSBsaXN0IG9mIHRoZW0uIE1hbnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0IGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKaW5kZXggMTY4MTE3Yi4uNGMyZWNmNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIFRoaXMgb3B0aW9uIGNhbiBiZSBrZXJuZWwgbW9kdWxlIHRvby4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTMgc3lzZnMgZmlsZXMgZm9yIG1lbW9yeSBob3RwbHVnCis0IHN5c2ZzIGZpbGVzIGZvciBtZW1vcnkgaG90cGx1ZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFsbCBzZWN0aW9ucyBoYXZlIHRoZWlyIGRldmljZSBpbmZvcm1hdGlvbiB1bmRlciAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeSBhcwogCkBAIC0xMzgsMTEgKzEzOCwxMiBAQAogKDB4MTAwMDAwMDAwIC8gMUdpYiA9IDQpCiBUaGlzIGRldmljZSBjb3ZlcnMgYWRkcmVzcyByYW5nZSBbMHgxMDAwMDAwMDAgLi4uIDB4MTQwMDAwMDAwKQogCi1VbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDMgZmlsZXMuCitVbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDQgZmlsZXMuCiAKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9waHlzX2luZGV4CiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvcGh5c19kZXZpY2UKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9zdGF0ZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYL3JlbW92YWJsZQogCiAncGh5c19pbmRleCcgOiByZWFkLW9ubHkgYW5kIGNvbnRhaW5zIHNlY3Rpb24gaWQsIHNhbWUgYXMgWFhYLgogJ3N0YXRlJyAgICAgIDogcmVhZC13cml0ZQpAQCAtMTUwLDEwICsxNTEsMjAgQEAKICAgICAgICAgICAgICAgIGF0IHdyaXRlOiB1c2VyIGNhbiBzcGVjaWZ5ICJvbmxpbmUiLCAib2ZmbGluZSIgY29tbWFuZAogJ3BoeXNfZGV2aWNlJzogcmVhZC1vbmx5OiBkZXNpZ25lZCB0byBzaG93IHRoZSBuYW1lIG9mIHBoeXNpY2FsIG1lbW9yeSBkZXZpY2UuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdCB3ZWxsIGltcGxlbWVudGVkIG5vdy4KKydyZW1vdmFibGUnICA6IHJlYWQtb25seTogY29udGFpbnMgYW4gaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtZW1vcnkgc2VjdGlvbiBpcyByZW1vdmFibGUgb3Igbm90CisgICAgICAgICAgICAgICByZW1vdmFibGUuICBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgc2VjdGlvbiBpcyByZW1vdmFibGUgYW5kIGEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgICAgaXQgaXMgbm90IHJlbW92YWJsZS4KIAogTk9URToKICAgVGhlc2UgZGlyZWN0b3JpZXMvZmlsZXMgYXBwZWFyIGFmdGVyIHBoeXNpY2FsIG1lbW9yeSBob3RwbHVnIHBoYXNlLgogCitJZiBDT05GSUdfTlVNQSBpcyBlbmFibGVkIHRoZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYIG1lbW9yeSBzZWN0aW9uCitkaXJlY3RvcmllcyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB2aWEgc3ltYm9saWMgbGlua3MgbG9jYXRlZCBpbgordGhlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlKiBkaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlOgorL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUwL21lbW9yeTkgLT4gLi4vLi4vbWVtb3J5L21lbW9yeTkKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDQuIFBoeXNpY2FsIG1lbW9yeSBob3QtYWRkIHBoYXNlCkBAIC0zNjUsNyArMzc2LDYgQEAKICAgLSBhbGxvd2luZyBtZW1vcnkgaG90LWFkZCB0byBaT05FX01PVkFCTEUuIG1heWJlIHdlIG5lZWQgc29tZSBzd2l0Y2ggbGlrZQogICAgIHN5c2N0bCBvciBuZXcgY29udHJvbCBmaWxlLgogICAtIHNob3dpbmcgbWVtb3J5IHNlY3Rpb24gYW5kIHBoeXNpY2FsIGRldmljZSByZWxhdGlvbnNoaXAuCi0gIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBhbmQgbm9kZSByZWxhdGlvbnNoaXAgKG1heWJlIGdvb2QgZm9yIE5VTUEpCiAgIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBpcyB1bmRlciBaT05FX01PVkFCTEUgb3Igbm90CiAgIC0gdGVzdCBhbmQgbWFrZSBpdCBiZXR0ZXIgbWVtb3J5IG9mZmxpbmluZy4KICAgLSBzdXBwb3J0IEh1Z2VUTEIgcGFnZSBtaWdyYXRpb24gYW5kIG9mZmxpbmluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRSBiL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRQppbmRleCAyNWE2ZWQxLi5mNTQ5NjJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUKKysrIGIvRG9jdW1lbnRhdGlvbi9taXBzL0FVMXh4eF9JREUuUkVBRE1FCkBAIC00NCw3ICs0NCw3IEBACiAKIFR3byBmaWxlcyBhcmUgaW50cm9kdWNlZDoKIAotICBhKSAnaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgnCisgIGEpICdhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oJwogICAgICBjb250YWluZXMgOiBzdHJ1Y3QgX2F1aWRlX2h3aWYKICAgICAgICAgICAgICAgICAgdGltaW5nIHBhcmFtZXRlcnMgZm9yIFBJTyBtb2RlIDAvMS8yLzMvNAogICAgICAgICAgICAgICAgICB0aW1pbmcgcGFyYW1ldGVycyBmb3IgTVdETUEgMC8xLzIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9jcHVfZmVhdHVyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKaW5kZXggNDcyNzM5OC4uZmZhNDE4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQKQEAgLTMxLDcgKzMxLDcgQEAKIAogQWZ0ZXIgZGV0ZWN0aW5nIHRoZSBwcm9jZXNzb3IgdHlwZSwgdGhlIGtlcm5lbCBwYXRjaGVzIG91dCBzZWN0aW9ucyBvZiBjb2RlCiB0aGF0IHNob3VsZG4ndCBiZSB1c2VkIGJ5IHdyaXRpbmcgbm9wJ3Mgb3ZlciBpdC4gVXNpbmcgY3B1ZmVhdHVyZXMgcmVxdWlyZXMKLWp1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGluY2x1ZGUvYXNtLXBwYy9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKK2p1c3QgMiBtYWNyb3MgKGZvdW5kIGluIGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oKSwgYXMgc2VlbiBpbiBoZWFkLlMKIHRyYW5zZmVyX3RvX2hhbmRsZXI6CiAKIAkjaWZkZWYgQ09ORklHX0FMVElWRUMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKaW5kZXggZDMwYTI4MS4uMTA3MTFkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKQEAgLTE0MDIsNyArMTQwMiw3IEBACiBwb3NzaWJpbGl0aWVzIG9mIHRoZXNlIGFzIHRoZSBpbnN0cnVjdGlvbiBpcyBtYWRlIHVwIG9mIGEgIDB4QSBvcGNvZGUgJiB0aGUgc2Vjb25kIGJ5dGUgYmVpbmcKIHRoZSBzeXNjYWxsIG51bWJlci4gVGhleSBhcmUgdHJhY2VkIHVzaW5nIHRoZSBzaW1wbGUgY29tbWFuZC4KIFRSIFNWQyAgPE9wdGlvbmFsIHZhbHVlIG9yIHJhbmdlPgotdGhlIHN5c2NhbGxzIGFyZSBkZWZpbmVkIGluIGxpbnV4L2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKK3RoZSBzeXNjYWxscyBhcmUgZGVmaW5lZCBpbiBsaW51eC9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdW5pc3RkLmgKIGUuZy4gdG8gdHJhY2UgYWxsIGZpbGUgb3BlbnMganVzdCBkbwogVFIgU1ZDIDUgKCBhcyB0aGlzIGlzIHRoZSBzeXNjYWxsIG51bWJlciBvZiBvcGVuICkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAppbmRleCBjNGI3YjJiLi40ODBhNzhlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dApAQCAtOTgsNyArOTgsNyBAQAogb2YgdGhlbSBjYW4gYmUgZm91bmQgb24gb3RoZXIgTGludXggcGxhdGZvcm1zIGltcGxlbWVudGF0aW9ucyB0b28uCiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGRhdGEgZGVjbGFyYXRpb25zLCBhbmQgbWFjcm8gZGVmaW5pdGlvbnMKIGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIEMgaGVhZGVyIGZpbGUKLWxpbnV4L2luY2x1ZGUvYXNtLXMzOTAvaXJxLmguCitsaW51eC9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmguCiAKIE92ZXJ2aWV3IG9mIENEUyBpbnRlcmZhY2UgY29uY2VwdHMKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CmluZGV4IGUwNTQyMDkuLjJkMTAwNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKQEAgLTIsNyArMiw3IEBACiA9PT09PT09PT09PT09PT09PT0KIAogZmlsZXM6IGFyY2gvczM5MC9rZXJuZWwvZGVidWcuYwotICAgICAgIGluY2x1ZGUvYXNtLXMzOTAvZGVidWcuaAorICAgICAgIGFyY2gvczM5MC9pbmNsdWRlL2FzbS9kZWJ1Zy5oCiAKIERlc2NyaXB0aW9uOgogLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggZDc5ZWVkYS4uY2QwNTk5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtNDEsNyArNDEsOCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1kaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKK2RpcnR5X2J5dGVzLCBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9ieXRlcywKK2RpcnR5X2JhY2tncm91bmRfcmF0aW8sIGRpcnR5X2V4cGlyZV9jZW50aXNlY3MsCiBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzLCBoaWdobWVtX2lzX2RpcnR5YWJsZSwKIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsIGJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwKIGRyb3AtY2FjaGVzLCBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dCBiL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dAppbmRleCAxMjVlZWQ1Li4wNzA2YTcyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0CkBAIC0xMzcsMTMgKzEzNyw2IEBACiBtYXAgaW4gdHJ5X3RvX3VubWFwKCkuICBJZiB0cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0ssIHNocmlua19wYWdlX2xpc3QoKQogd2lsbCBjdWxsIHRoZSBwYWdlIGF0IHRoYXQgcG9pbnQuCiAKLU5vdGUgdGhhdCBmb3IgYW5vbnltb3VzIHBhZ2VzLCBzaHJpbmtfcGFnZV9saXN0KCkgYXR0ZW1wdHMgdG8gYWRkIHRoZSBwYWdlIHRvCi10aGUgc3dhcCBjYWNoZSBiZWZvcmUgaXQgdHJpZXMgdG8gdW5tYXAgdGhlIHBhZ2UuICBUbyBhdm9pZCB0aGlzIHVubmVjZXNzYXJ5Ci1jb25zdW1wdGlvbiBvZiBzd2FwIHNwYWNlLCBzaHJpbmtfcGFnZV9saXN0KCkgY2FsbHMgdHJ5X3RvX211bmxvY2soKSB0byBjaGVjawotd2hldGhlciBhbnkgVk1fTE9DS0VEIHZtYXMgbWFwIHRoZSBwYWdlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byB1bm1hcCB0aGUgcGFnZS4KLUlmIHRyeV90b19tdW5sb2NrKCkgcmV0dXJucyBTV0FQX01MT0NLLCBzaHJpbmtfcGFnZV9saXN0KCkgd2lsbCBjdWxsIHRoZSBwYWdlCi13aXRob3V0IGNvbnN1bWluZyBzd2FwIHNwYWNlLiAgdHJ5X3RvX211bmxvY2soKSB3aWxsIGJlIGRlc2NyaWJlZCBiZWxvdy4KLQogVG8gImN1bGwiIGFuIHVuZXZpY3RhYmxlIHBhZ2UsIHZtc2NhbiBzaW1wbHkgcHV0cyB0aGUgcGFnZSBiYWNrIG9uIHRoZSBscnUKIGxpc3QgdXNpbmcgcHV0YmFja19scnVfcGFnZSgpLS10aGUgaW52ZXJzZSBvcGVyYXRpb24gdG8gaXNvbGF0ZV9scnVfcGFnZSgpLS0KIGFmdGVyIGRyb3BwaW5nIHRoZSBwYWdlIGxvY2suICBCZWNhdXNlIHRoZSBjb25kaXRpb24gd2hpY2ggbWFrZXMgdGhlIHBhZ2UKQEAgLTE5MCw4ICsxODMsOCBAQAogICAgaW4gdGhlIFZNX0xPQ0tFRCBmbGFnIGJlaW5nIHNldCBmb3IgdGhlIHZtYS4KIDMpIGluIHRoZSBmYXVsdCBwYXRoLCBpZiBtbG9ja2VkIHBhZ2VzIGFyZSAiY3VsbGVkIiBpbiB0aGUgZmF1bHQgcGF0aCwKICAgIGFuZCB3aGVuIGEgVk1fTE9DS0VEIHN0YWNrIHNlZ21lbnQgaXMgZXhwYW5kZWQuCi00KSBhcyBtZW50aW9uZWQgYWJvdmUsIGluIHZtc2NhbjpzaHJpbmtfcGFnZV9saXN0KCkgd2l0aCBhdHRlbXB0aW5nIHRvCi0gICByZWNsYWltIGEgcGFnZSBpbiBhIFZNX0xPQ0tFRCB2bWEtLXZpYSB0cnlfdG9fdW5tYXAoKSBvciB0cnlfdG9fbXVubG9jaygpLgorNCkgYXMgbWVudGlvbmVkIGFib3ZlLCBpbiB2bXNjYW46c2hyaW5rX3BhZ2VfbGlzdCgpIHdoZW4gYXR0ZW1wdGluZyB0bworICAgcmVjbGFpbSBhIHBhZ2UgaW4gYSBWTV9MT0NLRUQgdm1hIHZpYSB0cnlfdG9fdW5tYXAoKS4KIAogTWxvY2tlZCBwYWdlcyBiZWNvbWUgdW5sb2NrZWQgYW5kIHJlc2N1ZWQgZnJvbSB0aGUgdW5ldmljdGFibGUgbGlzdCB3aGVuOgogCkBAIC0yNjAsOSArMjUzLDkgQEAKIAogMikgdm1hcyBtYXBwaW5nIGh1Z2V0bGJmcyBwYWdlIGFyZSBhbHJlYWR5IGVmZmVjdGl2ZWx5IHBpbm5lZCBpbnRvIG1lbW9yeS4KICAgIFdlIGRvbid0IG5lZWQgbm9yIHdhbnQgdG8gbWxvY2soKSB0aGVzZSBwYWdlcy4gIEhvd2V2ZXIsIHRvIHByZXNlcnZlIHRoZQotICAgcHJpb3IgYmVoYXZpb3Igb2YgbWxvY2soKS0tYmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLS1tbG9ja19maXh1cCgpCi0gICB3aWxsIGNhbGwgbWFrZV9wYWdlc19wcmVzZW50KCkgaW4gdGhlIGh1Z2V0bGJmcyB2bWEgcmFuZ2UgdG8gYWxsb2NhdGUgdGhlCi0gICBodWdlIHBhZ2VzIGFuZCBwb3B1bGF0ZSB0aGUgcHRlcy4KKyAgIHByaW9yIGJlaGF2aW9yIG9mIG1sb2NrKCktLWJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcy0tCisgICBtbG9ja19maXh1cCgpIHdpbGwgY2FsbCBtYWtlX3BhZ2VzX3ByZXNlbnQoKSBpbiB0aGUgaHVnZXRsYmZzIHZtYSByYW5nZQorICAgdG8gYWxsb2NhdGUgdGhlIGh1Z2UgcGFnZXMgYW5kIHBvcHVsYXRlIHRoZSBwdGVzLgogCiAzKSB2bWFzIHdpdGggVk1fRE9OVEVYUEFORHxWTV9SRVNFUlZFRCBhcmUgZ2VuZXJhbGx5IHVzZXIgc3BhY2UgbWFwcGluZ3Mgb2YKICAgIGtlcm5lbCBwYWdlcywgc3VjaCBhcyB0aGUgdmRzbyBwYWdlLCByZWxheSBjaGFubmVsIHBhZ2VzLCBldGMuICBUaGVzZSBwYWdlcwpAQCAtMzIyLDcgKzMxNSw3IEBACiBwYXNzaW5nIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IG11bmxvY2soKSBpcyBiZWluZyBwZXJmb3JtZWQuCiAKIEJlY2F1c2UgdGhlIHZtYSBhY2Nlc3MgcHJvdGVjdGlvbnMgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gUFJPVF9OT05FIGFmdGVyCi1mYXVsdGluZyBpbiBhbmQgbWxvY2tpbmcgc29tZSBwYWdlcywgZ2V0X3VzZXJfcGFnZXMoKSB3YXMgdW5yZWxpYWJsZSBmb3IgdmlzaXRpbmcKK2ZhdWx0aW5nIGluIGFuZCBtbG9ja2luZyBwYWdlcywgZ2V0X3VzZXJfcGFnZXMoKSB3YXMgdW5yZWxpYWJsZSBmb3IgdmlzaXRpbmcKIHRoZXNlIHBhZ2VzIGZvciBtdW5sb2NraW5nLiAgQmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGxlYXZlIHBhZ2VzIG1sb2NrZWQoKSwKIGdldF91c2VyX3BhZ2VzKCkgd2FzIGVuaGFuY2VkIHRvIGFjY2VwdCBhIGZsYWcgdG8gaWdub3JlIHRoZSBwZXJtaXNzaW9ucyB3aGVuCiBmZXRjaGluZyB0aGUgcGFnZXMtLWFsbCBvZiB3aGljaCBzaG91bGQgYmUgcmVzaWRlbnQgYXMgYSByZXN1bHQgb2YgcHJldmlvdXMKQEAgLTQxNiw4ICs0MDksOCBAQAogV2hlbiB1bm1hcHBpbmcgYW4gbWxvY2tlZCByZWdpb24gb2YgbWVtb3J5LCB3aGV0aGVyIGJ5IGFuIGV4cGxpY2l0IGNhbGwgdG8KIG11bm1hcCgpIG9yIHZpYSBhbiBpbnRlcm5hbCB1bm1hcCBmcm9tIGV4aXQoKSBvciBleGVjKCkgcHJvY2Vzc2luZywgd2UgbXVzdAogbXVubG9jayB0aGUgcGFnZXMgaWYgd2UncmUgcmVtb3ZpbmcgdGhlIGxhc3QgVk1fTE9DS0VEIHZtYSB0aGF0IG1hcHMgdGhlIHBhZ2VzLgotQmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLCBtbG9ja2luZyBkaWQgbm90IG1hcmsgdGhlIHBhZ2VzIGluIGFueSB3YXksCi1zbyB1bm1hcHBpbmcgdGhlbSByZXF1aXJlZCBubyBwcm9jZXNzaW5nLgorQmVmb3JlIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBjaGFuZ2VzLCBtbG9ja2luZyBkaWQgbm90IG1hcmsgdGhlIHBhZ2VzIGluIGFueQord2F5LCBzbyB1bm1hcHBpbmcgdGhlbSByZXF1aXJlZCBubyBwcm9jZXNzaW5nLgogCiBUbyBtdW5sb2NrIGEgcmFuZ2Ugb2YgbWVtb3J5IHVuZGVyIHRoZSB1bmV2aWN0YWJsZS9tbG9jayBpbmZyYXN0cnVjdHVyZSwgdGhlCiBtdW5tYXAoKSBoYW5kZXIgYW5kIHRhc2sgYWRkcmVzcyBzcGFjZSB0ZWFyIGRvd24gZnVuY3Rpb24gY2FsbApAQCAtNTE3LDEyICs1MTAsMTAgQEAKIE1sb2NrZWQgcGFnZXM6ICB0cnlfdG9fbXVubG9jaygpIFJldmVyc2UgTWFwIFNjYW4KIAogVE9ETy9GSVhNRTogIGEgYmV0dGVyIG5hbWUgbWlnaHQgYmUgcGFnZV9tbG9ja2VkKCktLWFuYWxvZ291cyB0byB0aGUKLXBhZ2VfcmVmZXJlbmNlZCgpIHJldmVyc2UgbWFwIHdhbGtlci0tZXNwZWNpYWxseSBpZiB3ZSBjb250aW51ZSB0byBjYWxsIHRoaXMKLWZyb20gc2hyaW5rX3BhZ2VfbGlzdCgpLiAgU2VlIHJlbGF0ZWQgVE9ETy9GSVhNRSBiZWxvdy4KK3BhZ2VfcmVmZXJlbmNlZCgpIHJldmVyc2UgbWFwIHdhbGtlci4KIAotV2hlbiBtdW5sb2NrX3ZtYV9wYWdlKCktLXNlZSAiTWxvY2tlZCBQYWdlczogIG11bmxvY2soKS9tdW5sb2NrYWxsKCkgU3lzdGVtCi1DYWxsIEhhbmRsaW5nIiBhYm92ZS0tdHJpZXMgdG8gbXVubG9jayBhIHBhZ2UsIG9yIHdoZW4gc2hyaW5rX3BhZ2VfbGlzdCgpCi1lbmNvdW50ZXJzIGFuIGFub255bW91cyBwYWdlIHRoYXQgaXMgbm90IHlldCBpbiB0aGUgc3dhcCBjYWNoZSwgdGhleSBuZWVkIHRvCitXaGVuIG11bmxvY2tfdm1hX3BhZ2UoKS0tc2VlICJNbG9ja2VkIFBhZ2VzOiAgbXVubG9jaygpL211bmxvY2thbGwoKQorU3lzdGVtIENhbGwgSGFuZGxpbmciIGFib3ZlLS10cmllcyB0byBtdW5sb2NrIGEgcGFnZSwgaXQgbmVlZHMgdG8KIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgcGFnZSBpcyBtYXBwZWQgYnkgYW55IFZNX0xPQ0tFRCB2bWEsIHdpdGhvdXQKIGFjdHVhbGx5IGF0dGVtcHRpbmcgdG8gdW5tYXAgYWxsIHB0ZXMgZnJvbSB0aGUgcGFnZS4gIEZvciB0aGlzIHB1cnBvc2UsIHRoZQogdW5ldmljdGFibGUvbWxvY2sgaW5mcmFzdHJ1Y3R1cmUgaW50cm9kdWNlZCBhIHZhcmlhbnQgb2YgdHJ5X3RvX3VubWFwKCkgY2FsbGVkCkBAIC01MzUsMTAgKzUyNiw3IEBACiBwYWdlcyBtYXBwZWQgaW4gbGluZWFyIFZNQXMsIGFzIGluIHRoZSB0cnlfdG9fdW5tYXAoKSBjYXNlLCB0aGUgZnVuY3Rpb25zCiBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGFzc29jaWF0ZWQgbW1hcCBzZW1waG9yZSwgbWxvY2sgdGhlIHBhZ2UgdmlhCiBtbG9ja192bWFfcGFnZSgpIGFuZCByZXR1cm4gU1dBUF9NTE9DSy4gIFRoaXMgZWZmZWN0aXZlbHkgdW5kb2VzIHRoZQotcHJlLWNsZWFyaW5nIG9mIHRoZSBwYWdlJ3MgUEdfbWxvY2tlZCBkb25lIGJ5IG11bmxvY2tfdm1hX3BhZ2UoKSBhbmQgaW5mb3Jtcwotc2hyaW5rX3BhZ2VfbGlzdCgpIHRoYXQgdGhlIGFub255bW91cyBwYWdlIHNob3VsZCBiZSBjdWxsZWQgcmF0aGVyIHRoYW4gYWRkZWQKLXRvIHRoZSBzd2FwIGNhY2hlIGluIHByZXBhcmF0aW9uIGZvciBhIHRyeV90b191bm1hcCgpIHRoYXQgd2lsbCBhbG1vc3QKLWNlcnRhaW5seSBmYWlsLgorcHJlLWNsZWFyaW5nIG9mIHRoZSBwYWdlJ3MgUEdfbWxvY2tlZCBkb25lIGJ5IG11bmxvY2tfdm1hX3BhZ2UuCiAKIElmIHRyeV90b191bm1hcCgpIGlzIHVuYWJsZSB0byBhY3F1aXJlIGEgVk1fTE9DS0VEIHZtYSdzIGFzc29jaWF0ZWQgbW1hcAogc2VtYXBob3JlLCBpdCB3aWxsIHJldHVybiBTV0FQX0FHQUlOLiAgVGhpcyB3aWxsIGFsbG93IHNocmlua19wYWdlX2xpc3QoKQpAQCAtNTU3LDEwICs1NDUsNyBAQAogc3VjY2Vzc2Z1bGx5IGFjcXVpcmUgdGhlIHZtYSdzIG1tYXAgc2VtcGhvcmUgZm9yIHJlYWQgYW5kIG1sb2NrIHRoZSBwYWdlLgogQWx0aG91Z2ggdHJ5X3RvX211bmxvY2soKSBjYW4gYmUgY2FsbGVkIG1hbnkgW3ZlcnkgbWFueSFdIHRpbWVzIHdoZW4KIG11bmxvY2soKWluZyBhIGxhcmdlIHJlZ2lvbiBvciB0ZWFyaW5nIGRvd24gYSBsYXJnZSBhZGRyZXNzIHNwYWNlIHRoYXQgaGFzIGJlZW4KLW1sb2NrZWQgdmlhIG1sb2NrYWxsKCksIG92ZXJhbGwgdGhpcyBpcyBhIGZhaXJseSByYXJlIGV2ZW50LiAgSW4gYWRkaXRpb24sCi1hbHRob3VnaCBzaHJpbmtfcGFnZV9saXN0KCkgY2FsbHMgdHJ5X3RvX211bmxvY2soKSBmb3IgZXZlcnkgYW5vbnltb3VzIHBhZ2UgdGhhdAotaXQgaGFuZGxlcyB0aGF0IGlzIG5vdCB5ZXQgaW4gdGhlIHN3YXAgY2FjaGUsIG9uIGF2ZXJhZ2UgYW5vbnltb3VzIHBhZ2VzIHdpbGwKLWhhdmUgdmVyeSBzaG9ydCByZXZlcnNlIG1hcCBsaXN0cy4KK21sb2NrZWQgdmlhIG1sb2NrYWxsKCksIG92ZXJhbGwgdGhpcyBpcyBhIGZhaXJseSByYXJlIGV2ZW50LgogCiBNbG9ja2VkIFBhZ2U6ICBQYWdlIFJlY2xhaW0gaW4gc2hyaW5rXypfbGlzdCgpCiAKQEAgLTU4OCw4ICs1NzMsOCBAQAogICAgbXVubG9ja192bWFfcGFnZSgpIHdhcyBmb3JjZWQgdG8gbGV0IHRoZSBwYWdlIGJhY2sgb24gdG8gdGhlIG5vcm1hbAogICAgTFJVIGxpc3QgZm9yIHZtc2NhbiB0byBoYW5kbGUuCiAKLXNocmlua19pbmFjdGl2ZV9saXN0KCkgYWxzbyBjdWxscyBhbnkgdW5ldmljdGFibGUgcGFnZXMgdGhhdCBpdCBmaW5kcwotb24gdGhlIGluYWN0aXZlIGxpc3RzLCBhZ2FpbiBkaXZlcnRpbmcgdGhlbSB0byB0aGUgYXBwcm9wcmlhdGUgem9uZSdzIHVuZXZpY3RhYmxlCitzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGFsc28gY3VsbHMgYW55IHVuZXZpY3RhYmxlIHBhZ2VzIHRoYXQgaXQgZmluZHMgb24KK3RoZSBpbmFjdGl2ZSBsaXN0cywgYWdhaW4gZGl2ZXJ0aW5nIHRoZW0gdG8gdGhlIGFwcHJvcHJpYXRlIHpvbmUncyB1bmV2aWN0YWJsZQogbHJ1IGxpc3QuICBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIHNob3VsZCBvbmx5IHNlZSBTSE1fTE9DS2VkIHBhZ2VzIHRoYXQgYmVjYW1lCiBTSE1fTE9DS2VkIGFmdGVyIHNocmlua19hY3RpdmVfbGlzdCgpIGhhZCBtb3ZlZCB0aGVtIHRvIHRoZSBpbmFjdGl2ZSBsaXN0LCBvcgogcGFnZXMgbWFwcGVkIGludG8gVk1fTE9DS0VEIHZtYXMgdGhhdCBtdW5sb2NrX3ZtYV9wYWdlKCkgY291bGRuJ3QgaXNvbGF0ZSBmcm9tCkBAIC01OTcsMTkgKzU4Miw3IEBACiB0aGUgbGF0dGVyLCBidXQgd2lsbCBwYXNzIG9uIHRvIHNocmlua19wYWdlX2xpc3QoKS4KIAogc2hyaW5rX3BhZ2VfbGlzdCgpIGFnYWluIGN1bGxzIG9idmlvdXNseSB1bmV2aWN0YWJsZSBwYWdlcyB0aGF0IGl0IGNvdWxkCi1lbmNvdW50ZXIgZm9yIHNpbWlsYXIgcmVhc29uIHRvIHNocmlua19pbmFjdGl2ZV9saXN0KCkuICBBcyBhbHJlYWR5IGRpc2N1c3NlZCwKLXNocmlua19wYWdlX2xpc3QoKSBwcm9hY3RpdmVseSBsb29rcyBmb3IgYW5vbnltb3VzIHBhZ2VzIHRoYXQgc2hvdWxkIGhhdmUKLVBHX21sb2NrZWQgc2V0IGJ1dCBkb24ndC0tdGhlc2Ugd291bGQgbm90IGJlIGRldGVjdGVkIGJ5IHBhZ2VfZXZpY3RhYmxlKCktLXRvCi1hdm9pZCBhZGRpbmcgdGhlbSB0byB0aGUgc3dhcCBjYWNoZSB1bm5lY2Vzc2FyaWx5LiAgRmlsZSBwYWdlcyBtYXBwZWQgaW50bworZW5jb3VudGVyIGZvciBzaW1pbGFyIHJlYXNvbiB0byBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpLiAgUGFnZXMgbWFwcGVkIGludG8KIFZNX0xPQ0tFRCB2bWFzIGJ1dCB3aXRob3V0IFBHX21sb2NrZWQgc2V0IHdpbGwgbWFrZSBpdCBhbGwgdGhlIHdheSB0bwotdHJ5X3RvX3VubWFwKCkuICBzaHJpbmtfcGFnZV9saXN0KCkgd2lsbCBkaXZlcnQgdGhlbSB0byB0aGUgdW5ldmljdGFibGUgbGlzdCB3aGVuCi10cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0ssIGFzIGRpc2N1c3NlZCBhYm92ZS4KLQotVE9ETy9GSVhNRTogIElmIHdlIGNhbiBlbmhhbmNlIHRoZSBzd2FwIGNhY2hlIHRvIHJlbGlhYmx5IHJlbW92ZSBlbnRyaWVzCi13aXRoIHBhZ2VfY291bnQocGFnZSkgPiAyLCBhcyBsb25nIGFzIGFsbCBwdGVzIGFyZSBtYXBwZWQgdG8gdGhlIHBhZ2UgYW5kCi1ub3QgdGhlIHN3YXAgZW50cnksIHdlIGNhbiBwcm9iYWJseSByZW1vdmUgdGhlIGNhbGwgdG8gdHJ5X3RvX211bmxvY2soKSBpbgotc2hyaW5rX3BhZ2VfbGlzdCgpIGFuZCBqdXN0IHJlbW92ZSB0aGUgcGFnZSBmcm9tIHRoZSBzd2FwIGNhY2hlIHdoZW4KLXRyeV90b191bm1hcCgpIHJldHVybnMgU1dBUF9NTE9DSy4gICBDdXJyZW50bHksIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKCkKLWRvZXNuJ3Qgc2VlbSB0byBhbGxvdyB0aGF0LgotCi0KK3RyeV90b191bm1hcCgpLiAgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgZGl2ZXJ0IHRoZW0gdG8gdGhlIHVuZXZpY3RhYmxlIGxpc3QKK3doZW4gdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBhcyBkaXNjdXNzZWQgYWJvdmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dAppbmRleCAxNjlhZDQyLi40ZjkxMzg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3plcm8tcGFnZS50eHQKQEAgLTMsNyArMyw3IEBACiByZWFsLW1vZGUgc2V0dXAgY29kZSBvZiB0aGUga2VybmVsLiBSZWZlcmVuY2VzL3NldHRpbmdzIHRvIGl0IG1haW5seQogYXJlIGluOgogCi0gIGluY2x1ZGUvYXNtLXg4Ni9ib290cGFyYW0uaAorICBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290cGFyYW0uaAogCiAKIE9mZnNldAlQcm90bwlOYW1lCQlNZWFuaW5nCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDE0MWFmZjYuLjA5NGRkNTIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC02MTYsNyArNjE2LDcgQEAKIFM6CU1haW50YWluZWQKIAogQVJNL1RPU0EgTUFDSElORSBTVVBQT1JUCi1QOglEbWl0cnkgQmFyeXNoa292CitQOglEbWl0cnkgRXJlbWluLVNvbGVuaWtvdgogTToJZGJhcnlzaGtvdkBnbWFpbC5jb20KIFA6CURpcmsgT3BmZXIKIE06CWRpcmtAb3BmZXItb25saW5lLmRlCkBAIC0xMDkyLDExICsxMDkyLDggQEAKIAogQ0hFQ0tQQVRDSAogUDoJQW5keSBXaGl0Y3JvZnQKLU06CWFwd0BzaGFkb3dlbi5vcmcKLVA6CVJhbmR5IER1bmxhcAotTToJcmR1bmxhcEB4ZW5vdGltZS5uZXQKLVA6CUpvZWwgU2Nob3BwCi1NOglqc2Nob3BwQGF1c3Rpbi5pYm0uY29tCitNOglhcHdAY2Fub25pY2FsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiAKIENJU0NPIDEwRyBFVEhFUk5FVCBEUklWRVIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYjdjOGYxOC4uNGRhZDI3MyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTksMyArOSw0IEBACiB1bmlmZGVmLXkgKz0gZnB1LmgKIHVuaWZkZWYteSArPSBzeXNpbmZvLmgKIHVuaWZkZWYteSArPSBjb21waWxlci5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBjYTg4ZTU0Li42MmIzNjM1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9BTFBIQV9BVE9NSUNfSAogI2RlZmluZSBfQUxQSEFfQVRPTUlDX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKQEAgLTEzLDE0ICsxNCw2IEBACiAgKi8KIAogCi0vKgotICogQ291bnRlciBpcyB2b2xhdGlsZSB0byBtYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlcgotICogYW5kIG1vdmUgdGhpbmdzIGFyb3VuZCBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzCi0gKiB0aGUgdXNlciBnYXZlIHVzLCBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJKCAoYXRvbWljX3QpIHsgKGkpIH0gKQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCSggKGF0b21pYzY0X3QpIHsgKGkpIH0gKQogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA1OGU5NThmLi42NzcyZjMxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNDcgKzEsNyBAQAogI2lmbmRlZiBfQUxQSEFfQllURU9SREVSX0gKICNkZWZpbmUgX0FMUEhBX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9jb21waWxlci5oPgotCi0jaWZkZWYgX19HTlVDX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0JLyoKLQkgKiBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCB1c2UgdGhlIDYgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UKLQkgKiBvbiBldjYgc2luY2UgdGhlIGxhdGVuY3kgb2YgdGhlIFVOUEtCVyBpcyAzLCB3aGljaCBpcwotCSAqIHByZXR0eSBoYXJkIHRvIGhpZGUuICBKdXN0IGluIGNhc2UgYSBmdXR1cmUgaW1wbGVtZW50YXRpb24KLQkgKiBoYXMgYSBsb3dlciBsYXRlbmN5LCBoZXJlJ3MgdGhlIHNlcXVlbmNlIChhbHNvIGJ5IE1pa2UgQnVycm93cykKLQkgKgotCSAqIFVOUEtCVyBhMCwgdjAgICAgICAgdjA6IDAwQUEwMEJCMDBDQzAwREQKLQkgKiBTTEwgdjAsIDI0LCBhMCAgICAgIGEwOiBCQjAwQ0MwMEREMDAwMDAwCi0JICogQklTIHYwLCBhMCwgYTAgICAgICBhMDogQkJBQUNDQkJERENDMDBERAotCSAqIEVYVFdMIGEwLCA2LCB2MCAgICAgdjA6IDAwMDAwMDAwMDAwMEJCQUEKLQkgKiBaQVAgYTAsIDB4ZjMsIGEwICAgIGEwOiAwMDAwMDAwMEREQ0MwMDAwCi0JICogQURETCBhMCwgdjAsIHYwICAgICB2MDogc3Nzc3Nzc3NERENDQkJBQQotCSAqLwotCi0JX191NjQgdDAsIHQxLCB0MiwgdDM7Ci0KLQl0MCA9IF9fa2VybmVsX2luc2xoKHgsIDcpOwkvKiB0MCA6IDAwMDAwMDAwMDBBQUJCQ0MgKi8KLQl0MSA9IF9fa2VybmVsX2luc3dsKHgsIDMpOwkvKiB0MSA6IDAwMDAwMENDREQwMDAwMDAgKi8KLQl0MSB8PSB0MDsJCQkvKiB0MSA6IDAwMDAwMENDRERBQUJCQ0MgKi8KLQl0MiA9IHQxID4+IDE2OwkJCS8qIHQyIDogMDAwMDAwMDAwMENDRERBQSAqLwotCXQwID0gdDEgJiAweEZGMDBGRjAwOwkJLyogdDAgOiAwMDAwMDAwMEREMDBCQjAwICovCi0JdDMgPSB0MiAmIDB4MDBGRjAwRkY7CQkvKiB0MyA6IDAwMDAwMDAwMDBDQzAwQUEgKi8KLQl0MSA9IHQwICsgdDM7CQkJLyogdDEgOiBzc3Nzc3Nzc0REQ0NCQkFBICovCi0KLQlyZXR1cm4gdDE7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIgX19hcmNoX19zd2FiMzIKLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KLSNkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQUxQSEFfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlNzA4OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX0FMUEhBX1NXQUJfSAorI2RlZmluZSBfQUxQSEFfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9jb21waWxlci5oPgorCisjaWZkZWYgX19HTlVDX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKK3sKKwkvKgorCSAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHVzZSB0aGUgNiBpbnN0cnVjdGlvbiBzZXF1ZW5jZQorCSAqIG9uIGV2NiBzaW5jZSB0aGUgbGF0ZW5jeSBvZiB0aGUgVU5QS0JXIGlzIDMsIHdoaWNoIGlzCisJICogcHJldHR5IGhhcmQgdG8gaGlkZS4gIEp1c3QgaW4gY2FzZSBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbgorCSAqIGhhcyBhIGxvd2VyIGxhdGVuY3ksIGhlcmUncyB0aGUgc2VxdWVuY2UgKGFsc28gYnkgTWlrZSBCdXJyb3dzKQorCSAqCisJICogVU5QS0JXIGEwLCB2MCAgICAgICB2MDogMDBBQTAwQkIwMENDMDBERAorCSAqIFNMTCB2MCwgMjQsIGEwICAgICAgYTA6IEJCMDBDQzAwREQwMDAwMDAKKwkgKiBCSVMgdjAsIGEwLCBhMCAgICAgIGEwOiBCQkFBQ0NCQkREQ0MwMERECisJICogRVhUV0wgYTAsIDYsIHYwICAgICB2MDogMDAwMDAwMDAwMDAwQkJBQQorCSAqIFpBUCBhMCwgMHhmMywgYTAgICAgYTA6IDAwMDAwMDAwRERDQzAwMDAKKwkgKiBBRERMIGEwLCB2MCwgdjAgICAgIHYwOiBzc3Nzc3Nzc0REQ0NCQkFBCisJICovCisKKwlfX3U2NCB0MCwgdDEsIHQyLCB0MzsKKworCXQwID0gX19rZXJuZWxfaW5zbGgoeCwgNyk7CS8qIHQwIDogMDAwMDAwMDAwMEFBQkJDQyAqLworCXQxID0gX19rZXJuZWxfaW5zd2woeCwgMyk7CS8qIHQxIDogMDAwMDAwQ0NERDAwMDAwMCAqLworCXQxIHw9IHQwOwkJCS8qIHQxIDogMDAwMDAwQ0NEREFBQkJDQyAqLworCXQyID0gdDEgPj4gMTY7CQkJLyogdDIgOiAwMDAwMDAwMDAwQ0NEREFBICovCisJdDAgPSB0MSAmIDB4RkYwMEZGMDA7CQkvKiB0MCA6IDAwMDAwMDAwREQwMEJCMDAgKi8KKwl0MyA9IHQyICYgMHgwMEZGMDBGRjsJCS8qIHQzIDogMDAwMDAwMDAwMENDMDBBQSAqLworCXQxID0gdDAgKyB0MzsJCQkvKiB0MSA6IHNzc3Nzc3NzRERDQ0JCQUEgKi8KKworCXJldHVybiB0MTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjZW5kaWYgLyogX0FMUEhBX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggZDZlYmUzOS4uZGJmZGY4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xMzI1LDYgKzEzMjUsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvdWlvL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIGVuZG1lbnUKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDczMjM3YmQuLjQzYjBiMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsMyArMSw0IEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCiB1bmlmZGVmLXkgKz0gaHdjYXAuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAzMjVmODgxLi5lZTk5NzIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTIsMTAgKzEyLDkgQEAKICNkZWZpbmUgX19BU01fQVJNX0FUT01JQ19ICiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2lmZGVmIF9fS0VSTkVMX18KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNGZiZmIyMi4uYzAyYjZmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTE1LDM4ICsxNSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9CWVRFT1JERVJfSAogI2RlZmluZSBfX0FTTV9BUk1fQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FiMzIoX191MzIgeCkKLXsKLQlfX3UzMiB0OwotCi0jaWZuZGVmIF9fdGh1bWJfXwotCWlmICghX19idWlsdGluX2NvbnN0YW50X3AoeCkpIHsKLQkJLyoKLQkJICogVGhlIGNvbXBpbGVyIG5lZWRzIGEgYml0IG9mIGEgaGludCBoZXJlIHRvIGFsd2F5cyBkbyB0aGUKLQkJICogcmlnaHQgdGhpbmcgYW5kIG5vdCBzY3JldyBpdCB1cCB0byBkaWZmZXJlbnQgZGVncmVlcwotCQkgKiBkZXBlbmRpbmcgb24gdGhlIGdjYyB2ZXJzaW9uLgotCQkgKi8KLQkJYXNtICgiZW9yXHQlMCwgJTEsICUxLCByb3IgIzE2IiA6ICI9ciIgKHQpIDogInIiICh4KSk7Ci0JfSBlbHNlCi0jZW5kaWYKLQkJdCA9IHggXiAoKHggPDwgMTYpIHwgKHggPj4gMTYpKTsgLyogZW9yIHIxLHIwLHIwLHJvciAjMTYgKi8KLQotCXggPSAoeCA8PCAyNCkgfCAoeCA+PiA4KTsJCS8qIG1vdiByMCxyMCxyb3IgIzggICAgICAqLwotCXQgJj0gfjB4MDBGRjAwMDA7CQkJLyogYmljIHIxLHIxLCMweDAwRkYwMDAwICovCi0JeCBePSAodCA+PiA4KTsJCQkJLyogZW9yIHIwLHIwLHIxLGxzciAjOCAgICovCi0KLQlyZXR1cm4geDsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FiMzIoeCkKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAKICNpZmRlZiBfX0FSTUVCX18KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTY4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBhcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorICoKKyAqIEFSTSBFbmRpYW4tbmVzcy4gIEluIGxpdHRsZSBlbmRpYW4gbW9kZSwgdGhlIGRhdGEgYnVzIGlzIGNvbm5lY3RlZCBzdWNoCisgKiB0aGF0IGJ5dGUgYWNjZXNzZXMgYXBwZWFyIGFzOgorICogIDAgPSBkMC4uLmQ3LCAxID0gZDguLi5kMTUsIDIgPSBkMTYuLi5kMjMsIDMgPSBkMjQuLi5kMzEKKyAqIGFuZCB3b3JkIGFjY2Vzc2VzIChkYXRhIG9yIGluc3RydWN0aW9uKSBhcHBlYXIgYXM6CisgKiAgZDAuLi5kMzEKKyAqCisgKiBXaGVuIGluIGJpZyBlbmRpYW4gbW9kZSwgYnl0ZSBhY2Nlc3NlcyBhcHBlYXIgYXM6CisgKiAgMCA9IGQyNC4uLmQzMSwgMSA9IGQxNi4uLmQyMywgMiA9IGQ4Li4uZDE1LCAzID0gZDAuLi5kNworICogYW5kIHdvcmQgYWNjZXNzZXMgKGRhdGEgb3IgaW5zdHJ1Y3Rpb24pIGFwcGVhciBhczoKKyAqICBkMC4uLmQzMQorICovCisjaWZuZGVmIF9fQVNNX0FSTV9TV0FCX0gKKyNkZWZpbmUgX19BU01fQVJNX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fdTMyIHQ7CisKKyNpZm5kZWYgX190aHVtYl9fCisJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSkgeworCQkvKgorCQkgKiBUaGUgY29tcGlsZXIgbmVlZHMgYSBiaXQgb2YgYSBoaW50IGhlcmUgdG8gYWx3YXlzIGRvIHRoZQorCQkgKiByaWdodCB0aGluZyBhbmQgbm90IHNjcmV3IGl0IHVwIHRvIGRpZmZlcmVudCBkZWdyZWVzCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZ2NjIHZlcnNpb24uCisJCSAqLworCQlhc20gKCJlb3JcdCUwLCAlMSwgJTEsIHJvciAjMTYiIDogIj1yIiAodCkgOiAiciIgKHgpKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl0ID0geCBeICgoeCA8PCAxNikgfCAoeCA+PiAxNikpOyAvKiBlb3IgcjEscjAscjAscm9yICMxNiAqLworCisJeCA9ICh4IDw8IDI0KSB8ICh4ID4+IDgpOwkJLyogbW92IHIwLHIwLHJvciAjOCAgICAgICovCisJdCAmPSB+MHgwMEZGMDAwMDsJCQkvKiBiaWMgcjEscjEsIzB4MDBGRjAwMDAgKi8KKwl4IF49ICh0ID4+IDgpOwkJCQkvKiBlb3IgcjAscjAscjEsbHNyICM4ICAgKi8KKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggNjBjMDc5ZC4uZWVkMmY3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTgxNyw3ICs4MTcsNyBAQAogCWVjLT5kbWEgPSBOT19ETUE7CiAJZWMtPm9wcyA9ICZlY2FyZF9kZWZhdWx0X29wczsKIAotCXNucHJpbnRmKGVjLT5kZXYuYnVzX2lkLCBzaXplb2YoZWMtPmRldi5idXNfaWQpLCAiZWNhcmQlZCIsIHNsb3QpOworCWRldl9zZXRfbmFtZSgmZWMtPmRldiwgImVjYXJkJWQiLCBzbG90KTsKIAllYy0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJZWMtPmRldi5idXMgPSAmZWNhcmRfYnVzX3R5cGU7CiAJZWMtPmRldi5kbWFfbWFzayA9ICZlYy0+ZG1hX21hc2s7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYwppbmRleCAzZjlhYmUwLi5mNjkyZWZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTkyLDkgKzkyLDcgQEAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCWlmIChwLT5haW5zbi5pbnNuKSB7Ci0JCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CiAJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwotCQltdXRleF91bmxvY2soJmtwcm9iZV9tdXRleCk7CiAJCXAtPmFpbnNuLmluc24gPSBOVUxMOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMKaW5kZXggNTBlMTM5Ni4uYjVjNWZjNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBjbGNkX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAkJCT0gIm1iOjE2IiwKKwkJLmluaXRfbmFtZQkJPSAibWI6MTYiLAogCQkuY29oZXJlbnRfZG1hX21hc2sJPSB+MCwKIAkJLnBsYXRmb3JtX2RhdGEJCT0gJmNsY2RfcGxhdF9kYXRhLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggNDc4MWYzMi4uNmQ5MTUyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDFfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCQk9ICJhcGI6dWFydDEiLAorCQkuaW5pdF9uYW1lCT0gImFwYjp1YXJ0MSIsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTQyMyw3ICs0MjMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQyX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAkJPSAiYXBiOnVhcnQyIiwKKwkJLmluaXRfbmFtZQk9ICJhcGI6dWFydDIiLAogCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CkBAIC00MzcsNyArNDM3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0M19kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCT0gImFwYjp1YXJ0MyIsCisJCS5pbml0X25hbWUJPSAiYXBiOnVhcnQzIiwKIAkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKaW5kZXggYzg5Yzk0OS4uNmY4ODcyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgcnRjX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxNSIsCisJCS5pbml0X25hbWUgPSAibWI6MTUiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IElOVEVHUkFUT1JfUlRDX0JBU0UsCkBAIC01MCw3ICs1MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDBfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE2IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxNiIsCiAJCS5wbGF0Zm9ybV9kYXRhID0gJmludGVncmF0b3JfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CkBAIC02NCw3ICs2NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDFfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE3IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxNyIsCiAJCS5wbGF0Zm9ybV9kYXRhID0gJmludGVncmF0b3JfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CkBAIC03OCw3ICs3OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2Uga21pMF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTgiLAorCQkuaW5pdF9uYW1lID0gIm1iOjE4IiwKIAl9LAogCS5yZXMJCT0gewogCQkuc3RhcnQJPSBLTUkwX0JBU0UsCkBAIC05MSw3ICs5MSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2Uga21pMV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTkiLAorCQkuaW5pdF9uYW1lID0gIm1iOjE5IiwKIAl9LAogCS5yZXMJCT0gewogCQkuc3RhcnQJPSBLTUkxX0JBU0UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwppbmRleCA0MjdjMmQ4Li40YWMwNDA1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBtbWNfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjFjIiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxYyIsCiAJCS5wbGF0Zm9ybV9kYXRhID0gJm1tY19kYXRhLAogCX0sCiAJLnJlcwkJPSB7CkBAIC00MjEsNyArNDIxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBhYWNpX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxZCIsCisJCS5pbml0X25hbWUgPSAibWI6MWQiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IElOVENQX1BBX0FBQ0lfQkFTRSwKQEAgLTUzMiw3ICs1MzIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGNsY2RfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOmMwIiwKKwkJLmluaXRfbmFtZSA9ICJtYjpjMCIsCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAogCQkucGxhdGZvcm1fZGF0YSA9ICZjbGNkX2RhdGEsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbGNkLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jCmluZGV4IGEyYTU0MzIuLmM0NzJiOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbGNkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NsY2QuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXAogCS5kZXYgPSB7CQkJCQkJXAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwJCQlcCi0JCS5idXNfaWQJPSBidXNpZCwJCQkJXAorCQkuaW5pdF9uYW1lID0gYnVzaWQsCQkJCVwKIAkJLnBsYXRmb3JtX2RhdGEgPSBwbGF0LAkJCQlcCiAJCX0sCQkJCQkJXAogCS5yZXMgPSB7CQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwppbmRleCA4ZjFmOTkyLi5lYThmYTg4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwpAQCAtOTEsNyArOTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGZiX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJmYiIsCisJCS5pbml0X25hbWUgPSAiZmIiLAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwKIAl9LAogCS5yZXMJCT0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTkzMF9yb3RhcnkuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfcm90YXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNTg3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfcm90YXJ5LmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfX0FTTV9BUkNIX1BYQTkzMF9ST1RBUllfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BYQTkzMF9ST1RBUllfSAorCisvKiBOT1RFOgorICoKKyAqIHJvdGFyeSBjYW4gYmUgZWl0aGVyIGludGVycHJldGVkIGFzIGEgcmFsYXRpdmUgaW5wdXQgZXZlbnQgKGUuZy4KKyAqIFJFTF9XSEVFTCBvciBSRUxfSFdIRUVMKSBvciBhIHNwZWNpZmljIGtleSBldmVudCAoZS5nLiBVUC9ET1dOCisgKiBvciBMRUZUL1JJR0hUKSwgZGVwZW5kaW5nIG9uIGlmIHVwX2tleSAmIGRvd25fa2V5IGFyZSBhc3NpZ25lZAorICogb3IgcmVsX2NvZGUgaXMgYXNzaWduZWQgYSBub24temVybyB2YWx1ZS4gV2hlbiBhbGwgYXJlIG5vbi16ZXJvLAorICogdXBfa2V5IGFuZCBkb3duX2tleSB3aWxsIGJlIHByZWZlcnJlZC4KKyAqLworc3RydWN0IHB4YTkzMF9yb3RhcnlfcGxhdGZvcm1fZGF0YSB7CisJaW50CXVwX2tleTsKKwlpbnQJZG93bl9rZXk7CisJaW50CXJlbF9jb2RlOworfTsKKwordm9pZCBfX2luaXQgcHhhOTMwX3NldF9yb3RhcnlrZXlfaW5mbyhzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICppbmZvKTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUFhBOTMwX1JPVEFSWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3Rya2JhbGwuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfdHJrYmFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDc4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3Rya2JhbGwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfUFhBOTMwX1RSS0JBTExfSAorI2RlZmluZSBfX0FTTV9BUkNIX1BYQTkzMF9UUktCQUxMX0gKKworc3RydWN0IHB4YTkzMF90cmtiYWxsX3BsYXRmb3JtX2RhdGEgeworCWludCB4X2ZpbHRlcjsKKwlpbnQgeV9maWx0ZXI7Cit9OworCisjZW5kaWYgLyogX19BU01fQVJDSF9QWEE5MzBfVFJLQkFMTF9IICovCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKaW5kZXggNjNiZTJhYi4uNDQyNjliMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmgKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbmFtZSMjX2RldmljZSA9IHsJCQlcCiAJLmRldgkJPSB7CQkJCQlcCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAkJCVwKLQkJLmJ1c19pZAk9IGJ1c2lkLAkJCQlcCisJCS5pbml0X25hbWUgPSBidXNpZCwJCQkJXAogCQkucGxhdGZvcm1fZGF0YSA9IHBsYXQsCQkJCVwKIAl9LAkJCQkJCQlcCiAJLnJlcwkJPSB7CQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAppbmRleCA3NzRmM2FkLi4xZDMwMGZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9TUElfSCBfX0ZJTEVfXwogCiBzdHJ1Y3QgczNjMjQxMF9zcGlfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwkJIHBpbl9jczsJLyogc2ltcGxlIGdwaW8gY3MgKi8KKwlpbnQJCQkgcGluX2NzOwkvKiBzaW1wbGUgZ3BpbyBjcyAqLwogCXVuc2lnbmVkIGludAkJIG51bV9jczsJLyogdG90YWwgY2hpcHNlbGVjdHMgKi8KIAlpbnQJCQkgYnVzX251bTsgICAgICAgLyogYnVzIG51bWJlciB0byB1c2UuICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAppbmRleCBhZmNhYTg1Li45ZDM5ODg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXAogCS5kZXYJCT0gewkJCQkJXAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwJCQlcCi0JCS5idXNfaWQJPSBidXNpZCwJCQkJXAorCQkuaW5pdF9uYW1lID0gYnVzaWQsCQkJCVwKIAkJLnBsYXRmb3JtX2RhdGEgPSBwbGF0LAkJCQlcCiAJfSwJCQkJCQkJXAogCS5yZXMJCT0gewkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKaW5kZXggMjExYzlmNi4uZDZiNWNhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC01OSw3ICs1OSw3IEBACiAKICNkZWZpbmUgdmlydF90b19sYnVzKHgpCQkoKHgpIC0gUEFHRV9PRkZTRVQgKyBPTUFQMTUxMF9MQl9PRkZTRVQpCiAjZGVmaW5lIGxidXNfdG9fdmlydCh4KQkJKCh4KSAtIE9NQVAxNTEwX0xCX09GRlNFVCArIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpCShjcHVfaXNfb21hcDE1eHgoKSAmJiBkZXYgJiYgKHN0cm5jbXAoZGV2LT5idXNfaWQsICJvaGNpIiwgNCkgPT0gMCkpCisjZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXZfbmFtZShkZXYpLCAib2hjaSIsIDQpID09IDApKQogCiAjZGVmaW5lIF9fYXJjaF9wYWdlX3RvX2RtYShkZXYsIHBhZ2UpCSh7aXNfbGJ1c19kZXZpY2UoZGV2KSA/IFwKIAkJCQkJKGRtYV9hZGRyX3QpdmlydF90b19sYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSkgOiBcCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDMxMzY2MjguLjIxOTgyMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAoraGVhZGVyLXkJKz0gc3dhYi5oCiBoZWFkZXIteQkrPSBjYWNoZWN0bC5oCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA3ZWYzODYyLi4zMTg4MTUxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE0LDkgKzE0LDkgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfQVRPTUlDX0gKICNkZWZpbmUgX19BU01fQVZSMzJfQVRPTUlDX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggOGUzYWYwMi4uMmFiYTY0YiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC00LDM0ICs0LDcgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfQllURU9SREVSX0gKICNkZWZpbmUgX19BU01fQVZSMzJfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCi0jZGVmaW5lIF9fQklHX0VORElBTgotI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0KLSNpZmRlZiBfX0NIRUNLRVJfXwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19idWlsdGluX2Jzd2FwXzMyKHVuc2lnbmVkIGxvbmcgeCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgX19idWlsdGluX2Jzd2FwXzE2KHVuc2lnbmVkIHNob3J0IHgpOwotI2VuZGlmCi0KLS8qCi0gKiBhdnIzMi1saW51eC1nY2MgdmVyc2lvbnMgZWFybGllciB0aGFuIDQuMiBpbXByb3Blcmx5IHNpZ24tZXh0ZW5kcwotICogdGhlIHJlc3VsdC4KLSAqLwotI2lmICEoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA8IDIpCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWwpCi17Ci0JcmV0dXJuIF9fYnVpbHRpbl9ic3dhcF8xNih2YWwpOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQotewotCXJldHVybiBfX2J1aWx0aW5fYnN3YXBfMzIodmFsKTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNGFhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQVZSMzIgYnl0ZXN3YXBwaW5nIGZ1bmN0aW9ucy4KKyAqLworI2lmbmRlZiBfX0FTTV9BVlIzMl9TV0FCX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworI2lmZGVmIF9fQ0hFQ0tFUl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2J1aWx0aW5fYnN3YXBfMzIodW5zaWduZWQgbG9uZyB4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfX2J1aWx0aW5fYnN3YXBfMTYodW5zaWduZWQgc2hvcnQgeCk7CisjZW5kaWYKKworLyoKKyAqIGF2cjMyLWxpbnV4LWdjYyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNC4yIGltcHJvcGVybHkgc2lnbi1leHRlbmRzCisgKiB0aGUgcmVzdWx0LgorICovCisjaWYgIShfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMikKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHZhbCkKK3sKKwlyZXR1cm4gX19idWlsdGluX2Jzd2FwXzE2KHZhbCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisJcmV0dXJuIF9fYnVpbHRpbl9ic3dhcF8zMih2YWwpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fQVZSMzJfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCAwZDk4NzM3Li5kNTQ3YzhkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwppbmRleCAxMzhhMDBhLi40NDJmMDhjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAl1bnNpZ25lZAlpOwogCiAJLyogc2tpcCBjbG9ja3MgY291cGxlZCB0byBkZXZpY2VzIHRoYXQgYXJlbid0IHJlZ2lzdGVyZWQgKi8KLQlpZiAocGFyZW50LT5kZXYgJiYgIXBhcmVudC0+ZGV2LT5idXNfaWRbMF0gJiYgIXBhcmVudC0+dXNlcnMpCisJaWYgKHBhcmVudC0+ZGV2ICYmICFkZXZfbmFtZShwYXJlbnQtPmRldikgJiYgIXBhcmVudC0+dXNlcnMpCiAJCXJldHVybjsKIAogCS8qIDxuZXN0IHNwYWNlcz4gbmFtZSA8cGFkIHRvIGVuZD4gKi8KQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlwYXJlbnQtPnVzZXJzID8gIm9uIiA6ICJvZmYiLAkvKiBOT1RFOiBub3QtcGFyYW5vaWQhISAqLwogCQljbGtfZ2V0X3JhdGUocGFyZW50KSk7CiAJaWYgKHBhcmVudC0+ZGV2KQotCQlzZXFfcHJpbnRmKHItPnMsICIsIGZvciAlcyIsIHBhcmVudC0+ZGV2LT5idXNfaWQpOworCQlzZXFfcHJpbnRmKHItPnMsICIsIGZvciAlcyIsIGRldl9uYW1lKHBhcmVudC0+ZGV2KSk7CiAJc2VxX3ByaW50ZihyLT5zLCAiXG4iKTsKIAogCS8qIGNvc3Qgb2YgdGhpcyBzY2FuIGlzIHNtYWxsLCBidXQgbm90IGxpbmVhci4uLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA2MDZlY2ZkLi5kMGQxYWM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwzICsxLDQgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKIHVuaWZkZWYteSArPSBmaXhlZF9jb2RlLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDdjZjUwODcuLjI1Nzc2YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19BUkNIX0JMQUNLRklOX0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9CTEFDS0ZJTl9BVE9NSUNfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CS8qIGxvY2FsX2lycV9YWFgoKSAqLwogCiAvKgpAQCAtMTMsOSArMTQsNiBAQAogICogVG9ueSBLb3UgKHRvbnlrb0BsaW5lby5jYSkgICBMaW5lbyBJbmMuICAgMjAwMQogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDZhNjczZDQuLmI5ZTc5N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw0OCArMSw3IEBACiAjaWZuZGVmIF9CTEFDS0ZJTl9CWVRFT1JERVJfSAogI2RlZmluZSBfQkxBQ0tGSU5fQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX2FyY2hfX3N3YWhiMzIoX191MzIgeHgpCi17Ci0JX191MzIgdG1wOwotCV9fYXNtX18oIiUxID0gJTAgPj4gOCAoVik7XG5cdCIKLQkJIiUwID0gJTAgPDwgOCAoVik7XG5cdCIKLQkJIiUwID0gJTAgfCAlMTtcblx0IgotCQk6ICIrZCIoeHgpLCAiPSZkIih0bXApKTsKLQlyZXR1cm4geHg7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhaHczMihfX3UzMiB4eCkKLXsKLQlfX3UzMiBydjsKLQlfX2FzbV9fKCIlMCA9IFBBQ0soJTEuTCwgJTEuSCk7XG5cdCI6ICI9ZCIocnYpOiAiZCIoeHgpKTsKLQlyZXR1cm4gcnY7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FoYjMyKHgpIF9fX2FyY2hfX3N3YWhiMzIoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FodzMyKHgpIF9fX2FyY2hfX3N3YWh3MzIoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhaGIzMihfX19hcmNoX19zd2FodzMyKHgpKQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX2FyY2hfX3N3YWIxNihfX3UxNiB4eCkKLXsKLQlfX3UzMiB4dyA9IHh4OwotCV9fYXNtX18oIiUwIDw8PSA4O1xuCSUwLkwgPSAlMC5MICsgJTAuSCAoTlMpO1xuIjogIitkIih4dykpOwotCXJldHVybiAoX191MTYpeHc7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fYXJjaF9fc3dhYjE2KHgpCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZgkJCQkvKiBfQkxBQ0tGSU5fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhMDUxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX0JMQUNLRklOX1NXQUJfSAorI2RlZmluZSBfQkxBQ0tGSU5fU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FoYjMyKF9fdTMyIHh4KQoreworCV9fdTMyIHRtcDsKKwlfX2FzbV9fKCIlMSA9ICUwID4+IDggKFYpO1xuXHQiCisJCSIlMCA9ICUwIDw8IDggKFYpO1xuXHQiCisJCSIlMCA9ICUwIHwgJTE7XG5cdCIKKwkJOiAiK2QiKHh4KSwgIj0mZCIodG1wKSk7CisJcmV0dXJuIHh4OworfQorI2RlZmluZSBfX2FyY2hfc3dhaGIzMiBfX2FyY2hfc3dhaGIzMgorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FodzMyKF9fdTMyIHh4KQoreworCV9fdTMyIHJ2OworCV9fYXNtX18oIiUwID0gUEFDSyglMS5MLCAlMS5IKTtcblx0IjogIj1kIihydik6ICJkIih4eCkpOworCXJldHVybiBydjsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWh3MzIgX19hcmNoX3N3YWh3MzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHh4KQoreworCXJldHVybiBfX2FyY2hfc3dhaGIzMihfX2FyY2hfc3dhaHczMih4eCkpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHh4KQoreworCV9fdTMyIHh3ID0geHg7CisJX19hc21fXygiJTAgPDw9IDg7XG4JJTAuTCA9ICUwLkwgKyAlMC5IIChOUyk7XG4iOiAiK2QiKHh3KSk7CisJcmV0dXJuIChfX3UxNil4dzsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjZW5kaWYJCQkJLyogX0JMQUNLRklOX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL0tjb25maWcgYi9hcmNoL2NyaXMvS2NvbmZpZwppbmRleCBiMTdhZWVhLi4zNDYyMjQ1IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvS2NvbmZpZwpAQCAtNjgxLDYgKzY4MSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy91d2IvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyIKKwogc291cmNlICJhcmNoL2NyaXMvS2NvbmZpZy5kZWJ1ZyIKIAogc291cmNlICJzZWN1cml0eS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMKaW5kZXggM2IzODU3ZS4uMmY4ZWEwZiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jCkBAIC0yNCwxMiArMjQsMTIgQEAKICNlcnJvciAiUGxlYXNlIGNvbnRhY3QgPGdyZWdAa3JvYWguY29tPiBmb3IgZGV0YWlscyBvbiBob3cgdG8gZml4IGl0IHByb3Blcmx5LiIKIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgaW9wX3NwdV9kZXZpY2VbMl0gPSB7Ci0JeyAuYnVzX2lkID0gICAgICJpb3Atc3B1MCIsIH0sCi0JeyAuYnVzX2lkID0gICAgICJpb3Atc3B1MSIsIH0sCisJeyAuaW5pdF9uYW1lID0gICAgICJpb3Atc3B1MCIsIH0sCisJeyAuaW5pdF9uYW1lID0gICAgICJpb3Atc3B1MSIsIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGRldmljZSBpb3BfbXB1X2RldmljZSA9IHsKLQkuYnVzX2lkID0gICAgICAgImlvcC1tcHUiLAorCS5pbml0X25hbWUgPSAgICAgICAiaW9wLW1wdSIsCiB9OwogCiBzdGF0aWMgaW50IHdhaXRfbXB1X2lkbGUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBmNzFlYTY4Ni4uNTcxOGRkOCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNCw3ICs0LDcgQEAKICNkZWZpbmUgX19BU01fQ1JJU19BVE9NSUNfXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFyY2gvYXRvbWljLmg+CiAKQEAgLTEzLDggKzEzLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpICgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL0tjb25maWcgYi9hcmNoL2g4MzAwL0tjb25maWcKaW5kZXggMjhmMDZmZC4uOTQyMDY0OCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnCisrKyBiL2FyY2gvaDgzMDAvS2NvbmZpZwpAQCAtMjIwLDYgKzIyMCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyIKKwogc291cmNlICJmcy9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvaDgzMDAvS2NvbmZpZy5kZWJ1ZyIKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggYzY4ZTE2OC4uMjdiMTA4YSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEgKzEsMiBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGI0Y2YwZWEuLjgzMzE4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSwxMiArMSwxMyBAQAogI2lmbmRlZiBfX0FSQ0hfSDgzMDBfQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX0g4MzAwX0FUT01JQ19fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvKgogICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggMzZlNTk3ZC4uYzM2YjgwYSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDEzICsxLDcgQEAKICNpZm5kZWYgX0g4MzAwX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9IODMwMF9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9IODMwMF9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA4ZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfSDgzMDBfU1dBQl9ICisjZGVmaW5lIF9IODMwMF9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfSDgzMDBfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBjY2JlOGFlLi4zYjI1YmQ5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTE0LDMgKzE0LDQgQEAKIHVuaWZkZWYteSArPSBpbnRyaW5zaWNzLmgKIHVuaWZkZWYteSArPSBwZXJmbW9uLmgKIHVuaWZkZWYteSArPSB1c3RhY2suaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDUwYzJiODMuLmQzNzI5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE3LDEyICsxNyw2IEBACiAjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLS8qCi0gKiBPbiBJQS02NCwgY291bnRlciBtdXN0IGFsd2F5cyBiZSB2b2xhdGlsZSB0byBlbnN1cmUgdGhhdCB0aGF0IHRoZQotICogbWVtb3J5IGFjY2Vzc2VzIGFyZSBvcmRlcmVkLgotICovCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczMyIGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIF9fczY0IGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKIAogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJKChhdG9taWNfdCkgeyAoaSkgfSkKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKQkoKGF0b21pYzY0X3QpIHsgKGkpIH0pCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNjliZDQxZC4uMGY4NGM1YyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw0MiArMSw3IEBACiAjaWZuZGVmIF9BU01fSUE2NF9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0lBNjRfQllURU9SREVSX0gKIAotLyoKLSAqIE1vZGlmaWVkIDE5OTgsIDE5OTkKLSAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4sIEhld2xldHQtUGFja2FyZCBDby4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0Ci1fX2lhNjRfc3dhYjY0IChfX3U2NCB4KQotewotCV9fdTY0IHJlc3VsdDsKLQotCXJlc3VsdCA9IGlhNjRfbXV4MSh4LCBpYTY0X211eDFfcmV2KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyCi1fX2lhNjRfc3dhYjMyIChfX3UzMiB4KQotewotCXJldHVybiBfX2lhNjRfc3dhYjY0KHgpID4+IDMyOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2Ci1fX2lhNjRfc3dhYjE2KF9fdTE2IHgpCi17Ci0JcmV0dXJuIF9faWE2NF9zd2FiNjQoeCkgPj4gNDg7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiNjQoeCkgX19pYTY0X3N3YWI2NCh4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX2lhNjRfc3dhYjMyKHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9faWE2NF9zd2FiMTYoeCkKLQotI2RlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BU01fSUE2NF9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNThiNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfQVNNX0lBNjRfU1dBQl9ICisjZGVmaW5lIF9BU01fSUE2NF9TV0FCX0gKKworLyoKKyAqIE1vZGlmaWVkIDE5OTgsIDE5OTkKKyAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4sIEhld2xldHQtUGFja2FyZCBDby4KKyAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2ludHJpbnNpY3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgeCkKK3sKKwlfX3U2NCByZXN1bHQ7CisKKwlyZXN1bHQgPSBpYTY0X211eDEoeCwgaWE2NF9tdXgxX3Jldik7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCXJldHVybiBfX2FyY2hfc3dhYjY0KHgpID4+IDMyOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJcmV0dXJuIF9fYXJjaF9zd2FiNjQoeCkgPj4gNDg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCisjZW5kaWYgLyogX0FTTV9JQTY0X1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3aW90bGIuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKaW5kZXggZmI3OTQyMy4uZGNiYWVhNyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3aW90bGIuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dpb3RsYi5oCkBAIC0yLDQ0ICsyLDcgQEAKICNkZWZpbmUgQVNNX0lBNjRfX1NXSU9UTEJfSAogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotLyogU1dJT1RMQiBpbnRlcmZhY2UgKi8KLQotZXh0ZXJuIGRtYV9hZGRyX3Qgc3dpb3RsYl9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCAqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCWRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJICAgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkgICAgICBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkJIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgICAgIGludCBkaXIpOwotZXh0ZXJuIGludCBzd2lvdGxiX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gaW50IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwotZXh0ZXJuIGludCBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfaW5pdCh2b2lkKTsKKyNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CiAKIGV4dGVybiBpbnQgc3dpb3RsYl9mb3JjZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCBmMDc2ODhkLi4wOTdiODRkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNjcwLDkgKzY3MCwxMSBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIHAtPmFpbnNuLmluc3RfZmxhZyAmIElOU1RfRkxBR19CT09TVEFCTEUpOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLAorCQkJICAgICAgIHAtPmFpbnNuLmluc3RfZmxhZyAmIElOU1RfRkxBR19CT09TVEFCTEUpOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAvKgogICogV2UgYXJlIHJlc3VtaW5nIGV4ZWN1dGlvbiBhZnRlciBhIHNpbmdsZSBzdGVwIGZhdWx0LCBzbyB0aGUgcHRfcmVncwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYwppbmRleCAyYTkyZjYzLi5kMGFkYTA2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYwpAQCAtMzksNyArMzksNyBAQAogICAgYmUgcHJvYmFibHkgYSBzbWFsbGVyIERNQSBtYXNrLCBidXQgdGhpcyBpcyBidWctdG8tYnVnIGNvbXBhdGlibGUKICAgIHRvIGkzODYuICovCiBzdHJ1Y3QgZGV2aWNlIGZhbGxiYWNrX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZmYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggMDU0YmNkOS4uNTZlMTI5MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC02OTIsNyArNjkyLDcgQEAKIAlwZ2RhdCA9IE5PREVfREFUQShuaWQpOwogCiAJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgWk9ORV9OT1JNQUw7Ci0JcmV0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIAogCWlmIChyZXQpCiAJCXByaW50aygiJXM6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gX19hZGRfcGFnZXMoKSBhcyByZXQ9JWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKaW5kZXggYTg4ZWJhMy4uM2Y4NjQyMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwpAQCAtMjA2LDggKzIwNiw3IEBACiAJY3hfZGV2LT5kZXYucGFyZW50ID0gTlVMTDsKIAljeF9kZXYtPmRldi5idXMgPSAmdGlvY3hfYnVzX3R5cGU7CiAJY3hfZGV2LT5kZXYucmVsZWFzZSA9IHRpb2N4X2J1c19yZWxlYXNlOwotCXNucHJpbnRmKGN4X2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZCIsCi0JCSBjeF9kZXYtPmN4X2lkLm5hc2lkKTsKKwlkZXZfc2V0X25hbWUoJmN4X2Rldi0+ZGV2LCAiJWQiLCBjeF9kZXYtPmN4X2lkLm5hc2lkKTsKIAlkZXZpY2VfcmVnaXN0ZXIoJmN4X2Rldi0+ZGV2KTsKIAlnZXRfZGV2aWNlKCZjeF9kZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBjNjhlMTY4Li41OGMwMmE0IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggZDU2MzJhMy4uNmJiNjc0OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fQVJDSF9NNjhLTk9NTVVfQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX002OEtOT01NVV9BVE9NSUNfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCkBAIC0xMiw3ICsxMyw2IEBACiAgKiBXZSBkbyBub3QgaGF2ZSBTTVAgbTY4ayBzeXN0ZW1zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGF0LgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggMjBiYjQ0Mi4uYTZmMGI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsMjcgKzEsNyBAQAogI2lmbmRlZiBfTTY4S05PTU1VX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9NNjhLTk9NTVVfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fbWNmaXNhYXBsdXNfXykgfHwgZGVmaW5lZCAoX19tY2Zpc2FjX18pCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHZhbCkKLXsKLQlhc20oCi0JCQkiYnl0ZXJldiAlMCIKLQkJCTogIj1kIiAodmFsKQotCQkJOiAiMCIgKHZhbCkKLQkgICApOwotCXJldHVybiB2YWw7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9NNjhLTk9NTVVfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTgyMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX002OEtOT01NVV9TV0FCX0gKKyNkZWZpbmUgX002OEtOT01NVV9TV0FCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fbWNmaXNhYXBsdXNfXykgfHwgZGVmaW5lZCAoX19tY2Zpc2FjX18pCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisJYXNtKAorCQkJImJ5dGVyZXYgJTAiCisJCQk6ICI9ZCIgKHZhbCkKKwkJCTogIjAiICh2YWwpCisJICAgKTsKKwlyZXR1cm4gdmFsOworfQorCisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorI2VuZGlmCisKKyNlbmRpZiAvKiBfTTY4S05PTU1VX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNzg5N2YwNS4uMDIzODY2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogaGVhZGVyLXkgKz0gY2FjaGVjdGwuaCBzZ2lkZWZzLmggc3lzbWlwcy5oCitoZWFkZXIteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAxMjMyYmUzLi5jOTk2YzNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xNSwxMyArMTUsMTIgQEAKICNkZWZpbmUgX0FTTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgICAgeyAoaSkgfQogCiAvKgpAQCAtNDA0LDggKzQwMyw2IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpICAgIHsgKGkpIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCAzMzc5MGI5Li42MDdiNzE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC04LDYwICs4LDE0IEBACiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWYgZGVmaW5lZChfX01JUFNFQl9fKQotIyBkZWZpbmUgX19CSUdfRU5ESUFOCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KICNlbGlmIGRlZmluZWQoX19NSVBTRUxfXykKLSMgZGVmaW5lIF9fTElUVExFX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQogIyBlcnJvciAiTUlQUywgYnV0IG5laXRoZXIgX19NSVBTRUJfXywgbm9yIF9fTUlQU0VMX18/Pz8iCiAjZW5kaWYKIAotI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0KLSNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQotewotCV9fYXNtX18oCi0JIgl3c2JoCSUwLCAlMQkJCVxuIgotCTogIj1yIiAoeCkKLQk6ICJyIiAoeCkpOwotCi0JcmV0dXJuIHg7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQotewotCV9fYXNtX18oCi0JIgl3c2JoCSUwLCAlMQkJCVxuIgotCSIJcm90cgklMCwgJTAsIDE2CQlcbiIKLQk6ICI9ciIgKHgpCi0JOiAiciIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotI2lmZGVmIENPTkZJR19DUFVfTUlQUzY0X1IyCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQotewotCV9fYXNtX18oCi0JIglkc2JoCSUwLCAlMVxuIgotCSIJZHNoZAklMCwgJTAiCi0JOiAiPXIiICh4KQotCTogInIiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0Ci0jZW5kaWYgLyogQ09ORklHX0NQVV9NSVBTNjRfUjIgKi8KLQotI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQU1IyICovCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KLQogI2VuZGlmIC8qIF9BU01fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjFmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDk5LCAyMDAzIGJ5IFJhbGYgQmFlY2hsZQorICovCisjaWZuZGVmIF9BU01fU1dBQl9ICisjZGVmaW5lIF9BU01fU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworI2lmZGVmIENPTkZJR19DUFVfTUlQU1IyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJX19hc21fXygKKwkiCXdzYmgJJTAsICUxCQkJXG4iCisJOiAiPXIiICh4KQorCTogInIiICh4KSk7CisKKwlyZXR1cm4geDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX19hc21fXygKKwkiCXdzYmgJJTAsICUxCQkJXG4iCisJIglyb3RyCSUwLCAlMCwgMTYJCVxuIgorCTogIj1yIiAoeCkKKwk6ICJyIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjaWZkZWYgQ09ORklHX0NQVV9NSVBTNjRfUjIKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHgpCit7CisJX19hc21fXygKKwkiCWRzYmgJJTAsICUxXG4iCisJIglkc2hkCSUwLCAlMCIKKwk6ICI9ciIgKHgpCisJOiAiciIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX01JUFM2NF9SMiAqLworI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQU1IyICovCisjZW5kaWYgLyogX0FTTV9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCmluZGV4IDAxMGIyN2UuLjNjYTVmNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmdnBlX2RldmljZSk7CiAJdnBlX2RldmljZS5jbGFzcwk9ICZ2cGVfY2xhc3MsCiAJdnBlX2RldmljZS5wYXJlbnQJPSBOVUxMLAotCXN0cmxjcHkodnBlX2RldmljZS5idXNfaWQsICJ2cGUxIiwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZSgmdnBlX2RldmljZSwgInZwZTEiKTsKIAl2cGVfZGV2aWNlLmRldnQgPSBNS0RFVihtYWpvciwgbWlub3IpOwogCWVyciA9IGRldmljZV9hZGQoJnZwZV9kZXZpY2UpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggNTdmY2M0YS4uZWRiZmUyNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE1NSwxNCArMTU1LDExIEBACiAjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogI2VuZGlmCiAKLS8qIE5vdGUgdGhhdCB3ZSBuZWVkIG5vdCBsb2NrIHJlYWQgYWNjZXNzZXMgLSBhbGlnbmVkIHdvcmQgd3JpdGVzL3JlYWRzCi0gKiBhcmUgYXRvbWljLCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIHVuY29uc2lzdGVudCB2YWx1ZXMuCi0gKgotICogQ2FjaGUtbGluZSBhbGlnbm1lbnQgd291bGQgY29uZmxpY3Qgd2l0aCwgZm9yIGV4YW1wbGUsIGxpbnV4L21vZHVsZS5oCisvKgorICogTm90ZSB0aGF0IHdlIG5lZWQgbm90IGxvY2sgcmVhZCBhY2Nlc3NlcyAtIGFsaWduZWQgd29yZCB3cml0ZXMvcmVhZHMKKyAqIGFyZSBhdG9taWMsIHNvIGEgcmVhZGVyIG5ldmVyIHNlZXMgaW5jb25zaXN0ZW50IHZhbHVlcy4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAvKiBJdCdzIHBvc3NpYmxlIHRvIHJlZHVjZSBhbGwgYXRvbWljIG9wZXJhdGlvbnMgdG8gZWl0aGVyCiAgKiBfX2F0b21pY19hZGRfcmV0dXJuLCBhdG9taWNfc2V0IGFuZCBhdG9taWNfcmVhZCAodGhlIGxhdHRlcgogICogaXMgdGhlcmUgb25seSBmb3IgY29uc2lzdGVuY3kpLgpAQCAtMjYwLDggKzI1Nyw2IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBzNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkgKChhdG9taWM2NF90KSB7IChpKSB9KQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDVhYjdkN2YuLjkyNjg2MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMzUsMyArMzUsNCBAQAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDQ5OWJlNWIuLmI0MDE5NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTUsNyArNSw3IEBACiAgKiBQb3dlclBDIGF0b21pYyBvcGVyYXRpb25zCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC0yNTEsOCArMjUxLDYgQEAKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KIAotdHlwZWRlZiBzdHJ1Y3QgeyBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIAogc3RhdGljIF9faW5saW5lX18gbG9uZyBhdG9taWM2NF9yZWFkKGNvbnN0IGF0b21pYzY0X3QgKnYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZDVkZTMyNS4uNWNjYTI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtOCw4NiArOCw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0jZGVmaW5lIF9fQklHX0VORElBTgotCi0jaWZkZWYgX19HTlVDX18KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTE2IGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgX191MTYgKmFkZHIpCi17Ci0JX191MTYgdmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNnAgbGRfbGUxNgotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMTYodm9sYXRpbGUgX191MTYgKmFkZHIsIGNvbnN0IF9fdTE2IHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aGJyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjE2cyhfX3UxNiAqYWRkcikKLXsKLQlzdF9sZTE2KGFkZHIsICphZGRyKTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNnMgX19hcmNoX3N3YWIxNnMKLQotc3RhdGljIF9faW5saW5lX18gX191MzIgbGRfbGUzMihjb25zdCB2b2xhdGlsZSBfX3UzMiAqYWRkcikKLXsKLQlfX3UzMiB2YWw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3YnJ4ICUwLDAsJTEiIDogIj1yIiAodmFsKSA6ICJyIiAoYWRkciksICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gdmFsOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBsZF9sZTMyCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RfbGUzMih2b2xhdGlsZSBfX3UzMiAqYWRkciwgY29uc3QgX191MzIgdmFsKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTIiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiMzJzKF9fdTMyICphZGRyKQotewotCXN0X2xlMzIoYWRkciwgKmFkZHIpOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycyBfX2FyY2hfc3dhYjMycwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWx1ZSkKLXsKLQlfX3UxNiByZXN1bHQ7Ci0KLQlfX2FzbV9fKCJybHdpbWkgJTAsJTEsOCwxNiwyMyIKLQkgICAgOiAiPXIiIChyZXN1bHQpCi0JICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gOCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWx1ZSkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0KLQlfX2FzbV9fKCJybHdpbWkgJTAsJTEsMjQsMTYsMjNcblx0IgotCSAgICAicmx3aW1pICUwLCUxLDgsOCwxNVxuXHQiCi0JICAgICJybHdpbWkgJTAsJTEsMjQsMCw3IgotCSAgICA6ICI9ciIgKHJlc3VsdCkKLQkgICAgOiAiciIgKHZhbHVlKSwgIjAiICh2YWx1ZSA+PiAyNCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCmluZGV4IDI2ZjBkMGEuLmIxZGFmYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaApAQCAtMTgsNiArMTgsMTIgQEAKIAkJCSAgICAgIHB0ZV90ICpwdGVwKTsKIAogLyoKKyAqIFRoZSB2ZXJzaW9uIG9mIHZtYV9tbXVfcGFnZXNpemUoKSBpbiBhcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBuZWVkcworICogdG8gb3ZlcnJpZGUgdGhlIHZlcnNpb24gaW4gbW0vaHVnZXRsYi5jCisgKi8KKyNkZWZpbmUgdm1hX21tdV9wYWdlc2l6ZSB2bWFfbW11X3BhZ2VzaXplCisKKy8qCiAgKiBJZiB0aGUgYXJjaCBkb2Vzbid0IHN1cHBseSBzb21ldGhpbmcgZWxzZSwgYXNzdW1lIHRoYXQgaHVnZXBhZ2UKICAqIHNpemUgYWxpZ25lZCByZWdpb25zIGFyZSBvayB3aXRob3V0IGZ1cnRoZXIgcHJlcGFyYXRpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NXQUJfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU1dBQl9ICisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWZkZWYgX19HTlVDX18KKworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgX191MTYgKmFkZHIpCit7CisJX191MTYgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7CisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgbGRfbGUxNgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMTYodm9sYXRpbGUgX191MTYgKmFkZHIsIGNvbnN0IF9fdTE2IHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aGJyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjE2cyhfX3UxNiAqYWRkcikKK3sKKwlzdF9sZTE2KGFkZHIsICphZGRyKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnMgX19hcmNoX3N3YWIxNnMKKworc3RhdGljIF9faW5saW5lX18gX191MzIgbGRfbGUzMihjb25zdCB2b2xhdGlsZSBfX3UzMiAqYWRkcikKK3sKKwlfX3UzMiB2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3YnJ4ICUwLDAsJTEiIDogIj1yIiAodmFsKSA6ICJyIiAoYWRkciksICJtIiAoKmFkZHIpKTsKKwlyZXR1cm4gdmFsOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycCBsZF9sZTMyCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RfbGUzMih2b2xhdGlsZSBfX3UzMiAqYWRkciwgY29uc3QgX191MzIgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTIiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiMzJzKF9fdTMyICphZGRyKQoreworCXN0X2xlMzIoYWRkciwgKmFkZHIpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycyBfX2FyY2hfc3dhYjMycworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWx1ZSkKK3sKKwlfX3UxNiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsOCwxNiwyMyIKKwkgICAgOiAiPXIiIChyZXN1bHQpCisJICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gOCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWx1ZSkKK3sKKwlfX3UzMiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsMjQsMTYsMjNcblx0IgorCSAgICAicmx3aW1pICUwLCUxLDgsOCwxNVxuXHQiCisJICAgICJybHdpbWkgJTAsJTEsMjQsMCw3IgorCSAgICA6ICI9ciIgKHJlc3VsdCkKKwkgICAgOiAiciIgKHZhbHVlKSwgIjAiICh2YWx1ZSA+PiAyNCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZGU3OTkxNS4uOTg5ZWRjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTk2LDkgKzk2LDEwIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IDIwMWM3YTUuLjk5MjBkNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC01MTIsNiArNTEyLDEzIEBACiAJcmV0dXJuIHNsaWNlX2dldF91bm1hcHBlZF9hcmVhKGFkZHIsIGxlbiwgZmxhZ3MsIG1tdV9wc2l6ZSwgMSwgMCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBpbnQgcHNpemUgPSBnZXRfc2xpY2VfcHNpemUodm1hLT52bV9tbSwgdm1hLT52bV9zdGFydCk7CisKKwlyZXR1cm4gMVVMIDw8IG1tdV9wc2l6ZV90b19zaGlmdChwc2l6ZSk7Cit9CisKIC8qCiAgKiBDYWxsZWQgYnkgYXNtIGhhc2h0YWJsZS5TIGZvciBkb2luZyBsYXp5IGljYWNoZSBmbHVzaAogICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggNTNiMDZlYi4uZjAwZjA5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJLyogdGhpcyBzaG91bGQgd29yayBmb3IgbW9zdCBub24taGlnaG1lbSBwbGF0Zm9ybXMgKi8KIAl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOwogCi0JcmV0dXJuIF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldHVybiBfX2FkZF9wYWdlcyhuaWQsIHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA2M2EyMzQxLi5mMmFmNDE2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEzLDMgKzEzLDQgQEAKIHVuaWZkZWYteSArPSBkZWJ1Zy5oCiB1bmlmZGVmLXkgKz0gY2hwaWQuaAogdW5pZmRlZi15ICs9IHNjaGlkLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAyZDE4NDY1Li5kZTQzMmYyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FSQ0hfUzM5MF9BVE9NSUNfXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICogIGluY2x1ZGUvYXNtLXMzOTAvYXRvbWljLmgKQEAgLTIzLDkgKzI0LDYgQEAKICAqIFMzOTAgdXNlcyAnQ29tcGFyZSBBbmQgU3dhcCcgZm9yIGF0b21pY2l0eSBpbiBTTVAgZW52aXJvbWVudAogICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSkgYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICB7IChpKSB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0xNDksOSArMTQ3LDYgQEAKICN1bmRlZiBfX0NTX0xPT1AKIAogI2lmZGVmIF9fczM5MHhfXwotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgbG9uZyBjb3VudGVyOwotfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBhdG9taWM2NF90OwogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpICB7IChpKSB9CiAKICNpZiBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDhiY2YyNzcuLmI5NWEyYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsOTUgKzEsNyBAQAogI2lmbmRlZiBfUzM5MF9CWVRFT1JERVJfSAogI2RlZmluZSBfUzM5MF9CWVRFT1JERVJfSAogCi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvYnl0ZW9yZGVyLmgKLSAqCi0gKiAgUzM5MCB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgKEMpIDE5OTkgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCi0gKi8KLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jZGVmaW5lIF9fQklHX0VORElBTgotCi0jaWZuZGVmIF9fczM5MHhfXwotIyBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNpZmRlZiBfX3MzOTB4X18KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NHAoY29uc3QgX191NjQgKngpCi17Ci0JX191NjQgcmVzdWx0OwotCi0JYXNtIHZvbGF0aWxlKCJscnZnICUwLCUxIiA6ICI9ZCIgKHJlc3VsdCkgOiAibSIgKCp4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NHAgX19hcmNoX3N3YWI2NHAKLQotc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHgpCi17Ci0JX191NjQgcmVzdWx0OwotCi0JYXNtIHZvbGF0aWxlKCJscnZnciAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjY0cyhfX3U2NCAqeCkKLXsKLQkqeCA9IF9fYXJjaF9zd2FiNjRwKHgpOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjY0cyBfX2FyY2hfc3dhYjY0cwotI2VuZGlmIC8qIF9fczM5MHhfXyAqLwotCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzJwKGNvbnN0IF9fdTMyICp4KQotewotCV9fdTMyIHJlc3VsdDsKLQkKLQlhc20gdm9sYXRpbGUoCi0jaWZuZGVmIF9fczM5MHhfXwotCQkiCWljbQklMCw4LDMoJTEpXG4iCi0JCSIJaWNtCSUwLDQsMiglMSlcbiIKLQkJIglpY20JJTAsMiwxKCUxKVxuIgotCQkiCWljCSUwLDAoJTEpIgotCQk6ICI9JmQiIChyZXN1bHQpIDogImEiICh4KSwgIm0iICgqeCkgOiAiY2MiKTsKLSNlbHNlIC8qIF9fczM5MHhfXyAqLwotCQkiCWxydgklMCwlMSIKLQkJOiAiPWQiIChyZXN1bHQpIDogIm0iICgqeCkpOwotI2VuZGlmIC8qIF9fczM5MHhfXyAqLwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMzJwIF9fYXJjaF9zd2FiMzJwCi0KLSNpZmRlZiBfX3MzOTB4X18KLXN0YXRpYyBpbmxpbmUgX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQotewotCV9fdTMyIHJlc3VsdDsKLQkKLQlhc20gdm9sYXRpbGUoImxydnIgICUwLCUxIiA6ICI9ZCIgKHJlc3VsdCkgOiAiZCIgKHgpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQotc3RhdGljIGlubGluZSBfX3UxNiBfX2FyY2hfc3dhYjE2cChjb25zdCBfX3UxNiAqeCkKLXsKLQlfX3UxNiByZXN1bHQ7Ci0JCi0JYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBfX3MzOTB4X18KLQkJIglpY20JJTAsMiwxKCUxKVxuIgotCQkiCWljCSUwLDAoJTEpXG4iCi0JCTogIj0mZCIgKHJlc3VsdCkgOiAiYSIgKHgpLCAibSIgKCp4KSA6ICJjYyIpOwotI2Vsc2UgLyogX19zMzkweF9fICovCi0JCSIJbHJ2aAklMCwlMSIKLQkJOiAiPWQiIChyZXN1bHQpIDogIm0iICgqeCkpOwotI2VuZGlmIC8qIF9fczM5MHhfXyAqLwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTZwIF9fYXJjaF9zd2FiMTZwCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfUzM5MF9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3MzOTBfcmRldi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3MzOTBfcmRldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmEyMDQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20tczM5MC9jY3dkZXYuaAotICoKLSAqICAgIENvcHlyaWdodCAoQykgMjAwMiwyMDA1IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayA8Y29ybmVsaWEuaHVja0BkZS5pYm0uY29tPgotICogICAgICAgICAgICAgICBDYXJzdGVuIE90dGUgIDxjb3R0ZUBkZS5pYm0uY29tPgotICoKLSAqICBJbnRlcmZhY2UgZm9yIHMzOTAgcm9vdCBkZXZpY2UKLSAqLwotCi0jaWZuZGVmIF9TMzkwX1JERVZfSF8KLSNkZWZpbmUgX1MzOTBfUkRFVl9IXwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKnMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkIHMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICopOwotI2VuZGlmIC8qIF9TMzkwX1JERVZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTMyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgX1MzOTBfU1dBQl9ICisjZGVmaW5lIF9TMzkwX1NXQUJfSAorCisvKgorICogIGluY2x1ZGUvYXNtLXMzOTAvc3dhYi5oCisgKgorICogIFMzOTAgdmVyc2lvbgorICogICAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX3MzOTB4X18KKyMgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjaWZkZWYgX19zMzkweF9fCitzdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICp4KQoreworCV9fdTY0IHJlc3VsdDsKKworCWFzbSB2b2xhdGlsZSgibHJ2ZyAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogIm0iICgqeCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCisKK3N0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQoreworCV9fdTY0IHJlc3VsdDsKKworCWFzbSB2b2xhdGlsZSgibHJ2Z3IgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJkIiAoeCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCitzdGF0aWMgaW5saW5lIHZvaWQgX19hcmNoX3N3YWI2NHMoX191NjQgKngpCit7CisJKnggPSBfX2FyY2hfc3dhYjY0cCh4KTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NHMgX19hcmNoX3N3YWI2NHMKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKworc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqeCkKK3sKKwlfX3UzMiByZXN1bHQ7CisJCisJYXNtIHZvbGF0aWxlKAorI2lmbmRlZiBfX3MzOTB4X18KKwkJIglpY20JJTAsOCwzKCUxKVxuIgorCQkiCWljbQklMCw0LDIoJTEpXG4iCisJCSIJaWNtCSUwLDIsMSglMSlcbiIKKwkJIglpYwklMCwwKCUxKSIKKwkJOiAiPSZkIiAocmVzdWx0KSA6ICJhIiAoeCksICJtIiAoKngpIDogImNjIik7CisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKwkJIglscnYJJTAsJTEiCisJCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAorCisjaWZkZWYgX19zMzkweF9fCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKK3sKKwlfX3UzMiByZXN1bHQ7CisJCisJYXNtIHZvbGF0aWxlKCJscnZyICAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh4KSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisjZW5kaWYgLyogX19zMzkweF9fICovCisKK3N0YXRpYyBpbmxpbmUgX191MTYgX19hcmNoX3N3YWIxNnAoY29uc3QgX191MTYgKngpCit7CisJX191MTYgcmVzdWx0OworCQorCWFzbSB2b2xhdGlsZSgKKyNpZm5kZWYgX19zMzkweF9fCisJCSIJaWNtCSUwLDIsMSglMSlcbiIKKwkJIglpYwklMCwwKCUxKVxuIgorCQk6ICI9JmQiIChyZXN1bHQpIDogImEiICh4KSwgIm0iICgqeCkgOiAiY2MiKTsKKyNlbHNlIC8qIF9fczM5MHhfXyAqLworCQkiCWxydmgJJTAsJTEiCisJCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAorCisjZW5kaWYgLyogX1MzOTBfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDU2OTA3OWUuLjliOTI4NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0yMTgsOSArMjE4LDEwIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vaW5pdC5jIGIvYXJjaC9zMzkwL21tL2luaXQuYwppbmRleCAxNThiMGQ2Li5mMDI1OGNhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vaW5pdC5jCisrKyBiL2FyY2gvczM5MC9tbS9pbml0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhzdGFydCwgc2l6ZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBfX2FkZF9wYWdlcyh6b25lLCBQRk5fRE9XTihzdGFydCksIFBGTl9ET1dOKHNpemUpKTsKKwlyYyA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgUEZOX0RPV04oc3RhcnQpLCBQRk5fRE9XTihzaXplKSk7CiAJaWYgKHJjKQogCQl2bWVtX3JlbW92ZV9tYXBwaW5nKHN0YXJ0LCBzaXplKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDQzOTEwY2QuLmYxYTJhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC02LDMgKzYsNCBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gcG9zaXhfdHlwZXNfMzIuaAogdW5pZmRlZi15ICs9IHBvc2l4X3R5cGVzXzY0LmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGMwNDNlZjAuLjYzMjdmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNywxNiArNywxNSBAQAogICoKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJKCAoYXRvbWljX3QpIHsgKGkpIH0gKQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogI2lmIGRlZmluZWQoQ09ORklHX0dVU0FfUkIpCiAjaW5jbHVkZSA8YXNtL2F0b21pYy1ncmIuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZjVmYTA2NS4uZTk1YzQxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDY4ICsxLDEyIEBACiAjaWZuZGVmIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBQYW9sbyBBbGJlcmVsbGkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLSMgZGVmaW5lIF9fTElUVExFX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQotIyBkZWZpbmUgX19CSUdfRU5ESUFOCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KICNlbmRpZgogCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwXG5cdCIKLQkJInN3YXAudwkJJTAsICUwXG5cdCIKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAiMCIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAgIjAiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCi17Ci0JdW5pb24gewotCQlzdHJ1Y3QgeyBfX3UzMiBhLGI7IH0gczsKLQkJX191NjQgdTsKLQl9IHYsIHc7Ci0Jdi51ID0gdmFsOwotCXcucy5iID0gX19hcmNoX3N3YWIzMih2LnMuYSk7Ci0Jdy5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKLQlyZXR1cm4gdy51OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgotCiAjZW5kaWYgLyogX19BU01fU0hfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5MzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNjAgQEAKKyNpZm5kZWYgX19BU01fU0hfU1dBQl9ICisjZGVmaW5lIF9fQVNNX1NIX1NXQUJfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgUGFvbG8gQWxiZXJlbGxpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTBcblx0IgorCQkic3dhcC53CQklMCwgJTBcblx0IgorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICIwIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICAiMCIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCB7IF9fdTMyIGEsYjsgfSBzOworCQlfX3U2NCB1OworCX0gdiwgdzsKKwl2LnUgPSB2YWw7CisJdy5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl3LnMuYSA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCXJldHVybiB3LnU7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCisjZW5kaWYgLyogX19BU01fU0hfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCA4ODgwN2EyLi5jMGFhM2Q4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggNmNiZWY4Yy4uM2VkZjI5NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTMxMSw3ICszMTEsOCBAQAogCXBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CiAKIAkvKiBXZSBvbmx5IGhhdmUgWk9ORV9OT1JNQUwsIHNvIHRoaXMgaXMgZWFzeS4uICovCi0JcmV0ID0gX19hZGRfcGFnZXMocGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX05PUk1BTCwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCBwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLAorCQkJCXN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlwcmludGsoIiVzOiBGYWlsZWQsIF9fYWRkX3BhZ2VzKCkgPT0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGRlZWIwZmIuLjk1ZTM4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xNywzICsxNyw0IEBACiBoZWFkZXIteSArPSB1Y3R4LmgKIGhlYWRlci15ICs9IHV0cmFwLmgKIGhlYWRlci15ICs9IHdhdGNoZG9nLmgKK2hlYWRlci15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKaW5kZXggNWM5NDRiNS4uY2U0NjU5NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCkBAIC0xMyw4ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICB7IChpKSB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaAppbmRleCA1OTgyYzVhLi5hMGE3MDY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKQEAgLTEwLDkgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgX19zNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQl7IChpKSB9CiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJeyAoaSkgfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA3Mzg0MTRiLi40OGEwNDdjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNDkgKzEsNyBAQAogI2lmbmRlZiBfU1BBUkNfQllURU9SREVSX0gKICNkZWZpbmUgX1NQQVJDX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9hc2kuaD4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4KLQotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi1zdGF0aWMgaW5saW5lIF9fdTE2IF9fYXJjaF9zd2FiMTZwKGNvbnN0IF9fdTE2ICphZGRyKQotewotCV9fdTE2IHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1aGEgWyUxXSAlMiwgJTAiCi0JCQkgICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAotCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzJwKGNvbnN0IF9fdTMyICphZGRyKQotewotCV9fdTMyIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1d2EgWyUxXSAlMiwgJTAiCi0JCQkgICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAotCi1zdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICphZGRyKQotewotCV9fdTY0IHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR4YSBbJTFdICUyLCAlMCIKLQkJCSAgICAgIDogIj1yIiAocmV0KQotCQkJICAgICAgOiAiciIgKGFkZHIpLCAiaSIgKEFTSV9QTCkpOwotCXJldHVybiByZXQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCi0KLSNlbHNlCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZiAvKiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSAqLwotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX1NQQVJDX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGFkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIF9TUEFSQ19TV0FCX0gKKyNkZWZpbmUgX1NQQVJDX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQorc3RhdGljIGlubGluZSBfX3UxNiBfX2FyY2hfc3dhYjE2cChjb25zdCBfX3UxNiAqYWRkcikKK3sKKwlfX3UxNiByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdWhhIFslMV0gJTIsICUwIgorCQkJICAgICAgOiAiPXIiIChyZXQpCisJCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgX19hcmNoX3N3YWIxNnAKKworc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqYWRkcikKK3sKKwlfX3UzMiByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkdXdhIFslMV0gJTIsICUwIgorCQkJICAgICAgOiAiPXIiIChyZXQpCisJCQkgICAgICA6ICJyIiAoYWRkciksICJpIiAoQVNJX1BMKSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMnAgX19hcmNoX3N3YWIzMnAKKworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0cChjb25zdCBfX3U2NCAqYWRkcikKK3sKKwlfX3U2NCByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxkeGEgWyUxXSAlMiwgJTAiCisJCQkgICAgICA6ICI9ciIgKHJldCkKKwkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0cCBfX2FyY2hfc3dhYjY0cAorCisjZWxzZQorI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYgLyogZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykgKi8KKworI2VuZGlmIC8qIF9TUEFSQ19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXAuYyBiL2FyY2gvdW0va2VybmVsL3RyYXAuYwppbmRleCA0NGU0OTA0Li43Mzg0ZDhhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90cmFwLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCkBAIC02NCwxMSArNjQsMTAgQEAKIAogCWRvIHsKIAkJaW50IGZhdWx0Owotc3Vydml2ZToKKwogCQlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCBpc193cml0ZSk7CiAJCWlmICh1bmxpa2VseShmYXVsdCAmIFZNX0ZBVUxUX0VSUk9SKSkgewogCQkJaWYgKGZhdWx0ICYgVk1fRkFVTFRfT09NKSB7Ci0JCQkJZXJyID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dF9vZl9tZW1vcnk7CiAJCQl9IGVsc2UgaWYgKGZhdWx0ICYgVk1fRkFVTFRfU0lHQlVTKSB7CiAJCQkJZXJyID0gLUVBQ0NFUzsKQEAgLTEwNCwxOCArMTAzLDE0IEBACiBvdXRfbm9zZW1hcGhvcmU6CiAJcmV0dXJuIGVycjsKIAotLyoKLSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQotICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgotICovCiBvdXRfb2ZfbWVtb3J5OgotCWlmIChpc19nbG9iYWxfaW5pdChjdXJyZW50KSkgewotCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQl5aWVsZCgpOwotCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCWdvdG8gc3Vydml2ZTsKLQl9Ci0JZ290byBvdXQ7CisJLyoKKwkgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgY2FsbCB0aGUgT09NIGtpbGxlciwgYW5kIHJldHVybiB0aGUgdXNlcnNwYWNlCisJICogKHdoaWNoIHdpbGwgcmV0cnkgdGhlIGZhdWx0LCBvciBraWxsIHVzIGlmIHdlIGdvdCBvb20ta2lsbGVkKS4KKwkgKi8KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJhZF9zZWd2KHN0cnVjdCBmYXVsdGluZm8gZmksIHVuc2lnbmVkIGxvbmcgaXApCkBAIC0yMTQsOSArMjA5LDYgQEAKIAkJc2kuc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CiAJCWN1cnJlbnQtPnRocmVhZC5hcmNoLmZhdWx0aW5mbyA9IGZpOwogCQlmb3JjZV9zaWdfaW5mbyhTSUdCVVMsICZzaSwgY3VycmVudCk7Ci0JfSBlbHNlIGlmIChlcnIgPT0gLUVOT01FTSkgewotCQlwcmludGsoS0VSTl9JTkZPICJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKLQkJZG9fZXhpdChTSUdLSUxMKTsKIAl9IGVsc2UgewogCQlCVUdfT04oZXJyICE9IC1FRkFVTFQpOwogCQlzaS5zaV9zaWdubyA9IFNJR1NFR1Y7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNGE4ZTgwYy4uYTlmOGE4MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMjIsMyArMjIsNCBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gdm04Ni5oCiB1bmlmZGVmLXkgKz0gdnN5c2NhbGwuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAppbmRleCBhZDViOWY2Li44NWI0NmZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9YODZfQVRPTUlDXzMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KIApAQCAtMTAsMTUgKzExLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKaW5kZXggMjc5ZDJhNy4uOGMyMTczMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKQEAgLTEsMjUgKzEsMTUgQEAKICNpZm5kZWYgX0FTTV9YODZfQVRPTUlDXzY0X0gKICNkZWZpbmUgX0FTTV9YODZfQVRPTUlDXzY0X0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CiAjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KIAotLyogYXRvbWljX3Qgc2hvdWxkIGJlIDMyIGJpdCBzaWduZWQgdHlwZSAqLwotCiAvKgogICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAvKioKQEAgLTE5MSwxMSArMTgxLDcgQEAKICNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgIChhdG9taWNfYWRkX3JldHVybigxLCB2KSkKICNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgIChhdG9taWNfc3ViX3JldHVybigxLCB2KSkKIAotLyogQW4gNjRiaXQgYXRvbWljIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgY291bnRlcjsKLX0gYXRvbWljNjRfdDsKKy8qIFRoZSA2NC1iaXQgYXRvbWljIHR5cGUgKi8KIAogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCBmMTEwYWQ0Li43YzQ5OTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw2NSArMSw3IEBACiAjaWZuZGVmIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0jZGVmaW5lIF9fTElUVExFX0VORElBTgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCi17Ci0jaWZkZWYgX19pMzg2X18KLSMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAotCWFzbSgiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7Ci0jIGVsc2UKLQlhc20oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCi0JICAgICJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCi0JICAgICJ4Y2hnYiAlYjAsJWgwIgkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLwotCSAgICA6ICI9cSIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotIyBlbmRpZgotCi0jZWxzZSAvKiBfX2kzODZfXyAqLwotCWFzbSgiYnN3YXBsICUwIgotCSAgICA6ICI9ciIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotI2VuZGlmCi0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKLXsKLSNpZmRlZiBfX2kzODZfXwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fdTMyIGE7Ci0JCQlfX3UzMiBiOwotCQl9IHM7Ci0JCV9fdTY0IHU7Ci0JfSB2OwotCXYudSA9IHZhbDsKLSMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAotCWFzbSgiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCi0JICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKLQkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOwotIyBlbHNlCi0Jdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKLQl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOwotCWFzbSgieGNoZ2wgJTAsJTEiCi0JICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKLQkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOwotIyBlbmRpZgotCXJldHVybiB2LnU7Ci0jZWxzZSAvKiBfX2kzODZfXyAqLwotCWFzbSgiYnN3YXBxICUwIgotCSAgICA6ICI9ciIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotCXJldHVybiB2YWw7Ci0jZW5kaWYKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0Ci0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmQ0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TV0FCX0gKKyNkZWZpbmUgX0FTTV9YODZfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCWFzbSgiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7CisjIGVsc2UKKwlhc20oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCisJICAgICJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCisJICAgICJ4Y2hnYiAlYjAsJWgwIgkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCSAgICA6ICI9cSIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworIyBlbmRpZgorCisjZWxzZSAvKiBfX2kzODZfXyAqLworCWFzbSgiYnN3YXBsICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKyNpZmRlZiBfX2kzODZfXworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGE7CisJCQlfX3UzMiBiOworCQl9IHM7CisJCV9fdTY0IHU7CisJfSB2OworCXYudSA9IHZhbDsKKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCWFzbSgiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbHNlCisJdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCWFzbSgieGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbmRpZgorCXJldHVybiB2LnU7CisjZWxzZSAvKiBfX2kzODZfXyAqLworCWFzbSgiYnN3YXBxICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworCXJldHVybiB2YWw7CisjZW5kaWYKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aW90bGIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aW90bGIuaAppbmRleCA1MWZiMmM3Li5iOWU0ZTIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dpb3RsYi5oCkBAIC0xLDQ2ICsxLDEwIEBACiAjaWZuZGVmIF9BU01fWDg2X1NXSU9UTEJfSAogI2RlZmluZSBfQVNNX1g4Nl9TV0lPVExCX0gKIAotI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KIAogLyogU1dJT1RMQiBpbnRlcmZhY2UgKi8KIAotZXh0ZXJuIGRtYV9hZGRyX3Qgc3dpb3RsYl9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCAqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCWRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJICAgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkgICAgICBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkJIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgICAgIGludCBkaXIpOwotZXh0ZXJuIGludCBzd2lvdGxiX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gaW50IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwotZXh0ZXJuIGludCBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfaW5pdCh2b2lkKTsKLQogZXh0ZXJuIGludCBzd2lvdGxiX2ZvcmNlOwogCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDY0YmQuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1VOV0lORF9ICi0jZGVmaW5lIF9BU01fWDg2X1VOV0lORF9ICi0KLSNkZWZpbmUgVU5XX1BDKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMFVMKQotI2RlZmluZSBVTldfU1AoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwVUwpCi0jZGVmaW5lIFVOV19GUChmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKLQotc3RhdGljIGlubGluZSBpbnQgYXJjaF91bndfdXNlcl9tb2RlKGNvbnN0IHZvaWQgKmluZm8pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggNmMyNzY3OS4uZWVhZDZmOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNzYsOSArMzc2LDEwIEBACiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgKHAtPmFpbnNuLmJvb3N0YWJsZSA9PSAxKSk7Ci0JbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCWlmIChwLT5haW5zbi5pbnNuKSB7CisJCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIChwLT5haW5zbi5ib29zdGFibGUgPT0gMSkpOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzYXZlX3ByZXZpb3VzX2twcm9iZShzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1zd2lvdGxiXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYwppbmRleCA4Y2JhMzc0Li5kNTljOTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYwpAQCAtMjMsNyArMjMsNyBAQAogCXJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0RNQSB8IF9fR0ZQX05PV0FSTiwgb3JkZXIpOwogfQogCi1kbWFfYWRkcl90IHN3aW90bGJfcGh5c190b19idXMocGh5c19hZGRyX3QgcGFkZHIpCitkbWFfYWRkcl90IHN3aW90bGJfcGh5c190b19idXMoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQogewogCXJldHVybiBwYWRkcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggY2U2NjUwZS4uYzlhNjY2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KQEAgLTUxLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9mYXVsdC5jIGIvYXJjaC94ODYvbW0vZmF1bHQuYwppbmRleCA1N2VjOGM4Li45ZTI2OGI2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC02NjcsNyArNjY3LDYgQEAKIAlpZiAodW5saWtlbHkoaW5fYXRvbWljKCkgfHwgIW1tKSkKIAkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKIAotYWdhaW46CiAJLyoKIAkgKiBXaGVuIHJ1bm5pbmcgaW4gdGhlIGtlcm5lbCB3ZSBleHBlY3QgZmF1bHRzIHRvIG9jY3VyIG9ubHkgdG8KIAkgKiBhZGRyZXNzZXMgaW4gdXNlciBzcGFjZS4gIEFsbCBvdGhlciBmYXVsdHMgcmVwcmVzZW50IGVycm9ycyBpbiB0aGUKQEAgLTg1OSwyNSArODU4LDE0IEBACiAJb29wc19lbmQoZmxhZ3MsIHJlZ3MsIHNpZyk7CiAjZW5kaWYKIAotLyoKLSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQotICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgotICovCiBvdXRfb2ZfbWVtb3J5OgorCS8qCisJICogV2UgcmFuIG91dCBvZiBtZW1vcnksIGNhbGwgdGhlIE9PTSBraWxsZXIsIGFuZCByZXR1cm4gdGhlIHVzZXJzcGFjZQorCSAqICh3aGljaCB3aWxsIHJldHJ5IHRoZSBmYXVsdCwgb3Iga2lsbCB1cyBpZiB3ZSBnb3Qgb29tLWtpbGxlZCkuCisJICovCiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlpZiAoaXNfZ2xvYmFsX2luaXQodHNrKSkgewotCQl5aWVsZCgpOwotCQkvKgotCQkgKiBSZS1sb29rdXAgdGhlIHZtYSAtIGluIHRoZW9yeSB0aGUgdm1hIHRyZWUgbWlnaHQKLQkJICogaGF2ZSBjaGFuZ2VkOgotCQkgKi8KLQkJZ290byBhZ2FpbjsKLQl9Ci0KLQlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7Ci0JaWYgKGVycm9yX2NvZGUgJiBQRl9VU0VSKQotCQlkb19ncm91cF9leGl0KFNJR0tJTEwpOwotCWdvdG8gbm9fY29udGV4dDsKKwlwYWdlZmF1bHRfb3V0X29mX21lbW9yeSgpOworCXJldHVybjsKIAogZG9fc2lnYnVzOgogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKaW5kZXggZjk5YTZjNi4uNTQ0ZDcyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKIAotCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXR1cm4gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggOWY3YTBkMi4uNTRjNDM3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtODU3LDcgKzg1Nyw3IEBACiAJaWYgKGxhc3RfbWFwcGVkX3BmbiA+IG1heF9wZm5fbWFwcGVkKQogCQltYXhfcGZuX21hcHBlZCA9IGxhc3RfbWFwcGVkX3BmbjsKIAotCXJldCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCXJldCA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CiAJV0FSTl9PTl9PTkNFKHJldCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwppbmRleCBlNzNlNTBkLi5kNDE0YmI1IDEwMDY0NAotLS0gYS9ibG9jay9ic2cuYworKysgYi9ibG9jay9ic2cuYwpAQCAtNDIsNyArNDIsNyBAQAogCWludCBkb25lX2NtZHM7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZG9uZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9mcmVlOwotCWNoYXIgbmFtZVtCVVNfSURfU0laRV07CisJY2hhciBuYW1lWzIwXTsKIAlpbnQgbWF4X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKIAlobGlzdF9hZGRfaGVhZCgmYmQtPmRldl9saXN0LCBic2dfZGV2X2lkeF9oYXNoKGltaW5vcihpbm9kZSkpKTsKIAotCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+YnVzX2lkLCBzaXplb2YoYmQtPm5hbWUpIC0gMSk7CisJc3RybmNweShiZC0+bmFtZSwgZGV2X25hbWUocnEtPmJzZ19kZXYuY2xhc3NfZGV2KSwgc2l6ZW9mKGJkLT5uYW1lKSAtIDEpOwogCWRwcmludGsoImJvdW5kIHRvIDwlcz4sIG1heCBxdWV1ZSAlZFxuIiwKIAkJZm9ybWF0X2Rldl90KGJ1ZiwgaW5vZGUtPmlfcmRldiksIGJkLT5tYXhfcXVldWUpOwogCkBAIC05OTIsNyArOTkyLDcgQEAKIAlpZiAobmFtZSkKIAkJZGV2bmFtZSA9IG5hbWU7CiAJZWxzZQotCQlkZXZuYW1lID0gcGFyZW50LT5idXNfaWQ7CisJCWRldm5hbWUgPSBkZXZfbmFtZShwYXJlbnQpOwogCiAJLyoKIAkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZDg0YTdkZi4uMzk3OTYwYyAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CiAJCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CiAKLQkJaWYgKHN0cmNtcChkZXYtPmJ1c19pZCwgbmFtZSkpCisJCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkpCiAJCQljb250aW51ZTsKIAogCQlwYXJ0ID0gZGlza19nZXRfcGFydChkaXNrLCBwYXJ0bm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCAzOGFjYTA0Li42NmE5ZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAKIC8qCiAgKiBJbmNsdWRlIHRoZSBhcGljIGRlZmluaXRpb25zIGZvciB4ODYgdG8gaGF2ZSB0aGUgQVBJQyB0aW1lciByZWxhdGVkIGRlZmluZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDQwNDBkOGIuLjllOTIxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMzM2OSw3ICszMzY5LDcgQEAKIAogCWlmIChzZGV2KSB7CiAJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiZGV0YWNoaW5nIChTQ1NJICVzKVxuIiwKLQkJCSAgICAgICBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpOworCQkJICAgICAgIGRldl9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldikpOwogCiAJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKIAkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggZjU3NjUyZC4uYjljZGEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJaWMtPmNsYXNzZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoZGV2KTsKIAkJaWMtPmNsYXNzZGV2LmNsYXNzID0gY29udC0+Y2xhc3M7CiAJCWNvbnQtPmNsYXNzLT5kZXZfcmVsZWFzZSA9IGF0dHJpYnV0ZV9jb250YWluZXJfcmVsZWFzZTsKLQkJc3RyY3B5KGljLT5jbGFzc2Rldi5idXNfaWQsIGRldi0+YnVzX2lkKTsKKwkJZGV2X3NldF9uYW1lKCZpYy0+Y2xhc3NkZXYsIGRldl9uYW1lKGRldikpOwogCQlpZiAoZm4pCiAJCQlmbihjb250LCBkZXYsICZpYy0+Y2xhc3NkZXYpOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCAwYTVmMDU1Li5iNjc2ZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTYzLDYgKzYzLDMyIEBACiAjZGVmaW5lIHRvX2NsYXNzKG9iaikJXAogCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjbGFzc19wcml2YXRlLCBjbGFzc19zdWJzeXMua29iaikKIAorLyoqCisgKiBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKgorICogQGtsaXN0X2NoaWxkcmVuIC0ga2xpc3QgY29udGFpbmluZyBhbGwgY2hpbGRyZW4gb2YgdGhpcyBkZXZpY2UKKyAqIEBrbm9kZV9wYXJlbnQgLSBub2RlIGluIHNpYmxpbmcgbGlzdAorICogQGtub2RlX2RyaXZlciAtIG5vZGUgaW4gZHJpdmVyIGxpc3QKKyAqIEBrbm9kZV9idXMgLSBub2RlIGluIGJ1cyBsaXN0CisgKiBAZGV2aWNlIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcworICogYXNzb2NpYXRlZCB3aXRoLgorICoKKyAqIE5vdGhpbmcgb3V0c2lkZSBvZiB0aGUgZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgorICovCitzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgeworCXN0cnVjdCBrbGlzdCBrbGlzdF9jaGlsZHJlbjsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9wYXJlbnQ7CisJc3RydWN0IGtsaXN0X25vZGUga25vZGVfZHJpdmVyOworCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2J1czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Cit9OworI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKQlcCisJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpCisjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX2RyaXZlcihvYmopCVwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX2RyaXZlcikKKyNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG9iaikJXAorCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwga25vZGVfYnVzKQorCiAvKiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZGV2aWNlc19pbml0KHZvaWQpOwogZXh0ZXJuIGludCBidXNlc19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDVhZWUxYzAuLjBmMGE1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTI1Myw3ICsyNTMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CisKKwlpZiAobikgeworCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG4pOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMjg2LDcgKzI5Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJa2xpc3RfaXRlcl9pbml0X25vZGUoJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcywgJmksCi0JCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfYnVzIDogTlVMTCkpOworCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2J1cyA6IE5VTEwpKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTMyMCw3ICszMjcsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9idXMgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goZGV2LCBkYXRhKSAmJiBnZXRfZGV2aWNlKGRldikpCiAJCQlicmVhazsKQEAgLTMzMyw3ICszNDAsNyBAQAogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOwogCi0JcmV0dXJuIHN5c2ZzX3N0cmVxKG5hbWUsIGRldi0+YnVzX2lkKTsKKwlyZXR1cm4gc3lzZnNfc3RyZXEobmFtZSwgZGV2X25hbWUoZGV2KSk7CiB9CiAKIC8qKgpAQCAtNDYxLDEyICs0NjgsMTIgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGJ1cykgewotCQlwcl9kZWJ1ZygiYnVzOiAnJXMnOiBhZGQgZGV2aWNlICVzXG4iLCBidXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKKwkJcHJfZGVidWcoImJ1czogJyVzJzogYWRkIGRldmljZSAlc1xuIiwgYnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGJ1cywgZGV2KTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfcHV0OwogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwKLQkJCQkJCSZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkJCSZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9pZDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLApAQCAtNDgyLDcgKzQ4OSw3IEBACiBvdXRfZGVwcmVjYXRlZDoKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7CiBvdXRfc3Vic3lzOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZidXMtPnAtPmRldmljZXNfa3NldC0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiBvdXRfaWQ6CiAJZGV2aWNlX3JlbW92ZV9hdHRycyhidXMsIGRldik7CiBvdXRfcHV0OgpAQCAtNTA3LDcgKzUxNCw4IEBACiAJCQlyZXQgPSBkZXZpY2VfYXR0YWNoKGRldik7CiAJCVdBUk5fT04ocmV0IDwgMCk7CiAJCWlmIChyZXQgPj0gMCkKLQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcyk7CisJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9idXMsCisJCQkJICAgICAgICZidXMtPnAtPmtsaXN0X2RldmljZXMpOwogCX0KIH0KIApAQCAtNTI2LDEzICs1MzQsMTMgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwogCQlyZW1vdmVfZGVwcmVjYXRlZF9idXNfbGlua3MoZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKLQkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfYnVzKSkKLQkJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9idXMpOworCQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5wLT5rbm9kZV9idXMpKQorCQkJa2xpc3RfZGVsKCZkZXYtPnAtPmtub2RlX2J1cyk7CiAKIAkJcHJfZGVidWcoImJ1czogJyVzJzogcmVtb3ZlIGRldmljZSAlc1xuIiwKLQkJCSBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOworCQkJIGRldi0+YnVzLT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCWJ1c19wdXQoZGV2LT5idXMpOwogCX0KQEAgLTgzMSwxNCArODM5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlnZXRfZGV2aWNlKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC05OTMsMTggKzEwMDMsMjAgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZV9wcml2YXRlICpkZXZfcHJ2OwogCXN0cnVjdCBkZXZpY2UgKmI7CiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgbGlzdCkgewogCQluID0gY29udGFpbmVyX29mKHBvcywgc3RydWN0IGtsaXN0X25vZGUsIG5fbm9kZSk7Ci0JCWIgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJYiA9IGRldl9wcnYtPmRldmljZTsKIAkJaWYgKGNvbXBhcmUoYSwgYikgPD0gMCkgewotCQkJbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsCi0JCQkJICAgICAgICZiLT5rbm9kZV9idXMubl9ub2RlKTsKKwkJCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLAorCQkJCSAgICAgICAmYi0+cC0+a25vZGVfYnVzLm5fbm9kZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JbGlzdF9tb3ZlX3RhaWwoJmEtPmtub2RlX2J1cy5uX25vZGUsIGxpc3QpOworCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKIH0KIAogdm9pZCBidXNfc29ydF9icmVhZHRoZmlyc3Qoc3RydWN0IGJ1c190eXBlICpidXMsCkBAIC0xMDE0LDYgKzEwMjYsNyBAQAogCUxJU1RfSEVBRChzb3J0ZWRfZGV2aWNlcyk7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOwogCXN0cnVjdCBrbGlzdF9ub2RlICpuOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGtsaXN0ICpkZXZpY2Vfa2xpc3Q7CiAKQEAgLTEwMjIsNyArMTAzNSw4IEBACiAJc3Bpbl9sb2NrKCZkZXZpY2Vfa2xpc3QtPmtfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpIHsKIAkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwogCQlkZXZpY2VfaW5zZXJ0aW9uX3NvcnRfa2xpc3QoZGV2LCAmc29ydGVkX2RldmljZXMsIGNvbXBhcmUpOwogCX0KIAlsaXN0X3NwbGljZSgmc29ydGVkX2RldmljZXMsICZkZXZpY2Vfa2xpc3QtPmtfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA4YzJjYzI2Li42MWRmNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTEwOSw2ICsxMDksNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmopOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcCA9IGRldi0+cDsKIAogCWlmIChkZXYtPnJlbGVhc2UpCiAJCWRldi0+cmVsZWFzZShkZXYpOwpAQCAtMTE5LDcgKzEyMCw4IEBACiAJZWxzZQogCQlXQVJOKDEsIEtFUk5fRVJSICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpICIKIAkJCSJmdW5jdGlvbiwgaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkLlxuIiwKLQkJCWRldi0+YnVzX2lkKTsKKwkJCWRldl9uYW1lKGRldikpOworCWtmcmVlKHApOwogfQogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkZXZpY2Vfa3R5cGUgPSB7CkBAIC0yMDksNyArMjExLDcgQEAKIAkJcmV0dmFsID0gZGV2LT5idXMtPnVldmVudChkZXYsIGVudik7CiAJCWlmIChyZXR2YWwpCiAJCQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogYnVzIHVldmVudCgpIHJldHVybmVkICVkXG4iLAotCQkJCSBkZXYtPmJ1c19pZCwgX19mdW5jX18sIHJldHZhbCk7CisJCQkJIGRldl9uYW1lKGRldiksIF9fZnVuY19fLCByZXR2YWwpOwogCX0KIAogCS8qIGhhdmUgdGhlIGNsYXNzIHNwZWNpZmljIGZ1bmN0aW9uIGFkZCBpdHMgc3R1ZmYgKi8KQEAgLTIxNyw3ICsyMTksNyBAQAogCQlyZXR2YWwgPSBkZXYtPmNsYXNzLT5kZXZfdWV2ZW50KGRldiwgZW52KTsKIAkJaWYgKHJldHZhbCkKIAkJCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBjbGFzcyB1ZXZlbnQoKSAiCi0JCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2LT5idXNfaWQsCisJCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCQkgX19mdW5jX18sIHJldHZhbCk7CiAJfQogCkBAIC0yMjYsNyArMjI4LDcgQEAKIAkJcmV0dmFsID0gZGV2LT50eXBlLT51ZXZlbnQoZGV2LCBlbnYpOwogCQlpZiAocmV0dmFsKQogCQkJcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IGRldl90eXBlIHVldmVudCgpICIKLQkJCQkgInJldHVybmVkICVkXG4iLCBkZXYtPmJ1c19pZCwKKwkJCQkgInJldHVybmVkICVkXG4iLCBkZXZfbmFtZShkZXYpLAogCQkJCSBfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiAKQEAgLTUwNywxNCArNTA5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnAgPSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQobik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcC0+ZGV2aWNlOwogCiAJZ2V0X2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9wdXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHAtPmRldmljZTsKIAogCXB1dF9kZXZpY2UoZGV2KTsKIH0KQEAgLTUzNiw5ICs1NDAsMTUgQEAKICAqLwogdm9pZCBkZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJZGV2LT5wID0ga3phbGxvYyhzaXplb2YoKmRldi0+cCksIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJZGV2LT5wLT5kZXZpY2UgPSBkZXY7CiAJZGV2LT5rb2JqLmtzZXQgPSBkZXZpY2VzX2tzZXQ7CiAJa29iamVjdF9pbml0KCZkZXYtPmtvYmosICZkZXZpY2Vfa3R5cGUpOwotCWtsaXN0X2luaXQoJmRldi0+a2xpc3RfY2hpbGRyZW4sIGtsaXN0X2NoaWxkcmVuX2dldCwKKwlrbGlzdF9pbml0KCZkZXYtPnAtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCiAJCSAgIGtsaXN0X2NoaWxkcmVuX3B1dCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hX3Bvb2xzKTsKIAlpbml0X01VVEVYKCZkZXYtPnNlbSk7CkBAIC02NzIsNyArNjgyLDcgQEAKIAlpZiAoZGV2LT5rb2JqLnBhcmVudCAhPSAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmogJiYKIAkgICAgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkJICAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCQkJCSAgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3N1YnN5czsKIAl9CkBAIC03MTIsMTEgKzcyMiwxMSBAQAogCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiAmJgogCSAgICBkZXZpY2VfaXNfbm90X3BhcnRpdGlvbihkZXYpKQogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKICNlbHNlCiAJLyogbGluayBpbiB0aGUgY2xhc3MgZGlyZWN0b3J5IHBvaW50aW5nIHRvIHRoZSBkZXZpY2UgKi8KIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkgICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfc3Vic3lzOwogCkBAIC03MjksNyArNzM5LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2J1c2lkOgotCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2X25hbWUoZGV2KSk7CiAjZW5kaWYKIAogb3V0X3N1YnN5czoKQEAgLTc1OCwxMiArNzY4LDEyIEBACiAJaWYgKGRldi0+a29iai5wYXJlbnQgIT0gJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqICYmCiAJICAgIGRldmljZV9pc19ub3RfcGFydGl0aW9uKGRldikpCiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKLQkJCQkgIGRldi0+YnVzX2lkKTsKKwkJCQkgIGRldl9uYW1lKGRldikpOwogI2Vsc2UKIAlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOwogCi0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXYtPmJ1c19pZCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCBkZXZfbmFtZShkZXYpKTsKICNlbmRpZgogCiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwpAQCAtODY2LDcgKzg3Niw3IEBACiAJaWYgKCFzdHJsZW4oZGV2LT5idXNfaWQpKQogCQlnb3RvIGRvbmU7CiAKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCiAJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CiAJc2V0dXBfcGFyZW50KGRldiwgcGFyZW50KTsKQEAgLTg3Niw3ICs4ODYsNyBAQAogCQlzZXRfZGV2X25vZGUoZGV2LCBkZXZfdG9fbm9kZShwYXJlbnQpKTsKIAogCS8qIGZpcnN0LCByZWdpc3RlciB3aXRoIGdlbmVyaWMgbGF5ZXIuICovCi0JZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXYtPmJ1c19pZCk7CisJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCAiJXMiLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRXJyb3I7CiAKQEAgLTg4NCwxMSArODk0LDYgQEAKIAlpZiAocGxhdGZvcm1fbm90aWZ5KQogCQlwbGF0Zm9ybV9ub3RpZnkoZGV2KTsKIAotCS8qIG5vdGlmeSBjbGllbnRzIG9mIGRldmljZSBlbnRyeSAobmV3IHdheSkgKi8KLQlpZiAoZGV2LT5idXMpCi0JCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCi0JCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOwotCiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdWV2ZW50X2F0dHIpOwogCWlmIChlcnJvcikKIAkJZ290byBhdHRyRXJyb3I7CkBAIC05MTYsMTAgKzkyMSwxOSBAQAogCWlmIChlcnJvcikKIAkJZ290byBEUE1FcnJvcjsKIAlkZXZpY2VfcG1fYWRkKGRldik7CisKKwkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgYWRkaXRpb24uICBUaGlzIGNhbGwgbXVzdCBjb21lCisJICogYWZ0ZXIgZHBtX3N5c2ZfYWRkKCkgYW5kIGJlZm9yZSBrb2JqZWN0X3VldmVudCgpLgorCSAqLworCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0FERF9ERVZJQ0UsIGRldik7CisKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAJYnVzX2F0dGFjaF9kZXZpY2UoZGV2KTsKIAlpZiAocGFyZW50KQotCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAorCQkJICAgICAgICZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCW11dGV4X2xvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX211dGV4KTsKQEAgLTk0MCw5ICs5NTQsNiBAQAogIERQTUVycm9yOgogCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAgQnVzRXJyb3I6Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CiAgQXR0cnNFcnJvcjoKIAlkZXZpY2VfcmVtb3ZlX2NsYXNzX3N5bWxpbmtzKGRldik7CkBAIC0xMDI3LDEwICsxMDM4LDE2IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKIAorCS8qIE5vdGlmeSBjbGllbnRzIG9mIGRldmljZSByZW1vdmFsLiAgVGhpcyBjYWxsIG11c3QgY29tZQorCSAqIGJlZm9yZSBkcG1fc3lzZnNfcmVtb3ZlKCkuCisJICovCisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJZHBtX3N5c2ZzX3JlbW92ZShkZXYpOwogCWlmIChwYXJlbnQpCi0JCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQlrbGlzdF9kZWwoJmRldi0+cC0+a25vZGVfcGFyZW50KTsKIAlpZiAoTUFKT1IoZGV2LT5kZXZ0KSkgewogCQlkZXZpY2VfcmVtb3ZlX3N5c19kZXZfZW50cnkoZGV2KTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldnRfYXR0cik7CkBAIC0xMDY0LDkgKzEwODEsNiBAQAogCSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKQogCQlwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKGRldik7Ci0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX1JFTU9WRSk7CiAJY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CiAJa29iamVjdF9kZWwoJmRldi0+a29iaik7CkBAIC0xMDg2LDcgKzExMDAsNyBAQAogICovCiB2b2lkIGRldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWRldmljZV9kZWwoZGV2KTsKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC0xMDk0LDcgKzExMDgsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnA7CisKKwlpZiAobikgeworCQlwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCQlkZXYgPSBwLT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtMTExNiw3ICsxMTM3LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpjaGlsZDsKIAlpbnQgZXJyb3IgPSAwOwogCi0Ja2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CisJa2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CiAJd2hpbGUgKChjaGlsZCA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGNoaWxkLCBkYXRhKTsKIAlrbGlzdF9pdGVyX2V4aXQoJmkpOwpAQCAtMTE0Nyw3ICsxMTY4LDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKKwlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKIAl3aGlsZSAoKGNoaWxkID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGNoaWxkLCBkYXRhKSAmJiBnZXRfZGV2aWNlKGNoaWxkKSkKIAkJCWJyZWFrOwpAQCAtMTE5NiwxMCArMTIxNywxMDEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9jcmVhdGVfZmlsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVtb3ZlX2ZpbGUpOwogCitzdHJ1Y3Qgcm9vdF9kZXZpY2UKK3sKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKKyNkZWZpbmUgdG9fcm9vdF9kZXZpY2UoZGV2KSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgcm9vdF9kZXZpY2UsIGRldikKKworc3RhdGljIHZvaWQgcm9vdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUodG9fcm9vdF9kZXZpY2UoZGV2KSk7Cit9CisKKy8qKgorICogX19yb290X2RldmljZV9yZWdpc3RlciAtIGFsbG9jYXRlIGFuZCByZWdpc3RlciBhIHJvb3QgZGV2aWNlCisgKiBAbmFtZTogcm9vdCBkZXZpY2UgbmFtZQorICogQG93bmVyOiBvd25lciBtb2R1bGUgb2YgdGhlIHJvb3QgZGV2aWNlLCB1c3VhbGx5IFRISVNfTU9EVUxFCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSByb290IGRldmljZSBhbmQgcmVnaXN0ZXJzIGl0CisgKiB1c2luZyBkZXZpY2VfcmVnaXN0ZXIoKS4gSW4gb3JkZXIgdG8gZnJlZSB0aGUgcmV0dXJuZWQKKyAqIGRldmljZSwgdXNlIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoKS4KKyAqCisgKiBSb290IGRldmljZXMgYXJlIGR1bW15IGRldmljZXMgd2hpY2ggYWxsb3cgb3RoZXIgZGV2aWNlcworICogdG8gYmUgZ3JvdXBlZCB1bmRlciAvc3lzL2RldmljZXMuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgKiBhbGxvY2F0ZSBhIHJvb3QgZGV2aWNlIGFuZCB0aGVuIHVzZSBpdCBhcyB0aGUgcGFyZW50IG9mCisgKiBhbnkgZGV2aWNlIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5kZXIgL3N5cy9kZXZpY2VzL3tuYW1lfQorICoKKyAqIFRoZSAvc3lzL2RldmljZXMve25hbWV9IGRpcmVjdG9yeSB3aWxsIGFsc28gY29udGFpbiBhCisgKiAnbW9kdWxlJyBzeW1saW5rIHdoaWNoIHBvaW50cyB0byB0aGUgQG93bmVyIGRpcmVjdG9yeQorICogaW4gc3lzZnMuCisgKgorICogTm90ZTogWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3N0cnVjdCBkZXZpY2UgKl9fcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290OworCWludCBlcnIgPSAtRU5PTUVNOworCisJcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByb290X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCWVyciA9IGRldl9zZXRfbmFtZSgmcm9vdC0+ZGV2LCBuYW1lKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJvb3QtPmRldi5yZWxlYXNlID0gcm9vdF9kZXZpY2VfcmVsZWFzZTsKKworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmcm9vdC0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCXB1dF9kZXZpY2UoJnJvb3QtPmRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisjaWZkZWYgQ09ORklHX01PRFVMRQkvKiBnb3R0YSBmaW5kIGEgImNsZWFuZXIiIHdheSB0byBkbyB0aGlzICovCisJaWYgKG93bmVyKSB7CisJCXN0cnVjdCBtb2R1bGVfa29iamVjdCAqbWsgPSAmb3duZXItPm1rb2JqOworCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZyb290LT5kZXYua29iaiwgJm1rLT5rb2JqLCAibW9kdWxlIik7CisJCWlmIChlcnIpIHsKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZyb290LT5kZXYpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlyb290LT5vd25lciA9IG93bmVyOworCX0KKyNlbmRpZgorCisJcmV0dXJuICZyb290LT5kZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiByb290X2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhbmQgZnJlZSBhIHJvb3QgZGV2aWNlCisgKiBAcm9vdDogZGV2aWNlIGdvaW5nIGF3YXkuCisgKgorICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyBhbmQgY2xlYW5zIHVwIGEgZGV2aWNlIHRoYXQgd2FzIGNyZWF0ZWQgYnkKKyAqIHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCkuCisgKi8KK3ZvaWQgcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvb3RfZGV2aWNlICpyb290ID0gdG9fcm9vdF9kZXZpY2UoZGV2KTsKKworCWlmIChyb290LT5vd25lcikKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJvb3QtPmRldi5rb2JqLCAibW9kdWxlIik7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocm9vdF9kZXZpY2VfdW5yZWdpc3Rlcik7CisKIAogc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2LT5idXNfaWQsIF9fZnVuY19fKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTEzNDQsNyArMTQ1Niw3IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IHJlbmFtaW5nIHRvICclcydcbiIsIGRldi0+YnVzX2lkLAorCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiByZW5hbWluZyB0byAnJXMnXG4iLCBkZXZfbmFtZShkZXYpLAogCQkgX19mdW5jX18sIG5ld19uYW1lKTsKIAogI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECkBAIC0xMzgxLDcgKzE0OTMsNyBAQAogI2Vsc2UKIAlpZiAoZGV2LT5jbGFzcykgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rX25vd2FybigmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJCQkgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworCQkJCQkJICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLApAQCAtMTQ1OSw4ICsxNTcxLDggQEAKIAluZXdfcGFyZW50ID0gZ2V0X2RldmljZShuZXdfcGFyZW50KTsKIAluZXdfcGFyZW50X2tvYmogPSBnZXRfZGV2aWNlX3BhcmVudChkZXYsIG5ld19wYXJlbnQpOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IG1vdmluZyB0byAnJXMnXG4iLCBkZXYtPmJ1c19pZCwKLQkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gbmV3X3BhcmVudC0+YnVzX2lkIDogIjxOVUxMPiIpOworCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBtb3ZpbmcgdG8gJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKKwkJIF9fZnVuY19fLCBuZXdfcGFyZW50ID8gZGV2X25hbWUobmV3X3BhcmVudCkgOiAiPE5VTEw+Iik7CiAJZXJyb3IgPSBrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgbmV3X3BhcmVudF9rb2JqKTsKIAlpZiAoZXJyb3IpIHsKIAkJY2xlYW51cF9nbHVlX2RpcihkZXYsIG5ld19wYXJlbnRfa29iaik7CkBAIC0xNDcwLDkgKzE1ODIsMTAgQEAKIAlvbGRfcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJZGV2LT5wYXJlbnQgPSBuZXdfcGFyZW50OwogCWlmIChvbGRfcGFyZW50KQotCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJa2xpc3RfcmVtb3ZlKCZkZXYtPnAtPmtub2RlX3BhcmVudCk7CiAJaWYgKG5ld19wYXJlbnQpIHsKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmbmV3X3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9wYXJlbnQsCisJCQkgICAgICAgJm5ld19wYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKIAkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUobmV3X3BhcmVudCkpOwogCX0KIApAQCAtMTQ4NCwxMSArMTU5NywxMSBAQAogCQlkZXZpY2VfbW92ZV9jbGFzc19saW5rcyhkZXYsIG5ld19wYXJlbnQsIG9sZF9wYXJlbnQpOwogCQlpZiAoIWtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCAmb2xkX3BhcmVudC0+a29iaikpIHsKIAkJCWlmIChuZXdfcGFyZW50KQotCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOworCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9wYXJlbnQpOwogCQkJZGV2LT5wYXJlbnQgPSBvbGRfcGFyZW50OwogCQkJaWYgKG9sZF9wYXJlbnQpIHsKLQkJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsCi0JCQkJCSAgICAgICAmb2xkX3BhcmVudC0+a2xpc3RfY2hpbGRyZW4pOworCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPnAtPmtub2RlX3BhcmVudCwKKwkJCQkJICAgICAgICZvbGRfcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CiAJCQkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUob2xkX3BhcmVudCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDIwZmViYzAwLi42ZmRhZjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtMjgsMjAgKzI4LDIwIEBACiAKIHN0YXRpYyB2b2lkIGRyaXZlcl9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfZHJpdmVyKSkgeworCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPnAtPmtub2RlX2RyaXZlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSAlcyBhbHJlYWR5IGJvdW5kXG4iLAogCQkJX19mdW5jX18sIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiAJCXJldHVybjsKIAl9CiAKLQlwcl9kZWJ1ZygiZHJpdmVyOiAnJXMnOiAlczogYm91bmQgdG8gZGV2aWNlICclcydcbiIsIGRldi0+YnVzX2lkLAorCXByX2RlYnVnKCJkcml2ZXI6ICclcyc6ICVzOiBib3VuZCB0byBkZXZpY2UgJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKIAkJIF9fZnVuY19fLCBkZXYtPmRyaXZlci0+bmFtZSk7CiAKIAlpZiAoZGV2LT5idXMpCiAJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCiAJCQkJCSAgICAgQlVTX05PVElGWV9CT1VORF9EUklWRVIsIGRldik7CiAKLQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+cC0+a2xpc3RfZGV2aWNlcyk7CisJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfZHJpdmVyLCAmZGV2LT5kcml2ZXItPnAtPmtsaXN0X2RldmljZXMpOwogfQogCiBzdGF0aWMgaW50IGRyaXZlcl9zeXNmc19hZGQoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTA0LDEzICsxMDQsMTMgQEAKIAogCWF0b21pY19pbmMoJnByb2JlX2NvdW50KTsKIAlwcl9kZWJ1ZygiYnVzOiAnJXMnOiAlczogcHJvYmluZyBkcml2ZXIgJXMgd2l0aCBkZXZpY2UgJXNcbiIsCi0JCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRydi0+bmFtZSwgZGV2LT5idXNfaWQpOworCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkcnYtPm5hbWUsIGRldl9uYW1lKGRldikpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmRldi0+ZGV2cmVzX2hlYWQpKTsKIAogCWRldi0+ZHJpdmVyID0gZHJ2OwogCWlmIChkcml2ZXJfc3lzZnNfYWRkKGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmVyX3N5c2ZzX2FkZCglcykgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGRldi0+YnVzX2lkKTsKKwkJCV9fZnVuY19fLCBkZXZfbmFtZShkZXYpKTsKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlkcml2ZXJfYm91bmQoZGV2KTsKIAlyZXQgPSAxOwogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBib3VuZCBkZXZpY2UgJXMgdG8gZHJpdmVyICVzXG4iLAotCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKwkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2X25hbWUoZGV2KSwgZHJ2LT5uYW1lKTsKIAlnb3RvIGRvbmU7CiAKIHByb2JlX2ZhaWxlZDoKQEAgLTEzOSw3ICsxMzksNyBAQAogCQkvKiBkcml2ZXIgbWF0Y2hlZCBidXQgdGhlIHByb2JlIGZhaWxlZCAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IHByb2JlIG9mICVzIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAotCQkgICAgICAgZHJ2LT5uYW1lLCBkZXYtPmJ1c19pZCwgcmV0KTsKKwkJICAgICAgIGRydi0+bmFtZSwgZGV2X25hbWUoZGV2KSwgcmV0KTsKIAl9CiAJLyoKIAkgKiBJZ25vcmUgZXJyb3JzIHJldHVybmVkIGJ5IC0+cHJvYmUgc28gdGhhdCB0aGUgbmV4dCBkcml2ZXIgY2FuIHRyeQpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCWdvdG8gZG9uZTsKIAogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBtYXRjaGVkIGRldmljZSAlcyB3aXRoIGRyaXZlciAlc1xuIiwKLQkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQsIGRydi0+bmFtZSk7CisJCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRldl9uYW1lKGRldiksIGRydi0+bmFtZSk7CiAKIAlyZXQgPSByZWFsbHlfcHJvYmUoZGV2LCBkcnYpOwogCkBAIC0yOTgsNyArMjk4LDYgQEAKIAlkcnYgPSBkZXYtPmRyaXZlcjsKIAlpZiAoZHJ2KSB7CiAJCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRyaXZlciIpOwogCiAJCWlmIChkZXYtPmJ1cykKIAkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCkBAIC0zMTEsNyArMzEwLDcgQEAKIAkJCWRydi0+cmVtb3ZlKGRldik7CiAJCWRldnJlc19yZWxlYXNlX2FsbChkZXYpOwogCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9kcml2ZXIpOworCQlrbGlzdF9yZW1vdmUoJmRldi0+cC0+a25vZGVfZHJpdmVyKTsKIAl9CiB9CiAKQEAgLTM0MSw2ICszNDAsNyBAQAogICovCiB2b2lkIGRyaXZlcl9kZXRhY2goc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJZm9yICg7OykgewpAQCAtMzQ5LDggKzM0OSwxMCBAQAogCQkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2ID0gbGlzdF9lbnRyeShkcnYtPnAtPmtsaXN0X2RldmljZXMua19saXN0LnByZXYsCi0JCQkJc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyLm5fbm9kZSk7CisJCWRldl9wcnYgPSBsaXN0X2VudHJ5KGRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xpc3QucHJldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwKKwkJCQkgICAgIGtub2RlX2RyaXZlci5uX25vZGUpOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggMWUyYmRhNy4uYjc2Y2M2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTksNyArMTksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CisKKwlpZiAobikgeworCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfZHJpdmVyKG4pOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtNDIsNyArNDksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZkcnYtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICBzdGFydCA/ICZzdGFydC0+a25vZGVfZHJpdmVyIDogTlVMTCk7CisJCQkgICAgIHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9kcml2ZXIgOiBOVUxMKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTc2LDcgKzgzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbGlzdF9pdGVyX2luaXRfbm9kZSgmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLCAmaSwKLQkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+cC0+a25vZGVfZHJpdmVyIDogTlVMTCkpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IGI3ZTU3MTAuLjQ0Njk5ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0yOTEsMTIgKzI5MSw2IEBACiAJZndfbG9hZF9hYm9ydChmd19wcml2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZ3X3NldHVwX2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpmX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIFhYWCB3YXJuaW5nIHdlIHNob3VsZCB3YXRjaCBvdXQgZm9yIG5hbWUgY29sbGlzaW9ucyAqLwotCXN0cmxjcHkoZl9kZXYtPmJ1c19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKTsKLX0KLQogc3RhdGljIGludCBmd19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqKmRldl9wLCBjb25zdCBjaGFyICpmd19uYW1lLAogCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewpAQCAtMzIxLDcgKzMxNSw3IEBACiAJZndfcHJpdi0+dGltZW91dC5kYXRhID0gKHVfbG9uZykgZndfcHJpdjsKIAlpbml0X3RpbWVyKCZmd19wcml2LT50aW1lb3V0KTsKIAotCWZ3X3NldHVwX2RldmljZV9pZChmX2RldiwgZGV2aWNlKTsKKwlkZXZfc2V0X25hbWUoZl9kZXYsIGRldl9uYW1lKGRldmljZSkpOwogCWZfZGV2LT5wYXJlbnQgPSBkZXZpY2U7CiAJZl9kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOwogCWRldl9zZXRfZHJ2ZGF0YShmX2RldiwgZndfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvaXNhLmMgYi9kcml2ZXJzL2Jhc2UvaXNhLmMKaW5kZXggZWZkNTc3NS4uNDc5Njk0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2lzYS5jCisrKyBiL2RyaXZlcnMvYmFzZS9pc2EuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogCiBzdGF0aWMgc3RydWN0IGRldmljZSBpc2FfYnVzID0gewotCS5idXNfaWQJCT0gImlzYSIKKwkuaW5pdF9uYW1lCT0gImlzYSIKIH07CiAKIHN0cnVjdCBpc2FfZGV2IHsKQEAgLTEzNSw5ICsxMzUsOCBAQAogCQlpc2FfZGV2LT5kZXYucGFyZW50CT0gJmlzYV9idXM7CiAJCWlzYV9kZXYtPmRldi5idXMJPSAmaXNhX2J1c190eXBlOwogCi0JCXNucHJpbnRmKGlzYV9kZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMuJXUiLAotCQkJCWlzYV9kcml2ZXItPmRyaXZlci5uYW1lLCBpZCk7Ci0KKwkJZGV2X3NldF9uYW1lKCZpc2FfZGV2LT5kZXYsICIlcy4ldSIsCisJCQkgICAgIGlzYV9kcml2ZXItPmRyaXZlci5uYW1lLCBpZCk7CiAJCWlzYV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhCT0gaXNhX2RyaXZlcjsKIAkJaXNhX2Rldi0+ZGV2LnJlbGVhc2UJCT0gaXNhX2Rldl9yZWxlYXNlOwogCQlpc2FfZGV2LT5pZAkJCT0gaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKaW5kZXggNTI2MGU5ZS4uOTg5NDI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwpAQCAtMzQ3LDggKzM0Nyw5IEBACiAgKiBzZWN0aW9uIGJlbG9uZ3MgdG8uLi4KICAqLwogCi1zdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZyBub2RlX2lkLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24sCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzdGF0ZSwgaW50IHBoeXNfZGV2aWNlKQorc3RhdGljIGludCBhZGRfbWVtb3J5X2Jsb2NrKGludCBuaWQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbiwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhdGUsIGludCBwaHlzX2RldmljZSwKKwkJCWVudW0gbWVtX2FkZF9jb250ZXh0IGNvbnRleHQpCiB7CiAJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOwogCWludCByZXQgPSAwOwpAQCAtMzcwLDYgKzM3MSwxMCBAQAogCQlyZXQgPSBtZW1fY3JlYXRlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19kZXZpY2UpOwogCWlmICghcmV0KQogCQlyZXQgPSBtZW1fY3JlYXRlX3NpbXBsZV9maWxlKG1lbSwgcmVtb3ZhYmxlKTsKKwlpZiAoIXJldCkgeworCQlpZiAoY29udGV4dCA9PSBIT1RQTFVHKQorCQkJcmV0ID0gcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShtZW0sIG5pZCk7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTM4Miw3ICszODcsNyBAQAogICoKICAqIFRoaXMgY291bGQgYmUgbWFkZSBnZW5lcmljIGZvciBhbGwgc3lzZGV2IGNsYXNzZXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtb3J5X2Jsb2NrICpmaW5kX21lbW9yeV9ibG9jayhzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCitzdHJ1Y3QgbWVtb3J5X2Jsb2NrICpmaW5kX21lbW9yeV9ibG9jayhzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCiB7CiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CiAJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKQEAgLTQxMSw2ICs0MTYsNyBAQAogCXN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbTsKIAogCW1lbSA9IGZpbmRfbWVtb3J5X2Jsb2NrKHNlY3Rpb24pOworCXVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMobWVtKTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19pbmRleCk7CiAJbWVtX3JlbW92ZV9zaW1wbGVfZmlsZShtZW0sIHN0YXRlKTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19kZXZpY2UpOwpAQCAtNDI0LDkgKzQzMCw5IEBACiAgKiBuZWVkIGFuIGludGVyZmFjZSBmb3IgdGhlIFZNIHRvIGFkZCBuZXcgbWVtb3J5IHJlZ2lvbnMsCiAgKiBidXQgd2l0aG91dCBvbmxpbmluZyBpdC4KICAqLwotaW50IHJlZ2lzdGVyX25ld19tZW1vcnkoc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQoraW50IHJlZ2lzdGVyX25ld19tZW1vcnkoaW50IG5pZCwgc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQogewotCXJldHVybiBhZGRfbWVtb3J5X2Jsb2NrKDAsIHNlY3Rpb24sIE1FTV9PRkZMSU5FLCAwKTsKKwlyZXR1cm4gYWRkX21lbW9yeV9ibG9jayhuaWQsIHNlY3Rpb24sIE1FTV9PRkZMSU5FLCAwLCBIT1RQTFVHKTsKIH0KIAogaW50IHVucmVnaXN0ZXJfbWVtb3J5X3NlY3Rpb24oc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQpAQCAtNDU4LDcgKzQ2NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE5SX01FTV9TRUNUSU9OUzsgaSsrKSB7CiAJCWlmICghcHJlc2VudF9zZWN0aW9uX25yKGkpKQogCQkJY29udGludWU7Ci0JCWVyciA9IGFkZF9tZW1vcnlfYmxvY2soMCwgX19ucl90b19zZWN0aW9uKGkpLCBNRU1fT05MSU5FLCAwKTsKKwkJZXJyID0gYWRkX21lbW9yeV9ibG9jaygwLCBfX25yX3RvX3NlY3Rpb24oaSksIE1FTV9PTkxJTkUsCisJCQkJCTAsIEJPT1QpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCA5MTYzNmNkLi40M2ZhOTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9ub2RlLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CkBAIC0yNDgsNiArMjQ5LDEwNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1NQQVJTRQorI2RlZmluZSBwYWdlX2luaXRpYWxpemVkKHBhZ2UpICAocGFnZS0+bHJ1Lm5leHQpCisKK3N0YXRpYyBpbnQgZ2V0X25pZF9mb3JfcGZuKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFwZm5fdmFsaWRfd2l0aGluKHBmbikpCisJCXJldHVybiAtMTsKKwlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAoIXBhZ2VfaW5pdGlhbGl6ZWQocGFnZSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcGZuX3RvX25pZChwZm4pOworfQorCisvKiByZWdpc3RlciBtZW1vcnkgc2VjdGlvbiB1bmRlciBzcGVjaWZpZWQgbm9kZSBpZiBpdCBzcGFucyB0aGF0IG5vZGUgKi8KK2ludCByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGssIGludCBuaWQpCit7CisJdW5zaWduZWQgbG9uZyBwZm4sIHNlY3Rfc3RhcnRfcGZuLCBzZWN0X2VuZF9wZm47CisKKwlpZiAoIW1lbV9ibGspCisJCXJldHVybiAtRUZBVUxUOworCWlmICghbm9kZV9vbmxpbmUobmlkKSkKKwkJcmV0dXJuIDA7CisJc2VjdF9zdGFydF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihtZW1fYmxrLT5waHlzX2luZGV4KTsKKwlzZWN0X2VuZF9wZm4gPSBzZWN0X3N0YXJ0X3BmbiArIFBBR0VTX1BFUl9TRUNUSU9OIC0gMTsKKwlmb3IgKHBmbiA9IHNlY3Rfc3RhcnRfcGZuOyBwZm4gPD0gc2VjdF9lbmRfcGZuOyBwZm4rKykgeworCQlpbnQgcGFnZV9uaWQ7CisKKwkJcGFnZV9uaWQgPSBnZXRfbmlkX2Zvcl9wZm4ocGZuKTsKKwkJaWYgKHBhZ2VfbmlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGFnZV9uaWQgIT0gbmlkKQorCQkJY29udGludWU7CisJCXJldHVybiBzeXNmc19jcmVhdGVfbGlua19ub3dhcm4oJm5vZGVfZGV2aWNlc1tuaWRdLnN5c2Rldi5rb2JqLAorCQkJCQkmbWVtX2Jsay0+c3lzZGV2LmtvYmosCisJCQkJCWtvYmplY3RfbmFtZSgmbWVtX2Jsay0+c3lzZGV2LmtvYmopKTsKKwl9CisJLyogbWVtIHNlY3Rpb24gZG9lcyBub3Qgc3BhbiB0aGUgc3BlY2lmaWVkIG5vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogdW5yZWdpc3RlciBtZW1vcnkgc2VjdGlvbiB1bmRlciBhbGwgbm9kZXMgdGhhdCBpdCBzcGFucyAqLworaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaykKK3sKKwlub2RlbWFza190IHVubGlua2VkX25vZGVzOworCXVuc2lnbmVkIGxvbmcgcGZuLCBzZWN0X3N0YXJ0X3Bmbiwgc2VjdF9lbmRfcGZuOworCisJaWYgKCFtZW1fYmxrKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlub2Rlc19jbGVhcih1bmxpbmtlZF9ub2Rlcyk7CisJc2VjdF9zdGFydF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihtZW1fYmxrLT5waHlzX2luZGV4KTsKKwlzZWN0X2VuZF9wZm4gPSBzZWN0X3N0YXJ0X3BmbiArIFBBR0VTX1BFUl9TRUNUSU9OIC0gMTsKKwlmb3IgKHBmbiA9IHNlY3Rfc3RhcnRfcGZuOyBwZm4gPD0gc2VjdF9lbmRfcGZuOyBwZm4rKykgeworCQl1bnNpZ25lZCBpbnQgbmlkOworCisJCW5pZCA9IGdldF9uaWRfZm9yX3BmbihwZm4pOworCQlpZiAobmlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW5vZGVfb25saW5lKG5pZCkpCisJCQljb250aW51ZTsKKwkJaWYgKG5vZGVfdGVzdF9hbmRfc2V0KG5pZCwgdW5saW5rZWRfbm9kZXMpKQorCQkJY29udGludWU7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZub2RlX2RldmljZXNbbmlkXS5zeXNkZXYua29iaiwKKwkJCSBrb2JqZWN0X25hbWUoJm1lbV9ibGstPnN5c2Rldi5rb2JqKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpbmtfbWVtX3NlY3Rpb25zKGludCBuaWQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm47CisJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgTk9ERV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgZXJyID0gMDsKKworCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKKwkJdW5zaWduZWQgbG9uZyBzZWN0aW9uX25yID0gcGZuX3RvX3NlY3Rpb25fbnIocGZuKTsKKwkJc3RydWN0IG1lbV9zZWN0aW9uICptZW1fc2VjdDsKKwkJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsazsKKwkJaW50IHJldDsKKworCQlpZiAoIXByZXNlbnRfc2VjdGlvbl9ucihzZWN0aW9uX25yKSkKKwkJCWNvbnRpbnVlOworCQltZW1fc2VjdCA9IF9fbnJfdG9fc2VjdGlvbihzZWN0aW9uX25yKTsKKwkJbWVtX2JsayA9IGZpbmRfbWVtb3J5X2Jsb2NrKG1lbV9zZWN0KTsKKwkJcmV0ID0gcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShtZW1fYmxrLCBuaWQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHJldDsKKworCQkvKiBkaXNjYXJkIHJlZiBvYnRhaW5lZCBpbiBmaW5kX21lbW9yeV9ibG9jaygpICovCisJCWtvYmplY3RfcHV0KCZtZW1fYmxrLT5zeXNkZXYua29iaik7CisJfQorCXJldHVybiBlcnI7Cit9CisjZWxzZQorc3RhdGljIGludCBsaW5rX21lbV9zZWN0aW9ucyhpbnQgbmlkKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHX1NQQVJTRSAqLworCiBpbnQgcmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMjY3LDYgKzM2Nyw5IEBACiAJCQlpZiAoY3B1X3RvX25vZGUoY3B1KSA9PSBuaWQpCiAJCQkJcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUoY3B1LCBuaWQpOwogCQl9CisKKwkJLyogbGluayBtZW1vcnkgc2VjdGlvbnMgdW5kZXIgdGhpcyBub2RlICovCisJCWVycm9yID0gbGlua19tZW1fc2VjdGlvbnMobmlkKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IGRmY2JmZTUuLjM0OWExMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0yNCw3ICsyNCw3IEBACiAJCQkJIGRyaXZlcikpCiAKIHN0cnVjdCBkZXZpY2UgcGxhdGZvcm1fYnVzID0gewotCS5idXNfaWQJCT0gInBsYXRmb3JtIiwKKwkuaW5pdF9uYW1lCT0gInBsYXRmb3JtIiwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9idXMpOwogCkBAIC0yNDIsMTYgKzI0MiwxNSBAQAogCXBkZXYtPmRldi5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGU7CiAKIAlpZiAocGRldi0+aWQgIT0gLTEpCi0JCXNucHJpbnRmKHBkZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMuJWQiLCBwZGV2LT5uYW1lLAotCQkJIHBkZXYtPmlkKTsKKwkJZGV2X3NldF9uYW1lKCZwZGV2LT5kZXYsICIlcy4lZCIsIHBkZXYtPm5hbWUsICBwZGV2LT5pZCk7CiAJZWxzZQotCQlzdHJsY3B5KHBkZXYtPmRldi5idXNfaWQsIHBkZXYtPm5hbWUsIEJVU19JRF9TSVpFKTsKKwkJZGV2X3NldF9uYW1lKCZwZGV2LT5kZXYsIHBkZXYtPm5hbWUpOwogCiAJZm9yIChpID0gMDsgaSA8IHBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnAsICpyID0gJnBkZXYtPnJlc291cmNlW2ldOwogCiAJCWlmIChyLT5uYW1lID09IE5VTEwpCi0JCQlyLT5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwkJCXItPm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAogCQlwID0gci0+cGFyZW50OwogCQlpZiAoIXApIHsKQEAgLTI2NCwxNCArMjYzLDE0IEBACiAJCWlmIChwICYmIGluc2VydF9yZXNvdXJjZShwLCByKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIiVzOiBmYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2UgJWRcbiIsCi0JCQkgICAgICAgcGRldi0+ZGV2LmJ1c19pZCwgaSk7CisJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIGkpOwogCQkJcmV0ID0gLUVCVVNZOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAl9CiAKIAlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgcGxhdGZvcm0gZGV2aWNlICclcycuIFBhcmVudCBhdCAlc1xuIiwKLQkJIHBkZXYtPmRldi5idXNfaWQsIHBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCk7CisJCSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgZGV2X25hbWUocGRldi0+ZGV2LnBhcmVudCkpOwogCiAJcmV0ID0gZGV2aWNlX2FkZCgmcGRldi0+ZGV2KTsKIAlpZiAocmV0ID09IDApCkBAIC01MDMsOCArNTAyLDYgQEAKIAkJZHJ2LT5kcml2ZXIuc3VzcGVuZCA9IHBsYXRmb3JtX2Rydl9zdXNwZW5kOwogCWlmIChkcnYtPnJlc3VtZSkKIAkJZHJ2LT5kcml2ZXIucmVzdW1lID0gcGxhdGZvcm1fZHJ2X3Jlc3VtZTsKLQlpZiAoZHJ2LT5wbSkKLQkJZHJ2LT5kcml2ZXIucG0gPSAmZHJ2LT5wbS0+YmFzZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIpOwpAQCAtNjA5LDcgKzYwNiw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogCXBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOwotCXJldHVybiAoc3RybmNtcChwZGV2LT5uYW1lLCBkcnYtPm5hbWUsIEJVU19JRF9TSVpFKSA9PSAwKTsKKwlyZXR1cm4gKHN0cmNtcChwZGV2LT5uYW1lLCBkcnYtPm5hbWUpID09IDApOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC02ODYsNyArNjgzLDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnN1c3BlbmQpCiAJCQlyZXQgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7CiAJfSBlbHNlIHsKQEAgLTY5OCwxNiArNjk4LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5zdXNwZW5kX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOwogCX0KQEAgLTcyMCw3ICs3MTksMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+cmVzdW1lKQogCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdW1lKGRldik7CiAJfSBlbHNlIHsKQEAgLTczMiwxNiArNzM0LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+cmVzdW1lX25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5yZXN1bWVfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAJfQpAQCAtNzgwLDE2ICs3ODEsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5mcmVlemVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPmZyZWV6ZV9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0ZSRUVaRSk7CiAJfQpAQCAtODAyLDcgKzgwMiwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT50aGF3KQogCQkJcmV0ID0gZHJ2LT5wbS0+dGhhdyhkZXYpOwogCX0gZWxzZSB7CkBAIC04MTQsMTYgKzgxNywxNSBAQAogCiBzdGF0aWMgaW50IHBsYXRmb3JtX3BtX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT50aGF3X25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+dGhhd19ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAJfQpAQCAtODM2LDcgKzgzOCwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5wb3dlcm9mZikKIAkJCXJldCA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7CiAJfSBlbHNlIHsKQEAgLTg0OCwxNiArODUzLDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcG93ZXJvZmZfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAl9CkBAIC04NzAsNyArODc0LDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnJlc3RvcmUpCiAJCQlyZXQgPSBkcnYtPnBtLT5yZXN0b3JlKGRldik7CiAJfSBlbHNlIHsKQEAgLTg4MiwxNiArODg5LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+cmVzdG9yZV9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdG9yZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC05MTIsMTcgKzkxOCwxNSBAQAogCiAjZW5kaWYgLyogIUNPTkZJR19ISUJFUk5BVElPTiAqLwogCi1zdGF0aWMgc3RydWN0IHBtX2V4dF9vcHMgcGxhdGZvcm1fcG1fb3BzID0gewotCS5iYXNlID0gewotCQkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCi0JCS5jb21wbGV0ZSA9IHBsYXRmb3JtX3BtX2NvbXBsZXRlLAotCQkuc3VzcGVuZCA9IHBsYXRmb3JtX3BtX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsCi0JCS5mcmVlemUgPSBwbGF0Zm9ybV9wbV9mcmVlemUsCi0JCS50aGF3ID0gcGxhdGZvcm1fcG1fdGhhdywKLQkJLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsCi0JCS5yZXN0b3JlID0gcGxhdGZvcm1fcG1fcmVzdG9yZSwKLQl9LAorc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHBsYXRmb3JtX2Rldl9wbV9vcHMgPSB7CisJLnByZXBhcmUgPSBwbGF0Zm9ybV9wbV9wcmVwYXJlLAorCS5jb21wbGV0ZSA9IHBsYXRmb3JtX3BtX2NvbXBsZXRlLAorCS5zdXNwZW5kID0gcGxhdGZvcm1fcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gcGxhdGZvcm1fcG1fcmVzdW1lLAorCS5mcmVlemUgPSBwbGF0Zm9ybV9wbV9mcmVlemUsCisJLnRoYXcgPSBwbGF0Zm9ybV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0gcGxhdGZvcm1fcG1fcmVzdG9yZSwKIAkuc3VzcGVuZF9ub2lycSA9IHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEsCiAJLnJlc3VtZV9ub2lycSA9IHBsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycSwKIAkuZnJlZXplX25vaXJxID0gcGxhdGZvcm1fcG1fZnJlZXplX25vaXJxLApAQCAtOTMxLDcgKzkzNSw3IEBACiAJLnJlc3RvcmVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxLAogfTsKIAotI2RlZmluZSBQTEFURk9STV9QTV9PUFNfUFRSCSZwbGF0Zm9ybV9wbV9vcHMKKyNkZWZpbmUgUExBVEZPUk1fUE1fT1BTX1BUUgkoJnBsYXRmb3JtX2Rldl9wbV9vcHMpCiAKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggNjkyYzIwYi4uNjcwYzlkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKGRldi0+cGFyZW50KSB7CiAJCWlmIChkZXYtPnBhcmVudC0+cG93ZXIuc3RhdHVzID49IERQTV9TVVNQRU5ESU5HKQogCQkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCi0JCQkJZGV2LT5wYXJlbnQtPmJ1c19pZCk7CisJCQkJIGRldl9uYW1lKGRldi0+cGFyZW50KSk7CiAJfSBlbHNlIGlmICh0cmFuc2l0aW9uX3N0YXJ0ZWQpIHsKIAkJLyoKIAkJICogV2UgcmVmdXNlIHRvIHJlZ2lzdGVyIHBhcmVudGxlc3MgZGV2aWNlcyB3aGlsZSBhIFBNCkBAIC0xMTIsNyArMTEyLDggQEAKICAqCUBvcHM6CVBNIG9wZXJhdGlvbnMgdG8gY2hvb3NlIGZyb20uCiAgKglAc3RhdGU6CVBNIHRyYW5zaXRpb24gb2YgdGhlIHN5c3RlbSBiZWluZyBjYXJyaWVkIG91dC4KICAqLwotc3RhdGljIGludCBwbV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbV9vcHMgKm9wcywgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwbV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcG1fb3BzICpvcHMsCisJCQlwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTc0LDcgKzE3NSw3IEBACiAgKglUaGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBieSB0aGUgb25seSByZW1haW5pbmcKICAqCWZ1bmN0aW9uYWwgQ1BVIGluIHRoZSBzeXN0ZW0uCiAgKi8KLXN0YXRpYyBpbnQgcG1fbm9pcnFfb3Aoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcG1fZXh0X29wcyAqb3BzLAorc3RhdGljIGludCBwbV9ub2lycV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcG1fb3BzICpvcHMsCiAJCQlwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IGVycm9yID0gMDsKQEAgLTM1NCw3ICszNTUsNyBAQAogCWlmIChkZXYtPmJ1cykgewogCQlpZiAoZGV2LT5idXMtPnBtKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICIiKTsKLQkJCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5idXMtPnBtLT5iYXNlLCBzdGF0ZSk7CisJCQllcnJvciA9IHBtX29wKGRldiwgZGV2LT5idXMtPnBtLCBzdGF0ZSk7CiAJCX0gZWxzZSBpZiAoZGV2LT5idXMtPnJlc3VtZSkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAibGVnYWN5ICIpOwogCQkJZXJyb3IgPSBkZXYtPmJ1cy0+cmVzdW1lKGRldik7CkBAIC00NTEsOSArNDUyLDkgQEAKIAkJZGV2LT50eXBlLT5wbS0+Y29tcGxldGUoZGV2KTsKIAl9CiAKLQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnBtICYmIGRldi0+YnVzLT5wbS0+YmFzZS5jb21wbGV0ZSkgeworCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5jb21wbGV0ZSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjb21wbGV0aW5nICIpOwotCQlkZXYtPmJ1cy0+cG0tPmJhc2UuY29tcGxldGUoZGV2KTsKKwkJZGV2LT5idXMtPnBtLT5jb21wbGV0ZShkZXYpOwogCX0KIAogCXVwKCZkZXYtPnNlbSk7CkBAIC02MjQsNyArNjI1LDcgQEAKIAlpZiAoZGV2LT5idXMpIHsKIAkJaWYgKGRldi0+YnVzLT5wbSkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiIik7Ci0JCQllcnJvciA9IHBtX29wKGRldiwgJmRldi0+YnVzLT5wbS0+YmFzZSwgc3RhdGUpOworCQkJZXJyb3IgPSBwbV9vcChkZXYsIGRldi0+YnVzLT5wbSwgc3RhdGUpOwogCQl9IGVsc2UgaWYgKGRldi0+YnVzLT5zdXNwZW5kKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJsZWdhY3kgIik7CiAJCQllcnJvciA9IGRldi0+YnVzLT5zdXNwZW5kKGRldiwgc3RhdGUpOwpAQCAtNjg1LDEwICs2ODYsMTAgQEAKIAogCWRvd24oJmRldi0+c2VtKTsKIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUpIHsKKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnBtICYmIGRldi0+YnVzLT5wbS0+cHJlcGFyZSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwcmVwYXJpbmcgIik7Ci0JCWVycm9yID0gZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUoZGV2KTsKLQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+YnVzLT5wbS0+YmFzZS5wcmVwYXJlLCBlcnJvcik7CisJCWVycm9yID0gZGV2LT5idXMtPnBtLT5wcmVwYXJlKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkZXYtPmJ1cy0+cG0tPnByZXBhcmUsIGVycm9yKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBFbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwppbmRleCAyYWE2ZThmLi4wYTFhMmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHZvaWQgc2V0X3RyYWNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZGV2X2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXYtPmJ1c19pZCwgREVWSEFTSCk7CisJZGV2X2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXZfbmFtZShkZXYpLCBERVZIQVNIKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X3RyYWNlX2RldmljZSk7CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAJd2hpbGUgKGVudHJ5ICE9ICZkcG1fbGlzdCkgewogCQlzdHJ1Y3QgZGV2aWNlICogZGV2ID0gdG9fZGV2aWNlKGVudHJ5KTsKLQkJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXYtPmJ1c19pZCwgREVWSEFTSCk7CisJCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9zdHJpbmcoREVWU0VFRCwgZGV2X25hbWUoZGV2KSwgREVWSEFTSCk7CiAJCWlmIChoYXNoID09IHZhbHVlKSB7CiAJCQlkZXZfaW5mbyhkZXYsICJoYXNoIG1hdGNoZXNcbiIpOwogCQkJbWF0Y2grKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggMTY5NzA0My4uMzU5MTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTg0MSw3ICs4NDEsNyBAQAogCiBjb25maWcgR0VOX1JUQwogCXRyaXN0YXRlICJHZW5lcmljIC9kZXYvcnRjIGVtdWxhdGlvbiIKLQlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFNSVBTICYmICFTUEFSQyAmJiAhRlJWICYmICFTMzkwICYmICFTVVBFUkggJiYgIUFWUjMyCisJZGVwZW5kcyBvbiBSVEMhPXkgJiYgIUlBNjQgJiYgIUFSTSAmJiAhTTMyUiAmJiAhTUlQUyAmJiAhU1BBUkMgJiYgIUZSViAmJiAhUzM5MCAmJiAhU1VQRVJIICYmICFBVlIzMiAmJiAhQkxBQ0tGSU4KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwppbmRleCA0MjQ2YjhlLi40NWQzZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQlfX2dldF91c2VyKGZvbnRwb3MsICZsaXN0LT5mb250cG9zKTsKIAkJaWYgKChlcnIxID0gY29uX2luc2VydF91bmlwYWlyKHAsIHVuaWNvZGUsZm9udHBvcykpICE9IDApCiAJCQllcnIgPSBlcnIxOwotCQkJbGlzdCsrOworCQlsaXN0Kys7CiAJfQogCQogCWlmIChjb25fdW5pZnlfdW5pbWFwKHZjLCBwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCA2NDMxZjY5Li4zNTg2YjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC00MjUsOSArNDI1LDYgQEAKIH0KICNlbmRpZgogCi1leHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0KICNpZmRlZiBDT05GSUdfREVWS01FTQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlICp2aXJ0dWFsKiBtZW1vcnkgYXMgc2VlbiBieSB0aGUga2VybmVsLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKaW5kZXggNGY4ZDY3Zi4uOTRhZDJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCkBAIC02NjMsNyArNjYzLDcgQEAKICNpZiAwCiAJLyogc3lzZnMgKi8KIAltZW1zZXQoJm13YXZlX2RldmljZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGV2aWNlKSk7Ci0Jc25wcmludGYobXdhdmVfZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICJtd2F2ZSIpOworCWRldl9zZXRfbmFtZSgmbXdhdmVfZGV2aWNlLCAibXdhdmUiKTsKIAogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm13YXZlX2RldmljZSkpCiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCBjN2FmYzA2Li43YzEzNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAkvKiByZWFkLXdyaXRlIGRhdGE6ICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGFkZF9wdHI7Ci0JaW50IGVudHJvcHlfY291bnQ7CS8qIE11c3QgYXQgbm8gdGltZSBleGNlZWQgLT5QT09MQklUUyEgKi8KKwlpbnQgZW50cm9weV9jb3VudDsKIAlpbnQgaW5wdXRfcm90YXRlOwogfTsKIApAQCAtNzY3LDExICs3NjcsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwotCiAJLyogSG9sZCBsb2NrIHdoaWxlIGFjY291bnRpbmcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmci0+bG9jaywgZmxhZ3MpOwogCisJQlVHX09OKHItPmVudHJvcHlfY291bnQgPiByLT5wb29saW5mby0+UE9PTEJJVFMpOwogCURFQlVHX0VOVCgidHJ5aW5nIHRvIGV4dHJhY3QgJWQgYml0cyBmcm9tICVzXG4iLAogCQkgIG5ieXRlcyAqIDgsIHItPm5hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCmluZGV4IDk0OTY2ZWQuLmQ0MWI5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9sb2dsZXZlbF9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9sb2dsZXZlbCwKLQkuaGVscF9tc2cJPSAibG9nbGV2ZWwwLTgiLAorCS5oZWxwX21zZwk9ICJsb2dsZXZlbCgwLTkpIiwKIAkuYWN0aW9uX21zZwk9ICJDaGFuZ2luZyBMb2dsZXZlbCIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0xPRywKIH07CkBAIC0yMzMsNyArMjMzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd2FsbGNwdXNfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd2FsbGNwdXMsCi0JLmhlbHBfbXNnCT0gImFMbGNwdXMiLAorCS5oZWxwX21zZwk9ICJzaG93LWJhY2t0cmFjZS1hbGwtYWN0aXZlLWNwdXMoTCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgYmFja3RyYWNlIG9mIGFsbCBhY3RpdmUgQ1BVcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93cmVnc19vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93cmVncywKLQkuaGVscF9tc2cJPSAic2hvd1BjIiwKKwkuaGVscF9tc2cJPSAic2hvdy1yZWdpc3RlcnMoUCkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgUmVncyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjU4LDcgKzI1OCw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93c3RhdGVfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3N0YXRlLAotCS5oZWxwX21zZwk9ICJzaG93VGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LXRhc2stc3RhdGVzKFQpIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IFN0YXRlIiwKIAkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKIH07CkBAIC0yNjksNyArMjY5LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dzdGF0ZV9ibG9ja2VkX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZV9ibG9ja2VkLAotCS5oZWxwX21zZwk9ICJzaG9XLWJsb2NrZWQtdGFza3MiLAorCS5oZWxwX21zZwk9ICJzaG93LWJsb2NrZWQtdGFza3MoVykiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgQmxvY2tlZCBTdGF0ZSIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjk3LDcgKzI5Nyw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93bWVtX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dtZW0sCi0JLmhlbHBfbXNnCT0gInNob3dNZW0iLAorCS5oZWxwX21zZwk9ICJzaG93LW1lbW9yeS11c2FnZShNKSIsCiAJLmFjdGlvbl9tc2cJPSAiU2hvdyBNZW1vcnkiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTMyMyw3ICszMjMsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdGVybV9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV90ZXJtLAotCS5oZWxwX21zZwk9ICJ0RXJtIiwKKwkuaGVscF9tc2cJPSAidGVybWluYXRlLWFsbC10YXNrcyhFKSIsCiAJLmFjdGlvbl9tc2cJPSAiVGVybWluYXRlIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNDEsNyArMzQxLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX21vb21fb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbW9vbSwKLQkuaGVscF9tc2cJPSAiRnVsbCIsCisJLmhlbHBfbXNnCT0gIm1lbW9yeS1mdWxsLW9vbS1raWxsKEYpIiwKIAkuYWN0aW9uX21zZwk9ICJNYW51YWwgT09NIGV4ZWN1dGlvbiIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNTMsNyArMzUzLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX2tpbGxfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfa2lsbCwKLQkuaGVscF9tc2cJPSAia0lsbCIsCisJLmhlbHBfbXNnCT0gImtpbGwtYWxsLXRhc2tzKEkpIiwKIAkuYWN0aW9uX21zZwk9ICJLaWxsIEFsbCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CkBAIC0zNjQsNyArMzY0LDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3VucnRfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdW5ydCwKLQkuaGVscF9tc2cJPSAiTmljZSIsCisJLmhlbHBfbXNnCT0gIm5pY2UtYWxsLVJULXRhc2tzKE4pIiwKIAkuYWN0aW9uX21zZwk9ICJOaWNlIEFsbCBSVCBUYXNrcyIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1JUTklDRSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IGUyNjY3YTguLmVlZTQ3ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC0xMDksNiArMTA5LDEzIEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEludGVsCiAJICBYMzggc2VydmVyIGNoaXBzZXRzLgogCitjb25maWcgRURBQ19JNTQwMAorCXRyaXN0YXRlICJJbnRlbCA1NDAwIChTZWFidXJnKSBjaGlwc2V0cyIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2CisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAorCSAgaTU0MDAgTUNIIGNoaXBzZXQgKFNlYWJ1cmcpLgorCiBjb25maWcgRURBQ19JODI4NjAKIAl0cmlzdGF0ZSAiSW50ZWwgODI4NjAiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4Nl8zMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL01ha2VmaWxlIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCmluZGV4IDYyYzJkOWIuLmI3NTE5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19FREFDX0FNRDc2WCkJCSs9IGFtZDc2eF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k1MDAwKQkJKz0gaTUwMDBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JNTEwMCkJCSs9IGk1MTAwX2VkYWMubworb2JqLSQoQ09ORklHX0VEQUNfSTU0MDApCQkrPSBpNTQwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0U3WFhYKQkJKz0gZTd4eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FNzUyWCkJCSs9IGU3NTJ4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTgyNDQzQlhHWCkJCSs9IGk4MjQ0M2J4Z3hfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCmluZGV4IDQwNDFlOTEuLmNhOTExM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIGZhaWwwOgogCWVkYWNfcHJpbnRrKEtFUk5fV0FSTklORywgRURBQ19NQywKIAkJCSIlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsCi0JCQlyb3Zlci0+ZGV2LT5idXNfaWQsIGVkYWNfZGV2X25hbWUocm92ZXIpLAorCQkJZGV2X25hbWUocm92ZXItPmRldiksIGVkYWNfZGV2X25hbWUocm92ZXIpLAogCQkJcm92ZXItPm1vZF9uYW1lLCByb3Zlci0+Y3RsX25hbWUsIHJvdmVyLT5kZXZfaWR4KTsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggZDExMDM5Mi4uMjVkNjY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAogZmFpbDA6CiAJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX01DLAotCQkiJXMgKCVzKSAlcyAlcyBhbHJlYWR5IGFzc2lnbmVkICVkXG4iLCBwLT5kZXYtPmJ1c19pZCwKKwkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwgZGV2X25hbWUocC0+ZGV2KSwKIAkJZWRhY19kZXZfbmFtZShtY2kpLCBwLT5tb2RfbmFtZSwgcC0+Y3RsX25hbWUsIHAtPm1jX2lkeCk7CiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKaW5kZXggMjJlYzlkNS4uNWQzYzgwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogZmFpbDA6CiAJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX1BDSSwKIAkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwKLQkJcm92ZXItPmRldi0+YnVzX2lkLCBlZGFjX2Rldl9uYW1lKHJvdmVyKSwKKwkJZGV2X25hbWUocm92ZXItPmRldiksIGVkYWNfZGV2X25hbWUocm92ZXIpLAogCQlyb3Zlci0+bW9kX25hbWUsIHJvdmVyLT5jdGxfbmFtZSwgcm92ZXItPnBjaV9pZHgpOwogCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19wY2lfc3lzZnMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCmluZGV4IDVjMTUzZGMuLjQyMjcyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jCkBAIC01NjksNyArNTY5LDcgQEAKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWRlYnVnZjQoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOworCWRlYnVnZjQoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCS8qIGNoZWNrIHRoZSBzdGF0dXMgcmVnIGZvciBlcnJvcnMgb24gYm9hcmRzIE5PVCBtYXJrZWQgYXMgYnJva2VuCiAJICogaWYgYnJva2VuLCB3ZSBjYW5ub3QgdHJ1c3QgYW55IG9mIHRoZSBzdGF0dXMgYml0cwpAQCAtNjAwLDEzICs2MDAsMTMgQEAKIAl9CiAKIAotCWRlYnVnZjQoIlBDSSBIRUFERVIgVFlQRT0gMHglMDJ4ICVzXG4iLCBoZWFkZXJfdHlwZSwgZGV2LT5kZXYuYnVzX2lkKTsKKwlkZWJ1Z2Y0KCJQQ0kgSEVBREVSIFRZUEU9IDB4JTAyeCAlc1xuIiwgaGVhZGVyX3R5cGUsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJaWYgKChoZWFkZXJfdHlwZSAmIDB4N0YpID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKIAkJLyogT24gYnJpZGdlcywgbmVlZCB0byBleGFtaW5lIHNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIgICovCiAJCXN0YXR1cyA9IGdldF9wY2lfcGFyaXR5X3N0YXR1cyhkZXYsIDEpOwogCi0JCWRlYnVnZjQoIlBDSSBTRUNfU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGVidWdmNCgiUENJIFNFQ19TVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCQkvKiBjaGVjayB0aGUgc2Vjb25kYXJ5IHN0YXR1cyByZWcgZm9yIGVycm9ycywKIAkJICogb24gTk9UIGJyb2tlbiBib2FyZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pNTQwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jCkBAIC0wLDAgKzEsMTQ3NiBAQAorLyoKKyAqIEludGVsIDU0MDAgY2xhc3MgTWVtb3J5IENvbnRyb2xsZXJzIGtlcm5lbCBtb2R1bGUgKFNlYWJ1cmcpCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggYnk6CisgKgkgQmVuIFdvb2RhcmQgPHdvb2RhcmRAcmVkaGF0LmNvbT4KKyAqCSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KKyAqCisgKiBSZWQgSGF0IEluYy4gaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICogRm9ya2VkIGFuZCBhZGFwdGVkIGZyb20gdGhlIGk1MDAwX2VkYWMgZHJpdmVyIHdoaWNoIHdhcworICogd3JpdHRlbiBieSBEb3VnbGFzIFRob21wc29uIExpbnV4IE5ldHdvcnggPG5vcnNrNUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKKyAqCisgKiBJbnRlbCA1NDAwIENoaXBzZXQgTWVtb3J5IENvbnRyb2xsZXIgSHViIChNQ0gpIC0gRGF0YXNoZWV0CisgKiAJaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL2NoaXBzZXRzL2RhdGFzaHRzLzMxMzA3MC5odG0KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKworI2luY2x1ZGUgImVkYWNfY29yZS5oIgorCisvKgorICogQWx0ZXIgdGhpcyB2ZXJzaW9uIGZvciB0aGUgSTU0MDAgbW9kdWxlIHdoZW4gbW9kaWZpY2F0aW9ucyBhcmUgbWFkZQorICovCisjZGVmaW5lIEk1NDAwX1JFVklTSU9OICAgICIgVmVyOiAxLjAuMCAiIF9fREFURV9fCisKKyNkZWZpbmUgRURBQ19NT0RfU1RSICAgICAgImk1NDAwX2VkYWMiCisKKyNkZWZpbmUgaTU0MDBfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgXAorCWVkYWNfcHJpbnRrKGxldmVsLCAiaTU0MDAiLCBmbXQsICMjYXJnKQorCisjZGVmaW5lIGk1NDAwX21jX3ByaW50ayhtY2ksIGxldmVsLCBmbXQsIGFyZy4uLikgXAorCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgImk1NDAwIiwgZm10LCAjI2FyZykKKworLyogTGltaXRzIGZvciBpNTQwMCAqLworI2RlZmluZSBOVU1fTVRSU19QRVJfQlJBTkNICTQKKyNkZWZpbmUgQ0hBTk5FTFNfUEVSX0JSQU5DSAkyCisjZGVmaW5lCU1BWF9DSEFOTkVMUwkJNAorI2RlZmluZSBNQVhfRElNTVMJCShNQVhfQ0hBTk5FTFMgKiA0KQkvKiBVcCB0byA0IERJTU0ncyBwZXIgY2hhbm5lbCAqLworI2RlZmluZSBNQVhfQ1NST1dTCQkoTUFYX0RJTU1TICogMikJCS8qIG1heCBwb3NzaWJsZSBjc3Jvd3MgcGVyIGNoYW5uZWwgKi8KKworLyogRGV2aWNlIDE2LAorICogRnVuY3Rpb24gMDogU3lzdGVtIEFkZHJlc3MKKyAqIEZ1bmN0aW9uIDE6IE1lbW9yeSBCcmFuY2ggTWFwLCBDb250cm9sLCBFcnJvcnMgUmVnaXN0ZXIKKyAqIEZ1bmN0aW9uIDI6IEZTQiBFcnJvciBSZWdpc3RlcnMKKyAqCisgKiBBbGwgMyBmdW5jdGlvbnMgb2YgRGV2aWNlIDE2ICgwLDEsMikgc2hhcmUgdGhlIFNBTUUgRElEIGFuZAorICogdXNlcyBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSIGZvciBkZXZpY2UgMTYgKDAsMSwyKSwKKyAqIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQwIGFuZCBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMQorICogZm9yIGRldmljZSAyMSAoMCwxKS4KKyAqLworCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMCAqLworI2RlZmluZQkJQU1CQVNFCQkJMHg0OCAvKiBBTUIgTWVtIE1hcHBlZCBSZWcgUmVnaW9uIEJhc2UgKi8KKyNkZWZpbmUJCU1BWENICQkJMHg1NiAvKiBNYXggQ2hhbm5lbCBOdW1iZXIgKi8KKyNkZWZpbmUJCU1BWERJTU1QRVJDSAkJMHg1NyAvKiBNYXggRElNTSBQRVIgQ2hhbm5lbCBOdW1iZXIgKi8KKworCS8qIE9GRlNFVFMgZm9yIEZ1bmN0aW9uIDEgKi8KKyNkZWZpbmUJCVRPTE0JCQkweDZDCisjZGVmaW5lCQlSRURNRU1CCQkJMHg3QworI2RlZmluZQkJCVJFQ19FQ0NfTE9DQVRPUl9PREQoeCkJKCh4KSAmIDB4M2ZlMDApIC8qIGJpdHMgWzE3OjldIGluZGljYXRlIE9ERCwgWzg6MF0gIGluZGljYXRlIEVWRU4gKi8KKyNkZWZpbmUJCU1JUjAJCQkweDgwCisjZGVmaW5lCQlNSVIxCQkJMHg4NAorI2RlZmluZQkJQU1JUjAJCQkweDhjCisjZGVmaW5lCQlBTUlSMQkJCTB4OTAKKworCS8qIEZhdGFsIGVycm9yIHJlZ2lzdGVycyAqLworI2RlZmluZQkJRkVSUl9GQVRfRkJECQkweDk4CS8qIGFsc28gY2FsbGVkIGFzIEZFUlJfRkFUX0ZCX0RJTU0gYXQgZGF0YXNoZWV0ICovCisjZGVmaW5lCQkJRkVSUl9GQVRfRkJEQ0hBTiAoMzw8MjgpCS8qIGNoYW5uZWwgaW5kZXggd2hlcmUgdGhlIGhpZ2hlc3Qtb3JkZXIgZXJyb3Igb2NjdXJyZWQgKi8KKworI2RlZmluZQkJTkVSUl9GQVRfRkJECQkweDljCisjZGVmaW5lCQlGRVJSX05GX0ZCRAkJMHhhMAkvKiBhbHNvIGNhbGxlZCBhcyBGRVJSX05GQVRfRkJfRElNTSBhdCBkYXRhc2hlZXQgKi8KKworCS8qIE5vbi1mYXRhbCBlcnJvciByZWdpc3RlciAqLworI2RlZmluZQkJTkVSUl9ORl9GQkQJCTB4YTQKKworCS8qIEVuYWJsZSBlcnJvciBtYXNrICovCisjZGVmaW5lCQlFTUFTS19GQkQJCTB4YTgKKworI2RlZmluZQkJRVJSMF9GQkQJCTB4YWMKKyNkZWZpbmUJCUVSUjFfRkJECQkweGIwCisjZGVmaW5lCQlFUlIyX0ZCRAkJMHhiNAorI2RlZmluZQkJTUNFUlJfRkJECQkweGI4CisKKwkvKiBObyBPRkZTRVRTIGZvciBEZXZpY2UgMTYgRnVuY3Rpb24gMiAqLworCisvKgorICogRGV2aWNlIDIxLAorICogRnVuY3Rpb24gMDogTWVtb3J5IE1hcCBCcmFuY2ggMAorICoKKyAqIERldmljZSAyMiwKKyAqIEZ1bmN0aW9uIDA6IE1lbW9yeSBNYXAgQnJhbmNoIDEKKyAqLworCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMCAqLworI2RlZmluZSBBTUJQUkVTRU5UXzAJMHg2NAorI2RlZmluZSBBTUJQUkVTRU5UXzEJMHg2NgorI2RlZmluZSBNVFIwCQkweDgwCisjZGVmaW5lIE1UUjEJCTB4ODIKKyNkZWZpbmUgTVRSMgkJMHg4NAorI2RlZmluZSBNVFIzCQkweDg2CisKKwkvKiBPRkZTRVRTIGZvciBGdW5jdGlvbiAxICovCisjZGVmaW5lIE5SRUNGR0xPRwkJMHg3NAorI2RlZmluZSBSRUNGR0xPRwkJMHg3OAorI2RlZmluZSBOUkVDTUVNQQkJMHhiZQorI2RlZmluZSBOUkVDTUVNQgkJMHhjMAorI2RlZmluZSBOUkVDRkJfRElNTUEJCTB4YzQKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1CCQkweGM4CisjZGVmaW5lIE5SRUNGQl9ESU1NQwkJMHhjYworI2RlZmluZSBOUkVDRkJfRElNTUQJCTB4ZDAKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1FCQkweGQ0CisjZGVmaW5lIE5SRUNGQl9ESU1NRgkJMHhkOAorI2RlZmluZSBSRURNRU1BCQkJMHhkQworI2RlZmluZSBSRUNNRU1BCQkJMHhmMAorI2RlZmluZSBSRUNNRU1CCQkJMHhmNAorI2RlZmluZSBSRUNGQl9ESU1NQQkJMHhmOAorI2RlZmluZSBSRUNGQl9ESU1NQgkJMHhlYworI2RlZmluZSBSRUNGQl9ESU1NQwkJMHhmMAorI2RlZmluZSBSRUNGQl9ESU1NRAkJMHhmNAorI2RlZmluZSBSRUNGQl9ESU1NRQkJMHhmOAorI2RlZmluZSBSRUNGQl9ESU1NRgkJMHhmQworCisvKgorICogRXJyb3IgaW5kaWNhdG9yIGJpdHMgYW5kIG1hc2tzCisgKiBFcnJvciBtYXNrcyBhcmUgYWNjb3JkaW5nIHdpdGggVGFibGUgNS0xNyBvZiBpNTQwMCBkYXRhc2hlZXQKKyAqLworCitlbnVtIGVycm9yX21hc2sgeworCUVNQVNLX00xICA9IDE8PDAsICAvKiBNZW1vcnkgV3JpdGUgZXJyb3Igb24gbm9uLXJlZHVuZGFudCByZXRyeSAqLworCUVNQVNLX00yICA9IDE8PDEsICAvKiBNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yICovCisJRU1BU0tfTTMgID0gMTw8MiwgIC8qIFJlc2VydmVkICovCisJRU1BU0tfTTQgID0gMTw8MywgIC8qIFVuY29ycmVjdGFibGUgRGF0YSBFQ0Mgb24gUmVwbGF5ICovCisJRU1BU0tfTTUgID0gMTw8NCwgIC8qIEFsaWFzZWQgVW5jb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDICovCisJRU1BU0tfTTYgID0gMTw8NSwgIC8qIFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJRU1BU0tfTTcgID0gMTw8NiwgIC8qIEFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyAqLworCUVNQVNLX004ICA9IDE8PDcsICAvKiBBbGlhc2VkIFVuY29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDICovCisJRU1BU0tfTTkgID0gMTw8OCwgIC8qIE5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyAqLworCUVNQVNLX00xMCA9IDE8PDksICAvKiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCUVNQVNLX00xMSA9IDE8PDEwLCAvKiBOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDICAqLworCUVNQVNLX00xMiA9IDE8PDExLCAvKiBOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyAqLworCUVNQVNLX00xMyA9IDE8PDEyLCAvKiBNZW1vcnkgV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCAqLworCUVNQVNLX00xNCA9IDE8PDEzLCAvKiBGQi1ESU1NIENvbmZpZ3VyYXRpb24gV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCAqLworCUVNQVNLX00xNSA9IDE8PDE0LCAvKiBNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yICovCisJRU1BU0tfTTE2ID0gMTw8MTUsIC8qIENoYW5uZWwgRmFpbGVkLU92ZXIgT2NjdXJyZWQgKi8KKwlFTUFTS19NMTcgPSAxPDwxNiwgLyogQ29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyAqLworCUVNQVNLX00xOCA9IDE8PDE3LCAvKiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCUVNQVNLX00xOSA9IDE8PDE4LCAvKiBDb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyAqLworCUVNQVNLX00yMCA9IDE8PDE5LCAvKiBDb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMjEgPSAxPDwyMCwgLyogRkItRElNTSBOb3J0aGJvdW5kIHBhcml0eSBlcnJvciBvbiBGQi1ESU1NIFN5bmMgU3RhdHVzICovCisJRU1BU0tfTTIyID0gMTw8MjEsIC8qIFNQRCBwcm90b2NvbCBFcnJvciAqLworCUVNQVNLX00yMyA9IDE8PDIyLCAvKiBOb24tUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCAqLworCUVNQVNLX00yNCA9IDE8PDIzLCAvKiBSZWZyZXNoIGVycm9yICovCisJRU1BU0tfTTI1ID0gMTw8MjQsIC8qIE1lbW9yeSBXcml0ZSBlcnJvciBvbiByZWR1bmRhbnQgcmV0cnkgKi8KKwlFTUFTS19NMjYgPSAxPDwyNSwgLyogUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCAqLworCUVNQVNLX00yNyA9IDE8PDI2LCAvKiBDb3JyZWN0YWJsZSBDb3VudGVyIFRocmVzaG9sZCBFeGNlZWRlZCAqLworCUVNQVNLX00yOCA9IDE8PDI3LCAvKiBESU1NLVNwYXJlIENvcHkgQ29tcGxldGVkICovCisJRU1BU0tfTTI5ID0gMTw8MjgsIC8qIERJTU0tSXNvbGF0aW9uIENvbXBsZXRlZCAqLworfTsKKworLyoKKyAqIE5hbWVzIHRvIHRyYW5zbGF0ZSBiaXQgZXJyb3IgaW50byBzb21ldGhpbmcgdXNlZnVsCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICplcnJvcl9uYW1lW10gPSB7CisJWzBdICA9ICJNZW1vcnkgV3JpdGUgZXJyb3Igb24gbm9uLXJlZHVuZGFudCByZXRyeSIsCisJWzFdICA9ICJNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yIiwKKwkvKiBSZXNlcnZlZCAqLworCVszXSAgPSAiVW5jb3JyZWN0YWJsZSBEYXRhIEVDQyBvbiBSZXBsYXkiLAorCVs0XSAgPSAiQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MiLAorCS8qIE02IFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJWzZdICA9ICJBbGlhc2VkIFVuY29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MiLAorCVs3XSAgPSAiQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyIsCisJWzhdICA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MiLAorCS8qIE0xMCBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCVsxMF0gPSAiTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyIsCisJWzExXSA9ICJOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyIsCisJWzEyXSA9ICJNZW1vcnkgV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCIsCisJWzEzXSA9ICJGQi1ESU1NIENvbmZpZ3VyYXRpb24gV3JpdGUgZXJyb3Igb24gZmlyc3QgYXR0ZW1wdCIsCisJWzE0XSA9ICJNZW1vcnkgb3IgRkItRElNTSBjb25maWd1cmF0aW9uIENSQyByZWFkIGVycm9yIiwKKwlbMTVdID0gIkNoYW5uZWwgRmFpbGVkLU92ZXIgT2NjdXJyZWQiLAorCVsxNl0gPSAiQ29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyIsCisJLyogTTE4IFVuc3VwcG9ydGVkIG9uIGk1NDAwICovCisJWzE4XSA9ICJDb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyIsCisJWzE5XSA9ICJDb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiLAorCVsyMF0gPSAiRkItRElNTSBOb3J0aGJvdW5kIHBhcml0eSBlcnJvciBvbiBGQi1ESU1NIFN5bmMgU3RhdHVzIiwKKwlbMjFdID0gIlNQRCBwcm90b2NvbCBFcnJvciIsCisJWzIyXSA9ICJOb24tUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCIsCisJWzIzXSA9ICJSZWZyZXNoIGVycm9yIiwKKwlbMjRdID0gIk1lbW9yeSBXcml0ZSBlcnJvciBvbiByZWR1bmRhbnQgcmV0cnkiLAorCVsyNV0gPSAiUmVkdW5kYW50IEZhc3QgUmVzZXQgVGltZW91dCIsCisJWzI2XSA9ICJDb3JyZWN0YWJsZSBDb3VudGVyIFRocmVzaG9sZCBFeGNlZWRlZCIsCisJWzI3XSA9ICJESU1NLVNwYXJlIENvcHkgQ29tcGxldGVkIiwKKwlbMjhdID0gIkRJTU0tSXNvbGF0aW9uIENvbXBsZXRlZCIsCit9OworCisvKiBGYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfRkFUX01BU0sJCShFTUFTS19NMSB8IFwKKwkJCQkgRU1BU0tfTTIgfCBcCisJCQkJIEVNQVNLX00yMykKKworLyogQ29ycmVjdGFibGUgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX05GX0NPUlJFQ1RBQkxFCShFTUFTS19NMjcgfCBcCisJCQkJIEVNQVNLX00yMCB8IFwKKwkJCQkgRU1BU0tfTTE5IHwgXAorCQkJCSBFTUFTS19NMTggfCBcCisJCQkJIEVNQVNLX00xNyB8IFwKKwkJCQkgRU1BU0tfTTE2KQorI2RlZmluZSBFUlJPUl9ORl9ESU1NX1NQQVJFCShFTUFTS19NMjkgfCBcCisJCQkJIEVNQVNLX00yOCkKKyNkZWZpbmUgRVJST1JfTkZfU1BEX1BST1RPQ09MCShFTUFTS19NMjIpCisjZGVmaW5lIEVSUk9SX05GX05PUlRIX0NSQwkoRU1BU0tfTTIxKQorCisvKiBSZWNvdmVyYWJsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfUkVDT1ZFUkFCTEUJKEVNQVNLX00yNiB8IFwKKwkJCQkgRU1BU0tfTTI1IHwgXAorCQkJCSBFTUFTS19NMjQgfCBcCisJCQkJIEVNQVNLX00xNSB8IFwKKwkJCQkgRU1BU0tfTTE0IHwgXAorCQkJCSBFTUFTS19NMTMgfCBcCisJCQkJIEVNQVNLX00xMiB8IFwKKwkJCQkgRU1BU0tfTTExIHwgXAorCQkJCSBFTUFTS19NOSAgfCBcCisJCQkJIEVNQVNLX004ICB8IFwKKwkJCQkgRU1BU0tfTTcgIHwgXAorCQkJCSBFTUFTS19NNSkKKworLyogdW5jb3JyZWN0YWJsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfVU5DT1JSRUNUQUJMRQkoRU1BU0tfTTQpCisKKy8qIG1hc2sgdG8gYWxsIG5vbi1mYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRVJST1JfTkZfTUFTSwkJKEVSUk9SX05GX0NPUlJFQ1RBQkxFICAgfCBcCisJCQkJIEVSUk9SX05GX1VOQ09SUkVDVEFCTEUgfCBcCisJCQkJIEVSUk9SX05GX1JFQ09WRVJBQkxFICAgfCBcCisJCQkJIEVSUk9SX05GX0RJTU1fU1BBUkUgICAgfCBcCisJCQkJIEVSUk9SX05GX1NQRF9QUk9UT0NPTCAgfCBcCisJCQkJIEVSUk9SX05GX05PUlRIX0NSQykKKworLyoKKyAqIERlZmluZSBlcnJvciBtYXNrcyBmb3IgdGhlIHNldmVyYWwgcmVnaXN0ZXJzCisgKi8KKworLyogRW5hYmxlIGFsbCBmYXRhbCBhbmQgbm9uIGZhdGFsIGVycm9ycyAqLworI2RlZmluZSBFTkFCTEVfRU1BU0tfQUxMCShFUlJPUl9GQVRfTUFTSyB8IEVSUk9SX05GX01BU0spCisKKy8qIG1hc2sgZm9yIGZhdGFsIGVycm9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBGRVJSX0ZBVF9NQVNLIEVSUk9SX0ZBVF9NQVNLCisKKy8qIG1hc2tzIGZvciBub24tZmF0YWwgZXJyb3IgcmVnaXN0ZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRvX25mX21hc2sodW5zaWduZWQgaW50IG1hc2spCit7CisJcmV0dXJuIChtYXNrICYgRU1BU0tfTTI5KSB8IChtYXNrID4+IDMpOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZnJvbV9uZl9mZXJyKHVuc2lnbmVkIGludCBtYXNrKQoreworCXJldHVybiAobWFzayAmIEVNQVNLX00yOSkgfAkJLyogQml0IDI4ICovCisJICAgICAgIChtYXNrICYgKCgxIDw8IDI4KSAtIDEpIDw8IDMpOwkvKiBCaXRzIDAgdG8gMjcgKi8KK307CisKKyNkZWZpbmUgRkVSUl9ORl9NQVNLCQl0b19uZl9tYXNrKEVSUk9SX05GX01BU0spCisjZGVmaW5lIEZFUlJfTkZfQ09SUkVDVEFCTEUJdG9fbmZfbWFzayhFUlJPUl9ORl9DT1JSRUNUQUJMRSkKKyNkZWZpbmUgRkVSUl9ORl9ESU1NX1NQQVJFCXRvX25mX21hc2soRVJST1JfTkZfRElNTV9TUEFSRSkKKyNkZWZpbmUgRkVSUl9ORl9TUERfUFJPVE9DT0wJdG9fbmZfbWFzayhFUlJPUl9ORl9TUERfUFJPVE9DT0wpCisjZGVmaW5lIEZFUlJfTkZfTk9SVEhfQ1JDCXRvX25mX21hc2soRVJST1JfTkZfTk9SVEhfQ1JDKQorI2RlZmluZSBGRVJSX05GX1JFQ09WRVJBQkxFCXRvX25mX21hc2soRVJST1JfTkZfUkVDT1ZFUkFCTEUpCisjZGVmaW5lIEZFUlJfTkZfVU5DT1JSRUNUQUJMRQl0b19uZl9tYXNrKEVSUk9SX05GX1VOQ09SUkVDVEFCTEUpCisKKy8qIERlZmluZXMgdG8gZXh0cmFjdCB0aGUgdmFpb3VzIGZpZWxkcyBmcm9tIHRoZQorICoJTVRSeCAtIE1lbW9yeSBUZWNobm9sb2d5IFJlZ2lzdGVycworICovCisjZGVmaW5lIE1UUl9ESU1NU19QUkVTRU5UKG10cikJCSgobXRyKSAmICgxIDw8IDEwKSkKKyNkZWZpbmUgTVRSX0RJTU1TX0VUSFJPVFRMRShtdHIpCSgobXRyKSAmICgxIDw8IDkpKQorI2RlZmluZSBNVFJfRFJBTV9XSURUSChtdHIpCQkoKChtdHIpICYgKDEgPDwgOCkpID8gOCA6IDQpCisjZGVmaW5lIE1UUl9EUkFNX0JBTktTKG10cikJCSgoKG10cikgJiAoMSA8PCA2KSkgPyA4IDogNCkKKyNkZWZpbmUgTVRSX0RSQU1fQkFOS1NfQUREUl9CSVRTKG10cikJKChNVFJfRFJBTV9CQU5LUyhtdHIpID09IDgpID8gMyA6IDIpCisjZGVmaW5lIE1UUl9ESU1NX1JBTksobXRyKQkJKCgobXRyKSA+PiA1KSAmIDB4MSkKKyNkZWZpbmUgTVRSX0RJTU1fUkFOS19BRERSX0JJVFMobXRyKQkoTVRSX0RJTU1fUkFOSyhtdHIpID8gMiA6IDEpCisjZGVmaW5lIE1UUl9ESU1NX1JPV1MobXRyKQkJKCgobXRyKSA+PiAyKSAmIDB4MykKKyNkZWZpbmUgTVRSX0RJTU1fUk9XU19BRERSX0JJVFMobXRyKQkoTVRSX0RJTU1fUk9XUyhtdHIpICsgMTMpCisjZGVmaW5lIE1UUl9ESU1NX0NPTFMobXRyKQkJKChtdHIpICYgMHgzKQorI2RlZmluZSBNVFJfRElNTV9DT0xTX0FERFJfQklUUyhtdHIpCShNVFJfRElNTV9DT0xTKG10cikgKyAxMCkKKworLyogVGhpcyBhcHBsaWVzIHRvIEZFUlJfTkZfRkItRElNTSBhcyB3ZWxsIGFzIEZFUlJfRkFUX0ZCLURJTU0gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dHJhY3RfZmJkY2hhbl9pbmR4KHUzMiB4KQoreworCXJldHVybiAoeD4+MjgpICYgMHgzOworfQorCisjaWZkZWYgQ09ORklHX0VEQUNfREVCVUcKKy8qIE1UUiBOVU1ST1cgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpudW1yb3dfdG9TdHJpbmdbXSA9IHsKKwkiOCwxOTIgLSAxMyByb3dzIiwKKwkiMTYsMzg0IC0gMTQgcm93cyIsCisJIjMyLDc2OCAtIDE1IHJvd3MiLAorCSI2NSw1MzYgLSAxNiByb3dzIgorfTsKKworLyogTVRSIE5VTUNPTCAqLworc3RhdGljIGNvbnN0IGNoYXIgKm51bWNvbF90b1N0cmluZ1tdID0geworCSIxLDAyNCAtIDEwIGNvbHVtbnMiLAorCSIyLDA0OCAtIDExIGNvbHVtbnMiLAorCSI0LDA5NiAtIDEyIGNvbHVtbnMiLAorCSJyZXNlcnZlZCIKK307CisjZW5kaWYKKworLyogRGV2aWNlIG5hbWUgYW5kIHJlZ2lzdGVyIERJRCAoRGV2aWNlIElEKSAqLworc3RydWN0IGk1NDAwX2Rldl9pbmZvIHsKKwljb25zdCBjaGFyICpjdGxfbmFtZTsJLyogbmFtZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1MTYgZnNiX21hcHBpbmdfZXJyb3JzOwkvKiBESUQgZm9yIHRoZSBicmFuY2htYXAsY29udHJvbCAqLworfTsKKworLyogVGFibGUgb2YgZGV2aWNlcyBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpNTQwMF9kZXZfaW5mbyBpNTQwMF9kZXZzW10gPSB7CisJeworCQkuY3RsX25hbWUgPSAiSTU0MDAiLAorCQkuZnNiX21hcHBpbmdfZXJyb3JzID0gUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUiwKKwl9LAorfTsKKworc3RydWN0IGk1NDAwX2RpbW1faW5mbyB7CisJaW50IG1lZ2FieXRlczsJCS8qIHNpemUsIDAgbWVhbnMgbm90IHByZXNlbnQgICovCisJaW50IGR1YWxfcmFuazsKK307CisKKy8qIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgaTU0MDBfcHZ0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqc3lzdGVtX2FkZHJlc3M7CQkvKiAxNi4wICovCisJc3RydWN0IHBjaV9kZXYgKmJyYW5jaG1hcF93ZXJyb3JzOwkvKiAxNi4xICovCisJc3RydWN0IHBjaV9kZXYgKmZzYl9lcnJvcl9yZWdzOwkJLyogMTYuMiAqLworCXN0cnVjdCBwY2lfZGV2ICpicmFuY2hfMDsJCS8qIDIxLjAgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqYnJhbmNoXzE7CQkvKiAyMi4wICovCisKKwl1MTYgdG9sbTsJCQkJLyogdG9wIG9mIGxvdyBtZW1vcnkgKi8KKwl1NjQgYW1iYXNlOwkJCQkvKiBBTUIgQkFSICovCisKKwl1MTYgbWlyMCwgbWlyMTsKKworCXUxNiBiMF9tdHJbTlVNX01UUlNfUEVSX0JSQU5DSF07CS8qIE1lbW9yeSBUZWNobmxvZ3kgUmVnICovCisJdTE2IGIwX2FtYnByZXNlbnQwOwkJCS8qIEJyYW5jaCAwLCBDaGFubmVsIDAgKi8KKwl1MTYgYjBfYW1icHJlc2VudDE7CQkJLyogQnJuYWNoIDAsIENoYW5uZWwgMSAqLworCisJdTE2IGIxX210cltOVU1fTVRSU19QRVJfQlJBTkNIXTsJLyogTWVtb3J5IFRlY2hubG9neSBSZWcgKi8KKwl1MTYgYjFfYW1icHJlc2VudDA7CQkJLyogQnJhbmNoIDEsIENoYW5uZWwgOCAqLworCXUxNiBiMV9hbWJwcmVzZW50MTsJCQkvKiBCcmFuY2ggMSwgQ2hhbm5lbCAxICovCisKKwkvKiBESU1NIGluZm9ybWF0aW9uIG1hdHJpeCwgYWxsb2NhdGluZyBhcmNoaXRlY3R1cmUgbWF4aW11bXMgKi8KKwlzdHJ1Y3QgaTU0MDBfZGltbV9pbmZvIGRpbW1faW5mb1tNQVhfQ1NST1dTXVtNQVhfQ0hBTk5FTFNdOworCisJLyogQWN0dWFsIHZhbHVlcyBmb3IgdGhpcyBjb250cm9sbGVyICovCisJaW50IG1heGNoOwkJCQkvKiBNYXggY2hhbm5lbHMgKi8KKwlpbnQgbWF4ZGltbXBlcmNoOwkJCS8qIE1heCBESU1NcyBwZXIgY2hhbm5lbCAqLworfTsKKworLyogSTU0MDAgTUNIIGVycm9yIGluZm9ybWF0aW9uIHJldHJpZXZlZCBmcm9tIEhhcmR3YXJlICovCitzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyB7CisJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBhbHdheXMgcmVhZCBmcm9tIHRoZSBNQyAqLworCXUzMiBmZXJyX2ZhdF9mYmQ7CS8qIEZpcnN0IEVycm9ycyBGYXRhbCAqLworCXUzMiBuZXJyX2ZhdF9mYmQ7CS8qIE5leHQgRXJyb3JzIEZhdGFsICovCisJdTMyIGZlcnJfbmZfZmJkOwkvKiBGaXJzdCBFcnJvcnMgTm9uLUZhdGFsICovCisJdTMyIG5lcnJfbmZfZmJkOwkvKiBOZXh0IEVycm9ycyBOb24tRmF0YWwgKi8KKworCS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgaW5wdXQgT05MWSBpZiB0aGVyZSB3YXMgYSBSZWNvdmVyYWJsZSBFcnJvciAqLworCXUzMiByZWRtZW1iOwkJLyogUmVjb3ZlcmFibGUgTWVtIERhdGEgRXJyb3IgbG9nIEIgKi8KKwl1MTYgcmVjbWVtYTsJCS8qIFJlY292ZXJhYmxlIE1lbSBFcnJvciBsb2cgQSAqLworCXUzMiByZWNtZW1iOwkJLyogUmVjb3ZlcmFibGUgTWVtIEVycm9yIGxvZyBCICovCisKKwkvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGlucHV0IE9OTFkgaWYgdGhlcmUgd2FzIGEgTm9uLVJlYyBFcnJvciAqLworCXUxNiBucmVjbWVtYTsJCS8qIE5vbi1SZWNvdmVyYWJsZSBNZW0gbG9nIEEgKi8KKwl1MTYgbnJlY21lbWI7CQkvKiBOb24tUmVjb3ZlcmFibGUgTWVtIGxvZyBCICovCisKK307CisKKy8qIG5vdGUgdGhhdCBucmVjX3Jkd3IgY2hhbmdlZCBmcm9tIE5SRUNNRU1BIHRvIE5SRUNNRU1CIGJldHdlZW4gdGhlIDUwMDAgYW5kCisgICA1NDAwIGJldHRlciB0byB1c2UgYW4gaW5saW5lIGZ1bmN0aW9uIHRoYW4gYSBtYWNybyBpbiB0aGlzIGNhc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfYmFuayhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5ucmVjbWVtYSkgPj4gMTIpICYgMHg3OworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19yYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1hKSA+PiA4KSAmIDB4ZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfYnVmX2lkKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1hKSkgJiAweGZmOworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19yZHdyKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+bnJlY21lbWIpID4+IDMxOworfQorLyogVGhpcyBhcHBsaWVzIHRvIGJvdGggTlJFQyBhbmQgUkVDIHN0cmluZyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIG5yZWNfcmR3cgorICAgYW5kIHJlY19yZHdyICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnJkd3Jfc3RyKGludCByZHdyKQoreworCXJldHVybiByZHdyID8gIldyaXRlIiA6ICJSZWFkIjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfY2FzKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPm5yZWNtZW1iKSA+PiAxNikgJiAweDFmZmY7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX3JhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPm5yZWNtZW1iKSAmIDB4ZmZmZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19iYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPnJlY21lbWEpID4+IDEyKSAmIDB4NzsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19yYW5rKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPnJlY21lbWEpID4+IDgpICYgMHhmOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX3Jkd3Ioc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuIChpbmZvLT5yZWNtZW1iKSA+PiAzMTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19jYXMoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+cmVjbWVtYikgPj4gMTYpICYgMHgxZmZmOworfQorc3RhdGljIGlubGluZSBpbnQgcmVjX3JhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPnJlY21lbWIpICYgMHhmZmZmOworfQorCitzdGF0aWMgc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICppNTQwMF9wY2k7CisKKy8qCisgKglpNTQwMF9nZXRfZXJyb3JfaW5mbwlSZXRyaWV2ZSB0aGUgaGFyZHdhcmUgZXJyb3IgaW5mb3JtYXRpb24gZnJvbQorICoJCQkJdGhlIGhhcmR3YXJlIGFuZCBjYWNoZSBpdCBpbiB0aGUgJ2luZm8nCisgKgkJCQlzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSBzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJdTMyIHZhbHVlOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qIHJlYWQgaW4gdGhlIDFzdCBGQVRBTCBlcnJvciByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBGRVJSX0ZBVF9GQkQsICZ2YWx1ZSk7CisKKwkvKiBNYXNrIG9ubHkgdGhlIGJpdHMgdGhhdCB0aGUgZG9jIHNheXMgYXJlIHZhbGlkCisJICovCisJdmFsdWUgJj0gKEZFUlJfRkFUX0ZCRENIQU4gfCBGRVJSX0ZBVF9NQVNLKTsKKworCS8qIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHJlYWQgaW4gdGhlCisJICAgTkVYVCBGQVRBTCBlcnJvciByZWdpc3RlciBhbmQgdGhlIE1lbW9yeSBFcnJvciBMb2cgUmVnaXN0ZXIgQQorCSAqLworCWlmICh2YWx1ZSAmIEZFUlJfRkFUX01BU0spIHsKKwkJaW5mby0+ZmVycl9mYXRfZmJkID0gdmFsdWU7CisKKwkJLyogaGFydmVzdCB0aGUgdmFyaW91cyBlcnJvciBkYXRhIHdlIG5lZWQgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJTkVSUl9GQVRfRkJELCAmaW5mby0+bmVycl9mYXRfZmJkKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlOUkVDTUVNQSwgJmluZm8tPm5yZWNtZW1hKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlOUkVDTUVNQiwgJmluZm8tPm5yZWNtZW1iKTsKKworCQkvKiBDbGVhciB0aGUgZXJyb3IgYml0cywgYnkgd3JpdGluZyB0aGVtIGJhY2sgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCUZFUlJfRkFUX0ZCRCwgdmFsdWUpOworCX0gZWxzZSB7CisJCWluZm8tPmZlcnJfZmF0X2ZiZCA9IDA7CisJCWluZm8tPm5lcnJfZmF0X2ZiZCA9IDA7CisJCWluZm8tPm5yZWNtZW1hID0gMDsKKwkJaW5mby0+bnJlY21lbWIgPSAwOworCX0KKworCS8qIHJlYWQgaW4gdGhlIDFzdCBOT04tRkFUQUwgZXJyb3IgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgRkVSUl9ORl9GQkQsICZ2YWx1ZSk7CisKKwkvKiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlbiByZWFkIGluIHRoZSAxc3QgTk9OLUZBVEFMIGVycm9yCisJICogcmVnaXN0ZXIgYXMgd2VsbCAqLworCWlmICh2YWx1ZSAmIEZFUlJfTkZfTUFTSykgeworCQlpbmZvLT5mZXJyX25mX2ZiZCA9IHZhbHVlOworCisJCS8qIGhhcnZlc3QgdGhlIHZhcmlvdXMgZXJyb3IgZGF0YSB3ZSBuZWVkICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCU5FUlJfTkZfRkJELCAmaW5mby0+bmVycl9uZl9mYmQpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCVJFQ01FTUEsICZpbmZvLT5yZWNtZW1hKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJUkVDTUVNQiwgJmluZm8tPnJlY21lbWIpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlSRURNRU1CLCAmaW5mby0+cmVkbWVtYik7CisKKwkJLyogQ2xlYXIgdGhlIGVycm9yIGJpdHMsIGJ5IHdyaXRpbmcgdGhlbSBiYWNrICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlGRVJSX05GX0ZCRCwgdmFsdWUpOworCX0gZWxzZSB7CisJCWluZm8tPmZlcnJfbmZfZmJkID0gMDsKKwkJaW5mby0+bmVycl9uZl9mYmQgPSAwOworCQlpbmZvLT5yZWNtZW1hID0gMDsKKwkJaW5mby0+cmVjbWVtYiA9IDA7CisJCWluZm8tPnJlZG1lbWIgPSAwOworCX0KK30KKworLyoKKyAqIGk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKyAqIAkJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8sCisgKiAJCQkJCWludCBoYW5kbGVfZXJyb3JzKTsKKyAqCisgKgloYW5kbGUgdGhlIEludGVsIEZBVEFMIGFuZCB1bnJlY292ZXJhYmxlIGVycm9ycywgaWYgYW55CisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX3Byb2NjZXNzX25vbl9yZWNvdmVyYWJsZV9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgICAgc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWxsRXJyb3JzKQoreworCWNoYXIgbXNnW0VEQUNfTUNfTEFCRUxfTEVOICsgMSArIDkwICsgODBdOworCWludCBicmFuY2g7CisJaW50IGNoYW5uZWw7CisJaW50IGJhbms7CisJaW50IGJ1Zl9pZDsKKwlpbnQgcmFuazsKKwlpbnQgcmR3cjsKKwlpbnQgcmFzLCBjYXM7CisJaW50IGVycm51bTsKKwljaGFyICp0eXBlID0gTlVMTDsKKworCWlmICghYWxsRXJyb3JzKQorCQlyZXR1cm47CQkvKiBpZiBubyBlcnJvciwgcmV0dXJuIG5vdyAqLworCisJaWYgKGFsbEVycm9ycyAmICBFUlJPUl9GQVRfTUFTSykKKwkJdHlwZSA9ICJGQVRBTCI7CisJZWxzZSBpZiAoYWxsRXJyb3JzICYgRkVSUl9ORl9VTkNPUlJFQ1RBQkxFKQorCQl0eXBlID0gIk5PTi1GQVRBTCB1bmNvcnJlY3RlZCI7CisJZWxzZQorCQl0eXBlID0gIk5PTi1GQVRBTCByZWNvdmVyYWJsZSI7CisKKwkvKiBPTkxZIE9ORSBvZiB0aGUgcG9zc2libGUgZXJyb3IgYml0cyB3aWxsIGJlIHNldCwgYXMgcGVyIHRoZSBkb2NzICovCisKKwlicmFuY2ggPSBleHRyYWN0X2ZiZGNoYW5faW5keChpbmZvLT5mZXJyX2ZhdF9mYmQpOworCWNoYW5uZWwgPSBicmFuY2g7CisKKwkvKiBVc2UgdGhlIE5PTi1SZWNvdmVyYWJsZSBtYWNyb3MgdG8gZXh0cmFjdCBkYXRhICovCisJYmFuayA9IG5yZWNfYmFuayhpbmZvKTsKKwlyYW5rID0gbnJlY19yYW5rKGluZm8pOworCWJ1Zl9pZCA9IG5yZWNfYnVmX2lkKGluZm8pOworCXJkd3IgPSBucmVjX3Jkd3IoaW5mbyk7CisJcmFzID0gbnJlY19yYXMoaW5mbyk7CisJY2FzID0gbnJlY19jYXMoaW5mbyk7CisKKwlkZWJ1Z2YwKCJcdFx0Q1NST1c9ICVkICBDaGFubmVscz0gJWQsJWQgIChCcmFuY2g9ICVkICIKKwkJIkRSQU0gQmFuaz0gJWQgQnVmZmVyIElEID0gJWQgcmR3cj0gJXMgcmFzPSAlZCBjYXM9ICVkKVxuIiwKKwkJcmFuaywgY2hhbm5lbCwgY2hhbm5lbCArIDEsIGJyYW5jaCA+PiAxLCBiYW5rLAorCQlidWZfaWQsIHJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcyk7CisKKwkvKiBPbmx5IDEgYml0IHdpbGwgYmUgb24gKi8KKwllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmYWxsRXJyb3JzLCBBUlJBWV9TSVpFKGVycm9yX25hbWUpKTsKKworCS8qIEZvcm0gb3V0IG1lc3NhZ2UgKi8KKwlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkgIiVzIChCcmFuY2g9JWQgRFJBTS1CYW5rPSVkIEJ1ZmZlciBJRCA9ICVkIFJEV1I9JXMgIgorCQkgIlJBUz0lZCBDQVM9JWQgJXMgRXJyPTB4JWx4ICglcykpIiwKKwkJIHR5cGUsIGJyYW5jaCA+PiAxLCBiYW5rLCBidWZfaWQsIHJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcywKKwkJIHR5cGUsIGFsbEVycm9ycywgZXJyb3JfbmFtZVtlcnJudW1dKTsKKworCS8qIENhbGwgdGhlIGhlbHBlciB0byBvdXRwdXQgbWVzc2FnZSAqLworCWVkYWNfbWNfaGFuZGxlX2ZiZF91ZShtY2ksIHJhbmssIGNoYW5uZWwsIGNoYW5uZWwgKyAxLCBtc2cpOworfQorCisvKgorICogaTU0MDBfcHJvY2Vzc19mYXRhbF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKyAqIAkJCQlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbywKKyAqIAkJCQlpbnQgaGFuZGxlX2Vycm9ycyk7CisgKgorICoJaGFuZGxlIHRoZSBJbnRlbCBOT04tRkFUQUwgZXJyb3JzLCBpZiBhbnkKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfcHJvY2Vzc19ub25mYXRhbF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJY2hhciBtc2dbRURBQ19NQ19MQUJFTF9MRU4gKyAxICsgOTAgKyA4MF07CisJdW5zaWduZWQgbG9uZyBhbGxFcnJvcnM7CisJaW50IGJyYW5jaDsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgYmFuazsKKwlpbnQgcmFuazsKKwlpbnQgcmR3cjsKKwlpbnQgcmFzLCBjYXM7CisJaW50IGVycm51bTsKKworCS8qIG1hc2sgb2ZmIHRoZSBFcnJvciBiaXRzIHRoYXQgYXJlIHBvc3NpYmxlICovCisJYWxsRXJyb3JzID0gZnJvbV9uZl9mZXJyKGluZm8tPmZlcnJfbmZfZmJkICYgRkVSUl9ORl9NQVNLKTsKKwlpZiAoIWFsbEVycm9ycykKKwkJcmV0dXJuOwkJLyogaWYgbm8gZXJyb3IsIHJldHVybiBub3cgKi8KKworCS8qIE9OTFkgT05FIG9mIHRoZSBwb3NzaWJsZSBlcnJvciBiaXRzIHdpbGwgYmUgc2V0LCBhcyBwZXIgdGhlIGRvY3MgKi8KKworCWlmIChhbGxFcnJvcnMgJiAoRVJST1JfTkZfVU5DT1JSRUNUQUJMRSB8IEVSUk9SX05GX1JFQ09WRVJBQkxFKSkgeworCQlpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhtY2ksIGluZm8sIGFsbEVycm9ycyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3JyZWN0YWJsZSBlcnJvcnMgKi8KKwlpZiAoYWxsRXJyb3JzICYgRVJST1JfTkZfQ09SUkVDVEFCTEUpIHsKKwkJZGVidWdmMCgiXHRDb3JyZWN0ZWQgYml0cz0gMHglbHhcbiIsIGFsbEVycm9ycyk7CisKKwkJYnJhbmNoID0gZXh0cmFjdF9mYmRjaGFuX2luZHgoaW5mby0+ZmVycl9uZl9mYmQpOworCisJCWNoYW5uZWwgPSAwOworCQlpZiAoUkVDX0VDQ19MT0NBVE9SX09ERChpbmZvLT5yZWRtZW1iKSkKKwkJCWNoYW5uZWwgPSAxOworCisJCS8qIENvbnZlcnQgY2hhbm5lbCB0byBiZSBiYXNlZCBmcm9tIHplcm8sIGluc3RlYWQgb2YKKwkJICogZnJvbSBicmFuY2ggYmFzZSBvZiAwICovCisJCWNoYW5uZWwgKz0gYnJhbmNoOworCisJCWJhbmsgPSByZWNfYmFuayhpbmZvKTsKKwkJcmFuayA9IHJlY19yYW5rKGluZm8pOworCQlyZHdyID0gcmVjX3Jkd3IoaW5mbyk7CisJCXJhcyA9IHJlY19yYXMoaW5mbyk7CisJCWNhcyA9IHJlY19jYXMoaW5mbyk7CisKKwkJLyogT25seSAxIGJpdCB3aWxsIGJlIG9uICovCisJCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZhbGxFcnJvcnMsIEFSUkFZX1NJWkUoZXJyb3JfbmFtZSkpOworCisJCWRlYnVnZjAoIlx0XHRDU1JPVz0gJWQgQ2hhbm5lbD0gJWQgIChCcmFuY2ggJWQgIgorCQkJIkRSQU0gQmFuaz0gJWQgcmR3cj0gJXMgcmFzPSAlZCBjYXM9ICVkKVxuIiwKKwkJCXJhbmssIGNoYW5uZWwsIGJyYW5jaCA+PiAxLCBiYW5rLAorCQkJcmR3cl9zdHIocmR3ciksIHJhcywgY2FzKTsKKworCQkvKiBGb3JtIG91dCBtZXNzYWdlICovCisJCXNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisJCQkgIkNvcnJlY3RlZCBlcnJvciAoQnJhbmNoPSVkIERSQU0tQmFuaz0lZCBSRFdSPSVzICIKKwkJCSAiUkFTPSVkIENBUz0lZCwgQ0UgRXJyPTB4JWx4ICglcykpIiwKKwkJCSBicmFuY2ggPj4gMSwgYmFuaywgcmR3cl9zdHIocmR3ciksIHJhcywgY2FzLAorCQkJIGFsbEVycm9ycywgZXJyb3JfbmFtZVtlcnJudW1dKTsKKworCQkvKiBDYWxsIHRoZSBoZWxwZXIgdG8gb3V0cHV0IG1lc3NhZ2UgKi8KKwkJZWRhY19tY19oYW5kbGVfZmJkX2NlKG1jaSwgcmFuaywgY2hhbm5lbCwgbXNnKTsKKworCQlyZXR1cm47CisJfQorCisJLyogTWlzY2VsYW5lb3VzIGVycm9ycyAqLworCWVycm51bSA9IGZpbmRfZmlyc3RfYml0KCZhbGxFcnJvcnMsIEFSUkFZX1NJWkUoZXJyb3JfbmFtZSkpOworCisJYnJhbmNoID0gZXh0cmFjdF9mYmRjaGFuX2luZHgoaW5mby0+ZmVycl9uZl9mYmQpOworCisJaTU0MDBfbWNfcHJpbnRrKG1jaSwgS0VSTl9FTUVSRywKKwkJCSJOb24tRmF0YWwgbWlzYyBlcnJvciAoQnJhbmNoPSVkIEVycj0lI2x4ICglcykpIiwKKwkJCWJyYW5jaCA+PiAxLCBhbGxFcnJvcnMsIGVycm9yX25hbWVbZXJybnVtXSk7Cit9CisKKy8qCisgKglpNTQwMF9wcm9jZXNzX2Vycm9yX2luZm8JUHJvY2VzcyB0aGUgZXJyb3IgaW5mbyB0aGF0IGlzCisgKglpbiB0aGUgJ2luZm8nIHN0cnVjdHVyZSwgcHJldmlvdXNseSByZXRyaWV2ZWQgZnJvbSBoYXJkd2FyZQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9wcm9jZXNzX2Vycm9yX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQorewl1MzIgYWxsRXJyb3JzOworCisJLyogRmlyc3QgaGFuZGxlIGFueSBmYXRhbCBlcnJvcnMgdGhhdCBvY2N1cnJlZCAqLworCWFsbEVycm9ycyA9IChpbmZvLT5mZXJyX2ZhdF9mYmQgJiBGRVJSX0ZBVF9NQVNLKTsKKwlpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhtY2ksIGluZm8sIGFsbEVycm9ycyk7CisKKwkvKiBub3cgaGFuZGxlIGFueSBub24tZmF0YWwgZXJyb3JzIHRoYXQgb2NjdXJyZWQgKi8KKwlpNTQwMF9wcm9jZXNzX25vbmZhdGFsX2Vycm9yX2luZm8obWNpLCBpbmZvKTsKK30KKworLyoKKyAqCWk1NDAwX2NsZWFyX2Vycm9yCVJldHJpZXZlIGFueSBlcnJvciBmcm9tIHRoZSBoYXJkd2FyZQorICoJCQkJYnV0IGRvIE5PVCBwcm9jZXNzIHRoYXQgZXJyb3IuCisgKgkJCQlVc2VkIGZvciAnY2xlYXJpbmcnIG91dCBvZiBwcmV2aW91cyBlcnJvcnMKKyAqCQkJCUNhbGxlZCBieSB0aGUgQ29yZSBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2NsZWFyX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyBpbmZvOworCisJaTU0MDBfZ2V0X2Vycm9yX2luZm8obWNpLCAmaW5mbyk7Cit9CisKKy8qCisgKglpNTQwMF9jaGVja19lcnJvcglSZXRyaWV2ZSBhbmQgcHJvY2VzcyBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlCisgKgkJCQloYXJkd2FyZS4gQ2FsbGVkIGJ5IHRoZSBDb3JlIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgaTU0MDBfY2hlY2tfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvIGluZm87CisJZGVidWdmNCgiTUMlZDogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBtY2ktPm1jX2lkeCwgX19mdW5jX18pOworCWk1NDAwX2dldF9lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworCWk1NDAwX3Byb2Nlc3NfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKK30KKworLyoKKyAqCWk1NDAwX3B1dF9kZXZpY2VzCSdwdXQnIGFsbCB0aGUgZGV2aWNlcyB0aGF0IHdlIGhhdmUKKyAqCQkJCXJlc2VydmVkIHZpYSAnZ2V0JworICovCitzdGF0aWMgdm9pZCBpNTQwMF9wdXRfZGV2aWNlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qIERlY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgZGV2aWNlcyAqLworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNoXzEpOworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNoXzApOworCXBjaV9kZXZfcHV0KHB2dC0+ZnNiX2Vycm9yX3JlZ3MpOworCXBjaV9kZXZfcHV0KHB2dC0+YnJhbmNobWFwX3dlcnJvcnMpOworfQorCisvKgorICoJaTU0MDBfZ2V0X2RldmljZXMJRmluZCBhbmQgcGVyZm9ybSAnZ2V0JyBvcGVyYXRpb24gb24gdGhlIE1DSCdzCisgKgkJCWRldmljZS9mdW5jdGlvbnMgd2Ugd2FudCB0byByZWZlcmVuY2UgZm9yIHRoaXMgZHJpdmVyCisgKgorICoJCQlOZWVkIHRvICdnZXQnIGRldmljZSAxNiBmdW5jIDEgYW5kIGZ1bmMgMgorICovCitzdGF0aWMgaW50IGk1NDAwX2dldF9kZXZpY2VzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgaW50IGRldl9pZHgpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPmJyYW5jaG1hcF93ZXJyb3JzID0gTlVMTDsKKwlwdnQtPmZzYl9lcnJvcl9yZWdzID0gTlVMTDsKKwlwdnQtPmJyYW5jaF8wID0gTlVMTDsKKwlwdnQtPmJyYW5jaF8xID0gTlVMTDsKKworCS8qIEF0dGVtcHQgdG8gJ2dldCcgdGhlIE1DSCByZWdpc3RlciB3ZSB3YW50ICovCisJcGRldiA9IE5VTEw7CisJd2hpbGUgKCFwdnQtPmJyYW5jaG1hcF93ZXJyb3JzIHx8ICFwdnQtPmZzYl9lcnJvcl9yZWdzKSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIsIHBkZXYpOworCQlpZiAoIXBkZXYpIHsKKwkJCS8qIEVuZCBvZiBsaXN0LCBsZWF2ZSAqLworCQkJaTU0MDBfcHJpbnRrKEtFUk5fRVJSLAorCQkJCSInc3lzdGVtIGFkZHJlc3MsUHJvY2VzcyBCdXMnICIKKwkJCQkiZGV2aWNlIG5vdCBmb3VuZDoiCisJCQkJInZlbmRvciAweCV4IGRldmljZSAweCV4IEVSUiBmdW5jcyAiCisJCQkJIihicm9rZW4gQklPUz8pXG4iLAorCQkJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogU3RvcmUgZGV2aWNlIDE2IGZ1bmNzIDEgYW5kIDIgKi8KKwkJc3dpdGNoIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikpIHsKKwkJY2FzZSAxOgorCQkJcHZ0LT5icmFuY2htYXBfd2Vycm9ycyA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcHZ0LT5mc2JfZXJyb3JfcmVncyA9IHBkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlYnVnZjEoIlN5c3RlbSBBZGRyZXNzLCBwcm9jZXNzb3IgYnVzLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+c3lzdGVtX2FkZHJlc3MpLAorCQlwdnQtPnN5c3RlbV9hZGRyZXNzLT52ZW5kb3IsIHB2dC0+c3lzdGVtX2FkZHJlc3MtPmRldmljZSk7CisJZGVidWdmMSgiQnJhbmNobWFwLCBjb250cm9sIGFuZCBlcnJvcnMgLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMpLAorCQlwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLT52ZW5kb3IsIHB2dC0+YnJhbmNobWFwX3dlcnJvcnMtPmRldmljZSk7CisJZGVidWdmMSgiRlNCIEVycm9yIFJlZ3MgLSBQQ0kgQnVzIElEOiAlcyAgJXg6JXhcbiIsCisJCXBjaV9uYW1lKHB2dC0+ZnNiX2Vycm9yX3JlZ3MpLAorCQlwdnQtPmZzYl9lcnJvcl9yZWdzLT52ZW5kb3IsIHB2dC0+ZnNiX2Vycm9yX3JlZ3MtPmRldmljZSk7CisKKwlwdnQtPmJyYW5jaF8wID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDAsIE5VTEwpOworCWlmICghcHZ0LT5icmFuY2hfMCkgeworCQlpNTQwMF9wcmludGsoS0VSTl9FUlIsCisJCQkiTUM6ICdCUkFOQ0ggMCcgZGV2aWNlIG5vdCBmb3VuZDoiCisJCQkidmVuZG9yIDB4JXggZGV2aWNlIDB4JXggRnVuYyAwIChicm9rZW4gQklPUz8pXG4iLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDApOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIElmIHRoaXMgZGV2aWNlIGNsYWltcyB0byBoYXZlIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHRoZW4KKwkgKiBmZXRjaCBCcmFuY2ggMSdzIGluZm9ybWF0aW9uCisJICovCisJaWYgKHB2dC0+bWF4Y2ggPCBDSEFOTkVMU19QRVJfQlJBTkNIKQorCQlyZXR1cm4gMDsKKworCXB2dC0+YnJhbmNoXzEgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMSwgTlVMTCk7CisJaWYgKCFwdnQtPmJyYW5jaF8xKSB7CisJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwKKwkJCSJNQzogJ0JSQU5DSCAxJyBkZXZpY2Ugbm90IGZvdW5kOiIKKwkJCSJ2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBGdW5jIDAgIgorCQkJIihicm9rZW4gQklPUz8pXG4iLAorCQkJUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCVBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQxKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaTU0MDBfcHV0X2RldmljZXMobWNpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqCWRldGVybWluZV9hbWJfcHJlc2VudAorICoKKyAqCQl0aGUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIE5VTV9NVFJTX1BFUl9CUkFOQ0ggZGlmZmVyZW50CisgKgkJcmVnaXN0ZXJzIGRldGVybWluaW5nIHdoaWNoIG9mIHRoZSBOVU1fTVRSU19QRVJfQlJBTkNIIHJlcXVpcmVzCisgKiAgICAgICAgICAgICAga25vd2luZyB3aGljaCBjaGFubmVsIGlzIGluIHF1ZXN0aW9uCisgKgorICoJMiBicmFuY2hlcywgZWFjaCB3aXRoIDIgY2hhbm5lbHMKKyAqCQliMF9hbWJwcmVzZW50MCBmb3IgY2hhbm5lbCAnMCcKKyAqCQliMF9hbWJwcmVzZW50MSBmb3IgY2hhbm5lbCAnMScKKyAqCQliMV9hbWJwcmVzZW50MCBmb3IgY2hhbm5lbCAnMicKKyAqCQliMV9hbWJwcmVzZW50MSBmb3IgY2hhbm5lbCAnMycKKyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfYW1iX3ByZXNlbnRfcmVnKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCwgaW50IGNoYW5uZWwpCit7CisJaW50IGFtYl9wcmVzZW50OworCisJaWYgKGNoYW5uZWwgPCBDSEFOTkVMU19QRVJfQlJBTkNIKSB7CisJCWlmIChjaGFubmVsICYgMHgxKQorCQkJYW1iX3ByZXNlbnQgPSBwdnQtPmIwX2FtYnByZXNlbnQxOworCQllbHNlCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjBfYW1icHJlc2VudDA7CisJfSBlbHNlIHsKKwkJaWYgKGNoYW5uZWwgJiAweDEpCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjFfYW1icHJlc2VudDE7CisJCWVsc2UKKwkJCWFtYl9wcmVzZW50ID0gcHZ0LT5iMV9hbWJwcmVzZW50MDsKKwl9CisKKwlyZXR1cm4gYW1iX3ByZXNlbnQ7Cit9CisKKy8qCisgKiBkZXRlcm1pbmVfbXRyKHB2dCwgY3Nyb3csIGNoYW5uZWwpCisgKgorICogcmV0dXJuIHRoZSBwcm9wZXIgTVRSIHJlZ2lzdGVyIGFzIGRldGVybWluZSBieSB0aGUgY3Nyb3cgYW5kIGRlc2lyZWQgY2hhbm5lbAorICovCitzdGF0aWMgaW50IGRldGVybWluZV9tdHIoc3RydWN0IGk1NDAwX3B2dCAqcHZ0LCBpbnQgY3Nyb3csIGludCBjaGFubmVsKQoreworCWludCBtdHI7CisJaW50IG47CisKKwkvKiBUaGVyZSBpcyBvbmUgTVRSIGZvciBlYWNoIHNsb3QgcGFpciBvZiBGQi1ESU1NcywKKwkgICBFYWNoIHNsb3QgbWF5IGhhdmUgb25lIG9yIHR3byByYW5rcyAoMiBjc3Jvd3MpLAorCSAgIEVhY2ggc2xvdCBwYWlyIG1heSBiZSBhdCBicmFuY2ggMCBvciBicmFuY2ggMS4KKwkgICBTbywgY3Nyb3cgc2hvdWxkIGJlIGRpdmlkZWQgYnkgZWlnaHQKKwkgKi8KKwluID0gY3Nyb3cgPj4gMzsKKworCWlmIChuID49IE5VTV9NVFJTX1BFUl9CUkFOQ0gpIHsKKwkJZGVidWdmMCgiRVJST1I6IHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBjc3JvdzogJWRcbiIsCisJCQljc3Jvdyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFubmVsIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkKKwkJbXRyID0gcHZ0LT5iMF9tdHJbbl07CisJZWxzZQorCQltdHIgPSBwdnQtPmIxX210cltuXTsKKworCXJldHVybiBtdHI7Cit9CisKKy8qCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9tdHIoaW50IHNsb3Rfcm93LCB1MTYgbXRyKQoreworCWludCBhbnM7CisKKwlhbnMgPSBNVFJfRElNTVNfUFJFU0VOVChtdHIpOworCisJZGVidWdmMigiXHRNVFIlZD0weCV4OiAgRElNTXMgYXJlICVzXG4iLCBzbG90X3JvdywgbXRyLAorCQlhbnMgPyAiUHJlc2VudCIgOiAiTk9UIFByZXNlbnQiKTsKKwlpZiAoIWFucykKKwkJcmV0dXJuOworCisJZGVidWdmMigiXHRcdFdJRFRIOiB4JWRcbiIsIE1UUl9EUkFNX1dJRFRIKG10cikpOworCisJZGVidWdmMigiXHRcdEVMRUNUUklDQUwgVEhST1RUTElORyBpcyAlc1xuIiwKKwkJTVRSX0RJTU1TX0VUSFJPVFRMRShtdHIpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlkZWJ1Z2YyKCJcdFx0TlVNQkFOSzogJWQgYmFuayhzKVxuIiwgTVRSX0RSQU1fQkFOS1MobXRyKSk7CisJZGVidWdmMigiXHRcdE5VTVJBTks6ICVzXG4iLCBNVFJfRElNTV9SQU5LKG10cikgPyAiZG91YmxlIiA6ICJzaW5nbGUiKTsKKwlkZWJ1Z2YyKCJcdFx0TlVNUk9XOiAlc1xuIiwgbnVtcm93X3RvU3RyaW5nW01UUl9ESU1NX1JPV1MobXRyKV0pOworCWRlYnVnZjIoIlx0XHROVU1DT0w6ICVzXG4iLCBudW1jb2xfdG9TdHJpbmdbTVRSX0RJTU1fQ09MUyhtdHIpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jaGFubmVsKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCwgaW50IGNzcm93LCBpbnQgY2hhbm5lbCwKKwkJCXN0cnVjdCBpNTQwMF9kaW1tX2luZm8gKmRpbmZvKQoreworCWludCBtdHI7CisJaW50IGFtYl9wcmVzZW50X3JlZzsKKwlpbnQgYWRkckJpdHM7CisKKwltdHIgPSBkZXRlcm1pbmVfbXRyKHB2dCwgY3Nyb3csIGNoYW5uZWwpOworCWlmIChNVFJfRElNTVNfUFJFU0VOVChtdHIpKSB7CisJCWFtYl9wcmVzZW50X3JlZyA9IGRldGVybWluZV9hbWJfcHJlc2VudF9yZWcocHZ0LCBjaGFubmVsKTsKKworCQkvKiBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBESU1NIHByZXNlbnQgaW4gdGhpcyBESU1NIHNsb3QgKi8KKwkJaWYgKGFtYl9wcmVzZW50X3JlZyAmICgxIDw8IChjc3JvdyA+PiAxKSkpIHsKKwkJCWRpbmZvLT5kdWFsX3JhbmsgPSBNVFJfRElNTV9SQU5LKG10cik7CisKKwkJCWlmICghKChkaW5mby0+ZHVhbF9yYW5rID09IDApICYmCisJCQkJKChjc3JvdyAmIDB4MSkgPT0gMHgxKSkpIHsKKwkJCQkvKiBTdGFydCB3aXRoIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgYSBCYW5rCisJCQkJICogb24gdGhlIERSQU0gKi8KKwkJCQlhZGRyQml0cyA9IE1UUl9EUkFNX0JBTktTX0FERFJfQklUUyhtdHIpOworCQkJCS8qIEFkZCB0aGVudW1iZXIgb2YgUk9XIGJpdHMgKi8KKwkJCQlhZGRyQml0cyArPSBNVFJfRElNTV9ST1dTX0FERFJfQklUUyhtdHIpOworCQkJCS8qIGFkZCB0aGUgbnVtYmVyIG9mIENPTFVNTiBiaXRzICovCisJCQkJYWRkckJpdHMgKz0gTVRSX0RJTU1fQ09MU19BRERSX0JJVFMobXRyKTsKKworCQkJCWFkZHJCaXRzICs9IDY7CS8qIGFkZCA2NCBiaXRzIHBlciBESU1NICovCisJCQkJYWRkckJpdHMgLT0gMjA7CS8qIGRpdmlkZSBieSAyXl4yMCAqLworCQkJCWFkZHJCaXRzIC09IDM7CS8qIDggYml0cyBwZXIgYnl0ZXMgKi8KKworCQkJCWRpbmZvLT5tZWdhYnl0ZXMgPSAxIDw8IGFkZHJCaXRzOworCQkJfQorCQl9CisJfQorfQorCisvKgorICoJY2FsY3VsYXRlX2RpbW1fc2l6ZQorICoKKyAqCWFsc28gd2lsbCBvdXRwdXQgYSBESU1NIG1hdHJpeCBtYXAsIGlmIGRlYnVnIGlzIGVuYWJsZWQsIGZvciB2aWV3aW5nCisgKglob3cgdGhlIERJTU1zIGFyZSBwb3B1bGF0ZWQKKyAqLworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2RpbW1fc2l6ZShzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQpCit7CisJc3RydWN0IGk1NDAwX2RpbW1faW5mbyAqZGluZm87CisJaW50IGNzcm93LCBtYXhfY3Nyb3dzOworCWNoYXIgKnAsICptZW1fYnVmZmVyOworCWludCBzcGFjZSwgbjsKKwlpbnQgY2hhbm5lbDsKKworCS8qID09PT09PT09PT09PT09PT09IEdlbmVyYXRlIHNvbWUgZGVidWcgb3V0cHV0ID09PT09PT09PT09PT09PT09ICovCisJc3BhY2UgPSBQQUdFX1NJWkU7CisJbWVtX2J1ZmZlciA9IHAgPSBrbWFsbG9jKHNwYWNlLCBHRlBfS0VSTkVMKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwgIk1DOiAlczolcygpIGttYWxsb2MoKSBmYWlsZWRcbiIsCisJCQlfX0ZJTEVfXywgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogU2NhbiBhbGwgdGhlIGFjdHVhbCBDU1JPV1MgKHdoaWNoIGlzICMgb2YgRElNTVMgKiAyKQorCSAqIGFuZCBjYWxjdWxhdGUgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIERJTU0KKwkgKiBTdGFydCB3aXRoIHRoZSBoaWdoZXN0IGNzcm93IGZpcnN0LCB0byBkaXNwbGF5IGl0IGZpcnN0CisJICogYW5kIHdvcmsgdG93YXJkIHRoZSAwdGggY3Nyb3cKKwkgKi8KKwltYXhfY3Nyb3dzID0gcHZ0LT5tYXhkaW1tcGVyY2ggKiAyOworCWZvciAoY3Nyb3cgPSBtYXhfY3Nyb3dzIC0gMTsgY3Nyb3cgPj0gMDsgY3Nyb3ctLSkgeworCisJCS8qIG9uIGFuIG9kZCBjc3JvdywgZmlyc3Qgb3V0cHV0IGEgJ2JvdW5kYXJ5JyBtYXJrZXIsCisJCSAqIHRoZW4gcmVzZXQgdGhlIG1lc3NhZ2UgYnVmZmVyICAqLworCQlpZiAoY3Nyb3cgJiAweDEpIHsKKwkJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJCQlwICs9IG47CisJCQlzcGFjZSAtPSBuOworCQkJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCQkJcCA9IG1lbV9idWZmZXI7CisJCQlzcGFjZSA9IFBBR0VfU0laRTsKKwkJfQorCQluID0gc25wcmludGYocCwgc3BhY2UsICJjc3JvdyAlMmQgICAgIiwgY3Nyb3cpOworCQlwICs9IG47CisJCXNwYWNlIC09IG47CisKKwkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHB2dC0+bWF4Y2g7IGNoYW5uZWwrKykgeworCQkJZGluZm8gPSAmcHZ0LT5kaW1tX2luZm9bY3Nyb3ddW2NoYW5uZWxdOworCQkJaGFuZGxlX2NoYW5uZWwocHZ0LCBjc3JvdywgY2hhbm5lbCwgZGluZm8pOworCQkJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiJTRkIE1CICAgfCAiLCBkaW5mby0+bWVnYWJ5dGVzKTsKKwkJCXAgKz0gbjsKKwkJCXNwYWNlIC09IG47CisJCX0KKwkJZGVidWdmMigiJXNcbiIsIG1lbV9idWZmZXIpOworCQlwID0gbWVtX2J1ZmZlcjsKKwkJc3BhY2UgPSBQQUdFX1NJWkU7CisJfQorCisJLyogT3V0cHV0IHRoZSBsYXN0IGJvdHRvbSAnYm91bmRhcnknIG1hcmtlciAqLworCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCXAgKz0gbjsKKwlzcGFjZSAtPSBuOworCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwlwID0gbWVtX2J1ZmZlcjsKKwlzcGFjZSA9IFBBR0VfU0laRTsKKworCS8qIG5vdyBvdXRwdXQgdGhlICdjaGFubmVsJyBsYWJlbHMgKi8KKwluID0gc25wcmludGYocCwgc3BhY2UsICIgICAgICAgICAgICAiKTsKKwlwICs9IG47CisJc3BhY2UgLT0gbjsKKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcHZ0LT5tYXhjaDsgY2hhbm5lbCsrKSB7CisJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgImNoYW5uZWwgJWQgfCAiLCBjaGFubmVsKTsKKwkJcCArPSBuOworCQlzcGFjZSAtPSBuOworCX0KKworCS8qIG91dHB1dCB0aGUgbGFzdCBtZXNzYWdlIGFuZCBmcmVlIGJ1ZmZlciAqLworCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwlrZnJlZShtZW1fYnVmZmVyKTsKK30KKworLyoKKyAqCWk1NDAwX2dldF9tY19yZWdzCXJlYWQgaW4gdGhlIG5lY2Vzc2FyeSByZWdpc3RlcnMgYW5kCisgKgkJCQljYWNoZSBsb2NhbGx5CisgKgorICoJCQlGaWxscyBpbiB0aGUgcHJpdmF0ZSBkYXRhIG1lbWJlcnMKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X21jX3JlZ3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwl1MzIgYWN0dWFsX3RvbG07CisJdTE2IGxpbWl0OworCWludCBzbG90X3JvdzsKKwlpbnQgbWF4Y2g7CisJaW50IG1heGRpbW1wZXJjaDsKKwlpbnQgd2F5MCwgd2F5MTsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5zeXN0ZW1fYWRkcmVzcywgQU1CQVNFLAorCQkJKHUzMiAqKSAmcHZ0LT5hbWJhc2UpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPnN5c3RlbV9hZGRyZXNzLCBBTUJBU0UgKyBzaXplb2YodTMyKSwKKwkJCSgodTMyICopICZwdnQtPmFtYmFzZSkgKyBzaXplb2YodTMyKSk7CisKKwltYXhkaW1tcGVyY2ggPSBwdnQtPm1heGRpbW1wZXJjaDsKKwltYXhjaCA9IHB2dC0+bWF4Y2g7CisKKwlkZWJ1Z2YyKCJBTUJBU0U9IDB4JWx4ICBNQVhDSD0gJWQgIE1BWC1ESU1NLVBlci1DSD0gJWRcbiIsCisJCShsb25nIHVuc2lnbmVkIGludClwdnQtPmFtYmFzZSwgcHZ0LT5tYXhjaCwgcHZ0LT5tYXhkaW1tcGVyY2gpOworCisJLyogR2V0IHRoZSBCcmFuY2ggTWFwIHJlZ3MgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBUT0xNLCAmcHZ0LT50b2xtKTsKKwlwdnQtPnRvbG0gPj49IDEyOworCWRlYnVnZjIoIlxuVE9MTSAobnVtYmVyIG9mIDI1Nk0gcmVnaW9ucykgPSV1ICgweCV4KVxuIiwgcHZ0LT50b2xtLAorCQlwdnQtPnRvbG0pOworCisJYWN0dWFsX3RvbG0gPSAodTMyKSAoKDEwMDBsICogcHZ0LT50b2xtKSA+PiAoMzAgLSAyOCkpOworCWRlYnVnZjIoIkFjdHVhbCBUT0xNIGJ5dGUgYWRkcj0ldS4lMDN1IEdCICgweCV4KVxuIiwKKwkJYWN0dWFsX3RvbG0vMTAwMCwgYWN0dWFsX3RvbG0gJSAxMDAwLCBwdnQtPnRvbG0gPDwgMjgpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgTUlSMCwgJnB2dC0+bWlyMCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgTUlSMSwgJnB2dC0+bWlyMSk7CisKKwkvKiBHZXQgdGhlIE1JUlswLTFdIHJlZ3MgKi8KKwlsaW1pdCA9IChwdnQtPm1pcjAgPj4gNCkgJiAweDBmZmY7CisJd2F5MCA9IHB2dC0+bWlyMCAmIDB4MTsKKwl3YXkxID0gcHZ0LT5taXIwICYgMHgyOworCWRlYnVnZjIoIk1JUjA6IGxpbWl0PSAweCV4ICBXQVkxPSAldSAgV0FZMD0gJXhcbiIsIGxpbWl0LCB3YXkxLCB3YXkwKTsKKwlsaW1pdCA9IChwdnQtPm1pcjEgPj4gNCkgJiAweGZmZjsKKwl3YXkwID0gcHZ0LT5taXIxICYgMHgxOworCXdheTEgPSBwdnQtPm1pcjEgJiAweDI7CisJZGVidWdmMigiTUlSMTogbGltaXQ9IDB4JXggIFdBWTE9ICV1ICBXQVkwPSAleFxuIiwgbGltaXQsIHdheTEsIHdheTApOworCisJLyogR2V0IHRoZSBzZXQgb2YgTVRSWzAtM10gcmVncyBieSBlYWNoIGJyYW5jaCAqLworCWZvciAoc2xvdF9yb3cgPSAwOyBzbG90X3JvdyA8IE5VTV9NVFJTX1BFUl9CUkFOQ0g7IHNsb3Rfcm93KyspIHsKKwkJaW50IHdoZXJlID0gTVRSMCArIChzbG90X3JvdyAqIHNpemVvZih1MzIpKTsKKworCQkvKiBCcmFuY2ggMCBzZXQgb2YgTVRSIHJlZ2lzdGVycyAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8wLCB3aGVyZSwKKwkJCQkmcHZ0LT5iMF9tdHJbc2xvdF9yb3ddKTsKKworCQlkZWJ1Z2YyKCJNVFIlZCB3aGVyZT0weCV4IEIwIHZhbHVlPTB4JXhcbiIsIHNsb3Rfcm93LCB3aGVyZSwKKwkJCXB2dC0+YjBfbXRyW3Nsb3Rfcm93XSk7CisKKwkJaWYgKHB2dC0+bWF4Y2ggPCBDSEFOTkVMU19QRVJfQlJBTkNIKSB7CisJCQlwdnQtPmIxX210cltzbG90X3Jvd10gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBCcmFuY2ggMSBzZXQgb2YgTVRSIHJlZ2lzdGVycyAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8xLCB3aGVyZSwKKwkJCQkmcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKKwkJZGVidWdmMigiTVRSJWQgd2hlcmU9MHgleCBCMSB2YWx1ZT0weCV4XG4iLCBzbG90X3Jvdywgd2hlcmUsCisJCQlwdnQtPmIxX210cltzbG90X3Jvd10pOworCX0KKworCS8qIFJlYWQgYW5kIGR1bXAgYnJhbmNoIDAncyBNVFJzICovCisJZGVidWdmMigiXG5NZW1vcnkgVGVjaG5vbG9neSBSZWdpc3RlcnM6XG4iKTsKKwlkZWJ1Z2YyKCIgICBCcmFuY2ggMDpcbiIpOworCWZvciAoc2xvdF9yb3cgPSAwOyBzbG90X3JvdyA8IE5VTV9NVFJTX1BFUl9CUkFOQ0g7IHNsb3Rfcm93KyspCisJCWRlY29kZV9tdHIoc2xvdF9yb3csIHB2dC0+YjBfbXRyW3Nsb3Rfcm93XSk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8wLCBBTUJQUkVTRU5UXzAsCisJCQkmcHZ0LT5iMF9hbWJwcmVzZW50MCk7CisJZGVidWdmMigiXHRcdEFNQi1CcmFuY2ggMC1wcmVzZW50MCAweCV4OlxuIiwgcHZ0LT5iMF9hbWJwcmVzZW50MCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMCwgQU1CUFJFU0VOVF8xLAorCQkJJnB2dC0+YjBfYW1icHJlc2VudDEpOworCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDAtcHJlc2VudDEgMHgleDpcbiIsIHB2dC0+YjBfYW1icHJlc2VudDEpOworCisJLyogT25seSBpZiB3ZSBoYXZlIDIgYnJhbmNocyAoNCBjaGFubmVscykgKi8KKwlpZiAocHZ0LT5tYXhjaCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpIHsKKwkJcHZ0LT5iMV9hbWJwcmVzZW50MCA9IDA7CisJCXB2dC0+YjFfYW1icHJlc2VudDEgPSAwOworCX0gZWxzZSB7CisJCS8qIFJlYWQgYW5kIGR1bXAgIGJyYW5jaCAxJ3MgTVRScyAqLworCQlkZWJ1Z2YyKCIgICBCcmFuY2ggMTpcbiIpOworCQlmb3IgKHNsb3Rfcm93ID0gMDsgc2xvdF9yb3cgPCBOVU1fTVRSU19QRVJfQlJBTkNIOyBzbG90X3JvdysrKQorCQkJZGVjb2RlX210cihzbG90X3JvdywgcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKKworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8xLCBBTUJQUkVTRU5UXzAsCisJCQkJJnB2dC0+YjFfYW1icHJlc2VudDApOworCQlkZWJ1Z2YyKCJcdFx0QU1CLUJyYW5jaCAxLXByZXNlbnQwIDB4JXg6XG4iLAorCQkJcHZ0LT5iMV9hbWJwcmVzZW50MCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzEsIEFNQlBSRVNFTlRfMSwKKwkJCQkmcHZ0LT5iMV9hbWJwcmVzZW50MSk7CisJCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDEtcHJlc2VudDEgMHgleDpcbiIsCisJCQlwdnQtPmIxX2FtYnByZXNlbnQxKTsKKwl9CisKKwkvKiBHbyBhbmQgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGVhY2ggRElNTSBhbmQgcGxhY2UgaW4gYW4KKwkgKiBvcmRlcmx5IG1hdHJpeCAqLworCWNhbGN1bGF0ZV9kaW1tX3NpemUocHZ0KTsKK30KKworLyoKKyAqCWk1NDAwX2luaXRfY3Nyb3dzCUluaXRpYWxpemUgdGhlICdjc3Jvd3MnIHRhYmxlIHdpdGhpbgorICoJCQkJdGhlIG1jaSBjb250cm9sCXN0cnVjdHVyZSB3aXRoIHRoZQorICoJCQkJYWRkcmVzc2luZyBvZiBtZW1vcnkuCisgKgorICoJcmV0dXJuOgorICoJCTAJc3VjY2VzcworICoJCTEJbm8gYWN0dWFsIG1lbW9yeSBmb3VuZCBvbiB0aGlzIE1DCisgKi8KK3N0YXRpYyBpbnQgaTU0MDBfaW5pdF9jc3Jvd3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqcF9jc3JvdzsKKwlpbnQgZW1wdHksIGNoYW5uZWxfY291bnQ7CisJaW50IG1heF9jc3Jvd3M7CisJaW50IG10cjsKKwlpbnQgY3Nyb3dfbWVnczsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgY3Nyb3c7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJY2hhbm5lbF9jb3VudCA9IHB2dC0+bWF4Y2g7CisJbWF4X2Nzcm93cyA9IHB2dC0+bWF4ZGltbXBlcmNoICogMjsKKworCWVtcHR5ID0gMTsJCS8qIEFzc3VtZSBOTyBtZW1vcnkgKi8KKworCWZvciAoY3Nyb3cgPSAwOyBjc3JvdyA8IG1heF9jc3Jvd3M7IGNzcm93KyspIHsKKwkJcF9jc3JvdyA9ICZtY2ktPmNzcm93c1tjc3Jvd107CisKKwkJcF9jc3Jvdy0+Y3Nyb3dfaWR4ID0gY3Nyb3c7CisKKwkJLyogdXNlIGJyYW5jaCAwIGZvciB0aGUgYmFzaXMgKi8KKwkJbXRyID0gZGV0ZXJtaW5lX210cihwdnQsIGNzcm93LCAwKTsKKworCQkvKiBpZiBubyBESU1NUyBvbiB0aGlzIHJvdywgY29udGludWUgKi8KKwkJaWYgKCFNVFJfRElNTVNfUFJFU0VOVChtdHIpKQorCQkJY29udGludWU7CisKKwkJLyogRkFLRSBPVVQgVkFMVUVTLCBGSVhNRSAqLworCQlwX2Nzcm93LT5maXJzdF9wYWdlID0gMCArIGNzcm93ICogMjA7CisJCXBfY3Nyb3ctPmxhc3RfcGFnZSA9IDkgKyBjc3JvdyAqIDIwOworCQlwX2Nzcm93LT5wYWdlX21hc2sgPSAweEZGRjsKKworCQlwX2Nzcm93LT5ncmFpbiA9IDg7CisKKwkJY3Nyb3dfbWVncyA9IDA7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBwdnQtPm1heGNoOyBjaGFubmVsKyspCisJCQljc3Jvd19tZWdzICs9IHB2dC0+ZGltbV9pbmZvW2Nzcm93XVtjaGFubmVsXS5tZWdhYnl0ZXM7CisKKwkJcF9jc3Jvdy0+bnJfcGFnZXMgPSBjc3Jvd19tZWdzIDw8IDg7CisKKwkJLyogQXNzdW1lIEREUjIgZm9yIG5vdyAqLworCQlwX2Nzcm93LT5tdHlwZSA9IE1FTV9GQl9ERFIyOworCisJCS8qIGFzayB3aGF0IGRldmljZSB0eXBlIG9uIHRoaXMgcm93ICovCisJCWlmIChNVFJfRFJBTV9XSURUSChtdHIpKQorCQkJcF9jc3Jvdy0+ZHR5cGUgPSBERVZfWDg7CisJCWVsc2UKKwkJCXBfY3Nyb3ctPmR0eXBlID0gREVWX1g0OworCisJCXBfY3Nyb3ctPmVkYWNfbW9kZSA9IEVEQUNfUzhFQ0Q4RUQ7CisKKwkJZW1wdHkgPSAwOworCX0KKworCXJldHVybiBlbXB0eTsKK30KKworLyoKKyAqCWk1NDAwX2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcKKyAqCQkJVHVybiBvbiB0aGUgbWVtb3J5IHJlcG9ydGluZyBmZWF0dXJlcyBvZiB0aGUgaGFyZHdhcmUKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZW5hYmxlX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXUzMiBmYmRfZXJyb3JfbWFzazsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKiBSZWFkIHRoZSBGQkQgRXJyb3IgTWFzayBSZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBFTUFTS19GQkQsCisJCQkmZmJkX2Vycm9yX21hc2spOworCisJLyogRW5hYmxlIHdpdGggYSAnMCcgKi8KKwlmYmRfZXJyb3JfbWFzayAmPSB+KEVOQUJMRV9FTUFTS19BTEwpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLCBFTUFTS19GQkQsCisJCQlmYmRfZXJyb3JfbWFzayk7Cit9CisKKy8qCisgKiBpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9jc3Jvd3MsICZudW1fY2hhbm5lbHMpCisgKgorICoJYXNrIHRoZSBkZXZpY2UgaG93IG1hbnkgY2hhbm5lbHMgYXJlIHByZXNlbnQgYW5kIGhvdyBtYW55IENTUk9XUworICoJIGFzIHdlbGwKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfZ2V0X2RpbW1fYW5kX2NoYW5uZWxfY291bnRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQlpbnQgKm51bV9kaW1tc19wZXJfY2hhbm5lbCwKKwkJCQkJaW50ICpudW1fY2hhbm5lbHMpCit7CisJdTggdmFsdWU7CisKKwkvKiBOZWVkIHRvIHJldHJpZXZlIGp1c3QgaG93IG1hbnkgY2hhbm5lbHMgYW5kIGRpbW1zIHBlciBjaGFubmVsIGFyZQorCSAqIHN1cHBvcnRlZCBvbiB0aGlzIG1lbW9yeSBjb250cm9sbGVyCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgTUFYRElNTVBFUkNILCAmdmFsdWUpOworCSpudW1fZGltbXNfcGVyX2NoYW5uZWwgPSAoaW50KXZhbHVlICogMjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1BWENILCAmdmFsdWUpOworCSpudW1fY2hhbm5lbHMgPSAoaW50KXZhbHVlOworfQorCisvKgorICoJaTU0MDBfcHJvYmUxCVByb2JlIGZvciBPTkUgaW5zdGFuY2Ugb2YgZGV2aWNlIHRvIHNlZSBpZiBpdCBpcworICoJCQlwcmVzZW50LgorICoJcmV0dXJuOgorICoJCTAgZm9yIEZPVU5EIGEgZGV2aWNlCisgKgkJPCAwIGZvciBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaTU0MDBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgZGV2X2lkeCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCWludCBudW1fY2hhbm5lbHM7CisJaW50IG51bV9kaW1tc19wZXJfY2hhbm5lbDsKKwlpbnQgbnVtX2Nzcm93czsKKworCWlmIChkZXZfaWR4ID49IEFSUkFZX1NJWkUoaTU0MDBfZGV2cykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKSwgcGRldiBidXMgJXUgZGV2PTB4JXggZm49MHgleFxuIiwKKwkJX19mdW5jX18sCisJCXBkZXYtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwZGV2LT5kZXZmbiksIFBDSV9GVU5DKHBkZXYtPmRldmZuKSk7CisKKwkvKiBXZSBvbmx5IGFyZSBsb29raW5nIGZvciBmdW5jIDAgb2YgdGhlIHNldCAqLworCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBBc2sgdGhlIGRldmljZXMgZm9yIHRoZSBudW1iZXIgb2YgQ1NST1dTIGFuZCBDSEFOTkVMUyBzbworCSAqIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgbWVtb3J5IHJlc291cmNlcywgZXRjCisJICoKKwkgKiBUaGUgQ2hpcHNldCB3aWxsIHJlcG9ydCB3aGF0IGl0IGNhbiBoYW5kbGUgd2hpY2ggd2lsbCBiZSBncmVhdGVyCisJICogb3IgZXF1YWwgdG8gd2hhdCB0aGUgbW90aGVyYm9hcmQgbWFudWZhY3R1cmVyIHdpbGwgaW1wbGVtZW50LgorCSAqCisJICogQXMgd2UgZG9uJ3QgaGF2ZSBhIG1vdGhlcmJvYXJkIGlkZW50aWZpY2F0aW9uIHJvdXRpbmUgdG8gZGV0ZXJtaW5lCisJICogYWN0dWFsIG51bWJlciBvZiBzbG90cy9kaW1tcyBwZXIgY2hhbm5lbCwgd2UgdGh1cyB1dGlsaXplIHRoZQorCSAqIHJlc291cmNlIGFzIHNwZWNpZmllZCBieSB0aGUgY2hpcHNldC4gVGh1cywgd2UgbWlnaHQgaGF2ZQorCSAqIGhhdmUgbW9yZSBESU1NcyBwZXIgY2hhbm5lbCB0aGFuIGFjdHVhbGx5IG9uIHRoZSBtb2JvLCBidXQgdGhpcworCSAqIGFsbG93cyB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdXB0byB0aGUgY2hpcHNldCBtYXgsIHdpdGhvdXQKKwkgKiBzb21lIGZhbmN5IG1vYm8gZGV0ZXJtaW5hdGlvbi4KKwkgKi8KKwlpNTQwMF9nZXRfZGltbV9hbmRfY2hhbm5lbF9jb3VudHMocGRldiwgJm51bV9kaW1tc19wZXJfY2hhbm5lbCwKKwkJCQkJJm51bV9jaGFubmVscyk7CisJbnVtX2Nzcm93cyA9IG51bV9kaW1tc19wZXJfY2hhbm5lbCAqIDI7CisKKwlkZWJ1Z2YwKCJNQzogJXMoKTogTnVtYmVyIG9mIC0gQ2hhbm5lbHM9ICVkICBESU1NUz0gJWQgIENTUk9XUz0gJWRcbiIsCisJCV9fZnVuY19fLCBudW1fY2hhbm5lbHMsIG51bV9kaW1tc19wZXJfY2hhbm5lbCwgbnVtX2Nzcm93cyk7CisKKwkvKiBhbGxvY2F0ZSBhIG5ldyBNQyBjb250cm9sIHN0cnVjdHVyZSAqLworCW1jaSA9IGVkYWNfbWNfYWxsb2Moc2l6ZW9mKCpwdnQpLCBudW1fY3Nyb3dzLCBudW1fY2hhbm5lbHMsIDApOworCisJaWYgKG1jaSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCk6IG1jaSA9ICVwXG4iLCBfX2Z1bmNfXywgbWNpKTsKKworCW1jaS0+ZGV2ID0gJnBkZXYtPmRldjsJLyogcmVjb3JkIHB0ciAgdG8gdGhlIGdlbmVyaWMgZGV2aWNlICovCisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCXB2dC0+c3lzdGVtX2FkZHJlc3MgPSBwZGV2OwkvKiBSZWNvcmQgdGhpcyBkZXZpY2UgaW4gb3VyIHByaXZhdGUgKi8KKwlwdnQtPm1heGNoID0gbnVtX2NoYW5uZWxzOworCXB2dC0+bWF4ZGltbXBlcmNoID0gbnVtX2RpbW1zX3Blcl9jaGFubmVsOworCisJLyogJ2dldCcgdGhlIHBjaSBkZXZpY2VzIHdlIHdhbnQgdG8gcmVzZXJ2ZSBmb3Igb3VyIHVzZSAqLworCWlmIChpNTQwMF9nZXRfZGV2aWNlcyhtY2ksIGRldl9pZHgpKQorCQlnb3RvIGZhaWwwOworCisJLyogVGltZSB0byBnZXQgc2VyaW91cyAqLworCWk1NDAwX2dldF9tY19yZWdzKG1jaSk7CS8qIHJldHJpZXZlIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgKi8KKworCW1jaS0+bWNfaWR4ID0gMDsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0ZCX0REUjI7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9ICJpNTQwMF9lZGFjLmMiOworCW1jaS0+bW9kX3ZlciA9IEk1NDAwX1JFVklTSU9OOworCW1jaS0+Y3RsX25hbWUgPSBpNTQwMF9kZXZzW2Rldl9pZHhdLmN0bF9uYW1lOworCW1jaS0+ZGV2X25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJLyogU2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIGFuIGFjdHVhbCBvcGVyYXRpb24gZnVuY3Rpb24gKi8KKwltY2ktPmVkYWNfY2hlY2sgPSBpNTQwMF9jaGVja19lcnJvcjsKKworCS8qIGluaXRpYWxpemUgdGhlIE1DIGNvbnRyb2wgc3RydWN0dXJlICdjc3Jvd3MnIHRhYmxlCisJICogd2l0aCB0aGUgbWFwcGluZyBhbmQgY29udHJvbCBpbmZvcm1hdGlvbiAqLworCWlmIChpNTQwMF9pbml0X2Nzcm93cyhtY2kpKSB7CisJCWRlYnVnZjAoIk1DOiBTZXR0aW5nIG1jaS0+ZWRhY19jYXAgdG8gRURBQ19GTEFHX05PTkVcbiIKKwkJCSIgICAgYmVjYXVzZSBpNTQwMF9pbml0X2Nzcm93cygpIHJldHVybmVkIG5vbnplcm8gIgorCQkJInZhbHVlXG4iKTsKKwkJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOwkvKiBubyBjc3Jvd3MgZm91bmQgKi8KKwl9IGVsc2UgeworCQlkZWJ1Z2YxKCJNQzogRW5hYmxlIGVycm9yIHJlcG9ydGluZyBub3dcbiIpOworCQlpNTQwMF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nKG1jaSk7CisJfQorCisJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fCisJCQkiOiAlcygpOiBmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIiwgX19mdW5jX18pOworCQkvKiBGSVhNRTogcGVyaGFwcyBzb21lIGNvZGUgc2hvdWxkIGdvIGhlcmUgdGhhdCBkaXNhYmxlcyBlcnJvcgorCQkgKiByZXBvcnRpbmcgaWYgd2UganVzdCBlbmFibGVkIGl0CisJCSAqLworCQlnb3RvIGZhaWwxOworCX0KKworCWk1NDAwX2NsZWFyX2Vycm9yKG1jaSk7CisKKwkvKiBhbGxvY2F0aW5nIGdlbmVyaWMgUENJIGNvbnRyb2wgaW5mbyAqLworCWk1NDAwX3BjaSA9IGVkYWNfcGNpX2NyZWF0ZV9nZW5lcmljX2N0bCgmcGRldi0+ZGV2LCBFREFDX01PRF9TVFIpOworCWlmICghaTU0MDBfcGNpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlcygpOiBVbmFibGUgdG8gY3JlYXRlIFBDSSBjb250cm9sXG4iLAorCQkJX19mdW5jX18pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXMoKTogUENJIGVycm9yIHJlcG9ydCB2aWEgRURBQyBub3Qgc2V0dXBcbiIsCisJCQlfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIDA7CisKKwkvKiBFcnJvciBleGl0IHVud2luZGluZyBzdGFjayAqLworZmFpbDE6CisKKwlpNTQwMF9wdXRfZGV2aWNlcyhtY2kpOworCitmYWlsMDoKKwllZGFjX21jX2ZyZWUobWNpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqCWk1NDAwX2luaXRfb25lCWNvbnN0cnVjdG9yIGZvciBvbmUgaW5zdGFuY2Ugb2YgZGV2aWNlCisgKgorICogCXJldHVybnM6CisgKgkJbmVnYXRpdmUgb24gZXJyb3IKKyAqCQljb3VudCAoPj0gMCkKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaTU0MDBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHdha2UgdXAgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMgPT0gLUVJTykKKwkJcmV0dXJuIHJjOworCisJLyogbm93IHByb2JlIGFuZCBlbmFibGUgdGhlIGRldmljZSAqLworCXJldHVybiBpNTQwMF9wcm9iZTEocGRldiwgaWQtPmRyaXZlcl9kYXRhKTsKK30KKworLyoKKyAqCWk1NDAwX3JlbW92ZV9vbmUJZGVzdHJ1Y3RvciBmb3Igb25lIGluc3RhbmNlIG9mIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGk1NDAwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCisJZGVidWdmMChfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoaTU0MDBfcGNpKQorCQllZGFjX3BjaV9yZWxlYXNlX2dlbmVyaWNfY3RsKGk1NDAwX3BjaSk7CisKKwltY2kgPSBlZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKKwlpZiAoIW1jaSkKKwkJcmV0dXJuOworCisJLyogcmV0cmlldmUgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMsIGFuZCBmcmVlIHRob3NlIHJlc291cmNlcyAqLworCWk1NDAwX3B1dF9kZXZpY2VzKG1jaSk7CisKKwllZGFjX21jX2ZyZWUobWNpKTsKK30KKworLyoKKyAqCXBjaV9kZXZpY2VfaWQJdGFibGUgZm9yIHdoaWNoIGRldmljZXMgd2UgYXJlIGxvb2tpbmcgZm9yCisgKgorICoJVGhlICJFNTAwUCIgZGV2aWNlIGlzIHRoZSBmaXJzdCBkZXZpY2Ugc3VwcG9ydGVkLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTU0MDBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUil9LAorCXswLH0JCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpNTQwMF9wY2lfdGJsKTsKKworLyoKKyAqCWk1NDAwX2RyaXZlcglwY2lfZHJpdmVyIHN0cnVjdHVyZSBmb3IgdGhpcyBtb2R1bGUKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpNTQwMF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaTU0MDBfZWRhYyIsCisJLnByb2JlID0gaTU0MDBfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGk1NDAwX3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZSA9IGk1NDAwX3BjaV90YmwsCit9OworCisvKgorICoJaTU0MDBfaW5pdAkJTW9kdWxlIGVudHJ5IGZ1bmN0aW9uCisgKgkJCVRyeSB0byBpbml0aWFsaXplIHRoaXMgbW9kdWxlIGZvciBpdHMgZGV2aWNlcworICovCitzdGF0aWMgaW50IF9faW5pdCBpNTQwMF9pbml0KHZvaWQpCit7CisJaW50IHBjaV9yYzsKKworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlwY2lfcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpNTQwMF9kcml2ZXIpOworCisJcmV0dXJuIChwY2lfcmMgPCAwKSA/IHBjaV9yYyA6IDA7Cit9CisKKy8qCisgKglpNTQwMF9leGl0KCkJTW9kdWxlIGV4aXQgZnVuY3Rpb24KKyAqCQkJVW5yZWdpc3RlciB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpNTQwMF9leGl0KHZvaWQpCit7CisJZGVidWdmMigiTUM6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTU0MDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaTU0MDBfaW5pdCk7Cittb2R1bGVfZXhpdChpNTQwMF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuIFdvb2RhcmQgPHdvb2RhcmRAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBJbmMuIChodHRwOi8vd3d3LnJlZGhhdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIERyaXZlciBmb3IgSW50ZWwgSTU0MDAgbWVtb3J5IGNvbnRyb2xsZXJzIC0gIgorCQkgICBJNTQwMF9SRVZJU0lPTik7CisKK21vZHVsZV9wYXJhbShlZGFjX29wX3N0YXRlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlZGFjX29wX3N0YXRlLCAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwxPU5NSSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCmluZGV4IGViYjAzN2IuLmIyZDgzYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKQEAgLTMxMSw5ICszMTEsNyBAQAogCX0KIAogCS8qIGNhY2hlIGlzIGlycmVsZXZhbnQgZm9yIFBDSSBidXMgcmVhZHMvd3JpdGVzICovCi0Jd2luZG93ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJCSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOwotCisJd2luZG93ID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKHdpbmRvdyA9PSBOVUxMKSB7CiAJCWk4Mjg3NXBfcHJpbnRrKEtFUk5fRVJSLCAiJXMoKTogRmFpbGVkIHRvIGlvcmVtYXAgYmFyNlxuIiwKIAkJCV9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCAwY2ZjYjJkLi44NTNlZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC02MzAsMjcgKzYzMCwyMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X2wyX2Vycl9vZl9tYXRjaFtdID0gewotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCisvKiBkZXByZWNhdGUgdGhlIGZzbCw4NS4uIGZvcm1zIGluIHRoZSBmdXR1cmUsIDIuNi4zMD8gKi8KKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKQEAgLTk2NywyNyArOTYyLDIyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoW10gPSB7Ci0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciIsCi0JIH0sCisvKiBkZXByZWNhdGUgdGhlIGZzbCw4NS4uIGZvcm1zIGluIHRoZSBmdXR1cmUsIDIuNi4zMD8gKi8KKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTU1LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQxLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTU1LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTYwLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LW1lbW9yeS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1lbW9yeS1jb250cm9sbGVyIiwgfSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCmluZGV4IGU4ODBkNmMuLjVhNzZkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJfQogCiAJZG1pX2Rldi0+Y2xhc3MgPSAmZG1pX2NsYXNzOwotCXN0cmNweShkbWlfZGV2LT5idXNfaWQsICJpZCIpOworCWRldl9zZXRfbmFtZShkbWlfZGV2LCAiaWQiKTsKIAlkbWlfZGV2LT5ncm91cHMgPSBzeXNfZG1pX2F0dHJpYnV0ZV9ncm91cHM7CiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNzhiOTg5ZC4uZDc2YWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtNDY4LDggKzQ2OCw4IEBACiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwogCiAvKioKLSAqCWRtaV9uYW1lX2luX3NlcmlhbCAtIAlDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbAotICoJCQkJaW5mb3JtYXRpb24uCisgKiBkbWlfbmFtZV9pbl9zZXJpYWwgLSBDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbCBpbmZvcm1hdGlvbgorICogQHN0cjogc3RyaW5nIHRvIGNoZWNrIGZvcgogICovCiBpbnQgZG1pX25hbWVfaW5fc2VyaWFsKGNvbnN0IGNoYXIgKnN0cikKIHsKQEAgLTU4NSw2ICs1ODUsOCBAQAogCiAvKioKICAqIGRtaV9tYXRjaCAtIGNvbXBhcmUgYSBzdHJpbmcgdG8gdGhlIGRtaSBmaWVsZCAoaWYgZXhpc3RzKQorICogQGY6IERNSSBmaWVsZCBpZGVudGlmaWVyCisgKiBAc3RyOiBzdHJpbmcgdG8gY29tcGFyZSB0aGUgRE1JIGZpZWxkIHRvCiAgKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgZXF1YWxzIHRvIHRoZSBzdHIgKGluY2x1ZGluZyBOVUxMKS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0OGY0OWQ5Li4zZDI1NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtOTUsNyArOTUsNyBAQAogCSAgbnVtYmVyIGZvciB0aGVzZSBHUElPcy4KIAogY29uZmlnIEdQSU9fUENBOTUzWAotCXRyaXN0YXRlICJQQ0E5NTN4LCBQQ0E5NTV4LCBhbmQgTUFYNzMxMCBJL08gcG9ydHMiCisJdHJpc3RhdGUgIlBDQTk1M3gsIFBDQTk1NXgsIFRDQTY0eHgsIGFuZCBNQVg3MzEwIEkvTyBwb3J0cyIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBwcm92aWRlIGFjY2VzcyB0byBzZXZlcmFsIHJlZ2lzdGVyLW9yaWVudGVkCkBAIC0xMDQsOSArMTA0LDEwIEBACiAKIAkgIDQgYml0czoJcGNhOTUzNiwgcGNhOTUzNwogCi0JICA4IGJpdHM6CW1heDczMTAsIHBjYTk1MzQsIHBjYTk1MzgsIHBjYTk1NTQsIHBjYTk1NTcKKwkgIDggYml0czoJbWF4NzMxMCwgcGNhOTUzNCwgcGNhOTUzOCwgcGNhOTU1NCwgcGNhOTU1NywKKwkgIAkJdGNhNjQwOAogCi0JICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1CisJICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1LCB0Y2E2NDE2CiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHBjYTk1M3guCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA4MjAyMGFiLi4zNWU3YWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCWlmIChkZXYpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzLyVzIiwKIAkJCQlkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCi0JCQkJZGV2LT5idXNfaWQpOworCQkJCWRldl9uYW1lKGRldikpOwogCQlpZiAoY2hpcC0+bGFiZWwpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzIiwgY2hpcC0+bGFiZWwpOwogCQlpZiAoY2hpcC0+Y2FuX3NsZWVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggOWNlZWI4OS4uMzdmMzUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCkBAIC0zMyw3ICszMywxMiBAQAogCXsgInBjYTk1NTQiLCA4LCB9LAogCXsgInBjYTk1NTUiLCAxNiwgfSwKIAl7ICJwY2E5NTU3IiwgOCwgfSwKKwogCXsgIm1heDczMTAiLCA4LCB9LAorCXsgInBjYTYxMDciLCA4LCB9LAorCXsgInRjYTY0MDgiLCA4LCB9LAorCXsgInRjYTY0MTYiLCAxNiwgfSwKKwkvKiBOWUVUOiAgeyAidGNhNjQyNCIsIDI0LCB9LCAqLwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2E5NTN4X2lkKTsKQEAgLTQ3LDkgKzUyLDYgQEAKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKIH07CiAKLS8qIE5PVEU6ICB3ZSBjYW4ndCBjdXJyZW50bHkgcmVseSBvbiBmYXVsdCBjb2RlcyB0byBjb21lIGZyb20gU01CdXMKLSAqIGNhbGxzLCBzbyB3ZSBtYXAgYWxsIGVycm9ycyB0byBFSU8gaGVyZSBhbmQgcmV0dXJuIHplcm8gb3RoZXJ3aXNlLgotICovCiBzdGF0aWMgaW50IHBjYTk1M3hfd3JpdGVfcmVnKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHVpbnQxNl90IHZhbCkKIHsKIAlpbnQgcmV0OwpAQCAtNjEsNyArNjMsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtNzgsNyArODAsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCSp2YWwgPSAodWludDE2X3QpcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCmluZGV4IDM3ZDNlZWMuLmFmYWQxNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKQEAgLTIwMiwzNyArMjAyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogQ29uZmlndXJlIGRlYm91bmNlIHRpbWluZyB2YWx1ZSBmb3IgYSBHUElPIHBpbiBvbiBUV0w0MDMwCi0gKi8KLWludCB0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKGludCBncGlvLCBpbnQgZW5hYmxlKQotewotCXU4IGRfYm5rID0gZ3BpbyA+PiAzOwotCXU4IGRfbXNrID0gQklUKGdwaW8gJiAweDcpOwotCXU4IHJlZyA9IDA7Ci0JdTggYmFzZSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodW5saWtlbHkoKGdwaW8gPj0gVFdMNDAzMF9HUElPX01BWCkKLQkJfHwgIShncGlvX3VzYWdlX2NvdW50ICYgQklUKGdwaW8pKSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQliYXNlID0gUkVHX0dQSU9fREVCRU4xICsgZF9ibms7Ci0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQlyZXQgPSBncGlvX3R3bDQwMzBfcmVhZChiYXNlKTsKLQlpZiAocmV0ID49IDApIHsKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyA9IHJldCB8IGRfbXNrOwotCQllbHNlCi0JCQlyZWcgPSByZXQgJiB+ZF9tc2s7Ci0KLQkJcmV0ID0gZ3Bpb190d2w0MDMwX3dyaXRlKGJhc2UsIHJlZyk7Ci0JfQotCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKTsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCB0d2xfcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCkBAIC00MDUsNiArMzc0LDIzIEBACiAJCQkJUkVHX0dQSU9QVVBEQ1RSMSwgNSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fdHdsNDAzMF9kZWJvdW5jZSh1MzIgZGVib3VuY2UsIHU4IG1tY19jZCkKK3sKKwl1OAkJbWVzc2FnZVs0XTsKKworCS8qIDMwIG1zZWMgb2YgZGVib3VuY2luZyBpcyBhbHdheXMgdXNlZCBmb3IgTU1DIGNhcmQgZGV0ZWN0LAorCSAqIGFuZCBpcyBvcHRpb25hbCBmb3IgZXZlcnl0aGluZyBlbHNlLgorCSAqLworCW1lc3NhZ2VbMV0gPSAoZGVib3VuY2UgJiAweGZmKSB8IChtbWNfY2QgJiAweDAzKTsKKwlkZWJvdW5jZSA+Pj0gODsKKwltZXNzYWdlWzJdID0gKGRlYm91bmNlICYgMHhmZik7CisJZGVib3VuY2UgPj49IDg7CisJbWVzc2FnZVszXSA9IChkZWJvdW5jZSAmIDB4MDMpOworCisJcmV0dXJuIHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCisJCQkJUkVHX0dQSU9fREVCRU4xLCAzKTsKK30KKwogc3RhdGljIGludCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTQzOSw2ICs0MjUsMTIgQEAKIAkJCQlwZGF0YS0+cHVsbHVwcywgcGRhdGEtPnB1bGxkb3ducywKIAkJCQlyZXQpOwogCisJcmV0ID0gZ3Bpb190d2w0MDMwX2RlYm91bmNlKHBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCk7CisJaWYgKHJldCkKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZGVib3VuY2UgJS4wM3ggJS4wMXggLS0+ICVkXG4iLAorCQkJCXBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCwKKwkJCQlyZXQpOworCiAJdHdsX2dwaW9jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwogCXR3bF9ncGlvY2hpcC5uZ3BpbyA9IFRXTDQwMzBfR1BJT19NQVg7CiAJdHdsX2dwaW9jaGlwLmRldiA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYwppbmRleCBmZWJiNTE3Li41ZmY4OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKQEAgLTMxNCwxNCArMzE0LDE0IEBACiAJCURSTV9ERUJVRygibXRycl9kZWw9JWRcbiIsIHJldHZhbCk7CiAJfQogCisJaWYgKGRldi0+ZHJpdmVyLT51bmxvYWQpCisJCWRldi0+ZHJpdmVyLT51bmxvYWQoZGV2KTsKKwogCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikgJiYgZGV2LT5hZ3ApIHsKIAkJZHJtX2ZyZWUoZGV2LT5hZ3AsIHNpemVvZigqZGV2LT5hZ3ApLCBEUk1fTUVNX0FHUExJU1RTKTsKIAkJZGV2LT5hZ3AgPSBOVUxMOwogCX0KIAotCWlmIChkZXYtPmRyaXZlci0+dW5sb2FkKQotCQlkZXYtPmRyaXZlci0+dW5sb2FkKGRldik7Ci0KIAlkcm1faHRfcmVtb3ZlKCZkZXYtPm1hcF9oYXNoKTsKIAlkcm1fY3R4Yml0bWFwX2NsZWFudXAoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCAzNzMzZTM2Li5iMDZhNTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMTgzLDYgKzE4MywxMCBAQAogCiAJb2xkX2ZvcHMgPSBmaWxwLT5mX29wOwogCWZpbHAtPmZfb3AgPSBmb3BzX2dldCgmZGV2LT5kcml2ZXItPmZvcHMpOworCWlmIChmaWxwLT5mX29wID09IE5VTEwpIHsKKwkJZmlscC0+Zl9vcCA9IG9sZF9mb3BzOworCQlnb3RvIG91dDsKKwl9CiAJaWYgKGZpbHAtPmZfb3AtPm9wZW4gJiYgKGVyciA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsIGZpbHApKSkgewogCQlmb3BzX3B1dChmaWxwLT5mX29wKTsKIAkJZmlscC0+Zl9vcCA9IGZvcHNfZ2V0KG9sZF9mb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwppbmRleCA2NWQ3MmQwLi41YWE2NzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCkBAIC00ODgsNyArNDg4LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG1pbm9yX3N0ciA9ICJjYXJkJWQiOwogCi0Jc25wcmludGYobWlub3ItPmtkZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgbWlub3Jfc3RyLCBtaW5vci0+aW5kZXgpOworCWRldl9zZXRfbmFtZSgmbWlub3ItPmtkZXYsIG1pbm9yX3N0ciwgbWlub3ItPmluZGV4KTsKIAogCWVyciA9IGRldmljZV9yZWdpc3RlcigmbWlub3ItPmtkZXYpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKaW5kZXggZGQ1N2E1Yi4uNzkzY2JhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAKIAkgIGludGVsX2NydC5vIFwKIAkgIGludGVsX2x2ZHMubyBcCiAJICBpbnRlbF9iaW9zLm8gXAorCSAgaW50ZWxfaGRtaS5vIFwKIAkgIGludGVsX3Nkdm8ubyBcCiAJICBpbnRlbF9tb2Rlcy5vIFwKIAkgIGludGVsX2kyYy5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IDNkNzA4MmEuLjYyYTRiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtODI3LDYgKzgyNyw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZV9kZXY7CiAJdTE2IHRtcCA9IDA7CiAJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKKwl1bnNpZ25lZCBsb25nIHN0b2xlbjsKIAogCWJyaWRnZV9kZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7CiAJaWYgKCFicmlkZ2VfZGV2KSB7CkBAIC04NjYsMzYgKzg2Nyw1NSBAQAogCWVsc2UKIAkJb3ZlcmhlYWQgPSAoKmFwZXJ0dXJlX3NpemUgLyAxMDI0KSArIDQwOTY7CiAKLQlzd2l0Y2ggKHRtcCAmIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLKSB7Ci0JY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzFNOgotCQlicmVhazsgLyogMU0gYWxyZWFkeSAqLwotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl80TToKLQkJKnByZWFsbG9jYXRlZF9zaXplICo9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl84TToKLQkJKnByZWFsbG9jYXRlZF9zaXplICo9IDg7Ci0JCWJyZWFrOwotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xNk06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKLQkJKnByZWFsbG9jYXRlZF9zaXplICo9IDMyOwotCQlicmVhazsKLQljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzQ4TToKLQkJKnByZWFsbG9jYXRlZF9zaXplICo9IDQ4OwotCQlicmVhazsKLQljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzY0TToKLQkJKnByZWFsbG9jYXRlZF9zaXplICo9IDY0OwotCQlicmVhazsKKwlzd2l0Y2ggKHRtcCAmIElOVEVMX0dNQ0hfR01TX01BU0spIHsKIAljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19ESVNBQkxFRDoKIAkJRFJNX0VSUk9SKCJ2aWRlbyBtZW1vcnkgaXMgZGlzYWJsZWRcbiIpOwogCQlyZXR1cm4gLTE7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzFNOgorCQlzdG9sZW4gPSAxICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl80TToKKwkJc3RvbGVuID0gNCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fOE06CisJCXN0b2xlbiA9IDggKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzE2TToKKwkJc3RvbGVuID0gMTYgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKKwkJc3RvbGVuID0gMzIgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE06CisJCXN0b2xlbiA9IDQ4ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfOTE1R19HTUNIX0dNU19TVE9MRU5fNjRNOgorCQlzdG9sZW4gPSA2NCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8xMjhNOgorCQlzdG9sZW4gPSAxMjggKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMjU2TToKKwkJc3RvbGVuID0gMjU2ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzk2TToKKwkJc3RvbGVuID0gOTYgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTYwTToKKwkJc3RvbGVuID0gMTYwICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzIyNE06CisJCXN0b2xlbiA9IDIyNCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8zNTJNOgorCQlzdG9sZW4gPSAzNTIgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJ1bmV4cGVjdGVkIEdNQ0hfR01TIHZhbHVlOiAweCUwMnhcbiIsCi0JCQl0bXAgJiBJTlRFTF84NTVfR01DSF9HTVNfTUFTSyk7CisJCQl0bXAgJiBJTlRFTF9HTUNIX0dNU19NQVNLKTsKIAkJcmV0dXJuIC0xOwogCX0KLQkqcHJlYWxsb2NhdGVkX3NpemUgLT0gb3ZlcmhlYWQ7CisJKnByZWFsbG9jYXRlZF9zaXplID0gc3RvbGVuIC0gb3ZlcmhlYWQ7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IDQ3NTZlNWMuLjU2M2RlMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtNjY0LDYgKzY2NCw3IEBACiAJCQkJIHdyaXRlbCh1cHBlcl8zMl9iaXRzKHZhbCksIGRldl9wcml2LT5yZWdzICsgXAogCQkJCQkocmVnKSArIDQpKQogI2VuZGlmCisjZGVmaW5lIFBPU1RJTkdfUkVBRChyZWcpCSh2b2lkKUk5MTVfUkVBRChyZWcpCiAKICNkZWZpbmUgSTkxNV9WRVJCT1NFIDAKIApAQCAtNzYwLDYgKzc2MSw3IEBACiAJCQlJU19JOTQ1R00oZGV2KSB8fCBJU19JOTY1R00oZGV2KSB8fCBJU19HTTQ1KGRldikpCiAKICNkZWZpbmUgSTkxNV9ORUVEX0dGWF9IV1MoZGV2KSAoSVNfRzMzKGRldikgfHwgSVNfR000NShkZXYpIHx8IElTX0c0WChkZXYpKQorI2RlZmluZSBTVVBQT1JUU19JTlRFR1JBVEVEX0hETUkoZGV2KQkoSVNfRzRYKGRldikpCiAKICNkZWZpbmUgUFJJTUFSWV9SSU5HQlVGRkVSX1NJWkUgICAgICAgICAoMTI4KjEwMjQpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IGNjMmNhNTUuLjE0YWZjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMTYyMyw2ICsxNjIzLDggQEAKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmZyZWVfc3BhY2U7CiAJaW50IHBhZ2VfY291bnQsIHJldDsKIAorCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKQorCQlyZXR1cm4gLUVCVVNZOwogCWlmIChhbGlnbm1lbnQgPT0gMCkKIAkJYWxpZ25tZW50ID0gUEFHRV9TSVpFOwogCWlmIChhbGlnbm1lbnQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKQEAgLTI2NDEsNyArMjY0Myw3IEBACiAJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgewogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBhbGlnbm1lbnQpOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJaWYgKHJldCAhPSAtRUJVU1kgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJCQlEUk1fRVJST1IoIkZhaWx1cmUgdG8gYmluZDogJWQiLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMzIxOSwyMCArMzIyMSwyMSBAQAogCQlkZXZfcHJpdi0+bW0ud2VkZ2VkID0gMDsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KIAlkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcgPSBpb19tYXBwaW5nX2NyZWF0ZV93YyhkZXYtPmFncC0+YmFzZSwKIAkJCQkJCQlkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplCiAJCQkJCQkJKiAxMDI0ICogMTAyNCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CisKKwlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSk7Ci0JZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlkcm1faXJxX2luc3RhbGwoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDQ3ZTZiYWYuLjI3MzE2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBJTlRFTF9HTUNIX01FTV82NE0JMHgxCiAjZGVmaW5lIElOVEVMX0dNQ0hfTUVNXzEyOE0JMAogCi0jZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLCQkoMHg3IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX01BU0sJCSgweGYgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX0RJU0FCTEVECSgweDAgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTQkoMHgxIDw8IDQpCiAjZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE0JKDB4MiA8PCA0KQpAQCAtNDUsNiArNDUsMTIgQEAKIAogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE0JKDB4NiA8PCA0KQogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl82NE0JKDB4NyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTI4TQkoMHg4IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8yNTZNCSgweDkgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzk2TQkoMHhhIDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8xNjBNCSgweGIgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzIyNE0JKDB4YyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMzUyTQkoMHhkIDw8IDQpCiAKIC8qIFBDSSBjb25maWcgc3BhY2UgKi8KIApAQCAtNTQ5LDYgKzU1NSw4IEBACiAvKiogR005NjUgR000NSByZW5kZXIgc3RhbmRieSByZWdpc3RlciAqLwogI2RlZmluZSBNQ0hCQVJfUkVOREVSX1NUQU5EQlkJMHgxMTFCOAogCisjZGVmaW5lIFBFR19CQU5EX0dBUF9EQVRBCTB4MTRkNjgKKwogLyoKICAqIE92ZXJsYXkgcmVncwogICovCkBAIC02MTIsNiArNjIwLDkgQEAKIAogLyogSG90cGx1ZyBjb250cm9sICg5NDUrIG9ubHkpICovCiAjZGVmaW5lIFBPUlRfSE9UUExVR19FTgkJMHg2MTExMAorI2RlZmluZSAgIEhETUlCX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjkpCisjZGVmaW5lICAgSERNSUNfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyOCkKKyNkZWZpbmUgICBIRE1JRF9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDI3KQogI2RlZmluZSAgIFNEVk9CX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjYpCiAjZGVmaW5lICAgU0RWT0NfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyNSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDE4KQpAQCAtNjE5LDYgKzYzMCw5IEBACiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfRk9SQ0VfREVURUNUCQkoMSA8PCAzKQogCiAjZGVmaW5lIFBPUlRfSE9UUExVR19TVEFUCTB4NjExMTQKKyNkZWZpbmUgICBIRE1JQl9IT1RQTFVHX0lOVF9TVEFUVVMJCSgxIDw8IDI5KQorI2RlZmluZSAgIEhETUlDX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMjgpCisjZGVmaW5lICAgSERNSURfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAyNykKICNkZWZpbmUgICBDUlRfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAxMSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9TVEFUVVMJCQkoMSA8PCAxMCkKICNkZWZpbmUgICBDUlRfSE9UUExVR19NT05JVE9SX01BU0sJCSgzIDw8IDgpCkBAIC02NDgsNyArNjYyLDE2IEBACiAjZGVmaW5lICAgU0RWT19QSEFTRV9TRUxFQ1RfREVGQVVMVAkoNiA8PCAxOSkKICNkZWZpbmUgICBTRFZPX0NMT0NLX09VVFBVVF9JTlZFUlQJKDEgPDwgMTgpCiAjZGVmaW5lICAgU0RWT0NfR0FOR19NT0RFCQkoMSA8PCAxNikKKyNkZWZpbmUgICBTRFZPX0VOQ09ESU5HX1NEVk8JCSgweDAgPDwgMTApCisjZGVmaW5lICAgU0RWT19FTkNPRElOR19IRE1JCQkoMHgyIDw8IDEwKQorLyoqIFJlcXVpcmQgZm9yIEhETUkgb3BlcmF0aW9uICovCisjZGVmaW5lICAgU0RWT19OVUxMX1BBQ0tFVFNfRFVSSU5HX1ZTWU5DICgxIDw8IDkpCiAjZGVmaW5lICAgU0RWT19CT1JERVJfRU5BQkxFCQkoMSA8PCA3KQorI2RlZmluZSAgIFNEVk9fQVVESU9fRU5BQkxFCQkoMSA8PCA2KQorLyoqIE5ldyB3aXRoIDk2NSwgZGVmYXVsdCBpcyB0byBiZSBzZXQgKi8KKyNkZWZpbmUgICBTRFZPX1ZTWU5DX0FDVElWRV9ISUdICSgxIDw8IDQpCisvKiogTmV3IHdpdGggOTY1LCBkZWZhdWx0IGlzIHRvIGJlIHNldCAqLworI2RlZmluZSAgIFNEVk9fSFNZTkNfQUNUSVZFX0hJR0gJKDEgPDwgMykKICNkZWZpbmUgICBTRFZPQl9QQ0lFX0NPTkNVUlJFTkNZCSgxIDw8IDMpCiAjZGVmaW5lICAgU0RWT19ERVRFQ1RFRAkJCSgxIDw8IDIpCiAvKiBCaXRzIHRvIGJlIHByZXNlcnZlZCB3aGVuIHdyaXRpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBlNWMxYzgwLi44Y2NiOWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC03NTEsNiArNzUxLDcgQEAKIAkJCWlzX2x2ZHMgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CisJCWNhc2UgSU5URUxfT1VUUFVUX0hETUk6CiAJCQlpc19zZHZvID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CkBAIC05ODYsMTkgKzk4NywxNyBAQAogCXVpbnQzMl90IGJhc2UgPSAocGlwZSA9PSAwKSA/IENVUkFCQVNFIDogQ1VSQkJBU0U7CiAJdWludDMyX3QgdGVtcDsKIAlzaXplX3QgYWRkcjsKKwlpbnQgcmV0OwogCiAJRFJNX0RFQlVHKCJcbiIpOwogCiAJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vyc29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCiAJaWYgKCFoYW5kbGUpIHsKIAkJRFJNX0RFQlVHKCJjdXJzb3Igb2ZmXG4iKTsKLQkJLyogdHVybiBvZiB0aGUgY3Vyc29yICovCi0JCXRlbXAgPSAwOwotCQl0ZW1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7Ci0KLQkJSTkxNV9XUklURShjb250cm9sLCB0ZW1wKTsKLQkJSTkxNV9XUklURShiYXNlLCAwKTsKLQkJcmV0dXJuIDA7CisJCXRlbXAgPSBDVVJTT1JfTU9ERV9ESVNBQkxFOworCQlhZGRyID0gMDsKKwkJYm8gPSBOVUxMOworCQlnb3RvIGZpbmlzaDsKIAl9CiAKIAkvKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IDY0eDY0IGN1cnNvcnMgKi8KQEAgLTEwMjUsMTUgKzEwMjQsMzAgQEAKIAkJYWRkciA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OwogCX0KIAotCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGJvLCBQQUdFX1NJWkUpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIGN1cnNvciBib1xuIik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGJvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAl0ZW1wID0gMDsKIAkvKiBzZXQgdGhlIHBpcGUgZm9yIHRoZSBjdXJzb3IgKi8KIAl0ZW1wIHw9IChwaXBlIDw8IDI4KTsKIAl0ZW1wIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVggfCBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKIAorIGZpbmlzaDoKIAlJOTE1X1dSSVRFKGNvbnRyb2wsIHRlbXApOwogCUk5MTVfV1JJVEUoYmFzZSwgYWRkcik7CiAKKwlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvKSB7CisJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCX0KKworCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMwLDEyICsxNDQ0LDE5IEBACiAJCWludGVsX2x2ZHNfaW5pdChkZXYpOwogCiAJaWYgKElTX0k5WFgoZGV2KSkgewotCQlpbnRlbF9zZHZvX2luaXQoZGV2LCBTRFZPQik7Ci0JCWludGVsX3Nkdm9faW5pdChkZXYsIFNEVk9DKTsKKwkJaW50IGZvdW5kOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0IpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0IpOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0MpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0MpOwogCX0gZWxzZQogCQlpbnRlbF9kdm9faW5pdChkZXYpOwogCi0JaWYgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTkxNUcoZGV2KSkKKwlpZiAoSVNfSTlYWChkZXYpICYmIElTX01PQklMRShkZXYpKQogCQlpbnRlbF90dl9pbml0KGRldik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKQEAgLTE0NDUsNiArMTQ2NiwxMSBAQAogCiAJCS8qIHZhbGlkIGNydGNzICovCiAJCXN3aXRjaChpbnRlbF9vdXRwdXQtPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfSERNSToKKwkJCWNydGNfbWFzayA9ICgoMSA8PCAwKXwKKwkJCQkgICAgICgxIDw8IDEpKTsKKwkJCWNsb25lX21hc2sgPSAoKDEgPDwgSU5URUxfT1VUUFVUX0hETUkpKTsKKwkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CiAJCQljcnRjX21hc2sgPSAoKDEgPDwgMCl8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IDQwN2VkZDUuLjhhNGNjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC01Myw2ICs1Myw3IEBACiAjZGVmaW5lIElOVEVMX09VVFBVVF9TRFZPIDMKICNkZWZpbmUgSU5URUxfT1VUUFVUX0xWRFMgNAogI2RlZmluZSBJTlRFTF9PVVRQVVRfVFZPVVQgNQorI2RlZmluZSBJTlRFTF9PVVRQVVRfSERNSSA2CiAKICNkZWZpbmUgSU5URUxfRFZPX0NISVBfTk9ORSAwCiAjZGVmaW5lIElOVEVMX0RWT19DSElQX0xWRFMgMQpAQCAtODgsNiArODksNyBAQAogCXN0cnVjdCBkcm1fY3J0YyBiYXNlOwogCWludCBwaXBlOwogCWludCBwbGFuZTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKIAl1aW50MzJfdCBjdXJzb3JfYWRkcjsKIAl1OCBsdXRfclsyNTZdLCBsdXRfZ1syNTZdLCBsdXRfYlsyNTZdOwogCWludCBkcG1zX21vZGU7CkBAIC0xMDgsNyArMTEwLDggQEAKIGV4dGVybiBib29sIGludGVsX2RkY19wcm9iZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSk7CitleHRlcm4gdm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZyk7CitleHRlcm4gYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9kZXZpY2UpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF90dl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfbHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKglKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCitzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2IHsKKwl1MzIgc2R2b3hfcmVnOworCXUzMiBzYXZlX1NEVk9YOworCWludCBoYXNfaGRtaV9zaW5rOworfTsKKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgc2R2b3g7CisKKwlzZHZveCA9IFNEVk9fRU5DT0RJTkdfSERNSSB8CisJCVNEVk9fQk9SREVSX0VOQUJMRSB8CisJCVNEVk9fVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlTRFZPX0hTWU5DX0FDVElWRV9ISUdIOworCisJaWYgKGhkbWlfcHJpdi0+aGFzX2hkbWlfc2luaykKKwkJc2R2b3ggfD0gU0RWT19BVURJT19FTkFCTEU7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7CisKKwlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCBzZHZveCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcDsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJdGVtcCA9IEk5MTVfUkVBRChoZG1pX3ByaXYtPnNkdm94X3JlZyk7CisJCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIHRlbXAgJiB+U0RWT19FTkFCTEUpOworCX0gZWxzZSB7CisJCXRlbXAgPSBJOTE1X1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworCQlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCB0ZW1wIHwgU0RWT19FTkFCTEUpOworCX0KKwlQT1NUSU5HX1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2ICpoZG1pX3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCisJaGRtaV9wcml2LT5zYXZlX1NEVk9YID0gSTkxNV9SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKworCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIGhkbWlfcHJpdi0+c2F2ZV9TRFZPWCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIGludCBpbnRlbF9oZG1pX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCWlmIChtb2RlLT5jbG9jayA8IDIwMDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZXR1cm4gTU9ERV9OT19EQkxFU0NBTjsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9oZG1pX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2ludGVsX2hkbWlfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcCwgYml0OworCisJdGVtcCA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfRU4pOworCisJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfRU4sCisJCSAgIHRlbXAgfAorCQkgICBIRE1JQl9IT1RQTFVHX0lOVF9FTiB8CisJCSAgIEhETUlDX0hPVFBMVUdfSU5UX0VOIHwKKwkJICAgSERNSURfSE9UUExVR19JTlRfRU4pOworCisJUE9TVElOR19SRUFEKFBPUlRfSE9UUExVR19FTik7CisKKwlzd2l0Y2ggKGhkbWlfcHJpdi0+c2R2b3hfcmVnKSB7CisJY2FzZSBTRFZPQjoKKwkJYml0ID0gSERNSUJfSE9UUExVR19JTlRfU1RBVFVTOworCQlicmVhazsKKwljYXNlIFNEVk9DOgorCQliaXQgPSBIRE1JQ19IT1RQTFVHX0lOVF9TVEFUVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisJfQorCisJaWYgKChJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpICYgYml0KSAhPSAwKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJZWxzZQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaGRtaV9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCS8qIFdlIHNob3VsZCBwYXJzZSB0aGUgRURJRCBkYXRhIGFuZCBmaW5kIG91dCBpZiBpdCdzIGFuIEhETUkgc2luayBzbworCSAqIHdlIGNhbiBzZW5kIGF1ZGlvIHRvIGl0LgorCSAqLworCisJcmV0dXJuIGludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpZiAoaW50ZWxfb3V0cHV0LT5pMmNfYnVzKQorCQlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmkyY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBpbnRlbF9oZG1pX2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9oZG1pX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBpbnRlbF9lbmNvZGVyX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gaW50ZWxfaGRtaV9tb2RlX3NldCwKKwkuY29tbWl0ID0gaW50ZWxfZW5jb2Rlcl9jb21taXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaW50ZWxfaGRtaV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLnNhdmUgPSBpbnRlbF9oZG1pX3NhdmUsCisJLnJlc3RvcmUgPSBpbnRlbF9oZG1pX3Jlc3RvcmUsCisJLmRldGVjdCA9IGludGVsX2hkbWlfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9kZXN0cm95LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IGludGVsX2hkbWlfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkID0gaW50ZWxfaGRtaV9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIgPSBpbnRlbF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGludGVsX2hkbWlfZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9lbmNfZGVzdHJveSwKK307CisKKwordm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OworCXN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKmhkbWlfcHJpdjsKKworCWludGVsX291dHB1dCA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9vdXRwdXQpICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGludGVsX2hkbWlfcHJpdiksIDEsIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfb3V0cHV0KQorCQlyZXR1cm47CisJaGRtaV9wcml2ID0gKHN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKikoaW50ZWxfb3V0cHV0ICsgMSk7CisKKwljb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmludGVsX2hkbWlfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJaW50ZWxfb3V0cHV0LT50eXBlID0gSU5URUxfT1VUUFVUX0hETUk7CisKKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEREQyBidXMuICovCisJaWYgKHNkdm94X3JlZyA9PSBTRFZPQikKKwkJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIEdQSU9FLCAiSERNSUIiKTsKKwllbHNlCisJCWludGVsX291dHB1dC0+ZGRjX2J1cyA9IGludGVsX2kyY19jcmVhdGUoZGV2LCBHUElPRCwgIkhETUlDIik7CisKKwlpZiAoIWludGVsX291dHB1dC0+ZGRjX2J1cykKKwkJZ290byBlcnJfY29ubmVjdG9yOworCisJaGRtaV9wcml2LT5zZHZveF9yZWcgPSBzZHZveF9yZWc7CisJaW50ZWxfb3V0cHV0LT5kZXZfcHJpdiA9IGhkbWlfcHJpdjsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF9oZG1pX2VuY19mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmludGVsX291dHB1dC0+ZW5jLCAmaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbnRlbF9vdXRwdXQtPmJhc2UsCisJCQkJCSAgJmludGVsX291dHB1dC0+ZW5jKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCisJLyogRm9yIEc0WCBkZXNrdG9wIGNoaXAsIFBFR19CQU5EX0dBUF9EQVRBIDM6MCBtdXN0IGZpcnN0IGJlIHdyaXR0ZW4KKwkgKiAweGQuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIHNwdXJpb3VzIGludGVycnVwdHMgYmVpbmcKKwkgKiBnZW5lcmF0ZWQgb24gdGhlIHBvcnQgd2hlbiBhIGNhYmxlIGlzIG5vdCBhdHRhY2hlZC4KKwkgKi8KKwlpZiAoSVNfRzRYKGRldikgJiYgIUlTX0dNNDUoZGV2KSkgeworCQl1MzIgdGVtcCA9IEk5MTVfUkVBRChQRUdfQkFORF9HQVBfREFUQSk7CisJCUk5MTVfV1JJVEUoUEVHX0JBTkRfR0FQX0RBVEEsICh0ZW1wICYgfjB4ZikgfCAweGQpOworCX0KKworCXJldHVybjsKKworZXJyX2Nvbm5lY3RvcjoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShpbnRlbF9vdXRwdXQpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IGZiYmFhNGYuLjQwNzIxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogfTsKIAogCi12b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSkKK2Jvb2wgaW50ZWxfc2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfZGV2aWNlKQogewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIAlpbnRlbF9vdXRwdXQgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KStzaXplb2Yoc3RydWN0IGludGVsX3Nkdm9fcHJpdiksIDEsIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfb3V0cHV0KSB7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CkBAIC0xMTE2LDcgKzExMTYsNyBAQAogCiAJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaTJjYnVzOwogCi0JcmV0dXJuOworCXJldHVybiB0cnVlOwogCiBlcnJfaTJjOgogCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+aTJjX2J1cyk7CkBAIC0xMTI0LDUgKzExMjQsNSBAQAogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwogCWtmcmVlKGludGVsX291dHB1dCk7CiAKLQlyZXR1cm47CisJcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDYyLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYwppbmRleCA2NjEwN2I0Li4xODUyZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYwpAQCAtMjA0LDggKzIwNCw2IEBACiAjZGVmaW5lIE1BU0tfQU5EX1NISUZUKHZhbHVlLCBwcmVmaXgpCVwKIAkoKCh2YWx1ZSkgJiBwcmVmaXgjI19NQVNLKSA+PiBwcmVmaXgjI19TSElGVCkKIAotI2RlZmluZSBST1VORF9ESVYoeCwgZGl2aXNvcikgICgoKHgpICsgKChkaXZpc29yKSAvIDIpKSAvIChkaXZpc29yKSkKLQogc3RydWN0IGFkdDc0NjJfZGF0YSB7CiAJc3RydWN0IGRldmljZQkJKmh3bW9uX2RldjsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWF0dHJzOwpAQCAtODQwLDcgKzgzOCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApIHx8ICF0ZW1wX2VuYWJsZWQoZGF0YSwgYXR0ci0+aW5kZXgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCkgKyA2NDsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkgKyA2NDsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC04NzgsNyArODc2LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkgfHwgIXRlbXBfZW5hYmxlZChkYXRhLCBhdHRyLT5pbmRleCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKSArIDY0OworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKSArIDY0OwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTk0Myw3ICs5NDEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRlbXAgKj0gMTAwMDsgLyogY29udmVydCBtViB0byB1ViAqLwotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgeCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIHgpOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTk4NSw3ICs5ODMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRlbXAgKj0gMTAwMDsgLyogY29udmVydCBtViB0byB1ViAqLwotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgeCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIHgpOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTEyNTAsNyArMTI0OCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDE1KTsKIAogCS8qIHBhY2thZ2UgdGhpbmdzIHVwICovCkBAIC0xMzM3LDcgKzEzMzUsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApICsgNjQ7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApICsgNjQ7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwppbmRleCAxMzExYTU5Li42MzNlMWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyQywgMHgyRSwgMHgyRiwgSTJDX0NMSUVOVF9FTkQgfTsKQEAgLTc0LDYgKzc1LDcgQEAKICNkZWZpbmUgQURUNzQ3MF9SRUdfUFdNMTJfQ0ZHCQkJMHg2OAogI2RlZmluZQkJQURUNzQ3MF9QV00yX0FVVE9fTUFTSwkJMHg0MAogI2RlZmluZQkJQURUNzQ3MF9QV00xX0FVVE9fTUFTSwkJMHg4MAorI2RlZmluZQkJQURUNzQ3MF9QV01fQVVUT19NQVNLCQkweEMwCiAjZGVmaW5lIEFEVDc0NzBfUkVHX1BXTTM0X0NGRwkJCTB4NjkKICNkZWZpbmUJCUFEVDc0NzBfUFdNM19BVVRPX01BU0sJCTB4NDAKICNkZWZpbmUJCUFEVDc0NzBfUFdNNF9BVVRPX01BU0sJCTB4ODAKQEAgLTEyOCw4ICsxMzAsMTEgQEAKIC8qIEhvdyBvZnRlbiBkbyB3ZSByZXJlYWQgc2Vuc29yIGxpbWl0IHZhbHVlcz8gKEluIGppZmZpZXMpICovCiAjZGVmaW5lIExJTUlUX1JFRlJFU0hfSU5URVJWQUwJKDYwICogSFopCiAKLS8qIHNsZWVwIDFzIHdoaWxlIGdhdGhlcmluZyB0ZW1wZXJhdHVyZSBkYXRhICovCi0jZGVmaW5lIFRFTVBfQ09MTEVDVElPTl9USU1FCTEwMDAKKy8qIFdhaXQgYXQgbGVhc3QgMjAwbXMgcGVyIHNlbnNvciBmb3IgMTAgc2Vuc29ycyAqLworI2RlZmluZSBURU1QX0NPTExFQ1RJT05fVElNRQkyMDAwCisKKy8qIGF1dG8gdXBkYXRlIHRoaW5nIHdvbid0IGZpcmUgbW9yZSB0aGFuIGV2ZXJ5IDJzICovCisjZGVmaW5lIEFVVE9fVVBEQVRFX0lOVEVSVkFMCTIwMDAKIAogLyogZGF0YXNoZWV0IHNheXMgdG8gZGl2aWRlIHRoaXMgbnVtYmVyIGJ5IHRoZSBmYW4gcmVhZGluZyB0byBnZXQgZmFuIHJwbSAqLwogI2RlZmluZSBGQU5fUEVSSU9EX1RPX1JQTSh4KQkoKDkwMDAwICogNjApIC8gKHgpKQpAQCAtMTM3LDggKzE0Miw2IEBACiAjZGVmaW5lIEZBTl9QRVJJT0RfSU5WQUxJRAk2NTUzNQogI2RlZmluZSBGQU5fREFUQV9WQUxJRCh4KQkoKHgpICYmICh4KSAhPSBGQU5fUEVSSU9EX0lOVkFMSUQpCiAKLSNkZWZpbmUgUk9VTkRfRElWKHgsIGRpdmlzb3IpCSgoKHgpICsgKChkaXZpc29yKSAvIDIpKSAvIChkaXZpc29yKSkKLQogc3RydWN0IGFkdDc0NzBfZGF0YSB7CiAJc3RydWN0IGRldmljZQkJKmh3bW9uX2RldjsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWF0dHJzOwpAQCAtMTQ4LDYgKzE1MSw5IEBACiAJdW5zaWduZWQgbG9uZwkJc2Vuc29yc19sYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KIAl1bnNpZ25lZCBsb25nCQlsaW1pdHNfbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCiAKKwlpbnQJCQludW1fdGVtcF9zZW5zb3JzOwkvKiAtMSA9IHByb2JlICovCisJaW50CQkJdGVtcGVyYXR1cmVzX3Byb2JlZDsKKwogCXM4CQkJdGVtcFtBRFQ3NDcwX1RFTVBfQ09VTlRdOwogCXM4CQkJdGVtcF9taW5bQURUNzQ3MF9URU1QX0NPVU5UXTsKIAlzOAkJCXRlbXBfbWF4W0FEVDc0NzBfVEVNUF9DT1VOVF07CkBAIC0xNjMsNiArMTY5LDEwIEBACiAJdTgJCQlwd21fbWluW0FEVDc0NzBfUFdNX0NPVU5UXTsKIAlzOAkJCXB3bV90bWluW0FEVDc0NzBfUFdNX0NPVU5UXTsKIAl1OAkJCXB3bV9hdXRvX3RlbXBbQURUNzQ3MF9QV01fQ09VTlRdOworCisJc3RydWN0IHRhc2tfc3RydWN0CSphdXRvX3VwZGF0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbglhdXRvX3VwZGF0ZV9zdG9wOworCXVuc2lnbmVkIGludAkJYXV0b191cGRhdGVfaW50ZXJ2YWw7CiB9OwogCiBzdGF0aWMgaW50IGFkdDc0NzBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTIyMCw2ICsyMzAsODggQEAKIAl9CiB9CiAKKy8qIFByb2JlIGZvciB0ZW1wZXJhdHVyZSBzZW5zb3JzLiAgQXNzdW1lcyBsb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyBpbnQgYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwlpbnQgaTsKKwl1OCBjZmcsIHB3bVs0XSwgcHdtX2NmZ1syXTsKKworCS8qIHNhdmUgcHdtWzEtNF0gY29uZmlnIHJlZ2lzdGVyICovCisJcHdtX2NmZ1swXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMCkpOworCXB3bV9jZmdbMV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDIpKTsKKworCS8qIHNldCBtYW51YWwgcHdtIHRvIHdoYXRldmVyIGl0IGlzIHNldCB0byBub3cgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9GQU5fQ09VTlQ7IGkrKykKKwkJcHdtW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNKGkpKTsKKworCS8qIHB1dCBwd20gaW4gbWFudWFsIG1vZGUgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygwKSwKKwkJcHdtX2NmZ1swXSAmIH4oQURUNzQ3MF9QV01fQVVUT19NQVNLKSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMiksCisJCXB3bV9jZmdbMV0gJiB+KEFEVDc0NzBfUFdNX0FVVE9fTUFTSykpOworCisJLyogd3JpdGUgcHdtIGNvbnRyb2wgdG8gd2hhdGV2ZXIgaXQgd2FzICovCisJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfRkFOX0NPVU5UOyBpKyspCisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV00oaSksIHB3bVtpXSk7CisKKwkvKiBzdGFydCByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KKwljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOworCWNmZyB8PSAweDgwOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisKKwkvKiBEZWxheSBpcyAyMDBtcyAqIG51bWJlciBvZiB0ZW1wIHNlbnNvcnMuICovCisJcmVzID0gbXNsZWVwX2ludGVycnVwdGlibGUoKGRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPj0gMCA/CisJCQkJICAgIGRhdGEtPm51bV90ZW1wX3NlbnNvcnMgKiAyMDAgOgorCQkJCSAgICBURU1QX0NPTExFQ1RJT05fVElNRSkpOworCisJLyogZG9uZSByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KKwljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOworCWNmZyAmPSB+MHg4MDsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHLCBjZmcpOworCisJLyogcmVzdG9yZSBwd21bMS00XSBjb25maWcgcmVnaXN0ZXJzICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMCksIHB3bV9jZmdbMF0pOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDIpLCBwd21fY2ZnWzFdKTsKKworCWlmIChyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYSBoYSwgaW50ZXJydXB0ZWQiKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogT25seSBjb3VudCBmYW5zIGlmIHdlIGhhdmUgdG8gKi8KKwlpZiAoZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA+PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX1RFTVBfQ09VTlQ7IGkrKykgeworCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCUFEVDc0NzBfVEVNUF9SRUcoaSkpOworCQlpZiAoZGF0YS0+dGVtcFtpXSkKKwkJCWRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPSBpICsgMTsKKwl9CisJZGF0YS0+dGVtcGVyYXR1cmVzX3Byb2JlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQ3MF91cGRhdGVfdGhyZWFkKHZvaWQgKnApCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHA7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJCWFkdDc0NzBfcmVhZF90ZW1wZXJhdHVyZXMoY2xpZW50LCBkYXRhKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCk7CisJfQorCisJY29tcGxldGVfYWxsKCZkYXRhLT5hdXRvX3VwZGF0ZV9zdG9wKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBhZHQ3NDcwX2RhdGEgKmFkdDc0NzBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKQEAgLTIyNywzMiArMzE5LDM2IEBACiAJdW5zaWduZWQgbG9uZyBsb2NhbF9qaWZmaWVzID0gamlmZmllczsKIAl1OCBjZmc7CiAJaW50IGk7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKLQlpZiAodGltZV9iZWZvcmUobG9jYWxfamlmZmllcywgZGF0YS0+c2Vuc29yc19sYXN0X3VwZGF0ZWQgKwotCQlTRU5TT1JfUkVGUkVTSF9JTlRFUlZBTCkKLQkJJiYgZGF0YS0+c2Vuc29yc192YWxpZCkKLQkJZ290byBub19zZW5zb3JfdXBkYXRlOwotCi0JLyogc3RhcnQgcmVhZGluZyB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCi0JY2ZnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHKTsKLQljZmcgfD0gMHg4MDsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHLCBjZmcpOworCWludCBuZWVkX3NlbnNvcnMgPSAxOworCWludCBuZWVkX2xpbWl0cyA9IDE7CiAKIAkvKgotCSAqIERlbGF5IGlzIDIwMG1zICogbnVtYmVyIG9mIHRtcDA1IHNlbnNvcnMuICBUb28gYmFkCi0JICogdGhlcmUncyBubyB3YXkgdG8gZmlndXJlIG91dCBob3cgbWFueSBhcmUgY29ubmVjdGVkLgotCSAqIEZvciBub3csIGFzc3VtZSAxcyB3aWxsIHdvcmsuCisJICogRmlndXJlIG91dCBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2hhZG93IHJlZ2lzdGVycy4KKwkgKiBMb2NrbGVzcyBtZWFucyB0aGF0IHdlIG1heSBvY2Nhc2lvbmFsbHkgcmVwb3J0IG91dCBvZgorCSAqIGRhdGUgZGF0YS4KIAkgKi8KLQltc2xlZXAoVEVNUF9DT0xMRUNUSU9OX1RJTUUpOworCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5zZW5zb3JzX2xhc3RfdXBkYXRlZCArCisJCQlTRU5TT1JfUkVGUkVTSF9JTlRFUlZBTCkgJiYKKwkgICAgZGF0YS0+c2Vuc29yc192YWxpZCkKKwkJbmVlZF9zZW5zb3JzID0gMDsKIAotCS8qIGRvbmUgcmVhZGluZyB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCi0JY2ZnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHKTsKLQljZmcgJj0gfjB4ODA7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywgY2ZnKTsKKwlpZiAodGltZV9iZWZvcmUobG9jYWxfamlmZmllcywgZGF0YS0+bGltaXRzX2xhc3RfdXBkYXRlZCArCisJCQlMSU1JVF9SRUZSRVNIX0lOVEVSVkFMKSAmJgorCSAgICBkYXRhLT5saW1pdHNfdmFsaWQpCisJCW5lZWRfbGltaXRzID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX1RFTVBfQ09VTlQ7IGkrKykKLQkJZGF0YS0+dGVtcFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJaWYgKCFuZWVkX3NlbnNvcnMgJiYgIW5lZWRfbGltaXRzKQorCQlyZXR1cm4gZGF0YTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWlmICghbmVlZF9zZW5zb3JzKQorCQlnb3RvIG5vX3NlbnNvcl91cGRhdGU7CisKKwlpZiAoIWRhdGEtPnRlbXBlcmF0dXJlc19wcm9iZWQpCisJCWFkdDc0NzBfcmVhZF90ZW1wZXJhdHVyZXMoY2xpZW50LCBkYXRhKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX1RFTVBfQ09VTlQ7IGkrKykKKwkJCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCQkJQURUNzQ3MF9URU1QX1JFRyhpKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9GQU5fQ09VTlQ7IGkrKykKQEAgLTMwMiw5ICszOTgsNyBAQAogCWRhdGEtPnNlbnNvcnNfdmFsaWQgPSAxOwogCiBub19zZW5zb3JfdXBkYXRlOgotCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5saW1pdHNfbGFzdF91cGRhdGVkICsKLQkJTElNSVRfUkVGUkVTSF9JTlRFUlZBTCkKLQkJJiYgZGF0YS0+bGltaXRzX3ZhbGlkKQorCWlmICghbmVlZF9saW1pdHMpCiAJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKSB7CkBAIC0zMzgsNiArNDMyLDY2IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b191cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGFkdDc0NzBfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9hdXRvX3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHRlbXA7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgNjAwMDApOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwgPSB0ZW1wOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbnVtX3RlbXBfc2Vuc29ycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gYWR0NzQ3MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPm51bV90ZW1wX3NlbnNvcnMpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbnVtX3RlbXBfc2Vuc29ycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHRlbXA7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgLTEsIDEwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPSB0ZW1wOworCWlmICh0ZW1wIDwgMCkKKwkJZGF0YS0+dGVtcGVyYXR1cmVzX3Byb2JlZCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkJICAgICBjaGFyICpidWYpCkBAIC0zNjAsNyArNTE0LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtMzk0LDcgKzU0OCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTY3MSw3ICs4MjUsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC04MDQsNiArOTU4LDEwIEBACiB9CiAKIHN0YXRpYyBERVZJQ0VfQVRUUihhbGFybV9tYXNrLCBTX0lSVUdPLCBzaG93X2FsYXJtX21hc2ssIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG51bV90ZW1wX3NlbnNvcnMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X251bV90ZW1wX3NlbnNvcnMsCisJCSAgIHNldF9udW1fdGVtcF9zZW5zb3JzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3VwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIHNob3dfYXV0b191cGRhdGVfaW50ZXJ2YWwsIHNldF9hdXRvX3VwZGF0ZV9pbnRlcnZhbCk7CiAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX21heCwKIAkJICAgIHNldF90ZW1wX21heCwgMCk7CkBAIC05NzYsNiArMTEzNCw4IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQ3MF9hdHRyW10gPQogewogCSZkZXZfYXR0cl9hbGFybV9tYXNrLmF0dHIsCisJJmRldl9hdHRyX251bV90ZW1wX3NlbnNvcnMuYXR0ciwKKwkmZGV2X2F0dHJfYXV0b191cGRhdGVfaW50ZXJ2YWwuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKQEAgLTExMDgsNiArMTI2OCw5IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwlkYXRhLT5udW1fdGVtcF9zZW5zb3JzID0gLTE7CisJZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwgPSBBVVRPX1VQREFURV9JTlRFUlZBTDsKKwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOwogCkBAIC0xMTI3LDggKzEyOTAsMTYgQEAKIAkJZ290byBleGl0X3JlbW92ZTsKIAl9CiAKKwlpbml0X2NvbXBsZXRpb24oJmRhdGEtPmF1dG9fdXBkYXRlX3N0b3ApOworCWRhdGEtPmF1dG9fdXBkYXRlID0ga3RocmVhZF9ydW4oYWR0NzQ3MF91cGRhdGVfdGhyZWFkLCBjbGllbnQsCisJCQkJCWRldl9uYW1lKGRhdGEtPmh3bW9uX2RldikpOworCWlmIChJU19FUlIoZGF0YS0+YXV0b191cGRhdGUpKQorCQlnb3RvIGV4aXRfdW5yZWdpc3RlcjsKKwogCXJldHVybiAwOwogCitleGl0X3VucmVnaXN0ZXI6CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKIGV4aXRfcmVtb3ZlOgogCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmRhdGEtPmF0dHJzKTsKIGV4aXRfZnJlZToKQEAgLTExNDEsNiArMTMxMiw4IEBACiB7CiAJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCisJa3RocmVhZF9zdG9wKGRhdGEtPmF1dG9fdXBkYXRlKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLT5hdXRvX3VwZGF0ZV9zdG9wKTsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmRhdGEtPmF0dHJzKTsKIAlrZnJlZShkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3My5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDczLmMKaW5kZXggMThhYTMwOC4uMGE2Y2UyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDczLmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDczLmMKQEAgLTEyOSw4ICsxMjksNiBAQAogI2RlZmluZSBGQU5fUEVSSU9EX0lOVkFMSUQJNjU1MzUKICNkZWZpbmUgRkFOX0RBVEFfVkFMSUQoeCkJKCh4KSAmJiAoeCkgIT0gRkFOX1BFUklPRF9JTlZBTElEKQogCi0jZGVmaW5lIFJPVU5EX0RJVih4LCBkaXZpc29yKQkoKCh4KSArICgoZGl2aXNvcikgLyAyKSkgLyAoZGl2aXNvcikpCi0KIHN0cnVjdCBhZHQ3NDczX2RhdGEgewogCXN0cnVjdCBkZXZpY2UJCSpod21vbl9kZXY7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAlhdHRyczsKQEAgLTQ1OSw3ICs0NTcsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gZW5jb2RlX3RlbXAoZGF0YS0+dGVtcF90d29zX2NvbXBsZW1lbnQsIHRlbXApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC00OTUsNyArNDkzLDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IGVuY29kZV90ZW1wKGRhdGEtPnRlbXBfdHdvc19jb21wbGVtZW50LCB0ZW1wKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNzIwLDcgKzcxOCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTc1Niw3ICs3NTQsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gZW5jb2RlX3RlbXAoZGF0YS0+dGVtcF90d29zX2NvbXBsZW1lbnQsIHRlbXApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKaW5kZXggMDg2YzJhNS4uZGNhNDdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYwpAQCAtMTMxLDYgKzEzMSwxMCBAQAogLyogU2V0IDE0OiBpTWFjIDYsMSAqLwogCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRHMFAiLCAiVEgwUCIsCiAJICAiVE8wUCIsICJUcDBQIiwgTlVMTCB9LAorLyogU2V0IDE1OiBNYWNCb29rIEFpciAyLDEgKi8KKwl7ICJUQjBUIiwgIlRCMVMiLCAiVEIxVCIsICJUQjJTIiwgIlRCMlQiLCAiVEMwRCIsICJUTjBEIiwgIlRURjAiLAorCSAgIlRWMFAiLCAiVFZGUCIsICJUVzBQIiwgIlRoMFAiLCAiVHAwUCIsICJUcDFQIiwgIlRwRlAiLCAiVHMwUCIsCisJICAiVHMwUyIsIE5VTEwgfSwKIH07CiAKIC8qIExpc3Qgb2Yga2V5cyB1c2VkIHRvIHJlYWQvd3JpdGUgZmFuIHNwZWVkcyAqLwpAQCAtMTMwMSwxMSArMTMwNSwxNyBAQAogCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTMgfSwKIC8qIGlNYWMgNjogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxNCAqLwogCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTQgfSwKKy8qIE1hY0Jvb2sgQWlyIDIsMTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTUgKi8KKwl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE1IH0sCiB9OwogCiAvKiBOb3RlIHRoYXQgRE1JX01BVENIKC4uLiwiTWFjQm9vayIpIHdpbGwgbWF0Y2ggIk1hY0Jvb2tQcm8xLDEiLgogICogU28gd2UgbmVlZCB0byBwdXQgIkFwcGxlIE1hY0Jvb2sgUHJvIiBiZWZvcmUgIkFwcGxlIE1hY0Jvb2siLiAqLwogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9zeXN0ZW1faWQgYXBwbGVzbWNfd2hpdGVsaXN0W10gPSB7CisJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIEFpciAyIiwgeworCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rQWlyMiIpIH0sCisJCSZhcHBsZXNtY19kbWlfZGF0YVsxNV19LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBBaXIiLCB7CiAJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCiAJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIiKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi5jIGIvZHJpdmVycy9od21vbi9od21vbi5jCmluZGV4IDA3NmE1OWMuLmUxNWMzZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKQEAgLTc2LDcgKzc2LDcgQEAKIHsKIAlpbnQgaWQ7CiAKLQlpZiAobGlrZWx5KHNzY2FuZihkZXYtPmJ1c19pZCwgSFdNT05fSURfRk9STUFULCAmaWQpID09IDEpKSB7CisJaWYgKGxpa2VseShzc2NhbmYoZGV2X25hbWUoZGV2KSwgSFdNT05fSURfRk9STUFULCAmaWQpID09IDEpKSB7CiAJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CiAJCXNwaW5fbG9jaygmaWRyX2xvY2spOwogCQlpZHJfcmVtb3ZlKCZod21vbl9pZHIsIGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCmluZGV4IDUzN2Q5ZmIuLmEzNjM2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwpAQCAtNDAsNyArNDAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHUxNiBleHRyYWN0X3ZhbHVlKGNvbnN0IGNoYXIgKmRhdGEsIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1cCgodTE2ICopJmRhdGFbb2Zmc2V0XSk7CisJcmV0dXJuIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJmRhdGFbb2Zmc2V0XSk7CiB9CiAKICNkZWZpbmUgVEVNUF9TRU5TT1IJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOGY5NTk1Zi4uNTViZDg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0KIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzOiBzZW5zb3IgJyVzJ1xuIiwKLQkJZGF0YS0+aHdtb25fZGV2LT5idXNfaWQsIGNsaWVudC0+bmFtZSk7CisJCSBkZXZfbmFtZShkYXRhLT5od21vbl9kZXYpLCBjbGllbnQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL0tjb25maWcgYi9kcml2ZXJzL2lkZS9LY29uZmlnCmluZGV4IDRlZTg1ZmMuLjNmOTUwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL0tjb25maWcKKysrIGIvZHJpdmVycy9pZGUvS2NvbmZpZwpAQCAtNTExLDYgKzUxMSwxMyBAQAogCSAgVGhpcyBhbGxvd3MgdGhlIGtlcm5lbCB0byBjaGFuZ2UgUElPLCBETUEgYW5kIFVETUEgc3BlZWRzIGFuZCB0bwogCSAgY29uZmlndXJlIHRoZSBjaGlwIHRvIG9wdGltdW0gcGVyZm9ybWFuY2UuCiAKK2NvbmZpZyBCTEtfREVWX0lUODE3MgorCXRyaXN0YXRlICJJVDgxNzIgSURFIHN1cHBvcnQiCisJc2VsZWN0IEJMS19ERVZfSURFRE1BX1BDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIElERSBjb250cm9sbGVyIG9uIHRoZQorCSAgSVQ4MTcyIFN5c3RlbSBDb250cm9sbGVyLgorCiBjb25maWcgQkxLX0RFVl9JVDgyMTMKIAl0cmlzdGF0ZSAiSVQ4MjEzIElERSBzdXBwb3J0IgogCXNlbGVjdCBCTEtfREVWX0lERURNQV9QQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKaW5kZXggNDEwNzI4OS4uYzJiOWM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKQEAgLTQ3LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX0NZODJDNjkzKQkJKz0gY3k4MmM2OTMubwogb2JqLSQoQ09ORklHX0JMS19ERVZfREVMS0lOKQkJKz0gZGVsa2luX2NiLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0hQVDM2NikJCSs9IGhwdDM2Ni5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JVDgxNzIpCQkrPSBpdDgxNzIubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MjEzKQkJKz0gaXQ4MjEzLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lUODIxWCkJCSs9IGl0ODIxeC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9KTUlDUk9OKQkJKz0gam1pY3Jvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMgYi9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMKaW5kZXggNDE0MmM2OS4uNDQ4NWI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYWVjNjJ4eC5jCisrKyBiL2RyaXZlcnMvaWRlL2FlYzYyeHguYwpAQCAtODMsNyArODMsNyBAQAogCiBzdGF0aWMgdm9pZCBhZWM2MjEwX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdAk9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICpidXNfY2xvY2sgPSBob3N0LT5ob3N0X3ByaXY7CkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIHZvaWQgYWVjNjI2MF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqYnVzX2Nsb2NrID0gaG9zdC0+aG9zdF9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYyBiL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKaW5kZXggNDVkMjM1Ni4uNjZmNDMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYworKysgYi9kcml2ZXJzL2lkZS9hbGltMTV4My5jCkBAIC02OCw3ICs2OCw3IEBACiAKIHN0YXRpYyB2b2lkIGFsaV9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfdGltaW5nICp0ID0gaWRlX3RpbWluZ19maW5kX21vZGUoWEZFUl9QSU9fMCArIHBpbyk7CiAJaW50IHNfdGltZSA9IHQtPnNldHVwLCBhX3RpbWUgPSB0LT5hY3RpdmUsIGNfdGltZSA9IHQtPmN5Y2xlOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIHN0YXRpYyB2b2lkIGFsaV9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggc3BlZWQxCQk9IHNwZWVkOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CkBAIC0xOTgsNyArMTk4LDcgQEAKIHN0YXRpYyBpbnQgYWxpMTV4M19kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlmIChtNTIyOV9yZXZpc2lvbiA8IDB4QzIgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKSB7Ci0JCWlmIChycV9kYXRhX2Rpcihkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEpKQorCQlpZiAocnFfZGF0YV9kaXIoZHJpdmUtPmh3aWYtPnJxKSkKIAkJCXJldHVybiAxOwkvKiB0cnkgUElPIGluc3RlYWQgb2YgRE1BICovCiAJfQogCXJldHVybiBpZGVfZG1hX3NldHVwKGRyaXZlKTsKQEAgLTQ5MCw4ICs0OTAsNiBAQAogCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJcmV0dXJuIC0xOwogCi0JaHdpZi0+ZG1hX29wcyA9ICZzZmZfZG1hX29wczsKLQogCXJldHVybiAwOwogfQogCkBAIC01MTEsNiArNTA5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBhbGkxNXgzX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKQEAgLTUxOSw2ICs1MTgsNyBAQAogCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfYWxpMTV4MywKIAkuaW5pdF9kbWEJPSBpbml0X2RtYV9hbGkxNXgzLAogCS5wb3J0X29wcwk9ICZhbGlfcG9ydF9vcHMsCisJLmRtYV9vcHMJPSAmc2ZmX2RtYV9vcHMsCiAJLnBpb19tYXNrCT0gQVRBX1BJTzUsCiAJLnN3ZG1hX21hc2sJPSBBVEFfU1dETUEyLAogCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FtZDc0eHguYyBiL2RyaXZlcnMvaWRlL2FtZDc0eHguYwppbmRleCBjNmJjZDMwLi42OTY2MGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hbWQ3NHh4LmMKKysrIGIvZHJpdmVycy9pZGUvYW1kNzR4eC5jCkBAIC04Miw3ICs4Miw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0JaWRlX2RyaXZlX3QgKnBlZXIgPSBod2lmLT5kcml2ZXMgKyAofmRyaXZlLT5kbiAmIDEpOworCWlkZV9kcml2ZV90ICpwZWVyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJc3RydWN0IGlkZV90aW1pbmcgdCwgcDsKIAlpbnQgVCwgVVQ7CiAJdTggdWRtYV9tYXNrID0gaHdpZi0+dWx0cmFfbWFzazsKQEAgLTkyLDcgKzkyLDcgQEAKIAogCWlkZV90aW1pbmdfY29tcHV0ZShkcml2ZSwgc3BlZWQsICZ0LCBULCBVVCk7CiAKLQlpZiAocGVlci0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKKwlpZiAocGVlcikgewogCQlpZGVfdGltaW5nX2NvbXB1dGUocGVlciwgcGVlci0+Y3VycmVudF9zcGVlZCwgJnAsIFQsIFVUKTsKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYyBiL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYwppbmRleCAwZWM4ZmQxLi43OWEyZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCkBAIC0yMTIsOCArMjEyLDggQEAKIHN0YXRpYyBpbnQgYXVpZGVfYnVpbGRfZG1hdGFibGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWludCBpLCBpc3dyaXRlLCBjb3VudCA9IDA7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJX2F1aWRlX2h3aWYgKmFod2lmID0gJmF1aWRlX2h3aWY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIApAQCAtMjg2LDcgKzI4Niw3IEBACiAKIHN0YXRpYyBpbnQgYXVpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCWlmIChod2lmLT5zZ19uZW50cykgewogCQlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CkBAIC0zMDksOCArMzA5LDggQEAKIH0KIAogc3RhdGljIGludCBhdWlkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQoteyAgICAgICAJCi0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworeworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAogCWlmICghYXVpZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUpKSB7CiAJCWlkZV9tYXBfc2coZHJpdmUsIHJxKTsKQEAgLTUwMiw3ICs1MDIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jbWQ2NDAuYyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCmluZGV4IGU0MzA2NjQuLjg4OTAyNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NtZDY0MC5jCisrKyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCkBAIC00NjcsMTEgKzQ2NywxMCBAQAogCSAqIHNvIHdlIG1lcmdlIHRoZSB0aW1pbmdzLCB1c2luZyB0aGUgc2xvd2VzdCB2YWx1ZSBmb3IgZWFjaCB0aW1pbmcuCiAJICovCiAJaWYgKGluZGV4ID4gMSkgewotCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JCWlkZV9kcml2ZV90ICpwZWVyID0gJmh3aWYtPmRyaXZlc1shKGRyaXZlLT5kbiAmIDEpXTsKKwkJaWRlX2RyaXZlX3QgKnBlZXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAkJdW5zaWduZWQgaW50IG1hdGUgPSBpbmRleCBeIDE7CiAKLQkJaWYgKHBlZXItPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CisJCWlmIChwZWVyKSB7CiAJCQlpZiAoc2V0dXBfY291bnQgPCBzZXR1cF9jb3VudHNbbWF0ZV0pCiAJCQkJc2V0dXBfY291bnQgPSBzZXR1cF9jb3VudHNbbWF0ZV07CiAJCQlpZiAoYWN0aXZlX2NvdW50IDwgYWN0aXZlX2NvdW50c1ttYXRlXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKaW5kZXggMzYyM2JmMC4uMmY5Njg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY21kNjR4LmMKKysrIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKQEAgLTExNSw3ICsxMTUsNyBAQAogICovCiBzdGF0aWMgdm9pZCBjbWQ2NHhfdHVuZV9waW8oaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfdGltaW5nICp0CT0gaWRlX3RpbWluZ19maW5kX21vZGUoWEZFUl9QSU9fMCArIHBpbyk7CiAJdW5zaWduZWQgaW50IGN5Y2xlX3RpbWU7CkBAIC0xMzgsMTAgKzEzOCwxMiBAQAogCSAqIHRoZSBzbG93ZXN0IGFkZHJlc3Mgc2V0dXAgdGltaW5nIG91cnNlbHZlcy4KIAkgKi8KIAlpZiAoaHdpZi0+Y2hhbm5lbCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmVzID0gaHdpZi0+ZHJpdmVzOworCQlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCiAJCWRyaXZlLT5kcml2ZV9kYXRhID0gc2V0dXBfY291bnQ7Ci0JCXNldHVwX2NvdW50ID0gbWF4KGRyaXZlc1swXS5kcml2ZV9kYXRhLCBkcml2ZXNbMV0uZHJpdmVfZGF0YSk7CisKKwkJaWYgKHBhaXIpCisJCQlzZXR1cF9jb3VudCA9IG1heF90KHU4LCBzZXR1cF9jb3VudCwgcGFpci0+ZHJpdmVfZGF0YSk7CiAJfQogCiAJaWYgKHNldHVwX2NvdW50ID4gNSkJCS8qIHNob3VsZG4ndCBhY3R1YWxseSBoYXBwZW4uLi4gKi8KQEAgLTE4MCw3ICsxODIsNyBAQAogCiBzdGF0aWMgdm9pZCBjbWQ2NHhfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDB4MDE7CiAJdTggcmVnVSA9IDAsIHBjaVUJPSBod2lmLT5jaGFubmVsID8gVURJREVUQ1IxIDogVURJREVUQ1IwOwpAQCAtMjI2LDcgKzIyOCw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjQ4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gaHdpZi0+ZG1hX2Jhc2UgLSAoaHdpZi0+Y2hhbm5lbCAqIDgpOwogCWludCBlcnIJCQk9IGlkZV9kbWFfZW5kKGRyaXZlKTsKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IE1SRE1PREVfSU5UUl9DSDEgOgpAQCAtMjQyLDcgKzI0NCw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjR4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXJxX3JlZwkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjMgOiBDRlI7CiAJdTggIGlycV9tYXNrCQk9IGh3aWYtPmNoYW5uZWwgPyBBUlRUSU0yM19JTlRSX0NIMSA6CkBAIC0yNTksNyArMjYxLDcgQEAKIAogc3RhdGljIGludCBjbWQ2NDhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9IGh3aWYtPmRtYV9iYXNlIC0gKGh3aWYtPmNoYW5uZWwgKiA4KTsKIAl1OCBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gTVJETU9ERV9JTlRSX0NIMSA6CiAJCQkJCQkgIE1SRE1PREVfSU5UUl9DSDA7CkBAIC0yODIsNyArMjg0LDcgQEAKIAogc3RhdGljIGludCBjbWQ2NHhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGlycV9yZWcJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzIDogQ0ZSOwogCXU4ICBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjNfSU5UUl9DSDEgOgpAQCAtMzEzLDcgKzMxNSw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjQ2XzFfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CkBAIC0zODMsNiArMzg1LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGNtZDY0eF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgY21kNjQ2X3JldjFfZG1hX29wcyA9IHsKQEAgLTM5NCw2ICszOTcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBjbWQ2NDhfZG1hX29wcyA9IHsKQEAgLTQwNSw2ICs0MDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gY21kNjQ4X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGNtZDY0eF9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jczU1MjAuYyBiL2RyaXZlcnMvaWRlL2NzNTUyMC5jCmluZGV4IDVlZmI0NjcuLmQwMDNiZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvaWRlL2NzNTUyMC5jCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyB2b2lkIGNzNTUyMF9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgY29udHJvbGxlciA9IGRyaXZlLT5kbiA+IDEgPyAxIDogMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKaW5kZXggZDM3YmFmOC4uNzRmYzU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYworKysgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogc3RhdGljIHZvaWQgY3k4MmM2OTNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlwaW9fY2xvY2tzX3QgcGNsazsKIAl1bnNpZ25lZCBpbnQgYWRkckN0cmw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9mYWxjb25pZGUuYyBiL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCmluZGV4IDM5ZDUwMGQuLmE1YmE4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCkBAIC03MCw3ICs3MCw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2hwdDM2Ni5jIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKaW5kZXggYjE4ZTEwZC4uM2ViOWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaHB0MzY2LmMKKysrIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKQEAgLTYyNiw3ICs2MjYsNyBAQAogCiBzdGF0aWMgdTggaHB0M3h4X3VkbWFfZmlsdGVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCXU4IG1hc2sgCQk9IGh3aWYtPnVsdHJhX21hc2s7CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCiBzdGF0aWMgdTggaHB0M3h4X21kbWFfZmlsdGVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCiAJc3dpdGNoIChpbmZvLT5jaGlwX3R5cGUpIHsKQEAgLTc0Myw3ICs3NDMsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfbWFza3Byb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWFzaykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2CSpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNzBfY2xlYXJfZW5naW5lKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBod2lmLT5zZWxlY3RfZGF0YSwgMHgzNyk7CkBAIC03OTcsNyArNzk3LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0MzcwX2lycV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTE2IGJmaWZvCQk9IDA7CiAJdTggIGRtYV9jbWQ7CkBAIC04MjIsNyArODIyLDcgQEAKIAogc3RhdGljIGludCBocHQzNzBfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1OCAgZG1hX3N0YXQJCT0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogCiAJaWYgKGRtYV9zdGF0ICYgMHgwMSkgewpAQCAtODQ0LDcgKzg0NCw3IEBACiAvKiByZXR1cm5zIDEgaWYgRE1BIElSUSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGhwdDM3NF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MTYgYmZpZm8JCT0gMDsKIAl1OCAgZG1hX3N0YXQ7CkBAIC04NjUsNyArODY1LDcgQEAKIAogc3RhdGljIGludCBocHQzNzRfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1jcgk9IDAsIG1jcl9hZGRyCT0gaHdpZi0+c2VsZWN0X2RhdGE7CiAJdTggYndzciA9IDAsIG1hc2sJPSBod2lmLT5jaGFubmVsID8gMHgwMiA6IDB4MDE7CkBAIC05MjcsNyArOTI3LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4bl9yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWhwdDN4eG5fc2V0X2Nsb2NrKEhXSUYoZHJpdmUpLCBycV9kYXRhX2RpcihycSkgPyAweDIzIDogMHgyMSk7CisJaHB0M3h4bl9zZXRfY2xvY2soZHJpdmUtPmh3aWYsIHJxX2RhdGFfZGlyKHJxKSA/IDB4MjMgOiAweDIxKTsKIH0KIAogLyoqCkBAIC0xMzQ5LDggKzEzNDksNiBAQAogCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJcmV0dXJuIC0xOwogCi0JaHdpZi0+ZG1hX29wcyA9ICZzZmZfZG1hX29wczsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNDI2LDYgKzE0MjQsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaHB0Mzc0X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBocHQzNzBfZG1hX29wcyA9IHsKQEAgLTE0MzcsNiArMTQzNiw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaHB0MzcwX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGhwdDM2eF9kbWFfb3BzID0gewpAQCAtMTQ0OCw2ICsxNDQ4LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBocHQzNjZfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBocHQzNjZfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWNzaWRlLmMgYi9kcml2ZXJzL2lkZS9pY3NpZGUuYwppbmRleCA4MWY3MGNhLi45N2EzNWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pY3NpZGUuYworKysgYi9kcml2ZXJzL2lkZS9pY3NpZGUuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGljc2lkZV9tYXNrcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtYXNrKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yODQsNyArMjg0LDcgQEAKIAogc3RhdGljIGludCBpY3NpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCiBzdGF0aWMgdm9pZCBpY3NpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAogCS8qIFdlIGNhbiBub3QgZW5hYmxlIERNQSBvbiBib3RoIGNoYW5uZWxzIHNpbXVsdGFuZW91c2x5LiAqLwpAQCAtMzA5LDEwICszMDksMTAgQEAKIAogc3RhdGljIGludCBpY3NpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgZG1hX21vZGU7CiAKIAlpZiAocnFfZGF0YV9kaXIocnEpKQpAQCAtMzYyLDcgKzM2Miw3IEBACiAKIHN0YXRpYyBpbnQgaWNzaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCmluZGV4IGZkNGEzNjQuLjJmOWU5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAgKi8KIHN0YXRpYyBhY3BpX2hhbmRsZSBpZGVfYWNwaV9kcml2ZV9nZXRfaGFuZGxlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90CSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludAkJIHBvcnQ7CiAJYWNwaV9oYW5kbGUJIGRyaXZlX2hhbmRsZTsKIApAQCAtMjYzLDcgKzI2Myw3IEBACiAJYWNwaV9zdGF0dXMJCQlzdGF0dXM7CiAJc3RydWN0IGFjcGlfYnVmZmVyCQlvdXRwdXQ7CiAJdW5pb24gYWNwaV9vYmplY3QgCQkqb3V0X29iajsKLQlpZGVfaHdpZl90CQkJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90CQkJKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZGV2aWNlCQkJKmRldiA9IGh3aWYtPmdlbmRldi5wYXJlbnQ7CiAJaW50CQkJCWVyciA9IC1FTk9ERVY7CiAJaW50CQkJCXBvcnQ7CkBAIC02NDEsNyArNjQxLDggQEAKICAqLwogdm9pZCBpZGVfYWNwaV9zZXRfc3RhdGUoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG9uKQogewotCWludCB1bml0OworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKIAogCWlmIChpZGVfbm9hY3BpIHx8IGlkZV9ub2FjcGlfcHN4KQogCQlyZXR1cm47CkBAIC02NTUsOSArNjU2LDggQEAKIAkvKiBjaGFubmVsIGZpcnN0IGFuZCB0aGVuIGRyaXZlcyBmb3IgcG93ZXIgb24gYW5kIHZlcnNlIHZlcnNhIGZvciBwb3dlciBvZmYgKi8KIAlpZiAob24pCiAJCWFjcGlfYnVzX3NldF9wb3dlcihod2lmLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSwgQUNQSV9TVEFURV9EMCk7Ci0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwogCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICghZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlKQogCQkJZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlID0gaWRlX2FjcGlfZHJpdmVfZ2V0X2hhbmRsZShkcml2ZSk7CiAKQEAgLTcxMSwxNSArNzExLDEzIEBACiAJICogZm9yIGJvdGggZHJpdmVzLCByZWdhcmRsZXNzIHdoZXRoZXIgdGhleSBhcmUgY29ubmVjdGVkCiAJICogb3Igbm90LgogCSAqLwotCWh3aWYtPmRyaXZlc1swXS5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+bWFzdGVyOwotCWh3aWYtPmRyaXZlc1sxXS5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+c2xhdmU7CisJaHdpZi0+ZGV2aWNlc1swXS0+YWNwaWRhdGEgPSAmaHdpZi0+YWNwaWRhdGEtPm1hc3RlcjsKKwlod2lmLT5kZXZpY2VzWzFdLT5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+c2xhdmU7CiAKIAkvKgogCSAqIFNlbmQgSURFTlRJRlkgZm9yIGVhY2ggZHJpdmUKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQltZW1zZXQoZHJpdmUtPmFjcGlkYXRhLCAwLCBzaXplb2YoKmRyaXZlLT5hY3BpZGF0YSkpOwogCiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQpAQCAtNzQ0LDkgKzc0Miw3IEBACiAJaWRlX2FjcGlfZ2V0X3RpbWluZyhod2lmKTsKIAlpZGVfYWNwaV9wdXNoX3RpbWluZyhod2lmKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpCiAJCQkvKiBFeGVjdXRlIEFDUEkgc3RhcnR1cCBjb2RlICovCiAJCQlpZGVfYWNwaV9leGVjX3Rmcyhkcml2ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCmluZGV4IGU4Njg4YzAuLmU5NmMwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIAogaW50IGlkZV9jZF9leHBpcnkoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJdW5zaWduZWQgbG9uZyB3YWl0ID0gMDsKIAogCWRlYnVnX2xvZygiJXM6IHJxLT5jbWRbMF06IDB4JXhcbiIsIF9fZnVuY19fLCBycS0+Y21kWzBdKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogewogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJpdmUtPnBjOwogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKIAl1bnNpZ25lZCBpbnQgdGltZW91dCwgdGVtcDsKQEAgLTQ5MSw3ICs0OTEsNyBAQAogewogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnVuaW5pdGlhbGl6ZWRfdmFyKHBjKTsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJaWRlX2V4cGlyeV90ICpleHBpcnk7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAJaW50IGNtZF9sZW47CkBAIC01NDksNyArNTQ5LDEwIEBACiAJfQogCiAJLyogU2V0IHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLwotCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgaWRlX3BjX2ludHIsIHRpbWVvdXQsIGV4cGlyeSk7CisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLAorCQkJKGRldl9pc19pZGVjZChkcml2ZSkgPyBkcml2ZS0+aXJxX2hhbmRsZXIKKwkJCQkJICAgICA6IGlkZV9wY19pbnRyKSwKKwkJCXRpbWVvdXQsIGV4cGlyeSk7CiAKIAkvKiBCZWdpbiBETUEsIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChkZXZfaXNfaWRlY2QoZHJpdmUpKSB7CkBAIC01ODAsNyArNTgzLDcgQEAKIAogCWlmIChkZXZfaXNfaWRlY2QoZHJpdmUpKSB7CiAJCXRmX2ZsYWdzID0gSURFX1RGTEFHX09VVF9OU0VDVCB8IElERV9URkxBR19PVVRfTEJBTDsKLQkJYmNvdW50ID0gaWRlX2NkX2dldF94ZmVybGVuKGh3aWYtPmh3Z3JvdXAtPnJxKTsKKwkJYmNvdW50ID0gaWRlX2NkX2dldF94ZmVybGVuKGh3aWYtPnJxKTsKIAkJZXhwaXJ5ID0gaWRlX2NkX2V4cGlyeTsKIAkJdGltZW91dCA9IEFUQVBJX1dBSVRfUEM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggMWE3NDEwZi4uY2FlNjkzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCiBzdGF0aWMgdm9pZCBjZHJvbV9lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCWludCBuc2VjdG9ycyA9IHJxLT5oYXJkX2N1cl9zZWN0b3JzOwogCiAJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzLCBjbWQ6IDB4JXgsIHVwdG9kYXRlOiAweCV4LCAiCkBAIC0zMDYsOCArMzA2LDcgQEAKIHN0YXRpYyBpbnQgY2Ryb21fZGVjb2RlX3N0YXR1cyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBnb29kX3N0YXQsIGludCAqc3RhdF9yZXQpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCWludCBzdGF0LCBlcnIsIHNlbnNlX2tleTsKIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KQEAgLTUwMiw3ICs1MDEsNyBAQAogCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQkJaHdncm91cC0+cnEgPSBOVUxMOworCQlod2lmLT5ycSA9IE5VTEw7CiAKIAkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgcnEtPnNlbnNlLCBycSk7CiAJfSBlbHNlCkBAIC01MTEsMTA2ICs1MTAsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICopOwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9uZXdwY19pbnRyKGlkZV9kcml2ZV90ICopOwotCi0vKgotICogU2V0IHVwIHRoZSBkZXZpY2UgcmVnaXN0ZXJzIGZvciB0cmFuc2ZlcnJpbmcgYSBwYWNrZXQgY29tbWFuZCBvbiBERVYsCi0gKiBleHBlY3RpbmcgdG8gbGF0ZXIgdHJhbnNmZXIgWEZFUkxFTiBieXRlcy4gIEhBTkRMRVIgaXMgdGhlIHJvdXRpbmUKLSAqIHdoaWNoIGFjdHVhbGx5IHRyYW5zZmVycyB0aGUgY29tbWFuZCB0byB0aGUgZHJpdmUuICBJZiB0aGlzIGlzIGEKLSAqIGRycV9pbnRlcnJ1cHQgZGV2aWNlLCB0aGlzIHJvdXRpbmUgd2lsbCBhcnJhbmdlIGZvciBIQU5ETEVSIHRvIGJlCi0gKiBjYWxsZWQgd2hlbiB0aGUgaW50ZXJydXB0IGZyb20gdGhlIGRyaXZlIGFycml2ZXMuICBPdGhlcndpc2UsIEhBTkRMRVIKLSAqIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkcml2ZSBpcyBwcmVwYXJlZCBmb3IgdGhlIHRyYW5zZmVyLgotICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7Ci0JaW50IHhmZXJsZW47Ci0KLQl4ZmVybGVuID0gaWRlX2NkX2dldF94ZmVybGVuKHJxKTsKLQotCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QQywgIkNhbGwgJXMsIHhmZXJsZW46ICVkXG4iLCBfX2Z1bmNfXywgeGZlcmxlbik7Ci0KLQkvKiBGSVhNRTogZm9yIFZpcnR1YWwgRE1BIHdlIG11c3QgY2hlY2sgaGFyZGVyICovCi0JaWYgKGRyaXZlLT5kbWEpCi0JCWRyaXZlLT5kbWEgPSAhaHdpZi0+ZG1hX29wcy0+ZG1hX3NldHVwKGRyaXZlKTsKLQotCS8qIHNldCB1cCB0aGUgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLQlpZGVfcGt0Y21kX3RmX2xvYWQoZHJpdmUsIElERV9URkxBR19PVVRfTlNFQ1QgfCBJREVfVEZMQUdfT1VUX0xCQUwsCi0JCQkgICB4ZmVybGVuLCBkcml2ZS0+ZG1hKTsKLQotCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCkgewotCQkvKiB3YWl0aW5nIGZvciBDREIgaW50ZXJydXB0LCBub3QgRE1BIHlldC4gKi8KLQkJaWYgKGRyaXZlLT5kbWEpCi0JCQlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKLQotCQkvKiBwYWNrZXQgY29tbWFuZCAqLwotCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBBVEFfQ01EX1BBQ0tFVCwKLQkJCQkgICAgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQsCi0JCQkJICAgIEFUQVBJX1dBSVRfUEMsIGlkZV9jZF9leHBpcnkpOwotCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Ci0JfSBlbHNlIHsKLQkJaWRlX2V4ZWN1dGVfcGt0X2NtZChkcml2ZSk7Ci0KLQkJcmV0dXJuIGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGRyaXZlKTsKLQl9Ci19Ci0KLS8qCi0gKiBTZW5kIGEgcGFja2V0IGNvbW1hbmQgdG8gRFJJVkUgZGVzY3JpYmVkIGJ5IENNRF9CVUYgYW5kIENNRF9MRU4uIFRoZSBkZXZpY2UKLSAqIHJlZ2lzdGVycyBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHByZXBhcmVkIGJ5IGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kLgotICogSEFORExFUiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcyBvcgotICogdGhlcmUncyBkYXRhIHJlYWR5LgotICovCi0jZGVmaW5lIEFUQVBJX01JTl9DREJfQllURVMgMTIKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKLQlpbnQgY21kX2xlbjsKLQlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOwotCi0JaWRlX2RlYnVnX2xvZyhJREVfREJHX1BDLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19EUlFfSU5URVJSVVBUKSB7Ci0JCS8qCi0JCSAqIEhlcmUgd2Ugc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIGFuIGludGVycnVwdAotCQkgKiBmcm9tIHRoZSBkZXZpY2UuICBEUlEgc2hvdWxkIGhvdyBiZSBzZXQuCi0JCSAqLwotCi0JCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KLQkJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIEFUQV9EUlEsIE5VTEwpKQotCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwotCi0JCS8qIG9rLCBuZXh0IGludGVycnVwdCB3aWxsIGJlIERNQSBpbnRlcnJ1cHQgKi8KLQkJaWYgKGRyaXZlLT5kbWEpCi0JCQlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKLQl9IGVsc2UgewotCQkvKiBvdGhlcndpc2UsIHdlIG11c3Qgd2FpdCBmb3IgRFJRIHRvIGdldCBzZXQgKi8KLQkJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIEFUQV9EUlEsCi0JCQkJICBBVEFfQlVTWSwgV0FJVF9SRUFEWSkpCi0JCQlyZXR1cm4gc3RhcnRzdG9wOwotCX0KLQotCS8qIGFybSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGNkcm9tX25ld3BjX2ludHIsIHJxLT50aW1lb3V0LCBpZGVfY2RfZXhwaXJ5KTsKLQotCS8qIEFUQVBJIGNvbW1hbmRzIGdldCBwYWRkZWQgb3V0IHRvIDEyIGJ5dGVzIG1pbmltdW0gKi8KLQljbWRfbGVuID0gQ09NTUFORF9TSVpFKHJxLT5jbWRbMF0pOwotCWlmIChjbWRfbGVuIDwgQVRBUElfTUlOX0NEQl9CWVRFUykKLQkJY21kX2xlbiA9IEFUQVBJX01JTl9DREJfQllURVM7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UgKi8KLQlod2lmLT50cF9vcHMtPm91dHB1dF9kYXRhKGRyaXZlLCBOVUxMLCBycS0+Y21kLCBjbWRfbGVuKTsKLQotCS8qIHN0YXJ0IHRoZSBETUEgaWYgbmVlZCBiZSAqLwotCWlmIChkcml2ZS0+ZG1hKQotCQlod2lmLT5kbWFfb3BzLT5kbWFfc3RhcnQoZHJpdmUpOwotCi0JcmV0dXJuIGlkZV9zdGFydGVkOwotfQotCiAvKgogICogQ2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcnJ1cHQgcmVhc29uIHJlZ2lzdGVyIGZyb20gdGhlIGNkcm9tCiAgKiBhbmQgYXR0ZW1wdCB0byByZWNvdmVyIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4gIFJldHVybnMgIDAgaWYgZXZlcnl0aGluZydzCkBAIC04NTQsOCArNzUzLDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fbmV3cGNfaW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKIAlpZGVfZXhwaXJ5X3QgKmV4cGlyeSA9IE5VTEw7CiAJaW50IGRtYV9lcnJvciA9IDAsIGRtYSwgc3RhdCwgdGhpc2xlbiwgdXB0b2RhdGUgPSAwOwpAQCAtMTA2MSw3ICs5NTksNyBAQAogCQlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCBkbGVuKSkKIAkJCUJVRygpOwogCi0JCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJaHdpZi0+cnEgPSBOVUxMOwogCX0gZWxzZSB7CiAJCWlmICghdXB0b2RhdGUpCiAJCQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9GQUlMRUQ7CkBAIC0xMTgzLDcgKzEwODEsNyBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCi0JcmV0dXJuIGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGRyaXZlKTsKKwlyZXR1cm4gaWRlX2lzc3VlX3BjKGRyaXZlKTsKIH0KIAogLyoKQEAgLTE5MTYsNyArMTgxNCw3IEBACiAKIHN0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKGlkZV9kcml2ZV90ICopOwogCi1zdGF0aWMgaWRlX2RyaXZlcl90IGlkZV9jZHJvbV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlkZV9kcml2ZXIgaWRlX2Nkcm9tX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWNkcm9tIiwKQEAgLTE5MjcsNyArMTgyNSw2IEBACiAJLnZlcnNpb24JCT0gSURFQ0RfVkVSU0lPTiwKIAkuZG9fcmVxdWVzdAkJPSBpZGVfY2RfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRlX2VuZF9yZXF1ZXN0LAotCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2NfZW50cmllcwkJPSBpZGVfY2RfcHJvY19lbnRyaWVzLAogCS5wcm9jX2RldnNldHMJCT0gaWRlX2NkX3Byb2NfZGV2c2V0cywKQEAgLTIwODIsNiArMTk3OSw3IEBACiAJfQogCiAJZHJpdmUtPmRlYnVnX21hc2sgPSBkZWJ1Z19tYXNrOworCWRyaXZlLT5pcnFfaGFuZGxlciA9IGNkcm9tX25ld3BjX2ludHI7CiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNkcm9tX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoaW5mbyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuaCBiL2RyaXZlcnMvaWRlL2lkZS1jZC5oCmluZGV4IGJmNjc2YjIuLmFjNDBkNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5oCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5oCkBAIC0zMywzMyArMzMsMzMgQEAKIAogLyogU3RydWN0dXJlIG9mIGEgTVNGIGNkcm9tIGFkZHJlc3MuICovCiBzdHJ1Y3QgYXRhcGlfbXNmIHsKLQlieXRlIHJlc2VydmVkOwotCWJ5dGUgbWludXRlOwotCWJ5dGUgc2Vjb25kOwotCWJ5dGUgZnJhbWU7CisJdTggcmVzZXJ2ZWQ7CisJdTggbWludXRlOworCXU4IHNlY29uZDsKKwl1OCBmcmFtZTsKIH07CiAKIC8qIFNwYWNlIHRvIGhvbGQgdGhlIGRpc2sgVE9DLiAqLwogI2RlZmluZSBNQVhfVFJBQ0tTIDk5CiBzdHJ1Y3QgYXRhcGlfdG9jX2hlYWRlciB7CiAJdW5zaWduZWQgc2hvcnQgdG9jX2xlbmd0aDsKLQlieXRlIGZpcnN0X3RyYWNrOwotCWJ5dGUgbGFzdF90cmFjazsKKwl1OCBmaXJzdF90cmFjazsKKwl1OCBsYXN0X3RyYWNrOwogfTsKIAogc3RydWN0IGF0YXBpX3RvY19lbnRyeSB7Ci0JYnl0ZSByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQxOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTggYWRyICAgICA6IDQ7Ci0JX191OCBjb250cm9sIDogNDsKKwl1OCBhZHIgICAgIDogNDsKKwl1OCBjb250cm9sIDogNDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTggY29udHJvbCA6IDQ7Ci0JX191OCBhZHIgICAgIDogNDsKKwl1OCBjb250cm9sIDogNDsKKwl1OCBhZHIgICAgIDogNDsKICNlbHNlCiAjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKLQlieXRlIHRyYWNrOwotCWJ5dGUgcmVzZXJ2ZWQyOworCXU4IHRyYWNrOworCXU4IHJlc2VydmVkMjsKIAl1bmlvbiB7CiAJCXVuc2lnbmVkIGxiYTsKIAkJc3RydWN0IGF0YXBpX21zZiBtc2Y7CkBAIC03NywxMCArNzcsMTAgQEAKIAogLyogRXh0cmEgcGVyLWRldmljZSBpbmZvIGZvciBjZHJvbSBkcml2ZXMuICovCiBzdHJ1Y3QgY2Ryb21faW5mbyB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7CisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAogCS8qIEJ1ZmZlciBmb3IgdGFibGUgb2YgY29udGVudHMuICBOVUxMIGlmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkCiAJICAgYSBUT0MgYnVmZmVyIGZvciB0aGlzIGRldmljZSB5ZXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwppbmRleCBlYjlmYWM0Li40MDg4YTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgX19pZGVfZG9fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkJc2VjdG9yX3QgYmxvY2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1MTYgbnNlY3RvcnMJCT0gKHUxNilycS0+bnJfc2VjdG9yczsKIAl1OCBsYmE0OAkJPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KTsKIAl1OCBkbWEJCQk9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZG9fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkgICAgICBzZWN0b3JfdCBibG9jaykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCiAJQlVHX09OKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfQkxPQ0tFRCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCmluZGV4IGY2ZDJkNDQuLjEyM2QzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYwpAQCAtNTAsNiArNTAsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAordTggaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTOworCisJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKKwkJcmV0dXJuIHJlYWRiKCh2b2lkIF9faW9tZW0gKilhZGRyKTsKKwllbHNlCisJCXJldHVybiBpbmIoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyk7CisKK3N0YXRpYyB2b2lkIGlkZV9kbWFfc2ZmX3dyaXRlX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmLCB1OCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUzsKKworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJCXdyaXRlYih2YWwsICh2b2lkIF9faW9tZW0gKilhZGRyKTsKKwllbHNlCisJCW91dGIodmFsLCBhZGRyKTsKK30KKwogLyoqCiAgKglpZGVfZG1hX2hvc3Rfc2V0CS0JRW5hYmxlL2Rpc2FibGUgRE1BIG9uIGEgaG9zdAogICoJQGRyaXZlOiBkcml2ZSB0byBjb250cm9sCkBAIC02MiwxOCArODMsMTQgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDE7Ci0JdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJdTggZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKG9uKQogCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKIAllbHNlCiAJCWRtYV9zdGF0ICY9IH4oMSA8PCAoNSArIHVuaXQpKTsKIAotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCi0JCXdyaXRlYihkbWFfc3RhdCwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisJaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGh3aWYsIGRtYV9zdGF0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfaG9zdF9zZXQpOwogCkBAIC0xNzUsNyArMTkyLDcgQEAKIGludCBpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IHJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPyAwIDogQVRBX0RNQV9XUjsKIAl1OCBtbWlvID0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKIAl1OCBkbWFfc3RhdDsKQEAgLTE4Nyw3ICsyMDQsNyBAQAogCX0KIAogCS8qIFBSRCB0YWJsZSAqLwotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJaWYgKG1taW8pCiAJCXdyaXRlbChod2lmLT5kbWF0YWJsZV9kbWEsCiAJCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9UQUJMRV9PRlMpKTsKIAllbHNlCkBAIC0yMDAsMTUgKzIxNywxMCBAQAogCQlvdXRiKHJlYWRpbmcsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCiAJLyogcmVhZCBETUEgc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAkvKiBjbGVhciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlpZiAobW1pbykKLQkJd3JpdGViKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKKwlpZGVfZG1hX3NmZl93cml0ZV9zdGF0dXMoaHdpZiwgZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUik7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKIAlyZXR1cm4gMDsKQEAgLTIzMiw3ICsyNDQsNyBAQAogc3RhdGljIGludCBkbWFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJdTggZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzOiBETUEgc3RhdHVzICgweCUwMngpXG4iLAogCQlkcml2ZS0+bmFtZSwgX19mdW5jX18sIGRtYV9zdGF0KTsKQEAgLTI0MCw3ICsyNTIsNyBAQAogCWlmICgoZG1hX3N0YXQgJiAweDE4KSA9PSAweDE4KQkvKiBCVVNZIFN0dXBpZCBFYXJseSBUaW1lciAhISAqLwogCQlyZXR1cm4gV0FJVF9DTUQ7CiAKLQlod2lmLT5od2dyb3VwLT5leHBpcnkgPSBOVUxMOwkvKiBvbmUgZnJlZSByaWRlIGZvciBub3cgKi8KKwlod2lmLT5leHBpcnkgPSBOVUxMOwkvKiBvbmUgZnJlZSByaWRlIGZvciBub3cgKi8KIAogCWlmIChkbWFfc3RhdCAmIEFUQV9ETUFfRVJSKQkvKiBFUlJPUiAqLwogCQlyZXR1cm4gLTE7CkBAIC0yODksMTMgKzMwMSwxMiBAQAogaW50IGlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7CiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMCwgbWFzazsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwogCiAJLyogc3RvcCBETUEgKi8KLQlpZiAobW1pbykgeworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pIHsKIAkJZG1hX2NtZCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOwogCQl3cml0ZWIoZG1hX2NtZCAmIH5BVEFfRE1BX1NUQVJULAogCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7CkBAIC0zMDUsMTUgKzMxNiwxMCBAQAogCX0KIAogCS8qIGdldCBETUEgc3RhdHVzICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCi0JaWYgKG1taW8pCi0JCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLwotCQl3cml0ZWIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAotCQkgICAgIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOworCS8qIGNsZWFyIElOVFIgJiBFUlJPUiBiaXRzICovCisJaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGh3aWYsIGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIpOwogCiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwpAQCAtMzMxLDcgKzMzNyw3IEBACiBpbnQgaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAogCXJldHVybiAoZG1hX3N0YXQgJiBBVEFfRE1BX0lOVFIpID8gMSA6IDA7CiB9CkBAIC0zNDYsNSArMzUyLDYgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChzZmZfZG1hX29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKaW5kZXggZmZmZDExNy4uNzJlYmFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwpAQCAtOTYsNyArOTYsNyBAQAogCiAJaWYgKE9LX1NUQVQoc3RhdCwgRFJJVkVfUkVBRFksIGRyaXZlLT5iYWRfd3N0YXQgfCBBVEFfRFJRKSkgewogCQlpZiAoIWRtYV9zdGF0KSB7Ci0JCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwkJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCiAJCQl0YXNrX2VuZF9yZXF1ZXN0KGRyaXZlLCBycSwgc3RhdCk7CiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggMGE0OGUyZC4uM2VhYjFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtNzEsNyArNzEsNyBAQAogc3RhdGljIGludCBpZGVfZmxvcHB5X2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnNlY3MpCiB7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaW50IGVycm9yOwogCiAJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZ2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1nZC5jCmluZGV4IGI4MDc4YjMuLjc4NTdiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1nZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1nZC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlyZXR1cm4gZHJpdmUtPmRpc2tfb3BzLT5lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUsIG5yc2Vjcyk7CiB9CiAKLXN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlX2dkX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWRlX2RyaXZlciBpZGVfZ2RfZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtZ2QiLApAQCAtMTYyLDcgKzE2Miw2IEBACiAJLnZlcnNpb24JCT0gSURFX0dEX1ZFUlNJT04sCiAJLmRvX3JlcXVlc3QJCT0gaWRlX2dkX2RvX3JlcXVlc3QsCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZV9nZF9lbmRfcmVxdWVzdCwKLQkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwogCS5wcm9jX2VudHJpZXMJCT0gaWRlX2Rpc2tfcHJvY19lbnRyaWVzLAogCS5wcm9jX2RldnNldHMJCT0gaWRlX2Rpc2tfcHJvY19kZXZzZXRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWdkLmggYi9kcml2ZXJzL2lkZS9pZGUtZ2QuaAppbmRleCA3ZDNkMTAxLi5hODY3NzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZ2QuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuaApAQCAtMTQsMTEgKzE0LDExIEBACiAjZW5kaWYKIAogc3RydWN0IGlkZV9kaXNrX29iaiB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7Ci0JdW5zaWduZWQgaW50CW9wZW5lcnM7CS8qIHByb3RlY3RlZCBieSBCS0wgZm9yIG5vdyAqLworCWlkZV9kcml2ZV90CQkqZHJpdmU7CisJc3RydWN0IGlkZV9kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJdW5zaWduZWQgaW50CQlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KIAogCS8qIExhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kICovCiAJc3RydWN0IGlkZV9hdGFwaV9wYyAqZmFpbGVkX3BjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWg4MzAwLmMgYi9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYwppbmRleCBlMmNkZDJlLi45MjcwZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYwpAQCAtMTU5LDcgKzE1OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pby5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKaW5kZXggMWMzNmE4ZS4uY2MxNjMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJcmV0ID0gMDsKIAogCWlmIChyZXQgPT0gMCAmJiBkZXF1ZXVlKQotCQlkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEgPSBOVUxMOworCQlkcml2ZS0+aHdpZi0+cnEgPSBOVUxMOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNyw3ICsxMDcsNyBAQAogaW50IGlkZV9lbmRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKQogewogCXVuc2lnbmVkIGludCBucl9ieXRlcyA9IG5yX3NlY3RvcnMgPDwgOTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCiAJaWYgKCFucl9ieXRlcykgewogCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQpAQCAtMTYwLDggKzE2MCw4IEBACiAgCiB2b2lkIGlkZV9lbmRfZHJpdmVfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHN0YXQsIHU4IGVycikKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCiAJaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfVEFTS0ZJTEUpIHsKIAkJaWRlX3Rhc2tfdCAqdGFzayA9IChpZGVfdGFza190ICopcnEtPnNwZWNpYWw7CkBAIC0xODYsNyArMTg2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwlod2lmLT5ycSA9IE5VTEw7CiAKIAlycS0+ZXJyb3JzID0gZXJyOwogCkBAIC0xOTksOSArMTk5LDkgQEAKIHN0YXRpYyB2b2lkIGlkZV9raWxsX3JxKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWlmIChycS0+cnFfZGlzaykgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCWRydi0+ZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwogCX0gZWxzZQogCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQogCi1pZGVfc3RhcnRzdG9wX3QKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QKIF9faWRlX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCB1OCBzdGF0LCB1OCBlcnIpCiB7CiAJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKQEAgLTI5OSw4ICsyOTksNiBAQAogCXJldHVybiBpZGVfYXRhcGlfZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChfX2lkZV9lcnJvcik7Ci0KIC8qKgogICoJaWRlX2Vycm9yCS0JaGFuZGxlIGFuIGVycm9yIG9uIHRoZSBJREUKICAqCUBkcml2ZTogZHJpdmUgdGhlIGVycm9yIG9jY3VycmVkIG9uCkBAIC0zMjEsNyArMzE5LDggQEAKIAogCWVyciA9IGlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgbXNnLCBzdGF0KTsKIAotCWlmICgocnEgPSBIV0dST1VQKGRyaXZlKS0+cnEpID09IE5VTEwpCisJcnEgPSBkcml2ZS0+aHdpZi0+cnE7CisJaWYgKHJxID09IE5VTEwpCiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAogCS8qIHJldHJ5IG9ubHkgIm5vcm1hbCIgSS9POiAqLwpAQCAtMzMxLDE1ICszMzAsOCBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCi0JaWYgKHJxLT5ycV9kaXNrKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2OwotCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCXJldHVybiBkcnYtPmVycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKLQl9IGVsc2UKLQkJcmV0dXJuIF9faWRlX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKKwlyZXR1cm4gX19pZGVfZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZXJyb3IpOwogCiBzdGF0aWMgdm9pZCBpZGVfdGZfc2V0X3NwZWNpZnlfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV90YXNrZmlsZSAqdGYpCkBAIC00NjIsNyArNDU0LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZXhlY3V0ZV9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwKIAkJc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJaWRlX3Rhc2tfdCAqdGFzayA9IHJxLT5zcGVjaWFsOwogCiAJaWYgKHRhc2spIHsKQEAgLTU4Niw3ICs1NzgsNyBAQAogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiBzdGFydF9yZXF1ZXN0OiBjdXJyZW50PTB4JTA4bHhcbiIsCi0JCUhXSUYoZHJpdmUpLT5uYW1lLCAodW5zaWduZWQgbG9uZykgcnEpOworCQlkcml2ZS0+aHdpZi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHJxKTsKICNlbmRpZgogCiAJLyogYmFpbCBlYXJseSBpZiB3ZSd2ZSBleGNlZWRlZCBtYXhfZmFpbHVyZXMgKi8KQEAgLTYwNSw3ICs1OTcsNyBAQAogCQlyZXR1cm4gc3RhcnRzdG9wOwogCX0KIAlpZiAoIWRyaXZlLT5zcGVjaWFsLmFsbCkgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAogCQkvKgogCQkgKiBXZSByZXNldCB0aGUgZHJpdmUgc28gd2UgbmVlZCB0byBpc3N1ZSBhIFNFVEZFQVRVUkVTLgpAQCAtNjM4LDcgKzYzMCw3IEBACiAJCQkgKi8KIAkJCXJldHVybiBpZGVfc3BlY2lhbF9ycShkcml2ZSwgcnEpOwogCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCWRydiA9ICooc3RydWN0IGlkZV9kcml2ZXIgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKIAogCQlyZXR1cm4gZHJ2LT5kb19yZXF1ZXN0KGRyaXZlLCBycSwgcnEtPnNlY3Rvcik7CiAJfQpAQCAtNjU0LDcgKzY0Niw3IEBACiAgKglAdGltZW91dDogdGltZSB0byBzdGFsbCBmb3IgKGppZmZpZXMpCiAgKgogICoJaWRlX3N0YWxsX3F1ZXVlKCkgY2FuIGJlIHVzZWQgYnkgYSBkcml2ZSB0byBnaXZlIGV4Y2VzcyBiYW5kd2lkdGggYmFjawotICoJdG8gdGhlIGh3Z3JvdXAgYnkgc2xlZXBpbmcgZm9yIHRpbWVvdXQgamlmZmllcy4KKyAqCXRvIHRoZSBwb3J0IGJ5IHNsZWVwaW5nIGZvciB0aW1lb3V0IGppZmZpZXMuCiAgKi8KICAKIHZvaWQgaWRlX3N0YWxsX3F1ZXVlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKQEAgLTY2Niw0NSArNjU4LDUzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9zdGFsbF9xdWV1ZSk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZiAoaHdpZi0+YnVzeSkKKwkJcmV0dXJuIDE7CisKKwlod2lmLT5idXN5ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3VubG9ja19wb3J0KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YnVzeSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX2hvc3Qoc3RydWN0IGlkZV9ob3N0ICpob3N0LCBpZGVfaHdpZl90ICpod2lmKQoreworCWludCByYyA9IDA7CisKKwlpZiAoaG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHsKKwkJcmMgPSB0ZXN0X2FuZF9zZXRfYml0X2xvY2soSURFX0hPU1RfQlVTWSwgJmhvc3QtPmhvc3RfYnVzeSk7CisJCWlmIChyYyA9PSAwKSB7CisJCQkvKiBmb3IgYXRhcmkgb25seSAqLworCQkJaWRlX2dldF9sb2NrKGlkZV9pbnRyLCBod2lmKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfdW5sb2NrX2hvc3Qoc3RydWN0IGlkZV9ob3N0ICpob3N0KQoreworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgeworCQkvKiBmb3IgYXRhcmkgb25seSAqLworCQlpZGVfcmVsZWFzZV9sb2NrKCk7CisJCWNsZWFyX2JpdF91bmxvY2soSURFX0hPU1RfQlVTWSwgJmhvc3QtPmhvc3RfYnVzeSk7CisJfQorfQorCiAvKgotICogSXNzdWUgYSBuZXcgcmVxdWVzdCB0byBhIGRyaXZlIGZyb20gaHdncm91cAotICoKLSAqIEEgaHdncm91cCBpcyBhIHNlcmlhbGl6ZWQgZ3JvdXAgb2YgSURFIGludGVyZmFjZXMuICBVc3VhbGx5IHRoZXJlIGlzCi0gKiBleGFjdGx5IG9uZSBod2lmIChpbnRlcmZhY2UpIHBlciBod2dyb3VwLCBidXQgYnVnZ3kgY29udHJvbGxlcnMgKGVnLiBDTUQ2NDApCi0gKiBtYXkgaGF2ZSBib3RoIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgaHdncm91cCB0byAic2VyaWFsaXplIiBhY2Nlc3MuCi0gKiBPciBwb3NzaWJseSBtdWx0aXBsZSBJU0EgaW50ZXJmYWNlcyBjYW4gc2hhcmUgYSBjb21tb24gSVJRIGJ5IGJlaW5nIGdyb3VwZWQKLSAqIHRvZ2V0aGVyIGludG8gb25lIGh3Z3JvdXAgZm9yIHNlcmlhbGl6ZWQgYWNjZXNzLgotICoKLSAqIE5vdGUgYWxzbyB0aGF0IHNldmVyYWwgaHdncm91cHMgY2FuIGVuZCB1cCBzaGFyaW5nIGEgc2luZ2xlIElSUSwKLSAqIHBvc3NpYmx5IGFsb25nIHdpdGggbWFueSBvdGhlciBkZXZpY2VzLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGNvbW1vbiBpbgotICogUENJLWJhc2VkIHN5c3RlbXMgd2l0aCBvZmYtYm9hcmQgSURFIGNvbnRyb2xsZXIgY2FyZHMuCi0gKgotICogVGhlIElERSBkcml2ZXIgdXNlcyBhIHBlci1od2dyb3VwIGxvY2sgdG8gcHJvdGVjdCB0aGUgaHdncm91cC0+YnVzeSBmbGFnLgotICoKLSAqIFRoZSBmaXJzdCB0aHJlYWQgaW50byB0aGUgZHJpdmVyIGZvciBhIHBhcnRpY3VsYXIgaHdncm91cCBzZXRzIHRoZQotICogaHdncm91cC0+YnVzeSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBod2dyb3VwIGlzIG5vdyBhY3RpdmUsCi0gKiBhbmQgdGhlbiBpbml0aWF0ZXMgcHJvY2Vzc2luZyBvZiB0aGUgdG9wIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBxdWV1ZS4KLSAqCi0gKiBPdGhlciB0aHJlYWRzIGF0dGVtcHRpbmcgZW50cnkgbm90aWNlIHRoZSBidXN5IHNldHRpbmcsIGFuZCB3aWxsIHNpbXBseQotICogcXVldWUgdGhlaXIgbmV3IHJlcXVlc3RzIGFuZCBleGl0IGltbWVkaWF0ZWx5LiAgTm90ZSB0aGF0IGh3Z3JvdXAtPmJ1c3kKLSAqIHJlbWFpbnMgc2V0IGV2ZW4gd2hlbiB0aGUgZHJpdmVyIGlzIG1lcmVseSBhd2FpdGluZyB0aGUgbmV4dCBpbnRlcnJ1cHQuCi0gKiBUaHVzLCB0aGUgbWVhbmluZyBpcyAidGhpcyBod2dyb3VwIGlzIGJ1c3kgcHJvY2Vzc2luZyBhIHJlcXVlc3QiLgotICoKLSAqIFdoZW4gcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QgY29tcGxldGVzLCB0aGUgY29tcGxldGluZyB0aHJlYWQgb3IgSVJRLWhhbmRsZXIKLSAqIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZS4gIElmIG5vIG1vcmUgd29yayByZW1haW5zLAotICogdGhlIGRyaXZlciB3aWxsIGNsZWFyIHRoZSBod2dyb3VwLT5idXN5IGZsYWcgYW5kIGV4aXQuCi0gKgotICogVGhlIHBlci1od2dyb3VwIHNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBhbGwgYWNjZXNzIHRvIHRoZQotICogaHdncm91cC0+YnVzeSBmbGFnLCBidXQgaXMgb3RoZXJ3aXNlIG5vdCBuZWVkZWQgZm9yIG1vc3QgcHJvY2Vzc2luZyBpbgotICogdGhlIGRyaXZlci4gIFRoaXMgbWFrZXMgdGhlIGRyaXZlciBtdWNoIG1vcmUgZnJpZW5kbGllciB0byBzaGFyZWQgSVJRcwotICogdGhhbiBwcmV2aW91cyBkZXNpZ25zLCB3aGlsZSByZW1haW5pbmcgMTAwJSAoPykgU01QIHNhZmUgYW5kIGNhcGFibGUuCisgKiBJc3N1ZSBhIG5ldyByZXF1ZXN0IHRvIGEgZGV2aWNlLgogICovCiB2b2lkIGRvX2lkZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlkZV9kcml2ZV90CSpkcml2ZSA9IHEtPnF1ZXVlZGF0YTsKIAlpZGVfaHdpZl90CSpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdAkqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QJKnJxOworCXN0cnVjdCBpZGVfaG9zdCAqaG9zdCA9IGh3aWYtPmhvc3Q7CisJc3RydWN0IHJlcXVlc3QJKnJxID0gTlVMTDsKIAlpZGVfc3RhcnRzdG9wX3QJc3RhcnRzdG9wOwogCiAJLyoKQEAgLTcyMSwzMiArNzIxLDQwIEBACiAJCWJsa19yZW1vdmVfcGx1ZyhxKTsKIAogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAotCWlmICghaWRlX2xvY2tfaHdncm91cChod2dyb3VwKSkgeworCWlmIChpZGVfbG9ja19ob3N0KGhvc3QsIGh3aWYpKQorCQlnb3RvIHBsdWdfZGV2aWNlXzI7CisKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKKworCWlmICghaWRlX2xvY2tfcG9ydChod2lmKSkgeworCQlpZGVfaHdpZl90ICpwcmV2X3BvcnQ7CiByZXBlYXQ6Ci0JCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJcHJldl9wb3J0ID0gaHdpZi0+aG9zdC0+Y3VyX3BvcnQ7CisJCWh3aWYtPnJxID0gTlVMTDsKIAogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TTEVFUElORykgewogCQkJaWYgKHRpbWVfYmVmb3JlKGRyaXZlLT5zbGVlcCwgamlmZmllcykpIHsKLQkJCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7CisJCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJCWdvdG8gcGx1Z19kZXZpY2U7CiAJCQl9CiAJCX0KIAotCQlpZiAoaHdpZiAhPSBod2dyb3VwLT5od2lmKSB7CisJCWlmICgoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpICYmCisJCSAgICBod2lmICE9IHByZXZfcG9ydCkgewogCQkJLyoKLQkJCSAqIHNldCBuSUVOIGZvciBwcmV2aW91cyBod2lmLCBkcml2ZXMgaW4gdGhlCisJCQkgKiBzZXQgbklFTiBmb3IgcHJldmlvdXMgcG9ydCwgZHJpdmVzIGluIHRoZQogCQkJICogcXVpcmtfbGlzdCBtYXkgbm90IGxpa2UgaW50ciBzZXR1cHMvY2xlYW51cHMKIAkJCSAqLwotCQkJaWYgKGRyaXZlLT5xdWlya19saXN0ID09IDApCi0JCQkJaHdpZi0+dHBfb3BzLT5zZXRfaXJxKGh3aWYsIDApOworCQkJaWYgKHByZXZfcG9ydCAmJiBwcmV2X3BvcnQtPmN1cl9kZXYtPnF1aXJrX2xpc3QgPT0gMCkKKwkJCQlwcmV2X3BvcnQtPnRwX29wcy0+c2V0X2lycShwcmV2X3BvcnQsIDApOworCisJCQlod2lmLT5ob3N0LT5jdXJfcG9ydCA9IGh3aWY7CiAJCX0KLQkJaHdncm91cC0+aHdpZiA9IGh3aWY7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmU7CisJCWh3aWYtPmN1cl9kZXYgPSBkcml2ZTsKIAkJZHJpdmUtPmRldl9mbGFncyAmPSB+KElERV9ERkxBR19TTEVFUElORyB8IElERV9ERkxBR19QQVJLRUQpOwogCi0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCS8qCiAJCSAqIHdlIGtub3cgdGhhdCB0aGUgcXVldWUgaXNuJ3QgZW1wdHksIGJ1dCB0aGlzIGNhbiBoYXBwZW4KQEAgLTc1NCwxMCArNzYyLDEwIEBACiAJCSAqLwogCQlycSA9IGVsdl9uZXh0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlKTsKIAkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAkJaWYgKCFycSkgewotCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOworCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtNzc4LDI3ICs3ODYsMzEgQEAKIAkJICAgIGJsa19wbV9yZXF1ZXN0KHJxKSA9PSAwICYmCiAJCSAgICAocnEtPmNtZF9mbGFncyAmIFJFUV9QUkVFTVBUKSA9PSAwKSB7CiAJCQkvKiB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyBjb21tYW5kIGF0IHRoaXMgcG9pbnQgKi8KLQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKKwkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKIAkJCWdvdG8gcGx1Z19kZXZpY2U7CiAJCX0KIAotCQlod2dyb3VwLT5ycSA9IHJxOworCQlod2lmLT5ycSA9IHJxOwogCi0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJCXN0YXJ0c3RvcCA9IHN0YXJ0X3JlcXVlc3QoZHJpdmUsIHJxKTsKLQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpCiAJCQlnb3RvIHJlcGVhdDsKIAl9IGVsc2UKIAkJZ290byBwbHVnX2RldmljZTsKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CisJaWYgKHJxID09IE5VTEwpCisJCWlkZV91bmxvY2tfaG9zdChob3N0KTsKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCXJldHVybjsKIAogcGx1Z19kZXZpY2U6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOworCWlkZV91bmxvY2tfaG9zdChob3N0KTsKK3BsdWdfZGV2aWNlXzI6CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCWlmICghZWx2X3F1ZXVlX2VtcHR5KHEpKQpAQCAtODA2LDEzICs4MTgsMTMgQEAKIH0KIAogLyoKLSAqIHVuLWJ1c3kgdGhlIGh3Z3JvdXAgZXRjLCBhbmQgY2xlYXIgYW55IHBlbmRpbmcgRE1BIHN0YXR1cy4gd2Ugd2FudCB0bworICogdW4tYnVzeSB0aGUgcG9ydCBldGMsIGFuZCBjbGVhciBhbnkgcGVuZGluZyBETUEgc3RhdHVzLiB3ZSB3YW50IHRvCiAgKiByZXRyeSB0aGUgY3VycmVudCByZXF1ZXN0IGluIHBpbyBtb2RlIGluc3RlYWQgb2Ygcmlza2luZyB0b3NzaW5nIGl0CiAgKiBhbGwgYXdheQogICovCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9kbWFfdGltZW91dF9yZXRyeShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBlcnJvcikKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlpZGVfc3RhcnRzdG9wX3QgcmV0ID0gaWRlX3N0b3BwZWQ7CiAKQEAgLTg0MCwxNSArODUyLDE0IEBACiAJaWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CiAKIAkvKgotCSAqIHVuLWJ1c3kgZHJpdmUgZXRjIChod2dyb3VwLT5idXN5IGlzIGNsZWFyZWQgb24gcmV0dXJuKSBhbmQKLQkgKiBtYWtlIHN1cmUgcmVxdWVzdCBpcyBzYW5lCisJICogdW4tYnVzeSBkcml2ZSBldGMgYW5kIG1ha2Ugc3VyZSByZXF1ZXN0IGlzIHNhbmUKIAkgKi8KLQlycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKIAorCXJxID0gaHdpZi0+cnE7CiAJaWYgKCFycSkKIAkJZ290byBvdXQ7CiAKLQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCWh3aWYtPnJxID0gTlVMTDsKIAogCXJxLT5lcnJvcnMgPSAwOwogCkBAIC04NzYsNyArODg3LDcgQEAKIAogLyoqCiAgKglpZGVfdGltZXJfZXhwaXJ5CS0JaGFuZGxlIGxhY2sgb2YgYW4gSURFIGludGVycnVwdAotICoJQGRhdGE6IHRpbWVyIGNhbGxiYWNrIG1hZ2ljIChod2dyb3VwKQorICoJQGRhdGE6IHRpbWVyIGNhbGxiYWNrIG1hZ2ljIChod2lmKQogICoKICAqCUFuIElERSBjb21tYW5kIGhhcyB0aW1lZCBvdXQgYmVmb3JlIHRoZSBleHBlY3RlZCBkcml2ZSByZXR1cm4KICAqCW9jY3VycmVkLiBBdCB0aGlzIHBvaW50IHdlIGF0dGVtcHQgdG8gY2xlYW4gdXAgdGhlIGN1cnJlbnQKQEAgLTg5MCwxOCArOTAxLDE4IEBACiAgCiB2b2lkIGlkZV90aW1lcl9leHBpcnkgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpZGVfaHdncm91cF90CSpod2dyb3VwID0gKGlkZV9od2dyb3VwX3QgKikgZGF0YTsKKwlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKilkYXRhOwogCWlkZV9kcml2ZV90CSp1bmluaXRpYWxpemVkX3Zhcihkcml2ZSk7CiAJaWRlX2hhbmRsZXJfdAkqaGFuZGxlcjsKLQlpZGVfZXhwaXJ5X3QJKmV4cGlyeTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXVuc2lnbmVkIGxvbmcJd2FpdCA9IC0xOwogCWludAkJcGx1Z19kZXZpY2UgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwpIHx8Ci0JICAgIChod2dyb3VwLT5yZXFfZ2VuICE9IGh3Z3JvdXAtPnJlcV9nZW5fdGltZXIpKSB7CisJaGFuZGxlciA9IGh3aWYtPmhhbmRsZXI7CisKKwlpZiAoaGFuZGxlciA9PSBOVUxMIHx8IGh3aWYtPnJlcV9nZW4gIT0gaHdpZi0+cmVxX2dlbl90aW1lcikgewogCQkvKgogCQkgKiBFaXRoZXIgYSBtYXJnaW5hbCB0aW1lb3V0IG9jY3VycmVkCiAJCSAqIChnb3QgdGhlIGludGVycnVwdCBqdXN0IGFzIHRpbWVyIGV4cGlyZWQpLApAQCAtOTA5LDcyICs5MjAsNjggQEAKIAkJICogRWl0aGVyIHdheSwgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gY29tcGxhaW4gYWJvdXQgYW55dGhpbmcuCiAJCSAqLwogCX0gZWxzZSB7Ci0JCWRyaXZlID0gaHdncm91cC0+ZHJpdmU7Ci0JCWlmICghZHJpdmUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaWRlX3RpbWVyX2V4cGlyeTogaHdncm91cC0+ZHJpdmUgd2FzIE5VTExcbiIpOwotCQkJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlpZGVfaHdpZl90ICpod2lmOwotCQkJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcCA9IGlkZV9zdG9wcGVkOworCQlpZGVfZXhwaXJ5X3QgKmV4cGlyeSA9IGh3aWYtPmV4cGlyeTsKKwkJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcCA9IGlkZV9zdG9wcGVkOwogCi0JCQlpZiAoKGV4cGlyeSA9IGh3Z3JvdXAtPmV4cGlyeSkgIT0gTlVMTCkgewotCQkJCS8qIGNvbnRpbnVlICovCi0JCQkJaWYgKCh3YWl0ID0gZXhwaXJ5KGRyaXZlKSkgPiAwKSB7Ci0JCQkJCS8qIHJlc2V0IHRpbWVyICovCi0JCQkJCWh3Z3JvdXAtPnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIHdhaXQ7Ci0JCQkJCWh3Z3JvdXAtPnJlcV9nZW5fdGltZXIgPSBod2dyb3VwLT5yZXFfZ2VuOwotCQkJCQlhZGRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7Ci0JCQkvKgotCQkJICogV2UgbmVlZCB0byBzaW11bGF0ZSBhIHJlYWwgaW50ZXJydXB0IHdoZW4gaW52b2tpbmcKLQkJCSAqIHRoZSBoYW5kbGVyKCkgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8KLQkJCSAqIGdsb2JhbGx5IG1hc2sgdGhlIHNwZWNpZmljIElSUToKLQkJCSAqLwotCQkJc3Bpbl91bmxvY2soJmh3Z3JvdXAtPmxvY2spOwotCQkJaHdpZiAgPSBIV0lGKGRyaXZlKTsKLQkJCS8qIGRpc2FibGVfaXJxX25vc3luYyA/PyAqLwotCQkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKLQkJCS8qIGxvY2FsIENQVSBvbmx5LAotCQkJICogYXMgaWYgd2Ugd2VyZSBoYW5kbGluZyBhbiBpbnRlcnJ1cHQgKi8KLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCQlpZiAoaHdncm91cC0+cG9sbGluZykgewotCQkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwotCQkJfSBlbHNlIGlmIChkcml2ZV9pc19yZWFkeShkcml2ZSkpIHsKLQkJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKLQkJCQkJaHdpZi0+ZG1hX29wcy0+ZG1hX2xvc3RfaXJxKGRyaXZlKTsKLQkJCQkodm9pZClpZGVfYWNrX2ludHIoaHdpZik7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxvc3QgaW50ZXJydXB0XG4iLCBkcml2ZS0+bmFtZSk7Ci0JCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKSB7Ci0JCQkJCXN0YXJ0c3RvcCA9IGlkZV9kbWFfdGltZW91dF9yZXRyeShkcml2ZSwgd2FpdCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXN0YXJ0c3RvcCA9Ci0JCQkJCWlkZV9lcnJvcihkcml2ZSwgImlycSB0aW1lb3V0IiwKLQkJCQkJCSAgaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSk7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQkJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKLQkJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpIHsKLQkJCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7Ci0JCQkJcGx1Z19kZXZpY2UgPSAxOworCQlkcml2ZSA9IGh3aWYtPmN1cl9kZXY7CisKKwkJaWYgKGV4cGlyeSkgeworCQkJd2FpdCA9IGV4cGlyeShkcml2ZSk7CisJCQlpZiAod2FpdCA+IDApIHsgLyogY29udGludWUgKi8KKwkJCQkvKiByZXNldCB0aW1lciAqLworCQkJCWh3aWYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgd2FpdDsKKwkJCQlod2lmLT5yZXFfZ2VuX3RpbWVyID0gaHdpZi0+cmVxX2dlbjsKKwkJCQlhZGRfdGltZXIoJmh3aWYtPnRpbWVyKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuOwogCQkJfQogCQl9CisJCWh3aWYtPmhhbmRsZXIgPSBOVUxMOworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHNpbXVsYXRlIGEgcmVhbCBpbnRlcnJ1cHQgd2hlbiBpbnZva2luZworCQkgKiB0aGUgaGFuZGxlcigpIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvCisJCSAqIGdsb2JhbGx5IG1hc2sgdGhlIHNwZWNpZmljIElSUToKKwkJICovCisJCXNwaW5fdW5sb2NrKCZod2lmLT5sb2NrKTsKKwkJLyogZGlzYWJsZV9pcnFfbm9zeW5jID8/ICovCisJCWRpc2FibGVfaXJxKGh3aWYtPmlycSk7CisJCS8qIGxvY2FsIENQVSBvbmx5LCBhcyBpZiB3ZSB3ZXJlIGhhbmRsaW5nIGFuIGludGVycnVwdCAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlpZiAoaHdpZi0+cG9sbGluZykgeworCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7CisJCX0gZWxzZSBpZiAoZHJpdmVfaXNfcmVhZHkoZHJpdmUpKSB7CisJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJCQlod2lmLT5kbWFfb3BzLT5kbWFfbG9zdF9pcnEoZHJpdmUpOworCQkJKHZvaWQpaWRlX2Fja19pbnRyKGh3aWYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxvc3QgaW50ZXJydXB0XG4iLAorCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCQl9IGVsc2UgeworCQkJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCisJCQkJc3RhcnRzdG9wID0gaWRlX2RtYV90aW1lb3V0X3JldHJ5KGRyaXZlLCB3YWl0KTsKKwkJCWVsc2UKKwkJCQlzdGFydHN0b3AgPSBpZGVfZXJyb3IoZHJpdmUsICJpcnEgdGltZW91dCIsCisJCQkJCWh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpOworCQl9CisJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOworCQllbmFibGVfaXJxKGh3aWYtPmlycSk7CisJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpIHsKKwkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKKwkJCXBsdWdfZGV2aWNlID0gMTsKKwkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHBsdWdfZGV2aWNlKQorCWlmIChwbHVnX2RldmljZSkgeworCQlpZGVfdW5sb2NrX2hvc3QoaHdpZi0+aG9zdCk7CiAJCWlkZV9wbHVnX2RldmljZShkcml2ZSk7CisJfQogfQogCiAvKioKICAqCXVuZXhwZWN0ZWRfaW50cgkJLQloYW5kbGUgYW4gdW5leHBlY3RlZCBJREUgaW50ZXJydXB0CiAgKglAaXJxOiBpbnRlcnJ1cHQgbGluZQotICoJQGh3Z3JvdXA6IGh3Z3JvdXAgYmVpbmcgcHJvY2Vzc2VkCisgKglAaHdpZjogcG9ydCBiZWluZyBwcm9jZXNzZWQKICAqCiAgKglUaGVyZSdzIG5vdGhpbmcgcmVhbGx5IHVzZWZ1bCB3ZSBjYW4gZG8gd2l0aCBhbiB1bmV4cGVjdGVkIGludGVycnVwdCwKICAqCW90aGVyIHRoYW4gcmVhZGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICh0byBjbGVhciBpdCksIGFuZCBsb2dnaW5nIGl0LgpAQCAtOTk4LDUyICsxMDA1LDM4IEBACiAgKgliZWZvcmUgY29tcGxldGluZyB0aGUgaXNzdWFuY2Ugb2YgYW55IG5ldyBkcml2ZSBjb21tYW5kLCBzbyB3ZSB3aWxsIG5vdAogICoJYmUgYWNjaWRlbnRhbGx5IGludm9rZWQgYXMgYSByZXN1bHQgb2YgYW55IHZhbGlkIGNvbW1hbmQgY29tcGxldGlvbgogICoJaW50ZXJydXB0LgotICoKLSAqCU5vdGUgdGhhdCB3ZSBtdXN0IHdhbGsgdGhlIGVudGlyZSBod2dyb3VwIGhlcmUuIFdlIGtub3cgd2hpY2ggaHdpZgotICoJaXMgZG9pbmcgdGhlIGN1cnJlbnQgY29tbWFuZCwgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggaHdpZiBidXJwZWQKLSAqCW15c3RlcmlvdXNseS4KICAqLwotIAotc3RhdGljIHZvaWQgdW5leHBlY3RlZF9pbnRyIChpbnQgaXJxLCBpZGVfaHdncm91cF90ICpod2dyb3VwKQorCitzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX2ludHIoaW50IGlycSwgaWRlX2h3aWZfdCAqaHdpZikKIHsKLQl1OCBzdGF0OwotCWlkZV9od2lmX3QgKmh3aWYgPSBod2dyb3VwLT5od2lmOworCXU4IHN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCi0JLyoKLQkgKiBoYW5kbGUgdGhlIHVuZXhwZWN0ZWQgaW50ZXJydXB0Ci0JICovCi0JZG8gewotCQlpZiAoaHdpZi0+aXJxID09IGlycSkgewotCQkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CisJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCkpIHsKKwkJLyogVHJ5IHRvIG5vdCBmbG9vZCB0aGUgY29uc29sZSB3aXRoIG1zZ3MgKi8KKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tc2d0aW1lLCBjb3VudDsKKwkJKytjb3VudDsKIAotCQkJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCkpIHsKLQkJCQkvKiBUcnkgdG8gbm90IGZsb29kIHRoZSBjb25zb2xlIHdpdGggbXNncyAqLwotCQkJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfbXNndGltZSwgY291bnQ7Ci0JCQkJKytjb3VudDsKLQkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X21zZ3RpbWUgKyBIWikpIHsKLQkJCQkJbGFzdF9tc2d0aW1lID0gamlmZmllczsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyVzOiB1bmV4cGVjdGVkIGludGVycnVwdCwgIgotCQkJCQkJInN0YXR1cz0weCUwMngsIGNvdW50PSVsZFxuIiwKLQkJCQkJCWh3aWYtPm5hbWUsCi0JCQkJCQkoaHdpZi0+bmV4dD09aHdncm91cC0+aHdpZikgPyAiIiA6ICIoPykiLCBzdGF0LCBjb3VudCk7Ci0JCQkJfQotCQkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X21zZ3RpbWUgKyBIWikpIHsKKwkJCWxhc3RfbXNndGltZSA9IGppZmZpZXM7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIGludGVycnVwdCwgIgorCQkJCSJzdGF0dXM9MHglMDJ4LCBjb3VudD0lbGRcbiIsCisJCQkJaHdpZi0+bmFtZSwgc3RhdCwgY291bnQpOwogCQl9Ci0JfSB3aGlsZSAoKGh3aWYgPSBod2lmLT5uZXh0KSAhPSBod2dyb3VwLT5od2lmKTsKKwl9CiB9CiAKIC8qKgogICoJaWRlX2ludHIJLQlkZWZhdWx0IElERSBpbnRlcnJ1cHQgaGFuZGxlcgogICoJQGlycTogaW50ZXJydXB0IG51bWJlcgotICoJQGRldl9pZDogaHdpZiBncm91cAorICoJQGRldl9pZDogaHdpZgogICoJQHJlZ3M6IHVudXNlZCB3ZWlyZG5lc3MgZnJvbSB0aGUga2VybmVsIGlycSBsYXllcgogICoKICAqCVRoaXMgaXMgdGhlIGRlZmF1bHQgSVJRIGhhbmRsZXIgZm9yIHRoZSBJREUgbGF5ZXIuIFlvdSBzaG91bGQKICAqCW5vdCBuZWVkIHRvIG92ZXJyaWRlIGl0LiBJZiB5b3UgZG8gYmUgYXdhcmUgaXQgaXMgc3VidGxlIGluCiAgKglwbGFjZXMKICAqCi0gKglod2dyb3VwLT5od2lmIGlzIHRoZSBpbnRlcmZhY2UgaW4gdGhlIGdyb3VwIGN1cnJlbnRseSBwZXJmb3JtaW5nCi0gKglhIGNvbW1hbmQuIGh3Z3JvdXAtPmRyaXZlIGlzIHRoZSBkcml2ZSBhbmQgaHdncm91cC0+aGFuZGxlciBpcworICoJaHdpZiBpcyB0aGUgaW50ZXJmYWNlIGluIHRoZSBncm91cCBjdXJyZW50bHkgcGVyZm9ybWluZworICoJYSBjb21tYW5kLiBod2lmLT5jdXJfZGV2IGlzIHRoZSBkcml2ZSBhbmQgaHdpZi0+aGFuZGxlciBpcwogICoJdGhlIElSUSBoYW5kbGVyIHRvIGNhbGwuIEFzIHdlIGlzc3VlIGEgY29tbWFuZCB0aGUgaGFuZGxlcnMKICAqCXN0ZXAgdGhyb3VnaCBtdWx0aXBsZSBzdGF0ZXMsIHJlYXNzaWduaW5nIHRoZSBoYW5kbGVyIHRvIHRoZQogICoJbmV4dCBzdGVwIGluIHRoZSBwcm9jZXNzLiBVbmxpa2UgYSBzbWFydCBTQ1NJIGNvbnRyb2xsZXIgSURFCkBAIC0xMDU0LDI2ICsxMDQ3LDMyIEBACiAgKgogICoJVGhlIGhhbmRsZXIgZXZlbnR1YWxseSByZXR1cm5zIGlkZV9zdG9wcGVkIHRvIGluZGljYXRlIHRoZQogICoJcmVxdWVzdCBjb21wbGV0ZWQuIEF0IHRoaXMgcG9pbnQgd2UgaXNzdWUgdGhlIG5leHQgcmVxdWVzdAotICoJb24gdGhlIGh3Z3JvdXAgYW5kIHRoZSBwcm9jZXNzIGJlZ2lucyBhZ2Fpbi4KKyAqCW9uIHRoZSBwb3J0IGFuZCB0aGUgcHJvY2VzcyBiZWdpbnMgYWdhaW4uCiAgKi8KLSAKKwogaXJxcmV0dXJuX3QgaWRlX2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSAoaWRlX2h3Z3JvdXBfdCAqKWRldl9pZDsKLQlpZGVfaHdpZl90ICpod2lmID0gaHdncm91cC0+aHdpZjsKKwlpZGVfaHdpZl90ICpod2lmID0gKGlkZV9od2lmX3QgKilkZXZfaWQ7CiAJaWRlX2RyaXZlX3QgKnVuaW5pdGlhbGl6ZWRfdmFyKGRyaXZlKTsKIAlpZGVfaGFuZGxlcl90ICpoYW5kbGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKIAlpcnFyZXR1cm5fdCBpcnFfcmV0ID0gSVJRX05PTkU7CiAJaW50IHBsdWdfZGV2aWNlID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJaWYgKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7CisJCWlmIChod2lmICE9IGh3aWYtPmhvc3QtPmN1cl9wb3J0KQorCQkJZ290byBvdXRfZWFybHk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghaWRlX2Fja19pbnRyKGh3aWYpKQogCQlnb3RvIG91dDsKIAotCWlmICgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwgfHwgaHdncm91cC0+cG9sbGluZykgeworCWhhbmRsZXIgPSBod2lmLT5oYW5kbGVyOworCisJaWYgKGhhbmRsZXIgPT0gTlVMTCB8fCBod2lmLT5wb2xsaW5nKSB7CiAJCS8qCiAJCSAqIE5vdCBleHBlY3RpbmcgYW4gaW50ZXJydXB0IGZyb20gdGhpcyBkcml2ZS4KIAkJICogVGhhdCBtZWFucyB0aGlzIGNvdWxkIGJlOgpAQCAtMTA5Nyw3ICsxMDk2LDcgQEAKIAkJCSAqIFByb2JhYmx5IG5vdCBhIHNoYXJlZCBQQ0kgaW50ZXJydXB0LAogCQkJICogc28gd2UgY2FuIHNhZmVseSB0cnkgdG8gZG8gc29tZXRoaW5nIGFib3V0IGl0OgogCQkJICovCi0JCQl1bmV4cGVjdGVkX2ludHIoaXJxLCBod2dyb3VwKTsKKwkJCXVuZXhwZWN0ZWRfaW50cihpcnEsIGh3aWYpOwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBDSQogCQl9IGVsc2UgewogCQkJLyoKQEAgLTExMTAsMTYgKzExMDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkcml2ZSA9IGh3Z3JvdXAtPmRyaXZlOwotCWlmICghZHJpdmUpIHsKLQkJLyoKLQkJICogVGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLCBhbmQgdGhlcmUgaXNuJ3QgbXVjaAotCQkgKiB3ZSBjb3VsZCBkbyBhYm91dCBpdCBoZXJlLgotCQkgKgotCQkgKiBbTm90ZSAtIHRoaXMgY2FuIG9jY3VyIGlmIHRoZSBkcml2ZSBpcyBob3QgdW5wbHVnZ2VkXQotCQkgKi8KLQkJZ290byBvdXRfaGFuZGxlZDsKLQl9CisJZHJpdmUgPSBod2lmLT5jdXJfZGV2OwogCiAJaWYgKCFkcml2ZV9pc19yZWFkeShkcml2ZSkpCiAJCS8qCkBAIC0xMTMxLDEwICsxMTIxLDEwIEBACiAJCSAqLwogCQlnb3RvIG91dDsKIAotCWh3Z3JvdXAtPmhhbmRsZXIgPSBOVUxMOwotCWh3Z3JvdXAtPnJlcV9nZW4rKzsKLQlkZWxfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKLQlzcGluX3VubG9jaygmaHdncm91cC0+bG9jayk7CisJaHdpZi0+aGFuZGxlciA9IE5VTEw7CisJaHdpZi0+cmVxX2dlbisrOworCWRlbF90aW1lcigmaHdpZi0+dGltZXIpOworCXNwaW5fdW5sb2NrKCZod2lmLT5sb2NrKTsKIAogCWlmIChod2lmLT5wb3J0X29wcyAmJiBod2lmLT5wb3J0X29wcy0+Y2xlYXJfaXJxKQogCQlod2lmLT5wb3J0X29wcy0+Y2xlYXJfaXJxKGRyaXZlKTsKQEAgLTExNDUsNyArMTEzNSw3IEBACiAJLyogc2VydmljZSB0aGlzIGludGVycnVwdCwgbWF5IHNldCBoYW5kbGVyIGZvciBuZXh0IGludGVycnVwdCAqLwogCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwogCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJLyoKIAkgKiBOb3RlIHRoYXQgaGFuZGxlcigpIG1heSBoYXZlIHNldCB0aGluZ3MgdXAgZm9yIGFub3RoZXIKIAkgKiBpbnRlcnJ1cHQgdG8gb2NjdXIgc29vbiwgYnV0IGl0IGNhbm5vdCBoYXBwZW4gdW50aWwKQEAgLTExNTQsMjAgKzExNDQsMTggQEAKIAkgKiB3b24ndCBhbGxvdyBhbm90aGVyIG9mIHRoZSBzYW1lIChvbiBhbnkgQ1BVKSB1bnRpbCB3ZSByZXR1cm4uCiAJICovCiAJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCkgewotCQlpZiAoaHdncm91cC0+aGFuZGxlciA9PSBOVUxMKSB7CS8qIHBhcmFub2lhICovCi0JCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7Ci0JCQlwbHVnX2RldmljZSA9IDE7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGh1aD8gZXhwZWN0ZWQgTlVMTCBoYW5kbGVyICIKLQkJCQkJIm9uIGV4aXRcbiIsIF9fZnVuY19fLCBkcml2ZS0+bmFtZSk7CisJCUJVR19PTihod2lmLT5oYW5kbGVyKTsKKwkJaWRlX3VubG9ja19wb3J0KGh3aWYpOworCQlwbHVnX2RldmljZSA9IDE7CiAJfQotb3V0X2hhbmRsZWQ6CiAJaXJxX3JldCA9IElSUV9IQU5ETEVEOwogb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwbHVnX2RldmljZSkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CitvdXRfZWFybHk6CisJaWYgKHBsdWdfZGV2aWNlKSB7CisJCWlkZV91bmxvY2tfaG9zdChod2lmLT5ob3N0KTsKIAkJaWRlX3BsdWdfZGV2aWNlKGRyaXZlKTsKKwl9CiAKIAlyZXR1cm4gaXJxX3JldDsKIH0KQEAgLTExODksMTUgKzExNzcsMTMgQEAKIAogdm9pZCBpZGVfZG9fZHJpdmVfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaHdncm91cC0+cnEgPSBOVUxMOworCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJX19lbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCwgMCk7Ci0JYmxrX3N0YXJ0X3F1ZXVlaW5nKHEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChpZGVfZG9fZHJpdmVfY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCmluZGV4IGFkOGJkNjUuLmU3MjhjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpAQCAtMTA1LDE1ICsxMDUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JlYWRfYWx0c3RhdHVzKTsKIAotdTggaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQotCQlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7Ci0JZWxzZQotCQlyZXR1cm4gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMpOwotCiB2b2lkIGlkZV9zZXRfaXJxKGlkZV9od2lmX3QgKmh3aWYsIGludCBvbikKIHsKIAl1OCBjdGwgPSBBVEFfREVWQ1RMX09CUzsKQEAgLTM4OCw3ICszNzksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCkBAIC00NTEsNyArNDQxLDcgQEAKICAqLwogaW50IGRyaXZlX2lzX3JlYWR5IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1OCBzdGF0CQkJPSAwOwogCiAJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCkBAIC01MDMsNyArNDkzLDggQEAKIAlzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmIChzdGF0ICYgQVRBX0JVU1kpIHsKLQkJbG9jYWxfaXJxX3NldChmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAJCXRpbWVvdXQgKz0gamlmZmllczsKIAkJd2hpbGUgKChzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSkgJiBBVEFfQlVTWSkgewogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKQEAgLTgyMiwyNSArODEzLDI1IEBACiBzdGF0aWMgdm9pZCBfX2lkZV9zZXRfaGFuZGxlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IEhXR1JPVVAoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAotCUJVR19PTihod2dyb3VwLT5oYW5kbGVyKTsKLQlod2dyb3VwLT5oYW5kbGVyCT0gaGFuZGxlcjsKLQlod2dyb3VwLT5leHBpcnkJCT0gZXhwaXJ5OwotCWh3Z3JvdXAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgdGltZW91dDsKLQlod2dyb3VwLT5yZXFfZ2VuX3RpbWVyCT0gaHdncm91cC0+cmVxX2dlbjsKLQlhZGRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKKwlCVUdfT04oaHdpZi0+aGFuZGxlcik7CisJaHdpZi0+aGFuZGxlcgkJPSBoYW5kbGVyOworCWh3aWYtPmV4cGlyeQkJPSBleHBpcnk7CisJaHdpZi0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyB0aW1lb3V0OworCWh3aWYtPnJlcV9nZW5fdGltZXIJPSBod2lmLT5yZXFfZ2VuOworCWFkZF90aW1lcigmaHdpZi0+dGltZXIpOwogfQogCiB2b2lkIGlkZV9zZXRfaGFuZGxlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCBoYW5kbGVyLCB0aW1lb3V0LCBleHBpcnkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaWRlX3NldF9oYW5kbGVyKTsKQEAgLTg2MywxMCArODU0LDkgQEAKIAkJCSB1bnNpZ25lZCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwgZXhwaXJ5KTsKIAlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBjbWQpOwogCS8qCkBAIC04NzYsMjYgKzg2NiwyNSBAQAogCSAqIEZJWE1FOiB3ZSBjb3VsZCBza2lwIHRoaXMgZGVsYXkgd2l0aCBjYXJlIG9uIG5vbiBzaGFyZWQgZGV2aWNlcwogCSAqLwogCW5kZWxheSg0MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9leGVjdXRlX2NvbW1hbmQpOwogCiB2b2lkIGlkZV9leGVjdXRlX3BrdF9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCWh3aWYtPnRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfUEFDS0VUKTsKIAluZGVsYXkoNDAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2V4ZWN1dGVfcGt0X2NtZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZXJyKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAKIAlpZiAocnEgJiYgYmxrX3NwZWNpYWxfcmVxdWVzdChycSkgJiYgcnEtPmNtZFswXSA9PSBSRVFfRFJJVkVfUkVTRVQpCiAJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgZXJyID8gZXJyIDogMSwgMCk7CkBAIC05MTMsNyArOTAyLDYgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgYXRhcGlfcmVzZXRfcG9sbGZ1bmMgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdTggc3RhdDsKIAogCVNFTEVDVF9EUklWRShkcml2ZSk7CkBAIC05MjMsMjAgKzkxMSwyMCBAQAogCWlmIChPS19TVEFUKHN0YXQsIDAsIEFUQV9CVVNZKSkKIAkJcHJpbnRrKCIlczogQVRBUEkgcmVzZXQgY29tcGxldGVcbiIsIGRyaXZlLT5uYW1lKTsKIAllbHNlIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3aWYtPnBvbGxfdGltZW91dCkpIHsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmF0YXBpX3Jlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCiAJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJCX0KIAkJLyogZW5kIG9mIHBvbGxpbmcgKi8KLQkJaHdncm91cC0+cG9sbGluZyA9IDA7CisJCWh3aWYtPnBvbGxpbmcgPSAwOwogCQlwcmludGsoIiVzOiBBVEFQSSByZXNldCB0aW1lZC1vdXQsIHN0YXR1cz0weCUwMnhcbiIsCiAJCQkJZHJpdmUtPm5hbWUsIHN0YXQpOwogCQkvKiBkbyBpdCB0aGUgb2xkIGZhc2hpb25lZCB3YXkgKi8KIAkJcmV0dXJuIGRvX3Jlc2V0MShkcml2ZSwgMSk7CiAJfQogCS8qIGRvbmUgcG9sbGluZyAqLwotCWh3Z3JvdXAtPnBvbGxpbmcgPSAwOworCWh3aWYtPnBvbGxpbmcgPSAwOwogCWlkZV9jb21wbGV0ZV9kcml2ZV9yZXNldChkcml2ZSwgMCk7CiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQpAQCAtOTY4LDggKzk1Niw3IEBACiAgKi8KIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgcmVzZXRfcG9sbGZ1bmMgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwogCXU4IHRtcDsKIAlpbnQgZXJyID0gMDsKQEAgLTk4Niw3ICs5NzMsNyBAQAogCXRtcCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAoIU9LX1NUQVQodG1wLCAwLCBBVEFfQlVTWSkpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3aWYtPnBvbGxfdGltZW91dCkpIHsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnJlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCiAJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CkBAIC0xMDA3LDcgKzk5NCw3IEBACiAJCX0KIAl9CiBvdXQ6Ci0JaHdncm91cC0+cG9sbGluZyA9IDA7CS8qIGRvbmUgcG9sbGluZyAqLworCWh3aWYtPnBvbGxpbmcgPSAwOwkvKiBkb25lIHBvbGxpbmcgKi8KIAlpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoZHJpdmUsIGVycik7CiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQpAQCAtMTA4MSwxOCArMTA2OCwxOCBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBkb19yZXNldDEgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGRvX25vdF90cnlfYXRhcGkpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHM7CisJaWRlX2RyaXZlX3QgKnRkcml2ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lb3V0OwotCXVuc2lnbmVkIGludCB1bml0OworCWludCBpOwogCURFRklORV9XQUlUKHdhaXQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCiAJLyogV2UgbXVzdCBub3QgcmVzZXQgd2l0aCBydW5uaW5nIGhhbmRsZXJzICovCi0JQlVHX09OKGh3Z3JvdXAtPmhhbmRsZXIgIT0gTlVMTCk7CisJQlVHX09OKGh3aWYtPmhhbmRsZXIgIT0gTlVMTCk7CiAKIAkvKiBGb3IgYW4gQVRBUEkgZGV2aWNlLCBmaXJzdCB0cnkgYW4gQVRBUEkgU1JTVC4gKi8KIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrICYmICFkb19ub3RfdHJ5X2F0YXBpKSB7CkBAIC0xMTAxLDEwICsxMDg4LDEwIEBACiAJCXVkZWxheSAoMjApOwogCQl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfQ01EX0RFVl9SRVNFVCk7CiAJCW5kZWxheSg0MDApOwotCQlod2dyb3VwLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7Ci0JCWh3Z3JvdXAtPnBvbGxpbmcgPSAxOworCQlod2lmLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJCWh3aWYtPnBvbGxpbmcgPSAxOwogCQlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmF0YXBpX3Jlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJfQogCkBAIC0xMTE0LDkgKzExMDEsNyBAQAogCiAJCXByZXBhcmVfdG9fd2FpdCgmaWRlX3Bhcmtfd3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXRpbWVvdXQgPSBqaWZmaWVzOwotCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCQlpZGVfZHJpdmVfdCAqdGRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCQlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgdGRyaXZlLCBod2lmKSB7CiAJCQlpZiAodGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCAmJgogCQkJICAgIHRkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BBUktFRCAmJgogCQkJICAgIHRpbWVfYWZ0ZXIodGRyaXZlLT5zbGVlcCwgdGltZW91dCkpCkBAIC0xMTI3LDkgKzExMTIsOSBAQAogCQlpZiAodGltZV9iZWZvcmVfZXEodGltZW91dCwgbm93KSkKIAkJCWJyZWFrOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUodGltZW91dCAtIG5vdyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJfSB3aGlsZSAodGltZW91dCk7CiAJZmluaXNoX3dhaXQoJmlkZV9wYXJrX3dxLCAmd2FpdCk7CiAKQEAgLTExMzcsMTEgKzExMjIsMTEgQEAKIAkgKiBGaXJzdCwgcmVzZXQgYW55IGRldmljZSBzdGF0ZSBkYXRhIHdlIHdlcmUgbWFpbnRhaW5pbmcKIAkgKiBmb3IgYW55IG9mIHRoZSBkcml2ZXMgb24gdGhpcyBpbnRlcmZhY2UuCiAJICovCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkKLQkJcHJlX3Jlc2V0KCZod2lmLT5kcml2ZXNbdW5pdF0pOworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCB0ZHJpdmUsIGh3aWYpCisJCXByZV9yZXNldCh0ZHJpdmUpOwogCiAJaWYgKGlvX3BvcnRzLT5jdGxfYWRkciA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQlpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoZHJpdmUsIC1FTlhJTyk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CkBAIC0xMTY0LDggKzExNDksOCBAQAogCXRwX29wcy0+c2V0X2lycShod2lmLCBkcml2ZS0+cXVpcmtfbGlzdCA9PSAyKTsKIAkvKiBtb3JlIHRoYW4gZW5vdWdoIHRpbWUgKi8KIAl1ZGVsYXkoMTApOwotCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKLQlod2dyb3VwLT5wb2xsaW5nID0gMTsKKwlod2lmLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJaHdpZi0+cG9sbGluZyA9IDE7CiAJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZyZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwogCiAJLyoKQEAgLTExNzcsNyArMTE2Miw3IEBACiAJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5yZXNldHByb2MpCiAJCXBvcnRfb3BzLT5yZXNldHByb2MoZHJpdmUpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiB9CiAKQEAgLTEyMjEsNiArMTIwNiwzIEBACiAJfQogCXJldHVybiAtRUJVU1k7CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV93YWl0X25vdF9idXN5KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IDlmNmUzM2QuLjA5NTI2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBpZGVfZHVtcF9vcGNvZGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaWRlX3Rhc2tfdCAqdGFzayA9IE5VTEw7CiAKIAlpZiAoIXJxKQpAQCAtMzQ2LDEwICszNDYsMTMgQEAKIAlwcmludGsoS0VSTl9DT05UICJ9Iik7CiAJaWYgKChlcnIgJiAoQVRBX0JCSyB8IEFUQV9BQk9SVEVEKSkgPT0gQVRBX0JCSyB8fAogCSAgICAoZXJyICYgKEFUQV9VTkMgfCBBVEFfSURORiB8IEFUQV9BTU5GKSkpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOworCiAJCWlkZV9kdW1wX3NlY3Rvcihkcml2ZSk7Ci0JCWlmIChIV0dST1VQKGRyaXZlKSAmJiBIV0dST1VQKGRyaXZlKS0+cnEpCisKKwkJaWYgKHJxKQogCQkJcHJpbnRrKEtFUk5fQ09OVCAiLCBzZWN0b3I9JWxsdSIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylIV0dST1VQKGRyaXZlKS0+cnEtPnNlY3Rvcik7CisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+c2VjdG9yKTsKIAl9CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMgYi9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCmluZGV4IDY3ODQ1NGEuLmM4NzVhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpAQCAtNywyMiArNywyMiBAQAogCiBzdGF0aWMgdm9pZCBpc3N1ZV9wYXJrX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZHJpdmUtPnF1ZXVlOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlpbnQgcmM7CiAKIAl0aW1lb3V0ICs9IGppZmZpZXM7Ci0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEKSB7CiAJCWludCByZXNldF90aW1lciA9IHRpbWVfYmVmb3JlKHRpbWVvdXQsIGRyaXZlLT5zbGVlcCk7CiAJCWludCBzdGFydF9xdWV1ZSA9IDA7CiAKIAkJZHJpdmUtPnNsZWVwID0gdGltZW91dDsKIAkJd2FrZV91cF9hbGwoJmlkZV9wYXJrX3dxKTsKLQkJaWYgKHJlc2V0X3RpbWVyICYmIGRlbF90aW1lcigmaHdncm91cC0+dGltZXIpKQorCQlpZiAocmVzZXRfdGltZXIgJiYgZGVsX3RpbWVyKCZod2lmLT50aW1lcikpCiAJCQlzdGFydF9xdWV1ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAkJaWYgKHN0YXJ0X3F1ZXVlKSB7CiAJCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwpAQCAtMzEsNyArMzEsNyBAQAogCQl9CiAJCXJldHVybjsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgUkVBRCwgX19HRlBfV0FJVCk7CiAJcnEtPmNtZFswXSA9IFJFUV9QQVJLX0hFQURTOwpAQCAtNjQsMjEgKzY0LDIxIEBACiAJCSAgICAgIGNoYXIgKmJ1ZikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAl1bnNpZ25lZCBpbnQgbXNlY3M7CiAKIAlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19OT19VTkxPQUQpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCW5vdyA9IGppZmZpZXM7CiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEICYmCiAJICAgIHRpbWVfYWZ0ZXIoZHJpdmUtPnNsZWVwLCBub3cpKQogCQltc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoZHJpdmUtPnNsZWVwIC0gbm93KTsKIAllbHNlCiAJCW1zZWNzID0gMDsKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLCBtc2Vjcyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcG0uYyBiL2RyaXZlcnMvaWRlL2lkZS1wbS5jCmluZGV4IDgyODJjNjAuLjRiM2JmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wbS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wbS5jCkBAIC01LDcgKzUsNyBAQAogaW50IGdlbmVyaWNfaWRlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhLCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07CiAJaWRlX3Rhc2tfdCBhcmdzOwpAQCAtMzksNyArMzksNyBAQAogaW50IGdlbmVyaWNfaWRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YSwgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOwogCWlkZV90YXNrX3QgYXJnczsKQEAgLTY3LDcgKzY3LDcgQEAKIAlibGtfcHV0X3JlcXVlc3QocnEpOwogCiAJaWYgKGVyciA9PSAwICYmIGRldi0+ZHJpdmVyKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCQlpZiAoZHJ2LT5yZXN1bWUpCiAJCQlkcnYtPnJlc3VtZShkcml2ZSk7CkBAIC0xOTQsNyArMTk0LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQlkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEgPSBOVUxMOworCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CiAKIAlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCAwKSkKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IGM1YWRiN2IuLjBjY2JiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogc3RhdGljIHZvaWQgZG9faWRlbnRpZnkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWNoYXIgKm0gPSAoY2hhciAqKSZpZFtBVEFfSURfUFJPRF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiBzdGF0aWMgaW50IGFjdHVhbF90cnlfdG9faWRlbnRpZnkgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAlpbnQgdXNlX2FsdHN0YXR1cyA9IDAsIHJjOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAgCiBzdGF0aWMgaW50IHRyeV90b19pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWludCByZXR2YWw7CiAJaW50IGF1dG9wcm9iZSA9IDA7CkBAIC00MzgsNyArNDM4LDcgQEAKIAogc3RhdGljIGludCBkb19wcm9iZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWludCByYzsKIAl1OCBwcmVzZW50ID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSwgc3RhdDsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCWlmIChpZGVfcmVhZF9kZXZpY2UoZHJpdmUpICE9IGRyaXZlLT5zZWxlY3QgJiYgcHJlc2VudCA9PSAwKSB7CiAJCWlmIChkcml2ZS0+ZG4gJiAxKSB7CiAJCQkvKiBleGl0IHdpdGggZHJpdmUwIHNlbGVjdGVkICovCi0JCQlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJCQlTRUxFQ1RfRFJJVkUoaHdpZi0+ZGV2aWNlc1swXSk7CiAJCQkvKiBhbGxvdyBBVEFfQlVTWSB0byBhc3NlcnQgJiBjbGVhciAqLwogCQkJbXNsZWVwKDUwKTsKIAkJfQpAQCAtNTA5LDcgKzUwOSw3IEBACiAJfQogCWlmIChkcml2ZS0+ZG4gJiAxKSB7CiAJCS8qIGV4aXQgd2l0aCBkcml2ZTAgc2VsZWN0ZWQgKi8KLQkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOworCQlTRUxFQ1RfRFJJVkUoaHdpZi0+ZGV2aWNlc1swXSk7CiAJCW1zbGVlcCg1MCk7CiAJCS8qIGVuc3VyZSBkcml2ZSBpcnEgaXMgY2xlYXIgKi8KIAkJKHZvaWQpdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKQEAgLTUyMiw3ICs1MjIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBlbmFibGVfbmVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAl1OCBzdGF0OwogCkBAIC02OTcsNyArNjk3LDggQEAKIAogc3RhdGljIGludCBpZGVfcG9ydF93YWl0X3JlYWR5KGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaW50IHVuaXQsIHJjOworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaSwgcmM7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiUHJvYmluZyBJREUgaW50ZXJmYWNlICVzLi4uXG4iLCBod2lmLT5uYW1lKTsKIApAQCAtNzE0LDkgKzcxNSw3IEBACiAJCXJldHVybiByYzsKIAogCS8qIE5vdyBtYWtlIHN1cmUgYm90aCBtYXN0ZXIgJiBzbGF2ZSBhcmUgcmVhZHkgKi8KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJLyogSWdub3JlIGRpc2tzIHRoYXQgd2Ugd2lsbCBub3QgcHJvYmUgZm9yIGxhdGVyLiAqLwogCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkgPT0gMCB8fAogCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkpIHsKQEAgLTczMiw4ICs3MzEsOCBAQAogCX0KIG91dDoKIAkvKiBFeGl0IGZ1bmN0aW9uIHdpdGggbWFzdGVyIHJlc2VsZWN0ZWQgKGxldCdzIGJlIHNhbmUpICovCi0JaWYgKHVuaXQpCi0JCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKKwlpZiAoaSkKKwkJU0VMRUNUX0RSSVZFKGh3aWYtPmRldmljZXNbMF0pOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNzQ5LDcgKzc0OCw3IEBACiAKIHZvaWQgaWRlX3VuZGVjb2RlZF9zbGF2ZShpZGVfZHJpdmVfdCAqZGV2MSkKIHsKLQlpZGVfZHJpdmVfdCAqZGV2MCA9ICZkZXYxLT5od2lmLT5kcml2ZXNbMF07CisJaWRlX2RyaXZlX3QgKmRldjAgPSBkZXYxLT5od2lmLT5kZXZpY2VzWzBdOwogCiAJaWYgKChkZXYxLT5kbiAmIDEpID09IDAgfHwgKGRldjAtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlyZXR1cm47CkBAIC03NzgsMTQgKzc3NywxNSBAQAogCiBzdGF0aWMgaW50IGlkZV9wcm9iZV9wb3J0KGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGlycWQ7Ci0JaW50IHVuaXQsIHJjID0gLUVOT0RFVjsKKwlpbnQgaSwgcmMgPSAtRU5PREVWOwogCiAJQlVHX09OKGh3aWYtPnByZXNlbnQpOwogCi0JaWYgKChod2lmLT5kcml2ZXNbMF0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpICYmCi0JICAgIChod2lmLT5kcml2ZXNbMV0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpKQorCWlmICgoaHdpZi0+ZGV2aWNlc1swXS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpICYmCisJICAgIChod2lmLT5kZXZpY2VzWzFdLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkpCiAJCXJldHVybiAtRUFDQ0VTOwogCiAJLyoKQEAgLTc5Niw3ICs3OTYsOCBAQAogCWlmIChpcnFkKQogCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOwogCi0JbG9jYWxfaXJxX3NldChmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwogCiAJaWYgKGlkZV9wb3J0X3dhaXRfcmVhZHkoaHdpZikgPT0gLUVCVVNZKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhaXQgZm9yIHJlYWR5IGZhaWxlZCBiZWZvcmUgcHJvYmUgIVxuIiwgaHdpZi0+bmFtZSk7CkBAIC04MDUsOSArODA2LDcgQEAKIAkgKiBTZWNvbmQgZHJpdmUgc2hvdWxkIG9ubHkgZXhpc3QgaWYgZmlyc3QgZHJpdmUgd2FzIGZvdW5kLAogCSAqIGJ1dCBhIGxvdCBvZiBjZHJvbSBkcml2ZXMgYXJlIGNvbmZpZ3VyZWQgYXMgc2luZ2xlIHNsYXZlcy4KIAkgKi8KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJKHZvaWQpIHByb2JlX2Zvcl9kcml2ZShkcml2ZSk7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpCiAJCQlyYyA9IDA7CkBAIC04MjgsMjAgKzgyNywxNyBAQAogc3RhdGljIHZvaWQgaWRlX3BvcnRfdHVuZV9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKLQlpbnQgdW5pdDsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CiAKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQkJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5xdWlya3Byb2MpCiAJCQkJcG9ydF9vcHMtPnF1aXJrcHJvYyhkcml2ZSk7CiAJCX0KIAl9CiAKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQkJaWRlX3NldF9tYXhfcGlvKGRyaXZlKTsKIApAQCAtODUyLDExICs4NDgsOCBAQAogCQl9CiAJfQogCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCi0JCWlmICgoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19JT18zMkJJVCkgfHwKLQkJICAgIGRyaXZlLT5pZFtBVEFfSURfRFdPUkRfSU9dKQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgeworCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19JT18zMkJJVCkKIAkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX0lPXzMyQklUOwogCQllbHNlCiAJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9fSU9fMzJCSVQ7CkBAIC04NjksNyArODYyLDcgQEAKIHN0YXRpYyBpbnQgaWRlX2luaXRfcXVldWUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50IG1heF9zZWN0b3JzID0gMjU2OwogCWludCBtYXhfc2dfZW50cmllcyA9IFBSRF9FTlRSSUVTOwogCkBAIC05MTgsMzYgKzkxMSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpZGVfYWRkX2RyaXZlX3RvX2h3Z3JvdXAoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKLQotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCWlmICghaHdncm91cC0+ZHJpdmUpIHsKLQkJLyogZmlyc3QgZHJpdmUgZm9yIGh3Z3JvdXAuICovCi0JCWRyaXZlLT5uZXh0ID0gZHJpdmU7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmU7Ci0JCWh3Z3JvdXAtPmh3aWYgPSBIV0lGKGh3Z3JvdXAtPmRyaXZlKTsKLQl9IGVsc2UgewotCQlkcml2ZS0+bmV4dCA9IGh3Z3JvdXAtPmRyaXZlLT5uZXh0OwotCQlod2dyb3VwLT5kcml2ZS0+bmV4dCA9IGRyaXZlOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotfQorc3RhdGljIERFRklORV9NVVRFWChpZGVfY2ZnX210eCk7CiAKIC8qCiAgKiBGb3IgYW55IHByZXNlbnQgZHJpdmU6CiAgKiAtIGFsbG9jYXRlIHRoZSBibG9jayBkZXZpY2UgcXVldWUKLSAqIC0gbGluayBkcml2ZSBpbnRvIHRoZSBod2dyb3VwCiAgKi8KIHN0YXRpYyBpbnQgaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogeworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAlpbnQgaSwgaiA9IDA7CiAKIAltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTk2MSwxMzkgKzkzNywzOSBAQAogCQl9CiAKIAkJaisrOwotCi0JCWlkZV9hZGRfZHJpdmVfdG9faHdncm91cChkcml2ZSk7CiAJfQogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwogCiAJcmV0dXJuIGo7CiB9CiAKLXN0YXRpYyBpZGVfaHdpZl90ICppZGVfcG9ydHNbTUFYX0hXSUZTXTsKLQotdm9pZCBpZGVfcmVtb3ZlX3BvcnRfZnJvbV9od2dyb3VwKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0KLQlpZGVfcG9ydHNbaHdpZi0+aW5kZXhdID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCS8qCi0JICogUmVtb3ZlIHVzIGZyb20gdGhlIGh3Z3JvdXAsIGFuZCBmcmVlCi0JICogdGhlIGh3Z3JvdXAgaWYgd2Ugd2VyZSB0aGUgb25seSBtZW1iZXIKLQkgKi8KLQlpZiAoaHdpZi0+bmV4dCA9PSBod2lmKSB7Ci0JCUJVR19PTihod2dyb3VwLT5od2lmICE9IGh3aWYpOwotCQlrZnJlZShod2dyb3VwKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhbm90aGVyIGludGVyZmFjZSBpbiBod2dyb3VwLgotCQkgKiBVbmxpbmsgdXMsIGFuZCBzZXQgaHdncm91cC0+ZHJpdmUgYW5kIC0+aHdpZiB0bwotCQkgKiBzb21ldGhpbmcgc2FuZS4KLQkJICovCi0JCWlkZV9od2lmX3QgKmcgPSBod2dyb3VwLT5od2lmOwotCi0JCXdoaWxlIChnLT5uZXh0ICE9IGh3aWYpCi0JCQlnID0gZy0+bmV4dDsKLQkJZy0+bmV4dCA9IGh3aWYtPm5leHQ7Ci0JCWlmIChod2dyb3VwLT5od2lmID09IGh3aWYpIHsKLQkJCS8qIENob3NlIGEgcmFuZG9tIGh3aWYgZm9yIGh3Z3JvdXAtPmh3aWYuCi0JCQkgKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGVyZSBhcmUgbm8gZHJpdmVzCi0JCQkgKiBsZWZ0IGluIHRoZSBod2dyb3VwLgotCQkJICovCi0JCQlCVUdfT04oaHdncm91cC0+ZHJpdmUgIT0gTlVMTCk7Ci0JCQlod2dyb3VwLT5od2lmID0gZzsKLQkJfQotCQlCVUdfT04oaHdncm91cC0+aHdpZiA9PSBod2lmKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLX0KLQogLyoKLSAqIFRoaXMgcm91dGluZSBzZXRzIHVwIHRoZSBpcnEgZm9yIGFuIGlkZSBpbnRlcmZhY2UsIGFuZCBjcmVhdGVzIGEgbmV3Ci0gKiBod2dyb3VwIGZvciB0aGUgaXJxL2h3aWYgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBhc3NpZ25lZC4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb2RlIGlzIGZvciBjb3JyZWN0bHkgZGV0ZWN0aW5nL2hhbmRsaW5nIGlycSBzaGFyaW5nCi0gKiBhbmQgaXJxIHNlcmlhbGl6YXRpb24gc2l0dWF0aW9ucy4gIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleCBiZWNhdXNlCi0gKiBpdCBoYW5kbGVzIHN0YXRpYyBhcyB3ZWxsIGFzIGR5bmFtaWMgKFBDTUNJQSkgSURFIGludGVyZmFjZXMuCisgKiBUaGlzIHJvdXRpbmUgc2V0cyB1cCB0aGUgSVJRIGZvciBhbiBJREUgaW50ZXJmYWNlLgogICovCiBzdGF0aWMgaW50IGluaXRfaXJxIChpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwOwotCWlkZV9od2lmX3QgKm1hdGNoID0gTlVMTDsKKwlpbnQgc2EgPSAwOwogCiAJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOwotCWh3aWYtPmh3Z3JvdXAgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZod2lmLT5sb2NrKTsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgaW5kZXgrKykgewotCQlpZGVfaHdpZl90ICpoID0gaWRlX3BvcnRzW2luZGV4XTsKKwlpbml0X3RpbWVyKCZod2lmLT50aW1lcik7CisJaHdpZi0+dGltZXIuZnVuY3Rpb24gPSAmaWRlX3RpbWVyX2V4cGlyeTsKKwlod2lmLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHdpZjsKIAotCQlpZiAoaCAmJiBoLT5od2dyb3VwKSB7ICAvKiBzY2FuIG9ubHkgaW5pdGlhbGl6ZWQgcG9ydHMgKi8KLQkJCWlmIChod2lmLT5ob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgewotCQkJCWlmIChod2lmLT5ob3N0ID09IGgtPmhvc3QpCi0JCQkJCW1hdGNoID0gaDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogSWYgd2UgYXJlIHN0aWxsIHdpdGhvdXQgYSBod2dyb3VwLCB0aGVuIGZvcm0gYSBuZXcgb25lCi0JICovCi0JaWYgKG1hdGNoKSB7Ci0JCWh3Z3JvdXAgPSBtYXRjaC0+aHdncm91cDsKLQkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7Ci0JCS8qCi0JCSAqIExpbmsgdXMgaW50byB0aGUgaHdncm91cC4KLQkJICogVGhpcyBtdXN0IGJlIGRvbmUgZWFybHksIGRvIGVuc3VyZSB0aGF0IHVuZXhwZWN0ZWRfaW50cgotCQkgKiBjYW4gZmluZCB0aGUgaHdpZiBhbmQgcHJldmVudCBpcnEgc3Rvcm1zLgotCQkgKiBObyBkcml2ZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaHdpZiwgY2hvb3NlX2RyaXZlCi0JCSAqIGNhbid0IGRvIGFueXRoaW5nIHN0dXBpZCAoeWV0KS4KLQkJICogQWRkIG91cnNlbGYgYXMgdGhlIDJuZCBlbnRyeSB0byB0aGUgaHdncm91cC0+aHdpZgotCQkgKiBsaW5rZWQgbGlzdCwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBod2lmIHRoYXQgb3ducwotCQkgKiBod2dyb3VwLT5oYW5kbGVyIC0gZG8gbm90IGNoYW5nZSB0aGF0LgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JCWh3aWYtPm5leHQgPSBod2dyb3VwLT5od2lmLT5uZXh0OwotCQlod2dyb3VwLT5od2lmLT5uZXh0ID0gaHdpZjsKLQkJQlVHX09OKGh3aWYtPm5leHQgPT0gaHdpZik7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JfSBlbHNlIHsKLQkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmh3Z3JvdXApLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJICAgICAgIGh3aWZfdG9fbm9kZShod2lmKSk7Ci0JCWlmIChod2dyb3VwID09IE5VTEwpCi0JCQlnb3RvIG91dF91cDsKLQotCQlzcGluX2xvY2tfaW5pdCgmaHdncm91cC0+bG9jayk7Ci0KLQkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7Ci0JCWh3Z3JvdXAtPmh3aWYgPSBod2lmLT5uZXh0ID0gaHdpZjsKLQotCQlpbml0X3RpbWVyKCZod2dyb3VwLT50aW1lcik7Ci0JCWh3Z3JvdXAtPnRpbWVyLmZ1bmN0aW9uID0gJmlkZV90aW1lcl9leHBpcnk7Ci0JCWh3Z3JvdXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHdncm91cDsKLQl9Ci0KLQlpZGVfcG9ydHNbaHdpZi0+aW5kZXhdID0gaHdpZjsKLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIGlycSwgaWYgbm90IGFscmVhZHkgb2J0YWluZWQgZm9yIGFub3RoZXIgaHdpZgotCSAqLwotCWlmICghbWF0Y2ggfHwgbWF0Y2gtPmlycSAhPSBod2lmLT5pcnEpIHsKLQkJaW50IHNhID0gMDsKICNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQotCQlzYSA9IElSUUZfU0hBUkVEOworCXNhID0gSVJRRl9TSEFSRUQ7CiAjZW5kaWYgLyogX19tYzY4MDAwX18gKi8KIAotCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGNpKQotCQkJc2EgPSBJUlFGX1NIQVJFRDsKKwlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGNpKQorCQlzYSA9IElSUUZfU0hBUkVEOwogCi0JCWlmIChpb19wb3J0cy0+Y3RsX2FkZHIpCi0JCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CisJaWYgKGlvX3BvcnRzLT5jdGxfYWRkcikKKwkJaHdpZi0+dHBfb3BzLT5zZXRfaXJxKGh3aWYsIDEpOwogCi0JCWlmIChyZXF1ZXN0X2lycShod2lmLT5pcnEsJmlkZV9pbnRyLHNhLGh3aWYtPm5hbWUsaHdncm91cCkpCi0JICAgICAgIAkJZ290byBvdXRfdW5saW5rOwotCX0KKwlpZiAocmVxdWVzdF9pcnEoaHdpZi0+aXJxLCAmaWRlX2ludHIsIHNhLCBod2lmLT5uYW1lLCBod2lmKSkKKwkJZ290byBvdXRfdXA7CiAKIAlpZiAoIWh3aWYtPnJxc2l6ZSkgewogCQlpZiAoKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fTEJBNDgpIHx8CkBAIC0xMTExLDE0ICs5ODcsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlcyBhdCAweCUwOGx4IG9uIGlycSAlZCIsIGh3aWYtPm5hbWUsCiAJCWlvX3BvcnRzLT5kYXRhX2FkZHIsIGh3aWYtPmlycSk7CiAjZW5kaWYgLyogX19tYzY4MDAwX18gKi8KLQlpZiAobWF0Y2gpCi0JCXByaW50ayhLRVJOX0NPTlQgIiAoc2VyaWFsaXplZCB3aXRoICVzKSIsIG1hdGNoLT5uYW1lKTsKKwlpZiAoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpCisJCXByaW50ayhLRVJOX0NPTlQgIiAoc2VyaWFsaXplZCkiKTsKIAlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiAJcmV0dXJuIDA7Ci1vdXRfdW5saW5rOgotCWlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaHdpZik7CiBvdXRfdXA6CiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiAJcmV0dXJuIDE7CkBAIC0xMTM0LDcgKzEwMDgsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkYXRhOwogCWludCB1bml0ID0gKnBhcnQgPj4gUEFSVE5fQklUUzsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGh3aWYtPmRldmljZXNbdW5pdF07CiAKIAlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTk2LDQ3ICsxMDcwLDIzIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9pbml0X2Rpc2spOwogCi1zdGF0aWMgdm9pZCBpZGVfcmVtb3ZlX2RyaXZlX2Zyb21faHdncm91cChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOwotCi0JaWYgKGRyaXZlID09IGRyaXZlLT5uZXh0KSB7Ci0JCS8qIHNwZWNpYWwgY2FzZTogbGFzdCBkcml2ZSBmcm9tIGh3Z3JvdXAuICovCi0JCUJVR19PTihod2dyb3VwLT5kcml2ZSAhPSBkcml2ZSk7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gTlVMTDsKLQl9IGVsc2UgewotCQlpZGVfZHJpdmVfdCAqd2FsazsKLQotCQl3YWxrID0gaHdncm91cC0+ZHJpdmU7Ci0JCXdoaWxlICh3YWxrLT5uZXh0ICE9IGRyaXZlKQotCQkJd2FsayA9IHdhbGstPm5leHQ7Ci0JCXdhbGstPm5leHQgPSBkcml2ZS0+bmV4dDsKLQkJaWYgKGh3Z3JvdXAtPmRyaXZlID09IGRyaXZlKSB7Ci0JCQlod2dyb3VwLT5kcml2ZSA9IGRyaXZlLT5uZXh0OwotCQkJaHdncm91cC0+aHdpZiA9IGh3Z3JvdXAtPmRyaXZlLT5od2lmOwotCQl9Ci0JfQotCUJVR19PTihod2dyb3VwLT5kcml2ZSA9PSBkcml2ZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGRyaXZlX3JlbGVhc2VfZGV2IChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gY29udGFpbmVyX29mKGRldiwgaWRlX2RyaXZlX3QsIGdlbmRldik7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCWlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGRyaXZlKTsKIAotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCWlkZV9yZW1vdmVfZHJpdmVfZnJvbV9od2dyb3VwKGRyaXZlKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlrZnJlZShkcml2ZS0+aWQpOwogCWRyaXZlLT5pZCA9IE5VTEw7CiAJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1BSRVNFTlQ7CiAJLyogTWVzc2VkIHVwIGxvY2tpbmcgLi4uICovCi0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCWJsa19jbGVhbnVwX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJZHJpdmUtPnF1ZXVlID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAljb21wbGV0ZSgmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CiB9CkBAIC0xMzAyLDEwICsxMTUyLDEwIEBACiAKIHN0YXRpYyB2b2lkIGh3aWZfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogeworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gJmRyaXZlLT5nZW5kZXY7CiAJCWludCByZXQ7CiAKQEAgLTEzMjgsMTEgKzExNzgsMTAgQEAKIHN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWRyaXZlLT5kbiA9IGkgKyBod2lmLT5jaGFubmVsICogMjsKIAogCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19JT18zMkJJVCkKQEAgLTEzODAsNiArMTIyOSw4IEBACiAJaWYgKChkLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0RNQSkgPT0gMCkgewogCQlpbnQgcmM7CiAKKwkJaHdpZi0+ZG1hX29wcyA9IGQtPmRtYV9vcHM7CisKIAkJaWYgKGQtPmluaXRfZG1hKQogCQkJcmMgPSBkLT5pbml0X2RtYShod2lmLCBkKTsKIAkJZWxzZQpAQCAtMTM4NywxMiArMTIzOCwxMyBAQAogCiAJCWlmIChyYyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBETUEgZGlzYWJsZWRcbiIsIGh3aWYtPm5hbWUpOworCisJCQlod2lmLT5kbWFfb3BzID0gTlVMTDsKIAkJCWh3aWYtPmRtYV9iYXNlID0gMDsKIAkJCWh3aWYtPnN3ZG1hX21hc2sgPSAwOwogCQkJaHdpZi0+bXdkbWFfbWFzayA9IDA7CiAJCQlod2lmLT51bHRyYV9tYXNrID0gMDsKLQkJfSBlbHNlIGlmIChkLT5kbWFfb3BzKQotCQkJaHdpZi0+ZG1hX29wcyA9IGQtPmRtYV9vcHM7CisJCX0KIAl9CiAKIAlpZiAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB8fApAQCAtMTQxNyw2ICsxMjY5LDY2IEBACiAJfQogfQogCitzdGF0aWMgY29uc3QgdTggaWRlX2h3aWZfdG9fbWFqb3JbXSA9CisJeyBJREUwX01BSk9SLCBJREUxX01BSk9SLCBJREUyX01BSk9SLCBJREUzX01BSk9SLCBJREU0X01BSk9SLAorCSAgSURFNV9NQUpPUiwgSURFNl9NQUpPUiwgSURFN19NQUpPUiwgSURFOF9NQUpPUiwgSURFOV9NQUpPUiB9OworCitzdGF0aWMgdm9pZCBpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShpZGVfaHdpZl90ICpod2lmKQoreworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKKworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgeworCQl1OCBqID0gKGh3aWYtPmluZGV4ICogTUFYX0RSSVZFUykgKyBpOworCisJCW1lbXNldChkcml2ZSwgMCwgc2l6ZW9mKCpkcml2ZSkpOworCisJCWRyaXZlLT5tZWRpYQkJCT0gaWRlX2Rpc2s7CisJCWRyaXZlLT5zZWxlY3QJCQk9IChpIDw8IDQpIHwgQVRBX0RFVklDRV9PQlM7CisJCWRyaXZlLT5od2lmCQkJPSBod2lmOworCQlkcml2ZS0+cmVhZHlfc3RhdAkJPSBBVEFfRFJEWTsKKwkJZHJpdmUtPmJhZF93c3RhdAkJPSBCQURfV19TVEFUOworCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlCT0gMTsKKwkJZHJpdmUtPnNwZWNpYWwuYi5zZXRfZ2VvbWV0cnkJPSAxOworCQlkcml2ZS0+bmFtZVswXQkJCT0gJ2gnOworCQlkcml2ZS0+bmFtZVsxXQkJCT0gJ2QnOworCQlkcml2ZS0+bmFtZVsyXQkJCT0gJ2EnICsgajsKKwkJZHJpdmUtPm1heF9mYWlsdXJlcwkJPSBJREVfREVGQVVMVF9NQVhfRkFJTFVSRVM7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmRyaXZlLT5saXN0KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9pbml0X3BvcnRfZGF0YShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJLyogZmlsbCBpbiBhbnkgbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMgKi8KKwlod2lmLT5pbmRleAk9IGluZGV4OworCWh3aWYtPm1ham9yCT0gaWRlX2h3aWZfdG9fbWFqb3JbaW5kZXhdOworCisJaHdpZi0+bmFtZVswXQk9ICdpJzsKKwlod2lmLT5uYW1lWzFdCT0gJ2QnOworCWh3aWYtPm5hbWVbMl0JPSAnZSc7CisJaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OworCisJaW5pdF9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOworCisJaHdpZi0+dHBfb3BzID0gJmRlZmF1bHRfdHBfb3BzOworCisJaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9pbml0X3BvcnRfaHcoaWRlX2h3aWZfdCAqaHdpZiwgaHdfcmVnc190ICpodykKK3sKKwltZW1jcHkoJmh3aWYtPmlvX3BvcnRzLCAmaHctPmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKKwlod2lmLT5pcnEgPSBody0+aXJxOworCWh3aWYtPmNoaXBzZXQgPSBody0+Y2hpcHNldDsKKwlod2lmLT5kZXYgPSBody0+ZGV2OworCWh3aWYtPmdlbmRldi5wYXJlbnQgPSBody0+cGFyZW50ID8gaHctPnBhcmVudCA6IGh3LT5kZXY7CisJaHdpZi0+YWNrX2ludHIgPSBody0+YWNrX2ludHI7CisJaHdpZi0+Y29uZmlnX2RhdGEgPSBody0+Y29uZmlnOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IGlkZV9pbmRleGVzOwogCiAvKioKQEAgLTE0NjYsMTIgKzEzNzgsNDMgQEAKIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKIH0KIAorc3RhdGljIHZvaWQgaWRlX3BvcnRfZnJlZV9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOworCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKQorCQlrZnJlZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWRlX3BvcnRfYWxsb2NfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmLCBpbnQgbm9kZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlOworCisJCWRyaXZlID0ga3phbGxvY19ub2RlKHNpemVvZigqZHJpdmUpLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJaWYgKGRyaXZlID09IE5VTEwpCisJCQlnb3RvIG91dF9ub21lbTsKKworCQlod2lmLT5kZXZpY2VzW2ldID0gZHJpdmU7CisJfQorCXJldHVybiAwOworCitvdXRfbm9tZW06CisJaWRlX3BvcnRfZnJlZV9kZXZpY2VzKGh3aWYpOworCXJldHVybiAtRU5PTUVNOworfQorCiBzdHJ1Y3QgaWRlX2hvc3QgKmlkZV9ob3N0X2FsbG9jKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLCBod19yZWdzX3QgKipod3MpCiB7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh3c1swXSA/IGh3c1swXS0+ZGV2IDogTlVMTDsKKwlpbnQgbm9kZSA9IGRldiA/IGRldl90b19ub2RlKGRldikgOiAtMTsKIAlpbnQgaTsKIAotCWhvc3QgPSBremFsbG9jKHNpemVvZigqaG9zdCksIEdGUF9LRVJORUwpOworCWhvc3QgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJaWYgKGhvc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE0ODIsMTAgKzE0MjUsMTUgQEAKIAkJaWYgKGh3c1tpXSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJaHdpZiA9IGt6YWxsb2Moc2l6ZW9mKCpod2lmKSwgR0ZQX0tFUk5FTCk7CisJCWh3aWYgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpod2lmKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQlpZiAoaWRlX3BvcnRfYWxsb2NfZGV2aWNlcyhod2lmLCBub2RlKSA8IDApIHsKKwkJCWtmcmVlKGh3aWYpOworCQkJY29udGludWU7CisJCX0KKwogCQlpZHggPSBpZGVfZmluZF9wb3J0X3Nsb3QoZCk7CiAJCWlmIChpZHggPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBmcmVlIHNsb3QgZm9yIGludGVyZmFjZVxuIiwKQEAgLTE1MDcsOCArMTQ1NSw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChod3NbMF0pCi0JCWhvc3QtPmRldlswXSA9IGh3c1swXS0+ZGV2OworCWhvc3QtPmRldlswXSA9IGRldjsKIAogCWlmIChkKSB7CiAJCWhvc3QtPmluaXRfY2hpcHNldCA9IGQtPmluaXRfY2hpcHNldDsKQEAgLTE1MjUsOSArMTQ3Miw3IEBACiAJaWRlX2h3aWZfdCAqaHdpZiwgKm1hdGUgPSBOVUxMOwogCWludCBpLCBqID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKSB7CiAJCQltYXRlID0gTlVMTDsKIAkJCWNvbnRpbnVlOwpAQCAtMTU1Myw5ICsxNDk4LDcgQEAKIAkJaWRlX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE1NzAsOSArMTUxMyw3IEBACiAJCQlpZGVfcG9ydF90dW5lX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTU5Nyw5ICsxNTM4LDcgQEAKIAkJCWlkZV9hY3BpX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE2MDcsOSArMTU0Niw3IEBACiAJCQlod2lmX3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTY0NywxNyArMTU4NCw4NSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2hvc3RfYWRkKTsKIAorc3RhdGljIHZvaWQgX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CisKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKKwkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgeworCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmRyaXZlLT5nZW5kZXYpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOworCV9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOworCWh3aWYtPnByZXNlbnQgPSAwOworCWlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGh3aWYpOworCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKTsKKworLyoqCisgKglpZGVfdW5yZWdpc3RlcgkJLQlmcmVlIGFuIElERSBpbnRlcmZhY2UKKyAqCUBod2lmOiBJREUgaW50ZXJmYWNlCisgKgorICoJUGVyZm9ybSB0aGUgZmluYWwgdW5yZWdpc3RlciBvZiBhbiBJREUgaW50ZXJmYWNlLgorICoKKyAqCUxvY2tpbmc6CisgKglUaGUgY2FsbGVyIG11c3Qgbm90IGhvbGQgdGhlIElERSBsb2Nrcy4KKyAqCisgKglJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gcGVuZGluZyBJL08gaGVyZSwKKyAqCWFuZCB0aGF0IHRoZSBpbnRlcmZhY2Ugd2lsbCBub3QgYmUgcmVvcGVuZWQgKHByZXNlbnQvdmFuaXNoaW5nCisgKglsb2NraW5nIGlzbid0IHlldCBkb25lIEJUVykuCisgKi8KKworc3RhdGljIHZvaWQgaWRlX3VucmVnaXN0ZXIoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOworCUJVR19PTihpcnFzX2Rpc2FibGVkKCkpOworCisJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOworCisJaWYgKGh3aWYtPnByZXNlbnQpIHsKKwkJX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7CisJCWh3aWYtPnByZXNlbnQgPSAwOworCX0KKworCWlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChod2lmKTsKKworCWZyZWVfaXJxKGh3aWYtPmlycSwgaHdpZik7CisKKwlkZXZpY2VfdW5yZWdpc3Rlcihod2lmLT5wb3J0ZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOworCisJLyoKKwkgKiBSZW1vdmUgdXMgZnJvbSB0aGUga2VybmVsJ3Mga25vd2xlZGdlCisJICovCisJYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKGh3aWYtPm1ham9yLCAwKSwgTUFYX0RSSVZFUzw8UEFSVE5fQklUUyk7CisJa2ZyZWUoaHdpZi0+c2dfdGFibGUpOworCXVucmVnaXN0ZXJfYmxrZGV2KGh3aWYtPm1ham9yLCBod2lmLT5uYW1lKTsKKworCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7CisKKwltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKK30KKwogdm9pZCBpZGVfaG9zdF9mcmVlKHN0cnVjdCBpZGVfaG9zdCAqaG9zdCkKIHsKIAlpZGVfaHdpZl90ICpod2lmOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQlpZGVfcG9ydF9mcmVlX2RldmljZXMoaHdpZik7CiAJCWlkZV9mcmVlX3BvcnRfc2xvdChod2lmLT5pbmRleCk7CiAJCWtmcmVlKGh3aWYpOwogCX0KQEAgLTE2NjgsMTEgKzE2NzMsMTIgQEAKIAogdm9pZCBpZGVfaG9zdF9yZW1vdmUoc3RydWN0IGlkZV9ob3N0ICpob3N0KQogeworCWlkZV9od2lmX3QgKmh3aWY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlpZiAoaG9zdC0+cG9ydHNbaV0pCi0JCQlpZGVfdW5yZWdpc3Rlcihob3N0LT5wb3J0c1tpXSk7CisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CisJCWlmIChod2lmKQorCQkJaWRlX3VucmVnaXN0ZXIoaHdpZik7CiAJfQogCiAJaWRlX2hvc3RfZnJlZShob3N0KTsKQEAgLTE2OTEsOCArMTY5Nyw4IEBACiAJaHdpZi0+cHJlc2VudCA9IDE7CiAKIAlpZGVfcG9ydF90dW5lX2RldmljZXMoaHdpZik7Ci0JaWRlX2FjcGlfcG9ydF9pbml0X2RldmljZXMoaHdpZik7CiAJaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhod2lmKTsKKwlpZGVfYWNwaV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAlod2lmX3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKaW5kZXggYTE0ZTI5My4uMWQ4OTc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC00MzksMTMgKzQzOSwxMyBAQAogc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX2RyaXZlcgogCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlCSpkZXYgPSAmZHJpdmUtPmdlbmRldjsKLQlpZGVfZHJpdmVyX3QJKmlkZV9kcnY7Ci0JaW50CQlsZW47CisJaWRlX2RyaXZlX3QJCSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJc3RydWN0IGRldmljZQkJKmRldiA9ICZkcml2ZS0+Z2VuZGV2OworCXN0cnVjdCBpZGVfZHJpdmVyCSppZGVfZHJ2OworCWludAkJCWxlbjsKIAogCWlmIChkZXYtPmRyaXZlcikgewotCQlpZGVfZHJ2ID0gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLCBpZGVfZHJpdmVyX3QsIGdlbl9kcml2ZXIpOworCQlpZGVfZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJCWxlbiA9IHNwcmludGYocGFnZSwgIiVzIHZlcnNpb24gJXNcbiIsCiAJCQkJZGV2LT5kcml2ZXItPm5hbWUsIGlkZV9kcnYtPnZlcnNpb24pOwogCX0gZWxzZQpAQCAtNTU1LDcgKzU1NSw3IEBACiAJfQogfQogCi12b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKQordm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKQogewogCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7CiAJZHJpdmUtPnNldHRpbmdzID0gZHJpdmVyLT5wcm9jX2RldnNldHMoZHJpdmUpOwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAgKglUYWtlcyBpZGVfc2V0dGluZ19tdHguCiAgKi8KIAotdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKQordm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfZHJpdmVyICpkcml2ZXIpCiB7CiAJaWRlX3JlbW92ZV9wcm9jX2VudHJpZXMoZHJpdmUtPnByb2MsIGRyaXZlci0+cHJvY19lbnRyaWVzKGRyaXZlKSk7CiAKQEAgLTU5MywxNCArNTkzLDEzIEBACiAKIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaW50CWQ7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQgPSBod2lmLT5wcm9jOworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAljaGFyIG5hbWVbNjRdOworCWludCBpOwogCi0JZm9yIChkID0gMDsgZCA8IE1BWF9EUklWRVM7IGQrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2RdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwIHx8IGRyaXZlLT5wcm9jKQogCQkJY29udGludWU7CiAKQEAgLTY1Myw3ICs2NTIsNyBAQAogCiBzdGF0aWMgaW50IHByb2NfcHJpbnRfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIHZvaWQgKmRhdGEpCiB7Ci0JaWRlX2RyaXZlcl90ICppZGVfZHJ2ID0gY29udGFpbmVyX29mKGRydiwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqaWRlX2RydiA9IHRvX2lkZV9kcml2ZXIoZHJ2KTsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnMgPSBkYXRhOwogCiAJc2VxX3ByaW50ZihzLCAiJXMgdmVyc2lvbiAlc1xuIiwgZHJ2LT5uYW1lLCBpZGVfZHJ2LT52ZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDVkMmFhMjIuLmQ3ZWNkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMTY2LDEwICsxNjYsMTAgQEAKICAqIHRvIGFuIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50IGlzIHN0b3JlZCBpbiB0aGUgc3RydWN0IGRlZmluZWQgYmVsb3cuCiAgKi8KIHR5cGVkZWYgc3RydWN0IGlkZV90YXBlX29iaiB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7CisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAogCS8qCiAJICoJZmFpbGVkX3BjIHBvaW50cyB0byB0aGUgbGFzdCBmYWlsZWQgcGFja2V0IGNvbW1hbmQsIG9yIGNvbnRhaW5zCkBAIC00NzksNyArNDc5LDcgQEAKIAogc3RhdGljIGludCBpZGV0YXBlX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdHMpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnJvcjsKQEAgLTUzMSw3ICs1MzEsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogRXJyb3IgaW4gUkVRVUVTVCBTRU5TRSAiCiAJCQkJCSJpdHNlbGYgLSBBYm9ydGluZyByZXF1ZXN0IVxuIik7CiAJfSBlbHNlIGlmIChwYy0+Y1swXSA9PSBSRUFEXzYgfHwgcGMtPmNbMF0gPT0gV1JJVEVfNikgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAkJaW50IGJsb2NrcyA9IHBjLT54ZmVycmVkIC8gdGFwZS0+YmxrX3NpemU7CiAKIAkJdGFwZS0+YXZnX3NpemUgKz0gYmxvY2tzICogdGFwZS0+YmxrX3NpemU7CkBAIC01NzYsNyArNTc2LDcgQEAKIAogLyoKICAqIFBvc3Rwb25lIHRoZSBjdXJyZW50IHJlcXVlc3Qgc28gdGhhdCBpZGUuYyB3aWxsIGJlIGFibGUgdG8gc2VydmljZSByZXF1ZXN0cwotICogZnJvbSBhbm90aGVyIGRldmljZSBvbiB0aGUgc2FtZSBod2dyb3VwIHdoaWxlIHdlIGFyZSBwb2xsaW5nIGZvciBEU0MuCisgKiBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIHBvcnQgd2hpbGUgd2UgYXJlIHBvbGxpbmcgZm9yIERTQy4KICAqLwogc3RhdGljIHZvaWQgaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKQEAgLTU4NCw3ICs1ODQsOCBAQAogCiAJZGVidWdfbG9nKERCR19QUk9DUywgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQl0YXBlLT5wb3N0cG9uZWRfcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdGFwZS0+cG9zdHBvbmVkX3JxID0gZHJpdmUtPmh3aWYtPnJxOworCiAJaWRlX3N0YWxsX3F1ZXVlKGRyaXZlLCB0YXBlLT5kc2NfcG9sbF9mcmVxKTsKIH0KIApAQCAtMjMxMiw3ICsyMzEzLDcgQEAKIAogc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAotc3RhdGljIGlkZV9kcml2ZXJfdCBpZGV0YXBlX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWRlX2RyaXZlciBpZGV0YXBlX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLXRhcGUiLApAQCAtMjMyMyw3ICsyMzI0LDYgQEAKIAkudmVyc2lvbgkJPSBJREVUQVBFX1ZFUlNJT04sCiAJLmRvX3JlcXVlc3QJCT0gaWRldGFwZV9kb19yZXF1ZXN0LAogCS5lbmRfcmVxdWVzdAkJPSBpZGV0YXBlX2VuZF9yZXF1ZXN0LAotCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2NfZW50cmllcwkJPSBpZGVfdGFwZV9wcm9jX2VudHJpZXMsCiAJLnByb2NfZGV2c2V0cwkJPSBpZGVfdGFwZV9wcm9jX2RldnNldHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCmluZGV4IGJmNGZiOWQuLjE2MTM4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC01OCw3ICs1OCw3IEBACiAKIGlkZV9zdGFydHN0b3BfdCBkb19yd190YXNrZmlsZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICp0YXNrKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGlkZV90YXNrZmlsZSAqdGYgPSAmdGFzay0+dGY7CiAJaWRlX2hhbmRsZXJfdCAqaGFuZGxlciA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKQEAgLTMwOSw5ICszMDksOSBAQAogCQl9CiAKIAkJaWYgKHNlY3RvcnMgPiAwKSB7Ci0JCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnY7CiAKLQkJCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCQlkcnYtPmVuZF9yZXF1ZXN0KGRyaXZlLCAxLCBzZWN0b3JzKTsKIAkJfQogCX0KQEAgLTMyOCw5ICszMjgsOSBAQAogCX0KIAogCWlmIChycS0+cnFfZGlzaykgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOzsKKwkJZHJ2ID0gKihzdHJ1Y3QgaWRlX2RyaXZlciAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOzsKIAkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMSwgcnEtPm5yX3NlY3RvcnMpOwogCX0gZWxzZQogCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHJxLT5ucl9zZWN0b3JzKTsKQEAgLTM2MSw3ICszNjEsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCB0YXNrX2luX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCS8qIEVycm9yPyAqLwpAQCAtMzk1LDcgKzM5NSw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHRhc2tfb3V0X2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKCFPS19TVEFUKHN0YXQsIERSSVZFX1JFQURZLCBkcml2ZS0+YmFkX3dzdGF0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggNDZhMmQ0Yy4uMjU4ODA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTYwLDE3OSArNjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotCi0vKiBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGZhaWx1cmVzICovCi0jZGVmaW5lIElERV9ERUZBVUxUX01BWF9GQUlMVVJFUyAJMQotCiBzdHJ1Y3QgY2xhc3MgKmlkZV9wb3J0X2NsYXNzOwogCi1zdGF0aWMgY29uc3QgdTggaWRlX2h3aWZfdG9fbWFqb3JbXSA9IHsgSURFMF9NQUpPUiwgSURFMV9NQUpPUiwKLQkJCQkJSURFMl9NQUpPUiwgSURFM19NQUpPUiwKLQkJCQkJSURFNF9NQUpPUiwgSURFNV9NQUpPUiwKLQkJCQkJSURFNl9NQUpPUiwgSURFN19NQUpPUiwKLQkJCQkJSURFOF9NQUpPUiwgSURFOV9NQUpPUiB9OwotCi1ERUZJTkVfTVVURVgoaWRlX2NmZ19tdHgpOwotCi1zdGF0aWMgdm9pZCBpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShpZGVfaHdpZl90ICopOwotCi0vKgotICogRG8gbm90IGV2ZW4gKnRoaW5rKiBhYm91dCBjYWxsaW5nIHRoaXMhCi0gKi8KLXZvaWQgaWRlX2luaXRfcG9ydF9kYXRhKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGludCBpbmRleCkKLXsKLQkvKiBidWxrIGluaXRpYWxpemUgaHdpZiAmIGRyaXZlIGluZm8gd2l0aCB6ZXJvcyAqLwotCW1lbXNldChod2lmLCAwLCBzaXplb2YoaWRlX2h3aWZfdCkpOwotCi0JLyogZmlsbCBpbiBhbnkgbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMgKi8KLQlod2lmLT5pbmRleAk9IGluZGV4OwotCWh3aWYtPm1ham9yCT0gaWRlX2h3aWZfdG9fbWFqb3JbaW5kZXhdOwotCi0JaHdpZi0+bmFtZVswXQk9ICdpJzsKLQlod2lmLT5uYW1lWzFdCT0gJ2QnOwotCWh3aWYtPm5hbWVbMl0JPSAnZSc7Ci0JaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OwotCi0JaW5pdF9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOwotCi0JaHdpZi0+dHBfb3BzID0gJmRlZmF1bHRfdHBfb3BzOwotCi0JaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaW50IHVuaXQ7Ci0KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0JCXU4IGogPSAoaHdpZi0+aW5kZXggKiBNQVhfRFJJVkVTKSArIHVuaXQ7Ci0KLQkJbWVtc2V0KGRyaXZlLCAwLCBzaXplb2YoKmRyaXZlKSk7Ci0KLQkJZHJpdmUtPm1lZGlhCQkJPSBpZGVfZGlzazsKLQkJZHJpdmUtPnNlbGVjdAkJCT0gKHVuaXQgPDwgNCkgfCBBVEFfREVWSUNFX09CUzsKLQkJZHJpdmUtPmh3aWYJCQk9IGh3aWY7Ci0JCWRyaXZlLT5yZWFkeV9zdGF0CQk9IEFUQV9EUkRZOwotCQlkcml2ZS0+YmFkX3dzdGF0CQk9IEJBRF9XX1NUQVQ7Ci0JCWRyaXZlLT5zcGVjaWFsLmIucmVjYWxpYnJhdGUJPSAxOwotCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9nZW9tZXRyeQk9IDE7Ci0JCWRyaXZlLT5uYW1lWzBdCQkJPSAnaCc7Ci0JCWRyaXZlLT5uYW1lWzFdCQkJPSAnZCc7Ci0JCWRyaXZlLT5uYW1lWzJdCQkJPSAnYScgKyBqOwotCQlkcml2ZS0+bWF4X2ZhaWx1cmVzCQk9IElERV9ERUZBVUxUX01BWF9GQUlMVVJFUzsKLQotCQlJTklUX0xJU1RfSEVBRCgmZHJpdmUtPmxpc3QpOwotCQlpbml0X2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQotCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7Ci0JCQlkZXZpY2VfdW5yZWdpc3RlcigmZHJpdmUtPmdlbmRldik7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKLQkJfQotCX0KLX0KLQotdm9pZCBpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0JX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7Ci0JaHdpZi0+cHJlc2VudCA9IDA7Ci0JaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Ci0JbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMpOwotCi0vKioKLSAqCWlkZV91bnJlZ2lzdGVyCQktCWZyZWUgYW4gSURFIGludGVyZmFjZQotICoJQGh3aWY6IElERSBpbnRlcmZhY2UKLSAqCi0gKglQZXJmb3JtIHRoZSBmaW5hbCB1bnJlZ2lzdGVyIG9mIGFuIElERSBpbnRlcmZhY2UuIEF0IHRoZSBtb21lbnQKLSAqCXdlIGRvbid0IHJlZmNvdW50IGludGVyZmFjZXMgc28gdGhpcyB3aWxsIGFsc28gZ2V0IHNwbGl0IHVwLgotICoKLSAqCUxvY2tpbmc6Ci0gKglUaGUgY2FsbGVyIG11c3Qgbm90IGhvbGQgdGhlIElERSBsb2NrcwotICoJVGhlIGRyaXZlIHByZXNlbnQvdmFuaXNoaW5nIGlzIG5vdCB5ZXQgcHJvcGVybHkgbG9ja2VkCi0gKglUYWtlIGNhcmUgd2l0aCB0aGUgY2FsbGJhY2tzLiBUaGVzZSBoYXZlIGJlZW4gc3BsaXQgdG8gYXZvaWQKLSAqCWRlYWRsb2NraW5nIHRoZSBJREUgbGF5ZXIuIFRoZSBzaHV0ZG93biBjYWxsYmFjayBpcyBjYWxsZWQKLSAqCWJlZm9yZSB3ZSB0YWtlIHRoZSBsb2NrIGFuZCBmcmVlIHJlc291cmNlcy4gSXQgaXMgdXAgdG8gdGhlCi0gKgljYWxsZXIgdG8gYmUgc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIEkvTyBoZXJlLCBhbmQgdGhhdAotICoJdGhlIGludGVyZmFjZSB3aWxsIG5vdCBiZSByZW9wZW5lZCAocHJlc2VudC92YW5pc2hpbmcgbG9ja2luZwotICoJaXNuJ3QgeWV0IGRvbmUgQlRXKS4gQWZ0ZXIgd2UgY29tbWl0IHRvIHRoZSBmaW5hbCBraWxsIHdlCi0gKgljYWxsIHRoZSBjbGVhbnVwIGNhbGxiYWNrIHdpdGggdGhlIGlkZSBsb2NrcyBoZWxkLgotICoKLSAqCVVucmVnaXN0ZXIgcmVzdG9yZXMgdGhlIGh3aWYgc3RydWN0dXJlcyB0byB0aGUgZGVmYXVsdCBzdGF0ZS4KLSAqCVRoaXMgaXMgcmF2aW5nIGJvbmtlcnMuCi0gKi8KLQotdm9pZCBpZGVfdW5yZWdpc3RlcihpZGVfaHdpZl90ICpod2lmKQotewotCWlkZV9od2lmX3QgKmc7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cDsKLQlpbnQgaXJxX2NvdW50ID0gMDsKLQotCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7Ci0JQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7Ci0KLQltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0KLQlpZiAoaHdpZi0+cHJlc2VudCkgewotCQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKLQkJaHdpZi0+cHJlc2VudCA9IDA7Ci0JfQotCi0JaWRlX3Byb2NfdW5yZWdpc3Rlcl9wb3J0KGh3aWYpOwotCi0JaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0JLyoKLQkgKiBmcmVlIHRoZSBpcnEgaWYgd2Ugd2VyZSB0aGUgb25seSBod2lmIHVzaW5nIGl0Ci0JICovCi0JZyA9IGh3Z3JvdXAtPmh3aWY7Ci0JZG8gewotCQlpZiAoZy0+aXJxID09IGh3aWYtPmlycSkKLQkJCSsraXJxX2NvdW50OwotCQlnID0gZy0+bmV4dDsKLQl9IHdoaWxlIChnICE9IGh3Z3JvdXAtPmh3aWYpOwotCWlmIChpcnFfY291bnQgPT0gMSkKLQkJZnJlZV9pcnEoaHdpZi0+aXJxLCBod2dyb3VwKTsKLQotCWlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaHdpZik7Ci0KLQlkZXZpY2VfdW5yZWdpc3Rlcihod2lmLT5wb3J0ZGV2KTsKLQlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOwotCi0JLyoKLQkgKiBSZW1vdmUgdXMgZnJvbSB0aGUga2VybmVsJ3Mga25vd2xlZGdlCi0JICovCi0JYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKGh3aWYtPm1ham9yLCAwKSwgTUFYX0RSSVZFUzw8UEFSVE5fQklUUyk7Ci0Ja2ZyZWUoaHdpZi0+c2dfdGFibGUpOwotCXVucmVnaXN0ZXJfYmxrZGV2KGh3aWYtPm1ham9yLCBod2lmLT5uYW1lKTsKLQotCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7Ci0KLQltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKLX0KLQotdm9pZCBpZGVfaW5pdF9wb3J0X2h3KGlkZV9od2lmX3QgKmh3aWYsIGh3X3JlZ3NfdCAqaHcpCi17Ci0JbWVtY3B5KCZod2lmLT5pb19wb3J0cywgJmh3LT5pb19wb3J0cywgc2l6ZW9mKGh3aWYtPmlvX3BvcnRzKSk7Ci0JaHdpZi0+aXJxID0gaHctPmlycTsKLQlod2lmLT5jaGlwc2V0ID0gaHctPmNoaXBzZXQ7Ci0JaHdpZi0+ZGV2ID0gaHctPmRldjsKLQlod2lmLT5nZW5kZXYucGFyZW50ID0gaHctPnBhcmVudCA/IGh3LT5wYXJlbnQgOiBody0+ZGV2OwotCWh3aWYtPmFja19pbnRyID0gaHctPmFja19pbnRyOwotCWh3aWYtPmNvbmZpZ19kYXRhID0gaHctPmNvbmZpZzsKLX0KLQogLyoKICAqCUxvY2tzIGZvciBJREUgc2V0dGluZyBmdW5jdGlvbmFsaXR5CiAgKi8KQEAgLTMzMCw3ICsxNTksNiBAQAogc3RhdGljIGludCBzZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwogCiAJaWYgKGFyZyA8IDAgfHwgYXJnID4gMjU1KQpAQCAtMzQ1LDkgKzE3Myw5IEBACiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCQkvKiB0YWtlIGxvY2sgZm9yIElERV9ERkxBR19bTk9fXVVOTUFTSy9bTk9fXUlPXzMyQklUICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJCXBvcnRfb3BzLT5zZXRfcGlvX21vZGUoZHJpdmUsIGFyZyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJCX0gZWxzZQogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKIAl9IGVsc2UgewpAQCAtNDUzLDcgKzI4MSw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAlyZXR1cm4gZHJ2LT5wcm9iZSA/IGRydi0+cHJvYmUoZHJpdmUpIDogLUVOT0RFVjsKIH0KQEAgLTQ2MSw3ICsyODksNyBAQAogc3RhdGljIGludCBnZW5lcmljX2lkZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCWlmIChkcnYtPnJlbW92ZSkKIAkJZHJ2LT5yZW1vdmUoZHJpdmUpOwpAQCAtNDcyLDcgKzMwMCw3IEBACiBzdGF0aWMgdm9pZCBnZW5lcmljX2lkZV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGlkZV9kcml2ZXIgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCiAJCWRydi0+c2h1dGRvd24oZHJpdmUpOwpAQCAtNjYwLDYgKzQ4OCw3IEBACiAKIHZvaWQgaWRlX3BvcnRfYXBwbHlfcGFyYW1zKGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWludCBpOwogCiAJaWYgKGlkZV9pZ25vcmVfY2FibGUgJiAoMSA8PCBod2lmLT5pbmRleCkpIHsKQEAgLTY2OCw4ICs0OTcsOCBAQAogCQlod2lmLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MF9TSE9SVDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKQotCQlpZGVfZGV2X2FwcGx5X3BhcmFtcygmaHdpZi0+ZHJpdmVzW2ldLCBpKTsKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpCisJCWlkZV9kZXZfYXBwbHlfcGFyYW1zKGRyaXZlLCBpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2l0ODE3Mi5jIGIvZHJpdmVycy9pZGUvaXQ4MTcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2l0ODE3Mi5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogICAgICBJVDgxNzIgSURFIGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTaGFuZSBNY0RvbmFsZAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUgIklUODE3MiIKKworc3RhdGljIHZvaWQgaXQ4MTcyX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKKwl1MTYgZHJpdmVfZW5hYmxlczsKKwl1MzIgZHJpdmVfdGltaW5nOworCisJLyoKKwkgKiBUaGUgaGlnaGVzdCB2YWx1ZSBvZiBESU9SL0RJT1cgcHVsc2Ugd2lkdGggYW5kIHJlY292ZXJ5IHRpbWUKKwkgKiB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIElUODE3MiBpcyA4IFBDSSBjbG9jayBjeWNsZXMuICBBcyBhIHJlc3VsdCwKKwkgKiBpdCBjYW5ub3QgYmUgY29uZmlndXJlZCBmb3IgUElPIG1vZGUgMC4gIFRoaXMgdGFibGUgc2V0cyB0aGVzZQorCSAqIHBhcmFtZXRlcnMgdG8gdGhlIG1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBJVDgxNzIuCisJICovCisJc3RhdGljIGNvbnN0IHU4IHRpbWluZ3NbXSA9IHsgMHgzZiwgMHgzYywgMHgxYiwgMHgxMiwgMHgwYSB9OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDQwLCAmZHJpdmVfZW5hYmxlcyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgJmRyaXZlX3RpbWluZyk7CisKKwkvKgorCSAqIEVuYWJsZSBwb3J0IDB4NDQuIFRoZSBJVDgxNzIgc3BlYyBpcyBjb25mdXNlZDsgaXQgY2FsbHMKKwkgKiB0aGlzIHJlZ2lzdGVyIHRoZSAiU2xhdmUgSURFIFRpbWluZyBSZWdpc3RlciIsIGJ1dCBpbiBmYWN0LAorCSAqIGl0IGNvbnRyb2xzIHRpbWluZyBmb3IgYm90aCBtYXN0ZXIgYW5kIHNsYXZlIGRyaXZlcy4KKwkgKi8KKwlkcml2ZV9lbmFibGVzIHw9IDB4NDAwMDsKKworCWRyaXZlX2VuYWJsZXMgJj0gZHJpdmUtPmRuID8gMHhjMDA2IDogMHhjMDYwOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCS8qIGVuYWJsZSBwcmVmZXRjaCAqLworCQlkcml2ZV9lbmFibGVzIHw9IDB4MDAwNCA8PCAoZHJpdmUtPmRuICogNCk7CisJaWYgKGF0YV9pZF9oYXNfaW9yZHkoZHJpdmUtPmlkKSkKKwkJLyogZW5hYmxlIElPUkRZIHNhbXBsZS1wb2ludCAqLworCQlkcml2ZV9lbmFibGVzIHw9IDB4MDAwMiA8PCAoZHJpdmUtPmRuICogNCk7CisKKwlkcml2ZV90aW1pbmcgJj0gZHJpdmUtPmRuID8gMHgwMDAwM2YwMCA6IDB4MDAwZmMwMDA7CisJZHJpdmVfdGltaW5nIHw9IHRpbWluZ3NbcGlvXSA8PCAoZHJpdmUtPmRuICogNiArIDgpOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MCwgZHJpdmVfZW5hYmxlcyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDQsIGRyaXZlX3RpbWluZyk7Cit9CisKK3N0YXRpYyB2b2lkIGl0ODE3Ml9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKKwlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpbnQgdV9mbGFnCQk9IDEgPDwgZHJpdmUtPmRuOworCWludCB1X3NwZWVkCQk9IDA7CisJdTggcmVnNDgsIHJlZzRhOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCAmcmVnNDgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgJnJlZzRhKTsKKworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQl1OCB1ZG1hID0gc3BlZWQgLSBYRkVSX1VETUFfMDsKKwkJdV9zcGVlZCA9IHVkbWEgPDwgKGRyaXZlLT5kbiAqIDQpOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4IHwgdV9mbGFnKTsKKwkJcmVnNGEgJj0gfmFfc3BlZWQ7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIHJlZzRhIHwgdV9zcGVlZCk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggbXdkbWFfdG9fcGlvW10gPSB7IDAsIDMsIDQgfTsKKwkJdTggcGlvOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4ICYgfnVfZmxhZyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOworCisJCXBpbyA9IG13ZG1hX3RvX3Bpb1tzcGVlZCAtIFhGRVJfTVdfRE1BXzBdOworCisJCWl0ODE3Ml9zZXRfcGlvX21vZGUoZHJpdmUsIHBpbyk7CisJfQorfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIGl0ODE3Ml9wb3J0X29wcyA9IHsKKwkuc2V0X3Bpb19tb2RlCT0gaXQ4MTcyX3NldF9waW9fbW9kZSwKKwkuc2V0X2RtYV9tb2RlCT0gaXQ4MTcyX3NldF9kbWFfbW9kZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBpdDgxNzJfcG9ydF9pbmZvIF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLnBvcnRfb3BzCT0gJml0ODE3Ml9wb3J0X29wcywKKwkuZW5hYmxlYml0cwk9IHsgezB4NDEsIDB4ODAsIDB4ODB9LCB7MHgwMCwgMHgwMCwgMHgwMH0gfSwKKwkuaG9zdF9mbGFncwk9IElERV9IRkxBR19TSU5HTEUsCisJLnBpb19tYXNrCT0gQVRBX1BJTzQgJiB+QVRBX1BJTzAsCisJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLAorCS51ZG1hX21hc2sJPSBBVEFfVURNQTIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpdDgxNzJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlmICgoZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCXJldHVybiAtRU5PREVWOyAvKiBJVDgxNzIgaXMgbW9yZSB0aGFuIGFuIElERSBjb250cm9sbGVyICovCisJcmV0dXJuIGlkZV9wY2lfaW5pdF9vbmUoZGV2LCAmaXQ4MTcyX3BvcnRfaW5mbywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpdDgxNzJfcGNpX3RibFtdID0geworCXsgUENJX1ZERVZJQ0UoSVRFLCBQQ0lfREVWSUNFX0lEX0lURV84MTcyKSwgMCB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXQ4MTcyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXQ4MTcyX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIklUODE3Ml9JREUiLAorCS5pZF90YWJsZQk9IGl0ODE3Ml9wY2lfdGJsLAorCS5wcm9iZQkJPSBpdDgxNzJfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXQ4MTcyX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZpdDgxNzJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpdDgxNzJfaWRlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml0ODE3Ml9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXQ4MTcyX2lkZV9pbml0KTsKK21vZHVsZV9leGl0KGl0ODE3Ml9pZGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIExvbmdlcmJlYW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIElURSA4MTcyIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaXQ4MjEzLmMgYi9kcml2ZXJzL2lkZS9pdDgyMTMuYwppbmRleCA3YzJmZWViLi5kNzk2OWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pdDgyMTMuYworKysgYi9kcml2ZXJzL2lkZS9pdDgyMTMuYwpAQCAtMjUsNyArMjUsNyBAQAogCiBzdGF0aWMgdm9pZCBpdDgyMTNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gMHg0MDsKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIHZvaWQgaXQ4MjEzX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtYXNsYXZlCQk9IDB4NDA7CiAJaW50IGFfc3BlZWQJCT0gMyA8PCAoZHJpdmUtPmRuICogNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pdDgyMXguYyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCmluZGV4IGVmMDA0MDguLjBiZTI3YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCkBAIC0xNjcsMTIgKzE2NywxMCBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7Ci0JaWRlX2RyaXZlX3QgKnBhaXI7CisJaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAlpbnQgY2xvY2ssIGFsdGNsb2NrLCBzZWwgPSAwOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCB2OwogCi0JcGFpciA9ICZod2lmLT5kcml2ZXNbMSAtIHVuaXRdOwotCiAJaWYoaXRkZXYtPndhbnRbMF1bMF0gPiBpdGRldi0+d2FudFsxXVswXSkgewogCQljbG9jayA9IGl0ZGV2LT53YW50WzBdWzFdOwogCQlhbHRjbG9jayA9IGl0ZGV2LT53YW50WzFdWzFdOwpAQCAtMjM5LDE1ICsyMzcsMTMgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfZHJpdmVfdCAqcGFpcjsKKwlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCBzZXRfcGlvID0gcGlvOwogCiAJLyogU3BlYyBzYXlzIDg5IHJlZiBkcml2ZXIgdXNlcyA4OCAqLwogCXN0YXRpYyB1MTYgcGlvX3RpbWluZ3NbXT0geyAweEFBODgsIDB4QTM4MiwgMHhBMTgxLCAweDMzMzIsIDB4MzEyMSB9OwogCXN0YXRpYyB1OCBwaW9fd2FudFtdICAgID0geyBBVEFfNjYsIEFUQV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV9BTlkgfTsKIAotCXBhaXIgPSAmaHdpZi0+ZHJpdmVzWzEgLSB1bml0XTsKLQogCS8qCiAJICogQ29tcHV0ZSB0aGUgYmVzdCBQSU8gbW9kZSB3ZSBjYW4gZm9yIGEgZ2l2ZW4gZGV2aWNlLiBXZSBtdXN0CiAJICogcGljayBhIHNwZWVkIHRoYXQgZG9lcyBub3QgY2F1c2UgcHJvYmxlbXMgd2l0aCB0aGUgb3RoZXIgZGV2aWNlCkBAIC0yNzksNyArMjc1LDcgQEAKICAqCXRoZSBzaGFyZWQgTVdETUEvUElPIHRpbWluZyByZWdpc3Rlci4KICAqLwogCi1zdGF0aWMgdm9pZCBpdDgyMXhfdHVuZV9td2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQorc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfbXdkbWEoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBtb2RlX3dhbnRlZCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKQEAgLTMxNiw3ICszMTIsNyBAQAogICoJY29udHJvbGxlciB3aGVuIGRvaW5nIFVETUEgbW9kZXMgaW4gcGFzcyB0aHJvdWdoLgogICovCiAKLXN0YXRpYyB2b2lkIGl0ODIxeF90dW5lX3VkbWEgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBtb2RlX3dhbnRlZCkKK3N0YXRpYyB2b2lkIGl0ODIxeF90dW5lX3VkbWEoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBtb2RlX3dhbnRlZCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKQEAgLTUxNiw2ICs1MTIsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9uczg3NDE1LmMgYi9kcml2ZXJzL2lkZS9uczg3NDE1LmMKaW5kZXggMTM3ODkwNi4uODM2NDNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbnM4NzQxNS5jCisrKyBiL2RyaXZlcnMvaWRlL25zODc0MTUuYwpAQCAtNTYsNyArNTYsNyBAQAogCXJldHVybiBzdXBlcmlvX2lkZV9pbmIoaHdpZi0+aW9fcG9ydHMuc3RhdHVzX2FkZHIpOwogfQogCi1zdGF0aWMgdTggc3VwZXJpb19yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdTggc3VwZXJpb19kbWFfc2ZmX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJcmV0dXJuIHN1cGVyaW9faWRlX2luYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIH0KQEAgLTEwOSw3ICsxMDksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gc3VwZXJpb19yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gc3VwZXJpb19yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTEzMiwxOCArMTMxLDIwIEBACiAJdG1wID0gc3VwZXJpb19pZGVfaW5iKGRtYV9zdGF0KTsKIAlvdXRiKHRtcCB8IDB4NjYsIGRtYV9zdGF0KTsKIH0KKyNlbHNlCisjZGVmaW5lIHN1cGVyaW9fZG1hX3NmZl9yZWFkX3N0YXR1cyBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cwogI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnM4NzQxNV9jb3VudCA9IDAsIG5zODc0MTVfY29udHJvbFtNQVhfSFdJRlNdID0geyAwIH07CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgZWl0aGVyIGVuYWJsZXMvZGlzYWJsZXMgKGFjY29yZGluZyB0byBJREVfREZMQUdfUFJFU0VOVCkKLSAqIHRoZSBJUlEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0IChIV0lGKGRyaXZlKSksCisgKiB0aGUgSVJRIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9ydCwKICAqIGFuZCBzZWxlY3RzIGVpdGhlciBQSU8gb3IgRE1BIGhhbmRzaGFraW5nIGZvciB0aGUgbmV4dCBJL08gb3BlcmF0aW9uLgogICovCiBzdGF0aWMgdm9pZCBuczg3NDE1X3ByZXBhcmVfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IHVzZV9kbWEpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXVuc2lnbmVkIGludCBiaXQsIG90aGVyLCBuZXcsICpvbGQgPSAodW5zaWduZWQgaW50ICopIGh3aWYtPnNlbGVjdF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xOTcsMTEgKzE5OCwxMSBAQAogCiBzdGF0aWMgaW50IG5zODc0MTVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAgICAgICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAJLyogZ2V0IERNQSBjb21tYW5kIG1vZGUgKi8KIAlkbWFfY21kID0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCS8qIHN0b3AgRE1BICovCkBAIC0zMDgsNiArMzA5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBzdXBlcmlvX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gbnM4NzQxNV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jIGIvZHJpdmVycy9pZGUvcGFsbV9iazM3MTAuYwppbmRleCAxMjJlZDNjLi5hN2FjNDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMKQEAgLTMyNCw4ICszMjQsNiBAQAogCiAJaHdpZi0+ZG1hX2Jhc2UgPSBod2lmLT5pb19wb3J0cy5kYXRhX2FkZHIgLSBJREVfUEFMTV9BVEFfUFJJX1JFR19PRkZTRVQ7CiAKLQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzOCw2ICszMzYsNyBAQAogc3RhdGljIHN0cnVjdCBpZGVfcG9ydF9pbmZvIF9fZGV2aW5pdGRhdGEgcGFsbV9iazM3MTBfcG9ydF9pbmZvID0gewogCS5pbml0X2RtYQkJPSBwYWxtX2JrMzcxMF9pbml0X2RtYSwKIAkucG9ydF9vcHMJCT0gJnBhbG1fYmszNzEwX3BvcnRzX29wcywKKwkuZG1hX29wcwkJPSAmc2ZmX2RtYV9vcHMsCiAJLmhvc3RfZmxhZ3MJCT0gSURFX0hGTEFHX01NSU8sCiAJLnBpb19tYXNrCQk9IEFUQV9QSU80LAogCS5td2RtYV9tYXNrCQk9IEFUQV9NV0RNQTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9uZXcuYyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCmluZGV4IDIxMWFlNDYuLmYyMTI5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCisrKyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogc3RhdGljIHZvaWQgcGRjbmV3X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBhZGoJCQk9IChkcml2ZS0+ZG4gJiAxKSA/IDB4MDggOiAweDAwOwogCkBAIC0yMTksNyArMjE5LDcgQEAKIAkgKiBEZWxldGVkIHRoaXMgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZnJvbSB0aGUgY2FsbGVyLgogCSAqLwogCXByaW50ayhLRVJOX1dBUk5JTkcgInBkYzIwMnh4X25ldzogJXMgY2hhbm5lbCByZXNldC5cbiIsCi0JCUhXSUYoZHJpdmUpLT5jaGFubmVsID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIpOworCQlkcml2ZS0+aHdpZi0+Y2hhbm5lbCA/ICJTZWNvbmRhcnkiIDogIlByaW1hcnkiKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCmluZGV4IDYyNGU2MmUuLjk3MTkzMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCisrKyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyB2b2lkIHBkYzIwMnh4X3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGRyaXZlX3BjaQkJPSAweDYwICsgKGRyaXZlLT5kbiA8PCAyKTsKIApAQCAtMTY5LDggKzE2OSw4IEBACiAJaWYgKGRyaXZlLT5jdXJyZW50X3NwZWVkID4gWEZFUl9VRE1BXzIpCiAJCXBkY19vbGRfZW5hYmxlXzY2TUh6X2Nsb2NrKGRyaXZlLT5od2lmKTsKIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrIHx8IChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KSkgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnEJPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0JCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEJPSBod2lmLT5ycTsKIAkJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gaHdpZi0+ZXh0cmFfYmFzZSAtIDE2OwogCQl1bnNpZ25lZCBsb25nIGF0YXBpX3JlZwk9IGhpZ2hfMTYgKyAoaHdpZi0+Y2hhbm5lbCA/IDB4MjQgOiAweDIwKTsKIAkJdTMyIHdvcmRfY291bnQJPSAwOwpAQCAtMTg5LDcgKzE4OSw3IEBACiBzdGF0aWMgaW50IHBkYzIwMnh4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpKSB7Ci0JCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5leHRyYV9iYXNlIC0gMTY7CiAJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOwogCQl1OCBjbG9jawkJPSAwOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIHN0YXRpYyBpbnQgcGRjMjAyeHhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmV4dHJhX2Jhc2UgLSAxNjsKIAl1OCBkbWFfc3RhdAkJPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CiAJdTggc2MxZAkJCT0gaW5iKGhpZ2hfMTYgKyAweDAwMWQpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAKIHN0YXRpYyB2b2lkIHBkYzIwMnh4X3Jlc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlpZGVfaHdpZl90ICptYXRlCT0gaHdpZi0+bWF0ZTsKIAogCXBkYzIwMnh4X3Jlc2V0X2hvc3QoaHdpZik7CkBAIC0zMzcsNiArMzM3LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHBkYzIwMnh4X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IHBkYzIwMnh4X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gcGRjMjAyeHhfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgcGRjMjAyNnhfZG1hX29wcyA9IHsKQEAgLTM0OCw2ICszNDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gcGRjMjAyeHhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gcGRjMjAyeHhfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBwZGMyMDJ4eF9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogI2RlZmluZSBERUNMQVJFX1BEQzIwMjZYX0RFVih1ZG1hLCBzZWN0b3JzKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9waWl4LmMgYi9kcml2ZXJzL2lkZS9waWl4LmMKaW5kZXggNjFkMmQ5Mi4uZjFlMmU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGlpeC5jCisrKyBiL2RyaXZlcnMvaWRlL3BpaXguYwpAQCAtNjcsNyArNjcsNyBAQAogCiBzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGlzX3NsYXZlCQk9IGRyaXZlLT5kbiAmIDE7CiAJaW50IG1hc3Rlcl9wb3J0CQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtYXNsYXZlCQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKIAlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKQEAgLTIyNCw3ICsyMjQsNyBAQAogICovCiBzdGF0aWMgdm9pZCBpY2hfY2xlYXJfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IGRtYV9zdGF0OwogCiAJLyoKQEAgLTI2MCw2ICsyNjAsOCBAQAogCXsgMHgyN0RGLCAweDEwM0MsIDB4MzBBMSB9LAkvKiBJQ0g3IG9uIEhQIENvbXBhcSBuYzI0MDAgKi8KIAl7IDB4MjdERiwgMHgxMDcxLCAweEQyMjEgfSwJLyogSUNINyBvbiBIZXJjdWxlcyBFQy05MDAgKi8KIAl7IDB4MjRDQSwgMHgxMDI1LCAweDAwNjEgfSwJLyogSUNINCBvbiBBY2VyIEFzcGlyZSAyMDIzV0xNaSAqLworCXsgMHgyNENBLCAweDEwMjUsIDB4MDAzZCB9LAkvKiBJQ0g0IG9uIEFDRVIgVE0yOTAgKi8KKwl7IDB4MjY2RiwgMHgxMDI1LCAweDAwNjYgfSwJLyogSUNINiBvbiBBQ0VSIEFzcGlyZSAxNjk0V0xNaSAqLwogCXsgMHgyNjUzLCAweDEwNDMsIDB4ODJEOCB9LAkvKiBJQ0g2TSBvbiBBc3VzIEVlZSA3MDEgKi8KIAkvKiBlbmQgbWFya2VyICovCiAJeyAwLCB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wbWFjLmMgYi9kcml2ZXJzL2lkZS9wbWFjLmMKaW5kZXggN2M0ODFiYi4uNzQ2MjVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcG1hYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BtYWMuYwpAQCAtOTU1LDcgKzk1NSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBwbWFjX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IHBtYWNfc2V0X2lycSwKIApAQCAtMTUxMywxMCArMTUxMiwxMCBAQAogc3RhdGljIGludAogcG1hY19pZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXBtYWNfaWRlX2h3aWZfdCAqcG1pZiA9CiAJCShwbWFjX2lkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoaHdpZi0+Z2VuZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCBhdGE0ID0gKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0KTsKIAogCWlmICghcG1hY19pZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUsIHJxKSkgewpAQCAtMTYzNyw3ICsxNjM2LDcgQEAKIAkJCWJyZWFrOwogCQlpZiAoKyt0aW1lb3V0ID4gMTAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUlZCwgaWRlX2RtYV90ZXN0X2lycSBcCi0JCQl0aW1lb3V0IGZsdXNoaW5nIGNoYW5uZWxcbiIsIEhXSUYoZHJpdmUpLT5pbmRleCk7CisJCQl0aW1lb3V0IGZsdXNoaW5nIGNoYW5uZWxcbiIsIGh3aWYtPmluZGV4KTsKIAkJCWJyZWFrOwogCQl9CiAJfQkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3E0MGlkZS5jIGIvZHJpdmVycy9pZGUvcTQwaWRlLmMKaW5kZXggNGFmNGE4Yy4uOWY5YzBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcTQwaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvcTQwaWRlLmMKQEAgLTk5LDcgKzk5LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcWQ2NXh4LmMgYi9kcml2ZXJzL2lkZS9xZDY1eHguYwppbmRleCBiYzI3YzdhLi41YjJlM2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcWQ2NXh4LmMKKysrIGIvZHJpdmVycy9pZGUvcWQ2NXh4LmMKQEAgLTIwMiw3ICsyMDIsOCBAQAogCQlyZWNvdmVyeV90aW1lID0gZHJpdmUtPmlkW0FUQV9JRF9FSURFX1BJT10gLSAxMjA7CiAJfQogCi0JcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTAwX2NvbXB1dGVfdGltaW5nKEhXSUYoZHJpdmUpLCBhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOworCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjUwMF9jb21wdXRlX3RpbWluZyhkcml2ZS0+aHdpZiwKKwkJCQlhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOwogfQogCiBzdGF0aWMgdm9pZCBxZDY1ODBfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQpAQCAtMjQ1LDExICsyNDYsMTEgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBJTyBtb2RlJWRcbiIsIGRyaXZlLT5uYW1lLHBpbyk7CiAJfQogCi0JaWYgKCFIV0lGKGRyaXZlKS0+Y2hhbm5lbCAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKKwlpZiAoIWh3aWYtPmNoYW5uZWwgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKSB7CiAJCW91dGIoMHg1ZiwgUURfQ09OVFJPTF9QT1JUKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFUQVBJOiBkaXNhYmxlZCByZWFkLWFoZWFkIEZJRk8gIgogCQkJImFuZCBwb3N0LXdyaXRlIGJ1ZmZlciBvbiAlcy5cbiIsCi0JCQlkcml2ZS0+bmFtZSwgSFdJRihkcml2ZSktPm5hbWUpOworCQkJZHJpdmUtPm5hbWUsIGh3aWYtPm5hbWUpOwogCX0KIAogCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjU4MF9jb21wdXRlX3RpbWluZyhhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcWQ2NXh4LmggYi9kcml2ZXJzL2lkZS9xZDY1eHguaAppbmRleCBjODNkZWE4Li42NjM2Zjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xZDY1eHguaAorKysgYi9kcml2ZXJzL2lkZS9xZDY1eHguaApAQCAtMzEsOCArMzEsOCBAQAogCiAjZGVmaW5lIFFEX0NPTkZJRyhod2lmKQkJKChod2lmKS0+Y29uZmlnX2RhdGEgJiAweDAwZmYpCiAKLSNkZWZpbmUgUURfVElNSU5HKGRyaXZlKQkoYnl0ZSkoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHgwMGZmKQotI2RlZmluZSBRRF9USU1SRUcoZHJpdmUpCShieXRlKSgoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHhmZjAwKSA+PiA4KQorI2RlZmluZSBRRF9USU1JTkcoZHJpdmUpCSh1OCkoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHgwMGZmKQorI2RlZmluZSBRRF9USU1SRUcoZHJpdmUpCSh1OCkoKCgoZHJpdmUpLT5kcml2ZV9kYXRhKSAmIDB4ZmYwMCkgPj4gOCkKIAogI2RlZmluZSBRRDY1MDBfREVGX0RBVEEJCSgoUURfVElNMV9QT1JUPDw4KSB8IChRRF9JRDMgPyAweDBjIDogMHgwOCkpCiAjZGVmaW5lIFFENjU4MF9ERUZfREFUQQkJKChRRF9USU0xX1BPUlQ8PDgpIHwgKFFEX0lEMyA/IDB4MGEgOiAweDAwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NjMTIwMC5jIGIvZHJpdmVycy9pZGUvc2MxMjAwLmMKaW5kZXggZWM3Zjc2Ni4uZGJkZDI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2MxMjAwLmMKKysrIGIvZHJpdmVycy9pZGUvc2MxMjAwLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiBzdGF0aWMgdm9pZCBzYzEyMDBfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggbW9kZSkKIHsKLQlpZGVfaHdpZl90CQkqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QJCSpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYJCSpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdW5zaWduZWQgaW50CQlyZWcsIHRpbWluZ3M7CiAJdW5zaWduZWQgc2hvcnQJCXBjaV9jbG9jazsKQEAgLTE3MCw5ICsxNzAsOSBAQAogICovCiBzdGF0aWMgaW50IHNjMTIwMF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBod2lmLT5kbWFfYmFzZTsKLQlieXRlIGRtYV9zdGF0OworCXU4IGRtYV9zdGF0OwogCiAJZG1hX3N0YXQgPSBpbmIoZG1hX2Jhc2UrMik7CQkvKiBnZXQgRE1BIHN0YXR1cyAqLwogCkBAIC0xOTksNyArMTk5LDcgQEAKIAogc3RhdGljIHZvaWQgc2MxMjAwX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90CSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludAkJbW9kZSA9IC0xOwogCiAJLyoKQEAgLTI5Miw2ICsyOTIsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIHNjMTIwMF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jIGIvZHJpdmVycy9pZGUvc2NjX3BhdGEuYwppbmRleCAwZjQ4ZjlkLi44ZDIzMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jCisrKyBiL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXJldHVybiAodTgpaW5fYmUzMigodm9pZCAqKWh3aWYtPmlvX3BvcnRzLmN0bF9hZGRyKTsKIH0KIAotc3RhdGljIHU4IHNjY19yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdTggc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gKHU4KWluX2JlMzIoKHZvaWQgKikoaHdpZi0+ZG1hX2Jhc2UgKyA0KSk7CiB9CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogc3RhdGljIHZvaWQgc2NjX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBzY2NfcG9ydHMgKnBvcnRzID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1bnNpZ25lZCBsb25nIGN0bF9iYXNlID0gcG9ydHMtPmN0bDsKIAl1bnNpZ25lZCBsb25nIGNja2N0cmxfcG9ydCA9IGN0bF9iYXNlICsgMHhmZjA7CkBAIC0yNDksNyArMjQ5LDcgQEAKIAogc3RhdGljIHZvaWQgc2NjX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHNjY19wb3J0cyAqcG9ydHMgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXVuc2lnbmVkIGxvbmcgY3RsX2Jhc2UgPSBwb3J0cy0+Y3RsOwogCXVuc2lnbmVkIGxvbmcgY2NrY3RybF9wb3J0ID0gY3RsX2Jhc2UgKyAweGZmMDsKQEAgLTI1OSw3ICsyNTksNyBAQAogCXVuc2lnbmVkIGxvbmcgc2NyY3N0X3BvcnQgPSBjdGxfYmFzZSArIDB4MDE0OwogCXVuc2lnbmVkIGxvbmcgdWRlbnZ0X3BvcnQgPSBjdGxfYmFzZSArIDB4MDE4OwogCXVuc2lnbmVkIGxvbmcgdGR2aHNlbF9wb3J0ICAgPSBjdGxfYmFzZSArIDB4MDIwOwotCWludCBpc19zbGF2ZSA9ICgmaHdpZi0+ZHJpdmVzWzFdID09IGRyaXZlKTsKKwlpbnQgaXNfc2xhdmUgPSBkcml2ZS0+ZG4gJiAxOwogCWludCBvZmZzZXQsIGlkeDsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIAl1bnNpZ25lZCBsb25nIGpjYWN0c2VsOwpAQCAtMjkyLDcgKzI5Miw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwotCXU4IGRtYV9zdGF0ID0gc2NjX2lkZV9pbmIoaHdpZi0+ZG1hX2Jhc2UgKyA0KTsKKwl1OCBkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKG9uKQogCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKQEAgLTMxNiw3ICszMTYsNyBAQAogc3RhdGljIGludCBzY2NfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXVuc2lnbmVkIGludCByZWFkaW5nOwogCXU4IGRtYV9zdGF0OwogCkBAIC0zMzgsNyArMzM4LDcgQEAKIAlvdXRfYmUzMigodm9pZCBfX2lvbWVtICopaHdpZi0+ZG1hX2Jhc2UsIHJlYWRpbmcpOwogCiAJLyogcmVhZCBETUEgc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlkbWFfc3RhdCA9IGluX2JlMzIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIDQpKTsKKwlkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJLyogY2xlYXIgSU5UUiAmIEVSUk9SIGZsYWdzICovCiAJb3V0X2JlMzIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIDQpLCBkbWFfc3RhdCB8IDYpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJLyogc3RvcCBETUEgKi8KIAlzY2NfaWRlX291dGIoZG1hX2NtZCAmIH4xLCBod2lmLT5kbWFfYmFzZSk7CiAJLyogZ2V0IERNQSBzdGF0dXMgKi8KLQlkbWFfc3RhdCA9IHNjY19pZGVfaW5iKGh3aWYtPmRtYV9iYXNlICsgNCk7CisJZG1hX3N0YXQgPSBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAkvKiBjbGVhciB0aGUgSU5UUiAmIEVSUk9SIGJpdHMgKi8KIAlzY2NfaWRlX291dGIoZG1hX3N0YXQgfCA2LCBod2lmLT5kbWFfYmFzZSArIDQpOwogCS8qIHB1cmdlIERNQSBtYXBwaW5ncyAqLwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2NjX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdm9pZCBfX2lvbWVtICpkbWFfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGludHN0c19wb3J0ID0gaHdpZi0+ZG1hX2Jhc2UgKyAweDAxNDsKIAl1MzIgcmVnOwpAQCAtNDA1LDE3ICs0MDUsMTggQEAKIAkJCSAgICAgICBkcml2ZS0+bmFtZSk7CiAJCQlkYXRhX2xvc3MgPSAxOwogCQkJaWYgKHJldHJ5KyspIHsKLQkJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0JCQkJaW50IHVuaXQ7CisJCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CisJCQkJaWRlX2RyaXZlX3QgKmRyaXZlOworCQkJCWludCBpOworCiAJCQkJLyogRVJST1JfUkVTRVQgYW5kIGRyaXZlLT5jcmNfY291bnQgYXJlIG5lZWRlZAogCQkJCSAqIHRvIHJlZHVjZSBETUEgdHJhbnNmZXIgbW9kZSBpbiByZXRyeSBwcm9jZXNzLgogCQkJCSAqLwogCQkJCWlmIChycSkKIAkJCQkJcnEtPmVycm9ycyB8PSBFUlJPUl9SRVNFVDsKLQkJCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCQkJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisKKwkJCQlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpCiAJCQkJCWRyaXZlLT5jcmNfY291bnQrKzsKLQkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC00OTYsNyArNDk3LDcgQEAKIC8qIHJldHVybnMgMSBpZiBkbWEgaXJxIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgc2NjX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1MzIgaW50X3N0YXQgPSBpbl9iZTMyKCh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZSArIDB4MDE0KTsKIAogCS8qIFNDQyBlcnJhdGEgQTI1MixBMzA4IHdvcmthcm91bmQ6IFN0ZXA0ICovCkBAIC04NTIsNyArODUzLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IHNjY19leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IHNjY19yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gc2NjX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gc2NjX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBzY2Nfc2V0X2lycSwKIApAQCAtODc5LDYgKzg3OSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBzY2NfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAjZGVmaW5lIERFQ0xBUkVfU0NDX0RFVihuYW1lX3N0cikJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9pZGUvc2VydmVyd29ya3MuYwppbmRleCA0MzdiYzkxLi4zODIxMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXN0YXRpYyBjb25zdCB1OCBkbWFfbW9kZXNbXQkJPSB7IDB4NzcsIDB4MjEsIDB4MjAgfTsKIAlzdGF0aWMgY29uc3QgdTggZHJpdmVfcGNpMltdCQk9IHsgMHg0NSwgMHg0NCwgMHg0NywgMHg0NiB9OwogCi0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggOWYxZjkxNi4uZTg1ZDFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqIHdlIHR1bmUgdGhlIGRyaXZlIHRoZW4gdHJ5IHRvIGdyYWIgRE1BIG93bmVyc2hpcCBpZiB3ZSB3YW50IHRvIGJlCiAJICogdGhlIERNQSBlbmQuICBUaGlzIGhhcyB0byBiZSBiZWNvbWUgZHluYW1pYyB0byBoYW5kbGUgaG90LXBsdWcuCiAJICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCWlmICgoZG1hX3N0YXQgJiAweDgwKSAmJiBod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmRtYV9iYXNlKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiBzaW1wbGV4IGRldmljZTogRE1BIGRpc2FibGVkXG4iLAogCQkJZC0+bmFtZSwgcGNpX25hbWUoZGV2KSk7CkBAIC0zNzcsNiArMzc3LDkgQEAKIAogCQlod2lmLT5kbWFfYmFzZSA9IGJhc2U7CiAKKwkJaWYgKGh3aWYtPmRtYV9vcHMgPT0gTlVMTCkKKwkJCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7CisKIAkJaWYgKGlkZV9wY2lfY2hlY2tfc2ltcGxleChod2lmLCBkKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTM5Myw4ICszOTYsNiBAQAogCiAJCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJCXJldHVybiAtMTsKLQotCQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAJICovCiAKIAlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgY2hhbm5lbHM7ICsrcG9ydCkgewotCQljb25zdCBpZGVfcGNpX2VuYWJsZWJpdF90ICplID0gJihkLT5lbmFibGViaXRzW3BvcnRdKTsKKwkJY29uc3Qgc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0ICplID0gJmQtPmVuYWJsZWJpdHNbcG9ydF07CiAKIAkJaWYgKGUtPnJlZyAmJiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBlLT5yZWcsICZ0bXApIHx8CiAJCSAgICAodG1wICYgZS0+bWFzaykgIT0gZS0+dmFsKSkgewpAQCAtNTE5LDggKzUyMCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JLyogSXMgaXQgYW4gIklERSBzdG9yYWdlIiBkZXZpY2UgaW4gbm9uLVBDSSBtb2RlPyAqLwotCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgJiYgKGRldi0+Y2xhc3MgJiA1KSAhPSA1KSB7CisJaWYgKGlkZV9wY2lfaXNfaW5fY29tcGF0aWJpbGl0eV9tb2RlKGRldikpIHsKIAkJaWYgKG5vaXN5KQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IG5vdCAxMDAlJSBuYXRpdmUgbW9kZTogd2lsbCAiCiAJCQkJInByb2JlIGlycXMgbGF0ZXJcbiIsIGQtPm5hbWUsIHBjaV9uYW1lKGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2dpaW9jNC5jIGIvZHJpdmVycy9pZGUvc2dpaW9jNC5jCmluZGV4IGE2ODdhN2QuLmZkYjlkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NnaWlvYzQuYworKysgYi9kcml2ZXJzL2lkZS9zZ2lpb2M0LmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogc2dpaW9jNF9jbGVhcmlycShpZGVfZHJpdmVfdCAqIGRyaXZlKQogewogCXUzMiBpbnRyX3JlZzsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCXVuc2lnbmVkIGxvbmcgb3RoZXJfaXIgPSBpb19wb3J0cy0+aXJxX2FkZHIgKyAoSU9DNF9JTlRSX1JFRyA8PCAyKTsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNnaWlvYzRfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGh3aWYtPmRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdW5zaWduZWQgaW50IHJlZyA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilpb2M0X2RtYV9hZGRyKTsKIAl1bnNpZ25lZCBpbnQgdGVtcF9yZWcgPSByZWcgfCBJT0M0X1NfRE1BX1NUQVJUOwpAQCAtMjA5LDcgKzIwOSw3IEBACiBzdGF0aWMgaW50IHNnaWlvYzRfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hLCBiY19kZXYsIGJjX21lbSwgbnVtLCB2YWxpZCA9IDAsIGNudCA9IDA7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gaHdpZi0+ZG1hX2Jhc2U7CiAJaW50IGRtYV9zdGF0ID0gMDsKIAl1bnNpZ25lZCBsb25nICplbmRpbmdfZG1hID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzZ2lpb2M0X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JcmV0dXJuIHNnaWlvYzRfY2hlY2tpcnEoSFdJRihkcml2ZSkpOworCXJldHVybiBzZ2lpb2M0X2NoZWNraXJxKGRyaXZlLT5od2lmKTsKIH0KIAogc3RhdGljIHZvaWQgc2dpaW9jNF9kbWFfaG9zdF9zZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgb24pCkBAIC0zNjcsNyArMzY3LDcgQEAKIHNnaWlvYzRfY29uZmlndXJlX2Zvcl9kbWEoaW50IGRtYV9kaXJlY3Rpb24sIGlkZV9kcml2ZV90ICogZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdTMyIGRtYV9hZGRyLCBlbmRpbmdfZG1hX2FkZHI7CkBAIC00MjcsNyArNDI3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHNnaWlvYzRfYnVpbGRfZG1hX3RhYmxlKGlkZV9kcml2ZV90ICogZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGRkaXIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBpbnQgKnRhYmxlID0gaHdpZi0+ZG1hdGFibGVfY3B1OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGkgPSAxOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CkBAIC00OTIsNyArNDkyLDcgQEAKIAogc3RhdGljIGludCBzZ2lpb2M0X2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCWludCBkZGlyOwogCkBAIC01MjMsNyArNTIzLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IHNnaWlvYzRfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYyBiL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYwppbmRleCA3ZDYyMmQyLi5jYjJiMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zaWltYWdlLmMKKysrIGIvZHJpdmVycy9pZGUvc2lpbWFnZS5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNpaW1hZ2Vfc2VsZGV2KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGJhc2UJPSAodW5zaWduZWQgbG9uZylod2lmLT5od2lmX2RhdGE7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJc3RhdGljIGNvbnN0IHUxNiB0Zl9zcGVlZFtdICAgPSB7IDB4MzI4YSwgMHgyMjgzLCAweDEyODEsIDB4MTBjMywgMHgxMGMxIH07CiAJc3RhdGljIGNvbnN0IHUxNiBkYXRhX3NwZWVkW10gPSB7IDB4MzI4YSwgMHgyMjgzLCAweDExMDQsIDB4MTBjMywgMHgxMGMxIH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaWRlX2RyaXZlX3QgKnBhaXIJPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAl1MzIgc3BlZWR0CQk9IDA7CkBAIC0zMDAsNyArMzAwLDcgQEAKIAlzdGF0aWMgY29uc3QgdTggdWx0cmE1W10gPSB7IDB4MEMsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDIsIDB4MDEgfTsKIAlzdGF0aWMgY29uc3QgdTE2IGRtYVtdCSA9IHsgMHgyMjA4LCAweDEwQzIsIDB4MTBDMSB9OwogCi0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKIAl1MTYgdWx0cmEgPSAwLCBtdWx0aQk9IDA7CkBAIC0zNDAsNyArMzQwLDcgQEAKIC8qIHJldHVybnMgMSBpZiBkbWEgaXJxIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgc2lpbWFnZV9pb19kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBkbWFfYWx0c3RhdAkJPSAwOwogCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDEpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2lpbWFnZV9tbWlvX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGFkZHIJPSBzaWltYWdlX3NlbHJlZyhod2lmLCAweDEpOwogCXZvaWQgX19pb21lbSAqc2F0YV9lcnJvcl9hZGRyCiAJCT0gKHZvaWQgX19pb21lbSAqKWh3aWYtPnNhdGFfc2NyW1NBVEFfRVJST1JfT0ZGU0VUXTsKQEAgLTcxNyw2ICs3MTcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gc2lpbWFnZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TSUlfREVWKHBfb3BzKQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKaW5kZXggYWQzMmUxOC4uOWVjMWE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGNvbmZpZ19kcml2ZV9hcnRfcndwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggcmVnNGJoCQk9IDA7CiAJdTggcndfcHJlZmV0Y2gJCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMgYi9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCmluZGV4IDg0ZGMzMzYuLjQ4Y2M3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9pZGUvc2w4MmMxMDUuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNsODJjMTA1X2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUzMiB2YWwsIG1hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IENUUkxfSURFX0lSUUIgOiBDVFJMX0lERV9JUlFBOwogCXU4IGRtYV9jbWQ7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc2w4MmMxMDVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IHJlZyAJCT0gMHg0NCArIGRyaXZlLT5kbiAqIDQ7CiAKQEAgLTI5OSw2ICsyOTksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IHNsODJjMTA1X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gc2w4MmMxMDVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBzbDgyYzEwNV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jIGIvZHJpdmVycy9pZGUvc2xjOTBlNjYuYwppbmRleCAwZjc1OWU0Li40MGI0Yjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RhdGljIHZvaWQgc2xjOTBlNjZfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwpAQCAtNzMsNyArNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBzbGM5MGU2Nl9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggbWFzbGF2ZQkJPSBod2lmLT5jaGFubmVsID8gMHg0MiA6IDB4NDA7CiAJaW50IHNpdHJlID0gMCwgYV9zcGVlZAk9IDcgPDwgKGRyaXZlLT5kbiAqIDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKaW5kZXggOTNlMmNjZS4uODQxMDlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYworKysgYi9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyB2b2lkIHRjODZjMDAxX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjcl9wb3J0CT0gaHdpZi0+Y29uZmlnX2RhdGEgKyAoZHJpdmUtPmRuID8gMHgwMiA6IDB4MDApOwogCXUxNiBtb2RlLCBzY3IJCT0gaW53KHNjcl9wb3J0KTsKIApAQCAtNjIsMTMgKzYyLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgdGM4NmMwMDFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5CT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7CiAJdTggZG1hX3N0YXQJCT0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogCiAJLyogUmVzdG9yZSBhIGhpZ2hlciBsZXZlbCBkcml2ZXIncyBleHBpcnkgaGFuZGxlciBmaXJzdC4gKi8KLQlod2dyb3VwLT5leHBpcnkJPSBleHBpcnk7CisJaHdpZi0+ZXhwaXJ5ID0gZXhwaXJ5OwogCiAJaWYgKChkbWFfc3RhdCAmIDUpID09IDEpIHsJLyogRE1BIGFjdGl2ZSBhbmQgbm8gaW50ZXJydXB0ICovCiAJCXVuc2lnbmVkIGxvbmcgc2NfYmFzZQk9IGh3aWYtPmNvbmZpZ19kYXRhOwpAQCAtMTEwLDExICsxMDksMTAgQEAKIAogc3RhdGljIHZvaWQgdGM4NmMwMDFfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cAk9IEhXR1JPVVAoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjX2Jhc2UJPSBod2lmLT5jb25maWdfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHR3Y3JfcG9ydAk9IHNjX2Jhc2UgKyAoZHJpdmUtPmRuID8gMHgwNiA6IDB4MDQpOwotCXVuc2lnbmVkIGxvbmcgbnNlY3RvcnMJPSBod2dyb3VwLT5ycS0+bnJfc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIG5zZWN0b3JzCT0gaHdpZi0+cnEtPm5yX3NlY3RvcnM7CiAKIAkvKgogCSAqIFdlIGhhdmUgdG8gbWFudWFsbHkgbG9hZCB0aGUgc2VjdG9yIGNvdW50IGFuZCBzaXplIGludG8KQEAgLTEyNSw4ICsxMjMsOCBAQAogCW91dHcoU0VDVE9SX1NJWkUgLyAyLCB0d2NyX3BvcnQpOyAvKiBUcmFuc2ZlciBXb3JkIENvdW50IDEvMiAqLwogCiAJLyogSW5zdGFsbCBvdXIgdGltZW91dCBleHBpcnkgaG9vaywgc2F2aW5nIHRoZSBjdXJyZW50IGhhbmRsZXIuLi4gKi8KLQlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3Z3JvdXAtPmV4cGlyeSk7Ci0JaHdncm91cC0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKKwlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3aWYtPmV4cGlyeSk7CisJaHdpZi0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKIAogCWlkZV9kbWFfc3RhcnQoZHJpdmUpOwogfQpAQCAtMTkwLDYgKzE4OCw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gdGM4NmMwMDFfY2hpcHNldCBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHJpZmxleC5jIGIvZHJpdmVycy9pZGUvdHJpZmxleC5jCmluZGV4IGI2ZmY0MDMuLjg3NzNjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3RyaWZsZXguYworKysgYi9kcml2ZXJzL2lkZS90cmlmbGV4LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogc3RhdGljIHZvaWQgdHJpZmxleF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MzIgdHJpZmxleF90aW1pbmdzID0gMDsKIAl1MTYgdGltaW5nID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3RybTI5MC5jIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKaW5kZXggMmE1ZWE5MC4uYjZhMTI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHJtMjkwLmMKKysrIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgdm9pZCB0cm0yOTBfcHJlcGFyZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdXNlX2RtYSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUxNiByZWcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4NCw3ICsxODQsNyBAQAogc3RhdGljIGludCB0cm0yOTBfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IGNvdW50LCBydzsKIAogCWlmIChycV9kYXRhX2RpcihycSkpIHsKQEAgLTIyMiwxNSArMjIyLDE1IEBACiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwotCXN0YXR1cyA9IGludyhIV0lGKGRyaXZlKS0+ZG1hX2Jhc2UgKyAyKTsKKwlzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CisKIAlyZXR1cm4gc3RhdHVzICE9IDB4MDBmZjsKIH0KIAogc3RhdGljIGludCB0cm0yOTBfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQl1MTYgc3RhdHVzOworCXUxNiBzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CiAKLQlzdGF0dXMgPSBpbncoSFdJRihkcml2ZSktPmRtYV9iYXNlICsgMik7CiAJcmV0dXJuIHN0YXR1cyA9PSAweDAwZmY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKaW5kZXggNGE4YzVhMi4uODgyZjZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKKysrIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCByZWFkaW5nOwogCWludCBuZW50OwogCkBAIC0zOTcsNiArMzk3LDE3IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgdTggdHg0OTM5aWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKKworCXJldHVybiB0eDQ5MzlpZGVfcmVhZGIoYmFzZSwgVFg0OTM5SURFX0RNQV9TdGF0KTsKK30KKyNlbHNlCisjZGVmaW5lIHR4NDkzOWlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzIGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzCisjZW5kaWYKKwogc3RhdGljIHZvaWQgdHg0OTM5aWRlX2luaXRfaHdpZihpZGVfaHdpZl90ICpod2lmKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwpAQCAtNDQzLDEzICs0NTQsNiBAQAogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAKLXN0YXRpYyB1OCB0eDQ5MzlpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwotCi0JcmV0dXJuIHR4NDkzOWlkZV9yZWFkYihiYXNlLCBUWDQ5MzlJREVfRE1BX1N0YXQpOwotfQotCiAvKiBjdXN0b20gaW9wcyAoaW5kZXBlbmRlbnQgZnJvbSBTV0FQX0lPX1NQQUNFKSAqLwogc3RhdGljIHU4IHR4NDkzOWlkZV9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQogewpAQCAtNTg1LDcgKzU4OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IHR4NDkzOWlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTYwOSw3ICs2MTIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCkBAIC02MzgsNiArNjQwLDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHR4NDkzOWlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSB0eDQ5MzlpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyB0eDQ5MzlpZGVfcG9ydF9pbmZvIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS91bWM4NjcyLmMgYi9kcml2ZXJzL2lkZS91bWM4NjcyLmMKaW5kZXggZTI5OTc4Yy4uMDYwOGQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdW1jODY3Mi5jCisrKyBiL2RyaXZlcnMvaWRlL3VtYzg2NzIuYwpAQCAtMTA2LDIyICsxMDYsMjEgQEAKIAogc3RhdGljIHZvaWQgdW1jX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqbWF0ZV9od2dyb3VwID0gaHdpZi0+bWF0ZSA/IGh3aWYtPm1hdGUtPmh3Z3JvdXAgOiBOVUxMOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZiwgKm1hdGUgPSBod2lmLT5tYXRlOwogCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCiAJcHJpbnRrKCIlczogc2V0dGluZyB1bWM4NjcyIHRvIFBJTyBtb2RlJWQgKHNwZWVkICVkKVxuIiwKIAkJZHJpdmUtPm5hbWUsIHBpbywgcGlvX3RvX3VtY1twaW9dKTsKLQlpZiAobWF0ZV9od2dyb3VwKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWF0ZV9od2dyb3VwLT5sb2NrLCBmbGFncyk7Ci0JaWYgKG1hdGVfaHdncm91cCAmJiBtYXRlX2h3Z3JvdXAtPmhhbmRsZXIpIHsKKwlpZiAobWF0ZSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hdGUtPmxvY2ssIGZsYWdzKTsKKwlpZiAobWF0ZSAmJiBtYXRlLT5oYW5kbGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW1jODY3Mjogb3RoZXIgaW50ZXJmYWNlIGlzIGJ1c3k6IGV4aXRpbmcgdHVuZV91bWMoKVxuIik7CiAJfSBlbHNlIHsKIAkJY3VycmVudF9zcGVlZHNbZHJpdmUtPm5hbWVbMl0gLSAnYSddID0gcGlvX3RvX3VtY1twaW9dOwogCQl1bWNfc2V0X3NwZWVkcyhjdXJyZW50X3NwZWVkcyk7CiAJfQotCWlmIChtYXRlX2h3Z3JvdXApCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hdGVfaHdncm91cC0+bG9jaywgZmxhZ3MpOworCWlmIChtYXRlKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXRlLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHVtYzg2NzJfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCmluZGV4IDJhODEyZDMuLmZlY2MwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KIAotCXZpYV9zZXRfc3BlZWQoSFdJRihkcml2ZSksIGRyaXZlLT5kbiwgJnQpOworCXZpYV9zZXRfc3BlZWQoaHdpZiwgZHJpdmUtPmRuLCAmdCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pNzMwMF9pZGxlLmMKaW5kZXggZmIxNzZmNi4uMTdlOGRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgZHVtbXlfZG1hX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV82NEJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZkdW1teV9kbWFfZGV2LmNvaGVyZW50X2RtYV9tYXNrLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCmluZGV4IDRmNGQxYmIuLmI0M2Y3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwpAQCAtNzc4LDcgKzc3OCw3IEBACiAJY2xhc3NfZGV2LT5jbGFzcyAgICAgID0gJmliX2NsYXNzOwogCWNsYXNzX2Rldi0+ZHJpdmVyX2RhdGEgPSBkZXZpY2U7CiAJY2xhc3NfZGV2LT5wYXJlbnQgICAgID0gZGV2aWNlLT5kbWFfZGV2aWNlOwotCXN0cmxjcHkoY2xhc3NfZGV2LT5idXNfaWQsIGRldmljZS0+bmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZShjbGFzc19kZXYsIGRldmljZS0+bmFtZSk7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5wb3J0X2xpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IGU2MDM3MzYuLjUxYmQ5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC0xMjY2LDggKzEyNjYsNyBAQAogCXVjbV9kZXYtPmRldi5wYXJlbnQgPSBkZXZpY2UtPmRtYV9kZXZpY2U7CiAJdWNtX2Rldi0+ZGV2LmRldnQgPSB1Y21fZGV2LT5jZGV2LmRldjsKIAl1Y21fZGV2LT5kZXYucmVsZWFzZSA9IGliX3VjbV9yZWxlYXNlX2RldjsKLQlzbnByaW50Zih1Y21fZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInVjbSVkIiwKLQkJIHVjbV9kZXYtPmRldm51bSk7CisJZGV2X3NldF9uYW1lKCZ1Y21fZGV2LT5kZXYsICJ1Y20lZCIsIHVjbV9kZXYtPmRldm51bSk7CiAJaWYgKGRldmljZV9yZWdpc3RlcigmdWNtX2Rldi0+ZGV2KSkKIAkJZ290byBlcnJfY2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCA3YzEzZGI4Li41NGM4ZmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtMTk0OSw4ICsxOTQ5LDcgQEAKIAogCWhvc3QtPmRldi5jbGFzcyA9ICZzcnBfY2xhc3M7CiAJaG9zdC0+ZGV2LnBhcmVudCA9IGRldmljZS0+ZGV2LT5kbWFfZGV2aWNlOwotCXNucHJpbnRmKGhvc3QtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAic3JwLSVzLSVkIiwKLQkJIGRldmljZS0+ZGV2LT5uYW1lLCBwb3J0KTsKKwlkZXZfc2V0X25hbWUoJmhvc3QtPmRldiwgInNycC0lcy0lZCIsIGRldmljZS0+ZGV2LT5uYW1lLCBwb3J0KTsKIAogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJmhvc3QtPmRldikpCiAJCWdvdG8gZnJlZV9ob3N0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKaW5kZXggOThjNGY5YS4uNGM5Yzc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCiBvYmotJChDT05GSUdfSU5QVVQpCQkrPSBpbnB1dC1jb3JlLm8KLWlucHV0LWNvcmUtb2JqcyA6PSBpbnB1dC5vIGZmLWNvcmUubworaW5wdXQtY29yZS1vYmpzIDo9IGlucHV0Lm8gaW5wdXQtY29tcGF0Lm8gZmYtY29yZS5vCiAKIG9iai0kKENPTkZJR19JTlBVVF9GRl9NRU1MRVNTKQkrPSBmZi1tZW1sZXNzLm8KIG9iai0kKENPTkZJR19JTlBVVF9QT0xMREVWKQkrPSBpbnB1dC1wb2xsZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZidWcuYyBiL2RyaXZlcnMvaW5wdXQvZXZidWcuYwppbmRleCAwMzUzNjAxLi5mN2M1YzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2YnVnLmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmJ1Zy5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgdm9pZCBldmJ1Z19ldmVudChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewogCXByaW50ayhLRVJOX0RFQlVHICJldmJ1Zy5jOiBFdmVudC4gRGV2OiAlcywgVHlwZTogJWQsIENvZGU6ICVkLCBWYWx1ZTogJWRcbiIsCi0JCWhhbmRsZS0+ZGV2LT5kZXYuYnVzX2lkLCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisJCWRldl9uYW1lKCZoYW5kbGUtPmRldi0+ZGV2KSwgdHlwZSwgY29kZSwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50IGV2YnVnX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKQEAgLTY1LDcgKzY1LDcgQEAKIAkJZ290byBlcnJfdW5yZWdpc3Rlcl9oYW5kbGU7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiZXZidWcuYzogQ29ubmVjdGVkIGRldmljZTogJXMgKCVzIGF0ICVzKVxuIiwKLQkJZGV2LT5kZXYuYnVzX2lkLAorCQlkZXZfbmFtZSgmZGV2LT5kZXYpLAogCQlkZXYtPm5hbWUgPzogInVua25vd24iLAogCQlkZXYtPnBoeXMgPzogInVua25vd24iKTsKIApAQCAtODEsNyArODEsNyBAQAogc3RhdGljIHZvaWQgZXZidWdfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgImV2YnVnLmM6IERpc2Nvbm5lY3RlZCBkZXZpY2U6ICVzXG4iLAotCQloYW5kbGUtPmRldi0+ZGV2LmJ1c19pZCk7CisJCWRldl9uYW1lKCZoYW5kbGUtPmRldi0+ZGV2KSk7CiAKIAlpbnB1dF9jbG9zZV9kZXZpY2UoaGFuZGxlKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZShoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IDEwNzBkYjMuLmVkOGJhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSAiaW5wdXQtY29tcGF0LmgiCiAKIHN0cnVjdCBldmRldiB7CiAJaW50IGV4aXN0OwpAQCAtMjkwLDE4NyArMjkwLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0KLXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgewotCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOwotCV9fdTE2IHR5cGU7Ci0JX191MTYgY29kZTsKLQlfX3MzMiB2YWx1ZTsKLX07Ci0KLXN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3RfY29tcGF0IHsKLQlfX3UxNiB3YXZlZm9ybTsKLQlfX3UxNiBwZXJpb2Q7Ci0JX19zMTYgbWFnbml0dWRlOwotCV9fczE2IG9mZnNldDsKLQlfX3UxNiBwaGFzZTsKLQotCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKLQotCV9fdTMyIGN1c3RvbV9sZW47Ci0JY29tcGF0X3VwdHJfdCBjdXN0b21fZGF0YTsKLX07Ci0KLXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0IHsKLQlfX3UxNiB0eXBlOwotCV9fczE2IGlkOwotCV9fdTE2IGRpcmVjdGlvbjsKLQlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOwotCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OwotCi0JdW5pb24gewotCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OwotCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKLQkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdF9jb21wYXQgcGVyaW9kaWM7Ci0JCXN0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IGNvbmRpdGlvblsyXTsgLyogT25lIGZvciBlYWNoIGF4aXMgKi8KLQkJc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgcnVtYmxlOwotCX0gdTsKLX07Ci0KLS8qIE5vdGUgdG8gdGhlIGF1dGhvciBvZiB0aGlzIGNvZGU6IGRpZCBpdCBldmVyIG9jY3VyIHRvCi0gICB5b3Ugd2h5IHRoZSBpZmRlZnMgYXJlIG5lZWRlZD8gVGhpbmsgYWJvdXQgaXQgYWdhaW4uIC1BSyAqLwotI2lmZGVmIENPTkZJR19YODZfNjQKLSMgIGRlZmluZSBDT01QQVRfVEVTVCBpc19jb21wYXRfdGFzaygpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19JQTY0KQotIyAgZGVmaW5lIENPTVBBVF9URVNUIElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TMzkwKQotIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKQotI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQUykKLSMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKQotI2Vsc2UKLSMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBldmRldl9ldmVudF9zaXplKHZvaWQpCi17Ci0JcmV0dXJuIENPTVBBVF9URVNUID8KLQkJc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpIDogc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkJIHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKENPTVBBVF9URVNUKSB7Ci0JCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29tcGF0X2V2ZW50LCBidWZmZXIsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWV2ZW50LT50aW1lLnR2X3NlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3NlYzsKLQkJZXZlbnQtPnRpbWUudHZfdXNlYyA9IGNvbXBhdF9ldmVudC50aW1lLnR2X3VzZWM7Ci0JCWV2ZW50LT50eXBlID0gY29tcGF0X2V2ZW50LnR5cGU7Ci0JCWV2ZW50LT5jb2RlID0gY29tcGF0X2V2ZW50LmNvZGU7Ci0JCWV2ZW50LT52YWx1ZSA9IGNvbXBhdF9ldmVudC52YWx1ZTsKLQotCX0gZWxzZSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBldmRldl9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKLXsKLQlpZiAoQ09NUEFUX1RFU1QpIHsKLQkJc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCBjb21wYXRfZXZlbnQ7Ci0KLQkJY29tcGF0X2V2ZW50LnRpbWUudHZfc2VjID0gZXZlbnQtPnRpbWUudHZfc2VjOwotCQljb21wYXRfZXZlbnQudGltZS50dl91c2VjID0gZXZlbnQtPnRpbWUudHZfdXNlYzsKLQkJY29tcGF0X2V2ZW50LnR5cGUgPSBldmVudC0+dHlwZTsKLQkJY29tcGF0X2V2ZW50LmNvZGUgPSBldmVudC0+Y29kZTsKLQkJY29tcGF0X2V2ZW50LnZhbHVlID0gZXZlbnQtPnZhbHVlOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAmY29tcGF0X2V2ZW50LAotCQkJCSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl9IGVsc2UgewotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCi0JCQkJICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCi17Ci0JaWYgKENPTVBBVF9URVNUKSB7Ci0JCXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0ICpjb21wYXRfZWZmZWN0OwotCi0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKgotCQkgKiBJdCBzbyBoYXBwZW5zIHRoYXQgdGhlIHBvaW50ZXIgd2hpY2ggbmVlZHMgdG8gYmUgY2hhbmdlZAotCQkgKiBpcyB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLCBzbyB3ZSBjYW4gY29weSB0aGUKLQkJICogd2hvbGUgdGhpbmcgYW5kIHJlcGxhY2UganVzdCB0aGUgcG9pbnRlci4KLQkJICovCi0KLQkJY29tcGF0X2VmZmVjdCA9IChzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqKWVmZmVjdDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY29tcGF0X2VmZmVjdCwgYnVmZmVyLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGNvbXBhdF9lZmZlY3QtPnR5cGUgPT0gRkZfUEVSSU9ESUMgJiYKLQkJICAgIGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMud2F2ZWZvcm0gPT0gRkZfQ1VTVE9NKQotCQkJZWZmZWN0LT51LnBlcmlvZGljLmN1c3RvbV9kYXRhID0KLQkJCQljb21wYXRfcHRyKGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMuY3VzdG9tX2RhdGEpOwotCX0gZWxzZSB7Ci0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBldmRldl9ldmVudF9zaXplKHZvaWQpCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQotewotCWlmIChjb3B5X2Zyb21fdXNlcihldmVudCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCWNvbnN0IHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZmZfZWZmZWN0X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKLXsKLQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGVmZmVjdCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwotCiBzdGF0aWMgc3NpemVfdCBldmRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtNDkwLDE0ICszMDksMTQgQEAKIAogCXdoaWxlIChyZXR2YWwgPCBjb3VudCkgewogCi0JCWlmIChldmRldl9ldmVudF9mcm9tX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnQpKSB7CisJCWlmIChpbnB1dF9ldmVudF9mcm9tX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnQpKSB7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQlpbnB1dF9pbmplY3RfZXZlbnQoJmV2ZGV2LT5oYW5kbGUsCiAJCQkJICAgZXZlbnQudHlwZSwgZXZlbnQuY29kZSwgZXZlbnQudmFsdWUpOwotCQlyZXR2YWwgKz0gZXZkZXZfZXZlbnRfc2l6ZSgpOworCQlyZXR2YWwgKz0gaW5wdXRfZXZlbnRfc2l6ZSgpOwogCX0KIAogIG91dDoKQEAgLTUzMSw3ICszNTAsNyBAQAogCXN0cnVjdCBpbnB1dF9ldmVudCBldmVudDsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKGNvdW50IDwgZXZkZXZfZXZlbnRfc2l6ZSgpKQorCWlmIChjb3VudCA8IGlucHV0X2V2ZW50X3NpemUoKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY2xpZW50LT5oZWFkID09IGNsaWVudC0+dGFpbCAmJiBldmRldi0+ZXhpc3QgJiYKQEAgLTU0NiwxMyArMzY1LDEzIEBACiAJaWYgKCFldmRldi0+ZXhpc3QpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jd2hpbGUgKHJldHZhbCArIGV2ZGV2X2V2ZW50X3NpemUoKSA8PSBjb3VudCAmJgorCXdoaWxlIChyZXR2YWwgKyBpbnB1dF9ldmVudF9zaXplKCkgPD0gY291bnQgJiYKIAkgICAgICAgZXZkZXZfZmV0Y2hfbmV4dF9ldmVudChjbGllbnQsICZldmVudCkpIHsKIAotCQlpZiAoZXZkZXZfZXZlbnRfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZldmVudCkpCisJCWlmIChpbnB1dF9ldmVudF90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50KSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCXJldHZhbCArPSBldmRldl9ldmVudF9zaXplKCk7CisJCXJldHZhbCArPSBpbnB1dF9ldmVudF9zaXplKCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTgyMyw3ICs2NDIsNyBAQAogCiAJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NTRkYpKSB7CiAKLQkJCQlpZiAoZXZkZXZfZmZfZWZmZWN0X2Zyb21fdXNlcihwLCBfSU9DX1NJWkUoY21kKSwgJmVmZmVjdCkpCisJCQkJaWYgKGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIocCwgX0lPQ19TSVpFKGNtZCksICZlZmZlY3QpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCWVycm9yID0gaW5wdXRfZmZfdXBsb2FkKGRldiwgJmVmZmVjdCwgZmlsZSk7CkBAIC0xMDAwLDcgKzgxOSw3IEBACiAJZXZkZXYtPmhhbmRsZS5oYW5kbGVyID0gaGFuZGxlcjsKIAlldmRldi0+aGFuZGxlLnByaXZhdGUgPSBldmRldjsKIAotCXN0cmxjcHkoZXZkZXYtPmRldi5idXNfaWQsIGV2ZGV2LT5uYW1lLCBzaXplb2YoZXZkZXYtPmRldi5idXNfaWQpKTsKKwlkZXZfc2V0X25hbWUoJmV2ZGV2LT5kZXYsIGV2ZGV2LT5uYW1lKTsKIAlldmRldi0+ZGV2LmRldnQgPSBNS0RFVihJTlBVVF9NQUpPUiwgRVZERVZfTUlOT1JfQkFTRSArIG1pbm9yKTsKIAlldmRldi0+ZGV2LmNsYXNzID0gJmlucHV0X2NsYXNzOwogCWV2ZGV2LT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IDI4ODBlYWFlLi5lYmY0YmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCkBAIC01MzAsOCArNTMwLDcgQEAKIAogCW11dGV4X2luaXQoJmdhbWVwb3J0LT5kcnZfbXV0ZXgpOwogCWRldmljZV9pbml0aWFsaXplKCZnYW1lcG9ydC0+ZGV2KTsKLQlzbnByaW50ZihnYW1lcG9ydC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGdhbWVwb3J0LT5kZXYuYnVzX2lkKSwKLQkJICJnYW1lcG9ydCVsdSIsICh1bnNpZ25lZCBsb25nKWF0b21pY19pbmNfcmV0dXJuKCZnYW1lcG9ydF9ubykgLSAxKTsKKwlkZXZfc2V0X25hbWUoJmdhbWVwb3J0LT5kZXYsICJnYW1lcG9ydCVsdSIsICh1bnNpZ25lZCBsb25nKWF0b21pY19pbmNfcmV0dXJuKCZnYW1lcG9ydF9ubykgLSAxKTsKIAlnYW1lcG9ydC0+ZGV2LmJ1cyA9ICZnYW1lcG9ydF9idXM7CiAJZ2FtZXBvcnQtPmRldi5yZWxlYXNlID0gZ2FtZXBvcnRfcmVsZWFzZV9wb3J0OwogCWlmIChnYW1lcG9ydC0+cGFyZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCmluZGV4IDJiMjgyY2QuLmRiNTU2YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCW5zNTU4LT5nYW1lcG9ydCA9IHBvcnQ7CiAKIAlnYW1lcG9ydF9zZXRfbmFtZShwb3J0LCAiTlM1NTggUG5QIEdhbWVwb3J0Iik7Ci0JZ2FtZXBvcnRfc2V0X3BoeXMocG9ydCwgInBucCVzL2dhbWVwb3J0MCIsIGRldi0+ZGV2LmJ1c19pZCk7CisJZ2FtZXBvcnRfc2V0X3BoeXMocG9ydCwgInBucCVzL2dhbWVwb3J0MCIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCXBvcnQtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAJcG9ydC0+aW8gPSBpb3BvcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2NiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogMzJiaXQgY29tcGF0aWJpbGl0eSB3cmFwcGVycyBmb3IgdGhlIGlucHV0IHN1YnN5c3RlbS4KKyAqCisgKiBWZXJ5IGhlYXZpbHkgYmFzZWQgb24gZXZkZXYuYyAtIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJpbnB1dC1jb21wYXQuaCIKKworI2lmZGVmIENPTkZJR19DT01QQVQKKworaW50IGlucHV0X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbXBhdF9ldmVudCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlldmVudC0+dGltZS50dl9zZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl9zZWM7CisJCWV2ZW50LT50aW1lLnR2X3VzZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl91c2VjOworCQlldmVudC0+dHlwZSA9IGNvbXBhdF9ldmVudC50eXBlOworCQlldmVudC0+Y29kZSA9IGNvbXBhdF9ldmVudC5jb2RlOworCQlldmVudC0+dmFsdWUgPSBjb21wYXRfZXZlbnQudmFsdWU7CisKKwl9IGVsc2UgeworCQlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnB1dF9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCisJCQljb25zdCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKKworCQljb21wYXRfZXZlbnQudGltZS50dl9zZWMgPSBldmVudC0+dGltZS50dl9zZWM7CisJCWNvbXBhdF9ldmVudC50aW1lLnR2X3VzZWMgPSBldmVudC0+dGltZS50dl91c2VjOworCQljb21wYXRfZXZlbnQudHlwZSA9IGV2ZW50LT50eXBlOworCQljb21wYXRfZXZlbnQuY29kZSA9IGV2ZW50LT5jb2RlOworCQljb21wYXRfZXZlbnQudmFsdWUgPSBldmVudC0+dmFsdWU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsICZjb21wYXRfZXZlbnQsCisJCQkJIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCX0gZWxzZSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICAgICAgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqY29tcGF0X2VmZmVjdDsKKworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICogSXQgc28gaGFwcGVucyB0aGF0IHRoZSBwb2ludGVyIHdoaWNoIG5lZWRzIHRvIGJlIGNoYW5nZWQKKwkJICogaXMgdGhlIGxhc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSwgc28gd2UgY2FuIHJldHJpZXZlIHRoZQorCQkgKiB3aG9sZSB0aGluZyBhbmQgcmVwbGFjZSBqdXN0IHRoZSBwb2ludGVyLgorCQkgKi8KKwkJY29tcGF0X2VmZmVjdCA9IChzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqKWVmZmVjdDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoY29tcGF0X2VmZmVjdCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvbXBhdF9lZmZlY3QtPnR5cGUgPT0gRkZfUEVSSU9ESUMgJiYKKwkJICAgIGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMud2F2ZWZvcm0gPT0gRkZfQ1VTVE9NKQorCQkJZWZmZWN0LT51LnBlcmlvZGljLmN1c3RvbV9kYXRhID0KKwkJCQljb21wYXRfcHRyKGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMuY3VzdG9tX2RhdGEpOworCX0gZWxzZSB7CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorCitpbnQgaW5wdXRfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgaW5wdXRfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfZXZlbnRfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlucHV0X2V2ZW50X3RvX3VzZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfZmZfZWZmZWN0X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5oIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NkOWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9JTlBVVF9DT01QQVRfSAorI2RlZmluZSBfSU5QVVRfQ09NUEFUX0gKKworLyoKKyAqIDMyYml0IGNvbXBhdGliaWxpdHkgd3JhcHBlcnMgZm9yIHRoZSBpbnB1dCBzdWJzeXN0ZW0uCisgKgorICogVmVyeSBoZWF2aWx5IGJhc2VkIG9uIGV2ZGV2LmMgLSBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworLyogTm90ZSB0byB0aGUgYXV0aG9yIG9mIHRoaXMgY29kZTogZGlkIGl0IGV2ZXIgb2NjdXIgdG8KKyAgIHlvdSB3aHkgdGhlIGlmZGVmcyBhcmUgbmVlZGVkPyBUaGluayBhYm91dCBpdCBhZ2Fpbi4gLUFLICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIGlzX2NvbXBhdF90YXNrKCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0lBNjQpCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1MzOTApCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTKQorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpCisjZWxzZQorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKQorI2VuZGlmCisKK3N0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgeworCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOworCV9fdTE2IHR5cGU7CisJX191MTYgY29kZTsKKwlfX3MzMiB2YWx1ZTsKK307CisKK3N0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3RfY29tcGF0IHsKKwlfX3UxNiB3YXZlZm9ybTsKKwlfX3UxNiBwZXJpb2Q7CisJX19zMTYgbWFnbml0dWRlOworCV9fczE2IG9mZnNldDsKKwlfX3UxNiBwaGFzZTsKKworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKKworCV9fdTMyIGN1c3RvbV9sZW47CisJY29tcGF0X3VwdHJfdCBjdXN0b21fZGF0YTsKK307CisKK3N0cnVjdCBmZl9lZmZlY3RfY29tcGF0IHsKKwlfX3UxNiB0eXBlOworCV9fczE2IGlkOworCV9fdTE2IGRpcmVjdGlvbjsKKwlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOworCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OworCisJdW5pb24geworCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OworCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKKwkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdF9jb21wYXQgcGVyaW9kaWM7CisJCXN0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IGNvbmRpdGlvblsyXTsgLyogT25lIGZvciBlYWNoIGF4aXMgKi8KKwkJc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgcnVtYmxlOworCX0gdTsKK307CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGlucHV0X2V2ZW50X3NpemUodm9pZCkKK3sKKwlyZXR1cm4gSU5QVVRfQ09NUEFUX1RFU1QgPworCQlzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkgOiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzaXplX3QgaW5wdXRfZXZlbnRfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworaW50IGlucHV0X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpOworCitpbnQgaW5wdXRfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCk7CisKK2ludCBpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICAgICAgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KTsKKworI2VuZGlmIC8qIF9JTlBVVF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IGMxM2NlZDMuLjE3MzBkNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTEzODksOCArMTM4OSw4IEBACiAJaWYgKCFkZXYtPnNldGtleWNvZGUpCiAJCWRldi0+c2V0a2V5Y29kZSA9IGlucHV0X2RlZmF1bHRfc2V0a2V5Y29kZTsKIAotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksCi0JCSAiaW5wdXQlbGQiLCAodW5zaWduZWQgbG9uZykgYXRvbWljX2luY19yZXR1cm4oJmlucHV0X25vKSAtIDEpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJpbnB1dCVsZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGF0b21pY19pbmNfcmV0dXJuKCZpbnB1dF9ubykgLSAxKTsKIAogCWVycm9yID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCmluZGV4IGE4NWIxNDguLjZmMjM2NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwpAQCAtODAwLDcgKzgwMCw3IEBACiAJCX0KIAl9CiAKLQlzdHJsY3B5KGpveWRldi0+ZGV2LmJ1c19pZCwgam95ZGV2LT5uYW1lLCBzaXplb2Yoam95ZGV2LT5kZXYuYnVzX2lkKSk7CisJZGV2X3NldF9uYW1lKCZqb3lkZXYtPmRldiwgam95ZGV2LT5uYW1lKTsKIAlqb3lkZXYtPmRldi5kZXZ0ID0gTUtERVYoSU5QVVRfTUFKT1IsIEpPWURFVl9NSU5PUl9CQVNFICsgbWlub3IpOwogCWpveWRldi0+ZGV2LmNsYXNzID0gJmlucHV0X2NsYXNzOwogCWpveWRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZwppbmRleCBiZTVjMTRhLi5iMTE0MTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnCkBAIC0yOTQsNCArMjk0LDI4IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRUQgd2hpY2ggc3Vycm91bmRzIHRoZSBCaWcgWCBvbgogCSAgWEJveCAzNjAgY29udHJvbGxlci4KIAorY29uZmlnIEpPWVNUSUNLX1dBTEtFUkEwNzAxCisJdHJpc3RhdGUgIldhbGtlcmEgV0stMDcwMSBSQyB0cmFuc21pdHRlciIKKwlkZXBlbmRzIG9uIEhJR0hfUkVTX1RJTUVSUyAmJiBQQVJQT1JUCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSBoYXZlIGEgV2Fsa2VyYSBXSy0wNzAxIHRyYW5zbWl0dGVyIHdoaWNoIGlzCisJICBzdXBwbGllZCB3aXRoIGEgcmVhZHkgdG8gZmx5IFdhbGtlcmEgaGVsaWNvcHRlcnMgc3VjaCBhcyBITTM2LAorCSAgSE0zNywgSE02MCBhbmQgd2FudCB0byB1c2UgaXQgdmlhIHBhcnBvcnQgYXMgYSBqb3lzdGljay4gTW9yZQorCSAgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOiA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dD4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fsa2VyYTA3MDEuCisKK2NvbmZpZyBKT1lTVElDS19NQVBMRQorCXRyaXN0YXRlICJEcmVhbWNhc3QgY29udHJvbCBwYWQiCisJZGVwZW5kcyBvbiBNQVBMRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBTRUdBIERyZWFtY2FzdCBhbmQgd2FudCB0byB1c2UgeW91cgorCSAgY29udHJvbGxlciBhcyBhIGpveXN0aWNrLgorCisJICBNb3N0IERyZWFtY2FzdCB1c2VycyB3aWxsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgbWFwbGVjb250cm9sLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svTWFrZWZpbGUKaW5kZXggZmRiZjhjNC4uZjNhOGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSU5URVJBQ1QpCQkrPSBpbnRlcmFjdC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSk9ZRFVNUCkJCSs9IGpveWR1bXAubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX01BR0VMTEFOKQkJKz0gbWFnZWxsYW4ubworb2JqLSQoQ09ORklHX0pPWVNUSUNLX01BUExFKQkJKz0gbWFwbGVjb250cm9sLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19TSURFV0lOREVSKQkrPSBzaWRld2luZGVyLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19TUEFDRUJBTEwpCSs9IHNwYWNlYmFsbC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIpCQkrPSBzcGFjZW9yYi5vCkBAIC0yOSw0ICszMCw1IEBACiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfV0FSUklPUikJCSs9IHdhcnJpb3Iubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1hQQUQpCQkrPSB4cGFkLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19aSEVOSFVBKQkJKz0gemhlbmh1YS5vCitvYmotJChDT05GSUdfSk9ZU1RJQ0tfV0FMS0VSQTA3MDEpCSs9IHdhbGtlcmEwNzAxLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYXBsZWNvbnRyb2wuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFwbGVjb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwMDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFwbGVjb250cm9sLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKglTRUdBIERyZWFtY2FzdCBjb250cm9sbGVyIGRyaXZlcgorICoJQmFzZWQgb24gZHJpdmVycy91c2IvaWZvcmNlLmMKKyAqCisgKglDb3B5cmlnaHQgWWFlZ2FzaGkgVGFrZXNoaSwgMjAwMQorICoJQWRyaWFuIE1jTWVuYW1pbiwgMjAwOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXBsZS5oPgorCitNT0RVTEVfQVVUSE9SKCJBZHJpYW4gTWNNZW5hbWluIDxhZHJpYW5AbWNtZW4uZGVtb24uY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNFR0EgRHJlYW1jYXN0IGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBkY19wYWQgeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlzdHJ1Y3QgbWFwbGVfZGV2aWNlICptZGV2OworfTsKKworc3RhdGljIHZvaWQgZGNfcGFkX2NhbGxiYWNrKHN0cnVjdCBtYXBsZXEgKm1xKQoreworCXVuc2lnbmVkIHNob3J0IGJ1dHRvbnM7CisJc3RydWN0IG1hcGxlX2RldmljZSAqbWFwbGVkZXYgPSBtcS0+ZGV2OworCXN0cnVjdCBkY19wYWQgKnBhZCA9IG1hcGxlX2dldF9kcnZkYXRhKG1hcGxlZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwYWQtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpyZXMgPSBtcS0+cmVjdmJ1ZjsKKworCWJ1dHRvbnMgPSB+bGUxNl90b19jcHVwKChfX2xlMTYgKikocmVzICsgOCkpOworCisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWSwKKwkJKGJ1dHRvbnMgJiAweDAwMTAgPyAtMSA6IDApICsgKGJ1dHRvbnMgJiAweDAwMjAgPyAxIDogMCkpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFgsCisJCShidXR0b25zICYgMHgwMDQwID8gLTEgOiAwKSArIChidXR0b25zICYgMHgwMDgwID8gMSA6IDApKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDFZLAorCQkoYnV0dG9ucyAmIDB4MTAwMCA/IC0xIDogMCkgKyAoYnV0dG9ucyAmIDB4MjAwMCA/IDEgOiAwKSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQxWCwKKwkJKGJ1dHRvbnMgJiAweDQwMDAgPyAtMSA6IDApICsgKGJ1dHRvbnMgJiAweDgwMDAgPyAxIDogMCkpOworCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9DLCAgICAgIGJ1dHRvbnMgJiAweDAwMDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQiwgICAgICBidXR0b25zICYgMHgwMDAyKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0EsICAgICAgYnV0dG9ucyAmIDB4MDAwNCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVEFSVCwgIGJ1dHRvbnMgJiAweDAwMDgpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fWiwgICAgICBidXR0b25zICYgMHgwMTAwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1ksICAgICAgYnV0dG9ucyAmIDB4MDIwMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9YLCAgICAgIGJ1dHRvbnMgJiAweDA0MDApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0VMRUNULCBidXR0b25zICYgMHgwODAwKTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfR0FTLCAgICByZXNbMTBdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0JSQUtFLCAgcmVzWzExXSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAgICAgIHJlc1sxMl0pOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgICAgICByZXNbMTNdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLCAgICAgcmVzWzE0XSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwgICAgIHJlc1sxNV0pOworfQorCitzdGF0aWMgaW50IGRjX3BhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWFwbGVfZ2V0Y29uZF9jYWxsYmFjayhwYWQtPm1kZXYsIGRjX3BhZF9jYWxsYmFjaywgSFovMjAsCisJCU1BUExFX0ZVTkNfQ09OVFJPTExFUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGNfcGFkX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWFwbGVfZ2V0Y29uZF9jYWxsYmFjayhwYWQtPm1kZXYsIGRjX3BhZF9jYWxsYmFjaywgMCwKKwkJTUFQTEVfRlVOQ19DT05UUk9MTEVSKTsKK30KKworLyogYWxsb3cgdGhlIGNvbnRyb2xsZXIgdG8gYmUgdXNlZCAqLworc3RhdGljIGludCBfX2RldmluaXQgcHJvYmVfbWFwbGVfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGNvbnN0IHNob3J0IGJ0bl9iaXRbMzJdID0geworCQlCVE5fQywgQlROX0IsIEJUTl9BLCBCVE5fU1RBUlQsIC0xLCAtMSwgLTEsIC0xLAorCQlCVE5fWiwgQlROX1ksIEJUTl9YLCBCVE5fU0VMRUNULCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJfTsKKworCXN0YXRpYyBjb25zdCBzaG9ydCBhYnNfYml0WzMyXSA9IHsKKwkJLTEsIC0xLCAtMSwgLTEsIEFCU19IQVQwWSwgQUJTX0hBVDBZLCBBQlNfSEFUMFgsIEFCU19IQVQwWCwKKwkJLTEsIC0xLCAtMSwgLTEsIEFCU19IQVQxWSwgQUJTX0hBVDFZLCBBQlNfSEFUMVgsIEFCU19IQVQxWCwKKwkJQUJTX0dBUywgQUJTX0JSQUtFLCBBQlNfWCwgQUJTX1ksIEFCU19SWCwgQUJTX1JZLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwl9OworCisJc3RydWN0IG1hcGxlX2RldmljZSAqbWRldiA9IHRvX21hcGxlX2RldihkZXYpOworCXN0cnVjdCBtYXBsZV9kcml2ZXIgKm1kcnYgPSB0b19tYXBsZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCBpLCBlcnJvcjsKKwlzdHJ1Y3QgZGNfcGFkICpwYWQ7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGRhdGEgPSBiZTMyX3RvX2NwdShtZGV2LT5kZXZpbmZvLmZ1bmN0aW9uX2RhdGFbMF0pOworCisJcGFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjX3BhZCksIEdGUF9LRVJORUwpOworCWlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXBhZCB8fCAhaWRldikgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwYWQtPmRldiA9IGlkZXY7CisJcGFkLT5tZGV2ID0gbWRldjsKKworCWlkZXYtPm9wZW4gPSBkY19wYWRfb3BlbjsKKwlpZGV2LT5jbG9zZSA9IGRjX3BhZF9jbG9zZTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChkYXRhICYgKDEgPDwgaSkpIHsKKwkJCWlmIChidG5fYml0W2ldID49IDApCisJCQkJX19zZXRfYml0KGJ0bl9iaXRbaV0sIGlkZXYtPmtleWJpdCk7CisJCQllbHNlIGlmIChhYnNfYml0W2ldID49IDApCisJCQkJX19zZXRfYml0KGFic19iaXRbaV0sIGlkZXYtPmFic2JpdCk7CisJCX0KKwl9CisKKwlpZiAoaWRldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9KT1lTVElDSyldKQorCQlpZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9LRVkpOworCisJaWYgKGlkZXYtPmFic2JpdFswXSkKKwkJaWRldi0+ZXZiaXRbMF0gfD0gQklUX01BU0soRVZfQUJTKTsKKworCWZvciAoaSA9IEFCU19YOyBpIDw9IEFCU19CUkFLRTsgaSsrKQorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBpLCAwLCAyNTUsIDAsIDApOworCisJZm9yIChpID0gQUJTX0hBVDBYOyBpIDw9IEFCU19IQVQzWTsgaSsrKQorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBpLCAxLCAtMSwgMCwgMCk7CisKKwlpZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBhZDsKKwlpZGV2LT5kZXYucGFyZW50ID0gJm1kZXYtPmRldjsKKwlpZGV2LT5uYW1lID0gbWRldi0+cHJvZHVjdF9uYW1lOworCWlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBwYWQpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaWRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwltZGV2LT5kcml2ZXIgPSBtZHJ2OworCW1hcGxlX3NldF9kcnZkYXRhKG1kZXYsIHBhZCk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwlrZnJlZShwYWQpOworCW1hcGxlX3NldF9kcnZkYXRhKG1kZXYsIE5VTEwpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcmVtb3ZlX21hcGxlX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtYXBsZV9kZXZpY2UgKm1kZXYgPSB0b19tYXBsZV9kZXYoZGV2KTsKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBtYXBsZV9nZXRfZHJ2ZGF0YShtZGV2KTsKKworCW1kZXYtPmNhbGxiYWNrID0gTlVMTDsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwYWQtPmRldik7CisJbWFwbGVfc2V0X2RydmRhdGEobWRldiwgTlVMTCk7CisJa2ZyZWUocGFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hcGxlX2RyaXZlciBkY19wYWRfZHJpdmVyID0geworCS5mdW5jdGlvbiA9CU1BUExFX0ZVTkNfQ09OVFJPTExFUiwKKwkuZHJ2ID0geworCQkubmFtZQk9ICJEcmVhbWNhc3RfY29udHJvbGxlciIsCisJCS5wcm9iZQk9IHByb2JlX21hcGxlX2NvbnRyb2xsZXIsCisJCS5yZW1vdmUJPSBfX2RldmV4aXRfcChyZW1vdmVfbWFwbGVfY29udHJvbGxlciksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRjX3BhZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1hcGxlX2RyaXZlcl9yZWdpc3RlcigmZGNfcGFkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkY19wYWRfZXhpdCh2b2lkKQoreworCW1hcGxlX2RyaXZlcl91bnJlZ2lzdGVyKCZkY19wYWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGNfcGFkX2luaXQpOworbW9kdWxlX2V4aXQoZGNfcGFkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YWxrZXJhMDcwMS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YWxrZXJhMDcwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmExZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhbGtlcmEwNzAxLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgUGFyYWxsZWwgcG9ydCB0byBXYWxrZXJhIFdLLTA3MDEgVFggam95c3RpY2sKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IFBldGVyIFBvcG92ZWMKKyAqCisgKiAgTW9yZSBhYm91dCBkcml2ZXI6ICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dD4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qICNkZWZpbmUgV0swNzAxX0RFQlVHICovCisKKyNkZWZpbmUgUkVTRVJWRSAyMDAwMAorI2RlZmluZSBTWU5DX1BVTFNFIDEzMDYwMDAKKyNkZWZpbmUgQklOMF9QVUxTRSAyODgwMDAKKyNkZWZpbmUgQklOMV9QVUxTRSA0MzgwMDAKKworI2RlZmluZSBBTkFMT0dfTUlOX1BVTFNFIDMxODAwMAorI2RlZmluZSBBTkFMT0dfTUFYX1BVTFNFIDg3ODAwMAorI2RlZmluZSBBTkFMT0dfREVMVEEgODAwMDAKKworI2RlZmluZSBCSU5fU0FNUExFICgoQklOMF9QVUxTRSArIEJJTjFfUFVMU0UpIC8gMikKKworI2RlZmluZSBOT19TWU5DIDI1CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIFBvcG92ZWMgPHBvcG92ZWNAZmVpLnR1a2Uuc2s+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldhbGtlcmEgV0stMDcwMSBUWCBhcyBqb3lzdGljayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHdhbGtlcmEwNzAxX3BwX25vOworbW9kdWxlX3BhcmFtX25hbWVkKHBvcnQsIHdhbGtlcmEwNzAxX3BwX25vLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0LAorCQkgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciBmb3IgV2Fsa2VyYSBXSy0wNzAxIFRYIChkZWZhdWx0IGlzIDApIik7CisKKy8qCisgKiBGb3Igbm93LCBvbmx5IG9uZSBkZXZpY2UgaXMgc3VwcG9ydGVkLCBpZiBzb21lYm9keSBuZWVkIG1vcmUgZGV2aWNlcywgY29kZQorICogY2FuIGJlIGV4cGFuZGVkLCBvbmUgc3RydWN0IHdhbGtlcmFfZGV2IHBlciBkZXZpY2UgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kCisgKiBzZXQgdXAgYnkgd2Fsa2VyYTA3MDFfY29ubmVjdCAocmVsZWFzZSBvZiBkZXZpY2UgYnkgd2Fsa2VyYTA3MDFfZGlzY29ubmVjdCkKKyAqLworCitzdHJ1Y3Qgd2Fsa2VyYV9kZXYgeworCXVuc2lnbmVkIGNoYXIgYnVmWzI1XTsKKwl1NjQgaXJxX3RpbWUsIGlycV9sYXN0dGltZTsKKwlpbnQgY291bnRlcjsKKwlpbnQgYWNrOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCisJc3RydWN0IHBhcnBvcnQgKnBhcnBvcnQ7CisJc3RydWN0IHBhcmRldmljZSAqcGFyZGV2aWNlOworfTsKKworc3RhdGljIHN0cnVjdCB3YWxrZXJhX2RldiB3X2RldjsKKworc3RhdGljIGlubGluZSB2b2lkIHdhbGtlcmEwNzAxX3BhcnNlX2ZyYW1lKHN0cnVjdCB3YWxrZXJhX2RldiAqdykKK3sKKwlpbnQgaTsKKwlpbnQgdmFsMSwgdmFsMiwgdmFsMywgdmFsNCwgdmFsNSwgdmFsNiwgdmFsNywgdmFsODsKKwlpbnQgY3JjMSwgY3JjMjsKKworCWZvciAoY3JjMSA9IGNyYzIgPSBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJY3JjMSArPSB3LT5idWZbaV0gJiA3OworCQljcmMyICs9ICh3LT5idWZbaV0gJiA4KSA+PiAzOworCX0KKwlpZiAoKHctPmJ1ZlsxMF0gJiA3KSAhPSAoY3JjMSAmIDcpKQorCQlyZXR1cm47CisJaWYgKCgody0+YnVmWzEwXSAmIDgpID4+IDMpICE9ICgoKGNyYzEgPj4gMykgKyBjcmMyKSAmIDEpKQorCQlyZXR1cm47CisJZm9yIChjcmMxID0gY3JjMiA9IDAsIGkgPSAxMTsgaSA8IDIzOyBpKyspIHsKKwkJY3JjMSArPSB3LT5idWZbaV0gJiA3OworCQljcmMyICs9ICh3LT5idWZbaV0gJiA4KSA+PiAzOworCX0KKwlpZiAoKHctPmJ1ZlsyM10gJiA3KSAhPSAoY3JjMSAmIDcpKQorCQlyZXR1cm47CisJaWYgKCgody0+YnVmWzIzXSAmIDgpID4+IDMpICE9ICgoKGNyYzEgPj4gMykgKyBjcmMyKSAmIDEpKQorCQlyZXR1cm47CisJdmFsMSA9ICgody0+YnVmWzBdICYgNykgKiAyNTYgKyB3LT5idWZbMV0gKiAxNiArIHctPmJ1ZlsyXSkgPj4gMjsKKwl2YWwxICo9ICgody0+YnVmWzBdID4+IDIpICYgMikgLSAxOwkvKiBzaWduICovCisJdmFsMiA9ICh3LT5idWZbMl0gJiAxKSA8PCA4IHwgKHctPmJ1ZlszXSA8PCA0KSB8IHctPmJ1Zls0XTsKKwl2YWwyICo9ICh3LT5idWZbMl0gJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWwzID0gKCh3LT5idWZbNV0gJiA3KSAqIDI1NiArIHctPmJ1Zls2XSAqIDE2ICsgdy0+YnVmWzddKSA+PiAyOworCXZhbDMgKj0gKCh3LT5idWZbNV0gPj4gMikgJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw0ID0gKHctPmJ1Zls3XSAmIDEpIDw8IDggfCAody0+YnVmWzhdIDw8IDQpIHwgdy0+YnVmWzldOworCXZhbDQgKj0gKHctPmJ1Zls3XSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDUgPSAoKHctPmJ1ZlsxMV0gJiA3KSAqIDI1NiArIHctPmJ1ZlsxMl0gKiAxNiArIHctPmJ1ZlsxM10pID4+IDI7CisJdmFsNSAqPSAoKHctPmJ1ZlsxMV0gPj4gMikgJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw2ID0gKHctPmJ1ZlsxM10gJiAxKSA8PCA4IHwgKHctPmJ1ZlsxNF0gPDwgNCkgfCB3LT5idWZbMTVdOworCXZhbDYgKj0gKHctPmJ1ZlsxM10gJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw3ID0gKCh3LT5idWZbMTZdICYgNykgKiAyNTYgKyB3LT5idWZbMTddICogMTYgKyB3LT5idWZbMThdKSA+PiAyOworCXZhbDcgKj0gKCh3LT5idWZbMTZdID4+IDIpICYgMikgLSAxOwkvKnNpZ24gKi8KKwl2YWw4ID0gKHctPmJ1ZlsxOF0gJiAxKSA8PCA4IHwgKHctPmJ1ZlsxOV0gPDwgNCkgfCB3LT5idWZbMjBdOworCXZhbDggKj0gKHctPmJ1ZlsxOF0gJiAyKSAtIDE7CS8qc2lnbiAqLworCisjaWZkZWYgV0swNzAxX0RFQlVHCisJeworCQlpbnQgbWFnaWMsIG1hZ2ljX2JpdDsKKwkJbWFnaWMgPSAody0+YnVmWzIxXSA8PCA0KSB8IHctPmJ1ZlsyMl07CisJCW1hZ2ljX2JpdCA9ICh3LT5idWZbMjRdICYgOCkgPj4gMzsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJ3YWxrZXJhMDcwMTogJTRkICU0ZCAlNGQgJTRkICAlNGQgJTRkICU0ZCAlNGQgKG1hZ2ljICUyeCAlZClcbiIsCisJCSAgICAgICB2YWwxLCB2YWwyLCB2YWwzLCB2YWw0LCB2YWw1LCB2YWw2LCB2YWw3LCB2YWw4LCBtYWdpYywKKwkJICAgICAgIG1hZ2ljX2JpdCk7CisJfQorI2VuZGlmCisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19YLCB2YWwyKTsKKwlpbnB1dF9yZXBvcnRfYWJzKHctPmlucHV0X2RldiwgQUJTX1ksIHZhbDEpOworCWlucHV0X3JlcG9ydF9hYnMody0+aW5wdXRfZGV2LCBBQlNfWiwgdmFsNik7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19USFJPVFRMRSwgdmFsMyk7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19SVURERVIsIHZhbDQpOworCWlucHV0X3JlcG9ydF9hYnMody0+aW5wdXRfZGV2LCBBQlNfTUlTQywgdmFsNyk7CisJaW5wdXRfcmVwb3J0X2tleSh3LT5pbnB1dF9kZXYsIEJUTl9HRUFSX0RPV04sIHZhbDUgPiAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9hY2soc3RydWN0IHBhcmRldmljZSAqcCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWFkX3N0YXR1cyhwLT5wb3J0KSAmIDB4NDA7Cit9CisKKy8qIGZhbGxpbmcgZWRnZSwgcHJlcGFyZSB0byBCSU4gdmFsdWUgY2FsY3VsYXRpb24gKi8KK3N0YXRpYyB2b2lkIHdhbGtlcmEwNzAxX2lycV9oYW5kbGVyKHZvaWQgKmhhbmRsZXJfZGF0YSkKK3sKKwl1NjQgcHVsc2VfdGltZTsKKwlzdHJ1Y3Qgd2Fsa2VyYV9kZXYgKncgPSBoYW5kbGVyX2RhdGE7CisKKwl3LT5pcnFfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlwdWxzZV90aW1lID0gdy0+aXJxX3RpbWUgLSB3LT5pcnFfbGFzdHRpbWU7CisJdy0+aXJxX2xhc3R0aW1lID0gdy0+aXJxX3RpbWU7CisKKwkvKiBjYW5jZWwgdGltZXIsIGlmIGluIGhhbmRsZXIgb3IgYWN0aXZlIGRvIHJlc3luYyAqLworCWlmICh1bmxpa2VseSgwICE9IGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdy0+dGltZXIpKSkgeworCQl3LT5jb3VudGVyID0gTk9fU1lOQzsKKwkJcmV0dXJuOworCX0KKworCWlmICh3LT5jb3VudGVyIDwgTk9fU1lOQykgeworCQlpZiAody0+YWNrKSB7CisJCQlwdWxzZV90aW1lIC09IEJJTjFfUFVMU0U7CisJCQl3LT5idWZbdy0+Y291bnRlcl0gPSA4OworCQl9IGVsc2UgeworCQkJcHVsc2VfdGltZSAtPSBCSU4wX1BVTFNFOworCQkJdy0+YnVmW3ctPmNvdW50ZXJdID0gMDsKKwkJfQorCQlpZiAody0+Y291bnRlciA9PSAyNCkgewkvKiBmdWxsIGZyYW1lICovCisJCQl3YWxrZXJhMDcwMV9wYXJzZV9mcmFtZSh3KTsKKwkJCXctPmNvdW50ZXIgPSBOT19TWU5DOworCQkJaWYgKGFicyhwdWxzZV90aW1lIC0gU1lOQ19QVUxTRSkgPCBSRVNFUlZFKQkvKiBuZXcgZnJhbWUgc3luYyAqLworCQkJCXctPmNvdW50ZXIgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKChwdWxzZV90aW1lID4gKEFOQUxPR19NSU5fUFVMU0UgLSBSRVNFUlZFKQorCQkJICAgICAmJiAocHVsc2VfdGltZSA8IChBTkFMT0dfTUFYX1BVTFNFICsgUkVTRVJWRSkpKSkgeworCQkJCXB1bHNlX3RpbWUgLT0gKEFOQUxPR19NSU5fUFVMU0UgLSBSRVNFUlZFKTsKKwkJCQlwdWxzZV90aW1lID0gKHUzMikgcHVsc2VfdGltZSAvIEFOQUxPR19ERUxUQTsJLyogb3ZlcnRpcGluZyBpcyBzYWZlLCBwdWxzZXRpbWUgPCBzMzIuLiAqLworCQkJCXctPmJ1Zlt3LT5jb3VudGVyKytdIHw9IChwdWxzZV90aW1lICYgNyk7CisJCQl9IGVsc2UKKwkJCQl3LT5jb3VudGVyID0gTk9fU1lOQzsKKwkJfQorCX0gZWxzZSBpZiAoYWJzKHB1bHNlX3RpbWUgLSBTWU5DX1BVTFNFIC0gQklOMF9QVUxTRSkgPAorCQkJCVJFU0VSVkUgKyBCSU4xX1BVTFNFIC0gQklOMF9QVUxTRSkJLyogZnJhbWUgc3luYyAuLiAqLworCQl3LT5jb3VudGVyID0gMDsKKworCWhydGltZXJfc3RhcnQoJnctPnRpbWVyLCBrdGltZV9zZXQoMCwgQklOX1NBTVBMRSksIEhSVElNRVJfTU9ERV9SRUwpOworfQorCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgdGltZXJfaGFuZGxlcihzdHJ1Y3QgaHJ0aW1lcgorCQkJCQkgICpoYW5kbGUpCit7CisJc3RydWN0IHdhbGtlcmFfZGV2ICp3OworCisJdyA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCB3YWxrZXJhX2RldiwgdGltZXIpOworCXctPmFjayA9IHJlYWRfYWNrKHctPnBhcmRldmljZSk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBpbnQgd2Fsa2VyYTA3MDFfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHdhbGtlcmFfZGV2ICp3ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBhcnBvcnRfZW5hYmxlX2lycSh3LT5wYXJwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Fsa2VyYTA3MDFfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB3YWxrZXJhX2RldiAqdyA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlwYXJwb3J0X2Rpc2FibGVfaXJxKHctPnBhcnBvcnQpOworfQorCitzdGF0aWMgaW50IHdhbGtlcmEwNzAxX2Nvbm5lY3Qoc3RydWN0IHdhbGtlcmFfZGV2ICp3LCBpbnQgcGFycG9ydCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCXctPnBhcnBvcnQgPSBwYXJwb3J0X2ZpbmRfbnVtYmVyKHBhcnBvcnQpOworCWlmICh3LT5wYXJwb3J0ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHctPnBhcnBvcnQtPmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIndhbGtlcmEwNzAxOiBwYXJwb3J0IHdpdGhvdXQgaW50ZXJydXB0XG4iKTsKKwkJZ290byBpbml0X2VycjsKKwl9CisKKwllcnIgPSAtRUJVU1k7CisJdy0+cGFyZGV2aWNlID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2Uody0+cGFycG9ydCwgIndhbGtlcmEwNzAxIiwKKwkJCQkgICAgTlVMTCwgTlVMTCwgd2Fsa2VyYTA3MDFfaXJxX2hhbmRsZXIsCisJCQkJICAgIFBBUlBPUlRfREVWX0VYQ0wsIHcpOworCWlmICghdy0+cGFyZGV2aWNlKQorCQlnb3RvIGluaXRfZXJyOworCisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlKHctPnBhcmRldmljZS0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpKQorCQlnb3RvIGluaXRfZXJyMTsKKworCWlmIChwYXJwb3J0X2NsYWltKHctPnBhcmRldmljZSkpCisJCWdvdG8gaW5pdF9lcnIxOworCisJdy0+aW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF3LT5pbnB1dF9kZXYpCisJCWdvdG8gaW5pdF9lcnIyOworCisJaW5wdXRfc2V0X2RydmRhdGEody0+aW5wdXRfZGV2LCB3KTsKKwl3LT5pbnB1dF9kZXYtPm5hbWUgPSAiV2Fsa2VyYSBXSy0wNzAxIFRYIjsKKwl3LT5pbnB1dF9kZXYtPnBoeXMgPSB3LT5wYXJwb3J0LT5uYW1lOworCXctPmlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQVJQT1JUOworCisJLyogVE9ETyB3aGF0IGlkIHZlbmRvci9wcm9kdWN0L3ZlcnNpb24gPyAqLworCXctPmlucHV0X2Rldi0+aWQudmVuZG9yID0gMHgwMDAxOworCXctPmlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwl3LT5pbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAxMDA7CisJdy0+aW5wdXRfZGV2LT5vcGVuID0gd2Fsa2VyYTA3MDFfb3BlbjsKKwl3LT5pbnB1dF9kZXYtPmNsb3NlID0gd2Fsa2VyYTA3MDFfY2xvc2U7CisKKwl3LT5pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0FCUykgfCBCSVRfTUFTSyhFVl9LRVkpOworCXctPmlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9HRUFSX0RPV04pXSA9IEJJVF9NQVNLKEJUTl9HRUFSX0RPV04pOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfWCwgLTUxMiwgNTEyLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3LT5pbnB1dF9kZXYsIEFCU19ZLCAtNTEyLCA1MTIsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHctPmlucHV0X2RldiwgQUJTX1osIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfVEhST1RUTEUsIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfUlVEREVSLCAtNTEyLCA1MTIsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHctPmlucHV0X2RldiwgQUJTX01JU0MsIC01MTIsIDUxMiwgMCwgMCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uody0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGluaXRfZXJyMzsKKworCWhydGltZXJfaW5pdCgmdy0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJdy0+dGltZXIuZnVuY3Rpb24gPSB0aW1lcl9oYW5kbGVyOworCXJldHVybiAwOworCisgaW5pdF9lcnIzOgorCWlucHV0X2ZyZWVfZGV2aWNlKHctPmlucHV0X2Rldik7CisgaW5pdF9lcnIyOgorCXBhcnBvcnRfcmVsZWFzZSh3LT5wYXJkZXZpY2UpOworIGluaXRfZXJyMToKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHctPnBhcmRldmljZSk7CisgaW5pdF9lcnI6CisJcGFycG9ydF9wdXRfcG9ydCh3LT5wYXJwb3J0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3YWxrZXJhMDcwMV9kaXNjb25uZWN0KHN0cnVjdCB3YWxrZXJhX2RldiAqdykKK3sKKwlocnRpbWVyX2NhbmNlbCgmdy0+dGltZXIpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHctPmlucHV0X2Rldik7CisJcGFycG9ydF9yZWxlYXNlKHctPnBhcmRldmljZSk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZSh3LT5wYXJkZXZpY2UpOworCXBhcnBvcnRfcHV0X3BvcnQody0+cGFycG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHdhbGtlcmEwNzAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gd2Fsa2VyYTA3MDFfY29ubmVjdCgmd19kZXYsIHdhbGtlcmEwNzAxX3BwX25vKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhbGtlcmEwNzAxX2V4aXQodm9pZCkKK3sKKwl3YWxrZXJhMDcwMV9kaXNjb25uZWN0KCZ3X2Rldik7Cit9CisKK21vZHVsZV9pbml0KHdhbGtlcmEwNzAxX2luaXQpOworbW9kdWxlX2V4aXQod2Fsa2VyYTA3MDFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggZWZkNzBhOS4uMzU1NjE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMjY4LDYgKzI2OCwxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHhhMjd4X2tleXBhZC4KIAorY29uZmlnIEtFWUJPQVJEX1BYQTkzMF9ST1RBUlkKKwl0cmlzdGF0ZSAiUFhBOTMwL1BYQTkzNSBFbmhhbmNlZCBSb3RhcnkgQ29udHJvbGxlciBTdXBwb3J0IgorCWRlcGVuZHMgb24gQ1BVX1BYQTkzMCB8fCBDUFVfUFhBOTM1CisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBYQTkzMC9QWEE5MzUgRW5oYW5jZWQgUm90YXJ5IENvbnRyb2xsZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHB4YTkzMF9yb3RhcnkuCisKIGNvbmZpZyBLRVlCT0FSRF9BQUVEMjAwMAogCXRyaXN0YXRlICJBQUVELTIwMDAga2V5Ym9hcmQiCiAJZGVwZW5kcyBvbiBNQUNIX0FBRUQyMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCAwZWRjOGYyLi4zNjM1MWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9ISUxfT0xEKQkJKz0gaGlsa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9PTUFQKQkJKz0gb21hcC1rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkJCSs9IHB4YTI3eF9rZXlwYWQubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTkzMF9ST1RBUlkpCSs9IHB4YTkzMF9yb3Rhcnkubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FBRUQyMDAwKQkJKz0gYWFlZDIwMDBfa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9HUElPKQkJKz0gZ3Bpb19rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9IUDZYWCkJCSs9IGpvcm5hZGE2ODBfa2JkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwppbmRleCAzNzliN2ZmLi5mNmU5ZjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCkBAIC04ODQsNiArODg0LDM5IEBACiB9CiAKIC8qCisgKiBQZXJmb3JtIGZpeHVwIGZvciBIUCBQYXZpbGlvbiBaVjYxMDAgbGFwdG9wIHRoYXQgZG9lc24ndCBnZW5lcmF0ZSByZWxlYXNlCisgKiBmb3IgaXRzIHZvbHVtZSBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIGF0a2JkX2hwX3p2NjEwMF9rZXltYXBfZml4dXAoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCQkweGFlLCAweGIwLAorCX07CisJaW50IGk7CisKKwlpZiAoYXRrYmQtPnNldCA9PSAyKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZWRfcmVsZWFzZV9rZXlzKTsgaSsrKQorCQkJX19zZXRfYml0KGZvcmNlZF9yZWxlYXNlX2tleXNbaV0sCisJCQkJCWF0a2JkLT5mb3JjZV9yZWxlYXNlX21hc2spOworfQorCisvKgorICogU2Ftc3VuZyBOQzEwIHdpdGggRm4rRj8ga2V5IHJlbGVhc2Ugbm90IHdvcmtpbmcKKyAqLworc3RhdGljIHZvaWQgYXRrYmRfc2Ftc3VuZ19rZXltYXBfZml4dXAoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCQkweDgyLCAweDgzLCAweDg0LCAweDg2LCAweDg4LCAweDg5LCAweGIzLCAweGY3LCAweGY5LAorCX07CisJaW50IGk7CisKKwlpZiAoYXRrYmQtPnNldCA9PSAyKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZWRfcmVsZWFzZV9rZXlzKTsgaSsrKQorCQkJX19zZXRfYml0KGZvcmNlZF9yZWxlYXNlX2tleXNbaV0sCisJCQkJICBhdGtiZC0+Zm9yY2VfcmVsZWFzZV9tYXNrKTsKK30KKworLyoKICAqIGF0a2JkX3NldF9rZXljb2RlX3RhYmxlKCkgaW5pdGlhbGl6ZXMga2V5Ym9hcmQncyBrZXljb2RlIHRhYmxlCiAgKiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHNjYW5jb2RlIHNldAogICovCkBAIC0xNDc2LDYgKzE1MDksMTUgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfZGVsbF9sYXB0b3Bfa2V5bWFwX2ZpeHVwLAogCX0sCiAJeworCQkuaWRlbnQgPSAiRGVsbCBMYXB0b3AiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLCAvKiBQb3J0YWJsZSAqLworCQl9LAorCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKKwkJLmRyaXZlcl9kYXRhID0gYXRrYmRfZGVsbF9sYXB0b3Bfa2V5bWFwX2ZpeHVwLAorCX0sCisJewogCQkuaWRlbnQgPSAiSFAgMjEzMyIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCkBAIC0xNDg1LDYgKzE1MjcsMTUgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfaHBfa2V5bWFwX2ZpeHVwLAogCX0sCiAJeworCQkuaWRlbnQgPSAiSFAgUGF2aWxpb24gWlY2MTAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUGF2aWxpb24gWlY2MTAwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF96djYxMDBfa2V5bWFwX2ZpeHVwLAorCX0sCisJewogCQkuaWRlbnQgPSAiSW52ZW50ZWMgU3ltcGhvbnkiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIklOVkVOVEVDIiksCkBAIC0xNDkzLDYgKzE1NDQsMTUgQEAKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZml4dXAsCiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2ludmVudGVjX2tleW1hcF9maXh1cCwKIAl9LAorCXsKKwkJLmlkZW50ID0gIlNhbXN1bmcgTkMxMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTkMxMCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKKwkJLmRyaXZlcl9kYXRhID0gYXRrYmRfc2Ftc3VuZ19rZXltYXBfZml4dXAsCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCmluZGV4IDA1ZjNmNDMuLmFkNjdkNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwpAQCAtOTgsNiArOTgsMTAgQEAKIAlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDAwMTsKIAlpbnB1dC0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAorCS8qIEVuYWJsZSBhdXRvIHJlcGVhdCBmZWF0dXJlIG9mIExpbnV4IGlucHV0IHN1YnN5c3RlbSAqLworCWlmIChwZGF0YS0+cmVwKQorCQlfX3NldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCiAJZGRhdGEtPmlucHV0ID0gaW5wdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5idXR0b25zOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsX2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKaW5kZXggNzFjMTk3MS4uNmYzNTY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkJyaWFuIFMuIEp1bGluIDxicmlAY2FseXguY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEhJTF9HRU5FUklDX05BTUUgIiBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBUygic2VyaW86dHkwM3ByMjVpZDAwZXgqIik7CiAKICNkZWZpbmUgSElMX0tCRF9NQVhfTEVOR1RIIDE2CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwppbmRleCBkYjIyZmQ5Li4zZjNkMTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCkBAIC0xMjIsMTQgKzEyMiwxMCBAQAogCiAJLyogcmVhZCB0aGUga2V5cGFkIHN0YXR1cyAqLwogCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfa3AtPnJvd3M7IGkrKykKLQkJCWRpc2FibGVfaXJxKE9NQVBfR1BJT19JUlEocm93X2dwaW9zW2ldKSk7Ci0KIAkJLyogcmVhZCB0aGUga2V5cGFkIHN0YXR1cyAqLwogCQlmb3IgKGNvbCA9IDA7IGNvbCA8IG9tYXBfa3AtPmNvbHM7IGNvbCsrKSB7CiAJCQlzZXRfY29sX2dwaW9fdmFsKG9tYXBfa3AsIH4oMSA8PCBjb2wpKTsKLQkJCXN0YXRlW2NvbF0gPSB+KGdldF9yb3dfZ3Bpb192YWwob21hcF9rcCkpICYgMHgzZjsKKwkJCXN0YXRlW2NvbF0gPSB+KGdldF9yb3dfZ3Bpb192YWwob21hcF9rcCkpICYgMHhmZjsKIAkJfQogCQlzZXRfY29sX2dwaW9fdmFsKG9tYXBfa3AsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTkzMF9yb3RhcnkuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmJiYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBlbmhhbmNlZCByb3RhcnkgY29udHJvbGxlciBvbiBweGE5MzAgYW5kIHB4YTkzNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YTkzMF9yb3RhcnkuaD4KKworI2RlZmluZSBTQkNSCSgweDA0KQorI2RlZmluZSBFUkNSCSgweDBjKQorCisjZGVmaW5lIFNCQ1JfRVJTQgkoMSA8PCA1KQorCitzdHJ1Y3QgcHhhOTMwX3JvdGFyeSB7CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXRfZGV2OworCXZvaWQgX19pb21lbQkJKm1taW9fYmFzZTsKKwlpbnQJCQlsYXN0X2VyY3I7CisKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKK307CisKK3N0YXRpYyB2b2lkIGNsZWFyX3NiY3Ioc3RydWN0IHB4YTkzMF9yb3RhcnkgKnIpCit7CisJdWludDMyX3Qgc2JjciA9IF9fcmF3X3JlYWRsKHItPm1taW9fYmFzZSArIFNCQ1IpOworCisJX19yYXdfd3JpdGVsKHNiY3IgfCBTQkNSX0VSU0IsIHItPm1taW9fYmFzZSArIFNCQ1IpOworCV9fcmF3X3dyaXRlbChzYmNyICYgflNCQ1JfRVJTQiwgci0+bW1pb19iYXNlICsgU0JDUik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByb3RhcnlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqciA9IGRldl9pZDsKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHItPnBkYXRhOworCWludCBlcmNyLCBkZWx0YSwga2V5OworCisJZXJjciA9IF9fcmF3X3JlYWRsKHItPm1taW9fYmFzZSArIEVSQ1IpICYgMHhmOworCWNsZWFyX3NiY3Iocik7CisKKwlkZWx0YSA9IGVyY3IgLSByLT5sYXN0X2VyY3I7CisJaWYgKGRlbHRhID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXItPmxhc3RfZXJjciA9IGVyY3I7CisKKwlpZiAocGRhdGEtPnVwX2tleSAmJiBwZGF0YS0+ZG93bl9rZXkpIHsKKwkJa2V5ID0gKGRlbHRhID4gMCkgPyBwZGF0YS0+dXBfa2V5IDogcGRhdGEtPmRvd25fa2V5OworCQlpbnB1dF9yZXBvcnRfa2V5KHItPmlucHV0X2Rldiwga2V5LCAxKTsKKwkJaW5wdXRfc3luYyhyLT5pbnB1dF9kZXYpOworCQlpbnB1dF9yZXBvcnRfa2V5KHItPmlucHV0X2Rldiwga2V5LCAwKTsKKwl9IGVsc2UKKwkJaW5wdXRfcmVwb3J0X3JlbChyLT5pbnB1dF9kZXYsIHBkYXRhLT5yZWxfY29kZSwgZGVsdGEpOworCisJaW5wdXRfc3luYyhyLT5pbnB1dF9kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHB4YTkzMF9yb3Rhcnlfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHB4YTkzMF9yb3RhcnkgKnIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xlYXJfc2JjcihyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGE5MzBfcm90YXJ5X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqciA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwljbGVhcl9zYmNyKHIpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBweGE5MzBfcm90YXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YTkzMF9yb3RhcnlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqcjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycTsKKwlpbnQgZXJyOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgZm9yIHJvdGFyeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIEkvTyBtZW1vcnkgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YTkzMF9yb3RhcnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOworCisJci0+bW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKHItPm1taW9fYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBJTyBtZW1vcnlcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZmFpbGVkX2ZyZWU7CisJfQorCisJci0+cGRhdGEgPSBwZGF0YTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByKTsKKworCS8qIGFsbG9jYXRlIGFuZCByZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlICovCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW87CisJfQorCisJaW5wdXRfZGV2LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9kZXYtPm9wZW4gPSBweGE5MzBfcm90YXJ5X29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IHB4YTkzMF9yb3RhcnlfY2xvc2U7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCWlmIChwZGF0YS0+dXBfa2V5ICYmIHBkYXRhLT5kb3duX2tleSkgeworCQlfX3NldF9iaXQocGRhdGEtPnVwX2tleSwgaW5wdXRfZGV2LT5rZXliaXQpOworCQlfX3NldF9iaXQocGRhdGEtPmRvd25fa2V5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOworCX0gZWxzZSB7CisJCV9fc2V0X2JpdChwZGF0YS0+cmVsX2NvZGUsIGlucHV0X2Rldi0+cmVsYml0KTsKKwkJX19zZXRfYml0KEVWX1JFTCwgaW5wdXRfZGV2LT5ldmJpdCk7CisJfQorCisJci0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2Rldiwgcik7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIHJvdGFyeV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkiZW5oYW5jZWQgcm90YXJ5Iiwgcik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lucHV0OworCX0KKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaXJxOworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCByKTsKK2ZhaWxlZF9mcmVlX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CitmYWlsZWRfZnJlZV9pbzoKKwlpb3VubWFwKHItPm1taW9fYmFzZSk7CitmYWlsZWRfZnJlZToKKwlrZnJlZShyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBweGE5MzBfcm90YXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGE5MzBfcm90YXJ5ICpyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCByKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShyLT5pbnB1dF9kZXYpOworCWlvdW5tYXAoci0+bW1pb19iYXNlKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGE5MzBfcm90YXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicHhhOTMwLXJvdGFyeSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHB4YTkzMF9yb3RhcnlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChweGE5MzBfcm90YXJ5X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGE5MzBfcm90YXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGE5MzBfcm90YXJ5X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChweGE5MzBfcm90YXJ5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhOTMwX3JvdGFyeV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YTkzMF9yb3RhcnlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHB4YTkzMF9yb3RhcnlfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBQWEE5M3ggRW5oYW5jZWQgUm90YXJ5IENvbnRyb2xsZXIiKTsKK01PRFVMRV9BVVRIT1IoIllhbyBZb25nIDx5YW95b25nQG1hcnZlbGwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jCmluZGV4IDQzYWFhNWMuLmQ2YTMwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcGNzcGtyLmMKQEAgLTUyLDEzICs1MiwxMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CiAKIAlpZiAoY291bnQpIHsKLQkJLyogZW5hYmxlIGNvdW50ZXIgMiAqLwotCQlvdXRiX3AoaW5iX3AoMHg2MSkgfCAzLCAweDYxKTsKIAkJLyogc2V0IGNvbW1hbmQgZm9yIGNvdW50ZXIgMiwgMiBieXRlIHdyaXRlICovCiAJCW91dGJfcCgweEI2LCAweDQzKTsKIAkJLyogc2VsZWN0IGRlc2lyZWQgSFogKi8KIAkJb3V0Yl9wKGNvdW50ICYgMHhmZiwgMHg0Mik7CiAJCW91dGIoKGNvdW50ID4+IDgpICYgMHhmZiwgMHg0Mik7CisJCS8qIGVuYWJsZSBjb3VudGVyIDIgKi8KKwkJb3V0Yl9wKGluYl9wKDB4NjEpIHwgMywgMHg2MSk7CiAJfSBlbHNlIHsKIAkJLyogZGlzYWJsZSBjb3VudGVyIDIgKi8KIAkJb3V0YihpbmJfcCgweDYxKSAmIDB4RkMsIDB4NjEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCmluZGV4IDIyM2Q1NmQuLjQ2YjdjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91aW5wdXQuaD4KKyNpbmNsdWRlICIuLi9pbnB1dC1jb21wYXQuaCIKIAogc3RhdGljIGludCB1aW5wdXRfZGV2X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7CkBAIC03OCw2ICs3OSw3IEBACiAJLyogRmluZCBhbiBpbnB1dCByZXF1ZXN0LCBieSBJRC4gUmV0dXJucyBOVUxMIGlmIHRoZSBJRCBpc24ndCB2YWxpZC4gKi8KIAlpZiAoaWQgPj0gVUlOUFVUX05VTV9SRVFVRVNUUyB8fCBpZCA8IDApCiAJCXJldHVybiBOVUxMOworCiAJcmV0dXJuIHVkZXYtPnJlcXVlc3RzW2lkXTsKIH0KIApAQCAtMTI3LDYgKzEyOSwxNyBAQAogCXN0cnVjdCB1aW5wdXRfcmVxdWVzdCByZXF1ZXN0OwogCWludCByZXR2YWw7CiAKKwkvKgorCSAqIHVpbnB1dCBkcml2ZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgcGVyaW9kaWMgZWZmZWN0cyB3aXRoCisJICogY3VzdG9tIHdhdmVmb3JtIHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgYSB3YXkgdG8gcGFzcyBidWZmZXIgb2YKKwkgKiBzYW1wbGVzIChjdXN0b21fZGF0YSkgdG8gdXNlcnNwYWNlLiBJZiBldmVyIHRoZXJlIGlzIGEgZGV2aWNlCisJICogc3VwcG9ydGluZyBjdXN0b20gd2F2ZWZvcm1zIHdlIHdvdWxkIG5lZWQgdG8gZGVmaW5lIGFuIGFkZGl0aW9uYWwKKwkgKiBpb2N0bCAoVUlfVVBMT0FEX1NBTVBMRVMpIGJ1dCBmb3Igbm93IHdlIGp1c3QgYmFpbCBvdXQuCisJICovCisJaWYgKGVmZmVjdC0+dHlwZSA9PSBGRl9QRVJJT0RJQyAmJgorCQkJZWZmZWN0LT51LnBlcmlvZGljLndhdmVmb3JtID09IEZGX0NVU1RPTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXF1ZXN0LmlkID0gLTE7CiAJaW5pdF9jb21wbGV0aW9uKCZyZXF1ZXN0LmRvbmUpOwogCXJlcXVlc3QuY29kZSA9IFVJX0ZGX1VQTE9BRDsKQEAgLTM1MywxNSArMzY2LDE1IEBACiB7CiAJc3RydWN0IGlucHV0X2V2ZW50IGV2OwogCi0JaWYgKGNvdW50ICE9IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKQorCWlmIChjb3VudCA8IGlucHV0X2V2ZW50X3NpemUoKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmV2LCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwlpZiAoaW5wdXRfZXZlbnRfZnJvbV91c2VyKGJ1ZmZlciwgJmV2KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpbnB1dF9ldmVudCh1ZGV2LT5kZXYsIGV2LnR5cGUsIGV2LmNvZGUsIGV2LnZhbHVlKTsKIAotCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKKwlyZXR1cm4gaW5wdXRfZXZlbnRfc2l6ZSgpOwogfQogCiBzdGF0aWMgc3NpemVfdCB1aW5wdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtNDA3LDEzICs0MjAsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2hpbGUgKHVkZXYtPmhlYWQgIT0gdWRldi0+dGFpbCAmJiByZXR2YWwgKyBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSA8PSBjb3VudCkgewotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJnVkZXYtPmJ1ZmZbdWRldi0+dGFpbF0sIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkgeworCXdoaWxlICh1ZGV2LT5oZWFkICE9IHVkZXYtPnRhaWwgJiYgcmV0dmFsICsgaW5wdXRfZXZlbnRfc2l6ZSgpIDw9IGNvdW50KSB7CisJCWlmIChpbnB1dF9ldmVudF90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJnVkZXYtPmJ1ZmZbdWRldi0+dGFpbF0pKSB7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJdWRldi0+dGFpbCA9ICh1ZGV2LT50YWlsICsgMSkgJSBVSU5QVVRfQlVGRkVSX1NJWkU7Ci0JCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKKwkJcmV0dmFsICs9IGlucHV0X2V2ZW50X3NpemUoKTsKIAl9CiAKICBvdXQ6CkBAIC00NDQsNiArNDU3LDkzIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQgeworCWludAkJCXJlcXVlc3RfaWQ7CisJaW50CQkJcmV0dmFsOworCXN0cnVjdCBmZl9lZmZlY3RfY29tcGF0CWVmZmVjdDsKKwlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdAlvbGQ7Cit9OworCitzdGF0aWMgaW50IHVpbnB1dF9mZl91cGxvYWRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCAqZmZfdXApCit7CisJaWYgKElOUFVUX0NPTVBBVF9URVNUKSB7CisJCXN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCBmZl91cF9jb21wYXQ7CisKKwkJZmZfdXBfY29tcGF0LnJlcXVlc3RfaWQgPSBmZl91cC0+cmVxdWVzdF9pZDsKKwkJZmZfdXBfY29tcGF0LnJldHZhbCA9IGZmX3VwLT5yZXR2YWw7CisJCS8qCisJCSAqIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGUgcG9pbnRlciB0aGF0IGdpdmVzIHVzIHRoZSB0cm91YmxlCisJCSAqIGlzIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUuIFNpbmNlIHdlIGRvbid0IHN1cHBvcnQKKwkJICogY3VzdG9tIHdhdmVmb3JtcyBpbiB1aW5wdXQgYW55d2F5IHdlIGNhbiBqdXN0IGNvcHkgdGhlIHdob2xlCisJCSAqIHRoaW5nICh0byB0aGUgY29tcGF0IHNpemUpIGFuZCBpZ25vcmUgdGhlIHBvaW50ZXIuCisJCSAqLworCQltZW1jcHkoJmZmX3VwX2NvbXBhdC5lZmZlY3QsICZmZl91cC0+ZWZmZWN0LAorCQkJc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0KSk7CisJCW1lbWNweSgmZmZfdXBfY29tcGF0Lm9sZCwgJmZmX3VwLT5vbGQsCisJCQlzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJmZmX3VwX2NvbXBhdCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGZmX3VwLAorCQkJCSBzaXplb2Yoc3RydWN0IHVpbnB1dF9mZl91cGxvYWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQgZmZfdXBfY29tcGF0OworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXBfY29tcGF0LCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkX2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZmZfdXAtPnJlcXVlc3RfaWQgPSBmZl91cF9jb21wYXQucmVxdWVzdF9pZDsKKwkJZmZfdXAtPnJldHZhbCA9IGZmX3VwX2NvbXBhdC5yZXR2YWw7CisJCW1lbWNweSgmZmZfdXAtPmVmZmVjdCwgJmZmX3VwX2NvbXBhdC5lZmZlY3QsCisJCQlzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKTsKKwkJbWVtY3B5KCZmZl91cC0+b2xkLCAmZmZfdXBfY29tcGF0Lm9sZCwKKwkJCXNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpOworCisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGZmX3VwLCBidWZmZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCB1aW5wdXRfZmZfdXBsb2FkX3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmZl91cCwgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWlucHV0X2ZmX3VwbG9hZF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgICBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCAqZmZfdXApCit7CisJaWYgKGNvcHlfZnJvbV91c2VyKGZmX3VwLCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKKwogI2RlZmluZSB1aW5wdXRfc2V0X2JpdChfYXJnLCBfYml0LCBfbWF4KQkJXAogKHsJCQkJCQkJXAogCWludCBfX3JldCA9IDA7CQkJCQlcCkBAIC00NTUsMTkgKzU1NSwxNyBAQAogCV9fcmV0OwkJCQkJCVwKIH0pCiAKLXN0YXRpYyBsb25nIHVpbnB1dF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyB1aW5wdXRfaW9jdGxfaGFuZGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcsIHZvaWQgX191c2VyICpwKQogewogCWludAkJCXJldHZhbDsKLQlzdHJ1Y3QgdWlucHV0X2RldmljZQkqdWRldjsKLQl2b2lkIF9fdXNlciAgICAgICAgICAgICAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgdWlucHV0X2RldmljZQkqdWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCBmZl91cDsKIAlzdHJ1Y3QgdWlucHV0X2ZmX2VyYXNlICBmZl9lcmFzZTsKIAlzdHJ1Y3QgdWlucHV0X3JlcXVlc3QgICAqcmVxOwogCWludCAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKIAljaGFyCQkJKnBoeXM7CiAKLQl1ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCiAJcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1ZGV2LT5tdXRleCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTU0OSwyNiArNjQ3LDI0IEBACiAJCQlicmVhazsKIAogCQljYXNlIFVJX0JFR0lOX0ZGX1VQTE9BRDoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXAsIHAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKHAsICZmZl91cCk7CisJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQlyZXEgPSB1aW5wdXRfcmVxdWVzdF9maW5kKHVkZXYsIGZmX3VwLnJlcXVlc3RfaWQpOwotCQkJaWYgKCEocmVxICYmIHJlcS0+Y29kZSA9PSBVSV9GRl9VUExPQUQgJiYgcmVxLT51LnVwbG9hZC5lZmZlY3QpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfVVBMT0FEIHx8ICFyZXEtPnUudXBsb2FkLmVmZmVjdCkgewogCQkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCWZmX3VwLnJldHZhbCA9IDA7Ci0JCQltZW1jcHkoJmZmX3VwLmVmZmVjdCwgcmVxLT51LnVwbG9hZC5lZmZlY3QsIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSk7CisJCQlmZl91cC5lZmZlY3QgPSAqcmVxLT51LnVwbG9hZC5lZmZlY3Q7CiAJCQlpZiAocmVxLT51LnVwbG9hZC5vbGQpCi0JCQkJbWVtY3B5KCZmZl91cC5vbGQsIHJlcS0+dS51cGxvYWQub2xkLCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpOworCQkJCWZmX3VwLm9sZCA9ICpyZXEtPnUudXBsb2FkLm9sZDsKIAkJCWVsc2UKIAkJCQltZW1zZXQoJmZmX3VwLm9sZCwgMCwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKTsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmZmZfdXAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfdG9fdXNlcihwLCAmZmZfdXApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBVSV9CRUdJTl9GRl9FUkFTRToKQEAgLTU3NiwyOSArNjcyLDM0IEBACiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl9lcmFzZS5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfRVJBU0UpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfRVJBU0UpIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlmZl9lcmFzZS5yZXR2YWwgPSAwOwogCQkJZmZfZXJhc2UuZWZmZWN0X2lkID0gcmVxLT51LmVmZmVjdF9pZDsKIAkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmZmX2VyYXNlLCBzaXplb2YoZmZfZXJhc2UpKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCWJyZWFrOwogCiAJCWNhc2UgVUlfRU5EX0ZGX1VQTE9BRDoKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZmZfdXAsIHAsIHNpemVvZihmZl91cCkpKSB7Ci0JCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCXJldHZhbCA9IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKHAsICZmZl91cCk7CisJCQlpZiAocmV0dmFsKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQlyZXEgPSB1aW5wdXRfcmVxdWVzdF9maW5kKHVkZXYsIGZmX3VwLnJlcXVlc3RfaWQpOwotCQkJaWYgKCEocmVxICYmIHJlcS0+Y29kZSA9PSBVSV9GRl9VUExPQUQgJiYgcmVxLT51LnVwbG9hZC5lZmZlY3QpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfVVBMT0FEIHx8CisJCQkgICAgIXJlcS0+dS51cGxvYWQuZWZmZWN0KSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxLT5yZXR2YWwgPSBmZl91cC5yZXR2YWw7CiAJCQl1aW5wdXRfcmVxdWVzdF9kb25lKHVkZXYsIHJlcSk7CiAJCQlicmVhazsKQEAgLTYwOCwxMSArNzA5LDEzIEBACiAJCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl9lcmFzZS5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfRVJBU0UpKSB7CisJCQlpZiAoIXJlcSB8fCByZXEtPmNvZGUgIT0gVUlfRkZfRVJBU0UpIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlyZXEtPnJldHZhbCA9IGZmX2VyYXNlLnJldHZhbDsKIAkJCXVpbnB1dF9yZXF1ZXN0X2RvbmUodWRldiwgcmVxKTsKIAkJCWJyZWFrOwpAQCAtNjI2LDYgKzcyOSwxOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBsb25nIHVpbnB1dF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHVpbnB1dF9pb2N0bF9oYW5kbGVyKGZpbGUsIGNtZCwgYXJnLCAodm9pZCBfX3VzZXIgKilhcmcpOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgdWlucHV0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHVpbnB1dF9pb2N0bF9oYW5kbGVyKGZpbGUsIGNtZCwgYXJnLCBjb21wYXRfcHRyKGFyZykpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVpbnB1dF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSB1aW5wdXRfb3BlbiwKQEAgLTYzNCw2ICs3NDksOSBAQAogCS53cml0ZQkJPSB1aW5wdXRfd3JpdGUsCiAJLnBvbGwJCT0gdWlucHV0X3BvbGwsCiAJLnVubG9ja2VkX2lvY3RsCT0gdWlucHV0X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gdWlucHV0X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHVpbnB1dF9taXNjID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnCmluZGV4IDRlOTkzNDIuLjA5M2M4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL0tjb25maWcKQEAgLTI4Niw0ICsyODYsMTAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdwaW9fbW91c2UuCiAKK2NvbmZpZyBNT1VTRV9QWEE5MzBfVFJLQkFMTAorCXRyaXN0YXRlICJQWEE5MzAgVHJhY2tiYWxsIG1vdXNlIgorCWRlcGVuZHMgb24gQ1BVX1BYQTkzMCB8fCBDUFVfUFhBOTM1CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IFBYQTkzMCBUcmFja2JhbGwgbW91c2UuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQppbmRleCA5NmYxZGQ4Li44YzhhMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKQEAgLTQsMTkgKzQsMjAgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCi1vYmotJChDT05GSUdfTU9VU0VfQU1JR0EpCSs9IGFtaW1vdXNlLm8KLW9iai0kKENPTkZJR19NT1VTRV9BUFBMRVRPVUNIKQkrPSBhcHBsZXRvdWNoLm8KLW9iai0kKENPTkZJR19NT1VTRV9CQ001OTc0KQkrPSBiY201OTc0Lm8KLW9iai0kKENPTkZJR19NT1VTRV9BVEFSSSkJKz0gYXRhcmltb3VzZS5vCi1vYmotJChDT05GSUdfTU9VU0VfUklTQ1BDKQkrPSBycGNtb3VzZS5vCi1vYmotJChDT05GSUdfTU9VU0VfSU5QT1JUKQkrPSBpbnBvcnQubwotb2JqLSQoQ09ORklHX01PVVNFX0xPR0lCTSkJKz0gbG9naWJtLm8KLW9iai0kKENPTkZJR19NT1VTRV9QQzExMFBBRCkJKz0gcGMxMTBwYWQubwotb2JqLSQoQ09ORklHX01PVVNFX1BTMikJCSs9IHBzbW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX1NFUklBTCkJKz0gc2VybW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX0hJTCkJCSs9IGhpbF9wdHIubwotb2JqLSQoQ09ORklHX01PVVNFX1ZTWFhYQUEpCSs9IHZzeHh4YWEubwotb2JqLSQoQ09ORklHX01PVVNFX0dQSU8pCSs9IGdwaW9fbW91c2Uubworb2JqLSQoQ09ORklHX01PVVNFX0FNSUdBKQkJKz0gYW1pbW91c2Uubworb2JqLSQoQ09ORklHX01PVVNFX0FQUExFVE9VQ0gpCQkrPSBhcHBsZXRvdWNoLm8KK29iai0kKENPTkZJR19NT1VTRV9CQ001OTc0KQkJKz0gYmNtNTk3NC5vCitvYmotJChDT05GSUdfTU9VU0VfQVRBUkkpCQkrPSBhdGFyaW1vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9SSVNDUEMpCQkrPSBycGNtb3VzZS5vCitvYmotJChDT05GSUdfTU9VU0VfSU5QT1JUKQkJKz0gaW5wb3J0Lm8KK29iai0kKENPTkZJR19NT1VTRV9MT0dJQk0pCQkrPSBsb2dpYm0ubworb2JqLSQoQ09ORklHX01PVVNFX1BDMTEwUEFEKQkJKz0gcGMxMTBwYWQubworb2JqLSQoQ09ORklHX01PVVNFX1BTMikJCQkrPSBwc21vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9QWEE5MzBfVFJLQkFMTCkJKz0gcHhhOTMwX3Rya2JhbGwubworb2JqLSQoQ09ORklHX01PVVNFX1NFUklBTCkJCSs9IHNlcm1vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9ISUwpCQkJKz0gaGlsX3B0ci5vCitvYmotJChDT05GSUdfTU9VU0VfVlNYWFhBQSkJCSs9IHZzeHh4YWEubworb2JqLSQoQ09ORklHX01PVVNFX0dQSU8pCQkrPSBncGlvX21vdXNlLm8KIAogcHNtb3VzZS1vYmpzIDo9IHBzbW91c2UtYmFzZS5vIHN5bmFwdGljcy5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKaW5kZXggMDc5ODE2ZS4uNDU0Yjk2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hcHBsZXRvdWNoLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IEpvaGFubmVzIEJlcmcgKGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBTdGVsaWFuIFBvcCAoc3RlbGlhbkBwb3BpZXMubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggU3RlbGlhbiBQb3AgKHN0ZWxpYW5AcG9waWVzLm5ldCkKICAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgIEZyYW5rIEFybm9sZCAoZnJhbmtAc2Npcm9jY28tNXYtdHVyYm8uZGUpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBQZXRlciBPc3Rlcmx1bmQgKHBldGVybzJAdGVsaWEuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgTWljaGFlbCBIYW5zZWxtYW5uIChsaW51eC1rZXJuZWxAaGFuc21pLmNoKQpAQCAtMzUsMTYgKzM1LDc0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAKLS8qIFR5cGUgb2YgdG91Y2hwYWQgKi8KLWVudW0gYXRwX3RvdWNocGFkX3R5cGUgewotCUFUUF9GT1VOVEFJTiwKLQlBVFBfR0VZU0VSMSwKLQlBVFBfR0VZU0VSMiwKLQlBVFBfR0VZU0VSMywKLQlBVFBfR0VZU0VSNAorLyoKKyAqIE5vdGU6IFdlIHRyeSB0byBrZWVwIHRoZSB0b3VjaHBhZCBhc3BlY3QgcmF0aW8gd2hpbGUgc3RpbGwgZG9pbmcgb25seQorICogc2ltcGxlIGFyaXRobWV0aWNzOgorICoJMCA8PSB4IDw9ICh4c2Vuc29ycyAtIDEpICogeGZhY3QKKyAqCTAgPD0geSA8PSAoeXNlbnNvcnMgLSAxKSAqIHlmYWN0CisgKi8KK3N0cnVjdCBhdHBfaW5mbyB7CisJaW50IHhzZW5zb3JzOwkJCQkvKiBudW1iZXIgb2YgWCBzZW5zb3JzICovCisJaW50IHhzZW5zb3JzXzE3OwkJCS8qIDE3IiBtb2RlbHMgaGF2ZSBtb3JlIHNlbnNvcnMgKi8KKwlpbnQgeXNlbnNvcnM7CQkJCS8qIG51bWJlciBvZiBZIHNlbnNvcnMgKi8KKwlpbnQgeGZhY3Q7CQkJCS8qIFggbXVsdGlwbGljYXRpb24gZmFjdG9yICovCisJaW50IHlmYWN0OwkJCQkvKiBZIG11bHRpcGxpY2F0aW9uIGZhY3RvciAqLworCWludCBkYXRhbGVuOwkJCQkvKiBzaXplIG9mIFVTQiB0cmFuc2ZlcnMgKi8KKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB1cmIgKik7CQkvKiBjYWxsYmFjayBmdW5jdGlvbiAqLwogfTsKIAotI2RlZmluZSBBVFBfREVWSUNFKHByb2QsIHR5cGUpCQkJCQlcCitzdGF0aWMgdm9pZCBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMihzdHJ1Y3QgdXJiICp1cmIpOworc3RhdGljIHZvaWQgYXRwX2NvbXBsZXRlX2dleXNlcl8zXzQoc3RydWN0IHVyYiAqdXJiKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBmb3VudGFpbl9pbmZvID0geworCS54c2Vuc29ycwk9IDE2LAorCS54c2Vuc29yc18xNwk9IDI2LAorCS55c2Vuc29ycwk9IDE2LAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNDMsCisJLmRhdGFsZW4JPSA4MSwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyMV9pbmZvID0geworCS54c2Vuc29ycwk9IDE2LAorCS54c2Vuc29yc18xNwk9IDI2LAorCS55c2Vuc29ycwk9IDE2LAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNDMsCisJLmRhdGFsZW4JPSA4MSwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyMl9pbmZvID0geworCS54c2Vuc29ycwk9IDE1LAorCS54c2Vuc29yc18xNwk9IDIwLAorCS55c2Vuc29ycwk9IDksCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA0MywKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfMV8yLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBnZXlzZXIzX2luZm8gPSB7CisJLnhzZW5zb3JzCT0gMjAsCisJLnlzZW5zb3JzCT0gMTAsCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA2NCwKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfM180LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHBfaW5mbyBnZXlzZXI0X2luZm8gPSB7CisJLnhzZW5zb3JzCT0gMjAsCisJLnlzZW5zb3JzCT0gMTAsCisJLnhmYWN0CQk9IDY0LAorCS55ZmFjdAkJPSA2NCwKKwkuZGF0YWxlbgk9IDY0LAorCS5jYWxsYmFjawk9IGF0cF9jb21wbGV0ZV9nZXlzZXJfM180LAorfTsKKworI2RlZmluZSBBVFBfREVWSUNFKHByb2QsIGluZm8pCQkJCQlcCiB7CQkJCQkJCQlcCiAJLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfAkJXAogCQkgICAgICAgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfAkJXApAQCAtNTMsNyArMTExLDcgQEAKIAkuaWRQcm9kdWN0ID0gKHByb2QpLAkJCQkJXAogCS5iSW50ZXJmYWNlQ2xhc3MgPSAweDAzLAkJCQlcCiAJLmJJbnRlcmZhY2VQcm90b2NvbCA9IDB4MDIsCQkJCVwKLQkuZHJpdmVyX2luZm8gPSBBVFBfICMjIHR5cGUsCQkJCVwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmluZm8sCQkJXAogfQogCiAvKgpAQCAtNjIsNDMgKzEyMCwzOSBAQAogICogIEFjY29yZGluZyB0byBJbmZvLnBsaXN0IEdleXNlciBJViBpcyB0aGUgc2FtZSBhcyBHZXlzZXIgSUlJLikKICAqLwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRwX3RhYmxlIFtdID0geworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGF0cF90YWJsZVtdID0gewogCS8qIFBvd2VyQm9va3MgRmViIDIwMDUsIGlCb29rcyBHNCAqLwotCUFUUF9ERVZJQ0UoMHgwMjBlLCBGT1VOVEFJTiksCS8qIEZPVU5UQUlOIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIwZiwgRk9VTlRBSU4pLAkvKiBGT1VOVEFJTiBJU08gKi8KLQlBVFBfREVWSUNFKDB4MDMwYSwgRk9VTlRBSU4pLAkvKiBGT1VOVEFJTiBUUCBPTkxZICovCi0JQVRQX0RFVklDRSgweDAzMGIsIEdFWVNFUjEpLAkvKiBHRVlTRVIgMSBUUCBPTkxZICovCisJQVRQX0RFVklDRSgweDAyMGUsIGZvdW50YWluX2luZm8pLAkvKiBGT1VOVEFJTiBBTlNJICovCisJQVRQX0RFVklDRSgweDAyMGYsIGZvdW50YWluX2luZm8pLAkvKiBGT1VOVEFJTiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDMwYSwgZm91bnRhaW5faW5mbyksCS8qIEZPVU5UQUlOIFRQIE9OTFkgKi8KKwlBVFBfREVWSUNFKDB4MDMwYiwgZ2V5c2VyMV9pbmZvKSwJLyogR0VZU0VSIDEgVFAgT05MWSAqLwogCiAJLyogUG93ZXJCb29rcyBPY3QgMjAwNSAqLwotCUFUUF9ERVZJQ0UoMHgwMjE0LCBHRVlTRVIyKSwJLyogR0VZU0VSIDIgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjE1LCBHRVlTRVIyKSwJLyogR0VZU0VSIDIgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMTYsIEdFWVNFUjIpLAkvKiBHRVlTRVIgMiBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIxNCwgZ2V5c2VyMl9pbmZvKSwJLyogR0VZU0VSIDIgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjE1LCBnZXlzZXIyX2luZm8pLAkvKiBHRVlTRVIgMiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIxNiwgZ2V5c2VyMl9pbmZvKSwJLyogR0VZU0VSIDIgSklTICovCiAKIAkvKiBDb3JlIER1byBNYWNCb29rICYgTWFjQm9vayBQcm8gKi8KLQlBVFBfREVWSUNFKDB4MDIxNywgR0VZU0VSMyksCS8qIEdFWVNFUiAzIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIxOCwgR0VZU0VSMyksCS8qIEdFWVNFUiAzIElTTyAqLwotCUFUUF9ERVZJQ0UoMHgwMjE5LCBHRVlTRVIzKSwJLyogR0VZU0VSIDMgSklTICovCisJQVRQX0RFVklDRSgweDAyMTcsIGdleXNlcjNfaW5mbyksCS8qIEdFWVNFUiAzIEFOU0kgKi8KKwlBVFBfREVWSUNFKDB4MDIxOCwgZ2V5c2VyM19pbmZvKSwJLyogR0VZU0VSIDMgSVNPICovCisJQVRQX0RFVklDRSgweDAyMTksIGdleXNlcjNfaW5mbyksCS8qIEdFWVNFUiAzIEpJUyAqLwogCiAJLyogQ29yZTIgRHVvIE1hY0Jvb2sgJiBNYWNCb29rIFBybyAqLwotCUFUUF9ERVZJQ0UoMHgwMjFhLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjFiLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMWMsIEdFWVNFUjQpLAkvKiBHRVlTRVIgNCBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIxYSwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjFiLCBnZXlzZXI0X2luZm8pLAkvKiBHRVlTRVIgNCBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIxYywgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSklTICovCiAKIAkvKiBDb3JlMiBEdW8gTWFjQm9vazMsMSAqLwotCUFUUF9ERVZJQ0UoMHgwMjI5LCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSEYgQU5TSSAqLwotCUFUUF9ERVZJQ0UoMHgwMjJhLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSEYgSVNPICovCi0JQVRQX0RFVklDRSgweDAyMmIsIEdFWVNFUjQpLAkvKiBHRVlTRVIgNCBIRiBKSVMgKi8KKwlBVFBfREVWSUNFKDB4MDIyOSwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSEYgQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjJhLCBnZXlzZXI0X2luZm8pLAkvKiBHRVlTRVIgNCBIRiBJU08gKi8KKwlBVFBfREVWSUNFKDB4MDIyYiwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSEYgSklTICovCiAKIAkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhdHBfdGFibGUpOwogCi0vKgotICogbnVtYmVyIG9mIHNlbnNvcnMuIE5vdGUgdGhhdCBvbmx5IDE2IGluc3RlYWQgb2YgMjYgWCAoaG9yaXpvbnRhbCkKLSAqIHNlbnNvcnMgZXhpc3Qgb24gMTIiIGFuZCAxNSIgUG93ZXJCb29rcy4gQWxsIG1vZGVscyBoYXZlIDE2IFkKLSAqICh2ZXJ0aWNhbCkgc2Vuc29ycy4KLSAqLworLyogbWF4aW11bSBudW1iZXIgb2Ygc2Vuc29ycyAqLwogI2RlZmluZSBBVFBfWFNFTlNPUlMJMjYKICNkZWZpbmUgQVRQX1lTRU5TT1JTCTE2CiAKQEAgLTEwNywyMSArMTYxLDYgQEAKIAogLyogbWF4aW11bSBwcmVzc3VyZSB0aGlzIGRyaXZlciB3aWxsIHJlcG9ydCAqLwogI2RlZmluZSBBVFBfUFJFU1NVUkUJMzAwCi0vKgotICogbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciB0aGUgWCBhbmQgWSBjb29yZGluYXRlcy4KLSAqIFdlIHRyeSB0byBrZWVwIHRoZSB0b3VjaHBhZCBhc3BlY3QgcmF0aW8gd2hpbGUgc3RpbGwgZG9pbmcgb25seSBzaW1wbGUKLSAqIGFyaXRobWV0aWNzLgotICogVGhlIGZhY3RvcnMgYmVsb3cgZ2l2ZSBjb29yZGluYXRlcyBsaWtlOgotICoKLSAqICAgICAgMCA8PSB4IDwgIDk2MCBvbiAxMiIgYW5kIDE1IiBQb3dlcmJvb2tzCi0gKiAgICAgIDAgPD0geCA8IDE2MDAgb24gMTciIFBvd2VyYm9va3MgYW5kIDE3IiBNYWNCb29rIFBybwotICogICAgICAwIDw9IHggPCAxMjE2IG9uIE1hY0Jvb2tzIGFuZCAxNSIgTWFjQm9vayBQcm8KLSAqCi0gKiAgICAgIDAgPD0geSA8ICA2NDYgb24gYWxsIFBvd2VyYm9va3MKLSAqICAgICAgMCA8PSB5IDwgIDc3NCBvbiBhbGwgTWFjQm9va3MKLSAqLwotI2RlZmluZSBBVFBfWEZBQ1QJNjQKLSNkZWZpbmUgQVRQX1lGQUNUCTQzCiAKIC8qCiAgKiBUaHJlc2hvbGQgZm9yIHRoZSB0b3VjaHBhZCBzZW5zb3JzLiBBbnkgY2hhbmdlIGxlc3MgdGhhbiBBVFBfVEhSRVNIT0xEIGlzCkBAIC0xNTksNyArMTk4LDcgQEAKIAlzdHJ1Y3QgdXJiCQkqdXJiOwkJLyogdXNiIHJlcXVlc3QgYmxvY2sgKi8KIAl1OAkJCSpkYXRhOwkJLyogdHJhbnNmZXJyZWQgZGF0YSAqLwogCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0OwkJLyogaW5wdXQgZGV2ICovCi0JZW51bSBhdHBfdG91Y2hwYWRfdHlwZQl0eXBlOwkJLyogdHlwZSBvZiB0b3VjaHBhZCAqLworCWNvbnN0IHN0cnVjdCBhdHBfaW5mbwkqaW5mbzsJCS8qIHRvdWNocGFkIG1vZGVsICovCiAJYm9vbAkJCW9wZW47CiAJYm9vbAkJCXZhbGlkOwkJLyogYXJlIHRoZSBzYW1wbGVzIHZhbGlkPyAqLwogCWJvb2wJCQlzaXplX2RldGVjdF9kb25lOwpAQCAtMTY5LDcgKzIwOCw2IEBACiAJc2lnbmVkIGNoYXIJCXh5X2N1cltBVFBfWFNFTlNPUlMgKyBBVFBfWVNFTlNPUlNdOwogCXNpZ25lZCBjaGFyCQl4eV9vbGRbQVRQX1hTRU5TT1JTICsgQVRQX1lTRU5TT1JTXTsKIAlpbnQJCQl4eV9hY2NbQVRQX1hTRU5TT1JTICsgQVRQX1lTRU5TT1JTXTsKLQlpbnQJCQlkYXRhbGVuOwkvKiBzaXplIG9mIFVTQiB0cmFuc2ZlciAqLwogCWludAkJCWlkbGVjb3VudDsJLyogbnVtYmVyIG9mIGVtcHR5IHBhY2tldHMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIH07CkBAIC0zNTksNyArMzk3LDcgQEAKIAkJaWYgKCFkZXYtPm92ZXJmbG93X3dhcm5lZCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGV0b3VjaDogT1ZFUkZMT1cgd2l0aCBkYXRhICIKIAkJCQkibGVuZ3RoICVkLCBhY3R1YWwgbGVuZ3RoIGlzICVkXG4iLAotCQkJCWRldi0+ZGF0YWxlbiwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOworCQkJCWRldi0+aW5mby0+ZGF0YWxlbiwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJZGV2LT5vdmVyZmxvd193YXJuZWQgPSB0cnVlOwogCQl9CiAJY2FzZSAtRUNPTk5SRVNFVDoKQEAgLTM3Nyw3ICs0MTUsNyBAQAogCX0KIAogCS8qIGRyb3AgaW5jb21wbGV0ZSBkYXRhc2V0cyAqLwotCWlmIChkZXYtPnVyYi0+YWN0dWFsX2xlbmd0aCAhPSBkZXYtPmRhdGFsZW4pIHsKKwlpZiAoZGV2LT51cmItPmFjdHVhbF9sZW5ndGggIT0gZGV2LT5pbmZvLT5kYXRhbGVuKSB7CiAJCWRwcmludGsoImFwcGxldG91Y2g6IGluY29tcGxldGUgZGF0YSBwYWNrYWdlIgogCQkJIiAoZmlyc3QgYnl0ZTogJWQsIGxlbmd0aDogJWQpLlxuIiwKIAkJCWRldi0+ZGF0YVswXSwgZGV2LT51cmItPmFjdHVhbF9sZW5ndGgpOwpAQCAtMzg3LDYgKzQyNSwyNSBAQAogCXJldHVybiBBVFBfVVJCX1NUQVRVU19TVUNDRVNTOwogfQogCitzdGF0aWMgdm9pZCBhdHBfZGV0ZWN0X3NpemUoc3RydWN0IGF0cCAqZGV2KQoreworCWludCBpOworCisJLyogMTciIFBvd2VyYm9va3MgaGF2ZSBleHRyYSBYIHNlbnNvcnMgKi8KKwlmb3IgKGkgPSBkZXYtPmluZm8tPnhzZW5zb3JzOyBpIDwgQVRQX1hTRU5TT1JTOyBpKyspIHsKKwkJaWYgKGRldi0+eHlfY3VyW2ldKSB7CisKKwkJCXByaW50ayhLRVJOX0lORk8gImFwcGxldG91Y2g6IDE3XCIgbW9kZWwgZGV0ZWN0ZWQuXG4iKTsKKworCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsIDAsCisJCQkJCSAgICAgKGRldi0+aW5mby0+eHNlbnNvcnNfMTcgLSAxKSAqCisJCQkJCQkJZGV2LT5pbmZvLT54ZmFjdCAtIDEsCisJCQkJCSAgICAgQVRQX0ZVWlosIDApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBVU0IgaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9ucwogICovCkBAIC00MDcsNyArNDY0LDcgQEAKIAkJZ290byBleGl0OwogCiAJLyogcmVvcmRlciB0aGUgc2Vuc29ycyB2YWx1ZXMgKi8KLQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIyKSB7CisJaWYgKGRldi0+aW5mbyA9PSAmZ2V5c2VyMl9pbmZvKSB7CiAJCW1lbXNldChkZXYtPnh5X2N1ciwgMCwgc2l6ZW9mKGRldi0+eHlfY3VyKSk7CiAKIAkJLyoKQEAgLTQzNyw4ICs0OTQsOCBAQAogCQkJCWRldi0+eHlfY3VyW2kgKyAyNF0gPSBkZXYtPmRhdGFbNSAqIGkgKyA0NF07CiAKIAkJCS8qIFkgdmFsdWVzICovCi0JCQlkZXYtPnh5X2N1cltpICsgMjZdID0gZGV2LT5kYXRhWzUgKiBpICsgIDFdOwotCQkJZGV2LT54eV9jdXJbaSArIDM0XSA9IGRldi0+ZGF0YVs1ICogaSArICAzXTsKKwkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGldID0gZGV2LT5kYXRhWzUgKiBpICsgIDFdOworCQkJZGV2LT54eV9jdXJbQVRQX1hTRU5TT1JTICsgaSArIDhdID0gZGV2LT5kYXRhWzUgKiBpICsgM107CiAJCX0KIAl9CiAKQEAgLTQ1MywzMiArNTEwLDggQEAKIAkJbWVtY3B5KGRldi0+eHlfb2xkLCBkZXYtPnh5X2N1ciwgc2l6ZW9mKGRldi0+eHlfb2xkKSk7CiAKIAkJLyogUGVyZm9ybSBzaXplIGRldGVjdGlvbiwgaWYgbm90IGRvbmUgYWxyZWFkeSAqLwotCQlpZiAoIWRldi0+c2l6ZV9kZXRlY3RfZG9uZSkgewotCi0JCQkvKiAxNyIgUG93ZXJib29rcyBoYXZlIGV4dHJhIFggc2Vuc29ycyAqLwotCQkJZm9yIChpID0gKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMiA/IDE1IDogMTYpOwotCQkJICAgICBpIDwgQVRQX1hTRU5TT1JTOyBpKyspIHsKLQkJCQlpZiAoIWRldi0+eHlfY3VyW2ldKQotCQkJCQljb250aW51ZTsKLQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkJImFwcGxldG91Y2g6IDE3XCIgbW9kZWwgZGV0ZWN0ZWQuXG4iKTsKLQotCQkJCWlmIChkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIpCi0JCQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldi0+aW5wdXQsIEFCU19YLAotCQkJCQkJCSAgICAgMCwKLQkJCQkJCQkgICAgICgyMCAtIDEpICoKLQkJCQkJCQkgICAgIEFUUF9YRkFDVCAtIDEsCi0JCQkJCQkJICAgICBBVFBfRlVaWiwgMCk7Ci0JCQkJZWxzZQotCQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYtPmlucHV0LCBBQlNfWCwKLQkJCQkJCQkgICAgIDAsCi0JCQkJCQkJICAgICAoMjYgLSAxKSAqCi0JCQkJCQkJICAgICBBVFBfWEZBQ1QgLSAxLAotCQkJCQkJCSAgICAgQVRQX0ZVWlosIDApOwotCQkJCWJyZWFrOwotCQkJfQotCisJCWlmICh1bmxpa2VseSghZGV2LT5zaXplX2RldGVjdF9kb25lKSkgeworCQkJYXRwX2RldGVjdF9zaXplKGRldik7CiAJCQlkZXYtPnNpemVfZGV0ZWN0X2RvbmUgPSAxOwogCQkJZ290byBleGl0OwogCQl9CkBAIC00OTksMTAgKzUzMiwxMCBAQAogCWRiZ19kdW1wKCJhY2N1bXVsYXRvciIsIGRldi0+eHlfYWNjKTsKIAogCXggPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYywgQVRQX1hTRU5TT1JTLAotCQkJICAgICAgQVRQX1hGQUNULCAmeF96LCAmeF9mKTsKKwkJCSAgICAgIGRldi0+aW5mby0+eGZhY3QsICZ4X3osICZ4X2YpOwogCXkgPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYyArIEFUUF9YU0VOU09SUywgQVRQX1lTRU5TT1JTLAotCQkJICAgICAgQVRQX1lGQUNULCAmeV96LCAmeV9mKTsKLQlrZXkgPSBkZXYtPmRhdGFbZGV2LT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JVVFRPTjsKKwkJCSAgICAgIGRldi0+aW5mby0+eWZhY3QsICZ5X3osICZ5X2YpOworCWtleSA9IGRldi0+ZGF0YVtkZXYtPmluZm8tPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQlVUVE9OOwogCiAJaWYgKHggJiYgeSkgewogCQlpZiAoZGV2LT54X29sZCAhPSAtMSkgewpAQCAtNTgzLDcgKzYxNiw3IEBACiAJZGJnX2R1bXAoInNhbXBsZSIsIGRldi0+eHlfY3VyKTsKIAogCS8qIEp1c3QgdXBkYXRlIHRoZSBiYXNlIHZhbHVlcyAoaS5lLiB0b3VjaHBhZCBpbiB1bnRvdWNoZWQgc3RhdGUpICovCi0JaWYgKGRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQkFTRV9VUERBVEUpIHsKKwlpZiAoZGV2LT5kYXRhW2Rldi0+aW5mby0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CQVNFX1VQREFURSkgewogCiAJCWRwcmludGsoS0VSTl9ERUJVRyAiYXBwbGV0b3VjaDogdXBkYXRlZCBiYXNlIHZhbHVlc1xuIik7CiAKQEAgLTYxMCwxMCArNjQzLDEwIEBACiAJZGJnX2R1bXAoImFjY3VtdWxhdG9yIiwgZGV2LT54eV9hY2MpOwogCiAJeCA9IGF0cF9jYWxjdWxhdGVfYWJzKGRldi0+eHlfYWNjLCBBVFBfWFNFTlNPUlMsCi0JCQkgICAgICBBVFBfWEZBQ1QsICZ4X3osICZ4X2YpOworCQkJICAgICAgZGV2LT5pbmZvLT54ZmFjdCwgJnhfeiwgJnhfZik7CiAJeSA9IGF0cF9jYWxjdWxhdGVfYWJzKGRldi0+eHlfYWNjICsgQVRQX1hTRU5TT1JTLCBBVFBfWVNFTlNPUlMsCi0JCQkgICAgICBBVFBfWUZBQ1QsICZ5X3osICZ5X2YpOwotCWtleSA9IGRldi0+ZGF0YVtkZXYtPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQlVUVE9OOworCQkJICAgICAgZGV2LT5pbmZvLT55ZmFjdCwgJnlfeiwgJnlfZik7CisJa2V5ID0gZGV2LT5kYXRhW2Rldi0+aW5mby0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CVVRUT047CiAKIAlpZiAoeCAmJiB5KSB7CiAJCWlmIChkZXYtPnhfb2xkICE9IC0xKSB7CkBAIC03MDUsNyArNzM4LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRldi0+dWRldjsKIAotCWlmIChkZXYtPnR5cGUgIT0gQVRQX0ZPVU5UQUlOKSB7CisJaWYgKGRldi0+aW5mbyAhPSAmZm91bnRhaW5faW5mbykgewogCQkvKiBzd2l0Y2ggdG8gcmF3IHNlbnNvciBtb2RlICovCiAJCWlmIChhdHBfZ2V5c2VyX2luaXQodWRldikpCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTcyNiw2ICs3NTksNyBAQAogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJaW50IGludF9pbl9lbmRwb2ludEFkZHIgPSAwOwogCWludCBpLCBlcnJvciA9IC1FTk9NRU07CisJY29uc3Qgc3RydWN0IGF0cF9pbmZvICppbmZvID0gKGNvbnN0IHN0cnVjdCBhdHBfaW5mbyAqKWlkLT5kcml2ZXJfaW5mbzsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KIAkvKiB1c2Ugb25seSB0aGUgZmlyc3QgaW50ZXJydXB0LWluIGVuZHBvaW50ICovCkBAIC03NTMsMzUgKzc4NywyMiBAQAogCiAJZGV2LT51ZGV2ID0gdWRldjsKIAlkZXYtPmlucHV0ID0gaW5wdXRfZGV2OwotCWRldi0+dHlwZSA9IGlkLT5kcml2ZXJfaW5mbzsKKwlkZXYtPmluZm8gPSBpbmZvOwogCWRldi0+b3ZlcmZsb3dfd2FybmVkID0gZmFsc2U7Ci0JaWYgKGRldi0+dHlwZSA9PSBBVFBfRk9VTlRBSU4gfHwgZGV2LT50eXBlID09IEFUUF9HRVlTRVIxKQotCQlkZXYtPmRhdGFsZW4gPSA4MTsKLQllbHNlCi0JCWRldi0+ZGF0YWxlbiA9IDY0OwogCiAJZGV2LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT51cmIpCiAJCWdvdG8gZXJyX2ZyZWVfZGV2czsKIAotCWRldi0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sIEdGUF9LRVJORUwsCisJZGV2LT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYtPnVkZXYsIGRldi0+aW5mby0+ZGF0YWxlbiwgR0ZQX0tFUk5FTCwKIAkJCQkgICAgICZkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWRldi0+ZGF0YSkKIAkJZ290byBlcnJfZnJlZV91cmI7CiAKLQkvKiBTZWxlY3QgdGhlIFVTQiBjb21wbGV0ZSAoY2FsbGJhY2spIGZ1bmN0aW9uICovCi0JaWYgKGRldi0+dHlwZSA9PSBBVFBfRk9VTlRBSU4gfHwKLQkgICAgZGV2LT50eXBlID09IEFUUF9HRVlTRVIxIHx8Ci0JICAgIGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikKLQkJdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKLQkJCQkgdXNiX3JjdmludHBpcGUodWRldiwgaW50X2luX2VuZHBvaW50QWRkciksCi0JCQkJIGRldi0+ZGF0YSwgZGV2LT5kYXRhbGVuLAotCQkJCSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwgZGV2LCAxKTsKLQllbHNlCi0JCXVzYl9maWxsX2ludF91cmIoZGV2LT51cmIsIHVkZXYsCi0JCQkJIHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGludF9pbl9lbmRwb2ludEFkZHIpLAotCQkJCSBkZXYtPmRhdGEsIGRldi0+ZGF0YWxlbiwKLQkJCQkgYXRwX2NvbXBsZXRlX2dleXNlcl8zXzQsIGRldiwgMSk7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPnVyYiwgdWRldiwKKwkJCSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBpbnRfaW5fZW5kcG9pbnRBZGRyKSwKKwkJCSBkZXYtPmRhdGEsIGRldi0+aW5mby0+ZGF0YWxlbiwKKwkJCSBkZXYtPmluZm8tPmNhbGxiYWNrLCBkZXYsIDEpOwogCiAJZXJyb3IgPSBhdHBfaGFuZGxlX2dleXNlcihkZXYpOwogCWlmIChlcnJvcikKQEAgLTgwMiwzNSArODIzLDEyIEBACiAKIAlzZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CiAKLQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIzIHx8IGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSNCkgewotCQkvKgotCQkgKiBNYWNCb29rIGhhdmUgMjAgWCBzZW5zb3JzLCAxMCBZIHNlbnNvcnMKLQkJICovCi0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCi0JCQkJICAgICAoKDIwIC0gMSkgKiBBVFBfWEZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKCgxMCAtIDEpICogQVRQX1lGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKLQl9IGVsc2UgaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikgewotCQkvKgotCQkgKiBPY3QgMjAwNSAxNSIgUG93ZXJCb29rcyBoYXZlIDE1IFggc2Vuc29ycywgMTciIGFyZSBkZXRlY3RlZAotCQkgKiBsYXRlci4KLQkJICovCi0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCi0JCQkJICAgICAoKDE1IC0gMSkgKiBBVFBfWEZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKCg5IC0gMSkgKiBBVFBfWUZBQ1QpIC0gMSwgQVRQX0ZVWlosIDApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIDEyIiBhbmQgMTUiIFBvd2VyYm9va3Mgb25seSBoYXZlIDE2IHggc2Vuc29ycywKLQkJICogMTciIG1vZGVscyBhcmUgZGV0ZWN0ZWQgbGF0ZXIuCi0JCSAqLwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLAotCQkJCSAgICAgKDE2IC0gMSkgKiBBVFBfWEZBQ1QgLSAxLAotCQkJCSAgICAgQVRQX0ZVWlosIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLAotCQkJCSAgICAgKEFUUF9ZU0VOU09SUyAtIDEpICogQVRQX1lGQUNUIC0gMSwKLQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKLQl9CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwKKwkJCSAgICAgKGRldi0+aW5mby0+eHNlbnNvcnMgLSAxKSAqIGRldi0+aW5mby0+eGZhY3QgLSAxLAorCQkJICAgICBBVFBfRlVaWiwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKKwkJCSAgICAgKGRldi0+aW5mby0+eXNlbnNvcnMgLSAxKSAqIGRldi0+aW5mby0+eWZhY3QgLSAxLAorCQkJICAgICBBVFBfRlVaWiwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDAsIEFUUF9QUkVTU1VSRSwgMCwgMCk7CiAKIAlzZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CkBAIC04NTIsNyArODUwLDcgQEAKIAlyZXR1cm4gMDsKIAogIGVycl9mcmVlX2J1ZmZlcjoKLQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sCisJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5pbmZvLT5kYXRhbGVuLAogCQkJZGV2LT5kYXRhLCBkZXYtPnVyYi0+dHJhbnNmZXJfZG1hKTsKICBlcnJfZnJlZV91cmI6CiAJdXNiX2ZyZWVfdXJiKGRldi0+dXJiKTsKQEAgLTg3MSw3ICs4NjksNyBAQAogCWlmIChkZXYpIHsKIAkJdXNiX2tpbGxfdXJiKGRldi0+dXJiKTsKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dCk7Ci0JCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIGRldi0+ZGF0YWxlbiwKKwkJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5pbmZvLT5kYXRhbGVuLAogCQkJCWRldi0+ZGF0YSwgZGV2LT51cmItPnRyYW5zZmVyX2RtYSk7CiAJCXVzYl9mcmVlX3VyYihkZXYtPnVyYik7CiAJCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2dwaW9fbW91c2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCmluZGV4IDcyY2Y1ZTMuLjBkYjhkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZ3Bpb19tb3VzZS5jCkBAIC0xNzMsNyArMTczLDcgQEAKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvX21vdXNlIik7CiAKLXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tb3VzZV9kZXZpY2VfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tb3VzZV9kZXZpY2VfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZ3Bpb19tb3VzZV9yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJncGlvX21vdXNlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKaW5kZXggODhmMDRiZi4uODFlNmViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMKQEAgLTQ4LDYgKzQ4LDMwIEBACiBNT0RVTEVfUEFSTV9ERVNDKHJlY2FsaWJfZGVsdGEsCiAJInBhY2tldHMgY29udGFpbmluZyBhIGRlbHRhIHRoaXMgbGFyZ2Ugd2lsbCBjYXVzZSBhIHJlY2FsaWJyYXRpb24uIik7CiAKK3N0YXRpYyBpbnQganVtcHlfZGVsYXkgPSAxMDAwOworbW9kdWxlX3BhcmFtKGp1bXB5X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhqdW1weV9kZWxheSwKKwkiZGVsYXkgKG1zKSBiZWZvcmUgcmVjYWwgYWZ0ZXIganVtcGluZXNzIGRldGVjdGVkIik7CisKK3N0YXRpYyBpbnQgc3Bld19kZWxheSA9IDEwMDA7Cittb2R1bGVfcGFyYW0oc3Bld19kZWxheSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3Bld19kZWxheSwKKwkiZGVsYXkgKG1zKSBiZWZvcmUgcmVjYWwgYWZ0ZXIgcGFja2V0IHNwZXcgZGV0ZWN0ZWQiKTsKKworc3RhdGljIGludCByZWNhbF9ndWFyZF90aW1lID0gMjAwMDsKK21vZHVsZV9wYXJhbShyZWNhbF9ndWFyZF90aW1lLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyZWNhbF9ndWFyZF90aW1lLAorCSJpbnRlcnZhbCAobXMpIGR1cmluZyB3aGljaCByZWNhbCB3aWxsIGJlIHJlc3RhcnRlZCBpZiBwYWNrZXQgcmVjZWl2ZWQiKTsKKworc3RhdGljIGludCBwb3N0X2ludGVycnVwdF9kZWxheSA9IDEwMDA7Cittb2R1bGVfcGFyYW0ocG9zdF9pbnRlcnJ1cHRfZGVsYXksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvc3RfaW50ZXJydXB0X2RlbGF5LAorCSJkZWxheSAobXMpIGJlZm9yZSByZWNhbCBhZnRlciByZWNhbCBpbnRlcnJ1cHQgZGV0ZWN0ZWQiKTsKKworc3RhdGljIGludCBhdXRvcmVjYWwgPSAxOworbW9kdWxlX3BhcmFtKGF1dG9yZWNhbCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXV0b3JlY2FsLCAiZW5hYmxlIHJlY2FsaWJyYXRpb24gaW4gdGhlIGRyaXZlciIpOworCiAvKgogICogV2hlbiB0aGUgdG91Y2hwYWQgZ2V0cyB1bHRyYS1zZW5zaXRpdmUsIG9uZSBjYW4ga2VlcCB0aGVpciBmaW5nZXIgMS8yIgogICogYWJvdmUgdGhlIHBhZCBhbmQgc3RpbGwgaGF2ZSBpdCBzZW5kIHBhY2tldHMuICBUaGlzIGNhdXNlcyBhIGp1bXAgY3Vyc29yCkBAIC02Niw3ICs5MCw3IEBACiAJCS8qIE15IGNhciBnZXRzIGZvcnR5IHJvZHMgdG8gdGhlIGhvZ3NoZWFkIGFuZCB0aGF0J3MgdGhlCiAJCSAqIHdheSBJIGxpa2VzIGl0ISAqLwogCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCi0JCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCQkJbXNlY3NfdG9famlmZmllcyhqdW1weV9kZWxheSkpOwogCX0KIH0KIApAQCAtMTAzLDcgKzEyNyw3IEBACiAJCQloZ3BrX2RiZyhwc21vdXNlLCAicGFja2V0IHNwZXcgZGV0ZWN0ZWQgKCVkLCVkKVxuIiwKIAkJCQkgcHJpdi0+eF90YWxseSwgcHJpdi0+eV90YWxseSk7CiAJCQlwc21vdXNlX3F1ZXVlX3dvcmsocHNtb3VzZSwgJnByaXYtPnJlY2FsaWJfd3EsCi0JCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKHNwZXdfZGVsYXkpKTsKIAkJfQogCQkvKiByZXNldCBldmVyeSAxMDAgcGFja2V0cyAqLwogCQlwcml2LT5jb3VudCA9IDA7CkBAIC0xODEsNyArMjA1LDcgQEAKIAkJCQkgInBhY2tldCBpbnNpZGUgY2FsaWJyYXRpb24gd2luZG93LCAiCiAJCQkJICJxdWV1ZWluZyBhbm90aGVyIHJlY2FsaWJyYXRpb25cbiIpOwogCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhwb3N0X2ludGVycnVwdF9kZWxheSkpOwogCQl9CiAJCXByaXYtPnJlY2FsaWJfd2luZG93ID0gMDsKIAl9CkBAIC0yMzEsNyArMjU1LDcgQEAKIAkgKiBJZiBzb21lb25lJ3MgZmluZ2VyICp3YXMqIG9uIHRoZSB0b3VjaHBhZCwgaXQncyBwcm9iYWJseQogCSAqIG1pc2NhbGlicmF0ZWQuICBTbywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFub3RoZXIgcmVjYWxpYnJhdGlvbgogCSAqLwotCXByaXYtPnJlY2FsaWJfd2luZG93ID0gamlmZmllcyArICBtc2Vjc190b19qaWZmaWVzKDIwMDApOworCXByaXYtPnJlY2FsaWJfd2luZG93ID0gamlmZmllcyArICBtc2Vjc190b19qaWZmaWVzKHJlY2FsX2d1YXJkX3RpbWUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCmluZGV4IGU1MzJjNDguLjMyNjNjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCkBAIC00Niw3ICs0Niw3IEBACiBNT0RVTEVfQVVUSE9SKCJCcmlhbiBTLiBKdWxpbiA8YnJpQGNhbHl4LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihISUxfR0VORVJJQ19OQU1FICIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ci0KK01PRFVMRV9BTElBUygic2VyaW86dHkwM3ByMjVpZDBGZXgqIik7CiAKICNkZWZpbmUgVEFCTEVUX1NJTVVMQVRFU19NT1VTRQkvKiBhbGxvdyB0YWJsZXQgdG8gYmUgdXNlZCBhcyBtb3VzZSAqLwogI3VuZGVmICBUQUJMRVRfQVVUT0FESlVTVAkvKiBhdXRvLWFkanVzdCB2YWxpZCB0YWJsZXQgcmFuZ2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNDVjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHhhOTMwX3Rya2JhbGwuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIFBYQTkzMCB0cmFjayBiYWxsIG1vdXNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogMjAwOC0wMi0yODogWW9uZyBZYW8gPHlhb3lvbmdAbWFydmVsbC5jb20+CisgKiAgICAgICAgICAgICBpbml0aWFsIHZlcnNpb24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvcHhhOTMwX3Rya2JhbGwuaD4KKworLyogVHJhY2tiYWxsIENvbnRyb2xsZXIgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVEJDUgkJKDB4MDAwQykKKyNkZWZpbmUgVEJDTlRSCQkoMHgwMDEwKQorI2RlZmluZSBUQlNCQwkJKDB4MDAxNCkKKworI2RlZmluZSBUQkNSX1RCUlNUCSgxIDw8IDEpCisjZGVmaW5lIFRCQ1JfVEJTQgkoMSA8PCAxMCkKKworI2RlZmluZSBUQkNSX1lfRkxUKG4pCSgoKG4pICYgMHhmKSA8PCA2KQorI2RlZmluZSBUQkNSX1hfRkxUKG4pCSgoKG4pICYgMHhmKSA8PCAyKQorCisjZGVmaW5lIFRCQ05UUl9ZTShuKQkoKChuKSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBUQkNOVFJfWVAobikJKCgobikgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgVEJDTlRSX1hNKG4pCSgoKG4pID4+IDgpICYgMHhmZikKKyNkZWZpbmUgVEJDTlRSX1hQKG4pCSgobikgJiAweGZmKQorCisjZGVmaW5lIFRCU0JDX1RCU0JDCSgweDEpCisKK3N0cnVjdCBweGE5MzBfdHJrYmFsbCB7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJLyogTWVtb3J5IE1hcHBlZCBSZWdpc3RlciAqLworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwgPSBkZXZfaWQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cmtiYWxsLT5pbnB1dDsKKwlpbnQgdGJjbnRyLCB4LCB5OworCisJLyogQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHNvZnR3YXJlIG11c3QgcmVhZCBUQkNOVFIgdHdpY2U6CisJICogaWYgdGhlIHJlYWQgdmFsdWUgaXMgdGhlIHNhbWUsIHRoZSByZWFkaW5nIGlzIHZhbGlkCisJICovCisJdGJjbnRyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDTlRSKTsKKworCWlmICh0YmNudHIgPT0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDTlRSKSkgeworCQl4ID0gKFRCQ05UUl9YUCh0YmNudHIpIC0gVEJDTlRSX1hNKHRiY250cikpIC8gMjsKKwkJeSA9IChUQkNOVFJfWVAodGJjbnRyKSAtIFRCQ05UUl9ZTSh0YmNudHIpKSAvIDI7CisKKwkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dCwgUkVMX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfcmVsKGlucHV0LCBSRUxfWSwgeSk7CisJCWlucHV0X3N5bmMoaW5wdXQpOworCX0KKworCV9fcmF3X3dyaXRlbChUQlNCQ19UQlNCQywgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJTQkMpOworCV9fcmF3X3dyaXRlbCgwLCB0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQlNCQyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEZvciBUQkNSLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgd2hpbGUgdG8gbWFrZSBzdXJlIGl0IGhhcyBiZWVuIG1vZGlmaWVkLiAqLworc3RhdGljIGludCB3cml0ZV90YmNyKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCwgaW50IHYpCit7CisJaW50IGkgPSAxMDA7CisKKwlfX3Jhd193cml0ZWwodiwgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisKKwl3aGlsZSAoaS0tKSB7CisJCWlmIChfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKSA9PSB2KQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCXByX2VycigiJXM6IHRpbWVkIG91dCB3cml0aW5nIFRCQ1IoJXgpIVxuIiwgX19mdW5jX18sIHYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhOTMwX3Rya2JhbGxfY29uZmlnKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCkKK3sKKwl1aW50MzJfdCB0YmNyOworCisJLyogQWNjb3JkaW5nIHRvIHNwZWMsIG5lZWQgdG8gd3JpdGUgdGhlIGZpbHRlcnMgb2YgeCx5IHRvIDB4ZiBmaXJzdCEgKi8KKwl0YmNyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyIHwgVEJDUl9YX0ZMVCgweGYpIHwgVEJDUl9ZX0ZMVCgweGYpKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIFRCQ1JfWF9GTFQodHJrYmFsbC0+cGRhdGEtPnhfZmlsdGVyKSB8CisJCQkgICAgVEJDUl9ZX0ZMVCh0cmtiYWxsLT5wZGF0YS0+eV9maWx0ZXIpKTsKKworCS8qIEFjY29yZGluZyB0byBzcGVjLCBzZXQgVEJDUl9UQlJTVCBmaXJzdCwgYmVmb3JlIGNsZWFyaW5nIGl0ISAqLworCXRiY3IgPSBfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIHRiY3IgfCBUQkNSX1RCUlNUKTsKKwl3cml0ZV90YmNyKHRya2JhbGwsIHRiY3IgJiB+VEJDUl9UQlJTVCk7CisKKwlfX3Jhd193cml0ZWwoVEJTQkNfVEJTQkMsIHRya2JhbGwtPm1taW9fYmFzZSArIFRCU0JDKTsKKwlfX3Jhd193cml0ZWwoMCwgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJTQkMpOworCisJcHJfZGVidWcoIiVzOiBmaW5hbCBUQkNSPSV4IVxuIiwgX19mdW5jX18sCisJCSBfX3Jhd19yZWFkbCh0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQkNSKSk7Cit9CisKK3N0YXRpYyBpbnQgcHhhOTMwX3Rya2JhbGxfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXB4YTkzMF90cmtiYWxsX2NvbmZpZyh0cmtiYWxsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGE5MzBfdHJrYmFsbF9kaXNhYmxlKHN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCkKK3sKKwl1aW50MzJfdCB0YmNyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisKKwkvKiBIZWxkIGluIHJlc2V0LCBnYXRlIHRoZSAzMi1LSHogaW5wdXQgY2xvY2sgb2ZmICovCisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyIHwgVEJDUl9UQlJTVCk7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTkzMF90cmtiYWxsX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJcHhhOTMwX3Rya2JhbGxfZGlzYWJsZSh0cmtiYWxsKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHhhOTMwX3Rya2JhbGxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGw7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgZXJyb3I7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdHJrYmFsbCBpcnFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByZWdpc3RlciBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXRya2JhbGwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRya2JhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJrYmFsbC0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXRya2JhbGwtPnBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgZGVmaW5lZFxuIik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJdHJrYmFsbC0+bW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCF0cmtiYWxsLT5tbWlvX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvcmVtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJZXJyb3IgPSAtRU5YSU87CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIGhlbGQgdGhlIG1vZHVsZSBpbiByZXNldCwgd2lsbCBiZSBlbmFibGVkIGluIG9wZW4oKSAqLworCXB4YTkzMF90cmtiYWxsX2Rpc2FibGUodHJrYmFsbCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgcHhhOTMwX3Rya2JhbGxfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJICAgIHBkZXYtPm5hbWUsIHRya2JhbGwpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lvOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRya2JhbGwpOworCisJaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX2ZyZWVfaXJxOworCX0KKworCWlucHV0LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dC0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0LT5vcGVuID0gcHhhOTMwX3Rya2JhbGxfb3BlbjsKKwlpbnB1dC0+Y2xvc2UgPSBweGE5MzBfdHJrYmFsbF9jbG9zZTsKKwlpbnB1dC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIHRya2JhbGwpOworCisJdHJrYmFsbC0+aW5wdXQgPSBpbnB1dDsKKworCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0LCBFVl9SRUwsIFJFTF9YKTsKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dCwgRVZfUkVMLCBSRUxfWSk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lucHV0OworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfZnJlZV9pbnB1dDoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CitmYWlsZWRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCB0cmtiYWxsKTsKK2ZhaWxlZF9mcmVlX2lvOgorCWlvdW5tYXAodHJrYmFsbC0+bW1pb19iYXNlKTsKK2ZhaWxlZDoKKwlrZnJlZSh0cmtiYWxsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBweGE5MzBfdHJrYmFsbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRya2JhbGwtPmlucHV0KTsKKwlmcmVlX2lycShpcnEsIHRya2JhbGwpOworCWlvdW5tYXAodHJrYmFsbC0+bW1pb19iYXNlKTsKKwlrZnJlZSh0cmtiYWxsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGE5MzBfdHJrYmFsbF9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInB4YTkzMC10cmtiYWxsIiwKKwl9LAorCS5wcm9iZQkJPSBweGE5MzBfdHJrYmFsbF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YTkzMF90cmtiYWxsX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGE5MzBfdHJrYmFsbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHhhOTMwX3Rya2JhbGxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHB4YTkzMF90cmtiYWxsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhOTMwX3Rya2JhbGxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHhhOTMwX3Rya2JhbGxfaW5pdCk7Cittb2R1bGVfZXhpdChweGE5MzBfdHJrYmFsbF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiWW9uZyBZYW8gPHlhb3lvbmdAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTkzMCBUcmFja2JhbGwgTW91c2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCBkMzQ5YzRhNWUuLjg2NWZjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwpAQCAtNDQ1LDEyICs0NDUsMTQgQEAKIAogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVE9PTF9XSURUSCwgZmluZ2VyX3dpZHRoKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBudW1fZmluZ2VycyA9PSAxKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRE9VQkxFVEFQLCBudW1fZmluZ2VycyA9PSAyKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfVFJJUExFVEFQLCBudW1fZmluZ2VycyA9PSAzKTsKLQogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgaHcubGVmdCk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgaHcucmlnaHQpOwogCisJaWYgKFNZTl9DQVBfTVVMVElGSU5HRVIocHJpdi0+Y2FwYWJpbGl0aWVzKSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRE9VQkxFVEFQLCBudW1fZmluZ2VycyA9PSAyKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1RSSVBMRVRBUCwgbnVtX2ZpbmdlcnMgPT0gMyk7CisJfQorCiAJaWYgKFNZTl9DQVBfTUlERExFX0JVVFRPTihwcml2LT5jYXBhYmlsaXRpZXMpKQogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgaHcubWlkZGxlKTsKIApAQCAtNTQzLDEyICs1NDUsMTQgQEAKIAlzZXRfYml0KEVWX0tFWSwgZGV2LT5ldmJpdCk7CiAJc2V0X2JpdChCVE5fVE9VQ0gsIGRldi0+a2V5Yml0KTsKIAlzZXRfYml0KEJUTl9UT09MX0ZJTkdFUiwgZGV2LT5rZXliaXQpOwotCXNldF9iaXQoQlROX1RPT0xfRE9VQkxFVEFQLCBkZXYtPmtleWJpdCk7Ci0Jc2V0X2JpdChCVE5fVE9PTF9UUklQTEVUQVAsIGRldi0+a2V5Yml0KTsKLQogCXNldF9iaXQoQlROX0xFRlQsIGRldi0+a2V5Yml0KTsKIAlzZXRfYml0KEJUTl9SSUdIVCwgZGV2LT5rZXliaXQpOwogCisJaWYgKFNZTl9DQVBfTVVMVElGSU5HRVIocHJpdi0+Y2FwYWJpbGl0aWVzKSkgeworCQlzZXRfYml0KEJUTl9UT09MX0RPVUJMRVRBUCwgZGV2LT5rZXliaXQpOworCQlzZXRfYml0KEJUTl9UT09MX1RSSVBMRVRBUCwgZGV2LT5rZXliaXQpOworCX0KKwogCWlmIChTWU5fQ0FQX01JRERMRV9CVVRUT04ocHJpdi0+Y2FwYWJpbGl0aWVzKSkKIAkJc2V0X2JpdChCVE5fTUlERExFLCBkZXYtPmtleWJpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwppbmRleCBkOGMwNTZmLi5lZjk5YTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCkBAIC04NzgsOCArODc4LDcgQEAKIAltb3VzZWRldi0+aGFuZGxlLmhhbmRsZXIgPSBoYW5kbGVyOwogCW1vdXNlZGV2LT5oYW5kbGUucHJpdmF0ZSA9IG1vdXNlZGV2OwogCi0Jc3RybGNweShtb3VzZWRldi0+ZGV2LmJ1c19pZCwgbW91c2VkZXYtPm5hbWUsCi0JCXNpemVvZihtb3VzZWRldi0+ZGV2LmJ1c19pZCkpOworCWRldl9zZXRfbmFtZSgmbW91c2VkZXYtPmRldiwgbW91c2VkZXYtPm5hbWUpOwogCW1vdXNlZGV2LT5kZXYuY2xhc3MgPSAmaW5wdXRfY2xhc3M7CiAJaWYgKGRldikKIAkJbW91c2VkZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCmluZGV4IDM3NTg2YTYuLjdiYTlmMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jCkBAIC05MzQsNiArOTM0LDcgQEAKIAkJc25wcmludGYobWxjX3NlcmlvLT5uYW1lLCBzaXplb2YobWxjX3NlcmlvLT5uYW1lKS0xLCAiSElMX1NFUklPJWQiLCBpKTsKIAkJc25wcmludGYobWxjX3NlcmlvLT5waHlzLCBzaXplb2YobWxjX3NlcmlvLT5waHlzKS0xLCAiSElMJWQiLCBpKTsKIAkJbWxjX3NlcmlvLT5pZAkJCT0gaGlsX21sY19zZXJpb19pZDsKKwkJbWxjX3NlcmlvLT5pZC5pZAkJPSBpOyAvKiBISUwgcG9ydCBuby4gKi8KIAkJbWxjX3NlcmlvLT53cml0ZQkJPSBoaWxfbWxjX3NlcmlvX3dyaXRlOwogCQltbGNfc2VyaW8tPm9wZW4JCQk9IGhpbF9tbGNfc2VyaW9fb3BlbjsKIAkJbWxjX3NlcmlvLT5jbG9zZQkJPSBoaWxfbWxjX3NlcmlvX2Nsb3NlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKaW5kZXggMjllNjg2My4uNmZhMmRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCkBAIC0xNDMsNiArMTQzLDE0IEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIk02MDYiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmlkZW50ID0gIkdpZ2FieXRlIE05MTIiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkdJR0FCWVRFIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk05MTIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMDEiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApAQCAtMzUxLDYgKzM1OSwxMyBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJIRUw4MEkiKSwKIAkJfSwKIAl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgVm9zdHJvIDE1MTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8xNTEwIiksCisJCX0sCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCmluZGV4IDJiMzA0YzIuLjY3MjQ4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYwpAQCAtMjYyLDkgKzI2MiwxNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQUzJfUkVUX05BSzoKLQkJCXBzMmRldi0+bmFrID0gMTsKKwkJCXBzMmRldi0+ZmxhZ3MgfD0gUFMyX0ZMQUdfTkFLOworCQkJcHMyZGV2LT5uYWsgPSBQUzJfUkVUX05BSzsKIAkJCWJyZWFrOwogCisJCWNhc2UgUFMyX1JFVF9FUlI6CisJCQlpZiAocHMyZGV2LT5mbGFncyAmIFBTMl9GTEFHX05BSykgeworCQkJCXBzMmRldi0+ZmxhZ3MgJj0gflBTMl9GTEFHX05BSzsKKwkJCQlwczJkZXYtPm5hayA9IFBTMl9SRVRfRVJSOworCQkJCWJyZWFrOworCQkJfQorCiAJCS8qCiAJCSAqIFdvcmthcm91bmQgZm9yIG1pY2Ugd2hpY2ggZG9uJ3QgQUNLIHRoZSBHZXQgSUQgY29tbWFuZC4KIAkJICogVGhlc2UgYXJlIHZhbGlkIG1vdXNlIElEcyB0aGF0IHdlIHJlY29nbml6ZS4KQEAgLTI4Miw4ICsyOTAsMTEgQEAKIAl9CiAKIAotCWlmICghcHMyZGV2LT5uYWsgJiYgcHMyZGV2LT5jbWRjbnQpCi0JCXBzMmRldi0+ZmxhZ3MgfD0gUFMyX0ZMQUdfQ01EIHwgUFMyX0ZMQUdfQ01EMTsKKwlpZiAoIXBzMmRldi0+bmFrKSB7CisJCXBzMmRldi0+ZmxhZ3MgJj0gflBTMl9GTEFHX05BSzsKKwkJaWYgKHBzMmRldi0+Y21kY250KQorCQkJcHMyZGV2LT5mbGFncyB8PSBQUzJfRkxBR19DTUQgfCBQUzJfRkxBR19DTUQxOworCX0KIAogCXBzMmRldi0+ZmxhZ3MgJj0gflBTMl9GTEFHX0FDSzsKIAl3YWtlX3VwKCZwczJkZXYtPndhaXQpOwpAQCAtMzI5LDYgKzM0MCw3IEBACiAJaWYgKHBzMmRldi0+ZmxhZ3MgJiAoUFMyX0ZMQUdfQUNLIHwgUFMyX0ZMQUdfQ01EKSkKIAkJd2FrZV91cCgmcHMyZGV2LT53YWl0KTsKIAotCXBzMmRldi0+ZmxhZ3MgPSAwOworCS8qIHJlc2V0IGFsbCBmbGFncyBleGNlcHQgbGFzdCBuYWNrICovCisJcHMyZGV2LT5mbGFncyAmPSBQUzJfRkxBR19OQUs7CiB9CiBFWFBPUlRfU1lNQk9MKHBzMl9jbWRfYWJvcnRlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3BjaXBzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9wY2lwczIuYwppbmRleCAxYjQwNGY5Li4xZGFjYmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3BjaXBzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vcGNpcHMyLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCXNlcmlvLT5vcGVuCQk9IHBjaXBzMl9vcGVuOwogCXNlcmlvLT5jbG9zZQkJPSBwY2lwczJfY2xvc2U7CiAJc3RybGNweShzZXJpby0+bmFtZSwgcGNpX25hbWUoZGV2KSwgc2l6ZW9mKHNlcmlvLT5uYW1lKSk7Ci0Jc3RybGNweShzZXJpby0+cGh5cywgZGV2LT5kZXYuYnVzX2lkLCBzaXplb2Yoc2VyaW8tPnBoeXMpKTsKKwlzdHJsY3B5KHNlcmlvLT5waHlzLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBzaXplb2Yoc2VyaW8tPnBoeXMpKTsKIAlzZXJpby0+cG9ydF9kYXRhCT0gcHMyaWY7CiAJc2VyaW8tPmRldi5wYXJlbnQJPSAmZGV2LT5kZXY7CiAJcHMyaWYtPmlvCQk9IHNlcmlvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IDJmMTJkNjAuLmJjMDMzMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTU0Niw4ICs1NDYsOCBAQAogCXNwaW5fbG9ja19pbml0KCZzZXJpby0+bG9jayk7CiAJbXV0ZXhfaW5pdCgmc2VyaW8tPmRydl9tdXRleCk7CiAJZGV2aWNlX2luaXRpYWxpemUoJnNlcmlvLT5kZXYpOwotCXNucHJpbnRmKHNlcmlvLT5kZXYuYnVzX2lkLCBzaXplb2Yoc2VyaW8tPmRldi5idXNfaWQpLAotCQkgInNlcmlvJWxkIiwgKGxvbmcpYXRvbWljX2luY19yZXR1cm4oJnNlcmlvX25vKSAtIDEpOworCWRldl9zZXRfbmFtZSgmc2VyaW8tPmRldiwgInNlcmlvJWxkIiwKKwkJCShsb25nKWF0b21pY19pbmNfcmV0dXJuKCZzZXJpb19ubykgLSAxKTsKIAlzZXJpby0+ZGV2LmJ1cyA9ICZzZXJpb19idXM7CiAJc2VyaW8tPmRldi5yZWxlYXNlID0gc2VyaW9fcmVsZWFzZV9wb3J0OwogCWlmIChzZXJpby0+cGFyZW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8veGlsaW54X3BzMi5jCmluZGV4IDc2NTAwNzguLmViYjIyZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8veGlsaW54X3BzMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8veGlsaW54X3BzMi5jCkBAIC01OCwyMyArNTgsMjAgQEAKIAogLyogTWFzayBmb3IgYWxsIHRoZSBSZWNlaXZlIEludGVycnVwdHMgKi8KICNkZWZpbmUgWFBTMl9JUElYUl9SWF9BTEwJKFhQUzJfSVBJWFJfUlhfT1ZGIHwgWFBTMl9JUElYUl9SWF9FUlIgfCAgXAotCQkJCQlYUFMyX0lQSVhSX1JYX0ZVTEwpCisJCQkJIFhQUzJfSVBJWFJfUlhfRlVMTCkKIAogLyogTWFzayBmb3IgYWxsIHRoZSBJbnRlcnJ1cHRzICovCiAjZGVmaW5lIFhQUzJfSVBJWFJfQUxMCQkoWFBTMl9JUElYUl9UWF9BTEwgfCBYUFMyX0lQSVhSX1JYX0FMTCB8ICBcCi0JCQkJCVhQUzJfSVBJWFJfV0RUX1RPVVQpCisJCQkJIFhQUzJfSVBJWFJfV0RUX1RPVVQpCiAKIC8qIEdsb2JhbCBJbnRlcnJ1cHQgRW5hYmxlIG1hc2sgKi8KICNkZWZpbmUgWFBTMl9HSUVSX0dJRV9NQVNLCTB4ODAwMDAwMDAKIAogc3RydWN0IHhwczJkYXRhIHsKIAlpbnQgaXJxOwotCXUzMiBwaHlzX2FkZHI7Ci0JdTMyIHJlbWFwX3NpemU7CiAJc3BpbmxvY2tfdCBsb2NrOwotCXU4IHJ4YjsJCQkJLyogUnggYnVmZmVyICovCiAJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3M7CS8qIHZpcnQuIGFkZHJlc3Mgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KLQl1bnNpZ25lZCBpbnQgZGZsOworCXVuc2lnbmVkIGludCBmbGFnczsKIAlzdHJ1Y3Qgc2VyaW8gc2VyaW87CQkvKiBzZXJpbyAqLwogfTsKIApAQCAtODIsOCArNzksMTMgQEAKIC8qIFhQUyBQUy8yIGRhdGEgdHJhbnNtaXNzaW9uIGNhbGxzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogeHBzMl9yZWN2KCkgd2lsbCBhdHRlbXB0IHRvIHJlY2VpdmUgYSBieXRlIG9mIGRhdGEgZnJvbSB0aGUgUFMvMiBwb3J0LgorLyoqCisgKiB4cHMyX3JlY3YoKSAtIGF0dGVtcHRzIHRvIHJlY2VpdmUgYSBieXRlIGZyb20gdGhlIFBTLzIgcG9ydC4KKyAqIEBkcnZkYXRhOglwb2ludGVyIHRvIHBzMiBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICogQGJ5dGU6CWFkZHJlc3Mgd2hlcmUgdGhlIHJlYWQgZGF0YSB3aWxsIGJlIGNvcGllZAorICoKKyAqIElmIHRoZXJlIGlzIGFueSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgUFMvMiByZWNlaXZlciwgdGhpcyBmdW5jdGlvbnMgcmVhZHMKKyAqIHRoZSBkYXRhLCBvdGhlcndpc2UgaXQgcmV0dXJucyBlcnJvci4KICAqLwogc3RhdGljIGludCB4cHMyX3JlY3Yoc3RydWN0IHhwczJkYXRhICpkcnZkYXRhLCB1OCAqYnl0ZSkKIHsKQEAgLTExNiwzMyArMTE4LDI3IEBACiAKIAkvKiBDaGVjayB3aGljaCBpbnRlcnJ1cHQgaXMgYWN0aXZlICovCiAJaWYgKGludHJfc3IgJiBYUFMyX0lQSVhSX1JYX09WRikKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlY2VpdmUgb3ZlcnJ1biBlcnJvclxuIiwKLQkJCWRydmRhdGEtPnNlcmlvLm5hbWUpOworCQlkZXZfd2FybihkcnZkYXRhLT5zZXJpby5kZXYucGFyZW50LCAicmVjZWl2ZSBvdmVycnVuIGVycm9yXG4iKTsKIAogCWlmIChpbnRyX3NyICYgWFBTMl9JUElYUl9SWF9FUlIpCi0JCWRydmRhdGEtPmRmbCB8PSBTRVJJT19QQVJJVFk7CisJCWRydmRhdGEtPmZsYWdzIHw9IFNFUklPX1BBUklUWTsKIAogCWlmIChpbnRyX3NyICYgKFhQUzJfSVBJWFJfVFhfTk9BQ0sgfCBYUFMyX0lQSVhSX1dEVF9UT1VUKSkKLQkJZHJ2ZGF0YS0+ZGZsIHw9IFNFUklPX1RJTUVPVVQ7CisJCWRydmRhdGEtPmZsYWdzIHw9IFNFUklPX1RJTUVPVVQ7CiAKIAlpZiAoaW50cl9zciAmIFhQUzJfSVBJWFJfUlhfRlVMTCkgewotCQlzdGF0dXMgPSB4cHMyX3JlY3YoZHJ2ZGF0YSwgJmRydmRhdGEtPnJ4Yik7CisJCXN0YXR1cyA9IHhwczJfcmVjdihkcnZkYXRhLCAmYyk7CiAKIAkJLyogRXJyb3IsIGlmIGEgYnl0ZSBpcyBub3QgcmVjZWl2ZWQgKi8KIAkJaWYgKHN0YXR1cykgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIiVzOiB3cm9uZyByY3ZkIGJ5dGUgY291bnQgKCVkKVxuIiwKLQkJCQlkcnZkYXRhLT5zZXJpby5uYW1lLCBzdGF0dXMpOworCQkJZGV2X2VycihkcnZkYXRhLT5zZXJpby5kZXYucGFyZW50LAorCQkJCSJ3cm9uZyByY3ZkIGJ5dGUgY291bnQgKCVkKVxuIiwgc3RhdHVzKTsKIAkJfSBlbHNlIHsKLQkJCWMgPSBkcnZkYXRhLT5yeGI7Ci0JCQlzZXJpb19pbnRlcnJ1cHQoJmRydmRhdGEtPnNlcmlvLCBjLCBkcnZkYXRhLT5kZmwpOwotCQkJZHJ2ZGF0YS0+ZGZsID0gMDsKKwkJCXNlcmlvX2ludGVycnVwdCgmZHJ2ZGF0YS0+c2VyaW8sIGMsIGRydmRhdGEtPmZsYWdzKTsKKwkJCWRydmRhdGEtPmZsYWdzID0gMDsKIAkJfQogCX0KIAotCWlmIChpbnRyX3NyICYgWFBTMl9JUElYUl9UWF9BQ0spCi0JCWRydmRhdGEtPmRmbCA9IDA7Ci0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTE1MCw4ICsxNDYsMTUgQEAKIC8qIHNlcmlvIGNhbGxiYWNrcyAqLwogLyoqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBzeHBzMl93cml0ZSgpIHNlbmRzIGEgYnl0ZSBvdXQgdGhyb3VnaCB0aGUgUFMvMiBpbnRlcmZhY2UuCisvKioKKyAqIHN4cHMyX3dyaXRlKCkgLSBzZW5kcyBhIGJ5dGUgb3V0IHRocm91Z2ggdGhlIFBTLzIgcG9ydC4KKyAqIEBwc2VyaW86CXBvaW50ZXIgdG8gdGhlIHNlcmlvIHN0cnVjdHVyZSBvZiB0aGUgUFMvMiBwb3J0CisgKiBAYzoJCWRhdGEgdGhhdCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBQUy8yIHBvcnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgUFMvMiB0cmFuc21pdHRlciBpcyBlbXB0eSBhbmQgc2VuZHMgYSBieXRlLgorICogT3RoZXJ3aXNlIGl0IHJldHVybnMgZXJyb3IuIFRyYW5zbWlzc2lvbiBmYWlscyBvbmx5IHdoZW4gbm90aGluZyBpcyBjb25uZWN0ZWQKKyAqIHRvIHRoZSBQUy8yIHBvcnQuIFRoYXRzIHdoeSwgd2UgZG8gbm90IHRyeSB0byByZXNlbmQgdGhlIGRhdGEgaW4gY2FzZSBvZiBhCisgKiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50IHN4cHMyX3dyaXRlKHN0cnVjdCBzZXJpbyAqcHNlcmlvLCB1bnNpZ25lZCBjaGFyIGMpCiB7CkBAIC0xNzQsMzMgKzE3NywzOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBzeHBzMl9vcGVuKCkgaXMgY2FsbGVkIHdoZW4gYSBwb3J0IGlzIG9wZW4gYnkgdGhlIGhpZ2hlciBsYXllci4KKy8qKgorICogc3hwczJfb3BlbigpIC0gY2FsbGVkIHdoZW4gYSBwb3J0IGlzIG9wZW5lZCBieSB0aGUgaGlnaGVyIGxheWVyLgorICogQHBzZXJpbzoJcG9pbnRlciB0byB0aGUgc2VyaW8gc3RydWN0dXJlIG9mIHRoZSBQUy8yIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgaXJxIGFuZCBlbmFibGVzIGludGVycnVwdHMgZm9yIHRoZSBQUy8yIGRldmljZS4KICAqLwogc3RhdGljIGludCBzeHBzMl9vcGVuKHN0cnVjdCBzZXJpbyAqcHNlcmlvKQogewogCXN0cnVjdCB4cHMyZGF0YSAqZHJ2ZGF0YSA9IHBzZXJpby0+cG9ydF9kYXRhOwotCWludCByZXR2YWw7CisJaW50IGVycm9yOworCXU4IGM7CiAKLQlyZXR2YWwgPSByZXF1ZXN0X2lycShkcnZkYXRhLT5pcnEsICZ4cHMyX2ludGVycnVwdCwgMCwKKwllcnJvciA9IHJlcXVlc3RfaXJxKGRydmRhdGEtPmlycSwgJnhwczJfaW50ZXJydXB0LCAwLAogCQkJCURSSVZFUl9OQU1FLCBkcnZkYXRhKTsKLQlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHQgJWRcbiIsCi0JCQlkcnZkYXRhLT5zZXJpby5uYW1lLCBkcnZkYXRhLT5pcnEpOwotCQlyZXR1cm4gcmV0dmFsOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRydmRhdGEtPnNlcmlvLmRldi5wYXJlbnQsCisJCQkiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0ICVkXG4iLCBkcnZkYXRhLT5pcnEpOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJLyogc3RhcnQgcmVjZXB0aW9uIGJ5IGVuYWJsaW5nIHRoZSBpbnRlcnJ1cHRzICovCiAJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWFBTMl9HSUVSX09GRlNFVCwgWFBTMl9HSUVSX0dJRV9NQVNLKTsKIAlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYUFMyX0lQSUVSX09GRlNFVCwgWFBTMl9JUElYUl9SWF9BTEwpOwotCSh2b2lkKXhwczJfcmVjdihkcnZkYXRhLCAmZHJ2ZGF0YS0+cnhiKTsKKwkodm9pZCl4cHMyX3JlY3YoZHJ2ZGF0YSwgJmMpOwogCiAJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCiB9CiAKLS8qCi0gKiBzeHBzMl9jbG9zZSgpIGZyZWVzIHRoZSBpbnRlcnJ1cHQuCisvKioKKyAqIHN4cHMyX2Nsb3NlKCkgLSBmcmVlcyB0aGUgaW50ZXJydXB0LgorICogQHBzZXJpbzoJcG9pbnRlciB0byB0aGUgc2VyaW8gc3RydWN0dXJlIG9mIHRoZSBQUy8yIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIGlycSBhbmQgZGlzYWJsZXMgaW50ZXJydXB0cyBmb3IgdGhlIFBTLzIgZGV2aWNlLgogICovCiBzdGF0aWMgdm9pZCBzeHBzMl9jbG9zZShzdHJ1Y3Qgc2VyaW8gKnBzZXJpbykKIHsKQEAgLTIxMiwyNCArMjIxLDQxIEBACiAJZnJlZV9pcnEoZHJ2ZGF0YS0+aXJxLCBkcnZkYXRhKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmljZSBzZXR1cCBjb2RlICovCi0vKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IHhwczJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3NfcmVzLAotCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKmlycV9yZXMpCisvKioKKyAqIHhwczJfb2ZfcHJvYmUgLSBwcm9iZSBtZXRob2QgZm9yIHRoZSBQUy8yIGRldmljZS4KKyAqIEBvZl9kZXY6CXBvaW50ZXIgdG8gT0YgZGV2aWNlIHN0cnVjdHVyZQorICogQG1hdGNoOglwb2ludGVyIHRvIHRoZSBzdHVjdHVyZSB1c2VkIGZvciBtYXRjaGluZyBhIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvYmVzIHRoZSBQUy8yIGRldmljZSBpbiB0aGUgZGV2aWNlIHRyZWUuCisgKiBJdCBpbml0aWFsaXplcyB0aGUgZHJpdmVyIGRhdGEgc3RydWN0dXJlIGFuZCB0aGUgaGFyZHdhcmUuCisgKiBJdCByZXR1cm5zIDAsIGlmIHRoZSBkcml2ZXIgaXMgYm91bmQgdG8gdGhlIFBTLzIgZGV2aWNlLCBvciBhIG5lZ2F0aXZlCisgKiB2YWx1ZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgeHBzMl9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKKwlzdHJ1Y3QgcmVzb3VyY2Ugcl9pcnE7IC8qIEludGVycnVwdCByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgcmVzb3VyY2Ugcl9tZW07IC8qIElPIG1lbSByZXNvdXJjZXMgKi8KIAlzdHJ1Y3QgeHBzMmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKLQl1bnNpZ25lZCBsb25nIHJlbWFwX3NpemU7Ci0JaW50IHJldHZhbDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZkZXYtPmRldjsKKwlyZXNvdXJjZV9zaXplX3QgcmVtYXBfc2l6ZSwgcGh5c19hZGRyOworCWludCBlcnJvcjsKIAotCWlmICghZGV2KQotCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXZfaW5mbyhkZXYsICJEZXZpY2UgVHJlZSBQcm9iaW5nIFwnJXNcJ1xuIiwKKwkJCW9mZGV2LT5ub2RlLT5uYW1lKTsKIAotCWlmICghcmVnc19yZXMgfHwgIWlycV9yZXMpIHsKLQkJZGV2X2VycihkZXYsICJJTyByZXNvdXJjZShzKSBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBHZXQgaW9zcGFjZSBmb3IgdGhlIGRldmljZSAqLworCWVycm9yID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfbWVtKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogR2V0IElSUSBmb3IgdGhlIGRldmljZSAqLworCWlmIChvZl9pcnFfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsICZyX2lycSkgPT0gTk9fSVJRKSB7CisJCWRldl9lcnIoZGV2LCAibm8gSVJRIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZHJ2ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4cHMyZGF0YSksIEdGUF9LRVJORUwpOwpAQCAtMjQxLDI0ICsyNjcsMjMgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZkYXRhKTsKIAogCXNwaW5fbG9ja19pbml0KCZkcnZkYXRhLT5sb2NrKTsKLQlkcnZkYXRhLT5pcnEgPSBpcnFfcmVzLT5zdGFydDsKKwlkcnZkYXRhLT5pcnEgPSByX2lycS5zdGFydDsKIAotCXJlbWFwX3NpemUgPSByZWdzX3Jlcy0+ZW5kIC0gcmVnc19yZXMtPnN0YXJ0ICsgMTsKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZWdzX3Jlcy0+c3RhcnQsIHJlbWFwX3NpemUsIERSSVZFUl9OQU1FKSkgewotCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGxvY2sgbWVtb3J5IHJlZ2lvbiBhdCAweCUwOFhcbiIsCi0JCQkodW5zaWduZWQgaW50KXJlZ3NfcmVzLT5zdGFydCk7Ci0JCXJldHZhbCA9IC1FQlVTWTsKKwlwaHlzX2FkZHIgPSByX21lbS5zdGFydDsKKwlyZW1hcF9zaXplID0gcl9tZW0uZW5kIC0gcl9tZW0uc3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNfYWRkciwgcmVtYXBfc2l6ZSwgRFJJVkVSX05BTUUpKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgbG9jayBtZW1vcnkgcmVnaW9uIGF0IDB4JTA4bGxYXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzX2FkZHIpOworCQllcnJvciA9IC1FQlVTWTsKIAkJZ290byBmYWlsZWQxOwogCX0KIAogCS8qIEZpbGwgaW4gY29uZmlndXJhdGlvbiBkYXRhIGFuZCBhZGQgdGhlbSB0byB0aGUgbGlzdCAqLwotCWRydmRhdGEtPnBoeXNfYWRkciA9IHJlZ3NfcmVzLT5zdGFydDsKLQlkcnZkYXRhLT5yZW1hcF9zaXplID0gcmVtYXBfc2l6ZTsKLQlkcnZkYXRhLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHJlZ3NfcmVzLT5zdGFydCwgcmVtYXBfc2l6ZSk7CisJZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChwaHlzX2FkZHIsIHJlbWFwX3NpemUpOwogCWlmIChkcnZkYXRhLT5iYXNlX2FkZHJlc3MgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGlvcmVtYXAgbWVtb3J5IGF0IDB4JTA4WFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpcmVnc19yZXMtPnN0YXJ0KTsKLQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBpb3JlbWFwIG1lbW9yeSBhdCAweCUwOGxsWFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c19hZGRyKTsKKwkJZXJyb3IgPSAtRUZBVUxUOwogCQlnb3RvIGZhaWxlZDI7CiAJfQogCkBAIC0yNjksOCArMjk0LDkgQEAKIAkgKiB3ZSBoYXZlIHRoZSBQUzIgaW4gYSBnb29kIHN0YXRlICovCiAJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWFBTMl9TUlNUX09GRlNFVCwgWFBTMl9TUlNUX1JFU0VUKTsKIAotCWRldl9pbmZvKGRldiwgIlhpbGlueCBQUzIgYXQgMHglMDhYIG1hcHBlZCB0byAweCVwLCBpcnE9JWRcbiIsCi0JCWRydmRhdGEtPnBoeXNfYWRkciwgZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzLCBkcnZkYXRhLT5pcnEpOworCWRldl9pbmZvKGRldiwgIlhpbGlueCBQUzIgYXQgMHglMDhsbFggbWFwcGVkIHRvIDB4JXAsIGlycT0lZFxuIiwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c19hZGRyLCBkcnZkYXRhLT5iYXNlX2FkZHJlc3MsCisJCSBkcnZkYXRhLT5pcnEpOwogCiAJc2VyaW8gPSAmZHJ2ZGF0YS0+c2VyaW87CiAJc2VyaW8tPmlkLnR5cGUgPSBTRVJJT184MDQyOwpAQCAtMjgwLDcxICszMDYsNTEgQEAKIAlzZXJpby0+cG9ydF9kYXRhID0gZHJ2ZGF0YTsKIAlzZXJpby0+ZGV2LnBhcmVudCA9IGRldjsKIAlzbnByaW50ZihzZXJpby0+bmFtZSwgc2l6ZW9mKHNlcmlvLT5uYW1lKSwKLQkJICJYaWxpbnggWFBTIFBTLzIgYXQgJTA4WCIsIGRydmRhdGEtPnBoeXNfYWRkcik7CisJCSAiWGlsaW54IFhQUyBQUy8yIGF0ICUwOGxsWCIsICh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c19hZGRyKTsKIAlzbnByaW50ZihzZXJpby0+cGh5cywgc2l6ZW9mKHNlcmlvLT5waHlzKSwKLQkJICJ4aWxpbnhwczIvc2VyaW8gYXQgJTA4WCIsIGRydmRhdGEtPnBoeXNfYWRkcik7CisJCSAieGlsaW54cHMyL3NlcmlvIGF0ICUwOGxsWCIsICh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c19hZGRyKTsKKwogCXNlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8pOwogCiAJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCiAKIGZhaWxlZDI6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlZ3NfcmVzLT5zdGFydCwgcmVtYXBfc2l6ZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBoeXNfYWRkciwgcmVtYXBfc2l6ZSk7CiBmYWlsZWQxOgogCWtmcmVlKGRydmRhdGEpOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCi0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBPRiBQbGF0Zm9ybSBCdXMgU3VwcG9ydCAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBfX2RldmluaXQgeHBzMl9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwgY29uc3Qgc3RydWN0Ci0JCQkJICAgb2ZfZGV2aWNlX2lkICogbWF0Y2gpCi17Ci0Jc3RydWN0IHJlc291cmNlIHJfaXJxOyAvKiBJbnRlcnJ1cHQgcmVzb3VyY2VzICovCi0Jc3RydWN0IHJlc291cmNlIHJfbWVtOyAvKiBJTyBtZW0gcmVzb3VyY2VzICovCi0JaW50IHJjID0gMDsKLQotCXByaW50ayhLRVJOX0lORk8gIkRldmljZSBUcmVlIFByb2JpbmcgXCclc1wnXG4iLAotCQkJb2ZkZXYtPm5vZGUtPm5hbWUpOwotCi0JLyogR2V0IGlvc3BhY2UgZm9yIHRoZSBkZXZpY2UgKi8KLQlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsICZyX21lbSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJpbnZhbGlkIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogR2V0IElSUSBmb3IgdGhlIGRldmljZSAqLwotCXJjID0gb2ZfaXJxX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCAmcl9pcnEpOwotCWlmIChyYyA9PSBOT19JUlEpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgIm5vIElSUSBmb3VuZFxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyZXR1cm4geHBzMl9zZXR1cCgmb2ZkZXYtPmRldiwgJnJfbWVtLCAmcl9pcnEpOwotfQotCisvKioKKyAqIHhwczJfb2ZfcmVtb3ZlIC0gdW5iaW5kcyB0aGUgZHJpdmVyIGZyb20gdGhlIFBTLzIgZGV2aWNlLgorICogQG9mX2RldjoJcG9pbnRlciB0byBPRiBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgYSBkZXZpY2UgaXMgcGh5c2ljYWxseSByZW1vdmVkIGZyb20gdGhlIHN5c3RlbSBvcgorICogaWYgdGhlIGRyaXZlciBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQuIEl0IGZyZWVzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvCisgKiB0aGUgZGV2aWNlLgorICovCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCB4cHMyX29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJm9mX2Rldi0+ZGV2OwotCXN0cnVjdCB4cHMyZGF0YSAqZHJ2ZGF0YTsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgeHBzMmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2Ugcl9tZW07IC8qIElPIG1lbSByZXNvdXJjZXMgKi8KIAogCXNlcmlvX3VucmVnaXN0ZXJfcG9ydCgmZHJ2ZGF0YS0+c2VyaW8pOwogCWlvdW5tYXAoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oZHJ2ZGF0YS0+cGh5c19hZGRyLCBkcnZkYXRhLT5yZW1hcF9zaXplKTsKKworCS8qIEdldCBpb3NwYWNlIG9mIHRoZSBkZXZpY2UgKi8KKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShvZl9kZXYtPm5vZGUsIDAsICZyX21lbSkpCisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBhZGRyZXNzXG4iKTsKKwllbHNlCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyX21lbS5zdGFydCwgcl9tZW0uZW5kIC0gcl9tZW0uc3RhcnQgKyAxKTsKKwogCWtmcmVlKGRydmRhdGEpOwogCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKLQlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKIH0KIAogLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L2d0Y28uYyBiL2RyaXZlcnMvaW5wdXQvdGFibGV0L2d0Y28uYwppbmRleCA1NTI0ZTAxLi4yZTE4YTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC9ndGNvLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvZ3Rjby5jCkBAIC04NzcsNyArODc3LDcgQEAKIAlkYmcoIm51bSBlbmRwb2ludHM6ICAgICAlZCIsIHVzYmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyk7CiAJZGJnKCJpbnRlcmZhY2UgY2xhc3M6ICAgJWQiLCB1c2JpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CiAJZGJnKCJlbmRwb2ludDogYXR0cmlidXRlOjB4JXggdHlwZToweCV4IiwgZW5kcG9pbnQtPmJtQXR0cmlidXRlcywgZW5kcG9pbnQtPmJEZXNjcmlwdG9yVHlwZSk7Ci0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVuZHBvaW50KSkKIAkJZGJnKCJlbmRwb2ludDogd2UgaGF2ZSBpbnRlcnJ1cHQgZW5kcG9pbnRcbiIpOwogCiAJZGJnKCJlbmRwb2ludCBleHRyYSBsZW46JWQgIiwgdXNiaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmV4dHJhbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKaW5kZXggOGRjOGQxZS4uMjYzODgxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKQEAgLTUzNSw3ICs1MzUsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgd2Fjb21fdHBjX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwgdm9pZCAqd2NvbWJvKQorc3RhdGljIGludCB3YWNvbV90cGNfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCB2b2lkICp3Y29tYm8pCiB7CiAJY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwogCWludCBwcm94ID0gMCwgcHJlc3N1cmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggM2QxYWI4Zi4uYmI2NDg2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtNTgsNiArNTgsMTQgQEAKIAkgIE5PVEU6IHRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQsIHRyeSBlbmFibGUgU1BJIGFuZCBnZW5lcmljCiAJICBBRFM3ODQ2LWJhc2VkIHRvdWNoc2NyZWVuIGRyaXZlci4KIAorY29uZmlnIFRPVUNIU0NSRUVOX0RBOTAzNAorCXRyaXN0YXRlICJUb3VjaHNjcmVlbiBzdXBwb3J0IGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzQiCisJZGVwZW5kcyBvbiBQTUlDX0RBOTAzWAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBzdXBwb3J0IGZvciB0aGUgdG91Y2hzY3JlZW4gZm91bmQKKwkgIG9uIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzNCBQTUlDLgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fRlVKSVRTVQogCXRyaXN0YXRlICJGdWppdHN1IHNlcmlhbCB0b3VjaHNjcmVlbiIKIAlzZWxlY3QgU0VSSU8KQEAgLTk1LDYgKzEwMywxOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZWxvLgogCitjb25maWcgVE9VQ0hTQ1JFRU5fV0FDT01fVzgwMDEKKwl0cmlzdGF0ZSAiV2Fjb20gVzgwMDEgcGVuYWJsZWQgc2VyaWFsIHRvdWNoc2NyZWVuIgorCXNlbGVjdCBTRVJJTworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gV2Fjb20gVzgwMDEgcGVuYWJsZWQgc2VyaWFsIHRvdWNoc2NyZWVuCisJICBjb25uZWN0ZWQgdG8geW91ciBzeXN0ZW0uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhY29tX3c4MDAxLgorCisKIGNvbmZpZyBUT1VDSFNDUkVFTl9NVE9VQ0gKIAl0cmlzdGF0ZSAiTWljcm9Ub3VjaCBzZXJpYWwgdG91Y2hzY3JlZW5zIgogCXNlbGVjdCBTRVJJTwpAQCAtMzc2LDQgKzM5NywxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdG91Y2hpdDIxMy4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1RTQzIwMDcKKwl0cmlzdGF0ZSAiVFNDMjAwNyBiYXNlZCB0b3VjaHNjcmVlbnMiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVFNDMjAwNyBiYXNlZCB0b3VjaHNjcmVlbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHNjMjAwNy4KKwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCmluZGV4IDE1Y2YyOTAuLmQzMzc1YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQpAQCAtMjUsOCArMjUsMTEgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzKQkrPSB0b3VjaGl0MjEzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTikJKz0gdG91Y2h3aW4ubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDcpCSs9IHRzYzIwMDcubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDApCSs9IHVjYjE0MDBfdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dBQ09NX1c4MDAxKQkrPSB3YWNvbV93ODAwMS5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYKQkrPSB3bTk3eHgtdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0RBOTAzNCkJKz0gZGE5MDM0LXRzLm8KIHdtOTd4eC10cy0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MDUpCSs9IHdtOTcwNS5vCiB3bTk3eHgtdHMtJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEyKQkrPSB3bTk3MTIubwogd205N3h4LXRzLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcxMykJKz0gd205NzEzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggZTFlY2U4OS4uN2MyN2M4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGFkczc4NDYgKnRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgaTsKIAogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmaSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTU5LDcgKzU1OSw3IEBACiAJaWYgKHBhY2tldC0+dGMuaWdub3JlIHx8IFJ0ID4gdHMtPnByZXNzdXJlX21heCkgewogI2lmZGVmIFZFUkJPU0UKIAkJcHJfZGVidWcoIiVzOiBpZ25vcmVkICVkIHByZXNzdXJlICVkXG4iLAotCQkJdHMtPnNwaS0+ZGV2LmJ1c19pZCwgcGFja2V0LT50Yy5pZ25vcmUsIFJ0KTsKKwkJCWRldl9uYW1lKCZ0cy0+c3BpLT5kZXYpLCBwYWNrZXQtPnRjLmlnbm9yZSwgUnQpOwogI2VuZGlmCiAJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKIAkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOwpAQCAtOTQ3LDcgKzk0Nyw3IEBACiAJCXRzLT5wZW5pcnFfcmVjaGVja19kZWxheV91c2VjcyA9CiAJCQkJcGRhdGEtPnBlbmlycV9yZWNoZWNrX2RlbGF5X3VzZWNzOwogCi0Jc25wcmludGYodHMtPnBoeXMsIHNpemVvZih0cy0+cGh5cyksICIlcy9pbnB1dDAiLCBzcGktPmRldi5idXNfaWQpOworCXNucHJpbnRmKHRzLT5waHlzLCBzaXplb2YodHMtPnBoeXMpLCAiJXMvaW5wdXQwIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSAiQURTNzg0eCBUb3VjaHNjcmVlbiI7CiAJaW5wdXRfZGV2LT5waHlzID0gdHMtPnBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2RhOTAzNC10cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9kYTkwMzQtdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQyZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9kYTkwMzQtdHMuYwpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIFRvdWNoc2NyZWVuIGRyaXZlciBmb3IgRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDM0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqCUZlbmd3ZWkgWWluIDxmZW5nd2VpLnlpbkBtYXJ2ZWxsLmNvbT4KKyAqCUVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgorCisjZGVmaW5lIERBOTAzNF9NQU5VQUxfQ1RSTAkweDUwCisjZGVmaW5lIERBOTAzNF9MRE9fQURDX0VOCSgxIDw8IDQpCisKKyNkZWZpbmUgREE5MDM0X0FVVE9fQ1RSTDEJMHg1MQorCisjZGVmaW5lIERBOTAzNF9BVVRPX0NUUkwyCTB4NTIKKyNkZWZpbmUgREE5MDM0X0FVVE9fVFNJX0VOCSgxIDw8IDMpCisjZGVmaW5lIERBOTAzNF9QRU5fREVURUNUCSgxIDw8IDQpCisKKyNkZWZpbmUgREE5MDM0X1RTSV9DVFJMMQkweDUzCisjZGVmaW5lIERBOTAzNF9UU0lfQ1RSTDIJMHg1NAorI2RlZmluZSBEQTkwMzRfVFNJX1hfTVNCCTB4NmMKKyNkZWZpbmUgREE5MDM0X1RTSV9ZX01TQgkweDZkCisjZGVmaW5lIERBOTAzNF9UU0lfWFlfTFNCCTB4NmUKKworZW51bSB7CisJU1RBVEVfSURMRSwJLyogd2FpdCBmb3IgcGVuZG93biAqLworCVNUQVRFX0JVU1ksCS8qIFRTSSBidXN5IHNhbXBsaW5nICovCisJU1RBVEVfU1RPUCwJLyogc2FtcGxlIGF2YWlsYWJsZSAqLworCVNUQVRFX1dBSVQsCS8qIFdhaXQgdG8gc3RhcnQgbmV4dCBzYW1wbGUgKi8KK307CisKK2VudW0geworCUVWRU5UX1BFTl9ET1dOLAorCUVWRU5UX1BFTl9VUCwKKwlFVkVOVF9UU0lfUkVBRFksCisJRVZFTlRfVElNRURPVVQsCit9OworCitzdHJ1Y3QgZGE5MDM0X3RvdWNoIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGE5MDM0X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXRzaV93b3JrOworCXN0cnVjdCBub3RpZmllcl9ibG9jawlub3RpZmllcjsKKworCWludAlzdGF0ZTsKKworCWludAlpbnRlcnZhbF9tczsKKwlpbnQJeF9pbnZlcnRlZDsKKwlpbnQJeV9pbnZlcnRlZDsKKworCWludAlsYXN0X3g7CisJaW50CWxhc3RfeTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Blbl9kb3duKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCXJldHVybiBkYTkwM3hfcXVlcnlfc3RhdHVzKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfU1RBVFVTX1BFTl9ET1dOKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGV0ZWN0X3Blbl9kb3duKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoLCBpbnQgb24pCit7CisJaWYgKG9uKQorCQlyZXR1cm4gZGE5MDN4X3NldF9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJCURBOTAzNF9BVVRPX0NUUkwyLCBEQTkwMzRfUEVOX0RFVEVDVCk7CisJZWxzZQorCQlyZXR1cm4gZGE5MDN4X2Nscl9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJCURBOTAzNF9BVVRPX0NUUkwyLCBEQTkwMzRfUEVOX0RFVEVDVCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90c2koc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJdWludDhfdCBfeCwgX3ksIF92OworCWludCByZXQ7CisKKwlyZXQgPSBkYTkwM3hfcmVhZCh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1RTSV9YX01TQiwgJl94KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZGE5MDN4X3JlYWQodG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9UU0lfWV9NU0IsICZfeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRhOTAzeF9yZWFkKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfVFNJX1hZX0xTQiwgJl92KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdG91Y2gtPmxhc3RfeCA9ICgoX3ggPDwgMikgJiAweDNmYykgfCAoX3YgJiAweDMpOworCXRvdWNoLT5sYXN0X3kgPSAoKF95IDw8IDIpICYgMHgzZmMpIHwgKChfdiAmIDB4YykgPj4gMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RhcnRfdHNpKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCXJldHVybiBkYTkwM3hfc2V0X2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQlEQTkwMzRfQVVUT19DVFJMMiwgREE5MDM0X0FVVE9fVFNJX0VOKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RvcF90c2koc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJcmV0dXJuIGRhOTAzeF9jbHJfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCURBOTAzNF9BVVRPX0NUUkwyLCBEQTkwMzRfQVVUT19UU0lfRU4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwb3J0X3Blbl9kb3duKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCWludCB4ID0gdG91Y2gtPmxhc3RfeDsKKwlpbnQgeSA9IHRvdWNoLT5sYXN0X3k7CisKKwl4ICY9IDB4ZmZmOworCWlmICh0b3VjaC0+eF9pbnZlcnRlZCkKKwkJeCA9IDEwMjQgLSB4OworCXkgJj0gMHhmZmY7CisJaWYgKHRvdWNoLT55X2ludmVydGVkKQorCQl5ID0gMTAyNCAtIHk7CisKKwlpbnB1dF9yZXBvcnRfYWJzKHRvdWNoLT5pbnB1dF9kZXYsIEFCU19YLCB4KTsKKwlpbnB1dF9yZXBvcnRfYWJzKHRvdWNoLT5pbnB1dF9kZXYsIEFCU19ZLCB5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KHRvdWNoLT5pbnB1dF9kZXYsIEJUTl9UT1VDSCwgMSk7CisKKwlpbnB1dF9zeW5jKHRvdWNoLT5pbnB1dF9kZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwb3J0X3Blbl91cChzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwlpbnB1dF9yZXBvcnRfa2V5KHRvdWNoLT5pbnB1dF9kZXYsIEJUTl9UT1VDSCwgMCk7CisJaW5wdXRfc3luYyh0b3VjaC0+aW5wdXRfZGV2KTsKK30KKworc3RhdGljIHZvaWQgZGE5MDM0X2V2ZW50X2hhbmRsZXIoc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gsIGludCBldmVudCkKK3sKKwlpbnQgZXJyOworCisJc3dpdGNoICh0b3VjaC0+c3RhdGUpIHsKKwljYXNlIFNUQVRFX0lETEU6CisJCWlmIChldmVudCAhPSBFVkVOVF9QRU5fRE9XTikKKwkJCWJyZWFrOworCisJCS8qIEVuYWJsZSBhdXRvIG1lYXN1cmVtZW50IG9mIHRoZSBUU0ksIHRoaXMgd2lsbAorCQkgKiBhdXRvbWF0aWNhbGx5IGRpc2FibGUgcGVuIGRvd24gZGV0ZWN0aW9uCisJCSAqLworCQllcnIgPSBzdGFydF90c2kodG91Y2gpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcmVzZXQ7CisKKwkJdG91Y2gtPnN0YXRlID0gU1RBVEVfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX0JVU1k6CisJCWlmIChldmVudCAhPSBFVkVOVF9UU0lfUkVBRFkpCisJCQlicmVhazsKKworCQllcnIgPSByZWFkX3RzaSh0b3VjaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZXNldDsKKworCQkvKiBEaXNhYmxlIGF1dG8gbWVhc3VyZW1lbnQgb2YgdGhlIFRTSSwgc28gdGhhdAorCQkgKiBwZW4gZG93biBzdGF0dXMgd2lsbCBiZSBhdmFpbGFibGUKKwkJICovCisJCWVyciA9IHN0b3BfdHNpKHRvdWNoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3Jlc2V0OworCisJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX1NUT1A7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9TVE9QOgorCQlpZiAoZXZlbnQgPT0gRVZFTlRfUEVOX0RPV04pIHsKKwkJCXJlcG9ydF9wZW5fZG93bih0b3VjaCk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRvdWNoLT50c2lfd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKHRvdWNoLT5pbnRlcnZhbF9tcykpOworCQkJdG91Y2gtPnN0YXRlID0gU1RBVEVfV0FJVDsKKwkJfQorCisJCWlmIChldmVudCA9PSBFVkVOVF9QRU5fVVApIHsKKwkJCXJlcG9ydF9wZW5fdXAodG91Y2gpOworCQkJdG91Y2gtPnN0YXRlID0gU1RBVEVfSURMRTsKKwkJfQorCisJCWlucHV0X3N5bmModG91Y2gtPmlucHV0X2Rldik7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9XQUlUOgorCQlpZiAoZXZlbnQgIT0gRVZFTlRfVElNRURPVVQpCisJCQlicmVhazsKKworCQlpZiAoaXNfcGVuX2Rvd24odG91Y2gpKSB7CisJCQlzdGFydF90c2kodG91Y2gpOworCQkJdG91Y2gtPnN0YXRlID0gU1RBVEVfQlVTWTsKKwkJfSBlbHNlCisJCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9JRExFOworCQlicmVhazsKKwl9CisJcmV0dXJuOworCitlcnJfcmVzZXQ6CisJdG91Y2gtPnN0YXRlID0gU1RBVEVfSURMRTsKKwlzdG9wX3RzaSh0b3VjaCk7CisJZGV0ZWN0X3Blbl9kb3duKHRvdWNoLCAxKTsKK30KKworc3RhdGljIHZvaWQgZGE5MDM0X3RzaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGE5MDM0X3RvdWNoLCB0c2lfd29yay53b3JrKTsKKworCWRhOTAzNF9ldmVudF9oYW5kbGVyKHRvdWNoLCBFVkVOVF9USU1FRE9VVCk7Cit9CisKK3N0YXRpYyBpbnQgZGE5MDM0X3RvdWNoX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2ggPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBkYTkwMzRfdG91Y2gsIG5vdGlmaWVyKTsKKworCWlmIChldmVudCAmIERBOTAzNF9FVkVOVF9QRU5fRE9XTikgeworCQlpZiAoaXNfcGVuX2Rvd24odG91Y2gpKQorCQkJZGE5MDM0X2V2ZW50X2hhbmRsZXIodG91Y2gsIEVWRU5UX1BFTl9ET1dOKTsKKwkJZWxzZQorCQkJZGE5MDM0X2V2ZW50X2hhbmRsZXIodG91Y2gsIEVWRU5UX1BFTl9VUCk7CisJfQorCisJaWYgKGV2ZW50ICYgREE5MDM0X0VWRU5UX1RTSV9SRUFEWSkKKwkJZGE5MDM0X2V2ZW50X2hhbmRsZXIodG91Y2gsIEVWRU5UX1RTSV9SRUFEWSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYTkwMzRfdG91Y2hfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2ggPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBkYTkwM3hfcmVnaXN0ZXJfbm90aWZpZXIodG91Y2gtPmRhOTAzNF9kZXYsICZ0b3VjaC0+bm90aWZpZXIsCisJCQlEQTkwMzRfRVZFTlRfUEVOX0RPV04gfCBEQTkwMzRfRVZFTlRfVFNJX1JFQURZKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogRW5hYmxlIEFEQyBMRE8gKi8KKwlyZXQgPSBkYTkwM3hfc2V0X2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQlEQTkwMzRfTUFOVUFMX0NUUkwsIERBOTAzNF9MRE9fQURDX0VOKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVFNJX0RFTEFZOiAzIHNsb3RzLCBUU0lfU0tJUDogMyBzbG90cyAqLworCXJldCA9IGRhOTAzeF93cml0ZSh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1RTSV9DVFJMMSwgMHgxYik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRhOTAzeF93cml0ZSh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1RTSV9DVFJMMiwgMHgwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJZGV0ZWN0X3Blbl9kb3duKHRvdWNoLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzRfdG91Y2hfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRhOTAzeF91bnJlZ2lzdGVyX25vdGlmaWVyKHRvdWNoLT5kYTkwMzRfZGV2LCAmdG91Y2gtPm5vdGlmaWVyLAorCQkJREE5MDM0X0VWRU5UX1BFTl9ET1dOIHwgREE5MDM0X0VWRU5UX1RTSV9SRUFEWSk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRvdWNoLT50c2lfd29yayk7CisKKwl0b3VjaC0+c3RhdGUgPSBTVEFURV9JRExFOworCXN0b3BfdHNpKHRvdWNoKTsKKwlkZXRlY3RfcGVuX2Rvd24odG91Y2gsIDApOworCisJLyogRGlzYWJsZSBBREMgTERPICovCisJZGE5MDN4X2Nscl9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJREE5MDM0X01BTlVBTF9DVFJMLCBEQTkwMzRfTERPX0FEQ19FTik7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgZGE5MDM0X3RvdWNoX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRhOTAzNF90b3VjaF9wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IHJldDsKKworCXRvdWNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhOTAzNF90b3VjaCksIEdGUF9LRVJORUwpOworCWlmICh0b3VjaCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXRvdWNoLT5kYTkwMzRfZGV2ID0gcGRldi0+ZGV2LnBhcmVudDsKKworCWlmIChwZGF0YSkgeworCQl0b3VjaC0+aW50ZXJ2YWxfbXMJPSBwZGF0YS0+aW50ZXJ2YWxfbXM7CisJCXRvdWNoLT54X2ludmVydGVkCT0gcGRhdGEtPnhfaW52ZXJ0ZWQ7CisJCXRvdWNoLT55X2ludmVydGVkCT0gcGRhdGEtPnlfaW52ZXJ0ZWQ7CisJfSBlbHNlCisJCS8qIGZhbGxiYWNrIGludG8gZGVmYXVsdCAqLworCQl0b3VjaC0+aW50ZXJ2YWxfbXMJPSAxMDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZ0b3VjaC0+dHNpX3dvcmssIGRhOTAzNF90c2lfd29yayk7CisJdG91Y2gtPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBkYTkwMzRfdG91Y2hfbm90aWZpZXI7CisKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV90b3VjaDsKKwl9CisKKwlpbnB1dF9kZXYtPm5hbWUJCT0gcGRldi0+bmFtZTsKKwlpbnB1dF9kZXYtPm9wZW4JCT0gZGE5MDM0X3RvdWNoX29wZW47CisJaW5wdXRfZGV2LT5jbG9zZQk9IGRhOTAzNF90b3VjaF9jbG9zZTsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQJPSAmcGRldi0+ZGV2OworCisJX19zZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEFCU19YLCBpbnB1dF9kZXYtPmFic2JpdCk7CisJX19zZXRfYml0KEFCU19ZLCBpbnB1dF9kZXYtPmFic2JpdCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwgMTAyMywgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgMTAyMywgMCwgMCk7CisKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwlfX3NldF9iaXQoQlROX1RPVUNILCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwl0b3VjaC0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgdG91Y2gpOworCisJcmV0ID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9pbnB1dDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRvdWNoKTsKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaW5wdXQ6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKK2Vycl9mcmVlX3RvdWNoOgorCWtmcmVlKHRvdWNoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkYTkwMzRfdG91Y2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2ggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRvdWNoLT5pbnB1dF9kZXYpOworCWtmcmVlKHRvdWNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkYTkwMzRfdG91Y2hfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImRhOTAzNC10b3VjaCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGRhOTAzNF90b3VjaF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRhOTAzNF90b3VjaF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGE5MDM0X3RvdWNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkYTkwMzRfdG91Y2hfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGRhOTAzNF90b3VjaF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGRhOTAzNF90b3VjaF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRhOTAzNF90b3VjaF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZGE5MDM0X3RvdWNoX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRvdWNoc2NyZWVuIGRyaXZlciBmb3IgRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDM0Iik7CitNT0RVTEVfQVVUSE9SKCJFcmljIE1pYW8gPGVyaWMubWlhb0BtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06ZGE5MDM0LXRvdWNoIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NWRjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RzYzIwMDcuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIGRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE10ZWtWaXNpb24gQ28uLCBMdGQuCisgKglLd2FuZ3dvbyBMZWUgPGt3bGVlQG10ZWt2aXNpb24uY29tPgorICoKKyAqIFVzaW5nIGNvZGUgZnJvbToKKyAqICAtIGFkczc4NDYuYworICoJQ29weXJpZ2h0IChjKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKglDb3B5cmlnaHQgKGMpIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqICAtIGNvcmdpX3RzLmMKKyAqCUNvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKiAgLSBvbWFwX3RzLltoY10sIGFkczc4NDYuaCwgdHNfb3NrLmMKKyAqCUNvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlCisgKglDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCUNvcHlyaWdodCAoQykgMjAwNSBEaXJrIEJlaG1lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy90c2MyMDA3Lmg+CisKKyNkZWZpbmUgVFNfUE9MTF9ERUxBWQkoMTAgKiAxMDAwKQkvKiBucyBkZWxheSBiZWZvcmUgdGhlIGZpcnN0IHNhbXBsZSAqLworI2RlZmluZSBUU19QT0xMX1BFUklPRAkoNSAqIDEwMDApCS8qIG5zIGRlbGF5IGJldHdlZW4gc2FtcGxlcyAqLworCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9URU1QMAkJKDB4MCA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfQVVYCQkoMHgyIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9URU1QMQkJKDB4NCA8PCA0KQorI2RlZmluZSBUU0MyMDA3X0FDVElWQVRFX1hOCQkoMHg4IDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfQUNUSVZBVEVfWU4JCSgweDkgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19BQ1RJVkFURV9ZUF9YTgkJKDB4YSA8PCA0KQorI2RlZmluZSBUU0MyMDA3X1NFVFVQCQkJKDB4YiA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfWAkJKDB4YyA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfWQkJKDB4ZCA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfWjEJCSgweGUgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1oyCQkoMHhmIDw8IDQpCisKKyNkZWZpbmUgVFNDMjAwN19QT1dFUl9PRkZfSVJRX0VOCSgweDAgPDwgMikKKyNkZWZpbmUgVFNDMjAwN19BRENfT05fSVJRX0RJUzAJCSgweDEgPDwgMikKKyNkZWZpbmUgVFNDMjAwN19BRENfT0ZGX0lSUV9FTgkJKDB4MiA8PCAyKQorI2RlZmluZSBUU0MyMDA3X0FEQ19PTl9JUlFfRElTMQkJKDB4MyA8PCAyKQorCisjZGVmaW5lIFRTQzIwMDdfMTJCSVQJCQkoMHgwIDw8IDEpCisjZGVmaW5lIFRTQzIwMDdfOEJJVAkJCSgweDEgPDwgMSkKKworI2RlZmluZQlNQVhfMTJCSVQJCQkoKDEgPDwgMTIpIC0gMSkKKworI2RlZmluZSBBRENfT05fMTJCSVQJKFRTQzIwMDdfMTJCSVQgfCBUU0MyMDA3X0FEQ19PTl9JUlFfRElTMCkKKworI2RlZmluZSBSRUFEX1kJCShBRENfT05fMTJCSVQgfCBUU0MyMDA3X01FQVNVUkVfWSkKKyNkZWZpbmUgUkVBRF9aMQkJKEFEQ19PTl8xMkJJVCB8IFRTQzIwMDdfTUVBU1VSRV9aMSkKKyNkZWZpbmUgUkVBRF9aMgkJKEFEQ19PTl8xMkJJVCB8IFRTQzIwMDdfTUVBU1VSRV9aMikKKyNkZWZpbmUgUkVBRF9YCQkoQURDX09OXzEyQklUIHwgVFNDMjAwN19NRUFTVVJFX1gpCisjZGVmaW5lIFBXUkRPV04JCShUU0MyMDA3XzEyQklUIHwgVFNDMjAwN19QT1dFUl9PRkZfSVJRX0VOKQorCitzdHJ1Y3QgdHNfZXZlbnQgeworCXUxNgl4OworCXUxNgl5OworCXUxNgl6MSwgejI7Cit9OworCitzdHJ1Y3QgdHNjMjAwNyB7CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXQ7CisJY2hhcgkJCXBoeXNbMzJdOworCXN0cnVjdCBocnRpbWVyCQl0aW1lcjsKKwlzdHJ1Y3QgdHNfZXZlbnQJCXRjOworCisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwl1MTYJCQltb2RlbDsKKwl1MTYJCQl4X3BsYXRlX29obXM7CisKKwl1bnNpZ25lZAkJcGVuZG93bjsKKwlpbnQJCQlpcnE7CisKKwlpbnQJCQkoKmdldF9wZW5kb3duX3N0YXRlKSh2b2lkKTsKKwl2b2lkCQkJKCpjbGVhcl9wZW5pcnEpKHZvaWQpOworfTsKKworc3RhdGljIGlubGluZSBpbnQgdHNjMjAwN194ZmVyKHN0cnVjdCB0c2MyMDA3ICp0c2MsIHU4IGNtZCkKK3sKKwlzMzIgZGF0YTsKKwl1MTYgdmFsOworCisJZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSh0c2MtPmNsaWVudCwgY21kKTsKKwlpZiAoZGF0YSA8IDApIHsKKwkJZGV2X2VycigmdHNjLT5jbGllbnQtPmRldiwgImkyYyBpbyBlcnJvcjogJWRcbiIsIGRhdGEpOworCQlyZXR1cm4gZGF0YTsKKwl9CisKKwkvKiBUaGUgcHJvdG9jb2wgYW5kIHJhdyBkYXRhIGZvcm1hdCBmcm9tIGkyYyBpbnRlcmZhY2U6CisJICogUyBBZGRyIFdyIFtBXSBDb21tIFtBXSBTIEFkZHIgUmQgW0FdIFtEYXRhTG93XSBBIFtEYXRhSGlnaF0gTkEgUAorCSAqIFdoZXJlIERhdGFMb3cgaGFzIFtEMTEtRDRdLCBEYXRhSGlnaCBoYXMgW0QzLUQwIDw8IDQgfCBEdW1teSA0Yml0XS4KKwkgKi8KKwl2YWwgPSBzd2FiMTYoZGF0YSkgPj4gNDsKKworCWRldl9kYmcoJnRzYy0+Y2xpZW50LT5kZXYsICJkYXRhOiAweCV4LCB2YWw6IDB4JXhcbiIsIGRhdGEsIHZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB0c2MyMDA3X3NlbmRfZXZlbnQodm9pZCAqdHNjKQoreworCXN0cnVjdCB0c2MyMDA3CSp0cyA9IHRzYzsKKwl1MzIJCXJ0OworCXUxNgkJeCwgeSwgejEsIHoyOworCisJeCA9IHRzLT50Yy54OworCXkgPSB0cy0+dGMueTsKKwl6MSA9IHRzLT50Yy56MTsKKwl6MiA9IHRzLT50Yy56MjsKKworCS8qIHJhbmdlIGZpbHRlcmluZyAqLworCWlmICh4ID09IE1BWF8xMkJJVCkKKwkJeCA9IDA7CisKKwlpZiAobGlrZWx5KHggJiYgejEpKSB7CisJCS8qIGNvbXB1dGUgdG91Y2ggcHJlc3N1cmUgcmVzaXN0YW5jZSB1c2luZyBlcXVhdGlvbiAjMSAqLworCQlydCA9IHoyOworCQlydCAtPSB6MTsKKwkJcnQgKj0geDsKKwkJcnQgKj0gdHMtPnhfcGxhdGVfb2htczsKKwkJcnQgLz0gejE7CisJCXJ0ID0gKHJ0ICsgMjA0NykgPj4gMTI7CisJfSBlbHNlCisJCXJ0ID0gMDsKKworCS8qIFNhbXBsZSBmb3VuZCBpbmNvbnNpc3RlbnQgYnkgZGVib3VuY2luZyBvciBwcmVzc3VyZSBpcyBiZXlvbmQKKwkgKiB0aGUgbWF4aW11bS4gRG9uJ3QgcmVwb3J0IGl0IHRvIHVzZXIgc3BhY2UsIHJlcGVhdCBhdCBsZWFzdAorCSAqIG9uY2UgbW9yZSB0aGUgbWVhc3VyZW1lbnQKKwkgKi8KKwlpZiAocnQgPiBNQVhfMTJCSVQpIHsKKwkJZGV2X2RiZygmdHMtPmNsaWVudC0+ZGV2LCAiaWdub3JlZCBwcmVzc3VyZSAlZFxuIiwgcnQpOworCisJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOworCQlyZXR1cm47CisJfQorCisJLyogTk9URTogV2UgY2FuJ3QgcmVseSBvbiB0aGUgcHJlc3N1cmUgdG8gZGV0ZXJtaW5lIHRoZSBwZW4gZG93bgorCSAqIHN0YXRlLCBldmVuIHRoaXMgY29udHJvbGxlciBoYXMgYSBwcmVzc3VyZSBzZW5zb3IuICBUaGUgcHJlc3N1cmUKKwkgKiB2YWx1ZSBjYW4gZmx1Y3R1YXRlIGZvciBxdWl0ZSBhIHdoaWxlIGFmdGVyIGxpZnRpbmcgdGhlIHBlbiBhbmQKKwkgKiBpbiBzb21lIGNhc2VzIG1heSBub3QgZXZlbiBzZXR0bGUgYXQgdGhlIGV4cGVjdGVkIHZhbHVlLgorCSAqCisJICogVGhlIG9ubHkgc2FmZSB3YXkgdG8gY2hlY2sgZm9yIHRoZSBwZW4gdXAgY29uZGl0aW9uIGlzIGluIHRoZQorCSAqIHRpbWVyIGJ5IHJlYWRpbmcgdGhlIHBlbiBzaWduYWwgc3RhdGUgKGl0J3MgYSBHUElPIF9hbmRfIElSUSkuCisJICovCisJaWYgKHJ0KSB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gdHMtPmlucHV0OworCisJCWlmICghdHMtPnBlbmRvd24pIHsKKwkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgIkRPV05cbiIpOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQkJdHMtPnBlbmRvd24gPSAxOworCQl9CisKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWSwgeSk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgcnQpOworCisJCWlucHV0X3N5bmMoaW5wdXQpOworCisJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBvaW50KCU0ZCwlNGQpLCBwcmVzc3VyZSAoJTR1KVxuIiwKKwkJCXgsIHksIHJ0KTsKKwl9CisKKwlocnRpbWVyX3N0YXJ0KCZ0cy0+dGltZXIsIGt0aW1lX3NldCgwLCBUU19QT0xMX1BFUklPRCksCisJCQlIUlRJTUVSX01PREVfUkVMKTsKK30KKworc3RhdGljIGludCB0c2MyMDA3X3JlYWRfdmFsdWVzKHN0cnVjdCB0c2MyMDA3ICp0c2MpCit7CisJLyogeS0gc3RpbGwgb247IHR1cm4gb24gb25seSB5KyAoYW5kIEFEQykgKi8KKwl0c2MtPnRjLnkgPSB0c2MyMDA3X3hmZXIodHNjLCBSRUFEX1kpOworCisJLyogdHVybiB5LSBvZmYsIHgrIG9uLCB0aGVuIGxlYXZlIGluIGxvd3Bvd2VyICovCisJdHNjLT50Yy54ID0gdHNjMjAwN194ZmVyKHRzYywgUkVBRF9YKTsKKworCS8qIHR1cm4geSsgb2ZmLCB4LSBvbjsgd2UnbGwgdXNlIGZvcm11bGEgIzEgKi8KKwl0c2MtPnRjLnoxID0gdHNjMjAwN194ZmVyKHRzYywgUkVBRF9aMSk7CisJdHNjLT50Yy56MiA9IHRzYzIwMDdfeGZlcih0c2MsIFJFQURfWjIpOworCisJLyogcG93ZXIgZG93biAqLworCXRzYzIwMDdfeGZlcih0c2MsIFBXUkRPV04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB0c2MyMDA3X3RpbWVyKHN0cnVjdCBocnRpbWVyICpoYW5kbGUpCit7CisJc3RydWN0IHRzYzIwMDcgKnRzID0gY29udGFpbmVyX29mKGhhbmRsZSwgc3RydWN0IHRzYzIwMDcsIHRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJnRzLT5sb2NrKTsKKworCWlmICh1bmxpa2VseSghdHMtPmdldF9wZW5kb3duX3N0YXRlKCkgJiYgdHMtPnBlbmRvd24pKSB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gdHMtPmlucHV0OworCisJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgIlVQXG4iKTsKKworCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDApOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfUFJFU1NVUkUsIDApOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKworCQl0cy0+cGVuZG93biA9IDA7CisJCWVuYWJsZV9pcnEodHMtPmlycSk7CisJfSBlbHNlIHsKKwkJLyogcGVuIGlzIHN0aWxsIGRvd24sIGNvbnRpbnVlIHdpdGggdGhlIG1lYXN1cmVtZW50ICovCisJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgInBlbiBpcyBzdGlsbCBkb3duXG4iKTsKKworCQl0c2MyMDA3X3JlYWRfdmFsdWVzKHRzKTsKKwkJdHNjMjAwN19zZW5kX2V2ZW50KHRzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnRzLT5sb2NrKTsKKworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKworc3RhdGljIGlycXJldHVybl90IHRzYzIwMDdfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxpa2VseSh0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKSkpIHsKKwkJZGlzYWJsZV9pcnEodHMtPmlycSk7CisJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfREVMQVkpLAorCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwl9CisKKwlpZiAodHMtPmNsZWFyX3BlbmlycSkKKwkJdHMtPmNsZWFyX3BlbmlycSgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0c2MyMDA3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHRzYzIwMDcgKnRzOworCXN0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBsYXRmb3JtIGRhdGEgaXMgcmVxdWlyZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCXJldHVybiAtRUlPOworCisJdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHNjMjAwNyksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdHMgfHwgIWlucHV0X2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwl0cy0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHRzKTsKKworCXRzLT5pbnB1dCA9IGlucHV0X2RldjsKKworCWhydGltZXJfaW5pdCgmdHMtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCXRzLT50aW1lci5mdW5jdGlvbiA9IHRzYzIwMDdfdGltZXI7CisKKwlzcGluX2xvY2tfaW5pdCgmdHMtPmxvY2spOworCisJdHMtPm1vZGVsICAgICAgICAgICAgID0gcGRhdGEtPm1vZGVsOworCXRzLT54X3BsYXRlX29obXMgICAgICA9IHBkYXRhLT54X3BsYXRlX29obXM7CisJdHMtPmdldF9wZW5kb3duX3N0YXRlID0gcGRhdGEtPmdldF9wZW5kb3duX3N0YXRlOworCXRzLT5jbGVhcl9wZW5pcnEgICAgICA9IHBkYXRhLT5jbGVhcl9wZW5pcnE7CisKKwlwZGF0YS0+aW5pdF9wbGF0Zm9ybV9odygpOworCisJc25wcmludGYodHMtPnBoeXMsIHNpemVvZih0cy0+cGh5cyksICIlcy9pbnB1dDAiLCBjbGllbnQtPmRldi5idXNfaWQpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIlRTQzIwMDcgVG91Y2hzY3JlZW4iOworCWlucHV0X2Rldi0+cGh5cyA9IHRzLT5waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwgTUFYXzEyQklULCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLCBNQVhfMTJCSVQsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1BSRVNTVVJFLCAwLCBNQVhfMTJCSVQsIDAsIDApOworCisJdHNjMjAwN19yZWFkX3ZhbHVlcyh0cyk7CisKKwl0cy0+aXJxID0gY2xpZW50LT5pcnE7CisKKwllcnIgPSByZXF1ZXN0X2lycSh0cy0+aXJxLCB0c2MyMDA3X2lycSwgMCwKKwkJCWNsaWVudC0+ZGV2LmRyaXZlci0+bmFtZSwgdHMpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaXJxICVkIGJ1c3k/XG4iLCB0cy0+aXJxKTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJyZWdpc3RlcmVkIHdpdGggaXJxICglZClcbiIsIHRzLT5pcnEpOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEodHMtPmlycSwgdHMpOworCWhydGltZXJfY2FuY2VsKCZ0cy0+dGltZXIpOworIGVycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKHRzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRzYzIwMDdfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRzYzIwMDcJKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJcGRhdGEtPmV4aXRfcGxhdGZvcm1faHcoKTsKKworCWZyZWVfaXJxKHRzLT5pcnEsIHRzKTsKKwlocnRpbWVyX2NhbmNlbCgmdHMtPnRpbWVyKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+aW5wdXQpOworCWtmcmVlKHRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgdHNjMjAwN19pZHRhYmxlW10gPSB7CisJeyAidHNjMjAwNyIsIDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0c2MyMDA3X2lkdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHNjMjAwN19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gInRzYzIwMDciCisJfSwKKwkuaWRfdGFibGUJPSB0c2MyMDA3X2lkdGFibGUsCisJLnByb2JlCQk9IHRzYzIwMDdfcHJvYmUsCisJLnJlbW92ZQkJPSB0c2MyMDA3X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRzYzIwMDdfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHNjMjAwN19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHNjMjAwN19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnRzYzIwMDdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHNjMjAwN19pbml0KTsKK21vZHVsZV9leGl0KHRzYzIwMDdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkt3YW5nd29vIExlZSA8a3dsZWVAbXRla3Zpc2lvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRTQzIwMDcgVG91Y2hTY3JlZW4gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKaW5kZXggZmRkNjQ1Yy4uNTA4MGIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGJ1ZiwgMiwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKGJ1ZlswXSAhPSAweDA2IHx8IGJ1ZlsxXSAhPSAweDAwKSB7CisJaWYgKGJ1ZlswXSAhPSAweDA2KSB7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX291dDsKIAl9CkBAIC00MzcsOCArNDM3LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfUkFURV8xNTAsIDAsIGJ1ZiwgMiwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKChidWZbMF0gIT0gMHgwNiB8fCBidWZbMV0gIT0gMHgwMCkgJiYKLQkgICAgKGJ1ZlswXSAhPSAweDE1IHx8IGJ1ZlsxXSAhPSAweDAxKSkgeworCWlmICgoYnVmWzBdICE9IDB4MDYpICYmIChidWZbMF0gIT0gMHgxNSB8fCBidWZbMV0gIT0gMHgwMSkpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjMzYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogV2Fjb20gVzgwMDEgcGVuYWJsZWQgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKYXlhIEt1bWFyCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogTGF5b3V0IGJhc2VkIG9uIEVsbyBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyIGJ5IFZvanRlY2ggUGF2bGlrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2RlZmluZSBEUklWRVJfREVTQwkiV2Fjb20gVzgwMDEgc2VyaWFsIHRvdWNoc2NyZWVuIGRyaXZlciIKKworTU9EVUxFX0FVVEhPUigiSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIERlZmluaXRpb25zICYgZ2xvYmFsIGFycmF5cy4KKyAqLworCisjZGVmaW5lIFc4MDAxX01BWF9MRU5HVEgJMTEKKyNkZWZpbmUgVzgwMDFfUEFDS0VUX0xFTgkxMQorI2RlZmluZSBXODAwMV9MRUFEX01BU0sgMHg4MAorI2RlZmluZSBXODAwMV9MRUFEX0JZVEUgMHg4MAorI2RlZmluZSBXODAwMV9UQUJfTUFTSyAweDQwCisjZGVmaW5lIFc4MDAxX1RBQl9CWVRFIDB4NDAKKworI2RlZmluZSBXODAwMV9RVUVSWV9QQUNLRVQgMHgyMAorCitzdHJ1Y3QgdzgwMDFfY29vcmQgeworCXU4IHJkeTsKKwl1OCB0c3c7CisJdTggZjE7CisJdTggZjI7CisJdTE2IHg7CisJdTE2IHk7CisJdTE2IHBlbl9wcmVzc3VyZTsKKwl1OCB0aWx0X3g7CisJdTggdGlsdF95OworfTsKKworLyoKKyAqIFBlci10b3VjaHNjcmVlbiBkYXRhLgorICovCisKK3N0cnVjdCB3ODAwMSB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCBzZXJpbyAqc2VyaW87CisJc3RydWN0IG11dGV4IGNtZF9tdXRleDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfZG9uZTsKKwlpbnQgaWQ7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBjaGFyIGV4cGVjdGVkX3BhY2tldDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbVzgwMDFfTUFYX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciByZXNwb25zZVtXODAwMV9QQUNLRVRfTEVOXTsKKwljaGFyIHBoeXNbMzJdOworfTsKKworc3RhdGljIGludCBwYXJzZV9kYXRhKHU4ICpkYXRhLCBzdHJ1Y3QgdzgwMDFfY29vcmQgKmNvb3JkKQoreworCWNvb3JkLT5yZHkgPSBkYXRhWzBdICYgMHgyMDsKKwljb29yZC0+dHN3ID0gZGF0YVswXSAmIDB4MDE7CisJY29vcmQtPmYxID0gZGF0YVswXSAmIDB4MDI7CisJY29vcmQtPmYyID0gZGF0YVswXSAmIDB4MDQ7CisKKwljb29yZC0+eCA9IChkYXRhWzFdICYgMHg3RikgPDwgOTsKKwljb29yZC0+eCB8PSAoZGF0YVsyXSAmIDB4N0YpIDw8IDI7CisJY29vcmQtPnggfD0gKGRhdGFbNl0gJiAweDYwKSA+PiA1OworCisJY29vcmQtPnkgPSAoZGF0YVszXSAmIDB4N0YpIDw8IDk7CisJY29vcmQtPnkgfD0gKGRhdGFbNF0gJiAweDdGKSA8PCAyOworCWNvb3JkLT55IHw9IChkYXRhWzZdICYgMHgxOCkgPj4gMzsKKworCWNvb3JkLT5wZW5fcHJlc3N1cmUgPSBkYXRhWzVdICYgMHg3RjsKKwljb29yZC0+cGVuX3ByZXNzdXJlIHw9IChkYXRhWzZdICYgMHgwNykgPDwgNyA7CisKKwljb29yZC0+dGlsdF94ID0gZGF0YVs3XSAmIDB4N0Y7CisJY29vcmQtPnRpbHRfeSA9IGRhdGFbOF0gJiAweDdGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHc4MDAxX3Byb2Nlc3NfZGF0YShzdHJ1Y3QgdzgwMDEgKnc4MDAxLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gdzgwMDEtPmRldjsKKwl1OCB0bXA7CisJc3RydWN0IHc4MDAxX2Nvb3JkIGNvb3JkOworCisJdzgwMDEtPmRhdGFbdzgwMDEtPmlkeF0gPSBkYXRhOworCXN3aXRjaCAodzgwMDEtPmlkeCsrKSB7CisJY2FzZSAwOgorCQlpZiAoKGRhdGEgJiBXODAwMV9MRUFEX01BU0spICE9IFc4MDAxX0xFQURfQllURSkgeworCQkJcHJfZGVidWcoInc4MDAxOiB1bnN5bmNocm9uaXplZCBkYXRhOiAweCUwMnhcbiIsIGRhdGEpOworCQkJdzgwMDEtPmlkeCA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA4OgorCQl0bXAgPSB3ODAwMS0+ZGF0YVswXSAmIFc4MDAxX1RBQl9NQVNLOworCQlpZiAodW5saWtlbHkodG1wID09IFc4MDAxX1RBQl9CWVRFKSkKKwkJCWJyZWFrOworCQl3ODAwMS0+aWR4ID0gMDsKKwkJbWVtc2V0KCZjb29yZCwgMCwgc2l6ZW9mKGNvb3JkKSk7CisJCXBhcnNlX2RhdGEodzgwMDEtPmRhdGEsICZjb29yZCk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgY29vcmQueCk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgY29vcmQueSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIGNvb3JkLnBlbl9wcmVzc3VyZSk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGNvb3JkLnRzdyk7CisJCWlucHV0X3N5bmMoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdzgwMDEtPmlkeCA9IDA7CisJCW1lbWNweSh3ODAwMS0+cmVzcG9uc2UsICZ3ODAwMS0+ZGF0YSwgVzgwMDFfUEFDS0VUX0xFTik7CisJCXc4MDAxLT5leHBlY3RlZF9wYWNrZXQgPSBXODAwMV9RVUVSWV9QQUNLRVQ7CisJCWNvbXBsZXRlKCZ3ODAwMS0+Y21kX2RvbmUpOworCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHc4MDAxX2ludGVycnVwdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLAorCQl1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdzgwMDEgKnc4MDAxID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCisJdzgwMDFfcHJvY2Vzc19kYXRhKHc4MDAxLCBkYXRhKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB3ODAwMV9hc3luY19jb21tYW5kKHN0cnVjdCB3ODAwMSAqdzgwMDEsIHVuc2lnbmVkIGNoYXIgKnBhY2tldCwKKwkJCQkJaW50IGxlbikKK3sKKwlpbnQgcmMgPSAtMTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnc4MDAxLT5jbWRfbXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChzZXJpb193cml0ZSh3ODAwMS0+c2VyaW8sIHBhY2tldFtpXSkpCisJCQlnb3RvIG91dDsKKwl9CisJcmMgPSAwOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3ODAwMS0+Y21kX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdzgwMDFfY29tbWFuZChzdHJ1Y3QgdzgwMDEgKnc4MDAxLCB1bnNpZ25lZCBjaGFyICpwYWNrZXQsIGludCBsZW4pCit7CisJaW50IHJjID0gLTE7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZ3ODAwMS0+Y21kX211dGV4KTsKKworCXNlcmlvX3BhdXNlX3J4KHc4MDAxLT5zZXJpbyk7CisJaW5pdF9jb21wbGV0aW9uKCZ3ODAwMS0+Y21kX2RvbmUpOworCXNlcmlvX2NvbnRpbnVlX3J4KHc4MDAxLT5zZXJpbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHNlcmlvX3dyaXRlKHc4MDAxLT5zZXJpbywgcGFja2V0W2ldKSkKKwkJCWdvdG8gb3V0OworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdzgwMDEtPmNtZF9kb25lLCBIWik7CisKKwlpZiAodzgwMDEtPmV4cGVjdGVkX3BhY2tldCA9PSBXODAwMV9RVUVSWV9QQUNLRVQpIHsKKwkJLyogV2UgYXJlIGJhY2sgaW4gcmVwb3J0aW5nIG1vZGUsIHRoZSBxdWVyeSB3YXMgQUNLZWQgKi8KKwkJbWVtY3B5KHBhY2tldCwgdzgwMDEtPnJlc3BvbnNlLCBXODAwMV9QQUNLRVRfTEVOKTsKKwkJcmMgPSAwOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdzgwMDEtPmNtZF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHc4MDAxX3NldHVwKHN0cnVjdCB3ODAwMSAqdzgwMDEpCit7CisJc3RydWN0IHc4MDAxX2Nvb3JkIGNvb3JkOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHc4MDAxLT5kZXY7CisJdW5zaWduZWQgY2hhciBzdGFydFsxXSA9IHsgJzEnIH07CisJdW5zaWduZWQgY2hhciBxdWVyeVsxMV0gPSB7ICcqJyB9OworCisJaWYgKHc4MDAxX2NvbW1hbmQodzgwMDEsIHF1ZXJ5LCAxKSkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZjb29yZCwgMCwgc2l6ZW9mKGNvb3JkKSk7CisJcGFyc2VfZGF0YShxdWVyeSwgJmNvb3JkKTsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1gsIDAsIGNvb3JkLngsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1ksIDAsIGNvb3JkLnksIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1BSRVNTVVJFLCAwLCBjb29yZC5wZW5fcHJlc3N1cmUsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1RJTFRfWCwgMCwgY29vcmQudGlsdF94LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19USUxUX1ksIDAsIGNvb3JkLnRpbHRfeSwgMCwgMCk7CisKKwlpZiAodzgwMDFfYXN5bmNfY29tbWFuZCh3ODAwMSwgc3RhcnQsIDEpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHc4MDAxX2Rpc2Nvbm5lY3QoKSBpcyB0aGUgb3Bwb3NpdGUgb2YgdzgwMDFfY29ubmVjdCgpCisgKi8KKworc3RhdGljIHZvaWQgdzgwMDFfZGlzY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCXN0cnVjdCB3ODAwMSAqdzgwMDEgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisKKwlpbnB1dF9nZXRfZGV2aWNlKHc4MDAxLT5kZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHc4MDAxLT5kZXYpOworCXNlcmlvX2Nsb3NlKHNlcmlvKTsKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisJaW5wdXRfcHV0X2RldmljZSh3ODAwMS0+ZGV2KTsKKwlrZnJlZSh3ODAwMSk7Cit9CisKKy8qCisgKiB3ODAwMV9jb25uZWN0KCkgaXMgdGhlIHJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiBzb21lb25lIGFkZHMgYQorICogbmV3IHNlcmlvIGRldmljZSB0aGF0IHN1cHBvcnRzIHRoZSB3ODAwMSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJzIGl0IGFzCisgKiBhbiBpbnB1dCBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCB3ODAwMV9jb25uZWN0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgdzgwMDEgKnc4MDAxOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgZXJyOworCisJdzgwMDEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdzgwMDEpLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXc4MDAxIHx8ICFpbnB1dF9kZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwl3ODAwMS0+c2VyaW8gPSBzZXJpbzsKKwl3ODAwMS0+aWQgPSBzZXJpby0+aWQuaWQ7CisJdzgwMDEtPmRldiA9IGlucHV0X2RldjsKKwltdXRleF9pbml0KCZ3ODAwMS0+Y21kX211dGV4KTsKKwlpbml0X2NvbXBsZXRpb24oJnc4MDAxLT5jbWRfZG9uZSk7CisJc25wcmludGYodzgwMDEtPnBoeXMsIHNpemVvZih3ODAwMS0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiV2Fjb20gVzgwMDEgUGVuYWJsZWQgU2VyaWFsIFRvdWNoU2NyZWVuIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSB3ODAwMS0+cGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUlMyMzI7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBTRVJJT19XODAwMTsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSB3ODAwMS0+aWQ7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZzZXJpby0+ZGV2OworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOworCWlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKTsKKworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCB3ODAwMSk7CisJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOworCisJaWYgKHc4MDAxX3NldHVwKHc4MDAxKSkKKwkJZ290byBmYWlsMzsKKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh3ODAwMS0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwzOworCisJcmV0dXJuIDA7CisKK2ZhaWwzOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKK2ZhaWwyOgorCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKK2ZhaWwxOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUodzgwMDEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkIHc4MDAxX3NlcmlvX2lkc1tdID0geworCXsKKwkJLnR5cGUJPSBTRVJJT19SUzIzMiwKKwkJLnByb3RvCT0gU0VSSU9fVzgwMDEsCisJCS5pZAk9IFNFUklPX0FOWSwKKwkJLmV4dHJhCT0gU0VSSU9fQU5ZLAorCX0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc2VyaW8sIHc4MDAxX3NlcmlvX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaW9fZHJpdmVyIHc4MDAxX2RydiA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidzgwMDEiLAorCX0sCisJLmRlc2NyaXB0aW9uCT0gRFJJVkVSX0RFU0MsCisJLmlkX3RhYmxlCT0gdzgwMDFfc2VyaW9faWRzLAorCS5pbnRlcnJ1cHQJPSB3ODAwMV9pbnRlcnJ1cHQsCisJLmNvbm5lY3QJPSB3ODAwMV9jb25uZWN0LAorCS5kaXNjb25uZWN0CT0gdzgwMDFfZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHc4MDAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZ3ODAwMV9kcnYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdzgwMDFfZXhpdCh2b2lkKQoreworCXNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ3ODAwMV9kcnYpOworfQorCittb2R1bGVfaW5pdCh3ODAwMV9pbml0KTsKK21vZHVsZV9leGl0KHc4MDAxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCmluZGV4IDVlZTY2NTEuLjgzNjM5YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAogCWVudHJ5LT5kZXYuY2xhc3MgPSBlbGVtZW50c19jbGFzczsKIAlkZXZfc2V0X2RydmRhdGEoJmVudHJ5LT5kZXYsIGVsZW0pOwotCXNucHJpbnRmKGVudHJ5LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgZWxlbS0+bmFtZSk7CisJZGV2X3NldF9uYW1lKCZlbnRyeS0+ZGV2LCBlbGVtLT5uYW1lKTsKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmVudHJ5LT5kZXYpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCmluZGV4IDkxNWRhNmIuLmI0ZDQ0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKQEAgLTMyMSwxMCArMzIxLDcgQEAKIAogLyogVGhlIHJvb3QgZGV2aWNlIGZvciB0aGUgbGd1ZXN0IHZpcnRpbyBkZXZpY2VzLiAgVGhpcyBtYWtlcyB0aGVtIGFwcGVhciBhcwogICogL3N5cy9kZXZpY2VzL2xndWVzdC8wLDEsMiBub3QgL3N5cy9kZXZpY2VzLzAsMSwyLiAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgbGd1ZXN0X3Jvb3QgPSB7Ci0JLnBhcmVudCA9IE5VTEwsCi0JLmJ1c19pZCA9ICJsZ3Vlc3QiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpsZ3Vlc3Rfcm9vdDsKIAogLypEOjEyMCBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBsZ3Vlc3QgYnVzOiBhY3R1YWxseSBhZGRpbmcgYSBuZXcgZGV2aWNlLgogICogSXQncyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgaXQncyBuZWF0ZXIgdGhhdCB3YXksIGFuZCBiZWNhdXNlIGFuCkBAIC0zNTEsNyArMzQ4LDcgQEAKIAl9CiAKIAkvKiBUaGlzIGRldmljZXMnIHBhcmVudCBpcyB0aGUgbGd1ZXN0LyBkaXIuICovCi0JbGRldi0+dmRldi5kZXYucGFyZW50ID0gJmxndWVzdF9yb290OworCWxkZXYtPnZkZXYuZGV2LnBhcmVudCA9IGxndWVzdF9yb290OwogCS8qIFdlIGhhdmUgYSB1bmlxdWUgZGV2aWNlIGluZGV4IHRoYW5rcyB0byB0aGUgZGV2X2luZGV4IGNvdW50ZXIuICovCiAJbGRldi0+dmRldi5pZC5kZXZpY2UgPSBkLT50eXBlOwogCS8qIFdlIGhhdmUgYSBzaW1wbGUgc2V0IG9mIHJvdXRpbmVzIGZvciBxdWVyeWluZyB0aGUgZGV2aWNlJ3MKQEAgLTQwNyw3ICs0MDQsOCBAQAogCWlmIChzdHJjbXAocHZfaW5mby5uYW1lLCAibGd1ZXN0IikgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZsZ3Vlc3Rfcm9vdCkgIT0gMCkKKwlsZ3Vlc3Rfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJsZ3Vlc3QiKTsKKwlpZiAoSVNfRVJSKGxndWVzdF9yb290KSkKIAkJcGFuaWMoIkNvdWxkIG5vdCByZWdpc3RlciBsZ3Vlc3Qgcm9vdCIpOwogCiAJLyogRGV2aWNlcyBhcmUgaW4gYSBzaW5nbGUgcGFnZSBhYm92ZSB0b3Agb2YgIm5vcm1hbCIgbWVtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKaW5kZXggZWM5ZTVmMy4uNmUxNDlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjdW5kZWYgREVCVUcKIAotI2RlZmluZSBNQVhfTk9ERV9OQU1FX1NJWkUgKEJVU19JRF9TSVpFIC0gMTIpCisjZGVmaW5lIE1BWF9OT0RFX05BTUVfU0laRSAoMjAgLSAxMikKIAogc3RhdGljIHN0cnVjdCBtYWNpb19jaGlwICAgICAgKm1hY2lvX29uX2hvbGQ7CiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogCWlmIChpcnEgIT0gTk9fSVJRKSB7CiAJCWRldi0+aW50ZXJydXB0W2luZGV4XS5zdGFydCA9IGlycTsKIAkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7Ci0JCWRldi0+aW50ZXJydXB0W2luZGV4XS5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOworCQlkZXYtPmludGVycnVwdFtpbmRleF0ubmFtZSA9IGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldik7CiAJfQogCWlmIChkZXYtPm5faW50ZXJydXB0cyA8PSBpbmRleCkKIAkJZGV2LT5uX2ludGVycnVwdHMgPSBpbmRleCArIDE7CkBAIC0zMDMsNyArMzAzLDcgQEAKIAkJCWJyZWFrOwogCQlyZXMtPnN0YXJ0ID0gaXJxOwogCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7Ci0JCXJlcy0+bmFtZSA9IGRldi0+b2ZkZXYuZGV2LmJ1c19pZDsKKwkJcmVzLT5uYW1lID0gZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KTsKIAkJaWYgKG1hY2lvX3Jlc291cmNlX3F1aXJrcyhucCwgcmVzLCBpIC0gMSkpIHsKIAkJCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAkJCWNvbnRpbnVlOwpAQCAtMzI1LDcgKzMyNSw3IEBACiAJCWlmIChpbmRleCA+PSBNQUNJT19ERVZfQ09VTlRfUkVTT1VSQ0VTKQogCQkJYnJlYWs7CiAJCSpyZXMgPSByOwotCQlyZXMtPm5hbWUgPSBkZXYtPm9mZGV2LmRldi5idXNfaWQ7CisJCXJlcy0+bmFtZSA9IGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldik7CiAKIAkJaWYgKG1hY2lvX3Jlc291cmNlX3F1aXJrcyhucCwgcmVzLCBpbmRleCkpIHsKIAkJCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKQEAgLTMzOCw3ICszMzgsNyBAQAogCQlpZiAoaW5zZXJ0X3Jlc291cmNlKHBhcmVudF9yZXMsIHJlcykpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHJlcXVlc3QgcmVzb3VyY2UgIgogCQkJICAgICAgICIlZCBmb3IgTWFjSU8gZGV2aWNlICVzXG4iLAotCQkJICAgICAgIGluZGV4LCBkZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQkJICAgICAgIGluZGV4LCBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpKTsKIAkJfQogCX0KIAlkZXYtPm5fcmVzb3VyY2VzID0gaW5kZXg7CkBAIC0zODUsOCArMzg1LDggQEAKIAogCS8qIE1hY0lPIGl0c2VsZiBoYXMgYSBkaWZmZXJlbnQgcmVnLCB3ZSB1c2UgaXQncyBQQ0kgYmFzZSAqLwogCWlmIChucCA9PSBjaGlwLT5vZl9ub2RlKSB7Ci0JCXNwcmludGYoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiJTFkLiUwOHg6JS4qcyIsCi0JCQljaGlwLT5sYnVzLmluZGV4LAorCQlkZXZfc2V0X25hbWUoJmRldi0+b2ZkZXYuZGV2LCAiJTFkLiUwOHg6JS4qcyIsCisJCQkgICAgIGNoaXAtPmxidXMuaW5kZXgsCiAjaWZkZWYgQ09ORklHX1BDSQogCQkJKHVuc2lnbmVkIGludClwY2lfcmVzb3VyY2Vfc3RhcnQoY2hpcC0+bGJ1cy5wZGV2LCAwKSwKICNlbHNlCkBAIC0zOTUsOSArMzk1LDkgQEAKIAkJCU1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOwogCX0gZWxzZSB7CiAJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQlzcHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgIiUxZC4lMDh4OiUuKnMiLAotCQkJY2hpcC0+bGJ1cy5pbmRleCwKLQkJCXJlZyA/ICpyZWcgOiAwLCBNQVhfTk9ERV9OQU1FX1NJWkUsIG5wLT5uYW1lKTsKKwkJZGV2X3NldF9uYW1lKCZkZXYtPm9mZGV2LmRldiwgIiUxZC4lMDh4OiUuKnMiLAorCQkJICAgICBjaGlwLT5sYnVzLmluZGV4LAorCQkJICAgICByZWcgPyAqcmVnIDogMCwgTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CiAJfQogCiAJLyogU2V0dXAgaW50ZXJydXB0cyAmIHJlc291cmNlcyAqLwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZGV2LT5vZmRldikgIT0gMCkgewogCQlwcmludGsoS0VSTl9ERUJVRyJtYWNpbzogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkgICAgICAgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldikpOwogCQlrZnJlZShkZXYpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NTgsNyArNTU4LDcgQEAKIAkJcmVzb3VyY2Vfbm8sCiAJCW1hY2lvX3Jlc291cmNlX2xlbihkZXYsIHJlc291cmNlX25vKSwKIAkJbWFjaW9fcmVzb3VyY2Vfc3RhcnQoZGV2LCByZXNvdXJjZV9ubyksCi0JCWRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCWRldl9uYW1lKCZkZXYtPm9mZGV2LmRldikpOwogCXJldHVybiAtRUJVU1k7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCAyMmJmOTgxLi44MjYwN2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC01NTQsNyArNTU0LDcgQEAKIAljb25zdCB1MzIgKnByb3A7CiAJaW50IGkgPSAwLCBvZmZzZXQgPSAwOwogCWludCBlcnI7Ci0JCisKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJmYW4iKTsKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTYxMywxMyArNjEzLDEzIEBACiAJfQogCiAJb2ZfZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInRlbXBlcmF0dXJlcyIsIE5VTEwpOwotCQorCW9mX25vZGVfcHV0KG5wKTsKKwogCWlmIChvZl9kZXYgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIHRlbXBlcmF0dXJlcyBkZXZpY2UgIVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCQorCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjFfdGVtcGVyYXR1cmUpOwogCWVyciB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMl90ZW1wZXJhdHVyZSk7CiAJZXJyIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IxX2xpbWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKaW5kZXggNjVkNjk2Ni4uNmEzMjY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKQEAgLTc5LDYgKzc5LDEwIEBACiAJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGR2YmRldjsKIAkJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOwogCQlmaWxlLT5mX29wID0gZm9wc19nZXQoZHZiZGV2LT5mb3BzKTsKKwkJaWYgKGZpbGUtPmZfb3AgPT0gTlVMTCkgeworCQkJZmlsZS0+Zl9vcCA9IG9sZF9mb3BzOworCQkJZ290byBmYWlsOworCQl9CiAJCWlmKGZpbGUtPmZfb3AtPm9wZW4pCiAJCQllcnIgPSBmaWxlLT5mX29wLT5vcGVuKGlub2RlLGZpbGUpOwogCQlpZiAoZXJyKSB7CkBAIC05MCw2ICs5NCw3IEBACiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIGVycjsKIAl9CitmYWlsOgogCXVwX3JlYWQoJm1pbm9yX3J3c2VtKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggZDQ1MGNhYi4uYjYxN2JmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAJdGFibGUgPSAmcHdxLT5wdDsKIAlmb3IgKDs7KSB7CiAJCWludCBtYXNrOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQltYXNrID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCB0YWJsZSk7CiAJCWlmIChtYXNrICYgUE9MTElOKQogCQkJYnJlYWs7CkBAIC0yMTIsOSArMjExLDggQEAKIAkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCWJyZWFrOwogCQl9Ci0JCXNjaGVkdWxlKCk7CisJCXBvbGxfc2NoZWR1bGUocHdxLCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXBvbGxfZnJlZXdhaXQocHdxKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwppbmRleCBjZWE0NjkwLi5hNWI0NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMzg1LDggKzM4NSw3IEBACiAKIAlpZiAoY2FyZCkgewogCQljYXJkLT5ob3N0ID0gaG9zdDsKLQkJc25wcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGNhcmQtPmRldi5idXNfaWQpLAotCQkJICIlcyIsIGhvc3QtPmRldi5idXNfaWQpOworCQlkZXZfc2V0X25hbWUoJmNhcmQtPmRldiwgIiVzIiwgZGV2X25hbWUoJmhvc3QtPmRldikpOwogCQljYXJkLT5kZXYucGFyZW50ID0gJmhvc3QtPmRldjsKIAkJY2FyZC0+ZGV2LmJ1cyA9ICZtZW1zdGlja19idXNfdHlwZTsKIAkJY2FyZC0+ZGV2LnJlbGVhc2UgPSBtZW1zdGlja19mcmVlX2NhcmQ7CkBAIC01MTksNyArNTE4LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXNucHJpbnRmKGhvc3QtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAibWVtc3RpY2sldSIsIGhvc3QtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmhvc3QtPmRldiwgIm1lbXN0aWNrJXUiLCBob3N0LT5pZCk7CiAKIAlyYyA9IGRldmljZV9hZGQoJmhvc3QtPmRldik7CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCmluZGV4IDc5MTExNTEuLjFmMWUzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC04ODcsMTQgKzg4NywxNCBAQAogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gNC1iaXQgbW9kZSwgZXJyb3IgJWRcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSwgcmMpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19QQVI0OwogCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19JTlRFUkZBQ0UsIE1FTVNUSUNLX1BBUjQpOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gNC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCk7CisJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpKTsKIAogCWlmIChtc2ItPmNhcHMgJiBNRU1TVElDS19DQVBfUEFSOCkgewogCQlyYyA9IG1zcHJvX2Jsb2NrX3NldF9pbnRlcmZhY2UoY2FyZCwgTUVNU1RJQ0tfU1lTX1BBUjgpOwpAQCAtOTA1LDExICs5MDUsMTEgQEAKIAkJCQkJTUVNU1RJQ0tfUEFSOCk7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgIiVzOiBzd2l0Y2hpbmcgdG8gOC1iaXQgcGFyYWxsZWwgbW9kZVxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICIlczogY291bGQgbm90IHN3aXRjaCB0byA4LWJpdCBtb2RlLCBlcnJvciAlZFxuIiwKLQkJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCByYyk7CisJCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldiksIHJjKTsKIAl9CiAKIAljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogaW50ZXJmYWNlIGVycm9yLCB0cnlpbmcgdG8gZmFsbCBiYWNrIHRvIHNlcmlhbFxuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19TRVJJQUw7CiAJCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19QT1dFUiwgTUVNU1RJQ0tfUE9XRVJfT0ZGKTsKIAkJbXNsZWVwKDEwKTsKQEAgLTk5MiwxNCArOTkyLDE0IEBACiAKIAlpZiAoYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSAhPSBNU1BST19CTE9DS19TSUdOQVRVUkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pemVkIGRldmljZSBzaWduYXR1cmUgJXhcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKKwkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlX2F0dHI7CiAJfQogCiAJaWYgKGF0dHItPmNvdW50ID4gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdheSB0b28gbWFueSBhdHRyaWJ1dGUgZW50cmllc1xuIiwKLQkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQlhdHRyX2NvdW50ID0gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVM7CiAJfSBlbHNlCiAJCWF0dHJfY291bnQgPSBhdHRyLT5jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCmluZGV4IGQzMmQ2YWQuLjAzZjcxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICIlcyA6IGNhcmQgZmFpbGVkIHRvIHJlc3BvbmQgZm9yIGEgbG9uZyBwZXJpb2Qgb2YgdGltZSAiCiAJICAgICAgICIoJXgsICV4KVxuIiwKLQkgICAgICAgaG9zdC0+ZGV2LT5kZXYuYnVzX2lkLCBob3N0LT5yZXEgPyBob3N0LT5yZXEtPnRwYyA6IDAsCisJICAgICAgIGRldl9uYW1lKCZob3N0LT5kZXYtPmRldiksIGhvc3QtPnJlcSA/IGhvc3QtPnJlcS0+dHBjIDogMCwKIAkgICAgICAgaG9zdC0+Y21kX2ZsYWdzKTsKIAogCXRpZm1fZWplY3QoaG9zdC0+ZGV2KTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCWlmICghKFRJRk1fU09DS19TVEFURV9PQ0NVUElFRAogCSAgICAgICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfUFJFU0VOVF9TVEFURSkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCi0JCSAgICAgICBzb2NrLT5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZzb2NrLT5kZXYpKTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKaW5kZXggNTRjMmU5YS4uMGVlNDI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCkBAIC01Miw3ICs1Miw2IEBACiAvKioKICAqCWkyb19kZXZpY2VfY2xhaW0gLSBjbGFpbSBhIGRldmljZSBmb3IgdXNlIGJ5IGFuIE9TTQogICoJQGRldjogSTJPIGRldmljZSB0byBjbGFpbQotICoJQGRydjogSTJPIGRyaXZlciB3aGljaCB3YW50cyB0byBjbGFpbSB0aGUgZGV2aWNlCiAgKgogICoJRG8gdGhlIGxlZyB3b3JrIHRvIGFzc2lnbiBhIGRldmljZSB0byBhIGdpdmVuIE9TTS4gSWYgdGhlIGNsYWltIHN1Y2NlZWRzLAogICoJdGhlIG93bmVyIGlzIHRoZSBwcmltYXJ5LiBJZiB0aGUgYXR0ZW1wdCBmYWlscyBhIG5lZ2F0aXZlIGVycm5vIGNvZGUKQEAgLTgwLDcgKzc5LDYgQEAKIC8qKgogICoJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlIC0gcmVsZWFzZSBhIGRldmljZSB0aGF0IHRoZSBPU00gaXMgdXNpbmcKICAqCUBkZXY6IGRldmljZSB0byByZWxlYXNlCi0gKglAZHJ2OiBkcml2ZXIgd2hpY2ggY2xhaW1lZCB0aGUgZGV2aWNlCiAgKgogICoJRHJvcCBhIGNsYWltIGJ5IGFuIE9TTSBvbiBhIGdpdmVuIEkyTyBkZXZpY2UuCiAgKgpAQCAtMTM0LDcgKzEzMiw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldi0+YnVzX2lkKTsKKwlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldl9uYW1lKGRldikpOwogCiAJa2ZyZWUoaTJvX2Rldik7CiB9CkBAIC0yMjksOCArMjI3LDggQEAKIAogCWkyb19kZXYtPmxjdF9kYXRhID0gKmVudHJ5OwogCi0Jc25wcmludGYoaTJvX2Rldi0+ZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZDolMDN4IiwgYy0+dW5pdCwKLQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJZGV2X3NldF9uYW1lKCZpMm9fZGV2LT5kZXZpY2UsICIlZDolMDN4IiwgYy0+dW5pdCwKKwkJICAgICBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCiAJaTJvX2Rldi0+aW9wID0gYzsKIAlpMm9fZGV2LT5kZXZpY2UucGFyZW50ID0gJmMtPmRldmljZTsKQEAgLTI4MSw3ICsyNzksNyBAQAogCiAJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwoaTJvX2Rldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgYWRkZWRcbiIsIGkyb19kZXYtPmRldmljZS5idXNfaWQpOworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgZGV2X25hbWUoJmkyb19kZXYtPmRldmljZSkpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCmluZGV4IGUwZDQ3NGIuLmEwNDIxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMTczLDcgKzE3Myw2IEBACiAgKglpMm9fZHJpdmVyX2Rpc3BhdGNoIC0gZGlzcGF0Y2ggYW4gSTJPIHJlcGx5IG1lc3NhZ2UKICAqCUBjOiBJMk8gY29udHJvbGxlciBvZiB0aGUgbWVzc2FnZQogICoJQG06IEkyTyBtZXNzYWdlIG51bWJlcgotICoJQG1zZzogSTJPIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkCiAgKgogICoJVGhlIHJlcGx5IGlzIGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyIGZyb20gd2hpY2ggdGhlIG9yaWdpbmFsIG1lc3NhZ2UKICAqCXdhcy4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCmluZGV4IDU0YTMwMTYuLjlhMzZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKQEAgLTEzMDAsNyArMTMwMCw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkLT5kZXZpY2UuYnVzX2lkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCBkZXZfbmFtZSgmZC0+ZGV2aWNlKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCmluZGV4IDM1YzY3ZDEuLjI3Y2Y0YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpAQCAtMTA3Miw3ICsxMDcyLDcgQEAKIAogCWMtPmRldmljZS5yZWxlYXNlID0gJmkyb19pb3BfcmVsZWFzZTsKIAotCXNucHJpbnRmKGMtPmRldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiaW9wJWQiLCBjLT51bml0KTsKKwlkZXZfc2V0X25hbWUoJmMtPmRldmljZSwgImlvcCVkIiwgYy0+dW5pdCk7CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDY0CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmNvbnRleHRfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCmluZGV4IGI1ZjZhZGQuLmRjMTRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYwpAQCAtMTA0LDggKzEwNCw3IEBACiAJfQogCiAJc3AtPmlycSA9IHBkZXYtPmlycTsKLQlzcC0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCXNwLT5iYXNlX2FkZHJlc3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCFzcC0+YmFzZV9hZGRyZXNzKSB7CiAJCWRldl9lcnIoc3AtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHBjaSBtZW1vcnlcbiIpOwogCQlyZXN1bHQgPSAgLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pb2M0LmMgYi9kcml2ZXJzL21pc2MvaW9jNC5jCmluZGV4IDZmNzY1NzMuLjYwYjBiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pb2M0LmMKKysrIGIvZHJpdmVycy9taXNjL2lvYzQuYwpAQCAtMjY5LDYgKzI2OSwxNiBAQAogCXJldHVybiBJT0M0X1ZBUklBTlRfUENJX1JUOwogfQogCitzdGF0aWMgdm9pZAoraW9jNF9sb2FkX21vZHVsZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8qIGFyZyBqdXN0IGhhcyB0byBiZSBmcmVlZCAqLworCisJcmVxdWVzdF9tb2R1bGUoInNnaWlvYzQiKTsKKworCWtmcmVlKHdvcmspOworfQorCiAvKiBBZGRzIGEgbmV3IGluc3RhbmNlIG9mIGFuIElPQzQgY2FyZCAqLwogc3RhdGljIGludAogaW9jNF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTM3OCw2ICszODgsMzAgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpb2M0X211dGV4KTsKIAorCS8qIFJlcXVlc3Qgc2dpaW9jNCBJREUgZHJpdmVyIG9uIGJvYXJkcyB0aGF0IGJyaW5nIHRoYXQgZnVuY3Rpb25hbGl0eQorCSAqIG9mZiBvZiBJT0M0LiAgVGhlIHJvb3QgZmlsZXN5c3RlbSBtYXkgYmUgaG9zdGVkIG9uIGEgZHJpdmUgY29ubmVjdGVkCisJICogdG8gSU9DNCwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNnaWlvYzQgZHJpdmVyIGlzIGxvYWRlZCBhcyBpdAorCSAqIHdvbid0IGJlIHBpY2tlZCB1cCBieSBtb2Rwcm9iZXMgZHVlIHRvIHRoZSBpb2M0IG1vZHVsZSBvd25pbmcgdGhlCisJICogUENJIGRldmljZS4KKwkgKi8KKwlpZiAoaWRkLT5pZGRfdmFyaWFudCAhPSBJT0M0X1ZBUklBTlRfUENJX1JUKSB7CisJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwkJd29yayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXdvcmspIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IElPQzQgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJICAgICAgICJsb2FkIG9mIHN1Yi1tb2R1bGVzLlxuIiwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJLyogUmVxdWVzdCB0aGUgbW9kdWxlIGZyb20gYSB3b3JrIHByb2NlZHVyZSBhcyB0aGUKKwkJCSAqIG1vZHByb2JlIGdvZXMgb3V0IHRvIGEgdXNlcmxhbmQgaGVscGVyIGFuZCB0aGF0CisJCQkgKiB3aWxsIGhhbmcgaWYgZG9uZSBkaXJlY3RseSBmcm9tIGlvYzRfcHJvYmUoKS4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9DNCBsb2FkaW5nIHNnaWlvYzQgc3VibW9kdWxlXG4iKTsKKwkJCUlOSVRfV09SSyh3b3JrLCBpb2M0X2xvYWRfbW9kdWxlcyk7CisJCQlzY2hlZHVsZV93b3JrKHdvcmspOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9taXNjX3JlZ2lvbjoKQEAgLTQ2Miw2ICs0OTYsOCBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0CiBpb2M0X2V4aXQodm9pZCkKIHsKKwkvKiBFbnN1cmUgaW9jNF9sb2FkX21vZHVsZXMoKSBoYXMgY29tcGxldGVkIGJlZm9yZSBleGl0aW5nICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jCmluZGV4IGUxMWUxYWMuLjNkMmZjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVtYWluLmMKQEAgLTI5LDcgKzI5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGdydV9kZXZpY2UgPSB7Ci0JLmJ1c19pZCA9IHswfSwKKwkuaW5pdF9uYW1lID0gIiIsCiAJLmRyaXZlciA9ICZncnVfZHJpdmVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwppbmRleCA5YTJlNzcxLi4xNmY4ZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwX21haW4uYwpAQCAtMjUsNyArMjUsNyBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICIiICovCisJLmluaXRfbmFtZSA9ICIiLAkJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cF9kYmdfbmFtZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jCmluZGV4IGU4ZDVjZmIuLjg5MjE4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYworKysgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMKQEAgLTU5LDEyICs1OSwxMiBAQAogfTsKIAogc3RydWN0IGRldmljZSB4cGNfcGFydF9kYmdfc3VibmFtZSA9IHsKLQkuYnVzX2lkID0gezB9LAkJLyogc2V0IHRvICJwYXJ0IiBhdCB4cGNfaW5pdCgpIHRpbWUgKi8KKwkuaW5pdF9uYW1lID0gIiIsCS8qIHNldCB0byAicGFydCIgYXQgeHBjX2luaXQoKSB0aW1lICovCiAJLmRyaXZlciA9ICZ4cGNfZGJnX25hbWUKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBjX2NoYW5fZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiY2hhbiIgYXQgeHBjX2luaXQoKSB0aW1lICovCisJLmluaXRfbmFtZSA9ICIiLAkvKiBzZXQgdG8gImNoYW4iIGF0IHhwY19pbml0KCkgdGltZSAqLwogCS5kcml2ZXIgPSAmeHBjX2RiZ19uYW1lCiB9OwogCkBAIC0xMjU4LDggKzEyNTgsOCBAQAogCWludCByZXQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkOwogCi0Jc25wcmludGYoeHBjX3BhcnQtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJwYXJ0Iik7Ci0Jc25wcmludGYoeHBjX2NoYW4tPmJ1c19pZCwgQlVTX0lEX1NJWkUsICJjaGFuIik7CisJZGV2X3NldF9uYW1lKHhwY19wYXJ0LCAicGFydCIpOworCWRldl9zZXRfbmFtZSh4cGNfY2hhbiwgImNoYW4iKTsKIAogCWlmIChpc19zaHViKCkpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwppbmRleCA4ZTZhYTk1Li44MTE1MmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBuZXRfZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiIiAqLworCS5pbml0X25hbWUgPSAiIiwJLyogc2V0IHRvICIiICovCiAJLmRyaXZlciA9ICZ4cG5ldF9kYmdfbmFtZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCmluZGV4IDY3NTAzZWEuLmJlNTY3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQlpZiAoc29jaykgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICIlcyA6IGRlbWFuZCByZW1vdmluZyBjYXJkIGZyb20gc29ja2V0ICV1OiV1XG4iLAotCQkJICAgICAgIGZtLT5kZXYuYnVzX2lkLCBmbS0+aWQsIGNudCk7CisJCQkgICAgICAgZGV2X25hbWUoJmZtLT5kZXYpLCBmbS0+aWQsIGNudCk7CiAJCQlmbS0+c29ja2V0c1tjbnRdID0gTlVMTDsKIAkJCXNvY2tfYWRkciA9IHNvY2stPmFkZHI7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbS0+bG9jaywgZmxhZ3MpOwpAQCAtMzU0LDggKzM1NCw3IEBACiAJZm0tPmhhc19tc19waWYgPSB0aWZtXzd4eDFfaGFzX21zX3BpZjsKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBmbSk7CiAKLQlmbS0+YWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkgICBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCkpOworCWZtLT5hZGRyID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFmbS0+YWRkcikKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwppbmRleCA4MmRjNzJhMS4uOThiY2JhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlzbnByaW50ZihmbS0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJ0aWZtJXUiLCBmbS0+aWQpOworCWRldl9zZXRfbmFtZSgmZm0tPmRldiwgInRpZm0ldSIsIGZtLT5pZCk7CiAJcmMgPSBkZXZpY2VfYWRkKCZmbS0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJc3Bpbl9sb2NrKCZ0aWZtX2FkYXB0ZXJfbG9jayk7CkBAIC0yNjYsOSArMjY2LDggQEAKIAkJc29jay0+ZGV2LmRtYV9tYXNrID0gZm0tPmRldi5wYXJlbnQtPmRtYV9tYXNrOwogCQlzb2NrLT5kZXYucmVsZWFzZSA9IHRpZm1fZnJlZV9kZXZpY2U7CiAKLQkJc25wcmludGYoc29jay0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCQkgInRpZm1fJXMldToldSIsIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLAotCQkJIGZtLT5pZCwgaWQpOworCQlkZXZfc2V0X25hbWUoJnNvY2stPmRldiwgInRpZm1fJXMldToldSIsCisJCQkgICAgIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLCBmbS0+aWQsIGlkKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQogCQkgICAgICAgIjogJXMgY2FyZCBkZXRlY3RlZCBpbiBzb2NrZXQgJXU6JXVcbiIsCiAJCSAgICAgICB0aWZtX21lZGlhX3R5cGVfbmFtZSh0eXBlLCAwKSwgZm0tPmlkLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCA2NjU5YjIyLi41NzMzZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIGludCBlcmFzZV9jaGlwKHN0cnVjdCBtMjVwICpmbGFzaCkKIHsKIAlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLnNpemUgLyAxMDI0KTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogc3RhdGljIGludCBlcmFzZV9zZWN0b3Ioc3RydWN0IG0yNXAgKmZsYXNoLCB1MzIgb2Zmc2V0KQogewogCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICIlczogJXMgJWRLaUIgYXQgMHglMDh4XG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sCiAJCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSAvIDEwMjQsIG9mZnNldCk7CiAKIAkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCkBAIC0yMzQsNyArMjM0LDcgQEAKIAl1MzIgYWRkcixsZW47CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICVkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJhdCIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJhdCIsCiAJCQkodTMyKWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlemRcbiIsCi0JCQlmbGFzaC0+c3BpLT5kZXYuYnVzX2lkLCBfX2Z1bmNfXywgImZyb20iLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAiZnJvbSIsCiAJCQkodTMyKWZyb20sIGxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCkBAIC0zNjcsNyArMzY3LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJ0byIsCisJCQlkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJ0byIsCiAJCQkodTMyKXRvLCBsZW4pOwogCiAJaWYgKHJldGxlbikKQEAgLTU2Myw3ICs1NjMsNyBAQAogCXRtcCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCAmY29kZSwgMSwgaWQsIDUpOwogCWlmICh0bXAgPCAwKSB7CiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogZXJyb3IgJWQgcmVhZGluZyBKRURFQyBJRFxuIiwKLQkJCXNwaS0+ZGV2LmJ1c19pZCwgdG1wKTsKKwkJCWRldl9uYW1lKCZzcGktPmRldiksIHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlqZWRlYyA9IGlkWzBdOwpAQCAtNjE3LDcgKzYxNyw3IEBACiAJCS8qIHVucmVjb2duaXplZCBjaGlwPyAqLwogCQlpZiAoaSA9PSBBUlJBWV9TSVpFKG0yNXBfZGF0YSkpIHsKIAkJCURFQlVHKE1URF9ERUJVR19MRVZFTDAsICIlczogdW5yZWNvZ25pemVkIGlkICVzXG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIGRhdGEtPnR5cGUpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBkYXRhLT50eXBlKTsKIAkJCWluZm8gPSBOVUxMOwogCiAJCS8qIHJlY29nbml6ZWQ7IGlzIHRoYXQgY2hpcCByZWFsbHkgd2hhdCdzIHRoZXJlPyAqLwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJaWYgKGRhdGEgJiYgZGF0YS0+bmFtZSkKIAkJZmxhc2gtPm10ZC5uYW1lID0gZGF0YS0+bmFtZTsKIAllbHNlCi0JCWZsYXNoLT5tdGQubmFtZSA9IHNwaS0+ZGV2LmJ1c19pZDsKKwkJZmxhc2gtPm10ZC5uYW1lID0gZGV2X25hbWUoJnNwaS0+ZGV2KTsKIAogCWZsYXNoLT5tdGQudHlwZSA9IE1URF9OT1JGTEFTSDsKIAlmbGFzaC0+bXRkLndyaXRlc2l6ZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCmluZGV4IDZkZDlhZmYuLjY1MTI2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3N0YXR1cyhzcGkpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgJWQ/XG4iLAotCQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCQlzdGF0dXMgPSAwOwogCQl9CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogZXJhc2UgYWRkcj0weCV4IGxlbiAweCV4XG4iLAotCQkJc3BpLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwKIAkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcmFzZSAleCwgZXJyICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgcGFnZWFkZHIsIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgcGFnZWFkZHIsIHN0YXR1cyk7CiAJCQkvKiBSRVZJU0lUOiAgY2FuIHJldHJ5IGluc3RyLT5yZXRyaWVzIHRpbWVzOyBvcgogCQkJICogZ2l2ZXVwIGFuZCBpbnN0ci0+ZmFpbF9hZGRyID0gaW5zdHItPmFkZHI7CiAJCQkgKi8KQEAgLTIzOSw3ICsyMzksNyBAQAogCWludAkJCXN0YXR1czsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogcmVhZCAweCV4Li4weCV4XG4iLAotCQlwcml2LT5zcGktPmRldi5idXNfaWQsICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnByaXYtPnNwaS0+ZGV2KSwgKHVuc2lnbmVkKWZyb20sICh1bnNpZ25lZCkoZnJvbSArIGxlbikpOwogCiAJKnJldGxlbiA9IDA7CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogCQlzdGF0dXMgPSAwOwogCX0gZWxzZQogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlYWQgJXguLiV4IC0tPiAlZFxuIiwKLQkJCXByaXYtPnNwaS0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZwcml2LT5zcGktPmRldiksCiAJCQkodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSwKIAkJCXN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMxNSw3ICszMTUsNyBAQAogCXVpbnQ4X3QJCQkqY29tbWFuZDsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogd3JpdGUgMHgleC4uMHgleFxuIiwKLQkJc3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpdG8sICh1bnNpZ25lZCkodG8gKyBsZW4pKTsKKwkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CiAKIAkqcmV0bGVuID0gMDsKIApAQCAtMzc0LDcgKzM3NCw3IEBACiAJCQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtc2cpOwogCQkJaWYgKHN0YXR1cyA8IDApCiAJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB4ZmVyICV1IC0+ICVkIFxuIiwKLQkJCQkJc3BpLT5kZXYuYnVzX2lkLCBhZGRyLCBzdGF0dXMpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCQkodm9pZCkgZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwogCQl9CkBAIC0zOTYsNyArMzk2LDcgQEAKIAkJc3BpX3RyYW5zZmVyX2RlbCh4ICsgMSk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBwZ20gJXUvJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgd3JpdGVsZW4sIHN0YXR1cyk7CiAKIAkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIApAQCAtNDE2LDE0ICs0MTYsMTQgQEAKIAkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGNvbXBhcmUgJXUgLT4gJWQgXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBhZGRyLCBzdGF0dXMpOwogCiAJCXN0YXR1cyA9IGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIAogCQkvKiBDaGVjayByZXN1bHQgb2YgdGhlIGNvbXBhcmUgb3BlcmF0aW9uICovCiAJCWlmIChzdGF0dXMgJiAoMSA8PCA2KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tcGFyZSBwYWdlICV1LCBlcnIgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBwYWdlYWRkciwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBwYWdlYWRkciwgc3RhdHVzKTsKIAkJCXJlbWFpbmluZyA9IDA7CiAJCQlzdGF0dXMgPSAtRUlPOwogCQkJYnJlYWs7CkBAIC03NzksNyArNzc5LDcgQEAKIAl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCAzKTsKIAlpZiAodG1wIDwgMCkgewogCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCi0JCQlzcGktPmRldi5idXNfaWQsIHRtcCk7CisJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOwogCQlyZXR1cm4gRVJSX1BUUih0bXApOwogCX0KIAlpZiAoaWRbMF0gIT0gMHgxZikKQEAgLTg2OSw3ICs4NjksNyBAQAogCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAlpZiAoc3RhdHVzIDw9IDAgfHwgc3RhdHVzID09IDB4ZmYpIHsKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBzdGF0dXMgZXJyb3IgJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgPT0gMCB8fCBzdGF0dXMgPT0gMHhmZikKIAkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCXJldHVybiBzdGF0dXM7CkBAIC05MDUsMTMgKzkwNSwxMyBAQAogCS8qIG9ic29sZXRlIEFUNDVEQjEyODIgbm90ICh5ZXQ/KSBzdXBwb3J0ZWQgKi8KIAlkZWZhdWx0OgogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAoJXgpXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzICYgMHgzYyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgc3RhdHVzICYgMHgzYyk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJfQogCiAJaWYgKHN0YXR1cyA8IDApCiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogYWRkX2RhdGFmbGFzaCAtLT4gJWRcbiIsCi0JCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtOTIxLDcgKzkyMSw3IEBACiAJc3RydWN0IGRhdGFmbGFzaAkqZmxhc2ggPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgc3BpLT5kZXYuYnVzX2lkKTsKKwlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IHJlbW92ZVxuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIAlpZiAobXRkX2hhc19wYXJ0aXRpb25zKCkgJiYgZmxhc2gtPnBhcnRpdGlvbmVkKQogCQlzdGF0dXMgPSBkZWxfbXRkX3BhcnRpdGlvbnMoJmZsYXNoLT5tdGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pbnRlZ3JhdG9yLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYwppbmRleCA3MTAwZWUzLi5kMmVjMjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBsYXQtPndpZHRoOwogCWluZm8tPm1hcC5waHlzCQk9IHJlcy0+c3RhcnQ7CiAJaW5mby0+bWFwLnZpcnQJCT0gYmFzZTsKLQlpbmZvLT5tYXAubmFtZQkJPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUJCT0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAuc2V0X3ZwcAk9IGFybWZsYXNoX3NldF92cHA7CiAKIAlzaW1wbGVfbWFwX2luaXQoJmluZm8tPm1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCmluZGV4IDNlYTFkZTkuLmQ0ZmI5YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCkBAIC0xODgsNyArMTg4LDcgQEAKICAJICovCiAJaW5mby0+bWFwLm1hcF9wcml2XzIgPSAodW5zaWduZWQgbG9uZykgaXhwX2RhdGEtPmJhbmtfc2V0dXA7CiAKLQlpbmZvLT5tYXAubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZSA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJaW5mby0+bWFwLnJlYWQgPSBpeHAyMDAwX2ZsYXNoX3JlYWQ4OwogCWluZm8tPm1hcC53cml0ZSA9IGl4cDIwMDBfZmxhc2hfd3JpdGU4OwogCWluZm8tPm1hcC5jb3B5X2Zyb20gPSBpeHAyMDAwX2ZsYXNoX2NvcHlfZnJvbTsKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiAJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+cmVzb3VyY2UtPnN0YXJ0LAogCQkJZGV2LT5yZXNvdXJjZS0+ZW5kIC0gZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxLAotCQkJZGV2LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaW5mby0+cmVzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGQgbm90IHJlc2VydmUgbWVtb3J5IHJlZ2lvblxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYwppbmRleCAxNjU1NWNiLi43MjE0Yjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCSAqIGhhbmRsZSB0aGF0LgogCSAqLwogCWluZm8tPm1hcC5iYW5rd2lkdGggPSAyOwotCWluZm8tPm1hcC5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucmVhZCA9IGl4cDR4eF9yZWFkMTYsCiAJaW5mby0+bWFwLndyaXRlID0gaXhwNHh4X3Byb2JlX3dyaXRlMTYsCiAJaW5mby0+bWFwLmNvcHlfZnJvbSA9IGl4cDR4eF9jb3B5X2Zyb20sCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMgYi9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKaW5kZXggMDVmMjc2YS4uN2U1MGU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKIAl9Ci0JaW5mby0+bWFwLm5hbWUJCT0gcGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucGh5cwkJPSByZXMtPnN0YXJ0OwogCWluZm8tPm1hcC5zaXplCQk9IHNpemU7CiAJaW5mby0+bWFwLmJhbmt3aWR0aAk9IHBkYXRhLT53aWR0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggZGZiZjNmMi4uMWRiMTZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKQEAgLTEwOCwxMyArMTA4LDEzIEBACiAJCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJmRldi0+ZGV2LAogCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCwKIAkJCWRldi0+cmVzb3VyY2VbaV0uZW5kIC0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydCArIDEsCi0JCQlkZXYtPmRldi5idXNfaWQpKSB7CisJCQlkZXZfbmFtZSgmZGV2LT5kZXYpKSkgewogCQkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAotCQlpbmZvLT5tYXBbaV0ubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwkJaW5mby0+bWFwW2ldLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCQlpbmZvLT5tYXBbaV0ucGh5cyA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CiAJCWluZm8tPm1hcFtpXS5zaXplID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgLSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgMTsKIAkJaW5mby0+bWFwW2ldLmJhbmt3aWR0aCA9IHBoeXNtYXBfZGF0YS0+d2lkdGg7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJICogV2UgZGV0ZWN0ZWQgbXVsdGlwbGUgZGV2aWNlcy4gQ29uY2F0ZW5hdGUgdGhlbSB0b2dldGhlci4KIAkJICovCiAjaWZkZWYgQ09ORklHX01URF9DT05DQVQKLQkJaW5mby0+Y210ZCA9IG10ZF9jb25jYXRfY3JlYXRlKGluZm8tPm10ZCwgZGV2aWNlc19mb3VuZCwgZGV2LT5kZXYuYnVzX2lkKTsKKwkJaW5mby0+Y210ZCA9IG10ZF9jb25jYXRfY3JlYXRlKGluZm8tPm10ZCwgZGV2aWNlc19mb3VuZCwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJCWlmIChpbmZvLT5jbXRkID09IE5VTEwpCiAJCQllcnIgPSAtRU5YSU87CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwppbmRleCA1ZmNmZWMwLi5mYmYwY2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAllcnIgPSAtRUJVU1k7CiAJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEsCi0JCQkJICAgICAgIGRldi0+ZGV2LmJ1c19pZCk7CisJCQkJICAgICAgIGRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaW5mby0+cmVzKQogCQlnb3RvIGVycl9vdXQ7CiAKQEAgLTE5NCw3ICsxOTQsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaW5mby0+bWFwLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCWluZm8tPm1hcC5waHlzID0gcmVzLnN0YXJ0OwogCWluZm8tPm1hcC5zaXplID0gcmVzLmVuZCAtIHJlcy5zdGFydCArIDE7CiAJaW5mby0+bWFwLmJhbmt3aWR0aCA9ICp3aWR0aDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKaW5kZXggNzg5ODQyZC4uMWEwNWNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKQEAgLTY5MSw3ICs2OTEsNyBAQAogICovCiBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jb25jYXRfY3JlYXRlKHN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2W10sCS8qIHN1YmRldmljZXMgdG8gY29uY2F0ZW5hdGUgKi8KIAkJCQkgICBpbnQgbnVtX2RldnMsCS8qIG51bWJlciBvZiBzdWJkZXZpY2VzICAgICAgKi8KLQkJCQkgICBjaGFyICpuYW1lKQorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CQkJCS8qIG5hbWUgZm9yIHRoZSBuZXcgZGV2aWNlICAgKi8KIAlpbnQgaTsKIAlzaXplX3Qgc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZnNsX3VwbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKaW5kZXggYTgzMTkyZi4uNzgxNWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCiAJZnVuLT5ybmJfZ3BpbyA9IG9mX2dldF9ncGlvKG9mZGV2LT5ub2RlLCAwKTsKIAlpZiAoZnVuLT5ybmJfZ3BpbyA+PSAwKSB7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChmdW4tPnJuYl9ncGlvLCBvZmRldi0+ZGV2LmJ1c19pZCk7CisJCXJldCA9IGdwaW9fcmVxdWVzdChmdW4tPnJuYl9ncGlvLCBkZXZfbmFtZSgmb2ZkZXYtPmRldikpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiY2FuJ3QgcmVxdWVzdCBSTkIgZ3Bpb1xuIik7CiAJCQlnb3RvIGVycjI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwppbmRleCBmNjc0YzU0Li43NWY5ZjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlkYXRhLT5jaGlwLnByaXYgPSAmZGF0YTsKIAlkYXRhLT5tdGQucHJpdiA9ICZkYXRhLT5jaGlwOwogCWRhdGEtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwotCWRhdGEtPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwlkYXRhLT5tdGQubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCiAJZGF0YS0+Y2hpcC5JT19BRERSX1IgPSBkYXRhLT5pb19iYXNlOwogCWRhdGEtPmNoaXAuSU9fQUREUl9XID0gZGF0YS0+aW9fYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCmluZGV4IGVkYjFlMzIuLmRhYTZhNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJbmFuZF9jaGlwLT5jaGlwX2RlbGF5ID0gMTU7CiAKIAlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsICZ0bWlvX2lycSwKLQkJCQlJUlFGX0RJU0FCTEVELCBkZXYtPmRldi5idXNfaWQsIHRtaW8pOworCQkJCUlSUUZfRElTQUJMRUQsIGRldl9uYW1lKCZkZXYtPmRldiksIHRtaW8pOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJyZXF1ZXN0X2lycSBlcnJvciAlZFxuIiwgcmV0dmFsKTsKIAkJZ290byBlcnJfaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9nZW5lcmljLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYwppbmRleCBhZDgxYWI4Li41YjY5ZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYwpAQCAtNjMsNyArNjMsNyBAQAogCWluZm8tPm9uZW5hbmQubW1jb250cm9sID0gcGRhdGEtPm1tY29udHJvbDsKIAlpbmZvLT5vbmVuYW5kLmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAKLQlpbmZvLT5tdGQubmFtZSA9IHBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bXRkLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlpbmZvLT5tdGQucHJpdiA9ICZpbmZvLT5vbmVuYW5kOwogCWluZm8tPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKaW5kZXggZDFlMGI4ZS4uOTZlY2MxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYwpAQCAtNjY4LDcgKzY2OCw3IEBACiAJCSBjLT5vbmVuYW5kLmJhc2UpOwogCiAJYy0+cGRldiA9IHBkZXY7Ci0JYy0+bXRkLm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCWMtPm10ZC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAJYy0+bXRkLnByaXYgPSAmYy0+b25lbmFuZDsKIAljLT5tdGQub3duZXIgPSBUSElTX01PRFVMRTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwppbmRleCBiYTBiZDNkLi43Y2FmMjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYworKysgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJdWJpLT5kZXYucmVsZWFzZSA9IGRldl9yZWxlYXNlOwogCXViaS0+ZGV2LmRldnQgPSB1YmktPmNkZXYuZGV2OwogCXViaS0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOwotCXNwcmludGYoJnViaS0+ZGV2LmJ1c19pZFswXSwgVUJJX05BTUVfU1RSIiVkIiwgdWJpLT51YmlfbnVtKTsKKwlkZXZfc2V0X25hbWUoJnViaS0+ZGV2LCBVQklfTkFNRV9TVFIiJWQiLCB1YmktPnViaV9udW0pOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmdWJpLT5kZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvdm10LmMgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKaW5kZXggMzUzMWNhOS4uMjJlMWQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92bXQuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJdm9sLT5kZXYuZGV2dCA9IGRldjsKIAl2b2wtPmRldi5jbGFzcyA9IHViaV9jbGFzczsKIAotCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOworCWRldl9zZXRfbmFtZSgmdm9sLT5kZXYsICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZvbC0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXViaV9lcnIoImNhbm5vdCByZWdpc3RlciBkZXZpY2UiKTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCXZvbC0+ZGV2LnBhcmVudCA9ICZ1YmktPmRldjsKIAl2b2wtPmRldi5kZXZ0ID0gZGV2OwogCXZvbC0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOwotCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOworCWRldl9zZXRfbmFtZSgmdm9sLT5kZXYsICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZvbC0+ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9nbHVlYmk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCmluZGV4IGFjMmE4MDUuLjg5MDFlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAlhZGRfdGltZXIgKCZ0aW1lcik7CiAJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlICgmcG9ydC0+cGh5c3BvcnQtPmllZWUxMjg0LmlycSk7Ci0JaWYgKCFkZWxfdGltZXIgKCZ0aW1lcikgJiYgIXJldCkKKwlpZiAoIWRlbF90aW1lcl9zeW5jKCZ0aW1lcikgJiYgIXJldCkKIAkJLyogVGltZWQgb3V0LiAqLwogCQlyZXQgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggYjRjZGQ2OS4uOTlkODY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtMzAwLDYgKzMwMCwxNCBAQAogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAKK3N0YXRpYyBib29sIHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKworCXJldHVybiBkcnYgJiYgKGRydi0+c3VzcGVuZCB8fCBkcnYtPnN1c3BlbmRfbGF0ZSB8fCBkcnYtPnJlc3VtZQorCQl8fCBkcnYtPnJlc3VtZV9lYXJseSk7Cit9CisKIC8qCiAgKiBEZWZhdWx0ICJzdXNwZW5kIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCBzdXNwZW5kLAogICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsLgpAQCAtMzE3LDE0ICszMjUsMjIgQEAKIAogLyoKICAqIERlZmF1bHQgInJlc3VtZSIgbWV0aG9kIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBubyBkcml2ZXIgcHJvdmlkZWQgcmVzdW1lLAotICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsLgorICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsIChmaXJzdCBwYXJ0KS4KICAqLwotc3RhdGljIGludCBwY2lfZGVmYXVsdF9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCitzdGF0aWMgdm9pZCBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7Ci0JaW50IHJldHZhbCA9IDA7Ci0KIAkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7Cit9CisKKy8qCisgKiBEZWZhdWx0ICJyZXN1bWUiIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHJlc3VtZSwKKyAqIG9yIG5vdCBldmVuIGEgZHJpdmVyIGF0IGFsbCAoc2Vjb25kIHBhcnQpLgorICovCitzdGF0aWMgaW50IHBjaV9kZWZhdWx0X3BtX3Jlc3VtZV9sYXRlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCWludCByZXR2YWw7CisKIAkvKiBpZiB0aGUgZGV2aWNlIHdhcyBlbmFibGVkIGJlZm9yZSBzdXNwZW5kLCByZWVuYWJsZSAqLwogCXJldHZhbCA9IHBjaV9yZWVuYWJsZV9kZXZpY2UocGNpX2Rldik7CiAJLyoKQEAgLTM3MSwxMCArMzg3LDEyIEBACiAJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwogCi0JaWYgKGRydiAmJiBkcnYtPnJlc3VtZSkKKwlpZiAoZHJ2ICYmIGRydi0+cmVzdW1lKSB7CiAJCWVycm9yID0gZHJ2LT5yZXN1bWUocGNpX2Rldik7Ci0JZWxzZQotCQllcnJvciA9IHBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKKwl9IGVsc2UgeworCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkocGNpX2Rldik7CisJCWVycm9yID0gcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2xhdGUocGNpX2Rldik7CisJfQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDIwLDEwICs0MzgsOCBAQAogCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZCkgewogCQkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7CiAJCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+c3VzcGVuZCwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKIAl9CiAJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgcGNpX2Rldik7CkBAIC00MzQsNyArNDUwLDcgQEAKIHN0YXRpYyBpbnQgcGNpX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKQEAgLTQ0Miw4ICs0NTgsMTAgQEAKIAkJCWVycm9yID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOwogCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmRfbm9pcnEsIGVycm9yKTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOworCX0gZWxzZSB7CisJCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwpAQCAtNDUzLDE1ICs0NzEsMTcgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IDA7CiAKIAlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHBjaV9kZXYpOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lID8gZHJ2LT5wbS0+cmVzdW1lKGRldikgOgotCQkJcGNpX2RlZmF1bHRfcG1fcmVzdW1lKHBjaV9kZXYpOwotCX0gZWxzZSB7CisJCWlmIChkcnYtPnBtLT5yZXN1bWUpCisJCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZShkZXYpOworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShwY2lfZGV2KTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC00NzAsMTYgKzQ5MCwxOCBAQAogc3RhdGljIGludCBwY2lfcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHRvX3BjaV9kZXYoZGV2KSk7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnJlc3VtZV9ub2lycSkKIAkJCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOworCX0gZWxzZSB7CisJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZV9lYXJseShwY2lfZGV2KTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC01MDYsMTAgKzUyOCw4IEBACiAJCWlmIChkcnYtPnBtLT5mcmVlemUpIHsKIAkJCWVycm9yID0gZHJ2LT5wbS0+ZnJlZXplKGRldik7CiAJCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+ZnJlZXplLCBlcnJvcik7Ci0JCX0gZWxzZSB7Ci0JCQlwY2lfZGVmYXVsdF9wbV9zdXNwZW5kKHBjaV9kZXYpOwogCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0ZSRUVaRSk7CiAJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOwogCX0KQEAgLTUyMCw3ICs1NDAsNyBAQAogc3RhdGljIGludCBwY2lfcG1fZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CkBAIC01MjgsOCArNTQ4LDEwIEBACiAJCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOwogCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZV9ub2lycSwgZXJyb3IpOwogCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfRlJFRVpFKTsKKwl9IGVsc2UgeworCQlwY2lfZGVmYXVsdF9wbV9zdXNwZW5kKHBjaV9kZXYpOwogCX0KIAogCXJldHVybiBlcnJvcjsKQEAgLTUzNywxNCArNTU5LDE1IEBACiAKIHN0YXRpYyBpbnQgcGNpX3BtX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT50aGF3KQogCQkJZXJyb3IgPSAgZHJ2LT5wbS0+dGhhdyhkZXYpOwotCX0gZWxzZSB7Ci0JCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZSwgdG9fcGNpX2RldihkZXYpKTsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKKwkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKIAkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOwogCX0KIApAQCAtNTU0LDE0ICs1NzcsMTQgQEAKIHN0YXRpYyBpbnQgcGNpX3BtX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnRoYXdfbm9pcnEpCiAJCQllcnJvciA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKLQl9IGVsc2UgewotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgeworCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHRvX3BjaV9kZXYoZGV2KSk7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CiAKQEAgLTU3MCwxNyArNTkzLDE4IEBACiAKIHN0YXRpYyBpbnQgcGNpX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHRvX3BjaV9kZXYoZGV2KSk7CisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgcGNpX2Rldik7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmKSB7CiAJCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7CiAJCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+cG93ZXJvZmYsIGVycm9yKTsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7CiAJCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOwogCX0KIApAQCAtNTg5LDggKzYxMyw3IEBACiAKIHN0YXRpYyBpbnQgcGNpX3BtX3Bvd2Vyb2ZmX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKGRydiAmJiBkcnYtPnBtKSB7CkBAIC01OTgsNyArNjIxLDcgQEAKIAkJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEoZGV2KTsKIAkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSwgZXJyb3IpOwogCQl9Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQodG9fcGNpX2RldihkZXYpKSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOwogCX0KIApAQCAtNjA5LDEzICs2MzIsMTUgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IDA7CiAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlID8gZHJ2LT5wbS0+cmVzdG9yZShkZXYpIDoKLQkJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKLQl9IGVsc2UgeworCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZSkKKwkJCWVycm9yID0gZHJ2LT5wbS0+cmVzdG9yZShkZXYpOworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShwY2lfZGV2KTsKIAl9CiAJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKIApAQCAtNjI1LDcgKzY1MCw3IEBACiBzdGF0aWMgaW50IHBjaV9wbV9yZXN0b3JlX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKQEAgLTYzMyw4ICs2NTgsMTAgQEAKIAlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCiAJCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmVfbm9pcnEoZGV2KTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewogCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CisJfSBlbHNlIHsKKwkJcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2Vhcmx5KHBjaV9kZXYpOwogCX0KIAlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOwogCkBAIC02NTQsMTcgKzY4MSwxNSBAQAogCiAjZW5kaWYgLyogIUNPTkZJR19ISUJFUk5BVElPTiAqLwogCi1zdHJ1Y3QgcG1fZXh0X29wcyBwY2lfcG1fb3BzID0gewotCS5iYXNlID0gewotCQkucHJlcGFyZSA9IHBjaV9wbV9wcmVwYXJlLAotCQkuY29tcGxldGUgPSBwY2lfcG1fY29tcGxldGUsCi0JCS5zdXNwZW5kID0gcGNpX3BtX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBwY2lfcG1fcmVzdW1lLAotCQkuZnJlZXplID0gcGNpX3BtX2ZyZWV6ZSwKLQkJLnRoYXcgPSBwY2lfcG1fdGhhdywKLQkJLnBvd2Vyb2ZmID0gcGNpX3BtX3Bvd2Vyb2ZmLAotCQkucmVzdG9yZSA9IHBjaV9wbV9yZXN0b3JlLAotCX0sCitzdHJ1Y3QgZGV2X3BtX29wcyBwY2lfZGV2X3BtX29wcyA9IHsKKwkucHJlcGFyZSA9IHBjaV9wbV9wcmVwYXJlLAorCS5jb21wbGV0ZSA9IHBjaV9wbV9jb21wbGV0ZSwKKwkuc3VzcGVuZCA9IHBjaV9wbV9zdXNwZW5kLAorCS5yZXN1bWUgPSBwY2lfcG1fcmVzdW1lLAorCS5mcmVlemUgPSBwY2lfcG1fZnJlZXplLAorCS50aGF3ID0gcGNpX3BtX3RoYXcsCisJLnBvd2Vyb2ZmID0gcGNpX3BtX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0gcGNpX3BtX3Jlc3RvcmUsCiAJLnN1c3BlbmRfbm9pcnEgPSBwY2lfcG1fc3VzcGVuZF9ub2lycSwKIAkucmVzdW1lX25vaXJxID0gcGNpX3BtX3Jlc3VtZV9ub2lycSwKIAkuZnJlZXplX25vaXJxID0gcGNpX3BtX2ZyZWV6ZV9ub2lycSwKQEAgLTY3Myw3ICs2OTgsNyBAQAogCS5yZXN0b3JlX25vaXJxID0gcGNpX3BtX3Jlc3RvcmVfbm9pcnEsCiB9OwogCi0jZGVmaW5lIFBDSV9QTV9PUFNfUFRSCSZwY2lfcG1fb3BzCisjZGVmaW5lIFBDSV9QTV9PUFNfUFRSCSgmcGNpX2Rldl9wbV9vcHMpCiAKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIApAQCAtNzAzLDkgKzcyOCw2IEBACiAJZHJ2LT5kcml2ZXIub3duZXIgPSBvd25lcjsKIAlkcnYtPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOwogCi0JaWYgKGRydi0+cG0pCi0JCWRydi0+ZHJpdmVyLnBtID0gJmRydi0+cG0tPmJhc2U7Ci0KIAlzcGluX2xvY2tfaW5pdCgmZHJ2LT5keW5pZHMubG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmRydi0+ZHluaWRzLmxpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jYXJkLmMgYi9kcml2ZXJzL3BucC9jYXJkLmMKaW5kZXggZTc1YjA2MC4uZWZlYTEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY2FyZC5jCisrKyBiL2RyaXZlcnMvcG5wL2NhcmQuYwpAQCAtMTY1LDggKzE2NSw3IEBACiAJY2FyZC0+bnVtYmVyID0gaWQ7CiAKIAljYXJkLT5kZXYucGFyZW50ID0gJmNhcmQtPnByb3RvY29sLT5kZXY7Ci0Jc3ByaW50ZihjYXJkLT5kZXYuYnVzX2lkLCAiJTAyeDolMDJ4IiwgY2FyZC0+cHJvdG9jb2wtPm51bWJlciwKLQkJY2FyZC0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoJmNhcmQtPmRldiwgIiUwMng6JTAyeCIsIGNhcmQtPnByb3RvY29sLT5udW1iZXIsIGNhcmQtPm51bWJlcik7CiAKIAljYXJkLT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMjRCSVRfTUFTSzsKIAljYXJkLT5kZXYuZG1hX21hc2sgPSAmY2FyZC0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrOwpAQCAtMjk1LDggKzI5NCw4IEBACiB7CiAJZGV2LT5kZXYucGFyZW50ID0gJmNhcmQtPmRldjsKIAlkZXYtPmNhcmRfbGluayA9IE5VTEw7Ci0Jc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiUwMng6JTAyeC4lMDJ4IiwKLQkJIGRldi0+cHJvdG9jb2wtPm51bWJlciwgY2FyZC0+bnVtYmVyLCBkZXYtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiUwMng6JTAyeC4lMDJ4IiwKKwkJICAgICBkZXYtPnByb3RvY29sLT5udW1iZXIsIGNhcmQtPm51bWJlciwgZGV2LT5udW1iZXIpOwogCXNwaW5fbG9jaygmcG5wX2xvY2spOwogCWRldi0+Y2FyZCA9IGNhcmQ7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5jYXJkX2xpc3QsICZjYXJkLT5kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2NvcmUuYwppbmRleCAxNmMwMWM2Li4xNDgxNGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvY29yZS5jCkBAIC03MCw3ICs3MCw3IEBACiAJc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKIAogCXByb3RvY29sLT5udW1iZXIgPSBub2RlbnVtOwotCXNwcmludGYocHJvdG9jb2wtPmRldi5idXNfaWQsICJwbnAlZCIsIG5vZGVudW0pOworCWRldl9zZXRfbmFtZSgmcHJvdG9jb2wtPmRldiwgInBucCVkIiwgbm9kZW51bSk7CiAJcmV0dXJuIGRldmljZV9yZWdpc3RlcigmcHJvdG9jb2wtPmRldik7CiB9CiAKQEAgLTE0NSw4ICsxNDUsNyBAQAogCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKIAlkZXYtPmRldi5yZWxlYXNlID0gJnBucF9yZWxlYXNlX2RldmljZTsKIAotCXNwcmludGYoZGV2LT5kZXYuYnVzX2lkLCAiJTAyeDolMDJ4IiwgZGV2LT5wcm90b2NvbC0+bnVtYmVyLAotCQlkZXYtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiUwMng6JTAyeCIsIGRldi0+cHJvdG9jb2wtPm51bWJlciwgZGV2LT5udW1iZXIpOwogCiAJZGV2X2lkID0gcG5wX2FkZF9pZChkZXYsIHBucGlkKTsKIAlpZiAoIWRldl9pZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvc3lzdGVtLmMgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwppbmRleCA3NjRmM2EzLi41OWI5MDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zeXN0ZW0uYworKysgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwpAQCAtMjYsNyArMjYsNyBAQAogCQkJICByZXNvdXJjZV9zaXplX3QgZW5kLCBpbnQgcG9ydCkKIHsKIAljaGFyICpyZWdpb25pZDsKLQljb25zdCBjaGFyICpwbnBpZCA9IGRldi0+ZGV2LmJ1c19pZDsKKwljb25zdCBjaGFyICpwbnBpZCA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlyZWdpb25pZCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCmluZGV4IDMwOGRkYjIuLjFkNzY4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJZGktPmRldgkJPSAmcGRldi0+ZGV2OwogCWRpLT53MV9kZXYJICAgICA9IHBkZXYtPmRldi5wYXJlbnQ7Ci0JZGktPmJhdC5uYW1lCSAgID0gcGRldi0+ZGV2LmJ1c19pZDsKKwlkaS0+YmF0Lm5hbWUJICAgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlkaS0+YmF0LnR5cGUJICAgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwogCWRpLT5iYXQucHJvcGVydGllcyAgICAgPSBkczI3NjBfYmF0dGVyeV9wcm9wczsKIAlkaS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkczI3NjBfYmF0dGVyeV9wcm9wcyk7CkBAIC0zNzEsNyArMzcxLDcgQEAKIAl9CiAKIAlJTklUX0RFTEFZRURfV09SSygmZGktPm1vbml0b3Jfd29yaywgZHMyNzYwX2JhdHRlcnlfd29yayk7Ci0JZGktPm1vbml0b3Jfd3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUocGRldi0+ZGV2LmJ1c19pZCk7CisJZGktPm1vbml0b3Jfd3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoJnBkZXYtPmRldikpOwogCWlmICghZGktPm1vbml0b3Jfd3F1ZXVlKSB7CiAJCXJldHZhbCA9IC1FU1JDSDsKIAkJZ290byB3b3JrcXVldWVfZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKaW5kZXggOTU2ZDNlNy4uYWRkYjg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCkBAIC03OSw3ICs3OSw2IEBACiAKIC8qKgogICogIHJpb19kZXZpY2VfcHJvYmUgLSBUZWxsIGlmIGEgUklPIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcgUklPIGRldmljZSBpZCBzdHJ1Y3R1cmUKLSAqICBAaWQ6IHRoZSBSSU8gZGV2aWNlIGlkIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CiAgKiAgQGRldjogdGhlIFJJTyBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKICAqCiAgKiByZXR1cm4gMCBhbmQgc2V0IHJpb19kZXYtPmRyaXZlciB3aGVuIGRydiBjbGFpbXMgcmlvX2RldiwgZWxzZSBlcnJvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggMTY1YTgxOC4uNGFkODMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC0zNSw4ICszNSw4IEBACiAJZGVmYXVsdCAicnRjMCIKIAloZWxwCiAJICBUaGUgUlRDIGRldmljZSB0aGF0IHdpbGwgYmUgdXNlZCB0byAocmUpaW5pdGlhbGl6ZSB0aGUgc3lzdGVtCi0JICBjbG9jaywgdXN1YWxseSBydGMwLiAgSW5pdGlhbGl6YXRpb24gaXMgZG9uZSB3aGVuIHRoZSBzeXN0ZW0KLQkgIHN0YXJ0cyB1cCwgYW5kIHdoZW4gaXQgcmVzdW1lcyBmcm9tIGEgbG93IHBvd2VyIHN0YXRlLiAgVGhpcworCSAgY2xvY2ssIHVzdWFsbHkgcnRjMC4gSW5pdGlhbGl6YXRpb24gaXMgZG9uZSB3aGVuIHRoZSBzeXN0ZW0KKwkgIHN0YXJ0cyB1cCwgYW5kIHdoZW4gaXQgcmVzdW1lcyBmcm9tIGEgbG93IHBvd2VyIHN0YXRlLiBUaGlzCiAJICBkZXZpY2Ugc2hvdWxkIHJlY29yZCB0aW1lIGluIFVUQywgc2luY2UgdGhlIGtlcm5lbCB3b24ndCBkbwogCSAgdGltZXpvbmUgY29ycmVjdGlvbi4KIApAQCAtNDQsNyArNDQsNyBAQAogCSAgZnVuY3Rpb25zIHJ1biwgc28gaXQgbXVzdCB1c3VhbGx5IGJlIHN0YXRpY2FsbHkgbGlua2VkLgogCiAJICBUaGlzIGNsb2NrIHNob3VsZCBiZSBiYXR0ZXJ5LWJhY2tlZCwgc28gdGhhdCBpdCByZWFkcyB0aGUgY29ycmVjdAotCSAgdGltZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMgZnJvbSBhIHBvd2VyLW9mZiBzdGF0ZS4gIE90aGVyd2lzZSwgeW91cgorCSAgdGltZSB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMgZnJvbSBhIHBvd2VyLW9mZiBzdGF0ZS4gT3RoZXJ3aXNlLCB5b3VyCiAJICBzeXN0ZW0gd2lsbCBuZWVkIGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAobGlrZSBhbiBOVFAgc2VydmVyKS4KIAogCSAgSWYgdGhlIGNsb2NrIHlvdSBzcGVjaWZ5IGhlcmUgaXMgbm90IGJhdHRlcnkgYmFja2VkLCBpdCBtYXkgc3RpbGwKQEAgLTY5LDggKzY5LDcgQEAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBSVENzIHVzaW5nIHN5c2ZzIGludGVyZmFjZXMsCiAJICAvc3lzL2NsYXNzL3J0Yy9ydGMwIHRocm91Z2ggL3N5cy8uLi4vcnRjTi4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBydGMtc3lzZnMuCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgUlRDX0lOVEZfUFJPQwogCWJvb2xlYW4gIi9wcm9jL2RyaXZlci9ydGMgKHByb2NmcyBmb3IgcnRjMCkiCkBAIC03OCwxMSArNzcsMTAgQEAKIAlkZWZhdWx0IFJUQ19DTEFTUwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBmaXJzdCBSVEMgdGhyb3VnaCB0aGUgcHJvYwotCSAgaW50ZXJmYWNlLCAvcHJvYy9kcml2ZXIvcnRjLiAgT3RoZXIgUlRDcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKKwkgIGludGVyZmFjZSwgL3Byb2MvZHJpdmVyL3J0Yy4gT3RoZXIgUlRDcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKIAkgIHRocm91Z2ggdGhhdCBBUEkuCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXByb2MuCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgUlRDX0lOVEZfREVWCiAJYm9vbGVhbiAiL2Rldi9ydGNOIChjaGFyYWN0ZXIgZGV2aWNlcykiCkBAIC05MCwxMiArODgsMTQgQEAKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgUlRDcyB1c2luZyB0aGUgL2RldgogCSAgaW50ZXJmYWNlcywgd2hpY2ggInVkZXYiIHNldHMgdXAgYXMgL2Rldi9ydGMwIHRocm91Z2gKLQkgIC9kZXYvcnRjTi4gIFlvdSBtYXkgd2FudCB0byBzZXQgdXAgYSBzeW1ib2xpYyBsaW5rIHNvIG9uZQotCSAgb2YgdGhlc2UgY2FuIGJlIGFjY2Vzc2VkIGFzIC9kZXYvcnRjLCB3aGljaCBpcyBhIG5hbWUKLQkgIGV4cGVjdGVkIGJ5ICJod2Nsb2NrIiBhbmQgc29tZSBvdGhlciBwcm9ncmFtcy4KKwkgIC9kZXYvcnRjTi4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBydGMtZGV2LgorCSAgWW91IG1heSB3YW50IHRvIHNldCB1cCBhIHN5bWJvbGljIGxpbmsgc28gb25lIG9mIHRoZXNlCisJICBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9ydGMsIHdoaWNoIGlzIGEgbmFtZQorCSAgZXhwZWN0ZWQgYnkgImh3Y2xvY2siIGFuZCBzb21lIG90aGVyIHByb2dyYW1zLiBSZWNlbnQKKwkgIHZlcnNpb25zIG9mICJ1ZGV2IiBhcmUga25vd24gdG8gc2V0IHVwIHRoZSBzeW1saW5rIGZvciB5b3UuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBSVENfSU5URl9ERVZfVUlFX0VNVUwKIAlib29sICJSVEMgVUlFIGVtdWxhdGlvbiBvbiBkZXYgaW50ZXJmYWNlIgpAQCAtMTMyLDE0ICsxMzIsMTQgQEAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNy8zNy8zOC8zOS80MCwgU1QgTTQxVDAwIgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIGNvbXBhdGlibGUgUlRDCi0JICBjaGlwcyAob2Z0ZW4gd2l0aCBiYXR0ZXJ5IGJhY2t1cCkgY29ubmVjdGVkIHdpdGggSTJDLiAgVGhpcyBkcml2ZXIKKwkgIGNoaXBzIChvZnRlbiB3aXRoIGJhdHRlcnkgYmFja3VwKSBjb25uZWN0ZWQgd2l0aCBJMkMuIFRoaXMgZHJpdmVyCiAJICBzaG91bGQgaGFuZGxlIERTMTMwNywgRFMxMzM3LCBEUzEzMzgsIERTMTMzOSwgRFMxMzQwLCBTVCBNNDFUMDAsCi0JICBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuICBJbiBzb21lIGNhc2VzIHRoZSBSVEMgbXVzdCBhbHJlYWR5CisJICBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuIEluIHNvbWUgY2FzZXMgdGhlIFJUQyBtdXN0IGFscmVhZHkKIAkgIGhhdmUgYmVlbiBpbml0aWFsaXplZCAoYnkgbWFudWZhY3R1cmluZyBvciBhIGJvb3Rsb2FkZXIpLgogCiAJICBUaGUgZmlyc3Qgc2V2ZW4gcmVnaXN0ZXJzIG9uIHRoZXNlIGNoaXBzIGhvbGQgYW4gUlRDLCBhbmQgb3RoZXIKIAkgIHJlZ2lzdGVycyBtYXkgYWRkIGZlYXR1cmVzIHN1Y2ggYXMgTlZSQU0sIGEgdHJpY2tsZSBjaGFyZ2VyIGZvcgotCSAgdGhlIFJUQy9OVlJBTSBiYWNrdXAgcG93ZXIsIGFuZCBhbGFybXMuICBOVlJBTSBpcyB2aXNpYmxlIGluCisJICB0aGUgUlRDL05WUkFNIGJhY2t1cCBwb3dlciwgYW5kIGFsYXJtcy4gTlZSQU0gaXMgdmlzaWJsZSBpbgogCSAgc3lzZnMsIGJ1dCBvdGhlciBjaGlwIGZlYXR1cmVzIG1heSBub3QgYmUgYXZhaWxhYmxlLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKQEAgLTE1MCwxMCArMTUwLDEwIEBACiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCi0JICBEUzEzNzQgcmVhbC10aW1lIGNsb2NrIGNoaXBzLiAgSWYgYW4gaW50ZXJydXB0IGlzIGFzc29jaWF0ZWQKKwkgIERTMTM3NCByZWFsLXRpbWUgY2xvY2sgY2hpcHMuIElmIGFuIGludGVycnVwdCBpcyBhc3NvY2lhdGVkCiAJICB3aXRoIHRoZSBkZXZpY2UsIHRoZSBhbGFybSBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZC4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxMzc0LgogCiBjb25maWcgUlRDX0RSVl9EUzE2NzIKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgUlRDIG9uIHRoZQogCSAgVFdMOTIzMzAgIk1lbmVsYXVzIiBwb3dlciBtYW5hZ2VtZW50IGNoaXAsIHVzZWQgd2l0aCBPTUFQMgotCSAgcGxhdGZvcm1zLiAgVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCisJICBwbGF0Zm9ybXMuIFRoZSBzdXBwb3J0IGlzIGludGVncmF0ZWQgd2l0aCB0aGUgcmVzdCBvZgogCSAgdGhlIE1lbmVsYXVzIGRyaXZlcjsgaXQncyBub3Qgc2VwYXJhdGUgbW9kdWxlLgogCiBjb25maWcgUlRDX0RSVl9UV0w0MDMwCkBAIC0zMDgsNyArMzA4LDcgQEAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNS9EUzEzMDYiCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgZHJpdmVyIHRvIGdldCBzdXBwb3J0IGZvciB0aGUgRGFsbGFzL01heGltIERTMTMwNQotCSAgYW5kIERTMTMwNiByZWFsIHRpbWUgY2xvY2sgY2hpcHMuICBUaGVzZSBzdXBwb3J0IGEgdHJpY2tsZQorCSAgYW5kIERTMTMwNiByZWFsIHRpbWUgY2xvY2sgY2hpcHMuIFRoZXNlIHN1cHBvcnQgYSB0cmlja2xlCiAJICBjaGFyZ2VyLCBhbGFybXMsIGFuZCBOVlJBTSBpbiBhZGRpdGlvbiB0byB0aGUgY2xvY2suCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQpAQCAtMzE3LDcgKzMxNyw4IEBACiBjb25maWcgUlRDX0RSVl9EUzEzOTAKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTM5MC85My85NCIKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERTMTM5MC85My85NCBjaGlwcy4KKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIERhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIFJUQyBmZWF0dXJlLCBhbmQgbm90IG90aGVyIGNoaXAKIAkgIGZlYXR1cmVzIHN1Y2ggYXMgYWxhcm1zIGFuZCB0cmlja2xlIGNoYXJnaW5nLgpAQCAtMzgxLDcgKzM4Miw3IEBACiAJICBvciBMUEMgYnVzIGNoaXBzLCBhbmQgc28gb24uCiAKIAkgIFlvdXIgc3lzdGVtIHdpbGwgbmVlZCB0byBkZWZpbmUgdGhlIHBsYXRmb3JtIGRldmljZSB1c2VkIGJ5Ci0JICB0aGlzIGRyaXZlciwgb3RoZXJ3aXNlIGl0IHdvbid0IGJlIGFjY2Vzc2libGUuICBUaGlzIG1lYW5zCisJICB0aGlzIGRyaXZlciwgb3RoZXJ3aXNlIGl0IHdvbid0IGJlIGFjY2Vzc2libGUuIFRoaXMgbWVhbnMKIAkgIHlvdSBjYW4gc2FmZWx5IGVuYWJsZSB0aGlzIGRyaXZlciBpZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyCiAJICBvciBub3QgeW91ciBib2FyZCBoYXMgdGhpcyBraW5kIG9mIGhhcmR3YXJlLgogCkBAIC01OTgsNyArNTk5LDcgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMCB8fCBBUkNIX0FUOTFTQU05UkwKIAloZWxwCiAJICBEcml2ZXIgZm9yIHRoZSBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKSBtb2R1bGUgZm91bmQgb24KLQkgIEF0bWVsIEFUOTFSTTkyMDAncyBhbmQgQVQ5MVNBTTlSTCBjaGlwcy4gIE9uIFNBTTlSTCBjaGlwcworCSAgQXRtZWwgQVQ5MVJNOTIwMCdzIGFuZCBBVDkxU0FNOVJMIGNoaXBzLiBPbiBTQU05UkwgY2hpcHMKIAkgIHRoaXMgaXMgcG93ZXJlZCBieSB0aGUgYmFja3VwIHBvd2VyIHN1cHBseS4KIAogY29uZmlnIFJUQ19EUlZfQVQ5MVNBTTkKQEAgLTYyMCw4ICs2MjEsOCBAQAogCXByb21wdCAiUlRUIG1vZHVsZSBOdW1iZXIiIGlmIEFSQ0hfQVQ5MVNBTTkyNjMKIAlkZXBlbmRzIG9uIFJUQ19EUlZfQVQ5MVNBTTkKIAloZWxwCi0JICBNb3JlIHRoYW4gb25lIFJUVCBtb2R1bGUgaXMgYXZhaWxhYmxlLiAgWW91IGNhbiBjaG9vc2Ugd2hpY2gKLQkgIG9uZSB3aWxsIGJlIHVzZWQgYXMgYW4gUlRDLiAgVGhlIGRlZmF1bHQgb2YgemVybyBpcyBub3JtYWxseQorCSAgTW9yZSB0aGFuIG9uZSBSVFQgbW9kdWxlIGlzIGF2YWlsYWJsZS4gWW91IGNhbiBjaG9vc2Ugd2hpY2gKKwkgIG9uZSB3aWxsIGJlIHVzZWQgYXMgYW4gUlRDLiBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5CiAJICBPSyB0byB1c2UsIHRob3VnaCBzb21lIHN5c3RlbXMgdXNlIHRoYXQgZm9yIG5vbi1SVEMgcHVycG9zZXMuCiAKIGNvbmZpZyBSVENfRFJWX0FUOTFTQU05X0dQQlIKQEAgLTYzMywxMCArNjM0LDIwIEBACiAJZGVwZW5kcyBvbiBSVENfRFJWX0FUOTFTQU05CiAJaGVscAogCSAgVGhlIFJUQyBkcml2ZXIgbmVlZHMgdG8gdXNlIG9uZSBvZiB0aGUgR2VuZXJhbCBQdXJwb3NlIEJhY2t1cAotCSAgUmVnaXN0ZXJzIChHUEJScykgYXMgd2VsbCBhcyB0aGUgUlRULiAgWW91IGNhbiBjaG9vc2Ugd2hpY2ggb25lCi0JICB3aWxsIGJlIHVzZWQuICBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5IE9LIHRvIHVzZSwgYnV0CisJICBSZWdpc3RlcnMgKEdQQlJzKSBhcyB3ZWxsIGFzIHRoZSBSVFQuIFlvdSBjYW4gY2hvb3NlIHdoaWNoIG9uZQorCSAgd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5IE9LIHRvIHVzZSwgYnV0CiAJICBvbiBzb21lIHN5c3RlbXMgb3RoZXIgc29mdHdhcmUgbmVlZHMgdG8gdXNlIHRoYXQgcmVnaXN0ZXIuCiAKK2NvbmZpZyBSVENfRFJWX0FVMVhYWAorCXRyaXN0YXRlICJBdTF4eHggQ291bnRlcjAgUlRDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT0NfQVUxWDAwCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEF1MXh4eCBvbi1jaGlwIENvdW50ZXIwIChUaW1lLU9mLVllYXIKKwkgIGNvdW50ZXIpIHRvIGJlIHVzZWQgYXMgYSBSVEMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWF1MXh4eC4KKwogY29uZmlnIFJUQ19EUlZfQkZJTgogCXRyaXN0YXRlICJCbGFja2ZpbiBPbi1DaGlwIFJUQyIKIAlkZXBlbmRzIG9uIEJMQUNLRklOICYmICFCRjU2MQpAQCAtNjY5LDYgKzY4MCwxNyBAQAogCSB0aGUgUlRDLiBUaGlzIGV4cG9zZXMgdGhhdCBmdW5jdGlvbmFsaXR5IHRocm91Z2ggdGhlIGdlbmVyaWMgUlRDCiAJIGNsYXNzLgogCitjb25maWcgUlRDX0RSVl9QWEEKKyAgICAgICB0cmlzdGF0ZSAiUFhBMjd4L1BYQTN4eCIKKyAgICAgICBkZXBlbmRzIG9uIEFSQ0hfUFhBCisgICAgICAgaGVscAorICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrCisgICAgICAgICBidWlsdCBpbnRvIHlvdXIgUFhBMjd4IG9yIFBYQTN4eCBDUFUuCisKKyAgICAgICAgIFRoaXMgUlRDIGRyaXZlciB1c2VzIFBYQSBSVEMgcmVnaXN0ZXJzIGF2YWlsYWJsZSBzaW5jZSBweGEyN3gKKyAgICAgICAgIHNlcmllcyAoUkR4UiwgUll4UikgaW5zdGVhZCBvZiBsZWdhY3kgUkNOUiwgUlRBUi4KKworCiBjb25maWcgUlRDX0RSVl9TVU40VgogCWJvb2wgIlNVTjRWIEh5cGVydmlzb3IgUlRDIgogCWRlcGVuZHMgb24gU1BBUkM2NApAQCAtNjgzLDQgKzcwNSwyMiBAQAogCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgZm91bmQgb24KIAkgIFN0YXJmaXJlIHN5c3RlbXMuCiAKK2NvbmZpZyBSVENfRFJWX1RYNDkzOQorCXRyaXN0YXRlICJUWDQ5MzkgU29DIgorCWRlcGVuZHMgb24gU09DX1RYNDkzOQorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG1vZHVsZSBmb3VuZCBvbgorCSAgVG9zaGliYSBUWDQ5MzkgU29DLgorCitjb25maWcgUlRDX0RSVl9NVgorCXRyaXN0YXRlICJNYXJ2ZWxsIFNvQyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX0tJUktXT09ECisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIGluLWNoaXAgUlRDCisJICB0aGF0IGNhbiBiZSBmb3VuZCBpbiBzb21lIG9mIE1hcnZlbGwncyBTb0MgZGV2aWNlcywgc3VjaCBhcworCSAgdGhlIEtpcmt3b29kIDg4RjYyODEgYW5kIDg4RjYxOTIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW12LgorCiBlbmRpZiAjIFJUQ19DTEFTUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCA2ZTc5YzkxLi45YTQzNDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWCkrPSBydGMtYXQzMmFwNzAweC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwKSs9IHJ0Yy1hdDkxcm05MjAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0FUOTFTQU05KQkrPSBydGMtYXQ5MXNhbTkubworb2JqLSQoQ09ORklHX1JUQ19EUlZfQVUxWFhYKQkrPSBydGMtYXUxeHh4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0NNT1MpCSs9IHJ0Yy1jbW9zLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTIxNikJKz0gcnRjLWRzMTIxNi5vCkBAIC00Nyw2ICs0OCw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9TVEFSRklSRSkJKz0gcnRjLXN0YXJmaXJlLm8KIG9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDApCSs9IHJ0Yy1tYXg2OTAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDIpCSs9IHJ0Yy1tYXg2OTAyLm8KK29iai0kKENPTkZJR19SVENfRFJWX01WKQkrPSBydGMtbXYubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfT01BUCkJKz0gcnRjLW9tYXAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU2MykJKz0gcnRjLXBjZjg1NjMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU4MykJKz0gcnRjLXBjZjg1ODMubwpAQCAtNTQsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QQVJJU0MpCSs9IHJ0Yy1wYXJpc2Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUFBDKQkrPSBydGMtcHBjLm8KK29iai0kKENPTkZJR19SVENfRFJWX1BYQSkJKz0gcnRjLXB4YS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SOTcwMSkJKz0gcnRjLXI5NzAxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzMTMpCSs9IHJ0Yy1yczVjMzEzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzNDgpCSs9IHJ0Yy1yczVjMzQ4Lm8KQEAgLTY2LDYgKzY5LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1NUSzE3VEE4KQkrPSBydGMtc3RrMTd0YTgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVEVTVCkJKz0gcnRjLXRlc3Qubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVFdMNDAzMCkJKz0gcnRjLXR3bDQwMzAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVFg0OTM5KQkrPSBydGMtdHg0OTM5Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1YzMDIwKQkrPSBydGMtdjMwMjAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVlI0MVhYKQkrPSBydGMtdnI0MXh4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1dNODM1MCkJKz0gcnRjLXdtODM1MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCA0ZGZkZjAxLi5iZTVhNmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTQ4LDkgKzQ4LDcgQEAKIAlzdHJ1Y3QgcnRjX3RpbWUJCXRtOwogCXN0cnVjdCB0aW1lc3BlYwkJdHMgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAKLQlpZiAoc3RybmNtcChydGMtPmRldi5idXNfaWQsCi0JCQkJQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSwKLQkJCQlCVVNfSURfU0laRSkgIT0gMCkKKwlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCiAJCXJldHVybiAwOwogCiAJcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CkBAIC03MSwyMCArNjksMTggQEAKIAl0aW1lX3QJCQluZXd0aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJdGltZTsKIAotCWlmIChzdHJuY21wKHJ0Yy0+ZGV2LmJ1c19pZCwKLQkJCQlDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFLAotCQkJCUJVU19JRF9TSVpFKSAhPSAwKQorCWlmIChzdHJjbXAoZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkgIT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKIAlpZiAocnRjX3ZhbGlkX3RtKCZ0bSkgIT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6ICBib2d1cyByZXN1bWUgdGltZVxuIiwgcnRjLT5kZXYuYnVzX2lkKTsKKwkJcHJfZGVidWcoIiVzOiAgYm9ndXMgcmVzdW1lIHRpbWVcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwogCQlyZXR1cm4gMDsKIAl9CiAJcnRjX3RtX3RvX3RpbWUoJnRtLCAmbmV3dGltZSk7CiAJaWYgKG5ld3RpbWUgPD0gb2xkdGltZSkgewogCQlpZiAobmV3dGltZSA8IG9sZHRpbWUpCi0JCQlwcl9kZWJ1ZygiJXM6ICB0aW1lIHRyYXZlbCFcbiIsIHJ0Yy0+ZGV2LmJ1c19pZCk7CisJCQlwcl9kZWJ1ZygiJXM6ICB0aW1lIHRyYXZlbCFcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1Niw3ICsxNTIsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Yy0+aXJxX3F1ZXVlKTsKIAogCXN0cmxjcHkocnRjLT5uYW1lLCBuYW1lLCBSVENfREVWSUNFX05BTUVfU0laRSk7Ci0Jc25wcmludGYocnRjLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInJ0YyVkIiwgaWQpOworCWRldl9zZXRfbmFtZSgmcnRjLT5kZXYsICJydGMlZCIsIGlkKTsKIAogCXJ0Y19kZXZfcHJlcGFyZShydGMpOwogCkBAIC0xNjksNyArMTY1LDcgQEAKIAlydGNfcHJvY19hZGRfZGV2aWNlKHJ0Yyk7CiAKIAlkZXZfaW5mbyhkZXYsICJydGMgY29yZTogcmVnaXN0ZXJlZCAlcyBhcyAlc1xuIiwKLQkJCXJ0Yy0+bmFtZSwgcnRjLT5kZXYuYnVzX2lkKTsKKwkJCXJ0Yy0+bmFtZSwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAKIAlyZXR1cm4gcnRjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IGZkMmM2NTIuLjQzNDhjNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC01MCwxMCArNTAsMTUgQEAKIAogCWlmICghcnRjLT5vcHMpCiAJCWVyciA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoIXJ0Yy0+b3BzLT5zZXRfdGltZSkKLQkJZXJyID0gLUVJTlZBTDsKLQllbHNlCisJZWxzZSBpZiAocnRjLT5vcHMtPnNldF90aW1lKQogCQllcnIgPSBydGMtPm9wcy0+c2V0X3RpbWUocnRjLT5kZXYucGFyZW50LCB0bSk7CisJZWxzZSBpZiAocnRjLT5vcHMtPnNldF9tbXNzKSB7CisJCXVuc2lnbmVkIGxvbmcgc2VjczsKKwkJZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKwkJaWYgKGVyciA9PSAwKQorCQkJZXJyID0gcnRjLT5vcHMtPnNldF9tbXNzKHJ0Yy0+ZGV2LnBhcmVudCwgc2Vjcyk7CisJfSBlbHNlCisJCWVyciA9IC1FSU5WQUw7CiAKIAltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwogCXJldHVybiBlcnI7CkBAIC0zODksNyArMzk0LDcgQEAKIHsKIAljaGFyICpuYW1lID0gKGNoYXIgKilkYXRhOwogCi0JaWYgKHN0cm5jbXAoZGV2LT5idXNfaWQsIG5hbWUsIEJVU19JRF9TSVpFKSA9PSAwKQorCWlmIChzdHJjbXAoZGV2X25hbWUoZGV2KSwgbmFtZSkgPT0gMCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC01MDQsOSArNTA5LDYgQEAKIAlpZiAocnRjLT5vcHMtPmlycV9zZXRfZnJlcSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKIAkJZXJyID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKaW5kZXggOTBiOWE2NS4uZTFlYzMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CiAJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGM7Ci0JaW50IGlycSA9IC0xOworCWludCBpcnE7CiAJaW50IHJldDsKIAogCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGNfYXQzMmFwNzAweCksIEdGUF9LRVJORUwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoaXJxIDwgMCkgeworCWlmIChpcnEgPD0gMCkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGlycVxuIik7CiAJCXJldCA9IC1FTlhJTzsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXUxeHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwNmE2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdTF4eHguYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIEF1MXh4eCBjb3VudGVyMCAoYWthIFRpbWUtT2YtWWVhciBjb3VudGVyKSBSVEMgaW50ZXJmYWNlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFudWVsIExhdXNzIDxtYW5vQHJvYXJpbmVsay5ob21lbGludXgubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIEFsbCBjdXJyZW50IEF1MXh4eCBTb0NzIGhhdmUgMiBjb3VudGVycyBmZWQgYnkgYW4gZXh0ZXJuYWwgMzIuNzY4IGtIegorICogY3J5c3RhbC4gQ291bnRlciAwLCB3aGljaCBrZWVwcyBjb3VudGluZyBkdXJpbmcgc2xlZXAvcG93ZXJkb3duLCBpcworICogdXNlZCB0byBjb3VudCBzZWNvbmRzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuaXggZXBvY2guCisgKgorICogVGhlIGNvdW50ZXJzIG11c3QgYmUgY29uZmlndXJlZCBhbmQgZW5hYmxlZCBieSBib290bG9hZGVyL2JvYXJkIGNvZGU7CisgKiBubyBjaGVja3MgYXMgdG8gd2hldGhlciB0aGV5IHJlYWxseSBnZXQgYSBwcm9wZXIgMzIuNzY4a0h6IGNsb2NrIGFyZQorICogbWFkZSBhcyB0aGlzIHdvdWxkIHRha2UgZmFyIHRvbyBsb25nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisKKy8qIDMya0h6IGNsb2NrIGVuYWJsZWQgYW5kIGRldGVjdGVkICovCisjZGVmaW5lIENOVFJfT0sgKFNZU19DTlRSTF9FMCB8IFNZU19DTlRSTF8zMlMpCisKK3N0YXRpYyBpbnQgYXUxeHRveV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwl0ID0gYXVfcmVhZGwoU1lTX1RPWVJFQUQpOworCisJcnRjX3RpbWVfdG9fdG0odCwgdG0pOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBpbnQgYXUxeHRveV9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCXJ0Y190bV90b190aW1lKHRtLCAmdCk7CisKKwlhdV93cml0ZWwodCwgU1lTX1RPWVdSSVRFKTsKKwlhdV9zeW5jKCk7CisKKwkvKiB3YWl0IGZvciB0aGUgcGVuZGluZyByZWdpc3RlciB3cml0ZSB0byBzdWNjZWVkLiAgVGhpcyBjYW4KKwkgKiB0YWtlIHVwIHRvIDYgc2Vjb25kcy4uLgorCSAqLworCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfQzBTKQorCQltc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGF1MXh0b3lfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gYXUxeHRveV9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGF1MXh0b3lfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXUxeHRveV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjZGV2OworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmV0OworCisJdCA9IGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKTsKKwlpZiAoISh0ICYgQ05UUl9PSykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bnRlcnMgbm90IHdvcmtpbmc7IGFib3J0aW5nLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXQgPSAtRVRJTUVET1VUOworCisJLyogc2V0IGNvdW50ZXIwIHRpY2tyYXRlIHRvIDFIeiBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYXVfcmVhZGwoU1lTX1RPWVRSSU0pICE9IDMyNzY3KSB7CisJCS8qIHdhaXQgdW50aWwgaGFyZHdhcmUgZ2l2ZXMgYWNjZXNzIHRvIFRSSU0gcmVnaXN0ZXIgKi8KKwkJdCA9IDB4MDAxMDAwMDA7CisJCXdoaWxlICgoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1QwUykgJiYgdC0tKQorCQkJbXNsZWVwKDEpOworCisJCWlmICghdCkgeworCQkJLyogdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlZ2lzdGVyIGFjY2VzczsgYXNzdW1lCisJCQkgKiBjb3VudGVycyBhcmUgdW51c2FibGUuCisJCQkgKi8KKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgYWNjZXNzXG4iKTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCS8qIHNldCAxSHogVE9ZIHRpY2sgcmF0ZSAqLworCQlhdV93cml0ZWwoMzI3NjcsIFNZU19UT1lUUklNKTsKKwkJYXVfc3luYygpOworCX0KKworCS8qIHdhaXQgdW50aWwgdGhlIGhhcmR3YXJlIGFsbG93cyB3cml0ZXMgdG8gdGhlIGNvdW50ZXIgcmVnICovCisJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMFMpCisJCW1zbGVlcCgxKTsKKworCXJ0Y2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInJ0Yy1hdTF4eHgiLCAmcGRldi0+ZGV2LAorCQkJCSAgICAgJmF1MXh0b3lfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Y2Rldik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGNkZXYpOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYXUxeHRveV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Y2Rldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXUxeHJ0Y19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1hdTF4eHgiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXUxeHRveV9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF1MXh0b3lfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdTF4cnRjX2RyaXZlciwgYXUxeHRveV9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXUxeHRveV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdTF4cnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF1MXh0b3lfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoYXUxeHRveV9ydGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXUxeHh4IFRPWS1jb3VudGVyLWJhc2VkIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hbnVlbCBMYXVzcyA8bWFudWVsLmxhdXNzQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cnRjLWF1MXh4eCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYyBiL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMKaW5kZXggMzQ0MzljZS4uYWFmZDNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAogCS8qIFJlZ2lzdGVyIG91ciBSVEMgd2l0aCB0aGUgUlRDIGZyYW1ld29yayAqLwogCXJ0Yy0+cnRjX2RldiA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgZGV2LCAmYmZpbl9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihydGMpKSkgeworCWlmICh1bmxpa2VseShJU19FUlIocnRjLT5ydGNfZGV2KSkpIHsKIAkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Y19kZXYpOwogCQlnb3RvIGVycl9pcnE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKaW5kZXggNmNmOGUyOC4uYjZkMzVmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKIC8qIHRoaXMgaXMgZm9yICJnZW5lcmljIGFjY2VzcyB0byBQQy1zdHlsZSBSVEMiIHVzaW5nIENNT1NfUkVBRC9DTU9TX1dSSVRFICovCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcnRjLmg+CkBAIC01OCw3ICs1OSw3IEBACiB9OwogCiAvKiBib3RoIHBsYXRmb3JtIGFuZCBwbnAgYnVzc2VzIHVzZSBuZWdhdGl2ZSBudW1iZXJzIGZvciBpbnZhbGlkIGlycXMgKi8KLSNkZWZpbmUgaXNfdmFsaWRfaXJxKG4pCQkoKG4pID49IDApCisjZGVmaW5lIGlzX3ZhbGlkX2lycShuKQkJKChuKSA+IDApCiAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAicnRjX2Ntb3MiOwogCkBAIC0zODQsNiArMzg1LDggQEAKIAlpZiAoIWlzX3ZhbGlkX2lycShjbW9zLT5pcnEpKQogCQlyZXR1cm4gLUVOWElPOwogCisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiAwID0gbm8gaXJxczsgMSA9IDJeMTUgSHogLi4uIDE1ID0gMl4wIEh6ICovCiAJZiA9IGZmcyhmcmVxKTsKIAlpZiAoZi0tID4gMTYpCkBAIC03MjksNyArNzMyLDcgQEAKIAogCWNtb3NfcnRjLmRldiA9IGRldjsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCAmY21vc19ydGMpOwotCXJlbmFtZV9yZWdpb24ocG9ydHMsIGNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCk7CisJcmVuYW1lX3JlZ2lvbihwb3J0cywgZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSk7CiAKIAlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CiAKQEAgLTc3Nyw3ICs3ODAsNyBAQAogCQkJcnRjX2Ntb3NfaW50X2hhbmRsZXIgPSBjbW9zX2ludGVycnVwdDsKIAogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShydGNfaXJxLCBydGNfY21vc19pbnRfaGFuZGxlciwKLQkJCQlJUlFGX0RJU0FCTEVELCBjbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQkJSVJRRl9ESVNBQkxFRCwgZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCQljbW9zX3J0Yy5ydGMpOwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZGV2X2RiZyhkZXYsICJJUlEgJWQgaXMgYWxyZWFkeSBpbiB1c2VcbiIsIHJ0Y19pcnEpOwpAQCAtNzk1LDcgKzc5OCw3IEBACiAJfQogCiAJcHJfaW5mbygiJXM6IGFsYXJtcyB1cCB0byBvbmUgJXMlcywgJXpkIGJ5dGVzIG52cmFtJXNcbiIsCi0JCQljbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQlkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAogCQkJaXNfdmFsaWRfaXJxKHJ0Y19pcnEpCiAJCQkJPyAgKGNtb3NfcnRjLm1vbl9hbHJtCiAJCQkJCT8gInllYXIiCkBAIC04ODUsNyArODg4LDcgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiJXM6IHN1c3BlbmQlcywgY3RybCAlMDJ4XG4iLAotCQkJY21vc19ydGMucnRjLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCSh0bXAgJiBSVENfQUlFKSA/ICIsIGFsYXJtIG1heSB3YWtlIiA6ICIiLAogCQkJdG1wKTsKIApAQCAtOTQxLDcgKzk0NCw3IEBACiAJfQogCiAJcHJfZGVidWcoIiVzOiByZXN1bWUsIGN0cmwgJTAyeFxuIiwKLQkJCWNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCiAJCQl0bXApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKaW5kZXggOWEyMzRhNC4uNGFlZGM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIiCiAKIHN0cnVjdCBkczEyMTZfcmVncyB7CiAJdTggdHNlYzsKQEAgLTEwMSw3ICsxMDEsOCBAQAogCXRtLT50bV95ZWFyID0gYmNkMmJpbihyZWdzLnllYXIpOwogCWlmICh0bS0+dG1feWVhciA8IDcwKQogCQl0bS0+dG1feWVhciArPSAxMDA7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKIH0KIAogc3RhdGljIGludCBkczEyMTZfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKQEAgLTEzOCw5ICsxMzksOCBAQAogCS5zZXRfdGltZQk9IGRzMTIxNl9ydGNfc2V0X3RpbWUsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9faW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXY7CiAJaW50IHJldCA9IDA7CkBAIC0xNTIsNyArMTUyLDEwIEBACiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCXByaXYtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwlwcml2LT5zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0xNjMsMjIgKzE2NiwxOCBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjE2IiwgJnBkZXYtPmRldiwKKwlwcml2LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAogCQkJCSAgJmRzMTIxNl9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKElTX0VSUihydGMpKSB7Ci0JCXJldCA9IFBUUl9FUlIocnRjKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT5ydGMpOwogCQlnb3RvIG91dDsKIAl9Ci0JcHJpdi0+cnRjID0gcnRjOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCiAJLyogZHVtbXkgcmVhZCB0byBnZXQgY2xvY2sgaW50byBhIGtub3duIHN0YXRlICovCiAJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCBkdW1teSk7CiAJcmV0dXJuIDA7CiAKIG91dDoKLQlpZiAocHJpdi0+cnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cnRjKTsKIAlpZiAocHJpdi0+aW9hZGRyKQogCQlpb3VubWFwKHByaXYtPmlvYWRkcik7CiAJaWYgKHByaXYtPmJhc2VhZGRyKQpAQCAtMTg3LDcgKzE4Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZHMxMjE2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19leGl0IGRzMTIxNl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKQEAgLTIwMywxMyArMjAyLDEyIEBACiAJCS5uYW1lCT0gInJ0Yy1kczEyMTYiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAotCS5wcm9iZQkJPSBkczEyMTZfcnRjX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxMjE2X3J0Y19yZW1vdmUpLAorCS5yZW1vdmUJCT0gX19leGl0X3AoZHMxMjE2X3J0Y19yZW1vdmUpLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZHMxMjE2X3J0Y19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyLCBkczEyMTZfcnRjX3Byb2JlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRzMTIxNl9ydGNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTM5MC5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTM5MC5jCmluZGV4IDU5OWU5NzYuLmU1NGI1YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogcnRjLWRzMTM5MC5jIC0tIGRyaXZlciBmb3IgRFMxMzkwLzkzLzk0CisgKiBydGMtZHMxMzkwLmMgLS0gZHJpdmVyIGZvciB0aGUgRGFsbGFzL01heGltIERTMTM5MC85My85NCBTUEkgUlRDCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4IE1lcmN1cnkgSU1DIEx0ZAogICogV3JpdHRlbiBieSBNYXJrIEphY2tzb24gPG1wZmpAbWltYy5jby51az4KQEAgLTgsMTEgKzgsMTMgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBOT1RFIDogQ3VycmVudGx5IHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIGJhcmUgbWluaW11bSBmb3IgcmVhZAotICogYW5kIHdyaXRlIHRoZSBSVEMuICBUaGUgZXh0cmEgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlIGNoaXAgZmFtaWx5CisgKiBOT1RFOiBDdXJyZW50bHkgdGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgYmFyZSBtaW5pbXVtIGZvciByZWFkCisgKiBhbmQgd3JpdGUgdGhlIFJUQy4gVGhlIGV4dHJhIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZSBjaGlwIGZhbWlseQogICogKGFsYXJtcywgdHJpY2tsZSBjaGFyZ2VyLCBkaWZmZXJlbnQgY29udHJvbCByZWdpc3RlcnMpIGFyZSB1bmF2YWlsYWJsZS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KQEAgLTQyLDIwICs0NCw2IEBACiAJdTggdHhyeF9idWZbOV07CS8qIGNtZCArIDggcmVnaXN0ZXJzICovCiB9OwogCi1zdGF0aWMgdm9pZCBkczEzOTBfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKLQkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQkvKiBTZXQgTVNCIHRvIGluZGljYXRlIHdyaXRlICovCi0JY2hpcC0+dHhyeF9idWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKLQljaGlwLT50eHJ4X2J1ZlsxXSA9IGRhdGE7Ci0KLQkvKiBkbyB0aGUgaS9vICovCi0Jc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGNoaXAtPnR4cnhfYnVmLCAyLCBOVUxMLCAwKTsKLX0KLQogc3RhdGljIGludCBkczEzOTBfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQogewpAQCAtNzgsNyArNjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMTM5MF9nZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczEzOTBfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwogCXN0cnVjdCBkczEzOTAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTEwNyw3ICs5NSw3IEBACiAJcmV0dXJuIHJ0Y192YWxpZF90bShkdCk7CiB9CiAKLXN0YXRpYyBpbnQgZHMxMzkwX3NldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IGRzMTM5MF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0xMjcsMTYgKzExNSw2IEBACiAJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBjaGlwLT50eHJ4X2J1ZiwgOCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgZHMxMzkwX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMTM5MF9nZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMxMzkwX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMxMzkwX3NldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTM5MF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBkczEzOTBfcmVhZF90aW1lLAogCS5zZXRfdGltZQk9IGRzMTM5MF9zZXRfdGltZSwKQEAgLTE0OSw0NiArMTI3LDQwIEBACiAJc3RydWN0IGRzMTM5MCAqY2hpcDsKIAlpbnQgcmVzOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIkRTMTM5MCBTUEkgUlRDIGRyaXZlclxuIik7Ci0KLQlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEzOTAiLAotCQkJCSZzcGktPmRldiwgJmRzMTM5MF9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKElTX0VSUihydGMpKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUICJSVEMgOiB1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIocnRjKTsKLQl9Ci0KIAlzcGktPm1vZGUgPSBTUElfTU9ERV8zOwogCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAJc3BpX3NldHVwKHNwaSk7CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2YgKmNoaXAsIEdGUF9LRVJORUwpOwogCWlmICghY2hpcCkgewotCQlwcmludGsoS0VSTl9BTEVSVCAiUlRDIDogdW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnlcbiIpOwotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQljaGlwLT5ydGMgPSBydGM7CiAJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7CiAKIAlyZXMgPSBkczEzOTBfZ2V0X3JlZygmc3BpLT5kZXYsIERTMTM5MF9SRUdfU0VDT05EUywgJnRtcCk7Ci0JaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9BTEVSVCAiUlRDIDogdW5hYmxlIHRvIHJlYWQgZGV2aWNlXG4iKTsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJaWYgKHJlcyAhPSAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5hYmxlIHRvIHJlYWQgZGV2aWNlXG4iKTsKKwkJa2ZyZWUoY2hpcCk7CiAJCXJldHVybiByZXM7CiAJfQogCi0JcmV0dXJuIDA7CisJY2hpcC0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMzkwIiwKKwkJCQkmc3BpLT5kZXYsICZkczEzOTBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIoY2hpcC0+cnRjKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBkZXZpY2VcbiIpOworCQlyZXMgPSBQVFJfRVJSKGNoaXAtPnJ0Yyk7CisJCWtmcmVlKGNoaXApOworCX0KKworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGRzMTM5MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2hpcC0+cnRjOwogCi0JaWYgKHJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+cnRjKTsKIAlrZnJlZShjaGlwKTsKIAogCXJldHVybiAwOwpAQCAtMjE1LDYgKzE4Nyw2IEBACiB9CiBtb2R1bGVfZXhpdChkczEzOTBfZXhpdCk7CiAKLU1PRFVMRV9ERVNDUklQVElPTigiRFMxMzkwLzkzLzk0IFNQSSBSVEMgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgU1BJIFJUQyBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcmsgSmFja3NvbiA8bXBmakBtaW1jLmNvLnVrPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCmluZGV4IDI1Y2FhZGEuLjIzYTA3ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKQEAgLTMyNiw5ICszMjYsOSBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkgeworCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwotCX0KKwogCXBkYXRhLT5hbHJtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CiAJcGRhdGEtPmFscm1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKIAlwZGF0YS0+YWxybV9taW4gPSBhbHJtLT50aW1lLnRtX21pbjsKQEAgLTM0Niw5ICszNDYsOSBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkgeworCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwotCX0KKwogCWFscm0tPnRpbWUudG1fbWRheSA9IHBkYXRhLT5hbHJtX21kYXkgPCAwID8gMCA6IHBkYXRhLT5hbHJtX21kYXk7CiAJYWxybS0+dGltZS50bV9ob3VyID0gcGRhdGEtPmFscm1faG91ciA8IDAgPyAwIDogcGRhdGEtPmFscm1faG91cjsKIAlhbHJtLT50aW1lLnRtX21pbiA9IHBkYXRhLT5hbHJtX21pbiA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWluOwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPD0gMCkgewogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOyAvKiBmYWxsIGJhY2sgaW50byBydGMtZGV2J3MgZW11bGF0aW9uICovCiAJfQogCXN3aXRjaCAoY21kKSB7CkBAIC01MDMsNyArNTAzLDYgQEAKIAlpZiAoIXBkYXRhKSB7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwZGF0YS0+aXJxID0gLTE7CiAJcGRhdGEtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHBkYXRhLT5zaXplLCBwZGV2LT5uYW1lKSkgewogCQlyZXQgPSAtRUJVU1k7CkBAIC01NDUsMTMgKzU0NCwxMyBAQAogCSAqIGlmIHRoZSBwbGF0Zm9ybSBoYXMgYW4gaW50ZXJydXB0IGluIG1pbmQgZm9yIHRoaXMgZGV2aWNlLAogCSAqIHRoZW4gYnkgYWxsIG1lYW5zLCBzZXQgaXQKIAkgKi8KLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXJ0Y19yZWFkKFJUQ19DTUQxKTsKIAkJaWYgKHJlcXVlc3RfaXJxKHBkYXRhLT5pcnEsIGRzMTUxMV9pbnRlcnJ1cHQsCiAJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsIHBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgewogCiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJCXBkYXRhLT5pcnEgPSAwOwogCQl9CiAJfQogCkBAIC01NzIsNyArNTcxLDcgQEAKIAlpZiAocGRhdGEtPnJ0YykgewogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CiAJfQotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJfQogCWlmIChkczE1MTFfYmFzZSkgewpAQCAtNTk1LDcgKzU5NCw3IEBACiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTUxMV9udnJhbV9hdHRyKTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CiAJcGRhdGEtPnJ0YyA9IE5VTEw7Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQkvKgogCQkgKiBkaXNhYmxlIHRoZSBhbGFybSBpbnRlcnJ1cHQKIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKaW5kZXggYjk0NzVjZC4uMzhkNDcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCXBkYXRhLT5hbHJtX21kYXkgPSBhbHJtLT50aW1lLnRtX21kYXk7CiAJcGRhdGEtPmFscm1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKQEAgLTE3OSw3ICsxNzksNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OwogCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CkBAIC0yMTMsNyArMjEzLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsgLyogZmFsbCBiYWNrIGludG8gcnRjLWRldidzIGVtdWxhdGlvbiAqLwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVENfQUlFX09GRjoKQEAgLTMwMSw3ICszMDEsNiBAQAogCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcGRhdGEtPmlycSA9IC0xOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKQEAgLTMyNywxMyArMzI2LDEzIEBACiAJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19GTEFHUykgJiBSVENfRkxBR1NfQkxGKQogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAidm9sdGFnZS1sb3cgZGV0ZWN0ZWQuXG4iKTsKIAotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJd3JpdGViKDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKIAkJaWYgKHJlcXVlc3RfaXJxKHBkYXRhLT5pcnEsIGRzMTU1M19ydGNfaW50ZXJydXB0LAogCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKIAkJCQlwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOwotCQkJcGRhdGEtPmlycSA9IC0xOworCQkJcGRhdGEtPmlycSA9IDA7CiAJCX0KIAl9CiAKQEAgLTM1Myw3ICszNTIsNyBAQAogIG91dDoKIAlpZiAocGRhdGEtPnJ0YykKIAkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwotCWlmIChwZGF0YS0+aXJxID49IDApCisJaWYgKHBkYXRhLT5pcnEgPiAwKQogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAlpZiAoaW9hZGRyKQogCQlpb3VubWFwKGlvYWRkcik7CkBAIC0zNjksNyArMzY4LDcgQEAKIAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1NTNfbnZyYW1fYXR0cik7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJd3JpdGViKDAsIHBkYXRhLT5pb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwppbmRleCA0ZTkxNDE5Li4wNmRmYjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCkBAIC04MywzMiArODMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczE2NzJfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JdW5zaWduZWQgbG9uZyBzZWNzOwotCi0JZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCSIlczogc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKLQkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKLQkJX19mdW5jX18sCi0JCXRtLT50bV9zZWMsIHRtLT50bV9taW4sIHRtLT50bV9ob3VyLAotCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKLQotCXJ0Y190bV90b190aW1lKHRtLCAmc2Vjcyk7Ci0KLQlyZXR1cm4gZHMxNjcyX3NldF9tbXNzKGNsaWVudCwgc2Vjcyk7Ci19Ci0KIHN0YXRpYyBpbnQgZHMxNjcyX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewogCXJldHVybiBkczE2NzJfZ2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOwogfQogCi1zdGF0aWMgaW50IGRzMTY3Ml9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczE2NzJfc2V0X2RhdGV0aW1lKHRvX2kyY19jbGllbnQoZGV2KSwgdG0pOwotfQotCiBzdGF0aWMgaW50IGRzMTY3Ml9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHNlY3MpCiB7CiAJcmV0dXJuIGRzMTY3Ml9zZXRfbW1zcyh0b19pMmNfY2xpZW50KGRldiksIHNlY3MpOwpAQCAtMTUyLDcgKzEzMSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczE2NzJfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lID0gZHMxNjcyX3J0Y19yZWFkX3RpbWUsCi0JLnNldF90aW1lID0gZHMxNjcyX3J0Y19zZXRfdGltZSwKIAkuc2V0X21tc3MgPSBkczE2NzJfcnRjX3NldF9tbXNzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCmluZGV4IDQ1ZTViMTAuLmM1MTU4OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKQEAgLTEsNCArMSw0IEBACi0vKiBkcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKKy8qIHJ0Yy1kczMyMzQuYwogICoKICAqIERyaXZlciBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IgKERTMzIzNCkgU1BJIFJUQyB3aXRoIEludGVncmF0ZWQgQ3J5c3RhbAogICogYW5kIFNSQU0uCkBAIC05LDEzICs5LDEwIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogQ2hhbmdlbG9nOgotICoKLSAqIDA3LU1heS0yMDA4OiBEZW5uaXMgQWJlcmlsbGEgPGRlbnp6emhvbWVAeWFob28uY29tPgotICoJCS0gQ3JlYXRlZCBiYXNlZCBvbiB0aGUgbWF4NjkwMiBjb2RlLiBPbmx5IGltcGxlbWVudHMgdGhlCi0gKgkJICBkYXRlL3RpbWUga2VlcGluZyBmdW5jdGlvbnM7IG5vIFNSQU0geWV0LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CkBAIC0zNCwxNiArMzEsNyBAQAogI2RlZmluZSBEUzMyMzRfUkVHX0NPTlRST0wJMHgwRQogI2RlZmluZSBEUzMyMzRfUkVHX0NPTlRfU1RBVAkweDBGCiAKLSN1bmRlZiBEUzMyMzRfREVCVUcKLQotc3RydWN0IGRzMzIzNCB7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQl1OCBidWZbOF07IC8qIEJ1cnN0IHJlYWQ6IGFkZHIgKyA3IHJlZ3MgKi8KLQl1OCB0eF9idWZbMl07Ci0JdTggcnhfYnVmWzJdOwotfTsKLQotc3RhdGljIHZvaWQgZHMzMjM0X3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCitzdGF0aWMgaW50IGRzMzIzNF9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwpAQCAtNTMsMTA3ICs0MSw0NSBAQAogCWJ1ZlswXSA9IGFkZHJlc3MgfCAweDgwOwogCWJ1ZlsxXSA9IGRhdGE7CiAKLQlzcGlfd3JpdGUoc3BpLCBidWYsIDIpOworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCAyLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGludCBkczMyMzRfZ2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOwogCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkqZGF0YSA9IGFkZHJlc3MgJiAweDdmOwogCi0JLyogQnVpbGQgb3VyIHNwaSBtZXNzYWdlICovCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOwotCi0JLyogQWRkcmVzcyArIGR1bW15IHR4IGJ5dGUgKi8KLQl4ZmVyLmxlbiA9IDI7Ci0JeGZlci50eF9idWYgPSBjaGlwLT50eF9idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5yeF9idWY7Ci0KLQljaGlwLT50eF9idWZbMF0gPSBhZGRyZXNzOwotCWNoaXAtPnR4X2J1ZlsxXSA9IDB4ZmY7Ci0KLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOwotCi0JLyogZG8gdGhlIGkvbyAqLwotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7Ci0JZWxzZQotCQlyZXR1cm4gc3RhdHVzOwotCi0JKmRhdGEgPSBjaGlwLT5yeF9idWZbMV07Ci0KLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgZGF0YSwgMSwgZGF0YSwgMSk7CiB9CiAKLXN0YXRpYyBpbnQgZHMzMjM0X2dldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IGRzMzIzNF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogeworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBidWZbOF07CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgZHMzMjM0ICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOwotCWludCBzdGF0dXM7CiAKLQkvKiBidWlsZCB0aGUgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQl4ZmVyLmxlbiA9IDEgKyA3OwkvKiBBZGRyICsgNyByZWdpc3RlcnMgKi8KLQl4ZmVyLnR4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQljaGlwLT5idWZbMF0gPSAweDAwOwkvKiBTdGFydCBhZGRyZXNzICovCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKKwlidWZbMF0gPSAweDAwOyAvKiBTdGFydCBhZGRyZXNzICovCiAKLQkvKiBkbyB0aGUgaS9vICovCi0Jc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbWVzc2FnZSk7Ci0JaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBtZXNzYWdlLnN0YXR1czsKLQllbHNlCi0JCXJldHVybiBzdGF0dXM7CisJZXJyID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMSwgYnVmLCA4KTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CiAKIAkvKiBTZWNvbmRzLCBNaW51dGVzLCBIb3VycywgRGF5LCBEYXRlLCBNb250aCwgWWVhciAqLwotCWR0LT50bV9zZWMJPSBiY2QyYmluKGNoaXAtPmJ1ZlsxXSk7Ci0JZHQtPnRtX21pbgk9IGJjZDJiaW4oY2hpcC0+YnVmWzJdKTsKLQlkdC0+dG1faG91cgk9IGJjZDJiaW4oY2hpcC0+YnVmWzNdICYgMHgzZik7Ci0JZHQtPnRtX3dkYXkJPSBiY2QyYmluKGNoaXAtPmJ1Zls0XSkgLSAxOyAvKiAwID0gU3VuICovCi0JZHQtPnRtX21kYXkJPSBiY2QyYmluKGNoaXAtPmJ1Zls1XSk7Ci0JZHQtPnRtX21vbgk9IGJjZDJiaW4oY2hpcC0+YnVmWzZdICYgMHgxZikgLSAxOyAvKiAwID0gSmFuICovCi0JZHQtPnRtX3llYXIgCT0gYmNkMmJpbihjaGlwLT5idWZbN10gJiAweGZmKSArIDEwMDsgLyogQXNzdW1lIDIwWVkgKi8KKwlkdC0+dG1fc2VjCT0gYmNkMmJpbihidWZbMF0pOworCWR0LT50bV9taW4JPSBiY2QyYmluKGJ1ZlsxXSk7CisJZHQtPnRtX2hvdXIJPSBiY2QyYmluKGJ1ZlsyXSAmIDB4M2YpOworCWR0LT50bV93ZGF5CT0gYmNkMmJpbihidWZbM10pIC0gMTsgLyogMCA9IFN1biAqLworCWR0LT50bV9tZGF5CT0gYmNkMmJpbihidWZbNF0pOworCWR0LT50bV9tb24JPSBiY2QyYmluKGJ1Zls1XSAmIDB4MWYpIC0gMTsgLyogMCA9IEphbiAqLworCWR0LT50bV95ZWFyIAk9IGJjZDJiaW4oYnVmWzZdICYgMHhmZikgKyAxMDA7IC8qIEFzc3VtZSAyMFlZICovCiAKLSNpZmRlZiBEUzMyMzRfREVCVUcKLQlkZXZfZGJnKGRldiwgIlxuJXMgOiBSZWFkIFJUQyB2YWx1ZXNcbiIsIF9fZnVuY19fKTsKLQlkZXZfZGJnKGRldiwgInRtX2hvdXI6ICVpXG4iLCBkdC0+dG1faG91cik7Ci0JZGV2X2RiZyhkZXYsICJ0bV9taW4gOiAlaVxuIiwgZHQtPnRtX21pbik7Ci0JZGV2X2RiZyhkZXYsICJ0bV9zZWMgOiAlaVxuIiwgZHQtPnRtX3NlYyk7Ci0JZGV2X2RiZyhkZXYsICJ0bV93ZGF5OiAlaVxuIiwgZHQtPnRtX3dkYXkpOwotCWRldl9kYmcoZGV2LCAidG1fbWRheTogJWlcbiIsIGR0LT50bV9tZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21vbiA6ICVpXG4iLCBkdC0+dG1fbW9uKTsKLQlkZXZfZGJnKGRldiwgInRtX3llYXI6ICVpXG4iLCBkdC0+dG1feWVhcik7Ci0jZW5kaWYKLQotCXJldHVybiAwOworCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOwogfQogCi1zdGF0aWMgaW50IGRzMzIzNF9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczMyMzRfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewotI2lmZGVmIERTMzIzNF9ERUJVRwotCWRldl9kYmcoZGV2LCAiXG4lcyA6IFNldHRpbmcgUlRDIHZhbHVlc1xuIiwgX19mdW5jX18pOwotCWRldl9kYmcoZGV2LCAidG1fc2VjIDogJWlcbiIsIGR0LT50bV9zZWMpOwotCWRldl9kYmcoZGV2LCAidG1fbWluIDogJWlcbiIsIGR0LT50bV9taW4pOwotCWRldl9kYmcoZGV2LCAidG1faG91cjogJWlcbiIsIGR0LT50bV9ob3VyKTsKLQlkZXZfZGJnKGRldiwgInRtX3dkYXk6ICVpXG4iLCBkdC0+dG1fd2RheSk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9tZGF5OiAlaVxuIiwgZHQtPnRtX21kYXkpOwotCWRldl9kYmcoZGV2LCAidG1fbW9uIDogJWlcbiIsIGR0LT50bV9tb24pOwotCWRldl9kYmcoZGV2LCAidG1feWVhcjogJWlcbiIsIGR0LT50bV95ZWFyKTsKLSNlbmRpZgotCiAJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX1NFQ09ORFMsIGJpbjJiY2QoZHQtPnRtX3NlYykpOwogCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19NSU5VVEVTLCBiaW4yYmNkKGR0LT50bV9taW4pKTsKIAlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfSE9VUlMsIGJpbjJiY2QoZHQtPnRtX2hvdXIpICYgMHgzZik7CkBAIC0xNzQsMTYgKzEwMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMzMjM0X3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMzIzNF9nZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMzMjM0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMzMjM0X3NldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMzIzNF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBkczMyMzRfcmVhZF90aW1lLAogCS5zZXRfdGltZQk9IGRzMzIzNF9zZXRfdGltZSwKQEAgLTE5MywzMSArMTA5LDE1IEBACiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAl1bnNpZ25lZCBjaGFyIHRtcDsKLQlzdHJ1Y3QgZHMzMjM0ICpjaGlwOwogCWludCByZXM7CiAKLQlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczMyMzQiLAotCQkJCSZzcGktPmRldiwgJmRzMzIzNF9ydGNfb3BzLCBUSElTX01PRFVMRSk7Ci0JaWYgKElTX0VSUihydGMpKQotCQlyZXR1cm4gUFRSX0VSUihydGMpOwotCiAJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKIAlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCXNwaV9zZXR1cChzcGkpOwogCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczMyMzQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQljaGlwLT5ydGMgPSBydGM7Ci0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7Ci0KIAlyZXMgPSBkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfU0VDT05EUywgJnRtcCk7Ci0JaWYgKHJlcykgewotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlpZiAocmVzICE9IDApCiAJCXJldHVybiByZXM7Ci0JfQogCiAJLyogQ29udHJvbCBzZXR0aW5ncwogCSAqCkBAIC0yNDYsMjYgKzE0NiwyNyBAQAogCWRzMzIzNF9nZXRfcmVnKCZzcGktPmRldiwgRFMzMjM0X1JFR19DT05UX1NUQVQsICZ0bXApOwogCWRldl9pbmZvKCZzcGktPmRldiwgIkN0cmwvU3RhdCBSZWc6IDB4JTAyeFxuIiwgdG1wKTsKIAorCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMzIzNCIsCisJCQkJJnNwaS0+ZGV2LCAmZHMzMjM0X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBydGMpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGRzMzIzNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgZHMzMjM0ICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2hpcC0+cnRjOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwogCi0JaWYgKHJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0KLQlrZnJlZShjaGlwKTsKLQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgZHMzMjM0X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkgPSAiZHMzMjM0IiwKLQkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlCSA9IGRzMzIzNF9wcm9iZSwKQEAgLTI3NCw3ICsxNzUsNiBAQAogCiBzdGF0aWMgX19pbml0IGludCBkczMyMzRfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIkRTMzIzNCBTUEkgUlRDIERyaXZlclxuIik7CiAJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmRzMzIzNF9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoZHMzMjM0X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWVwOTN4eC5jIGIvZHJpdmVycy9ydGMvcnRjLWVwOTN4eC5jCmluZGV4IDM2ZTRhYzAuLmY3YTMyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMKQEAgLTQ5LDE4ICs0OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXA5M3h4X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBsb25nIHNlY3M7Ci0KLQllcnIgPSBydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOwotCWlmIChlcnIgIT0gMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBlcDkzeHhfcnRjX3NldF9tbXNzKGRldiwgc2Vjcyk7Ci19Ci0KIHN0YXRpYyBpbnQgZXA5M3h4X3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCiB7CiAJdW5zaWduZWQgc2hvcnQgcHJlbG9hZCwgZGVsZXRlOwpAQCAtNzUsNyArNjMsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZXA5M3h4X3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZQk9IGVwOTN4eF9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZQk9IGVwOTN4eF9ydGNfc2V0X3RpbWUsCiAJLnNldF9tbXNzCT0gZXA5M3h4X3J0Y19zZXRfbW1zcywKIAkucHJvYwkJPSBlcDkzeHhfcnRjX3Byb2MsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jIGIvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCmluZGV4IDQzYWZiN2EuLjMzOTIxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCSAqIHRoZSBtb2RlIHdpdGhvdXQgSVJRLgogCSAqLwogCW00OHQ1OS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAobTQ4dDU5LT5pcnEgPCAwKQorCWlmIChtNDh0NTktPmlycSA8PSAwKQogCQltNDh0NTktPmlycSA9IE5PX0lSUTsKIAogCWlmIChtNDh0NTktPmlycSAhPSBOT19JUlEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCmluZGV4IDJmNjUwN2QuLjM2YThlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwpAQCAtOSwxNCArOSw2IEBACiAgKgogICogRHJpdmVyIGZvciBNQVg2OTAyIHNwaSBSVEMKICAqCi0gKiBDaGFuZ2Vsb2c6Ci0gKgotICogMjQtTWF5LTIwMDY6IFJhcGhhZWwgQXNzZW5hdCA8cmFwaEA4ZC5jb20+Ci0gKiAgICAgICAgICAgICAgICAtIE1ham9yIHJld29yawotICoJCQkJQ29udmVydGVkIHRvIHJ0Y19kZXZpY2UgYW5kIHVzZXMgdGhlIFNQSSBsYXllci4KLSAqCi0gKiA/Py0/Pz8tMjAwNTogU29tZW9uZSBhdCBDb21wdWxhYgotICogICAgICAgICAgICAgICAgLSBJbml0aWFsIGRyaXZlciBjcmVhdGlvbi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yNiw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNkZWZpbmUgTUFYNjkwMl9SRUdfU0VDT05EUwkJMHgwMQogI2RlZmluZSBNQVg2OTAyX1JFR19NSU5VVEVTCQkweDAzCkBAIC0zOCwxNiArMjksNyBAQAogI2RlZmluZSBNQVg2OTAyX1JFR19DT05UUk9MCQkweDBGCiAjZGVmaW5lIE1BWDY5MDJfUkVHX0NFTlRVUlkJCTB4MTMKIAotI3VuZGVmIE1BWDY5MDJfREVCVUcKLQotc3RydWN0IG1heDY5MDIgewotCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JdTggYnVmWzldOyAvKiBCdXJzdCByZWFkIGNtZCArIDggcmVnaXN0ZXJzICovCi0JdTggdHhfYnVmWzJdOwotCXU4IHJ4X2J1ZlsyXTsKLX07Ci0KLXN0YXRpYyB2b2lkIG1heDY5MDJfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKK3N0YXRpYyBpbnQgbWF4NjkwMl9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwpAQCAtNTcsMTEzICszOSw1OCBAQAogCWJ1ZlswXSA9IGFkZHJlc3MgJiAweDdmOwogCWJ1ZlsxXSA9IGRhdGE7CiAKLQlzcGlfd3JpdGUoc3BpLCBidWYsIDIpOworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgYnVmLCAyLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGludCBtYXg2OTAyX2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOwotCWludCBzdGF0dXM7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQnVpbGQgb3VyIHNwaSBtZXNzYWdlICovCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7Ci0JbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOwotCXhmZXIubGVuID0gMjsKLQkvKiBDYW4gdHhfYnVmIGFuZCByeF9idWYgYmUgZXF1YWw/IFRoZSBkb2MgaW4gc3BpLmggaXMgbm90IHN1cmUuLi4gKi8KLQl4ZmVyLnR4X2J1ZiA9IGNoaXAtPnR4X2J1ZjsKLQl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPnJ4X2J1ZjsKIAogCS8qIFNldCBNU0IgdG8gaW5kaWNhdGUgcmVhZCAqLwotCWNoaXAtPnR4X2J1ZlswXSA9IGFkZHJlc3MgfCAweDgwOworCSpkYXRhID0gYWRkcmVzcyB8IDB4ODA7CiAKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOwotCi0JLyogZG8gdGhlIGkvbyAqLwotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOwotCi0JaWYgKHN0YXR1cyA9PSAwKQotCQkqZGF0YSA9IGNoaXAtPnJ4X2J1ZlsxXTsKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgZGF0YSwgMSwgZGF0YSwgMSk7CiB9CiAKLXN0YXRpYyBpbnQgbWF4NjkwMl9nZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBtYXg2OTAyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7Ci0JdW5zaWduZWQgY2hhciB0bXA7Ci0JaW50IGNlbnR1cnk7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBjZW50dXJ5OwogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG1heDY5MDIgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7Ci0JaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKIAotCWVyciA9IG1heDY5MDJfZ2V0X3JlZyhkZXYsIE1BWDY5MDJfUkVHX0NFTlRVUlksICZ0bXApOwotCWlmIChlcnIpCisJYnVmWzBdID0gMHhiZjsJLyogQnVyc3QgcmVhZCAqLworCisJZXJyID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMSwgYnVmLCA4KTsKKwlpZiAoZXJyICE9IDApCiAJCXJldHVybiBlcnI7CiAKLQkvKiBidWlsZCB0aGUgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQl4ZmVyLmxlbiA9IDEgKyA3OwkvKiBCdXJzdCByZWFkIGNvbW1hbmQgKyA3IHJlZ2lzdGVycyAqLwotCXhmZXIudHhfYnVmID0gY2hpcC0+YnVmOwotCXhmZXIucnhfYnVmID0gY2hpcC0+YnVmOwotCWNoaXAtPmJ1ZlswXSA9IDB4YmY7CS8qIEJ1cnN0IHJlYWQgKi8KLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1lc3NhZ2UpOwotCi0JLyogZG8gdGhlIGkvbyAqLwotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KIAkvKiBUaGUgY2hpcCBzZW5kcyBkYXRhIGluIHRoaXMgb3JkZXI6CiAJICogU2Vjb25kcywgTWludXRlcywgSG91cnMsIERhdGUsIE1vbnRoLCBEYXksIFllYXIgKi8KLQlkdC0+dG1fc2VjCT0gYmNkMmJpbihjaGlwLT5idWZbMV0pOwotCWR0LT50bV9taW4JPSBiY2QyYmluKGNoaXAtPmJ1ZlsyXSk7Ci0JZHQtPnRtX2hvdXIJPSBiY2QyYmluKGNoaXAtPmJ1ZlszXSk7Ci0JZHQtPnRtX21kYXkJPSBiY2QyYmluKGNoaXAtPmJ1Zls0XSk7Ci0JZHQtPnRtX21vbgk9IGJjZDJiaW4oY2hpcC0+YnVmWzVdKSAtIDE7Ci0JZHQtPnRtX3dkYXkJPSBiY2QyYmluKGNoaXAtPmJ1Zls2XSk7Ci0JZHQtPnRtX3llYXIgPSBiY2QyYmluKGNoaXAtPmJ1Zls3XSk7CisJZHQtPnRtX3NlYwk9IGJjZDJiaW4oYnVmWzBdKTsKKwlkdC0+dG1fbWluCT0gYmNkMmJpbihidWZbMV0pOworCWR0LT50bV9ob3VyCT0gYmNkMmJpbihidWZbMl0pOworCWR0LT50bV9tZGF5CT0gYmNkMmJpbihidWZbM10pOworCWR0LT50bV9tb24JPSBiY2QyYmluKGJ1Zls0XSkgLSAxOworCWR0LT50bV93ZGF5CT0gYmNkMmJpbihidWZbNV0pOworCWR0LT50bV95ZWFyCT0gYmNkMmJpbihidWZbNl0pOwogCi0JY2VudHVyeSA9IGJjZDJiaW4odG1wKSAqIDEwMDsKKwkvKiBSZWFkIGNlbnR1cnkgKi8KKwllcnIgPSBtYXg2OTAyX2dldF9yZWcoZGV2LCBNQVg2OTAyX1JFR19DRU5UVVJZLCAmYnVmWzBdKTsKKwlpZiAoZXJyICE9IDApCisJCXJldHVybiBlcnI7CisKKwljZW50dXJ5ID0gYmNkMmJpbihidWZbMF0pICogMTAwOwogCiAJZHQtPnRtX3llYXIgKz0gY2VudHVyeTsKIAlkdC0+dG1feWVhciAtPSAxOTAwOwogCi0jaWZkZWYgTUFYNjkwMl9ERUJVRwotCXByaW50aygiXG4lcyA6IFJlYWQgUlRDIHZhbHVlc1xuIixfX2Z1bmNfXyk7Ci0JcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7Ci0JcHJpbnRrKCJ0bV9taW4gOiAlaVxuIixkdC0+dG1fbWluKTsKLQlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOwotCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOwotCXByaW50aygidG1fbW9uIDogJWlcbiIsZHQtPnRtX21vbik7Ci0JcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7Ci0JcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7Ci0jZW5kaWYKLQotCXJldHVybiAwOworCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDJfc2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgbWF4NjkwMl9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7Ci0JZHQtPnRtX3llYXIgPSBkdC0+dG1feWVhcisxOTAwOwotCi0jaWZkZWYgTUFYNjkwMl9ERUJVRwotCXByaW50aygiXG4lcyA6IFNldHRpbmcgUlRDIHZhbHVlc1xuIixfX2Z1bmNfXyk7Ci0JcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKLQlwcmludGsoInRtX21pbiA6ICVpXG4iLGR0LT50bV9taW4pOwotCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOwotCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOwotCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOwotCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOwotI2VuZGlmCisJZHQtPnRtX3llYXIgPSBkdC0+dG1feWVhciArIDE5MDA7CiAKIAkvKiBSZW1vdmUgd3JpdGUgcHJvdGVjdGlvbiAqLwogCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4RiwgMCk7CkBAIC0xNzMsMTAgKzEwMCwxMCBAQAogCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDUsIGJpbjJiY2QoZHQtPnRtX2hvdXIpKTsKIAogCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDcsIGJpbjJiY2QoZHQtPnRtX21kYXkpKTsKLQltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA5LCBiaW4yYmNkKGR0LT50bV9tb24rMSkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MDksIGJpbjJiY2QoZHQtPnRtX21vbiArIDEpKTsKIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBCLCBiaW4yYmNkKGR0LT50bV93ZGF5KSk7Ci0JbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwRCwgYmluMmJjZChkdC0+dG1feWVhciUxMDApKTsKLQltYXg2OTAyX3NldF9yZWcoZGV2LCAweDEzLCBiaW4yYmNkKGR0LT50bV95ZWFyLzEwMCkpOworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEQsIGJpbjJiY2QoZHQtPnRtX3llYXIgJSAxMDApKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDEzLCBiaW4yYmNkKGR0LT50bV95ZWFyIC8gMTAwKSk7CiAKIAkvKiBDb21wdWxhYiB1c2VkIGEgZGVsYXkgaGVyZS4gSG93ZXZlciwgdGhlIGRhdGFzaGVldAogCSAqIGRvZXMgbm90IG1lbnRpb24gYSBkZWxheSBiZWluZyByZXF1aXJlZCBhbnl3aGVyZS4uLiAqLwpAQCAtMTg4LDE2ICsxMTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDJfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gbWF4NjkwMl9nZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4NjkwMl9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIG1heDY5MDJfc2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbWF4NjkwMl9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBtYXg2OTAyX3JlYWRfdGltZSwKIAkuc2V0X3RpbWUJPSBtYXg2OTAyX3NldF90aW1lLApAQCAtMjA3LDQ1ICsxMjQsMjkgQEAKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCXVuc2lnbmVkIGNoYXIgdG1wOwotCXN0cnVjdCBtYXg2OTAyICpjaGlwOwogCWludCByZXM7CiAKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXMgPSBtYXg2OTAyX2dldF9yZWcoJnNwaS0+ZGV2LCBNQVg2OTAyX1JFR19TRUNPTkRTLCAmdG1wKTsKKwlpZiAocmVzICE9IDApCisJCXJldHVybiByZXM7CisKIAlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtYXg2OTAyIiwKIAkJCQkmc3BpLT5kZXYsICZtYXg2OTAyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAlpZiAoSVNfRVJSKHJ0YykpCiAJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CiAKLQlzcGktPm1vZGUgPSBTUElfTU9ERV8zOwotCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7Ci0Jc3BpX3NldHVwKHNwaSk7Ci0KLQljaGlwID0ga3phbGxvYyhzaXplb2YgKmNoaXAsIEdGUF9LRVJORUwpOwotCWlmICghY2hpcCkgewotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWNoaXAtPnJ0YyA9IHJ0YzsKLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBjaGlwKTsKLQotCXJlcyA9IG1heDY5MDJfZ2V0X3JlZygmc3BpLT5kZXYsIE1BWDY5MDJfUkVHX1NFQ09ORFMsICZ0bXApOwotCWlmIChyZXMpIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1heDY5MDJfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IG1heDY5MDIgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjaGlwLT5ydGM7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7CiAKLQlpZiAocnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQotCWtmcmVlKGNoaXApOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MSw3ICsxNjIsNiBAQAogCiBzdGF0aWMgX19pbml0IGludCBtYXg2OTAyX2luaXQodm9pZCkKIHsKLQlwcmludGsoIm1heDY5MDIgc3BpIGRyaXZlclxuIik7CiAJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJm1heDY5MDJfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KG1heDY5MDJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjEyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbXYuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIFJUQyBpbiBNYXJ2ZWxsIFNvQ3MuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisKKyNkZWZpbmUgUlRDX1RJTUVfUkVHX09GRlMJMAorI2RlZmluZSBSVENfU0VDT05EU19PRkZTCTAKKyNkZWZpbmUgUlRDX01JTlVURVNfT0ZGUwk4CisjZGVmaW5lIFJUQ19IT1VSU19PRkZTCQkxNgorI2RlZmluZSBSVENfV0RBWV9PRkZTCQkyNAorI2RlZmluZSBSVENfSE9VUlNfMTJIX01PREUJCSgxIDw8IDIyKSAvKiAxMiBob3VycyBtb2RlICovCisKKyNkZWZpbmUgUlRDX0RBVEVfUkVHX09GRlMJNAorI2RlZmluZSBSVENfTURBWV9PRkZTCQkwCisjZGVmaW5lIFJUQ19NT05USF9PRkZTCQk4CisjZGVmaW5lIFJUQ19ZRUFSX09GRlMJCTE2CisKKworc3RydWN0IHJ0Y19wbGF0X2RhdGEgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7Cit9OworCitzdGF0aWMgaW50IG12X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXUzMglydGNfcmVnOworCisJcnRjX3JlZyA9IChiaW4yYmNkKHRtLT50bV9zZWMpIDw8IFJUQ19TRUNPTkRTX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX21pbikgPDwgUlRDX01JTlVURVNfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1faG91cikgPDwgUlRDX0hPVVJTX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX3dkYXkpIDw8IFJUQ19XREFZX09GRlMpOworCXdyaXRlbChydGNfcmVnLCBpb2FkZHIgKyBSVENfVElNRV9SRUdfT0ZGUyk7CisKKwlydGNfcmVnID0gKGJpbjJiY2QodG0tPnRtX21kYXkpIDw8IFJUQ19NREFZX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX21vbiArIDEpIDw8IFJUQ19NT05USF9PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV95ZWFyICUgMTAwKSA8PCBSVENfWUVBUl9PRkZTKTsKKwl3cml0ZWwocnRjX3JlZywgaW9hZGRyICsgUlRDX0RBVEVfUkVHX09GRlMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXUzMglydGNfdGltZSwgcnRjX2RhdGU7CisJdW5zaWduZWQgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB3ZGF5OworCisJcnRjX3RpbWUgPSByZWFkbChpb2FkZHIgKyBSVENfVElNRV9SRUdfT0ZGUyk7CisJcnRjX2RhdGUgPSByZWFkbChpb2FkZHIgKyBSVENfREFURV9SRUdfT0ZGUyk7CisKKwlzZWNvbmQgPSBydGNfdGltZSAmIDB4N2Y7CisJbWludXRlID0gKHJ0Y190aW1lID4+IFJUQ19NSU5VVEVTX09GRlMpICYgMHg3ZjsKKwlob3VyID0gKHJ0Y190aW1lID4+IFJUQ19IT1VSU19PRkZTKSAmIDB4M2Y7IC8qIGFzc3VtZSAyNCBob3VycyBtb2RlICovCisJd2RheSA9IChydGNfdGltZSA+PiBSVENfV0RBWV9PRkZTKSAmIDB4NzsKKworCWRheSA9IHJ0Y19kYXRlICYgMHgzZjsKKwltb250aCA9IChydGNfZGF0ZSA+PiBSVENfTU9OVEhfT0ZGUykgJiAweDNmOworCXllYXIgPSAocnRjX2RhdGUgPj4gUlRDX1lFQVJfT0ZGUykgJiAweGZmOworCisJdG0tPnRtX3NlYyA9IGJjZDJiaW4oc2Vjb25kKTsKKwl0bS0+dG1fbWluID0gYmNkMmJpbihtaW51dGUpOworCXRtLT50bV9ob3VyID0gYmNkMmJpbihob3VyKTsKKwl0bS0+dG1fbWRheSA9IGJjZDJiaW4oZGF5KTsKKwl0bS0+dG1fd2RheSA9IGJjZDJiaW4od2RheSk7CisJdG0tPnRtX21vbiA9IGJjZDJiaW4obW9udGgpIC0gMTsKKwkvKiBodyBjb3VudHMgZnJvbSB5ZWFyIDIwMDAsIGJ1dCB0bV95ZWFyIGlzIHJlbGF0aXZlIHRvIDE5MDAgKi8KKwl0bS0+dG1feWVhciA9IGJjZDJiaW4oeWVhcikgKyAxMDA7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG12X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG12X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbXZfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhOworCXJlc291cmNlX3NpemVfdCBzaXplOworCXUzMiBydGNfdGltZTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHNpemUsCisJCQkJICAgICBwZGV2LT5uYW1lKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBkYXRhLT5pb2FkZHIgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgc2l6ZSk7CisJaWYgKCFwZGF0YS0+aW9hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgMjQgaG91cnMgbW9kZSBpcyBlbmFibGVkICovCisJcnRjX3RpbWUgPSByZWFkbChwZGF0YS0+aW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCWlmIChydGNfdGltZSAmIFJUQ19IT1VSU18xMkhfTU9ERSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIyNCBIb3VycyBtb2RlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCXBkYXRhLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJCSAmbXZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocGRhdGEtPnJ0YykpCisJCXJldHVybiBQVFJfRVJSKHBkYXRhLT5ydGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG12X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXZfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG12X3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtbXYiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgbXZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm12X3J0Y19kcml2ZXIsIG12X3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBtdl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm12X3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtdl9pbml0KTsKK21vZHVsZV9leGl0KG12X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJ0Yy1tdiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXB4YS5jIGIvZHJpdmVycy9ydGMvcnRjLXB4YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2ViODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBYU2NhbGUgUFhBMjd4IGFuZCBQWEEzeHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm9iZXJ0IEphcnptaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIFRJTUVSX0ZSRVEJCUNMT0NLX1RJQ0tfUkFURQorI2RlZmluZSBSVENfREVGX0RJVklERVIJCSgzMjc2OCAtIDEpCisjZGVmaW5lIFJUQ19ERUZfVFJJTQkJMAorI2RlZmluZSBNQVhGUkVRX1BFUklPRElDCTEwMDAKKworLyoKKyAqIFBYQSBSZWdpc3RlcnMgYW5kIGJpdHMgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBSVFNSX1BJQ0UJKDEgPDwgMTUpCS8qIFBlcmlvZGljIGludGVycnVwdCBjb3VudCBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9QSUFMRQkoMSA8PCAxNCkJLyogUGVyaW9kaWMgaW50ZXJydXB0IEFsYXJtIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1BJQUwJKDEgPDwgMTMpCS8qIFBlcmlvZGljIGludGVycnVwdCBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1NXQUxFMgkoMSA8PCAxMSkJLyogUlRDIHN0b3B3YXRjaCBhbGFybTIgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfU1dBTDIJKDEgPDwgMTApCS8qIFJUQyBzdG9wd2F0Y2ggYWxhcm0yIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfU1dBTEUxCSgxIDw8IDkpCS8qIFJUQyBzdG9wd2F0Y2ggYWxhcm0xIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1NXQUwxCSgxIDw8IDgpCS8qIFJUQyBzdG9wd2F0Y2ggYWxhcm0xIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfUkRBTEUyCSgxIDw8IDcpCS8qIFJUQyBhbGFybTIgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUkRBTDIJKDEgPDwgNikJLyogUlRDIGFsYXJtMiBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1JEQUxFMQkoMSA8PCA1KQkvKiBSVEMgYWxhcm0xIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1JEQUwxCSgxIDw8IDQpCS8qIFJUQyBhbGFybTEgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9IWkUJKDEgPDwgMykJLyogSFogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBSVFNSX0FMRQkoMSA8PCAyKQkvKiBSVEMgYWxhcm0gaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBSVFNSX0haCQkoMSA8PCAxKQkvKiBIWiByaXNpbmctZWRnZSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX0FMCQkoMSA8PCAwKQkvKiBSVEMgYWxhcm0gZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9UUklHX01BU0sJKFJUU1JfQUwgfCBSVFNSX0haIHwgUlRTUl9SREFMMSB8IFJUU1JfUkRBTDJcCisJCQkgfCBSVFNSX1NXQUwxIHwgUlRTUl9TV0FMMikKKyNkZWZpbmUgUll4Ul9ZRUFSX1MJOQorI2RlZmluZSBSWXhSX1lFQVJfTUFTSwkoMHhmZmYgPDwgUll4Ul9ZRUFSX1MpCisjZGVmaW5lIFJZeFJfTU9OVEhfUwk1CisjZGVmaW5lIFJZeFJfTU9OVEhfTUFTSwkoMHhmIDw8IFJZeFJfTU9OVEhfUykKKyNkZWZpbmUgUll4Ul9EQVlfTUFTSwkweDFmCisjZGVmaW5lIFJEeFJfSE9VUl9TCTEyCisjZGVmaW5lIFJEeFJfSE9VUl9NQVNLCSgweDFmIDw8IFJEeFJfSE9VUl9TKQorI2RlZmluZSBSRHhSX01JTl9TCTYKKyNkZWZpbmUgUkR4Ul9NSU5fTUFTSwkoMHgzZiA8PCBSRHhSX01JTl9TKQorI2RlZmluZSBSRHhSX1NFQ19NQVNLCTB4M2YKKworI2RlZmluZSBSVFNSCQkweDA4CisjZGVmaW5lIFJUVFIJCTB4MGMKKyNkZWZpbmUgUkRDUgkJMHgxMAorI2RlZmluZSBSWUNSCQkweDE0CisjZGVmaW5lIFJEQVIxCQkweDE4CisjZGVmaW5lIFJZQVIxCQkweDFjCisjZGVmaW5lIFJUQ1BJQ1IJCTB4MzQKKyNkZWZpbmUgUElBUgkJMHgzOAorCisjZGVmaW5lIHJ0Y19yZWFkbChweGFfcnRjLCByZWcpCVwKKwlfX3Jhd19yZWFkbCgocHhhX3J0YyktPmJhc2UgKyAocmVnKSkKKyNkZWZpbmUgcnRjX3dyaXRlbChweGFfcnRjLCByZWcsIHZhbHVlKQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChweGFfcnRjKS0+YmFzZSArIChyZWcpKQorCitzdHJ1Y3QgcHhhX3J0YyB7CisJc3RydWN0IHJlc291cmNlCSpyZXNzOworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJaW50CQkJaXJxXzFIejsKKwlpbnQJCQlpcnFfQWxybTsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBQcm90ZWN0cyB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCBydGNfdGltZQkJcnRjX2FsYXJtOworfTsKKworc3RhdGljIHUzMiByeXhyX2NhbGMoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gKCh0bS0+dG1feWVhciArIDE5MDApIDw8IFJZeFJfWUVBUl9TKQorCQl8ICgodG0tPnRtX21vbiArIDEpIDw8IFJZeFJfTU9OVEhfUykKKwkJfCB0bS0+dG1fbWRheTsKK30KKworc3RhdGljIHUzMiByZHhyX2NhbGMoc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gKHRtLT50bV9ob3VyIDw8IFJEeFJfSE9VUl9TKSB8ICh0bS0+dG1fbWluIDw8IFJEeFJfTUlOX1MpCisJCXwgdG0tPnRtX3NlYzsKK30KKworc3RhdGljIHZvaWQgdG1fY2FsYyh1MzIgcnljciwgdTMyIHJkY3IsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdG0tPnRtX3llYXIgPSAoKHJ5Y3IgJiBSWXhSX1lFQVJfTUFTSykgPj4gUll4Ul9ZRUFSX1MpIC0gMTkwMDsKKwl0bS0+dG1fbW9uID0gKCgocnljciAmIFJZeFJfTU9OVEhfTUFTSykgPj4gUll4Ul9NT05USF9TKSkgLSAxOworCXRtLT50bV9tZGF5ID0gKHJ5Y3IgJiBSWXhSX0RBWV9NQVNLKTsKKwl0bS0+dG1faG91ciA9IChyZGNyICYgUkR4Ul9IT1VSX01BU0spID4+IFJEeFJfSE9VUl9TOworCXRtLT50bV9taW4gPSAocmRjciAmIFJEeFJfTUlOX01BU0spID4+IFJEeFJfTUlOX1M7CisJdG0tPnRtX3NlYyA9IHJkY3IgJiBSRHhSX1NFQ19NQVNLOworfQorCitzdGF0aWMgdm9pZCBydHNyX2NsZWFyX2JpdHMoc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMsIHUzMiBtYXNrKQoreworCXUzMiBydHNyOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlydHNyICY9IH5SVFNSX1RSSUdfTUFTSzsKKwlydHNyICY9IH5tYXNrOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0c3Jfc2V0X2JpdHMoc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMsIHUzMiBtYXNrKQoreworCXUzMiBydHNyOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlydHNyICY9IH5SVFNSX1RSSUdfTUFTSzsKKwlydHNyIHw9IG1hc2s7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHB4YV9ydGNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldl9pZCk7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1MzIgcnRzcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlzcGluX2xvY2soJnB4YV9ydGMtPmxvY2spOworCisJLyogY2xlYXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7CisKKwkvKiB0ZW1wb3JhcnkgZGlzYWJsZSBydGMgaW50ZXJydXB0cyAqLworCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1JEQUxFMSB8IFJUU1JfUElBTEUgfCBSVFNSX0haRSk7CisKKwkvKiBjbGVhciBhbGFybSBpbnRlcnJ1cHQgaWYgaXQgaGFzIG9jY3VycmVkICovCisJaWYgKHJ0c3IgJiBSVFNSX1JEQUwxKQorCQlydHNyICY9IH5SVFNSX1JEQUxFMTsKKworCS8qIHVwZGF0ZSBpcnEgZGF0YSAmIGNvdW50ZXIgKi8KKwlpZiAocnRzciAmIFJUU1JfUkRBTDEpCisJCWV2ZW50cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKKwlpZiAocnRzciAmIFJUU1JfSFopCisJCWV2ZW50cyB8PSBSVENfVUYgfCBSVENfSVJRRjsKKwlpZiAocnRzciAmIFJUU1JfUElBTCkKKwkJZXZlbnRzIHw9IFJUQ19QRiB8IFJUQ19JUlFGOworCisJcnRjX3VwZGF0ZV9pcnEocHhhX3J0Yy0+cnRjLCAxLCBldmVudHMpOworCisJLyogZW5hYmxlIGJhY2sgcnRjIGludGVycnVwdHMgKi8KKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IgJiB+UlRTUl9UUklHX01BU0spOworCisJc3Bpbl91bmxvY2soJnB4YV9ydGMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBweGFfcnRjX29wZW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKHB4YV9ydGMtPmlycV8xSHosIHB4YV9ydGNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAicnRjIDFIeiIsIGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsIHB4YV9ydGMtPmlycV8xSHosCisJCQlyZXQpOworCQlnb3RvIGVycl9pcnFfMUh6OworCX0KKwlyZXQgPSByZXF1ZXN0X2lycShweGFfcnRjLT5pcnFfQWxybSwgcHhhX3J0Y19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgICJydGMgQWxybSIsIGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsIHB4YV9ydGMtPmlycV9BbHJtLAorCQkJcmV0KTsKKwkJZ290byBlcnJfaXJxX0Fscm07CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9pcnFfQWxybToKKwlmcmVlX2lycShweGFfcnRjLT5pcnFfMUh6LCBkZXYpOworZXJyX2lycV8xSHo6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHhhX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1JEQUxFMSB8IFJUU1JfSFpFKTsKKwlzcGluX3VubG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJZnJlZV9pcnEocHhhX3J0Yy0+aXJxX0Fscm0sIGRldik7CisJZnJlZV9pcnEocHhhX3J0Yy0+aXJxXzFIeiwgZGV2KTsKK30KKworc3RhdGljIGludCBweGFfcGVyaW9kaWNfaXJxX3NldF9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGZyZXEpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcGVyaW9kX21zOworCisJaWYgKGZyZXEgPCAxIHx8IGZyZXEgPiBNQVhGUkVRX1BFUklPRElDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBlcmlvZF9tcyA9IDEwMDAgLyBmcmVxOworCXJ0Y193cml0ZWwocHhhX3J0YywgUElBUiwgcGVyaW9kX21zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9wZXJpb2RpY19pcnFfc2V0X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGVuYWJsZWQpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChlbmFibGVkKQorCQlydHNyX3NldF9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1BJQ0UpOworCWVsc2UKKwkJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1BJQ0UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CisJCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1JEQUxFMSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoKKwkJcnRzcl9zZXRfYml0cyhweGFfcnRjLCBSVFNSX1JEQUxFMSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PRkY6CisJCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX0haRSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PTjoKKwkJcnRzcl9zZXRfYml0cyhweGFfcnRjLCBSVFNSX0haRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9JT0NUTENNRDsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ5Y3IsIHJkY3I7CisKKwlyeWNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJZQ1IpOworCXJkY3IgPSBydGNfcmVhZGwocHhhX3J0YywgUkRDUik7CisKKwl0bV9jYWxjKHJ5Y3IsIHJkY3IsIHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3dyaXRlbChweGFfcnRjLCBSWUNSLCByeXhyX2NhbGModG0pKTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJEQ1IsIHJkeHJfY2FsYyh0bSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgcnRzciwgcnlhciwgcmRhcjsKKworCXJ5YXIgPSBydGNfcmVhZGwocHhhX3J0YywgUllBUjEpOworCXJkYXIgPSBydGNfcmVhZGwocHhhX3J0YywgUkRBUjEpOworCXRtX2NhbGMocnlhciwgcmRhciwgJmFscm0tPnRpbWUpOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlhbHJtLT5lbmFibGVkID0gKHJ0c3IgJiBSVFNSX1JEQUxFMSkgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gKHJ0c3IgJiBSVFNSX1JEQUwxKSA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgcnRzcjsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJcnRjX3dyaXRlbChweGFfcnRjLCBSWUFSMSwgcnl4cl9jYWxjKCZhbHJtLT50aW1lKSk7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSREFSMSwgcmR4cl9jYWxjKCZhbHJtLT50aW1lKSk7CisKKwlydHNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpOworCWlmIChhbHJtLT5lbmFibGVkKQorCQlydHNyIHw9IFJUU1JfUkRBTEUxOworCWVsc2UKKwkJcnRzciAmPSB+UlRTUl9SREFMRTE7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3Byb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc2VxX3ByaW50ZihzZXEsICJ0cmltL2RpdmlkZXJcdDogMHglMDh4XG4iLCBydGNfcmVhZGwocHhhX3J0YywgUlRUUikpOworCXNlcV9wcmludGYoc2VxLCAidXBkYXRlX0lSUVx0OiAlc1xuIiwKKwkJICAgKHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKSAmIFJUU1JfSFpFKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCSAgIChydGNfcmVhZGwocHhhX3J0YywgUlRTUikgJiBSVFNSX1BJQUxFKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19mcmVxXHQ6ICV1XG4iLCBydGNfcmVhZGwocHhhX3J0YywgUElBUikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBweGFfcnRjX29wcyA9IHsKKwkub3BlbiA9IHB4YV9ydGNfb3BlbiwKKwkucmVsZWFzZSA9IHB4YV9ydGNfcmVsZWFzZSwKKwkuaW9jdGwgPSBweGFfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUgPSBweGFfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBweGFfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gcHhhX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBweGFfcnRjX3NldF9hbGFybSwKKwkucHJvYyA9IHB4YV9ydGNfcHJvYywKKwkuaXJxX3NldF9zdGF0ZSA9IHB4YV9wZXJpb2RpY19pcnFfc2V0X3N0YXRlLAorCS5pcnFfc2V0X2ZyZXEgPSBweGFfcGVyaW9kaWNfaXJxX3NldF9mcmVxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGM7CisJaW50IHJldDsKKwl1MzIgcnR0cjsKKworCXB4YV9ydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHhhX3J0YyksIEdGUF9LRVJORUwpOworCWlmICghcHhhX3J0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmcHhhX3J0Yy0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHhhX3J0Yyk7CisKKwlyZXQgPSAtRU5YSU87CisJcHhhX3J0Yy0+cmVzcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFweGFfcnRjLT5yZXNzKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gSS9PIG1lbW9yeSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBlcnJfcmVzczsKKwl9CisKKwlweGFfcnRjLT5pcnFfMUh6ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocHhhX3J0Yy0+aXJxXzFIeiA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyAxSHogSVJRIHJlc291cmNlIGRlZmluZWRcbiIpOworCQlnb3RvIGVycl9yZXNzOworCX0KKwlweGFfcnRjLT5pcnFfQWxybSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CisJaWYgKHB4YV9ydGMtPmlycV9BbHJtIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk5vIGFsYXJtIElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBlcnJfcmVzczsKKwl9CisKKwlyZXQgPSAtRU5PTUVNOworCXB4YV9ydGMtPmJhc2UgPSBpb3JlbWFwKHB4YV9ydGMtPnJlc3MtPnN0YXJ0LAorCQkJCXJlc291cmNlX3NpemUocHhhX3J0Yy0+cmVzcykpOworCWlmICghcHhhX3J0Yy0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gbWFwIHB4YSBSVEMgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX21hcDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBjbG9jayBkaXZpZGVyIGlzIHVuaW5pdGlhbGl6ZWQgdGhlbiByZXNldCBpdCB0byB0aGUKKwkgKiBkZWZhdWx0IHZhbHVlIHRvIGdldCB0aGUgMUh6IGNsb2NrLgorCSAqLworCWlmIChydGNfcmVhZGwocHhhX3J0YywgUlRUUikgPT0gMCkgeworCQlydHRyID0gUlRDX0RFRl9ESVZJREVSICsgKFJUQ19ERUZfVFJJTSA8PCAxNik7CisJCXJ0Y193cml0ZWwocHhhX3J0YywgUlRUUiwgcnR0cik7CisJCWRldl93YXJuKGRldiwgIndhcm5pbmc6IGluaXRpYWxpemluZyBkZWZhdWx0IGNsb2NrIgorCQkJICIgZGl2aWRlci90cmltIHZhbHVlXG4iKTsKKwl9CisKKwlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9QSUFMRSB8IFJUU1JfUkRBTEUxIHwgUlRTUl9IWkUpOworCisJcHhhX3J0Yy0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicHhhLXJ0YyIsICZwZGV2LT5kZXYsICZweGFfcnRjX29wcywKKwkJCQkJICAgVEhJU19NT0RVTEUpOworCXJldCA9IFBUUl9FUlIocHhhX3J0Yy0+cnRjKTsKKwlpZiAoSVNfRVJSKHB4YV9ydGMtPnJ0YykpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRDIGRldmljZSAtPiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcnRjX3JlZzsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCAxKTsKKworCXJldHVybiAwOworCitlcnJfcnRjX3JlZzoKKwkgaW91bm1hcChweGFfcnRjLT5iYXNlKTsKK2Vycl9yZXNzOgorZXJyX21hcDoKKwlrZnJlZShweGFfcnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBweGFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocHhhX3J0Yy0+cnRjKTsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCWlvdW5tYXAocHhhX3J0Yy0+YmFzZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCWtmcmVlKHB4YV9ydGMpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcHhhX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UocHhhX3J0Yy0+aXJxX0Fscm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShweGFfcnRjLT5pcnFfQWxybSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBweGFfcnRjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBweGFfcnRjX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhX3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChweGFfcnRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBweGFfcnRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGFfcnRjX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInB4YS1ydGMiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGFfcnRjX2luaXQodm9pZCkKK3sKKwlpZiAoY3B1X2lzX3B4YTI3eCgpIHx8IGNwdV9pc19weGEzeHgoKSkKKwkJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmcHhhX3J0Y19kcml2ZXIsIHB4YV9ydGNfcHJvYmUpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBweGFfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhX3J0Y19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChweGFfcnRjX2luaXQpOworbW9kdWxlX2V4aXQocHhhX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUm9iZXJ0IEphcnptaWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFhBMjd4L1BYQTN4eCBSZWFsdGltZSBDbG9jayBEcml2ZXIgKFJUQykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cHhhLXJ0YyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jIGIvZHJpdmVycy9ydGMvcnRjLXMzYy5jCmluZGV4IDdhNTY4YmUuLmUwZDdiOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKQEAgLTk0LDYgKzk0LDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXNwaW5fbG9ja19pcnEoJnMzY19ydGNfcGllX2xvY2spOwogCiAJdG1wID0gcmVhZGIoczNjX3J0Y19iYXNlICsgUzNDMjQxMF9USUNOVCkgJiBTM0MyNDEwX1RJQ05UX0VOQUJMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zaC5jIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKaW5kZXggYWFmOWQ2YS4uMWMzZmM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNoLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkic2gtcnRjIgpAQCAtODksNyArOTAsOSBAQAogCXZvaWQgX19pb21lbSAqcmVnYmFzZTsKIAl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgaW50IGFsYXJtX2lycSwgcGVyaW9kaWNfaXJxLCBjYXJyeV9pcnE7CisJaW50IGFsYXJtX2lycTsKKwlpbnQgcGVyaW9kaWNfaXJxOworCWludCBjYXJyeV9pcnE7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXY7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgY2FwYWJpbGl0aWVzOwkvKiBTZWUgYXNtLXNoL3J0Yy5oIGZvciBjYXAgYml0cyAqLwpAQCAtNTQ5LDYgKzU1Miw4IEBACiAKIHN0YXRpYyBpbnQgc2hfcnRjX2lycV9zZXRfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBmcmVxKQogeworCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHNoX3J0Y19pb2N0bChkZXYsIFJUQ19JUlFQX1NFVCwgZnJlcSk7CiB9CiAKQEAgLTU3OCw3ICs1ODMsNyBAQAogCiAJLyogZ2V0IHBlcmlvZGljL2NhcnJ5L2FsYXJtIGlycXMgKi8KIAlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCWlmICh1bmxpa2VseShyZXQgPD0gMCkpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIGZvciBwZXJpb2RcbiIpOwogCQlnb3RvIGVycl9iYWRyZXM7CkBAIC01ODYsNyArNTkxLDcgQEAKIAlydGMtPnBlcmlvZGljX2lycSA9IHJldDsKIAogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJaWYgKHVubGlrZWx5KHJldCA8PSAwKSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIGNhcnJ5XG4iKTsKIAkJZ290byBlcnJfYmFkcmVzOwpAQCAtNTk0LDcgKzU5OSw3IEBACiAJcnRjLT5jYXJyeV9pcnEgPSByZXQ7CiAKIAlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDIpOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCWlmICh1bmxpa2VseShyZXQgPD0gMCkpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIGZvciBhbGFybVxuIik7CiAJCWdvdG8gZXJyX2JhZHJlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jIGIvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKaW5kZXggZjRjZDQ2ZS4uZGMwYjYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OwogCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CkBAIC0xODcsNyArMTg3LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKIAlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRU5PSU9DVExDTUQ7IC8qIGZhbGwgYmFjayBpbnRvIHJ0Yy1kZXYncyBlbXVsYXRpb24gKi8KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX0FJRV9PRkY6CkBAIC0zMDMsNyArMzAzLDYgQEAKIAlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCXBkYXRhLT5pcnEgPSAtMTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBSVENfUkVHX1NJWkUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0zMjksMTMgKzMyOCwxMyBAQAogCWlmIChyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX1BGKQogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAidm9sdGFnZS1sb3cgZGV0ZWN0ZWQuXG4iKTsKIAotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJd3JpdGViKDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKIAkJaWYgKHJlcXVlc3RfaXJxKHBkYXRhLT5pcnEsIHN0azE3dGE4X3J0Y19pbnRlcnJ1cHQsCiAJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAogCQkJCXBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgewogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7Ci0JCQlwZGF0YS0+aXJxID0gLTE7CisJCQlwZGF0YS0+aXJxID0gMDsKIAkJfQogCX0KIApAQCAtMzU1LDcgKzM1NCw3IEBACiAgb3V0OgogCWlmIChwZGF0YS0+cnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkKKwlpZiAocGRhdGEtPmlycSA+IDApCiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCWlmIChpb2FkZHIpCiAJCWlvdW5tYXAoaW9hZGRyKTsKQEAgLTM3MSw3ICszNzAsNyBAQAogCiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnN0azE3dGE4X252cmFtX2F0dHIpOwogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBwZGF0YS0+aW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jIGIvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwppbmRleCBiYzkzMDAyLi5lNDc4MjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKQEAgLTM0LDE0ICszNCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGVzdF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdGVzdF9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHNlY3MpCiB7CisJZGV2X2luZm8oZGV2LCAiJXMsIHNlY3MgPSAlbHVcbiIsIF9fZnVuY19fLCBzZWNzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzgsNyArNzMsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHRlc3RfcnRjX29wcyA9IHsKIAkucHJvYyA9IHRlc3RfcnRjX3Byb2MsCiAJLnJlYWRfdGltZSA9IHRlc3RfcnRjX3JlYWRfdGltZSwKLQkuc2V0X3RpbWUgPSB0ZXN0X3J0Y19zZXRfdGltZSwKIAkucmVhZF9hbGFybSA9IHRlc3RfcnRjX3JlYWRfYWxhcm0sCiAJLnNldF9hbGFybSA9IHRlc3RfcnRjX3NldF9hbGFybSwKIAkuc2V0X21tc3MgPSB0ZXN0X3J0Y19zZXRfbW1zcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jCmluZGV4IDAxZDhkYTkuLjhjZTVmNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYwpAQCAtMTksNiArMTksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNDE1LDggKzQxNiw4IEBACiAJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJdTggcmRfcmVnOwogCi0JaWYgKGlycSA8IDApCi0JCXJldHVybiBpcnE7CisJaWYgKGlycSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwKIAkJCQkgICZwZGV2LT5kZXYsICZ0d2w0MDMwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy10eDQ5MzkuYyBiL2RyaXZlcnMvcnRjL3J0Yy10eDQ5MzkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU0ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXR4NDkzOS5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogVFg0OTM5IGludGVybmFsIFJUQyBkcml2ZXIKKyAqIEJhc2VkIG9uIFJCVFg0OXh4IHBhdGNoIGZyb20gQ0VMRiBwYXRjaCBhcmNoaXZlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIChDKSBDb3B5cmlnaHQgVE9TSElCQSBDT1JQT1JBVElPTiAyMDA1LTIwMDcKKyAqLworI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3R4eDkvdHg0OTM5Lmg+CisKK3N0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWc7Cit9OworCitzdGF0aWMgc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKmdldF90eDQ5MzlydGNfcGxhdF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZ2V0X2RydmRhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfY21kKHN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcsIGludCBjbWQpCit7CisJaW50IGkgPSAwOworCisJX19yYXdfd3JpdGVsKGNtZCwgJnJ0Y3JlZy0+Y3RsKTsKKwkvKiBUaGlzIG1pZ2h0IHRha2UgMzB1cyAobmV4dCAzMi43NjhLSHogY2xvY2spICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0JVU1kpIHsKKwkJLyogdGltZW91dCBvbiBhcHByb3guIDEwMHVzIChAIEdCVVMyMDBNSHopICovCisJCWlmIChpKysgPiAyMDAgKiAxMDApCisJCQlyZXR1cm4gLUVCVVNZOworCQljcHVfcmVsYXgoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgc2VjcykKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisKKwlidWZbMF0gPSAwOworCWJ1ZlsxXSA9IDA7CisJYnVmWzJdID0gc2VjczsKKwlidWZbM10gPSBzZWNzID4+IDg7CisJYnVmWzRdID0gc2VjcyA+PiAxNjsKKwlidWZbNV0gPSBzZWNzID4+IDI0OworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlfX3Jhd193cml0ZWwoMCwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlfX3Jhd193cml0ZWwoYnVmW2ldLCAmcnRjcmVnLT5kYXQpOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywKKwkJCSAgICAgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX1NFVFRJTUUgfAorCQkJICAgICAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRSkpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsCisJCQkgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9HRVRUSU1FIHwKKwkJCSAgICAgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCQlyZXR1cm4gcmV0OworCX0KKwlfX3Jhd193cml0ZWwoMiwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAyOyBpIDwgNjsgaSsrKQorCQlidWZbaV0gPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5kYXQpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXNlYyA9IChidWZbNV0gPDwgMjQpIHwgKGJ1Zls0XSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzJdOworCXJ0Y190aW1lX3RvX3RtKHNlYywgdG0pOworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJaWYgKGFscm0tPnRpbWUudG1fc2VjIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX21pbiA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9ob3VyIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX21kYXkgPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1fbW9uIDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX3llYXIgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJnNlYyk7CisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAwOworCWJ1ZlsyXSA9IHNlYzsKKwlidWZbM10gPSBzZWMgPj4gODsKKwlidWZbNF0gPSBzZWMgPj4gMTY7CisJYnVmWzVdID0gc2VjID4+IDI0OworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlfX3Jhd193cml0ZWwoMCwgJnJ0Y3JlZy0+YWRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlfX3Jhd193cml0ZWwoYnVmW2ldLCAmcnRjcmVnLT5kYXQpOworCXJldCA9IHR4NDkzOV9ydGNfY21kKHJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX1NFVEFMQVJNIHwKKwkJCSAgICAgKGFscm0tPmVuYWJsZWQgPyBUWDQ5MzlfUlRDQ1RMX0FMTUUgOiAwKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBzZWM7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisJdTMyIGN0bDsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsCisJCQkgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9HRVRBTEFSTSB8CisJCQkgICAgIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSk7CisJaWYgKHJldCkgeworCQlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJX19yYXdfd3JpdGVsKDIsICZydGNyZWctPmFkcik7CisJZm9yIChpID0gMjsgaSA8IDY7IGkrKykKKwkJYnVmW2ldID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+ZGF0KTsKKwljdGwgPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpOworCWFscm0tPmVuYWJsZWQgPSAoY3RsICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSA/IDEgOiAwOworCWFscm0tPnBlbmRpbmcgPSAoY3RsICYgVFg0OTM5X1JUQ0NUTF9BTE1EKSA/IDEgOiAwOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXNlYyA9IChidWZbNV0gPDwgMjQpIHwgKGJ1Zls0XSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzJdOworCXJ0Y190aW1lX3RvX3RtKHNlYywgJmFscm0tPnRpbWUpOworCXJldHVybiBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGVkKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJdHg0OTM5X3J0Y19jbWQocGRhdGEtPnJ0Y3JlZywKKwkJICAgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1AgfAorCQkgICAgICAgKGVuYWJsZWQgPyBUWDQ5MzlfUlRDQ1RMX0FMTUUgOiAwKSk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eDQ5MzlfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2X2lkKTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IFJUQ19JUlFGOworCisJc3Bpbl9sb2NrKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJaWYgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUQpIHsKKwkJZXZlbnRzIHw9IFJUQ19BRjsKKwkJdHg0OTM5X3J0Y19jbWQocnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QKTsKKwl9CisJc3Bpbl91bmxvY2soJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlydGNfdXBkYXRlX2lycShwZGF0YS0+cnRjLCAxLCBldmVudHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIHR4NDkzOV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJCT0gdHg0OTM5X3J0Y19yZWFkX3RpbWUsCisJLnJlYWRfYWxhcm0JCT0gdHg0OTM5X3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JCT0gdHg0OTM5X3J0Y19zZXRfYWxhcm0sCisJLnNldF9tbXNzCQk9IHR4NDkzOV9ydGNfc2V0X21tc3MsCisJLmFsYXJtX2lycV9lbmFibGUJPSB0eDQ5MzlfcnRjX2FsYXJtX2lycV9lbmFibGUsCit9OworCitzdGF0aWMgc3NpemVfdCB0eDQ5MzlfcnRjX252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJICAgICBjaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCXNzaXplX3QgY291bnQ7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFRYNDkzOV9SVENfUkVHX1JBTVNJWkU7CisJICAgICBjb3VudCsrLCBzaXplLS0pIHsKKwkJX19yYXdfd3JpdGVsKHBvcysrLCAmcnRjcmVnLT5hZHIpOworCQkqYnVmKysgPSBfX3Jhd19yZWFkbCgmcnRjcmVnLT5kYXQpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR4NDkzOV9ydGNfbnZyYW1fd3JpdGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJc3NpemVfdCBjb3VudDsKKworCXNwaW5fbG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgVFg0OTM5X1JUQ19SRUdfUkFNU0laRTsKKwkgICAgIGNvdW50KyssIHNpemUtLSkgeworCQlfX3Jhd193cml0ZWwocG9zKyssICZydGNyZWctPmFkcik7CisJCV9fcmF3X3dyaXRlbCgqYnVmKyssICZydGNyZWctPmRhdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHR4NDkzOV9ydGNfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSLAorCX0sCisJLnNpemUgPSBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFLAorCS5yZWFkID0gdHg0OTM5X3J0Y19udnJhbV9yZWFkLAorCS53cml0ZSA9IHR4NDkzOV9ydGNfbnZyYW1fd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0eDQ5MzlfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgcmV0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisJcGRhdGEtPnJ0Y3JlZyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LAorCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXBkYXRhLT5ydGNyZWcpCisJCXJldHVybiAtRUJVU1k7CisKKwl0eDQ5MzlfcnRjX2NtZChwZGF0YS0+cnRjcmVnLCBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QKTsKKwlpZiAoZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIHR4NDkzOV9ydGNfaW50ZXJydXB0LAorCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisJCQkgICAgIHBkZXYtPm5hbWUsICZwZGV2LT5kZXYpIDwgMCkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJICAmdHg0OTM5X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpCisJCXJldHVybiBQVFJfRVJSKHJ0Yyk7CisJcGRhdGEtPnJ0YyA9IHJ0YzsKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmdHg0OTM5X3J0Y19udnJhbV9hdHRyKTsKKwlpZiAocmV0KQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCB0eDQ5MzlfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwZGF0YS0+cnRjOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJdHg0OTM5X3J0Y19jbWQocGRhdGEtPnJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmdHg0OTM5X3J0Y19udnJhbV9hdHRyKTsKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHg0OTM5X3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcCh0eDQ5MzlfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInR4NDkzOXJ0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0eDQ5MzlydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnR4NDkzOV9ydGNfZHJpdmVyLCB0eDQ5MzlfcnRjX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHR4NDkzOXJ0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR4NDkzOV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHg0OTM5cnRjX2luaXQpOworbW9kdWxlX2V4aXQodHg0OTM5cnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVFg0OTM5IGludGVybmFsIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHg0OTM5cnRjIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKaW5kZXggODM0ZGNjNi4uZjExMjk3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTg0LDggKzg1LDggQEAKIHN0YXRpYyBjaGFyIHJ0Y19uYW1lW10gPSAiUlRDIjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmlvZGljX2NvdW50Owogc3RhdGljIHVuc2lnbmVkIGludCBhbGFybV9lbmFibGVkOwotc3RhdGljIGludCBhaWVfaXJxID0gLTE7Ci1zdGF0aWMgaW50IHBpZV9pcnEgPSAtMTsKK3N0YXRpYyBpbnQgYWllX2lycTsKK3N0YXRpYyBpbnQgcGllX2lycTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZWxhcHNlZF9zZWNvbmQodm9pZCkKIHsKQEAgLTIxMCw2ICsyMTEsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgY291bnQ7CiAKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOwogCWNvdW50ID0gUlRDX0ZSRVFVRU5DWTsKIAlkb19kaXYoY291bnQsIGZyZXEpOwogCkBAIC0zNjAsNyArMzYzLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKIAogCWFpZV9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChhaWVfaXJxIDwgMCB8fCBhaWVfaXJxID49IG5yX2lycXMpIHsKKwlpZiAoYWllX2lycSA8PSAwKSB7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJZ290byBlcnJfZGV2aWNlX3VucmVnaXN0ZXI7CiAJfQpAQCAtMzcxLDcgKzM3NCw3IEBACiAJCWdvdG8gZXJyX2RldmljZV91bnJlZ2lzdGVyOwogCiAJcGllX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7Ci0JaWYgKHBpZV9pcnEgPCAwIHx8IHBpZV9pcnEgPj0gbnJfaXJxcykKKwlpZiAocGllX2lycSA8PSAwKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIAogCXJldHZhbCA9IHJlcXVlc3RfaXJxKHBpZV9pcnEsIHJ0Y2xvbmcxX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9NYWtlZmlsZSBiL2RyaXZlcnMvczM5MC9NYWtlZmlsZQppbmRleCA0ZjRlN2NmLi5kMGVhZTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zMzkwL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBDRkxBR1Nfc3lzaW5mby5vICs9IC1JaW5jbHVkZS9tYXRoLWVtdSAtSWFyY2gvczM5MC9tYXRoLWVtdSAtdwogCi1vYmoteSArPSBzMzkwbWFjaC5vIHN5c2luZm8ubyBzMzkwX3JkZXYubworb2JqLXkgKz0gczM5MG1hY2gubyBzeXNpbmZvLm8KIG9iai15ICs9IGNpby8gYmxvY2svIGNoYXIvIGNyeXB0by8gbmV0LyBzY3NpLyBrdm0vCiAKIGRyaXZlcnMteSArPSBkcml2ZXJzL3MzOTAvYnVpbHQtaW4ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKaW5kZXggMjZmZmM2YS4uY2ZkY2YxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KIAogI2RlZmluZSBEQ1NTQkxLX05BTUUgImRjc3NibGsiCiAjZGVmaW5lIERDU1NCTEtfTUlOT1JTX1BFUl9ESVNLIDEKQEAgLTk0Niw3ICs5NDUsNyBAQAogc3RhdGljIHZvaWQgX19leGl0CiBkY3NzYmxrX2V4aXQodm9pZCkKIHsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAl1bnJlZ2lzdGVyX2Jsa2RldihkY3NzYmxrX21ham9yLCBEQ1NTQkxLX05BTUUpOwogfQogCkBAIC05NTUsMjIgKzk1NCwyMiBAQAogewogCWludCByYzsKIAotCWRjc3NibGtfcm9vdF9kZXYgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJkY3NzYmxrIik7CisJZGNzc2Jsa19yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJkY3NzYmxrIik7CiAJaWYgKElTX0VSUihkY3NzYmxrX3Jvb3RfZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZGNzc2Jsa19yb290X2Rldik7CiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGNzc2Jsa19yb290X2RldiwgJmRldl9hdHRyX2FkZCk7CiAJaWYgKHJjKSB7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShkY3NzYmxrX3Jvb3RfZGV2LCAmZGV2X2F0dHJfcmVtb3ZlKTsKIAlpZiAocmMpIHsKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gcmVnaXN0ZXJfYmxrZGV2KDAsIERDU1NCTEtfTkFNRSk7CiAJaWYgKHJjIDwgMCkgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CiAJCXJldHVybiByYzsKIAl9CiAJZGNzc2Jsa19tYWpvciA9IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggMWY1ZjVkMi4uOWMxNDg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8YXNtL2FpcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0xNTIyLDcgKzE1MjEsNyBAQAogCX0KIAogCS8qIENyZWF0ZSAvc3lzL2RldmljZXMvYXAuICovCi0JYXBfcm9vdF9kZXZpY2UgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJhcCIpOworCWFwX3Jvb3RfZGV2aWNlID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImFwIik7CiAJcmMgPSBJU19FUlIoYXBfcm9vdF9kZXZpY2UpID8gUFRSX0VSUihhcF9yb290X2RldmljZSkgOiAwOwogCWlmIChyYykKIAkJZ290byBvdXRfYnVzOwpAQCAtMTU2NSw3ICsxNTY0LDcgQEAKIAlocnRpbWVyX2NhbmNlbCgmYXBfcG9sbF90aW1lcik7CiAJZGVzdHJveV93b3JrcXVldWUoYXBfd29ya19xdWV1ZSk7CiBvdXRfcm9vdDoKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOwogb3V0X2J1czoKIAl3aGlsZSAoaS0tKQogCQlidXNfcmVtb3ZlX2ZpbGUoJmFwX2J1c190eXBlLCBhcF9idXNfYXR0cnNbaV0pOwpAQCAtMTYwMCw3ICsxNTk5LDcgQEAKIAlocnRpbWVyX2NhbmNlbCgmYXBfcG9sbF90aW1lcik7CiAJZGVzdHJveV93b3JrcXVldWUoYXBfd29ya19xdWV1ZSk7CiAJdGFza2xldF9raWxsKCZhcF90YXNrbGV0KTsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOwogCXdoaWxlICgoZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZhcF9idXNfdHlwZSwgTlVMTCwgTlVMTCwKIAkJICAgIF9fYXBfbWF0Y2hfYWxsKSkpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwppbmRleCAyOGM5MGI4Li5jYmM4NTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYworKysgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9rdm1fdmlydGlvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjZGVmaW5lIFZJUlRJT19TVUJDT0RFXzY0IDB4MEQwMAogCkBAIC0zMzUsNyArMzM0LDcgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfS1ZNKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWt2bV9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3Rlcigia3ZtX3MzOTAiKTsKKwlrdm1fcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJrdm1fczM5MCIpOwogCWlmIChJU19FUlIoa3ZtX3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihrdm1fcm9vdCk7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGt2bV9zMzkwIHJvb3QgZGV2aWNlIik7CkBAIC0zNDQsNyArMzQzLDcgQEAKIAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhyZWFsX21lbW9yeV9zaXplLCBQQUdFX1NJWkUpOwogCWlmIChyYykgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoa3ZtX3Jvb3QpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGt2bV9yb290KTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYyBiL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKaW5kZXggZjRhMzIzNy4uNDgzODM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9jY3dncm91cC5oPgogCkBAIC0xMjAsMTIgKzExOSwxMiBAQAogewogCWludCByYzsKIAotCWN1MzA4OF9yb290X2RldiA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoImN1MzA4OCIpOworCWN1MzA4OF9yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJjdTMwODgiKTsKIAlpZiAoSVNfRVJSKGN1MzA4OF9yb290X2RldikpCiAJCXJldHVybiBQVFJfRVJSKGN1MzA4OF9yb290X2Rldik7CiAJcmMgPSBjY3dfZHJpdmVyX3JlZ2lzdGVyKCZjdTMwODhfZHJpdmVyKTsKIAlpZiAocmMpCi0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzQsNyArMTMzLDcgQEAKIGN1MzA4OF9leGl0ICh2b2lkKQogewogCWNjd19kcml2ZXJfdW5yZWdpc3RlcigmY3UzMDg4X2RyaXZlcik7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOwogfQogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGNjdyxjdTMwODhfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCA2ODExZGQ1Li5kMWI1YmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjaW5jbHVkZSAicWV0aF9jb3JlLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKQEAgLTQ1MjUsNyArNDUyNCw3IEBACiAJCQkJJmRyaXZlcl9hdHRyX2dyb3VwKTsKIAlpZiAocmMpCiAJCWdvdG8gZHJpdmVyX2VycjsKLQlxZXRoX2NvcmVfcm9vdF9kZXYgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJxZXRoIik7CisJcWV0aF9jb3JlX3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoInFldGgiKTsKIAlyYyA9IElTX0VSUihxZXRoX2NvcmVfcm9vdF9kZXYpID8gUFRSX0VSUihxZXRoX2NvcmVfcm9vdF9kZXYpIDogMDsKIAlpZiAocmMpCiAJCWdvdG8gcmVnaXN0ZXJfZXJyOwpAQCAtNDUzOSw3ICs0NTM4LDcgQEAKIAogCXJldHVybiAwOwogc2xhYl9lcnI6Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOwogcmVnaXN0ZXJfZXJyOgogCWRyaXZlcl9yZW1vdmVfZmlsZSgmcWV0aF9jb3JlX2Njd2dyb3VwX2RyaXZlci5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfZ3JvdXApOwpAQCAtNDU1Nyw3ICs0NTU2LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHFldGhfY29yZV9leGl0KHZvaWQpCiB7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOwogCWRyaXZlcl9yZW1vdmVfZmlsZSgmcWV0aF9jb3JlX2Njd2dyb3VwX2RyaXZlci5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfZ3JvdXApOwogCWNjd2dyb3VwX2RyaXZlcl91bnJlZ2lzdGVyKCZxZXRoX2NvcmVfY2N3Z3JvdXBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCmluZGV4IDIxNjI3YmEuLjU5MWEyYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwpAQCAtMjAsOCArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KICNpbmNsdWRlICJxZXRoX2NvcmUuaCIKICNpbmNsdWRlICJxZXRoX2NvcmVfb2ZmbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwppbmRleCBjZmRhMWVjLi40NjkzZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KICNpbmNsdWRlICJxZXRoX2wzLmgiCiAjaW5jbHVkZSAicWV0aF9jb3JlX29mZmwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jIGIvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM3MWMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvczM5MC9zMzkwX3JkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiAgZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCi0gKiAgczM5MCByb290IGRldmljZQotICoKLSAqICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwKLSAqCQkJIElCTSBDb3Jwb3JhdGlvbgotICogICAgQXV0aG9yKHMpOiBDb3JuZWxpYSBIdWNrIChjb3JuZWxpYS5odWNrQGRlLmlibS5jb20pCi0gKgkJICBDYXJzdGVuIE90dGUgIChjb3R0ZUBkZS5pYm0uY29tKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgotCi1zdGF0aWMgdm9pZAotczM5MF9yb290X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlrZnJlZShkZXYpOwotfQotCi1zdHJ1Y3QgZGV2aWNlICoKLXMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCWlmICghc3RybGVuKG5hbWUpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWRldl9zZXRfbmFtZShkZXYsIG5hbWUpOwotCWRldi0+cmVsZWFzZSA9IHMzOTBfcm9vdF9kZXZfcmVsZWFzZTsKLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCXJldHVybiBkZXY7Ci19Ci0KLXZvaWQKLXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaWYgKGRldikKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLX0KLQotRVhQT1JUX1NZTUJPTChzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IGRjNjhiN2UuLjQyZjRlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMjAzMCw3ICsyMDMwLDcgQEAKIAkJaWYgKCF0cmllcykKIAkJCXByaW50ayhLRVJOX0VSUiAiJXMlcyVzJWQ6IFVuYWJsZSB0byBkcmFpbiAiCiAJCQkJCSJ0cmFuc21pdHRlclxuIiwKLQkJCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAorCQkJICAgICAgIHBvcnQtPmRldiA/IGRldl9uYW1lKHBvcnQtPmRldikgOiAiIiwKIAkJCSAgICAgICBwb3J0LT5kZXYgPyAiOiAiIDogIiIsCiAJCQkgICAgICAgZHJ2LT5kZXZfbmFtZSwKIAkJCSAgICAgICBkcnYtPnR0eV9kcml2ZXItPm5hbWVfYmFzZSArIHBvcnQtPmxpbmUpOwpAQCAtMjE1Niw3ICsyMTU2LDcgQEAKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICIlcyVzJXMlZCBhdCAlcyAoaXJxID0gJWQpIGlzIGEgJXNcbiIsCi0JICAgICAgIHBvcnQtPmRldiA/IHBvcnQtPmRldi0+YnVzX2lkIDogIiIsCisJICAgICAgIHBvcnQtPmRldiA/IGRldl9uYW1lKHBvcnQtPmRldikgOiAiIiwKIAkgICAgICAgcG9ydC0+ZGV2ID8gIjogIiA6ICIiLAogCSAgICAgICBkcnYtPmRldl9uYW1lLAogCSAgICAgICBkcnYtPnR0eV9kcml2ZXItPm5hbWVfYmFzZSArIHBvcnQtPmxpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCBiOWQwZWZiLi40YTZmZTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTc4LDcgKzc4LDcgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGF1MTU1MF9zcGkuCiAKIGNvbmZpZyBTUElfQklUQkFORwotCXRyaXN0YXRlICJCaXRiYW5naW5nIFNQSSBtYXN0ZXIiCisJdHJpc3RhdGUgIlV0aWxpdGllcyBmb3IgQml0YmFuZ2luZyBTUEkgbWFzdGVycyIKIAloZWxwCiAJICBXaXRoIGEgZmV3IEdQSU8gcGlucywgeW91ciBzeXN0ZW0gY2FuIGJpdGJhbmcgdGhlIFNQSSBwcm90b2NvbC4KIAkgIFNlbGVjdCB0aGlzIHRvIGdldCBTUEkgc3VwcG9ydCB0aHJvdWdoIEkvTyBwaW5zIChHUElPLCBwYXJhbGxlbApAQCAtMTAwLDYgKzEwMCwyMiBAQAogCSAgaW5leHBlbnNpdmUgYmF0dGVyeSBwb3dlcmVkIG1pY3JvY29udHJvbGxlciBldmFsdWF0aW9uIGJvYXJkLgogCSAgVGhpcyBzYW1lIGNhYmxlIGNhbiBiZSB1c2VkIHRvIGZsYXNoIG5ldyBmaXJtd2FyZS4KIAorY29uZmlnIFNQSV9HUElPCisJdHJpc3RhdGUgIkdQSU8tYmFzZWQgYml0YmFuZ2luZyBTUEkgTWFzdGVyIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyBzaW1wbGUgR1BJTyBiaXRiYW5naW5nIFNQSSBtYXN0ZXIgdXNlcyB0aGUgYXJjaC1uZXV0cmFsIEdQSU8KKwkgIGludGVyZmFjZSB0byBtYW5hZ2UgTU9TSSwgTUlTTywgU0NLLCBhbmQgY2hpcHNlbGVjdCBzaWduYWxzLiAgU1BJCisJICBzbGF2ZXMgY29ubmVjdGVkIHRvIGEgYnVzIHVzaW5nIHRoaXMgZHJpdmVyIGFyZSBjb25maWd1cmVkIGFzIHVzdWFsLAorCSAgZXhjZXB0IHRoYXQgdGhlIHNwaV9ib2FyZF9pbmZvLmNvbnRyb2xsZXJfZGF0YSBob2xkcyB0aGUgR1BJTyBudW1iZXIKKwkgIGZvciB0aGUgY2hpcHNlbGVjdCB1c2VkIGJ5IHRoaXMgY29udHJvbGxlciBkcml2ZXIuCisKKwkgIE5vdGUgdGhhdCB0aGlzIGRyaXZlciBvZnRlbiB3b24ndCBhY2hpZXZlIGV2ZW4gMSBNYml0L3NlYyBzcGVlZHMsCisJICBtYWtpbmcgaXQgdW51c3VhbGx5IHNsb3cgZm9yIFNQSS4gIElmIHlvdXIgcGxhdGZvcm0gY2FuIGlubGluZQorCSAgR1BJTyBvcGVyYXRpb25zLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbGV2ZXJhZ2UgdGhhdCBmb3IgYmV0dGVyCisJICBzcGVlZCB3aXRoIGEgY3VzdG9tIHZlcnNpb24gb2YgdGhpcyBkcml2ZXI7IHNlZSB0aGUgc291cmNlIGNvZGUuCisKIGNvbmZpZyBTUElfSU1YCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpTVggU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0lNWCAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggY2NmMThkZS4uNWU5ZjUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIG9iai0kKENPTkZJR19TUElfQklUQkFORykJCSs9IHNwaV9iaXRiYW5nLm8KIG9iai0kKENPTkZJR19TUElfQVUxNTUwKQkJKz0gYXUxNTUwX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX0JVVFRFUkZMWSkJCSs9IHNwaV9idXR0ZXJmbHkubworb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaV9ncGlvLm8KIG9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaV9pbXgubwogb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaV9sbTcwbGxwLm8KIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCmluZGV4IDhhYmFlNGEuLjVlMzliYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCkBAIC0zMCwxMyArMzAsNiBAQAogICogVGhlIGNvcmUgU1BJIHRyYW5zZmVyIGVuZ2luZSBqdXN0IHRhbGtzIHRvIGEgcmVnaXN0ZXIgYmFuayB0byBzZXQgdXAKICAqIERNQSB0cmFuc2ZlcnM7IHRyYW5zZmVyIHF1ZXVlIHByb2dyZXNzIGlzIGRyaXZlbiBieSBJUlFzLiAgVGhlIGNsb2NrCiAgKiBmcmFtZXdvcmsgcHJvdmlkZXMgdGhlIGJhc2UgY2xvY2ssIHN1YmRpdmlkZWQgZm9yIGVhY2ggc3BpX2RldmljZS4KLSAqCi0gKiBOZXdlciBjb250cm9sbGVycywgbWFya2VkIHdpdGggIm5ld18xIiBmbGFnLCBoYXZlOgotICogIC0gQ1IuTEFTVFhGRVIKLSAqICAtIFNQSV9NUi5ESVYzMiBtYXkgYmVjb21lIEZESVYgb3IgbXVzdC1iZS16ZXJvIChoZXJlOiBhbHdheXMgemVybykKLSAqICAtIFNQSV9TUi5UWEVNUFRZLCBTUElfU1IuTlNTUiAoYW5kIGNvcnJlc3BvbmRpbmcgaXJxcykKLSAqICAtIFNQSV9DU1J4LkNTQUFUCi0gKiAgLSBTUElfQ1NSeC5TQkNSIGFsbG93cyBmYXN0ZXIgY2xvY2tpbmcKICAqLwogc3RydWN0IGF0bWVsX3NwaSB7CiAJc3BpbmxvY2tfdAkJbG9jazsKQEAgLTQ1LDcgKzM4LDYgQEAKIAlpbnQJCQlpcnE7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwotCXVuc2lnbmVkCQluZXdfMToxOwogCXN0cnVjdCBzcGlfZGV2aWNlCSpzdGF5OwogCiAJdTgJCQlzdG9wcGluZzsKQEAgLTU5LDEwICs1MSwzMyBAQAogCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CiB9OwogCisvKiBDb250cm9sbGVyLXNwZWNpZmljIHBlci1zbGF2ZSBzdGF0ZSAqLworc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgeworCXVuc2lnbmVkIGludAkJbnBjc19waW47CisJdTMyCQkJY3NyOworfTsKKwogI2RlZmluZSBCVUZGRVJfU0laRQkJUEFHRV9TSVpFCiAjZGVmaW5lIElOVkFMSURfRE1BX0FERFJFU1MJMHhmZmZmZmZmZgogCiAvKgorICogVmVyc2lvbiAyIG9mIHRoZSBTUEkgY29udHJvbGxlciBoYXMKKyAqICAtIENSLkxBU1RYRkVSCisgKiAgLSBTUElfTVIuRElWMzIgbWF5IGJlY29tZSBGRElWIG9yIG11c3QtYmUtemVybyAoaGVyZTogYWx3YXlzIHplcm8pCisgKiAgLSBTUElfU1IuVFhFTVBUWSwgU1BJX1NSLk5TU1IgKGFuZCBjb3JyZXNwb25kaW5nIGlycXMpCisgKiAgLSBTUElfQ1NSeC5DU0FBVAorICogIC0gU1BJX0NTUnguU0JDUiBhbGxvd3MgZmFzdGVyIGNsb2NraW5nCisgKgorICogV2UgY2FuIGRldGVybWluZSB0aGUgY29udHJvbGxlciB2ZXJzaW9uIGJ5IHJlYWRpbmcgdGhlIFZFUlNJT04KKyAqIHJlZ2lzdGVyLCBidXQgSSBoYXZlbid0IGNoZWNrZWQgdGhhdCBpdCBleGlzdHMgb24gYWxsIGNoaXBzLCBhbmQKKyAqIHRoaXMgaXMgY2hlYXBlciBhbnl3YXkuCisgKi8KK3N0YXRpYyBib29sIGF0bWVsX3NwaV9pc192Mih2b2lkKQoreworCXJldHVybiAhY3B1X2lzX2F0OTFybTkyMDAoKTsKK30KKworLyoKICAqIEVhcmxpZXIgU1BJIGNvbnRyb2xsZXJzIChlLmcuIG9uIGF0OTFybTkyMDApIGhhdmUgYSBkZXNpZ24gYnVnIHdoZXJlYnkKICAqIHRoZXkgYXNzdW1lIHRoYXQgc3BpIHNsYXZlIGRldmljZSBzdGF0ZSB3aWxsIG5vdCBjaGFuZ2Ugb24gZGVzZWxlY3QsIHNvCiAgKiB0aGF0IGF1dG9tYWdpYyBkZXNlbGVjdGlvbiBpcyBPSy4gICgiTlBDU3ggcmlzZXMgaWYgbm8gZGF0YSBpcyB0byBiZQpAQCAtODAsMzkgKzk1LDU4IEBACiAgKiBNYXN0ZXIgb24gQ2hpcCBTZWxlY3QgMC4iKSAgTm8gd29ya2Fyb3VuZCBleGlzdHMgZm9yIHRoYXQgLi4uIHNvIGZvcgogICogbkNTMCBvbiB0aGF0IGNoaXAsIHdlIChhKSBkb24ndCB1c2UgdGhlIEdQSU8sIChiKSBjYW4ndCBzdXBwb3J0IENTX0hJR0gsCiAgKiBhbmQgKGMpIHdpbGwgdHJpZ2dlciB0aGF0IGZpcnN0IGVycmF0dW0gaW4gc29tZSBjYXNlcy4KKyAqCisgKiBUT0RPOiBUZXN0IGlmIHRoZSBhdG1lbF9zcGlfaXNfdjIoKSBicmFuY2ggYmVsb3cgd29ya3Mgb24KKyAqIEFUOTFSTTkyMDAgaWYgd2UgdXNlIHNvbWUgb3RoZXIgcmVnaXN0ZXIgdGhhbiBDU1IwLiBIb3dldmVyLCBkb24ndAorICogZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkgc2luY2UgQVA3MDAwIGhhcyBhbiBlcnJhdGEgd2hlcmUgdGhlIEJJVFMKKyAqIGZpZWxkIGluIENTUjAgb3ZlcnJpZGVzIGFsbCBvdGhlciBDU1JzLgogICovCiAKIHN0YXRpYyB2b2lkIGNzX2FjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXVuc2lnbmVkIGdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlICphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CiAJdTMyIG1yOwotCWludCBpOwotCXUzMiBjc3I7Ci0JdTMyIGNwb2wgPSAoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gU1BJX0JJVChDUE9MKSA6IDA7CiAKLQkvKiBNYWtlIHN1cmUgY2xvY2sgcG9sYXJpdHkgaXMgY29ycmVjdCAqLwotCWZvciAoaSA9IDA7IGkgPCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgewotCQljc3IgPSBzcGlfcmVhZGwoYXMsIENTUjAgKyA0ICogaSk7Ci0JCWlmICgoY3NyIF4gY3BvbCkgJiBTUElfQklUKENQT0wpKQotCQkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBpLCBjc3IgXiBTUElfQklUKENQT0wpKTsKKwlpZiAoYXRtZWxfc3BpX2lzX3YyKCkpIHsKKwkJLyoKKwkJICogQWx3YXlzIHVzZSBDU1IwLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY2xvY2sKKwkJICogc3dpdGNoZXMgdG8gdGhlIGNvcnJlY3QgaWRsZSBwb2xhcml0eSBiZWZvcmUgd2UKKwkJICogdG9nZ2xlIHRoZSBDUy4KKwkJICovCisJCXNwaV93cml0ZWwoYXMsIENTUjAsIGFzZC0+Y3NyKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIFNQSV9CRihQQ1MsIDB4MGUpIHwgU1BJX0JJVChNT0RGRElTKQorCQkJCXwgU1BJX0JJVChNU1RSKSk7CisJCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJCWdwaW9fc2V0X3ZhbHVlKGFzZC0+bnBjc19waW4sIGFjdGl2ZSk7CisJfSBlbHNlIHsKKwkJdTMyIGNwb2wgPSAoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gU1BJX0JJVChDUE9MKSA6IDA7CisJCWludCBpOworCQl1MzIgY3NyOworCisJCS8qIE1ha2Ugc3VyZSBjbG9jayBwb2xhcml0eSBpcyBjb3JyZWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBzcGktPm1hc3Rlci0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQkJY3NyID0gc3BpX3JlYWRsKGFzLCBDU1IwICsgNCAqIGkpOworCQkJaWYgKChjc3IgXiBjcG9sKSAmIFNQSV9CSVQoQ1BPTCkpCisJCQkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBpLAorCQkJCQkJY3NyIF4gU1BJX0JJVChDUE9MKSk7CisJCX0KKworCQltciA9IHNwaV9yZWFkbChhcywgTVIpOworCQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSwgbXIpOworCQlpZiAoc3BpLT5jaGlwX3NlbGVjdCAhPSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgYWN0aXZlKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKIAl9CiAKLQltciA9IHNwaV9yZWFkbChhcywgTVIpOwotCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7Ci0KIAlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCi0JCQlncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKKwkJCWFzZC0+bnBjc19waW4sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiLAogCQkJbXIpOwotCi0JaWYgKCEoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDApKQotCQlncGlvX3NldF92YWx1ZShncGlvLCBhY3RpdmUpOwotCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CiB9CiAKIHN0YXRpYyB2b2lkIGNzX2RlYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UgKmFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKIAl1MzIgbXI7CiAKQEAgLTEyNiwxMSArMTYwLDExIEBACiAJfQogCiAJZGV2X2RiZygmc3BpLT5kZXYsICJERWFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCi0JCQlncGlvLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiLAorCQkJYXNkLT5ucGNzX3BpbiwgYWN0aXZlID8gIiAobG93KSIgOiAiIiwKIAkJCW1yKTsKIAotCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKLQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIWFjdGl2ZSk7CisJaWYgKGF0bWVsX3NwaV9pc192MigpIHx8IHNwaS0+Y2hpcF9zZWxlY3QgIT0gMCkKKwkJZ3Bpb19zZXRfdmFsdWUoYXNkLT5ucGNzX3BpbiwgIWFjdGl2ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF0bWVsX3NwaV94ZmVyX2lzX2xhc3Qoc3RydWN0IHNwaV9tZXNzYWdlICptc2csCkBAIC01MDIsNiArNTM2LDcgQEAKIHN0YXRpYyBpbnQgYXRtZWxfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGF0bWVsX3NwaQkqYXM7CisJc3RydWN0IGF0bWVsX3NwaV9kZXZpY2UJKmFzZDsKIAl1MzIJCQlzY2JyLCBjc3I7CiAJdW5zaWduZWQgaW50CQliaXRzID0gc3BpLT5iaXRzX3Blcl93b3JkOwogCXVuc2lnbmVkIGxvbmcJCWJ1c19oejsKQEAgLTUzNiwxOSArNTcxLDE2IEBACiAJfQogCiAJLyogc2VlIG5vdGVzIGFib3ZlIHJlIGNoaXBzZWxlY3QgKi8KLQlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKQorCWlmICghYXRtZWxfc3BpX2lzX3YyKCkKIAkJCSYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMAogCQkJJiYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkgewogCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBjYW4ndCBiZSBhY3RpdmUtaGlnaFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qCi0JICogUHJlLW5ld18xIGNoaXBzIHN0YXJ0IG91dCBhdCBoYWxmIHRoZSBwZXJpcGhlcmFsCi0JICogYnVzIHNwZWVkLgotCSAqLworCS8qIHYxIGNoaXBzIHN0YXJ0IG91dCBhdCBoYWxmIHRoZSBwZXJpcGhlcmFsIGJ1cyBzcGVlZC4gKi8KIAlidXNfaHogPSBjbGtfZ2V0X3JhdGUoYXMtPmNsayk7Ci0JaWYgKCFhcy0+bmV3XzEpCisJaWYgKCFhdG1lbF9zcGlfaXNfdjIoKSkKIAkJYnVzX2h6IC89IDI7CiAKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKQEAgLTU4OSwxMSArNjIxLDIwIEBACiAKIAkvKiBjaGlwc2VsZWN0IG11c3QgaGF2ZSBiZWVuIG11eGVkIGFzIEdQSU8gKGUuZy4gaW4gYm9hcmQgc2V0dXApICovCiAJbnBjc19waW4gPSAodW5zaWduZWQgaW50KXNwaS0+Y29udHJvbGxlcl9kYXRhOwotCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKSB7CisJYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCWlmICghYXNkKSB7CisJCWFzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYXNkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0KG5wY3NfcGluLCBzcGktPmRldi5idXNfaWQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlrZnJlZShhc2QpOwogCQkJcmV0dXJuIHJldDsKLQkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gKHZvaWQgKilucGNzX3BpbjsKKwkJfQorCisJCWFzZC0+bnBjc19waW4gPSBucGNzX3BpbjsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gYXNkOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobnBjc19waW4sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKQEAgLTYwNSwxMSArNjQ2LDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAJfQogCisJYXNkLT5jc3IgPSBjc3I7CisKIAlkZXZfZGJnKCZzcGktPmRldiwKIAkJInNldHVwOiAlbHUgSHogYnB3ICV1IG1vZGUgMHgleCAtPiBjc3IlZCAlMDh4XG4iLAogCQlidXNfaHogLyBzY2JyLCBiaXRzLCBzcGktPm1vZGUsIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CiAKLQlzcGlfd3JpdGVsKGFzLCBDU1IwICsgNCAqIHNwaS0+Y2hpcF9zZWxlY3QsIGNzcik7CisJaWYgKCFhdG1lbF9zcGlfaXNfdjIoKSkKKwkJc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBzcGktPmNoaXBfc2VsZWN0LCBjc3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODQsMTAgKzcyOCwxMSBAQAogc3RhdGljIHZvaWQgYXRtZWxfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlCSphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQJCWdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCi0JaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCisJaWYgKCFhc2QpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhcy0+bG9jaywgZmxhZ3MpOwpAQCAtNjk3LDcgKzc0Miw5IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAKKwlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBOVUxMOwogCWdwaW9fZnJlZShncGlvKTsKKwlrZnJlZShhc2QpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzU1LDggKzgwMiw2IEBACiAJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyOwogCWFzLT5pcnEgPSBpcnE7CiAJYXMtPmNsayA9IGNsazsKLQlpZiAoIWNwdV9pc19hdDkxcm05MjAwKCkpCi0JCWFzLT5uZXdfMSA9IDE7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0bWVsX3NwaV9pbnRlcnJ1cHQsIDAsCiAJCQlwZGV2LT5kZXYuYnVzX2lkLCBtYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDYxMDRmNDYuLmQwZmM0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTE1NjEsMTEgKzE1NjEsMTIgQEAKIHN0YXRpYyBpbnQgcHhhMnh4X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHNzcF9kZXZpY2UgKnNzcCA9IGRydl9kYXRhLT5zc3A7CisJc3RydWN0IHNzcF9kZXZpY2UgKnNzcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCWlmICghZHJ2X2RhdGEpCiAJCXJldHVybiAwOworCXNzcCA9IGRydl9kYXRhLT5zc3A7CiAKIAkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCiAJc3RhdHVzID0gZGVzdHJveV9xdWV1ZShkcnZfZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IDM3MzRkYzkuLjY0MzkwOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIEJVU19JRF9TSVpFICsgMSwgIiVzXG4iLCBzcGktPm1vZGFsaWFzKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpLT5tb2RhbGlhcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcGlfZGV2X2F0dHJzW10gPSB7CkBAIC02Myw3ICs2Myw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBzdHJuY21wKHNwaS0+bW9kYWxpYXMsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDA7CisJcmV0dXJuIHN0cmNtcChzcGktPm1vZGFsaWFzLCBkcnYtPm5hbWUpID09IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3BpX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKQEAgLTI0Myw4ICsyNDMsNyBAQAogCX0KIAogCS8qIFNldCB0aGUgYnVzIElEIHN0cmluZyAqLwotCXNucHJpbnRmKHNwaS0+ZGV2LmJ1c19pZCwgc2l6ZW9mIHNwaS0+ZGV2LmJ1c19pZCwKLQkJCSIlcy4ldSIsIHNwaS0+bWFzdGVyLT5kZXYuYnVzX2lkLAorCWRldl9zZXRfbmFtZSgmc3BpLT5kZXYsICIlcy4ldSIsIGRldl9uYW1lKCZzcGktPm1hc3Rlci0+ZGV2KSwKIAkJCXNwaS0+Y2hpcF9zZWxlY3QpOwogCiAKQEAgLTI1NCw3ICsyNTMsNyBAQAogCSAqLwogCW11dGV4X2xvY2soJnNwaV9hZGRfbG9jayk7CiAKLQlpZiAoYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnNwaV9idXNfdHlwZSwgTlVMTCwgc3BpLT5kZXYuYnVzX2lkKQorCWlmIChidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmc3BpX2J1c190eXBlLCBOVUxMLCBkZXZfbmFtZSgmc3BpLT5kZXYpKQogCQkJIT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgImNoaXBzZWxlY3QgJWQgYWxyZWFkeSBpbiB1c2VcbiIsCiAJCQkJc3BpLT5jaGlwX3NlbGVjdCk7CkBAIC0yNjksNyArMjY4LDcgQEAKIAlzdGF0dXMgPSBzcGktPm1hc3Rlci0+c2V0dXAoc3BpKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0ICVzICVzLCBzdGF0dXMgJWRcbiIsCi0JCQkJInNldHVwIiwgc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCSJzZXR1cCIsIGRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTI3Nyw5ICsyNzYsOSBAQAogCXN0YXR1cyA9IGRldmljZV9hZGQoJnNwaS0+ZGV2KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZGV2X2VycihkZXYsICJjYW4ndCAlcyAlcywgc3RhdHVzICVkXG4iLAotCQkJCSJhZGQiLCBzcGktPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCQkJImFkZCIsIGRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyk7CiAJZWxzZQotCQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgY2hpbGQgJXNcbiIsIHNwaS0+ZGV2LmJ1c19pZCk7CisJCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBjaGlsZCAlc1xuIiwgZGV2X25hbWUoJnNwaS0+ZGV2KSk7CiAKIGRvbmU6CiAJbXV0ZXhfdW5sb2NrKCZzcGlfYWRkX2xvY2spOwpAQCAtNTA0LDEyICs1MDMsMTEgQEAKIAkvKiByZWdpc3RlciB0aGUgZGV2aWNlLCB0aGVuIHVzZXJzcGFjZSB3aWxsIHNlZSBpdC4KIAkgKiByZWdpc3RyYXRpb24gZmFpbHMgaWYgdGhlIGJ1cyBJRCBpcyBpbiB1c2UuCiAJICovCi0Jc25wcmludGYobWFzdGVyLT5kZXYuYnVzX2lkLCBzaXplb2YgbWFzdGVyLT5kZXYuYnVzX2lkLAotCQkic3BpJXUiLCBtYXN0ZXItPmJ1c19udW0pOworCWRldl9zZXRfbmFtZSgmbWFzdGVyLT5kZXYsICJzcGkldSIsIG1hc3Rlci0+YnVzX251bSk7CiAJc3RhdHVzID0gZGV2aWNlX2FkZCgmbWFzdGVyLT5kZXYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIGRvbmU7Ci0JZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIG1hc3RlciAlcyVzXG4iLCBtYXN0ZXItPmRldi5idXNfaWQsCisJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIG1hc3RlciAlcyVzXG4iLCBkZXZfbmFtZSgmbWFzdGVyLT5kZXYpLAogCQkJZHluYW1pYyA/ICIgKGR5bmFtaWMpIiA6ICIiKTsKIAogCS8qIHBvcHVsYXRlIGNoaWxkcmVuIGZyb20gYW55IHNwaSBkZXZpY2UgdGFibGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwppbmRleCA5NmNjMzllLi44NWU2MWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCS8qIHRoaXMgdGFzayBpcyB0aGUgb25seSB0aGluZyB0byB0b3VjaCB0aGUgU1BJIGJpdHMgKi8KIAliaXRiYW5nLT5idXN5ID0gMDsKIAliaXRiYW5nLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCWJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudC0+YnVzX2lkKTsKKwkJCWRldl9uYW1lKGJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudCkpOwogCWlmIChiaXRiYW5nLT53b3JrcXVldWUgPT0gTlVMTCkgewogCQlzdGF0dXMgPSAtRUJVU1k7CiAJCWdvdG8gZXJyMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwppbmRleCAwZWUyYjIwLi5jMjE4NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCkBAIC0yODcsNyArMjg3LDcgQEAKIAlwcC0+ZGF0YWZsYXNoID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm9bMF0pOwogCWlmIChwcC0+ZGF0YWZsYXNoKQogCQlwcl9kZWJ1ZygiJXM6IGRhdGFmbGFzaCBhdCAlc1xuIiwgcC0+bmFtZSwKLQkJCQlwcC0+ZGF0YWZsYXNoLT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmcHAtPmRhdGFmbGFzaC0+ZGV2KSk7CiAKIAkvLyBkZXZfaW5mbyhfd2hhdD9fLCAuLi4pCiAJcHJfaW5mbygiJXM6IEFWUiBCdXR0ZXJmbHlcbiIsIHAtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2dwaW8uYyBiL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2OThjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBzcGlfZ3Bpby5jIC0gU1BJIG1hc3RlciBkcml2ZXIgdXNpbmcgZ2VuZXJpYyBiaXRiYW5nZWQgR1BJTworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwyMDA4IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfZ3Bpby5oPgorCisKKy8qCisgKiBUaGlzIGJpdGJhbmdpbmcgU1BJIG1hc3RlciBkcml2ZXIgc2hvdWxkIGhlbHAgbWFrZSBzeXN0ZW1zIHVzYWJsZQorICogd2hlbiBhIG5hdGl2ZSBoYXJkd2FyZSBTUEkgZW5naW5lIGlzIG5vdCBhdmFpbGFibGUsIHBlcmhhcHMgYmVjYXVzZQorICogaXRzIGRyaXZlciBpc24ndCB5ZXQgd29ya2luZyBvciBiZWNhdXNlIHRoZSBJL08gcGlucyBpdCByZXF1aXJlcworICogYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLgorICoKKyAqIHBsYXRmb3JtX2RldmljZS0+ZHJpdmVyX2RhdGEgLi4uIHBvaW50cyB0byBzcGlfZ3BpbworICoKKyAqIHNwaS0+Y29udHJvbGxlcl9zdGF0ZSAuLi4gcmVzZXJ2ZWQgZm9yIGJpdGJhbmcgZnJhbWV3b3JrIGNvZGUKKyAqIHNwaS0+Y29udHJvbGxlcl9kYXRhIC4uLiBob2xkcyBjaGlwc2VsZWN0IEdQSU8KKyAqCisgKiBzcGktPm1hc3Rlci0+ZGV2LmRyaXZlcl9kYXRhIC4uLiBwb2ludHMgdG8gc3BpX2dwaW8tPmJpdGJhbmcKKyAqLworCitzdHJ1Y3Qgc3BpX2dwaW8geworCXN0cnVjdCBzcGlfYml0YmFuZwkJYml0YmFuZzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQlwZGF0YTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBCZWNhdXNlIHRoZSBvdmVyaGVhZCBvZiBnb2luZyB0aHJvdWdoIGZvdXIgR1BJTyBwcm9jZWR1cmUgY2FsbHMKKyAqIHBlciB0cmFuc2ZlcnJlZCBiaXQgY2FuIG1ha2UgcGVyZm9ybWFuY2UgYSBwcm9ibGVtLCB0aGlzIGNvZGUKKyAqIGlzIHNldCB1cCBzbyB0aGF0IHlvdSBjYW4gdXNlIGl0IGluIGVpdGhlciBvZiB0d28gd2F5czoKKyAqCisgKiAgIC0gVGhlIHNsb3cgZ2VuZXJpYyB3YXk6ICBzZXQgdXAgcGxhdGZvcm1fZGF0YSB0byBob2xkIHRoZSBHUElPCisgKiAgICAgbnVtYmVycyB1c2VkIGZvciBNSVNPL01PU0kvU0NLLCBhbmQgaXNzdWUgcHJvY2VkdXJlIGNhbGxzIGZvcgorICogICAgIGVhY2ggb2YgdGhlbS4gIFRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgc2V2ZXJhbCBzdWNoIGJ1c3Nlcy4KKyAqCisgKiAgIC0gVGhlIHF1aWNrZXIgaW5saW5lZCB3YXk6ICBvbmx5IGhlbHBzIHdpdGggcGxhdGZvcm0gR1BJTyBjb2RlCisgKiAgICAgdGhhdCBpbmxpbmVzIG9wZXJhdGlvbnMgZm9yIGNvbnN0YW50IEdQSU9zLiAgVGhpcyBjYW4gZ2l2ZQorICogICAgIHlvdSB0aWdodCAoZmFzdCEpIGlubmVyIGxvb3BzLCBidXQgZWFjaCBzdWNoIGJ1cyBuZWVkcyBhCisgKiAgICAgbmV3IGRyaXZlci4gIFlvdSdsbCBkZWZpbmUgYSBuZXcgQyBmaWxlLCB3aXRoIE1ha2VmaWxlIGFuZAorICogICAgIEtjb25maWcgc3VwcG9ydDsgdGhlIEMgY29kZSBjYW4gYmUgYSB0b3RhbCBvZiBzaXggbGluZXM6CisgKgorICoJCSNkZWZpbmUgRFJJVkVSX05BTUUJIm15Ym9hcmRfc3BpMiIKKyAqCQkjZGVmaW5lCVNQSV9NSVNPX0dQSU8JMTE5CisgKgkJI2RlZmluZQlTUElfTU9TSV9HUElPCTEyMAorICoJCSNkZWZpbmUJU1BJX1NDS19HUElPCTEyMQorICoJCSNkZWZpbmUJU1BJX05fQ0hJUFNFTAk0CisgKgkJI2luY2x1ZGUgInNwaV9ncGlvLmMiCisgKi8KKworI2lmbmRlZiBEUklWRVJfTkFNRQorI2RlZmluZSBEUklWRVJfTkFNRQkic3BpX2dwaW8iCisKKyNkZWZpbmUgR0VORVJJQ19CSVRCQU5HCS8qIHZzIHRpZ2h0IGlubGluZXMgKi8KKworLyogYWxsIGZ1bmN0aW9ucyByZWZlcmVuY2luZyB0aGVzZSBzeW1ib2xzIG11c3QgZGVmaW5lIHBkYXRhICovCisjZGVmaW5lIFNQSV9NSVNPX0dQSU8JKChwZGF0YSktPm1pc28pCisjZGVmaW5lIFNQSV9NT1NJX0dQSU8JKChwZGF0YSktPm1vc2kpCisjZGVmaW5lIFNQSV9TQ0tfR1BJTwkoKHBkYXRhKS0+c2NrKQorCisjZGVmaW5lIFNQSV9OX0NISVBTRUwJKChwZGF0YSktPm51bV9jaGlwc2VsZWN0KQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAqIF9fcHVyZQorc3BpX3RvX3BkYXRhKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJY29uc3Qgc3RydWN0IHNwaV9iaXRiYW5nCSpiYW5nOworCWNvbnN0IHN0cnVjdCBzcGlfZ3BpbwkJKnNwaV9ncGlvOworCisJYmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXNwaV9ncGlvID0gY29udGFpbmVyX29mKGJhbmcsIHN0cnVjdCBzcGlfZ3BpbywgYml0YmFuZyk7CisJcmV0dXJuICZzcGlfZ3Bpby0+cGRhdGE7Cit9CisKKy8qIHRoaXMgaXMgI2RlZmluZWQgdG8gYXZvaWQgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmdzIHdoZW4gaW5saW5pbmcgKi8KKyNkZWZpbmUgcGRhdGEJCXNwaV90b19wZGF0YShzcGkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRzY2soY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCWdwaW9fc2V0X3ZhbHVlKFNQSV9TQ0tfR1BJTywgaXNfb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0bW9zaShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfb24pCit7CisJZ3Bpb19zZXRfdmFsdWUoU1BJX01PU0lfR1BJTywgaXNfb24pOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKFNQSV9NSVNPX0dQSU8pOworfQorCisjdW5kZWYgcGRhdGEKKworLyoKKyAqIE5PVEU6ICB0aGlzIGNsb2NrcyAiYXMgZmFzdCBhcyB3ZSBjYW4iLiAgSXQgInNob3VsZCIgYmUgYSBmdW5jdGlvbiBvZiB0aGUKKyAqIHJlcXVlc3RlZCBkZXZpY2UgY2xvY2suICBTb2Z0d2FyZSBvdmVyaGVhZCBtZWFucyB3ZSB1c3VhbGx5IGhhdmUgdHJvdWJsZQorICogcmVhY2hpbmcgZXZlbiBvbmUgTWJpdC9zZWMgKGV4Y2VwdCB3aGVuIHdlIGNhbiBpbmxpbmUgYml0b3BzKSwgc28gZm9yIG5vdworICogd2UnbGwganVzdCBhc3N1bWUgd2UgbmV2ZXIgbmVlZCBhZGRpdGlvbmFsIHBlci1iaXQgc2xvd2Rvd25zLgorICovCisjZGVmaW5lIHNwaWRlbGF5KG5zZWNzKQlkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZQlFWFBBTkRfQklUQkFOR19UWFJYCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGxldmVyYWdlIGlubGluZSBleHBhbnNpb24gb2YgR1BJTyBjYWxscyB0byBzaHJpbmsKKyAqIGNvc3RzIGZvciBhIHR4cnggYml0LCBvZnRlbiBieSBmYWN0b3JzIG9mIGFyb3VuZCB0ZW4gKGJ5IGluc3RydWN0aW9uCisgKiBjb3VudCkuICBUaGF0IGlzIHBhcnRpY3VsYXJseSB2aXNpYmxlIGZvciBsYXJnZXIgd29yZCBzaXplcywgYnV0IGhlbHBzCisgKiBldmVuIHdpdGggZGVmYXVsdCA4LWJpdCB3b3Jkcy4KKyAqCisgKiBSRVZJU0lUIG92ZXJoZWFkcyBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBmb3IgZWFjaCB3b3JkIGFsc28gaGF2ZQorICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgY29zdHMuICBIYXZpbmcgdHhyeF9idWZzKCkgY2FsbHMgdGhhdCBpbmxpbmUKKyAqIHRoZSB0eHJ4X3dvcmQoKSBsb2dpYyB3b3VsZCBoZWxwIHBlcmZvcm1hbmNlLCBlLmcuIG9uIGxhcmdlciBibG9ja3MKKyAqIHVzZWQgd2l0aCBmbGFzaCBzdG9yYWdlIG9yIE1NQy9TRC4gIFRoZXJlIHNob3VsZCBhbHNvIGJlIHdheXMgdG8gbWFrZQorICogR0NDIGJlIGxlc3Mgc3R1cGlkIGFib3V0IHJlbG9hZGluZyByZWdpc3RlcnMgaW5zaWRlIHRoZSBJL08gbG9vcHMsCisgKiBldmVuIHdpdGhvdXQgaW5saW5lZCBHUElPIGNhbGxzOyBfX2F0dHJpYnV0ZV9fKChob3QpKSBvbiBHQ0MgNC4zPworICovCisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMSwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGExKHNwaSwgbnNlY3MsIDEsIHdvcmQsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzcGlfZ3Bpb19jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19hY3RpdmUpCit7CisJdW5zaWduZWQgbG9uZyBjcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCS8qIHNldCBpbml0aWFsIGNsb2NrIHBvbGFyaXR5ICovCisJaWYgKGlzX2FjdGl2ZSkKKwkJc2V0c2NrKHNwaSwgc3BpLT5tb2RlICYgU1BJX0NQT0wpOworCisJLyogU1BJIGlzIG5vcm1hbGx5IGFjdGl2ZS1sb3cgKi8KKwlncGlvX3NldF92YWx1ZShjcywgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IGlzX2FjdGl2ZSA6ICFpc19hY3RpdmUpOworfQorCitzdGF0aWMgaW50IHNwaV9ncGlvX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlpbnQJCXN0YXR1cyA9IDA7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID4gMzIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpIHsKKwkJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGNzLCBzcGktPmRldi5idXNfaWQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNzLCBzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7CisJfQorCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBzcGlfYml0YmFuZ19zZXR1cChzcGkpOworCWlmIChzdGF0dXMpIHsKKwkJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCisJCQlncGlvX2ZyZWUoY3MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzcGlfZ3Bpb19jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJdW5zaWduZWQgbG9uZwljcyA9ICh1bnNpZ25lZCBsb25nKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKworCWdwaW9fZnJlZShjcyk7CisJc3BpX2JpdGJhbmdfY2xlYW51cChzcGkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19hbGxvYyh1bnNpZ25lZCBwaW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBib29sIGlzX2luKQoreworCWludCB2YWx1ZTsKKworCXZhbHVlID0gZ3Bpb19yZXF1ZXN0KHBpbiwgbGFiZWwpOworCWlmICh2YWx1ZSA9PSAwKSB7CisJCWlmIChpc19pbikKKwkJCXZhbHVlID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGluKTsKKwkJZWxzZQorCQkJdmFsdWUgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluLCAwKTsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IF9faW5pdAorc3BpX2dwaW9fcmVxdWVzdChzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCWludCB2YWx1ZTsKKworCS8qIE5PVEU6ICBTUElfKl9HUElPIHN5bWJvbHMgbWF5IHJlZmVyZW5jZSAicGRhdGEiICovCisKKwl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NT1NJX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGRvbmU7CisKKwl2YWx1ZSA9IHNwaV9ncGlvX2FsbG9jKFNQSV9NSVNPX0dQSU8sIGxhYmVsLCB0cnVlKTsKKwlpZiAodmFsdWUpCisJCWdvdG8gZnJlZV9tb3NpOworCisJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfU0NLX0dQSU8sIGxhYmVsLCBmYWxzZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGZyZWVfbWlzbzsKKworCWdvdG8gZG9uZTsKKworZnJlZV9taXNvOgorCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKK2ZyZWVfbW9zaToKKwlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7Citkb25lOgorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQJCQkJc3RhdHVzOworCXN0cnVjdCBzcGlfbWFzdGVyCQkqbWFzdGVyOworCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworI2lmZGVmIEdFTkVSSUNfQklUQkFORworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5udW1fY2hpcHNlbGVjdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKworCXN0YXR1cyA9IHNwaV9ncGlvX3JlcXVlc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICpzcGlfZ3Bpbyk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBncGlvX2ZyZWU7CisJfQorCXNwaV9ncGlvID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNwaV9ncGlvKTsKKworCXNwaV9ncGlvLT5wZGV2ID0gcGRldjsKKwlpZiAocGRhdGEpCisJCXNwaV9ncGlvLT5wZGF0YSA9ICpwZGF0YTsKKworCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBTUElfTl9DSElQU0VMOworCW1hc3Rlci0+c2V0dXAgPSBzcGlfZ3Bpb19zZXR1cDsKKwltYXN0ZXItPmNsZWFudXAgPSBzcGlfZ3Bpb19jbGVhbnVwOworCisJc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gc3BpX2dwaW9fY2hpcHNlbGVjdDsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTA7CisJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzFdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUxOworCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8yXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMjsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfM10gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTM7CisJc3BpX2dwaW8tPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSBzcGlfYml0YmFuZ19zZXR1cF90cmFuc2ZlcjsKKwlzcGlfZ3Bpby0+Yml0YmFuZy5mbGFncyA9IFNQSV9DU19ISUdIOworCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RhcnQoJnNwaV9ncGlvLT5iaXRiYW5nKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOworZ3Bpb19mcmVlOgorCQlncGlvX2ZyZWUoU1BJX01JU09fR1BJTyk7CisJCWdwaW9fZnJlZShTUElfTU9TSV9HUElPKTsKKwkJZ3Bpb19mcmVlKFNQSV9TQ0tfR1BJTyk7CisJCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgc3BpX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9ncGlvCQkJKnNwaV9ncGlvOworCXN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwlpbnQJCQkJc3RhdHVzOworCisJc3BpX2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyogc3RvcCgpIHVucmVnaXN0ZXJzIGNoaWxkIGRldmljZXMgdG9vICovCisJc3RhdHVzID0gc3BpX2JpdGJhbmdfc3RvcCgmc3BpX2dwaW8tPmJpdGJhbmcpOworCXNwaV9tYXN0ZXJfcHV0KHNwaV9ncGlvLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWdwaW9fZnJlZShTUElfTUlTT19HUElPKTsKKwlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7CisJZ3Bpb19mcmVlKFNQSV9TQ0tfR1BJTyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGlfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlci5uYW1lCT0gRFJJVkVSX05BTUUsCisJLmRyaXZlci5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5yZW1vdmUJCT0gX19leGl0X3Aoc3BpX2dwaW9fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzcGlfZ3Bpb19kcml2ZXIsIHNwaV9ncGlvX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KHNwaV9ncGlvX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BpX2dwaW9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcGlfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc3BpX2dwaW9fZXhpdCk7CisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgbWFzdGVyIGRyaXZlciB1c2luZyBnZW5lcmljIGJpdGJhbmdlZCBHUElPICIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgQnJvd25lbGwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCmluZGV4IDM5ZDhkOGEuLmFmNjUyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOwogCWlmIChwcC0+c3BpZGV2X2xtNzApCiAJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCi0JCQkJcHAtPnNwaWRldl9sbTcwLT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmcHAtPnNwaWRldl9sbTcwLT5kZXYpKTsKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwaV9uZXdfZGV2aWNlIGZhaWxlZFxuIiwgRFJWTkFNRSk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCAyNTZkMTgzLi5iM2ViYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLXNwaS5oPgogI2luY2x1ZGUgPG1hY2gvc3BpLmg+CiAKQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIHZvaWQgczNjMjR4eF9zcGlfZ3Bpb2NzKHN0cnVjdCBzM2MyNDEwX3NwaV9pbmZvICpzcGksIGludCBjcywgaW50IHBvbCkKIHsKLQlzM2MyNDEwX2dwaW9fc2V0cGluKHNwaS0+cGluX2NzLCBwb2wpOworCWdwaW9fc2V0X3ZhbHVlKHNwaS0+cGluX2NzLCBwb2wpOwogfQogCiBzdGF0aWMgdm9pZCBzM2MyNHh4X3NwaV9jaGlwc2VsKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKQEAgLTI0OCw4ICsyNDgsMTMgQEAKIAl3cml0ZWIoU1BQSU5fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQUElOKTsKIAl3cml0ZWIoU1BDT05fREVGQVVMVCwgaHctPnJlZ3MgKyBTM0MyNDEwX1NQQ09OKTsKIAotCWlmIChody0+cGRhdGEgJiYgaHctPnBkYXRhLT5ncGlvX3NldHVwKQotCQlody0+cGRhdGEtPmdwaW9fc2V0dXAoaHctPnBkYXRhLCAxKTsKKwlpZiAoaHctPnBkYXRhKSB7CisJCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChody0+cGRhdGEtPnBpbl9jcywgMSk7CisKKwkJaWYgKGh3LT5wZGF0YS0+Z3Bpb19zZXR1cCkKKwkJCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOworCX0KIH0KIAogc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM0MywxOCArMzQ4LDI3IEBACiAJCWdvdG8gZXJyX25vX2NsazsKIAl9CiAKLQlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOwotCiAJLyogc2V0dXAgYW55IGdwaW8gd2UgY2FuICovCiAKIAlpZiAoIXBkYXRhLT5zZXRfY3MpIHsKLQkJaHctPnNldF9jcyA9IHMzYzI0eHhfc3BpX2dwaW9jczsKKwkJaWYgKHBkYXRhLT5waW5fY3MgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjaGlwc2VsZWN0IHBpblxuIik7CisJCQlnb3RvIGVycl9yZWdpc3RlcjsKKwkJfQogCi0JCXMzYzI0MTBfZ3Bpb19zZXRwaW4ocGRhdGEtPnBpbl9jcywgMSk7Ci0JCXMzYzI0MTBfZ3Bpb19jZmdwaW4ocGRhdGEtPnBpbl9jcywgUzNDMjQxMF9HUElPX09VVFBVVCk7CisJCWVyciA9IGdwaW9fcmVxdWVzdChwZGF0YS0+cGluX2NzLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgZ3BpbyBmb3IgY3NcbiIpOworCQkJZ290byBlcnJfcmVnaXN0ZXI7CisJCX0KKworCQlody0+c2V0X2NzID0gczNjMjR4eF9zcGlfZ3Bpb2NzOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnBpbl9jcywgMSk7CiAJfSBlbHNlCiAJCWh3LT5zZXRfY3MgPSBwZGF0YS0+c2V0X2NzOwogCisJczNjMjR4eF9zcGlfaW5pdGlhbHNldHVwKGh3KTsKKwogCS8qIHJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLwogCiAJZXJyID0gc3BpX2JpdGJhbmdfc3RhcnQoJmh3LT5iaXRiYW5nKTsKQEAgLTM2Niw2ICszODAsOSBAQAogCXJldHVybiAwOwogCiAgZXJyX3JlZ2lzdGVyOgorCWlmIChody0+c2V0X2NzID09IHMzYzI0eHhfc3BpX2dwaW9jcykKKwkJZ3Bpb19mcmVlKHBkYXRhLT5waW5fY3MpOworCiAJY2xrX2Rpc2FibGUoaHctPmNsayk7CiAJY2xrX3B1dChody0+Y2xrKTsKIApAQCAtNDAxLDYgKzQxOCw5IEBACiAJZnJlZV9pcnEoaHctPmlycSwgaHcpOwogCWlvdW5tYXAoaHctPnJlZ3MpOwogCisJaWYgKGh3LT5zZXRfY3MgPT0gczNjMjR4eF9zcGlfZ3Bpb2NzKQorCQlncGlvX2ZyZWUoaHctPnBkYXRhLT5waW5fY3MpOworCiAJcmVsZWFzZV9yZXNvdXJjZShody0+aW9hcmVhKTsKIAlrZnJlZShody0+aW9hcmVhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCA1ZDQ1N2M5Li5jZTZiYWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtNDksNiArNDksOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZTQwMDAvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3VzYmlwL0tjb25maWciCkBAIC02Myw1ICs2NSwzNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9wb2NoL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FnbngvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21pbWlvL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWciCisKIGVuZGlmICMgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggNzFjNGQ1My4uOWRkY2MyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19TTElDT1NTKQkJKz0gc2xpY29zcy8KIG9iai0kKENPTkZJR19TWEcpCQkrPSBzeGcvCiBvYmotJChDT05GSUdfTUU0MDAwKQkJKz0gbWU0MDAwLworb2JqLSQoQ09ORklHX01FSUxIQVVTKQkJKz0gbWVpbGhhdXMvCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KQkrPSBnbzcwMDcvCiBvYmotJChDT05GSUdfVVNCX0lQX0NPTU1PTikJKz0gdXNiaXAvCiBvYmotJChDT05GSUdfVzM1VU5EKQkJKz0gd2luYm9uZC8KQEAgLTE0LDMgKzE1LDE4IEBACiBvYmotJChDT05GSUdfRUNITykJCSs9IGVjaG8vCiBvYmotJChDT05GSUdfVVNCX0FUTUVMKQkJKz0gYXQ3Nl91c2IvCiBvYmotJChDT05GSUdfUE9DSCkJCSs9IHBvY2gvCitvYmotJChDT05GSUdfQUdOWCkJCSs9IGFnbngvCitvYmotJChDT05GSUdfT1RVUykJCSs9IG90dXMvCitvYmotJChDT05GSUdfUlQyODYwKQkJKz0gcnQyODYwLworb2JqLSQoQ09ORklHX1JUMjg3MCkJCSs9IHJ0Mjg3MC8KK29iai0kKENPTkZJR19CRU5FVCkJCSs9IGJlbmV0Lworb2JqLSQoQ09ORklHX0NPTUVESSkJCSs9IGNvbWVkaS8KK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQvCitvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC8KK29iai0kKENPTkZJR19BTFRFUkFfUENJRV9DSERNQSkJKz0gYWx0cGNpZWNoZG1hLworb2JqLSQoQ09ORklHX1JUTDgxODdTRSkJCSs9IHJ0bDgxODdzZS8KK29iai0kKENPTkZJR19VU0JfUlNQSSkJCSs9IHJzcGl1c2IvCitvYmotJChDT05GSUdfSU5QVVRfTUlNSU8pCSs9IG1pbWlvLworb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IGZyb250aWVyLworb2JqLSQoQ09ORklHX0VQTCkJCSs9IGVwbC8KK29iai0kKENPTkZJR19BTkRST0lEKQkJKz0gYW5kcm9pZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDM1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIEFHTlgKKwl0cmlzdGF0ZSAiV2lyZWxlc3MgQWlyZ28gQUdOWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgQWlyZ28gQUdOWDAwIHdpcmVsZXNzIGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai0kKENPTkZJR19BR05YKQkrPSBhZ254Lm8KKworYWdueC1vYmpzIDo9CXJmLm8JXAorCQlwY2kubwlcCisJCXhtaXQubwlcCisJCXRhYmxlLm8JXAorCQlzdGEubwlcCisJCXBoeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJlYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvVE9ETwpAQCAtMCwwICsxLDIyIEBACisyMDA4IDcvMTgKKworVGhlIFJYIGhhcyBjYW4ndCByZWNlaXZlIE9GRE0gcGFja2V0IGNvcnJlY3RseSwKK0d1ZXNzIGl0IG5lZWQgYmUgZG8gUlggY2FsaWJyYXRlLgorCisKK2JlZm9yZSAyMDA4IDMvMQorCisxOiBUaGUgUlggZ2V0IHRvbyBtdWNoICJDUkMgZmFpbGVkIiBwYWtldHMsIGl0IG1ha2UgdGhlIGNhcmQgd29yayB2ZXJ5IHVuc3RhYmxlLAorMjogQWZ0ZXIgcnVubmluZyBhIHdoaWxlLCB0aGUgY2FyZCB3aWxsIGdldCBpbmZpbml0eSAiUlggRnJhbWUiIGFuZCAiRXJyb3IiCitpbnRlcnJ1cHQsIG5vdCBrbm93IHRoZSByb290IHJlYXNvbiBzbyBmYXIsIHRyeSB0byBmaXggaXQKKzM6IFVzaW5nIHR3byB0eCBxdWV1ZSB0eGQgYW5kIHR4bSBidXQgbm90IG9ubHkgdHhtLgorNDogU2V0IHRoZSBoZHIgY29ycmVjdGx5LgorNTogVHJ5IHRvIGRvIHJlY2FsaWJyYXRlIGNvcnJldnRseQorNjogVG8gc3VwcG9ydCBHIG1vZGUgaW4gZnV0dXJlCis3OiBGaXggdGhlIG1hYyBhZGRyZXNzIGNhbid0IGJlIHJlYWRlZCBhbmQgc2V0IGNvcnJlY3RseSBpbiBCRSBtYWNoaW5lLgorODogRml4IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgRkNTIGluIHByb21pc291cyBtb2RlIGFuZCBtYW5hZ2UgbW9kZQorOTogVXNpbmcgc3RhX25vdGlmeSB0byBub3RpY2Ugc3RhIGNoYW5nZQorMTA6IFR1cm4gb24gZnJhbWUgcmVjZXB0aW9uIGF0IHRoZSBlbmQgb2Ygc3RhcnQKKzExOiBHdWVzcyB0aGUgY2FyZCBzdXBwb3J0IEhXX01VTFRJQ0FTVF9GSUxURVIKKzEyOiBUaGUgdHggcHJvY2VzcyBzaG91bGQgYmUgaW1wbG1lbnQgYXRvbWljPworMTM6IFVzaW5nIG1hYzgwMjExIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIFRYJlJYIExFRC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2FnbnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzViMGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIEFHTlhfSF8KKyNkZWZpbmUgQUdOWF9IXworCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIFBGWAkJCQlLQlVJTERfTU9ETkFNRSAiOiAiCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfcmVhZDMyKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gaW9yZWFkMzIobWVtX3JlZ2lvbiArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3dyaXRlMzIodm9pZCBfX2lvbWVtICptZW1fcmVnaW9uLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIG1lbV9yZWdpb24gKyBvZmZzZXQpOworfQorCisvKiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIGFnbnhfcmF0ZXNfODAyMTFiW10gPSB7ICovCisvKiAJeyAucmF0ZSA9IDEwLCAqLworLyogCSAgLnZhbCA9IDB4YSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDSyB9LCAqLworLyogCXsgLnJhdGUgPSAyMCwgKi8KKy8qIAkgIC52YWwgPSAweDE0LCAqLworLyogCSAgLmh3X3ZhbHVlID0gLTB4MTQsICovCisvKiAJICAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9DQ0tfMiB9LCAqLworLyogCXsgLnJhdGUgPSA1NSwgKi8KKy8qIAkgIC52YWwgPSAweDM3LCAqLworLyogCSAgLnZhbDIgPSAtMHgzNywgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0sICovCisvKiAJeyAucmF0ZSA9IDExMCwgKi8KKy8qIAkgIC52YWwgPSAweDZlLCAqLworLyogCSAgLnZhbDIgPSAtMHg2ZSwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0gKi8KKy8qIH07ICovCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBhZ254X3JhdGVzXzgwMjExZ1tdID0geworLyogCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KKy8qIAl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDIsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisvKiAJeyAuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSAzLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LCAqLworLyogCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisgCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMSwgfSwKKyAJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSAyLCB9LAorIAl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDMsIH0sCisgCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDQsfSwKKworCXsgLmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMHhCLCB9LAorCXsgLmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMHhGLCB9LAorCXsgLmJpdHJhdGUgPSAxMjAsIC5od192YWx1ZSA9IDB4QSB9LAorCXsgLmJpdHJhdGUgPSAxODAsIC5od192YWx1ZSA9IDB4RSwgfSwKKy8vCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDB4ZCwgfSwKKwl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSAweEQsIH0sCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gMHg4LCB9LAorCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDB4QywgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYWdueF9jaGFubmVsc1tdID0geworCXsgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNywgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCwgfSwKK307CisKKyNkZWZpbmUgTlVNX0RSSVZFX01PREVTCTIKKy8qIEFnbnggb3BlcmF0ZSBtb2RlICovCitlbnVtIHsKKwlBR05YX01PREVfODAyMTFBLAorCUFHTlhfTU9ERV84MDIxMUFfT09CLAorCUFHTlhfTU9ERV84MDIxMUFfTUlNTywKKwlBR05YX01PREVfODAyMTFCX1NIT1JULAorCUFHTlhfTU9ERV84MDIxMUJfTE9ORywKKwlBR05YX01PREVfODAyMTFHLAorCUFHTlhfTU9ERV84MDIxMUdfT09CLAorCUFHTlhfTU9ERV84MDIxMUdfTUlNTywKK307CisKK2VudW0geworCUFHTlhfVU5JTklULAorCUFHTlhfU1RBUlQsCisJQUdOWF9TVE9QLAorfTsKKworc3RydWN0IGFnbnhfcHJpdiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4OworCXVuc2lnbmVkIGludCBpbml0X3N0YXR1czsKKworCXZvaWQgX19pb21lbSAqY3RsOwkvKiBwb2ludGVyIHRvIGJhc2UgcmFtIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKmRhdGE7CS8qIHBvaW50ZXIgdG8gbWVtIHJlZ2lvbiAjMiAqLworCisJc3RydWN0IGFnbnhfcmluZyByeDsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4bTsKKwlzdHJ1Y3QgYWdueF9yaW5nIHR4ZDsKKworCS8qIE5lZWQgdm9sYXRpbGU/ICovCisJdTMyIGlycV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY193b3JrOyAvKiBQZXJpb2RpYyB0YXNrcyBsaWtlIHJlY2FsaWJyYXRlKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyBzdGF0czsKKworLy8gICAgICAgIHVuc2lnbmVkIGludCBwaHltb2RlOworCWludCBtb2RlOworCWludCBjaGFubmVsOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCByZXZpZDsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKK307CisKKworI2RlZmluZSBBR05YX0NIQUlOU19NQVgJNgorI2RlZmluZSBBR05YX1BFUklPRElDX0RFTEFZIDYwMDAwIC8qIHVuaXQ6IG1zICovCisjZGVmaW5lIExPQ0FMX1NUQUlECTAJLyogdGhlIHN0YXRpb24gZW50cnkgZm9yIHRoZSBjYXJkIGl0c2VsZiAqLworI2RlZmluZSBCU1NJRF9TVEFJRAkxCS8qIHRoZSBzdGF0aW9uIGVudHJ5IGZvciB0aGUgYnNzc2lkIEFQICovCisjZGVmaW5lCXNwaV9kZWxheSgpCXVkZWxheSg0MCkKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJdWRlbGF5KDQwKQorI2RlZmluZQlyb3V0aW5nX3RhYmxlX2RlbGF5KCkJdWRlbGF5KDUwKQorCisvKiBQRFUgcG9vbCBNRU0gcmVnaW9uICMyICovCisjZGVmaW5lIEFHTlhfUERVUE9PTAkJMHg0MDAwMAkvKiBQRFUgcG9vbCAqLworI2RlZmluZSBBR05YX1BEVVBPT0xfU0laRQkweDgwMDAJLyogUERVIHBvb2wgc2l6ZSovCisjZGVmaW5lIEFHTlhfUERVX1RYX1dRCQkweDQxMDAwCS8qIFBEVSBsaXN0IFRYIHdvcmtxdWV1ZSAqLworI2RlZmluZSBBR05YX1BEVV9GUkVFCQkweDQxODAwCS8qIEZyZWUgUG9vbCAqLworI2RlZmluZSBQRFVfU0laRQkJMHg4MAkvKiBGcmVlIFBvb2wgbm9kZSBzaXplICovCisjZGVmaW5lIFBEVV9GUkVFX0NOVAkJMHhkMCAvKiBGcmVlIHBvb2wgbm9kZSBjb3VudCAqLworCisKKy8qIFJGIHN0dWZmcyAqLworZXh0ZXJuIHZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKm1lbV9yZWdpb24sIHUzMiBjaGlwX2lkcywgdTMyIHN3KTsKK2V4dGVybiB2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIHZvaWQgZG9fY2FsaWJyYXRpb24oc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIGludCBhZ254X3NldF9jaGFubmVsKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworCisjZW5kaWYgLyogQUdOWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlMjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L2RlYnVnLmgKQEAgLTAsMCArMSw0MTggQEAKKyNpZm5kZWYgQUdOWF9ERUJVR19IXworI2RlZmluZSBBR05YX0RFQlVHX0hfCisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCisjZGVmaW5lIEFHTlhfVFJBQ0UgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZ1bmN0aW9uOiVzIGxpbmU6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXykKKworI2RlZmluZSBQUklOVEtfTEUxNihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjR4XG4iLCBsZTE2X3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfTEUzMihwcmVmaXgsIHZhcikJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjh4XG4iLCBsZTMyX3RvX2NwdSh2YXIpKQorI2RlZmluZSBQUklOVEtfVTgocHJlZml4LCB2YXIpIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICNwcmVmaXggIjogIiAjdmFyICIgMHglLjJ4XG4iLCB2YXIpCisjZGVmaW5lIFBSSU5US19CRTE2KHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuNHhcbiIsIGJlMTZfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CRTMyKHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuOHhcbiIsIGJlMzJfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19CSVRTKHByZWZpeCwgZmllbGQpICAgIAlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICNmaWVsZCAiOiAweCV4XG4iLCAocmVnICYgZmllbGQpID4+IGZpZWxkIyNfU0hJRlQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X2J1ZyhjaGFyICpyZWFzb24pCit7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXNcbiIsIHJlYXNvbik7CisJQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2Rlc2Moc3RydWN0IGFnbnhfZGVzYyAqZGVzYykKK3sKKyAgICAgICAgdTMyIHJlZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCisJUFJJTlRLX0JJVFMoREVTQywgUEFDS0VUX0xFTik7CisKKwlpZiAocmVnICYgRklSU1RfRlJBRykgeworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9QQUNLRVRfTUFTSyk7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1JFU0VSVjIpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9US0lQX0VSUk9SKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9SRVNFUlYxKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBR19MRU4pOworCX0gZWxzZSB7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9SRVNFUlYyKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgU1VCX1RLSVBfRVJST1IpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfVEtJUF9QQUNLRVQpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfUkVTRVJWMSk7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9GUkFHX0xFTik7CisJfQorCisJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfRlJBRyk7CisJUFJJTlRLX0JJVFMoREVTQywgTEFTVF9GUkFHKTsKKwlQUklOVEtfQklUUyhERVNDLCBPV05FUik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExYl9waHlfaGRyKF9fYmUzMiBfMTFiMCwgX19iZTMyIF8xMWIxKQoreworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwl1MzIgcmVnOworCWludCBpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcwKTsKKwlQUklOVEtfQklUUyhIRFIsIFJUUyk7CisJUFJJTlRLX0JJVFMoSERSLCBNVUxUSUNBU1QpOworCVBSSU5US19CSVRTKEhEUiwgQUNLKTsKKwlQUklOVEtfQklUUyhIRFIsIFRNKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZKTsKKwlQUklOVEtfQklUUyhIRFIsIFJFVklTRURfRkNTKTsKKwlQUklOVEtfQklUUyhIRFIsIE5FWFRfQlVGRkVSX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWcxKTsKKwlQUklOVEtfQklUUyhIRFIsIE1BQ19IRFJfTEVOKTsKKwlQUklOVEtfQklUUyhIRFIsIERVUkFUSU9OX09WRVJJREUpOworCVBSSU5US19CSVRTKEhEUiwgUEhZX0hEUl9PVkVSSURFKTsKKwlQUklOVEtfQklUUyhIRFIsIENSQ19GQUlMKTsKKwlQUklOVEtfQklUUyhIRFIsIFNFUVVFTkNFX05VTUJFUik7CisJUFJJTlRLX0JJVFMoSERSLCBCVUZGX0hFQURfQUREUik7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzIpOworCVBSSU5US19CSVRTKEhEUiwgUERVX0NPVU5UKTsKKwlQUklOVEtfQklUUyhIRFIsIFdFUF9LRVkpOworCVBSSU5US19CSVRTKEhEUiwgVVNFU19XRVBfS0VZKTsKKwlQUklOVEtfQklUUyhIRFIsIEtFRVBfQUxJVkUpOworCVBSSU5US19CSVRTKEhEUiwgQlVGRl9UQUlMX0FERFIpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWczKTsKKwlQUklOVEtfQklUUyhIRFIsIENUU18xMUcpOworCVBSSU5US19CSVRTKEhEUiwgUlRTXzExRyk7CisJUFJJTlRLX0JJVFMoSERSLCBGUkFHX1NJWkUpOworCVBSSU5US19CSVRTKEhEUiwgUEFZTE9BRF9MRU4pOworCVBSSU5US19CSVRTKEhEUiwgRlJBR19OVU0pOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWc0KTsKKwlQUklOVEtfQklUUyhIRFIsIFJFTEFZX1NUQUlEKTsKKwlQUklOVEtfQklUUyhIRFIsIFNUQVRJT05fSUQpOworCVBSSU5US19CSVRTKEhEUiwgV09SS1FVRVVFX0lEKTsKKworCXJlZyA9IGJlMzJfdG9fY3B1KGhkci0+cmVnNSk7CisJLyogcHJpbnRmIHRoZSByb3V0ZSBmbGFnICovCisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9IT1NUKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0NBUkRfQ1BVKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0VOQ1JZUFRJT04pOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfVFgpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfUlgxKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX1JYMik7CisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9DT01QUkVTU0lPTik7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExZzApOworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFnMSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPl8xMWIwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExYjEpOworCisJZHVtcF9pZWVlODAyMTFiX3BoeV9oZHIoaGRyLT5fMTFiMCwgaGRyLT5fMTFiMSk7CisKKwkvKiBGaXhtZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcik7IGkrKykgeworCQlpZiAoaSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJJRUVFODAyMTEgSERSOiAiKTsKKwkJcHJpbnRrKCIlLjJ4ICIsIGhkci0+bWFjX2hkcltpXSk7CisJCWlmIChpICsgMSA9PSBBUlJBWV9TSVpFKGhkci0+bWFjX2hkcikpCisJCQlwcmludGsoIlxuIik7CisJfQorCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ0c19kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPmxhc3RfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5zZWNfbGFzdF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPm90aGVyX2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+dHhfb3RoZXJfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5sYXN0XzExZ19sZW4pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5vdGhlcl8xMWdfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+bGFzdF8xMWJfbGVuKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+b3RoZXJfMTFiX2xlbik7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IGJlMTZfdG9fY3B1KGhkci0+cmVnNik7CisJUFJJTlRLX0JJVFMoSERSLCBNQkYpOworCVBSSU5US19CSVRTKEhEUiwgUlNWRDQpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4X2ZyYWdfc3RhdCk7CisKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+dGltZV9zdGFtcCk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19oaSk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPnBoeV9zdGF0c19sbyk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPm1pY19rZXkwKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+bWljX2tleTEpOworfSAvKiBhZ254X3ByaW50X2hkciAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X3ByaW50X3J4X2hkcihzdHJ1Y3QgYWdueF9oZHIgKmhkcikKK3sKKwlhZ254X3ByaW50X2hkcihoZHIpOworCisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJ4X3BhY2tldF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnJ4LnJlcGxheV9jbnQpOworCisJUFJJTlRLX1U4KEhEUiwgaGRyLT5yeF9jaGFubmVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfdHhfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQoreworCWFnbnhfcHJpbnRfaGRyKGhkcik7CisKKwlQUklOVEtfVTgoSERSLCBoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfbGltaXQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHgubG9uZ19yZXRyeV9jbnQpOworCVBSSU5US19VOChIRFIsIGhkci0+dHguc2hvcnRfcmV0cnlfY250KTsKKworCVBSSU5US19VOChIRFIsIGhkci0+cnhfY2hhbm5lbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWdueF9wcmludF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwlnZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgc3RhX2lkeCk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdShwb3dlci5yZWcpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgU0lHTkFMKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFJBVEUpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgVElGUyk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBFRENGKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIENIQU5ORUxfQk9ORCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQSFlfTU9ERSk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBQT1dFUl9MRVZFTCk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBOVU1fVFJBTlNNSVRURVJTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZ254X3ByaW50X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgdHhfd3E7CisJdTMyIHJlZzsKKworCWdldF9zdGFfdHhfd3EocHJpdiwgJnR4X3dxLCBzdGFfaWR4LCB3cV9pZHgpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBUQUlMX1BPSU5URVIpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWczKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfUE9JTlRFUl9ISUdIKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0xPVyk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcxKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19QT0lOVEVSX0hJR0gpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBBQ0tfVElNT1VUX1RBSUxfUEFDS19DTlQpOworCisJcmVnID0gbGUzMl90b19jcHUodHhfd3EucmVnMik7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1RJTU9VVF9XSU5fTElNX0JZVEVfQ05UKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgV09SS19RVUVVRV9BQ0tfVFlQRSk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBXT1JLX1FVRVVFX1ZBTElEKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhX3RyYWZmaWMoc3RydWN0IGFnbnhfc3RhX3RyYWZmaWMgKnRyYWZmaWMpCit7CisJdTMyIHJlZzsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHRyYWZmaWMtPnJlZzApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBBQ0tfVElNT1VUX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFRSQUZGSUNfQUNLX1RZUEUpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBORVdfUEFDS0VUKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgVFJBRkZJQ19WQUxJRCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX0hEUl9ERVNDX1BPSU5URVIpOworCisJcmVnID0gbGUzMl90b19jcHUodHJhZmZpYy0+cmVnMSk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX1BBQ0tFVF9USU1FU1RBTVApOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBUUkFGRklDX1JFU0VSVkVEKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgU1YpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBSWF9TRVFVRU5DRV9OVU0pOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnR4X3JlcGxheV9jbnRfbG93KTsKKworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT50eF9yZXBsYXlfY250X2hpZ2gpOworCVBSSU5US19MRTE2KFNUQV9UUkFGRklDLCB0cmFmZmljLT5yeF9yZXBsYXlfY250X2hpZ2gpOworCisJUFJJTlRLX0xFMzIoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnJ4X3JlcGxheV9jbnRfbG93KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YSBzdGF0aW9uOworCXN0cnVjdCBhZ254X3N0YSAqc3RhID0gJnN0YXRpb247CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWdldF9zdGEocHJpdiwgc3RhLCBzdGFfaWR4KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT50eF9zZXNzaW9uX2tleXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9zZXNzaW9uX2tleXNbaV0pOworCisJcmVnID0gbGUzMl90b19jcHUoc3RhLT5yZWcpOworCVBSSU5US19CSVRTKFNUQSwgSURfMSk7CisJUFJJTlRLX0JJVFMoU1RBLCBJRF8wKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9DT05DQVRFTkFUSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQUJMRV9ERUNPTVBSRVNTSU9OKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQV9SRVNFUlZFRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFQVApOworCVBSSU5US19CSVRTKFNUQSwgRURfTlVMTCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFTkNSWVBUSU9OX1BPTElDWSk7CisJUFJJTlRLX0JJVFMoU1RBLCBERUZJTkVEX0tFWV9JRCk7CisJUFJJTlRLX0JJVFMoU1RBLCBGSVhFRF9LRVkpOworCVBSSU5US19CSVRTKFNUQSwgS0VZX1ZBTElEKTsKKwlQUklOVEtfQklUUyhTVEEsIFNUQVRJT05fVkFMSUQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnR4X2Flc19ibGtzX3VuaWNhc3QpOworCVBSSU5US19MRTMyKFNUQSwgc3RhLT5yeF9hZXNfYmxrc191bmljYXN0KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZm9ybWF0X2Vycl91bmljYXN0X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19yZXBsYXlfdW5pY2FzdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWVzX2RlY3J5cHRfZXJyX3VuaWNhc3QpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZGVjcnlwdF9lcnJfZGVmYXVsdCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+c2luZ2xlX3JldHJ5X3BhY2tldHMpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mYWlsZWRfdHhfcGFja2V0cyk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+bXV0aV9yZXRyeV9wYWNrZXRzKTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWNrX3RpbWVvdXRzKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5mcmFnX3R4X2NudCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnJ0c19icnFfc2VudCk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+dHhfcGFja2V0cyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmN0c19iYWNrX3RpbWVvdXQpOworCisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnBoeV9zdGF0c19oaWdoKTsKKwlQUklOVEtfTEUzMihTVEEsIHN0YS0+cGh5X3N0YXRzX2xvdyk7CisKKy8vCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdGEtPnRyYWZmaWMgKyAwKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzMl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNF9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNV9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3MpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50cmFmZmljX2NsYXNzN19mcmFnX3N1Y2Nlc3MpOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPm51bV9mcmFnX25vbl9wcmltZV9yYXRlcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFja190aW1lb3V0X25vbl9wcmltZV9yYXRlcyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaWVlZTgwMjExX2hkcihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBjaGFyICp0YWcpCit7CisJdTE2IGZjdGw7CisgICAgICAgIGludCBoZHJsZW47CisJREVDTEFSRV9NQUNfQlVGKG1hYyk7CisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7CisJc3dpdGNoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlwcmludGsoUEZYICIlcyBEQVRBICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJcHJpbnRrKFBGWCAiJXMgQ1RMICIsIHRhZyk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6CisJCXByaW50ayhQRlggIiVzIE1HTVQgIiwgdGFnKTsKKwkJc3dpdGNoKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IEFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBU1NPQ19SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCQkJcHJpbnRrKCJTdWJUeXBlOiBSRUFTU09DX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisJCQlwcmludGsoIlN1YlR5cGU6IFJFQVNTT0NfUkVTUCAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IFBST0JFX1JFUSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBQUk9CRV9SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJCXByaW50aygiU3ViVHlwZTogQkVBQ09OICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FUSU06CisJCQlwcmludGsoIlN1YlR5cGU6IEFUSU0gIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCQlwcmludGsoIlN1YlR5cGU6IERJU0FTU09DICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6CisJCQlwcmludGsoIlN1YlR5cGU6IEFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBERUFVVEggIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBBQ1RJT04gIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3ViVHlwZTogVW5rbm93XG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoUEZYICIlcyBQYWNrZXQgdHlwZTogVW5rbm93XG4iLCB0YWcpOworCX0KKworICAgICAgICBoZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjdGwpOworCisJaWYgKGhkcmxlbiA+PSA0KQorCQlwcmludGsoIkZDPTB4JTA0eCBEVVI9MHglMDR4IiwKKwkJICAgICAgIGZjdGwsIGxlMTZfdG9fY3B1KGhkci0+ZHVyYXRpb25faWQpKTsKKwlpZiAoaGRybGVuID49IDEwKQorCQlwcmludGsoIiBBMT0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjEpKTsKKwlpZiAoaGRybGVuID49IDE2KQorCQlwcmludGsoIiBBMj0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjIpKTsKKwlpZiAoaGRybGVuID49IDI0KQorCQlwcmludGsoIiBBMz0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjMpKTsKKwlpZiAoaGRybGVuID49IDMwKQorCQlwcmludGsoIiBBND0lcyIsIHByaW50X21hYyhtYWMsIGhkci0+YWRkcjQpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3R4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxZTg7IGkgKz0gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlRYTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgaSkpOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3J4bV9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHgxMDg7IGkgKz0gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJSWE06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MjAwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2JtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weDkwOyBpICs9IDQpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQk06ICV4LS0tPiAweCUuOHhcbiIsIGksIGlvcmVhZDMyKGN0bCArIDB4MmMwMCArIGkpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2Npcl9yZWdpc3RlcnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDw9MHhiODsgaSArPSA0KQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNJUjogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgMHgzMDAwICsgaSkpOworfQorCisjZW5kaWYgLyogQUdOWF9ERUJVR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTQ2MzBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGNpLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWl0LmgiCisjaW5jbHVkZSAicGh5LmgiCisKK01PRFVMRV9BVVRIT1IoIkxpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFpcmdvIE1JTU8gUENJIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWdueF9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDEpIH0sCS8qIEJla2xpbiBGNWQ4MDEwLCBOZXRnZWFyIFdHTTUxMSBldGMgKi8KKwl7IFBDSV9ERVZJQ0UoMHgxN2NiLCAweDAwMDIpIH0sCS8qIE5ldGdlYXIgV3BudDUxMSAqLworCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWdueF9wY2lfaWRfdGJsKTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9pbnRlcnJ1cHRfYWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiAqcmVhc29uKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfUlggKSB7CisJCS8qIE1hcmsgY29tcGxldGUgUlggKi8KKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCQlyZWcgfD0gMHg0OworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJCS8qIGRpc2FibGUgUnggaW50ZXJydXB0ICovCisJfQorCWlmICggKnJlYXNvbiAmIEFHTlhfU1RBVF9UWCApIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhEQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYRDsKKwkJfQorIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJaWYgKHJlZyAmIDB4NCkgeworCQkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwkJCSpyZWFzb24gfD0gQUdOWF9TVEFUX1RYTTsKKwkJfQorCX0KKwlpZiAoICpyZWFzb24gJiBBR05YX1NUQVRfWCApIHsKKy8qIAkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfU1RBVCk7ICovCisvKiAJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX1NUQVQpOyAqLworLyogCQkvXCogRklYTUUgcmVpbml0IGludGVycnVwdCBtYXNrICpcLyAqLworLyogCQlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsgKi8KKy8qIAkJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJCWlvd3JpdGUzMigweDgwMCwgY3RsICsgQUdOWF9DSVJfQkxLQ1RMKTsgKi8KKwl9Cit9IC8qIGFnbnhfaW50ZXJydXB0X2FjayAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWdueF9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdTMyIGlycV9yZWFzb247CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisvLwlwcmludGsoS0VSTl9FUlIgUEZYICJHZXQgYSBpbnRlcnJ1cHQgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT5pbml0X3N0YXR1cyAhPSBBR05YX1NUQVJUKQorCQlnb3RvIG91dDsKKworCS8qIEZpWE1FICBIZXJlIGhhcyBubyBsb2NrLCBJcyB0aGlzIHdpbGwgbGVhZCB0byByYWNlPyAqLworCWlycV9yZWFzb24gPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9CTEtDVEwpOworCWlmICghKGlycV9yZWFzb24gJiAweDcpKQorCQlnb3RvIG91dDsKKworCXJldCA9IElSUV9IQU5ETEVEOworCXByaXYtPmlycV9zdGF0dXMgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9TVEFUKTsKKworLy8JcHJpbnRrKFBGWCAiSW50ZXJydXB0IHJlYXNvbiBpcyAweCV4XG4iLCBpcnFfcmVhc29uKTsKKwkvKiBNYWtlIHN1cmUgdGhlIHR4bSBhbmQgdHhkIGZsYWdzIGRvbid0IGNvbmZsaWN0IHdpdGggb3RoZXIgdW5rbm93bgorCSAgIGludGVycnVwdCBmbGFnLCBtYXliZSBpcyBub3QgbmVjZXNzYXJ5ICovCisJaXJxX3JlYXNvbiAmPSAweEY7CisKKwlkaXNhYmxlX3J4X2ludGVycnVwdChwcml2KTsKKwkvKiBUT0RPIE1ha2Ugc3VyZSB0aGUgY2FyZCBmaW5pc2hlZCBpbml0aWFsaXplZCAqLworCWFnbnhfaW50ZXJydXB0X2Fjayhwcml2LCAmaXJxX3JlYXNvbik7CisKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfUlggKQorCQloYW5kbGVfcnhfaXJxKHByaXYpOworCWlmICggaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9UWEQgKQorCQloYW5kbGVfdHhkX2lycShwcml2KTsKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfVFhNICkKKwkJaGFuZGxlX3R4bV9pcnEocHJpdik7CisJaWYgKCBpcnFfcmVhc29uICYgQUdOWF9TVEFUX1ggKQorCQloYW5kbGVfb3RoZXJfaXJxKHByaXYpOworCisJZW5hYmxlX3J4X2ludGVycnVwdChwcml2KTsKK291dDoKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIHJldDsKK30gLyogYWdueF9pbnRlcnJ1cHRfaGFuZGxlciAqLworCisKKy8qIEZJWE1FICovCitzdGF0aWMgaW50IGFnbnhfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIF9hZ254X3R4KGRldi0+cHJpdiwgc2tiKTsKK30gLyogYWdueF90eCAqLworCisKK3N0YXRpYyBpbnQgYWdueF9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBdHRlbnRpb24hIGRpcmVjdGx5IHJlYWQgdGhlIE1BQyBvciBvdGhlciBkYXRlIGZyb20gRUVQUk9NIHdpbGwKKwkgbGVhZCB0byBjYXJkYnVzKFdHTTUxMSkgbG9jayB1cCB3aGVuIHdyaXRlIHRvIFBNIFBMTCByZWdpc3RlciAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ0KTsKKwl1ZGVsYXkoNDApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTRjKTsKKwl1ZGVsYXkoNTApOworCS8qIEdldCB0aGUgbWFjIGFkZHJlc3MgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MzU0NCk7CisJdWRlbGF5KDQwKTsKKworCS8qIEhBQ0sgKi8KKwlyZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXByaXYtPm1hY19hZGRyWzBdID0gKCh1OCAqKSZyZWcpWzJdOworCXByaXYtPm1hY19hZGRyWzFdID0gKCh1OCAqKSZyZWcpWzNdOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ4KTsKKwl1ZGVsYXkoNTApOworCSooKHUzMiAqKShwcml2LT5tYWNfYWRkciArIDIpKSA9IGNwdV90b19sZTMyKHJlZyk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpKSB7CisJCURFQ0xBUkVfTUFDX0JVRihtYnVmKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlYWQgbWFjICVzXG4iLCBwcmludF9tYWMobWJ1ZiwgcHJpdi0+bWFjX2FkZHIpKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkludmFsaWQgaHdhZGRyISBVc2luZyByYW5kb20gaHdhZGRyXG4iKTsKKwkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdi0+bWFjX2FkZHIpOworCX0KKworCXJldHVybiAwOworfSAvKiBhZ254X2dldF9tYWNfYWRkcmVzcyAqLworCitzdGF0aWMgaW50IGFnbnhfYWxsb2NfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCUFHTlhfVFJBQ0U7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIHJpbmdzIGluZm8gKi8KKwlwcml2LT5yeC5zaXplID0gQUdOWF9SWF9SSU5HX1NJWkU7CisJcHJpdi0+dHhtLnNpemUgPSBBR05YX1RYTV9SSU5HX1NJWkU7CisJcHJpdi0+dHhkLnNpemUgPSBBR05YX1RYRF9SSU5HX1NJWkU7CisKKwlsZW4gPSBwcml2LT5yeC5zaXplICsgcHJpdi0+dHhtLnNpemUgKyBwcml2LT50eGQuc2l6ZTsKKworLy8JcHJpdi0+cnguaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pICogbGVuLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5yeC5pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykgKiBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcHJpdi0+cnguaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+dHhtLmluZm8gPSBwcml2LT5yeC5pbmZvICsgcHJpdi0+cnguc2l6ZTsKKwlwcml2LT50eGQuaW5mbyA9IHByaXYtPnR4bS5pbmZvICsgcHJpdi0+dHhtLnNpemU7CisKKwkvKiBBbGxvY2F0ZSBSWC9UWE0vVFhEIGRlc2NyaXB0b3JzICovCisJcHJpdi0+cnguZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIGxlbiwKKwkJCQkJICAgICAmcHJpdi0+cnguZG1hKTsKKwlpZiAoIXByaXYtPnJ4LmRlc2MpIHsKKwkJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnR4bS5kZXNjID0gcHJpdi0+cnguZGVzYyArIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhtLmRtYSA9IHByaXYtPnJ4LmRtYSArIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnJ4LnNpemU7CisJcHJpdi0+dHhkLmRlc2MgPSBwcml2LT50eG0uZGVzYyArIHByaXYtPnR4bS5zaXplOworCXByaXYtPnR4ZC5kbWEgPSBwcml2LT50eG0uZG1hICsgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogcHJpdi0+dHhtLnNpemU7CisKKwlyZXR1cm4gMDsKK30gLyogYWdueF9hbGxvY19yaW5ncyAqLworCitzdGF0aWMgdm9pZCByaW5nc19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHByaXYtPnJ4LnNpemUgKyBwcml2LT50eG0uc2l6ZSArIHByaXYtPnR4ZC5zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJa2ZyZWUocHJpdi0+cnguaW5mbyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBsZW4sCisJCQkgICAgcHJpdi0+cnguZGVzYywgcHJpdi0+cnguZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWdueF9wcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNfd29yay53b3JrKTsKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCS8qIGZpeG1lOiB1c2luZyBtdXRleD8/ICovCisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVE9ETyBSZWNhbGlicmF0ZSovCisvLwljYWxpYnJhdGVfb3NjaWxsYXRvcihwcml2KTsKKy8vCWFudGVubmFfY2FsaWJyYXRlKHByaXYpOworLy8JYWdueF9zZW5kX3BhY2tldChwcml2LCA5OTcpOworCS8qIEZJWE1FICovCisvKiAJaWYgKGRlYnVnID09IDMpICovCisvKiAgICAgICAgICAgICAgICAgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogCWVsc2UgKi8KKwlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7CisvLwkJZGVsYXkgPSByb3VuZF9qaWZmaWVzKEhaICogMTUpOworCisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LT53b3JrcXVldWUsICZwcml2LT5wZXJpb2RpY193b3JrLCBkZWxheSk7CisKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFnbnhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJLyogdW5zaWduZWQgbG9uZyBkZWxheTsgKi8KKwlpbnQgZXJyID0gMDsKKwlBR05YX1RSQUNFOworCisJZXJyID0gYWdueF9hbGxvY19yaW5ncyhwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IGFsbG9jIFJYL1RYTS9UWEQgcmluZ3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGRldi0+aXJxLCAmYWdueF9pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCSAgSVJRRl9TSEFSRUQsICJhZ254X3BjaSIsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIpOworCQlyaW5nc19mcmVlKHByaXYpOworCQlnb3RvIG91dDsKKwl9CisKKy8vCW1kZWxheSg1MDApOworCisJbWlnaHRfc2xlZXAoKTsKKwlhZ254X2h3X2luaXQocHJpdik7CisKKy8vCW1kZWxheSg1MDApOworCW1pZ2h0X3NsZWVwKCk7CisKKwlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfU1RBUlQ7CisvKiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5wZXJpb2RpY193b3JrLCBhZ254X3BlcmlvZGljX3dvcmtfaGFuZGxlcik7ICovCisvKiAJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKEFHTlhfUEVSSU9ESUNfREVMQVkpOyAqLworLyogICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPnBlcmlvZGljX3dvcmssIGRlbGF5KTsgKi8KK291dDoKKwlyZXR1cm4gZXJyOworfSAvKiBhZ254X3N0YXJ0ICovCisKK3N0YXRpYyB2b2lkIGFnbnhfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1NUT1A7CisJLyogbWFrZSBzdXJlIGhhcmR3YXJlIHdpbGwgbm90IGdlbmVyYXRlIGlycSAqLworCWFnbnhfaHdfcmVzZXQocHJpdik7CisJZnJlZV9pcnEocHJpdi0+cGRldi0+aXJxLCBkZXYpOworICAgICAgICBmbHVzaF93b3JrcXVldWUocHJpdi0+aHctPndvcmtxdWV1ZSk7CisvLwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnBlcmlvZGljX3dvcmspOworCXVuZmlsbF9yaW5ncyhwcml2KTsKKwlyaW5nc19mcmVlKHByaXYpOworfQorCitzdGF0aWMgaW50IGFnbnhfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNvbmYtPmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkvKiBGSVhNRSBuZWVkIHByaXYgbG9jaz8gKi8KKwlpZiAoY2hhbm5lbCAhPSBwcml2LT5jaGFubmVsKSB7CisJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCQlhZ254X3NldF9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpOworCX0KKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ254X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChtZW1jbXAoY29uZi0+YnNzaWQsIHByaXYtPmJzc2lkLCBFVEhfQUxFTikpIHsKKy8vCQl1MzIgcmVnaGksIHJlZ2xvOworCQlhZ254X3NldF9ic3NpZChwcml2LCBjb25mLT5ic3NpZCk7CisJCW1lbWNweShwcml2LT5ic3NpZCwgY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJaGFzaF93cml0ZShwcml2LCBjb25mLT5ic3NpZCwgQlNTSURfU1RBSUQpOworCQlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisJCS8qIEZJWE1FIG5lZWRlZD8gKi8KKwkJc3RhX3Bvd2VyX2luaXQocHJpdiwgQlNTSURfU1RBSUQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX01UU00sIDB4ZmYgJiB+MHgxKTsKKwl9CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiAwOworfSAvKiBhZ254X2NvbmZpZ19pbnRlcmZhY2UgKi8KKworCitzdGF0aWMgdm9pZCBhZ254X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAorCQkJCSAgaW50IG1jX2NvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X2ZsYWdzID0gMDsKKworCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKKwkvKiBUT0RPICovCit9CisKK3N0YXRpYyBpbnQgYWdueF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogRklYTUUgKi8KKwlpZiAocHJpdi0+bW9kZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCXByaXYtPm1vZGUgPSBjb25mLT50eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFnbnhfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwkvKiBUT0RPICovCisJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJLyogVE9ETyAhISAqLworCW1lbWNweShzdGF0cywgJnByaXYtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgYWdueF9nZXRfdHNmdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSAoKHN0cnVjdCBhZ254X3ByaXYgKilkZXYtPnByaXYpLT5jdGw7CisJdTMyIHRzZnRsOworCXU2NCB0c2Z0OworCUFHTlhfVFJBQ0U7CisKKwkvKiBGSVhNRSAqLworCXRzZnRsID0gaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fVElNRVNUQU1QTE8pOworCXRzZnQgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9USU1FU1RBTVBISSk7CisJdHNmdCA8PD0gMzI7CisJdHNmdCB8PSB0c2Z0bDsKKworCXJldHVybiB0c2Z0OworfQorCitzdGF0aWMgaW50IGFnbnhfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJLyogRklYTUUgbm93IHdlIGp1c3QgdXNpbmcgdHhkIHF1ZXVlLCBidXQgc2hvdWxkIHVzaW5nIHR4bSBxdWV1ZSB0b28gKi8KKwlzdGF0c1swXS5sZW4gPSAocHJpdi0+dHhkLmlkeCAtIHByaXYtPnR4ZC5pZHhfc2VudCkgLyAyOworCXN0YXRzWzBdLmxpbWl0ID0gcHJpdi0+dHhkLnNpemUgLSAyOworCXN0YXRzWzBdLmNvdW50ID0gcHJpdi0+dHhkLmlkeCAvIDI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfb3BzIGFnbnhfb3BzID0geworCS50eAkJCT0gYWdueF90eCwKKwkuc3RhcnQJCQk9IGFnbnhfc3RhcnQsCisJLnN0b3AJCQk9IGFnbnhfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSBhZ254X2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UJPSBhZ254X3JlbW92ZV9pbnRlcmZhY2UsCisJLmNvbmZpZwkJCT0gYWdueF9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UJPSBhZ254X2NvbmZpZ19pbnRlcmZhY2UsCisgCS5jb25maWd1cmVfZmlsdGVyCT0gYWdueF9jb25maWd1cmVfZmlsdGVyLAorCS5nZXRfc3RhdHMJCT0gYWdueF9nZXRfc3RhdHMsCisJLmdldF90eF9zdGF0cwkJPSBhZ254X2dldF90eF9zdGF0cywKKwkuZ2V0X3RzZgkJPSBhZ254X2dldF90c2Z0Cit9OworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWdueF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5kYXRhKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFnbnhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OworCXN0cnVjdCBhZ254X3ByaXYgKnByaXY7CisJdTMyIG1lbV9hZGRyMCwgbWVtX2xlbjA7CisJdTMyIG1lbV9hZGRyMSwgbWVtX2xlbjE7CisJaW50IGVycjsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgZW5hYmxlIG5ldyBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBnZXQgcGNpIHJlc291cmNlICovCisJbWVtX2FkZHIwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1lbV9sZW4wID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwltZW1fYWRkcjEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJbWVtX2xlbjEgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiTWVtYWRkcjAgaXMgJXgsIGxlbmd0aCBpcyAleFxuIiwgbWVtX2FkZHIwLCBtZW1fbGVuMCk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNZW1hZGRyMSBpcyAleCwgbGVuZ3RoIGlzICV4XG4iLCBtZW1fYWRkcjEsIG1lbV9sZW4xKTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImFnbngtcGNpIik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBvYnRhaW4gUENJIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykgfHwKKwkgICAgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJwZGV2LT5pcnEgaXMgJWRcbiIsIHBkZXYtPmlycSk7CisKKwlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJmFnbnhfb3BzKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCS8qIGluaXQgcHJpdiAgKi8KKwlwcml2ID0gZGV2LT5wcml2OworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5odyA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+aW5pdF9zdGF0dXMgPSBBR05YX1VOSU5JVDsKKworCS8qIE1hcCBtZW0gIzEgYW5kICMyICovCisJcHJpdi0+Y3RsID0gcGNpX2lvbWFwKHBkZXYsIDAsIG1lbV9sZW4wKTsKKy8vCXByaW50ayhLRVJOX0RFQlVHIFBGWCJNRU0xIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmN0bCk7CisJaWYgKCFwcml2LT5jdGwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgbWFwIGRldmljZSBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJcHJpdi0+ZGF0YSA9IHBjaV9pb21hcChwZGV2LCAxLCBtZW1fbGVuMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNRU0yIG1hcHBlZCBhZGRyZXNzIGlzIDB4JXBcbiIsIHByaXYtPmRhdGEpOworCWlmICghcHJpdi0+ZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBtYXAgZGV2aWNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXAyOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnByaXYtPnJldmlkKTsKKworCXByaXYtPmJhbmQuY2hhbm5lbHMgICA9IChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKilhZ254X2NoYW5uZWxzOworCXByaXYtPmJhbmQubl9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWdueF9jaGFubmVscyk7CisJcHJpdi0+YmFuZC5iaXRyYXRlcyAgID0gKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqKWFnbnhfcmF0ZXNfODAyMTFnOworCXByaXYtPmJhbmQubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUoYWdueF9yYXRlc184MDIxMWcpOworCisJLyogSW5pdCBpZWVlODAyLjExIGRldiAgKi8KKwlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZwZGV2LT5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKworCS8qIEZJWE1FIEl0IG9ubHkgaW5jbHVkZSBGQ1MgaW4gcHJvbWlvdXMgbW9kZSBidXQgbm90IG1hbmFnZSBtb2RlICovCisvKiAgICAgIGRldi0+ZmxhZ3MgPSAgSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsgKi8KKwlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSA1MDAwOworCWRldi0+bWF4X3NpZ25hbCA9IDEwMDsKKwkvKiBGSVhNRSAqLworCWRldi0+cXVldWVzID0gMTsKKworCWFnbnhfZ2V0X21hY19hZGRyZXNzKHByaXYpOworCisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoZGV2LCBwcml2LT5tYWNfYWRkcik7CisKKy8qIAkvXCogRklYTUUgKlwvICovCisvKiAJZm9yIChpID0gMTsgaSA8IE5VTV9EUklWRV9NT0RFUzsgaSsrKSB7ICovCisvKiAJCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9od21vZGUoZGV2LCAmcHJpdi0+bW9kZXNbaV0pOyAqLworLyogCQlpZiAoZXJyKSB7ICovCisvKiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBod21vZGVcbiIpOyAqLworLyogCQkJZ290byAgZXJyX2lvdW5tYXA7ICovCisvKiAJCX0gKi8KKy8qIAl9ICovCisKKwlwcml2LT5jaGFubmVsID0gMTsKKwlkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZwcml2LT5iYW5kOworCisJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBoYXJkd2FyZVxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJYWdueF9od19yZXNldChwcml2KTsKKworCisJcHJpbnRrKFBGWCAiJXM6IGh3YWRkciAlcywgUmV2IDB4JTAyeFxuIiwgd2lwaHlfbmFtZShkZXYtPndpcGh5KSwKKwkgICAgICAgcHJpbnRfbWFjKG1hYywgZGV2LT53aXBoeS0+cGVybV9hZGRyKSwgcHJpdi0+cmV2aWQpOworCXJldHVybiAwOworCisgZXJyX2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+ZGF0YSk7CisKKyBlcnJfaW91bm1hcDI6CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+Y3RsKTsKKworIGVycl9mcmVlX2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKKworIGVycl9mcmVlX3JlZzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9IC8qIGFnbnhfcGNpX3Byb2JlKi8KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGFnbnhfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJQUdOWF9UUkFDRTsKKworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhkZXYpOworCWFnbnhfc3RvcChkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlBR05YX1RSQUNFOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJYWdueF9zdGFydChkZXYpOworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgYWdueF9wY2lfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGFnbnhfcGNpX3Jlc3VtZSBOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWdueF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJhZ254LXBjaSIsCisJLmlkX3RhYmxlCT0gYWdueF9wY2lfaWRfdGJsLAorCS5wcm9iZQkJPSBhZ254X3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFnbnhfcGNpX3JlbW92ZSksCisJLnN1c3BlbmQJPSBhZ254X3BjaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWdueF9wY2lfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWdueF9wY2lfaW5pdCh2b2lkKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZ254X3BjaV9leGl0KHZvaWQpCit7CisJQUdOWF9UUkFDRTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFnbnhfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoYWdueF9wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChhZ254X3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4ZjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5jCkBAIC0wLDAgKzEsOTYwIEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAieG1pdC5oIgorCit1OCByZWFkX2Zyb21fZWVwcm9tKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUxNiBhZGRyZXNzKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBhZ254X2VlcHJvbSBjbWQ7CisJdTMyIHJlZzsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZCA9IEVFUFJPTV9DTURfUkVBRCA8PCBBR05YX0VFUFJPTV9DT01NQU5EX1NISUZUOworCWNtZC5hZGRyZXNzID0gYWRkcmVzczsKKwkvKiBWZXJpZnkgdGhhdCB0aGUgU3RhdHVzIGJpdCBpcyBjbGVhciAqLworCS8qIFJlYWQgQ29tbWFuZCBhbmQgQWRkcmVzcyBhcmUgd3JpdHRlbiB0byB0aGUgU2VyaWFsIEludGVyZmFjZSAqLworCWlvd3JpdGUzMigqKF9fbGUzMiAqKSZjbWQsIGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisJLyogV2FpdCBmb3IgdGhlIFN0YXR1cyBiaXQgdG8gY2xlYXIgYWdhaW4gKi8KKwllZXByb21fZGVsYXkoKTsKKwkvKiBSZWFkIGZyb20gRGF0YSAqLworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1NFUklBTElURik7CisKKwljbWQgPSAqKHN0cnVjdCBhZ254X2VlcHJvbSAqKSZyZWc7CisKKwlyZXR1cm4gY21kLmRhdGE7Cit9CisKK3N0YXRpYyBpbnQgY2FyZF9mdWxsX3Jlc2V0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgMHg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCXJldHVybiAwOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IH4weDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7Cit9CisKKwordm9pZCBkaXNhYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCS8qIEZJWE1FIERpc2FibGUgdGhlIHJlY2VpdmVyICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIFJlc2V0IGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKKworLyogRml4bWUgdGhpcyBzaG91bGUgYmUgZGlzYWJsZSBSWCwgYWJvdmUgaXMgZW5hYmxlIFJYICovCit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBTZXQgYWRhcHRpdmUgZ2FpbiBjb250cm9sIGRpc2NvdmVyeSBtb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCS8qIFNldCBnYWluIGNvbnRyb2wgcmVzZXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCS8qIENsZWFyIGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19hZGRyZXNzX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICptYWNfYWRkciA9IHByaXYtPm1hY19hZGRyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCXJlZyA9IChtYWNfYWRkclswXSA8PCAyNCkgfCAobWFjX2FkZHJbMV0gPDwgMTYpIHwgbWFjX2FkZHJbMl0gPDwgOCB8IG1hY19hZGRyWzNdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX01BQ0hJKTsKKyAJcmVnID0gKG1hY19hZGRyWzRdIDw8IDgpIHwgbWFjX2FkZHJbNV07CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fTUFDTE8pOworfQorCitzdGF0aWMgdm9pZCByZWNlaXZlcl9ic3NpZF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworCS8qIEZJWE1FICovCisJcmVnID0gYnNzaWRbMF0gPDwgMjQgfCAoYnNzaWRbMV0gPDwgMTYpIHwgKGJzc2lkWzJdIDw8IDgpIHwgYnNzaWRbM107CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURISSk7CisgCXJlZyA9IChic3NpZFs0XSA8PCA4KSB8IGJzc2lkWzVdOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX0JTU0lETE8pOworCisJLyogRW5hYmxlIHRoZSByZWNlaXZlciAqLworCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKKworCS8qIENsZWFyIHRoZSBUU0YgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZMTywgMHgwKTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UU0ZISSwgMHgwKTsgKi8KKwkvKiBDbGVhciB0aGUgVEJUVCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RCVFRMTywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UQlRUSEksIDB4MCk7CisJZGlzYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcmVjZWl2ZXJfYnNzaWRfc2V0ICovCisKK3N0YXRpYyB2b2lkIGJhbmRfbWFuYWdlbWVudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCWludCBpOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYV0FERFIsIEFHTlhfUERVX1RYX1dRKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVQT09MLCAweDAsIEFHTlhfUERVUE9PTF9TSVpFKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCAweDIwMCk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NJUERVV0NOVCwgMHg0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFBEVVdDTlQsIDB4Mik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SRlBQRFVXQ05ULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkhQUERVV0NOVCwgMHgyMik7CisKKwkvKiBGSVhNRSBJbml0aWFsaXplIHRoZSBGcmVlIFBvb2wgTGlua2VkIExpc3QgKi8KKwkvKiAgICAxLiBXcml0ZSB0aGUgQWRkcmVzcyBvZiB0aGUgTmV4dCBOb2RlICgoMHg0MTgwMCArIG5vZGUqc2l6ZSkvc2l6ZSkKKwkgICAgICB0byB0aGUgZmlyc3Qgd29yZCBvZiBlYWNoIG5vZGUuICAqLworCWZvciAoaSA9IDA7IGkgPCBQRFVfRlJFRV9DTlQ7IGkrKykgeworCQlpb3dyaXRlMzIoKEFHTlhfUERVX0ZSRUUgKyAoaSsxKSpQRFVfU0laRSkvUERVX1NJWkUsCisJCQkgIGRhdGEgKyBBR05YX1BEVV9GUkVFICsgKFBEVV9TSVpFICogaSkpOworCQkvKiBUaGUgbGFzdCBub2RlIHNob3VsZCBiZSBzZXQgdG8gMHgwICovCisJCWlmICgoaSArIDEpID09IFBEVV9GUkVFX0NOVCkKKwkJCW1lbXNldF9pbyhkYXRhICsgQUdOWF9QRFVfRlJFRSArIChQRFVfU0laRSAqIGkpLAorCQkJCSAgMHgwLCBQRFVfU0laRSk7CisJfQorCisJLyogSGVhZCBpcyBGaXJzdCBQb29sIGFkZHJlc3MgKDB4NDE4MDApIC8gc2l6ZSAoMHg4MCkgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0ZQTEhQLCBBR05YX1BEVV9GUkVFL1BEVV9TSVpFKTsKKwkvKiBUYWlsIGlzIExhc3QgUG9vbCBBZGRyZXNzICgweDQ3ZjgwKSAvIHNpemUgKDB4ODApICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9GUExUUCwgMHg0N2Y4MC9QRFVfU0laRSk7CisJLyogQ291bnQgaXMgTnVtYmVyIG9mIE5vZGVzIGluIHRoZSBQb29sICgweGQwKSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fRlBDTlQsIFBEVV9GUkVFX0NOVCk7CisKKwkvKiBTdGFydCBhbGwgd29ya3F1ZXVlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DSVdRQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUxXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVUhXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVVRYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9DUFVSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BSWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fU1BUWFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fUkZQV0NUTCwgMHg4MDAwMCk7CisKKwkvKiBFbmFibGUgdGhlIEJhbmQgTWFuYWdlbWVudCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9CTV9CTUNUTCk7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCByZWcpOworfSAvKiBiYW5kX21hbmFnbWVudF9pbml0ICovCisKKworc3RhdGljIHZvaWQgc3lzdGVtX2l0Zl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fVEVTVFBIWSwgMHgxMWUxNDNhKTsKKworCWlmIChwcml2LT5yZXZpZCA9PSAwKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSk7CisJCXJlZyB8PSAweDExOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCByZWcpOworCX0KKwkvKiA/Pz8gV2hhdCBpcyB0aGF0IG1lYW5zPyBpdCBzaG91bGQgZGlmZmVyZW5jZSBmb3IgZGlmZmVyaWNlIHR5cGUKKwkgb2YgY2FyZHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYsIDB4ZmZmODEwMDYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOLCAweDFmMDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDUpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKK30KKworc3RhdGljIHZvaWQgZW5jcnlwdGlvbl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX1dFUEtFWTEsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkyLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX0NDTVJFQ1RMLCAweDgpOworfQorCitzdGF0aWMgdm9pZCB0eF9tYW5hZ2VtZW50X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIEZpbGwgb3V0IHRoZSBDb21wdXRhdGlvbmFsRW5naW5lTG9va3VwVGFibGUKKwkgKiBzdGFydGluZyBhdCBtZW1vcnkgIzIgb2Zmc2V0IDB4ODAwCisJICovCisJdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChwcml2KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4MTAwMCwgMCwgMHhmZTApOworCS8qIEVuYWJsZSBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBGdW5jdGlvbnMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9FVE1GLCAweDNmZik7CisJLyogV3JpdGUgMHgzZiB0byBUcmFuc21pc3Npb24gVGVtcGxhdGUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9UWFRFTVAsIDB4M2YpOworCisJaWYgKHByaXYtPnJldmlkID49IDIpCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTQwYTBiKTsKKwllbHNlCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NJRlNQSUZTLCAweDFlMTkwYTBiKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMpOworCXJlZyAmPSAweGZmMDA7CisJcmVnIHw9IDB4YjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKKwlyZWcgJj0gMHhmZmZmMDBmZjsKKwlyZWcgfD0gMHhhMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJLyogRW5hYmxlIFRJRlMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4NDAwMDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4NTEwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVksIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4MDBmZmZmZmY7CisJcmVnIHw9IDB4MWMwMDAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVkpOworCXJlZyAmPSAweDAwZmZmZmZmOworCXJlZyB8PSAweDAxMDAwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qICMgU2V0IERJRiAwLTEsMi0zLDQtNSw2LTcgdG8gZGVmYXVsdHMgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUYwMSwgMHgzMjFkMzIxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fRElGMjMsIDB4MzIxZDMyMWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjQ1LCAweDMyMWQzMjFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUY2NywgMHgzMjFkMzIxZCk7CisKKwkvKiBNYXggQWNrIHRpbWVvdXQgbGltaXQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9NQVhBQ0tUSU0sIDB4MWUxOSk7CisJLyogTWF4IFJYIERhdGEgVGltZW91dCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFJYVElNRSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4ZmY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYUlhUSU1FLCByZWcpOworCisJLyogQ0YgcG9sbCBSWCBUaW1lb3V0IGNvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjsKKwlyZWcgfD0gMHhmZjAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiBNYXggVGltZW91dCBFeGNlZWRlZCBjb3VudCwgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCk7CisJcmVnICY9IDB4ZmYwMGZmZmY7CisJcmVnIHw9IDB4MTkwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWFRJTU9VVCwgcmVnKTsKKworCS8qIENGIGFjayB0aW1lb3V0IGxpbWl0IGZvciAxMWIgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGQUNLVDExQik7CisJcmVnICY9IDB4ZmYwMDsKKwlyZWcgfD0gMHgxZTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRkFDS1QxMUIsIHJlZyk7CisKKwkvKiBNYXggQ0YgUG9sbCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MTk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisJLyogQ0YgUG9sbCBSWCBUaW1lb3V0IENvdW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4MWU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0sIHJlZyk7CisKKwkvKiAjIHdyaXRlIGRlZmF1bHQgdG8gKi8KKwkvKiAgICAxLiBTY2hlZHVsZSBFbXB0eSBDb3VudCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NDSEVNUENOVCwgMHg1KTsKKwkvKiAgICAyLiBDRlAgUGVyaW9kIENvdW50ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ0ZQRVJDTlQsIDB4MSk7CisJLyogICAgMy4gQ0ZQIE1EViAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBNRFYsIDB4MTAwMDApOworCisJLyogUHJvYmUgRGVsYXkgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSk7CisJcmVnICY9IDB4ZmZmZjAwMDA7CisJcmVnIHw9IDB4NDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKworCS8qIE1heCBDQ0EgY291bnQgU2xvdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVCk7CisJcmVnICY9IDB4ZmZmZjAwZmY7CisJcmVnIHw9IDB4OTAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWENDQUNOVFNMT1QsIHJlZyk7CisKKwkvKiBTbG90IGxpbWl0LzEgbXNlYyBMaW1pdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlUKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlyZWcgfD0gMHgxNDAwNzc7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0xPVExJTUlULCByZWcpOworCisJLyogIyBTZXQgQ1cgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzAsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzEsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzIsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzMsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzQsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzUsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzYsIDB4ZmYwMDA3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVzcsIDB4ZmYwMDA3KTsKKworCS8qICMgU2V0IFNob3J0L0xvbmcgbGltaXQgIygwLTcpIHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTAsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTEsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTIsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTMsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTQsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTUsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTYsICAweGEwMDBhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTEJFQUxJTTcsICAweGEwMDBhKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxNDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAgKi8KKwl1ZGVsYXkoODApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwkvKiBPciAweDE4MDAwIHRvIENvbnRyb2wgcmVnICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCXJlZyB8PSAweDE4MDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKKwkvKiBXYWl0IGZvciBiaXQgMCBpbiBDb250cm9sIFJlZyB0byBjbGVhciAqLworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCisJLyogU2V0IExpc3RlbiBJbnRlcnZhbCBDb3VudCB0byBkZWZhdWx0ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTElTSU5URVJDTlQsIDB4MSk7CisJLyogU2V0IERUSU0gcGVyaW9kIGNvdW50IHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9EVElNUEVSSUNOVCwgMHgyMDAwKTsKK30gLyogdHhfbWFuYWdlbWVudF9pbml0ICovCisKK3N0YXRpYyB2b2lkIHJ4X21hbmFnZW1lbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwkvKiBJbml0aWFsaXplIHRoZSBSb3V0aW5nIFRhYmxlICovCisJcm91dGluZ190YWJsZV9pbml0KHByaXYpOworCisJaWYgKHByaXYtPnJldmlkID49IDMpIHsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc0LCAweDFmMTcxNzEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDc4LCAweDEwMTAwZDBkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgyMDdjLCAweDExMTExMDEwKTsKKwl9CisJZWxzZQorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9ERUxBWTExLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODE5NWUwMCk7Cit9CisKKworc3RhdGljIHZvaWQgYWdueF90aW1lcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworLyogCS9cKiBXcml0ZSAweDI0OWYwMCAodGljayBkdXJhdGlvbj8pIHRvIFRpbWVyIDEgKlwvICovCisvKiAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDI0OWYwMCk7ICovCisvKiAJL1wqIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICpcLyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVElNQ1RMX1RJTTFDVEwsIDB4ZTIpOyAqLworCisJLyogV3JpdGUgMHgyNDlmMDAgKHRpY2sgZHVyYXRpb24/KSB0byBUaW1lciAxICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNRVIxLCAweDApOworCS8qIFdyaXRlIDB4ZTIgdG8gVGltZXIgMSBDb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNMUNUTCwgMHgwKTsKKworCWlvd3JpdGUzMigweEZGRkZGRkZGLCBwcml2LT5jdGwgKyBBR05YX1RYTV9CRUFDT05fQ1RMKTsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfbWFuYWdlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX01BQ01TVywgMHgxZik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9SRkNUTCwgMHgxZik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSAweGYwMGY7CisJcmVnIHw9IDB4YTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCWlmIChwcml2LT5yZXZpZCA+PSAzKSB7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNUKTsKKwkJcmVnIHw9IDB4MTg7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwl9Cit9IC8qIHBvd2VyX21hbmFnZV9pbml0ICovCisKKworc3RhdGljIHZvaWQgZ2Fpbl9jdGxjbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDUsIDB4MTE5KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ2LCAweDExOCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVFJBQ05UNywgMHgxMTcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9BRERSV0lOLCAweDApOworCisJLyogRklYTUUgV3JpdGUgdGhlIGluaXRpYWwgU3RhdGlvbiBEZXNjcmlwdG9yIGZvciB0aGUgY2FyZCAqLworCXN0YV9pbml0KHByaXYsIExPQ0FMX1NUQUlEKTsKKwlzdGFfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisKKwkvKiBFbmFibGUgc3RhaW9uIDAgYW5kIDEgY2FuIGRvIFRYICovCisJLyogSXQgc2VlbWVkIGlmIHdlIHNldCBvdGhlciBiaXQgdG8gMSB0aGUgYml0IDAgd2lsbAorCSAgIGJlIGF1dG8gY2hhbmdlIHRvIDAgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYVE9QRUVSLCAweDIgfCAweDEpOworLy8JYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9UWFRPUEVFUiwgMHgxKTsKK30gLyogZ2Fpbl9jdGxjbnRfaW5pdCAqLworCisKK3N0YXRpYyB2b2lkIHBoeV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwkvKiBMb2FkIEluaXRpYWxHYWluVGFibGUgKi8KKwlnYWluX3RhYmxlX2luaXQocHJpdik7CisKKyAgCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MjAwMDAwMCk7CisKKwkvKiBDbGVhciB0aGUgZm9sbG93aW5nIG9mZnNldHMgaW4gTWVtb3J5IFJhbmdlICMyOiAqLworCW1lbXNldF9pbyhkYXRhICsgMHg1MDQwLCAwLCAweGEgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NTA4MCwgMCwgMHhhICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDUwYzAsIDAsIDB4YSAqIDQpOworCW1lbXNldF9pbyhkYXRhICsgMHg1NDAwLCAwLCAweDgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDYwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDcwMDAsIDAsIDB4MjgwICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDgwMDAsIDAsIDB4MjgwICogNCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBGb2xsb3dpbmcgUmVnaXN0ZXJzIEFjY29yZGluZyB0byBQQ0kgUmV2aXNpb24gSUQgKi8KKwlpZiAocHJpdi0+cmV2aWQgPT0gMCkgeworCQkvKiBmaXhtZSB0aGUgcGFydCBoYXNuJ3QgYmVlbiB1cGRhdGUgYnV0IGJlbG93IGhhcyBiZWVuIHVwZGF0ZQorCQkgICBiYXNlZCBvbiBXR001MTEgKi8KKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweGYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTBPVkUsIDB4MTEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEExT1ZFLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBTCwgMHg0Yik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCAweDRiKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFVOU0FULCAweDE0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFNBVCwgMHgyNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RGSVJDQUwsIDB4OCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFBLCAweDFhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5JTklULCAweGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USE5PU0lHLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT0FSU1RFUCwgMHg3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUEsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQiwgMHgyOCk7CisJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfQ1dERVRFQyk7CisJCXJlZyB8PSAweDE7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NXREVURUMsIHJlZyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMzgsIDB4MWUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTUVBU0FOVCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFBLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhMRVZEUk8sIDB4MTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUEsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQiwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDc4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAweDFjKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMHgxZik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgzMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MDAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQwYywgMHg2ZmYpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MjgsIDB4YTApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwNCwgMHgxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwYywgMHg3Zik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMzNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhjMDAwLCAweDM4ZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTQwMTgsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTYwMDAsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1NCwgMHhhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzFjLCAweDUpOworCX0gZWxzZSBpZiAocHJpdi0+cmV2aWQgPiAwKSB7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDIxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBME9WRSwgMHgxMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTFPVkUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RVTlNBVCwgMHgxNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RTQVQsIDB4MjQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ERklSQ0FMLCAweDgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQSwgMHgxYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFCLCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOSU5JVCwgMHhkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhOT1NJRywgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09BUlNURVAsIDB4Nyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFBLCAweDI4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUIsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DV0RFVEVDLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDM4LCAweDFlKTsKKy8vCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFCLCAweDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQSwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQUlgxMUIsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USExFVkRSTywgMHgxMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQSwgMHgxYWQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9NQVhSWFRJTUUxMUIsIDB4YTEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUlRJTUUsIDB4MTkwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ09SUkRST1AsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0QsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ1MsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFBPV0RJRkYsIDB4NCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RFU1RCVVMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RISlVNUCwgMHgxZSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XRVIsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUE9XQ0xJUCwgMHgyYSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDB4M2MpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USFJYMTFCUE9XTUlOLCAweDE5KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNGMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMTUwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1dBVENIRE9HLCAweDM3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDAwLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MGMsIDB4NmZmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDI4LCAweGEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDM0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMDQsIDB4MTUpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMGMsIDB4N2YpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDljMzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4YzAwMCwgMHgzOGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE0LCAweDEwMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE0MDE4LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDE2MDAwLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIDB4YSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxYywgMHg1MCk7CisJfSBlbHNlIGlmIChwcml2LT5yZXZpZCA+IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjMTgpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjMTgsIHJlZyk7CisJfQorCisJLyogV3JpdGUgdGhlIFRYIEZpciBDb2VmZmljaWVudCBUYWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgJj0gfjB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7CisKKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4MWEwMzApOyAqLworLyogCXJlZyAmPSB+MHg0OyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIDB4MWEwMzAsIHJlZyk7ICovCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ0LCAweDExMyk7Cit9IC8qIHBoeV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoaXBfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWJhbmRfbWFuYWdlbWVudF9pbml0KHByaXYpOworCisJcmZfY2hpcHNfaW5pdChwcml2KTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUEhZICovCisJcGh5X2luaXQocHJpdik7CisKKwllbmNyeXB0aW9uX2luaXQocHJpdik7CisKKwl0eF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlyeF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlwb3dlcl9tYW5hZ2VfaW5pdChwcml2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIFRpbWVycyAqLworCWFnbnhfdGltZXJfaW5pdChwcml2KTsKKworCS8qIFdyaXRlIDB4YzM5MGJmOSB0byBJbnRlcnJ1cHQgTWFzayAoRGlzYWJsZSBUWCkgKi8KKwlyZWcgPSAweGMzOTBiZjkgJiB+SVJRX1RYX0JFQUNPTjsKKwlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7CisJcmVnIHw9IDB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKworCS8qIHNldCBpdCB3aGVuIG5lZWQgZ2V0IG11bHRpY2FzdCBlbmFibGU/ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9NVFNNLCAweGZmKTsKK30gLyogY2hpcF9pbml0ICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNfYW5kX21hbmFnZWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwIHwgMHgyKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVhcm5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4OCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NjYW5fbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MjApOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyMTApOyovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgxMCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21hbmFnZWRfbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4Mik7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FkaG9jX21vZGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDApOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgdW5rbm93X3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MCwgMHgzZSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQsIDB4YjIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg4LCAweDE0MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweGMsIDB4MUMwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTAsIDB4MUZGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTQsIDB4MUREKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MTgsIDB4MTVGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MWMsIDB4QTEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyMCwgMHgzRTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyNCwgMHgzNkIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyOCwgMHgzNDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgyYywgMHgzN0QpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzMCwgMHgzREUpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzNCwgMHgzNik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDM4LCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4M2MsIDB4NTcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg0MCwgMHgyMyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ0LCAweDNFRCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQ4LCAweDNDOSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDRjLCAweDNDQSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDUwLCAweDNFNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDU0LCAweDgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHg1OCwgMHgxRik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDVjLCAweDFhKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjYXJkX2ludGVyZmFjZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTggYnNzaWRbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCXUzMiByZWc7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogQ2xlYXIgUlggQ29udHJvbCBhbmQgRW5hYmxlIFJYIHF1ZXVlcyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBEbyBhIGZ1bGwgcmVzZXQgb2YgdGhlIGNhcmQgKi8KKwljYXJkX2Z1bGxfcmVzZXQocHJpdik7CisJbWlnaHRfc2xlZXAoKTsKKworCS8qIENoZWNrIGFuZCBzZXQgQ2FyZCBFbmRpYW5uZXNzICovCisJcmVnID0gaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfRU5ESUFOKTsKKwkvKiBUT0RPIElmIG5vdCAweEIzQjJCMUIwIHNldCB0byAweEIzQjJCMUIwICovCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNJUl9FTkRJQU4gaXMgJXhcbiIsIHJlZyk7CisKKworCS8qIENvbmZpZyB0aGUgZWVwcm9tICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDcwMDAwODYpOworCXVkZWxheSgxMCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4ODAwMDAwMzMpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT0lOKTsKKwl1ZGVsYXkoMTApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKworCS8qIER1bXAgdGhlIGVlcHJvbSAqLworCWRvIHsKKwkJY2hhciBlZXByb21bMHgxMDAwMDAvMHgxMDBdOworCisJCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwMDsgaSArPSAweDEwMCkgeworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGLCAweDMwMDAwMDAgKyBpKTsKKwkJCXVkZWxheSgxMyk7CisJCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7CisJCQl1ZGVsYXkoNzApOworCQkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCQkJZWVwcm9tW2kvMHgxMDBdID0gcmVnICYgMHhGRjsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoUEZYICJFRVBST006ICIsIERVTVBfUFJFRklYX05PTkUsIGVlcHJvbSwKKwkJCQkgICAgIEFSUkFZX1NJWkUoZWVwcm9tKSk7CisJfSB3aGlsZSgwKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI2KTsKKyAgICAgICAgcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN5c3RlbSBpbnRlcmZhY2UgKi8KKwlzeXN0ZW1faXRmX2luaXQocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIENoaXAgSW5pdGlhbGl6YXRpb24gKFBvbGFyaXMpICovCisJY2hpcF9pbml0KHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIGFudGVubmFlICovCisJYW50ZW5uYV9jYWxpYnJhdGUocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWM1MCk7CisJcmVnICY9IH4weDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIDB4MSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQk1fQk1DVEwpOworCXJlZyB8PSAweDgwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9CTUNUTCwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKKwlyZWcgfD0gMHgyMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgcmVnKTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgR2FpbiBDb250cm9sIENvdW50cyAqLworCWdhaW5fY3RsY250X2luaXQocHJpdik7CisKKwkvKiBXcml0ZSBJbml0aWFsIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgZm9yIHRoaXMgc3RhdGlvbigjMCkgKi8KKwlzdGFfcG93ZXJfaW5pdChwcml2LCBMT0NBTF9TVEFJRCk7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEluaXRpYWxpemUgdGhlIHJ4LHRkLHRtIHJpbmdzLCBmb3IgZWFjaCBub2RlIGluIHRoZSByaW5nICovCisJZmlsbF9yaW5ncyhwcml2KTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHg4MDAwMDAzMyk7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweGMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKKworCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIDB4MTk0YzEpOworCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBGSVhNRSBTZXQgdGhlIFJlY2VpdmUgQ29udHJvbCBNYWMgQWRkcmVzcyB0byBjYXJkIGFkZHJlc3MgKi8KKwltYWNfYWRkcmVzc19zZXQocHJpdik7CisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBTZXQgdGhlIHJlY2lldmUgcmVxdWVzdCByYXRlICovCisJLyogRklYTUUgRW5hYmxlIHRoZSByZXF1ZXN0ICovCisJLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAqLworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDg4MTk1ZTAwKTsgKi8KKy8qIAllbmFibGVfcmVjZWl2ZXIocHJpdik7ICovCisKKwkvKiBTZXQgdGhlIFJlY2VpdmVyIEJTU0lEICovCisJcmVjZWl2ZXJfYnNzaWRfc2V0KHByaXYsIGJzc2lkKTsKKworCS8qIEZJWE1FIFNldCB0byBtYW5hZ2VkIG1vZGUgKi8KKwlzZXRfbWFuYWdlZF9tb2RlKHByaXYpOworLy8Jc2V0X3Byb21pc2N1b3VzX21vZGUocHJpdik7CisvKiAJc2V0X3NjYW5fbW9kZShwcml2KTsgKi8KKy8qIAlzZXRfbGVhcm5fbW9kZShwcml2KTsgKi8KKy8vIAlzZXRfcHJvbWlzX2FuZF9tYW5hZ2VkKHByaXYpOworLy8gCXNldF9hZGhvY19tb2RlKHByaXYpOworCisJLyogU2V0IHRoZSByZWNpZXZlIHJlcXVlc3QgcmF0ZSAqLworCS8qIENoZWNrIHBhY2tldCBsZW5ndGggKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCAweDA4MDAwMDAwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUpOworCS8qIFNldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKi8KKwlyZWcgfD0gMHgwMDE5NWUwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCisJLyogQ29uZmlndXJlIHRoZSBSWCBhbmQgVFggaW50ZXJydXB0ICovCisJcmVnID0gRU5BQkxFX1JYX0lOVEVSUlVQVCB8IFJYX0NBQ0hFX0xJTkUgfCBGUkFHX0xFTl8yMDQ4IHwgRlJBR19CRTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENGRywgcmVnKTsKKwkvKiBGSVhNRSAqLworCXJlZyA9IEVOQUJMRV9UWF9JTlRFUlJVUFQgfCBUWF9DQUNIRV9MSU5FIHwgRlJBR19MRU5fMjA0OCB8IEZSQUdfQkU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhDRkcsIHJlZyk7CisKKwkvKiBFbmFibGUgUlggVFggSW50ZXJydXB0cyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ1RMLCAweDgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwsIDB4ODApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgMHg4MCk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIG1hc3RlciBjb250cm9sIGludGVycnVwdCBpbiBibG9jayBjb250cm9sICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCAweDgwMCk7CisKKwkvKiBFbmFibGUgUlggYW5kIFRYIHF1ZXVlcyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfUlhDVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNQ1RMLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKwkvKiBGSVhNRSAqLworCS8qICB1bmtub3dfcmVnaXN0ZXJfd3JpdGUocHJpdik7ICovCisJLyogVXBkYXRlIGxvY2FsIGNhcmQgaGFzaCBlbnRyeSAqLworCWhhc2hfd3JpdGUocHJpdiwgcHJpdi0+bWFjX2FkZHIsIExPQ0FMX1NUQUlEKTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBGSVhNRSAqLworCWFnbnhfc2V0X2NoYW5uZWwocHJpdiwgMSk7CisJbWlnaHRfc2xlZXAoKTsKK30gLyogYWdueF9jYXJkX2ludGVyZmFjZV9pbml0ICovCisKKwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlBR05YX1RSQUNFOworCW1pZ2h0X3NsZWVwKCk7CisJY2FyZF9pbnRlcmZhY2VfaW5pdChwcml2KTsKK30KKworaW50IGFnbnhfaHdfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlyZXR1cm4gY2FyZF9mdWxsX3Jlc2V0KHByaXYpOworfQorCitpbnQgYWdueF9zZXRfc3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQoreworCUFHTlhfVFJBQ0U7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWdueF9zZXRfYnNzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKmJzc2lkKQoreworCXJlY2VpdmVyX2Jzc2lkX3NldChwcml2LCBic3NpZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuaApAQCAtMCwwICsxLDQwOSBAQAorI2lmbmRlZiBBR05YX1BIWV9IXworI2RlZmluZSBBR05YX1BIWV9IXworCisjaW5jbHVkZSAiYWdueC5oIgorCisvKiBUcmFuc21pc3Npb24gTWFuYWdtZW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX1RYTV9CQVNFCQkweDAwMDAKKyNkZWZpbmUgQUdOWF9UWE1fQ1RMCQkweDAwMDAJLyogY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1RYTV9FVE1GCQkweDAwMDQgLyogZW5hYmxlIHRyYW5zbWlzc2lvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworI2RlZmluZSBBR05YX1RYTV9UWFRFTVAJCTB4MDAwOCAvKiB0cmFuc21pc3Npb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUkVUUllTVEFJRAkweDAwMGMgLyogUmV0cnkgU3RhdGlvbiBJRCAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBMTwkJMHgwMDEwCS8qIFRpbWVzdGFtcCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9USU1FU1RBTVBISQkJMHgwMDE0CS8qIFRpbWVzdGFtcCBIaSAqLworI2RlZmluZSBBR05YX1RYTV9UWERFTEFZCTB4MDAxOCAgLyogdHggZGVsYXkgKi8KKyNkZWZpbmUgQUdOWF9UWE1fVEJUVExPCQkweDAwMjAJLyogdGJ0dCBMbyAqLworI2RlZmluZSBBR05YX1RYTV9UQlRUSEkJCTB4MDAyNAkvKiB0YnR0IEhpICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUlOVEVSCTB4MDAyOCAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTkFWCQkweDAwMzAgLyogTkFWICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE1EVgkJMHgwMDM0IC8qIENGUCBNRFYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZQRVJDTlQJMHgwMDM4IC8qIENGUCBwZXJpb2QgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fUFJPQkRFTEFZCTB4MDAzYyAvKiBwcm9iZSBkZWxheSAqLworI2RlZmluZSBBR05YX1RYTV9MSVNJTlRFUkNOVAkweDAwNDAgLyogbGlzdGVuIGludGVydmFsIGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX0RUSU1QRVJJQ05UCTB4MDA0YyAvKiBEVElNIHBlcmlvZCBjb3VudCAqLworCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTl9DVEwJMHgwMDVjIC8qIGJlYWNvbiBjb250cm9sICovCisKKyNkZWZpbmUgQUdOWF9UWE1fU0NIRU1QQ05UCTB4MDA3YyAvKiBzY2hlZHVsZSBlbXB0eSBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhUSU1PVVQJMHgwMDg0IC8qIG1heCB0aW1lb3V0IGV4Y2VlZCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhDRlBUSU0JMHgwMDg4IC8qIG1heCBDRiBwb2xsIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTUFYUlhUSU1FCTB4MDA4YyAvKiBtYXggUlggdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhBQ0tUSU0JMHgwMDkwCS8qIG1heCBBQ0sgdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9ESUYwMQkJMHgwMGEwIC8qIERJRiAwLTEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fRElGMjMJCTB4MDBhNCAvKiBESUYgMi0zICovCisjZGVmaW5lIEFHTlhfVFhNX0RJRjQ1CQkweDAwYTggLyogRElGIDQtNSAqLworI2RlZmluZSBBR05YX1RYTV9ESUY2NwkJMHgwMGFjIC8qIERJRiA2LTcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0lGU1BJRlMJMHgwMGIwIC8qIFNJRlMvUElGUyAqLworI2RlZmluZSBBR05YX1RYTV9USUZTRUlGUwkweDAwYjQgLyogVElGUy9FSUZTICovCisjZGVmaW5lIEFHTlhfVFhNX01BWENDQUNOVFNMT1QJMHgwMGI4IC8qIG1heCBDQ0EgY291bnQgc2xvdCAqLworI2RlZmluZSBBR05YX1RYTV9TTE9UTElNSVQJMHgwMGJjIC8qIHNsb3QgbGltaXQvMSBtc2VjIGxpbWl0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NGUE9MTFJYVElNCTB4MDBmMCAvKiBDRiBwb2xsIFJYIHRpbWVvdXQgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZBQ0tUMTFCCTB4MDBmNCAvKiBDRiBhY2sgdGltZW91dCBsaW1pdCBmb3IgMTFiICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMAkJMHgwMTAwIC8qIENXIDAgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0wCTB4MDEwOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAwICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMQkJMHgwMTIwIC8qIENXIDEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0xCTB4MDEyOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAxICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMgkJMHgwMTQwIC8qIENXIDIgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0yCTB4MDE0OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAyICovCisjZGVmaW5lIEFHTlhfVFhNX0NXMwkJMHgwMTYwIC8qIENXIDMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU0zCTB4MDE2OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCAzICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNAkJMHgwMTgwIC8qIENXIDQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU00CTB4MDE4OCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA0ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNQkJMHgwMWEwIC8qIENXIDUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU01CTB4MDFhOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA1ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNgkJMHgwMWMwIC8qIENXIDYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU02CTB4MDFjOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA2ICovCisjZGVmaW5lIEFHTlhfVFhNX0NXNwkJMHgwMWUwIC8qIENXIDcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU0xCRUFMSU03CTB4MDFlOCAvKiBzaG9ydC9sb25nIGJlYWNvbiBsaW1pdCA3ICovCisjZGVmaW5lIEFHTlhfVFhNX0JFQUNPTlRFTVAgICAgIDB4MTAwMAkvKiBiZWFjb24gdGVtcGxhdGUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fU1RBUE9XVEVNUAkweDFhMDAgLyogIFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgKi8KKworLyogUmVjZWl2ZSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfUlhNX0JBU0UJCTB4MjAwMAorI2RlZmluZSBBR05YX1JYTV9SRVFSQVRFCTB4MjAwMAkvKiByZXF1ZXN0ZWQgcmF0ZSAqLworI2RlZmluZSBBR05YX1JYTV9NQUNISQkJMHgyMDA0CS8qIGZpcnN0IDQgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fTUFDTE8JCTB4MjAwOAkvKiBsYXN0IDIgYnl0ZXMgb2YgbWFjIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURISQkweDIwMGMJLyogYnNzaWQgaGkgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQlNTSURMTwkweDIwMTAJLyogYnNzaWQgbG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9DTURfRkxBRwkweDIwMTQJLyogRmxhZ3MgZm9yIHRoZSBSWCBIYXNoIENvbW1hbmQgRGVmYXVsdDowICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gJMHgyMDE4CS8qIFRoZSBIaWdoIGhhbGYgb2YgdGhlIEhhc2ggQ29tbWFuZCAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0NNRF9MT1cJMHgyMDFjCS8qIFRoZSBMb3cgaGFsZiBvZiB0aGUgSGFzaCBDb21tYW5kICovCisjZGVmaW5lIEFHTlhfUlhNX1JPVVRBQgkJMHgyMDIwCS8qIHJvdXRpbmcgdGFibGUgKi8KKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1NISUZUCTI0CisjZGVmaW5lCQlST1VUQUJfVFlQRV9TSElGVAkyOAorI2RlZmluZQkJUk9VVEFCX1NUQVRVU19TSElGVAkzMAorI2RlZmluZQkJUk9VVEFCX1JXX1NISUZUCQkzMQorI2RlZmluZQkJUk9VVEFCX1JPVVRFX0RST1AJMHhmMDAwMDAgLyogRHJvcCAqLworI2RlZmluZQkJUk9VVEFCX1JPVVRFX0NQVQkweDQwMDAwMCAvKiBDUFUgKi8KKyNkZWZpbmUJCVJPVVRBQl9ST1VURV9FTkNSWQkweDUwMDgwMCAvKiBFbmNyeXB0aW9uICovCisjZGVmaW5lCQlST1VUQUJfUk9VVEVfUkZQCTB4ODAwMDAwIC8qIFJGUCAqLworCisjZGVmaW5lCQlST1VUQUJfVFlQRV9NQU5BRwkweDAgLyogTWFuYWdlbWVudCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfQ1RMCQkweDEgLyogQ29udHJvbCAqLworI2RlZmluZQkJUk9VVEFCX1RZUEVfREFUQQkweDIgLyogRGF0YSAqLworCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBCQkweDAKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEFBQ0sJCTB4MQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTEwJCTB4MgorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0sJMHgzCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMCQkweDQgLyogTlVMTCAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfTlVMTEFDSwkJMHg1CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTAkJMHg2CisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSwkweDcKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEEJCTB4OCAvKiBRT1MgREFUQSAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSwkweDkKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMCTB4YQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwJMHhiCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMCQkweGMKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExBQ0sJMHhkCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTAkweGUKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLCTB4ZgorI2RlZmluZSBBR05YX1JYTV9ERUxBWTExCSAgIDB4MjAyNAkvKiBkZWxheSAxMShBQikgKi8KKyNkZWZpbmUgQUdOWF9SWE1fU09GX0NOVAkgICAweDIwMjgJLyogU09GIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0ZSQUdfQ05UCSAgIDB4MjAyYwkvKiBGcmFnbWVudCBDb3VudCovCisjZGVmaW5lIEFHTlhfUlhNX0ZDU19DTlQJICAgMHgyMDMwCS8qIEZDUyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9CU1NJRF9NSVNTX0NOVAkgICAweDIwMzQJLyogQlNTSUQgTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9QRFVfRVJSX0NOVAkgICAweDIwMzgJLyogUERVIEVycm9yIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0RFU1RfTUlTU19DTlQJICAgMHgyMDNDCS8qIERlc3RpbmF0aW9uIE1pc3MgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fRFJPUF9DTlQJICAgMHgyMDQwCS8qIERyb3AgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQUJPUlRfQ05UCSAgIDB4MjA0NAkvKiBBYm9ydCBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9SRUxBWV9DTlQJICAgMHgyMDQ4CS8qIFJlbGF5IENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfTUlTU19DTlQJICAgMHgyMDRjCS8qIEhhc2ggTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9TQV9ISQkJICAgMHgyMDUwCS8qIEFkZHJlc3Mgb2YgcmVjZWl2ZWQgcGFja2V0IEhpICovCisjZGVmaW5lIEFHTlhfUlhNX1NBX0xPCQkgICAweDIwNTQJLyogQWRkcmVzcyBvZiByZWNlaXZlZCBwYWNrZXQgTG8gKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9EVU1QX0xTVAkgICAweDIxMDAJLyogQ29udGFpbnMgSGFzaCBEYXRhICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfRFVNUF9NU1QJICAgMHgyMTA0CS8qIENvbnRhaW5zIEhhc2ggRGF0YSAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0RVTVBfREFUQSAgICAweDIxMDgJLyogVGhlIFN0YXRpb24gSUQgdG8gZHVtcCAqLworCisKKy8qIEVuY3J5cHRpb24gTWFuYWdtZW50ICovCisjZGVmaW5lIEFHTlhfRU5DUllfQkFTRQkJMHgyNDAwCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMAkweDI0NDAgLyogd2VwIGtleSAjMCAqLworI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTEJMHgyNDQ0IC8qIHdlcCBrZXkgIzEgKi8KKyNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkyCTB4MjQ0OCAvKiB3ZXAga2V5ICMyICovCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMwkweDI0NGMgLyogd2VwIGtleSAjMyAqLworI2RlZmluZSBBR05YX0VOQ1JZX0NDTVJFQ1RMCTB4MjQ2MCAvKiBjY20gcmVwbGF5IGNvbnRyb2wgKi8KKworCisvKiBCYW5kIE1hbmFnZW1lbnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfQk1fQkFTRQkJMHgyYzAwCisjZGVmaW5lIEFHTlhfQk1fQk1DVEwJCTB4MmMwMCAgLyogYmFuZCBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9UWFdBRERSCQkweDJjMTggIC8qIHR4IHdvcmtxdWV1ZSBhZGRyZXNzIHN0YXJ0ICovCisjZGVmaW5lIEFHTlhfQk1fVFhUT1BFRVIJMHgyYzI0CS8qIHRyYW5zbWl0IHRvIHBlZXJzICovCisjZGVmaW5lIEFHTlhfQk1fRlBMSFAJCTB4MmMyYyAgLyogZnJlZSBwb29sIGxpc3QgaGVhZCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBMVFAJCTB4MmMzMCAgLyogZnJlZSBwb29sIGxpc3QgdGFpbCBwb2ludGVyICovCisjZGVmaW5lIEFHTlhfQk1fRlBDTlQJCTB4MmMzNCAgLyogZnJlZSBwb29sIGNvdW50ICovCisjZGVmaW5lIEFHTlhfQk1fQ0lQRFVXQ05UCTB4MmMzOCAgLyogY2FyZCBpbnRlcmZhY2UgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX1NQUERVV0NOVAkweDJjM2MgIC8qIHNwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SRlBQRFVXQ05UCTB4MmM0MCAgLyogcmZwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9SSFBQRFVXQ05UCTB4MmM0NCAgLyogcmhwIHBkdSB3b3JrcXVldWUgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9DSVdRQ1RMCQkweDJjNDggLyogQ2FyZCBJbnRlcmZhY2UgV29ya1F1ZXVlIENvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVUWFdDVEwJMHgyYzUwICAvKiBjcHUgdHggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVSWFdDVEwJMHgyYzU4ICAvKiBjcHUgcnggd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9DUFVMV0NUTAkweDJjNjAgLyogY3B1IGxvdyB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVUhXQ1RMCTB4MmM2OCAvKiBjcHUgaGlnaCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQVFhXQ1RMCTB4MmM3MCAvKiBzcCB0eCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1NQUlhXQ1RMCTB4MmM3OCAvKiBzcCByeCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1JGUFdDVEwJCTB4MmM4MCAvKiBSRlAgd29ya3F1ZXVlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9CTV9NVFNNCQkweDJjOTAgLyogTXVsdGljYXN0IFRyYW5zbWl0IFN0YXRpb24gTWFzayAqLworCisvKiBDYXJkIEludGVyZmFjZSBSZWdpc3RlcnMgKDMyYml0cykgKi8KKyNkZWZpbmUgQUdOWF9DSVJfQkFTRQkJMHgzMDAwCisjZGVmaW5lIEFHTlhfQ0lSX0JMS0NUTAkJMHgzMDAwCS8qIGJsb2NrIGNvbnRyb2wqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYCTB4MQorI2RlZmluZQkJQUdOWF9TVEFUX1JYCTB4MgorI2RlZmluZQkJQUdOWF9TVEFUX1gJMHg0CisvKiBCZWxvdyB0d28gaW50ZXJydXB0IGZsYWdzIHdpbGwgYmUgc2V0IGJ5IG91ciBidXQgbm90IENQVSBvciB0aGUgY2FyZCAqLworI2RlZmluZQkJQUdOWF9TVEFUX1RYRAkweDEwCisjZGVmaW5lCQlBR05YX1NUQVRfVFhNCTB4MjAKKworI2RlZmluZSBBR05YX0NJUl9BRERSV0lOCTB4MzAwNAkvKiBBZGRyZXNzYWJsZSBXaW5kb3dzKi8KKyNkZWZpbmUgQUdOWF9DSVJfRU5ESUFOCQkweDMwMDggIC8qIGNhcmQgZW5kaWFubmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9TRVJJQUxJVEYJMHgzMDIwCS8qIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDRkcJCTB4MzA0MAkvKiByZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZQkJRU5BQkxFX1JYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlSWF9DQUNIRV9MSU5FCSAgICAweDgKKy8qIHRoZSBSWCBmcmFnbWVudCBsZW5ndGggKi8KKyNkZWZpbmUJCUZSQUdfTEVOXzI1NgkweDAgLyogMjU2QiAqLworI2RlZmluZQkJRlJBR19MRU5fNTEyCTB4MQorI2RlZmluZQkJRlJBR19MRU5fMTAyNAkweDIKKyNkZWZpbmUJCUZSQUdfTEVOXzIwNDgJMHgzCisjZGVmaW5lCQlGUkFHX0JFCQkweDEwCisjZGVmaW5lIEFHTlhfQ0lSX1JYQ1RMCQkweDMwNTAJLyogcmVjZWl2ZSBjb250cm9sICovCisvKiBtZW1vcnkgYWRkcmVzcywgY2hpcHNpZGUgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTVNUQVJUCTB4MzA1NAkvKiByZWNlaXZlIGNsaWVudCBtZW1vcnkgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhDTUVORAkweDMwNTgJLyogcmVjZWl2ZSBjbGllbnQgbWVtb3J5IGVuZCAqLworLyogbWVtb3J5IGFkZHJlc3MsIHBjaSAqLworI2RlZmluZSBBR05YX0NJUl9SWEhPU1RBRERSCTB4MzA2MAkvKiByZWNlaXZlIGhvc3RzaWRlIGFkZHJlc3MgKi8KKy8qIG1lbW9yeSBhZGRyZXNzLCBjaGlwc2lkZSAqLworI2RlZmluZSBBR05YX0NJUl9SWENMSUFERFIJMHgzMDY0CS8qIHJlY2VpdmUgY2xpZW50c2lkZSBhZGRyZXNzICovCisjZGVmaW5lIEFHTlhfQ0lSX1JYRE1BQ1RMCTB4MzA2OAkvKiByZWNlaXZlIGRtYSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYQ0ZHCQkweDMwODAJLyogdHJhbnNtaXQgY29uZmlnICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYTUNUTAkJMHgzMDkwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgQ29udHJvbCAqLworI2RlZmluZQkJRU5BQkxFX1RYX0lOVEVSUlVQVCAweDIwCisjZGVmaW5lCQlUWF9DQUNIRV9MSU5FCSAgICAweDgKKyNkZWZpbmUgQUdOWF9DSVJfVFhNU1RBUlQJMHgzMDk0IC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgU3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNRU5ECQkweDMwOTggLyogVHJhbnNtaXQgTWFuYWdlbWVudCBFbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEQ1RMCQkweDMwYTAJLyogdHJhbnNtaXQgZGF0YSBjb250cm9sICovCisvKiBtZW1lb3J5IGFkZHJlc3MsIGNoaXBzZXQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhEU1RBUlQJMHgzMGE0CS8qIHRyYW5zbWl0IGRhdGEgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhERU5ECQkweDMwYTgJLyogdHJhbnNtaXQgZGF0YSBlbmQgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNSEFERFIJMHgzMGIwIC8qIFRyYW5zbWl0IE1hbmFnZW1lbnQgSG9zdHNpZGUgQWRkcmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9UWE1DQUREUgkweDMwYjQgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBDbGllbnRzaWRlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhETUFDVEwJMHgzMGI4CS8qIHRyYW5zbWl0IGRtYSBjb250cm9sICovCisKKworLyogUG93ZXIgTWFuYWdtZW50IFVuaXQgKi8KKyNkZWZpbmUgQUdOWF9QTV9CQVNFCQkweDNjMDAKKyNkZWZpbmUgQUdOWF9QTV9QTUNUTAkJMHgzYzAwCS8qIFBNIENvbnRyb2wqLworI2RlZmluZSBBR05YX1BNX01BQ01TVwkJMHgzYzA4IC8qIE1BQyBNYW51YWwgU2xvdyBXb3JrIEVuYWJsZSAqLworI2RlZmluZSBBR05YX1BNX1JGQ1RMCQkweDNjMGMgLyogUkYgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1BNX1BIWU1XCQkweDNjMTQJLyogUGh5IE1hbm5hbCBXb3JrICovCisjZGVmaW5lIEFHTlhfUE1fU09GVFJTVAkJMHgzYzE4CS8qIFBNVSBTb2Z0IFJlc2V0ICovCisjZGVmaW5lIEFHTlhfUE1fUExMQ1RMCQkweDNjMWMJLyogUE1VIFBMTCBjb250cm9sKi8KKyNkZWZpbmUgQUdOWF9QTV9URVNUUEhZCQkweDNjMjQgLyogUE1VIFRlc3QgUGh5ICovCisKKworLyogSW50ZXJydXB0IENvbnRyb2wgaW50ZXJmYWNlICovCisjZGVmaW5lIEFHTlhfSU5UX0JBU0UJCTB4NDAwMAorI2RlZmluZSBBR05YX0lOVF9TVEFUCQkweDQwMDAJLyogaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBBR05YX0lOVF9NQVNLCQkweDQwMGMJLyogaW50ZXJydXB0IG1hc2sgKi8KKy8qIEZJWE1FICovCisjZGVmaW5lCQlJUlFfVFhfQkVBQ09OCTB4MQkvKiBUWCBCZWFjb24gKi8KKyNkZWZpbmUJCUlSUV9UWF9SRVRSWQkweDgJLyogVFggUmV0cnkgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfQUNUSVZJVFkJMHgxMAkvKiBUWCBBY3Rpdml0eSAqLworI2RlZmluZQkJSVJRX1JYX0FDVElWSVRZCTB4MjAJLyogUlggQWN0aXZpdHkgKi8KKy8qIEZJWE1FIEkgZ3Vlc3MgdGhhdCBpbnN0ZWFkIFJYIGEgbm9uZSBleGlzdCBzdGFpb24ncyBwYWNrZXQgb3IKKyAgIHRoZSBzdGF0aW9uIGhhc24ndCBiZWVuIGluaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9YCTB4NDAKKyNkZWZpbmUJCUlSUV9SWF9ZCTB4ODAJLyogUlggPyAqLworI2RlZmluZQkJSVJRX1JYX0hBU0hISVQJMHgxMDAJLyogUlggSGFzaCBIaXQgKi8KKyNkZWZpbmUJCUlSUV9SWF9GUkFNRQkweDIwMAkvKiBSWCBGcmFtZSAqLworI2RlZmluZQkJSVJRX0VSUl9JTlQJMHg0MDAJLyogRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfVFhfUVVFX0ZVTEwJMHg4MDAJLyogVFggV29ya3F1ZXVlIEZ1bGwgKi8KKyNkZWZpbmUJCUlSUV9CQU5ETUFOX0VSUgkweDEwMDAwCS8qIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEVycm9yICovCisjZGVmaW5lCQlJUlFfVFhfRElTQUJMRQkweDIwMDAwCS8qIFRYIERpc2FibGUgKi8KKyNkZWZpbmUJCUlSUV9SWF9JVkFTRVNLRVkgMHg4MDAwMCAvKiBSWCBJbnZhbGlkIFNlc3Npb24gS2V5ICovCisjZGVmaW5lCQlJUlFfUlhfS0VZSURNSVMJMHgxMDAwMDAgLyogUlgga2V5IElEIE1pc21hdGNoICovCisjZGVmaW5lCQlJUlFfUkVQX1RISElUCTB4MjAwMDAwIC8qIFJlcGxheSBUaHJlc2hvbGQgSGl0ICovCisjZGVmaW5lCQlJUlFfVElNRVIxCTB4NDAwMDAwMCAvKiBUaW1lcjEgKi8KKyNkZWZpbmUJCUlSUV9USU1FUl9DTlQJMHgxMDAwMDAwMCAvKiBUaW1lciBDb3VudCAqLworI2RlZmluZQkJSVJRX1BIWV9GQVNUSU5UIDB4MjAwMDAwMDAgLyogUGh5IEZhc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCQlJUlFfUEhZX1NMT1dJTlQJMHg0MDAwMDAwMCAvKiBQaHkgU2xvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9PVEhFUgkweDgwMDAwMDAwIC8qIFVua25vdyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFHTlhfSVJRX0FMTCAgIAkweGZmZmZmZmZmCisKKy8qIFN5c3RlbSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfQkFTRQkweDQ0MDAKKyNkZWZpbmUgQUdOWF9TWVNJVEZfU1lTTU9ERQkweDQ0MDAJLyogc3lzdGVtIG1vZGUgKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfR1BJT0lOCTB4NDQxMCAvKiBHUElPIEluICovCisvKiBQSU4gbGluZXMgZm9yIGxlZHM/ICovCisjZGVmaW5lIEFHTlhfU1lTSVRGX0dQSU9VVAkweDQ0MTQJLyogR1BJTyBPdXQgKi8KKworLyogVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBBR05YX1RJTUNUTF9USU1FUjEJMHg0ODAwIC8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgQUdOWF9USU1DVExfVElNMUNUTAkweDQ4MDggLyogVGltZXIgMSBDb250cm9sICovCisKKworLyogQW50ZW5uYSBDYWxpYnJhdGlvbiBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfQkFTRQkJMHg1MDAwCisjZGVmaW5lIEFHTlhfQUNJX01PREUJCTB4NTAwMCAvKiBNb2RlICovCisjZGVmaW5lIEFHTlhfQUNJX01FQVNVUkUJMHg1MDA0IC8qIE1lYXN1cmUgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfU0VMQ0hBSU4JMHg1MDA4IC8qIFNlbGVjdCBDaGFpbiAqLworI2RlZmluZSBBR05YX0FDSV9MRU4JCTB4NTAwYyAvKiBMZW5ndGggKi8KKyNkZWZpbmUgQUdOWF9BQ0lfVElNRVIxCQkweDUwMTggLyogVGltZXIgMSAqLworI2RlZmluZSBBR05YX0FDSV9USU1FUjIJCTB4NTAxYyAvKiBUaW1lciAyICovCisjZGVmaW5lIEFHTlhfQUNJX09GRlNFVAkJMHg1MDIwIC8qIE9mZnNldCAqLworI2RlZmluZSBBR05YX0FDSV9TVEFUVVMJCTB4NTAzMCAvKiBTdGF0dXMgKi8KKyNkZWZpbmUJCUNBTElfSURMRQkweDAKKyNkZWZpbmUJCUNBTElfRE9ORQkweDEKKyNkZWZpbmUJCUNBTElfQlVTWQkweDIKKyNkZWZpbmUJCUNBTElfRVJSCTB4MworI2RlZmluZSBBR05YX0FDSV9BSUNDSEEwT1ZFCTB4NTAzNCAvKiBBSUMgQ2hhbm5lbCAwIE92ZXJyaWRlICovCisjZGVmaW5lIEFHTlhfQUNJX0FJQ0NIQTFPVkUJMHg1MDM4IC8qIEFJQyBDaGFubmVsIDEgT3ZlcnJpZGUgKi8KKworLyogR2FpbiBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBBR05YX0dDUl9CQVNFCQkweDkwMDAKKy8qIHRocmVzaG9sZCBvZiBwcmltYXJ5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhEMEEJCTB4OTAwMAkvKiB0aHJlc2hvbGQ/IEQwIEEgKi8KKy8qIGxvdyB0aHJlc2hvbGQgb2YgcHJpbWFyeSBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX1RIRDBBTAkJMHg5MDA0CS8qIHRocmVzaG9sZD8gRDAgQSBsb3cgKi8KKy8qIHRocmVzaG9sZCBvZiBzZWNvbmRhcnkgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQgkJMHg5MDA4CS8qIHRocmVzaG9sZD8gRDBfQiAqLworI2RlZmluZSBBR05YX0dDUl9EVU5TQVQJCTB4OTAwYyAvKiBkIHVuc2F0dXJhdGVkICovCisjZGVmaW5lIEFHTlhfR0NSX0RTQVQJCTB4OTAxMCAvKiBkIHNhdHVyYXRlZCAqLworI2RlZmluZSBBR05YX0dDUl9ERklSQ0FMCTB4OTAxNCAvKiBEIEZpci9DYWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfREdDVEwxMUEJMHg5MDE4IC8qIGQgZ2FpbiBjb250cm9sIDExYSAqLworI2RlZmluZSBBR05YX0dDUl9ER0NUTDExQgkweDkwMWMgLyogZCBnYWluIGNvbnRyb2wgMTFiICovCisvKiBzdHJlbmd0aCBvZiBnYWluICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5JTklUCTB4OTAyMAkvKiBnYWluIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFHTlhfR0NSX1RITk9TSUcJMHg5MDI0IC8qIHRocmVob2xkIG5vIHNpZ25hbCAqLworI2RlZmluZSBBR05YX0dDUl9DT0FSU1RFUAkweDkwMjggLyogY29hcnNlIHN0ZXBwaW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFBCTB4OTAyYyAvKiBzaWZ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1NJRlNUMTFCCTB4OTAzMCAvKiBzaWZ4IHRpbWUgMTFiICovCisjZGVmaW5lIEFHTlhfR0NSX0NXREVURUMJMHg5MDM0IC8qIGN3IGRldGVjdGlvbiAqLworI2RlZmluZSBBR05YX0dDUl8wWDM4CQkweDkwMzggLyogPz8/PyAqLworI2RlZmluZSBBR05YX0dDUl9CT0FDVAkJMHg5MDNjCS8qIEJPIEFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0lOQUNUCTB4OTA0MAkvKiBCTyBJbmFjdGl2ZSAqLworI2RlZmluZSBBR05YX0dDUl9CT0RZTkEJCTB4OTA0NAkvKiBCTyBkeW5hbWljICovCisvKiA4MDIuMTEgbW9kZShhLGIsZykgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfRElTQ09WTU9ECTB4OTA0OAkvKiBkaXNjb3ZlcnkgbW9kZSAqLworI2RlZmluZSBBR05YX0dDUl9OTElTVEFOVAkweDkwNGMJLyogbnVtYmVyIG9mIGxpc3RlbmluZyBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX05BQ1RJQU5UCTB4OTA1MAkvKiBudW1iZXIgb2YgYWN0aXZlIGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk1FQVNBTlQJMHg5MDU0CS8qIG51bWJlciBvZiBtZWFzdXJpbmcgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9OQ0FQVEFOVAkweDkwNTgJLyogbnVtYmVyIG9mIGNhcHR1cmUgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USENBUDExQQkweDkwNWMgLyogdGhyZXNob2xkIGNhcHR1cmUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQMTFCCTB4OTA2MCAvKiB0aHJlc2hvbGQgY2FwdHVyZSAxMWIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDQVBSWDExQQkweDkwNjQgLyogdGhyZXNob2xkIGNhcHR1cmUgcnggMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQUlgxMUIJMHg5MDY4IC8qIHRocmVzaG9sZCBjYXB0dXJlIHJ4IDExYiAqLworI2RlZmluZSBBR05YX0dDUl9USExFVkRSTwkweDkwNmMgLyogdGhyZXNob2xkIGxldmVsIGRyb3AgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVDAJMHg5MDcwIC8qIEdhaW5zZXQgMCAqLworI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUMQkweDkwNzQgLyogR2FpbnNldCAxICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVQyCTB4OTA3OCAvKiBHYWluc2V0IDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUlhUSU1FMTFBCTB4OTA3YyAvKiBtYXhpbXVtIHJ4IHRpbWUgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX01BWFJYVElNRTExQgkweDkwODAgLyogbWF4aW11bSByeCB0aW1lIDExYiAqLworI2RlZmluZSBBR05YX0dDUl9DT1JSVElNRQkweDkwODQgLyogY29ycmVjdGlvbiB0aW1lICovCisvKiByZXNldCB0aGUgc3Vic3lzdGVtLCAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZSAqLworI2RlZmluZSBBR05YX0dDUl9SU1RHQ1RMCTB4OTA4OAkvKiByZXNldCBnYWluIGNvbnRyb2wgKi8KKy8qIGNoYW5uZWwgcmVjZWl2aW5nICovCisjZGVmaW5lIEFHTlhfR0NSX1JYQ0hBTkVMCTB4OTA4YwkvKiByZWNlaXZlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk9JU0UwCQkweDkwOTAgLyogTm9pc2UgMCAqLworI2RlZmluZSBBR05YX0dDUl9OT0lTRTEJCTB4OTA5NCAvKiBOb2lzZSAxICovCisjZGVmaW5lIEFHTlhfR0NSX05PSVNFMgkJMHg5MDk4IC8qIE5vaXNlIDIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lHSFRICQkweDkwOWMJLyogU2lnbmFsIEhpZ2ggVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX1NJR0xUSAkJMHg5MGEwCS8qIFNpZ25hbCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEFHTlhfR0NSX0NPUlJEUk9QCTB4OTBhNCAvKiBjb3JyZWN0aW9uIGRyb3AgKi8KKy8qIHRocmVzaG9sZCBvZiB0ZXJ0aWF5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDRAkJMHg5MGE4CS8qIHRocmVzaG9sZD8gQ0QgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDUwkJMHg5MGFjCS8qIHRocmVzaG9sZD8gQ1MgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUE9XRElGRgkweDkwYjggLyogbWF4aW11bSBwb3dlciBkaWZmZXJlbmNlICovCisjZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDQJMHg5MGVjIC8qIFRyYW5zaXRpb24gQ291bnQgNCAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ1ICAgICAgCTB4OTBmMAkvKiB0cmFuc2l0aW9uIGNvdW50IDUgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNiAgICAgICAJMHg5MGY0CS8qIHRyYW5zaXRpb24gY291bnQgNiAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ3ICAgICAgIAkweDkwZjgJLyogdHJhbnNpdGlvbiBjb3V0biA3ICovCisjZGVmaW5lIEFHTlhfR0NSX1RFU1RCVVMJMHg5MTFjIC8qIHRlc3QgYnVzICovCisjZGVmaW5lIEFHTlhfR0NSX0NIQUlOTlVNCTB4OTEyMCAvKiBOdW1iZXIgb2YgQ2hhaW5zICovCisjZGVmaW5lIEFHTlhfR0NSX0FOVENGRwkJMHg5MTI0CS8qIEFudGVubmEgQ29uZmlnICovCisjZGVmaW5lIEFHTlhfR0NSX1RISlVNUAkJMHg5MTJjIC8qIHRocmVob2xkIGp1bXAgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhQT1dFUgkweDkxMzAgLyogdGhyZXNob2xkIHBvd2VyICovCisjZGVmaW5lIEFHTlhfR0NSX1RIUE9XQ0xJUAkweDkxMzQgLyogdGhyZXNob2xkIHBvd2VyIGNsaXAqLworI2RlZmluZSBBR05YX0dDUl9GT1JDRUNUTENMSwkweDkxMzggLyogRm9yY2UgR2FpbiBDb250cm9sIENsb2NrICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVRXUklURQkweDkxM2MgLyogR2FpbnNldCBXcml0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQlRGRVNUCTB4OTE0MAkvKiB0aHJlc2hvbGQgZDAgYiB0ZiBlc3RpbWF0ZSAqLworI2RlZmluZSBBR05YX0dDUl9USFJYMTFCUE9XTUlOCTB4OTE0NAkvKiB0aHJlc2hvbGQgcnggMTFiIHBvd2VyIG1pbmltdW0gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfMFgxNGMJCTB4OTE0YyAvKiA/PyAqLworI2RlZmluZSBBR05YX0dDUl8wWDE1MAkJMHg5MTUwIC8qID8/ICovCisjZGVmaW5lIEFHTlhfR0NSX1JYT1ZFUklERQkweDkxOTQJLyogcmVjaWV2ZSBvdmVycmlkZSAqLworI2RlZmluZSBBR05YX0dDUl9XQVRDSERPRwkweDkxYjAJLyogd2F0Y2hkb2cgdGltZW91dCAqLworCisKKy8qIFNwaSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9TUElfQkFTRQkJMHhkYzAwCisjZGVmaW5lIEFHTlhfU1BJX0NGRwkJMHhkYzAwIC8qIHNwaSBjb25maWd1cmF0aW9uICovCisvKiBPbmx5IGFjY2VwdCAxNiBiaXRzICovCisjZGVmaW5lIEFHTlhfU1BJX1dNU1cJCTB4ZGMwNAkvKiB3cml0ZSBtb3N0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIE9ubHkgYWNjZXB0IDE2IGJpdHMgKi8KKyNkZWZpbmUgQUdOWF9TUElfV0xTVwkJMHhkYzA4CS8qIHdyaXRlIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKyNkZWZpbmUgQUdOWF9TUElfQ1RMCQkweGRjMGMJLyogc3BpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9TUElfUk1TVwkJMHhkYzEwIC8qIHJlYWQgbW9zdCBzaWduaWZpY2FudCB3b3JkICovCisjZGVmaW5lIEFHTlhfU1BJX1JMU1cJCTB4ZGMxNCAvKiByZWFkIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgKi8KKy8qIFNQSSBDb250cm9sIE1hc2sgKi8KKyNkZWZpbmUJCVNQSV9SRUFEX0NUTAkJMHg0MDAwIC8qIHJlYWQgY29udHJvbCAqLworI2RlZmluZQkJU1BJX0JVU1lfQ1RMCQkweDgwMDAgLyogYnVzeSBjb250cm9sICovCisvKiBSRiBhbmQgc3ludGggY2hpcHMgaW4gc3BpICovCisjZGVmaW5lCQlSRl9DSElQMAkweDQwMAorI2RlZmluZQkJUkZfQ0hJUDEJMHg4MDAKKyNkZWZpbmUJCVJGX0NISVAyCTB4MTAwMAorI2RlZmluZQkJU1lOVEhfQ0hJUAkweDIwMDAKKworLyogVW5rbm93biByZWdpc3RlciAqLworI2RlZmluZSBBR05YX1VOS05PV05fQkFTRQkweDc4MDAKKworLyogRklYTUUgTW9uaXRvckdhaW4gKi8KKyNkZWZpbmUgQUdOWF9NT05HQ1JfQkFTRQkweDEyMDAwCisKKy8qIEdhaW4gVGFibGUgKi8KKyNkZWZpbmUgQUdOWF9HQUlOX1RBQkxFCQkweDEyNDAwCisKKy8qIFRoZSBpbml0aWFsIEZJUiBjb2VmZmljaWVudCB0YWJsZSAqLworI2RlZmluZSBBR05YX0ZJUl9CQVNFCQkweDE5ODA0CisKKyNkZWZpbmUgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTAkweDgwMAorCisvKiBlZXByb20gY29tbWFuZHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9OVUxMCQkweDAgLyogTlVMTCAqLworI2RlZmluZSBFRVBST01fQ01EX1dSSVRFCTB4MiAvKiB3cml0ZSAqLworI2RlZmluZSBFRVBST01fQ01EX1JFQUQJCTB4MyAvKiByZWFkICovCisjZGVmaW5lIEVFUFJPTV9DTURfU1RBVFVTUkVBRAkweDUgLyogc3RhdHVzIHJlZ2lzdGVyIHJlYWQgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9XUklURUVOQUJMRQkweDYgLyogd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9DTURfQ09ORklHVVJFCTB4NyAvKiBjb25maWd1cmUgKi8KKworI2RlZmluZSBFRVBST01fREFUQUZPUkNPRklHVVJFCTB4NiAvKiA/Pz8gKi8KKworLyogZWVwcm9tIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfU1VCVklECTB4MCAvKiBTdWIgVmVuZG9yIElEICovCisjZGVmaW5lIEVFUFJPTV9BRERSX1NVQlNJRAkweDIgLyogU3ViIFN5c3RlbSBJRCAqLworI2RlZmluZSBFRVBST01fQUREUl9NQUNBRERSCTB4MTQ2IC8qIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIEVFUFJPTV9BRERSX0xPVFlQRQkweDE0ZiAvKiBMTyB0eXBlICovCisKK3N0cnVjdCBhZ254X2VlcHJvbSB7CisJdTggZGF0YTsJLyogZGF0ZSAqLworCXUxNiBhZGRyZXNzOwkvKiBhZGRyZXNzIGluIEVFUFJPTSAqLworCXU4IGNtZDsJCS8qIGNvbW1hbmQsIHVua25vd24sIHN0YXR1cyAqLworfSAgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIEFHTlhfRUVQUk9NX0NPTU1BTkRfU0hJRlQJNQorI2RlZmluZSBBR05YX0VFUFJPTV9DT01NQU5EX1NUQVQJMHgwMQorCit2b2lkIGRpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGVuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3U4IHJlYWRfZnJvbV9lZXByb20oc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTE2IGFkZHJlc3MpOwordm9pZCBhZ254X2h3X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitpbnQgYWdueF9od19yZXNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBhZ254X3NldF9zc2lkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pOwordm9pZCBhZ254X3NldF9ic3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqYnNzaWQpOwordm9pZCBlbmFibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBkaXNhYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgY2FsaWJyYXRlX2FudGVubmFfcGVyaW9kKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNlbmRpZiAvKiBBR05YX1BIWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3JmLmMKQEAgLTAsMCArMSw4OTQgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAidGFibGUuaCIKKworLyogRklYTUUhICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdywKKwkJICAgICAgdTE2IHNpemUsIHUzMiBjb250cm9sKQoreworCXUzMiByZWc7CisJdTMyIGxzdyA9IHN3ICYgMHhmZmZmOwkJLyogbG93ZXIgMTYgYml0cyBvZiBzdyovCisJdTMyIG1zdyA9IHN3ID4+IDE2OwkJLyogaGlnaCAxNiBiaXRzIG9mIHN3ICovCisKKwkvKiBGSVhNRSBXcml0ZSBNb3N0IFNpZ25pZmljYW50IFdvcmQgb2YgdGhlIDMyYml0IGRhdGEgdG8gTVNXICovCisJLyogRklYTUUgQW5kIExlYXN0IFNpZ25pZmljYW50IFdvcmQgdG8gTFNXICovCisJaW93cml0ZTMyKChsc3cpLCByZWdpb24gKyBBR05YX1NQSV9XTFNXKTsKKwlpb3dyaXRlMzIoKG1zdyksIHJlZ2lvbiArIEFHTlhfU1BJX1dNU1cpOworCXJlZyA9IGNoaXBfaWRzIHwgc2l6ZSB8IGNvbnRyb2w7CisJLyogV3JpdGUgY2hpcCBpZChzKSwgd3JpdGUgc2l6ZSBhbmQgYnVzeSBjb250cm9sIHRvIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoKHJlZyksIHJlZ2lvbiArIEFHTlhfU1BJX0NUTCk7CisJLyogV2FpdCBmb3IgQnVzeSBjb250cm9sIHRvIGNsZWFyICovCisJc3BpX2RlbGF5KCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgU3ludGggcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zeV93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHgxNSBpcyBhIG1hZ2ljIHZhbHVlKi8KKwlzcGlfd3JpdGUocmVnaW9uLCBjaGlwX2lkcywgc3csIDB4MTUsIFNQSV9CVVNZX0NUTCk7Cit9CisKKy8qCisgKiBXcml0ZSB0byBTUEkgUkYgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwaV9yZl93cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhkIGlzIGEgbWFnaWMgdmFsdWUqLworCXNwaV93cml0ZShyZWdpb24sIGNoaXBfaWRzLCBzdywgMHhkLCBTUElfQlVTWV9DVEwpOworfSAvKiBzcGlfcmZfd3JpdGUgKi8KKworLyoKKyAqIFdyaXRlIHRvIFNQSSB3aXRoIFJlYWQgQ29udHJvbCBiaXQgc2V0CisgKi8KK2lubGluZSB2b2lkIHNwaV9yY193cml0ZSh2b2lkIF9faW9tZW0gKnJlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpCit7CisJLyogRklYTUUgdGhlIHNpemUgMHhlNSBpcyBhIG1hZ2ljIHZhbHVlICovCisJc3BpX3dyaXRlKHJlZ2lvbiwgY2hpcF9pZHMsIHN3LCAweGU1LCBTUElfQlVTWV9DVEx8U1BJX1JFQURfQ1RMKTsKK30KKworLyogR2V0IHRoZSBhY3RpdmUgY2hhaW5zJ3MgY291bnQgKi8KK3N0YXRpYyBpbnQgZ2V0X2FjdGl2ZV9jaGFpbnMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgbnVtID0gMDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAocmVnID09IDEpCisJCW51bSsrOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDEsIDB4MjEpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisJaWYgKHJlZyA9PSAxKQorCQludW0rKzsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAyLCAweDIxKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmIChyZWcgPT0gMSkKKwkJbnVtKys7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyNik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgzMyAhPSByZWcpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbm1hdGNoZWQgcmYgY2hpcHMgcmVzdWx0XG4iKTsKKworCXJldHVybiBudW07Cit9IC8qIGdldF9hY3RpdmVfY2hhaW5zICovCisKK3ZvaWQgcmZfY2hpcHNfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJaW50IG51bTsKKwlBR05YX1RSQUNFOworCisJaWYgKHByaXYtPnJldmlkID09IDEpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQpOworCQlyZWcgfD0gMHg4OworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisJfQorCisJLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byAyMDBOUyAqLworICAgICAgICByZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisgICAgICAgIHJlZyAmPSB+MHhGOworICAgICAgICByZWcgfD0gMHgzOworICAgICAgICBhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKyAgICAgICAgLyogU2V0IFNQSSBjbG9jayBzcGVlZCB0byA1ME5TICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTEwMSk7CisKKwludW0gPSBnZXRfYWN0aXZlX2NoYWlucyhwcml2KTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiQWN0aXZlIGNoYWlucyBhcmUgJWRcbiIsIG51bSk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weEY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTkwOCk7Cit9IC8qIHJmX2NoaXBzX2luaXQgKi8KKworCitzdGF0aWMgdTMyIGNoYW5uZWxfdGJsWzE1XVs5XSA9IHsKKwl7MCwgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsxLCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWE0LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MiwgIDB4MDAsIDB4MDAsIDB4NjE1LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezMsICAweDAwLCAweDAwLCAweDYxYSwgMHgwMCwgMHgxYWUsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs0LCAgMHgwMCwgMHgwMCwgMHg2MWYsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKKwl7NSwgIDB4MDAsIDB4MDAsIDB4NjI0LCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezYsICAweDAwLCAweDAwLCAweDYxZiwgMHgwMCwgMHgxYjMsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs3LCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWIzLCAweDI4LCAweDAwLCAweDFlfSwKKwl7OCwgIDB4MDAsIDB4MDAsIDB4NjI5LCAweDAwLCAweDFiMywgMHgyOCwgMHgwMCwgMHgxZX0sCisJezksICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMCwgMHgwMCwgMHgwMCwgMHg2MjksIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTEsIDB4MDAsIDB4MDAsIDB4NjJlLCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezEyLCAweDAwLCAweDAwLCAweDYzMywgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMywgMHgwMCwgMHgwMCwgMHg2MjgsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTQsIDB4MDAsIDB4MDAsIDB4NjQ0LCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCit9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2hhbm5lbF90Ymxfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCByZWdfbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlyZWcgPSBjaGFubmVsX3RibFtjaGFubmVsXVtyZWdfbnVtXTsKKwlyZWcgPDw9IDQ7CisJcmVnIHw9IHJlZ19udW07CisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc3ludGhfZnJlcV9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBTZXQgdGhlIENsb2NrIGJpdHMgdG8gNTBOUyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKKwlyZWcgJj0gfjB4RjsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKKworCS8qIFdyaXRlIDB4MDBjMCB0byBMU1cgYW5kIDB4MyB0byBNU1cgb2YgU3ludGggQ2hpcCAqLworCXNwaV9zeV93cml0ZShjdGwsIFNZTlRIX0NISVAsIDB4MzAwYzApOworCisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgMHgzMik7CisKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDEgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAxKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDMgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCAzKTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDYgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA2KTsKKwkvKiAjIFdyaXRlIHRvIFJlZ2lzdGVyIDUgb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA1KTsKKwkvKiAjIFdyaXRlIHRvIHJlZ2lzdGVyIDggb24gdGhlIFN5bnRoIENoaXAgKi8KKwljaGFubmVsX3RibF93cml0ZShwcml2LCBjaGFubmVsLCA4KTsKKworCS8qIEZJWE1FIENsZWFyIHRoZSBjbG9jayBiaXRzICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKK30gLyogc3ludGhfY2hpcF9pbml0ICovCisKKworc3RhdGljIHZvaWQgYW50ZW5uYV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIGludCBudW1fYW50ZW5uYSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXN3aXRjaCAobnVtX2FudGVubmEpIHsKKwljYXNlIDE6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAxKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDcpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzApOworCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjUpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA5MCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgODApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMTYpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMjApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDcwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDMyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTElTVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQ0FQVEFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgMzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMzYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPRFlOQSwgMzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgNzApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCA3MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCA0OCk7CisvLwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAxNik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3cgYW50ZW5uYSBudW1iZXJcbiIpOworCX0KK30gLyogYW50ZW5uYV9pbml0ICovCisKK3N0YXRpYyB2b2lkIGNoYWluX3VwZGF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgY2hhaW4pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlpZiAocmVnID09IDB4NCkKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCWVsc2UgaWYgKHJlZyAhPSAweDApCisgICAgIAkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworICAgICAgICBlbHNlIHsKKwkJaWYgKGNoYWluID09IDMgfHwgY2hhaW4gPT0gNikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIHJlZ3wweDEwMDApOworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCQl9IGVsc2UgaWYgKGNoYWluID09IDIgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIHJlZ3wweDEwMDApOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTAwNSk7CisJCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ODI0KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA9PSAxKSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgcmVnfDB4MTAwMCk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA0KTsKKwkJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhjMzYpOworCQl9CisJfQorCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgMDoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaWYgKGNoYWluID09IDYgfHwgY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMik7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMDA1KTsKKwkJfSBlbHNlIGlmIChjaGFpbiA8IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDIpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNoYWluID09IDMpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gMikgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAwKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCAweDEyMDEpOworCQl9IGVsc2UgaWYgKGNoYWluID09IDEpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMCk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gNCkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAxKTsKKwkJfSBlbHNlIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCAweDEyMDMpOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTIwMSk7CisJCX0KKwl9Cit9IC8qIGNoYWluX3VwZGF0ZSAqLworCitzdGF0aWMgdm9pZCBhbnRlbm5hX2NvbmZpZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIFdyaXRlIDB4MCB0byB0aGUgVFggTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyIEVuYWJsZSBiaXQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7CisJcmVnICY9IH4weDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworCisJLyogRklYTUUgKi8KKwkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBudW1iZXIgb2YgQW50ZW5uYWUgKi8KKwlhbnRlbm5hX2luaXQocHJpdiwgMyk7CisKKwkvKiBGSVhNRSBVcGRhdGUgUG93ZXIgVGVtcGxhdGVzIGZvciBjdXJyZW50IHZhbGlkIFN0YXRpb25zICovCisJLyogc3RhX3Bvd2VyX2luaXQocHJpdiwgMCk7Ki8KKworCS8qIEZJWE1FIHRoZSBudW1iZXIgb2YgY2hhaW5zIHNob3VsZCBnZXQgZnJvbSBlZXByb20qLworCWNoYWluX3VwZGF0ZShwcml2LCBBR05YX0NIQUlOU19NQVgpOworfSAvKiBhbnRlbm5hX2NvbmZpZyAqLworCit2b2lkIGNhbGlicmF0ZV9vc2NpbGxhdG9yKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnIHw9IDB4MTA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisJLyogKFJlc2lkdWFsIERDIENhbGlicmF0aW9uKSB0byBDYWxpYnJhdGlvbiBNb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgyKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEwMDQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHgzZmYpOworCS8qIChUWCBMTyBDYWxpYnJhdGlvbikgdG8gQ2FsaWJyYXRpb24gTW9kZSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4NCk7CisKKwlkbyB7CisJCXUzMiAgcmVnMSwgcmVnMiwgcmVnMzsKKwkJLyogRW5hYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWVuYWJsZV9wb3dlcl9zYXZpbmcocHJpdik7CisJCS8qIFNhdmUgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgdG8gcmVzdG9yZSAqLworCQlyZWcxID0gaW9yZWFkMzIoY3RsICsgMHgxMTAwMCk7CisJCXJlZzIgPSBpb3JlYWQzMihjdGwgKyAweGVjNTApOworCQlyZWczID0gaW9yZWFkMzIoY3RsICsgMHhlYzU0KTsKKwkJd21iKCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwMCwgMHhjZmRmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCAweDcwKTsKKwkJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzICovCisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDAsIHJlZzEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTQsIHJlZzMpOworCQkvKiBEaXNhYmxlIFBvd2VyIFNhdmluZyBDb250cm9sICovCisJCWRpc2FibGVfcG93ZXJfc2F2aW5nKHByaXYpOworCX0gd2hpbGUgKDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMCk7Cit9IC8qIGNhbGlicmF0ZV9vc2NpbGxhdG9yICovCisKKworc3RhdGljIHZvaWQgcmFkaW9fY2hhbm5lbF9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IGZyZXEgPSBwcml2LT5iYW5kLmNoYW5uZWxzW2NoYW5uZWwgLSAxXS5jZW50ZXJfZnJlcTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwkvKiBTZXQgU1BJIENsb2NrIHRvIDUwIE5zICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJLyogQ2xlYXIgdGhlIERpc2FibGUgVHggaW50ZXJydXB0IGJpdCBpbiBJbnRlcnJ1cHQgTWFzayAqLworLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJcmVnICY9IH5JUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJLyogQmFuZCBTZWxlY3Rpb24gKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIHJlZyk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIFNpTGFicyBDaGlwIEZyZXF1ZW5jeSAqLworCXN5bnRoX2ZyZXFfc2V0KHByaXYsIGNoYW5uZWwpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgyMDAwOTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgMHg1KTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDExMDApOworCisJLyogTG9hZCB0aGUgTW9uaXRvckdhaW4gVGFibGUgKi8KKwltb25pdG9yX2dhaW5fdGFibGVfaW5pdChwcml2KTsKKworCS8qIExvYWQgdGhlIFRYIEZpciB0YWJsZSAqLworCXR4X2Zpcl90YWJsZV9pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgyMik7CisJdWRlbGF5KDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4ZmYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgfD0gMHg0ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIHJlZyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA4LCAweDEpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMGMsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwOCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4Yyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTAsIDB4NmUpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTQsIDB4NmMpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMSk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEFudGVubmEgKi8KKwkvKiBhbnRlbm5hX2NhbGlicmF0ZShwcml2KTsgKi8KKwkvKiBDYWxpYnJhdGUgdGhlIFR4TG9jYWxPc2NpbGxhdG9yICovCisJY2FsaWJyYXRlX29zY2lsbGF0b3IocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4YSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMTgsIDB4Yik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDApOworCisJLyogV3JpdGUgRnJlcXVlbmN5IHRvIEdhaW4gQ29udHJvbCBDaGFubmVsICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhDSEFORUwsIGZyZXEpOworCS8qIFdyaXRlIDB4MTQwMDAwL0ZyZXEgdG8gMHg5YzA4ICovCisJcmVnID0gMHgxNDAwMDAvZnJlcTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDljMDgsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7CisJcmVnICY9IH4weDgwMTAwMDMwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyAmPSB+MHgyMDAwOTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgwKTsKKworLyogRklYTUUgQWNjb3JkaW5nIHRvIE51bWJlciBvZiBDaGFpbnM6ICovCisKKy8qIAkJCSAgIDEuIDE6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcHMgMSArMiAgKi8KKy8qIAkJCSAgIDIuIDI6ICovCisvKiAgICAgICAgICAxLiBXcml0ZSAweDEyMDMgdG8gUkYgQ2hpcCAwICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICovCisvKiAgICAgICAgICAzLiBXcml0ZSAweDEyMDEgdG8gUkYgQ2hpcCAxICAqLworLyogCQkJICAgMy4gMzogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMSB0byBSRiBDaGlwIDEgKyAyICAqLworLyogCQkJICAgNC4gNDogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKyAxICovCisvKiAgICAgICAgICAyLiBXcml0ZSAweDEyMDAgdG8gUkYgQ2hpcCAyICAqLworCisvKiAJCQkgICA1LiA2OiAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDMpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDEpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJLyogRklYTUUgU2V0IHRoZSBEaXNhYmxlIFR4IGludGVycnVwdCBiaXQgaW4gSW50ZXJydXB0IE1hc2sKKwkgICAoT3IgMHgyMDAwMCB0byBJbnRlcnJ1cHQgTWFzaykgKi8KKy8qIAlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfSU5UX01BU0spOyAqLworLyogCXJlZyB8PSBJUlFfVFhfRElTQUJMRTsgKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0lOVF9NQVNLLCByZWcpOyAqLworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJLyogQ29uZmlndXJlIHRoZSBBbnRlbm5hICovCisJYW50ZW5uYV9jb25maWcocHJpdik7CisKKwkvKiBXcml0ZSAweDAgdG8gRGlzY292ZXJ5IE1vZGUgRW5hYmxlIGRldGVjdCBHLCBCLCBBIHBhY2tldD8gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFKTsKKwlyZWcgfD0gMHg4MDAwMDAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1JYTV9SRVFSQVRFLCByZWcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKKworCS8qIGVuYWJsZSByYWRpbyBvbiBhbmQgdGhlIHBvd2VyIExFRCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VUKTsKKwlyZWcgJj0gfjB4MTsKKwlyZWcgfD0gMHgyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgcmVnKTsKK30gLyogcmFkaW9fY2hhbm5lbF9zZXQgKi8KKworc3RhdGljIHZvaWQgYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE3MDApOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDApOworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI3KTsKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyNyk7CisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLLCAweDEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9vZmZzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIGNoYWluKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBvZmZzZXQ7CisKKwlpb3dyaXRlMzIoKGNoYWluKSwgY3RsICsgQUdOWF9BQ0lfU0VMQ0hBSU4pOworCXVkZWxheSgxMCk7CisJb2Zmc2V0ID0gKGlvcmVhZDMyKGN0bCArIEFHTlhfQUNJX09GRlNFVCkpOworCXByaW50ayhQRlggIkNoYWluIGlzIDB4JXgsIE9mZnNldCBpcyAweCV4XG4iLCBjaGFpbiwgb2Zmc2V0KTsKK30KKwordm9pZCBwcmludF9vZmZzZXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDApOworCXByaW50X29mZnNldChwcml2LCA0KTsKKwlwcmludF9vZmZzZXQocHJpdiwgMSk7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDUpOworCXByaW50X29mZnNldChwcml2LCAyKTsKKwlwcmludF9vZmZzZXQocHJpdiwgNik7Cit9CisKKworc3RydWN0IGNoYWlucyB7CisJdTMyIGNhbGk7CQkvKiBjYWxpYnJhdGUgIHZhbHVlKi8KKworI2RlZmluZSAgTkVFRF9DQUxJQlJBVEUJCTAKKyNkZWZpbmUgIFNVQ0NFU1NfQ0FMSUJSQVRFCTEKKwlpbnQgc3RhdHVzOworfTsKKworc3RhdGljIHZvaWQgY2hhaW5fY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBjYWxpYnJhID0gY2hhaW5zW251bV0uY2FsaTsKKworCWlmIChudW0gPCAzKQorCQljYWxpYnJhIHw9IDB4MTQwMDsKKwllbHNlCisJCWNhbGlicmEgfD0gMHgxNTAwOworCisJc3dpdGNoIChudW0pIHsKKwljYXNlIDA6CisJY2FzZSA0OgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgY2FsaWJyYSk7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDU6CisJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxLCBjYWxpYnJhKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgNjoKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIGNhbGlicmEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9IC8qIGNoYWluX2NhbGlicmF0ZSAqLworCisKK3N0YXRpYyB2b2lkIGlubGluZSBnZXRfY2FsaWJyZXRlX3ZhbHVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBjaGFpbnMgKmNoYWlucywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bSkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgb2Zmc2V0OworCisJaW93cml0ZTMyKChudW0pLCBjdGwgKyBBR05YX0FDSV9TRUxDSEFJTik7CisJLyogRklYTUUgKi8KKwl1ZGVsYXkoMTApOworCW9mZnNldCA9IChpb3JlYWQzMihjdGwgKyBBR05YX0FDSV9PRkZTRVQpKTsKKworCWlmIChvZmZzZXQgPCAweGYpIHsKKwkJY2hhaW5zW251bV0uc3RhdHVzID0gU1VDQ0VTU19DQUxJQlJBVEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnVtID09IDAgfHwgbnVtID09IDEgfHwgbnVtID09IDIpIHsKKwkJaWYgKCAwID09IGNoYWluc1tudW1dLmNhbGkpCisJCQljaGFpbnNbbnVtXS5jYWxpID0gMHhmZjsKKwkJZWxzZQorCQkJY2hhaW5zW251bV0uY2FsaS0tOworCX0gZWxzZQorCQljaGFpbnNbbnVtXS5jYWxpKys7CisKKwljaGFpbnNbbnVtXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhbGlicmFfZGVsYXkoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpID0gMTAwOworCisJd21iKCk7CisJd2hpbGUgKGktLSkgeworCQlyZWcgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfU1RBVFVTKSk7CisJCWlmIChyZWcgPT0gMHg0MDAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmICghaSkKKwkJcHJpbnRrKFBGWCAiY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKK30KKwordm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXN0cnVjdCBjaGFpbnMgY2hhaW5zWzddOworCXVuc2lnbmVkIGludCBpLCBqOworCUFHTlhfVFJBQ0U7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmIChpID09IDMpCisJCQljb250aW51ZTsKKworCQljaGFpbnNbaV0uY2FsaSA9IDB4N2Y7CisJCWNoYWluc1tpXS5zdGF0dXMgPSBORUVEX0NBTElCUkFURTsKKwl9CisKKwkvKiBGSVhNRSAweDMwMCBpcyBhIG1hZ2ljIG51bWJlciAqLworCWZvciAoaiA9IDA7IGogPCAweDMwMDsgaisrKSB7CisJCWlmIChjaGFpbnNbMF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbMl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNF0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNV0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFICYmCisJCSAgICBjaGFpbnNbNl0uc3RhdHVzID09IFNVQ0NFU1NfQ0FMSUJSQVRFKQorCQkJYnJlYWs7CisKKwkJLyogQXR0ZW50aW9uLCB0aGVyZSBpcyBubyBjaGFpbiAzICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisJCQlpZiAoY2hhaW5zW2ldLnN0YXR1cyA9PSBORUVEX0NBTElCUkFURSkKKwkJCQljaGFpbl9jYWxpYnJhdGUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCQkvKiBXcml0ZSAweDEgdG8gQ2FsaWJyYXRpb24gTWVhc3VyZSAqLworCQlpb3dyaXRlMzIoKDB4MSksIGN0bCArIEFHTlhfQUNJX01FQVNVUkUpOworCQljYWxpYnJhX2RlbGF5KHByaXYpOworCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWlmIChpID09IDMpCisJCQkJY29udGludWU7CisKKwkJCWdldF9jYWxpYnJldGVfdmFsdWUocHJpdiwgY2hhaW5zLCBpKTsKKwkJfQorCX0KKwlwcmludGsoUEZYICJDbGlicmF0ZSB0aW1lcyBpcyAlZFxuIiwgaik7CisJcHJpbnRfb2Zmc2V0cyhwcml2KTsKK30gLyogZG9fY2FsaWJyYXRpb24gKi8KKwordm9pZCBhbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAweDMpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAweDMpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAweDFmKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0FDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9JTkFDVCwgMHgyNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAweDIwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQSwgMHg2NCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQiwgMHg0Nik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzYyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDB4MzApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjApOworCS8qIEZpeG1lICovCisJdWRlbGF5KDgwKTsKKwkvKiAgICAxLiBTaG91bGQgcmVhZCAweDAgICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjIpOworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAoMHgwICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDUpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCXJlZyB8PSAweDFjMDAwMDMyOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUExMQ1RMKTsKKwlyZWcgfD0gMHgwMDAzZjA3OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOworCXJlZyB8PSAweDQwOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhmZjgpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NIQUlOTlVNLCAweDYpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTk4NzQsIDB4MCk7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTcwMCk7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEJhc2VCYW5kRmlsdGVyICovCisJYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUocHJpdik7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDAyKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCAweDFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgyNyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKworCS8qIE1lYXN1cmUgQ2FsaWJyYXRpb24gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NRUFTVVJFLCAweDEpOworCWNhbGlicmFfZGVsYXkocHJpdik7CisKKwkvKiBkbyBjYWxpYnJhdGlvbiAqLworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEpOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMik7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMiwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgwKTsKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworfSAvKiBhbnRlbm5hX2NhbGlicmF0ZSAqLworCit2b2lkIF9fYW50ZW5uYV9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJLyogQ2FsaWJyYXRlIHRoZSBCYXNlQmFuZEZpbHRlciAqLworCS8qIGJhc2VfYmFuZF9maWx0ZXJfY2FsaWJyYXRlKHByaXYpOyAqLworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDIpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDEsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCAweDFkKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgxKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01PREUsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNDAwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNTAwKTsKKwkvKiBNZWFzdXJlIENhbGlicmF0aW9uICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTUVBU1VSRSwgMHgxKTsKKwljYWxpYnJhX2RlbGF5KHByaXYpOworCWRvX2NhbGlicmF0aW9uKHByaXYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHgwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDApOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCByZWcpOworCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUV1JJVEUsIDB4MCk7CisKKwkvKiBXcml0ZSAweDMgR2FpbiBDb250cm9sIERpc2NvdmVyeSBNb2RlICovCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworfQorCitpbnQgYWdueF9zZXRfY2hhbm5lbChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlBR05YX1RSQUNFOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2hhbm5lbCBpcyAlZCAlc1xuIiwgY2hhbm5lbCwgX19mdW5jX18pOworCXJhZGlvX2NoYW5uZWxfc2V0KHByaXYsIGNoYW5uZWwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FjNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmMKQEAgLTAsMCArMSwyMTkgQEAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAic3RhLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKwordm9pZCBoYXNoX3JlYWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXJlZ2xvICY9IDB4RkZGRjsKKwlyZWdsbyB8PSAweDMwMDAwMDAwOworCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLworCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKKworCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKworCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7CisgICAgICAgIHJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlwcmludGsoUEZYICJSWCBoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKK30KKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjX2FkZHIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVXBkYXRlIGhhc2ggdGFibGU6IEludmFsaWQgaHdhZGRyIVxuIik7CisKKwlyZWdoaSA9IG1hY19hZGRyWzBdIDw8IDI0IHwgbWFjX2FkZHJbMV0gPDwgMTYgfCBtYWNfYWRkclsyXSA8PCA4IHwgbWFjX2FkZHJbM107CisJcmVnbG8gPSBtYWNfYWRkcls0XSA8PCA4IHwgbWFjX2FkZHJbNV07CisJcmVnbG8gfD0gMHgxMDAwMDAwMDsJLyogU2V0IGhhc2ggY29tbW1hbmQgKi8KKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisKKyAgICAgICAgcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlmICghKHJlZ2xvICYgMHg4MDAwMDAwMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVcGRhdGUgaGFzaCB0YWJsZSBmYWlsZWRcbiIpOworfQorCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiByZWdoaSwgdTMyIHJlZ2xvLCB1OCBzdGFfaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisKKwlyZWdsbyAmPSAweEZGRkY7CisJcmVnbG8gfD0gMHgyMDAwMDAwMDsKKwlyZWdsbyB8PSAweDQwMDAwMDAwOwkvKiBTZXQgc3RhdHVzIGJ1c3kgKi8KKwlyZWdsbyB8PSBzdGFfaWQgPDwgMTY7CisKKwlpb3dyaXRlMzIoMCwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfRkxBRyk7CisJaW93cml0ZTMyKHJlZ2hpLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiUlggaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisKK30KKwordm9pZCBoYXNoX2R1bXAoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWdoaSwgcmVnbG87CisKKwlyZWdsbyA9IDB4MDsJCS8qIGR1bXAgY29tbWFuZCAqLworCXJlZ2xvfD0gMHg0MDAwMDAwMDsgIAkvKiBzdGF0dXMgYml0ICovCisJaW93cml0ZTMyKHJlZ2xvLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCWlvd3JpdGUzMihzdGFfaWQgPDwgMTYsIGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKworCXVkZWxheSg4MCk7CisKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJcHJpbnRrKFBGWCAiaGFzaCBjbWQgYXJlIDogJS44eCUuOHhcbiIsIHJlZ2hpLCByZWdsbyk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlwcmludGsoUEZYICJoYXNoIGZsYWcgaXMgOiAlLjh4XG4iLCByZWdoaSk7CisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0RVTVBfTVNUKTsKKwlyZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9MU1QpOworCXByaW50ayhQRlggImhhc2ggZHVtcCBtc3QgbHN0OiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBKTsKKwlwcmludGsoUEZYICJoYXNoIGR1bXAgZGF0YTogJS44eFxuIiwgcmVnaGkpOworfQorCit2b2lkIGdldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisgICAgICAgIG1lbWNweV9mcm9taW8ocG93ZXIsIGN0bCArIEFHTlhfVFhNX1NUQVBPV1RFTVAgKyBzaXplb2YoKnBvd2VyKSAqIHN0YV9pZHgsCisJCSAgICAgIHNpemVvZigqcG93ZXIpKTsKK30KKworaW5saW5lIHZvaWQKK3NldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJLyogRklYTUUgICAyLiBXcml0ZSBUZW1wbGF0ZSB0byBvZmZzZXQgKyBzdGF0aW9uIG51bWJlciAgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oY3RsICsgQUdOWF9UWE1fU1RBUE9XVEVNUCArIHNpemVvZigqcG93ZXIpICogc3RhX2lkeCwKKwkJICAgIHBvd2VyLCBzaXplb2YoKnBvd2VyKSk7Cit9CisKKwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJbWVtY3B5X2Zyb21pbyh0eF93cSwgZGF0YSArIEFHTlhfUERVX1RYX1dRICsgc2l6ZW9mKCp0eF93cSkgKiBTVEFfVFhfV1FfTlVNICogc3RhX2lkeCArCisJCSAgICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCAgc2l6ZW9mKCp0eF93cSkpOworCit9CisKK2lubGluZSB2b2lkIHNldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwltZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVfVFhfV1EgKyBzaXplb2YoKnR4X3dxKSAqIFNUQV9UWF9XUV9OVU0gKiBzdGFfaWR4ICsKKwkJICAgIHNpemVvZigqdHhfd3EpICogd3FfaWR4LCB0eF93cSwgc2l6ZW9mKCp0eF93cSkpOworfQorCisKK3ZvaWQgZ2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworCW1lbWNweV9mcm9taW8oc3RhLCBkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgICAgc2l6ZW9mKCpzdGEpKTsKK30KKworaW5saW5lIHZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKworICAgICAgICBtZW1jcHlfdG9pbyhkYXRhICsgQUdOWF9QRFVQT09MICsgc2l6ZW9mKCpzdGEpICogc3RhX2lkeCwKKwkJICAgIHN0YSwgc2l6ZW9mKCpzdGEpKTsKK30KKworLyogRklYTUUgKi8KK3ZvaWQgc3RhX3Bvd2VyX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCW1lbXNldCgmcG93ZXIsIDAsIHNpemVvZihwb3dlcikpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMHgxKTsKKwlwb3dlci5yZWcgPSBjcHVfdG9fbGUzMihyZWcpOworCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBzdGFfaWR4KTsKKwl1ZGVsYXkoNDApOworfSAvKiBhZGRfcG93ZXJfdGVtcGxhdGUgKi8KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLworc3RhdGljIHZvaWQgc3RhX3R4X3dvcmtxdWV1ZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YV90eF93cSB0eF93cTsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpOworCisJbWVtc2V0KCZ0eF93cSwgMCwgc2l6ZW9mKHR4X3dxKSk7CisKKwlyZWcgPSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfVkFMSUQsIFdPUktfUVVFVUVfVkFMSURfU0hJRlQsIDEpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktfUVVFVUVfQUNLX1RZUEUsIFdPUktfUVVFVUVfQUNLX1RZUEVfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoV09SS19RVUVVRV9BQ0tfVFlQRSwgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVCwgMCk7CisJdHhfd3EucmVnMiB8PSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogU3VwcG9zZSBhbGwgOCB0cmFmZmljIGNsYXNzIGFyZSB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IFNUQV9UWF9XUV9OVU07IGkrKykKKwkJc2V0X3N0YV90eF93cShwcml2LCAmdHhfd3EsIHN0YV9pZHgsIGkpOworfSAvKiBzdGFfdHhfd29ya3F1ZXVlX2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBzdGFfdHJhZmZpY19pbml0KHN0cnVjdCBhZ254X3N0YV90cmFmZmljICp0cmFmZmljKQoreworCXUzMiByZWc7CisJbWVtc2V0KHRyYWZmaWMsIDAsIHNpemVvZigqdHJhZmZpYykpOworCisJcmVnID0gYWdueF9zZXRfYml0cyhORVdfUEFDS0VULCBORVdfUEFDS0VUX1NISUZULCAxKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUUkFGRklDX1ZBTElELCBUUkFGRklDX1ZBTElEX1NISUZULCAxKTsKKy8vCXJlZyB8PSBhZ254X3NldF9iaXRzKFRSQUZGSUNfQUNLX1RZUEUsIFRSQUZGSUNfQUNLX1RZUEVfU0hJRlQsIDEpOworCXRyYWZmaWMtPnJlZzAgPSBjcHVfdG9fbGUzMihyZWcpOworCisJLyogCTMuIHNldHRpbmcgUlggU2VxdWVuY2UgTnVtYmVyIHRvIDQwOTUgKi8KKwlyZWcgPSBhZ254X3NldF9iaXRzKFJYX1NFUVVFTkNFX05VTSwgUlhfU0VRVUVOQ0VfTlVNX1NISUZULCA0MDk1KTsKKwl0cmFmZmljLT5yZWcxID0gY3B1X3RvX2xlMzIocmVnKTsKK30KKworCisvKiBAbnVtOiBUaGUgI251bWJlciBvZiBzdGF0aW9uIHRoYXQgaXMgdmlzaWJsZSB0byB0aGUgY2FyZCAqLwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwkvKiBGSVhNRSB0aGUgbGVuZ3RoIG9mIHN0YSBpcyAyNTYgYnl0ZXMgSXMgdGhhdAorCSAqIGRhbmdlcm91cyB0byBzdGFjayBvdmVyZmxvdz8gKi8KKwlzdHJ1Y3QgYWdueF9zdGEgc3RhOworCXUzMiByZWc7CisJaW50IGk7CisKKwltZW1zZXQoJnN0YSwgMCwgc2l6ZW9mKHN0YSkpOworCS8qIFNldCB2YWxpZCB0byAxICovCisJcmVnID0gYWdueF9zZXRfYml0cyhTVEFUSU9OX1ZBTElELCBTVEFUSU9OX1ZBTElEX1NISUZULCAxKTsKKwkvKiBTZXQgRW5hYmxlIENvbmNhdGVuYXRpb24gdG8gMCAoPykgKi8KKwlyZWcgfD0gYWdueF9zZXRfYml0cyhFTkFCTEVfQ09OQ0FURU5BVElPTiwgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQsIDApOworCS8qIFNldCBFbmFibGUgRGVjb21wcmVzc2lvbiB0byAwICg/KSAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKEVOQUJMRV9ERUNPTVBSRVNTSU9OLCBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVCwgMCk7CisJc3RhLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKwkvKiBJbml0aWFsaXplIGVhY2ggb2YgdGhlIFRyYWZmaWMgQ2xhc3MgU3RydWN0dXJlcyBieTogKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzdGFfdHJhZmZpY19pbml0KHN0YS50cmFmZmljICsgaSk7CisKKwlzZXRfc3RhKHByaXYsICZzdGEsIHN0YV9pZHgpOworCXN0YV90eF93b3JrcXVldWVfaW5pdChwcml2LCBzdGFfaWR4KTsKK30gLyogc3RhX2Rlc2NyaXB0b3JfaW5pdCAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5oCkBAIC0wLDAgKzEsMjIyIEBACisjaWZuZGVmIEFHTlhfU1RBX0hfCisjZGVmaW5lIEFHTlhfU1RBX0hfCisKKyNkZWZpbmUgU1RBX1RYX1dRX05VTQk4CS8qIFRoZSBudW1iZXIgb2YgVFggd29ya3F1ZXVlIG9uZSBTVEEgaGFzICovCisKK3N0cnVjdCBhZ254X2hhc2hfY21kIHsKKwlfX2JlMzIgY21kaGk7CisjZGVmaW5lIE1BQ0xPCQkweEZGRkYwMDAwCisjZGVmaW5lIE1BQ0xPX1NISUZUCTE2CisjZGVmaW5lIFNUQV9JRAkJMHgwMDAwRkZGMAorI2RlZmluZSBTVEFfSURfU0hJRlQJNAorI2RlZmluZSBDTUQJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ01EX1NISUZUCTIKKyNkZWZpbmUgU1RBVFVTCQkweDAwMDAwMDAyCisjZGVmaW5lIFNUQVRVU19TSElGVAkxCisjZGVmaW5lIFBBU1MJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFTU19TSElGVAkxCisJX19iZTMyIGNtZGxvOworfV9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCisvKgorICogU3RhdGlvbiBQb3dlciBUZW1wbGF0ZQorICogRklYTUUgSnVzdCBmb3IgYWduMTAwIHlldAorICovCitzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgeworCV9fbGUzMiByZWc7CisjZGVmaW5lIFNJR05BTAkJCTB4MDAwMDAwRkYgLyogc2lnbmFsICovCisjZGVmaW5lIFNJR05BTF9TSElGVAkJMAorI2RlZmluZSBSQVRFCQkJMHgwMDAwMEYwMAorI2RlZmluZSBSQVRFX1NISUZUCQk4CisjZGVmaW5lIFRJRlMJCQkweDAwMDAxMDAwCisjZGVmaW5lIFRJRlNfU0hJRlQJCTEyCisjZGVmaW5lIEVEQ0YJCQkweDAwMDAyMDAwCisjZGVmaW5lIEVEQ0ZfU0hJRlQJCTEzCisjZGVmaW5lIENIQU5ORUxfQk9ORAkJMHgwMDAwNDAwMAorI2RlZmluZSBDSEFOTkVMX0JPTkRfU0hJRlQJMTQKKyNkZWZpbmUgUEhZX01PREUJCTB4MDAwMzgwMDAKKyNkZWZpbmUgUEhZX01PREVfU0hJRlQJCTE1CisjZGVmaW5lIFBPV0VSX0xFVkVMCQkweDAwN0MwMDAwCisjZGVmaW5lIFBPV0VSX0xFVkVMX1NISUZUCTE4CisjZGVmaW5lIE5VTV9UUkFOU01JVFRFUlMJMHgwMDgwMDAwMAorI2RlZmluZSBOVU1fVFJBTlNNSVRURVJTX1NISUZUCTIzCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyoKKyAqIFRYIFdvcmtxdWV1ZSBEZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBhZ254X3N0YV90eF93cSB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1cJMHhGRjAwMDAwMCAvKiBIZWFkIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9MT1dfU0hJRlQJMjQKKyNkZWZpbmUgVEFJTF9QT0lOVEVSCQkweDAwRkZGRkZGIC8qIFRhaWwgcG9pbnRlciAqLworI2RlZmluZSBUQUlMX1BPSU5URVJfU0hJRlQJMAorCisJX19sZTMyIHJlZzM7CisjZGVmaW5lIEFDS19QT0lOVEVSX0xPVwkgICAgICAgIDB4RkZGRjAwMDAJLyogQUNLIHBvaW50ZXIgbG93ICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0xPV19TSElGVAkxNgorI2RlZmluZSBIRUFEX1BPSU5URVJfSElHSAkweDAwMDBGRkZGCS8qIEhlYWQgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEhFQURfUE9JTlRFUl9ISUdIX1NISUZUCTAKKworCV9fbGUzMiByZWcxOworLyogQUNLIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UCTB4RkZGMDAwMDAKKyNkZWZpbmUgQUNLX1RJTU9VVF9UQUlMX1BBQ0tfQ05UX1NISUZUCTIwCisvKiBIZWFkIHRpbWVvdXQgdGFpbCBwYWNrZXQgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVAkweDAwMEZGRjAwCisjZGVmaW5lIEhFQURfVElNT1VUX1RBSUxfUEFDS19DTlRfU0hJRlQJOAorI2RlZmluZSBBQ0tfUE9JTlRFUl9ISUdICSAgICAgICAgMHgwMDAwMDBGRiAvKiBBQ0sgcG9pbnRlciBoaWdoICovCisjZGVmaW5lIEFDS19QT0lOVEVSX0hJR0hfU0hJRlQJCTAKKworCV9fbGUzMiByZWcyOworI2RlZmluZSBXT1JLX1FVRVVFX1ZBTElECQkweDgwMDAwMDAwIC8qIHZhbGlkICovCisjZGVmaW5lIFdPUktfUVVFVUVfVkFMSURfU0hJRlQJCTMxCisjZGVmaW5lIFdPUktfUVVFVUVfQUNLX1RZUEUJCTB4NDAwMDAwMDAgLyogQUNLIHR5cGUgKi8KKyNkZWZpbmUgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVAkzMAorLyogSGVhZCB0aW1lb3V0IHdpbmRvdyBsaW1pdCBmcmFnbWVudGF0aW9uIGNvdW50ICovCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlQJMHgzRkZGMDAwMAorI2RlZmluZSBIRUFEX1RJTU9VVF9XSU5fTElNX0ZSQUdfQ05UX1NISUZUCTE2CisvKiBIZWFkIHRpbWVvdXQgd2luZG93IGxpbWl0IGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9CWVRFX0NOVAkweDAwMDBGRkZGCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlRfU0hJRlQJIDAKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qCisgKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZQorICovCitzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB7CisJX19sZTMyIHJlZzA7CisjZGVmaW5lIEFDS19USU1PVVRfQ05UCQkweEZGODAwMDAwIC8qIEFDSyBUaW1lb3V0IENvdW50cyAqLworI2RlZmluZSBBQ0tfVElNT1VUX0NOVF9TSElGVAkyMworI2RlZmluZSBUUkFGRklDX0FDS19UWVBFCTB4MDA2MDAwMDAgLyogQUNLIFR5cGUgKi8KKyNkZWZpbmUgVFJBRkZJQ19BQ0tfVFlQRV9TSElGVAkyMQorI2RlZmluZSBORVdfUEFDS0VUCQkweDAwMTAwMDAwIC8qIE5ldyBQYWNrZXQgICovCisjZGVmaW5lIE5FV19QQUNLRVRfU0hJRlQJMjAKKyNkZWZpbmUgVFJBRkZJQ19WQUxJRAkJMHgwMDA4MDAwMCAvKiBWYWxpZCAqLworI2RlZmluZSBUUkFGRklDX1ZBTElEX1NISUZUCTE5CisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVIJMHgwMDA3RkZGRiAvKiBSWCBIZWFkZXIgRGVzY3JpcHRlciBwb2ludGVyICovCisjZGVmaW5lIFJYX0hEUl9ERVNDX1BPSU5URVJfU0hJRlQJIDAKKworCV9fbGUzMiByZWcxOworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QCTB4RkZGRjAwMDAgLyogUlggUGFja2V0IFRpbWVzdGFtcCAqLworI2RlZmluZSBSWF9QQUNLRVRfVElNRVNUQU1QX1NISUZUCTE2CisjZGVmaW5lIFRSQUZGSUNfUkVTRVJWRUQJMHgwMDAwRTAwMCAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBUUkFGRklDX1JFU0VSVkVEX1NISUZUICAxMworI2RlZmluZSBTVgkJCTB4MDAwMDEwMDAgLyogc3YgKi8KKyNkZWZpbmUgU1ZfU0hJRlQJCTEyCisjZGVmaW5lIFJYX1NFUVVFTkNFX05VTQkJMHgwMDAwMEZGRiAvKiBSWCBTZXF1ZW5jZSBOdW1iZXIgKi8KKyNkZWZpbmUgUlhfU0VRVUVOQ0VfTlVNX1NISUZUCTAKKworCV9fbGUzMiB0eF9yZXBsYXlfY250X2xvdzsgLyogVFggUmVwbGF5IENvdW50ZXIgTG93ICovCisKKwlfX2xlMTYgdHhfcmVwbGF5X2NudF9oaWdoOyAvKiBUWCBSZXBsYXkgQ291bnRlciBIaWdoICovCisJX19sZTE2IHJ4X3JlcGxheV9jbnRfaGlnaDsgLyogUlggUmVwbGF5IENvdW50ZXIgSGlnaCAqLworCisJX19iZTMyIHJ4X3JlcGxheV9jbnRfbG93OyAvKiBSWCBSZXBsYXkgQ291bnRlciBMb3cgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogU3RhdGlvbiBEZXNjcmlwdG9ycworICovCitzdHJ1Y3QgYWdueF9zdGEgeworCV9fbGUzMiB0eF9zZXNzaW9uX2tleXNbNF07IC8qIFRyYW5zbWl0IFNlc3Npb24gS2V5ICgwLTMpICovCisJX19sZTMyIHJ4X3Nlc3Npb25fa2V5c1s0XTsgLyogUmVjZWl2ZSBTZXNzaW9uIEtleSAoMC0zKSAqLworCisJX19sZTMyIHJlZzsKKyNkZWZpbmUgSURfMQkJCTB4QzAwMDAwMDAgLyogaWQgMSAqLworI2RlZmluZSBJRF8xX1NISUZUCQkzMAorI2RlZmluZSBJRF8wCQkJMHgzMDAwMDAwMCAvKiBpZCAwICovCisjZGVmaW5lIElEXzBfU0hJRlQJCTI4CisjZGVmaW5lIEVOQUJMRV9DT05DQVRFTkFUSU9OCTB4MEZGMDAwMDAgLyogRW5hYmxlIGNvbmNhdGVuYXRpb24gKi8KKyNkZWZpbmUgRU5BQkxFX0NPTkNBVEVOQVRJT05fU0hJRlQJMjAKKyNkZWZpbmUgRU5BQkxFX0RFQ09NUFJFU1NJT04JMHgwMDBGRjAwMCAvKiBFbmFibGUgZGVjb21wcmVzc2lvbiAqLworI2RlZmluZSBFTkFCTEVfREVDT01QUkVTU0lPTl9TSElGVAkxMgorI2RlZmluZSBTVEFfUkVTRVJWRUQJCTB4MDAwMDBDMDAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU1RBX1JFU0VSVkVEX1NISUZUCTEwCisjZGVmaW5lIEVBUAkJCTB4MDAwMDAyMDAgLyogRUFQICovCisjZGVmaW5lIEVBUF9TSElGVAkJOQorI2RlZmluZSBFRF9OVUxMCQkJMHgwMDAwMDEwMCAvKiBFRCBOVUxMICovCisjZGVmaW5lIEVEX05VTExfU0hJRlQJCTgKKyNkZWZpbmUgRU5DUllQVElPTl9QT0xJQ1kJMHgwMDAwMDBFMCAvKiBFbmNyeXB0aW9uIFBvbGljeSAqLworI2RlZmluZSBFTkNSWVBUSU9OX1BPTElDWV9TSElGVCA1CisjZGVmaW5lIERFRklORURfS0VZX0lECQkweDAwMDAwMDE4IC8qIERlZmluZWQgS2V5IElEICovCisjZGVmaW5lIERFRklORURfS0VZX0lEX1NISUZUCTMKKyNkZWZpbmUgRklYRURfS0VZCQkweDAwMDAwMDA0IC8qIEZpeGVkIEtleSAqLworI2RlZmluZSBGSVhFRF9LRVlfU0hJRlQJCTIKKyNkZWZpbmUgS0VZX1ZBTElECQkweDAwMDAwMDAyIC8qIEtleSBWYWxpZCAqLworI2RlZmluZSBLRVlfVkFMSURfU0hJRlQJCTEKKyNkZWZpbmUgU1RBVElPTl9WQUxJRAkJMHgwMDAwMDAwMSAvKiBTdGF0aW9uIFZhbGlkICovCisjZGVmaW5lIFNUQVRJT05fVkFMSURfU0hJRlQJMAorCisJX19sZTMyIHR4X2Flc19ibGtzX3VuaWNhc3Q7IC8qIFRYIEFFUyBCbGtzIFVuaWNhc3QgKi8KKwlfX2xlMzIgcnhfYWVzX2Jsa3NfdW5pY2FzdDsgLyogUlggQUVTIEJsa3MgVW5pY2FzdCAqLworCisJX19sZTE2IGFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250OyAvKiBBRVMgRm9ybWF0IEVycm9yIFVuaWNhc3QgQ291bnRzICovCisJX19sZTE2IGFlc19yZXBsYXlfdW5pY2FzdDsgLyogQUVTIFJlcGxheSBVbmljYXN0ICovCisKKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX3VuaWNhc3Q7CS8qIEFFUyBEZWNyeXB0IEVycm9yIFVuaWNhc3QgKi8KKwlfX2xlMTYgYWVzX2RlY3J5cHRfZXJyX2RlZmF1bHQ7CS8qIEFFUyBEZWNyeXB0IEVycm9yIGRlZmF1bHQgKi8KKworCV9fbGUxNiBzaW5nbGVfcmV0cnlfcGFja2V0czsgLyogU2luZ2xlIFJldHJ5IFBhY2tldHMgKi8KKwlfX2xlMTYgZmFpbGVkX3R4X3BhY2tldHM7IC8qIEZhaWxlZCBUeCBQYWNrZXRzICovCisKKwlfX2xlMTYgbXV0aV9yZXRyeV9wYWNrZXRzOyAvKiBNdWx0aXBsZSBSZXRyeSBQYWNrZXRzICovCisJX19sZTE2IGFja190aW1lb3V0czsJLyogQUNLIFRpbWVvdXRzICovCisKKwlfX2xlMTYgZnJhZ190eF9jbnQ7CS8qIEZyYWdtZW50IFRYIENvdW50cyAqLworCV9fbGUxNiBydHNfYnJxX3NlbnQ7CS8qIFJUUyBCcnEgU2VudCAqLworCisJX19sZTE2IHR4X3BhY2tldHM7CS8qIFRYIFBhY2tldHMgKi8KKwlfX2xlMTYgY3RzX2JhY2tfdGltZW91dDsgLyogQ1RTIEJhY2sgVGltZW91dCAqLworCisJX19sZTMyIHBoeV9zdGF0c19oaWdoOwkvKiBQSFkgU3RhdHMgSGlnaCAqLworCV9fbGUzMiBwaHlfc3RhdHNfbG93OwkvKiBQSFkgU3RhdHMgTG93ICovCisKKwlzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyB0cmFmZmljWzhdOwkvKiBUcmFmZmljIENsYXNzIFN0cnVjdHVyZSAoOCkgKi8KKworCV9fbGUxNiB0cmFmZmljX2NsYXNzMF9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMCBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3MxX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAxIEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczJfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDIgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzM19mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMyBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M0X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA0IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczVfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDUgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzNl9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgNiBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M3X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA3IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKworCV9fbGUxNiBudW1fZnJhZ19ub25fcHJpbWVfcmF0ZXM7IC8qIG51bWJlciBvZiBGcmFnbWVudHMgZm9yIG5vbi1wcmltZSByYXRlcyAqLworCV9fbGUxNiBhY2tfdGltZW91dF9ub25fcHJpbWVfcmF0ZXM7IC8qIEFDSyBUaW1lb3V0IGZvciBub24tcHJpbWUgcmF0ZXMgKi8KKworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfYmVhY29uX2hkciB7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOyAvKiBUeCBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlICAqLworCXU4IHBoeV9oZHJbNl07CQkvKiBQSFkgSGRyICovCisJdTggZnJhbWVfbGVuX2xvOwkvKiBGcmFtZSBMZW5ndGggTG8gKi8KKwl1OCBmcmFtZV9sZW5faGk7CS8qIEZyYW1lIExlbmd0aCBIaSAqLworCXU4IG1hY19oZHJbMjRdOwkJLyogTUFDIEhlYWRlciAqLworCS8qIEZJWE1FICovCisJLyogODAyLjExKGFiZykgYmVhY29uICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKwordm9pZCBoYXNoX3dyaXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICptYWNfYWRkciwgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kdW1wKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4IHN0YV9pZCk7Cit2b2lkIGhhc2hfcmVhZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCk7CisKK3ZvaWQgZ2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7Cit2b2lkIHNldF9zdGFfcG93ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3Bvd2VyICpwb3dlciwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgpOwordm9pZCBnZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KTsKK3ZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAorCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCk7Cit2b2lkIGdldF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhICpzdGEsIHVuc2lnbmVkIGludCBzdGFfaWR4KTsKK3ZvaWQgc2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpOworCit2b2lkIHN0YV9wb3dlcl9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBudW0pOwordm9pZCBzdGFfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgbnVtKTsKKworI2VuZGlmIC8qIEFHTlhfU1RBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisKK3N0YXRpYyBjb25zdCB1MzIKK3R4X2Zpcl90YWJsZVtdID0geyAweDE5LCAweDVkLCAweGNlLCAweDE1MSwgMHgxYzMsIDB4MWZmLCAweDFlYSwgMHgxN2MsIDB4Y2YsCisJCSAgIDB4MTksIDB4MzhlLCAweDM1MCwgMHgzNjIsIDB4M2FkLCAweDUsIDB4NDQsIDB4NTksIDB4NDksCisJCSAgIDB4MjEsIDB4M2Y3LCAweDNlMCwgMHgzZTMsIDB4M2YzLCAweDAgfTsKKwordm9pZCB0eF9maXJfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHhfZmlyX3RhYmxlKTsgaSsrKQorCQlpb3dyaXRlMzIodHhfZmlyX3RhYmxlW2ldLCBjdGwgKyBBR05YX0ZJUl9CQVNFICsgaSo0KTsKK30gLyogZmlyX3RhYmxlX3NldHVwICovCisKKworc3RhdGljIGNvbnN0IHUzMgorZ2Fpbl90YWJsZVtdID0geyAweDgsIDB4OCwgMHhmLCAweDEzLCAweDE3LCAweDFiLCAweDFmLCAweDIzLCAweDI3LCAweDJiLAorCQkgMHgyZiwgMHgzMywgMHgzNywgMHgzYiwgMHgzZiwgMHg0MywgMHg0NywgMHg0YiwgMHg0ZiwKKwkJIDB4NTMsIDB4NTcsIDB4NWIsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYsCisJCSAweDVmLCAweDVmLCAweDVmLCAweDVmIH07CisKK3ZvaWQgZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYWluX3RhYmxlKTsgaSsrKSB7CisJCWlvd3JpdGUzMihnYWluX3RhYmxlW2ldLCBjdGwgKyBBR05YX0dBSU5fVEFCTEUgKyBpKjQpOworCQlpb3dyaXRlMzIoZ2Fpbl90YWJsZVtpXSwgY3RsICsgQUdOWF9HQUlOX1RBQkxFICsgaSo0ICsgMHg4MCk7CisJfQorfSAvKiBnYWluX3RhYmxlX2luaXQgKi8KKwordm9pZCBtb25pdG9yX2dhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDB4NDQ7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg2MSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4NDQ7IGkgPCAweDY0OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4NmUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDY0OyBpIDwgMHg5NDsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDdhLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHg5NDsgaSA8IDB4ZGM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg4NywgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4ZGM7IGkgPCAweDE0ODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDk1LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxNDg7IGkgPCAweDFlODsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweGEyLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHgxZTg7IGkgPD0gMHgxZmM7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHhiMCwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorfSAvKiBtb25pdG9yX2dhaW5fdGFibGVfaW5pdCAqLworCisKK3ZvaWQgcm91dGluZ190YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IHR5cGUsIHN1YnR5cGU7CisJdTMyIHJlZzsKKworCWRpc2FibGVfcmVjZWl2ZXIocHJpdik7CisKKwlmb3IgKCB0eXBlID0gMDsgdHlwZSA8IDB4MzsgdHlwZSsrICkgeworCQlmb3IgKHN1YnR5cGUgPSAwOyBzdWJ0eXBlIDwgMHgxMDsgc3VidHlwZSsrKSB7CisJCQkvKiAxLiBTZXQgUm91dGluZyB0YWJsZSB0byBSL1cgYW5kIHRvIFJldHVybiBzdGF0dXMgb24gUmVhZCAqLworCQkJcmVnID0gKHR5cGUgPDwgUk9VVEFCX1RZUEVfU0hJRlQpIHwKKwkJCQkoc3VidHlwZSA8PCBST1VUQUJfU1VCVFlQRV9TSElGVCk7CisJCQlyZWcgfD0gKDEgPDwgUk9VVEFCX1JXX1NISUZUKSB8ICgxIDw8IFJPVVRBQl9TVEFUVVNfU0hJRlQpOworCQkJaWYgKHR5cGUgPT0gUk9VVEFCX1RZUEVfREFUQSkgeworCQkJCS8qIE5VTEwgZ29lcyB0byBSRlAgKi8KKwkJCQlpZiAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMKQorLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfUkZQOworCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0NQVTsKKwkJCQkvKiBRT1MgTlVMTCBnb2VzIHRvIENQVSAqLworCQkJCWVsc2UgaWYgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTCkKKwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7CisJCQkJLyogQWxsIERhdGEgYW5kIFFPUyBkYXRhIHN1YnR5cGVzIGdvIHRvIEVuY3J5cHRpb24gKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQVBPTExBQ0spIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU0RBVEFQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQUFDS1BPTEwpKQorCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0VOQ1JZOworLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJCS8qRHJvcCBOVUxMIGFuZCBRT1MgTlVMTCBhY2ssIHBvbGwgYW5kIHBvbGwgYWNrKi8KKwkJCQllbHNlIGlmICgoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExQT0xMKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9OVUxMUE9MTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMQUNLKSkKKy8vCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0RST1A7CisJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJfQorCQkJZWxzZQorCQkJCXJlZyB8PSAoUk9VVEFCX1JPVVRFX0NQVSk7CisJCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9ST1VUQUIpOworCQkJLyogQ2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHN0YXR1cyBiaXQgY2xlYXJlZCAqLworCQkJcm91dGluZ190YWJsZV9kZWxheSgpOworCQl9CisJfQorCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKK30gLyogcm91dGluZ190YWJsZV9pbml0ICovCisKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDI4OyBpICs9IDQpCisJCWlvd3JpdGUzMigweGIwMGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMzI7IGkgPD0gMTIwOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MWU1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YjAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gMTI4OyBpIDw9IDE1NjsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDE2MDsgaSA8PSAyNDg7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgxODU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHg5ODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9CisKKwlmb3IgKGkgPSAyNTY7IGkgPD0gMjg0OyBpICs9IDQpCisJCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMjg4OyBpIDw9IDM3NjsgaSArPSA4KSB7CisJCWlvd3JpdGUzMigweDFhNTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJCWlvd3JpdGUzMigweDE4NTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOworCX0KKworCWZvciAoaSA9IDUxMjsgaSA8PSA1NDA7IGkgKz0gNCkKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwlmb3IgKGkgPSA1NDQ7IGkgPD0gNjMyOyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MjA1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4YzAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gNjQwOyBpIDw9IDY2ODsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDY3MjsgaSA8PSA3NjQ7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgyMjU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHhjODBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjI2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgQUdOWF9UQUJMRV9IXworI2RlZmluZSBBR05YX1RBQkxFX0hfCisKK3ZvaWQgdHhfZmlyX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGdhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgbW9uaXRvcl9nYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIHJvdXRpbmdfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgdHhfZW5naW5lX2xvb2t1cF90YmxfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKKworI2VuZGlmIC8qIEFHTlhfVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjAxNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jCkBAIC0wLDAgKzEsODE5IEBACisvKioKKyAqIEFpcmdvIE1JTU8gd2lyZWxlc3MgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IExpIFlhbkJvIDxkcmVhbWZseTI4MUBnbWFpbC5jb20+CisKKyAqIFRoYW5rcyBmb3IgSmVmZiBXaWxsaWFtcyA8YW5nZWxiYW5lQGdtYWlsLmNvbT4gZG8gcmV2ZXJzZSBlbmdpbmVlcgorICogd29ya3MgYW5kIHB1Ymxpc2hlZCB0aGUgU1BFQ1MgYXQgaHR0cDovL2FpcmdvLndkd2NvbnN1bHRpbmcubmV0L215bW9pbgorCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInBoeS5oIgorCit1bnNpZ25lZCBpbnQgcnhfZnJhbWVfY250ID0gMDsKKy8vdW5zaWduZWQgaW50IGxvY2FsX3R4X3NlbnRfY250ID0gMDsKKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfcnhfZW5naW5lKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW93cml0ZTMyKDB4MTAwLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJLyogV2FpdCBmb3IgUlggQ29udHJvbCB0byBoYXZlIHRoZSBEaXNhYmxlIFJ4IEludGVycnVwdCAoMHgxMDApIHNldCAqLworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9yeF9lbmdpbmUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpb3dyaXRlMzIoMHg4MCwgY3RsICsgQUdOWF9DSVJfUlhDVEwpOworCWlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJZGlzYWJsZV9yeF9lbmdpbmUocHJpdik7CisJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCXJlZyAmPSB+MHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworfQorCitpbmxpbmUgdm9pZCBlbmFibGVfcnhfaW50ZXJydXB0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKKwlyZWcgfD0gMHgyMDsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCWVuYWJsZV9yeF9lbmdpbmUocHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9kZXNjX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjID0gcHJpdi0+cnguZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCWluZm8tPmRtYV9sZW4gPSBJRUVFODAyMTFfTUFYX1JUU19USFJFU0hPTEQgKyBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKwlpbmZvLT5za2IgPSBkZXZfYWxsb2Nfc2tiKGluZm8tPmRtYV9sZW4pOworCWlmIChpbmZvLT5za2IgPT0gTlVMTCkKKwkJYWdueF9idWcoInJlZmlsbCBlcnIiKTsKKworCWluZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2JfdGFpbF9wb2ludGVyKGluZm8tPnNrYiksCisJCQkJICAgICAgIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmVpbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwkvKiBDYXVzZSBpZWVlODAyMTEgd2lsbCBmcmVlIHRoZSBza2IgYnVmZmVyLCBzbyB3ZSBuZWVkbid0IHRvIGZyZWUgaXQgYWdhaW4/ISAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyeF9kZXNjX2luaXQocHJpdiwgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfcmV1c2luZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT5yeC5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT5yeC5pbmZvICsgaWR4OworCisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCWRlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoaW5mby0+bWFwcGluZyk7CisJLyogU2V0IHRoZSBvd25lciB0byB0aGUgY2FyZCAqLworCWRlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdShkZXNjLT5mcmFnKSB8IE9XTkVSKTsKK30KKworc3RhdGljIHZvaWQgcnhfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpZHg7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKGluZm8tPnNrYikKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3R4X2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LAorCQkJCSAgc3RydWN0IGFnbnhfZGVzYyAqZGVzYywgc3RydWN0IGFnbnhfaW5mbyAqaW5mbykKK3sKKwlCVUdfT04oIWRlc2MgfHwgIWluZm8pOworCS8qIFRPRE8gbWFrZSBzdXJlIG1hcHBpbmcsIHNrYiBhbmQgbGVuIGFyZSBjb25zaXN0ZW5jeSAqLworCWlmIChpbmZvLT5tYXBwaW5nKQorCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsCisJCQkJIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkKKwkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2IpOworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKK30KKworc3RhdGljIHZvaWQgdHhtX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eG0uZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhtLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworc3RhdGljIHZvaWQgdHhkX2Rlc2NfZnJlZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT50eGQuZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+dHhkLmluZm8gKyBpZHg7CisKKwlfX3R4X2Rlc2NfZnJlZShwcml2LCBkZXNjLCBpbmZvKTsKK30KKworaW50IGZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlwcml2LT50eGQuaWR4X3NlbnQgPSBwcml2LT50eG0uaWR4X3NlbnQgPSAwOworCXByaXYtPnJ4LmlkeCA9IHByaXYtPnR4bS5pZHggPSBwcml2LT50eGQuaWR4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeC5zaXplOyBpKyspCisJCXJ4X2Rlc2NfaW5pdChwcml2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhtLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhtLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhtLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhkLnNpemU7IGkrKykgeworCQltZW1zZXQocHJpdi0+dHhkLmRlc2MgKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykpOworCQltZW1zZXQocHJpdi0+dHhkLmluZm8gKyBpLCAwLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCX0KKworCS8qIEZJWE1FIFNldCB0aGUgY2FyZCBSWCBUWE0gYW5kIFRYRCBhZGRyZXNzICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDTVNUQVJULCBwcml2LT5yeC5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ01FTkQsIHByaXYtPnR4bS5kbWEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNU1RBUlQsIHByaXYtPnR4bS5kbWEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYTUVORCwgcHJpdi0+dHhkLmRtYSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWERTVEFSVCwgcHJpdi0+dHhkLmRtYSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhERU5ELCBwcml2LT50eGQuZG1hICsKKwkJICAgICBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBwcml2LT50eGQuc2l6ZSk7CisKKwkvKiBGSVhNRSBSZWxpbnF1aXNoIGNvbnRyb2wgb2YgcmluZ3MgdG8gY2FyZCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKKwlyZWcgJj0gfjB4ODAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCwgcmVnKTsKKwlyZXR1cm4gMDsKK30gLyogZmlsbF9yaW5ncyAqLworCit2b2lkIHVuZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJQUdOWF9UUkFDRTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnguc2l6ZTsgaSsrKQorCQlyeF9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4bS5zaXplOyBpKyspCisJCXR4bV9kZXNjX2ZyZWUocHJpdiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4ZC5zaXplOyBpKyspCisJCXR4ZF9kZXNjX2ZyZWUocHJpdiwgaSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEV4dHJhY3QgdGhlIGJpdHJhdGUgb3V0IG9mIGEgQ0NLIFBMQ1AgaGVhZGVyLgorICAgY29weSBmcm9tIGJjbTQzeHggZHJpdmVyICovCitzdGF0aWMgaW5saW5lIHU4IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soX19iZTMyICpwaHloZHJfMTFiKQoreworCS8qIEZJWE1FICovCisJc3dpdGNoICgqKHU4ICopcGh5aGRyXzExYikgeworCWNhc2UgMHgwQToKKwkJcmV0dXJuIDA7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gMTsKKwljYXNlIDB4Mzc6CisJCXJldHVybiAyOworCWNhc2UgMHg2RToKKwkJcmV0dXJuIDM7CisJfQorCWFnbnhfYnVnKCJXcm9uZyBwbGNwIHJhdGUiKTsKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUUgKi8KK3N0YXRpYyBpbmxpbmUgdTggYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oX19iZTMyICpwaHloZHJfMTFnKQoreworCXU4IHJhdGUgPSAqKHU4ICopcGh5aGRyXzExZyAmIDB4RjsKKworCXByaW50ayhQRlggIkcgbW9kZSByYXRlIGlzIDB4JXhcbiIsIHJhdGUpOworCXJldHVybiByYXRlOworfQorCisvKiBGSVhNRSAqLworc3RhdGljIHZvaWQgZ2V0X3J4X3N0YXRzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqaGRyLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXU4ICpyc3NpOworCXUzMiBub2lzZTsKKwkvKiBGSVhNRSBqdXN0IGZvciB0ZXN0ICovCisJaW50IHNuciA9IDQwOwkJLyogc2lnbmFsLXRvLW5vaXNlIHJhdGlvICovCisKKwltZW1zZXQoc3RhdCwgMCwgc2l6ZW9mKCpzdGF0KSk7CisJLyogUlNTSSAqLworCXJzc2kgPSAodTggKikmaGRyLT5waHlfc3RhdHNfbG87CisvLwlzdGF0LT5zc2kgPSAocnNzaVswXSArIHJzc2lbMV0gKyByc3NpWzJdKSAvIDM7CisJLyogTm9pc2UgKi8KKwlub2lzZSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfR0NSX05PSVNFMCk7CisJbm9pc2UgKz0gaW9yZWFkMzIoY3RsICsgQUdOWF9HQ1JfTk9JU0UxKTsKKwlub2lzZSArPSBpb3JlYWQzMihjdGwgKyBBR05YX0dDUl9OT0lTRTIpOworCXN0YXQtPm5vaXNlID0gbm9pc2UgLyAzOworCS8qIFNpZ25hbCBxdWFsaXR5ICovCisJLy9zbnIgPSBzdGF0LT5zc2kgLSBzdGF0LT5ub2lzZTsKKwlpZiAoc25yID49MCAmJiBzbnIgPCA0MCkKKwkJc3RhdC0+c2lnbmFsID0gNSAqIHNuciAvIDI7CisJZWxzZSBpZiAoc25yID49IDQwKQorCQlzdGF0LT5zaWduYWwgPSAxMDA7CisJZWxzZQorCQlzdGF0LT5zaWduYWwgPSAwOworCisKKwlpZiAoaGRyLT5fMTFiMCAmJiAhaGRyLT5fMTFnMCkgeworCQlzdGF0LT5yYXRlX2lkeCA9IGFnbnhfcGxjcF9nZXRfYml0cmF0ZV9jY2soJmhkci0+XzExYjApOworCX0gZWxzZSBpZiAoIWhkci0+XzExYjAgJiYgaGRyLT5fMTFnMCkgeworCQlwcmludGsoUEZYICJSWDogRm91bmQgRyBtb2RlIHBhY2tldFxuIik7CisJCXN0YXQtPnJhdGVfaWR4ID0gYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApOworCX0gZWxzZQorCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKworCisJc3RhdC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJc3RhdC0+ZnJlcSA9IGFnbnhfY2hhbm5lbHNbcHJpdi0+Y2hhbm5lbCAtIDFdLmNlbnRlcl9mcmVxOworLy8Jc3RhdC0+YW50ZW5uYSA9IDM7CisvLwlzdGF0LT5tYWN0aW1lID0gYmUzMl90b19jcHUoaGRyLT50aW1lX3N0YW1wKTsKKy8vCXN0YXQtPmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21iaW5lX2hkcl9mcmFnKHN0cnVjdCBpZWVlODAyMTFfaGRyICppZWVlaGRyLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUxNiBmY3RsOworCXVuc2lnbmVkIGludCBoZHJsZW47CisKKwlmY3RsID0gbGUxNl90b19jcHUoaWVlZWhkci0+ZnJhbWVfY29udHJvbCk7CisJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihmY3RsKTsKKwkvKiBGSVhNRSAqLworCWlmIChoZHJsZW4gPCAoMisyKzYpLyptaW5pbXVtIGhkciovIHx8CisJICAgIGhkcmxlbiA+IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImhkciBsZW4gaXMgJWRcbiIsIGhkcmxlbik7CisJCWFnbnhfYnVnKCJXcm9uZyBpZWVlODAyMTEgaGRyIGRldGVjdGVkIik7CisJfQorCXNrYl9wdXNoKHNrYiwgaGRybGVuKTsKKwltZW1jcHkoc2tiLT5kYXRhLCBpZWVlaGRyLCBoZHJsZW4pOworfSAvKiBjb21iaW5lX2hkcl9mcmFnICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFnbnhfcGFja2V0X2NoZWNrKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2hkciAqYWdueGhkciwKKwkJCQkgICAgdW5zaWduZWQgcGFja2V0X2xlbikKK3sKKwlpZiAoYWdueF9nZXRfYml0cyhDUkNfRkFJTCwgQ1JDX0ZBSUxfU0hJRlQsIGJlMzJfdG9fY3B1KGFnbnhoZHItPnJlZzEpKSA9PSAxKXsKKwkJcHJpbnRrKFBGWCAiUlg6IENSQyBjaGVjayBmYWlsXG4iKTsKKwkJZ290byBkcm9wOworCX0KKwlpZiAocGFja2V0X2xlbiA+IDIwNDgpIHsKKwkJcHJpbnRrKFBGWCAiUlg6IFRvbyBsb25nIHBhY2tldCBkZXRlY3RlZFxuIik7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBGSVhNRSBKdXN0IHVzYWJsZSBmb3IgUHJvbWlvdXMgTW9kZSwgZm9yIE1hbmFnZSBtb2RlIGV4Y2x1ZGUgRkNTICovCisvKiAJaWYgKHBhY2tldF9sZW4gLSBzaXplb2YoKmFnbnhoZHIpIDwgRkNTX0xFTikgeyAqLworLyogCQlwcmludGsoUEZYICJSWDogVG9vIHNob3J0IHBhY2tldCBkZXRlY3RlZFxuIik7ICovCisvKiAJCWdvdG8gZHJvcDsgKi8KKy8qIAl9ICovCisJcmV0dXJuIDA7Citkcm9wOgorCXByaXYtPnN0YXRzLmRvdDExRkNTRXJyb3JDb3VudCsrOworCXJldHVybiAtMTsKK30KKwordm9pZCBoYW5kbGVfcnhfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGludCBsZW47CisvLwlBR05YX1RSQUNFOworCisJZG8geworCQlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCQl1MzIgZnJhZzsKKwkJc3RydWN0IGFnbnhfaW5mbyAqaW5mbzsKKwkJc3RydWN0IGFnbnhfaGRyICpoZHI7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGludCBpID0gcHJpdi0+cnguaWR4ICUgcHJpdi0+cnguc2l6ZTsKKworCQlkZXNjID0gcHJpdi0+cnguZGVzYyArIGk7CisJCWZyYWcgPSBiZTMyX3RvX2NwdShkZXNjLT5mcmFnKTsKKwkJaWYgKGZyYWcgJiBPV05FUikKKwkJCWJyZWFrOworCisJCWluZm8gPSBwcml2LT5yeC5pbmZvICsgaTsKKwkJc2tiID0gaW5mby0+c2tiOworCQloZHIgPSAoc3RydWN0IGFnbnhfaGRyICopKHNrYi0+ZGF0YSk7CisKKwkJbGVuID0gKGZyYWcgJiBQQUNLRVRfTEVOKSA+PiBQQUNLRVRfTEVOX1NISUZUOworCQlpZiAoYWdueF9wYWNrZXRfY2hlY2socHJpdiwgaGRyLCBsZW4pID09IC0xKSB7CisgCQkJcnhfZGVzY19yZXVzaW5nKHByaXYsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJc2tiX3B1dChza2IsIGxlbik7CisKKwkJZG8geworCQkJdTE2IGZjdGw7CisJCQlmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciktPmZyYW1lX2NvbnRyb2wpOworCQkJaWYgKChmY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpICE9IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pLy8gJiYgIShmY3RsICYgSUVFRTgwMjExX1NUWVBFX0JFQUNPTikpCisJCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkciwgIlJYIik7CisJCX0gd2hpbGUgKDApOworCisJCWlmIChoZHItPl8xMWIwICYmICFoZHItPl8xMWcwKSB7CisvKiAJCQlpbnQgajsgKi8KKy8qIAkJCXUxNiBmY3RsID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkci0+bWFjX2hkcikgKi8KKy8qIAkJCQkJICAgICAgIC0+ZnJhbWVfY29udHJvbCk7ICovCisvKiAJCQlpZiAoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpID09ICBJRUVFODAyMTFfRlRZUEVfREFUQSkgeyAqLworLyogCQkJCWFnbnhfcHJpbnRfcnhfaGRyKGhkcik7ICovCisvLyAJCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLyogCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsJCSAqLworLyogCQkJfSAqLworCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyLCBza2IpOworCQl9IGVsc2UgaWYgKCFoZHItPl8xMWIwICYmIGhkci0+XzExZzApIHsKKy8vCQkJaW50IGo7CisJCQlhZ254X3ByaW50X3J4X2hkcihoZHIpOworCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIDApOworCisJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogUlhfUEFDS0VUOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJCQkgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKyA4KTsKKworLy8JCQlpZiAoYWdueF9wbGNwX2dldF9iaXRyYXRlX29mZG0oJmhkci0+XzExZzApID09IDApCisJCQlnZXRfcnhfc3RhdHMocHJpdiwgaGRyLCAmc3RhdHVzKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwkJCWNvbWJpbmVfaGRyX2ZyYWcoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopCisJCQkJCSAoKHZvaWQgKikmaGRyLT5tYWNfaGRyKSwgc2tiKTsKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSwgIlJYIEciKTsKKwkJfSBlbHNlCisJCQlhZ254X2J1ZygiVW5rbm93biBwYWNrZXRzIHR5cGUiKTsKKwkJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHNrYiwgJnN0YXR1cyk7CisJCXJ4X2Rlc2NfcmVpbml0KHByaXYsIGkpOworCisJfSB3aGlsZSAoIHByaXYtPnJ4LmlkeCsrICk7Cit9IC8qIGhhbmRsZV9yeF9pcnEgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV90eF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmluZm87CisJdW5zaWduZWQgaW50IGlkeDsKKworCWZvciAoaWR4ID0gcmluZy0+aWR4X3NlbnQ7IGlkeCA8IHJpbmctPmlkeDsgaWR4KyspIHsKKwkJdW5zaWduZWQgaW50IGkgPSBpZHggJSByaW5nLT5zaXplOworCQl1MzIgIGZyYWc7CisKKwkJZGVzYyA9IHJpbmctPmRlc2MgKyBpOworCQlpbmZvID0gcmluZy0+aW5mbyArIGk7CisKKwkJZnJhZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCQlpZiAoZnJhZyAmIE9XTkVSKSB7CisJCQlpZiAoaW5mby0+dHlwZSA9PSBIRUFERVIpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJYWdueF9idWcoIlRYIGVycm9yIik7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGluZm8tPm1hcHBpbmcsIGluZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWRvIHsKKy8vCQkJaW50IGo7CisJCQlzaXplX3QgbGVuOworCQkJbGVuID0gaW5mby0+c2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSArIGluZm8tPmhkcl9sZW47CisJCQkvLwlpZiAobGVuID09IDYxNCkgeworLy8JCQkJYWdueF9wcmludF9kZXNjKGRlc2MpOworCQkJCWlmIChpbmZvLT50eXBlID09IFBBQ0tFVCkgeworLy8JCQkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilpbmZvLT5za2ItPmRhdGEpOworLyogCQkJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBMT0NBTF9TVEFJRCk7ICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIExPQ0FMX1NUQUlEKTsgKi8KKy8qIC8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgMCk7ICovCisvLwkJCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIEJTU0lEX1NUQUlEKTsKKy8vCQkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorLy8JCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCAwKTsKKwkJCQl9CisvLwkJCX0KKwkJfSB3aGlsZSAoMCk7CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCWR1bXBfdHhtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9yeG1fcmVnaXN0ZXJzKHByaXYpOworLy8JCQlkdW1wX2JtX3JlZ2lzdGVycyhwcml2KTsKKy8vCQkJZHVtcF9jaXJfcmVnaXN0ZXJzKHByaXYpOworCQl9CisKKwkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aSA9IElFRUU4MDIxMV9TS0JfQ0IoaW5mby0+c2tiKTsKKworCQkJc2tiX3B1bGwoaW5mby0+c2tiLCBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSk7CisJCQltZW1jcHkoc2tiX3B1c2goaW5mby0+c2tiLCBpbmZvLT5oZHJfbGVuKSwgJmluZm8tPmhkciwgaW5mby0+aGRyX2xlbik7CisKKy8vCQkJZHVtcF9pZWVlODAyMTFfaGRyKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWluZm8tPnNrYi0+ZGF0YSwgIlRYX0hBTkRMRSIpOworLyogCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX0hBTkRMRTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCQkJICAgICBpbmZvLT5za2ItPmRhdGEsIGluZm8tPnNrYi0+bGVuKTsgKi8KKworCQkJaWYgKCEodHhpLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJCQl0eGktPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKworCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IpOworCisKKy8qIAkJCQlpbmZvLT50eF9zdGF0dXMucXVldWVfbnVtYmVyID0gKHJpbmctPnNpemUgLSBpKSAvIDI7ICovCisvKiAJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBpbmZvLT5za2IsICYoaW5mby0+dHhfc3RhdHVzKSk7ICovCisvKiAJCQl9IGVsc2UgKi8KKy8qIAkJCQlkZXZfa2ZyZWVfc2tiX2lycShpbmZvLT5za2IpOyAqLworIAkJfQorCQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisJCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwl9CisKKwlyaW5nLT5pZHhfc2VudCA9IGlkeDsKKwkvKiBUT0RPIGZpbGwgdGhlIHByaXYtPmxvd19sZXZlbF9zdGF0cyAqLworCisJLyogaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aHcsIDApOyAqLworfQorCit2b2lkIGhhbmRsZV90eG1faXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJaGFuZGxlX3R4X2lycShwcml2LCAmcHJpdi0+dHhtKTsKK30KKwordm9pZCBoYW5kbGVfdHhkX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCWhhbmRsZV90eF9pcnEocHJpdiwgJnByaXYtPnR4ZCk7Cit9CisKK3ZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworLy8Jdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHN0YXR1cyA9IHByaXYtPmlycV9zdGF0dXM7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCWlmIChzdGF0dXMgJiBJUlFfVFhfQkVBQ09OKSB7CisJCWlvd3JpdGUzMihJUlFfVFhfQkVBQ09OLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gY29udHJvbCBpcyAwWCUuOFhcbiIsIGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX0JFQUNPTl9DVEwpKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBCZWFjb24gcnggZnJhbWUgbnVtOiAlZFxuIiwgcnhfZnJhbWVfY250KTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9SRVRSWSkgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9SRVRSWVNUQUlEKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBSZXRyeSwgUkVUUlkgU1RBIElEIGlzICV4XG4iLCByZWcpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1RYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFRYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX0FDVElWSVRZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEFjdGl2aXR5XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX1gpCisJCXByaW50ayhQRlggIklSUTogUlggWFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9SWF9ZKSB7CisJCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX01BU0spOworCQlyZWcgJj0gfklSUV9SWF9ZOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9ZLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBZXG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9SWF9IQVNISElUKSAgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJcmVnICY9IH5JUlFfUlhfSEFTSEhJVDsKKwkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCWlvd3JpdGUzMihJUlFfUlhfSEFTSEhJVCwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggSGFzaCBIaXRcbiIpOworCisJfQorCWlmIChzdGF0dXMgJiBJUlFfUlhfRlJBTUUpIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCXJlZyAmPSB+SVJRX1JYX0ZSQU1FOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9GUkFNRSwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisJCXByaW50ayhQRlggIklSUTogUlggRnJhbWVcbiIpOworIAkJcnhfZnJhbWVfY250Kys7CisJfQorCWlmIChzdGF0dXMgJiBJUlFfRVJSX0lOVCkgeworCQlpb3dyaXRlMzIoSVJRX0VSUl9JTlQsIGN0bCArIEFHTlhfSU5UX1NUQVQpOworLy8JCWFnbnhfaHdfcmVzZXQocHJpdik7CisJCXByaW50ayhQRlggIklSUTogRXJyb3IgSW50ZXJydXB0XG4iKTsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9UWF9RVUVfRlVMTCkKKwkJcHJpbnRrKFBGWCAiSVJROiBUWCBXb3JrcXVldWUgRnVsbFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9CQU5ETUFOX0VSUikKKwkJcHJpbnRrKFBGWCAiSVJROiBCYW5kd2lkdGggTWFuYWdlbWVudCBFcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9UWF9ESVNBQkxFKQorCQlwcmludGsoUEZYICJJUlE6IFRYIERpc2FibGVcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUlhfSVZBU0VTS0VZKQorCQlwcmludGsoUEZYICJJUlE6IFJYIEludmFsaWQgU2Vzc2lvbiBLZXlcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUkVQX1RISElUKQorCQlwcmludGsoUEZYICJJUlE6IFJlcGxheSBUaHJlc2hvbGQgSGl0XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1RJTUVSMSkKKwkJcHJpbnRrKFBGWCAiSVJROiBUaW1lcjFcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfVElNRVJfQ05UKQorCQlwcmludGsoUEZYICJJUlE6IFRpbWVyIENvdW50XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1BIWV9GQVNUSU5UKQorCQlwcmludGsoUEZYICJJUlE6IFBoeSBGYXN0IEludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9QSFlfU0xPV0lOVCkKKwkJcHJpbnRrKFBGWCAiSVJROiBQaHkgU2xvdyBJbnRlcnJ1cHRcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfT1RIRVIpCisJCXByaW50ayhQRlggIklSUTogMHg4MDAwMDAwMFxuIik7Cit9IC8qIGhhbmRsZV9vdGhlcl9pcnEgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcm91dGVfZmxhZ19zZXQoc3RydWN0IGFnbnhfaGRyICp0eGhkcikKK3sKKy8vCXUzMiByZWcgPSAwOworCisJLyogRklYTUUgKi8KKy8qICAJcmVnID0gKDB4NyA8PCBST1VURV9DT01QUkVTU0lPTl9TSElGVCkgJiBST1VURV9DT01QUkVTU0lPTjsgKi8KKy8qIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKHJlZyk7ICovCisgCXR4aGRyLT5yZWc1ID0gKDB4YSA8PCAweDApIHwgKDB4NyA8PCAweDE4KTsKKy8vIAl0eGhkci0+cmVnNSA9IGNwdV90b19iZTMyKCgweGEgPDwgMHgwKSB8ICgweDcgPDwgMHgxOCkpOworLy8gCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIoMHg3IDw8IDB4MCk7Cit9CisKKy8qIFJldHVybiAwIGlmIG5vIG1hdGNoICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfcG93ZXJfbGV2ZWwodW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBhbnRlbm5hc19udW0pCit7CisJdW5zaWduZWQgaW50IHBvd2VyX2xldmVsOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxMDoKKwljYXNlIDIwOgorCWNhc2UgNTU6CisJY2FzZSA2MDoKKwljYXNlIDkwOgorCWNhc2UgMTIwOiBwb3dlcl9sZXZlbCA9IDIyOyBicmVhazsKKwljYXNlIDE4MDogcG93ZXJfbGV2ZWwgPSAxOTsgYnJlYWs7CisJY2FzZSAyNDA6IHBvd2VyX2xldmVsID0gMTg7IGJyZWFrOworCWNhc2UgMzYwOiBwb3dlcl9sZXZlbCA9IDE2OyBicmVhazsKKwljYXNlIDQ4MDogcG93ZXJfbGV2ZWwgPSAxNTsgYnJlYWs7CisJY2FzZSA1NDA6IHBvd2VyX2xldmVsID0gMTQ7IGJyZWFrOworCWRlZmF1bHQ6CisJCWFnbnhfYnVnKCJFcnJvciByYXRlIHNldHRpbmdcbiIpOworCX0KKworCWlmIChwb3dlcl9sZXZlbCAmJiAoYW50ZW5uYXNfbnVtID09IDIpKQorCQlwb3dlcl9sZXZlbCAtPSAzOworCisJcmV0dXJuIHBvd2VyX2xldmVsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9hZ254X2hkcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9pbmZvICp0eF9pbmZvKQoreworCXN0cnVjdCBhZ254X2hkciAqdHhoZHIgPSAoc3RydWN0IGFnbnhfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOworCXNpemVfdCBsZW47CisJdTE2IGZjID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikmdHhfaW5mby0+aGRyKTsKKwl1MzIgcmVnOworCisJbWVtc2V0KHR4aGRyLCAwLCBzaXplb2YoKnR4aGRyKSk7CisKKy8vCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgTE9DQUxfU1RBSUQpOworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU1RBVElPTl9JRCwgU1RBVElPTl9JRF9TSElGVCwgQlNTSURfU1RBSUQpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFdPUktRVUVVRV9JRCwgV09SS1FVRVVFX0lEX1NISUZULCAwKTsKKwl0eGhkci0+cmVnNCA9IGNwdV90b19iZTMyKHJlZyk7CisKKwkvKiBTZXQgdGhlIEhhcmR3YXJlIFNlcXVlbmNlIE51bWJlciB0byAxPyAqLworCXJlZyA9IGFnbnhfc2V0X2JpdHMoU0VRVUVOQ0VfTlVNQkVSLCBTRVFVRU5DRV9OVU1CRVJfU0hJRlQsIDApOworLy8JcmVnID0gYWdueF9zZXRfYml0cyhTRVFVRU5DRV9OVU1CRVIsIFNFUVVFTkNFX05VTUJFUl9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoTUFDX0hEUl9MRU4sIE1BQ19IRFJfTEVOX1NISUZULCB0eF9pbmZvLT5oZHJfbGVuKTsKKwl0eGhkci0+cmVnMSA9IGNwdV90b19iZTMyKHJlZyk7CisJLyogU2V0IHRoZSBhZ254X2hkcidzIE1BQyBoZWFkZXIgKi8KKwltZW1jcHkodHhoZHItPm1hY19oZHIsICZ0eF9pbmZvLT5oZHIsIHR4X2luZm8tPmhkcl9sZW4pOworCisJcmVnID0gYWdueF9zZXRfYml0cyhBQ0ssIEFDS19TSElGVCwgMSk7CisvLwlyZWcgPSBhZ254X3NldF9iaXRzKEFDSywgQUNLX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMCk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhNVUxUSUNBU1QsIE1VTFRJQ0FTVF9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUkVMQVksIFJFTEFZX1NISUZULCAwKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhUTSwgVE1fU0hJRlQsIDApOworCXR4aGRyLT5yZWcwID0gY3B1X3RvX2JlMzIocmVnKTsKKworCS8qIFNldCB0aGUgbG9uZyBhbmQgc2hvcnQgcmV0cnkgbGltaXRzICovCisgCXR4aGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKKyAJdHhoZHItPnR4LmxvbmdfcmV0cnlfbGltaXQgPSB0eF9pbmZvLT50eGktPmNvbnRyb2wucmF0ZXNbMF0uY291bnQ7CisKKwkvKiBGSVhNRSAqLworCWxlbiA9IHR4X2luZm8tPnNrYi0+bGVuIC0gc2l6ZW9mKCp0eGhkcikgKyB0eF9pbmZvLT5oZHJfbGVuICsgRkNTX0xFTjsKKwlpZiAoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpCisJCWxlbiArPSA4OworCWxlbiA9IDIzOTg7CisJcmVnID0gYWdueF9zZXRfYml0cyhGUkFHX1NJWkUsIEZSQUdfU0laRV9TSElGVCwgbGVuKTsKKwlsZW4gPSB0eF9pbmZvLT5za2ItPmxlbiAtIHNpemVvZigqdHhoZHIpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFBBWUxPQURfTEVOLCBQQVlMT0FEX0xFTl9TSElGVCwgbGVuKTsKKwl0eGhkci0+cmVnMyA9IGNwdV90b19iZTMyKHJlZyk7CisKKwlyb3V0ZV9mbGFnX3NldCh0eGhkcik7Cit9IC8qIGZpbGxfaGRyICovCisKK3N0YXRpYyB2b2lkIHR4bV9wb3dlcl9zZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGkpCit7CisJc3RydWN0IGFnbnhfc3RhX3Bvd2VyIHBvd2VyOworCXUzMiByZWc7CisKKwkvKiBGSVhNRSAqLworCWlmICh0eGktPmNvbnRyb2wucmF0ZXNbMF0uaWR4IDwgMCkgeworCQkvKiBGb3IgQiBtb2RlIFNob3J0IFByZWFtYmxlICovCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFCX1NIT1JUKTsKKy8vCQljb250cm9sLT50eF9yYXRlID0gLWNvbnRyb2wtPnR4X3JhdGU7CisJfSBlbHNlCisJCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFHKTsKKy8vCQlyZWcgPSBhZ254X3NldF9iaXRzKFBIWV9NT0RFLCBQSFlfTU9ERV9TSElGVCwgQUdOWF9NT0RFXzgwMjExQl9MT05HKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhTSUdOQUwsIFNJR05BTF9TSElGVCwgMHhCKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhSQVRFLCBSQVRFX1NISUZULCAweEIpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAxNSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUE9XRVJfTEVWRUwsIFBPV0VSX0xFVkVMX1NISUZULCAyMCk7CisJLyogaWYgcmF0ZSA8IDExTSBzZXQgaXQgdG8gMCAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKE5VTV9UUkFOU01JVFRFUlMsIE5VTV9UUkFOU01JVFRFUlNfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoRURDRiwgRURDRl9TSElGVCwgMSk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhUSUZTLCBUSUZTX1NISUZULCAxKTsKKworCXBvd2VyLnJlZyA9IHJlZzsKKy8vCXBvd2VyLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisKKy8vCXNldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBMT0NBTF9TVEFJRCk7CisJc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIEJTU0lEX1NUQUlEKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHhfcGFja2V0X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGllZWVfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwlpZiAoc2tiLT5sZW4gPiAyMDQ4KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxlbmd0aCBpcyAlZFxuIiwgc2tiLT5sZW4pOworCQlhZ254X2J1ZygiVG9vIGxvbmcgVFggc2tiIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogRklYTUUgKi8KKwlpZiAoc2tiLT5sZW4gPT0gaWVlZV9sZW4pIHsKKwkJcHJpbnRrKFBGWCAiQSBzdHJhbmdlIFRYIHBhY2tldFxuIik7CisJCXJldHVybiAtMTsKKwkJLyogdHhfZmFpbGVfaXJxc2FmZSgpOyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgYWdueF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmhkcl9kZXNjLCAqZnJhZ19kZXNjOworCXN0cnVjdCBhZ254X2luZm8gKmhkcl9pbmZvLCAqZnJhZ19pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVGhlIFJYIGludGVycnVwdCBuZWVkIGJlIERpc2FibGUgdW50aWwgdGhpcyBUWCBwYWNrZXQKKwkgICBpcyBoYW5kbGVkIGluIHRoZSBuZXh0IHR4IGludGVycnVwdCAqLworCWRpc2FibGVfcnhfaW50ZXJydXB0KHByaXYpOworCisJaSA9IHJpbmctPmlkeDsKKwlyaW5nLT5pZHggKz0gMjsKKy8qICAgCWlmIChwcml2LT50eG1faWR4IC0gcHJpdi0+dHhtX2lkeF9zZW50ID09IEFHTlhfVFhNX1JJTkdfU0laRSAtIDIpICovCisvKiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmh3LCAwKTsgKi8KKworCS8qIFNldCBhZ254IGhlYWRlcidzIGluZm8gYW5kIGRlc2MgKi8KKwlpICU9IHJpbmctPnNpemU7CisJaGRyX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwloZHJfaW5mbyA9IHJpbmctPmluZm8gKyBpOworCWhkcl9pbmZvLT5oZHJfbGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKKwltZW1jcHkoJmhkcl9pbmZvLT5oZHIsIHNrYi0+ZGF0YSwgaGRyX2luZm8tPmhkcl9sZW4pOworCisJLyogQWRkIHRoZSBhZ254IGhlYWRlciB0byB0aGUgZnJvbnQgb2YgdGhlIFNLQiAqLworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBhZ254X2hkcikgLSBoZHJfaW5mby0+aGRyX2xlbik7CisKKwloZHJfaW5mby0+dHhpID0gdHhpOworCWhkcl9pbmZvLT5kbWFfbGVuID0gc2l6ZW9mKHN0cnVjdCBhZ254X2hkcik7CisJaGRyX2luZm8tPnNrYiA9IHNrYjsKKwloZHJfaW5mby0+dHlwZSA9IEhFQURFUjsKKwlmaWxsX2FnbnhfaGRyKHByaXYsIGhkcl9pbmZvKTsKKwloZHJfaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgaGRyX2luZm8tPmRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRvIHsKKwkJdTMyIGZyYWcgPSAwOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoRklSU1RfRlJBRywgRklSU1RfRlJBR19TSElGVCwgMSk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhMQVNUX0ZSQUcsIExBU1RfRlJBR19TSElGVCwgMCk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhQQUNLRVRfTEVOLCBQQUNLRVRfTEVOX1NISUZULCBza2ItPmxlbik7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHX0xFTiwgRklSU1RfRlJBR19MRU5fU0hJRlQsIDEpOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoT1dORVIsIE9XTkVSX1NISUZULCAxKTsKKwkJaGRyX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwloZHJfZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihoZHJfaW5mby0+bWFwcGluZyk7CisKKworCS8qIFNldCBGcmFnJ3MgaW5mbyBhbmQgZGVzYyAqLworCWkgPSAoaSArIDEpICUgcmluZy0+c2l6ZTsKKwlmcmFnX2Rlc2MgPSByaW5nLT5kZXNjICsgaTsKKwlmcmFnX2luZm8gPSByaW5nLT5pbmZvICsgaTsKKwltZW1jcHkoZnJhZ19pbmZvLCBoZHJfaW5mbywgc2l6ZW9mKHN0cnVjdCBhZ254X2luZm8pKTsKKwlmcmFnX2luZm8tPnR5cGUgPSBQQUNLRVQ7CisJZnJhZ19pbmZvLT5kbWFfbGVuID0gc2tiLT5sZW4gLSBoZHJfaW5mby0+ZG1hX2xlbjsKKwlmcmFnX2luZm8tPm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2ItPmRhdGEgKyBoZHJfaW5mby0+ZG1hX2xlbiwKKwkJCQkJICAgIGZyYWdfaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJZG8geworCQl1MzIgZnJhZyA9IDA7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHLCBGSVJTVF9GUkFHX1NISUZULCAwKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKExBU1RfRlJBRywgTEFTVF9GUkFHX1NISUZULCAxKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFBBQ0tFVF9MRU4sIFBBQ0tFVF9MRU5fU0hJRlQsIHNrYi0+bGVuKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFNVQl9GUkFHX0xFTiwgU1VCX0ZSQUdfTEVOX1NISUZULCBmcmFnX2luZm8tPmRtYV9sZW4pOworCQlmcmFnX2Rlc2MtPmZyYWcgPSBjcHVfdG9fYmUzMihmcmFnKTsKKwl9IHdoaWxlICgwKTsKKwlmcmFnX2Rlc2MtPmRtYV9hZGRyID0gY3B1X3RvX2JlMzIoZnJhZ19pbmZvLT5tYXBwaW5nKTsKKworCXR4bV9wb3dlcl9zZXQocHJpdiwgdHhpKTsKKworLyogCWRvIHsgKi8KKy8qIAkJaW50IGo7ICovCisvKiAJCXNpemVfdCBsZW47ICovCisvKiAJCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2luZm8tPmRtYV9sZW4gKyBoZHJfaW5mby0+aGRyX2xlbjsgICovCisvKiAvLwkJaWYgKGxlbiA9PSA2MTQpIHsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfZGVzYyhoZHJfZGVzYyk7ICovCisvKiAJCQlhZ254X3ByaW50X2Rlc2MoZnJhZ19kZXNjKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfdHhfaGRyKChzdHJ1Y3QgYWdueF9oZHIgKilza2ItPmRhdGEpOyAqLworLyogCQkJYWdueF9wcmludF9zdGFfcG93ZXIocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJYWdueF9wcmludF9zdGEocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgKi8KKy8qIAkJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBMT0NBTF9TVEFJRCwgaik7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YShwcml2LCBCU1NJRF9TVEFJRCk7ICovCisvKiAJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIEJTU0lEX1NUQUlELCBqKTsgKi8KKy8qIAkJCS8vCX0gKi8KKy8qIAl9IHdoaWxlICgwKTsgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZJWE1FIHVnbHkgY29kZSAqLworCS8qIFRyaWdnZXIgVFhNICovCisJZG8geworCQl1MzIgcmVnOworCQlyZWcgPSAoaW9yZWFkMzIocHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKSk7CisJCXJlZyB8PSAweDg7CisJCWlvd3JpdGUzMigocmVnKSwgcHJpdi0+Y3RsICsgQUdOWF9DSVJfVFhNQ1RMKTsKKwl9d2hpbGUgKDApOworCisJLyogVHJpZ2dlciBUWEQgKi8KKwlkbyB7CisJCXUzMiByZWc7CisJCXJlZyA9IChpb3JlYWQzMihwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpKTsKKwkJcmVnIHw9IDB4ODsKKwkJaW93cml0ZTMyKChyZWcpLCBwcml2LT5jdGwgKyBBR05YX0NJUl9UWERDVEwpOworCX13aGlsZSAoMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9hZ254X3R4KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IGZjdGw7CisKKwlpZiAodHhfcGFja2V0X2NoZWNrKHNrYikpCisJCXJldHVybiAwOworCisvKiAJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImFnbng6IFRYX1BBQ0tFVDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgKi8KKy8qIAkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbik7ICovCisKKyAgICAgICAgZmN0bCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKXNrYi0+ZGF0YSkpOworCisJaWYgKCAoZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSAgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgKQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4ZCk7CisJZWxzZQorCQlyZXR1cm4gX19hZ254X3R4KHByaXYsIHNrYiwgJnByaXYtPnR4bSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhYzQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaApAQCAtMCwwICsxLDI1MCBAQAorI2lmbmRlZiBBR05YX1hNSVRfSF8KKyNkZWZpbmUgQUdOWF9YTUlUX0hfCisKKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworc3RydWN0IGFnbnhfcHJpdjsKKworc3RhdGljIGlubGluZSB1MzIgYWdueF9zZXRfYml0cyh1MzIgbWFzaywgdTggc2hpZnQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gKHZhbHVlIDw8IHNoaWZ0KSAmIG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFnbnhfZ2V0X2JpdHModTMyIG1hc2ssIHU4IHNoaWZ0LCB1MzIgdmFsdWUpCit7CisJcmV0dXJuICh2YWx1ZSAmIG1hc2spID4+IHNoaWZ0OworfQorCisKK3N0cnVjdCBhZ254X3J4IHsKKwlfX2JlMTYgcnhfcGFja2V0X2R1cmF0aW9uOyAvKiAgUlggUGFja2V0IER1cmF0aW9uICovCisJX19iZTE2IHJlcGxheV9jbnQ7CS8qIFJlcGxheSBDb3VudCAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworc3RydWN0IGFnbnhfdHggeworCXU4IGxvbmdfcmV0cnlfbGltaXQ7IC8qIExvbmcgUmV0cnkgTGltaXQgKi8KKwl1OCBzaG9ydF9yZXRyeV9saW1pdDsgLyogU2hvcnQgUmV0cnkgTGltaXQgKi8KKwl1OCBsb25nX3JldHJ5X2NudDsJLyogTG9uZyBSZXRyeSBDb3VudCAqLworCXU4IHNob3J0X3JldHJ5X2NudDsgLyogU2hvcnQgUmV0cnkgQ291bnQgKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qIENvcHkgZnJvbSBiY200M3h4ICovCisjZGVmaW5lIFA0RF9CWVQzUyhtYWdpYywgbnJfYnl0ZXMpICAgICAgdTggX19wNGRkaW5nIyNtYWdpY1tucl9ieXRlc10KKyNkZWZpbmUgUDREX0JZVEVTKGxpbmUsIG5yX2J5dGVzKSAgICAgICBQNERfQllUM1MobGluZSwgbnJfYnl0ZXMpCisjZGVmaW5lIFBBRF9CWVRFUyhucl9ieXRlcykgICAgICAgICAgICAgUDREX0JZVEVTKF9fTElORV9fLCBucl9ieXRlcykKKworI2RlZmluZSBQNERfQklUM1MobWFnaWMsIG5yX2JpdHMpICAgICAgIF9fYmUzMiBfX3BhZGRpbmcjI21hZ2ljOm5yX2JpdHMKKyNkZWZpbmUgUDREX0JJVFMobGluZSwgbnJfYml0cykgICAgICAgICBQNERfQklUM1MobGluZSwgbnJfYml0cykKKyNkZWZpbmUgUEFEX0JJVFMobnJfYml0cykJICAgICAgICBQNERfQklUUyhfX0xJTkVfXywgbnJfYml0cykKKworCitzdHJ1Y3QgYWdueF9oZHIgeworCV9fYmUzMiByZWcwOworI2RlZmluZSBSVFMJCSAgICAgICAgMHg4MDAwMDAwMCAvKiBSVFMgKi8KKyNkZWZpbmUgUlRTX1NISUZUCQkzMQorI2RlZmluZSBNVUxUSUNBU1QJICAgICAgICAweDQwMDAwMDAwIC8qIG11bHRpY2FzdCAqLworI2RlZmluZSBNVUxUSUNBU1RfU0hJRlQJCTMwCisjZGVmaW5lIEFDSwkJCTB4MzAwMDAwMDAgLyogQUNLICovCisjZGVmaW5lIEFDS19TSElGVAkJMjgKKyNkZWZpbmUgVE0JCQkweDA4MDAwMDAwIC8qIFRNICovCisjZGVmaW5lIFRNX1NISUZUCQkyNworI2RlZmluZSBSRUxBWQkJCTB4MDQwMDAwMDAgLyogUmVsYXkgKi8KKyNkZWZpbmUgUkVMQVlfU0hJRlQJCTI2CisvKiAJUEFEX0JJVFMoNCk7ICovCisjZGVmaW5lIFJFVklTRURfRkNTCQkweDAwMzgwMDAwIC8qIHJldmlzZWQgRkNTICovCisjZGVmaW5lIFJFVklTRURfRkNTX1NISUZUCTE5CisjZGVmaW5lIE5FWFRfQlVGRkVSX0FERFIJMHgwMDA3RkZGRiAvKiBOZXh0IEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIE5FWFRfQlVGRkVSX0FERFJfU0hJRlQJMAorCisJX19iZTMyIHJlZzE7CisjZGVmaW5lIE1BQ19IRFJfTEVOCQkweEZDMDAwMDAwIC8qIE1BQyBIZWFkZXIgTGVuZ3RoICAqLworI2RlZmluZSBNQUNfSERSX0xFTl9TSElGVAkyNgorI2RlZmluZSBEVVJBVElPTl9PVkVSSURFCTB4MDIwMDAwMDAgLyogRHVyYXRpb24gT3ZlcnJpZGUgKi8KKyNkZWZpbmUgRFVSQVRJT05fT1ZFUklERV9TSElGVAkyNQorI2RlZmluZSBQSFlfSERSX09WRVJJREUJCTB4MDEwMDAwMDAgLyogUEhZIEhlYWRlciBPdmVycmlkZSAqLworI2RlZmluZSBQSFlfSERSX09WRVJJREVfU0hJRlQJMjQKKyNkZWZpbmUgQ1JDX0ZBSUwJCTB4MDA4MDAwMDAgLyogQ1JDIGZhaWwgKi8KKyNkZWZpbmUgQ1JDX0ZBSUxfU0hJRlQJCTIzCisvKglQQURfQklUUygxKTsgKi8KKyNkZWZpbmUgU0VRVUVOQ0VfTlVNQkVSCQkweDAwMjAwMDAwIC8qIFNlcXVlbmNlIE51bWJlciAqLworI2RlZmluZSBTRVFVRU5DRV9OVU1CRVJfU0hJRlQJMjEKKy8qCVBBRF9CSVRTKDIpOyAqLworI2RlZmluZSBCVUZGX0hFQURfQUREUgkJMHgwMDA3RkZGRiAvKiBCdWZmZXIgSGVhZCBBZGRyZXNzICovCisjZGVmaW5lIEJVRkZfSEVBRF9BRERSX1NISUZUCTAKKworCV9fYmUzMiByZWcyOworI2RlZmluZSBQRFVfQ09VTlQJCTB4RkMwMDAwMDAgLyogUERVIENvdW50ICovCisjZGVmaW5lIFBEVV9DT1VOVF9TSElGVAkJMjYKKy8qIAlQQURfQklUUygzKTsgKi8KKyNkZWZpbmUgV0VQX0tFWQkJCTB4MDA2MDAwMDAgLyogV0VQIEtleSAjICovCisjZGVmaW5lIFdFUF9LRVlfU0hJRlQJCTIxCisjZGVmaW5lIFVTRVNfV0VQX0tFWQkJMHgwMDEwMDAwMCAvKiBVc2VzIFdFUCBLZXkgKi8KKyNkZWZpbmUgVVNFU19XRVBfS0VZX1NISUZUCTIwCisjZGVmaW5lIEtFRVBfQUxJVkUJCTB4MDAwODAwMDAgLyogS2VlcCBhbGl2ZSAqLworI2RlZmluZSBLRUVQX0FMSVZFX1NISUZUCTE5CisjZGVmaW5lIEJVRkZfVEFJTF9BRERSCQkweDAwMDdGRkZGIC8qIEJ1ZmZlciBUYWlsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQlVGRl9UQUlMX0FERFJfU0hJRlQJMAorCisJX19iZTMyIHJlZzM7CisjZGVmaW5lIENUU18xMUcJCQkweDgwMDAwMDAwCS8qIENUUyBpbiAxMWcgKi8KKyNkZWZpbmUgQ1RTXzExR19TSElGVAkJMzEKKyNkZWZpbmUgUlRTXzExRwkJCTB4NDAwMDAwMDAJLyogUlRTIGluIDExZyAqLworI2RlZmluZSBSVFNfMTFHX1NISUZUCQkzMAorLyogUEFEX0JJVFMoMik7ICovCisjZGVmaW5lIEZSQUdfU0laRQkJMHgwRkZGMDAwMAkvKiBmcmFnbWVudCBzaXplICovCisjZGVmaW5lIEZSQUdfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgUEFZTE9BRF9MRU4JCTB4MDAwMEZGRjAJLyogcGF5bG9hZCBsZW5ndGggKi8KKyNkZWZpbmUgUEFZTE9BRF9MRU5fU0hJRlQJNAorI2RlZmluZSBGUkFHX05VTQkJMHgwMDAwMDAwRgkvKiBudW1iZXIgb2YgZnJhZ3MgKi8KKyNkZWZpbmUgRlJBR19OVU1fU0hJRlQJCTAKKworCV9fYmUzMiByZWc0OworLyogCVBBRF9CSVRTKDQpOyAqLworI2RlZmluZSBSRUxBWV9TVEFJRAkJMHgwRkZGMDAwMCAvKiByZWxheVN0YWxkICovCisjZGVmaW5lIFJFTEFZX1NUQUlEX1NISUZUCTE2CisjZGVmaW5lIFNUQVRJT05fSUQJCTB4MDAwMEZGRjAgLyogU3RhdGlvbiBJRCAqLworI2RlZmluZSBTVEFUSU9OX0lEX1NISUZUCTQKKyNkZWZpbmUgV09SS1FVRVVFX0lECQkweDAwMDAwMDBGIC8qIFdvcmtxdWV1ZSBJRCAqLworI2RlZmluZSBXT1JLUVVFVUVfSURfU0hJRlQJMAorCisJLyogRklYTUUgdGhpcyByZWdpc3RlciBtYXliZSBpcyBMRT8gKi8KKwlfX2JlMzIgcmVnNTsKKy8qIAlQQURfQklUUyg0KTsgKi8KKyNkZWZpbmUgUk9VVEVfSE9TVAkJMHgwRjAwMDAwMAorI2RlZmluZSBST1VURV9IT1NUX1NISUZUCTI0CisjZGVmaW5lIFJPVVRFX0NBUkRfQ1BVCQkweDAwRjAwMDAwCisjZGVmaW5lIFJPVVRFX0NBUkRfQ1BVX1NISUZUCTIwCisjZGVmaW5lIFJPVVRFX0VOQ1JZUFRJT04JMHgwMDBGMDAwMAorI2RlZmluZSBST1VURV9FTkNSWVBUSU9OX1NISUZUCTE2CisjZGVmaW5lIFJPVVRFX1RYCQkweDAwMDBGMDAwCisjZGVmaW5lIFJPVVRFX1RYX1NISUZUCQkxMgorI2RlZmluZSBST1VURV9SWDEJCTB4MDAwMDBGMDAKKyNkZWZpbmUgUk9VVEVfUlgxX1NISUZUCQk4CisjZGVmaW5lIFJPVVRFX1JYMgkJMHgwMDAwMDBGMAorI2RlZmluZSBST1VURV9SWDJfU0hJRlQJCTQKKyNkZWZpbmUgUk9VVEVfQ09NUFJFU1NJT04JMHgwMDAwMDAwRgorI2RlZmluZSBST1VURV9DT01QUkVTU0lPTl9TSElGVCAwCisKKwlfX2JlMzIgXzExZzA7CQkJLyogMTFnICovCisJX19iZTMyIF8xMWcxOwkJCS8qIDExZyAqLworCV9fYmUzMiBfMTFiMDsJCQkvKiAxMWIgKi8KKwlfX2JlMzIgXzExYjE7CQkJLyogMTFiICovCisJdTggbWFjX2hkclszMl07CQkJLyogTUFDIGhlYWRlciAqLworCisJX19iZTE2IHJ0c19kdXJhdGlvbjsJCS8qIFJUUyBkdXJhdGlvbiAqLworCV9fYmUxNiBsYXN0X2R1cmF0aW9uOwkJLyogTGFzdCBkdXJhdGlvbiAqLworCV9fYmUxNiBzZWNfbGFzdF9kdXJhdGlvbjsJLyogU2Vjb25kIHRvIExhc3QgZHVyYXRpb24gKi8KKwlfX2JlMTYgb3RoZXJfZHVyYXRpb247CQkvKiBPdGhlciBkdXJhdGlvbiAqLworCV9fYmUxNiB0eF9sYXN0X2R1cmF0aW9uOwkvKiBUWCBMYXN0IGR1cmF0aW9uICovCisJX19iZTE2IHR4X290aGVyX2R1cmF0aW9uOwkvKiBUWCBPdGhlciBEdXJhdGlvbiAqLworCV9fYmUxNiBsYXN0XzExZ19sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWcgKi8KKwlfX2JlMTYgb3RoZXJfMTFnX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWcgKi8KKworCV9fYmUxNiBsYXN0XzExYl9sZW47CQkvKiBMZW5ndGggb2YgbGFzdCAxMWIgKi8KKwlfX2JlMTYgb3RoZXJfMTFiX2xlbjsJCS8qIExlbmdodCBvZiBvdGhlciAxMWIgKi8KKworCisJX19iZTE2IHJlZzY7CisjZGVmaW5lIE1CRgkJCTB4RjAwMCAvKiBtYmYgKi8KKyNkZWZpbmUgTUJGX1NISUZUCQkxMgorI2RlZmluZSBSU1ZENAkJCTB4MEZGRiAvKiByc3ZkNCAqLworI2RlZmluZSBSU1ZENF9TSElGVAkJMAorCisJX19iZTE2IHJ4X2ZyYWdfc3RhdDsJLyogUlggZnJhZ21lbnRhdGlvbiBzdGF0dXMgKi8KKworCV9fYmUzMiB0aW1lX3N0YW1wOwkvKiBUaW1lU3RhbXAgKi8KKwlfX2JlMzIgcGh5X3N0YXRzX2hpOwkvKiBQSFkgc3RhdHMgaGkgKi8KKwlfX2JlMzIgcGh5X3N0YXRzX2xvOwkvKiBQSFkgc3RhdHMgbG8gKi8KKwlfX2JlMzIgbWljX2tleTA7CS8qIE1JQyBrZXkgMCAqLworCV9fYmUzMiBtaWNfa2V5MTsJLyogTUlDIGtleSAxICovCisKKwl1bmlvbiB7CQkJLyogUlgvVFggVW5pb24gKi8KKwkJc3RydWN0IGFnbnhfcnggcng7CisJCXN0cnVjdCBhZ254X3R4IHR4OworCX07CisKKwl1OCByeF9jaGFubmVsOwkJLyogUmVjaWV2ZSBDaGFubmVsICovCisJUEFEX0JZVEVTKDMpOworCisJdTggcmVzZXJ2ZWRbNF07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCitzdHJ1Y3QgYWdueF9kZXNjIHsKKyNkZWZpbmUgUEFDS0VUX0xFTgkJMHhGRkYwMDAwMAorI2RlZmluZSBQQUNLRVRfTEVOX1NISUZUCTIwCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRklSU1RfUEFDS0VUX01BU0sJMHgwMDA4MDAwMAorI2RlZmluZSBGSVJTVF9QQUNLRVRfTUFTS19TSElGVAkxOQorI2RlZmluZSBGSVJTVF9SRVNFUlYyCQkweDAwMDQwMDAwCisjZGVmaW5lIEZJUlNUX1JFU0VSVjJfU0hJRlQJMTgKKyNkZWZpbmUgRklSU1RfVEtJUF9FUlJPUgkweDAwMDIwMDAwCisjZGVmaW5lIEZJUlNUX1RLSVBfRVJST1JfU0hJRlQJMTcKKyNkZWZpbmUgRklSU1RfVEtJUF9QQUNLRVQJMHgwMDAxMDAwMAorI2RlZmluZSBGSVJTVF9US0lQX1BBQ0tFVF9TSElGVAkxNgorI2RlZmluZSBGSVJTVF9SRVNFUlYxCQkweDAwMDBGMDAwCisjZGVmaW5lIEZJUlNUX1JFU0VSVjFfU0hJRlQJMTIKKyNkZWZpbmUgRklSU1RfRlJBR19MRU4JCTB4MDAwMDBGRjgKKyNkZWZpbmUgRklSU1RfRlJBR19MRU5fU0hJRlQJMworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFNVQl9SRVNFUlYyCQkweDAwMGMwMDAwCisjZGVmaW5lIFNVQl9SRVNFUlYyX1NISUZUCTE4CisjZGVmaW5lIFNVQl9US0lQX0VSUk9SCQkweDAwMDIwMDAwCisjZGVmaW5lIFNVQl9US0lQX0VSUk9SX1NISUZUCTE3CisjZGVmaW5lIFNVQl9US0lQX1BBQ0tFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBTVUJfVEtJUF9QQUNLRVRfU0hJRlQJMTYKKyNkZWZpbmUgU1VCX1JFU0VSVjEJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU1VCX1JFU0VSVjFfU0hJRlQJMTUKKyNkZWZpbmUgU1VCX0ZSQUdfTEVOCQkweDAwMDA3RkY4CisjZGVmaW5lIFNVQl9GUkFHX0xFTl9TSElGVAkzCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRklSU1RfRlJBRwkJMHgwMDAwMDAwNAorI2RlZmluZSBGSVJTVF9GUkFHX1NISUZUCTIKKyNkZWZpbmUgTEFTVF9GUkFHCQkweDAwMDAwMDAyCisjZGVmaW5lIExBU1RfRlJBR19TSElGVAkJMQorI2RlZmluZSBPV05FUgkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgT1dORVJfU0hJRlQJCTAKKwlfX2JlMzIgZnJhZzsKKwlfX2JlMzIgZG1hX2FkZHI7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworZW51bSB7SEVBREVSLCBQQUNLRVR9OworCitzdHJ1Y3QgYWdueF9pbmZvIHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgZG1hX2FkZHJfdCBtYXBwaW5nOworCXUzMiBkbWFfbGVuOwkJLyogZG1hIGJ1ZmZlciBsZW4gICovCisJLyogQmVsb3cgZmllbGRzIG9ubHkgdXNmdWwgZm9yIHR4ICovCisJdTMyIGhkcl9sZW47CQkvKiBpZWVlODAyMTEgaGVhZGVyIGxlbmd0aCAqLworCXVuc2lnbmVkIGludCB0eXBlOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgaGRyOworfTsKKworCitzdHJ1Y3QgYWdueF9yaW5nIHsKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjOworCWRtYV9hZGRyX3QgZG1hOworCXN0cnVjdCBhZ254X2luZm8gKmluZm87CisJLyogV2lsbCBsZWFkIHRvIG92ZXJmbG93IHdoZW4gc2VudCBwYWNrZXQgbnVtYmVyIGVub3VnaD8gKi8KKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBpZHhfc2VudDsJCS8qIG9ubHkgdXNmdWwgZm9yIHR4ZCBhbmQgdHhtICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisjZGVmaW5lIEFHTlhfUlhfUklOR19TSVpFCTEyOAorI2RlZmluZSBBR05YX1RYRF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIEFHTlhfVFhNX1JJTkdfU0laRQkxMjgKKwordm9pZCBkaXNhYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgZW5hYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBmaWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCB1bmZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV9yeF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV90eGRfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBoYW5kbGVfdHhtX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgaGFuZGxlX290aGVyX2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBfYWdueF90eChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNlbmRpZiAvKiBBR05YX1hNSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRiZjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBBTFRFUkFfUENJRV9DSERNQQorCXRyaXN0YXRlICJBbHRlcmEgUENJIEV4cHJlc3MgQ2hhaW5pbmcgRE1BIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEEgcmVmZXJlbmNlIGRyaXZlciB0aGF0IGV4ZXJjaXNlcyB0aGUgQ2hhaW5pbmcgRE1BIGxvZ2ljIHJlZmVyZW5jZQorCSAgZGVzaWduIGdlbmVyYXRlZCBhbG9uZyB0aGUgQWx0ZXJhIEZQR0EgUENJIEV4cHJlc3Mgc29mdCBvciBoYXJkIGNvcmUsCisJICBvbmx5IGlmIGluc3RhbnRpYXRlZCB1c2luZyB0aGUgTWVnYVdpemFyZCwgbm90IHRoZSBTT1BDIGJ1aWxkZXIsIG9mCisJICBRdWFydHVzIDguMS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4Yzg0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfQUxURVJBX1BDSUVfQ0hETUEpCSs9IGFsdHBjaWVjaGRtYS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM5NDVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9UT0RPCkBAIC0wLDAgKzEsMTUgQEAKK0RPTkU6CisgICAgLSBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gbG9naWMgdGVzdGJlbmNoCisKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzLgorCS0ga2VlcCBzdGF0ZSBvZiBETUEgZW5naW5lcy4KKwktIGtlZXAgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyBzdGF0ZSBvZiBlYWNoIHRyYW5zZmVyLgorCS0gaW50ZXJydXB0IGhhbmRsZXIgc2hvdWxkIGl0ZXJhdGUgb3ZlciBvdXRzdGFuZGluZyBkZXNjcmlwdG9yIHRhYmxlcy4KKwktIGNvbXBsZXRlIHVzZXJzcGFjZSBjZGV2IHRvIHJlYWQvd3JpdGUgdXNpbmcgdGhlIERNQSBlbmdpbmVzLgorCS0gc3BsaXQgb2ZmIHRoZSBETUEgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYSBtb2R1bGUsIHJlLXVzYWJsZSBieSBjdXN0b20KKwkgIGRyaXZlcnMuCisKK1BsZWFzZSBjb29yZGluYXRlIHdvcmsgd2l0aCwgYW5kIHNlbmQgcGF0Y2hlcyB0bworTGVvbiBXb2VzdGVuYmVyZyA8bGVvbkBzaWRlYnJhbmNoLmNvbT4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYjRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKQEAgLTAsMCArMSwxMTg0IEBACisvKioKKyAqIERyaXZlciBmb3IgQWx0ZXJhIFBDSWUgY29yZSBjaGFpbmluZyBETUEgcmVmZXJlbmNlIGRlc2lnbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTGVvbiBXb2VzdGVuYmVyZyAgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOaWNrb2xhcyBIZXBwZXJtYW5uICA8aGVwcGVybWFubndkdEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKgorICogUmF0aW9uYWxlOiBUaGlzIGRyaXZlciBleGVyY2lzZXMgdGhlIGNoYWluaW5nIERNQSByZWFkIGFuZCB3cml0ZSBlbmdpbmUKKyAqIGluIHRoZSByZWZlcmVuY2UgZGVzaWduLiBJdCBpcyBtZWFudCBhcyBhIGNvbXBsZW1lbnRhcnkgcmVmZXJlbmNlCisgKiBkcml2ZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZyBlYXJseSBkZXNpZ25zIGFzIHdlbGwgYXMgYSBiYXNpcyB0bworICogd3JpdGUgeW91ciBjdXN0b20gZHJpdmVyLgorICoKKyAqIFN0YXR1czogVGVzdCByZXN1bHRzIGZyb20gTGVvbiBXb2VzdGVuYmVyZyAgPGxlb24ud29lc3RlbmJlcmdAYXhvbi50dj46CisgKgorICogU2VuZGVybyBCb2FyZCB3LyBDeWNsb25lIElJIEVQMkMzNUY2NzJDNk4sIFBYMTAxMUEgUENJZSB4MSBQSFkgb24gYQorICogRGVsbCBQcmVjaXNpb24gMzcwIFBDLCB4ODYsIGtlcm5lbCAyLjYuMjAgZnJvbSBVYnVudHUgNy4wNC4KKyAqCisgKiBTZW5kZXJvIEJvYXJkIHcvIEN5Y2xvbmUgSUkgRVAyQzM1RjY3MkM2TiwgUFgxMDExQSBQQ0llIHgxIFBIWSBvbiBhCisgKiBGcmVlc2NhbGUgTVBDODMxM0UtUkRCIGJvYXJkLCBQb3dlclBDLCAyLjYuMjQgdy8gRnJlZXNjYWxlIHBhdGNoZXMuCisgKgorICogRHJpdmVyIHRlc3RzIHBhc3NlZCB3aXRoIFBDSWUgQ29tcGlsZXIgOC4xLiBXaXRoIFBDSWUgOC4wIHRoZSBETUEKKyAqIGxvb3BiYWNrIHRlc3QgaGFkIHJlcHJvZHVjYWJsZSBjb21wYXJlIGVycm9ycy4gSSBhc3N1bWUgYSBjaGFuZ2UKKyAqIGluIHRoZSBjb21waWxlciBvciByZWZlcmVuY2UgZGVzaWduLCBidXQgY291bGQgbm90IGZpbmQgZXZpZGVuY2Ugbm9yCisgKiBkb2N1bWVudGF0aW9uIG9uIGEgY2hhbmdlIG9yIGZpeCBpbiB0aGF0IGRpcmVjdGlvbi4KKyAqCisgKiBUaGUgcmVmZXJlbmNlIGRlc2lnbiBkb2VzIG5vdCBoYXZlIHJlYWRhYmxlIGxvY2F0aW9ucyBhbmQgdGh1cyBhCisgKiBkdW1teSByZWFkLCB1c2VkIHRvIGZsdXNoIFBDSSBwb3N0ZWQgd3JpdGVzLCBjYW5ub3QgYmUgcGVyZm9ybWVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworCisvKiBieSBkZWZhdWx0IGRvIG5vdCBidWlsZCB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2UgKi8KKy8qIFhYWCBJdCBpcyBub24tZnVuY3Rpb25hbCB5ZXQgKi8KKyNpZm5kZWYgQUxUUENJRUNIRE1BX0NERVYKKyMgIGRlZmluZSBBTFRQQ0lFQ0hETUFfQ0RFViAwCisjZW5kaWYKKworLyogYnVpbGQgdGhlIGNoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlPyAqLworI2lmIEFMVFBDSUVDSERNQV9DREVWCisjICBkZWZpbmUgTUFYX0NIRE1BX1NJWkUgKDggKiAxMDI0ICogMTAyNCkKKyMgIGluY2x1ZGUgIm1hcHBlcl91c2VyX3RvX3NnLmgiCisjZW5kaWYKKworLyoqIGRyaXZlciBuYW1lLCBtaW1pY2tzIEFsdGVyYSBuYW1pbmcgb2YgdGhlIHJlZmVyZW5jZSBkZXNpZ24gKi8KKyNkZWZpbmUgRFJWX05BTUUgImFsdHBjaWVjaGRtYSIKKy8qKiBudW1iZXIgb2YgQkFScyBvbiB0aGUgZGV2aWNlICovCisjZGVmaW5lIEFQRV9CQVJfTlVNICg2KQorLyoqIEJBUiBudW1iZXIgd2hlcmUgdGhlIFJDU0xBVkUgbWVtb3J5IHNpdHMgKi8KKyNkZWZpbmUgQVBFX0JBUl9SQ1NMQVZFICgwKQorLyoqIEJBUiBudW1iZXIgd2hlcmUgdGhlIERlc2NyaXB0b3IgSGVhZGVyIHNpdHMgKi8KKyNkZWZpbmUgQVBFX0JBUl9IRUFERVIgKDIpCisKKy8qKiBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRlc2NyaXB0b3IgdGFibGUsIGNoZG1hIGxvZ2ljIGxpbWl0ICovCisjZGVmaW5lIEFQRV9DSERNQV9UQUJMRV9TSVpFICg0MDk2KQorLyogc2luZ2xlIHRyYW5zZmVyIG11c3Qgbm90IGV4Y2VlZCAyNTUgdGFibGUgZW50cmllcy4gd29yc3QgY2FzZSB0aGlzIGNhbiBiZQorICogYWNoaWV2ZWQgYnkgMjU1IHNjYXR0ZXJlZCBwYWdlcywgd2l0aCBvbmx5IGEgc2luZ2xlIGJ5dGUgaW4gdGhlIGhlYWQgYW5kCisgKiB0YWlsIHBhZ2VzLiAyNTMgKiBQQUdFX1NJWkUgaXMgYSBzYWZlIHVwcGVyIGJvdW5kIGZvciB0aGUgdHJhbnNmZXIgc2l6ZS4KKyAqLworI2RlZmluZSBBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTiAoMjUzICogUEFHRV9TSVpFKQorCisvKioKKyAqIFNwZWNpZmllcyB0aG9zZSBCQVJzIHRvIGJlIG1hcHBlZCBhbmQgdGhlIGxlbmd0aCBvZiBlYWNoIG1hcHBpbmcuCisgKgorICogWmVybyAoMCkgbWVhbnMgZG8gbm90IG1hcCwgb3RoZXJ3aXNlIHNwZWNpZmllcyB0aGUgQkFSIGxlbmd0aHMgdG8gYmUgbWFwcGVkLgorICogSWYgdGhlIGFjdHVhbCBCQVIgbGVuZ3RoIGlzIGxlc3MsIHRoaXMgaXMgY29uc2lkZXJlZCBhbiBlcnJvcjsgdGhlbgorICogcmVjb25maWd1cmUgeW91ciBQQ0llIGNvcmUuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlIDctMiBhdCBwYWdlIDctMTMuCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGJhcl9taW5fbGVuW0FQRV9CQVJfTlVNXSA9CisJeyAzMjc2OCwgMCwgMjU2LCAwLCAzMjc2OCwgMCB9OworCisvKioKKyAqIERlc2NyaXB0b3IgSGVhZGVyLCBjb250cm9scyB0aGUgRE1BIHJlYWQgZW5naW5lIG9yIHdyaXRlIGVuZ2luZS4KKyAqCisgKiBUaGUgZGVzY3JpcHRvciBoZWFkZXIgaXMgdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgZm9yIHN0YXJ0aW5nIERNQSB0cmFuc2ZlcnMuCisgKgorICogSXQgc2l0cyBpbiBFbmQgUG9pbnQgKEZQR0EpIG1lbW9yeSBCQVJbMl0gZm9yIDMyLWJpdCBvciBCQVJbMzoyXSBmb3IgNjQtYml0LgorICogSXQgcmVmZXJlbmNlcyBhIGRlc2NyaXB0b3IgdGFibGUgd2hpY2ggZXhpc3RzIGluIFJvb3QgQ29tcGxleCAoUEMpIG1lbW9yeS4KKyAqIFdyaXRpbmcgdGhlIHJjbGFzdCBmaWVsZCBzdGFydHMgdGhlIERNQSBvcGVyYXRpb24sIHRodXMgYWxsIG90aGVyIHN0cnVjdHVyZXMKKyAqIGFuZCBmaWVsZHMgbXVzdCBiZSBzZXR1cCBiZWZvcmUgZG9pbmcgc28uCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTMsIDctNCBhbmQgNy01IGF0IHBhZ2UgNy0xNC4KKyAqIEBub3RlIFRoaXMgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiBpbiBmb3VyIDMyLWJpdCAoUENJIERXT1JEKSB3cml0ZXMuCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfaGVhZGVyIHsKKwkvKioKKwkgKiB3MCBjb25zaXN0cyBvZiB0d28gMTYtYml0IGZpZWxkczoKKwkgKiBsc2IgdTE2IG51bWJlcjsgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIGFwZV9jaGRtYV90YWJsZQorCSAqIG1zYiB1MTYgY29udHJvbDsgZ2xvYmFsIGNvbnRyb2wgZmxhZ3MKKwkgKi8KKwl1MzIgdzA7CisJLyogYnVzIGFkZHJlc3MgdG8gYXBlX2NoZG1hX3RhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnkgKi8KKwl1MzIgYmR0X2FkZHJfaDsKKwl1MzIgYmR0X2FkZHJfbDsKKwkvKioKKwkgKiB3MyBjb25zaXN0cyBvZiB0d28gMTYtYml0IGZpZWxkczoKKwkgKiAtIGxzYiB1MTYgcmNsYXN0OyBsYXN0IGRlc2NyaXB0b3IgbnVtYmVyIGF2YWlsYWJsZSBpbiBSb290IENvbXBsZXgKKwkgKiAgICAtIHplcm8gKDApIG1lYW5zIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGlzIHJlYWR5LAorCSAqICAgIC0gb25lICgxKSBtZWFucyB0d28gZGVzY3JpcHRvcnMgYXJlIHJlYWR5LCBldGMuCisJICogLSBtc2IgdTE2IHJlc2VydmVkOworCSAqCisJICogQG5vdGUgd3JpdGluZyB0byB0aGlzIG1lbW9yeSBsb2NhdGlvbiBzdGFydHMgdGhlIERNQSBvcGVyYXRpb24hCisJICovCisJdTMyIHczOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogRGVzY3JpcHRvciBFbnRyeSwgZGVzY3JpYmluZyBhIChub24tc2NhdHRlcmVkKSBzaW5nbGUgbWVtb3J5IGJsb2NrIHRyYW5zZmVyLgorICoKKyAqIFRoZXJlIGlzIG9uZSBkZXNjcmlwdG9yIGZvciBlYWNoIG1lbW9yeSBibG9jayBpbnZvbHZlZCBpbiB0aGUgdHJhbnNmZXIsIGEKKyAqIGJsb2NrIGJlaW5nIGEgY29udGlndW91cyBhZGRyZXNzIHJhbmdlIG9uIHRoZSBidXMuCisgKgorICogTXVsdGlwbGUgZGVzY3JpcHRvcnMgYXJlIGNoYWluZWQgYnkgbWVhbnMgb2YgdGhlIGFwZV9jaGRtYV90YWJsZSBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTYsIDctNyBhbmQgNy04IGF0IHBhZ2UgNy0xNCBhbmQgcGFnZSA3LTE1LgorICovCitzdHJ1Y3QgYXBlX2NoZG1hX2Rlc2MgeworCS8qKgorCSAqIHcwIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIG51bWJlciBvZiBEV09SRFMgdG8gdHJhbnNmZXIKKwkgKiAtIGxzYiB1MTYgbGVuZ3RoOworCSAqIGdsb2JhbCBjb250cm9sCisJICogLSBtc2IgdTE2IGNvbnRyb2w7CisJICovCisJdTMyIHcwOworCS8qIGFkZHJlc3Mgb2YgbWVtb3J5IGluIHRoZSBFbmQgUG9pbnQgKi8KKwl1MzIgZXBfYWRkcjsKKwkvKiBidXMgYWRkcmVzcyBvZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWVtb3J5IGluIHRoZSBSb290IENvbXBsZXggKi8KKwl1MzIgcmNfYWRkcl9oOworCXUzMiByY19hZGRyX2w7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBEZXNjcmlwdG9yIFRhYmxlLCBhbiBhcnJheSBvZiBkZXNjcmlwdG9ycyBkZXNjcmliaW5nIGEgY2hhaW5lZCB0cmFuc2Zlci4KKyAqCisgKiBBbiBhcnJheSBvZiBkZXNjcmlwdG9ycywgcHJlY2VkZWQgYnkgd29ya3NwYWNlIGZvciB0aGUgRW5kIFBvaW50LgorICogSXQgZXhpc3RzIGluIFJvb3QgQ29tcGxleCBtZW1vcnkuCisgKgorICogVGhlIEVuZCBQb2ludCBjYW4gdXBkYXRlIGl0cyBsYXN0IGNvbXBsZXRlZCBkZXNjcmlwdG9yIG51bWJlciBpbiB0aGUKKyAqIGVwbGFzdCBmaWVsZCBpZiByZXF1ZXN0ZWQgYnkgc2V0dGluZyB0aGUgRVBMQVNUX0VOQSBiaXQgZWl0aGVyCisgKiBnbG9iYWxseSBpbiB0aGUgaGVhZGVyJ3Mgb3IgbG9jYWxseSBpbiBhbnkgZGVzY3JpcHRvcidzIGNvbnRyb2wgZmllbGQuCisgKgorICogQG5vdGUgdGhpcyBzdHJ1Y3R1cmUgbWF5IG5vdCBleGNlZWQgNDA5NiBieXRlcy4gVGhpcyByZXN1bHRzIGluIGEKKyAqIG1heGltdW0gb2YgNDA5NiAvICg0ICogNCkgLSAxID0gMjU1IGRlc2NyaXB0b3JzIHBlciBjaGFpbmVkIHRyYW5zZmVyLgorICoKKyAqIEBzZWUgdWdfcGNpX2V4cHJlc3MgOC4wLCB0YWJsZXMgNy05LCA3LTEwIGFuZCA3LTExIGF0IHBhZ2UgNy0xNyBhbmQgcGFnZSA3LTE4LgorICovCitzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlIHsKKwkvKiB3b3Jrc3BhY2UgMHgwMC0weDBiLCByZXNlcnZlZCAqLworCXUzMiByZXNlcnZlZDFbM107CisJLyogd29ya3NwYWNlIDB4MGMtMHgwZiwgbGFzdCBkZXNjcmlwdG9yIGhhbmRsZWQgYnkgRW5kIFBvaW50ICovCisJdTMyIHczOworCS8qIHRoZSBhY3R1YWwgYXJyYXkgb2YgZGVzY3JpcHRvcnMKKyAgICAqIDB4MTAtMHgxZiwgMHgyMC0weDJmLCAuLi4gMHhmZjAtMHhmZmYgKDI1NSBlbnRyaWVzKQorICAgICovCisJc3RydWN0IGFwZV9jaGRtYV9kZXNjIGRlc2NbMjU1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIEFsdGVyYSBQQ0kgRXhwcmVzcyAoJ2FwZScpIGJvYXJkIHNwZWNpZmljIGJvb2sga2VlcGluZyBkYXRhCisgKgorICogS2VlcHMgc3RhdGUgb2YgdGhlIFBDSWUgY29yZSBhbmQgdGhlIENoYWluaW5nIERNQSBjb250cm9sbGVyCisgKiBhcHBsaWNhdGlvbi4KKyAqLworc3RydWN0IGFwZV9kZXYgeworCS8qKiB0aGUga2VybmVsIHBjaSBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgcHJvYmUoKSAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCS8qKgorCSAqIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBCQVIgbWVtb3J5IGFuZCBJTyByZWdpb25zIG9mCisJICogdGhlIEVuZCBQb2ludC4gVXNlZCBieSBtYXBfYmFycygpL3VubWFwX2JhcnMoKS4KKwkgKi8KKwl2b2lkICogX19pb21lbSBiYXJbQVBFX0JBUl9OVU1dOworCS8qKiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIGZvciBEZXNjcmlwdG9yIFRhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnkgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlICp0YWJsZV92aXJ0OworCS8qKgorCSAqIGJ1cyBhZGRyZXNzIGZvciB0aGUgRGVzY3JpcHRvciBUYWJsZSBpbiBSb290IENvbXBsZXggbWVtb3J5LCBpbgorCSAqIENQVS1uYXRpdmUgZW5kaWFuZXNzCisJICovCisJZG1hX2FkZHJfdCB0YWJsZV9idXM7CisJLyogaWYgdGhlIGRldmljZSByZWdpb25zIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQsIGFzc3VtZSBhbmQgcmVtZW1iZXIgaXQKKwkgKiBpcyBpbiB1c2UgYnkgYW5vdGhlciBkcml2ZXI7IHRoaXMgZHJpdmVyIG11c3Qgbm90IGRpc2FibGUgdGhlIGRldmljZS4KKwkgKi8KKwlpbnQgaW5fdXNlOworCS8qIHdoZXRoZXIgdGhpcyBkcml2ZXIgZW5hYmxlZCBtc2kgZm9yIHRoZSBkZXZpY2UgKi8KKwlpbnQgbXNpX2VuYWJsZWQ7CisJLyogd2hldGhlciB0aGlzIGRyaXZlciBjb3VsZCBvYnRhaW4gdGhlIHJlZ2lvbnMgKi8KKwlpbnQgZ290X3JlZ2lvbnM7CisJLyogaXJxIGxpbmUgc3VjY2VzZnVsbHkgcmVxdWVzdGVkIGJ5IHRoaXMgZHJpdmVyLCAtMSBvdGhlcndpc2UgKi8KKwlpbnQgaXJxX2xpbmU7CisJLyogYm9hcmQgcmV2aXNpb24gKi8KKwl1OCByZXZpc2lvbjsKKwkvKiBpbnRlcnJ1cHQgY291bnQsIGluY3JlbWVudGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWludCBpcnFfY291bnQ7CisjaWYgQUxUUENJRUNIRE1BX0NERVYKKwkvKiBjaGFyYWN0ZXIgZGV2aWNlICovCisJZGV2X3QgY2Rldm5vOworCXN0cnVjdCBjZGV2IGNkZXY7CisJLyogdXNlciBzcGFjZSBzY2F0dGVyIGdhdGhlciBtYXBwZXIgKi8KKwlzdHJ1Y3Qgc2dfbWFwcGluZ190ICpzZ207CisjZW5kaWYKK307CisKKy8qKgorICogVXNpbmcgdGhlIHN1YnN5c3RlbSB2ZW5kb3IgaWQgYW5kIHN1YnN5c3RlbSBpZCwgaXQgaXMgcG9zc2libGUgdG8KKyAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGNhcmRzIGJhc2VzIGFyb3VuZCB0aGUgc2FtZQorICogKHRoaXJkLXBhcnR5KSBsb2dpYyBjb3JlLgorICoKKyAqIERlZmF1bHQgQWx0ZXJhIHZlbmRvciBhbmQgZGV2aWNlIElEJ3MsIGFuZCBzb21lIChub24tcmVzZXJ2ZWQpCisgKiBJRCdzIGFyZSBub3cgdXNlZCBoZXJlIHRoYXQgYXJlIHVzZWQgYW1vbmdzdCB0aGUgdGVzdGVycy9kZXZlbG9wZXJzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKDB4MTE3MiwgMHhFMDAxKSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgyMDcxLCAweDIwNzEpLCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZHMpOworCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKy8qIHByb3RvdHlwZXMgZm9yIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgc2dfaW5pdChzdHJ1Y3QgYXBlX2RldiAqYXBlKTsKK3N0YXRpYyB2b2lkIHNnX2V4aXQoc3RydWN0IGFwZV9kZXYgKmFwZSk7CisjZW5kaWYKKworLyoqCisgKiBhbHRwY2llY2hkbWFfaXNyKCkgLSBJbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsdHBjaWVjaGRtYV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilkZXZfaWQ7CisJaWYgKCFhcGUpCisJCXJldHVybiBJUlFfTk9ORTsKKwlhcGUtPmlycV9jb3VudCsrOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc2Nhbl9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBiYXJfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBpKTsKKwkJaWYgKGJhcl9zdGFydCkgeworCQkJdW5zaWduZWQgbG9uZyBiYXJfZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsIGkpOworCQkJdW5zaWduZWQgbG9uZyBiYXJfZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJCQVIlZCAweCUwOGx4LTB4JTA4bHggZmxhZ3MgMHglMDhseFxuIiwKKwkJCSAgaSwgYmFyX3N0YXJ0LCBiYXJfZW5kLCBiYXJfZmxhZ3MpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIFVubWFwIHRoZSBCQVIgcmVnaW9ucyB0aGF0IGhhZCBiZWVuIG1hcHBlZCBlYXJsaWVyIHVzaW5nIG1hcF9iYXJzKCkKKyAqLworc3RhdGljIHZvaWQgdW5tYXBfYmFycyhzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUEVfQkFSX05VTTsgaSsrKSB7CisJICAvKiBpcyB0aGlzIEJBUiBtYXBwZWQ/ICovCisJCWlmIChhcGUtPmJhcltpXSkgeworCQkJLyogdW5tYXAgQkFSICovCisJCQlwY2lfaW91bm1hcChkZXYsIGFwZS0+YmFyW2ldKTsKKwkJCWFwZS0+YmFyW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoqCisgKiBNYXAgdGhlIGRldmljZSBtZW1vcnkgcmVnaW9ucyBpbnRvIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgYWZ0ZXIKKyAqIHZlcmlmeWluZyB0aGVpciBzaXplcyByZXNwZWN0IHRoZSBtaW5pbXVtIHNpemVzIG5lZWRlZCwgZ2l2ZW4gYnkgdGhlCisgKiBiYXJfbWluX2xlbltdIGFycmF5LgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXBfYmFycyhzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCByYzsKKwlpbnQgaTsKKwkvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBCQVJzICovCisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBiYXJfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBpKTsKKwkJdW5zaWduZWQgbG9uZyBiYXJfZW5kID0gcGNpX3Jlc291cmNlX2VuZChkZXYsIGkpOworCQl1bnNpZ25lZCBsb25nIGJhcl9sZW5ndGggPSBiYXJfZW5kIC0gYmFyX3N0YXJ0ICsgMTsKKwkJYXBlLT5iYXJbaV0gPSBOVUxMOworCQkvKiBkbyBub3QgbWFwLCBhbmQgc2tpcCwgQkFScyB3aXRoIGxlbmd0aCAwICovCisJCWlmICghYmFyX21pbl9sZW5baV0pCisJCQljb250aW51ZTsKKwkJLyogZG8gbm90IG1hcCBCQVJzIHdpdGggYWRkcmVzcyAwICovCisJCWlmICghYmFyX3N0YXJ0IHx8ICFiYXJfZW5kKSB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQkFSICMlZCBpcyBub3QgcHJlc2VudD8hXG4iLCBpKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYmFyX2xlbmd0aCA9IGJhcl9lbmQgLSBiYXJfc3RhcnQgKyAxOworCQkvKiBCQVIgbGVuZ3RoIGlzIGxlc3MgdGhhbiBkcml2ZXIgcmVxdWlyZXM/ICovCisJCWlmIChiYXJfbGVuZ3RoIDwgYmFyX21pbl9sZW5baV0pIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJCQVIgIyVkIGxlbmd0aCA9ICVsdSBieXRlcyBidXQgZHJpdmVyICIKKyAgICAgICAgICAgICJyZXF1aXJlcyBhdCBsZWFzdCAlbHUgYnl0ZXNcbiIsIGksIGJhcl9sZW5ndGgsIGJhcl9taW5fbGVuW2ldKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJLyogbWFwIHRoZSBkZXZpY2UgbWVtb3J5IG9yIElPIHJlZ2lvbiBpbnRvIGtlcm5lbCB2aXJ0dWFsCisJCSAqIGFkZHJlc3Mgc3BhY2UgKi8KKwkJYXBlLT5iYXJbaV0gPSBwY2lfaW9tYXAoZGV2LCBpLCBiYXJfbWluX2xlbltpXSk7CisJCWlmICghYXBlLT5iYXJbaV0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgbWFwIEJBUiAjJWQuXG4iLCBpKTsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGZhaWw7CisJCX0KKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkJBUlslZF0gbWFwcGVkIGF0IDB4JXAgd2l0aCBsZW5ndGggJWx1KC8lbHUpLlxuIiwgaSwKKwkJCWFwZS0+YmFyW2ldLCBiYXJfbWluX2xlbltpXSwgYmFyX2xlbmd0aCk7CisJfQorCS8qIHN1Y2Nlc2Z1bGx5IG1hcHBlZCBhbGwgcmVxdWlyZWQgQkFSIHJlZ2lvbnMgKi8KKwlyYyA9IDA7CisJZ290byBzdWNjZXNzOworZmFpbDoKKwkvKiB1bm1hcCBhbnkgQkFScyB0aGF0IHdlIGRpZCBtYXAgKi8KKwl1bm1hcF9iYXJzKGFwZSwgZGV2KTsKK3N1Y2Nlc3M6CisJcmV0dXJuIHJjOworfQorCisjaWYgMCAvKiBub3QgeWV0IGltcGxlbWVudGVkIGZ1bGx5IEZJWE1FIGFkZCBvcGNvZGUgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByY3NsYXZlX3Rlc3Qoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgKnJjc2xhdmVfbWVtID0gKHUzMiAqKWFwZS0+YmFyW0FQRV9CQVJfUkNTTEFWRV07CisJdTMyIHJlc3VsdCA9IDA7CisJLyoqIHRoaXMgbnVtYmVyIGlzIGFzc3VtZWQgdG8gYmUgZGlmZmVyZW50IGVhY2ggdGltZSB0aGlzIHRlc3QgcnVucyAqLworCXUzMiBzZWVkID0gKHUzMilqaWZmaWVzOworCXUzMiB2YWx1ZSA9IHNlZWQ7CisJaW50IGk7CisKKwkvKiB3cml0ZSBsb29wICovCisJdmFsdWUgPSBzZWVkOworCWZvciAoaSA9IDEwMjQ7IGkgPCAzMjc2OCAvIDQgOyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgMHglMDh4IHRvIDB4JXAuXG4iLAorCQkJKHUzMil2YWx1ZSwgKHZvaWQgKilyY3NsYXZlX21lbSArIGkpOworCQlpb3dyaXRlMzIodmFsdWUsIHJjc2xhdmVfbWVtICsgaSk7CisJCXZhbHVlKys7CisJfQorCS8qIHJlYWQtYmFjayBsb29wICovCisJdmFsdWUgPSBzZWVkOworCWZvciAoaSA9IDEwMjQ7IGkgPCAzMjc2OCAvIDQ7IGkrKykgeworCQlyZXN1bHQgPSBpb3JlYWQzMihyY3NsYXZlX21lbSArIGkpOworCQlpZiAocmVzdWx0ICE9IHZhbHVlKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiV3JvdGUgMHglMDh4IHRvIDB4JXAsIGJ1dCByZWFkIGJhY2sgMHglMDh4LlxuIiwKKwkJCQkodTMyKXZhbHVlLCAodm9pZCAqKXJjc2xhdmVfbWVtICsgaSwgKHUzMilyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwkJdmFsdWUrKzsKKwl9Cit9CisjZW5kaWYKKworLyogb2J0YWluIHRoZSAzMiBtb3N0IHNpZ25pZmljYW50IChoaWdoKSBiaXRzIG9mIGEgMzItYml0IG9yIDY0LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIHBjaV9kbWFfaChhZGRyKSAoKGFkZHIgPj4gMTYpID4+IDE2KQorLyogb2J0YWluIHRoZSAzMiBsZWFzdCBzaWduaWZpY2FudCAobG93KSBiaXRzIG9mIGEgMzItYml0IG9yIDY0LWJpdCBhZGRyZXNzICovCisjZGVmaW5lIHBjaV9kbWFfbChhZGRyKSAoYWRkciAmIDB4ZmZmZmZmZmZVTCkKKworLyogYXBlX2ZpbGxfY2hkbWFfZGVzYygpIC0gRmlsbCBhIEFsdGVyYSBQQ0kgRXhwcmVzcyBDaGFpbmluZyBETUEgZGVzY3JpcHRvcgorICoKKyAqIEBkZXNjIHBvaW50ZXIgdG8gZGVzY3JpcHRvciB0byBiZSBmaWxsZWQKKyAqIEBhZGRyIHJvb3QgY29tcGxleCBhZGRyZXNzCisgKiBAZXBfYWRkciBlbmQgcG9pbnQgYWRkcmVzcworICogQGxlbiBudW1iZXIgb2YgYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXBlX2NoZG1hX2Rlc2Nfc2V0KHN0cnVjdCBhcGVfY2hkbWFfZGVzYyAqZGVzYywgZG1hX2FkZHJfdCBhZGRyLCB1MzIgZXBfYWRkciwgaW50IGxlbikKK3sKKyAgQlVHX09OKGxlbiAmIDMpOworCWRlc2MtPncwID0gY3B1X3RvX2xlMzIobGVuIC8gNCk7CisJZGVzYy0+ZXBfYWRkciA9IGNwdV90b19sZTMyKGVwX2FkZHIpOworCWRlc2MtPnJjX2FkZHJfaCA9IGNwdV90b19sZTMyKHBjaV9kbWFfaChhZGRyKSk7CisJZGVzYy0+cmNfYWRkcl9sID0gY3B1X3RvX2xlMzIocGNpX2RtYV9sKGFkZHIpKTsKK30KKworLyoKKyAqIGFwZV9zZ190b19jaGRtYV90YWJsZSgpIC0gQ3JlYXRlIGEgZGV2aWNlIGRlc2NyaXB0b3IgdGFibGUgZnJvbSBhIHNjYXR0ZXJsaXN0LgorICoKKyAqIFRoZSBzY2F0dGVybGlzdCBtdXN0IGhhdmUgYmVlbiBtYXBwZWQgYnkgcGNpX21hcF9zZyhzZ20tPnNnbCkuCisgKgorICogQHNnbCBzY2F0dGVybGlzdC4KKyAqIEBuZW50cyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2NhdHRlcmxpc3QuCisgKiBAZmlyc3QgU3RhcnQgaW5kZXggaW4gdGhlIHNjYXR0ZXJsaXN0IHNnbS0+c2dsLgorICogQGVwX2FkZHIgRW5kIFBvaW50IGFkZHJlc3MgZm9yIHRoZSBzY2F0dGVyL2dhdGhlciB0cmFuc2Zlci4KKyAqIEBkZXNjIHBvaW50ZXIgdG8gZmlyc3QgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnMgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGFwZV9zZ190b19jaGRtYV90YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLCBpbnQgZmlyc3QsIHN0cnVjdCBhcGVfY2hkbWFfZGVzYyAqZGVzYywgdTMyIGVwX2FkZHIpCit7CisJaW50IGkgPSBmaXJzdCwgaiA9IDA7CisJLyogaW5zcGVjdCBmaXJzdCBlbnRyeSAqLworCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZzZ2xbaV0pOworCXVuc2lnbmVkIGludCBsZW4gPSBzZ19kbWFfbGVuKCZzZ2xbaV0pOworCS8qIGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwlkbWFfYWRkcl90IGNvbnRfYWRkciA9IGFkZHI7CisJdW5zaWduZWQgaW50IGNvbnRfbGVuID0gbGVuOworCS8qIGl0ZXJhdGUgb3ZlciByZW1haW5pbmcgZW50cmllcyAqLworCWZvciAoOyBqIDwgMjUgJiYgaSA8IG5lbnRzIC0gMTsgaSsrKSB7CisJCS8qIGJ1cyBhZGRyZXNzIG9mIG5leHQgZW50cnkgaSArIDEgKi8KKwkJZG1hX2FkZHJfdCBuZXh0ID0gc2dfZG1hX2FkZHJlc3MoJnNnbFtpICsgMV0pOworCQkvKiBsZW5ndGggb2YgdGhpcyBlbnRyeSBpICovCisJCWxlbiA9IHNnX2RtYV9sZW4oJnNnbFtpXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDRkOiBhZGRyPTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLCBpLCBhZGRyLCBsZW4pOworCQkvKiBlbnRyeSBpICsgMSBpcyBub24tY29udGlndW91cyB3aXRoIGVudHJ5IGk/ICovCisJCWlmIChuZXh0ICE9IGFkZHIgKyBsZW4pIHsKKwkJCS8qIFRPRE8gY3JlYXRlIGVudHJ5IGhlcmUgKHdlIGNvdWxkIG92ZXJ3cml0ZSBpKSAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiU0ZDogY29udF9hZGRyPTB4JTA4eCBjb250X2xlbj0weCUwOHhcbiIsIGosIGNvbnRfYWRkciwgY29udF9sZW4pOworCQkJLyogc2V0IGRlc2NyaXB0b3IgZm9yIGNvbnRpZ3VvdXMgdHJhbnNmZXIgKi8KKwkJCWFwZV9jaGRtYV9kZXNjX3NldCgmZGVzY1tqXSwgY29udF9hZGRyLCBlcF9hZGRyLCBjb250X2xlbik7CisJCQkvKiBuZXh0IGVuZCBwb2ludCBtZW1vcnkgYWRkcmVzcyAqLworCQkJZXBfYWRkciArPSBjb250X2xlbjsKKwkJCS8qIHN0YXJ0IG5ldyBjb250aWd1b3VzIGJsb2NrICovCisJCQljb250X2FkZHIgPSBuZXh0OworCQkJY29udF9sZW4gPSAwOworCQkJaisrOworCQl9CisJCS8qIGFkZCBlbnRyeSBpICsgMSB0byBjdXJyZW50IGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwkJY29udF9sZW4gKz0gbGVuOworCQkvKiBnb3RvIGVudHJ5IGkgKyAxICovCisJCWFkZHIgPSBuZXh0OworCX0KKwkvKiBUT0RPIGNyZWF0ZSBlbnRyeSBoZXJlICAod2UgY291bGQgb3ZlcndyaXRlIGkpICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiUwNGQ6IGFkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGksIGFkZHIsIGxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiU0ZDogY29udF9hZGRyPTB4JTA4eCBsZW5ndGg9MHglMDh4XG4iLCBqLCBjb250X2FkZHIsIGNvbnRfbGVuKTsKKwlqKys7CisJcmV0dXJuIGo7Cit9CisKKy8qIGNvbXBhcmUgYnVmZmVycyAqLworc3RhdGljIGlubGluZSBpbnQgY29tcGFyZSh1MzIgKnAsIHUzMiAqcSwgaW50IGxlbikKK3sKKwlpbnQgcmVzdWx0ID0gLTE7CisJaW50IGZhaWwgPSAwOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspIHsKKwkJaWYgKCpwID09ICpxKSB7CisJCQkvKiBldmVyeSBzbyBtYW55IHUzMiB3b3Jkcywgc2hvdyBlcXVhbHMgKi8KKwkJCWlmICgoaSAmIDI1NSkgPT0gMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiWyVwXSA9IDB4JTA4eCAgICBbJXBdID0gMHglMDh4XG4iLCBwLCAqcCwgcSwgKnEpOworCQl9IGVsc2UgeworCQkJZmFpbCsrOworCQkJLyogc2hvdyB0aGUgZmlyc3QgZmV3IG1pc2NvbXBhcmVzICovCisJCQlpZiAoZmFpbCA8IDEwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlslcF0gPSAweCUwOHggIT0gWyVwXSA9IDB4JTA4eCA/IVxuIiwgcCwgKnAsIHEsICpxKTsKKyAgICAgICAgICAgIC8qIGJ1dCBzdG9wIGFmdGVyIGEgd2hpbGUgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbCA9PSAxMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICItLS1tb3JlIGVycm9ycyBmb2xsb3chIG5vdCBwcmludGVkLS0tXG4iKTsKKwkJICAJfSBlbHNlIHsKKwkJCQkvKiBzdG9wIGNvbXBhcmUgYWZ0ZXIgdGhpcyBtYW55IGVycm9ycyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCQl9CisJCXArKzsKKwkJcSsrOworCX0KKwlpZiAoIWZhaWwpCisJCXJlc3VsdCA9IDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZG1hX3Rlc3QoKSAtIFBlcmZvcm0gRE1BIGxvb3AgYmFjayB0ZXN0IHRvIGVuZCBwb2ludCBhbmQgYmFjayB0byByb290IGNvbXBsZXguCisgKgorICogQWxsb2NhdGUgYSBjYWNoZS1jb2hlcmVudCBidWZmZXIgaW4gaG9zdCBtZW1vcnksIGNvbnNpc3Rpbmcgb2YgZm91ciBwYWdlcy4KKyAqCisgKiBGaWxsIHRoZSBmb3VyIG1lbW9yeSBwYWdlcyBzdWNoIHRoYXQgZWFjaCAzMi1iaXQgd29yZCBjb250YWlucyBpdHMgb3duIGFkZHJlc3MuCisgKgorICogTm93IHBlcmZvcm0gYSBsb29wIGJhY2sgdGVzdCwgaGF2ZSB0aGUgZW5kIHBvaW50IGRldmljZSBjb3B5IHRoZSBmaXJzdCBidWZmZXIKKyAqIGhhbGYgdG8gZW5kIHBvaW50IG1lbW9yeSwgdGhlbiBoYXZlIGl0IGNvcHkgYmFjayBpbnRvIHRoZSBzZWNvbmQgaGFsZi4KKyAqCisgKiAgIENyZWF0ZSBhIGRlc2NyaXB0b3IgdGFibGUgdG8gY29weSB0aGUgZmlyc3QgYnVmZmVyIGhhbGYgaW50byBFbmQgUG9pbnQKKyAqICAgbWVtb3J5LiBJbnN0cnVjdCB0aGUgRW5kIFBvaW50IHRvIGRvIGEgRE1BIHJlYWQgdXNpbmcgdGhhdCB0YWJsZS4KKyAqCisgKiAgIENyZWF0ZSBhIGRlc2NyaXB0b3IgdGFibGUgdG8gY29weSBFbmQgUG9pbnQgbWVtb3J5IHRvIHRoZSBzZWNvbmQgYnVmZmVyCisgKiAgIGhhbGYuIEluc3RydWN0IHRoZSBFbmQgUG9pbnQgdG8gZG8gYSBETUEgd3JpdGUgdXNpbmcgdGhhdCB0YWJsZS4KKyAqCisgKiBDb21wYXJlIHJlc3VsdHMsIGZhaWwgb3IgcGFzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGRtYV90ZXN0KHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogdGVzdCByZXN1bHQ7IGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQgKi8KKwlpbnQgcmVzdWx0ID0gLTE7CisJLyogdGhlIERNQSByZWFkIGhlYWRlciBzaXRzIGF0IGFkZHJlc3MgMHgwMCBvZiB0aGUgRE1BIGVuZ2luZSBCQVIgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX2hlYWRlciAqd3JpdGVfaGVhZGVyID0gKHN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICopYXBlLT5iYXJbQVBFX0JBUl9IRUFERVJdOworCS8qIHRoZSB3cml0ZSBETUEgaGVhZGVyIHNpdHMgYWZ0ZXIgdGhlIHJlYWQgaGVhZGVyIGF0IGFkZHJlc3MgMHgxMCAqLworCXN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICpyZWFkX2hlYWRlciA9IHdyaXRlX2hlYWRlciArIDE7CisJLyogdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJdTggKmJ1ZmZlcl92aXJ0ID0gMDsKKwkvKiBidXMgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgYnVmZmVyX2J1cyA9IDA7CisJaW50IGksIG4gPSAwLCBpcnFfY291bnQ7CisKKwkvKiB0ZW1wb3JhcnkgdmFsdWUgdXNlZCB0byBjb25zdHJ1Y3QgMzItYml0IGRhdGEgd29yZHMgKi8KKwl1MzIgdzsKKworCXByaW50ayhLRVJOX0RFQlVHICJiYXJfdGVzdHMoKSwgUEFHRV9TSVpFID0gMHglMHhcbiIsIChpbnQpUEFHRV9TSVpFKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGVfaGVhZGVyID0gMHglcC5cbiIsIHdyaXRlX2hlYWRlcik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJlYWRfaGVhZGVyID0gMHglcC5cbiIsIHJlYWRfaGVhZGVyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJndyaXRlX2hlYWRlci0+dzMgPSAweCVwXG4iLCAmd3JpdGVfaGVhZGVyLT53Myk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiZyZWFkX2hlYWRlci0+dzMgPSAweCVwXG4iLCAmcmVhZF9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXBlLT50YWJsZV92aXJ0ID0gMHglcC5cbiIsIGFwZS0+dGFibGVfdmlydCk7CisKKwlpZiAoIXdyaXRlX2hlYWRlciB8fCAhcmVhZF9oZWFkZXIgfHwgIWFwZS0+dGFibGVfdmlydCkKKyAgICAgICAgZ290byBmYWlsOworCisJLyogYWxsb2NhdGUgYW5kIG1hcCBjb2hlcmVudGx5LWNhY2hlZCBtZW1vcnkgZm9yIGEgRE1BLWFibGUgYnVmZmVyICovCisJLyogQHNlZSAyLjYuMjYuMi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dCBsaW5lIDMxOCAqLworCWJ1ZmZlcl92aXJ0ID0gKHU4ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCBQQUdFX1NJWkUgKiA0LCAmYnVmZmVyX2J1cyk7CisJaWYgKCFidWZmZXJfdmlydCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGFsbG9jYXRlIGNvaGVyZW50IERNQSBidWZmZXIuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkIGNhY2hlLWNvaGVyZW50IERNQSBidWZmZXIgKHZpcnR1YWwgYWRkcmVzcyA9IDB4JTAxNmxseCwgYnVzIGFkZHJlc3MgPSAweCUwMTZsbHgpLlxuIiwKKwkJKHU2NClidWZmZXJfdmlydCwgKHU2NClidWZmZXJfYnVzKTsKKworCS8qIGZpbGwgZmlyc3QgaGFsZiBvZiBidWZmZXIgd2l0aCBpdHMgdmlydHVhbCBhZGRyZXNzIGFzIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNCAqIFBBR0VfU0laRTsgaSArPSA0KQorI2lmIDAKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IGkgLyBQQUdFX1NJWkUgKyAxOworI2Vsc2UKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IChidWZmZXJfdmlydCArIGkpOworI2VuZGlmCisjaWYgMAorICBjb21wYXJlKCh1MzIgKilidWZmZXJfdmlydCwgKHUzMiAqKShidWZmZXJfdmlydCArIDIgKiBQQUdFX1NJWkUpLCA4MTkyKTsKKyNlbmRpZgorCisjaWYgMAorCS8qIGZpbGwgc2Vjb25kIGhhbGYgb2YgYnVmZmVyIHdpdGggemVyb2VzICovCisJZm9yIChpID0gMiAqIFBBR0VfU0laRTsgaSA8IDQgKiBQQUdFX1NJWkU7IGkgKz0gNCkKKwkJKih1MzIgKikoYnVmZmVyX3ZpcnQgKyBpKSA9IDA7CisjZW5kaWYKKworCS8qIGludmFsaWRhdGUgRVBMQVNULCBvdXRzaWRlIDAtMjU1LCAweEZBREUgaXMgZnJvbSB0aGUgdGVzdGJlbmNoICovCisJYXBlLT50YWJsZV92aXJ0LT53MyA9IGNwdV90b19sZTMyKDB4MDAwMEZBREUpOworCisJLyogZmlsbCBpbiBmaXJzdCBkZXNjcmlwdG9yICovCisJbiA9IDA7CisJLyogcmVhZCA4MTkyIGJ5dGVzIGZyb20gUkMgYnVmZmVyIHRvIEVQIGFkZHJlc3MgNDA5NiAqLworCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLCBidWZmZXJfYnVzLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKyNpZiAxCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW2ldLCBidWZmZXJfYnVzLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKwl9CisJLyogaW5kZXggb2YgbGFzdCBkZXNjcmlwdG9yICovCisJbiA9IGkgLSAxOworI2VuZGlmCisjaWYgMAorCS8qIGZpbGwgaW4gbmV4dCBkZXNjcmlwdG9yICovCisJbisrOworCS8qIHJlYWQgMTAyNCBieXRlcyBmcm9tIFJDIGJ1ZmZlciB0byBFUCBhZGRyZXNzIDQwOTYgKyAxMDI0ICovCisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMgKyAxMDI0LCA0MDk2ICsgMTAyNCwgMTAyNCk7CisjZW5kaWYKKworI2lmIDEKKwkvKiBlbmFibGUgTVNJIGFmdGVyIHRoZSBsYXN0IGRlc2NyaXB0b3IgaXMgY29tcGxldGVkICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCWFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXS53MCB8PSBjcHVfdG9fbGUzMigxVUwgPDwgMTYpLypsb2NhbCBNU0kqLzsKKyNlbmRpZgorI2lmIDAKKwkvKiBkdW1wIGRlc2NyaXB0b3IgdGFibGUgZm9yIGRlYnVnZ2luZyAqLworCXByaW50ayhLRVJOX0RFQlVHICJEZXNjcmlwdG9yIFRhYmxlIChSZWFkLCBpbiBSb290IENvbXBsZXggTWVtb3J5LCAjID0gJWQpXG4iLCBuICsgMSk7CisJZm9yIChpID0gMDsgaSA8IDQgKyAobiArIDEpICogNDsgaSArPSA0KSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcGUtPnRhYmxlX3ZpcnQ7CisJCXAgKz0gaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoTEVOPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgNCAqIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoRVBBPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0g9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDTD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJfQorI2VuZGlmCisJLyogc2V0IGF2YWlsYWJsZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGFibGUgKi8KKwl3ID0gKHUzMikobiArIDEpOworCXcgfD0gKDFVTCA8PCAxOCkvKmdsb2JhbCBFUExBU1RfRU4qLzsKKyNpZiAwCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCXcgfD0gKDFVTCA8PCAxNykvKmdsb2JhbCBNU0kqLzsKKyNlbmRpZgorCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCB3LCAodm9pZCAqKSZyZWFkX2hlYWRlci0+dzApOworCWlvd3JpdGUzMih3LCAmcmVhZF9oZWFkZXItPncwKTsKKworCS8qIHdyaXRlIHRhYmxlIGFkZHJlc3MgKGhpZ2hlciAzMi1iaXRzKSAqLworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCAodTMyKSgoYXBlLT50YWJsZV9idXMgPj4gMTYpID4+IDE2KSwgKHZvaWQgKikmcmVhZF9oZWFkZXItPmJkdF9hZGRyX2gpOworCWlvd3JpdGUzMihwY2lfZG1hX2goYXBlLT50YWJsZV9idXMpLCAmcmVhZF9oZWFkZXItPmJkdF9hZGRyX2gpOworCisJLyogd3JpdGUgdGFibGUgYWRkcmVzcyAobG93ZXIgMzItYml0cykgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGluZyAweCUwOHggdG8gMHglcFxuIiwgKHUzMikoYXBlLT50YWJsZV9idXMgJiAweGZmZmZmZmZmVUwpLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+YmR0X2FkZHJfbCk7CisJaW93cml0ZTMyKHBjaV9kbWFfbChhcGUtPnRhYmxlX2J1cyksICZyZWFkX2hlYWRlci0+YmR0X2FkZHJfbCk7CisKKwkvKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCXByaW50ayhLRVJOX0RFQlVHICJGbHVzaCBwb3N0ZWQgd3JpdGVzXG4iKTsKKwkvKiogRklYTUUgQWRkIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyBidXQgbmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisKKwkvKiByZW1lbWJlciBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCWlycV9jb3VudCA9IGFwZS0+aXJxX2NvdW50OworCS8qIHdyaXRlIG51bWJlciBvZiBkZXNjcmlwdG9ycyAtIHRoaXMgc3RhcnRzIHRoZSBETUEgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiXG5TdGFydCBETUEgcmVhZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsICh1MzIpbiwgKHZvaWQgKikmcmVhZF9oZWFkZXItPnczKTsKKwlpb3dyaXRlMzIobiwgJnJlYWRfaGVhZGVyLT53Myk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVQTEFTVCA9ICVsdVxuIiwgbGUzMl90b19jcHUoKih1MzIgKikmYXBlLT50YWJsZV92aXJ0LT53MykgJiAweGZmZmZVTCk7CisKKwkvKiogbWVtb3J5IHdyaXRlIGJhcnJpZXIgKi8KKwl3bWIoKTsKKwkvKiBkdW1teSByZWFkIHRvIGZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KKwkvKiBGSVhNRSBOZWVkIGEgcmVhZGFibGUgbG9jYXRpb24hICovCisjaWYgMAorCSh2b2lkKWlvcmVhZDMyKCk7CisjZW5kaWYKKwlwcmludGsoS0VSTl9ERUJVRyAiUE9MTCBGT1IgUkVBRDpcbiIpOworCS8qIHBvbGwgZm9yIGNoYWluIGNvbXBsZXRpb24sIDEwMDAgdGltZXMgMSBtaWxsaXNlY29uZCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQl2b2xhdGlsZSB1MzIgKnAgPSAmYXBlLT50YWJsZV92aXJ0LT53MzsKKwkJdTMyIGVwbGFzdCA9IGxlMzJfdG9fY3B1KCpwKSAmIDB4ZmZmZlVMOworCQlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJXUsIG4gPSAlZFxuIiwgZXBsYXN0LCBuKTsKKwkJaWYgKGVwbGFzdCA9PSBuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRE9ORVxuIik7CisgICAgICAgICAgICAvKiBwcmludCBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiNJUlFzIGR1cmluZyB0cmFuc2ZlcjogJWRcbiIsIGFwZS0+aXJxX2NvdW50IC0gaXJxX2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKworCS8qIGludmFsaWRhdGUgRVBMQVNULCBvdXRzaWRlIDAtMjU1LCAweEZBREUgaXMgZnJvbSB0aGUgdGVzdGJlbmNoICovCisJYXBlLT50YWJsZV92aXJ0LT53MyA9IGNwdV90b19sZTMyKDB4MDAwMEZBREUpOworCisJLyogc2V0dXAgZmlyc3QgZGVzY3JpcHRvciAqLworCW4gPSAwOworCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLCBidWZmZXJfYnVzICsgODE5MiwgNDA5NiwgMiAqIFBBR0VfU0laRSk7CisjaWYgMQorCWZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykgeworCQlhcGVfY2hkbWFfZGVzY19zZXQoJmFwZS0+dGFibGVfdmlydC0+ZGVzY1tpXSwgYnVmZmVyX2J1cyArIDgxOTIsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworCX0KKwkvKiBpbmRleCBvZiBsYXN0IGRlc2NyaXB0b3IgKi8KKwluID0gaSAtIDE7CisjZW5kaWYKKyNpZiAxIC8qIHRlc3QgdmFyaWFibGUsIG1ha2UgYSBtb2R1bGUgb3B0aW9uIGxhdGVyICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCWFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXS53MCB8PSBjcHVfdG9fbGUzMigxVUwgPDwgMTYpLypsb2NhbCBNU0kqLzsKKyNlbmRpZgorI2lmIDAKKwkvKiBkdW1wIGRlc2NyaXB0b3IgdGFibGUgZm9yIGRlYnVnZ2luZyAqLworCXByaW50ayhLRVJOX0RFQlVHICJEZXNjcmlwdG9yIFRhYmxlIChXcml0ZSwgaW4gUm9vdCBDb21wbGV4IE1lbW9yeSwgIyA9ICVkKVxuIiwgbiArIDEpOworCWZvciAoaSA9IDA7IGkgPCA0ICsgKG4gKyAxKSAqIDQ7IGkgKz0gNCkgeworCQl1MzIgKnAgPSAodTMyICopYXBlLT50YWJsZV92aXJ0OworCQlwICs9IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKExFTj0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIDQgKiBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKEVQQT0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoUkNIPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0w9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCX0KKyNlbmRpZgorCisJLyogc2V0IG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JpcHRvcnMgaW4gdGhlIHRhYmxlICovCisJdyA9ICh1MzIpKG4gKyAxKTsKKwkvKiBlbmFibGUgdXBkYXRlcyBvZiBlcGxhc3QgZm9yIGVhY2ggZGVzY3JpcHRvciBjb21wbGV0aW9uICovCisJdyB8PSAodTMyKSgxVUwgPDwgMTgpLypnbG9iYWwgRVBMQVNUX0VOKi87CisjaWYgMCAvLyB0ZXN0IHZhcmlhYmxlLCBtYWtlIGEgbW9kdWxlIG9wdGlvbiBsYXRlcgorCS8qIGVuYWJsZSBNU0kgZm9yIGVhY2ggZGVzY3JpcHRvciBjb21wbGV0aW9uICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpCisJCXcgfD0gKDFVTCA8PCAxNykvKmdsb2JhbCBNU0kqLzsKKyNlbmRpZgorCWlvd3JpdGUzMih3LCAmd3JpdGVfaGVhZGVyLT53MCk7CisJaW93cml0ZTMyKHBjaV9kbWFfaChhcGUtPnRhYmxlX2J1cyksICZ3cml0ZV9oZWFkZXItPmJkdF9hZGRyX2gpOworCWlvd3JpdGUzMihwY2lfZG1hX2woYXBlLT50YWJsZV9idXMpLCAmd3JpdGVfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciBhbmQgZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCWlycV9jb3VudCA9IGFwZS0+aXJxX2NvdW50OworCisJcHJpbnRrKEtFUk5fREVCVUcgIlxuU3RhcnQgRE1BIHdyaXRlXG4iKTsKKwlpb3dyaXRlMzIobiwgJndyaXRlX2hlYWRlci0+dzMpOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJLyoqIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8vKHZvaWQpaW9yZWFkMzIoKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJQT0xMIEZPUiBXUklURTpcbiIpOworCS8qIHBvbGwgZm9yIGNvbXBsZXRpb24sIDEwMDAgdGltZXMgMSBtaWxsaXNlY29uZCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQl2b2xhdGlsZSB1MzIgKnAgPSAmYXBlLT50YWJsZV92aXJ0LT53MzsKKwkJdTMyIGVwbGFzdCA9IGxlMzJfdG9fY3B1KCpwKSAmIDB4ZmZmZlVMOworCQlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJXUsIG4gPSAlZFxuIiwgZXBsYXN0LCBuKTsKKwkJaWYgKGVwbGFzdCA9PSBuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRE9ORVxuIik7CisJCQkvKiBwcmludCBJUlEgY291bnQgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiNJUlFzIGR1cmluZyB0cmFuc2ZlcjogJWRcbiIsIGFwZS0+aXJxX2NvdW50IC0gaXJxX2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KKwkvKiBzb2Z0LXJlc2V0IERNQSB3cml0ZSBlbmdpbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDAwZmZmZlVMLCAmd3JpdGVfaGVhZGVyLT53MCk7CisJLyogc29mdC1yZXNldCBETUEgcmVhZCBlbmdpbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDAwZmZmZlVMLCAmcmVhZF9oZWFkZXItPncwKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCS8qIGNvbXBhcmUgZmlyc3QgaGFsZiBvZiBidWZmZXIgd2l0aCBzZWNvbmQgaGFsZiwgc2hvdWxkIGJlIGlkZW50aWNhbCAqLworCXJlc3VsdCA9IGNvbXBhcmUoKHUzMiAqKWJ1ZmZlcl92aXJ0LCAodTMyICopKGJ1ZmZlcl92aXJ0ICsgMiAqIFBBR0VfU0laRSksIDgxOTIpOworCXByaW50ayhLRVJOX0RFQlVHICJETUEgbG9vcCBiYWNrIHRlc3QgJXMuXG4iLCByZXN1bHQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCA0ICogUEFHRV9TSVpFLCBidWZmZXJfdmlydCwgYnVmZmVyX2J1cyk7CitmYWlsOgorCXByaW50ayhLRVJOX0RFQlVHICJiYXJfdGVzdHMoKSBlbmQsIHJlc3VsdCAlZFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgUENJIHN1YiBzeXN0ZW0gdGhpbmtzIHdlIGNhbiBjb250cm9sIHRoZSBnaXZlbiBkZXZpY2UuCisgKiBJbnNwZWN0IGlmIHdlIGNhbiBzdXBwb3J0IHRoZSBkZXZpY2UgYW5kIGlmIHNvIHRha2UgY29udHJvbCBvZiBpdC4KKyAqCisgKiBSZXR1cm4gMCB3aGVuIHdlIGhhdmUgdGFrZW4gY29udHJvbCBvZiB0aGUgZ2l2ZW4gZGV2aWNlLgorICoKKyAqIC0gYWxsb2NhdGUgYm9hcmQgc3BlY2lmaWMgYm9va2tlZXBpbmcKKyAqIC0gYWxsb2NhdGUgY29oZXJlbnRseS1tYXBwZWQgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvciB0YWJsZQorICogLSBlbmFibGUgdGhlIGJvYXJkCisgKiAtIHZlcmlmeSBib2FyZCByZXZpc2lvbgorICogLSByZXF1ZXN0IHJlZ2lvbnMKKyAqIC0gcXVlcnkgRE1BIG1hc2sKKyAqIC0gb2J0YWluIGFuZCByZXF1ZXN0IGlycQorICogLSBtYXAgcmVnaW9ucyBpbnRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHByb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSBOVUxMOworCXU4IGlycV9waW4sIGlycV9saW5lOworCXByaW50ayhLRVJOX0RFQlVHICJwcm9iZShkZXYgPSAweCVwLCBwY2lpZCA9IDB4JXApXG4iLCBkZXYsIGlkKTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGVyLWJvYXJkIGJvb2sga2VlcGluZyAqLworCWFwZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcGVfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBremFsbG9jKClhdGUgbWVtb3J5LlxuIik7CisJCWdvdG8gZXJyX2FwZTsKKwl9CisJYXBlLT5wY2lfZGV2ID0gZGV2OworCWRldi0+ZGV2LmRyaXZlcl9kYXRhID0gKHZvaWQgKilhcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKCkgYXBlID0gMHglcFxuIiwgYXBlKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzaXplb2Yoc3RydWN0IGFwZV9jaGRtYV90YWJsZSkgPSAlZC5cbiIsCisJCShpbnQpc2l6ZW9mKHN0cnVjdCBhcGVfY2hkbWFfdGFibGUpKTsKKwkvKiB0aGUgcmVmZXJlbmNlIGRlc2lnbiBoYXMgYSBzaXplIHJlc3RyaWN0aW9uIG9uIHRoZSB0YWJsZSBzaXplICovCisJQlVHX09OKHNpemVvZihzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlKSA+IEFQRV9DSERNQV9UQUJMRV9TSVpFKTsKKworCS8qIGFsbG9jYXRlIGFuZCBtYXAgY29oZXJlbnRseS1jYWNoZWQgbWVtb3J5IGZvciBhIGRlc2NyaXB0b3IgdGFibGUgKi8KKwkvKiBAc2VlIExERDMgcGFnZSA0NDYgKi8KKwlhcGUtPnRhYmxlX3ZpcnQgPSAoc3RydWN0IGFwZV9jaGRtYV90YWJsZSAqKXBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwKKwkJQVBFX0NIRE1BX1RBQkxFX1NJWkUsICZhcGUtPnRhYmxlX2J1cyk7CisJLyogY291bGQgbm90IGFsbG9jYXRlIHRhYmxlPyAqLworCWlmICghYXBlLT50YWJsZV92aXJ0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZG1hX2FsbG9jKClhdGVfY29oZXJlbnQgbWVtb3J5LlxuIik7CisJCWdvdG8gZXJyX3RhYmxlOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJ0YWJsZV92aXJ0ID0gMHglMTZsbHgsIHRhYmxlX2J1cyA9IDB4JTE2bGx4LlxuIiwKKwkJKHU2NClhcGUtPnRhYmxlX3ZpcnQsICh1NjQpYXBlLT50YWJsZV9idXMpOworCisJLyogZW5hYmxlIGRldmljZSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qIGVuYWJsZSBidXMgbWFzdGVyIGNhcGFiaWxpdHkgb24gZGV2aWNlICovCisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwkvKiBlbmFibGUgbWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHRzICovCisJcmMgPSBwY2lfZW5hYmxlX21zaShkZXYpOworCS8qIGNvdWxkIG5vdCB1c2UgTVNJPyAqLworCWlmIChyYykgeworCQkvKiByZXNvcnQgdG8gbGVnYWN5IGludGVycnVwdHMgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBlbmFibGUgTVNJIGludGVycnVwdGluZy5cbiIpOworCQlhcGUtPm1zaV9lbmFibGVkID0gMDsKKwkvKiBNU0kgZW5hYmxlZCwgcmVtZW1iZXIgZm9yIGNsZWFudXAgKi8KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRW5hYmxlZCBNU0kgaW50ZXJydXB0aW5nLlxuIik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAxOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1JFVklTSU9OX0lELCAmYXBlLT5yZXZpc2lvbik7CisjaWYgMCAvKiBleGFtcGxlICovCisJLyogKGZvciBleGFtcGxlKSB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHJldmlzaW9uIDB4NDIgKi8KKyAgICBpZiAoYXBlLT5yZXZpc2lvbiA9PSAweDQyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJSZXZpc2lvbiAweDQyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZXY7CisJfQorI2VuZGlmCisJLyoqIFhYWCBjaGVjayBmb3IgbmF0aXZlIG9yIGxlZ2FjeSBQQ0llIGVuZHBvaW50PyAqLworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgRFJWX05BTUUpOworCS8qIGNvdWxkIG5vdCByZXF1ZXN0IGFsbCByZWdpb25zPyAqLworCWlmIChyYykgeworCQkvKiBhc3N1bWUgZGV2aWNlIGlzIGluIHVzZSAoYW5kIGRvIG5vdCBkaXNhYmxlIGl0IGxhdGVyISkgKi8KKwkJYXBlLT5pbl91c2UgPSAxOworCQlnb3RvIGVycl9yZWdpb25zOworCX0KKwlhcGUtPmdvdF9yZWdpb25zID0gMTsKKworI2lmIDEgLy8gQHRvZG8gRm9yIG5vdywgZGlzYWJsZSA2NC1iaXQsIGJlY2F1c2UgSSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIChEQUMhKQorCS8qIHF1ZXJ5IGZvciBETUEgdHJhbnNmZXIgKi8KKwkvKiBAc2VlIERvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0ICovCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKGRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJLyogdXNlIDY0LWJpdCBETUEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGEgNjQtYml0IERNQSBtYXNrLlxuIik7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBzZXQgNjQtYml0IERNQSBtYXNrLlxuIik7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJLyogdXNlIDMyLWJpdCBETUEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGEgMzItYml0IERNQSBtYXNrLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk5vIHN1aXRhYmxlIERNQSBwb3NzaWJsZS5cbiIpOworCQkvKiogQHRvZG8gQ2hvb3NlIHByb3BlciBlcnJvciByZXR1cm4gY29kZSAqLworCQlyYyA9IC0xOworCQlnb3RvIGVycl9tYXNrOworCX0KKworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJmlycV9waW4pOworCS8qIGNvdWxkIG5vdCByZWFkPyAqLworCWlmIChyYykKKwkJZ290byBlcnJfaXJxOworCXByaW50ayhLRVJOX0RFQlVHICJJUlEgcGluICMlZCAoMD1ub25lLCAxPUlOVEEjLi4uND1JTlREIykuXG4iLCBpcnFfcGluKTsKKworCS8qIEBzZWUgTEREMywgcGFnZSAzMTggKi8KKwlyYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaXJxX2xpbmUpOworCS8qIGNvdWxkIG5vdCByZWFkPyAqLworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHF1ZXJ5IFBDSV9JTlRFUlJVUFRfTElORSwgZXJyb3IgJWRcbiIsIHJjKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiSVJRIGxpbmUgIyVkLlxuIiwgaXJxX2xpbmUpOworI2lmIDEKKwlpcnFfbGluZSA9IGRldi0+aXJxOworCS8qIEBzZWUgTEREMywgcGFnZSAyNTkgKi8KKwlyYyA9IHJlcXVlc3RfaXJxKGlycV9saW5lLCBhbHRwY2llY2hkbWFfaXNyLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsICh2b2lkICopYXBlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCByZXF1ZXN0IElSUSAjJWQsIGVycm9yICVkXG4iLCBpcnFfbGluZSwgcmMpOworCQlhcGUtPmlycV9saW5lID0gLTE7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJLyogcmVtZW1iZXIgd2hpY2ggaXJxIHdlIGFsbG9jYXRlZCAqLworCWFwZS0+aXJxX2xpbmUgPSAoaW50KWlycV9saW5lOworCXByaW50ayhLRVJOX0RFQlVHICJTdWNjZXNmdWxseSByZXF1ZXN0ZWQgSVJRICMlZCB3aXRoIGRldl9pZCAweCVwXG4iLCBpcnFfbGluZSwgYXBlKTsKKyNlbmRpZgorCS8qIHNob3cgQkFScyAqLworCXNjYW5fYmFycyhhcGUsIGRldik7CisJLyogbWFwIEJBUnMgKi8KKwlyYyA9IG1hcF9iYXJzKGFwZSwgZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX21hcDsKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCS8qIGluaXRpYWxpemUgY2hhcmFjdGVyIGRldmljZSAqLworCXJjID0gc2dfaW5pdChhcGUpOworCWlmIChyYykKKwkJZ290byBlcnJfY2RldjsKKyNlbmRpZgorCS8qIHBlcmZvcm0gRE1BIGVuZ2luZXMgbG9vcCBiYWNrIHRlc3QgKi8KKwlyYyA9IGRtYV90ZXN0KGFwZSwgZGV2KTsKKwkodm9pZClyYzsKKwkvKiBzdWNjZXNmdWxseSB0b29rIHRoZSBkZXZpY2UgKi8KKwlyYyA9IDA7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKCkgc3VjY2Vzc2Z1bC5cbiIpOworCWdvdG8gZW5kOworZXJyX2NkZXY6CisJLyogdW5tYXAgdGhlIEJBUnMgKi8KKwl1bm1hcF9iYXJzKGFwZSwgZGV2KTsKK2Vycl9tYXA6CisJLyogZnJlZSBhbGxvY2F0ZWQgaXJxICovCisJaWYgKGFwZS0+aXJxX2xpbmUgPj0gMCkKKwkJZnJlZV9pcnEoYXBlLT5pcnFfbGluZSwgKHZvaWQgKilhcGUpOworZXJyX2lycToKKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CisJLyogZGlzYWJsZSB0aGUgZGV2aWNlIGlmZiBpdCBpcyBub3QgaW4gdXNlICovCisJaWYgKCFhcGUtPmluX3VzZSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaWYgKGFwZS0+Z290X3JlZ2lvbnMpCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKK2Vycl9tYXNrOgorZXJyX3JlZ2lvbnM6CitlcnJfcmV2OgorLyogY2xlYW4gdXAgZXZlcnl0aGluZyBiZWZvcmUgZGV2aWNlIGVuYWJsZSgpICovCitlcnJfZW5hYmxlOgorCWlmIChhcGUtPnRhYmxlX3ZpcnQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBBUEVfQ0hETUFfVEFCTEVfU0laRSwgYXBlLT50YWJsZV92aXJ0LCBhcGUtPnRhYmxlX2J1cyk7CisvKiBjbGVhbiB1cCBldmVyeXRoaW5nIGJlZm9yZSBhbGxvY2F0aW5nIGRlc2NyaXB0b3IgdGFibGUgKi8KK2Vycl90YWJsZToKKwlpZiAoYXBlKQorCQlrZnJlZShhcGUpOworZXJyX2FwZToKK2VuZDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCByZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgYXBlX2RldiAqYXBlOworCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoMHglcClcbiIsIGRldik7CisJaWYgKChkZXYgPT0gMCkgfHwgKGRldi0+ZGV2LmRyaXZlcl9kYXRhID09IDApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoZGV2ID0gMHglcCkgZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAweCVwXG4iLCBkZXYsIGRldi0+ZGV2LmRyaXZlcl9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwlhcGUgPSAoc3RydWN0IGFwZV9kZXYgKilkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyAicmVtb3ZlKGRldiA9IDB4JXApIHdoZXJlIGRldi0+ZGV2LmRyaXZlcl9kYXRhID0gMHglcFxuIiwgZGV2LCBhcGUpOworCWlmIChhcGUtPnBjaV9kZXYgIT0gZGV2KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYtPmRldi5kcml2ZXJfZGF0YS0+cGNpX2RldiAoMHglMDhseCkgIT0gZGV2ICgweCUwOGx4KVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpYXBlLT5wY2lfZGV2LCAodW5zaWduZWQgbG9uZylkZXYpOworCX0KKwkvKiByZW1vdmUgY2hhcmFjdGVyIGRldmljZSAqLworI2lmIEFMVFBDSUVDSERNQV9DREVWCisJc2dfZXhpdChhcGUpOworI2VuZGlmCisKKwlpZiAoYXBlLT50YWJsZV92aXJ0KQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldiwgQVBFX0NIRE1BX1RBQkxFX1NJWkUsIGFwZS0+dGFibGVfdmlydCwgYXBlLT50YWJsZV9idXMpOworCisJLyogZnJlZSBJUlEKKwkgKiBAc2VlIExERDMgcGFnZSAyNzkKKwkgKi8KKwlpZiAoYXBlLT5pcnFfbGluZSA+PSAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJGcmVlaW5nIElSUSAjJWQgZm9yIGRldl9pZCAweCUwOGx4LlxuIiwKKwkJYXBlLT5pcnFfbGluZSwgKHVuc2lnbmVkIGxvbmcpYXBlKTsKKwkJZnJlZV9pcnEoYXBlLT5pcnFfbGluZSwgKHZvaWQgKilhcGUpOworCX0KKwkvKiBNU0kgd2FzIGVuYWJsZWQ/ICovCisJaWYgKGFwZS0+bXNpX2VuYWJsZWQpIHsKKwkJLyogRGlzYWJsZSBNU0kgQHNlZSBEb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQgKi8KKwkJcGNpX2Rpc2FibGVfbXNpKGRldik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAwOworCX0KKwkvKiB1bm1hcCB0aGUgQkFScyAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworCWlmICghYXBlLT5pbl91c2UpCisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCWlmIChhcGUtPmdvdF9yZWdpb25zKQorCQkvKiB0byBiZSBjYWxsZWQgYWZ0ZXIgZGV2aWNlIGRpc2FibGUgKi8KKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworfQorCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ29lcyBmcm9tIHVudXNlZCB0byB1c2VkLgorICovCitzdGF0aWMgaW50IHNnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFwZV9kZXYgKmFwZTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX29wZW4oKVxuIik7CisJLyogcG9pbnRlciB0byBjb250YWluaW5nIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGlub2RlICovCisJYXBlID0gY29udGFpbmVyX29mKGlub2RlLT5pX2NkZXYsIHN0cnVjdCBhcGVfZGV2LCBjZGV2KTsKKwkvKiBjcmVhdGUgYSByZWZlcmVuY2UgdG8gb3VyIGRldmljZSBzdGF0ZSBpbiB0aGUgb3BlbmVkIGZpbGUgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhcGU7CisJLyogY3JlYXRlIHZpcnR1YWwgbWVtb3J5IG1hcHBlciAqLworCWFwZS0+c2dtID0gc2dfY3JlYXRlX21hcHBlcihNQVhfQ0hETUFfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGdvZXMgZnJvbSB1c2VkIHRvIHVudXNlZC4KKyAqLworc3RhdGljIGludCBzZ19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBmZXRjaCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdG9yZWQgZWFybGllciBkdXJpbmcgb3BlbiAqLworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIl9jbG9zZSgpXG4iKTsKKwkvKiBkZXN0cm95IHZpcnR1YWwgbWVtb3J5IG1hcHBlciAqLworCXNnX2Rlc3Ryb3lfbWFwcGVyKGFwZS0+c2dtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwkvKiBmZXRjaCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSBzdG9yZWQgZWFybGllciBkdXJpbmcgb3BlbiAqLworCXN0cnVjdCBhcGVfZGV2ICphcGUgPSAoc3RydWN0IGFwZV9kZXYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJKHZvaWQpYXBlOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfcmVhZChidWY9MHglcCwgY291bnQ9JWxsZCwgcG9zPSVsbHUpXG4iLCBidWYsIChzNjQpY291bnQsICh1NjQpKnBvcyk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBzZ193cml0ZSgpIC0gV3JpdGUgdG8gdGhlIGRldmljZQorICoKKyAqIEBidWYgdXNlcnNwYWNlIGJ1ZmZlcgorICogQGNvdW50IG51bWJlciBvZiBieXRlcyBpbiB0aGUgdXNlcnNwYWNlIGJ1ZmZlcgorICoKKyAqIEl0ZXJhdGUgb3ZlciB0aGUgdXNlcnNwYWNlIGJ1ZmZlciwgdGFraW5nIGF0IG1vc3QgMjU1ICogUEFHRV9TSVpFIGJ5dGVzIGZvcgorICogZWFjaCBETUEgdHJhbnNmZXIuCisgKiAgIEZvciBlYWNoIHRyYW5zZmVyLCBnZXQgdGhlIHVzZXIgcGFnZXMsIGJ1aWxkIGEgc2dsaXN0LCBtYXAsIGJ1aWxkIGEKKyAqICAgZGVzY3JpcHRvciB0YWJsZS4gc3VibWl0IHRoZSB0cmFuc2Zlci4gd2FpdCBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKiAgIHRvIHdha2UgdXMgb24gY29tcGxldGlvbi4KKyAqLworc3RhdGljIHNzaXplX3Qgc2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJaW50IGh3bmVudHMsIHRlbnRzOworCXNpemVfdCB0cmFuc2Zlcl9sZW4sIHJlbWFpbmluZyA9IGNvdW50LCBkb25lID0gMDsKKwl1NjQgdHJhbnNmZXJfYWRkciA9ICh1NjQpYnVmOworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX3dyaXRlKGJ1Zj0weCVwLCBjb3VudD0lbGxkLCBwb3M9JWxsdSlcbiIsCisJCWJ1ZiwgKHM2NCljb3VudCwgKHU2NCkqcG9zKTsKKwkvKiBUT0RPIHRyYW5zZmVyIGJvdW5kYXJpZXMgYXQgUEFHRV9TSVpFIGdyYW51bGFyaXR5ICovCisJd2hpbGUgKHJlbWFpbmluZyA+IDApCisJeworCQkvKiBsaW1pdCBETUEgdHJhbnNmZXIgc2l6ZSAqLworCQl0cmFuc2Zlcl9sZW4gPSAocmVtYWluaW5nIDwgQVBFX0NIRE1BX01BWF9UUkFOU0ZFUl9MRU4pPyByZW1haW5pbmc6CisJCQlBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTjsKKwkJLyogZ2V0IGFsbCB1c2VyIHNwYWNlIGJ1ZmZlciBwYWdlcyBhbmQgY3JlYXRlIGEgc2NhdHRlcmdhdGhlciBsaXN0ICovCisJCXNnbV9tYXBfdXNlcl9wYWdlcyhhcGUtPnNnbSwgdHJhbnNmZXJfYWRkciwgdHJhbnNmZXJfbGVuLCAwLypyZWFkIGZyb20gdXNlcnNwYWNlKi8pOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAibWFwcGVkX3BhZ2VzPSVkXG4iLCBhcGUtPnNnbS0+bWFwcGVkX3BhZ2VzKTsKKwkJLyogbWFwIGFsbCBlbnRyaWVzIGluIHRoZSBzY2F0dGVyZ2F0aGVyIGxpc3QgKi8KKwkJaHduZW50cyA9IHBjaV9tYXBfc2coYXBlLT5wY2lfZGV2LCBhcGUtPnNnbS0+c2dsLCBhcGUtPnNnbS0+bWFwcGVkX3BhZ2VzLCBETUFfVE9fREVWSUNFKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgImh3bmVudHM9JWRcbiIsIGh3bmVudHMpOworCQkvKiBidWlsZCBkZXZpY2UgZGVzY3JpcHRvciB0YWJsZXMgYW5kIHN1Ym1pdCB0aGVtIHRvIHRoZSBETUEgZW5naW5lICovCisJCXRlbnRzID0gYXBlX3NnX3RvX2NoZG1hX3RhYmxlKGFwZS0+c2dtLT5zZ2wsIGh3bmVudHMsIDAsICZhcGUtPnRhYmxlX3ZpcnQtPmRlc2NbMF0sIDQwOTYpOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAidGVudHM9JWRcbiIsIGh3bmVudHMpOworI2lmIDAKKwkJd2hpbGUgKHRhYmxlcykgeworCQkJLyogVE9ETyBidWlsZCB0YWJsZSAqLworCQkJLyogVE9ETyBzdWJtaXQgdGFibGUgdG8gdGhlIGRldmljZSAqLworCQkJLyogaWYgZW5naW5lIHN0b3BwZWQgYW5kIHVuZmluaXNoZWQgd29yayB0aGVuIHN0YXJ0IGVuZ2luZSAqLworCQl9CisJCXB1dCBvdXJzZWx2ZXMgb24gd2FpdCBxdWV1ZQorI2VuZGlmCisKKwkJZG1hX3VubWFwX3NnKE5VTEwsIGFwZS0+c2dtLT5zZ2wsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMsIERNQV9UT19ERVZJQ0UpOworCQkvKiBkaXJ0eSBhbmQgZnJlZSB0aGUgcGFnZXMgKi8KKwkJc2dtX3VubWFwX3VzZXJfcGFnZXMoYXBlLT5zZ20sIDEvKmRpcnRpZWQqLyk7CisJCS8qIGJvb2sga2VlcGluZyAqLworCQl0cmFuc2Zlcl9hZGRyICs9IHRyYW5zZmVyX2xlbjsKKwkJcmVtYWluaW5nIC09IHRyYW5zZmVyX2xlbjsKKwkJZG9uZSArPSB0cmFuc2Zlcl9sZW47CisJfQorCXJldHVybiBkb25lOworfQorCisvKgorICogY2hhcmFjdGVyIGRldmljZSBmaWxlIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2dfZm9wcyA9IHsKKyAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgIC5vcGVuID0gc2dfb3BlbiwKKyAgLnJlbGVhc2UgPSBzZ19jbG9zZSwKKyAgLnJlYWQgPSBzZ19yZWFkLAorICAud3JpdGUgPSBzZ193cml0ZSwKK307CisKKy8qIHNnX2luaXQoKSAtIEluaXRpYWxpemUgY2hhcmFjdGVyIGRldmljZQorICoKKyAqIFhYWCBTaG91bGQgaWRlYWxseSBiZSB0aWVkIHRvIHRoZSBkZXZpY2UsIG9uIGRldmljZSBwcm9iZSwgbm90IG1vZHVsZSBpbml0LgorICovCitzdGF0aWMgaW50IHNnX2luaXQoc3RydWN0IGFwZV9kZXYgKmFwZSkKK3sKKwlpbnQgcmM7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBzZ19pbml0KClcbiIpOworCS8qIGFsbG9jYXRlIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworCXJjID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmYXBlLT5jZGV2bm8sIDAvKnJlcXVlc3RlZCBtaW5vciovLCAxLypjb3VudCovLCBEUlZfTkFNRSk7CisJLyogYWxsb2NhdGlvbiBmYWlsZWQ/ICovCisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoImFsbG9jX2NocmRldl9yZWdpb24oKSA9ICVkXG4iLCByYyk7CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisJLyogY291cGxlIHRoZSBkZXZpY2UgZmlsZSBvcGVyYXRpb25zIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJY2Rldl9pbml0KCZhcGUtPmNkZXYsICZzZ19mb3BzKTsKKwlhcGUtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwkvKiBicmluZyBjaGFyYWN0ZXIgZGV2aWNlIGxpdmUgKi8KKwlyYyA9IGNkZXZfYWRkKCZhcGUtPmNkZXYsIGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygiY2Rldl9hZGQoKSA9ICVkXG4iLCByYyk7CisJCWdvdG8gZmFpbF9hZGQ7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJhbHRwY2llY2hkbWEgPSAlZDolZFxuIiwgTUFKT1IoYXBlLT5jZGV2bm8pLCBNSU5PUihhcGUtPmNkZXZubykpOworCXJldHVybiAwOworZmFpbF9hZGQ6CisJLyogZnJlZSB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworICAgIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhcGUtPmNkZXZubywgMS8qY291bnQqLyk7CitmYWlsX2FsbG9jOgorCXJldHVybiAtMTsKK30KKworLyogc2dfZXhpdCgpIC0gQ2xlYW51cCBjaGFyYWN0ZXIgZGV2aWNlCisgKgorICogWFhYIFNob3VsZCBpZGVhbGx5IGJlIHRpZWQgdG8gdGhlIGRldmljZSwgb24gZGV2aWNlIHJlbW92ZSwgbm90IG1vZHVsZSBleGl0LgorICovCisKK3N0YXRpYyB2b2lkIHNnX2V4aXQoc3RydWN0IGFwZV9kZXYgKmFwZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHNnX2V4aXQoKVxuIik7CisJLyogcmVtb3ZlIHRoZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJY2Rldl9kZWwoJmFwZS0+Y2Rldik7CisJLyogZnJlZSB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNoYXJhY3RlciBkZXZpY2Ugbm9kZSAqLworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhcGUtPmNkZXZubywgMS8qY291bnQqLyk7Cit9CisKKyNlbmRpZiAvKiBBTFRQQ0lFQ0hETUFfQ0RFViAqLworCisvKiB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgUENJIGtlcm5lbCBzdWIgc3lzdGVtCisgKiBAc2VlIExERDMgcGFnZSAzMTEKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBpZHMsCisJLnByb2JlID0gcHJvYmUsCisJLnJlbW92ZSA9IHJlbW92ZSwKKwkvKiByZXN1bWUsIHN1c3BlbmQgYXJlIG9wdGlvbmFsICovCit9OworCisvKioKKyAqIGFsdGVyYXBjaWVjaGRtYV9pbml0KCkgLSBNb2R1bGUgaW5pdGlhbGl6YXRpb24sIHJlZ2lzdGVycyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhbHRlcmFwY2llY2hkbWFfaW5pdCh2b2lkKQoreworICBpbnQgcmMgPSAwOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgaW5pdCgpLCBidWlsdCBhdCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiXG4iKTsKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBQQ0kgYnVzIGRyaXZlciAqLworCXJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkgIHJldHVybiByYzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbHRlcmFwY2llY2hkbWFfaW5pdCgpIC0gTW9kdWxlIGNsZWFudXAsIHVucmVnaXN0ZXJzIGRldmljZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhbHRlcmFwY2llY2hkbWFfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgZXhpdCgpLCBidWlsdCBhdCAiIF9fREFURV9fICIgIiBfX1RJTUVfXyAiXG4iKTsKKwkvKiB1bnJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFBDSSBidXMgZHJpdmVyICovCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChhbHRlcmFwY2llY2hkbWFfaW5pdCk7Cittb2R1bGVfZXhpdChhbHRlcmFwY2llY2hkbWFfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTk2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCkBAIC0wLDAgKzEsODYgQEAKK21lbnUgIkFuZHJvaWQiCisKK2NvbmZpZyBBTkRST0lECisJYm9vbCAiQW5kcm9pZCBEcml2ZXJzIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB2YXJpb3VzIGRyaXZlcnMgbmVlZGVkIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtCisKK2NvbmZpZyBBTkRST0lEX0JJTkRFUl9JUEMKKwlib29sICJBbmRyb2lkIEJpbmRlciBJUEMgRHJpdmVyIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9MT0dHRVIKKwl0cmlzdGF0ZSAiQW5kcm9pZCBsb2cgZHJpdmVyIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRQorCWJvb2wgIkFuZHJvaWQgUkFNIGJ1ZmZlciBjb25zb2xlIgorCWRlZmF1bHQgbgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQorCWJvb2wgIkVuYWJsZSB2ZXJib3NlIGNvbnNvbGUgbWVzc2FnZXMgb24gQW5kcm9pZCBSQU0gY29uc29sZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKKworbWVudWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlib29sICJBbmRyb2lkIFJBTSBDb25zb2xlIEVuYWJsZSBlcnJvciBjb3JyZWN0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQorCXNlbGVjdCBSRUVEX1NPTE9NT04KKwlzZWxlY3QgUkVFRF9TT0xPTU9OX0VOQzgKKwlzZWxlY3QgUkVFRF9TT0xPTU9OX0RFQzgKKworaWYgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCisJaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIERhdGEgZGF0YSBzaXplIgorCWRlZmF1bHQgMTI4CisJaGVscAorCSAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRUNDIHNpemUiCisJZGVmYXVsdCAxNgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCisJaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIFN5bWJvbCBzaXplIgorCWRlZmF1bHQgOAorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKKwloZXggIkFuZHJvaWQgUkFNIENvbnNvbGUgUG9seW5vbWlhbCIKKwlkZWZhdWx0IDB4MTkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDQpCisJZGVmYXVsdCAweDI5IGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA1KQorCWRlZmF1bHQgMHg2MSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNikKKwlkZWZhdWx0IDB4ODkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDcpCisJZGVmYXVsdCAweDExZCBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gOCkKKworZW5kaWYgIyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCWJvb2wgIlN0YXJ0IEFuZHJvaWQgUkFNIGNvbnNvbGUgZWFybHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIKKwloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgdmlydHVhbCBhZGRyZXNzIgorCWRlZmF1bHQgMAorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUKKwloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgYnVmZmVyIHNpemUiCisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKworY29uZmlnIEFORFJPSURfVElNRURfR1BJTworCXRyaXN0YXRlICJBbmRyb2lkIHRpbWVkIGdwaW8gZHJpdmVyIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX0xPV19NRU1PUllfS0lMTEVSCisJYm9vbCAiQW5kcm9pZCBMb3cgTWVtb3J5IEtpbGxlciIKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBSZWdpc3RlciBwcm9jZXNzZXMgdG8gYmUga2lsbGVkIHdoZW4gbWVtb3J5IGlzIGxvdworCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjA5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19BTkRST0lEX0JJTkRFUl9JUEMpCSs9IGJpbmRlci5vCitvYmotJChDT05GSUdfQU5EUk9JRF9MT0dHRVIpCQkrPSBsb2dnZXIubworb2JqLSQoQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEUpCSs9IHJhbV9jb25zb2xlLm8KK29iai0kKENPTkZJR19BTkRST0lEX1RJTUVEX0dQSU8pCSs9IHRpbWVkX2dwaW8ubworb2JqLSQoQ09ORklHX0FORFJPSURfTE9XX01FTU9SWV9LSUxMRVIpCSs9IGxvd21lbW9yeWtpbGxlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTljNWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvVE9ETwpAQCAtMCwwICsxLDEwIEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gc3BhcnNlIGZpeGVzCisJLSByZW5hbWUgZmlsZXMgdG8gYmUgbm90IHNvICJnZW5lcmljIgorCS0gbWFrZSBzdXJlIHRoaW5ncyBidWlsZCBhcyBtb2R1bGVzIHByb3Blcmx5CisJLSBhZGQgcHJvcGVyIGFyY2ggZGVwZW5kYW5jaWVzIGFzIG5lZWRlZAorCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHNhbmUKKworUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6CitCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0Y2VhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jCkBAIC0wLDAgKzEsMzUwMyBAQAorLyogYmluZGVyLmMKKyAqCisgKiBBbmRyb2lkIElQQyBTdWJzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9mZHRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImJpbmRlci5oIgorCitzdGF0aWMgREVGSU5FX01VVEVYKGJpbmRlcl9sb2NrKTsKK3N0YXRpYyBITElTVF9IRUFEKGJpbmRlcl9wcm9jcyk7CitzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICpiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKK3N0YXRpYyB1aWRfdCBiaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gLTE7CitzdGF0aWMgaW50IGJpbmRlcl9sYXN0X2lkOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3Q7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYzsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBiaW5kZXJfZGVhZF9ub2RlczsKKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisvKiBUaGlzIGlzIG9ubHkgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS1hcm0vc2l6ZXMuaCAqLworI2lmbmRlZiBTWl8xSworI2RlZmluZSBTWl8xSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2VuZGlmCisKKyNpZm5kZWYgU1pfNE0KKyNkZWZpbmUgU1pfNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAKKyNlbmRpZgorCisjaWZuZGVmIF9faTM4Nl9fCisjZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSB8IFZNX0VYRUMpCisjZWxzZQorI2RlZmluZSBGT1JCSURERU5fTU1BUF9GTEFHUyAgICAgICAgICAgICAgICAoVk1fV1JJVEUpCisjZW5kaWYKKworI2RlZmluZSBCSU5ERVJfU01BTExfQlVGX1NJWkUgKFBBR0VfU0laRSAqIDY0KQorCitlbnVtIHsKKwlCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiAgICAgICAgICAgICA9IDFVIDw8IDAsCisJQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiAgICAgPSAxVSA8PCAxLAorCUJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OICAgICAgID0gMVUgPDwgMiwKKwlCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSAgICAgICAgICAgICA9IDFVIDw8IDMsCisJQklOREVSX0RFQlVHX0RFQURfQklOREVSICAgICAgICAgICAgPSAxVSA8PCA0LAorCUJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04gICAgID0gMVUgPDwgNSwKKwlCSU5ERVJfREVCVUdfUkVBRF9XUklURSAgICAgICAgICAgICA9IDFVIDw8IDYsCisJQklOREVSX0RFQlVHX1VTRVJfUkVGUyAgICAgICAgICAgICAgPSAxVSA8PCA3LAorCUJJTkRFUl9ERUJVR19USFJFQURTICAgICAgICAgICAgICAgID0gMVUgPDwgOCwKKwlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04gICAgICAgICAgICA9IDFVIDw8IDksCisJQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFICAgPSAxVSA8PCAxMCwKKwlCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIgICAgICAgICAgICA9IDFVIDw8IDExLAorCUJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTICAgICAgICAgID0gMVUgPDwgMTIsCisJQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQyAgICAgICAgICAgPSAxVSA8PCAxMywKKwlCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQICAgICAgICAgICA9IDFVIDw8IDE0LAorCUJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMgICAgID0gMVUgPDwgMTUsCit9Oworc3RhdGljIHVpbnQzMl90IGJpbmRlcl9kZWJ1Z19tYXNrID0gQklOREVSX0RFQlVHX1VTRVJfRVJST1IgfAorCUJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04gfCBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTjsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19tYXNrLCBiaW5kZXJfZGVidWdfbWFzaywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOworc3RhdGljIGludCBiaW5kZXJfZGVidWdfbm9fbG9jazsKK21vZHVsZV9wYXJhbV9uYW1lZChwcm9jX25vX2xvY2ssIGJpbmRlcl9kZWJ1Z19ub19sb2NrLCBib29sLCBTX0lXVVNSIHwgU19JUlVHTyk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7CitzdGF0aWMgaW50IGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3I7CitzdGF0aWMgaW50IGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yKAorCWNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaW50IHJldDsKKwlyZXQgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOworCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMikKKwkJd2FrZV91cCgmYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCk7CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9wYXJhbV9jYWxsKHN0b3Bfb25fdXNlcl9lcnJvciwgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IsCisJcGFyYW1fZ2V0X2ludCwgJmJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IsIFNfSVdVU1IgfCBTX0lSVUdPKTsKKworI2RlZmluZSBiaW5kZXJfdXNlcl9lcnJvcih4Li4uKSBcCisJZG8geyBcCisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX0VSUk9SKSBcCisJCQlwcmludGsoS0VSTl9JTkZPIHgpOyBcCisJCWlmIChiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yKSBcCisJCQliaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yID0gMjsgXAorCX0gd2hpbGUgKDApCisKK2VudW0geworCUJJTkRFUl9TVEFUX1BST0MsCisJQklOREVSX1NUQVRfVEhSRUFELAorCUJJTkRFUl9TVEFUX05PREUsCisJQklOREVSX1NUQVRfUkVGLAorCUJJTkRFUl9TVEFUX0RFQVRILAorCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OLAorCUJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAorCUJJTkRFUl9TVEFUX0NPVU5UCit9OworCitzdHJ1Y3QgYmluZGVyX3N0YXRzIHsKKwlpbnQgYnJbX0lPQ19OUihCUl9GQUlMRURfUkVQTFkpICsgMV07CisJaW50IGJjW19JT0NfTlIoQkNfREVBRF9CSU5ERVJfRE9ORSkgKyAxXTsKKwlpbnQgb2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfQ09VTlRdOworCWludCBvYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9DT1VOVF07Cit9OworCitzdGF0aWMgc3RydWN0IGJpbmRlcl9zdGF0cyBiaW5kZXJfc3RhdHM7CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IHsKKwlpbnQgZGVidWdfaWQ7CisJaW50IGNhbGxfdHlwZTsKKwlpbnQgZnJvbV9wcm9jOworCWludCBmcm9tX3RocmVhZDsKKwlpbnQgdGFyZ2V0X2hhbmRsZTsKKwlpbnQgdG9fcHJvYzsKKwlpbnQgdG9fdGhyZWFkOworCWludCB0b19ub2RlOworCWludCBkYXRhX3NpemU7CisJaW50IG9mZnNldHNfc2l6ZTsKK307CitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyB7CisJaW50IG5leHQ7CisJaW50IGZ1bGw7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgZW50cnlbMzJdOworfTsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJpbmRlcl90cmFuc2FjdGlvbl9sb2c7CitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZDsKKworc3RhdGljIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplOworCWUgPSAmbG9nLT5lbnRyeVtsb2ctPm5leHRdOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwlsb2ctPm5leHQrKzsKKwlpZiAobG9nLT5uZXh0ID09IEFSUkFZX1NJWkUobG9nLT5lbnRyeSkpIHsKKwkJbG9nLT5uZXh0ID0gMDsKKwkJbG9nLT5mdWxsID0gMTsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBiaW5kZXJfd29yayB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwllbnVtIHsKKwkJQklOREVSX1dPUktfVFJBTlNBQ1RJT04gPSAxLAorCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURSwKKwkJQklOREVSX1dPUktfTk9ERSwKKwkJQklOREVSX1dPUktfREVBRF9CSU5ERVIsCisJCUJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUiwKKwkJQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OLAorCX0gdHlwZTsKK307CisKK3N0cnVjdCBiaW5kZXJfbm9kZSB7CisJaW50IGRlYnVnX2lkOworCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOworCXVuaW9uIHsKKwkJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKwkJc3RydWN0IGhsaXN0X25vZGUgZGVhZF9ub2RlOworCX07CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9oZWFkIHJlZnM7CisJaW50IGludGVybmFsX3N0cm9uZ19yZWZzOworCWludCBsb2NhbF93ZWFrX3JlZnM7CisJaW50IGxvY2FsX3N0cm9uZ19yZWZzOworCXZvaWQgX191c2VyICpwdHI7CisJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwl1bnNpZ25lZCBoYXNfc3Ryb25nX3JlZiA6IDE7CisJdW5zaWduZWQgcGVuZGluZ19zdHJvbmdfcmVmIDogMTsKKwl1bnNpZ25lZCBoYXNfd2Vha19yZWYgOiAxOworCXVuc2lnbmVkIHBlbmRpbmdfd2Vha19yZWYgOiAxOworCXVuc2lnbmVkIGhhc19hc3luY190cmFuc2FjdGlvbiA6IDE7CisJdW5zaWduZWQgYWNjZXB0X2ZkcyA6IDE7CisJaW50IG1pbl9wcmlvcml0eSA6IDg7CisJc3RydWN0IGxpc3RfaGVhZCBhc3luY190b2RvOworfTsKKworc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggeworCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOworCXZvaWQgX191c2VyICpjb29raWU7Cit9OworCitzdHJ1Y3QgYmluZGVyX3JlZiB7CisJLyogTG9va3VwcyBuZWVkZWQ6ICovCisJLyogICBub2RlICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uKSAqLworCS8qICAgZGVzYyArIHByb2MgPT4gcmVmICh0cmFuc2FjdGlvbiwgaW5jL2RlYyByZWYpICovCisJLyogICBub2RlID0+IHJlZnMgKyBwcm9jcyAocHJvYyBleGl0KSAqLworCWludCBkZWJ1Z19pZDsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX2Rlc2M7CisJc3RydWN0IHJiX25vZGUgcmJfbm9kZV9ub2RlOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZW50cnk7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwl1aW50MzJfdCBkZXNjOworCWludCBzdHJvbmc7CisJaW50IHdlYWs7CisJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOworfTsKKworc3RydWN0IGJpbmRlcl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7IC8qIGZyZWUgYW5kIGFsbG9jYXRlZCBlbnRyaWVzIGJ5IGFkZGVzc3MgKi8KKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOyAvKiBmcmVlIGVudHJ5IGJ5IHNpemUgb3IgYWxsb2NhdGVkIGVudHJ5ICovCisJCQkJLyogYnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGZyZWUgOiAxOworCXVuc2lnbmVkIGFsbG93X3VzZXJfZnJlZSA6IDE7CisJdW5zaWduZWQgYXN5bmNfdHJhbnNhY3Rpb24gOiAxOworCXVuc2lnbmVkIGRlYnVnX2lkIDogMjk7CisKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKworCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGU7CisJc2l6ZV90IGRhdGFfc2l6ZTsKKwlzaXplX3Qgb2Zmc2V0c19zaXplOworCXVpbnQ4X3QgZGF0YVswXTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJvYyB7CisJc3RydWN0IGhsaXN0X25vZGUgcHJvY19ub2RlOworCXN0cnVjdCByYl9yb290IHRocmVhZHM7CisJc3RydWN0IHJiX3Jvb3Qgbm9kZXM7CisJc3RydWN0IHJiX3Jvb3QgcmVmc19ieV9kZXNjOworCXN0cnVjdCByYl9yb290IHJlZnNfYnlfbm9kZTsKKwlpbnQgcGlkOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXZvaWQgKmJ1ZmZlcjsKKwlzaXplX3QgdXNlcl9idWZmZXJfb2Zmc2V0OworCisJc3RydWN0IGxpc3RfaGVhZCBidWZmZXJzOworCXN0cnVjdCByYl9yb290IGZyZWVfYnVmZmVyczsKKwlzdHJ1Y3QgcmJfcm9vdCBhbGxvY2F0ZWRfYnVmZmVyczsKKwlzaXplX3QgZnJlZV9hc3luY19zcGFjZTsKKworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXVpbnQzMl90IGJ1ZmZlcl9mcmVlOworCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7CisJc3RydWN0IGxpc3RfaGVhZCBkZWxpdmVyZWRfZGVhdGg7CisJaW50IG1heF90aHJlYWRzOworCWludCByZXF1ZXN0ZWRfdGhyZWFkczsKKwlpbnQgcmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZDsKKwlpbnQgcmVhZHlfdGhyZWFkczsKKwlsb25nIGRlZmF1bHRfcHJpb3JpdHk7Cit9OworCitlbnVtIHsKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgID0gMHgwMSwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQgICAgID0gMHgwMiwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0VYSVRFRCAgICAgID0gMHgwNCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQgICAgID0gMHgwOCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkcgICAgID0gMHgxMCwKKwlCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOID0gMHgyMAorfTsKKworc3RydWN0IGJpbmRlcl90aHJlYWQgeworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCWludCBwaWQ7CisJaW50IGxvb3BlcjsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbl9zdGFjazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRvZG87CisJdWludDMyX3QgcmV0dXJuX2Vycm9yOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgYnVmICovCisJdWludDMyX3QgcmV0dXJuX2Vycm9yMjsgLyogV3JpdGUgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZSBpbiByZWFkICovCisJCS8qIGJ1ZmZlci4gVXNlZCB3aGVuIHNlbmRpbmcgYSByZXBseSB0byBhIGRlYWQgcHJvY2VzcyB0aGF0ICovCisJCS8qIHdlIGFyZSBhbHNvIHdhaXRpbmcgb24gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uIHsKKwlpbnQgZGVidWdfaWQ7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKmZyb207CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqZnJvbV9wYXJlbnQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICp0b19wcm9jOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0b190aHJlYWQ7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG9fcGFyZW50OworCXVuc2lnbmVkIG5lZWRfcmVwbHkgOiAxOworCS8qdW5zaWduZWQgaXNfZGVhZCA6IDE7Ki8gLyogbm90IHVzZWQgYXQgdGhlIG1vbWVudCAqLworCisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQJY29kZTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJbG9uZwlwcmlvcml0eTsKKwlsb25nCXNhdmVkX3ByaW9yaXR5OworCXVpZF90CXNlbmRlcl9ldWlkOworfTsKKworLyoKKyAqIGNvcGllZCBmcm9tIGdldF91bnVzZWRfZmRfZmxhZ3MKKyAqLworaW50IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCWludCBmZCwgZXJyb3I7CisJc3RydWN0IGZkdGFibGUgKmZkdDsKKwl1bnNpZ25lZCBsb25nIHJsaW1fY3VyOworCisJaWYgKGZpbGVzID09IE5VTEwpCisJCXJldHVybiAtRVNSQ0g7CisKKwllcnJvciA9IC1FTUZJTEU7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKworcmVwZWF0OgorCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOworCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBmZHQtPm1heF9mZHMsCisJCQkJZmlsZXMtPm5leHRfZmQpOworCisJLyoKKwkgKiBOLkIuIEZvciBjbG9uZSB0YXNrcyBzaGFyaW5nIGEgZmlsZXMgc3RydWN0dXJlLCB0aGlzIHRlc3QKKwkgKiB3aWxsIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAodHNrLT5zaWduYWwpCisJCXJsaW1fY3VyID0gdHNrLT5zaWduYWwtPnJsaW1bUkxJTUlUX05PRklMRV0ucmxpbV9jdXI7CisJZWxzZQorCQlybGltX2N1ciA9IDA7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKGZkID49IHJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBmZCBhcnJheSBvciBmZCBzZXQ/ICAqLworCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkJICogSWYgd2UgbmVlZGVkIHRvIGV4cGFuZCB0aGUgZnMgYXJyYXkgd2UKKwkJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgorCQkgKi8KKwkJZXJyb3IgPSAtRU1GSUxFOworCQlnb3RvIHJlcGVhdDsKKwl9CisKKwlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOworCWlmIChmbGFncyAmIE9fQ0xPRVhFQykKKwkJRkRfU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWVsc2UKKwkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOworI2lmIDEKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoZmR0LT5mZFtmZF0gIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOworCQlmZHQtPmZkW2ZkXSA9IE5VTEw7CisJfQorI2VuZGlmCisJZXJyb3IgPSBmZDsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBmZF9pbnN0YWxsCisgKi8KK3N0YXRpYyB2b2lkIHRhc2tfZmRfaW5zdGFsbCgKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodHNrKTsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCisJaWYgKGZpbGVzID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJQlVHX09OKGZkdC0+ZmRbZmRdICE9IE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgZmlsZSk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworfQorCisvKgorICogY29waWVkIGZyb20gX19wdXRfdW51c2VkX2ZkIGluIG9wZW4uYworICovCitzdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOworCWlmIChmZCA8IGZpbGVzLT5uZXh0X2ZkKQorCQlmaWxlcy0+bmV4dF9mZCA9IGZkOworfQorCisvKgorICogY29waWVkIGZyb20gc3lzX2Nsb3NlCisgKi8KK3N0YXRpYyBsb25nIHRhc2tfY2xvc2VfZmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGdldF9maWxlc19zdHJ1Y3QodHNrKTsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCWludCByZXR2YWw7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJaWYgKGZkID49IGZkdC0+bWF4X2ZkcykKKwkJZ290byBvdXRfdW5sb2NrOworCWZpbHAgPSBmZHQtPmZkW2ZkXTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0X3VubG9jazsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZmR0LT5mZFtmZF0sIE5VTEwpOworCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmV0dmFsID0gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7CisKKwkvKiBjYW4ndCByZXN0YXJ0IGNsb3NlIHN5c2NhbGwgYmVjYXVzZSBmaWxlIHRhYmxlIGVudHJ5IHdhcyBjbGVhcmVkICovCisJaWYgKHVubGlrZWx5KHJldHZhbCA9PSAtRVJFU1RBUlRTWVMgfHwKKwkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9JTlRSIHx8CisJCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkKKwkJcmV0dmFsID0gLUVJTlRSOworCisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJcmV0dXJuIHJldHZhbDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJcmV0dXJuIC1FQkFERjsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX3NldF9uaWNlKGxvbmcgbmljZSkKK3sKKwlsb25nIG1pbl9uaWNlOworCWlmIChjYW5fbmljZShjdXJyZW50LCBuaWNlKSkgeworCQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIG5pY2UpOworCQlyZXR1cm47CisJfQorCW1pbl9uaWNlID0gMjAgLSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX05JQ0VdLnJsaW1fY3VyOworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19QUklPUklUWV9DQVApCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG5pY2UgdmFsdWUgJWxkIG5vdCBhbGxvd2VkIHVzZSAiCisJCSAgICAgICAiJWxkIGluc3RlYWRcbiIsIGN1cnJlbnQtPnBpZCwgbmljZSwgbWluX25pY2UpOworCXNldF91c2VyX25pY2UoY3VycmVudCwgbWluX25pY2UpOworCWlmIChtaW5fbmljZSA8IDIwKQorCQlyZXR1cm47CisJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQgUkxJTUlUX05JQ0Ugbm90IHNldFxuIiwgY3VycmVudC0+cGlkKTsKK30KKworc3RhdGljIHNpemVfdCBiaW5kZXJfYnVmZmVyX3NpemUoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCWlmIChsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKSkKKwkJcmV0dXJuIHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplIC0gKHZvaWQgKilidWZmZXItPmRhdGE7CisJZWxzZQorCQlyZXR1cm4gKHNpemVfdClsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKKwkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSkgLSAoc2l6ZV90KWJ1ZmZlci0+ZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwlzaXplX3QgbmV3X2J1ZmZlcl9zaXplOworCisJQlVHX09OKCFuZXdfYnVmZmVyLT5mcmVlKTsKKworCW5ld19idWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBuZXdfYnVmZmVyKTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGFkZCBmcmVlIGJ1ZmZlciwgc2l6ZSAlemQsICIKKwkJICAgICAgICJhdCAlcFxuIiwgcHJvYy0+cGlkLCBuZXdfYnVmZmVyX3NpemUsIG5ld19idWZmZXIpOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlidWZmZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKKwkJQlVHX09OKCFidWZmZXItPmZyZWUpOworCisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwkJaWYgKG5ld19idWZmZXJfc2l6ZSA8IGJ1ZmZlcl9zaXplKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwl9CisJcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwlCVUdfT04obmV3X2J1ZmZlci0+ZnJlZSk7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKworCQlpZiAobmV3X2J1ZmZlciA8IGJ1ZmZlcikKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlIGlmIChuZXdfYnVmZmVyID4gYnVmZmVyKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlCVUcoKTsKKwl9CisJcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYnVmZmVyX2xvb2t1cCgKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHZvaWQgX191c2VyICp1c2VyX3B0cikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqa2Vybl9wdHI7CisKKwlrZXJuX3B0ciA9IHVzZXJfcHRyIC0gcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0CisJCS0gb2Zmc2V0b2Yoc3RydWN0IGJpbmRlcl9idWZmZXIsIGRhdGEpOworCisJd2hpbGUgKG4pIHsKKwkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKworCQlpZiAoa2Vybl9wdHIgPCBidWZmZXIpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoa2Vybl9wdHIgPiBidWZmZXIpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBidWZmZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBhbGxvY2F0ZSwKKwl2b2lkICpzdGFydCwgdm9pZCAqZW5kLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl2b2lkICpwYWdlX2FkZHI7CisJdW5zaWduZWQgbG9uZyB1c2VyX3BhZ2VfYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0IHRtcF9hcmVhOworCXN0cnVjdCBwYWdlICoqcGFnZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6ICVzIHBhZ2VzICVwLSVwXG4iLAorCQkgICAgICAgcHJvYy0+cGlkLCBhbGxvY2F0ZSA/ICJhbGxvY2F0ZSIgOiAiZnJlZSIsIHN0YXJ0LCBlbmQpOworCisJaWYgKGVuZCA8PSBzdGFydCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodm1hKQorCQltbSA9IE5VTEw7CisJZWxzZQorCQltbSA9IGdldF90YXNrX21tKHByb2MtPnRzayk7CisKKwlpZiAobW0pIHsKKwkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJdm1hID0gcHJvYy0+dm1hOworCX0KKworCWlmIChhbGxvY2F0ZSA9PSAwKQorCQlnb3RvIGZyZWVfcmFuZ2U7CisKKwlpZiAodm1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCB0byAiCisJCSAgICAgICAibWFwIHBhZ2VzIGluIHVzZXJzcGFjZSwgbm8gdm1hXG4iLCBwcm9jLT5waWQpOworCQlnb3RvIGVycl9ub192bWE7CisJfQorCisJZm9yIChwYWdlX2FkZHIgPSBzdGFydDsgcGFnZV9hZGRyIDwgZW5kOyBwYWdlX2FkZHIgKz0gUEFHRV9TSVpFKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheV9wdHI7CisJCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOworCisJCUJVR19PTigqcGFnZSk7CisJCSpwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmICgqcGFnZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAiZm9yIHBhZ2UgYXQgJXBcbiIsIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOworCQl9CisJCXRtcF9hcmVhLmFkZHIgPSBwYWdlX2FkZHI7CisJCXRtcF9hcmVhLnNpemUgPSBQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyogZ3VhcmQgcGFnZT8gKi87CisJCXBhZ2VfYXJyYXlfcHRyID0gcGFnZTsKKwkJcmV0ID0gbWFwX3ZtX2FyZWEoJnRtcF9hcmVhLCBQQUdFX0tFUk5FTCwgJnBhZ2VfYXJyYXlfcHRyKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCisJCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVwIGluIGtlcm5lbFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHBhZ2VfYWRkcik7CisJCQlnb3RvIGVycl9tYXBfa2VybmVsX2ZhaWxlZDsKKwkJfQorCQl1c2VyX3BhZ2VfYWRkciA9IChzaXplX3QpcGFnZV9hZGRyICsgcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0OworCQlyZXQgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIHVzZXJfcGFnZV9hZGRyLCBwYWdlWzBdKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCisJCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVseCBpbiB1c2Vyc3BhY2VcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB1c2VyX3BhZ2VfYWRkcik7CisJCQlnb3RvIGVycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ7CisJCX0KKwkJLyogdm1faW5zZXJ0X3BhZ2UgZG9lcyBub3Qgc2VlbSB0byBpbmNyZW1lbnQgdGhlIHJlZmNvdW50ICovCisJfQorCWlmIChtbSkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KKwlyZXR1cm4gMDsKKworZnJlZV9yYW5nZToKKwlmb3IgKHBhZ2VfYWRkciA9IGVuZCAtIFBBR0VfU0laRTsgcGFnZV9hZGRyID49IHN0YXJ0OworCSAgICAgcGFnZV9hZGRyIC09IFBBR0VfU0laRSkgeworCQlwYWdlID0gJnByb2MtPnBhZ2VzWyhwYWdlX2FkZHIgLSBwcm9jLT5idWZmZXIpIC8gUEFHRV9TSVpFXTsKKwkJaWYgKHZtYSkKKwkJCXphcF9wYWdlX3JhbmdlKHZtYSwgKHNpemVfdClwYWdlX2FkZHIgKworCQkJCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldCwgUEFHRV9TSVpFLCBOVUxMKTsKK2Vycl92bV9pbnNlcnRfcGFnZV9mYWlsZWQ6CisJCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHIsIFBBR0VfU0laRSk7CitlcnJfbWFwX2tlcm5lbF9mYWlsZWQ6CisJCV9fZnJlZV9wYWdlKCpwYWdlKTsKKwkJKnBhZ2UgPSBOVUxMOworZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOgorCQk7CisJfQorZXJyX25vX3ZtYToKKwlpZiAobW0pIHsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCW1tcHV0KG1tKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYmluZGVyX2FsbG9jX2J1ZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCisJc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IG9mZnNldHNfc2l6ZSwgaW50IGlzX2FzeW5jKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+ZnJlZV9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJc3RydWN0IHJiX25vZGUgKmJlc3RfZml0ID0gTlVMTDsKKwl2b2lkICpoYXNfcGFnZV9hZGRyOworCXZvaWQgKmVuZF9wYWdlX2FkZHI7CisJc2l6ZV90IHNpemU7CisKKwlpZiAocHJvYy0+dm1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmLCBubyB2bWFcbiIsCisJCSAgICAgICBwcm9jLT5waWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaXplID0gQUxJR04oZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkgKworCQlBTElHTihvZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKKworCWlmIChzaXplIDwgZGF0YV9zaXplIHx8IHNpemUgPCBvZmZzZXRzX3NpemUpIHsKKwkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJInNpemUgJXpkLSV6ZFxuIiwgcHJvYy0+cGlkLCBkYXRhX3NpemUsIG9mZnNldHNfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChpc19hc3luYyAmJgorCSAgICBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlIDwgc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcikpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBmIgorCQkJICAgICAgICJhaWxlZCwgbm8gYXN5bmMgc3BhY2UgbGVmdFxuIiwgcHJvYy0+cGlkLCBzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKG4pIHsKKwkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7CisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwkJaWYgKHNpemUgPCBidWZmZXJfc2l6ZSkgeworCQkJYmVzdF9maXQgPSBuOworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWJlc3RfZml0ID0gbjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChiZXN0X2ZpdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBmYWlsZWQsICIKKwkJICAgICAgICJubyBhZGRyZXNzIHNwYWNlXG4iLCBwcm9jLT5waWQsIHNpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG4gPT0gTlVMTCkgeworCQlidWZmZXIgPSByYl9lbnRyeShiZXN0X2ZpdCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOworCX0KKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGdvdCBidWZmIgorCQkgICAgICAgImVyICVwIHNpemUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCisJaGFzX3BhZ2VfYWRkciA9CisJCSh2b2lkICopKCgoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyk7CisJaWYgKG4gPT0gTlVMTCkgeworCQlpZiAoc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcikgKyA0ID49IGJ1ZmZlcl9zaXplKQorCQkJYnVmZmVyX3NpemUgPSBzaXplOyAvKiBubyByb29tIGZvciBvdGhlciBidWZmZXJzICovCisJCWVsc2UKKwkJCWJ1ZmZlcl9zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7CisJfQorCWVuZF9wYWdlX2FkZHIgPSAodm9pZCAqKVBBR0VfQUxJR04oKHNpemVfdClidWZmZXItPmRhdGEgKyBidWZmZXJfc2l6ZSk7CisJaWYgKGVuZF9wYWdlX2FkZHIgPiBoYXNfcGFnZV9hZGRyKQorCQllbmRfcGFnZV9hZGRyID0gaGFzX3BhZ2VfYWRkcjsKKwlpZiAoYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDEsCisJICAgICh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSksIGVuZF9wYWdlX2FkZHIsIE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCXJiX2VyYXNlKGJlc3RfZml0LCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwlidWZmZXItPmZyZWUgPSAwOworCWJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcihwcm9jLCBidWZmZXIpOworCWlmIChidWZmZXJfc2l6ZSAhPSBzaXplKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyID0gKHZvaWQgKilidWZmZXItPmRhdGEgKyBzaXplOworCQlsaXN0X2FkZCgmbmV3X2J1ZmZlci0+ZW50cnksICZidWZmZXItPmVudHJ5KTsKKwkJbmV3X2J1ZmZlci0+ZnJlZSA9IDE7CisJCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIocHJvYywgbmV3X2J1ZmZlcik7CisJfQorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290ICIKKwkJICAgICAgICIlcFxuIiwgcHJvYy0+cGlkLCBzaXplLCBidWZmZXIpOworCWJ1ZmZlci0+ZGF0YV9zaXplID0gZGF0YV9zaXplOworCWJ1ZmZlci0+b2Zmc2V0c19zaXplID0gb2Zmc2V0c19zaXplOworCWJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gPSBpc19hc3luYzsKKwlpZiAoaXNfYXN5bmMpIHsKKwkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSAtPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgIgorCQkJICAgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAorCQkJICAgICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UpOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkICpidWZmZXJfc3RhcnRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiAodm9pZCAqKSgoc2l6ZV90KWJ1ZmZlciAmIFBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkICpidWZmZXJfZW5kX3BhZ2Uoc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlyZXR1cm4gKHZvaWQgKikoKChzaXplX3QpKGJ1ZmZlciArIDEpIC0gMSkgJiBQQUdFX01BU0spOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfZGVsZXRlX2ZyZWVfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiwgKm5leHQgPSBOVUxMOworCWludCBmcmVlX3BhZ2VfZW5kID0gMTsKKwlpbnQgZnJlZV9wYWdlX3N0YXJ0ID0gMTsKKworCUJVR19PTihwcm9jLT5idWZmZXJzLm5leHQgPT0gJmJ1ZmZlci0+ZW50cnkpOworCXByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwlCVUdfT04oIXByZXYtPmZyZWUpOworCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSkgeworCQlmcmVlX3BhZ2Vfc3RhcnQgPSAwOworCQlpZiAoYnVmZmVyX2VuZF9wYWdlKHByZXYpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKQorCQkJZnJlZV9wYWdlX2VuZCA9IDA7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgIgorCQkJICAgICAgICJzaGFyZSBwYWdlIHdpdGggJXBcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwl9CisKKwlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7CisJCW5leHQgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKKwkJCQkgIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7CisJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PSBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSkgeworCQkJZnJlZV9wYWdlX2VuZCA9IDA7CisJCQlpZiAoYnVmZmVyX3N0YXJ0X3BhZ2UobmV4dCkgPT0KKwkJCSAgICBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKQorCQkJCWZyZWVfcGFnZV9zdGFydCA9IDA7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsICIKKwkJCQkgICAgICAgImJ1ZmZlciAlcCBzaGFyZSBwYWdlIHdpdGggJXBcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwkJfQorCX0KKwlsaXN0X2RlbCgmYnVmZmVyLT5lbnRyeSk7CisJaWYgKGZyZWVfcGFnZV9zdGFydCB8fCBmcmVlX3BhZ2VfZW5kKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgZG8gIgorCQkJICAgICAgICJub3Qgc2hhcmUgcGFnZSVzJXMgd2l0aCB3aXRoICVwIG9yICVwXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgYnVmZmVyLCBmcmVlX3BhZ2Vfc3RhcnQgPyAiIiA6ICIgZW5kIiwKKwkJCSAgICAgICBmcmVlX3BhZ2VfZW5kID8gIiIgOiAiIHN0YXJ0IiwgcHJldiwgbmV4dCk7CisJCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLCBmcmVlX3BhZ2Vfc3RhcnQgPworCQkJYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSA6IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpLAorCQkJKGZyZWVfcGFnZV9lbmQgPyBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSA6CisJCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSArIFBBR0VfU0laRSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfZnJlZV9idWYoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplLCBidWZmZXJfc2l6ZTsKKworCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisKKwlzaXplID0gQUxJR04oYnVmZmVyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCisJCUFMSUdOKGJ1ZmZlci0+b2Zmc2V0c19zaXplLCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2ZyZWVfYnVmICVwIHNpemUgJXpkIGJ1ZmZlciIKKwkJICAgICAgICJfc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBzaXplLCBidWZmZXJfc2l6ZSk7CisKKwlCVUdfT04oYnVmZmVyLT5mcmVlKTsKKwlCVUdfT04oc2l6ZSA+IGJ1ZmZlcl9zaXplKTsKKwlCVUdfT04oYnVmZmVyLT50cmFuc2FjdGlvbiAhPSBOVUxMKTsKKwlCVUdfT04oKHZvaWQgKilidWZmZXIgPCBwcm9jLT5idWZmZXIpOworCUJVR19PTigodm9pZCAqKWJ1ZmZlciA+IHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplKTsKKworCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uKSB7CisJCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgKz0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgc2l6ZSAlemQgIgorCQkJICAgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAorCQkJICAgICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UpOworCX0KKworCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLAorCQkodm9pZCAqKVBBR0VfQUxJR04oKHNpemVfdClidWZmZXItPmRhdGEpLAorCQkodm9pZCAqKSgoKHNpemVfdClidWZmZXItPmRhdGEgKyBidWZmZXJfc2l6ZSkgJiBQQUdFX01BU0spLAorCQlOVUxMKTsKKwlyYl9lcmFzZSgmYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOworCWJ1ZmZlci0+ZnJlZSA9IDE7CisJaWYgKCFsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKSkgeworCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKG5leHQtPmZyZWUpIHsKKwkJCXJiX2VyYXNlKCZuZXh0LT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwkJCWJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIocHJvYywgbmV4dCk7CisJCX0KKwl9CisJaWYgKHByb2MtPmJ1ZmZlcnMubmV4dCAhPSAmYnVmZmVyLT5lbnRyeSkgeworCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LAorCQkJCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKHByZXYtPmZyZWUpIHsKKwkJCWJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIocHJvYywgYnVmZmVyKTsKKwkJCXJiX2VyYXNlKCZwcmV2LT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKKwkJCWJ1ZmZlciA9IHByZXY7CisJCX0KKwl9CisJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9ub2RlICoKK2JpbmRlcl9nZXRfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHZvaWQgX191c2VyICpwdHIpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCXdoaWxlIChuKSB7CisJCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOworCisJCWlmIChwdHIgPCBub2RlLT5wdHIpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gbm9kZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKgorYmluZGVyX25ld19ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCBfX3VzZXIgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+bm9kZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCW5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKHB0ciA8IG5vZGUtPnB0cikKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJcmJfbGlua19ub2RlKCZub2RlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwlub2RlLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7CisJbm9kZS0+cHJvYyA9IHByb2M7CisJbm9kZS0+cHRyID0gcHRyOworCW5vZGUtPmNvb2tpZSA9IGNvb2tpZTsKKwlub2RlLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19OT0RFOworCUlOSVRfTElTVF9IRUFEKCZub2RlLT53b3JrLmVudHJ5KTsKKwlJTklUX0xJU1RfSEVBRCgmbm9kZS0+YXN5bmNfdG9kbyk7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIGNyZWF0ZWRcbiIsCisJCSAgICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCisJCSAgICAgICBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9pbmNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCwKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCit7CisJaWYgKHN0cm9uZykgeworCQlpZiAoaW50ZXJuYWwpIHsKKwkJCWlmICh0YXJnZXRfbGlzdCA9PSBOVUxMICYmCisJCQkgICAgbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgPT0gMCAmJgorCQkJICAgICEobm9kZSA9PSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJgorCQkJICAgIG5vZGUtPmhhc19zdHJvbmdfcmVmKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyBzdHJvbmcgIgorCQkJCQkibm9kZSBmb3IgJWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKys7CisJCX0gZWxzZQorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKKwkJaWYgKCFub2RlLT5oYXNfc3Ryb25nX3JlZiAmJiB0YXJnZXRfbGlzdCkgeworCQkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWludGVybmFsKQorCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7CisJCWlmICghbm9kZS0+aGFzX3dlYWtfcmVmICYmIGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7CisJCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBpbnZhbGlkIGluYyB3ZWFrIG5vZGUgIgorCQkJCQkiZm9yICVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCB0YXJnZXRfbGlzdCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9kZWNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCkKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChpbnRlcm5hbCkKKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLS07CisJCWVsc2UKKwkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLS07CisJCWlmIChub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyB8fCBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcykKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmICghaW50ZXJuYWwpCisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMtLTsKKwkJaWYgKG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChub2RlLT5wcm9jICYmIChub2RlLT5oYXNfc3Ryb25nX3JlZiB8fCBub2RlLT5oYXNfd2Vha19yZWYpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgeworCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgJm5vZGUtPnByb2MtPnRvZG8pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZub2RlLT5wcm9jLT53YWl0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgJiYgIW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzICYmCisJCSAgICAhbm9kZS0+bG9jYWxfd2Vha19yZWZzKSB7CisJCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKKwkJCWlmIChub2RlLT5wcm9jKSB7CisJCQkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZub2RlLT5wcm9jLT5ub2Rlcyk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVmbGVzcyBub2RlICVkIGRlbGV0ZWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCX0gZWxzZSB7CisJCQkJaGxpc3RfZGVsKCZub2RlLT5kZWFkX25vZGUpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IGRlYWQgbm9kZSAlZCBkZWxldGVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7CisJCQl9CisJCQlrZnJlZShub2RlKTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICoKK2JpbmRlcl9nZXRfcmVmKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdWludDMyX3QgZGVzYykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOworCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisKKwl3aGlsZSAobikgeworCQlyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKworCQlpZiAoZGVzYyA8IHJlZi0+ZGVzYykKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChkZXNjID4gcmVmLT5kZXNjKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gcmVmOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICoKK2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5yZWZzX2J5X25vZGUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmLCAqbmV3X3JlZjsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9ub2RlKTsKKworCQlpZiAobm9kZSA8IHJlZi0+bm9kZSkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAobm9kZSA+IHJlZi0+bm9kZSkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByZWY7CisJfQorCW5ld19yZWYgPSBremFsbG9jKHNpemVvZigqcmVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ld19yZWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1JFRl0rKzsKKwluZXdfcmVmLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7CisJbmV3X3JlZi0+cHJvYyA9IHByb2M7CisJbmV3X3JlZi0+bm9kZSA9IG5vZGU7CisJcmJfbGlua19ub2RlKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsICZwcm9jLT5yZWZzX2J5X25vZGUpOworCisJbmV3X3JlZi0+ZGVzYyA9IChub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlKSA/IDAgOiAxOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCQlpZiAocmVmLT5kZXNjID4gbmV3X3JlZi0+ZGVzYykKKwkJCWJyZWFrOworCQluZXdfcmVmLT5kZXNjID0gcmVmLT5kZXNjICsgMTsKKwl9CisKKwlwID0gJnByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKworCQlpZiAobmV3X3JlZi0+ZGVzYyA8IHJlZi0+ZGVzYykKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAobmV3X3JlZi0+ZGVzYyA+IHJlZi0+ZGVzYykKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCUJVRygpOworCX0KKwlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgJnByb2MtPnJlZnNfYnlfZGVzYyk7CisJaWYgKG5vZGUpIHsKKwkJaGxpc3RfYWRkX2hlYWQoJm5ld19yZWYtPm5vZGVfZW50cnksICZub2RlLT5yZWZzKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIG5ldyByZWYgJWQgZGVzYyAlZCBmb3IgIgorCQkJCSJub2RlICVkXG4iLCBwcm9jLT5waWQsIG5ld19yZWYtPmRlYnVnX2lkLAorCQkJCW5ld19yZWYtPmRlc2MsIG5vZGUtPmRlYnVnX2lkKTsKKwl9IGVsc2UgeworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkJImRlYWQgbm9kZVxuIiwgcHJvYy0+cGlkLCBuZXdfcmVmLT5kZWJ1Z19pZCwKKwkJCQluZXdfcmVmLT5kZXNjKTsKKwl9CisJcmV0dXJuIG5ld19yZWY7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfZGVsZXRlX3JlZihzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQoreworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGRlbGV0ZSByZWYgJWQgZGVzYyAlZCBmb3IgIgorCQkJIm5vZGUgJWRcbiIsIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlX2Rlc2MsICZyZWYtPnByb2MtPnJlZnNfYnlfZGVzYyk7CisJcmJfZXJhc2UoJnJlZi0+cmJfbm9kZV9ub2RlLCAmcmVmLT5wcm9jLT5yZWZzX2J5X25vZGUpOworCWlmIChyZWYtPnN0cm9uZykKKwkJYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgMSwgMSk7CisJaGxpc3RfZGVsKCZyZWYtPm5vZGVfZW50cnkpOworCWJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIDAsIDEpOworCWlmIChyZWYtPmRlYXRoKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgZGVsZXRlIHJlZiAlZCBkZXNjICVkICIKKwkJCQkiaGFzIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcmVmLT5wcm9jLT5waWQsCisJCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjKTsKKwkJbGlzdF9kZWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnkpOworCQlrZnJlZShyZWYtPmRlYXRoKTsKKwkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX0RFQVRIXSsrOworCX0KKwlrZnJlZShyZWYpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9SRUZdKys7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9pbmNfcmVmKAorCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcsIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQoreworCWludCByZXQ7CisJaWYgKHN0cm9uZykgeworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJcmV0ID0gYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgMSwgMSwgdGFyZ2V0X2xpc3QpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJlZi0+c3Ryb25nKys7CisJfSBlbHNlIHsKKwkJaWYgKHJlZi0+d2VhayA9PSAwKSB7CisJCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAwLCAxLCB0YXJnZXRfbGlzdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmVmLT53ZWFrKys7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2JpbmRlcl9kZWNfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcpCit7CisJaWYgKHN0cm9uZykgeworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQgaW52YWxpZCBkZWMgc3Ryb25nLCAiCisJCQkJCSAgInJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZFxuIiwKKwkJCQkJICByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKKwkJCQkJICByZWYtPmRlc2MsIHJlZi0+c3Ryb25nLCByZWYtPndlYWspOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVmLT5zdHJvbmctLTsKKwkJaWYgKHJlZi0+c3Ryb25nID09IDApIHsKKwkJCWludCByZXQ7CisJCQlyZXQgPSBiaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCBzdHJvbmcsIDEpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJlZi0+d2VhayA9PSAwKSB7CisJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyB3ZWFrLCAiCisJCQkJCSAgInJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZFxuIiwKKwkJCQkJICByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKKwkJCQkJICByZWYtPmRlc2MsIHJlZi0+c3Ryb25nLCByZWYtPndlYWspOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmVmLT53ZWFrLS07CisJfQorCWlmIChyZWYtPnN0cm9uZyA9PSAwICYmIHJlZi0+d2VhayA9PSAwKQorCQliaW5kZXJfZGVsZXRlX3JlZihyZWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3BvcF90cmFuc2FjdGlvbigKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKK3sKKwlpZiAodGFyZ2V0X3RocmVhZCkgeworCQlCVUdfT04odGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gdCk7CisJCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbSAhPSB0YXJnZXRfdGhyZWFkKTsKKwkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPQorCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2stPmZyb21fcGFyZW50OworCQl0LT5mcm9tID0gTlVMTDsKKwl9CisJdC0+bmVlZF9yZXBseSA9IDA7CisJaWYgKHQtPmJ1ZmZlcikKKwkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJa2ZyZWUodCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQsIHVpbnQzMl90IGVycm9yX2NvZGUpCit7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQ7CisJQlVHX09OKHQtPmZsYWdzICYgVEZfT05FX1dBWSk7CisJd2hpbGUgKDEpIHsKKwkJdGFyZ2V0X3RocmVhZCA9IHQtPmZyb207CisJCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCQlpZiAodGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmCisJCQkgICB0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID09IEJSX09LKSB7CisJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yMiA9CisJCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjsKKwkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKKwkJCX0KKwkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0spIHsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IHNlbmQgZmFpbGVkIHJlcGx5IGZvciB0cmFuc2FjdGlvbiAlZCB0byAlZDolZFxuIiwKKwkJCQkJICAgICAgIHQtPmRlYnVnX2lkLCB0YXJnZXRfdGhyZWFkLT5wcm9jLT5waWQsIHRhcmdldF90aHJlYWQtPnBpZCk7CisKKwkJCQliaW5kZXJfcG9wX3RyYW5zYWN0aW9uKHRhcmdldF90aHJlYWQsIHQpOworCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9IGVycm9yX2NvZGU7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0YXJnZXRfdGhyZWFkLT53YWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwgdGFyZ2V0ICIKKwkJCQkJInRocmVhZCwgJWQ6JWQsIGhhcyBlcnJvciBjb2RlICVkICIKKwkJCQkJImFscmVhZHlcbiIsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwKKwkJCQkJdGFyZ2V0X3RocmVhZC0+cGlkLAorCQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IpOworCQkJfQorCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqbmV4dCA9IHQtPmZyb21fcGFyZW50OworCisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgIgorCQkJCQkiZm9yIHRyYW5zYWN0aW9uICVkLCB0YXJnZXQgZGVhZFxuIiwKKwkJCQkJdC0+ZGVidWdfaWQpOworCisJCQliaW5kZXJfcG9wX3RyYW5zYWN0aW9uKHRhcmdldF90aHJlYWQsIHQpOworCQkJaWYgKG5leHQgPT0gTlVMTCkgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZXBseSBmYWlsZWQsIgorCQkJCQkJIiBubyB0YXJnZXQgdGhyZWFkIGF0IHJvb3RcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXQgPSBuZXh0OworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVwbHkgZmFpbGVkLCBubyB0YXJnIgorCQkJCQkiZXQgdGhyZWFkIC0tIHJldHJ5ICVkXG4iLCB0LT5kZWJ1Z19pZCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAorCQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciwgc2l6ZV90ICpmYWlsZWRfYXQpOworCitzdGF0aWMgdm9pZAorYmluZGVyX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgKnRyLCBpbnQgcmVwbHkpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnRjb21wbGV0ZTsKKwlzaXplX3QgKm9mZnAsICpvZmZfZW5kOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqdGFyZ2V0X3Byb2M7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0OworCXdhaXRfcXVldWVfaGVhZF90ICp0YXJnZXRfd2FpdDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICppbl9yZXBseV90byA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7CisJdWludDMyX3QgcmV0dXJuX2Vycm9yOworCisJZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKKwllLT5jYWxsX3R5cGUgPSByZXBseSA/IDIgOiAhISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKKwllLT5mcm9tX3Byb2MgPSBwcm9jLT5waWQ7CisJZS0+ZnJvbV90aHJlYWQgPSB0aHJlYWQtPnBpZDsKKwllLT50YXJnZXRfaGFuZGxlID0gdHItPnRhcmdldC5oYW5kbGU7CisJZS0+ZGF0YV9zaXplID0gdHItPmRhdGFfc2l6ZTsKKwllLT5vZmZzZXRzX3NpemUgPSB0ci0+b2Zmc2V0c19zaXplOworCisJaWYgKHJlcGx5KSB7CisJCWluX3JlcGx5X3RvID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwkJaWYgKGluX3JlcGx5X3RvID09IE5VTEwpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJCSAgIndpdGggbm8gdHJhbnNhY3Rpb24gc3RhY2tcbiIsCisJCQkJCSAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlnb3RvIGVycl9lbXB0eV9jYWxsX3N0YWNrOworCQl9CisJCWJpbmRlcl9zZXRfbmljZShpbl9yZXBseV90by0+c2F2ZWRfcHJpb3JpdHkpOworCQlpZiAoaW5fcmVwbHlfdG8tPnRvX3RocmVhZCAhPSB0aHJlYWQpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJIndpdGggYmFkIHRyYW5zYWN0aW9uIHN0YWNrLCIKKwkJCQkiIHRyYW5zYWN0aW9uICVkIGhhcyB0YXJnZXQgJWQ6JWRcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgaW5fcmVwbHlfdG8tPmRlYnVnX2lkLAorCQkJCWluX3JlcGx5X3RvLT50b19wcm9jID8KKwkJCQlpbl9yZXBseV90by0+dG9fcHJvYy0+cGlkIDogMCwKKwkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkID8KKwkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkLT5waWQgOiAwKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWluX3JlcGx5X3RvID0gTlVMTDsKKwkJCWdvdG8gZXJyX2JhZF9jYWxsX3N0YWNrOworCQl9CisJCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSBpbl9yZXBseV90by0+dG9fcGFyZW50OworCQl0YXJnZXRfdGhyZWFkID0gaW5fcmVwbHlfdG8tPmZyb207CisJCWlmICh0YXJnZXRfdGhyZWFkID09IE5VTEwpIHsKKwkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7CisJCQlnb3RvIGVycl9kZWFkX2JpbmRlcjsKKwkJfQorCQlpZiAodGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gaW5fcmVwbHlfdG8pIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCisJCQkJIndpdGggYmFkIHRhcmdldCB0cmFuc2FjdGlvbiBzdGFjayAlZCwgIgorCQkJCSJleHBlY3RlZCAlZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID8KKwkJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZGVidWdfaWQgOiAwLAorCQkJCWluX3JlcGx5X3RvLT5kZWJ1Z19pZCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlpbl9yZXBseV90byA9IE5VTEw7CisJCQl0YXJnZXRfdGhyZWFkID0gTlVMTDsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCXRhcmdldF9wcm9jID0gdGFyZ2V0X3RocmVhZC0+cHJvYzsKKwl9IGVsc2UgeworCQlpZiAodHItPnRhcmdldC5oYW5kbGUpIHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0ci0+dGFyZ2V0LmhhbmRsZSk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgorCQkJCQkidHJhbnNhY3Rpb24gdG8gaW52YWxpZCBoYW5kbGVcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU7CisJCQl9CisJCQl0YXJnZXRfbm9kZSA9IHJlZi0+bm9kZTsKKwkJfSBlbHNlIHsKKwkJCXRhcmdldF9ub2RlID0gYmluZGVyX2NvbnRleHRfbWdyX25vZGU7CisJCQlpZiAodGFyZ2V0X25vZGUgPT0gTlVMTCkgeworCQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7CisJCQkJZ290byBlcnJfbm9fY29udGV4dF9tZ3Jfbm9kZTsKKwkJCX0KKwkJfQorCQllLT50b19ub2RlID0gdGFyZ2V0X25vZGUtPmRlYnVnX2lkOworCQl0YXJnZXRfcHJvYyA9IHRhcmdldF9ub2RlLT5wcm9jOworCQlpZiAodGFyZ2V0X3Byb2MgPT0gTlVMTCkgeworCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCWlmICghKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpICYmIHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2spIHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRtcDsKKwkJCXRtcCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCQl3aGlsZSAodG1wKSB7CisJCQkJaWYgKHRtcC0+ZnJvbSAmJiB0bXAtPmZyb20tPnByb2MgPT0gdGFyZ2V0X3Byb2MpCisJCQkJCXRhcmdldF90aHJlYWQgPSB0bXAtPmZyb207CisJCQkJdG1wID0gdG1wLT5mcm9tX3BhcmVudDsKKwkJCX0KKwkJfQorCX0KKwlpZiAodGFyZ2V0X3RocmVhZCkgeworCQllLT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkLT5waWQ7CisJCXRhcmdldF9saXN0ID0gJnRhcmdldF90aHJlYWQtPnRvZG87CisJCXRhcmdldF93YWl0ID0gJnRhcmdldF90aHJlYWQtPndhaXQ7CisJfSBlbHNlIHsKKwkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3Byb2MtPnRvZG87CisJCXRhcmdldF93YWl0ID0gJnRhcmdldF9wcm9jLT53YWl0OworCX0KKwllLT50b19wcm9jID0gdGFyZ2V0X3Byb2MtPnBpZDsKKworCS8qIFRPRE86IHJldXNlIGluY29taW5nIHRyYW5zYWN0aW9uIGZvciByZXBseSAqLworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICh0ID09IE5VTEwpIHsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9hbGxvY190X2ZhaWxlZDsKKwl9CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworCisJdGNvbXBsZXRlID0ga3phbGxvYyhzaXplb2YoKnRjb21wbGV0ZSksIEdGUF9LRVJORUwpOworCWlmICh0Y29tcGxldGUgPT0gTlVMTCkgeworCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCWdvdG8gZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ7CisJfQorCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKKworCXQtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwllLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKSB7CisJCWlmIChyZXBseSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfUkVQTFkgJWQgLT4gJWQ6JWQsICIKKwkJCSAgICAgICAiZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsCisJCQkgICAgICAgdGFyZ2V0X3Byb2MtPnBpZCwgdGFyZ2V0X3RocmVhZC0+cGlkLAorCQkJICAgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAorCQkJICAgICAgIHRyLT5kYXRhX3NpemUsIHRyLT5vZmZzZXRzX3NpemUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICIKKwkJCSAgICAgICAiJWQgLSBub2RlICVkLCBkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCisJCQkgICAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCisJCQkgICAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJfQorCisJaWYgKCFyZXBseSAmJiAhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpKQorCQl0LT5mcm9tID0gdGhyZWFkOworCWVsc2UKKwkJdC0+ZnJvbSA9IE5VTEw7CisJdC0+c2VuZGVyX2V1aWQgPSBwcm9jLT50c2stPmNyZWQtPmV1aWQ7CisJdC0+dG9fcHJvYyA9IHRhcmdldF9wcm9jOworCXQtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQ7CisJdC0+Y29kZSA9IHRyLT5jb2RlOworCXQtPmZsYWdzID0gdHItPmZsYWdzOworCXQtPnByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOworCXQtPmJ1ZmZlciA9IGJpbmRlcl9hbGxvY19idWYodGFyZ2V0X3Byb2MsIHRyLT5kYXRhX3NpemUsCisJCXRyLT5vZmZzZXRzX3NpemUsICFyZXBseSAmJiAodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSk7CisJaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfYmluZGVyX2FsbG9jX2J1Zl9mYWlsZWQ7CisJfQorCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMDsKKwl0LT5idWZmZXItPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7CisJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IHQ7CisJdC0+YnVmZmVyLT50YXJnZXRfbm9kZSA9IHRhcmdldF9ub2RlOworCWlmICh0YXJnZXRfbm9kZSkKKwkJYmluZGVyX2luY19ub2RlKHRhcmdldF9ub2RlLCAxLCAwLCBOVUxMKTsKKworCW9mZnAgPSAoc2l6ZV90ICopKHQtPmJ1ZmZlci0+ZGF0YSArIEFMSUdOKHRyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIodC0+YnVmZmVyLT5kYXRhLCB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YV9zaXplKSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCSJkYXRhIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKG9mZnAsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLCB0ci0+b2Zmc2V0c19zaXplKSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCSJvZmZzZXRzIHB0clxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfY29weV9kYXRhX2ZhaWxlZDsKKwl9CisJb2ZmX2VuZCA9ICh2b2lkICopb2ZmcCArIHRyLT5vZmZzZXRzX3NpemU7CisJZm9yICg7IG9mZnAgPCBvZmZfZW5kOyBvZmZwKyspIHsKKwkJc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqZnA7CisJCWlmICgqb2ZmcCA+IHQtPmJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoICIKKwkJCQkiaW52YWxpZCBvZmZzZXQsICV6ZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCAqb2ZmcCk7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQlnb3RvIGVycl9iYWRfb2Zmc2V0OworCQl9CisJCWZwID0gKHN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKikodC0+YnVmZmVyLT5kYXRhICsgKm9mZnApOworCQlzd2l0Y2ggKGZwLT50eXBlKSB7CisJCWNhc2UgQklOREVSX1RZUEVfQklOREVSOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIGZwLT5iaW5kZXIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCW5vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgZnAtPmJpbmRlciwgZnAtPmNvb2tpZSk7CisJCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJCWdvdG8gZXJyX2JpbmRlcl9uZXdfbm9kZV9mYWlsZWQ7CisJCQkJfQorCQkJCW5vZGUtPm1pbl9wcmlvcml0eSA9IGZwLT5mbGFncyAmIEZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSzsKKwkJCQlub2RlLT5hY2NlcHRfZmRzID0gISEoZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyk7CisJCQl9CisJCQlpZiAoZnAtPmNvb2tpZSAhPSBub2RlLT5jb29raWUpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBzZW5kaW5nIHUlcCAiCisJCQkJCSJub2RlICVkLCBjb29raWUgbWlzbWF0Y2ggJXAgIT0gJXBcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWZwLT5iaW5kZXIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQlmcC0+Y29va2llLCBub2RlLT5jb29raWUpOworCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKKwkJCX0KKwkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCBub2RlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CisJCQl9CisJCQlpZiAoZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSKQorCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfSEFORExFOworCQkJZWxzZQorCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfV0VBS19IQU5ETEU7CisJCQlmcC0+aGFuZGxlID0gcmVmLT5kZXNjOworCQkJYmluZGVyX2luY19yZWYocmVmLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUsICZ0aHJlYWQtPnRvZG8pOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgbm9kZSAlZCB1JXAgLT4gcmVmICVkIGRlc2MgJWRcbiIsCisJCQkJICAgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1RZUEVfSEFORExFOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgZnAtPmhhbmRsZSk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgorCQkJCQkidHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkICIKKwkJCQkJImhhbmRsZSwgJWxkXG4iLCBwcm9jLT5waWQsCisJCQkJCXRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOworCQkJfQorCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSB0YXJnZXRfcHJvYykgeworCQkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUpCisJCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfQklOREVSOworCQkJCWVsc2UKKwkJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjsKKwkJCQlmcC0+YmluZGVyID0gcmVmLT5ub2RlLT5wdHI7CisJCQkJZnAtPmNvb2tpZSA9IHJlZi0+bm9kZS0+Y29va2llOworCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0JJTkRFUiwgMCwgTlVMTCk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIC0+IG5vZGUgJWQgdSVwXG4iLAorCQkJCQkgICAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkLCByZWYtPm5vZGUtPnB0cik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBiaW5kZXJfcmVmICpuZXdfcmVmOworCQkJCW5ld19yZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZSh0YXJnZXRfcHJvYywgcmVmLT5ub2RlKTsKKwkJCQlpZiAobmV3X3JlZiA9PSBOVUxMKSB7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOworCQkJCX0KKwkJCQlmcC0+aGFuZGxlID0gbmV3X3JlZi0+ZGVzYzsKKwkJCQliaW5kZXJfaW5jX3JlZihuZXdfcmVmLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9IQU5ETEUsIE5VTEwpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCisJCQkJCSAgICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIG5ld19yZWYtPmRlYnVnX2lkLCBuZXdfcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCX0KKwkJfSBicmVhazsKKworCQljYXNlIEJJTkRFUl9UWVBFX0ZEOiB7CisJCQlpbnQgdGFyZ2V0X2ZkOworCQkJc3RydWN0IGZpbGUgKmZpbGU7CisKKwkJCWlmIChyZXBseSkgeworCQkJCWlmICghKGluX3JlcGx5X3RvLT5mbGFncyAmIFRGX0FDQ0VQVF9GRFMpKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7CisJCQkJfQorCQkJfSBlbHNlIGlmICghdGFyZ2V0X25vZGUtPmFjY2VwdF9mZHMpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBmZCwgJWxkLCBidXQgdGFyZ2V0IGRvZXMgbm90IGFsbG93IGZkc1xuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ZkX25vdF9hbGxvd2VkOworCQkJfQorCisJCQlmaWxlID0gZmdldChmcC0+aGFuZGxlKTsKKwkJCWlmIChmaWxlID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGZkLCAlbGRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9mZ2V0X2ZhaWxlZDsKKwkJCX0KKwkJCXRhcmdldF9mZCA9IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyh0YXJnZXRfcHJvYy0+dHNrLCBPX0NMT0VYRUMpOworCQkJaWYgKHRhcmdldF9mZCA8IDApIHsKKwkJCQlmcHV0KGZpbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDsKKwkJCX0KKwkJCXRhc2tfZmRfaW5zdGFsbCh0YXJnZXRfcHJvYy0+dHNrLCB0YXJnZXRfZmQsIGZpbGUpOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgZmQgJWxkIC0+ICVkXG4iLCBmcC0+aGFuZGxlLCB0YXJnZXRfZmQpOworCQkJLyogVE9ETzogZnB1dD8gKi8KKwkJCWZwLT5oYW5kbGUgPSB0YXJnZXRfZmQ7CisJCX0gYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvIgorCQkJCSJuIHdpdGggaW52YWxpZCBvYmplY3QgdHlwZSwgJWx4XG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT50eXBlKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2JhZF9vYmplY3RfdHlwZTsKKwkJfQorCX0KKwlpZiAocmVwbHkpIHsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7CisJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgaW5fcmVwbHlfdG8pOworCX0gZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7CisJCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDApOworCQl0LT5uZWVkX3JlcGx5ID0gMTsKKwkJdC0+ZnJvbV9wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKKwl9IGVsc2UgeworCQlCVUdfT04odGFyZ2V0X25vZGUgPT0gTlVMTCk7CisJCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDEpOworCQlpZiAodGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbikgeworCQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X25vZGUtPmFzeW5jX3RvZG87CisJCQl0YXJnZXRfd2FpdCA9IE5VTEw7CisJCX0gZWxzZQorCQkJdGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDE7CisJfQorCXQtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOworCWxpc3RfYWRkX3RhaWwoJnQtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwl0Y29tcGxldGUtPnR5cGUgPSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTsKKwlsaXN0X2FkZF90YWlsKCZ0Y29tcGxldGUtPmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwlpZiAodGFyZ2V0X3dhaXQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSh0YXJnZXRfd2FpdCk7CisJcmV0dXJuOworCitlcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ6CitlcnJfZmdldF9mYWlsZWQ6CitlcnJfZmRfbm90X2FsbG93ZWQ6CitlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOgorZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDoKK2Vycl9iaW5kZXJfbmV3X25vZGVfZmFpbGVkOgorZXJyX2JhZF9vYmplY3RfdHlwZToKK2Vycl9iYWRfb2Zmc2V0OgorZXJyX2NvcHlfZGF0YV9mYWlsZWQ6CisJYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHRhcmdldF9wcm9jLCB0LT5idWZmZXIsIG9mZnApOworCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCWJpbmRlcl9mcmVlX2J1Zih0YXJnZXRfcHJvYywgdC0+YnVmZmVyKTsKK2Vycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDoKKwlrZnJlZSh0Y29tcGxldGUpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKK2Vycl9hbGxvY190Y29tcGxldGVfZmFpbGVkOgorCWtmcmVlKHQpOworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl0rKzsKK2Vycl9hbGxvY190X2ZhaWxlZDoKK2Vycl9iYWRfY2FsbF9zdGFjazoKK2Vycl9lbXB0eV9jYWxsX3N0YWNrOgorZXJyX2RlYWRfYmluZGVyOgorZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZToKK2Vycl9ub19jb250ZXh0X21ncl9ub2RlOgorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgdHJhbnNhY3Rpb24gZmFpbGVkICVkLCBzaXplIgorCQkJCSIlemQtJXpkXG4iLAorCQkJICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgcmV0dXJuX2Vycm9yLAorCQkJICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisKKwl7CisJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpmZTsKKwkJZmUgPSBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgmYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19mYWlsZWQpOworCQkqZmUgPSAqZTsKKwl9CisKKwlCVUdfT04odGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0spOworCWlmIChpbl9yZXBseV90bykgeworCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCQliaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoaW5fcmVwbHlfdG8sIHJldHVybl9lcnJvcik7CisJfSBlbHNlCisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gcmV0dXJuX2Vycm9yOworfQorCitzdGF0aWMgdm9pZAorYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciwgc2l6ZV90ICpmYWlsZWRfYXQpCit7CisJc2l6ZV90ICpvZmZwLCAqb2ZmX2VuZDsKKwlpbnQgZGVidWdfaWQgPSBidWZmZXItPmRlYnVnX2lkOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGJ1ZmZlciByZWxlYXNlICVkLCBzaXplICV6ZC0lemQsIGZhaWxlZCBhdCAlcFxuIiwKKwkJCSAgIHByb2MtPnBpZCwgYnVmZmVyLT5kZWJ1Z19pZCwKKwkJCSAgIGJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwgZmFpbGVkX2F0KTsKKworCWlmIChidWZmZXItPnRhcmdldF9ub2RlKQorCQliaW5kZXJfZGVjX25vZGUoYnVmZmVyLT50YXJnZXRfbm9kZSwgMSwgMCk7CisKKwlvZmZwID0gKHNpemVfdCAqKShidWZmZXItPmRhdGEgKyBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwlpZiAoZmFpbGVkX2F0KQorCQlvZmZfZW5kID0gZmFpbGVkX2F0OworCWVsc2UKKwkJb2ZmX2VuZCA9ICh2b2lkICopb2ZmcCArIGJ1ZmZlci0+b2Zmc2V0c19zaXplOworCWZvciAoOyBvZmZwIDwgb2ZmX2VuZDsgb2ZmcCsrKSB7CisJCXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKmZwOworCQlpZiAoKm9mZnAgPiBidWZmZXItPmRhdGFfc2l6ZSAtIHNpemVvZigqZnApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQiCisJCQkJCSJvZmZzZXQgJXpkLCBzaXplICV6ZFxuIiwgZGVidWdfaWQsICpvZmZwLCBidWZmZXItPmRhdGFfc2l6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcCA9IChzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICopKGJ1ZmZlci0+ZGF0YSArICpvZmZwKTsKKwkJc3dpdGNoIChmcC0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9UWVBFX0JJTkRFUjoKKwkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0JJTkRFUjogeworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIGZwLT5iaW5kZXIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBub2RlICVwXG4iLCBkZWJ1Z19pZCwgZnAtPmJpbmRlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBub2RlICVkIHUlcFxuIiwKKwkJCQkgICAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0cik7CisJCQliaW5kZXJfZGVjX25vZGUobm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBoYW5kbGUgJWxkXG4iLCBkZWJ1Z19pZCwgZnAtPmhhbmRsZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCisJCQkJICAgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisJCQliaW5kZXJfZGVjX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSk7CisJCX0gYnJlYWs7CisKKwkJY2FzZSBCSU5ERVJfVFlQRV9GRDoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIGZkICVsZFxuIiwgZnAtPmhhbmRsZSk7CisJCQlpZiAoZmFpbGVkX2F0KQorCQkJCXRhc2tfY2xvc2VfZmQocHJvYy0+dHNrLCBmcC0+aGFuZGxlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCBiYWQgb2JqZWN0IHR5cGUgJWx4XG4iLCBkZWJ1Z19pZCwgZnAtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludAorYmluZGVyX3RocmVhZF93cml0ZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCisJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgc2l6ZSwgc2lnbmVkIGxvbmcgKmNvbnN1bWVkKQoreworCXVpbnQzMl90IGNtZDsKKwl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOworCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOworCisJd2hpbGUgKHB0ciA8IGVuZCAmJiB0aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSykgeworCQlpZiAoZ2V0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWYgKF9JT0NfTlIoY21kKSA8IEFSUkFZX1NJWkUoYmluZGVyX3N0YXRzLmJjKSkgeworCQkJYmluZGVyX3N0YXRzLmJjW19JT0NfTlIoY21kKV0rKzsKKwkJCXByb2MtPnN0YXRzLmJjW19JT0NfTlIoY21kKV0rKzsKKwkJCXRocmVhZC0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQl9CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgQkNfSU5DUkVGUzoKKwkJY2FzZSBCQ19BQ1FVSVJFOgorCQljYXNlIEJDX1JFTEVBU0U6CisJCWNhc2UgQkNfREVDUkVGUzogeworCQkJdWludDMyX3QgdGFyZ2V0OworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCWNvbnN0IGNoYXIgKmRlYnVnX3N0cmluZzsKKworCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmICh0YXJnZXQgPT0gMCAmJiBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJgorCQkJICAgIChjbWQgPT0gQkNfSU5DUkVGUyB8fCBjbWQgPT0gQkNfQUNRVUlSRSkpIHsKKwkJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZShwcm9jLAorCQkJCQkgICAgICAgYmluZGVyX2NvbnRleHRfbWdyX25vZGUpOworCQkJCWlmIChyZWYtPmRlc2MgIT0gdGFyZ2V0KSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiIKKwkJCQkJCSIlZCB0cmllZCB0byBhY3F1aXJlICIKKwkJCQkJCSJyZWZlcmVuY2UgdG8gZGVzYyAwLCAiCisJCQkJCQkiZ290ICVkIGluc3RlYWRcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJcmVmLT5kZXNjKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgcmVmY291IgorCQkJCQkibnQgY2hhbmdlIG9uIGludmFsaWQgcmVmICVkXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0YXJnZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChjbWQpIHsKKwkJCWNhc2UgQkNfSU5DUkVGUzoKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiSW5jUmVmcyI7CisJCQkJYmluZGVyX2luY19yZWYocmVmLCAwLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfQUNRVUlSRToKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiQWNxdWlyZSI7CisJCQkJYmluZGVyX2luY19yZWYocmVmLCAxLCBOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfUkVMRUFTRToKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiUmVsZWFzZSI7CisJCQkJYmluZGVyX2RlY19yZWYocmVmLCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkNfREVDUkVGUzoKKwkJCWRlZmF1bHQ6CisJCQkJZGVidWdfc3RyaW5nID0gIkRlY1JlZnMiOworCQkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9SRUZTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkZWJ1Z19zdHJpbmcsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEJDX0lOQ1JFRlNfRE9ORToKKwkJY2FzZSBCQ19BQ1FVSVJFX0RPTkU6IHsKKwkJCXZvaWQgX191c2VyICpub2RlX3B0cjsKKwkJCXZvaWQgKmNvb2tpZTsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCQkJaWYgKGdldF91c2VyKG5vZGVfcHRyLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlub2RlID0gYmluZGVyX2dldF9ub2RlKHByb2MsIG5vZGVfcHRyKTsKKwkJCWlmIChub2RlID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSIlcyB1JXAgbm8gbWF0Y2hcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPworCQkJCQkiQkNfSU5DUkVGU19ET05FIiA6CisJCQkJCSJCQ19BQ1FVSVJFX0RPTkUiLAorCQkJCQlub2RlX3B0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29va2llICE9IG5vZGUtPmNvb2tpZSkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzIHUlcCBub2RlICVkIgorCQkJCQkiIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/CisJCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDogIkJDX0FDUVVJUkVfRE9ORSIsCisJCQkJCW5vZGVfcHRyLCBub2RlLT5kZWJ1Z19pZCwKKwkJCQkJY29va2llLCBub2RlLT5jb29raWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUpIHsKKwkJCQlpZiAobm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID09IDApIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkJIkJDX0FDUVVJUkVfRE9ORSBub2RlICVkIGhhcyAiCisJCQkJCQkibm8gcGVuZGluZyBhY3F1aXJlIHJlcXVlc3RcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJbm9kZS0+ZGVidWdfaWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPT0gMCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCQkiQkNfSU5DUkVGU19ET05FIG5vZGUgJWQgaGFzICIKKwkJCQkJCSJubyBwZW5kaW5nIGluY3JlZnMgcmVxdWVzdFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlub2RlLT5kZWJ1Z19pZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlub2RlLT5wZW5kaW5nX3dlYWtfcmVmID0gMDsKKwkJCX0KKwkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBjbWQgPT0gQkNfQUNRVUlSRV9ET05FLCAwKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyBub2RlICVkIGxzICVkIGx3ICVkXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWQgPT0gQkNfSU5DUkVGU19ET05FID8gIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBCQ19BVFRFTVBUX0FDUVVJUkU6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQVRURU1QVF9BQ1FVSVJFIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgQkNfQUNRVUlSRV9SRVNVTFQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQUNRVUlSRV9SRVNVTFQgbm90IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljYXNlIEJDX0ZSRUVfQlVGRkVSOiB7CisJCQl2b2lkIF9fdXNlciAqZGF0YV9wdHI7CisJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCisJCQlpZiAoZ2V0X3VzZXIoZGF0YV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKworCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOworCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG5vIG1hdGNoXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgorCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG1hdGNoZWQgIgorCQkJCQkidW5yZXR1cm5lZCBidWZmZXJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0ZSRUVfQlVGRkVSIHUlcCBmb3VuZCBidWZmZXIgJWQgZm9yICVzIHRyYW5zYWN0aW9uXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0ciwgYnVmZmVyLT5kZWJ1Z19pZCwKKwkJCQkgICAgICAgYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImZpbmlzaGVkIik7CisKKwkJCWlmIChidWZmZXItPnRyYW5zYWN0aW9uKSB7CisJCQkJYnVmZmVyLT50cmFuc2FjdGlvbi0+YnVmZmVyID0gTlVMTDsKKwkJCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwkJCX0KKwkJCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICYmIGJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJCQlCVUdfT04oIWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbik7CisJCQkJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmFzeW5jX3RvZG8pKQorCQkJCQlidWZmZXItPnRhcmdldF9ub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24gPSAwOworCQkJCWVsc2UKKwkJCQkJbGlzdF9tb3ZlX3RhaWwoYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kby5uZXh0LCAmdGhyZWFkLT50b2RvKTsKKwkJCX0KKwkJCWJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShwcm9jLCBidWZmZXIsIE5VTEwpOworCQkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQkNfVFJBTlNBQ1RJT046CisJCWNhc2UgQkNfUkVQTFk6IHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ciwgcHRyLCBzaXplb2YodHIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodHIpOworCQkJYmluZGVyX3RyYW5zYWN0aW9uKHByb2MsIHRocmVhZCwgJnRyLCBjbWQgPT0gQkNfUkVQTFkpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEJDX1JFR0lTVEVSX0xPT1BFUjoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19USFJFQURTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfUkVHSVNURVJfTE9PUEVSXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkgeworCQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRDsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjoiCisJCQkJCSIgQkNfUkVHSVNURVJfTE9PUEVSIGNhbGxlZCAiCisJCQkJCSJhZnRlciBCQ19FTlRFUl9MT09QRVJcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJfSBlbHNlIGlmIChwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcyA9PSAwKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKKwkJCQkJIndpdGhvdXQgcmVxdWVzdFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9IGVsc2UgeworCQkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzLS07CisJCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCsrOworCQkJfQorCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEOworCQkJYnJlYWs7CisJCWNhc2UgQkNfRU5URVJfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19FTlRFUl9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19FTlRFUl9MT09QRVIgY2FsbGVkIGFmdGVyICIKKwkJCQkJIkJDX1JFR0lTVEVSX0xPT1BFUlxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBCQ19FWElUX0xPT1BFUjoKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19USFJFQURTKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfRVhJVF9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FWElURUQ7CisJCQlicmVhazsKKworCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgorCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogeworCQkJdWludDMyX3QgdGFyZ2V0OworCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7CisKKwkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgdGFyZ2V0KTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzICIKKwkJCQkJImludmFsaWQgcmVmICVkXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQljbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPworCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKKwkJCQkJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCisJCQkJCXRhcmdldCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlcCByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJICAgICAgIGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/CisJCQkJICAgICAgICJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgorCQkJCSAgICAgICAiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKKwkJCQkgICAgICAgY29va2llLCByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCisJCQkJICAgICAgIHJlZi0+c3Ryb25nLCByZWYtPndlYWssIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCisJCQlpZiAoY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OKSB7CisJCQkJaWYgKHJlZi0+ZGVhdGgpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKKwkJCQkJCSJkIEJDX1JFUVVFU1RfREVBVEhfTk9USSIKKwkJCQkJCSJGSUNBVElPTiBkZWF0aCBub3RpZmljIgorCQkJCQkJImF0aW9uIGFscmVhZHkgc2V0XG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWF0aCA9IGt6YWxsb2Moc2l6ZW9mKCpkZWF0aCksIEdGUF9LRVJORUwpOworCQkJCWlmIChkZWF0aCA9PSBOVUxMKSB7CisJCQkJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfRVJST1I7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICIKKwkJCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gZmFpbGVkXG4iLAorCQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX0RFQVRIXSsrOworCQkJCUlOSVRfTElTVF9IRUFEKCZkZWF0aC0+d29yay5lbnRyeSk7CisJCQkJZGVhdGgtPmNvb2tpZSA9IGNvb2tpZTsKKwkJCQlyZWYtPmRlYXRoID0gZGVhdGg7CisJCQkJaWYgKHJlZi0+bm9kZS0+cHJvYyA9PSBOVUxMKSB7CisJCQkJCXJlZi0+ZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSOworCQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVmLT5kZWF0aCA9PSBOVUxMKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCisJCQkJCQkiZCBCQ19DTEVBUl9ERUFUSF9OT1RJRkkiCisJCQkJCQkiQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdCIKKwkJCQkJCSJpb24gbm90IGFjdGl2ZVxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVhdGggPSByZWYtPmRlYXRoOworCQkJCWlmIChkZWF0aC0+Y29va2llICE9IGNvb2tpZSkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgorCQkJCQkJImQgQkNfQ0xFQVJfREVBVEhfTk9USUZJIgorCQkJCQkJIkNBVElPTiBkZWF0aCBub3RpZmljYXQiCisJCQkJCQkiaW9uIGNvb2tpZSBtaXNtYXRjaCAiCisJCQkJCQkiJXAgIT0gJXBcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQkJZGVhdGgtPmNvb2tpZSwgY29va2llKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJlZi0+ZGVhdGggPSBOVUxMOworCQkJCWlmIChsaXN0X2VtcHR5KCZkZWF0aC0+d29yay5lbnRyeSkpIHsKKwkJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKKwkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJQlVHX09OKGRlYXRoLT53b3JrLnR5cGUgIT0gQklOREVSX1dPUktfREVBRF9CSU5ERVIpOworCQkJCQlkZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOworCQkJCX0KKwkJCX0KKwkJfSBicmVhazsKKwkJY2FzZSBCQ19ERUFEX0JJTkRFUl9ET05FOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gTlVMTDsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCwgZW50cnkpIHsKKwkJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqdG1wX2RlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKKwkJCQlpZiAodG1wX2RlYXRoLT5jb29raWUgPT0gY29va2llKSB7CisJCQkJCWRlYXRoID0gdG1wX2RlYXRoOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19ERUFEX0JJTkRFUl9ET05FICVwIGZvdW5kICVwXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKKwkJCWlmIChkZWF0aCA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgQkNfREVBRCIKKwkJCQkJIl9CSU5ERVJfRE9ORSAlcCBub3QgZm91bmRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxpc3RfZGVsX2luaXQoJmRlYXRoLT53b3JrLmVudHJ5KTsKKwkJCWlmIChkZWF0aC0+d29yay50eXBlID09IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUikgeworCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047CisJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKKwkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6JWQgdW5rbm93biBjb21tYW5kICVkXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJKmNvbnN1bWVkID0gcHRyIC0gYnVmZmVyOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorYmluZGVyX3N0YXRfYnIoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLCB1aW50MzJfdCBjbWQpCit7CisJaWYgKF9JT0NfTlIoY21kKSA8IEFSUkFZX1NJWkUoYmluZGVyX3N0YXRzLmJyKSkgeworCQliaW5kZXJfc3RhdHMuYnJbX0lPQ19OUihjbWQpXSsrOworCQlwcm9jLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJCXRocmVhZC0+c3RhdHMuYnJbX0lPQ19OUihjbWQpXSsrOworCX0KK30KKworc3RhdGljIGludAorYmluZGVyX2hhc19wcm9jX3dvcmsoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykgfHwgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl9oYXNfdGhyZWFkX3dvcmsoc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgfHwgdGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgfHwKKwkJKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Cit9CisKK3N0YXRpYyBpbnQKK2JpbmRlcl90aHJlYWRfcmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsCisJdm9pZCAgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQsIGludCBub25fYmxvY2spCit7CisJdm9pZCBfX3VzZXIgKnB0ciA9IGJ1ZmZlciArICpjb25zdW1lZDsKKwl2b2lkIF9fdXNlciAqZW5kID0gYnVmZmVyICsgc2l6ZTsKKworCWludCByZXQgPSAwOworCWludCB3YWl0X2Zvcl9wcm9jX3dvcms7CisKKwlpZiAoKmNvbnN1bWVkID09IDApIHsKKwkJaWYgKHB1dF91c2VyKEJSX05PT1AsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCX0KKworcmV0cnk6CisJd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmIGxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbyk7CisKKwlpZiAodGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYgcHRyIDwgZW5kKSB7CisJCWlmICh0aHJlYWQtPnJldHVybl9lcnJvcjIgIT0gQlJfT0spIHsKKwkJCWlmIChwdXRfdXNlcih0aHJlYWQtPnJldHVybl9lcnJvcjIsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAocHRyID09IGVuZCkKKwkJCQlnb3RvIGRvbmU7CisJCQl0aHJlYWQtPnJldHVybl9lcnJvcjIgPSBCUl9PSzsKKwkJfQorCQlpZiAocHV0X3VzZXIodGhyZWFkLT5yZXR1cm5fZXJyb3IsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOworCQlnb3RvIGRvbmU7CisJfQorCisKKwl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJcHJvYy0+cmVhZHlfdGhyZWFkcysrOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKKwkJaWYgKCEodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwKKwkJCQkJQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkpIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiBUaHJlYWQgd2FpdGluZyAiCisJCQkJImZvciBwcm9jZXNzIHdvcmsgYmVmb3JlIGNhbGxpbmcgQkNfUkVHSVNURVJfIgorCQkJCSJMT09QRVIgb3IgQkNfRU5URVJfTE9PUEVSIChzdGF0ZSAleClcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdGhyZWFkLT5sb29wZXIpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQsIGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKTsKKwkJfQorCQliaW5kZXJfc2V0X25pY2UocHJvYy0+ZGVmYXVsdF9wcmlvcml0eSk7CisJCWlmIChub25fYmxvY2spIHsKKwkJCWlmICghYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKKwkJCQlyZXQgPSAtRUFHQUlOOworCQl9IGVsc2UKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUocHJvYy0+d2FpdCwgYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSk7CisJfSBlbHNlIHsKKwkJaWYgKG5vbl9ibG9jaykgeworCQkJaWYgKCFiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJfSBlbHNlCisJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkLT53YWl0LCBiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpOworCX0KKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJcHJvYy0+cmVhZHlfdGhyZWFkcy0tOworCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKDEpIHsKKwkJdWludDMyX3QgY21kOworCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgdHI7CisJCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCA9IE5VTEw7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pKQorCQkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJnRocmVhZC0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSAmJiB3YWl0X2Zvcl9wcm9jX3dvcmspCisJCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmcHJvYy0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWVsc2UgeworCQkJaWYgKHB0ciAtIGJ1ZmZlciA9PSA0ICYmICEodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKSkgLyogbm8gZGF0YSBhZGRlZCAqLworCQkJCWdvdG8gcmV0cnk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlbmQgLSBwdHIgPCBzaXplb2YodHIpICsgNCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7CisJCQl0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7CisJCQljbWQgPSBCUl9UUkFOU0FDVElPTl9DT01QTEVURTsKKwkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisKKwkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTl9DT01QTEVURSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKworCQkJbGlzdF9kZWwoJnctPmVudHJ5KTsKKwkJCWtmcmVlKHcpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX05PREU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOworCQkJdWludDMyX3QgY21kID0gQlJfTk9PUDsKKwkJCWNvbnN0IGNoYXIgKmNtZF9uYW1lOworCQkJaW50IHN0cm9uZyA9IG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzIHx8IG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzOworCQkJaW50IHdlYWsgPSAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpIHx8IG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCBzdHJvbmc7CisJCQlpZiAod2VhayAmJiAhbm9kZS0+aGFzX3dlYWtfcmVmKSB7CisJCQkJY21kID0gQlJfSU5DUkVGUzsKKwkJCQljbWRfbmFtZSA9ICJCUl9JTkNSRUZTIjsKKwkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAxOworCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAxOworCQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcysrOworCQkJfSBlbHNlIGlmIChzdHJvbmcgJiYgIW5vZGUtPmhhc19zdHJvbmdfcmVmKSB7CisJCQkJY21kID0gQlJfQUNRVUlSRTsKKwkJCQljbWRfbmFtZSA9ICJCUl9BQ1FVSVJFIjsKKwkJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7CisJCQkJbm9kZS0+cGVuZGluZ19zdHJvbmdfcmVmID0gMTsKKwkJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcysrOworCQkJfSBlbHNlIGlmICghc3Ryb25nICYmIG5vZGUtPmhhc19zdHJvbmdfcmVmKSB7CisJCQkJY21kID0gQlJfUkVMRUFTRTsKKwkJCQljbWRfbmFtZSA9ICJCUl9SRUxFQVNFIjsKKwkJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDA7CisJCQl9IGVsc2UgaWYgKCF3ZWFrICYmIG5vZGUtPmhhc193ZWFrX3JlZikgeworCQkJCWNtZCA9IEJSX0RFQ1JFRlM7CisJCQkJY21kX25hbWUgPSAiQlJfREVDUkVGUyI7CisJCQkJbm9kZS0+aGFzX3dlYWtfcmVmID0gMDsKKwkJCX0KKwkJCWlmIChjbWQgIT0gQlJfTk9PUCkgeworCQkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+cHRyLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCQlpZiAocHV0X3VzZXIobm9kZS0+Y29va2llLCAodm9pZCAqIF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKworCQkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9SRUZTKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVkIHUlcCBjJXBcbiIsCisJCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjbWRfbmFtZSwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmdy0+ZW50cnkpOworCQkJCWlmICghd2VhayAmJiAhc3Ryb25nKSB7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgZGVsZXRlZFxuIiwKKwkJCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwkJCQkJa2ZyZWUobm9kZSk7CisJCQkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgc3RhdGUgdW5jaGFuZ2VkXG4iLAorCQkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSOgorCQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKKwkJY2FzZSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7CisJCQl1aW50MzJfdCBjbWQ7CisJCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJY21kID0gQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU7CisJCQllbHNlCisJCQkJY21kID0gQlJfREVBRF9CSU5ERVI7CisJCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlcFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkgICAgICAgY21kID09IEJSX0RFQURfQklOREVSID8KKwkJCQkgICAgICAgIkJSX0RFQURfQklOREVSIiA6CisJCQkJICAgICAgICJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCisJCQkJICAgICAgIGRlYXRoLT5jb29raWUpOworCisJCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pIHsKKwkJCQlsaXN0X2RlbCgmdy0+ZW50cnkpOworCQkJCWtmcmVlKGRlYXRoKTsKKwkJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJCQl9IGVsc2UKKwkJCQlsaXN0X21vdmUoJnctPmVudHJ5LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoKTsKKwkJCWlmIChjbWQgPT0gQlJfREVBRF9CSU5ERVIpCisJCQkJZ290byBkb25lOyAvKiBERUFEX0JJTkRFUiBub3RpZmljYXRpb25zIGNhbiBjYXVzZSB0cmFuc2FjdGlvbnMgKi8KKwkJfSBicmVhazsKKwkJfQorCisJCWlmICghdCkKKwkJCWNvbnRpbnVlOworCisJCUJVR19PTih0LT5idWZmZXIgPT0gTlVMTCk7CisJCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlKSB7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKnRhcmdldF9ub2RlID0gdC0+YnVmZmVyLT50YXJnZXRfbm9kZTsKKwkJCXRyLnRhcmdldC5wdHIgPSB0YXJnZXRfbm9kZS0+cHRyOworCQkJdHIuY29va2llID0gIHRhcmdldF9ub2RlLT5jb29raWU7CisJCQl0LT5zYXZlZF9wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKKwkJCWlmICh0LT5wcmlvcml0eSA8IHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkgJiYKKwkJCSAgICAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCQkJYmluZGVyX3NldF9uaWNlKHQtPnByaW9yaXR5KTsKKwkJCWVsc2UgaWYgKCEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSB8fAorCQkJCSB0LT5zYXZlZF9wcmlvcml0eSA+IHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkpCisJCQkJYmluZGVyX3NldF9uaWNlKHRhcmdldF9ub2RlLT5taW5fcHJpb3JpdHkpOworCQkJY21kID0gQlJfVFJBTlNBQ1RJT047CisJCX0gZWxzZSB7CisJCQl0ci50YXJnZXQucHRyID0gTlVMTDsKKwkJCXRyLmNvb2tpZSA9IE5VTEw7CisJCQljbWQgPSBCUl9SRVBMWTsKKwkJfQorCQl0ci5jb2RlID0gdC0+Y29kZTsKKwkJdHIuZmxhZ3MgPSB0LT5mbGFnczsKKwkJdHIuc2VuZGVyX2V1aWQgPSB0LT5zZW5kZXJfZXVpZDsKKworCQlpZiAodC0+ZnJvbSkgeworCQkJc3RydWN0IHRhc2tfc3RydWN0ICpzZW5kZXIgPSB0LT5mcm9tLT5wcm9jLT50c2s7CisJCQl0ci5zZW5kZXJfcGlkID0gdGFza190Z2lkX25yX25zKHNlbmRlciwgY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKKwkJfSBlbHNlIHsKKwkJCXRyLnNlbmRlcl9waWQgPSAwOworCQl9CisKKwkJdHIuZGF0YV9zaXplID0gdC0+YnVmZmVyLT5kYXRhX3NpemU7CisJCXRyLm9mZnNldHNfc2l6ZSA9IHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplOworCQl0ci5kYXRhLnB0ci5idWZmZXIgPSAodm9pZCAqKSgodm9pZCAqKXQtPmJ1ZmZlci0+ZGF0YSArIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldCk7CisJCXRyLmRhdGEucHRyLm9mZnNldHMgPSB0ci5kYXRhLnB0ci5idWZmZXIgKyBBTElHTih0LT5idWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQlpZiAoY29weV90b191c2VyKHB0ciwgJnRyLCBzaXplb2YodHIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwdHIgKz0gc2l6ZW9mKHRyKTsKKworCQliaW5kZXJfc3RhdF9icihwcm9jLCB0aHJlYWQsIGNtZCk7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgJWQgJWQ6JWQsIGNtZCAlZCIKKwkJCQkic2l6ZSAlemQtJXpkIHB0ciAlcC0lcFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJICAgICAgIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04pID8gIkJSX1RSQU5TQUNUSU9OIiA6ICJCUl9SRVBMWSIsCisJCQkgICAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAorCQkJICAgICAgIHQtPmZyb20gPyB0LT5mcm9tLT5waWQgOiAwLCBjbWQsCisJCQkgICAgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJICAgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7CisKKwkJbGlzdF9kZWwoJnQtPndvcmsuZW50cnkpOworCQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDE7CisJCWlmIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04gJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7CisJCQl0LT50b19wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQkJdC0+dG9fdGhyZWFkID0gdGhyZWFkOworCQkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IHQ7CisJCX0gZWxzZSB7CisJCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwkJCWtmcmVlKHQpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworCQl9CisJCWJyZWFrOworCX0KKworZG9uZToKKworCSpjb25zdW1lZCA9IHB0ciAtIGJ1ZmZlcjsKKwlpZiAocHJvYy0+cmVxdWVzdGVkX3RocmVhZHMgKyBwcm9jLT5yZWFkeV90aHJlYWRzID09IDAgJiYKKwkgICAgcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCA8IHByb2MtPm1heF90aHJlYWRzICYmCisJICAgICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAorCSAgICAgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgLyogdGhlIHVzZXItc3BhY2UgY29kZSBmYWlscyB0byAqLworCSAgICAgLypzcGF3biBhIG5ldyB0aHJlYWQgaWYgd2UgbGVhdmUgdGhpcyBvdXQgKi8pIHsKKwkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMrKzsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJSX1NQQVdOX0xPT1BFUlxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJaWYgKHB1dF91c2VyKEJSX1NQQVdOX0xPT1BFUiwgKHVpbnQzMl90IF9fdXNlciAqKWJ1ZmZlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9yZWxlYXNlX3dvcmsoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHN0cnVjdCBiaW5kZXJfd29yaywgZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZ3LT5lbnRyeSk7CisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7CisJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOworCQkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUgJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKQorCQkJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseSh0LCBCUl9ERUFEX1JFUExZKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTogeworCQkJa2ZyZWUodyk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEVdKys7CisJCX0gYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl90aHJlYWQgKmJpbmRlcl9nZXRfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYykKK3sKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+dGhyZWFkcy5yYl9ub2RlOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQl0aHJlYWQgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKworCQlpZiAoY3VycmVudC0+cGlkIDwgdGhyZWFkLT5waWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGN1cnJlbnQtPnBpZCA+IHRocmVhZC0+cGlkKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICgqcCA9PSBOVUxMKSB7CisJCXRocmVhZCA9IGt6YWxsb2Moc2l6ZW9mKCp0aHJlYWQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRocmVhZCA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9USFJFQURdKys7CisJCXRocmVhZC0+cHJvYyA9IHByb2M7CisJCXRocmVhZC0+cGlkID0gY3VycmVudC0+cGlkOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aHJlYWQtPndhaXQpOworCQlJTklUX0xJU1RfSEVBRCgmdGhyZWFkLT50b2RvKTsKKwkJcmJfbGlua19ub2RlKCZ0aHJlYWQtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7CisJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk47CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfT0s7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yMiA9IEJSX09LOworCX0KKwlyZXR1cm4gdGhyZWFkOworfQorCitzdGF0aWMgaW50IGJpbmRlcl9mcmVlX3RocmVhZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpzZW5kX3JlcGx5ID0gTlVMTDsKKwlpbnQgYWN0aXZlX3RyYW5zYWN0aW9ucyA9IDA7CisKKwlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7CisJdCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJaWYgKHQgJiYgdC0+dG9fdGhyZWFkID09IHRocmVhZCkKKwkJc2VuZF9yZXBseSA9IHQ7CisJd2hpbGUgKHQpIHsKKwkJYWN0aXZlX3RyYW5zYWN0aW9ucysrOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogcmVsZWFzZSAlZDolZCB0cmFuc2FjdGlvbiAlZCAlcywgc3RpbGwgYWN0aXZlXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLCAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgPyAiaW4iIDogIm91dCIpOworCQlpZiAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgeworCQkJdC0+dG9fcHJvYyA9IE5VTEw7CisJCQl0LT50b190aHJlYWQgPSBOVUxMOworCQkJaWYgKHQtPmJ1ZmZlcikgeworCQkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJCXQtPmJ1ZmZlciA9IE5VTEw7CisJCQl9CisJCQl0ID0gdC0+dG9fcGFyZW50OworCQl9IGVsc2UgaWYgKHQtPmZyb20gPT0gdGhyZWFkKSB7CisJCQl0LT5mcm9tID0gTlVMTDsKKwkJCXQgPSB0LT5mcm9tX3BhcmVudDsKKwkJfSBlbHNlCisJCQlCVUcoKTsKKwl9CisJaWYgKHNlbmRfcmVwbHkpCisJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShzZW5kX3JlcGx5LCBCUl9ERUFEX1JFUExZKTsKKwliaW5kZXJfcmVsZWFzZV93b3JrKCZ0aHJlYWQtPnRvZG8pOworCWtmcmVlKHRocmVhZCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RIUkVBRF0rKzsKKwlyZXR1cm4gYWN0aXZlX3RyYW5zYWN0aW9uczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiaW5kZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKKwlpbnQgd2FpdF9mb3JfcHJvY193b3JrOworCisJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCXRocmVhZCA9IGJpbmRlcl9nZXRfdGhyZWFkKHByb2MpOworCisJd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmCisJCWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgJiYgdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0s7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7CisJCWlmIChiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQorCQkJcmV0dXJuIFBPTExJTjsKKwkJcG9sbF93YWl0KGZpbHAsICZwcm9jLT53YWl0LCB3YWl0KTsKKwkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCX0gZWxzZSB7CisJCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCQlwb2xsX3dhaXQoZmlscCwgJnRocmVhZC0+d2FpdCwgd2FpdCk7CisJCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgYmluZGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkOworCXVuc2lnbmVkIGludCBzaXplID0gX0lPQ19TSVpFKGNtZCk7CisJdm9pZCBfX3VzZXIgKnVidWYgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9pb2N0bDogJWQ6JWQgJXggJWx4XG4iLCBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcpOyovCisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7CisJaWYgKHRocmVhZCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBCSU5ERVJfV1JJVEVfUkVBRDogeworCQlzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgYndyOworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYndyLCB1YnVmLCBzaXplb2YoYndyKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfUkVBRF9XUklURSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgd3JpdGUgJWxkIGF0ICUwOGx4LCByZWFkICVsZCBhdCAlMDhseFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfc2l6ZSwgYndyLndyaXRlX2J1ZmZlciwgYndyLnJlYWRfc2l6ZSwgYndyLnJlYWRfYnVmZmVyKTsKKwkJaWYgKGJ3ci53cml0ZV9zaXplID4gMCkgeworCQkJcmV0ID0gYmluZGVyX3RocmVhZF93cml0ZShwcm9jLCB0aHJlYWQsICh2b2lkIF9fdXNlciAqKWJ3ci53cml0ZV9idWZmZXIsIGJ3ci53cml0ZV9zaXplLCAmYndyLndyaXRlX2NvbnN1bWVkKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJYndyLnJlYWRfY29uc3VtZWQgPSAwOworCQkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCWlmIChid3IucmVhZF9zaXplID4gMCkgeworCQkJcmV0ID0gYmluZGVyX3RocmVhZF9yZWFkKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLnJlYWRfYnVmZmVyLCBid3IucmVhZF9zaXplLCAmYndyLnJlYWRfY29uc3VtZWQsIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJCWlmICghbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1JFQURfV1JJVEUpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIHdyb3RlICVsZCBvZiAlbGQsIHJlYWQgcmV0dXJuICVsZCBvZiAlbGRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX2NvbnN1bWVkLCBid3Iud3JpdGVfc2l6ZSwgYndyLnJlYWRfY29uc3VtZWQsIGJ3ci5yZWFkX3NpemUpOworCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFM6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcHJvYy0+bWF4X3RocmVhZHMsIHVidWYsIHNpemVvZihwcm9jLT5tYXhfdGhyZWFkcykpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSOgorCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgIT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IEJJTkRFUl9TRVRfQ09OVEVYVF9NR1IgYWxyZWFkeSBzZXRcbiIpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gLTEpIHsKKwkJCWlmIChiaW5kZXJfY29udGV4dF9tZ3JfdWlkICE9IGN1cnJlbnQtPmNyZWQtPmV1aWQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF8iCisJCQkJICAgICAgICJDT05URVhUX01HUiBiYWQgdWlkICVkICE9ICVkXG4iLAorCQkJCSAgICAgICBjdXJyZW50LT5jcmVkLT5ldWlkLAorCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3JfdWlkKTsKKwkJCQlyZXQgPSAtRVBFUk07CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0gZWxzZQorCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOworCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfd2Vha19yZWYgPSAxOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9USFJFQURfRVhJVDoKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGV4aXRcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCWJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOworCQl0aHJlYWQgPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9WRVJTSU9OOgorCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl92ZXJzaW9uKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChwdXRfdXNlcihCSU5ERVJfQ1VSUkVOVF9QUk9UT0NPTF9WRVJTSU9OLCAmKChzdHJ1Y3QgYmluZGVyX3ZlcnNpb24gKil1YnVmKS0+cHJvdG9jb2xfdmVyc2lvbikpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gMDsKK2VycjoKKwlpZiAodGhyZWFkKQorCQl0aHJlYWQtPmxvb3BlciAmPSB+QklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBpb2N0bCAleCAlbHggcmV0dXJuZWQgJWRcbiIsIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBjbWQsIGFyZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfdm1hX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgb3BlbiB2bSBhcmVhICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywgdm1hLT52bV9wYWdlX3Byb3QucGdwcm90KTsKKwlkdW1wX3N0YWNrKCk7Cit9CitzdGF0aWMgdm9pZCBiaW5kZXJfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkIGNsb3NlIHZtIGFyZWEgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QpOworCXByb2MtPnZtYSA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgYmluZGVyX3ZtX29wcyA9IHsKKwkub3BlbiA9IGJpbmRlcl92bWFfb3BlbiwKKwkuY2xvc2UgPSBiaW5kZXJfdm1hX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBiaW5kZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljb25zdCBjaGFyICpmYWlsdXJlX3N0cmluZzsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gU1pfNE0pCisJCXZtYS0+dm1fZW5kID0gdm1hLT52bV9zdGFydCArIFNaXzRNOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsIHZtYS0+dm1fcGFnZV9wcm90LnBncHJvdCk7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIEZPUkJJRERFTl9NTUFQX0ZMQUdTKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZmFpbHVyZV9zdHJpbmcgPSAiYmFkIHZtX2ZsYWdzIjsKKwkJZ290byBlcnJfYmFkX2FyZzsKKwl9CisJdm1hLT52bV9mbGFncyA9ICh2bWEtPnZtX2ZsYWdzIHwgVk1fRE9OVENPUFkpICYgflZNX01BWVdSSVRFOworCisJYXJlYSA9IGdldF92bV9hcmVhKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgVk1fSU9SRU1BUCk7CisJaWYgKGFyZWEgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJnZXRfdm1fYXJlYSI7CisJCWdvdG8gZXJyX2dldF92bV9hcmVhX2ZhaWxlZDsKKwl9CisJcHJvYy0+YnVmZmVyID0gYXJlYS0+YWRkcjsKKwlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQgPSB2bWEtPnZtX3N0YXJ0IC0gKHNpemVfdClwcm9jLT5idWZmZXI7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQKKwlpZiAoY2FjaGVfaXNfdmlwdF9hbGlhc2luZygpKSB7CisJCXdoaWxlIChDQUNIRV9DT0xPVVIoKHZtYS0+dm1fc3RhcnQgXiAodWludDMyX3QpcHJvYy0+YnVmZmVyKSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXAgYmFkIGFsaWdubWVudFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcHJvYy0+YnVmZmVyKTsKKwkJCXZtYS0+dm1fc3RhcnQgKz0gUEFHRV9TSVpFOworCQl9CisJfQorI2VuZGlmCisJcHJvYy0+cGFnZXMgPSBremFsbG9jKHNpemVvZihwcm9jLT5wYWdlc1swXSkgKiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBQQUdFX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYy0+cGFnZXMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBwYWdlIGFycmF5IjsKKwkJZ290byBlcnJfYWxsb2NfcGFnZXNfZmFpbGVkOworCX0KKwlwcm9jLT5idWZmZXJfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCXZtYS0+dm1fb3BzID0gJmJpbmRlcl92bV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBwcm9jOworCisJaWYgKGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAxLCBwcm9jLT5idWZmZXIsIHByb2MtPmJ1ZmZlciArIFBBR0VfU0laRSwgdm1hKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlmYWlsdXJlX3N0cmluZyA9ICJhbGxvYyBzbWFsbCBidWYiOworCQlnb3RvIGVycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOworCX0KKwlidWZmZXIgPSBwcm9jLT5idWZmZXI7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPmJ1ZmZlcnMpOworCWxpc3RfYWRkKCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycyk7CisJYnVmZmVyLT5mcmVlID0gMTsKKwliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7CisJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSA9IHByb2MtPmJ1ZmZlcl9zaXplIC8gMjsKKwliYXJyaWVyKCk7CisJcHJvYy0+dm1hID0gdm1hOworCisJLypwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfbW1hcDogJWQgJWx4LSVseCBtYXBzICVwXG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOyovCisJcmV0dXJuIDA7CisKK2Vycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOgorCWtmcmVlKHByb2MtPnBhZ2VzKTsKK2Vycl9hbGxvY19wYWdlc19mYWlsZWQ6CisJdmZyZWUocHJvYy0+YnVmZmVyKTsKK2Vycl9nZXRfdm1fYXJlYV9mYWlsZWQ6CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CitlcnJfYmFkX2FyZzoKKwlwcmludGsoS0VSTl9FUlIgImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICVzIGZhaWxlZCAlZFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgZmFpbHVyZV9zdHJpbmcsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiaW5kZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfb3BlbjogJWQ6JWRcbiIsIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOworCisJcHJvYyA9IGt6YWxsb2Moc2l6ZW9mKCpwcm9jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByb2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOworCXByb2MtPnRzayA9IGN1cnJlbnQ7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPnRvZG8pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByb2MtPndhaXQpOworCXByb2MtPmRlZmF1bHRfcHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7CisJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9QUk9DXSsrOworCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5wcm9jX25vZGUsICZiaW5kZXJfcHJvY3MpOworCXByb2MtPnBpZCA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkOworCUlOSVRfTElTVF9IRUFEKCZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByb2M7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpIHsKKwkJY2hhciBzdHJidWZbMTFdOworCQlzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLCAiJXUiLCBwcm9jLT5waWQpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KHN0cmJ1ZiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MsIGJpbmRlcl9yZWFkX3Byb2NfcHJvYywgcHJvYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgd2FrZV9jb3VudCA9IDA7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSk7CisJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk47CisJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORykgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0aHJlYWQtPndhaXQpOworCQkJd2FrZV9jb3VudCsrOworCQl9CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJnByb2MtPndhaXQpOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9mbHVzaDogJWQgd29rZSAlZCB0aHJlYWRzXG4iLCBwcm9jLT5waWQsIHdha2VfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICpub2RwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB0aHJlYWRzLCBub2RlcywgaW5jb21pbmdfcmVmcywgb3V0Z29pbmdfcmVmcywgYnVmZmVycywgYWN0aXZlX3RyYW5zYWN0aW9ucywgcGFnZV9jb3VudDsKKworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYykgeworCQljaGFyIHN0cmJ1ZlsxMV07CisJCXNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksICIldSIsIHByb2MtPnBpZCk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHN0cmJ1ZiwgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Byb2MpOworCX0KKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJaGxpc3RfZGVsKCZwcm9jLT5wcm9jX25vZGUpOworCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAmJiBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+cHJvYyA9PSBwcm9jKSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9yZWxlYXNlOiAlZCBjb250ZXh0X21ncl9ub2RlIGdvbmVcbiIsIHByb2MtPnBpZCk7CisJCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gTlVMTDsKKwl9CisKKwl0aHJlYWRzID0gMDsKKwlhY3RpdmVfdHJhbnNhY3Rpb25zID0gMDsKKwl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcykpKSB7CisJCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSk7CisJCXRocmVhZHMrKzsKKwkJYWN0aXZlX3RyYW5zYWN0aW9ucyArPSBiaW5kZXJfZnJlZV90aHJlYWQocHJvYywgdGhyZWFkKTsKKwl9CisJbm9kZXMgPSAwOworCWluY29taW5nX3JlZnMgPSAwOworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2RlcykpKSB7CisJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJbm9kZXMrKzsKKwkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZwcm9jLT5ub2Rlcyk7CisJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOworCQlpZiAoaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKSB7CisJCQlrZnJlZShub2RlKTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9OT0RFXSsrOworCQl9IGVsc2UgeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCWludCBkZWF0aCA9IDA7CisKKwkJCW5vZGUtPnByb2MgPSBOVUxMOworCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMgPSAwOworCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzID0gMDsKKwkJCWhsaXN0X2FkZF9oZWFkKCZub2RlLT5kZWFkX25vZGUsICZiaW5kZXJfZGVhZF9ub2Rlcyk7CisKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkgeworCQkJCWluY29taW5nX3JlZnMrKzsKKwkJCQlpZiAocmVmLT5kZWF0aCkgeworCQkJCQlkZWF0aCsrOworCQkJCQlpZiAobGlzdF9lbXB0eSgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSkpIHsKKwkJCQkJCXJlZi0+ZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSOworCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnJlZi0+cHJvYy0+dG9kbyk7CisJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlZi0+cHJvYy0+d2FpdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJQlVHKCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogbm9kZSAlZCBub3cgZGVhZCwgcmVmcyAlZCwgZGVhdGggJWRcbiIsIG5vZGUtPmRlYnVnX2lkLCBpbmNvbWluZ19yZWZzLCBkZWF0aCk7CisJCX0KKwl9CisJb3V0Z29pbmdfcmVmcyA9IDA7CisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYykpKSB7CisJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKwkJb3V0Z29pbmdfcmVmcysrOworCQliaW5kZXJfZGVsZXRlX3JlZihyZWYpOworCX0KKwliaW5kZXJfcmVsZWFzZV93b3JrKCZwcm9jLT50b2RvKTsKKwlidWZmZXJzID0gMDsKKworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycykpKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCXQgPSBidWZmZXItPnRyYW5zYWN0aW9uOworCQlpZiAodCkgeworCQkJdC0+YnVmZmVyID0gTlVMTDsKKwkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHJlbGVhc2UgcHJvYyAlZCwgdHJhbnNhY3Rpb24gJWQsIG5vdCBmcmVlZFxuIiwgcHJvYy0+cGlkLCB0LT5kZWJ1Z19pZCk7CisJCQkvKkJVRygpOyovCisJCX0KKwkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7CisJCWJ1ZmZlcnMrKzsKKwl9CisKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfUFJPQ10rKzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCXBhZ2VfY291bnQgPSAwOworCWlmIChwcm9jLT5wYWdlcykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHByb2MtPmJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChwcm9jLT5wYWdlc1tpXSkgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9yZWxlYXNlOiAlZDogcGFnZSAlZCBhdCAlcCBub3QgZnJlZWRcbiIsIHByb2MtPnBpZCwgaSwgcHJvYy0+YnVmZmVyICsgaSAqIFBBR0VfU0laRSk7CisJCQkJX19mcmVlX3BhZ2UocHJvYy0+cGFnZXNbaV0pOworCQkJCXBhZ2VfY291bnQrKzsKKwkJCX0KKwkJfQorCQlrZnJlZShwcm9jLT5wYWdlcyk7CisJCXZmcmVlKHByb2MtPmJ1ZmZlcik7CisJfQorCisJcHV0X3Rhc2tfc3RydWN0KHByb2MtPnRzayk7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkIHRocmVhZHMgJWQsIG5vZGVzICVkIChyZWYgJWQpLCByZWZzICVkLCBhY3RpdmUgdHJhbnNhY3Rpb25zICVkLCBidWZmZXJzICVkLCBwYWdlcyAlZFxuIiwKKwkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkcywgbm9kZXMsIGluY29taW5nX3JlZnMsIG91dGdvaW5nX3JlZnMsIGFjdGl2ZV90cmFuc2FjdGlvbnMsIGJ1ZmZlcnMsIHBhZ2VfY291bnQpOworCisJa2ZyZWUocHJvYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdHJhbnNhY3Rpb24oY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKK3sKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyAlZDogJXAgZnJvbSAlZDolZCB0byAlZDolZCBjb2RlICV4IGZsYWdzICV4IHByaSAlbGQgciVkIiwKKwkJCXByZWZpeCwgdC0+ZGVidWdfaWQsIHQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAorCQkJdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsCisJCQl0LT50b19wcm9jID8gdC0+dG9fcHJvYy0+cGlkIDogMCwKKwkJCXQtPnRvX3RocmVhZCA/IHQtPnRvX3RocmVhZC0+cGlkIDogMCwKKwkJCXQtPmNvZGUsIHQtPmZsYWdzLCB0LT5wcmlvcml0eSwgdC0+bmVlZF9yZXBseSk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJaWYgKHQtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBidWZmZXIgZnJlZVxuIik7CisJCXJldHVybiBidWY7CisJfQorCWlmICh0LT5idWZmZXItPnRhcmdldF9ub2RlKSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBub2RlICVkIiwKKwkJCQl0LT5idWZmZXItPnRhcmdldF9ub2RlLT5kZWJ1Z19pZCk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIHNpemUgJXpkOiV6ZCBkYXRhICVwXG4iLAorCQkJdC0+YnVmZmVyLT5kYXRhX3NpemUsIHQtPmJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJdC0+YnVmZmVyLT5kYXRhKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX2J1ZmZlcihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzICVkOiAlcCBzaXplICV6ZDolemQgJXNcbiIsCisJCQlwcmVmaXgsIGJ1ZmZlci0+ZGVidWdfaWQsIGJ1ZmZlci0+ZGF0YSwKKwkJCWJ1ZmZlci0+ZGF0YV9zaXplLCBidWZmZXItPm9mZnNldHNfc2l6ZSwKKwkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPyAiYWN0aXZlIiA6ICJkZWxpdmVyZWQiKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3dvcmsoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwljb25zdCBjaGFyICp0cmFuc2FjdGlvbl9wcmVmaXgsIHN0cnVjdCBiaW5kZXJfd29yayAqdykKK3sKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKworCXN3aXRjaCAody0+dHlwZSkgeworCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046CisJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgdHJhbnNhY3Rpb25fcHJlZml4LCB0KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURToKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc3RyYW5zYWN0aW9uIGNvbXBsZXRlXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX05PREU6CisJCW5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXNub2RlIHdvcmsgJWQ6IHUlcCBjJXBcbiIsCisJCQkJcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSOgorCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc2hhcyBkZWFkIGJpbmRlclxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUl9BTkRfQ0xFQVI6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKKwkJCQkiJXNoYXMgY2xlYXJlZCBkZWFkIGJpbmRlclxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJY2FzZSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKKwkJCQkiJXNoYXMgY2xlYXJlZCBkZWF0aCBub3RpZmljYXRpb25cbiIsIHByZWZpeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzdW5rbm93biB3b3JrOiB0eXBlICVkXG4iLAorCQkJCXByZWZpeCwgdy0+dHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3RocmVhZChjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwgaW50IHByaW50X2Fsd2F5cykKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwljaGFyICpzdGFydF9idWYgPSBidWY7CisJY2hhciAqaGVhZGVyX2J1ZjsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgdGhyZWFkICVkOiBsICUwMnhcbiIsIHRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7CisJaGVhZGVyX2J1ZiA9IGJ1ZjsKKwl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwl3aGlsZSAodCkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBvdXRnb2luZyB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IHQtPmZyb21fcGFyZW50OworCQl9IGVsc2UgaWYgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBpbmNvbWluZyB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IHQtPnRvX3BhcmVudDsKKwkJfSBlbHNlIHsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgIiAgICBiYWQgdHJhbnNhY3Rpb24iLCB0KTsKKwkJCXQgPSBOVUxMOworCQl9CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnRocmVhZC0+dG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKKwkJCQkJIiAgICBwZW5kaW5nIHRyYW5zYWN0aW9uIiwgdyk7CisJfQorCWlmICghcHJpbnRfYWx3YXlzICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQorCQlidWYgPSBzdGFydF9idWY7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9ub2RlKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwlpbnQgY291bnQ7CisJY291bnQgPSAwOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkKKwkJY291bnQrKzsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgbm9kZSAlZDogdSVwIGMlcCBocyAlZCBodyAlZCBscyAlZCBsdyAlZCBpcyAlZCBpdyAlZCIsCisJCQlub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUsCisJCQlub2RlLT5oYXNfc3Ryb25nX3JlZiwgbm9kZS0+aGFzX3dlYWtfcmVmLAorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcywKKwkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJaWYgKGNvdW50KSB7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBwcm9jIik7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7CisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgJWQiLCByZWYtPnByb2MtPnBpZCk7CisJCQlpZiAoYnVmID49IGVuZCkKKwkJCQlyZXR1cm4gYnVmOworCQl9CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIlxuIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmbm9kZS0+YXN5bmNfdG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKKwkJCQkJIiAgICBwZW5kaW5nIGFzeW5jIHRyYW5zYWN0aW9uIiwgdyk7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfcmVmKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmICVkOiBkZXNjICVkICVzbm9kZSAlZCBzICVkIHcgJWQgZCAlcFxuIiwKKwkJCXJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgcmVmLT5ub2RlLT5wcm9jID8gIiIgOiAiZGVhZCAiLAorCQkJcmVmLT5ub2RlLT5kZWJ1Z19pZCwgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5kZWF0aCk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBwcmludF9hbGwpCit7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCXN0cnVjdCByYl9ub2RlICpuOworCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKKwljaGFyICpoZWFkZXJfYnVmOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAicHJvYyAlZFxuIiwgcHJvYy0+cGlkKTsKKwloZWFkZXJfYnVmID0gYnVmOworCisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RocmVhZChidWYsIGVuZCwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpLCBwcmludF9hbGwpOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisJCWlmIChwcmludF9hbGwgfHwgbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKQorCQkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOworCX0KKwlpZiAocHJpbnRfYWxsKSB7CisJCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl9yZWYoYnVmLCBlbmQsIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpKTsKKwl9CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsgbiA9IHJiX25leHQobikpCisJCWJ1ZiA9IHByaW50X2JpbmRlcl9idWZmZXIoYnVmLCBlbmQsICIgIGJ1ZmZlciIsIHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+dG9kbywgZW50cnkpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICIsCisJCQkJCSIgIHBlbmRpbmcgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIGhhcyBkZWxpdmVyZWQgZGVhZCBiaW5kZXJcbiIpOworCQlicmVhazsKKwl9CisJaWYgKCFwcmludF9hbGwgJiYgYnVmID09IGhlYWRlcl9idWYpCisJCWJ1ZiA9IHN0YXJ0X2J1ZjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX3JldHVybl9zdHJpbmdzW10gPSB7CisJIkJSX0VSUk9SIiwKKwkiQlJfT0siLAorCSJCUl9UUkFOU0FDVElPTiIsCisJIkJSX1JFUExZIiwKKwkiQlJfQUNRVUlSRV9SRVNVTFQiLAorCSJCUl9ERUFEX1JFUExZIiwKKwkiQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUiLAorCSJCUl9JTkNSRUZTIiwKKwkiQlJfQUNRVUlSRSIsCisJIkJSX1JFTEVBU0UiLAorCSJCUl9ERUNSRUZTIiwKKwkiQlJfQVRURU1QVF9BQ1FVSVJFIiwKKwkiQlJfTk9PUCIsCisJIkJSX1NQQVdOX0xPT1BFUiIsCisJIkJSX0ZJTklTSEVEIiwKKwkiQlJfREVBRF9CSU5ERVIiLAorCSJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCisJIkJSX0ZBSUxFRF9SRVBMWSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfY29tbWFuZF9zdHJpbmdzW10gPSB7CisJIkJDX1RSQU5TQUNUSU9OIiwKKwkiQkNfUkVQTFkiLAorCSJCQ19BQ1FVSVJFX1JFU1VMVCIsCisJIkJDX0ZSRUVfQlVGRkVSIiwKKwkiQkNfSU5DUkVGUyIsCisJIkJDX0FDUVVJUkUiLAorCSJCQ19SRUxFQVNFIiwKKwkiQkNfREVDUkVGUyIsCisJIkJDX0lOQ1JFRlNfRE9ORSIsCisJIkJDX0FDUVVJUkVfRE9ORSIsCisJIkJDX0FUVEVNUFRfQUNRVUlSRSIsCisJIkJDX1JFR0lTVEVSX0xPT1BFUiIsCisJIkJDX0VOVEVSX0xPT1BFUiIsCisJIkJDX0VYSVRfTE9PUEVSIiwKKwkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iLAorCSJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAorCSJCQ19ERUFEX0JJTkRFUl9ET05FIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9vYmpzdGF0X3N0cmluZ3NbXSA9IHsKKwkicHJvYyIsCisJInRocmVhZCIsCisJIm5vZGUiLAorCSJyZWYiLAorCSJkZWF0aCIsCisJInRyYW5zYWN0aW9uIiwKKwkidHJhbnNhY3Rpb25fY29tcGxldGUiCit9OworCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBiaW5kZXJfc3RhdHMgKnN0YXRzKQoreworCWludCBpOworCisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJjKSAhPSBBUlJBWV9TSVpFKGJpbmRlcl9jb21tYW5kX3N0cmluZ3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YmMpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5iY1tpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCisJCQkJCWJpbmRlcl9jb21tYW5kX3N0cmluZ3NbaV0sIHN0YXRzLT5iY1tpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YnIpICE9IEFSUkFZX1NJWkUoYmluZGVyX3JldHVybl9zdHJpbmdzKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPmJyKTsgaSsrKSB7CisJCWlmIChzdGF0cy0+YnJbaV0pCisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiAlZFxuIiwgcHJlZml4LAorCQkJCQliaW5kZXJfcmV0dXJuX3N0cmluZ3NbaV0sIHN0YXRzLT5icltpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+b2JqX2NyZWF0ZWQpICE9IEFSUkFZX1NJWkUoYmluZGVyX29ianN0YXRfc3RyaW5ncykpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0gQVJSQVlfU0laRShzdGF0cy0+b2JqX2RlbGV0ZWQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+b2JqX2NyZWF0ZWQpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5vYmpfY3JlYXRlZFtpXSB8fCBzdGF0cy0+b2JqX2RlbGV0ZWRbaV0pCisJCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiBhY3RpdmUgJWQgdG90YWwgJWRcbiIsIHByZWZpeCwKKwkJCQkJYmluZGVyX29ianN0YXRfc3RyaW5nc1tpXSwKKwkJCQkJc3RhdHMtPm9ial9jcmVhdGVkW2ldIC0gc3RhdHMtPm9ial9kZWxldGVkW2ldLAorCQkJCQlzdGF0cy0+b2JqX2NyZWF0ZWRbaV0pOworCQlpZiAoYnVmID49IGVuZCkKKwkJCXJldHVybiBidWY7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfcHJvY19zdGF0cyhjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQoreworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlpbnQgY291bnQsIHN0cm9uZywgd2VhazsKKworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgInByb2MgJWRcbiIsIHByb2MtPnBpZCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKKwkJY291bnQrKzsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHRocmVhZHM6ICVkXG4iLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZXF1ZXN0ZWQgdGhyZWFkczogJWQrJWQvJWRcbiIKKwkJCSIgIHJlYWR5IHRocmVhZHMgJWRcbiIKKwkJCSIgIGZyZWUgYXN5bmMgc3BhY2UgJXpkXG4iLCBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcywKKwkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQsIHByb2MtPm1heF90aHJlYWRzLAorCQkJcHJvYy0+cmVhZHlfdGhyZWFkcywgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCisJCWNvdW50Kys7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJc3Ryb25nID0gMDsKKwl3ZWFrID0gMDsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkgeworCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7CisJCWNvdW50Kys7CisJCXN0cm9uZyArPSByZWYtPnN0cm9uZzsKKwkJd2VhayArPSByZWYtPndlYWs7CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmczogJWQgcyAlZCB3ICVkXG4iLCBjb3VudCwgc3Ryb25nLCB3ZWFrKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWNvdW50ID0gMDsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQorCQljb3VudCsrOworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgYnVmZmVyczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWNvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgeworCQlzd2l0Y2ggKHctPnR5cGUpIHsKKwkJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKKwkJCWNvdW50Kys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcGVuZGluZyB0cmFuc2FjdGlvbnM6ICVkXG4iLCBjb3VudCk7CisJaWYgKGJ1ZiA+PSBlbmQpCisJCXJldHVybiBidWY7CisKKwlidWYgPSBwcmludF9iaW5kZXJfc3RhdHMoYnVmLCBlbmQsICIgICIsICZwcm9jLT5zdGF0cyk7CisKKwlyZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0ZSgKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CisJaW50IGxlbiA9IDA7CisJY2hhciAqYnVmID0gcGFnZTsKKwljaGFyICplbmQgPSBwYWdlICsgUEFHRV9TSVpFOworCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOworCisJaWYgKG9mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiYmluZGVyIHN0YXRlOlxuIik7CisKKwlpZiAoIWhsaXN0X2VtcHR5KCZiaW5kZXJfZGVhZF9ub2RlcykpCisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgImRlYWQgbm9kZXM6XG4iKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCBwb3MsICZiaW5kZXJfZGVhZF9ub2RlcywgZGVhZF9ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9ub2RlKGJ1ZiwgZW5kLCBub2RlKTsKKwl9CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfcHJvYyhidWYsIGVuZCwgcHJvYywgMSk7CisJfQorCWlmIChkb19sb2NrKQorCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKwlpZiAoYnVmID4gcGFnZSArIFBBR0VfU0laRSkKKwkJYnVmID0gcGFnZSArIFBBR0VfU0laRTsKKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBidWYgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2Nfc3RhdHMoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJaW50IGxlbiA9IDA7CisJY2hhciAqcCA9IHBhZ2U7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBzdGF0czpcbiIpOworCisJcCA9IHByaW50X2JpbmRlcl9zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCAiIiwgJmJpbmRlcl9zdGF0cyk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgeworCQlpZiAocCA+PSBwYWdlICsgUEFHRV9TSVpFKQorCQkJYnJlYWs7CisJCXAgPSBwcmludF9iaW5kZXJfcHJvY19zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKKwkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJbGVuID0gcCAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJaW50IGxlbiA9IDA7CisJY2hhciAqYnVmID0gcGFnZTsKKwljaGFyICplbmQgPSBwYWdlICsgUEFHRV9TSVpFOworCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOworCisJaWYgKG9mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiYmluZGVyIHRyYW5zYWN0aW9uczpcbiIpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAwKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOworCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19wcm9jKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGRhdGE7CisJaW50IGxlbiA9IDA7CisJY2hhciAqcCA9IHBhZ2U7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJcCArPSBzbnByaW50ZihwLCBQQUdFX1NJWkUsICJiaW5kZXIgcHJvYyBzdGF0ZTpcbiIpOworCXAgPSBwcmludF9iaW5kZXJfcHJvYyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jLCAxKTsKKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAocCA+IHBhZ2UgKyBQQUdFX1NJWkUpCisJCXAgPSBwYWdlICsgUEFHRV9TSVpFOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBwIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplKQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVkOiAlcyBmcm9tICVkOiVkIHRvICVkOiVkIG5vZGUgJWQgaGFuZGxlICVkIHNpemUgJWQ6JWRcbiIsCisJCQllLT5kZWJ1Z19pZCwgKGUtPmNhbGxfdHlwZSA9PSAyKSA/ICJyZXBseSIgOgorCQkJKChlLT5jYWxsX3R5cGUgPT0gMSkgPyAiYXN5bmMiIDogImNhbGwgIiksIGUtPmZyb21fcHJvYywKKwkJCWUtPmZyb21fdGhyZWFkLCBlLT50b19wcm9jLCBlLT50b190aHJlYWQsIGUtPnRvX25vZGUsCisJCQllLT50YXJnZXRfaGFuZGxlLCBlLT5kYXRhX3NpemUsIGUtPm9mZnNldHNfc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nID0gZGF0YTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaTsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChsb2ctPmZ1bGwpIHsKKwkJZm9yIChpID0gbG9nLT5uZXh0OyBpIDwgQVJSQVlfU0laRShsb2ctPmVudHJ5KTsgaSsrKSB7CisJCQlpZiAoYnVmID49IGVuZCkKKwkJCQlicmVhazsKKwkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoYnVmLCBlbmQsICZsb2ctPmVudHJ5W2ldKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgbG9nLT5uZXh0OyBpKyspIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwgJmxvZy0+ZW50cnlbaV0pOworCX0KKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBidWYgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5kZXJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucG9sbCA9IGJpbmRlcl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKKwkubW1hcCA9IGJpbmRlcl9tbWFwLAorCS5vcGVuID0gYmluZGVyX29wZW4sCisJLmZsdXNoID0gYmluZGVyX2ZsdXNoLAorCS5yZWxlYXNlID0gYmluZGVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYmluZGVyX21pc2NkZXYgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gImJpbmRlciIsCisJLmZvcHMgPSAmYmluZGVyX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJpbmRlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290ID0gcHJvY19ta2RpcigiYmluZGVyIiwgTlVMTCk7CisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KQorCQliaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyA9IHByb2NfbWtkaXIoInByb2MiLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCk7CisJcmV0ID0gbWlzY19yZWdpc3RlcigmYmluZGVyX21pc2NkZXYpOworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCkgeworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0ZSIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRlLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMiLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwgYmluZGVyX3JlYWRfcHJvY19zdGF0cywgTlVMTCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9ucyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucywgTlVMTCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYW5zYWN0aW9uX2xvZyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZywgJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmYWlsZWRfdHJhbnNhY3Rpb25fbG9nIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nLCAmYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19mYWlsZWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitkZXZpY2VfaW5pdGNhbGwoYmluZGVyX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2FlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqCisgKiBCYXNlZCBvbiwgYnV0IG5vIGxvbmdlciBjb21wYXRpYmxlIHdpdGgsIHRoZSBvcmlnaW5hbAorICogT3BlbkJpbmRlci5vcmcgYmluZGVyIGRyaXZlciBpbnRlcmZhY2UsIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBQYWxtc291cmNlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfQklOREVSX0gKKyNkZWZpbmUgX0xJTlVYX0JJTkRFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEJfUEFDS19DSEFSUyhjMSwgYzIsIGMzLCBjNCkgXAorCSgoKChjMSk8PDI0KSkgfCAoKChjMik8PDE2KSkgfCAoKChjMyk8PDgpKSB8IChjNCkpCisjZGVmaW5lIEJfVFlQRV9MQVJHRSAweDg1CisKK2VudW0geworCUJJTkRFUl9UWVBFX0JJTkRFUgk9IEJfUEFDS19DSEFSUygncycsICdiJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX1dFQUtfQklOREVSCT0gQl9QQUNLX0NIQVJTKCd3JywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfSEFORExFCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2gnLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9GRAkJPSBCX1BBQ0tfQ0hBUlMoJ2YnLCAnZCcsICcqJywgQl9UWVBFX0xBUkdFKSwKK307CisKK2VudW0geworCUZMQVRfQklOREVSX0ZMQUdfUFJJT1JJVFlfTUFTSyA9IDB4ZmYsCisJRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUyA9IDB4MTAwLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBvZiBhIEJpbmRlciBvYmplY3QgZm9yIHRyYW5zZmVyCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4gIFRoZSAnb2Zmc2V0cycgc3VwcGxpZWQgYXMgcGFydCBvZiBhIGJpbmRlciB0cmFuc2FjdGlvbgorICogY29udGFpbnMgb2Zmc2V0cyBpbnRvIHRoZSBkYXRhIHdoZXJlIHRoZXNlIHN0cnVjdHVyZXMgb2NjdXIuICBUaGUgQmluZGVyCisgKiBkcml2ZXIgdGFrZXMgY2FyZSBvZiByZS13cml0aW5nIHRoZSBzdHJ1Y3R1cmUgdHlwZSBhbmQgZGF0YSBhcyBpdCBtb3ZlcworICogYmV0d2VlbiBwcm9jZXNzZXMuCisgKi8KK3N0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgeworCS8qIDggYnl0ZXMgZm9yIGxhcmdlX2ZsYXRfaGVhZGVyLiAqLworCXVuc2lnbmVkIGxvbmcJCXR5cGU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkvKiA4IGJ5dGVzIG9mIGRhdGEuICovCisJdW5pb24geworCQl2b2lkCQkqYmluZGVyOwkvKiBsb2NhbCBvYmplY3QgKi8KKwkJc2lnbmVkIGxvbmcJaGFuZGxlOwkJLyogcmVtb3RlIG9iamVjdCAqLworCX07CisKKwkvKiBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBsb2NhbCBvYmplY3QgKi8KKwl2b2lkCQkJKmNvb2tpZTsKK307CisKKy8qCisgKiBPbiA2NC1iaXQgcGxhdGZvcm1zIHdoZXJlIHVzZXIgY29kZSBtYXkgcnVuIGluIDMyLWJpdHMgdGhlIGRyaXZlciBtdXN0CisgKiB0cmFuc2xhdGUgdGhlIGJ1ZmZlciAoYW5kIGxvY2FsIGJpbmRlcikgYWRkcmVzc2VzIGFwcm9wcmlhdGVseS4KKyAqLworCitzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgeworCXNpZ25lZCBsb25nCXdyaXRlX3NpemU7CS8qIGJ5dGVzIHRvIHdyaXRlICovCisJc2lnbmVkIGxvbmcJd3JpdGVfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLworCXVuc2lnbmVkIGxvbmcJd3JpdGVfYnVmZmVyOworCXNpZ25lZCBsb25nCXJlYWRfc2l6ZTsJLyogYnl0ZXMgdG8gcmVhZCAqLworCXNpZ25lZCBsb25nCXJlYWRfY29uc3VtZWQ7CS8qIGJ5dGVzIGNvbnN1bWVkIGJ5IGRyaXZlciAqLworCXVuc2lnbmVkIGxvbmcJcmVhZF9idWZmZXI7Cit9OworCisvKiBVc2Ugd2l0aCBCSU5ERVJfVkVSU0lPTiwgZHJpdmVyIGZpbGxzIGluIGZpZWxkcy4gKi8KK3N0cnVjdCBiaW5kZXJfdmVyc2lvbiB7CisJLyogZHJpdmVyIHByb3RvY29sIHZlcnNpb24gLS0gaW5jcmVtZW50IHdpdGggaW5jb21wYXRpYmxlIGNoYW5nZSAqLworCXNpZ25lZCBsb25nCXByb3RvY29sX3ZlcnNpb247Cit9OworCisvKiBUaGlzIGlzIHRoZSBjdXJyZW50IHByb3RvY29sIHZlcnNpb24uICovCisjZGVmaW5lIEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04gNworCisjZGVmaW5lIEJJTkRFUl9XUklURV9SRUFEICAgCQlfSU9XUignYicsIDEsIHN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCkKKyNkZWZpbmUJQklOREVSX1NFVF9JRExFX1RJTUVPVVQJCV9JT1coJ2InLCAzLCBpbnQ2NF90KQorI2RlZmluZQlCSU5ERVJfU0VUX01BWF9USFJFQURTCQlfSU9XKCdiJywgNSwgc2l6ZV90KQorI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfUFJJT1JJVFkJX0lPVygnYicsIDYsIGludCkKKyNkZWZpbmUJQklOREVSX1NFVF9DT05URVhUX01HUgkJX0lPVygnYicsIDcsIGludCkKKyNkZWZpbmUJQklOREVSX1RIUkVBRF9FWElUCQlfSU9XKCdiJywgOCwgaW50KQorI2RlZmluZSBCSU5ERVJfVkVSU0lPTgkJCV9JT1dSKCdiJywgOSwgc3RydWN0IGJpbmRlcl92ZXJzaW9uKQorCisvKgorICogTk9URTogVHdvIHNwZWNpYWwgZXJyb3IgY29kZXMgeW91IHNob3VsZCBjaGVjayBmb3Igd2hlbiBjYWxsaW5nCisgKiBpbiB0byB0aGUgZHJpdmVyIGFyZToKKyAqCisgKiBFSU5UUiAtLSBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGludGVydXB0ZWQuICBUaGlzIHNob3VsZCBiZQorICogaGFuZGxlZCBieSByZXRyeWluZyB0aGUgaW9jdGwoKSB1bnRpbCBhIGRpZmZlcmVudCBlcnJvciBjb2RlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBFQ09OTlJFRlVTRUQgLS0gVGhlIGRyaXZlciBpcyBubyBsb25nZXIgYWNjZXB0aW5nIG9wZXJhdGlvbnMKKyAqIGZyb20geW91ciBwcm9jZXNzLiAgVGhhdCBpcywgdGhlIHByb2Nlc3MgaXMgYmVpbmcgZGVzdHJveWVkLgorICogWW91IHNob3VsZCBoYW5kbGUgdGhpcyBieSBleGl0aW5nIGZyb20geW91ciBwcm9jZXNzLiAgTm90ZQorICogdGhhdCBvbmNlIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCwgYWxsIGZ1cnRoZXIgY2FsbHMgdG8KKyAqIHRoZSBkcml2ZXIgZnJvbSBhbnkgdGhyZWFkIHdpbGwgcmV0dXJuIHRoaXMgc2FtZSBjb2RlLgorICovCisKK2VudW0gdHJhbnNhY3Rpb25fZmxhZ3MgeworCVRGX09ORV9XQVkJPSAweDAxLAkvKiB0aGlzIGlzIGEgb25lLXdheSBjYWxsOiBhc3luYywgbm8gcmV0dXJuICovCisJVEZfUk9PVF9PQkpFQ1QJPSAweDA0LAkvKiBjb250ZW50cyBhcmUgdGhlIGNvbXBvbmVudCdzIHJvb3Qgb2JqZWN0ICovCisJVEZfU1RBVFVTX0NPREUJPSAweDA4LAkvKiBjb250ZW50cyBhcmUgYSAzMi1iaXQgc3RhdHVzIGNvZGUgKi8KKwlURl9BQ0NFUFRfRkRTCT0gMHgxMCwJLyogYWxsb3cgcmVwbGllcyB3aXRoIGZpbGUgZGVzY3JpcHRvcnMgKi8KK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB7CisJLyogVGhlIGZpcnN0IHR3byBhcmUgb25seSB1c2VkIGZvciBiY1RSQU5TQUNUSU9OIGFuZCBiclRSQU5TQUNUSU9OLAorCSAqIGlkZW50aWZ5aW5nIHRoZSB0YXJnZXQgYW5kIGNvbnRlbnRzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl1bmlvbiB7CisJCXNpemVfdAloYW5kbGU7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIGNvbW1hbmQgdHJhbnNhY3Rpb24gKi8KKwkJdm9pZAkqcHRyOwkvKiB0YXJnZXQgZGVzY3JpcHRvciBvZiByZXR1cm4gdHJhbnNhY3Rpb24gKi8KKwl9IHRhcmdldDsKKwl2b2lkCQkqY29va2llOwkvKiB0YXJnZXQgb2JqZWN0IGNvb2tpZSAqLworCXVuc2lnbmVkIGludAljb2RlOwkJLyogdHJhbnNhY3Rpb24gY29tbWFuZCAqLworCisJLyogR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNhY3Rpb24uICovCisJdW5zaWduZWQgaW50CWZsYWdzOworCXBpZF90CQlzZW5kZXJfcGlkOworCXVpZF90CQlzZW5kZXJfZXVpZDsKKwlzaXplX3QJCWRhdGFfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgKi8KKwlzaXplX3QJCW9mZnNldHNfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIG9mIG9mZnNldHMgKi8KKworCS8qIElmIHRoaXMgdHJhbnNhY3Rpb24gaXMgaW5saW5lLCB0aGUgZGF0YSBpbW1lZGlhdGVseQorCSAqIGZvbGxvd3MgaGVyZTsgb3RoZXJ3aXNlLCBpdCBlbmRzIHdpdGggYSBwb2ludGVyIHRvCisJICogdGhlIGRhdGEgYnVmZmVyLgorCSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIHRyYW5zYWN0aW9uIGRhdGEgKi8KKwkJCWNvbnN0IHZvaWQJKmJ1ZmZlcjsKKwkJCS8qIG9mZnNldHMgZnJvbSBidWZmZXIgdG8gZmxhdF9iaW5kZXJfb2JqZWN0IHN0cnVjdHMgKi8KKwkJCWNvbnN0IHZvaWQJKm9mZnNldHM7CisJCX0gcHRyOworCQl1aW50OF90CWJ1Zls4XTsKKwl9IGRhdGE7Cit9OworCitzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUgeworCXZvaWQgKnB0cjsKKwl2b2lkICpjb29raWU7Cit9OworCitzdHJ1Y3QgYmluZGVyX3ByaV9kZXNjIHsKKwlpbnQgcHJpb3JpdHk7CisJaW50IGRlc2M7Cit9OworCitzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llIHsKKwlpbnQgcHJpb3JpdHk7CisJdm9pZCAqcHRyOworCXZvaWQgKmNvb2tpZTsKK307CisKK2VudW0gQmluZGVyRHJpdmVyUmV0dXJuUHJvdG9jb2wgeworCUJSX0VSUk9SID0gX0lPUigncicsIDAsIGludCksCisJLyoKKwkgKiBpbnQ6IGVycm9yIGNvZGUKKwkgKi8KKworCUJSX09LID0gX0lPKCdyJywgMSksCisJLyogTm8gcGFyYW1ldGVycyEgKi8KKworCUJSX1RSQU5TQUNUSU9OID0gX0lPUigncicsIDIsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJQlJfUkVQTFkgPSBfSU9SKCdyJywgMywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwkvKgorCSAqIGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhOiB0aGUgcmVjZWl2ZWQgY29tbWFuZC4KKwkgKi8KKworCUJSX0FDUVVJUkVfUkVTVUxUID0gX0lPUigncicsIDQsIGludCksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogMCBpZiB0aGUgbGFzdCBiY0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB0aGUgcmVtb3RlIG9iamVjdCBoYXMgYWNxdWlyZWQgYSBwcmltYXJ5IHJlZmVyZW5jZS4KKwkgKi8KKworCUJSX0RFQURfUkVQTFkgPSBfSU8oJ3InLCA1KSwKKwkvKgorCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGxhc3QgdHJhbnNhY3Rpb24gKGVpdGhlciBhIGJjVFJBTlNBQ1RJT04gb3IKKwkgKiBhIGJjQVRURU1QVF9BQ1FVSVJFKSBpcyBubyBsb25nZXIgd2l0aCB1cy4gIE5vIHBhcmFtZXRlcnMuCisJICovCisKKwlCUl9UUkFOU0FDVElPTl9DT01QTEVURSA9IF9JTygncicsIDYpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4uLiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHJlcXVlc3RlZAorCSAqIChpbmNsdWRpbmcgcmVwbGllcykuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNlbnQgZXZlbiBmb3IKKwkgKiBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLgorCSAqLworCisJQlJfSU5DUkVGUyA9IF9JT1IoJ3InLCA3LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX0FDUVVJUkUgPSBfSU9SKCdyJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9SRUxFQVNFID0gX0lPUigncicsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfREVDUkVGUyA9IF9JT1IoJ3InLCAxMCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjoJcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1IoJ3InLCAxMSwgc3RydWN0IGJpbmRlcl9wcmlfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDoJcHJpb3JpdHkKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCUl9OT09QID0gX0lPKCdyJywgMTIpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIERvIG5vdGhpbmcgYW5kIGV4YW1pbmUgdGhlIG5leHQgY29tbWFuZC4gIEl0IGV4aXN0cworCSAqIHByaW1hcmlseSBzbyB0aGF0IHdlIGNhbiByZXBsYWNlIGl0IHdpdGggYSBCUl9TUEFXTl9MT09QRVIgY29tbWFuZC4KKwkgKi8KKworCUJSX1NQQVdOX0xPT1BFUiA9IF9JTygncicsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuICBUaGUgZHJpdmVyIGhhcyBkZXRlcm1pbmVkIHRoYXQgYSBwcm9jZXNzIGhhcyBubworCSAqIHRocmVhZHMgd2FpdGluZyB0byBzZXJ2aWNlIGluY29tbWluZyB0cmFuc2FjdGlvbnMuICBXaGVuIGEgcHJvY2VzcworCSAqIHJlY2VpdmVzIHRoaXMgY29tbWFuZCwgaXQgbXVzdCBzcGF3biBhIG5ldyBzZXJ2aWNlIHRocmVhZCBhbmQKKwkgKiByZWdpc3RlciBpdCB2aWEgYmNFTlRFUl9MT09QRVIuCisJICovCisKKwlCUl9GSU5JU0hFRCA9IF9JTygncicsIDE0KSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogc3RvcCB0aHJlYWRwb29sIHRocmVhZAorCSAqLworCisJQlJfREVBRF9CSU5ERVIgPSBfSU9SKCdyJywgMTUsIHZvaWQgKiksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCUJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FID0gX0lPUigncicsIDE2LCB2b2lkICopLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKworCUJSX0ZBSUxFRF9SRVBMWSA9IF9JTygncicsIDE3KSwKKwkvKgorCSAqIFRoZSB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgorCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGZhaWxlZCAoZS5nLiBvdXQgb2YgbWVtb3J5KS4gIE5vIHBhcmFtZXRlcnMuCisJICovCit9OworCitlbnVtIEJpbmRlckRyaXZlckNvbW1hbmRQcm90b2NvbCB7CisJQkNfVFJBTlNBQ1RJT04gPSBfSU9XKCdjJywgMCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwlCQ19SRVBMWSA9IF9JT1coJ2MnLCAxLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCS8qCisJICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSBzZW50IGNvbW1hbmQuCisJICovCisKKwlCQ19BQ1FVSVJFX1JFU1VMVCA9IF9JT1coJ2MnLCAyLCBpbnQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6ICAwIGlmIHRoZSBsYXN0IEJSX0FUVEVNUFRfQUNRVUlSRSB3YXMgbm90IHN1Y2Nlc3NmdWwuCisJICogRWxzZSB5b3UgaGF2ZSBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QuCisJICovCisKKwlCQ19GUkVFX0JVRkZFUiA9IF9JT1coJ2MnLCAzLCBpbnQpLAorCS8qCisJICogdm9pZCAqOiBwdHIgdG8gdHJhbnNhY3Rpb24gZGF0YSByZWNlaXZlZCBvbiBhIHJlYWQKKwkgKi8KKworCUJDX0lOQ1JFRlMgPSBfSU9XKCdjJywgNCwgaW50KSwKKwlCQ19BQ1FVSVJFID0gX0lPVygnYycsIDUsIGludCksCisJQkNfUkVMRUFTRSA9IF9JT1coJ2MnLCA2LCBpbnQpLAorCUJDX0RFQ1JFRlMgPSBfSU9XKCdjJywgNywgaW50KSwKKwkvKgorCSAqIGludDoJZGVzY3JpcHRvcgorCSAqLworCisJQkNfSU5DUkVGU19ET05FID0gX0lPVygnYycsIDgsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQkNfQUNRVUlSRV9ET05FID0gX0lPVygnYycsIDksIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZSBmb3IgYmluZGVyCisJICovCisKKwlCQ19BVFRFTVBUX0FDUVVJUkUgPSBfSU9XKCdjJywgMTAsIHN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBpbnQ6IHByaW9yaXR5CisJICogaW50OiBkZXNjcmlwdG9yCisJICovCisKKwlCQ19SRUdJU1RFUl9MT09QRVIgPSBfSU8oJ2MnLCAxMSksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLgorCSAqIFJlZ2lzdGVyIGEgc3Bhd25lZCBsb29wZXIgdGhyZWFkIHdpdGggdGhlIGRldmljZS4KKwkgKi8KKworCUJDX0VOVEVSX0xPT1BFUiA9IF9JTygnYycsIDEyKSwKKwlCQ19FWElUX0xPT1BFUiA9IF9JTygnYycsIDEzKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBzZW50IGFzIGFuIGFwcGxpY2F0aW9uLWxldmVsIHRocmVhZAorCSAqIGVudGVycyBhbmQgZXhpdHMgdGhlIGJpbmRlciBsb29wLCByZXNwZWN0aXZlbHkuICBUaGV5IGFyZQorCSAqIHVzZWQgc28gdGhlIGJpbmRlciBjYW4gaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiB0aGUgbnVtYmVyCisJICogb2YgbG9vcGluZyB0aHJlYWRzIGl0IGhhcyBhdmFpbGFibGUuCisJICovCisKKwlCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04gPSBfSU9XKCdjJywgMTUsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byBiaW5kZXIKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQkNfREVBRF9CSU5ERVJfRE9ORSA9IF9JT1coJ2MnLCAxNiwgdm9pZCAqKSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCit9OworCisjZW5kaWYgLyogX0xJTlVYX0JJTkRFUl9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMjAwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5jCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogZHJpdmVycy9taXNjL2xvZ2dlci5jCisgKgorICogQSBMb2dnaW5nIFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFJvYmVydCBMb3ZlIDxybG92ZUBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgImxvZ2dlci5oIgorCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKgorICogc3RydWN0IGxvZ2dlcl9sb2cgLSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbG9nLCBzdWNoIGFzICdtYWluJyBvciAncmFkaW8nCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgZnJvbSBtb2R1bGUgaW5zZXJ0aW9uIHVudGlsIG1vZHVsZSByZW1vdmFsLCBzbyBpdCBkb2VzCisgKiBub3QgbmVlZCBhZGRpdGlvbmFsIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgKiBtdXRleCAnbXV0ZXgnLgorICovCitzdHJ1Y3QgbG9nZ2VyX2xvZyB7CisJdW5zaWduZWQgY2hhciAqCQlidWZmZXI7CS8qIHRoZSByaW5nIGJ1ZmZlciBpdHNlbGYgKi8KKwlzdHJ1Y3QgbWlzY2RldmljZQltaXNjOwkvKiBtaXNjIGRldmljZSByZXByZXNlbnRpbmcgdGhlIGxvZyAqLworCXdhaXRfcXVldWVfaGVhZF90CXdxOwkvKiB3YWl0IHF1ZXVlIGZvciByZWFkZXJzICovCisJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOyAvKiB0aGlzIGxvZydzIHJlYWRlcnMgKi8KKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkvKiBtdXRleCBwcm90ZWN0aW5nIGJ1ZmZlciAqLworCXNpemVfdAkJCXdfb2ZmOwkvKiBjdXJyZW50IHdyaXRlIGhlYWQgb2Zmc2V0ICovCisJc2l6ZV90CQkJaGVhZDsJLyogbmV3IHJlYWRlcnMgc3RhcnQgaGVyZSAqLworCXNpemVfdAkJCXNpemU7CS8qIHNpemUgb2YgdGhlIGxvZyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBsb2dnZXJfcmVhZGVyIC0gYSBsb2dnaW5nIGRldmljZSBvcGVuIGZvciByZWFkaW5nCisgKgorICogVGhpcyBvYmplY3QgbGl2ZXMgZnJvbSBvcGVuIHRvIHJlbGVhc2UsIHNvIHdlIGRvbid0IG5lZWQgYWRkaXRpb25hbAorICogcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSBsb2ctPm11dGV4LgorICovCitzdHJ1Y3QgbG9nZ2VyX3JlYWRlciB7CisJc3RydWN0IGxvZ2dlcl9sb2cgKglsb2c7CS8qIGFzc29jaWF0ZWQgbG9nICovCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkvKiBlbnRyeSBpbiBsb2dnZXJfbG9nJ3MgbGlzdCAqLworCXNpemVfdAkJCXJfb2ZmOwkvKiBjdXJyZW50IHJlYWQgaGVhZCBvZmZzZXQgKi8KK307CisKKy8qIGxvZ2dlcl9vZmZzZXQgLSByZXR1cm5zIGluZGV4ICduJyBpbnRvIHRoZSBsb2cgdmlhIChvcHRpbWl6ZWQpIG1vZHVsdXMgKi8KKyNkZWZpbmUgbG9nZ2VyX29mZnNldChuKQkoKG4pICYgKGxvZy0+c2l6ZSAtIDEpKQorCisvKgorICogZmlsZV9nZXRfbG9nIC0gR2l2ZW4gYSBmaWxlIHN0cnVjdHVyZSwgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGxvZworICoKKyAqIFRoaXMgaXNuJ3QgYWVzdGhldGljLiBXZSBoYXZlIHNldmVyYWwgZ29hbHM6CisgKgorICogCTEpIE5lZWQgdG8gcXVpY2tseSBvYnRhaW4gdGhlIGFzc29jaWF0ZWQgbG9nIGR1cmluZyBhbiBJL08gb3BlcmF0aW9uCisgKiAJMikgUmVhZGVycyBuZWVkIHRvIG1haW50YWluIHN0YXRlIChsb2dnZXJfcmVhZGVyKQorICogCTMpIFdyaXRlcnMgbmVlZCB0byBiZSB2ZXJ5IGZhc3QgKG9wZW4oKSBzaG91bGQgYmUgYSBuZWFyIG5vLW9wKQorICoKKyAqIEluIHRoZSByZWFkZXIgY2FzZSwgd2UgY2FuIHRyaXZpYWxseSBnbyBmaWxlLT5sb2dnZXJfcmVhZGVyLT5sb2dnZXJfbG9nLgorICogRm9yIGEgd3JpdGVyLCB3ZSBkb24ndCB3YW50IHRvIG1haW50YWluIGEgbG9nZ2VyX3JlYWRlciwgc28gd2UganVzdCBnbworICogZmlsZS0+bG9nZ2VyX2xvZy4gVGh1cyB3aGF0IGZpbGUtPnByaXZhdGVfZGF0YSBwb2ludHMgYXQgZGVwZW5kcyBvbiB3aGV0aGVyCisgKiBvciBub3QgdGhlIGZpbGUgd2FzIG9wZW5lZCBmb3IgcmVhZGluZy4gVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGF0IGRpcnRpbmVzcy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGZpbGVfZ2V0X2xvZyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlyZXR1cm4gcmVhZGVyLT5sb2c7CisJfSBlbHNlCisJCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGE7Cit9CisKKy8qCisgKiBnZXRfZW50cnlfbGVuIC0gR3JhYnMgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGUgbmV4dCBlbnRyeSBzdGFydGluZworICogZnJvbSAnb2ZmJy4KKyAqCisgKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgX191MzIgZ2V0X2VudHJ5X2xlbihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmKQoreworCV9fdTE2IHZhbDsKKworCXN3aXRjaCAobG9nLT5zaXplIC0gb2ZmKSB7CisJY2FzZSAxOgorCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDEpOworCQltZW1jcHkoKChjaGFyICopICZ2YWwpICsgMSwgbG9nLT5idWZmZXIsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDIpOworCX0KKworCXJldHVybiBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyB2YWw7Cit9CisKKy8qCisgKiBkb19yZWFkX2xvZ190b191c2VyIC0gcmVhZHMgZXhhY3RseSAnY291bnQnIGJ5dGVzIGZyb20gJ2xvZycgaW50byB0aGUKKyAqIHVzZXItc3BhY2UgYnVmZmVyICdidWYnLiBSZXR1cm5zICdjb3VudCcgb24gc3VjY2Vzcy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRvX3JlYWRfbG9nX3RvX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKKwkJCQkgICBzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyLAorCQkJCSAgIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCBsZW47CisKKwkvKgorCSAqIFdlIHJlYWQgZnJvbSB0aGUgbG9nIGluIHR3byBkaXNqb2ludCBvcGVyYXRpb25zLiBGaXJzdCwgd2UgcmVhZCBmcm9tCisJICogdGhlIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCB1cCB0byAnY291bnQnIGJ5dGVzIG9yIHRvIHRoZSBlbmQgb2YKKwkgKiB0aGUgbG9nLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisJICovCisJbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyByZWFkZXItPnJfb2ZmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qCisJICogU2Vjb25kLCB3ZSByZWFkIGFueSByZW1haW5pbmcgYnl0ZXMsIHN0YXJ0aW5nIGJhY2sgYXQgdGhlIGhlYWQgb2YKKwkgKiB0aGUgbG9nLgorCSAqLworCWlmIChjb3VudCAhPSBsZW4pCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgbGVuLCBsb2ctPmJ1ZmZlciwgY291bnQgLSBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZWFkZXItPnJfb2ZmID0gbG9nZ2VyX29mZnNldChyZWFkZXItPnJfb2ZmICsgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogbG9nZ2VyX3JlYWQgLSBvdXIgbG9nJ3MgcmVhZCgpIG1ldGhvZAorICoKKyAqIEJlaGF2aW9yOgorICoKKyAqIAktIE9fTk9OQkxPQ0sgd29ya3MKKyAqIAktIElmIHRoZXJlIGFyZSBubyBsb2cgZW50cmllcyB0byByZWFkLCBibG9ja3MgdW50aWwgbG9nIGlzIHdyaXR0ZW4gdG8KKyAqIAktIEF0b21pY2FsbHkgcmVhZHMgZXhhY3RseSBvbmUgbG9nIGVudHJ5CisgKgorICogT3B0aW1hbCByZWFkIHNpemUgaXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uIFdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTCBpZiByZWFkCisgKiBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgbmV4dCBlbnRyeS4KKyAqLworc3RhdGljIHNzaXplX3QgbG9nZ2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IHJlYWRlci0+bG9nOworCXNzaXplX3QgcmV0OworCURFRklORV9XQUlUKHdhaXQpOworCitzdGFydDoKKwl3aGlsZSAoMSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCQlyZXQgPSAobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKworCWZpbmlzaF93YWl0KCZsb2ctPndxLCAmd2FpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCisJLyogaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHRvIHJlYWQgb3IgZGlkIHdlIHJhY2U/ICovCisJaWYgKHVubGlrZWx5KGxvZy0+d19vZmYgPT0gcmVhZGVyLT5yX29mZikpIHsKKwkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKwkJZ290byBzdGFydDsKKwl9CisKKwkvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgZW50cnkgKi8KKwlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7CisJaWYgKGNvdW50IDwgcmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdldCBleGFjdGx5IG9uZSBlbnRyeSBmcm9tIHRoZSBsb2cgKi8KKwlyZXQgPSBkb19yZWFkX2xvZ190b191c2VyKGxvZywgcmVhZGVyLCBidWYsIHJldCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGdldF9uZXh0X2VudHJ5IC0gcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHZhbGlkIGVudHJ5IGF0IGxlYXN0ICdsZW4nCisgKiBieXRlcyBhZnRlciAnb2ZmJy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBzaXplX3QgZ2V0X25leHRfZW50cnkoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IG9mZiwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgY291bnQgPSAwOworCisJZG8geworCQlzaXplX3QgbnIgPSBnZXRfZW50cnlfbGVuKGxvZywgb2ZmKTsKKwkJb2ZmID0gbG9nZ2VyX29mZnNldChvZmYgKyBucik7CisJCWNvdW50ICs9IG5yOworCX0gd2hpbGUgKGNvdW50IDwgbGVuKTsKKworCXJldHVybiBvZmY7Cit9CisKKy8qCisgKiBjbG9ja19pbnRlcnZhbCAtIGlzIGEgPCBjIDwgYiBpbiBtb2Qtc3BhY2U/IFB1dCBhbm90aGVyIHdheSwgZG9lcyB0aGUgbGluZQorICogZnJvbSBhIHRvIGIgY3Jvc3MgYz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2xvY2tfaW50ZXJ2YWwoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgYykKK3sKKwlpZiAoYiA8IGEpIHsKKwkJaWYgKGEgPCBjIHx8IGIgPj0gYykKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWlmIChhIDwgYyAmJiBiID49IGMpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGZpeF91cF9yZWFkZXJzIC0gd2FsayB0aGUgbGlzdCBvZiBhbGwgcmVhZGVycyBhbmQgImZpeCB1cCIgYW55IHdobyB3ZXJlCisgKiBsYXBwZWQgYnkgdGhlIHdyaXRlcjsgYWxzbyBkbyB0aGUgc2FtZSBmb3IgdGhlIGRlZmF1bHQgInN0YXJ0IGhlYWQiLgorICogV2UgZG8gdGhpcyBieSAicHVsbGluZyBmb3J3YXJkIiB0aGUgcmVhZGVycyBhbmQgc3RhcnQgaGVhZCB0byB0aGUgZmlyc3QKKyAqIGVudHJ5IGFmdGVyIHRoZSBuZXcgd3JpdGUgaGVhZC4KKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHZvaWQgZml4X3VwX3JlYWRlcnMoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qgb2xkID0gbG9nLT53X29mZjsKKwlzaXplX3QgbmV3ID0gbG9nZ2VyX29mZnNldChvbGQgKyBsZW4pOworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisKKwlpZiAoY2xvY2tfaW50ZXJ2YWwob2xkLCBuZXcsIGxvZy0+aGVhZCkpCisJCWxvZy0+aGVhZCA9IGdldF9uZXh0X2VudHJ5KGxvZywgbG9nLT5oZWFkLCBsZW4pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCisJCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgcmVhZGVyLT5yX29mZikpCisJCQlyZWFkZXItPnJfb2ZmID0gZ2V0X25leHRfZW50cnkobG9nLCByZWFkZXItPnJfb2ZmLCBsZW4pOworfQorCisvKgorICogZG9fd3JpdGVfbG9nIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gJ2J1ZicgdG8gJ2xvZycKKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHZvaWQgZG9fd3JpdGVfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCBsZW47CisKKwlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIGxvZy0+d19vZmYpOworCW1lbWNweShsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKTsKKworCWlmIChjb3VudCAhPSBsZW4pCisJCW1lbWNweShsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbik7CisKKwlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOworCit9CisKKy8qCisgKiBkb193cml0ZV9sb2dfdXNlciAtIHdyaXRlcyAnbGVuJyBieXRlcyBmcm9tIHRoZSB1c2VyLXNwYWNlIGJ1ZmZlciAnYnVmJyB0bworICogdGhlIGxvZyAnbG9nJworICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICoKKyAqIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKKwkJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7CisJaWYgKGxlbiAmJiBjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY291bnQgIT0gbGVuKQorCQlpZiAoY29weV9mcm9tX3VzZXIobG9nLT5idWZmZXIsIGJ1ZiArIGxlbiwgY291bnQgLSBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogbG9nZ2VyX2Fpb193cml0ZSAtIG91ciB3cml0ZSBtZXRob2QsIGltcGxlbWVudGluZyBzdXBwb3J0IGZvciB3cml0ZSgpLAorICogd3JpdGV2KCksIGFuZCBhaW9fd3JpdGUoKS4gV3JpdGVzIGFyZSBvdXIgZmFzdCBwYXRoLCBhbmQgd2UgdHJ5IHRvIG9wdGltaXplCisgKiB0aGVtIGFib3ZlIGFsbCBlbHNlLgorICovCitzc2l6ZV90IGxvZ2dlcl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coaW9jYi0+a2lfZmlscCk7CisJc2l6ZV90IG9yaWcgPSBsb2ctPndfb2ZmOworCXN0cnVjdCBsb2dnZXJfZW50cnkgaGVhZGVyOworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJc3NpemVfdCByZXQgPSAwOworCisJbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOworCisJaGVhZGVyLnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJaGVhZGVyLnRpZCA9IGN1cnJlbnQtPnBpZDsKKwloZWFkZXIuc2VjID0gbm93LnR2X3NlYzsKKwloZWFkZXIubnNlYyA9IG5vdy50dl9uc2VjOworCWhlYWRlci5sZW4gPSBtaW5fdChzaXplX3QsIGlvY2ItPmtpX2xlZnQsIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRCk7CisKKwkvKiBudWxsIHdyaXRlcyBzdWNjZWVkLCByZXR1cm4gemVybyAqLworCWlmICh1bmxpa2VseSghaGVhZGVyLmxlbikpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwkvKgorCSAqIEZpeCB1cCBhbnkgcmVhZGVycywgcHVsbGluZyB0aGVtIGZvcndhcmQgdG8gdGhlIGZpcnN0IHJlYWRhYmxlCisJICogZW50cnkgYWZ0ZXIgKHdoYXQgd2lsbCBiZSkgdGhlIG5ldyB3cml0ZSBvZmZzZXQuIFdlIGRvIHRoaXMgbm93CisJICogYmVjYXVzZSBpZiB3ZSBwYXJ0aWFsbHkgZmFpbCwgd2UgY2FuIGVuZCB1cCB3aXRoIGNsb2JiZXJlZCBsb2cKKwkgKiBlbnRyaWVzIHRoYXQgZW5jcm9hY2ggb24gcmVhZGFibGUgYnVmZmVyLgorCSAqLworCWZpeF91cF9yZWFkZXJzKGxvZywgc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgaGVhZGVyLmxlbik7CisKKwlkb193cml0ZV9sb2cobG9nLCAmaGVhZGVyLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpOworCisJd2hpbGUgKG5yX3NlZ3MtLSA+IDApIHsKKwkJc2l6ZV90IGxlbjsKKwkJc3NpemVfdCBucjsKKworCQkvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIG9mIHRoaXMgdmVjdG9yIHdlIGNhbiBrZWVwICovCisJCWxlbiA9IG1pbl90KHNpemVfdCwgaW92LT5pb3ZfbGVuLCBoZWFkZXIubGVuIC0gcmV0KTsKKworCQkvKiB3cml0ZSBvdXQgdGhpcyBzZWdtZW50J3MgcGF5bG9hZCAqLworCQluciA9IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIobG9nLCBpb3YtPmlvdl9iYXNlLCBsZW4pOworCQlpZiAodW5saWtlbHkobnIgPCAwKSkgeworCQkJbG9nLT53X29mZiA9IG9yaWc7CisJCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQkJcmV0dXJuIG5yOworCQl9CisKKwkJaW92Kys7CisJCXJldCArPSBucjsKKwl9CisKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkZXJzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2ctPndxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGdldF9sb2dfZnJvbV9taW5vcihpbnQpOworCisvKgorICogbG9nZ2VyX29wZW4gLSB0aGUgbG9nJ3Mgb3BlbigpIGZpbGUgb3BlcmF0aW9uCisgKgorICogTm90ZSBob3cgbmVhciBhIG5vLW9wIHRoaXMgaXMgaW4gdGhlIHdyaXRlLW9ubHkgY2FzZS4gS2VlcCBpdCB0aGF0IHdheSEKKyAqLworc3RhdGljIGludCBsb2dnZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOworCWludCByZXQ7CisKKwlyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbG9nID0gZ2V0X2xvZ19mcm9tX21pbm9yKE1JTk9SKGlub2RlLT5pX3JkZXYpKTsKKwlpZiAoIWxvZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyOworCisJCXJlYWRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dnZXJfcmVhZGVyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVhZGVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmVhZGVyLT5sb2cgPSBsb2c7CisJCUlOSVRfTElTVF9IRUFEKCZyZWFkZXItPmxpc3QpOworCisJCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCQlyZWFkZXItPnJfb2ZmID0gbG9nLT5oZWFkOworCQlsaXN0X2FkZF90YWlsKCZyZWFkZXItPmxpc3QsICZsb2ctPnJlYWRlcnMpOworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IHJlYWRlcjsKKwl9IGVsc2UKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gbG9nOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsb2dnZXJfcmVsZWFzZSAtIHRoZSBsb2cncyByZWxlYXNlIGZpbGUgb3BlcmF0aW9uCisgKgorICogTm90ZSB0aGlzIGlzIGEgdG90YWwgbm8tb3AgaW4gdGhlIHdyaXRlLW9ubHkgY2FzZS4gS2VlcCBpdCB0aGF0IHdheSEKKyAqLworc3RhdGljIGludCBsb2dnZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlnbm9yZWQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWxpc3RfZGVsKCZyZWFkZXItPmxpc3QpOworCQlrZnJlZShyZWFkZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogbG9nZ2VyX3BvbGwgLSB0aGUgbG9nJ3MgcG9sbCBmaWxlIG9wZXJhdGlvbiwgZm9yIHBvbGwvc2VsZWN0L2Vwb2xsCisgKgorICogTm90ZSB3ZSBhbHdheXMgcmV0dXJuIFBPTExPVVQsIGJlY2F1c2UgeW91IGNhbiBhbHdheXMgd3JpdGUoKSB0byB0aGUgbG9nLgorICogTm90ZSBhbHNvIHRoYXQsIHN0cmljdGx5IHNwZWFraW5nLCBhIHJldHVybiB2YWx1ZSBvZiBQT0xMSU4gZG9lcyBub3QKKyAqIGd1YXJhbnRlZSB0aGF0IHRoZSBsb2cgaXMgcmVhZGFibGUgd2l0aG91dCBibG9ja2luZywgYXMgdGhlcmUgaXMgYSBzbWFsbAorICogY2hhbmNlIHRoYXQgdGhlIHdyaXRlciBjYW4gbGFwIHRoZSByZWFkZXIgaW4gdGhlIGludGVyaW0gYmV0d2VlbiBwb2xsKCkKKyAqIHJldHVybmluZyBhbmQgdGhlIHJlYWQoKSByZXF1ZXN0LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxvZ2dlcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZzsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIHJldDsKKworCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlsb2cgPSByZWFkZXItPmxvZzsKKworCXBvbGxfd2FpdChmaWxlLCAmbG9nLT53cSwgd2FpdCk7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKwlpZiAobG9nLT53X29mZiAhPSByZWFkZXItPnJfb2ZmKQorCQlyZXQgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgbG9nZ2VyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nID0gZmlsZV9nZXRfbG9nKGZpbGUpOworCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisJbG9uZyByZXQgPSAtRU5PVFRZOworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkU6CisJCXJldCA9IGxvZy0+c2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBMT0dHRVJfR0VUX0xPR19MRU46CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmIChsb2ctPndfb2ZmID49IHJlYWRlci0+cl9vZmYpCisJCQlyZXQgPSBsb2ctPndfb2ZmIC0gcmVhZGVyLT5yX29mZjsKKwkJZWxzZQorCQkJcmV0ID0gKGxvZy0+c2l6ZSAtIHJlYWRlci0+cl9vZmYpICsgbG9nLT53X29mZjsKKwkJYnJlYWs7CisJY2FzZSBMT0dHRVJfR0VUX05FWFRfRU5UUllfTEVOOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlpZiAobG9nLT53X29mZiAhPSByZWFkZXItPnJfb2ZmKQorCQkJcmV0ID0gZ2V0X2VudHJ5X2xlbihsb2csIHJlYWRlci0+cl9vZmYpOworCQllbHNlCisJCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIExPR0dFUl9GTFVTSF9MT0c6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCisJCQlyZWFkZXItPnJfb2ZmID0gbG9nLT53X29mZjsKKwkJbG9nLT5oZWFkID0gbG9nLT53X29mZjsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxvZ2dlcl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gbG9nZ2VyX3JlYWQsCisJLmFpb193cml0ZSA9IGxvZ2dlcl9haW9fd3JpdGUsCisJLnBvbGwgPSBsb2dnZXJfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSBsb2dnZXJfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKKwkub3BlbiA9IGxvZ2dlcl9vcGVuLAorCS5yZWxlYXNlID0gbG9nZ2VyX3JlbGVhc2UsCit9OworCisvKgorICogRGVmaW5lcyBhIGxvZyBzdHJ1Y3R1cmUgd2l0aCBuYW1lICdOQU1FJyBhbmQgYSBzaXplIG9mICdTSVpFJyBieXRlcywgd2hpY2gKKyAqIG11c3QgYmUgYSBwb3dlciBvZiB0d28sIGdyZWF0ZXIgdGhhbiBMT0dHRVJfRU5UUllfTUFYX0xFTiwgYW5kIGxlc3MgdGhhbgorICogTE9OR19NQVggbWludXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uCisgKi8KKyNkZWZpbmUgREVGSU5FX0xPR0dFUl9ERVZJQ0UoVkFSLCBOQU1FLCBTSVpFKSBcCitzdGF0aWMgdW5zaWduZWQgY2hhciBfYnVmXyAjIyBWQVJbU0laRV07IFwKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyBWQVIgPSB7IFwKKwkuYnVmZmVyID0gX2J1Zl8gIyMgVkFSLCBcCisJLm1pc2MgPSB7IFwKKwkJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLCBcCisJCS5uYW1lID0gTkFNRSwgXAorCQkuZm9wcyA9ICZsb2dnZXJfZm9wcywgXAorCQkucGFyZW50ID0gTlVMTCwgXAorCX0sIFwKKwkud3EgPSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihWQVIgLndxKSwgXAorCS5yZWFkZXJzID0gTElTVF9IRUFEX0lOSVQoVkFSIC5yZWFkZXJzKSwgXAorCS5tdXRleCA9IF9fTVVURVhfSU5JVElBTElaRVIoVkFSIC5tdXRleCksIFwKKwkud19vZmYgPSAwLCBcCisJLmhlYWQgPSAwLCBcCisJLnNpemUgPSBTSVpFLCBcCit9OworCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfbWFpbiwgTE9HR0VSX0xPR19NQUlOLCA2NCoxMDI0KQorREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX2V2ZW50cywgTE9HR0VSX0xPR19FVkVOVFMsIDI1NioxMDI0KQorREVGSU5FX0xPR0dFUl9ERVZJQ0UobG9nX3JhZGlvLCBMT0dHRVJfTE9HX1JBRElPLCA2NCoxMDI0KQorCitzdGF0aWMgc3RydWN0IGxvZ2dlcl9sb2cgKiBnZXRfbG9nX2Zyb21fbWlub3IoaW50IG1pbm9yKQoreworCWlmIChsb2dfbWFpbi5taXNjLm1pbm9yID09IG1pbm9yKQorCQlyZXR1cm4gJmxvZ19tYWluOworCWlmIChsb2dfZXZlbnRzLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX2V2ZW50czsKKwlpZiAobG9nX3JhZGlvLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX3JhZGlvOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xvZyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZsb2ctPm1pc2MpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibG9nZ2VyOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyAiCisJCSAgICAgICAiZGV2aWNlIGZvciBsb2cgJyVzJyFcbiIsIGxvZy0+bWlzYy5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJsb2dnZXI6IGNyZWF0ZWQgJWx1SyBsb2cgJyVzJ1xuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxvZy0+c2l6ZSA+PiAxMCwgbG9nLT5taXNjLm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxvZ2dlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGluaXRfbG9nKCZsb2dfbWFpbik7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19ldmVudHMpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IGluaXRfbG9nKCZsb2dfcmFkaW8pOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CitkZXZpY2VfaW5pdGNhbGwobG9nZ2VyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYyNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKQEAgLTAsMCArMSw0OCBAQAorLyogaW5jbHVkZS9saW51eC9sb2dnZXIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICogQXV0aG9yOiBSb2JlcnQgTG92ZSA8cmxvdmVAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfTE9HR0VSX0gKKyNkZWZpbmUgX0xJTlVYX0xPR0dFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3N0cnVjdCBsb2dnZXJfZW50cnkgeworCV9fdTE2CQlsZW47CS8qIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCAqLworCV9fdTE2CQlfX3BhZDsJLyogbm8gbWF0dGVyIHdoYXQsIHdlIGdldCAyIGJ5dGVzIG9mIHBhZGRpbmcgKi8KKwlfX3MzMgkJcGlkOwkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyBwaWQgKi8KKwlfX3MzMgkJdGlkOwkvKiBnZW5lcmF0aW5nIHByb2Nlc3MncyB0aWQgKi8KKwlfX3MzMgkJc2VjOwkvKiBzZWNvbmRzIHNpbmNlIEVwb2NoICovCisJX19zMzIJCW5zZWM7CS8qIG5hbm9zZWNvbmRzICovCisJY2hhcgkJbXNnWzBdOwkvKiB0aGUgZW50cnkncyBwYXlsb2FkICovCit9OworCisjZGVmaW5lIExPR0dFUl9MT0dfUkFESU8JImxvZ19yYWRpbyIJLyogcmFkaW8tcmVsYXRlZCBtZXNzYWdlcyAqLworI2RlZmluZSBMT0dHRVJfTE9HX0VWRU5UUwkibG9nX2V2ZW50cyIJLyogc3lzdGVtL2hhcmR3YXJlIGV2ZW50cyAqLworI2RlZmluZSBMT0dHRVJfTE9HX01BSU4JCSJsb2dfbWFpbiIJLyogZXZlcnl0aGluZyBlbHNlICovCisKKyNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9MRU4JCSg0KjEwMjQpCisjZGVmaW5lIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRAlcCisJKExPR0dFUl9FTlRSWV9NQVhfTEVOIC0gc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpKQorCisjZGVmaW5lIF9fTE9HR0VSSU8JMHhBRQorCisjZGVmaW5lIExPR0dFUl9HRVRfTE9HX0JVRl9TSVpFCQlfSU8oX19MT0dHRVJJTywgMSkgLyogc2l6ZSBvZiBsb2cgKi8KKyNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfTEVOCQlfSU8oX19MT0dHRVJJTywgMikgLyogdXNlZCBsb2cgbGVuICovCisjZGVmaW5lIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU4JX0lPKF9fTE9HR0VSSU8sIDMpIC8qIG5leHQgZW50cnkgbGVuICovCisjZGVmaW5lIExPR0dFUl9GTFVTSF9MT0cJCV9JTyhfX0xPR0dFUklPLCA0KSAvKiBmbHVzaCBsb2cgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9MT0dHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzE1ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qIGRyaXZlcnMvbWlzYy9sb3dtZW1vcnlraWxsZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L29vbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK3N0YXRpYyBpbnQgbG93bWVtX3NocmluayhpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOworCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGxvd21lbV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gbG93bWVtX3NocmluaywKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTICogMTYKK307CitzdGF0aWMgdWludDMyX3QgbG93bWVtX2RlYnVnX2xldmVsID0gMjsKK3N0YXRpYyBpbnQgbG93bWVtX2Fkals2XSA9IHsKKwkwLAorCTEsCisJNiwKKwkxMiwKK307CitzdGF0aWMgaW50IGxvd21lbV9hZGpfc2l6ZSA9IDQ7CitzdGF0aWMgc2l6ZV90IGxvd21lbV9taW5mcmVlWzZdID0geworCTMqNTEyLCAvLyA2TUIKKwkyKjEwMjQsIC8vIDhNQgorCTQqMTAyNCwgLy8gMTZNQgorCTE2KjEwMjQsIC8vIDY0TUIKK307CitzdGF0aWMgaW50IGxvd21lbV9taW5mcmVlX3NpemUgPSA0OworCisjZGVmaW5lIGxvd21lbV9wcmludChsZXZlbCwgeC4uLikgZG8geyBpZihsb3dtZW1fZGVidWdfbGV2ZWwgPj0gKGxldmVsKSkgcHJpbnRrKHgpOyB9IHdoaWxlKDApCisKK21vZHVsZV9wYXJhbV9uYW1lZChjb3N0LCBsb3dtZW1fc2hyaW5rZXIuc2Vla3MsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKGFkaiwgbG93bWVtX2FkaiwgaW50LCAmbG93bWVtX2Fkal9zaXplLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobWluZnJlZSwgbG93bWVtX21pbmZyZWUsIHVpbnQsICZsb3dtZW1fbWluZnJlZV9zaXplLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbGV2ZWwsIGxvd21lbV9kZWJ1Z19sZXZlbCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworCitzdGF0aWMgaW50IGxvd21lbV9zaHJpbmsoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbGVjdGVkID0gTlVMTDsKKwlpbnQgcmVtID0gMDsKKwlpbnQgdGFza3NpemU7CisJaW50IGk7CisJaW50IG1pbl9hZGogPSBPT01fQURKVVNUX01BWCArIDE7CisJaW50IHNlbGVjdGVkX3Rhc2tzaXplID0gMDsKKwlpbnQgYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobG93bWVtX2Fkaik7CisJaW50IG90aGVyX2ZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSArIGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfUEFHRVMpOworCWlmKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCisJCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7CisJaWYobG93bWVtX21pbmZyZWVfc2l6ZSA8IGFycmF5X3NpemUpCisJCWFycmF5X3NpemUgPSBsb3dtZW1fbWluZnJlZV9zaXplOworCWZvcihpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykgeworCQlpZihvdGhlcl9mcmVlIDwgbG93bWVtX21pbmZyZWVbaV0pIHsKKwkJCW1pbl9hZGogPSBsb3dtZW1fYWRqW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYobnJfdG9fc2NhbiA+IDApCisJCWxvd21lbV9wcmludCgzLCAibG93bWVtX3NocmluayAlZCwgJXgsIG9mcmVlICVkLCBtYSAlZFxuIiwgbnJfdG9fc2NhbiwgZ2ZwX21hc2ssIG90aGVyX2ZyZWUsIG1pbl9hZGopOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZm9yX2VhY2hfcHJvY2VzcyhwKSB7CisJCWlmKHAtPm9vbWtpbGxhZGogPj0gMCAmJiBwLT5tbSkgeworCQkJdGFza3NpemUgPSBnZXRfbW1fcnNzKHAtPm1tKTsKKwkJCWlmKG5yX3RvX3NjYW4gPiAwICYmIHRhc2tzaXplID4gMCAmJiBwLT5vb21raWxsYWRqID49IG1pbl9hZGopIHsKKwkJCQlpZihzZWxlY3RlZCA9PSBOVUxMIHx8CisJCQkJICAgcC0+b29ta2lsbGFkaiA+IHNlbGVjdGVkLT5vb21raWxsYWRqIHx8CisJCQkJICAgKHAtPm9vbWtpbGxhZGogPT0gc2VsZWN0ZWQtPm9vbWtpbGxhZGogJiYKKwkJCQkgICAgdGFza3NpemUgPiBzZWxlY3RlZF90YXNrc2l6ZSkpIHsKKwkJCQkJc2VsZWN0ZWQgPSBwOworCQkJCQlzZWxlY3RlZF90YXNrc2l6ZSA9IHRhc2tzaXplOworCQkJCQlsb3dtZW1fcHJpbnQoMiwgInNlbGVjdCAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWQsIHRvIGtpbGxcbiIsCisJCQkJCSAgICAgICAgICAgICBwLT5waWQsIHAtPmNvbW0sIHAtPm9vbWtpbGxhZGosIHRhc2tzaXplKTsKKwkJCQl9CisJCQl9CisJCQlyZW0gKz0gdGFza3NpemU7CisJCX0KKwl9CisJaWYoc2VsZWN0ZWQgIT0gTlVMTCkgeworCQlsb3dtZW1fcHJpbnQoMSwgInNlbmQgc2lna2lsbCB0byAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWRcbiIsCisJCSAgICAgICAgICAgICBzZWxlY3RlZC0+cGlkLCBzZWxlY3RlZC0+Y29tbSwKKwkJICAgICAgICAgICAgIHNlbGVjdGVkLT5vb21raWxsYWRqLCBzZWxlY3RlZF90YXNrc2l6ZSk7CisJCWZvcmNlX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCk7CisJCXJlbSAtPSBzZWxlY3RlZF90YXNrc2l6ZTsKKwl9CisJbG93bWVtX3ByaW50KDQsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgcmV0dXJuICVkXG4iLCBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIHJlbTsKK30KKworc3RhdGljIGludCBfX2luaXQgbG93bWVtX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaHJpbmtlcigmbG93bWVtX3Nocmlua2VyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxvd21lbV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmbG93bWVtX3Nocmlua2VyKTsKK30KKworbW9kdWxlX2luaXQobG93bWVtX2luaXQpOworbW9kdWxlX2V4aXQobG93bWVtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDA2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiBkcml2ZXJzL2FuZHJvaWQvcmFtX2NvbnNvbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisjaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KKyNlbmRpZgorCitzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyIHsKKwl1aW50MzJfdCAgICBzaWc7CisJdWludDMyX3QgICAgc3RhcnQ7CisJdWludDMyX3QgICAgc2l6ZTsKKwl1aW50OF90ICAgICBkYXRhWzBdOworfTsKKworI2RlZmluZSBSQU1fQ09OU09MRV9TSUcgKDB4NDM0NzQyNDQpIC8qIERCR0MgKi8KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEKKwlyYW1fY29uc29sZV9vbGRfbG9nX2luaXRfYnVmZmVyW0NPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkVdOworI2VuZGlmCitzdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfb2xkX2xvZzsKK3N0YXRpYyBzaXplX3QgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplOworCitzdGF0aWMgc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqcmFtX2NvbnNvbGVfYnVmZmVyOworc3RhdGljIHNpemVfdCByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCitzdGF0aWMgY2hhciAqcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKK3N0YXRpYyBzdHJ1Y3QgcnNfY29udHJvbCAqcmFtX2NvbnNvbGVfcnNfZGVjb2RlcjsKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzOworc3RhdGljIGludCByYW1fY29uc29sZV9iYWRfYmxvY2tzOworI2RlZmluZSBFQ0NfQkxPQ0tfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0RBVEFfU0laRQorI2RlZmluZSBFQ0NfU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX0VDQ19TSVpFCisjZGVmaW5lIEVDQ19TWU1TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKKyNkZWZpbmUgRUNDX1BPTFkgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9QT0xZTk9NSUFMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX2VuY29kZV9yczgodWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQoreworCWludCBpOworCXVpbnQxNl90IHBhcltFQ0NfU0laRV07CisJLyogSW5pdGlhbGl6ZSB0aGUgcGFyaXR5IGJ1ZmZlciAqLworCW1lbXNldChwYXIsIDAsIHNpemVvZihwYXIpKTsKKwllbmNvZGVfcnM4KHJhbV9jb25zb2xlX3JzX2RlY29kZXIsIGRhdGEsIGxlbiwgcGFyLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgRUNDX1NJWkU7IGkrKykKKwkJZWNjW2ldID0gcGFyW2ldOworfQorCitzdGF0aWMgaW50IHJhbV9jb25zb2xlX2RlY29kZV9yczgodm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQoreworCWludCBpOworCXVpbnQxNl90IHBhcltFQ0NfU0laRV07CisJZm9yIChpID0gMDsgaSA8IEVDQ19TSVpFOyBpKyspCisJCXBhcltpXSA9IGVjY1tpXTsKKwlyZXR1cm4gZGVjb2RlX3JzOChyYW1fY29uc29sZV9yc19kZWNvZGVyLCBkYXRhLCBwYXIsIGxlbiwKKwkJCQlOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByYW1fY29uc29sZV91cGRhdGUoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJdWludDhfdCAqYnVmZmVyX2VuZCA9IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCXVpbnQ4X3QgKmJsb2NrOworCXVpbnQ4X3QgKnBhcjsKKwlpbnQgc2l6ZSA9IEVDQ19CTE9DS19TSVpFOworI2VuZGlmCisJbWVtY3B5KGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c3RhcnQsIHMsIGNvdW50KTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJYmxvY2sgPSBidWZmZXItPmRhdGEgKyAoYnVmZmVyLT5zdGFydCAmIH4oRUNDX0JMT0NLX1NJWkUgLSAxKSk7CisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCisJICAgICAgKGJ1ZmZlci0+c3RhcnQgLyBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKKwlkbyB7CisJCWlmIChibG9jayArIEVDQ19CTE9DS19TSVpFID4gYnVmZmVyX2VuZCkKKwkJCXNpemUgPSBidWZmZXJfZW5kIC0gYmxvY2s7CisJCXJhbV9jb25zb2xlX2VuY29kZV9yczgoYmxvY2ssIHNpemUsIHBhcik7CisJCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOworCQlwYXIgKz0gRUNDX1NJWkU7CisJfSB3aGlsZSAoYmxvY2sgPCBidWZmZXItPmRhdGEgKyBidWZmZXItPnN0YXJ0ICsgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX3VwZGF0ZV9oZWFkZXIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworCXVpbnQ4X3QgKnBhcjsKKwlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyICsKKwkgICAgICBESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsIEVDQ19CTE9DS19TSVpFKSAqIEVDQ19TSVpFOworCXJhbV9jb25zb2xlX2VuY29kZV9yczgoKHVpbnQ4X3QgKilidWZmZXIsIHNpemVvZigqYnVmZmVyKSwgcGFyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorcmFtX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgcmVtOworCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKKworCWlmIChjb3VudCA+IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKSB7CisJCXMgKz0gY291bnQgLSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKwkJY291bnQgPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKwl9CisJcmVtID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgLSBidWZmZXItPnN0YXJ0OworCWlmIChyZW0gPCBjb3VudCkgeworCQlyYW1fY29uc29sZV91cGRhdGUocywgcmVtKTsKKwkJcyArPSByZW07CisJCWNvdW50IC09IHJlbTsKKwkJYnVmZmVyLT5zdGFydCA9IDA7CisJCWJ1ZmZlci0+c2l6ZSA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCX0KKwlyYW1fY29uc29sZV91cGRhdGUocywgY291bnQpOworCisJYnVmZmVyLT5zdGFydCArPSBjb3VudDsKKwlpZiAoYnVmZmVyLT5zaXplIDwgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpCisJCWJ1ZmZlci0+c2l6ZSArPSBjb3VudDsKKwlyYW1fY29uc29sZV91cGRhdGVfaGVhZGVyKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSByYW1fY29uc29sZSA9IHsKKwkubmFtZQk9ICJyYW0iLAorCS53cml0ZQk9IHJhbV9jb25zb2xlX3dyaXRlLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9FTkFCTEVELAorCS5pbmRleAk9IC0xLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0CityYW1fY29uc29sZV9zYXZlX29sZChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIsIGNoYXIgKmRlc3QpCit7CisJc2l6ZV90IG9sZF9sb2dfc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJdWludDhfdCAqYmxvY2s7CisJdWludDhfdCAqcGFyOworCWNoYXIgc3RyYnVmWzgwXTsKKwlpbnQgc3RyYnVmX2xlbjsKKworCWJsb2NrID0gYnVmZmVyLT5kYXRhOworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXI7CisJd2hpbGUgKGJsb2NrIDwgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zaXplKSB7CisJCWludCBudW1lcnI7CisJCWludCBzaXplID0gRUNDX0JMT0NLX1NJWkU7CisJCWlmIChibG9jayArIHNpemUgPiBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkKKwkJCXNpemUgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtIGJsb2NrOworCQludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJsb2NrLCBzaXplLCBwYXIpOworCQlpZiAobnVtZXJyID4gMCkgeworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBibG9jayAlcCwgJWRcbiIsCisJCQkgICAgICAgYmxvY2ssIG51bWVycik7CisjZW5kaWYKKwkJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7CisJCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgeworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiB1bmNvcnJlY3RhYmxlIGVycm9yIGluICIKKwkJCSAgICAgICAiYmxvY2sgJXBcbiIsIGJsb2NrKTsKKyNlbmRpZgorCQkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOworCQl9CisJCWJsb2NrICs9IEVDQ19CTE9DS19TSVpFOworCQlwYXIgKz0gRUNDX1NJWkU7CisJfQorCWlmIChyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgfHwgcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcykKKwkJc3RyYnVmX2xlbiA9IHNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksCisJCQkiXG4lZCBDb3JyZWN0ZWQgYnl0ZXMsICVkIHVucmVjb3ZlcmFibGUgYmxvY2tzXG4iLAorCQkJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzLCByYW1fY29uc29sZV9iYWRfYmxvY2tzKTsKKwllbHNlCisJCXN0cmJ1Zl9sZW4gPSBzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLAorCQkJCSAgICAgICJcbk5vIGVycm9ycyBkZXRlY3RlZFxuIik7CisJaWYgKHN0cmJ1Zl9sZW4gPj0gc2l6ZW9mKHN0cmJ1ZikpCisJCXN0cmJ1Zl9sZW4gPSBzaXplb2Yoc3RyYnVmKSAtIDE7CisJb2xkX2xvZ19zaXplICs9IHN0cmJ1Zl9sZW47CisjZW5kaWYKKworCWlmIChkZXN0ID09IE5VTEwpIHsKKwkJZGVzdCA9IGttYWxsb2Mob2xkX2xvZ19zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJhbV9jb25zb2xlX29sZF9sb2cgPSBkZXN0OworCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IG9sZF9sb2dfc2l6ZTsKKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKKwkgICAgICAgJmJ1ZmZlci0+ZGF0YVtidWZmZXItPnN0YXJ0XSwgYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5zdGFydCk7CisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0LAorCSAgICAgICAmYnVmZmVyLT5kYXRhWzBdLCBidWZmZXItPnN0YXJ0KTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2cgKyBvbGRfbG9nX3NpemUgLSBzdHJidWZfbGVuLAorCSAgICAgICBzdHJidWYsIHN0cmJ1Zl9sZW4pOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHJhbV9jb25zb2xlX2luaXQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLAorCQkJCSAgIHNpemVfdCBidWZmZXJfc2l6ZSwgY2hhciAqb2xkX2J1ZikKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCisJaW50IG51bWVycjsKKwl1aW50OF90ICpwYXI7CisjZW5kaWYKKwlyYW1fY29uc29sZV9idWZmZXIgPSBidWZmZXI7CisJcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgPQorCQlidWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyKTsKKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtPSAoRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLAorCQkJCQkJRUNDX0JMT0NLX1NJWkUpICsgMSkgKiBFQ0NfU0laRTsKKwlyYW1fY29uc29sZV9wYXJfYnVmZmVyID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisKKworCS8qIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3QgaXMgMAorCSAqIHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQorCSAqLworCXJhbV9jb25zb2xlX3JzX2RlY29kZXIgPSBpbml0X3JzKEVDQ19TWU1TSVpFLCBFQ0NfUE9MWSwgMCwgMSwgRUNDX1NJWkUpOworCWlmIChyYW1fY29uc29sZV9yc19kZWNvZGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGluaXRfcnMgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzID0gMDsKKwlyYW1fY29uc29sZV9iYWRfYmxvY2tzID0gMDsKKworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKworCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7CisKKwludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOworCWlmIChudW1lcnIgPiAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBoZWFkZXIsICVkXG4iLCBudW1lcnIpOworCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOworCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gaGVhZGVyXG4iKTsKKwkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOworCX0KKyNlbmRpZgorCisJaWYgKGJ1ZmZlci0+c2lnID09IFJBTV9DT05TT0xFX1NJRykgeworCQlpZiAoYnVmZmVyLT5zaXplID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUKKwkJICAgIHx8IGJ1ZmZlci0+c3RhcnQgPiBidWZmZXItPnNpemUpCisJCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgaW52YWxpZCAiCisJCQkgICAgICAgImJ1ZmZlciwgc2l6ZSAlZCwgc3RhcnQgJWRcbiIsCisJCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgYnVmZmVyLCAiCisJCQkgICAgICAgInNpemUgJWQsIHN0YXJ0ICVkXG4iLAorCQkJICAgICAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5zdGFydCk7CisJCQlyYW1fY29uc29sZV9zYXZlX29sZChidWZmZXIsIG9sZF9idWYpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IG5vIHZhbGlkIGRhdGEgaW4gYnVmZmVyICIKKwkJICAgICAgICIoc2lnID0gMHglMDh4KVxuIiwgYnVmZmVyLT5zaWcpOworCX0KKworCWJ1ZmZlci0+c2lnID0gUkFNX0NPTlNPTEVfU0lHOworCWJ1ZmZlci0+c3RhcnQgPSAwOworCWJ1ZmZlci0+c2l6ZSA9IDA7CisKKwlyZWdpc3Rlcl9jb25zb2xlKCZyYW1fY29uc29sZSk7CisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRU5BQkxFX1ZFUkJPU0UKKwljb25zb2xlX3ZlcmJvc2UoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfZWFybHlfaW5pdCh2b2lkKQoreworCXJldHVybiByYW1fY29uc29sZV9pbml0KChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICopCisJCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIsCisJCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUsCisJCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwlzaXplX3Qgc3RhcnQ7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXZvaWQgKmJ1ZmZlcjsKKworCWlmIChyZXMgPT0gTlVMTCB8fCBwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEgfHwKKwkgICAgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGludmFsaWQgcmVzb3VyY2UsICVwICVkIGZsYWdzICIKKwkJICAgICAgICIlbHhcbiIsIHJlcywgcGRldi0+bnVtX3Jlc291cmNlcywgcmVzID8gcmVzLT5mbGFncyA6IDApOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlidWZmZXJfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJc3RhcnQgPSByZXMtPnN0YXJ0OworCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBnb3QgYnVmZmVyIGF0ICV4LCBzaXplICV4XG4iLAorCSAgICAgICBzdGFydCwgYnVmZmVyX3NpemUpOworCWJ1ZmZlciA9IGlvcmVtYXAocmVzLT5zdGFydCwgYnVmZmVyX3NpemUpOworCWlmIChidWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gbWFwIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiByYW1fY29uc29sZV9pbml0KGJ1ZmZlciwgYnVmZmVyX3NpemUsIE5VTEwvKiBhbGxvY2F0ZSAqLyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJhbV9jb25zb2xlX2RyaXZlciA9IHsKKwkucHJvYmUgPSByYW1fY29uc29sZV9kcml2ZXJfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJhbV9jb25zb2xlIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcmFtX2NvbnNvbGVfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHJhbV9jb25zb2xlX3JlYWRfb2xkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKwlzc2l6ZV90IGNvdW50OworCisJaWYgKHBvcyA+PSByYW1fY29uc29sZV9vbGRfbG9nX3NpemUpCisJCXJldHVybiAwOworCisJY291bnQgPSBtaW4obGVuLCAoc2l6ZV90KShyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgLSBwb3MpKTsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcmFtX2NvbnNvbGVfb2xkX2xvZyArIHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSpvZmZzZXQgKz0gY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW1fY29uc29sZV9maWxlX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IHJhbV9jb25zb2xlX3JlYWRfb2xkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfbGF0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCWlmIChyYW1fY29uc29sZV9vbGRfbG9nID09IE5VTEwpCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKwlyYW1fY29uc29sZV9vbGRfbG9nID0ga21hbGxvYyhyYW1fY29uc29sZV9vbGRfbG9nX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChyYW1fY29uc29sZV9vbGRfbG9nID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG9sZCBsb2dcbiIpOworCQlyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2csCisJICAgICAgIHJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIsIHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSk7CisjZW5kaWYKKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJsYXN0X2ttc2ciLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCk7CisJaWYgKCFlbnRyeSkgeworCQlwcmludGsoS0VSTl9FUlIgInJhbV9jb25zb2xlOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIpOworCQlrZnJlZShyYW1fY29uc29sZV9vbGRfbG9nKTsKKwkJcmFtX2NvbnNvbGVfb2xkX2xvZyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmcmFtX2NvbnNvbGVfZmlsZV9vcHM7CisJZW50cnktPnNpemUgPSByYW1fY29uc29sZV9vbGRfbG9nX3NpemU7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCitjb25zb2xlX2luaXRjYWxsKHJhbV9jb25zb2xlX2Vhcmx5X2luaXQpOworI2Vsc2UKK21vZHVsZV9pbml0KHJhbV9jb25zb2xlX21vZHVsZV9pbml0KTsKKyNlbmRpZgorbGF0ZV9pbml0Y2FsbChyYW1fY29uc29sZV9sYXRlX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNjhjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpAQCAtMCwwICsxLDE3NyBAQAorLyogZHJpdmVycy9taXNjL3RpbWVkX2dwaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlICJ0aW1lZF9ncGlvLmgiCisKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqdGltZWRfZ3Bpb19jbGFzczsKKworc3RydWN0IHRpbWVkX2dwaW9fZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgCQltYXhfdGltZW91dDsKKwl1OCAJCWFjdGl2ZV9sb3c7Cit9OworCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgZ3Bpb190aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEsIHRpbWVyKTsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdGEtPmdwaW8sIGdwaW9fZGF0YS0+YWN0aXZlX2xvdyA/IDEgOiAwKTsKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdwaW9fZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZW1haW5pbmc7CisKKwlpZiAoaHJ0aW1lcl9hY3RpdmUoJmdwaW9fZGF0YS0+dGltZXIpKSB7CisJCWt0aW1lX3QgciA9IGhydGltZXJfZ2V0X3JlbWFpbmluZygmZ3Bpb19kYXRhLT50aW1lcik7CisJCXJlbWFpbmluZyA9IHIudHYuc2VjICogMTAwMCArIHIudHYubnNlYyAvIDEwMDAwMDA7CisJfSBlbHNlCisJCXJlbWFpbmluZyA9IDA7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVtYWluaW5nKTsKK30KKworc3RhdGljIHNzaXplX3QgZ3Bpb19lbmFibGVfc3RvcmUoCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHZhbHVlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzc2NhbmYoYnVmLCAiJWQiLCAmdmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGF0YS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FuY2VsIHByZXZpb3VzIHRpbWVyIGFuZCBzZXQgR1BJTyBhY2NvcmRpbmcgdG8gdmFsdWUgKi8KKwlocnRpbWVyX2NhbmNlbCgmZ3Bpb19kYXRhLT50aW1lcik7CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0YS0+Z3BpbywgZ3Bpb19kYXRhLT5hY3RpdmVfbG93ID8gIXZhbHVlIDogISF2YWx1ZSk7CisKKwlpZiAodmFsdWUgPiAwKSB7CisJCWlmICh2YWx1ZSA+IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQpCisJCQl2YWx1ZSA9IGdwaW9fZGF0YS0+bWF4X3RpbWVvdXQ7CisKKwkJaHJ0aW1lcl9zdGFydCgmZ3Bpb19kYXRhLT50aW1lciwKKwkJCQkJCWt0aW1lX3NldCh2YWx1ZSAvIDEwMDAsICh2YWx1ZSAlIDEwMDApICogMTAwMDAwMCksCisJCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2RhdGEtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgZ3Bpb19lbmFibGVfc2hvdywgZ3Bpb19lbmFibGVfc3RvcmUpOworCitzdGF0aWMgaW50IHRpbWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0aW1lZF9ncGlvICpjdXJfZ3BpbzsKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEsICpncGlvX2RhdDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmICghcGRhdGEpCisJCXJldHVybiAtRUJVU1k7CisKKwlncGlvX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspIHsKKwkJY3VyX2dwaW8gPSAmcGRhdGEtPmdwaW9zW2ldOworCQlncGlvX2RhdCA9ICZncGlvX2RhdGFbaV07CisKKwkJaHJ0aW1lcl9pbml0KCZncGlvX2RhdC0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJCWdwaW9fZGF0LT50aW1lci5mdW5jdGlvbiA9IGdwaW9fdGltZXJfZnVuYzsKKwkJc3Bpbl9sb2NrX2luaXQoJmdwaW9fZGF0LT5sb2NrKTsKKworCQlncGlvX2RhdC0+Z3BpbyA9IGN1cl9ncGlvLT5ncGlvOworCQlncGlvX2RhdC0+bWF4X3RpbWVvdXQgPSBjdXJfZ3Bpby0+bWF4X3RpbWVvdXQ7CisJCWdwaW9fZGF0LT5hY3RpdmVfbG93ID0gY3VyX2dwaW8tPmFjdGl2ZV9sb3c7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdC0+Z3BpbywgZ3Bpb19kYXQtPmFjdGl2ZV9sb3cpOworCisJCWdwaW9fZGF0LT5kZXYgPSBkZXZpY2VfY3JlYXRlKHRpbWVkX2dwaW9fY2xhc3MsICZwZGV2LT5kZXYsIDAsICIlcyIsIGN1cl9ncGlvLT5uYW1lKTsKKwkJaWYgKHVubGlrZWx5KElTX0VSUihncGlvX2RhdC0+ZGV2KSkpCisJCQlyZXR1cm4gUFRSX0VSUihncGlvX2RhdC0+ZGV2KTsKKworCQlkZXZfc2V0X2RydmRhdGEoZ3Bpb19kYXQtPmRldiwgZ3Bpb19kYXQpOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZ3Bpb19kYXQtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lZF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZShncGlvX2RhdGFbaV0uZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoZ3Bpb19kYXRhW2ldLmRldik7CisJfQorCisJa2ZyZWUoZ3Bpb19kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1lZF9ncGlvX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdGltZWRfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpbWVkX2dwaW9fcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAidGltZWQtZ3BpbyIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGltZWRfZ3Bpb19pbml0KHZvaWQpCit7CisJdGltZWRfZ3Bpb19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInRpbWVkX291dHB1dCIpOworCWlmIChJU19FUlIodGltZWRfZ3Bpb19jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHRpbWVkX2dwaW9fY2xhc3MpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRpbWVkX2dwaW9fZXhpdCh2b2lkKQoreworCWNsYXNzX2Rlc3Ryb3kodGltZWRfZ3Bpb19jbGFzcyk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGltZWRfZ3Bpb19pbml0KTsKK21vZHVsZV9leGl0KHRpbWVkX2dwaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBncGlvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmgKQEAgLTAsMCArMSwzMSBAQAorLyogaW5jbHVkZS9saW51eC90aW1lZF9ncGlvLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisqLworCisjaWZuZGVmIF9MSU5VWF9USU1FRF9HUElPX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVEX0dQSU9fSAorCitzdHJ1Y3QgdGltZWRfZ3BpbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCAJZ3BpbzsKKwlpbnQgICAgIG1heF90aW1lb3V0OworCXU4IAkJYWN0aXZlX2xvdzsKK307CisKK3N0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgeworCWludCAJCW51bV9ncGlvczsKKwlzdHJ1Y3QgdGltZWRfZ3BpbyAqZ3Bpb3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZkYmIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIEFTVVNfT0xFRAorCXRyaXN0YXRlICJBc3VzIE9MRUQgZHJpdmVyIgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWY5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI5NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9SRUFETUUKQEAgLTAsMCArMSwxNTYgQEAKKworICAgIERyaXZlciBmb3IgQXN1cyBPTEVEIGRpc3BsYXkgcHJlc2VudCBpbiBzb21lIEFzdXMgbGFwdG9wcy4KKworICAgIFRoZSBjb2RlIG9mIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uICdhc3Vzb2xlZCcgcHJvZ3JhbSB0YWtlbiBmcm9tCisgICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L2FzdXNvbGVkLy4gSSBqdXN0IHdhbnRlZCB0byBoYXZlIGEgc2ltcGxlCisgICAga2VybmVsIGRyaXZlciBmb3IgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UsIGJ1dCBJIGRpZG4ndCBrbm93IGhvdworICAgIHRvIGRvIHRoYXQuIE5vdyBJIGtub3cgOykgQWxzbywgdGhhdCBwcm9ncmFtIGNhbiBub3QgYmUgdXNlZAorICAgIHdpdGggdXNiaGlkIGxvYWRlZCwgd2hpY2ggbWVhbnMgbm8gVVNCIG1vdXNlL2tleWJvYXJkIHdoaWxlCisgICAgY29udHJvbGxpbmcgT0xFRCBkaXNwbGF5IDooCisKKyAgICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gQXN1cyBHMSBhbmQgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtcywKKyAgICBidXQgSSBkb24ndCBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCBkbyBhbnl0aGluZyB3cm9uZyA6KQorCisgICAgSXQgY2FuIChhbmQgcHJvYmFibHkgZG9lcykgaGF2ZSBlcnJvcnMuIEl0IGlzIHVzYWJsZQorICAgIGluIG15IGNhc2UsIGFuZCBJIGhvcGUgb3RoZXJzIHdpbGwgZmluZCBpdCB1c2VmdWwgdG9vIQorCisqKioqKioqCisKK0J1aWxkaW5nIHRoZSBtb2R1bGUKKworICAgVG8gYnVpbGQgdGhlIG1vZHVsZSB5b3UgbmVlZCBrZXJuZWwgMi42IGluY2x1ZGUgZmlsZXMgYW5kIHNvbWUgQyBjb21waWxlci4KKworICAgSnVzdCBydW46CisgICBtYWtlCisgICBtYWtlIGluc3RhbGwgKGFzIGEgcm9vdCkKKworICAgSXQgd2lsbCBidWlsZCAoaG9wZWZ1bGx5KSB0aGUgbW9kdWxlIGFuZCBpbnN0YWxsIGl0IGluCisgICAvbGliL21vZHVsZXMvJ3VuYW1lIC1yJy9leHRyYS9hc3VzX29sZWQua28uCisKKyAgIFRvIGxvYWQgaXQganVzdCB1c2U6CisgICBtb2Rwcm9iZSBhc3VzX29sZWQKKworICAgWW91IGNhbiBjaGVjayBpZiBpdCBoYXMgZGV0ZWN0ZWQgeW91ciBPTEVEIGRpc3BsYXkgYnkgbG9va2luZyBpbnRvIGRtZXNnIG91dHB1dC4KKyAgIFRoZXJlIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgYXN1cy1vbGVkIDItNzoxLjA6IEF0dGFjaGVkIEFzdXMgT0xFRCBkZXZpY2UKKworICAgSWYgaXQgZG9lc24ndCBmaW5kIHlvdXIgZGlzcGxheSwgeW91IGNhbiB0cnkgcmVtb3ZpbmcgdXNiaGlkIG1vZHVsZS4KKyAgIElmIHlvdSBhZGQgYXN1c19vbGVkIGludG8gdGhlIGxpc3Qgb2YgbW9kdWxlcyBsb2FkZWQgZHVyaW5nIHN5c3RlbSBib290CisgICBiZWZvcmUgdXNiaGlkLCBpdCB3aWxsIHdvcmsgZXZlbiB3aGVuIHVzYmhpZCBpcyBwcmVzZW50LgorCisgICBJZiBpdCBzdGlsbCBkb2Vzbid0IGRldGVjdCB5b3VyIGhhcmR3YXJlLCBjaGVjayBsc3VzYiBvdXRwdXQuCisgICBUaGVyZSBzaG91bGQgYmUgc2ltaWxhciBsaW5lOgorICAgQnVzIDAwMiBEZXZpY2UgMDA1OiBJRCAwYjA1OjE3MjYgQVNVU1RlayBDb21wdXRlciwgSW5jLgorCisgICBJZiB5b3UgZG9uJ3Qgc2VlIGFueSBsaW5lcyB3aXRoICcwYjA1OjE3MjYnIGl0IG1lYW5zIHRoYXQgeW91IGhhdmUgZGlmZmVyZW50CisgICB0eXBlIG9mIGhhcmR3YXJlIHRoYXQgaXMgbm90IGRldGVjdGVkIChpdCBtYXkgb3IgbWF5IG5vdCB3b3JrLCBidXQgdGhlIGRyaXZlcgorICAga25vd3Mgb25seSAnMGIwNToxNzI2JyBkZXZpY2UpLgorCisqKioqKioqCisKK0NvbmZpZ3VyYXRpb24KKworICAgVGhlcmUgaXMgb25seSBvbmUgb3B0aW9uOiBzdGFydF9vZmYuCisgICBZb3UgY2FuIHVzZSBpdCBieTogJ21vZHByb2JlIGFzdXNfb2xlZCBzdGFydF9vZmY9MScsIG9yIGJ5IGFkZGluZyB0aGlzCisgICBsaW5lIHRvIC9ldGMvbW9kcHJvYmUuY29uZjoKKyAgIG9wdGlvbnMgYXN1c19vbGVkIHN0YXJ0X29mZj0xCisKKyAgIFdpdGggdGhpcyBvcHRpb24gcHJvdmlkZWQsIGFzdXNfb2xlZCBkcml2ZXIgd2lsbCBzd2l0Y2ggb2ZmIHRoZSBkaXNwbGF5CisgICB3aGVuIGl0IGlzIGRldGVjdGVkIGFuZCBhdHRhY2hlZC4gSXQgaXMgbmljZSBmZWF0dXJlIHRvIGp1c3Qgc3dpdGNoIG9mZiB0aGUgJ0FTVVMnCisgICBsb2dvLiBJZiB5b3UgZG9uJ3QgdXNlIHRoZSBkaXNwbGF5LCBpdCBpcyBwcm9iYWJseSB0aGUgZ29vZCBpZGVhIHRvIHN3aXRjaCBpdCBvZmYsCisgICB0byBwcm90ZWN0IE9MRURzIGZyb20gIndlYXJpbmcgb2ZmIi4KKworKioqKioqKgorCitVc2FnZQorCisgICBUaGlzIG1vZHVsZSBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHR3byBzcGVjaWFsIGZpbGVzOgorICAgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF9OL2VuYWJsZWQKKyAgIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfTi9waWN0dXJlCisKKyAgIChOIGlzIHRoZSBkZXZpY2UgbnVtYmVyLCB0aGUgZmlyc3QsIGFuZCBwcm9iYWJseSB0aGUgb25seSwgaGFzIG51bWJlciAxLAorICAgIHNvIGl0IGlzIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9lbmFibGVkCisgICAgYW5kIC9zeXMvY2xhc3MvYXN1c19vbGVkL29sZWRfMS9waWN0dXJlKQorCisgICAnZW5hYmxlZCcgZmlsZXMgaXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsICdwaWN0dXJlJyBpcyB3cml0ZWFibGUgb25seS4KKworICAgWW91IGNhbiB3cml0ZSAwIG9yIDEgdG8gJ2VuYWJsZWQnIGZpbGUsIHdoaWNoIHdpbGwgc3dpdGNoCisgICBvbiBhbmQgb2ZmIHRoZSBkaXNwbGF5LiBSZWFkaW5nIGZyb20gdGhpcyBmaWxlIHdpbGwgdGVsbCB5b3UgdGhlIGxhc3QKKyAgIHN0YXR1cyBzZXQsIGVpdGhlciAwIG9yIDEuIEJ5IGRlZmF1bHQgaXQgaXMgMSwgc28gaWYgdGhlIGRldmljZSB3YXMgc2V0IHRvICdvZmYnLAorICAgYW5kIHRoZSBjb21wdXRlciB3YXMgcmVib290ZWQgd2l0aG91dCBwb3dlci1vZmYsIHRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gd3JvbmcKKyAgIHZhbHVlIC0gYmVjYXVzZSB0aGUgZGV2aWNlIGlzIG9mZiwgYnV0IGhhc24ndCBiZWVuIGRpc2FibGVkIHRoaXMgdGltZSBhbmQgaXMKKyAgIGFzc3VtZWQgdG8gYmUgb24uLi4KKworICAgVG8gJ3BpY3R1cmUnIGZpbGUgeW91IHdyaXRlIHBpY3R1cmVzIHRvIGJlIGRpc3BsYXllZCBieSB0aGUgT0xFRCBkZXZpY2UuCisgICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlOgorICAgPE06V3hIPgorICAgMDAwMDExMTAwMTAxMTEwMDAKKyAgIDAwMDEwMTAxMDEwMTAxMDEwCisgICAuLi4uCisKKyAgIEZpcnN0IGxpbmUgaXMgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4gTWVhbmluZyBvZiBmaWVsZHMgaW4gPE06V3hIPjoKKyAgIE0gLSBwaWN0dXJlIG1vZGUuIEl0IGNhbiBiZSBlaXRoZXIgJ3MnIGZvciBzdGF0aWMgcGljdHVyZXMsCisgICAgICAgJ3InIGZvciByb2xsaW5nIHBpY3R1cmVzLCBhbmQgJ2YnIGZvciBmbGFzaGluZyBwaWN0dXJlcy4KKyAgIFcgLSB3aWR0aCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMTc5MgorICAgSCAtIGhlaWdodCBvZiB0aGUgcGljdHVyZS4gTWF5IGJlIGJldHdlZW4gMSBhbmQgMzIKKworICAgRm9yIGV4YW1wbGUgPHM6MTI4eDMyPiBtZWFucyBzdGF0aWMgcGljdHVyZSwgMTI4IHBpeGVscyBsb25nIGFuZCAzMiBwaXhlbHMgaGlnaC4KKworICAgVGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIGRpc3BsYXkgaXMgMTI4eDMyIHBpeGVscy4gU3RhdGljIGFuZCBmbGFzaGluZyBwaWN0dXJlcworICAgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhhdCAoYWN0dWFsbHkgdGhleSBjYW4sIGJ1dCBvbmx5IHBhcnQgb2YgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCA7KSApCisKKyAgIElmIHRoZSBwaWN0dXJlIGlzIHNtYWxsZXIgdGhhbiAxMjh4MzIgaXQgd2lsbCBiZSBjZW50ZXJlZC4gUm9sbGluZyBwaWN0dXJlcyB3aWRlciB0aGFuCisgICAxMjggcGl4ZWxzIHdpbGwgYmUgY2VudGVyZWQgdG9vLCB1bmxlc3MgdGhlaXIgd2lkdGggPSBuKjEyOC4gVmVydGljYWxseSB0aGV5IHdpbGwgYmUKKyAgIGNlbnRlcmVkIGp1c3QgbGlrZSBzdGF0aWMgcGljdHVyZXMsIGlmIHRoZWlyIGhlaWdodCBpcyBzbWFsbGVyIHRoYW4gMzIuCisKKyAgIEZsYXNoaW5nIHBpY3R1cmVzIHdpbGwgYmUgY2VudGVyZWQgaG9yaXpvbnRhbGx5IGlmIHRoZWlyIHdpZHRoIDwgMTI4LCBidXQgdGhleSB3ZXJlCisgICBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGluIGEgZGlmZmVyZW50IHdheS4gSWYgdGhlaXIgaGVpZ2h0IDwgMTYsIHRoZXkgd2lsbCBiZSBjZW50ZXJlZAorICAgaW4gdGhlIHVwcGVyIGhhbGYgb2YgdGhlIGRpc3BsYXkgKHJvd3MgMC0xNSkuIFRoaXMgaXMgYmVjYXVzZSBvbmx5IHRoZSBmaXJzdCBoYWxmCisgICBvZiBmbGFzaGluZyBwaWN0dXJlcyBpcyB1c2VkIGZvciBmbGFzaGluZy4gV2hlbiB0aGUgcGljdHVyZSB3aXRoIGhlaWdoID0gMzIgaXMKKyAgIGRpc3BsYXllZCBpbiBmbGFzaGluZyBtb2RlLCBpdHMgdXBwZXIgMTYgcm93cyB3aWxsIGJlIGZsYXNoaW5nIGluIHRoZSB1cHBlciBoYWxmCisgICBvZiB0aGUgZGlzcGxheSwgYW5kIHRoZSBsb3dlciBoYWxmIHdpbGwgYmUgZW1wdHkuIEFmdGVyIGZldyBzZWNvbmRzIHVwcGVyIHBhcnQgd2lsbAorICAgc3RvcCBmbGFzaGluZyAoYnV0IHRoYXQgcGFydCBvZiB0aGUgcGljdHVyZSB3aWxsIHJlbWFpbiB0aGVyZSksIGFuZCB0aGUgbG93ZXIKKyAgIGhhbGYgb2YgdGhlIGRpc3BsYXkgd2lsbCBzdGFydCBkaXNwbGF5aW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHBpY3R1cmUKKyAgIGluIHJvbGxpbmcgbW9kZSwgdW5sZXNzIGl0IGlzIGVtcHR5LCBvciB0aGUgcGljdHVyZSB3YXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbgorICAgdXBwZXIgcGFydC4gSXQgaXMgbm90IG1pbmUgaWRlYSwgdGhpcyBpcyBqdXN0IHRoZSB3YXkgQXN1cycgZGlzcGxheSB3b3JrIDspCisgICBTbyBpZiB5b3UgbmVlZCBqdXN0IGZsYXNoaW5nLCB1c2UgYXQgbW9zdCAxMjh4MTYgcGljdHVyZS4gSWYgeW91IG5lZWQgZmxhc2hpbmcgYW5kCisgICByb2xsaW5nLCB1c2Ugd2hvbGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKworICAgTGluZXMgZm9sbG93aW5nIHRoZSBmaXJzdCwgY29uZmlndXJhdGlvbiwgbGluZSBhcmUgcGljdHVyZSBkYXRhLiBFYWNoICcxJyBtZWFucworICAgdGhhdCB0aGUgcGl4ZWwgaXMgbGl0LCBhbmQgJzAnIG1lYW5zIHRoYXQgaXQgaXMgbm90LiBZb3UgY2FuIGFsc28gdXNlICcjJyBhcyBPTiwKKyAgIGFuZCAnICcgKHNwYWNlKSBhcyBPRkYuIEVtcHR5IGxpbmVzIGFuZCBhbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgaWdub3JlZC4KKworICAgSXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZXZlcnl0aGluZyBpbiBvbmUgbGluZSA8TTpXeEg+MDEwMTAxMDEwMTAxMDEwMTAuLi4sCisgICBhbmQgVypIIGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGNoYXJhY3RlcnMsIG5vdGhpbmcgd2lsbCBiZQorICAgZGlzcGxheWVkLiBIb3dldmVyLCB0aGUgJ2xpbmUgbW9kZScgaXMgZWFzaWVyIHRvIHJlYWQgKGFuZCB3cml0ZSksIGFuZCBpdCBhbHNvCisgICBsZXRzIHRvIG9taXQgcGFydHMgb2YgZGF0YS4gV2hlbmV2ZXIgRW5kLU9mLUxpbmUgY2hhcmFjdGVyIGlzIGZvdW5kLCBidXQKKyAgIHRoZSBsaW5lIGlzIG5vdCBXIGNoYXJhY3RlcnMgbG9uZywgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBtaXNzaW5nIGNoYXJhY3RlcnMKKyAgIGFyZSBlcXVhbCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUuCisKKyAgIEZvbGxvd2luZyBsaW5lIHJlcHJlc2VudHMgJzAnLCAnMScgYW5kIGEgbG90cyBvZiAnMCdzLCBkZXBlbmRuZyBvbiB0aGUgd2lkdGggb2YgdGhlIHBpY3R1cmUKKyAgIHByb3ZpZGVkIGluIGNvbmZpZ3VyYXRpb24gZGF0YToKKyAgIDAxMAorCisgICBTbyBpZiB5b3UgbmVlZCBlbXB0eSBsaW5lLCBpdCBpcyBzdWZmaWNpZW50IHRvIHdyaXRlIGxpbmUgd2l0aCBvbmx5IG9uZSAnMCcgaW4gaXQuCisgICBUaGUgc2FtZSB3b3JrcyB3aXRoICcxJyAob3IgJyAnIGFuZCAnIycpLgorCisgICBJZiB0aGVyZSBhcmUgdG9vIG1hbnkgZGF0YSBpbiB0aGUgZmlsZSwgdGhleSB3aWxsIGJlIGlnbm9yZWQuIElmIHlvdSBhcmUgbm90IHN1cmUKKyAgIGhvdyBtYW55IGNoYXJhY3RlcnMgeW91IGFyZSBtaXNzaW5nLCB5b3UgY2FuIGFkZCBmZXcgbGluZXMgd2l0aCBvbmUgemVybyBpbiBlYWNoIG9mIHRoZW0uCisKKyAgIFRoZXJlIGFyZSBzb21lIGV4YW1wbGUgcGljdHVyZXMgaW4gLnR4dCBmb3JtYXQsIHRoYXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgIGNhdCBmb28udHh0ID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL3BpY3R1cmUKKworICAgSWYgdGhlIGRpc3BsYXkgaXMgc3dpdGNoZWQgb2ZmIHlvdSBhbHNvIG5lZWQgdG8gcnVuOgorICAgZWNobyAxID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKyAgIFRvIHN3aXRjaCBpdCBvZmYsIGp1c3QgdXNlOgorICAgZWNobyAwID4gL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKworCisqKioqKioqCisKKyAgIEZvciBhbnkgYWRkaXRpb25hbCBpbmZvIHBsZWFzZSBoYXZlIGEgbG9vayBhdCBodHRwOi8vbGFwc3VzLmJlcmxpb3MuZGUvYXN1c19vbGVkLmh0bWwKKworCisKKyAgIEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIHNwYXJzZSBmaXhlcworCS0gYXVkaXQgdGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UKKwkJLSBzeXNmcyB2cy4gY2hhcj8KKwktIERvY3VtZW50YXRpb24vQUJJLyBuZWVkcyB0byBiZSBhZGRlZAorCS0gcHV0IHRoZSBzYW1wbGUgLnR4dCBmaWxlcyBhbmQgUkVBRE1FIGZpbGUgc29tZXdoZXJlLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorQ2M6IEpha3ViIFNjaG1pZHRrZSA8c2pha3ViQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmExODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogIEFzdXMgT0xFRCBVU0IgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNywyMDA4IEpha3ViIFNjaG1pZHRrZSAoc2pha3ViQGdtYWlsLmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKgorICoKKyAqICBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB1c2JsZWQgYW5kIGFzdXMtbGFwdG9wIG1vZHVsZXMuCisgKgorICoKKyAqICBBc3VzIE9MRUQgc3VwcG9ydCBpcyBiYXNlZCBvbiBhc3Vzb2xlZCBwcm9ncmFtIHRha2VuIGZyb20KKyAqICBodHRwczovL2xhdW5jaHBhZC5uZXQvYXN1c29sZWQvLgorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjZGVmaW5lIEFTVVNfT0xFRF9WRVJTSU9OCQkiMC4wNC1kZXYiCisjZGVmaW5lIEFTVVNfT0xFRF9OQU1FCQkJImFzdXMtb2xlZCIKKyNkZWZpbmUgQVNVU19PTEVEX1VOREVSU0NPUkVfTkFNRQkiYXN1c19vbGVkIgorCisjZGVmaW5lIEFTVVNfT0xFRF9FUlJPUgkJCSJBc3VzIE9MRUQgRGlzcGxheSBFcnJvcjogIgorCisjZGVmaW5lIEFTVVNfT0xFRF9TVEFUSUMJCSdzJworI2RlZmluZSBBU1VTX09MRURfUk9MTAkJCSdyJworI2RlZmluZSBBU1VTX09MRURfRkxBU0gJCQknZicKKworI2RlZmluZSBBU1VTX09MRURfTUFYX1dJRFRICQkxNzkyCisjZGVmaW5lIEFTVVNfT0xFRF9ESVNQX0hFSUdIVAkJMzIKKyNkZWZpbmUgQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRQkyNTYKKworTU9EVUxFX0FVVEhPUigiSmFrdWIgU2NobWlkdGtlLCBzamFrdWJAZ21haWwuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFzdXMgT0xFRCBEcml2ZXIgdiIgQVNVU19PTEVEX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IGNsYXNzICpvbGVkX2NsYXNzID0gMDsKK3N0YXRpYyBpbnQgb2xlZF9udW0gPSAwOworCitzdGF0aWMgdWludCBzdGFydF9vZmYgPSAwOworCittb2R1bGVfcGFyYW0oc3RhcnRfb2ZmLCB1aW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhzdGFydF9vZmYsICJTZXQgdG8gMSB0byBzd2l0Y2ggb2ZmIE9MRUQgZGlzcGxheSBhZnRlciBpdCBpcyBhdHRhY2hlZCIpOworCit0eXBlZGVmIGVudW0geworCVBBQ0tfTU9ERV9HMSwKKwlQQUNLX01PREVfRzUwLAorCVBBQ0tfTU9ERV9MQVNUCit9IG9sZWRfcGFja19tb2RlX3Q7CisKK3N0cnVjdCBvbGVkX2Rldl9kZXNjX3N0ciB7CisJdWludDE2X3QJCWlkVmVuZG9yOworCXVpbnQxNl90CQlpZFByb2R1Y3Q7CisJdWludDE2X3QJCWRldldpZHRoOyAvLyB3aWR0aCBvZiBkaXNwbGF5CisJb2xlZF9wYWNrX21vZGVfdAlwYWNrTW9kZTsgLy8gZm9ybXVsYSB0byBiZSB1c2VkIHdoaWxlIHBhY2tpbmcgdGhlIHBpY3R1cmUKKwljb25zdCBjaGFyCQkqZGV2RGVzYzsKK307CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3MjYpIH0sIC8vIEFzdXMgRzEvRzIgKGFuZCB2YXJpYW50cykKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3NWIpIH0sIC8vIEFzdXMgRzUwViAoYW5kIHBvc3NpYmx5IG90aGVycyAtIEc3MD8gRzcxPykKKwl7IH0sCit9OworCisvKiBwYXJhbWV0ZXJzIG9mIHNwZWNpZmljIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2xlZF9kZXZfZGVzY19zdHIgb2xlZF9kZXZfZGVzY190YWJsZSBbXSA9IHsKKwl7IDB4MGIwNSwgMHgxNzI2LCAxMjgsIFBBQ0tfTU9ERV9HMSwgIkcxL0cyIiB9LAorCXsgMHgwYjA1LCAweDE3NWIsIDI1NiwgUEFDS19NT0RFX0c1MCwgIkc1MCIgfSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlKTsKKworI2RlZmluZSBTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgdmFsMSwgdmFsMiwgdmFsMywgdmFsNCwgdmFsNSwgdmFsNiwgdmFsNykgXAorCWRvIHsJCQkJCVwKKwkJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSk7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMSA9IDB4NTU7CQlcCisJCXBhY2tldC0+aGVhZGVyLm1hZ2ljMiA9IDB4YWE7CQlcCisJCXBhY2tldC0+aGVhZGVyLmZsYWdzID0gdmFsMTsJCVwKKwkJcGFja2V0LT5oZWFkZXIudmFsdWUzID0gdmFsMjsJCVwKKwkJcGFja2V0LT5oZWFkZXIuYnVmZmVyMSA9IHZhbDM7CQlcCisJCXBhY2tldC0+aGVhZGVyLmJ1ZmZlcjIgPSB2YWw0OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTYgPSB2YWw1OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTcgPSB2YWw2OwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTggPSB2YWw3OwkJXAorCX0gd2hpbGUoMCk7CisKK3N0cnVjdCBhc3VzX29sZWRfaGVhZGVyIHsKKwl1aW50OF90CQltYWdpYzE7CisJdWludDhfdAkJbWFnaWMyOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXZhbHVlMzsKKwl1aW50OF90CQlidWZmZXIxOworCXVpbnQ4X3QJCWJ1ZmZlcjI7CisJdWludDhfdAkJdmFsdWU2OworCXVpbnQ4X3QJCXZhbHVlNzsKKwl1aW50OF90CQl2YWx1ZTg7CisJdWludDhfdAkJcGFkZGluZzJbN107Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgeworCXN0cnVjdCBhc3VzX29sZWRfaGVhZGVyCQloZWFkZXI7CisJdWludDhfdAkJCQliaXRtYXBbQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRV07Cit9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKworc3RydWN0IGFzdXNfb2xlZF9kZXYgeworCXN0cnVjdCB1c2JfZGV2aWNlICoJdWRldjsKKwl1aW50OF90CQkJcGljX21vZGU7CisJdWludDE2X3QJCWRldl93aWR0aDsKKwlvbGVkX3BhY2tfbW9kZV90CXBhY2tfbW9kZTsKKwlzaXplX3QJCQloZWlnaHQ7CisJc2l6ZV90CQkJd2lkdGg7CisJc2l6ZV90CQkJeF9zaGlmdDsKKwlzaXplX3QJCQl5X3NoaWZ0OworCXNpemVfdAkJCWJ1Zl9vZmZzOworCXVpbnQ4X3QJCQlsYXN0X3ZhbDsKKwlzaXplX3QJCQlidWZfc2l6ZTsKKwljaGFyCQkJKmJ1ZjsKKwl1aW50OF90CQkJZW5hYmxlZDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworfTsKKworc3RhdGljIHZvaWQgZW5hYmxlX29sZWQoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYsIHVpbnQ4X3QgZW5hYmwpCit7CisJaW50IGE7CisJaW50IHJldHZhbDsKKwlpbnQgYWN0X2xlbjsKKwlzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqIHBhY2tldDsKKworCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBhY2tldCkgeworCQlkZXZfZXJyKCZvZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCVNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwKTsKKworCWlmIChlbmFibCkgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFmOworCWVsc2UgcGFja2V0LT5iaXRtYXBbMF0gPSAweGFlOworCisJZm9yIChhPTA7IGE8MTsgYSsrKSB7CisJCXJldHZhbCA9IHVzYl9idWxrX21zZyhvZGV2LT51ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKG9kZXYtPnVkZXYsIDIpLAorCQkJcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfaGVhZGVyKSArIDEsCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmb2Rldi0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorCisJb2Rldi0+ZW5hYmxlZCA9IGVuYWJsOworCisJa2ZyZWUocGFja2V0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwllbmFibGVfb2xlZChvZGV2LCB0ZW1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3Nfc2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSAoc3RydWN0IGFzdXNfb2xlZF9kZXYgKikgZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZW5hYmxlX29sZWQob2RldiwgdGVtcCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgb2Rldi0+ZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX2dldF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvZGV2LT5lbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LAorCWNoYXIgKmJ1ZiwgdWludDhfdCBwX3R5cGUsIHNpemVfdCBwX251bSkKK3sKKwlzaXplX3QgaTsKKwlpbnQgYWN0X2xlbjsKKworCWZvciAoaSA9IDA7IGkgPCBwX251bTsgaSsrKSB7CisJCWludCByZXR2YWw7CisKKwkJc3dpdGNoIChwX3R5cGUpIHsKKwkJCWNhc2UgQVNVU19PTEVEX1JPTEw6CisJCQkJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIDB4NDAsIDB4ODAsIHBfbnVtLCBpICsgMSwgMHgwMCwgMHgwMSwgMHhmZik7CisJCQlicmVhazsKKwkJCWNhc2UgQVNVU19PTEVEX1NUQVRJQzoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDApOworCQkJYnJlYWs7CisJCQljYXNlIEFTVVNfT0xFRF9GTEFTSDoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHgxMCArIGksIDB4ODAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZmYpOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkocGFja2V0LT5iaXRtYXAsIGJ1ZiArIChBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKmkpLCBBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFKTsKKworCQlyZXR2YWwgPSB1c2JfYnVsa19tc2codWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1ZGV2LCAyKSwKKwkJCXBhY2tldCwKKwkJCXNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCQlpZiAocmV0dmFsKQorCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKnBhY2tldCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbiwgY2hhciAqYnVmLCB1aW50OF90IGIxLCB1aW50OF90IGIyLCB1aW50OF90IGIzLCB1aW50OF90IGI0LCB1aW50OF90IGI1LCB1aW50OF90IGI2KXsKKwlpbnQgcmV0dmFsOworCWludCBhY3RfbGVuOworCisJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIDB4MDApOworCW1lbWNweShwYWNrZXQtPmJpdG1hcCwgYnVmICsgb2Zmc2V0LCBsZW4pOworCisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKHVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodWRldiwgMiksCisJCQlwYWNrZXQsCisJCQlzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQpLAorCQkJJmFjdF9sZW4sCisJCQktMSk7CisKKwlpZiAocmV0dmFsKQorCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldHNfZzUwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LCBjaGFyICpidWYpCit7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAgICAgMCwgMHgxMDAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMSk7CisJc2VuZF9wYWNrZXQodWRldiwgcGFja2V0LCAweDEwMCwgMHgwODAsIGJ1ZiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHg4MCwgMHgwMCk7CisKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MTgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAxLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MjgwLCAweDEwMCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAyLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MzgwLCAweDA4MCwgYnVmLCAweDExLCAweDAwLCAweDAzLCAweDAzLCAweDgwLCAweDAwKTsKK30KKworCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYpCit7CisJc2l6ZV90IHBhY2tldF9udW0gPSBvZGV2LT5idWZfc2l6ZSAvIEFTVVNfT0xFRF9QQUNLRVRfQlVGX1NJWkU7CisJc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQgKiBwYWNrZXQ7CisKKwlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwYWNrZXQpIHsKKwkJZGV2X2Vycigmb2Rldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2Rldi0+cGFja19tb2RlPT1QQUNLX01PREVfRzEpeworCQkvLyBXaGVuIHNlbmRpbmcgcm9sbC1tb2RlIGRhdGEgdGhlIGRpc3BsYXkgdXBkYXRlZCBvbmx5IGZpcnN0IHBhY2tldC4KKwkJLy8gSSBoYXZlIG5vIGlkZWEgd2h5LCBidXQgd2hlbiBzdGF0aWMgcGljdHVyZSBpcyBzZW5kIGp1c3QgYmVmb3JlCisJCS8vIHJvbGxpbmcgcGljdHVyZSAtIGV2ZXJ5dGhpbmcgd29ya3MgZmluZS4KKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9ST0xMKQorCQkJc2VuZF9wYWNrZXRzKG9kZXYtPnVkZXYsIHBhY2tldCwgb2Rldi0+YnVmLCBBU1VTX09MRURfU1RBVElDLCAyKTsKKworCQkvLyBPbmx5IFJPTEwgbW9kZSBjYW4gdXNlIG1vcmUgdGhhbiAyIHBhY2tldHMuCisJCWlmIChvZGV2LT5waWNfbW9kZSAhPSBBU1VTX09MRURfUk9MTCAmJiBwYWNrZXRfbnVtID4gMikKKwkJCXBhY2tldF9udW0gPSAyOworCisJCXNlbmRfcGFja2V0cyhvZGV2LT51ZGV2LCBwYWNrZXQsIG9kZXYtPmJ1Ziwgb2Rldi0+cGljX21vZGUsIHBhY2tldF9udW0pOworCX0KKwllbHNlCisJaWYgKG9kZXYtPnBhY2tfbW9kZT09UEFDS19NT0RFX0c1MCl7CisJCXNlbmRfcGFja2V0c19nNTAob2Rldi0+dWRldiwgcGFja2V0LCBvZGV2LT5idWYpOworCX0KKworCWtmcmVlKHBhY2tldCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3ZhbHVlcyhzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgdWludDhfdCB2YWwsIHNpemVfdCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJaWYgKHZhbCkgeworCQkJc2l6ZV90IHggPSBvZGV2LT5idWZfb2ZmcyAlIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IHkgPSBvZGV2LT5idWZfb2ZmcyAvIG9kZXYtPndpZHRoOworCQkJc2l6ZV90IGk7CisKKwkJCXggKz0gb2Rldi0+eF9zaGlmdDsKKwkJCXkgKz0gb2Rldi0+eV9zaGlmdDsKKworCQkJc3dpdGNoKG9kZXYtPnBhY2tfbW9kZSkKKwkJCXsKKwkJCQljYXNlIFBBQ0tfTU9ERV9HMToKKwkJCQkJLy8gaSA9ICh4LzEyOCkqNjQwICsgMTI3IC0geCArICh5LzgpKjEyODsKKwkJCQkJLy8gVGhpcyBvbmUgZm9yIDEyOCBpcyB0aGUgc2FtZSwgYnV0IG1pZ2h0IGJlIGJldHRlciBmb3IgZGlmZmVyZW50IHdpZHRocz8KKwkJCQkJaSA9ICh4L29kZXYtPmRldl93aWR0aCkqNjQwICsgb2Rldi0+ZGV2X3dpZHRoIC0gMSAtIHggKyAoeS84KSpvZGV2LT5kZXZfd2lkdGg7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBBQ0tfTU9ERV9HNTA6CisJCQkJCWkgPSAgKG9kZXYtPmRldl93aWR0aCAtIDEgLSB4KS84ICsgeSpvZGV2LT5kZXZfd2lkdGgvODsKKwkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWkgPSAwOworCQkJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJVbmtub3duIE9MRUQgUGFjayBNb2RlOiAlZCFcbiIsIG9kZXYtPnBhY2tfbW9kZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpID49IG9kZXYtPmJ1Zl9zaXplKSB7CisJCQkJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiQnVmZmVyIG92ZXJmbG93ISBSZXBvcnQgYSBidWcgaW4gdGhlIGRyaXZlcjogb2ZmczogJWQgPj0gJWQgaTogJWQgKHg6ICVkIHk6ICVkKVxuIiwKKwkJCQkJKGludCkgb2Rldi0+YnVmX29mZnMsIChpbnQpIG9kZXYtPmJ1Zl9zaXplLCAoaW50KSBpLCAoaW50KSB4LCAoaW50KSB5KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJc3dpdGNoIChvZGV2LT5wYWNrX21vZGUpCisJCQl7CisJCQkJY2FzZSBQQUNLX01PREVfRzE6CisJCQkJCW9kZXYtPmJ1ZltpXSAmPSB+KDE8PCh5JTgpKTsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgUEFDS19NT0RFX0c1MDoKKwkJCQkJb2Rldi0+YnVmW2ldICY9IH4oMTw8KHglOCkpOworCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLy8gY2Fubm90IGdldCBoZXJlOyBzdG9wcyBnY2MgY29tcGxhaW5pbmcKKwkJCQk7CisJCQl9CisJCX0KKworCQlvZGV2LT5sYXN0X3ZhbCA9IHZhbDsKKwkJb2Rldi0+YnVmX29mZnMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgb2Rldl9zZXRfcGljdHVyZShzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IG9mZnMgPSAwLCBtYXhfb2ZmczsKKworCWlmIChjb3VudCA8IDEpIHJldHVybiAwOworCisJaWYgKHRvbG93ZXIoYnVmWzBdKSA9PSAnYicpeworCSAgICAvLyBiaW5hcnkgbW9kZSwgc2V0IHRoZSBlbnRpcmUgbWVtb3J5CisKKwkgICAgc2l6ZV90IGk7CisKKwkgICAgb2Rldi0+YnVmX3NpemUgPSAob2Rldi0+ZGV2X3dpZHRoICogQVNVU19PTEVEX0RJU1BfSEVJR0hUKSAvIDg7CisKKwkgICAgaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkgICAgb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkgICAgbWVtc2V0KG9kZXYtPmJ1ZiwgMHhmZiwgb2Rldi0+YnVmX3NpemUpOworCisJICAgIGZvciAoaT0xOyBpIDwgY291bnQgJiYgaTw9MzIqMzI7IGkrKyl7CisJCW9kZXYtPmJ1ZltpLTFdID0gYnVmW2ldOworCQlvZGV2LT5idWZfb2ZmcyA9IGktMTsKKwkgICAgfQorCisJICAgIG9kZXYtPndpZHRoPW9kZXYtPmRldl93aWR0aCAvIDg7CisJICAgIG9kZXYtPmhlaWdodD1BU1VTX09MRURfRElTUF9IRUlHSFQ7CisJICAgIG9kZXYtPnhfc2hpZnQ9MDsKKwkgICAgb2Rldi0+eV9zaGlmdD0wOworCSAgICBvZGV2LT5sYXN0X3ZhbD0wOworCisJICAgIHNlbmRfZGF0YShvZGV2KTsKKworCSAgICByZXR1cm4gY291bnQ7CisJfQorCisJaWYgKGJ1ZlswXSA9PSAnPCcpIHsKKwkJc2l6ZV90IGk7CisJCXNpemVfdCB3ID0gMCwgaCA9IDA7CisJCXNpemVfdCB3X21lbSwgaF9tZW07CisKKwkJaWYgKGNvdW50IDwgMTAgfHwgYnVmWzJdICE9ICc6JykgeworCQkJZ290byBlcnJvcl9oZWFkZXI7CisJCX0KKworCQlzd2l0Y2godG9sb3dlcihidWZbMV0pKSB7CisJCQljYXNlIEFTVVNfT0xFRF9TVEFUSUM6CisJCQljYXNlIEFTVVNfT0xFRF9ST0xMOgorCQkJY2FzZSBBU1VTX09MRURfRkxBU0g6CisJCQkJb2Rldi0+cGljX21vZGUgPSBidWZbMV07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgbW9kZTogJyVjJy5cbiIsIGJ1ZlsxXSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAzOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCXcgPSAxMCp3ICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAodyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJ3gnKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl93aWR0aDsKKwkJfQorCisJCWZvciAoKytpOyBpIDwgY291bnQ7ICsraSkgeworCQkJaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgeworCQkJCWggPSAxMCpoICsgKGJ1ZltpXSAtICcwJyk7CisKKwkJCQlpZiAoaCA+IEFTVVNfT0xFRF9ESVNQX0hFSUdIVCkgZ290byBlcnJvcl9oZWlnaHQ7CisJCQl9CisJCQllbHNlIGlmICh0b2xvd2VyKGJ1ZltpXSkgPT0gJz4nKSBicmVhazsKKwkJCWVsc2UgZ290byBlcnJvcl9oZWlnaHQ7CisJCX0KKworCQlpZiAodyA8IDEgfHwgdyA+IEFTVVNfT0xFRF9NQVhfV0lEVEgpIGdvdG8gZXJyb3Jfd2lkdGg7CisKKwkJaWYgKGggPCAxIHx8IGggPiBBU1VTX09MRURfRElTUF9IRUlHSFQpIGdvdG8gZXJyb3JfaGVpZ2h0OworCisJCWlmIChpID49IGNvdW50IHx8IGJ1ZltpXSAhPSAnPicpIGdvdG8gZXJyb3JfaGVhZGVyOworCisJCW9mZnMgPSBpKzE7CisKKwkJaWYgKHcgJSAob2Rldi0+ZGV2X3dpZHRoKSAhPSAwKQorCQkJd19tZW0gPSAody8ob2Rldi0+ZGV2X3dpZHRoKSArIDEpKihvZGV2LT5kZXZfd2lkdGgpOworCQllbHNlCisJCQl3X21lbSA9IHc7CisKKwkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQpCisJCQloX21lbSA9IEFTVVNfT0xFRF9ESVNQX0hFSUdIVDsKKwkJZWxzZQorCQkJaF9tZW0gPSBoOworCisJCW9kZXYtPmJ1Zl9zaXplID0gd19tZW0gKiBoX21lbSAvIDg7CisKKwkJaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKwkJb2Rldi0+YnVmID0ga21hbGxvYyhvZGV2LT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKG9kZXYtPmJ1ZiA9PSBOVUxMKSB7CisJCQlvZGV2LT5idWZfc2l6ZSA9IDA7CisJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJPdXQgb2YgbWVtb3J5IVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChvZGV2LT5idWYsIDB4ZmYsIG9kZXYtPmJ1Zl9zaXplKTsKKworCQlvZGV2LT5idWZfb2ZmcyA9IDA7CisJCW9kZXYtPndpZHRoID0gdzsKKwkJb2Rldi0+aGVpZ2h0ID0gaDsKKwkJb2Rldi0+eF9zaGlmdCA9IDA7CisJCW9kZXYtPnlfc2hpZnQgPSAwOworCQlvZGV2LT5sYXN0X3ZhbCA9IDA7CisKKwkJaWYgKG9kZXYtPnBpY19tb2RlID09IEFTVVNfT0xFRF9GTEFTSCkgeworCQkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQvMikKKwkJCQlvZGV2LT55X3NoaWZ0ID0gKEFTVVNfT0xFRF9ESVNQX0hFSUdIVC8yIC0gaCkvMjsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChoIDwgQVNVU19PTEVEX0RJU1BfSEVJR0hUKQorCQkJCW9kZXYtPnlfc2hpZnQgPSAoQVNVU19PTEVEX0RJU1BfSEVJR0hUIC0gaCkvMjsKKwkJfQorCisJCWlmICh3IDwgKG9kZXYtPmRldl93aWR0aCkpCisJCQlvZGV2LT54X3NoaWZ0ID0gKChvZGV2LT5kZXZfd2lkdGgpIC0gdykvMjsKKwl9CisKKwltYXhfb2ZmcyA9IG9kZXYtPndpZHRoICogb2Rldi0+aGVpZ2h0OworCisJd2hpbGUgKG9mZnMgPCBjb3VudCAmJiBvZGV2LT5idWZfb2ZmcyA8IG1heF9vZmZzKSB7CisJCWludCByZXQ7CisKKwkJaWYgKGJ1ZltvZmZzXSA9PSAnMScgfHwgYnVmW29mZnNdID09ICcjJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAxLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnMCcgfHwgYnVmW29mZnNdID09ICcgJykgeworCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCAwLCAxKSkgPCAwKSByZXR1cm4gcmV0OworCQl9CisJCWVsc2UgaWYgKGJ1ZltvZmZzXSA9PSAnXG4nKSB7CisJCQkvLyBOZXcgbGluZSBkZXRlY3RlZC4gTGV0cyBhc3N1bWUsIHRoYXQgYWxsIGNoYXJhY3RlcnMgdGlsbCB0aGUgZW5kIG9mIHRoZQorCQkJLy8gbGluZSB3ZXJlIGVxdWFsIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGlzIGxpbmUuCisJCQlpZiAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCAhPSAwKQorCQkJCWlmICggKHJldCA9IGFwcGVuZF92YWx1ZXMob2Rldiwgb2Rldi0+bGFzdF92YWwsCisJCQkJICAgICAgb2Rldi0+d2lkdGggLSAob2Rldi0+YnVmX29mZnMgJSBvZGV2LT53aWR0aCkpKSA8IDApIHJldHVybiByZXQ7CisJCX0KKworCQlvZmZzKys7CisJfQorCisJaWYgKG9kZXYtPmJ1Zl9vZmZzID49IG1heF9vZmZzKSBzZW5kX2RhdGEob2Rldik7CisKKwlyZXR1cm4gY291bnQ7CisKK2Vycm9yX3dpZHRoOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgd2lkdGggc3BlY2lmaWVkLlxuIik7CisJcmV0dXJuIC1FSU87CisKK2Vycm9yX2hlaWdodDoKKwlwcmludGsoQVNVU19PTEVEX0VSUk9SICJXcm9uZyBwaWN0dXJlIGhlaWdodCBzcGVjaWZpZWQuXG4iKTsKKwlyZXR1cm4gLUVJTzsKKworZXJyb3JfaGVhZGVyOgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgaGVhZGVyLlxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCisJcmV0dXJuIG9kZXZfc2V0X3BpY3R1cmUodXNiX2dldF9pbnRmZGF0YShpbnRmKSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNsYXNzX3NldF9waWN0dXJlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBvZGV2X3NldF9waWN0dXJlKChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKSwgYnVmLCBjb3VudCk7Cit9CisKKyNkZWZpbmUgQVNVU19PTEVEX0RFVklDRV9BVFRSKF9maWxlKQkJZGV2X2F0dHJfYXN1c19vbGVkXyMjX2ZpbGUKKworc3RhdGljIERFVklDRV9BVFRSKGFzdXNfb2xlZF9lbmFibGVkLCBTX0lXVUdPIHwgU19JUlVHTywgZ2V0X2VuYWJsZWQsIHNldF9lbmFibGVkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhc3VzX29sZWRfcGljdHVyZSwgU19JV1VHTyAsIE5VTEwsIHNldF9waWN0dXJlKTsKKworc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBjbGFzc19nZXRfZW5hYmxlZCwgY2xhc3Nfc2V0X2VuYWJsZWQpOworc3RhdGljIERFVklDRV9BVFRSKHBpY3R1cmUsIFNfSVdVR08sIE5VTEwsIGNsYXNzX3NldF9waWN0dXJlKTsKKworc3RhdGljIGludCBhc3VzX29sZWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwl1aW50MTZfdCBkZXZfd2lkdGggPSAwOworCW9sZWRfcGFja19tb2RlX3QgcGFja19tb2RlID0gUEFDS19NT0RFX0xBU1Q7CisJY29uc3Qgc3RydWN0IG9sZWRfZGV2X2Rlc2Nfc3RyICogZGV2X2Rlc2MgPSBvbGVkX2Rldl9kZXNjX3RhYmxlOworCWNvbnN0IGNoYXIgKmRlc2MgPSAwOworCisJaWYgKGlkID09IDApIHsKKwkJLy8gRXZlbiBwb3NzaWJsZT8gSnVzdCB0byBtYWtlIHN1cmUuLi4KKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJObyB1c2JfZGV2aWNlX2lkIHByb3ZpZGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoOyBkZXZfZGVzYy0+aWRWZW5kb3I7IGRldl9kZXNjKyspCisJeworCQlpZiAoZGV2X2Rlc2MtPmlkVmVuZG9yID09IGlkLT5pZFZlbmRvcgorCQkJJiYgZGV2X2Rlc2MtPmlkUHJvZHVjdCA9PSBpZC0+aWRQcm9kdWN0KQorCQl7CisJCQlkZXZfd2lkdGggPSBkZXZfZGVzYy0+ZGV2V2lkdGg7CisJCQlkZXNjID0gZGV2X2Rlc2MtPmRldkRlc2M7CisJCQlwYWNrX21vZGUgPSBkZXZfZGVzYy0+cGFja01vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggIWRlc2MgfHwgZGV2X3dpZHRoIDwgMSB8fCBwYWNrX21vZGUgPT0gUEFDS19NT0RFX0xBU1QpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJNaXNzaW5nIG9yIGluY29tcGxldGUgZGV2aWNlIGRlc2NyaXB0aW9uIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX2RldiksIEdGUF9LRVJORUwpOworCisJaWYgKG9kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CisJb2Rldi0+cGljX21vZGUgPSBBU1VTX09MRURfU1RBVElDOworCW9kZXYtPmRldl93aWR0aCA9IGRldl93aWR0aDsKKwlvZGV2LT5wYWNrX21vZGUgPSBwYWNrX21vZGU7CisJb2Rldi0+aGVpZ2h0ID0gMDsKKwlvZGV2LT53aWR0aCA9IDA7CisJb2Rldi0+eF9zaGlmdCA9IDA7CisJb2Rldi0+eV9zaGlmdCA9IDA7CisJb2Rldi0+YnVmX29mZnMgPSAwOworCW9kZXYtPmJ1Zl9zaXplID0gMDsKKwlvZGV2LT5sYXN0X3ZhbCA9IDA7CisJb2Rldi0+YnVmID0gTlVMTDsKKwlvZGV2LT5lbmFibGVkID0gMTsKKwlvZGV2LT5kZXYgPSAwOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBvZGV2KTsKKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWlmICgocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJkFTVVNfT0xFRF9ERVZJQ0VfQVRUUihwaWN0dXJlKSkpKSB7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCW9kZXYtPmRldiA9IGRldmljZV9jcmVhdGUob2xlZF9jbGFzcywgJmludGVyZmFjZS0+ZGV2LCBNS0RFVigwLDApLAorCQkJCU5VTEwsIm9sZWRfJWQiLCArK29sZWRfbnVtKTsKKworCWlmIChJU19FUlIob2Rldi0+ZGV2KSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKG9kZXYtPmRldik7CisJCWdvdG8gZXJyX2ZpbGVzOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShvZGV2LT5kZXYsIG9kZXYpOworCisJaWYgKCAocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpKSkgeworCQlnb3RvIGVycl9jbGFzc19lbmFibGVkOworCX0KKworCWlmICggKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKSkpIHsKKwkJZ290byBlcnJfY2xhc3NfcGljdHVyZTsKKwl9CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJBdHRhY2hlZCBBc3VzIE9MRUQgZGV2aWNlOiAlcyBbd2lkdGggJXUsIHBhY2tfbW9kZSAlZF1cbiIsIGRlc2MsIG9kZXYtPmRldl93aWR0aCwgb2Rldi0+cGFja19tb2RlKTsKKworCWlmIChzdGFydF9vZmYpCisJCWVuYWJsZV9vbGVkKG9kZXYsIDApOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGFzc19waWN0dXJlOgorCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKworZXJyX2NsYXNzX2VuYWJsZWQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZWQpOworCWRldmljZV91bnJlZ2lzdGVyKG9kZXYtPmRldik7CisKK2Vycl9maWxlczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKGVuYWJsZWQpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYob2Rldi0+dWRldik7CisJa2ZyZWUob2Rldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBhc3VzX29sZWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2OworCisJb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKworCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9waWN0dXJlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUob2Rldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCk7CisJZGV2aWNlX3VucmVnaXN0ZXIob2Rldi0+ZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICYgQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmIEFTVVNfT0xFRF9ERVZJQ0VfQVRUUihlbmFibGVkKSk7CisKKwl1c2JfcHV0X2RldihvZGV2LT51ZGV2KTsKKworCWlmIChvZGV2LT5idWYpIGtmcmVlKG9kZXYtPmJ1Zik7CisKKwlrZnJlZShvZGV2KTsKKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkRpc2Nvbm5lY3RlZCBBc3VzIE9MRUQgZGV2aWNlXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG9sZWRfZHJpdmVyID0geworCS5uYW1lID0JCUFTVVNfT0xFRF9OQU1FLAorCS5wcm9iZSA9CWFzdXNfb2xlZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWFzdXNfb2xlZF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBjbGFzcyAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FICIgJXNcbiIsIEFTVVNfT0xFRF9WRVJTSU9OKTsKK30KKworc3RhdGljIENMQVNTX0FUVFIodmVyc2lvbiwgU19JUlVHTywgdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIGludCBfX2luaXQgYXN1c19vbGVkX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlvbGVkX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FKTsKKworCWlmIChJU19FUlIob2xlZF9jbGFzcykpIHsKKwkJZXJyKCJFcnJvciBjcmVhdGluZyAiIEFTVVNfT0xFRF9VTkRFUlNDT1JFX05BTUUgIiBjbGFzcyIpOworCQlyZXR1cm4gUFRSX0VSUihvbGVkX2NsYXNzKTsKKwl9CisKKwlpZiAoKHJldHZhbCA9IGNsYXNzX2NyZWF0ZV9maWxlKG9sZWRfY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pKSkgeworCQllcnIoIkVycm9yIGNyZWF0aW5nIGNsYXNzIHZlcnNpb24gZmlsZSIpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb2xlZF9kcml2ZXIpOworCisJaWYgKHJldHZhbCkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIsIHJldHZhbCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZXJyb3I6CisJY2xhc3NfZGVzdHJveShvbGVkX2NsYXNzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXN1c19vbGVkX2V4aXQodm9pZCkKK3sKKwljbGFzc19yZW1vdmVfZmlsZShvbGVkX2NsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwljbGFzc19kZXN0cm95KG9sZWRfY2xhc3MpOworCisJdXNiX2RlcmVnaXN0ZXIoJm9sZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKGFzdXNfb2xlZF9pbml0KTsKK21vZHVsZV9leGl0IChhc3VzX29sZWRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NThiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjc0eDMyPgorMAorMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAxMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAxMTExMTEwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDExMTAwMDAxMTExMTExMTExMTAwMDAwMTExMTEwMDExMTExMTAwMDExMTExMTAxMTExMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMDExMTAwMDExMTExMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAxMDAxMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMTExMTAxMTAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAwMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMTExMTAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAxMTEwMDEwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTEwMDAwMAorMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDAxMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTExMTAwMDAKKzAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwCiswMDAwMTExMTAwMDAwMDAxMTEwMDExMTEwMTAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMDAwMTExMTAwMAorMDAwMTExMTEwMDAwMDExMTExMDAxMTEwMTEwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDExMTExMDAwMDAxMTAwMDAxMTExMDAKKzExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswCiswCiswCiswCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2YudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mLnR4dApAQCAtMCwwICsxLDE4IEBACis8ZjoxMjh4MTY+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZnIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGUyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2ZyLnR4dApAQCAtMCwwICsxLDMzIEBACis8ZjoxMjh4MzI+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDAwMTExMTExMTExMTAwMDAxMTExMDAxMTExMTAwMTExMTEwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMTExMTAwMDExMTEwMDAxMTEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMTExMDAwMDExMTEwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMTExMDAxMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMTAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDExMDAxMTEwMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMTExMTAwMTEwMTEwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAxMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTEwMDExMTEwMDExMTExMTAxMTExMTEwMDAxMTExMDExMTExMDExMTEwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIwNTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXgudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxzOjMyeDMyPgorMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDEgICAgICAgMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMSAgMTExICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgIDEgMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMTExMTExICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwCiswMDAwMDAwMDAwMSAgICAgIDExICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgMTExMTExMTEgICAgMTAwMDAwMDAKKzAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwCiswMDAwMDAwMDEgICAxMTExMTExMTEgICAgMTAwMDAwMAorMDAwMDAwMDAxICAxMTExMTExMTExICAgICAxMDAwMDAKKzAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwCiswMDAwMDAwMSAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDAxMSAxMTExMTExMTExMSAgICAgIDEwMDAwCiswMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMSAgMTExMSAgMTExMTExMTExMTExMTExIDEwMDAKKzAwMSAxMTExMTExICAxMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMAorMDAxIDExMTExMTExIDExMTExMSAgIDExMTExMTEgMTAKKzAwMSAxMTExMTExMSAgICAgICAgICAxMTExMSAgMTAwCiswMDEgIDExMTExMTEgICAgICAgICAgMTExICAxMTEwMAorMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMDAwMDAKKzAwMDAwMDExMSAgIDExMTExMTExMSAgICAxMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODFhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjozMngzMj4KKzAwMDAwMDAwMDAwMDAxMTExMTExMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDEgIDExMSAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgIDExMSAgICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgMSAxICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgICAgICAxMSAgICAxMDAwMDAwMDAKKzAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwCiswMDAwMDAwMDAxICAxMTExMTExMSAgICAgMTAwMDAwMAorMDAwMDAwMDAxICAgMTExMTExMTExICAgIDEwMDAwMDAKKzAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwCiswMDAwMDAwMSAgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMDAwMDEgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMAorMDAwMDExIDExICAxMTExMTExMTExMSAgICAxMDAwMDAKKzAwMDEgIDExMTEgIDExMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMAorMDAxIDExMTExMTEgIDExMTExMTEgIDExMTExMSAxMDAKKzAwMSAxMTExMTExMSAxMTExMTEgICAxMTExMTExIDEwCiswMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMAorMDAxICAxMTExMTExICAgICAgICAgIDExMSAgMTExMDAKKzAwMDExMSAgIDExMSAgIDExMTExICAxMSAgMTAwMDAwCiswMDAwMDAxMTEgICAxMTExMTExMTEgICAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfcjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGQ4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yMi50eHQKQEAgLTAsMCArMSwzMyBAQAorPHI6MjU2eDMyPgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxICAxMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMTExMDAwMDExMTExMTExMTExMDAwMDAxMTExMTAwMTExMTExMDAwMTExMTExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAxMTExMTAwMDAwMTExMTEwMDAxMTEwMDAxMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgIDExMTExMTExMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDExMDExMTAwMDAwMTExMTEwMDAxMTEwMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMTExMSAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDEwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAxMTAwMTExMTAxMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTExMTExMTExMTEgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDExMTAwMTExMTAxMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDEwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMTExMDExMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAxMTExMTAwMDAwMTEwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExICAxMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTExMTAwMDExMTEwMDAxMTExMTExMDExMTExMTEwMDAwMTExMTEwMTExMTExMDExMTExMDExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMTExMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgMTExMTExICAgMTExMTExMSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgICAgICAgICAgMTExMTEgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMSAgICAgICAgICAxMTEgIDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExICAgMTExMTExMTExICAgIDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3ppZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvemlnLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjoxMjh4MzI+CisxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwCiswMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMAorMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAKKzAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwCiswMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMAorMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAKKzAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwCiswMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMAorMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKaW5kZXggODYwNmY5Ni4uNGMwZTU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVVNCX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAzL2F0NzZjNTA1L2F0NzZjNTA1YSBVU0IgY2FyZHMiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQgorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IKIAlkZWZhdWx0IE4KIAlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwppbmRleCAxNzRlMmJlLi4xODU1MzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYwpAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBOaWNrIEpvbmVzCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBLYWxsZSBWYWxvIDxrYWxsZS52YWxvQGlraS5maT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtMTYsNiArMTcsMTMgQEAKICAqIEF0bWVsIEFUNzZDNTAzQS81MDUvNTA1QS4KICAqCiAgKiBTb21lIGl3X2hhbmRsZXIgY29kZSB3YXMgdGFrZW4gZnJvbSBhaXJvLmMsIChDKSAxOTk5IEJlbmphbWluIFJlZWQKKyAqCisgKiBUT0RPIGZvciB0aGUgbWFjODAyMTEgcG9ydDoKKyAqIG8gYWRob2Mgc3VwcG9ydAorICogbyBSVFMvQ1RTIHN1cHBvcnQKKyAqIG8gUG93ZXIgU2F2ZSBNb2RlIHN1cHBvcnQKKyAqIG8gc3VwcG9ydCBmb3Igc2hvcnQvbG9uZyBwcmVhbWJsZXMKKyAqIG8gZXhwb3J0IHZhcmlhYmxlcyB0aHJvdWdoIGRlYnVnZnMvc3lzZnMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzYsNyArNDQsNyBAQAogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAKICNpbmNsdWRlICJhdDc2X3VzYi5oIgogCkBAIC03NiwzMSArODQsNDMgQEAKICNkZWZpbmUgREJHX1dFX0VWRU5UUwkJMHgwODAwMDAwMAkvKiBkdW1wIHdpcmVsZXNzIGV2ZW50cyAqLwogI2RlZmluZSBEQkdfRlcJCQkweDEwMDAwMDAwCS8qIGZpcm13YXJlIGRvd25sb2FkICovCiAjZGVmaW5lIERCR19ERlUJCQkweDIwMDAwMDAwCS8qIGRldmljZSBmaXJtd2FyZSB1cGdyYWRlICovCisjZGVmaW5lIERCR19DTUQJCQkweDQwMDAwMDAwCisjZGVmaW5lIERCR19NQUM4MDIxMQkJMHg4MDAwMDAwMAogCiAjZGVmaW5lIERCR19ERUZBVUxUUwkJMAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KICNkZWZpbmUgYXQ3Nl9kYmcoYml0cywgZm9ybWF0LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpIFwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKQlcCiAJCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyBcCi0JfSB3aGlsZSAoMCkKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgYXQ3Nl9kYmdfZHVtcChiaXRzLCBidWYsIGxlbiwgZm9ybWF0LCBhcmcuLi4pCVwKK2RvIHsJXAorCWlmIChhdDc2X2RlYnVnICYgKGJpdHMpKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IFwKKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgYnVmLCBsZW4pOwlcCisJCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBhdDc2X2RlYnVnID0gREJHX0RFRkFVTFRTOwogCisjZGVmaW5lIEZJUk1XQVJFX0lTX1dQQSh2ZXIpICgodmVyLm1ham9yID09IDEpICYmICh2ZXIubWlub3IgPT0gMTAzKSkKKwogLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgZmlybXdhcmUgbG9hZGluZyBhbmQgcGFyc2luZyAqLwogc3RhdGljIHN0cnVjdCBtdXRleCBmd19tdXRleDsKIAogc3RhdGljIHN0cnVjdCBmd2VudHJ5IGZpcm13YXJlc1tdID0gewotCVswXSA9IHsiIn0sCi0JW0JPQVJEXzUwM19JU0wzODYxXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjEuYmluIn0sCi0JW0JPQVJEXzUwM19JU0wzODYzXSA9IHsiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIn0sCi0JW0JPQVJEXzUwM10gPSB7ImF0bWVsX2F0NzZjNTAzLXJmbWQuYmluIn0sCi0JW0JPQVJEXzUwM19BQ0NdID0geyJhdG1lbF9hdDc2YzUwMy1yZm1kLWFjYy5iaW4ifSwKLQlbQk9BUkRfNTA1XSA9IHsiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4ifSwKLQlbQk9BUkRfNTA1XzI5NThdID0geyJhdG1lbF9hdDc2YzUwNS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QV0gPSB7ImF0bWVsX2F0NzZjNTA1YS1yZm1kMjk1OC5iaW4ifSwKLQlbQk9BUkRfNTA1QU1YXSA9IHsiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4ifSwKKwlbMF0gPSB7ICIiIH0sCisJW0JPQVJEXzUwM19JU0wzODYxXSA9IHsgImF0bWVsX2F0NzZjNTAzLWkzODYxLmJpbiIgfSwKKwlbQk9BUkRfNTAzX0lTTDM4NjNdID0geyAiYXRtZWxfYXQ3NmM1MDMtaTM4NjMuYmluIiB9LAorCVtCT0FSRF81MDNdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwM19BQ0NdID0geyAiYXRtZWxfYXQ3NmM1MDMtcmZtZC1hY2MuYmluIiB9LAorCVtCT0FSRF81MDVdID0geyAiYXRtZWxfYXQ3NmM1MDUtcmZtZC5iaW4iIH0sCisJW0JPQVJEXzUwNV8yOTU4XSA9IHsgImF0bWVsX2F0NzZjNTA1LXJmbWQyOTU4LmJpbiIgfSwKKwlbQk9BUkRfNTA1QV0gPSB7ICJhdG1lbF9hdDc2YzUwNWEtcmZtZDI5NTguYmluIiB9LAorCVtCT0FSRF81MDVBTVhdID0geyAiYXRtZWxfYXQ3NmM1MDVhbXgtcmZtZC5iaW4iIH0sCiB9OwogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfREFUQShfX29wcykJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KShfX29wcykKQEAgLTExMCwxMzMgKzEzMCwxMzMgQEAKIAkgKiBhdDc2YzUwMy1pMzg2MQogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDMvMzg2MSBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi4xL3YyLjYgKi8KLQl7VVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBOZXRnZWFyIE1BMTAxIHJldi4gQSAqLwotCXtVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFRla3JhbSBVMzAwQyAvIEFsbG5ldCBBTEwwMTkzICovCi0Je1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MTIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSFAgSE4yMTBXIEo3ODAxQSAqLwotCXtVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDNmMCwgMHgwMTFjKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIFNpdGVjb20vWi1Db20vWnl4ZWwgTTRZLTc1MCAqLwotCXtVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIER5bmFsaW5rL0Fza2V5IFdMTDAxMyAoaW50ZXJzaWwpICovCi0Je1VTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRVogY29ubmVjdCAxMU1wYnMgV2lyZWxlc3MgVVNCIEFkYXB0ZXIgU01DMjY2MlcgdjEgKi8KLQl7VVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCZW5RIEFXTDMwMCAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFkZHRyb24gQVdVLTEyMCwgQ29tcGV4IFdMVTExICovCi0Je1VTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSW50ZWwgQVAzMTAgQW55UG9pbnQgSUkgVVNCICovCi0Je1VTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRHluYWxpbmsgTDExVSAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEFyZXNjb20gV0wtMjEwLCBGQ0MgaWQgMDdKLUdMMjQxMVVTQiAqLwotCXtVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ4ZSwgMHg3MTEwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEktTyBEQVRBIFdOLUIxMS9VU0IgKi8KLQl7VVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA0YmIsIDB4MDkxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBCVCBWb3lhZ2VyIDEwMTAgKi8KLQl7VVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDgyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKgogCSAqIGF0NzZjNTAzLWkzODYzCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy8zODYzIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYzKSB9LAogCS8qIFNhbXN1bmcgU1dMLTIxMDBVICovCi0Je1VTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTVkLCAweGEwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpIH0sCiAJLyoKIAkgKiBhdDc2YzUwMy1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy9SRk1EIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRHluYWxpbmsvQXNrZXkgV0xMMDEzIChyZm1kKSAqLwotCXtVU0JfREVWSUNFKDB4MDY5YSwgMHgwMzIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDMyMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTGlua3N5cyBXVVNCMTEgdjIuNiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIxOSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0d29yayBFdmVyeXdoZXJlIE5XVTExQiAqLwotCXtVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjI3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3N2IsIDB4MjIyNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogTmV0Z2VhciBNQTEwMSByZXYuIEIgKi8KLQl7VVNCX0RFVklDRSgweDA4NjQsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODY0LCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEQtTGluayBEV0wtMTIwIHJldi4gRSAqLwotCXtVU0JfREVWSUNFKDB4MjAwMSwgMHgzMjAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4MzIwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQWN0aW9udGVjIDgwMlVBVDEsIEhXVTAxMTUwLTAxVUsgKi8KLQl7VVNCX0RFVklDRSgweDE2NjgsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNjY4LCAweDc2MDUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEFpclZhc3QgVy1CdWRkaWUgV04yMTAgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDQxMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIERpY2sgU21pdGggRWxlY3Ryb25pY3MgWEgxMTUzIDgwMi4xMWIgVVNCIGFkYXB0ZXIgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4NTc0MyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDU3NDMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIENOZXQgQ05VU0I2MTEgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEZpYmVyTGluZSBGTC1XTDIwMFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMzcxLCAweDAwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEJlblEgQVdMNDAwIFVTQiBzdGljayAqLwotCXtVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0YTUsIDB4OTAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogM0NvbSAzQ1JTSEVXNjk2ICovCi0Je1VTQl9ERVZJQ0UoMHgwNTA2LCAweDBhMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDUwNiwgMHgwYTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBTaWVtZW5zIFNhbnRpcyBBRFNMIFdMQU4gVVNCIGFkYXB0ZXIgV0xMIDAxMyAqLwotCXtVU0JfREVWSUNFKDB4MDY4MSwgMHgwMDFiKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA2ODEsIDB4MDAxYiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQmVsa2luIEY1RDYwNTAsIHZlcnNpb24gMiAqLwotCXtVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDUwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDA1MCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogaUJsaXR6eiwgQldVNjEzIChub3QgKkIgb3IgKlNCKSAqLwotCXtVU0JfREVWSUNFKDB4MDdiOCwgMHhiMDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YjgsIDB4YjAwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogR2lnYWJ5dGUgR04tV0xCTTEwMSAqLwotCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEwNDQsIDB4ODAwMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogUGxhbmV4IEdXLVVTMTFTICovCi0Je1VTQl9ERVZJQ0UoMHgyMDE5LCAweDMyMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MjAxOSwgMHgzMjIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBJbnRlcm5hbCBXTEFOIGFkYXB0ZXIgaW4gaDVbNCw1XXh4IHNlcmllcyBpUEFRcyAqLwotCXtVU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA0OWYsIDB4MDAzMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ29yZWdhIFdpcmVsZXNzIExBTiBVU0ItMTEgbWluaTIgKi8KLQl7VVNCX0RFVklDRSgweDA3YWEsIDB4MDAxOCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTgpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIFVuaWRlbiBQQ1cxMDAgKi8KLQl7VVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNWRkLCAweGZmMzUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qCiAJICogYXQ3NmM1MDMtcmZtZC1hY2MKIAkgKi8KIAkvKiBTTUMyNjY0VyAqLwotCXtVU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19BQ0MpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQykgfSwKIAkvKiBCZWxraW4gRjVENjA1MCwgU01DMjY2MlcgdjIsIFNNQzI2NjJXLUFSICovCi0Je1VTQl9ERVZJQ0UoMHgwZDVjLCAweGEwMDIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQyl9LAorCXsgVVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfQUNDKSB9LAogCS8qCiAJICogYXQ3NmM1MDUtcmZtZAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA2KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYwNiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDUpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNS1yZm1kMjk1OAogCSAqLwogCS8qIEdlbmVyaWMgQVQ3NkM1MDUvUkZNRCwgT3Zpc0xpbmsgV0wtMTEzMFVTQiAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIEZpYmVybGluZSBGTC1XTDI0MFUgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBDTmV0IENOVVNCLTYxMUcgKi8KLQl7VVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAxMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi44ICovCi0Je1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogWHRlcmFzeXMgWE4tMjEyMkIsIElCbGl0enogQldVNjEzQi9CV1U2MTNTQiAqLwotCXtVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MTJmZCwgMHgxMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIENvcmVnYSBXTEFOIFVTQiBTdGljayAxMSAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MDdhYSwgMHg3NjEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIE1pY3Jvc3RhciBNU0kgQm94IE1TNjk3OCAqLwotCXtVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHgxMDIwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qCiAJICogYXQ3NmM1MDVhLXJmbWQyOTU4CiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUEgZGV2aWNlICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTQpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1QSl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKSB9LAogCS8qIEdlbmVyaWMgQVQ3NkM1MDVBUyBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyogU2llbWVucyBHaWdhc2V0IFVTQiBXTEFOIEFkYXB0ZXIgMTEgKi8KLQl7VVNCX0RFVklDRSgweDE2OTAsIDB4MDcwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MTY5MCwgMHgwNzAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNWFteC1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNUFNWCBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpfSwKLQl7fQorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBTVgpIH0sCisJeyB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2X3RhYmxlKTsKQEAgLTI0NCwyNiArMjY0LDggQEAKIC8qIFN1cHBvcnRlZCByYXRlcyBvZiB0aGlzIGhhcmR3YXJlLCBiaXQgNyBtYXJrcyBiYXNpYyByYXRlcyAqLwogc3RhdGljIGNvbnN0IHU4IGh3X3JhdGVzW10gPSB7IDB4ODIsIDB4ODQsIDB4MGIsIDB4MTYgfTsKIAotLyogRnJlcXVlbmN5IG9mIGVhY2ggY2hhbm5lbCBpbiBNSHogKi8KLXN0YXRpYyBjb25zdCBsb25nIGNoYW5uZWxfZnJlcXVlbmN5W10gPSB7Ci0JMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKLQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Ci19OwotCi0jZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcXVlbmN5KQotCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJlYW1ibGVzW10gPSB7ICJsb25nIiwgInNob3J0IiwgImF1dG8iIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtYWNfc3RhdGVzW10gPSB7Ci0JW01BQ19JTklUXSA9ICJJTklUIiwKLQlbTUFDX1NDQU5OSU5HXSA9ICJTQ0FOTklORyIsCi0JW01BQ19BVVRIXSA9ICJBVVRIIiwKLQlbTUFDX0FTU09DXSA9ICJBU1NPQyIsCi0JW01BQ19KT0lOSU5HXSA9ICJKT0lOSU5HIiwKLQlbTUFDX0NPTk5FQ1RFRF0gPSAiQ09OTkVDVEVEIiwKLQlbTUFDX09XTl9JQlNTXSA9ICJPV05fSUJTUyIKLX07Ci0KIC8qIEZpcm13YXJlIGRvd25sb2FkICovCiAvKiBERlUgc3RhdGVzICovCiAjZGVmaW5lIFNUQVRFX0lETEUJCQkweDAwCkBAIC0yOTgsMTcgKzMwMCwzMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzX2ludGVyc2lsKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYxIHx8IGJvYXJkID09IEJPQVJEXzUwM19JU0wzODYzKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjEgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjMpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzXzUwM3JmbWQoZW51bSBib2FyZF90eXBlIGJvYXJkKQogewotCXJldHVybiAoYm9hcmQgPT0gQk9BUkRfNTAzIHx8IGJvYXJkID09IEJPQVJEXzUwM19BQ0MpOworCWlmIChib2FyZCA9PSBCT0FSRF81MDMgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0FDQykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfNTA1KGVudW0gYm9hcmRfdHlwZSBib2FyZCkKK3sKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1IHx8IGJvYXJkID09IEJPQVJEXzUwNV8yOTU4KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9pc181MDVhKGVudW0gYm9hcmRfdHlwZSBib2FyZCkKIHsKLQlyZXR1cm4gKGJvYXJkID09IEJPQVJEXzUwNUEgfHwgYm9hcmQgPT0gQk9BUkRfNTA1QU1YKTsKKwlpZiAoYm9hcmQgPT0gQk9BUkRfNTA1QSB8fCBib2FyZCA9PSBCT0FSRF81MDVBTVgpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKiBMb2FkIGEgYmxvY2sgb2YgdGhlIGZpcnN0IChpbnRlcm5hbCkgcGFydCBvZiB0aGUgZmlybXdhcmUgKi8KQEAgLTQ4OSw0MSArNTA0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZXBvcnQgdGhhdCB0aGUgc2NhbiByZXN1bHRzIGFyZSByZWFkeSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9zY2FuX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXdycXUuZGF0YS5sZW5ndGggPSAwOwotCXdycXUuZGF0YS5mbGFncyA9IDA7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0JYXQ3Nl9kYmcoREJHX1dFX0VWRU5UUywgIiVzOiBTSU9DR0lXU0NBTiBzZW50IiwgbmV0ZGV2LT5uYW1lKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCQkgICAgdTggKmJzc2lkKQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKLQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQobmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQlhdDc2X2RiZyhEQkdfV0VfRVZFTlRTLCAiJXM6ICVzOiBTSU9DR0lXQVAgc2VudCIsIG5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gMDsKLQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCWF0NzZfZGJnKERCR19XRV9FVkVOVFMsICIlczogJXM6IFNJT0NHSVdBUCBzZW50IiwgbmV0ZGV2LT5uYW1lLAotCQkgX19mdW5jX18pOwotfQotCiAjZGVmaW5lIEhFWDJTVFJfQlVGRkVSUyA0CiAjZGVmaW5lIEhFWDJTVFJfTUFYX0xFTiA2NAogI2RlZmluZSBCSU4ySEVYKHgpICgoeCkgPCAxMCA/ICcwJyArICh4KSA6ICh4KSArICdBJyAtIDEwKQpAQCAtNTk1LDM3ICs1NzUsNiBAQAogCQltb2RfdGltZXIoJmxlZHRyaWdfdHhfdGltZXIsIGppZmZpZXMgKyBIWiAvIDQpOwogfQogCi0vKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3NpZCBpcyBoaWRkZW4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfaGlkZGVuX3NzaWQodTggKnNzaWQsIGludCBsZW5ndGgpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IHplcm9zWzMyXTsKLQotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAobGVuZ3RoID09IDEgJiYgc3NpZFswXSA9PSAnICcpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIChtZW1jbXAoc3NpZCwgemVyb3MsIGxlbmd0aCkgPT0gMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdDc2X2ZyZWVfYnNzX2xpc3Qoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXByaXYtPmN1cnJfYnNzID0gTlVMTDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcml2LT5ic3NfbGlzdCkgewotCQlsaXN0X2RlbChwdHIpOwotCQlrZnJlZShsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBhdDc2X3JlbWFwKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7CkBAIC02NDEsMTggKzU5MCwyNSBAQAogc3RhdGljIGludCBhdDc2X2dldF9vcF9tb2RlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludCByZXQ7Ci0JdTggb3BfbW9kZTsKKwl1OCBzYXZlZDsKKwl1OCAqb3BfbW9kZTsKIAorCW9wX21vZGUgPSBrbWFsbG9jKDEsIEdGUF9OT0lPKTsKKwlpZiAoIW9wX21vZGUpCisJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksIDB4MzMsCiAJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOIHwKIAkJCSAgICAgIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDB4MDEsIDAsICZvcF9tb2RlLCAxLAogCQkJICAgICAgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCXNhdmVkID0gKm9wX21vZGU7CisJa2ZyZWUob3BfbW9kZSk7CisKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAllbHNlIGlmIChyZXQgPCAxKQogCQlyZXR1cm4gLUVJTzsKIAllbHNlCi0JCXJldHVybiBvcF9tb2RlOworCQlyZXR1cm4gc2F2ZWQ7CiB9CiAKIC8qIExvYWQgYSBibG9jayBvZiB0aGUgc2Vjb25kICgiZXh0ZXJuYWwiKSBwYXJ0IG9mIHRoZSBmaXJtd2FyZSAqLwpAQCAtNzIwLDcgKzY3Niw3IEBACiAJa2ZyZWUoaHdjZmcpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IEhXIENvbmZpZyAoZXJyb3IgJWQpXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTcyOSwxNSArNjg1LDE1IEBACiB7CiAJaW50IGk7CiAJc3RhdGljIHN0cnVjdCByZWdfZG9tYWluIGNvbnN0IGZkX3RhYltdID0gewotCQl7MHgxMCwgIkZDQyAoVVNBKSIsIDB4N2ZmfSwJLyogY2ggMS0xMSAqLwotCQl7MHgyMCwgIklDIChDYW5hZGEpIiwgMHg3ZmZ9LAkvKiBjaCAxLTExICovCi0JCXsweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmfSwJLyogY2ggMS0xMyAqLwotCQl7MHgzMSwgIlNwYWluIiwgMHg2MDB9LAkvKiBjaCAxMC0xMSAqLwotCQl7MHgzMiwgIkZyYW5jZSIsIDB4MWUwMH0sCS8qIGNoIDEwLTEzICovCi0JCXsweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDB9LAkvKiBjaCAxNCAqLwotCQl7MHg0MSwgIk1LSzEgKEphcGFuKSIsIDB4M2ZmZn0sCS8qIGNoIDEtMTQgKi8KLQkJezB4NTAsICJJc3JhZWwiLCAweDNmY30sCS8qIGNoIDMtOSAqLwotCQl7MHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmZ9CS8qIGNoIDEtMzIgKi8KKwkJeyAweDEwLCAiRkNDIChVU0EpIiwgMHg3ZmYgfSwJLyogY2ggMS0xMSAqLworCQl7IDB4MjAsICJJQyAoQ2FuYWRhKSIsIDB4N2ZmIH0sCS8qIGNoIDEtMTEgKi8KKwkJeyAweDMwLCAiRVRTSSAobW9zdCBvZiBFdXJvcGUpIiwgMHgxZmZmIH0sCS8qIGNoIDEtMTMgKi8KKwkJeyAweDMxLCAiU3BhaW4iLCAweDYwMCB9LAkvKiBjaCAxMC0xMSAqLworCQl7IDB4MzIsICJGcmFuY2UiLCAweDFlMDAgfSwJLyogY2ggMTAtMTMgKi8KKwkJeyAweDQwLCAiTUtLIChKYXBhbikiLCAweDIwMDAgfSwJLyogY2ggMTQgKi8KKwkJeyAweDQxLCAiTUtLMSAoSmFwYW4pIiwgMHgzZmZmIH0sCS8qIGNoIDEtMTQgKi8KKwkJeyAweDUwLCAiSXNyYWVsIiwgMHgzZmMgfSwJLyogY2ggMy05ICovCisJCXsgMHgwMCwgIjx1bmtub3duPiIsIDB4ZmZmZmZmZmYgfQkvKiBjaCAxLTMyICovCiAJfTsKIAogCS8qIExhc3QgZW50cnkgaXMgZmFsbGJhY2sgZm9yIHVua25vd24gZG9tYWluIGNvZGUgKi8KQEAgLTc2NSwyMCArNzIxLDQzIEBACiAvKiBSZXR1cm4gcG9zaXRpdmUgbnVtYmVyIGZvciBzdGF0dXMsIG5lZ2F0aXZlIGZvciBhbiBlcnJvciAqLwogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9nZXRfY21kX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggY21kKQogewotCXU4IHN0YXRfYnVmWzQwXTsKKwl1OCAqc3RhdF9idWY7CiAJaW50IHJldDsKIAorCXN0YXRfYnVmID0ga21hbGxvYyg0MCwgR0ZQX05PSU8pOworCWlmICghc3RhdF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHgyMiwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4gfAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgY21kLCAwLCBzdGF0X2J1ZiwKIAkJCSAgICAgIHNpemVvZihzdGF0X2J1ZiksIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IHN0YXRfYnVmWzVdOworCWtmcmVlKHN0YXRfYnVmKTsKIAotCXJldHVybiBzdGF0X2J1Zls1XTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfc2V0X2NhcmRfY29tbWFuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGNtZCwgdm9pZCAqYnVmLAorI2RlZmluZSBNQUtFX0NNRF9DQVNFKGMpIGNhc2UgKGMpOiByZXR1cm4gI2MKKworc3RhdGljIGNvbnN0IGNoYXIgKmF0NzZfZ2V0X2NtZF9zdHJpbmcodTggY21kX3N0YXR1cykKK3sKKwlzd2l0Y2ggKGNtZF9zdGF0dXMpIHsKKwkJTUFLRV9DTURfQ0FTRShDTURfU0VUX01JQik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX0dFVF9NSUIpOworCQlNQUtFX0NNRF9DQVNFKENNRF9TQ0FOKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfSk9JTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUX0lCU1MpOworCQlNQUtFX0NNRF9DQVNFKENNRF9SQURJT19PTik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1JBRElPX09GRik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NUQVJUVVApOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBjbWQsIHZvaWQgKmJ1ZiwKIAkJCQkgaW50IGJ1Zl9zaXplKQogewogCWludCByZXQ7CkBAIC03OTMsNiArNzcyLDEwIEBACiAJY21kX2J1Zi0+c2l6ZSA9IGNwdV90b19sZTE2KGJ1Zl9zaXplKTsKIAltZW1jcHkoY21kX2J1Zi0+ZGF0YSwgYnVmLCBidWZfc2l6ZSk7CiAKKwlhdDc2X2RiZ19kdW1wKERCR19DTUQsIGNtZF9idWYsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9jb21tYW5kKSArIGJ1Zl9zaXplLAorCQkgICAgICAiaXNzdWluZyBjb21tYW5kICVzICgweCUwMngpIiwKKwkJICAgICAgYXQ3Nl9nZXRfY21kX3N0cmluZyhjbWQpLCBjbWQpOworCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwgMHgwZSwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCSAgICAgIDAsIDAsIGNtZF9idWYsCkBAIC04MzAsMTMgKzgxMywxMyBAQAogCQlzdGF0dXMgPSBhdDc2X2dldF9jbWRfc3RhdHVzKHByaXYtPnVkZXYsIGNtZCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYXQ3Nl9kYmcoREJHX1dBSVRfQ09NUExFVEUsCiAJCQkgIiVzOiBXYWl0aW5nIG9uIGNtZCAlZCwgc3RhdHVzID0gJWQgKCVzKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHN0YXR1cywKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgc3RhdHVzLAogCQkJIGF0NzZfZ2V0X2NtZF9zdGF0dXNfc3RyaW5nKHN0YXR1cykpOwogCiAJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUwpAQCAtODQ3LDcgKzgzMCw3IEBACiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IGNvbXBsZXRpb24gdGltZW91dCBmb3IgY29tbWFuZCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGNtZCk7CisJCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBjbWQpOwogCQkJc3RhdHVzID0gLUVUSU1FRE9VVDsKIAkJCWJyZWFrOwogCQl9CkBAIC04NzAsNyArODUzLDcgQEAKIAlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgIiVzOiBzZXRfbWliOiBhdDc2X3dhaXRfY29tcGxldGlvbiBmYWlsZWQgIgotCQkgICAgICAgIndpdGggJWRcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgICJ3aXRoICVkXG4iLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldCA9IC1FSU87CiAJfQogCkBAIC04OTEsNyArODc0LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgY21kLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKCVkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjbWQsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCwgcmV0KTsKIAllbHNlCiAJCXJldCA9IDE7CiAKQEAgLTkxMiw0NCArODk1LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChwbV9tb2RlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBhc3NvY2lhdGlvbiBpZCBmb3IgcG93ZXIgc2F2ZSBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X2Fzc29jaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgdTE2IGlkKQotewotCWludCByZXQgPSAwOwotCi0JcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19NR01UOwotCXByaXYtPm1pYl9idWYuc2l6ZSA9IDI7Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX21nbXQsIHN0YXRpb25faWQpOwotCXByaXYtPm1pYl9idWYuZGF0YS53b3JkID0gY3B1X3RvX2xlMTYoaWQpOwotCi0JcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXNzb2NpZCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgbGlzdGVuIGludGVydmFsIGZvciBwb3dlciBzYXZlIG1vZGUgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHUxNiBpbnRlcnZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUM7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMjsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWMsIGxpc3Rlbl9pbnRlcnZhbCk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLndvcmQgPSBjcHVfdG9fbGUxNihpbnRlcnZhbCk7Ci0KLQlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogc2V0X21pYiAobGlzdGVuX2ludGVydmFsKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk2Niw3ICs5MTIsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByZWFtYmxlKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk4Myw3ICs5MjksNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGZyYWcgdGhyZXNob2xkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwMDAsNyArOTQ2LDcgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChydHMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAxNywyNCArOTYzLDQxIEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoYXV0b3JhdGUgZmFsbGJhY2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfYWRkX21hY19hZGRyZXNzKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgaW50IGF0NzZfc2V0X3RraXBfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfQUREUjsKKwlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX0VOQ1JZUFRJT047CiAJcHJpdi0+bWliX2J1Zi5zaXplID0gRVRIX0FMRU47Ci0JcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2FkZHIsIG1hY19hZGRyKTsKKwlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwgdGtpcF9ic3NpZCk7CiAJbWVtY3B5KHByaXYtPm1pYl9idWYuZGF0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChNQUNfQUREUiwgbWFjX2FkZHIpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKE1BQ19FTkNSWVBUSU9OLCB0a2lwX2Jzc2lkKSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdDc2X3Jlc2V0X3JzYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQoreworCWludCByZXQgPSAwOworCisJcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19FTkNSWVBUSU9OOworCXByaXYtPm1pYl9idWYuc2l6ZSA9IDQgKiA4OworCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLCBrZXlfcnNjKTsKKwltZW1zZXQocHJpdi0+bWliX2J1Zi5kYXRhLmRhdGEsIDAgLCBwcml2LT5taWJfYnVmLnNpemUpOworCisJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoTUFDX0VOQ1JZUFRJT04sIGtleV9yc2MpIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA1MywxNiArMTAxNiwxNiBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2FkZHIpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19BRERSKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX0FERFI6IG1hY19hZGRyICVzIHJlcyAweCV4IDB4JXgiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbWFjMnN0cihtLT5tYWNfYWRkciksIG0tPnJlc1swXSwgbS0+cmVzWzFdKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtLT5ncm91cF9hZGRyKTsgaSsrKQogCQlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfQUREUjogZ3JvdXAgYWRkciAlZDogJXMsICIKLQkJCSAic3RhdHVzICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJICJzdGF0dXMgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCiAJCQkgbWFjMnN0cihtLT5ncm91cF9hZGRyW2ldKSwgbS0+Z3JvdXBfYWRkcl9zdGF0dXNbaV0pOwogZXhpdDoKIAlrZnJlZShtKTsKQEAgLTEwODIsMTMgKzEwNDUsMTMgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY193ZXApKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19XRVApIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfV0VQOiBwcml2X2ludm9rZWQgJXUgZGVmX2tleV9pZCAldSAiCiAJCSAia2V5X2xlbiAldSBleGNsX3VuZW5jciAldSB3ZXBfaWN2X2VyciAldSB3ZXBfZXhjbHVkZWQgJXUgIgotCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgImVuY3JfbGV2ZWwgJXUga2V5ICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgbS0+cHJpdmFjeV9pbnZva2VkLCBtLT53ZXBfZGVmYXVsdF9rZXlfaWQsCiAJCSBtLT53ZXBfa2V5X21hcHBpbmdfbGVuLCBtLT5leGNsdWRlX3VuZW5jcnlwdGVkLAogCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCkBAIC0xMTAwLDEyICsxMDYzLDU1IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykKIAkJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX1dFUDoga2V5ICVkOiAlcyIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBpLAorCQkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgaSwKIAkJCSBoZXgyc3RyKG0tPndlcF9kZWZhdWx0X2tleXZhbHVlW2ldLCBrZXlfbGVuKSk7CiBleGl0OgogCWtmcmVlKG0pOwogfQogCitzdGF0aWMgdm9pZCBhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJaW50IGk7CisJaW50IHJldDsKKwkvKmludCBrZXlfbGVuOyovCisJc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiAqbTsKKworCW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtKQorCQlyZXR1cm47CisKKwlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19FTkNSWVBUSU9OLCBtLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24pKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX0VOQ1JZUFRJT04pIGZhaWxlZDogJWRcbiIsCisJCQl3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlhdDc2X2RiZyhEQkdfTUlCLAorCQkgIiVzOiBNSUIgTUFDX0VOQ1JZUFRJT046IHRraXBfYnNzaWQgJXMgcHJpdl9pbnZva2VkICV1ICIKKwkJICJjaXBoX2tleV9pZCAldSBncnBfa2V5X2lkICV1IGV4Y2xfdW5lbmNyICV1ICIKKwkJICJja2lwX2tleV9wZXJtICV1IHdlcF9pY3ZfZXJyICV1IHdlcF9leGNsdWRlZCAldSIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIG1hYzJzdHIobS0+dGtpcF9ic3NpZCksCisJCSBtLT5wcml2YWN5X2ludm9rZWQsIG0tPmNpcGhlcl9kZWZhdWx0X2tleV9pZCwKKwkJIG0tPmNpcGhlcl9kZWZhdWx0X2dyb3VwX2tleV9pZCwgbS0+ZXhjbHVkZV91bmVuY3J5cHRlZCwKKwkJIG0tPmNraXBfa2V5X3Blcm11dGF0aW9uLAorCQkgbGUzMl90b19jcHUobS0+d2VwX2ljdl9lcnJvcl9jb3VudCksCisJCSBsZTMyX3RvX2NwdShtLT53ZXBfZXhjbHVkZWRfY291bnQpKTsKKworCS8qa2V5X2xlbiA9IChtLT5lbmNyeXB0aW9uX2xldmVsID09IDEpID8KKwkgICAgV0VQX1NNQUxMX0tFWV9MRU4gOiBXRVBfTEFSR0VfS0VZX0xFTjsqLworCisJZm9yIChpID0gMDsgaSA8IENJUEhFUl9LRVlTOyBpKyspCisJCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIE1BQ19FTkNSWVBUSU9OOiBrZXkgJWQ6ICVzIiwKKwkJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGksCisJCQkgaGV4MnN0cihtLT5jaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtpXSwKKwkJCQkgQ0lQSEVSX0tFWV9MRU4pKTsKK2V4aXQ6CisJa2ZyZWUobSk7Cit9CisKIHN0YXRpYyB2b2lkIGF0NzZfZHVtcF9taWJfbWFjX21nbXQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwpAQCAtMTExOSw3ICsxMTI1LDcgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNQUNfTUdNVCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTEzMCw3ICsxMTM2LDcgQEAKIAkJICJwbV9tb2RlICVkIGlic3NfY2hhbmdlICVkIHJlcyAlZCAiCiAJCSAibXVsdGlfZG9tYWluX2NhcGFiaWxpdHlfaW1wbGVtZW50ZWQgJWQgIgogCQkgImludGVybmF0aW9uYWxfcm9hbWluZyAlZCBjb3VudHJ5X3N0cmluZyAlLjNzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUxNl90b19jcHUobS0+YmVhY29uX3BlcmlvZCksCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KG0tPmJlYWNvbl9wZXJpb2QpLAogCQkgbGUxNl90b19jcHUobS0+Q0ZQX21heF9kdXJhdGlvbiksCiAJCSBsZTE2X3RvX2NwdShtLT5tZWRpdW1fb2NjdXBhbmN5X2xpbWl0KSwKIAkJIGxlMTZfdG9fY3B1KG0tPnN0YXRpb25faWQpLCBsZTE2X3RvX2NwdShtLT5BVElNX3dpbmRvdyksCkBAIC0xMTU1LDcgKzExNjEsNyBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9tYWMpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTE2NSw3ICsxMTcxLDggQEAKIAkJICJzY2FuX3R5cGUgJWQgc2Nhbl9jaGFubmVsICVkIHByb2JlX2RlbGF5ICV1ICIKIAkJICJtaW5fY2hhbm5lbF90aW1lICVkIG1heF9jaGFubmVsX3RpbWUgJWQgbGlzdGVuX2ludCAlZCAiCiAJCSAiZGVzaXJlZF9zc2lkICVzIGRlc2lyZWRfYnNzaWQgJXMgZGVzaXJlZF9ic3N0eXBlICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbGUzMl90b19jcHUobS0+bWF4X3R4X21zZHVfbGlmZXRpbWUpLAogCQkgbGUzMl90b19jcHUobS0+bWF4X3J4X2xpZmV0aW1lKSwKIAkJIGxlMTZfdG9fY3B1KG0tPmZyYWdfdGhyZXNob2xkKSwgbGUxNl90b19jcHUobS0+cnRzX3RocmVzaG9sZCksCiAJCSBsZTE2X3RvX2NwdShtLT5jd21pbiksIGxlMTZfdG9fY3B1KG0tPmN3bWF4KSwKQEAgLTExOTEsNyArMTE5OCw3IEBACiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9QSFksIG0sIHNpemVvZihzdHJ1Y3QgbWliX3BoeSkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoUEhZKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMjAwLDcgKzEyMDcsNyBAQAogCQkgIm1wZHVfbWF4X2xlbmd0aCAlZCBjY2FfbW9kZV9zdXBwb3J0ZWQgJWQgb3BlcmF0aW9uX3JhdGVfc2V0ICIKIAkJICIweCV4IDB4JXggMHgleCAweCV4IGNoYW5uZWxfaWQgJWQgY3VycmVudF9jY2FfbW9kZSAlZCAiCiAJCSAicGh5X3R5cGUgJWQgY3VycmVudF9yZWdfZG9tYWluICVkIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbGUzMl90b19jcHUobS0+ZWRfdGhyZXNob2xkKSwKIAkJIGxlMTZfdG9fY3B1KG0tPnNsb3RfdGltZSksIGxlMTZfdG9fY3B1KG0tPnNpZnNfdGltZSksCiAJCSBsZTE2X3RvX2NwdShtLT5wcmVhbWJsZV9sZW5ndGgpLAogCQkgbGUxNl90b19jcHUobS0+cGxjcF9oZWFkZXJfbGVuZ3RoKSwKQEAgLTEyMjQsMTMgKzEyMzEsMTQgQEAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX0xPQ0FMLCBtLCBzaXplb2Yoc3RydWN0IG1pYl9sb2NhbCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTE9DQUwpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBMT0NBTDogYmVhY29uX2VuYWJsZSAlZCAiCiAJCSAidHhhdXRvcmF0ZV9mYWxsYmFjayAlZCBzc2lkX3NpemUgJWQgcHJvbWlzY3VvdXNfbW9kZSAlZCAiCi0JCSAicHJlYW1ibGVfdHlwZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgbS0+YmVhY29uX2VuYWJsZSwKKwkJICJwcmVhbWJsZV90eXBlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgbS0+YmVhY29uX2VuYWJsZSwKIAkJIG0tPnR4YXV0b3JhdGVfZmFsbGJhY2ssIG0tPnNzaWRfc2l6ZSwgbS0+cHJvbWlzY3VvdXNfbW9kZSwKIAkJIG0tPnByZWFtYmxlX3R5cGUpOwogZXhpdDoKQEAgLTEyNDksMTE4ICsxMjU3LDIxIEBACiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tZG9tYWluKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChNRE9NQUlOKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogY2hhbm5lbF9saXN0ICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKIAkJIGhleDJzdHIobS0+Y2hhbm5lbF9saXN0LCBzaXplb2YobS0+Y2hhbm5lbF9saXN0KSkpOwogCiAJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTURPTUFJTjogdHhfcG93ZXJsZXZlbCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBoZXgyc3RyKG0tPnR4X3Bvd2VybGV2ZWwsIHNpemVvZihtLT50eF9wb3dlcmxldmVsKSkpOwogZXhpdDoKIAlrZnJlZShtKTsKIH0KIAotc3RhdGljIGludCBhdDc2X2dldF9jdXJyZW50X2Jzc2lkKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1pYl9tYWNfbWdtdCAqbWFjX21nbXQgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1hY19tZ210KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19NR01ULCBtYWNfbWdtdCwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21hY19tZ210KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCW1lbWNweShwcml2LT5ic3NpZCwgbWFjX21nbXQtPmN1cnJlbnRfYnNzaWQsIEVUSF9BTEVOKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgQlNTSUQgJXNcbiIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkgICAgICAgbWFjMnN0cihwcml2LT5ic3NpZCkpOwotZXJyb3I6Ci0Ja2ZyZWUobWFjX21nbXQpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBtaWJfcGh5ICpwaHkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWliX3BoeSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwaHkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX1BIWSwgcGh5LCBzaXplb2Yoc3RydWN0IG1pYl9waHkpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIoTUlCX1BIWSkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcHJpdi0+Y2hhbm5lbCA9IHBoeS0+Y2hhbm5lbF9pZDsKLWVycm9yOgotCWtmcmVlKHBoeSk7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYXQ3Nl9zdGFydF9zY2FuIC0gc3RhcnQgYSBzY2FuCi0gKgotICogQHVzZV9lc3NpZCAtIHVzZSB0aGUgY29uZmlndXJlZCBFU1NJRCBpbiBub24gcGFzc2l2ZSBtb2RlCi0gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zdGFydF9zY2FuKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIGludCB1c2VfZXNzaWQpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKLQotCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7Ci0JbWVtc2V0KHNjYW4uYnNzaWQsIDB4ZmYsIEVUSF9BTEVOKTsKLQotCWlmICh1c2VfZXNzaWQpIHsKLQkJbWVtY3B5KHNjYW4uZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JCXNjYW4uZXNzaWRfc2l6ZSA9IHByaXYtPmVzc2lkX3NpemU7Ci0JfSBlbHNlCi0JCXNjYW4uZXNzaWRfc2l6ZSA9IDA7Ci0KLQkvKiBqYWw6IHdoeSBzaG91bGQgd2Ugc3RhcnQgYXQgYSBjZXJ0YWluIGNoYW5uZWw/IHdlIGRvIHNjYW4gdGhlIHdob2xlCi0JICAgcmFuZ2UgYWxsb3dlZCBieSByZWcgZG9tYWluLiAqLwotCXNjYW4uY2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7Ci0KLQkvKiBhdG1lbHdsYW5kcml2ZXIgZGlmZmVycyBiZXR3ZWVuIHNjYW4gdHlwZSAwIGFuZCAxIChhY3RpdmUvcGFzc2l2ZSkKLQkgICBGb3IgYWQtaG9jIG1vZGUsIGl0IHVzZXMgdHlwZSAwIG9ubHkuICovCi0Jc2Nhbi5zY2FuX3R5cGUgPSBwcml2LT5zY2FuX21vZGU7Ci0KLQkvKiBJTkZPOiBGb3IgcHJvYmVfZGVsYXksIG5vdCBtdWx0aXBseWluZyBieSAxMDI0IGFzIHRoaXMgd2lsbCBiZQotCSAgIHNsaWdodGx5IGxlc3MgdGhhbiBtaW5fY2hhbm5lbF90aW1lCi0JICAgKHBlciBzcGVjOiBwcm9iZSBkZWxheSA8IG1pbi4gY2hhbm5lbCB0aW1lKSAqLwotCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOwotCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOwotCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7Ci0Jc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOwotCi0JLyogb3RoZXIgdmFsdWVzIGFyZSBzZXQgdG8gMCBmb3IgdHlwZSAwICovCi0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogc3RhcnRfc2NhbiAodXNlX2Vzc2lkID0gJWQsIGludGwgPSAlZCwgIgotCQkgImNoYW5uZWwgPSAlZCwgcHJvYmVfZGVsYXkgPSAlZCwgc2Nhbl9taW5fdGltZSA9ICVkLCAiCi0JCSAic2Nhbl9tYXhfdGltZSA9ICVkKSIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIHVzZV9lc3NpZCwKLQkJIHNjYW4uaW50ZXJuYXRpb25hbF9zY2FuLCBzY2FuLmNoYW5uZWwsCi0JCSBsZTE2X3RvX2NwdShzY2FuLnByb2JlX2RlbGF5KSwKLQkJIGxlMTZfdG9fY3B1KHNjYW4ubWluX2NoYW5uZWxfdGltZSksCi0JCSBsZTE2X3RvX2NwdShzY2FuLm1heF9jaGFubmVsX3RpbWUpKTsKLQotCXJldHVybiBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX1NDQU4sICZzY2FuLCBzaXplb2Yoc2NhbikpOwotfQotCiAvKiBFbmFibGUgbW9uaXRvciBtb2RlICovCiBzdGF0aWMgaW50IGF0NzZfc3RhcnRfbW9uaXRvcihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewpAQCAtMTM4MSw4NiArMTI5Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X3N0YXJ0X2lic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfaWJzcyBic3M7Ci0JaW50IHJldDsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19PV05fSUJTUyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfT1dOX0lCU1MpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQltZW1zZXQoJmJzcywgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9pYnNzKSk7Ci0JbWVtc2V0KGJzcy5ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOwotCW1lbWNweShic3MuZXNzaWQsIHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JYnNzLmVzc2lkX3NpemUgPSBwcml2LT5lc3NpZF9zaXplOwotCWJzcy5ic3NfdHlwZSA9IEFESE9DX01PREU7Ci0JYnNzLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOwotCi0JcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TVEFSVF9JQlNTLCAmYnNzLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2lic3MpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX1NUQVJUX0lCU1MpOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzdGFydF9pYnNzIGZhaWxlZCB0byBjb21wbGV0ZSwgJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl9nZXRfY3VycmVudF9ic3NpZChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGF0NzZfZ2V0X2N1cnJlbnRfY2hhbm5lbChwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBnb29kIGZvciA/Pz8gKi8KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoaWJzcyBjaGFuZ2Ugb2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlcXVlc3QgY2FyZCB0byBqb2luIEJTUyBpbiBtYW5hZ2VkIG9yIGFkLWhvYyBtb2RlICovCi1zdGF0aWMgaW50IGF0NzZfam9pbl9ic3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0Jc3RydWN0IGF0NzZfcmVxX2pvaW4gam9pbjsKLQotCUJVR19PTighcHRyKTsKLQotCW1lbXNldCgmam9pbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7Ci0JbWVtY3B5KGpvaW4uYnNzaWQsIHB0ci0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoam9pbi5lc3NpZCwgcHRyLT5zc2lkLCBwdHItPnNzaWRfbGVuKTsKLQlqb2luLmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCWpvaW4uYnNzX3R5cGUgPSAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gMSA6IDIpOwotCWpvaW4uY2hhbm5lbCA9IHB0ci0+Y2hhbm5lbDsKLQlqb2luLnRpbWVvdXQgPSBjcHVfdG9fbGUxNigyMDAwKTsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywKLQkJICIlcyBqb2luIGFkZHIgJXMgc3NpZCAlcyB0eXBlICVkIGNoICVkIHRpbWVvdXQgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKGpvaW4uYnNzaWQpLCBqb2luLmVzc2lkLAotCQkgam9pbi5ic3NfdHlwZSwgam9pbi5jaGFubmVsLCBsZTE2X3RvX2NwdShqb2luLnRpbWVvdXQpKTsKLQlyZXR1cm4gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOwotfQotCiAvKiBDYWxjdWxhdGUgcGFkZGluZyBmcm9tIHR4YnVmLT53bGVuZ3RoICh3aGljaCBleGNsdWRlcyB0aGUgVVNCIFRYIGhlYWRlciksCiAgICBsaWtlbHkgdG8gY29tcGVuc2F0ZSBhIGZsYXcgaW4gdGhlIEFUNzZDNTAzQSBVU0IgcGFydCAuLi4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGF0NzZfY2FsY19wYWRkaW5nKGludCB3bGVuKQpAQCAtMTQ3OSwxNCArMTMxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdlIGFyZSBkb2luZyBhIGxvdCBvZiB0aGluZ3MgaGVyZSBpbiBhbiBpbnRlcnJ1cHQuIE5lZWQKLSAgIGEgYmggaGFuZGxlciAoV2F0Y2hpbmcgVFYgd2l0aCBhIFRWIGNhcmQgaXMgcHJvYmFibHkKLSAgIGEgZ29vZCB0ZXN0OiBpZiB5b3Ugc2VlIGZsaWNrZXJzLCB3ZSBhcmUgZG9pbmcgdG9vIG11Y2guCi0gICBDdXJyZW50bHkgSSBkbyBzZWUgZmxpY2tlcnMuLi4gZXZlbiB3aXRoIG91ciB0YXNrbGV0IDotKCApCi0gICBNYXliZSBiZWNhdXNlIHRoZSBidHR2IGRyaXZlciBhbmQgdXNiLXVoY2kgdXNlIHRoZSBzYW1lIGludGVycnVwdAotKi8KLS8qIE9yIG1heWJlIGJlY2F1c2Ugb3VyIEJIIGhhbmRsZXIgaXMgcHJlZW1wdGluZyBidHR2J3MgQkggaGFuZGxlci4uIEJIcyBkb24ndAotICogc29sdmUgZXZlcnl0aGluZy4uIChhbGV4KSAqLwogc3RhdGljIHZvaWQgYXQ3Nl9yeF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IHVyYi0+Y29udGV4dDsKQEAgLTE0OTYsMTc1OCArMTMxOSw2IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBhdDc2X3R4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqbWdtdF9idWY7Ci0JaW50IHJldDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCWJyZWFrOwotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FQ09OTlJFU0VUOgotCQkvKiB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bWdtdF9zcGlubG9jaywgZmxhZ3MpOwotCW1nbXRfYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JcHJpdi0+bmV4dF9tZ210X2J1bGsgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmICghbWdtdF9idWYpIHsKLQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZXRkZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogd2UgZG9uJ3QgY29weSB0aGUgcGFkZGluZyBieXRlcywgYnV0IGFkZCB0aGVtCi0JICAgdG8gdGhlIGxlbmd0aCAqLwotCW1lbWNweShwcml2LT5idWxrX291dF9idWZmZXIsIG1nbXRfYnVmLAotCSAgICAgICBsZTE2X3RvX2NwdShtZ210X2J1Zi0+d2xlbmd0aCkgKyBBVDc2X1RYX0hEUkxFTik7Ci0JdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLAotCQkJICBwcml2LT5idWxrX291dF9idWZmZXIsCi0JCQkgIGxlMTZfdG9fY3B1KG1nbXRfYnVmLT53bGVuZ3RoKSArIG1nbXRfYnVmLT5wYWRkaW5nICsKLQkJCSAgQVQ3Nl9UWF9IRFJMRU4sIGF0NzZfdHhfY2FsbGJhY2ssIHByaXYpOwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLQlrZnJlZShtZ210X2J1Zik7Ci19Ci0KLS8qIFNlbmQgYSBtYW5hZ2VtZW50IGZyYW1lIG9uIGJ1bGstb3V0LiAgdHhidWYtPndsZW5ndGggbXVzdCBiZSBzZXQgKi8KLXN0YXRpYyBpbnQgYXQ3Nl90eF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCWludCB1cmJfc3RhdHVzOwotCXZvaWQgKm9sZGJ1ZiA9IE5VTEw7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQl1cmJfc3RhdHVzID0gcHJpdi0+dHhfdXJiLT5zdGF0dXM7Ci0JaWYgKHVyYl9zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qIGNhbm5vdCB0cmFuc21pdCBub3csIHB1dCBpbiB0aGUgcXVldWUgKi8KLQkJb2xkYnVmID0gcHJpdi0+bmV4dF9tZ210X2J1bGs7Ci0JCXByaXYtPm5leHRfbWdtdF9idWxrID0gdHhidWY7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChvbGRidWYpIHsKLQkJLyogYSBkYXRhL21nbXQgdHggaXMgYWxyZWFkeSBwZW5kaW5nIGluIHRoZSBVUkIgLQotCQkgICBpZiB0aGlzIGlzIG5vIGVycm9yIGluIHNvbWUgc2l0dWF0aW9ucyB3ZSBtdXN0Ci0JCSAgIGltcGxlbWVudCBhIHF1ZXVlIG9yIHNpbGVudGx5IG1vZGlmeSB0aGUgb2xkIG1zZyAqLwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZW1vdmVkIHBlbmRpbmcgbWdtdCBidWZmZXIgJXNcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGhleDJzdHIob2xkYnVmLCA2NCkpOwotCQlrZnJlZShvbGRidWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0eGJ1Zi0+dHhfcmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JdHhidWYtPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyhsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkpOwotCW1lbXNldCh0eGJ1Zi0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eGJ1Zi0+cmVzZXJ2ZWQpKTsKLQotCWlmIChwcml2LT5uZXh0X21nbXRfYnVsaykKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVVJCIHN0YXR1cyAlZCwgYnV0IG1nbXQgaXMgcGVuZGluZ1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgdXJiX3N0YXR1cyk7Ci0KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogdHggbWdtdDogd2xlbiAlZCB0eF9yYXRlICVkIHBhZCAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KHR4YnVmLT53bGVuZ3RoKSwKLQkJIHR4YnVmLT50eF9yYXRlLCB0eGJ1Zi0+cGFkZGluZywKLQkJIGhleDJzdHIodHhidWYtPnBhY2tldCwgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpKSk7Ci0KLQkvKiB0eGJ1ZiB3YXMgbm90IGNvbnN1bWVkIGFib3ZlIC0+IHNlbmQgbWdtdCBtc2cgaW1tZWRpYXRlbHkgKi8KLQltZW1jcHkocHJpdi0+YnVsa19vdXRfYnVmZmVyLCB0eGJ1ZiwKLQkgICAgICAgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpICsgQVQ3Nl9UWF9IRFJMRU4pOwotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwKLQkJCSAgcHJpdi0+YnVsa19vdXRfYnVmZmVyLAotCQkJICBsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkgKyB0eGJ1Zi0+cGFkZGluZyArCi0JCQkgIEFUNzZfVFhfSERSTEVOLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIHR4IHN1Ym1pdCB1cmI6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0Ja2ZyZWUodHhidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogR28gdG8gdGhlIG5leHQgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotc3RhdGljIGlubGluZSB2b2lkIG5leHRfaWUoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKippZSkKLXsKLQkqaWUgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikoJigqaWUpLT5kYXRhWygqaWUpLT5sZW5dKTsKLX0KLQotLyogQ2hhbGxlbmdlIGlzIHRoZSBjaGFsbGVuZ2Ugc3RyaW5nIChpbiBUTFYgZm9ybWF0KQotICAgd2UgZ290IHdpdGggc2VxX25yIDIgZm9yIHNoYXJlZCBzZWNyZXQgYXV0aGVudGljYXRpb24gb25seSBhbmQKLSAgIHNlbmQgaW4gc2VxX25yIDMgV0VQIGVuY3J5cHRlZCB0byBwcm92ZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFdFUCBrZXk7Ci0gICBvdGhlcndpc2UgaXQgaXMgTlVMTCAqLwotc3RhdGljIGludCBhdDc2X2F1dGhfcmVxKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqYnNzLAotCQkJIGludCBzZXFfbnIsIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICpjaGFsbGVuZ2UpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXE7Ci0JaW50IGJ1Zl9sZW4gPSAoc2VxX25yICE9IDMgPyBBVVRIX0ZSQU1FX1NJWkUgOgotCQkgICAgICAgQVVUSF9GUkFNRV9TSVpFICsgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQlCVUdfT04oIWJzcyk7Ci0JQlVHX09OKHNlcV9uciA9PSAzICYmICFjaGFsbGVuZ2UpOwotCXR4X2J1ZmZlciA9IGttYWxsb2MoYnVmX2xlbiArIE1BWF9QQURESU5HX1NJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghdHhfYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKil0eF9idWZmZXItPnBhY2tldDsKLQltZ210ID0gJnJlcS0+aGVhZGVyOwotCi0JLyogbWFrZSB3aXJlbGVzcyBoZWFkZXIgKi8KLQkvKiBmaXJzdCBhdXRoIG1zZyBpcyBub3QgZW5jcnlwdGVkLCBvbmx5IHRoZSBzZWNvbmQgKHNlcV9uciA9PSAzKSAqLwotCW1nbXQtPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FVVEggfAotCQkJKHNlcV9uciA9PSAzID8gSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEIDogMCkpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCXJlcS0+YWxnb3JpdGhtID0gY3B1X3RvX2xlMTYocHJpdi0+YXV0aF9tb2RlKTsKLQlyZXEtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoc2VxX25yKTsKLQlyZXEtPnN0YXR1cyA9IGNwdV90b19sZTE2KDApOwotCi0JaWYgKHNlcV9uciA9PSAzKQotCQltZW1jcHkocmVxLT5pbmZvX2VsZW1lbnQsIGNoYWxsZW5nZSwgMSArIDEgKyBjaGFsbGVuZ2UtPmxlbik7Ci0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoYnVmX2xlbiAtIEFUNzZfVFhfSERSTEVOKTsKLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwgIiVzOiBBdXRoUmVxIGJzc2lkICVzIGFsZyAlZCBzZXFfbnIgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlcS0+YWxnb3JpdGhtKSwgbGUxNl90b19jcHUocmVxLT50cmFuc2FjdGlvbikpOwotCWlmIChzZXFfbnIgPT0gMykKLQkJYXQ3Nl9kYmcoREJHX1RYX01HTVQsICIlczogQXV0aFJlcSBjaGFsbGVuZ2U6ICVzIC4uLiIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBoZXgyc3RyKHJlcS0+aW5mb19lbGVtZW50LCAxOCkpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9hc3NvY19yZXEoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpic3MpCi17Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmllOwotCWNoYXIgKmVzc2lkOwotCWludCBlc3NpZF9sZW47Ci0JdTE2IGNhcGE7Ci0KLQlCVUdfT04oIWJzcyk7Ci0KLQl0eF9idWZmZXIgPSBrbWFsbG9jKEFTU09DUkVRX01BWF9TSVpFICsgTUFYX1BBRERJTkdfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0eF9idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCAqKXR4X2J1ZmZlci0+cGFja2V0OwotCW1nbXQgPSAmcmVxLT5oZWFkZXI7Ci0JaWUgPSByZXEtPmluZm9fZWxlbWVudDsKLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JbWdtdC0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOwotCi0JbWdtdC0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigweDgwMDApOwotCW1lbWNweShtZ210LT5hZGRyMSwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMiwgcHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5hZGRyMywgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1nbXQtPnNlcV9jdGwgPSBjcHVfdG9fbGUxNigwKTsKLQotCS8qIHdlIG11c3Qgc2V0IHRoZSBQcml2YWN5IGJpdCBpbiB0aGUgY2FwYWJpbGl0aWVzIHRvIGFzc3VyZSBhbgotCSAgIEFnZXJlLWJhc2VkIEFQIHdpdGggb3B0aW9uYWwgV0VQIHRyYW5zbWl0cyBlbmNyeXB0ZWQgZnJhbWVzCi0JICAgdG8gdXMuICBBUCBvbmx5IHNldCB0aGUgUHJpdmFjeSBiaXQgaW4gdGhlaXIgY2FwYWJpbGl0aWVzCi0JICAgaWYgV0VQIGlzIG1hbmRhdG9yeSBpbiB0aGUgQlNTISAqLwotCWNhcGEgPSBic3MtPmNhcGE7Ci0JaWYgKHByaXYtPndlcF9lbmFibGVkKQotCQljYXBhIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlICE9IFBSRUFNQkxFX1RZUEVfTE9ORykKLQkJY2FwYSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEU7Ci0JcmVxLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoY2FwYSk7Ci0KLQlyZXEtPmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KDIgKiBic3MtPmJlYWNvbl9pbnRlcnZhbCk7Ci0KLQkvKiB3cml0ZSBUTFYgZGF0YSBlbGVtZW50cyAqLwotCi0JaWUtPmlkID0gTUZJRV9UWVBFX1NTSUQ7Ci0JaWUtPmxlbiA9IGJzcy0+c3NpZF9sZW47Ci0JbWVtY3B5KGllLT5kYXRhLCBic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pOwotCW5leHRfaWUoJmllKTsKLQotCWllLT5pZCA9IE1GSUVfVFlQRV9SQVRFUzsKLQlpZS0+bGVuID0gc2l6ZW9mKGh3X3JhdGVzKTsKLQltZW1jcHkoaWUtPmRhdGEsIGh3X3JhdGVzLCBzaXplb2YoaHdfcmF0ZXMpKTsKLQluZXh0X2llKCZpZSk7CQkvKiBpZSBwb2ludHMgYmVoaW5kIHRoZSBzdXBwX3JhdGVzIGZpZWxkICovCi0KLQkvKiBpbml0LiBhdDc2X3ByaXYgdHggaGVhZGVyICovCi0JdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoKHU4ICopaWUgLSAodTggKiltZ210KTsKLQotCWllID0gcmVxLT5pbmZvX2VsZW1lbnQ7Ci0JZXNzaWQgPSBpZS0+ZGF0YTsKLQllc3NpZF9sZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCW5leHRfaWUoJmllKTsJCS8qIHBvaW50cyB0byBJRSBvZiByYXRlcyBub3cgKi8KLQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwKLQkJICIlczogQXNzb2NSZXEgYnNzaWQgJXMgY2FwYSAweCUwNHggc3NpZCAlLipzIHJhdGVzICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihtZ210LT5hZGRyMyksCi0JCSBsZTE2X3RvX2NwdShyZXEtPmNhcGFiaWxpdHkpLCBlc3NpZF9sZW4sIGVzc2lkLAotCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCi0JLyogZWl0aGVyIHNlbmQgaW1tZWRpYXRlbHkgKGlmIG5vIGRhdGEgdHggaXMgcGVuZGluZwotCSAgIG9yIHB1dCBpdCBpbiBwZW5kaW5nIGxpc3QgKi8KLQlyZXR1cm4gYXQ3Nl90eF9tZ210KHByaXYsIHR4X2J1ZmZlcik7Ci19Ci0KLS8qIFdlIGdvdCB0byBjaGVjayB0aGUgYnNzX2xpc3QgZm9yIG9sZCBlbnRyaWVzICovCi1zdGF0aWMgdm9pZCBhdDc2X2Jzc19saXN0X3RpbWVvdXQodW5zaWduZWQgbG9uZyBwYXIpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXQ3Nl9wcml2ICopcGFyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpwdHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShscHRyLCBucHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQotCQlwdHIgPSBsaXN0X2VudHJ5KGxwdHIsIHN0cnVjdCBic3NfaW5mbywgbGlzdCk7Ci0KLQkJaWYgKHB0ciAhPSBwcml2LT5jdXJyX2JzcwotCQkgICAgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBwdHItPmxhc3RfcnggKyBCU1NfTElTVF9USU1FT1VUKSkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRV9STSwKLQkJCQkgIiVzOiBic3NfbGlzdDogcmVtb3Zpbmcgb2xkIEJTUyAlcyBjaCAlZCIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwdHItPmJzc2lkKSwKLQkJCQkgcHRyLT5jaGFubmVsKTsKLQkJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwotCQkJa2ZyZWUocHRyKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCS8qIHJlc3RhcnQgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZwcml2LT5ic3NfbGlzdF90aW1lciwgamlmZmllcyArIEJTU19MSVNUX1RJTUVPVVQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9zZXRfbWFjX3N0YXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkJICAgICAgZW51bSBtYWNfc3RhdGUgbWFjX3N0YXRlKQotewotCWF0NzZfZGJnKERCR19NQUNfU1RBVEUsICIlcyBzdGF0ZTogJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWNfc3RhdGVzW21hY19zdGF0ZV0pOwotCXByaXYtPm1hY19zdGF0ZSA9IG1hY19zdGF0ZTsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9kdW1wX2Jzc190YWJsZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBic3NfaW5mbyAqcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0cjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzIEJTUyB0YWJsZSAoY3Vycj0lcCk6IiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y3Vycl9ic3MpOwotCi0JbGlzdF9mb3JfZWFjaChscHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJcHRyID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLCAiMHglcDogYnNzaWQgJXMgY2hhbm5lbCAlZCBzc2lkICUuKnMgIgotCQkJICIoJXMpIGNhcGEgMHglMDR4IHJhdGVzICVzIHJzc2kgJWQgbGluayAlZCBub2lzZSAlZCIsCi0JCQkgcHRyLCBtYWMyc3RyKHB0ci0+YnNzaWQpLCBwdHItPmNoYW5uZWwsIHB0ci0+c3NpZF9sZW4sCi0JCQkgcHRyLT5zc2lkLCBoZXgyc3RyKHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbiksCi0JCQkgcHRyLT5jYXBhLCBoZXgyc3RyKHB0ci0+cmF0ZXMsIHB0ci0+cmF0ZXNfbGVuKSwKLQkJCSBwdHItPnJzc2ksIHB0ci0+bGlua19xdWFsLCBwdHItPm5vaXNlX2xldmVsKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiB0byBtYXJrIGludGVyZmFjZSBhcyBjb25uZWN0ZWQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfd29ya19hc3NvY19kb25lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIHdvcmtfYXNzb2NfZG9uZSk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKTsKLQlXQVJOX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7Ci0JCWlmIChwcml2LT5wbV9tb2RlICE9IEFUNzZfUE1fT0ZGKSB7Ci0JCQkvKiBjYWxjdWxhdGUgdGhlIGxpc3RlbiBpbnRlcnZhbCBpbiB1bml0cyBvZgotCQkJICAgYmVhY29uIGludGVydmFscyBvZiB0aGUgY3Vycl9ic3MgKi8KLQkJCXUzMiBwbV9wZXJpb2RfYmVhY29uID0gKHByaXYtPnBtX3BlcmlvZCA+PiAxMCkgLwotCQkJICAgIHByaXYtPmN1cnJfYnNzLT5iZWFjb25faW50ZXJ2YWw7Ci0KLQkJCXBtX3BlcmlvZF9iZWFjb24gPSBtYXgocG1fcGVyaW9kX2JlYWNvbiwgMnUpOwotCQkJcG1fcGVyaW9kX2JlYWNvbiA9IG1pbihwbV9wZXJpb2RfYmVhY29uLCAweGZmZmZ1KTsKLQotCQkJYXQ3Nl9kYmcoREJHX1BNLAotCQkJCSAiJXM6IHBtX21vZGUgJWQgYXNzb2MgaWQgMHgleCBsaXN0ZW4gaW50ICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLAotCQkJCSBwcml2LT5hc3NvY19pZCwgcG1fcGVyaW9kX2JlYWNvbik7Ci0KLQkJCWF0NzZfc2V0X2Fzc29jaWQocHJpdiwgcHJpdi0+YXNzb2NfaWQpOwotCQkJYXQ3Nl9zZXRfbGlzdGVuX2ludGVydmFsKHByaXYsICh1MTYpcG1fcGVyaW9kX2JlYWNvbik7Ci0JCX0KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24sIEJFQUNPTl9USU1FT1VUKTsKLQl9Ci0JYXQ3Nl9zZXRfcG1fbW9kZShwcml2KTsKLQotCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCWF0NzZfaXdldmVudF9ic3NfY29ubmVjdChwcml2LT5uZXRkZXYsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCk7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IGNvbm5lY3RlZCB0byBCU1NJRCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIocHJpdi0+Y3Vycl9ic3MtPmJzc2lkKSk7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBXZSBvbmx5IHN0b3JlIHRoZSBuZXcgbWFjIGFkZHJlc3MgaW4gbmV0ZGV2IHN0cnVjdCwKLSAgIGl0IGdldHMgc2V0IHdoZW4gdGhlIG5ldGRldiBpcyBvcGVuZWQuICovCi1zdGF0aWMgaW50IGF0NzZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKmFkZHIpCi17Ci0Jc3RydWN0IHNvY2thZGRyICptYWMgPSBhZGRyOwotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdDc2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXJldHVybiAmcHJpdi0+c3RhdHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIlJFVFVSTiBxdWFsICVkIGxldmVsICVkIG5vaXNlICVkIHVwZGF0ZWQgJWQiLAotCQkgcHJpdi0+d3N0YXRzLnF1YWwucXVhbCwgcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwsCi0JCSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSwgcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCk7Ci0KLQlyZXR1cm4gJnByaXYtPndzdGF0czsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHByb21pc2M7Ci0KLQlwcm9taXNjID0gKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICE9IDApOwotCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2MpIHsKLQkJLyogVGhpcyBnZXRzIGNhbGxlZCBpbiBpbnRlcnJ1cHQsIG11c3QgcmVzY2hlZHVsZSAqLwotCQlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zZXRfcHJvbWlzYyk7Ci0JfQotfQotCi0vKiBTdG9wIGFsbCBuZXR3b3JrIGFjdGl2aXR5LCBmbHVzaCBhbGwgcGVuZGluZyB0YXNrcyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9xdWllc2NlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCi0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19JTklUKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19yZXN0YXJ0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUocHJpdi0+bmV4dF9tZ210X2J1bGspOwotCXByaXYtPm5leHRfbWdtdF9idWxrID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBhdDc2X3ByaXYgaW1wbGVtZW50YXRpb25zIG9mIGl3X2hhbmRsZXIgZnVuY3Rpb25zOgotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB2b2lkICpudWxsLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzICVzOiByZXN0YXJ0aW5nIHRoZSBkZXZpY2UiLCBuZXRkZXYtPm5hbWUsCi0JCSBfX2Z1bmNfXyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUKQotCQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBXYWl0IGhhbGYgc2Vjb25kIGJlZm9yZSB0aGUgcmVzdGFydCB0byBwcm9jZXNzIHN1YnNlcXVlbnQKLQkgKiByZXF1ZXN0cyBmcm9tIHRoZSBzYW1lIGl3Y29uZmlnIGluIGEgc2luZ2xlIHJlc3RhcnQgKi8KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIEhaIC8gMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RyY3B5KG5hbWUsICJJRUVFIDgwMi4xMWIiKTsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV05BTUUgLSBuYW1lICVzIiwgbmV0ZGV2LT5uYW1lLCBuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBjaGFuID0gLTE7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkVRIC0gZnJlcS5tICVkIGZyZXEuZSAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyZXEtPm0sIGZyZXEtPmUpOwotCi0JaWYgKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQotCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCi0JCWNoYW4gPSBmcmVxLT5tOwotCWVsc2UgewotCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgKi8KLQkJaW50IG11bHQgPSAxOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgKDYgLSBmcmVxLT5lKTsgaSsrKQotCQkJbXVsdCAqPSAxMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspIHsKLQkJCWlmIChmcmVxLT5tID09IChjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIG11bHQpKQotCQkJCWNoYW4gPSBpICsgMTsKLQkJfQotCX0KLQotCWlmIChjaGFuIDwgMSB8fCAhcHJpdi0+ZG9tYWluKQotCQkvKiBub24tcG9zaXRpdmUgY2hhbm5lbHMgYXJlIGludmFsaWQKLQkJICogd2UgbmVlZCBhIGRvbWFpbiBpbmZvIHRvIHNldCB0aGUgY2hhbm5lbAotCQkgKiBlaXRoZXIgdGhhdCBvciBhbiBpbnZhbGlkIGZyZXF1ZW5jeSB3YXMKLQkJICogcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIGlmICghKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMSA8PCAoY2hhbiAtIDEpKSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoYW5uZWwgJWQgbm90IGFsbG93ZWQgZm9yIGRvbWFpbiAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgY2hhbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocmV0ID09IC1FSVdDT01NSVQpIHsKLQkJcHJpdi0+Y2hhbm5lbCA9IGNoYW47Ci0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkJIGNoYW4pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWZyZXEtPm0gPSBwcml2LT5jaGFubmVsOwotCWZyZXEtPmUgPSAwOwotCi0JaWYgKHByaXYtPmNoYW5uZWwpCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGZyZXEgJWxkIHggMTBlJWQiLAotCQkJIG5ldGRldi0+bmFtZSwgY2hhbm5lbF9mcmVxdWVuY3lbcHJpdi0+Y2hhbm5lbCAtIDFdLCA2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJFUSAtIGNoICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgcHJpdi0+Y2hhbm5lbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCWlmICgoKm1vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYgKCptb2RlICE9IElXX01PREVfSU5GUkEpICYmCi0JICAgICgqbW9kZSAhPSBJV19NT0RFX01PTklUT1IpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPml3X21vZGUgPSAqbW9kZTsKLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQotCQlwcml2LT5wbV9tb2RlID0gQVQ3Nl9QTV9PRkY7Ci0KLQlyZXR1cm4gLUVJV0NPTU1JVDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JKm1vZGUgPSBwcml2LT5pd19tb2RlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdNT0RFIC0gJWQiLCBuZXRkZXYtPm5hbWUsICptb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCS8qIGluc3BpcmVkIGJ5IGF0bWVsLmMgKi8KLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOwotCWludCBpOwotCi0JZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7Ci0KLQkvKiBUT0RPOiByYW5nZS0+dGhyb3VnaHB1dCA9IHh4eHh4eDsgKi8KLQotCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKLQlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7Ci0KLQkvKiB0aGlzIGRyaXZlciBkb2Vzbid0IG1haW50YWluIHNlbnNpdGl2aXR5IGluZm9ybWF0aW9uICovCi0JcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKLQotCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDEwMDsKLQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSA1MDsKLQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCi0JcmFuZ2UtPmJpdHJhdGVbMF0gPSAxMDAwMDAwOwotCXJhbmdlLT5iaXRyYXRlWzFdID0gMjAwMDAwMDsKLQlyYW5nZS0+Yml0cmF0ZVsyXSA9IDU1MDAwMDA7Ci0JcmFuZ2UtPmJpdHJhdGVbM10gPSAxMTAwMDAwMDsKLQlyYW5nZS0+bnVtX2JpdHJhdGVzID0gNDsKLQotCXJhbmdlLT5taW5fcnRzID0gMDsKLQlyYW5nZS0+bWF4X3J0cyA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOwotCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQotCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7Ci0JcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX09OOwotCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfQUxMX1I7Ci0KLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IFdFUF9TTUFMTF9LRVlfTEVOOwotCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gV0VQX0xBUkdFX0tFWV9MRU47Ci0JcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7Ci0JcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBXRVBfS0VZUzsKLQotCS8qIGJvdGggV0wtMjQwVSBhbmQgTGlua3N5cyBXVVNCMTEgdjIuNiBzcGVjaWZ5IDE1IGRCbSBhcyBvdXRwdXQgcG93ZXIKLQkgICAtIHRha2UgdGhpcyBmb3IgYWxsIChpZ25vcmUgYW50ZW5uYSBnYWlucykgKi8KLQlyYW5nZS0+dHhwb3dlclswXSA9IDE1OwotCXJhbmdlLT5udW1fdHhwb3dlciA9IDE7Ci0JcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKLQotCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQotCS8qIHNhbWUgYXMgdGhlIHZhbHVlcyB1c2VkIGluIGF0bWVsLmMgKi8KLQlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSAwOwotCXJhbmdlLT5taW5fcmV0cnkgPSAxOwotCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0KLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwotCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewotCQkvKiB0ZXN0IGlmIGNoYW5uZWwgbWFwIGJpdCBpcyByYWlzZWQgKi8KLQkJaWYgKHByaXYtPmRvbWFpbi0+Y2hhbm5lbF9tYXAgJiAoMHgxIDw8IGkpKSB7Ci0JCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSArPSAxOwotCi0JCQlyYW5nZS0+ZnJlcVtpXS5pID0gaSArIDE7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7Ci0JCQlyYW5nZS0+ZnJlcVtpXS5lID0gMTsJLyogZnJlcSAqIDEwXjEgKi8KLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUkFOR0UiLCBuZXRkZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NQWSAtIG51bWJlciBvZiBhZGRyZXNzZXMgJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3NweShwcml2LT5uZXRkZXYsIGluZm8sCi0JCQkJICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXVEhSU1BZIC0gbnVtYmVyIG9mIGFkZHJlc3NlcyAlZCkiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfc2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCXJldCA9IGl3X2hhbmRsZXJfZ2V0X3RocnNweShuZXRkZXYsIGluZm8sICh1bmlvbiBpd3JlcV9kYXRhICopZGF0YSwKLQkJCQkgICAgZXh0cmEpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdUSFJTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkKSIsCi0JCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdBUCAtIHdhcC9ic3NpZCAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIoYXBfYWRkci0+c2FfZGF0YSkpOwotCi0JLyogaWYgdGhlIGluY29taW5nIGFkZHJlc3MgPT0gZmY6ZmY6ZmY6ZmY6ZmY6ZmYsIHRoZSB1c2VyIGhhcwotCSAgIGNob3NlbiBhbnkgb3IgYXV0byBBUCBwcmVmZXJlbmNlICovCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFwX2FkZHItPnNhX2RhdGEpCi0JICAgIHx8IGlzX3plcm9fZXRoZXJfYWRkcihhcF9hZGRyLT5zYV9kYXRhKSkKLQkJcHJpdi0+d2FudGVkX2Jzc2lkX3ZhbGlkID0gMDsKLQllbHNlIHsKLQkJLyogdXNlciB3YW50cyB0byBzZXQgYSBwcmVmZXJyZWQgQVAgYWRkcmVzcyAqLwotCQlwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgPSAxOwotCQltZW1jcHkocHJpdi0+d2FudGVkX2Jzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0JfQotCi0JcmV0dXJuIC1FSVdDT01NSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV0FQIC0gd2FwL2Jzc2lkICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgbWFjMnN0cihhcF9hZGRyLT5zYV9kYXRhKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1NDQU4iLCBuZXRkZXYtPm5hbWUpOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHJpdi0+bXR4KSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCXJldCA9IC1FTkVURE9XTjsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGphbDogd2UgZG9uJ3QgYWxsb3cgIml3bGlzdCBldGhYIHNjYW4iIHdoaWxlIHdlIGFyZQotCSAgIGluIG1vbml0b3IgbW9kZSAqLwotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBEaXNjYXJkIG9sZCBzY2FuIHJlc3VsdHMgKi8KLQlpZiAoKGppZmZpZXMgLSBwcml2LT5sYXN0X3NjYW4pID4gKDIwICogSFopKQotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQkvKiBJbml0aWF0ZSBhIHNjYW4gY29tbWFuZCAqLwotCWlmIChwcml2LT5zY2FuX3N0YXRlID09IFNDQU5fSU5fUFJPR1JFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJpdi0+c2Nhbl9zdGF0ZSA9IFNDQU5fSU5fUFJPR1JFU1M7Ci0KLQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQkvKiBUcnkgdG8gZG8gcGFzc2l2ZSBvciBhY3RpdmUgc2NhbiBpZiBXRSBhc2tzIGFzLiAqLwotCWlmICh3cnF1LT5kYXRhLmxlbmd0aAotCSAgICAmJiB3cnF1LT5kYXRhLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IGl3X3NjYW5fcmVxKSkgewotCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKilleHRyYTsKLQotCQlpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX1BBU1NJVkUpCi0JCQlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfUEFTU0lWRTsKLQkJZWxzZSBpZiAocmVxLT5zY2FuX3R5cGUgPT0gSVdfU0NBTl9UWVBFX0FDVElWRSkKLQkJCXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fVFlQRV9BQ1RJVkU7Ci0KLQkJLyogU2FuaXR5IGNoZWNrIHZhbHVlcz8gKi8KLQkJaWYgKHJlcS0+bWluX2NoYW5uZWxfdGltZSA+IDApCi0JCQlwcml2LT5zY2FuX21pbl90aW1lID0gcmVxLT5taW5fY2hhbm5lbF90aW1lOwotCi0JCWlmIChyZXEtPm1heF9jaGFubmVsX3RpbWUgPiAwKQotCQkJcHJpdi0+c2Nhbl9tYXhfdGltZSA9IHJlcS0+bWF4X2NoYW5uZWxfdGltZTsKLQl9Ci0KLQkvKiBjaGFuZ2UgdG8gc2Nhbm5pbmcgc3RhdGUgKi8KLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4pOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHB0ciwgKm5wdHI7Ci0Jc3RydWN0IGJzc19pbmZvICpjdXJyX2JzczsKLQlzdHJ1Y3QgaXdfZXZlbnQgKml3ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd19ldmVudCksIEdGUF9LRVJORUwpOwotCWNoYXIgKmN1cnJfdmFsLCAqY3Vycl9wb3MgPSBleHRyYTsKLQlpbnQgaTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXU0NBTiIsIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoIWl3ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAocHJpdi0+c2Nhbl9zdGF0ZSAhPSBTQ0FOX0NPTVBMRVRFRCkgewotCQkvKiBzY2FuIG5vdCB5ZXQgZmluaXNoZWQgKi8KLQkJa2ZyZWUoaXdlKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobHB0ciwgbnB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCWN1cnJfYnNzID0gbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0FQOwotCQlpd2UtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShpd2UtPnUuYXBfYWRkci5zYV9kYXRhLCBjdXJyX2Jzcy0+YnNzaWQsIDYpOwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlJV19FVl9BRERSX0xFTik7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gY3Vycl9ic3MtPnNzaWRfbGVuOwotCQlpd2UtPmNtZCA9IFNJT0NHSVdFU1NJRDsKLQkJaXdlLT51LmRhdGEuZmxhZ3MgPSAxOwotCi0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCWN1cnJfYnNzLT5zc2lkKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpd2UtPnUubW9kZSA9IChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/Ci0JCSAgICBJV19NT0RFX0FESE9DIDoKLQkJICAgIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpID8KLQkJICAgIElXX01PREVfTUFTVEVSIDogSVdfTU9ERV9BVVRPOwotCQkvKiBJV19NT0RFX0FVVE8gPSAwIHdoaWNoIEkgdGhvdWdodCBpcwotCQkgKiB0aGUgbW9zdCBsb2dpY2FsIHZhbHVlIHRvIHJldHVybiBpbiB0aGlzIGNhc2UgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfVUlOVF9MRU4pOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0ZSRVE7Ci0JCWl3ZS0+dS5mcmVxLm0gPSBjdXJyX2Jzcy0+Y2hhbm5lbDsKLQkJaXdlLT51LmZyZXEuZSA9IDA7Ci0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCUlXX0VWX0ZSRVFfTEVOKTsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdFTkNPREU7Ci0JCWlmIChjdXJyX2Jzcy0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQkJZWxzZQotCQkJaXdlLT51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0KLQkJaXdlLT51LmRhdGEubGVuZ3RoID0gMDsKLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJTlVMTCk7Ci0KLQkJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwotCQlpd2UtPmNtZCA9IElXRVZRVUFMOwotCQlpd2UtPnUucXVhbC5ub2lzZSA9IDA7Ci0JCWl3ZS0+dS5xdWFsLnVwZGF0ZWQgPQotCQkgICAgSVdfUVVBTF9OT0lTRV9JTlZBTElEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVEOwotCQlpd2UtPnUucXVhbC5sZXZlbCA9IChjdXJyX2Jzcy0+cnNzaSAqIDEwMCAvIDQyKTsKLQkJaWYgKGl3ZS0+dS5xdWFsLmxldmVsID4gMTAwKQotCQkJaXdlLT51LnF1YWwubGV2ZWwgPSAxMDA7Ci0JCWlmIChhdDc2X2lzX2ludGVyc2lsKHByaXYtPmJvYXJkX3R5cGUpKQotCQkJaXdlLT51LnF1YWwucXVhbCA9IGN1cnJfYnNzLT5saW5rX3F1YWw7Ci0JCWVsc2UgewotCQkJaXdlLT51LnF1YWwucXVhbCA9IDA7Ci0JCQlpd2UtPnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9JTlZBTElEOwotCQl9Ci0JCS8qIEFkZCBuZXcgdmFsdWUgdG8gZXZlbnQgKi8KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfUVVBTF9MRU4pOwotCi0JCS8qIFJhdGU6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlcwotCQkgKiBhIGJpdCBtb3JlIG9mIG1hZ2ljIC0gSmVhbiBJSSAqLwotCQljdXJyX3ZhbCA9IGN1cnJfcG9zICsgSVdfRVZfTENQX0xFTjsKLQotCQlpd2UtPmNtZCA9IFNJT0NHSVdSQVRFOwotCQkvKiBUaG9zZSB0d28gZmxhZ3MgYXJlIGlnbm9yZWQuLi4gKi8KLQkJaXdlLT51LmJpdHJhdGUuZml4ZWQgPSAwOwotCQlpd2UtPnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7Ci0JCS8qIE1heCA4IHZhbHVlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY3Vycl9ic3MtPnJhdGVzX2xlbjsgaSsrKSB7Ci0JCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLwotCQkJaXdlLT51LmJpdHJhdGUudmFsdWUgPQotCQkJICAgICgoY3Vycl9ic3MtPnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOwotCQkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLwotCQkJY3Vycl92YWwgPSBpd2Vfc3RyZWFtX2FkZF92YWx1ZShpbmZvLCBjdXJyX3BvcywKLQkJCQkJCQljdXJyX3ZhbCwKLQkJCQkJCQlleHRyYSArCi0JCQkJCQkJSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJCUlXX0VWX1BBUkFNX0xFTik7Ci0JCX0KLQotCQkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KLQkJaWYgKChjdXJyX3ZhbCAtIGN1cnJfcG9zKSA+IElXX0VWX0xDUF9MRU4pCi0JCQljdXJyX3BvcyA9IGN1cnJfdmFsOwotCi0JCS8qIG1vcmUgaW5mb3JtYXRpb24gbWF5IGJlIHNlbnQgYmFjayB1c2luZyBJV0VDVVNUT00gKi8KLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlkYXRhLT5sZW5ndGggPSAoY3Vycl9wb3MgLSBleHRyYSk7Ci0JZGF0YS0+ZmxhZ3MgPSAwOwotCi0Ja2ZyZWUoaXdlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRVNTSUQgLSAlcyIsIG5ldGRldi0+bmFtZSwgZXh0cmEpOwotCi0JaWYgKGRhdGEtPmZsYWdzKSB7Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBkYXRhLT5sZW5ndGg7Ci0JfSBlbHNlCi0JCXByaXYtPmVzc2lkX3NpemUgPSAwOwkvKiBVc2UgYW55IFNTSUQgKi8KLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JaWYgKHByaXYtPmVzc2lkX3NpemUpIHsKLQkJLyogbm90IHRoZSBBTlkgc3NpZCBpbiBwcml2LT5lc3NpZCAqLwotCQlkYXRhLT5mbGFncyA9IDE7Ci0JCWRhdGEtPmxlbmd0aCA9IHByaXYtPmVzc2lkX3NpemU7Ci0JCW1lbWNweShleHRyYSwgcHJpdi0+ZXNzaWQsIGRhdGEtPmxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJLyogdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQgKi8KLQkJaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEICYmIHByaXYtPmN1cnJfYnNzKSB7Ci0JCQkvKiByZXBvcnQgdGhlIFNTSUQgd2UgaGF2ZSBmb3VuZCAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAxOwotCQkJZGF0YS0+bGVuZ3RoID0gcHJpdi0+Y3Vycl9ic3MtPnNzaWRfbGVuOwotCQkJbWVtY3B5KGV4dHJhLCBwcml2LT5jdXJyX2Jzcy0+c3NpZCwgZGF0YS0+bGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcG9ydCBBTlkgYmFjayAqLwotCQkJZGF0YS0+ZmxhZ3MgPSAwOwotCQkJZGF0YS0+bGVuZ3RoID0gMDsKLQkJfQotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRVNTSUQgLSAlLipzIiwgbmV0ZGV2LT5uYW1lLAotCQkgZGF0YS0+bGVuZ3RoLCBleHRyYSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpiaXRyYXRlLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXUkFURSAtICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgYml0cmF0ZS0+dmFsdWUpOwotCi0Jc3dpdGNoIChiaXRyYXRlLT52YWx1ZSkgewotCWNhc2UgLTE6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfQVVUTzsKLQkJYnJlYWs7CQkvKiBhdXRvIHJhdGUgKi8KLQljYXNlIDEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMjAwMDAwMDoKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV8yTUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSA1NTAwMDAwOgotCQlwcml2LT50eHJhdGUgPSBUWF9SQVRFXzVfNU1CSVQ7Ci0JCWJyZWFrOwotCWNhc2UgMTEwMDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfMTFNQklUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19wYXJhbSAqYml0cmF0ZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHByaXYtPnR4cmF0ZSkgewotCQkvKiByZXR1cm4gbWF4IHJhdGUgaWYgUkFURV9BVVRPICovCi0JY2FzZSBUWF9SQVRFX0FVVE86Ci0JCWJpdHJhdGUtPnZhbHVlID0gMTEwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgVFhfUkFURV8xTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMDAwMDAwOwotCQlicmVhazsKLQljYXNlIFRYX1JBVEVfMk1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gMjAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzVfNU1CSVQ6Ci0JCWJpdHJhdGUtPnZhbHVlID0gNTUwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzExTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMTAwMDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQliaXRyYXRlLT5maXhlZCA9IChwcml2LT50eHJhdGUgIT0gVFhfUkFURV9BVVRPKTsKLQliaXRyYXRlLT5kaXNhYmxlZCA9IDA7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JBVEUgLSAlZCIsIG5ldGRldi0+bmFtZSwKLQkJIGJpdHJhdGUtPnZhbHVlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgcnRociA9IHJ0cy0+dmFsdWU7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAocnRzLT5kaXNhYmxlZCkKLQkJcnRociA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JaWYgKChydGhyIDwgMCkgfHwgKHJ0aHIgPiBNQVhfUlRTX1RIUkVTSE9MRCkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQlwcml2LT5ydHNfdGhyZXNob2xkID0gcnRocjsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXJ0cy0+dmFsdWUgPSBwcml2LT5ydHNfdGhyZXNob2xkOwotCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA+PSBNQVhfUlRTX1RIUkVTSE9MRCk7Ci0JcnRzLT5maXhlZCA9IDE7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JUUyAtIHZhbHVlICVkIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgcnRzLT52YWx1ZSwgKHJ0cy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlpbnQgZnRociA9IGZyYWctPnZhbHVlOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkFHIC0gdmFsdWUgJWQsIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgZnJhZy0+dmFsdWUsCi0JCSAoZnJhZy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAoZnJhZy0+ZGlzYWJsZWQpCi0JCWZ0aHIgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0KLQlpZiAoKGZ0aHIgPCBNSU5fRlJBR19USFJFU0hPTEQpIHx8IChmdGhyID4gTUFYX0ZSQUdfVEhSRVNIT0xEKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPmZyYWdfdGhyZXNob2xkID0gZnRociAmIH4weDE7CS8qIGdldCBhbiBldmVuIHZhbHVlICovCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JZnJhZy0+dmFsdWUgPSBwcml2LT5mcmFnX3RocmVzaG9sZDsKLQlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA+PSBNQVhfRlJBR19USFJFU0hPTEQpOwotCWZyYWctPmZpeGVkID0gMTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRlJBRyAtIHZhbHVlICVkLCBkaXNhYmxlZCAlcyIsCi0JCSBuZXRkZXYtPm5hbWUsIGZyYWctPnZhbHVlLAotCQkgKGZyYWctPmRpc2FibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcG93ZXIsIGNoYXIgKmV4dHJhKQotewotCXBvd2VyLT52YWx1ZSA9IDE1OwotCXBvd2VyLT5maXhlZCA9IDE7CS8qIE5vIHBvd2VyIGNvbnRyb2wgKi8KLQlwb3dlci0+ZGlzYWJsZWQgPSAwOwotCXBvd2VyLT5mbGFncyA9IElXX1RYUE9XX0RCTTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXVFhQT1cgLSB0eHBvdyAlZCBkQm0iLCBuZXRkZXYtPm5hbWUsCi0JCSBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGphbDogc2hvcnQgcmV0cnkgaXMgaGFuZGxlZCBieSB0aGUgZmlybXdhcmUgKGF0IGxlYXN0IDAuOTAueCksCi0gICB3aGlsZSBsb25nIHJldHJ5IGlzIG5vdCAoPykgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdSRVRSWSBkaXNhYmxlZCAlZCBmbGFncyAweCV4IHZhbCAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIHJldHJ5LT5kaXNhYmxlZCwgcmV0cnktPmZsYWdzLCByZXRyeS0+dmFsdWUpOwotCi0JaWYgKCFyZXRyeS0+ZGlzYWJsZWQgJiYgKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSkgewotCQlpZiAoKHJldHJ5LT5mbGFncyAmIElXX1JFVFJZX01JTikgfHwKLQkJICAgICEocmV0cnktPmZsYWdzICYgSVdfUkVUUllfTUFYKSkKLQkJCXByaXYtPnNob3J0X3JldHJ5X2xpbWl0ID0gcmV0cnktPnZhbHVlOwotCQllbHNlCi0JCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogQWRhcHRlZCAocmlwcGVkKSBmcm9tIGF0bWVsLmMgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcmV0cnksIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdSRVRSWSIsIG5ldGRldi0+bmFtZSk7Ci0KLQlyZXRyeS0+ZGlzYWJsZWQgPSAwOwkvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLwotCXJldHJ5LT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJldHJ5LT52YWx1ZSA9IHByaXYtPnNob3J0X3JldHJ5X2xpbWl0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBpbmRleCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQlpbnQgbGVuID0gZW5jb2RpbmctPmxlbmd0aDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gb2xkIHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAiYXV0aF9tb2RlICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgKHByaXYtPndlcF9lbmFibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHByaXYtPndlcF9rZXlfaWQsCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCS8qIHRha2UgdGhlIG9sZCBkZWZhdWx0IGtleSBpZiBpbmRleCBpcyBpbnZhbGlkICovCi0JaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBXRVBfS0VZUykpCi0JCWluZGV4ID0gcHJpdi0+d2VwX2tleV9pZDsKLQotCWlmIChsZW4gPiAwKSB7Ci0JCWlmIChsZW4gPiBXRVBfTEFSR0VfS0VZX0xFTikKLQkJCWxlbiA9IFdFUF9MQVJHRV9LRVlfTEVOOwotCi0JCW1lbXNldChwcml2LT53ZXBfa2V5c1tpbmRleF0sIDAsIFdFUF9LRVlfTEVOKTsKLQkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2luZGV4XSwgZXh0cmEsIGxlbik7Ci0JCXByaXYtPndlcF9rZXlzX2xlbltpbmRleF0gPSAobGVuIDw9IFdFUF9TTUFMTF9LRVlfTEVOKSA/Ci0JCSAgICBXRVBfU01BTExfS0VZX0xFTiA6IFdFUF9MQVJHRV9LRVlfTEVOOwotCQlwcml2LT53ZXBfZW5hYmxlZCA9IDE7Ci0JfQotCi0JcHJpdi0+d2VwX2tleV9pZCA9IGluZGV4OwotCXByaXYtPndlcF9lbmFibGVkID0gKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpID09IDApOwotCi0JaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQotCQlwcml2LT5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQlpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCXByaXYtPmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9PUEVOOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXRU5DT0RFIC0gbmV3IHdlcHN0YXRlOiBlbmFibGVkICVzIGtleV9pZCAlZCAiCi0JCSAia2V5X2xlbiAlZCBhdXRoX21vZGUgJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSAocHJpdi0+d2VwX2VuYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJpdi0+d2VwX2tleV9pZCArIDEsCi0JCSBwcml2LT53ZXBfa2V5c19sZW5bcHJpdi0+d2VwX2tleV9pZF0sCi0JCSAocHJpdi0+YXV0aF9tb2RlID09Ci0JCSAgV0xBTl9BVVRIX1NIQVJFRF9LRVkpID8gInJlc3RyaWN0ZWQiIDogIm9wZW4iKTsKLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgaW5kZXggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0KLQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IFdFUF9LRVlTKSkKLQkJaW5kZXggPSBwcml2LT53ZXBfa2V5X2lkOwotCi0JZW5jb2RpbmctPmZsYWdzID0KLQkgICAgKHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPwotCSAgICBJV19FTkNPREVfUkVTVFJJQ1RFRCA6IElXX0VOQ09ERV9PUEVOOwotCi0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCkKLQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQotCWlmIChlbmNvZGluZy0+cG9pbnRlcikgewotCQllbmNvZGluZy0+bGVuZ3RoID0gcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XTsKLQotCQltZW1jcHkoZXh0cmEsIHByaXYtPndlcF9rZXlzW2luZGV4XSwgcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XSk7Ci0KLQkJZW5jb2RpbmctPmZsYWdzIHw9IChpbmRleCArIDEpOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXRU5DT0RFIC0gZW5jLmZsYWdzICUwOHggIgotCQkgInBvaW50ZXIgJXAgbGVuICVkIiwgbmV0ZGV2LT5uYW1lLCBlbmNvZGluZy0+ZmxhZ3MsCi0JCSBlbmNvZGluZy0+cG9pbnRlciwgZW5jb2RpbmctPmxlbmd0aCk7Ci0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DR0lXRU5DT0RFIC0gd2Vwc3RhdGU6IGVuYWJsZWQgJXMga2V5X2lkICVkICIKLQkJICJrZXlfbGVuICVkIGF1dGhfbW9kZSAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIChwcml2LT53ZXBfZW5hYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiLCBwcml2LT53ZXBfa2V5X2lkICsgMSwKLQkJIHByaXYtPndlcF9rZXlzX2xlbltwcml2LT53ZXBfa2V5X2lkXSwKLQkJIChwcml2LT5hdXRoX21vZGUgPT0KLQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPyAicmVzdHJpY3RlZCIgOiAib3BlbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcHJxLCBjaGFyICpleHRyYSkKLXsKLQlpbnQgZXJyID0gLUVJV0NPTU1JVDsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwKLQkJICIlczogU0lPQ1NJV1BPV0VSIC0gZGlzYWJsZWQgJXMgZmxhZ3MgMHgleCB2YWx1ZSAweCV4IiwKLQkJIG5ldGRldi0+bmFtZSwgKHBycS0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJxLT5mbGFncywKLQkJIHBycS0+dmFsdWUpOwotCi0JaWYgKHBycS0+ZGlzYWJsZWQpCi0JCXByaXYtPnBtX21vZGUgPSBBVDc2X1BNX09GRjsKLQllbHNlIHsKLQkJc3dpdGNoIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgewotCQljYXNlIElXX1BPV0VSX0FMTF9SOgotCQljYXNlIElXX1BPV0VSX09OOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfUEVSSU9EKQotCQkJcHJpdi0+cG1fcGVyaW9kID0gcHJxLT52YWx1ZTsKLQotCQlpZiAocHJxLT5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT047Ci0JfQotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnBvd2VyLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXBvd2VyLT5kaXNhYmxlZCA9IChwcml2LT5wbV9tb2RlID09IEFUNzZfUE1fT0ZGKTsKLQlpZiAoIXBvd2VyLT5kaXNhYmxlZCkgewotCQlwb3dlci0+ZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9BTExfUjsKLQkJcG93ZXItPnZhbHVlID0gcHJpdi0+cG1fcGVyaW9kOwotCX0KLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUE9XRVIgLSAlcyBmbGFncyAweCV4IHZhbHVlIDB4JXgiLAotCQkgbmV0ZGV2LT5uYW1lLCBwb3dlci0+ZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAotCQkgcG93ZXItPmZsYWdzLCBwb3dlci0+dmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQcml2YXRlIElPQ1RMUwotICovCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgICAgICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgdmFsID0gKigoaW50ICopbmFtZSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsKTsKLQotCWlmICh2YWwgPCBQUkVBTUJMRV9UWVBFX0xPTkcgfHwgdmFsID4gUFJFQU1CTEVfVFlQRV9BVVRPKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+cHJlYW1ibGVfdHlwZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2hvcnRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0Jc25wcmludGYod3JxdS0+bmFtZSwgc2l6ZW9mKHdycXUtPm5hbWUpLCAiJXMgKCVkKSIsCi0JCSBwcmVhbWJsZXNbcHJpdi0+cHJlYW1ibGVfdHlwZV0sIHByaXYtPnByZWFtYmxlX3R5cGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X2RlYnVnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JY2hhciAqcHRyOwotCXUzMiB2YWw7Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQl2YWwgPSBzaW1wbGVfc3RydG9sKGV4dHJhLCAmcHRyLCAwKTsKLQotCQlpZiAocHRyID09IGV4dHJhKQotCQkJdmFsID0gREJHX0RFRkFVTFRTOwotCi0JCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBBVDc2X1NFVF9ERUJVRyBpbnB1dCAlZDogJXMgLT4gMHgleCIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgsIGV4dHJhLCB2YWwpOwotCX0gZWxzZQotCQl2YWwgPSBEQkdfREVGQVVMVFM7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfREVCVUcsIG9sZCAweCV4LCBuZXcgMHgleCIsCi0JCSBuZXRkZXYtPm5hbWUsIGF0NzZfZGVidWcsIHZhbCk7Ci0KLQkvKiBqYWw6IHNvbWUgbW9yZSBvdXRwdXQgdG8gcGluIGRvd24gbG9ja3VwcyAqLwotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBuZXRpZiBydW5uaW5nICVkIHF1ZXVlX3N0b3BwZWQgJWQgIgotCQkgImNhcnJpZXJfb2sgJWQiLCBuZXRkZXYtPm5hbWUsIG5ldGlmX3J1bm5pbmcobmV0ZGV2KSwKLQkJIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSwgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKTsKLQotCWF0NzZfZGVidWcgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2dldF9kZWJ1ZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzbnByaW50Zih3cnF1LT5uYW1lLCBzaXplb2Yod3JxdS0+bmFtZSksICIweCUwOHgiLCBhdDc2X2RlYnVnKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICAgICAgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCAlZCAoJXMpIiwKLQkJIG5ldGRldi0+bmFtZSwgdmFsLAotCQkgdmFsID09IEFUNzZfUE1fT0ZGID8gImFjdGl2ZSIgOiB2YWwgPT0gQVQ3Nl9QTV9PTiA/ICJzYXZlIiA6Ci0JCSB2YWwgPT0gQVQ3Nl9QTV9TTUFSVCA/ICJzbWFydCBzYXZlIiA6ICI8aW52YWxpZD4iKTsKLQlpZiAodmFsIDwgQVQ3Nl9QTV9PRkYgfHwgdmFsID4gQVQ3Nl9QTV9TTUFSVCkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnBtX21vZGUgPSB2YWw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3Bvd2Vyc2F2ZV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5wbV9tb2RlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKm5hbWUsCi0JCQkJICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgbWludCA9ICooKGludCAqKW5hbWUpOwotCWludCBtYXh0ID0gKigoaW50ICopbmFtZSArIDEpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fVElNRVMgLSBtaW4gJWQgbWF4ICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgbWludCwgbWF4dCk7Ci0JaWYgKG1pbnQgPD0gMCB8fCBtYXh0IDw9IDAgfHwgbWludCA+IG1heHQpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCXByaXYtPnNjYW5fbWluX3RpbWUgPSBtaW50OwotCQlwcml2LT5zY2FuX21heF90aW1lID0gbWF4dDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X3NjYW5fdGltZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgKnBhcmFtID0gKGludCAqKWV4dHJhOwotCi0JcGFyYW1bMF0gPSBwcml2LT5zY2FuX21pbl90aW1lOwotCXBhcmFtWzFdID0gcHJpdi0+c2Nhbl9tYXhfdGltZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X3NldF9zY2FuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHZhbCA9ICooKGludCAqKW5hbWUpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX1NDQU5fTU9ERSAtIG1vZGUgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCAodmFsID0gU0NBTl9UWVBFX0FDVElWRSkgPyAiYWN0aXZlIiA6Ci0JCSAodmFsID0gU0NBTl9UWVBFX1BBU1NJVkUpID8gInBhc3NpdmUiIDogIjxpbnZhbGlkPiIpOwotCi0JaWYgKHZhbCAhPSBTQ0FOX1RZUEVfQUNUSVZFICYmIHZhbCAhPSBTQ0FOX1RZUEVfUEFTU0lWRSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnNjYW5fbW9kZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7Ci0KLQlwYXJhbVswXSA9IHByaXYtPnNjYW5fbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBBVDc2X1NFVF9IQU5ETEVSKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RdID0gKGl3X2hhbmRsZXIpIGYKLQotLyogU3RhbmRhcmQgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfaGFuZGxlcnNbXSA9IHsKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdDT01NSVQsIGF0NzZfaXdfaGFuZGxlcl9jb21taXQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV05BTUUsIGF0NzZfaXdfaGFuZGxlcl9nZXRfbmFtZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRlJFUSwgYXQ3Nl9pd19oYW5kbGVyX3NldF9mcmVxKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdGUkVRLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2ZyZXEpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV01PREUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfbW9kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXTU9ERSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9tb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSQU5HRSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYW5nZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVEhSU1BZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3RocnNweSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXQVAsIGF0NzZfaXdfaGFuZGxlcl9zZXRfd2FwKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdBUCwgYXQ3Nl9pd19oYW5kbGVyX2dldF93YXApLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1NDQU4sIGF0NzZfaXdfaGFuZGxlcl9zZXRfc2NhbiksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXU0NBTiwgYXQ3Nl9pd19oYW5kbGVyX2dldF9zY2FuKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdFU1NJRCwgYXQ3Nl9pd19oYW5kbGVyX3NldF9lc3NpZCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRVNTSUQsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZXNzaWQpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JBVEUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcmF0ZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXUkFURSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYXRlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSVFMsIGF0NzZfaXdfaGFuZGxlcl9nZXRfcnRzKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdGUkFHLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyYWcpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV0ZSQUcsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJhZyksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXVFhQT1csIGF0NzZfaXdfaGFuZGxlcl9nZXRfdHhwb3cpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JFVFJZLCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JldHJ5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSRVRSWSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9yZXRyeSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRU5DT0RFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2VuY29kZSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXUE9XRVIsIGF0NzZfaXdfaGFuZGxlcl9zZXRfcG93ZXIpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1BPV0VSLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3Bvd2VyKQotfTsKLQotI2RlZmluZSBBVDc2X1NFVF9QUklWKGgsIGYpIFtoIC0gU0lPQ0lXRklSU1RQUklWXSA9IChpd19oYW5kbGVyKSBmCi0KLS8qIFByaXZhdGUgd2lyZWxlc3MgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIGF0NzZfcHJpdl9oYW5kbGVyc1tdID0gewotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsIGF0NzZfaXdfc2V0X3Nob3J0X3ByZWFtYmxlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLCBhdDc2X2l3X2dldF9zaG9ydF9wcmVhbWJsZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X1NFVF9ERUJVRywgYXQ3Nl9pd19zZXRfZGVidWcpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9HRVRfREVCVUcsIGF0NzZfaXdfZ2V0X2RlYnVnKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLCBhdDc2X2l3X3NldF9wb3dlcnNhdmVfbW9kZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwgYXQ3Nl9pd19nZXRfcG93ZXJzYXZlX21vZGUpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0NBTl9USU1FUywgYXQ3Nl9pd19zZXRfc2Nhbl90aW1lcyksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9TQ0FOX1RJTUVTLCBhdDc2X2l3X2dldF9zY2FuX3RpbWVzKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19zZXRfc2Nhbl9tb2RlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NDQU5fTU9ERSwgYXQ3Nl9pd19nZXRfc2Nhbl9tb2RlKSwKLX07Ci0KLS8qIE5hbWVzIGFuZCBhcmd1bWVudHMgb2YgcHJpdmF0ZSB3aXJlbGVzcyBoYW5kbGVycyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgYXQ3Nl9wcml2X2FyZ3NbXSA9IHsKLQkvKiAwIC0gbG9uZywgMSAtIHNob3J0ICovCi0Je0FUNzZfU0VUX1NIT1JUX1BSRUFNQkxFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wcmVhbWJsZSJ9LAotCi0Je0FUNzZfR0VUX1NIT1JUX1BSRUFNQkxFLAotCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEwLCAiZ2V0X3ByZWFtYmxlIn0sCi0KLQkvKiB3ZSBtdXN0IHBhc3MgdGhlIG5ldyBkZWJ1ZyBtYXNrIGFzIGEgc3RyaW5nLCBiZWNhdXNlIGl3cHJpdiBjYW5ub3QKLQkgKiBwYXJzZSBoZXggbnVtYmVycyBzdGFydGluZyB3aXRoIDB4IDotKCAgKi8KLQl7QVQ3Nl9TRVRfREVCVUcsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAsIDAsICJzZXRfZGVidWcifSwKLQotCXtBVDc2X0dFVF9ERUJVRywKLQkgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxMCwgImdldF9kZWJ1ZyJ9LAotCi0JLyogMSAtIGFjdGl2ZSwgMiAtIHBvd2VyIHNhdmUsIDMgLSBzbWFydCBwb3dlciBzYXZlICovCi0Je0FUNzZfU0VUX1BPV0VSU0FWRV9NT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wb3dlcnNhdmUifSwKLQotCXtBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERSwKLQkgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfcG93ZXJzYXZlIn0sCi0KLQkvKiBtaW5fY2hhbm5lbF90aW1lLCBtYXhfY2hhbm5lbF90aW1lICovCi0Je0FUNzZfU0VUX1NDQU5fVElNRVMsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAwLCAic2V0X3NjYW5fdGltZXMifSwKLQotCXtBVDc2X0dFVF9TQ0FOX1RJTUVTLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMiwgImdldF9zY2FuX3RpbWVzIn0sCi0KLQkvKiAwIC0gYWN0aXZlLCAxIC0gcGFzc2l2ZSBzY2FuICovCi0Je0FUNzZfU0VUX1NDQU5fTU9ERSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfc2Nhbl9tb2RlIn0sCi0KLQl7QVQ3Nl9HRVRfU0NBTl9NT0RFLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9zY2FuX21vZGUifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgYXQ3Nl9oYW5kbGVyX2RlZiA9IHsKLQkubnVtX3N0YW5kYXJkID0gQVJSQVlfU0laRShhdDc2X2hhbmRsZXJzKSwKLQkubnVtX3ByaXZhdGUgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9oYW5kbGVycyksCi0JLm51bV9wcml2YXRlX2FyZ3MgPSBBUlJBWV9TSVpFKGF0NzZfcHJpdl9hcmdzKSwKLQkuc3RhbmRhcmQgPSBhdDc2X2hhbmRsZXJzLAotCS5wcml2YXRlID0gYXQ3Nl9wcml2X2hhbmRsZXJzLAotCS5wcml2YXRlX2FyZ3MgPSBhdDc2X3ByaXZfYXJncywKLQkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gYXQ3Nl9nZXRfd2lyZWxlc3Nfc3RhdHMsCi19OwotCi1zdGF0aWMgY29uc3QgdTggc25hcHNpZ1tdID0geyAweGFhLCAweGFhLCAweDAzIH07Ci0KLS8qIFJGQyAxMDQyIGVuY2Fwc3VsYXRlcyBFdGhlcm5ldCBmcmFtZXMgaW4gODAyLjIgU05BUCAoMHhhYSwgMHhhYSwgMHgwMykgd2l0aAotICogYSBTTkFQIE9JRCBvZiAwICgweDAwLCAweDAwLCAweDAwKSAqLwotc3RhdGljIGNvbnN0IHU4IHJmYzEwNDJzaWdbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi1zdGF0aWMgaW50IGF0NzZfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHdsZW47Ci0JaW50IHN1Ym1pdF9sZW47Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXIgPSBwcml2LT5idWxrX291dF9idWZmZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmk4MDJfMTFfaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhfYnVmZmVyLT5wYWNrZXQ7Ci0JdTggKnBheWxvYWQgPSBpODAyXzExX2hkci0+cGF5bG9hZDsKLQlzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCi0JaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgbmV0ZGV2IGlzIHN0b3BwZWRcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIF9fZnVuY19fKTsKLQkJLyogc2tpcCB0aGlzIHBhY2tldCAqLwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7Ci0JCS8qIHNraXAgdGhpcyBwYWNrZXQgKi8KLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc2tiIHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc2tiLT5sZW4pOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWF0NzZfbGVkdHJpZ190eF9hY3Rpdml0eSgpOwkvKiB0ZWxsIGxlZHRyaWdnZXIgd2Ugc2VuZCBhIHBhY2tldCAqLwotCi0JLyogd2UgY2FuIGdldCByaWQgb2YgbWVtY3B5IGlmIHdlIHNldCBuZXRkZXYtPmhhcmRfaGVhZGVyX2xlbiB0bwotCSAgIHJlc2VydmUgZW5vdWdoIHNwYWNlLCBidXQgd2Ugd291bGQgbmVlZCB0byBrZWVwIHRoZSBza2IgYXJvdW5kICovCi0KLQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pIDw9IEVUSF9EQVRBX0xFTikgewotCQkvKiB0aGlzIGlzIGEgODAyLjMgcGFja2V0ICovCi0JCWlmIChza2ItPmxlbiA+PSBFVEhfSExFTiArIHNpemVvZihyZmMxMDQyc2lnKQotCQkgICAgJiYgc2tiLT5kYXRhW0VUSF9ITEVOXSA9PSByZmMxMDQyc2lnWzBdCi0JCSAgICAmJiBza2ItPmRhdGFbRVRIX0hMRU4gKyAxXSA9PSByZmMxMDQyc2lnWzFdKSB7Ci0JCQkvKiBoaWdoZXIgbGF5ZXIgZGVsaXZlcmVkIFNOQVAgaGVhZGVyIC0ga2VlcCBpdCAqLwotCQkJbWVtY3B5KHBheWxvYWQsIHNrYi0+ZGF0YSArIEVUSF9ITEVOLAotCQkJICAgICAgIHNrYi0+bGVuIC0gRVRIX0hMRU4pOwotCQkJd2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU4gKyBza2ItPmxlbiAtIEVUSF9ITEVOOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJvcHBpbmcgbm9uLVNOQVAgODAyLjIgcGFja2V0ICIKLQkJCSAgICAgICAiKERTQVAgMHglMDJ4IFNTQVAgMHglMDJ4IGNudHJsIDB4JTAyeClcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBza2ItPmRhdGFbRVRIX0hMRU5dLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDFdLAotCQkJICAgICAgIHNrYi0+ZGF0YVtFVEhfSExFTiArIDJdKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogYWRkIFJGQyAxMDQyIGhlYWRlciBpbiBmcm9udCAqLwotCQltZW1jcHkocGF5bG9hZCwgcmZjMTA0MnNpZywgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJbWVtY3B5KHBheWxvYWQgKyBzaXplb2YocmZjMTA0MnNpZyksICZlaC0+aF9wcm90bywKLQkJICAgICAgIHNrYi0+bGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGV0aGhkciwgaF9wcm90bykpOwotCQl3bGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIHNpemVvZihyZmMxMDQyc2lnKSArIHNrYi0+bGVuIC0KLQkJICAgIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pOwotCX0KLQotCS8qIG1ha2Ugd2lyZWxlc3MgaGVhZGVyICovCi0JaTgwMl8xMV9oZHItPmZyYW1lX2N0bCA9Ci0JICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCShwcml2LT53ZXBfZW5hYmxlZCA/IElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCA6IDApIHwKLQkJCShwcml2LT5pd19tb2RlID09Ci0JCQkgSVdfTU9ERV9JTkZSQSA/IElFRUU4MDIxMV9GQ1RMX1RPRFMgOiAwKSk7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjEsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIHByaXYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JfSBlbHNlIGlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMiwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpODAyXzExX2hkci0+YWRkcjMsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQl9Ci0KLQlpODAyXzExX2hkci0+ZHVyYXRpb25faWQgPSBjcHVfdG9fbGUxNigwKTsKLQlpODAyXzExX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KDApOwotCi0JLyogc2V0dXAgJ0F0bWVsJyBoZWFkZXIgKi8KLQl0eF9idWZmZXItPndsZW5ndGggPSBjcHVfdG9fbGUxNih3bGVuKTsKLQl0eF9idWZmZXItPnR4X3JhdGUgPSBwcml2LT50eHJhdGU7Ci0JLyogZm9yIGJyb2FkY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIHRoZSBmaXJtd2FyZSAwLjEwMC54Ci0JICAgc2VlbXMgdG8gY2hvb3NlIHRoZSBoaWdoZXN0IHJhdGUgc2V0IHdpdGggQ01EX1NUQVJUVVAgaW4KLQkgICBiYXNpY19yYXRlX3NldCByZXBsYWNpbmcgdGhpcyB2YWx1ZSAqLwotCi0JbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7Ci0KLQl0eF9idWZmZXItPnBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyh3bGVuKTsKLQlzdWJtaXRfbGVuID0gd2xlbiArIEFUNzZfVFhfSERSTEVOICsgdHhfYnVmZmVyLT5wYWRkaW5nOwotCi0JYXQ3Nl9kYmcoREJHX1RYX0RBVEFfQ09OVEVOVCwgIiVzIHNrYi0+ZGF0YSAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIGhleDJzdHIoc2tiLT5kYXRhLCAzMikpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBsZTE2X3RvX2NwdSh0eF9idWZmZXItPndsZW5ndGgpLAotCQkgdHhfYnVmZmVyLT5wYWRkaW5nLCB0eF9idWZmZXItPnR4X3JhdGUsCi0JCSBoZXgyc3RyKGk4MDJfMTFfaGRyLCBzaXplb2YoKmk4MDJfMTFfaGRyKSkpOwotCWF0NzZfZGJnKERCR19UWF9EQVRBX0NPTlRFTlQsICIlcyBwYXlsb2FkICVzIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihwYXlsb2FkLCA0OCkpOwotCi0JLyogc2VuZCBzdHVmZiAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAotCQkJICBzdWJtaXRfbGVuLCBhdDc2X3R4X2NhbGxiYWNrLCBwcml2KTsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXQpIHsKLQkJc3RhdHMtPnR4X2Vycm9ycysrOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiB0eCBzdWJtaXQgdXJiOiAlZFxuIiwKLQkJICAgICAgIG5ldGRldi0+bmFtZSwgcmV0KTsKLQkJaWYgKHJldCA9PSAtRUlOVkFMKQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiAtRUlOVkFMOiB0eCB1cmIgJXAgaGNwcml2ICVwIGNvbXBsZXRlICVwXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+dHhfdXJiLAotCQkJICAgICAgIHByaXYtPnR4X3VyYi0+aGNwcml2LCBwcml2LT50eF91cmItPmNvbXBsZXRlKTsKLQl9IGVsc2UgewotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuOwotCWRldl93YXJuKCZuZXRkZXYtPmRldiwgInR4IHRpbWVvdXQuIik7Ci0KLQl1c2JfdW5saW5rX3VyYihwcml2LT50eF91cmIpOwotCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwotfQotCiBzdGF0aWMgaW50IGF0NzZfc3VibWl0X3J4X3VyYihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewogCWludCByZXQ7CkBAIC0zMjU2LDcgKzEzMjcsNyBAQAogCiAJaWYgKCFwcml2LT5yeF91cmIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IHByaXYtPnJ4X3VyYiBpcyBOVUxMXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0zMjY0LDcgKzEzMzUsNyBAQAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIpKTsKIAkJaWYgKCFza2IpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSByeCBza2J1ZmZcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMzI4NCwxMTAgKzEzNTUsMTggQEAKIAkJCQkgInVzYl9zdWJtaXRfdXJiIHJldHVybmVkIC1FTk9ERVYiKTsKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcngsIHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAl9CiAKIGV4aXQ6CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9ERVYpCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBzdWJtaXQgcnggdXJiIC0gcGxlYXNlIHVubG9hZCB0aGUgIgogCQkgICAgICAgImRyaXZlciBhbmQvb3IgcG93ZXIgY3ljbGUgdGhlIGRldmljZVxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdDc2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXMoKTogZW50cnkiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JLyogaWYgbmV0ZGV2LT5kZXZfYWRkciAhPSBwcml2LT5tYWNfYWRkciB3ZSBtdXN0Ci0JICAgc2V0IHRoZSBtYWMgYWRkcmVzcyBpbiB0aGUgZGV2aWNlICEgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyKSkgewotCQlpZiAoYXQ3Nl9hZGRfbWFjX2FkZHJlc3MocHJpdiwgbmV0ZGV2LT5kZXZfYWRkcikgPj0gMCkKLQkJCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBzZXQgbmV3IE1BQyBhZGRyICVzIiwKLQkJCQkgbmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG5ldGRldi0+ZGV2X2FkZHIpKTsKLQl9Ci0KLQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JRExFOwotCXByaXYtPmxhc3Rfc2NhbiA9IGppZmZpZXM7Ci0KLQlyZXQgPSBhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Blbjogc3VibWl0X3J4X3VyYiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfcmVzdGFydCwgMCk7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzKCk6IGVuZCIsIF9fZnVuY19fKTsKLWVycm9yOgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRU5URVIiLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JYXQ3Nl9xdWllc2NlKHByaXYpOwotCi0JaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7Ci0JCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQotCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLwotCQlhdDc2X3NldF9yYWRpbyhwcml2LCAwKTsKLQotCQkvKiBXZSB1bmxpbmsgcnhfdXJiIGJlY2F1c2UgYXQ3Nl9vcGVuKCkgcmUtc3VibWl0cyBpdC4KLQkJICogSWYgdW5wbHVnZ2VkLCBhdDc2X2RlbGV0ZV9kZXZpY2UoKSB0YWtlcyBjYXJlIG9mIGl0LiAqLwotCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiKTsKLQl9Ci0KLQkvKiBmcmVlIHRoZSBic3NfbGlzdCAqLwotCWF0NzZfZnJlZV9ic3NfbGlzdChwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLQlhdDc2X2RiZyhEQkdfREVWU1RBUlQsICIlczogRVhJVCIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCi0JdXNiX21ha2VfcGF0aChwcml2LT51ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Ci0KLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlZC4lZC4lZC0lZCIsCi0JCSBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAotCQkgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci19Ci0KLXN0YXRpYyB1MzIgYXQ3Nl9ldGh0b29sX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuIHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF0NzZfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvID0gYXQ3Nl9ldGh0b29sX2dldF9kcnZpbmZvLAotCS5nZXRfbGluayA9IGF0NzZfZXRodG9vbF9nZXRfbGluaywKLX07Ci0KIC8qIERvd25sb2FkIGV4dGVybmFsIGZpcm13YXJlICovCiBzdGF0aWMgaW50IGF0NzZfbG9hZF9leHRlcm5hbF9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IGZ3ZW50cnkgKmZ3ZSkKIHsKQEAgLTM0ODQsNDA2ICsxNDYzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfZXNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JLyogY29tbW9uIGNyaXRlcmlhIGZvciBib3RoIG1vZGkgKi8KLQotCWludCByZXQgPSAocHJpdi0+ZXNzaWRfc2l6ZSA9PSAwIC8qIEFOWSBzc2lkICovICB8fAotCQkgICAocHJpdi0+ZXNzaWRfc2l6ZSA9PSBwdHItPnNzaWRfbGVuICYmCi0JCSAgICAhbWVtY21wKHByaXYtPmVzc2lkLCBwdHItPnNzaWQsIHB0ci0+c3NpZF9sZW4pKSk7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogZXNzaWQgZGlkbid0IG1hdGNoIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF9tb2RlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBic3NfaW5mbyAqcHRyKQotewotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlyZXQgPSBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQllbHNlCi0JCXJldCA9IHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9FU1M7Ci0JaWYgKCFyZXQpCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzIGJzcyB0YWJsZSBlbnRyeSAlcDogbW9kZSBkaWRuJ3QgbWF0Y2giLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfbWF0Y2hfcmF0ZXMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHRyLT5yYXRlc19sZW47IGkrKykgewotCQl1OCByYXRlID0gcHRyLT5yYXRlc1tpXTsKLQotCQlpZiAoIShyYXRlICYgMHg4MCkpCi0JCQljb250aW51ZTsKLQotCQkvKiB0aGlzIGlzIGEgYmFzaWMgcmF0ZSB3ZSBoYXZlIHRvIHN1cHBvcnQKLQkJICAgKHNlZSBJRUVFODAyLjExLCBjaC4gNy4zLjIuMikgKi8KLQkJaWYgKHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1swXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1sxXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1syXSkKLQkJICAgICYmIHJhdGUgIT0gKDB4ODAgfCBod19yYXRlc1szXSkpIHsKLQkJCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkJICIlczogYnNzIHRhYmxlIGVudHJ5ICVwOiBiYXNpYyByYXRlICUwMnggbm90ICIKLQkJCQkgInN1cHBvcnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyLCByYXRlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyogaWYgd2UgdXNlIHNob3J0IHByZWFtYmxlLCB0aGUgYnNzIG11c3Qgc3VwcG9ydCBpdCAqLwotCWlmIChwcml2LT5wcmVhbWJsZV90eXBlID09IFBSRUFNQkxFX1RZUEVfU0hPUlQgJiYKLQkgICAgIShwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpKSB7Ci0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiAlcCBkb2VzIG5vdCBzdXBwb3J0IHNob3J0IHByZWFtYmxlIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHB0cik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF93ZXAoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53ZXBfZW5hYmxlZCAmJiBwdHItPmNhcGEgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQkvKiB3ZSBoYXZlIGRpc2FibGVkIFdFUCwgYnV0IHRoZSBCU1Mgc2lnbmFscyBwcml2YWN5ICovCi0JCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCQkgIiVzOiBic3MgdGFibGUgZW50cnkgJXA6IHJlcXVpcmVzIGVuY3J5cHRpb24iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIG90aGVyd2lzZSBpZiB0aGUgQlNTIGRvZXMgbm90IHNpZ25hbCBwcml2YWN5IGl0IG1heSB3ZWxsCi0JICAgYWNjZXB0IGVuY3J5cHRlZCBwYWNrZXRzIGZyb20gdXMgLi4uICovCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF0NzZfbWF0Y2hfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaWYgKCFwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgfHwKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwdHItPmJzc2lkLCBwcml2LT53YW50ZWRfYnNzaWQpKQotCQlyZXR1cm4gMTsKLQotCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCSAiJXM6IHJlcXVlc3RlZCBic3NpZCAtICVzIGRvZXMgbm90IG1hdGNoIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT53YW50ZWRfYnNzaWQpKTsKLQlhdDc2X2RiZyhEQkdfQlNTX01BVENILAotCQkgIiAgICAgIEFQIGJzc2lkIC0gJXMgb2YgYnNzIHRhYmxlIGVudHJ5ICVwIiwKLQkJIG1hYzJzdHIocHRyLT5ic3NpZCksIHB0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYXQ3Nl9tYXRjaF9ic3MgLSB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIGJzcyBpbiBwcml2LT5ic3MKLSAqCi0gKiBsYXN0IC0gbGFzdCBic3MgdHJpZWQKLSAqCi0gKiBsYXN0ID09IE5VTEwgc2lnbmFscyBhIG5ldyByb3VuZCBzdGFydGluZyB3aXRoIHByaXYtPmJzc19saXN0Lm5leHQKLSAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGFuIGFjcXVpcmVkIHByaXYtPmJzc19saXN0X3NwaW5sb2NrCi0gKiBvdGhlcndpc2UgdGhlIHRpbWVvdXQgb24gYnNzIG1heSByZW1vdmUgdGhlIG5ld2x5IGNob3NlbiBlbnRyeQotICovCi1zdGF0aWMgc3RydWN0IGJzc19pbmZvICphdDc2X21hdGNoX2JzcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgYnNzX2luZm8gKmxhc3QpCi17Ci0Jc3RydWN0IGJzc19pbmZvICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnI7Ci0KLQljdXJyID0gbGFzdCA/IGxhc3QtPmxpc3QubmV4dCA6IHByaXYtPmJzc19saXN0Lm5leHQ7Ci0Jd2hpbGUgKGN1cnIgIT0gJnByaXYtPmJzc19saXN0KSB7Ci0JCXB0ciA9IGxpc3RfZW50cnkoY3Vyciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJaWYgKGF0NzZfbWF0Y2hfZXNzaWQocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX21vZGUocHJpdiwgcHRyKQotCQkgICAgJiYgYXQ3Nl9tYXRjaF93ZXAocHJpdiwgcHRyKSAmJiBhdDc2X21hdGNoX3JhdGVzKHByaXYsIHB0cikKLQkJICAgICYmIGF0NzZfbWF0Y2hfYnNzaWQocHJpdiwgcHRyKSkKLQkJCWJyZWFrOwotCQljdXJyID0gY3Vyci0+bmV4dDsKLQl9Ci0KLQlpZiAoY3VyciA9PSAmcHJpdi0+YnNzX2xpc3QpCi0JCXB0ciA9IE5VTEw7Ci0JLyogb3RoZXJ3aXNlIHB0ciBwb2ludHMgdG8gdGhlIHN0cnVjdCBic3NfaW5mbyB3ZSBoYXZlIGNob3NlbiAqLwotCi0JYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwgIiVzICVzOiByZXR1cm5lZCAlcCIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fLCBwdHIpOwotCXJldHVybiBwdHI7Ci19Ci0KLS8qIFN0YXJ0IGpvaW5pbmcgYSBtYXRjaGluZyBCU1MsIG9yIGNyZWF0ZSBvd24gSUJTUyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX2pvaW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19qb2luKTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpOwotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0pPSU5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHNlY3VyZSB0aGUgYWNjZXNzIHRvIHByaXYtPmN1cnJfYnNzICEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQlwcml2LT5jdXJyX2JzcyA9IGF0NzZfbWF0Y2hfYnNzKHByaXYsIHByaXYtPmN1cnJfYnNzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT5jdXJyX2JzcykgewotCQkvKiBoZXJlIHdlIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyAoaSlic3MgLi4uICovCi0JCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfT1dOX0lCU1MpOwotCQkJYXQ3Nl9zdGFydF9pYnNzKHByaXYpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCS8qIGhhdmVuJ3QgZm91bmQgYSBtYXRjaGluZyBCU1MgaW4gaW5mcmEgbW9kZSAtIHRyeSBhZ2FpbiAqLwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IGF0NzZfam9pbl9ic3MocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGpvaW5fYnNzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOwotCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlpZiAocmV0ICE9IENNRF9TVEFUVVNfVElNRV9PVVQpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBqb2luX2JzcyBjb21wbGV0ZWQgd2l0aCAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBqb2luX2JzcyBzc2lkICVzIHRpbWVkIG91dFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCQkgICAgICAgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCQkvKiByZXRyeSBuZXh0IEJTUyBpbW1lZGlhdGVseSAqLwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogaGVyZSB3ZSBoYXZlIGpvaW5lZCB0aGUgKEkpQlNTICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKmJwdHIgPSBwcml2LT5jdXJyX2JzczsKLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19DT05ORUNURUQpOwotCQkvKiBnZXQgRVNTSUQsIEJTU0lEIGFuZCBjaGFubmVsIGZvciBwcml2LT5jdXJyX2JzcyAqLwotCQlwcml2LT5lc3NpZF9zaXplID0gYnB0ci0+c3NpZF9sZW47Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgYnB0ci0+c3NpZCwgYnB0ci0+c3NpZF9sZW4pOwotCQltZW1jcHkocHJpdi0+YnNzaWQsIGJwdHItPmJzc2lkLCBFVEhfQUxFTik7Ci0JCXByaXYtPmNoYW5uZWwgPSBicHRyLT5jaGFubmVsOwotCQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBicHRyLT5ic3NpZCk7Ci0JCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKLQkJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJLyoganVzdCB0byBiZSBzdXJlICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQl9IGVsc2UgewotCQkvKiBzZW5kIGF1dGggcmVxICovCi0JCXByaXYtPnJldHJpZXMgPSBBVVRIX1JFVFJJRVM7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfQVVUSCk7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFwIHNjYW4gcmVzdWx0cyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19nZXRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgcmV0OwotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfZ2V0X3NjYW4ud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXR1cyA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBhdDc2X2dldF9jbWRfc3RhdHVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJc3RhdHVzID0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUzsKLQkJLyogSU5GTzogSG9wZSBpdCB3YXMgYSBvbmUgb2ZmIGVycm9yIC0gaWYgbm90LCBzY2FubmluZwotCQkgICBmdXJ0aGVyIGRvd24gdGhlIGxpbmUgYW5kIHN0b3AgdGhpcyBjeWNsZSAqLwotCX0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsCi0JCSAiJXMgJXM6IGdvdCBjbWRfc3RhdHVzICVkIChzdGF0ZSAlcywgbmVlZF9hbnkgJWQpIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHN0YXR1cywKLQkJIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSwgcHJpdi0+c2Nhbl9uZWVkX2FueSk7Ci0KLQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKLQkJaWYgKChzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUykgJiYKLQkJICAgIChzdGF0dXMgIT0gQ01EX1NUQVRVU19JRExFKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBCYWQgc2NhbiBzdGF0dXM6ICVzXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sCi0JCQkgICAgICAgYXQ3Nl9nZXRfY21kX3N0YXR1c19zdHJpbmcoc3RhdHVzKSk7Ci0KLQkJLyogdGhlIGZpcnN0IGNtZCBzdGF0dXMgYWZ0ZXIgc2NhbiBzdGFydCBpcyBhbHdheXMgYSBJRExFIC0+Ci0JCSAgIHN0YXJ0IHRoZSB0aW1lciB0byBwb2xsIGFnYWluIHVudGlsIENPTVBMRVRFRCAqLwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgZm9yICVkIHRpY2tzIiwKLQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIFNDQU5fUE9MTF9JTlRFUlZBTCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4sCi0JCQkJICAgICAgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhdDc2X2RlYnVnICYgREJHX0JTU19UQUJMRSkKLQkJYXQ3Nl9kdW1wX2Jzc190YWJsZShwcml2KTsKLQotCWlmIChwcml2LT5zY2FuX25lZWRfYW55KSB7Ci0JCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6ICVzOiBzdGFydF9zY2FuIChBTlkpIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLCBfX2Z1bmNfXywKLQkJCSBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQl9IGVsc2UgewotCQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9DT01QTEVURUQ7Ci0JCS8qIHJlcG9ydCB0aGUgZW5kIG9mIHNjYW4gdG8gdXNlciBzcGFjZSAqLwotCQlhdDc2X2l3ZXZlbnRfc2Nhbl9jb21wbGV0ZShwcml2LT5uZXRkZXYpOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0pPSU5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIEhhbmRsZSBsb3NzIG9mIGJlYWNvbnMgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYmVhY29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2JlYWNvbi53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVEIHx8IHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKLQkJZ290byBleGl0OwotCi0JLyogV2UgaGF2ZW4ndCByZWNlaXZlZCBhbnkgYmVhY29ucyBmcm9tIG91dCBBUCBmb3IgQkVBQ09OX1RJTUVPVVQgKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogbG9zdCBiZWFjb24gYnNzaWQgJXNcbiIsCi0JICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwotCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfc3RhcnRfc2Nhbik7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBIYW5kbGUgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19hdXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCi0JCQkJCSAgICAgIGR3b3JrX2F1dGgud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKQotCQlnb3RvIGV4aXQ7Ci0KLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogYXV0aGVudGljYXRpb24gcmVzcG9uc2UgdGltZW91dCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCi0JaWYgKHByaXYtPnJldHJpZXMtLSA+PSAwKSB7Ci0JCWF0NzZfYXV0aF9yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MsIDEsIE5VTEwpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLQl9IGVsc2UgewotCQkvKiB0cnkgdG8gZ2V0IG5leHQgbWF0Y2hpbmcgQlNTICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQotLyogSGFuZGxlIGFzc29jaWF0aW9uIHJlc3BvbnNlIHRpbWVvdXQgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfYXNzb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfYXNzb2Mud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MpCi0JCWdvdG8gZXhpdDsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBhc3NvY2lhdGlvbiByZXNwb25zZSB0aW1lb3V0IiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0KLQlpZiAocHJpdi0+cmV0cmllcy0tID49IDApIHsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCX0gZWxzZSB7Ci0JCS8qIHRyeSB0byBnZXQgbmV4dCBtYXRjaGluZyBCU1MgKi8KLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBSZWFkIG5ldyBic3NpZCBpbiBhZC1ob2MgbW9kZSAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX25ld19ic3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19uZXdfYnNzKTsKLQlpbnQgcmV0OwotCXN0cnVjdCBtaWJfbWFjX21nbXQgbWFjX21nbXQ7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NQUNfTUdNVCwgJm1hY19tZ210LAotCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgImlic3NfY2hhbmdlID0gMHglMngiLCBtYWNfbWdtdC5pYnNzX2NoYW5nZSk7Ci0JbWVtY3B5KHByaXYtPmJzc2lkLCBtYWNfbWdtdC5jdXJyZW50X2Jzc2lkLCBFVEhfQUxFTik7Ci0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAidXNpbmcgQlNTSUQgJXMiLCBtYWMyc3RyKHByaXYtPmJzc2lkKSk7Ci0KLQlhdDc2X2l3ZXZlbnRfYnNzX2Nvbm5lY3QocHJpdi0+bmV0ZGV2LCBwcml2LT5ic3NpZCk7Ci0KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMTsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgaWJzc19jaGFuZ2UpOwotCXByaXYtPm1pYl9idWYuZGF0YS5ieXRlID0gMDsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKGlic3MgY2hhbmdlIG9rKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQogc3RhdGljIGludCBhdDc2X3N0YXJ0dXBfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGF0NzZfY2FyZF9jb25maWcgKmNjZmcgPSAmcHJpdi0+Y2FyZF9jb25maWc7CkBAIC0zODkxLDE0ICsxNDcwLDE0IEBACiAKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBzc2lkICUuKnMgKCVzKSBtb2RlICVzIGNoICVkIHdlcCAlcyBrZXkgJWQgIgotCQkgImtleWxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgcHJpdi0+ZXNzaWRfc2l6ZSwgcHJpdi0+ZXNzaWQsCi0JCSBoZXgyc3RyKHByaXYtPmVzc2lkLCBJV19FU1NJRF9NQVhfU0laRSksCisJCSAia2V5bGVuICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBwcml2LT5lc3NpZF9zaXplLAorCQkgcHJpdi0+ZXNzaWQsIGhleDJzdHIocHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKSwKIAkJIHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyA/ICJhZGhvYyIgOiAiaW5mcmEiLAogCQkgcHJpdi0+Y2hhbm5lbCwgcHJpdi0+d2VwX2VuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAogCQkgcHJpdi0+d2VwX2tleV9pZCwgcHJpdi0+d2VwX2tleXNfbGVuW3ByaXYtPndlcF9rZXlfaWRdKTsKIAlhdDc2X2RiZyhEQkdfUEFSQU1TLAogCQkgIiVzIHBhcmFtOiBwcmVhbWJsZSAlcyBydHMgJWQgcmV0cnkgJWQgZnJhZyAlZCAiCi0JCSAidHhyYXRlICVzIGF1dGhfbW9kZSAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJICJ0eHJhdGUgJXMgYXV0aF9tb2RlICVkIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgcHJlYW1ibGVzW3ByaXYtPnByZWFtYmxlX3R5cGVdLCBwcml2LT5ydHNfdGhyZXNob2xkLAogCQkgcHJpdi0+c2hvcnRfcmV0cnlfbGltaXQsIHByaXYtPmZyYWdfdGhyZXNob2xkLAogCQkgcHJpdi0+dHhyYXRlID09IFRYX1JBVEVfMU1CSVQgPyAiMU1CaXQiIDogcHJpdi0+dHhyYXRlID09CkBAIC0zOTA5LDcgKzE0ODgsNyBAQAogCWF0NzZfZGJnKERCR19QQVJBTVMsCiAJCSAiJXMgcGFyYW06IHBtX21vZGUgJWQgcG1fcGVyaW9kICVkIGF1dGhfbW9kZSAlcyAiCiAJCSAic2Nhbl90aW1lcyAlZCAlZCBzY2FuX21vZGUgJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5wbV9tb2RlLCBwcml2LT5wbV9wZXJpb2QsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnBtX21vZGUsIHByaXYtPnBtX3BlcmlvZCwKIAkJIHByaXYtPmF1dGhfbW9kZSA9PSBXTEFOX0FVVEhfT1BFTiA/ICJvcGVuIiA6ICJzaGFyZWRfc2VjcmV0IiwKIAkJIHByaXYtPnNjYW5fbWluX3RpbWUsIHByaXYtPnNjYW5fbWF4X3RpbWUsCiAJCSBwcml2LT5zY2FuX21vZGUgPT0gU0NBTl9UWVBFX0FDVElWRSA/ICJhY3RpdmUiIDogInBhc3NpdmUiKTsKQEAgLTM5NDMsNyArMTUyMiw4IEBACiAJY2NmZy0+c3NpZF9sZW4gPSBwcml2LT5lc3NpZF9zaXplOwogCiAJY2NmZy0+d2VwX2RlZmF1bHRfa2V5X2lkID0gcHJpdi0+d2VwX2tleV9pZDsKLQltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywgNCAqIFdFUF9LRVlfTEVOKTsKKwltZW1jcHkoY2NmZy0+d2VwX2RlZmF1bHRfa2V5X3ZhbHVlLCBwcml2LT53ZXBfa2V5cywKKwkgICAgICAgc2l6ZW9mKHByaXYtPndlcF9rZXlzKSk7CiAKIAljY2ZnLT5zaG9ydF9wcmVhbWJsZSA9IHByaXYtPnByZWFtYmxlX3R5cGU7CiAJY2NmZy0+YmVhY29uX3BlcmlvZCA9IGNwdV90b19sZTE2KHByaXYtPmJlYWNvbl9wZXJpb2QpOwpAQCAtMzk1Miw3ICsxNTMyLDcgQEAKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9zZXRfY2FyZF9jb21tYW5kIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zOTk4LDY5ICsxNTc4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmVzdGFydCB0aGUgaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBhdDc2X2R3b3JrX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfcmVzdGFydC53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwkvKiBzdG9wIG5ldGRldiB3YXRjaGRvZyAqLwotCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsJLyogc3RvcCB0eCBkYXRhIHBhY2tldHMgKi8KLQotCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7Ci0KLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpIHsKLQkJcHJpdi0+bmV0ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX1NDQU5OSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQl9IGVsc2UgewotCQlwcml2LT5uZXRkZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQOwotCQlhdDc2X3N0YXJ0X21vbml0b3IocHJpdik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBJbml0aWF0ZSBzY2FubmluZyAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX3N0YXJ0X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19zdGFydF9zY2FuKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKLQotCVdBUk5fT04ocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpCi0JCWdvdG8gZXhpdDsKLQotCS8qIG9ubHkgY2xlYXIgdGhlIGJzcyBsaXN0IHdoZW4gYSBzY2FuIGlzIGFjdGl2ZWx5IGluaXRpYXRlZCwKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJlbHkgb24gYXQ3Nl9ic3NfbGlzdF90aW1lb3V0ICovCi0JaWYgKHByaXYtPnNjYW5fc3RhdGUgPT0gU0NBTl9JTl9QUk9HUkVTUykgewotCQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JCXByaXYtPnNjYW5fbmVlZF9hbnkgPSAxOwotCX0gZWxzZQotCQlwcml2LT5zY2FuX25lZWRfYW55ID0gMDsKLQotCXJldCA9IGF0NzZfc3RhcnRfc2Nhbihwcml2LCAxKTsKLQotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogc3RhcnRfc2NhbiBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgX19mdW5jX18sIHJldCk7Ci0JZWxzZSB7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KIC8qIEVuYWJsZSBvciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KIHN0YXRpYyB2b2lkIGF0NzZfd29ya19zZXRfcHJvbWlzYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC00MDc4LDcgKzE1OTUsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHByb21pc2N1b3VzX21vZGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAltdXRleF91bmxvY2soJnByaXYtPm10eCk7CiB9CkBAIC00MDk0LDg5NCArMTYxMSwxMiBAQAogCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKIH0KIAotLyogV2UgZ290IGFuIGFzc29jaWF0aW9uIHJlc3BvbnNlICovCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXNzb2Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2UgKilidWYtPnBhY2tldDsKLQl1MTYgYXNzb2NfaWQgPSBsZTE2X3RvX2NwdShyZXNwLT5haWQpOwotCXUxNiBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogcnggQXNzb2NSZXNwIGJzc2lkICVzIGNhcGEgMHglMDR4IHN0YXR1cyAiCi0JCSAiMHglMDR4IGFzc29jX2lkIDB4JTA0eCByYXRlcyAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIocmVzcC0+aGVhZGVyLmFkZHIzKSwgbGUxNl90b19jcHUocmVzcC0+Y2FwYWJpbGl0eSksCi0JCSBzdGF0dXMsIGFzc29jX2lkLCBoZXgyc3RyKHJlc3AtPmluZm9fZWxlbWVudC0+ZGF0YSwKLQkJCQkJICAgcmVzcC0+aW5mb19lbGVtZW50LT5sZW4pKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBBc3NvY1Jlc3AgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MpOwotCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewotCQlzdHJ1Y3QgYnNzX2luZm8gKnB0ciA9IHByaXYtPmN1cnJfYnNzOwotCQlwcml2LT5hc3NvY19pZCA9IGFzc29jX2lkICYgMHgzZmZmOwotCQkvKiB1cGRhdGUgaXdjb25maWcgcGFyYW1zICovCi0JCW1lbWNweShwcml2LT5ic3NpZCwgcHRyLT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkocHJpdi0+ZXNzaWQsIHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbik7Ci0JCXByaXYtPmVzc2lkX3NpemUgPSBwdHItPnNzaWRfbGVuOwotCQlwcml2LT5jaGFubmVsID0gcHRyLT5jaGFubmVsOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2Fzc29jX2RvbmUpOwotCX0gZWxzZSB7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotfQotCi0vKiBQcm9jZXNzIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgQVAgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kaXNhc3NvYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqcmVzcCA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPSAmcmVzcC0+aGVhZGVyOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IERpc0Fzc29jIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCS8qIFdlIGFyZSBub3QgY29ubmVjdGVkLCBpZ25vcmUgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19TQ0FOTklORyB8fCBwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0lOSVQKLQkgICAgfHwgIXByaXYtPmN1cnJfYnNzKQotCQlyZXR1cm47Ci0KLQkvKiBOb3Qgb3VyIEJTU0lELCBpZ25vcmUgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKG1nbXQtPmFkZHIzLCBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKQotCQlyZXR1cm47Ci0KLQkvKiBOb3QgZm9yIG91ciBTVEEgYW5kIG5vdCBicm9hZGNhc3QsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgbWdtdC0+YWRkcjEpCi0JICAgICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtZ210LT5hZGRyMSkpCi0JCXJldHVybjsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVECi0JICAgICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfSk9JTklORykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGlzQXNzb2MgaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0NPTk5FQ1RFRCkgewotCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCX0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXRfYXV0aChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoICpyZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aCAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJnJlc3AtPmhlYWRlcjsKLQlpbnQgc2VxX25yID0gbGUxNl90b19jcHUocmVzcC0+dHJhbnNhY3Rpb24pOwotCWludCBhbGcgPSBsZTE2X3RvX2NwdShyZXNwLT5hbGdvcml0aG0pOwotCWludCBzdGF0dXMgPSBsZTE2X3RvX2NwdShyZXNwLT5zdGF0dXMpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVQsCi0JCSAiJXM6IHJ4IEF1dGhGcmFtZSBic3NpZCAlcyBhbGcgJWQgc2VxX25yICVkIHN0YXR1cyAlZCAiCi0JCSAiZGVzdGluYXRpb24gJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgYWxnLCBzZXFfbnIsIHN0YXR1cywgbWFjMnN0cihtZ210LT5hZGRyMSkpOwotCi0JaWYgKGFsZyA9PSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAmJiBzZXFfbnIgPT0gMikKLQkJYXQ3Nl9kYmcoREJHX1JYX01HTVQsICIlczogQXV0aEZyYW1lIGNoYWxsZW5nZSAlcyAuLi4iLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgaGV4MnN0cihyZXNwLT5pbmZvX2VsZW1lbnQsIDE4KSk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BVVRIKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpZ25vcmVkIEF1dGhGcmFtZSBpbiBzdGF0ZSAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocHJpdi0+YXV0aF9tb2RlICE9IGFsZykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogaWdub3JlZCBBdXRoRnJhbWUgZm9yIGFsZyAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgYWxnKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JLyogTm90IG91ciBCU1NJRCBvciBub3QgZm9yIG91ciBTVEEsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkKLQkgICAgfHwgY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPm5ldGRldi0+ZGV2X2FkZHIsIG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCS8qIHRyeSB0byBqb2luIG5leHQgYnNzICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHJpdi0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOIHx8IHNlcV9uciA9PSA0KSB7Ci0JCXByaXYtPnJldHJpZXMgPSBBU1NPQ19SRVRSSUVTOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0FTU09DKTsKLQkJYXQ3Nl9hc3NvY19yZXEocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwKLQkJCSAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MsIEFTU09DX1RJTUVPVVQpOwotCQlyZXR1cm47Ci0JfQotCi0JV0FSTl9PTihzZXFfbnIgIT0gMik7Ci0JYXQ3Nl9hdXRoX3JlcShwcml2LCBwcml2LT5jdXJyX2Jzcywgc2VxX25yICsgMSwgcmVzcC0+aW5mb19lbGVtZW50KTsKLQlhdDc2X2RiZyhEQkdfTUdNVF9USU1FUiwgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyICsgSFoiLCBfX2Z1bmNfXywKLQkJIF9fTElORV9fKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgsIEFVVEhfVElNRU9VVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9kZWF1dGgoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKilidWYtPnBhY2tldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdCA9ICZyZXNwLT5oZWFkZXI7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCB8IERCR19QUk9HUkVTUywKLQkJICIlczogcnggRGVBdXRoIGJzc2lkICVzIHJlYXNvbiAweCUwNHggZGVzdGluYXRpb24gJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlc3AtPnJlYXNvbiksIG1hYzJzdHIobWdtdC0+YWRkcjEpKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEggJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQwotCSAgICAmJiBwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0NPTk5FQ1RFRCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogRGVBdXRoIGluIHN0YXRlICVzIGlnbm9yZWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIG1hY19zdGF0ZXNbcHJpdi0+bWFjX3N0YXRlXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlCVUdfT04oIXByaXYtPmN1cnJfYnNzKTsKLQotCS8qIE5vdCBvdXIgQlNTSUQsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpCi0JCXJldHVybjsKLQotCS8qIE5vdCBmb3Igb3VyIFNUQSBhbmQgbm90IGJyb2FkY2FzdCwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBtZ210LT5hZGRyMSkKLQkgICAgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKQotCQlhdDc2X2l3ZXZlbnRfYnNzX2Rpc2Nvbm5lY3QocHJpdi0+bmV0ZGV2KTsKLQotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0Jc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9iZWFjb24oc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlpbnQgdmFycGFyX2xlbjsKLQkvKiBiZWFjb24gY29udGVudCAqLwotCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uICpiZGF0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJmJkYXRhLT5oZWFkZXI7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyOwotCXN0cnVjdCBic3NfaW5mbyAqbWF0Y2g7CS8qIGVudHJ5IG1hdGNoaW5nIGFkZHIzIHdpdGggaXRzIGJzc2lkICovCi0JaW50IG5ld19lbnRyeSA9IDA7Ci0JaW50IGxlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaWU7Ci0JaW50IGhhdmVfc3NpZCA9IDA7Ci0JaW50IGhhdmVfcmF0ZXMgPSAwOwotCWludCBoYXZlX2NoYW5uZWwgPSAwOwotCWludCBrZWVwX2dvaW5nID0gMTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKSB7Ci0JCS8qIGluIHN0YXRlIE1BQ19DT05ORUNURUQgd2UgdXNlIHRoZSBtZ210X3RpbWVyIHRvIGNvbnRyb2wKLQkJICAgdGhlIGJlYWNvbiBvZiB0aGUgQlNTICovCi0JCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPmN1cnJfYnNzLT5ic3NpZCwgbWdtdC0+YWRkcjMpKSB7Ci0JCQkvKiBXZSBnb3Qgb3VyIEFQJ3MgYmVhY29uLCBkZWZlciB0aGUgdGltZW91dCBoYW5kbGVyLgotCQkJICAgS2lsbCBwZW5kaW5nIHdvcmsgZmlyc3QsIGFzIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpCi0JCQkgICB3b24ndCBkbyBpdC4gKi8KLQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbik7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbiwKLQkJCQkJICAgICAgQkVBQ09OX1RJTUVPVVQpOwotCQkJcHJpdi0+Y3Vycl9ic3MtPnJzc2kgPSBidWYtPnJzc2k7Ci0JCQlwcml2LT5iZWFjb25zX3JlY2VpdmVkKys7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBsb29rIGlmIHdlIGhhdmUgdGhpcyBCU1MgYWxyZWFkeSBpbiB0aGUgbGlzdCAqLwotCW1hdGNoID0gTlVMTDsKLQotCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+YnNzX2xpc3QpKSB7Ci0JCWxpc3RfZm9yX2VhY2gobHB0ciwgJnByaXYtPmJzc19saXN0KSB7Ci0JCQlzdHJ1Y3QgYnNzX2luZm8gKmJzc19wdHIgPQotCQkJICAgIGxpc3RfZW50cnkobHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQkJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGJzc19wdHItPmJzc2lkLCBtZ210LT5hZGRyMykpIHsKLQkJCQltYXRjaCA9IGJzc19wdHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIW1hdGNoKSB7Ci0JCS8qIEJTUyBub3QgaW4gdGhlIGxpc3QgLSBhcHBlbmQgaXQgKi8KLQkJbWF0Y2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnNzX2luZm8pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFtYXRjaCkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19UQUJMRSwKLQkJCQkgIiVzOiBjYW5ub3Qga21hbGxvYyBuZXcgYnNzIGluZm8gKCV6ZCBieXRlKSIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgc2l6ZW9mKHN0cnVjdCBic3NfaW5mbykpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCW5ld19lbnRyeSA9IDE7Ci0JCWxpc3RfYWRkX3RhaWwoJm1hdGNoLT5saXN0LCAmcHJpdi0+YnNzX2xpc3QpOwotCX0KLQotCW1hdGNoLT5jYXBhID0gbGUxNl90b19jcHUoYmRhdGEtPmNhcGFiaWxpdHkpOwotCW1hdGNoLT5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiZGF0YS0+YmVhY29uX2ludGVydmFsKTsKLQltYXRjaC0+cnNzaSA9IGJ1Zi0+cnNzaTsKLQltYXRjaC0+bGlua19xdWFsID0gYnVmLT5saW5rX3F1YWxpdHk7Ci0JbWF0Y2gtPm5vaXNlX2xldmVsID0gYnVmLT5ub2lzZV9sZXZlbDsKLQltZW1jcHkobWF0Y2gtPmJzc2lkLCBtZ210LT5hZGRyMywgRVRIX0FMRU4pOwotCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogYnNzaWQgJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBtYWMyc3RyKG1hdGNoLT5ic3NpZCkpOwotCi0JaWUgPSBiZGF0YS0+aW5mb19lbGVtZW50OwotCi0JLyogbGVuZ3RoIG9mIHZhciBsZW5ndGggYmVhY29uIHBhcmFtZXRlcnMgKi8KLQl2YXJwYXJfbGVuID0gbWluX3QoaW50LCBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0KLQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbiksCi0JCQkgICBCRUFDT05fTUFYX0RBVEFfTEVOR1RIKTsKLQotCS8qIFRoaXMgcm91dGluZSBzdGVwcyB0aHJvdWdoIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSB0byBnZXQKLQkgKiBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjZXNzIHBvaW50LgotCSAqIEN1cnJlbnRseSwgdGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZWNlaXB0IG9mOiBTU0lELAotCSAqIHN1cHBvcnRlZCB0cmFuc2ZlciByYXRlcyBhbmQgY2hhbm5lbCwgaW4gYW55IG9yZGVyLCB3aXRoIHNvbWUKLQkgKiB0b2xlcmFuY2UgZm9yIGludGVybWl0dGVudCB1bmtub3duIGNvZGVzIChhbHRob3VnaCB0aGlzCi0JICogZnVuY3Rpb25hbGl0eSBtYXkgbm90IGJlIG5lY2Vzc2FyeSBhcyB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIHdpbGwKLQkgKiB1c3VhbGx5IGFycml2ZSBpbiBjb25zZWN1dGl2ZWx5LCBidXQgdGhlcmUgaGF2ZSBiZWVuIHNvbWUKLQkgKiByZXBvcnRzIG9mIHNvbWUgb2YgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBmaWVsZHMgYXJyaXZpbmcgaW4gYQotCSAqIGRpZmZlcmVudCBvcmRlcikuCi0JICogSXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbW9yZSBJRSB0eXBlcyBhbHRob3VnaCBNRklFX1RZUEVfVElNIG1heQotCSAqIGJlIHN1cHBvcnRlZCAob24gbXkgQVAgYXQgbGVhc3QpLgotCSAqIFRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcyBhYm91dCAxNTAwIGJ5dGVzIGxvbmcgYnV0IG9ubHkgfjM2IG9mIHRob3NlCi0JICogYnl0ZXMgYXJlIHVzZWZ1bCwgaGVuY2UgdGhlIGhhdmVfc3NpZCBldGMgb3B0aW1pemF0aW9ucy4gKi8KLQotCXdoaWxlIChrZWVwX2dvaW5nICYmCi0JICAgICAgICgoJmllLT5kYXRhW2llLT5sZW5dIC0gKHU4ICopYmRhdGEtPmluZm9fZWxlbWVudCkgPD0KLQkJdmFycGFyX2xlbikpIHsKLQotCQlzd2l0Y2ggKGllLT5pZCkgewotCi0JCWNhc2UgTUZJRV9UWVBFX1NTSUQ6Ci0JCQlpZiAoaGF2ZV9zc2lkKQotCQkJCWJyZWFrOwotCi0JCQlsZW4gPSBtaW5fdChpbnQsIElXX0VTU0lEX01BWF9TSVpFLCBpZS0+bGVuKTsKLQotCQkJLyogd2UgY29weSBvbmx5IGlmIHRoaXMgaXMgYSBuZXcgZW50cnksCi0JCQkgICBvciB0aGUgaW5jb21pbmcgU1NJRCBpcyBub3QgYSBoaWRkZW4gU1NJRC4gVGhpcwotCQkJICAgd2lsbCBwcm90ZWN0IHVzIGZyb20gb3ZlcndyaXRpbmcgYSByZWFsIFNTSUQgcmVhZAotCQkJICAgaW4gYSBQcm9iZVJlc3BvbnNlIHdpdGggYSBoaWRkZW4gb25lIGZyb20gYQotCQkJICAgZm9sbG93aW5nIGJlYWNvbi4gKi8KLQkJCWlmICghbmV3X2VudHJ5ICYmIGF0NzZfaXNfaGlkZGVuX3NzaWQoaWUtPmRhdGEsIGxlbikpIHsKLQkJCQloYXZlX3NzaWQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQltYXRjaC0+c3NpZF9sZW4gPSBsZW47Ci0JCQltZW1jcHkobWF0Y2gtPnNzaWQsIGllLT5kYXRhLCBsZW4pOwotCQkJYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBTU0lEIC0gJS4qcyIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGVuLCBtYXRjaC0+c3NpZCk7Ci0JCQloYXZlX3NzaWQgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfUkFURVM6Ci0JCQlpZiAoaGF2ZV9yYXRlcykKLQkJCQlicmVhazsKLQotCQkJbWF0Y2gtPnJhdGVzX2xlbiA9Ci0JCQkgICAgbWluX3QoaW50LCBzaXplb2YobWF0Y2gtPnJhdGVzKSwgaWUtPmxlbik7Ci0JCQltZW1jcHkobWF0Y2gtPnJhdGVzLCBpZS0+ZGF0YSwgbWF0Y2gtPnJhdGVzX2xlbik7Ci0JCQloYXZlX3JhdGVzID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogU1VQUE9SVEVEIFJBVEVTICVzIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkJCSBoZXgyc3RyKGllLT5kYXRhLCBpZS0+bGVuKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6Ci0JCQlpZiAoaGF2ZV9jaGFubmVsKQotCQkJCWJyZWFrOwotCi0JCQltYXRjaC0+Y2hhbm5lbCA9IGllLT5kYXRhWzBdOwotCQkJaGF2ZV9jaGFubmVsID0gMTsKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogQ0hBTk5FTCAtICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYXRjaC0+Y2hhbm5lbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9DRl9TRVQ6Ci0JCWNhc2UgTUZJRV9UWVBFX1RJTToKLQkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6Ci0JCWRlZmF1bHQ6Ci0JCQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IGJlYWNvbiBJRSBpZCAlZCBsZW4gJWQgJXMiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGllLT5pZCwgaWUtPmxlbiwKLQkJCQkgaGV4MnN0cihpZS0+ZGF0YSwgaWUtPmxlbikpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGluZm9ybWF0aW9uYWwgZWxlbWVudCAqLwotCQluZXh0X2llKCZpZSk7Ci0KLQkJLyogT3B0aW1pemF0aW9uOiBhZnRlciBhbGwsIHRoZSBiZGF0YS0+ZGF0YSBhcnJheSBpcwotCQkgKiB2YXJwYXJfbGVuIGJ5dGVzIGxvbmcsIHdoZXJlYXMgd2UgZ2V0IGFsbCBvZiB0aGUgdXNlZnVsCi0JCSAqIGluZm9ybWF0aW9uIGFmdGVyIG9ubHkgfjM2IGJ5dGVzLCB0aGlzIHNhdmVzIHVzIGEgbG90IG9mCi0JCSAqIHRpbWUgKGFuZCB0cm91YmxlIGFzIHRoZSByZW1haW5pbmcgcG9ydGlvbiBvZiB0aGUgYXJyYXkKLQkJICogY291bGQgYmUgZnVsbCBvZiBqdW5rKQotCQkgKiBDb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRvIHNlZSB3aGF0IG90aGVyIGluZm9ybWF0aW9uCi0JCSAqIGNvbWVzIGZyb20gdGhlIEFQIC0gYWx0aG91Z2ggbGl0dGxlIG9mIGl0IG1heSBiZSB1c2VmdWwgKi8KLQl9Ci0KLQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IEZpbmlzaGVkIHByb2Nlc3NpbmcgYmVhY29uIGRhdGEiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQotCW1hdGNoLT5sYXN0X3J4ID0gamlmZmllczsJLyogcmVjb3JkIGxhc3Qgcnggb2YgYmVhY29uICovCi0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBsaW5rIGxldmVsIGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19sZXZlbChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiwKLQkJCSAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCkKLXsKLQkvKiBqdXN0IGEgZ3Vlc3MgZm9yIG5vdywgbWlnaHQgYmUgZGlmZmVyZW50IGZvciBvdGhlciBjaGlwcyAqLwotCWludCBtYXhfcnNzaSA9IDQyOwotCi0JcXVhbC0+bGV2ZWwgPSAoYnVmLT5yc3NpICogMTAwIC8gbWF4X3Jzc2kpOwotCWlmIChxdWFsLT5sZXZlbCA+IDEwMCkKLQkJcXVhbC0+bGV2ZWwgPSAxMDA7Ci0JcXVhbC0+dXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbGluayBxdWFsaXR5IGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19xdWFsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmLAotCQkJICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JaWYgKGF0NzZfaXNfaW50ZXJzaWwocHJpdi0+Ym9hcmRfdHlwZSkpCi0JCXF1YWwtPnF1YWwgPSBidWYtPmxpbmtfcXVhbGl0eTsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBlbGFwc2VkOwotCi0JCS8qIFVwZGF0ZSBxdWFsIGF0IG1vc3Qgb25jZSBhIHNlY29uZCAqLwotCQllbGFwc2VkID0gamlmZmllcyAtIHByaXYtPmJlYWNvbnNfbGFzdF9xdWFsOwotCQlpZiAoZWxhcHNlZCA8IDEgKiBIWikKLQkJCXJldHVybjsKLQotCQlxdWFsLT5xdWFsID0gcXVhbC0+bGV2ZWwgKiBwcml2LT5iZWFjb25zX3JlY2VpdmVkICoKLQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+YmVhY29uX3BlcmlvZCkgLyBlbGFwc2VkOwotCi0JCXByaXYtPmJlYWNvbnNfbGFzdF9xdWFsID0gamlmZmllczsKLQkJcHJpdi0+YmVhY29uc19yZWNlaXZlZCA9IDA7Ci0JfQotCXF1YWwtPnF1YWwgPSAocXVhbC0+cXVhbCA+IDEwMCkgPyAxMDAgOiBxdWFsLT5xdWFsOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX1VQREFURUQ7Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgbm9pc2UgcXVhbGl0eSBmcm9tIGEgZ2l2ZW4gcnhfYnVmZmVyICovCi1zdGF0aWMgdm9pZCBhdDc2X2NhbGNfbm9pc2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYsCi0JCQkgICAgc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwpCi17Ci0JcXVhbC0+bm9pc2UgPSAwOwotCXF1YWwtPnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3VwZGF0ZV93c3RhdHMoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCA9ICZwcml2LT53c3RhdHMucXVhbDsKLQotCWlmIChidWYtPnJzc2kgJiYgcHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpIHsKLQkJcXVhbC0+dXBkYXRlZCA9IDA7Ci0JCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfcXVhbChwcml2LCBidWYsIHF1YWwpOwotCQlhdDc2X2NhbGNfbm9pc2UocHJpdiwgYnVmLCBxdWFsKTsKLQl9IGVsc2UgewotCQlxdWFsLT5xdWFsID0gMDsKLQkJcXVhbC0+bGV2ZWwgPSAwOwotCQlxdWFsLT5ub2lzZSA9IDA7Ci0JCXF1YWwtPnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9JTlZBTElEOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210KHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0JdTE2IGZyYW1lY3RsID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY3RsKTsKLQotCS8qIHVwZGF0ZSB3c3RhdHMgKi8KLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19JTklUICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfU0NBTk5JTkcpIHsKLQkJLyogamFsOiB0aGlzIGlzIGEgZGlydHkgaGFjayBuZWVkZWQgYnkgVGltIGluIGFkLWhvYyBtb2RlICovCi0JCS8qIERhdGEgcGFja2V0cyBhbHdheXMgc2VlbSB0byBoYXZlIGEgMCBsaW5rIGxldmVsLCBzbyB3ZQotCQkgICBvbmx5IHJlYWQgbGluayBxdWFsaXR5IGluZm8gZnJvbSBtYW5hZ2VtZW50IHBhY2tldHMuCi0JCSAgIEF0bWVsIGRyaXZlciBhY3R1YWxseSBhdmVyYWdlcyB0aGUgcHJlc2VudCwgYW5kIHByZXZpb3VzCi0JCSAgIHZhbHVlcywgd2UganVzdCBwcmVzZW50IHRoZSByYXcgdmFsdWUgYXQgdGhlIG1vbWVudCAtIFRKUyAqLwotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DCi0JCSAgICB8fCAocHJpdi0+Y3Vycl9ic3MKLQkJCSYmICFjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsCi0JCQkJCSAgICAgICBwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKSkKLQkJCWF0NzZfdXBkYXRlX3dzdGF0cyhwcml2LCBidWYpOwotCX0KLQotCWF0NzZfZGJnKERCR19SWF9NR01UX0NPTlRFTlQsICIlcyByeCBtZ210IGZyYW1lY3RsIDB4JXggJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCwKLQkJIGhleDJzdHIobWdtdCwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSkpOwotCi0Jc3dpdGNoIChmcmFtZWN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6Ci0JCWF0NzZfcnhfbWdtdF9iZWFjb24ocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgotCQlhdDc2X3J4X21nbXRfYXNzb2MocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKLQkJYXQ3Nl9yeF9tZ210X2Rpc2Fzc29jKHByaXYsIGJ1Zik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQkJYXQ3Nl9yeF9tZ210X2F1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6Ci0JCWF0NzZfcnhfbWdtdF9kZWF1dGgocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlnbm9yaW5nIGZyYW1lIHdpdGggZnJhbWVjdGwgMHglMDR4XG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZWN0bCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBDb252ZXJ0IHRoZSA4MDIuMTEgaGVhZGVyIGludG8gYW4gZXRoZXJuZXQtc3R5bGUgaGVhZGVyLCBtYWtlIHNrYgotICogcmVhZHkgZm9yIGNvbnN1bXB0aW9uIGJ5IG5ldGlmX3J4KCkgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaWVlZTgwMjExX3RvX2V0aChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaXdfbW9kZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0Jc3RydWN0IGV0aGhkciAqZXRoX2hkcl9wOwotCXU4ICpzcmNfYWRkcjsKLQl1OCAqZGVzdF9hZGRyOwotCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0KLQkvKiBUaGF0IHdvdWxkIGJlIHRoZSBldGhlcm5ldCBoZWFkZXIgaWYgdGhlIGhhcmR3YXJlIGNvbnZlcnRlZAotCSAqIHRoZSBmcmFtZSBmb3IgdXMuICBNYWtlIHN1cmUgdGhlIHNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uCi0JICogbWF0Y2ggdGhlIDgwMi4xMSBoZWFkZXIuICBXaGljaCBoYXJkd2FyZSBkb2VzIGl0PyAqLwotCWV0aF9oZHJfcCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1bGwoc2tiLCBJRUVFODAyMTFfM0FERFJfTEVOKTsKLQotCWRlc3RfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMTsKLQlpZiAoaXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQlzcmNfYWRkciA9IGk4MDJfMTFfaGRyLT5hZGRyMjsKLQllbHNlCi0JCXNyY19hZGRyID0gaTgwMl8xMV9oZHItPmFkZHIzOwotCi0JaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX3NvdXJjZSwgc3JjX2FkZHIpICYmCi0JICAgICFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkcikpCi0JCS8qIFllcywgd2UgYWxyZWFkeSBoYXZlIGFuIGV0aGVybmV0IGhlYWRlciAqLwotCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCWVsc2UgewotCQl1MTYgbGVuOwotCi0JCS8qIE5lZWQgdG8gYnVpbGQgYW4gZXRoZXJuZXQgaGVhZGVyICovCi0JCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgc25hcHNpZywgc2l6ZW9mKHNuYXBzaWcpKSkgewotCQkJLyogU05BUCBmcmFtZSAtIGRlY2Fwc3VsYXRlLCBrZWVwIHByb3RvICovCi0JCQlza2JfcHVzaChza2IsIG9mZnNldG9mKHN0cnVjdCBldGhoZHIsIGhfcHJvdG8pIC0KLQkJCQkgc2l6ZW9mKHJmYzEwNDJzaWcpKTsKLQkJCWxlbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiA4MDIuMyBmcmFtZSwgcHJvdG8gaXMgbGVuZ3RoICovCi0JCQlsZW4gPSBza2ItPmxlbjsKLQkJCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCQl9Ci0KLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQkJZXRoX2hkcl9wID0gZXRoX2hkcihza2IpOwotCQkvKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gdGhpcyBvcmRlciAoZXRoX2hkcl9wLT5oX2Rlc3QgbWF5Ci0JCSAqIG92ZXJsYXAgc3JjX2FkZHIpICovCi0JCW1lbWNweShldGhfaGRyX3AtPmhfc291cmNlLCBzcmNfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoZXRoX2hkcl9wLT5oX2Rlc3QsIGRlc3RfYWRkciwgRVRIX0FMRU4pOwotCQlpZiAobGVuKQotCQkJZXRoX2hkcl9wLT5oX3Byb3RvID0gaHRvbnMobGVuKTsKLQl9Ci0KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7Ci19Ci0KLS8qIENoZWNrIGZvciBmcmFnbWVudGVkIGRhdGEgaW4gcHJpdi0+cnhfc2tiLiBJZiB0aGUgcGFja2V0IHdhcyBubyBmcmFnbWVudAotICAgb3IgaXQgd2FzIHRoZSBsYXN0IG9mIGEgZnJhZ21lbnQgc2V0IGEgc2tiIGNvbnRhaW5pbmcgdGhlIHdob2xlIHBhY2tldAotICAgaXMgcmV0dXJuZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gT3RoZXJ3aXNlIHdlIGdldCBOVUxMIGFuZCBhcmUKLSAgIGRvbmUgYW5kIHRoZSBwYWNrZXQgaXMgZWl0aGVyIHN0b3JlZCBpbnNpZGUgdGhlIGZyYWdtZW50IGJ1ZmZlcgotICAgb3IgdGhyb3duIGF3YXkuICBFdmVyeSByZXR1cm5lZCBza2Igc3RhcnRzIHdpdGggdGhlIGllZWU4MDJfMTEgaGVhZGVyCi0gICBhbmQgY29udGFpbnMgX25vXyBGQ1MgYXQgdGhlIGVuZCAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICphdDc2X2NoZWNrX2Zvcl9yeF9mcmFncyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkciA9Ci0JICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1Zi0+cGFja2V0OwotCS8qIHNlcV9jdHJsLCBmcmFnbWVudF9udW1iZXIsIHNlcXVlbmNlIG51bWJlciBvZiBuZXcgcGFja2V0ICovCi0JdTE2IHNjdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+c2VxX2N0bCk7Ci0JdTE2IGZyYWduciA9IHNjdGwgJiAweGY7Ci0JdTE2IHNlcW5yID0gc2N0bCA+PiA0OwotCXUxNiBmcmFtZV9jdGwgPSBsZTE2X3RvX2NwdShpODAyXzExX2hkci0+ZnJhbWVfY3RsKTsKLQotCS8qIExlbmd0aCBpbmNsdWRpbmcgdGhlIElFRUU4MDIuMTEgaGVhZGVyLCBidXQgd2l0aG91dCB0aGUgdHJhaWxpbmcKLQkgKiBGQ1MgYW5kIHdpdGhvdXQgdGhlIEF0bWVsIFJ4IGhlYWRlciAqLwotCWludCBsZW5ndGggPSBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpIC0gSUVFRTgwMjExX0ZDU19MRU47Ci0KLQkvKiB3aGVyZSBkb2VzIHRoZSBkYXRhIHBheWxvYWQgc3RhcnQgaW4gc2tiLT5kYXRhID8gKi8KLQl1OCAqZGF0YSA9IGk4MDJfMTFfaGRyLT5wYXlsb2FkOwotCi0JLyogbGVuZ3RoIG9mIHBheWxvYWQsIGV4Y2wuIHRoZSB0cmFpbGluZyBGQ1MgKi8KLQlpbnQgZGF0YV9sZW4gPSBsZW5ndGggLSBJRUVFODAyMTFfM0FERFJfTEVOOwotCi0JaW50IGk7Ci0Jc3RydWN0IHJ4X2RhdGFfYnVmICpicHRyLCAqb3B0cjsKLQl1bnNpZ25lZCBsb25nIG9sZGVzdCA9IH4wVUw7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCSAiJXM6IHJ4IGRhdGEgZnJhbWVfY3RsICUwNHggYWRkcjIgJXMgc2VxL2ZyYWcgJWQvJWQgIgotCQkgImxlbmd0aCAlZCBkYXRhICVkOiAlcyAuLi4iLCBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCwKLQkJIG1hYzJzdHIoaTgwMl8xMV9oZHItPmFkZHIyKSwgc2VxbnIsIGZyYWduciwgbGVuZ3RoLCBkYXRhX2xlbiwKLQkJIGhleDJzdHIoZGF0YSwgMzIpKTsKLQotCWF0NzZfZGJnKERCR19SWF9GUkFHU19TS0IsICIlczogaW5jb21pbmcgc2tiOiBoZWFkICVwIGRhdGEgJXAgIgotCQkgInRhaWwgJXAgZW5kICVwIGxlbiAlZCIsIHByaXYtPm5ldGRldi0+bmFtZSwgc2tiLT5oZWFkLAotCQkgc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAotCQkgc2tiLT5sZW4pOwotCi0JaWYgKGRhdGFfbGVuIDwgMCkgewotCQkvKiBtYWtlIHN1cmUgZGF0YSBzdGFydHMgaW4gdGhlIGJ1ZmZlciAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlczogZGF0YSBmcmFtZSB0b28gc2hvcnRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlXQVJOX09OKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTik7Ci0JaWYgKGxlbmd0aCA8PSBBVDc2X1JYX0hEUkxFTikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiByZW1vdmUgdGhlIGF0NzZfcnhfYnVmZmVyIGhlYWRlciAtIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSAqLwotCS8qIHdlIG5lZWQgdGhlIElFRUU4MDIuMTEgaGVhZGVyIChmb3IgdGhlIGFkZHJlc3NlcykgaWYgdGhpcyBwYWNrZXQKLQkgICBpcyB0aGUgZmlyc3Qgb2YgYSBjaGFpbiAqLwotCXNrYl9wdWxsKHNrYiwgQVQ3Nl9SWF9IRFJMRU4pOwotCi0JLyogcmVtb3ZlIEZDUyBhdCBlbmQgKi8KLQlza2JfdHJpbShza2IsIGxlbmd0aCk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfRlJBR1NfU0tCLCAiJXM6IHRyaW1tZWQgc2tiOiBoZWFkICVwIGRhdGEgJXAgdGFpbCAlcCAiCi0JCSAiZW5kICVwIGxlbiAlZCBkYXRhICVwIGRhdGFfbGVuICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKLQkJIHNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbiwgZGF0YSwgZGF0YV9sZW4pOwotCi0JaWYgKGZyYWduciA9PSAwICYmICEoZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgewotCQkvKiB1bmZyYWdtZW50ZWQgcGFja2V0IHJlY2VpdmVkICovCi0JCS8qIFVzZSBhIG5ldyBza2IgZm9yIHRoZSBuZXh0IHJlY2VpdmUgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLCAiJXM6IHVuZnJhZ21lbnRlZCIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybiBza2I7Ci0JfQotCi0JLyogbG9vayBpZiB3ZSd2ZSBnb3QgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLgotCSAgIGFmdGVyd2FyZHMgb3B0ciBwb2ludHMgdG8gZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5LAotCSAgIG9yLCBpZiBpIDwgTlJfUlhfREFUQV9CVUYsIGJwdHIgcG9pbnRzIHRvIHRoZSBlbnRyeSBmb3IgdGhlCi0JICAgc2VuZGVyIGFkZHJlc3MgKi8KLQkvKiBkZXRlcm1pbmluZyB0aGUgb2xkZXN0IGVudHJ5IGRvZXNuJ3QgY29wZSB3aXRoIGppZmZpZXMgd3JhcHBpbmcKLQkgICBidXQgSSBkb24ndCBjYXJlIHRvIGRlbGV0ZSBhIHlvdW5nIGVudHJ5IGF0IHRoZXNlIHJhcmUgbW9tZW50cyAuLi4gKi8KLQotCWJwdHIgPSBwcml2LT5yeF9kYXRhOwotCW9wdHIgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrLCBicHRyKyspIHsKLQkJaWYgKCFicHRyLT5za2IpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gMFVMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjIsIGJwdHItPnNlbmRlcikpCi0JCQlicmVhazsKLQotCQlpZiAoIW9wdHIpIHsKLQkJCW9wdHIgPSBicHRyOwotCQkJb2xkZXN0ID0gYnB0ci0+bGFzdF9yeDsKLQkJfSBlbHNlIGlmIChicHRyLT5sYXN0X3J4IDwgb2xkZXN0KQotCQkJb3B0ciA9IGJwdHI7Ci0JfQotCi0JaWYgKGkgPCBOUl9SWF9EQVRBX0JVRikgewotCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiAlZC4gY2FjaGVlbnRyeSAoc2VxL2ZyYWcgPSAlZC8lZCkgIgotCQkJICJtYXRjaGVkIHNlbmRlciBhZGRyIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGksIGJwdHItPnNlcW5yLCBicHRyLT5mcmFnbnIpOwotCi0JCS8qIGJwdHIgcG9pbnRzIHRvIGFuIGVudHJ5IGZvciB0aGUgc2VuZGVyIGFkZHJlc3MgKi8KLQkJaWYgKGJwdHItPnNlcW5yID09IHNlcW5yKSB7Ci0JCQlpbnQgbGVmdDsKLQkJCS8qIHRoZSBmcmFnbWVudCBoYXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyICovCi0JCQlpZiAoKChicHRyLT5mcmFnbnIgKyAxKSAmIDB4ZikgIT0gZnJhZ25yKSB7Ci0JCQkJLyogd3JvbmcgZnJhZ21lbnQgbnVtYmVyIC0+IGlnbm9yZSBpdCAqLwotCQkJCS8qIGlzICYgMHhmIG5lY2Vzc2FyeSBhYm92ZSA/Pz8gKi8KLQkJCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkJCSAiJXM6IGZyYWcgbnIgbWlzbWF0Y2g6ICVkICsgMSAhPSAlZCIsCi0JCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJwdHItPmZyYWduciwKLQkJCQkJIGZyYWducik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHRoZSBuZXh0IGZvbGxvd2luZyBmcmFnbWVudCBudW1iZXIgLT4KLQkJCSAgIGFkZCB0aGUgZGF0YSBhdCB0aGUgZW5kICovCi0KLQkJCS8qIGZvciB0ZXN0IG9ubHkgPz8/ICovCi0JCQlsZWZ0ID0gc2tiX3RhaWxyb29tKGJwdHItPnNrYik7Ci0JCQlpZiAobGVmdCA8IGRhdGFfbGVuKQotCQkJCXByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgICAgIiVzOiBvbmx5ICVkIGJ5dGUgZnJlZSAobmVlZCAlZClcbiIsCi0JCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbGVmdCwgZGF0YV9sZW4pOwotCQkJZWxzZQotCQkJCW1lbWNweShza2JfcHV0KGJwdHItPnNrYiwgZGF0YV9sZW4pLCBkYXRhLAotCQkJCSAgICAgICBkYXRhX2xlbik7Ci0KLQkJCWJwdHItPmZyYWduciA9IGZyYWducjsKLQkJCWlmIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IC0gc2VuZCBpdCAqLwotCQkJc2tiID0gYnB0ci0+c2tiOwotCQkJYnB0ci0+c2tiID0gTlVMTDsJLyogZnJlZSB0aGUgZW50cnkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiBsYXN0IGZyYWcgb2Ygc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFucik7Ci0JCQlyZXR1cm4gc2tiOwotCQl9Ci0KLQkJLyogZ290IGFub3RoZXIgc2VxdWVuY2UgbnVtYmVyICovCi0JCWlmIChmcmFnbnIgPT0gMCkgewotCQkJLyogaXQncyB0aGUgc3RhcnQgb2YgYSBuZXcgY2hhaW4gLSByZXBsYWNlIHRoZQotCQkJICAgb2xkIG9uZSBieSB0aGlzICovCi0JCQkvKiBicHRyLT5zZW5kZXIgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGFscmVhZHkgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBzdGFydCBvZiBuZXcgc2VxICVkLCByZW1vdmluZyBvbGQgc2VxICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzZXFuciwgYnB0ci0+c2VxbnIpOwotCQkJYnB0ci0+c2VxbnIgPSBzZXFucjsKLQkJCWJwdHItPmZyYWduciA9IDA7Ci0JCQlicHRyLT5sYXN0X3J4ID0gamlmZmllczsKLQkJCS8qIHN3YXAgYnB0ci0+c2tiIGFuZCBwcml2LT5yeF9za2IgKi8KLQkJCXNrYiA9IGJwdHItPnNrYjsKLQkJCWJwdHItPnNrYiA9IHByaXYtPnJ4X3NrYjsKLQkJCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQkJfSBlbHNlIHsKLQkJCS8qIGl0IGZyb20gdGhlIG1pZGRsZSBvZiBhIG5ldyBjaGFpbiAtPgotCQkJICAgZGVsZXRlIHRoZSBvbGQgZW50cnkgYW5kIHNraXAgdGhlIG5ldyBvbmUgKi8KLQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkgIiVzOiBtaWRkbGUgb2YgbmV3IHNlcSAlZCAoJWQpICIKLQkJCQkgInJlbW92aW5nIG9sZCBzZXEgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHNlcW5yLCBmcmFnbnIsCi0JCQkJIGJwdHItPnNlcW5yKTsKLQkJCWRldl9rZnJlZV9za2IoYnB0ci0+c2tiKTsKLQkJCWJwdHItPnNrYiA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogaWYgd2UgZGlkbid0IGZpbmQgYSBjaGFpbiBmb3IgdGhlIHNlbmRlciBhZGRyZXNzLCBvcHRyCi0JICAgcG9pbnRzIGVpdGhlciB0byB0aGUgZmlyc3QgZnJlZSBvciB0aGUgb2xkZXN0IGVudHJ5ICovCi0KLQlpZiAoZnJhZ25yICE9IDApIHsKLQkJLyogdGhpcyBpcyBub3QgdGhlIGJlZ2luIG9mIGEgZnJhZ21lbnQgY2hhaW4gLi4uICovCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCSAiJXM6IG5vIGNoYWluIGZvciBub24tZmlyc3QgZnJhZ21lbnQgKCVkKSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFnbnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlCVUdfT04oIW9wdHIpOwotCWlmIChvcHRyLT5za2IpIHsKLQkJLyogc3dhcCB0aGUgc2tiJ3MgKi8KLQkJc2tiID0gb3B0ci0+c2tiOwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCXByaXYtPnJ4X3NrYiA9IHNrYjsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsCi0JCQkgIiVzOiBmcmVlIG9sZCBjb250ZW50czogc2VuZGVyICVzIHNlcS9mcmFnICVkLyVkIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIob3B0ci0+c2VuZGVyKSwKLQkJCSBvcHRyLT5zZXFuciwgb3B0ci0+ZnJhZ25yKTsKLQotCX0gZWxzZSB7Ci0JCS8qIHRha2UgdGhlIHNrYiBmcm9tIHByaXYtPnJ4X3NrYiAqLwotCQlvcHRyLT5za2IgPSBwcml2LT5yeF9za2I7Ci0JCS8qIGxldCBhdDc2X3N1Ym1pdF9yeF91cmIoKSBhbGxvY2F0ZSBhIG5ldyBza2IgKi8KLQkJcHJpdi0+cnhfc2tiID0gTlVMTDsKLQotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsICIlczogdXNlIGEgZnJlZSBlbnRyeSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQl9Ci0JbWVtY3B5KG9wdHItPnNlbmRlciwgaTgwMl8xMV9oZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0Jb3B0ci0+c2VxbnIgPSBzZXFucjsKLQlvcHRyLT5mcmFnbnIgPSAwOwotCW9wdHItPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJ4IGludGVycnVwdDogd2UgZXhwZWN0IHRoZSBjb21wbGV0ZSBkYXRhIGJ1ZmZlciBpbiBwcml2LT5yeF9za2IgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfZGF0YShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT5yeF9za2I7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkcjsKLQlpbnQgbGVuZ3RoID0gbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKTsKLQotCWF0NzZfZGJnKERCR19SWF9EQVRBLCAiJXMgcmVjZWl2ZWQgZGF0YSBwYWNrZXQ6ICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihza2ItPmRhdGEsIEFUNzZfUlhfSERSTEVOKSk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfREFUQV9DT05URU5ULCAicnggcGFja2V0OiAlcyIsCi0JCSBoZXgyc3RyKHNrYi0+ZGF0YSArIEFUNzZfUlhfSERSTEVOLCBsZW5ndGgpKTsKLQotCXNrYiA9IGF0NzZfY2hlY2tfZm9yX3J4X2ZyYWdzKHByaXYpOwotCWlmICghc2tiKQotCQlyZXR1cm47Ci0KLQkvKiBBdG1lbCBoZWFkZXIgYW5kIHRoZSBGQ1MgYXJlIGFscmVhZHkgcmVtb3ZlZCAqLwotCWk4MDJfMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOwotCi0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkvKiBUT0RPOiBzaG91bGQgY2hlY2sgQ1JDICovCi0KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaTgwMl8xMV9oZHItPmFkZHIxKSkgewotCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+YnJvYWRjYXN0KSkKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOwotCQllbHNlCi0JCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKLQl9IGVsc2UgaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEsIG5ldGRldi0+ZGV2X2FkZHIpKQotCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLQotCWF0NzZfaWVlZTgwMjExX3RvX2V0aChza2IsIHByaXYtPml3X21vZGUpOwotCi0JbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQluZXRpZl9yeChza2IpOwotCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jc3RhdHMtPnJ4X2J5dGVzICs9IGxlbmd0aDsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tb25pdG9yX21vZGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCAqcnQ7Ci0JdTggKnBheWxvYWQ7Ci0JaW50IHNrYmxlbjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwotCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmID0KLQkgICAgKHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqKXByaXYtPnJ4X3NrYi0+ZGF0YTsKLQkvKiBsZW5ndGggaW5jbHVkaW5nIHRoZSBJRUVFODAyLjExIGhlYWRlciBhbmQgdGhlIHRyYWlsaW5nIEZDUywKLQkgICBidXQgbm90IGF0NzZfcnhfYnVmZmVyICovCi0JaW50IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGJ1Zi0+d2xlbmd0aCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X3NrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0KLQlpZiAobGVuZ3RoIDwgSUVFRTgwMjExX0ZDU19MRU4pIHsKLQkJLyogYnVmZmVyIGNvbnRhaW5zIG5vIGRhdGEgKi8KLQkJYXQ3Nl9kYmcoREJHX01PTklUT1JfTU9ERSwKLQkJCSAiJXM6IE1PTklUT1IgTU9ERTogcnggc2tiIHdpdGhvdXQgZGF0YSIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYmxlbiA9IHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCkgKyBsZW5ndGg7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbik7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogTU9OSVRPUiBNT0RFOiBkZXZfYWxsb2Nfc2tiIGZvciByYWRpb3RhcCAiCi0JCSAgICAgICAiaGVhZGVyIHJldHVybmVkIE5VTExcbiIsIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcHV0KHNrYiwgc2tibGVuKTsKLQotCXJ0ID0gKHN0cnVjdCBhdDc2X3J4X3JhZGlvdGFwICopc2tiLT5kYXRhOwotCXBheWxvYWQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApOwotCi0JcnQtPnJ0X2hkci5pdF92ZXJzaW9uID0gMDsKLQlydC0+cnRfaGRyLml0X3BhZCA9IDA7Ci0JcnQtPnJ0X2hkci5pdF9sZW4gPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGF0NzZfcnhfcmFkaW90YXApKTsKLQlydC0+cnRfaGRyLml0X3ByZXNlbnQgPSBjcHVfdG9fbGUzMihBVDc2X1JYX1JBRElPVEFQX1BSRVNFTlQpOwotCi0JcnQtPnJ0X3RzZnQgPSBjcHVfdG9fbGU2NChsZTMyX3RvX2NwdShidWYtPnJ4X3RpbWUpKTsKLQlydC0+cnRfcmF0ZSA9IGh3X3JhdGVzW2J1Zi0+cnhfcmF0ZV0gJiAofjB4ODApOwotCXJ0LT5ydF9zaWduYWwgPSBidWYtPnJzc2k7Ci0JcnQtPnJ0X25vaXNlID0gYnVmLT5ub2lzZV9sZXZlbDsKLQlydC0+cnRfZmxhZ3MgPSBJRUVFODAyMTFfUkFESU9UQVBfRl9GQ1M7Ci0JaWYgKGJ1Zi0+ZnJhZ21lbnRhdGlvbikKLQkJcnQtPnJ0X2ZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX0ZSQUc7Ci0KLQltZW1jcHkocGF5bG9hZCwgYnVmLT5wYWNrZXQsIGxlbmd0aCk7Ci0Jc2tiLT5kZXYgPSBuZXRkZXY7Ci0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0Jc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0Jc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKLQotCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JbmV0aWZfcngoc2tiKTsKLQlzdGF0cy0+cnhfcGFja2V0cysrOwotCXN0YXRzLT5yeF9ieXRlcyArPSBsZW5ndGg7Ci19Ci0KLS8qIENoZWNrIGlmIHdlIHNweSBvbiB0aGUgc2VuZGVyIGFkZHJlc3MgaW4gYnVmIGFuZCB1cGRhdGUgc3RhdHMgKi8KLXN0YXRpYyB2b2lkIGF0NzZfaXdzcHlfdXBkYXRlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGl3X3F1YWxpdHkgcXVhbDsKLQotCS8qIFdlIGNhbiBvbmx5IHNldCB0aGUgbGV2ZWwgaGVyZSAqLwotCXF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9JTlZBTElEIHwgSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCXF1YWwubGV2ZWwgPSAwOwotCXF1YWwubm9pc2UgPSAwOwotCWF0NzZfY2FsY19sZXZlbChwcml2LCBidWYsICZxdWFsKTsKLQotCXNwaW5fbG9ja19iaCgmcHJpdi0+c3B5X3NwaW5sb2NrKTsKLQotCWlmIChwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkKLQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShwcml2LT5uZXRkZXYsIGhkci0+YWRkcjIsICZxdWFsKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotfQotCiBzdGF0aWMgdm9pZCBhdDc2X3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKIAlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKXBhcmFtOwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKIAlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHI7Ci0JdTE2IGZyYW1lX2N0bDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7IDAgfTsKIAogCWlmIChwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CiAJCWF0NzZfZGJnKERCR19ERVZTVEFSVCwgImRldmljZSB1bnBsdWdnZWQiKTsKQEAgLTQ5OTAsNjMgKzE2MjUsNDQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcHJpdi0+cnhfc2tiIHx8ICFuZXRkZXYgfHwgIXByaXYtPnJ4X3NrYi0+ZGF0YSkKKwlpZiAoIXByaXYtPnJ4X3NrYiB8fCAhcHJpdi0+cnhfc2tiLT5kYXRhKQogCQlyZXR1cm47CiAKIAlidWYgPSAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopcHJpdi0+cnhfc2tiLT5kYXRhOwogCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWYtPnBhY2tldDsKLQotCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGk4MDJfMTFfaGRyLT5mcmFtZV9jdGwpOwotCiAJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKIAkJaWYgKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQgJiYgdXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCiAJCQlhdDc2X2RiZyhEQkdfVVJCLAogCQkJCSAiJXMgJXM6IC0gbm9uemVybyBSeCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJCSBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lLCB1cmItPnN0YXR1cyk7CisJCQkJIF9fZnVuY19fLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCQkJIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCWF0NzZfZGJnKERCR19SWF9BVE1FTF9IRFIsCi0JCSAiJXM6IHJ4IGZyYW1lOiByYXRlICVkIHJzc2kgJWQgbm9pc2UgJWQgbGluayAlZCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGJ1Zi0+cnhfcmF0ZSwgYnVmLT5yc3NpLCBidWYtPm5vaXNlX2xldmVsLAotCQkgYnVmLT5saW5rX3F1YWxpdHksIGhleDJzdHIoaTgwMl8xMV9oZHIsIDQ4KSk7Ci0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCWF0NzZfcnhfbW9uaXRvcl9tb2RlKHByaXYpOwotCQlnb3RvIGV4aXQ7Ci0JfQorCQkgIiVzOiByeCBmcmFtZTogcmF0ZSAlZCByc3NpICVkIG5vaXNlICVkIGxpbmsgJWQiLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBidWYtPnJ4X3JhdGUsIGJ1Zi0+cnNzaSwKKwkJIGJ1Zi0+bm9pc2VfbGV2ZWwsIGJ1Zi0+bGlua19xdWFsaXR5KTsKIAotCS8qIHRoZXJlIGlzIGEgbmV3IGJzc2lkIGFyb3VuZCwgYWNjZXB0IGl0OiAqLwotCWlmIChidWYtPm5ld2JzcyAmJiBwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IHJ4IG5ld2JzcyIsIG5ldGRldi0+bmFtZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfbmV3X2Jzcyk7Ci0JfQorCXNrYl90cmltKHByaXYtPnJ4X3NrYiwgbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKSArIEFUNzZfUlhfSERSTEVOKTsKKwlhdDc2X2RiZ19kdW1wKERCR19SWF9EQVRBLCAmcHJpdi0+cnhfc2tiLT5kYXRhW0FUNzZfUlhfSERSTEVOXSwKKwkJICAgICAgcHJpdi0+cnhfc2tiLT5sZW4sICJSWDogbGVuPSVkIiwKKwkJICAgICAgKGludCkocHJpdi0+cnhfc2tiLT5sZW4gLSBBVDc2X1JYX0hEUkxFTikpOwogCi0Jc3dpdGNoIChmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgewotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCWF0NzZfcnhfZGF0YShwcml2KTsKLQkJYnJlYWs7CisJcnhfc3RhdHVzLnNpZ25hbCA9IGJ1Zi0+cnNzaTsKKwkvKiBGSVhNRTogaXMgcmF0ZV9pZHggc3RpbGwgcHJlc2VudCBpbiBzdHJ1Y3R1cmU/ICovCisJcnhfc3RhdHVzLnJhdGVfaWR4ID0gYnVmLT5yeF9yYXRlOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOworCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQ7CiAKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQkvKiBqYWw6IFRPRE86IGZpbmQgb3V0IGlmIHdlIGNhbiB1cGRhdGUgaXdzcHkgYWxzbyBvbgotCQkgICBvdGhlciBmcmFtZXMgdGhhbiBtYW5hZ2VtZW50IChtaWdodCBkZXBlbmQgb24gdGhlCi0JCSAgIHJhZGlvIGNoaXAgLyBmaXJtd2FyZSB2ZXJzaW9uICEpICovCisJc2tiX3B1bGwocHJpdi0+cnhfc2tiLCBBVDc2X1JYX0hEUkxFTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiY2FsbGluZyBpZWVlODAyMTFfcnhfaXJxc2FmZSgpOiAlZC8lZCIsCisJCSBwcml2LT5yeF9za2ItPmxlbiwgcHJpdi0+cnhfc2tiLT5kYXRhX2xlbik7CisJaWVlZTgwMjExX3J4X2lycXNhZmUocHJpdi0+aHcsIHByaXYtPnJ4X3NrYiwgJnJ4X3N0YXR1cyk7CiAKLQkJYXQ3Nl9pd3NweV91cGRhdGUocHJpdiwgYnVmKTsKKwkvKiBVc2UgYSBuZXcgc2tiIGZvciB0aGUgbmV4dCByZWNlaXZlICovCisJcHJpdi0+cnhfc2tiID0gTlVMTDsKIAotCQlhdDc2X3J4X21nbXQocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCWF0NzZfZGJnKERCR19SWF9DVFJMLCAiJXM6IGlnbm9yZWQgY3RybCBmcmFtZTogJTA0eCIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBmcmFtZV9jdGwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogaWdub3JpbmcgZnJhbWUgd2l0aCBmcmFtZWN0bCAweCUwNHhcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCk7Ci0JfQotZXhpdDoKIAlhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7CiB9CiAKQEAgLTUwNzMsNyArMTY4OSw3IEBACiAJCQkgICBmd2UtPmZ3bmFtZSk7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsCiAJCQkgICAieW91IG1heSBuZWVkIHRvIGRvd25sb2FkIHRoZSBmaXJtd2FyZSBmcm9tICIKLQkJCSAgICJodHRwOi8vZGV2ZWxvcGVyLmJlcmxpb3MuZGUvcHJvamVjdHMvYXQ3NmM1MDNhLyIpOworCQkJICAgImh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9hdDc2YzUwM2EvXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTEyNiw1NiArMTc0Miw2MjggQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGF0NzZfbWFjODAyMTFfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eF9za2IpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJLyogRklYTUU6CisJCSAqIGlzIHRoZSBmcmFtZSByZWFsbHkgQUNLZWQgd2hlbiB0eF9jYWxsYmFjayBpcyBjYWxsZWQgPyAqLworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJCWJyZWFrOworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FQ09OTlJFU0VUOgorCQkvKiBmYWlsLCB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KKwkJLyogRklYTUU6IGFkZCBlcnJvciBtZXNzYWdlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF0NzZfZGJnKERCR19VUkIsICIlcyAtIG5vbnplcm8gdHggc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKKworCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShwcml2LT5odywgcHJpdi0+dHhfc2tiKTsKKworCXByaXYtPnR4X3NrYiA9IE5VTEw7CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworfQorCitzdGF0aWMgaW50IGF0NzZfbWFjODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqdHhfYnVmZmVyID0gcHJpdi0+YnVsa19vdXRfYnVmZmVyOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlpbnQgcGFkZGluZywgc3VibWl0X2xlbiwgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCWlmIChwcml2LT50eF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgY2FsbGVkIHdoaWxlIHR4IHVyYiBpcyBwZW5kaW5nXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBfX2Z1bmNfXyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJYXQ3Nl9sZWR0cmlnX3R4X2FjdGl2aXR5KCk7CS8qIHRlbGwgbGVkdHJpZ2dlciB3ZSBzZW5kIGEgcGFja2V0ICovCisKKwlXQVJOX09OKHByaXYtPnR4X3NrYiAhPSBOVUxMKTsKKworCXByaXYtPnR4X3NrYiA9IHNrYjsKKwlwYWRkaW5nID0gYXQ3Nl9jYWxjX3BhZGRpbmcoc2tiLT5sZW4pOworCXN1Ym1pdF9sZW4gPSBBVDc2X1RYX0hEUkxFTiArIHNrYi0+bGVuICsgcGFkZGluZzsKKworCS8qIHNldHVwICdBdG1lbCcgaGVhZGVyICovCisJbWVtc2V0KHR4X2J1ZmZlciwgMCwgc2l6ZW9mKCp0eF9idWZmZXIpKTsKKwl0eF9idWZmZXItPnBhZGRpbmcgPSBwYWRkaW5nOworCXR4X2J1ZmZlci0+d2xlbmd0aCA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKwl0eF9idWZmZXItPnR4X3JhdGUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIGluZm8pLT5od192YWx1ZTsKKwlpZiAoRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pICYmIGluZm8tPmNvbnRyb2wuaHdfa2V5KSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5rZXlpZHgpOworCQl0eF9idWZmZXItPmNpcGhlcl90eXBlID0KKwkJCXByaXYtPmtleXNbaW5mby0+Y29udHJvbC5od19rZXktPmtleWlkeF0uY2lwaGVyOworCQl0eF9idWZmZXItPmNpcGhlcl9sZW5ndGggPQorCQkJcHJpdi0+a2V5c1tpbmZvLT5jb250cm9sLmh3X2tleS0+a2V5aWR4XS5rZXlsZW47CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX0gZWxzZSB7CisJCXR4X2J1ZmZlci0+a2V5X2lkID0gMDsKKwkJdHhfYnVmZmVyLT5jaXBoZXJfdHlwZSA9IDA7CisJCXR4X2J1ZmZlci0+Y2lwaGVyX2xlbmd0aCA9IDA7CisJCXR4X2J1ZmZlci0+cmVzZXJ2ZWQgPSAwOworCX07CisJLyogbWVtc2V0KHR4X2J1ZmZlci0+cmVzZXJ2ZWQsIDAsIHNpemVvZih0eF9idWZmZXItPnJlc2VydmVkKSk7ICovCisJbWVtY3B5KHR4X2J1ZmZlci0+cGFja2V0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCWF0NzZfZGJnKERCR19UWF9EQVRBLCAiJXMgdHg6IHdsZW4gMHgleCBwYWQgMHgleCByYXRlICVkIGhkciIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGxlMTZfdG9fY3B1KHR4X2J1ZmZlci0+d2xlbmd0aCksCisJCSB0eF9idWZmZXItPnBhZGRpbmcsIHR4X2J1ZmZlci0+dHhfcmF0ZSk7CisKKwkvKiBzZW5kIHN0dWZmICovCisJYXQ3Nl9kYmdfZHVtcChEQkdfVFhfREFUQV9DT05URU5ULCB0eF9idWZmZXIsIHN1Ym1pdF9sZW4sCisJCSAgICAgICIlcygpOiB0eF9idWZmZXIgJWQgYnl0ZXM6IiwgX19mdW5jX18sIHN1Ym1pdF9sZW4pOworCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPnR4X3VyYiwgcHJpdi0+dWRldiwgcHJpdi0+dHhfcGlwZSwgdHhfYnVmZmVyLAorCQkJICBzdWJtaXRfbGVuLCBhdDc2X21hYzgwMjExX3R4X2NhbGxiYWNrLCBwcml2KTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT50eF91cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogLUVJTlZBTDogdHggdXJiICVwIGhjcHJpdiAlcCBjb21wbGV0ZSAlcFxuIiwKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPnR4X3VyYiwKKwkJCSAgICAgICBwcml2LT50eF91cmItPmhjcHJpdiwgcHJpdi0+dHhfdXJiLT5jb21wbGV0ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9tYWM4MDIxMV9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IHJldDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJcmV0ID0gYXQ3Nl9zdWJtaXRfcnhfdXJiKHByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9wZW46IHN1Ym1pdF9yeF91cmIgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlhdDc2X3N0YXJ0dXBfZGV2aWNlKHByaXYpOworCisJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCitlcnJvcjoKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9tYWM4MDIxMV9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWYgKCFwcml2LT5kZXZpY2VfdW5wbHVnZ2VkKSB7CisJCS8qIFdlIGFyZSBjYWxsZWQgYnkgImlmY29uZmlnIGV0aFggZG93biIsIG5vdCBiZWNhdXNlIHRoZQorCQkgKiBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlLiAqLworCQlpZiAoYXQ3Nl9zZXRfcmFkaW8ocHJpdiwgMCkgPT0gMSkKKwkJCWF0NzZfd2FpdF9jb21wbGV0aW9uKHByaXYsIENNRF9SQURJT19PTik7CisKKwkJLyogV2UgdW5saW5rIHJ4X3VyYiBiZWNhdXNlIGF0NzZfb3BlbigpIHJlLXN1Ym1pdHMgaXQuCisJCSAqIElmIHVucGx1Z2dlZCwgYXQ3Nl9kZWxldGVfZGV2aWNlKCkgdGFrZXMgY2FyZSBvZiBpdC4gKi8KKwkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworfQorCitzdGF0aWMgaW50IGF0NzZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCkiLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJc3dpdGNoIChjb25mLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBhdDc2X2pvaW4oc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgYXQ3Nl9yZXFfam9pbiBqb2luOworCWludCByZXQ7CisKKwltZW1zZXQoJmpvaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfam9pbikpOworCW1lbWNweShqb2luLmVzc2lkLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSk7CisJam9pbi5lc3NpZF9zaXplID0gcHJpdi0+ZXNzaWRfc2l6ZTsKKwltZW1jcHkoam9pbi5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKKwlqb2luLmJzc190eXBlID0gSU5GUkFTVFJVQ1RVUkVfTU9ERTsKKwlqb2luLmNoYW5uZWwgPSBwcml2LT5jaGFubmVsOworCWpvaW4udGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX0pPSU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9KT0lOLCAmam9pbiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX0pPSU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfSk9JTiByZXR1cm5lZDogMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisJCXJldHVybiAwOworCX0KKworCWF0NzZfc2V0X3RraXBfYnNzaWQocHJpdiwgcHJpdi0+YnNzaWQpOworCWF0NzZfc2V0X3BtX21vZGUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19od19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdDc2X3ByaXYsCisJCQkJCSAgICAgIGR3b3JrX2h3X3NjYW4ud29yayk7CisJaW50IHJldDsKKworCXJldCA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgQ01EX1NDQU4pOworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzOiBDTURfU0NBTiBzdGF0dXMgMHglMDJ4IiwgX19mdW5jX18sIHJldCk7CisKKwkvKiBGSVhNRTogYWRkIG1heGltdW0gdGltZSBmb3Igc2NhbiB0byBjb21wbGV0ZSAqLworCisJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+ZHdvcmtfaHdfc2NhbiwKKwkJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHByaXYtPmh3KTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfQorCisJaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKKworZXhpdDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqc3NpZCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0NzZfcmVxX3NjYW4gc2NhbjsKKwlpbnQgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKToiLCBfX2Z1bmNfXyk7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHNzaWQsIGxlbiwgInNzaWQgJXpkIGJ5dGVzOiIsIGxlbik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKKworCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7CisJbWVtc2V0KHNjYW4uYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKKwlzY2FuLnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9BQ1RJVkU7CisJaWYgKHByaXYtPmVzc2lkX3NpemUgPiAwKSB7CisJCW1lbWNweShzY2FuLmVzc2lkLCBzc2lkLCBsZW4pOworCQlzY2FuLmVzc2lkX3NpemUgPSBsZW47CisJfQorCXNjYW4ubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUpOworCXNjYW4ubWF4X2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWF4X3RpbWUpOworCXNjYW4ucHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNihwcml2LT5zY2FuX21pbl90aW1lICogMTAwMCk7CisJc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4gPSAwOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IHNlbmRpbmcgQ01EX1NDQU4iLCBfX2Z1bmNfXyk7CisJcmV0ID0gYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHByaXYtPnVkZXYsIENNRF9TQ0FOLCAmc2Nhbiwgc2l6ZW9mKHNjYW4pKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWVycigiQ01EX1NDQU4gZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPmR3b3JrX2h3X3NjYW4sCisJCQkgICBTQ0FOX1BPTExfSU5URVJWQUwpOworCitleGl0OgorCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0NzZfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY2hhbm5lbCAlZCByYWRpbyAlZCIsCisJCSBfX2Z1bmNfXywgY29uZi0+Y2hhbm5lbC0+aHdfdmFsdWUsIGNvbmYtPnJhZGlvX2VuYWJsZWQpOworCWF0NzZfZGJnX2R1bXAoREJHX01BQzgwMjExLCBwcml2LT5lc3NpZCwgcHJpdi0+ZXNzaWRfc2l6ZSwgInNzaWQ6Iik7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHByaXYtPmJzc2lkLCBFVEhfQUxFTiwgImJzc2lkOiIpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPmNoYW5uZWwgPSBjb25mLT5jaGFubmVsLT5od192YWx1ZTsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQlhdDc2X2pvaW4ocHJpdik7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CisJfSBlbHNlIHsKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKKwkJYXQ3Nl9zdGFydF9tb25pdG9yKHByaXYpOworCX07CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlhdDc2X2RiZ19kdW1wKERCR19NQUM4MDIxMSwgY29uZi0+YnNzaWQsIEVUSF9BTEVOLCAiYnNzaWQ6Iik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOworLy8JbWVtY3B5KHByaXYtPmVzc2lkLCBjb25mLT5zc2lkLCBjb25mLT5zc2lkX2xlbik7CisvLwlwcml2LT5lc3NpZF9zaXplID0gY29uZi0+c3NpZF9sZW47CisKKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihwcml2LT5ic3NpZCkpIHsKKwkJLyogbWFjODAyMTEgaXMgam9pbmluZyBhIGJzcyAqLworCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X2pvaW4ocHJpdik7CisJfSBlbHNlCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBhdG9taWMgKi8KK3N0YXRpYyB2b2lkIGF0NzZfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJCSAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgaW50IG1jX2NvdW50LAorCQkJCSAgc3RydWN0IGRldl9hZGRyX2xpc3QgKm1jX2xpc3QpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCBmbGFnczsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCk6IGNoYW5nZWRfZmxhZ3M9MHglMDh4ICIKKwkJICJ0b3RhbF9mbGFncz0weCUwOHggbWNfY291bnQ9JWQiLAorCQkgX19mdW5jX18sIGNoYW5nZWRfZmxhZ3MsICp0b3RhbF9mbGFncywgbWNfY291bnQpOworCisJZmxhZ3MgPSBjaGFuZ2VkX2ZsYWdzICYgQVQ3Nl9TVVBQT1JURURfRklMVEVSUzsKKwkqdG90YWxfZmxhZ3MgPSBBVDc2X1NVUFBPUlRFRF9GSUxURVJTOworCisJLyogRklYTUU6IGFjY2VzcyB0byBwcml2LT5wcm9taXNjIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aAorCSAqIHByaXYtPm10eCwgYnV0IGl0J3MgaW1wb3NzaWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUKKwkgKiBhdG9taWMgKi8KKworCWlmIChmbGFncyAmJiAhcHJpdi0+cHJvbWlzYykgeworCQkvKiBtYWM4MDIxMSB3YW50cyB1cyB0byBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlwcml2LT5wcm9taXNjID0gMTsKKwl9IGVsc2UgaWYgKCFmbGFncyAmJiBwcml2LT5wcm9taXNjKSB7CisJCS8qIHdlIG5lZWQgdG8gZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCXByaXYtPnByb21pc2MgPSAwOworCX0gZWxzZQorCQlyZXR1cm47CisKKwlxdWV1ZV93b3JrKGh3LT53b3JrcXVldWUsICZwcml2LT53b3JrX3NldF9wcm9taXNjKTsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfb2xkZncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWludCBpOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChrZXktPmFsZyAhPSBBTEdfV0VQKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlrZXktPmh3X2tleV9pZHggPSBrZXktPmtleWlkeDsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VUX0tFWToKKwkJbWVtY3B5KHByaXYtPndlcF9rZXlzW2tleS0+a2V5aWR4XSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwkJcHJpdi0+d2VwX2tleXNfbGVuW2tleS0+a2V5aWR4XSA9IGtleS0+a2V5bGVuOworCisJCS8qIEZJWE1FOiBmaW5kIG91dCBob3cgdG8gZG8gdGhpcyBwcm9wZXJseSAqLworCQlwcml2LT53ZXBfa2V5X2lkID0ga2V5LT5rZXlpZHg7CisKKwkJYnJlYWs7CisJY2FzZSBESVNBQkxFX0tFWToKKwlkZWZhdWx0OgorCQlwcml2LT53ZXBfa2V5c19sZW5ba2V5LT5rZXlpZHhdID0gMDsKKwkJYnJlYWs7CisJfQorCisJcHJpdi0+d2VwX2VuYWJsZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJaWYgKHByaXYtPndlcF9rZXlzX2xlbltpXSAhPSAwKQorCQkJcHJpdi0+d2VwX2VuYWJsZWQgPSAxOworCX0KKworCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9rZXlfbmV3Zncoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkJY29uc3QgdTggKmxvY2FsX2FkZHJlc3MsIGNvbnN0IHU4ICphZGRyZXNzLAorCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjbWQgJWQga2V5LT5hbGcgJWQga2V5LT5rZXlpZHggJWQgIgorCQkgImtleS0+a2V5bGVuICVkIiwKKwkJIF9fZnVuY19fLCBjbWQsIGtleS0+YWxnLCBrZXktPmtleWlkeCwga2V5LT5rZXlsZW4pOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfRU5DUllQVElPTjsKKworCWlmIChjbWQgPT0gRElTQUJMRV9LRVkpIHsKKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gQ0lQSEVSX0tFWV9MRU47CisJCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLAorCQkJCWNpcGhlcl9kZWZhdWx0X2tleXZhbHVlW2tleS0+a2V5aWR4XSk7CisJCW1lbXNldChwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwgMCwgQ0lQSEVSX0tFWV9MRU4pOworCQlpZiAoYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKSAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCWVsc2UgeworCisJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXIgPSBDSVBIRVJfTk9ORTsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDA7CisJCX07CisJCWlmIChwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9PSBrZXktPmtleWlkeCkKKwkJCXByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5ID0gMHhmZjsKKworCQlpZiAocHJpdi0+ZGVmYXVsdF9wYWlyd2lzZV9rZXkgPT0ga2V5LT5rZXlpZHgpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IDB4ZmY7CisJCS8qIElmIGRlZmF1bHQgcGFpcndpc2Uga2V5IGlzIHJlbW92ZWQsIGZhbGwgYmFjayB0bworCQkgKiBncm91cCBrZXk/ICovCisJCXJldCA9IDA7CisJCWdvdG8gZXhpdDsKKwl9OworCisJaWYgKGNtZCA9PSBTRVRfS0VZKSB7CisJCS8qIHN0b3JlIGtleSBpbnRvIE1JQiAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSBDSVBIRVJfS0VZX0xFTjsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJY2lwaGVyX2RlZmF1bHRfa2V5dmFsdWVba2V5LT5rZXlpZHhdKTsKKwkJbWVtc2V0KHByaXYtPm1pYl9idWYuZGF0YS5kYXRhLCAwLCBDSVBIRVJfS0VZX0xFTik7CisJCW1lbWNweShwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKworCQlzd2l0Y2ggKGtleS0+YWxnKSB7CisJCWNhc2UgQUxHX1dFUDoKKwkJCWlmIChrZXktPmtleWxlbiA9PSA1KSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDY0OworCQkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmtleWxlbiA9IDg7CisJCQl9IGVsc2UgaWYgKGtleS0+a2V5bGVuID09IDEzKSB7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0KKwkJCQkJQ0lQSEVSX1dFUDEyODsKKwkJCQkvKiBGaXJtd2FyZSBuZWVkcyB0aGlzICovCisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gODsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBleGl0OworCQkJfTsKKwkJCWJyZWFrOworCQljYXNlIEFMR19US0lQOgorCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9US0lQOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTI7CisJCQlicmVhazsKKworCQljYXNlIEFMR19DQ01QOgorCQkJaWYgKCFhdDc2X2lzXzUwNWEocHJpdi0+Ym9hcmRfdHlwZSkpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9OworCQkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9DQ01QOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzhdID0gcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gPSAxOyAvKiBUYWtlbiBmcm9tIGF0bWVsd2xhbmRyaXZlciwKKwkJCQkJCSAgICBub3QgZG9jdW1lbnRlZCAqLworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogUGFpcndpc2Uga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9QQUlSV0lTRSB8IEtFWV9UWCk7CisJCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJLyogR3JvdXAga2V5ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9UWCk7CisJCWVsc2UJLyogS2V5IHVzZWQgb25seSBmb3IgdHJhbnNtaXNzaW9uID8/PyAqLworCQkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMzldIHw9IChLRVlfVFgpOworCisJCWlmIChhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpICE9CisJCQkJQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJcmV0ID0gLUVPUE5PVFNVUFA7IC8qIC1FSU8gd291bGQgYmUgcHJvYmFibHkgYmV0dGVyICovCisJCQlnb3RvIGV4aXQ7CisJCX07CisKKwkJaWYgKChrZXktPmFsZyA9PSBBTEdfVEtJUCkgfHwgKGtleS0+YWxnID09IEFMR19DQ01QKSkKKwkJCWF0NzZfcmVzZXRfcnNjKHByaXYpOworCisJCWtleS0+aHdfa2V5X2lkeCA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBkZWZhdWx0IGtleXMgKi8KKwkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHJlc3MpKQorCQkJcHJpdi0+ZGVmYXVsdF9ncm91cF9rZXkgPSBrZXktPmtleWlkeDsKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQlwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9IGtleS0+a2V5aWR4OworCisJCS8qIFNldCB1cCBlbmNyeXB0aW9uIE1JQnMgKi8KKworCQkvKiBmaXJzdCBibG9jayBvZiBzZXR0aW5ncyAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSAzOworCQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwKKwkJCQlwcml2YWN5X2ludm9rZWQpOworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVswXSA9IDE7CS8qIHByaXZhY3lfaW52b2tlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IHByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5OworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsyXSA9IHByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5OworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBzZWNvbmQgYmxvY2sgb2Ygc2V0dGluZ3MgKi8KKwkJcHJpdi0+bWliX2J1Zi5zaXplID0gMzsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJZXhjbHVkZV91bmVuY3J5cHRlZCk7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzBdID0gMTsJLyogZXhjbHVkZV91bmVuY3J5cHRlZCAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsxXSA9IDA7CS8qIHdlcF9lbmNyeXB0aW9uX3R5cGUgKi8KKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMl0gPSAwOwkvKiBja2lwX2tleV9wZXJtdXRhdGlvbiAqLworCisJCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CisJCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkKKwkJCWdvdG8gZXhpdDsKKwkJcmV0ID0gMDsKKwl9OworZXhpdDoKKwlhdDc2X2R1bXBfbWliX21hY19lbmNyeXB0aW9uKHByaXYpOworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0NzZfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQljb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY21kICVkIGtleS0+YWxnICVkIGtleS0+a2V5aWR4ICVkICIKKwkJICJrZXktPmtleWxlbiAlZCIsCisJCSBfX2Z1bmNfXywgY21kLCBrZXktPmFsZywga2V5LT5rZXlpZHgsIGtleS0+a2V5bGVuKTsKKworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikpCisJCXJldHVybiBhdDc2X3NldF9rZXlfbmV3ZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKwllbHNlCisJCXJldHVybiBhdDc2X3NldF9rZXlfb2xkZncoaHcsIGNtZCwgbG9jYWxfYWRkcmVzcywgYWRkcmVzcywga2V5KTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgYXQ3Nl9vcHMgPSB7CisJLnR4ID0gYXQ3Nl9tYWM4MDIxMV90eCwKKwkuYWRkX2ludGVyZmFjZSA9IGF0NzZfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGF0NzZfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnID0gYXQ3Nl9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UgPSBhdDc2X2NvbmZpZ19pbnRlcmZhY2UsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBhdDc2X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnN0YXJ0ID0gYXQ3Nl9tYWM4MDIxMV9zdGFydCwKKwkuc3RvcCA9IGF0NzZfbWFjODAyMTFfc3RvcCwKKwkuaHdfc2NhbiA9IGF0NzZfaHdfc2NhbiwKKwkuc2V0X2tleSA9IGF0NzZfc2V0X2tleSwKK307CisKIC8qIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLwogc3RhdGljIHN0cnVjdCBhdDc2X3ByaXYgKmF0NzZfYWxsb2NfbmV3X2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXN0cnVjdCBhdDc2X3ByaXYgKnByaXY7Ci0JaW50IGk7CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF0NzZfcHJpdikpOwotCWlmICghbmV0ZGV2KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZ1ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IGF0NzZfcHJpdiksICZhdDc2X29wcyk7CisJaWYgKCFodykgeworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogY291bGQgbm90IHJlZ2lzdGVyIgorCQkgICAgICAgIiBpZWVlODAyMTFfaHdcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwcml2ID0gaHctPnByaXY7CisJcHJpdi0+aHcgPSBodzsKIAogCXByaXYtPnVkZXYgPSB1ZGV2OwotCXByaXYtPm5ldGRldiA9IG5ldGRldjsKIAogCW11dGV4X2luaXQoJnByaXYtPm10eCk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX2Fzc29jX2RvbmUsIGF0NzZfd29ya19hc3NvY19kb25lKTsKLQlJTklUX1dPUksoJnByaXYtPndvcmtfam9pbiwgYXQ3Nl93b3JrX2pvaW4pOwotCUlOSVRfV09SSygmcHJpdi0+d29ya19uZXdfYnNzLCBhdDc2X3dvcmtfbmV3X2Jzcyk7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4sIGF0NzZfd29ya19zdGFydF9zY2FuKTsKIAlJTklUX1dPUksoJnByaXYtPndvcmtfc2V0X3Byb21pc2MsIGF0NzZfd29ya19zZXRfcHJvbWlzYyk7CiAJSU5JVF9XT1JLKCZwcml2LT53b3JrX3N1Ym1pdF9yeCwgYXQ3Nl93b3JrX3N1Ym1pdF9yeCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX3Jlc3RhcnQsIGF0NzZfZHdvcmtfcmVzdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2dldF9zY2FuLCBhdDc2X2R3b3JrX2dldF9zY2FuKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfYmVhY29uLCBhdDc2X2R3b3JrX2JlYWNvbik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2F1dGgsIGF0NzZfZHdvcmtfYXV0aCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2Fzc29jLCBhdDc2X2R3b3JrX2Fzc29jKTsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5tZ210X3NwaW5sb2NrKTsKLQlwcml2LT5uZXh0X21nbXRfYnVsayA9IE5VTEw7Ci0JcHJpdi0+bWFjX3N0YXRlID0gTUFDX0lOSVQ7Ci0KLQkvKiBpbml0aWFsaXplIGVtcHR5IEJTUyBsaXN0ICovCi0JcHJpdi0+Y3Vycl9ic3MgPSBOVUxMOwotCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ic3NfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrKTsKLQotCWluaXRfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT5ic3NfbGlzdF90aW1lci5mdW5jdGlvbiA9IGF0NzZfYnNzX2xpc3RfdGltZW91dDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JLyogbWFyayBhbGwgcnggZGF0YSBlbnRyaWVzIGFzIHVudXNlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9SWF9EQVRBX0JVRjsgaSsrKQotCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmR3b3JrX2h3X3NjYW4sIGF0NzZfZHdvcmtfaHdfc2Nhbik7CiAKIAlwcml2LT5yeF90YXNrbGV0LmZ1bmMgPSBhdDc2X3J4X3Rhc2tsZXQ7CiAJcHJpdi0+cnhfdGFza2xldC5kYXRhID0gMDsKQEAgLTUxODMsNiArMjM3MSw5IEBACiAJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT0ZGOwogCXByaXYtPnBtX3BlcmlvZCA9IDA7CiAKKwkvKiB1bml0IHVzICovCisJcHJpdi0+aHctPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwMDA7CisKIAlyZXR1cm4gcHJpdjsKIH0KIApAQCAtNTI0NSwxMSArMjQzNiw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIGF0NzZfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMU1CSVQsIH0sCisJeyAuYml0cmF0ZSA9IDIwLCAuaHdfdmFsdWUgPSBUWF9SQVRFXzJNQklULCB9LAorCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVlID0gVFhfUkFURV81XzVNQklULCB9LAorCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IFRYX1JBVEVfMTFNQklULCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBhdDc2X2NoYW5uZWxzW10gPSB7CisJeyAuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDE3LCAuaHdfdmFsdWUgPSAyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDMyLCAuaHdfdmFsdWUgPSA1IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDM3LCAuaHdfdmFsdWUgPSA2IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQ3LCAuaHdfdmFsdWUgPSA4IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDUyLCAuaHdfdmFsdWUgPSA5IH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2MiwgLmh3X3ZhbHVlID0gMTEgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1ZSA9IDEyIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMyB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ4NCwgLmh3X3ZhbHVlID0gMTQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYXQ3Nl9zdXBwb3J0ZWRfYmFuZCA9IHsKKwkuY2hhbm5lbHMgPSBhdDc2X2NoYW5uZWxzLAorCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShhdDc2X2NoYW5uZWxzKSwKKwkuYml0cmF0ZXMgPSBhdDc2X3JhdGVzLAorCS5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShhdDc2X3JhdGVzKSwKK307CisKIC8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlIGFuZCBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLwogc3RhdGljIGludCBhdDc2X2luaXRfbmV3X2RldmljZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAogCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50ZXJmYWNlLT5kZXY7CiAJaW50IHJldDsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KQEAgLTUyNjUsMTQgKzI0ODcsMTEgQEAKIAkvKiBNQUMgYWRkcmVzcyAqLwogCXJldCA9IGF0NzZfZ2V0X2h3X2NvbmZpZyhwcml2KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmaW50ZXJmYWNlLT5kZXYsCi0JCQkgICAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBNQUMgYWRkcmVzc1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlwcml2LT5kb21haW4gPSBhdDc2X2dldF9yZWdfZG9tYWluKHByaXYtPnJlZ3VsYXRvcnlfZG9tYWluKTsKLQkvKiBpbml0LiBuZXRkZXYtPmRldl9hZGRyICovCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlwcml2LT5jaGFubmVsID0gREVGX0NIQU5ORUw7CiAJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CkBAIC01MjgyLDQ3ICsyNTAxLDU0IEBACiAJcHJpdi0+dHhyYXRlID0gVFhfUkFURV9BVVRPOwogCXByaXYtPnByZWFtYmxlX3R5cGUgPSBQUkVBTUJMRV9UWVBFX0xPTkc7CiAJcHJpdi0+YmVhY29uX3BlcmlvZCA9IDEwMDsKLQlwcml2LT5iZWFjb25zX2xhc3RfcXVhbCA9IGppZmZpZXM7CiAJcHJpdi0+YXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CiAJcHJpdi0+c2Nhbl9taW5fdGltZSA9IERFRl9TQ0FOX01JTl9USU1FOwogCXByaXYtPnNjYW5fbWF4X3RpbWUgPSBERUZfU0NBTl9NQVhfVElNRTsKIAlwcml2LT5zY2FuX21vZGUgPSBTQ0FOX1RZUEVfQUNUSVZFOworCXByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5ID0gMHhmZjsKKwlwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9IDB4ZmY7CiAKLQluZXRkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBub3QgeWV0IG9yIG5ldmVyICovCi0JbmV0ZGV2LT5vcGVuID0gYXQ3Nl9vcGVuOwotCW5ldGRldi0+c3RvcCA9IGF0NzZfc3RvcDsKLQluZXRkZXYtPmdldF9zdGF0cyA9IGF0NzZfZ2V0X3N0YXRzOwotCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmYXQ3Nl9ldGh0b29sX29wczsKKwkvKiBtYWM4MDIxMSBpbml0aWFsaXNhdGlvbiAqLworCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXQ3Nl9zdXBwb3J0ZWRfYmFuZDsKIAotCS8qIEFkZCBwb2ludGVycyB0byBlbmFibGUgaXdzcHkgc3VwcG9ydC4gKi8KLQlwcml2LT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJnByaXYtPnNweV9kYXRhOwotCW5ldGRldi0+d2lyZWxlc3NfZGF0YSA9ICZwcml2LT53aXJlbGVzc19kYXRhOworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikgJiYKKwkJKGF0NzZfaXNfNTAzcmZtZChwcml2LT5ib2FyZF90eXBlKSB8fAorCQkgYXQ3Nl9pc181MDUocHJpdi0+Ym9hcmRfdHlwZSkpKQorCQlwcml2LT5ody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQzsKKwllbHNlCisJCXByaXYtPmh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19SWF9JTkNMVURFU19GQ1MgfAorCQkJCSAgSUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUM7CiAKLQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGF0NzZfdHg7Ci0JbmV0ZGV2LT50eF90aW1lb3V0ID0gYXQ3Nl90eF90aW1lb3V0OwotCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7Ci0JbmV0ZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZhdDc2X2hhbmRsZXJfZGVmOwotCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYXQ3Nl9zZXRfbXVsdGljYXN0OwotCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gYXQ3Nl9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2X2FsbG9jX25hbWUobmV0ZGV2LCAid2xhbiVkIik7CisJcHJpdi0+aHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7CiAKLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKKwlTRVRfSUVFRTgwMjExX0RFVihwcml2LT5odywgJmludGVyZmFjZS0+ZGV2KTsKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihwcml2LT5odywgcHJpdi0+bWFjX2FkZHIpOworCisJcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgcmVnaXN0ZXIgbmV0ZGV2aWNlIChzdGF0dXMgJWQpIVxuIiwgcmV0KTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgbWFjODAyMTEgaHcgKHN0YXR1cyAlZCkhXG4iLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQotCXByaXYtPm5ldGRldl9yZWdpc3RlcmVkID0gMTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBVU0IgJXMsIE1BQyAlcywgZmlybXdhcmUgJWQuJWQuJWQtJWRcbiIsCi0JICAgICAgIG5ldGRldi0+bmFtZSwgaW50ZXJmYWNlLT5kZXYuYnVzX2lkLCBtYWMyc3RyKHByaXYtPm1hY19hZGRyKSwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKLQkgICAgICAgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ3VsYXRvcnkgZG9tYWluIDB4JTAyeDogJXNcbiIsIG5ldGRldi0+bmFtZSwKLQkgICAgICAgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CiAKLQkvKiB3ZSBsZXQgdGhpcyB0aW1lciBydW4gdGhlIHdob2xlIHRpbWUgdGhpcyBkcml2ZXIgaW5zdGFuY2UgbGl2ZXMgKi8KLQltb2RfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyLCBqaWZmaWVzICsgQlNTX0xJU1RfVElNRU9VVCk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFVTQiAlcywgTUFDICVzLCBmaXJtd2FyZSAlZC4lZC4lZC0lZFxuIiwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKKwkJIGRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksIG1hYzJzdHIocHJpdi0+bWFjX2FkZHIpLAorCQkgcHJpdi0+ZndfdmVyc2lvbi5tYWpvciwgcHJpdi0+ZndfdmVyc2lvbi5taW5vciwKKwkJIHByaXYtPmZ3X3ZlcnNpb24ucGF0Y2gsIHByaXYtPmZ3X3ZlcnNpb24uYnVpbGQpOworCWRldl9pbmZvKGRldiwgIiVzOiByZWd1bGF0b3J5IGRvbWFpbiAweCUwMng6ICVzXG4iLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgcHJpdi0+cmVndWxhdG9yeV9kb21haW4sIHByaXYtPmRvbWFpbi0+bmFtZSk7CisJZGV2X2luZm8oZGV2LCAiJXM6IFdQQSBzdXBwb3J0OiAiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOworCWlmICghRklSTVdBUkVfSVNfV1BBKHByaXYtPmZ3X3ZlcnNpb24pKQorCQlwcmludGsoIm5vbmVcbiIpOworCWVsc2UgeworCQlpZiAoIWF0NzZfaXNfNTA1YShwcml2LT5ib2FyZF90eXBlKSkKKwkJCXByaW50aygiVEtJUFxuIik7CisJCWVsc2UKKwkJCXByaW50aygiVEtJUCwgQUVTL0NDTVBcbiIpOworCX07CiAKIGV4aXQ6CiAJcmV0dXJuIHJldDsKQEAgLTUzMzAsMTUgKzI1NTYsMTMgQEAKIAogc3RhdGljIHZvaWQgYXQ3Nl9kZWxldGVfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7Ci0JaW50IGk7Ci0KIAlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzOiBFTlRFUiIsIF9fZnVuY19fKTsKIAogCS8qIFRoZSBkZXZpY2UgaXMgZ29uZSwgZG9uJ3QgYm90aGVyIHR1cm5pbmcgaXQgb2ZmICovCiAJcHJpdi0+ZGV2aWNlX3VucGx1Z2dlZCA9IDE7CiAKLQlpZiAocHJpdi0+bmV0ZGV2X3JlZ2lzdGVyZWQpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPm5ldGRldik7CisJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCisJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKIAogCS8qIGFzc3VtaW5nIHdlIHVzZWQga2V2ZW50ZCwgaXQgbXVzdCBxdWllc2NlIHRvbyAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CkBAIC01MzU5LDI1ICsyNTgzLDExIEBACiAJaWYgKHByaXYtPnJ4X3NrYikKIAkJa2ZyZWVfc2tiKHByaXYtPnJ4X3NrYik7CiAKLQlhdDc2X2ZyZWVfYnNzX2xpc3QocHJpdik7Ci0JZGVsX3RpbWVyX3N5bmMoJnByaXYtPmJzc19saXN0X3RpbWVyKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2Nhbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpCi0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JYX0RBVEFfQlVGOyBpKyspCi0JCWlmIChwcml2LT5yeF9kYXRhW2ldLnNrYikgewotCQkJZGV2X2tmcmVlX3NrYihwcml2LT5yeF9kYXRhW2ldLnNrYik7Ci0JCQlwcml2LT5yeF9kYXRhW2ldLnNrYiA9IE5VTEw7Ci0JCX0KIAl1c2JfcHV0X2Rldihwcml2LT51ZGV2KTsKIAotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IGJlZm9yZSBmcmVlaW5nIHByaXYvbmV0ZGV2IiwgX19mdW5jX18pOwotCWZyZWVfbmV0ZGV2KHByaXYtPm5ldGRldik7CS8qIHByaXYgaXMgaW4gbmV0ZGV2ICovCisJYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlczogYmVmb3JlIGZyZWVpbmcgcHJpdi9pZWVlODAyMTFfaHciLAorCQkgX19mdW5jX18pOworCWllZWU4MDIxMV9mcmVlX2h3KHByaXYtPmh3KTsKIAogCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IEVYSVQiLCBfX2Z1bmNfXyk7CiB9CkBAIC01NDExLDggKzI2MjEsOCBAQAogCSAgIHdlIGdldCAyMDQgd2l0aCAyLjQuMjMsIEZpYmVybGluZSBGTC1XTDI0MHUgKDUwNUErUkZNRDI5NTgpID8/PyAqLwogCiAJaWYgKG9wX21vZGUgPT0gT1BNT0RFX0hXX0NPTkZJR19NT0RFKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgaGFuZGxlIGEgZGV2aWNlIGluIEhXX0NPTkZJR19NT0RFXG4iKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkiY2Fubm90IGhhbmRsZSBhIGRldmljZSBpbiBIV19DT05GSUdfTU9ERVxuIik7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC01NDIwLDEzICsyNjMwLDEyIEBACiAJaWYgKG9wX21vZGUgIT0gT1BNT0RFX05PUk1BTF9OSUNfV0lUSF9GTEFTSAogCSAgICAmJiBvcF9tb2RlICE9IE9QTU9ERV9OT1JNQUxfTklDX1dJVEhPVVRfRkxBU0gpIHsKIAkJLyogZG93bmxvYWQgaW50ZXJuYWwgZmlybXdhcmUgcGFydCAqLwotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIpOwogCQlyZXQgPSBhdDc2X2xvYWRfaW50ZXJuYWxfZncodWRldiwgZndlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZG93bmxvYWRpbmcgaW50ZXJuYWwgZmlybXdhcmVcbiIsCi0JCQkJICAgcmV0KTsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJlcnJvciAlZCBkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIiwKKwkJCQlyZXQpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQl1c2JfcHV0X2Rldih1ZGV2KTsKQEAgLTU0NTEsOCArMjY2MCw3IEBACiAJCW5lZWRfZXh0X2Z3ID0gMTsKIAogCWlmIChuZWVkX2V4dF9mdykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJkb3dubG9hZGluZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CisJCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiZG93bmxvYWRpbmcgZXh0ZXJuYWwgZmlybXdhcmVcbiIpOwogCiAJCXJldCA9IGF0NzZfbG9hZF9leHRlcm5hbF9mdyh1ZGV2LCBmd2UpOwogCQlpZiAocmV0KQpAQCAtNTQ2MSw4ICsyNjY5LDggQEAKIAkJLyogUmUtY2hlY2sgZmlybXdhcmUgdmVyc2lvbiAqLwogCQlyZXQgPSBhdDc2X2dldF9taWIodWRldiwgTUlCX0ZXX1ZFUlNJT04sICZmd3YsIHNpemVvZihmd3YpKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCQkgICAiZXJyb3IgJWQgZ2V0dGluZyBmaXJtd2FyZSB2ZXJzaW9uXG4iLCByZXQpOworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImVycm9yICVkIGdldHRpbmcgZmlybXdhcmUgdmVyc2lvblxuIiwgcmV0KTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CkBAIC01NDczLDcgKzI2ODEsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCVNFVF9ORVRERVZfREVWKHByaXYtPm5ldGRldiwgJmludGVyZmFjZS0+ZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcHJpdik7CiAKIAltZW1jcHkoJnByaXYtPmZ3X3ZlcnNpb24sICZmd3YsIHNpemVvZihzdHJ1Y3QgbWliX2Z3X3ZlcnNpb24pKTsKQEAgLTU1MDEsNyArMjcwOCw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGlzY29ubmVjdGluZ1xuIiwgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpKTsKIAlhdDc2X2RlbGV0ZV9kZXZpY2UocHJpdik7CiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZpbnRlcmZhY2UtPmRldiwgImRpc2Nvbm5lY3RlZFxuIik7CiB9CkBAIC01NTU3LDUgKzI3NjQsOCBAQAogTU9EVUxFX0FVVEhPUigiTmljayBKb25lcyIpOwogTU9EVUxFX0FVVEhPUigiQmFsaW50IFNlZWJlciA8bjBfNXA0bV9wMTM0NTNAaG90bWFpbC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIpOworTU9EVUxFX0FVVEhPUigiR3VpZG8gR3VlbnRoZXIgPGFneEBzaWd4Y3B1Lm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkthbGxlIFZhbG8gPGthbGxlLnZhbG9AaWtpLmZpPiIpOworTU9EVUxFX0FVVEhPUigiTWlsYW4gUGx6aWsgPG1pbGFuLnBsemlrQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCmluZGV4IGIyMGJlOWQuLjhiYjM1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oCkBAIC0zNCwyMyArMzQsNiBAQAogCUJPQVJEXzUwNUFNWCA9IDgKIH07CiAKLS8qIG91ciBwcml2YXRlIGlvY3RsJ3MgKi8KLS8qIHByZWFtYmxlIGxlbmd0aCAoMCAtIGxvbmcsIDEgLSBzaG9ydCwgMiAtIGF1dG8pICovCi0jZGVmaW5lIEFUNzZfU0VUX1NIT1JUX1BSRUFNQkxFCQkoU0lPQ0lXRklSU1RQUklWICsgMCkKLSNkZWZpbmUgQVQ3Nl9HRVRfU0hPUlRfUFJFQU1CTEUJCShTSU9DSVdGSVJTVFBSSVYgKyAxKQotLyogd2hpY2ggZGVidWcgY2hhbm5lbHMgYXJlIGVuYWJsZWQgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMikKLSNkZWZpbmUgQVQ3Nl9HRVRfREVCVUcJCQkoU0lPQ0lXRklSU1RQUklWICsgMykKLS8qIHBvd2VyIHNhdmUgbW9kZSAoaW5jbC4gdGhlIEF0bWVsIHByb3ByaWV0YXJ5IHNtYXJ0IHNhdmUgbW9kZSkgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUJCShTSU9DSVdGSVJTVFBSSVYgKyA0KQotI2RlZmluZSBBVDc2X0dFVF9QT1dFUlNBVkVfTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDUpCi0vKiBtaW4gYW5kIG1heCBjaGFubmVsIHRpbWVzIGZvciBzY2FuICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fVElNRVMJCShTSU9DSVdGSVJTVFBSSVYgKyA2KQotI2RlZmluZSBBVDc2X0dFVF9TQ0FOX1RJTUVTCQkoU0lPQ0lXRklSU1RQUklWICsgNykKLS8qIHNjYW4gbW9kZSAoMCAtIGFjdGl2ZSwgMSAtIHBhc3NpdmUpICovCi0jZGVmaW5lIEFUNzZfU0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDgpCi0jZGVmaW5lIEFUNzZfR0VUX1NDQU5fTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDkpCi0KICNkZWZpbmUgQ01EX1NUQVRVU19JRExFCQkJCTB4MDAKICNkZWZpbmUgQ01EX1NUQVRVU19DT01QTEVURQkJCTB4MDEKICNkZWZpbmUgQ01EX1NUQVRVU19VTktOT1dOCQkJMHgwMgpAQCAtODIsNiArNjUsNyBAQAogI2RlZmluZSBNSUJfTUFDCQkJMHgwMwogI2RlZmluZSBNSUJfTUFDX01HTVQJCTB4MDUKICNkZWZpbmUgTUlCX01BQ19XRVAJCTB4MDYKKyNkZWZpbmUgTUlCX01BQ19FTkNSWVBUSU9OCTB4MDYKICNkZWZpbmUgTUlCX1BIWQkJCTB4MDcKICNkZWZpbmUgTUlCX0ZXX1ZFUlNJT04JCTB4MDgKICNkZWZpbmUgTUlCX01ET01BSU4JCTB4MDkKQEAgLTEwNiw2ICs5MCwyNiBAQAogI2RlZmluZSBBVDc2X1BNX09OCQkyCiAjZGVmaW5lIEFUNzZfUE1fU01BUlQJCTMKIAorLyogY2lwaGVyIHZhbHVlcyBmb3IgZW5jcnlwdGlvbiBrZXlzICovCisjZGVmaW5lIENJUEhFUl9OT05FCQkwCS8qIHRoaXMgdmFsdWUgaXMgb25seSBndWVzc2VkICovCisjZGVmaW5lIENJUEhFUl9XRVA2NAkJMQorI2RlZmluZSBDSVBIRVJfVEtJUAkJMgorI2RlZmluZSBDSVBIRVJfQ0NNUAkJMworI2RlZmluZSBDSVBIRVJfQ0NYCQk0CS8qIGZvciBjb25zaXN0ZW5jeSBzYWtlIG9ubHkgKi8KKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOAkJNQorCisvKiBiaXQgZmxhZ3Mga2V5IHR5cGVzIGZvciBlbmNyeXB0aW9uIGtleXMgKi8KKyNkZWZpbmUgS0VZX1BBSVJXSVNFCQkyCisjZGVmaW5lIEtFWV9UWAkJCTQKKworI2RlZmluZSBDSVBIRVJfS0VZUwkJKDQpCisjZGVmaW5lIENJUEhFUl9LRVlfTEVOCQkoNDApCisKK3N0cnVjdCBrZXlfY29uZmlnIHsKKwl1OCBjaXBoZXI7CisJdTgga2V5bGVuOworfTsKKwogc3RydWN0IGh3Y2ZnX3I1MDUgewogCXU4IGNyMzlfdmFsdWVzWzE0XTsKIAl1OCByZXNlcnZlZDFbMTRdOwpAQCAtMTQ3LDYgKzE1MSw5IEBACiAKICNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4JKDQwIC8gOCkKICNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4JKDEwNCAvIDgpCisjZGVmaW5lIFdFUF9LRVlTCQkoNCkKKworCiAKIHN0cnVjdCBhdDc2X2NhcmRfY29uZmlnIHsKIAl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOwpAQCAtMTYxLDcgKzE2OCw3IEBACiAJdTggcHJpdmFjeV9pbnZva2VkOwogCXU4IHdlcF9kZWZhdWx0X2tleV9pZDsJLyogMC4uMyAqLwogCXU4IGN1cnJlbnRfc3NpZFszMl07Ci0JdTggd2VwX2RlZmF1bHRfa2V5X3ZhbHVlWzRdW1dFUF9LRVlfTEVOXTsKKwl1OCB3ZXBfZGVmYXVsdF9rZXlfdmFsdWVbNF1bV0VQX0xBUkdFX0tFWV9MRU5dOwogCXU4IHNzaWRfbGVuOwogCXU4IHNob3J0X3ByZWFtYmxlOwogCV9fbGUxNiBiZWFjb25fcGVyaW9kOwpAQCAtMTg2LDcgKzE5Myw3IEBACiAJdTggbGlua19xdWFsaXR5OwogCXU4IG5vaXNlX2xldmVsOwogCV9fbGUzMiByeF90aW1lOwotCXU4IHBhY2tldFtJRUVFODAyMTFfRlJBTUVfTEVOICsgSUVFRTgwMjExX0ZDU19MRU5dOworCXU4IHBhY2tldFtJRUVFODAyMTFfTUFYX0ZSQUdfVEhSRVNIT0xEXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIExlbmd0aCBvZiBBdG1lbC1zcGVjaWZpYyBUeCBoZWFkZXIgYmVmb3JlIDgwMi4xMSBmcmFtZSAqLwpAQCAtMTk2LDggKzIwMywxMSBAQAogCV9fbGUxNiB3bGVuZ3RoOwogCXU4IHR4X3JhdGU7CiAJdTggcGFkZGluZzsKLQl1OCByZXNlcnZlZFs0XTsKLQl1OCBwYWNrZXRbSUVFRTgwMjExX0ZSQU1FX0xFTiArIElFRUU4MDIxMV9GQ1NfTEVOXTsKKwl1OCBrZXlfaWQ7CisJdTggY2lwaGVyX3R5cGU7CisJdTggY2lwaGVyX2xlbmd0aDsKKwl1OCByZXNlcnZlZDsKKwl1OCBwYWNrZXRbSUVFRTgwMjExX01BWF9GUkFHX1RIUkVTSE9MRF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBkZWZpbmVzIGZvciBzY2FuX3R5cGUgYmVsb3cgKi8KQEAgLTI0NCw2ICsyNTQsNyBAQAogCQl1OCBieXRlOwogCQlfX2xlMTYgd29yZDsKIAkJdTggYWRkcltFVEhfQUxFTl07CisJCXU4IGRhdGFbMjU2XTsJLyogd2UgbmVlZCBtb3JlIHNwYWNlIGZvciBtaWJfbWFjX2VuY3J5cHRpb24gKi8KIAl9IGRhdGE7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCkBAIC0zMTcsMTAgKzMyOCwyNCBAQAogCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CiAJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CiAJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKLQl1OCB3ZXBfZGVmYXVsdF9rZXl2YWx1ZVtXRVBfS0VZU11bV0VQX0tFWV9MRU5dOworCXU4IHdlcF9kZWZhdWx0X2tleXZhbHVlW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CiAJdTggZW5jcnlwdGlvbl9sZXZlbDsJLyogMSBmb3IgNDBiaXQsIDIgZm9yIDEwNGJpdCBlbmNyeXB0aW9uICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCitzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uIHsKKwl1OCBjaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtDSVBIRVJfS0VZU11bQ0lQSEVSX0tFWV9MRU5dOworCXU4IHRraXBfYnNzaWRbNl07CisJdTggcHJpdmFjeV9pbnZva2VkOworCXU4IGNpcGhlcl9kZWZhdWx0X2tleV9pZDsKKwl1OCBjaXBoZXJfZGVmYXVsdF9ncm91cF9rZXlfaWQ7CisJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwl1OCB3ZXBfZW5jcnlwdGlvbl90eXBlOworCXU4IGNraXBfa2V5X3Blcm11dGF0aW9uOwkvKiBib29sICovCisJX19sZTMyIHdlcF9pY3ZfZXJyb3JfY291bnQ7CisJX19sZTMyIHdlcF9leGNsdWRlZF9jb3VudDsKKwl1OCBrZXlfcnNjW0NJUEhFUl9LRVlTXVs4XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKIHN0cnVjdCBtaWJfcGh5IHsKIAlfX2xlMzIgZWRfdGhyZXNob2xkOwogCkBAIC0zNjQsMTYgKzM4OSw2IEBACiAJX19sZTMyIGV4dF9md19sZW47CS8qIGV4dGVybmFsIGZpcm13YXJlIGltYWdlIGxlbmd0aCAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotZW51bSBtYWNfc3RhdGUgewotCU1BQ19JTklULAotCU1BQ19TQ0FOTklORywKLQlNQUNfQVVUSCwKLQlNQUNfQVNTT0MsCi0JTUFDX0pPSU5JTkcsCi0JTUFDX0NPTk5FQ1RFRCwKLQlNQUNfT1dOX0lCU1MKLX07Ci0KIC8qIGEgZGVzY3JpcHRpb24gb2YgYSByZWd1bGF0b3J5IGRvbWFpbiBhbmQgdGhlIGFsbG93ZWQgY2hhbm5lbHMgKi8KIHN0cnVjdCByZWdfZG9tYWluIHsKIAl1MTYgY29kZTsKQEAgLTM4MSw0NyArMzk2LDYgQEAKIAl1MzIgY2hhbm5lbF9tYXA7CS8qIGlmIGJpdCBOIGlzIHNldCwgY2hhbm5lbCAoTisxKSBpcyBhbGxvd2VkICovCiB9OwogCi0vKiBob3cgbG9uZyBkbyB3ZSBrZWVwIGEgKEkpQlNTIGluIHRoZSBic3NfbGlzdCBpbiBqaWZmaWVzCi0gICB0aGlzIHNob3VsZCBiZSBsb25nIGVub3VnaCBmb3IgdGhlIHVzZXIgdG8gcmV0cmlldmUgdGhlIHRhYmxlCi0gICAoYnkgaXdsaXN0ID8pIGFmdGVyIHRoZSBkZXZpY2Ugc3RhcnRlZCwgYmVjYXVzZSBhbGwgZW50cmllcyBmcm9tCi0gICBvdGhlciBjaGFubmVscyB0aGFuIHRoZSBvbmUgdGhlIGRldmljZSBsb2NrcyBvbiBnZXQgcmVtb3ZlZCwgdG9vICovCi0jZGVmaW5lIEJTU19MSVNUX1RJTUVPVVQJKDEyMCAqIEhaKQotLyogc3RydWN0IHRvIHN0b3JlIEJTUyBpbmZvIGZvdW5kIGR1cmluZyBzY2FuICovCi0jZGVmaW5lIEJTU19MSVNUX01BWF9SQVRFX0xFTgkzMgkvKiAzMiByYXRlcyBzaG91bGQgYmUgZW5vdWdoIC4uLiAqLwotCi1zdHJ1Y3QgYnNzX2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogYnNzaWQgKi8KLQl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFXTsJLyogZXNzaWQgKi8KLQl1OCBzc2lkX2xlbjsJCS8qIGxlbmd0aCBvZiBzc2lkIGFib3ZlICovCi0JdTggY2hhbm5lbDsKLQl1MTYgY2FwYTsJCS8qIEJTUyBjYXBhYmlsaXRpZXMgKi8KLQl1MTYgYmVhY29uX2ludGVydmFsOwkvKiBiZWFjb24gaW50ZXJ2YWwsIEt1cyAoMTAyNCBtaWNyb3NlY29uZHMpICovCi0JdTggcmF0ZXNbQlNTX0xJU1RfTUFYX1JBVEVfTEVOXTsJLyogc3VwcG9ydGVkIHJhdGVzIGluIHVuaXRzIG9mCi0JCQkJCQkgICA1MDAga2JwcywgT1JlZCB3aXRoIDB4ODAgZm9yCi0JCQkJCQkgICBiYXNpYyByYXRlcyAqLwotCXU4IHJhdGVzX2xlbjsKLQotCS8qIHF1YWxpdHkgb2YgcmVjZWl2ZWQgYmVhY29uICovCi0JdTggcnNzaTsKLQl1OCBsaW5rX3F1YWw7Ci0JdTggbm9pc2VfbGV2ZWw7Ci0KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIHRpbWUgKGppZmZpZXMpIG9mIGxhc3QgYmVhY29uIHJlY2VpdmVkICovCi19OwotCi0vKiBhIHJ4IGRhdGEgYnVmZmVyIHRvIGNvbGxlY3QgcnggZnJhZ21lbnRzICovCi1zdHJ1Y3QgcnhfZGF0YV9idWYgewotCXU4IHNlbmRlcltFVEhfQUxFTl07CS8qIHNlbmRlciBhZGRyZXNzICovCi0JdTE2IHNlcW5yOwkJLyogc2VxdWVuY2UgbnVtYmVyICovCi0JdTE2IGZyYWducjsJCS8qIGxhc3QgZnJhZ21lbnQgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3Rfcng7CS8qIGppZmZpZXMgb2YgbGFzdCByeCAqLwotCXN0cnVjdCBza19idWZmICpza2I7CS8qID09IE5VTEwgaWYgZW50cnkgaXMgZnJlZSAqLwotfTsKLQotI2RlZmluZSBOUl9SWF9EQVRBX0JVRgkJOAotCiAvKiBEYXRhIGZvciBvbmUgbG9hZGVkIGZpcm13YXJlIGZpbGUgKi8KIHN0cnVjdCBmd2VudHJ5IHsKIAljb25zdCBjaGFyICpjb25zdCBmd25hbWU7CkBAIC00MzgsMTEgKzQxMiw5IEBACiAKIHN0cnVjdCBhdDc2X3ByaXYgewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiBVU0IgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0IGRldmljZSBzdGF0cyAqLwotCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsJLyogd2lyZWxlc3Mgc3RhdHMgKi8KIAogCXN0cnVjdCBza19idWZmICpyeF9za2I7CS8qIHNrYnVmZiBmb3IgcmVjZWl2aW5nIGRhdGEgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwkvKiBza2J1ZmYgZm9yIHRyYW5zbWl0dGluZyBkYXRhICovCiAJdm9pZCAqYnVsa19vdXRfYnVmZmVyOwkvKiBidWZmZXIgZm9yIHNlbmRpbmcgZGF0YSAqLwogCiAJc3RydWN0IHVyYiAqdHhfdXJiOwkvKiBVUkIgZm9yIHNlbmRpbmcgZGF0YSAqLwpAQCAtNDU0LDI2ICs0MjYsMTcgQEAKIAlzdHJ1Y3QgbXV0ZXggbXR4OwkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLwogCiAJLyogd29yayBxdWV1ZXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19hc3NvY19kb25lOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2pvaW47Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfbmV3X2JzczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19zdGFydF9zY2FuOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3NldF9wcm9taXNjOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3N1Ym1pdF9yeDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX3Jlc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19nZXRfc2NhbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2JlYWNvbjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2F1dGg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29ya19hc3NvYzsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2h3X3NjYW47CiAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFza2xldDsKIAogCS8qIHRoZSBXRVAgc3R1ZmYgKi8KIAlpbnQgd2VwX2VuYWJsZWQ7CS8qIDEgaWYgV0VQIGlzIGVuYWJsZWQgKi8KIAlpbnQgd2VwX2tleV9pZDsJCS8qIGtleSBpZCB0byBiZSB1c2VkICovCi0JdTggd2VwX2tleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsJLyogdGhlIGZvdXIgV0VQIGtleXMsCi0JCQkJCQkgICA1IG9yIDEzIGJ5dGVzIGFyZSB1c2VkICovCi0JdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogdGhlIGxlbmd0aCBvZiB0aGUgYWJvdmUga2V5cyAqLworCXU4IHdlcF9rZXlzW1dFUF9LRVlTXVtXRVBfTEFSR0VfS0VZX0xFTl07CS8qIFdFUCBrZXlzICovCisJdTggd2VwX2tleXNfbGVuW1dFUF9LRVlTXTsJLyogbGVuZ3RoIG9mIFdFUCBrZXlzICovCiAKIAlpbnQgY2hhbm5lbDsKIAlpbnQgaXdfbW9kZTsKQEAgLTQ5NSw0NCArNDU4LDEzIEBACiAJaW50IHNjYW5fbW9kZTsJCS8qIFNDQU5fVFlQRV9BQ1RJVkUsIFNDQU5fVFlQRV9QQVNTSVZFICovCiAJaW50IHNjYW5fbmVlZF9hbnk7CS8qIGlmIHNldCwgbmVlZCB0byBzY2FuIGZvciBhbnkgRVNTSUQgKi8KIAotCS8qIHRoZSBsaXN0IHdlIGdvdCBmcm9tIHNjYW5uaW5nICovCi0Jc3BpbmxvY2tfdCBic3NfbGlzdF9zcGlubG9jazsJLyogcHJvdGVjdHMgYnNzX2xpc3Qgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYnNzX2xpc3Q7CS8qIGxpc3Qgb2YgQlNTIHdlIGdvdCBiZWFjb25zIGZyb20gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBic3NfbGlzdF90aW1lcjsJLyogdGltZXIgdG8gcHVyZ2Ugb2xkIGVudHJpZXMKLQkJCQkJCSAgIGZyb20gYnNzX2xpc3QgKi8KLQlzdHJ1Y3QgYnNzX2luZm8gKmN1cnJfYnNzOwkvKiBjdXJyZW50IEJTUyAqLwogCXUxNiBhc3NvY19pZDsJCS8qIGN1cnJlbnQgYXNzb2NpYXRpb24gSUQsIGlmIGFzc29jaWF0ZWQgKi8KIAotCXU4IHdhbnRlZF9ic3NpZFtFVEhfQUxFTl07Ci0JaW50IHdhbnRlZF9ic3NpZF92YWxpZDsJLyogIT0gMCBpZiB3YW50ZWRfYnNzaWQgaXMgdG8gYmUgdXNlZCAqLwotCi0JLyogc29tZSBkYXRhIGZvciBpbmZyYXN0cnVjdHVyZSBtb2RlIG9ubHkgKi8KLQlzcGlubG9ja190IG1nbXRfc3BpbmxvY2s7CS8qIHRoaXMgc3BpbmxvY2sgcHJvdGVjdHMgYWNjZXNzIHRvCi0JCQkJCSAgIG5leHRfbWdtdF9idWxrICovCi0KLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKm5leHRfbWdtdF9idWxrOwkvKiBwZW5kaW5nIG1hbmFnZW1lbnQgbXNnIHRvCi0JCQkJCQkgICBzZW5kIHZpYSBidWxrIG91dCAqLwotCWVudW0gbWFjX3N0YXRlIG1hY19zdGF0ZTsKLQllbnVtIHsKLQkJU0NBTl9JRExFLAotCQlTQ0FOX0lOX1BST0dSRVNTLAotCQlTQ0FOX0NPTVBMRVRFRAotCX0gc2Nhbl9zdGF0ZTsKLQl0aW1lX3QgbGFzdF9zY2FuOwotCi0JaW50IHJldHJpZXM7CQkvKiByZW1haW5pbmcgcmV0cmllcyBpbiBjYXNlIG9mIHRpbWVvdXQgd2hlbgotCQkJCSAqIHNlbmRpbmcgQXV0aFJlcSBvciBBc3NvY1JlcSAqLwogCXU4IHBtX21vZGU7CQkvKiBwb3dlciBtYW5hZ2VtZW50IG1vZGUgKi8KIAl1MzIgcG1fcGVyaW9kOwkJLyogcG93ZXIgbWFuYWdlbWVudCBwZXJpb2QgaW4gbWljcm9zZWNvbmRzICovCiAKIAlzdHJ1Y3QgcmVnX2RvbWFpbiBjb25zdCAqZG9tYWluOwkvKiByZWcgZG9tYWluIGRlc2NyaXB0aW9uICovCiAKLQkvKiBpd3NweSBzdXBwb3J0ICovCi0Jc3BpbmxvY2tfdCBzcHlfc3BpbmxvY2s7Ci0Jc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOwotCi0Jc3RydWN0IGl3X3B1YmxpY19kYXRhIHdpcmVsZXNzX2RhdGE7Ci0KIAkvKiBUaGVzZSBmaWVsZHMgY29udGFpbiBIVyBjb25maWcgcHJvdmlkZWQgYnkgdGhlIGRldmljZSAobm90IGFsbCBvZgogCSAqIHRoZXNlIGZpZWxkcyBhcmUgdXNlZCBieSBhbGwgYm9hcmQgdHlwZXMpICovCiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwpAQCAtNTQwLDkgKzQ3Miw2IEBACiAKIAlzdHJ1Y3QgYXQ3Nl9jYXJkX2NvbmZpZyBjYXJkX2NvbmZpZzsKIAotCS8qIHN0b3JlIHJ4IGZyYWdtZW50cyB1bnRpbCBjb21wbGV0ZSAqLwotCXN0cnVjdCByeF9kYXRhX2J1ZiByeF9kYXRhW05SX1JYX0RBVEFfQlVGXTsKLQogCWVudW0gYm9hcmRfdHlwZSBib2FyZF90eXBlOwogCXN0cnVjdCBtaWJfZndfdmVyc2lvbiBmd192ZXJzaW9uOwogCkBAIC01NTAsNTggKzQ3OSwyMCBAQAogCXVuc2lnbmVkIGludCBuZXRkZXZfcmVnaXN0ZXJlZDoxOwogCXN0cnVjdCBzZXRfbWliX2J1ZmZlciBtaWJfYnVmOwkvKiBnbG9iYWwgYnVmZmVyIGZvciBzZXRfbWliIGNhbGxzICovCiAKLQkvKiBiZWFjb24gY291bnRpbmcgKi8KIAlpbnQgYmVhY29uX3BlcmlvZDsJLyogcGVyaW9kIG9mIG1nbXQgYmVhY29ucywgS3VzICovCi0JaW50IGJlYWNvbnNfcmVjZWl2ZWQ7Ci0JdW5zaWduZWQgbG9uZyBiZWFjb25zX2xhc3RfcXVhbDsJLyogdGltZSB3ZSByZXN0YXJ0ZWQgY291bnRpbmcKLQkJCQkJCSAgIGJlYWNvbnMgKi8KKworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCWludCBtYWM4MDIxMV9yZWdpc3RlcmVkOworCisJc3RydWN0IGtleV9jb25maWcga2V5c1s0XTsJLyogaW5zdGFsbGVkIGtleSB0eXBlcyAqLworCXU4IGRlZmF1bHRfcGFpcndpc2Vfa2V5OworCXU4IGRlZmF1bHRfZ3JvdXBfa2V5OwogfTsKIAotc3RydWN0IGF0NzZfcnhfcmFkaW90YXAgewotCXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHJ0X2hkcjsKLQlfX2xlNjQgcnRfdHNmdDsKLQl1OCBydF9mbGFnczsKLQl1OCBydF9yYXRlOwotCXM4IHJ0X3NpZ25hbDsKLQlzOCBydF9ub2lzZTsKLX07CisjZGVmaW5lIEFUNzZfU1VQUE9SVEVEX0ZJTFRFUlMgRklGX1BST01JU0NfSU5fQlNTCiAKLSNkZWZpbmUgQVQ3Nl9SWF9SQURJT1RBUF9QUkVTRU5UCQkgIFwKLQkoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpCQl8IFwKLQkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkJCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwpCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSkpCi0KLSNkZWZpbmUgQkVBQ09OX01BWF9EQVRBX0xFTkdUSAkxNTAwCi0KLS8qIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gQXNzb2NSZXEgcGFja2V0ICovCi0jZGVmaW5lIEFTU09DUkVRX01BWF9TSVpFIFwKLSAgKEFUNzZfVFhfSERSTEVOICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdCkgKyBcCi0gICAxICsgMSArIElXX0VTU0lEX01BWF9TSVpFICsgMSArIDEgKyA0KQotCi0vKiBmb3Igc2hhcmVkIHNlY3JldCBhdXRoLCBhZGQgdGhlIGNoYWxsZW5nZSB0ZXh0IHNpemUgKi8KLSNkZWZpbmUgQVVUSF9GUkFNRV9TSVpFIChBVDc2X1RYX0hEUkxFTiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGgpKQotCi0vKiBNYXhpbWFsIG51bWJlciBvZiBBdXRoUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVVUSF9SRVRSSUVTCQkzCi0KLS8qIE1heGltYWwgbnVtYmVyIG9mIEFzc29jUmVxIHJldHJpZXMgKi8KLSNkZWZpbmUgQVNTT0NfUkVUUklFUwkJMwotCi0vKiBCZWFjb24gdGltZW91dCBpbiBtYW5hZ2VkIG1vZGUgd2hlbiB3ZSBhcmUgY29ubmVjdGVkICovCi0jZGVmaW5lIEJFQUNPTl9USU1FT1VUCQkoMTAgKiBIWikKLQotLyogVGltZW91dCBmb3IgYXV0aGVudGljYXRpb24gcmVzcG9uc2UgKi8KLSNkZWZpbmUgQVVUSF9USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBUaW1lb3V0IGZvciBhc3NvY2lhdGlvbiByZXNwb25zZSAqLwotI2RlZmluZSBBU1NPQ19USU1FT1VUCQkoMSAqIEhaKQotCi0vKiBQb2xsaW5nIGludGVydmFsIHdoZW4gc2NhbiBpcyBydW5uaW5nICovCiAjZGVmaW5lIFNDQU5fUE9MTF9JTlRFUlZBTAkoSFogLyA0KQogCi0vKiBDb21tYW5kIGNvbXBsZXRpb24gdGltZW91dCAqLwogI2RlZmluZSBDTURfQ09NUExFVElPTl9USU1FT1VUCSg1ICogSFopCiAKICNkZWZpbmUgREVGX1JUU19USFJFU0hPTEQJMTUzNgpAQCAtNjExLDggKzUwMiw2IEBACiAjZGVmaW5lIERFRl9TQ0FOX01JTl9USU1FCTEwCiAjZGVmaW5lIERFRl9TQ0FOX01BWF9USU1FCTEyMAogCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xECShNQVhfRlJBR19USFJFU0hPTEQgKyAxKQotCiAvKiB0aGUgbWF4IHBhZGRpbmcgc2l6ZSBmb3IgdHggaW4gYnl0ZXMgKHNlZSBjYWxjX3BhZGRpbmcpICovCiAjZGVmaW5lIE1BWF9QQURESU5HX1NJWkUJNTMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgwNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L0tjb25maWcKQEAgLTAsMCArMSw3IEBACitjb25maWcgQkVORVQKKwl0cmlzdGF0ZSAiU2VydmVyRW5naW5lcyAxMEdiIE5JQyAtIEJsYWRlRW5naW5lIgorCWRlcGVuZHMgb24gUENJICYmIElORVQKKwlzZWxlY3QgSU5FVF9MUk8KKwloZWxwCisJICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBOSUMgZnVuY3Rpb25hbGl0eSBmb3IgU2VydmVyRW5naW5lcworCSAgMTBHYiBuZXR3b3JrIGFkYXB0ZXIgQmxhZGVFbmdpbmUgKEVDIDMyMTApLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01BSU5UQUlORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2UzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTUFJTlRBSU5FUlMKQEAgLTAsMCArMSw2IEBACitTRVJWRVIgRU5HSU5FUyAxMEdiZSBOSUMgLSBCTEFERS1FTkdJTkUKK1A6CVN1YmJ1IFNlZXRoYXJhbWFuCitNOglzdWJidXNAc2VydmVyZW5naW5lcy5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuc2VydmVyZW5naW5lcy5jb20KK1M6CVN1cHBvcnRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGI5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSB0byBidWlsZCB0aGUgbmV0d29yayBkcml2ZXIgZm9yIFNlcnZlckVuZ2luZSdzIEJsYWRlRW5naW5lCisjCitvYmotJChDT05GSUdfQkVORVQpICs9IGJlbmV0Lm8KKworYmVuZXQteSA6PSAgYmVfaW5pdC5vIFwKKwkJCWJlX2ludC5vIFwKKwkJCWJlX25ldGlmLm8gXAorCQkJYmVfZXRodG9vbC5vIFwKKwkJCWZ1bmNvYmoubyBcCisJCQljcS5vIFwKKwkJCWVxLm8gXAorCQkJbXB1Lm8gXAorCQkJZXRoLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVE9ETzoKKwktIHJlbW92ZSB3cmFwcGVycyBhcm91bmQgY29tbW9uIGlvd3JpdGUgZnVuY3Rpb25zCisJLSBmdWxsIG5ldGRldiBhdWRpdCBvZiBjb21tb24gcHJvYmxlbXMvaXNzdWVzCisKK1BsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIGFuZCBxdWVzdGlvbnMgdG8gU3ViYnUgU2VldGhhcmFtYW4KKzxzdWJidXNAc2VydmVyZW5naW5lcy5jb20+IGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2FzeW5jbWVzZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTc3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYXN5bmNtZXNnLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2RlZmluZSBfX2FzeW5jbWVzZ19hbWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX2NvbW1vbi5oIgorCisvKiAtLS0gQVNZTkNfRVZFTlRfQ09ERVMgLS0tICovCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSAgICAgKDEpCisjZGVmaW5lIEFTWU5DX0VWRU5UX0NPREVfSVNDU0kgICAgICAgICAgKDIpCisKKy8qIC0tLSBBU1lOQ19MSU5LX1NUQVRFUyAtLS0gKi8KKyNkZWZpbmUgQVNZTkNfRVZFTlRfTElOS19ET1dOICAgICAgICAgICAoMCkJLyogTGluayBEb3duIG9uIGEgcG9ydCAqLworI2RlZmluZSBBU1lOQ19FVkVOVF9MSU5LX1VQICAgICAgICAgICAgICgxKQkvKiBMaW5rIFVwIG9uIGEgcG9ydCAqLworCisvKgorICogVGhlIGxhc3QgNCBieXRlcyBvZiB0aGUgYXN5bmMgZXZlbnRzIGhhdmUgdGhpcyBjb21tb24gZm9ybWF0LiAgSXQgYWxsb3dzCisgKiB0aGUgZHJpdmVyIHRvIGRpc3Rpbmd1aXNoIFtsaW5rXU1DQ19DUV9FTlRSWVsvbGlua10gc3RydWN0cyBmcm9tCisgKiBhc3luY2hyb25vdXMgZXZlbnRzLiAgQm90aCBhcnJpdmUgb24gdGhlIHNhbWUgY29tcGxldGlvbiBxdWV1ZS4gIFRoaXMKKyAqIHN0cnVjdHVyZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21tb24gZmllbGRzIHVzZWQgdG8gZGVjb2RlIHRoZSBhc3luYyBldmVudC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB7CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBldmVudF9jb2RlWzhdOwkvKiBEV09SRCAwICovCisJdTggZXZlbnRfdHlwZVs4XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzZdOwkvKiBEV09SRCAwICovCisJdTggYXN5bmNfZXZlbnQ7CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogQXBwbGljYWJsZSBpbiBJbml0aWF0b3IsIFRhcmdldCBhbmQgTklDIG1vZGVzLgorICogQSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50IGlzIHNlZW4gYnkgYWxsIGRldmljZSBkcml2ZXJzIGFzIHNvb24gdGhleQorICogY3JlYXRlIGFuIE1DQyByaW5nLiBUaGVyZWFmdGVyLCBhbnl0aW1lIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2VzIHRoZQorICogZHJpdmVycyB3aWxsIHJlY2VpdmUgYSBsaW5rIHN0YXRlIGFzeW5jIGV2ZW50LiBOb3RpZmljYXRpb25zIGNvbnRpbnVlIHRvCisgKiBiZSBzZW50IHVudGlsIGEgZHJpdmVyIGRlc3Ryb3lzIGl0cyBNQ0MgcmluZy4gQSBsaW5rIGRvd24gZXZlbnQgaXMKKyAqIHJlcG9ydGVkIHdoZW4gZWl0aGVyIHBvcnQgbG9zZXMgbGluay4gQSBsaW5rIHVwIGV2ZW50IGlzIHJlcG9ydGVkCisgKiB3aGVuIGVpdGhlciBwb3J0IHJlZ2FpbnMgbGluay4gV2hlbiBCRSdzIGZhaWxvdmVyIG1lY2hhbmlzbSBpcyBlbmFibGVkLCBhCisgKiBsaW5rIGRvd24gb24gdGhlIGFjdGl2ZSBwb3J0IGNhdXNlcyB0cmFmZmljIHRvIGJlIGRpdmVydGVkIHRvIHRoZSBzdGFuZGJ5CisgKiBwb3J0IGJ5IHRoZSBCRSdzIEFSTSBmaXJtd2FyZSAoYXNzdW1pbmcgdGhlIHN0YW5kYnkgcG9ydCBoYXMgbGluaykuIEluCisgKiB0aGlzIGNhc2UsIHRoZSBzdGFuZHkgcG9ydCBhc3N1bWVzIHRoZSBhY3RpdmUgc3RhdHVzLiBOb3RlOiB3aGVuIGxpbmsgaXMKKyAqIHJlc3RvcmVkIG9uIHRoZSBmYWlsZWQgcG9ydCwgdHJhZmZpYyBjb250aW51ZXMgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUKKyAqIHBvcnQuIFRoZSBBUk0gZmlybXdhcmUgZG9lcyBub3QgYXR0ZW1wdCB0byAnZmFpbCBiYWNrJyB0cmFmZmljIHRvCisgKiB0aGUgcmVzdG9yZWQgcG9ydC4KKyAqLworc3RydWN0IEJFX0FTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCB7CisJdTggcG9ydDBfbGlua19zdGF0dXNbOF07CisJdTggcG9ydDFfbGlua19zdGF0dXNbOF07CisJdTggYWN0aXZlX3BvcnRbOF07CisJdTggcnN2ZDBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwb3J0MF9kdXBsZXhbOF07CisJdTggcG9ydDBfc3BlZWRbOF07CisJdTggcG9ydDFfZHVwbGV4WzhdOworCXU4IHBvcnQxX3NwZWVkWzhdOworCXU4IHBvcnQwX2ZhdWx0WzhdOworCXU4IHBvcnQxX2ZhdWx0WzhdOworCXU4IHJzdmQxWzJdWzhdOwkvKiBEV09SRCAyICovCisJc3RydWN0IEJFX0FTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCB0cmFpbGVyOworfSBfX3BhY2tlZDsKK3N0cnVjdCBBU1lOQ19FVkVOVF9MSU5LX1NUQVRFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisjZW5kaWYgLyogX19hc3luY21lc2dfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jbS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY21fYW1hcF9oX18KKyNkZWZpbmUgX19iZV9jbV9hbWFwX2hfXworI2luY2x1ZGUgImJlX2NvbW1vbi5oIgorI2luY2x1ZGUgImV0eF9jb250ZXh0LmgiCisjaW5jbHVkZSAibXB1X2NvbnRleHQuaCIKKworLyoKKyAqIC0tLSBDRVZfV0FURVJNQVJLX0VOVU0gLS0tCisgKiBDUS9FUSBXYXRlcm1hcmsgRW5jb2RpbmdzLiBFbmNvZGVkIGFzIG51bWJlciBvZiBmcmVlIGVudHJpZXMgaW4KKyAqIFF1ZXVlIHdoZW4gV2F0ZXJtYXJrIGlzIHJlYWNoZWQuCisgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzAgICAgICAgICgwKQkvKiBXYXRlcm1hcmsgd2hlbiBRdWV1ZSBmdWxsICovCisjZGVmaW5lIENFVl9XTUFSS18xNiAgICAgICAoMSkJLyogV2F0ZXJtYXJrIGF0IDE2IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMzIgICAgICAgKDIpCS8qIFdhdGVybWFyayBhdCAzMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzQ4ICAgICAgICgzKQkvKiBXYXRlcm1hcmsgYXQgNDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS182NCAgICAgICAoNCkJLyogV2F0ZXJtYXJrIGF0IDY0IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfODAgICAgICAgKDUpCS8qIFdhdGVybWFyayBhdCA4MCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzk2ICAgICAgICg2KQkvKiBXYXRlcm1hcmsgYXQgOTYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xMTIgICAgICAoNykJLyogV2F0ZXJtYXJrIGF0IDExMiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzEyOCAgICAgICg4KQkvKiBXYXRlcm1hcmsgYXQgMTI4IGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMTQ0ICAgICAgKDkpCS8qIFdhdGVybWFyayBhdCAxNDQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNjAgICAgICAoMTApCS8qIFdhdGVybWFyayBhdCAxNjAgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNzYgICAgICAoMTEpCS8qIFdhdGVybWFyayBhdCAxNzYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xOTIgICAgICAoMTIpCS8qIFdhdGVybWFyayBhdCAxOTIgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMDggICAgICAoMTMpCS8qIFdhdGVybWFyayBhdCAyMDggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yMjQgICAgICAoMTQpCS8qIFdhdGVybWFyayBhdCAyMjQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18yNDAgICAgICAoMTUpCS8qIFdhdGVybWFyayBhdCAyNDAgZnJlZSBlbnRyaWVzICovCisKKy8qCisgKiAtLS0gQ1FfQ05UX0VOVU0gLS0tCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfQ1FfQ05UXzI1NiAgICAgICAgICAgICAgICAgICgwKQkvKiBDUSBoYXMgMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX0NRX0NOVF81MTIgICAgICAgICAgICAgICAgICAoMSkJLyogQ1EgaGFzIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIENFVl9DUV9DTlRfMTAyNCAgICAgICAgICAgICAgICAgKDIpCS8qIENRIGhhcyAxMDI0IGVudHJpZXMgKi8KKworLyoKKyAqIC0tLSBFUV9DTlRfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIENvdW50IEVuY29kaW5ncy4KKyAqLworI2RlZmluZSBDRVZfRVFfQ05UXzI1NiAgICAgKDApCS8qIEVRIGhhcyAyNTYgZW50cmllcyAoMTYtYnl0ZSBFUUVzIG9ubHkpICovCisjZGVmaW5lIENFVl9FUV9DTlRfNTEyICAgICAoMSkJLyogRVEgaGFzIDUxMiBlbnRyaWVzICgxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8xMDI0ICAgICgyKQkvKiBFUSBoYXMgMTAyNCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF8yMDQ4ICAgICgzKQkvKiBFUSBoYXMgMjA0OCBlbnRyaWVzICg0LWJ5dGUgb3IgKi8KKwkJCQkvKiAxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF80MDk2ICAgICg0KQkvKiBFUSBoYXMgNDA5NiBlbnRyaWVzICg0LWJ5dGUgRVFFcyBvbmx5KSAqLworCisvKgorICogLS0tIEVRX1NJWkVfRU5VTSAtLS0KKyAqIEV2ZW50IFF1ZXVlIEVudHJ5IFNpemUgRW5jb2RpbmcuCisgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfNCAgICAgICAgICAgICAgICAgICAoMCkJLyogRVFFIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgQ0VWX0VRX1NJWkVfMTYgICAgICAgICAgICAgICAgICAoMSkJLyogRVFFIGlzIDE2IGJ5dGVzICovCisKKy8qCisgKiBDb21wbGV0aW9uIFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkuIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIENRLgorICogTG9jYXRlZCBpbiBSQU0gd2l0aGluIHRoZSBDRVYgYmxvY2suCisgKi8KK3N0cnVjdCBCRV9DUV9DT05URVhUX0FNQVAgeworCXU4IENpZHhbMTFdOwkvKiBEV09SRCAwICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAwICovCisJdTggTm9EZWxheTsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCBDb3VudFsyXTsJLyogRFdPUkQgMCAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IFNvbEV2ZW50OwkvKiBEV09SRCAwICovCisJdTggRXZlbnRhYmxlOwkvKiBEV09SRCAwICovCisJdTggUGlkeFsxMV07CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggRVFJRFs3XTsJCS8qIERXT1JEIDEgKi8KKwl1OCBGdW5jOwkJLyogRFdPUkQgMSAqLworCXU4IFdNRTsJCS8qIERXT1JEIDEgKi8KKwl1OCBTdGFsbGVkOwkJLyogRFdPUkQgMSAqLworCXU4IEFybWVkOwkJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qCisgKiBFdmVudCBRdWV1ZSBDb250ZXh0IFRhYmxlIEVudHJ5LiBDb250YWlucyB0aGUgc3RhdGUgb2YgYW4gRVEuCisgKiBMb2NhdGVkIGluIFJBTSBpbiB0aGUgQ0VWIGJsb2NrLgorICovCitzdHJ1Y3QgQkVfRVFfQ09OVEVYVF9BTUFQIHsKKwl1OCBDaWR4WzEzXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzJdOwkvKiBEV09SRCAwICovCisJdTggRnVuYzsJCS8qIERXT1JEIDAgKi8KKwl1OCBFUElkeFsxM107CS8qIERXT1JEIDAgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMTsJCS8qIERXT1JEIDAgKi8KKwl1OCBTaXplOwkJLyogRFdPUkQgMCAqLworCXU4IFBpZHhbMTNdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDEgKi8KKwl1OCBQRFsxMF07CQkvKiBEV09SRCAxICovCisJdTggQ291bnRbM107CS8qIERXT1JEIDEgKi8KKwl1OCBTb2xFdmVudDsJLyogRFdPUkQgMSAqLworCXU4IFN0YWxsZWQ7CQkvKiBEV09SRCAxICovCisJdTggQXJtZWQ7CQkvKiBEV09SRCAxICovCisJdTggV2F0ZXJtYXJrWzRdOwkvKiBEV09SRCAyICovCisJdTggV01FOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzNdOwkvKiBEV09SRCAyICovCisJdTggRXZlbnRWZWN0WzZdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDRbMl07CS8qIERXT1JEIDIgKi8KKwl1OCBEZWxheVs4XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ1WzZdOwkvKiBEV09SRCAyICovCisJdTggVE1SOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ2OwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUV9DT05URVhUX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NtX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2M2RjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jb21tb24uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYmVfY29tbW9uX2FtYXBfaF9fCisjZGVmaW5lIF9fYmVfY29tbW9uX2FtYXBfaF9fCisKKy8qIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfUEhZU19BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBIWVNfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBWaXJ0dWFsIEFkZHJlc3MuICovCitzdHJ1Y3QgQkVfVklSVF9BRERSX0FNQVAgeworCXU4IGxvWzMyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaVszMl07CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFZJUlRfQUREUl9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBTY2F0dGVyIGdhdGhlciBlbGVtZW50LiAqLworc3RydWN0IEJFX1NHRV9BTUFQIHsKKwl1OCBhZGRyX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJfbG9bMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAyICovCisJdTggbGVuWzE2XTsJCS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkMVsxNl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgU0dFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2JlX2NvbW1vbl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3YWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBiZV9ldGh0b29sLmMKKyAqCisgKiAJVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgZXRodG9vbCBjYW4gdXNlCisgKiAJdG8gdGFsayB0byB0aGUgZHJpdmVyIGFuZCB0aGUgQkUgSC9XLgorICovCisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBiZW5ldF9nc3RyaW5nc19zdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisvKiBuZXRfZGV2aWNlX3N0YXRzICovCisJInJ4X3BhY2tldHMiLAorCSJ0eF9wYWNrZXRzIiwKKwkicnhfYnl0ZXMiLAorCSJ0eF9ieXRlcyIsCisJInJ4X2Vycm9ycyIsCisJInR4X2Vycm9ycyIsCisJInJ4X2Ryb3BwZWQiLAorCSJ0eF9kcm9wcGVkIiwKKwkibXVsdGljYXN0IiwKKwkiY29sbGlzaW9ucyIsCisJInJ4X2xlbmd0aF9lcnJvcnMiLAorCSJyeF9vdmVyX2Vycm9ycyIsCisJInJ4X2NyY19lcnJvcnMiLAorCSJyeF9mcmFtZV9lcnJvcnMiLAorCSJyeF9maWZvX2Vycm9ycyIsCisJInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydGVkX2Vycm9ycyIsCisJInR4X2NhcnJpZXJfZXJyb3JzIiwKKwkidHhfZmlmb19lcnJvcnMiLAorCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKKwkidHhfd2luZG93X2Vycm9ycyIsCisJInJ4X2NvbXByZXNzZWQiLAorCSJ0Y19jb21wcmVzc2VkIiwKKy8qIEJFIGRyaXZlciBTdGF0cyAqLworCSJiZXNfdHhfcmVxcyIsCisJImJlc190eF9mYWlscyIsCisJImJlc19md2RfcmVxcyIsCisJImJlc190eF93cmJzIiwKKwkiYmVzX2ludGVycnVwdHMiLAorCSJiZXNfZXZlbnRzIiwKKwkiYmVzX3R4X2V2ZW50cyIsCisJImJlc19yeF9ldmVudHMiLAorCSJiZXNfdHhfY29tcGwiLAorCSJiZXNfcnhfY29tcGwiLAorCSJiZXNfZXRocnhfcG9zdF9mYWlsIiwKKwkiYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzIiwKKwkiYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXMiLAorCSJiZXNfcnhfbWlzY19wa3RzIiwKKwkiYmVzX2V0aF90eF9yYXRlIiwKKwkiYmVzX2V0aF9yeF9yYXRlIiwKKwkiTnVtIFBhY2tldHMgY29sbGVjdGVkIiwKKwkiTnVtIFRpbWVzIEZsdXNoZWQiLAorfTsKKworI2RlZmluZSBORVRfREVWX1NUQVRTX0xFTiBcCisJKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjZGVmaW5lIEJFTkVUX1NUQVRTX0xFTiAgQVJSQVlfU0laRShiZW5ldF9nc3RyaW5nc19zdGF0cykKKworc3RhdGljIHZvaWQKK2JlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBiZV9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgYmVfZHJ2cl92ZXIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGJlX2Z3X3ZlciwgMzIpOworCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSAwOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOworfQorCitzdGF0aWMgaW50CitiZV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBhZGFwdGVyLT5tYXhfcnhfY29hbDsKKworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPmN1cl9lcWQ7CisJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPSBhZGFwdGVyLT5tYXhfZXFkOworCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPSBhZGFwdGVyLT5taW5fZXFkOworCisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzID0gYWRhcHRlci0+Y3VyX2VxZDsKKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IGFkYXB0ZXItPm1heF9lcWQ7CisJY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IGFkYXB0ZXItPm1pbl9lcWQ7CisKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gYWRhcHRlci0+ZW5hYmxlX2FpYzsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gc2V0IGludGVycnVwIGNvYWxlc2NpbmcgZGVsYXkgKmFzIHdlbGwgYXMqCisgKiB0aGUgbnVtYmVyIG9mIHBrdHMgdG8gY29hbGVzY2UgZm9yIExSTy4KKyAqLworc3RhdGljIGludAorYmVfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdHA7CisJdTMyIG1heCwgbWluLCBjdXI7CisJaW50IHN0YXR1czsKKworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCWlmIChhZGFwdGVyLT5tYXhfcnhfY29hbCA+PSBCRV9MUk9fTUFYX1BLVFMpCisJCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMgPT0gMCAmJgorCQljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID09IDEpIHsKKwkJLyogaWYgQUlDIGlzIGJlaW5nIHR1cm5lZCBvbiBub3csIHN0YXJ0IHdpdGggYW4gRVFEIG9mIDAgKi8KKwkJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisJfQorCWFkYXB0ZXItPmVuYWJsZV9haWMgPSBjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOworCisJLyogcm91bmQgb2ZmIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgOCAqLworCW1heCA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoICsgNCkgPj4gMykgPDwgMyk7CisJbWluID0gKCgoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyArIDQpID4+IDMpIDw8IDMpOworCWN1ciA9ICgoKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyArIDQpID4+IDMpIDw8IDMpOworCisJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMpIHsKKwkJLyogYWNjZXB0IGxvdyBhbmQgaGlnaCBpZiBBSUMgaXMgZW5hYmxlZCAqLworCQlpZiAobWF4ID4gTUFYX0VRRCkKKwkJCW1heCA9IE1BWF9FUUQ7CisJCWlmIChtaW4gPiBtYXgpCisJCQltaW4gPSBtYXg7CisJCWFkYXB0ZXItPm1heF9lcWQgPSBtYXg7CisJCWFkYXB0ZXItPm1pbl9lcWQgPSBtaW47CisJCWlmIChhZGFwdGVyLT5jdXJfZXFkID4gbWF4KQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG1heDsKKwkJaWYgKGFkYXB0ZXItPmN1cl9lcWQgPCBtaW4pCisJCQlhZGFwdGVyLT5jdXJfZXFkID0gbWluOworCX0gZWxzZSB7CisJCS8qIGFjY2VwdCBzcGVjaWZpZWQgY29hbGVzY2VfdXNlY3Mgb25seSBpZiBBSUMgaXMgZGlzYWJsZWQgKi8KKwkJaWYgKGN1ciA+IE1BWF9FUUQpCisJCQljdXIgPSBNQVhfRVFEOworCQllcV9vYmplY3RwID0gJnBub2ItPmV2ZW50X3Ffb2JqOworCQlzdGF0dXMgPQorCQkgICAgYmVfZXFfbW9kaWZ5X2RlbGF5KCZwbm9iLT5mbl9vYmosIDEsICZlcV9vYmplY3RwLCAmY3VyLAorCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKQorCQkJYWRhcHRlci0+Y3VyX2VxZCA9IGN1cjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYmVfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXJldHVybiBhZGFwdGVyLT5yeF9jc3VtOworfQorCitzdGF0aWMgaW50IGJlX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCWlmIChkYXRhKQorCQlhZGFwdGVyLT5yeF9jc3VtID0gMTsKKwllbHNlCisJCWFkYXB0ZXItPnJ4X2NzdW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiZV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsIHVpbnQ4X3QgKmRhdGEpCit7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICpiZW5ldF9nc3RyaW5nc19zdGF0cywKKwkJICAgICAgIHNpemVvZihiZW5ldF9nc3RyaW5nc19zdGF0cykpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmVfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEJFTkVUX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQKK2JlX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCWludCBpOworCisJYmVuZXRfZ2V0X3N0YXRzKG5ldGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE5FVF9ERVZfU1RBVFNfTEVOOyBpKyspCisJCWRhdGFbaV0gPSAoKHVuc2lnbmVkIGxvbmcgKikmYWRhcHRlci0+YmVuZXRfc3RhdHMpW2ldOworCisJZGF0YVtpXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZndkX3JlcXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfd3JiczsKKworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXZlbnRzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50czsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9ldmVudHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRocnhfcG9zdF9mYWlsOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX21hbGZvcm1lZF9mcmFtZXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfbWlzY19wa3RzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF90eF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfZmx1c2g7CisKK30KKworc3RhdGljIGludCBiZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBSaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgcG5vYiAqLworc3RhdGljIHZvaWQKK2JlX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFByZSBTZXQgTWF4aW1zICovCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBwbm9iLT5yeF9xX2xlbjsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZzsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IHJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nOworCXJpbmctPnR4X21heF9wZW5kaW5nID0gcG5vYi0+dHhfcV9sZW47CisKKwkvKiBDdXJyZW50IGhhcmR3YXJlIFNldHRpbmdzICAgICAgICAgICAgICAgICovCisJcmluZy0+cnhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gcmluZy0+cnhfbWluaV9wZW5kaW5nOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSByaW5nLT5yeF9qdW1ib19wZW5kaW5nOworCXJpbmctPnR4X3BlbmRpbmcgPSBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKTsKKworfQorCitzdGF0aWMgdm9pZAorYmVfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCByeGZjLCB0eGZjOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCAmdHhmYywgJnJ4ZmMpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IHBhdXNlIGZyYW1lIHNldHRpbmdzXG4iKTsKKwkJLyogcmV0dXJuIGRlZmF1bHRzICovCisJCWVjbWQtPnJ4X3BhdXNlID0gMTsKKwkJZWNtZC0+dHhfcGF1c2UgPSAwOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHhmYyA9PSB0cnVlKQorCQllY21kLT50eF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT50eF9wYXVzZSA9IDA7CisKKwlpZiAocnhmYyA9PSB0cnVlKQorCQllY21kLT5yeF9wYXVzZSA9IDE7CisJZWxzZQorCQllY21kLT5yeF9wYXVzZSA9IDA7CisKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Cit9CisKK3N0YXRpYyBpbnQKK2JlX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVjbWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWJvb2wgdHhmYywgcnhmYzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVjbWQtPnR4X3BhdXNlKQorCQl0eGZjID0gdHJ1ZTsKKwllbHNlCisJCXR4ZmMgPSBmYWxzZTsKKworCWlmIChlY21kLT5yeF9wYXVzZSkKKwkJcnhmYyA9IHRydWU7CisJZWxzZQorCQlyeGZjID0gZmFsc2U7CisKKwlzdGF0dXMgPSBiZV9ldGhfc2V0X2Zsb3dfY29udHJvbCgmcG5vYi0+Zm5fb2JqLCB0eGZjLCByeGZjKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiVW5hYmxlIHRvIHNldCBwYXVzZSBmcmFtZSBzZXR0aW5nc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gYmVfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGJlX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jb2FsZXNjZSA9IGJlX2dldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gYmVfc2V0X2NvYWxlc2NlLAorCS5nZXRfcmluZ3BhcmFtID0gYmVfZ2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBiZV9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBiZV9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0gPSBiZV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBiZV9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCisJLmdldF9zZyA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKwkuZ2V0X3N0cmluZ3MgPSBiZV9nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ID0gYmVfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGJlX2dldF9ldGh0b29sX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW5pdC5jCkBAIC0wLDAgKzEsMTM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiYmVuZXQuaCIKKworI2RlZmluZSAgRFJWUl9WRVJTSU9OICAiMS4wLjcyOCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlX2RldmljZV9pZF90YWJsZVtdID0geworCXtQQ0lfREVWSUNFKDB4MTlhMiwgMHgwMjAxKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmVfZGV2aWNlX2lkX3RhYmxlKTsKKworTU9EVUxFX1ZFUlNJT04oRFJWUl9WRVJTSU9OKTsKKworI2RlZmluZSBEUlZfREVTQ1JJUFRJT04gIlNlcnZlckVuZ2luZXMgQmxhZGVFbmdpbmUgTmV0d29yayBEcml2ZXIgVmVyc2lvbiAiCisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04gRFJWUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlNlcnZlckVuZ2luZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtc2l4ID0gMTsKK21vZHVsZV9wYXJhbShtc2l4LCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobXNpeCwgIlVzZSBNU0kteCBpbnRlcnJ1cHRzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhidWZfc2l6ZSA9IDIwNDg7CS8qIERlZmF1bHQgUlggZnJhZyBzaXplICovCittb2R1bGVfcGFyYW0ocnhidWZfc2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4YnVmX3NpemUsICJTaXplIG9mIGJ1ZmZlcnMgdG8gaG9sZCBSeCBkYXRhIik7CisKK2NvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXSA9IERSVlJfVkVSU0lPTjsKK2NoYXIgYmVfZndfdmVyWzMyXTsJCS8qIEYvVyB2ZXJzaW9uIGZpbGxlZCBpbiBieSBiZV9wcm9iZSAqLworY2hhciBiZV9kcml2ZXJfbmFtZVtdID0gImJlbmV0IjsKKworLyoKKyAqIE51bWJlciBvZiBlbnRyaWVzIGluIGVhY2ggcXVldWUuCisgKi8KKyNkZWZpbmUgRVZFTlRfUV9MRU4JCTEwMjQKKyNkZWZpbmUgRVRIX1RYUV9MRU4JCTIwNDgKKyNkZWZpbmUgRVRIX1RYQ1FfTEVOCQkxMDI0CisjZGVmaW5lIEVUSF9SWFFfTEVOCQkxMDI0CS8qIERvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIHZhbHVlICovCisjZGVmaW5lIEVUSF9VQ19SWENRX0xFTgkJMTAyNAorI2RlZmluZSBFVEhfQkNfUlhDUV9MRU4JCTI1NgorI2RlZmluZSBNQ0NfUV9MRU4gICAgICAgICAgICAgICA2NAkvKiB0b3RhbCBzaXplIG5vdCB0byBleGNlZWQgOCBwYWdlcyAqLworI2RlZmluZSBNQ0NfQ1FfTEVOICAgICAgICAgICAgICAyNTYKKworLyogQml0IG1hc2sgZGVzY3JpYmluZyBldmVudHMgb2YgaW50ZXJlc3QgdG8gYmUgdHJhY2VkICovCit1bnNpZ25lZCBpbnQgdHJhY2VfbGV2ZWw7CisKK3N0YXRpYyBpbnQKK2luaXRfcGNpX2JlX2Z1bmN0aW9uKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1NjQgcGE7CisKKwkvKiBDU1IgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlhZGFwdGVyLT5jc3JfdmEgPSBpb3JlbWFwX25vY2FjaGUocGEsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmIChhZGFwdGVyLT5jc3JfdmEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBEb29yIEJlbGwgKi8KKwlwYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKwlhZGFwdGVyLT5kYl92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgKDEyOCAqIDEwMjQpKTsKKwlpZiAoYWRhcHRlci0+ZGJfdmEgPT0gTlVMTCkgeworCQlpb3VubWFwKGFkYXB0ZXItPmNzcl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBDSSAqLworCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWFkYXB0ZXItPnBjaV92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSA9PSBOVUxMKSB7CisJCWlvdW5tYXAoYWRhcHRlci0+Y3NyX3ZhKTsKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaW50ZXJydXB0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEV2ZW50CisgICBxdWV1ZSBJRCBmb3IgdGhlIGdpdmVuIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBpbnRlcnJ1cHQgY29ycmVzcG9uZGluZyB0byB0aGUgRXZlbnQKKyAgIHF1ZXVlIElEIGZvciB0aGUgZ2l2ZW4gTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKwljcWRiLmR3WzBdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZjcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgY3FkYi5kd1swXSk7Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgIG5ldHdvcmsgZnVuY3Rpb24KKyAgICBvZiB0aGUgQmxhZGVFbmdpbmUuIFVzZSB0aGUgZnVuY3Rpb24gYmVfZGlzYWJsZV9lcV9pbnRyKCkKKyAgICB0byBlbmFibGUgdGhlIGludGVycnVwdCBmcm9tIHRoZSBldmVudCBxdWV1ZSBvZiBvbmx5IG9uZSBzcGVjaWZpYworICAgIE5ldE9iamVjdAorKi8KK3ZvaWQgYmVfZW5hYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIGN0cmw7CisJdTMyIGhvc3RfaW50cjsKKworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoIWhvc3RfaW50cikgeworCQlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQlob3N0aW50ciwgY3RybC5kdywgMSk7CisJCVBDSUNGRzFfV1JJVEUoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCwKKwkJCWN0cmwuZHdbMF0pOworCX0KK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGludGVycnVwdCBmcm9tIHRoZSBuZXR3b3JrIGZ1bmN0aW9uIG9mCisgICB0aGUgQmxhZGVFbmdpbmUuICBVc2UgdGhlIGZ1bmN0aW9uIGJlX2Rpc2FibGVfZXFfaW50cigpIHRvCisgICBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZXZlbnQgcXVldWUgb2Ygb25seSBvbmUgc3BlY2lmaWMgTmV0T2JqZWN0CisqLwordm9pZCBiZV9kaXNhYmxlX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKwl1MzIgaG9zdF9pbnRyOworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQoJnBub2ItPmZuX29iaiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoaG9zdF9pbnRyKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwgaG9zdGludHIsCisJCQljdHJsLmR3LCAwKTsKKwkJUENJQ0ZHMV9XUklURSgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsLAorCQkJY3RybC5kd1swXSk7CisJfQorfQorCitzdGF0aWMgaW50IGJlX2VuYWJsZV9tc2l4KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCByZXQ7CisKKwlpZiAoIW1zaXgpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBCRV9NQVhfUkVRX01TSVhfVkVDVE9SUzsgaSsrKQorCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm1zaXhfZW50cmllcywKKwkJQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMpOworCisJaWYgKHJldCA9PSAwKQorCQlhZGFwdGVyLT5tc2l4X2VuYWJsZWQgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmVfcmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCWludCBpbnR4ID0gMCwgcjsKKworCW5ldGRldi0+aXJxID0gYWRhcHRlci0+cGRldi0+aXJxOworCXIgPSBiZV9lbmFibGVfbXNpeChhZGFwdGVyKTsKKworCWlmIChyID09IDApIHsKKwkJciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1swXS52ZWN0b3IsCisJCQkJYmVfaW50LCBJUlFGX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJNU0lYIFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCWludHggPSAxOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpbnR4ID0gMTsKKwl9CisKKwlpZiAoaW50eCkgeworCQlyID0gcmVxdWVzdF9pcnEobmV0ZGV2LT5pcnEsIGJlX2ludCwgSVJRRl9TSEFSRUQsCisJCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOworCQlpZiAocikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJJTlR4IFJlcXVlc3QgSVJRIGZhaWxlZCAtIEVycm5vICVkXG4iLCByKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VucmVnaXN0ZXJfaXNyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCWlmIChhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCkgeworCQlpZiAoYWRhcHRlci0+bXNpeF9lbmFibGVkKSB7CisJCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCBuZXRkZXYpOworCQkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDA7CisJCX0gZWxzZSB7CisJCQlmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKwkJfQorCQlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IDA7CisJfQorfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBGbHVzaCBDb21wbGV0aW9ucyB0aGF0IGFyZSBpc3N1ZWQgYnkgdGhlCisgICAgQVJNIEYvVywgd2hlbiBhIFJlY3YgUmluZyBpcyBkZXN0cm95ZWQuICBBIGZsdXNoIGNvbXBsZXRpb24gaXMKKyAgICBpZGVudGlmaWVkIHdoZW4gYSBSeCBDT21wbCBkZXNjcmlwdG9yIGhhcyB0aGUgdGNwY2tzdW0gYW5kIHVkcGNrc3VtCisgICAgc2V0IGFuZCB0aGUgcGt0c2l6ZSBpcyAzMi4gIFRoZXNlIGNvbXBsZXRpb25zIGFyZSByZWNlaXZlZCBvbiB0aGUKKyAgICBSeCBDb21wbGV0aW9uIFF1ZXVlLgorKi8KK3N0YXRpYyB1MzIgYmVfcHJvY2Vzc19yeF9mbHVzaF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJd2hpbGUgKChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpICE9IE5VTEwpIHsKKwkJYmVfbm90aWZ5X2NtcGwocG5vYiwgMSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCQlpKys7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBiZV90eF9xX2NsZWFuKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXdoaWxlIChhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSkKKwkJcHJvY2Vzc19vbmVfdHhfY29tcGwocG5vYiwgdHhfY29tcGxfbGFzdHdyYl9pZHhfZ2V0KHBub2IpKTsKK30KKworc3RhdGljIHZvaWQgYmVfcnhfcV9jbGVhbihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCQlmb3IgKGkgPSAwOyBpIDwgcG5vYi0+cnhfcV9sZW47IGkrKykgeworCQkJcnhfcGFnZV9pbmZvID0gJihwbm9iLT5yeF9wYWdlX2luZm9baV0pOworCQkJaWYgKCFwbm9iLT5yeF9wZ19zaGFyZWQgfHwgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgeworCQkJCXBjaV91bm1hcF9wYWdlKHBub2ItPmFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkJICAgICAgIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2UpCisJCQkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCX0KKwkJcG5vYi0+cnhfcGdfaW5mb19oZCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZV9kZXN0cm95X25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKHBub2ItPnR4X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9ldGhfc3FfZGVzdHJveSgmcG5vYi0+dHhfcV9vYmopOworCQlwbm9iLT50eF9xX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChwbm9iLT5yeF9xX2NyZWF0ZWQpIHsKKwkJc3RhdHVzID0gYmVfZXRoX3JxX2Rlc3Ryb3koJnBub2ItPnJ4X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlzdGF0dXMgPSBiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKCZwbm9iLT5yeF9xX29iaiwgMCwKKwkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCQkJQlVHX09OKHN0YXR1cyk7CisJCX0KKwkJcG5vYi0+cnhfcV9jcmVhdGVkID0gMDsKKwl9CisKKwliZV9wcm9jZXNzX3J4X2ZsdXNoX2NtcGwocG5vYik7CisKKwlpZiAocG5vYi0+dHhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT50eF9jcV9vYmopOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+cnhfY3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9jcV9kZXN0cm95KCZwbm9iLT5yeF9jcV9vYmopOworCQlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+bWNjX3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9tY2NfcmluZ19kZXN0cm95KCZwbm9iLT5tY2NfcV9vYmopOworCQlwbm9iLT5tY2NfcV9jcmVhdGVkID0gMDsKKwl9CisJaWYgKHBub2ItPm1jY19jcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2NxX2Rlc3Ryb3koJnBub2ItPm1jY19jcV9vYmopOworCQlwbm9iLT5tY2NfY3FfY3JlYXRlZCA9IDA7CisJfQorCisJaWYgKHBub2ItPmV2ZW50X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9lcV9kZXN0cm95KCZwbm9iLT5ldmVudF9xX29iaik7CisJCXBub2ItPmV2ZW50X3FfY3JlYXRlZCA9IDA7CisJfQorCWJlX2Z1bmN0aW9uX2NsZWFudXAoJnBub2ItPmZuX29iaik7Cit9CisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgcG5vYgorICogQ2FsbGVkIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBjbGVhbnVwIGFzIHdlbGwgYSBhbnkgZXJyb3IgZHVyaW5nCisgKiBtb2R1bGUgaW5pdC4gIFNvbWUgcmVzb3VyY2VzIG1heSBiZSBwYXJ0aWFsbHkgYWxsb2NhdGVkIGluIGEgTmV0T2JqLgorICovCitzdGF0aWMgdm9pZCBuZXRvYmplY3RfY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXZwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwl9CisKKwliZV91bnJlZ2lzdGVyX2lzcihhZGFwdGVyKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCYoYWRhcHRlci0+c3RzX2hhbmRsZXIpKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMDsKKwl9CisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kaXNhYmxlX2ludHIocG5vYik7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9OT05FKQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCisJaWYgKHBub2ItPmZuX29ial9jcmVhdGVkKQorCQliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKworCWFkYXB0ZXItPm5ldF9vYmogPSBOVUxMOworCWFkYXB0ZXItPm5ldGRldnAgPSBOVUxMOworCisJYmVfcnhfcV9jbGVhbihwbm9iKTsKKwlpZiAocG5vYi0+cnhfY3R4dCkgeworCQlrZnJlZShwbm9iLT5yeF9wYWdlX2luZm8pOworCQlrZnJlZShwbm9iLT5yeF9jdHh0KTsKKwl9CisKKwliZV90eF9xX2NsZWFuKHBub2IpOworCWtmcmVlKHBub2ItPnR4X2N0eHQpOworCisJaWYgKHBub2ItPm1jY19xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19xX3NpemUsCisJCQlwbm9iLT5tY2NfcSwgcG5vYi0+bWNjX3FfYnVzKTsKKworCWlmIChwbm9iLT5tY2Nfd3JiX2N0eHQpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcG5vYi0+bWNjX3dyYl9jdHh0LAorCQkJICAgZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisKKwlpZiAocG5vYi0+bWNjX2NxKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19jcV9zaXplLAorCQkJcG5vYi0+bWNjX2NxLCBwbm9iLT5tY2NfY3FfYnVzKTsKKworCWlmIChwbm9iLT5ldmVudF9xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPmV2ZW50X3Ffc2l6ZSwKKwkJCXBub2ItPmV2ZW50X3EsIHBub2ItPmV2ZW50X3FfYnVzKTsKKworCWlmIChwbm9iLT50eF9jcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9jcV9zaXplLAorCQkJcG5vYi0+dHhfY3EsIHBub2ItPnR4X2NxX2J1cyk7CisKKwlpZiAocG5vYi0+dHhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQlwbm9iLT50eF9xLCBwbm9iLT50eF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQlwbm9iLT5yeF9xLCBwbm9iLT5yeF9xX2J1cyk7CisKKwlpZiAocG5vYi0+cnhfY3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+cnhfY3Ffc2l6ZSwKKwkJCXBub2ItPnJ4X2NxLCBwbm9iLT5yeF9jcV9idXMpOworCisKKwlpZiAocG5vYi0+bWJfcHRyKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1iX3NpemUsIHBub2ItPm1iX3B0ciwKKwkJCXBub2ItPm1iX2J1cyk7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCisKK3N0YXRpYyBpbnQgYmVfbm9iX3JpbmdfYWxsb2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJdTMyIHNpemU7CisKKwkvKiBNYWlsIGJveCByZDsgbWFpbGJveCBwb2ludGVyIG5lZWRzIHRvIGJlIDE2IGJ5dGUgYWxpZ25lZCAqLworCXBub2ItPm1iX3NpemUgPSBzaXplb2Yoc3RydWN0IE1DQ19NQUlMQk9YX0FNQVApICsgMTY7CisJcG5vYi0+bWJfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWJfc2l6ZSwKKwkJCQkmcG5vYi0+bWJfYnVzKTsKKwlpZiAoIXBub2ItPm1iX2J1cykKKwkJcmV0dXJuIC0xOworCW1lbXNldChwbm9iLT5tYl9wdHIsIDAsIHBub2ItPm1iX3NpemUpOworCXBub2ItPm1iX3JkLnZhID0gUFRSX0FMSUdOKHBub2ItPm1iX3B0ciwgMTYpOworCXBub2ItPm1iX3JkLnBhID0gUFRSX0FMSUdOKHBub2ItPm1iX2J1cywgMTYpOworCXBub2ItPm1iX3JkLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCk7CisJLyoKKwkgKiBFdmVudCBxdWV1ZQorCSAqLworCXBub2ItPmV2ZW50X3FfbGVuID0gRVZFTlRfUV9MRU47CisJcG5vYi0+ZXZlbnRfcV9zaXplID0gcG5vYi0+ZXZlbnRfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVRX0VOVFJZX0FNQVApOworCXBub2ItPmV2ZW50X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5ldmVudF9xX3NpemUsCisJCQkJJnBub2ItPmV2ZW50X3FfYnVzKTsKKwlpZiAoIXBub2ItPmV2ZW50X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPmV2ZW50X3EsIDAsIHBub2ItPmV2ZW50X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggcXVldWUKKwkgKi8KKwlwbm9iLT50eF9xX2xlbiA9IEVUSF9UWFFfTEVOOworCXBub2ItPnR4X3FfcG9ydCA9IDA7CisJcG5vYi0+dHhfcV9zaXplID0gIHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfV1JCX0FNQVApOworCXBub2ItPnR4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT50eF9xX3NpemUsCisJCQkJJnBub2ItPnR4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnR4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnR4X3EsIDAsIHBub2ItPnR4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVFggQ29tcGwgcXVldWUKKwkgKi8KKwlwbm9iLT50eGNxX2xlbiA9IEVUSF9UWENRX0xFTjsKKwlwbm9iLT50eF9jcV9zaXplID0gcG5vYi0+dHhjcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQKTsKKwlwbm9iLT50eF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X2NxX3NpemUsCisJCQkJJnBub2ItPnR4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT50eF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCS8qCisJICogRXRoIFJYIHF1ZXVlCisJICovCisJcG5vYi0+cnhfcV9sZW4gPSBFVEhfUlhRX0xFTjsKKwlwbm9iLT5yeF9xX3NpemUgPSAgcG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9SWF9EX0FNQVApOworCXBub2ItPnJ4X3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9xX3NpemUsCisJCQkJJnBub2ItPnJ4X3FfYnVzKTsKKwlpZiAoIXBub2ItPnJ4X3FfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPnJ4X3EsIDAsIHBub2ItPnJ4X3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggVW5pY2FzdCBSWCBDb21wbCBxdWV1ZQorCSAqLworCXBub2ItPnJ4X2NxX2xlbiA9IEVUSF9VQ19SWENRX0xFTjsKKwlwbm9iLT5yeF9jcV9zaXplID0gIHBub2ItPnJ4X2NxX2xlbiAqCisJCQlzaXplb2Yoc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQKTsKKwlwbm9iLT5yeF9jcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnJ4X2NxX3NpemUsCisJCQkJJnBub2ItPnJ4X2NxX2J1cyk7CisJaWYgKCFwbm9iLT5yeF9jcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+cnhfY3EsIDAsIHBub2ItPnJ4X2NxX3NpemUpOworCisJLyogVFggcmVzb3VyY2VzICovCisJc2l6ZSA9IHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHZvaWQgKiopOworCXBub2ItPnR4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT50eF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCS8qIFJYIHJlc291cmNlcyAqLworCXNpemUgPSBwbm9iLT5yeF9xX2xlbiAqIHNpemVvZih2b2lkICopOworCXBub2ItPnJ4X2N0eHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwbm9iLT5yeF9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNpemUgPSAocG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCXBub2ItPnJ4X3BhZ2VfaW5mbyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2ItPnJ4X3BhZ2VfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhZGFwdGVyLT5ldGhfc3RhdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmV0aF9zdGF0c3AgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBub2ItPnJ4X2J1Zl9zaXplID0gcnhidWZfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBiZV9uZXRfb2JqZWN0IGZvciBzdWJzZXF1ZW50CisgICAgbmV0d29yayBvcGVyYXRpb25zLgorCisgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGRyaXZlciAgbXVzdCBoYXZlIGFsbG9jYXRlZAorICAgIHNwYWNlIGZvciB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZSwgaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSwKKyAgICBhbGxvY2F0ZWQgRE1BYWJsZSBtZW1vcnkgZm9yIGFsbCB0aGUgbmV0d29yayBxdWV1ZXMgdGhhdCBmb3JtCisgICAgcGFydCBvZiB0aGUgTmV0T2JqZWN0IGFuZCBwb3B1bGF0ZWQgdGhlIHN0YXJ0IGFkZHJlc3MgKHZpcnR1YWwpCisgICAgYW5kIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgZWFjaCBxdWV1ZSBpbiB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZS4KKworICAgIFRoZSBkcml2ZXIgbXVzdCBhbHNvIGhhdmUgYWxsb2NhdGVkIG1lbW9yeSB0byBob2xkIHRoZQorICAgIG1haWxib3ggc3RydWN0dXJlIChNQ0NfTUFJTEJPWCkgYW5kIHBvc3QgdGhlIHBoeXNpY2FsIGFkZHJlc3MsCisgICAgdmlydHVhbCBhZGRyZXNzZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtYWlsYm94IG1lbW9yeSBpbiB0aGUKKyAgICBOZXRPYmoubWJfcmQuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IEJFQ0xJQiBmb3IKKyAgICBpbml0aWFsIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZW1iZWRkZWQgTUNDIHByb2Nlc3Nvci4gQkVDTElCCisgICAgdXNlcyB0aGUgbWFpbGJveCB1bnRpbCBNQ0MgcmluZ3MgYXJlIGNyZWF0ZWQgZm9yICBtb3JlICBlZmZpY2llbnQKKyAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIE1DQyBwcm9jZXNzb3IuCisKKyAgICBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIGNyZWF0ZSBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZSBmb3IgbW9yZQorICAgIHRoYW4gb25lIHByb3RlY3Rpb24gZG9tYWluLCBpdCBjYW4gY2FsbCBiZV9jcmVhdGVfbmV0b2JqKCkKKyAgICBtdWx0aXBsZSB0aW1lcyAgb25jZSBmb3IgZWFjaCBwcm90ZWN0aW9uIGRvbWFpbi4gIEEgTWF4aW11bSBvZgorICAgIDMyIHByb3RlY3Rpb24gZG9tYWlucyBhcmUgc3VwcG9ydGVkLgorCisqLworc3RhdGljIGludAorYmVfY3JlYXRlX25ldG9iaihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgdTggX19pb21lbSAqY3NyX3ZhLAorCXU4IF9faW9tZW0gKmRiX3ZhLCB1OCBfX2lvbWVtICpwY2lfdmEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCAgZXZlbnRhYmxlID0gZmFsc2UsIHR4X25vX2RlbGF5ID0gZmFsc2UsIHJ4X25vX2RlbGF5ID0gZmFsc2U7CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0cCA9IE5VTEw7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9ICZwbm9iLT5mbl9vYmo7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwl1MzIgc2V0X3J4YnVmX3NpemU7CisJdTMyIHR4X2NtcGxfd20gPSBDRVZfV01BUktfOTY7CS8qIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCXUzMiByeF9jbXBsX3dtID0gQ0VWX1dNQVJLXzE2MDsJLyogMHhmZmZmZmZmZiB0byBkaXNhYmxlICovCisJdTMyIGVxX2RlbGF5ID0gMDsgLyogZGVsYXkgaW4gOHVzZWMgdW5pdHMuIDB4ZmZmZmZmZmYgdG8gZGlzYWJsZSAqLworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKTsKKworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUoY3NyX3ZhLCBkYl92YSwgcGNpX3ZhLAorCQkJQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLLCAmcG5vYi0+bWJfcmQsIHBmb2IpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIHN0YXR1czsKKwlwbm9iLT5mbl9vYmpfY3JlYXRlZCA9IHRydWU7CisKKwlpZiAodHhfY21wbF93bSA9PSAweGZmZmZmZmZmKQorCQl0eF9ub19kZWxheSA9IHRydWU7CisJaWYgKHJ4X2NtcGxfd20gPT0gMHhmZmZmZmZmZikKKwkJcnhfbm9fZGVsYXkgPSB0cnVlOworCS8qCisJICogbm93IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJpbmdzCisJICogRXZlbnQgUXVldWUgZmlyc3QuCisJICovCisJaWYgKHBub2ItPmV2ZW50X3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+ZXZlbnRfcTsKKwkJcmQucGEgPSBwbm9iLT5ldmVudF9xX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+ZXZlbnRfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX2VxX2NyZWF0ZShwZm9iLCAmcmQsIDQsIHBub2ItPmV2ZW50X3FfbGVuLAorCQkJCSh1MzIpIC0xLAkvKiBDRVZfV01BUktfKiBvciAtMSAqLworCQkJCWVxX2RlbGF5LAkvKiBpbiA4dXMgdW5pdHMsIG9yIC0xICovCisJCQkJJnBub2ItPmV2ZW50X3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisJCXBub2ItPmV2ZW50X3FfaWQgPSBwbm9iLT5ldmVudF9xX29iai5lcV9pZDsKKwkJcG5vYi0+ZXZlbnRfcV9jcmVhdGVkID0gMTsKKwkJZXZlbnRhYmxlID0gdHJ1ZTsKKwkJZXFfb2JqZWN0cCA9ICZwbm9iLT5ldmVudF9xX29iajsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFR4IENvbXBsLiBxdWV1ZS4KKwkgKi8KKwlpZiAocG5vYi0+dHhjcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT50eF9jcTsKKwkJcmQucGEgPSBwbm9iLT50eF9jcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnR4Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCksCisJCQlmYWxzZSwJLyogc29saWN0ZWQgZXZlbnRzLCAgKi8KKwkJCXR4X25vX2RlbGF5LAkvKiBub2RlbGF5ICAqLworCQkJdHhfY21wbF93bSwJLyogV2F0ZXJtYXJrIGVuY29kaW5ncyAqLworCQkJZXFfb2JqZWN0cCwgJnBub2ItPnR4X2NxX29iaik7CisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCWdvdG8gZXJyb3JfcmV0OworCisJCXBub2ItPnR4X2NxX2lkID0gcG5vYi0+dHhfY3Ffb2JqLmNxX2lkOworCQlwbm9iLT50eF9jcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBFdGggVHggcXVldWUKKwkgKi8KKwlpZiAocG5vYi0+dHhfcV9sZW4pIHsKKwkJc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzIGV4X3BhcmFtcyA9IHsgMCB9OworCQl1MzIgdHlwZTsKKworCQlpZiAocG5vYi0+dHhfcV9wb3J0KSB7CisJCQkvKiBUWFEgdG8gYmUgYm91bmQgdG8gYSBzcGVjaWZpYyBwb3J0ICovCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9CT1VORDsKKwkJCWV4X3BhcmFtcy5wb3J0ID0gcG5vYi0+dHhfcV9wb3J0IC0gMTsKKwkJfSBlbHNlCisJCQl0eXBlID0gQkVfRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRDsKKworCQlyZC52YSA9IHBub2ItPnR4X3E7CisJCXJkLnBhID0gcG5vYi0+dHhfcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPnR4X3Ffc2l6ZTsKKworCQlzdGF0dXMgPSBiZV9ldGhfc3FfY3JlYXRlX2V4KHBmb2IsICZyZCwKKwkJCQlwbm9iLT50eF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1dSQl9BTUFQKSwKKwkJCQl0eXBlLCAyLCAmcG5vYi0+dHhfY3Ffb2JqLAorCQkJCSZleF9wYXJhbXMsICZwbm9iLT50eF9xX29iaik7CisKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisKKwkJcG5vYi0+dHhfcV9pZCA9IHBub2ItPnR4X3Ffb2JqLmJpZDsKKwkJcG5vYi0+dHhfcV9jcmVhdGVkID0gMTsKKwl9CisJLyoKKwkgKiBOb3cgRXRoIFJ4IGNvbXBsLiBxdWV1ZS4gIEFsd2F5cyBuZWVkZWQuCisJICovCisJcmQudmEgPSBwbm9iLT5yeF9jcTsKKwlyZC5wYSA9IHBub2ItPnJ4X2NxX2J1czsKKwlyZC5sZW5ndGggPSBwbm9iLT5yeF9jcV9zaXplOworCisJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPnJ4X2NxX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVApLAorCQkJZmFsc2UsCS8qIHNvbGljdGVkIGV2ZW50cywgICovCisJCQlyeF9ub19kZWxheSwJLyogbm9kZWxheSAgKi8KKwkJCXJ4X2NtcGxfd20sCS8qIFdhdGVybWFyayBlbmNvZGluZ3MgKi8KKwkJCWVxX29iamVjdHAsICZwbm9iLT5yeF9jcV9vYmopOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlwbm9iLT5yeF9jcV9pZCA9IHBub2ItPnJ4X2NxX29iai5jcV9pZDsKKwlwbm9iLT5yeF9jcV9jcmVhdGVkID0gMTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9zZXRfZnJhZ19zaXplKHBmb2IsIHBub2ItPnJ4X2J1Zl9zaXplLAorCQkJKHUzMiAqKSAmc2V0X3J4YnVmX3NpemUpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQliZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShwZm9iLCAodTMyICopICZwbm9iLT5yeF9idWZfc2l6ZSk7CisJCWlmICgocG5vYi0+cnhfYnVmX3NpemUgIT0gMjA0OCkgJiYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IDQwOTYpCisJCSAgICAmJiAocG5vYi0+cnhfYnVmX3NpemUgIT0gODE5MikpCisJCQlnb3RvIGVycm9yX3JldDsKKwl9IGVsc2UgeworCQlpZiAocG5vYi0+cnhfYnVmX3NpemUgIT0gc2V0X3J4YnVmX3NpemUpCisJCQlwbm9iLT5yeF9idWZfc2l6ZSA9IHNldF9yeGJ1Zl9zaXplOworCX0KKwkvKgorCSAqIEV0aCBSWCBxdWV1ZS4gYmVfZXRoX3JxX2NyZWF0ZSgpIGFsd2F5cyBhc3N1bWVzIDIgcGFnZXMgc2l6ZQorCSAqLworCXJkLnZhID0gcG5vYi0+cnhfcTsKKwlyZC5wYSA9IHBub2ItPnJ4X3FfYnVzOworCXJkLmxlbmd0aCA9IHBub2ItPnJ4X3Ffc2l6ZTsKKworCXN0YXR1cyA9IGJlX2V0aF9ycV9jcmVhdGUocGZvYiwgJnJkLCAmcG5vYi0+cnhfY3Ffb2JqLAorCQkJICAgICAmcG5vYi0+cnhfY3Ffb2JqLCAmcG5vYi0+cnhfcV9vYmopOworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlnb3RvIGVycm9yX3JldDsKKworCXBub2ItPnJ4X3FfaWQgPSBwbm9iLT5yeF9xX29iai5yaWQ7CisJcG5vYi0+cnhfcV9jcmVhdGVkID0gMTsKKworCXJldHVybiBCRV9TVUNDRVNTOwkvKiBBbGwgcmVxdWlyZWQgcXVldWVzIGNyZWF0ZWQuICovCisKK2Vycm9yX3JldDoKKwliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGJlX25vYl9yaW5nX2luaXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKworCXBub2ItPmV2ZW50X3FfdGwgPSAwOworCisJcG5vYi0+dHhfcV9oZCA9IDA7CisJcG5vYi0+dHhfcV90bCA9IDA7CisKKwlwbm9iLT50eF9jcV90bCA9IDA7CisKKwlwbm9iLT5yeF9jcV90bCA9IDA7CisKKwltZW1zZXQocG5vYi0+ZXZlbnRfcSwgMCwgcG5vYi0+ZXZlbnRfcV9zaXplKTsKKwltZW1zZXQocG5vYi0+dHhfY3EsIDAsIHBub2ItPnR4X2NxX3NpemUpOworCW1lbXNldChwbm9iLT50eF9jdHh0LCAwLCBwbm9iLT50eF9xX2xlbiAqIHNpemVvZih2b2lkICoqKSk7CisJbWVtc2V0KHBub2ItPnJ4X2N0eHQsIDAsIHBub2ItPnJ4X3FfbGVuICogc2l6ZW9mKHZvaWQgKikpOworCXBub2ItPnJ4X3BnX2luZm9faGQgPSAwOworCXBub2ItPnJ4X3FfaGQgPSAwOworCWF0b21pY19zZXQoJnBub2ItPnJ4X3FfcG9zdGVkLCAwKTsKKworCXN0YXR1cyA9IGJlX2NyZWF0ZV9uZXRvYmoocG5vYiwgYWRhcHRlci0+Y3NyX3ZhLCBhZGFwdGVyLT5kYl92YSwKKwkJCQlhZGFwdGVyLT5wY2lfdmEpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJcmV0dXJuIC0xOworCisJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhc3luYyBjYWxsYmFjayBmb3IgbGluayBzdGF0dXMgKi8KK3N0YXRpYyB2b2lkCitiZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjayh2b2lkICpjb250ZXh0LCB1MzIgZXZlbnRfY29kZSwgdm9pZCAqZXZlbnQpCit7CisJc3RydWN0IEFTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCAqbGlua19zdGF0dXMgPSBldmVudDsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRleHQ7CisJYm9vbCBsaW5rX2VuYWJsZSA9IGZhbHNlOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgKmFzeW5jX3RyYWlsZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwl1MzIgYXN5bmNfZXZlbnRfY29kZSwgYXN5bmNfZXZlbnRfdHlwZSwgYWN0aXZlX3BvcnQ7CisJdTMyIHBvcnQwX2xpbmtfc3RhdHVzLCBwb3J0MV9saW5rX3N0YXR1cywgcG9ydDBfZHVwbGV4LCBwb3J0MV9kdXBsZXg7CisJdTMyIHBvcnQwX3NwZWVkLCBwb3J0MV9zcGVlZDsKKworCWlmIChldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSkgeworCQkvKiBOb3Qgb3VyIGV2ZW50IHRvIGhhbmRsZSAqLworCQlyZXR1cm47CisJfQorCWFzeW5jX3RyYWlsZXIgPSAoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqKQorCSAgICAoKHU4ICopIGV2ZW50ICsgc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkgLQorCSAgICAgc2l6ZW9mKHN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVApKTsKKworCWFzeW5jX2V2ZW50X2NvZGUgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLCBldmVudF9jb2RlLAorCQkJCQkgICAgIGFzeW5jX3RyYWlsZXIpOworCUJVR19PTihhc3luY19ldmVudF9jb2RlICE9IEFTWU5DX0VWRU5UX0NPREVfTElOS19TVEFURSk7CisKKwlwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKwluZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwkvKiBEZXRlcm1pbmUgaWYgdGhpcyBldmVudCBpcyBhIHN3aXRjaCBWTEQgb3IgYSBwaHlzaWNhbCBsaW5rIGV2ZW50ICovCisJYXN5bmNfZXZlbnRfdHlwZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsIGV2ZW50X3R5cGUsCisJCQkJCSAgICAgYXN5bmNfdHJhaWxlcik7CisJYWN0aXZlX3BvcnQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlhY3RpdmVfcG9ydCwgbGlua19zdGF0dXMpOworCXBvcnQwX2xpbmtfc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJICAgICAgcG9ydDBfbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MV9saW5rX3N0YXR1cyA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSAgICAgIHBvcnQxX2xpbmtfc3RhdHVzLCBsaW5rX3N0YXR1cyk7CisJcG9ydDBfZHVwbGV4ID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJIHBvcnQwX2R1cGxleCwgbGlua19zdGF0dXMpOworCXBvcnQxX2R1cGxleCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCSBwb3J0MV9kdXBsZXgsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MF9zcGVlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCXBvcnQwX3NwZWVkLCBsaW5rX3N0YXR1cyk7CisJcG9ydDFfc3BlZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQlwb3J0MV9zcGVlZCwgbGlua19zdGF0dXMpOworCWlmIChhc3luY19ldmVudF90eXBlID09IE5UV0tfTElOS19UWVBFX1ZJUlRVQUwpIHsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfbGlua19jaGFuZ2VfdmlydHVhbCsrOworCQlpZiAoYWRhcHRlci0+YmVfbGlua19zdHMtPmFjdGl2ZV9wb3J0ICE9IGFjdGl2ZV9wb3J0KSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQWN0aXZlIHBvcnQgY2hhbmdlZCBkdWUgdG8gVkxEIG9uIHN3aXRjaFxuIik7CisJCX0gZWxzZSB7CisJCQlkZXZfbm90aWNlKCZuZXRkZXYtPmRldiwgIkxpbmsgc3RhdHVzIHVwZGF0ZVxuIik7CisJCX0KKworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2xpbmtfY2hhbmdlX3BoeXNpY2FsKys7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+YWN0aXZlX3BvcnQgIT0gYWN0aXZlX3BvcnQpIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJBY3RpdmUgcG9ydCBjaGFuZ2VkIGR1ZSB0byBwb3J0IGxpbmsiCisJCQkgICAgICAgIiBzdGF0dXMgY2hhbmdlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LCAiTGluayBzdGF0dXMgdXBkYXRlXG4iKTsKKwkJfQorCX0KKworCW1lbXNldChhZGFwdGVyLT5iZV9saW5rX3N0cywgMCwgc2l6ZW9mKGFkYXB0ZXItPmJlX2xpbmtfc3RzKSk7CisKKwlpZiAoKHBvcnQwX2xpbmtfc3RhdHVzID09IEFTWU5DX0VWRU5UX0xJTktfVVApIHx8CisJICAgIChwb3J0MV9saW5rX3N0YXR1cyA9PSBBU1lOQ19FVkVOVF9MSU5LX1VQKSkgeworCQlpZiAoKGFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSAmJgorCQkgICAgKGFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19ET1dOKSkgeworCQkJLyogRWFybGllciBib3RoIHRoZSBwb3J0cyBhcmUgZG93biBTbyBsaW5rIGlzIHVwICovCisJCQlsaW5rX2VuYWJsZSA9IHRydWU7CisJCX0KKworCQlpZiAocG9ydDBfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9kdXBsZXggPSBwb3J0MF9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCA9IHBvcnQwX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9BKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDA7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlpZiAocG9ydDFfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgeworCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXggPSBwb3J0MV9kdXBsZXg7CisJCQlhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9zcGVlZCA9IHBvcnQxX3NwZWVkOworCQkJaWYgKGFjdGl2ZV9wb3J0ID09IE5UV0tfUE9SVF9CKQorCQkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCA9IDE7CisJCX0gZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlwcmludGsoS0VSTl9JTkZPICJMaW5rIFByb3BlcnRpZXMgZm9yICVzOlxuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiTGluayBQcm9wZXJ0aWVzOlxuIik7CisJCWJlX3ByaW50X2xpbmtfaW5mbyhhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisKKwkJaWYgKCFsaW5rX2VuYWJsZSkKKwkJCXJldHVybjsKKwkJLyoKKwkJICogQm90aCBwb3J0cyB3ZXJlIGRvd24gcHJldmlvdXNseSwgYnV0IGF0bGVhc3Qgb25lIG9mCisJCSAqIHRoZW0gaGFzIGNvbWUgdXAgaWYgdGhpcyBuZXRkZXZpY2UncyBjYXJyaWVyIGlzIG5vdCB1cCwKKwkJICogdGhlbiBpbmRpY2F0ZSB0byBzdGFjaworCQkgKi8KKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIE5vdyBib3RoIHRoZSBwb3J0cyBhcmUgZG93bi4gVGVsbCB0aGUgc3RhY2sgYWJvdXQgaXQgKi8KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJCb3RoIHBvcnRzIGFyZSBkb3duXG4iKTsKKwlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCWFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBiZV9tY2NfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCisJcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisJLyoKKwkgKiBDcmVhdGUgdGhlIE1DQyByaW5nIHNvIHRoYXQgYWxsIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aXRoCisJICogTUNDIGNhbiBnbyB0aHJ1IHRoZSByaW5nLiB3ZSBkbyB0aGlzIGF0IHRoZSBlbmQgc2luY2UKKwkgKiB3ZSBkbyBub3Qgd2FudCB0byBiZSBkZWFsaW5nIHdpdGggaW50ZXJydXB0cyB1bnRpbCB0aGUKKwkgKiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwlwbm9iLT5tY2NfcV9sZW4gPSBNQ0NfUV9MRU47CisJcG5vYi0+bWNjX3Ffc2l6ZSA9IHBub2ItPm1jY19xX2xlbiAqIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKTsKKwlwbm9iLT5tY2NfcSA9ICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5tY2NfcV9zaXplLAorCQkJCSZwbm9iLT5tY2NfcV9idXMpOworCWlmICghcG5vYi0+bWNjX3FfYnVzKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBzcGFjZSBmb3IgTUNDIFdSQiBjb250ZXh0CisJICovCisJcG5vYi0+bWNjX3dyYl9jdHh0TGVuID0gTUNDX1FfTEVOOworCXBub2ItPm1jY193cmJfY3R4dF9zaXplID0gIHBub2ItPm1jY193cmJfY3R4dExlbiAqCisJCXNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0KTsKKwlwbm9iLT5tY2Nfd3JiX2N0eHQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJZ2V0X29yZGVyKHBub2ItPm1jY193cmJfY3R4dF9zaXplKSk7CisJaWYgKHBub2ItPm1jY193cmJfY3R4dCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJLyoKKwkgKiBTcGFjZSBmb3IgTUNDIGNvbXBsLiByaW5nCisJICovCisJcG5vYi0+bWNjX2NxX2xlbiA9IE1DQ19DUV9MRU47CisJcG5vYi0+bWNjX2NxX3NpemUgPSBwbm9iLT5tY2NfY3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCk7CisJcG5vYi0+bWNjX2NxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWNjX2NxX3NpemUsCisJCQkJJnBub2ItPm1jY19jcV9idXMpOworCWlmICghcG5vYi0+bWNjX2NxX2J1cykKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgTUNDIHJlcXVlc3QgYW5kIGNvbXBsZXRpb24gcmluZyByZXF1aXJlZAorICAgIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEFSTSBwcm9jZXNzb3IuICBUaGUgY2FsbGVyIG11c3QgaGF2ZQorICAgIGFsbG9jYXRlZCByZXF1aXJlZCBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUgTUNDIHJpbmcgYW5kIE1DQworICAgIGNvbXBsZXRpb24gcmluZyBhbmQgcG9zdGVkIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIG51bWJlciBvZgorICAgIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVycyAobWNjX3EgYW5kIG1jY19jcSkgaW4gdGhlCisgICAgTmV0T2JqZWN0IHN0cnV0dXJlLgorCisgICAgV2hlbiB0aGlzIGNhbGwgaXMgY29tcGxldGVkLCBhbGwgZnVydGhlciBjb21tdW5pY2F0aW9uIHdpdGgKKyAgICBBUk0gd2lsbCBzd2l0Y2ggZnJvbSBtYWlsYm94IHRvIHRoaXMgcmluZy4KKworICAgIHBub2IJLSBQb2ludGVyIHRvIHRoZSBOZXRPYmplY3Qgc3RydWN0dXJlLiBUaGlzIE5ldE9iamVjdCBzaG91bGQKKwkJICBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBhIHByZXZpb3VzIGNhbGwgdG8gYmVfY3JlYXRlX25ldG9iaigpCisqLworaW50IGJlX2NyZWF0ZV9tY2NfcmluZ3Moc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHJpbmdfZGVzYyByZDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gJnBub2ItPmZuX29iajsKKworCW1lbXNldCgmcmQsIDAsIHNpemVvZihzdHJ1Y3QgcmluZ19kZXNjKSk7CisJaWYgKHBub2ItPm1jY19jcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT5tY2NfY3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX2NxX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+bWNjX2NxX3NpemU7CisKKwkJc3RhdHVzID0gYmVfY3FfY3JlYXRlKHBmb2IsICZyZCwKKwkJCXBub2ItPm1jY19jcV9sZW4gKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSwKKwkJCWZhbHNlLAkvKiBzb2xpY3RlZCBldmVudHMsICAqLworCQkJdHJ1ZSwJLyogbm9kZWxheSAgKi8KKwkJCTAsCS8qIDAgV2F0ZXJtYXJrIHNpbmNlIE5vZGVsYXkgaXMgdHJ1ZSAqLworCQkJJnBub2ItPmV2ZW50X3Ffb2JqLAorCQkJJnBub2ItPm1jY19jcV9vYmopOworCisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJcG5vYi0+bWNjX2NxX2lkID0gcG5vYi0+bWNjX2NxX29iai5jcV9pZDsKKwkJcG5vYi0+bWNjX2NxX2NyZWF0ZWQgPSAxOworCX0KKwlpZiAocG5vYi0+bWNjX3FfbGVuKSB7CisJCXJkLnZhID0gcG5vYi0+bWNjX3E7CisJCXJkLnBhID0gcG5vYi0+bWNjX3FfYnVzOworCQlyZC5sZW5ndGggPSBwbm9iLT5tY2NfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX21jY19yaW5nX2NyZWF0ZShwZm9iLCAmcmQsCisJCQkJcG5vYi0+bWNjX3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLAorCQkJCXBub2ItPm1jY193cmJfY3R4dCwgcG5vYi0+bWNjX3dyYl9jdHh0TGVuLAorCQkJCSZwbm9iLT5tY2NfY3Ffb2JqLCAmcG5vYi0+bWNjX3Ffb2JqKTsKKworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXBub2ItPm1jY19xX2NyZWF0ZWQgPSAxOworCX0KKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBiZV9tY2NfaW5pdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgcjsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYjsKKworCXBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCW1lbXNldChwbm9iLT5tY2NfcSwgMCwgcG5vYi0+bWNjX3Ffc2l6ZSk7CisJcG5vYi0+bWNjX3FfaGQgPSAwOworCisJbWVtc2V0KHBub2ItPm1jY193cmJfY3R4dCwgMCwgcG5vYi0+bWNjX3dyYl9jdHh0X3NpemUpOworCisJbWVtc2V0KHBub2ItPm1jY19jcSwgMCwgcG5vYi0+bWNjX2NxX3NpemUpOworCXBub2ItPm1jY19jcV90bCA9IDA7CisKKwlyID0gYmVfY3JlYXRlX21jY19yaW5ncyhhZGFwdGVyLT5uZXRfb2JqKTsKKwlpZiAociAhPSBCRV9TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyOworCisJYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWFkYXB0ZXIpCisJCXJldHVybjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwbm9iID0gKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopYWRhcHRlci0+bmV0X29iajsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlpZiAocG5vYikgeworCQkvKiBVbnJlZ2lzdGVyIGFzeW5jIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsaW5rIHN0YXR1cyB1cGRhdGVzICovCisJCWlmIChwbm9iLT5tY2NfcV9jcmVhdGVkKQorCQkJYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjaygmcG5vYi0+bWNjX3Ffb2JqLAorCQkJCQkJCQlOVUxMLCBOVUxMKTsKKwkJbmV0b2JqZWN0X2NsZWFudXAoYWRhcHRlciwgcG5vYik7CisJfQorCisJaWYgKGFkYXB0ZXItPmNzcl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5jc3JfdmEpOworCWlmIChhZGFwdGVyLT5kYl92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5kYl92YSk7CisJaWYgKGFkYXB0ZXItPnBjaV92YSkKKwkJaW91bm1hcChhZGFwdGVyLT5wY2lfdmEpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhhZGFwdGVyLT5wZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoYWRhcHRlci0+cGRldik7CisKKwlrZnJlZShhZGFwdGVyLT5iZV9saW5rX3N0cyk7CisJa2ZyZWUoYWRhcHRlci0+ZXRoX3N0YXRzcCk7CisKKwlpZiAoYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdHNfdGltZXIuZnVuY3Rpb24pCisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJa2ZyZWUoYWRhcHRlcik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1Yi1zeXN0ZW0gd2hlbiBpdCBmaW5kcyBhIFBDSQorICogZGV2aWNlIHdpdGggZGV2L3ZlbmRvciBJRHMgdGhhdCBtYXRjaCB3aXRoIG9uZSBvZiBvdXIgZGV2aWNlcy4KKyAqIEFsbCBvZiB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBiZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBkZXZfaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEIGdldF9md3Y7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGJlX2RyaXZlcl9uYW1lKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycm9yX3BjaV9yZXE7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJlX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfYWRhcHRlcjsKKwl9CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX05PTkU7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJYWRhcHRlci0+ZW5hYmxlX2FpYyA9IDE7CisJYWRhcHRlci0+bWF4X2VxZCA9IE1BWF9FUUQ7CisJYWRhcHRlci0+bWluX2VxZCA9IDA7CisJYWRhcHRlci0+Y3VyX2VxZCA9IDA7CisKKwlzdGF0dXMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwlpZiAoIXN0YXR1cykgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5kbWFfNjRiaXRfY2FwID0gZmFsc2U7CisJCXN0YXR1cyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHNldCBQQ0kgRE1BIE1hc2tcbiIpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJc3RhdHVzID0gaW5pdF9wY2lfYmVfZnVuY3Rpb24oYWRhcHRlciwgcGRldik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBQQ0kgQkFSU1xuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwliZV90cmFjZV9zZXRfbGV2ZWwoRExfQUxXQVlTIHwgRExfRVJSKTsKKworCWFkYXB0ZXItPmJlX2xpbmtfc3RzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IEJFX0xJTktfU1RBVFVTKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGluayBzdGF0dXMgIgorCQkgICAgICAgImJ1ZmZlciBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eHFfbG9jayk7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJlX25ldF9vYmplY3QpKTsKKwlpZiAobmV0ZGV2ID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5uZXRfb2JqID0gcG5vYjsKKwlhZGFwdGVyLT5uZXRkZXZwID0gbmV0ZGV2OworCXBub2ItPmFkYXB0ZXIgPSBhZGFwdGVyOworCXBub2ItPm5ldGRldiA9IG5ldGRldjsKKworCXN0YXR1cyA9IGJlX25vYl9yaW5nX2FsbG9jKGFkYXB0ZXIsIHBub2IpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisJCWZhbHNlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwluZXRkZXYtPmluaXQgPSAmYmVuZXRfaW5pdDsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJihhZGFwdGVyLT5wZGV2LT5kZXYpKTsKKworCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJnBub2ItPm5hcGksIGJlX3BvbGwsIDY0KTsKKworCS8qIGlmIHRoZSByeF9mcmFnIHNpemUgaWYgMkssIG9uZSBwYWdlIGlzIHNoYXJlZCBhcyB0d28gUlggZnJhZ3MgKi8KKwlwbm9iLT5yeF9wZ19zaGFyZWQgPQorCQkocG5vYi0+cnhfYnVmX3NpemUgPD0gUEFHRV9TSVpFIC8gMikgPyB0cnVlIDogZmFsc2U7CisJaWYgKHBub2ItPnJ4X2J1Zl9zaXplICE9IHJ4YnVmX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkNvdWxkIG5vdCBzZXQgUnggYnVmZmVyIHNpemUgdG8gJWQuIFVzaW5nICVkXG4iLAorCQkJCSAgICAgICByeGJ1Zl9zaXplLCBwbm9iLT5yeF9idWZfc2l6ZSk7CisJCXJ4YnVmX3NpemUgPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl9CisKKwl0YXNrbGV0X2luaXQoJihhZGFwdGVyLT5zdHNfaGFuZGxlciksIGJlX3Byb2Nlc3NfaW50ciwKKwkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwlhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQgPSAxOworCXNwaW5fbG9ja19pbml0KCYoYWRhcHRlci0+aW50X2xvY2spKTsKKworCXN0YXR1cyA9IGJlX3JlZ2lzdGVyX2lzcihhZGFwdGVyLCBwbm9iKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCWFkYXB0ZXItPnJ4X2NzdW0gPSAxOworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJbWVtc2V0KCZnZXRfZnd2LCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRHJpdmVyIHZlcnNpb246JXMuICIKKwkgICAgICAgIkNvcHlyaWdodCBTZXJ2ZXJFbmdpbmVzLCBDb3Jwb3JhdGlvbiAyMDA1IC0gMjAwOFxuIiwKKwkJCSAgICAgICBiZV9kcnZyX3Zlcik7CisJc3RhdHVzID0gYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24oJnBub2ItPmZuX29iaiwgJmdldF9md3YsIE5VTEwsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpIHsKKwkJc3RybmNweShiZV9md192ZXIsIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcsIDMyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhZGVFbmdpbmUgRmlybXdhcmUgVmVyc2lvbjolc1xuIiwKKwkJICAgICAgIGdldF9md3YuZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBnZXQgQkUgRmlybXdhcmUgVmVyc2lvblxuIik7CisJfQorCisJc2VtYV9pbml0KCZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtLCAwKTsKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lcik7CisJYXRvbWljX3NldCgmYWRhcHRlci0+dGltZXJfY3R4dC5nZXRfc3RhdF9mbGFnLCAwKTsKKwlhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lci5mdW5jdGlvbiA9CisJICAgICZiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcjsKKworCXN0YXR1cyA9IGJlX21jY19jcmVhdGUoYWRhcHRlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gY2xlYW51cDsKKwlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbnVwOworCisKKwlzdGF0dXMgPSBiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKCZhZGFwdGVyLT5uZXRfb2JqLT5tY2NfcV9vYmosCisJCQkgYmVfbGlua19zdGF0dXNfYXN5bmNfY2FsbGJhY2ssICh2b2lkICopYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkZF9hc3luY19ldmVudF9jYWxsYmFjayBmYWlsZWQiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCX0KKworCXN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfSU5JVDsKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwliZV9yZW1vdmUocGRldik7CisJcmV0dXJuIHN0YXR1czsKK2Vycm9yX2FkYXB0ZXI6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycm9yX3BjaV9yZXE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyb3I6CisJcHJpbnRrKEtFUk5fRVJSICJCbGFkZUVuZ2luZSBpbml0YWxpemF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBsaW5rIHN0YXR1cyBhbmQgcHJpbnQgdGhlIHN0YXR1cyBvbiBjb25zb2xlCisgKi8KK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCisJc3RhdHVzID0gYmVfcnhmX2xpbmtfc3RhdHVzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmJlX2xpbmtfc3RzLCBOVUxMLAorCQkJTlVMTCwgTlVMTCk7CisJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKSB7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9zcGVlZCAmJgorCQkgICAgYWRhcHRlci0+YmVfbGlua19zdHMtPm1hYzBfZHVwbGV4KQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfVVA7CisJCWVsc2UKKwkJCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisKKwkJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX3NwZWVkICYmCisJCSAgICBhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMV9kdXBsZXgpCisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJZWxzZQorCQkJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJMaW5rIFByb3BlcnRpZXM6XG4iKTsKKwkJYmVfcHJpbnRfbGlua19pbmZvKGFkYXB0ZXItPmJlX2xpbmtfc3RzKTsKKwkJcmV0dXJuOworCX0KKwlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IGxpbmsgc3RhdHVzXG4iKTsKKwlyZXR1cm47Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQKK2JlX3BtX2NsZWFudXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJICAgICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwliZV93YWl0X25pY190eF9jbXBseF9jbXBsKHBub2IpOworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKworCWlmIChhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQpIHsKKwkJdGFza2xldF9raWxsKCZhZGFwdGVyLT5zdHNfaGFuZGxlcik7CisJCWFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCA9IDA7CisJfQorCisJYmVfdW5yZWdpc3Rlcl9pc3IoYWRhcHRlcik7CisJYmVfZGlzYWJsZV9pbnRyKHBub2IpOworCisJYmVfdHhfcV9jbGVhbihwbm9iKTsKKwliZV9yeF9xX2NsZWFuKHBub2IpOworCisJYmVfZGVzdHJveV9uZXRvYmoocG5vYik7Cit9CisKK3N0YXRpYyBpbnQgYmVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAgYWRhcHRlci0+bmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhZGFwdGVyLT5kZXZfcG1fc3RhdGUgPSBhZGFwdGVyLT5kZXZfc3RhdGU7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX1NVU1BFTkQ7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYmVfcG1fY2xlYW51cChhZGFwdGVyLCBwbm9iLCBuZXRkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsJLyogRDMgQ29sZCA9IDQgKi8KKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3VwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKworCWlmIChwbm9iLT5udW1fdmxhbnMgIT0gMCkKKwkJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQlwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBiZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXZwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMCk7CS8qIDQgaXMgRDMgY29sZCAqLworCisJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBmYWxzZSwKKwkJCWZhbHNlLCB0cnVlLCBmYWxzZSwgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwkJc3RhdHVzID0gYmVfbm9iX3JpbmdfaW5pdChhZGFwdGVyLCBwbm9iKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCXRhc2tsZXRfaW5pdCgmKGFkYXB0ZXItPnN0c19oYW5kbGVyKSwgYmVfcHJvY2Vzc19pbnRyLAorCQkJICAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMTsKKworCQlpZiAoYmVfcmVnaXN0ZXJfaXNyKGFkYXB0ZXIsIHBub2IpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfcmVnaXN0ZXJfaXNyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKworCQlzdGF0dXMgPSBiZV9tY2NfaW5pdChhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmVfbWNjX2luaXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJYmVfdXBkYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCQkvKgorCQkgKiBSZWdpc3RlciBhc3luYyBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGxpbmsKKwkJICogc3RhdHVzIHVwZGF0ZXMKKwkJICovCisJCXN0YXR1cyA9IGJlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soCisJCQkJJmFkYXB0ZXItPm5ldF9vYmotPm1jY19xX29iaiwKKwkJCQliZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjaywgKHZvaWQgKilhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2sgZmFpbGVkIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkxpbmsgc3RhdHVzIGNoYW5nZXMgbWF5IG5vdCBiZSByZWZsZWN0ZWRcbiIpOworCQl9CisJCWJlX2VuYWJsZV9pbnRyKHBub2IpOworCQliZV9lbmFibGVfZXFfaW50cihwbm9iKTsKKwkJYmVfdXAoYWRhcHRlcik7CisJfQorCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBhZGFwdGVyLT5kZXZfcG1fc3RhdGU7CisJcmV0dXJuIDA7CisKK30KKworI2VuZGlmCisKKy8qIFdhaXQgdW50aWwgbm8gbW9yZSBwZW5kaW5nIHRyYW5zbWl0cyAgKi8KK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgaTsKKworCS8qIFdhaXQgZm9yIDIwdXMgKiA1MDAwMCAoPSAxcykgYW5kIG5vIG1vcmUgKi8KKwlpID0gMDsKKwl3aGlsZSAoKHBub2ItPnR4X3FfdGwgIT0gcG5vYi0+dHhfcV9oZCkgJiYgKGkgPCA1MDAwMCkpIHsKKwkJKytpOworCQl1ZGVsYXkoMjApOworCX0KKworCS8qIENoZWNrIGZvciBubyBtb3JlIHBlbmRpbmcgdHJhbnNtaXRzICovCisJaWYgKGkgPj0gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkRpZCBub3QgcmVjZWl2ZSBjb21wbGV0aW9ucyBmb3IgYWxsIFRYIHJlcXVlc3RzXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiZV9kcml2ZXIgPSB7CisJLm5hbWUgPSBiZV9kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBiZV9kZXZpY2VfaWRfdGFibGUsCisJLnByb2JlID0gYmVfcHJvYmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBiZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBiZV9yZXN1bWUsCisjZW5kaWYKKwkucmVtb3ZlID0gYmVfcmVtb3ZlCit9OworCisvKgorICogTW9kdWxlIGluaXQgZW50cnkgcG9pbnQuIFJlZ2lzdGVycyBvdXIgb3VyIGRldmljZSBhbmQgcmV0dXJuLgorICogT3VyIHByb2JlIHdpbGwgYmUgY2FsbGVkIGlmIHRoZSBkZXZpY2UgaXMgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJlX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChyeGJ1Zl9zaXplICE9IDgxOTIgJiYgcnhidWZfc2l6ZSAhPSA0MDk2ICYmIHJ4YnVmX3NpemUgIT0gMjA0OCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiVW5zdXBwb3J0ZWQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoJWQpIHJlcXVlc3RlZFxuIiwKKwkJICAgICAgIHJ4YnVmX3NpemUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTXVzdCBiZSAyMDQ4LCA0MDk2IG9yIDgxOTIuIERlZmF1bHRpbmcgdG8gMjA0OFxuIik7CisJCXJ4YnVmX3NpemUgPSAyMDQ4OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CisKKy8qCisgKiBiZV9leGl0X21vZHVsZSAtIERyaXZlciBFeGl0IENsZWFudXAgUm91dGluZQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYmVfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGJlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE5NWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2ludC5jCkBAIC0wLDAgKzEsODYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfbHJvLmg+CisKKyNpbmNsdWRlICJiZW5ldC5oIgorCisvKiBudW1iZXIgb2YgYnl0ZXMgb2YgUlggZnJhbWUgdGhhdCBhcmUgY29waWVkIHRvIHNrYi0+ZGF0YSAqLworI2RlZmluZSBCRV9IRFJfTEVOIDY0CisKKyNkZWZpbmUgTkVUSUZfUlgoc2tiKSBuZXRpZl9yZWNlaXZlX3NrYihza2IpCisjZGVmaW5lIFZMQU5fQUNDRUxfUlgoc2tiLCBwbm9iLCB2dCkgXAorCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBwbm9iLT52bGFuX2dycCwgdnQpCisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24KKyAgICBlbnRyaWVzIHByb2Nlc3NlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY29tcGxldGlvbiBxdWV1ZSBieSB3cml0aW5nCisgICAgdGhlIG51bWJlciBvZiBwb3BwZWQgZW50cmllcyB0byB0aGUgZG9vciBiZWxsLgorCisgICAgcG5vYgktIFBvaW50ZXIgdG8gdGhlIE5ldE9iamVjdCBzdHJ1Y3R1cmUKKyAgICBuCQktIE51bWJlciBvZiBjb21wbGV0aW9uIGVudHJpZXMgcHJvY2Vzc2VkCisgICAgY3FfaWQJLSBRdWV1ZSBJRCBvZiB0aGUgY29tcGxldGlvbiBxdWV1ZSBmb3Igd2hpY2ggbm90aWZpY2F0aW9uCisJCQlpcyBiZWluZyBkb25lLgorICAgIHJlX2FybQktIDEgIC0gcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudC4KKwkJLSAwICAtIGRvbnQgcmVhcm0gdGhlIGNvbXBsZXRpb24gcmluZyB0byBnZW5lcmF0ZSBhbiBldmVudAorKi8KK3ZvaWQgYmVfbm90aWZ5X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgY3FfaWQsIGludCByZV9hcm0pCit7CisJc3RydWN0IENRX0RCX0FNQVAgY3FkYjsKKworCWNxZGIuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZjcWRiLCBjcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmY3FkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmNxZGIsIG4pOworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBjcWRiLmR3WzBdKTsKK30KKworLyoKKyAqIGFkZHMgYWRkaXRpb25hbCByZWNlaXZlIGZyYWdzIGluZGljYXRlZCBieSBCRSBzdGFydGluZyBmcm9tIGdpdmVuCisgKiBmcmFnIGluZGV4IChmaSkgdG8gc3BlY2lmaWVkIHNrYidzIGZyYWcgbGlzdAorICovCitzdGF0aWMgdm9pZAorYWRkX3NrYl9mcmFncyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICB1MzIgbnJlc2lkLCB1MzIgZmkpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBza19mcmFnX2lkeCwgbjsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKworCXNrX2ZyYWdfaWR4ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl3aGlsZSAobnJlc2lkKSB7CisJCWluZGV4X2luYygmZmksIHBub2ItPnJ4X3FfbGVuKTsKKworCQlyeF9wYWdlX2luZm8gPSAoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqKXBub2ItPnJ4X2N0eHRbZmldOworCQlwbm9iLT5yeF9jdHh0W2ZpXSA9IE5VTEw7CisJCWlmICgocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgfHwKKwkJICAgIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2UgPSByeF9wYWdlX2luZm8tPnBhZ2U7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnBhZ2Vfb2Zmc2V0CisJCSAgICA9IHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQ7CisJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbc2tfZnJhZ19pZHhdLnNpemUgPSBuOworCisJCXNrX2ZyYWdfaWR4Kys7CisJCXNrYi0+bGVuICs9IG47CisJCXNrYi0+ZGF0YV9sZW4gKz0gbjsKKwkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCQlucmVzaWQgLT0gbjsKKworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgaW5jb21pbmcgbmljIHBhY2tldHMgb3ZlciB2YXJpb3VzIFJ4IHF1ZXVlcy4KKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkYXB0ZXIsIHRoZSBjdXJyZW50IFJ4IHN0YXR1cyBkZXNjcmlwdG9yCisgKiBlbnRyeSBhbmQgdGhlIFJ4IGNvbXBsZXRpb24gcXVldWUgSUQgYXMgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24oc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsCisJCQkJCSAgICBzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3ApCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHVkcGNrc20sIHRjcGNrc207CisJaW50IG47CisJdTMyIG5yZXNpZCwgZmk7CisJdTMyIGZyYWdfc3ogPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwl1OCAqdmE7CisJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCXUzMiBudW1mcmFncywgdnRwLCB2dG0sIHZsYW5fdGFnLCBwa3RzaXplOworCisJZmkgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGZyYWduZHgsIHJ4Y3ApOworCUJVR19PTihmaSA+PSAoaW50KXBub2ItPnJ4X3FfbGVuKTsKKwlCVUdfT04oZmkgPCAwKTsKKworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gTlVMTDsKKworCS8qCisJICogSWYgb25lIHBhZ2UgaXMgdXNlZCBwZXIgZnJhZ21lbnQgb3IgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIGhhbGYgb2YKKwkgKiAgb2YgdGhlIHBhZ2UsIHVubWFwIHRoZSBwYWdlIGhlcmUKKwkgKi8KKwlpZiAoKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQpIHx8IChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpKSB7CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLCBmcmFnX3N6LAorCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCisJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCXVkcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHVkcGNrc20sIHJ4Y3ApOworCXRjcGNrc20gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHRjcGNrc20sIHJ4Y3ApOworCXBrdHNpemUgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHBrdHNpemUsIHJ4Y3ApOworCS8qCisJICogZ2V0IHJpZCBvZiBSWCBmbHVzaCBjb21wbGV0aW9ucyBmaXJzdC4KKwkgKi8KKwlpZiAoKHRjcGNrc20pICYmICh1ZHBja3NtKSAmJiAocGt0c2l6ZSA9PSAzMikpIHsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJcmV0dXJuIDA7CisJfQorCXNrYiA9IG5ldGRldl9hbGxvY19za2IocG5vYi0+bmV0ZGV2LCBCRV9IRFJfTEVOICsgTkVUX0lQX0FMSUdOKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LCAiYWxsb2Nfc2tiKCkgZmFpbGVkXG4iKTsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJZ290byBmcmVlX2ZyYWdzOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwlza2ItPmRldiA9IHBub2ItPm5ldGRldjsKKworCW4gPSBtaW4ocGt0c2l6ZSwgZnJhZ19zeik7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisKKwlza2ItPmxlbiA9IG47CisJc2tiLT5kYXRhX2xlbiA9IG47CisJaWYgKG4gPD0gQkVfSERSX0xFTikgeworCQltZW1jcHkoc2tiLT5kYXRhLCB2YSwgbik7CisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCXNrYi0+ZGF0YV9sZW4gLT0gbjsKKwkJc2tiLT50YWlsICs9IG47CisJfSBlbHNlIHsKKworCQkvKiBTZXR1cCB0aGUgU0tCIHdpdGggcGFnZSBidWZmZXIgaW5mb3JtYXRpb24gKi8KKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKys7CisKKwkJLyogQ29weSB0aGUgaGVhZGVyIGludG8gdGhlIHNrYl9kYXRhICovCisJCW1lbWNweShza2ItPmRhdGEsIHZhLCBCRV9IRFJfTEVOKTsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlX29mZnNldCA9CisJCSAgICByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0ICsgQkVfSERSX0xFTjsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplID0gbiAtIEJFX0hEUl9MRU47CisJCXNrYi0+ZGF0YV9sZW4gLT0gQkVfSERSX0xFTjsKKwkJc2tiLT50YWlsICs9IEJFX0hEUl9MRU47CisJfQorCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJbnJlc2lkID0gcGt0c2l6ZSAtIG47CisKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwbm9iLT5uZXRkZXYpOworCisJaWYgKCh0Y3Bja3NtIHx8IHVkcGNrc20pICYmIGFkYXB0ZXItPnJ4X2NzdW0pCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJLyoKKwkgKiBpZiB3ZSBoYXZlIG1vcmUgYnl0ZXMgbGVmdCwgdGhlIGZyYW1lIGhhcyBiZWVuCisJICogZ2l2ZW4gdG8gdXMgaW4gbXVsdGlwbGUgZnJhZ21lbnRzLiAgVGhpcyBoYXBwZW5zCisJICogd2l0aCBKdW1ibyBmcmFtZXMuIEFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cyB0bworCSAqIHNrYi0+ZnJhZ3NbXSBhcnJheS4KKwkgKi8KKwlpZiAobnJlc2lkKQorCQlhZGRfc2tiX2ZyYWdzKHBub2IsIHNrYiwgbnJlc2lkLCBmaSk7CisKKwkvKiB1cGRhdGUgdGhlIHRoZSB0cnVlIHNpemUgb2YgdGhlIHNrYi4gKi8KKwlza2ItPnRydWVzaXplID0gc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCisJLyoKKwkgKiBJZiBhIDgwMi4zIGZyYW1lIG9yIDgwMi4yIExMQyBmcmFtZQorCSAqIChpLmUpIGNvbnRhaW5zIGxlbmd0aCBmaWVsZCBpbiBNQUMgSGRyCisJICogYW5kIGZyYW1lIGxlbiBpcyBncmVhdGVyIHRoYW4gNjQgYnl0ZXMKKwkgKi8KKwlpZiAoKChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8yKSkgfHwKKwkgICAgIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8zKSkpCisJICAgICYmIChwa3RzaXplID4gQkVfSERSX0xFTikpIHsKKwkJLyoKKwkJICogSWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGxlc3MgdGhhbiBmcmFtZSBzaXplCisJCSAqIEVycmFuZW91cyBmcmFtZSwgRHJvcCBpdAorCQkgKi8KKwkJaWYgKChudG9ocygqKHUxNiAqKSAodmEgKyAxMikpICsgRVRIX0hMRU4pIDwgcGt0c2l6ZSkgeworCQkJLyogSW5jcmVtZW50IE5vbiBFdGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkICovCisJCQlhZGFwdGVyLT5iZV9zdGF0LmJlc184MDJfM19kcm9wcGVkX2ZyYW1lcysrOworCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIGVsc2UgaWYgdGhlIGxlbmd0aCBnaXZlbiBpbiBNYWMgSGRyIGlzIGdyZWF0ZXIgdGhhbgorCQkgKiBmcmFtZSBzaXplLCBzaG91bGQgbm90IGJlIHNlZWluZyB0aGlzIHNvcnQgb2YgZnJhbWVzCisJCSAqIGR1bXAgdGhlIHBrdCBhbmQgcGFzcyB0byBzdGFjaworCQkgKi8KKwkJZWxzZSBpZiAoKG50b2hzKCoodTE2ICopICh2YSArIDEyKSkgKyBFVEhfSExFTikgPiBwa3RzaXplKSB7CisJCQkvKiBJbmNyZW1lbnQgTm9uIEV0aGVyIHR5cGUgSUkgZnJhbWVzIG1hbGZvcm1lZCAqLworCQkJYWRhcHRlci0+YmVfc3RhdC5iZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lcysrOworCQl9CisJfQorCisJdnRwID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2dHAsIHJ4Y3ApOworCXZ0bSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRtLCByeGNwKTsKKwlpZiAodnRwICYmIHZ0bSkgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkgeworCQkJLyogQnV0IHdlIGhhdmUgbm8gVkxBTnMgY29uZmlndXJlZC4KKwkJCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIERyb3AgdGhlIHBhY2tldC4KKwkJCSAqLworCQkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJCbGFkZUVuZ2luZTogVW5leHBlY3RlZCB2bGFuIHRhZ2dlZCBwYWNrZXRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQl2bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmxhbl90YWcsIHJ4Y3ApOworCQlWTEFOX0FDQ0VMX1JYKHNrYiwgcG5vYiwgYmUxNl90b19jcHUodmxhbl90YWcpKTsKKworCX0gZWxzZSB7CisJCU5FVElGX1JYKHNrYik7CisJfQorCXJldHVybiAwOworCitmcmVlX2ZyYWdzOgorCS8qIGZyZWUgYWxsIGZyYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCByeGNwICovCisJbnVtZnJhZ3MgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIG51bWZyYWdzLCByeGNwKTsKKwl3aGlsZSAobnVtZnJhZ3MtLSA+IDEpIHsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopCisJCSAgICBwbm9iLT5yeF9jdHh0W2ZpXTsKKwkJcG5vYi0+cnhfY3R4dFtmaV0gPSAodm9pZCAqKU5VTEw7CisJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0IHx8ICFwbm9iLT5yeF9wZ19zaGFyZWQpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkgICAgICAgZnJhZ19zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCWF0b21pY19kZWMoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb25fbHJvKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgIHN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCByeF9mcmFnc1tCRV9NQVhfRlJBR1NfUEVSX0ZSQU1FXTsKKwl1bnNpZ25lZCBpbnQgdWRwY2tzbSwgdGNwY2tzbTsKKwl1MzIgbnVtZnJhZ3MsIHZsYW5mLCB2dG0sIHZsYW5fdGFnLCBucmVzaWQ7CisJdTE2IHZsYW50OworCXVuc2lnbmVkIGludCBmaSwgaWR4LCBuOworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsKKwl1MzIgZnJhZ19zeiA9IHBub2ItPnJ4X2J1Zl9zaXplLCBwa3RzaXplOworCWJvb2wgcnhfY29hbCA9IChhZGFwdGVyLT5tYXhfcnhfY29hbCA8PSAxKSA/IDAgOiAxOworCXU4IGVyciwgKnZhOworCV9fd3N1bSBjc3VtID0gMDsKKworCWlmIChBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGlwc2VjLCByeGNwKSkgeworCQkvKiAgRHJvcCB0aGUgcGt0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IGNvbXBsZXRpb24uICAqLworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9taXNjX3BrdHMrKzsKKwkJcmV0dXJuOworCX0KKwllcnIgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCk7CisJaWYgKGVyciB8fCAhcnhfY29hbCkgeworCQkvKiBXZSB3b24ndCBjb2FsZXNjZSBSeCBwa3RzIGlmIHRoZSBlcnIgYml0IHNldC4KKwkJICogdGFrZSB0aGUgcGF0aCBvZiBub3JtYWwgY29tcGxldGlvbiBwcm9jZXNzaW5nICovCisJCXByb2Nlc3NfbmljX3J4X2NvbXBsZXRpb24ocG5vYiwgcnhjcCk7CisJCXJldHVybjsKKwl9CisKKwlmaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZnJhZ25keCwgcnhjcCk7CisJQlVHX09OKGZpID49IChpbnQpcG5vYi0+cnhfcV9sZW4pOworCUJVR19PTihmaSA8IDApOworCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJQlVHX09OKCFyeF9wYWdlX2luZm8tPnBhZ2UpOworCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCS8qICBJZiBvbmUgcGFnZSBpcyB1c2VkIHBlciBmcmFnbWVudCBvciBpZiB0aGlzIGlzIHRoZQorCSAqIHNlY29uZCBoYWxmIG9mIHRoZSBwYWdlLCB1bm1hcCB0aGUgcGFnZSBoZXJlCisJICovCisJaWYgKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgfHwgIXBub2ItPnJ4X3BnX3NoYXJlZCkgeworCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCSAgICAgICBmcmFnX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0KKworCW51bWZyYWdzID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBudW1mcmFncywgcnhjcCk7CisJdWRwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdWRwY2tzbSwgcnhjcCk7CisJdGNwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdGNwY2tzbSwgcnhjcCk7CisJdmxhbl90YWcgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZsYW5fdGFnLCByeGNwKTsKKwl2bGFudCA9IGJlMTZfdG9fY3B1KHZsYW5fdGFnKTsKKwl2bGFuZiA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRwLCByeGNwKTsKKwl2dG0gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZ0bSwgcnhjcCk7CisJcGt0c2l6ZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgcGt0c2l6ZSwgcnhjcCk7CisKKwlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisKKwlpZiAodGNwY2tzbSAmJiB1ZHBja3NtICYmIHBrdHNpemUgPT0gMzIpIHsKKwkJLyogZmx1c2ggY29tcGxldGlvbiBlbnRyaWVzICovCisJCXB1dF9wYWdlKHJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCXJldHVybjsKKwl9CisJLyogT25seSBvbmUgb2YgdWRwY2tzdW0gYW5kIHRjcGNrc3VtIGNhbiBiZSBzZXQgKi8KKwlCVUdfT04odWRwY2tzbSAmJiB0Y3Bja3NtKTsKKworCS8qIGp1bWJvIGZyYW1lcyBjb3VsZCBjb21lIGluIG11bHRpcGxlIGZyYWdtZW50cyAqLworCUJVR19PTihudW1mcmFncyAhPSAoKHBrdHNpemUgKyAoZnJhZ19zeiAtIDEpKSAvIGZyYWdfc3opKTsKKwluID0gbWluKHBrdHNpemUsIGZyYWdfc3opOworCW5yZXNpZCA9IHBrdHNpemUgLSBuOwkvKiB3aWxsIGJlIHVzZWZ1bCBmb3IganVtYm8gcGt0cyAqLworCWlkeCA9IDA7CisKKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9wYWdlX2luZm8tPnBhZ2UpICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSk7CisJcnhfZnJhZ3NbaWR4XS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCXJ4X2ZyYWdzW2lkeF0ucGFnZV9vZmZzZXQgPSAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCk7CisJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKwltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCisJLyogSWYgd2UgZ290IG11bHRpcGxlIGZyYWdtZW50cywgd2UgaGF2ZSBtb3JlIGRhdGEuICovCisJd2hpbGUgKG5yZXNpZCkgeworCQlpZHgrKzsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJCXBub2ItPnJ4X2N0eHRbZmldID0gKHZvaWQgKilOVUxMOworCQlpZiAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCB8fCAhcG5vYi0+cnhfcGdfc2hhcmVkKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksCisJCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKworCQluID0gbWluKG5yZXNpZCwgZnJhZ19zeik7CisJCXJ4X2ZyYWdzW2lkeF0ucGFnZSA9IHJ4X3BhZ2VfaW5mby0+cGFnZTsKKwkJcnhfZnJhZ3NbaWR4XS5wYWdlX29mZnNldCA9IChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KTsKKwkJcnhfZnJhZ3NbaWR4XS5zaXplID0gbjsKKworCQlucmVzaWQgLT0gbjsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCX0KKworCWlmIChsaWtlbHkoISh2bGFuZiAmJiB2dG0pKSkgeworCQlscm9fcmVjZWl2ZV9mcmFncygmcG5vYi0+bHJvX21nciwgcnhfZnJhZ3MsCisJCQkJICBwa3RzaXplLCBwa3RzaXplLAorCQkJCSAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljc3VtLCBjc3VtKTsKKwl9IGVsc2UgeworCQkvKiBWbGFuIHRhZyBwcmVzZW50IGluIHBrdCBhbmQgQkUgZm91bmQKKwkJICogdGhhdCB0aGUgdGFnIG1hdGNoZWQgYW4gZW50cnkgaW4gVkxBTiB0YWJsZQorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFwbm9iLT52bGFuX2dycCB8fCBwbm9iLT5udW1fdmxhbnMgPT0gMCkpIHsKKwkJCS8qIEJ1dCB3ZSBoYXZlIG5vIFZMQU5zIGNvbmZpZ3VyZWQuCisJCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBEcm9wIHRoZSBwYWNrZXQuCisJCQkgKi8KKwkJCWRldl9pbmZvKCZwbm9iLT5uZXRkZXYtPmRldiwKKwkJCSAgICAgICAiQmxhZGVFbmdpbmU6IFVuZXhwZWN0ZWQgdmxhbiB0YWdnZWQgcGFja2V0XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBwYXNzIHRoZSBWTEFOIHBhY2tldCB0byBzdGFjayAqLworCQlscm9fdmxhbl9od2FjY2VsX3JlY2VpdmVfZnJhZ3MoJnBub2ItPmxyb19tZ3IsCisJCQkJCSAgICAgICByeF9mcmFncywgcGt0c2l6ZSwgcGt0c2l6ZSwKKwkJCQkJICAgICAgIHBub2ItPnZsYW5fZ3JwLCB2bGFudCwKKwkJCQkJICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpY3N1bSwKKwkJCQkJICAgICAgIGNzdW0pOworCX0KKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2NvYWwrKzsKK30KKworc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpiZV9nZXRfcnhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4Y3AgPSAmcG5vYi0+cnhfY3FbcG5vYi0+cnhfY3FfdGxdOworCXUzMiB2YWxpZCwgY3Q7CisKKwl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmFsaWQsIHJ4Y3ApOworCWlmICh2YWxpZCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWN0ID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBjdCwgcnhjcCk7CisJaWYgKGN0ICE9IDApIHsKKwkJLyogSW52YWxpZCBjaHV0ZSAjLiB0cmVhdCBhcyBlcnJvciAqLworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGVyciwgcnhjcCwgMSk7CisJfQorCisJYmVfYWR2X3J4Y3FfdGwocG5vYik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2YWxpZCwgcnhjcCwgMCk7CisJcmV0dXJuIHJ4Y3A7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yeF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNQi9TZWMgKi8KKworCQkvKiBNZWdhIEJpdHMvU2VjICovCisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aF9yeF9yYXRlID0gKHIgKiA4KTsKKwkJYWRhcHRlci0+ZXRoX3J4X2ppZmZpZXMgPSBqaWZmaWVzOworCQlhZGFwdGVyLT5ldGhfcnhfYnl0ZXMgPSAwOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3J4X2NvbXBsZXRpb25zKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBpbnQgbWF4X3dvcmspCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcDsKKwl1MzIgbmMgPSAwOworCXVuc2lnbmVkIGludCBwa3RzaXplOworCisJd2hpbGUgKG1heF93b3JrICYmIChyeGNwID0gYmVfZ2V0X3J4X2NtcGwocG5vYikpKSB7CisJCXByZWZldGNoKHJ4Y3ApOworCQlwa3RzaXplID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBwa3RzaXplLCByeGNwKTsKKwkJcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbl9scm8ocG5vYiwgcnhjcCk7CisJCWFkYXB0ZXItPmV0aF9yeF9ieXRlcyArPSBwa3RzaXplOworCQl1cGRhdGVfcnhfcmF0ZShhZGFwdGVyKTsKKwkJbmMrKzsKKwkJbWF4X3dvcmstLTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29tcGwrKzsKKwl9CisJaWYgKGxpa2VseShhZGFwdGVyLT5tYXhfcnhfY29hbCA+IDEpKSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2ZsdXNoKys7CisJCWxyb19mbHVzaF9hbGwoJnBub2ItPmxyb19tZ3IpOworCX0KKworCS8qIFJlZmlsbCB0aGUgcXVldWUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA8IDkwMCkKKwkJYmVfcG9zdF9ldGhfcnhfYnVmZnMocG5vYik7CisKKwlyZXR1cm4gbmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKmJlX2dldF90eF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcCA9ICZwbm9iLT50eF9jcVtwbm9iLT50eF9jcV90bF07CisJdTMyIHZhbGlkOworCisJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwKTsKKwlpZiAodmFsaWQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHZhbGlkLCB0eGNwLCAwKTsKKwliZV9hZHZfdHhjcV90bChwbm9iKTsKKwlyZXR1cm4gdHhjcDsKKworfQorCit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJaW50IGN1cl9pbmRleCwgdHhfd3Jic19jb21wbGV0ZWQgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTY0IGJ1c2FkZHIsIHBhLCBwYV9sbywgcGFfaGk7CisJc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiOworCXUzMiBmcmFnX2xlbiwgbGFzdF9pbmRleCwgajsKKworCWxhc3RfaW5kZXggPSB0eF9jb21wbF9sYXN0d3JiX2lkeF9nZXQocG5vYik7CisJQlVHX09OKGxhc3RfaW5kZXggIT0gZW5kX2lkeCk7CisJcG5vYi0+dHhfY3R4dFtwbm9iLT50eF9xX3RsXSA9IE5VTEw7CisJZG8geworCQljdXJfaW5kZXggPSBwbm9iLT50eF9xX3RsOworCQl3cmIgPSAmcG5vYi0+dHhfcVtjdXJfaW5kZXhdOworCQlwYV9oaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYik7CisJCXBhX2xvID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiKTsKKwkJZnJhZ19sZW4gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX2xlbiwgd3JiKTsKKwkJYnVzYWRkciA9IChwYV9oaSA8PCAzMikgfCBwYV9sbzsKKwkJaWYgKGJ1c2FkZHIgIT0gMCkgeworCQkJcGEgPSBsZTY0X3RvX2NwdShidXNhZGRyKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgcGEsCisJCQkJCSBmcmFnX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwkJaWYgKGN1cl9pbmRleCA9PSBsYXN0X2luZGV4KSB7CisJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilwbm9iLT50eF9jdHh0W2N1cl9pbmRleF07CisJCQlCVUdfT04oIXNrYik7CisJCQlmb3IgKGogPSAwOyBqIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaisrKSB7CisJCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3Nbal07CisJCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJICAgICAgICh1bG9uZykgZnJhZy0+cGFnZSwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlwbm9iLT50eF9jdHh0W2N1cl9pbmRleF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJQlVHX09OKHBub2ItPnR4X2N0eHRbY3VyX2luZGV4XSk7CisJCX0KKwkJdHhfd3Jic19jb21wbGV0ZWQrKzsKKwkJYmVfYWR2X3R4cV90bChwbm9iKTsKKwl9IHdoaWxlIChjdXJfaW5kZXggIT0gbGFzdF9pbmRleCk7CisJYXRvbWljX3N1Yih0eF93cmJzX2NvbXBsZXRlZCwgJnBub2ItPnR4X3FfdXNlZCk7Cit9CisKKy8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSBhbiBTTVAgbG9jayBoZXJlIHNpbmNlIGN1cnJlbnRseQorICogd2UgaGF2ZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdGFza2xldCB0aGF0IGRvZXMgY29tcGxldGlvbgorICogcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhjcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG5vYi0+bmV0ZGV2OworCXUzMiBlbmRfaWR4LCBudW1fcHJvY2Vzc2VkID0gMDsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2V2ZW50cysrOworCisJd2hpbGUgKCh0eGNwID0gYmVfZ2V0X3R4X2NtcGwocG5vYikpKSB7CisJCWVuZF9pZHggPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfVFhfQ09NUEwsIHdyYl9pbmRleCwgdHhjcCk7CisJCXByb2Nlc3Nfb25lX3R4X2NvbXBsKHBub2IsIGVuZF9pZHgpOworCQludW1fcHJvY2Vzc2VkKys7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X2NvbXBsKys7CisJfQorCWJlX25vdGlmeV9jbXBsKHBub2IsIG51bV9wcm9jZXNzZWQsIHBub2ItPnR4X2NxX2lkLCAxKTsKKwkvKgorCSAqIFdlIGdvdCBUeCBjb21wbGV0aW9ucyBhbmQgaGF2ZSB1c2FibGUgV1JCcy4KKwkgKiBJZiB0aGUgbmV0ZGV2J3MgcXVldWUgaGFzIGJlZW4gc3RvcHBlZAorCSAqIGJlY2F1c2Ugd2UgaGFkIHJ1biBvdXQgb2YgV1JCcywgd2FrZSBpdCBub3cuCisJICovCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KQorCSAgICAmJiBhdG9taWNfcmVhZCgmcG5vYi0+dHhfcV91c2VkKSA8IHBub2ItPnR4X3FfbGVuIC8gMikgeworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eHFfbG9jayk7Cit9CisKK3N0YXRpYyB1MzIgcG9zdF9yeF9idWZmcyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IGxpc3RfaGVhZCAqcnhibCkKK3sKKwl1MzIgbnBvc3RlZCA9IDA7CisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4ZCA9IE5VTEw7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXZvaWQgKipyeF9jdHhwOworCXN0cnVjdCBSUV9EQl9BTUFQIHJxZGI7CisKKwlyeF9jdHhwID0gcG5vYi0+cnhfY3R4dDsKKworCXdoaWxlICghbGlzdF9lbXB0eShyeGJsKSAmJgorCSAgICAgICAocnhfY3R4cFtwbm9iLT5yeF9xX2hkXSA9PSBOVUxMKSAmJiBucG9zdGVkIDwgMjU1KSB7CisKKwkJcnhicCA9IGxpc3RfZmlyc3RfZW50cnkocnhibCwgc3RydWN0IGJlX3JlY3ZfYnVmZmVyLCByeGJfbGlzdCk7CisJCWxpc3RfZGVsKCZyeGJwLT5yeGJfbGlzdCk7CisJCXJ4ZCA9IHBub2ItPnJ4X3EgKyBwbm9iLT5yeF9xX2hkOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfRCwgZnJhZ3BhX2xvLCByeGQsIHJ4YnAtPnJ4Yl9wYV9sbyk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9SWF9ELCBmcmFncGFfaGksIHJ4ZCwgcnhicC0+cnhiX3BhX2hpKTsKKworCQlyeF9jdHhwW3Bub2ItPnJ4X3FfaGRdID0gcnhicC0+cnhiX2N0eHQ7CisJCWJlX2Fkdl9yeHFfaGQocG5vYik7CisJCW5wb3N0ZWQrKzsKKwl9CisKKwlpZiAobnBvc3RlZCkgeworCQkvKiBOb3cgcHJlc3MgdGhlIGRvb3IgYmVsbCB0byBub3RpZnkgQmxhZGVFbmdpbmUuICovCisJCXJxZGIuZHdbMF0gPSAwOworCQlBTUFQX1NFVF9CSVRTX1BUUihSUV9EQiwgbnVtUG9zdGVkLCAmcnFkYiwgbnBvc3RlZCk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFJRX0RCLCBycSwgJnJxZGIsIHBub2ItPnJ4X3FfaWQpOworCQlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBlcnhfcnFfZGIsIHJxZGIuZHdbMF0pOworCX0KKwlhdG9taWNfYWRkKG5wb3N0ZWQsICZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJcmV0dXJuIG5wb3N0ZWQ7Cit9CisKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiBudW1fYnVmcywgcjsKKwl1NjQgYnVzYWRkciA9IDAsIHRtcF9wYTsKKwl1MzIgbWF4X2J1ZnMsIHBnX2hkOworCXUzMiBmcmFnX3NpemU7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyICpyeGJwOworCXN0cnVjdCBsaXN0X2hlYWQgcnhibDsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXUzMiBwYWdlX29yZGVyID0gMDsKKwlnZnBfdCBhbGxvY19mbGFncyA9IEdGUF9BVE9NSUM7CisKKwlCVUdfT04oIWFkYXB0ZXIpOworCisJbWF4X2J1ZnMgPSA2NDsJCS8qIHNob3VsZCBiZSBldmVuICMgPD0gMjU1LiAqLworCisJZnJhZ19zaXplID0gcG5vYi0+cnhfYnVmX3NpemU7CisJcGFnZV9vcmRlciA9IGdldF9vcmRlcihmcmFnX3NpemUpOworCisJaWYgKGZyYWdfc2l6ZSA9PSA4MTkyKQorCQlhbGxvY19mbGFncyB8PSAoZ2ZwX3QpIF9fR0ZQX0NPTVA7CisJLyoKKwkgKiBGb3JtIGEgbGlua2VkIGxpc3Qgb2YgUkVDVl9CVUZGRkVSIHN0cnVjdHVyZSB0byBiZSBiZSBwb3N0ZWQuCisJICogV2Ugd2lsbCBwb3N0IGV2ZW4gbnVtYmVyIG9mIGJ1ZmZlciBzbyB0aGF0IHBhZ2VzIGNhbiBiZQorCSAqIHNoYXJlZC4KKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcnhibCk7CisKKwlmb3IgKG51bV9idWZzID0gMDsgbnVtX2J1ZnMgPCBtYXhfYnVmcyAmJgorCQkhcG5vYi0+cnhfcGFnZV9pbmZvW3Bub2ItPnJ4X3BnX2luZm9faGRdLnBhZ2U7ICsrbnVtX2J1ZnMpIHsKKworCQlyeGJwID0gJnBub2ItPmV0aF9yeF9idWZzW251bV9idWZzXTsKKwkJcGdfaGQgPSBwbm9iLT5yeF9wZ19pbmZvX2hkOworCQlyeF9wYWdlX2luZm8gPSAmcG5vYi0+cnhfcGFnZV9pbmZvW3BnX2hkXTsKKworCQlpZiAoIXBhZ2UpIHsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlcyhhbGxvY19mbGFncywgcGFnZV9vcmRlcik7CisJCQlpZiAodW5saWtlbHkocGFnZSA9PSBOVUxMKSkgeworCQkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V0aHJ4X3Bvc3RfZmFpbCsrOworCQkJCXBub2ItPnJ4YnVmX3Bvc3RfZmFpbCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJcG5vYi0+cnhidWZfcG9zdF9mYWlsID0gMDsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgcGFnZSwgMCwKKwkJCQkJICAgICAgIGZyYWdfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgPSAwOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgc2hhcmluZyBhIHBhZ2UgYW1vbmcgdHdvIHNrYnMsCisJCQkgKiBhbGxvYyBhIG5ldyBvbmUgb24gdGhlIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCWlmIChwbm9iLT5yeF9wZ19zaGFyZWQgPT0gZmFsc2UpCisJCQkJcGFnZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlnZXRfcGFnZShwYWdlKTsKKwkJCXJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgKz0gZnJhZ19zaXplOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlID0gcGFnZTsKKwkJCS8qCisJCQkgKiBXZSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgYWxsb2NlZCBwYWdlLAorCQkJICogQWxsb2MgYSBuZXcgb25lIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbgorCQkJICovCisJCQlwYWdlID0gTlVMTDsKKwkJfQorCQlyeGJwLT5yeGJfY3R4dCA9ICh2b2lkICopcnhfcGFnZV9pbmZvOworCQlpbmRleF9pbmMoJnBub2ItPnJ4X3BnX2luZm9faGQsIHBub2ItPnJ4X3FfbGVuKTsKKworCQlwY2lfdW5tYXBfYWRkcl9zZXQocnhfcGFnZV9pbmZvLCBidXMsIGJ1c2FkZHIpOworCQl0bXBfcGEgPSBidXNhZGRyICsgcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwkJcnhicC0+cnhiX3BhX2xvID0gKHRtcF9wYSAmIDB4RkZGRkZGRkYpOworCQlyeGJwLT5yeGJfcGFfaGkgPSAodG1wX3BhID4+IDMyKTsKKwkJcnhicC0+cnhiX2xlbiA9IGZyYWdfc2l6ZTsKKwkJbGlzdF9hZGRfdGFpbCgmcnhicC0+cnhiX2xpc3QsICZyeGJsKTsKKwl9CQkJLyogRW5kIG9mIGZvciAqLworCisJciA9IHBvc3RfcnhfYnVmZnMocG5vYiwgJnJ4YmwpOworCUJVR19PTihyICE9IG51bV9idWZzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgc2VydmljZSBmb3IgbmV0d29yayBmdW5jdGlvbi4gIFdlIGp1c3Qgc2NoZWR1bGUgdGhlCisgKiB0YXNrbGV0IHdoaWNoIGRvZXMgYWxsIGNvbXBsZXRpb24gcHJvY2Vzc2luZy4KKyAqLworaXJxcmV0dXJuX3QgYmVfaW50KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2OworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIGlzcjsKKworCWlzciA9IENTUl9SRUFEKCZwbm9iLT5mbl9vYmosIGNldi5pc3IxKTsKKwlpZiAodW5saWtlbHkoIWlzcikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+aW50X2xvY2spOworCWFkYXB0ZXItPmlzciB8PSBpc3I7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmludF9sb2NrKTsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHMrKzsKKworCXRhc2tsZXRfc2NoZWR1bGUoJmFkYXB0ZXItPnN0c19oYW5kbGVyKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBQb2xsIGZ1bmN0aW9uIGNhbGxlZCBieSBOQVBJIHdpdGggYSB3b3JrIGJ1ZGdldC4KKyAqIFdlIHByb2Nlc3MgYXMgbWFueSBVQy4gQkMgYW5kIE1DIHJlY2VpdmUgY29tcGxldGlvbnMKKyAqIGFzIHRoZSBidWRnZXQgYWxsb3dzIGFuZCByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YKKyAqIFJYIHN0c3R1dHNlcyBwcm9jZXNzZWQuCisgKi8KK2ludCBiZV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9CisJCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGJlX25ldF9vYmplY3QsIG5hcGkpOworCXUzMiB3b3JrX2RvbmU7CisKKwlwbm9iLT5hZGFwdGVyLT5iZV9zdGF0LmJlc19wb2xscysrOworCXdvcmtfZG9uZSA9IHByb2Nlc3NfcnhfY29tcGxldGlvbnMocG5vYiwgYnVkZ2V0KTsKKwlCVUdfT04od29ya19kb25lID4gYnVkZ2V0KTsKKworCS8qIEFsbCBjb25zdW1lZCAqLworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmFwaSk7CisJCS8qIGVuYWJsZSBpbnRyICovCisJCWJlX25vdGlmeV9jbXBsKHBub2IsIHdvcmtfZG9uZSwgcG5vYi0+cnhfY3FfaWQsIDEpOworCX0gZWxzZSB7CisJCS8qIE1vcmUgdG8gYmUgY29uc3VtZWQ7IGNvbnRpbnVlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCQliZV9ub3RpZnlfY21wbChwbm9iLCB3b3JrX2RvbmUsIHBub2ItPnJ4X2NxX2lkLCAwKTsKKwl9CisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIHN0cnVjdCBFUV9FTlRSWV9BTUFQICpnZXRfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IEVRX0VOVFJZX0FNQVAgKmVxcCA9ICYocG5vYi0+ZXZlbnRfcVtwbm9iLT5ldmVudF9xX3RsXSk7CisJaWYgKCFBTUFQX0dFVF9CSVRTX1BUUihFUV9FTlRSWSwgVmFsaWQsIGVxcCkpCisJCXJldHVybiBOVUxMOworCWJlX2Fkdl9lcV90bChwbm9iKTsKKwlyZXR1cm4gZXFwOworfQorCisvKgorICogUHJvY2Vzc2VzIGFsbCB2YWxpZCBldmVudHMgaW4gdGhlIGV2ZW50IHJpbmcgYXNzb2NpYXRlZCB3aXRoIGdpdmVuCisgKiBOZXRPYmplY3QuICBBbHNvLCBub3RpZmllcyBCRSB0aGUgbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHByb2Nlc3NfZXZlbnRzKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXFwOworCXUzMiByaWQsIG51bV9ldmVudHMgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisKKwl3aGlsZSAoKGVxcCA9IGdldF9ldmVudChwbm9iKSkgIT0gTlVMTCkgeworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19ldmVudHMrKzsKKwkJcmlkID0gQU1BUF9HRVRfQklUU19QVFIoRVFfRU5UUlksIFJlc291cmNlSUQsIGVxcCk7CisJCWlmIChyaWQgPT0gcG5vYi0+cnhfY3FfaWQpIHsKKwkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2V2ZW50cysrOworCQkJbmV0aWZfcnhfc2NoZWR1bGUoJnBub2ItPm5hcGkpOworCQl9IGVsc2UgaWYgKHJpZCA9PSBwbm9iLT50eF9jcV9pZCkgeworCQkJcHJvY2Vzc19uaWNfdHhfY29tcGxldGlvbnMocG5vYik7CisJCX0gZWxzZSBpZiAocmlkID09IHBub2ItPm1jY19jcV9pZCkgeworCQkJYmVfbWNjX3Byb2Nlc3NfY3EoJnBub2ItPm1jY19xX29iaiwgMSk7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsCisJCQkJCSJJbnZhbGlkIEVRIFJlc291cmNlSUQgJWRcbiIsIHJpZCk7CisJCX0KKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfRU5UUlksIFZhbGlkLCBlcXAsIDApOworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9FTlRSWSwgUmVzb3VyY2VJRCwgZXFwLCAwKTsKKwkJbnVtX2V2ZW50cysrOworCX0KKwlyZXR1cm4gbnVtX2V2ZW50czsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2VxZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3RwOworCisJLyogdXBkYXRlIG9uY2UgYSBzZWNvbmQgKi8KKwlpZiAoKGppZmZpZXMgLSBhZGFwdGVyLT5pcHNfamlmZmllcykgPiAxICogKEhaKSkgeworCQkvKiBPbmUgc2Vjb25kIGVsYXBzZWQgc2luY2UgbGFzdCB1cGRhdGUgICovCisJCXUzMiByLCBuZXdfZXFkID0gLTE7CisJCXIgPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19pbnRzIC0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcHJldl9pbnRzOworCQlyID0gciAvICgoamlmZmllcyAtIGFkYXB0ZXItPmlwc19qaWZmaWVzKSAvIChIWikpOworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19pcHMgPSByOworCQlhZGFwdGVyLT5pcHNfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3ByZXZfaW50cyA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHM7CisJCWlmIChyID4gSVBTX0hJX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPCBhZGFwdGVyLT5tYXhfZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkICsgOCk7CisJCWlmIChyIDwgSVBTX0xPX1dNICYmIGFkYXB0ZXItPmN1cl9lcWQgPiBhZGFwdGVyLT5taW5fZXFkKQorCQkJbmV3X2VxZCA9IChhZGFwdGVyLT5jdXJfZXFkIC0gOCk7CisJCWlmIChhZGFwdGVyLT5lbmFibGVfYWljICYmIG5ld19lcWQgIT0gLTEpIHsKKwkJCWVxX29iamVjdHAgPSAmcG5vYi0+ZXZlbnRfcV9vYmo7CisJCQlzdGF0dXMgPSBiZV9lcV9tb2RpZnlfZGVsYXkoJnBub2ItPmZuX29iaiwgMSwKKwkJCQkJCSAgICAmZXFfb2JqZWN0cCwgJm5ld19lcWQsIE5VTEwsCisJCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJCQlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpCisJCQkJYWRhcHRlci0+Y3VyX2VxZCA9IG5ld19lcWQ7CisJCX0KKwl9Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBub3RpZmllcyBCbGFkZUVuZ2luZSBvZiBob3cgbWFueSBldmVudHMgd2VyZSBwcm9jZXNzZWQKKyAgICBmcm9tIHRoZSBldmVudCBxdWV1ZSBieSByaW5naW5nIHRoZSBjb3JyZXNwb25kaW5nIGRvb3IgYmVsbCBhbmQKKyAgICBvcHRpb25hbGx5IHJlLWFybXMgdGhlIGV2ZW50IHF1ZXVlLgorICAgIG4JCS0gbnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQKKyAgICByZV9hcm0JLSAxIC0gcmUtYXJtIHRoZSBFUSwgMCAtIGRvIG5vdCByZS1hcm0gdGhlIEVRCisKKyovCitzdGF0aWMgdm9pZCBiZV9ub3RpZnlfZXZlbnQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBuLCBpbnQgcmVfYXJtKQoreworCXN0cnVjdCBDUV9EQl9BTUFQIGVxZGI7CisJZXFkYi5kd1swXSA9IDA7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcWlkLCAmZXFkYiwgcG5vYi0+ZXZlbnRfcV9pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZXFkYiwgcmVfYXJtKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZlcWRiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmVxZGIsIG4pOworCS8qCisJICogVW5kZXIgc29tZSBzaXR1YXRpb25zIHdlIHNlZSBhbiBpbnRlcnJ1cHQgYW5kIG5vIHZhbGlkCisJICogRVEgZW50cnkuICBUbyBrZWVwIGdvaW5nLCB3ZSBuZWVkIHRvIHJpbmcgdGhlIERCIGV2ZW4gaWYKKwkgKiBudW1QT3N0ZWQgaXMgMC4KKwkgKi8KKwlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBjcV9kYiwgZXFkYi5kd1swXSk7CisJcmV0dXJuOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHRhc2tsZXQgc2NoZWR1bGVkIGJ5IElTUi4gIEFsbCByZWFsIGludGVycnVwdCBwcm9jZXNzaW5nCisgKiBpcyBkb25lIGhlcmUuCisgKi8KK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYmVfYWRhcHRlciAqKWNvbnRleHQ7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCXUzMiBpc3IsIG47CisJdWxvbmcgZmxhZ3MgPSAwOworCisJaXNyID0gYWRhcHRlci0+aXNyOworCisJLyoKKwkgKiB3ZSBjcmVhdGUgb25seSBvbmUgTklDIGV2ZW50IHF1ZXVlIGluIExpbnV4LiBFdmVudCBpcworCSAqIGV4cGVjdGVkIG9ubHkgaW4gdGhlIGZpcnN0IGV2ZW50IHF1ZXVlCisJICovCisJQlVHX09OKGlzciAmIDB4ZmZmZmZmZmUpOworCWlmICgoaXNyICYgMSkgPT0gMCkKKwkJcmV0dXJuOwkJLyogbm90IG91ciBpbnRlcnJ1cHQgKi8KKwluID0gcHJvY2Vzc19ldmVudHMocG5vYik7CisJLyoKKwkgKiBDbGVhciB0aGUgZXZlbnQgYml0LiBhZGFwdGVyLT5pc3IgaXMgIHNldCBieQorCSAqIGhhcmQgaW50ZXJydXB0LiAgUHJldmVudCByYWNlIHdpdGggbG9jay4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5pc3IgJj0gfjE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+aW50X2xvY2ssIGZsYWdzKTsKKwliZV9ub3RpZnlfZXZlbnQocG5vYiwgbiwgMSk7CisJLyoKKwkgKiBJZiBwcmV2aW91cyBhbGxvY2F0aW9uIGF0dGVtcHRzIGhhZCBmYWlsZWQgYW5kCisJICogQkUgaGFzIHVzZWQgdXAgYWxsIHBvc3RlZCBidWZmZXJzLCBwb3N0IFJYIGJ1ZmZlcnMgaGVyZQorCSAqLworCWlmIChwbm9iLT5yeGJ1Zl9wb3N0X2ZhaWwgJiYgYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKSA9PSAwKQorCQliZV9wb3N0X2V0aF9yeF9idWZmcyhwbm9iKTsKKwl1cGRhdGVfZXFkKGFkYXB0ZXIsIHBub2IpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX25ldGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4ZGFmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9uZXRpZi5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogYmVfbmV0aWYuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2YXJpb3VzIGVudHJ5IHBvaW50cyBvZiBkcml2ZXJzIHNlZW4gYnkgdGNwL2lwIHN0YWNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlICJiZW5ldC5oIgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKworLyogU3RyaW5ncyB0byBwcmludCBMaW5rIHByb3BlcnRpZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rX3NwZWVkW10gPSB7CisJIkludmFsaWQgbGluayBTcGVlZCBWYWx1ZSIsCisJIjEwIE1icHMiLAorCSIxMDAgTWJwcyIsCisJIjEgR2JwcyIsCisJIjEwIEdicHMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua19kdXBsZXhbXSA9IHsKKwkiSW52YWxpZCBEdXBsZXggVmFsdWUiLAorCSJIYWxmIER1cGxleCIsCisJIkZ1bGwgRHVwbGV4IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtfc3RhdGVbXSA9IHsKKwkiIiwKKwkiKGFjdGl2ZSkiCit9OworCit2b2lkIGJlX3ByaW50X2xpbmtfaW5mbyhzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxua19zdGF0dXMpCit7CisJdTE2IHNpLCBkaSwgYWk7CisKKwkvKiBQb3J0IDAgKi8KKwlpZiAobG5rX3N0YXR1cy0+bWFjMF9zcGVlZCAmJiBsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCkgeworCQkvKiBQb3J0IGlzIHVwIGFuZCBydW5uaW5nICovCisJCXNpID0gKGxua19zdGF0dXMtPm1hYzBfc3BlZWQgPCA1KSA/IGxua19zdGF0dXMtPm1hYzBfc3BlZWQgOiAwOworCQlkaSA9IChsbmtfc3RhdHVzLT5tYWMwX2R1cGxleCA8IDMpID8KKwkJICAgIGxua19zdGF0dXMtPm1hYzBfZHVwbGV4IDogMDsKKwkJYWkgPSAobG5rX3N0YXR1cy0+YWN0aXZlX3BvcnQgPT0gMCkgPyAxIDogMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAwOiBTcGVlZCAtICVzICVzICVzXG4iLAorCQkgICAgICAgbGlua19zcGVlZFtzaV0sIGxpbmtfZHVwbGV4W2RpXSwgbGlua19zdGF0ZVthaV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQb3J0Tm8uIDA6IERvd25cbiIpOworCisJLyogUG9ydCAxICovCisJaWYgKGxua19zdGF0dXMtPm1hYzFfc3BlZWQgJiYgbG5rX3N0YXR1cy0+bWFjMV9kdXBsZXgpIHsKKwkJLyogUG9ydCBpcyB1cCBhbmQgcnVubmluZyAqLworCQlzaSA9IChsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDwgNSkgPyBsbmtfc3RhdHVzLT5tYWMxX3NwZWVkIDogMDsKKwkJZGkgPSAobG5rX3N0YXR1cy0+bWFjMV9kdXBsZXggPCAzKSA/CisJCSAgICBsbmtfc3RhdHVzLT5tYWMxX2R1cGxleCA6IDA7CisJCWFpID0gKGxua19zdGF0dXMtPmFjdGl2ZV9wb3J0ID09IDApID8gMSA6IDA7CisJCXByaW50ayhLRVJOX0lORk8gIlBvcnROby4gMTogU3BlZWQgLSAlcyAlcyAlc1xuIiwKKwkJICAgICAgIGxpbmtfc3BlZWRbc2ldLCBsaW5rX2R1cGxleFtkaV0sIGxpbmtfc3RhdGVbYWldKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAxOiBEb3duXG4iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorYmVfZ2V0X2ZyYWdfaGVhZGVyKHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWcsIHZvaWQgKiptYWNfaGRyLAorCQkgICB2b2lkICoqaXBfaGRyLCB2b2lkICoqdGNwdWRwX2hkciwKKwkJICAgdTY0ICpoZHJfZmxhZ3MsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGV0aGhkciAqZWg7CisJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CisJc3RydWN0IGlwaGRyICppcGg7CisJdTggKnZhID0gcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpICsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBsbF9obGVuOworCisJLyogZmluZCB0aGUgbWFjIGhlYWRlciwgYWJvcnQgaWYgbm90IElQdjQgKi8KKworCXByZWZldGNoKHZhKTsKKwllaCA9IChzdHJ1Y3QgZXRoaGRyICopdmE7CisJKm1hY19oZHIgPSBlaDsKKwlsbF9obGVuID0gRVRIX0hMRU47CisJaWYgKGVoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkgeworCQlpZiAoZWgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQl2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopdmE7CisJCQlpZiAodmVoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWxsX2hsZW4gKz0gVkxBTl9ITEVOOworCisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJKmhkcl9mbGFncyA9IExST19JUFY0OworCisJaXBoID0gKHN0cnVjdCBpcGhkciAqKSh2YSArIGxsX2hsZW4pOworCSppcF9oZHIgPSBpcGg7CisJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCXJldHVybiAtMTsKKwkqaGRyX2ZsYWdzIHw9IExST19UQ1A7CisJKnRjcHVkcF9oZHIgPSAodTggKikgKCppcF9oZHIpICsgKGlwaC0+aWhsIDw8IDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9scm9fbWdyICpscm9fbWdyOworCisJaWYgKGFkYXB0ZXItPmRldl9zdGF0ZSA8IEJFX0RFVl9TVEFURV9JTklUKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWxyb19tZ3IgPSAmcG5vYi0+bHJvX21ncjsKKwlscm9fbWdyLT5kZXYgPSBuZXRkZXY7CisKKwlscm9fbWdyLT5mZWF0dXJlcyA9IExST19GX05BUEk7CisJbHJvX21nci0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJbHJvX21nci0+aXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwlscm9fbWdyLT5tYXhfZGVzYyA9IEJFX01BWF9MUk9fREVTQ1JJUFRPUlM7CisJbHJvX21nci0+bHJvX2FyciA9IHBub2ItPmxyb19kZXNjOworCWxyb19tZ3ItPmdldF9mcmFnX2hlYWRlciA9IGJlX2dldF9mcmFnX2hlYWRlcjsKKwlscm9fbWdyLT5tYXhfYWdnciA9IGFkYXB0ZXItPm1heF9yeF9jb2FsOworCWxyb19tZ3ItPmZyYWdfYWxpZ25fcGFkID0gMjsKKwlpZiAobHJvX21nci0+bWF4X2FnZ3IgPiBNQVhfU0tCX0ZSQUdTKQorCQlscm9fbWdyLT5tYXhfYWdnciA9IE1BWF9TS0JfRlJBR1M7CisKKwlhZGFwdGVyLT5tYXhfcnhfY29hbCA9IEJFX0xST19NQVhfUEtUUzsKKworCWJlX3VwZGF0ZV9saW5rX3N0YXR1cyhhZGFwdGVyKTsKKworCS8qCisJICogU2V0IGNhcnJpZXIgb24gb25seSBpZiBQaHlzaWNhbCBMaW5rIHVwCisJICogRWl0aGVyIG9mIHRoZSBwb3J0IGxpbmsgc3RhdHVzIHVwIHNpZ25pZmllcyB0aGlzCisJICovCisJaWYgKChhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApIHx8CisJICAgIChhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9PSBCRV9QT1JUX0xJTktfVVApKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwl9CisKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfT1BFTjsKKwluYXBpX2VuYWJsZSgmcG5vYi0+bmFwaSk7CisJYmVfZW5hYmxlX2ludHIocG5vYik7CisJYmVfZW5hYmxlX2VxX2ludHIocG5vYik7CisJLyoKKwkgKiBSWCBjb21wbGV0aW9uIHF1ZXVlIG1heSBiZSBpbiBkaXMtYXJtZWQgc3RhdGUuIEFybSBpdC4KKwkgKi8KKwliZV9ub3RpZnlfY21wbChwbm9iLCAwLCBwbm9iLT5yeF9jcV9pZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZW5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJc3luY2hyb25pemVfaXJxKG5ldGRldi0+aXJxKTsKKworCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJYWRhcHRlci0+ZGV2X3N0YXRlID0gQkVfREVWX1NUQVRFX0lOSVQ7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKworCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKwliZV9kaXNhYmxlX2ludHIocG5vYik7CisJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCW5hcGlfZGlzYWJsZSgmcG5vYi0+bmFwaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldHRpbmcgYSBNYWMgQWRkcmVzcyBmb3IgQkUKKyAqIFRha2VzIG5ldGRldiBhbmQgYSB2b2lkIHBvaW50ZXIgYXMgYXJndW1lbnRzLgorICogVGhlIHBvaW50ZXIgaG9sZHMgdGhlIG5ldyBhZGRyZXMgdG8gYmUgdXNlZC4KKyAqLworc3RhdGljIGludCBiZW5ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAwLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisJLyoKKwkgKiBTaW5jZSB3ZSBhcmUgZG9pbmcgQWN0aXZlLVBhc3NpdmUgZmFpbG92ZXIsIGJvdGgKKwkgKiBwb3J0cyBzaG91bGQgaGF2ZSBtYXRjaGluZyBNQUMgYWRkcmVzc2VzIGV2ZXJ5dGltZS4KKwkgKi8KKwliZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZSgmcG5vYi0+Zm5fb2JqLCAxLCAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJCQkJICAgICAgbmV0ZGV2LT5kZXZfYWRkciwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGNvbnRleHQpCit7CisJc3RydWN0IGJlX3RpbWVyX2N0eHQgKmN0eHQgPSAoc3RydWN0IGJlX3RpbWVyX2N0eHQgKiljb250ZXh0OworCisJaWYgKGF0b21pY19yZWFkKCZjdHh0LT5nZXRfc3RhdF9mbGFnKSkgeworCQlhdG9taWNfZGVjKCZjdHh0LT5nZXRfc3RhdF9mbGFnKTsKKwkJdXAoKHZvaWQgKiljdHh0LT5nZXRfc3RhdF9zZW1fYWRkcik7CisJfQorCWRlbF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgYmVfZ2V0X3N0YXRfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJICAgIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKm9wdGlvbmFsX3dyYikKK3sKKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqY3R4dCA9IChzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqKWNvbnRleHQ7CisJLyoKKwkgKiBqdXN0IHVwIHRoZSBzZW1hcGhvcmUgaWYgdGhlIGdldF9zdGF0X2ZsYWcKKwkgKiByZWFkcyAxLiBzbyB0aGF0IHRoZSB3YWl0ZXIgY2FuIGNvbnRpbnVlLgorCSAqIElmIGl0IGlzIDAsIHRoZW4gaXQgd2FzIGhhbmRsZWQgYnkgdGhlIHRpbWVyIGhhbmRsZXIuCisJICovCisJZGVsX3RpbWVyKCZjdHh0LT5nZXRfc3RhdHNfdGltZXIpOworCWlmIChhdG9taWNfcmVhZCgmY3R4dC0+Z2V0X3N0YXRfZmxhZykpIHsKKwkJYXRvbWljX2RlYygmY3R4dC0+Z2V0X3N0YXRfZmxhZyk7CisJCXVwKCh2b2lkICopY3R4dC0+Z2V0X3N0YXRfc2VtX2FkZHIpOworCX0KK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTY0IHBhOworCXN0cnVjdCBiZV90aW1lcl9jdHh0ICpjdHh0ID0gJmFkYXB0ZXItPnRpbWVyX2N0eHQ7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlICE9IEJFX0RFVl9TVEFURV9PUEVOKSB7CisJCS8qIFJldHVybiBwcmV2aW91c2x5IHJlYWQgc3RhdHMgKi8KKwkJcmV0dXJuICYoYWRhcHRlci0+YmVuZXRfc3RhdHMpOworCX0KKwkvKiBHZXQgUGh5c2ljYWwgQWRkciAqLworCXBhID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwljdHh0LT5nZXRfc3RhdF9zZW1fYWRkciA9ICh1bnNpZ25lZCBsb25nKSZhZGFwdGVyLT5nZXRfZXRoX3N0YXRfc2VtOworCWF0b21pY19pbmMoJmN0eHQtPmdldF9zdGF0X2ZsYWcpOworCisJYmVfcnhmX3F1ZXJ5X2V0aF9zdGF0aXN0aWNzKCZwbm9iLT5mbl9vYmosIGFkYXB0ZXItPmV0aF9zdGF0c3AsCisJCQkJICAgIGNwdV90b19sZTY0KHBhKSwgYmVfZ2V0X3N0YXRfY2IsIGN0eHQsCisJCQkJICAgIE5VTEwpOworCisJY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljdHh0OworCW1vZF90aW1lcigmY3R4dC0+Z2V0X3N0YXRzX3RpbWVyLCAoamlmZmllcyArIChIWiAqIDIpKSk7CisJZG93bigodm9pZCAqKWN0eHQtPmdldF9zdGF0X3NlbV9hZGRyKTsJLyogY2FsbGJhY2sgd2lsbCB1bmJsb2NrIHVzICovCisKKwkvKiBBZGRpbmcgcG9ydDAgYW5kIHBvcnQxIHN0YXRzLiAqLworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X3BhY2tldHMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDByZWN2ZHRvdGFsZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcmVjdmR0b3RhbGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAweG1pdHVuaWNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0dW5pY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRieXRlc2xzZCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXhtaXRieXRlc2xzZDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBjcmNlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFjcmNlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9ieXRlcyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHJlY3ZkdG90YWxieXRlc0xTRCArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXJlY3ZkdG90YWxieXRlc0xTRDsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwY3JjZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxY3JjZXJyb3JzOworCisJYWRhcHRlci0+YmVuZXRfc3RhdHMudHhfcGFja2V0cyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRicm9hZGNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0YnJvYWRjYXN0ZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X2Vycm9ycyA9IDA7CisKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5tdWx0aWNhc3QgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0bXVsdGljYXN0ZnJhbWVzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdG11bHRpY2FzdGZyYW1lczsKKworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwcnhmaWZvb3ZlcmZsb3dkcm9wcGVkICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGFsaWdubWVudHN5bWVycnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFhbGlnbm1lbnRzeW1lcnJzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBpbnJhbmdlbGVuZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxaW5yYW5nZWxlbmVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMG91dHJhbmdlZXJyb3JzICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxb3V0cmFuZ2VlcnJvcnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBmcmFtZXRvb2xvbmdlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFmcmFtZXRvb2xvbmdlcnJvcnM7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsICh1bG9uZykgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCSBzaXplb2Yoc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyksCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZXR1cm4gJihhZGFwdGVyLT5iZW5ldF9zdGF0cyk7CisKK30KKworc3RhdGljIHZvaWQgYmVfc3RhcnRfdHgoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHUzMiBucG9zdGVkKQoreworI2RlZmluZSBDU1JfRVRIX01BWF9TUVBPU1RTIDI1NQorCXN0cnVjdCBTUV9EQl9BTUFQIHNxZGI7CisKKwlzcWRiLmR3WzBdID0gMDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBjaWQsICZzcWRiLCBwbm9iLT50eF9xX2lkKTsKKwl3aGlsZSAobnBvc3RlZCkgeworCQlpZiAobnBvc3RlZCA+IENTUl9FVEhfTUFYX1NRUE9TVFMpIHsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKFNRX0RCLCBudW1Qb3N0ZWQsICZzcWRiLAorCQkJCQkgIENTUl9FVEhfTUFYX1NRUE9TVFMpOworCQkJbnBvc3RlZCAtPSBDU1JfRVRIX01BWF9TUVBPU1RTOworCQl9IGVsc2UgeworCQkJQU1BUF9TRVRfQklUU19QVFIoU1FfREIsIG51bVBvc3RlZCwgJnNxZGIsIG5wb3N0ZWQpOworCQkJbnBvc3RlZCA9IDA7CisJCX0KKwkJUERfV1JJVEUoJnBub2ItPmZuX29iaiwgZXR4X3NxX2RiLCBzcWRiLmR3WzBdKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90eF9yYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIHVwZGF0ZSB0aGUgcmF0ZSBvbmNlIGluIHR3byBzZWNvbmRzICovCisJaWYgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpID4gMiAqIChIWikpIHsKKwkJdTMyIHI7CisJCXIgPSBhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgLworCQkgICAgKChqaWZmaWVzIC0gYWRhcHRlci0+ZXRoX3R4X2ppZmZpZXMpIC8gKEhaKSk7CisJCXIgPSAociAvIDEwMDAwMDApOwkvKiBNIGJ5dGVzL3MgKi8KKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3R4X3JhdGUgPSAociAqIDgpOyAvKiBNIGJpdHMvcyAqLworCQlhZGFwdGVyLT5ldGhfdHhfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmV0aF90eF9ieXRlcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHdyYl9jbnRfaW5fc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGNudCA9IDA7CisJd2hpbGUgKHNrYikgeworCQlpZiAoc2tiLT5sZW4gPiBza2ItPmRhdGFfbGVuKQorCQkJY250Kys7CisJCWNudCArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisJQlVHX09OKGNudCA+IEJFX01BWF9UWF9GUkFHX0NPVU5UKTsKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgdm9pZCB3cmJfZmlsbChzdHJ1Y3QgRVRIX1dSQl9BTUFQICp3cmIsIHU2NCBhZGRyLCBpbnQgbGVuKQoreworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfcGFfaGksIHdyYiwgYWRkciA+PiAzMik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9sbywgd3JiLCBhZGRyICYgMHhGRkZGRkZGRik7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19sZW4sIHdyYiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgd3JiX2ZpbGxfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJd3JiLT5kd1syXSA9IDA7CisJd3JiLT5kd1szXSA9IDA7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgY3JjLCB3cmIsIDEpOworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID4gMSAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxzbywgd3JiLCAxKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgbHNvX21zcywgd3JiLAorCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7CisJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXU4IHByb3RvID0gKChzdHJ1Y3QgaXBoZHIgKilpcF9oZHIoc2tiKSktPnByb3RvY29sOworCQlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB0Y3Bjcywgd3JiLCAxKTsKKwkJZWxzZSBpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApCisJCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB1ZHBjcywgd3JiLCAxKTsKKwl9CisJaWYgKHBub2ItPnZsYW5fZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuLCB3cmIsIDEpOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCB2bGFuX3RhZywgd3JiLCB2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JiX2NvcHlfZXh0cmEoc3RydWN0IEVUSF9XUkJfQU1BUCAqdG8sCisJCQkJICBzdHJ1Y3QgRVRIX1dSQl9BTUFQICpmcm9tKQoreworCisJdG8tPmR3WzJdID0gZnJvbS0+ZHdbMl07CisJdG8tPmR3WzNdID0gZnJvbS0+ZHdbM107Cit9CisKKy8qIFJldHVybnMgdGhlIGFjdHVhbCBjb3VudCBvZiB3cmJzIHVzZWQgaW5jbHVkaW5nIGEgcG9zc2libGUgZHVtbXkgKi8KK3N0YXRpYyBpbnQgY29weV9za2JfdG9fdHhxKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgdTMyIHdyYl9jbnQsIHUzMiAqY29waWVkKQoreworCXU2NCBidXNhZGRyOworCXN0cnVjdCBFVEhfV1JCX0FNQVAgKndyYiA9IE5VTEwsICpmaXJzdCA9IE5VTEw7CisJdTMyIGk7CisJYm9vbCBkdW1teSA9IHRydWU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwbm9iLT5hZGFwdGVyLT5wZGV2OworCisJaWYgKHdyYl9jbnQgJiAxKQorCQl3cmJfY250Kys7CisJZWxzZQorCQlkdW1teSA9IGZhbHNlOworCisJYXRvbWljX2FkZCh3cmJfY250LCAmcG5vYi0+dHhfcV91c2VkKTsKKworCXdoaWxlIChza2IpIHsKKwkJaWYgKHNrYi0+bGVuID4gc2tiLT5kYXRhX2xlbikgeworCQkJaW50IGxlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIGxlbiwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1c2FkZHIgPSBjcHVfdG9fbGU2NChidXNhZGRyKTsKKwkJCXdyYiA9ICZwbm9iLT50eF9xW3Bub2ItPnR4X3FfaGRdOworCQkJaWYgKGZpcnN0ID09IE5VTEwpIHsKKwkJCQl3cmJfZmlsbF9leHRyYSh3cmIsIHNrYiwgcG5vYik7CisJCQkJZmlyc3QgPSB3cmI7CisJCQl9IGVsc2UgeworCQkJCXdyYl9jb3B5X2V4dHJhKHdyYiwgZmlyc3QpOworCQkJfQorCQkJd3JiX2ZpbGwod3JiLCBidXNhZGRyLCBsZW4pOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gbGVuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9CisJCQkgICAgJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlidXNhZGRyID0gcGNpX21hcF9wYWdlKHBkZXYsIGZyYWctPnBhZ2UsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVzYWRkciA9IGNwdV90b19sZTY0KGJ1c2FkZHIpOworCQkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCQlpZiAoZmlyc3QgPT0gTlVMTCkgeworCQkJCXdyYl9maWxsX2V4dHJhKHdyYiwgc2tiLCBwbm9iKTsKKwkJCQlmaXJzdCA9IHdyYjsKKwkJCX0gZWxzZSB7CisJCQkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCQl9CisJCQl3cmJfZmlsbCh3cmIsIGJ1c2FkZHIsIGZyYWctPnNpemUpOworCQkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwkJCSpjb3BpZWQgKz0gZnJhZy0+c2l6ZTsKKwkJfQorCQlza2IgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl9CisKKwlpZiAoZHVtbXkpIHsKKwkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCUJVR19PTihmaXJzdCA9PSBOVUxMKTsKKwkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCXdyYl9maWxsKHdyYiwgMCwgMCk7CisJCWJlX2Fkdl90eHFfaGQocG5vYik7CisJfQorCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGNvbXBsZXRlLCB3cmIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIGxhc3QsIHdyYiwgMSk7CisJcmV0dXJuIHdyYl9jbnQ7Cit9CisKKy8qIEZvciBlYWNoIHNrYiB0cmFuc21pdHRlZCwgdHhfY3R4dCBzdG9yZXMgdGhlIG51bSBvZiB3cmJzIGluIHRoZQorICogc3RhcnQgaW5kZXggYW5kIHNrYiBwb2ludGVyIGluIHRoZSBlbmQgaW5kZXgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgd3JiX2NudCwKKwkJCQkJICAgdTMyIHN0YXJ0KQoreworCSoodTMyICopICgmcG5vYi0+dHhfY3R4dFtzdGFydF0pID0gd3JiX2NudDsKKwlpbmRleF9hZHYoJnN0YXJ0LCB3cmJfY250IC0gMSwgcG5vYi0+dHhfcV9sZW4pOworCXBub2ItPnR4X2N0eHRbc3RhcnRdID0gc2tiOworfQorCitzdGF0aWMgaW50IGJlbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXUzMiB3cmJfY250LCBjb3BpZWQgPSAwOworCXUzMiBzdGFydCA9IHBub2ItPnR4X3FfaGQ7CisKKwlhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9yZXFzKys7CisKKwl3cmJfY250ID0gd3JiX2NudF9pbl9za2Ioc2tiKTsKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwlpZiAoKHBub2ItPnR4X3FfbGVuIC0gMiAtIGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpKSA8PSB3cmJfY250KSB7CisJCW5ldGlmX3N0b3BfcXVldWUocG5vYi0+bmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZmFpbHMrKzsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhxX2xvY2spOworCisJd3JiX2NudCA9IGNvcHlfc2tiX3RvX3R4cShwbm9iLCBza2IsIHdyYl9jbnQsICZjb3BpZWQpOworCWJlX3R4X3dyYl9pbmZvX3JlbWVtYmVyKHBub2IsIHNrYiwgd3JiX2NudCwgc3RhcnQpOworCisJYmVfc3RhcnRfdHgocG5vYiwgd3JiX2NudCk7CisKKwlhZGFwdGVyLT5ldGhfdHhfYnl0ZXMgKz0gY29waWVkOworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3dyYnMgKz0gd3JiX2NudDsKKwl1cGRhdGVfdHhfcmF0ZShhZGFwdGVyKTsKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gY2hhbmdlIHRoZSBtdHUgb2YgdGhlIGRldmljZQorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGFuZCBlcnJubyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBiZW5ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCS8qCisJICogQkUgc3VwcG9ydHMganVtYm8gZnJhbWUgc2l6ZSB1cHRvIDkwMDAgYnl0ZXMgaW5jbHVkaW5nIHRoZSBsaW5rIGxheWVyCisJICogaGVhZGVyLiBDb25zaWRlcmluZyB0aGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIGZyYW1lIGZvcm1hdHMgcG9zc2libGUKKwkgKiBsaWtlIFZMQU4sIFNOQVAvTExDLCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBmb3IgTVRVIGlzIDg5NzQgYnl0ZXMKKwkgKi8KKworCWlmIChuZXdfbXR1IDwgKEVUSF9aTEVOICsgRVRIX0ZDU19MRU4pIHx8IChuZXdfbXR1ID4gQkVfTUFYX01UVSkpIHsKKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LCAiSW52YWxpZCBNVFUgcmVxdWVzdGVkLiAiCisJCQkgICAgICAgIk11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQgYnl0ZXNcbiIsCisJCQkJICAgICAgIChFVEhfWkxFTiArIEVUSF9GQ1NfTEVOKSwgQkVfTUFYX01UVSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJNVFUgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCQkJbmV0ZGV2LT5tdHUsIG5ld19tdHUpOworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCB0byByZWdpc3RlciBhIHZsYW4gd2l0aCB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWJlX2Rpc2FibGVfZXFfaW50cihwbm9iKTsKKwlwbm9iLT52bGFuX2dycCA9IGdycDsKKwlwbm9iLT5udW1fdmxhbnMgPSAwOworCWJlX2VuYWJsZV9lcV9pbnRyKHBub2IpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIGFkZCBhIHZsYW4gdmxhbl9pZAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldgorICovCitzdGF0aWMgdm9pZCBiZW5ldF92bGFuX2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZsYW5faWQpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKHBub2ItPm51bV92bGFucyA9PSAoQkVfTlVNX1ZMQU5fU1VQUE9SVEVEIC0gMSkpIHsKKwkJLyogbm8gIHdheSB0byByZXR1cm4gYW4gZXJyb3IgKi8KKwkJZGV2X2luZm8oJm5ldGRldi0+ZGV2LAorCQkgICAgICAgIkJsYWRlRW5naW5lOiBDYW5ub3QgY29uZmlndXJlIG1vcmUgdGhhbiAlZCBWbGFuc1xuIiwKKwkJCSAgICAgICBCRV9OVU1fVkxBTl9TVVBQT1JURUQpOworCQlyZXR1cm47CisJfQorCS8qIFRoZSBuZXcgdmxhbiB0YWcgd2lsbCBiZSBpbiB0aGUgc2xvdCBpbmRpY2F0ZWQgYnkgbnVtX3ZsYW5zLiAqLworCXBub2ItPnZsYW5fdGFnW3Bub2ItPm51bV92bGFucysrXSA9IHZsYW5faWQ7CisJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQkgICBwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gcmVtb3ZlIGEgdmxhbiB2bGFuX2lkCisgKiB3aXRoIHRoZSBkZXZpY2UgbmV0ZGV2CisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl1MzIgaSwgdmFsdWU7CisKKwkvKgorCSAqIEluIEJsYWRlIEVuZ2luZSwgd2Ugc3VwcG9ydCAzMiB2bGFuIHRhZyBmaWx0ZXJzIGFjcm9zcyBib3RoIHBvcnRzLgorCSAqIFRvIHByb2dyYW0gYSB2bGFuIHRhZywgdGhlIFJYRl9SVFBSX0NTUiByZWdpc3RlciBpcyB1c2VkLgorCSAqIEVhY2ggMzItYml0IHZhbHVlIG9mIFJYRl9SVERSX0NTUiBjYW4gYWRkcmVzcyAyIHZsYW4gdGFnIGVudHJpZXMuCisJICogVGhlIFZsYW4gdGFibGUgaXMgb2YgZGVwdGggMTYuIHRodXMgd2Ugc3VwcG9ydCAzMiB0YWdzLgorCSAqLworCisJdmFsdWUgPSB2bGFuX2lkIHwgVkxBTl9WQUxJRF9CSVQ7CisJZm9yIChpID0gMDsgaSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlmIChwbm9iLT52bGFuX3RhZ1tpXSA9PSB2bGFuX2lkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gQkVfTlVNX1ZMQU5fU1VQUE9SVEVEKQorCQlyZXR1cm47CisJLyogTm93IGNvbXBhY3QgdGhlIHZsYW4gdGFnIGFycmF5IGJ5IHJlbW92aW5nIGhvbGUgY3JlYXRlZC4gKi8KKwl3aGlsZSAoKGkgKyAxKSA8IEJFX05VTV9WTEFOX1NVUFBPUlRFRCkgeworCQlwbm9iLT52bGFuX3RhZ1tpXSA9IHBub2ItPnZsYW5fdGFnW2kgKyAxXTsKKwkJaSsrOworCX0KKwlpZiAoKGkgKyAxKSA9PSBCRV9OVU1fVkxBTl9TVVBQT1JURUQpCisJCXBub2ItPnZsYW5fdGFnW2ldID0gKHUxNikgMHgwOworCXBub2ItPm51bV92bGFucy0tOworCWJlX3J4Zl92bGFuX2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgcG5vYi0+bnVtX3ZsYW5zLAorCQkJICAgcG5vYi0+dmxhbl90YWcsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvZ3JhbSBtdWx0aWNhc3QKKyAqIGFkZHJlc3MgaW4gdGhlIG11bHRpY2FzdCBmaWx0ZXIgb2YgdGhlIEFTSUMuCisgKi8KK3N0YXRpYyB2b2lkIGJlX3NldF9tdWx0aWNhc3RfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXU4IG1hY19hZGRyWzMyXVtFVEhfQUxFTl07CisJaW50IGk7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBzZXQgQkUgaW4gTXVsdGljYXN0IHByb21pc2N1b3VzICovCisJCWJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKCZwbm9iLT5mbl9vYmosIHRydWUsIDAsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3QsIGkgPSAwOyBtY19wdHI7CisJICAgICBtY19wdHIgPSBtY19wdHItPm5leHQsIGkrKykgeworCQltZW1jcHkoJm1hY19hZGRyW2ldWzBdLCBtY19wdHItPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJfQorCisJLyogcmVzZXQgdGhlIHByb21pc2N1b3VzIG1vZGUgYWxzby4gKi8KKwliZV9yeGZfbXVsdGljYXN0X2NvbmZpZygmcG5vYi0+Zm5fb2JqLCBmYWxzZSwgaSwKKwkJCQkmbWFjX2FkZHJbMF1bMF0sIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIHNldCBtdWx0aWNhc3QgbGlzdAorICogd2l0aCB0aGUgZGV2aWNlIG5ldGRldi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8KKyAqIHNldCBwcm9taXNjdW91cyBtb2RlIG9yIG11bHRpY2FzdCBwcm9taXNjdW91cyBtb2RlCisgKiBvciBtdWx0aWNhc3QgbW9kZS4uLi4KKyAqLworc3RhdGljIHZvaWQgYmVuZXRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQliZV9yeGZfcHJvbWlzY3VvdXMoJnBub2ItPmZuX29iaiwgMSwgMSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJYmVfcnhmX3Byb21pc2N1b3VzKCZwbm9iLT5mbl9vYmosIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCQliZV9zZXRfbXVsdGljYXN0X2ZpbHRlcihuZXRkZXYpOworCX0KK30KKworaW50IGJlbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCisJZXRoZXJfc2V0dXAobmV0ZGV2KTsKKworCW5ldGRldi0+b3BlbiA9ICZiZW5ldF9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZiZW5ldF9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZiZW5ldF94bWl0OworCisJbmV0ZGV2LT5nZXRfc3RhdHMgPSAmYmVuZXRfZ2V0X3N0YXRzOworCisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmYmVuZXRfc2V0X211bHRpY2FzdF9saXN0OworCisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmJlbmV0X2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmYmVuZXRfc2V0X21hY19hZGRyOworCisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gYmVuZXRfdmxhbl9yZWdpc3RlcjsKKwluZXRkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IGJlbmV0X3ZsYW5fYWRkX3ZpZDsKKwluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBiZW5ldF92bGFuX3JlbV92aWQ7CisKKwluZXRkZXYtPmZlYXR1cmVzID0KKwkgICAgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfSFdfVkxBTl9SWCB8IE5FVElGX0ZfVFNPIHwKKwkgICAgTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUiB8IE5FVElGX0ZfSVBfQ1NVTTsKKworCW5ldGRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworCS8qIElmIGRldmljZSBpcyBEQUMgQ2FwYWJsZSwgc2V0IHRoZSBISUdIRE1BIGZsYWcgZm9yIG5ldGRldmljZS4gKi8KKwlpZiAoYWRhcHRlci0+ZG1hXzY0Yml0X2NhcCkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmYmVfZXRodG9vbF9vcHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWExZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlbmV0LmgKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpZm5kZWYgX0JFTkVUX0hfCisjZGVmaW5lIF9CRU5FVF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKyNpbmNsdWRlICJod2xpYi5oIgorCisjZGVmaW5lIF9TQV9NT0RVTEVfTkFNRSAibmV0LWRyaXZlciIKKworI2RlZmluZSBWTEFOX1ZBTElEX0JJVAkJMHg4MDAwCisjZGVmaW5lIEJFX05VTV9WTEFOX1NVUFBPUlRFRAkzMgorI2RlZmluZSBCRV9QT1JUX0xJTktfRE9XTiAgICAgICAwMDAwCisjZGVmaW5lIEJFX1BPUlRfTElOS19VUCAgICAgICAgIDAwMDEKKyNkZWZpbmUJQkVfTUFYX1RYX0ZSQUdfQ09VTlQJCSgzMCkKKworLyogRmxhZyBiaXRzIGZvciBzZW5kIG9wZXJhdGlvbiAqLworI2RlZmluZSBJUENTICAgICAgICAgICAgKDEgPDwgMCkJLyogRW5hYmxlIElQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgVURQQ1MgICAgICAgICAgICgxIDw8IDEpCS8qIEVuYWJsZSBVRFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBUQ1BDUyAgICAgICAgICAgKDEgPDwgMikJLyogRW5hYmxlIFRDUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIExTTyAgICAgICAgICAgICAoMSA8PCAzKQkvKiBFbmFibGUgTGFyZ2UgU2VnbWVudCAgb2ZmbG9hZCAqLworI2RlZmluZSBFVEhWTEFOICAgICAgICAgKDEgPDwgNCkJLyogRW5hYmxlIFZMQU4gaW5zZXJ0ICovCisjZGVmaW5lIEVUSEVWRU5UICAgICAgICAoMSA8PCA1KQkvKiBHZW5lcmF0ZSAgZXZlbnQgb24gY29tcGxldGlvbiAqLworI2RlZmluZSBFVEhDT01QTEVURSAgICAgKDEgPDwgNikJLyogR2VuZXJhdGUgY29tcGxldGlvbiB3aGVuIGRvbmUgKi8KKyNkZWZpbmUgSVBTRUMgICAgICAgICAgICgxIDw8IDcpCS8qIEVuYWJsZSBJUFNFQyAqLworI2RlZmluZSBGT1JXQVJEICAgICAgICAgKDEgPDwgOCkJLyogU2VuZCB0aGUgcGFja2V0IGluIGZvcndhcmRpbmcgcGF0aCAqLworI2RlZmluZSBGSU4gICAgICAgICAgICAgKDEgPDwgOSkJLyogSXNzdWUgRklOIHNlZ21lbnQgKi8KKworI2RlZmluZSBCRV9NQVhfTVRVCTg5NzQKKworI2RlZmluZSBCRV9NQVhfTFJPX0RFU0NSSVBUT1JTCQkJOAorI2RlZmluZSBCRV9MUk9fTUFYX1BLVFMJCQkJNjQKKyNkZWZpbmUgQkVfTUFYX0ZSQUdTX1BFUl9GUkFNRQkJCTYKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmVfZHJ2cl92ZXJbXTsKK2V4dGVybiBjaGFyIGJlX2Z3X3ZlcltdOworZXh0ZXJuIGNoYXIgYmVfZHJpdmVyX25hbWVbXTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wczsKKworI2RlZmluZSBCRV9ERVZfU1RBVEVfTk9ORSAwCisjZGVmaW5lIEJFX0RFVl9TVEFURV9JTklUIDEKKyNkZWZpbmUgQkVfREVWX1NUQVRFX09QRU4gMgorI2RlZmluZSBCRV9ERVZfU1RBVEVfU1VTUEVORCAzCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGh5c2ljYWwgZnJhZ21lbnRzIHRvIHVzZQorICogZm9yIERNQWluZyBkYXRhIGZyb20gTklDLgorICovCitzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgcnhiX2xpc3Q7CS8qIGZvciBtYWludGFpbmluZyBhIGxpbmtlZCBsaXN0ICovCisJdm9pZCAqcnhiX3ZhOwkJLyogYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCXUzMiByeGJfcGFfbG87CQkvKiBsb3cgcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9wYV9oaTsJCS8qIGhpZ2ggcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9sZW47CQkvKiBsZW5ndGggb2YgcmVjdiBidWZmZXIgKi8KKwl2b2lkICpyeGJfY3R4dDsJCS8qIGNvbnRleHQgZm9yIE9TTSBkcml2ZXIgdG8gdXNlICovCit9OworCisvKgorICogZnJhZ21lbnQgbGlzdCB0byBkZXNjcmliZSBzY2F0dGVyZWQgZGF0YS4KKyAqLworc3RydWN0IGJlX3R4X2ZyYWdfbGlzdCB7CisJdTMyIHR4Yl9sZW47CQkvKiBTaXplIG9mIHRoaXMgZnJhZ21lbnQgKi8KKwl1MzIgdHhiX3BhX2xvOwkJLyogTG93ZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworCXUzMiB0eGJfcGFfaGk7CQkvKiBIaWdoZXIgMzIgYml0cyBvZiA2NCBiaXQgcGh5c2ljYWwgYWRkciAqLworfTsKKworc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBidXM7CisJdTE2IHBhZ2Vfb2Zmc2V0OworfTsKKworLyoKKyAqICBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgbWFpbiB0cmFja2luZyBzdHJ1Y3R1cmUgZm9yIGEgTklDIGludGVyZmFjZS4KKyAqLworc3RydWN0IGJlX25ldF9vYmplY3QgeworCS8qIE1DQyBSaW5nIC0gdXNlZCB0byBzZW5kIGZ3Y21kcyB0byBlbWJlZGRlZCBBUk0gcHJvY2Vzc29yICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqbWNjX3E7CS8qIFZBIG9mIHRoZSBzdGFydCBvZiB0aGUgcmluZyAqLworCXUzMiBtY2NfcV9sZW47CQkJLyogIyBvZiBXUkIgZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX3Ffc2l6ZTsKKwl1MzIgbWNjX3FfaGQ7CQkJLyogTUNDIHJpbmcgaGVhZCAqLworCXU4IG1jY19xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9tY2Nfb2JqZWN0IG1jY19xX29iajsJLyogQkVDTElCJ3MgTUNDIHJpbmcgT2JqZWN0ICovCisJZG1hX2FkZHJfdCBtY2NfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwkvKiBNQ0MgQ29tcGxldGlvbiBSaW5nIC0gRlcgcmVzcG9uc2VzIHRvIGZ3Y21kcyBzZW50IGZyb20gTUNDIHJpbmcgKi8KKwlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKm1jY19jcTsgLyogVkEgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIG1jY19jcV9sZW47CQkJLyogIyBvZiBjb21wbC4gZW50cmllcyBpbiB0aGlzIHJpbmcgKi8KKwl1MzIgbWNjX2NxX3NpemU7CisJdTMyIG1jY19jcV90bDsJCQkvKiBjb21wbC4gcmluZyB0YWlsICovCisJdTggbWNjX2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgbWNjX2NxX29iajsJLyogQkVDTElCJ3MgTUNDIGNvbXBsLiByaW5nIG9iamVjdCAqLworCXUzMiBtY2NfY3FfaWQ7CQkJLyogTUNDIHJpbmcgSUQgKi8KKwlkbWFfYWRkcl90IG1jY19jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisKKwlzdHJ1Y3QgcmluZ19kZXNjIG1iX3JkOwkJLyogUkQgZm9yIE1DQ19NQUlMX0JPWCAqLworCXZvaWQgKm1iX3B0cjsJCQkvKiBtYWlsYm94IHB0ciB0byBiZSBmcmVlZCAgKi8KKwlkbWFfYWRkcl90IG1iX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwl1MzIgbWJfc2l6ZTsKKworCS8qIEJFQ2xpYiB1c2VzIGFuIGFycmF5IG9mIGNvbnRleHQgb2JqZWN0cyB0byB0cmFjayBvdXRzdGFuZGluZworCSAqIHJlcXVlc3RzIHRvIHRoZSBNQ0MuICBXZSBuZWVkIGFsbG9jYXRlIHRoZSBzYW1lIG51bWJlciBvZgorCSAqIGNvbmV4dCBlbnRyaWVzIGFzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTUNDIFdSQiByaW5nCisJICovCisJdTMyIG1jY193cmJfY3R4dF9zaXplOworCXZvaWQgKm1jY193cmJfY3R4dDsJCS8qIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgYXJlYSAqLworCXUzMiBtY2Nfd3JiX2N0eHRMZW47CQkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29udGV4dCAqLworCS8qCisJICogTklDIHNlbmQgcmVxdWVzdCByaW5nIC0gdXNlZCBmb3IgeG1pdHRpbmcgcmF3IGV0aGVyIGZyYW1lcy4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1dSQl9BTUFQICp0eF9xOwkvKiBWQSBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcgKi8KKwl1MzIgdHhfcV9sZW47CQkJLyogIyBpZiBlbnRyaWVzIGluIHRoZSBzZW5kIHJpbmcgKi8KKwl1MzIgdHhfcV9zaXplOworCXUzMiB0eF9xX2hkOwkJCS8qIEhlYWQgaW5kZXguIE5leHQgcmVxLiBnb2VzIGhlcmUgKi8KKwl1MzIgdHhfcV90bDsJCQkvKiBUYWlsIGluZHguIG9sZGVzdCBvdXRzdGFuZGluZyByZXEuICovCisJdTggdHhfcV9jcmVhdGVkOwkJLyogZmxhZyB0byBoZWxwIGNsZWFudXAgKi8KKwlzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0IHR4X3Ffb2JqOy8qIEJFQ0xJQidzIHNlbmQgUSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHR4X3FfYnVzOwkJLyogRE1BJ2JsZSBidXMgYWRkcmVzcyAqLworCXUzMiB0eF9xX2lkOwkJCS8qIHNlbmQgcXVldWUgcmluZyBJRCAqLworCXUzMiB0eF9xX3BvcnQ7CQkJLyogMCBubyBiaW5kaW5nLCAxIHBvcnQgQSwgIDIgcG9ydCBCICovCisJYXRvbWljX3QgdHhfcV91c2VkOwkJLyogIyBvZiBXUkJzIHVzZWQgKi8KKwkvKiBwdHIgdG8gYW4gYXJyYXkgaW4gd2hpY2ggd2Ugc3RvcmUgY29udGV4dCBpbmZvIGZvciBlYWNoIHNlbmQgcmVxLiAqLworCXZvaWQgKip0eF9jdHh0OworCS8qCisJICogTklDIFNlbmQgY29tcGwuIHJpbmcgLSBjb21wbGV0aW9uIHN0YXR1cyBmb3IgYWxsIE5JQyBmcmFtZXMgeG1pdHRlZC4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgKnR4X2NxOy8qIFZBIG9mIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIHR4Y3FfbGVuOwkJCS8qICMgb2YgZW50cmllcyBpbiB0aGUgcmluZyAqLworCXUzMiB0eF9jcV9zaXplOworCS8qCisJICogaW5kZXggaW50byBjb21wbCByaW5nIHdoZXJlIHRoZSBob3N0IGV4cGVjdHMgbmV4dCBjb21wbGV0aW9uIGVudHJ5CisJICovCisJdTMyIHR4X2NxX3RsOworCXUzMiB0eF9jcV9pZDsJCQkvKiBjb21wbGV0aW9uIHF1ZXVlIGlkICovCisJdTggdHhfY3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2NxX29iamVjdCB0eF9jcV9vYmo7CisJZG1hX2FkZHJfdCB0eF9jcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBFdmVudCBRdWV1ZSAtIGFsbCBjb21wbGV0aW9uIGVudHJpZXMgcG9zdCBldmVudHMgaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXZlbnRfcTsJLyogVkEgb2Ygc3RhcnQgb2YgZXZlbnQgcXVldWUgKi8KKwl1MzIgZXZlbnRfcV9sZW47CQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgZXZlbnRfcV9zaXplOworCXUzMiBldmVudF9xX3RsOwkJCS8qIFRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICovCisJdTMyIGV2ZW50X3FfaWQ7CQkJLyogRXZlbnQgcXVldWUgSUQgKi8KKwl1OCBldmVudF9xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9lcV9vYmplY3QgZXZlbnRfcV9vYmo7IC8qIFF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgZXZlbnRfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBOSUMgcmVjZWl2ZSBxdWV1ZSAtIERhdGEgYnVmZmVycyB0byBiZSB1c2VkIGZvciByZWNlaXZpbmcgdW5pY2FzdCwKKwkgKiBicm9hZGNhc3QgYW5kIG11bHRpLWNhc3QgZnJhbWVzICBhcmUgcG9zdGVkIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9EX0FNQVAgKnJ4X3E7CS8qIFZBIG9mIHN0YXJ0IG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9xX2xlbjsJCQkvKiAjIG9mIGVudHJpZXMgKi8KKwl1MzIgcnhfcV9zaXplOworCXUzMiByeF9xX2hkOwkJCS8qIEhlYWQgb2YgdGhlIHF1ZXVlICovCisJYXRvbWljX3QgcnhfcV9wb3N0ZWQ7CQkvKiBudW1iZXIgb2YgcG9zdGVkIGJ1ZmZlcnMgKi8KKwl1MzIgcnhfcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2V0aHJxX29iamVjdCByeF9xX29iajsJLyogTklDIFJYIHF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgcnhfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJLyoKKwkgKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIG9wYXF1ZSBjb250ZXh0IG9iamVjdCBmb3IgdXNlIGJ5IE9TTSBkcml2ZXIKKwkgKi8KKwl2b2lkICoqcnhfY3R4dDsKKwkvKgorCSAqIE5JQyB1bmljYXN0IFJYIGNvbXBsZXRpb24gcXVldWUgLSBhbGwgdW5pY2FzdCBldGhlciBmcmFtZSBjb21wbGV0aW9uCisJICogc3RhdHVzZXMgZnJvbSBCRSBjb21lIGhlcmUuCisJICovCisJc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeF9jcTsJLyogVkEgb2Ygc3RhcnQgb2YgdGhlIHF1ZXVlICovCisJdTMyIHJ4X2NxX2xlbjsJCS8qICMgb2YgZW50cmllcyAqLworCXUzMiByeF9jcV9zaXplOworCXUzMiByeF9jcV90bDsJCQkvKiBUYWlsIG9mIHRoZSBxdWV1ZSAqLworCXUzMiByeF9jcV9pZDsJCQkvKiBxdWV1ZSBJRCAqLworCXU4IHJ4X2NxX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9jcV9vYmplY3QgcnhfY3Ffb2JqOwkvKiBxdWV1ZSBoYW5kbGUgKi8KKwlkbWFfYWRkcl90IHJ4X2NxX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0IGZuX29iajsJLyogZnVuY3Rpb24gb2JqZWN0ICAgKi8KKwlib29sCWZuX29ial9jcmVhdGVkOworCXUzMiByeF9idWZfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIFJYIGJ1ZmZlcnMgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGJlX3JlY3ZfYnVmZmVyIGV0aF9yeF9idWZzWzI1Nl07CS8qIHRvIHBhc3MgUnggYnVmZmVyCisJCQkJCQkJICAgYWRkcmVzc2VzICovCisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CS8qIFBvaW50ZXIgdG8gT1NNIGFkYXB0ZXIgKi8KKwl1MzIgZGV2bm87CQkvKiBPU00sIG5ldHdvcmsgZGV2IG5vLiAqLworCXUzMiB1c2VfcG9ydDsJCS8qIEN1cnJlbnQgYWN0aXZlIHBvcnQgKi8KKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CS8qIEFycmF5IG9mIFJ4IGJ1ZiBwYWdlcyAqLworCXUzMiByeF9wZ19pbmZvX2hkOwkvKiBIZWFkIG9mIHF1ZXVlICovCisJaW50IHJ4YnVmX3Bvc3RfZmFpbDsJLyogUnhCdWZmIHBvc3RpbmcgZmFpbCBjb3VudCAqLworCWJvb2wgcnhfcGdfc2hhcmVkOwkvKiBJcyBhbiBhbGxvY3N0ZWQgcGFnZSBzaGFyZWQgYXMgdHdvIGZyYWdzID8gKi8KKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CisJdTMyIG51bV92bGFuczsJCS8qIE51bWJlciBvZiB2bGFucyBpbiBCRSdzIGZpbHRlciAqLworCXUxNiB2bGFuX3RhZ1tCRV9OVU1fVkxBTl9TVVBQT1JURURdOyAvKiB2bGFucyBjdXJyZW50bHkgY29uZmlndXJlZCAqLworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworCXN0cnVjdCBuZXRfbHJvX21nciBscm9fbWdyOworCXN0cnVjdCBuZXRfbHJvX2Rlc2MgbHJvX2Rlc2NbQkVfTUFYX0xST19ERVNDUklQVE9SU107Cit9OworCisjZGVmaW5lIE5FVF9GSChucCkgICAgICAgKCYobnApLT5mbl9vYmopCisKKy8qCisgKiBCRSBkcml2ZXIgc3RhdGlzdGljcy4KKyAqLworc3RydWN0IGJlX2RydnJfc3RhdCB7CisJdTMyIGJlc190eF9yZXFzOwkvKiBudW1iZXIgb2YgVFggcmVxdWVzdHMgaW5pdGlhdGVkICovCisJdTMyIGJlc190eF9mYWlsczsJLyogbnVtYmVyIG9mIFRYIHJlcXVlc3RzIHRoYXQgZmFpbGVkICovCisJdTMyIGJlc19md2RfcmVxczsJLyogbnVtYmVyIG9mIHNlbmQgcmVxcyB0aHJvdWdoIGZvcndhcmRpbmcgaS9mICovCisJdTMyIGJlc190eF93cmJzOwkvKiBudW1iZXIgb2YgdHggV1JCcyB1c2VkICovCisKKwl1MzIgYmVzX2ludHM7CQkvKiBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworCXUzMiBiZXNfcG9sbHM7CQkvKiBudW1iZXIgb2YgdGltZXMgTkFQSSBjYWxsZWQgcG9sbCBmdW5jdGlvbiAqLworCXUzMiBiZXNfZXZlbnRzOwkJLyogdG90YWwgZXZldCBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfdHhfZXZlbnRzOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBldmVudHMgICovCisJdTMyIGJlc19yeF9ldmVudHM7CS8qIG51bWJlciBvZiB1Y2FzdCByeCBjb21wbGV0aW9uIGV2ZW50cyAgKi8KKwl1MzIgYmVzX3R4X2NvbXBsOwkvKiBudW1iZXIgb2YgdHggY29tcGxldGlvbiBlbnRyaWVzIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfcnhfY29tcGw7CS8qIG51bWJlciBvZiByeCBjb21wbGV0aW9uIGVudHJpZXMKKwkJCQkgICBwcm9jZXNzZWQgKi8KKwl1MzIgYmVzX2V0aHJ4X3Bvc3RfZmFpbDsJLyogbnVtYmVyIG9mIGV0aHJ4IGJ1ZmZlciBhbGxvYworCQkJCQkgICBmYWlsdXJlcyAqLworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBkcm9wcGVkIHdoZXJlCisJICogZnJhbWUgbGVuID4gbGVuZ3RoIGZpZWxkIG9mIE1hYyBIZHIKKwkgKi8KKwl1MzIgYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzOworCS8qCisJICogbnVtYmVyIG9mIG5vbiBldGhlciB0eXBlIElJIGZyYW1lcyBtYWxmb3JtZWQgd2hlcmUKKwkgKiBpbiBmcmFtZSBsZW4gPCBsZW5ndGggZmllbGQgb2YgTWFjIEhkcgorCSAqLworCXUzMiBiZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lczsKKwl1MzIgYmVzX2lwczsJCS8qICBpbnRlcnJ1cHRzIC8gc2VjICovCisJdTMyIGJlc19wcmV2X2ludHM7CS8qIGJlc19pbnRzIGF0IGxhc3QgSVBTIGNhbGN1bGF0aW9uICAqLworCXUxNiBiZXNfZXRoX3R4X3JhdGU7CS8qICBFVEggVFggcmF0ZSAtIE1iL3NlYyAqLworCXUxNiBiZXNfZXRoX3J4X3JhdGU7CS8qICBFVEggUlggcmF0ZSAtIE1iL3NlYyAqLworCXUzMiBiZXNfcnhfY29hbDsJLyogTnVtIHBrdHMgY29hbGFzY2VkICovCisJdTMyIGJlc19yeF9mbHVzaDsJLyogTnVtIHRpbWVzIGNvYWxhc2NlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfcGh5c2ljYWw7CS8qTnVtIG9mIHRpbWVzIHBoeXNpY2FsIGxpbmsgY2hhbmdlZCAqLworCXUzMiBiZXNfbGlua19jaGFuZ2VfdmlydHVhbDsJLypOdW0gb2YgdGltZXMgdmlydHVhbCBsaW5rIGNoYW5nZWQgKi8KKwl1MzIgYmVzX3J4X21pc2NfcGt0czsJLyogTWlzYyBwa3RzIHJlY2VpdmVkICovCit9OworCisvKiBNYXhpbXVtIGludGVycnVwdCBkZWxheSAoaW4gbWljcm9zZWNvbmRzKSBhbGxvd2VkICovCisjZGVmaW5lIE1BWF9FUUQJCQkJMTIwCisKKy8qCisgKiB0aW1lciB0byBwcmV2ZW50IHN5c3RlbSBzaHV0ZG93biBoYW5nIGZvciBldmVyIGlmIGgvdyBzdG9wcyByZXNwb25kaW5nCisgKi8KK3N0cnVjdCBiZV90aW1lcl9jdHh0IHsKKwlhdG9taWNfdCBnZXRfc3RhdF9mbGFnOworCXN0cnVjdCB0aW1lcl9saXN0IGdldF9zdGF0c190aW1lcjsKKwl1bnNpZ25lZCBsb25nIGdldF9zdGF0X3NlbV9hZGRyOworfSA7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIEJsYWRlRW5naW5lIGRyaXZlciBjb250ZXh0LiAgKi8KK3N0cnVjdCBiZV9hZGFwdGVyIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2cDsKKwlzdHJ1Y3QgYmVfZHJ2cl9zdGF0IGJlX3N0YXQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgYmVuZXRfc3RhdHM7CisKKwkvKiBQQ0kgQkFSIG1hcHBlZCBhZGRyZXNzZXMgKi8KKwl1OCBfX2lvbWVtICpjc3JfdmE7CS8qIENTUiAqLworCXU4IF9faW9tZW0gKmRiX3ZhOwkvKiBEb29yICBCZWxsICAqLworCXU4IF9faW9tZW0gKnBjaV92YTsJLyogUENJIENvbmZpZyAqLworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHN0c19oYW5kbGVyOworCXN0cnVjdCB0aW1lcl9saXN0IGNxX3RpbWVyOworCXNwaW5sb2NrX3QgaW50X2xvY2s7CS8qIHRvIHByb3RlY3QgdGhlIGlzciBmaWVsZCBpbiBhZGFwdGVyICovCisKKwlzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICpldGhfc3RhdHNwOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDaGVja3N1bSBvbiBSeCBwa3RzIHRvIGJlIG9iZXllZCBvciBkaXNvYmV5ZWQuCisJICogSWYgdGhpcyBpcyB0cnVlID0gMSwgdGhlbiB3aGF0ZXZlciBpcyB0aGUgY2hlY2tzdW0gb24gdGhlCisJICogUmVjZWl2ZWQgcGt0IGFzIHBlciBCRSwgaXQgd2lsbCBiZSBnaXZlbiB0byB0aGUgc3RhY2suCisJICogRWxzZSB0aGUgc3RhY2sgd2lsbCByZSBjYWxjdWxhdGUgaXQuCisJICovCisJYm9vbCByeF9jc3VtOworCS8qCisJICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgdXNlIG9mIGV0aHRvb2wgdG8gZW5hYmxlIG9yIGRpc2FibGUKKwkgKiBDb2FsZXNlIG9uIFJ4IHBrdHMgdG8gYmUgb2JleWVkIG9yIGRpc29iZXllZC4KKwkgKiBJZiB0aGlzIGlzIGdyYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiAxNiB0aGVuIGNvYWxhc2NpbmcKKwkgKiBpcyBlbmFibGVkIGVsc2UgaXQgaXMgZGlzYWJsZWQKKwkgKi8KKwl1MzIgbWF4X3J4X2NvYWw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIFBvaW50ZXIgdG8gT1MncyBQQ0kgZHZpY2UgKi8KKworCXNwaW5sb2NrX3QgdHhxX2xvY2s7CS8qIHRvIHN0b3Avd2FrZSBxdWV1ZSBiYXNlZCBvbiB0eF9xX3VzZWQgKi8KKworCXUzMiBpc3I7CQkvKiBjb3B5IG9mIEludHIgc3RhdHVzIHJlZy4gKi8KKworCXUzMiBwb3J0MF9saW5rX3N0czsJLyogUG9ydCAwIGxpbmsgc3RhdHVzICovCisJdTMyIHBvcnQxX2xpbmtfc3RzOwkvKiBwb3J0IDEgbGlzdCBzdGF0dXMgKi8KKwlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmJlX2xpbmtfc3RzOworCisJLyogcG9pbnRlciB0byB0aGUgZmlyc3QgbmV0b2JqZWN0IG9mIHRoaXMgYWRhcHRlciAqLworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpuZXRfb2JqOworCisJLyogIEZsYWdzIHRvIGluZGljYXRlIHdoYXQgdG8gY2xlYW4gdXAgKi8KKwlib29sIHRhc2tsZXRfc3RhcnRlZDsKKwlib29sIGlzcl9yZWdpc3RlcmVkOworCS8qCisJICogYWRhcHRpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgKEFJQykgcmVsYXRlZAorCSAqLworCWJvb2wgZW5hYmxlX2FpYzsJLyogMSBpZiBBSUMgaXMgZW5hYmxlZCAqLworCXUxNiBtaW5fZXFkOwkJLyogbWluaW11bSBFUSBkZWxheSBpbiB1c2VjICovCisJdTE2IG1heF9lcWQ7CQkvKiBtaW5pbXVtIEVRIGRlbGF5IGluIHVzZWMgKi8KKwl1MTYgY3VyX2VxZDsJCS8qIGN1cnJlbnQgRVEgZGVsYXkgaW4gdXNlYyAqLworCS8qCisJICogYm9vayBrZWVwaW5nIGZvciBpbnRlcnJ1cHQgLyBzZWMgYW5kIFRYL1JYIHJhdGUgY2FsY3VsYXRpb24KKwkgKi8KKwl1bG9uZyBpcHNfamlmZmllczsJLyogamlmZmllcyBhdCBsYXN0IElQUyBjYWxjICovCisJdTMyIGV0aF90eF9ieXRlczsKKwl1bG9uZyBldGhfdHhfamlmZmllczsKKwl1MzIgZXRoX3J4X2J5dGVzOworCXVsb25nIGV0aF9yeF9qaWZmaWVzOworCisJc3RydWN0IHNlbWFwaG9yZSBnZXRfZXRoX3N0YXRfc2VtOworCisJLyogdGltZXIgY3R4dCB0byBwcmV2ZW50IHNodXRkb3duIGhhbmdpbmcgZHVlIHRvIHVuLXJlc3BvbnNpdmUgQkUgKi8KKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCB0aW1lcl9jdHh0OworCisjZGVmaW5lIEJFX01BWF9NU0lYX1ZFQ1RPUlMgICAgICAgICAgICAgMzIKKyNkZWZpbmUgQkVfTUFYX1JFUV9NU0lYX1ZFQ1RPUlMgICAgICAgICAxIC8qIG9ubHkgb25lIEVRIGluIExpbnV4IGRyaXZlciAqLworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tCRV9NQVhfTVNJWF9WRUNUT1JTXTsKKwlib29sIG1zaXhfZW5hYmxlZDsKKwlib29sIGRtYV82NGJpdF9jYXA7CS8qIHRoZSBEZXZpY2UgREFDIGNhcGFibGUgIG9yIG5vdCAqLworCXU4IGRldl9zdGF0ZTsJLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRldmljZSAqLworCXU4IGRldl9wbV9zdGF0ZTsgLyogVGhlIFN0YXRlIG9mIGRldmljZSBiZWZvcmUgZ29pbmcgdG8gc3VzcGVuZCAqLworfTsKKworLyoKKyAqIEV2ZXJ5IHNlY29uZCB3ZSBsb29rIGF0IHRoZSBpbnRzL3NlYyBhbmQgYWRqdXN0IGVxX2RlbGF5CisgKiBiZXR3ZWVuIGFkYXB0ZXItPm1pbl9lcWQgYW5kIGFkYXB0ZXItPm1heF9lcWQgdG8ga2VlcCB0aGUgaW50cy9zZWMgYmV0d2VlbgorICogSVBTX0hJX1dNIGFuZCBJUFNfTE9fV00uCisgKi8KKyNkZWZpbmUgSVBTX0hJX1dNCTE4MDAwCisjZGVmaW5lIElQU19MT19XTQk4MDAwCisKKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2Fkdih1MzIgKmluZGV4LCB1MzIgdmFsLCAgdTMyIGxpbWl0KQoreworCUJVR19PTihsaW1pdCAmIChsaW1pdC0xKSk7CisJKmluZGV4ID0gKCppbmRleCArIHZhbCkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluZGV4X2luYyh1MzIgKmluZGV4LCB1MzIgbGltaXQpCit7CisJQlVHX09OKGxpbWl0ICYgKGxpbWl0LTEpKTsKKwkqaW5kZXggPSAoKmluZGV4ICsgMSkgJiAobGltaXQgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9lcV90bChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPmV2ZW50X3FfdGwsIHBub2ItPmV2ZW50X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl90eHFfaGQoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9xX2hkLCBwbm9iLT50eF9xX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZV9hZHZfdHhxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+dHhfcV90bCwgcG5vYi0+dHhfcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3R4Y3FfdGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9jcV90bCwgcG5vYi0+dHhjcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3J4cV9oZChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPnJ4X3FfaGQsIHBub2ItPnJ4X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl9yeGNxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+cnhfY3FfdGwsIHBub2ItPnJ4X2NxX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHR4X2NvbXBsX2xhc3R3cmJfaWR4X2dldChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlyZXR1cm4gKHBub2ItPnR4X3FfdGwgKyAqKHUzMiAqKSZwbm9iLT50eF9jdHh0W3Bub2ItPnR4X3FfdGxdIC0gMSkKKwkJICAgICYgKHBub2ItPnR4X3FfbGVuIC0gMSk7Cit9CisKK2ludCBiZW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworaW50IGJlX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICopOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJlbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgYmVfcHJvY2Vzc19pbnRyKHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CitpcnFyZXR1cm5fdCBiZV9pbnQoaW50IGlycSwgdm9pZCAqZGV2KTsKK3ZvaWQgYmVfcG9zdF9ldGhfcnhfYnVmZnMoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2dldF9zdGF0X2NiKHZvaWQgKiwgaW50LCBzdHJ1Y3QgTUNDX1dSQl9BTUFQICopOwordm9pZCBiZV9nZXRfc3RhdHNfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqKTsKK3ZvaWQgYmVfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9hZGFwdGVyICopOwordm9pZCBiZV9pbml0X3Byb2NmcyhzdHJ1Y3QgYmVfYWRhcHRlciAqKTsKK3ZvaWQgYmVfY2xlYW51cF9wcm9jZnMoc3RydWN0IGJlX2FkYXB0ZXIgKik7CitpbnQgYmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKK3N0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqYmVfZ2V0X3J4X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX25vdGlmeV9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIGludCwgaW50LCBpbnQpOwordm9pZCBiZV9lbmFibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZW5hYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKik7Cit2b2lkIGJlX2Rpc2FibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZGlzYWJsZV9lcV9pbnRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOworaW50IGJlX3NldF91Y19tYWNfYWRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICosIHU4LCB1OCwgdTgsCisJCSAgICB1OCAqLCBtY2Nfd3JiX2NxZV9jYWxsYmFjaywgdm9pZCAqKTsKK2ludCBiZV9nZXRfZmxvd19jdGwoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcEZuT2JqLCBib29sICosIGJvb2wgKik7Cit2b2lkIHByb2Nlc3Nfb25lX3R4X2NvbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1MzIgZW5kX2lkeCk7CisKKyNlbmRpZiAvKiBfQkVORVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZXN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Jlc3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljN2E0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZXN0YXR1cy5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaWZuZGVmIF9CRVNUQVRVU19IXworI2RlZmluZSBfQkVTVEFUVVNfSF8KKworI2RlZmluZSBCRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1BFTkRJTkcKKyAqICBUaGUgQmxhZGVFbmdpbmUgRHJpdmVyIGNhbGwgc3VjY2VlZGVkLCBhbmQgcGVuZGVkIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBCRV9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDA3MDAwMUwpCisjZGVmaW5lIEJFX1NUQVRVU19QRU5ESU5HICAgICAgICAgICAgICAgIChCRV9QRU5ESU5HKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfTk9UX09LCisgKiAgQW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KKyNkZWZpbmUgQkVfTk9UX09LICAgICAgICAgICAgICAgICAgICAgICAgKDB4RTAwNzAwMDJMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX1NZU1RFTV9SRVNPVVJDRVMKKyAqICBJbnN1ZmZpY2llbnQgaG9zdCBzeXN0ZW0gcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSBBUEkuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX1NZU1RFTV9SRVNPVVJDRVMgICAgICAgKDB4RTAwNzAwMDNMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0NISVBfUkVTT1VSQ0VTCisgKiAgSW5zdWZmaWNpZW50IGNoaXAgcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSBBUEkuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0NISVBfUkVTT1VSQ0VTICAgICAgICAgKDB4RTAwNzAwMDRMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX05PX1JFU09VUkNFCisgKiAgSW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBjb21wbGV0ZSByZXF1ZXN0LgorICovCisjZGVmaW5lIEJFX1NUQVRVU19OT19SRVNPVVJDRSAgICAgICAgICAgICgweEUwMDcwMDA1TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19CVVNZCisgKiAgUmVzb3VyY2UgaXMgY3VycmVudGx5IGJ1c3kuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgKDB4RTAwNzAwMDZMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSCisgKiAgSW52YWxpZCBQYXJhbWV0ZXIgaW4gcmVxdWVzdC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgICAgICAoMHhFMDAwMDAwN0wpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfTk9UX1NVUFBPUlRFRAorICogIFJlcXVlc3RlZCBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfTk9UX1NVUFBPUlRFRCAgICAgICAgICAoMHhFMDAwMDAwREwpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgRSBUIEggRSBSIE4gRSBUICAgUyBUIEEgVCBVIFMKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX0VUSF9UWF9FUlJPUgorICogIFRoZSBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZhaWxlZCB0byB0cmFuc21pdCBhIHBhY2tldC4KKyAqLworI2RlZmluZSBCRV9FVEhfVFhfRVJST1IgICAgICAgICAgICAgICAgICAoMHhFMDA3MDEwMUwpCisKKy8qCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgUyBIIEEgUiBFIEQgICBTIFQgQSBUIFUgUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX1ZCRF9JTlZBTElEX1ZFUlNJT04KKyAqICBUaGUgZGV2aWNlIGRyaXZlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgVkJELgorICovCisjZGVmaW5lIEJFX1NUQVRVU19JTlZBTElEX1ZFUlNJT04gICAgKDB4RTAwNzA0MDJMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0RPTUFJTl9ERU5JRUQKKyAqICBUaGUgb3BlcmF0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBkdWUgdG8gaW5zdWZmaWNpZW50IGFjY2VzcworICogIHJpZ2h0cyBmb3IgdGhlIHJlcXVlc3RpbmcgZG9tYWluLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19ET01BSU5fREVOSUVEICAgICAgICAgICgweEUwMDcwNDAzTCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19UQ1BfTk9UX1NUQVJURUQKKyAqICBUaGUgZW1iZWRkZWQgVENQL0lQIHN0YWNrIGhhcyBub3QgYmVlbiBzdGFydGVkLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19UQ1BfTk9UX1NUQVJURUQgICAgICAgICgweEUwMDcwNDA5TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19OT19NQ0NfV1JCCisgKiAgTm8gZnJlZSBNQ0MgV1JCIGFyZSBhdmFpbGFibGUgZm9yIHBvc3RpbmcgdGhlIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX05PX01DQ19XUkIgICAgICAgICAgICAgICAgICgweEUwMDcwNDE0TCkKKworI2VuZGlmIC8qIF9CRVNUQVRVU18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDk5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Nldi5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fY2V2X2FtYXBfaF9fCisjZGVmaW5lIF9fY2V2X2FtYXBfaF9fCisjaW5jbHVkZSAiZXAuaCIKKworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAwLiBUaGUgZmlyc3Qgb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVEwIHRocm91Z2ggRVEzMS4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IwX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDIxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mjg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDMwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzE7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0lTUjBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMS4gVGhlIHNlY29uZCBvZiBmb3VyIGFwcGxpY2F0aW9uCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgaW50ZXJydXB0cworICogZm9yIEV2ZW50IFF1ZXVlcyBFUTMyIHRocm91Z2ggRVE2My4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IxX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQzMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDMzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mzc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDUxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYzOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9JU1IxX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyLiBUaGUgdGhpcmQgb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVE2NCB0aHJvdWdoIEVROTUuCisgKi8KK3N0cnVjdCBCRV9DRVZfSVNSMl9DU1JfQU1BUCB7CisJdTggaW50ZXJydXB0NjQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Njc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDcyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Nzk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDgxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5NTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSMl9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAzLiBUaGUgZm91cnRoIG9mIGZvdXIgYXBwbGljYXRpb24KKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHRzCisgKiBmb3IgRXZlbnQgUXVldWVzIEVROTYgdGhyb3VnaCBFUTEyNy4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IzX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQ5NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEwOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDEyNzsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSM19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogIENvbXBsZXRpb25zIGFuZCBFdmVudHMgYmxvY2sgUmVnaXN0ZXJzLiAgKi8KK3N0cnVjdCBCRV9DRVZfQ1NSTUFQX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMyAqLworCXN0cnVjdCBCRV9DRVZfSVNSMF9DU1JfQU1BUCBpc3IwOworCXN0cnVjdCBCRV9DRVZfSVNSMV9DU1JfQU1BUCBpc3IxOworCXN0cnVjdCBCRV9DRVZfSVNSMl9DU1JfQU1BUCBpc3IyOworCXN0cnVjdCBCRV9DRVZfSVNSM19DU1JfQU1BUCBpc3IzOworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgOCAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgOSAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMTAgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDExICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCAxNCAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDE1ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgMTYgKi8KKwl1OCByc3ZkMTNbMzJdOwkvKiBEV09SRCAxNyAqLworCXU4IHJzdmQxNFszMl07CS8qIERXT1JEIDE4ICovCisJdTggcnN2ZDE1WzMyXTsJLyogRFdPUkQgMTkgKi8KKwl1OCByc3ZkMTZbMzJdOwkvKiBEV09SRCAyMCAqLworCXU4IHJzdmQxN1szMl07CS8qIERXT1JEIDIxICovCisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgMjIgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQyM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCAyOSAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDMwICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgMzEgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCAzMiAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDMzICovCisJdTggcnN2ZDMwWzE5Ml07CS8qIERXT1JEIDM0ICovCisJdTggcnN2ZDMxWzE5Ml07CS8qIERXT1JEIDQwICovCisJdTggcnN2ZDMyWzE2MF07CS8qIERXT1JEIDQ2ICovCisJdTggcnN2ZDMzWzE2MF07CS8qIERXT1JEIDUxICovCisJdTggcnN2ZDM0WzE2MF07CS8qIERXT1JEIDU2ICovCisJdTggcnN2ZDM1Wzk2XTsJLyogRFdPUkQgNjEgKi8KKwl1OCByc3ZkMzZbMTkyXVszMl07CS8qIERXT1JEIDY0ICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzI1Nl07Cit9OworCisjZW5kaWYgLyogX19jZXZfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jcS5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2NxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNDU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9jcS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorCisvKgorICogQ29tcGxldGlvbiBRdWV1ZSBPYmplY3RzCisgKi8KKy8qCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgUCBVIEIgTCBJIEMgIFIgTyBVIFQgSSBOIEUgUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhIGNvbXBsZXRpb24gcXVldWUgYmFzZWQgb24gdGhlIGNsaWVudCBjb21wbGV0aW9uCisgICAgcXVldWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorICAgIENxQmFzZVZhICAgICAgICAgICAgLSBCYXNlIFZBIGZvciBhIHRoZSBDUSByaW5nCisgICAgTnVtRW50cmllcyAgICAgICAgICAtIENFVl9DUV9DTlRfKiB2YWx1ZXMKKyAgICBzb2xFdmVudEVuYWJsZSAgICAgIC0gMCA9IEFsbCBDUUVzIGNhbiBnZW5lcmF0ZSBFdmVudHMgaWYgQ1EgaXMgZXZlbnRhYmxlCisJCQkxID0gb25seSBDUUVzIHdpdGggc29saWNpdGVkIGJpdCBzZXQgYXJlIGV2ZW50YWJsZQorICAgIGV2ZW50YWJsZSAgICAgICAgICAgLSBFdmVudGFibGUgQ1EsIGdlbmVyYXRlcyBpbnRlcnJ1cHRzLgorICAgIG5vZGVsYXkgICAgICAgICAgICAgLSAxID0gRm9yY2UgaW50ZXJydXB0LCByZWxldmVudCBpZiBDUSBldmVudGFibGUuCisJCQlJbnRlcnJ1cHQgaXMgYXNzZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgRVFFCisJCQl3cml0ZSBpcyBjb25maXJtZWQsIHJlZ2FyZGxlc3Mgb2YgRVEgVGltZXIKKwkJCW9yIHdhdGVybWFyayBzZXR0aW5ncy4KKyAgICB3bWUgICAgICAgICAgICAgICAgIC0gRW5hYmxlIHdhdGVybWFyayBiYXNlZCBjb2FsZXNjaW5nCisgICAgd21UaHJlc2ggICAgICAgICAgICAtIEhpZ2ggd2F0ZXJtYXJrKENRIGZ1bGxuZXNzIGF0IHdoaWNoIGV2ZW50CisJCQlvciBpbnRlcnJ1cHQgc2hvdWxkIGJlIGFzc2VydGVkKS4gIFRoZXNlIGFyZSB0aGUKKwkJCUNFVl9XQVRFUk1BUksgZW5jb2RlZCB2YWx1ZXMuCisgICAgRXFPYmplY3QgICAgICAgICAgICAtIEVRIEhhbmRsZSB0byBhc3NpZ24gdG8gdGhpcyBDUQorICAgIHBwQ3FPYmplY3QgICAgICAgICAgLSBJbnRlcm5hbCBDUSBIYW5kbGUgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBlcnJvciBjb2RlIGlzCisJcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKworKi8KK2ludCBiZV9jcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwgYm9vbCBzb2xpY2l0ZWRfZXZlbnRhYmxlLAorCWJvb2wgbm9fZGVsYXksIHUzMiB3bV90aHJlc2gsCisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0LCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJdTMyIG51bV9lbnRyaWVzX2VuY29kaW5nOworCXUzMiBudW1fZW50cmllcyA9IGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApOworCXN0cnVjdCBGV0NNRF9DT01NT05fQ1FfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgbjsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQocmQpOworCUFTU0VSVChjcV9vYmplY3QpOworCUFTU0VSVChsZW5ndGggJSBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSA9PSAwKTsKKworCXN3aXRjaCAobnVtX2VudHJpZXMpIHsKKwljYXNlIDI1NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfQ1FfQ05UXzI1NjsKKwkJYnJlYWs7CisJY2FzZSA1MTI6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0NRX0NOVF81MTI7CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfQ1FfQ05UXzEwMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwkvKgorCSAqIEFsbCBjcSBlbnRyaWVzIGFsbCB0aGUgc2FtZSBzaXplLiAgVXNlIGlTQ1NJIHZlcnNpb24KKwkgKiBhcyBhIHRlc3QgZm9yIHRoZSBwcm9wZXIgcmQgbGVuZ3RoLgorCSAqLworCW1lbXNldChjcV9vYmplY3QsIDAsIHNpemVvZigqY3Ffb2JqZWN0KSk7CisKKwlhdG9taWNfc2V0KCZjcV9vYmplY3QtPnJlZl9jb3VudCwgMCk7CisJY3Ffb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWNxX29iamVjdC0+ZXFfb2JqZWN0ID0gZXFfb2JqZWN0OworCWNxX29iamVjdC0+bnVtX2VudHJpZXMgPSBudW1fZW50cmllczsKKwkvKiBzYXZlIGZvciBNQ0MgY3EgcHJvY2Vzc2luZyAqLworCWNxX29iamVjdC0+dmEgPSByZC0+dmE7CisKKwkvKiBtYXAgaW50byBVVC4gKi8KKwlsZW5ndGggPSBudW1fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gY3JlYXRlIEVRLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9DUV9DUkVBVEUpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IFBBR0VTX1NQQU5ORUQoT0ZGU0VUX0lOX1BBR0UocmQtPnZhKSwKKwkJCQkJCQkJCWxlbmd0aCk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCB2YWxpZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlcjsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBGdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJbiA9IChlcV9vYmplY3QgIT0gTlVMTCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgRXZlbnRhYmxlLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgQXJtZWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisKKwluID0gZXFfb2JqZWN0ID8gZXFfb2JqZWN0LT5lcV9pZCA6IDA7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgRVFJRCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBDb3VudCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbnVtX2VudHJpZXNfZW5jb2RpbmcpOworCisJbiA9IDA7IC8qIFByb3RlY3Rpb24gRG9tYWluIGlzIGFsd2F5cyAwIGluICBMaW51eCAgZHJpdmVyICovCisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgUEQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfQ09OVEVYVCwgTm9EZWxheSwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG5vX2RlbGF5KTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBTb2xFdmVudCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgc29saWNpdGVkX2V2ZW50YWJsZSk7CisKKwluID0gKHdtX3RocmVzaCAhPSAweEZGRkZGRkZGKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBXTUUsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwluID0gKG4gPyB3bV90aHJlc2ggOiAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBXYXRlcm1hcmssCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgQ1EgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBSZW1lbWJlciB0aGUgQ1EgaWQuICovCisJY3Ffb2JqZWN0LT5jcV9pZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY3FfaWQ7CisKKwkvKiBpbnNlcnQgdGhpcyBjcSBpbnRvIGVxX29iamVjdCByZWZlcmVuY2UgKi8KKwlpZiAoZXFfb2JqZWN0KSB7CisJCWF0b21pY19pbmMoJmVxX29iamVjdC0+cmVmX2NvdW50KTsKKwkJbGlzdF9hZGRfdGFpbCgmY3Ffb2JqZWN0LT5jcWxpc3RfZm9yX2VxLAorCQkJCQkmZXFfb2JqZWN0LT5jcV9saXN0X2hlYWQpOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKworICAgIERlZmVyZW5jZXMgdGhlIGdpdmVuIG9iamVjdC4gT25jZSB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvCisgICAgemVybywgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgYW5kIGFsbCByZXNvdXJjZXMgdGhhdCBhcmUgaGVsZCBieSB0aGlzIG9iamVjdAorICAgIGFyZSByZWxlYXNlZC4gIFRoZSBvbi1jaGlwIGNvbnRleHQgaXMgYWxzbyBkZXN0cm95ZWQgYWxvbmcgd2l0aCB0aGUgcXVldWUKKyAgICBJRCwgYW5kIGFueSBtYXBwaW5ncyBtYWRlIGludG8gdGhlIFVULgorCisgICAgY3Ffb2JqZWN0ICAgICAgICAgICAgLSBDUSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBjcV9vYmplY3RfY3JlYXRlLgorCisgICAgcmV0dXJucyB0aGUgY3VycmVudCByZWZlcmVuY2UgY291bnQgb24gdGhlIG9iamVjdAorCisgICAgSVJRTDogSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworaW50IGJlX2NxX2Rlc3Ryb3koc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0KQoreworCWludCBzdGF0dXMgPSAwOworCisJLyogTm90aGluZyBzaG91bGQgcmVmZXJlbmNlIHRoaXMgQ1EgYXQgdGhpcyBwb2ludC4gKi8KKwlBU1NFUlQoYXRvbWljX3JlYWQoJmNxX29iamVjdC0+cmVmX2NvdW50KSA9PSAwKTsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgQ1EuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGNxX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLAorCQkgICAgIGNxX29iamVjdC0+Y3FfaWQsIEZXQ01EX1JJTkdfVFlQRV9DUSwKKwkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKworCS8qIFJlbW92ZSByZWZlcmVuY2UgaWYgdGhpcyBpcyBhbiBldmVudGFibGUgQ1EuICovCisJaWYgKGNxX29iamVjdC0+ZXFfb2JqZWN0KSB7CisJCWF0b21pY19kZWMoJmNxX29iamVjdC0+ZXFfb2JqZWN0LT5yZWZfY291bnQpOworCQlsaXN0X2RlbCgmY3Ffb2JqZWN0LT5jcWxpc3RfZm9yX2VxKTsKKwl9CisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kZXNjcmlwdG9ycy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rlc2NyaXB0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhNDM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kZXNjcmlwdG9ycy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19kZXNjcmlwdG9yc19hbWFwX2hfXworI2RlZmluZSBfX2Rlc2NyaXB0b3JzX2FtYXBfaF9fCisKKy8qCisgKiAtLS0gSVBDX05PREVfSURfRU5VTSAtLS0KKyAqIElQQyBwcm9jZXNzb3IgaWQgdmFsdWVzCisgKi8KKyNkZWZpbmUgVFBPU1RfTk9ERV9JRCAgICAgICAgICAgICAgICAgICAoMCkJLyogVFBPU1QgSUQgKi8KKyNkZWZpbmUgVFBSRV9OT0RFX0lEICAgICAgICAgICAgICAgICAgICAoMSkJLyogVFBSRSBJRCAqLworI2RlZmluZSBUWFVMUDBfTk9ERV9JRCAgICAgICAgICAgICAgICAgICgyKQkvKiBUWFVMUDAgSUQgKi8KKyNkZWZpbmUgVFhVTFAxX05PREVfSUQgICAgICAgICAgICAgICAgICAoMykJLyogVFhVTFAxIElEICovCisjZGVmaW5lIFRYVUxQMl9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDQpCS8qIFRYVUxQMiBJRCAqLworI2RlZmluZSBSWFVMUDBfTk9ERV9JRCAgICAgICAgICAgICAgICAgICg1KQkvKiBSWFVMUDAgSUQgKi8KKyNkZWZpbmUgUlhVTFAxX05PREVfSUQgICAgICAgICAgICAgICAgICAoNikJLyogUlhVTFAxIElEICovCisjZGVmaW5lIFJYVUxQMl9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDcpCS8qIFJYVUxQMiBJRCAqLworI2RlZmluZSBNUFVfTk9ERV9JRCAgICAgICAgICAgICAgICAgICAgICgxNSkJLyogTVBVIElEICovCisKKy8qCisgKiAtLS0gTUFDX0lEX0VOVU0gLS0tCisgKiBNZWFuaW5nIG9mIHRoZSBtYWNfaWQgZmllbGQgaW4gcnhwcF9ldGhfZAorICovCisjZGVmaW5lIFBPUlQwX0hPU1RfTUFDMCAgICAoMCkgIC8qIFBEIDAsIFBvcnQgMCwgaG9zdCBuZXR3b3JraW5nLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDBfSE9TVF9NQUMxICAgICgxKQkvKiBQRCAwLCBQb3J0IDAsIGhvc3QgbmV0d29ya2luZywgTUFDIDEuICovCisjZGVmaW5lIFBPUlQwX1NUT1JBR0VfTUFDMCAoMikJLyogUEQgMCwgUG9ydCAwLCBob3N0IHN0b3JhZ2UsIE1BQyAwLiAqLworI2RlZmluZSBQT1JUMF9TVE9SQUdFX01BQzEgKDMpCS8qIFBEIDAsIFBvcnQgMCwgaG9zdCBzdG9yYWdlLCBNQUMgMS4gKi8KKyNkZWZpbmUgUE9SVDFfSE9TVF9NQUMwICAgICg0KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBuZXR3b3JraW5nLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDFfSE9TVF9NQUMxICAgICg1KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBuZXR3b3JraW5nLCBNQUMgMS4gKi8KKyNkZWZpbmUgUE9SVDFfU1RPUkFHRV9NQUMwICg2KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBzdG9yYWdlLCBNQUMgMC4gKi8KKyNkZWZpbmUgUE9SVDFfU1RPUkFHRV9NQUMxICg3KQkvKiBQRCAwLCBQb3J0IDEgaG9zdCBzdG9yYWdlLCBNQUMgMS4gKi8KKyNkZWZpbmUgRklSU1RfVk1fTUFDICAgICAgICg4KQkvKiBQRCAxIE1BQy4gUHJvdGVjdGlvbiBkb21haW5zIGhhdmUgSURzICovCisJCQkJLyogZnJvbSAweDgtMHgyNiwgb25lIHBlciBQRC4gKi8KKyNkZWZpbmUgTEFTVF9WTV9NQUMgICAgICAgICgzOCkJLyogUEQgMzEgTUFDLiAqLworI2RlZmluZSBNR01UX01BQyAgICAgICAgICAgKDM5KQkvKiBNYW5hZ2VtZW50IHBvcnQgTUFDLiAqLworI2RlZmluZSBNQVJCTEVfTUFDMCAgICAgICAgKDU5KQkvKiBVc2VkIGZvciBmbHVzaGluZyBmdW5jdGlvbiAwIHJlY2VpdmUgKi8KKwkJCQkgIC8qCisJCQkJICAgKiBxdWV1ZXMgYmVmb3JlIHJlLXVzaW5nIGEgdG9ybi1kb3duCisJCQkJICAgKiByZWNlaXZlIHJpbmcuIHRoZSBEQSA9CisJCQkJICAgKiAwMC0wMC0wMC0wMC0wMC0wMCwgYW5kIHRoZSBNU0Igb2YgdGhlCisJCQkJICAgKiBTQSA9IDAwCisJCQkJICAgKi8KKyNkZWZpbmUgTUFSQkxFX01BQzEgICAgICAgICg2MCkJLyogVXNlZCBmb3IgZmx1c2hpbmcgZnVuY3Rpb24gMSByZWNlaXZlICovCisJCQkJICAvKgorCQkJCSAgICogcXVldWVzIGJlZm9yZSByZS11c2luZyBhIHRvcm4tZG93bgorCQkJCSAgICogcmVjZWl2ZSByaW5nLiB0aGUgREEgPQorCQkJCSAgICogMDAtMDAtMDAtMDAtMDAtMDAsIGFuZCB0aGUgTVNCIG9mIHRoZQorCQkJCSAgICogU0EgIT0gMDAKKwkJCQkgICAqLworI2RlZmluZSBOVUxMX01BQyAgICAgICAgICAgKDYxKQkvKiBQcm9taXNjdW91cyBtb2RlLCBpbmRpY2F0ZXMgbm8gbWF0Y2ggKi8KKyNkZWZpbmUgTUNBU1RfTUFDICAgICAgICAgICg2MikJLyogTXVsdGljYXN0IG1hdGNoLiAqLworI2RlZmluZSBCQ0FTVF9NQVRDSCAgICAgICAgKDYzKQkvKiBCcm9hZGNhc3QgbWF0Y2guICovCisKKyNlbmRpZiAvKiBfX2Rlc2NyaXB0b3JzX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZG9vcmJlbGxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZG9vcmJlbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwY2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kb29yYmVsbHMuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Rvb3JiZWxsc19hbWFwX2hfXworI2RlZmluZSBfX2Rvb3JiZWxsc19hbWFwX2hfXworCisvKiBUaGUgVFgvUkRNQSBzZW5kIHF1ZXVlIGRvb3JiZWxsLiAqLworc3RydWN0IEJFX1NRX0RCX0FNQVAgeworCXU4IGNpZFsxMV07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNV07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbMTRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgU1FfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVGhlIHJlY2VpdmUgcXVldWUgZG9vcmJlbGwuICovCitzdHJ1Y3QgQkVfUlFfREJfQU1BUCB7CisJdTggcnFbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzEzXTsJLyogRFdPUkQgMCAqLworCXU4IEludmFsaWRhdGU7CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUlFfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFRoZSBDUS9FUSBkb29yYmVsbC4gU29mdHdhcmUgTVVTVCBzZXQgcmVzZXJ2ZWQgZmllbGRzIGluIHRoaXMKKyAqIGRlc2NyaXB0b3IgdG8gemVybywgb3RoZXJ3aXNlIChDRVYpIGhhcmR3YXJlIHdpbGwgbm90IGV4ZWN1dGUgdGhlCisgKiBkb29yYmVsbCAoZmxhZ2dpbmcgYSBiYWRfZGJfcWlkIGVycm9yIGluc3RlYWQpLgorICovCitzdHJ1Y3QgQkVfQ1FfREJfQU1BUCB7CisJdTggcWlkWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs0XTsJLyogRFdPUkQgMCAqLworCXU4IHJlYXJtOwkJLyogRFdPUkQgMCAqLworCXU4IGV2ZW50OwkJLyogRFdPUkQgMCAqLworCXU4IG51bV9wb3BwZWRbMTNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbM107CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ1FfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1RQTV9SUV9EQl9BTUFQIHsKKwl1OCBxaWRbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggbnVtUG9zdGVkWzExXTsJLyogRFdPUkQgMCAqLworCXU4IG1zc19jbnRbNV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgVFBNX1JRX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBQb3N0IFdSQiBRdWV1ZSBEb29yYmVsbCBSZWdpc3RlciB1c2VkIGJ5IHRoZSBob3N0IFN0b3JhZ2Ugc3RhY2sKKyAqIHRvIG5vdGlmeSB0aGUgY29udHJvbGxlciBvZiBhIHBvc3RlZCBXb3JrIFJlcXVlc3QgQmxvY2sKKyAqLworc3RydWN0IEJFX1dSQl9QT1NUX0RCX0FNQVAgeworCXU4IHdyYl9jaWRbMTBdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNl07CS8qIERXT1JEIDAgKi8KKwl1OCB3cmJfaW5kZXhbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1iZXJQb3N0ZWRbOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgV1JCX1BPU1RfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFVwZGF0ZSBEZWZhdWx0IFBEVSBRdWV1ZSBEb29yYmVsbCBSZWdpc3RlciB1c2VkIHRvIGNvbW11bmljYXRlCisgKiB0byB0aGUgY29udHJvbGxlciB0aGF0IHRoZSBkcml2ZXIgaGFzIHN0b3BwZWQgcHJvY2Vzc2luZyB0aGUgcXVldWUKKyAqIGFuZCB3aGVyZSBpbiB0aGUgcXVldWUgaXQgc3RvcHBlZCwgdGhpcyBpcworICogYSBDUSBFbnRyeSBUeXBlLiBVc2VkIGJ5IHN0b3JhZ2UgZHJpdmVyLgorICovCitzdHJ1Y3QgQkVfREVGQVVMVF9QRFVfREJfQU1BUCB7CisJdTggcWlkWzEwXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs0XTsJLyogRFdPUkQgMCAqLworCXU4IHJlYXJtOwkJLyogRFdPUkQgMCAqLworCXU4IGV2ZW50OwkJLyogRFdPUkQgMCAqLworCXU4IGNxcHJvY1sxNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBERUZBVUxUX1BEVV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNYW5hZ2VtZW50IENvbW1hbmQgYW5kIENvbnRyb2xsZXIgZGVmYXVsdCBmcmFnbWVudCByaW5nICovCitzdHJ1Y3QgQkVfTUNDX0RCX0FNQVAgeworCXU4IHJpZFsxMV07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNV07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbMTRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBVc2VkIGZvciBib290c3RyYXBwaW5nIHRoZSBIb3N0IGludGVyZmFjZS4gVGhpcyByZWdpc3RlciBpcworICogdXNlZCBmb3IgZHJpdmVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgTVBVIHdoZW4gbm8gTUNDIFJpbmdzIGV4aXN0LgorICogVGhlIHNvZnR3YXJlIG11c3Qgd3JpdGUgdGhpcyByZWdpc3RlciB0d2ljZSB0byBwb3N0IGFueSBNQ0MKKyAqIGNvbW1hbmQuIEZpcnN0LCBpdCB3cml0ZXMgdGhlIHJlZ2lzdGVyIHdpdGggaGk9MSBhbmQgdGhlIHVwcGVyIGJpdHMgb2YKKyAqIHRoZSAgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIE1DQ19NQUlMQk9YIHN0cnVjdHVyZS4gIFNvZnR3YXJlIG11c3QgcG9sbAorICogdGhlIHJlYWR5IGJpdCB1bnRpbCB0aGlzIGlzIGFja25vd2xlZGdlZC4gIFRoZW4sIHNvdHdhcmUgd3JpdGVzIHRoZQorICogcmVnaXN0ZXIgd2l0aCBoaT0wIHdpdGggdGhlIGxvd2VyIGJpdHMgaW4gdGhlIGFkZHJlc3MuICBJdCBtdXN0CisgKiBwb2xsIHRoZSByZWFkeSBiaXQgdW50aWwgdGhlIE1DQyBjb21tYW5kIGlzIGNvbXBsZXRlLiAgVXBvbiBjb21wbGV0aW9uLAorICogdGhlIE1DQ19NQUlMQk9YIHdpbGwgY29udGFpbiBhIHZhbGlkIGNvbXBsZXRpb24gcXVldWUgIGVudHJ5LgorICovCitzdHJ1Y3QgQkVfTVBVX01BSUxCT1hfREJfQU1BUCB7CisJdTggcmVhZHk7CQkvKiBEV09SRCAwICovCisJdTggaGk7CQkvKiBEV09SRCAwICovCisJdTggYWRkcmVzc1szMF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTVBVX01BSUxCT1hfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqICBUaGlzIGlzIHRoZSBwcm90ZWN0aW9uIGRvbWFpbiBkb29yYmVsbCByZWdpc3RlciBtYXAuIE5vdGUgdGhhdAorICogIHdoaWxlIHRoaXMgbWFwIHNob3dzIGRvb3JiZWxscyBmb3IgYWxsIEJsYWRlIEVuZ2luZSBzdXBwb3J0ZWQKKyAqICBwcm90b2NvbHMsIG5vdCBhbGwgb2YgdGhlc2UgbWF5IGJlIHZhbGlkIGluIGEgZ2l2ZW4gZnVuY3Rpb24gb3IKKyAqICBwcm90ZWN0aW9uIGRvbWFpbi4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbgorICogIGFjY2Vzc2luZyB0aGUgZG9vcmJlbGxzIHRvIGtub3cgd2hpY2ggYXJlIHZhbGlkLiBFYWNoIGRvb3JiZWxsCisgKiAgb2NjdXBpZXMgMzIgYnl0ZXMgb2Ygc3BhY2UsIGJ1dCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwKKyAqICBvbmx5IHRoZSBmaXJzdCA0IGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuLiAgVGhlcmUgYXJlIDMyIGluc3RhbmNlcworICogIG9mIHRoZXNlIGRvb3JiZWxscyBmb3IgdGhlIGhvc3QgYW5kIDMxIHZpcnR1YWwgbWFjaGluZXMgcmVzcGVjdGl2ZWx5LgorICogIFRoZSBob3N0IGFuZCBWTXMgd2lsbCBvbmx5IG1hcCB0aGUgZG9vcmJlbGwgcGFnZXMgYmVsb25naW5nIHRvIGl0cworICogIHByb3RlY3Rpb24gZG9tYWluLiBJdCB3aWxsIG5vdCBiZSBhYmxlIHRvIHRvdWNoIHRoZSBkb29yYmVsbHMgZm9yCisgKiAgYW5vdGhlciBWTS4gVGhlIGRvb3JiZWxscyBhcmUgdGhlIG9ubHkgcmVnaXN0ZXJzIGRpcmVjdGx5IGFjY2Vzc2libGUKKyAqICBieSBhIHZpcnR1YWwgbWFjaGluZS4gU2ltaWxhcmx5LCB0aGVyZSBhcmUgNTExIGFkZGl0aW9uYWwKKyAqICBkb29yYmVsbHMgZm9yIFJETUEgcHJvdGVjdGlvbiBkb21haW5zLiBQRCAwIGZvciBSRE1BIHNoYXJlcworICogIHRoZSBzYW1lIHBoeXNpY2FsIHByb3RlY3Rpb24gZG9tYWluIGRvb3JiZWxsIHBhZ2UgYXMgRVRIL2lTQ1NJLgorICoKKyAqLworc3RydWN0IEJFX1BST1RFQ1RJT05fRE9NQUlOX0RCTUFQX0FNQVAgeworCXU4IHJzdmQwWzUxMl07CS8qIERXT1JEIDAgKi8KKwlzdHJ1Y3QgQkVfU1FfREJfQU1BUCByZG1hX3NxX2RiOworCXU4IHJzdmQxWzddWzMyXTsJLyogRFdPUkQgMTcgKi8KKwlzdHJ1Y3QgQkVfV1JCX1BPU1RfREJfQU1BUCBpc2NzaV93cmJfcG9zdF9kYjsKKwl1OCByc3ZkMls3XVszMl07CS8qIERXT1JEIDI1ICovCisJc3RydWN0IEJFX1NRX0RCX0FNQVAgZXR4X3NxX2RiOworCXU4IHJzdmQzWzddWzMyXTsJLyogRFdPUkQgMzMgKi8KKwlzdHJ1Y3QgQkVfUlFfREJfQU1BUCByZG1hX3JxX2RiOworCXU4IHJzdmQ0WzddWzMyXTsJLyogRFdPUkQgNDEgKi8KKwlzdHJ1Y3QgQkVfREVGQVVMVF9QRFVfREJfQU1BUCBpc2NzaV9kZWZhdWx0X3BkdV9kYjsKKwl1OCByc3ZkNVs3XVszMl07CS8qIERXT1JEIDQ5ICovCisJc3RydWN0IEJFX1RQTV9SUV9EQl9BTUFQIHRwbV9ycV9kYjsKKwl1OCByc3ZkNls3XVszMl07CS8qIERXT1JEIDU3ICovCisJc3RydWN0IEJFX1JRX0RCX0FNQVAgZXJ4X3JxX2RiOworCXU4IHJzdmQ3WzddWzMyXTsJLyogRFdPUkQgNjUgKi8KKwlzdHJ1Y3QgQkVfQ1FfREJfQU1BUCBjcV9kYjsKKwl1OCByc3ZkOFs3XVszMl07CS8qIERXT1JEIDczICovCisJc3RydWN0IEJFX01DQ19EQl9BTUFQIG1wdV9tY2NfZGI7CisJdTggcnN2ZDlbN11bMzJdOwkvKiBEV09SRCA4MSAqLworCXN0cnVjdCBCRV9NUFVfTUFJTEJPWF9EQl9BTUFQIG1jY19ib290c3RyYXBfZGI7CisJdTggcnN2ZDEwWzkzNV1bMzJdOwkvKiBEV09SRCA4OSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQUk9URUNUSU9OX0RPTUFJTl9EQk1BUF9BTUFQIHsKKwl1MzIgZHdbMTAyNF07Cit9OworCisjZW5kaWYgLyogX19kb29yYmVsbHNfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmY2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19lcF9hbWFwX2hfXworI2RlZmluZSBfX2VwX2FtYXBfaF9fCisKKy8qIEdlbmVyYWwgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX0VQX0NPTlRST0xfQ1NSX0FNQVAgeworCXU4IG0wX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IG0xX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IG0yX1J4UGJ1ZjsJLyogRFdPUkQgMCAqLworCXU4IGZmX2VuOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzI3XTsJLyogRFdPUkQgMCAqLworCXU4IENQVV9yZXNldDsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUF9DT05UUk9MX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTZW1hcGhvcmUgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfRVBfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1OCB2YWx1ZVszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVBfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBFbWJlZGRlZCBQcm9jZXNzb3IgU3BlY2lmaWMgUmVnaXN0ZXJzLiAqLworc3RydWN0IEJFX0VQX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfRVBfQ09OVFJPTF9DU1JfQU1BUCBlcF9jb250cm9sOworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgNCAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgNSAqLworCXU4IHJzdmQ1WzhdWzEyOF07CS8qIERXT1JEIDYgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDM4ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAzOSAqLworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgNDAgKi8KKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDQxICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgNDIgKi8KKwlzdHJ1Y3QgQkVfRVBfU0VNQVBIT1JFX0NTUl9BTUFQIGVwX3NlbWFwaG9yZTsKKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCA0NCAqLworCXU4IHJzdmQxMlsxOV1bMzJdOwkvKiBEV09SRCA0NSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUF9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzY0XTsKK307CisKKyNlbmRpZiAvKiBfX2VwX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTJjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXEuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKy8qCisgICAgVGhpcyByb3V0aW5lIGNyZWF0ZXMgYW4gZXZlbnQgcXVldWUgYmFzZWQgb24gdGhlIGNsaWVudCBjb21wbGV0aW9uCisgICAgcXVldWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKyAgICBFcUJhc2VWYSAgICAgICAgICAgIC0gQmFzZSBWQSBmb3IgYSB0aGUgRVEgcmluZworICAgIFNpemVFbmNvZGluZyAgICAgICAgLSBUaGUgZW5jb2RlZCBzaXplIGZvciB0aGUgRVEgZW50cmllcy4gVGhpcyB2YWx1ZSBpcworCQkJZWl0aGVyIENFVl9FUV9TSVpFXzQgb3IgQ0VWX0VRX1NJWkVfMTYKKyAgICBOdW1FbnRyaWVzICAgICAgICAgIC0gQ0VWX0NRX0NOVF8qIHZhbHVlcy4KKyAgICBXYXRlcm1hcmsgICAgICAgICAgIC0gRW5hYmxlcyB3YXRlcm1hcmsgYmFzZWQgY29hbGVzY2luZy4gIFRoaXMgcGFyYW1ldGVyCisJCQltdXN0IGJlIG9mIHRoZSB0eXBlIENFVl9XTUFSS18qIGlmIHdhdGVybWFya3MKKwkJCWFyZSBlbmFibGVkLiAgSWYgd2F0ZXJtYXJrcyB0byB0byBiZSBkaXNhYmxlZAorCQkJdGhpcyB2YWx1ZSBzaG91bGQgYmUtMS4KKyAgICBUaW1lckRlbGF5ICAgICAgICAgIC0gSWYgYSB0aW1lciBkZWxheSBpcyBlbmFibGVkIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRoZQorCQkJdGltZSBvZiB0aGUgZGVsYXkgaW4gOCBtaWNyb3NlY29uZCB1bml0cy4gIElmCisJCQlkZWxheXMgYXJlIG5vdCB1c2VkIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZQorCQkJc2V0IHRvIC0xLgorICAgIHBwRXFPYmplY3QgICAgICAgICAgLSBJbnRlcm5hbCBFUSBIYW5kbGUgcmV0dXJuZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZQorCWlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworaW50CitiZV9lcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBlcWVfc2l6ZSwgdTMyIG51bV9lbnRyaWVzLAorCQl1MzIgd2F0ZXJtYXJrLAkvKiBDRVZfV01BUktfKiBvciAtMSAqLworCQl1MzIgdGltZXJfZGVsYXksCS8qIGluIDh1cyB1bml0cywgb3IgLTEgKi8KKwkJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0KQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXUzMiBudW1fZW50cmllc19lbmNvZGluZywgZXFlX3NpemVfZW5jb2RpbmcsIGxlbmd0aDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0VRX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIG47CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoZXFfb2JqZWN0KTsKKworCXN3aXRjaCAobnVtX2VudHJpZXMpIHsKKwljYXNlIDI1NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzI1NjsKKwkJYnJlYWs7CisJY2FzZSA1MTI6CisJCW51bV9lbnRyaWVzX2VuY29kaW5nID0gQ0VWX0VRX0NOVF81MTI7CisJCWJyZWFrOworCWNhc2UgMTAyNDoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzEwMjQ7CisJCWJyZWFrOworCWNhc2UgMjA0ODoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzIwNDg7CisJCWJyZWFrOworCWNhc2UgNDA5NjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzQwOTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlzd2l0Y2ggKGVxZV9zaXplKSB7CisJY2FzZSA0OgorCQllcWVfc2l6ZV9lbmNvZGluZyA9IENFVl9FUV9TSVpFXzQ7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWVxZV9zaXplX2VuY29kaW5nID0gQ0VWX0VRX1NJWkVfMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjsKKwl9CisKKwlpZiAoKGVxZV9zaXplID09IDQgJiYgbnVtX2VudHJpZXMgPCAxMDI0KSB8fAorCSAgICAoZXFlX3NpemUgPT0gMTYgJiYgbnVtX2VudHJpZXMgPT0gNDA5NikpIHsKKwkJVFJBQ0UoRExfRVJSLCAiQmFkIEVRIHNpemUuIGVxZV9zaXplOiVkIG51bV9lbnRyaWVzOiVkIiwKKwkJICAgICAgZXFlX3NpemUsIG51bV9lbnRyaWVzKTsKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCW1lbXNldChlcV9vYmplY3QsIDAsIHNpemVvZigqZXFfb2JqZWN0KSk7CisKKwlhdG9taWNfc2V0KCZlcV9vYmplY3QtPnJlZl9jb3VudCwgMCk7CisJZXFfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWVxX29iamVjdC0+ZXFfaWQgPSAweEZGRkZGRkZGOworCisJSU5JVF9MSVNUX0hFQUQoJmVxX29iamVjdC0+Y3FfbGlzdF9oZWFkKTsKKworCWxlbmd0aCA9IG51bV9lbnRyaWVzICogZXFlX3NpemU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBjcmVhdGUgRVEuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0VRX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gUEFHRVNfU1BBTk5FRChPRkZTRVRfSU5fUEFHRShyZC0+dmEpLAorCQkJCQkJCQkJbGVuZ3RoKTsKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlcjsKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBGdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgdmFsaWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBTaXplLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBlcWVfc2l6ZV9lbmNvZGluZyk7CisKKwluID0gMDsgLyogUHJvdGVjdGlvbiBEb21haW4gaXMgYWx3YXlzIDAgaW4gIExpbnV4ICBkcml2ZXIgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBQRCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCS8qIExldCB0aGUgY2FsbGVyIEFSTSB0aGUgRVEgd2l0aCB0aGUgZG9vcmJlbGwuICovCisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgQXJtZWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBDb3VudCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LAorCQkJCQludW1fZW50cmllc19lbmNvZGluZyk7CisKKwluID0gcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlciAqIDMyOworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIEV2ZW50VmVjdCwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCWlmICh3YXRlcm1hcmsgIT0gLTEpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgV01FLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFdhdGVybWFyaywKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIHdhdGVybWFyayk7CisJCUFTU0VSVCh3YXRlcm1hcmsgPD0gQ0VWX1dNQVJLXzI0MCk7CisJfSBlbHNlCisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFdNRSwKKwkJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKwlpZiAodGltZXJfZGVsYXkgIT0gLTEpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgVE1SLAorCQkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCisJCUFTU0VSVCh0aW1lcl9kZWxheSA8PSAyNTApOwkvKiBtYXggdmFsdWUgYWNjb3JkaW5nIHRvIEVBUyAqLworCQl0aW1lcl9kZWxheSA9IG1pbih0aW1lcl9kZWxheSwgKHUzMikyNTApOworCisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIERlbGF5LAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgdGltZXJfZGVsYXkpOworCX0gZWxzZSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFRNUiwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCX0KKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgRVEgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBHZXQgdGhlIEVRIGlkLiAgVGhlIE1QVSBhbGxvY2F0ZXMgdGhlIElEcy4gKi8KKwllcV9vYmplY3QtPmVxX2lkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5lcV9pZDsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBEZWZlcmVuY2VzIHRoZSBnaXZlbiBvYmplY3QuIE9uY2UgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0bworICAgIHplcm8sIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIGFuZCBhbGwgcmVzb3VyY2VzIHRoYXQgYXJlIGhlbGQgYnkgdGhpcworICAgIG9iamVjdCBhcmUgcmVsZWFzZWQuICBUaGUgb24tY2hpcCBjb250ZXh0IGlzIGFsc28gZGVzdHJveWVkIGFsb25nIHdpdGgKKyAgICB0aGUgcXVldWUgSUQsIGFuZCBhbnkgbWFwcGluZ3MgbWFkZSBpbnRvIHRoZSBVVC4KKworICAgIGVxX29iamVjdCAgICAgICAgICAgIC0gRVEgaGFuZGxlIHJldHVybmVkIGZyb20gZXFfb2JqZWN0X2NyZWF0ZS4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGVycm9yIGNvZGUKKwlpcyByZXR1cm5lZC4KKworICAgIElSUUw6IElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9lcV9kZXN0cm95KHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCUFTU0VSVChhdG9taWNfcmVhZCgmZXFfb2JqZWN0LT5yZWZfY291bnQpID09IDApOworCS8qIG5vIENRcyBzaG91bGQgcmVmZXJlbmNlIHRoaXMgRVEgbm93ICovCisJQVNTRVJUKGxpc3RfZW1wdHkoJmVxX29iamVjdC0+Y3FfbGlzdF9oZWFkKSk7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIEVRLiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShlcV9vYmplY3QtPnBhcmVudF9mdW5jdGlvbiwKKwkJCSAgICAgZXFfb2JqZWN0LT5lcV9pZCwgRldDTURfUklOR19UWVBFX0VRLAorCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IDApOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9lcV9tb2RpZnlfZGVsYXkKKyAqICAgQ2hhbmdlcyB0aGUgRVEgZGVsYXkgZm9yIGEgZ3JvdXAgb2YgRVFzLgorICogbnVtX2VxICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBFUXMgaW4gdGhlIGVxX2FycmF5IHRvIGFkanVzdC4KKyAqIAkJCVRoaXMgYWxzbyBpcyB0aGUgbnVtYmVyIG9mIGRlbGF5IHZhbHVlcyBpbgorICogCQkJdGhlIGVxX2RlbGF5X2FycmF5LgorICogZXFfYXJyYXkgICAgICAgICAgIC0gQXJyYXkgb2Ygc3RydWN0IGJlX2VxX29iamVjdCBwb2ludGVycyB0byBhZGp1c3QuCisgKiBlcV9kZWxheV9hcnJheSAgICAgLSBBcnJheSBvZiAibnVtX2VxIiB0aW1lciBkZWxheXMgaW4gdW5pdHMKKyAqIAkJCW9mIG1pY3Jvc2Vjb25kcy4gVGhlIGJlX2VxX3F1ZXJ5X2RlbGF5X3JhbmdlCisgKiAJCQlmd2NtZCByZXR1cm5zIHRoZSByZXNvbHV0aW9uIGFuZCByYW5nZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgbGVnYWwgRVEgZGVsYXlzLgorICogY2IgICAgICAgICAgIC0KKyAqIGNiX2NvbnRleHQgICAtCisgKiBxX2N0eHQgICAgICAgICAgICAgLSBPcHRpb25hbC4gUG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgKiAJCQlzdHJ1Y3QuIElmIHRoZSBNQ0MgV1JCIHJpbmcgaXMgZnVsbCwgdGhpcworICogCQkJc3RydWN0dXJlIGlzIHVzZWQgdG8gcXVldWUgdGhlIG9wZXJhdGlvbi4gSXQKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBNQ0MgcmluZyB3aGVuIHNwYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZWNvbWVzIGF2YWlsYWJsZS4gQWxsIHF1ZXVlZCBjb21tYW5kcyB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwb3N0ZWQgdG8gdGhlIHJpbmcgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC4gSXQgaXMgYWx3YXlzIHZhbGlkIHRvIHBhc3MgYSBwb2ludGVyIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBhIGdlbmVyaWMgYmVfZ2VuZXJpY19xX2NudHh0LiBIb3dldmVyLAorICogICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWNpZmljIGNvbnRleHQgc3RydWN0cworICogICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYWxseSBzbWFsbGVyIHRoYW4gdGhlIGdlbmVyaWMgc3RydWN0LgorICogcmV0dXJuIHBlbmRfc3RhdHVzIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4KKyAqIAkJCUJFX1BFTkRJTkcgKHBvc3RpdmUgdmFsdWUpIGlmIHRoZSBGV0NNRAorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBpcyBwZW5kaW5nLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9lcV9tb2RpZnlfZGVsYXkoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgdTMyIG51bV9lcSwgc3RydWN0IGJlX2VxX29iamVjdCAqKmVxX2FycmF5LAorCQkgICB1MzIgKmVxX2RlbGF5X2FycmF5LCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgdm9pZCAqY2JfY29udGV4dCwgc3RydWN0IGJlX2VxX21vZGlmeV9kZWxheV9xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX01PRElGWV9FUV9ERUxBWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5fY3R4dCA9IE5VTEw7CisJdTMyIGk7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbl9jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5fY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX01PRElGWV9FUV9ERUxBWSk7CisKKwlBU1NFUlQobnVtX2VxID4gMCk7CisJQVNTRVJUKG51bV9lcSA8PSBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5kZWxheSkpOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fZXEgPSBudW1fZXE7CisJZm9yIChpID0gMDsgaSA8IG51bV9lcTsgaSsrKSB7CisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5kZWxheVtpXS5lcV9pZCA9IGVxX2FycmF5W2ldLT5lcV9pZDsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmRlbGF5W2ldLmRlbGF5X2luX21pY3Jvc2Vjb25kcyA9CisJCSAgICBlcV9kZWxheV9hcnJheVtpXTsKKwl9CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbl9jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0aC5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXRoLmMKQEAgLTAsMCArMSwxMjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9zcV9jcmVhdGVfZXgKKyAqICAgQ3JlYXRlcyBhbiBldGhlcm5ldCBzZW5kIHJpbmcgLSBleHRlbmRlZCB2ZXJzaW9uIHdpdGgKKyAqICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICogcGZvYiAtCisgKiByZCAgICAgICAgICAgICAtIHJpbmcgYWRkcmVzcworICogbGVuZ3RoX2luX2J5dGVzIC0KKyAqIHR5cGUgICAgICAgICAgICAtIFRoZSB0eXBlIG9mIHJpbmcgdG8gY3JlYXRlLgorICogdWxwICAgICAgICAgICAgIC0gVGhlIHJlcXVlc3RlZCBVTFAgbnVtYmVyIGZvciB0aGUgcmluZy4KKyAqIAkJICAgICBUaGlzIHNob3VsZCBiZSB6ZXJvIGJhc2VkLCBpLmUuIDAsMSwyLiBUaGlzIG11c3QKKyAqIAkJICAgICBiZSB2YWxpZCBOSUMgVUxQIGJhc2VkIG9uIHRoZSBmaXJtd2FyZSBjb25maWcuCisgKiAgICAgICAgICAgICAgICAgICBBbGwgZG9vcmJlbGxzIGZvciB0aGlzIHJpbmcgbXVzdCBiZSBzZW50IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGlzIFVMUC4gVGhlIGZpcnN0IG5ldHdvcmsgcmluZyBhbGxvY2F0ZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICBlYWNoIFVMUCBhcmUgaGlnaGVyIHBlcmZvcm1hbmNlIHRoYW4gc3Vic2VxdWVudCByaW5ncy4KKyAqIGNxX29iamVjdCAgICAgICAtIGNxIG9iamVjdCBmb3IgY29tcGxldGlvbnMKKyAqIGV4X3BhcmFtZXRlcnMgICAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycyAodGhhdCBtYXkgaW5jcmVhc2UgaW4KKyAqIAkJICAgICBmdXR1cmUgcmV2aXNpb25zKS4gVGhlc2UgcGFyYW1ldGVycyBhcmUgb25seSB1c2VkCisgKiAJCSAgICAgZm9yIGNlcnRhaW4gcmluZyB0eXBlcyAtLSBzZWUKKyAqICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyBmb3IgZGV0YWlscy4KKyAqIGV0aF9zcSAgICAgICAgICAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9zcV9jcmVhdGVfZXgoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgc3RydWN0IHJpbmdfZGVzYyAqcmQsCisJCXUzMiBsZW5ndGgsIHUzMiB0eXBlLCB1MzIgdWxwLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCXN0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyAqZXhfcGFyYW1ldGVycywKKwkJc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fRVRIX1RYX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIG47CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoZXRoX3NxKTsKKwlBU1NFUlQoZXhfcGFyYW1ldGVycyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCW1lbXNldChldGhfc3EsIDAsIHNpemVvZigqZXRoX3NxKSk7CisKKwlldGhfc3EtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJZXRoX3NxLT5iaWQgPSAweEZGRkZGRkZGOworCWV0aF9zcS0+Y3Ffb2JqZWN0ID0gY3Ffb2JqZWN0OworCisJLyogVHJhbnNsYXRlIGh3bGliIGludGVyZmFjZSB0byBhcm0gaW50ZXJmYWNlLiAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQkVfRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HOgorCQl0eXBlID0gRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HOworCQlicmVhazsKKwljYXNlIEJFX0VUSF9UWF9SSU5HX1RZUEVfU1RBTkRBUkQ6CisJCXR5cGUgPSBFVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEOworCQlicmVhazsKKwljYXNlIEJFX0VUSF9UWF9SSU5HX1RZUEVfQk9VTkQ6CisJCUFTU0VSVChleF9wYXJhbWV0ZXJzLT5wb3J0IDwgMik7CisJCXR5cGUgPSBFVEhfVFhfUklOR19UWVBFX0JPVU5EOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUUkFDRShETF9FUlIsICJJbnZhbGlkIGV0aCB0eCByaW5nIHR5cGU6JWQiLCB0eXBlKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwkJYnJlYWs7CisJfQorCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIE5JQyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBjb25maWcuICovCisJQVNTRVJUKHBmb2ItPmZ3X2NvbmZpZy5uaWNfdWxwX21hc2spOworCisJLyoKKwkgKiBUaGUgdWxwIHBhcmFtZXRlciBtdXN0IHNlbGVjdCBhIHZhbGlkIE5JQyBVTFAKKwkgKiBmb3IgdGhlIGN1cnJlbnQgY29uZmlnLgorCSAqLworCUFTU0VSVCgoMSA8PCB1bHApICYgcGZvYi0+ZndfY29uZmlnLm5pY191bHBfbWFzayk7CisKKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0VUSF9UWF9DUkVBVEUpOworCWZ3Y21kLT5oZWFkZXIucmVxdWVzdC5wb3J0X251bWJlciA9IGV4X3BhcmFtZXRlcnMtPnBvcnQ7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFVFhfQ09OVEVYVCwgcGRfaWQsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKworCW4gPSBiZV9yaW5nX2xlbmd0aF90b19lbmNvZGluZyhsZW5ndGgsIHNpemVvZihzdHJ1Y3QgRVRIX1dSQl9BTUFQKSk7CisJQU1BUF9TRVRfQklUU19QVFIoRVRYX0NPTlRFWFQsIHR4X3Jpbmdfc2l6ZSwKKwkJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCBjcV9pZF9zZW5kLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBjcV9vYmplY3QtPmNxX2lkKTsKKworCW4gPSBwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyOworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCBmdW5jLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnR5cGUgPSB0eXBlOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC51bHBfbnVtICA9ICgxIDw8IHVscCk7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IERJVl9ST1VORF9VUChsZW5ndGgsIFBBR0VfU0laRSk7CisJQVNTRVJUKFBBR0VTX1NQQU5ORUQocmQtPnZhLCByZC0+bGVuZ3RoKSA+PQorCQkJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMpOworCisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJNQ0MgdG8gY3JlYXRlIGV0eCBxdWV1ZSBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIHNhdmUgdGhlIGJ1dGxlciBJRCAqLworCWV0aF9zcS0+YmlkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5jaWQ7CisKKwkvKiBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ1EgKi8KKwlhdG9taWNfaW5jKCZjcV9vYmplY3QtPnJlZl9jb3VudCk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZGVzdHJveXMgYW4gZXRoZXJuZXQgc2VuZCBxdWV1ZQorCisgICAgRXRoU3EgLSBFdGhTcSBIYW5kbGUgcmV0dXJuZWQgZnJvbSBFdGhTcUNyZWF0ZQorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIEJFX1NVQ0NFU1MuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgYnkgRXRoU3FDcmVhdGUgZm9yIHRoZSBFdGhTcSBPYmplY3QuCisKKyovCitpbnQgYmVfZXRoX3NxX2Rlc3Ryb3koc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKQoreworCWludCBzdGF0dXMgPSAwOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBxdWV1ZS4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koZXRoX3NxLT5wYXJlbnRfZnVuY3Rpb24sIGV0aF9zcS0+YmlkLAorCQkgICAgIEZXQ01EX1JJTkdfVFlQRV9FVEhfVFgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwkvKiBEZXJlZmVuY2UgYW55IGFzc29jaWF0ZWQgQ1FzLiAqLworCWF0b21pY19kZWMoJmV0aF9zcS0+Y3Ffb2JqZWN0LT5yZWZfY291bnQpOworCXJldHVybiBzdGF0dXM7Cit9CisvKgorICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzZXQgdGhlIHRyYW5zbWl0IGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzLgorCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgdHhmY19lbmFibGUgICAgICAgICAtIHRyYW5zbWl0IGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvcgorCQkJICBlbmFibGUsIGZhbHNlIGZvciBkaXNhYmxlCisKKyAgICByeGZjX2VuYWJsZSAgICAgICAgIC0gcmVjZWl2ZSBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IKKwkJCQllbmFibGUsIGZhbHNlIGZvciBkaXNhYmxlCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IKKyAgICBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgaW4gbm9uLXByaXZpbGVnZWQgbWFjaGluZSBjb250ZXh0LgorKi8KK2ludAorYmVfZXRoX3NldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgdHhmY19lbmFibGUsIGJvb2wgcnhmY19lbmFibGUpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9TRVRfRkxPV19DT05UUk9MKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5yeF9mbG93X2NvbnRyb2wgPSByeGZjX2VuYWJsZTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudHhfZmxvd19jb250cm9sID0gdHhmY19lbmFibGU7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJzZXQgZmxvdyBjb250cm9sIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIGdldCB0aGUgdHJhbnNtaXQgZmxvdyBjb250cm9sIHBhcmFtZXRlcnMuCisKKyAgICBwZm9iICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIHR4ZmNfZW5hYmxlICAgICAgICAgLSB0cmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlIC0gdHJ1ZSBmb3IKKwkJCWVuYWJsZSwgZmFsc2UgZm9yIGRpc2FibGUKKworICAgIHJ4ZmNfZW5hYmxlICAgICAgICAgLSByZWNlaXZlIGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvciBlbmFibGUsCisJCQlmYWxzZSBmb3IgZGlzYWJsZQorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGVycm9yIGNvZGUKKwkJCWlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgaW4gbm9uLXByaXZpbGVnZWQgbWFjaGluZSBjb250ZXh0LgorKi8KK2ludAorYmVfZXRoX2dldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgKnR4ZmNfZW5hYmxlLCBib29sICpyeGZjX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgImdldCBmbG93IGNvbnRyb2wgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSp0eGZjX2VuYWJsZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UudHhfZmxvd19jb250cm9sOworCSpyeGZjX2VuYWJsZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UucnhfZmxvd19jb250cm9sOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9ldGhfc2V0X3FvcworICogICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV0aGVybmV0IHRyYW5zbWl0IFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKQorICogICBjaGFyYWN0ZXJpc3RpY3Mgb2YgQmxhZGVFbmdpbmUgZm9yIHRoZSBkb21haW4uIEFsbCBldGhlcm5ldAorICogICB0cmFuc21pdCByaW5ncyBvZiB0aGUgZG9tYWluIHdpbGwgZXZlbmx5IHNoYXJlIHRoZSBiYW5kd2lkdGguCisgKiAgIFRoZSBleGVjZXB0aW9uIHRvIHNoYXJpbmcgaXMgdGhlIGhvc3QgcHJpbWFyeSAoc3VwZXIpIGV0aGVybmV0CisgKiAgIHRyYW5zbWl0IHJpbmcgYXMgd2VsbCBhcyB0aGUgaG9zdCBldGhlcm5ldCBmb3J3YXJkaW5nIHJpbmcKKyAqICAgZm9yIG1pc3NlZCBvZmZsb2FkIGRhdGEuCisgKiBwZm9iIC0KKyAqIG1heF9icHMgICAgICAgICAtIHRoZSBtYXhpbXVtIGJpdHMgcGVyIHNlY29uZCBpbiB1bml0cyBvZgorICogCQkJMTAgTWJwcyAodmFsaWQgMC0xMDApCisgKiBtYXhfcHBzICAgICAgICAgLSB0aGUgbWF4aW11bSBwYWNrZXRzIHBlciBzZWNvbmQgaW4gdW5pdHMKKyAqIAkJCW9mIDEgS3BwcyAoMCBpbmRpY2F0ZXMgbm8gbGltaXQpCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9zZXRfcW9zKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiBtYXhfYnBzLCB1MzIgbWF4X3BwcykKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9RT1MgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1NFVF9RT1MpOworCisJLyogU2V0IGZpZWxkcyBpbiBmd2NtZCAqLworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYXhfYml0c19wZXJfc2Vjb25kX05JQyA9IG1heF9icHM7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDID0gbWF4X3BwczsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudmFsaWRfZmxhZ3MgPSBRT1NfQklUU19OSUMgfCBRT1NfUEtUU19OSUM7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkKKwkJVFJBQ0UoRExfRVJSLCAibmV0d29yayBzZXQgcW9zIGZ3Y21kIGZhaWxlZC4iKTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9nZXRfcW9zCisgKiAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBldGhlcm5ldCB0cmFuc21pdCBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykKKyAqICAgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgZG9tYWluLgorICogbWF4X2JwcyAgICAgICAgIC0gdGhlIG1heGltdW0gYml0cyBwZXIgc2Vjb25kIGluIHVuaXRzIG9mCisgKiAJCQkxMCBNYnBzICh2YWxpZCAwLTEwMCkKKyAqIG1heF9wcHMgICAgICAgICAtIHRoZSBtYXhpbXVtIHBhY2tldHMgcGVyIHNlY29uZCBpbiB1bml0cyBvZgorICogCQkJMSBLcHBzICgwIGluZGljYXRlcyBubyBsaW1pdCkKKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX2dldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyICptYXhfYnBzLCB1MzIgKm1heF9wcHMpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUU9TICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9HRVRfUU9TKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm5ldHdvcmsgZ2V0IHFvcyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKm1heF9icHMgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLm1heF9iaXRzX3Blcl9zZWNvbmRfTklDOworCSptYXhfcHBzID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5tYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQzsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9zZXRfZnJhbWVfc2l6ZQorICogICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV0aGVybmV0IG1heGltdW0gZnJhbWUgc2l6ZS4gVGhlIHByZXZpb3VzCisgKiAgIHZhbHVlcyBhcmUgcmV0dXJuZWQuCisgKiBwZm9iIC0KKyAqIHR4X2ZyYW1lX3NpemUgICAtIG1heGltdW0gdHJhbnNtaXQgZnJhbWUgc2l6ZSBpbiBieXRlcworICogcnhfZnJhbWVfc2l6ZSAgIC0gbWF4aW11bSByZWNlaXZlIGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX3NldF9mcmFtZV9zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgIHUzMiAqdHhfZnJhbWVfc2l6ZSwgdTMyICpyeF9mcmFtZV9zaXplKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fU0VUX0ZSQU1FX1NJWkUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1NFVF9GUkFNRV9TSVpFKTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X3R4X2ZyYW1lX3NpemUgPSAqdHhfZnJhbWVfc2l6ZTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X3J4X2ZyYW1lX3NpemUgPSAqcnhfZnJhbWVfc2l6ZTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJuZXR3b3JrIHNldCBmcmFtZSBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqdHhfZnJhbWVfc2l6ZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY2hpcF9tYXhfdHhfZnJhbWVfc2l6ZTsKKwkqcnhfZnJhbWVfc2l6ZSA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuY2hpcF9tYXhfcnhfZnJhbWVfc2l6ZTsKKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhIEV0aGVybmV0IHJlY2VpdmUgcmluZy4KKworICAgIHBmb2IgICAgICAtIGhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorICAgIHJxX2Jhc2VfdmEgICAgICAgICAgICAtIGJhc2UgVkEgZm9yIHRoZSBkZWZhdWx0IHJlY2VpdmUgcmluZy4gdGhpcyBtdXN0IGJlCisJCQlleGFjdGx5IDhLIGluIGxlbmd0aCBhbmQgY29udGluZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LgorICAgIGNxX29iamVjdCAgICAgICAgICAgIC0gaGFuZGxlIHRvIGEgcHJldmlvdXNseSBjcmVhdGVkIENRIHRvIGJlIGFzc29jaWF0ZWQKKwkJCXdpdGggdGhlIFJRLgorICAgIHBwX2V0aF9ycSAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gYW4gb3BxYXVlIGhhbmRsZSB3aGVyZSBhbiBldGgKKwkJCXJlY2VpdmUgb2JqZWN0IGlzIHJldHVybmVkLgorICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgLCBvdGhlcndpc2UgYSB1c2VmdWwKKyAgICBpbnQgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyAgICB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKm9iamVjdC4KKyAgICB0aGVyZSBtdXN0IGJlIG5vIG1vcmUgdGhhbiAxIG9mIHRoZXNlIHBlciBmdW5jdGlvbiBvYmplY3QsIHVubGVzcyB0aGUKKyAgICBmdW5jdGlvbiBvYmplY3Qgc3VwcG9ydHMgUlNTIChpcyBuZXR3b3JraW5nIGFuZCBvbiB0aGUgaG9zdCkuCisgICAgdGhlIHJxX2Jhc2VfdmEgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBvZiBleGFjdGx5IDhLLgorICAgIHRoZSBlcng6Omhvc3RfY3FpZCAob3IgaG9zdF9zdG9yX2NxaWQpIHJlZ2lzdGVyIGFuZCBlcng6OnJpbmdfcGFnZSByZWdpc3RlcnMKKyAgICB3aWxsIGJlIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUgb24gcmV0dXJuCisqLworaW50CitiZV9ldGhfcnFfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQkJc3RydWN0IGJlX2NxX29iamVjdCAqYmNtY19jcV9vYmplY3QsCisJCQlzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9SWF9DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwkvKiBNUFUgd2lsbCBzZXQgdGhlICAqLworCUFTU0VSVChyZCk7CisJQVNTRVJUKGV0aF9ycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWV0aF9ycS0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwlldGhfcnEtPmNxX29iamVjdCA9IGNxX29iamVjdDsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9FVEhfUlhfQ1JFQVRFKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSAyOwkvKiByZXF1aXJlZCBsZW5ndGggKi8KKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY3FfaWQgPSBjcV9vYmplY3QtPmNxX2lkOworCisJaWYgKGJjbWNfY3Ffb2JqZWN0KQorCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuYmNtY19jcV9pZCA9IGJjbWNfY3Ffb2JqZWN0LT5jcV9pZDsKKwllbHNlCisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5iY21jX2NxX2lkID0gMHhGRkZGOworCisJLyogQ3JlYXRlIGEgcGFnZSBsaXN0IGZvciB0aGUgRldDTUQuICovCisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJICBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcykpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJmd2NtZCB0byBtYXAgZXRoIHJ4cSBmcmFncyBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFNhdmUgdGhlIHJpbmcgSUQgZm9yIGNsZWFudXAuICovCisJZXRoX3JxLT5yaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmlkOworCisJYXRvbWljX2luYygmY3Ffb2JqZWN0LT5yZWZfY291bnQpOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBkZXN0cm95cyBhbiBFdGhlcm5ldCByZWNlaXZlIHF1ZXVlCisKKyAgICBldGhfcnEgLSBldGhlcm5ldCByZWNlaXZlIHF1ZXVlIGhhbmRsZSByZXR1cm5lZCBmcm9tIGV0aF9ycV9jcmVhdGUKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBpbnQgb24gZmFpbHVyZS4KKworICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgcmVzb3VyY3MgYWxsb2NhdGVkIGJ5IEV0aFJxQ3JlYXRlLgorICAgIFRoZSBlcng6Omhvc3RfY3FpZCAob3IgaG9zdF9zdG9yX2NxaWQpIHJlZ2lzdGVyIGFuZCBlcng6OnJpbmdfcGFnZQorICAgIHJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUgb24gcmV0dXJuCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KKworc3RhdGljIHZvaWQgYmVfZXRoX3JxX2Rlc3Ryb3lfaW50ZXJuYWxfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJCQkJIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYikKK3sKKwlzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEgPSAoc3RydWN0IGJlX2V0aHJxX29iamVjdCAqKSBjb250ZXh0OworCisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkRlc3Ryb3kgZXRoIHJxIGZhaWxlZCBpbiBpbnRlcm5hbCBjYWxsYmFjay5cbiIpOworCX0gZWxzZSB7CisJCS8qIERlcmVmZXJlbmNlIGFueSBDUXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcXVldWUuICovCisJCWF0b21pY19kZWMoJmV0aF9ycS0+Y3Ffb2JqZWN0LT5yZWZfY291bnQpOworCX0KKworCXJldHVybjsKK30KKworaW50IGJlX2V0aF9ycV9kZXN0cm95KHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgUlEuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGV0aF9ycS0+cGFyZW50X2Z1bmN0aW9uLAorCQkJZXRoX3JxLT5yaWQsIEZXQ01EX1JJTkdfVFlQRV9FVEhfUlgsIE5VTEwsIE5VTEwsCisJCQliZV9ldGhfcnFfZGVzdHJveV9pbnRlcm5hbF9jYiwgZXRoX3JxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9ycV9kZXN0cm95X29wdGlvbnMKKyAqICAgRGVzdHJveXMgYW4gZXRoZXJuZXQgcmVjZWl2ZSByaW5nIHdpdGggZmluZXIgZ3JhbnVsYXJpdHkgb3B0aW9ucworICogICB0aGFuIHRoZSBzdGFuZGFyZCBiZV9ldGhfcnFfZGVzdHJveSgpIEFQSSBmdW5jdGlvbi4KKyAqIGV0aF9ycSAgICAgICAgICAgLQorICogZmx1c2ggICAgICAgICAgICAtIFNldCB0byAxIHRvIGZsdXNoIHRoZSByaW5nLCBzZXQgdG8gMCB0byBieXBhc3MgdGhlIGZsdXNoCisgKiBjYiAgICAgICAgICAgICAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gb24gY29tcGxldGlvbgorICogY2JfY29udGV4dCAgICAgICAtIENhbGxiYWNrIGNvbnRleHQKKyAqIHJldHVybiBzdGF0dXMgICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSwgYm9vbCBmbHVzaCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9SSU5HX0RFU1RST1kgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXBmb2IgPSBldGhfcnEtPnBhcmVudF9mdW5jdGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJVFJBQ0UoRExfSU5GTywgIkRlc3Ryb3kgZXRoX3JxIHJpbmcgaWQ6JWQsIGZsdXNoOiVkIiwgZXRoX3JxLT5yaWQsCisJICAgICAgZmx1c2gpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGRlc3Ryb3kgZXRoX3JxIHJpbmcuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1JJTkdfREVTVFJPWSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuaWQgPSBldGhfcnEtPnJpZDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucmluZ190eXBlID0gRldDTURfUklOR19UWVBFX0VUSF9SWDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuYnlwYXNzX2ZsdXNoID0gKCgwID09IGZsdXNoKSA/IDEgOiAwKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsIGNiX2NvbnRleHQsCisJCQliZV9ldGhfcnFfZGVzdHJveV9pbnRlcm5hbF9jYiwgZXRoX3JxLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MgJiYgc3RhdHVzICE9IEJFX1BFTkRJTkcpIHsKKwkJVFJBQ0UoRExfRVJSLCAiZXRoX3JxIHJpbmcgZGVzdHJveSBmYWlsZWQuIGlkOiVkLCBmbHVzaDolZCIsCisJCSAgICAgIGV0aF9ycS0+cmlkLCBmbHVzaCk7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBxdWVyaWVzIHRoZSBmcmFnIHNpemUgZm9yIGVyeC4KKworICAgIHBmb2IgICAgICAtIGhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgZnJhZ19zaXplX2J5dGVzICAgICAgIC0gZXJ4IGZyYWcgc2l6ZSBpbiBieXRlcyB0aGF0IGlzL3dhcyBzZXQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IKKyAgICBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorCisqLworaW50CitiZV9ldGhfcnFfZ2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgKmZyYWdfc2l6ZV9ieXRlcykKK3sKKwlzdHJ1Y3QgRldDTURfRVRIX0dFVF9SWF9GUkFHX1NJWkUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChmcmFnX3NpemVfYnl0ZXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJcmV0dXJuIEJFX1NUQVRVU19OT19NQ0NfV1JCOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgRVRIX0dFVF9SWF9GUkFHX1NJWkUpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJnZXQgZnJhZyBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqZnJhZ19zaXplX2J5dGVzID0gMSA8PCBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmFjdHVhbF9mcmFnc2l6ZV9sb2cyOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzZXQgdGhlIGZyYWcgc2l6ZSBmb3IgZXJ4LiAgSWYgdGhlIGZyYWcgc2l6ZSBpcworICAgIGFscmVhZHkgc2V0LCB0aGUgYXR0ZW1wdCBmYWlscyBhbmQgdGhlIGN1cnJlbnQgZnJhZyBzaXplIGlzIHJldHVybmVkLgorCisgICAgcGZvYiAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICBmcmFnX3NpemUgICAgICAgLSBFcnggZnJhZyBzaXplIGluIGJ5dGVzIHRoYXQgaXMvd2FzIHNldC4KKworICAgIGN1cnJlbnRfZnJhZ19zaXplX2J5dGVzICAgIC0gUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJycmVudCBmcmFnCisJCQkJIGlzIHRvIGJlIHJ0dXJuZWQKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBlcnJvcgorICAgIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBmYWlscyBpbiBub24tcHJpdmlsZWdlZCBtYWNoaW5lIGNvbnRleHQuCisqLworaW50CitiZV9ldGhfcnFfc2V0X2ZyYWdfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJdTMyIGZyYWdfc2l6ZSwgdTMyICpmcmFnX3NpemVfYnl0ZXMpCit7CisJc3RydWN0IEZXQ01EX0VUSF9TRVRfUlhfRlJBR19TSVpFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQoZnJhZ19zaXplX2J5dGVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgRVRIX1NFVF9SWF9GUkFHX1NJWkUpOworCisJQVNTRVJUKGZyYWdfc2l6ZSA+PSAxMjggJiYgZnJhZ19zaXplIDw9IDE2ICogMTAyNCk7CisKKwkvKiBUaGlzIGlzIHRoZSBsb2cyIG9mIHRoZSBmcmFnc2l6ZS4gIFRoaXMgaXMgbm90IHRoZSBleGFjdAorCSAqIEVSWCBlbmNvZGluZy4gKi8KKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubmV3X2ZyYWdzaXplX2xvZzIgPSBfX2lsb2cyX3UzMihmcmFnX3NpemUpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJzZXQgZnJhZyBzaXplIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqZnJhZ19zaXplX2J5dGVzID0gMSA8PCBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmFjdHVhbF9mcmFnc2l6ZV9sb2cyOworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICAgIFRoaXMgcm91dGluZSBnZXRzIG9yIHNldHMgYSBtYWMgYWRkcmVzcyBmb3IgYSBkb21haW4KKyAgICBnaXZlbiB0aGUgcG9ydCBhbmQgbWFjLgorCisgICAgRnVuY3Rpb25PYmplY3QgIC0gRnVuY3Rpb24gb2JqZWN0IGhhbmRsZS4KKyAgICBwb3J0MSAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0L2dldCB0aGUgUG9ydCAxCisJCQlhZGRyZXNzLiAgT25seSB0aGUgaG9zdCBtYXkgc2V0IHRoaXMgdG8gVFJVRS4KKyAgICBtYWMxICAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0L2dldCB0aGUKKwkJCU1BQyAxIGFkZHJlc3MuICBPbmx5IHRoZSBob3N0IG1heSBzZXQgdGhpcyB0byBUUlVFLgorICAgIHdyaXRlICAgICAgICAgICAtIFNldCB0byBUUlVFIGlmIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIHRoZSBtYWMgYWRkcmVzcy4KKyAgICBtYWNfYWRkcmVzcyAgICAgIC0gQnVmZmVyIG9mIHRoZSBtYWMgYWRkcmVzcyB0byByZWFkIG9yIHdyaXRlLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlib29sIHBvcnQxLAkvKiBWTSBtdXN0IGFsd2F5cyBzZXQgdG8gZmFsc2UgKi8KKwkJYm9vbCBtYWMxLAkvKiBWTSBtdXN0IGFsd2F5cyBzZXQgdG8gZmFsc2UgKi8KKwkJYm9vbCBtZ210LCBib29sIHdyaXRlLAorCQlib29sIHBlcm1hbmVudCwgdTggKm1hY19hZGRyZXNzLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwJLyogb3B0aW9uYWwgKi8KKwkJdm9pZCAqY2JfY29udGV4dCkJLyogb3B0aW9uYWwgKi8KK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwl1bmlvbiB7CisJCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlkgKnF1ZXJ5OworCQlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1NFVCAqc2V0OworCX0gZndjbWQgPSB7TlVMTH07CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgdHlwZSA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCUFTU0VSVChtYWNfYWRkcmVzcyk7CisKKwlBU1NFUlQocG9ydDEgPT0gZmFsc2UpOworCUFTU0VSVChtYWMxID09IGZhbHNlKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisKKwlpZiAobWdtdCkgeworCQl0eXBlID0gTUFDX0FERFJFU1NfVFlQRV9NQU5BR0VNRU5UOworCX0gZWxzZSB7CisJCWlmIChwZm9iLT50eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSykKKwkJCXR5cGUgPSBNQUNfQUREUkVTU19UWVBFX05FVFdPUks7CisJCWVsc2UKKwkJCXR5cGUgPSBNQUNfQUREUkVTU19UWVBFX1NUT1JBR0U7CisJfQorCisJaWYgKHdyaXRlKSB7CisJCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcKKwkJICogcmVxdWVzdC9yZXNwb25zZSBzaXplcy4KKwkJICovCisJCWZ3Y21kLnNldCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwKKwkJCQkJICAgICAgIHdyYiwgQ09NTU9OX05UV0tfTUFDX1NFVCk7CisKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5pbnZhbGlkYXRlID0gMDsKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5tYWMxID0gKG1hYzEgPyAxIDogMCk7CisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QucG9ydCA9IChwb3J0MSA/IDEgOiAwKTsKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC50eXBlID0gdHlwZTsKKworCQkvKiBDb3B5IHRoZSBtYWMgYWRkcmVzcyB0byBzZXQuICovCisJCWZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjLlNpemVPZlN0cnVjdHVyZSA9CisJCQkgICAgc2l6ZW9mKGZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjKTsKKwkJbWVtY3B5KGZ3Y21kLnNldC0+cGFyYW1zLnJlcXVlc3QubWFjLk1BQ0FkZHJlc3MsCisJCQltYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCisJCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsCisJCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLnNldCwgTlVMTCk7CisKKwl9IGVsc2UgeworCisJCS8qCisJCSAqIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcKKwkJICogcmVxdWVzdC9yZXNwb25zZSBzaXplcy4KKwkJICovCisJCWZ3Y21kLnF1ZXJ5ID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLAorCQkJCQkgICAgICAgd3JiLCBDT01NT05fTlRXS19NQUNfUVVFUlkpOworCisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5tYWMxID0gKG1hYzEgPyAxIDogMCk7CisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5wb3J0ID0gKHBvcnQxID8gMSA6IDApOworCQlmd2NtZC5xdWVyeS0+cGFyYW1zLnJlcXVlc3QudHlwZSA9IHR5cGU7CisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC5wZXJtYW5lbnQgPSBwZXJtYW5lbnQ7CisKKwkJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlksCisJCQkJCQlwYXJhbXMucmVzcG9uc2UubWFjLk1BQ0FkZHJlc3MpOworCQlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1FVRVJZLAorCQkJCQkJcGFyYW1zLnJlc3BvbnNlLm1hYy5NQUNBZGRyZXNzKTsKKwkJcmMudmEgPSBtYWNfYWRkcmVzczsKKwkJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKHdpdGggYSBjb3B5IGZvciB0aGUgcmVzcG9uc2UpICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLAorCQkJCWNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLnF1ZXJ5LCAmcmMpOworCX0KKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm1hYyBzZXQvcXVlcnkgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHdyaXRlcyBkYXRhIHRvIGNvbnRleHQgbWVtb3J5LgorCisgICAgcGZvYiAgLSBGdW5jdGlvbiBvYmplY3QgaGFuZGxlLgorICAgIG1hY190YWJsZSAgICAgLSBTZXQgdG8gdGhlIDEyOC1iaXQgbXVsdGljYXN0IGFkZHJlc3MgaGFzaCB0YWJsZS4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCisKK2ludCBiZV9yeGZfbXVsdGljYXN0X2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlib29sIHByb21pc2N1b3VzLCB1MzIgbnVtLCB1OCAqbWFjX3RhYmxlLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwJLyogb3B0aW9uYWwgKi8KKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX211bHRpY2FzdF9xX2N0eHQgKnFfY3R4dCkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChudW0gPD0gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjKSk7CisKKwlpZiAobnVtID4gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWFjKSkgeworCQlUUkFDRShETF9FUlIsICJUb28gbWFueSBtdWx0aWNhc3QgYWRkcmVzc2VzLiBCRSBzdXBwb3J0cyAlZC4iLAorCQkgICAgICAoaW50KSBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMpKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnByb21pc2N1b3VzID0gcHJvbWlzY3VvdXM7CisJaWYgKCFwcm9taXNjdW91cykgeworCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX21hYyA9IG51bTsKKwkJaWYgKG51bSA+IDApIHsKKwkJCUFTU0VSVChtYWNfdGFibGUpOworCQkJbWVtY3B5KGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMsCisJCQkJCQltYWNfdGFibGUsIEVUSF9BTEVOICogbnVtKTsKKwkJfQorCX0KKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJtdWx0aWNhc3QgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGFkZHMgb3IgcmVtb3ZlcyBhIHZsYW4gdGFnIGZyb20gdGhlIHJ4ZiB0YWJsZS4KKworICAgIEZ1bmN0aW9uT2JqZWN0ICAtIEZ1bmN0aW9uIG9iamVjdCBoYW5kbGUuCisgICAgVkxhblRhZyAgICAgICAgIC0gVkxhbiB0YWcgdG8gYWRkIG9yIHJlbW92ZS4KKyAgICBBZGQgICAgICAgICAgICAgLSBTZXQgdG8gVFJVRSBpZiB0aGlzIHdpbGwgYWRkIGEgdmxhbiB0YWcKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQgYmVfcnhmX3ZsYW5fY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCWJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHUxNiAqdmxhbl90YWdfYXJyYXksCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAkvKiBvcHRpb25hbCAqLworCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfdmxhbl9xX2N0eHQgKnFfY3R4dCkJLyogb3B0aW9uYWwgKi8KK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlpZiAobnVtID4gQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3Qudmxhbl90YWcpKSB7CisJCVRSQUNFKERMX0VSUiwgIlRvbyBtYW55IFZMQU4gdGFncy4iKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX1ZMQU5fQ09ORklHKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wcm9taXNjdW91cyA9IHByb21pc2N1b3VzOworCWlmICghcHJvbWlzY3VvdXMpIHsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV92bGFuID0gbnVtOworCisJCWlmIChudW0gPiAwKSB7CisJCQlBU1NFUlQodmxhbl90YWdfYXJyYXkpOworCQkJbWVtY3B5KGZ3Y21kLT5wYXJhbXMucmVxdWVzdC52bGFuX3RhZywgdmxhbl90YWdfYXJyYXksCisJCQkJICBudW0gKiBzaXplb2Yodmxhbl90YWdfYXJyYXlbMF0pKTsKKwkJfQorCX0KKworCS8qIFBvc3QgdGhlIGNvbW1hZG4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgInZsYW4gZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworaW50IGJlX3J4Zl9saW5rX3N0YXR1cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxpbmtfc3RhdHVzLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX2xpbmtfc3RhdHVzX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHJjOworCisJQVNTRVJUKGxpbmtfc3RhdHVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCisJaWYgKCF3cmIpIHsKKwkJaWYgKHFfY3R4dCAmJiBjYikgeworCQkJd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJCWdlbmVyaWNfY3R4dCA9IChzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKikgcV9jdHh0OworCQkJZ2VuZXJpY19jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLAorCQkJCQkgICAgICAgQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkpOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlksCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMudmEgPSBsaW5rX3N0YXR1czsKKwkvKiBQb3N0IG9yIHF1ZXVlIHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgImxpbmsgc3RhdHVzIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX3J4Zl9xdWVyeV9ldGhfc3RhdGlzdGljcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyAqdmFfZm9yX2Z3Y21kLAorCQkgICAgdTY0IHBhX2Zvcl9md2NtZCwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgc3RydWN0IGJlX25vbmVtYmVkZGVkX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVCh2YV9mb3JfZndjbWQpOworCUFTU0VSVChwYV9mb3JfZndjbWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisKKwlUUkFDRShETF9JTkZPLCAiUXVlcnkgZXRoIHN0YXRzLiBmd2NtZCB2YTolcCBwYToweCUwOHhfJTA4eCIsCisJICAgICAgdmFfZm9yX2Z3Y21kLCB1cHBlcl8zMl9iaXRzKHBhX2Zvcl9md2NtZCksICh1MzIpcGFfZm9yX2Z3Y21kKTsKKworCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwl2YV9mb3JfZndjbWQgPSBCRV9QUkVQQVJFX05PTkVNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwKKwkJCSAgdmFfZm9yX2Z3Y21kLCBwYV9mb3JfZndjbWQsIEVUSF9HRVRfU1RBVElTVElDUyk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIHZhX2Zvcl9md2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiZXRoIHN0YXRzIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX3J4Zl9wcm9taXNjdW91cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBib29sIGVuYWJsZV9wb3J0MCwgYm9vbCBlbmFibGVfcG9ydDEsCisJCSAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfcHJvbWlzY3VvdXNfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IEZXQ01EX0VUSF9QUk9NSVNDVU9VUyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIEVUSF9QUk9NSVNDVU9VUyk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucG9ydDBfcHJvbWlzY3VvdXMgPSBlbmFibGVfcG9ydDA7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBvcnQxX3Byb21pc2N1b3VzID0gZW5hYmxlX3BvcnQxOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAicHJvbWlzY3VvdXMgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX3J4Zl9maWx0ZXJfY29uZmlnCisgKiAgIENvbmZpZ3VyZXMgQmxhZGVFbmdpbmUgZXRoZXJuZXQgcmVjZWl2ZSBmaWx0ZXIgc2V0dGluZ3MuCisgKiBwZm9iICAgIC0KKyAqIHNldHRpbmdzICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBmaWx0ZXIgc2V0dGluZ3MuCisgKiAJCQlUaGUgcmVzcG9uc2UgZnJvbSBCbGFkZUVuZ2luZSB3aWxsIGJlIHBsYWNlZCBiYWNrCisgKiAJCQlpbiB0aGlzIHN0cnVjdHVyZS4KKyAqIGNiICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCisgKiBjYl9jb250ZXh0ICAgICAgICAgLSBvcHRpb25hbAorICogcV9jdHh0ICAgICAgICAgICAgIC0gT3B0aW9uYWwuIFBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzdHJ1Y3QuCisgKiAJCQlJZiB0aGUgTUNDIFdSQiByaW5nIGlzIGZ1bGwsIHRoaXMgc3RydWN0dXJlIGlzCisgKiAJCQl1c2VkIHRvIHF1ZXVlIHRoZSBvcGVyYXRpb24uIEl0IHdpbGwgYmUgcG9zdGVkCisgKiAJCQl0byB0aGUgTUNDIHJpbmcgd2hlbiBzcGFjZSBiZWNvbWVzIGF2YWlsYWJsZS4gQWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgY29tbWFuZHMgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIHJpbmcgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcmRlciB0aGV5IGFyZSByZWNlaXZlZC4gSXQgaXMgYWx3YXlzIHZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBwYXNzIGEgcG9pbnRlciB0byBhIGdlbmVyaWMKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlX2dlbmVyaWNfcV9jdHh0LiBIb3dldmVyLCB0aGUgc3BlY2lmaWMKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgc3RydWN0cyBhcmUgZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIGdlbmVyaWMgc3RydWN0LgorICogcmV0dXJuIHBlbmRfc3RhdHVzIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4KKyAqIAkJCUJFX1BFTkRJTkcgKHBvc3RpdmUgdmFsdWUpIGlmIHRoZSBGV0NNRAorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBpcyBwZW5kaW5nLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX3J4Zl9maWx0ZXJfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTICpzZXR0aW5ncywKKwkJICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgICBzdHJ1Y3QgYmVfcnhmX2ZpbHRlcl9xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlBU1NFUlQoc2V0dGluZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9OVFdLX1JYX0ZJTFRFUik7CisJbWVtY3B5KCZmd2NtZC0+cGFyYW1zLnJlcXVlc3QsIHNldHRpbmdzLCBzaXplb2YoKnNldHRpbmdzKSk7CisKKwlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gc2V0dGluZ3M7CisJLyogUG9zdCBvciBxdWV1ZSB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJSWEYvRVJYIGZpbHRlciBjb25maWcgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXR4X2NvbnRleHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldHhfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGZiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXR4X2NvbnRleHQuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZXR4X2NvbnRleHRfYW1hcF9oX18KKyNkZWZpbmUgX19ldHhfY29udGV4dF9hbWFwX2hfXworCisvKiBFVFggcmluZyAgY29udGV4dCBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgQkVfRVRYX0NPTlRFWFRfQU1BUCB7CisJdTggdHhfY2lkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs1XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHR4X3BpZHhbMTFdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDI7CQkvKiBEV09SRCAxICovCisJdTggdHhfcmluZ19zaXplWzRdOwkvKiBEV09SRCAxICovCisJdTggcGRfaWRbNV07CS8qIERXT1JEIDEgKi8KKwl1OCBwZF9pZF9ub3RfdmFsaWQ7CS8qIERXT1JEIDEgKi8KKwl1OCBjcV9pZF9zZW5kWzEwXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgMyAqLworCXU4IGN1cl9ieXRlc1szMl07CS8qIERXT1JEIDQgKi8KKwl1OCBtYXhfYnl0ZXNbMzJdOwkvKiBEV09SRCA1ICovCisJdTggdGltZV9zdGFtcFszMl07CS8qIERXT1JEIDYgKi8KKwl1OCByc3ZkNVsxMV07CS8qIERXT1JEIDcgKi8KKwl1OCBmdW5jOwkJLyogRFdPUkQgNyAqLworCXU4IHJzdmQ2WzIwXTsJLyogRFdPUkQgNyAqLworCXU4IGN1cl90eGRfY291bnRbMzJdOwkvKiBEV09SRCA4ICovCisJdTggbWF4X3R4ZF9jb3VudFszMl07CS8qIERXT1JEIDkgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDEwICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCAxMSAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgMTIgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgMTUgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRYX0NPTlRFWFRfQU1BUCB7CisJdTMyIGR3WzE2XTsKK307CisKKyNlbmRpZiAvKiBfX2V0eF9jb250ZXh0X2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZnVuY29iai5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z1bmNvYmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU3ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z1bmNvYmouYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKworCitpbnQKK2JlX2Z1bmN0aW9uX2ludGVybmFsX3F1ZXJ5X2Zpcm13YXJlX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJCSAgIHN0cnVjdCBCRV9GSVJNV0FSRV9DT05GSUcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9GSVJNV0FSRV9DT05GSUcpOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gY29uZmlnOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIGZ1bmN0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KKyAgICBwcm92aWRlZCBieSB1cHBlciBsYXllciBkcml2ZXJzLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGludCBvbiBmYWlsdXJlLgorCisgICAgQSBmdW5jdGlvbiBvYmplY3QgcmVwcmVzZW50cyBhIHNpbmdsZSBCbGFkZUVuZ2luZSAobG9naWNhbCkgUENJIGZ1bmN0aW9uLgorICAgIFRoYXQgaXMgYSBmdW5jdGlvbiBvYmplY3QgZWl0aGVyIHJlcHJlc2VudHMKKyAgICB0aGUgbmV0d29ya2luZyBzaWRlIG9mIEJsYWRlRW5naW5lIG9yIHRoZSBpU0NTSSBzaWRlIG9mIEJsYWRlRW5naW5lLgorCisgICAgVGhpcyByb3V0aW5lIHdpbGwgYWxzbyBkZXRlY3QgYW5kIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSBQRCBvYmplY3QgZm9yIHRoZQorICAgIFBDSSBmdW5jdGlvbiBhcyBuZWVkZWQuCisqLworaW50CitiZV9mdW5jdGlvbl9vYmplY3RfY3JlYXRlKHU4IF9faW9tZW0gKmNzcl92YSwgdTggX19pb21lbSAqZGJfdmEsCisJCXU4IF9faW9tZW0gKnBjaV92YSwgdTMyIGZ1bmN0aW9uX3R5cGUsCisJCXN0cnVjdCByaW5nX2Rlc2MgKm1haWxib3gsIHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJaW50IHN0YXR1czsKKworCUFTU0VSVChwZm9iKTsJLyogbm90IGEgbWFnaWMgYXNzZXJ0ICovCisJQVNTRVJUKGZ1bmN0aW9uX3R5cGUgPD0gMik7CisKKwlUUkFDRShETF9JTkZPLCAiQ3JlYXRlIGZ1bmN0aW9uIG9iamVjdC4gdHlwZTolcyBvYmplY3Q6MHglcCIsCisJICAgICAgKGZ1bmN0aW9uX3R5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9JU0NTSSA/ICJpU0NTSSIgOgorCSAgICAgICAoZnVuY3Rpb25fdHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUksgPyAiTmV0d29yayIgOgorCQkiQXJtIikpLCBwZm9iKTsKKworCW1lbXNldChwZm9iLCAwLCBzaXplb2YoKnBmb2IpKTsKKworCXBmb2ItPnR5cGUgPSBmdW5jdGlvbl90eXBlOworCXBmb2ItPmNzcl92YSA9IGNzcl92YTsKKwlwZm9iLT5kYl92YSA9IGRiX3ZhOworCXBmb2ItPnBjaV92YSA9IHBjaV92YTsKKworCXNwaW5fbG9ja19pbml0KCZwZm9iLT5jcV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGZvYi0+cG9zdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGZvYi0+bWNjX2NvbnRleHRfbG9jayk7CisKKworCXBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXIgPSAxOworCisKKwlwZm9iLT5lbXVsYXRlID0gZmFsc2U7CisJVFJBQ0UoRExfTk9URSwgIk5vbi1lbXVsYXRpb24gbW9kZSIpOworCXN0YXR1cyA9IGJlX2RyaXZlX1BPU1QocGZvYik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkJsYWRlRW5naW5lIFBPU1QgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG1haWxib3ggKi8KKwlzdGF0dXMgPSBiZV9tcHVfaW5pdF9tYWlsYm94KHBmb2IsIG1haWxib3gpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtYWlsYm94LiIpOworCQlnb3RvIGVycm9yOworCX0KKwkvKgorCSAqIENhY2hlIHRoZSBmaXJtd2FyZSBjb25maWcgZm9yIEFTU0VSVHMgaW4gaHdjbGliIGFuZCBsYXRlcgorCSAqIGRyaXZlciBxdWVyaWVzLgorCSAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX2ludGVybmFsX3F1ZXJ5X2Zpcm13YXJlX2NvbmZpZyhwZm9iLAorCQkJCQkgICAgICAgJnBmb2ItPmZ3X2NvbmZpZyk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkZhaWxlZCB0byBxdWVyeSBmaXJtd2FyZSBjb25maWcuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCitlcnJvcjoKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJLyogTm8gY2xlYW51cCBuZWNlc3NhcnkgKi8KKwkJVFJBQ0UoRExfRVJSLCAiRmFpbGVkIHRvIGNyZWF0ZSBmdW5jdGlvbi4iKTsKKwkJbWVtc2V0KHBmb2IsIDAsIHNpemVvZigqcGZvYikpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBkcm9wcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgZ2l2ZW4gZnVuY3Rpb24gb2JqZWN0LiBPbmNlCisgICAgdGhlIHJlZmVyZW5jZSBjb3VudCBmYWxscyB0byB6ZXJvLCB0aGUgZnVuY3Rpb24gb2JqZWN0IGlzIGRlc3Ryb3llZCBhbmQgYWxsCisgICAgcmVzb3VyY2VzIGhlbGQgYXJlIGZyZWVkLgorCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gZHJvcCB0aGUgcmVmZXJlbmNlIHRvLgorKi8KK2ludCBiZV9mdW5jdGlvbl9vYmplY3RfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCVRSQUNFKERMX0lORk8sICJEZXN0cm95IHBmb2IuIE9iamVjdDoweCVwIiwKKwkgICAgICBwZm9iKTsKKworCisJQVNTRVJUKHBmb2ItPm1jYyA9PSBOVUxMKTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorCitpbnQgYmVfZnVuY3Rpb25fY2xlYW51cChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBpc3I7CisJdTMyIGhvc3RfaW50cjsKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKworCisJaWYgKHBmb2ItPnR5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLKSB7CisJCXN0YXR1cyA9IGJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKHBmb2IsIGZhbHNlLCAwLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisJfQorCS8qIFZMQU4gKi8KKwlzdGF0dXMgPSBiZV9yeGZfdmxhbl9jb25maWcocGZvYiwgZmFsc2UsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisJLyoKKwkgKiBNQ0MgUXVldWUgLS0gU3dpdGNoZXMgdG8gbWFpbGJveCBtb2RlLiAgTWF5IHdhbnQgdG8gZGVzdHJveQorCSAqIGFsbCBidXQgdGhlIE1DQyBDUSBiZWZvcmUgdGhpcyBjYWxsIGlmIHBvbGxpbmcgQ1EgaXMgbXVjaCBiZXR0ZXIKKwkgKiBwZXJmb3JtYW5jZSB0aGFuIHBvbGxpbmcgbWFpbGJveCByZWdpc3Rlci4KKwkgKi8KKwlpZiAocGZvYi0+bWNjKQorCQlzdGF0dXMgPSBiZV9tY2NfcmluZ19kZXN0cm95KHBmb2ItPm1jYyk7CisJLyoKKwkgKiBJZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgY2xlYXIgYW55IENFViBpbnRlcnJ1cHQgYXNzZXJ0aW9ucyB0aGF0CisJICogZmlyZWQgYWZ0ZXIgd2Ugc3RvcHBlZCBwcm9jZXNzaW5nIEVRcy4KKwkgKi8KKwljdHJsLmR3WzBdID0gUENJQ0ZHMV9SRUFEKHBmb2IsIGhvc3RfdGltZXJfaW50X2N0cmwpOworCWhvc3RfaW50ciA9IEFNQVBfR0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwKKwkJCQkJCQlob3N0aW50ciwgY3RybC5kdyk7CisJaWYgKCFob3N0X2ludHIpCisJCWlmIChwZm9iLT50eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSykKKwkJCWlzciA9IENTUl9SRUFEKHBmb2IsIGNldi5pc3IxKTsKKwkJZWxzZQorCQkJaXNyID0gQ1NSX1JFQUQocGZvYiwgY2V2LmlzcjApOworCWVsc2UKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCVRSQUNFKERMX0VSUiwgImZ1bmN0aW9uX2NsZWFudXAgY2FsbGVkIHdpdGggaW50ZXJydXB0IGVuYWJsZWQiKTsKKwkvKiBGdW5jdGlvbiBvYmplY3QgZGVzdHJveSAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX29iamVjdF9kZXN0cm95KHBmb2IpOworCUFTU0VSVChzdGF0dXMgPT0gQkVfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgKgorYmVfZnVuY3Rpb25fcHJlcGFyZV9lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgdTMyIHBheWxkX2xlbiwgdTMyIHJlcXVlc3RfbGVuZ3RoLAorCXUzMiByZXNwb25zZV9sZW5ndGgsIHUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pCit7CisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICpoZWFkZXIgPSBOVUxMOworCXUzMiBuOworCisJQVNTRVJUKHdyYik7CisKKwluID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvODsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgd3JiLCAxKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBwYXlsb2FkX2xlbmd0aCwgd3JiLCBtaW4ocGF5bGRfbGVuLCBuKSk7CisJaGVhZGVyID0gKHN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqKSgodTggKil3cmIgKyBuKTsKKworCWhlYWRlci0+dGltZW91dCA9IDA7CisJaGVhZGVyLT5kb21haW4gPSAwOworCWhlYWRlci0+cmVxdWVzdF9sZW5ndGggPSBtYXgocmVxdWVzdF9sZW5ndGgsIHJlc3BvbnNlX2xlbmd0aCk7CisJaGVhZGVyLT5vcGNvZGUgPSBvcGNvZGU7CisJaGVhZGVyLT5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07CisKKwlyZXR1cm4gaGVhZGVyOworfQorCit2b2lkICoKK2JlX2Z1bmN0aW9uX3ByZXBhcmVfbm9uZW1iZWRkZWRfZndjbWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJdm9pZCAqZndjbWRfdmEsIHU2NCBmd2NtZF9wYSwKKwl1MzIgcGF5bGRfbGVuLAorCXUzMiByZXF1ZXN0X2xlbmd0aCwKKwl1MzIgcmVzcG9uc2VfbGVuZ3RoLAorCXUzMiBvcGNvZGUsIHUzMiBzdWJzeXN0ZW0pCit7CisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICpoZWFkZXIgPSBOVUxMOworCXUzMiBuOworCXN0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCAqcGxwOworCisJQVNTRVJUKHdyYik7CisJQVNTRVJUKGZ3Y21kX3ZhKTsKKworCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikgZndjbWRfdmE7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgd3JiLCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCLCBwYXlsb2FkX2xlbmd0aCwgd3JiLCBwYXlsZF9sZW4pOworCisJLyoKKwkgKiBBc3N1bWUgb25lIGZyYWdtZW50LiBUaGUgY2FsbGVyIG1heSBvdmVycmlkZSB0aGUgU0dMIGJ5CisJICogcmV3cml0aW5nIHRoZSAwdGggbGVuZ3RoIGFuZCBhZGRpbmcgbW9yZSBlbnRyaWVzLiAgVGhleQorCSAqIHdpbGwgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgc2dlX2NvdW50LgorCSAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIHNnZV9jb3VudCwgd3JiLCAxKTsKKworCW4gPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCXBscCA9IChzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgKikoKHU4ICopd3JiICsgbik7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ubGVuZ3RoLCBwbHAsIHBheWxkX2xlbik7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ucGFfbG8sIHBscCwgKHUzMilmd2NtZF9wYSk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQl9QQVlMT0FELCBzZ2xbMF0ucGFfaGksIHBscCwKKwkJCQkJdXBwZXJfMzJfYml0cyhmd2NtZF9wYSkpOworCisJaGVhZGVyLT50aW1lb3V0ID0gMDsKKwloZWFkZXItPmRvbWFpbiA9IDA7CisJaGVhZGVyLT5yZXF1ZXN0X2xlbmd0aCA9IG1heChyZXF1ZXN0X2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoKTsKKwloZWFkZXItPm9wY29kZSA9IG9wY29kZTsKKwloZWFkZXItPnN1YnN5c3RlbSA9IHN1YnN5c3RlbTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgb2Zmc2V0OworCisJaWYgKHBmb2ItPm1jYykKKwkJd3JiID0gX2JlX21wdV9wZWVrX3Jpbmdfd3JiKHBmb2ItPm1jYywgZmFsc2UpOworCWVsc2UgeworCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgd3JiKS84OworCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAoKHU4ICopIHBmb2ItPm1haWxib3gudmEgKworCQkJCW9mZnNldCk7CisJfQorCisJaWYgKHdyYikKKwkJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKworCXJldHVybiB3cmI7Cit9CisKKyNpZiBkZWZpbmVkKEJFX0RFQlVHKQordm9pZCBiZV9mdW5jdGlvbl9kZWJ1Z19wcmludF93cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCB2b2lkICpvcHRpb25hbF9md2NtZF92YSwKKwkJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpCit7CisKKwlzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKmhlYWRlciA9IE5VTEw7CisJdTggZW1iZWRkZWQ7CisJdTMyIG47CisKKwllbWJlZGRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCB3cmIpOworCisJaWYgKGVtYmVkZGVkKSB7CisJCW4gPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCQloZWFkZXIgPSAoc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICopKCh1OCAqKXdyYiArIG4pOworCX0gZWxzZSB7CisJCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikgb3B0aW9uYWxfZndjbWRfdmE7CisJfQorCisJLyogU2F2ZSB0aGUgY29tcGxldGVkIGNvdW50IGJlZm9yZSBwb3N0aW5nIGZvciBhIGRlYnVnIGFzc2VydC4gKi8KKworCWlmIChoZWFkZXIpIHsKKwkJd3JiX2NvbnRleHQtPm9wY29kZSA9IGhlYWRlci0+b3Bjb2RlOworCQl3cmJfY29udGV4dC0+c3Vic3lzdGVtID0gaGVhZGVyLT5zdWJzeXN0ZW07CisKKwl9IGVsc2UgeworCQl3cmJfY29udGV4dC0+b3Bjb2RlID0gMDsKKwkJd3JiX2NvbnRleHQtPnN1YnN5c3RlbSA9IDA7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgYmVfZnVuY3Rpb25fZGVidWdfcHJpbnRfd3JiKGFfLCBiXywgY18sIGRfKQorI2VuZGlmCisKK2ludAorYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dCwgdm9pZCAqb3B0aW9uYWxfZndjbWRfdmEsCisJCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgKnJjKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPSBOVUxMOworCXU2NCAqcDsKKworCWlmIChxX2N0eHQpIHsKKwkJLyogSW5pdGlhbGl6ZSBjb250ZXh0LiAgICAgICAgICovCisJCXFfY3R4dC0+Y29udGV4dC5pbnRlcm5hbF9jYiA9IGludGVybmFsX2NiOworCQlxX2N0eHQtPmNvbnRleHQuaW50ZXJuYWxfY2JfY29udGV4dCA9IGludGVybmFsX2NiX2NvbnRleHQ7CisJCXFfY3R4dC0+Y29udGV4dC5jYiA9IGNiOworCQlxX2N0eHQtPmNvbnRleHQuY2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJCWlmIChyYykgeworCQkJcV9jdHh0LT5jb250ZXh0LmNvcHkubGVuZ3RoID0gcmMtPmxlbmd0aDsKKwkJCXFfY3R4dC0+Y29udGV4dC5jb3B5LmZ3Y21kX29mZnNldCA9IHJjLT5md2NtZF9vZmZzZXQ7CisJCQlxX2N0eHQtPmNvbnRleHQuY29weS52YSA9IHJjLT52YTsKKwkJfSBlbHNlCisJCQlxX2N0eHQtPmNvbnRleHQuY29weS5sZW5ndGggPSAwOworCisJCXFfY3R4dC0+Y29udGV4dC5vcHRpb25hbF9md2NtZF92YSA9IG9wdGlvbmFsX2Z3Y21kX3ZhOworCisJCS8qIFF1ZXVlIHRoaXMgcmVxdWVzdCAqLworCQlzdGF0dXMgPSBiZV9mdW5jdGlvbl9xdWV1ZV9tY2Nfd3JiKHBmb2IsIHFfY3R4dCk7CisKKwkJZ290byBFcnJvcjsKKwl9CisJLyoKKwkgKiBBbGxvY2F0ZSBhIFdSQiBjb250ZXh0IHN0cnVjdCB0byBob2xkIHRoZSBjYWxsYmFjayBwb2ludGVycywKKwkgKiBzdGF0dXMsIGV0Yy4gIFRoaXMgaXMgcmVxdWlyZWQgaWYgY29tbWFuZHMgY29tcGxldGUgb3V0IG9mIG9yZGVyLgorCSAqLworCXdyYl9jb250ZXh0ID0gX2JlX21jY19hbGxvY2F0ZV93cmJfY29udGV4dChwZm9iKTsKKwlpZiAoIXdyYl9jb250ZXh0KSB7CisJCVRSQUNFKERMX1dBUk4sICJGYWlsZWQgdG8gYWxsb2NhdGUgTUNDIFdSQiBjb250ZXh0LiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfU1lTVEVNX1JFU09VUkNFUzsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogSW5pdGlhbGl6ZSBjb250ZXh0LiAqLworCW1lbXNldCh3cmJfY29udGV4dCwgMCwgc2l6ZW9mKCp3cmJfY29udGV4dCkpOworCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYiA9IGludGVybmFsX2NiOworCXdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYl9jb250ZXh0ID0gaW50ZXJuYWxfY2JfY29udGV4dDsKKwl3cmJfY29udGV4dC0+Y2IgPSBjYjsKKwl3cmJfY29udGV4dC0+Y2JfY29udGV4dCA9IGNiX2NvbnRleHQ7CisJaWYgKHJjKSB7CisJCXdyYl9jb250ZXh0LT5jb3B5Lmxlbmd0aCA9IHJjLT5sZW5ndGg7CisJCXdyYl9jb250ZXh0LT5jb3B5LmZ3Y21kX29mZnNldCA9IHJjLT5md2NtZF9vZmZzZXQ7CisJCXdyYl9jb250ZXh0LT5jb3B5LnZhID0gcmMtPnZhOworCX0gZWxzZQorCQl3cmJfY29udGV4dC0+Y29weS5sZW5ndGggPSAwOworCXdyYl9jb250ZXh0LT53cmIgPSB3cmI7CisKKwkvKgorCSAqIENvcHkgdGhlIGNvbnRleHQgcG9pbnRlciBpbnRvIHRoZSBXUkIgb3BhcXVlIHRhZyBmaWVsZC4KKwkgKiBWZXJpZnkgYXNzdW1wdGlvbiBvZiA2NC1iaXQgdGFnIHdpdGggYSBjb21waWxlIHRpbWUgYXNzZXJ0LgorCSAqLworCXAgPSAodTY0ICopICgodTggKil3cmIgKyBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCB0YWcpLzgpOworCSpwID0gKHU2NCkoc2l6ZV90KXdyYl9jb250ZXh0OworCisJLyogUHJpbnQgaW5mbyBhYm91dCB0aGlzIEZXQ01EIGZvciBkZWJ1ZyBidWlsZHMuICovCisJYmVfZnVuY3Rpb25fZGVidWdfcHJpbnRfd3JiKHBmb2IsIHdyYiwgb3B0aW9uYWxfZndjbWRfdmEsIHdyYl9jb250ZXh0KTsKKworCS8qCisJICogaXNzdWUgdGhlIFdSQiB0byB0aGUgTVBVIGFzIGFwcHJvcHJpYXRlCisJICovCisJaWYgKHBmb2ItPm1jYykgeworCQkvKgorCQkgKiB3ZSdyZSBpbiBXUkIgbW9kZSwgcGFzcyB0byB0aGUgbWNjIGxheWVyCisJCSAqLworCQlzdGF0dXMgPSBfYmVfbXB1X3Bvc3Rfd3JiX3JpbmcocGZvYi0+bWNjLCB3cmIsIHdyYl9jb250ZXh0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSdyZSBpbiBtYWlsYm94IG1vZGUKKwkJICovCisJCXN0YXR1cyA9IF9iZV9tcHVfcG9zdF93cmJfbWFpbGJveChwZm9iLCB3cmIsIHdyYl9jb250ZXh0KTsKKworCQkvKiBtYWlsYm94IG1vZGUgYWx3YXlzIGNvbXBsZXRlcyBzeW5jaHJvbm91c2x5ICovCisJCUFTU0VSVChzdGF0dXMgIT0gQkVfU1RBVFVTX1BFTkRJTkcpOworCX0KKworRXJyb3I6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQl1MzIgaWQsIHUzMiByaW5nX3R5cGUsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQl2b2lkICpjYl9jb250ZXh0LCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dCkKK3sKKworCXN0cnVjdCBGV0NNRF9DT01NT05fUklOR19ERVNUUk9ZICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCVRSQUNFKERMX0lORk8sICJEZXN0cm95IHJpbmcgaWQ6JWQgdHlwZTolZCIsIGlkLCByaW5nX3R5cGUpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGRlc3Ryb3kgcmluZy4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fUklOR19ERVNUUk9ZKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5pZCA9IGlkOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5yaW5nX3R5cGUgPSByaW5nX3R5cGU7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIGNiLCBjYl9jb250ZXh0LAorCQkJCWludGVybmFsX2NiLCBpbnRlcm5hbF9jYl9jb250ZXh0LCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTICYmIHN0YXR1cyAhPSBCRV9QRU5ESU5HKSB7CisJCVRSQUNFKERMX0VSUiwgIlJpbmcgZGVzdHJveSBmd2NtZCBmYWlsZWQuIGlkOiVkIHJpbmdfdHlwZTolZCIsCisJCQlpZCwgcmluZ190eXBlKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCitiZV9yZF90b19wYV9saXN0KHN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgUEhZU19BRERSICpwYV9saXN0LCB1MzIgbWF4X251bSkKK3sKKwl1MzIgbnVtX3BhZ2VzID0gUEFHRVNfU1BBTk5FRChyZC0+dmEsIHJkLT5sZW5ndGgpOworCXUzMiBpID0gMDsKKwl1NjQgcGEgPSByZC0+cGE7CisJX19sZTY0IGxlcGE7CisKKwlBU1NFUlQocGFfbGlzdCk7CisJQVNTRVJUKHBhKTsKKworCWZvciAoaSA9IDA7IGkgPCBtaW4obnVtX3BhZ2VzLCBtYXhfbnVtKTsgaSsrKSB7CisJCWxlcGEgPSBjcHVfdG9fbGU2NChwYSk7CisJCXBhX2xpc3RbaV0ubG8gPSAodTMyKWxlcGE7CisJCXBhX2xpc3RbaV0uaGkgPSB1cHBlcl8zMl9iaXRzKGxlcGEpOworCQlwYSArPSBQQUdFX1NJWkU7CisJfQorfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2Z1bmN0aW9uX2dldF9md192ZXJzaW9uCisgKiAgIFJldHJpZXZlcyB0aGUgZmlybXdhcmUgdmVyc2lvbiBvbiB0aGUgYWRwYXRlci4gSWYgdGhlIGNhbGxiYWNrIGlzCisgKiAgIE5VTEwgdGhpcyBjYWxsIGV4ZWN1dGVzIHN5bmNocm9ub3VzbHkuIElmIHRoZSBjYWxsYmFjayBpcyBub3QgTlVMTCwKKyAqICAgdGhlIHJldHVybmVkIHN0YXR1cyB3aWxsIGJlIEJFX1BFTkRJTkcgaWYgdGhlIGNvbW1hbmQgd2FzIGlzc3VlZAorICogICBzdWNjZXNzZnVsbHkuCisgKiBwZm9iICAgIC0KKyAqIGZ3diAgICAgICAgIC0gUG9pbnRlciB0byByZXNwb25zZSBidWZmZXIgaWYgY2FsbGJhY2sgaXMgTlVMTC4KKyAqIGNiICAgICAgICAgICAtIENhbGxiYWNrIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgRldDTUQgY29tcGxldGVzLgorICogY2JfY29udGV4dCAgIC0gUGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIHJldHVybiBwZW5kX3N0YXR1cyAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuCisgKiAJCQlCRV9QRU5ESU5HIChwb3N0aXZlIHZhbHVlKSBpZiB0aGUgRldDTUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gaXMgcGVuZGluZy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgKmZ3diwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OICpmd2NtZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisKKwlpZiAoIWNiICYmICFmd3YpIHsKKwkJVFJBQ0UoRExfRVJSLCAiY2FsbGJhY2sgYW5kIHJlc3BvbnNlIGJ1ZmZlciBOVUxMISIpOworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fR0VUX0ZXX1ZFUlNJT04pOworCisJcmMubGVuZ3RoID0gRklFTERfU0laRU9GKHN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT04sCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy52YSA9IGZ3djsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsCisJCQkJY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsICZyYyk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQKK2JlX2Z1bmN0aW9uX3F1ZXVlX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSAgc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQpCit7CisJaW50IHN0YXR1czsKKworCUFTU0VSVChxX2N0eHQpOworCisJLyoKKwkgKiBpc3N1ZSB0aGUgV1JCIHRvIHRoZSBNUFUgYXMgYXBwcm9wcmlhdGUKKwkgKi8KKwlpZiAocGZvYi0+bWNjKSB7CisKKwkJLyogV2UncmUgaW4gcmluZyBtb2RlLiAgUXVldWUgdGhpcyBpdGVtLiAqLworCQlwZm9iLT5tY2MtPmJhY2tsb2dfbGVuZ3RoKys7CisJCWxpc3RfYWRkX3RhaWwoJnFfY3R4dC0+Y29udGV4dC5saXN0LCAmcGZvYi0+bWNjLT5iYWNrbG9nKTsKKwkJc3RhdHVzID0gQkVfUEVORElORzsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbi5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfY29tbW9uX2FtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfY29tbW9uX2FtYXBfaF9fCisjaW5jbHVkZSAiaG9zdF9zdHJ1Y3QuaCIKKworLyogLS0tIFBIWV9MSU5LX0RVUExFWF9FTlVNIC0tLSAqLworI2RlZmluZSBQSFlfTElOS19EVVBMRVhfTk9ORSAgICAgICAgICAgICgwKQorI2RlZmluZSBQSFlfTElOS19EVVBMRVhfSEFMRiAgICAgICAgICAgICgxKQorI2RlZmluZSBQSFlfTElOS19EVVBMRVhfRlVMTCAgICAgICAgICAgICgyKQorCisvKiAtLS0gUEhZX0xJTktfU1BFRURfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfWkVSTyAgICAgICAgICAgICAoMCkJLyogTm8gbGluay4gKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMTBNQlBTICAgICAgICAgICAoMSkJLyogMTAgTWJwcyAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xMDBNQlBTICAgICAgICAgICgyKQkvKiAxMDAgTWJwcyAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xR0JQUyAgICAgICAgICAgICgzKQkvKiAxIEdicHMgKi8KKyNkZWZpbmUgUEhZX0xJTktfU1BFRURfMTBHQlBTICAgICAgICAgICAoNCkJLyogMTAgR2JwcyAqLworCisvKiAtLS0gUEhZX0xJTktfRkFVTFRfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUEhZX0xJTktfRkFVTFRfTk9ORSAgICAgICAgICAgICAoMCkJLyogTm8gZmF1bHQgc3RhdHVzCisJCQkJCQkJYXZhaWxhYmxlIG9yIGRldGVjdGVkICovCisjZGVmaW5lIFBIWV9MSU5LX0ZBVUxUX0xPQ0FMICAgICAgICAgICAgKDEpCS8qIExvY2FsIGZhdWx0IGRldGVjdGVkICovCisjZGVmaW5lIFBIWV9MSU5LX0ZBVUxUX1JFTU9URSAgICAgICAgICAgKDIpCS8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAqLworCisvKiAtLS0gQkVfVUxQX01BU0sgLS0tICovCisjZGVmaW5lIEJFX1VMUDBfTUFTSyAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEJFX1VMUDFfTUFTSyAgICAgICAgICAgICAgICAgICAgKDIpCisjZGVmaW5lIEJFX1VMUDJfTUFTSyAgICAgICAgICAgICAgICAgICAgKDQpCisKKy8qIC0tLSBOVFdLX0FDVElWRV9QT1JUIC0tLSAqLworI2RlZmluZSBOVFdLX1BPUlRfQSAgICAgICAgICAgICAgICAgICAgICgwKQkvKiBQb3J0IEEgaXMgY3VycmVudGx5IGFjdGl2ZSAqLworI2RlZmluZSBOVFdLX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICgxKQkvKiBQb3J0IEIgaXMgY3VycmVudGx5IGFjdGl2ZSAqLworI2RlZmluZSBOVFdLX05PX0FDVElWRV9QT1JUICAgICAgICAgICAgICgxNSkJLyogQm90aCBwb3J0cyBoYXZlIGxvc3QgbGluayAqLworCisvKiAtLS0gTlRXS19MSU5LX1RZUEUgLS0tICovCisjZGVmaW5lIE5UV0tfTElOS19UWVBFX1BIWVNJQ0FMICAgICAgICAgKDApCS8qIGxpbmsgdXAvZG93biBldmVudAorCQkJCQkJICAgYXBwbGllcyB0byBCbGFkZUVuZ2luZSdzCisJCQkJCQkgICBQaHlzaWNhbCBQb3J0cworCQkJCQkJICAgKi8KKyNkZWZpbmUgTlRXS19MSU5LX1RZUEVfVklSVFVBTCAgICAgICAgICAoMSkJLyogVmlydHVhbCBsaW5rIHVwL2Rvd24gZXZlbnQKKwkJCQkJCSAgIHJlcG9ydGVkIGJ5IEJsYWRlRXhjaGFuZ2UuCisJCQkJCQkgICBUaGlzIGFwcGxpZXMgb25seSB3aGVuIHRoZQorCQkJCQkJICAgVkxEIGZlYXR1cmUgaXMgZW5hYmxlZAorCQkJCQkJICAgKi8KKworLyoKKyAqIC0tLSBGV0NNRF9NQUNfVFlQRV9FTlVNIC0tLQorICogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHR5cGVzIG9mIE1BQyBhZGRyZXNzZXMgaW4gdGhlIFJYRiBNQUMgQWRkcmVzcyBUYWJsZS4KKyAqLworI2RlZmluZSBNQUNfQUREUkVTU19UWVBFX1NUT1JBR0UgICAgICAgICgwKQkvKiBTdG9yYWdlIE1BQyBBZGRyZXNzICovCisjZGVmaW5lIE1BQ19BRERSRVNTX1RZUEVfTkVUV09SSyAgICAgICAgKDEpCS8qIE5ldHdvcmsgTUFDIEFkZHJlc3MgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9QRCAgICAgICAgICAgICAoMikJLyogUHJvdGVjdGlvbiBEb21haW4gTUFDIEFkZHIgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9NQU5BR0VNRU5UICAgICAoMykJLyogTWFuYWdtZW50IE1BQyBBZGRyZXNzICovCisKKworLyogLS0tIEZXQ01EX1JJTkdfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfRVRIX1JYICAgICAgICAgICgxKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fRVRIX1JYX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0VUSF9UWCAgICAgICAgICAoMikJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0VUSF9UWF9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9JU0NTSV9XUkJRICAgICAgKDMpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9JU0NTSV9XUkJRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0lTQ1NJX0RFRlEgICAgICAoNCkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX1dSQlEgICAgICAgICg1KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fVFBNX1dSQlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX0RFRlEgICAgICAgICg2KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05UUE1fVERFRlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfVFBNX1JRICAgICAgICAgICg3KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fVFBNX1JRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX01DQyAgICAgICAgICAgICAoOCkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX01DQ19DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9DUSAgICAgICAgICAgICAgKDkpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9DUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9FUSAgICAgICAgICAgICAgKDEwKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fRVFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfUVAgICAgICAgICAgICAgICgxMSkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfUkRNQV9RUF9DUkVBVEUuICovCisKKworLyogLS0tIEVUSF9UWF9SSU5HX1RZUEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HICAgICAoMSkJLyogRXRoZXJuZXQgcmluZyBmb3IKKwkJCQkJCSAgIGZvcndhcmRpbmcgcGFja2V0cyAqLworI2RlZmluZSBFVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEICAgICAgICgyKQkvKiBFdGhlcm5ldCByaW5nIGZvciBzZW5kaW5nCisJCQkJCQkgICBuZXR3b3JrIHBhY2tldHMuICovCisjZGVmaW5lIEVUSF9UWF9SSU5HX1RZUEVfQk9VTkQgICAgICAgICAgKDMpCS8qIEV0aGVybmV0IHJpbmcgYm91bmQgdG8gdGhlCisJCQkJCQkgICBwb3J0IHNwZWNpZmllZCBpbiB0aGUgY29tbWFuZAorCQkJCQkJICAgaGVhZGVyLnBvcnRfbnVtYmVyIGZpZWxkLgorCQkJCQkJICAgUmluZ3Mgb2YgdGhpcyB0eXBlIGFyZQorCQkJCQkJICAgTk9UIHN1YmplY3QgdG8gdGhlCisJCQkJCQkgICBmYWlsb3ZlciBsb2dpYyBpbXBsZW1lbnRlZAorCQkJCQkJICAgaW4gdGhlIEJsYWRlRW5naW5lLgorCQkJCQkJICAgKi8KKworLyogLS0tIEZXQ01EX0NPTU1PTl9RT1NfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBRT1NfQklUU19OSUMgICAgICAgICAgICAgICAgICAgICgxKQkvKiBtYXhfYml0c19wZXJfc2Vjb25kX05JQyAqLworCQkJCQkJICAvKiBmaWVsZCBpcyB2YWxpZC4gICovCisjZGVmaW5lIFFPU19QS1RTX05JQyAgICAgICAgICAgICAgICAgICAgKDIpCS8qIG1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDICovCisJCQkJCQkgIC8qIGZpZWxkIGlzIHZhbGlkLiAgKi8KKyNkZWZpbmUgUU9TX0lPUFNfSVNDU0kgICAgICAgICAgICAgICAgICAoNCkJLyogbWF4X2lvc19wZXJfc2Vjb25kX2lTQ1NJICovCisJCQkJCQkgIC8qZmllbGQgaXMgdmFsaWQuICAqLworI2RlZmluZSBRT1NfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICg4KQkvKiBkb21haW5fVkxBTl90YWcgZmllbGQKKwkJCQkJCSAgIGlzIHZhbGlkLiAqLworI2RlZmluZSBRT1NfRkFCUklDX0lEICAgICAgICAgICAgICAgICAgICgxNikJLyogZmFicmljX2RvbWFpbl9JRCBmaWVsZAorCQkJCQkJICAgaXMgdmFsaWQuICovCisjZGVmaW5lIFFPU19PRU1fUEFSQU1TICAgICAgICAgICAgICAgICAgKDMyKQkvKiBxb3NfcGFyYW1zX29lbSBmaWVsZAorCQkJCQkJICAgaXMgdmFsaWQuICovCisjZGVmaW5lIFFPU19UUFVUX0lTQ1NJICAgICAgICAgICAgICAgICAgKDY0KQkvKiBtYXhfYnl0ZXNfcGVyX3NlY29uZF9pU0NTSQorCQkJCQkJICAgZmllbGQgIGlzIHZhbGlkLiAgKi8KKworCisvKgorICogLS0tIEZBSUxPVkVSX0NPTkZJR19FTlVNIC0tLQorICogRmFpbG92ZXIgY29uZmlndXJhdGlvbiBzZXR0aW5nIHVzZWQgaW4gRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSCisgKi8KKyNkZWZpbmUgRkFJTE9WRVJfQ09ORklHX05PX0NIQU5HRSAgICAgICAoMCkJLyogTm8gY2hhbmdlIHRvIGF1dG9tYXRpYyAqLworCQkJCQkJICAvKiBwb3J0IGZhaWxvdmVyIHNldHRpbmcuICovCisjZGVmaW5lIEZBSUxPVkVSX0NPTkZJR19PTiAgICAgICAgICAgICAgKDEpCS8qIEF1dG9tYXRpYyBwb3J0IGZhaWxvdmVyCisJCQkJCQkgICBvbiBsaW5rIGRvd24gIGlzIGVuYWJsZWQuICovCisjZGVmaW5lIEZBSUxPVkVSX0NPTkZJR19PRkYgICAgICAgICAgICAgKDIpCS8qIEF1dG9tYXRpYyBwb3J0IGZhaWxvdmVyCisJCQkJCQkgICBvbiBsaW5rIGRvd24gaXMgZGlzYWJsZWQuICovCisKKy8qCisgKiAtLS0gRkFJTE9WRVJfUE9SVF9FTlVNIC0tLQorICogRmFpbG92ZXIgcG9ydCBzZXR0aW5nIHVzZWQgaW4gRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSCisgKi8KKyNkZWZpbmUgRkFJTE9WRVJfUE9SVF9BICAgICAgICAgICAgICAgICAoMCkJLyogU2VsZWN0cyBwb3J0IEEuICovCisjZGVmaW5lIEZBSUxPVkVSX1BPUlRfQiAgICAgICAgICAgICAgICAgKDEpCS8qIFNlbGVjdHMgcG9ydCBCLiAqLworI2RlZmluZSBGQUlMT1ZFUl9QT1JUX05PTkUgICAgICAgICAgICAgICgxNSkJLyogTm8gcG9ydCBjaGFuZ2UgcmVxdWVzdGVkLiAqLworCisKKy8qCisgKiAtLS0gTUdNVF9GTEFTSFJPTV9PUENPREUgLS0tCisgKiBGbGFzaCBST00gb3BlcmF0aW9uIGNvZGUKKyAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9GTEFTSCAgICAgICgxKQkvKiBDb21taXQgZG93bmxvYWRlZCBkYXRhCisJCQkJCQkgICB0byBGbGFzaCBST00gKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfU0FWRSAgICAgICAoMikJLyogU2F2ZSBkb3dubG9hZGVkIGRhdGEgdG8KKwkJCQkJCSAgIEFSTSdzIEREUiAtIGRvIG5vdCBmbGFzaCAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9DTEVBUiAgICAgICgzKQkvKiBFcmFzZSBzcGVjaWZpZWQgY29tcG9uZW50CisJCQkJCQkgICBmcm9tIEZsYXNoUk9NICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX1JFUE9SVCAgICAgKDQpCS8qIFJlYWQgc3BlY2lmaWVkIGNvbXBvbmVudAorCQkJCQkJICAgZnJvbSBGbGFzaCBST00gKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfSU1BR0VfSU5GTyAoNSkJLyogUmV0dXJucyBzaXplIG9mIGEKKwkJCQkJCSAgIGNvbXBvbmVudCAqLworCisvKgorICogLS0tIE1HTVRfRkxBU0hST01fT1BUWVBFIC0tLQorICogRmxhc2ggUk9NIG9wZXJhdGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9GSVJNV0FSRSAoMCkJLyogSW5jbHVkZXMgQVJNIGZpcm13YXJlLAorCQkJCQkJICAgSVBTZWMgKG9wdGlvbmFsKSBhbmQgRVAKKwkJCQkJCSAgIGZpcm13YXJlICAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX1JFREJPT1QgKDEpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfQklPUyAgKDIpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfUFhFX0JJT1MgKDMpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfQ1RSTFMgKDQpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NGR19JUFNFQyAgKDUpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NGR19JTkkgICAgKDYpCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX1JPTV9PRkZTRVRfU1BFQ0lGSUVEICg3KQorCisvKgorICogLS0tIEZMQVNIUk9NX1RZUEUgLS0tCisgKiBGbGFzaCBST00gbWFudWZhY3R1cmVycyBzdXBwb3J0ZWQgaW4gdGhlIGYvdworICovCisjZGVmaW5lIElOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNQQU5TSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIE1JQ1JPTiAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBERFJfQ0FTX1RZUEUgLS0tICovCisjZGVmaW5lIENBU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIENBU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIENBU181ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBERFJfU0laRV9UWVBFIC0tLSAqLworI2RlZmluZSBTSVpFXzI1Nk1CICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBTSVpFXzUxMk1CICAgICAgICAgICAgICAgICAgICAgICgxKQorCisvKiAtLS0gRERSX01PREVfVFlQRSAtLS0gKi8KKyNkZWZpbmUgRERSX05PX0VDQyAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRERSX0VDQyAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKworLyogLS0tIElOVEVSRkFDRV8xMEdCX1RZUEUgLS0tICovCisjZGVmaW5lIENYNF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFhGUF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgKDEpCisKKy8qIC0tLSBCRV9DSElQX01BWF9NVFUgLS0tICovCisjZGVmaW5lIENISVBfTUFYX01UVSAgICAgICAgICAgICAgICAgICAgKDkwMDApCisKKy8qIC0tLSBYQVVJX1NUQVRFX0VOVU0gLS0tICovCisjZGVmaW5lIFhBVUlfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgKDApCS8qIFRoaXMgTVVTVCBiZSB0aGUgZGVmYXVsdAorCQkJCQkJICAgdmFsdWUgZm9yIGFsbCByZXF1ZXN0cworCQkJCQkJICAgd2hpY2ggc2V0L2NoYW5nZQorCQkJCQkJICAgZXF1YWxpemF0aW9uIHBhcmFtZXRlci4gICovCisjZGVmaW5lIFhBVUlfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgKDI1NSkJLyogVGhlIFhBVUkgZm9yIGJvdGggcG9ydHMKKwkJCQkJCSAgIG1heSBiZSBkaXNhYmxlZCBmb3IgRU1JCisJCQkJCQkgICB0ZXN0cy4gVGhlcmUgaXMgbm8KKwkJCQkJCSAgIHByb3Zpc2lvbiBmb3IgdHVybmluZyBvZmYKKwkJCQkJCSAgIGluZGl2aWR1YWwgcG9ydHMuCisJCQkJCQkgICAqLworLyogLS0tIEJFX0FTSUNfUkVWSVNJT04gLS0tICovCisjZGVmaW5lIEJFX0FTSUNfUkVWX0EwICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEJFX0FTSUNfUkVWX0ExICAgICAgICAgICAgICAgICAgKDIpCisKKyNlbmRpZiAvKiBfX2Z3Y21kX2NvbW1vbl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbl9ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA3Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbl9ibWFwLmgKQEAgLTAsMCArMSw3MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9jb21tb25fYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9jb21tb25fYm1hcF9oX18KKyNpbmNsdWRlICJmd2NtZF90eXBlc19ibWFwLmgiCisjaW5jbHVkZSAiZndjbWRfaGRyX2JtYXAuaCIKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorICAgLyogUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0cnVjdCBQSFlTX0FERFIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsbzsJLyogRFdPUkQgMCAqLworCQkJdTMyIGhpOwkvKiBEV09SRCAxICovCisJCX0gX19wYWNrZWQ7CS8qIHVubmFtZWQgc3RydWN0ICovCisJCXUzMiBkd1syXTsJLyogZHdvcmQgdW5pb24gKi8KKwl9OwkJCS8qIHVubmFtZWQgdW5pb24gKi8KK30gX19wYWNrZWQgOworCisKKyNlbHNlCisgICAvKiBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RydWN0IFBIWVNfQUREUiB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGxvOwkvKiBEV09SRCAwICovCisJCQl1MzIgaGk7CS8qIERXT1JEIDEgKi8KKwkJfSBfX3BhY2tlZDsJLyogdW5uYW1lZCBzdHJ1Y3QgKi8KKwkJdTMyIGR3WzJdOwkvKiBkd29yZCB1bmlvbiAqLworCX07CQkJLyogdW5uYW1lZCB1bmlvbiAqLworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBCRV9MSU5LX1NUQVRVUyB7CisJdTggbWFjMF9kdXBsZXg7CisJdTggbWFjMF9zcGVlZDsKKwl1OCBtYWMxX2R1cGxleDsKKwl1OCBtYWMxX3NwZWVkOworCXU4IG1nbXRfbWFjX2R1cGxleDsKKwl1OCBtZ210X21hY19zcGVlZDsKKwl1OCBhY3RpdmVfcG9ydDsKKwl1OCByc3ZkMDsKKwl1OCBtYWMwX2ZhdWx0OworCXU4IG1hYzFfZmF1bHQ7CisJdTE2IHJzdmQxOworfSBfX3BhY2tlZDsKKyNlbmRpZgorCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcwX1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIExJTktfU1RBVFVTX1FVRVJZX1BBUkFNUyB7CisJc3RydWN0IEJFX0xJTktfU1RBVFVTIHJlc3BvbnNlOworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzBfUkVRVUVTVCByZXF1ZXN0OworfSBfX3BhY2tlZDsKKworLyoKKyAqICBRdWVyaWVzIHRoZSB0aGUgbGluayBzdGF0dXMgZm9yIGFsbCBwb3J0cy4gIFRoZSB2YWxpZCB2YWx1ZXMgYmVsb3cKKyAqICBETyBOT1QgaW5kaWNhdGUgdGhhdCAgYSBwYXJ0aWN1bGFyIGR1cGxleCBvciBzcGVlZCBpcyBzdXBwb3J0ZWQgYnkKKyAqICBCbGFkZUVuZ2luZS4gVGhlc2UgZW51bWVyYXRpb25zIHNpbXBseSAgbGlzdCBhbGwgcG9zc2libGUgZHVwbGV4ZXMKKyAqICBhbmQgc3BlZWRzIGZvciBhbnkgcG9ydC4gQ29uc3VsdCBCbGFkZUVuZ2luZSBwcm9kdWN0ICBkb2N1bWVudGF0aW9uCisgKiAgZm9yIHRoZSBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIExJTktfU1RBVFVTX1FVRVJZX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcxX1JFUVVFU1QgeworCXU4IHR5cGU7CisJdTggcG9ydDsKKwl1OCBtYWMxOworCXU4IHBlcm1hbmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzJfUkVTUE9OU0UgeworCXN0cnVjdCBNQUNfQUREUkVTU19GT1JNQVQgbWFjOworfSBfX3BhY2tlZDsKKwordW5pb24gTlRXS19NQUNfUVVFUllfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcxX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTcyX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogUXVlcmllcyBvbmUgTUFDIGFkZHJlc3MuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19RVUVSWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBOVFdLX01BQ19RVUVSWV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IE1BQ19TRVRfUEFSQU1TX0lOIHsKKwl1OCB0eXBlOworCXU4IHBvcnQ7CisJdTggbWFjMTsKKwl1OCBpbnZhbGlkYXRlOworCXN0cnVjdCBNQUNfQUREUkVTU19GT1JNQVQgbWFjOworfSBfX3BhY2tlZDsKKworc3RydWN0IE1BQ19TRVRfUEFSQU1TX09VVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gTUFDX1NFVF9QQVJBTVMgeworCXN0cnVjdCBNQUNfU0VUX1BBUkFNU19JTiByZXF1ZXN0OworCXN0cnVjdCBNQUNfU0VUX1BBUkFNU19PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBTZXRzIGEgTUFDIGFkZHJlc3MuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19TRVQgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTUFDX1NFVF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworLyogTUFDIGFkZHJlc3MgbGlzdC4gKi8KK3N0cnVjdCBOVFdLX01VTFRJQ0FTVF9NQUNfTElTVCB7CisJdTggYnl0ZVs2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUX1JFUVVFU1RfUEFZTE9BRCB7CisJdTE2IG51bV9tYWM7CisJdTggcHJvbWlzY3VvdXM7CisJdTggcnN2ZDA7CisJc3RydWN0IE5UV0tfTVVMVElDQVNUX01BQ19MSVNUIG1hY1szMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc0X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVF9SRVFVRVNUX1BBWUxPQUQgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc0X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBTZXRzIG11bHRpY2FzdCBhZGRyZXNzIGhhc2guIFRoZSBNUFUgd2lsbCBtZXJnZSB0aGUgTUFDIGFkZHJlc3MgbGlzdHMKKyAqICBmcm9tIGFsbCBjbGllbnRzLCAgaW5jbHVkaW5nIHRoZSBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIGZ1bmN0aW9ucy4KKyAqICBUaGlzIGNvbW1hbmQgbWF5IGZhaWwgaWYgdGhlIGZpbmFsIG1lcmdlZCAgbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGV4Y2VlZHMKKyAqICAzMiBlbnRyaWVzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJR19SRVFVRVNUX1BBWUxPQUQgeworCXUxNiBudW1fdmxhbjsKKwl1OCBwcm9taXNjdW91czsKKwl1OCByc3ZkMDsKKwl1MTYgdmxhbl90YWdbMzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3Nl9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTc1X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHX1JFUVVFU1RfUEFZTE9BRCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzZfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFNldHMgVkxBTiB0YWcgZmlsdGVyLiBUaGUgTVBVIHdpbGwgbWVyZ2UgdGhlIFZMQU4gdGFnIGxpc3QgZnJvbSBhbGwKKyAqICBjbGllbnRzLCBpbmNsdWRpbmcgIHRoZSBuZXR3b3JraW5nIGFuZCBzdG9yYWdlIGZ1bmN0aW9ucy4gVGhpcyBjb21tYW5kCisgKiAgbWF5IGZhaWwgaWYgdGhlIGZpbmFsIHZsYW5fdGFnIGFycmF5ICAoZnJvbSBhbGwgZnVuY3Rpb25zKSBpcyBsb25nZXIKKyAqICB0aGFuIDMyIGVudHJpZXMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJRyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzVfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBSSU5HX0RFU1RST1lfUkVRVUVTVCB7CisJdTE2IHJpbmdfdHlwZTsKKwl1MTYgaWQ7CisJdTggYnlwYXNzX2ZsdXNoOworCXU4IHJzdmQwOworCXUxNiByc3ZkMTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTBfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE4OV9QQVJBTVMgeworCXN0cnVjdCBSSU5HX0RFU1RST1lfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTBfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworLyoKKyAqICBDb21tYW5kIGZvciBkZXN0cm95aW5nIGFueSByaW5nLiBUaGUgY29ubmVjdGlvbihzKSB1c2luZyB0aGUgcmluZyBzaG91bGQKKyAqICBiZSBxdWllc2NlZCAgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIHJpbmcuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fUklOR19ERVNUUk9ZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE4OV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5Ml9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgQ1FfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s0XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkzX1JFU1BPTlNFIHsKKwl1MTYgY3FfaWQ7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTkxX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5Ml9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5M19SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGEgY29tcGxldGlvbiBxdWV1ZS4gQSBDb21wbGV0aW9uIFF1ZXVlIG11c3Qgc3BhbgorICogIGF0IGxlYXN0IDEgcGFnZSBhbmQgIGF0IG1vc3QgNCBwYWdlcy4gRWFjaCBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5CisgKiAgaXMgMTYgYnl0ZXMgcmVnYXJkbGVzcyBvZiBDUSBlbnRyeSBmb3JtYXQuICBUaHVzIHRoZSByaW5nIG11c3QgYmUKKyAqICBhdCBsZWFzdCAyNTYgZW50cmllcyBkZWVwIChjb3JyZXNwb25kaW5nIHRvIDEgcGFnZSkgYW5kIGNhbiBiZSBhdAorICogICBtb3N0IDEwMjQgZW50cmllcyBkZWVwIChjb3JyZXNwb25kaW5nIHRvIDQgcGFnZXMpLiBUaGUgbnVtYmVyIG9mCisgKiAgcGFnZXMgcG9zdGVkIG11c3QgIGNvbnRhaW4gdGhlIENRIHJpbmcgc2l6ZSBhcyBlbmNvZGVkIGluIHRoZSBjb250ZXh0LgorICoKKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9DUV9DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTkxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OF9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgRVFfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s4XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTk5X1JFU1BPTlNFIHsKKwl1MTYgZXFfaWQ7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTk3X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5OV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGEgZXZlbnQgcXVldWUuIEFuIEV2ZW50IFF1ZXVlIG11c3Qgc3BhbiBhdCBsZWFzdAorICogIDEgcGFnZSBhbmQgYXQgbW9zdCAgOCBwYWdlcy4gVGhlIG51bWJlciBvZiBwYWdlcyBwb3N0ZWQgbXVzdCBjb250YWluCisgKiAgdGhlIEVRIHJpbmcuIFRoZSByaW5nIGlzIGRlZmluZWQgYnkgIHRoZSBzaXplIG9mIHRoZSBFUSBlbnRyaWVzIChlbmNvZGVkCisgKiAgaW4gdGhlIGNvbnRleHQpIGFuZCB0aGUgbnVtYmVyIG9mIEVRIGVudHJpZXMgKGFsc28gIGVuY29kZWQgaW4gdGhlCisgKiAgY29udGV4dCkuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRVFfQ1JFQVRFIHsKKwl1bmlvbiAgRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xOTdfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjAxX1JFUVVFU1QgeworCXUxNiBjcV9pZDsKKwl1MTYgYmNtY19jcV9pZDsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMl9SRVNQT05TRSB7CisJdTE2IGlkOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAwX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwMl9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgRXRoZXJuZXQgcmVjZWl2ZSByaW5nLiAgQW4gRVJYIHJpbmcgY29udGFpbnMgRVRIX1JYX0QKKyAqICBlbnRyaWVzICg4ICBieXRlcyBlYWNoKS4gQW4gRVJYIHJpbmcgbXVzdCBiZSAxMDI0IGVudHJpZXMgZGVlcAorICogIChjb3JyZXNwb25kaW5nIHRvIDIgcGFnZXMpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9SWF9DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAwX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA0X1JFUVVFU1QgeworCXUxNiBudW1fcGFnZXM7CisJdTggdWxwX251bTsKKwl1OCB0eXBlOworCXN0cnVjdCBFVFhfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s4XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA1X1JFU1BPTlNFIHsKKwl1MTYgY2lkOworCXU4IHVscF9udW07CisJdTggcnN2ZDA7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAzX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIwNV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIGFuIEV0aGVybmV0IHRyYW5zbWl0IHJpbmcuICBBbiBFVFggcmluZyBjb250YWlucworICogIEVUSF9XUkIgZW50cmllcyAoMTYgIGJ5dGVzIGVhY2gpLiBBbiBFVFggcmluZyBtdXN0IGJlIGF0IGxlYXN0IDI1NgorICogIGVudHJpZXMgZGVlcCAoY29ycmVzcG9uZGluZyB0byAxIHBhZ2UpICBhbmQgYXQgbW9zdCAyayBlbnRyaWVzIGRlZXAKKyAqICAoY29ycmVzcG9uZGluZyB0byA4IHBhZ2VzKS4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9FVEhfVFhfQ1JFQVRFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIwM19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjJfUkVRVUVTVCB7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcnN2ZDA7CisJc3RydWN0IE1DQ19SSU5HX0NPTlRFWFRfQU1BUCBjb250ZXh0OworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbOF07Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIyM19SRVNQT05TRSB7CisJdTE2IGlkOworfSBfX3BhY2tlZCA7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIyMV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjJfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMjNfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkIDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyB0aGUgTUNDIHJpbmcuIEFuIE1DQyByaW5nIG11c3QgYmUgYXQgbGVhc3QgMTYKKyAqICBlbnRyaWVzIGRlZXAgIChjb3JyZXNwb25kaW5nIHRvIDEgcGFnZSkgYW5kIGF0IG1vc3QgMTI4IGVudHJpZXMgZGVlcAorICogIChjb3JyZXNwb25kaW5nIHRvIDggcGFnZXMpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX01DQ19DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjIxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEdFVF9RT1NfSU4geworCXUzMiBxb3NfcGFyYW1zX3JzdmQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgR0VUX1FPU19PVVQgeworCXUzMiBtYXhfYml0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUM7CisJdTMyIG1heF9pb3NfcGVyX3NlY29uZF9pU0NTSTsKKwl1MzIgbWF4X2J5dGVzX3Blcl9zZWNvbmRfaVNDU0k7CisJdTE2IGRvbWFpbl9WTEFOX3RhZzsKKwl1MTYgZmFicmljX2RvbWFpbl9JRDsKKwl1MzIgcW9zX3BhcmFtc19vZW1bNF07Cit9IF9fcGFja2VkOworCit1bmlvbiBHRVRfUU9TX1BBUkFNUyB7CisJc3RydWN0IEdFVF9RT1NfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgR0VUX1FPU19PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBRT1MvQmFuZHdpZHRoIHNldHRpbmdzIHBlciBkb21haW4uIEFwcGxpY2FibGUgb25seSBpbiBWTXMuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUU9TIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEdFVF9RT1NfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfUU9TX0lOIHsKKwl1MzIgdmFsaWRfZmxhZ3M7CisJdTMyIG1heF9iaXRzX3Blcl9zZWNvbmRfTklDOworCXUzMiBtYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X2lvc19wZXJfc2Vjb25kX2lTQ1NJOworCXUzMiBtYXhfYnl0ZXNfcGVyX3NlY29uZF9pU0NTSTsKKwl1MTYgZG9tYWluX1ZMQU5fdGFnOworCXUxNiBmYWJyaWNfZG9tYWluX0lEOworCXUzMiBxb3NfcGFyYW1zX29lbVs0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBTRVRfUU9TX09VVCB7CisJdTMyIHFvc19wYXJhbXNfcnN2ZDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIFNFVF9RT1NfUEFSQU1TIHsKKwlzdHJ1Y3QgU0VUX1FPU19JTiByZXF1ZXN0OworCXN0cnVjdCBTRVRfUU9TX09VVCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFFPUy9CYW5kd2lkdGggc2V0dGluZ3MgcGVyIGRvbWFpbi4gQXBwbGljYWJsZSBvbmx5IGluIFZNcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9RT1MgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gU0VUX1FPU19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9GUkFNRV9TSVpFX0lOIHsKKwl1MzIgbWF4X3R4X2ZyYW1lX3NpemU7CisJdTMyIG1heF9yeF9mcmFtZV9zaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9GUkFNRV9TSVpFX09VVCB7CisJdTMyIGNoaXBfbWF4X3R4X2ZyYW1lX3NpemU7CisJdTMyIGNoaXBfbWF4X3J4X2ZyYW1lX3NpemU7Cit9IF9fcGFja2VkOworCit1bmlvbiBTRVRfRlJBTUVfU0laRV9QQVJBTVMgeworCXN0cnVjdCBTRVRfRlJBTUVfU0laRV9JTiByZXF1ZXN0OworCXN0cnVjdCBTRVRfRlJBTUVfU0laRV9PVVQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBTZXQgZnJhbWUgc2l6ZSBjb21tYW5kLiBPbmx5IGhvc3QgZG9tYWluIG1heSBpc3N1ZSB0aGlzIGNvbW1hbmQuICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRlJBTUVfU0laRSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBTRVRfRlJBTUVfU0laRV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZPUkNFX0ZBSUxPVkVSX0lOIHsKKwl1MzIgbW92ZV90b19wb3J0OworCXUzMiBmYWlsb3Zlcl9jb25maWc7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjMxX1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzBfUEFSQU1TIHsKKwlzdHJ1Y3QgRk9SQ0VfRkFJTE9WRVJfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjMxX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBVc2UgdGhpcyBjb21tYW5kIHRvIGNvbnRyb2wgZmFpbG92ZXIgaW4gQmxhZGVFbmdpbmUuIEl0IG1heSBiZSB1c2VkCisgKiAgdG8gZmFpbGJhY2sgdG8gYSAgcmVzdG9yZWQgcG9ydCBvciB0byBmb3JjaWJseSBtb3ZlIHRyYWZmaWMgZnJvbQorICogIG9uZSBwb3J0IHRvIGFub3RoZXIuIEl0IG1heSBhbHNvIGJlIHVzZWQgIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZQorICogIGF1dG9tYXRpYyBmYWlsb3ZlciBmZWF0dXJlLiBUaGlzIGNvbW1hbmQgY2FuIG9ubHkgYmUgaXNzdWVkIGJ5ICBkb21haW4KKyAqICAwLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIzMF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MF9SRVFVRVNUIHsKKwl1NjQgY29udGV4dDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDFfUkVTUE9OU0UgeworCXU2NCBjb250ZXh0OworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjM5X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgYXMgYSBuby1vcGVyYXRpb24gcmVxdWVzdC4gVHlwaWNhbAorICogIHVzZXMgZm9yIGRyaXZlcnMgIGFyZSBhcyBhIGhlYXJ0YmVhdCBtZWNoYW5pc20sIG9yIGRlZmVycmVkIHByb2Nlc3NpbmcKKyAqICBjYXRhbHlzdC4gVGhlIEFSTSB3aWxsIGFsd2F5cyAgY29tcGxldGUgdGhpcyBjb21tYW5kIHdpdGggYSBnb29kIGNvbXBsZXRpb24uCisgKiAgVGhlIDY0LWJpdCBwYXJhbWV0ZXIgaXMgbm90IHRvdWNoZWQgYnkgdGhlICBBUk0gcHJvY2Vzc29yLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05PUCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyB7CisJdTggcHJvbWlzY3VvdXM7CisJdTggaXBfY2tzdW07CisJdTggdGNwX2Nrc3VtOworCXU4IHVkcF9ja3N1bTsKKwl1OCBwYXNzX2VycjsKKwl1OCBwYXNzX2NrZXJyOworCXU4IHN0cmlwX2NyYzsKKwl1OCBtY2FzdF9lbjsKKwl1OCBiY2FzdF9lbjsKKwl1OCBtY2FzdF9wcm9taXNjdW91c19lbjsKKwl1OCB1bmljYXN0X2VuOworCXU4IHZsYW5fcHJvbWlzY3VvdXM7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDJfUEFSQU1TIHsKKwlzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgcmVxdWVzdDsKKwlzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgZXRoZXJuZXQgcmVjZWl2ZSBmaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAqICBPbmx5IGRvbWFpbiAwICBuZXR3b3JrIGZ1bmN0aW9uIGRyaXZlcnMgbWF5IGlzc3VlIHRoaXMgY29tbWFuZC4gVGhlCisgKiAgYXBwbGllZCBjb25maWd1cmF0aW9uIGlzIHJldHVybmVkIGluICB0aGUgcmVzcG9uc2UgcGF5bG9hZC4gTm90ZToKKyAqICBTb21lIHJlY2VpdmUgcGFja2V0IGZpbHRlciBzZXR0aW5ncyBhcmUgZ2xvYmFsIG9uICBCbGFkZUVuZ2luZSBhbmQKKyAqICBjYW4gYWZmZWN0IGJvdGggdGhlIHN0b3JhZ2UgYW5kIG5ldHdvcmsgZnVuY3Rpb24gY2xpZW50cyB0aGF0IHRoZQorICogICBCbGFkZUVuZ2luZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgc2VydmUuIEFkZGl0aW9uYWx5LCBkZXBlbmRpbmcKKyAqICBvbiB0aGUgcmV2aXNpb24gb2YgIEJsYWRlRW5naW5lLCBzb21lIGV0aGVybmV0IHJlY2VpdmUgZmlsdGVyIHNldHRpbmdzCisgKiAgYXJlIGRlcGVuZGVudCBvbiBvdGhlcnMuIElmIGEgIGRlcGVuZGVuY3kgZXhpc3RzIGJldHdlZW4gc2V0dGluZ3MKKyAqICBmb3IgdGhlIEJsYWRlRW5naW5lIHJldmlzaW9uLCBhbmQgdGhlIGNvbW1hbmQgcmVxdWVzdCAgc2V0dGluZ3MgZG8KKyAqICBub3QgbWVldCB0aGUgZGVwZW5kZW5jeSByZXF1aXJlbWVudCwgdGhlIGludmFsaWQgc2V0dGluZ3Mgd2lsbCBub3QKKyAqICBiZSAgYXBwbGllZCBkZXNwaXRlIHRoZSBjb21hbmQgc3VjY2VlZGluZy4gRm9yIGV4YW1wbGU6IGEgZHJpdmVyIG1heQorICogIHJlcXVlc3QgdG8gZW5hYmxlICBicm9hZGNhc3QgcGFja2V0cywgYnV0IG5vdCBlbmFibGUgbXVsdGljYXN0IHBhY2tldHMuCisgKiAgT24gZWFybHkgcmV2aXNpb25zIG9mIEJsYWRlRW5naW5lLCAgdGhlcmUgbWF5IGJlIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4KKyAqICBicm9hZGNhc3QgYW5kIG11bHRpY2FzdCBmaWx0ZXJzLCBzbyBicm9hZGNhc3QgY291bGQgIG5vdCBiZSBlbmFibGVkCisgKiAgd2l0aG91dCBlbmFibGluZyBtdWx0aWNhc3QuIEluIHRoaXMgc2NlbmFyaW8sIHRoZSBjb21hbmQgd291bGQgc3RpbGwKKyAqICAgc3VjY2VlZCwgYnV0IHRoZSByZXNwb25zZSBwYXlsb2FkIHdvdWxkIGluZGljYXRlIHRoZSBwcmV2aW91c2x5CisgKiAgY29uZmlndXJlZCBicm9hZGNhc3QgIGFuZCBtdWx0aWNhc3Qgc2V0dGluZy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDJfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0NF9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgeworCXU4IGZpcm13YXJlX3ZlcnNpb25fc3RyaW5nWzMyXTsKKwl1OCBmd19vbl9mbGFzaF92ZXJzaW9uX3N0cmluZ1szMl07Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ0X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbWFuZCByZXRyaWV2ZXMgdGhlIGZpcm13YXJlIHZlcnNpb24uICAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDZfUkVRVUVTVCB7CisJdTE2IHR4X2Zsb3dfY29udHJvbDsKKwl1MTYgcnhfZmxvd19jb250cm9sOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0N19SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ1X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0Nl9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0N19SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgaXMgdXNlZCB0byBwcm9ncmFtIEJsYWRlRW5naW5lIGZsb3cgY29udHJvbCBiZWhhdmlvci4KKyAqICBPbmx5IHRoZSBob3N0ICBuZXR3b3JraW5nIGRyaXZlciBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGNvbWFuZC4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0NV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0OV9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjUwX1JFU1BPTlNFIHsKKwl1MTYgdHhfZmxvd19jb250cm9sOworCXUxNiByeF9mbG93X2NvbnRyb2w7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDhfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ5X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjUwX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBjb21hbmQgaXMgdXNlZCB0byByZWFkIEJsYWRlRW5naW5lIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ4X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRVFfREVMQVlfUEFSQU1TIHsKKwl1MzIgZXFfaWQ7CisJdTMyIGRlbGF5X2luX21pY3Jvc2Vjb25kczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNTdfUkVRVUVTVCB7CisJdTMyIG51bV9lcTsKKwl1MzIgcnN2ZDA7CisJc3RydWN0IEVRX0RFTEFZX1BBUkFNUyBkZWxheVsxNl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU4X1JFU1BPTlNFIHsKKwl1MzIgZGVsYXlfcmVzb2x1dGlvbl9pbl9taWNyb3NlY29uZHM7CisJdTMyIGRlbGF5X21heF9pbl9taWNyb3NlY29uZHM7Cit9IF9fcGFja2VkOworCit1bmlvbiBNT0RJRllfRVFfREVMQVlfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU3X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjU4X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogVGhpcyBjb21hbmQgY2hhbmdlcyB0aGUgRVEgZGVsYXkgZm9yIGEgZ2l2ZW4gc2V0IG9mIEVRcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX01PRElGWV9FUV9ERUxBWSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBNT0RJRllfRVFfREVMQVlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjBfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyB7CisJdTE2IGJlX2NvbmZpZ19udW1iZXI7CisJdTE2IGFzaWNfcmV2aXNpb247CisJdTMyIG5pY191bHBfbWFzazsKKwl1MzIgdHVscF9tYXNrOworCXUzMiBpc2NzaV91bHBfbWFzazsKKwl1MzIgcmRtYV91bHBfbWFzazsKKwl1MzIgcnN2ZDBbNF07CisJdTMyIGV0aF90eF9pZF9zdGFydDsKKwl1MzIgZXRoX3R4X2lkX2NvdW50OworCXUzMiBldGhfcnhfaWRfc3RhcnQ7CisJdTMyIGV0aF9yeF9pZF9jb3VudDsKKwl1MzIgdHBtX3dyYnFfaWRfc3RhcnQ7CisJdTMyIHRwbV93cmJxX2lkX2NvdW50OworCXUzMiB0cG1fZGVmcV9pZF9zdGFydDsKKwl1MzIgdHBtX2RlZnFfaWRfY291bnQ7CisJdTMyIGlzY3NpX3dyYnFfaWRfc3RhcnQ7CisJdTMyIGlzY3NpX3dyYnFfaWRfY291bnQ7CisJdTMyIGlzY3NpX2RlZnFfaWRfc3RhcnQ7CisJdTMyIGlzY3NpX2RlZnFfaWRfY291bnQ7CisJdTMyIHJkbWFfcXBfaWRfc3RhcnQ7CisJdTMyIHJkbWFfcXBfaWRfY291bnQ7CisJdTMyIHJzdmQxWzhdOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjU5X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2MF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgcXVlcmllcyB0aGUgY3VycmVudCBmaXJtd2FyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgIFRoZSBzdGF0aWMgIGNvbmZpZ3VyYXRpb24gdHlwZSBpcyBkZWZpbmVkIGJ5IGJlX2NvbmZpZ19udW1iZXIuIFRoaXMKKyAqICBkaWZmZXJlbnRpYXRlcyBkaWZmZXJlbnQgIEJsYWRlRW5naW5lIGJ1aWxkcywgc3VjaCBhcyBpU0NTSSBJbml0aWF0b3IKKyAqICB2ZXJzdXMgaVNDU0kgVGFyZ2V0LiAgRm9yIGEgZ2l2ZW4gc3RhdGljICBjb25maWd1cmF0aW9uLCB0aGUgVXBwZXIKKyAqICBMYXllciBQcm90b2NvbCAoVUxQKSBwcm9jZXNzb3JzIG1heSBiZSByZWNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAgZGlmZmVyZW50CisgKiAgcHJvdG9jb2xzLiBFYWNoIFVMUCBwcm9jZXNzb3Igc3VwcG9ydHMgb25lIG9yIG1vcmUgcHJvdG9jb2xzLiBUaGUKKyAqICBtYXNrcyAgaW5kaWNhdGUgd2hpY2ggcHJvY2Vzc29ycyBhcmUgY29uZmlndXJlZCBmb3IgZWFjaCBwcm90b2NvbC4KKyAqICAgRm9yIGEgZ2l2ZW4gc3RhdGljICBjb25maWd1cmF0aW9uLCB0aGUgbnVtYmVyIG9mIFRDUCBjb25uZWN0aW9ucworICogIHN1cHBvcnRlZCBmb3IgZWFjaCBwcm90b2NvbCBtYXkgdmFyeS4gVGhlICAqX2lkX3N0YXJ0IGFuZCAqX2lkX2NvdW50CisgKiAgdmFyaWFibGVzIGRlZmluZSBhIGxpbmVhciByYW5nZSBvZiBJRHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciAgZWFjaAorICogIHN1cHBvcnRlZCBwcm90b2NvbC4gVGhlICpfaWRfY291bnQgbWF5IGJlIHVzZWQgYnkgdGhlIGRyaXZlciB0byBhbGxvY2F0ZQorICogIHRoZSAgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmVzb3VyY2VzLiBUaGUgKl9pZF9zdGFydCBtYXkKKyAqICBiZSB1c2VkIHRvIG1hcCB0aGUgIGFyYml0cmFyeSByYW5nZSBvZiBJRHMgdG8gYSB6ZXJvLWJhc2VkIHJhbmdlCisgKiAgb2YgaW5kaWNlcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjU5X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX1BPUlRfRVFVQUxJWkFUSU9OX1BBUkFNUyB7CisJdTMyIGVtcGhfbGV2X3NlbF9wb3J0MDsKKwl1MzIgZW1waF9sZXZfc2VsX3BvcnQxOworCXU4IHhhdWlfdm9fc2VsOworCXU4IHhhdWlfc3RhdGU7CisJdTE2IHJzdmQwOworCXUzMiB4YXVpX2VxX3ZlY3RvcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjJfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYxX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2Ml9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9QT1JUX0VRVUFMSVpBVElPTl9QQVJBTVMgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIGNhbiBiZSB1c2VkIHRvIHJlYWQgWEFVSSBlcXVhbGl6YXRpb24gcGFyYW1ldGVycy4gVGhlCisgKiAgQVJNIGZpcm13YXJlIGFwcGxpZXMgIGRlZmF1bHQgZXF1YWxpemF0aW9uIHBhcmFtZXRlcnMgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICogIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlICBjdXN0b21lci1zcGVjaWZpYyB3aGVuIGRlcml2ZWQgZnJvbSB0aGUKKyAqICBTRUVQUk9NLiBTZWUgU0VFUFJPTV9EQVRBIGZvciBlcXVhbGl6YXRpb24gIHNwZWNpZmljIGZpZWxkcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfUE9SVF9FUVVBTElaQVRJT04geworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjYxX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjY0X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1BPUlRfRVFVQUxJWkFUSU9OX1BBUkFNUyByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjRfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFRoaXMgY29tYW5kIGNhbiBiZSB1c2VkIHRvIHNldCBYQVVJIGVxdWFsaXphdGlvbiBwYXJhbWV0ZXJzLiBUaGUgQVJNCisgKiAgZmlybXdhcmUgYXBwbGllcyAgZGVmYXVsdCBlcXVhbGl6YXRpb24gcGFyYW1ldGVycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKiAgVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgIGN1c3RvbWVyLXNwZWNpZmljIHdoZW4gZGVyaXZlZCBmcm9tIHRoZQorICogIFNFRVBST00uIFNlZSBTRUVQUk9NX0RBVEEgZm9yIGVxdWFsaXphdGlvbiAgc3BlY2lmaWMgZmllbGRzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9QT1JUX0VRVUFMSVpBVElPTiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjNfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2Z3Y21kX2NvbW1vbl9ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2V0aF9ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfZXRoX2JtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRiMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2V0aF9ibWFwLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9ldGhfYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9ldGhfYm1hcF9oX18KKyNpbmNsdWRlICJmd2NtZF9oZHJfYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX3R5cGVzX2JtYXAuaCIKKworc3RydWN0IE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVNfSU4geworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBCRV9SWEZfU1RBVFMgeworCXUzMiBwMHJlY3ZkdG90YWxieXRlc0xTRDsJLyogRFdPUkQgMCAqLworCXUzMiBwMHJlY3ZkdG90YWxieXRlc01TRDsJLyogRFdPUkQgMSAqLworCXUzMiBwMHJlY3ZkdG90YWxmcmFtZXM7CS8qIERXT1JEIDIgKi8KKwl1MzIgcDByZWN2ZHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDMgKi8KKwl1MzIgcDByZWN2ZG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgNCAqLworCXUzMiBwMHJlY3ZkYnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCA1ICovCisJdTMyIHAwY3JjZXJyb3JzOwkvKiBEV09SRCA2ICovCisJdTMyIHAwYWxpZ25tZW50c3ltZXJyczsJLyogRFdPUkQgNyAqLworCXUzMiBwMHBhdXNlZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDggKi8KKwl1MzIgcDBjb250cm9sZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDkgKi8KKwl1MzIgcDBpbnJhbmdlbGVuZXJyb3JzOwkvKiBEV09SRCAxMCAqLworCXUzMiBwMG91dHJhbmdlZXJyb3JzOwkvKiBEV09SRCAxMSAqLworCXUzMiBwMGZyYW1ldG9vbG9uZ2Vycm9yczsJLyogRFdPUkQgMTIgKi8KKwl1MzIgcDBkcm9wcGVkYWRkcmVzc21hdGNoOwkvKiBEV09SRCAxMyAqLworCXUzMiBwMGRyb3BwZWR2bGFubWlzbWF0Y2g7CS8qIERXT1JEIDE0ICovCisJdTMyIHAwaXBkcm9wcGVkdG9vc21hbGw7CS8qIERXT1JEIDE1ICovCisJdTMyIHAwaXBkcm9wcGVkdG9vc2hvcnQ7CS8qIERXT1JEIDE2ICovCisJdTMyIHAwaXBkcm9wcGVkaGRydG9vc21hbGw7CS8qIERXT1JEIDE3ICovCisJdTMyIHAwdGNwZHJvcHBlZGxlbjsJLyogRFdPUkQgMTggKi8KKwl1MzIgcDBkcm9wcGVkcnVudDsJLyogRFdPUkQgMTkgKi8KKwl1MzIgcDByZWN2ZDY0OwkJLyogRFdPUkQgMjAgKi8KKwl1MzIgcDByZWN2ZDY1XzEyNzsJLyogRFdPUkQgMjEgKi8KKwl1MzIgcDByZWN2ZDEyOF8yNTY7CS8qIERXT1JEIDIyICovCisJdTMyIHAwcmVjdmQyNTZfNTExOwkvKiBEV09SRCAyMyAqLworCXUzMiBwMHJlY3ZkNTEyXzEwMjM7CS8qIERXT1JEIDI0ICovCisJdTMyIHAwcmVjdmQxNTE4XzE1MjI7CS8qIERXT1JEIDI1ICovCisJdTMyIHAwcmVjdmQxNTIyXzIwNDc7CS8qIERXT1JEIDI2ICovCisJdTMyIHAwcmVjdmQyMDQ4XzQwOTU7CS8qIERXT1JEIDI3ICovCisJdTMyIHAwcmVjdmQ0MDk2XzgxOTE7CS8qIERXT1JEIDI4ICovCisJdTMyIHAwcmVjdmQ4MTkyXzkyMTY7CS8qIERXT1JEIDI5ICovCisJdTMyIHAwcmN2ZGlwY2tzbWVycnM7CS8qIERXT1JEIDMwICovCisJdTMyIHAwcmVjdmR0Y3Bja3NtZXJyczsJLyogRFdPUkQgMzEgKi8KKwl1MzIgcDByZWN2ZHVkcGNrc21lcnJzOwkvKiBEV09SRCAzMiAqLworCXUzMiBwMHJlY3Zkbm9ucnNzcGFja2V0czsJLyogRFdPUkQgMzMgKi8KKwl1MzIgcDByZWN2ZGlwcGFja2V0czsJLyogRFdPUkQgMzQgKi8KKwl1MzIgcDByZWN2ZGNodXRlMXBhY2tldHM7CS8qIERXT1JEIDM1ICovCisJdTMyIHAwcmVjdmRjaHV0ZTJwYWNrZXRzOwkvKiBEV09SRCAzNiAqLworCXUzMiBwMHJlY3ZkY2h1dGUzcGFja2V0czsJLyogRFdPUkQgMzcgKi8KKwl1MzIgcDByZWN2ZGlwc2VjcGFja2V0czsJLyogRFdPUkQgMzggKi8KKwl1MzIgcDByZWN2ZG1hbmFnZW1lbnRwYWNrZXRzOwkvKiBEV09SRCAzOSAqLworCXUzMiBwMHhtaXRieXRlc2xzZDsJLyogRFdPUkQgNDAgKi8KKwl1MzIgcDB4bWl0Ynl0ZXNtc2Q7CS8qIERXT1JEIDQxICovCisJdTMyIHAweG1pdHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDQyICovCisJdTMyIHAweG1pdG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgNDMgKi8KKwl1MzIgcDB4bWl0YnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCA0NCAqLworCXUzMiBwMHhtaXRwYXVzZWZyYW1lczsJLyogRFdPUkQgNDUgKi8KKwl1MzIgcDB4bWl0Y29udHJvbGZyYW1lczsJLyogRFdPUkQgNDYgKi8KKwl1MzIgcDB4bWl0NjQ7CQkvKiBEV09SRCA0NyAqLworCXUzMiBwMHhtaXQ2NV8xMjc7CS8qIERXT1JEIDQ4ICovCisJdTMyIHAweG1pdDEyOF8yNTY7CS8qIERXT1JEIDQ5ICovCisJdTMyIHAweG1pdDI1Nl81MTE7CS8qIERXT1JEIDUwICovCisJdTMyIHAweG1pdDUxMl8xMDIzOwkvKiBEV09SRCA1MSAqLworCXUzMiBwMHhtaXQxNTE4XzE1MjI7CS8qIERXT1JEIDUyICovCisJdTMyIHAweG1pdDE1MjJfMjA0NzsJLyogRFdPUkQgNTMgKi8KKwl1MzIgcDB4bWl0MjA0OF80MDk1OwkvKiBEV09SRCA1NCAqLworCXUzMiBwMHhtaXQ0MDk2XzgxOTE7CS8qIERXT1JEIDU1ICovCisJdTMyIHAweG1pdDgxOTJfOTIxNjsJLyogRFdPUkQgNTYgKi8KKwl1MzIgcDByeGZpZm9vdmVyZmxvd2Ryb3BwZWQ7CS8qIERXT1JEIDU3ICovCisJdTMyIHAwaXBzZWNsb29rdXBmYWlsZWRkcm9wcGVkOwkvKiBEV09SRCA1OCAqLworCXUzMiBwMXJlY3ZkdG90YWxieXRlc0xTRDsJLyogRFdPUkQgNTkgKi8KKwl1MzIgcDFyZWN2ZHRvdGFsYnl0ZXNNU0Q7CS8qIERXT1JEIDYwICovCisJdTMyIHAxcmVjdmR0b3RhbGZyYW1lczsJLyogRFdPUkQgNjEgKi8KKwl1MzIgcDFyZWN2ZHVuaWNhc3RmcmFtZXM7CS8qIERXT1JEIDYyICovCisJdTMyIHAxcmVjdmRtdWx0aWNhc3RmcmFtZXM7CS8qIERXT1JEIDYzICovCisJdTMyIHAxcmVjdmRicm9hZGNhc3RmcmFtZXM7CS8qIERXT1JEIDY0ICovCisJdTMyIHAxY3JjZXJyb3JzOwkvKiBEV09SRCA2NSAqLworCXUzMiBwMWFsaWdubWVudHN5bWVycnM7CS8qIERXT1JEIDY2ICovCisJdTMyIHAxcGF1c2VmcmFtZXNyZWN2ZDsJLyogRFdPUkQgNjcgKi8KKwl1MzIgcDFjb250cm9sZnJhbWVzcmVjdmQ7CS8qIERXT1JEIDY4ICovCisJdTMyIHAxaW5yYW5nZWxlbmVycm9yczsJLyogRFdPUkQgNjkgKi8KKwl1MzIgcDFvdXRyYW5nZWVycm9yczsJLyogRFdPUkQgNzAgKi8KKwl1MzIgcDFmcmFtZXRvb2xvbmdlcnJvcnM7CS8qIERXT1JEIDcxICovCisJdTMyIHAxZHJvcHBlZGFkZHJlc3NtYXRjaDsJLyogRFdPUkQgNzIgKi8KKwl1MzIgcDFkcm9wcGVkdmxhbm1pc21hdGNoOwkvKiBEV09SRCA3MyAqLworCXUzMiBwMWlwZHJvcHBlZHRvb3NtYWxsOwkvKiBEV09SRCA3NCAqLworCXUzMiBwMWlwZHJvcHBlZHRvb3Nob3J0OwkvKiBEV09SRCA3NSAqLworCXUzMiBwMWlwZHJvcHBlZGhkcnRvb3NtYWxsOwkvKiBEV09SRCA3NiAqLworCXUzMiBwMXRjcGRyb3BwZWRsZW47CS8qIERXT1JEIDc3ICovCisJdTMyIHAxZHJvcHBlZHJ1bnQ7CS8qIERXT1JEIDc4ICovCisJdTMyIHAxcmVjdmQ2NDsJCS8qIERXT1JEIDc5ICovCisJdTMyIHAxcmVjdmQ2NV8xMjc7CS8qIERXT1JEIDgwICovCisJdTMyIHAxcmVjdmQxMjhfMjU2OwkvKiBEV09SRCA4MSAqLworCXUzMiBwMXJlY3ZkMjU2XzUxMTsJLyogRFdPUkQgODIgKi8KKwl1MzIgcDFyZWN2ZDUxMl8xMDIzOwkvKiBEV09SRCA4MyAqLworCXUzMiBwMXJlY3ZkMTUxOF8xNTIyOwkvKiBEV09SRCA4NCAqLworCXUzMiBwMXJlY3ZkMTUyMl8yMDQ3OwkvKiBEV09SRCA4NSAqLworCXUzMiBwMXJlY3ZkMjA0OF80MDk1OwkvKiBEV09SRCA4NiAqLworCXUzMiBwMXJlY3ZkNDA5Nl84MTkxOwkvKiBEV09SRCA4NyAqLworCXUzMiBwMXJlY3ZkODE5Ml85MjE2OwkvKiBEV09SRCA4OCAqLworCXUzMiBwMXJjdmRpcGNrc21lcnJzOwkvKiBEV09SRCA4OSAqLworCXUzMiBwMXJlY3ZkdGNwY2tzbWVycnM7CS8qIERXT1JEIDkwICovCisJdTMyIHAxcmVjdmR1ZHBja3NtZXJyczsJLyogRFdPUkQgOTEgKi8KKwl1MzIgcDFyZWN2ZG5vbnJzc3BhY2tldHM7CS8qIERXT1JEIDkyICovCisJdTMyIHAxcmVjdmRpcHBhY2tldHM7CS8qIERXT1JEIDkzICovCisJdTMyIHAxcmVjdmRjaHV0ZTFwYWNrZXRzOwkvKiBEV09SRCA5NCAqLworCXUzMiBwMXJlY3ZkY2h1dGUycGFja2V0czsJLyogRFdPUkQgOTUgKi8KKwl1MzIgcDFyZWN2ZGNodXRlM3BhY2tldHM7CS8qIERXT1JEIDk2ICovCisJdTMyIHAxcmVjdmRpcHNlY3BhY2tldHM7CS8qIERXT1JEIDk3ICovCisJdTMyIHAxcmVjdmRtYW5hZ2VtZW50cGFja2V0czsJLyogRFdPUkQgOTggKi8KKwl1MzIgcDF4bWl0Ynl0ZXNsc2Q7CS8qIERXT1JEIDk5ICovCisJdTMyIHAxeG1pdGJ5dGVzbXNkOwkvKiBEV09SRCAxMDAgKi8KKwl1MzIgcDF4bWl0dW5pY2FzdGZyYW1lczsJLyogRFdPUkQgMTAxICovCisJdTMyIHAxeG1pdG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgMTAyICovCisJdTMyIHAxeG1pdGJyb2FkY2FzdGZyYW1lczsJLyogRFdPUkQgMTAzICovCisJdTMyIHAxeG1pdHBhdXNlZnJhbWVzOwkvKiBEV09SRCAxMDQgKi8KKwl1MzIgcDF4bWl0Y29udHJvbGZyYW1lczsJLyogRFdPUkQgMTA1ICovCisJdTMyIHAxeG1pdDY0OwkJLyogRFdPUkQgMTA2ICovCisJdTMyIHAxeG1pdDY1XzEyNzsJLyogRFdPUkQgMTA3ICovCisJdTMyIHAxeG1pdDEyOF8yNTY7CS8qIERXT1JEIDEwOCAqLworCXUzMiBwMXhtaXQyNTZfNTExOwkvKiBEV09SRCAxMDkgKi8KKwl1MzIgcDF4bWl0NTEyXzEwMjM7CS8qIERXT1JEIDExMCAqLworCXUzMiBwMXhtaXQxNTE4XzE1MjI7CS8qIERXT1JEIDExMSAqLworCXUzMiBwMXhtaXQxNTIyXzIwNDc7CS8qIERXT1JEIDExMiAqLworCXUzMiBwMXhtaXQyMDQ4XzQwOTU7CS8qIERXT1JEIDExMyAqLworCXUzMiBwMXhtaXQ0MDk2XzgxOTE7CS8qIERXT1JEIDExNCAqLworCXUzMiBwMXhtaXQ4MTkyXzkyMTY7CS8qIERXT1JEIDExNSAqLworCXUzMiBwMXJ4Zmlmb292ZXJmbG93ZHJvcHBlZDsJLyogRFdPUkQgMTE2ICovCisJdTMyIHAxaXBzZWNsb29rdXBmYWlsZWRkcm9wcGVkOwkvKiBEV09SRCAxMTcgKi8KKwl1MzIgcHhkcm9wcGVkbm9wYnVmOwkvKiBEV09SRCAxMTggKi8KKwl1MzIgcHhkcm9wcGVkbm90eHBiOwkvKiBEV09SRCAxMTkgKi8KKwl1MzIgcHhkcm9wcGVkbm9pcHNlY2J1ZjsJLyogRFdPUkQgMTIwICovCisJdTMyIHB4ZHJvcHBlZG5vZXJ4ZGVzY3I7CS8qIERXT1JEIDEyMSAqLworCXUzMiBweGRyb3BwZWRub3RwcmVkZXNjcjsJLyogRFdPUkQgMTIyICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydHBhY2tldHM7CS8qIERXT1JEIDEyMyAqLworCXUzMiBweHJlY3ZkbWFuYWdlbWVudHBvcnRieXRlczsJLyogRFdPUkQgMTI0ICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydHBhdXNlZnJhbWVzOwkvKiBEV09SRCAxMjUgKi8KKwl1MzIgcHhyZWN2ZG1hbmFnZW1lbnRwb3J0ZXJyb3JzOwkvKiBEV09SRCAxMjYgKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRwYWNrZXRzOwkvKiBEV09SRCAxMjcgKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRieXRlczsJLyogRFdPUkQgMTI4ICovCisJdTMyIHB4eG1pdG1hbmFnZW1lbnRwb3J0cGF1c2U7CS8qIERXT1JEIDEyOSAqLworCXUzMiBweHhtaXRtYW5hZ2VtZW50cG9ydHJ4Zmlmb292ZXJmbG93OwkvKiBEV09SRCAxMzAgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjaXBja3NtZXJyczsJLyogRFdPUkQgMTMxICovCisJdTMyIHB4cmVjdmR0Y3BzZWNpcGNrc21lcnJzOwkvKiBEV09SRCAxMzIgKi8KKwl1MzIgcHhyZWN2ZHVkcHNlY2lwY2tzbWVycnM7CS8qIERXT1JEIDEzMyAqLworCXUzMiBweGlwc2VjcnVudDsJLyogRFdPUkQgMTM0ICovCisJdTMyIHB4aXBzZWNhZGRyZXNzbWlzbWF0Y2hkcm9wcGVkOwkvKiBEV09SRCAxMzUgKi8KKwl1MzIgcHhpcHNlY3J4Zmlmb292ZXJmbG93ZHJvcHBlZDsJLyogRFdPUkQgMTM2ICovCisJdTMyIHB4aXBzZWNmcmFtZXN0b29sb25nOwkvKiBEV09SRCAxMzcgKi8KKwl1MzIgcHhpcHNlY3RvdGFsaXBmcmFtZXM7CS8qIERXT1JEIDEzOCAqLworCXUzMiBweGlwc2VjaXB0b29zbWFsbDsJLyogRFdPUkQgMTM5ICovCisJdTMyIHB4aXBzZWNpcHRvb3Nob3J0OwkvKiBEV09SRCAxNDAgKi8KKwl1MzIgcHhpcHNlY2lwaGRydG9vc21hbGw7CS8qIERXT1JEIDE0MSAqLworCXUzMiBweGlwc2VjdGNwaGRyYmFkOwkvKiBEV09SRCAxNDIgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUxOwkvKiBEV09SRCAxNDMgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUyOwkvKiBEV09SRCAxNDQgKi8KKwl1MzIgcHhyZWN2ZGlwc2VjY2h1dGUzOwkvKiBEV09SRCAxNDUgKi8KKwl1MzIgcHhkcm9wcGVkN2ZyYWdzOwkvKiBEV09SRCAxNDYgKi8KKwl1MzIgcHhkcm9wcGVkZnJhZ3M7CS8qIERXT1JEIDE0NyAqLworCXUzMiBweGRyb3BwZWRpbnZhbGlkZnJhZ3Jpbmc7CS8qIERXT1JEIDE0OCAqLworCXUzMiBweG51bWZvcndhcmRlZHBhY2tldHM7CS8qIERXT1JEIDE0OSAqLworfSBfX3BhY2tlZDsKKwordW5pb24gTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNUyB7CisJc3RydWN0IE1JQl9FVEhfU1RBVElTVElDU19QQVJBTVNfSU4gcmVxdWVzdDsKKwlzdHJ1Y3QgQkVfUlhGX1NUQVRTIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBRdWVyeSBldGhlcm5ldCBzdGF0aXN0aWNzLiBBbGwgZG9tYWlucyBtYXkgaXNzdWUgdGhpcyBjb21tYW5kLiBUaGUKKyAqICBob3N0IGRvbWFpbiBkcml2ZXJzICBtYXkgb3B0aW9uYWxseSByZXNldCBpbnRlcm5hbCBzdGF0aXN0aWMgY291bnRlcnMKKyAqICB3aXRoIGEgcXVlcnkuCisgKi8KK3N0cnVjdCBGV0NNRF9FVEhfR0VUX1NUQVRJU1RJQ1MgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzVfUkVRVUVTVCB7CisJdTggcG9ydDBfcHJvbWlzY3VvdXM7CisJdTggcG9ydDFfcHJvbWlzY3VvdXM7CisJdTE2IHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3Nl9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfRVRIX0FOT05fMTc0X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3NV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3Nl9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIEVuYWJsZXMvRGlzYWJsZXMgcHJvbWlzY3VvdXMgZXRoZXJuZXQgcmVjZWl2ZSBtb2RlLiAgKi8KK3N0cnVjdCBGV0NNRF9FVEhfUFJPTUlTQ1VPVVMgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfRVRIX0FOT05fMTc0X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc4X1JFUVVFU1QgeworCXUzMiBuZXdfZnJhZ3NpemVfbG9nMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzlfUkVTUE9OU0UgeworCXUzMiBhY3R1YWxfZnJhZ3NpemVfbG9nMjsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0VUSF9BTk9OXzE3N19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzhfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzlfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFNldHMgdGhlIEV0aGVybmV0IFJYIGZyYWdtZW50IHNpemUuIE9ubHkgaG9zdCAoZG9tYWluIDApIG5ldHdvcmtpbmcKKyAqICBkcml2ZXJzIG1heSBpc3N1ZSAgdGhpcyBjb21tYW5kLiAgVGhpcyBjYWxsIHdpbGwgZmFpbCBmb3Igbm9uLWhvc3QKKyAqICBwcm90ZWN0aW9uIGRvbWFpbnMuIEluIHRoaXMgc2l0dWF0aW9uIHRoZSAgTUNDIENRIHN0YXR1cyB3aWxsIGluZGljYXRlCisgKiAgYSBmYWlsdXJlIGR1ZSB0byBpbnN1ZmZpY2llbnQgcHJpdmlsZWRnZXMuIFRoZSByZXNwb25zZSAgc2hvdWxkIGJlCisgKiAgaWdub3JlZCwgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHVzZSB0aGUgRldDTURfRVRIX0dFVF9GUkFHX1NJWkUgdG8KKyAqICBxdWVyeSB0aGUgIGV4aXN0aW5nIGV0aGVybmV0IHJlY2VpdmUgZnJhZ21lbnQgc2l6ZS4gSXQgbXVzdCB1c2UgdGhpcworICogIGZyYWdtZW50IHNpemUgZm9yIGFsbCAgZnJhZ21lbnRzIGluIHRoZSBldGhlcm5ldCByZWNlaXZlIHJpbmcuICBJZgorICogIHRoZSBjb21tYW5kIHN1Y2NlZWRzLCB0aGUgZHJpdmVyIG11c3QgdXNlIHRoZSAgZnJhZyBzaXplIGluZGljYXRlZAorICogIGluIHRoZSBjb21tYW5kIHJlc3BvbnNlIHNpbmNlIHRoZSByZXF1ZXN0ZWQgZnJhZyBzaXplIG1heSBub3QgYmUgIGFwcGxpZWQKKyAqICB1bnRpbCB0aGUgbmV4dCByZWJvb3QuIFdoZW4gdGhlIHJlcXVlc3RlZCBmcmFnc2l6ZSBtYXRjaGVzIHRoZSByZXNwb25zZQorICogICBmcmFnc2l6ZSwgdGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVlc3Qgd2FzIGFwcGxpZWQgaW1tZWRpYXRlbHkuCisgKi8KK3N0cnVjdCBGV0NNRF9FVEhfU0VUX1JYX0ZSQUdfU0laRSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9FVEhfQU5PTl8xNzdfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xODFfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4Ml9SRVNQT05TRSB7CisJdTMyIGFjdHVhbF9mcmFnc2l6ZV9sb2cyOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfRVRIX0FOT05fMTgwX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4MV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4Ml9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgUXVlcmllcyB0aGUgRXRoZXJuZXQgUlggZnJhZ21lbnQgc2l6ZS4gQWxsIGRvbWFpbnMgbWF5IGlzc3VlIHRoaXMKKyAqICBjb21tYW5kLiAgVGhlIGRyaXZlciAgc2hvdWxkIGNhbGwgdGhpcyBjb21tYW5kIHRvIGRldGVybWluZSB0aGUgbWluaW11bQorICogIHJlcXVpcmVkIGZyYWdtZW50IHNpemUgZm9yIHRoZSBldGhlcm5ldCAgUlggcmluZyBidWZmZXJzLiBEcml2ZXJzCisgKiAgbWF5IGNob29zZSB0byB1c2UgYSBsYXJnZXIgc2l6ZSBmb3IgZWFjaCBmcmFnbWVudCBidWZmZXIsIGJ1dCAgQmxhZGVFbmdpbmUKKyAqICB3aWxsIHVzZSB1cCB0byB0aGUgY29uZmlndXJlZCBtaW5pbXVtIHJlcXVpcmVkIGZyYWdzaXplIGluIGVhY2ggZXRoZXJuZXQKKyAqICAgcmVjZWl2ZSBmcmFnbWVudCBidWZmZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgZXRoZXJuZXQgcmVjZWl2ZSBmcmFnbWVudAorICogIHNpemUgaXMgIGNvbmZpZ3VyZWQgdG8gNGtCLCBhbmQgYSBkcml2ZXIgdXNlcyA4a0IgZnJhZ21lbnRzLCBhIDZrQgorICogIGV0aGVybmV0IHBhY2tldCByZWNlaXZlZCBieSAgQmxhZGVFbmdpbmUgd2lsbCBiZSBzcGxpdCBhY2Nyb3NzIHR3bworICogIG9mIHRoZSBkcml2ZXIncyByZWNlaXZlIGZyYW1nZW50cyAoNGtCIGluIG9uZSAgZnJhZ21lbnQgYnVmZmVyLCBhbmQKKyAqICAya0IgaW4gdGhlIHN1YnNlcXVlbnQgZnJhZ21lbnQgYnVmZmVyKS4KKyAqLworc3RydWN0IEZXQ01EX0VUSF9HRVRfUlhfRlJBR19TSVpFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0VUSF9BTk9OXzE4MF9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fZndjbWRfZXRoX2JtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfaGRyX2JtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9oZHJfYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfaGRyX2JtYXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfaGRyX2JtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfaGRyX2JtYXBfaF9fCisKK3N0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiB7CisJdTggb3Bjb2RlOworCXU4IHN1YnN5c3RlbTsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCBkb21haW47CisJdTMyIHRpbWVvdXQ7CisJdTMyIHJlcXVlc3RfbGVuZ3RoOworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgeworCXU4IG9wY29kZTsKKwl1OCBzdWJzeXN0ZW07CisJdTggcnN2ZDA7CisJdTggZG9tYWluOworCXU4IHN0YXR1czsKKwl1OCBhZGRpdGlvbmFsX3N0YXR1czsKKwl1MTYgcnN2ZDE7CisJdTMyIHJlc3BvbnNlX2xlbmd0aDsKKwl1MzIgYWN0dWFsX3Jlc3BvbnNlX2xlbmd0aDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhlIGZpcm13YXJlL2RyaXZlciBvdmVyd3JpdGVzIHRoZSBpbnB1dCBGV0NNRF9SRVFVRVNUX0hFQURFUiB3aXRoCisgKiAgdGhlIG91dHB1dCAgRldDTURfUkVTUE9OU0VfSEVBREVSLgorICovCit1bmlvbiBGV0NNRF9IRUFERVIgeworCXN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9SRVNQT05TRV9IRUFERVIgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF9oZHJfYm1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9tY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVjYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX21jYy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9tY2NfYW1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9tY2NfYW1hcF9oX18KKyNpbmNsdWRlICJmd2NtZF9vcGNvZGVzLmgiCisvKgorICogV2hlcmUgYXBwbGljYWJsZSwgYSBXUkIsIG1heSBjb250YWluIGEgbGlzdCBvZiBTY2F0dGVyLWdhdGhlciBlbGVtZW50cy4KKyAqIEVhY2ggZWxlbWVudCBzdXBwb3J0cyBhIDY0IGJpdCBhZGRyZXNzIGFuZCBhIDMyYml0IGxlbmd0aCBmaWVsZC4KKyAqLworc3RydWN0IEJFX01DQ19TR0VfQU1BUCB7CisJdTggcGFfbG9bMzJdOwkvKiBEV09SRCAwICovCisJdTggcGFfaGlbMzJdOwkvKiBEV09SRCAxICovCisJdTggbGVuZ3RoWzMyXTsJLyogRFdPUkQgMiAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfU0dFX0FNQVAgeworCXUzMiBkd1szXTsKK307CisvKgorICogVGhlIGRlc2lnbiBvZiBhbiBNQ0NfU0dFIGFsbG93cyB1cCB0byAxOSBlbGVtZW50cyB0byBiZSBlbWJlZGRlZAorICogaW4gYSBXUkIsIHN1cHBvcnRpbmcgNjRLQiBkYXRhIHRyYW5zZmVycyAoYXNzdW1pbmcgYSA0S0IgcGFnZSBzaXplKS4KKyAqLworc3RydWN0IEJFX01DQ19XUkJfUEFZTE9BRF9BTUFQIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBCRV9NQ0NfU0dFX0FNQVAgc2dsWzE5XTsKKwkJdTggZW1iZWRkZWRbNTldWzMyXTsJLyogRFdPUkQgMCAqLworCX07Cit9IF9fcGFja2VkOworc3RydWN0IE1DQ19XUkJfUEFZTE9BRF9BTUFQIHsKKwl1MzIgZHdbNTldOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgTUNDIENvbW1hbmQgV1JCIGZvciBjb21tYW5kcworICogc2VudCB0byB0aGUgTWFuYWdlbWVudCBQcm9jZXNzaW5nIFVuaXQgKE1QVSkuIFNlZSBzZWN0aW9uCisgKiBmb3IgdXNhZ2UgaW4gZW1iZWRkZWQgYW5kIG5vbi1lbWJlZGRlZCBtb2Rlcy4KKyAqLworc3RydWN0IEJFX01DQ19XUkJfQU1BUCB7CisJdTggZW1iZWRkZWQ7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsyXTsJLyogRFdPUkQgMCAqLworCXU4IHNnZV9jb3VudFs1XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHNwZWNpYWxbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwYXlsb2FkX2xlbmd0aFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCB0YWdbMl1bMzJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDJbMzJdOwkvKiBEV09SRCA0ICovCisJc3RydWN0IEJFX01DQ19XUkJfUEFZTE9BRF9BTUFQIHBheWxvYWQ7Cit9IF9fcGFja2VkOworc3RydWN0IE1DQ19XUkJfQU1BUCB7CisJdTMyIGR3WzY0XTsKK307CisKKy8qICBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE1DQyBDb21wbGV0aW9uIHF1ZXVlIGVudHJ5ICAqLworc3RydWN0IEJFX01DQ19DUV9FTlRSWV9BTUFQIHsKKwl1OCBjb21wbGV0aW9uX3N0YXR1c1sxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBleHRlbmRlZF9zdGF0dXNbMTZdOwkvKiBEV09SRCAwICovCisJdTggbWNjX3RhZ1syXVszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMFsyN107CS8qIERXT1JEIDMgKi8KKwl1OCBjb25zdW1lZDsJLyogRFdPUkQgMyAqLworCXU4IGNvbXBsZXRlZDsJLyogRFdPUkQgMyAqLworCXU4IGhwaV9idWZmZXJfY29tcGxldGlvbjsJLyogRFdPUkQgMyAqLworCXU4IGFzeW5jX2V2ZW50OwkvKiBEV09SRCAzICovCisJdTggdmFsaWQ7CQkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisvKiBNYWlsYm94IHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgTVBVIGR1cmluZyBib290c3RyYXAgKi8KK3N0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQIHsKKwlzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQIHdyYjsKKwlzdHJ1Y3QgQkVfTUNDX0NRX0VOVFJZX0FNQVAgY3E7Cit9IF9fcGFja2VkOworc3RydWN0IE1DQ19NQUlMQk9YX0FNQVAgeworCXUzMiBkd1s2OF07Cit9OworCisjZW5kaWYgLyogX19md2NtZF9tY2NfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9vcGNvZGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfb3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZDU2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfb3Bjb2Rlcy5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZndjbWRfb3Bjb2Rlc19hbWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX29wY29kZXNfYW1hcF9oX18KKworLyoKKyAqIC0tLSBGV0NNRF9TVUJTWVNURU1TIC0tLQorICogVGhlIGNvbW1hbmRzIGFyZSBncm91cGVkIGludG8gdGhlIGZvbGxvd2luZyBzdWJzeXN0ZW1zLiBUaGUgc3Vic3lzdGVtCisgKiBjb2RlIGFsb25nIHdpdGggdGhlIG9wY29kZSB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgZndjbWQuCisgKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX1JTVkQgICgwKQkvKiBUaGlzIHN1YnN5c3RlbSBpcyByZXNlcnZlZC4gSXQgaXMgKi8KKwkJCQkJCSAgLyogbmV2ZXIgdXNlZC4gKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0NPTU1PTiAoMSkJLyogQ01EcyBpbiB0aGlzIGdyb3VwIGFyZSBjb21tb24gdG8KKwkJCQkJKiBhbGwgc3Vic3lzdGVtcy4gU2VlCisJCQkJCSogQ09NTU9OX1NVQlNZU1RFTV9PUENPREVTIGZvciBvcGNvZGVzCisJCQkJCSogYW5kIENvbW1vbiBIb3N0IENvbmZpZ3VyYXRpb24gQ01EcworCQkJCQkqIGZvciB0aGUgRldDTUQgZGVzY3JpcHRpb25zLgorCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fQ09NTU9OX0lTQ1NJICAgICgyKSAvKiBDTURzIGluIHRoaXMgZ3JvdXAgYXJlICovCisJCQkJCS8qCisJCQkJCSogY29tbW9uIHRvIEluaXRpYXRvciBhbmQgVGFyZ2V0LiBTZWUKKwkJCQkJKiBDT01NT05fSVNDU0lfU1VCU1lTVEVNX09QQ09ERVMgYW5kCisJCQkJCSogQ29tbW9uIGlTQ1NJIEluaXRpYXRvciBhbmQgVGFyZ2V0CisJCQkJCSogQ01EcyBmb3IgdGhlIGNvbW1hbmQgZGVzY3JpcHRpb25zLgorCQkJCQkqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fRVRIICAgICAgICAgICAgICgzKQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlICBFdGhlcm5ldCBjb21tYW5kcy4gICovCisKKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX1RQTSAgICAgICAgICAgICAoNCkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZAorCQkJCQkJIHRvIGV4ZWN1dGUgVFBNICBjb21tYW5kcy4gICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9QWEVfVU5ESSAgICAgICAgKDUpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQKKwkJCQkJCSogdG8gZXhlY3V0ZSBQWEUKKwkJCQkJCSogYW5kIFVOREkgc3BlY2lmaWMgY29tbWFuZHMuCisJCQkJCQkqLworCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9JU0NTSV9JTkkgICAgICAgKDYpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQgdG8KKwkJCQkJCWV4ZWN1dGUgSVNDU0kgSW5pdGlhdG9yCisJCQkJCQlzcGVjaWZpYyBjb21tYW5kcy4KKwkJCQkJCSovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9JU0NTSV9UR1QgICAgICAgKDcpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQKKwkJCQkJCXRvIGV4ZWN1dGUgaVNDU0kgVGFyZ2V0CisJCQkJCQlzcGVjaWZpYyBjb21tYW5kcy5iZXR3ZWVuCisJCQkJCQlQVEwgYW5kIEFSTSBmaXJtd2FyZS4KKwkJCQkJCSovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9NSUxJX1BUTCAgICAgICAgKDgpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQgdG8KKwkJCQkJCWV4ZWN1dGUgaVNDU0kgVGFyZ2V0IHNwZWNpZmljCisJCQkJCQljb21tYW5kcy5iZXR3ZWVuIE1JTEkKKwkJCQkJCWFuZCBQVEwuICAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fTUlMSV9UTUQgICAgICAgICg5KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkIHRvCisJCQkJCQlleGVjdXRlIGlTQ1NJIFRhcmdldCBzcGVjaWZpYworCQkJCQkJY29tbWFuZHMgYmV0d2VlbiBNSUxJCisJCQkJCQlhbmQgVE1ELiAgKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX1BST1hZICAgICAgICAgICAoMTEpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQKKwkJCQkJCXRvIGV4ZWN1dGUgcHJveGllZCBjb21tYW5kcworCQkJCQkJd2l0aGluIHRoZSBob3N0IGF0IHRoZQorCQkJCQkJZXhwbGljaXQgcmVxdWVzdCBvZiBhCisJCQkJCQlub24gcHJpdmlsZWRnZWQgZG9tYWluLgorCQkJCQkJVGhpcyAnc3Vic3lzdGVtJyBpcyBlbnRpcmVseQorCQkJCQkJdmlydHVhbCBmcm9tIHRoZSBjb250cm9sbGVyCisJCQkJCQlhbmQgZmlybXdhcmUgcGVyc3BlY3RpdmUgYXMKKwkJCQkJCWl0IGlzIGltcGxlbWVudGVkIGluIGhvc3QKKwkJCQkJCWRyaXZlcnMuCisJCQkJCQkqLworCisvKgorICogLS0tIENPTU1PTl9TVUJTWVNURU1fT1BDT0RFUyAtLS0KKyAqIFRoZXNlIG9wY29kZXMgYXJlIGNvbW1vbiB0byBib3RoIG5ldHdvcmtpbmcgYW5kIHN0b3JhZ2UgUENJCisgKiBmdW5jdGlvbnMuIFRoZXkgYXJlIHVzZWQgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgYW5kIGNvbmZpZ3VyZQorICogQmxhZGVFbmdpbmUuIFRoZXNlIG9wY29kZXMgYWxsIHVzZSB0aGUgRldDTURfU1VCU1lTVEVNX0NPTU1PTgorICogc3Vic3lzdGVtIGNvZGUuCisgKi8KKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX01BQ19RVUVSWSAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX01BQ19RVUVSWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX01BQ19TRVQgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19WTEFOX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JFQURfRkxBU0hST00gICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1dSSVRFX0ZMQVNIUk9NICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1FVRVJZX01BWF9GV0NNRF9CVUZGRVJfU0laRSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9BRERfUEFHRV9UQUJMRVMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVNT1ZFX1BBR0VfVEFCTEVTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JJTkdfREVTVFJPWSAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0NRX0NSRUFURSAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0VRX0NSRUFURSAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0VUSF9SWF9DUkVBVEUgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0VUSF9UWF9DUkVBVEUgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0lTQ1NJX1dSQlFfQ1JFQVRFICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX01DQ19DUkVBVEUgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0pFTExfQ09ORklHICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0FERF9URU1QTEFURV9IRUFERVJfQlVGRkVSUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SRU1PVkVfVEVNUExBVEVfSEVBREVSX0JVRkZFUlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUE9TVF9aRVJPX0JVRkZFUiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfUU9TICAgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfUU9TICAgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9UQ1BfR0VUX1NUQVRJU1RJQ1MgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VFUFJPTV9SRUFEICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fVENQX1NUQVRFX1FVRVJZICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9DTlRMX0FUVFJJQlVURVMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTk9QICAgICAgICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTlRXS19SWF9GSUxURVIgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0ZXX1ZFUlNJT04gKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX0ZMT1dfQ09OVFJPTCAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfRkxPV19DT05UUk9MICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9UQ1BfUEFSQU1FVEVSUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfRlJBTUVfU0laRSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfRkFUICAgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9NT0RJRllfRVFfREVMQVkgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRklSTVdBUkVfQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0VOQUJMRV9ESVNBQkxFX0RPTUFJTlMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0RPTUFJTl9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX1ZMRF9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX1ZMRF9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX1BPUlRfRVFVQUxJWkFUSU9OICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9QT1JUX0VRVUFMSVpBVElPTiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SRURfQ09ORklHICAgICAoMSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX01BQ19TRVQgICAgICAoMikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVQgKDMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19WTEFOX0NPTkZJRyAgKDQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSAoNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRUFEX0ZMQVNIUk9NICAgICAoNikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9XUklURV9GTEFTSFJPTSAgICAoNykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9RVUVSWV9NQVhfRldDTURfQlVGRkVSX1NJWkUgKDgpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fQUREX1BBR0VfVEFCTEVTICAgKDkpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVNT1ZFX1BBR0VfVEFCTEVTICgxMCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SSU5HX0RFU1RST1kgICAgICAoMTEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fQ1FfQ1JFQVRFICAgICAgICAgKDEyKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0VRX0NSRUFURSAgICAgICAgICgxMykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FVEhfUlhfQ1JFQVRFICAgICAoMTQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRVRIX1RYX0NSRUFURSAgICAgKDE1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX05FVF9SRVNFUlZFRDAgICAgICgxNikJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9ORVRfUkVTRVJWRUQxICAgICAoMTcpCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTkVUX1JFU0VSVkVEMiAgICAgKDE4KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX0RFRlFfQ1JFQVRFICgxOSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9JU0NTSV9XUkJRX0NSRUFURSAoMjApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTUNDX0NSRUFURSAgICAgICAgKDIxKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0pFTExfQ09ORklHICAgICAgICgyMikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUiAgICAoMjMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fQUREX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgyNCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRU1PVkVfVEVNUExBVEVfSEVBREVSX0JVRkZFUlMgKDI1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1BPU1RfWkVST19CVUZGRVIgICgyNikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUU9TICAgICAgICAgICAoMjcpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1FPUyAgICAgICAgICAgKDI4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1RDUF9HRVRfU1RBVElTVElDUyAoMjkpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VFUFJPTV9SRUFEICAgICAgKDMwKQorI2RlZmluZSBPUENPREVfQ09NTU9OX1RDUF9TVEFURV9RVUVSWSAgICgzMSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTICgzMikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OT1AgICAgICAgICAgICAgICAoMzMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTlRXS19SWF9GSUxURVIgICAgKDM0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GV19WRVJTSU9OICAgICgzNSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MICAoMzYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0ZMT1dfQ09OVFJPTCAgKDM3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9UQ1BfUEFSQU1FVEVSUyAoMzgpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0ZSQU1FX1NJWkUgICAgKDM5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9GQVQgICAgICAgICAgICg0MCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NT0RJRllfRVFfREVMQVkgICAoNDEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRklSTVdBUkVfQ09ORklHICAgKDQyKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0VOQUJMRV9ESVNBQkxFX0RPTUFJTlMgKDQzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9ET01BSU5fQ09ORklHICg0NCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfVkxEX0NPTkZJRyAgICAoNDUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1ZMRF9DT05GSUcgICAgKDQ2KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9QT1JUX0VRVUFMSVpBVElPTiAoNDcpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1BPUlRfRVFVQUxJWkFUSU9OICg0OCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRURfQ09ORklHICAgICAgICAoNDkpCisKKworCisvKgorICogLS0tIEVUSF9TVUJTWVNURU1fT1BDT0RFUyAtLS0KKyAqIFRoZXNlIG9wY29kZXMgYXJlIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBFdGhlcm5ldCBpbnRlcmZhY2VzLiBUaGVzZQorICogb3Bjb2RlcyBhbGwgdXNlIHRoZSBGV0NNRF9TVUJTWVNURU1fRVRIIHN1YnN5c3RlbSBjb2RlLgorICovCisjZGVmaW5lIE9QQ09ERV9FVEhfUlNTX0NPTkZJRyAgICAgICAgICAgKDEpCisjZGVmaW5lIE9QQ09ERV9FVEhfQUNQSV9DT05GSUcgICAgICAgICAgKDIpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfUlNTX0NPTkZJRyAgICAgICAgKDMpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfQUNQSV9DT05GSUcgICAgICAgKDMpCisjZGVmaW5lIE9QQ09ERV9FVEhfUFJPTUlTQ1VPVVMgICAgICAgICAgKDMpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfUFJPTUlTQ1VPVVMgICAgICAgKDMpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfR0VUX1NUQVRJU1RJQ1MgICAgKDMpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfR0VUX1JYX0ZSQUdfU0laRSAgKDMpCisjZGVmaW5lIFNVQlNZU1RFTV9FVEhfU0VUX1JYX0ZSQUdfU0laRSAgKDMpCisjZGVmaW5lIE9QQ09ERV9FVEhfR0VUX1NUQVRJU1RJQ1MgICAgICAgKDQpCisjZGVmaW5lIE9QQ09ERV9FVEhfR0VUX1JYX0ZSQUdfU0laRSAgICAgKDUpCisjZGVmaW5lIE9QQ09ERV9FVEhfU0VUX1JYX0ZSQUdfU0laRSAgICAgKDYpCisKKworCisKKworLyoKKyAqIC0tLSBNQ0NfU1RBVFVTX0NPREUgLS0tCisgKiBUaGVzZSBhcmUgdGhlIGdsb2JhbCBzdGF0dXMgY29kZXMgdXNlZCBieSBhbGwgc3Vic3lzdGVtcworICovCisjZGVmaW5lIE1DQ19TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgKDApCS8qIEluZGljYXRlcyBhIHN1Y2Nlc3NmdWwKKwkJCQkJCWNvbXBsZXRpb24gb2YgIHRoZSBjb21tYW5kICovCisjZGVmaW5lIE1DQ19TVEFUVVNfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRVMgKDEpCS8qIFRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZQorCQkJCQkJc3VmZmljaWVudCBwcml2aWxlZ2VzIHRvCisJCQkJCQlleGVjdXRlIHRoZSBjb21tYW5kICovCisjZGVmaW5lIE1DQ19TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgICAgKDIpCS8qIEEgcGFyYW1ldGVyIGluIHRoZSBjb21tYW5kCisJCQkJCQl3YXMgaW52YWxpZC4gVGhlIGV4dGVuZGVkCisJCQkJCQlzdGF0dXMgY29udGFpbnMgdGhlIGluZGV4CisJCQkJCQlvZiB0aGUgcGFyYW1ldGVyICovCisjZGVmaW5lIE1DQ19TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyAoMykJLyogVGhlcmUgYXJlIGluc3VmZmljaWVudAorCQkJCQkJY2hpcCByZXNvdXJjZXMgdG8gZXhlY3V0ZQorCQkJCQkJdGhlIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19RVUVVRV9GTFVTSElORyAgICAgICAoNCkJLyogVGhlIGNvbW1hbmQgaXMgY29tcGxldGluZworCQkJCQkJYmVjYXVzZSB0aGUgcXVldWUgd2FzCisJCQkJCQlnZXR0aW5nIGZsdXNoZWQgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19ETUFfRkFJTEVEICAgICAgICAgICAoNSkJLyogVGhlIGNvbW1hbmQgaXMgY29tcGxldGluZworCQkJCQkJd2l0aCBhIERNQSBlcnJvciAqLworCisvKgorICogLS0tIE1HTVRfRVJST1JfQ09ERVMgLS0tCisgKiBFcnJvciBDb2RlcyByZXR1cm5lZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoZSBGV0NNRCByZXNwb25zZSBoZWFkZXIKKyAqLworI2RlZmluZSBNR01UX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICgwKQkvKiBUaGUgRldDTUQgY29tcGxldGVkCisJCQkJCQl3aXRob3V0IGVycm9ycyAqLworI2RlZmluZSBNR01UX1NUQVRVU19GQUlMRUQgICAgICAgICAgICAgICgxKQkvKiBFcnJvciBzdGF0dXMgaW4gdGhlIFN0YXR1cworCQkJCQkJZmllbGQgb2YgIHRoZQorCQkJCQkJc3RydWN0IEZXQ01EX1JFU1BPTlNFX0hFQURFUiAqLworI2RlZmluZSBNR01UX1NUQVRVU19JTExFR0FMX1JFUVVFU1QgICAgICgyKQkvKiBJbnZhbGlkIEZXQ01EIG9wY29kZSAqLworI2RlZmluZSBNR01UX1NUQVRVU19JTExFR0FMX0ZJRUxEICAgICAgICgzKQkvKiBJbnZhbGlkIHBhcmFtZXRlciBpbgorCQkJCQkJdGhlIEZXQ01EICBwYXlsb2FkICovCisKKyNlbmRpZiAvKiBfX2Z3Y21kX29wY29kZXNfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF90eXBlc19ibWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfdHlwZXNfYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjE3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfdHlwZXNfYm1hcC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF90eXBlc19ibWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX3R5cGVzX2JtYXBfaF9fCisKKy8qIE1BQyBhZGRyZXNzIGZvcm1hdCAgKi8KK3N0cnVjdCBNQUNfQUREUkVTU19GT1JNQVQgeworCXUxNiBTaXplT2ZTdHJ1Y3R1cmU7CisJdTggTUFDQWRkcmVzc1s2XTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2Z3Y21kX3R5cGVzX2JtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaG9zdF9zdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ob3N0X3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTY3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaG9zdF9zdHJ1Y3QuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2hvc3Rfc3RydWN0X2FtYXBfaF9fCisjZGVmaW5lIF9faG9zdF9zdHJ1Y3RfYW1hcF9oX18KKyNpbmNsdWRlICJiZV9jbS5oIgorI2luY2x1ZGUgImJlX2NvbW1vbi5oIgorI2luY2x1ZGUgImRlc2NyaXB0b3JzLmgiCisKKy8qIC0tLSBFUV9DT01QTEVUSU9OX01BSk9SX0NPREVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9DT01QTEVUSU9OICAgICAgICAoMCkJLyogQ29tcGxldGlvbiBldmVudCBvbiBhICovCisJCQkJCQkgIC8qIHFjb21wbGV0aW9uIHVldWUuICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfRVRIICAgICAgICAgICAgICAgKDEpCS8qIEFmZmlsaWF0ZWQgRXRoZXJuZXQgRXZlbnQuICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfUkVTRVJWRUQgICAgICAgICAgKDIpCS8qIFJlc2VydmVkICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfUkRNQSAgICAgICAgICAgICAgKDMpCS8qIEFmZmlsaWF0ZWQgUkRNQSBFdmVudC4gKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9JU0NTSSAgICAgICAgICAgICAoNCkJLyogQWZmaWxpYXRlZCBJU0NTSSBFdmVudCAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX1VOQUZGSUxJQVRFRCAgICAgICg1KQkvKiBVbmFmZmlsaWF0ZWQgRXZlbnQgKi8KKworLyogLS0tIEVRX0NPTVBMRVRJT05fTUlOT1JfQ09ERV9FTlVNIC0tLSAqLworI2RlZmluZSBFUV9NSU5PUl9DT0RFX0NPTVBMRVRJT04gICAgICAgICgwKQkvKiBDb21wbGV0aW9uIGV2ZW50IG9uIGEgKi8KKwkJCQkJCSAgLyogY29tcGxldGlvbiBxdWV1ZS4gKi8KKyNkZWZpbmUgRVFfTUlOT1JfQ09ERV9PVEhFUiAgICAgICAgICAgICAoMSkJLyogT3RoZXIgRXZlbnQgKFRCRCkuICovCisKKy8qIFF1ZXVlIEVudHJ5IERlZmluaXRpb24gZm9yIGFsbCA0IGJ5dGUgZXZlbnQgcXVldWUgdHlwZXMuICovCitzdHJ1Y3QgQkVfRVFfRU5UUllfQU1BUCB7CisJdTggVmFsaWQ7CQkvKiBEV09SRCAwICovCisJdTggTWFqb3JDb2RlWzNdOwkvKiBEV09SRCAwICovCisJdTggTWlub3JDb2RlWzEyXTsJLyogRFdPUkQgMCAqLworCXU4IFJlc291cmNlSURbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IEVRX0VOVFJZX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiAtLS0gRVRIX0VWRU5UX0NPREUgLS0tCisgKiBUaGVzZSBjb2RlcyBhcmUgcmV0dXJuZWQgYnkgdGhlIE1QVSB3aGVuIG9uZSBvZiB0aGVzZSBldmVudHMgaGFzIG9jY3VycmVkLAorICogYW5kIHRoZSBldmVudCBpcyBjb25maWd1cmVkIHRvIHJlcG9ydCB0byBhbiBFdmVudCBRdWV1ZSB3aGVuIGFuIGV2ZW50CisgKiBpcyBkZXRlY3RlZC4KKyAqLworI2RlZmluZSBFVEhfRVFfTElOS19TVEFUVVMgICAgICAgICAgICAgICgwKQkvKiBMaW5rIHN0YXR1cyBjaGFuZ2UgZXZlbnQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9XQVRFUk1BUksgICAgICAgICAgICAgICAgKDEpCS8qIHdhdGVybWFyayBldmVudCBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX01BR0lDX1BLVCAgICAgICAgICAgICAgICAoMikJLyogbWFnaWMgcGt0IGV2ZW50IGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfQUNQSV9QS1QwICAgICAgICAgICAgICAgICgzKQkvKiBBQ1BJIGludGVyZXN0aW5nIHBhY2tldCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMSAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9BQ1BJX1BLVDIgICAgICAgICAgICAgICAgKDMpCS8qIEFDUEkgaW50ZXJlc3RpbmcgcGFja2V0ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfQUNQSV9QS1QzICAgICAgICAgICAgICAgICgzKQkvKiBBQ1BJIGludGVyZXN0aW5nIHBhY2tldCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKworLyoKKyAqIC0tLSBFVEhfVFhfQ09NUExfU1RBVFVTX0VOVU0gLS0tCisgKiBTdGF0dXMgY29kZXMgY29udGFpbmVkIGluIEV0aGVybmV0IFRYIGNvbXBsZXRpb24gZGVzY3JpcHRvcnMuCisgKi8KKyNkZWZpbmUgRVRIX0NPTVBfVkFMSUQgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRVRIX0NPTVBfRVJST1IgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgRVRIX0NPTVBfSU5WQUxJRCAgICAgICAgICAgICAgICAoMTUpCisKKy8qCisgKiAtLS0gRVRIX1RYX0NPTVBMX1BPUlRfRU5VTSAtLS0KKyAqIFBvcnQgaW5kaWNhdG9yIGNvbnRhaW5lZCBpbiBFdGhlcm5ldCBUWCBjb21wbGV0aW9uIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIEVUSF9DT01QX1BPUlQwICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEVUSF9DT01QX1BPUlQxICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEVUSF9DT01QX01HTVQgICAgICAgICAgICAgICAgICAgKDIpCisKKy8qCisgKiAtLS0gRVRIX1RYX0NPTVBMX0NUX0VOVU0gLS0tCisgKiBDb21wbGV0aW9uIHR5cGUgaW5kaWNhdG9yIGNvbnRhaW5lZCBpbiBFdGhlcm5ldCBUWCBjb21wbGV0aW9uIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIEVUSF9DT01QX0VUSCAgICAgICAgICAgICAgICAgICAgKDApCisKKy8qCisgKiBXb3JrIHJlcXVlc3QgYmxvY2sgdGhhdCB0aGUgZHJpdmVyIGlzc3VlcyB0byB0aGUgY2hpcCBmb3IKKyAqIEV0aGVybmV0IHRyYW5zbWlzc2lvbnMuIEFsbCBjb250cm9sIGZpZWxkcyBtdXN0IGJlIHZhbGlkIGluIGVhY2ggV1JCIGZvcgorICogYSBtZXNzYWdlLiBUaGUgY29udHJvbGxlciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBmbGFncywgb3B0aW9uYWxseSB3cml0ZXMKKyAqIGFuIGVudHJ5IHRvIHRoZSBDb21wbGV0aW9uIFJpbmcgYW5kIGdlbmVyYXRlIGFuIGV2ZW50LgorICovCitzdHJ1Y3QgQkVfRVRIX1dSQl9BTUFQIHsKKwl1OCBmcmFnX3BhX2hpWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IGZyYWdfcGFfbG9bMzJdOwkvKiBEV09SRCAxICovCisJdTggY29tcGxldGU7CS8qIERXT1JEIDIgKi8KKwl1OCBldmVudDsJCS8qIERXT1JEIDIgKi8KKwl1OCBjcmM7CQkvKiBEV09SRCAyICovCisJdTggZm9yd2FyZDsJCS8qIERXT1JEIDIgKi8KKwl1OCBpcHNlYzsJCS8qIERXT1JEIDIgKi8KKwl1OCBtZ210OwkJLyogRFdPUkQgMiAqLworCXU4IGlwY3M7CQkvKiBEV09SRCAyICovCisJdTggdWRwY3M7CQkvKiBEV09SRCAyICovCisJdTggdGNwY3M7CQkvKiBEV09SRCAyICovCisJdTggbHNvOwkJLyogRFdPUkQgMiAqLworCXU4IGxhc3Q7CQkvKiBEV09SRCAyICovCisJdTggdmxhbjsJCS8qIERXT1JEIDIgKi8KKwl1OCBkYmdbM107CQkvKiBEV09SRCAyICovCisJdTggaGFzaF92YWxbM107CS8qIERXT1JEIDIgKi8KKwl1OCBsc29fbXNzWzE0XTsJLyogRFdPUkQgMiAqLworCXU4IGZyYWdfbGVuWzE2XTsJLyogRFdPUkQgMyAqLworCXU4IHZsYW5fdGFnWzE2XTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVEhfV1JCX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKy8qIFRoaXMgaXMgYW4gRXRoZXJuZXQgdHJhbnNtaXQgY29tcGxldGlvbiBkZXNjcmlwdG9yICovCitzdHJ1Y3QgQkVfRVRIX1RYX0NPTVBMX0FNQVAgeworCXU4IHVzZXJfYnl0ZXNbMTZdOwkvKiBEV09SRCAwICovCisJdTggbndoX2J5dGVzWzhdOwkvKiBEV09SRCAwICovCisJdTggbHNvOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggd3JiX2luZGV4WzE2XTsJLyogRFdPUkQgMSAqLworCXU4IGN0WzJdOwkJLyogRFdPUkQgMSAqLworCXU4IHBvcnRbMl07CQkvKiBEV09SRCAxICovCisJdTggcnN2ZDFbOF07CS8qIERXT1JEIDEgKi8KKwl1OCBzdGF0dXNbNF07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMlsxNl07CS8qIERXT1JEIDIgKi8KKwl1OCByaW5naWRbMTFdOwkvKiBEV09SRCAyICovCisJdTggaGFzaF92YWxbNF07CS8qIERXT1JEIDIgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkM1szMl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKy8qIEV0aGVybmV0IFJlY2VpdmUgQnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBCRV9FVEhfUlhfRF9BTUFQIHsKKwl1OCBmcmFncGFfaGlbMzJdOwkvKiBEV09SRCAwICovCisJdTggZnJhZ3BhX2xvWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVEhfUlhfRF9BTUFQIHsKKwl1MzIgZHdbMl07Cit9OworCisvKiBUaGlzIGlzIGFuIEV0aGVybmV0IFJlY2VpdmUgQ29tcGxldGlvbiBEZXNjcmlwdG9yICovCitzdHJ1Y3QgQkVfRVRIX1JYX0NPTVBMX0FNQVAgeworCXU4IHZsYW5fdGFnWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHBrdHNpemVbMTRdOwkvKiBEV09SRCAwICovCisJdTggcG9ydDsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBlcnI7CQkvKiBEV09SRCAxICovCisJdTggcnNzaHA7CQkvKiBEV09SRCAxICovCisJdTggaXBmOwkJLyogRFdPUkQgMSAqLworCXU4IHRjcGY7CQkvKiBEV09SRCAxICovCisJdTggdWRwZjsJCS8qIERXT1JEIDEgKi8KKwl1OCBpcGNrc207CQkvKiBEV09SRCAxICovCisJdTggdGNwY2tzbTsJCS8qIERXT1JEIDEgKi8KKwl1OCB1ZHBja3NtOwkJLyogRFdPUkQgMSAqLworCXU4IG1hY2RzdFs2XTsJLyogRFdPUkQgMSAqLworCXU4IHZ0cDsJCS8qIERXT1JEIDEgKi8KKwl1OCB2dG07CQkvKiBEV09SRCAxICovCisJdTggZnJhZ25keFsxMF07CS8qIERXT1JEIDEgKi8KKwl1OCBjdFsyXTsJCS8qIERXT1JEIDEgKi8KKwl1OCBpcHNlYzsJCS8qIERXT1JEIDEgKi8KKwl1OCBudW1mcmFnc1szXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMxXTsJLyogRFdPUkQgMiAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMiAqLworCXU4IHJzc2hhc2hbMzJdOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisjZW5kaWYgLyogX19ob3N0X3N0cnVjdF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2h3bGliLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaHdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVkZjRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2h3bGliLmgKQEAgLTAsMCArMSw4MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpZm5kZWYgX19od2xpYl9oX18KKyNkZWZpbmUgX19od2xpYl9oX18KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJyZWdtYXAuaCIJCS8qIHNyY2dlbiBhcnJheSBtYXAgb3V0cHV0ICovCisKKyNpbmNsdWRlICJhc3luY21lc2cuaCIKKyNpbmNsdWRlICJmd2NtZF9vcGNvZGVzLmgiCisjaW5jbHVkZSAicG9zdF9jb2Rlcy5oIgorI2luY2x1ZGUgImZ3Y21kX21jYy5oIgorCisjaW5jbHVkZSAiZndjbWRfdHlwZXNfYm1hcC5oIgorI2luY2x1ZGUgImZ3Y21kX2NvbW1vbl9ibWFwLmgiCisjaW5jbHVkZSAiZndjbWRfZXRoX2JtYXAuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorLyoKKyAqCisgKiBNYWNyb3MgZm9yIHJlYWRpbmcvd3JpdGluZyBhIHByb3RlY3Rpb24gZG9tYWluIG9yIENTUiByZWdpc3RlcnMKKyAqIGluIEJsYWRlRW5naW5lLgorICovCisjZGVmaW5lIFBEX1JFQUQoZm8sIGZpZWxkKQlpb3JlYWQzMigoZm8pLT5kYl92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BST1RFQ1RJT05fRE9NQUlOX0RCTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIFBEX1dSSVRFKGZvLCBmaWVsZCwgdmFsKSBpb3dyaXRlMzIodmFsLCAoZm8pLT5kYl92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX1BST1RFQ1RJT05fRE9NQUlOX0RCTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIENTUl9SRUFEKGZvLCBmaWVsZCkJaW9yZWFkMzIoKGZvKS0+Y3NyX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfQkxBREVfRU5HSU5FX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBDU1JfV1JJVEUoZm8sIGZpZWxkLCB2YWwpCWlvd3JpdGUzMih2YWwsIChmbyktPmNzcl92YSArIFwKKwkJb2Zmc2V0b2Yoc3RydWN0IEJFX0JMQURFX0VOR0lORV9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgUENJQ0ZHMF9SRUFEKGZvLCBmaWVsZCkJaW9yZWFkMzIoKGZvKS0+cGNpX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUENJQ0ZHMF9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgUENJQ0ZHMF9XUklURShmbywgZmllbGQsIHZhbCkJaW93cml0ZTMyKHZhbCwgKGZvKS0+cGNpX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUENJQ0ZHMF9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgUENJQ0ZHMV9SRUFEKGZvLCBmaWVsZCkJaW9yZWFkMzIoKGZvKS0+cGNpX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUENJQ0ZHMV9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgUENJQ0ZHMV9XUklURShmbywgZmllbGQsIHZhbCkJaW93cml0ZTMyKHZhbCwgKGZvKS0+cGNpX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUENJQ0ZHMV9DU1JNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNpZmRlZiBCRV9ERUJVRworI2RlZmluZSBBU1NFUlQoYykgICAgICAgQlVHX09OKCEoYykpOworI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGMpCisjZW5kaWYKKworLyogZGVidWcgbGV2ZWxzICovCitlbnVtIEJFX0RFQlVHX0xFVkVMUyB7CisJRExfQUxXQVlTID0gMCwJCS8qIGNhbm5vdCBiZSBtYXNrZWQgKi8KKwlETF9FUlIgPSAweDEsCQkvKiBlcnJvcnMgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJRExfV0FSTiA9IDB4MiwJCS8qIHNvbWV0aGluZyBxdWVzdGlvbmFibGUuCisJCQkJICAgcmVjb3ZlcmFibGUgZXJyb3JzICovCisJRExfTk9URSA9IDB4NCwJCS8qIGluZnJlcXVlbnQsIGltcG9ydGFudCBkZWJ1ZyBpbmZvICovCisJRExfSU5GTyA9IDB4OCwJCS8qIGRlYnVnIGluZm9ybWF0aW9uICovCisJRExfVkVSQk9TRSA9IDB4MTAsCS8qIGRldGFpbGVkIGluZm8sIHN1Y2ggYXMgYnVmZmVyIHRyYWNlcyAqLworCUJFX0RMX01JTl9WQUxVRSA9IDB4MSwJLyogdGhpcyBpcyB0aGUgbWluIHZhbHVlIHVzZWQgKi8KKwlCRV9ETF9NQVhfVkFMVUUgPSAweDgwCS8qIHRoaXMgaXMgdGhlIGhpZ2hlc2V0IHZhbHVlIHVzZWQgKi8KK30gOworCitleHRlcm4gdW5zaWduZWQgaW50IHRyYWNlX2xldmVsOworCisjZGVmaW5lIFRSQUNFKGxtLCBmbXQsIGFyZ3MuLi4pICB7CQkJCVwKKwkJaWYgKHRyYWNlX2xldmVsICYgbG0pIHsJCQkJXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJCRTogJXM6JWQgXG4iIGZtdCwJXAorCQkJX19GSUxFX18gLCBfX0xJTkVfXyAsICMjIGFyZ3MpOwkJXAorCQl9CQkJCQkJXAorCX0KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmVfdHJhY2Vfc2V0X2xldmVsKHVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBpbnQgb2xkX2xldmVsID0gdHJhY2VfbGV2ZWw7CisJdHJhY2VfbGV2ZWwgPSBsZXZlbDsKKwlyZXR1cm4gb2xkX2xldmVsOworfQorCisjZGVmaW5lIGJlX3RyYWNlX2dldF9sZXZlbCgpIAl0cmFjZV9sZXZlbAorLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIHBhZ2VzIHNwYW5uZWQgYnkgdGhlIHNpemUgb2YgZGF0YQorICogc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgUEFHRVNfU1BBTk5FRChfYWRkcmVzcywgX3NpemUpIFwKKyAgICgodTMyKSgoKChzaXplX3QpKF9hZGRyZXNzKSAmIChQQUdFX1NJWkUgLSAxKSkgKyBcCisJCShfc2l6ZSkgKyAoUEFHRV9TSVpFIC0gMSkpID4+IFBBR0VfU0hJRlQpKQorLyogQnl0ZSBvZmZzZXQgaW50byB0aGUgcGFnZSBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGFkZHJlc3MgKi8KKyNkZWZpbmUgT0ZGU0VUX0lOX1BBR0UoX2FkZHJfKSAoKHNpemVfdCkoX2FkZHJfKSAmIChQQUdFX1NJWkUtMSkpCisKKy8qCisgKiBjaXJjdWxhciBzdWJ0cmFjdC4KKyAqIFJldHVybnMgYSAtIGIgYXNzdW1pbmcgYSBjaXJjdWxhciBudW1iZXIgc3lzdGVtLCB3aGVyZSBhIGFuZCBiIGFyZQorICogaW4gcmFuZ2UgKDAsIG1heFZhbHVlLTEpLiBJZiBhPT1iLCB6ZXJvIGlzIHJldHVybmVkIHNvIHRoZQorICogaGlnaGVzdCB2YWx1ZSBwb3NzaWJsZSB3aXRoIHRoaXMgc3VidHJhY3Rpb24gaXMgbWF4VmFsdWUtMS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgYmVfc3ViYyh1MzIgYSwgdTMyIGIsIHUzMiBtYXgpCit7CisJQVNTRVJUKGEgPD0gbWF4ICYmIGIgPD0gbWF4KTsKKwlBU1NFUlQobWF4ID4gMCk7CisJcmV0dXJuIGEgPj0gYiA/IChhIC0gYikgOiAobWF4IC0gYiArIGEpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBiZV9hZGRjKHUzMiBhLCB1MzIgYiwgdTMyIG1heCkKK3sKKwlBU1NFUlQoYSA8IG1heCk7CisJQVNTRVJUKG1heCA+IDApOworCXJldHVybiAobWF4IC0gYSA+IGIpID8gKGEgKyBiKSA6IChiICsgYSAtIG1heCk7Cit9CisKKy8qIGRlc2NyaXB0b3IgZm9yIGEgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSB1c2VkIGZvciByaW5nICovCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgbGVuZ3RoOwkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl2b2lkICp2YTsgCS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCXU2NCBwYTsJCS8qIGJ1cyBhZGRyZXNzICovCit9IDsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHJpbmcgc2hhcmVkIGJldHdlZW4gaGFyZHdhcmUKKyAqIGFuZCBzb2Z0d2FyZS4gIEVhY2ggcmluZyBpcyBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlciBpbiB0aGUgdW5jYWNoZWQKKyAqIGV4dGVuc2lvbiBhbmQgbWFwcGVkIGludG8gQmxhZGVFbmdpbmUncyB1bmlmaWVkIHRhYmxlLgorICovCitzdHJ1Y3QgbXBfcmluZyB7CisJdTMyIHBhZ2VzOwkJLyogcXVldWUgc2l6ZSBpbiBwYWdlcyAqLworCXUzMiBpZDsJCQkvKiBxdWV1ZSBpZCBhc3NpZ25lZCBieSBiZWtsaWIgKi8KKwl1MzIgbnVtOwkJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHF1ZXVlICovCisJdTMyIGNpZHg7CQkvKiBjb25zdW1lciBpbmRleCAqLworCXUzMiBwaWR4OwkJLyogcHJvZHVjZXIgaW5kZXggLS0gbm90IHVzZWQgYnkgbW9zdCByaW5ncyAqLworCXUzMiBpdGVtU2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2Ygb25lIG9iamVjdCAqLworCisJdm9pZCAqdmE7CQkvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSByaW5nLgorCQkJCSAgIFRoaXMgc2hvdWxkIGJlIGxhc3QgdG8gYWxsb3cgMzIgJiA2NAorCQkJCSAgIGJpdCBkZWJ1Z2dlciBleHRlbnNpb25zIHRvIHdvcmsuICovCit9IDsKKworLyotLS0tLS0tLS0tLSAgYW1hcCBiaXQgZmlsZWQgZ2V0IC8gc2V0IG1hY3JvcyBhbmQgZnVuY3Rpb25zIC0tLS0tKi8KKy8qCisgKiBTdHJ1Y3R1cmVzIGRlZmluZWQgaW4gdGhlIG1hcCBoZWFkZXIgZmlsZXMgKHVuZGVyIGZ3L2FtYXAvKSB3aXRoIG5hbWVzCisgKiBpbiB0aGUgZm9ybWF0IEJFXzxuYW1lPl9BTUFQIGFyZSBwc2V1ZG8gc3RydWN0dXJlcyB3aXRoIG1lbWJlcnMKKyAqIG9mIHR5cGUgdTguIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHRlbXBsYXRlcyB0aGF0IGFyZSB1c2VkIGluCisgKiBjb25qdW50aW9uIHdpdGggdGhlIHN0cnVjdHVyZXMgd2l0aCBuYW1lcyBpbiB0aGUgZm9ybWF0CisgKiA8bmFtZT5fQU1BUCB0byBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcyBhbmQgYml0IG9mZnNldHMgdG8gZ2V0IG9yIHNldAorICogYml0IGZpZWxkcyBpbiBzdHJ1Y3R1cmVzLiBUaGUgc3RydWN0dXJlcyA8bmFtZT5fQU1BUCBhcmUgYXJyYXlzCisgKiBvZiAzMiBiaXRzIHdvcmRzIGFuZCBoYXZlIHRoZSBjb3JyZWN0IHNpemUuICBUaGUgZm9sbG93aW5nIG1hY3JvcworICogcHJvdmlkZSBjb252ZW5pZW50IHdheXMgdG8gZ2V0IGFuZCBzZXQgdGhlIHZhcmlvdXMgbWVtYmVycworICogaW4gdGhlIHN0cnVjdHVyZXMgd2l0aG91dCB1c2luZyBzdHJ1Y2N0dXJlcyB3aXRoIGJpdCBmaWVsZHMuCisgKiBBbHdheXMgdXNlIHRoZSBtYWNyb3MgQU1BUF9HRVRfQklUU19QVFIgYW5kIEFNQVBfU0VUX0JJVFNfUFRSCisgKiBtYWNyb3MgdG8gZXh0cmFjdCBhbmQgc2V0IHZhcmlvdXMgbWVtYmVycy4KKyAqLworCisvKgorICogUmV0dXJucyB0aGUgYSBiaXQgbWFzayBmb3IgdGhlIHJlZ2lzdGVyIHRoYXQgaXMgTk9UIHNoaWZ0ZWQgaW50byBsb2NhdGlvbi4KKyAqIFRoYXQgbWVhbnMgcmV0dXJuIHZhbHVlcyBhbHdheXMgbG9vayBsaWtlOiAweDEsIDB4RkYsIDB4N0ZGLCBldGMuLi4KKyAqLworc3RhdGljIGlubGluZSB1MzIgYW1hcF9tYXNrKHUzMiBiaXRfc2l6ZSkKK3sKKwlyZXR1cm4gYml0X3NpemUgPT0gMzIgPyAweEZGRkZGRkZGIDogKDEgPDwgYml0X3NpemUpIC0gMTsKK30KKworI2RlZmluZSBBTUFQX0JJVF9NQVNLKF9zdHJ1Y3RfLCBmaWVsZCkgICAgICAgXAorCWFtYXBfbWFzayhBTUFQX0JJVF9TSVpFKF9zdHJ1Y3RfLCBmaWVsZCkpCisKKy8qCisgKiBub24tb3B0aW1pemVkIHNldCBiaXRzIGZ1bmN0aW9uLiBGaXJzdCBjbGVhcnMgdGhlIGJpdHMgYW5kIHRoZW4gYXNzaWducyB0aGVtLgorICogVGhpcyBkb2VzIG5vdCByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgcGFydGljdWxhciBEV09SRCB5b3UgYXJlIHNldHRpbmcuCisgKiBlLmcuIEFNQVBfU0VUX0JJVFNfUFRSIChzdHJ1Y3QsIGZpZWxkMSwgJmNvbnRleHRNZW1vcnksIDEyMyk7CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYW1hcF9zZXQodm9pZCAqcHRyLCB1MzIgZHdfb2Zmc2V0LCB1MzIgbWFzaywgdTMyIG9mZnNldCwgdTMyIHZhbHVlKQoreworCXUzMiAqZHcgPSAodTMyICopcHRyOworCSooZHcgKyBkd19vZmZzZXQpICY9IH4obWFzayA8PCBvZmZzZXQpOworCSooZHcgKyBkd19vZmZzZXQpIHw9IChtYXNrICYgdmFsdWUpIDw8IG9mZnNldDsKK30KKworI2RlZmluZSBBTUFQX1NFVF9CSVRTX1BUUihfc3RydWN0XywgZmllbGQsIF9zdHJ1Y3RQdHJfLCB2YWwpCVwKKwlhbWFwX3NldChfc3RydWN0UHRyXywgQU1BUF9XT1JEX09GRlNFVChfc3RydWN0XywgZmllbGQpLFwKKwkJQU1BUF9CSVRfTUFTSyhfc3RydWN0XywgZmllbGQpLAkJCVwKKwkJQU1BUF9CSVRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCksIHZhbCkKKy8qCisgKiBOb24tb3B0aW1pemVkIHJvdXRpbmUgdGhhdCBnZXRzIHRoZSBiaXRzIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBEV09SRC4KKyAqIGUuZy4gZmllbGRWYWx1ZSA9IEFNQVBfR0VUX0JJVFNfUFRSIChzdHJ1Y3QsIGZpZWxkMSwgJmNvbnRleHRNZW1vcnkpOworICovCitzdGF0aWMgaW5saW5lIHUzMgorYW1hcF9nZXQodm9pZCAqcHRyLCB1MzIgZHdfb2Zmc2V0LCB1MzIgbWFzaywgdTMyIG9mZnNldCkKK3sKKwl1MzIgKmR3ID0gKHUzMiAqKXB0cjsKKwlyZXR1cm4gbWFzayAmICgqKGR3ICsgZHdfb2Zmc2V0KSA+PiBvZmZzZXQpOworfQorI2RlZmluZSBBTUFQX0dFVF9CSVRTX1BUUihfc3RydWN0XywgZmllbGQsIF9zdHJ1Y3RQdHJfKQkJCVwKKwlhbWFwX2dldChfc3RydWN0UHRyXywgQU1BUF9XT1JEX09GRlNFVChfc3RydWN0XywgZmllbGQpLAlcCisJCUFNQVBfQklUX01BU0soX3N0cnVjdF8sIGZpZWxkKSwJCQkJXAorCQlBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSkKKworLyogUmV0dXJucyAwLTMxIHJlcHJlc2VudGluZyBiaXQgb2Zmc2V0IHdpdGhpbiBhIERXT1JEIG9mIGEgYml0ZmllbGQuICovCisjZGVmaW5lIEFNQVBfQklUX09GRlNFVChfc3RydWN0XywgZmllbGQpICAgICAgICAgICAgICAgICAgXAorCShvZmZzZXRvZihzdHJ1Y3QgQkVfICMjIF9zdHJ1Y3RfICMjIF9BTUFQLCBmaWVsZCkgJSAzMikKKworLyogUmV0dXJucyAwLW4gcmVwcmVzZW50aW5nIERXT1JEIG9mZnNldCBvZiBiaXRmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdHVyZS4gKi8KKyNkZWZpbmUgQU1BUF9XT1JEX09GRlNFVChfc3RydWN0XywgZmllbGQpICBcCisJCSAgKG9mZnNldG9mKHN0cnVjdCBCRV8gIyMgX3N0cnVjdF8gIyMgX0FNQVAsIGZpZWxkKS8zMikKKworLyogUmV0dXJucyBzaXplIG9mIGJpdGZpZWxkIGluIGJpdHMuICovCisjZGVmaW5lIEFNQVBfQklUX1NJWkUoX3N0cnVjdF8sIGZpZWxkKSBcCisJCXNpemVvZigoKHN0cnVjdCBCRV8gIyMgX3N0cnVjdF8gIyMgX0FNQVAqKTApLT5maWVsZCkKKworc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSB7CisJdTE2IGxlbmd0aDsJCS8qIGJ5dGVzIGluIHJlc3BvbnNlICovCisJdTE2IGZ3Y21kX29mZnNldDsJLyogb2Zmc2V0IHdpdGhpbiB0aGUgd3JiIG9mIHRoZSByZXNwb25zZSAqLworCXZvaWQgKnZhOwkJLyogdXNlcidzIHZhIHRvIGNvcHkgcmVzcG9uc2UgaW50byAqLworCit9IDsKK3R5cGVkZWYgdm9pZCAoKm1jY193cmJfY3FlX2NhbGxiYWNrKSAodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cywKKwkJCQlzdHJ1Y3QgTUNDX1dSQl9BTUFQICpvcHRpb25hbF93cmIpOworc3RydWN0IGJlX21jY193cmJfY29udGV4dCB7CisKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbgorCQkJCQkJY29tcGxldGlvbiAqLworCXZvaWQgKmludGVybmFsX2NiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzCisJCQkJCQkgICB0byBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisKKwltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYjsJLyogRnVuY3Rpb24gdG8gY2FsbCBvbiBjb21wbGV0aW9uICovCisJdm9pZCAqY2JfY29udGV4dDsJLyogUGFyYW1ldGVyIHRvIHBhc3MgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJaW50ICp1c2Vyc19maW5hbF9zdGF0dXM7CS8qIHBvaW50ZXIgdG8gYSBsb2NhbAorCQkJCQkJdmFyaWFibGUgZm9yIHN5bmNocm9ub3VzCisJCQkJCQljb21tYW5kcyAqLworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYjsJLyogcG9pbnRlciB0byBvcmlnaW5hbCB3cmIgZm9yIGVtYmVkZGVkCisJCQkJCQljb21tYW5kcyBvbmx5ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OwkvKiBsaW5rcyBjb250ZXh0IHN0cnVjdHMgdG9nZXRoZXIgaW4KKwkJCQkgICBmcmVlIGxpc3QgKi8KKworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgY29weTsJLyogT3B0aW9uYWwgcGFyYW1ldGVycyB0byBjb3B5CisJCQkJCSAgIGVtYmVkZGVkIHJlc3BvbnNlIHRvIHVzZXIncyB2YSAqLworCisjaWYgZGVmaW5lZChCRV9ERUJVRykKKwl1MTYgc3Vic3lzdGVtLCBvcGNvZGU7CS8qIFRyYWNrIHRoaXMgRldDTUQgZm9yIGRlYnVnIGJ1aWxkcy4gKi8KKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICpyaW5nX3dyYjsKKwl1MzIgY29uc3VtZWRfY291bnQ7CisjZW5kaWYKK30gOworCisvKgorICAgIFJlcHJlc2VudHMgYSBmdW5jdGlvbiBvYmplY3QgZm9yIG5ldHdvcmsgb3Igc3RvcmFnZS4gIFRoaXMKKyAgICBpcyB1c2VkIHRvIG1hbmFnZSBwZXItZnVuY3Rpb24gcmVzb3VyY2VzIGxpa2UgTUNDIENRcywgZXRjLgorKi8KK3N0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgeworCisJdTMyIG1hZ2ljOwkJLyohPCBtYWdpYyBmb3IgZGV0ZWN0aW5nIG1lbW9yeSBjb3JydXB0aW9uLiAqLworCisJLyogUENJIEJBUiBtYXBwZWQgYWRkcmVzc2VzICovCisJdTggX19pb21lbSAqY3NyX3ZhOwkvKiBDU1IgKi8KKwl1OCBfX2lvbWVtICpkYl92YTsJLyogRG9vciBCZWxsICovCisJdTggX19pb21lbSAqcGNpX3ZhOwkvKiBQQ0kgY29uZmlnIHNwYWNlICovCisJdTMyIGVtdWxhdGU7CQkvKiBpZiBzZXQsIE1QVSBpcyBub3QgYXZhaWxhYmxlLgorCQkJCSAgRW11bGF0ZSBldmVyeXRoaW5nLiAgICAgKi8KKwl1MzIgcGVuZF9xdWV1ZV9kcml2aW5nOwkvKiBpZiBzZXQsIGRyaXZlIHRoZSBxdWV1ZWQgV1JCcworCQkJCSAgIGFmdGVyIHJlbGVhc2luZyB0aGUgV1JCIGxvY2sgKi8KKworCXNwaW5sb2NrX3QgcG9zdF9sb2NrOwkvKiBsb2NrIGZvciB2ZXJpZnlpbmcgb25lIHRocmVhZCBwb3N0aW5nIHdyYnMgKi8KKwlzcGlubG9ja190IGNxX2xvY2s7CS8qIGxvY2sgZm9yIHZlcmlmeWluZyBvbmUgdGhyZWFkCisJCQkJICAgcHJvY2Vzc2luZyBjcSAqLworCXNwaW5sb2NrX3QgbWNjX2NvbnRleHRfbG9jazsJLyogbG9jayBmb3IgcHJvdGVjdGluZyBtY2MKKwkJCQkJICAgY29udGV4dCBmcmVlIGxpc3QgKi8KKwl1bnNpZ25lZCBsb25nIHBvc3RfaXJxOworCXVuc2lnbmVkIGxvbmcgY3FfaXJxOworCisJdTMyIHR5cGU7CisJdTMyIHBjaV9mdW5jdGlvbl9udW1iZXI7CisKKwlzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjOwkvKiBtY2MgcmluZ3MuICovCisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCAqdmE7CS8qIFZBIHRvIHRoZSBtYWlsYm94ICovCisJCXU2NCBwYTsJLyogUEEgdG8gdGhlIG1haWxib3ggKi8KKwkJdTMyIGxlbmd0aDsJLyogYnl0ZSBsZW5ndGggb2YgbWFpbGJveCAqLworCisJCS8qIE9uZSBkZWZhdWx0IGNvbnRleHQgc3RydWN0IHVzZWQgZm9yIHBvc3RpbmcgYXQKKwkJICogbGVhc3Qgb25lIE1DQ19XUkIKKwkJICovCisJCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgZGVmYXVsdF9jb250ZXh0OworCQlib29sIGRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQ7CisJfSBtYWlsYm94OworCisJc3RydWN0IHsKKworCQkvKiBXYWtlIG9uIGxhbnMgY29uZmlndXJlZC4gKi8KKwkJdTMyIHdvbF9iaXRtYXNrOwkvKiBiaXRzIDAsMSwyLDMgYXJlIHNldCBpZgorCQkJCQkgICBjb3JyZXNwb25kaW5nIGluZGV4IGlzIGVuYWJsZWQgKi8KKwl9IGNvbmZpZzsKKworCisJc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyBmd19jb25maWc7Cit9IDsKKworLyoKKyAgICAgIFJlcHJlc2VudHMgYW4gRXZlbnQgUXVldWUKKyovCitzdHJ1Y3QgYmVfZXFfb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisJYXRvbWljX3QgcmVmX2NvdW50OworCisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGFyZW50X2Z1bmN0aW9uOworCisJc3RydWN0IGxpc3RfaGVhZCBlcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY3FfbGlzdF9oZWFkOworCisJdTMyIGVxX2lkOworCXZvaWQgKmNiX2NvbnRleHQ7CisKK30gOworCisvKgorICAgIE1hbmFnZXMgYSBjb21wbGV0aW9uIHF1ZXVlCisqLworc3RydWN0IGJlX2NxX29iamVjdCB7CisJdTMyIG1hZ2ljOworCWF0b21pY190IHJlZl9jb3VudDsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjcWxpc3RfZm9yX2VxOworCisJdm9pZCAqdmE7CisJdTMyIG51bV9lbnRyaWVzOworCisJdm9pZCAqY2JfY29udGV4dDsKKworCXUzMiBjcV9pZDsKKworfSA7CisKKy8qCisgICAgTWFuYWdlcyBhbiBldGhlcm5ldCBzZW5kIHF1ZXVlCisqLworc3RydWN0IGJlX2V0aHNxX29iamVjdCB7CisJdTMyIG1hZ2ljOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGFyZW50X2Z1bmN0aW9uOworCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdDsKKwl1MzIgYmlkOworCit9IDsKKworLyoKK0BicmllZgorICAgIE1hbmFnZXMgYW4gZXRoZXJuZXQgcmVjZWl2ZSBxdWV1ZQorKi8KK3N0cnVjdCBiZV9ldGhycV9vYmplY3QgeworCXUzMiBtYWdpYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGFyZW50X2Z1bmN0aW9uOworCXUzMiByaWQ7CisJc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0OworCXN0cnVjdCBiZV9jcV9vYmplY3QgKnJzc19jcV9vYmplY3RbNF07CisKK30gOworCisvKgorICAgIE1hbmFnZXMgYW4gTUNDCisqLwordHlwZWRlZiB2b2lkICgqbWNjX2FzeW5jX2V2ZW50X2NhbGxiYWNrKSAodm9pZCAqY29udGV4dCwgdTMyIGV2ZW50X2NvZGUsCisJCQkJdm9pZCAqZXZlbnQpOworc3RydWN0IGJlX21jY19vYmplY3QgeworCXUzMiBtYWdpYzsKKworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBhcmVudF9mdW5jdGlvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1jY19saXN0OworCisJc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0OworCisJLyogQXN5bmMgZXZlbnQgY2FsbGJhY2sgZm9yIE1DQyBDUS4gKi8KKwltY2NfYXN5bmNfZXZlbnRfY2FsbGJhY2sgYXN5bmNfY2I7CisJdm9pZCAqYXN5bmNfY29udGV4dDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmJhc2U7CisJCXUzMiBudW07CisJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOworCX0gd3JiX2NvbnRleHQ7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgcmluZ19kZXNjICpyZDsKKwkJc3RydWN0IG1wX3JpbmcgcmluZzsKKwl9IHNxOworCisJc3RydWN0IHsKKwkJc3RydWN0IG1wX3JpbmcgcmluZzsKKwl9IGNxOworCisJdTMyIHByb2Nlc3Npbmc7CQkvKiBmbGFnIGluZGljYXRpbmcgdGhhdCBvbmUgdGhyZWFkCisJCQkJICAgaXMgcHJvY2Vzc2luZyBDUSAqLworCXUzMiByZWFybTsJCS8qIGRvb3JiZWxsIHJlYXJtIHNldHRpbmcgdG8gbWFrZQorCQkJCSAgIHN1cmUgdGhlIGFjdGl2ZSBwcm9jZXNzaW5nIHRocmVhZCAqLworCS8qIHJlYXJtcyB0aGUgQ1EgaWYgYW55IG9mIHRoZSB0aHJlYWRzIHJlcXVlc3RlZCBpdC4gKi8KKworCXN0cnVjdCBsaXN0X2hlYWQgYmFja2xvZzsKKwl1MzIgYmFja2xvZ19sZW5ndGg7CisJdTMyIGRyaXZpbmdfYmFja2xvZzsKKwl1MzIgY29uc3VtZWRfaW5kZXg7CisKK30gOworCisKKy8qIFF1ZXVlIGNvbnRleHQgaGVhZGVyIC0tIHRoZSByZXF1aXJlZCBzb2Z0d2FyZSBpbmZvcm1hdGlvbiBmb3IKKyAqIHF1ZXVlaW5nIGEgV1JCLgorICovCitzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgeworCW1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiOwkvKiBGdW5jdGlvbiB0byBjYWxsIG9uCisJCQkJCQkgICBjb21wbGV0aW9uICovCisJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dDsJLyogUGFyYW1ldGVyIHRvIHBhc3MKKwkJCQkJCSAgIHRvIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKworCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiOwkvKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNvbXBsZXRpb24gKi8KKwl2b2lkICpjYl9jb250ZXh0OwkvKiBQYXJhbWV0ZXIgdG8gcGFzcyB0byBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IGNvcHk7CS8qIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY29weQorCQkJCQkgICBlbWJlZGRlZCByZXNwb25zZSB0byB1c2VyJ3MgdmEgKi8KKwl2b2lkICpvcHRpb25hbF9md2NtZF92YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGJ5dGVzOworfSA7CisKKy8qCisgKiBDb21tb24gTUNDIFdSQiBoZWFkZXIgdGhhdCBhbGwgY29tbWFuZHMgcmVxdWlyZS4KKyAqLworc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHsKKwl1OCByc3ZkW29mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzhdOworfSA7CisKKy8qCisgKiBBbGwgbm9uIGVtYmVkZGVkIGNvbW1hbmRzIHN1cHBvcnRlZCBieSBod2xpYiBmdW5jdGlvbnMgb25seSBhbGxvdworICogMSBTR0UuICBUaGlzIHF1ZXVlIGNvbnRleHQgaGFuZGxlcyB0aGVtIGFsbC4KKyAqLworc3RydWN0IGJlX25vbmVtYmVkZGVkX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IE1DQ19TR0VfQU1BUCBzZ2VbMV07Cit9IDsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWMgcXVldWUgc3RydWN0IGZvciBlYWNoIGNvbW1hbmQuCisgKiAgVGhlIHVzZXIgY291bGQgYWx3YXlzIHByb3ZpZGUgYSBiZV9nZW5lcmljX3FfY3R4dCBidXQgdGhpcyBpcyBhCisgKiAgcmF0aGVyIGxhcmdlIHN0cnVjdC4gIEJ5IHVzaW5nIHRoZSBzcGVjaWZpYyBzdHJ1Y3QsIG1lbW9yeSBjb25zdW1wdGlvbgorICogIGNhbiBiZSByZWR1Y2VkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RydWN0IGJlX2xpbmtfc3RhdHVzX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZIGZ3Y21kOworfSA7CisKK3N0cnVjdCBiZV9tdWx0aWNhc3RfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCBmd2NtZDsKK30gOworCisKK3N0cnVjdCBiZV92bGFuX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHIGZ3Y21kOworfSA7CisKK3N0cnVjdCBiZV9wcm9taXNjdW91c19xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9FVEhfUFJPTUlTQ1VPVVMgZndjbWQ7Cit9IDsKKworc3RydWN0IGJlX2ZvcmNlX2ZhaWxvdmVyX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9GT1JDRV9GQUlMT1ZFUiBmd2NtZDsKK30gOworCisKK3N0cnVjdCBiZV9yeGZfZmlsdGVyX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfZXFfbW9kaWZ5X2RlbGF5X3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9NT0RJRllfRVFfREVMQVkgZndjbWQ7Cit9IDsKKworLyoKKyAqIFRoZSBnZW5lcmljIGNvbnRleHQgaXMgdGhlIGxhcmdlc3Qgc2l6ZSB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkLgorICogSXQgaXMgdGhlIHNvZnR3YXJlIGNvbnRleHQgcGx1cyBhbiBlbnRpcmUgV1JCLgorICovCitzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCBwYXlsb2FkOworfSA7CisKKy8qCisgKiBUeXBlcyBmb3IgdGhlIEJFX1FVRVVFX0NPTlRFWFQgb2JqZWN0LgorICovCisjZGVmaW5lIEJFX1FVRVVFX0lOVkFMSUQJKDApCisjZGVmaW5lIEJFX1FVRVVFX0xJTktfU1RBVFVTCSgweEEwMDYpCisjZGVmaW5lIEJFX1FVRVVFX0VUSF9TVEFUUwkoMHhBMDA3KQorI2RlZmluZSBCRV9RVUVVRV9UUE1fU1RBVFMJKDB4QTAwOCkKKyNkZWZpbmUgQkVfUVVFVUVfVENQX1NUQVRTCSgweEEwMDkpCisjZGVmaW5lIEJFX1FVRVVFX01VTFRJQ0FTVAkoMHhBMDBBKQorI2RlZmluZSBCRV9RVUVVRV9WTEFOCQkoMHhBMDBCKQorI2RlZmluZSBCRV9RVUVVRV9SU1MJCSgweEEwMEMpCisjZGVmaW5lIEJFX1FVRVVFX0ZPUkNFX0ZBSUxPVkVSCSgweEEwMEQpCisjZGVmaW5lIEJFX1FVRVVFX1BST01JU0NVT1VTCSgweEEwMEUpCisjZGVmaW5lIEJFX1FVRVVFX1dBS0VfT05fTEFOCSgweEEwMEYpCisjZGVmaW5lIEJFX1FVRVVFX05PUAkJKDB4QTAxMCkKKworLyogLS0tIEJFX0ZVTkNUSU9OX0VOVU0gLS0tICovCisjZGVmaW5lIEJFX0ZVTkNUSU9OX1RZUEVfSVNDU0kgICAgICAgICAgKDApCisjZGVmaW5lIEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSyAgICAgICAgKDEpCisjZGVmaW5lIEJFX0ZVTkNUSU9OX1RZUEVfQVJNICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBCRV9FVEhfVFhfUklOR19UWVBFX0VOVU0gLS0tICovCisjZGVmaW5lIEJFX0VUSF9UWF9SSU5HX1RZUEVfRk9SV0FSRElORyAgKDEpIAkvKiBFdGhlciByaW5nIGZvciBmb3J3YXJkaW5nICovCisjZGVmaW5lIEJFX0VUSF9UWF9SSU5HX1RZUEVfU1RBTkRBUkQgICAgKDIpCS8qIEV0aGVyIHJpbmcgZm9yIHNlbmRpbmcgKi8KKwkJCQkJCS8qIG5ldHdvcmsgcGFja2V0cy4gKi8KKyNkZWZpbmUgQkVfRVRIX1RYX1JJTkdfVFlQRV9CT1VORCAgICAgICAoMykJLyogRXRoZXJuZXQgcmluZyBmb3Igc2VuZGluZyAqLworCQkJCQkJLyogbmV0d29yayBwYWNrZXRzLCBib3VuZCAqLworCQkJCQkJLyogdG8gYSBwaHlzaWNhbCBwb3J0LiAqLworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgQVBJIE1BQ1JPUworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSAgICAgc3RydWN0IEZXQ01EXyMjX3Nob3J0X25hbWVfCisjZGVmaW5lIEJFX09QQ09ERV9OQU1FKF9zaG9ydF9uYW1lXykgICAgT1BDT0RFXyMjX3Nob3J0X25hbWVfCisjZGVmaW5lIEJFX1NVQlNZU1RFTV9OQU1FKF9zaG9ydF9uYW1lXykgU1VCU1lTVEVNXyMjX3Nob3J0X25hbWVfCisKKworI2RlZmluZSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKF9wZm9iXywgX3dyYl8sIF9zaG9ydF9uYW1lXykJXAorCSgoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pICopCQkJCVwKKwliZV9mdW5jdGlvbl9wcmVwYXJlX2VtYmVkZGVkX2Z3Y21kKF9wZm9iXywgX3dyYl8sCVwKKwkJc2l6ZW9mKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSksCQlcCisJCUZJRUxEX1NJWkVPRihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXyksIHBhcmFtcy5yZXF1ZXN0KSwgXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVzcG9uc2UpLCBcCisJCUJFX09QQ09ERV9OQU1FKF9zaG9ydF9uYW1lXyksCQkJCVwKKwkJQkVfU1VCU1lTVEVNX05BTUUoX3Nob3J0X25hbWVfKSkpOworCisjZGVmaW5lIEJFX1BSRVBBUkVfTk9ORU1CRURERURfRldDTUQoX3Bmb2JfLCBfd3JiXywgX2l2YV8sIF9pcGFfLCBfc2hvcnRfbmFtZV8pXAorCSgoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pICopCQkJCVwKKwliZV9mdW5jdGlvbl9wcmVwYXJlX25vbmVtYmVkZGVkX2Z3Y21kKF9wZm9iXywgX3dyYl8sIChfaXZhXyksIChfaXBhXyksIFwKKwkJc2l6ZW9mKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSksCQlcCisJCUZJRUxEX1NJWkVPRihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXyksIHBhcmFtcy5yZXF1ZXN0KSwgXAorCQlGSUVMRF9TSVpFT0YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pLCBwYXJhbXMucmVzcG9uc2UpLCBcCisJCUJFX09QQ09ERV9OQU1FKF9zaG9ydF9uYW1lXyksCQkJCVwKKwkJQkVfU1VCU1lTVEVNX05BTUUoX3Nob3J0X25hbWVfKSkpOworCitpbnQgYmVfZnVuY3Rpb25fb2JqZWN0X2NyZWF0ZSh1OCBfX2lvbWVtICpjc3JfdmEsIHU4IF9faW9tZW0gKmRiX3ZhLAorCXU4IF9faW9tZW0gKnBjaV92YSwgdTMyIGZ1bmN0aW9uX3R5cGUsIHN0cnVjdCByaW5nX2Rlc2MgKm1haWxib3hfcmQsCisJICBzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKworaW50IGJlX2Z1bmN0aW9uX29iamVjdF9kZXN0cm95KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworaW50IGJlX2Z1bmN0aW9uX2NsZWFudXAoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKKworaW50IGJlX2Z1bmN0aW9uX2dldF9md192ZXJzaW9uKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTl9SRVNQT05TRV9QQVlMT0FEICpmd192ZXJzaW9uLAorCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KTsKKworCitpbnQgYmVfZXFfbW9kaWZ5X2RlbGF5KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHUzMiBudW1fZXEsIHN0cnVjdCBiZV9lcV9vYmplY3QgKiplcV9hcnJheSwKKwkJICAgdTMyICplcV9kZWxheV9hcnJheSwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9lcV9tb2RpZnlfZGVsYXlfcV9jdHh0ICpxX2N0eHQpOworCisKKworaW50IGJlX2VxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSAgICAgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBlcWVfc2l6ZSwgdTMyIG51bV9lbnRyaWVzLAorCSAgICAgdTMyIHdhdGVybWFyaywgdTMyIHRpbWVyX2RlbGF5LCBzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3QpOworCitpbnQgYmVfZXFfZGVzdHJveShzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcSk7CisKK2ludCBiZV9jcV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwKKwlib29sIHNvbGljaXRlZF9ldmVudGFibGUsIGJvb2wgbm9fZGVsYXksCisJdTMyIHdtX3RocmVzaCwgc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0LAorCXN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCk7CisKK2ludCBiZV9jcV9kZXN0cm95KHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxKTsKKworaW50IGJlX21jY19yaW5nX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aCwKKwkJICAgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dF9hcnJheSwKKwkJICAgdTMyIG51bV9jb250ZXh0X2VudHJpZXMsCisJCSAgIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxLCBzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKTsKK2ludCBiZV9tY2NfcmluZ19kZXN0cm95KHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2Nfb2JqZWN0KTsKKworaW50IGJlX21jY19wcm9jZXNzX2NxKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2Nfb2JqZWN0LCBib29sIHJlYXJtKTsKKworaW50IGJlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soc3RydWN0IGJlX21jY19vYmplY3QgKm1jY19vYmplY3QsCisJCW1jY19hc3luY19ldmVudF9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCk7CisKK2ludCBiZV9wY2lfc29mdF9yZXNldChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKworCitpbnQgYmVfZHJpdmVfUE9TVChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKworCitpbnQgYmVfZXRoX3NxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGxlbmd0aF9pbl9ieXRlcywKKwkJdTMyIHR5cGUsIHUzMiB1bHAsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCwKKwkJc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKTsKKworc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzIHsKKwl1MzIgcG9ydDsKKwl1MzIgcnN2ZDBbMl07Cit9IDsKKworaW50IGJlX2V0aF9zcV9jcmVhdGVfZXgoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoX2luX2J5dGVzLAorCQkgICAgdTMyIHR5cGUsIHUzMiB1bHAsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCwKKwkJICAgIHN0cnVjdCBiZV9ldGhfc3FfcGFyYW1ldGVycyAqZXhfcGFyYW1ldGVycywKKwkJICAgIHN0cnVjdCBiZV9ldGhzcV9vYmplY3QgKmV0aF9zcSk7CitpbnQgYmVfZXRoX3NxX2Rlc3Ryb3koc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKTsKKworaW50IGJlX2V0aF9zZXRfZmxvd19jb250cm9sKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlib29sIHR4ZmNfZW5hYmxlLCBib29sIHJ4ZmNfZW5hYmxlKTsKKworaW50IGJlX2V0aF9nZXRfZmxvd19jb250cm9sKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlib29sICp0eGZjX2VuYWJsZSwgYm9vbCAqcnhmY19lbmFibGUpOworaW50IGJlX2V0aF9zZXRfcW9zKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiBtYXhfYnBzLCB1MzIgbWF4X3Bwcyk7CisKK2ludCBiZV9ldGhfZ2V0X3FvcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgKm1heF9icHMsIHUzMiAqbWF4X3Bwcyk7CisKK2ludCBiZV9ldGhfc2V0X2ZyYW1lX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICAgdTMyICp0eF9mcmFtZV9zaXplLCB1MzIgKnJ4X2ZyYW1lX3NpemUpOworCitpbnQgYmVfZXRoX3JxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCwKKwkJIHN0cnVjdCBiZV9jcV9vYmplY3QgKmJjbWNfY3Ffb2JqZWN0LAorCQkgc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxKTsKKworaW50IGJlX2V0aF9ycV9kZXN0cm95KHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSk7CisKK2ludCBiZV9ldGhfcnFfZGVzdHJveV9vcHRpb25zKHN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSwgYm9vbCBmbHVzaCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpOworaW50IGJlX2V0aF9ycV9zZXRfZnJhZ19zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXUzMiBuZXdfZnJhZ19zaXplX2J5dGVzLCB1MzIgKmFjdHVhbF9mcmFnX3NpemVfYnl0ZXMpOworaW50IGJlX2V0aF9ycV9nZXRfZnJhZ19zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkJCQl1MzIgKmZyYWdfc2l6ZV9ieXRlcyk7CisKK3ZvaWQgKmJlX2Z1bmN0aW9uX3ByZXBhcmVfZW1iZWRkZWRfZndjbWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLAorCQkgICB1MzIgcGF5bG9hZF9sZW5ndGgsIHUzMiByZXF1ZXN0X2xlbmd0aCwKKwkJICAgdTMyIHJlc3BvbnNlX2xlbmd0aCwgdTMyIG9wY29kZSwgdTMyIHN1YnN5c3RlbSk7Cit2b2lkICpiZV9mdW5jdGlvbl9wcmVwYXJlX25vbmVtYmVkZGVkX2Z3Y21kKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCB2b2lkICpmd2NtZF9oZWFkZXJfdmEsIHU2NCBmd2NtZF9oZWFkZXJfcGEsCisJdTMyIHBheWxvYWRfbGVuZ3RoLCB1MzIgcmVxdWVzdF9sZW5ndGgsIHUzMiByZXNwb25zZV9sZW5ndGgsCisJdTMyIG9wY29kZSwgdTMyIHN1YnN5c3RlbSk7CisKKworc3RydWN0IE1DQ19XUkJfQU1BUCAqCitiZV9mdW5jdGlvbl9wZWVrX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKK2ludCBiZV9yeGZfbWFjX2FkZHJlc3NfcmVhZF93cml0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSAgICAgIGJvb2wgcG9ydDEsIGJvb2wgbWFjMSwgYm9vbCBtZ210LAorCSAgICAgIGJvb2wgd3JpdGUsIGJvb2wgcGVybWFuZW50LCB1OCAqbWFjX2FkZHJlc3MsCisJICAgICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJICAgICAgdm9pZCAqY2JfY29udGV4dCk7CisKK2ludCBiZV9yeGZfbXVsdGljYXN0X2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCBwcm9taXNjdW91cywgdTMyIG51bSwgdTggKm1hY190YWJsZSwKKwkJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkJdm9pZCAqY2JfY29udGV4dCwKKwkJCXN0cnVjdCBiZV9tdWx0aWNhc3RfcV9jdHh0ICpxX2N0eHQpOworCitpbnQgYmVfcnhmX3ZsYW5fY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJICAgYm9vbCBwcm9taXNjdW91cywgdTMyIG51bSwgdTE2ICp2bGFuX3RhZ19hcnJheSwKKwkgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkgICBzdHJ1Y3QgYmVfdmxhbl9xX2N0eHQgKnFfY3R4dCk7CisKKworaW50IGJlX3J4Zl9saW5rX3N0YXR1cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBzdHJ1Y3QgQkVfTElOS19TVEFUVVMgKmxpbmtfc3RhdHVzLAorCQkgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgc3RydWN0IGJlX2xpbmtfc3RhdHVzX3FfY3R4dCAqcV9jdHh0KTsKKworCitpbnQgYmVfcnhmX3F1ZXJ5X2V0aF9zdGF0aXN0aWNzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBGV0NNRF9FVEhfR0VUX1NUQVRJU1RJQ1MgKnZhX2Zvcl9md2NtZCwKKwkJdTY0IHBhX2Zvcl9md2NtZCwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCXZvaWQgKmNiX2NvbnRleHQsCisJCXN0cnVjdCBiZV9ub25lbWJlZGRlZF9xX2N0eHQgKnFfY3R4dCk7CisKK2ludCBiZV9yeGZfcHJvbWlzY3VvdXMoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgYm9vbCBlbmFibGVfcG9ydDAsIGJvb2wgZW5hYmxlX3BvcnQxLAorCQkgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgc3RydWN0IGJlX3Byb21pc2N1b3VzX3FfY3R4dCAqcV9jdHh0KTsKKworCitpbnQgYmVfcnhmX2ZpbHRlcl9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICBzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgKnNldHRpbmdzLAorCQkgICAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgICAgc3RydWN0IGJlX3J4Zl9maWx0ZXJfcV9jdHh0ICpxX2N0eHQpOworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgYnkgaHdsaWIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKworaW50IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgICAgdTMyIGlkLCB1MzIgcmluZ190eXBlLCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgICAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJICAgICAgIHZvaWQgKmludGVybmFsX2NhbGxiYWNrX2NvbnRleHQpOworCitpbnQgYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwkJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBpbnRlcm5hbF9jYiwKKwkJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dCwgdm9pZCAqb3B0aW9uYWxfZndjbWRfdmEsCisJCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgKnJlc3BvbnNlX2NvcHkpOworCitpbnQgYmVfZnVuY3Rpb25fcXVldWVfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJICBzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dCk7CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBNQ0MgUVVFVUUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBiZV9tcHVfaW5pdF9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHN0cnVjdCByaW5nX2Rlc2MgKnJkKTsKKworCitzdHJ1Y3QgTUNDX1dSQl9BTUFQICoKK19iZV9tcHVfcGVla19yaW5nX3dyYihzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLCBib29sIGRyaXZpbmdfcXVldWUpOworCitzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICoKK19iZV9tY2NfYWxsb2NhdGVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CisKK3ZvaWQgX2JlX21jY19mcmVlX3dyYl9jb250ZXh0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dCk7CisKK2ludCBfYmVfbXB1X3Bvc3Rfd3JiX21haWxib3goc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCk7CisKK2ludCBfYmVfbXB1X3Bvc3Rfd3JiX3Jpbmcoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KTsKKwordm9pZCBiZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MpOworCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBSaW5nIFNpemVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGlubGluZSB1MzIgYmVfcmluZ19lbmNvZGluZ190b19sZW5ndGgodTMyIGVuY29kaW5nLCB1MzIgb2JqZWN0X3NpemUpCit7CisKKwlBU1NFUlQoZW5jb2RpbmcgIT0gMSk7CS8qIDEgaXMgcnN2ZCAqLworCUFTU0VSVChlbmNvZGluZyA8IDE2KTsKKwlBU1NFUlQob2JqZWN0X3NpemUgPiAwKTsKKworCWlmIChlbmNvZGluZyA9PSAwKQkvKiAzMmsgZGVlcCAqLworCQllbmNvZGluZyA9IDE2OworCisJcmV0dXJuICgxIDw8IChlbmNvZGluZyAtIDEpKSAqIG9iamVjdF9zaXplOworfQorCitzdGF0aWMgaW5saW5lCit1MzIgYmVfcmluZ19sZW5ndGhfdG9fZW5jb2RpbmcodTMyIGxlbmd0aF9pbl9ieXRlcywgdTMyIG9iamVjdF9zaXplKQoreworCisJdTMyIGNvdW50LCBlbmNvZGluZzsKKworCUFTU0VSVChvYmplY3Rfc2l6ZSA+IDApOworCUFTU0VSVChsZW5ndGhfaW5fYnl0ZXMgJSBvYmplY3Rfc2l6ZSA9PSAwKTsKKworCWNvdW50ID0gbGVuZ3RoX2luX2J5dGVzIC8gb2JqZWN0X3NpemU7CisKKwlBU1NFUlQoY291bnQgPiAxKTsKKwlBU1NFUlQoY291bnQgPD0gMzIgKiAxMDI0KTsKKwlBU1NFUlQobGVuZ3RoX2luX2J5dGVzIDw9IDggKiBQQUdFX1NJWkUpOyAvKiBtYXggcmluZyBzaXplIGluIFVUICovCisKKwllbmNvZGluZyA9IF9faWxvZzJfdTMyKGNvdW50KSArIDE7CisKKwlpZiAoZW5jb2RpbmcgPT0gMTYpCisJCWVuY29kaW5nID0gMDsJLyogMzJrIGRlZXAgKi8KKworCXJldHVybiBlbmNvZGluZzsKK30KKwordm9pZCBiZV9yZF90b19wYV9saXN0KHN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgUEhZU19BRERSICpwYV9saXN0LAorCQkJCQkJdTMyIG1heF9udW0pOworI2VuZGlmIC8qIF9faHdsaWJfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5Y2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuYwpAQCAtMCwwICsxLDEzNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKworc3RhdGljCitpbmxpbmUgdm9pZCBtcF9yaW5nX2NyZWF0ZShzdHJ1Y3QgbXBfcmluZyAqcmluZywgdTMyIG51bSwgdTMyIHNpemUsIHZvaWQgKnZhKQoreworCUFTU0VSVChyaW5nKTsKKwltZW1zZXQocmluZywgMCwgc2l6ZW9mKHN0cnVjdCBtcF9yaW5nKSk7CisJcmluZy0+bnVtID0gbnVtOworCXJpbmctPnBhZ2VzID0gRElWX1JPVU5EX1VQKG51bSAqIHNpemUsIFBBR0VfU0laRSk7CisJcmluZy0+aXRlbVNpemUgPSBzaXplOworCXJpbmctPnZhID0gdmE7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW50ZXJmYWNlIGZvciAyIGluZGV4IHJpbmdzLiBpLmUuIGNvbnN1bWVyL3Byb2R1Y2VyIHJpbmdzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFJldHVybnMgbnVtYmVyIGl0ZW1zIHBlbmRpbmcgb24gcmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1wX3JpbmdfbnVtX3BlbmRpbmcoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCWlmIChyaW5nLT5udW0gPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJlX3N1YmMocmluZy0+cGlkeCwgcmluZy0+Y2lkeCwgcmluZy0+bnVtKTsKK30KKworLyogUmV0dXJucyBudW1iZXIgaXRlbXMgZnJlZSBvbiByaW5nLiAqLworc3RhdGljIGlubGluZSB1MzIgbXBfcmluZ19udW1fZW1wdHkoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCXJldHVybiByaW5nLT5udW0gLSAxIC0gbXBfcmluZ19udW1fcGVuZGluZyhyaW5nKTsKK30KKworLyogQ29uc3VtZSAxIGl0ZW0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtcF9yaW5nX2NvbnN1bWUoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChyaW5nLT5waWR4ICE9IHJpbmctPmNpZHgpOworCisJcmluZy0+Y2lkeCA9IGJlX2FkZGMocmluZy0+Y2lkeCwgMSwgcmluZy0+bnVtKTsKK30KKworLyogUHJvZHVjZSAxIGl0ZW0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtcF9yaW5nX3Byb2R1Y2Uoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCXJpbmctPnBpZHggPSBiZV9hZGRjKHJpbmctPnBpZHgsIDEsIHJpbmctPm51bSk7Cit9CisKKy8qIENvbnN1bWUgY291bnQgaXRlbXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtcF9yaW5nX2NvbnN1bWVfbXVsdGlwbGUoc3RydWN0IG1wX3JpbmcgKnJpbmcsIHUzMiBjb3VudCkKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKG1wX3JpbmdfbnVtX3BlbmRpbmcocmluZykgPj0gY291bnQpOworCXJpbmctPmNpZHggPSBiZV9hZGRjKHJpbmctPmNpZHgsIGNvdW50LCByaW5nLT5udW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKm1wX3JpbmdfaXRlbShzdHJ1Y3QgbXBfcmluZyAqcmluZywgdTMyIGluZGV4KQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQoaW5kZXggPCByaW5nLT5udW0pOworCUFTU0VSVChyaW5nLT5pdGVtU2l6ZSA+IDApOworCXJldHVybiAodTggKikgcmluZy0+dmEgKyBpbmRleCAqIHJpbmctPml0ZW1TaXplOworfQorCisvKiBQdHIgdG8gcHJvZHVjZSBpdGVtICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm1wX3JpbmdfcHJvZHVjZXJfcHRyKHN0cnVjdCBtcF9yaW5nICpyaW5nKQoreworCUFTU0VSVChyaW5nKTsKKwlyZXR1cm4gbXBfcmluZ19pdGVtKHJpbmcsIHJpbmctPnBpZHgpOworfQorCisvKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIHJpbmcuCisgKiBUaGlzIGlzIHVzZWQgZm9yIHJpbmdzIHdpdGggMSBpbmRleC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX2N1cnJlbnQoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChyaW5nLT5waWR4ID09IDApOwkvKiBub3QgdXNlZCAqLworCisJcmV0dXJuIG1wX3JpbmdfaXRlbShyaW5nLCByaW5nLT5jaWR4KTsKK30KKworLyoKKyAqIEluY3JlbWVudCBpbmRleCBmb3IgcmluZ3Mgd2l0aCBvbmx5IDEgaW5kZXguCisgKiBUaGlzIGlzIHVzZWQgZm9yIHJpbmdzIHdpdGggMSBpbmRleC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICptcF9yaW5nX25leHQoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChyaW5nLT5udW0gPiAwKTsKKwlBU1NFUlQocmluZy0+cGlkeCA9PSAwKTsJLyogbm90IHVzZWQgKi8KKworCXJpbmctPmNpZHggPSBiZV9hZGRjKHJpbmctPmNpZHgsIDEsIHJpbmctPm51bSk7CisJcmV0dXJuIG1wX3JpbmdfY3VycmVudChyaW5nKTsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgd2FpdHMgZm9yIGEgcHJldmlvdXNseSBwb3N0ZWQgbWFpbGJveCBXUkIgdG8gYmUgY29tcGxldGVkLgorICAgIFNwZWNpZmljYWxseSBpdCB3YWl0cyBmb3IgdGhlIG1haWxib3ggdG8gc2F5IHRoYXQgaXQncyByZWFkeSB0byBhY2NlcHQKKyAgICBtb3JlIGRhdGEgYnkgc2V0dGluZyB0aGUgTFNCIG9mIHRoZSBtYWlsYm94IHBkIHJlZ2lzdGVyIHRvIDEuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBwb3N0IHRoaXMgZGF0YSB0bworCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworc3RhdGljIHZvaWQgYmVfbWNjX21haWxib3hfd2FpdChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNUFVfTUFJTEJPWF9EQl9BTUFQIG1haWxib3hfZGI7CisJdTMyIGkgPSAwOworCXUzMiByZWFkeTsKKworCWlmIChwZm9iLT5lbXVsYXRlKSB7CisJCS8qIE5vIHdhaXRpbmcgZm9yIG1haWxib3ggaW4gZW11bGF0ZWQgbW9kZS4gKi8KKwkJcmV0dXJuOworCX0KKworCW1haWxib3hfZGIuZHdbMF0gPSBQRF9SRUFEKHBmb2IsIG1jY19ib290c3RyYXBfZGIpOworCXJlYWR5ID0gQU1BUF9HRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIHJlYWR5LCAmbWFpbGJveF9kYik7CisKKwl3aGlsZSAocmVhZHkgPT0gZmFsc2UpIHsKKwkJaWYgKCgrK2kgJiAweDNGRkZGKSA9PSAwKSB7CisJCQlUUkFDRShETF9XQVJOLCAiV2FpdGluZyBmb3IgbWFpbGJveCByZWFkeSAtICVkayBwb2xscyIsCisJCQkJCQkJCWkgLyAxMDAwKTsKKwkJfQorCQl1ZGVsYXkoMSk7CisJCW1haWxib3hfZGIuZHdbMF0gPSBQRF9SRUFEKHBmb2IsIG1jY19ib290c3RyYXBfZGIpOworCQlyZWFkeSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCByZWFkeSwgJm1haWxib3hfZGIpOworCX0KK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgdGVsbHMgdGhlIE1DQyBtYWlsYm94IHRoYXQgdGhlcmUgaXMgZGF0YSB0byBwcm9jZXNzZWQKKyAgICBpbiB0aGUgbWFpbGJveC4gSXQgZG9lcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZQorICAgIG1haWxib3ggbG9jYXRpb24gYW5kIGNsZWFyaW5nIHRoZSBMU0IuICBUaGlzIHJvdXRpbmUgcmV0dXJucyBpbW1lZGlhdGVseQorICAgIGFuZCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgV1JCIHRvIGJlIHByb2Nlc3NlZC4KKworICAgIHBjb250cm9sbGVyICAgICAgLSBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIHBvc3QgdGhpcyBkYXRhIHRvCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKworKi8KK3N0YXRpYyB2b2lkIGJlX21jY19tYWlsYm94X25vdGlmeShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNUFVfTUFJTEJPWF9EQl9BTUFQIG1haWxib3hfZGI7CisJdTMyIHBhOworCisJQVNTRVJUKHBmb2ItPm1haWxib3gucGEpOworCUFTU0VSVChwZm9iLT5tYWlsYm94LnZhKTsKKworCS8qIElmIGVtdWxhdGVkLCBkbyBub3QgcmluZyB0aGUgbWFpbGJveCAqLworCWlmIChwZm9iLT5lbXVsYXRlKSB7CisJCVRSQUNFKERMX1dBUk4sICJNUFUgZGlzYWJsZWQuIFNraXBwaW5nIG1haWxib3ggbm90aWZ5LiIpOworCQlyZXR1cm47CisJfQorCisJLyogZm9ybSB0aGUgaGlnaGVyIGJpdHMgaW4gdGhlIGFkZHJlc3MgKi8KKwltYWlsYm94X2RiLmR3WzBdID0gMDsJLyogaW5pdCAqLworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCBoaSwgJm1haWxib3hfZGIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCByZWFkeSwgJm1haWxib3hfZGIsIDApOworCisJLyogYml0cyAzNCB0byA2MyAqLworCXBhID0gKHUzMikgKHBmb2ItPm1haWxib3gucGEgPj4gMzQpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCBhZGRyZXNzLCAmbWFpbGJveF9kYiwgcGEpOworCisJLyogV2FpdCBmb3IgdGhlIE1QVSB0byBiZSByZWFkeSAqLworCWJlX21jY19tYWlsYm94X3dhaXQocGZvYik7CisKKwkvKiBSaW5nIGRvb3JiZWxsIDFzdCB0aW1lICovCisJUERfV1JJVEUocGZvYiwgbWNjX2Jvb3RzdHJhcF9kYiwgbWFpbGJveF9kYi5kd1swXSk7CisKKwkvKiBXYWl0IGZvciAxc3Qgd3JpdGUgdG8gYmUgYWNrbm93bGVkZ2VkLiAqLworCWJlX21jY19tYWlsYm94X3dhaXQocGZvYik7CisKKwkvKiBsb3dlciBiaXRzIDMwIGJpdHMgZnJvbSA0dGggYml0IChiaXRzIDQgdG8gMzMpKi8KKwlwYSA9ICh1MzIpIChwZm9iLT5tYWlsYm94LnBhID4+IDQpICYgMHgzRkZGRkZGRjsKKworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCBoaSwgJm1haWxib3hfZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCByZWFkeSwgJm1haWxib3hfZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKE1QVV9NQUlMQk9YX0RCLCBhZGRyZXNzLCAmbWFpbGJveF9kYiwgcGEpOworCisJLyogUmluZyBkb29yYmVsbCAybmQgdGltZSAqLworCVBEX1dSSVRFKHBmb2IsIG1jY19ib290c3RyYXBfZGIsIG1haWxib3hfZGIuZHdbMF0pOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSB0ZWxscyB0aGUgTUNDIG1haWxib3ggdGhhdCB0aGVyZSBpcyBkYXRhIHRvIHByb2Nlc3NlZAorICAgIGluIHRoZSBtYWlsYm94LiBJdCBkb2VzIHRoaXMgYnkgc2V0dGluZyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlCisgICAgbWFpbGJveCBsb2NhdGlvbiBhbmQgY2xlYXJpbmcgdGhlIExTQi4gIFRoaXMgcm91dGluZSBzcGlucyB1bnRpbCB0aGUKKyAgICBNUFUgd3JpdGVzIGEgMSBpbnRvIHRoZSBMU0IgaW5kaWNhdGluZyB0aGF0IHRoZSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkCisgICAgYW5kIGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4KKworICAgIHBjb250cm9sbGVyICAgICAgLSBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIHBvc3QgdGhpcyBkYXRhIHRvCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKyovCitzdGF0aWMgdm9pZAorYmVfbWNjX21haWxib3hfbm90aWZ5X2FuZF93YWl0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJLyoKKwkgKiBOb3RpZnkgaXQKKwkgKi8KKwliZV9tY2NfbWFpbGJveF9ub3RpZnkocGZvYik7CisJLyoKKwkgKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiBvZiBXUkIKKwkgKi8KKwliZV9tY2NfbWFpbGJveF93YWl0KHBmb2IpOworfQorCit2b2lkCitiZV9tY2NfcHJvY2Vzc19jcWUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCQlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKmNxZSkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCA9IE5VTEw7CisJdTMyIG9mZnNldCwgc3RhdHVzOworCXU4ICpwOworCisJQVNTRVJUKGNxZSk7CisJLyoKKwkgKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgQ29tbWFuZHMgY29tcGxldGUgb3V0LW9mLW9yZGVyLgorCSAqIERldGVybWluZSB3aGljaCBjb21tYW5kIGNvbXBsZXRlZCBmcm9tIHRoZSBUQUcuCisJICovCisJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19DUV9FTlRSWV9BTUFQLCBtY2NfdGFnKS84OworCXAgPSAodTggKikgY3FlICsgb2Zmc2V0OworCXdyYl9jb250ZXh0ID0gKHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKikodm9pZCAqKShzaXplX3QpKCoodTY0ICopcCk7CisJQVNTRVJUKHdyYl9jb250ZXh0KTsKKworCS8qCisJICogUGVyZm9ybSBhIHJlc3BvbnNlIGNvcHkgaWYgcmVxdWVzdGVkLgorCSAqIE9ubHkgY29weSBkYXRhIGlmIHRoZSBGV0NNRCBpcyBzdWNjZXNzZnVsLgorCSAqLworCXN0YXR1cyA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgY29tcGxldGlvbl9zdGF0dXMsIGNxZSk7CisJaWYgKHN0YXR1cyA9PSBNR01UX1NUQVRVU19TVUNDRVNTICYmIHdyYl9jb250ZXh0LT5jb3B5Lmxlbmd0aCA+IDApIHsKKwkJQVNTRVJUKHdyYl9jb250ZXh0LT53cmIpOworCQlBU1NFUlQod3JiX2NvbnRleHQtPmNvcHkudmEpOworCQlwID0gKHU4ICopd3JiX2NvbnRleHQtPndyYiArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvODsKKwkJbWVtY3B5KHdyYl9jb250ZXh0LT5jb3B5LnZhLAorCQkJICAodTggKilwICsgd3JiX2NvbnRleHQtPmNvcHkuZndjbWRfb2Zmc2V0LAorCQkJICB3cmJfY29udGV4dC0+Y29weS5sZW5ndGgpOworCX0KKworCWlmIChzdGF0dXMpCisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwkvKiBpbnRlcm5hbCBjYWxsYmFjayAqLworCWlmICh3cmJfY29udGV4dC0+aW50ZXJuYWxfY2IpIHsKKwkJd3JiX2NvbnRleHQtPmludGVybmFsX2NiKHdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYl9jb250ZXh0LAorCQkJCQkJc3RhdHVzLCB3cmJfY29udGV4dC0+d3JiKTsKKwl9CisKKwkvKiBjYWxsYmFjayAqLworCWlmICh3cmJfY29udGV4dC0+Y2IpIHsKKwkJd3JiX2NvbnRleHQtPmNiKHdyYl9jb250ZXh0LT5jYl9jb250ZXh0LAorCQkJCQkgICAgICBzdGF0dXMsIHdyYl9jb250ZXh0LT53cmIpOworCX0KKwkvKiBGcmVlIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAqLworCV9iZV9tY2NfZnJlZV93cmJfY29udGV4dChwZm9iLCB3cmJfY29udGV4dCk7Cit9CisKK3ZvaWQgYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKQoreworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSBOVUxMOworCWludCBzdGF0dXMgPSBCRV9QRU5ESU5HOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0OworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYjsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICpxdWV1ZV93cmI7CisJdTMyIGxlbmd0aCwgcGF5bG9hZF9sZW5ndGgsIHNnZV9jb3VudCwgZW1iZWRkZWQ7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQlVJTERfQlVHX09OKChzaXplb2Yoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0KSA8CisJCQkgIHNpemVvZihzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKSk7CisJcGZvYiA9IG1jYy0+cGFyZW50X2Z1bmN0aW9uOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAobWNjLT5kcml2aW5nX2JhY2tsb2cpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwkJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKiBBY3F1aXJlIHRoZSBmbGFnIHRvIGxpbWl0IDEgdGhyZWFkIHRvIHJlZHJpdmUgcG9zdHMuICovCisJbWNjLT5kcml2aW5nX2JhY2tsb2cgPSAxOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtY2MtPmJhY2tsb2cpKSB7CisJCXdyYiA9IF9iZV9tcHVfcGVla19yaW5nX3dyYihtY2MsIHRydWUpOwkvKiBEcml2aW5nIHRoZSBxdWV1ZSAqLworCQlpZiAoIXdyYikKKwkJCWJyZWFrOwkvKiBObyBzcGFjZSBpbiB0aGUgcmluZyB5ZXQuICovCisJCS8qIEdldCB0aGUgbmV4dCBxdWV1ZWQgZW50cnkgdG8gcHJvY2Vzcy4gKi8KKwkJcV9jdHh0ID0gbGlzdF9maXJzdF9lbnRyeSgmbWNjLT5iYWNrbG9nLAorCQkJCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCwgY29udGV4dC5saXN0KTsKKwkJbGlzdF9kZWwoJnFfY3R4dC0+Y29udGV4dC5saXN0KTsKKwkJcGZvYi0+bWNjLT5iYWNrbG9nX2xlbmd0aC0tOworCQkvKgorCQkgKiBDb21wdXRlIHRoZSByZXF1aXJlZCBsZW5ndGggb2YgdGhlIFdSQi4KKwkJICogU2luY2UgdGhlIHF1ZXVlIGVsZW1lbnQgbWF5IGJlIHNtYWxsZXIgdGhhbgorCQkgKiB0aGUgY29tcGxldGUgV1JCLCBjb3B5IG9ubHkgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcy4KKwkJICovCisJCXF1ZXVlX3dyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCWVtYmVkZGVkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwgZW1iZWRkZWQsIHF1ZXVlX3dyYik7CisJCWlmIChlbWJlZGRlZCkgeworCQkJcGF5bG9hZF9sZW5ndGggPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLAorCQkJCQkJcGF5bG9hZF9sZW5ndGgsIHF1ZXVlX3dyYik7CisJCQlsZW5ndGggPSBzaXplb2Yoc3RydWN0IGJlX21jY193cmJfaGVhZGVyKSArCisJCQkJCQkJCXBheWxvYWRfbGVuZ3RoOworCQl9IGVsc2UgeworCQkJc2dlX2NvdW50ID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwgc2dlX2NvdW50LAorCQkJCQkJCQlxdWV1ZV93cmIpOworCQkJQVNTRVJUKHNnZV9jb3VudCA9PSAxKTsgLyogb25seSAxIGZyYWcuICovCisJCQlsZW5ndGggPSBzaXplb2Yoc3RydWN0IGJlX21jY193cmJfaGVhZGVyKSArCisJCQkgICAgc2dlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBNQ0NfU0dFX0FNQVApOworCQl9CisKKwkJLyoKKwkJICogVHJ1bmNhdGUgdGhlIGxlbmd0aCBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUKKwkJICogcXVldWUgZWxlbWVudC4gIFNvbWUgZWxlbWVudHMgdGhhdCBoYXZlIG91dHB1dCBwYXJhbWV0ZXJzCisJCSAqIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIHBheWxvYWRfbGVuZ3RoIGZpZWxkIHdvdWxkCisJCSAqIGluZGljYXRlLiAgV2UgcmVhbGx5IG9ubHkgbmVlZCB0byBjb3B5IHRoZSByZXF1ZXN0CisJCSAqIHBhcmFtZXRlcnMsIG5vdCB0aGUgcmVzcG9uc2UuCisJCSAqLworCQlsZW5ndGggPSBtaW4obGVuZ3RoLCAodTMyKSAocV9jdHh0LT5jb250ZXh0LmJ5dGVzIC0KKwkJCW9mZnNldG9mKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCwgd3JiX2hlYWRlcikpKTsKKworCQkvKiBDb3B5IHRoZSBxdWV1ZSBlbGVtZW50IFdSQiBpbnRvIHRoZSByaW5nLiAqLworCQltZW1jcHkod3JiLCAmcV9jdHh0LT53cmJfaGVhZGVyLCBsZW5ndGgpOworCisJCS8qIFBvc3QgdGhlIHdyYi4gIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGFzc3VtaW5nIHdlIGhhdmUKKwkJICogZW5vdWdoIGNvbnRleHQgc3RydWN0cy4gKi8KKwkJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwKKwkJCSAgIHFfY3R4dC0+Y29udGV4dC5jYiwgcV9jdHh0LT5jb250ZXh0LmNiX2NvbnRleHQsCisJCQkgICBxX2N0eHQtPmNvbnRleHQuaW50ZXJuYWxfY2IsCisJCQkgICBxX2N0eHQtPmNvbnRleHQuaW50ZXJuYWxfY2JfY29udGV4dCwKKwkJCSAgIHFfY3R4dC0+Y29udGV4dC5vcHRpb25hbF9md2NtZF92YSwKKwkJCSAgICZxX2N0eHQtPmNvbnRleHQuY29weSk7CisKKwkJaWYgKHN0YXR1cyA9PSBCRV9TVUNDRVNTKSB7CisJCQkvKgorCQkJICogU3luY2hyb25vdXMgY29tcGxldGlvbi4gU2luY2UgaXQgd2FzIHF1ZXVlZCwKKwkJCSAqIHdlIHdpbGwgaW52b2tlIHRoZSBjYWxsYmFjay4KKwkJCSAqIFRvIHRoZSB1c2VyLCB0aGlzIGlzIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0LgorCQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCQkJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQkJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwkJCX0KKworCQkJQVNTRVJUKHFfY3R4dC0+Y29udGV4dC5jYik7CisKKwkJCXFfY3R4dC0+Y29udGV4dC5jYigKKwkJCQlxX2N0eHQtPmNvbnRleHQuY2JfY29udGV4dCwKKwkJCQkJCUJFX1NVQ0NFU1MsIE5VTEwpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCQl9IGVsc2UgaWYgKHN0YXR1cyAhPSBCRV9QRU5ESU5HKSB7CisJCQkvKgorCQkJICogQW5vdGhlciByZXNvdXJjZSBmYWlsZWQuICBTaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkgKiBpZiB3ZSBoYXZlIHN1ZmZpY2llbnQgTUNDX1dSQl9DT05URVhUIHN0cnVjdHMuCisJCQkgKiBSZXR1cm4gdG8gaGVhZCBvZiB0aGUgcXVldWUuCisJCQkgKi8KKwkJCVRSQUNFKERMX1dBUk4sICJGYWlsZWQgdG8gcG9zdCBhIHF1ZXVlZCBXUkIuIDB4JXgiLAorCQkJICAgICAgc3RhdHVzKTsKKwkJCWxpc3RfYWRkKCZxX2N0eHQtPmNvbnRleHQubGlzdCwgJm1jYy0+YmFja2xvZyk7CisJCQlwZm9iLT5tY2MtPmJhY2tsb2dfbGVuZ3RoKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEZyZWUgdGhlIGZsYWcgdG8gbGltaXQgMSB0aHJlYWQgdG8gcmVkcml2ZSBwb3N0cy4gKi8KKwltY2MtPmRyaXZpbmdfYmFja2xvZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBhc3NlcnRzIHRoYXQgdGhlIFdSQiB3YXMgY29uc3VtZWQgaW4gb3JkZXIuICovCisjaWZkZWYgQkVfREVCVUcKK3UzMiBiZV9tY2Nfd3JiX2NvbnN1bWVkX2luX29yZGVyKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsCisJCQkJCXN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqY3FlKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0ID0gTlVMTDsKKwl1MzIgd3JiX2luZGV4OworCXUzMiB3cmJfY29uc3VtZWRfaW5fb3JkZXI7CisJdTMyIG9mZnNldDsKKwl1OCAqcDsKKworCUFTU0VSVChjcWUpOworCS8qCisJICogQSBjb21tYW5kIGNvbXBsZXRlZC4gIENvbW1hbmRzIGNvbXBsZXRlIG91dC1vZi1vcmRlci4KKwkgKiBEZXRlcm1pbmUgd2hpY2ggY29tbWFuZCBjb21wbGV0ZWQgZnJvbSB0aGUgVEFHLgorCSAqLworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCwgbWNjX3RhZykvODsKKwlwID0gKHU4ICopIGNxZSArIG9mZnNldDsKKwl3cmJfY29udGV4dCA9IChzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICopKHZvaWQgKikoc2l6ZV90KSgqKHU2NCAqKXApOworCisJQVNTRVJUKHdyYl9jb250ZXh0KTsKKworCXdyYl9pbmRleCA9ICh1MzIpICgoKHU2NCkoc2l6ZV90KXdyYl9jb250ZXh0LT5yaW5nX3dyYiAtCisJCSh1NjQpKHNpemVfdCltY2MtPnNxLnJpbmcudmEpIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKworCUFTU0VSVCh3cmJfaW5kZXggPCBtY2MtPnNxLnJpbmcubnVtKTsKKworCXdyYl9jb25zdW1lZF9pbl9vcmRlciA9ICh1MzIpICh3cmJfaW5kZXggPT0gbWNjLT5jb25zdW1lZF9pbmRleCk7CisJbWNjLT5jb25zdW1lZF9pbmRleCA9IGJlX2FkZGMobWNjLT5jb25zdW1lZF9pbmRleCwgMSwgbWNjLT5zcS5yaW5nLm51bSk7CisJcmV0dXJuIHdyYl9jb25zdW1lZF9pbl9vcmRlcjsKK30KKyNlbmRpZgorCitpbnQgYmVfbWNjX3Byb2Nlc3NfY3Eoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywgYm9vbCByZWFybSkKK3sKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKmNxZTsKKwlzdHJ1Y3QgQ1FfREJfQU1BUCBkYjsKKwlzdHJ1Y3QgbXBfcmluZyAqY3FfcmluZyA9ICZtY2MtPmNxLnJpbmc7CisJc3RydWN0IG1wX3JpbmcgKm1wX3JpbmcgPSAmbWNjLT5zcS5yaW5nOworCXUzMiBudW1fcHJvY2Vzc2VkID0gMDsKKwl1MzIgY29uc3VtZWQgPSAwLCB2YWxpZCwgY29tcGxldGVkLCBjcWVfY29uc3VtZWQsIGFzeW5jX2V2ZW50OworCisJcGZvYiA9IG1jYy0+cGFyZW50X2Z1bmN0aW9uOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IG9ubHkgb25lIHRocmVhZCBpcyBwcm9jZXNzaW5nIHRoZSBDUSBhdCBvbmNlLgorCSAqIFdlIGNhbm5vdCBob2xkIHRoZSBsb2NrIHdoaWxlIHByb2Nlc3NpbmcgdGhlIENRIGR1ZSB0bworCSAqIHRoZSBjYWxsYmFja3MgaW50byB0aGUgT1MuICBUaGVyZWZvcmUsIHRoaXMgZmxhZyBpcyB1c2VkCisJICogdG8gY29udHJvbCBpdC4gIElmIGFueSBvZiB0aGUgdGhyZWFkcyB3YW50IHRvCisJICogcmVhcm0gdGhlIENRLCB3ZSBuZWVkIHRvIGhvbm9yIHRoYXQuCisJICovCisJaWYgKG1jYy0+cHJvY2Vzc2luZyAhPSAwKSB7CisJCW1jYy0+cmVhcm0gPSBtY2MtPnJlYXJtIHx8IHJlYXJtOworCQlnb3RvIEVycm9yOworCX0gZWxzZSB7CisJCW1jYy0+cHJvY2Vzc2luZyA9IDE7CS8qIGxvY2sgcHJvY2Vzc2luZyBmb3IgdGhpcyB0aHJlYWQuICovCisJCW1jYy0+cmVhcm0gPSByZWFybTsJLyogc2V0IG91ciByZWFybSBzZXR0aW5nICovCisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+Y3FfbG9jaywgcGZvYi0+Y3FfaXJxKTsKKworCWNxZSA9IG1wX3JpbmdfY3VycmVudChjcV9yaW5nKTsKKwl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgdmFsaWQsIGNxZSk7CisJd2hpbGUgKHZhbGlkKSB7CisKKwkJaWYgKG51bV9wcm9jZXNzZWQgPj0gOCkgeworCQkJLyogY29hbGVzY2UgZG9vcmJlbGxzLCBidXQgZnJlZSBzcGFjZSBpbiBjcQorCQkJICogcmluZyB3aGlsZSBwcm9jZXNzaW5nLiAqLworCQkJZGIuZHdbMF0gPSAwOwkvKiBjbGVhciAqLworCQkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHFpZCwgJmRiLCBjcV9yaW5nLT5pZCk7CisJCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZkYiwgZmFsc2UpOworCQkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIGV2ZW50LCAmZGIsIGZhbHNlKTsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmZGIsCisJCQkJCQkJbnVtX3Byb2Nlc3NlZCk7CisJCQludW1fcHJvY2Vzc2VkID0gMDsKKworCQkJUERfV1JJVEUocGZvYiwgY3FfZGIsIGRiLmR3WzBdKTsKKwkJfQorCisJCWFzeW5jX2V2ZW50ID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCBhc3luY19ldmVudCwgY3FlKTsKKwkJaWYgKGFzeW5jX2V2ZW50KSB7CisJCQkvKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyBldmVudC4gKi8KKwkJCXN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgKmFzeW5jX3RyYWlsZXIgPQorCQkJICAgIChzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQICopCisJCQkgICAgKCh1OCAqKSBjcWUgKyBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSAtCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQKSk7CisJCQl1MzIgZXZlbnRfY29kZTsKKwkJCWFzeW5jX2V2ZW50ID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfVFJBSUxFUiwKKwkJCQkJCWFzeW5jX2V2ZW50LCBhc3luY190cmFpbGVyKTsKKwkJCUFTU0VSVChhc3luY19ldmVudCA9PSAxKTsKKworCisJCQl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsCisJCQkJCQl2YWxpZCwgYXN5bmNfdHJhaWxlcik7CisJCQlBU1NFUlQodmFsaWQgPT0gMSk7CisKKwkJCS8qIENhbGwgdGhlIGFzeW5jIGV2ZW50IGhhbmRsZXIgaWYgaXQgaXMgaW5zdGFsbGVkLiAqLworCQkJaWYgKG1jYy0+YXN5bmNfY2IpIHsKKwkJCQlldmVudF9jb2RlID0KKwkJCQkJQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfVFJBSUxFUiwKKwkJCQkJCWV2ZW50X2NvZGUsIGFzeW5jX3RyYWlsZXIpOworCQkJCW1jYy0+YXN5bmNfY2IobWNjLT5hc3luY19jb250ZXh0LAorCQkJCQkgICAgKHUzMikgZXZlbnRfY29kZSwgKHZvaWQgKikgY3FlKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJLyogVGhpcyBpcyBhIGNvbXBsZXRpb24gZW50cnkuICovCisKKwkJCS8qIE5vIHZtIGZvcndhcmRpbmcgaW4gdGhpcyBkcml2ZXIuICovCisKKwkJCWNxZV9jb25zdW1lZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwKKwkJCQkJCWNvbnN1bWVkLCBjcWUpOworCQkJaWYgKGNxZV9jb25zdW1lZCkgeworCQkJCS8qCisJCQkJICogQSBjb21tYW5kIG9uIHRoZSBNQ0MgcmluZyB3YXMgY29uc3VtZWQuCisJCQkJICogVXBkYXRlIHRoZSBjb25zdW1lciBpbmRleC4KKwkJCQkgKiBUaGVzZSBvY2N1ciBpbiBvcmRlci4KKwkJCQkgKi8KKwkJCQlBU1NFUlQoYmVfbWNjX3dyYl9jb25zdW1lZF9pbl9vcmRlcihtY2MsIGNxZSkpOworCQkJCWNvbnN1bWVkKys7CisJCQl9CisKKwkJCWNvbXBsZXRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwKKwkJCQkJY29tcGxldGVkLCBjcWUpOworCQkJaWYgKGNvbXBsZXRlZCkgeworCQkJCS8qIEEgY29tbWFuZCBjb21wbGV0ZWQuICBVc2UgdGFnIHRvCisJCQkJICogZGV0ZXJtaW5lIHdoaWNoIGNvbW1hbmQuICAqLworCQkJCWJlX21jY19wcm9jZXNzX2NxZShwZm9iLCBjcWUpOworCQkJfQorCQl9CisKKwkJLyogUmVzZXQgdGhlIENRRSAqLworCQlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIHZhbGlkLCBjcWUsIGZhbHNlKTsKKwkJbnVtX3Byb2Nlc3NlZCsrOworCisJCS8qIFVwZGF0ZSBvdXIgdHJhY2tpbmcgZm9yIHRoZSBDUSByaW5nLiAqLworCQljcWUgPSBtcF9yaW5nX25leHQoY3FfcmluZyk7CisJCXZhbGlkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCB2YWxpZCwgY3FlKTsKKwl9CisKKwlUUkFDRShETF9JTkZPLCAibnVtX3Byb2Nlc3NlZDoweCV4LCBhbmQgY29uc3VtZWQ6MHgleCIsCisJICAgICAgbnVtX3Byb2Nlc3NlZCwgY29uc3VtZWQpOworCS8qCisJICogR3JhYiB0aGUgQ1EgbG9jayB0byBzeW5jaHJvbml6ZSB0aGUgInJlYXJtIiBzZXR0aW5nIGZvcgorCSAqIHRoZSBkb29yYmVsbCwgYW5kIGZvciBjbGVhcmluZyB0aGUgInByb2Nlc3NpbmciIGZsYWcuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPmNxX2xvY2ssIHBmb2ItPmNxX2lycSk7CisKKwkvKgorCSAqIFJlYXJtIHRoZSBjcS4gIFRoaXMgaXMgZG9uZSBiYXNlZCBvbiB0aGUgZ2xvYmFsIG1jYy0+cmVhcm0KKwkgKiBmbGFnIHdoaWNoIGNvbWJpbmVzIHRoZSByZWFybSBwYXJhbWV0ZXIgZnJvbSB0aGUgY3VycmVudAorCSAqIGNhbGwgdG8gcHJvY2Vzc19jcSBhbmQgYW55IG90aGVyIHRocmVhZHMKKwkgKiB0aGF0IHRyaWVkIHRvIHByb2Nlc3MgdGhlIENRIHdoaWxlIHRoaXMgb25lIHdhcyBhY3RpdmUuCisJICogVGhpcyBoYW5kbGVzIHRoZSBzaXR1YXRpb24gd2hlcmUgYSBzeW5jLiBmd2NtZCB3YXMgcHJvY2Vzc2luZworCSAqIHRoZSBDUSB3aGlsZSB0aGUgaW50ZXJydXB0L2RwYyB0cmllcyB0byBwcm9jZXNzIGl0LgorCSAqIFRoZSBzeW5jIHByb2Nlc3MgZ2V0cyB0byBjb250aW51ZSAtLSBidXQgaXQgaXMgbm93CisJICogcmVzcG9uc2libGUgZm9yIHRoZSByZWFybWluZy4KKwkgKi8KKwlpZiAobnVtX3Byb2Nlc3NlZCA+IDAgfHwgbWNjLT5yZWFybSA9PSB0cnVlKSB7CisJCWRiLmR3WzBdID0gMDsJLyogY2xlYXIgKi8KKwkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHFpZCwgJmRiLCBjcV9yaW5nLT5pZCk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCByZWFybSwgJmRiLCBtY2MtPnJlYXJtKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIGV2ZW50LCAmZGIsIGZhbHNlKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIG51bV9wb3BwZWQsICZkYiwgbnVtX3Byb2Nlc3NlZCk7CisKKwkJUERfV1JJVEUocGZvYiwgY3FfZGIsIGRiLmR3WzBdKTsKKwl9CisJLyoKKwkgKiBVcGRhdGUgdGhlIGNvbnN1bWVyIGluZGV4IGFmdGVyIHJpbmdpbmcgdGhlIENRIGRvb3JiZWxsLgorCSAqIFdlIGRvbid0IHdhbnQgYW5vdGhlciB0aHJlYWQgdG8gcG9zdCBtb3JlIFdSQnMgYmVmb3JlIHdlCisJICogaGF2ZSBDUSBzcGFjZSBhdmFpbGFibGUuCisJICovCisJbXBfcmluZ19jb25zdW1lX211bHRpcGxlKG1wX3JpbmcsIGNvbnN1bWVkKTsKKworCS8qIENsZWFyIHRoZSBwcm9jZXNzaW5nIGZsYWcuICovCisJbWNjLT5wcm9jZXNzaW5nID0gMDsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+Y3FfbG9jaywgcGZvYi0+Y3FfaXJxKTsKKwkvKgorCSAqIFVzZSB0aGUgbG9jYWwgdmFyaWFibGUgdG8gZGV0ZWN0IGlmIHRoZSBjdXJyZW50IHRocmVhZAorCSAqIGhvbGRzIHRoZSBXUkIgcG9zdCBsb2NrLiAgSWYgcmVhcm0gaXMgZmFsc2UsIHRoaXMgaXMKKwkgKiBlaXRoZXIgYSBzeW5jaHJvbm91cyBjb21tYW5kLCBvciB0aGUgdXBwZXIgbGF5ZXIgZHJpdmVyIGlzIHBvbGxpbmcKKwkgKiBmcm9tIGEgdGhyZWFkLiAgV2UgZG8gbm90IGRyaXZlIHRoZSBxdWV1ZSBmcm9tIHRoYXQKKwkgKiBjb250ZXh0IHNpbmNlIHRoZSBkcml2ZXIgbWF5IGhvbGQgdGhlCisJICogd3JiIHBvc3QgbG9jayBhbHJlYWR5LgorCSAqLworCWlmIChyZWFybSkKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShtY2MpOworCWVsc2UKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorCisvKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgIFAgVSBCIEwgSSBDICBSIE8gVSBUIEkgTiBFIFMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgICAgVGhpcyByb3V0aW5lIGNyZWF0ZXMgYW4gTUNDIG9iamVjdC4gIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGFuIE1DQyBzZW5kIHF1ZXVlCisgICAgYW5kIGEgQ1EgcHJpdmF0ZSB0byB0aGUgTUNDLgorCisgICAgcGNvbnRyb2xsZXIgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgRXFPYmplY3QgICAgICAgICAgICAtIEVRIG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBkaXNwYXRjaCB0aGlzIE1DQworCisgICAgcHBNY2NPYmplY3QgICAgICAgICAtIFBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgTWNjIE9iamVjdCByZXR1cm5lZC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwsIG90aGVyd2lzZSBhIHVzZWZ1bCBlcnJvciBjb2RlCisJaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKworKi8KK2ludAorYmVfbWNjX3JpbmdfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoLAorCQkgICBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0X2FycmF5LAorCQkgICB1MzIgbnVtX2NvbnRleHRfZW50cmllcywKKwkJICAgc3RydWN0IGJlX2NxX29iamVjdCAqY3EsIHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX01DQ19DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXUzMiBudW1fZW50cmllc19lbmNvZGVkLCBuLCBpOworCXZvaWQgKnZhID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApICogMikgeworCQlUUkFDRShETF9FUlIsICJJbnZhbGlkIE1DQyByaW5nIGxlbmd0aDolZCIsIGxlbmd0aCk7CisJCXJldHVybiBCRV9OT1RfT0s7CisJfQorCS8qCisJICogUmVkdWNlIHRoZSBhY3R1YWwgcmluZyBzaXplIHRvIGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyCisJICogb2YgY29udGV4dCBlbnRyaWVzLiAgVGhpcyBlbnN1cmVzIHRoYXQgd2UgcnVuIG91dCBvZgorCSAqIHJpbmcgV1JCcyBmaXJzdCBzbyB0aGUgcXVldWluZyB3b3JrcyBjb3JyZWN0bHkuICBXZSBuZXZlcgorCSAqIHF1ZXVlIGJhc2VkIG9uIGNvbnRleHQgc3RydWN0cy4KKwkgKi8KKwlpZiAobnVtX2NvbnRleHRfZW50cmllcyArIDEgPAorCQkJbGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApIC0gMSkgeworCisJCXUzMiBtYXhfbGVuZ3RoID0KKwkJICAgIChudW1fY29udGV4dF9lbnRyaWVzICsgMikgKiBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCk7CisKKwkJaWYgKGlzX3Bvd2VyX29mXzIobWF4X2xlbmd0aCkpCisJCQlsZW5ndGggPSBfX3JvdW5kdXBfcG93X29mX3R3byhtYXhfbGVuZ3RoKzEpIC8gMjsKKwkJZWxzZQorCQkJbGVuZ3RoID0gX19yb3VuZHVwX3Bvd19vZl90d28obWF4X2xlbmd0aCkgLyAyOworCisJCUFTU0VSVChsZW5ndGggPD0gbWF4X2xlbmd0aCk7CisKKwkJVFJBQ0UoRExfV0FSTiwKKwkJCSJNQ0MgcmluZyBsZW5ndGggcmVkdWNlZCBiYXNlZCBvbiBjb250ZXh0IGVudHJpZXMuIgorCQkJIiBsZW5ndGg6JWQgd3JiczolZCBjb250ZXh0X2VudHJpZXM6JWQiLCBsZW5ndGgsCisJCQkoaW50KSAobGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKSwKKwkJCW51bV9jb250ZXh0X2VudHJpZXMpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJbnVtX2VudHJpZXNfZW5jb2RlZCA9CisJICAgIGJlX3JpbmdfbGVuZ3RoX3RvX2VuY29kaW5nKGxlbmd0aCwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKworCS8qIEluaXQgTUNDIG9iamVjdC4gKi8KKwltZW1zZXQobWNjLCAwLCBzaXplb2YoKm1jYykpOworCW1jYy0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwltY2MtPmNxX29iamVjdCA9IGNxOworCisJSU5JVF9MSVNUX0hFQUQoJm1jYy0+YmFja2xvZyk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gY3JlYXRlIEVRLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9NQ0NfQ1JFQVRFKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSBESVZfUk9VTkRfVVAobGVuZ3RoLCBQQUdFX1NJWkUpOworCS8qCisJICogUHJvZ3JhbSBNQ0MgcmluZyBjb250ZXh0CisJICovCisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1JJTkdfQ09OVEVYVCwgcGRpZCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1JJTkdfQ09OVEVYVCwgaW52YWxpZCwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgZmFsc2UpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsIHJpbmdfc2l6ZSwKKwkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbnVtX2VudHJpZXNfZW5jb2RlZCk7CisKKwluID0gY3EtPmNxX2lkOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19SSU5HX0NPTlRFWFQsCisJCQkJY3FfaWQsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJYmVfcmRfdG9fcGFfbGlzdChyZCwgZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzLAorCQkJCUFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlUUkFDRShETF9FUlIsICJNQ0MgdG8gY3JlYXRlIENRIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyoKKwkgKiBDcmVhdGUgYSBsaW5rZWQgbGlzdCBvZiBjb250ZXh0IHN0cnVjdHVyZXMKKwkgKi8KKwltY2MtPndyYl9jb250ZXh0LmJhc2UgPSBjb250ZXh0X2FycmF5OworCW1jYy0+d3JiX2NvbnRleHQubnVtID0gbnVtX2NvbnRleHRfZW50cmllczsKKwlJTklUX0xJU1RfSEVBRCgmbWNjLT53cmJfY29udGV4dC5saXN0X2hlYWQpOworCW1lbXNldChjb250ZXh0X2FycmF5LCAwLAorCQkgICAgc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQpICogbnVtX2NvbnRleHRfZW50cmllcyk7CisJZm9yIChpID0gMDsgaSA8IG1jYy0+d3JiX2NvbnRleHQubnVtOyBpKyspIHsKKwkJbGlzdF9hZGRfdGFpbCgmY29udGV4dF9hcnJheVtpXS5uZXh0LAorCQkJCQkmbWNjLT53cmJfY29udGV4dC5saXN0X2hlYWQpOworCX0KKworCS8qCisJICoKKwkgKiBDcmVhdGUgYW4gbWNjX3JpbmcgZm9yIHRyYWNraW5nIFdSQiBodyByaW5nCisJICovCisJdmEgPSByZC0+dmE7CisJQVNTRVJUKHZhKTsKKwltcF9yaW5nX2NyZWF0ZSgmbWNjLT5zcS5yaW5nLCBsZW5ndGggLyBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCksCisJCQkJc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApLCB2YSk7CisJbWNjLT5zcS5yaW5nLmlkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5pZDsKKwkvKgorCSAqIEluaXQgYSBtY2NfcmluZyBmb3IgdHJhY2tpbmcgdGhlIE1DQyBDUS4KKwkgKi8KKwlBU1NFUlQoY3EtPnZhKTsKKwltcF9yaW5nX2NyZWF0ZSgmbWNjLT5jcS5yaW5nLCBjcS0+bnVtX2VudHJpZXMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSwgY3EtPnZhKTsKKwltY2MtPmNxLnJpbmcuaWQgPSBjcS0+Y3FfaWQ7CisKKwkvKiBGb3JjZSB6ZXJvaW5nIG9mIENRLiAqLworCW1lbXNldChjcS0+dmEsIDAsIGNxLT5udW1fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApKTsKKworCS8qIEluaXRpYWxpemUgZGVidWcgaW5kZXguICovCisJbWNjLT5jb25zdW1lZF9pbmRleCA9IDA7CisKKwlhdG9taWNfaW5jKCZjcS0+cmVmX2NvdW50KTsKKwlwZm9iLT5tY2MgPSBtY2M7CisKKwlUUkFDRShETF9JTkZPLCAiTUNDIHJpbmcgY3JlYXRlZC4gaWQ6JWQgYnl0ZXM6JWQgY3FfaWQ6JWQgY3FfZW50cmllczolZCIKKwkgICAgICAiIG51bV9jb250ZXh0OiVkIiwgbWNjLT5zcS5yaW5nLmlkLCBsZW5ndGgsCisJICAgICAgY3EtPmNxX2lkLCBjcS0+bnVtX2VudHJpZXMsIG51bV9jb250ZXh0X2VudHJpZXMpOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgZGVzdHJveXMgYW4gTUNDIHNlbmQgcXVldWUKKworICAgIE1jY09iamVjdCAgICAgICAgIC0gSW50ZXJuYWwgTWNjIE9iamVjdCB0byBiZSBkZXN0cm95ZWQuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMCisKKyAgICBUaGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBtdXN0IGVuc3VyZSB0aGF0IG5vIG90aGVyIFdSQiBtYXkgYmUgcG9zdGVkCisgICAgdW50aWwgdGhpcyByb3V0aW5lIHJldHVybnMuCisKKyovCitpbnQgYmVfbWNjX3JpbmdfZGVzdHJveShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSBtY2MtPnBhcmVudF9mdW5jdGlvbjsKKworCisJQVNTRVJUKG1jYy0+cHJvY2Vzc2luZyA9PSAwKTsKKworCS8qCisJICogUmVtb3ZlIHRoZSByaW5nIGZyb20gdGhlIGZ1bmN0aW9uIG9iamVjdC4KKwkgKiBUaGlzIHRyYW5zaXRpb25zIGJhY2sgdG8gbWFpbGJveCBtb2RlLgorCSAqLworCXBmb2ItPm1jYyA9IE5VTEw7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIHF1ZXVlLiAgKFVzaW5nIHRoZSBtYWlsYm94LikgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3kobWNjLT5wYXJlbnRfZnVuY3Rpb24sIG1jYy0+c3EucmluZy5pZCwKKwkJCSAgICAgRldDTURfUklOR19UWVBFX01DQywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKworCS8qIFJlbGVhc2UgdGhlIFNRIHJlZmVyZW5jZSB0byB0aGUgQ1EgKi8KKwlhdG9taWNfZGVjKCZtY2MtPmNxX29iamVjdC0+cmVmX2NvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCittY2Nfd3JiX3N5bmNfY2Iodm9pZCAqY29udGV4dCwgaW50IHN0YXVzLCBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIpCit7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPQorCQkJCShzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICopIGNvbnRleHQ7CisJQVNTRVJUKHdyYl9jb250ZXh0KTsKKwkqd3JiX2NvbnRleHQtPnVzZXJzX2ZpbmFsX3N0YXR1cyA9IHN0YXVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBwb3N0cyBhIGNvbW1hbmQgdG8gdGhlIE1DQyBzZW5kIHF1ZXVlCisKKyAgICBtY2MgICAgICAgLSBJbnRlcm5hbCBNY2MgT2JqZWN0IHRvIGJlIGRlc3Ryb3llZC4KKworICAgIHdyYiAgICAgICAgICAgICAtIHdyYiB0byBwb3N0LgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTCBpZiBDb21wbGV0aW9uQ2FsbGJhY2sgaXMgbm90IE5VTEwKKyAgICBJUlFMIDw9RElTUEFUQ0hfTEVWRUwgaWYgQ29tcGxldGlvbkNhbGxiYWNrIGlzICBOVUxMCisKKyAgICBJZiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggQ29tcGxldGlvbkNhbGxiYWNrICE9IE5VTEwgdGhlCisgICAgY2FsbCBpcyBjb25zaWRlcmVkIHRvIGJlIGFzeW5jaHJvbm91cyBhbmQgd2lsbCByZXR1cm4gYXMgc29vbgorICAgIGFzIHRoZSBXUkIgaXMgcG9zdGVkIHRvIHRoZSBNQ0Mgd2l0aCBCRV9QRU5ESU5HLgorCisgICAgSWYgQ29tcGxldGlvbkNhbGxiYWNrIGlzIE5VTEwsIHRoZW4gdGhpcyByb3V0aW5lIHdpbGwgbm90IHJldHVybiB1bnRpbAorICAgIGEgY29tcGxldGlvbiBmb3IgdGhpcyBNQ0MgY29tbWFuZCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgICAgSWYgY2FsbGVkIGF0IERJU1BBVENIX0xFVkVMIHRoZSBDb21wbGV0aW9uQ2FsbGJhY2sgbXVzdCBiZSBOVUxMLgorCisgICAgVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgTVBVIGhhcyBiZWVuIGJvb3N0cmFwZWQgcGFzdAorICAgIG1haWxib3ggbW9kZS4KKworCisqLworaW50CitfYmVfbXB1X3Bvc3Rfd3JiX3Jpbmcoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLAorCQkJCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KQoreworCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqcmluZ193cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSBCRV9QRU5ESU5HOworCWludCBmaW5hbF9zdGF0dXMgPSBCRV9QRU5ESU5HOworCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX0RCX0FNQVAgbWNjX2RiOworCXUzMiBlbWJlZGRlZDsKKworCUFTU0VSVChtcF9yaW5nX251bV9lbXB0eSgmbWNjLT5zcS5yaW5nKSA+IDApOworCS8qCisJICogSW5wdXQgd3JiIGlzIG1vc3QgbGlrZWx5IHRoZSBuZXh0IHdyYiBpbiB0aGUgcmluZywgc2luY2UgdGhlIGNsaWVudAorCSAqIGNhbiBwZWVrIGF0IHRoZSBhZGRyZXNzLgorCSAqLworCXJpbmdfd3JiID0gbXBfcmluZ19wcm9kdWNlcl9wdHIoJm1jYy0+c3EucmluZyk7CisJaWYgKHdyYiAhPSByaW5nX3dyYikgeworCQkvKiBJZiBub3QgZXF1YWwsIGNvcHkgaXQgaW50byB0aGUgcmluZy4gKi8KKwkJbWVtY3B5KHJpbmdfd3JiLCB3cmIsIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisJfQorI2lmZGVmIEJFX0RFQlVHCisJd3JiX2NvbnRleHQtPnJpbmdfd3JiID0gcmluZ193cmI7CisjZW5kaWYKKwllbWJlZGRlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCByaW5nX3dyYik7CisJaWYgKGVtYmVkZGVkKSB7CisJCS8qIGVtYmVkZGVkIGNvbW1hbmRzIHdpbGwgaGF2ZSB0aGUgcmVzcG9uc2Ugd2l0aGluIHRoZSBXUkIuICovCisJCXdyYl9jb250ZXh0LT53cmIgPSByaW5nX3dyYjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBub24tZW1iZWRkZWQgY29tbWFuZHMgd2lsbCBub3QgaGF2ZSB0aGUgcmVzcG9uc2UKKwkJICogd2l0aGluIHRoZSBXUkIsIGFuZCB0aGV5IG1heSBjb21wbGV0ZSBvdXQtb2Ytb3JkZXIuCisJCSAqIFRoZSBXUkIgd2lsbCBub3QgYmUgdmFsaWQgdG8gaW5zcGVjdAorCQkgKiBkdXJpbmcgdGhlIGNvbXBsZXRpb24uCisJCSAqLworCQl3cmJfY29udGV4dC0+d3JiID0gTlVMTDsKKwl9CisJY2IgPSB3cmJfY29udGV4dC0+Y2I7CisKKwlpZiAoY2IgPT0gTlVMTCkgeworCQkvKiBBc3NpZ24gb3VyIGludGVybmFsIGNhbGxiYWNrIGlmIHRoaXMgaXMgYQorCQkgKiBzeW5jaHJvbm91cyBjYWxsLiAqLworCQl3cmJfY29udGV4dC0+Y2IgPSBtY2Nfd3JiX3N5bmNfY2I7CisJCXdyYl9jb250ZXh0LT5jYl9jb250ZXh0ID0gd3JiX2NvbnRleHQ7CisJCXdyYl9jb250ZXh0LT51c2Vyc19maW5hbF9zdGF0dXMgPSAmZmluYWxfc3RhdHVzOworCX0KKwkvKiBJbmNyZW1lbnQgcHJvZHVjZXIgaW5kZXggKi8KKworCW1jY19kYi5kd1swXSA9IDA7CQkvKiBpbml0aWFsaXplICovCisJQU1BUF9TRVRfQklUU19QVFIoTUNDX0RCLCByaWQsICZtY2NfZGIsIG1jYy0+c3EucmluZy5pZCk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX0RCLCBudW1Qb3N0ZWQsICZtY2NfZGIsIDEpOworCisJbXBfcmluZ19wcm9kdWNlKCZtY2MtPnNxLnJpbmcpOworCVBEX1dSSVRFKG1jYy0+cGFyZW50X2Z1bmN0aW9uLCBtcHVfbWNjX2RiLCBtY2NfZGIuZHdbMF0pOworCVRSQUNFKERMX0lORk8sICJwaWR4OiAleCBhbmQgY2lkeDogJXguIiwgbWNjLT5zcS5yaW5nLnBpZHgsCisJICAgICAgbWNjLT5zcS5yaW5nLmNpZHgpOworCisJaWYgKGNiID09IE5VTEwpIHsKKwkJaW50IHBvbGxzID0gMDsJLyogQXQgPj0gMSB1cyBwZXIgcG9sbCAgICovCisJCS8qIFdhaXQgdW50aWwgdGhpcyBjb21tYW5kIGNvbXBsZXRlcywgcG9sbGluZyB0aGUgQ1EuICovCisJCWRvIHsKKwkJCVRSQUNFKERMX0lORk8sICJGV0NNRCBzdWJtaXR0ZWQgaW4gdGhlIHBvbGwgbW9kZS4iKTsKKwkJCS8qIERvIG5vdCByZWFybSBDUSBpbiB0aGlzIGNvbnRleHQuICovCisJCQliZV9tY2NfcHJvY2Vzc19jcShtY2MsIGZhbHNlKTsKKworCQkJaWYgKGZpbmFsX3N0YXR1cyA9PSBCRV9QRU5ESU5HKSB7CisJCQkJaWYgKCgrK3BvbGxzICYgMHg3RkZGRikgPT0gMCkgeworCQkJCQlUUkFDRShETF9XQVJOLAorCQkJCQkgICAgICAiV2FybmluZyA6IHBvbGxpbmcgTUNDIENRIGZvciAlZCIKKwkJCQkJICAgICAgIm1zLiIsIHBvbGxzIC8gMTAwMCk7CisJCQkJfQorCisJCQkJdWRlbGF5KDEpOworCQkJfQorCisJCQkvKiBmaW5hbF9zdGF0dXMgY2hhbmdlZCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcyAqLworCQl9IHdoaWxlIChmaW5hbF9zdGF0dXMgPT0gQkVfUEVORElORyk7CisKKwkJc3RhdHVzID0gZmluYWxfc3RhdHVzOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorX2JlX21wdV9wZWVrX3Jpbmdfd3JiKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIGJvb2wgZHJpdmluZ19xdWV1ZSkKK3sKKwkvKiBJZiB3ZSBoYXZlIHF1ZXVlZCBpdGVtcywgZG8gbm90IGFsbG93IGEgcG9zdCB0byBieXBhc3MgdGhlIHF1ZXVlLiAqLworCWlmICghZHJpdmluZ19xdWV1ZSAmJiAhbGlzdF9lbXB0eSgmbWNjLT5iYWNrbG9nKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobXBfcmluZ19udW1fZW1wdHkoJm1jYy0+c3EucmluZykgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopIG1wX3JpbmdfcHJvZHVjZXJfcHRyKCZtY2MtPnNxLnJpbmcpOworfQorCitpbnQKK2JlX21wdV9pbml0X21haWxib3goc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgc3RydWN0IHJpbmdfZGVzYyAqbWFpbGJveCkKK3sKKwlBU1NFUlQobWFpbGJveCk7CisJcGZvYi0+bWFpbGJveC52YSA9IG1haWxib3gtPnZhOworCXBmb2ItPm1haWxib3gucGEgPSAgY3B1X3RvX2xlNjQobWFpbGJveC0+cGEpOworCXBmb2ItPm1haWxib3gubGVuZ3RoID0gbWFpbGJveC0+bGVuZ3RoOworCisJQVNTRVJUKCgodTMyKShzaXplX3QpcGZvYi0+bWFpbGJveC52YSAmIDB4ZikgPT0gMCk7CisJQVNTRVJUKCgodTMyKShzaXplX3QpcGZvYi0+bWFpbGJveC5wYSAmIDB4ZikgPT0gMCk7CisJLyoKKwkgKiBJc3N1ZSB0aGUgV1JCIHRvIHNldCBNUFUgZW5kaWFubmVzcworCSAqLworCXsKKwkJdTY0ICplbmRpYW5fY2hlY2sgPSAodTY0ICopIChwZm9iLT5tYWlsYm94LnZhICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgd3JiKS84KTsKKwkJKmVuZGlhbl9jaGVjayA9IDB4RkYxMjM0RkZGRjU2NzhGRlVMTDsKKwl9CisKKwliZV9tY2NfbWFpbGJveF9ub3RpZnlfYW5kX3dhaXQocGZvYik7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworCisvKgorICAgIFRoaXMgcm91dGluZSBwb3N0cyBhIGNvbW1hbmQgdG8gdGhlIE1DQyBtYWlsYm94LgorCisgICAgRnVuY09iaiAgICAgICAgIC0gRnVuY3Rpb24gT2JqZWN0IHRvIHBvc3QgdGhlIFdSQiBvbiBiZWhhbGYgb2YuCisgICAgd3JiICAgICAgICAgICAgIC0gd3JiIHRvIHBvc3QuCisgICAgQ29tcGxldGlvbkNhbGxiYWNrICAtIEFkZHJlc3Mgb2YgYSBjYWxsYmFjayByb3V0aW5lIHRvIGludm9rZSBvbmNlIHRoZSBXUkIKKwkJCQlpcyBjb21wbGV0ZWQuCisgICAgQ29tcGxldGlvbkNhbGxiYWNrQ29udGV4dCAtIE9wYXF1ZSBjb250ZXh0IHRvIGJlIHBhc3NlZCBkdXJpbmcgdGhlIGNhbGwgdG8KKwkJCQl0aGUgQ29tcGxldGlvbkNhbGxiYWNrLgorICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDw9RElTUEFUQ0hfTEVWRUwgaWYgQ29tcGxldGlvbkNhbGxiYWNrIGlzICBOVUxMCisKKyAgICBUaGlzIHJvdXRpbmUgd2lsbCBibG9jayB1bnRpbCBhIGNvbXBsZXRpb24gZm9yIHRoaXMgTUNDIGNvbW1hbmQgaGFzIGJlZW4KKyAgICBwcm9jZXNzZWQuIElmIGNhbGxlZCBhdCBESVNQQVRDSF9MRVZFTCB0aGUgQ29tcGxldGlvbkNhbGxiYWNrIG11c3QgYmUgTlVMTC4KKworICAgIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIE1QVSBoYXMgbm90IGJlZW4gYm9vc3RyYXBlZCBwYXN0CisgICAgbWFpbGJveCBtb2RlLgorKi8KK2ludAorX2JlX21wdV9wb3N0X3dyYl9tYWlsYm94KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpCit7CisJc3RydWN0IE1DQ19NQUlMQk9YX0FNQVAgKm1haWxib3ggPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKm1iX3dyYjsKKwlzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKm1iX2NxOworCXUzMiBvZmZzZXQsIHN0YXR1czsKKworCUFTU0VSVChwZm9iLT5tY2MgPT0gTlVMTCk7CisJbWFpbGJveCA9IHBmb2ItPm1haWxib3gudmE7CisJQVNTRVJUKG1haWxib3gpOworCisJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAsIHdyYikvODsKKwltYl93cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAodTggKiltYWlsYm94ICsgb2Zmc2V0OworCWlmIChtYl93cmIgIT0gd3JiKSB7CisJCW1lbXNldChtYWlsYm94LCAwLCBzaXplb2YoKm1haWxib3gpKTsKKwkJbWVtY3B5KG1iX3dyYiwgd3JiLCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCX0KKwkvKiBUaGUgY2FsbGJhY2sgY2FuIGluc3BlY3QgdGhlIGZpbmFsIFdSQiB0byBnZXQgb3V0cHV0IHBhcmFtZXRlcnMuICovCisJd3JiX2NvbnRleHQtPndyYiA9IG1iX3dyYjsKKworCWJlX21jY19tYWlsYm94X25vdGlmeV9hbmRfd2FpdChwZm9iKTsKKworCS8qIEEgY29tbWFuZCBjb21wbGV0ZWQuICBVc2UgdGFnIHRvIGRldGVybWluZSB3aGljaCBjb21tYW5kLiAqLworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQLCBjcSkvODsKKwltYl9jcSA9IChzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgKikgKCh1OCAqKW1haWxib3ggKyBvZmZzZXQpOworCWJlX21jY19wcm9jZXNzX2NxZShwZm9iLCBtYl9jcSk7CisKKwlzdGF0dXMgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIGNvbXBsZXRpb25fc3RhdHVzLCBtYl9jcSk7CisJaWYgKHN0YXR1cykKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKgorX2JlX21jY19hbGxvY2F0ZV93cmJfY29udGV4dChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPm1jY19jb250ZXh0X2xvY2ssIGlycSk7CisKKwlpZiAoIXBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0X2FsbG9jYXRlZCkgeworCQkvKiBVc2UgdGhlIHNpbmdsZSBkZWZhdWx0IGNvbnRleHQgdGhhdCB3ZQorCQkgKiBhbHdheXMgaGF2ZSBhbGxvY2F0ZWQuICovCisJCXBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0X2FsbG9jYXRlZCA9IHRydWU7CisJCWNvbnRleHQgPSAmcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHQ7CisJfSBlbHNlIGlmIChwZm9iLT5tY2MpIHsKKwkJLyogR2V0IGEgY29udGV4dCBmcm9tIHRoZSBmcmVlIGxpc3QuIElmIGFueSBhcmUgYXZhaWxhYmxlLiAqLworCQlpZiAoIWxpc3RfZW1wdHkoJnBmb2ItPm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkKSkgeworCQkJY29udGV4dCA9IGxpc3RfZmlyc3RfZW50cnkoCisJCQkJJnBmb2ItPm1jYy0+d3JiX2NvbnRleHQubGlzdF9oZWFkLAorCQkJCQkgc3RydWN0IGJlX21jY193cmJfY29udGV4dCwgbmV4dCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworCisJcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQKK19iZV9tY2NfZnJlZV93cmJfY29udGV4dChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHQpCit7CisJdW5zaWduZWQgbG9uZyBpcnE7CisKKwlBU1NFUlQoY29udGV4dCk7CisJLyoKKwkgKiBaZXJvIGR1cmluZyBmcmVlIHRvIHRyeSBhbmQgY2F0Y2ggYW55IGJ1Z3Mgd2hlcmUgdGhlIGNvbnRleHQKKwkgKiBpcyBhY2Nlc3NlZCBhZnRlciBhIGZyZWUuCisJICovCisJbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZihjb250ZXh0KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+bWNjX2NvbnRleHRfbG9jaywgaXJxKTsKKworCWlmIChjb250ZXh0ID09ICZwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dCkgeworCQkvKiBGcmVlIHRoZSBkZWZhdWx0IGNvbnRleHQuICovCisJCUFTU0VSVChwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQpOworCQlwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dF9hbGxvY2F0ZWQgPSBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBBZGQgdG8gZnJlZSBsaXN0LiAqLworCQlBU1NFUlQocGZvYi0+bWNjKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29udGV4dC0+bmV4dCwKKwkJCQkmcGZvYi0+bWNjLT53cmJfY29udGV4dC5saXN0X2hlYWQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPm1jY19jb250ZXh0X2xvY2ssIGlycSk7Cit9CisKK2ludAorYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCwKKwkJbWNjX2FzeW5jX2V2ZW50X2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KQoreworCS8qIExvY2sgYWdhaW5zdCBhbnlvbmUgdHJ5aW5nIHRvIGNoYW5nZSB0aGUgY2FsbGJhY2svY29udGV4dCBwb2ludGVycworCSAqIHdoaWxlIGJlaW5nIHVzZWQuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfbG9jaywKKwkJbWNjX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLT5jcV9pcnEpOworCisJLyogQXNzaWduIHRoZSBhc3luYyBjYWxsYmFjay4gKi8KKwltY2Nfb2JqZWN0LT5hc3luY19jb250ZXh0ID0gY2JfY29udGV4dDsKKwltY2Nfb2JqZWN0LT5hc3luY19jYiA9IGNiOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNjX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLT5jcV9sb2NrLAorCQkJCQltY2Nfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24tPmNxX2lycSk7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKworI2RlZmluZSBNUFVfRVBfQ09OVFJPTCAwCisjZGVmaW5lIE1QVV9FUF9TRU1BUEhPUkUgMHhhYworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZQorICogICBXYWl0cyB1bnRpbCB0aGUgQmxhZGVFbmdpbmUgUE9TVCBjb21wbGV0ZXMgKGVpdGhlciBpbiBlcnJvciBvciBzdWNjZXNzKS4KKyAqIHBmb2IgLQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCBzdGF0dXM7CisJaW50IHM7CisJdTMyIHBvc3RfZXJyb3IsIHBvc3Rfc3RhZ2U7CisKKwljb25zdCB1MzIgdXNfcGVyX2xvb3AgPSAxMDAwOwkvKiAxMDAwdXMgKi8KKwljb25zdCB1MzIgcHJpbnRfZnJlcXVlbmN5X2xvb3BzID0gMTAwMDAwMCAvIHVzX3Blcl9sb29wOworCWNvbnN0IHUzMiBtYXhfbG9vcHMgPSA2MCAqIHByaW50X2ZyZXF1ZW5jeV9sb29wczsKKwl1MzIgbG9vcHMgPSAwOworCisJLyoKKwkgKiBXYWl0IGZvciBhcm0gZncgaW5kaWNhdGluZyBpdCBpcyBkb25lIG9yIGEgZmF0YWwgZXJyb3IgaGFwcGVuZWQuCisJICogTm90ZTogUE9TVCBjYW4gdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24KKwkgKiBzZXR0aW5ncyAoY29uc2lkZXIgQVJNIGF0dGVtcHRzIHRvIGFjcXVpcmUgYW4gSVAgYWRkcmVzcworCSAqIG92ZXIgREhDUCEhISkuCisJICoKKwkgKi8KKwlkbyB7CisJCXN0YXR1cy5kd1swXSA9IGlvcmVhZDMyKHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCQlwb3N0X2Vycm9yID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJZXJyb3IsICZzdGF0dXMpOworCQlwb3N0X3N0YWdlID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULAorCQkJCQkJc3RhZ2UsICZzdGF0dXMpOworCQlpZiAoMCA9PSAobG9vcHMgJSBwcmludF9mcmVxdWVuY3lfbG9vcHMpKSB7CisJCQkvKiBQcmludCBjdXJyZW50IHN0YXR1cyAqLworCQkJVFJBQ0UoRExfSU5GTywgIlBPU1Qgc3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCQkJc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJfQorCQl1ZGVsYXkodXNfcGVyX2xvb3ApOworCX0gd2hpbGUgKChwb3N0X2Vycm9yICE9IDEpICYmCisJCSAocG9zdF9zdGFnZSAhPSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZKSAmJgorCQkgKCsrbG9vcHMgPCBtYXhfbG9vcHMpKTsKKworCWlmIChwb3N0X2Vycm9yID09IDEpIHsKKwkJVFJBQ0UoRExfRVJSLCAiUE9TVCBlcnJvciEgU3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCSAgICAgIHN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCXMgPSBCRV9OT1RfT0s7CisJfSBlbHNlIGlmIChwb3N0X3N0YWdlICE9IFBPU1RfU1RBR0VfQVJNRldfUkVBRFkpIHsKKwkJVFJBQ0UoRExfRVJSLCAiUE9TVCB0aW1lLW91dCEgU3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCSAgICAgIHN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCXMgPSBCRV9OT1RfT0s7CisJfSBlbHNlIHsKKwkJcyA9IEJFX1NVQ0NFU1M7CisJfQorCXJldHVybiBzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfa2lja29mZl9hbmRfd2FpdF9mb3JfUE9TVAorICogICBJbnRlcmFjdHMgd2l0aCB0aGUgQmxhZGVFbmdpbmUgbWFuYWdlbWVudCBwcm9jZXNzb3IgdG8gaW5pdGlhdGUgUE9TVCwgYW5kCisgKiAgIHN1YnNlcXVlbnRseSB3YWl0cyB1bnRpbCBQT1NUIGNvbXBsZXRlcyAoZWl0aGVyIGluIGVycm9yIG9yIHN1Y2Nlc3MpLgorICogICBUaGUgY2FsbGVyIG11c3QgYWNxdWlyZSB0aGUgcmVzZXQgc2VtYXBob3JlIGJlZm9yZSBpbml0aWF0aW5nIFBPU1QKKyAqICAgdG8gcHJldmVudCBtdWx0aXBsZSBkcml2ZXJzIGludGVyYWN0aW5nIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2Vzc29yLgorICogICBPbmNlIFBPU1QgaXMgY29tcGxldGUgdGhlIGNhbGxlciBtdXN0IHJlbGVhc2UgdGhlIHJlc2V0IHNlbWFwaG9yZS4KKyAqICAgQ2FsbGVycyB3aG8gb25seSB3YW50IHRvIHdhaXQgZm9yIFBPU1QgY29tcGxldGUgbWF5IGNhbGwKKyAqICAgYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZS4KKyAqIHBmb2IgLQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQKK2JlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1Qoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNUX0FNQVAgc3RhdHVzOworCWludCBzOworCisJY29uc3QgdTMyIHVzX3Blcl9sb29wID0gMTAwMDsJLyogMTAwMHVzICovCisJY29uc3QgdTMyIHByaW50X2ZyZXF1ZW5jeV9sb29wcyA9IDEwMDAwMDAgLyB1c19wZXJfbG9vcDsKKwljb25zdCB1MzIgbWF4X2xvb3BzID0gNSAqIHByaW50X2ZyZXF1ZW5jeV9sb29wczsKKwl1MzIgbG9vcHMgPSAwOworCXUzMiBwb3N0X2Vycm9yLCBwb3N0X3N0YWdlOworCisJLyogV2FpdCBmb3IgYXJtIGZ3IGF3YWl0aW5nIGhvc3QgcmVhZHkgb3IgYSBmYXRhbCBlcnJvciBoYXBwZW5lZC4gKi8KKwlUUkFDRShETF9JTkZPLCAiV2FpdCBmb3IgQmxhZGVFbmdpbmUgcmVhZHkgdG8gUE9TVCIpOworCWRvIHsKKwkJc3RhdHVzLmR3WzBdID0gaW9yZWFkMzIocGZvYi0+Y3NyX3ZhICsgTVBVX0VQX1NFTUFQSE9SRSk7CisJCXBvc3RfZXJyb3IgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsCisJCQkJCQllcnJvciwgJnN0YXR1cyk7CisJCXBvc3Rfc3RhZ2UgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsCisJCQkJCQlzdGFnZSwgJnN0YXR1cyk7CisJCWlmICgwID09IChsb29wcyAlIHByaW50X2ZyZXF1ZW5jeV9sb29wcykpIHsKKwkJCS8qIFByaW50IGN1cnJlbnQgc3RhdHVzICovCisJCQlUUkFDRShETF9JTkZPLCAiUE9TVCBzdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJCSAgICAgIHN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCX0KKwkJdWRlbGF5KHVzX3Blcl9sb29wKTsKKwl9IHdoaWxlICgocG9zdF9lcnJvciAhPSAxKSAmJgorCQkgKHBvc3Rfc3RhZ2UgPCBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZKSAmJgorCQkgKCsrbG9vcHMgPCBtYXhfbG9vcHMpKTsKKworCWlmIChwb3N0X2Vycm9yID09IDEpIHsKKwkJVFJBQ0UoRExfRVJSLCAiUHJlLVBPU1QgZXJyb3IhIFN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkgICAgICBzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQlzID0gQkVfTk9UX09LOworCX0gZWxzZSBpZiAocG9zdF9zdGFnZSA9PSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZKSB7CisJCWlvd3JpdGUzMihQT1NUX1NUQUdFX0hPU1RfUkRZLCBwZm9iLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFKTsKKworCQkvKiBXYWl0IGZvciBQT1NUIHRvIGNvbXBsZXRlICovCisJCXMgPSBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlKHBmb2IpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEVpdGhlciBhIHRpbWVvdXQgd2FpdGluZyBmb3IgaG9zdCByZWFkeSBzaWduYWwgb3IgUE9TVCBoYXMKKwkJICogbW92ZWQgYWhlYWQgd2l0aG91dCByZXF1aXJpbmcgYSBob3N0IHJlYWR5IHNpZ25hbC4KKwkJICogTWlnaHQgYXMgd2VsbCBnaXZlIFBPU1QgYSBjaGFuY2UgdG8gY29tcGxldGUKKwkJICogKG9yIHRpbWVvdXQgYWdhaW4pLgorCQkgKi8KKwkJcyA9IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUocGZvYik7CisJfQorCXJldHVybiBzOworfQorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfcGNpX3NvZnRfcmVzZXQKKyAqICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaXNzdWUgYSBCbGFkZUVuZ2luZSBzb2Z0IHJlc2V0LgorICogICBDYWxsZXJzIHNob3VsZCBhY3F1aXJlIHRoZSBzb2Z0IHJlc2V0IHNlbWFwaG9yZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgKiAgIGZ1bmN0aW9uLiBBZGRpdGlvbmFseSwgY2FsbGVycyBzaG91bGQgZW5zdXJlIHRoZXkgY2Fubm90IGJlIHByZS1lbXB0ZWQKKyAqICAgd2hpbGUgdGhlIHJvdXRpbmUgZXhlY3V0ZXMuIFVwb24gY29tcGxldGlvbiBvZiB0aGlzIHJvdXRpbmUsIGNhbGxlcnMKKyAqICAgc2hvdWxkIHJlbGVhc2UgdGhlIHJlc2V0IHNlbWFwaG9yZS4gVGhpcyByb3V0aW5lIGltcGxpY2l0bHkgd2FpdHMKKyAqICAgZm9yIEJsYWRlRW5naW5lIFBPU1QgdG8gY29tcGxldGUuCisgKiBwZm9iIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgYmVfcGNpX3NvZnRfcmVzZXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgc29mdF9yZXNldDsKKwlzdHJ1Y3QgUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgcGNpT25saW5lMDsKKwlzdHJ1Y3QgUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgcGNpT25saW5lMTsKKwlzdHJ1Y3QgRVBfQ09OVFJPTF9DU1JfQU1BUCBlcENvbnRyb2xDc3I7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJdTMyIGksIHNvZnRfcmVzZXRfYml0OworCisJVFJBQ0UoRExfTk9URSwgIlBDSSByZXNldC4uLiIpOworCisJLyogSXNzdWUgc29mdCByZXNldCAjMSB0byBnZXQgQmxhZGVFbmdpbmUgaW50byBhIGtub3duIHN0YXRlLiAqLworCXNvZnRfcmVzZXQuZHdbMF0gPSBQQ0lDRkcwX1JFQUQocGZvYiwgc29mdF9yZXNldCk7CisJQU1BUF9TRVRfQklUU19QVFIoUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSLCBzb2Z0cmVzZXQsIHNvZnRfcmVzZXQuZHcsIDEpOworCVBDSUNGRzBfV1JJVEUocGZvYiwgaG9zdF90aW1lcl9pbnRfY3RybCwgc29mdF9yZXNldC5kd1swXSk7CisJLyoKKwkgKiB3YWl0IHRpbCBzb2Z0IHJlc2V0IGlzIGRlYXNzZXJ0ZWQgLSBoYXJkd2FyZQorCSAqIGRlYXNzZXJ0cyBhZnRlciBzb21lIHRpbWUuCisJICovCisJaSA9IDA7CisJZG8geworCQl1ZGVsYXkoNTApOworCQlzb2Z0X3Jlc2V0LmR3WzBdID0gUENJQ0ZHMF9SRUFEKHBmb2IsIHNvZnRfcmVzZXQpOworCQlzb2Z0X3Jlc2V0X2JpdCA9IEFNQVBfR0VUX0JJVFNfUFRSKFBDSUNGR19TT0ZUX1JFU0VUX0NTUiwKKwkJCQkJc29mdHJlc2V0LCBzb2Z0X3Jlc2V0LmR3KTsKKwl9IHdoaWxlIChzb2Z0X3Jlc2V0X2JpdCAgJiYgKGkrKyA8IDEwMjQpKTsKKwlpZiAoc29mdF9yZXNldF9iaXQgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJTb2Z0LXJlc2V0ICMxIGRpZCBub3QgZGVhc3NlcnQgYXMgZXhwZWN0ZWQuIik7CisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwkJZ290byBFcnJvcl9sYWJlbDsKKwl9CisJLyogTWFzayBldmVyeXRoaW5nICAqLworCVBDSUNGRzBfV1JJVEUocGZvYiwgdWVfc3RhdHVzX2xvd19tYXNrLCAweEZGRkZGRkZGKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIHVlX3N0YXR1c19oaV9tYXNrLCAweEZGRkZGRkZGKTsKKwkvKgorCSAqIFNldCBldmVyeXRoaW5nIG9mZmxpbmUgZXhjZXB0IE1QVSBJUkFNIChpdCBpcyBvZmZsaW5lIHdpdGgKKwkgKiB0aGUgc29mdC1yZXNldCwgYnV0IHNvZnQtcmVzZXQgZG9lcyBub3QgcmVzZXQgdGhlIFBDSUNGRyByZWdpc3RlcnMhKQorCSAqLworCXBjaU9ubGluZTAuZHdbMF0gPSAwOworCXBjaU9ubGluZTEuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19PTkxJTkUxX0NTUiwgbXB1X2lyYW1fb25saW5lLAorCQkJCXBjaU9ubGluZTEuZHcsIDEpOworCVBDSUNGRzBfV1JJVEUocGZvYiwgb25saW5lMCwgcGNpT25saW5lMC5kd1swXSk7CisJUENJQ0ZHMF9XUklURShwZm9iLCBvbmxpbmUxLCBwY2lPbmxpbmUxLmR3WzBdKTsKKworCXVkZWxheSgyMDAwMCk7CisKKwkvKiBJc3N1ZSBzb2Z0IHJlc2V0ICMyLiAqLworCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19TT0ZUX1JFU0VUX0NTUiwgc29mdHJlc2V0LCBzb2Z0X3Jlc2V0LmR3LCAxKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIGhvc3RfdGltZXJfaW50X2N0cmwsIHNvZnRfcmVzZXQuZHdbMF0pOworCS8qCisJICogd2FpdCB0aWwgc29mdCByZXNldCBpcyBkZWFzc2VydGVkIC0gaGFyZHdhcmUKKwkgKiBkZWFzc2VydHMgYWZ0ZXIgc29tZSB0aW1lLgorCSAqLworCWkgPSAwOworCWRvIHsKKwkJdWRlbGF5KDUwKTsKKwkJc29mdF9yZXNldC5kd1swXSA9IFBDSUNGRzBfUkVBRChwZm9iLCBzb2Z0X3Jlc2V0KTsKKwkJc29mdF9yZXNldF9iaXQgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsCisJCQkJCXNvZnRyZXNldCwgc29mdF9yZXNldC5kdyk7CisJfSB3aGlsZSAoc29mdF9yZXNldF9iaXQgICYmIChpKysgPCAxMDI0KSk7CisJaWYgKHNvZnRfcmVzZXRfYml0ICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiU29mdC1yZXNldCAjMSBkaWQgbm90IGRlYXNzZXJ0IGFzIGV4cGVjdGVkLiIpOworCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJCWdvdG8gRXJyb3JfbGFiZWw7CisJfQorCisKKwl1ZGVsYXkoMjAwMDApOworCisJLyogVGFrZSBNUFUgb3V0IG9mIHJlc2V0LiAqLworCisJZXBDb250cm9sQ3NyLmR3WzBdID0gaW9yZWFkMzIocGZvYi0+Y3NyX3ZhICsgTVBVX0VQX0NPTlRST0wpOworCUFNQVBfU0VUX0JJVFNfUFRSKEVQX0NPTlRST0xfQ1NSLCBDUFVfcmVzZXQsICZlcENvbnRyb2xDc3IsIDApOworCWlvd3JpdGUzMigodTMyKWVwQ29udHJvbENzci5kd1swXSwgcGZvYi0+Y3NyX3ZhICsgTVBVX0VQX0NPTlRST0wpOworCisJLyogS2lja29mZiBCRSBQT1NUIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJc3RhdHVzID0gYmVfa2lja29mZl9hbmRfd2FpdF9mb3JfUE9TVChwZm9iKTsKKworRXJyb3JfbGFiZWw6CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfcGNpX3Jlc2V0X3JlcXVpcmVkCisgKiAgIFRoaXMgcHJpdmF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGV0ZWN0IGlmIGEgaG9zdCBlbnRpdHkgaXMKKyAqICAgcmVxdWlyZWQgdG8gaXNzdWUgYSBQQ0kgc29mdCByZXNldCBhbmQgc3Vic2VxdWVudGx5IGRyaXZlCisgKiAgIEJsYWRlRW5naW5lIFBPU1QuIFNjZW5hcmlvcyB3aGVyZSB0aGlzIGlzIHJlcXVpcmVkOgorICogICAxKSBCSU9TLWxlc3MgY29uZmlndXJhdGlvbgorICogICAyKSBIb3Qtc3dhcC9wbHVnL3Bvd2VyLW9uCisgKiBwZm9iIC0KKyAqIHJldHVybiAgIHRydWUgaWYgYSByZXNldCBpcyByZXF1aXJlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGJvb2wgYmVfcGNpX3Jlc2V0X3JlcXVpcmVkKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHN0YXR1czsKKwlib29sIGRvX3Jlc2V0ID0gZmFsc2U7CisJdTMyIHBvc3RfZXJyb3IsIHBvc3Rfc3RhZ2U7CisKKwkvKgorCSAqIFJlYWQgdGhlIFBPU1Qgc3RhdHVzIHJlZ2lzdGVyCisJICovCisJc3RhdHVzLmR3WzBdID0gaW9yZWFkMzIocGZvYi0+Y3NyX3ZhICsgTVBVX0VQX1NFTUFQSE9SRSk7CisJcG9zdF9lcnJvciA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwgZXJyb3IsCisJCQkJCQkJCSZzdGF0dXMpOworCXBvc3Rfc3RhZ2UgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsIHN0YWdlLAorCQkJCQkJCQkmc3RhdHVzKTsKKwlpZiAocG9zdF9zdGFnZSA8PSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZKSB7CisJCS8qCisJCSAqIElmIEJsYWRlRW5naW5lIGlzIHdhaXRpbmcgZm9yIGhvc3QgcmVhZHkgaW5kaWNhdGlvbiwKKwkJICogd2Ugd2FudCB0byBkbyBhIFBDSSByZXNldC4KKwkJICovCisJCWRvX3Jlc2V0ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZG9fcmVzZXQ7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9kcml2ZV9QT1NUCisgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRyaXZlIEJsYWRlRW5naW5lIFBPU1QuIFRoZQorICogICBjYWxsZXIgc2hvdWxkIGVuc3VyZSB0aGV5IGNhbm5vdCBiZSBwcmUtZW1wdGVkIHdoaWxlIHRoaXMgcm91dGluZSBleGVjdXRlcy4KKyAqIHBmb2IgLQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBiZV9kcml2ZV9QT1NUKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJaW50IHN0YXR1czsKKworCWlmIChmYWxzZSAhPSBiZV9wY2lfcmVzZXRfcmVxdWlyZWQocGZvYikpIHsKKwkJLyogUENJIHJlc2V0IGlzIG5lZWRlZCAoaW1wbGljaXRseSBzdGFydHMgYW5kIHdhaXRzIGZvciBQT1NUKSAqLworCQlzdGF0dXMgPSBiZV9wY2lfc29mdF9yZXNldChwZm9iKTsKKwl9IGVsc2UgeworCQkvKiBObyBQQ0kgcmVzZXQgaXMgbmVlZGVkLCBzdGFydCBQT1NUICovCisJCXN0YXR1cyA9IGJlX2tpY2tvZmZfYW5kX3dhaXRfZm9yX1BPU1QocGZvYik7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYzZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19tcHVfYW1hcF9oX18KKyNkZWZpbmUgX19tcHVfYW1hcF9oX18KKyNpbmNsdWRlICJlcC5oIgorCisvKiBQcm92aWRlIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgdGhlIE1hbmFnbWVudCBQcm9jZXNzb3IgVW5pdC4gKi8KK3N0cnVjdCBCRV9NUFVfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9FUF9DU1JNQVBfQU1BUCBlcDsKKwl1OCByc3ZkMFsxMjhdOwkvKiBEV09SRCA2NCAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgNjggKi8KKwl1OCByc3ZkMlsxOTJdOwkvKiBEV09SRCA2OSAqLworCXU4IHJzdmQzWzE5Ml07CS8qIERXT1JEIDc1ICovCisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCA4MSAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgODIgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDgzICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCA4NCAqLworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgODUgKi8KKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDg2ICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgODcgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCA4OCAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDg5ICovCisJdTggcnN2ZDEzWzMyXTsJLyogRFdPUkQgOTAgKi8KKwl1OCByc3ZkMTRbMzJdOwkvKiBEV09SRCA5MSAqLworCXU4IHJzdmQxNVszMl07CS8qIERXT1JEIDkyICovCisJdTggcnN2ZDE2WzMyXTsJLyogRFdPUkQgOTMgKi8KKwl1OCByc3ZkMTdbMzJdOwkvKiBEV09SRCA5NCAqLworCXU4IHJzdmQxOFszMl07CS8qIERXT1JEIDk1ICovCisJdTggcnN2ZDE5WzMyXTsJLyogRFdPUkQgOTYgKi8KKwl1OCByc3ZkMjBbMzJdOwkvKiBEV09SRCA5NyAqLworCXU4IHJzdmQyMVszMl07CS8qIERXT1JEIDk4ICovCisJdTggcnN2ZDIyWzMyXTsJLyogRFdPUkQgOTkgKi8KKwl1OCByc3ZkMjNbMzJdOwkvKiBEV09SRCAxMDAgKi8KKwl1OCByc3ZkMjRbMzJdOwkvKiBEV09SRCAxMDEgKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCAxMDIgKi8KKwl1OCByc3ZkMjZbMzJdOwkvKiBEV09SRCAxMDMgKi8KKwl1OCByc3ZkMjdbMzJdOwkvKiBEV09SRCAxMDQgKi8KKwl1OCByc3ZkMjhbOTZdOwkvKiBEV09SRCAxMDUgKi8KKwl1OCByc3ZkMjlbMzJdOwkvKiBEV09SRCAxMDggKi8KKwl1OCByc3ZkMzBbMzJdOwkvKiBEV09SRCAxMDkgKi8KKwl1OCByc3ZkMzFbMzJdOwkvKiBEV09SRCAxMTAgKi8KKwl1OCByc3ZkMzJbMzJdOwkvKiBEV09SRCAxMTEgKi8KKwl1OCByc3ZkMzNbMzJdOwkvKiBEV09SRCAxMTIgKi8KKwl1OCByc3ZkMzRbOTZdOwkvKiBEV09SRCAxMTMgKi8KKwl1OCByc3ZkMzVbMzJdOwkvKiBEV09SRCAxMTYgKi8KKwl1OCByc3ZkMzZbMzJdOwkvKiBEV09SRCAxMTcgKi8KKwl1OCByc3ZkMzdbMzJdOwkvKiBEV09SRCAxMTggKi8KKwl1OCByc3ZkMzhbMzJdOwkvKiBEV09SRCAxMTkgKi8KKwl1OCByc3ZkMzlbMzJdOwkvKiBEV09SRCAxMjAgKi8KKwl1OCByc3ZkNDBbMzJdOwkvKiBEV09SRCAxMjEgKi8KKwl1OCByc3ZkNDFbMTM0XVszMl07CS8qIERXT1JEIDEyMiAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNUFVfQ1NSTUFQX0FNQVAgeworCXUzMiBkd1syNTZdOworfTsKKworI2VuZGlmIC8qIF9fbXB1X2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1X2NvbnRleHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTkwZjljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX21wdV9jb250ZXh0X2FtYXBfaF9fCisjZGVmaW5lIF9fbXB1X2NvbnRleHRfYW1hcF9oX18KKworLyoKKyAqIE1hbmFnZW1lbnQgY29tbWFuZCBhbmQgY29udHJvbCByaW5nIGNvbnRleHQuIFRoZSBNUFVzIEJUTFJfQ1RSTDEgQ1NSCisgKiBjb250cm9scyB0aGUgd3JpdGViYWNrIGJlaGF2aW9yIG9mIHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZXIgaW5kZXggdmFsdWVzLgorICovCitzdHJ1Y3QgQkVfTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1OCBjb25faW5kZXhbMTZdOwkvKiBEV09SRCAwICovCisJdTggcmluZ19zaXplWzRdOwkvKiBEV09SRCAwICovCisJdTggY3FfaWRbMTFdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggcHJvZF9pbmRleFsxNl07CS8qIERXT1JEIDEgKi8KKwl1OCBwZGlkWzE1XTsJLyogRFdPUkQgMSAqLworCXU4IGludmFsaWQ7CQkvKiBEV09SRCAxICovCisJdTggY21kX3BlbmRpbmdfY3VycmVudFs3XTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQxWzI1XTsJLyogRFdPUkQgMiAqLworCXU4IGhwaV9wb3J0X2NxX2lkWzExXTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQyWzVdOwkvKiBEV09SRCAzICovCisJdTggY21kX3BlbmRpbmdfbWF4WzddOwkvKiBEV09SRCAzICovCisJdTggcnN2ZDNbOV07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1JJTkdfQ09OVEVYVF9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCisjZW5kaWYgLyogX19tcHVfY29udGV4dF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTU2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcGNpY2ZnLmgKQEAgLTAsMCArMSw4MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19wY2ljZmdfYW1hcF9oX18KKyNkZWZpbmUgX19wY2ljZmdfYW1hcF9oX18KKworLyogVmVuZG9yIGFuZCBEZXZpY2UgSUQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1OCB2ZW5kb3JpZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBkZXZpY2VpZFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0lEX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBJTyBCYXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIHsKKwl1OCBpb3NwYWNlOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggaW9iYXJbMjRdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19JT0JBUl9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAwIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTBdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMFsxOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMSAtIExvdyBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIHsKKwl1OCBtZW1zcGFjZTsJLyogRFdPUkQgMCAqLworCXU4IHR5cGVbMl07CQkvKiBEV09SRCAwICovCisJdTggcGY7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTNdOwkvKiBEV09SRCAwICovCisJdTggbWVtYmFyMWxvWzE1XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAxIC0gSGlnaCBBZGRyZXNzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1OCBtZW1iYXIxaGlbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNZW1vcnkgQkFSIDIgLSBMb3cgQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCB7CisJdTggbWVtc3BhY2U7CS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzJdOwkJLyogRFdPUkQgMCAqLworCXU4IHBmOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE3XTsJLyogRFdPUkQgMCAqLworCXU4IG1lbWJhcjJsb1sxMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjJfTE9fQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMiAtIEhpZ2ggQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTggbWVtYmFyMmhpWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU3Vic3lzdGVtIFZlbmRvciBhbmQgSUQgKEZ1bmN0aW9uIDApIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19TVUJTWVNURU1fSURfRjBfQ1NSX0FNQVAgeworCXU4IHN1YnN5c192ZW5kb3JfaWRbMTZdOwkvKiBEV09SRCAwICovCisJdTggc3Vic3lzX2lkWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTdWJzeXN0ZW0gVmVuZG9yIGFuZCBJRCAoRnVuY3Rpb24gMSkgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCB7CisJdTggc3Vic3lzX3ZlbmRvcl9pZFsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBzdWJzeXNfaWRbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TVUJTWVNURU1fSURfRjFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNlbWFwaG9yZSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1OCBsb2NrZWQ7CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMzFdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNvZnQgUmVzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgeworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCisJdTggc29mdHJlc2V0OwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTZdOwkvKiBEV09SRCAwICovCisJdTggbmVjX2xsX3JjdmRldGVjdF9pWzhdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIFN0YXR1cyAoTG93KSBSZWdpc3Rlci4gRWFjaCBiaXQgY29ycmVzcG9uZHMgdG8KKyAqIGFuIGludGVybmFsIFVucmVjb3ZlcmFibGUgRXJyb3IuICBUaGVzZSBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFuZCBtYXkgYmUKKyAqIGNsZWFyZWQgYnkgd3JpdGluZyBhIG9uZSB0byB0aGUgcmVzcGVjdGl2ZSBiaXQocykgdG8gYmUgY2xlYXJlZC4gIEFueQorICogYml0IGJlaW5nIHNldCB0aGF0IGlzIGFsc28gdW5tYXNrZWQgd2lsbCByZXN1bHQgaW4gVW5yZWNvdmVyYWJsZSBFcnJvcgorICogaW50ZXJydXB0IG5vdGlmaWNhdGlvbiB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ2VtZW50IGNoaXAKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgeworCXU4IGNldl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggZGJ1Zl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBlcnhfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcmRtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeGZfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdGltX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwb3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhpcHNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB1Y191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB3ZG1hX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0MV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwMF9vYl9saW5rX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdF9ncGlvX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1ib3hfbmV0d191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMxX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBTdGF0dXMgKEhpZ2gpIFJlZ2lzdGVyLiBFYWNoIGJpdCBjb3JyZXNwb25kcyB0bworICogYW4gaW50ZXJuYWwgVW5yZWNvdmVyYWJsZSBFcnJvci4gIFRoZXNlIGFyZSBzZXQgYnkgaGFyZHdhcmUgYW5kIG1heSBiZQorICogY2xlYXJlZCBieSB3cml0aW5nIGEgb25lIHRvIHRoZSByZXNwZWN0aXZlIGJpdChzKSB0byBiZSBjbGVhcmVkLiAgQW55CisgKiBiaXQgYmVpbmcgc2V0IHRoYXQgaXMgYWxzbyB1bm1hc2tlZCB3aWxsIHJlc3VsdCBpbiBVbnJlY292ZXJhYmxlIEVycm9yCisgKiBpbnRlcnJ1cHQgbm90aWZpY2F0aW9uIHRvIHRoZSBob3N0IENQVSBhbmQvb3IgU2VydmVyIE1hbmFnZW1lbnQgY2hpcDsKKyAqIGFuZCB0aGUgdHJhbnNpdGlvbmluZyBvZiBCbGFkZUVuZ2luZSB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB7CisJdTgganRhZ191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBscGNtZW1ob3N0X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1nbXRfbWFjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHBjczBvbmxpbmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcGNzMW9ubGluZV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwbWVtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4cHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhwYl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggeGF1aV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBhcm1fdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBVbnJlY292ZXJhYmxlIEVycm9yIE1hc2sgKExvdykgUmVnaXN0ZXIuIEVhY2ggYml0LCB3aGVuIHNldCB0byBvbmUsCisgKiB3aWxsIG1hc2sgdGhlIGFzc29jaWF0ZWQgVW5yZWNvdmVyYWJsZSAgRXJyb3Igc3RhdHVzIGJpdCBmcm9tIG5vdGlmaWNhdGlvbgorICogb2YgVW5yZWNvdmVyYWJsZSBFcnJvciB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ21lbnQgY2hpcCBhbmQgdGhlCisgKiB0cmFuc2l0aW9uaW5nIG9mIGFsbCBCbGFkZUVuZ2luZSB1bml0cyB0byBhbiBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTggY2V2X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBjdHhfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGVyeF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbXB1X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBuZG1hX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwdGNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4Zl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnhpcHNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDJfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRpbV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHBvc3RfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRwcmVfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHdkbWFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAwX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHAxX29iX2xpbmtfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWJveF9uZXR3X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X3N0b3JfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pbnRwZW5kX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBNYXNrIChIaWdoKSBSZWdpc3Rlci4gRWFjaCBiaXQsIHdoZW4gc2V0IHRvIG9uZSwKKyAqIHdpbGwgbWFzayB0aGUgYXNzb2NpYXRlZCBVbnJlY292ZXJhYmxlIEVycm9yIHN0YXR1cyBiaXQgZnJvbSBub3RpZmljYXRpb24KKyAqIG9mIFVucmVjb3ZlcmFibGUgRXJyb3IgdG8gdGhlIGhvc3QgQ1BVIGFuZC9vciBTZXJ2ZXIgTWFuYWdtZW50IGNoaXAgYW5kIHRoZQorICogdHJhbnNpdGlvbmluZyBvZiBhbGwgQmxhZGVFbmdpbmUgdW5pdHMgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB7CisJdTgganRhZ191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWdtdF9tYWNfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9pcmFtX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mxb25saW5lX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3RsMF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHBtZW1fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJyX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBiX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGFybV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggaXBjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBPbmxpbmUgQ29udHJvbCBSZWdpc3RlciAwLiBUaGlzIHJlZ2lzdGVyIGNvbnRyb2xzIHZhcmlvdXMgdW5pdHMgd2l0aGluCisgKiBCbGFkZUVuZ2luZSBiZWluZyBpbiBhbiBPbmxpbmUgb3IgT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHsKKwl1OCBjZXZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggY3R4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggZXJ4X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3Rfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbXB1X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IG5kbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcHRjX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnhmX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAyX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHRpbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0cHJlX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdWNfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggd2RtYV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcDBfb2JfbGlua19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwMV9vYl9saW5rX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X25ldHdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbWJveF9zdG9yX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaW50cGVuZF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE9ubGluZSBDb250cm9sIFJlZ2lzdGVyIDEuIFRoaXMgcmVnaXN0ZXIgY29udHJvbHMgdmFyaW91cyB1bml0cyB3aXRoaW4KKyAqIEJsYWRlRW5naW5lIGJlaW5nIGluIGFuIE9ubGluZSBvciBPZmZsaW5lIHN0YXRlLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXU4IGp0YWdfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtZ210X21hY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaXJhbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBjczFvbmxpbmVfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcG1lbV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBycl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4cGJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHhwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggYXJtX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGlwY19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIEhvc3QgVGltZXIgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgeworCXU4IGhvc3R0aW1lclsyNF07CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0aW50cjsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzddOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTY3JhdGNocGFkIFJlZ2lzdGVyIChmb3Igc29mdHdhcmUgdXNlKS4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU0NSQVRDSFBBRF9DU1JfQU1BUCB7CisJdTggc2NyYXRjaHBhZFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgeworCXU4IGNhcGlkWzhdOwkvKiBEV09SRCAwICovCisJdTggbmV4dGNhcFs4XTsJLyogRFdPUkQgMCAqLworCXU4IGNhcHZlcls0XTsJLyogRFdPUkQgMCAqLworCXU4IGRldnBvcnRbNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgRGV2aWNlIENhcGFiaWxpdGllcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXU4IHBheWxvYWRbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszXTsJLyogRFdPUkQgMCAqLworCXU4IGxvX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IGwxX2xhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBwd3JfdmFsdWVbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBwd3Jfc2NhbGVbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkM1s0XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIERldmljZSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgeworCXU4IENvcnJFcnJSZXBvcnRFbjsJLyogRFdPUkQgMCAqLworCXU4IE5vbkZhdGFsRXJyUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyclJlcG9ydEVuOwkvKiBEV09SRCAwICovCisJdTggVW5zdXBwUmVxUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVSZWxheE9yZGVyOwkvKiBEV09SRCAwICovCisJdTggTWF4X1BheWxvYWRfU2l6ZVszXTsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFRhZ0ZpZWxkRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggUGhhbnRvbUZuRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggQXV4UHdyUE1FbmFibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBFbmFibGVOb1Nub29wOwkvKiBEV09SRCAwICovCisJdTggTWF4X1JlYWRfUmVxX1NpemVbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBDb3JyRXJyRGV0ZWN0OwkvKiBEV09SRCAwICovCisJdTggTm9uRmF0YWxFcnJEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBGYXRhbEVyckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFVuc3VwcFJlcURldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IEF1eFB3ckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IFRyYW5zUGVuZGluZzsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzEwXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgeworCXU4IE1heExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE1heExpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IEFTUE1TdXBwb3J0WzJdOwkvKiBEV09SRCAwICovCisJdTggTDBzRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IEwxRXhpdExhdFszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzZdOwkvKiBEV09SRCAwICovCisJdTggUG9ydE51bVs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTGluayBTdGF0dXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgeworCXU4IEFTUE1DdGxbMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMDsJCS8qIERXT1JEIDAgKi8KKwl1OCBSZWFkQ21wbEJuZHJ5OwkvKiBEV09SRCAwICovCisJdTggTGlua0Rpc2FibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBSZXRyYWluTGluazsJLyogRFdPUkQgMCAqLworCXU4IENvbW1vbkNsa0NvbmZpZzsJLyogRFdPUkQgMCAqLworCXU4IEV4dGVuZFN5bmM7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtTcGVlZFs0XTsJLyogRFdPUkQgMCAqLworCXU4IE5lZ0xpbmtXaWR0aFs2XTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbkVycjsJLyogRFdPUkQgMCAqLworCXU4IExpbmtUcmFpbjsJLyogRFdPUkQgMCAqLworCXU4IFNsb3RDbGtDb25maWc7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMlszXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTggY2FwaWRbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBuZXh0cHRyWzhdOwkvKiBEV09SRCAwICovCisJdTggdGFibGVzaXplWzExXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzNdOwkvKiBEV09SRCAwICovCisJdTggZnVuY21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBlbjsJCS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTVNJLVggVGFibGUgT2Zmc2V0IFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIHsKKwl1OCB0YWJsZWJpclszXTsJLyogRFdPUkQgMCAqLworCXU4IG9mZnNldFsyOV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1TSS1YIFBCQSBPZmZzZXQgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfUEJBX0NTUl9BTUFQIHsKKwl1OCBwYmFiaXJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBvZmZzZXRbMjldOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogUENJIEV4cHJlc3MgTVNJLVggTWVzc2FnZSBWZWN0b3IgQ29udHJvbCBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB7CisJdTggdmVjdG9yX2NvbnRyb2w7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszMV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgRGF0YSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfREFUQV9DU1JfQU1BUCB7CisJdTggZGF0YVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIEhpZ2ggUGFydC4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCB7CisJdTggYWRkclszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01TSVhfTVNHX0FERFJfSElfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgQWRkcmVzcyBSZWdpc3RlciAtIExvdyBQYXJ0LiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1OCByc3ZkMFsyXTsJLyogRFdPUkQgMCAqLworCXU4IGFkZHJbMzBdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMThfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMTlfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyNV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIwX1JTVkRfQU1BUCB7CisJdTMyIGR3WzI2XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE5MTldWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMV9SU1ZEX0FNQVAgeworCXUzMiBkd1sxOTIwXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9WRUNUT1JfQ09OVFJPTF9DU1JfQU1BUCB2ZWNfY3RybDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgbXNnX2RhdGE7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0hJX0NTUl9BTUFQIGFkZHJfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19BRERSX0xPX0NTUl9BTUFQIGFkZHJfbG93OworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yM19SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzg5NV1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzIzX1JTVkRfQU1BUCB7CisJdTMyIGR3Wzg5Nl07Cit9OworCisvKiBUaGVzZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSByZWdpc3RlcnMgYXJlIGZvciB0aGUgU3RvcmFnZSAgRnVuY3Rpb24gb2YKKyAqIEJsYWRlRW5naW5lIChGdW5jdGlvbiAwKS4gSW4gdGhlIG1lbW9yeSBtYXAgb2YgdGhlIHJlZ2lzdGVycyBiZWxvdyB0aGVpcgorICogdGFibGUsCisgKi8KK3N0cnVjdCBCRV9QQ0lDRkcwX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lEX0NTUl9BTUFQIGlkOworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMiAqLworCXU4IHJzdmQyWzMyXTsJLyogRFdPUkQgMyAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSU9CQVJfQ1NSX0FNQVAgaW9iYXI7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIwX0NTUl9BTUFQIG1lbWJhcjA7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0xPX0NTUl9BTUFQIG1lbWJhcjFfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIxX0hJX0NTUl9BTUFQIG1lbWJhcjFfaGk7CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0xPX0NTUl9BTUFQIG1lbWJhcjJfbG87CisJc3RydWN0IEJFX1BDSUNGR19NRU1CQVIyX0hJX0NTUl9BTUFQIG1lbWJhcjJfaGk7CisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAxMCAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHN1YnN5c3RlbV9pZDsKKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDEyICovCisJdTggcnN2ZDVbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDE1ICovCisJc3RydWN0IEJFX1BDSUNGR19TRU1BUEhPUkVfQ1NSX0FNQVAgc2VtYXBob3JlWzRdOworCXN0cnVjdCBCRV9QQ0lDRkdfU09GVF9SRVNFVF9DU1JfQU1BUCBzb2Z0X3Jlc2V0OworCXU4IHJzdmQ4WzMyXTsJLyogRFdPUkQgMjEgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgc2NyYXRjaHBhZDsKKwl1OCByc3ZkOVszMl07CS8qIERXT1JEIDIzICovCisJdTggcnN2ZDEwWzMyXTsJLyogRFdPUkQgMjQgKi8KKwl1OCByc3ZkMTFbMzJdOwkvKiBEV09SRCAyNSAqLworCXU4IHJzdmQxMlszMl07CS8qIERXT1JEIDI2ICovCisJdTggcnN2ZDEzWzMyXTsJLyogRFdPUkQgMjcgKi8KKwl1OCByc3ZkMTRbMl1bMzJdOwkvKiBEV09SRCAyOCAqLworCXU4IHJzdmQxNVszMl07CS8qIERXT1JEIDMwICovCisJdTggcnN2ZDE2WzMyXTsJLyogRFdPUkQgMzEgKi8KKwl1OCByc3ZkMTdbOF1bMzJdOwkvKiBEV09SRCAzMiAqLworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0xPV19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93OworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX0NTUl9BTUFQIHVlX3N0YXR1c19oaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfbG93X21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB1ZV9zdGF0dXNfaGlfbWFzazsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTBfQ1NSX0FNQVAgb25saW5lMDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX09OTElORTFfQ1NSX0FNQVAgb25saW5lMTsKKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCA0NiAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDQ3ICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgNDggKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCA0OSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCBob3N0X3RpbWVyX2ludF9jdHJsOworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDUxICovCisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0NBUF9DU1JfQU1BUCBwY2llX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfREVWQ0FQX0NTUl9BTUFQIHBjaWVfZGV2Y2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DT05UUk9MX1NUQVRVU19DU1JfQU1BUCBwY2llX2NvbnRyb2xfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX0NBUF9DU1JfQU1BUCBwY2llX2xpbmtfY2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9MSU5LX1NUQVRVU19DU1JfQU1BUCBwY2llX2xpbmtfc3RhdHVzOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJX0NTUl9BTUFQIG1zaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVEFCTEVfQ1NSX0FNQVAgbXNpeF90YWJsZV9vZmZzZXQ7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCBtc2l4X3BiYV9vZmZzZXQ7CisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgNjAgKi8KKwl1OCByc3ZkMjRbMzJdOwkvKiBEV09SRCA2MSAqLworCXU4IHJzdmQyNVszMl07CS8qIERXT1JEIDYyICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgNjMgKi8KKwl1OCByc3ZkMjdbMzJdOwkvKiBEV09SRCA2NCAqLworCXU4IHJzdmQyOFszMl07CS8qIERXT1JEIDY1ICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgNjYgKi8KKwl1OCByc3ZkMzBbMzJdOwkvKiBEV09SRCA2NyAqLworCXU4IHJzdmQzMVszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDMyWzMyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkMzNbMzJdOwkvKiBEV09SRCA3MCAqLworCXU4IHJzdmQzNFszMl07CS8qIERXT1JEIDcxICovCisJdTggcnN2ZDM1WzMyXTsJLyogRFdPUkQgNzIgKi8KKwl1OCByc3ZkMzZbMzJdOwkvKiBEV09SRCA3MyAqLworCXU4IHJzdmQzN1szMl07CS8qIERXT1JEIDc0ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzlbMzJdOwkvKiBEV09SRCA3NiAqLworCXU4IHJzdmQ0MFszMl07CS8qIERXT1JEIDc3ICovCisJdTggcnN2ZDQxWzMyXTsJLyogRFdPUkQgNzggKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQ0M1szMl07CS8qIERXT1JEIDgwICovCisJdTggcnN2ZDQ0WzMyXTsJLyogRFdPUkQgODEgKi8KKwl1OCByc3ZkNDVbMzJdOwkvKiBEV09SRCA4MiAqLworCXU4IHJzdmQ0NlszMl07CS8qIERXT1JEIDgzICovCisJdTggcnN2ZDQ3WzMyXTsJLyogRFdPUkQgODQgKi8KKwl1OCByc3ZkNDhbMzJdOwkvKiBEV09SRCA4NSAqLworCXU4IHJzdmQ0OVszMl07CS8qIERXT1JEIDg2ICovCisJdTggcnN2ZDUwWzMyXTsJLyogRFdPUkQgODcgKi8KKwl1OCByc3ZkNTFbMzJdOwkvKiBEV09SRCA4OCAqLworCXU4IHJzdmQ1MlszMl07CS8qIERXT1JEIDg5ICovCisJdTggcnN2ZDUzWzMyXTsJLyogRFdPUkQgOTAgKi8KKwl1OCByc3ZkNTRbMzJdOwkvKiBEV09SRCA5MSAqLworCXU4IHJzdmQ1NVszMl07CS8qIERXT1JEIDkyICovCisJdTggcnN2ZDU2WzgzMl07CS8qIERXT1JEIDkzICovCisJdTggcnN2ZDU3WzMyXTsJLyogRFdPUkQgMTE5ICovCisJdTggcnN2ZDU4WzMyXTsJLyogRFdPUkQgMTIwICovCisJdTggcnN2ZDU5WzMyXTsJLyogRFdPUkQgMTIxICovCisJdTggcnN2ZDYwWzMyXTsJLyogRFdPUkQgMTIyICovCisJdTggcnN2ZDYxWzMyXTsJLyogRFdPUkQgMTIzICovCisJdTggcnN2ZDYyWzMyXTsJLyogRFdPUkQgMTI0ICovCisJdTggcnN2ZDYzWzMyXTsJLyogRFdPUkQgMTI1ICovCisJdTggcnN2ZDY0WzMyXTsJLyogRFdPUkQgMTI2ICovCisJdTggcnN2ZDY1WzMyXTsJLyogRFdPUkQgMTI3ICovCisJdTggcnN2ZDY2WzYxNDQwXTsJLyogRFdPUkQgMTI4ICovCisJc3RydWN0IEJFX1BDSUNGR19BTk9OXzIyX01FU1NBR0VfQU1BUCBtZXNzYWdlWzMyXTsKKwl1OCByc3ZkNjdbMjg2NzJdOwkvKiBEV09SRCAyMTc2ICovCisJdTggcnN2ZDY4WzMyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQ2OVsxMDIzXVszMl07CS8qIERXT1JEIDMwNzMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHMF9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzQwOTZdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI0X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI1X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI2X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI3X1JTVkRfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbM11bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzI4X1JTVkRfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzI5X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzZdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yOV9SU1ZEX0FNQVAgeworCXUzMiBkd1szN107Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxOTMwXVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzBfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMTkzMV07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgdmVjX2N0cmw7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19EQVRBX0NTUl9BTUFQIG1zZ19kYXRhOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCBhZGRyX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCBhZGRyX2xvdzsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzJfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4OTVdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8zMl9SU1ZEX0FNQVAgeworCXUzMiBkd1s4OTZdOworfTsKKworLyogVGhpcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlciBtYXAgaXMgZm9yIHRoZSAgTmV0d29ya2luZyBGdW5jdGlvbiBvZgorICogQmxhZGVFbmdpbmUgKEZ1bmN0aW9uIDEpLgorICovCitzdHJ1Y3QgQkVfUENJQ0ZHMV9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX1BDSUNGR19JRF9DU1JfQU1BUCBpZDsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDMgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIGlvYmFyOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMF9DU1JfQU1BUCBtZW1iYXIwOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCBtZW1iYXIxX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCBtZW1iYXIxX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCBtZW1iYXIyX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCBtZW1iYXIyX2hpOworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMTAgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMV9DU1JfQU1BUCBzdWJzeXN0ZW1faWQ7CisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxNSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHNlbWFwaG9yZVs0XTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgc29mdF9yZXNldDsKKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDIxICovCisJc3RydWN0IEJFX1BDSUNGR19TQ1JBVENIUEFEX0NTUl9BTUFQIHNjcmF0Y2hwYWQ7CisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDE0WzJdWzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCAzMCAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDMxICovCisJdTggcnN2ZDE3WzhdWzMyXTsJLyogRFdPUkQgMzIgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvdzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB1ZV9zdGF0dXNfaGk7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvd19tYXNrOworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2hpX21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIG9ubGluZTA7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUxX0NTUl9BTUFQIG9ubGluZTE7CisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgNDYgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCA0NyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDQ4ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgNDkgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgaG9zdF90aW1lcl9pbnRfY3RybDsKKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCA1MSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgcGNpZV9jYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0RFVkNBUF9DU1JfQU1BUCBwY2llX2RldmNhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgcGNpZV9jb250cm9sX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgcGNpZV9saW5rX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgcGNpZV9saW5rX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCBtc2k7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIG1zaXhfdGFibGVfb2Zmc2V0OworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9QQkFfQ1NSX0FNQVAgbXNpeF9wYmFfb2Zmc2V0OworCXU4IHJzdmQyM1s2NF07CS8qIERXT1JEIDYwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgNjIgKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCA2MyAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDY0ICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgNjUgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCA2NiAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDY3ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgNjggKi8KKwl1OCByc3ZkMzFbMzJdOwkvKiBEV09SRCA2OSAqLworCXU4IHJzdmQzMlszMl07CS8qIERXT1JEIDcwICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgNzEgKi8KKwl1OCByc3ZkMzRbMzJdOwkvKiBEV09SRCA3MiAqLworCXU4IHJzdmQzNVszMl07CS8qIERXT1JEIDczICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgNzQgKi8KKwl1OCByc3ZkMzdbMTI4XTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkMzhbMzJdOwkvKiBEV09SRCA3OSAqLworCXU4IHJzdmQzOVsxMTg0XTsJLyogRFdPUkQgODAgKi8KKwl1OCByc3ZkNDBbNjE3OTJdOwkvKiBEV09SRCAxMTcgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMzFfTUVTU0FHRV9BTUFQIG1lc3NhZ2VbMzJdOworCXU4IHJzdmQ0MVsyODY3Ml07CS8qIERXT1JEIDIxNzYgKi8KKwl1OCByc3ZkNDJbMzJdOwkvKiBEV09SRCAzMDcyICovCisJdTggcnN2ZDQzWzEwMjNdWzMyXTsJLyogRFdPUkQgMzA3MyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkcxX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbNDA5Nl07Cit9OworCisjZW5kaWYgLyogX19wY2ljZmdfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9wb3N0X2NvZGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTYyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fcG9zdF9jb2Rlc19hbWFwX2hfXworI2RlZmluZSBfX3Bvc3RfY29kZXNfYW1hcF9oX18KKworLyogLS0tIE1HTVRfSEJBX1BPU1RfU1RBR0VfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9QT1dFUl9PTl9SRVNFVCAgICgwKQkvKiBTdGF0ZSBhZnRlciBhIGNvbGQgb3Igd2FybSBib290LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZICgxKQkvKiBBUk0gYm9vdCBjb2RlIGF3YWl0aW5nIGEKKwkJCQkJCWdvLWFoZWQgZnJvbSAgdGhlIGhvc3QuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfSE9TVF9SRFkgKDIpCS8qIEhvc3QgaGFzIGdpdmVuIGdvLWFoZWQgdG8gQVJNLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUICgzKQkvKiBIb3N0IHdhbnRzIHRvIHJlc2V0IGNoaXAsIHRoaXMgaXMgYSAgY2hpcAorCQkJCQkJd29ya2Fyb3VuZCAgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9TRUVQUk9NX0NTX1NUQVJUICgyNTYpCS8qIFNFRVBST00gY2hlY2tzdW0KKwkJCQkJCXRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfU0VFUFJPTV9DU19ET05FICAoMjU3KQkvKiBTRUVQUk9NIGNoZWNrc3VtIHRlc3QKKwkJCQkJCQlkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DT05GSUdfU1RBUlQgKDUxMikJLyogRERSIGNvbmZpZ3VyYXRpb24gc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX0NPTkZJR19ET05FICAoNTEzKQkvKiBERFIgY29uZmlndXJhdGlvbiBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DQUxJQlJBVEVfU1RBUlQgICg3NjgpCS8qIEREUiBjYWxpYnJhdGlvbiBzdGFydC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfQ0FMSUJSQVRFX0RPTkUgICAoNzY5KQkvKiBERFIgY2FsaWJyYXRpb24gZG9uZS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfVEVTVF9TVEFSVCAgICgxMDI0KQkvKiBERFIgbWVtb3J5IHRlc3Qgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX1RFU1RfRE9ORSAgICAoMTAyNSkJLyogRERSIG1lbW9yeSB0ZXN0IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVEQk9PVF9JTklUX1NUQVJUICAgKDE1MzYpCS8qIFJlZGJvb3Qgc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SRURCT09UX0lOSVRfRE9ORSAoMTUzNykJLyogUmVkYm9vdCBkb25lIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9GV19JTUFHRV9MT0FEX1NUQVJUICgxNzkyKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkIHRvCisJCQkJCQkJRERSIHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZXX0lNQUdFX0xPQURfRE9ORSAgICgxNzkzKQkvKiBGaXJtd2FyZSBpbWFnZSBsb2FkCisJCQkJCQkJdG8gRERSIGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfU1RBUlQgICAgICAgICAgKDIwNDgpCS8qIEFSTWZ3IHJ1bnRpbWUgY29kZQorCQkJCQkJc3RhcnRzIGV4ZWN1dGlvbi4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ESENQX1FVRVJZX1NUQVJUICAgICAoMjMwNCkJLyogREhDUCBzZXJ2ZXIgcXVlcnkgc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfREhDUF9RVUVSWV9ET05FICAgICAgKDIzMDUpCS8qIERIQ1Agc2VydmVyIHF1ZXJ5IGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQk9PVF9UQVJHRVRfRElTQ09WRVJZX1NUQVJUICgyNTYwKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IFN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JPT1RfVEFSR0VUX0RJU0NPVkVSWV9ET05FICgyNTYxKQkvKiBCb290IFRhcmdldAorCQkJCQkJRGlzY292ZXJ5IERvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkNfT1BUSU9OX1NFVCAgICAgICAgKDI4MTYpCS8qIFJlbW90ZSBjb25maWd1cmF0aW9uCisJCQkJCQlvcHRpb24gaXMgc2V0IGluICBTRUVQUk9NICAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NXSVRDSF9MSU5LICAgICAgICAgICgyODE3KQkvKiBXYWl0IGZvciBsaW5rIHVwIG9uIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NFTkRfSUNEU19NRVNTQUdFICAgICgyODE4KQkvKiBTZW5kIHRoZSBJQ0RTIG1lc3NhZ2UKKwkJCQkJCXRvIHN3aXRjaCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BFUkZST01fVEZUUCAgICAgICAgICgyODE5KQkvKiBEb3dubG9hZCB4bWwgdXNpbmcgVEZUUCAqLworI2RlZmluZSBQT1NUX1NUQUdFX1BBUlNFX1hNTCAgICAgICAgICAgICgyODIwKQkvKiBQYXJzZSBYTUwgZmlsZSAqLworI2RlZmluZSBQT1NUX1NUQUdFX0RPV05MT0FEX0lNQUdFICAgICAgICgyODIxKQkvKiBEb3dubG9hZCBJTUFHRSBmcm9tCisJCQkJCQlURlRQIHNlcnZlciAqLworI2RlZmluZSBQT1NUX1NUQUdFX0ZMQVNIX0lNQUdFICAgICAgICAgICgyODIyKQkvKiBGbGFzaCB0aGUgSU1BR0UgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SQ19ET05FICAgICAgICAgICAgICAoMjgyMykJLyogUmVtb3RlIGNvbmZpZ3VyYXRpb24KKwkJCQkJCWNvbXBsZXRlICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVCT09UX1NZU1RFTSAgICAgICAgKDI4MjQpCS8qIFVwZ3JhZGUgSU1BR0UgZG9uZSwKKwkJCQkJCXJlYm9vdCByZXF1aXJlZCAqLworI2RlZmluZSBQT1NUX1NUQUdFX01BQ19BRERSRVNTICAgICAgICAgICgzMDcyKQkvKiBNQUMgQWRkcmVzcyBDaGVjayAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1JFQURZICAgICAgICAgICg0OTE1MikJLyogQVJNZncgaXMgZG9uZSB3aXRoIFBPU1QKKwkJCQkJCWFuZCByZWFkeS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9BUk1GV19VRSAgICAgICAgICAgICAoNjE0NDApCS8qIEFSTWZ3IGhhcyBhc3NlcnRlZCBhbgorCQkJCQkJdW5yZWNvdmVyYWJsZSBlcnJvci4gVGhlCisJCQkJCQlsb3dlciAzIGhleCBkaWdpdHMgb2YgdGhlCisJCQkJCQlzdGFnZSBjb2RlIGlkZW50aWZ5IHRoZQorCQkJCQkJdW5pcXVlIGVycm9yIGNvZGUuCisJCQkJCQkqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIE1QVSBzZW1hcGhvcmUKKyAqIHJlZ2lzdGVyIHdoZW4gdXNlZCBmb3IgUE9TVC4KKyAqLworc3RydWN0IEJFX01HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1OCBzdGFnZVsxNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxMF07CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9kcml2ZXJfbG9hZGVkOwkvKiBEV09SRCAwICovCisJdTggb3B0aW9uX3JvbV9pbnN0YWxsZWQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9pcF9jb25mbGljdDsJLyogRFdPUkQgMCAqLworCXU4IGlzY3NpX25vX2lwOwkvKiBEV09SRCAwICovCisJdTggYmFja3VwX2Z3OwkvKiBEV09SRCAwICovCisJdTggZXJyb3I7CQkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiAtLS0gTUdNVF9IQkFfUE9TVF9EVU1NWV9CSVRTX0VOVU0gLS0tICovCisjZGVmaW5lIFBPU1RfQklUX0lTQ1NJX0xPQURFRCAgICAgICAgICAgKDI2KQorI2RlZmluZSBQT1NUX0JJVF9PUFRST01fSU5TVCAgICAgICAgICAgICgyNykKKyNkZWZpbmUgUE9TVF9CSVRfQkFEX0lQX0FERFIgICAgICAgICAgICAoMjgpCisjZGVmaW5lIFBPU1RfQklUX05PX0lQX0FERFIgICAgICAgICAgICAgKDI5KQorI2RlZmluZSBQT1NUX0JJVF9CQUNLVVBfRlcgICAgICAgICAgICAgICgzMCkKKyNkZWZpbmUgUE9TVF9CSVRfRVJST1IgICAgICAgICAgICAgICAgICAoMzEpCisKKy8qIC0tLSBNR01UX0hCQV9QT1NUX0RVTU1ZX1ZBTFVFU19FTlVNIC0tLSAqLworI2RlZmluZSBQT1NUX0lTQ1NJX0RSSVZFUl9MT0FERUQgICAgICAgICg2NzEwODg2NCkKKyNkZWZpbmUgUE9TVF9PUFRST01fSU5TVEFMTEVEICAgICAgICAgICAoMTM0MjE3NzI4KQorI2RlZmluZSBQT1NUX0lTQ1NJX0lQX0FERFJFU1NfQ09ORkxJQ1QgICgyNjg0MzU0NTYpCisjZGVmaW5lIFBPU1RfSVNDU0lfTk9fSVBfQUREUkVTUyAgICAgICAgKDUzNjg3MDkxMikKKyNkZWZpbmUgUE9TVF9CQUNLVVBfRldfTE9BREVEICAgICAgICAgICAoMTA3Mzc0MTgyNCkKKyNkZWZpbmUgUE9TVF9GQVRBTF9FUlJPUiAgICAgICAgICAgICAgICAoMjE0NzQ4MzY0OCkKKworI2VuZGlmIC8qIF9fcG9zdF9jb2Rlc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTZiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcmVnbWFwLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX3JlZ21hcF9hbWFwX2hfXworI2RlZmluZSBfX3JlZ21hcF9hbWFwX2hfXworI2luY2x1ZGUgInBjaWNmZy5oIgorI2luY2x1ZGUgImVwLmgiCisjaW5jbHVkZSAiY2V2LmgiCisjaW5jbHVkZSAibXB1LmgiCisjaW5jbHVkZSAiZG9vcmJlbGxzLmgiCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgbWFwIGZvciBCbGFkZUVuZ2luZSwgc2hvd2luZworICogdGhlIHJlbGF0aXZlIHNpemUgYW5kIG9mZnNldCBvZiBlYWNoIHN1Yi1tb2R1bGUuIFRoZSBDU1IgcmVnaXN0ZXJzCisgKiBhcmUgaWRlbnRpY2FsIGZvciB0aGUgbmV0d29yayBhbmQgc3RvcmFnZSBQQ0kgZnVuY3Rpb25zLiBUaGUKKyAqIENTUiBtYXAgaXMgc2hvd24gYmVsb3csIGZvbGxvd2VkIGJ5IGRldGFpbHMgb2YgZWFjaCBibG9jaywKKyAqIGluIHN1Yi1zZWN0aW9ucy4gIFRoZSBzdWItc2VjdGlvbnMgYmVnaW4gd2l0aCBhIGRlc2NyaXB0aW9uCisgKiBvZiBDU1JzIHRoYXQgYXJlIGluc3RhbnRpYXRlZCBpbiBtdWx0aXBsZSBibG9ja3MuCisgKi8KK3N0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9NUFVfQ1NSTUFQX0FNQVAgbXB1OworCXU4IHJzdmQwWzgxOTJdOwkvKiBEV09SRCAyNTYgKi8KKwl1OCByc3ZkMVs4MTkyXTsJLyogRFdPUkQgNTEyICovCisJc3RydWN0IEJFX0NFVl9DU1JNQVBfQU1BUCBjZXY7CisJdTggcnN2ZDJbODE5Ml07CS8qIERXT1JEIDEwMjQgKi8KKwl1OCByc3ZkM1s4MTkyXTsJLyogRFdPUkQgMTI4MCAqLworCXU4IHJzdmQ0WzgxOTJdOwkvKiBEV09SRCAxNTM2ICovCisJdTggcnN2ZDVbODE5Ml07CS8qIERXT1JEIDE3OTIgKi8KKwl1OCByc3ZkNls4MTkyXTsJLyogRFdPUkQgMjA0OCAqLworCXU4IHJzdmQ3WzgxOTJdOwkvKiBEV09SRCAyMzA0ICovCisJdTggcnN2ZDhbODE5Ml07CS8qIERXT1JEIDI1NjAgKi8KKwl1OCByc3ZkOVs4MTkyXTsJLyogRFdPUkQgMjgxNiAqLworCXU4IHJzdmQxMFs4MTkyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQxMVs4MTkyXTsJLyogRFdPUkQgMzMyOCAqLworCXU4IHJzdmQxMls4MTkyXTsJLyogRFdPUkQgMzU4NCAqLworCXU4IHJzdmQxM1s4MTkyXTsJLyogRFdPUkQgMzg0MCAqLworCXU4IHJzdmQxNFs4MTkyXTsJLyogRFdPUkQgNDA5NiAqLworCXU4IHJzdmQxNVs4MTkyXTsJLyogRFdPUkQgNDM1MiAqLworCXU4IHJzdmQxNls4MTkyXTsJLyogRFdPUkQgNDYwOCAqLworCXU4IHJzdmQxN1s4MTkyXTsJLyogRFdPUkQgNDg2NCAqLworCXU4IHJzdmQxOFs4MTkyXTsJLyogRFdPUkQgNTEyMCAqLworCXU4IHJzdmQxOVs4MTkyXTsJLyogRFdPUkQgNTM3NiAqLworCXU4IHJzdmQyMFs4MTkyXTsJLyogRFdPUkQgNTYzMiAqLworCXU4IHJzdmQyMVs4MTkyXTsJLyogRFdPUkQgNTg4OCAqLworCXU4IHJzdmQyMls4MTkyXTsJLyogRFdPUkQgNjE0NCAqLworCXU4IHJzdmQyM1sxNzE1Ml1bMzJdOwkvKiBEV09SRCA2NDAwICovCit9IF9fcGFja2VkOworc3RydWN0IEJMQURFX0VOR0lORV9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzIzNTUyXTsKK307CisKKyNlbmRpZiAvKiBfX3JlZ21hcF9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTAsMCArMSwyNyBAQAorY29uZmlnIENPTUVESQorCXRyaXN0YXRlICJEYXRhIEFjcXVpc2lvbiBzdXBwb3J0IChjb21lZGkpIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGEgd2lkZSByYW5nZSBvZiBkYXRhIGFjcXVpc2lvbiBkZXZpY2VzCisJICBmb3IgTGludXguCisKK2NvbmZpZyBDT01FRElfUlQKKwl0cmlzdGF0ZSAiQ29tZWRpIFJlYWwtdGltZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ09NRURJICYmIFJUCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIFJlYWwgdGltZSBzdXBwb3J0IGZvciB0aGUgQ29tZWRpIGNvcmUuCisKK2NvbmZpZyBDT01FRElfUENJX0RSSVZFUlMKKwl0cmlzdGF0ZSAiQ29tZWRpIFBDSSBkcml2ZXJzIgorCWRlcGVuZHMgb24gQ09NRURJICYmIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBsb3RzIG9mIGNvbWVkaSBQQ0kgZHJpdmVycyB0byBiZSBidWlsdAorCitjb25maWcgQ09NRURJX1VTQl9EUklWRVJTCisJdHJpc3RhdGUgIkNvbWVkaSBVU0IgZHJpdmVycyIKKwlkZXBlbmRzIG9uIENPTUVESSAmJiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgbG90cyBvZiBjb21lZGkgVVNCIGRyaXZlcnMgdG8gYmUgYnVpbHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDFhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKK29iai0kKENPTkZJR19DT01FREkpICs9IGNvbWVkaS5vCitvYmotJChDT05GSUdfQ09NRURJX1JUKSArPSBjb21lZGlfcnQubworCitvYmotJChDT05GSUdfQ09NRURJKQkrPSBrY29tZWRpbGliLworb2JqLSQoQ09ORklHX0NPTUVESSkJKz0gZHJpdmVycy8KKworY29tZWRpLW9ianMgOj0JCVwKKwljb21lZGlfZm9wcy5vCVwKKwlwcm9jLm8JCVwKKwlyYW5nZS5vCQlcCisJZHJpdmVycy5vCVwKKwljb21lZGlfY29tcGF0MzIubyBcCisJY29tZWRpX2tzeW1zLm8JXAorCitjb21lZGlfcnQtb2JqcyA6PQlcCisJcnRfcGVuZF90cS5vCVwKKwlydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvVE9ETwpAQCAtMCwwICsxLDE0IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gTGluZGVudAorCS0gcmVtb3ZlIGFsbCB3cmFwcGVycworCS0gcmVtb3ZlIHR5cGVkZWZzCisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlCisJLSByZXNlcnZlIG1ham9yIG51bWJlcgorCS0gY2xlYW51cCB0aGUgaW5kaXZpZHVhbCBjb21lZGkgZHJpdmVycyBhcyB3ZWxsCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitjb3B5OgorCUlhbiBBYmJvdHQgPGFiYm90dGlAbWV2LmNvLnVrPgorCUZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDJlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCkBAIC0wLDAgKzEsOTE2IEBACisvKgorICAgIGluY2x1ZGUvY29tZWRpLmggKGluc3RhbGxlZCBhcyAvdXNyL2luY2x1ZGUvY29tZWRpLmgpCisgICAgaGVhZGVyIGZpbGUgZm9yIGNvbWVkaQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElfSAorI2RlZmluZSBfQ09NRURJX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIENPTUVESV9NQUpPUlZFUlNJT04JMAorI2RlZmluZSBDT01FRElfTUlOT1JWRVJTSU9OCTcKKyNkZWZpbmUgQ09NRURJX01JQ1JPVkVSU0lPTgk3NgorI2RlZmluZSBWRVJTSU9OCSIwLjcuNzYiCisKKy8qIGNvbWVkaSdzIG1ham9yIGRldmljZSBudW1iZXIgKi8KKyNkZWZpbmUgQ09NRURJX01BSk9SIDk4CisKKy8qCisgICBtYXhpbXVtIG51bWJlciBvZiBtaW5vciBkZXZpY2VzLiAgVGhpcyBjYW4gYmUgaW5jcmVhc2VkLCBhbHRob3VnaAorICAga2VybmVsIHN0cnVjdHVyZXMgYXJlIGN1cnJlbnRseSBzdGF0aWNhbGx5IGFsbG9jYXRlZCwgdGh1cyB5b3UKKyAgIGRvbid0IHdhbnQgdGhpcyB0byBiZSBtdWNoIG1vcmUgdGhhbiB5b3UgYWN0dWFsbHkgdXNlLgorICovCisjZGVmaW5lIENPTUVESV9OREVWSUNFUyAxNgorCisvKiBudW1iZXIgb2YgY29uZmlnIG9wdGlvbnMgaW4gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQ09NRURJX05ERVZDT05GT1BUUyAzMgorLypsZW5ndGggb2YgbnRoIGNodW5rIG9mIGZpcm13YXJlIGRhdGEqLworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTNfTEVOR1RICQkyNQorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTJfTEVOR1RICQkyNgorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTFfTEVOR1RICQkyNworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQTBfTEVOR1RICQkyOAorI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQV9ISQkJMjkJLyogbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIHBvaW50ZXIgYWRkcmVzcyAoaWYgbmVlZGVkKSAqLworI2RlZmluZSBDT01FRElfREVWQ09ORl9BVVhfREFUQV9MTwkJMzAJLyogbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBwb2ludGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RICQkzMQkvKiB0b3RhbCBkYXRhIGxlbmd0aCAqLworCisvKiBtYXggbGVuZ3RoIG9mIGRldmljZSBhbmQgZHJpdmVyIG5hbWVzICovCisjZGVmaW5lIENPTUVESV9OQU1FTEVOIDIwCisKKwl0eXBlZGVmIHVuc2lnbmVkIGludCBsc2FtcGxfdDsKKwl0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHNhbXBsX3Q7CisKKy8qIHBhY2tzIGFuZCB1bnBhY2tzIGEgY2hhbm5lbC9yYW5nZSBudW1iZXIgKi8KKworI2RlZmluZSBDUl9QQUNLKGNoYW4sIHJuZywgYXJlZikJCSgoKChhcmVmKSYweDMpPDwyNCkgfCAoKChybmcpJjB4ZmYpPDwxNikgfCAoY2hhbikpCisjZGVmaW5lIENSX1BBQ0tfRkxBR1MoY2hhbiwgcmFuZ2UsIGFyZWYsIGZsYWdzKQkoQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZikgfCAoKGZsYWdzKSAmIENSX0ZMQUdTX01BU0spKQorCisjZGVmaW5lIENSX0NIQU4oYSkJKChhKSYweGZmZmYpCisjZGVmaW5lIENSX1JBTkdFKGEpCSgoKGEpPj4xNikmMHhmZikKKyNkZWZpbmUgQ1JfQVJFRihhKQkoKChhKT4+MjQpJjB4MDMpCisKKyNkZWZpbmUgQ1JfRkxBR1NfTUFTSwkweGZjMDAwMDAwCisjZGVmaW5lIENSX0FMVF9GSUxURVIJKDE8PDI2KQorI2RlZmluZSBDUl9ESVRIRVIJQ1JfQUxUX0ZJTFRFUgorI2RlZmluZSBDUl9ERUdMSVRDSAlDUl9BTFRfRklMVEVSCisjZGVmaW5lIENSX0FMVF9TT1VSQ0UJKDE8PDI3KQorI2RlZmluZSBDUl9FREdFCQkoMTw8MzApCisjZGVmaW5lIENSX0lOVkVSVAkoMTw8MzEpCisKKyNkZWZpbmUgQVJFRl9HUk9VTkQJMHgwMAkvKiBhbmFsb2cgcmVmID0gYW5hbG9nIGdyb3VuZCAqLworI2RlZmluZSBBUkVGX0NPTU1PTgkweDAxCS8qIGFuYWxvZyByZWYgPSBhbmFsb2cgY29tbW9uICovCisjZGVmaW5lIEFSRUZfRElGRgkweDAyCS8qIGFuYWxvZyByZWYgPSBkaWZmZXJlbnRpYWwgKi8KKyNkZWZpbmUgQVJFRl9PVEhFUgkweDAzCS8qIGFuYWxvZyByZWYgPSBvdGhlciAodW5kZWZpbmVkKSAqLworCisvKiBjb3VudGVycyAtLSB0aGVzZSBhcmUgYXJiaXRyYXJ5IHZhbHVlcyAqLworI2RlZmluZSBHUENUX1JFU0VUCQkweDAwMDEKKyNkZWZpbmUgR1BDVF9TRVRfU09VUkNFCQkweDAwMDIKKyNkZWZpbmUgR1BDVF9TRVRfR0FURQkJMHgwMDA0CisjZGVmaW5lIEdQQ1RfU0VUX0RJUkVDVElPTgkweDAwMDgKKyNkZWZpbmUgR1BDVF9TRVRfT1BFUkFUSU9OCTB4MDAxMAorI2RlZmluZSBHUENUX0FSTQkJMHgwMDIwCisjZGVmaW5lIEdQQ1RfRElTQVJNCQkweDAwNDAKKyNkZWZpbmUgR1BDVF9HRVRfSU5UX0NMS19GUlEJMHgwMDgwCisKKyNkZWZpbmUgR1BDVF9JTlRfQ0xPQ0sJCTB4MDAwMQorI2RlZmluZSBHUENUX0VYVF9QSU4JCTB4MDAwMgorI2RlZmluZSBHUENUX05PX0dBVEUJCTB4MDAwNAorI2RlZmluZSBHUENUX1VQCQkJMHgwMDA4CisjZGVmaW5lIEdQQ1RfRE9XTgkJMHgwMDEwCisjZGVmaW5lIEdQQ1RfSFdVRAkJMHgwMDIwCisjZGVmaW5lIEdQQ1RfU0lNUExFX0VWRU5UCTB4MDA0MAorI2RlZmluZSBHUENUX1NJTkdMRV9QRVJJT0QJMHgwMDgwCisjZGVmaW5lIEdQQ1RfU0lOR0xFX1BXCQkweDAxMDAKKyNkZWZpbmUgR1BDVF9DT05UX1BVTFNFX09VVAkweDAyMDAKKyNkZWZpbmUgR1BDVF9TSU5HTEVfUFVMU0VfT1VUCTB4MDQwMAorCisvKiBpbnN0cnVjdGlvbnMgKi8KKworI2RlZmluZSBJTlNOX01BU0tfV1JJVEUJCTB4ODAwMDAwMAorI2RlZmluZSBJTlNOX01BU0tfUkVBRAkJMHg0MDAwMDAwCisjZGVmaW5lIElOU05fTUFTS19TUEVDSUFMCTB4MjAwMDAwMAorCisjZGVmaW5lIElOU05fUkVBRAkJKDAgfCBJTlNOX01BU0tfUkVBRCkKKyNkZWZpbmUgSU5TTl9XUklURQkJKDEgfCBJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fQklUUwkJKDIgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fQ09ORklHCQkoMyB8IElOU05fTUFTS19SRUFEfElOU05fTUFTS19XUklURSkKKyNkZWZpbmUgSU5TTl9HVE9ECQkoNCB8IElOU05fTUFTS19SRUFEfElOU05fTUFTS19TUEVDSUFMKQorI2RlZmluZSBJTlNOX1dBSVQJCSg1IHwgSU5TTl9NQVNLX1dSSVRFfElOU05fTUFTS19TUEVDSUFMKQorI2RlZmluZSBJTlNOX0lOVFRSSUcJCSg2IHwgSU5TTl9NQVNLX1dSSVRFfElOU05fTUFTS19TUEVDSUFMKQorCisvKiB0cmlnZ2VyIGZsYWdzICovCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBpbiBjb21lZGlfdHJpZyBzdHJ1Y3R1cmVzICovCisKKyNkZWZpbmUgVFJJR19CT0dVUwkweDAwMDEJLyogZG8gdGhlIG1vdGlvbnMgKi8KKyNkZWZpbmUgVFJJR19ESVRIRVIJMHgwMDAyCS8qIGVuYWJsZSBkaXRoZXJpbmcgKi8KKyNkZWZpbmUgVFJJR19ERUdMSVRDSAkweDAwMDQJLyogZW5hYmxlIGRlZ2xpdGNoaW5nICovCisvKiNkZWZpbmUgVFJJR19SVCAgICAgICAweDAwMDggKi8JLyogcGVyZm9ybSBvcCBpbiByZWFsIHRpbWUgKi8KKyNkZWZpbmUgVFJJR19DT05GSUcJMHgwMDEwCS8qIHBlcmZvcm0gY29uZmlndXJhdGlvbiwgbm90IHRyaWdnZXJpbmcgKi8KKyNkZWZpbmUgVFJJR19XQUtFX0VPUwkweDAwMjAJLyogd2FrZSB1cCBvbiBlbmQtb2Ytc2NhbiBldmVudHMgKi8KKy8qI2RlZmluZSBUUklHX1dSSVRFICAgIDB4MDA0MCovCS8qIHdyaXRlIHRvIGJpZGlyZWN0aW9uYWwgZGV2aWNlcyAqLworCisvKiBjb21tYW5kIGZsYWdzICovCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBpbiBjb21lZGlfY21kIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBDTURGX1BSSU9SSVRZCQkweDAwMDAwMDA4CS8qIHRyeSB0byB1c2UgYSByZWFsLXRpbWUgaW50ZXJydXB0IHdoaWxlIHBlcmZvcm1pbmcgY29tbWFuZCAqLworCisjZGVmaW5lIFRSSUdfUlQJCUNNREZfUFJJT1JJVFkJLyogY29tcGF0aWJpbGl0eSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQ01ERl9XUklURQkJMHgwMDAwMDA0MAorI2RlZmluZSBUUklHX1dSSVRFCUNNREZfV1JJVEUJLyogY29tcGF0aWJpbGl0eSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQ01ERl9SQVdEQVRBCQkweDAwMDAwMDgwCisKKyNkZWZpbmUgQ09NRURJX0VWX1NUQVJUCQkweDAwMDQwMDAwCisjZGVmaW5lIENPTUVESV9FVl9TQ0FOX0JFR0lOCTB4MDAwODAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX0NPTlZFUlQJMHgwMDEwMDAwMAorI2RlZmluZSBDT01FRElfRVZfU0NBTl9FTkQJMHgwMDIwMDAwMAorI2RlZmluZSBDT01FRElfRVZfU1RPUAkJMHgwMDQwMDAwMAorCisjZGVmaW5lIFRSSUdfUk9VTkRfTUFTSwkJMHgwMDAzMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX05FQVJFU1QJMHgwMDAwMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX0RPV04JCTB4MDAwMTAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9VUAkJMHgwMDAyMDAwMAorI2RlZmluZSBUUklHX1JPVU5EX1VQX05FWFQJMHgwMDAzMDAwMAorCisvKiB0cmlnZ2VyIHNvdXJjZXMgKi8KKworI2RlZmluZSBUUklHX0FOWQkweGZmZmZmZmZmCisjZGVmaW5lIFRSSUdfSU5WQUxJRAkweDAwMDAwMDAwCisKKyNkZWZpbmUgVFJJR19OT05FCTB4MDAwMDAwMDEJLyogbmV2ZXIgdHJpZ2dlciAqLworI2RlZmluZSBUUklHX05PVwkweDAwMDAwMDAyCS8qIHRyaWdnZXIgbm93ICsgTiBucyAqLworI2RlZmluZSBUUklHX0ZPTExPVwkweDAwMDAwMDA0CS8qIHRyaWdnZXIgb24gbmV4dCBsb3dlciBsZXZlbCB0cmlnICovCisjZGVmaW5lIFRSSUdfVElNRQkweDAwMDAwMDA4CS8qIHRyaWdnZXIgYXQgdGltZSBOIG5zICovCisjZGVmaW5lIFRSSUdfVElNRVIJMHgwMDAwMDAxMAkvKiB0cmlnZ2VyIGF0IHJhdGUgTiBucyAqLworI2RlZmluZSBUUklHX0NPVU5UCTB4MDAwMDAwMjAJLyogdHJpZ2dlciB3aGVuIGNvdW50IHJlYWNoZXMgTiAqLworI2RlZmluZSBUUklHX0VYVAkweDAwMDAwMDQwCS8qIHRyaWdnZXIgb24gZXh0ZXJuYWwgc2lnbmFsIE4gKi8KKyNkZWZpbmUgVFJJR19JTlQJMHgwMDAwMDA4MAkvKiB0cmlnZ2VyIG9uIGNvbWVkaS1pbnRlcm5hbCBzaWduYWwgTiAqLworI2RlZmluZSBUUklHX09USEVSCTB4MDAwMDAxMDAJLyogZHJpdmVyIGRlZmluZWQgKi8KKworLyogc3ViZGV2aWNlIGZsYWdzICovCisKKyNkZWZpbmUgU0RGX0JVU1kJMHgwMDAxCS8qIGRldmljZSBpcyBidXN5ICovCisjZGVmaW5lIFNERl9CVVNZX09XTkVSCTB4MDAwMgkvKiBkZXZpY2UgaXMgYnVzeSB3aXRoIHlvdXIgam9iICovCisjZGVmaW5lIFNERl9MT0NLRUQJMHgwMDA0CS8qIHN1YmRldmljZSBpcyBsb2NrZWQgKi8KKyNkZWZpbmUgU0RGX0xPQ0tfT1dORVIJMHgwMDA4CS8qIHlvdSBvd24gbG9jayAqLworI2RlZmluZSBTREZfTUFYREFUQQkweDAwMTAJLyogbWF4ZGF0YSBkZXBlbmRzIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX0ZMQUdTCTB4MDAyMAkvKiBmbGFncyBkZXBlbmQgb24gY2hhbm5lbCAqLworI2RlZmluZSBTREZfUkFOR0VUWVBFCTB4MDA0MAkvKiByYW5nZSB0eXBlIGRlcGVuZHMgb24gY2hhbm5lbCAqLworI2RlZmluZSBTREZfTU9ERTAJMHgwMDgwCS8qIGNhbiBkbyBtb2RlIDAgKi8KKyNkZWZpbmUgU0RGX01PREUxCTB4MDEwMAkvKiBjYW4gZG8gbW9kZSAxICovCisjZGVmaW5lIFNERl9NT0RFMgkweDAyMDAJLyogY2FuIGRvIG1vZGUgMiAqLworI2RlZmluZSBTREZfTU9ERTMJMHgwNDAwCS8qIGNhbiBkbyBtb2RlIDMgKi8KKyNkZWZpbmUgU0RGX01PREU0CTB4MDgwMAkvKiBjYW4gZG8gbW9kZSA0ICovCisjZGVmaW5lIFNERl9DTUQJCTB4MTAwMAkvKiBjYW4gZG8gY29tbWFuZHMgKGRlcHJlY2F0ZWQpICovCisjZGVmaW5lIFNERl9TT0ZUX0NBTElCUkFURUQJMHgyMDAwCS8qIHN1YmRldmljZSB1c2VzIHNvZnR3YXJlIGNhbGlicmF0aW9uICovCisjZGVmaW5lIFNERl9DTURfV1JJVEUJCTB4NDAwMAkvKiBjYW4gZG8gb3V0cHV0IGNvbW1hbmRzICovCisjZGVmaW5lIFNERl9DTURfUkVBRAkJMHg4MDAwCS8qIGNhbiBkbyBpbnB1dCBjb21tYW5kcyAqLworCisjZGVmaW5lIFNERl9SRUFEQUJMRQkweDAwMDEwMDAwCS8qIHN1YmRldmljZSBjYW4gYmUgcmVhZCAoZS5nLiBhbmFsb2cgaW5wdXQpICovCisjZGVmaW5lIFNERl9XUklUQUJMRQkweDAwMDIwMDAwCS8qIHN1YmRldmljZSBjYW4gYmUgd3JpdHRlbiAoZS5nLiBhbmFsb2cgb3V0cHV0KSAqLworI2RlZmluZSBTREZfV1JJVEVBQkxFCVNERl9XUklUQUJMRQkvKiBzcGVsbGluZyBlcnJvciBpbiBBUEkgKi8KKyNkZWZpbmUgU0RGX0lOVEVSTkFMCTB4MDAwNDAwMDAJLyogc3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgZXh0ZXJuYWxseSB2aXNpYmxlIGxpbmVzICovCisjZGVmaW5lIFNERl9SVAkJMHgwMDA4MDAwMAkvKiBERVBSRUNBVEVEOiBzdWJkZXZpY2UgaXMgUlQgY2FwYWJsZSAqLworI2RlZmluZSBTREZfR1JPVU5ECTB4MDAxMDAwMDAJLyogY2FuIGRvIGFyZWY9Z3JvdW5kICovCisjZGVmaW5lIFNERl9DT01NT04JMHgwMDIwMDAwMAkvKiBjYW4gZG8gYXJlZj1jb21tb24gKi8KKyNkZWZpbmUgU0RGX0RJRkYJMHgwMDQwMDAwMAkvKiBjYW4gZG8gYXJlZj1kaWZmICovCisjZGVmaW5lIFNERl9PVEhFUgkweDAwODAwMDAwCS8qIGNhbiBkbyBhcmVmPW90aGVyICovCisjZGVmaW5lIFNERl9ESVRIRVIJMHgwMTAwMDAwMAkvKiBjYW4gZG8gZGl0aGVyaW5nICovCisjZGVmaW5lIFNERl9ERUdMSVRDSAkweDAyMDAwMDAwCS8qIGNhbiBkbyBkZWdsaXRjaGluZyAqLworI2RlZmluZSBTREZfTU1BUAkweDA0MDAwMDAwCS8qIGNhbiBkbyBtbWFwKCkgKi8KKyNkZWZpbmUgU0RGX1JVTk5JTkcJMHgwODAwMDAwMAkvKiBzdWJkZXZpY2UgaXMgYWNxdWlyaW5nIGRhdGEgKi8KKyNkZWZpbmUgU0RGX0xTQU1QTAkweDEwMDAwMDAwCS8qIHN1YmRldmljZSB1c2VzIDMyLWJpdCBzYW1wbGVzICovCisjZGVmaW5lIFNERl9QQUNLRUQJMHgyMDAwMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGRvIHBhY2tlZCBESU8gKi8KKy8qIHJlIHJlY3lsZSB0aGVzZSBmbGFncyBmb3IgUFdNICovCisjZGVmaW5lIFNERl9QV01fQ09VTlRFUiBTREZfTU9ERTAgICAgICAgLyogUFdNIGNhbiBhdXRvbWF0aWNhbGx5IHN3aXRjaCBvZmYgKi8KKyNkZWZpbmUgU0RGX1BXTV9IQlJJREdFIFNERl9NT0RFMSAgICAgICAvKiBQV00gaXMgc2lnbmVkIChILWJyaWRnZSkgKi8KKworCisKKy8qIHN1YmRldmljZSB0eXBlcyAqLworCitlbnVtIGNvbWVkaV9zdWJkZXZpY2VfdHlwZSB7CisJQ09NRURJX1NVQkRfVU5VU0VELAkvKiB1bnVzZWQgYnkgZHJpdmVyICovCisJQ09NRURJX1NVQkRfQUksCS8qIGFuYWxvZyBpbnB1dCAqLworCUNPTUVESV9TVUJEX0FPLAkvKiBhbmFsb2cgb3V0cHV0ICovCisJQ09NRURJX1NVQkRfREksCS8qIGRpZ2l0YWwgaW5wdXQgKi8KKwlDT01FRElfU1VCRF9ETywJLyogZGlnaXRhbCBvdXRwdXQgKi8KKwlDT01FRElfU1VCRF9ESU8sCS8qIGRpZ2l0YWwgaW5wdXQvb3V0cHV0ICovCisJQ09NRURJX1NVQkRfQ09VTlRFUiwJLyogY291bnRlciAqLworCUNPTUVESV9TVUJEX1RJTUVSLAkvKiB0aW1lciAqLworCUNPTUVESV9TVUJEX01FTU9SWSwJLyogbWVtb3J5LCBFRVBST00sIERQUkFNICovCisJQ09NRURJX1NVQkRfQ0FMSUIsCS8qIGNhbGlicmF0aW9uIERBQ3MgKi8KKwlDT01FRElfU1VCRF9QUk9DLAkvKiBwcm9jZXNzb3IsIERTUCAqLworCUNPTUVESV9TVUJEX1NFUklBTCwJLyogc2VyaWFsIElPICovCisJQ09NRURJX1NVQkRfUFdNICAgICAgICAgLyogUFdNICovCit9OworCisvKiBjb25maWd1cmF0aW9uIGluc3RydWN0aW9ucyAqLworCitlbnVtIGNvbmZpZ3VyYXRpb25faWRzIHsKKwlJTlNOX0NPTkZJR19ESU9fSU5QVVQgPSAwLAorCUlOU05fQ09ORklHX0RJT19PVVRQVVQgPSAxLAorCUlOU05fQ09ORklHX0RJT19PUEVORFJBSU4gPSAyLAorCUlOU05fQ09ORklHX0FOQUxPR19UUklHID0gMTYsCisvKglJTlNOX0NPTkZJR19XQVZFRk9STSA9IDE3LCAqLworLyoJSU5TTl9DT05GSUdfVFJJRyA9IDE4LCAqLworLyoJSU5TTl9DT05GSUdfQ09VTlRFUiA9IDE5LCAqLworCUlOU05fQ09ORklHX0FMVF9TT1VSQ0UgPSAyMCwKKwlJTlNOX0NPTkZJR19ESUdJVEFMX1RSSUcgPSAyMSwKKwlJTlNOX0NPTkZJR19CTE9DS19TSVpFID0gMjIsCisJSU5TTl9DT05GSUdfVElNRVJfMSA9IDIzLAorCUlOU05fQ09ORklHX0ZJTFRFUiA9IDI0LAorCUlOU05fQ09ORklHX0NIQU5HRV9OT1RJRlkgPSAyNSwKKworCSAvKkFMUEhBKi8gSU5TTl9DT05GSUdfU0VSSUFMX0NMT0NLID0gMjYsCisJSU5TTl9DT05GSUdfQklESVJFQ1RJT05BTF9EQVRBID0gMjcsCisJSU5TTl9DT05GSUdfRElPX1FVRVJZID0gMjgsCisJSU5TTl9DT05GSUdfUFdNX09VVFBVVCA9IDI5LAorCUlOU05fQ09ORklHX0dFVF9QV01fT1VUUFVUID0gMzAsCisJSU5TTl9DT05GSUdfQVJNID0gMzEsCisJSU5TTl9DT05GSUdfRElTQVJNID0gMzIsCisJSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTID0gMzMsCisJSU5TTl9DT05GSUdfUkVTRVQgPSAzNCwKKwlJTlNOX0NPTkZJR19HUENUX1NJTkdMRV9QVUxTRV9HRU5FUkFUT1IgPSAxMDAxLAkvKiBVc2UgQ1RSIGFzIHNpbmdsZSBwdWxzZWdlbmVyYXRvciAqLworCUlOU05fQ09ORklHX0dQQ1RfUFVMU0VfVFJBSU5fR0VORVJBVE9SID0gMTAwMiwJLyogVXNlIENUUiBhcyBwdWxzZXRyYWluZ2VuZXJhdG9yICovCisJSU5TTl9DT05GSUdfR1BDVF9RVUFEUkFUVVJFX0VOQ09ERVIgPSAxMDAzLAkvKiBVc2UgdGhlIGNvdW50ZXIgYXMgZW5jb2RlciAqLworCUlOU05fQ09ORklHX1NFVF9HQVRFX1NSQyA9IDIwMDEsCS8qIFNldCBnYXRlIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9HQVRFX1NSQyA9IDIwMDIsCS8qIEdldCBnYXRlIHNvdXJjZSAqLworCUlOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgPSAyMDAzLAkvKiBTZXQgbWFzdGVyIGNsb2NrIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9DTE9DS19TUkMgPSAyMDA0LAkvKiBHZXQgbWFzdGVyIGNsb2NrIHNvdXJjZSAqLworCUlOU05fQ09ORklHX1NFVF9PVEhFUl9TUkMgPSAyMDA1LAkvKiBTZXQgb3RoZXIgc291cmNlICovCisvKglJTlNOX0NPTkZJR19HRVRfT1RIRVJfU1JDID0gMjAwNiwqLwkvKiBHZXQgb3RoZXIgc291cmNlICovCisJSU5TTl9DT05GSUdfR0VUX0hBUkRXQVJFX0JVRkZFUl9TSVpFLAkvKiBHZXQgc2l6ZSBpbiBieXRlcyBvZgorCQkJCQkJICBzdWJkZXZpY2UncyBvbi1ib2FyZCBmaWZvcworCQkJCQkJICB1c2VkIGR1cmluZyBzdHJlYW1pbmcKKwkJCQkJCSAgaW5wdXQvb3V0cHV0ICovCisJSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERSA9IDQwOTcsCisJSU5TTl9DT05GSUdfODI1NF9TRVRfTU9ERSA9IElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUsCS8qIGRlcHJlY2F0ZWQgKi8KKwlJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTID0gNDA5OCwKKwlJTlNOX0NPTkZJR19TRVRfUk9VVElORyA9IDQwOTksCisJSU5TTl9DT05GSUdfR0VUX1JPVVRJTkcgPSA0MTA5LAorLyogUFdNICovCisJSU5TTl9DT05GSUdfUFdNX1NFVF9QRVJJT0QgPSA1MDAwLCAgIC8qIHNldHMgZnJlcXVlbmN5ICovCisJSU5TTl9DT05GSUdfUFdNX0dFVF9QRVJJT0QgPSA1MDAxLCAgIC8qIGdldHMgZnJlcXVlbmN5ICovCisJSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVMgPSA1MDAyLCAgICAgICAgICAvKiBpcyBpdCBydW5uaW5nPyAqLworCUlOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0UgPSA1MDAzLCAvKiBzZXRzIEggYnJpZGdlOiBkdXR5IGN5Y2xlIGFuZCBzaWduIGJpdCBmb3IgYSByZWxheSAgYXQgdGhlIHNhbWUgdGltZSovCisJSU5TTl9DT05GSUdfUFdNX0dFVF9IX0JSSURHRSA9IDUwMDQgIC8qIGdldHMgSCBicmlkZ2UgZGF0YTogZHV0eSBjeWNsZSBhbmQgdGhlIHNpZ24gYml0ICovCit9OworCitlbnVtIGNvbWVkaV9pb19kaXJlY3Rpb24geworCUNPTUVESV9JTlBVVCA9IDAsCisJQ09NRURJX09VVFBVVCA9IDEsCisJQ09NRURJX09QRU5EUkFJTiA9IDIKK307CisKK2VudW0gY29tZWRpX3N1cHBvcnRfbGV2ZWwgeworCUNPTUVESV9VTktOT1dOX1NVUFBPUlQgPSAwLAorCUNPTUVESV9TVVBQT1JURUQsCisJQ09NRURJX1VOU1VQUE9SVEVECit9OworCisvKiBpb2N0bHMgKi8KKworI2RlZmluZSBDSU8gJ2QnCisjZGVmaW5lIENPTUVESV9ERVZDT05GSUcgX0lPVyhDSU8sIDAsIGNvbWVkaV9kZXZjb25maWcpCisjZGVmaW5lIENPTUVESV9ERVZJTkZPIF9JT1IoQ0lPLCAxLCBjb21lZGlfZGV2aW5mbykKKyNkZWZpbmUgQ09NRURJX1NVQkRJTkZPIF9JT1IoQ0lPLCAyLCBjb21lZGlfc3ViZGluZm8pCisjZGVmaW5lIENPTUVESV9DSEFOSU5GTyBfSU9SKENJTywgMywgY29tZWRpX2NoYW5pbmZvKQorI2RlZmluZSBDT01FRElfVFJJRyBfSU9XUihDSU8sIDQsIGNvbWVkaV90cmlnKQorI2RlZmluZSBDT01FRElfTE9DSyBfSU8oQ0lPLCA1KQorI2RlZmluZSBDT01FRElfVU5MT0NLIF9JTyhDSU8sIDYpCisjZGVmaW5lIENPTUVESV9DQU5DRUwgX0lPKENJTywgNykKKyNkZWZpbmUgQ09NRURJX1JBTkdFSU5GTyBfSU9SKENJTywgOCwgY29tZWRpX3JhbmdlaW5mbykKKyNkZWZpbmUgQ09NRURJX0NNRCBfSU9SKENJTywgOSwgY29tZWRpX2NtZCkKKyNkZWZpbmUgQ09NRURJX0NNRFRFU1QgX0lPUihDSU8sIDEwLCBjb21lZGlfY21kKQorI2RlZmluZSBDT01FRElfSU5TTkxJU1QgX0lPUihDSU8sIDExLCBjb21lZGlfaW5zbmxpc3QpCisjZGVmaW5lIENPTUVESV9JTlNOIF9JT1IoQ0lPLCAxMiwgY29tZWRpX2luc24pCisjZGVmaW5lIENPTUVESV9CVUZDT05GSUcgX0lPUihDSU8sIDEzLCBjb21lZGlfYnVmY29uZmlnKQorI2RlZmluZSBDT01FRElfQlVGSU5GTyBfSU9XUihDSU8sIDE0LCBjb21lZGlfYnVmaW5mbykKKyNkZWZpbmUgQ09NRURJX1BPTEwgX0lPKENJTywgMTUpCisKKy8qIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3RyaWdfc3RydWN0IGNvbWVkaV90cmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2NtZF9zdHJ1Y3QgY29tZWRpX2NtZDsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9pbnNuX3N0cnVjdCBjb21lZGlfaW5zbjsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9pbnNubGlzdF9zdHJ1Y3QgY29tZWRpX2luc25saXN0OwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2NoYW5pbmZvX3N0cnVjdCBjb21lZGlfY2hhbmluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfc3ViZGluZm9fc3RydWN0IGNvbWVkaV9zdWJkaW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZpbmZvX3N0cnVjdCBjb21lZGlfZGV2aW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZjb25maWdfc3RydWN0IGNvbWVkaV9kZXZjb25maWc7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfcmFuZ2VpbmZvX3N0cnVjdCBjb21lZGlfcmFuZ2VpbmZvOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2tyYW5nZV9zdHJ1Y3QgY29tZWRpX2tyYW5nZTsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9idWZjb25maWdfc3RydWN0IGNvbWVkaV9idWZjb25maWc7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfYnVmaW5mb19zdHJ1Y3QgY29tZWRpX2J1ZmluZm87CisKK3N0cnVjdCBjb21lZGlfdHJpZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CS8qIHN1YmRldmljZSAqLworCXVuc2lnbmVkIGludCBtb2RlOwkvKiBtb2RlICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBuX2NoYW47CS8qIG51bWJlciBvZiBjaGFubmVscyAqLworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Q7CS8qIGNoYW5uZWwvcmFuZ2UgbGlzdCAqLworCXNhbXBsX3QgKmRhdGE7CS8qIGRhdGEgbGlzdCwgc2l6ZSBkZXBlbmRzIG9uIHN1YmQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgbjsJLyogbnVtYmVyIG9mIHNjYW5zICovCisJdW5zaWduZWQgaW50IHRyaWdzcmM7CisJdW5zaWduZWQgaW50IHRyaWd2YXI7CisJdW5zaWduZWQgaW50IHRyaWd2YXIxOworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOworfTsKKworc3RydWN0IGNvbWVkaV9pbnNuX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IGluc247CisJdW5zaWduZWQgaW50IG47CisJbHNhbXBsX3QgKmRhdGE7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwl1bnNpZ25lZCBpbnQgY2hhbnNwZWM7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKK307CisKK3N0cnVjdCBjb21lZGlfaW5zbmxpc3Rfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbl9pbnNuczsKKwljb21lZGlfaW5zbiAqaW5zbnM7Cit9OworCitzdHJ1Y3QgY29tZWRpX2NtZF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJdW5zaWduZWQgaW50IHN0YXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYXJnOworCisJdW5zaWduZWQgaW50IHNjYW5fYmVnaW5fc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX2FyZzsKKworCXVuc2lnbmVkIGludCBjb252ZXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgY29udmVydF9hcmc7CisKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2VuZF9hcmc7CisKKwl1bnNpZ25lZCBpbnQgc3RvcF9zcmM7CisJdW5zaWduZWQgaW50IHN0b3BfYXJnOworCisJdW5zaWduZWQgaW50ICpjaGFubGlzdDsJLyogY2hhbm5lbC9yYW5nZSBsaXN0ICovCisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbjsKKworCXNhbXBsX3QgKmRhdGE7CS8qIGRhdGEgbGlzdCwgc2l6ZSBkZXBlbmRzIG9uIHN1YmQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Cit9OworCitzdHJ1Y3QgY29tZWRpX2NoYW5pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwlsc2FtcGxfdCAqbWF4ZGF0YV9saXN0OworCXVuc2lnbmVkIGludCAqZmxhZ2xpc3Q7CisJdW5zaWduZWQgaW50ICpyYW5nZWxpc3Q7CisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKK3N0cnVjdCBjb21lZGlfcmFuZ2VpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CisJdm9pZCAqcmFuZ2VfcHRyOworfTsKKworc3RydWN0IGNvbWVkaV9rcmFuZ2Vfc3RydWN0IHsKKwlpbnQgbWluOwkvKiBmaXhlZCBwb2ludCwgbXVsdGlwbHkgYnkgMWUtNiAqLworCWludCBtYXg7CS8qIGZpeGVkIHBvaW50LCBtdWx0aXBseSBieSAxZS02ICovCisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworCitzdHJ1Y3QgY29tZWRpX3N1YmRpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IG5fY2hhbjsKKwl1bnNpZ25lZCBpbnQgc3ViZF9mbGFnczsKKwl1bnNpZ25lZCBpbnQgdGltZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgbGVuX2NoYW5saXN0OworCWxzYW1wbF90IG1heGRhdGE7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBjaGFubmVsIGZsYWdzICovCisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CS8qIGxvb2t1cCBpbiBrZXJuZWwgKi8KKwl1bnNpZ25lZCBpbnQgc2V0dGxpbmdfdGltZV8wOworCXVuc2lnbmVkIGluc25fYml0c19zdXBwb3J0OwkvKiBzZWUgc3VwcG9ydF9sZXZlbCBlbnVtIGZvciB2YWx1ZXMqLworCXVuc2lnbmVkIGludCB1bnVzZWRbOF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9jb2RlOworCXVuc2lnbmVkIGludCBuX3N1YmRldnM7CisJY2hhciBkcml2ZXJfbmFtZVtDT01FRElfTkFNRUxFTl07CisJY2hhciBib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOXTsKKwlpbnQgcmVhZF9zdWJkZXZpY2U7CisJaW50IHdyaXRlX3N1YmRldmljZTsKKwlpbnQgdW51c2VkWzMwXTsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2Y29uZmlnX3N0cnVjdCB7CisJY2hhciBib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOXTsKKwlpbnQgb3B0aW9uc1tDT01FRElfTkRFVkNPTkZPUFRTXTsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmY29uZmlnX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwl1bnNpZ25lZCBpbnQgbWF4aW11bV9zaXplOworCXVuc2lnbmVkIGludCBzaXplOworCisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CisKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX3B0cjsKKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfcHRyOworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfY291bnQ7CisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2NvdW50OworCisJdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW47CisKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzRdOworfTsKKworLyogcmFuZ2Ugc3R1ZmYgKi8KKworI2RlZmluZSBfX1JBTkdFKGEsIGIpCSgoKChhKSYweGZmZmYpPDwxNil8KChiKSYweGZmZmYpKQorCisjZGVmaW5lIFJBTkdFX09GRlNFVChhKQkJKCgoYSk+PjE2KSYweGZmZmYpCisjZGVmaW5lIFJBTkdFX0xFTkdUSChiKQkJKChiKSYweGZmZmYpCisKKyNkZWZpbmUgUkZfVU5JVChmbGFncykJCSgoZmxhZ3MpJjB4ZmYpCisjZGVmaW5lIFJGX0VYVEVSTkFMCQkoMTw8OCkKKworI2RlZmluZSBVTklUX3ZvbHQJCTAKKyNkZWZpbmUgVU5JVF9tQQkJCTEKKyNkZWZpbmUgVU5JVF9ub25lCQkyCisKKyNkZWZpbmUgQ09NRURJX01JTl9TUEVFRAkoKHVuc2lnbmVkIGludCkweGZmZmZmZmZmKQorCisvKiBjYWxsYmFjayBzdHVmZiAqLworLyogb25seSByZWxldmFudCB0byBrZXJuZWwgbW9kdWxlcy4gKi8KKworI2RlZmluZSBDT01FRElfQ0JfRU9TCQkxCS8qIGVuZCBvZiBzY2FuICovCisjZGVmaW5lIENPTUVESV9DQl9FT0EJCTIJLyogZW5kIG9mIGFjcXVpc2l0aW9uICovCisjZGVmaW5lIENPTUVESV9DQl9CTE9DSwkJNAkvKiBERVBSRUNBVEVEOiBjb252ZW5pZW50IGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgQ09NRURJX0NCX0VPQlVGCQk4CS8qIERFUFJFQ0FURUQ6IGVuZCBvZiBidWZmZXIgKi8KKyNkZWZpbmUgQ09NRURJX0NCX0VSUk9SCQkxNgkvKiBjYXJkIGVycm9yIGR1cmluZyBhY3F1aXNpdGlvbiAqLworI2RlZmluZSBDT01FRElfQ0JfT1ZFUkZMT1cJMzIJLyogYnVmZmVyIG92ZXJmbG93L3VuZGVyZmxvdyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhpcyBsaW5lIGlzIEFMUEhBICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgODI1NCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorCisgIEl0IHN1cHBvcnRzIHR3byBjb25maWcgY29tbWFuZHM6CisKKyAgMCBJRDogSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERQorICAxIDgyNTQgTW9kZQorICAgIEk4MjU0X01PREUwLCBJODI1NF9NT0RFMSwgLi4uLCBJODI1NF9NT0RFNQorICAgIE9SJ2VkIHdpdGg6CisgICAgSTgyNTRfQkNELCBJODI1NF9CSU5BUlkKKworICAwIElEOiBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTCisgIDEgPC0tIFN0YXR1cyBieXRlIHJldHVybmVkIGhlcmUuCisgICAgQjcgPSBPdXRwdXQKKyAgICBCNiA9IE5VTEwgQ291bnQKKyAgICBCNSAtIEIwIEN1cnJlbnQgbW9kZS4KKworKi8KKworZW51bSBpODI1NF9tb2RlIHsKKwlJODI1NF9NT0RFMCA9ICgwIDw8IDEpLAkvKiBJbnRlcnJ1cHQgb24gdGVybWluYWwgY291bnQgKi8KKwlJODI1NF9NT0RFMSA9ICgxIDw8IDEpLAkvKiBIYXJkd2FyZSByZXRyaWdnZXJhYmxlIG9uZS1zaG90ICovCisJSTgyNTRfTU9ERTIgPSAoMiA8PCAxKSwJLyogUmF0ZSBnZW5lcmF0b3IgKi8KKwlJODI1NF9NT0RFMyA9ICgzIDw8IDEpLAkvKiBTcXVhcmUgd2F2ZSBtb2RlICovCisJSTgyNTRfTU9ERTQgPSAoNCA8PCAxKSwJLyogU29mdHdhcmUgdHJpZ2dlcmVkIHN0cm9iZSAqLworCUk4MjU0X01PREU1ID0gKDUgPDwgMSksCS8qIEhhcmR3YXJlIHRyaWdnZXJlZCBzdHJvYmUgKHJldHJpZ2dlcmFibGUpICovCisJSTgyNTRfQkNEID0gMSwJLyogdXNlIGJpbmFyeS1jb2RlZCBkZWNpbWFsIGluc3RlYWQgb2YgYmluYXJ5IChwcmV0dHkgdXNlbGVzcykgKi8KKwlJODI1NF9CSU5BUlkgPSAwCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1VTVUFMX1BGSV9TRUxFQ1QodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJaWYgKHBmaV9jaGFubmVsIDwgMTApCisJCXJldHVybiAweDEgKyBwZmlfY2hhbm5lbDsKKwllbHNlCisJCXJldHVybiAweGIgKyBwZmlfY2hhbm5lbDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfVVNVQUxfUlRTSV9TRUxFQ1QodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCWlmIChydHNpX2NoYW5uZWwgPCA3KQorCQlyZXR1cm4gMHhiICsgcnRzaV9jaGFubmVsOworCWVsc2UKKwkJcmV0dXJuIDB4MWI7Cit9CisvKiBtb2RlIGJpdHMgZm9yIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycywgc2V0IHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUgKi8KKyNkZWZpbmUgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZUIDE2CisjZGVmaW5lIE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQgMjAKKyNkZWZpbmUgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQgMjQKK2VudW0gbmlfZ3BjdF9tb2RlX2JpdHMgeworCU5JX0dQQ1RfR0FURV9PTl9CT1RIX0VER0VTX0JJVCA9IDB4NCwKKwlOSV9HUENUX0VER0VfR0FURV9NT0RFX01BU0sgPSAweDE4LAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUQVJUU19TVE9QU19CSVRTID0gMHgwLAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUT1BTX1NUQVJUU19CSVRTID0gMHg4LAorCU5JX0dQQ1RfRURHRV9HQVRFX1NUQVJUU19CSVRTID0gMHgxMCwKKwlOSV9HUENUX0VER0VfR0FURV9OT19TVEFSVFNfTk9fU1RPUFNfQklUUyA9IDB4MTgsCisJTklfR1BDVF9TVE9QX01PREVfTUFTSyA9IDB4NjAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfQklUUyA9IDB4MDAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfT1JfVENfQklUUyA9IDB4MjAsCisJTklfR1BDVF9TVE9QX09OX0dBVEVfT1JfU0VDT05EX1RDX0JJVFMgPSAweDQwLAorCU5JX0dQQ1RfTE9BRF9CX1NFTEVDVF9CSVQgPSAweDgwLAorCU5JX0dQQ1RfT1VUUFVUX01PREVfTUFTSyA9IDB4MzAwLAorCU5JX0dQQ1RfT1VUUFVUX1RDX1BVTFNFX0JJVFMgPSAweDEwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19UT0dHTEVfQklUUyA9IDB4MjAwLAorCU5JX0dQQ1RfT1VUUFVUX1RDX09SX0dBVEVfVE9HR0xFX0JJVFMgPSAweDMwMCwKKwlOSV9HUENUX0hBUkRXQVJFX0RJU0FSTV9NQVNLID0gMHhjMDAsCisJTklfR1BDVF9OT19IQVJEV0FSRV9ESVNBUk1fQklUUyA9IDB4MDAwLAorCU5JX0dQQ1RfRElTQVJNX0FUX1RDX0JJVFMgPSAweDQwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9HQVRFX0JJVFMgPSAweDgwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9UQ19PUl9HQVRFX0JJVFMgPSAweGMwMCwKKwlOSV9HUENUX0xPQURJTkdfT05fVENfQklUID0gMHgxMDAwLAorCU5JX0dQQ1RfTE9BRElOR19PTl9HQVRFX0JJVCA9IDB4NDAwMCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfTUFTSyA9IDB4NyA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX05PUk1BTF9CSVRTID0KKwkJMHgwIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YMV9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YMl9CSVRTID0KKwkJMHgyIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfUVVBRFJBVFVSRV9YNF9CSVRTID0KKwkJMHgzIDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfVFdPX1BVTFNFX0JJVFMgPQorCQkweDQgPDwgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TWU5DX1NPVVJDRV9CSVRTID0KKwkJMHg2IDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX01BU0sgPSAweDMgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0xPV19BX0xPV19CX0JJVFMgPQorCQkweDAgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0xPV19BX0hJR0hfQl9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9ISUdIX0FfTE9XX0JfQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfUEhBU0VfSElHSF9BX0hJR0hfQl9CSVRTID0KKwkJMHgzIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9FTkFCTEVfQklUID0gMHg0MDAwMDAsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fTUFTSyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9ET1dOX0JJVFMgPQorCQkweDAwIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1VQX0JJVFMgPQorCQkweDEgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fSFdfVVBfRE9XTl9CSVRTID0KKwkJMHgyIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX0hXX0dBVEVfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfTUFTSyA9IDB4YzAwMDAwMCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfRklYRURfQklUUyA9IDB4MCwKKwlOSV9HUENUX1JFTE9BRF9TT1VSQ0VfU1dJVENISU5HX0JJVFMgPSAweDQwMDAwMDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX0dBVEVfU0VMRUNUX0JJVFMgPSAweDgwMDAwMDAsCisJTklfR1BDVF9PUl9HQVRFX0JJVCA9IDB4MTAwMDAwMDAsCisJTklfR1BDVF9JTlZFUlRfT1VUUFVUX0JJVCA9IDB4MjAwMDAwMDAKK307CisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aAorICogSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyB3aGVuIHVzaW5nIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycy4gKi8KK2VudW0gbmlfZ3BjdF9jbG9ja19zb3VyY2VfYml0cyB7CisJTklfR1BDVF9DTE9DS19TUkNfU0VMRUNUX01BU0sgPSAweDNmLAorCU5JX0dQQ1RfVElNRUJBU0VfMV9DTE9DS19TUkNfQklUUyA9IDB4MCwKKwlOSV9HUENUX1RJTUVCQVNFXzJfQ0xPQ0tfU1JDX0JJVFMgPSAweDEsCisJTklfR1BDVF9USU1FQkFTRV8zX0NMT0NLX1NSQ19CSVRTID0gMHgyLAorCU5JX0dQQ1RfTE9HSUNfTE9XX0NMT0NLX1NSQ19CSVRTID0gMHgzLAorCU5JX0dQQ1RfTkVYVF9HQVRFX0NMT0NLX1NSQ19CSVRTID0gMHg0LAorCU5JX0dQQ1RfTkVYVF9UQ19DTE9DS19TUkNfQklUUyA9IDB4NSwKKwlOSV9HUENUX1NPVVJDRV9QSU5faV9DTE9DS19TUkNfQklUUyA9IDB4NiwJLyogTkkgNjYweC1zcGVjaWZpYyAqLworCU5JX0dQQ1RfUFhJMTBfQ0xPQ0tfU1JDX0JJVFMgPSAweDcsCisJTklfR1BDVF9QWElfU1RBUl9UUklHR0VSX0NMT0NLX1NSQ19CSVRTID0gMHg4LAorCU5JX0dQQ1RfQU5BTE9HX1RSSUdHRVJfT1VUX0NMT0NLX1NSQ19CSVRTID0gMHg5LAorCU5JX0dQQ1RfUFJFU0NBTEVfTU9ERV9DTE9DS19TUkNfTUFTSyA9IDB4MzAwMDAwMDAsCisJTklfR1BDVF9OT19QUkVTQ0FMRV9DTE9DS19TUkNfQklUUyA9IDB4MCwKKwlOSV9HUENUX1BSRVNDQUxFX1gyX0NMT0NLX1NSQ19CSVRTID0gMHgxMDAwMDAwMCwgLyogZGl2aWRlIHNvdXJjZSBieSAyICovCisJTklfR1BDVF9QUkVTQ0FMRV9YOF9DTE9DS19TUkNfQklUUyA9IDB4MjAwMDAwMDAsIC8qIGRpdmlkZSBzb3VyY2UgYnkgOCAqLworCU5JX0dQQ1RfSU5WRVJUX0NMT0NLX1NSQ19CSVQgPSAweDgwMDAwMDAwCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1NPVVJDRV9QSU5fQ0xPQ0tfU1JDX0JJVFModW5zaWduZWQgbikKK3sKKwkvKiBOSSA2NjB4LXNwZWNpZmljICovCisJcmV0dXJuIDB4MTAgKyBuOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1JUU0lfQ0xPQ0tfU1JDX0JJVFModW5zaWduZWQgbikKK3sKKwlyZXR1cm4gMHgxOCArIG47Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUEZJX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJLyogbm8gcGZpIG9uIE5JIDY2MHggKi8KKwlyZXR1cm4gMHgyMCArIG47Cit9CisKKy8qIFBvc3NpYmlsaXRpZXMgZm9yIHNldHRpbmcgYSBnYXRlIHNvdXJjZSB3aXRoCitJTlNOX0NPTkZJR19TRVRfR0FURV9TUkMgd2hlbiB1c2luZyBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMuCitNYXkgYmUgYml0d2lzZS1vcidkIHdpdGggQ1JfRURHRSBvciBDUl9JTlZFUlQuICovCitlbnVtIG5pX2dwY3RfZ2F0ZV9zZWxlY3QgeworCS8qIG0tc2VyaWVzIGdhdGVzICovCisJTklfR1BDVF9USU1FU1RBTVBfTVVYX0dBVEVfU0VMRUNUID0gMHgwLAorCU5JX0dQQ1RfQUlfU1RBUlQyX0dBVEVfU0VMRUNUID0gMHgxMiwKKwlOSV9HUENUX1BYSV9TVEFSX1RSSUdHRVJfR0FURV9TRUxFQ1QgPSAweDEzLAorCU5JX0dQQ1RfTkVYVF9PVVRfR0FURV9TRUxFQ1QgPSAweDE0LAorCU5JX0dQQ1RfQUlfU1RBUlQxX0dBVEVfU0VMRUNUID0gMHgxYywKKwlOSV9HUENUX05FWFRfU09VUkNFX0dBVEVfU0VMRUNUID0gMHgxZCwKKwlOSV9HUENUX0FOQUxPR19UUklHR0VSX09VVF9HQVRFX1NFTEVDVCA9IDB4MWUsCisJTklfR1BDVF9MT0dJQ19MT1dfR0FURV9TRUxFQ1QgPSAweDFmLAorCS8qIG1vcmUgZ2F0ZXMgZm9yIDY2MHggKi8KKwlOSV9HUENUX1NPVVJDRV9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MTAwLAorCU5JX0dQQ1RfR0FURV9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MTAxLAorCS8qIG1vcmUgZ2F0ZXMgZm9yIDY2MHggInNlY29uZCBnYXRlIiAqLworCU5JX0dQQ1RfVVBfRE9XTl9QSU5faV9HQVRFX1NFTEVDVCA9IDB4MjAxLAorCU5JX0dQQ1RfU0VMRUNURURfR0FURV9HQVRFX1NFTEVDVCA9IDB4MjFlLAorCS8qIG0tc2VyaWVzICJzZWNvbmQgZ2F0ZSIgc291cmNlcyBhcmUgdW5rbm93biwKKwkgICB3ZSBzaG91bGQgYWRkIHRoZW0gaGVyZSB3aXRoIGFuIG9mZnNldCBvZiAweDMwMCB3aGVuIGtub3duLiAqLworCU5JX0dQQ1RfRElTQUJMRURfR0FURV9TRUxFQ1QgPSAweDgwMDAsCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX0dBVEVfUElOX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MTAyICsgbjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9SVFNJX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKG4pOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1BGSV9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKG4pOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1VQX0RPV05fUElOX0dBVEVfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MjAyICsgbjsKK30KKworLyogUG9zc2liaWxpdGllcyBmb3Igc2V0dGluZyBhIHNvdXJjZSB3aXRoCitJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDIHdoZW4gdXNpbmcgTkkgZ2VuZXJhbC1wdXJwb3NlIGNvdW50ZXJzLiAqLworZW51bSBuaV9ncGN0X290aGVyX2luZGV4IHsKKwlOSV9HUENUX1NPVVJDRV9FTkNPREVSX0EsCisJTklfR1BDVF9TT1VSQ0VfRU5DT0RFUl9CLAorCU5JX0dQQ1RfU09VUkNFX0VOQ09ERVJfWgorfTsKK2VudW0gbmlfZ3BjdF9vdGhlcl9zZWxlY3QgeworCS8qIG0tc2VyaWVzIGdhdGVzICovCisJLyogU3RpbGwgdW5rbm93biwgcHJvYmFibHkgb25seSBuZWVkIE5JX0dQQ1RfUEZJX09USEVSX1NFTEVDVCAqLworCU5JX0dQQ1RfRElTQUJMRURfT1RIRVJfU0VMRUNUID0gMHg4MDAwLAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9QRklfT1RIRVJfU0VMRUNUKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1Qobik7Cit9CisKKy8qIHN0YXJ0IHNvdXJjZXMgZm9yIG5pIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycyBmb3IgdXNlIHdpdGgKK0lOU05fQ09ORklHX0FSTSAqLworZW51bSBuaV9ncGN0X2FybV9zb3VyY2UgeworCU5JX0dQQ1RfQVJNX0lNTUVESUFURSA9IDB4MCwKKwlOSV9HUENUX0FSTV9QQUlSRURfSU1NRURJQVRFID0gMHgxLAkvKiBTdGFydCBib3RoIHRoZSBjb3VudGVyIGFuZAorCQkJCQkJICAgdGhlIGFkamFjZW50IHBhaXJlZCBjb3VudGVyCisJCQkJCQkgICBzaW11bHRhbmVvdXNseSAqLworCS8qIE5JIGRvZXNuJ3QgZG9jdW1lbnQgYml0cyBmb3Igc2VsZWN0aW5nIGhhcmR3YXJlIGFybSB0cmlnZ2Vycy4gIElmCisJICogdGhlIE5JX0dQQ1RfQVJNX1VOS05PV04gYml0IGlzIHNldCwgd2Ugd2lsbCBwYXNzIHRoZSBsZWFzdAorCSAqIHNpZ25pZmljYW50IGJpdHMgKDMgYml0cyBmb3IgNjYweCBvciA1IGJpdHMgZm9yIG0tc2VyaWVzKSB0aHJvdWdoIHRvCisJICogdGhlIGhhcmR3YXJlLiAgVGhpcyB3aWxsIGF0IGxlYXN0IGFsbG93IHNvbWVvbmUgdG8gZmlndXJlIG91dCB3aGF0CisJICogdGhlIGJpdHMgZG8gbGF0ZXIuICovCisJTklfR1BDVF9BUk1fVU5LTk9XTiA9IDB4MTAwMCwKK307CisKKy8qIGRpZ2l0YWwgZmlsdGVyaW5nIG9wdGlvbnMgZm9yIG5pIDY2MHggZm9yIHVzZSB3aXRoIElOU05fQ09ORklHX0ZJTFRFUi4gKi8KK2VudW0gbmlfZ3BjdF9maWx0ZXJfc2VsZWN0IHsKKwlOSV9HUENUX0ZJTFRFUl9PRkYgPSAweDAsCisJTklfR1BDVF9GSUxURVJfVElNRUJBU0VfM19TWU5DID0gMHgxLAorCU5JX0dQQ1RfRklMVEVSXzEwMHhfVElNRUJBU0VfMSA9IDB4MiwKKwlOSV9HUENUX0ZJTFRFUl8yMHhfVElNRUJBU0VfMSA9IDB4MywKKwlOSV9HUENUX0ZJTFRFUl8xMHhfVElNRUJBU0VfMSA9IDB4NCwKKwlOSV9HUENUX0ZJTFRFUl8yeF9USU1FQkFTRV8xID0gMHg1LAorCU5JX0dQQ1RfRklMVEVSXzJ4X1RJTUVCQVNFXzMgPSAweDYKK307CisKKy8qIFBGSSBkaWdpdGFsIGZpbHRlcmluZyBvcHRpb25zIGZvciBuaSBtLXNlcmllcyBmb3IgdXNlIHdpdGgKKyAqIElOU05fQ09ORklHX0ZJTFRFUi4gKi8KK2VudW0gbmlfcGZpX2ZpbHRlcl9zZWxlY3QgeworCU5JX1BGSV9GSUxURVJfT0ZGID0gMHgwLAorCU5JX1BGSV9GSUxURVJfMTI1bnMgPSAweDEsCisJTklfUEZJX0ZJTFRFUl82NDI1bnMgPSAweDIsCisJTklfUEZJX0ZJTFRFUl8yNTUwdXMgPSAweDMKK307CisKKy8qIG1hc3RlciBjbG9jayBzb3VyY2VzIGZvciBuaSBtaW8gYm9hcmRzIGFuZCBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDICovCitlbnVtIG5pX21pb19jbG9ja19zb3VyY2UgeworCU5JX01JT19JTlRFUk5BTF9DTE9DSyA9IDAsCisJTklfTUlPX1JUU0lfQ0xPQ0sgPSAxLAkvKiBkb2Vzbid0IHdvcmsgZm9yIG0tc2VyaWVzLCB1c2UKKwkJCQkgICBOSV9NSU9fUExMX1JUU0lfQ0xPQ0soKSAqLworCS8qIHRoZSBOSV9NSU9fUExMXyogc291cmNlcyBhcmUgbS1zZXJpZXMgb25seSAqLworCU5JX01JT19QTExfUFhJX1NUQVJfVFJJR0dFUl9DTE9DSyA9IDIsCisJTklfTUlPX1BMTF9QWEkxMF9DTE9DSyA9IDMsCisJTklfTUlPX1BMTF9SVFNJMF9DTE9DSyA9IDQKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX01JT19QTExfUlRTSV9DTE9DSyh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX01JT19QTExfUlRTSTBfQ0xPQ0sgKyBydHNpX2NoYW5uZWw7Cit9CisKKy8qIFNpZ25hbHMgd2hpY2ggY2FuIGJlIHJvdXRlZCB0byBhbiBOSSBSVFNJIHBpbiB3aXRoIElOU05fQ09ORklHX1NFVF9ST1VUSU5HLgorIFRoZSBudW1iZXJzIGFzc2lnbmVkIGFyZSBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlIGJpdHMgcmVxdWlyZWQKKyB0byBwcm9ncmFtIHRoZSBib2FyZC4gKi8KK2VudW0gbmlfcnRzaV9yb3V0aW5nIHsKKwlOSV9SVFNJX09VVFBVVF9BRFJfU1RBUlQxID0gMCwKKwlOSV9SVFNJX09VVFBVVF9BRFJfU1RBUlQyID0gMSwKKwlOSV9SVFNJX09VVFBVVF9TQ0xLRyA9IDIsCisJTklfUlRTSV9PVVRQVVRfREFDVVBETiA9IDMsCisJTklfUlRTSV9PVVRQVVRfREFfU1RBUlQxID0gNCwKKwlOSV9SVFNJX09VVFBVVF9HX1NSQzAgPSA1LAorCU5JX1JUU0lfT1VUUFVUX0dfR0FURTAgPSA2LAorCU5JX1JUU0lfT1VUUFVUX1JHT1VUMCA9IDcsCisJTklfUlRTSV9PVVRQVVRfUlRTSV9CUkRfMCA9IDgsCisJTklfUlRTSV9PVVRQVVRfUlRTSV9PU0MgPSAxMgkvKiBwcmUtbS1zZXJpZXMgYWx3YXlzIGhhdmUgUlRTSSBjbG9jaworCQkJCQkgICBvbiBsaW5lIDcgKi8KK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIE5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEXzAgKyBuOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gYW4gTkkgUEZJIHBpbiBvbiBhbiBtLXNlcmllcyBib2FyZCB3aXRoCisgKiBJTlNOX0NPTkZJR19TRVRfUk9VVElORy4gIFRoZXNlIG51bWJlcnMgYXJlIGFsc28gcmV0dXJuZWQgYnkKKyAqIElOU05fQ09ORklHX0dFVF9ST1VUSU5HIG9uIHByZS1tLXNlcmllcyBib2FyZHMsIGV2ZW4gdGhvdWdoIHRoZWlyIHJvdXRpbmcKKyAqIGNhbm5vdCBiZSBjaGFuZ2VkLiAgVGhlIG51bWJlcnMgYXNzaWduZWQgYXJlIG5vdCBhcmJpdHJhcnksIHRoZXkgY29ycmVzcG9uZAorICogdG8gdGhlIGJpdHMgcmVxdWlyZWQgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICovCitlbnVtIG5pX3BmaV9yb3V0aW5nIHsKKwlOSV9QRklfT1VUUFVUX1BGSV9ERUZBVUxUID0gMCwKKwlOSV9QRklfT1VUUFVUX0FJX1NUQVJUMSA9IDEsCisJTklfUEZJX09VVFBVVF9BSV9TVEFSVDIgPSAyLAorCU5JX1BGSV9PVVRQVVRfQUlfQ09OVkVSVCA9IDMsCisJTklfUEZJX09VVFBVVF9HX1NSQzEgPSA0LAorCU5JX1BGSV9PVVRQVVRfR19HQVRFMSA9IDUsCisJTklfUEZJX09VVFBVVF9BT19VUERBVEVfTiA9IDYsCisJTklfUEZJX09VVFBVVF9BT19TVEFSVDEgPSA3LAorCU5JX1BGSV9PVVRQVVRfQUlfU1RBUlRfUFVMU0UgPSA4LAorCU5JX1BGSV9PVVRQVVRfR19TUkMwID0gOSwKKwlOSV9QRklfT1VUUFVUX0dfR0FURTAgPSAxMCwKKwlOSV9QRklfT1VUUFVUX0VYVF9TVFJPQkUgPSAxMSwKKwlOSV9QRklfT1VUUFVUX0FJX0VYVF9NVVhfQ0xLID0gMTIsCisJTklfUEZJX09VVFBVVF9HT1VUMCA9IDEzLAorCU5JX1BGSV9PVVRQVVRfR09VVDEgPSAxNCwKKwlOSV9QRklfT1VUUFVUX0ZSRVFfT1VUID0gMTUsCisJTklfUEZJX09VVFBVVF9QRklfRE8gPSAxNiwKKwlOSV9QRklfT1VUUFVUX0lfQVRSSUcgPSAxNywKKwlOSV9QRklfT1VUUFVUX1JUU0kwID0gMTgsCisJTklfUEZJX09VVFBVVF9QWElfU1RBUl9UUklHR0VSX0lOID0gMjYsCisJTklfUEZJX09VVFBVVF9TQ1hJX1RSSUcxID0gMjcsCisJTklfUEZJX09VVFBVVF9ESU9fQ0hBTkdFX0RFVEVDVF9SVFNJID0gMjgsCisJTklfUEZJX09VVFBVVF9DRElfU0FNUExFID0gMjksCisJTklfUEZJX09VVFBVVF9DRE9fVVBEQVRFID0gMzAKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1BGSV9PVVRQVVRfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1BGSV9PVVRQVVRfUlRTSTAgKyBydHNpX2NoYW5uZWw7Cit9CisKKy8qIFNpZ25hbHMgd2hpY2ggY2FuIGJlIHJvdXRlZCB0byBvdXRwdXQgb24gYSBOSSBQRkkgcGluIG9uIGEgNjYweCBib2FyZAorIHdpdGggSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcuICBUaGUgbnVtYmVycyBhc3NpZ25lZCBhcmUKKyBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlIGJpdHMgcmVxdWlyZWQKKyB0byBwcm9ncmFtIHRoZSBib2FyZC4gIExpbmVzIDAgdG8gNyBjYW4gb25seSBiZSBzZXQgdG8KKyBOSV82NjBYX1BGSV9PVVRQVVRfRElPLiAgTGluZXMgMzIgdG8gMzkgY2FuIG9ubHkgYmUgc2V0IHRvCisgTklfNjYwWF9QRklfT1VUUFVUX0NPVU5URVIuICovCitlbnVtIG5pXzY2MHhfcGZpX3JvdXRpbmcgeworCU5JXzY2MFhfUEZJX09VVFBVVF9DT1VOVEVSID0gMSwJLyogY291bnRlciAqLworCU5JXzY2MFhfUEZJX09VVFBVVF9ESU8gPSAyLAkvKiBzdGF0aWMgZGlnaXRhbCBvdXRwdXQgKi8KK307CisKKy8qIE5JIEV4dGVybmFsIFRyaWdnZXIgbGluZXMuICBUaGVzZSB2YWx1ZXMgYXJlIG5vdCBhcmJpdHJhcnksIGJ1dCBhcmUgcmVsYXRlZAorICogdG8gdGhlIGJpdHMgcmVxdWlyZWQgdG8gcHJvZ3JhbSB0aGUgYm9hcmQgKG9mZnNldCBieSAxIGZvciBoaXN0b3JpY2FsCisgKiByZWFzb25zKS4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfRVhUX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCkgLSAxOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9FWFRfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCkgLSAxOworfQorCisvKiBzdGF0dXMgYml0cyBmb3IgSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTICovCitlbnVtIGNvbWVkaV9jb3VudGVyX3N0YXR1c19mbGFncyB7CisJQ09NRURJX0NPVU5URVJfQVJNRUQgPSAweDEsCisJQ09NRURJX0NPVU5URVJfQ09VTlRJTkcgPSAweDIsCisJQ09NRURJX0NPVU5URVJfVEVSTUlOQUxfQ09VTlQgPSAweDQsCit9OworCisvKiBDbG9jayBzb3VyY2VzIGZvciBDRElPIHN1YmRldmljZSBvbiBOSSBtLXNlcmllcyBib2FyZHMuICBVc2VkIGFzIHRoZQorICogc2Nhbl9iZWdpbl9hcmcgZm9yIGEgY29tZWRpX2NvbW1hbmQuIFRoZXNlIHNvdXJjZXMgbWF5IGFsc28gYmUgYml0d2lzZS1vcidkCisgKiB3aXRoIENSX0lOVkVSVCB0byBjaGFuZ2UgcG9sYXJpdHkuICovCitlbnVtIG5pX21fc2VyaWVzX2NkaW9fc2Nhbl9iZWdpbl9zcmMgeworCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfR1JPVU5EID0gMCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FJX1NUQVJUID0gMTgsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BSV9DT05WRVJUID0gMTksCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19QWElfU1RBUl9UUklHR0VSID0gMjAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19HMF9PVVQgPSAyOCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0cxX09VVCA9IDI5LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfQU5BTE9HX1RSSUdHRVIgPSAzMCwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FPX1VQREFURSA9IDMxLAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfRlJFUV9PVVQgPSAzMiwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0RJT19DSEFOR0VfREVURUNUX0lSUSA9IDMzCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9DRElPX1NDQU5fQkVHSU5fU1JDX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCk7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0NESU9fU0NBTl9CRUdJTl9TUkNfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCk7Cit9CisKKy8qIHNjYW5fYmVnaW5fc3JjIGZvciBzY2FuX2JlZ2luX2FyZz09VFJJR19FWFQgd2l0aCBhbmFsb2cgb3V0cHV0IGNvbW1hbmQgb24gTkkKKyAqIGJvYXJkcy4gIFRoZXNlIHNjYW4gYmVnaW4gc291cmNlcyBjYW4gYWxzbyBiZSBiaXR3aXNlLW9yJ2Qgd2l0aCBDUl9JTlZFUlQgdG8KKyAqIGNoYW5nZSBwb2xhcml0eS4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQU9fU0NBTl9CRUdJTl9TUkNfUEZJKHVuc2lnbmVkIHBmaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKHBmaV9jaGFubmVsKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQU9fU0NBTl9CRUdJTl9TUkNfUlRTSSh1bnNpZ25lZCBydHNpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHJ0c2lfY2hhbm5lbCk7Cit9CisKKy8qIEJpdHMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aAorICogSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyB3aGVuIHVzaW5nIE5JIGZyZXF1ZW5jeSBvdXRwdXQgc3ViZGV2aWNlLiAqLworZW51bSBuaV9mcmVxX291dF9jbG9ja19zb3VyY2VfYml0cyB7CisJTklfRlJFUV9PVVRfVElNRUJBU0VfMV9ESVZfMl9DTE9DS19TUkMsCS8qIDEwIE1IeiAqLworCU5JX0ZSRVFfT1VUX1RJTUVCQVNFXzJfQ0xPQ0tfU1JDCS8qIDEwMCBLSHogKi8KK307CisKKy8qIFZhbHVlcyBmb3Igc2V0dGluZyBhIGNsb2NrIHNvdXJjZSB3aXRoIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgZm9yCisgKiA4MjU0IGNvdW50ZXIgc3ViZGV2aWNlcyBvbiBBbXBsaWNvbiBESU8gYm9hcmRzIChhbXBsY19kaW8yMDAgZHJpdmVyKS4gKi8KKwllbnVtIGFtcGxjX2Rpb19jbG9ja19zb3VyY2UgeworCQlBTVBMQ19ESU9fQ0xLX0NMS04sCS8qIHBlciBjaGFubmVsIGV4dGVybmFsIGNsb2NrCisJCQkJCSAgIGlucHV0L291dHB1dCBwaW4gKHBpbiBpcyBvbmx5IGFuCisJCQkJCSAgIGlucHV0IHdoZW4gY2xvY2sgc291cmNlIHNldCB0byB0aGlzCisJCQkJCSAgIHZhbHVlLCBvdGhlcndpc2UgaXQgaXMgYW4gb3V0cHV0KSAqLworCQlBTVBMQ19ESU9fQ0xLXzEwTUhaLAkvKiAxMCBNSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xTUhaLAkvKiAxIE1IeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLXzEwMEtIWiwJLyogMTAwIGtIeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLXzEwS0haLAkvKiAxMCBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xS0haLAkvKiAxIGtIeiBpbnRlcm5hbCBjbG9jayAqLworCQlBTVBMQ19ESU9fQ0xLX09VVE5NMSwJLyogb3V0cHV0IG9mIHByZWNlZGluZyBjb3VudGVyIGNoYW5uZWwKKwkJCQkJICAgKGZvciBjaGFubmVsIDAsIHByZWNlZGluZyBjb3VudGVyCisJCQkJCSAgIGNoYW5uZWwgaXMgY2hhbm5lbCAyIG9uIHByZWNlZGluZworCQkJCQkgICBjb3VudGVyIHN1YmRldmljZSwgZm9yIGZpcnN0IGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlLCBwcmVjZWRpbmcgY291bnRlcgorCQkJCQkgICBzdWJkZXZpY2UgaXMgdGhlIGxhc3QgY291bnRlcgorCQkJCQkgICBzdWJkZXZpY2UpICovCisJCUFNUExDX0RJT19DTEtfRVhUCS8qIHBlciBjaGlwIGV4dGVybmFsIGlucHV0IHBpbiAqLworCX07CisKKy8qIFZhbHVlcyBmb3Igc2V0dGluZyBhIGdhdGUgc291cmNlIHdpdGggSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDIGZvcgorICogODI1NCBjb3VudGVyIHN1YmRldmljZXMgb24gQW1wbGljb24gRElPIGJvYXJkcyAoYW1wbGNfZGlvMjAwIGRyaXZlcikuICovCisJZW51bSBhbXBsY19kaW9fZ2F0ZV9zb3VyY2UgeworCQlBTVBMQ19ESU9fR0FUX1ZDQywJLyogaW50ZXJuYWwgaGlnaCBsb2dpYyBsZXZlbCAqLworCQlBTVBMQ19ESU9fR0FUX0dORCwJLyogaW50ZXJuYWwgbG93IGxvZ2ljIGxldmVsICovCisJCUFNUExDX0RJT19HQVRfR0FUTiwJLyogcGVyIGNoYW5uZWwgZXh0ZXJuYWwgZ2F0ZSBpbnB1dCAqLworCQlBTVBMQ19ESU9fR0FUX05PVVROTTIsCS8qIG5lZ2F0ZWQgb3V0cHV0IG9mIGNvdW50ZXIgY2hhbm5lbAorCQkJCQkgICBtaW51cyAyIChmb3IgY2hhbm5lbHMgMCBvciAxLAorCQkJCQkgICBjaGFubmVsIG1pbnVzIDIgaXMgY2hhbm5lbCAxIG9yIDIgb24KKwkJCQkJICAgdGhlIHByZWNlZGluZyBjb3VudGVyIHN1YmRldmljZSwgZm9yCisJCQkJCSAgIHRoZSBmaXJzdCBjb3VudGVyIHN1YmRldmljZSB0aGUKKwkJCQkJICAgcHJlY2VkaW5nIGNvdW50ZXIgc3ViZGV2aWNlIGlzIHRoZQorCQkJCQkgICBsYXN0IGNvdW50ZXIgc3ViZGV2aWNlKSAqLworCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENCwKKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDUsCisJCUFNUExDX0RJT19HQVRfUkVTRVJWRUQ2LAorCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENworCX07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQ09NRURJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDExNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICAgIGNvbWVkaS9jb21lZGlfY29tcGF0MzIuYworICAgIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IGZvciA2NC1iaXQgY29tZWRpIGtlcm5lbCBtb2R1bGUuCisKKyAgICBBdXRob3I6IElhbiBBYmJvdHQsIE1FViBMdGQuIDxhYmJvdHRpQG1ldi5jby51az4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgTUVWIEx0ZC4gPGh0dHA6Ly93d3cubWV2LmNvLnVrLz4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpLmgiCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY29tZWRpX2NvbXBhdDMyLmgiCisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKyNpZm5kZWYgSEFWRV9DT01QQVRfSU9DVEwKKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CS8qIGZvciAodW4pcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uICovCisjZW5kaWYKKworI2RlZmluZSBDT01FREkzMl9DSEFOSU5GTyBfSU9SKENJTywzLGNvbWVkaTMyX2NoYW5pbmZvKQorI2RlZmluZSBDT01FREkzMl9SQU5HRUlORk8gX0lPUihDSU8sOCxjb21lZGkzMl9yYW5nZWluZm8pCisvKiBOLkIuIENPTUVESTMyX0NNRCBhbmQgQ09NRURJX0NNRCBvdWdodCB0byB1c2UgX0lPV1IsIG5vdCBfSU9SLgorICogSXQncyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBidXQgaXQgb25seSBhZmZlY3RzIHRoZSBjb21tYW5kIG51bWJlci4gKi8KKyNkZWZpbmUgQ09NRURJMzJfQ01EIF9JT1IoQ0lPLDksY29tZWRpMzJfY21kKQorLyogTi5CLiBDT01FREkzMl9DTURURVNUIGFuZCBDT01FRElfQ01EVEVTVCBvdWdodCB0byB1c2UgX0lPV1IsIG5vdCBfSU9SLgorICogSXQncyB0b28gbGF0ZSB0byBjaGFuZ2UgaXQgbm93LCBidXQgaXQgb25seSBhZmZlY3RzIHRoZSBjb21tYW5kIG51bWJlci4gKi8KKyNkZWZpbmUgQ09NRURJMzJfQ01EVEVTVCBfSU9SKENJTywxMCxjb21lZGkzMl9jbWQpCisjZGVmaW5lIENPTUVESTMyX0lOU05MSVNUIF9JT1IoQ0lPLDExLGNvbWVkaTMyX2luc25saXN0KQorI2RlZmluZSBDT01FREkzMl9JTlNOIF9JT1IoQ0lPLDEyLGNvbWVkaTMyX2luc24pCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2NoYW5pbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwljb21wYXRfdXB0cl90IG1heGRhdGFfbGlzdDsJLyogMzItYml0ICdsc2FtcGxfdCAqJyAqLworCWNvbXBhdF91cHRyX3QgZmxhZ2xpc3Q7CQkvKiAzMi1iaXQgJ3Vuc2lnbmVkIGludCAqJyAqLworCWNvbXBhdF91cHRyX3QgcmFuZ2VsaXN0OwkvKiAzMi1iaXQgJ3Vuc2lnbmVkIGludCAqJyAqLworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9IGNvbWVkaTMyX2NoYW5pbmZvOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9yYW5nZWluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcmFuZ2VfdHlwZTsKKwljb21wYXRfdXB0cl90IHJhbmdlX3B0cjsJLyogMzItYml0ICd2b2lkIConICovCit9IGNvbWVkaTMyX3JhbmdlaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHN1YmRldjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYXJnOworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9hcmc7CisJdW5zaWduZWQgaW50IGNvbnZlcnRfc3JjOworCXVuc2lnbmVkIGludCBjb252ZXJ0X2FyZzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfc3JjOworCXVuc2lnbmVkIGludCBzY2FuX2VuZF9hcmc7CisJdW5zaWduZWQgaW50IHN0b3Bfc3JjOworCXVuc2lnbmVkIGludCBzdG9wX2FyZzsKKwljb21wYXRfdXB0cl90IGNoYW5saXN0OwkJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbmxpc3RfbGVuOworCWNvbXBhdF91cHRyX3QgZGF0YTsJCS8qIDMyLWJpdCAnc2FtcGxfdCAqJyAqLworCXVuc2lnbmVkIGludCBkYXRhX2xlbjsKK30gY29tZWRpMzJfY21kOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9pbnNuX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IGluc247CisJdW5zaWduZWQgaW50IG47CisJY29tcGF0X3VwdHJfdCBkYXRhOwkJLyogMzItYml0ICdsc2FtcGxfdCAqJyAqLworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGNoYW5zcGVjOworCXVuc2lnbmVkIGludCB1bnVzZWRbM107Cit9IGNvbWVkaTMyX2luc247CisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2luc25saXN0X3N0cnVjdCB7CisJdW5zaWduZWQgaW50IG5faW5zbnM7CisJY29tcGF0X3VwdHJfdCBpbnNuczsJCS8qIDMyLWJpdCAnY29tZWRpX2luc24gKicgKi8KK30gY29tZWRpMzJfaW5zbmxpc3Q7CisKKy8qIEhhbmRsZSB0cmFuc2xhdGVkIGlvY3RsLiAqLworc3RhdGljIGludCB0cmFuc2xhdGVkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoIWZpbGUtPmZfb3ApIHsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKKwlpZiAoZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIHsKKwkJaW50IHJjID0gKGludCkoKmZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKShmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpIHsKKwkJCXJjID0gLUVOT1RUWTsKKwkJfQorCQlyZXR1cm4gcmM7CisJfQorI2VuZGlmCisJaWYgKGZpbGUtPmZfb3AtPmlvY3RsKSB7CisJCWludCByYzsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmMgPSAoKmZpbGUtPmZfb3AtPmlvY3RsKShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQlmaWxlLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfQ0hBTklORk8gaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jaGFuaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NoYW5pbmZvIF9fdXNlciAqY2hhbmluZm87CisJY29tZWRpMzJfY2hhbmluZm8gX191c2VyICpjaGFuaW5mbzMyOworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCWNoYW5pbmZvMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY2hhbmluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNoYW5pbmZvKSk7CisKKwkvKiBDb3B5IGNoYW5pbmZvIHN0cnVjdHVyZS4gIElnbm9yZSB1bnVzZWQgbWVtYmVycy4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY2hhbmluZm8zMiwgc2l6ZW9mKCpjaGFuaW5mbzMyKSkKKwkJCXx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjaGFuaW5mbywKKwkJCQlzaXplb2YoKmNoYW5pbmZvKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY2hhbmluZm8zMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjaGFuaW5mby0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5tYXhkYXRhX2xpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNoYW5pbmZvLT5tYXhkYXRhX2xpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudXB0ciwgJmNoYW5pbmZvMzItPmZsYWdsaXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjaGFuaW5mby0+ZmxhZ2xpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudXB0ciwgJmNoYW5pbmZvMzItPnJhbmdlbGlzdCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY2hhbmluZm8tPnJhbmdlbGlzdCk7CisJaWYgKGVycikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfQ0hBTklORk8sICh1bnNpZ25lZCBsb25nKWNoYW5pbmZvKTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfUkFOR0VJTkZPIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfcmFuZ2VpbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfcmFuZ2VpbmZvIF9fdXNlciAqcmFuZ2VpbmZvOworCWNvbWVkaTMyX3JhbmdlaW5mbyBfX3VzZXIgKnJhbmdlaW5mbzMyOworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCXJhbmdlaW5mbzMyID0gY29tcGF0X3B0cihhcmcpOworCXJhbmdlaW5mbyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmFuZ2VpbmZvKSk7CisKKwkvKiBDb3B5IHJhbmdlaW5mbyBzdHJ1Y3R1cmUuICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHJhbmdlaW5mbzMyLCBzaXplb2YoKnJhbmdlaW5mbzMyKSkKKwkJCXx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByYW5nZWluZm8sCisJCQkJc2l6ZW9mKCpyYW5nZWluZm8pKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZyYW5nZWluZm8zMi0+cmFuZ2VfdHlwZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmcmFuZ2VpbmZvLT5yYW5nZV90eXBlKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZyYW5nZWluZm8zMi0+cmFuZ2VfcHRyKTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZyYW5nZWluZm8tPnJhbmdlX3B0cik7CisJaWYgKGVycikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfUkFOR0VJTkZPLAorCQkJKHVuc2lnbmVkIGxvbmcpcmFuZ2VpbmZvKTsKK30KKworLyogQ29weSAzMi1iaXQgY21kIHN0cnVjdHVyZSB0byBuYXRpdmUgY21kIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbXBhdF9jbWQoY29tZWRpX2NtZCBfX3VzZXIgKmNtZCwKKwkJY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzIpCit7CisJaW50IGVycjsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB1aW50OworCQljb21wYXRfdXB0cl90IHVwdHI7CisJfSB0ZW1wOworCisJLyogQ29weSBjbWQgc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBjbWQzMiwgc2l6ZW9mKCpjbWQzMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY21kLCBzaXplb2YoKmNtZCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgPSAwOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdWJkZXYpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+ZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+ZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdGFydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RhcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c2Nhbl9iZWdpbl9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c2Nhbl9lbmRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fZW5kX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnN0b3BfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0b3BfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjbWQzMi0+Y2hhbmxpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNtZC0+Y2hhbmxpc3QpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjbWQzMi0+ZGF0YSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY21kLT5kYXRhKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+ZGF0YV9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+ZGF0YV9sZW4pOworCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworLyogQ29weSBuYXRpdmUgY21kIHN0cnVjdHVyZSB0byAzMi1iaXQgY21kIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9jbWQoY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzIsIGNvbWVkaV9jbWQgX191c2VyICpjbWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIENvcHkgYmFjayBtb3N0IG9mIGNtZCBzdHJ1Y3R1cmUuICovCisJLyogQXNzdW1lIHRoZSBwb2ludGVyIHZhbHVlcyBhcmUgYWxyZWFkeSB2YWxpZC4gKi8KKwkvKiAoQ291bGQgdXNlIHB0cl90b19jb21wYXQoKSB0byBzZXQgdGhlbSwgYnV0IHRoYXQgd2Fzbid0IGltcGxlbWVudGVkCisJICogdW50aWwga2VybmVsIHZlcnNpb24gMi42LjExLikgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY21kLCBzaXplb2YoKmNtZCkpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY21kMzIsIHNpemVvZigqY21kMzIpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdWJkZXYpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5mbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5mbGFncyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RhcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+Y29udmVydF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y29udmVydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fZW5kX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN0b3Bfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdG9wX2FyZyk7CisJLyogQXNzdW1lIGNoYW5saXN0IHBvaW50ZXIgaXMgdW5jaGFuZ2VkLiAqLworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5jaGFubGlzdF9sZW4pOworCS8qIEFzc3VtZSBkYXRhIHBvaW50ZXIgaXMgdW5jaGFuZ2VkLiAqLworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmRhdGFfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPmRhdGFfbGVuKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NNRCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2NtZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NtZCBfX3VzZXIgKmNtZDsKKwljb21lZGkzMl9jbWQgX191c2VyICpjbWQzMjsKKwlpbnQgcmM7CisKKwljbWQzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwljbWQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNtZCkpOworCisJcmMgPSBnZXRfY29tcGF0X2NtZChjbWQsIGNtZDMyKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9DTUQsICh1bnNpZ25lZCBsb25nKWNtZCk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NNRFRFU1QgaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jbWR0ZXN0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfY21kIF9fdXNlciAqY21kOworCWNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyOworCWludCByYywgZXJyOworCisJY21kMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY21kID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWQpKTsKKworCXJjID0gZ2V0X2NvbXBhdF9jbWQoY21kLCBjbWQzMik7CisJaWYgKHJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0NNRFRFU1QsICh1bnNpZ25lZCBsb25nKWNtZCk7CisJaWYgKHJjIDwgMCkgeworCQlyZXR1cm4gcmM7CisJfQorCisJZXJyID0gcHV0X2NvbXBhdF9jbWQoY21kMzIsIGNtZCk7CisJaWYgKGVycikgeworCQlyYyA9IGVycjsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBDb3B5IDMyLWJpdCBpbnNuIHN0cnVjdHVyZSB0byBuYXRpdmUgaW5zbiBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IGdldF9jb21wYXRfaW5zbihjb21lZGlfaW5zbiBfX3VzZXIgKmluc24sCisJCWNvbWVkaTMyX2luc24gX191c2VyICppbnNuMzIpCit7CisJaW50IGVycjsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGludCB1aW50OworCQljb21wYXRfdXB0cl90IHVwdHI7CisJfSB0ZW1wOworCisJLyogQ29weSBpbnNuIHN0cnVjdHVyZS4gIElnbm9yZSB0aGUgdW51c2VkIG1lbWJlcnMuICovCisJZXJyID0gMDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW5zbjMyLCBzaXplb2YoKmluc24zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5zbiwgc2l6ZW9mKCppbnNuKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+aW5zbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+aW5zbik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmaW5zbjMyLT5uKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5uKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZpbnNuMzItPmRhdGEpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmluc24tPmRhdGEpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5zdWJkZXYpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+Y2hhbnNwZWMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmluc24tPmNoYW5zcGVjKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0lOU05MSVNUIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfaW5zbmxpc3Qoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjb21iaW5lZF9pbnNubGlzdCB7CisJCWNvbWVkaV9pbnNubGlzdCBpbnNubGlzdDsKKwkJY29tZWRpX2luc24gaW5zblsxXTsKKwl9IF9fdXNlciAqczsKKwljb21lZGkzMl9pbnNubGlzdCBfX3VzZXIgKmluc25saXN0MzI7CisJY29tZWRpMzJfaW5zbiBfX3VzZXIgKmluc24zMjsKKwljb21wYXRfdXB0cl90IHVwdHI7CisJdW5zaWduZWQgaW50IG5faW5zbnMsIG47CisJaW50IGVyciwgcmM7CisKKwlpbnNubGlzdDMyID0gY29tcGF0X3B0cihhcmcpOworCisJLyogR2V0IDMyLWJpdCBpbnNubGlzdCBzdHJ1Y3R1cmUuICAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpbnNubGlzdDMyLCBzaXplb2YoKmluc25saXN0MzIpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcihuX2luc25zLCAmaW5zbmxpc3QzMi0+bl9pbnNucyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodXB0ciwgJmluc25saXN0MzItPmluc25zKTsKKwlpbnNuMzIgPSBjb21wYXRfcHRyKHVwdHIpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQWxsb2NhdGUgdXNlciBtZW1vcnkgdG8gY29weSBpbnNubGlzdCBhbmQgaW5zbnMgaW50by4gKi8KKwlzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uob2Zmc2V0b2Yoc3RydWN0IGNvbWJpbmVkX2luc25saXN0LAorCQkJCWluc25bbl9pbnNuc10pKTsKKworCS8qIFNldCBuYXRpdmUgaW5zbmxpc3Qgc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgJnMtPmluc25saXN0LCBzaXplb2Yocy0+aW5zbmxpc3QpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyIHw9IF9fcHV0X3VzZXIobl9pbnNucywgJnMtPmluc25saXN0Lm5faW5zbnMpOworCWVyciB8PSBfX3B1dF91c2VyKCZzLT5pbnNuWzBdLCAmcy0+aW5zbmxpc3QuaW5zbnMpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQ29weSBpbnNuIHN0cnVjdHVyZXMuICovCisJZm9yIChuID0gMDsgbiA8IG5faW5zbnM7IG4rKykgeworCQlyYyA9IGdldF9jb21wYXRfaW5zbigmcy0+aW5zbltuXSwgJmluc24zMltuXSk7CisJCWlmIChyYykgeworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0lOU05MSVNULAorCQkJKHVuc2lnbmVkIGxvbmcpJnMtPmluc25saXN0KTsKK30KKworLyogSGFuZGxlIDMyLWJpdCBDT01FRElfSU5TTiBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2luc24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9pbnNuIF9fdXNlciAqaW5zbjsKKwljb21lZGkzMl9pbnNuIF9fdXNlciAqaW5zbjMyOworCWludCByYzsKKworCWluc24zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnNuID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCppbnNuKSk7CisKKwlyYyA9IGdldF9jb21wYXRfaW5zbihpbnNuLCBpbnNuMzIpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0lOU04sICh1bnNpZ25lZCBsb25nKWluc24pOworfQorCisvKiBQcm9jZXNzIHVudHJhbnNsYXRlZCBpb2N0bC4gKi8KKy8qIFJldHVybnMgLUVOT0lPQ1RMQ01EIGZvciB1bnJlY29nbmlzZWQgaW9jdGwgY29kZXMuICovCitzdGF0aWMgaW5saW5lIGludCByYXdfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01FRElfREVWQ09ORklHOgorCWNhc2UgQ09NRURJX0RFVklORk86CisJY2FzZSBDT01FRElfU1VCRElORk86CisJY2FzZSBDT01FRElfQlVGQ09ORklHOgorCWNhc2UgQ09NRURJX0JVRklORk86CisJCS8qIEp1c3QgbmVlZCB0byB0cmFuc2xhdGUgdGhlIHBvaW50ZXIgYXJndW1lbnQuICovCisJCWFyZyA9ICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKTsKKwkJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfTE9DSzoKKwljYXNlIENPTUVESV9VTkxPQ0s6CisJY2FzZSBDT01FRElfQ0FOQ0VMOgorCWNhc2UgQ09NRURJX1BPTEw6CisJCS8qIE5vIHRyYW5zbGF0aW9uIG5lZWRlZC4gKi8KKwkJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9DSEFOSU5GTzoKKwkJcmMgPSBjb21wYXRfY2hhbmluZm8oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9SQU5HRUlORk86CisJCXJjID0gY29tcGF0X3JhbmdlaW5mbyhmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0NNRDoKKwkJcmMgPSBjb21wYXRfY21kKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfQ01EVEVTVDoKKwkJcmMgPSBjb21wYXRfY21kdGVzdChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0lOU05MSVNUOgorCQlyYyA9IGNvbXBhdF9pbnNubGlzdChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0lOU046CisJCXJjID0gY29tcGF0X2luc24oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBIQVZFX0NPTVBBVF9JT0NUTAkvKiBkZWZpbmVkIGluIDxsaW51eC9mcy5oPiAyLjYuMTEgb253YXJkcyAqLworCisvKiBjb21wYXRfaW9jdGwgZmlsZSBvcGVyYXRpb24uICovCisvKiBSZXR1cm5zIC1FTk9JT0NUTENNRCBmb3IgdW5yZWNvZ25pc2VkIGlvY3RsIGNvZGVzLiAqLworbG9uZyBjb21lZGlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKK30KKworI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KKworLyoKKyAqIEJyYWluLWRlYWQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgMi42LjEwIGFuZCBlYXJsaWVyLgorICoKKyAqIEl0J3MgYnJhaW4tZGVhZCBiZWNhdXNlIGNtZCBudW1iZXJzIG5lZWQgdG8gYmUgdW5pcXVlIHN5c3RlbS13aWRlIQorICogVGhlIGNvbWVkaSBkcml2ZXIgY291bGQgZW5kIHVwIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBpb2N0bHMgZm9yIG5vbi1Db21lZGkKKyAqIGRldmljZXMgYmVjYXVzZSBpdCByZWdpc3RlcmVkIHRoZSBzeXN0ZW0td2lkZSBjbWQgY29kZSBmaXJzdC4gIFNpbWlsYXJseSwKKyAqIGFub3RoZXIgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBhIENvbWVkaQorICogZGV2aWNlIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgY21kIGNvZGUgZmlyc3QuICBDaGFvcyBlbnN1ZXMuCisgKi8KKworLyogSGFuZGxlciBmb3IgYWxsIDMyLWJpdCBpb2N0bCBjb2RlcyByZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyLiAqLworc3RhdGljIGludCBtYXBwZWRfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBDb21lZGkgZGV2aWNlLiAqLworCWlmIChpbWFqb3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpICE9IENPTUVESV9NQUpPUikgeworCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmMgPSByYXdfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCS8qIERvIG5vdCByZXR1cm4gLUVOT0lPQ1RMQ01ELiAqLworCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpIHsKKwkJcmMgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0cnVjdCBpb2N0bDMyX21hcCB7CisJdW5zaWduZWQgaW50IGNtZDsKKwlpbnQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywKKwkJCXN0cnVjdCBmaWxlICopOworCWludCByZWdpc3RlcmVkOworfTsKKworc3RhdGljIHN0cnVjdCBpb2N0bDMyX21hcCBjb21lZGlfaW9jdGwzMl9tYXBbXSA9IHsKKwl7IENPTUVESV9ERVZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0RFVklORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX1NVQkRJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9CVUZDT05GSUcsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0JVRklORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0xPQ0ssIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX1VOTE9DSywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfQ0FOQ0VMLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9QT0xMLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX0NIQU5JTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX1JBTkdFSU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9DTUQsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfQ01EVEVTVCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9JTlNOTElTVCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9JTlNOLCBtYXBwZWRfaW9jdGwsIDAgfSwKK307CisKKyNkZWZpbmUgTlVNX0lPQ1RMMzJfTUFQUyBBUlJBWV9TSVpFKGNvbWVkaV9pb2N0bDMyX21hcCkKKworLyogUmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIGhhbmRsZXJzLiAqLwordm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKQoreworCWludCBuLCByYzsKKworCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKKwkJcmMgPSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCwKKwkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiY29tZWRpOiBmYWlsZWQgdG8gcmVnaXN0ZXIgMzItYml0ICIKKwkJCQkJImNvbXBhdGlibGUgaW9jdGwgaGFuZGxlciBmb3IgMHglWCAtICIKKwkJCQkJImV4cGVjdCBiYWQgdGhpbmdzIHRvIGhhcHBlbiFcbiIsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOworCQl9CisJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gIXJjOworCX0KK30KKworLyogVW5yZWdpc3RlciBzeXN0ZW0td2lkZSAzMi1iaXQgaW9jdGwgdHJhbnNsYXRpb25zLiAqLwordm9pZCBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpCit7CisJaW50IG4sIHJjOworCisJZm9yIChuID0gMDsgbiA8IE5VTV9JT0NUTDMyX01BUFM7IG4rKykgeworCQlpZiAoY29tZWRpX2lvY3RsMzJfbWFwW25dLnJlZ2lzdGVyZWQpIHsKKwkJCXJjID0gdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5oYW5kbGVyKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpOiBmYWlsZWQgdG8gdW5yZWdpc3RlciAzMi1iaXQgIgorCQkJCQkiY29tcGF0aWJsZSBpb2N0bCBoYW5kbGVyIGZvciAweCVYIC0gIgorCQkJCQkiZXhwZWN0IGtlcm5lbCBPb3BzIVxuIiwKKwkJCQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7CisJCQl9IGVsc2UgeworCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gMDsKKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmCS8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNlbmRpZgkvKiBDT05GSUdfQ09NUEFUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EwMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICAgIGNvbWVkaS9jb21lZGlfY29tcGF0MzIuaAorICAgIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IGZvciA2NC1iaXQgY29tZWRpIGtlcm5lbCBtb2R1bGUuCisKKyAgICBBdXRob3I6IElhbiBBYmJvdHQsIE1FViBMdGQuIDxhYmJvdHRpQG1ldi5jby51az4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgTUVWIEx0ZC4gPGh0dHA6Ly93d3cubWV2LmNvLnVrLz4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwNyBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElfQ09NUEFUMzJfSAorI2RlZmluZSBfQ09NRURJX0NPTVBBVDMyX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CS8qIEZvciBIQVZFX0NPTVBBVF9JT0NUTCBhbmQgSEFWRV9VTkxPQ0tFRF9JT0NUTCAqLworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKKworZXh0ZXJuIGxvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpOworI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCisKKyNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNkZWZpbmUgY29tZWRpX2NvbXBhdF9pb2N0bCAwCS8qIE5VTEwgKi8KK2V4dGVybiB2b2lkIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpOworZXh0ZXJuIHZvaWQgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMih2b2lkKTsKKworI2VuZGlmIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKyNlbHNlIC8qIENPTkZJR19DT01QQVQgKi8KKworI2RlZmluZSBjb21lZGlfY29tcGF0X2lvY3RsIDAJLyogTlVMTCAqLworI2RlZmluZSBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKKyNlbmRpZiAvKiBfQ09NRURJX0NPTVBBVDMyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMThjOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC0wLDAgKzEsMjI0NCBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2ZvcHMuYworICAgIGNvbWVkaSBrZXJuZWwgbW9kdWxlCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlICJjb21lZGlfZm9wcy5oIgorI2luY2x1ZGUgImNvbWVkaV9jb21wYXQzMi5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworLyogI2luY2x1ZGUgImt2bWVtLmgiICovCisKK01PRFVMRV9BVVRIT1IoImh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgY29yZSBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKK2ludCBjb21lZGlfZGVidWc7Cittb2R1bGVfcGFyYW0oY29tZWRpX2RlYnVnLCBpbnQsIDA2NDQpOworI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8KKyAgICAqY29tZWRpX2ZpbGVfaW5mb190YWJsZVtDT01FRElfTlVNX01JTk9SU107CisKK3N0YXRpYyBpbnQgZG9fZGV2Y29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fYnVmY29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fZGV2aW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZpbmZvICphcmcsCisJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBkb19zdWJkaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkaW5mbyAqYXJnLAorCQkJICAgICB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY2hhbmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfY2hhbmluZm8gKmFyZyk7CitzdGF0aWMgaW50IGRvX2J1ZmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpOworc3RhdGljIGludCBkb19jbWRfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19sb2NrX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX3VubG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19jYW5jZWxfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY21kdGVzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2luc25saXN0X2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9faW5zbl9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX3BvbGxfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZCwgdm9pZCAqZmlsZSk7CisKK2V4dGVybiB2b2lkIGRvX2JlY29tZV9ub25idXN5KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7CitzdGF0aWMgaW50IGRvX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworCitzdGF0aWMgaW50IGNvbWVkaV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKTsKKworc3RhdGljIGludCBpc19kZXZpY2VfYnVzeShjb21lZGlfZGV2aWNlICpkZXYpOworCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorc3RhdGljIGxvbmcgY29tZWRpX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCisjZWxzZQorc3RhdGljIGludCBjb21lZGlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKyNlbmRpZgoreworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKworCS8qIERldmljZSBjb25maWcgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBtdXN0IHdvcmsgb24KKwkgKiBhbiB1bmNvbmZpZ3VyZWQgZGV2aWNlLiAqLworCWlmIChjbWQgPT0gQ09NRURJX0RFVkNPTkZJRykgeworCQlyYyA9IGRvX2RldmNvbmZpZ19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJZ290byBkb25lOworCX0KKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiAvZGV2L2NvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENPTUVESV9CVUZDT05GSUc6CisJCXJjID0gZG9fYnVmY29uZmlnX2lvY3RsKGRldiwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESV9ERVZJTkZPOgorCQlyYyA9IGRvX2RldmluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1NVQkRJTkZPOgorCQlyYyA9IGRvX3N1YmRpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DSEFOSU5GTzoKKwkJcmMgPSBkb19jaGFuaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfUkFOR0VJTkZPOgorCQlyYyA9IGRvX3JhbmdlaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQlVGSU5GTzoKKwkJcmMgPSBkb19idWZpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESV9MT0NLOgorCQlyYyA9IGRvX2xvY2tfaW9jdGwoZGV2LCBhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9VTkxPQ0s6CisJCXJjID0gZG9fdW5sb2NrX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQ0FOQ0VMOgorCQlyYyA9IGRvX2NhbmNlbF9pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NNRDoKKwkJcmMgPSBkb19jbWRfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NNRFRFU1Q6CisJCXJjID0gZG9fY21kdGVzdF9pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfSU5TTkxJU1Q6CisJCXJjID0gZG9faW5zbmxpc3RfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0lOU046CisJCXJjID0gZG9faW5zbl9pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfUE9MTDoKKwkJcmMgPSBkb19wb2xsX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisJQ09NRURJX0RFVkNPTkZJRworCWRldmljZSBjb25maWcgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBkZXZjb25maWcgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJZGV2Y29uZmlnIHN0cnVjdHVyZSBhdCBhcmcKKworCXdyaXRlczoKKwkJbm9uZQorKi8KK3N0YXRpYyBpbnQgZG9fZGV2Y29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqYXJnKQoreworCWNvbWVkaV9kZXZjb25maWcgaXQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyICphdXhfZGF0YSA9IE5VTEw7CisJaW50IGF1eF9sZW47CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoYXJnID09IE5VTEwpIHsKKwkJaWYgKGlzX2RldmljZV9idXN5KGRldikpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoZGV2LT5hdHRhY2hlZCkgeworCQkJc3RydWN0IG1vZHVsZSAqZHJpdmVyX21vZHVsZSA9IGRldi0+ZHJpdmVyLT5tb2R1bGU7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJbW9kdWxlX3B1dChkcml2ZXJfbW9kdWxlKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJml0LCBhcmcsIHNpemVvZihjb21lZGlfZGV2Y29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaXQuYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTiAtIDFdID0gMDsKKworCWlmIChjb21lZGlfYXV4X2RhdGEoaXQub3B0aW9ucywgMCkgJiYKKwkgICAgaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKSB7CisJCWludCBiaXRfc2hpZnQ7CisJCWF1eF9sZW4gPSBpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF07CisJCWlmIChhdXhfbGVuIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWF1eF9kYXRhID0gdm1hbGxvYyhhdXhfbGVuKTsKKwkJaWYgKCFhdXhfZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihhdXhfZGF0YSwKKwkJCQkgICBjb21lZGlfYXV4X2RhdGEoaXQub3B0aW9ucywgMCksIGF1eF9sZW4pKSB7CisJCQl2ZnJlZShhdXhfZGF0YSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXSA9CisJCSAgICAodW5zaWduZWQgbG9uZylhdXhfZGF0YTsKKwkJaWYgKHNpemVvZih2b2lkICopID4gc2l6ZW9mKGludCkpIHsKKwkJCWJpdF9zaGlmdCA9IHNpemVvZihpbnQpICogODsKKwkJCWl0Lm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEldID0KKwkJCSAgICAoKHVuc2lnbmVkIGxvbmcpYXV4X2RhdGEpID4+IGJpdF9zaGlmdDsKKwkJfSBlbHNlCisJCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXSA9IDA7CisJfQorCisJcmV0ID0gY29tZWRpX2RldmljZV9hdHRhY2goZGV2LCAmaXQpOworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZHJpdmVyLT5tb2R1bGUpKSB7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKwl9CisKKwlpZiAoYXV4X2RhdGEpCisJCXZmcmVlKGF1eF9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0JVRkNPTkZJRworCWJ1ZmZlciBjb25maWd1cmF0aW9uIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gYnVmY29uZmlnIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWJ1ZmNvbmZpZyBhdCBhcmcKKworCXdyaXRlczoKKwkJbW9kaWZpZWQgYnVmY29uZmlnIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19idWZjb25maWdfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpCit7CisJY29tZWRpX2J1ZmNvbmZpZyBiYzsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJjLCBhcmcsIHNpemVvZihjb21lZGlfYnVmY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJjLnN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcyB8fCBiYy5zdWJkZXZpY2UgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBiYy5zdWJkZXZpY2U7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmICghYXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgYXN5bmMgY2FwYWJpbGl0eVxuIik7CisJCWJjLnNpemUgPSAwOworCQliYy5tYXhpbXVtX3NpemUgPSAwOworCQlnb3RvIGNvcHliYWNrOworCX0KKworCWlmIChiYy5tYXhpbXVtX3NpemUpIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlhc3luYy0+bWF4X2J1ZnNpemUgPSBiYy5tYXhpbXVtX3NpemU7CisJfQorCisJaWYgKGJjLnNpemUpIHsKKwkJaWYgKGJjLnNpemUgPiBhc3luYy0+bWF4X2J1ZnNpemUpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChzLT5idXN5KSB7CisJCQlEUFJJTlRLKCJzdWJkZXZpY2UgaXMgYnVzeSwgY2Fubm90IHJlc2l6ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpZiAoYXN5bmMtPm1tYXBfY291bnQpIHsKKwkJCURQUklOVEsoInN1YmRldmljZSBpcyBtbWFwcGVkLCBjYW5ub3QgcmVzaXplIGJ1ZmZlclxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKCFhc3luYy0+cHJlYWxsb2NfYnVmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogbWFrZSBzdXJlIGJ1ZmZlciBpcyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgcGFnZXMKKwkJICogKHdlIHJvdW5kIHVwKSAqLworCQliYy5zaXplID0gKGJjLnNpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKworCQlyZXQgPSBjb21lZGlfYnVmX2FsbG9jKGRldiwgcywgYmMuc2l6ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAocy0+YnVmX2NoYW5nZSkgeworCQkJcmV0ID0gcy0+YnVmX2NoYW5nZShkZXYsIHMsIGJjLnNpemUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCURQUklOVEsoImNvbWVkaSVpIHN1YmQgJWQgYnVmZmVyIHJlc2l6ZWQgdG8gJWkgYnl0ZXNcbiIsCisJCQlkZXYtPm1pbm9yLCBiYy5zdWJkZXZpY2UsIGFzeW5jLT5wcmVhbGxvY19idWZzeik7CisJfQorCisJYmMuc2l6ZSA9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwliYy5tYXhpbXVtX3NpemUgPSBhc3luYy0+bWF4X2J1ZnNpemU7CisKK2NvcHliYWNrOgorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYmMsIHNpemVvZihjb21lZGlfYnVmY29uZmlnKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX0RFVklORk8KKwlkZXZpY2UgaW5mbyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGRldmluZm8gc3RydWN0dXJlCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlkZXZpbmZvIHN0cnVjdHVyZQorCisqLworc3RhdGljIGludCBkb19kZXZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmluZm8gKmFyZywKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb21lZGlfZGV2aW5mbyBkZXZpbmZvOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2ID0KKwkgICAgY29tZWRpX2dldF9yZWFkX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXYgPQorCSAgICBjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKworCW1lbXNldCgmZGV2aW5mbywgMCwgc2l6ZW9mKGRldmluZm8pKTsKKworCS8qIGZpbGwgZGV2aW5mbyBzdHJ1Y3R1cmUgKi8KKwlkZXZpbmZvLnZlcnNpb25fY29kZSA9IENPTUVESV9WRVJTSU9OX0NPREU7CisJZGV2aW5mby5uX3N1YmRldnMgPSBkZXYtPm5fc3ViZGV2aWNlczsKKwltZW1jcHkoZGV2aW5mby5kcml2ZXJfbmFtZSwgZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBDT01FRElfTkFNRUxFTik7CisJbWVtY3B5KGRldmluZm8uYm9hcmRfbmFtZSwgZGV2LT5ib2FyZF9uYW1lLCBDT01FRElfTkFNRUxFTik7CisKKwlpZiAocmVhZF9zdWJkZXYpCisJCWRldmluZm8ucmVhZF9zdWJkZXZpY2UgPSByZWFkX3N1YmRldiAtIGRldi0+c3ViZGV2aWNlczsKKwllbHNlCisJCWRldmluZm8ucmVhZF9zdWJkZXZpY2UgPSAtMTsKKworCWlmICh3cml0ZV9zdWJkZXYpCisJCWRldmluZm8ud3JpdGVfc3ViZGV2aWNlID0gd3JpdGVfc3ViZGV2IC0gZGV2LT5zdWJkZXZpY2VzOworCWVsc2UKKwkJZGV2aW5mby53cml0ZV9zdWJkZXZpY2UgPSAtMTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGV2aW5mbywgc2l6ZW9mKGNvbWVkaV9kZXZpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX1NVQkRJTkZPCisJc3ViZGV2aWNlIGluZm8gaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBhcnJheSBvZiBzdWJkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlhcnJheSBvZiBzdWJkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19zdWJkaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkaW5mbyAqYXJnLAorCQkJICAgICB2b2lkICpmaWxlKQoreworCWludCByZXQsIGk7CisJY29tZWRpX3N1YmRpbmZvICp0bXAsICp1czsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJdG1wID0ga2NhbGxvYyhkZXYtPm5fc3ViZGV2aWNlcywgc2l6ZW9mKGNvbWVkaV9zdWJkaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGZpbGwgc3ViZGluZm8gc3RydWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCQl1cyA9IHRtcCArIGk7CisKKwkJdXMtPnR5cGUgPSBzLT50eXBlOworCQl1cy0+bl9jaGFuID0gcy0+bl9jaGFuOworCQl1cy0+c3ViZF9mbGFncyA9IHMtPnN1YmRldl9mbGFnczsKKwkJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfUlVOTklORzsKKyNkZWZpbmUgVElNRVJfbmFub3NlYyA1CQkvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCQl1cy0+dGltZXJfdHlwZSA9IFRJTUVSX25hbm9zZWM7CisJCXVzLT5sZW5fY2hhbmxpc3QgPSBzLT5sZW5fY2hhbmxpc3Q7CisJCXVzLT5tYXhkYXRhID0gcy0+bWF4ZGF0YTsKKwkJaWYgKHMtPnJhbmdlX3RhYmxlKSB7CisJCQl1cy0+cmFuZ2VfdHlwZSA9CisJCQkgICAgKGkgPDwgMjQpIHwgKDAgPDwgMTYpIHwgKHMtPnJhbmdlX3RhYmxlLT5sZW5ndGgpOworCQl9IGVsc2UgeworCQkJdXMtPnJhbmdlX3R5cGUgPSAwOwkvKiBYWFggKi8KKwkJfQorCQl1cy0+ZmxhZ3MgPSBzLT5mbGFnczsKKworCQlpZiAocy0+YnVzeSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9CVVNZOworCQlpZiAocy0+YnVzeSA9PSBmaWxlKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0JVU1lfT1dORVI7CisJCWlmIChzLT5sb2NrKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0xPQ0tFRDsKKwkJaWYgKHMtPmxvY2sgPT0gZmlsZSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9MT0NLX09XTkVSOworCQlpZiAoIXMtPm1heGRhdGEgJiYgcy0+bWF4ZGF0YV9saXN0KQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX01BWERBVEE7CisJCWlmIChzLT5mbGFnbGlzdCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9GTEFHUzsKKwkJaWYgKHMtPnJhbmdlX3RhYmxlX2xpc3QpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfUkFOR0VUWVBFOworCQlpZiAocy0+ZG9fY21kKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX0NNRDsKKworCQlpZiAocy0+aW5zbl9iaXRzICE9ICZpbnNuX2ludmFsKQorCQkJdXMtPmluc25fYml0c19zdXBwb3J0ID0gQ09NRURJX1NVUFBPUlRFRDsKKwkJZWxzZQorCQkJdXMtPmluc25fYml0c19zdXBwb3J0ID0gQ09NRURJX1VOU1VQUE9SVEVEOworCisJCXVzLT5zZXR0bGluZ190aW1lXzAgPSBzLT5zZXR0bGluZ190aW1lXzA7CisJfQorCisJcmV0ID0gY29weV90b191c2VyKGFyZywgdG1wLAorCQkJICAgZGV2LT5uX3N1YmRldmljZXMgKiBzaXplb2YoY29tZWRpX3N1YmRpbmZvKSk7CisKKwlrZnJlZSh0bXApOworCisJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCisvKgorCUNPTUVESV9DSEFOSU5GTworCXN1YmRldmljZSBpbmZvIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gY2hhbmluZm8gc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY2hhbmluZm8gc3RydWN0dXJlIGF0IGFyZworCisJd3JpdGVzOgorCQlhcnJheXMgYXQgZWxlbWVudHMgb2YgY2hhbmluZm8gc3RydWN0dXJlCisKKyovCitzdGF0aWMgaW50IGRvX2NoYW5pbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2NoYW5pbmZvICphcmcpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfY2hhbmluZm8gaXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJml0LCBhcmcsIHNpemVvZihjb21lZGlfY2hhbmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaXQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgaXQuc3ViZGV2OworCisJaWYgKGl0Lm1heGRhdGFfbGlzdCkgeworCQlpZiAocy0+bWF4ZGF0YSB8fCAhcy0+bWF4ZGF0YV9saXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIoaXQubWF4ZGF0YV9saXN0LCBzLT5tYXhkYXRhX2xpc3QsCisJCQkJIHMtPm5fY2hhbiAqIHNpemVvZihsc2FtcGxfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGl0LmZsYWdsaXN0KSB7CisJCWlmICghcy0+ZmxhZ2xpc3QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfdG9fdXNlcihpdC5mbGFnbGlzdCwgcy0+ZmxhZ2xpc3QsCisJCQkJIHMtPm5fY2hhbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChpdC5yYW5nZWxpc3QpIHsKKwkJaW50IGk7CisKKwkJaWYgKCFzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZvciAoaSA9IDA7IGkgPCBzLT5uX2NoYW47IGkrKykgeworCQkJaW50IHg7CisKKwkJCXggPSAoZGV2LT5taW5vciA8PCAyOCkgfCAoaXQuc3ViZGV2IDw8IDI0KSB8IChpIDw8IDE2KSB8CisJCQkgICAgKHMtPnJhbmdlX3RhYmxlX2xpc3RbaV0tPmxlbmd0aCk7CisJCQlwdXRfdXNlcih4LCBpdC5yYW5nZWxpc3QgKyBpKTsKKwkJfQorI2lmIDAKKwkJaWYgKGNvcHlfdG9fdXNlcihpdC5yYW5nZWxpc3QsIHMtPnJhbmdlX3R5cGVfbGlzdCwKKwkJCQkgcy0+bl9jaGFuKnNpemVvZih1bnNpZ25lZCBpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKKyAvKgorICAgIENPTUVESV9CVUZJTkZPCisgICAgYnVmZmVyIGluZm9ybWF0aW9uIGlvY3RsCisKKyAgICBhcmc6CisgICAgcG9pbnRlciB0byBidWZpbmZvIHN0cnVjdHVyZQorCisgICAgcmVhZHM6CisgICAgYnVmaW5mbyBhdCBhcmcKKworICAgIHdyaXRlczoKKyAgICBtb2RpZmllZCBidWZpbmZvIGF0IGFyZworCisgICovCitzdGF0aWMgaW50IGRvX2J1ZmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcpCit7CisJY29tZWRpX2J1ZmluZm8gYmk7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgYXJnLCBzaXplb2YoY29tZWRpX2J1ZmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoYmkuc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzIHx8IGJpLnN1YmRldmljZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGJpLnN1YmRldmljZTsKKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKCFhc3luYykgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhc3luYyBjYXBhYmlsaXR5XG4iKTsKKwkJYmkuYnVmX3dyaXRlX3B0ciA9IDA7CisJCWJpLmJ1Zl9yZWFkX3B0ciA9IDA7CisJCWJpLmJ1Zl93cml0ZV9jb3VudCA9IDA7CisJCWJpLmJ1Zl9yZWFkX2NvdW50ID0gMDsKKwkJZ290byBjb3B5YmFjazsKKwl9CisKKwlpZiAoYmkuYnl0ZXNfcmVhZCAmJiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKSkgeworCQliaS5ieXRlc19yZWFkID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBiaS5ieXRlc19yZWFkKTsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIGJpLmJ5dGVzX3JlYWQpOworCisJCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgKFNSRl9FUlJPUiB8CisJCQkJCQkJICBTUkZfUlVOTklORykpCisJCSAgICAmJiBhc3luYy0+YnVmX3dyaXRlX2NvdW50ID09IGFzeW5jLT5idWZfcmVhZF9jb3VudCkgeworCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJfQorCX0KKworCWlmIChiaS5ieXRlc193cml0dGVuICYmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSkgeworCQliaS5ieXRlc193cml0dGVuID0KKwkJICAgIGNvbWVkaV9idWZfd3JpdGVfYWxsb2MoYXN5bmMsIGJpLmJ5dGVzX3dyaXR0ZW4pOworCQljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGJpLmJ5dGVzX3dyaXR0ZW4pOworCX0KKworCWJpLmJ1Zl93cml0ZV9jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CisJYmkuYnVmX3dyaXRlX3B0ciA9IGFzeW5jLT5idWZfd3JpdGVfcHRyOworCWJpLmJ1Zl9yZWFkX2NvdW50ID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWJpLmJ1Zl9yZWFkX3B0ciA9IGFzeW5jLT5idWZfcmVhZF9wdHI7CisKK2NvcHliYWNrOgorCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYmksIHNpemVvZihjb21lZGlfYnVmaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEsCisJCSAgICAgIHZvaWQgKmZpbGUpOworLyoKKyAqIAlDT01FRElfSU5TTkxJU1QKKyAqIAlzeW5jaHJvbm91cyBpbnN0cnVjdGlvbnMKKyAqCisgKiAJYXJnOgorICogCQlwb2ludGVyIHRvIHN5bmMgY21kIHN0cnVjdHVyZQorICoKKyAqIAlyZWFkczoKKyAqIAkJc3luYyBjbWQgc3RydWN0IGF0IGFyZworICogCQlpbnN0cnVjdGlvbiBsaXN0CisgKiAJCWRhdGEgKGZvciB3cml0ZXMpCisgKgorICogCXdyaXRlczoKKyAqIAkJZGF0YSAoZm9yIHJlYWRzKQorICovCisvKiBhcmJpdHJhcnkgbGltaXRzICovCisjZGVmaW5lIE1BWF9TQU1QTEVTIDI1Ngorc3RhdGljIGludCBkb19pbnNubGlzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfaW5zbmxpc3QgaW5zbmxpc3Q7CisJY29tZWRpX2luc24gKmluc25zID0gTlVMTDsKKwlsc2FtcGxfdCAqZGF0YSA9IE5VTEw7CisJaW50IGkgPSAwOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnNubGlzdCwgYXJnLCBzaXplb2YoY29tZWRpX2luc25saXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKGxzYW1wbF90KSAqIE1BWF9TQU1QTEVTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJRFBSSU5USygia21hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWluc25zID0ga21hbGxvYyhzaXplb2YoY29tZWRpX2luc24pICogaW5zbmxpc3Qubl9pbnNucywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnNucykgeworCQlEUFJJTlRLKCJrbWFsbG9jIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGluc25zLCBpbnNubGlzdC5pbnNucywKKwkJCSAgIHNpemVvZihjb21lZGlfaW5zbikgKiBpbnNubGlzdC5uX2luc25zKSkgeworCQlEUFJJTlRLKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnNubGlzdC5uX2luc25zOyBpKyspIHsKKwkJaWYgKGluc25zW2ldLm4gPiBNQVhfU0FNUExFUykgeworCQkJRFBSSU5USygibnVtYmVyIG9mIHNhbXBsZXMgdG9vIGxhcmdlXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChpbnNuc1tpXS5pbnNuICYgSU5TTl9NQVNLX1dSSVRFKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgaW5zbnNbaV0uZGF0YSwKKwkJCQkJICAgaW5zbnNbaV0ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQkJRFBSSU5USygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJcmV0ID0gcGFyc2VfaW5zbihkZXYsIGluc25zICsgaSwgZGF0YSwgZmlsZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKGluc25zW2ldLmluc24gJiBJTlNOX01BU0tfUkVBRCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihpbnNuc1tpXS5kYXRhLCBkYXRhLAorCQkJCQkgaW5zbnNbaV0ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQkJRFBSSU5USygiY29weV90b191c2VyIGZhaWxlZFxuIik7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCXNjaGVkdWxlKCk7CisJfQorCitlcnJvcjoKKwlrZnJlZShpbnNucyk7CisJa2ZyZWUoZGF0YSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBjaGVja19pbnNuX2NvbmZpZ19sZW5ndGgoY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChpbnNuLT5uIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fSU5QVVQ6CisJY2FzZSBJTlNOX0NPTkZJR19ESVNBUk06CisJY2FzZSBJTlNOX0NPTkZJR19SRVNFVDoKKwkJaWYgKGluc24tPm4gPT0gMSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0FSTToKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwljYXNlIElOU05fQ09ORklHX0JMT0NLX1NJWkU6CisJY2FzZSBJTlNOX0NPTkZJR19GSUxURVI6CisJY2FzZSBJTlNOX0NPTkZJR19TRVJJQUxfQ0xPQ0s6CisJY2FzZSBJTlNOX0NPTkZJR19CSURJUkVDVElPTkFMX0RBVEE6CisJY2FzZSBJTlNOX0NPTkZJR19BTFRfU09VUkNFOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERToKKwljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfUk9VVElORzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9ST1VUSU5HOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVM6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX1BFUklPRDoKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EOgorCQlpZiAoaW5zbi0+biA9PSAyKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0dBVEVfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9DTE9DS19TUkM6CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0NPVU5URVJfU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9IX0JSSURHRToKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfSF9CUklER0U6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfSEFSRFdBUkVfQlVGRkVSX1NJWkU6CisJCWlmIChpbnNuLT5uID09IDMpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fT1VUUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfQU5BTE9HX1RSSUc6CisJCWlmIChpbnNuLT5uID09IDUpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJLyogYnkgZGVmYXVsdCB3ZSBhbGxvdyB0aGUgaW5zbiBzaW5jZSB3ZSBkb24ndCBoYXZlIGNoZWNrcyBmb3IKKwkgKiBhbGwgcG9zc2libGUgY2FzZXMgeWV0ICovCisJZGVmYXVsdDoKKwkJcnRfcHJpbnRrKCJjb21lZGk6IG5vIGNoZWNrIGZvciBkYXRhIGxlbmd0aCBvZiBjb25maWcgaW5zbiBpZCAiCisJCQkgICIlaSBpcyBpbXBsZW1lbnRlZC5cbiIKKwkJCSAgIiBBZGQgYSBjaGVjayB0byAlcyBpbiAlcy5cbiIKKwkJCSAgIiBBc3N1bWluZyBuPSVpIGlzIGNvcnJlY3QuXG4iLCBkYXRhWzBdLCBfX2Z1bmNfXywKKwkJCSAgX19GSUxFX18sIGluc24tPm4pOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBhcnNlX2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEsCisJCSAgICAgIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCWlmIChpbnNuLT5pbnNuICYgSU5TTl9NQVNLX1NQRUNJQUwpIHsKKwkJLyogYSBub24tc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9HVE9EOgorCQkJeworCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCisJCQkJaWYgKGluc24tPm4gIT0gMikgeworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCQlkYXRhWzBdID0gdHYudHZfc2VjOworCQkJCWRhdGFbMV0gPSB0di50dl91c2VjOworCQkJCXJldCA9IDI7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBJTlNOX1dBSVQ6CisJCQlpZiAoaW5zbi0+biAhPSAxIHx8IGRhdGFbMF0gPj0gMTAwMDAwKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheShkYXRhWzBdIC8gMTAwMCk7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9JTlRUUklHOgorCQkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5zbi0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCQkJRFBSSU5USygiJWQgbm90IHVzYWJsZSBzdWJkZXZpY2VcbiIsCisJCQkJCWluc24tPnN1YmRldik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpbnNuLT5zdWJkZXY7CisJCQlpZiAoIXMtPmFzeW5jKSB7CisJCQkJRFBSSU5USygibm8gYXN5bmNcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXMtPmFzeW5jLT5pbnR0cmlnKSB7CisJCQkJRFBSSU5USygibm8gaW50dHJpZ1xuIik7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHMtPmFzeW5jLT5pbnR0cmlnKGRldiwgcywgaW5zbi0+ZGF0YVswXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiaW52YWxpZCBpbnNuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGEgc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisJCWxzYW1wbF90IG1heGRhdGE7CisKKwkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJRFBSSU5USygic3ViZGV2aWNlICVkIG91dCBvZiByYW5nZVxuIiwgaW5zbi0+c3ViZGV2KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCisJCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQkJRFBSSU5USygiJWQgbm90IHVzYWJsZSBzdWJkZXZpY2VcbiIsIGluc24tPnN1YmRldik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwkJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBmaWxlKSB7CisJCQlEUFJJTlRLKCJkZXZpY2UgbG9ja2VkXG4iKTsKKwkJCXJldCA9IC1FQUNDRVM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIDEsICZpbnNuLT5jaGFuc3BlYyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJRFBSSU5USygiYmFkIGNoYW5zcGVjXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHMtPmJ1c3kpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIFRoaXMgbG9va3MgYXJiaXRyYXJ5LiAgSXQgaXMuICovCisJCXMtPmJ1c3kgPSAmcGFyc2VfaW5zbjsKKwkJc3dpdGNoIChpbnNuLT5pbnNuKSB7CisJCWNhc2UgSU5TTl9SRUFEOgorCQkJcmV0ID0gcy0+aW5zbl9yZWFkKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX1dSSVRFOgorCQkJbWF4ZGF0YSA9IHMtPm1heGRhdGFfbGlzdAorCQkJICAgID8gcy0+bWF4ZGF0YV9saXN0W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXQorCQkJICAgIDogcy0+bWF4ZGF0YTsKKwkJCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyArK2kpIHsKKwkJCQlpZiAoZGF0YVtpXSA+IG1heGRhdGEpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJRFBSSU5USygiYmFkIGRhdGEgdmFsdWUocylcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAocmV0ID09IDApCisJCQkJcmV0ID0gcy0+aW5zbl93cml0ZShkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9CSVRTOgorCQkJaWYgKGluc24tPm4gIT0gMikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCBpbnNuLCBkYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQ09ORklHOgorCQkJcmV0ID0gY2hlY2tfaW5zbl9jb25maWdfbGVuZ3RoKGluc24sIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJldCA9IHMtPmluc25fY29uZmlnKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXMtPmJ1c3kgPSBOVUxMOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAJQ09NRURJX0lOU04KKyAqIAlzeW5jaHJvbm91cyBpbnN0cnVjdGlvbnMKKyAqCisgKiAJYXJnOgorICogCQlwb2ludGVyIHRvIGluc24KKyAqCisgKiAJcmVhZHM6CisgKiAJCWNvbWVkaV9pbnNuIHN0cnVjdCBhdCBhcmcKKyAqIAkJZGF0YSAoZm9yIHdyaXRlcykKKyAqCisgKiAJd3JpdGVzOgorICogCQlkYXRhIChmb3IgcmVhZHMpCisgKi8KK3N0YXRpYyBpbnQgZG9faW5zbl9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCWxzYW1wbF90ICpkYXRhID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihsc2FtcGxfdCkgKiBNQVhfU0FNUExFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnNuLCBhcmcsIHNpemVvZihjb21lZGlfaW5zbikpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogVGhpcyBpcyB3aGVyZSB0aGUgYmVoYXZpb3Igb2YgaW5zbiBhbmQgaW5zbmxpc3QgZGV2aWF0ZS4gKi8KKwlpZiAoaW5zbi5uID4gTUFYX1NBTVBMRVMpCisJCWluc24ubiA9IE1BWF9TQU1QTEVTOworCWlmIChpbnNuLmluc24gJiBJTlNOX01BU0tfV1JJVEUpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGluc24uZGF0YSwgaW5zbi5uICogc2l6ZW9mKGxzYW1wbF90KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXJldCA9IHBhcnNlX2luc24oZGV2LCAmaW5zbiwgZGF0YSwgZmlsZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGluc24uaW5zbiAmIElOU05fTUFTS19SRUFEKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoaW5zbi5kYXRhLCBkYXRhLCBpbnNuLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJcmV0ID0gaW5zbi5uOworCitlcnJvcjoKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0NNRAorCWNvbW1hbmQgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBjbWQgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY21kIHN0cnVjdHVyZSBhdCBhcmcKKwkJY2hhbm5lbC9yYW5nZSBsaXN0CisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisKKyovCitzdGF0aWMgaW50IGRvX2NtZF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfY21kIHVzZXJfY21kOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0X3NhdmVyID0gTlVMTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcl9jbWQsIGFyZywgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQlEUFJJTlRLKCJiYWQgY21kIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLyogc2F2ZSB1c2VyJ3MgY2hhbmxpc3QgcG9pbnRlciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIgKi8KKwljaGFubGlzdF9zYXZlciA9IHVzZXJfY21kLmNoYW5saXN0OworCisJaWYgKHVzZXJfY21kLnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQlEUFJJTlRLKCIlZCBubyBzdWNoIHN1YmRldmljZVxuIiwgdXNlcl9jbWQuc3ViZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIHVzZXJfY21kLnN1YmRldjsKKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCURQUklOVEsoIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0IHx8ICFzLT5hc3luYykgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwKKwkJCXVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgbG9ja2VkXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJLyogYXJlIHdlIGJ1c3k/ICovCisJaWYgKHMtPmJ1c3kpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzLT5idXN5ID0gZmlsZTsKKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJXUgPiAlZFxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbiwgcy0+bGVuX2NoYW5saXN0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gc2hvcnQgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3RfbGVuIDwgMSkgeworCQlEUFJJTlRLKCJjaGFubmVsL2dhaW4gbGlzdCB0b28gc2hvcnQgJXUgPCAxXG4iLAorCQkJdXNlcl9jbWQuY2hhbmxpc3RfbGVuKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWtmcmVlKGFzeW5jLT5jbWQuY2hhbmxpc3QpOworCWFzeW5jLT5jbWQgPSB1c2VyX2NtZDsKKwlhc3luYy0+Y21kLmRhdGEgPSBOVUxMOworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlhc3luYy0+Y21kLmNoYW5saXN0ID0KKwkgICAga21hbGxvYyhhc3luYy0+Y21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzeW5jLT5jbWQuY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGFzeW5jLT5jbWQuY2hhbmxpc3QsIHVzZXJfY21kLmNoYW5saXN0LAorCQkJICAgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSkpIHsKKwkJRFBSSU5USygiZmF1bHQgcmVhZGluZyBjaGFubGlzdFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgZWFjaCBlbGVtZW50IGluIGNoYW5uZWwvZ2FpbiBsaXN0IGlzIHZhbGlkICovCisJcmV0ID0gY2hlY2tfY2hhbmxpc3QocywgYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4sIGFzeW5jLT5jbWQuY2hhbmxpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCURQUklOVEsoImJhZCBjaGFubGlzdFxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXQgPSBzLT5kb19jbWR0ZXN0KGRldiwgcywgJmFzeW5jLT5jbWQpOworCisJaWYgKGFzeW5jLT5jbWQuZmxhZ3MgJiBUUklHX0JPR1VTIHx8IHJldCkgeworCQlEUFJJTlRLKCJ0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOworCQl1c2VyX2NtZCA9IGFzeW5jLT5jbWQ7CisJCS8qIHJlc3RvcmUgY2hhbmxpc3QgcG9pbnRlciBiZWZvcmUgY29weWluZyBiYWNrICovCisJCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Rfc2F2ZXI7CisJCXVzZXJfY21kLmRhdGEgPSBOVUxMOworCQlpZiAoY29weV90b191c2VyKGFyZywgJnVzZXJfY21kLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCQlEUFJJTlRLKCJmYXVsdCB3cml0aW5nIGNtZFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlpZiAoIWFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlyZXQgPSAtRU5PTUVNOworCQlEUFJJTlRLKCJubyBidWZmZXIgKD8pXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWNvbWVkaV9yZXNldF9hc3luY19idWYoYXN5bmMpOworCisJYXN5bmMtPmNiX21hc2sgPQorCSAgICBDT01FRElfQ0JfRU9BIHwgQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VSUk9SIHwKKwkgICAgQ09NRURJX0NCX09WRVJGTE9XOworCWlmIChhc3luYy0+Y21kLmZsYWdzICYgVFJJR19XQUtFX0VPUykKKwkJYXN5bmMtPmNiX21hc2sgfD0gQ09NRURJX0NCX0VPUzsKKworCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIH4wLCBTUkZfVVNFUiB8IFNSRl9SVU5OSU5HKTsKKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoYXN5bmMtPmNtZC5mbGFncyAmIFRSSUdfUlQpIHsKKwkJaWYgKGNvbWVkaV9zd2l0Y2hfdG9fcnQoZGV2KSA9PSAwKQorCQkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JULCBTUkZfUlQpOworCX0KKyNlbmRpZgorCisJcmV0ID0gcy0+ZG9fY21kKGRldiwgcyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKwlDT01FRElfQ01EVEVTVAorCWNvbW1hbmQgdGVzdGluZyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGNtZCBzdHJ1Y3R1cmUKKworCXJlYWRzOgorCQljbWQgc3RydWN0dXJlIGF0IGFyZworCQljaGFubmVsL3JhbmdlIGxpc3QKKworCXdyaXRlczoKKwkJbW9kaWZpZWQgY21kIHN0cnVjdHVyZSBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fY21kdGVzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfY21kIHVzZXJfY21kOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdF9zYXZlciA9IE5VTEw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfY21kLCBhcmcsIHNpemVvZihjb21lZGlfY21kKSkpIHsKKwkJRFBSSU5USygiYmFkIGNtZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIHNhdmUgdXNlcidzIGNoYW5saXN0IHBvaW50ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyICovCisJY2hhbmxpc3Rfc2F2ZXIgPSB1c2VyX2NtZC5jaGFubGlzdDsKKworCWlmICh1c2VyX2NtZC5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJRFBSSU5USygiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyB1c2VyX2NtZC5zdWJkZXY7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCURQUklOVEsoIiVkIG5vdCB2YWxpZCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcy0+ZG9fY21kIHx8ICFzLT5kb19jbWR0ZXN0KSB7CisJCURQUklOVEsoInN1YmRldmljZSAlaSBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRzXG4iLAorCQkJdXNlcl9jbWQuc3ViZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbWFrZSBzdXJlIGNoYW5uZWwvZ2FpbiBsaXN0IGlzbid0IHRvbyBsb25nICovCisJaWYgKHVzZXJfY21kLmNoYW5saXN0X2xlbiA+IHMtPmxlbl9jaGFubGlzdCkgeworCQlEUFJJTlRLKCJjaGFubmVsL2dhaW4gbGlzdCB0b28gbG9uZyAlZCA+ICVkXG4iLAorCQkJdXNlcl9jbWQuY2hhbmxpc3RfbGVuLCBzLT5sZW5fY2hhbmxpc3QpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbG9hZCBjaGFubmVsL2dhaW4gbGlzdCAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdCkgeworCQljaGFubGlzdCA9CisJCSAgICBrbWFsbG9jKHVzZXJfY21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGFubGlzdCkgeworCQkJRFBSSU5USygiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihjaGFubGlzdCwgdXNlcl9jbWQuY2hhbmxpc3QsCisJCQkJICAgdXNlcl9jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpKSB7CisJCQlEUFJJTlRLKCJmYXVsdCByZWFkaW5nIGNoYW5saXN0XG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBtYWtlIHN1cmUgZWFjaCBlbGVtZW50IGluIGNoYW5uZWwvZ2FpbiBsaXN0IGlzIHZhbGlkICovCisJCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIHVzZXJfY21kLmNoYW5saXN0X2xlbiwgY2hhbmxpc3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJRFBSSU5USygiYmFkIGNoYW5saXN0XG4iKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Q7CisJfQorCisJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZ1c2VyX2NtZCk7CisKKwkvKiByZXN0b3JlIGNoYW5saXN0IHBvaW50ZXIgYmVmb3JlIGNvcHlpbmcgYmFjayAqLworCXVzZXJfY21kLmNoYW5saXN0ID0gY2hhbmxpc3Rfc2F2ZXI7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJnVzZXJfY21kLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCURQUklOVEsoImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CitjbGVhbnVwOgorCWtmcmVlKGNoYW5saXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0xPQ0sKKwlsb2NrIHN1YmRldmljZQorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm9uZQorCisJd3JpdGVzOgorCQlub25lCisKKyovCisKK3N0YXRpYyBpbnQgZG9fbG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisJaWYgKHMtPmJ1c3kgfHwgcy0+bG9jaykKKwkJcmV0ID0gLUVCVVNZOworCWVsc2UKKwkJcy0+bG9jayA9IGZpbGU7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKyNpZiAwCisJaWYgKHMtPmxvY2tfZikKKwkJcmV0ID0gcy0+bG9ja19mKGRldiwgcyk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX1VOTE9DSworCXVubG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisJVGhpcyBmdW5jdGlvbiBpc24ndCBwcm90ZWN0ZWQgYnkgdGhlIHNlbWFwaG9yZSwgc2luY2UKKwl3ZSBhbHJlYWR5IG93biB0aGUgbG9jay4KKyovCitzdGF0aWMgaW50IGRvX3VubG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwlpZiAocy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAocy0+bG9jayA9PSBmaWxlKSB7CisjaWYgMAorCQlpZiAocy0+dW5sb2NrKQorCQkJcy0+dW5sb2NrKGRldiwgcyk7CisjZW5kaWYKKworCQlzLT5sb2NrID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKwlDT01FRElfQ0FOQ0VMCisJY2FuY2VsIGFjcXVpc2l0aW9uIGlvY3RsCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub3RoaW5nCisKKwl3cml0ZXM6CisJCW5vdGhpbmcKKworKi8KK3N0YXRpYyBpbnQgZG9fY2FuY2VsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKwlpZiAocy0+YXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gMDsKKworCWlmIChzLT5idXN5ICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gZG9fY2FuY2VsKGRldiwgcyk7Cit9CisKKy8qCisJQ09NRURJX1BPTEwgaW9jdGwKKwlpbnN0cnVjdHMgZHJpdmVyIHRvIHN5bmNocm9uaXplIGJ1ZmZlcnMKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vdGhpbmcKKworCXdyaXRlczoKKwkJbm90aGluZworCisqLworc3RhdGljIGludCBkb19wb2xsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGFyZzsKKworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoIXMtPmJ1c3kpCisJCXJldHVybiAwOworCisJaWYgKHMtPmJ1c3kgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzLT5wb2xsKQorCQlyZXR1cm4gcy0+cG9sbChkZXYsIHMpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykgJiYgcy0+Y2FuY2VsKQorCQlyZXQgPSBzLT5jYW5jZWwoZGV2LCBzKTsKKworCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNvbWVkaV91bm1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCit7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwljb21lZGlfZGV2aWNlICpkZXY7CisKKwlhc3luYyA9IGFyZWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlkZXYgPSBhc3luYy0+c3ViZGV2aWNlLT5kZXZpY2U7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwlhc3luYy0+bW1hcF9jb3VudC0tOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgY29tZWRpX3ZtX29wcyA9IHsKKwkuY2xvc2UgPQljb21lZGlfdW5tYXAsCit9OworCitzdGF0aWMgaW50IGNvbWVkaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBuX3BhZ2VzOworCWludCBpOworCWludCByZXR2YWw7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkKKwkJcyA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWVsc2UKKwkJcyA9IGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisKKwlpZiAocyA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlEUFJJTlRLKCJjb21lZGk6IG1tYXAoKSBvZmZzZXQgbXVzdCBiZSAwLlxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHNpemUgJiAoflBBR0VfTUFTSykpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCW5fcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7ICsraSkgeworCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsCisJCQkJICAgIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQkJICAgICBidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCSAgICAgdmlydF9hZGRyKSksCisJCQkJICAgIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBkb25lOworCQl9CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKKwl9CisKKwl2bWEtPnZtX29wcyA9ICZjb21lZGlfdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gYXN5bmM7CisKKwlhc3luYy0+bW1hcF9jb3VudCsrOworCisJcmV0dmFsID0gMDsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvbWVkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqcmVhZF9zdWJkZXY7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2OworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCURQUklOVEsoIm5vIGRyaXZlciBjb25maWd1cmVkIG9uIGNvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWFzayA9IDA7CisJcmVhZF9zdWJkZXYgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChyZWFkX3N1YmRldikgeworCQlwb2xsX3dhaXQoZmlsZSwgJnJlYWRfc3ViZGV2LT5hc3luYy0+d2FpdF9oZWFkLCB3YWl0KTsKKwkJaWYgKCFyZWFkX3N1YmRldi0+YnVzeQorCQkgICAgfHwgY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKHJlYWRfc3ViZGV2LT5hc3luYykgPiAwCisJCSAgICB8fCAhKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHJlYWRfc3ViZGV2KSAmCisJCQkgU1JGX1JVTk5JTkcpKSB7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJd3JpdGVfc3ViZGV2ID0gY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHdyaXRlX3N1YmRldikgeworCQlwb2xsX3dhaXQoZmlsZSwgJndyaXRlX3N1YmRldi0+YXN5bmMtPndhaXRfaGVhZCwgd2FpdCk7CisJCWNvbWVkaV9idWZfd3JpdGVfYWxsb2Mod3JpdGVfc3ViZGV2LT5hc3luYywKKwkJCQkgICAgICAgd3JpdGVfc3ViZGV2LT5hc3luYy0+cHJlYWxsb2NfYnVmc3opOworCQlpZiAoIXdyaXRlX3N1YmRldi0+YnVzeQorCQkgICAgfHwgIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyh3cml0ZV9zdWJkZXYpICYKKwkJCSBTUkZfUlVOTklORykKKwkJICAgIHx8IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQod3JpdGVfc3ViZGV2LT5hc3luYykgPj0KKwkJICAgIGJ5dGVzX3Blcl9zYW1wbGUod3JpdGVfc3ViZGV2LT5hc3luYy0+c3ViZGV2aWNlKSkgeworCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbWVkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkJICAgIGxvZmZfdCAqb2Zmc2V0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwlpbnQgbiwgbSwgY291bnQgPSAwLCByZXR2YWwgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzID0gY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisKKwlpZiAoIW5ieXRlcykgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCWlmICghcy0+YnVzeSkgeworCQlyZXR2YWwgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzLT5idXN5ICE9IGZpbGUpIHsKKwkJcmV0dmFsID0gLUVBQ0NFUzsKKwkJZ290byBkb25lOworCX0KKwlhZGRfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCXdoaWxlIChuYnl0ZXMgPiAwICYmICFyZXR2YWwpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQluID0gbmJ5dGVzOworCisJCW0gPSBuOworCQlpZiAoYXN5bmMtPmJ1Zl93cml0ZV9wdHIgKyBtID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQkJbSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIGFzeW5jLT5idWZfd3JpdGVfcHRyOworCQljb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCQlpZiAobSA+IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQoYXN5bmMpKQorCQkJbSA9IGNvbWVkaV9idWZfd3JpdGVfbl9hbGxvY2F0ZWQoYXN5bmMpOworCQlpZiAobSA8IG4pCisJCQluID0gbTsKKworCQlpZiAobiA9PSAwKSB7CisJCQlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKSkgeworCQkJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmCisJCQkJICAgIFNSRl9FUlJPUikgeworCQkJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQl9CisJCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKCFzLT5idXN5KQorCQkJCWJyZWFrOworCQkJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQkJCXJldHZhbCA9IC1FQUNDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCW0gPSBjb3B5X2Zyb21fdXNlcihhc3luYy0+cHJlYWxsb2NfYnVmICsgYXN5bmMtPmJ1Zl93cml0ZV9wdHIsCisJCQkJICAgYnVmLCBuKTsKKwkJaWYgKG0pIHsKKwkJCW4gLT0gbTsKKwkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCX0KKwkJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBuKTsKKworCQljb3VudCArPSBuOworCQluYnl0ZXMgLT0gbjsKKworCQlidWYgKz0gbjsKKwkJYnJlYWs7CQkvKiBtYWtlcyBkZXZpY2Ugd29yayBsaWtlIGEgcGlwZSAqLworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luYy0+d2FpdF9oZWFkLCAmd2FpdCk7CisKK2RvbmU6CisJcmV0dXJuIGNvdW50ID8gY291bnQgOiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbWVkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCQkgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJcyA9IGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKCFuYnl0ZXMpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIXMtPmJ1c3kpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZGRfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCXdoaWxlIChuYnl0ZXMgPiAwICYmICFyZXR2YWwpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQluID0gbmJ5dGVzOworCisJCW0gPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoYXN5bmMpOworCQkvKiBwcmludGsoIiVkIGF2YWlsYWJsZVxuIixtKTsgKi8KKwkJaWYgKGFzeW5jLT5idWZfcmVhZF9wdHIgKyBtID4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6KQorCQkJbSA9IGFzeW5jLT5wcmVhbGxvY19idWZzeiAtIGFzeW5jLT5idWZfcmVhZF9wdHI7CisJCS8qIHByaW50aygiJWQgY29udGlndW91c1xuIixtKTsgKi8KKwkJaWYgKG0gPCBuKQorCQkJbiA9IG07CisKKwkJaWYgKG4gPT0gMCkgeworCQkJaWYgKCEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykpIHsKKwkJCQlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCQkJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmCisJCQkJICAgIFNSRl9FUlJPUikgeworCQkJCQlyZXR2YWwgPSAtRVBJUEU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmICghcy0+YnVzeSkgeworCQkJCXJldHZhbCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCQkJcmV0dmFsID0gLUVBQ0NFUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCW0gPSBjb3B5X3RvX3VzZXIoYnVmLCBhc3luYy0+cHJlYWxsb2NfYnVmICsKKwkJCQkgYXN5bmMtPmJ1Zl9yZWFkX3B0ciwgbik7CisJCWlmIChtKSB7CisJCQluIC09IG07CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQl9CisKKwkJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBuKTsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG4pOworCisJCWNvdW50ICs9IG47CisJCW5ieXRlcyAtPSBuOworCisJCWJ1ZiArPSBuOworCQlicmVhazsJCS8qIG1ha2VzIGRldmljZSB3b3JrIGxpa2UgYSBwaXBlICovCisJfQorCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgKFNSRl9FUlJPUiB8IFNSRl9SVU5OSU5HKSkgJiYKKwkgICAgYXN5bmMtPmJ1Zl9yZWFkX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA9PSAwKSB7CisJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKworZG9uZToKKwlyZXR1cm4gY291bnQgPyBjb3VudCA6IHJldHZhbDsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgYSBzdWJkZXZpY2UgdG8gYW4gaWRsZSBzdGF0ZS4KKyAqLwordm9pZCBkb19iZWNvbWVfbm9uYnVzeShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCisJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JVTk5JTkcsIDApOworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlQpIHsKKwkJY29tZWRpX3N3aXRjaF90b19ub25fcnQoZGV2KTsKKwkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JULCAwKTsKKwl9CisjZW5kaWYKKwlpZiAoYXN5bmMpIHsKKwkJY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zihhc3luYyk7CisJCWFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJCVUc6ICg/KSBkb19iZWNvbWVfbm9uYnVzeSBjYWxsZWQgd2l0aCBhc3luYz0wXG4iKTsKKwl9CisKKwlzLT5idXN5ID0gTlVMTDsKK30KKworc3RhdGljIGludCBjb21lZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljaGFyIG1vZFszMl07CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEUFJJTlRLKCJpbnZhbGlkIG1pbm9yIG51bWJlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFRoaXMgaXMgc2xpZ2h0bHkgaGFja3ksIGJ1dCB3ZSB3YW50IG1vZHVsZSBhdXRvbG9hZGluZworCSAqIHRvIHdvcmsgZm9yIHJvb3QuCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIGF0dGFjaGVkIC0+IG9rCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTAgLT4gYXV0b2xvYWQKKwkgKiBjYXNlOiB1c2VyIG9wZW5zIGRldmljZSwgdW5hdHRhY2hlZCwgaW5fcmVxdWVzdF9tb2R1bGU9MSAtPiBmYWlsCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIGF0dGFjaGVkIC0+IG9rCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTEgLT4gb2sKKwkgKiAgICh0eXBpY2FsbHkgY2FsbGVkIGZyb20gbW9kcHJvYmUpCisJICogY2FzZTogcm9vdCBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTAgLT4gYXV0b2xvYWQKKwkgKgorCSAqIFRoZSBsYXN0IGNvdWxkIGJlIGNoYW5nZWQgdG8gIi0+IG9rIiwgd2hpY2ggd291bGQgZGVueSByb290CisJICogYXV0b2xvYWRpbmcuCisJICovCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJaWYgKGRldi0+YXR0YWNoZWQpCisJCWdvdG8gb2s7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSAmJiBkZXYtPmluX3JlcXVlc3RfbW9kdWxlKSB7CisJCURQUklOVEsoImluIHJlcXVlc3QgbW9kdWxlXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSAmJiBkZXYtPmluX3JlcXVlc3RfbW9kdWxlKQorCQlnb3RvIG9rOworCisJZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSA9IDE7CisKKwlzcHJpbnRmKG1vZCwgImNoYXItbWFqb3ItJWktJWkiLCBDT01FRElfTUFKT1IsIGRldi0+bWlub3IpOworI2lmZGVmIENPTkZJR19LTU9ECisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXF1ZXN0X21vZHVsZShtb2QpOworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworI2VuZGlmCisKKwlkZXYtPmluX3JlcXVlc3RfbW9kdWxlID0gMDsKKworCWlmICghZGV2LT5hdHRhY2hlZCAmJiAhY2FwYWJsZShDQVBfU1lTX01PRFVMRSkpIHsKKwkJRFBSSU5USygibm90IGF0dGFjaGVkIGFuZCBub3QgQ0FQX1NZU19NT0RVTEVcbiIpOworCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CitvazoKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJaWYgKGRldi0+YXR0YWNoZWQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+bW9kdWxlKSkgeworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCQkJcmV0dXJuIC1FTk9TWVM7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPnVzZV9jb3VudCA9PSAwICYmIGRldi0+b3BlbikKKwkJZGV2LT5vcGVuKGRldik7CisKKwlkZXYtPnVzZV9jb3VudCsrOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IE5VTEw7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKworCWlmIChkZXYtPnN1YmRldmljZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCisJCQlpZiAocy0+YnVzeSA9PSBmaWxlKQorCQkJCWRvX2NhbmNlbChkZXYsIHMpOworCQkJaWYgKHMtPmxvY2sgPT0gZmlsZSkKKwkJCQlzLT5sb2NrID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPnVzZV9jb3VudCA9PSAxICYmIGRldi0+Y2xvc2UpCisJCWRldi0+Y2xvc2UoZGV2KTsKKworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCWlmIChkZXYtPmF0dGFjaGVkKQorCQltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCisJZGV2LT51c2VfY291bnQtLTsKKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZBU1lOQykKKwkJY29tZWRpX2Zhc3luYygtMSwgZmlsZSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmRldi0+YXN5bmNfcXVldWUpOworfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbWVkaV9mb3BzID0geworICAgICAgLm93bmVyID0JCVRISVNfTU9EVUxFLAorI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKKyAgICAgIC51bmxvY2tlZF9pb2N0bCA9CWNvbWVkaV91bmxvY2tlZF9pb2N0bCwKKyNlbHNlCisgICAgICAuaW9jdGwgPQkJY29tZWRpX2lvY3RsLAorI2VuZGlmCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKKyAgICAgIC5jb21wYXRfaW9jdGwgPQljb21lZGlfY29tcGF0X2lvY3RsLAorI2VuZGlmCisgICAgICAub3BlbiA9CQljb21lZGlfb3BlbiwKKyAgICAgIC5yZWxlYXNlID0JY29tZWRpX2Nsb3NlLAorICAgICAgLnJlYWQgPQkJY29tZWRpX3JlYWQsCisgICAgICAud3JpdGUgPQkJY29tZWRpX3dyaXRlLAorICAgICAgLm1tYXAgPQkJY29tZWRpX21tYXAsCisgICAgICAucG9sbCA9CQljb21lZGlfcG9sbCwKKyAgICAgIC5mYXN5bmMgPQkJY29tZWRpX2Zhc3luYywKK307CisKK3N0cnVjdCBjbGFzcyAqY29tZWRpX2NsYXNzOworc3RhdGljIHN0cnVjdCBjZGV2IGNvbWVkaV9jZGV2OworCitzdGF0aWMgdm9pZCBjb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0xFR0FDWV9NSU5PUlM7IGkrKykKKwkJY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IoaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJldHZhbDsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFCisJICAgICAgICIgLSBodHRwOi8vd3d3LmNvbWVkaS5vcmdcbiIpOworCisJbWVtc2V0KGNvbWVkaV9maWxlX2luZm9fdGFibGUsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKikgKiBDT01FRElfTlVNX01JTk9SUyk7CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCUNPTUVESV9OVU1fTUlOT1JTLCAiY29tZWRpIik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIC1FSU87CisJY2Rldl9pbml0KCZjb21lZGlfY2RldiwgJmNvbWVkaV9mb3BzKTsKKwljb21lZGlfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWtvYmplY3Rfc2V0X25hbWUoJmNvbWVkaV9jZGV2LmtvYmosICJjb21lZGkiKTsKKwlpZiAoY2Rldl9hZGQoJmNvbWVkaV9jZGV2LCBNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUykpIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCSBDT01FRElfTlVNX01JTk9SUyk7CisJCXJldHVybiAtRUlPOworCX0KKwljb21lZGlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJjb21lZGkiKTsKKwlpZiAoSVNfRVJSKGNvbWVkaV9jbGFzcykpIHsKKwkJcHJpbnRrKCJjb21lZGk6IGZhaWxlZCB0byBjcmVhdGUgY2xhc3MiKTsKKwkJY2Rldl9kZWwoJmNvbWVkaV9jZGV2KTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCSBDT01FRElfTlVNX01JTk9SUyk7CisJCXJldHVybiBQVFJfRVJSKGNvbWVkaV9jbGFzcyk7CisJfQorCisJLyogWFhYIHJlcXVpcmVzIC9wcm9jIGludGVyZmFjZSAqLworCWNvbWVkaV9wcm9jX2luaXQoKTsKKworCS8qIGNyZWF0ZSBkZXZpY2VzIGZpbGVzIGZvciBsZWdhY3kvbWFudWFsIHVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0xFR0FDWV9NSU5PUlM7IGkrKykgeworCQlpbnQgbWlub3I7CisJCW1pbm9yID0gY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKE5VTEwpOworCQlpZiAobWlub3IgPCAwKSB7CisJCQljb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKCk7CisJCQljZGV2X2RlbCgmY29tZWRpX2NkZXYpOworCQkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksCisJCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQkJcmV0dXJuIG1pbm9yOworCQl9CisJfQorCisJY29tZWRpX3J0X2luaXQoKTsKKworCWNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwljb21lZGlfY2xlYW51cF9sZWdhY3lfbWlub3JzKCk7CisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fTUlOT1JTOyArK2kpCisJCUJVR19PTihjb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldKTsKKworCisJY2xhc3NfZGVzdHJveShjb21lZGlfY2xhc3MpOworCWNkZXZfZGVsKCZjb21lZGlfY2Rldik7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKENPTUVESV9NQUpPUiwgMCksIENPTUVESV9OVU1fTUlOT1JTKTsKKworCWNvbWVkaV9wcm9jX2NsZWFudXAoKTsKKworCWNvbWVkaV9ydF9jbGVhbnVwKCk7CisKKwljb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCk7Cit9CisKK21vZHVsZV9pbml0KGNvbWVkaV9pbml0KTsKK21vZHVsZV9leGl0KGNvbWVkaV9jbGVhbnVwKTsKKwordm9pZCBjb21lZGlfZXJyb3IoY29uc3QgY29tZWRpX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpzKQoreworCXJ0X3ByaW50aygiY29tZWRpJWQ6ICVzOiAlc1xuIiwgZGV2LT5taW5vciwgZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLAorCQkgIHMpOworfQorCit2b2lkIGNvbWVkaV9ldmVudChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCXVuc2lnbmVkIHJ1bmZsYWdzID0gMDsKKwl1bnNpZ25lZCBydW5mbGFnc19tYXNrID0gMDsKKworCS8qIERQUklOVEsoImNvbWVkaV9ldmVudCAweCV4XG4iLG1hc2spOyAqLworCisJaWYgKChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocy0+YXN5bmMtPgorCSAgICBldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpIHsKKwkJcnVuZmxhZ3NfbWFzayB8PSBTUkZfUlVOTklORzsKKwl9CisJLyogcmVtZW1iZXIgaWYgYW4gZXJyb3IgZXZlbnQgaGFzIG9jY3VyZWQsIHNvIGFuIGVycm9yCisJICogY2FuIGJlIHJldHVybmVkIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgZG9lcyBhIHJlYWQoKSAqLworCWlmIChzLT5hc3luYy0+ZXZlbnRzICYgKENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpIHsKKwkJcnVuZmxhZ3NfbWFzayB8PSBTUkZfRVJST1I7CisJCXJ1bmZsYWdzIHw9IFNSRl9FUlJPUjsKKwl9CisJaWYgKHJ1bmZsYWdzX21hc2spIHsKKwkJLypzZXRzIFNSRl9FUlJPUiBhbmQgU1JGX1JVTk5JTkcgdG9nZXRoZXIgYXRvbWljYWxseSAqLworCQljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBydW5mbGFnc19tYXNrLCBydW5mbGFncyk7CisJfQorCisJaWYgKGFzeW5jLT5jYl9tYXNrICYgcy0+YXN5bmMtPmV2ZW50cykgeworCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfVVNFUikgeworCisJCQlpZiAoZGV2LT5ydCkgeworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwkJCQkvKiBwZW5kIHdha2UgdXAgKi8KKwkJCQljb21lZGlfcnRfcGVuZF93YWtldXAoJmFzeW5jLT53YWl0X2hlYWQpOworI2Vsc2UKKwkJCQlwcmludGsKKwkJCQkgICAgKCJCVUc6IGNvbWVkaV9ldmVudCgpIGNvZGUgdW5yZWFjaGFibGVcbiIpOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXN5bmMtPndhaXRfaGVhZCk7CisJCQkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkgeworCQkJCQlraWxsX2Zhc3luYygmZGV2LT5hc3luY19xdWV1ZSwgU0lHSU8sCisJCQkJCQkgICAgUE9MTF9JTik7CisJCQkJfQorCQkJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSB7CisJCQkJCWtpbGxfZmFzeW5jKCZkZXYtPmFzeW5jX3F1ZXVlLCBTSUdJTywKKwkJCQkJCSAgICBQT0xMX09VVCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGFzeW5jLT5jYl9mdW5jKQorCQkJCWFzeW5jLT5jYl9mdW5jKHMtPmFzeW5jLT5ldmVudHMsIGFzeW5jLT5jYl9hcmcpOworCQkJLyogWFhYIGJ1ZyBoZXJlLiAgSWYgc3ViZGV2aWNlIEEgaXMgcnQsIGFuZAorCQkJICogc3ViZGV2aWNlIEIgdHJpZXMgdG8gY2FsbGJhY2sgdG8gYSBub3JtYWwKKwkJCSAqIGxpbnV4IGtlcm5lbCBmdW5jdGlvbiwgaXQgd2lsbCBiZSBhdCB0aGUKKwkJCSAqIHdyb25nIHByaW9yaXR5LiAgU2luY2UgdGhpcyBpc24ndCB2ZXJ5CisJCQkgKiBjb21tb24sIEknbSBub3QgZ29pbmcgdG8gd29ycnkgYWJvdXQgaXQuICovCisJCX0KKwl9CisJcy0+YXN5bmMtPmV2ZW50cyA9IDA7Cit9CisKK3ZvaWQgY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbWFzaywKKwkJCQkgICB1bnNpZ25lZCBiaXRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXMtPnJ1bmZsYWdzICY9IH5tYXNrOworCXMtPnJ1bmZsYWdzIHw9IChiaXRzICYgbWFzayk7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworfQorCit1bnNpZ25lZCBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcnVuZmxhZ3M7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXJ1bmZsYWdzID0gcy0+cnVuZmxhZ3M7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCXJldHVybiBydW5mbGFnczsKK30KKworc3RhdGljIGludCBpc19kZXZpY2VfYnVzeShjb21lZGlfZGV2aWNlICpkZXYpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgaTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKwkJaWYgKHMtPmJ1c3kpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHMtPmFzeW5jICYmIHMtPmFzeW5jLT5tbWFwX2NvdW50KQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9pbml0KGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoY29tZWRpX2RldmljZSkpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnNwaW5sb2NrKTsKKwltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKKwlkZXYtPm1pbm9yID0gLTE7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9jbGVhbnVwKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybjsKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmZGV2LT5tdXRleCk7Cit9CisKK2ludCBjb21lZGlfYWxsb2NfYm9hcmRfbWlub3Ioc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNzZGV2OworCXVuc2lnbmVkIGk7CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+ZGV2aWNlID0ga3phbGxvYyhzaXplb2YoY29tZWRpX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkgeworCQlrZnJlZShpbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNvbWVkaV9kZXZpY2VfaW5pdChpbmZvLT5kZXZpY2UpOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyArK2kpIHsKKwkJaWYgKGNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPT0gTlVMTCkgeworCQkJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9IGluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKGkgPT0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpIHsKKwkJY29tZWRpX2RldmljZV9jbGVhbnVwKGluZm8tPmRldmljZSk7CisJCWtmcmVlKGluZm8tPmRldmljZSk7CisJCWtmcmVlKGluZm8pOworCQlydF9wcmludGsKKwkJICAgICgiY29tZWRpOiBlcnJvcjogcmFuIG91dCBvZiBtaW5vciBudW1iZXJzIGZvciBib2FyZCBkZXZpY2UgZmlsZXMuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaW5mby0+ZGV2aWNlLT5taW5vciA9IGk7CisJY3NkZXYgPSBDT01FRElfREVWSUNFX0NSRUFURShjb21lZGlfY2xhc3MsIE5VTEwsCisJCQkJICAgICBNS0RFVihDT01FRElfTUFKT1IsIGkpLCBOVUxMLAorCQkJCSAgICAgaGFyZHdhcmVfZGV2aWNlLCAiY29tZWRpJWkiLCBpKTsKKwlpZiAoIUlTX0VSUihjc2RldikpCisJCWluZm8tPmRldmljZS0+Y2xhc3NfZGV2ID0gY3NkZXY7CisKKwlyZXR1cm4gaTsKK30KKwordm9pZCBjb21lZGlfZnJlZV9ib2FyZF9taW5vcih1bnNpZ25lZCBtaW5vcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUyk7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl07CisJY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl0gPSBOVUxMOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvKSB7CisJCWNvbWVkaV9kZXZpY2UgKmRldiA9IGluZm8tPmRldmljZTsKKwkJaWYgKGRldikgeworCQkJaWYgKGRldi0+Y2xhc3NfZGV2KSB7CisJCQkJZGV2aWNlX2Rlc3Ryb3koY29tZWRpX2NsYXNzLAorCQkJCQkgICAgICAgTUtERVYoQ09NRURJX01BSk9SLCBkZXYtPm1pbm9yKSk7CisJCQl9CisJCQljb21lZGlfZGV2aWNlX2NsZWFudXAoZGV2KTsKKwkJCWtmcmVlKGRldik7CisJCX0KKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCitpbnQgY29tZWRpX2FsbG9jX3N1YmRldmljZV9taW5vcihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmluZm87CisJZGV2aWNlX2NyZWF0ZV9yZXN1bHRfdHlwZSAqY3NkZXY7CisJdW5zaWduZWQgaTsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvLT5kZXZpY2UgPSBkZXY7CisJaW5mby0+cmVhZF9zdWJkZXZpY2UgPSBzOworCWluZm8tPndyaXRlX3N1YmRldmljZSA9IHM7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSBDT01FRElfRklSU1RfU1VCREVWSUNFX01JTk9SOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7ICsraSkgeworCQlpZiAoY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9PSBOVUxMKSB7CisJCQljb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldID0gaW5mbzsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpZiAoaSA9PSBDT01FRElfTlVNX01JTk9SUykgeworCQlrZnJlZShpbmZvKTsKKwkJcnRfcHJpbnRrCisJCSAgICAoImNvbWVkaTogZXJyb3I6IHJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3IgYm9hcmQgZGV2aWNlIGZpbGVzLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXMtPm1pbm9yID0gaTsKKwljc2RldiA9IENPTUVESV9ERVZJQ0VfQ1JFQVRFKGNvbWVkaV9jbGFzcywgZGV2LT5jbGFzc19kZXYsCisJCQkJICAgICBNS0RFVihDT01FRElfTUFKT1IsIGkpLCBOVUxMLCBOVUxMLAorCQkJCSAgICAgImNvbWVkaSVpX3N1YmQlaSIsIGRldi0+bWlub3IsCisJCQkJICAgICAoaW50KShzIC0gZGV2LT5zdWJkZXZpY2VzKSk7CisJaWYgKCFJU19FUlIoY3NkZXYpKQorCQlzLT5jbGFzc19kZXYgPSBjc2RldjsKKworCXJldHVybiBpOworfQorCit2b2lkIGNvbWVkaV9mcmVlX3N1YmRldmljZV9taW5vcihjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChzLT5taW5vciA8IDApCisJCXJldHVybjsKKworCUJVR19PTihzLT5taW5vciA+PSBDT01FRElfTlVNX01JTk9SUyk7CisJQlVHX09OKHMtPm1pbm9yIDwgQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUik7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWluZm8gPSBjb21lZGlfZmlsZV9pbmZvX3RhYmxlW3MtPm1pbm9yXTsKKwljb21lZGlfZmlsZV9pbmZvX3RhYmxlW3MtPm1pbm9yXSA9IE5VTEw7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmNsYXNzX2RldikgeworCQlkZXZpY2VfZGVzdHJveShjb21lZGlfY2xhc3MsIE1LREVWKENPTUVESV9NQUpPUiwgcy0+bWlub3IpKTsKKwkJcy0+Y2xhc3NfZGV2ID0gTlVMTDsKKwl9CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKHVuc2lnbmVkIG1pbm9yKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCisJQlVHX09OKG1pbm9yID49IENPTUVESV9OVU1fTUlOT1JTKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWluZm8gPSBjb21lZGlfZmlsZV9pbmZvX3RhYmxlW21pbm9yXTsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGluZm87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmOGRmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuaApAQCAtMCwwICsxLDggQEAKKworI2lmbmRlZiBfQ09NRURJX0ZPUFNfSAorI2RlZmluZSBfQ09NRURJX0ZPUFNfSAorCitleHRlcm4gc3RydWN0IGNsYXNzICpjb21lZGlfY2xhc3M7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21lZGlfZm9wczsKKworI2VuZGlmIC8qIF9DT01FRElfRk9QU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9rc3ltcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ1NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICAgIG1vZHVsZS9leHBfaW9jdGwuYworICAgIGV4cG9ydGVkIGNvbWVkaSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaWZuZGVmIEVYUE9SVF9TWU1UQUIKKyNkZWZpbmUgRVhQT1JUX1NZTVRBQgorI2VuZGlmCisKKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKworLyogZm9yIGRyaXZlcnMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2RyaXZlcl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2J1ZmNoZWNrKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZG9uZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Vycm9yX2RvbmUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZXJyb3IpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lb2J1Zik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2Vvcyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9ldmVudCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MpOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyMTApOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyNSk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX2JpcG9sYXIyXzUpOworRVhQT1JUX1NZTUJPTChyYW5nZV91bmlwb2xhcjEwKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5pcG9sYXI1KTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5rbm93bik7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVAorRVhQT1JUX1NZTUJPTChjb21lZGlfZnJlZV9pcnEpOworRVhQT1JUX1NZTUJPTChjb21lZGlfcmVxdWVzdF9pcnEpOworRVhQT1JUX1NZTUJPTChjb21lZGlfc3dpdGNoX3RvX3J0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N3aXRjaF90b19ub25fcnQpOworRVhQT1JUX1NZTUJPTChydF9wZW5kX2NhbGwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworRVhQT1JUX1NZTUJPTChjb21lZGlfZGVidWcpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfYWxsb2NfYm9hcmRfbWlub3IpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3BjaV9hdXRvX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfcGNpX2F1dG9fdW5jb25maWcpOworCisvKiBmb3Iga2NvbWVkaWxpYiAqLworRVhQT1JUX1NZTUJPTChjaGVja19jaGFubGlzdCk7CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8pOworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfcHV0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9nZXQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3dyaXRlX2ZyZWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3dyaXRlX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX2ZyZWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3JlYWRfYWxsb2MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX21lbWNweV90byk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfbWVtY3B5X2Zyb20pOworRVhQT1JUX1NZTUJPTChjb21lZGlfcmVzZXRfYXN5bmNfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODUyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICAgIG1vZHVsZS9jb21lZGlfcnQuaAorICAgIGhlYWRlciBmaWxlIGZvciByZWFsLXRpbWUgc3RydWN0dXJlcywgdmFyaWFibGVzLCBhbmQgY29uc3RhbnRzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX1JUX0gKKyNkZWZpbmUgX0NPTUVESV9SVF9ICisKKyNpZm5kZWYgX0NPTUVESURFVl9ICisjZXJyb3IgY29tZWRpX3J0Lmggc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgYnkgY29tZWRpZGV2LmgKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorI2luY2x1ZGUgPHJ0YWkuaD4KKyNpbmNsdWRlIDxydGFpX3NjaGVkLmg+CisjaW5jbHVkZSA8cnRhaV92ZXJzaW9uLmg+CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUTAorI2luY2x1ZGUgPHJ0bF9jb3JlLmg+CisjaW5jbHVkZSA8cnRsX3RpbWUuaD4KKy8qICNpZmRlZiBSVExJTlVYX1ZFUlNJT05fQ09ERSAqLworI2luY2x1ZGUgPHJ0bF9zeW5jLmg+CisvKiAjZW5kaWYgKi8KKyNkZWZpbmUgcnRfcHJpbnRrIHJ0bF9wcmludGYKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisjZGVmaW5lIHJ0X3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhmb3JtYXQgLCAjIyBhcmdzKQorI2VuZGlmIC8qIENPTkZJR19DT01FRElfRlVTSU9OICovCisjaWZkZWYgQ09ORklHX1BSSU9SSVRZX0lSUQorI2RlZmluZSBydF9wcmludGsgcHJpbnRrCisjZW5kaWYKKworaW50IGNvbWVkaV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFyZXR1cm5fdCgqaGFuZGxlcikgKGludCwKKwkJdm9pZCAqUFRfUkVHU19BUkcpLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZpY2UsCisJCWNvbWVkaV9kZXZpY2UgKmRldl9pZCk7Cit2b2lkIGNvbWVkaV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb21lZGlfZGV2aWNlICpkZXZfaWQpOwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKTsKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCk7CitpbnQgY29tZWRpX3N3aXRjaF90b19ydChjb21lZGlfZGV2aWNlICpkZXYpOwordm9pZCBjb21lZGlfc3dpdGNoX3RvX25vbl9ydChjb21lZGlfZGV2aWNlICpkZXYpOwordm9pZCBjb21lZGlfcnRfcGVuZF93YWtldXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEpOworZXh0ZXJuIGludCBydF9wZW5kX2NhbGwodm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMiksIGludCBhcmcxLAorCXZvaWQgKmFyZzIpOworCisjZWxzZQorCisjZGVmaW5lIGNvbWVkaV9yZXF1ZXN0X2lycShhLCBiLCBjLCBkLCBlKSByZXF1ZXN0X2lycShhLCBiLCBjLCBkLCBlKQorI2RlZmluZSBjb21lZGlfZnJlZV9pcnEoYSwgYikgZnJlZV9pcnEoYSwgYikKKyNkZWZpbmUgY29tZWRpX3J0X2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3J0X2NsZWFudXAoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3N3aXRjaF90b19ydChhKSAoLTEpCisjZGVmaW5lIGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGEpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjb21lZGlfcnRfcGVuZF93YWtldXAoYSkgZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUgcnRfcHJpbnRrKGZvcm1hdCwgYXJncy4uLikJcHJpbnRrKGZvcm1hdCwgIyNhcmdzKQorCisjZW5kaWYKKworLyogRGVmaW5lIGEgc3Bpbl9sb2NrX2lycXNhdmUgZnVuY3Rpb24gdGhhdCB3aWxsIHdvcmsgd2l0aCBydCBvciB3aXRob3V0LgorICogVXNlIGlubGluZSBmdW5jdGlvbnMgaW5zdGVhZCBvZiBqdXN0IG1hY3JvcyB0byBlbmZvcmNlIHNvbWUgdHlwZSBjaGVja2luZy4KKyAqLworI2RlZmluZSBjb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKSBcCisJKGZsYWdzID0gX19jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoc3BpbmxvY2tfdCAqbG9ja19wdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCWZsYWdzID0gcnRfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQorCXJ0bF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMX1YxKQorCXJ0bF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfRlVTSU9OKQorCXJ0aGFsX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxzZQorCXNwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncyk7CisKKyNlbmRpZgorCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoc3BpbmxvY2tfdCAqbG9ja19wdHIsCisJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCXJ0X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MsIGxvY2tfcHRyKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTCkKKwlydGxfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMX1YxKQorCXJ0bF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfRlVTSU9OKQorCXJ0aGFsX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKyNlbHNlCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZW5kaWYKKworfQorCisvKiBkZWZpbmUgYSBSVCBzYWZlIHVkZWxheSAqLworc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV91ZGVsYXkodW5zaWduZWQgaW50IHVzZWMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUQUkpCisJc3RhdGljIGNvbnN0IGludCBuYW5vc2VjX3Blcl91c2VjID0gMTAwMDsKKwlydF9idXN5X3NsZWVwKHVzZWMgKiBuYW5vc2VjX3Blcl91c2VjKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEwpCisJc3RhdGljIGNvbnN0IGludCBuYW5vc2VjX3Blcl91c2VjID0gMTAwMDsKKwlydGxfZGVsYXkodXNlYyAqIG5hbm9zZWNfcGVyX3VzZWMpOworI2Vsc2UKKwl1ZGVsYXkodXNlYyk7CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM1MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAgICBpbmNsdWRlL2xpbnV4L2NvbWVkaWRldi5oCisgICAgaGVhZGVyIGZpbGUgZm9yIGtlcm5lbC1vbmx5IHN0cnVjdHVyZXMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50cworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESURFVl9ICisjZGVmaW5lIF9DT01FRElERVZfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiaW50ZXJydXB0LmgiCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgImNvbWVkaS5oIgorCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQlkbyB7CQlcCisJaWYgKGNvbWVkaV9kZWJ1ZykJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiAiIGZvcm1hdCAsICMjIGFyZ3MpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTUVESV9WRVJTSU9OKGEsIGIsIGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCisjZGVmaW5lIENPTUVESV9WRVJTSU9OX0NPREUgQ09NRURJX1ZFUlNJT04oQ09NRURJX01BSk9SVkVSU0lPTiwgQ09NRURJX01JTk9SVkVSU0lPTiwgQ09NRURJX01JQ1JPVkVSU0lPTikKKyNkZWZpbmUgQ09NRURJX1JFTEVBU0UgVkVSU0lPTgorCisjZGVmaW5lIENPTUVESV9JTklUQ0xFQU5VUF9OT01PRFVMRSh4KQkJCQkJXAorCXN0YXRpYyBpbnQgX19pbml0IHggIyMgX2luaXRfbW9kdWxlKHZvaWQpCQkJXAorCQl7cmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJih4KSk7fQkJCVwKKwlzdGF0aWMgdm9pZCBfX2V4aXQgeCAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkJCQlcCisJCXtjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJih4KSk7fSAJCQlcCisJbW9kdWxlX2luaXQoeCAjIyBfaW5pdF9tb2R1bGUpOwkJCQkJXAorCW1vZHVsZV9leGl0KHggIyMgX2NsZWFudXBfbW9kdWxlKTsJCQkJCVwKKworI2RlZmluZSBDT01FRElfTU9EVUxFX01BQ1JPUwkJCQkJCVwKKwlNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CQlcCisJTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgbG93LWxldmVsIGRyaXZlciIpOwkJCVwKKwlNT0RVTEVfTElDRU5TRSgiR1BMIik7CQkJCQkJXAorCisjZGVmaW5lIENPTUVESV9JTklUQ0xFQU5VUCh4KQkJCQkJCVwKKwlDT01FRElfTU9EVUxFX01BQ1JPUwkJXAorCUNPTUVESV9JTklUQ0xFQU5VUF9OT01PRFVMRSh4KQorCisjZGVmaW5lIENPTUVESV9QQ0lfSU5JVENMRUFOVVBfTk9NT0RVTEUoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKSBcCisJc3RhdGljIGludCBfX2RldmluaXQgY29tZWRpX2RyaXZlciAjIyBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIFwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkgXAorCXsgXAorCQlyZXR1cm4gY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhkZXYsIGNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWUpOyBcCisJfSBcCisJc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikgXAorCXsgXAorCQljb21lZGlfcGNpX2F1dG9fdW5jb25maWcoZGV2KTsgXAorCX0gXAorCXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyID0gXAorCXsgXAorCQkuaWRfdGFibGUgPSBwY2lfaWRfdGFibGUsIFwKKwkJLnByb2JlID0gJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9wcm9iZSwgXAorCQkucmVtb3ZlID0gX19kZXZleGl0X3AoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUpIFwKKwl9OyBcCisJc3RhdGljIGludCBfX2luaXQgY29tZWRpX2RyaXZlciAjIyBfaW5pdF9tb2R1bGUodm9pZCkgXAorCXsgXAorCQlpbnQgcmV0dmFsOyBcCisJCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCisJCWlmIChyZXR2YWwgPCAwKSBcCisJCQlyZXR1cm4gcmV0dmFsOyBcCisJCWNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAorCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlcik7IFwKKwl9IFwKKwlzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkgXAorCXsgXAorCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCisJCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmY29tZWRpX2RyaXZlcik7IFwKKwl9IFwKKwltb2R1bGVfaW5pdChjb21lZGlfZHJpdmVyICMjIF9pbml0X21vZHVsZSk7IFwKKwltb2R1bGVfZXhpdChjb21lZGlfZHJpdmVyICMjIF9jbGVhbnVwX21vZHVsZSk7CisKKyNkZWZpbmUgQ09NRURJX1BDSV9JTklUQ0xFQU5VUChjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpIFwKKwlDT01FRElfTU9EVUxFX01BQ1JPUyBcCisJQ09NRURJX1BDSV9JTklUQ0xFQU5VUF9OT01PRFVMRShjb21lZGlfZHJpdmVyLCBwY2lfaWRfdGFibGUpCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTk9WQQkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkFUSU5TVAkJMHgxMDkzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREFUWAkJMHgxMTE2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUFVURVJCT0FSRFMJMHgxMzA3CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURWQU5URUNICQkweDEzZmUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SVEQJCTB4MTQzNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNUExJQ09OCQkweDE0ZGMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BRExJTksJCTB4MTQ0YQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDUAkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09OVEVDCQkweDEyMjEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRUlMSEFVUwkJMHgxNDAyCisKKyNkZWZpbmUgQ09NRURJX05VTV9NSU5PUlMgMHgxMDAKKyNkZWZpbmUgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTIDB4MTAKKyNkZWZpbmUgQ09NRURJX05VTV9CT0FSRF9NSU5PUlMgMHgzMAorI2RlZmluZSBDT01FRElfRklSU1RfU1VCREVWSUNFX01JTk9SIENPTUVESV9OVU1fQk9BUkRfTUlOT1JTCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9kZXZpY2Vfc3RydWN0IGNvbWVkaV9kZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlX3N0cnVjdCBjb21lZGlfc3ViZGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2FzeW5jX3N0cnVjdCBjb21lZGlfYXN5bmM7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZHJpdmVyX3N0cnVjdCBjb21lZGlfZHJpdmVyOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2xyYW5nZV9zdHJ1Y3QgY29tZWRpX2xyYW5nZTsKKwordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlIGRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGU7CisKKyNkZWZpbmUgQ09NRURJX0RFVklDRV9DUkVBVEUoY3MsIHBhcmVudCwgZGV2dCwgZHJ2ZGF0YSwgZGV2aWNlLCBmbXQuLi4pIFwKKwlkZXZpY2VfY3JlYXRlKGNzLCAoKHBhcmVudCkgPyAocGFyZW50KSA6IChkZXZpY2UpKSwgZGV2dCwgZHJ2ZGF0YSwgZm10KQorCitzdHJ1Y3QgY29tZWRpX3N1YmRldmljZV9zdHJ1Y3QgeworCWNvbWVkaV9kZXZpY2UgKmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgbl9jaGFuOworCXZvbGF0aWxlIGludCBzdWJkZXZfZmxhZ3M7CisJaW50IGxlbl9jaGFubGlzdDsJLyogbWF4aW11bSBsZW5ndGggb2YgY2hhbm5lbC9nYWluIGxpc3QgKi8KKworCXZvaWQgKnByaXZhdGU7CisKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCisJdm9pZCAqbG9jazsKKwl2b2lkICpidXN5OworCXVuc2lnbmVkIHJ1bmZsYWdzOworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOworCisJaW50IGlvX2JpdHM7CisKKwlsc2FtcGxfdCBtYXhkYXRhOwkvKiBpZiBtYXhkYXRhPT0wLCB1c2UgbGlzdCAqLworCWNvbnN0IGxzYW1wbF90ICptYXhkYXRhX2xpc3Q7CS8qIGxpc3QgaXMgY2hhbm5lbCBzcGVjaWZpYyAqLworCisJdW5zaWduZWQgaW50IGZsYWdzOworCWNvbnN0IHVuc2lnbmVkIGludCAqZmxhZ2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgc2V0dGxpbmdfdGltZV8wOworCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VfdGFibGU7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqY29uc3QgKnJhbmdlX3RhYmxlX2xpc3Q7CisKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBkcml2ZXItb3duZWQgY2hhbmxpc3QgKG5vdCB1c2VkKSAqLworCisJaW50ICgqaW5zbl9yZWFkKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fd3JpdGUpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKiwgY29tZWRpX2luc24gKiwKKwkJbHNhbXBsX3QgKik7CisJaW50ICgqaW5zbl9iaXRzKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fY29uZmlnKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCisJaW50ICgqZG9fY21kKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICopOworCWludCAoKmRvX2NtZHRlc3QpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKiwgY29tZWRpX2NtZCAqKTsKKwlpbnQgKCpwb2xsKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICopOworCWludCAoKmNhbmNlbCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwkvKiBpbnQgKCpkb19sb2NrKShjb21lZGlfZGV2aWNlICosY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb191bmxvY2spKGNvbWVkaV9kZXZpY2UgKixjb21lZGlfc3ViZGV2aWNlICopOyAqLworCisJLyogY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzICovCisJaW50ICgqYnVmX2NoYW5nZSkgKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisKKwl2b2lkICgqbXVuZ2UpIChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsIHZvaWQgKmRhdGEsCisJCXVuc2lnbmVkIGludCBudW1fYnl0ZXMsIHVuc2lnbmVkIGludCBzdGFydF9jaGFuX2luZGV4KTsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBhc3luY19kbWFfZGlyOworCisJdW5zaWduZWQgaW50IHN0YXRlOworCisJZGV2aWNlX2NyZWF0ZV9yZXN1bHRfdHlwZSAqY2xhc3NfZGV2OworCWludCBtaW5vcjsKK307CisKK3N0cnVjdCBjb21lZGlfYnVmX3BhZ2UgeworCXZvaWQgKnZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfTsKKworc3RydWN0IGNvbWVkaV9hc3luY19zdHJ1Y3QgeworCWNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZTsKKworCXZvaWQgKnByZWFsbG9jX2J1ZjsJLyogcHJlLWFsbG9jYXRlZCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgcHJlYWxsb2NfYnVmc3o7CS8qIGJ1ZmZlciBzaXplLCBpbiBieXRlcyAqLworCXN0cnVjdCBjb21lZGlfYnVmX3BhZ2UgKmJ1Zl9wYWdlX2xpc3Q7CS8qIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGVhY2ggcGFnZSAqLworCXVuc2lnbmVkIG5fYnVmX3BhZ2VzOwkvKiBudW0gZWxlbWVudHMgaW4gYnVmX3BhZ2VfbGlzdCAqLworCisJdW5zaWduZWQgaW50IG1heF9idWZzaXplOwkvKiBtYXhpbXVtIGJ1ZmZlciBzaXplLCBieXRlcyAqLworCXVuc2lnbmVkIGludCBtbWFwX2NvdW50OwkvKiBjdXJyZW50IG51bWJlciBvZiBtbWFwcyBvZiBwcmVhbGxvY19idWYgKi8KKworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAod3JpdGUgY29tcGxldGVkKSAqLworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfYWxsb2NfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAoYWxsb2NhdGVkIGZvciB3cml0aW5nKSAqLworCXVuc2lnbmVkIGludCBidWZfcmVhZF9jb3VudDsJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChyZWFkIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfYWxsb2NfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAoYWxsb2NhdGVkIGZvciByZWFkaW5nKSAqLworCisJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHdyaXRlciAqLworCXVuc2lnbmVkIGludCBidWZfcmVhZF9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHJlYWRlciAqLworCisJdW5zaWduZWQgaW50IGN1cl9jaGFuOwkvKiB1c2VsZXNzIGNoYW5uZWwgbWFya2VyIGZvciBpbnRlcnJ1cHQgKi8KKwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQgZm9yIGN1cnJlbnQgc2NhbiAqLworCXVuc2lnbmVkIGludCBzY2FuX3Byb2dyZXNzOworCS8qIGtlZXBzIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSBpbiBjaGFubGlzdCBhcyBmb3IgbXVuZ2luZyAqLworCXVuc2lnbmVkIGludCBtdW5nZV9jaGFuOworCS8qIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBtdW5nZWQgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfY291bnQ7CisJLyogYnVmZmVyIG1hcmtlciBmb3IgbXVuZ2luZyAqLworCXVuc2lnbmVkIGludCBtdW5nZV9wdHI7CisKKwl1bnNpZ25lZCBpbnQgZXZlbnRzOwkvKiBldmVudHMgdGhhdCBoYXZlIG9jY3VycmVkICovCisKKwljb21lZGlfY21kIGNtZDsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfaGVhZDsKKworCS8qIGNhbGxiYWNrIHN0dWZmICovCisJdW5zaWduZWQgaW50IGNiX21hc2s7CisJaW50ICgqY2JfZnVuYykgKHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqKTsKKwl2b2lkICpjYl9hcmc7CisKKwlpbnQgKCppbnR0cmlnKSAoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJdW5zaWduZWQgaW50IHgpOworfTsKKworc3RydWN0IGNvbWVkaV9kcml2ZXJfc3RydWN0IHsKKwlzdHJ1Y3QgY29tZWRpX2RyaXZlcl9zdHJ1Y3QgKm5leHQ7CisKKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CisJaW50ICgqYXR0YWNoKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfZGV2Y29uZmlnICopOworCWludCAoKmRldGFjaCkgKGNvbWVkaV9kZXZpY2UgKik7CisKKwkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm9hcmRfbmFtZSBhbmQgYm9hcmRfaWQgYXJyYXlzICovCisJdW5zaWduZWQgaW50IG51bV9uYW1lczsKKwljb25zdCBjaGFyICpjb25zdCAqYm9hcmRfbmFtZTsKKwkvKiBvZmZzZXQgaW4gYnl0ZXMgZnJvbSBvbmUgYm9hcmQgbmFtZSBwb2ludGVyIHRvIHRoZSBuZXh0ICovCisJaW50IG9mZnNldDsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX3N0cnVjdCB7CisJaW50IHVzZV9jb3VudDsKKwljb21lZGlfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqcHJpdmF0ZTsKKworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNsYXNzX2RldjsKKwlpbnQgbWlub3I7CisJLyogaHdfZGV2IGlzIHBhc3NlZCB0byBkbWFfYWxsb2NfY29oZXJlbnQgd2hlbiBhbGxvY2F0aW5nIGFzeW5jIGJ1ZmZlcnMKKwkgKiBmb3Igc3ViZGV2aWNlcyB0aGF0IGhhdmUgYXN5bmNfZG1hX2RpciBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4KKwkgKiBETUFfTk9ORSAqLworCXN0cnVjdCBkZXZpY2UgKmh3X2RldjsKKworCWNvbnN0IGNoYXIgKmJvYXJkX25hbWU7CisJY29uc3Qgdm9pZCAqYm9hcmRfcHRyOworCWludCBhdHRhY2hlZDsKKwlpbnQgcnQ7CisJc3BpbmxvY2tfdCBzcGlubG9jazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IGluX3JlcXVlc3RfbW9kdWxlOworCisJaW50IG5fc3ViZGV2aWNlczsKKwljb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2VzOworCisJLyogZHVtYiAqLworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCXVuc2lnbmVkIGludCBpcnE7CisKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldjsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXY7CisKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqYXN5bmNfcXVldWU7CisKKwl2b2lkICgqb3BlbikgKGNvbWVkaV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmNsb3NlKSAoY29tZWRpX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyB7CisJY29tZWRpX2RldmljZSAqZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKndyaXRlX3N1YmRldmljZTsKK307CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCitleHRlcm4gaW50IGNvbWVkaV9kZWJ1ZzsKKyNlbHNlCitzdGF0aWMgY29uc3QgaW50IGNvbWVkaV9kZWJ1ZzsKKyNlbmRpZgorCisvKgorICogZnVuY3Rpb24gcHJvdG90eXBlcworICovCisKK3ZvaWQgY29tZWRpX2V2ZW50KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7Cit2b2lkIGNvbWVkaV9lcnJvcihjb25zdCBjb21lZGlfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnMpOworCisvKiB3ZSBjYW4gZXhwYW5kIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIGVuY29kZSBkZXZpY2VzL3N1YmRldmljZXMgaW50bworIHRoZSBtaW5vciBudW1iZXIgc29vbiwgYWZ0ZXIgbW9yZSBkaXN0cm9zIHN1cHBvcnQgPiA4IGJpdCBtaW5vciBudW1iZXJzCisgKGxpa2UgYWZ0ZXIgRGViaWFuIEV0Y2ggZ2V0cyByZWxlYXNlZCkgKi8KK2VudW0gY29tZWRpX21pbm9yX2JpdHMgeworCUNPTUVESV9ERVZJQ0VfTUlOT1JfTUFTSyA9IDB4ZiwKKwlDT01FRElfU1VCREVWSUNFX01JTk9SX01BU0sgPSAweGYwCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIENPTUVESV9TVUJERVZJQ0VfTUlOT1JfU0hJRlQgPSA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIENPTUVESV9TVUJERVZJQ0VfTUlOT1JfT0ZGU0VUID0gMTsKKworc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8odW5zaWduZWQgbWlub3IpOworCitzdGF0aWMgaW5saW5lIGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoCisJCQkJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5yZWFkX3N1YmRldmljZSkKKwkJcmV0dXJuIGluZm8tPnJlYWRfc3ViZGV2aWNlOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGluZm8tPmRldmljZS0+cmVhZF9zdWJkZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoCisJCQkJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQoreworCWlmIChpbmZvLT53cml0ZV9zdWJkZXZpY2UpCisJCXJldHVybiBpbmZvLT53cml0ZV9zdWJkZXZpY2U7CisJaWYgKGluZm8tPmRldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaW5mby0+ZGV2aWNlLT53cml0ZV9zdWJkZXY7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKK2ludCBjb21lZGlfZGV2aWNlX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK2ludCBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKik7CitpbnQgY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKik7CisKK3ZvaWQgaW5pdF9wb2xsaW5nKHZvaWQpOwordm9pZCBjbGVhbnVwX3BvbGxpbmcodm9pZCk7Cit2b2lkIHN0YXJ0X3BvbGxpbmcoY29tZWRpX2RldmljZSAqKTsKK3ZvaWQgc3RvcF9wb2xsaW5nKGNvbWVkaV9kZXZpY2UgKik7CisKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgbG9uZworCW5ld19zaXplKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIGNvbWVkaV9wcm9jX2luaXQodm9pZCk7Cit2b2lkIGNvbWVkaV9wcm9jX2NsZWFudXAodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV9wcm9jX2luaXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpCit7Cit9CisjZW5kaWYKKworLyogc3ViZGV2aWNlIHJ1bmZsYWdzICovCitlbnVtIHN1YmRldmljZV9ydW5mbGFncyB7CisJU1JGX1VTRVIgPSAweDAwMDAwMDAxLAorCVNSRl9SVCA9IDB4MDAwMDAwMDIsCisJLyogaW5kaWNhdGVzIGFuIENPTUVESV9DQl9FUlJPUiBldmVudCBoYXMgb2NjdXJyZWQgc2luY2UgdGhlIGxhc3QKKwkgKiBjb21tYW5kIHdhcyBzdGFydGVkICovCisJU1JGX0VSUk9SID0gMHgwMDAwMDAwNCwKKwlTUkZfUlVOTklORyA9IDB4MDgwMDAwMDAKK307CisKKy8qCisgICB2YXJpb3VzIGludGVybmFsIGNvbWVkaSBmdW5jdGlvbnMKKyAqLworCitpbnQgZG9fcmFuZ2VpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3JhbmdlaW5mbyAqYXJnKTsKK2ludCBjaGVja19jaGFubGlzdChjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgbiwgdW5zaWduZWQgaW50ICpjaGFubGlzdCk7Cit2b2lkIGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIG1hc2ssCisJdW5zaWduZWQgYml0cyk7Cit1bnNpZ25lZCBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzKTsKK2ludCBpbnNuX2ludmFsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwljb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworCisvKiByYW5nZSBzdHVmZiAqLworCisjZGVmaW5lIFJBTkdFKGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgMH0KKyNkZWZpbmUgUkFOR0VfZXh0KGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgUkZfRVhURVJOQUx9CisjZGVmaW5lIFJBTkdFX21BKGEsIGIpCQl7KGEpKjFlNiwgKGIpKjFlNiwgVU5JVF9tQX0KKyNkZWZpbmUgUkFOR0VfdW5pdGxlc3MoYSwgYikJeyhhKSoxZTYsIChiKSoxZTYsIDB9CS8qIFhYWCAqLworI2RlZmluZSBCSVBfUkFOR0UoYSkJCXstKGEpKjFlNiwgKGEpKjFlNiwgMH0KKyNkZWZpbmUgVU5JX1JBTkdFKGEpCQl7MCwgKGEpKjFlNiwgMH0KKworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjEwOworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjU7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMl81OworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5pcG9sYXIxMDsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyNTsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3Vua25vd247CisKKyNkZWZpbmUgcmFuZ2VfZGlnaXRhbAkJcmFuZ2VfdW5pcG9sYXI1CisKKyNpZiBfX0dOVUNfXyA+PSAzCisjZGVmaW5lIEdDQ19aRVJPX0xFTkdUSF9BUlJBWQorI2Vsc2UKKyNkZWZpbmUgR0NDX1pFUk9fTEVOR1RIX0FSUkFZIDAKKyNlbmRpZgorCitzdHJ1Y3QgY29tZWRpX2xyYW5nZV9zdHJ1Y3QgeworCWludCBsZW5ndGg7CisJY29tZWRpX2tyYW5nZSByYW5nZVtHQ0NfWkVST19MRU5HVEhfQVJSQVldOworfTsKKworLyogc29tZSBzaWxseSBsaXR0bGUgaW5saW5lIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW5saW5lIGludCBhbGxvY19zdWJkZXZpY2VzKGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbnVtX3N1YmRldmljZXMpCit7CisJdW5zaWduZWQgaTsKKworCWRldi0+bl9zdWJkZXZpY2VzID0gbnVtX3N1YmRldmljZXM7CisJZGV2LT5zdWJkZXZpY2VzID0KKwkJa2NhbGxvYyhudW1fc3ViZGV2aWNlcywgc2l6ZW9mKGNvbWVkaV9zdWJkZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+c3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG51bV9zdWJkZXZpY2VzOyArK2kpIHsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLmRldmljZSA9IGRldjsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLmFzeW5jX2RtYV9kaXIgPSBETUFfTk9ORTsKKwkJc3Bpbl9sb2NrX2luaXQoJmRldi0+c3ViZGV2aWNlc1tpXS5zcGluX2xvY2spOworCQlkZXYtPnN1YmRldmljZXNbaV0ubWlub3IgPSAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jX3ByaXZhdGUoY29tZWRpX2RldmljZSAqZGV2LCBpbnQgc2l6ZSkKK3sKKwlkZXYtPnByaXZhdGUgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5wcml2YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX3NhbXBsZShjb25zdCBjb21lZGlfc3ViZGV2aWNlICpzdWJkKQoreworCWlmIChzdWJkLT5zdWJkZXZfZmxhZ3MgJiBTREZfTFNBTVBMKQorCQlyZXR1cm4gc2l6ZW9mKGxzYW1wbF90KTsKKwllbHNlCisJCXJldHVybiBzaXplb2Yoc2FtcGxfdCk7Cit9CisKKy8qIG11c3QgYmUgdXNlZCBpbiBhdHRhY2ggdG8gc2V0IGRldi0+aHdfZGV2IGlmIHlvdSB3aXNoIHRvIGRtYSBkaXJlY3RseQoraW50byBjb21lZGkncyBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfc2V0X2h3X2Rldihjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmh3X2RldikKK3sKKwlpZiAoZGV2LT5od19kZXYpCisJCXB1dF9kZXZpY2UoZGV2LT5od19kZXYpOworCisJZGV2LT5od19kZXYgPSBod19kZXY7CisJaWYgKGRldi0+aHdfZGV2KSB7CisJCWRldi0+aHdfZGV2ID0gZ2V0X2RldmljZShkZXYtPmh3X2Rldik7CisJCUJVR19PTihkZXYtPmh3X2RldiA9PSBOVUxMKTsKKwl9Cit9CisKK2ludCBjb21lZGlfYnVmX3B1dChjb21lZGlfYXN5bmMgKmFzeW5jLCBzYW1wbF90IHgpOworaW50IGNvbWVkaV9idWZfZ2V0KGNvbWVkaV9hc3luYyAqYXN5bmMsIHNhbXBsX3QgKngpOworCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKmFzeW5jKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Nfc3RyaWN0KGNvbWVkaV9hc3luYyAqYXN5bmMsCisJdW5zaWduZWQgaW50IG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX2ZyZWUoY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgaW50IG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfYWxsb2MoY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9mcmVlKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKmFzeW5jKTsKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfdG8oY29tZWRpX2FzeW5jICphc3luYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwljb25zdCB2b2lkICpzb3VyY2UsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOwordm9pZCBjb21lZGlfYnVmX21lbWNweV9mcm9tKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJdm9pZCAqZGVzdGluYXRpb24sIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGNvbWVkaV9hc3luYyAqYXN5bmMpCit7CisJcmV0dXJuIGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfbl9hbGxvY2F0ZWQoY29tZWRpX2FzeW5jICphc3luYykKK3sKKwlyZXR1cm4gYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworfQorCit2b2lkIGNvbWVkaV9yZXNldF9hc3luY19idWYoY29tZWRpX2FzeW5jICphc3luYyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY29tZWRpX2F1eF9kYXRhKGludCBvcHRpb25zW10sIGludCBuKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3NMb3c7CisJaW50IGJpdF9zaGlmdDsKKwlpZiAoc2l6ZW9mKGludCkgPj0gc2l6ZW9mKHZvaWQgKikpCisJCWFkZHJlc3MgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXTsKKwllbHNlIHsKKwkJYWRkcmVzcyA9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEldOworCQliaXRfc2hpZnQgPSBzaXplb2YoaW50KSAqIDg7CisJCWFkZHJlc3MgPDw9IGJpdF9zaGlmdDsKKwkJYWRkcmVzc0xvdyA9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTE9dOworCQlhZGRyZXNzTG93ICY9ICgxVUwgPDwgYml0X3NoaWZ0KSAtIDE7CisJCWFkZHJlc3MgfD0gYWRkcmVzc0xvdzsKKwl9CisJaWYgKG4gPj0gMSkKKwkJYWRkcmVzcyArPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBMF9MRU5HVEhdOworCWlmIChuID49IDIpCisJCWFkZHJlc3MgKz0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQTFfTEVOR1RIXTsKKwlpZiAobiA+PSAzKQorCQlhZGRyZXNzICs9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEyX0xFTkdUSF07CisJQlVHX09OKG4gPiAzKTsKKwlyZXR1cm4gKHZvaWQgKilhZGRyZXNzOworfQorCitpbnQgY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSk7Cit2b2lkIGNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKHVuc2lnbmVkIG1pbm9yKTsKK2ludCBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlX21pbm9yKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcyk7Cit2b2lkIGNvbWVkaV9mcmVlX3N1YmRldmljZV9taW5vcihjb21lZGlfc3ViZGV2aWNlICpzKTsKK2ludCBjb21lZGlfcGNpX2F1dG9fY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IGNoYXIgKmJvYXJkX25hbWUpOwordm9pZCBjb21lZGlfcGNpX2F1dG9fdW5jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7CisKKyNpbmNsdWRlICJjb21lZGlfcnQuaCIKKworI2VuZGlmIC8qIF9DT01FRElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ZmMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgICAgbGludXgvaW5jbHVkZS9jb21lZGlsaWIuaAorICAgIGhlYWRlciBmaWxlIGZvciBrY29tZWRpbGliCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfTElOVVhfQ09NRURJTElCX0gKKyNkZWZpbmUgX0xJTlVYX0NPTUVESUxJQl9ICisKKyNpbmNsdWRlICJjb21lZGkuaCIKKworLyogS2VybmVsIGludGVybmFsIHN0dWZmLiAgTmVlZGVkIGJ5IHJlYWwtdGltZSBtb2R1bGVzIGFuZCBzdWNoLiAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNlcnJvciBsaW51eC9jb21lZGlsaWIuaCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGJ5IG5vbi1rZXJuZWwtc3BhY2UgY29kZQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCisjaWZuZGVmIEtDT01FRElMSUJfREVQUkVDQVRFRAorCit0eXBlZGVmIHZvaWQgY29tZWRpX3Q7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgbm90IGJlIGNhbGxlZCBhdCByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworY29tZWRpX3QgKmNvbWVkaV9vcGVuKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGNvbWVkaV9jbG9zZShjb21lZGlfdCAqZGV2KTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgbWF5IGZhaWwgYXQKKyAgIHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX2xvY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3VubG9jayhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgeW91IG11c3QgaG9sZAorICAgdGhlIGxvY2sgZm9yIHRoZSBzdWJkZXZpY2UgKi8KKworaW50IGNvbWVkaV9sb2dsZXZlbChpbnQgbG9nbGV2ZWwpOwordm9pZCBjb21lZGlfcGVycm9yKGNvbnN0IGNoYXIgKnMpOworY2hhciAqY29tZWRpX3N0cmVycm9yKGludCBlcnJudW0pOworaW50IGNvbWVkaV9lcnJubyh2b2lkKTsKK2ludCBjb21lZGlfZmlsZW5vKGNvbWVkaV90ICpkZXYpOworCitpbnQgY29tZWRpX2NhbmNlbChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfcmVnaXN0ZXJfY2FsbGJhY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZyk7CisKK2ludCBjb21lZGlfY29tbWFuZChjb21lZGlfdCAqZGV2LCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QoY29tZWRpX3QgKmRldiwgY29tZWRpX2NtZCAqY21kKTsKK2ludCBjb21lZGlfdHJpZ2dlcihjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IF9fY29tZWRpX3RyaWdnZXIoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBjb21lZGlfZGF0YV93cml0ZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICpkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkX2hpbnQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZik7CitpbnQgY29tZWRpX2RhdGFfcmVhZF9kZWxheWVkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsCisJbHNhbXBsX3QgKmRhdGEsIHVuc2lnbmVkIGludCBuYW5vX3NlYyk7CitpbnQgY29tZWRpX2Rpb19jb25maWcoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IGlvKTsKK2ludCBjb21lZGlfZGlvX3JlYWQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50ICp2YWwpOworaW50IGNvbWVkaV9kaW9fd3JpdGUoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHZhbCk7CitpbnQgY29tZWRpX2Rpb19iaXRmaWVsZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgbWFzaywKKwl1bnNpZ25lZCBpbnQgKmJpdHMpOworaW50IGNvbWVkaV9nZXRfbl9zdWJkZXZpY2VzKGNvbWVkaV90ICpkZXYpOworaW50IGNvbWVkaV9nZXRfdmVyc2lvbl9jb2RlKGNvbWVkaV90ICpkZXYpOworY29uc3QgY2hhciAqY29tZWRpX2dldF9kcml2ZXJfbmFtZShjb21lZGlfdCAqZGV2KTsKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfYm9hcmRfbmFtZShjb21lZGlfdCAqZGV2KTsKK2ludCBjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKGNvbWVkaV90ICpkZXYsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgc3ViZCk7CitpbnQgY29tZWRpX2dldF9uX2NoYW5uZWxzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkCisJaW50IGNoYW4pOworaW50IGNvbWVkaV9nZXRfbl9yYW5nZXMoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbik7CitpbnQgY29tZWRpX2RvX2luc24oY29tZWRpX3QgKmRldiwgY29tZWRpX2luc24gKmluc24pOworaW50IGNvbWVkaV9wb2xsKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisvKiBERVBSRUNBVEVEIGZ1bmN0aW9ucyAqLworaW50IGNvbWVkaV9nZXRfcmFuZ2V0eXBlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pOworCisvKiBBTFBIQSBmdW5jdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2xlbl9jaGFubGlzdChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2tyYW5nZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQKKwljaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9idWZfaGVhZF9wb3MoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX3NldF91c2VyX2ludF9jb3VudChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBidWZfdXNlcl9jb3VudCk7CitpbnQgY29tZWRpX21hcChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB2b2lkICpwdHIpOworaW50IGNvbWVkaV91bm1hcChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9zaXplKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl9yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CitpbnQgY29tZWRpX21hcmtfYnVmZmVyX3dyaXR0ZW4oY29tZWRpX3QgKmQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcyk7CitpbnQgY29tZWRpX2dldF9idWZmZXJfY29udGVudHMoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9idWZmZXJfb2Zmc2V0KGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworCisjZWxzZQorCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBjYWxsZWQgYXQgcmVhbC10aW1lIHByaW9yaXR5ICovCisKK2ludCBjb21lZGlfb3Blbih1bnNpZ25lZCBpbnQgbWlub3IpOwordm9pZCBjb21lZGlfY2xvc2UodW5zaWduZWQgaW50IG1pbm9yKTsKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHByaW9yaXR5LCBidXQgbWF5IGZhaWwgYXQKKyAgIHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX2xvY2sodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfdW5sb2NrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IHlvdSBtdXN0IGhvbGQKKyAgIHRoZSBsb2NrIGZvciB0aGUgc3ViZGV2aWNlICovCisKK2ludCBjb21lZGlfY2FuY2VsKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZyk7CisKK2ludCBjb21lZGlfY29tbWFuZCh1bnNpZ25lZCBpbnQgbWlub3IsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX2NvbW1hbmRfdGVzdCh1bnNpZ25lZCBpbnQgbWlub3IsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX3RyaWdnZXIodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IF9fY29tZWRpX3RyaWdnZXIodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2LCBjb21lZGlfdHJpZyAqaXQpOworaW50IGNvbWVkaV9kYXRhX3dyaXRlKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90IGRhdGEpOworaW50IGNvbWVkaV9kYXRhX3JlYWQodW5zaWduZWQgaW50IGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgKmRhdGEpOworaW50IGNvbWVkaV9kaW9fY29uZmlnKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCBpbyk7CitpbnQgY29tZWRpX2Rpb19yZWFkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBjb21lZGlfZGlvX3dyaXRlKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCB2YWwpOworaW50IGNvbWVkaV9kaW9fYml0ZmllbGQodW5zaWduZWQgaW50IGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwKKwl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50ICpiaXRzKTsKK2ludCBjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyh1bnNpZ25lZCBpbnQgZGV2KTsKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZSh1bnNpZ25lZCBpbnQgZGV2KTsKK2NoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUodW5zaWduZWQgaW50IGRldik7CitjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUodW5zaWduZWQgaW50IG1pbm9yKTsKK2ludCBjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUodW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdHlwZSwKKwl1bnNpZ25lZCBpbnQgc3ViZCk7CitpbnQgY29tZWRpX2dldF9uX2NoYW5uZWxzKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7Citsc2FtcGxfdCBjb21lZGlfZ2V0X21heGRhdGEodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZAorCWludCBjaGFuKTsKK2ludCBjb21lZGlfZ2V0X25fcmFuZ2VzKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbik7CitpbnQgY29tZWRpX2RvX2luc24odW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfaW5zbiAqaW5zbik7CitpbnQgY29tZWRpX3BvbGwodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogREVQUkVDQVRFRCBmdW5jdGlvbnMgKi8KK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pOworCisvKiBBTFBIQSBmdW5jdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludAorCXN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9sZW5fY2hhbmxpc3QodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZ2V0X2tyYW5nZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgY29tZWRpX2tyYW5nZSAqa3JhbmdlKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X2J1Zl9oZWFkX3Bvcyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludAorCXN1YmRldmljZSk7CitpbnQgY29tZWRpX3NldF91c2VyX2ludF9jb3VudCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGJ1Zl91c2VyX2NvdW50KTsKK2ludCBjb21lZGlfbWFwKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgdm9pZCAqKnB0cik7CitpbnQgY29tZWRpX3VubWFwKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzNzJiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0wLDAgKzEsODQ2IEBACisvKgorICAgIG1vZHVsZS9kcml2ZXJzLmMKKyAgICBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBkcml2ZXJzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpX2ZvcHMuaCIKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNvbWVkaWRldi5oIgorI2luY2x1ZGUgIndyYXBwZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CS8qIGZvciBTdVNFIGJyb2tlbm5lc3MgKi8KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBpbnQgcG9zdGNvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5zbl9yd19lbXVsYXRlX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIHZvaWQgKmNvbWVkaV9yZWNvZ25pemUoY29tZWRpX2RyaXZlciAqIGRyaXYsIGNvbnN0IGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgY29tZWRpX3JlcG9ydF9ib2FyZHMoY29tZWRpX2RyaXZlciAqIGRyaXYpOworc3RhdGljIGludCBwb2xsX2ludmFsaWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworaW50IGNvbWVkaV9idWZfYWxsb2MoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSk7CisKK2NvbWVkaV9kcml2ZXIgKmNvbWVkaV9kcml2ZXJzOworCitpbnQgY29tZWRpX21vZHByb2JlKGludCBtaW5vcikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9kZXZpY2UoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJaWYgKGRldi0+c3ViZGV2aWNlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CisJCQljb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3Iocyk7CisJCQlpZiAocy0+YXN5bmMpIHsKKwkJCQljb21lZGlfYnVmX2FsbG9jKGRldiwgcywgMCk7CisJCQkJa2ZyZWUocy0+YXN5bmMpOworCQkJfQorCQl9CisJCWtmcmVlKGRldi0+c3ViZGV2aWNlcyk7CisJCWRldi0+c3ViZGV2aWNlcyA9IE5VTEw7CisJCWRldi0+bl9zdWJkZXZpY2VzID0gMDsKKwl9CisJaWYgKGRldi0+cHJpdmF0ZSkgeworCQlrZnJlZShkZXYtPnByaXZhdGUpOworCQlkZXYtPnByaXZhdGUgPSBOVUxMOworCX0KKwlkZXYtPmRyaXZlciA9IDA7CisJZGV2LT5ib2FyZF9uYW1lID0gTlVMTDsKKwlkZXYtPmJvYXJkX3B0ciA9IE5VTEw7CisJZGV2LT5pb2Jhc2UgPSAwOworCWRldi0+aXJxID0gMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gTlVMTDsKKwlkZXYtPndyaXRlX3N1YmRldiA9IE5VTEw7CisJZGV2LT5vcGVuID0gTlVMTDsKKwlkZXYtPmNsb3NlID0gTlVMTDsKKwljb21lZGlfc2V0X2h3X2RldihkZXYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJZGV2LT5hdHRhY2hlZCA9IDA7CisJaWYgKGRldi0+ZHJpdmVyKSB7CisJCWRldi0+ZHJpdmVyLT5kZXRhY2goZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoIkJVRzogZGV2LT5kcml2ZXI9TlVMTCBpbiBjb21lZGlfZGV2aWNlX2RldGFjaCgpXG4iKTsKKwl9CisJY2xlYW51cF9kZXZpY2UoZGV2KTsKK30KKwordm9pZCBjb21lZGlfZGV2aWNlX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuOworCV9fY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKK30KKworaW50IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwljb21lZGlfZHJpdmVyICpkcml2OworCWludCByZXQ7CisKKwlpZiAoZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoZHJpdiA9IGNvbWVkaV9kcml2ZXJzOyBkcml2OyBkcml2ID0gZHJpdi0+bmV4dCkgeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRyaXYtPm1vZHVsZSkpIHsKKwkJCXByaW50aygiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGRyaXYtPm51bV9uYW1lcykgeworCQkJZGV2LT5ib2FyZF9wdHIgPSBjb21lZGlfcmVjb2duaXplKGRyaXYsIGl0LT5ib2FyZF9uYW1lKTsKKwkJCWlmIChkZXYtPmJvYXJkX3B0ciA9PSBOVUxMKSB7CisJCQkJbW9kdWxlX3B1dChkcml2LT5tb2R1bGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0cmNtcChkcml2LT5kcml2ZXJfbmFtZSwgaXQtPmJvYXJkX25hbWUpKSB7CisJCQkJbW9kdWxlX3B1dChkcml2LT5tb2R1bGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCS8vaW5pdGlhbGl6ZSBkZXYtPmRyaXZlciBoZXJlIHNvIGNvbWVkaV9lcnJvcigpIGNhbiBiZSBjYWxsZWQgZnJvbSBhdHRhY2gKKwkJZGV2LT5kcml2ZXIgPSBkcml2OworCQlyZXQgPSBkcml2LT5hdHRhY2goZGV2LCBpdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCQkJX19jb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlnb3RvIGF0dGFjaGVkOworCX0KKworCS8vIHJlY29nbml6ZSBoYXMgZmFpbGVkIGlmIHdlIGdldCBoZXJlCisJLy8gcmVwb3J0IHZhbGlkIGJvYXJkIG5hbWVzIGJlZm9yZSByZXR1cm5pbmcgZXJyb3IKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2LT5tb2R1bGUpKSB7CisJCQlwcmludGsoImNvbWVkaTogZmFpbGVkIHRvIGluY3JlbWVudCBtb2R1bGUgY291bnRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJY29tZWRpX3JlcG9ydF9ib2FyZHMoZHJpdik7CisJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwl9CisJcmV0dXJuIC1FSU87CisKK2F0dGFjaGVkOgorCS8qIGRvIGEgbGl0dGxlIHBvc3QtY29uZmlnIGNsZWFudXAgKi8KKwlyZXQgPSBwb3N0Y29uZmlnKGRldik7CisJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKwlpZiAocmV0IDwgMCkgeworCQlfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFkZXYtPmJvYXJkX25hbWUpIHsKKwkJcHJpbnRrKCJCVUc6IGRldi0+Ym9hcmRfbmFtZT08JXA+XG4iLCBkZXYtPmJvYXJkX25hbWUpOworCQlkZXYtPmJvYXJkX25hbWUgPSAiQlVHIjsKKwl9CisJc21wX3dtYigpOworCWRldi0+YXR0YWNoZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKGNvbWVkaV9kcml2ZXIgKiBkcml2ZXIpCit7CisJZHJpdmVyLT5uZXh0ID0gY29tZWRpX2RyaXZlcnM7CisJY29tZWRpX2RyaXZlcnMgPSBkcml2ZXI7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcihjb21lZGlfZHJpdmVyICogZHJpdmVyKQoreworCWNvbWVkaV9kcml2ZXIgKnByZXY7CisJaW50IGk7CisKKwkvKiBjaGVjayBmb3IgZGV2aWNlcyB1c2luZyB0aGlzIGRyaXZlciAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgaSsrKSB7CisJCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhpKTsKKwkJY29tZWRpX2RldmljZSAqZGV2OworCisJCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkgY29udGludWU7CisJCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT5kcml2ZXIgPT0gZHJpdmVyKSB7CisJCQlpZiAoZGV2LT51c2VfY291bnQpCisJCQkJcHJpbnRrKCJCVUchIGRldGFjaGluZyBkZXZpY2Ugd2l0aCB1c2VfY291bnQ9JWRcbiIsIGRldi0+dXNlX2NvdW50KTsKKwkJCWNvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwl9CisKKwlpZiAoY29tZWRpX2RyaXZlcnMgPT0gZHJpdmVyKSB7CisJCWNvbWVkaV9kcml2ZXJzID0gZHJpdmVyLT5uZXh0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKHByZXYgPSBjb21lZGlfZHJpdmVyczsgcHJldi0+bmV4dDsgcHJldiA9IHByZXYtPm5leHQpIHsKKwkJaWYgKHByZXYtPm5leHQgPT0gZHJpdmVyKSB7CisJCQlwcmV2LT5uZXh0ID0gZHJpdmVyLT5uZXh0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcG9zdGNvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2KQoreworCWludCBpOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYyA9IE5VTEw7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCisJCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzLT5sZW5fY2hhbmxpc3QgPT0gMCkKKwkJCXMtPmxlbl9jaGFubGlzdCA9IDE7CisKKwkJaWYgKHMtPmRvX2NtZCkgeworCQkJQlVHX09OKChzLT5zdWJkZXZfZmxhZ3MgJiAoU0RGX0NNRF9SRUFEIHwKKwkJCQlTREZfQ01EX1dSSVRFKSkgPT0gMCk7CisJCQlCVUdfT04oIXMtPmRvX2NtZHRlc3QpOworCisJCQlhc3luYyA9IGt6YWxsb2Moc2l6ZW9mKGNvbWVkaV9hc3luYyksIEdGUF9LRVJORUwpOworCQkJaWYgKGFzeW5jID09IE5VTEwpIHsKKwkJCQlwcmludGsoImZhaWxlZCB0byBhbGxvY2F0ZSBhc3luYyBzdHJ1Y3RcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmYXN5bmMtPndhaXRfaGVhZCk7CisJCQlhc3luYy0+c3ViZGV2aWNlID0gczsKKwkJCXMtPmFzeW5jID0gYXN5bmM7CisKKyNkZWZpbmUgREVGQVVMVF9CVUZfTUFYU0laRSAoNjQqMTAyNCkKKyNkZWZpbmUgREVGQVVMVF9CVUZfU0laRSAoNjQqMTAyNCkKKworCQkJYXN5bmMtPm1heF9idWZzaXplID0gREVGQVVMVF9CVUZfTUFYU0laRTsKKworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZiA9IE5VTEw7CisJCQlhc3luYy0+cHJlYWxsb2NfYnVmc3ogPSAwOworCQkJaWYgKGNvbWVkaV9idWZfYWxsb2MoZGV2LCBzLCBERUZBVUxUX0JVRl9TSVpFKSA8IDApIHsKKwkJCQlwcmludGsoIkJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlpZiAocy0+YnVmX2NoYW5nZSkgeworCQkJCXJldCA9IHMtPmJ1Zl9jaGFuZ2UoZGV2LCBzLCBERUZBVUxUX0JVRl9TSVpFKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWNvbWVkaV9hbGxvY19zdWJkZXZpY2VfbWlub3IoZGV2LCBzKTsKKwkJfQorCisJCWlmICghcy0+cmFuZ2VfdGFibGUgJiYgIXMtPnJhbmdlX3RhYmxlX2xpc3QpCisJCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV91bmtub3duOworCisJCWlmICghcy0+aW5zbl9yZWFkICYmIHMtPmluc25fYml0cykKKwkJCXMtPmluc25fcmVhZCA9IGluc25fcndfZW11bGF0ZV9iaXRzOworCQlpZiAoIXMtPmluc25fd3JpdGUgJiYgcy0+aW5zbl9iaXRzKQorCQkJcy0+aW5zbl93cml0ZSA9IGluc25fcndfZW11bGF0ZV9iaXRzOworCisJCWlmICghcy0+aW5zbl9yZWFkKQorCQkJcy0+aW5zbl9yZWFkID0gaW5zbl9pbnZhbDsKKwkJaWYgKCFzLT5pbnNuX3dyaXRlKQorCQkJcy0+aW5zbl93cml0ZSA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl9iaXRzKQorCQkJcy0+aW5zbl9iaXRzID0gaW5zbl9pbnZhbDsKKwkJaWYgKCFzLT5pbnNuX2NvbmZpZykKKwkJCXMtPmluc25fY29uZmlnID0gaW5zbl9pbnZhbDsKKworCQlpZiAoIXMtPnBvbGwpCisJCQlzLT5wb2xsID0gcG9sbF9pbnZhbGlkOworCX0KKworCXJldHVybiAwOworfQorCisvLyBnZW5lcmljIHJlY29nbml6ZSBmdW5jdGlvbiBmb3IgZHJpdmVycyB0aGF0IHJlZ2lzdGVyIHRoZWlyIHN1cHBvcnRlZCBib2FyZCBuYW1lcwordm9pZCAqY29tZWRpX3JlY29nbml6ZShjb21lZGlfZHJpdmVyICogZHJpdiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpOworCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lX3B0ciA9IGRyaXYtPmJvYXJkX25hbWU7CisJZm9yIChpID0gMDsgaSA8IGRyaXYtPm51bV9uYW1lczsgaSsrKSB7CisJCWlmIChzdHJjbXAoKm5hbWVfcHRyLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh2b2lkICopbmFtZV9wdHI7CisJCW5hbWVfcHRyID0KKwkJCShjb25zdCBjaGFyICpjb25zdCAqKSgoY29uc3QgY2hhciAqKW5hbWVfcHRyICsKKwkJCWRyaXYtPm9mZnNldCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgY29tZWRpX3JlcG9ydF9ib2FyZHMoY29tZWRpX2RyaXZlciAqIGRyaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqY29uc3QgKm5hbWVfcHRyOworCisJcHJpbnRrKCJjb21lZGk6IHZhbGlkIGJvYXJkIG5hbWVzIGZvciAlcyBkcml2ZXIgYXJlOlxuIiwKKwkJZHJpdi0+ZHJpdmVyX25hbWUpOworCisJbmFtZV9wdHIgPSBkcml2LT5ib2FyZF9uYW1lOworCWZvciAoaSA9IDA7IGkgPCBkcml2LT5udW1fbmFtZXM7IGkrKykgeworCQlwcmludGsoIiAlc1xuIiwgKm5hbWVfcHRyKTsKKwkJbmFtZV9wdHIgPSAoY29uc3QgY2hhciAqKikoKGNoYXIgKiluYW1lX3B0ciArIGRyaXYtPm9mZnNldCk7CisJfQorCisJaWYgKGRyaXYtPm51bV9uYW1lcyA9PSAwKQorCQlwcmludGsoIiAlc1xuIiwgZHJpdi0+ZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgaW50IHBvbGxfaW52YWxpZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGluc25faW52YWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaW5zbl9yd19lbXVsYXRlX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJY29tZWRpX2luc24gbmV3X2luc247CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbHNfcGVyX2JpdGZpZWxkID0gMzI7CisKKwl1bnNpZ25lZCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJY29uc3QgdW5zaWduZWQgYmFzZV9iaXRmaWVsZF9jaGFubmVsID0KKwkJKGNoYW4gPCBjaGFubmVsc19wZXJfYml0ZmllbGQpID8gMCA6IGNoYW47CisJbHNhbXBsX3QgbmV3X2RhdGFbMl07CisJbWVtc2V0KG5ld19kYXRhLCAwLCBzaXplb2YobmV3X2RhdGEpKTsKKwltZW1zZXQoJm5ld19pbnNuLCAwLCBzaXplb2YobmV3X2luc24pKTsKKwluZXdfaW5zbi5pbnNuID0gSU5TTl9CSVRTOworCW5ld19pbnNuLmNoYW5zcGVjID0gYmFzZV9iaXRmaWVsZF9jaGFubmVsOworCW5ld19pbnNuLm4gPSAyOworCW5ld19pbnNuLmRhdGEgPSBuZXdfZGF0YTsKKwluZXdfaW5zbi5zdWJkZXYgPSBpbnNuLT5zdWJkZXY7CisKKwlpZiAoaW5zbi0+aW5zbiA9PSBJTlNOX1dSSVRFKSB7CisJCWlmICghKHMtPnN1YmRldl9mbGFncyAmIFNERl9XUklUQUJMRSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmV3X2RhdGFbMF0gPSAxIDw8IChjaGFuIC0gYmFzZV9iaXRmaWVsZF9jaGFubmVsKTsJLyogbWFzayAqLworCQluZXdfZGF0YVsxXSA9IGRhdGFbMF0gPyAoMSA8PCAoY2hhbiAtIGJhc2VfYml0ZmllbGRfY2hhbm5lbCkpIDogMDsJLyogYml0cyAqLworCX0KKworCXJldCA9IHMtPmluc25fYml0cyhkZXYsIHMsICZuZXdfaW5zbiwgbmV3X2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGluc24tPmluc24gPT0gSU5TTl9SRUFEKSB7CisJCWRhdGFbMF0gPSAobmV3X2RhdGFbMV0gPj4gKGNoYW4gLSBiYXNlX2JpdGZpZWxkX2NoYW5uZWwpKSAmIDE7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB1dmlydF90b19rdmEocGdkX3QgKiBwZ2QsIHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMFVMOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZXAsIHB0ZTsKKwlwdWRfdCAqcHVkOworCisJaWYgKCFwZ2Rfbm9uZSgqcGdkKSkgeworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRyKTsKKwkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkcik7CisJCWlmICghcG1kX25vbmUoKnBtZCkpIHsKKwkJCXB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkcik7CisJCQlwdGUgPSAqcHRlcDsKKwkJCWlmIChwdGVfcHJlc2VudChwdGUpKSB7CisJCQkJcmV0ID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCXBhZ2VfYWRkcmVzcyhwdGVfcGFnZShwdGUpKTsKKwkJCQlyZXQgfD0gKGFkciAmIChQQUdFX1NJWkUgLSAxKSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2aXJ0X3RvX2t2YSh1bnNpZ25lZCBsb25nIGFkcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhLCBrdmE7CisKKwl2YSA9IGFkcjsKKwlrdmEgPSB1dmlydF90b19rdmEocGdkX29mZnNldF9rKHZhKSwgdmEpOworCisJcmV0dXJuIGt2YTsKK30KKworaW50IGNvbWVkaV9idWZfYWxsb2MoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgbG9uZyBuZXdfc2l6ZSkKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CisKKwkvKiBSb3VuZCB1cCBuZXdfc2l6ZSB0byBtdWx0aXBsZSBvZiBQQUdFX1NJWkUgKi8KKwluZXdfc2l6ZSA9IChuZXdfc2l6ZSArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLOworCisJLyogaWYgbm8gY2hhbmdlIGlzIHJlcXVpcmVkLCBkbyBub3RoaW5nICovCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYgJiYgYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID09IG5ld19zaXplKSB7CisJCXJldHVybiAwOworCX0KKwkvLyBkZWFsbG9jYXRlIG9sZCBidWZmZXIKKwlpZiAoYXN5bmMtPnByZWFsbG9jX2J1ZikgeworCQl2dW5tYXAoYXN5bmMtPnByZWFsbG9jX2J1Zik7CisJCWFzeW5jLT5wcmVhbGxvY19idWYgPSBOVUxMOworCQlhc3luYy0+cHJlYWxsb2NfYnVmc3ogPSAwOworCX0KKwlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGFzeW5jLT5uX2J1Zl9wYWdlczsgKytpKSB7CisJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSB7CisJCQkJbWVtX21hcF91bnJlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSk7CisJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQlQQUdFX1NJWkUsCisJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCXZpcnRfYWRkciwKKwkJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJZG1hX2FkZHIpOworCQkJCX0gZWxzZSB7CisJCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylhc3luYy0+CisJCQkJCQlidWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcik7CisJCQkJfQorCQkJfQorCQl9CisJCXZmcmVlKGFzeW5jLT5idWZfcGFnZV9saXN0KTsKKwkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPSBOVUxMOworCQlhc3luYy0+bl9idWZfcGFnZXMgPSAwOworCX0KKwkvLyBhbGxvY2F0ZSBuZXcgYnVmZmVyCisJaWYgKG5ld19zaXplKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl1bnNpZ25lZCBuX3BhZ2VzID0gbmV3X3NpemUgPj4gUEFHRV9TSElGVDsKKwkJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CisKKwkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPQorCQkJdm1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9idWZfcGFnZSkgKiBuX3BhZ2VzKTsKKwkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7CisJCQltZW1zZXQoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QsIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CisJCQlwYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbl9wYWdlcyk7CisJCX0KKwkJaWYgKHBhZ2VzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyID0KKwkJCQkJCWRtYV9hbGxvY19jb2hlcmVudChkZXYtPmh3X2RldiwKKwkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCSZhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCWRtYV9hZGRyLAorCQkJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX0NPTVApOworCQkJCX0gZWxzZSB7CisJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9CisJCQkJCQkodm9pZCAqKQorCQkJCQkJZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQkJCX0KKwkJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyID09IE5VTEwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1lbV9tYXBfcmVzZXJ2ZSh2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpKTsKKwkJCQlwYWdlc1tpXSA9CisJCQkJCXZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJdmlydF9hZGRyKTsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBuX3BhZ2VzKSB7CisJCQlhc3luYy0+cHJlYWxsb2NfYnVmID0KKwkJCQl2bWFwKHBhZ2VzLCBuX3BhZ2VzLCBWTV9NQVAsCisJCQkJUEFHRV9LRVJORUxfTk9DQUNIRSk7CisJCX0KKwkJaWYgKHBhZ2VzKSB7CisJCQl2ZnJlZShwYWdlcyk7CisJCX0KKwkJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYgPT0gTlVMTCkgeworCQkJLyogU29tZSBhbGxvY2F0aW9uIGZhaWxlZCBhYm92ZS4gKi8KKwkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdCkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBuX3BhZ2VzOyBpKyspIHsKKwkJCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9PQorCQkJCQkJTlVMTCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtX21hcF91bnJlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCQlidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkcikpOworCQkJCQlpZiAocy0+YXN5bmNfZG1hX2RpciAhPSBETUFfTk9ORSkgeworCQkJCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQkJUEFHRV9TSVpFLAorCQkJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkciwKKwkJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQlkbWFfYWRkcik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXN5bmMtPgorCQkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJdmlydF9hZGRyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl2ZnJlZShhc3luYy0+YnVmX3BhZ2VfbGlzdCk7CisJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3QgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYXN5bmMtPm5fYnVmX3BhZ2VzID0gbl9wYWdlczsKKwl9CisJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gbmV3X3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworLyogbXVuZ2luZyBpcyBhcHBsaWVkIHRvIGRhdGEgYnkgY29yZSBhcyBpdCBwYXNzZXMgYmV0d2VlbiB1c2VyCisgKiBhbmQga2VybmVsIHNwYWNlICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl9tdW5nZShjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzID0gYXN5bmMtPnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCWNvbnN0IHVuc2lnbmVkIG51bV9zYW1wbGVfYnl0ZXMgPSBieXRlc19wZXJfc2FtcGxlKHMpOworCisJaWYgKHMtPm11bmdlID09IE5VTEwgfHwgKGFzeW5jLT5jbWQuZmxhZ3MgJiBDTURGX1JBV0RBVEEpKSB7CisJCWFzeW5jLT5tdW5nZV9jb3VudCArPSBudW1fYnl0ZXM7CisJCWlmICgoaW50KShhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50KSA+IDApCisJCQlCVUcoKTsKKwkJcmV0dXJuIG51bV9ieXRlczsKKwl9CisJLyogZG9uJ3QgbXVuZ2UgcGFydGlhbCBzYW1wbGVzICovCisJbnVtX2J5dGVzIC09IG51bV9ieXRlcyAlIG51bV9zYW1wbGVfYnl0ZXM7CisJd2hpbGUgKGNvdW50IDwgbnVtX2J5dGVzKSB7CisJCWludCBibG9ja19zaXplOworCisJCWJsb2NrX3NpemUgPSBudW1fYnl0ZXMgLSBjb3VudDsKKwkJaWYgKGJsb2NrX3NpemUgPCAwKSB7CisJCQlydF9wcmludGsoIiVzOiAlczogYnVnISBibG9ja19zaXplIGlzIG5lZ2F0aXZlXG4iLAorCQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChpbnQpKGFzeW5jLT5tdW5nZV9wdHIgKyBibG9ja19zaXplIC0KKwkJCQlhc3luYy0+cHJlYWxsb2NfYnVmc3opID4gMCkKKwkJCWJsb2NrX3NpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+bXVuZ2VfcHRyOworCisJCXMtPm11bmdlKHMtPmRldmljZSwgcywgYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5tdW5nZV9wdHIsCisJCQlibG9ja19zaXplLCBhc3luYy0+bXVuZ2VfY2hhbik7CisKKwkJc21wX3dtYigpOwkvL2JhcnJpZXIgaW5zdXJlcyBkYXRhIGlzIG11bmdlZCBpbiBidWZmZXIgYmVmb3JlIG11bmdlX2NvdW50IGlzIGluY3JlbWVudGVkCisKKwkJYXN5bmMtPm11bmdlX2NoYW4gKz0gYmxvY2tfc2l6ZSAvIG51bV9zYW1wbGVfYnl0ZXM7CisJCWFzeW5jLT5tdW5nZV9jaGFuICU9IGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlhc3luYy0+bXVuZ2VfY291bnQgKz0gYmxvY2tfc2l6ZTsKKwkJYXN5bmMtPm11bmdlX3B0ciArPSBibG9ja19zaXplOworCQlhc3luYy0+bXVuZ2VfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwkJY291bnQgKz0gYmxvY2tfc2l6ZTsKKwl9CisJaWYgKChpbnQpKGFzeW5jLT5tdW5nZV9jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQpID4gMCkKKwkJQlVHKCk7CisJcmV0dXJuIGNvdW50OworfQorCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQ7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZyZWVfZW5kID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICsgYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCW5ieXRlcyA9IGZyZWVfZW5kIC0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudDsKKwluYnl0ZXMgLT0gbmJ5dGVzICUgYnl0ZXNfcGVyX3NhbXBsZShhc3luYy0+c3ViZGV2aWNlKTsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgYnVmX3JlYWRfY291bnQgaW4gdGhpcworCSAgIHF1ZXJ5IG9jY3VycyBiZWZvcmUgYW55IGZvbGxvd2luZyB3cml0ZXMgdG8gdGhlIGJ1ZmZlciB3aGljaAorCSAgIG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIHF1ZXJ5LgorCSAqLworCXNtcF9tYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBjaHVuayBmb3IgdGhlIHdyaXRlciBmcm9tIGZyZWUgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQgPSBhc3luYy0+YnVmX3JlYWRfY291bnQgKyBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArIG5ieXRlcyAtIGZyZWVfZW5kKSA+IDApIHsKKwkJbmJ5dGVzID0gZnJlZV9lbmQgLSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ICs9IG5ieXRlczsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgYnVmX3JlYWRfY291bnQgYWJvdmUgb2NjdXJzIGJlZm9yZQorCSAgIHdlIHdyaXRlIGRhdGEgdG8gdGhlIHdyaXRlLWFsbG9jJ2VkIGJ1ZmZlciBzcGFjZSAqLworCXNtcF9tYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBub3RoaW5nIHVubGVzcyBpdCBjYW4gY29tcGxldGVseSBmdWxmaWxsIHRoZSByZXF1ZXN0ICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvY19zdHJpY3QoY29tZWRpX2FzeW5jICogYXN5bmMsCisJdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQgPSBhc3luYy0+YnVmX3JlYWRfY291bnQgKyBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArIG5ieXRlcyAtIGZyZWVfZW5kKSA+IDApIHsKKwkJbmJ5dGVzID0gMDsKKwl9CisJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArPSBuYnl0ZXM7CisJLyogYmFycmllciBpbnN1cmVzIHRoZSByZWFkIG9mIGJ1Zl9yZWFkX2NvdW50IGFib3ZlIG9jY3VycyBiZWZvcmUKKwkgICB3ZSB3cml0ZSBkYXRhIHRvIHRoZSB3cml0ZS1hbGxvYydlZCBidWZmZXIgc3BhY2UgKi8KKwlzbXBfbWIoKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiB0cmFuc2ZlcnMgYSBjaHVuayBmcm9tIHdyaXRlciB0byBmaWxsZWQgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX2ZyZWUoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJaWYgKChpbnQpKGFzeW5jLT5idWZfd3JpdGVfY291bnQgKyBuYnl0ZXMgLQorCQkJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCkgPiAwKSB7CisJCXJ0X3ByaW50aworCQkJKCJjb21lZGk6IGF0dGVtcHRlZCB0byB3cml0ZS1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gd3JpdGUtYWxsb2NhdGVkLlxuIik7CisJCW5ieXRlcyA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3dyaXRlX2NvdW50ICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3dyaXRlX3B0ciArPSBuYnl0ZXM7CisJY29tZWRpX2J1Zl9tdW5nZShhc3luYywgYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCAtIGFzeW5jLT5tdW5nZV9jb3VudCk7CisJaWYgKGFzeW5jLT5idWZfd3JpdGVfcHRyID49IGFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlhc3luYy0+YnVmX3dyaXRlX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJfQorCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBhIGNodW5rIGZvciB0aGUgcmVhZGVyIGZyb20gZmlsbGVkIChhbmQgbXVuZ2VkKSBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9hbGxvYyhjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgbmJ5dGVzKQoreworCWlmICgoaW50KShhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQgKyBuYnl0ZXMgLSBhc3luYy0+bXVuZ2VfY291bnQpID4KKwkJMCkgeworCQluYnl0ZXMgPSBhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQ7CisJfQorCWFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCArPSBuYnl0ZXM7CisJLyogYmFycmllciBpbnN1cmVzIHJlYWQgb2YgbXVuZ2VfY291bnQgb2NjdXJzIGJlZm9yZSB3ZSBhY3R1YWxseSByZWFkCisJICAgZGF0YSBvdXQgb2YgYnVmZmVyICovCisJc21wX3JtYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIHRyYW5zZmVycyBjb250cm9sIG9mIGEgY2h1bmsgZnJvbSByZWFkZXIgdG8gZnJlZSBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9mcmVlKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCS8vIGJhcnJpZXIgaW5zdXJlcyBkYXRhIGhhcyBiZWVuIHJlYWQgb3V0IG9mIGJ1ZmZlciBiZWZvcmUgcmVhZCBjb3VudCBpcyBpbmNyZW1lbnRlZAorCXNtcF9tYigpOworCWlmICgoaW50KShhc3luYy0+YnVmX3JlYWRfY291bnQgKyBuYnl0ZXMgLQorCQkJYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrCisJCQkoImNvbWVkaTogYXR0ZW1wdGVkIHRvIHJlYWQtZnJlZSBtb3JlIGJ5dGVzIHRoYW4gaGF2ZSBiZWVuIHJlYWQtYWxsb2NhdGVkLlxuIik7CisJCW5ieXRlcyA9IGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwl9CisJYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3JlYWRfcHRyICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3JlYWRfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwlyZXR1cm4gbmJ5dGVzOworfQorCit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X3RvKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJdW5zaWduZWQgaW50IHdyaXRlX3B0ciA9IGFzeW5jLT5idWZfd3JpdGVfcHRyICsgb2Zmc2V0OworCisJaWYgKHdyaXRlX3B0ciA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCXdyaXRlX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwl3aGlsZSAobnVtX2J5dGVzKSB7CisJCXVuc2lnbmVkIGludCBibG9ja19zaXplOworCisJCWlmICh3cml0ZV9wdHIgKyBudW1fYnl0ZXMgPiBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCQlibG9ja19zaXplID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gd3JpdGVfcHRyOworCQllbHNlCisJCQlibG9ja19zaXplID0gbnVtX2J5dGVzOworCisJCW1lbWNweShhc3luYy0+cHJlYWxsb2NfYnVmICsgd3JpdGVfcHRyLCBkYXRhLCBibG9ja19zaXplKTsKKworCQlkYXRhICs9IGJsb2NrX3NpemU7CisJCW51bV9ieXRlcyAtPSBibG9ja19zaXplOworCisJCXdyaXRlX3B0ciA9IDA7CisJfQorfQorCit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X2Zyb20oY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJdm9pZCAqZGVzdCwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl2b2lkICpzcmM7CisJdW5zaWduZWQgaW50IHJlYWRfcHRyID0gYXN5bmMtPmJ1Zl9yZWFkX3B0ciArIG9mZnNldDsKKworCWlmIChyZWFkX3B0ciA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCXJlYWRfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKworCXdoaWxlIChuYnl0ZXMpIHsKKwkJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisKKwkJc3JjID0gYXN5bmMtPnByZWFsbG9jX2J1ZiArIHJlYWRfcHRyOworCisJCWlmIChuYnl0ZXMgPj0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gcmVhZF9wdHIpCisJCQlibG9ja19zaXplID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gcmVhZF9wdHI7CisJCWVsc2UKKwkJCWJsb2NrX3NpemUgPSBuYnl0ZXM7CisKKwkJbWVtY3B5KGRlc3QsIHNyYywgYmxvY2tfc2l6ZSk7CisJCW5ieXRlcyAtPSBibG9ja19zaXplOworCQlkZXN0ICs9IGJsb2NrX3NpemU7CisJCXJlYWRfcHRyID0gMDsKKwl9Cit9CisKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJdW5zaWduZWQgbnVtX2J5dGVzOworCisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCW51bV9ieXRlcyA9IGFzeW5jLT5tdW5nZV9jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgbXVuZ2VfY291bnQgaW4gdGhpcworCSAgIHF1ZXJ5IG9jY3VycyBiZWZvcmUgYW55IGZvbGxvd2luZyByZWFkcyBvZiB0aGUgYnVmZmVyIHdoaWNoCisJICAgbWlnaHQgYmUgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgcXVlcnkuCisJICovCisJc21wX3JtYigpOworCXJldHVybiBudW1fYnl0ZXM7Cit9CisKK2ludCBjb21lZGlfYnVmX2dldChjb21lZGlfYXN5bmMgKiBhc3luYywgc2FtcGxfdCAqIHgpCit7CisJdW5zaWduZWQgaW50IG4gPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoYXN5bmMpOworCisJaWYgKG4gPCBzaXplb2Yoc2FtcGxfdCkpCisJCXJldHVybiAwOworCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKwkqeCA9ICooc2FtcGxfdCAqKSAoYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5idWZfcmVhZF9wdHIpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCXJldHVybiAxOworfQorCitpbnQgY29tZWRpX2J1Zl9wdXQoY29tZWRpX2FzeW5jICogYXN5bmMsIHNhbXBsX3QgeCkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Nfc3RyaWN0KGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCisJaWYgKG4gPCBzaXplb2Yoc2FtcGxfdCkpIHsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCXJldHVybiAwOworCX0KKwkqKHNhbXBsX3QgKikgKGFzeW5jLT5wcmVhbGxvY19idWYgKyBhc3luYy0+YnVmX3dyaXRlX3B0cikgPSB4OworCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBjb21lZGlfcmVzZXRfYXN5bmNfYnVmKGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCWFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgPSAwOworCWFzeW5jLT5idWZfd3JpdGVfY291bnQgPSAwOworCWFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCA9IDA7CisJYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ID0gMDsKKworCWFzeW5jLT5idWZfd3JpdGVfcHRyID0gMDsKKwlhc3luYy0+YnVmX3JlYWRfcHRyID0gMDsKKworCWFzeW5jLT5jdXJfY2hhbiA9IDA7CisJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgPSAwOworCWFzeW5jLT5tdW5nZV9jaGFuID0gMDsKKwlhc3luYy0+bXVuZ2VfY291bnQgPSAwOworCWFzeW5jLT5tdW5nZV9wdHIgPSAwOworCisJYXN5bmMtPmV2ZW50cyA9IDA7Cit9CisKK2ludCBjb21lZGlfYXV0b19jb25maWcoc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlLCBjb25zdCBjaGFyICpib2FyZF9uYW1lLCBjb25zdCBpbnQgKm9wdGlvbnMsIHVuc2lnbmVkIG51bV9vcHRpb25zKQoreworCWNvbWVkaV9kZXZjb25maWcgaXQ7CisJaW50IG1pbm9yOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlpbnQgcmV0dmFsOworCisJbWlub3IgPSBjb21lZGlfYWxsb2NfYm9hcmRfbWlub3IoaGFyZHdhcmVfZGV2aWNlKTsKKwlpZihtaW5vciA8IDApIHJldHVybiBtaW5vcjsKKwlkZXZfc2V0X2RydmRhdGEoaGFyZHdhcmVfZGV2aWNlLCAodm9pZCopKHVuc2lnbmVkIGxvbmcpbWlub3IpOworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisKKwltZW1zZXQoJml0LCAwLCBzaXplb2YoaXQpKTsKKwlzdHJuY3B5KGl0LmJvYXJkX25hbWUsIGJvYXJkX25hbWUsIENPTUVESV9OQU1FTEVOKTsKKwlpdC5ib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOIC0gMV0gPSAnXDAnOworCUJVR19PTihudW1fb3B0aW9ucyA+IENPTUVESV9OREVWQ09ORk9QVFMpOworCW1lbWNweShpdC5vcHRpb25zLCBvcHRpb25zLCBudW1fb3B0aW9ucyAqIHNpemVvZihpbnQpKTsKKworCW11dGV4X2xvY2soJmRldl9maWxlX2luZm8tPmRldmljZS0+bXV0ZXgpOworCXJldHZhbCA9IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGRldl9maWxlX2luZm8tPmRldmljZSwgJml0KTsKKwltdXRleF91bmxvY2soJmRldl9maWxlX2luZm8tPmRldmljZS0+bXV0ZXgpOworCWlmKHJldHZhbCA8IDApCisJeworCQljb21lZGlfZnJlZV9ib2FyZF9taW5vcihtaW5vcik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgY29tZWRpX2F1dG9fdW5jb25maWcoc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgbWlub3IgPSAodW5zaWduZWQgbG9uZylkZXZfZ2V0X2RydmRhdGEoaGFyZHdhcmVfZGV2aWNlKTsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUyk7CisKKwljb21lZGlfZnJlZV9ib2FyZF9taW5vcihtaW5vcik7Cit9CisKK2ludCBjb21lZGlfcGNpX2F1dG9fY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IGNoYXIgKmJvYXJkX25hbWUpCit7CisJaW50IG9wdGlvbnNbMl07CisKKwkvLyBwY2kgYnVzCisJb3B0aW9uc1swXSA9IHBjaWRldi0+YnVzLT5udW1iZXI7CisJLy8gcGNpIHNsb3QKKwlvcHRpb25zWzFdID0gUENJX1NMT1QocGNpZGV2LT5kZXZmbik7CisKKwlyZXR1cm4gY29tZWRpX2F1dG9fY29uZmlnKCZwY2lkZXYtPmRldiwgYm9hcmRfbmFtZSwgb3B0aW9ucywgc2l6ZW9mKG9wdGlvbnMpIC8gc2l6ZW9mKG9wdGlvbnNbMF0pKTsKK30KKwordm9pZCBjb21lZGlfcGNpX2F1dG9fdW5jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwljb21lZGlfYXV0b191bmNvbmZpZygmcGNpZGV2LT5kZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2E2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSBmb3IgaW5kaXZpZHVhbCBjb21lZGkgZHJpdmVycworIworCisjIENvbWVkaSAiaGVscGVyIiBtb2R1bGVzCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV9mYy5vCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV9ib25kLm8KK29iai0kKENPTkZJR19DT01FREkpCQkJKz0gY29tZWRpX3Rlc3Qubworb2JqLSQoQ09ORklHX0NPTUVESSkJCQkrPSBjb21lZGlfcGFycG9ydC5vCisKKyMgQ29tZWRpIFBDSSBkcml2ZXJzCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBtaXRlLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IGljcF9tdWx0aS5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBtZV9kYXEubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gbWU0MDAwLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IHJ0ZDUyMC5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBzNjI2Lm8KKworIyBDb21lZGkgVVNCIGRyaXZlcnMKK29iai0kKENPTkZJR19DT01FRElfVVNCX0RSSVZFUlMpCSs9IHVzYmR1eC5vCitvYmotJChDT05GSUdfQ09NRURJX1VTQl9EUklWRVJTKQkrPSB1c2JkdXhmYXN0Lm8KK29iai0kKENPTkZJR19DT01FRElfVVNCX0RSSVZFUlMpCSs9IGR0OTgxMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTQ5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisgICAgQSBDb21lZGkgZHJpdmVyIHRvICdib25kJyBvciBtZXJnZSBtdWx0aXBsZSBkcml2ZXJzIGFuZCBkZXZpY2VzIGFzIG9uZS4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1IENhbGluIEEuIEN1bGlhbnUgPGNhbGluQGFqdmFyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworLyoKK0RyaXZlcjogY29tZWRpX2JvbmQKK0Rlc2NyaXB0aW9uOiBBIGRyaXZlciB0byAnYm9uZCcgKG1lcmdlKSBtdWx0aXBsZSBzdWJkZXZpY2VzIGZyb20gbXVsdGlwbGUKKwkgICAgIGRldmljZXMgdG9nZXRoZXIgYXMgb25lLgorRGV2aWNlczoKK0F1dGhvcjogZHMKK1VwZGF0ZWQ6IE1vbiwgMTAgT2N0IDAwOjE4OjI1IC0wNTAwCitTdGF0dXM6IHdvcmtzCisKK1RoaXMgZHJpdmVyIGFsbG93cyB5b3UgdG8gJ2JvbmQnIChtZXJnZSkgbXVsdGlwbGUgY29tZWRpIHN1YmRldmljZXMKKyhjb21pbmcgZnJvbSBwb3NzaWJseSBkaWZmZXJlbmNlIGJvYXJkcyBhbmQvb3IgZHJpdmVycykgdG9nZXRoZXIuICBGb3IKK2V4YW1wbGUsIGlmIHlvdSBoYWQgYSBib2FyZCB3aXRoIDIgZGlmZmVyZW50IERJTyBzdWJkZXZpY2VzLCBhbmQKK2Fub3RoZXIgd2l0aCAxIERJTyBzdWJkZXZpY2UsIHlvdSBjb3VsZCAnYm9uZCcgdGhlbSB3aXRoIHRoaXMgZHJpdmVyCitzbyB0aGF0IHRoZXkgbG9vayBsaWtlIG9uZSBiaWcgZmF0IERJTyBzdWJkZXZpY2UuICBUaGlzIG1ha2VzIHdyaXRpbmcKK2FwcGxpY2F0aW9ucyBzbGlnaHRseSBlYXNpZXIgYXMgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbWFuYWdpbmcKK2RpZmZlcmVudCBzdWJkZXZpY2VzIGluIHRoZSBhcHBsaWNhdGlvbiAtLSB5b3UganVzdCB3b3JyeSBhYm91dAoraW5kZXhpbmcgb25lIGxpbmVhciBhcnJheSBvZiBjaGFubmVsIGlkJ3MuCisKK1JpZ2h0IG5vdyBvbmx5IERJTyBzdWJkZXZpY2VzIGFyZSBzdXBwb3J0ZWQgYXMgdGhhdCdzIHRoZSBwZXJzb25hbCBpdGNoCitJIGFtIHNjcmF0Y2hpbmcgd2l0aCB0aGlzIGRyaXZlci4gIElmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBBSSBhbmQgQU8KK3N1YmRldnMsIGdvIHJpZ2h0IG9uIGFoZWFkIGFuZCBkbyBzbyEKKworQ29tbWFuZHMgYXJlbid0IHN1cHBvcnRlZCAtLSBhbHRob3VnaCBpdCB3b3VsZCBiZSBjb29sIGlmIHRoZXkgd2VyZS4KKworQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICBMaXN0IG9mIGNvbWVkaS1taW5vcnMgdG8gYm9uZC4gIEFsbCBzdWJkZXZpY2VzIG9mIHRoZSBzYW1lIHR5cGUKKyAgd2l0aGluIGVhY2ggbWlub3Igd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGdpdmVuIGhlcmUuCisqLworCisvKgorICogVGhlIHByZXZpb3VzIGJsb2NrIGNvbW1lbnQgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlCisgKiBkb2N1bWVudGF0aW9uIGluIENvbWVkaSBhbmQgQ29tZWRpbGliLiAgVGhlIGZpZWxkczoKKyAqCisgKiBEcml2ZXI6IHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIKKyAqIERlc2NyaXB0aW9uOiBhIHNob3J0IHBocmFzZSBkZXNjcmliaW5nIHRoZSBkcml2ZXIuICBEb24ndCBsaXN0IGJvYXJkcy4KKyAqIERldmljZXM6IGEgZnVsbCBsaXN0IG9mIHRoZSBib2FyZHMgdGhhdCBhdHRlbXB0IHRvIGJlIHN1cHBvcnRlZCBieQorICogICB0aGUgZHJpdmVyLiAgRm9ybWF0IGlzICIobWFudWZhY3R1cmVyKSBib2FyZCBuYW1lIFtjb21lZGkgbmFtZV0iLAorICogICB3aGVyZSBjb21lZGlfbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBib2FyZC4KKyAqICAgU2VlIHRoZSBjb21tZW50IG5lYXIgYm9hcmRfbmFtZTogaW4gdGhlIGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlCisgKiAgIGJlbG93LiAgSWYgKG1hbnVmYWN0dXJlcikgb3IgW2NvbWVkaSBuYW1lXSBpcyBtaXNzaW5nLCB0aGUgcHJldmlvdXMKKyAqICAgdmFsdWUgaXMgdXNlZC4KKyAqIEF1dGhvcjogeW91CisgKiBVcGRhdGVkOiBkYXRlIHdoZW4gdGhlIF9kb2N1bWVudGF0aW9uXyB3YXMgbGFzdCB1cGRhdGVkLiAgVXNlICdkYXRlIC1SJworICogICB0byBnZXQgYSB2YWx1ZSBmb3IgdGhpcy4KKyAqIFN0YXR1czogYSBvbmUtd29yZCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdHVzLiAgVmFsaWQgdmFsdWVzIGFyZToKKyAqICAgd29ya3MgLSBkcml2ZXIgd29ya3MgY29ycmVjdGx5IG9uIG1vc3QgYm9hcmRzIHN1cHBvcnRlZCwgYW5kCisgKiAgICAgcGFzc2VzIGNvbWVkaV90ZXN0LgorICogICB1bmtub3duIC0gdW5rbm93bi4gIFVzdWFsbHkgcHV0IHRoZXJlIGJ5IGRzLgorICogICBleHBlcmltZW50YWwgLSBtYXkgbm90IHdvcmsgaW4gYW55IHBhcnRpY3VsYXIgcmVsZWFzZS4gIEF1dGhvcgorICogICAgIHByb2JhYmx5IHdhbnRzIGFzc2lzdGFuY2UgdGVzdGluZyBpdC4KKyAqICAgYml0cm90dGVuIC0gZHJpdmVyIGhhcyBub3QgYmVlbiB1cGRhdGUgaW4gYSBsb25nIHRpbWUsIHByb2JhYmx5CisgKiAgICAgZG9lc24ndCB3b3JrLCBhbmQgcHJvYmFibHkgaXMgbWlzc2luZyBzdXBwb3J0IGZvciBzaWduaWZpY2FudAorICogICAgIENvbWVkaSBpbnRlcmZhY2UgZmVhdHVyZXMuCisgKiAgIHVudGVzdGVkIC0gYXV0aG9yIHByb2JhYmx5IHdyb3RlIGl0ICJibGluZCIsIGFuZCBpcyBiZWxpZXZlZCB0bworICogICAgIHdvcmssIGJ1dCBubyBjb25maXJtYXRpb24uCisgKgorICogVGhlc2UgaGVhZGVycyBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lLCBhbmQgYW55IGNvbW1lbnRzCisgKiB5b3Ugd2lzaCB0byBzYXkgYWJvdXQgdGhlIGRyaXZlci4gIFRoZSBjb21tZW50IGFyZWEgaXMgdGhlIHBsYWNlCisgKiB0byBwdXQgYW55IGtub3duIGJ1Z3MsIGxpbWl0YXRpb25zLCB1bnN1cHBvcnRlZCBmZWF0dXJlcywgc3VwcG9ydGVkCisgKiBjb21tYW5kIHRyaWdnZXJzLCB3aGV0aGVyIG9yIG5vdCBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIG9uIHBhcnRpY3VsYXIKKyAqIHN1YmRldmljZXMsIGV0Yy4KKyAqCisgKiBTb21ld2hlcmUgaW4gdGhlIGNvbW1lbnQgc2hvdWxkIGJlIGluZm9ybWF0aW9uIGFib3V0IGNvbmZpZ3VyYXRpb24KKyAqIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoIGNvbWVkaV9jb25maWcuCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKiBUaGUgbWF4aXVtdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBzdWJkZXZpY2UuICovCisjZGVmaW5lIE1BWF9DSEFOUyAyNTYKKworI2RlZmluZSBNT0RVTEVfTkFNRSAiY29tZWRpX2JvbmQiCisjaWZkZWYgTU9EVUxFX0xJQ0VOU0UKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgorI2lmbmRlZiBTVFIKKyMgIGRlZmluZSBTVFIxKHgpICN4CisjICBkZWZpbmUgU1RSKHgpIFNUUjEoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIklmIHRydWUsIHByaW50IGV4dHJhIGNyeXB0aWMgZGVidWdnaW5nIG91dHB1dCB1c2VmdWwiCisJCSAib25seSB0byBkZXZlbG9wZXJzLiIpOworCisjZGVmaW5lIExPR19NU0coeC4uLikgcHJpbnRrKEtFUk5fSU5GTyBNT0RVTEVfTkFNRSI6ICJ4KQorI2RlZmluZSBERUJVRyh4Li4uKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoZGVidWcpCQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgTU9EVUxFX05BTUUiOiBERUJVRzogIngpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgV0FSTklORyh4Li4uKSAgcHJpbnRrKEtFUk5fV0FSTklORyBNT0RVTEVfTkFNRSAiOiBXQVJOSU5HOiAieCkKKyNkZWZpbmUgRVJST1IoeC4uLikgIHByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiBJTlRFUk5BTCBFUlJPUjogIngpCitNT0RVTEVfQVVUSE9SKCJDYWxpbiBBLiBDdWxpYW51Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oTU9EVUxFX05BTUUgIkEgZHJpdmVyIGZvciBDT01FREkgdG8gYm9uZCBtdWx0aXBsZSBDT01FREkgIgorCQkgICAiZGV2aWNlcyB0b2dldGhlciBhcyBvbmUuICBJbiB0aGUgd29yZHMgb2YgSm9obiBMZW5ub246ICIKKwkJICAgIidBbmQgdGhlIHdvcmxkIHdpbGwgbGl2ZSBhcyBvbmUuLi4nIik7CisKKy8qCisgKiBCb2FyZCBkZXNjcmlwdGlvbnMgZm9yIHR3byBpbWFnaW5hcnkgYm9hcmRzLiAgRGVzY3JpYmluZyB0aGUKKyAqIGJvYXJkcyBpbiB0aGlzIHdheSBpcyBvcHRpb25hbCwgYW5kIGNvbXBsZXRlbHkgZHJpdmVyLWRlcGVuZGVudC4KKyAqIFNvbWUgZHJpdmVycyB1c2UgYXJyYXlzIHN1Y2ggYXMgdGhpcywgb3RoZXIgZG8gbm90LgorICovCitzdHJ1Y3QgQm9uZGluZ0JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBCb25kaW5nQm9hcmQgYm9uZGluZ0JvYXJkc1tdID0geworCXsKKwkJLm5hbWUgPQlNT0RVTEVfTkFNRSwKKwl9LAorfTsKKworLyoKKyAqIFVzZWZ1bCBmb3Igc2hvcnRoYW5kIGFjY2VzcyB0byB0aGUgcGFydGljdWxhciBib2FyZCBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzdHJ1Y3QgQm9uZGluZ0JvYXJkICopZGV2LT5ib2FyZF9wdHIpCisKK3N0cnVjdCBCb25kZWREZXZpY2UgeworCWNvbWVkaV90ICpkZXY7CisJdW5zaWduZWQgbWlub3I7CisJdW5zaWduZWQgc3ViZGV2OworCXVuc2lnbmVkIHN1YmRldl90eXBlOworCXVuc2lnbmVkIG5jaGFuczsKKwl1bnNpZ25lZCBjaGFuaWRfb2Zmc2V0OwkvKiBUaGUgb2Zmc2V0IGludG8gb3VyIHVuaWZpZWQgbGluZWFyCisJCQkJICAgY2hhbm5lbC1pZCdzIG9mIGNoYW5pZCAwIG9uIHRoaXMKKwkJCQkgICBzdWJkZXZpY2UuICovCit9OworCisvKiB0aGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuICBJZgorICAgc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKKyAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIGNvbWVkaV9kZXZpY2Ugc3RydWN0LiAgKi8KK3N0cnVjdCBQcml2YXRlIHsKKyMgZGVmaW5lIE1BWF9CT0FSRF9OQU1FIDI1NgorCWNoYXIgbmFtZVtNQVhfQk9BUkRfTkFNRV07CisJc3RydWN0IEJvbmRlZERldmljZSAqKmRldnM7CisJdW5zaWduZWQgbmRldnM7CisJc3RydWN0IEJvbmRlZERldmljZSAqY2hhbklkRGV2TWFwW01BWF9DSEFOU107CisJdW5zaWduZWQgbmNoYW5zOworfTsKKworLyoKKyAqIG1vc3QgZHJpdmVycyBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNybyB0byBtYWtlIGl0IGVhc3kgdG8KKyAqIGFjY2VzcyB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBQcml2YXRlICopZGV2LT5wcml2YXRlKQorCisvKgorICogVGhlIGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlIHRlbGxzIHRoZSBDb21lZGkgY29yZSBtb2R1bGUKKyAqIHdoaWNoIGZ1bmN0aW9ucyB0byBjYWxsIHRvIGNvbmZpZ3VyZS9kZWNvbmZpZ3VyZSAoYXR0YWNoL2RldGFjaCkKKyAqIHRoZSBib2FyZCwgYW5kIGFsc28gYWJvdXQgdGhlIGtlcm5lbCBtb2R1bGUgdGhhdCBjb250YWlucworICogdGhlIGRldmljZSBjb2RlLgorICovCitzdGF0aWMgaW50IGJvbmRpbmdfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCBib25kaW5nX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpOworLyoqIEJ1aWxkIFByaXZhdGUgYXJyYXkgb2YgYWxsIGRldmljZXMuLiAqLworc3RhdGljIGludCBkb0RldkNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyB2b2lkIGRvRGV2VW5jb25maWcoY29tZWRpX2RldmljZSAqZGV2KTsKKy8qIFVnbHkgaW1wbGVtZW50YXRpb24gb2YgcmVhbGxvYyB0aGF0IGFsd2F5cyBjb3BpZXMgbWVtb3J5IGFyb3VuZCAtLSBJJ20gbGF6eSwKKyAqIHdoYXQgY2FuIEkgc2F5PyAgSSBsaWtlIHRvIGRvIHdhc3RlZnVsIG1lbWNvcGllcy4uIDopICovCitzdGF0aWMgdm9pZCAqUmVhbGxvYyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4sIHNpemVfdCBvbGRfbGVuKTsKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX2JvbmRpbmcgPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQlNT0RVTEVfTkFNRSwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCWJvbmRpbmdfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQlib25kaW5nX2RldGFjaCwKKwkvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgaWYgeW91IGFyZQorCSAqIHdyaXRpbmcgYSBkcml2ZXIgZm9yIGEgSVNBIFBuUCBvciBQQ0kgY2FyZCAqLworCS8qIE1vc3QgZHJpdmVycyB3aWxsIHN1cHBvcnQgbXVsdGlwbGUgdHlwZXMgb2YgYm9hcmRzIGJ5CisJICogaGF2aW5nIGFuIGFycmF5IG9mIGJvYXJkIHN0cnVjdHVyZXMuICBUaGVzZSB3ZXJlIGRlZmluZWQKKwkgKiBpbiBza2VsX2JvYXJkc1tdIGFib3ZlLiAgTm90ZSB0aGF0IHRoZSBlbGVtZW50ICduYW1lJworCSAqIHdhcyBmaXJzdCBpbiB0aGUgc3RydWN0dXJlIC0tIENvbWVkaSB1c2VzIHRoaXMgZmFjdCB0bworCSAqIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIGJvYXJkIHdpdGhvdXQga25vd2luZyBhbnkgZGV0YWlscworCSAqIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBpdHMgbGVuZ3RoLgorCSAqIFdoZW4gYSBkZXZpY2UgaXMgYXR0YWNoZWQgKGJ5IGNvbWVkaV9jb25maWcpLCB0aGUgbmFtZQorCSAqIG9mIHRoZSBkZXZpY2UgaXMgZ2l2ZW4gdG8gQ29tZWRpLCBhbmQgQ29tZWRpIHRyaWVzIHRvCisJICogbWF0Y2ggaXQgYnkgZ29pbmcgdGhyb3VnaCB0aGUgbGlzdCBvZiBib2FyZCBuYW1lcy4gIElmCisJICogdGhlcmUgaXMgYSBtYXRjaCwgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgaXMgcHV0CisJICogaW50byBkZXYtPmJvYXJkX3B0ciBhbmQgZHJpdmVyLT5hdHRhY2goKSBpcyBjYWxsZWQuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBuZWNlc3NhcnkgaWYgeW91IGNhbiBkZXRlcm1pbmUKKwkgKiB0aGUgdHlwZSBvZiBib2FyZCBpbiBzb2Z0d2FyZS4gIElTQSBQblAsIFBDSSwgYW5kIFBDTUNJQQorCSAqIGRldmljZXMgYXJlIHN1Y2ggYm9hcmRzLgorCSAqLworICAgICAgLmJvYXJkX25hbWUgPQkmYm9uZGluZ0JvYXJkc1swXS5uYW1lLAorICAgICAgLm9mZnNldCA9CQlzaXplb2Yoc3RydWN0IEJvbmRpbmdCb2FyZCksCisgICAgICAubnVtX25hbWVzID0Jc2l6ZW9mKGJvbmRpbmdCb2FyZHMpIC8gc2l6ZW9mKHN0cnVjdCBCb25kaW5nQm9hcmQpLAorfTsKKworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKKworLyoKKyAqIEF0dGFjaCBpcyBjYWxsZWQgYnkgdGhlIENvbWVkaSBjb3JlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgKiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiAgSWYgeW91IHNwZWNpZmllZCBhIGJvYXJkX25hbWUgYXJyYXkKKyAqIGluIHRoZSBkcml2ZXIgc3RydWN0dXJlLCBkZXYtPmJvYXJkX3B0ciBjb250YWlucyB0aGF0CisgKiBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGJvbmRpbmdfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCUxPR19NU0coImNvbWVkaSVkXG4iLCBkZXYtPm1pbm9yKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHByaXZhdGUgc3RydWN0dXJlIGFyZWEuICBhbGxvY19wcml2YXRlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgUHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFNldHVwIG91ciBib25kaW5nIGZyb20gY29uZmlnIHBhcmFtcy4uIHNldHMgdXAgb3VyIFByaXZhdGUgc3RydWN0Li4KKwkgKi8KKwlpZiAoIWRvRGV2Q29uZmlnKGRldiwgaXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBkZXYtPmJvYXJkX25hbWUuICBOb3RlIHRoYXQgd2UgY2FuIHVzZSB0aGUgInRoaXNib2FyZCIKKwkgKiBtYWNybyBub3csIHNpbmNlIHdlIGp1c3QgaW5pdGlhbGl6ZWQgaXQgaW4gdGhlIGxhc3QgbGluZS4KKwkgKi8KKwlkZXYtPmJvYXJkX25hbWUgPSBkZXZwcml2LT5uYW1lOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuICBhbGxvY19zdWJkZXZpY2UoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgorCSAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgMSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IGRldnByaXYtPm5jaGFuczsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IGJvbmRpbmdfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IGJvbmRpbmdfZGlvX2luc25fY29uZmlnOworCisJTE9HX01TRygiYXR0YWNoZWQgd2l0aCAldSBESU8gY2hhbm5lbHMgY29taW5nIGZyb20gJXUgZGlmZmVyZW50ICIKKwkJInN1YmRldmljZXMgYWxsIGJvbmRlZCB0b2dldGhlci4gICIKKwkJIkpvaG4gTGVubm9uIHdvdWxkIGJlIHByb3VkIVxuIiwKKwkJZGV2cHJpdi0+bmNoYW5zLCBkZXZwcml2LT5uZGV2cyk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIF9kZXRhY2ggaXMgY2FsbGVkIHRvIGRlY29uZmlndXJlIGEgZGV2aWNlLiAgSXQgc2hvdWxkIGRlYWxsb2NhdGUKKyAqIHJlc291cmNlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgd2hlbiBfYXR0YWNoKCkgZmFpbHMsIHNvIGl0IHNob3VsZCBiZQorICogY2FyZWZ1bCBub3QgdG8gcmVsZWFzZSByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseQorICogYWxsb2NhdGVkIGJ5IF9hdHRhY2goKS4gIGRldi0+cHJpdmF0ZSBhbmQgZGV2LT5zdWJkZXZpY2VzIGFyZQorICogZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY29yZS4KKyAqLworc3RhdGljIGludCBib25kaW5nX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJTE9HX01TRygiY29tZWRpJWQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJZG9EZXZVbmNvbmZpZyhkZXYpOworCXJldHVybiAwOworfQorCisvKiBESU8gZGV2aWNlcyBhcmUgc2xpZ2h0bHkgc3BlY2lhbC4gIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgdGhlIGluc25fcmVhZC9pbnNuX3dyaXRlIGludGVyZmFjZSwgaXQgaXMgbXVjaCBtb3JlCisgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCisgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUKKyAqIGNvbWVkaSBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUgKi8KK3N0YXRpYyBpbnQgYm9uZGluZ19kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworI2RlZmluZSBMU0FNUExfQklUUyAoc2l6ZW9mKGxzYW1wbF90KSo4KQorCXVuc2lnbmVkIG5jaGFucyA9IExTQU1QTF9CSVRTLCBudW1fZG9uZSA9IDAsIGk7CisJaWYgKGluc24tPm4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2cHJpdi0+bmNoYW5zIDwgbmNoYW5zKQorCQluY2hhbnMgPSBkZXZwcml2LT5uY2hhbnM7CisKKwkvKiBUaGUgaW5zbiBkYXRhIGlzIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLCBlYWNoIGNoYW5uZWwgY29vcmVzcG9uZGluZyB0byBhIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBudW1fZG9uZSA8IG5jaGFucyAmJiBpIDwgZGV2cHJpdi0+bmRldnM7ICsraSkgeworCQlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpiZGV2ID0gZGV2cHJpdi0+ZGV2c1tpXTsKKwkJLyogR3JhYiB0aGUgY2hhbm5lbCBtYXNrIGFuZCBkYXRhIG9mIG9ubHkgdGhlIGJpdHMgY29ycmVzcG9uZGluZworCQkgICB0byB0aGlzIHN1YmRldmljZS4uIG5lZWQgdG8gc2hpZnQgdGhlbSB0byB6ZXJvIHBvc2l0aW9uIG9mCisJCSAgIGNvdXJzZS4gKi8KKwkJLyogQml0cyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3ViZGV2LiAqLworCQlsc2FtcGxfdCBzdWJkZXZNYXNrID0gKCgxIDw8IGJkZXYtPm5jaGFucykgLSAxKTsKKwkJbHNhbXBsX3Qgd3JpdGVNYXNrLCBkYXRhQml0czsKKworCQkvKiBBcmdoLCB3ZSBoYXZlID49IExTQU1QTF9CSVRTIGNoYW5zLi4gdGFrZSBhbGwgYml0cyAqLworCQlpZiAoYmRldi0+bmNoYW5zID49IExTQU1QTF9CSVRTKQorCQkJc3ViZGV2TWFzayA9IChsc2FtcGxfdCkgKC0xKTsKKworCQl3cml0ZU1hc2sgPSAoZGF0YVswXSA+PiBudW1fZG9uZSkgJiBzdWJkZXZNYXNrOworCQlkYXRhQml0cyA9IChkYXRhWzFdID4+IG51bV9kb25lKSAmIHN1YmRldk1hc2s7CisKKwkJLyogUmVhZC9Xcml0ZSB0aGUgbmV3IGRpZ2l0YWwgbGluZXMgKi8KKwkJaWYgKGNvbWVkaV9kaW9fYml0ZmllbGQoYmRldi0+ZGV2LCBiZGV2LT5zdWJkZXYsIHdyaXRlTWFzaywKKwkJCQkmZGF0YUJpdHMpICE9IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBNYWtlIHJvb20gZm9yIHRoZSBuZXcgYml0cyBpbiBkYXRhWzFdLCB0aGUgcmV0dXJuIHZhbHVlICovCisJCWRhdGFbMV0gJj0gfihzdWJkZXZNYXNrIDw8IG51bV9kb25lKTsKKwkJLyogUHV0IHRoZSBiaXRzIGluIHRoZSByZXR1cm4gdmFsdWUgKi8KKwkJZGF0YVsxXSB8PSAoZGF0YUJpdHMgJiBzdWJkZXZNYXNrKSA8PCBudW1fZG9uZTsKKwkJLyogU2F2ZSB0aGUgbmV3IGJpdHMgdG8gdGhlIHNhdmVkIHN0YXRlLi4gKi8KKwkJcy0+c3RhdGUgPSBkYXRhWzFdOworCisJCW51bV9kb25lICs9IGJkZXYtPm5jaGFuczsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksIHJldCwgaW9fYml0cyA9IHMtPmlvX2JpdHM7CisJdW5zaWduZWQgaW50IGlvOworCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXY7CisKKwlpZiAoY2hhbiA8IDAgfHwgY2hhbiA+PSBkZXZwcml2LT5uY2hhbnMpCisJCXJldHVybiAtRUlOVkFMOworCWJkZXYgPSBkZXZwcml2LT5jaGFuSWREZXZNYXBbY2hhbl07CisKKwkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKKwkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCisJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCisJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuICovCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCQlpbyA9IENPTUVESV9PVVRQVVQ7CS8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKwkJaW9fYml0cyB8PSAxIDw8IGNoYW47CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlpbyA9IENPTUVESV9JTlBVVDsJLyogaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCQlpb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKGlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlyZXR1cm4gaW5zbi0+bjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkvKiAncmVhbCcgY2hhbm5lbCBpZCBmb3IgdGhpcyBzdWJkZXYuLiAqLworCWNoYW4gLT0gYmRldi0+Y2hhbmlkX29mZnNldDsKKwlyZXQgPSBjb21lZGlfZGlvX2NvbmZpZyhiZGV2LT5kZXYsIGJkZXYtPnN1YmRldiwgY2hhbiwgaW8pOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogRmluYWxseSwgc2F2ZSB0aGUgbmV3IGlvX2JpdHMgdmFsdWVzIHNpbmNlIHdlIGRpZG4ndCBnZXQKKwkgICBhbiBlcnJvciBhYm92ZS4gKi8KKwlzLT5pb19iaXRzID0gaW9fYml0czsKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgKlJlYWxsb2MoY29uc3Qgdm9pZCAqb2xkbWVtLCBzaXplX3QgbmV3bGVuLCBzaXplX3Qgb2xkbGVuKQoreworCXZvaWQgKm5ld21lbSA9IGttYWxsb2MobmV3bGVuLCBHRlBfS0VSTkVMKTsKKworCWlmIChuZXdtZW0gJiYgb2xkbWVtKQorCQltZW1jcHkobmV3bWVtLCBvbGRtZW0sIG1pbihvbGRsZW4sIG5ld2xlbikpOworCWtmcmVlKG9sZG1lbSk7CisJcmV0dXJuIG5ld21lbTsKK30KKworc3RhdGljIGludCBkb0RldkNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWludCBpOworCWNvbWVkaV90ICpkZXZzX29wZW5lZFtDT01FRElfTlVNX0JPQVJEX01JTk9SU107CisKKwltZW1zZXQoZGV2c19vcGVuZWQsIDAsIHNpemVvZihkZXZzX29wZW5lZCkpOworCWRldnByaXYtPm5hbWVbMF0gPSAwOzsKKwkvKiBMb29wIHRocm91Z2ggYWxsIGNvbWVkaSBkZXZpY2VzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLAorCSAgIGJ1aWxkaW5nIG91ciBkZXZpY2UgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTkRFVkNPTkZPUFRTICYmICghaSB8fCBpdC0+b3B0aW9uc1tpXSk7ICsraSkgeworCQljaGFyIGZpbGVbXSA9ICIvZGV2L2NvbWVkaVhYWFhYWCI7CisJCWludCBtaW5vciA9IGl0LT5vcHRpb25zW2ldOworCQljb21lZGlfdCAqZDsKKwkJaW50IHNkZXYgPSAtMSwgbmNoYW5zLCB0bXA7CisJCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXYgPSBOVUxMOworCisJCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPiBDT01FRElfTlVNX0JPQVJEX01JTk9SUykgeworCQkJRVJST1IoIk1pbm9yICVkIGlzIGludmFsaWQhXG4iLCBtaW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobWlub3IgPT0gZGV2LT5taW5vcikgeworCQkJRVJST1IoIkNhbm5vdCBib25kIHRoaXMgZHJpdmVyIHRvIGl0c2VsZiFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRldnNfb3BlbmVkW21pbm9yXSkgeworCQkJRVJST1IoIk1pbm9yICVkIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSFcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc25wcmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiL2Rldi9jb21lZGkldSIsIG1pbm9yKTsKKwkJZmlsZVtzaXplb2YoZmlsZSkgLSAxXSA9IDA7CisKKwkJZCA9IGRldnNfb3BlbmVkW21pbm9yXSA9IGNvbWVkaV9vcGVuKGZpbGUpOworCisJCWlmICghZCkgeworCQkJRVJST1IoIk1pbm9yICV1IGNvdWxkIG5vdCBiZSBvcGVuZWRcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRG8gRElPLCBhcyB0aGF0J3MgYWxsIHdlIHN1cHBvcnQgbm93Li4gKi8KKwkJd2hpbGUgKChzZGV2ID0gY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUoZCwgQ09NRURJX1NVQkRfRElPLAorCQkJCQlzZGV2ICsgMSkpID4gLTEpIHsKKwkJCW5jaGFucyA9IGNvbWVkaV9nZXRfbl9jaGFubmVscyhkLCBzZGV2KTsKKwkJCWlmIChuY2hhbnMgPD0gMCkgeworCQkJCUVSUk9SKCJjb21lZGlfZ2V0X25fY2hhbm5lbHMoKSByZXR1cm5lZCAlZCAiCisJCQkJICAgICAgIm9uIG1pbm9yICV1IHN1YmRldiAlZCFcbiIsCisJCQkJICAgICAgbmNoYW5zLCBtaW5vciwgc2Rldik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliZGV2ID0ga21hbGxvYyhzaXplb2YoKmJkZXYpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghYmRldikgeworCQkJCUVSUk9SKCJPdXQgb2YgbWVtb3J5LlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliZGV2LT5kZXYgPSBkOworCQkJYmRldi0+bWlub3IgPSBtaW5vcjsKKwkJCWJkZXYtPnN1YmRldiA9IHNkZXY7CisJCQliZGV2LT5zdWJkZXZfdHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwkJCWJkZXYtPm5jaGFucyA9IG5jaGFuczsKKwkJCWJkZXYtPmNoYW5pZF9vZmZzZXQgPSBkZXZwcml2LT5uY2hhbnM7CisKKwkJCS8qIG1hcCBjaGFubmVsIGlkJ3MgdG8gQm9uZGVkRGV2aWNlICogcG9pbnRlci4uICovCisJCQl3aGlsZSAobmNoYW5zLS0pCisJCQkJZGV2cHJpdi0+Y2hhbklkRGV2TWFwW2RldnByaXYtPm5jaGFucysrXSA9IGJkZXY7CisKKwkJCS8qIE5vdyBwdXQgYmRldiBwb2ludGVyIGF0IGVuZCBvZiBkZXZwcml2LT5kZXZzIGFycmF5CisJCQkgKiBsaXN0Li4gKi8KKworCQkJLyogZXJnaC4uIHVnbHkuLiB3ZSBuZWVkIHRvIHJlYWxsb2MgOiggICovCisJCQl0bXAgPSBkZXZwcml2LT5uZGV2cyAqIHNpemVvZihiZGV2KTsKKwkJCWRldnByaXYtPmRldnMgPQorCQkJCVJlYWxsb2MoZGV2cHJpdi0+ZGV2cywKKwkJCQkrK2RldnByaXYtPm5kZXZzICogc2l6ZW9mKGJkZXYpLCB0bXApOworCQkJaWYgKCFkZXZwcml2LT5kZXZzKSB7CisJCQkJRVJST1IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuICIKKwkJCQkgICAgICAiT3V0IG9mIG1lbW9yeT8iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJZGV2cHJpdi0+ZGV2c1tkZXZwcml2LT5uZGV2cyAtIDFdID0gYmRldjsKKwkJCXsKKwkvKiogQXBwZW5kIGRldjpzdWJkZXYgdG8gZGV2cHJpdi0+bmFtZSAqLworCQkJCWNoYXIgYnVmWzIwXTsKKwkJCQlpbnQgbGVmdCA9CisJCQkJCU1BWF9CT0FSRF9OQU1FIC0gc3RybGVuKGRldnByaXYtPm5hbWUpIC0KKwkJCQkJMTsKKwkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQ6JWQgIiwgZGV2LT5taW5vciwKKwkJCQkJYmRldi0+c3ViZGV2KTsKKwkJCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CisJCQkJc3RybmNhdChkZXZwcml2LT5uYW1lLCBidWYsIGxlZnQpOworCQkJfQorCisJCX0KKwl9CisKKwlpZiAoIWRldnByaXYtPm5jaGFucykgeworCQlFUlJPUigiTm8gY2hhbm5lbHMgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRvRGV2VW5jb25maWcoY29tZWRpX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZGV2c19jbG9zZWQgPSAwOworCisJaWYgKGRldnByaXYpIHsKKwkJd2hpbGUgKGRldnByaXYtPm5kZXZzLS0gJiYgZGV2cHJpdi0+ZGV2cykgeworCQkJc3RydWN0IEJvbmRlZERldmljZSAqYmRldjsKKworCQkJYmRldiA9IGRldnByaXYtPmRldnNbZGV2cHJpdi0+bmRldnNdOworCQkJaWYgKCFiZGV2KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEoZGV2c19jbG9zZWQgJiAoMHgxIDw8IGJkZXYtPm1pbm9yKSkpIHsKKwkJCQljb21lZGlfY2xvc2UoYmRldi0+ZGV2KTsKKwkJCQlkZXZzX2Nsb3NlZCB8PSAoMHgxIDw8IGJkZXYtPm1pbm9yKTsKKwkJCX0KKwkJCWtmcmVlKGJkZXYpOworCQl9CisJCWtmcmVlKGRldnByaXYtPmRldnMpOworCQlkZXZwcml2LT5kZXZzID0gTlVMTDsKKwkJa2ZyZWUoZGV2cHJpdik7CisJCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9ib25kaW5nKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9ib25kaW5nKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChjbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCisKKyAgICBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCisgICAgdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0CisgICAgZm9yIGZyYW5rLWNvbW1vbi4KKworICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKworc3RhdGljIHZvaWQgaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3MoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJdW5zaWduZWQgaW50IHNjYW5fbGVuZ3RoID0gY2ZjX2J5dGVzX3Blcl9zY2FuKHN1YmQpOworCisJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgKz0gbnVtX2J5dGVzOworCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBzY2FuX2xlbmd0aCkgeworCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBzY2FuX2xlbmd0aDsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCX0KK30KKworLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJdW5zaWduZWQgaW50IHJldHZhbDsKKworCWlmIChudW1fYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR2YWwgPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWlmIChyZXR2YWwgIT0gbnVtX2J5dGVzKSB7CisJCXJ0X3ByaW50aygiY29tZWRpOiBidWZmZXIgb3ZlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gMDsKKwl9CisKKwljb21lZGlfYnVmX21lbWNweV90byhhc3luYywgMCwgZGF0YSwgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisJaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCXJldHVybiBudW1fYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGNmY193cml0ZV9hcnJheV90b19idWZmZXIpOworCit1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwgdm9pZCAqZGF0YSwKKwkJCQkJdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisKKwlpZiAobnVtX2J5dGVzID09IDApCisJCXJldHVybiAwOworCisJbnVtX2J5dGVzID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfbWVtY3B5X2Zyb20oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisJaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCXJldHVybiBudW1fYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKTsKKwordW5zaWduZWQgaW50IGNmY19oYW5kbGVfZXZlbnRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKK3sKKwl1bnNpZ25lZCBpbnQgZXZlbnRzID0gc3ViZC0+YXN5bmMtPmV2ZW50czsKKworCWlmIChldmVudHMgPT0gMCkKKwkJcmV0dXJuIGV2ZW50czsKKworCWlmIChldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpCisJCXN1YmQtPmNhbmNlbChkZXYsIHN1YmQpOworCisJY29tZWRpX2V2ZW50KGRldiwgc3ViZCk7CisKKwlyZXR1cm4gZXZlbnRzOworfQorRVhQT1JUX1NZTUJPTChjZmNfaGFuZGxlX2V2ZW50cyk7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2hhcmVkIGZ1bmN0aW9ucyBmb3IgQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9mY19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2ZjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGNvbWVkaV9mY19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTJmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAgICBjb21lZGlfZmMuaAorCisgICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICAgIHR3byBvciBtb3JlIGRyaXZlcnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBvbmx5CisgICAgYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQorCisgICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NPTUVESV9GQ19ICisjZGVmaW5lIF9DT01FRElfRkNfSAorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkgICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkgICAgICAgc2FtcGxfdCBkYXRhKQoreworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJCQkgICAgbHNhbXBsX3QgZGF0YSkKK3sKKwlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdWJkLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK307CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkJICAgICAgIHZvaWQgKmRhdGEsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgY29tZWRpX3N1YmRldmljZSAqc3ViZCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY19ieXRlc19wZXJfc2Nhbihjb21lZGlfc3ViZGV2aWNlICpzdWJkKQoreworCWludCBudW1fc2FtcGxlczsKKwlpbnQgYml0c19wZXJfc2FtcGxlOworCisJc3dpdGNoIChzdWJkLT50eXBlKSB7CisJY2FzZSBDT01FRElfU1VCRF9ESToKKwljYXNlIENPTUVESV9TVUJEX0RPOgorCWNhc2UgQ09NRURJX1NVQkRfRElPOgorCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKKwkJbnVtX3NhbXBsZXMgPSAoc3ViZC0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKworCQkJICAgICAgIGJpdHNfcGVyX3NhbXBsZSAtIDEpIC8gYml0c19wZXJfc2FtcGxlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW1fc2FtcGxlcyA9IHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlicmVhazsKKwl9CisJcmV0dXJuIG51bV9zYW1wbGVzICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKK30KKworI2VuZGlmIC8qIF9DT01FRElfRkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgzOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYworICAgIGhhcmR3YXJlIGRyaXZlciBmb3Igc3RhbmRhcmQgcGFyYWxsZWwgcG9ydAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OCwyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisvKgorRHJpdmVyOiBjb21lZGlfcGFycG9ydAorRGVzY3JpcHRpb246IFN0YW5kYXJkIFBDIHBhcmFsbGVsIHBvcnQKK0F1dGhvcjogZHMKK1N0YXR1czogd29ya3MgaW4gaW1tZWRpYXRlIG1vZGUKK0RldmljZXM6IFtzdGFuZGFyZF0gcGFyYWxsZWwgcG9ydCAoY29tZWRpX3BhcnBvcnQpCitVcGRhdGVkOiBUdWUsIDMwIEFwciAyMDAyIDIxOjExOjQ1IC0wNzAwCisKK0EgY2hlYXAgYW5kIGVhc3kgd2F5IHRvIGdldCBhIGZldyBtb3JlIGRpZ2l0YWwgSS9PIGxpbmVzLiAgU3RlYWwKK2FkZGl0aW9uYWwgcGFyYWxsZWwgcG9ydHMgZnJvbSBvbGQgY29tcHV0ZXJzIG9yIHlvdXIgbmVpZ2hib3JzJworY29tcHV0ZXJzLgorCitPcHRpb24gbGlzdDoKKyAwOiBJL08gcG9ydCBiYXNlIGZvciB0aGUgcGFyYWxsZWwgcG9ydC4KKyAxOiBJUlEKKworUGFyYWxsZWwgUG9ydCBMaW5lczoKKworcGluICAgICBzdWJkZXYgIGNoYW4gICAgYWthCistLS0gICAgIC0tLS0tLSAgLS0tLSAgICAtLS0KKzEgICAgICAgMiAgICAgICAwICAgICAgIHN0cm9iZQorMiAgICAgICAwICAgICAgIDAgICAgICAgZGF0YSAwCiszICAgICAgIDAgICAgICAgMSAgICAgICBkYXRhIDEKKzQgICAgICAgMCAgICAgICAyICAgICAgIGRhdGEgMgorNSAgICAgICAwICAgICAgIDMgICAgICAgZGF0YSAzCis2ICAgICAgIDAgICAgICAgNCAgICAgICBkYXRhIDQKKzcgICAgICAgMCAgICAgICA1ICAgICAgIGRhdGEgNQorOCAgICAgICAwICAgICAgIDYgICAgICAgZGF0YSA2Cis5ICAgICAgIDAgICAgICAgNyAgICAgICBkYXRhIDcKKzEwICAgICAgMSAgICAgICAzICAgICAgIGFja25vd2xlZGdlCisxMSAgICAgIDEgICAgICAgNCAgICAgICBidXN5CisxMiAgICAgIDEgICAgICAgMiAgICAgICBvdXRwdXQKKzEzICAgICAgMSAgICAgICAxICAgICAgIHByaW50ZXIgc2VsZWN0ZWQKKzE0ICAgICAgMiAgICAgICAxICAgICAgIGF1dG8gTEYKKzE1ICAgICAgMSAgICAgICAwICAgICAgIGVycm9yCisxNiAgICAgIDIgICAgICAgMiAgICAgICBpbml0CisxNyAgICAgIDIgICAgICAgMyAgICAgICBzZWxlY3QgcHJpbnRlcgorMTgtMjUgICBncm91bmQKKworTm90ZXM6CisKK1N1YmRldmljZXMgMCBpcyBkaWdpdGFsIEkvTywgc3ViZGV2aWNlIDEgaXMgZGlnaXRhbCBpbnB1dCwgYW5kCitzdWJkZXZpY2UgMiBpcyBkaWdpdGFsIG91dHB1dC4gIFVubGlrZSBvdGhlciBDb21lZGkgZGV2aWNlcywKK3N1YmRldmljZSAwIGRlZmF1bHRzIHRvIG91dHB1dC4KKworUGlucyAxMyBhbmQgMTQgYXJlIGludmVydGVkIG9uY2UgYnkgQ29tZWRpIGFuZCBvbmNlIGJ5IHRoZQoraGFyZHdhcmUsIHRodXMgY2FuY2VsbGluZyB0aGUgZWZmZWN0LgorCitQaW4gMSBpcyBhIHN0cm9iZSwgdGh1cyBhY3RzIGxpa2Ugb25lLiAgVGhlcmUncyBubyB3YXkgaW4gc29mdHdhcmUKK3RvIGNoYW5nZSB0aGlzLCBhdCBsZWFzdCBvbiBhIHN0YW5kYXJkIHBhcmFsbGVsIHBvcnQuCisKK1N1YmRldmljZSAzIHByZXRlbmRzIHRvIGJlIGEgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UsIGJ1dCBpdCBhbHdheXMKK3JldHVybnMgMCB3aGVuIHJlYWQuICBIb3dldmVyLCBpZiB5b3UgcnVuIGEgY29tbWFuZCB3aXRoCitzY2FuX2JlZ2luX3NyYz1UUklHX0VYVCwgaXQgdXNlcyBwaW4gMTAgYXMgYSBleHRlcm5hbCB0cmlnZ2VyaW5nCitwaW4sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdha2UgdXAgdGFza3MuCisqLworLyoKKyAgIHNlZSBodHRwOi8vd3d3LmJleW9uZGxvZ2ljLm9yZy8gZm9yIGluZm9ybWF0aW9uLgorICAgb3IgaHR0cDovL3d3dy5saW51eC1tYWdhemluLmRlL2F1c2dhYmUvMTk5OS8xMC9JTy9pby5odG1sCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjZGVmaW5lIFBBUlBPUlRfU0laRSAzCisKKyNkZWZpbmUgUEFSUE9SVF9BIDAKKyNkZWZpbmUgUEFSUE9SVF9CIDEKKyNkZWZpbmUgUEFSUE9SVF9DIDIKKworc3RhdGljIGludCBwYXJwb3J0X2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgcGFycG9ydF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9wYXJwb3J0ID0geworICAgICAgLmRyaXZlcl9uYW1lID0JImNvbWVkaV9wYXJwb3J0IiwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCXBhcnBvcnRfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQlwYXJwb3J0X2RldGFjaCwKK307CisKK0NPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfcGFycG9ydCk7CisKK3N0cnVjdCBwYXJwb3J0X3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBhX2RhdGE7CisJdW5zaWduZWQgaW50IGNfZGF0YTsKKwlpbnQgZW5hYmxlX2lycTsKK307CisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgcGFycG9ydF9wcml2YXRlICopKGRldi0+cHJpdmF0ZSkpCisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2EoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaWYgKGRhdGFbMF0pIHsKKwkJZGV2cHJpdi0+YV9kYXRhICY9IH5kYXRhWzBdOworCQlkZXZwcml2LT5hX2RhdGEgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKKworCQlvdXRiKGRldnByaXYtPmFfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0EpOworCX0KKworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0EpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2NvbmZpZ19hKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChkYXRhWzBdKSB7CisJCXMtPmlvX2JpdHMgPSAweGZmOworCQlkZXZwcml2LT5jX2RhdGEgJj0gfigxIDw8IDUpOworCX0gZWxzZSB7CisJCXMtPmlvX2JpdHMgPSAwOworCQlkZXZwcml2LT5jX2RhdGEgfD0gKDEgPDwgNSk7CisJfQorCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2luc25fYihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoZGF0YVswXSkgeworCQkvKiBzaG91bGQgd3JpdGVzIGJlIGlnbm9yZWQ/ICovCisJCS8qIGFueW9uZT8/PyAqLworCX0KKworCWRhdGFbMV0gPSAoaW5iKGRldi0+aW9iYXNlICsgUEFSUE9SVF9CKSA+PiAzKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW5zbl9jKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWRhdGFbMF0gJj0gMHgwZjsKKwlpZiAoZGF0YVswXSkgeworCQlkZXZwcml2LT5jX2RhdGEgJj0gfmRhdGFbMF07CisJCWRldnByaXYtPmNfZGF0YSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOworCisJCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisJfQorCisJZGF0YVsxXSA9IGRldnByaXYtPmNfZGF0YSAmIDB4ZjsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW50cl9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChpbnNuLT5uIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhWzFdID0gMDsKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2ludHJfY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBzdGVwIDEgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfRk9MTE9XOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogc3RlcCAyOiBpZ25vcmVkICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+Y29udmVydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IDEpIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSAxOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGlnbm9yZWQgKi8KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJZGV2cHJpdi0+Y19kYXRhIHw9IDB4MTA7CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCWRldnByaXYtPmVuYWJsZV9pcnEgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInBhcnBvcnRfaW50cl9jYW5jZWwoKVxuIik7CisKKwlkZXZwcml2LT5jX2RhdGEgJj0gfjB4MTA7CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCWRldnByaXYtPmVuYWJsZV9pcnEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwYXJwb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisKKwlpZiAoIWRldnByaXYtPmVuYWJsZV9pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGlfcGFycG9ydDogYm9ndXMgaXJxLCBpZ25vcmVkXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAwKTsKKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1M7CisKKwljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwYXJwb3J0OiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIFBBUlBPUlRfU0laRSwgInBhcnBvcnQgKGNvbWVkaSkiKSkgeworCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldi0+aW9iYXNlID0gaW9iYXNlOworCisJaXJxID0gaXQtPm9wdGlvbnNbMV07CisJaWYgKGlycSkgeworCQlwcmludGsoIiBpcnE9JXUiLCBpcnEpOworCQlyZXQgPSBjb21lZGlfcmVxdWVzdF9pcnEoaXJxLCBwYXJwb3J0X2ludGVycnVwdCwgMCwKKwkJCSJjb21lZGlfcGFycG9ydCIsIGRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoIiBpcnEgbm90IGF2YWlsYWJsZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZXYtPmlycSA9IGlycTsKKwl9CisJZGV2LT5ib2FyZF9uYW1lID0gInBhcnBvcnQiOworCisJcmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHBhcnBvcnRfcHJpdmF0ZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gODsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHBhcnBvcnRfaW5zbl9hOworCXMtPmluc25fY29uZmlnID0gcGFycG9ydF9pbnNuX2NvbmZpZ19hOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSA1OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnNuX2I7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDQ7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBwYXJwb3J0X2luc25fYzsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCWlmIChpcnEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NNRF9SRUFEOworCQlzLT5uX2NoYW4gPSAxOworCQlzLT5tYXhkYXRhID0gMTsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnRyX2luc247CisJCXMtPmRvX2NtZHRlc3QgPSBwYXJwb3J0X2ludHJfY21kdGVzdDsKKwkJcy0+ZG9fY21kID0gcGFycG9ydF9pbnRyX2NtZDsKKwkJcy0+Y2FuY2VsID0gcGFycG9ydF9pbnRyX2NhbmNlbDsKKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworCWRldnByaXYtPmFfZGF0YSA9IDA7CisJb3V0YihkZXZwcml2LT5hX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9BKTsKKwlkZXZwcml2LT5jX2RhdGEgPSAwOworCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXByaW50aygiY29tZWRpJWQ6IHBhcnBvcnQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisKKwlpZiAoZGV2LT5pb2Jhc2UpCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCBQQVJQT1JUX1NJWkUpOworCisJaWYgKGRldi0+aXJxKQorCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGEwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCisgICAgVmFyaW91cyBQQ0kgZnVuY3Rpb25zIGZvciBkcml2ZXJzLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESV9QQ0lfSF8KKyNkZWZpbmUgX0NPTUVESV9QQ0lfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisvKgorICogRW5hYmxlIHRoZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHRoZSByZWdpb25zLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfcGNpX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3QgY2hhciAqcmVzX25hbWUpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgcmVzX25hbWUpOworCWlmIChyYyA8IDApCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHJlZ2lvbnMgYW5kIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UuCisgKgorICogVGhpcyBtdXN0IGJlIG1hdGNoZWQgd2l0aCBhIHByZXZpb3VzIHN1Y2Nlc3NmdWwgY2FsbCB0byBjb21lZGlfcGNpX2VuYWJsZSgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3BjaV9kaXNhYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YzM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKworICAgIEdlbmVyYXRlcyBmYWtlIHdhdmVmb3JtIHNpZ25hbHMgdGhhdCBjYW4gYmUgcmVhZCB0aHJvdWdoCisgICAgdGhlIGNvbW1hbmQgaW50ZXJmYWNlLiAgSXQgZG9lcyBfbm90XyByZWFkIGZyb20gYW55IGJvYXJkOworICAgIGl0IGp1c3QgZ2VuZXJhdGVzIGRldGVybWluaXN0aWMgd2F2ZWZvcm1zLgorICAgIFVzZWZ1bCBmb3IgdmFyaW91cyB0ZXN0aW5nIHB1cnBvc2VzLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAyIEpvYWNoaW0gV3V0dGtlIDxKb2FjaGltLld1dHRrZUBpY24uc2llbWVucy5kZT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorRHJpdmVyOiBjb21lZGlfdGVzdAorRGVzY3JpcHRpb246IGdlbmVyYXRlcyBmYWtlIHdhdmVmb3JtcworQXV0aG9yOiBKb2FjaGltIFd1dHRrZSA8Sm9hY2hpbS5XdXR0a2VAaWNuLnNpZW1lbnMuZGU+LCBGcmFuayBNb3JpIEhlc3MKKyAgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCBkcworRGV2aWNlczoKK1N0YXR1czogd29ya3MKK1VwZGF0ZWQ6IFNhdCwgMTYgTWFyIDIwMDIgMTc6MzQ6NDggLTA4MDAKKworVGhpcyBkcml2ZXIgaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBidXQgY2FuIGFsc28gYmUgdXNlZCB0bworZ2VuZXJhdGUgc2FtcGxlIHdhdmVmb3JtcyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBkYXRhIGFjcXVpc2l0aW9uCitoYXJkd2FyZS4KKworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICBbMF0gLSBBbXBsaXR1ZGUgaW4gbWljcm92b2x0cyBmb3IgZmFrZSB3YXZlZm9ybXMgKGRlZmF1bHQgMSB2b2x0KQorICBbMV0gLSBQZXJpb2QgaW4gbWljcm9zZWNvbmRzIGZvciBmYWtlIHdhdmVmb3JtcyAoZGVmYXVsdCAwLjEgc2VjKQorCitHZW5lcmF0ZXMgYSBzYXd0b290aCB3YXZlIG9uIGNoYW5uZWwgMCwgc3F1YXJlIHdhdmUgb24gY2hhbm5lbCAxLCBhZGRpdGlvbmFsCit3YXZlZm9ybXMgY291bGQgYmUgYWRkZWQgdG8gb3RoZXIgY2hhbm5lbHMgKGN1cnJlbnRseSB0aGV5IHJldHVybiBmbGF0bGluZQoremVybyB2b2x0cykuCisKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisKKy8qIEJvYXJkIGRlc2NyaXB0aW9ucyAqLworc3RydWN0IHdhdmVmb3JtX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBhaV9jaGFuczsKKwlpbnQgYWlfYml0czsKKwlpbnQgaGF2ZV9kaW87Cit9OworCisjZGVmaW5lIE5fQ0hBTlMgOAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdmVmb3JtX2JvYXJkIHdhdmVmb3JtX2JvYXJkc1tdID0geworCXsKKwkJLm5hbWUgPQkJImNvbWVkaV90ZXN0IiwKKwkJLmFpX2NoYW5zID0JTl9DSEFOUywKKwkJLmFpX2JpdHMgPQkxNiwKKwkJLmhhdmVfZGlvID0JMCwKKwl9LAorfTsKKworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQgKilkZXYtPmJvYXJkX3B0cikKKworLyogRGF0YSB1bmlxdWUgdG8gdGhpcyBkcml2ZXIgKi8KK3N0cnVjdCB3YXZlZm9ybV9wcml2YXRlIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgdGltZXZhbCBsYXN0OwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgdGltZXIgaW50ZXJydXB0IG9jY3VyZWQgKi8KKwl1bnNpZ25lZCBpbnQgdXZvbHRfYW1wbGl0dWRlOwkvKiB3YXZlZm9ybSBhbXBsaXR1ZGUgaW4gbWljcm92b2x0cyAqLworCXVuc2lnbmVkIGxvbmcgdXNlY19wZXJpb2Q7CS8qIHdhdmVmb3JtIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIHVzZWNfY3VycmVudDsgLyogY3VycmVudCB0aW1lIChtb2R1bG8gd2F2ZWZvcm0gcGVyaW9kKSAqLworCXVuc2lnbmVkIGxvbmcgdXNlY19yZW1haW5kZXI7CS8qIHVzZWMgc2luY2UgbGFzdCBzY2FuOyAqLworCXVuc2lnbmVkIGxvbmcgYWlfY291bnQ7CS8qIG51bWJlciBvZiBjb252ZXJzaW9ucyByZW1haW5pbmcgKi8KKwl1bnNpZ25lZCBpbnQgc2Nhbl9wZXJpb2Q7CS8qIHNjYW4gcGVyaW9kIGluIHVzZWMgKi8KKwl1bnNpZ25lZCBpbnQgY29udmVydF9wZXJpb2Q7CS8qIGNvbnZlcnNpb24gcGVyaW9kIGluIHVzZWMgKi8KKwl1bnNpZ25lZCB0aW1lcl9ydW5uaW5nOjE7CisJbHNhbXBsX3QgYW9fbG9vcGJhY2tzW05fQ0hBTlNdOworfTsKKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCB3YXZlZm9ybV9wcml2YXRlICopZGV2LT5wcml2YXRlKQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfd2F2ZWZvcm0gPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQkiY29tZWRpX3Rlc3QiLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJd2F2ZWZvcm1fYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQl3YXZlZm9ybV9kZXRhY2gsCisgICAgICAuYm9hcmRfbmFtZSA9CSZ3YXZlZm9ybV9ib2FyZHNbMF0ubmFtZSwKKyAgICAgIC5vZmZzZXQgPQkJc2l6ZW9mKHN0cnVjdCB3YXZlZm9ybV9ib2FyZCksCisgICAgICAubnVtX25hbWVzID0Jc2l6ZW9mKHdhdmVmb3JtX2JvYXJkcykgLyBzaXplb2Yoc3RydWN0IHdhdmVmb3JtX2JvYXJkKSwKK307CisKK0NPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfd2F2ZWZvcm0pOworCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9jbWQgKmNtZCk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCB3YXZlZm9ybV9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworc3RhdGljIHNhbXBsX3QgZmFrZV9zYXd0b290aChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpOworc3RhdGljIHNhbXBsX3QgZmFrZV9zcXVhcmV3YXZlKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKK3N0YXRpYyBzYW1wbF90IGZha2VfZmxhdGxpbmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKK3N0YXRpYyBzYW1wbF90IGZha2Vfd2F2ZWZvcm0oY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSk7CisKKy8qIDEwMDAgbmFub3NlYyBpbiBhIG1pY3Jvc2VjICovCitzdGF0aWMgY29uc3QgaW50IG5hbm9fcGVyX21pY3JvID0gMTAwMDsKKworLyogZmFrZSBhbmFsb2cgaW5wdXQgcmFuZ2VzICovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSB3YXZlZm9ybV9haV9yYW5nZXMgPSB7CisJMiwKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQl9Cit9OworCisvKgorICAgVGhpcyBpcyB0aGUgYmFja2dyb3VuZCByb3V0aW5lIHVzZWQgdG8gZ2VuZXJhdGUgYXJiaXRyYXJ5IGRhdGEuCisgICBJdCBzaG91bGQgcnVuIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGVyZWZvcmUgaXQgaXMgc2NoZWR1bGVkIGJ5CisgICBhIHRpbWVyIG1lY2hhbmlzbS4KKyovCitzdGF0aWMgdm9pZCB3YXZlZm9ybV9haV9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgYXJnOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBkZXYtPnJlYWRfc3ViZGV2LT5hc3luYzsKKwljb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwkvKiBhbGwgdGltZXMgaW4gbWljcm9zZWMgKi8KKwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfdGltZTsKKwl1bnNpZ25lZCBpbnQgbnVtX3NjYW5zOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKworCWVsYXBzZWRfdGltZSA9CisJCTEwMDAwMDAgKiAobm93LnR2X3NlYyAtIGRldnByaXYtPmxhc3QudHZfc2VjKSArIG5vdy50dl91c2VjIC0KKwkJZGV2cHJpdi0+bGFzdC50dl91c2VjOworCWRldnByaXYtPmxhc3QgPSBub3c7CisJbnVtX3NjYW5zID0KKwkJKGRldnByaXYtPnVzZWNfcmVtYWluZGVyICsgZWxhcHNlZF90aW1lKSAvIGRldnByaXYtPnNjYW5fcGVyaW9kOworCWRldnByaXYtPnVzZWNfcmVtYWluZGVyID0KKwkJKGRldnByaXYtPnVzZWNfcmVtYWluZGVyICsgZWxhcHNlZF90aW1lKSAlIGRldnByaXYtPnNjYW5fcGVyaW9kOworCWFzeW5jLT5ldmVudHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9zY2FuczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjbWQtPmNoYW5saXN0X2xlbjsgaisrKSB7CisJCQljZmNfd3JpdGVfdG9fYnVmZmVyKGRldi0+cmVhZF9zdWJkZXYsCisJCQkJZmFrZV93YXZlZm9ybShkZXYsIENSX0NIQU4oY21kLT5jaGFubGlzdFtqXSksCisJCQkJCUNSX1JBTkdFKGNtZC0+Y2hhbmxpc3Rbal0pLAorCQkJCQlkZXZwcml2LT51c2VjX2N1cnJlbnQgKworCQkJCQlpICogZGV2cHJpdi0+c2Nhbl9wZXJpb2QgKworCQkJCQlqICogZGV2cHJpdi0+Y29udmVydF9wZXJpb2QpKTsKKwkJfQorCQlkZXZwcml2LT5haV9jb3VudCsrOworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UCisJCQkmJiBkZXZwcml2LT5haV9jb3VudCA+PSBjbWQtPnN0b3BfYXJnKSB7CisJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRldnByaXYtPnVzZWNfY3VycmVudCArPSBlbGFwc2VkX3RpbWU7CisJZGV2cHJpdi0+dXNlY19jdXJyZW50ICU9IGRldnByaXYtPnVzZWNfcGVyaW9kOworCisJaWYgKChhc3luYy0+ZXZlbnRzICYgQ09NRURJX0NCX0VPQSkgPT0gMCAmJiBkZXZwcml2LT50aW1lcl9ydW5uaW5nKQorCQltb2RfdGltZXIoJmRldnByaXYtPnRpbWVyLCBqaWZmaWVzICsgMSk7CisJZWxzZQorCQlkZWxfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKKworCWNvbWVkaV9ldmVudChkZXYsIGRldi0+cmVhZF9zdWJkZXYpOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IGFtcGxpdHVkZSA9IGl0LT5vcHRpb25zWzBdOworCWludCBwZXJpb2QgPSBpdC0+b3B0aW9uc1sxXTsKKwlpbnQgaTsKKworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNib2FyZC0+bmFtZTsKKworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCB3YXZlZm9ybV9wcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHNldCBkZWZhdWx0IGFtcGxpdHVkZSBhbmQgcGVyaW9kICovCisJaWYgKGFtcGxpdHVkZSA8PSAwKQorCQlhbXBsaXR1ZGUgPSAxMDAwMDAwOwkvKiAxIHZvbHQgKi8KKwlpZiAocGVyaW9kIDw9IDApCisJCXBlcmlvZCA9IDEwMDAwMDsJLyogMC4xIHNlYyAqLworCisJZGV2cHJpdi0+dXZvbHRfYW1wbGl0dWRlID0gYW1wbGl0dWRlOworCWRldnByaXYtPnVzZWNfcGVyaW9kID0gcGVyaW9kOworCisJZGV2LT5uX3N1YmRldmljZXMgPSAyOworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2LT5uX3N1YmRldmljZXMpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haV9jaGFuczsKKwlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5haV9iaXRzKSAtIDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmd2F2ZWZvcm1fYWlfcmFuZ2VzOworCXMtPmxlbl9jaGFubGlzdCA9IHMtPm5fY2hhbiAqIDI7CisJcy0+aW5zbl9yZWFkID0gd2F2ZWZvcm1fYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZCA9IHdhdmVmb3JtX2FpX2NtZDsKKwlzLT5kb19jbWR0ZXN0ID0gd2F2ZWZvcm1fYWlfY21kdGVzdDsKKwlzLT5jYW5jZWwgPSB3YXZlZm9ybV9haV9jYW5jZWw7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwlkZXYtPndyaXRlX3N1YmRldiA9IHM7CisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKGxvb3BiYWNrKSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFIHwgU0RGX0dST1VORDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpX2NoYW5zOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpX2JpdHMpIC0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZ3YXZlZm9ybV9haV9yYW5nZXM7CisJcy0+bGVuX2NoYW5saXN0ID0gcy0+bl9jaGFuICogMjsKKwlzLT5pbnNuX3dyaXRlID0gd2F2ZWZvcm1fYW9faW5zbl93cml0ZTsKKwlzLT5kb19jbWQgPSBOVUxMOworCXMtPmRvX2NtZHRlc3QgPSBOVUxMOworCXMtPmNhbmNlbCA9IE5VTEw7CisKKwkvKiBPdXIgZGVmYXVsdCBsb29wYmFjayB2YWx1ZSBpcyBqdXN0IGEgMFYgZmxhdGxpbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspCisJCWRldnByaXYtPmFvX2xvb3BiYWNrc1tpXSA9IHMtPm1heGRhdGEgLyAyOworCisJaW5pdF90aW1lcigmKGRldnByaXYtPnRpbWVyKSk7CisJZGV2cHJpdi0+dGltZXIuZnVuY3Rpb24gPSB3YXZlZm9ybV9haV9pbnRlcnJ1cHQ7CisJZGV2cHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBjb21lZGlfdGVzdDogIgorCQkiJWkgbWljcm92b2x0LCAlbGkgbWljcm9zZWNvbmQgd2F2ZWZvcm0gYXR0YWNoZWRcbiIsIGRldi0+bWlub3IsCisJCWRldnByaXYtPnV2b2x0X2FtcGxpdHVkZSwgZGV2cHJpdi0+dXNlY19wZXJpb2QpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKCJjb21lZGklZDogY29tZWRpX3Rlc3Q6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisKKwlpZiAoZGV2LT5wcml2YXRlKQorCQl3YXZlZm9ybV9haV9jYW5jZWwoZGV2LCBkZXYtPnJlYWRfc3ViZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX1RJTUVSOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKi8KKworCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnICE9IDApIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IG5hbm9fcGVyX21pY3JvKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gbmFub19wZXJfbWljcm87CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSICYmCisJCQljbWQtPnNjYW5fYmVnaW5fYXJnIDwKKwkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbikgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9CisJCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJZXJyKys7CisJCX0KKwl9CisJLyoKKwkgKiBYWFggdGhlc2UgY2hlY2tzIGFyZSBnZW5lcmljIGFuZCBzaG91bGQgZ28gaW4gY29yZSBpZiBub3QgdGhlcmUKKwkgKiBhbHJlYWR5CisJICovCisJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPmNoYW5saXN0X2xlbiA9IDE7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoIWNtZC0+c3RvcF9hcmcpIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAxOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgewkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCW5hbm9fcGVyX21pY3JvICogKCh0bXAgKworCQkJCShuYW5vX3Blcl9taWNybyAvIDIpKSAvIG5hbm9fcGVyX21pY3JvKTsKKwkJaWYgKHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fYXJnKQorCQkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKKwkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLworCQljbWQtPmNvbnZlcnRfYXJnID0KKwkJCW5hbm9fcGVyX21pY3JvICogKCh0bXAgKworCQkJCShuYW5vX3Blcl9taWNybyAvIDIpKSAvIG5hbm9fcGVyX21pY3JvKTsKKwkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQorCQkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9haV9jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JUKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkiY29tbWFuZHMgYXQgUlQgcHJpb3JpdHkgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2cHJpdi0+dGltZXJfcnVubmluZyA9IDE7CisJZGV2cHJpdi0+YWlfY291bnQgPSAwOworCWRldnByaXYtPnNjYW5fcGVyaW9kID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIG5hbm9fcGVyX21pY3JvOworCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cpCisJCWRldnByaXYtPmNvbnZlcnRfcGVyaW9kID0gMDsKKwllbHNlIGlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCisJCWRldnByaXYtPmNvbnZlcnRfcGVyaW9kID0gY21kLT5jb252ZXJ0X2FyZyAvIG5hbm9fcGVyX21pY3JvOworCWVsc2UgeworCQljb21lZGlfZXJyb3IoZGV2LCAiYnVnIHNldHRpbmcgY29udmVyc2lvbiBwZXJpb2QiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmZGV2cHJpdi0+bGFzdCk7CisJZGV2cHJpdi0+dXNlY19jdXJyZW50ID0gZGV2cHJpdi0+bGFzdC50dl91c2VjICUgZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisJZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgPSAwOworCisJZGV2cHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCWFkZF90aW1lcigmZGV2cHJpdi0+dGltZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJZGV2cHJpdi0+dGltZXJfcnVubmluZyA9IDA7CisJZGVsX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzYW1wbF90IGZha2Vfc2F3dG9vdGgoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2VfaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzLT5tYXhkYXRhIC8gMjsKKwl1NjQgdmFsdWU7CisJY29uc3QgY29tZWRpX2tyYW5nZSAqa3JhbmdlID0gJnMtPnJhbmdlX3RhYmxlLT5yYW5nZVtyYW5nZV9pbmRleF07CisJdTY0IGJpbmFyeV9hbXBsaXR1ZGU7CisKKwliaW5hcnlfYW1wbGl0dWRlID0gcy0+bWF4ZGF0YTsKKwliaW5hcnlfYW1wbGl0dWRlICo9IGRldnByaXYtPnV2b2x0X2FtcGxpdHVkZTsKKwlkb19kaXYoYmluYXJ5X2FtcGxpdHVkZSwga3JhbmdlLT5tYXggLSBrcmFuZ2UtPm1pbik7CisKKwljdXJyZW50X3RpbWUgJT0gZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisJdmFsdWUgPSBjdXJyZW50X3RpbWU7CisJdmFsdWUgKj0gYmluYXJ5X2FtcGxpdHVkZSAqIDI7CisJZG9fZGl2KHZhbHVlLCBkZXZwcml2LT51c2VjX3BlcmlvZCk7CisJdmFsdWUgLT0gYmluYXJ5X2FtcGxpdHVkZTsJLyogZ2V0IHJpZCBvZiBzYXd0b290aCdzIGRjIG9mZnNldCAqLworCisJcmV0dXJuIG9mZnNldCArIHZhbHVlOworfQorc3RhdGljIHNhbXBsX3QgZmFrZV9zcXVhcmV3YXZlKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlX2luZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzLT5tYXhkYXRhIC8gMjsKKwl1NjQgdmFsdWU7CisJY29uc3QgY29tZWRpX2tyYW5nZSAqa3JhbmdlID0gJnMtPnJhbmdlX3RhYmxlLT5yYW5nZVtyYW5nZV9pbmRleF07CisJY3VycmVudF90aW1lICU9IGRldnByaXYtPnVzZWNfcGVyaW9kOworCisJdmFsdWUgPSBzLT5tYXhkYXRhOworCXZhbHVlICo9IGRldnByaXYtPnV2b2x0X2FtcGxpdHVkZTsKKwlkb19kaXYodmFsdWUsIGtyYW5nZS0+bWF4IC0ga3JhbmdlLT5taW4pOworCisJaWYgKGN1cnJlbnRfdGltZSA8IGRldnByaXYtPnVzZWNfcGVyaW9kIC8gMikKKwkJdmFsdWUgKj0gLTE7CisKKwlyZXR1cm4gb2Zmc2V0ICsgdmFsdWU7Cit9CisKK3N0YXRpYyBzYW1wbF90IGZha2VfZmxhdGxpbmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2VfaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCXJldHVybiBkZXYtPnJlYWRfc3ViZGV2LT5tYXhkYXRhIC8gMjsKK30KKworLyogZ2VuZXJhdGVzIGEgZGlmZmVyZW50IHdhdmVmb3JtIGRlcGVuZGluZyBvbiB3aGF0IGNoYW5uZWwgaXMgcmVhZCAqLworc3RhdGljIHNhbXBsX3QgZmFrZV93YXZlZm9ybShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWVudW0geworCQlTQVdUT09USF9DSEFOLAorCQlTUVVBUkVfQ0hBTiwKKwl9OworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgU0FXVE9PVEhfQ0hBTjoKKwkJcmV0dXJuIGZha2Vfc2F3dG9vdGgoZGV2LCByYW5nZSwgY3VycmVudF90aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBTUVVBUkVfQ0hBTjoKKwkJcmV0dXJuIGZha2Vfc3F1YXJld2F2ZShkZXYsIHJhbmdlLCBjdXJyZW50X3RpbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFrZV9mbGF0bGluZShkZXYsIHJhbmdlLCBjdXJyZW50X3RpbWUpOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaSwgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX2xvb3BiYWNrc1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpLCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkZXZwcml2LT5hb19sb29wYmFja3NbY2hhbl0gPSBkYXRhW2ldOworCisJcmV0dXJuIGluc24tPm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMjE3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYwpAQCAtMCwwICsxLDExNjIgQEAKKy8qCisgKiBjb21lZGkvZHJpdmVycy9kdDk4MTIuYworICogICBDT01FREkgZHJpdmVyIGZvciBEYXRhVHJhbnNsYXRpb24gRFQ5ODEyIFVTQiBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+CisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qCitEcml2ZXI6IGR0OTgxMgorRGVzY3JpcHRpb246IERhdGEgVHJhbnNsYXRpb24gRFQ5ODEyIFVTQiBtb2R1bGUKK0F1dGhvcjogYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlIChBbmRlcnMgQmxvbWRlbGwpCitTdGF0dXM6IGluIGRldmVsb3BtZW50CitEZXZpY2VzOiBbRGF0YSBUcmFuc2xhdGlvbl0gRFQ5ODEyIChkdDk4MTIpCitVcGRhdGVkOiBTdW4gTm92IDIwIDIwOjE4OjM0IEVTVCAyMDA1CisKK1RoaXMgZHJpdmVyIHdvcmtzLCBidXQgYnVsayB0cmFuc2ZlcnMgbm90IGltcGxlbWVudGVkLiBNaWdodCBiZSBhIHN0YXJ0aW5nIHBvaW50Citmb3Igc29tZW9uZSBlbHNlLiBJIGZvdW5kIG91dCB0b28gbGF0ZSB0aGF0IFVTQiBoYXMgdG9vIGhpZ2ggbGF0ZW5jaWVzICg+MSBtcykKK2ZvciBteSBuZWVkcy4KKyovCisKKy8qCisgKiBOb3RhIEJlbmU6CisgKiAgIDEuIEFsbCB3cml0ZXMgdG8gY29tbWFuZCBwaXBlIGhhcyB0byBiZSAzMiBieXRlcyAoSVNQMTE4MUIgU0hSVFA9MCA/KQorICogICAyLiBUaGUgRERLIHNvdXJjZSAoYXMgb2Ygc2VwIDIwMDUpIGlzIGluIGVycm9yIHJlZ2FyZGluZyB0aGUKKyAqICAgICAgaW5wdXQgTVVYIGJpdHMgKGV4YW1wbGUgY29kZSBzYXlzIFA0LCBidXQgZmlybXdhcmUgc2NoZW1hdGljcworICogICAgICBzYXlzIFAxKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBEVDk4MTJfRElBR1NfQk9BUkRfSU5GT19BRERSCTB4RkJGRgorI2RlZmluZSBEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUJMzIKKyNkZWZpbmUgRFQ5ODEyX01BWF9SRUFEX0NNRF9QSVBFX1NJWkUJMzIKKworLyoKKyAqIFNlZSBTaWxpY2FuIExhYm9yYXRvcmllcyBDODA1MUYwMjAvMS8yLzMgbWFudWFsCisgKi8KKyNkZWZpbmUgRjAyMF9TRlJfUDQJCQkweDg0CisjZGVmaW5lIEYwMjBfU0ZSX1AxCQkJMHg5MAorI2RlZmluZSBGMDIwX1NGUl9QMgkJCTB4YTAKKyNkZWZpbmUgRjAyMF9TRlJfUDMJCQkweGIwCisjZGVmaW5lIEYwMjBfU0ZSX0FNWDBDRgkJCTB4YmEKKyNkZWZpbmUgRjAyMF9TRlJfQU1YMFNMCQkJMHhiYgorI2RlZmluZSBGMDIwX1NGUl9BREMwQ0YJCQkweGJjCisjZGVmaW5lIEYwMjBfU0ZSX0FEQzBMCQkJMHhiZQorI2RlZmluZSBGMDIwX1NGUl9BREMwSAkJCTB4YmYKKyNkZWZpbmUgRjAyMF9TRlJfREFDMEwJCQkweGQyCisjZGVmaW5lIEYwMjBfU0ZSX0RBQzBICQkJMHhkMworI2RlZmluZSBGMDIwX1NGUl9EQUMwQ04JCQkweGQ0CisjZGVmaW5lIEYwMjBfU0ZSX0RBQzFMCQkJMHhkNQorI2RlZmluZSBGMDIwX1NGUl9EQUMxSAkJCTB4ZDYKKyNkZWZpbmUgRjAyMF9TRlJfREFDMUNOCQkJMHhkNworI2RlZmluZSBGMDIwX1NGUl9BREMwQ04JCQkweGU4CisKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wCTB4MDEKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xCTB4MDIKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04yCTB4MDQKKworI2RlZmluZSBGMDIwX01BU0tfQURDMENOX0FEMEVOCQkweDgwCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ05fQUQwSU5UCQkweDIwCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ05fQUQwQlVTWQkweDEwCisKKyNkZWZpbmUgRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU4JCTB4ODAKKworZW51bSB7CisJCQkJLyogQS9EICBEL0EgIERJICBETyAgQ1QgKi8KKwlEVDk4MTJfREVWSURfRFQ5ODEyXzEwLAkvKiAgOCAgICAyICAgOCAgIDggICAxICArLy0gMTBWICovCisJRFQ5ODEyX0RFVklEX0RUOTgxMl8yUFQ1LC8qIDggICAgMiAgIDggICA4ICAgMSAgMC0yLjQ0ViAqLworI2lmIDAKKwlEVDk4MTJfREVWSURfRFQ5ODEzLAkvKiAgMTYgICAyICAgNCAgIDQgICAxICArLy0gMTBWICovCisJRFQ5ODEyX0RFVklEX0RUOTgxNAkvKiAgMjQgICAyICAgMCAgIDAgICAxICArLy0gMTBWICovCisjZW5kaWYKK307CisKK2VudW0gZHQ5ODEyX2dhaW4geworCURUOTgxMl9HQUlOXzBQVDI1ID0gMSwKKwlEVDk4MTJfR0FJTl8wUFQ1ID0gMiwKKwlEVDk4MTJfR0FJTl8xID0gNCwKKwlEVDk4MTJfR0FJTl8yID0gOCwKKwlEVDk4MTJfR0FJTl80ID0gMTYsCisJRFQ5ODEyX0dBSU5fOCA9IDMyLAorCURUOTgxMl9HQUlOXzE2ID0gNjQsCit9OworCitlbnVtIHsKKwlEVDk4MTJfTEVBU1RfVVNCX0ZJUk1XQVJFX0NNRF9DT0RFID0gMCwKKwkvKiBXcml0ZSBGbGFzaCBtZW1vcnkgKi8KKwlEVDk4MTJfV19GTEFTSF9EQVRBID0gMCwKKwkvKiBSZWFkIEZsYXNoIG1lbW9yeSBtaXNjIGNvbmZpZyBpbmZvICovCisJRFQ5ODEyX1JfRkxBU0hfREFUQSA9IDEsCisKKwkvKgorCSAqIFJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIHByb2Nlc3NvcgorCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfUl9TSU5HTEVfQllURV9SRUcgPSAyLAorCS8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9XX1NJTkdMRV9CWVRFX1JFRyA9IDMsCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfUkVHID0gNCwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9XX01VTFRJX0JZVEVfUkVHID0gNSwKKwkvKiBSZWFkLCAoQU5EKSB3aXRoIG1hc2ssIE9SIHZhbHVlLCB0aGVuIHdyaXRlIChzaW5nbGUpICovCisJRFQ5ODEyX1JNV19TSU5HTEVfQllURV9SRUcgPSA2LAorCS8qIFJlYWQsIChBTkQpIHdpdGggbWFzaywgT1IgdmFsdWUsIHRoZW4gd3JpdGUgKG11bHRpcGxlKSAqLworCURUOTgxMl9STVdfTVVMVElfQllURV9SRUcgPSA3LAorCisJLyoKKwkgKiBSZWdpc3RlciByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciBTTUJ1cworCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIFNNQnVzICovCisJRFQ5ODEyX1JfU0lOR0xFX0JZVEVfU01CVVMgPSA4LAorCS8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgb2YgU01CdXMgKi8KKwlEVDk4MTJfV19TSU5HTEVfQllURV9TTUJVUyA9IDksCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgU01CdXMgKi8KKwlEVDk4MTJfUl9NVUxUSV9CWVRFX1NNQlVTID0gMTAsCisJLyogTXVsdGlwbGUgV3JpdGVzIG9mIFNNQnVzICovCisJRFQ5ODEyX1dfTVVMVElfQllURV9TTUJVUyA9IDExLAorCisJLyoKKwkgKiBSZWdpc3RlciByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciBhIGRldmljZQorCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1JfU0lOR0xFX0JZVEVfREVWID0gMTIsCisJLyogV3JpdGUgYSBzaW5nbGUgYnl0ZSBvZiBhIGRldmljZSAqLworCURUOTgxMl9XX1NJTkdMRV9CWVRFX0RFViA9IDEzLAorCS8qIE11bHRpcGxlIFJlYWRzIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1JfTVVMVElfQllURV9ERVYgPSAxNCwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgb2YgYSBkZXZpY2UgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX0RFViA9IDE1LAorCisJLyogTm90IHN1cmUgaWYgd2UnbGwgbmVlZCB0aGlzICovCisJRFQ5ODEyX1dfREFDX1RIUkVTSE9MRCA9IDE2LAorCisJLyogU2V0IGludGVycnVwdCBvbiBjaGFuZ2UgbWFzayAqLworCURUOTgxMl9XX0lOVF9PTl9DSEFOR0VfTUFTSyA9IDE3LAorCisJLyogV3JpdGUgKG9yIENsZWFyKSB0aGUgQ0dMIGZvciB0aGUgQURDICovCisJRFQ5ODEyX1dfQ0dMID0gMTgsCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfVVNCTUVNID0gMTksCisJLyogTXVsdGlwbGUgV3JpdGVzIHRvIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX1VTQk1FTSA9IDIwLAorCisJLyogSXNzdWUgYSBzdGFydCBjb21tYW5kIHRvIGEgZ2l2ZW4gc3Vic3lzdGVtICovCisJRFQ5ODEyX1NUQVJUX1NVQlNZU1RFTSA9IDIxLAorCS8qIElzc3VlIGEgc3RvcCBjb21tYW5kIHRvIGEgZ2l2ZW4gc3Vic3lzdGVtICovCisJRFQ5ODEyX1NUT1BfU1VCU1lTVEVNID0gMjIsCisKKwkvKiBjYWxpYnJhdGUgdGhlIGJvYXJkIHVzaW5nIENBTF9QT1RfQ01EICovCisJRFQ5ODEyX0NBTElCUkFURV9QT1QgPSAyMywKKwkvKiBzZXQgdGhlIERBQyBGSUZPIHNpemUgKi8KKwlEVDk4MTJfV19EQUNfRklGT19TSVpFID0gMjQsCisJLyogV3JpdGUgb3IgQ2xlYXIgdGhlIENHTCBmb3IgdGhlIERBQyAqLworCURUOTgxMl9XX0NHTF9EQUMgPSAyNSwKKwkvKiBSZWFkIGEgc2luZ2xlIHZhbHVlIGZyb20gYSBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfUl9TSU5HTEVfVkFMVUVfQ01EID0gMjYsCisJLyogV3JpdGUgYSBzaW5nbGUgdmFsdWUgdG8gYSBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfV19TSU5HTEVfVkFMVUVfQ01EID0gMjcsCisJLyogVmFsaWQgRFQ5ODEyX1VTQl9GSVJNV0FSRV9DTURfQ09ERSdzIHdpbGwgYmUgbGVzcyB0aGFuIHRoaXMgbnVtYmVyICovCisJRFQ5ODEyX01BWF9VU0JfRklSTVdBUkVfQ01EX0NPREUsCit9OworCitzdHJ1Y3QgZHQ5ODEyX2ZsYXNoX2RhdGEgeworCXUxNiBudW1ieXRlczsKKwl1MTYgYWRkcmVzczsKK307CisKKyNkZWZpbmUgRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9SRFMgIFwKKyAgICAoKERUOTgxMl9NQVhfV1JJVEVfQ01EX1BJUEVfU0laRSAtIDQgLSAxKSAvIHNpemVvZih1OCkpCisKK3N0cnVjdCBkdDk4MTJfcmVhZF9tdWx0aSB7CisJdTggY291bnQ7CisJdTggYWRkcmVzc1tEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JEU107Cit9OworCitzdHJ1Y3QgZHQ5ODEyX3dyaXRlX2J5dGUgeworCXU4IGFkZHJlc3M7CisJdTggdmFsdWU7Cit9OworCisjZGVmaW5lIERUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfV1JUUyAgXAorICAgICgoRFQ5ODEyX01BWF9XUklURV9DTURfUElQRV9TSVpFIC0gNCAtIDEpIC8gXAorICAgICAgc2l6ZW9mKHN0cnVjdCBkdDk4MTJfd3JpdGVfYnl0ZSkpCisKK3N0cnVjdCBkdDk4MTJfd3JpdGVfbXVsdGkgeworCXU4IGNvdW50OworCXN0cnVjdCBkdDk4MTJfd3JpdGVfYnl0ZSB3cml0ZVtEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1dSVFNdOworfTsKKworc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSB7CisJdTggYWRkcmVzczsKKwl1OCBhbmRfbWFzazsKKwl1OCBvcl92YWx1ZTsKK307CisKKyNkZWZpbmUgRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9STVdTICBcCisgICAgKChEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUgLSA0IC0gMSkgLyBzaXplb2Yoc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSkpCisKK3N0cnVjdCBkdDk4MTJfcm13X211bHRpIHsKKwl1OCBjb3VudDsKKwlzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlIHJtd1tEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JNV1NdOworfTsKKworc3RydWN0IGR0OTgxMl91c2JfY21kIHsKKwl1MzIgY21kOworCXVuaW9uIHsKKwkJc3RydWN0IGR0OTgxMl9mbGFzaF9kYXRhIGZsYXNoX2RhdGFfaW5mbzsKKwkJc3RydWN0IGR0OTgxMl9yZWFkX211bHRpIHJlYWRfbXVsdGlfaW5mbzsKKwkJc3RydWN0IGR0OTgxMl93cml0ZV9tdWx0aSB3cml0ZV9tdWx0aV9pbmZvOworCQlzdHJ1Y3QgZHQ5ODEyX3Jtd19tdWx0aSBybXdfbXVsdGlfaW5mbzsKKwl9IHU7CisjaWYgMAorCVdSSVRFX0JZVEVfSU5GTyBXcml0ZUJ5dGVJbmZvOworCVJFQURfQllURV9JTkZPIFJlYWRCeXRlSW5mbzsKKwlXUklURV9NVUxUSV9JTkZPIFdyaXRlTXVsdGlJbmZvOworCVJFQURfTVVMVElfSU5GTyBSZWFkTXVsdGlJbmZvOworCVJNV19CWVRFX0lORk8gUk1XQnl0ZUluZm87CisJUk1XX01VTFRJX0lORk8gUk1XTXVsdGlJbmZvOworCURBQ19USFJFU0hPTERfSU5GTyBEYWNUaHJlc2hvbGRJbmZvOworCUlOVF9PTl9DSEFOR0VfTUFTS19JTkZPIEludE9uQ2hhbmdlTWFza0luZm87CisJQ0dMX0lORk8gQ2dsSW5mbzsKKwlTVUJTWVNURU1fSU5GTyBTdWJzeXN0ZW1JbmZvOworCUNBTF9QT1RfQ01EIENhbFBvdENtZDsKKwlXUklURV9ERVZfQllURV9JTkZPIFdyaXRlRGV2Qnl0ZUluZm87CisJUkVBRF9ERVZfQllURV9JTkZPIFJlYWREZXZCeXRlSW5mbzsKKwlXUklURV9ERVZfTVVMVElfSU5GTyBXcml0ZURldk11bHRpSW5mbzsKKwlSRUFEX0RFVl9NVUxUSV9JTkZPIFJlYWREZXZNdWx0aUluZm87CisJUkVBRF9TSU5HTEVfVkFMVUVfSU5GTyBSZWFkU2luZ2xlVmFsdWVJbmZvOworCVdSSVRFX1NJTkdMRV9WQUxVRV9JTkZPIFdyaXRlU2luZ2xlVmFsdWVJbmZvOworI2VuZGlmCit9OworCisjZGVmaW5lIERUOTgxMl9OVU1fU0xPVFMJMTYKKworc3RhdGljIERFQ0xBUkVfTVVURVgoZHQ5ODEyX211dGV4KTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGR0OTgxMl90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDg2NywgMHg5ODEyKX0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkdDk4MTJfdGFibGUpOworCitzdHJ1Y3QgdXNiX2R0OTgxMiB7CisJc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdTE2IHZlbmRvcjsKKwl1MTYgcHJvZHVjdDsKKwl1MTYgZGV2aWNlOworCXUzMiBzZXJpYWw7CisJc3RydWN0IHsKKwkJX191OCBhZGRyOworCQlzaXplX3Qgc2l6ZTsKKwl9IG1lc3NhZ2VfcGlwZSwgY29tbWFuZF93cml0ZSwgY29tbWFuZF9yZWFkLCB3cml0ZV9zdHJlYW0sIHJlYWRfc3RyZWFtOworCXN0cnVjdCBrcmVmIGtyZWY7CisJdTE2IGFuYWxvZ19vdXRfc2hhZG93WzJdOworCXU4IGRpZ2l0YWxfb3V0X3NoYWRvdzsKK307CisKK3N0cnVjdCBjb21lZGlfZHQ5ODEyIHsKKwlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3Q7CisJdTMyIHNlcmlhbDsKK307CisKK3N0cnVjdCBzbG90X2R0OTgxMiB7CisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKKwl1MzIgc2VyaWFsOworCXN0cnVjdCB1c2JfZHQ5ODEyICp1c2I7CisJc3RydWN0IGNvbWVkaV9kdDk4MTIgKmNvbWVkaTsKK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIGR0OTgxMl8xMF9haW5fcmFuZ2UgPSB7IDEsIHsKKwkJCUJJUF9SQU5HRSgxMCksCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgZHQ5ODEyXzJwdDVfYWluX3JhbmdlID0geyAxLCB7CisJCQlVTklfUkFOR0UoMi41KSwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMTBfYW91dF9yYW5nZSA9IHsgMSwgeworCQkJQklQX1JBTkdFKDEwKSwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMnB0NV9hb3V0X3JhbmdlID0geyAxLCB7CisJCQlVTklfUkFOR0UoMi41KSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHNsb3RfZHQ5ODEyIGR0OTgxMltEVDk4MTJfTlVNX1NMT1RTXTsKKworLyogVXNlZnVsIHNob3J0aGFuZCBhY2Nlc3MgdG8gcHJpdmF0ZSBkYXRhICovCisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgY29tZWRpX2R0OTgxMiAqKWRldi0+cHJpdmF0ZSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2R0OTgxMiAqdG9fZHQ5ODEyX2RldihzdHJ1Y3Qga3JlZiAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZHQ5ODEyLCBrcmVmKTsKK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2ID0gdG9fZHQ5ODEyX2RldihrcmVmKTsKKworCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIGludCBkdDk4MTJfcmVhZF9pbmZvKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKKwkJCSAgICBzaXplX3QgYnVmX3NpemUpCit7CisJc3RydWN0IGR0OTgxMl91c2JfY21kIGNtZDsKKwlpbnQgY291bnQsIHJldHZhbDsKKworCWNtZC5jbWQgPSBjcHVfdG9fbGUzMihEVDk4MTJfUl9GTEFTSF9EQVRBKTsKKwljbWQudS5mbGFzaF9kYXRhX2luZm8uYWRkcmVzcyA9CisJCWNwdV90b19sZTE2KERUOTgxMl9ESUFHU19CT0FSRF9JTkZPX0FERFIgKyBvZmZzZXQpOworCWNtZC51LmZsYXNoX2RhdGFfaW5mby5udW1ieXRlcyA9IGNwdV90b19sZTE2KGJ1Zl9zaXplKTsKKworCS8qIERUOTgxMiBvbmx5IHJlc3BvbmRzIHRvIDMyIGJ5dGUgd3JpdGVzISEgKi8KKwljb3VudCA9IDMyOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF9yZWFkLmFkZHIpLAorCQkJICAgICAgYnVmLCBidWZfc2l6ZSwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsIGludCByZWdfY291bnQsCisJCQkJCSAgdTggKmFkZHJlc3MsIHU4ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9SX01VTFRJX0JZVEVfUkVHKTsKKwljbWQudS5yZWFkX211bHRpX2luZm8uY291bnQgPSByZWdfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHJlZ19jb3VudDsgaSsrKQorCQljbWQudS5yZWFkX211bHRpX2luZm8uYWRkcmVzc1tpXSA9IGFkZHJlc3NbaV07CisKKwkvKiBEVDk4MTIgb25seSByZXNwb25kcyB0byAzMiBieXRlIHdyaXRlcyEhICovCisJY291bnQgPSAzMjsKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIpLAorCQkJICAgICAgJmNtZCwgMzIsICZjb3VudCwgSFogKiAxKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfcmVhZC5hZGRyKSwKKwkJCSAgICAgIHZhbHVlLCByZWdfY291bnQsICZjb3VudCwgSFogKiAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGR0OTgxMl93cml0ZV9tdWx0aXBsZV9yZWdpc3RlcnMoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkJICAgaW50IHJlZ19jb3VudCwgdTggKmFkZHJlc3MsCisJCQkJCSAgIHU4ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9XX01VTFRJX0JZVEVfUkVHKTsKKwljbWQudS5yZWFkX211bHRpX2luZm8uY291bnQgPSByZWdfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHJlZ19jb3VudDsgaSsrKSB7CisJCWNtZC51LndyaXRlX211bHRpX2luZm8ud3JpdGVbaV0uYWRkcmVzcyA9IGFkZHJlc3NbaV07CisJCWNtZC51LndyaXRlX211bHRpX2luZm8ud3JpdGVbaV0udmFsdWUgPSB2YWx1ZVtpXTsKKwl9CisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwgaW50IHJlZ19jb3VudCwKKwkJCQkJIHN0cnVjdCBkdDk4MTJfcm13X2J5dGUgKnJtdykKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9STVdfTVVMVElfQllURV9SRUcpOworCWNtZC51LnJtd19tdWx0aV9pbmZvLmNvdW50ID0gcmVnX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCByZWdfY291bnQ7IGkrKykKKwkJY21kLnUucm13X211bHRpX2luZm8ucm13W2ldID0gcm13W2ldOworCisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RpZ2l0YWxfaW4oc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCAqYml0cykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCXU4IHJlZ1syXSA9IHsgRjAyMF9TRlJfUDMsIEYwMjBfU0ZSX1AxIH07CisJCXU4IHZhbHVlWzJdOworCisJCXJlc3VsdCA9IGR0OTgxMl9yZWFkX211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDIsIHJlZywKKwkJCQkJCQl2YWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJLyoKKwkJCSAqIGJpdHMgMC02IGluIEYwMjBfU0ZSX1AzIGFyZSBiaXRzIDAtNiBpbiB0aGUgZGlnaXRhbAorCQkJICogaW5wdXQgcG9ydCBiaXQgMyBpbiBGMDIwX1NGUl9QMSBpcyBiaXQgNyBpbiB0aGUKKwkJCSAqIGRpZ2l0YWwgaW5wdXQgcG9ydAorCQkJICovCisJCQkqYml0cyA9ICh2YWx1ZVswXSAmIDB4N2YpIHwgKCh2YWx1ZVsxXSAmIDB4MDgpIDw8IDQpOworCQkJLyogcHJpbnRrKCIlMi4yeCwgJTIuMnggLT4gJTIuMnhcbiIsCisJCQkJICB2YWx1ZVswXSwgdmFsdWVbMV0sICpiaXRzKTsgKi8KKwkJfQorCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGlnaXRhbF9vdXQoc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCBiaXRzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJdTggcmVnWzFdOworCQl1OCB2YWx1ZVsxXTsKKworCQlyZWdbMF0gPSBGMDIwX1NGUl9QMjsKKwkJdmFsdWVbMF0gPSBiaXRzOworCQlyZXN1bHQgPSBkdDk4MTJfd3JpdGVfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMSwgcmVnLAorCQkJCQkJCSB2YWx1ZSk7CisJCXNsb3QtPnVzYi0+ZGlnaXRhbF9vdXRfc2hhZG93ID0gYml0czsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaWdpdGFsX291dF9zaGFkb3coc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCAqYml0cykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCSpiaXRzID0gc2xvdC0+dXNiLT5kaWdpdGFsX291dF9zaGFkb3c7CisJCXJlc3VsdCA9IDA7CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2NvbmZpZ3VyZV9tdXgoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkgc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSAqcm13LCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoZGV2LT5kZXZpY2UgPT0gRFQ5ODEyX0RFVklEX0RUOTgxMl8xMCkgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzEwViBNVVggaXMgc2VsZWN0ZWQgYnkgUDEuNS03ICovCisJCXJtdy0+YWRkcmVzcyA9IEYwMjBfU0ZSX1AxOworCQlybXctPmFuZF9tYXNrID0gMHhlMDsKKwkJcm13LT5vcl92YWx1ZSA9IGNoYW5uZWwgPDwgNTsKKwl9IGVsc2UgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzIuNVYsIGludGVybmFsIG11eCBpcyBzZWxlY3RlZCBieSBiaXRzIDA6MiAqLworCQlybXctPmFkZHJlc3MgPSBGMDIwX1NGUl9BTVgwU0w7CisJCXJtdy0+YW5kX21hc2sgPSAweGZmOworCQlybXctPm9yX3ZhbHVlID0gY2hhbm5lbCAmIDB4MDc7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdDk4MTJfY29uZmlndXJlX2dhaW4oc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkgIHN0cnVjdCBkdDk4MTJfcm13X2J5dGUgKnJtdywKKwkJCQkgIGVudW0gZHQ5ODEyX2dhaW4gZ2FpbikKK3sKKwlpZiAoZGV2LT5kZXZpY2UgPT0gRFQ5ODEyX0RFVklEX0RUOTgxMl8xMCkgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzEwViwgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgZ2FpbiBvZiAwLjUgKi8KKwkJZ2FpbiA8PD0gMTsKKwl9CisKKwlybXctPmFkZHJlc3MgPSBGMDIwX1NGUl9BREMwQ0Y7CisJcm13LT5hbmRfbWFzayA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMiB8CisJCQlGMDIwX01BU0tfQURDMENGX0FNUDBHTjEgfAorCQkJRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wOworCXN3aXRjaCAoZ2FpbikgeworCQkvKgorCQkgKiAwMDAgLT4gR2FpbiA9ICAxCisJCSAqIDAwMSAtPiBHYWluID0gIDIKKwkJICogMDEwIC0+IEdhaW4gPSAgNAorCQkgKiAwMTEgLT4gR2FpbiA9ICA4CisJCSAqIDEweCAtPiBHYWluID0gMTYKKwkJICogMTF4IC0+IEdhaW4gPSAgMC41CisJCSAqLworCWNhc2UgRFQ5ODEyX0dBSU5fMFBUNToKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMiB8fAorCQkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMTsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8xOgorCQlybXctPm9yX3ZhbHVlID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8yOgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzQ6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjE7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fODoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMSB8fAorCQkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8xNjoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJJbGxlZ2FsIGdhaW4gJWRcbiIsIGdhaW4pOworCisJfQorfQorCitzdGF0aWMgaW50IGR0OTgxMl9hbmFsb2dfaW4oc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCBpbnQgY2hhbm5lbCwgdTE2ICp2YWx1ZSwKKwkJCSAgICBlbnVtIGR0OTgxMl9nYWluIGdhaW4pCit7CisJc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSBybXdbM107CisJdTggcmVnWzNdID0geworCQlGMDIwX1NGUl9BREMwQ04sCisJCUYwMjBfU0ZSX0FEQzBILAorCQlGMDIwX1NGUl9BREMwTAorCX07CisJdTggdmFsWzNdOworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmICghc2xvdC0+dXNiKQorCQlnb3RvIGV4aXQ7CisKKwkvKiAxIHNlbGVjdCB0aGUgZ2FpbiAqLworCWR0OTgxMl9jb25maWd1cmVfZ2FpbihzbG90LT51c2IsICZybXdbMF0sIGdhaW4pOworCisJLyogMiBzZXQgdGhlIE1VWCB0byBzZWxlY3QgdGhlIGNoYW5uZWwgKi8KKwlkdDk4MTJfY29uZmlndXJlX211eChzbG90LT51c2IsICZybXdbMV0sIGNoYW5uZWwpOworCisJLyogMyBzdGFydCBjb252ZXJzaW9uICovCisJcm13WzJdLmFkZHJlc3MgPSBGMDIwX1NGUl9BREMwQ047CisJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwlybXdbMl0ub3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENOX0FEMEVOIHwgRjAyMF9NQVNLX0FEQzBDTl9BRDBCVVNZOworCisJcmVzdWx0ID0gZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAzLCBybXcpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXhpdDsKKworCS8qIHJlYWQgdGhlIHN0YXR1cyBhbmQgQURDICovCisJcmVzdWx0ID0gZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMywgcmVnLCB2YWwpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXhpdDsKKwkvKgorCSAqIEFuIEFEQyBjb252ZXJzaW9uIHRha2VzIDE2IFNBUiBjbG9ja3MgY3ljbGVzLCBpLmUuIGFib3V0IDl1cy4KKwkgKiBUaGVyZWZvcmUsIGJldHdlZW4gdGhlIGluc3RhbnQgdGhhdCBBRDBCVVNZIHdhcyBzZXQgdmlhCisJICogZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMgYW5kIHRoZSByZWFkIG9mIEFEMEJVU1kgdmlhCisJICogZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzLCB0aGUgY29udmVyc2lvbiBzaG91bGQgYmUgY29tcGxldGUKKwkgKiBzaW5jZSB0aGVzZSB0d28gb3BlcmF0aW9ucyByZXF1aXJlIHR3byBVU0IgdHJhbnNhY3Rpb25zIGVhY2ggdGFraW5nCisJICogYXQgbGVhc3QgYSBtaWxsaXNlY29uZCB0byBjb21wbGV0ZS4gIEhvd2V2ZXIsIGxldHMgbWFrZSBzdXJlIHRoYXQKKwkgKiBjb252ZXJzaW9uIGlzIGZpbmlzaGVkLgorCSAqLworCWlmICgodmFsWzBdICYgKEYwMjBfTUFTS19BREMwQ05fQUQwSU5UIHwgRjAyMF9NQVNLX0FEQzBDTl9BRDBCVVNZKSkgPT0KKwkgICAgRjAyMF9NQVNLX0FEQzBDTl9BRDBJTlQpIHsKKwkJc3dpdGNoIChzbG90LT51c2ItPmRldmljZSkgeworCQljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMTA6CisJCQkvKgorCQkJICogRm9yIERUOTgxMi0xMFYgdGhlIHBlcnNvbmFsaXR5IG1vZHVsZSBzZXQgdGhlCisJCQkgKiBlbmNvZGluZyB0byAyJ3MgY29tcGxlbWVudC4gSGVuY2UsIGNvbnZlcnQgaXQgYmVmb3JlCisJCQkgKiByZXR1cm5pbmcgaXQKKwkJCSAqLworCQkJKnZhbHVlID0gKCh2YWxbMV0gPDwgOCkgfCB2YWxbMl0pICsgMHg4MDA7CisJCQlicmVhazsKKwkJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzJQVDU6CisJCQkqdmFsdWUgPSAodmFsWzFdIDw8IDgpIHwgdmFsWzJdOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2V4aXQ6CisJdXAoJnNsb3QtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hbmFsb2dfb3V0X3NoYWRvdyhzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIGludCBjaGFubmVsLAorCQkJCSAgICB1MTYgKnZhbHVlKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJKnZhbHVlID0gc2xvdC0+dXNiLT5hbmFsb2dfb3V0X3NoYWRvd1tjaGFubmVsXTsKKwkJcmVzdWx0ID0gMDsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FuYWxvZ19vdXQoc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCBpbnQgY2hhbm5lbCwgdTE2IHZhbHVlKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSBybXdbM107CisKKwkJc3dpdGNoIChjaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCS8qIDEuIFNldCBEQUMgbW9kZSAqLworCQkJcm13WzBdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMwQ047CisJCQlybXdbMF0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzBdLm9yX3ZhbHVlID0gRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU47CisKKwkJCS8qIDIgbG9hZCBsb3cgYnl0ZSBvZiBEQUMgdmFsdWUgZmlyc3QgKi8KKwkJCXJtd1sxXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMEw7CisJCQlybXdbMV0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzFdLm9yX3ZhbHVlID0gdmFsdWUgJiAweGZmOworCisJCQkvKiAzIGxvYWQgaGlnaCBieXRlIG9mIERBQyB2YWx1ZSBuZXh0IHRvIGxhdGNoIHRoZQorCQkJICAgMTItYml0IHZhbHVlICovCisJCQlybXdbMl0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzBIOworCQkJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1syXS5vcl92YWx1ZSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIDEuIFNldCBEQUMgbW9kZSAqLworCQkJcm13WzBdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMxQ047CisJCQlybXdbMF0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzBdLm9yX3ZhbHVlID0gRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU47CisKKwkJCS8qIDIgbG9hZCBsb3cgYnl0ZSBvZiBEQUMgdmFsdWUgZmlyc3QgKi8KKwkJCXJtd1sxXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMUw7CisJCQlybXdbMV0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzFdLm9yX3ZhbHVlID0gdmFsdWUgJiAweGZmOworCisJCQkvKiAzIGxvYWQgaGlnaCBieXRlIG9mIERBQyB2YWx1ZSBuZXh0IHRvIGxhdGNoIHRoZQorCQkJICAgMTItYml0IHZhbHVlICovCisJCQlybXdbMl0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzFIOworCQkJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1syXS5vcl92YWx1ZSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZjsKKwkJCWJyZWFrOworCQl9CisJCXJlc3VsdCA9IGR0OTgxMl9ybXdfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMywgcm13KTsKKwkJc2xvdC0+dXNiLT5hbmFsb2dfb3V0X3NoYWRvd1tjaGFubmVsXSA9IHZhbHVlOworCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFVTQiBmcmFtZXdvcmsgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBkdDk4MTJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJdTggZnc7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKKworCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJZGV2LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisKKwkvKiBDaGVjayBlbmRwb2ludHMgKi8KKwlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKworCWlmIChpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gNSkgeworCQllcnIoIldyb25nIG51bWJlciBvZiBlbmRwaW50cy4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJaW50IGRpcmVjdGlvbiA9IC0xOworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9JTjsKKwkJCWRldi0+bWVzc2FnZV9waXBlLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+bWVzc2FnZV9waXBlLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9PVVQ7CisJCQlkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT5jb21tYW5kX3dyaXRlLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfSU47CisJCQlkZXYtPmNvbW1hbmRfcmVhZC5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPmNvbW1hbmRfcmVhZC5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX09VVDsKKwkJCWRldi0+d3JpdGVfc3RyZWFtLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+d3JpdGVfc3RyZWFtLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfSU47CisJCQlkZXYtPnJlYWRfc3RyZWFtLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+cmVhZF9zdHJlYW0uc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gZGlyZWN0aW9uKSB7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkiRW5kcG9pbnQgaGFzIHdyb25nIGRpcmVjdGlvbi5cbiIpOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCAwLCAmZncsIHNpemVvZihmdykpICE9IDApIHsKKwkJLyoKKwkJICogU2VlbXMgbGlrZSBhIGNvbmZpZ3VyYXRpb24gcmVzZXQgaXMgbmVjZXNzYXJ5IGlmIGRyaXZlciBpcworCQkgKiByZWxvYWRlZCB3aGlsZSBkZXZpY2UgaXMgYXR0YWNoZWQKKwkJICovCisJCXVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldi0+dWRldik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlyZXR2YWwgPSBkdDk4MTJfcmVhZF9pbmZvKGRldiwgMSwgJmZ3LCBzaXplb2YoZncpKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkJICJ1c2JfcmVzZXRfY29uZmlndXJhdGlvbiBzdWNjZWRlZCAiCisJCQkJCSAiYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDEsICZkZXYtPnZlbmRvciwgc2l6ZW9mKGRldi0+dmVuZG9yKSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHZlbmRvci4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCAzLCAmZGV2LT5wcm9kdWN0LAorCQkJICAgICBzaXplb2YoZGV2LT5wcm9kdWN0KSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHByb2R1Y3QuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgNSwgJmRldi0+ZGV2aWNlLCBzaXplb2YoZGV2LT5kZXZpY2UpKSAhPSAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgZGV2aWNlLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDcsICZkZXYtPnNlcmlhbCwgc2l6ZW9mKGRldi0+c2VyaWFsKSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHNlcmlhbC4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+dmVuZG9yKTsKKwlkZXYtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPnByb2R1Y3QpOworCWRldi0+ZGV2aWNlID0gbGUxNl90b19jcHUoZGV2LT5kZXZpY2UpOworCWRldi0+c2VyaWFsID0gbGUzMl90b19jcHUoZGV2LT5zZXJpYWwpOworCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMTA6CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMF0gPSAweDA4MDA7CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMV0gPSAweDgwMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzJQVDU6CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMF0gPSAweDAwMDA7CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMV0gPSAweDAwMDA7CisJCWJyZWFrOworCX0KKwlkZXYtPmRpZ2l0YWxfb3V0X3NoYWRvdyA9IDA7CisKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIERUOTgxMiAoJTQuNHguJTQuNHguJTQuNHgpICMweCU4Ljh4XG4iLAorCQkgZGV2LT52ZW5kb3IsIGRldi0+cHJvZHVjdCwgZGV2LT5kZXZpY2UsIGRldi0+c2VyaWFsKTsKKworCWRvd24oJmR0OTgxMl9tdXRleCk7CisJeworCQkvKiBGaW5kIGEgc2xvdCBmb3IgdGhlIFVTQiBkZXZpY2UgKi8KKwkJc3RydWN0IHNsb3RfZHQ5ODEyICpmaXJzdCA9IE5VTEw7CisJCXN0cnVjdCBzbG90X2R0OTgxMiAqYmVzdCA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IERUOTgxMl9OVU1fU0xPVFM7IGkrKykgeworCQkJaWYgKCFmaXJzdCAmJiAhZHQ5ODEyW2ldLnVzYiAmJiBkdDk4MTJbaV0uc2VyaWFsID09IDApCisJCQkJZmlyc3QgPSAmZHQ5ODEyW2ldOworCQkJaWYgKCFiZXN0ICYmIGR0OTgxMltpXS5zZXJpYWwgPT0gZGV2LT5zZXJpYWwpCisJCQkJYmVzdCA9ICZkdDk4MTJbaV07CisJCX0KKworCQlpZiAoIWJlc3QpCisJCQliZXN0ID0gZmlyc3Q7CisKKwkJaWYgKGJlc3QpIHsKKwkJCWRvd24oJmJlc3QtPm11dGV4KTsKKwkJCWJlc3QtPnVzYiA9IGRldjsKKwkJCWRldi0+c2xvdCA9IGJlc3Q7CisJCQl1cCgmYmVzdC0+bXV0ZXgpOworCQl9CisJfQorCXVwKCZkdDk4MTJfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChkZXYpCisJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIGR0OTgxMl9kZWxldGUpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGR0OTgxMl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9kdDk4MTIgKmRldjsKKwlpbnQgbWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCisJZG93bigmZHQ5ODEyX211dGV4KTsKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaWYgKGRldi0+c2xvdCkgeworCQlkb3duKCZkZXYtPnNsb3QtPm11dGV4KTsKKwkJZGV2LT5zbG90LT51c2IgPSBOVUxMOworCQl1cCgmZGV2LT5zbG90LT5tdXRleCk7CisJCWRldi0+c2xvdCA9IE5VTEw7CisJfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwl1cCgmZHQ5ODEyX211dGV4KTsKKworCS8qIHF1ZXVlIGZpbmFsIGRlc3RydWN0aW9uICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgZHQ5ODEyX2RlbGV0ZSk7CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgRHQ5ODEyICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkdDk4MTJfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJkdDk4MTIiLAorCS5wcm9iZSA9IGR0OTgxMl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR0OTgxMl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IGR0OTgxMl90YWJsZSwKK307CisKKy8qCisgKiBDb21lZGkgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgZHQ5ODEyX2NvbWVkaV9vcGVuKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlkb3duKCZkZXZwcml2LT5zbG90LT5tdXRleCk7CisJaWYgKGRldnByaXYtPnNsb3QtPnVzYikgeworCQkvKiBXZSBoYXZlIGFuIGF0dGFjaGVkIGRldmljZSwgZmlsbCBpbiBjdXJyZW50IHJhbmdlIGluZm8gKi8KKwkJY29tZWRpX3N1YmRldmljZSAqczsKKworCQlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwkJcy0+bl9jaGFuID0gODsKKwkJcy0+bWF4ZGF0YSA9IDE7CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJCXMtPm5fY2hhbiA9IDg7CisJCXMtPm1heGRhdGEgPSAxOworCisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCQlzLT5uX2NoYW4gPSA4OworCQlzd2l0Y2ggKGRldnByaXYtPnNsb3QtPnVzYi0+ZGV2aWNlKSB7CisJCWNhc2UgMDp7CisJCQkJcy0+bWF4ZGF0YSA9IDQwOTU7CisJCQkJcy0+cmFuZ2VfdGFibGUgPSAmZHQ5ODEyXzEwX2Fpbl9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8ycHQ1X2Fpbl9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CisJCXMtPm5fY2hhbiA9IDI7CisJCXN3aXRjaCAoZGV2cHJpdi0+c2xvdC0+dXNiLT5kZXZpY2UpIHsKKwkJY2FzZSAwOnsKKwkJCQlzLT5tYXhkYXRhID0gNDA5NTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9ICZkdDk4MTJfMTBfYW91dF9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8ycHQ1X2FvdXRfcmFuZ2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmZGV2cHJpdi0+c2xvdC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaV9yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTggYml0cyA9IDA7CisKKwlkdDk4MTJfZGlnaXRhbF9pbihkZXZwcml2LT5zbG90LCAmYml0cyk7CisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZGF0YVtuXSA9ICgoMSA8PCBpbnNuLT5jaGFuc3BlYykgJiBiaXRzKSAhPSAwOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kb193aW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTggYml0cyA9IDA7CisKKwlkdDk4MTJfZGlnaXRhbF9vdXRfc2hhZG93KGRldnByaXYtPnNsb3QsICZiaXRzKTsKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCXU4IG1hc2sgPSAxIDw8IGluc24tPmNoYW5zcGVjOworCisJCWJpdHMgJj0gfm1hc2s7CisJCWlmIChkYXRhW25dKQorCQkJYml0cyB8PSBtYXNrOworCX0KKwlkdDk4MTJfZGlnaXRhbF9vdXQoZGV2cHJpdi0+c2xvdCwgYml0cyk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJdTE2IHZhbHVlID0gMDsKKworCQlkdDk4MTJfYW5hbG9nX2luKGRldnByaXYtPnNsb3QsIGluc24tPmNoYW5zcGVjLCAmdmFsdWUsCisJCQkJIERUOTgxMl9HQUlOXzEpOworCQlkYXRhW25dID0gdmFsdWU7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hb19yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTE2IHZhbHVlOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQl2YWx1ZSA9IDA7CisJCWR0OTgxMl9hbmFsb2dfb3V0X3NoYWRvdyhkZXZwcml2LT5zbG90LCBpbnNuLT5jaGFuc3BlYywgJnZhbHVlKTsKKwkJZGF0YVtuXSA9IHZhbHVlOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfYW9fd2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZHQ5ODEyX2FuYWxvZ19vdXQoZGV2cHJpdi0+c2xvdCwgaW5zbi0+Y2hhbnNwZWMsIGRhdGFbbl0pOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJZGV2LT5ib2FyZF9uYW1lID0gImR0OTgxMiI7CisKKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgY29tZWRpX2R0OTgxMikpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFNwZWNpYWwgb3BlbiByb3V0aW5lLCBzaW5jZSBVU0IgdW5pdCBtYXkgYmUgdW5hdHRhY2hlZCBhdAorCSAqIGNvbWVkaV9jb25maWcgdGltZSwgaGVuY2UgcmFuZ2UgY2FuIG5vdCBiZSBkZXRlcm1pbmVkCisJICovCisJZGV2LT5vcGVuID0gZHQ5ODEyX2NvbWVkaV9vcGVuOworCisJZGV2cHJpdi0+c2VyaWFsID0gaXQtPm9wdGlvbnNbMF07CisKKwkvKiBBbGxvY2F0ZSBzdWJkZXZpY2VzICovCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCA0KSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX3JlYWQgPSAmZHQ5ODEyX2RpX3JpbnNuOworCisJLyogZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEU7CisJcy0+bl9jaGFuID0gMDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fd3JpdGUgPSAmZHQ5ODEyX2RvX3dpbnNuOworCisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSBOVUxMOworCXMtPmluc25fcmVhZCA9ICZkdDk4MTJfYWlfcmluc247CisKKwkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSBOVUxMOworCXMtPmluc25fd3JpdGUgPSAmZHQ5ODEyX2FvX3dpbnNuOworCXMtPmluc25fcmVhZCA9ICZkdDk4MTJfYW9fcmluc247CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIHRvIGR0OTgxMi5cbiIsCisJICAgICAgIGRldi0+bWlub3IpOworCisJZG93bigmZHQ5ODEyX211dGV4KTsKKwkvKiBGaW5kIGEgc2xvdCBmb3IgdGhlIGNvbWVkaSBkZXZpY2UgKi8KKwl7CisJCXN0cnVjdCBzbG90X2R0OTgxMiAqZmlyc3QgPSBOVUxMOworCQlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKmJlc3QgPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgRFQ5ODEyX05VTV9TTE9UUzsgaSsrKSB7CisJCQlpZiAoIWZpcnN0ICYmICFkdDk4MTJbaV0uY29tZWRpKSB7CisJCQkJLyogRmlyc3QgZnJlZSBzbG90IGZyb20gY29tZWRpIHNpZGUgKi8KKwkJCQlmaXJzdCA9ICZkdDk4MTJbaV07CisJCQl9CisJCQlpZiAoIWJlc3QgJiYKKwkJCSAgICBkdDk4MTJbaV0udXNiICYmCisJCQkgICAgZHQ5ODEyW2ldLnVzYi0+c2VyaWFsID09IGRldnByaXYtPnNlcmlhbCkgeworCQkJCS8qIFdlIGhhdmUgYW4gYXR0YWNlZCBkZXZpY2Ugd2l0aCBtYXRjaGluZyBJRCAqLworCQkJCWJlc3QgPSAmZHQ5ODEyW2ldOworCQkJfQorCQl9CisJCWlmICghYmVzdCkKKwkJCWJlc3QgPSBmaXJzdDsKKwkJaWYgKGJlc3QpIHsKKwkJCWRvd24oJmJlc3QtPm11dGV4KTsKKwkJCWJlc3QtPmNvbWVkaSA9IGRldnByaXY7CisJCQliZXN0LT5zZXJpYWwgPSBkZXZwcml2LT5zZXJpYWw7CisJCQlkZXZwcml2LT5zbG90ID0gYmVzdDsKKwkJCXVwKCZiZXN0LT5tdXRleCk7CisJCX0KKwl9CisJdXAoJmR0OTgxMl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHQ5ODEyX2NvbWVkaV9kcml2ZXIgPSB7CisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSA9ICJkdDk4MTIiLAorCS5hdHRhY2ggPSBkdDk4MTJfYXR0YWNoLAorCS5kZXRhY2ggPSBkdDk4MTJfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX2R0OTgxMl9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCwgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIGRyaXZlciBzbG90cyAqLworCWZvciAoaSA9IDA7IGkgPCBEVDk4MTJfTlVNX1NMT1RTOyBpKyspIHsKKwkJaW5pdF9NVVRFWCgmZHQ5ODEyW2ldLm11dGV4KTsKKwkJZHQ5ODEyW2ldLnNlcmlhbCA9IDA7CisJCWR0OTgxMltpXS51c2IgPSBOVUxMOworCQlkdDk4MTJbaV0uY29tZWRpID0gTlVMTDsKKwl9CisJZHQ5ODEyWzEyXS5zZXJpYWwgPSAweDA7CisKKwkvKiByZWdpc3RlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkdDk4MTJfdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogcmVnaXN0ZXIgd2l0aCBjb21lZGkgKi8KKwlyZXN1bHQgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkdDk4MTJfY29tZWRpX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQl1c2JfZGVyZWdpc3RlcigmZHQ5ODEyX3VzYl9kcml2ZXIpOworCQllcnIoImNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfZHQ5ODEyX2V4aXQodm9pZCkKK3sKKwkvKiB1bnJlZ2lzdGVyIHdpdGggY29tZWRpICovCisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkdDk4MTJfY29tZWRpX2RyaXZlcik7CisKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZHQ5ODEyX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1c2JfZHQ5ODEyX2luaXQpOworbW9kdWxlX2V4aXQodXNiX2R0OTgxMl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBEVDk4MTIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNDRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpAQCAtMCwwICsxLDEwODUgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorRHJpdmVyOiBpY3BfbXVsdGkKK0Rlc2NyaXB0aW9uOiBJbm92YSBJQ1BfTVVMVEkKK0F1dGhvcjogQW5uZSBTbW9ydGhpdCA8YW5uZS5zbW9ydGhpdEBzZnd0ZS5jaD4KK0RldmljZXM6IFtJbm92YV0gSUNQX01VTFRJIChpY3BfbXVsdGkpCitTdGF0dXM6IHdvcmtzCisKK1RoZSBkcml2ZXIgd29ya3MgZm9yIGFuYWxvZyBpbnB1dCBhbmQgb3V0cHV0IGFuZCBkaWdpdGFsIGlucHV0IGFuZCBvdXRwdXQuCitJdCBkb2VzIG5vdCB3b3JrIHdpdGggaW50ZXJydXB0cyBvciB3aXRoIHRoZSBjb3VudGVycy4gIEN1cnJlbnRseSBubyBzdXBwb3J0Citmb3IgRE1BLgorCitJdCBoYXMgMTYgc2luZ2xlLWVuZGVkIG9yIDggZGlmZmVyZW50aWFsIEFuYWxvZ3VlIElucHV0IGNoYW5uZWxzIHdpdGggMTItYml0CityZXNvbHV0aW9uLiAgUmFuZ2VzIDogNVYsIDEwViwgKy8tNVYsICsvLTEwViwgMC4uMjBtQSBhbmQgNC4uMjBtQS4gIElucHV0CityYW5nZXMgY2FuIGJlIGluZGl2aWR1YWxseSBwcm9ncmFtbWVkIGZvciBlYWNoIGNoYW5uZWwuICBWb2x0YWdlIG9yIGN1cnJlbnQKK21lYXN1cmVtZW50IGlzIHNlbGVjdGVkIGJ5IGp1bXBlci4KKworVGhlcmUgYXJlIDQgeCAxMi1iaXQgQW5hbG9ndWUgT3V0cHV0cy4gIFJhbmdlcyA6IDVWLCAxMFYsICsvLTVWLCArLy0xMFYKKworMTYgeCBEaWdpdGFsIElucHV0cywgMjRWCisKKzggeCBEaWdpdGFsIE91dHB1dHMsIDI0ViwgMUEKKworNCB4IDE2LWJpdCBjb3VudGVycworCitPcHRpb25zOgorIFswXSAtIFBDSSBidXMgbnVtYmVyIC0gaWYgYnVzIG51bWJlciBhbmQgc2xvdCBudW1iZXIgYXJlIDAsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRyaXZlciBzZWFyY2ggZm9yIGZpcnN0IHVudXNlZCBjYXJkCisgWzFdIC0gUENJIHNsb3QgbnVtYmVyCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAiaWNwX211bHRpLmgiCisKKyNkZWZpbmUgREVWSUNFX0lECTB4ODAwMAkvKiBEZXZpY2UgSUQgKi8KKworI2RlZmluZSBJQ1BfTVVMVElfRVhUREVCVUcKKworLy8gSGFyZHdhcmUgdHlwZXMgb2YgdGhlIGNhcmRzCisjZGVmaW5lIFRZUEVfSUNQX01VTFRJCTAKKworI2RlZmluZSBJT1JBTkdFX0lDUF9NVUxUSSAJMzIKKworI2RlZmluZSBJQ1BfTVVMVElfQURDX0NTUgkwCS8qIFIvVzogQURDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElDUF9NVUxUSV9BSQkJMgkvKiBSOiAgIEFuYWxvZ3VlIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0RBQ19DU1IJNAkvKiBSL1c6IERBQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfQU8JCTYJLyogUi9XOiBBbmFsb2d1ZSBvdXRwdXQgZGF0YSAqLworI2RlZmluZSBJQ1BfTVVMVElfREkJCTgJLyogUi9XOiBEaWdpdGFsIGlub3V0cyAqLworI2RlZmluZSBJQ1BfTVVMVElfRE8JCTB4MEEJLyogUi9XOiBEaWdpdGFsIG91dHB1dHMgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0lOVF9FTgkweDBDCS8qIFIvVzogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfSU5UX1NUQVQJMHgwRQkvKiBSL1c6IEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIwCQkweDEwCS8qIFIvVzogQ291bnRlciAwICovCisjZGVmaW5lIElDUF9NVUxUSV9DTlRSMQkJMHgxMgkvKiBSL1c6IGNvdW50ZXIgMSAqLworI2RlZmluZSBJQ1BfTVVMVElfQ05UUjIJCTB4MTQJLyogUi9XOiBDb3VudGVyIDIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIzCQkweDE2CS8qIFIvVzogQ291bnRlciAzICovCisKKyNkZWZpbmUgSUNQX01VTFRJX1NJWkUJCTB4MjAJLyogMzIgYnl0ZXMgKi8KKworLy8gRGVmaW5lIGJpdHMgZnJvbSBBREMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUJQURDX1NUCQkweDAwMDEJLyogU3RhcnQgQURDICovCisjZGVmaW5lCUFEQ19CU1kJCTB4MDAwMQkvKiBBREMgYnVzeSAqLworI2RlZmluZSBBRENfQkkJCTB4MDAxMAkvKiBCaXBvbGFyIGlucHV0IHJhbmdlIDEgPSBiaXBvbGFyICovCisjZGVmaW5lIEFEQ19SQQkJMHgwMDIwCS8qIElucHV0IHJhbmdlIDAgPSA1ViwgMSA9IDEwViAqLworI2RlZmluZQlBRENfREkJCTB4MDA0MAkvKiBEaWZmZXJlbnRpYWwgaW5wdXQgbW9kZSAxID0gZGlmZmVyZW50aWFsICovCisKKy8vIERlZmluZSBiaXRzIGZyb20gREFDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lCURBQ19TVAkJMHgwMDAxCS8qIFN0YXJ0IERBQyAqLworI2RlZmluZSBEQUNfQlNZCQkweDAwMDEJLyogREFDIGJ1c3kgKi8KKyNkZWZpbmUJREFDX0JJCQkweDAwMTAJLyogQmlwb2xhciBpbnB1dCByYW5nZSAxID0gYmlwb2xhciAqLworI2RlZmluZQlEQUNfUkEJCTB4MDAyMAkvKiBJbnB1dCByYW5nZSAwID0gNVYsIDEgPSAxMFYgKi8KKworLy8gRGVmaW5lIGJpdHMgZnJvbSBpbnRlcnJ1cHQgZW5hYmxlL3N0YXR1cyByZWdpc3RlcnMKKyNkZWZpbmUJQURDX1JFQURZCTB4MDAwMQkvKiBBL2QgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJREFDX1JFQURZCTB4MDAwMgkvKiBEL2EgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRE9VVF9FUlJPUgkweDAwMDQJLyogRGlnaXRhbCBvdXRwdXQgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lCURJTl9TVEFUVVMJMHgwMDA4CS8qIERpZ2l0YWwgaW5wdXQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMAkJMHgwMDEwCS8qIENvdW50ZXIgMCBvdmVycnVuIGludGVycnVwdCAqLworI2RlZmluZQlDSUUxCQkweDAwMjAJLyogQ291bnRlciAxIG92ZXJydW4gaW50ZXJydXB0ICovCisjZGVmaW5lCUNJRTIJCTB4MDA0MAkvKiBDb3VudGVyIDIgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMwkJMHgwMDgwCS8qIENvdW50ZXIgMyBvdmVycnVuIGludGVycnVwdCAqLworCisvLyBVc2VmdWwgZGVmaW5pdGlvbnMKKyNkZWZpbmUJU3RhdHVzX0lSUQkweDAwZmYJLy8gQWxsIGludGVycnVwdHMKKworLy8gRGVmaW5lIGFuYWxvZ3VlIHJhbmdlCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9hbmFsb2cgPSB7IDQsIHsKKwkJCVVOSV9SQU5HRSg1KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCQlCSVBfUkFOR0UoMTApCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfYW5hbG9nW10gPSB7IDB4MDAsIDB4MjAsIDB4MTAsIDB4MzAgfTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUZvcndhcmQgZGVjbGFyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgaWNwX211bHRpX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURhdGEgJiBTdHJ1Y3R1cmUgZGVjbGFyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2xpc3RfYnVpbGRlZCA9IDA7CS8qPjAgbGlzdCBvZiBjYXJkIGlzIGtub3duICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOwkvLyBkcml2ZXIgbmFtZQorCWludCBkZXZpY2VfaWQ7CisJaW50IGlvcmFuZ2U7CQkvLyBJL08gcmFuZ2UgbGVuCisJY2hhciBoYXZlX2lycTsJCS8vIDE9Y2FyZCBzdXBwb3J0IElSUQorCWNoYXIgY2FyZHR5cGU7CQkvLyAwPUlDUCBNdWx0aQorCWludCBuX2FpY2hhbjsJCS8vIG51bSBvZiBBL0QgY2hhbnMKKwlpbnQgbl9haWNoYW5kOwkJLy8gbnVtIG9mIEEvRCBjaGFucyBpbiBkaWZmIG1vZGUKKwlpbnQgbl9hb2NoYW47CQkvLyBudW0gb2YgRC9BIGNoYW5zCisJaW50IG5fZGljaGFuOwkJLy8gbnVtIG9mIERJIGNoYW5zCisJaW50IG5fZG9jaGFuOwkJLy8gbnVtIG9mIERPIGNoYW5zCisJaW50IG5fY3RyczsJCS8vIG51bSBvZiBjb3VudGVycworCWludCBhaV9tYXhkYXRhOwkJLy8gcmVzb2x1dGlvbiBvZiBBL0QKKwlpbnQgYW9fbWF4ZGF0YTsJCS8vIHJlc29sdXRpb24gb2YgRC9BCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOwkvLyByYW5nZWxpc3QgZm9yIEEvRAorCWNvbnN0IGNoYXIgKnJhbmdlY29kZTsJLy8gcmFuZ2UgY29kZXMgZm9yIHByb2dyYW1taW5nCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FvOwkvLyByYW5nZWxpc3QgZm9yIEQvQQorfSBib2FyZHR5cGU7CisKK3N0YXRpYyBjb25zdCBib2FyZHR5cGUgYm9hcmR0eXBlc1tdID0geworCXsiaWNwX211bHRpIiwJCS8vIERyaXZlciBuYW1lCisJCQlERVZJQ0VfSUQsCS8vIFBDSSBkZXZpY2UgSUQKKwkJCUlPUkFOR0VfSUNQX01VTFRJLAkvLyBJL08gcmFuZ2UgbGVuZ3RoCisJCQkxLAkvLyAxPUNhcmQgc3VwcG9ydHMgaW50ZXJydXB0cworCQkJVFlQRV9JQ1BfTVVMVEksCS8vIENhcmQgdHlwZSA9IElDUCBNVUxUSQorCQkJMTYsCS8vIE51bSBvZiBBL0QgY2hhbm5lbHMKKwkJCTgsCS8vIE51bSBvZiBBL0QgY2hhbm5lbHMgaW4gZGlmZiBtb2RlCisJCQk0LAkvLyBOdW0gb2YgRC9BIGNoYW5uZWxzCisJCQkxNiwJLy8gTnVtIG9mIGRpZ2l0YWwgaW5wdXRzCisJCQk4LAkvLyBOdW0gb2YgZGlnaXRhbCBvdXRwdXRzCisJCQk0LAkvLyBOdW0gb2YgY291bnRlcnMKKwkJCTB4MGZmZiwJLy8gUmVzb2x1dGlvbiBvZiBBL0QKKwkJCTB4MGZmZiwJLy8gUmVzb2x1dGlvbiBvZiBEL0EKKwkJCSZyYW5nZV9hbmFsb2csCS8vIFJhbmdlbGlzdCBmb3IgQS9ECisJCQlyYW5nZV9jb2Rlc19hbmFsb2csCS8vIFJhbmdlIGNvZGVzIGZvciBwcm9ncmFtbWluZworCQkmcmFuZ2VfYW5hbG9nfSwJLy8gUmFuZ2VsaXN0IGZvciBEL0EKK307CisKKyNkZWZpbmUgbl9ib2FyZHR5cGVzIChzaXplb2YoYm9hcmR0eXBlcykvc2l6ZW9mKGJvYXJkdHlwZSkpCisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9pY3BfbXVsdGkgPSB7CisgICAgICBkcml2ZXJfbmFtZToiaWNwX211bHRpIiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDppY3BfbXVsdGlfYXR0YWNoLAorICAgICAgZGV0YWNoOmljcF9tdWx0aV9kZXRhY2gsCisgICAgICBudW1fbmFtZXM6bl9ib2FyZHR5cGVzLAorICAgICAgYm9hcmRfbmFtZTomYm9hcmR0eXBlc1swXS5uYW1lLAorICAgICAgb2Zmc2V0OnNpemVvZihib2FyZHR5cGUpLAorfTsKKworQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9pY3BfbXVsdGkpOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQ7CS8vIHBvaW50ZXIgdG8gY2FyZAorCWNoYXIgdmFsaWQ7CQkvLyBjYXJkIGlzIHVzYWJsZQorCXZvaWQgKmlvX2FkZHI7CQkvLyBQb2ludGVyIHRvIG1hcHBlZCBpbyBhZGRyZXNzCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfaW9iYXNlOwkvLyBQaHlzaWNhbCBpbyBhZGRyZXNzCisJdW5zaWduZWQgaW50IEFkY0NtZFN0YXR1czsJLy8gQURDIENvbW1hbmQvU3RhdHVzIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IERhY0NtZFN0YXR1czsJLy8gREFDIENvbW1hbmQvU3RhdHVzIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IEludEVuYWJsZTsJLy8gSW50ZXJydXB0IEVuYWJsZSByZWdpc3RlcgorCXVuc2lnbmVkIGludCBJbnRTdGF0dXM7CS8vIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIKKwl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0WzMyXTsJLy8gbGlzdCBvZiBzY2FuZWQgY2hhbm5lbAorCXVuc2lnbmVkIGNoYXIgYWN0X2NoYW5saXN0X2xlbjsJLy8gbGVuIG9mIHNjYW5saXN0CisJdW5zaWduZWQgY2hhciBhY3RfY2hhbmxpc3RfcG9zOwkvLyBhY3R1YWwgcG9zaXRpb24gaW4gTVVYIGxpc3QKKwl1bnNpZ25lZCBpbnQgKmFpX2NoYW5saXN0OwkvLyBhY3RhdWwgY2hhbmxpc3QKKwlzYW1wbF90ICphaV9kYXRhOwkvLyBkYXRhIGJ1ZmZlcgorCXNhbXBsX3QgYW9fZGF0YVs0XTsJLy8gZGF0YSBvdXRwdXQgYnVmZmVyCisJc2FtcGxfdCBkaV9kYXRhOwkvLyBEaWdpdGFsIGlucHV0IGRhdGEKKwl1bnNpZ25lZCBpbnQgZG9fZGF0YTsJLy8gUmVtZW1iZXIgZGlnaXRhbCBvdXRwdXQgZGF0YQorfSBpY3BfbXVsdGlfcHJpdmF0ZTsKKworI2RlZmluZSBkZXZwcml2ICgoaWNwX211bHRpX3ByaXZhdGUgKilkZXYtPnByaXZhdGUpCisjZGVmaW5lIHRoaXNfYm9hcmQgKChjb25zdCBib2FyZHR5cGUgKilkZXYtPmJvYXJkX3B0cikKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCU1vcmUgZm9yd2FyZCBkZWNsYXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIDAKK3N0YXRpYyBpbnQgY2hlY2tfY2hhbm5lbF9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbik7CitzdGF0aWMgaW50IGljcF9tdWx0aV9yZXNldChjb21lZGlfZGV2aWNlICogZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FpCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBpbnB1dC4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgaW5wdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9haShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgdGltZW91dDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pXG4iKTsKKyNlbmRpZgorCS8vIERpc2FibGUgQS9EIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0CisJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkvLyBTZXQgdXAgYXBwcm9wcmlhdGUgY2hhbm5lbCwgbW9kZSBhbmQgcmFuZ2UgZGF0YSwgZm9yIHNwZWNpZmllZCBjaGFubmVsCisJc2V0dXBfY2hhbm5lbF9saXN0KGRldiwgcywgJmluc24tPmNoYW5zcGVjLCAxKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwX211bHRpIEEgU1Q9JTR4IElPPSVwXG4iLAorCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpLAorCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworI2VuZGlmCisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCS8vIFNldCBzdGFydCBBREMgYml0CisJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSBBRENfU1Q7CisJCXdyaXRldyhkZXZwcml2LT5BZGNDbWRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgJj0gfkFEQ19TVDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBCIG49JWQgU1Q9JTR4XG4iLCBuLAorCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSk7CisjZW5kaWYKKworCQljb21lZGlfdWRlbGF5KDEpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEMgbj0lZCBTVD0lNHhcbiIsIG4sCisJCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpKTsKKyNlbmRpZgorCisJCS8vIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUsIG9yIGdldCBmZWQgdXAgd2FpdGluZworCQl0aW1lb3V0ID0gMTAwOworCQl3aGlsZSAodGltZW91dC0tKSB7CisJCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9BRENfQ1NSKSAmIEFEQ19CU1kpKQorCQkJCWdvdG8gY29udl9maW5pc2g7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJCWlmICghKHRpbWVvdXQgJSAxMCkpCisJCQkJcHJpbnRrKCJpY3AgbXVsdGkgRCBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKKwkJCQkJdGltZW91dCwKKwkJCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCisJCQkJCQlJQ1BfTVVMVElfQURDX0NTUikpOworI2VuZGlmCisKKwkJCWNvbWVkaV91ZGVsYXkoMSk7CisJCX0KKworCQkvLyBJZiB3ZSByZWFjaCBoZXJlLCBhIHRpbWVvdXQgaGFzIG9jY3VycmVkCisJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0Iik7CisKKwkJLy8gRGlzYWJsZSBpbnRlcnJ1cHQKKwkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCQkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCQkvLyBDbGVhciBkYXRhIHJlY2VpdmVkCisJCWRhdGFbbl0gPSAwOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJCXJldHVybiAtRVRJTUU7CisKKwkgICAgICBjb252X2ZpbmlzaDoKKwkJZGF0YVtuXSA9CisJCQkocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BSSkgPj4gNCkgJiAweDBmZmY7CisJfQorCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHQKKwlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJZGV2cHJpdi0+SW50U3RhdHVzIHw9IEFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJcmV0dXJuIG47Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2FvCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fd3JpdGVfYW8oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IG4sIGNoYW4sIHJhbmdlLCB0aW1lb3V0OworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pXG4iKTsKKyNlbmRpZgorCS8vIERpc2FibGUgRC9BIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0CisJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkvLyBHZXQgY2hhbm5lbCBudW1iZXIgYW5kIHJhbmdlCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCisJLy8gU2V0IHVwIHJhbmdlIGFuZCBjaGFubmVsIGRhdGEKKwkvLyBCaXQgNCA9IDEgOiBCaXBvbGFyCisJLy8gQml0IDUgPSAwIDogNVYKKwkvLyBCaXQgNSA9IDEgOiAxMFYKKwkvLyBCaXRzIDgtOSA6IENoYW5uZWwgbnVtYmVyCisJZGV2cHJpdi0+RGFjQ21kU3RhdHVzICY9IDB4ZmNjZjsKKwlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gdGhpc19ib2FyZC0+cmFuZ2Vjb2RlW3JhbmdlXTsKKwlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gKGNoYW4gPDwgOCk7CisKKwl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQkvLyBXYWl0IGZvciBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciB0byBiZSByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZworCQl0aW1lb3V0ID0gMTAwOworCQl3aGlsZSAodGltZW91dC0tKSB7CisJCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9EQUNfQ1NSKSAmIERBQ19CU1kpKQorCQkJCWdvdG8gZGFjX3JlYWR5OworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCQlpZiAoISh0aW1lb3V0ICUgMTApKQorCQkJCXByaW50aygiaWNwIG11bHRpIEEgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCisJCQkJCXRpbWVvdXQsCisJCQkJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKworCQkJCQkJSUNQX01VTFRJX0RBQ19DU1IpKTsKKyNlbmRpZgorCisJCQljb21lZGlfdWRlbGF5KDEpOworCQl9CisKKwkJLy8gSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZAorCQljb21lZGlfZXJyb3IoZGV2LCAiRC9BIGluc24gdGltZW91dCIpOworCisJCS8vIERpc2FibGUgaW50ZXJydXB0CisJCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gREFDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkJLy8gQ2xlYXIgZGF0YSByZWNlaXZlZAorCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gMDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwkJcmV0dXJuIC1FVElNRTsKKworCSAgICAgIGRhY19yZWFkeToKKwkJLy8gV3JpdGUgZGF0YSB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlcgorCQl3cml0ZXcoZGF0YVtuXSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BTyk7CisKKwkJLy8gU2V0IERBQ19TVCBiaXQgdG8gd3JpdGUgdGhlIGRhdGEgdG8gc2VsZWN0ZWQgY2hhbm5lbAorCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gREFDX1NUOworCQl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9EQUNfQ1NSKTsKKwkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzICY9IH5EQUNfU1Q7CisKKwkJLy8gU2F2ZSBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gZGF0YVtuXTsKKwl9CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwlyZXR1cm4gbjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9hbworCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9hbyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgY2hhbjsKKworCS8vIEdldCBjaGFubmVsIG51bWJlcgorCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8vIFJlYWQgYW5hbG9ndWUgb3V0cHV0cworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWRhdGFbbl0gPSBkZXZwcml2LT5hb19kYXRhW2NoYW5dOworCisJcmV0dXJuIG47Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZGkKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBkaWdpdGFsIGlucHV0cy4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX2JpdHNfZGkoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJZGF0YVsxXSA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREkpOworCisJcmV0dXJuIDI7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZG8KKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGlnaXRhbCBvdXRwdXRzLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fYml0c19kbyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CisjZW5kaWYKKworCWlmIChkYXRhWzBdKSB7CisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOworCisJCXByaW50aygiRGlnaXRhbCBvdXRwdXRzID0gJTR4IFxuIiwgcy0+c3RhdGUpOworCisJCXdyaXRldyhzLT5zdGF0ZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CisJfQorCisJZGF0YVsxXSA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREkpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOworI2VuZGlmCisJcmV0dXJuIDI7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfY3RyCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9jdHIoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cgorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBjb3VudGVyLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYWxsCisJCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBpY3AgbXVsdGkgYm9hcmQuCisKKwlQYXJhbWV0ZXJzOgorCQlpbnQgaXJxCisJCXZvaWQgKmQJCQlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkOworCWludCBpbnRfbm87CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSglZCwuLi4pXG4iLAorCQlpcnEpOworI2VuZGlmCisKKwkvLyBJcyB0aGlzIGludGVycnVwdCBmcm9tIG91ciBib2FyZD8KKwlpbnRfbm8gPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKSAmIFN0YXR1c19JUlE7CisJaWYgKCFpbnRfbm8pCisJCS8vIE5vLCBleGl0CisJCXJldHVybiBJUlFfTk9ORTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSgpIFNUOiAlNHhcbiIsCisJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpKTsKKyNlbmRpZgorCisJLy8gRGV0ZXJtaW5lIHdoaWNoIGludGVycnVwdCBpcyBhY3RpdmUgJiBoYW5kbGUgaXQKKwlzd2l0Y2ggKGludF9ubykgeworCWNhc2UgQURDX1JFQURZOgorCQlicmVhazsKKwljYXNlIERBQ19SRUFEWToKKwkJYnJlYWs7CisJY2FzZSBET1VUX0VSUk9SOgorCQlicmVhazsKKwljYXNlIERJTl9TVEFUVVM6CisJCWJyZWFrOworCWNhc2UgQ0lFMDoKKwkJYnJlYWs7CisJY2FzZSBDSUUxOgorCQlicmVhazsKKwljYXNlIENJRTI6CisJCWJyZWFrOworCWNhc2UgQ0lFMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSguLi4pXG4iKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmIDAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWNoZWNrX2NoYW5uZWxfbGlzdAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjaGFubmVsIGxpc3QsIHByb3ZpZGVkIGJ5IHVzZXIKKwkJaXMgYnVpbHQgY29ycmVjdGx5CisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAorCQl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCisKKwlSZXR1cm5zOmludCAwID0gZmFpbHVyZQorCQkgICAgMSA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6ICBjaGVja19jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKKyNlbmRpZgorCS8vIENoZWNrIHRoYXQgd2UgYXQgbGVhc3QgaGF2ZSBvbmUgY2hhbm5lbCB0byBjaGVjaworCWlmIChuX2NoYW4gPCAxKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJyYW5nZS9jaGFubmVsIGxpc3QgaXMgZW1wdHkhIik7CisJCXJldHVybiAwOworCX0KKwkvLyBDaGVjayBhbGwgY2hhbm5lbHMKKwlmb3IgKGkgPSAwOyBpIDwgbl9jaGFuOyBpKyspIHsKKwkJLy8gQ2hlY2sgdGhhdCBjaGFubmVsIG51bWJlciBpcyA8IG1heGltdW0KKwkJaWYgKENSX0FSRUYoY2hhbmxpc3RbaV0pID09IEFSRUZfRElGRikgeworCQkJaWYgKENSX0NIQU4oY2hhbmxpc3RbaV0pID4gdGhpc19ib2FyZC0+bl9haWNoYW5kKSB7CisJCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkJIkluY29ycmVjdCBkaWZmZXJlbnRpYWwgYWkgY2hhbm5lbCBudW1iZXIiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChDUl9DSEFOKGNoYW5saXN0W2ldKSA+IHRoaXNfYm9hcmQtPm5fYWljaGFuKSB7CisJCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkJIkluY29ycmVjdCBhaSBjaGFubmVsIG51bWJlciIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CXNldHVwX2NoYW5uZWxfbGlzdAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBzZWxlY3Rpb24sCisJCWRpZmZlcmVudGlhbCBpbnB1dCBtb2RlIGFuZCByYW5nZSBiaXRzIGluIHRoZSBBREMgQ29tbWFuZC8KKwkJU3RhdHVzIHJlZ2lzdGVyLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKKwkJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorCisJUmV0dXJuczpWb2lkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKQoreworCXVuc2lnbmVkIGludCBpLCByYW5nZSwgY2hhbnByb2c7CisJdW5zaWduZWQgaW50IGRpZmY7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiAgc2V0dXBfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CisjZW5kaWYKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuID0gbl9jaGFuOworCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5fY2hhbjsgaSsrKSB7CisJCS8vIEdldCBjaGFubmVsCisJCWNoYW5wcm9nID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisKKwkJLy8gRGV0ZXJtaW5lIGlmIGl0IGlzIGEgZGlmZmVyZW50aWFsIGNoYW5uZWwgKEJpdCAxNSAgPSAxKQorCQlpZiAoQ1JfQVJFRihjaGFubGlzdFtpXSkgPT0gQVJFRl9ESUZGKSB7CisJCQlkaWZmID0gMTsKKwkJCWNoYW5wcm9nICY9IDB4MDAwNzsKKwkJfSBlbHNlIHsKKwkJCWRpZmYgPSAwOworCQkJY2hhbnByb2cgJj0gMHgwMDBmOworCQl9CisKKwkJLy8gQ2xlYXIgY2hhbm5lbCwgcmFuZ2UgYW5kIGlucHV0IG1vZGUgYml0cyBpbiBBL0QgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzICY9IDB4ZjAwZjsKKworCQkvLyBTZXQgY2hhbm5lbCBudW1iZXIgYW5kIGRpZmZlcmVudGlhbCBtb2RlIHN0YXR1cyBiaXQKKwkJaWYgKGRpZmYpIHsKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlciwgYml0cyA5LTExICYgbW9kZSwgYml0IDYKKwkJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSAoY2hhbnByb2cgPDwgOSk7CisJCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gQURDX0RJOworCQl9IGVsc2UKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlciwgYml0cyA4LTExCisJCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gKGNoYW5wcm9nIDw8IDgpOworCisJCS8vIEdldCByYW5nZSBmb3IgY3VycmVudCBjaGFubmVsCisJCXJhbmdlID0gdGhpc19ib2FyZC0+cmFuZ2Vjb2RlW0NSX1JBTkdFKGNoYW5saXN0W2ldKV07CisJCS8vIFNldCByYW5nZS4gYml0cyA0LTUKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IHJhbmdlOworCisJCS8qIE91dHB1dCBjaGFubmVsLCByYW5nZSwgbW9kZSB0byBJQ1AgTXVsdGkgKi8KKwkJd3JpdGV3KGRldnByaXYtPkFkY0NtZFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJHUzogJTJkLiBbJTR4XT0lNHggJTR4XG4iLCBpLCBjaGFucHJvZywgcmFuZ2UsCisJCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0pOworI2VuZGlmCisJfQorCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9yZXNldAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBpY3AgbXVsdGkgZGV2aWNlIHRvIGEgJ3NhZmUnIHN0YXRlCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKworCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKyNlbmRpZgorCS8vIENsZWFyIElOVCBlbmFibGVzIGFuZCByZXF1ZXN0cworCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisJd3JpdGV3KDB4MDBmZiwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pCisJCS8vIFNldCBEQUNzIHRvIDAuLjVWIHJhbmdlIGFuZCAwViBvdXRwdXQKKwkJZm9yIChpID0gMDsgaSA8IHRoaXNfYm9hcmQtPm5fYW9jaGFuOyBpKyspIHsKKwkJCWRldnByaXYtPkRhY0NtZFN0YXR1cyAmPSAweGZjY2U7CisKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlcgorCQkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IChpIDw8IDgpOworCisJCQkvLyBPdXRwdXQgMFYKKwkJCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FPKTsKKworCQkJLy8gU2V0IHN0YXJ0IGNvbnZlcnNpb24gYml0CisJCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gREFDX1NUOworCisJCQkvLyBPdXRwdXQgdG8gY29tbWFuZCAvIHN0YXR1cyByZWdpc3RlcgorCQkJd3JpdGV3KGRldnByaXYtPkRhY0NtZFN0YXR1cywKKwkJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCisJCQkvLyBEZWxheSB0byBhbGxvdyBEQUMgdGltZSB0byByZWNvdmVyCisJCQljb21lZGlfdWRlbGF5KDEpOworCQl9CisJLy8gRGlnaXRhbCBvdXRwdXRzIHRvIDAKKwl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfYXR0YWNoCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFsbCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQKKwkJZGV2aWNlLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9kZXZjb25maWcgKml0CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbgorCisJUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQsIHN1YmRldiwgbl9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQgPSBOVUxMOworCXJlc291cmNlX3NpemVfdCBpb19hZGRyWzVdLCBpb2Jhc2U7CisJdW5zaWduZWQgY2hhciBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmM7CisKKwlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CisKKwkvLyBBbG9jYXRlIHByaXZhdGUgZGF0YSBzdG9yYWdlIHNwYWNlCisJaWYgKChyZXQgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKGljcF9tdWx0aV9wcml2YXRlKSkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8vIEluaXRpYWxpc2UgbGlzdCBvZiBQQ0kgY2FyZHMgaW4gc3lzdGVtLCBpZiBub3QgYWxyZWFkeSBkb25lIHNvCisJaWYgKHBjaV9saXN0X2J1aWxkZWQrKyA9PSAwKSB7CisJCXBjaV9jYXJkX2xpc3RfaW5pdChQQ0lfVkVORE9SX0lEX0lDUCwKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJCTEKKyNlbHNlCisJCQkwCisjZW5kaWYKKwkJCSk7CisJfQorCisJcHJpbnRrKCJBbm5lJ3MgY29tZWRpJWQ6IGljcF9tdWx0aTogYm9hcmQ9JXMiLCBkZXYtPm1pbm9yLAorCQl0aGlzX2JvYXJkLT5uYW1lKTsKKworCWlmICgoY2FyZCA9IHNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQoUENJX1ZFTkRPUl9JRF9JQ1AsCisJCQkJdGhpc19ib2FyZC0+ZGV2aWNlX2lkLCBpdC0+b3B0aW9uc1swXSwKKwkJCQlpdC0+b3B0aW9uc1sxXSkpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJZGV2cHJpdi0+Y2FyZCA9IGNhcmQ7CisKKwlpZiAoKHBjaV9jYXJkX2RhdGEoY2FyZCwgJnBjaV9idXMsICZwY2lfc2xvdCwgJnBjaV9mdW5jLCAmaW9fYWRkclswXSwKKwkJCQkmaXJxKSkgPCAwKSB7CisJCXByaW50aygiIC0gQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpb2Jhc2UgPSBpb19hZGRyWzJdOworCWRldnByaXYtPnBoeXNfaW9iYXNlID0gaW9iYXNlOworCisJcHJpbnRrKCIsIGI6czpmPSVkOiVkOiVkLCBpbz0weCU4bGx4IFxuIiwgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSk7CisKKwlkZXZwcml2LT5pb19hZGRyID0gaW9yZW1hcChpb2Jhc2UsIElDUF9NVUxUSV9TSVpFKTsKKworCWlmIChkZXZwcml2LT5pb19hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKCJpb3JlbWFwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCIweCUwOGxseCBtYXBwZWQgdG8gJXAsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlLAorCQlkZXZwcml2LT5pb19hZGRyKTsKKyNlbmRpZgorCisJZGV2LT5ib2FyZF9uYW1lID0gdGhpc19ib2FyZC0+bmFtZTsKKworCW5fc3ViZGV2aWNlcyA9IDA7CisJaWYgKHRoaXNfYm9hcmQtPm5fYWljaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pCisJCW5fc3ViZGV2aWNlcysrOworCWlmICh0aGlzX2JvYXJkLT5uX2RpY2hhbikKKwkJbl9zdWJkZXZpY2VzKys7CisJaWYgKHRoaXNfYm9hcmQtPm5fZG9jaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9jdHJzKQorCQluX3N1YmRldmljZXMrKzsKKworCWlmICgocmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIG5fc3ViZGV2aWNlcykpIDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWljcF9tdWx0aV9yZXNldChkZXYpOworCisJaWYgKHRoaXNfYm9hcmQtPmhhdmVfaXJxKSB7CisJCWlmIChpcnEpIHsKKwkJCWlmIChjb21lZGlfcmVxdWVzdF9pcnEoaXJxLCBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGksCisJCQkJCUlSUUZfU0hBUkVELCAiSW5vdmEgSWNwIE11bHRpIiwgZGV2KSkgeworCQkJCXByaW50aygiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBESVNBQkxJTkcgSVQiLCBpcnEpOworCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KKwkJCX0gZWxzZQorCQkJCXByaW50aygiLCBpcnE9JXUiLCBpcnEpOworCQl9IGVsc2UKKwkJCXByaW50aygiLCBJUlEgZGlzYWJsZWQiKTsKKwl9IGVsc2UKKwkJaXJxID0gMDsKKworCWRldi0+aXJxID0gaXJxOworCisJcHJpbnRrKCIuXG4iKTsKKworCXN1YmRldiA9IDA7CisKKwlpZiAodGhpc19ib2FyZC0+bl9haWNoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7CisJCWlmICh0aGlzX2JvYXJkLT5uX2FpY2hhbmQpCisJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fYWljaGFuOworCQlzLT5tYXhkYXRhID0gdGhpc19ib2FyZC0+YWlfbWF4ZGF0YTsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9haWNoYW47CisJCXMtPnJhbmdlX3RhYmxlID0gdGhpc19ib2FyZC0+cmFuZ2VsaXN0X2FpOworCQlzLT5pbnNuX3JlYWQgPSBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NPTU1PTjsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9hb2NoYW47CisJCXMtPm1heGRhdGEgPSB0aGlzX2JvYXJkLT5hb19tYXhkYXRhOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2FvY2hhbjsKKwkJcy0+cmFuZ2VfdGFibGUgPSB0aGlzX2JvYXJkLT5yYW5nZWxpc3RfYW87CisJCXMtPmluc25fd3JpdGUgPSBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbzsKKwkJcy0+aW5zbl9yZWFkID0gaWNwX211bHRpX2luc25fcmVhZF9hbzsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fZGljaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2RpY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fZGljaGFuOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pb19iaXRzID0gMDsKKwkJcy0+aW5zbl9iaXRzID0gaWNwX211bHRpX2luc25fYml0c19kaTsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fZG9jaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2RvY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fZG9jaGFuOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pb19iaXRzID0gKDEgPDwgdGhpc19ib2FyZC0+bl9kb2NoYW4pIC0gMTsKKwkJcy0+c3RhdGUgPSAwOworCQlzLT5pbnNuX2JpdHMgPSBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9jdHJzKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NPTU1PTjsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9jdHJzOworCQlzLT5tYXhkYXRhID0gMHhmZmZmOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2N0cnM7CisJCXMtPnN0YXRlID0gMDsKKwkJcy0+aW5zbl9yZWFkID0gaWNwX211bHRpX2luc25fcmVhZF9jdHI7CisJCXMtPmluc25fd3JpdGUgPSBpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHI7CisJCXN1YmRldisrOworCX0KKworCWRldnByaXYtPnZhbGlkID0gMTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9kZXRhY2gKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnQKKwkJZGV2aWNlLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisKKwlSZXR1cm5zOmludAkwID0gc3VjY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKworCWlmIChkZXYtPnByaXZhdGUpCisJCWlmIChkZXZwcml2LT52YWxpZCkKKwkJCWljcF9tdWx0aV9yZXNldChkZXYpOworCisJaWYgKGRldi0+aXJxKQorCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpZiAoZGV2LT5wcml2YXRlICYmIGRldnByaXYtPmlvX2FkZHIpCisJCWlvdW5tYXAoZGV2cHJpdi0+aW9fYWRkcik7CisKKwlpZiAoZGV2LT5wcml2YXRlICYmIGRldnByaXYtPmNhcmQpCisJCXBjaV9jYXJkX2ZyZWUoZGV2cHJpdi0+Y2FyZCk7CisKKwlpZiAoLS1wY2lfbGlzdF9idWlsZGVkID09IDApIHsKKwkJcGNpX2NhcmRfbGlzdF9jbGVhbnVwKFBDSV9WRU5ET1JfSURfSUNQKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY0YThkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCisKKyAgICBTdHVmZiBmb3IgSUNQIE11bHRpCisKKyAgICBBdXRob3I6IEFubmUgU21vcnRoaXQgPGFubmUuc21vcnRoaXRAc2Z3dGUuY2g+CisKKyovCisKKyNpZm5kZWYgX0lDUF9NVUxUSV9IXworI2RlZmluZSBfSUNQX01VTFRJX0hfCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcGNpbHN0X3N0cnVjdCB7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKm5leHQ7CisJaW50IHVzZWQ7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlOworCXVuc2lnbmVkIGNoYXIgcGNpX2J1czsKKwl1bnNpZ25lZCBjaGFyIHBjaV9zbG90OworCXVuc2lnbmVkIGNoYXIgcGNpX2Z1bmM7CisJcmVzb3VyY2Vfc2l6ZV90IGlvX2FkZHJbNV07CisJdW5zaWduZWQgaW50IGlycTsKK307CisKK3N0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YV9kZXZpY2VzOwkvLyBwdHIgdG8gcm9vdCBsaXN0IG9mIGFsbCBJbm92YSBkZXZpY2VzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2luaXQodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvciwgY2hhciBkaXNwbGF5KTsKK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfY2xlYW51cCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yKTsKK3N0YXRpYyBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqZmluZF9mcmVlX3BjaV9jYXJkX2J5X2RldmljZSh1bnNpZ25lZCBzaG9ydAorCXZlbmRvcl9pZCwgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkKTsKK3N0YXRpYyBpbnQgZmluZF9mcmVlX3BjaV9jYXJkX2J5X3Bvc2l0aW9uKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QsIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICoqY2FyZCk7CitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKnNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwgdW5zaWduZWQgc2hvcnQgcGNpX2J1cywKKwl1bnNpZ25lZCBzaG9ydCBwY2lfc2xvdCk7CisKK3N0YXRpYyBpbnQgcGNpX2NhcmRfYWxsb2Moc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmFtY2MpOworc3RhdGljIGludCBwY2lfY2FyZF9mcmVlKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICphbWNjKTsKK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfZGlzcGxheSh2b2lkKTsKK3N0YXRpYyBpbnQgcGNpX2NhcmRfZGF0YShzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqYW1jYywKKwl1bnNpZ25lZCBjaGFyICpwY2lfYnVzLCB1bnNpZ25lZCBjaGFyICpwY2lfc2xvdCwKKwl1bnNpZ25lZCBjaGFyICpwY2lfZnVuYywgcmVzb3VyY2Vfc2l6ZV90ICogaW9fYWRkciwgdW5zaWduZWQgaW50ICppcnEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogYnVpbGQgbGlzdCBvZiBJbm92YSBjYXJkcyBpbiB0aGlzIHN5c3RlbSAqLworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9pbml0KHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IsIGNoYXIgZGlzcGxheSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKmxhc3Q7CisJaW50IGk7CisKKwlpbm92YV9kZXZpY2VzID0gTlVMTDsKKwlsYXN0ID0gTlVMTDsKKworCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBwY2lfdmVuZG9yKSB7CisJCQlpbm92YSA9IGttYWxsb2Moc2l6ZW9mKCppbm92YSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbm92YSkgeworCQkJCXByaW50aygiaWNwX211bHRpOiBwY2lfY2FyZF9saXN0X2luaXQ6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlwY2lfZGV2X3B1dChwY2lkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtc2V0KGlub3ZhLCAwLCBzaXplb2YoKmlub3ZhKSk7CisKKwkJCWlub3ZhLT5wY2lkZXYgPSBwY2lfZGV2X2dldChwY2lkZXYpOworCQkJaWYgKGxhc3QpIHsKKwkJCQlsYXN0LT5uZXh0ID0gaW5vdmE7CisJCQl9IGVsc2UgeworCQkJCWlub3ZhX2RldmljZXMgPSBpbm92YTsKKwkJCX0KKwkJCWxhc3QgPSBpbm92YTsKKworCQkJaW5vdmEtPnZlbmRvciA9IHBjaWRldi0+dmVuZG9yOworCQkJaW5vdmEtPmRldmljZSA9IHBjaWRldi0+ZGV2aWNlOworCQkJaW5vdmEtPnBjaV9idXMgPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOworCQkJaW5vdmEtPnBjaV9zbG90ID0gUENJX1NMT1QocGNpZGV2LT5kZXZmbik7CisJCQlpbm92YS0+cGNpX2Z1bmMgPSBQQ0lfRlVOQyhwY2lkZXYtPmRldmZuKTsKKwkJCS8qIE5vdGU6IHJlc291cmNlcyBtYXkgYmUgaW52YWxpZCBpZiBQQ0kgZGV2aWNlCisJCQkgKiBub3QgZW5hYmxlZCwgYnV0IHRoZXkgYXJlIGNvcnJlY3RlZCBpbgorCQkJICogcGNpX2NhcmRfYWxsb2MuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCWlub3ZhLT5pb19hZGRyW2ldID0KKwkJCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgaSk7CisJCQlpbm92YS0+aXJxID0gcGNpZGV2LT5pcnE7CisJCX0KKwl9CisKKwlpZiAoZGlzcGxheSkKKwkJcGNpX2NhcmRfbGlzdF9kaXNwbGF5KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnJlZSB1cCBsaXN0IG9mIGFtY2MgY2FyZHMgaW4gdGhpcyBzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfY2xlYW51cCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yKQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKm5leHQ7CisKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCXBjaV9kZXZfcHV0KGlub3ZhLT5wY2lkZXYpOworCQlrZnJlZShpbm92YSk7CisJfQorCisJaW5vdmFfZGV2aWNlcyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZmluZCBmaXJzdCB1bnVzZWQgY2FyZCB3aXRoIHRoaXMgZGV2aWNlX2lkICovCitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmZpbmRfZnJlZV9wY2lfY2FyZF9ieV9kZXZpY2UodW5zaWduZWQgc2hvcnQKKwl2ZW5kb3JfaWQsIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJZm9yIChpbm92YSA9IGlub3ZhX2RldmljZXM7IGlub3ZhOyBpbm92YSA9IG5leHQpIHsKKwkJbmV4dCA9IGlub3ZhLT5uZXh0OworCQlpZiAoKCFpbm92YS0+dXNlZCkgJiYgKGlub3ZhLT5kZXZpY2UgPT0gZGV2aWNlX2lkKQorCQkJJiYgKGlub3ZhLT52ZW5kb3IgPT0gdmVuZG9yX2lkKSkKKwkJCXJldHVybiBpbm92YTsKKworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZpbmQgY2FyZCBvbiByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgZmluZF9mcmVlX3BjaV9jYXJkX2J5X3Bvc2l0aW9uKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QsIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICoqY2FyZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJKmNhcmQgPSBOVUxMOworCWZvciAoaW5vdmEgPSBpbm92YV9kZXZpY2VzOyBpbm92YTsgaW5vdmEgPSBuZXh0KSB7CisJCW5leHQgPSBpbm92YS0+bmV4dDsKKwkJaWYgKChpbm92YS0+dmVuZG9yID09IHZlbmRvcl9pZCkgJiYgKGlub3ZhLT5kZXZpY2UgPT0gZGV2aWNlX2lkKQorCQkJJiYgKGlub3ZhLT5wY2lfYnVzID09IHBjaV9idXMpCisJCQkmJiAoaW5vdmEtPnBjaV9zbG90ID09IHBjaV9zbG90KSkgeworCQkJaWYgKCEoaW5vdmEtPnVzZWQpKSB7CisJCQkJKmNhcmQgPSBpbm92YTsKKwkJCQlyZXR1cm4gMDsJLy8gb2ssIGNhcmQgaXMgZm91bmQKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIDI7CS8vIGNhcmQgZXhpc3QgYnV0IGlzIHVzZWQKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxOwkJLy8gbm8gY2FyZCBmb3VuZAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hcmsgY2FyZCBhcyB1c2VkICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2FsbG9jKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSkKK3sKKwlpbnQgaTsKKworCWlmICghaW5vdmEpIHsKKwkJcnRfcHJpbnRrKCIgLSBCVUchISBpbm92YSBpcyBOVUxMIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5vdmEtPnVzZWQpCisJCXJldHVybiAxOworCWlmIChjb21lZGlfcGNpX2VuYWJsZShpbm92YS0+cGNpZGV2LCAiaWNwX211bHRpIikpIHsKKwkJcnRfcHJpbnRrKCIgLSBDYW4ndCBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogUmVzb3VyY2VzIHdpbGwgYmUgYWNjdXJhdGUgbm93LiAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWlub3ZhLT5pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlub3ZhLT5wY2lkZXYsIGkpOworCWlub3ZhLT5pcnEgPSBpbm92YS0+cGNpZGV2LT5pcnE7CisJaW5vdmEtPnVzZWQgPSAxOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hcmsgY2FyZCBhcyBmcmVlICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2ZyZWUoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhKQoreworCWlmICghaW5vdmEpCisJCXJldHVybiAtMTsKKworCWlmICghaW5vdmEtPnVzZWQpCisJCXJldHVybiAxOworCWlub3ZhLT51c2VkID0gMDsKKwljb21lZGlfcGNpX2Rpc2FibGUoaW5vdmEtPnBjaWRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGlzcGxheSBsaXN0IG9mIGZvdW5kIGNhcmRzICovCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2Rpc3BsYXkodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJcHJpbnRrKCJBbm5lJ3MgTGlzdCBvZiBwY2kgY2FyZHNcbiIpOworCXByaW50aygiYnVzOnNsb3Q6ZnVuYyB2ZW5kb3IgZGV2aWNlIGlvX2lub3ZhIGlvX2RhcSBpcnEgdXNlZFxuIik7CisKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCXByaW50aygiJTJkICAgJTJkICAgJTJkICAweCU0eCAweCU0eCAgIDB4JThsbHggMHglOGxseCAgJTJ1ICAlMmRcbiIsIGlub3ZhLT5wY2lfYnVzLCBpbm92YS0+cGNpX3Nsb3QsIGlub3ZhLT5wY2lfZnVuYywgaW5vdmEtPnZlbmRvciwgaW5vdmEtPmRldmljZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm92YS0+aW9fYWRkclswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm92YS0+aW9fYWRkclsyXSwgaW5vdmEtPmlycSwgaW5vdmEtPnVzZWQpOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJldHVybiBhbGwgY2FyZCBpbmZvcm1hdGlvbiBmb3IgZHJpdmVyICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2RhdGEoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLAorCXVuc2lnbmVkIGNoYXIgKnBjaV9idXMsIHVuc2lnbmVkIGNoYXIgKnBjaV9zbG90LAorCXVuc2lnbmVkIGNoYXIgKnBjaV9mdW5jLCByZXNvdXJjZV9zaXplX3QgKiBpb19hZGRyLCB1bnNpZ25lZCBpbnQgKmlycSkKK3sKKwlpbnQgaTsKKworCWlmICghaW5vdmEpCisJCXJldHVybiAtMTsKKwkqcGNpX2J1cyA9IGlub3ZhLT5wY2lfYnVzOworCSpwY2lfc2xvdCA9IGlub3ZhLT5wY2lfc2xvdDsKKwkqcGNpX2Z1bmMgPSBpbm92YS0+cGNpX2Z1bmM7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaW9fYWRkcltpXSA9IGlub3ZhLT5pb19hZGRyW2ldOworCSppcnEgPSBpbm92YS0+aXJxOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNlbGVjdCBhbmQgYWxsb2MgY2FyZCAqLworc3RhdGljIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICpzZWxlY3RfYW5kX2FsbG9jX3BjaV9jYXJkKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQ7CisJaW50IGVycjsKKworCWlmICgocGNpX2J1cyA8IDEpICYgKHBjaV9zbG90IDwgMSkpIHsJLy8gdXNlIGF1dG9kZXRlY3Rpb24KKwkJaWYgKChjYXJkID0gZmluZF9mcmVlX3BjaV9jYXJkX2J5X2RldmljZSh2ZW5kb3JfaWQsCisJCQkJCWRldmljZV9pZCkpID09IE5VTEwpIHsKKwkJCXJ0X3ByaW50aygiIC0gVW51c2VkIGNhcmQgbm90IGZvdW5kIGluIHN5c3RlbSFcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGZpbmRfZnJlZV9wY2lfY2FyZF9ieV9wb3NpdGlvbih2ZW5kb3JfaWQsIGRldmljZV9pZCwKKwkJCQlwY2lfYnVzLCBwY2lfc2xvdCwgJmNhcmQpKSB7CisJCWNhc2UgMToKKwkJCXJ0X3ByaW50aworCQkJCSgiIC0gQ2FyZCBub3QgZm91bmQgb24gcmVxdWVzdGVkIHBvc2l0aW9uIGI6cyAlZDolZCFcbiIsCisJCQkJcGNpX2J1cywgcGNpX3Nsb3QpOworCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgMjoKKwkJCXJ0X3ByaW50aworCQkJCSgiIC0gQ2FyZCBvbiByZXF1ZXN0ZWQgcG9zaXRpb24gaXMgdXNlZCBiOnMgJWQ6JWQhXG4iLAorCQkJCXBjaV9idXMsIHBjaV9zbG90KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKChlcnIgPSBwY2lfY2FyZF9hbGxvYyhjYXJkKSkgIT0gMCkgeworCQlpZiAoZXJyID4gMCkKKwkJCXJ0X3ByaW50aygiIC0gQ2FuJ3QgYWxsb2NhdGUgY2FyZCFcbiIpOworCQkvKiBlbHNlOiBlcnJvciBhbHJlYWR5IHByaW50ZWQuICovCisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBjYXJkOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMyYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCkBAIC0wLDAgKzEsMjM2MiBAQAorLyoKKyAgIGNvbWVkaS9kcml2ZXJzL21lNDAwMC5jCisgICBTb3VyY2UgY29kZSBmb3IgdGhlIE1laWxoYXVzIE1FLTQwMDAgYm9hcmQgZmFtaWx5LgorCisgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworLyoKK0RyaXZlcjogbWU0MDAwCitEZXNjcmlwdGlvbjogTWVpbGhhdXMgTUUtNDAwMCBzZXJpZXMgYm9hcmRzCitEZXZpY2VzOiBbTWVpbGhhdXNdIE1FLTQ2NTAgKG1lNDAwMCksIE1FLTQ2NzBpLCBNRS00NjgwLCBNRS00NjgwaSwgTUUtNDY4MGlzCitBdXRob3I6IGdnIChHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmNvbT4pCitVcGRhdGVkOiBNb24sIDE4IE1hciAyMDAyIDE1OjM0OjAxIC0wODAwCitTdGF0dXM6IGJyb2tlbiAobm8gc3VwcG9ydCBmb3IgbG9hZGluZyBmaXJtd2FyZSkKKworU3VwcG9ydHM6CisKKyAgICAtIEFuYWxvZyBJbnB1dAorICAgIC0gQW5hbG9nIE91dHB1dAorICAgIC0gRGlnaXRhbCBJL08KKyAgICAtIENvdW50ZXIKKworQ29uZmlndXJhdGlvbiBPcHRpb25zOgorCisgICAgWzBdIC0gUENJIGJ1cyBudW1iZXIgKG9wdGlvbmFsKQorICAgIFsxXSAtIFBDSSBzbG90IG51bWJlciAob3B0aW9uYWwpCisKKyAgICBJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIFBDSQorICAgIGRldmljZSB3aWxsIGJlIHVzZWQuCisKK1RoZSBmaXJtd2FyZSByZXF1aXJlZCBieSB0aGVzZSBib2FyZHMgaXMgYXZhaWxhYmxlIGluIHRoZQorY29tZWRpX25vbmZyZWVfZmlybXdhcmUgdGFyYmFsbCBhdmFpbGFibGUgZnJvbQoraHR0cDovL3d3dy5jb21lZGkub3JnLiAgSG93ZXZlciwgdGhlIGRyaXZlcidzIHN1cHBvcnQgZm9yCitsb2FkaW5nIHRoZSBmaXJtd2FyZSB0aHJvdWdoIGNvbWVkaV9jb25maWcgaXMgY3VycmVudGx5Citicm9rZW4uCisKKyAqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorI2luY2x1ZGUgIm1lNDAwMC5oIgorI2lmIDAKKy8qIGZpbGUgcmVtb3ZlZCBkdWUgdG8gR1BMIGluY29tcGF0aWJpbGl0eSAqLworI2luY2x1ZGUgIm1lNDAwMF9mdy5oIgorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBQQ0kgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtZTQwMDBfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lNDAwMF9wY2lfdGFibGUpOworCitzdGF0aWMgY29uc3QgbWU0MDAwX2JvYXJkX3QgbWU0MDAwX2JvYXJkc1tdID0geworCXsiTUUtNDY1MCIsIDB4NDY1MCwgezAsIDB9LCB7MTYsIDAsIDAsIDB9LCB7NH0sIHswfX0sCisKKwl7Ik1FLTQ2NjAiLCAweDQ2NjAsIHswLCAwfSwgezMyLCAwLCAxNiwgMH0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NjBpIiwgMHg0NjYxLCB7MCwgMH0sIHszMiwgMCwgMTYsIDB9LCB7NH0sIHszfX0sCisJeyJNRS00NjYwcyIsIDB4NDY2MiwgezAsIDB9LCB7MzIsIDgsIDE2LCAwfSwgezR9LCB7M319LAorCXsiTUUtNDY2MGlzIiwgMHg0NjYzLCB7MCwgMH0sIHszMiwgOCwgMTYsIDB9LCB7NH0sIHszfX0sCisKKwl7Ik1FLTQ2NzAiLCAweDQ2NzAsIHs0LCAwfSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NzBpIiwgMHg0NjcxLCB7NCwgMH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjcwcyIsIDB4NDY3MiwgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY3MGlzIiwgMHg0NjczLCB7NCwgMH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisKKwl7Ik1FLTQ2ODAiLCAweDQ2ODAsIHs0LCA0fSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2ODBpIiwgMHg0NjgxLCB7NCwgNH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjgwcyIsIDB4NDY4MiwgezQsIDR9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY4MGlzIiwgMHg0NjgzLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisKKwl7MH0sCit9OworCisjZGVmaW5lIE1FNDAwMF9CT0FSRF9WRVJTSU9OUyAoc2l6ZW9mKG1lNDAwMF9ib2FyZHMpIC8gc2l6ZW9mKG1lNDAwMF9ib2FyZF90KSAtIDEpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ29tZWRpIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWU0MDAwX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBtZTQwMDBfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX21lNDAwMCA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJtZTQwMDAiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOm1lNDAwMF9hdHRhY2gsCisgICAgICBkZXRhY2g6bWU0MDAwX2RldGFjaCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWVpbGhhdXMgZnVuY3Rpb24gcHJvdG90eXBlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZTQwMDBfcHJvYmUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVycyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKTsKK3N0YXRpYyBpbnQgaW5pdF9ib2FyZF9pbmZvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApOworc3RhdGljIGludCBpbml0X2FvX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluaXRfYWlfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5pdF9kaW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5pdF9jbnRfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgeGlsaW54X2Rvd25sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCByZXNldF9ib2FyZChjb21lZGlfZGV2aWNlICogZGV2KTsKKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgY250X3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworc3RhdGljIGludCBjbnRfY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBtb2RlKTsKKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHN1YmRldmljZSwgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworCitzdGF0aWMgaW50IGFpX2NoZWNrX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpOworCitzdGF0aWMgaW50IGFpX3JvdW5kX2NtZF9hcmdzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgKmluaXRfdGlja3MsCisJdW5zaWduZWQgaW50ICpzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgKmNoYW5fdGlja3MpOworCitzdGF0aWMgaW50IGFpX3ByZXBhcmUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kLAorCXVuc2lnbmVkIGludCBpbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgY2hhbl90aWNrcyk7CisKK3N0YXRpYyBpbnQgYWlfd3JpdGVfY2hhbmxpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQwMDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTX0FSRyk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZF90ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9kb19jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworCitzdGF0aWMgaW50IG1lNDAwMF9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfYW9faW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNZWlsaGF1cyBpbmxpbmUgZnVuY3Rpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZTQwMDBfb3V0Yihjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBjaGFyIHZhbHVlLAorCXVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlQT1JUX1BERUJVRygiLS0+IDB4JTAyWCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlvdXRiKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lNDAwMF9vdXRsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisJdW5zaWduZWQgbG9uZyBwb3J0KQoreworCVBPUlRfUERFQlVHKCItLT4gMHglMDhsWCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlvdXRsKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1lNDAwMF9pbmwoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdmFsdWUgPSBpbmwocG9ydCk7CisJUE9SVF9QREVCVUcoIjwtLSAweCUwOGxYIHBvcnQgMHglMDRsWFxuIiwgdmFsdWUsIHBvcnQpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1lNDAwMF9pbmIoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXVuc2lnbmVkIGNoYXIgdmFsdWU7CisJdmFsdWUgPSBpbmIocG9ydCk7CisJUE9SVF9QREVCVUcoIjwtLSAweCUwOFggcG9ydCAweCUwNGxYXG4iLCB2YWx1ZSwgcG9ydCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTQwMDBfYWlfcmFuZ2UgPSB7CisJNCwKKwl7CisJCQlVTklfUkFOR0UoMi41KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoMi41KSwKKwkJCUJJUF9SQU5HRSgxMCksCisJCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lNDAwMF9hb19yYW5nZSA9IHsKKwkxLAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCX0KK307CisKK3N0YXRpYyBpbnQgbWU0MDAwX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmVzdWx0OworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9hdHRhY2goKVxuIik7CisKKwlyZXN1bHQgPSBtZTQwMDBfcHJvYmUoZGV2LCBpdCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLiAgYWxsb2Nfc3ViZGV2aWNlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4gIEl0IHJlbGllcyBvbgorCSAqIG5fc3ViZGV2aWNlcyBiZWluZyBzZXQgY29ycmVjdGx5LgorCSAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgNCkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQW5hbG9nIGlucHV0IHN1YmRldmljZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCisJaWYgKHRoaXNib2FyZC0+YWkuY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCQlzLT5zdWJkZXZfZmxhZ3MgPQorCQkJU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQgfCBTREZfRElGRjsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haS5jb3VudDsKKwkJcy0+bWF4ZGF0YSA9IDB4RkZGRjsJLy8gMTYgYml0IEFEQworCQlzLT5sZW5fY2hhbmxpc3QgPSBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX0NPVU5UOworCQlzLT5yYW5nZV90YWJsZSA9ICZtZTQwMDBfYWlfcmFuZ2U7CisJCXMtPmluc25fcmVhZCA9IG1lNDAwMF9haV9pbnNuX3JlYWQ7CisKKwkJaWYgKGluZm8tPmlycSA+IDApIHsKKwkJCWlmIChjb21lZGlfcmVxdWVzdF9pcnEoaW5mby0+aXJxLCBtZTQwMDBfYWlfaXNyLAorCQkJCQlJUlFGX1NIQVJFRCwgIk1FLTQwMDAiLCBkZXYpKSB7CisJCQkJcHJpbnRrKCJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYXR0YWNoKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBpcnFcbiIsIGRldi0+bWlub3IpOworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOworCQkJCXMtPmNhbmNlbCA9IG1lNDAwMF9haV9jYW5jZWw7CisJCQkJcy0+ZG9fY21kdGVzdCA9IG1lNDAwMF9haV9kb19jbWRfdGVzdDsKKwkJCQlzLT5kb19jbWQgPSBtZTQwMDBfYWlfZG9fY21kOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYXR0YWNoKCk6IE5vIGludGVycnVwdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCX0KKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQW5hbG9nIG91dHB1dCBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKworCWlmICh0aGlzYm9hcmQtPmFvLmNvdW50KSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRSB8IFNERl9DT01NT04gfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvLmNvdW50OworCQlzLT5tYXhkYXRhID0gMHhGRkZGOwkvLyAxNiBiaXQgREFDCisJCXMtPnJhbmdlX3RhYmxlID0gJm1lNDAwMF9hb19yYW5nZTsKKwkJcy0+aW5zbl93cml0ZSA9IG1lNDAwMF9hb19pbnNuX3dyaXRlOworCQlzLT5pbnNuX3JlYWQgPSBtZTQwMDBfYW9faW5zbl9yZWFkOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBEaWdpdGFsIEkvTyBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKworCWlmICh0aGlzYm9hcmQtPmRpby5jb3VudCkgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+ZGlvLmNvdW50ICogODsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cyA9IG1lNDAwMF9kaW9faW5zbl9iaXRzOworCQlzLT5pbnNuX2NvbmZpZyA9IG1lNDAwMF9kaW9faW5zbl9jb25maWc7CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLiBJZiBvbmUgdGhlIGZpcnN0CisJICogcG9ydCBpcyBhIGZpeGVkIG91dHB1dCBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KKwkgKi8KKwlpZiAoIW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKSkgeworCQlzLT5pb19iaXRzIHw9IDB4RkY7CisJCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAsCisJCQlpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKTsKKwl9CisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIENvdW50ZXIgc3ViZGV2aWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisKKwlpZiAodGhpc2JvYXJkLT5jbnQuY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5jbnQuY291bnQ7CisJCXMtPm1heGRhdGEgPSAweEZGRkY7CS8vIDE2IGJpdCBjb3VudGVycworCQlzLT5pbnNuX3JlYWQgPSBtZTQwMDBfY250X2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZSA9IG1lNDAwMF9jbnRfaW5zbl93cml0ZTsKKwkJcy0+aW5zbl9jb25maWcgPSBtZTQwMDBfY250X2luc25fY29uZmlnOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX3Byb2JlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsKKwlpbnQgcmVzdWx0LCBpOworCW1lNDAwMF9ib2FyZF90ICpib2FyZDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfcHJvYmUoKVxuIik7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIG1lbW9yeSAqLworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKG1lNDAwMF9pbmZvX3QpKSA8IDApIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qCisJICogUHJvYmUgdGhlIGRldmljZSB0byBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgaW4gdGhlIHNlcmllcyBpdCBpcy4KKwkgKi8KKwlmb3IgKHBjaV9kZXZpY2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpX2RldmljZSAhPSBOVUxMOworCQlwY2lfZGV2aWNlID0KKwkJcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldmljZSkpIHsKKwkJaWYgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUU0MDAwX0JPQVJEX1ZFUlNJT05TOyBpKyspIHsKKwkJCQlpZiAobWU0MDAwX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0KKwkJCQkJcGNpX2RldmljZS0+ZGV2aWNlKSB7CisJCQkJCS8qIFdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPyAqLworCQkJCQlpZiAoKGl0LT5vcHRpb25zWzBdICE9IDApCisJCQkJCQl8fCAoaXQtPm9wdGlvbnNbMV0gIT0gMCkpIHsKKwkJCQkJCS8qIEFyZSB3ZSBvbiB0aGUgd3JvbmcgYnVzL3Nsb3Q/ICovCisJCQkJCQlpZiAocGNpX2RldmljZS0+YnVzLT5udW1iZXIgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1swXQorCQkJCQkJCXx8IFBDSV9TTE9UKHBjaV9kZXZpY2UtPgorCQkJCQkJCQlkZXZmbikgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1sxXSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWRldi0+Ym9hcmRfcHRyID0gbWU0MDAwX2JvYXJkcyArIGk7CisJCQkJCWJvYXJkID0gKG1lNDAwMF9ib2FyZF90ICopIGRldi0+CisJCQkJCQlib2FyZF9wdHI7CisJCQkJCWluZm8tPnBjaV9kZXZfcCA9IHBjaV9kZXZpY2U7CisJCQkJCWdvdG8gZm91bmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSCisJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogTm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCQlkZXYtPm1pbm9yLCBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCXJldHVybiAtRU5PREVWOworCisgICAgICBmb3VuZDoKKworCXByaW50ayhLRVJOX0lORk8KKwkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBGb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLAorCQlkZXYtPm1pbm9yLCBtZTQwMDBfYm9hcmRzW2ldLm5hbWUsIHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOworCisJLyogU2V0IGRhdGEgaW4gZGV2aWNlIHN0cnVjdHVyZSAqLworCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkLT5uYW1lOworCisJLyogRW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyAqLworCXJlc3VsdCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXZpY2UsIGRldi0+Ym9hcmRfbmFtZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IEkvTyByZWdpb25zXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogR2V0IHRoZSBQQ0kgYmFzZSByZWdpc3RlcnMgKi8KKwlyZXN1bHQgPSBnZXRfcmVnaXN0ZXJzKGRldiwgcGNpX2RldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGdldCByZWdpc3RlcnNcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogSW5pdGlhbGl6ZSBib2FyZCBpbmZvICovCisJcmVzdWx0ID0gaW5pdF9ib2FyZF9pbmZvKGRldiwgcGNpX2RldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYmFvcmQgaW5mb1xuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgYW5hbG9nIG91dHB1dCBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9hb19jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYW8gY29udGV4dFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgYW5hbG9nIGlucHV0IGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2FpX2NvbnRleHQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBhaSBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBkaWdpdGFsIEkvTyBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9kaW9fY29udGV4dChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGRpbyBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBjb3VudGVyIGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2NudF9jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgY250IGNvbnRleHRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBEb3dubG9hZCB0aGUgeGlsaW54IGZpcm13YXJlICovCisJcmVzdWx0ID0geGlsaW54X2Rvd25sb2FkKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBNYWtlIGEgaGFyZHdhcmUgcmVzZXQgKi8KKwlyZXN1bHQgPSByZXNldF9ib2FyZChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbid0IHJlc2V0IGJvYXJkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVycyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKQoreworCisJQ0FMTF9QREVCVUcoIkluIGdldF9yZWdpc3RlcnMoKVxuIik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbHggcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+cGx4X3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAxKTsKKwlpZiAoaW5mby0+cGx4X3JlZ2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgMSBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT5wbHhfcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDEpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWU0MDAwIHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPm1lNDAwMF9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgMik7CisJaWYgKGluZm8tPm1lNDAwMF9yZWdiYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDIgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW5mby0+bWU0MDAwX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAyKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRpbWVyIHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPnRpbWVyX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAzKTsKKwlpZiAoaW5mby0+dGltZXJfcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyAzIGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPnRpbWVyX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAzKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2dyYW0gcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+cHJvZ3JhbV9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgNSk7CisJaWYgKGluZm8tPnByb2dyYW1fcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyA1IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPnByb2dyYW1fcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9ib2FyZF9pbmZvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApCit7CisJaW50IHJlc3VsdDsKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2JvYXJkX2luZm8oKVxuIik7CisKKwkvKiBJbml0IHNwaW4gbG9ja3MgKi8KKwkvL3NwaW5fbG9ja19pbml0KCZpbmZvLT5wcmVsb2FkX2xvY2spOworCS8vc3Bpbl9sb2NrX2luaXQoJmluZm8tPmFpX2N0cmxfbG9jayk7CisKKwkvKiBHZXQgdGhlIHNlcmlhbCBudW1iZXIgKi8KKwlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2Rldl9wLCAweDJDLCAmaW5mby0+c2VyaWFsX25vKTsKKwlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEdldCB0aGUgaGFyZHdhcmUgcmV2aXNpb24gKi8KKwlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X3AsIDB4MDgsICZpbmZvLT5od19yZXZpc2lvbik7CisJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBHZXQgdGhlIHZlbmRvciBpZCAqLworCWluZm8tPnZlbmRvcl9pZCA9IHBjaV9kZXZfcC0+dmVuZG9yOworCisJLyogR2V0IHRoZSBkZXZpY2UgaWQgKi8KKwlpbmZvLT5kZXZpY2VfaWQgPSBwY2lfZGV2X3AtPmRldmljZTsKKworCS8qIEdldCB0aGUgaXJxIGFzc2lnbmVkIHRvIHRoZSBib2FyZCAqLworCWluZm8tPmlycSA9IHBjaV9kZXZfcC0+aXJxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9hb19jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGk7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9hb19jb250ZXh0KClcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHRoaXNib2FyZC0+YW8uY291bnQ7IGkrKykgeworCQkvL3NwaW5fbG9ja19pbml0KCZpbmZvLT5hb19jb250ZXh0W2ldLnVzZV9sb2NrKTsKKwkJaW5mby0+YW9fY29udGV4dFtpXS5pcnEgPSBpbmZvLT5pcnE7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfYWlfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfYWlfY29udGV4dCgpXG4iKTsKKworCWluZm8tPmFpX2NvbnRleHQuaXJxID0gaW5mby0+aXJxOworCisJaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NUUkxfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc3RhdHVzX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NUQVRVU19SRUc7CisJaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmRhdGFfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfREFUQV9SRUc7CisJaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NIQU5fVElNRVJfUkVHOworCWluZm8tPmFpX2NvbnRleHQuY2hhbl9wcmVfdGltZXJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ0hBTl9QUkVfVElNRVJfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9sb3dfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9USU1FUl9MT1dfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9oaWdoX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NDQU5fVElNRVJfSElHSF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9sb3dfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zdGFydF9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TVEFSVF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5pcnFfc3RhdHVzX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2FtcGxlX2NvdW50ZXJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kaW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfZGlvX2NvbnRleHQoKVxuIik7CisKKwlpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQuY3RybF9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fQ1RSTF9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8wX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzBfUkVHOworCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMV9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8xX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMl9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8zX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzNfUkVHOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9jbnRfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfY250X2NvbnRleHQoKVxuIik7CisKKwlpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyA9IGluZm8tPnRpbWVyX3JlZ2Jhc2UgKyBNRTQwMDBfQ05UX0NUUkxfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzBfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzFfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzJfUkVHOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRklSTVdBUkVfTk9UX0FWQUlMQUJMRSAxCisjaWYgRklSTVdBUkVfTk9UX0FWQUlMQUJMRQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKnhpbGlueF9maXJtOworI2VuZGlmCisKK3N0YXRpYyBpbnQgeGlsaW54X2Rvd25sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdTMyIHZhbHVlID0gMDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgc2l6ZSA9IDA7CisKKwlDQUxMX1BERUJVRygiSW4geGlsaW54X2Rvd25sb2FkKClcbiIpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJLyoKKwkgKiBTZXQgUExYIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IHRvIGhpZ2guCisJICogSW50ZXJydXB0IGlzIHRocm93biBieSBpbml0IHBpbiBvZiB4aWxpbnguCisJICovCisJb3V0bCgweDEwLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJLyogU2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbnggKi8KKwl2YWx1ZSA9IGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCXZhbHVlIHw9IDB4MTAwOworCW91dGwodmFsdWUsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisKKwkvKiBJbml0IFhpbGlueCB3aXRoIENTMSAqLworCWluYihpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UgKyAweEM4KTsKKworCS8qIFdhaXQgdW50aWwgL0lOSVQgcGluIGlzIHNldCAqLworCXVkZWxheSgyMCk7CisJaWYgKCFpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IENhbid0IGluaXQgWGlsaW54XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJlc2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbnggKi8KKwl2YWx1ZSA9IGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCXZhbHVlICY9IH4weDEwMDsKKwlvdXRsKHZhbHVlLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCWlmIChGSVJNV0FSRV9OT1RfQVZBSUxBQkxFKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkieGlsaW54IGZpcm13YXJlIHVuYXZhaWxhYmxlIGR1ZSB0byBsaWNlbnNpbmcsIGFib3J0aW5nIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSB7CisJCS8qIERvd25sb2FkIFhpbGlueCBmaXJtd2FyZSAqLworCQlzaXplID0gKHhpbGlueF9maXJtWzBdIDw8IDI0KSArICh4aWxpbnhfZmlybVsxXSA8PCAxNikgKworCQkJKHhpbGlueF9maXJtWzJdIDw8IDgpICsgeGlsaW54X2Zpcm1bM107CisJCXVkZWxheSgxMCk7CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCBzaXplOyBpZHgrKykgeworCQkJb3V0Yih4aWxpbnhfZmlybVsxNiArIGlkeF0sIGluZm8tPnByb2dyYW1fcmVnYmFzZSk7CisJCQl1ZGVsYXkoMTApOworCisJCQkvKiBDaGVjayBpZiBCVVNZIGZsYWcgaXMgbG93ICovCisJCQlpZiAoaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUikgJiAweDIwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogWGlsaW54IGlzIHN0aWxsIGJ1c3kgKGlkeCA9ICVkKVxuIiwKKwkJCQkJZGV2LT5taW5vciwgaWR4KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCX0KKworCS8qIElmIGRvbmUgZmxhZyBpcyBoaWdoIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsICovCisJaWYgKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpICYgMHg0KSB7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERPTkUgZmxhZyBpcyBub3Qgc2V0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBEb3dubG9hZCBub3Qgc3VjY2VzZnVsXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFNldCAvQ1MgYW5kIC9XUklURSAqLworCXZhbHVlID0gaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJdmFsdWUgfD0gMHgxMDA7CisJb3V0bCh2YWx1ZSwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlc2V0X2JvYXJkKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpY3I7CisKKwlDQUxMX1BERUJVRygiSW4gcmVzZXRfYm9hcmQoKVxuIik7CisKKwkvKiBNYWtlIGEgaGFyZHdhcmUgcmVzZXQgKi8KKwlpY3IgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwlpY3IgfD0gMHg0MDAwMDAwMDsKKwltZTQwMDBfb3V0bChkZXYsIGljciwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwlpY3IgJj0gfjB4NDAwMDAwMDA7CisJbWU0MDAwX291dGwoZGV2LCBpY3IsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisKKwkvKiAweDgwMDAgdG8gdGhlIERBQ3MgbWVhbnMgYW4gb3V0cHV0IHZvbHRhZ2Ugb2YgMFYgKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfU0lOR0xFX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LCAweDgwMDAsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwgMHg4MDAwLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9TSU5HTEVfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfU0lOR0xFX1JFRyk7CisKKwkvKiBTZXQgYm90aCBzdG9wIGJpdHMgaW4gdGhlIGFuYWxvZyBpbnB1dCBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ1RSTF9SRUcpOworCisJLyogU2V0IGJvdGggc3RvcCBiaXRzIGluIHRoZSBhbmFsb2cgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9DVFJMX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfQ1RSTF9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX0NUUkxfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19DVFJMX1JFRyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYICovCisJbWU0MDAwX291dGwoZGV2LCAweDQzLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJLyogU2V0IHRoZSBhZHVzdG1lbnQgcmVnaXN0ZXIgZm9yIEFPIGRlbXV4ICovCisJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1ZBTFVFLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfUkVHKTsKKworCS8qIFNldCBkaWdpdGFsIEkvTyBkaXJlY3Rpb24gZm9yIHBvcnQgMCB0byBvdXRwdXQgb24gaXNvbGF0ZWQgdmVyc2lvbnMgKi8KKwlpZiAoIShtZTQwMDBfaW5sKGRldiwgaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUcpICYgMHgxKSkgeworCQltZTQwMDBfb3V0bChkZXYsIDB4MSwKKwkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19DVFJMX1JFRyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGV0YWNoKClcbiIpOworCisJaWYgKGluZm8pIHsKKwkJaWYgKGluZm8tPnBjaV9kZXZfcCkgeworCQkJcmVzZXRfYm9hcmQoZGV2KTsKKwkJCWlmIChpbmZvLT5wbHhfcmVnYmFzZSkgeworCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShpbmZvLT5wY2lfZGV2X3ApOworCQkJfQorCQkJcGNpX2Rldl9wdXQoaW5mby0+cGNpX2Rldl9wKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFuYWxvZyBpbnB1dCBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmFuZyA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOworCisJdW5zaWduZWQgbG9uZyBlbnRyeSA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJbG9uZyBsdmFsOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9pbnNuX3JlYWQoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJhbmcpIHsKKwljYXNlIDA6CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEludmFsaWQgcmFuZ2Ugc3BlY2lmaWVkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoYXJlZikgeworCWNhc2UgQVJFRl9HUk9VTkQ6CisJY2FzZSBBUkVGX0NPTU1PTjoKKwkJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5haS5jb3VudCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfCBjaGFuOworCQlicmVhazsKKworCWNhc2UgQVJFRl9ESUZGOgorCQlpZiAocmFuZyA9PSAwIHx8IHJhbmcgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogUmFuZ2UgbXVzdCBiZSBiaXBvbGFyIHdoZW4gYXJlZiA9IGRpZmZcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChjaGFuID49IHRoaXNib2FyZC0+YWkuZGlmZl9jb3VudCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwgfCBjaGFuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEludmFsaWQgYXJlZiBzcGVjaWZpZWRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfTEFTVF9FTlRSWTsKKworCS8qIENsZWFyIGNoYW5uZWwgbGlzdCwgZGF0YSBmaWZvIGFuZCBib3RoIHN0b3AgYml0cyAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyB8CisJCU1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QIHwgTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBTZXQgdGhlIGFjcXVpc2l0aW9uIG1vZGUgdG8gc2luZ2xlICovCisJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8yKTsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBFbmFibGUgY2hhbm5lbCBsaXN0IGFuZCBkYXRhIGZpZm8gKi8KKwl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogR2VuZXJhdGUgY2hhbm5lbCBsaXN0IGVudHJ5ICovCisJbWU0MDAwX291dGwoZGV2LCBlbnRyeSwgaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gbWF4aW11bSBzYW1wbGUgcmF0ZSAqLworCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0FJX01JTl9USUNLUywgaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyk7CisJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfQUlfTUlOX1RJQ0tTLAorCQlpbmZvLT5haV9jb250ZXh0LmNoYW5fcHJlX3RpbWVyX3JlZyk7CisKKwkvKiBTdGFydCBjb252ZXJzaW9uIGJ5IGR1bW15IHJlYWQgKi8KKwltZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5zdGFydF9yZWcpOworCisJLyogV2FpdCB1bnRpbCByZWFkeSAqLworCXVkZWxheSgxMCk7CisJaWYgKCEobWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuCisJCQkJc3RhdHVzX3JlZykgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IFZhbHVlIG5vdCBhdmFpbGFibGUgYWZ0ZXIgd2FpdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSBmaWZvICovCisJbHZhbCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmRhdGFfcmVnKSAmIDB4RkZGRjsKKwlkYXRhWzBdID0gbHZhbCBeIDB4ODAwMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FpX2NhbmNlbCgpXG4iKTsKKworCS8qIFN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogQ2xlYXIgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaV9jaGVja19jaGFubGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCWludCBhcmVmOworCWludCBpOworCisJQ0FMTF9QREVCVUcoIkluIGFpX2NoZWNrX2NoYW5saXN0KClcbiIpOworCisJLyogQ2hlY2sgd2hldGhlciBhIGNoYW5uZWwgbGlzdCBpcyBhdmFpbGFibGUgKi8KKwlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE5vIGNoYW5uZWwgbGlzdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhlIGNoYW5uZWwgbGlzdCBzaXplICovCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9DT1VOVCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBDaGFubmVsIGxpc3QgaXMgdG8gbGFyZ2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhlIHBvaW50ZXIgKi8KKwlpZiAoIWNtZC0+Y2hhbmxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogTlVMTCBwb2ludGVyIHRvIGNoYW5uZWwgbGlzdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIGFyZWYgaXMgZXF1YWwgZm9yIGFsbCBlbnRyaWVzICovCisJYXJlZiA9IENSX0FSRUYoY21kLT5jaGFubGlzdFswXSk7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJaWYgKENSX0FSRUYoY21kLT5jaGFubGlzdFtpXSkgIT0gYXJlZikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE1vZGUgaXMgbm90IGVxdWFsIGZvciBhbGwgZW50cmllc1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBjaGFubmVscyBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGVuZGluZyAqLworCWlmIChhcmVmID09IFNERl9ESUZGKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSA+PQorCQkJCXRoaXNib2FyZC0+YWkuZGlmZl9jb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBudW1iZXIgdG8gaGlnaFxuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgPj0gdGhpc2JvYXJkLT5haS5jb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBudW1iZXIgdG8gaGlnaFxuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiBiaXBvbGFyIGlzIHNldCBmb3IgYWxsIGVudHJpZXMgd2hlbiBpbiBkaWZmZXJlbnRpYWwgbW9kZSAqLworCWlmIChhcmVmID09IFNERl9ESUZGKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkgIT0gMSAmJgorCQkJCUNSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pICE9IDIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IEJpcG9sYXIgaXMgbm90IHNlbGVjdGVkIGluIGRpZmZlcmVudGlhbCBtb2RlXG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpX3JvdW5kX2NtZF9hcmdzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgKmluaXRfdGlja3MsCisJdW5zaWduZWQgaW50ICpzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgKmNoYW5fdGlja3MpCit7CisKKwlpbnQgcmVzdDsKKworCUNBTExfUERFQlVHKCJJbiBhaV9yb3VuZF9jbWRfYXJncygpXG4iKTsKKworCSppbml0X3RpY2tzID0gMDsKKwkqc2Nhbl90aWNrcyA9IDA7CisJKmNoYW5fdGlja3MgPSAwOworCisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJnKCk6IHN0YXJ0X2FyZyA9ICVkXG4iLCBjbWQtPnN0YXJ0X2FyZyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJnKCk6IHNjYW5fYmVnaW5fYXJnID0gJWRcbiIsCisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZygpOiBjb252ZXJ0X2FyZyA9ICVkXG4iLCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCWlmIChjbWQtPnN0YXJ0X2FyZykgeworCQkqaW5pdF90aWNrcyA9IChjbWQtPnN0YXJ0X2FyZyAqIDMzKSAvIDEwMDA7CisJCXJlc3QgPSAoY21kLT5zdGFydF9hcmcgKiAzMykgJSAxMDAwOworCisJCWlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9ORUFSRVNUKSB7CisJCQlpZiAocmVzdCA+IDMzKSB7CisJCQkJKCppbml0X3RpY2tzKSsrOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX1VQKSB7CisJCQlpZiAocmVzdCkKKwkJCQkoKmluaXRfdGlja3MpKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZykgeworCQkqc2Nhbl90aWNrcyA9IChjbWQtPnNjYW5fYmVnaW5fYXJnICogMzMpIC8gMTAwMDsKKwkJcmVzdCA9IChjbWQtPnNjYW5fYmVnaW5fYXJnICogMzMpICUgMTAwMDsKKworCQlpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTkVBUkVTVCkgeworCQkJaWYgKHJlc3QgPiAzMykgeworCQkJCSgqc2Nhbl90aWNrcykrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9VUCkgeworCQkJaWYgKHJlc3QpCisJCQkJKCpzY2FuX3RpY2tzKSsrOworCQl9CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9hcmcpIHsKKwkJKmNoYW5fdGlja3MgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMzKSAvIDEwMDA7CisJCXJlc3QgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMzKSAlIDEwMDA7CisKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX05FQVJFU1QpIHsKKwkJCWlmIChyZXN0ID4gMzMpIHsKKwkJCQkoKmNoYW5fdGlja3MpKys7CisJCQl9CisJCX0gZWxzZSBpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfVVApIHsKKwkJCWlmIChyZXN0KQorCQkJCSgqY2hhbl90aWNrcykrKzsKKwkJfQorCX0KKworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZ3MoKTogaW5pdF90aWNrcyA9ICVkXG4iLCAqaW5pdF90aWNrcyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJncygpOiBzY2FuX3RpY2tzID0gJWRcbiIsICpzY2FuX3RpY2tzKTsKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmdzKCk6IGNoYW5fdGlja3MgPSAlZFxuIiwgKmNoYW5fdGlja3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpX3dyaXRlX3RpbWVyKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGluaXRfdGlja3MsCisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKQoreworCisJQ0FMTF9QREVCVUcoIkluIGFpX3dyaXRlX3RpbWVyKClcbiIpOworCisJbWU0MDAwX291dGwoZGV2LCBpbml0X3RpY2tzIC0gMSwKKwkJaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisKKwlpZiAoc2Nhbl90aWNrcykgeworCQltZTQwMDBfb3V0bChkZXYsIHNjYW5fdGlja3MgLSAxLAorCQkJaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2xvd19yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwl9CisKKwltZTQwMDBfb3V0bChkZXYsIGNoYW5fdGlja3MgLSAxLCBpbmZvLT5haV9jb250ZXh0LmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJbWU0MDAwX291dGwoZGV2LCBjaGFuX3RpY2tzIC0gMSwgaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgYWlfcHJlcGFyZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQsCisJdW5zaWduZWQgaW50IGluaXRfdGlja3MsCisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKQoreworCisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIGFpX3ByZXBhcmUoKVxuIik7CisKKwkvKiBXcml0ZSB0aW1lciBhcmd1bWVudHMgKi8KKwlhaV93cml0ZV90aW1lcihkZXYsIGluaXRfdGlja3MsIHNjYW5fdGlja3MsIGNoYW5fdGlja3MpOworCisJLyogUmVzZXQgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIFN0YXJ0IHNvdXJjZXMgKi8KKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgfHwKKwkJKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpKSB7CisJCXRtcCA9IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMiB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMCB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9IGVsc2UgeworCQl0bXAgPSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9CisKKwkvKiBTdG9wIHRyaWdnZXJzICovCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQltZTQwMDBfb3V0bChkZXYsIGNtZC0+Y2hhbmxpc3RfbGVuICogY21kLT5zdG9wX2FyZywKKwkJCWluZm8tPmFpX2NvbnRleHQuc2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJROworCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgJiYKKwkJY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQltZTQwMDBfb3V0bChkZXYsIGNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJaW5mby0+YWlfY29udGV4dC5zYW1wbGVfY291bnRlcl9yZWcpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlE7CisJfSBlbHNlIHsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlE7CisJfQorCisJLyogV3JpdGUgdGhlIHNldHVwIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogV3JpdGUgdGhlIGNoYW5uZWwgbGlzdCAqLworCWFpX3dyaXRlX2NoYW5saXN0KGRldiwgcywgY21kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpX3dyaXRlX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXVuc2lnbmVkIGludCBjaGFuOworCXVuc2lnbmVkIGludCByYW5nOworCXVuc2lnbmVkIGludCBhcmVmOworCWludCBpOworCisJQ0FMTF9QREVCVUcoIkluIGFpX3dyaXRlX2NoYW5saXN0KClcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCXJhbmcgPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKKwkJYXJlZiA9IENSX0FSRUYoY21kLT5jaGFubGlzdFtpXSk7CisKKwkJZW50cnkgPSBjaGFuOworCisJCWlmIChyYW5nID09IDApIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJfSBlbHNlIGlmIChyYW5nID09IDEpIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQl9IGVsc2UgaWYgKHJhbmcgPT0gMikgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzU7CisJCX0gZWxzZSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworCQl9CisKKwkJaWYgKGFyZWYgPT0gU0RGX0RJRkYpIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwkJfSBlbHNlIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRDsKKwkJfQorCisJCW1lNDAwMF9vdXRsKGRldiwgZW50cnksIGluZm8tPmFpX2NvbnRleHQuY2hhbm5lbF9saXN0X3JlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpbml0X3RpY2tzID0gMDsKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrcyA9IDA7CisJdW5zaWduZWQgaW50IGNoYW5fdGlja3MgPSAwOworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9kb19jbWQoKVxuIik7CisKKwkvKiBSZXNldCB0aGUgYW5hbG9nIGlucHV0ICovCisJZXJyID0gbWU0MDAwX2FpX2NhbmNlbChkZXYsIHMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBSb3VuZCB0aGUgdGltZXIgYXJndW1lbnRzICovCisJZXJyID0gYWlfcm91bmRfY21kX2FyZ3MoZGV2LAorCQlzLCBjbWQsICZpbml0X3RpY2tzLCAmc2Nhbl90aWNrcywgJmNoYW5fdGlja3MpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBQcmVwYXJlIHRoZSBBSSBmb3IgYWNxdWlzaXRpb24gKi8KKwllcnIgPSBhaV9wcmVwYXJlKGRldiwgcywgY21kLCBpbml0X3RpY2tzLCBzY2FuX3RpY2tzLCBjaGFuX3RpY2tzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogU3RhcnQgYWNxdWlzdGlvbiBieSBkdW1teSByZWFkICovCisJbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuc3RhcnRfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKgorICogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6CisgKgorICogVGhlIGRlbW8gY21kLmMgaW4gLi9jb21lZGlsaWIvZGVtbyBzcGVjaWZpZXMgNiByZXR1cm4gdmFsdWVzOgorICogLSBzdWNjZXNzCisgKiAtIGludmFsaWQgc291cmNlCisgKiAtIHNvdXJjZSBjb25mbGljdAorICogLSBpbnZhbGlkIGFyZ3VtZW50CisgKiAtIGFyZ3VtZW50IGNvbmZsaWN0CisgKiAtIGludmFsaWQgY2hhbmxpc3QKKyAqIFNvIEkgdHJpZWQgdG8gYWRvcHQgdGhpcyBzY2hlbWUuCisgKi8KK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZF90ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrczsKKwl1bnNpZ25lZCBpbnQgY2hhbl90aWNrczsKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrczsKKwlpbnQgZXJyID0gMDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKVxuIik7CisKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdWJkZXYgICAgICAgICA9ICVkXG4iLCBjbWQtPnN1YmRldik7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogZmxhZ3MgICAgICAgICAgPSAlMDhYXG4iLCBjbWQtPmZsYWdzKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdGFydF9zcmMgICAgICA9ICUwOFhcbiIsCisJCWNtZC0+c3RhcnRfc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdGFydF9hcmcgICAgICA9ICVkXG4iLAorCQljbWQtPnN0YXJ0X2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc2Nhbl9iZWdpbl9zcmMgPSAlMDhYXG4iLAorCQljbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzY2FuX2JlZ2luX2FyZyA9ICVkXG4iLAorCQljbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBjb252ZXJ0X3NyYyAgICA9ICUwOFhcbiIsCisJCWNtZC0+Y29udmVydF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNvbnZlcnRfYXJnICAgID0gJWRcbiIsCisJCWNtZC0+Y29udmVydF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fZW5kX3NyYyAgID0gJTA4WFxuIiwKKwkJY21kLT5zY2FuX2VuZF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fZW5kX2FyZyAgID0gJWRcbiIsCisJCWNtZC0+c2Nhbl9lbmRfYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdG9wX3NyYyAgICAgICA9ICUwOFhcbiIsCisJCWNtZC0+c3RvcF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN0b3BfYXJnICAgICAgID0gJWRcbiIsIGNtZC0+c3RvcF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNoYW5saXN0ICAgICAgID0gJWRcbiIsCisJCSh1bnNpZ25lZCBpbnQpY21kLT5jaGFubGlzdCk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogY2hhbmxpc3RfbGVuICAgPSAlZFxuIiwKKwkJY21kLT5jaGFubGlzdF9sZW4pOworCisJLyogT25seSByb3VuZGluZyBmbGFncyBhcmUgaW1wbGVtZW50ZWQgKi8KKwljbWQtPmZsYWdzICY9IFRSSUdfUk9VTkRfTkVBUkVTVCB8IFRSSUdfUk9VTkRfVVAgfCBUUklHX1JPVU5EX0RPV047CisKKwkvKiBSb3VuZCB0aGUgdGltZXIgYXJndW1lbnRzICovCisJYWlfcm91bmRfY21kX2FyZ3MoZGV2LCBzLCBjbWQsICZpbml0X3RpY2tzLCAmc2Nhbl90aWNrcywgJmNoYW5fdGlja3MpOworCisJLyoKKwkgKiBTdGFnZSAxLiBDaGVjayBpZiB0aGUgdHJpZ2dlciBzb3VyY2VzIGFyZSBnZW5lcmFsbHkgdmFsaWQuCisJICovCisJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgeworCWNhc2UgVFJJR19OT1c6CisJY2FzZSBUUklHX0VYVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0YXJ0X3NyYyA9IFRSSUdfTk9XOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJY2FzZSBUUklHX0ZPTExPVzoKKwljYXNlIFRSSUdfVElNRVI6CisJY2FzZSBUUklHX0VYVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0ZPTExPVyB8IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gYmVnaW4gc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPSBUUklHX0ZPTExPVzsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgeworCWNhc2UgVFJJR19USU1FUjoKKwljYXNlIFRSSUdfRVhUOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+Y29udmVydF9zcmMgPSBUUklHX1RJTUVSOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPnNjYW5fZW5kX3NyYykgeworCWNhc2UgVFJJR19OT05FOgorCWNhc2UgVFJJR19DT1VOVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19OT05FIHwgVFJJR19DT1VOVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnNjYW5fZW5kX3NyYyA9IFRSSUdfTk9ORTsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19OT05FOgorCWNhc2UgVFJJR19DT1VOVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zdG9wX3NyYyAmPSBUUklHX05PTkUgfCBUUklHX0NPVU5UOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdG9wX3NyYyA9IFRSSUdfTk9ORTsKKwkJZXJyKys7CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBTdGFnZSAyLiBDaGVjayBmb3IgdHJpZ2dlciBzb3VyY2UgY29uZmxpY3RzLgorCSAqLworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RhcnRfc3JjID0gVFJJR19OT1c7CisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPSBUUklHX0ZPTExPVzsKKwkJY21kLT5jb252ZXJ0X3NyYyA9IFRSSUdfVElNRVI7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSAmJiBjbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX05PTkUpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX05PTkUpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FICYmCisJCWNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RvcF9zcmMgPSBUUklHX05PTkU7CisJCWNtZC0+c2Nhbl9lbmRfc3JjID0gVFJJR19OT05FOworCQllcnIrKzsKKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gMjsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDMuIENoZWNrIGlmIGFyZ3VtZW50cyBhcmUgZ2VuZXJhbGx5IHZhbGlkLgorCSAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IE5vIGNoYW5uZWwgbGlzdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPmNoYW5saXN0X2xlbiA9IDE7CisJCWVycisrOworCX0KKwlpZiAoaW5pdF90aWNrcyA8IDY2KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBTdGFydCBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsKKwkJZXJyKys7CisJfQorCWlmIChzY2FuX3RpY2tzICYmIHNjYW5fdGlja3MgPCA2NykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogU2NhbiBiZWdpbiBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAyMDMxOworCQllcnIrKzsKKwl9CisJaWYgKGNoYW5fdGlja3MgPCA2NikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogQ29udmVydCBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOworCQllcnIrKzsKKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gMzsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDQuIENoZWNrIGZvciBhcmd1bWVudCBjb25mbGljdHMuCisJICovCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChzY2FuX3RpY2tzIDw9IGNtZC0+Y2hhbmxpc3RfbGVuICogY2hhbl90aWNrcykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CS8vIEF0IGxlYXN0IG9uZSB0aWNrIG1vcmUKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChzY2FuX3RpY2tzIDw9IGNtZC0+Y2hhbmxpc3RfbGVuICogY2hhbl90aWNrcykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CS8vIEF0IGxlYXN0IG9uZSB0aWNrIG1vcmUKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJaWYgKGNtZC0+c3RvcF9hcmcgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0b3AgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdG9wX2FyZyA9IDE7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoY21kLT5zY2FuX2VuZF9hcmcgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDQ7CisJfQorCisJLyoKKwkgKiBTdGFnZSA1LiBDaGVjayB0aGUgY2hhbm5lbCBsaXN0LgorCSAqLworCWlmIChhaV9jaGVja19jaGFubGlzdChkZXYsIHMsIGNtZCkpCisJCXJldHVybiA1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQwMDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTX0FSRykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzOworCW1lNDAwMF9haV9jb250ZXh0X3QgKmFpX2NvbnRleHQgPSAmaW5mby0+YWlfY29udGV4dDsKKwlpbnQgaTsKKwlpbnQgYyA9IDA7CisJbG9uZyBsdmFsOworCisJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpIGlzIGV4ZWN1dGVkXG4iKTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCkgcHJlbWF0dXJlIGludGVycnVwdFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZXNldCBhbGwgZXZlbnRzICovCisJcy0+YXN5bmMtPmV2ZW50cyA9IDA7CisKKwkvKiBDaGVjayBpZiBpcnEgbnVtYmVyIGlzIHJpZ2h0ICovCisJaWYgKGlycSAhPSBhaV9jb250ZXh0LT5pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpcnEpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKG1lNDAwMF9pbmwoZGV2LAorCQkJYWlfY29udGV4dC0+CisJCQlpcnFfc3RhdHVzX3JlZykgJiBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJSVNSX1BERUJVRworCQkJKCJtZTQwMDBfYWlfaXNyKCk6IEZpZm8gaGFsZiBmdWxsIGludGVycnVwdCBvY2N1cmVkXG4iKTsKKworCQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGhhcHBlbmVkICovCisJCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJaWYgKCEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkgJiYKKwkJCSEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkgJiYKKwkJCSh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBGaWZvIGZ1bGxcbiIpOworCQkJYyA9IE1FNDAwMF9BSV9GSUZPX0NPVU5UOworCisJCQkvKiBGSUZPIG92ZXJmbG93LCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKKworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogRklGTyBvdmVyZmxvd1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJfSBlbHNlIGlmICgodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkKKwkJCSYmICEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkKKwkJCSYmICh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBGaWZvIGhhbGYgZnVsbFxuIik7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJCQljID0gTUU0MDAwX0FJX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogQ2FuJ3QgZGV0ZXJtaW5lIHN0YXRlIG9mIGZpZm9cbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljID0gMDsKKworCQkJLyogVW5kZWZpbmVkIHN0YXRlLCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKKworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogVW5kZWZpbmVkIEZJRk8gc3RhdGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCX0KKworCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IFRyeSB0byByZWFkICVkIHZhbHVlc1xuIiwgYyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGM7IGkrKykgeworCQkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgZmlmbyAqLworCQkJbHZhbCA9IGlubChhaV9jb250ZXh0LT5kYXRhX3JlZykgJiAweEZGRkY7CisJCQlsdmFsIF49IDB4ODAwMDsKKworCQkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgbHZhbCkpIHsKKwkJCQkvKiBCdWZmZXIgb3ZlcmZsb3csIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJCQkJCU1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBCdWZmZXIgb3ZlcmZsb3dcbiIsCisJCQkJCWRldi0+bWlub3IpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXb3JrIGlzIGRvbmUsIHNvIHJlc2V0IHRoZSBpbnRlcnJ1cHQgKi8KKwkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBSZXNldCBmaWZvIGhhbGYgZnVsbCBpbnRlcnJ1cHRcbiIpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCX0KKworCWlmIChtZTQwMDBfaW5sKGRldiwKKwkJCWFpX2NvbnRleHQtPgorCQkJaXJxX3N0YXR1c19yZWcpICYgTUU0MDAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCUlTUl9QREVCVUcKKwkJCSgibWU0MDAwX2FpX2lzcigpOiBTYW1wbGUgY291bnRlciBpbnRlcnJ1cHQgb2NjdXJlZFxuIik7CisKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0sgfCBDT01FRElfQ0JfRU9BOworCisJCS8qIEFjcXVpc2l0aW9uIGlzIGNvbXBsZXRlLCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJdG1wID0gbWU0MDAwX2lubChkZXYsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCS8qIFBvbGwgZGF0YSB1bnRpbCBmaWZvIGVtcHR5ICovCisJCXdoaWxlIChpbmwoYWlfY29udGV4dC0+Y3RybF9yZWcpICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkgeworCQkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgZmlmbyAqLworCQkJbHZhbCA9IGlubChhaV9jb250ZXh0LT5kYXRhX3JlZykgJiAweEZGRkY7CisJCQlsdmFsIF49IDB4ODAwMDsKKworCQkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgbHZhbCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogQnVmZmVyIG92ZXJmbG93XG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdvcmsgaXMgZG9uZSwgc28gcmVzZXQgdGhlIGludGVycnVwdCAqLworCQlJU1JfUERFQlVHCisJCQkoIm1lNDAwMF9haV9pc3IoKTogUmVzZXQgaW50ZXJydXB0IGZyb20gc2FtcGxlIGNvdW50ZXJcbiIpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCX0KKworCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogRXZlbnRzID0gMHglWFxuIiwgcy0+YXN5bmMtPmV2ZW50cyk7CisKKwlpZiAocy0+YXN5bmMtPmV2ZW50cykKKwkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQW5hbG9nIG91dHB1dCBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCByYW5nID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCWludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FvX2luc25fd3JpdGUoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5hby5jb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJhbmcgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIHJhbmdlICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmVmICE9IEFSRUZfR1JPVU5EICYmIGFyZWYgIT0gQVJFRl9DT01NT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBhcmVmICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKworCS8qIENsZWFyIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIHNldCB0byBzaW5nbGUgbW9kZSAqLworCW1lNDAwMF9vdXRsKGRldiwgMHgwLCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKworCS8qIFdyaXRlIGRhdGEgdmFsdWUgKi8KKwltZTQwMDBfb3V0bChkZXYsIGRhdGFbMF0sIGluZm8tPmFvX2NvbnRleHRbY2hhbl0uc2luZ2xlX3JlZyk7CisKKwkvKiBTdG9yZSBpbiB0aGUgbWlycm9yICovCisJaW5mby0+YW9fY29udGV4dFtjaGFuXS5taXJyb3IgPSBkYXRhWzBdOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50aygiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aFxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGFbMF0gPSBpbmZvLT5hb19jb250ZXh0W2NoYW5dLm1pcnJvcjsKKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERpZ2l0YWwgSS9PIHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGlvX2luc25fYml0cygpXG4iKTsKKworCS8qIExlbmd0aCBvZiBkYXRhIG11c3QgYmUgMiAobWFzayBhbmQgbmV3IGRhdGEsIHNlZSBiZWxvdykgKi8KKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5zbi0+biAhPSAyKSB7CisJCXByaW50aygiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2Rpb19pbnNuX2JpdHMoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRoZSBpbnNuIGRhdGEgY29uc2lzdHMgb2YgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0uIFRoZSBtYXNrIGRlZmluZXMgd2hpY2ggYml0cyB3ZSBhcmUgY29uY2VybmluZyBhYm91dC4KKwkgKiBUaGUgbmV3IGRhdGEgbXVzdCBiZSBhbmRlZCB3aXRoIHRoZSBtYXNrLgorCSAqIEVhY2ggY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIGJpdC4KKwkgKi8KKwlpZiAoZGF0YVswXSkgeworCQkvKiBDaGVjayBpZiByZXF1ZXN0ZWQgcG9ydHMgYXJlIGNvbmZpZ3VyZWQgZm9yIG91dHB1dCAqLworCQlpZiAoKHMtPmlvX2JpdHMgJiBkYXRhWzBdKSAhPSBkYXRhWzBdKQorCQkJcmV0dXJuIC1FSU87CisKKwkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJCXMtPnN0YXRlIHw9IGRhdGFbMF0gJiBkYXRhWzFdOworCisJCS8qIFdyaXRlIG91dCB0aGUgbmV3IGRpZ2l0YWwgb3V0cHV0IGxpbmVzICovCisJCW1lNDAwMF9vdXRsKGRldiwgKHMtPnN0YXRlID4+IDApICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMF9yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiA4KSAmIDB4RkYsCisJCQlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzFfcmVnKTsKKwkJbWU0MDAwX291dGwoZGV2LCAocy0+c3RhdGUgPj4gMTYpICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMl9yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiAyNCkgJiAweEZGLAorCQkJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8zX3JlZyk7CisJfQorCisJLyogT24gcmV0dXJuLCBkYXRhWzFdIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZgorCSAgIHRoZSBkaWdpdGFsIGlucHV0IGFuZCBvdXRwdXQgbGluZXMuICovCisJZGF0YVsxXSA9CisJCSgobWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LnBvcnRfMF9yZWcpICYgMHhGRikgPDwgMCkgfAorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzFfcmVnKSAmIDB4RkYpIDw8IDgpIHwKKwkJKChtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQucG9ydF8yX3JlZykgJiAweEZGKSA8PCAxNikgfAorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzNfcmVnKSAmIDB4RkYpIDw8IDI0KTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGlvX2luc25fY29uZmlnKClcbiIpOworCisJaWYgKGRhdGFbMF0gPT0gSU5TTl9DT05GSUdfRElPX1FVRVJZKSB7CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCX0KKworCS8qCisJICogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULgorCSAqIE9uIHRoZSBNRS00MDAwIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gc3dpdGNoIHBvcnQgd2lzZSAoOCBiaXQpCisJICovCisKKwl0bXAgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuY3RybF9yZWcpOworCisJaWYgKGRhdGFbMF0gPT0gQ09NRURJX09VVFBVVCkgeworCQlpZiAoY2hhbiA8IDgpIHsKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDE2KSB7CisJCQkvKgorCQkJICogQ2hlY2ggZm9yIG9wdG9pc29sYXRlZCBNRS00MDAwIHZlcnNpb24uIElmIG9uZSB0aGUgZmlyc3QKKwkJCSAqIHBvcnQgaXMgYSBmaXhlZCBvdXRwdXQgcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCisJCQkgKi8KKwkJCWlmICghbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpKQorCQkJCXJldHVybiAtRU5PREVWOworCisJCQlzLT5pb19iaXRzIHw9IDB4RkYwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMyk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzI7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDI0KSB7CisJCQlzLT5pb19iaXRzIHw9IDB4RkYwMDAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzQgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV81KTsKKwkJCXRtcCB8PSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNDsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMzIpIHsKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjAwMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNyk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzY7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjaGFuIDwgOCkgeworCQkJLyoKKwkJCSAqIENoZWNoIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLiBJZiBvbmUgdGhlIGZpcnN0CisJCQkgKiBwb3J0IGlzIGEgZml4ZWQgb3V0cHV0IHBvcnQgYW5kIHRoZSBzZWNvbmQgaXMgYSBmaXhlZCBpbnB1dCBwb3J0LgorCQkJICovCisJCQlpZiAoIW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDE2KSB7CisJCQlzLT5pb19iaXRzICY9IH4weEZGMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMiB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOworCQl9IGVsc2UgaWYgKGNoYW4gPCAyNCkgeworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjAwMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNCB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzUpOworCQl9IGVsc2UgaWYgKGNoYW4gPCAzMikgeworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjAwMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5kaW9fY29udGV4dC5jdHJsX3JlZyk7CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3VudGVyIHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjbnRfcmVzZXQoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisKKwlDQUxMX1BERUJVRygiSW4gY250X3Jlc2V0KClcbiIpOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSAwOgorCQltZTQwMDBfb3V0YihkZXYsIDB4MzAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltZTQwMDBfb3V0YihkZXYsIDB4NzAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZTQwMDBfb3V0YihkZXYsIDB4QjAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogY250X3Jlc2V0KCk6IEludmFsaWQgY2hhbm5lbFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbnRfY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCXVuc2lnbmVkIGludCBtb2RlKQoreworCWludCB0bXAgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIGNudF9jb25maWcoKVxuIik7CisKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIDA6CisJCXRtcCB8PSBNRTQwMDBfQ05UX0NPVU5URVJfMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9DT1VOVEVSXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfQ09VTlRFUl8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBjbnRfY29uZmlnKCk6IEludmFsaWQgY2hhbm5lbFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV8yOworCQlicmVhazsKKwljYXNlIDM6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV81OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBjbnRfY29uZmlnKCk6IEludmFsaWQgY291bnRlciBtb2RlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdyaXRlIHRoZSBjb250cm9sIHdvcmQgKi8KKwl0bXAgfD0gMHgzMDsKKwltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBlcnI7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpXG4iKTsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgR1BDVF9SRVNFVDoKKwkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGglZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gY250X3Jlc2V0KGRldiwgaW5zbi0+Y2hhbnNwZWMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBHUENUX1NFVF9PUEVSQVRJT046CisJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fY29uZmlnKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoJWRcbiIsCisJCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWVyciA9IGNudF9jb25maWcoZGV2LCBpbnNuLT5jaGFuc3BlYywgZGF0YVsxXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fY29uZmlnKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb25cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwl1bnNpZ25lZCBzaG9ydCB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2NudF9pbnNuX3JlYWQoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3JlYWQoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChpbnNuLT5jaGFuc3BlYykgeworCWNhc2UgMDoKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9yZWFkKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPmNoYW5zcGVjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpXG4iKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fd3JpdGUoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChpbnNuLT5jaGFuc3BlYykgeworCWNhc2UgMDoKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5jaGFuc3BlYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxOworfQorCitDT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9tZTQwMDAsIG1lNDAwMF9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmI4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgICAgbWU0MDAwLmgKKyAgICBSZWdpc3RlciBkZXNjcmlwdGlvbnMgYW5kIGRlZmluZXMgZm9yIHRoZSBNRS00MDAwIGJvYXJkIGZhbWlseQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC05IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX01FNDAwMF9IXworI2RlZmluZSBfTUU0MDAwX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVidWcgc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjdW5kZWYgTUU0MDAwX0NBTExfREVCVUcJLy8gRGVidWcgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQKKyN1bmRlZiBNRTQwMDBfUE9SVF9ERUJVRwkvLyBEZWJ1ZyBwb3J0IGFjY2VzcworI3VuZGVmIE1FNDAwMF9JU1JfREVCVUcJCS8vIERlYnVnIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisjdW5kZWYgTUU0MDAwX0RFQlVHCQkvLyBHZW5lcmFsIHB1cnBvc2UgZGVidWcgbWFzc2VnZXMKKworI2lmZGVmIE1FNDAwMF9DQUxMX0RFQlVHCisjdW5kZWYgQ0FMTF9QREVCVUcKKyNkZWZpbmUgQ0FMTF9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIENBTExfUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworI2lmZGVmIE1FNDAwMF9QT1JUX0RFQlVHCisjdW5kZWYgUE9SVF9QREVCVUcKKyNkZWZpbmUgUE9SVF9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgICMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBPUlRfUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworI2lmZGVmIE1FNDAwMF9JU1JfREVCVUcKKyN1bmRlZiBJU1JfUERFQlVHCisjZGVmaW5lIElTUl9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgICMjYXJncykKKyNlbHNlCisjZGVmaW5lIElTUl9QREVCVUcoZm10LCBhcmdzLi4uKQkvLyBubyBkZWJ1Z2dpbmcsIGRvIG5vdGhpbmcKKyNlbmRpZgorCisjaWZkZWYgTUU0MDAwX0RFQlVHCisjdW5kZWYgUERFQlVHCisjZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHImNvbWVkaSVkOiBtZTQwMDA6ICIgZm10LCBkZXYtPm1pbm9yLCAgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgdmVuZG9yIGFuZCBkZXZpY2UgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRUlMSEFVUyAweDE0MDIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MAkweDQ2NTAJLy8gTG93IENvc3QgdmVyc2lvbgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwCTB4NDY2MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSQkweDQ2NjEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MFMJMHg0NjYyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUwkweDQ2NjMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwCTB4NDY3MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSQkweDQ2NzEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MFMJMHg0NjcyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUwkweDQ2NzMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwCTB4NDY4MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSQkweDQ2ODEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MFMJMHg0NjgyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUwkweDQ2ODMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1FLTQwMDAgYmFzZSByZWdpc3RlciBvZmZzZXRzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX0NUUkxfUkVHCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX1NUQVRVU19SRUcJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDBfRklGT19SRUcJCQkweDA4CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDBfU0lOR0xFX1JFRwkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMF9USU1FUl9SRUcJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BT18wMV9DVFJMX1JFRwkJCTB4MTgJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMV9TVEFUVVNfUkVHCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FPXzAxX0ZJRk9fUkVHCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUcJCQkweDI0CS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDFfVElNRVJfUkVHCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTQwMDBfQU9fMDJfQ1RSTF9SRUcJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDJfU1RBVFVTX1JFRwkJCTB4MzQJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BT18wMl9GSUZPX1JFRwkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BT18wMl9TSU5HTEVfUkVHCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAyX1RJTUVSX1JFRwkJCTB4NDAJLy8gXy9XCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX0NUUkxfUkVHCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX1NUQVRVU19SRUcJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDNfRklGT19SRUcJCQkweDUwCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDNfU0lOR0xFX1JFRwkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wM19USU1FUl9SRUcJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX1JFRwkJCTB4NzQJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfUkVHCQkJMHg3NAkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9SRUcJCTB4NzgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9EQVRBX1JFRwkJCTB4N0MJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BSV9DSEFOX1RJTUVSX1JFRwkJMHg4MAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRwkJMHg4NAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRwkJMHg4OAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fVElNRVJfSElHSF9SRUcJCTB4OEMJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9MT1dfUkVHCTB4OTAJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9ISUdIX1JFRwkweDk0CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU1RBUlRfUkVHCQkJMHg5OAkvLyBSL18KKworI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19SRUcJCQkweDlDCS8vIFIvXworCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8wX1JFRwkJCTB4QTAJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8xX1JFRwkJCTB4QTQJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8yX1JFRwkJCTB4QTgJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8zX1JFRwkJCTB4QUMJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fRElSX1JFRwkJCTB4QjAJLy8gUi9XCisKKyNkZWZpbmUgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFgJCQkweEI0CS8vIFIvVworCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9SRUcJCQkweEI4CS8vIFIvVworCisjZGVmaW5lIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfUkVHCQkweEJDCS8vIC0vVworCisjZGVmaW5lIE1FNDAwMF9BSV9TQU1QTEVfQ09VTlRFUl9SRUcJCTB4QzAJLy8gXy9XCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVmFsdWUgdG8gYWRqdXN0IERlbXV4CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRSAgICAgICAgICAgIDB4NEMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3VudGVyIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8wX1JFRwkJMHgwMAorI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMV9SRUcJCTB4MDEKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzJfUkVHCQkweDAyCisjZGVmaW5lIE1FNDAwMF9DTlRfQ1RSTF9SRUcJCQkweDAzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUExYIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBMWF9JTlRDU1IJMHg0QwkvLyBJbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9JQ1IJCTB4NTAJLy8gSW5pdGlhbGl6YXRpb24gY29udHJvbCByZWdpc3RlcgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBQTFhfSUNTUiByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiAgICAgICAgICAgICAweDAxCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MICAgICAgICAgICAgMHgwMgkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9TVEFURSAgICAgICAgICAweDA0CS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgYWN0aXZlIChyL18pCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTiAgICAgICAgICAgICAweDA4CS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MICAgICAgICAgICAgMHgxMAkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSAgICAgICAgICAweDIwCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgYWN0aXZlICAoci9fKQorI2RlZmluZSBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gICAgICAgICAgICAgICAgMHg0MAkvLyBJZiBzZXQsIFBDSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX1NPRlRfSU5UICAgICAgICAgICAgICAgICAgMHg4MAkvLyBJZiBzZXQsIGEgc29mdHdhcmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCAoci93KQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBQTFhfSUNSIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NMT0NLX1NFVAkJMHgwMTAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fQ0hJUF9TRUxFQ1QJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1dSSVRFCQkweDA0MDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9SRUFECQkJMHgwODAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fVkFMSUQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBQTFhfSUNSX01BU0tfRUVQUk9NCQkJMHgxRjAwMDAwMAorCisjZGVmaW5lIEVFUFJPTV9ERUxBWQkJCQkxCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BT19DVFJMX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9NT0RFXzAJCTB4MDAxCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9NT0RFXzEJCTB4MDAyCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX01BU0tfTU9ERQkJMHgwMDMKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AJCQkweDAwNAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCTB4MDA4CisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRwkweDAxMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFCQkweDAyMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwODAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETwkJMHgxMDAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEJCTB4MjAwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEJCTB4NDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BT19TVEFUVVNfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfRlNNCQkweDAxCisjZGVmaW5lIE1FNDAwMF9BT19TVEFUVVNfQklUX0ZGCQkJMHgwMgorI2RlZmluZSBNRTQwMDBfQU9fU1RBVFVTX0JJVF9IRgkJCTB4MDQKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfRUYJCQkweDA4CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BSV9DVFJMX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzAJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8yCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQU1QTEVfSE9MRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTwkJMHgwMDAwMDA0MAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPCQkweDAwMDAwMDgwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9GVUxMU0NBTEUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX09GRlNFVAkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0cJMHgwMDAwMDQwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJRwkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX0lSUQkJMHgwMDAwMjAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUCQkweDAwMDA0MDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9MRV9JUlEJCTB4MDAwMDgwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRCQkweDAwMDIwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUCQkweDAwMTAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQk9USAkJMHg4MDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfQUlfU1RBVFVTX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0NIQU5ORUwJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfQ0hBTk5FTAkJMHgwMDgwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9DSEFOTkVMCQkweDAxMDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQQkJMHgwNDAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBCQkweDA4MDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0xFCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GU00JCTB4MjAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0lSUV9TVEFUVVNfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0VYCQkweDAxCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9MRQkJMHgwMgorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQUlfSEYJCTB4MDQKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzBfSEYJCTB4MDgKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzFfSEYJCTB4MTAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzJfSEYJCTB4MjAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzNfSEYJCTB4NDAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX1NDCQkweDgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9ESU9fQ1RSTF9SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMDAxCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xCQkweDAwMDIKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzIJCTB4MDAwNAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwMDA4CisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV80CQkweDAwMTAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzUJCTB4MDAyMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNgkJMHgwMDQwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV83CQkweDAwODAKKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAJCTB4MDEwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEJCTB4MDIwMAorCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAJCTB4MDQwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8xCQkweDA4MDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMgkJMHgxMDAwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzMJCTB4MjAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEluZm9ybWF0aW9uIGFib3V0IHRoZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FvX2luZm8geworCWludCBjb3VudDsKKwlpbnQgZmlmb19jb3VudDsKK30gbWU0MDAwX2FvX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FpX2luZm8geworCWludCBjb3VudDsKKwlpbnQgc2hfY291bnQ7CisJaW50IGRpZmZfY291bnQ7CisJaW50IGV4X3RyaWdfYW5hbG9nOworfSBtZTQwMDBfYWlfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfZGlvX2luZm8geworCWludCBjb3VudDsKK30gbWU0MDAwX2Rpb19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9jbnRfaW5mbyB7CisJaW50IGNvdW50OworfSBtZTQwMDBfY250X2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKKwltZTQwMDBfYW9faW5mb190IGFvOworCW1lNDAwMF9haV9pbmZvX3QgYWk7CisJbWU0MDAwX2Rpb19pbmZvX3QgZGlvOworCW1lNDAwMF9jbnRfaW5mb190IGNudDsKK30gbWU0MDAwX2JvYXJkX3Q7CisKKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3QgbWU0MDAwX2JvYXJkX3QgKilkZXYtPmJvYXJkX3B0cikKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBHbG9iYWwgYm9hcmQgYW5kIHN1YmRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBtaXJyb3I7CS8vIFN0b3JlIHRoZSBsYXN0IHdyaXR0ZW4gdmFsdWUKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgZmlmb19yZWc7CisJdW5zaWduZWQgbG9uZyBzaW5nbGVfcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBwcmVsb2FkX3JlZzsKK30gbWU0MDAwX2FvX2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FpX2NvbnRleHQgeworCWludCBpcnE7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5uZWxfbGlzdF9yZWc7CisJdW5zaWduZWQgbG9uZyBkYXRhX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbl9wcmVfdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl90aW1lcl9oaWdoX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fcHJlX3RpbWVyX2xvd19yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9oaWdoX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgc2FtcGxlX2NvdW50ZXJfcmVnOworfSBtZTQwMDBfYWlfY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfZGlvX2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgZGlyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8wX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfMV9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0XzJfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8zX3JlZzsKK30gbWU0MDAwX2Rpb19jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9jbnRfY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJfMF9yZWc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyXzFfcmVnOworCXVuc2lnbmVkIGxvbmcgY291bnRlcl8yX3JlZzsKK30gbWU0MDAwX2NudF9jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlOwkvLyBQTFggY29uZmlndXJhdGlvbiBzcGFjZSBiYXNlIGFkZHJlc3MKKwl1bnNpZ25lZCBsb25nIG1lNDAwMF9yZWdiYXNlOwkvLyBCYXNlIGFkZHJlc3Mgb2YgdGhlIE1FNDAwMAorCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnYmFzZTsJLy8gQmFzZSBhZGRyZXNzIG9mIHRoZSB0aW1lciBjaXJjdWl0CisJdW5zaWduZWQgbG9uZyBwcm9ncmFtX3JlZ2Jhc2U7CS8vIEJhc2UgYWRkcmVzcyB0byBzZXQgdGhlIHByb2dyYW0gcGluIGZvciB0aGUgeGlsaW54CisKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlX3NpemU7CS8vIFBMWCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIG1lNDAwMF9yZWdiYXNlX3NpemU7CS8vIE1FNDAwMCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZ2Jhc2Vfc2l6ZTsJLy8gVGltZXIgY2lyY3VpdCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIHByb2dyYW1fcmVnYmFzZV9zaXplOwkvLyBTaXplIG9mIHByb2dyYW0gYmFzZSBhZGRyZXNzIG9mIHRoZSBNRTQwMDAKKworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CS8vIFNlcmlhbCBudW1iZXIgb2YgdGhlIGJvYXJkCisJdW5zaWduZWQgY2hhciBod19yZXZpc2lvbjsJLy8gSGFyZHdhcmUgcmV2aXNpb24gb2YgdGhlIGJvYXJkCisJdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkOwkvLyBNZWlsaGF1cyB2ZW5kb3IgaWQKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CS8vIERldmljZSBpZAorCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcDsJLy8gR2VuZXJhbCBQQ0kgaW5mb3JtYXRpb24KKworCXVuc2lnbmVkIGludCBpcnE7CS8vIElSUSBhc3NpZ25lZCBmcm9tIHRoZSBQQ0kgQklPUworCisJc3RydWN0IG1lNDAwMF9haV9jb250ZXh0IGFpX2NvbnRleHQ7CS8vIEFuYWxvZyBpbnB1dCAgc3BlY2lmaWMgY29udGV4dAorCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCBhb19jb250ZXh0WzRdOwkvLyBWZWN0b3Igd2l0aCBhbmFsb2cgb3V0cHV0IHNwZWNpZmljIGNvbnRleHQKKwlzdHJ1Y3QgbWU0MDAwX2Rpb19jb250ZXh0IGRpb19jb250ZXh0OwkvLyBEaWdpdGFsIEkvTyBzcGVjaWZpYyBjb250ZXh0CisJc3RydWN0IG1lNDAwMF9jbnRfY29udGV4dCBjbnRfY29udGV4dDsJLy8gQ291bnRlciBzcGVjaWZpYyBjb250ZXh0Cit9IG1lNDAwMF9pbmZvX3Q7CisKKyNkZWZpbmUgaW5mbwkoKG1lNDAwMF9pbmZvX3QgKilkZXYtPnByaXZhdGUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVmaW5lcyBmb3IgYW5hbG9nIGlucHV0CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdlbmVyYWwgc3R1ZmYgKi8KKyNkZWZpbmUgTUU0MDAwX0FJX0ZJRk9fQ09VTlQJCQkyMDQ4CisKKyNkZWZpbmUgTUU0MDAwX0FJX01JTl9USUNLUwkJCTY2CisjZGVmaW5lIE1FNDAwMF9BSV9NSU5fU0FNUExFX1RJTUUJCTIwMDAJLy8gTWluaW11bSBzYW1wbGUgdGltZSBbbnNdCisjZGVmaW5lIE1FNDAwMF9BSV9CQVNFX0ZSRVFVRU5DWQkJKHVuc2lnbmVkIGludCkgMzNFNgorCisvKiBDaGFubmVsIGxpc3QgZGVmaW5lcyBhbmQgbWFza3MgKi8KKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9DT1VOVAkJMTAyNAorCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRAkweDAwMAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwJMHgwMjAKKworI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwCQkweDAwMAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNQkweDA0MAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMAkweDA4MAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzUJMHgwQzAKKworI2RlZmluZSBNRTQwMDBfQUlfTElTVF9MQVNUX0VOVFJZCQkweDEwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlZmluZXMgZm9yIGNvdW50ZXJzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzAgIDB4MDAKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzEgIDB4NDAKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzIgIDB4ODAKKworI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMCAgICAgMHgwMAkvLyBDaGFuZ2Ugc3RhdGUgaWYgemVybyBjcm9zc2luZworI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMSAgICAgMHgwMgkvLyBSZXRyaWdnZXJhYmxlIE9uZS1TaG90CisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8yICAgICAweDA0CS8vIEFzeW1tZXRyaWNhbCBkaXZpZGVyCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8zICAgICAweDA2CS8vIFN5bW1ldHJpY2FsIGRpdmlkZXIKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzQgICAgIDB4MDgJLy8gQ291bnRlciBzdGFydCBieSBzb2Z0d2FyZSB0cmlnZ2VyCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV81ICAgICAweDBBCS8vIENvdW50ZXIgc3RhcnQgYnkgaGFyZHdhcmUgdHJpZ2dlcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCkBAIC0wLDAgKzEsODQ1IEBACisvKgorCisgICBjb21lZGkvZHJpdmVycy9tZV9kYXEuYworCisgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE1laWxoYXVzIGRhdGEgYWNxdWlzaXRpb24gY2FyZHM6CisKKyAgICAgTUUtMjAwMGksIE1FLTI2MDBpLCBNRS0zMDAwdm0xCisKKyAgIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIEhpbGxtYW5uIDxoaWxsbWFubkBzeXNjb25ncm91cC5kZT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKK0RyaXZlcjogbWVfZGFxCitEZXNjcmlwdGlvbjogTWVpbGhhdXMgUENJIGRhdGEgYWNxdWlzaXRpb24gY2FyZHMKK0F1dGhvcjogTWljaGFlbCBIaWxsbWFubiA8aGlsbG1hbm5Ac3lzY29uZ3JvdXAuZGU+CitEZXZpY2VzOiBbTWVpbGhhdXNdIE1FLTI2MDBpIChtZV9kYXEpLCBNRS0yMDAwaQorU3RhdHVzOiBleHBlcmltZW50YWwKKworU3VwcG9ydHM6CisKKyAgICBBbmFsb2cgT3V0cHV0CisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKworICAgIFswXSAtIFBDSSBidXMgbnVtYmVyIChvcHRpb25hbCkKKyAgICBbMV0gLSBQQ0kgc2xvdCBudW1iZXIgKG9wdGlvbmFsKQorCisgICAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IGF2YWlsYWJsZSBQQ0kKKyAgICBkZXZpY2Ugd2lsbCBiZSB1c2VkLgorCitUaGUgMjYwMCByZXF1aXJlcyBhIGZpcm13YXJlIHVwbG9hZCwgd2hpY2ggY2FuIGJlIGFjY29tcGxpc2hlZAordXNpbmcgdGhlIC1pIG9yIC0taW5pdC1kYXRhIG9wdGlvbiBvZiBjb21lZGlfY29uZmlnLgorVGhlIGZpcm13YXJlIGNhbiBiZQorZm91bmQgaW4gdGhlIGNvbWVkaV9ub25mcmVlX2Zpcm13YXJlIHRhcmJhbGwgYXZhaWxhYmxlCitmcm9tIGh0dHA6Ly93d3cuY29tZWRpLm9yZworCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKy8qI2luY2x1ZGUgIm1lMjYwMF9mdy5oIiAqLworCisjZGVmaW5lIE1FX0RSSVZFUl9OQU1FCQkibWVfZGFxIgorCisjZGVmaW5lIE1FMjAwMF9ERVZJQ0VfSUQJMHgyMDAwCisjZGVmaW5lIE1FMjYwMF9ERVZJQ0VfSUQJMHgyNjAwCisKKyNkZWZpbmUgUExYX0lOVENTUgkJMHg0QwkvKiBQTFggaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBYSUxJTlhfRE9XTkxPQURfUkVTRVQJMHg0MgkvKiBYaWxpbnggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTUVfQ09OVFJPTF8xCQkJMHgwMDAwCS8qIC0gfCBXICovCisjZGVmaW5lICAgSU5URVJSVVBUX0VOQUJMRQkJKDE8PDE1KQorI2RlZmluZSAgIENPVU5URVJfQl9JUlEJCQkoMTw8MTIpCisjZGVmaW5lICAgQ09VTlRFUl9BX0lSUQkJCSgxPDwxMSkKKyNkZWZpbmUgICBDSEFOTElTVF9SRUFEWV9JUlEJCSgxPDwxMCkKKyNkZWZpbmUgICBFWFRfSVJRCQkJKDE8PDkpCisjZGVmaW5lICAgQURGSUZPX0hBTEZGVUxMX0lSUQkJKDE8PDgpCisjZGVmaW5lICAgU0NBTl9DT1VOVF9FTkFCTEUJCSgxPDw1KQorI2RlZmluZSAgIFNJTVVMVEFORU9VU19FTkFCTEUJCSgxPDw0KQorI2RlZmluZSAgIFRSSUdHRVJfRkFMTElOR19FREdFCQkoMTw8MykKKyNkZWZpbmUgICBDT05USU5VT1VTX01PREUJCSgxPDwyKQorI2RlZmluZSAgIERJU0FCTEVfQURDCQkJKDA8PDApCisjZGVmaW5lICAgU09GVFdBUkVfVFJJR0dFUkVEX0FEQwkoMTw8MCkKKyNkZWZpbmUgICBTQ0FOX1RSSUdHRVJFRF9BREMJCSgyPDwwKQorI2RlZmluZSAgIEVYVF9UUklHR0VSRURfQURDCQkoMzw8MCkKKyNkZWZpbmUgTUVfQURDX1NUQVJUCQkJMHgwMDAwCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX0NPTlRST0xfMgkJCTB4MDAwMgkvKiAtIHwgVyAqLworI2RlZmluZSAgIEVOQUJMRV9BREZJRk8JCQkoMTw8MTApCisjZGVmaW5lICAgRU5BQkxFX0NIQU5MSVNUCQkoMTw8OSkKKyNkZWZpbmUgICBFTkFCTEVfUE9SVF9CCQkJKDE8PDcpCisjZGVmaW5lICAgRU5BQkxFX1BPUlRfQQkJCSgxPDw2KQorI2RlZmluZSAgIEVOQUJMRV9DT1VOVEVSX0IJCSgxPDw0KQorI2RlZmluZSAgIEVOQUJMRV9DT1VOVEVSX0EJCSgxPDwzKQorI2RlZmluZSAgIEVOQUJMRV9EQUMJCQkoMTw8MSkKKyNkZWZpbmUgICBCVUZGRVJFRF9EQUMJCQkoMTw8MCkKKyNkZWZpbmUgTUVfREFDX1VQREFURQkJCTB4MDAwMgkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9TVEFUVVMJCQkweDAwMDQJLyogUiB8IC0gKi8KKyNkZWZpbmUgICBDT1VOVEVSX0JfSVJRX1BFTkRJTkcJCSgxPDwxMikKKyNkZWZpbmUgICBDT1VOVEVSX0FfSVJRX1BFTkRJTkcJCSgxPDwxMSkKKyNkZWZpbmUgICBDSEFOTElTVF9SRUFEWV9JUlFfUEVORElORwkoMTw8MTApCisjZGVmaW5lICAgRVhUX0lSUV9QRU5ESU5HCQkoMTw8OSkKKyNkZWZpbmUgICBBREZJRk9fSEFMRkZVTExfSVJRX1BFTkRJTkcJKDE8PDgpCisjZGVmaW5lICAgQURGSUZPX0ZVTEwJCQkoMTw8NCkKKyNkZWZpbmUgICBBREZJRk9fSEFMRkZVTEwJCSgxPDwzKQorI2RlZmluZSAgIEFERklGT19FTVBUWQkJCSgxPDwyKQorI2RlZmluZSAgIENIQU5MSVNUX0ZVTEwJCQkoMTw8MSkKKyNkZWZpbmUgICBGU1RfQUNUSVZFCQkJKDE8PDApCisjZGVmaW5lIE1FX1JFU0VUX0lOVEVSUlVQVAkJMHgwMDA0CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RJT19QT1JUX0EJCQkweDAwMDYJLyogUiB8IFcgKi8KKyNkZWZpbmUgTUVfRElPX1BPUlRfQgkJCTB4MDAwOAkvKiBSIHwgVyAqLworI2RlZmluZSBNRV9USU1FUl9EQVRBXzAJCQkweDAwMEEJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfVElNRVJfREFUQV8xCQkJMHgwMDBDCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX1RJTUVSX0RBVEFfMgkJCTB4MDAwRQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DSEFOTkVMX0xJU1QJCQkweDAwMTAJLyogLSB8IFcgKi8KKyNkZWZpbmUgICBBRENfVU5JUE9MQVIJCQkoMTw8NikKKyNkZWZpbmUgICBBRENfR0FJTl8wCQkJKDA8PDQpCisjZGVmaW5lICAgQURDX0dBSU5fMQkJCSgxPDw0KQorI2RlZmluZSAgIEFEQ19HQUlOXzIJCQkoMjw8NCkKKyNkZWZpbmUgICBBRENfR0FJTl8zCQkJKDM8PDQpCisjZGVmaW5lIE1FX1JFQURfQURfRklGTwkJCTB4MDAxMAkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9EQUNfQ09OVFJPTAkJCTB4MDAxMgkvKiAtIHwgVyAqLworI2RlZmluZSAgIERBQ19VTklQT0xBUl9ECQkoMDw8NCkKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9ECQkJKDE8PDQpCisjZGVmaW5lICAgREFDX1VOSVBPTEFSX0MJCSgwPDw1KQorI2RlZmluZSAgIERBQ19CSVBPTEFSX0MJCQkoMTw8NSkKKyNkZWZpbmUgICBEQUNfVU5JUE9MQVJfQgkJKDA8PDYpCisjZGVmaW5lICAgREFDX0JJUE9MQVJfQgkJCSgxPDw2KQorI2RlZmluZSAgIERBQ19VTklQT0xBUl9BCQkoMDw8NykKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9BCQkJKDE8PDcpCisjZGVmaW5lICAgREFDX0dBSU5fMF9ECQkJKDA8PDgpCisjZGVmaW5lICAgREFDX0dBSU5fMV9ECQkJKDE8PDgpCisjZGVmaW5lICAgREFDX0dBSU5fMF9DCQkJKDA8PDkpCisjZGVmaW5lICAgREFDX0dBSU5fMV9DCQkJKDE8PDkpCisjZGVmaW5lICAgREFDX0dBSU5fMF9CCQkJKDA8PDEwKQorI2RlZmluZSAgIERBQ19HQUlOXzFfQgkJCSgxPDwxMCkKKyNkZWZpbmUgICBEQUNfR0FJTl8wX0EJCQkoMDw8MTEpCisjZGVmaW5lICAgREFDX0dBSU5fMV9BCQkJKDE8PDExKQorI2RlZmluZSBNRV9EQUNfQ09OVFJPTF9VUERBVEUJCTB4MDAxMgkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9EQUNfREFUQV9BCQkJMHgwMDE0CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RBQ19EQVRBX0IJCQkweDAwMTYJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfREFDX0RBVEFfQwkJCTB4MDAxOAkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9EQUNfREFUQV9ECQkJMHgwMDFBCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfRU5EREFUQV9BCQkweDAwMUMJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9FTkREQVRBX0IJCTB4MDAxRQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX1NUQVJUREFUQV9BCQkweDAwMjAJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9WQUxVRV9BCQkweDAwMjAJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9TVEFSVERBVEFfQgkJMHgwMDIyCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfVkFMVUVfQgkJMHgwMDIyCS8qIFIgfCAtICovCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgbWVfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCBtZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWUyMDAwX2FpX3JhbmdlID0geworCTgsCisJeworCQlCSVBfUkFOR0UoMTApLAorCQlCSVBfUkFOR0UoNSksCisJCUJJUF9SQU5HRSgyLjUpLAorCQlCSVBfUkFOR0UoMS4yNSksCisJCVVOSV9SQU5HRSgxMCksCisJCVVOSV9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDIuNSksCisJCVVOSV9SQU5HRSgxLjI1KQorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lMjYwMF9haV9yYW5nZSA9IHsKKwk4LAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCQlCSVBfUkFOR0UoMi41KSwKKwkJCUJJUF9SQU5HRSgxLjI1KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlVTklfUkFOR0UoNSksCisJCQlVTklfUkFOR0UoMi41KSwKKwkJCVVOSV9SQU5HRSgxLjI1KQorCQl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTI2MDBfYW9fcmFuZ2UgPSB7CisJMywKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQkJVU5JX1JBTkdFKDEwKQorCQl9Cit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUobWVfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgTUUyNjAwX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIE1FMjAwMF9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCTB9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lX3BjaV90YWJsZSk7CisKKy8qIEJvYXJkIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgbWVfYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGRyaXZlciBuYW1lICovCisJaW50IGRldmljZV9pZDsKKwlpbnQgYW9fY2hhbm5lbF9uYnI7CS8qIERBIGNvbmZpZyAqLworCWludCBhb19yZXNvbHV0aW9uOworCWludCBhb19yZXNvbHV0aW9uX21hc2s7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfbGlzdDsKKwlpbnQgYWlfY2hhbm5lbF9uYnI7CS8qIEFEIGNvbmZpZyAqLworCWludCBhaV9yZXNvbHV0aW9uOworCWludCBhaV9yZXNvbHV0aW9uX21hc2s7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfbGlzdDsKKwlpbnQgZGlvX2NoYW5uZWxfbmJyOwkvKiBESU8gY29uZmlnICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lX2JvYXJkIG1lX2JvYXJkc1tdID0geworCXsKKwkJLyogLS0gTUUtMjYwMGkgLS0gKi8KKwkJLm5hbWUgPSAJCU1FX0RSSVZFUl9OQU1FLAorCQkuZGV2aWNlX2lkID0JCU1FMjYwMF9ERVZJQ0VfSUQsCisJCS8qIEFuYWxvZyBPdXRwdXQgKi8KKwkJLmFvX2NoYW5uZWxfbmJyID0JNCwKKwkJLmFvX3Jlc29sdXRpb24gPQkxMiwKKwkJLmFvX3Jlc29sdXRpb25fbWFzayA9CTB4MGZmZiwKKwkJLmFvX3JhbmdlX2xpc3QgPQkmbWUyNjAwX2FvX3JhbmdlLAorCQkuYWlfY2hhbm5lbF9uYnIgPQkxNiwKKwkJLyogQW5hbG9nIElucHV0ICovCisJCS5haV9yZXNvbHV0aW9uID0JMTIsCisJCS5haV9yZXNvbHV0aW9uX21hc2sgPQkweDBmZmYsCisJCS5haV9yYW5nZV9saXN0ID0JJm1lMjYwMF9haV9yYW5nZSwKKwkJLmRpb19jaGFubmVsX25iciA9CTMyLAorCQl9LAorCXsKKwkJLyogLS0gTUUtMjAwMGkgLS0gKi8KKwkJLm5hbWUgPQkJCU1FX0RSSVZFUl9OQU1FLAorCQkuZGV2aWNlX2lkID0JCU1FMjAwMF9ERVZJQ0VfSUQsCisJCS8qIEFuYWxvZyBPdXRwdXQgKi8KKwkJLmFvX2NoYW5uZWxfbmJyID0JMCwKKwkJLmFvX3Jlc29sdXRpb24gPQkwLAorCQkuYW9fcmVzb2x1dGlvbl9tYXNrID0JMCwKKwkJLmFvX3JhbmdlX2xpc3QgPQlOVUxMLAorCQkuYWlfY2hhbm5lbF9uYnIgPQkxNiwKKwkJLyogQW5hbG9nIElucHV0ICovCisJCS5haV9yZXNvbHV0aW9uID0JMTIsCisJCS5haV9yZXNvbHV0aW9uX21hc2sgPQkweDBmZmYsCisJCS5haV9yYW5nZV9saXN0ID0JJm1lMjAwMF9haV9yYW5nZSwKKwkJLmRpb19jaGFubmVsX25iciA9CTMyLAorCQl9Cit9OworCisjZGVmaW5lIG1lX2JvYXJkX25iciAoc2l6ZW9mKG1lX2JvYXJkcykvc2l6ZW9mKHN0cnVjdCBtZV9ib2FyZCkpCisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIG1lX2RyaXZlciA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CU1FX0RSSVZFUl9OQU1FLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJbWVfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQltZV9kZXRhY2gsCit9OworQ09NRURJX1BDSV9JTklUQ0xFQU5VUChtZV9kcml2ZXIsIG1lX3BjaV90YWJsZSk7CisKKy8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtZV9wcml2YXRlX2RhdGEgeworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOworCXZvaWQgX19pb21lbSAqcGx4X3JlZ2Jhc2U7CS8qIFBMWCBjb25maWd1cmF0aW9uIGJhc2UgYWRkcmVzcyAqLworCXZvaWQgX19pb21lbSAqbWVfcmVnYmFzZTsJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBNZWlsaGF1cyBjYXJkICovCisJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZV9zaXplOwkvKiBTaXplIG9mIFBMWCBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBtZV9yZWdiYXNlX3NpemU7CS8qIFNpemUgb2YgTWVpbGhhdXMgc3BhY2UgKi8KKworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xfMTsJLyogTWlycm9yIG9mIENPTlRST0xfMSByZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xfMjsJLyogTWlycm9yIG9mIENPTlRST0xfMiByZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0IGRhY19jb250cm9sOwkvKiBNaXJyb3Igb2YgdGhlIERBQ19DT05UUk9MIHJlZ2lzdGVyICovCisJaW50IGFvX3JlYWRiYWNrWzRdOwkvKiBNaXJyb3Igb2YgYW5hbG9nIG91dHB1dCBkYXRhICovCit9OworCisjZGVmaW5lIGRldl9wcml2YXRlICgoc3RydWN0IG1lX3ByaXZhdGVfZGF0YSAqKWRldi0+cHJpdmF0ZSkKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhlbHBmdWwgZnVuY3Rpb25zCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGVlcCh1bnNpZ25lZCBzZWMpCit7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChzZWMgKiBIWik7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBESUdJVEFMIElOUFVUL09VVFBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgbWVfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgYml0czsKKwlpbnQgbWFzayA9IDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBjYWxjdWxhdGUgcG9ydCAqLworCWlmIChtYXNrICYgMHgwMDAwZmZmZikgewkvKiBQb3J0IEEgaW4gdXNlICovCisJCWJpdHMgPSAweDAwMDBmZmZmOworCisJCS8qIEVuYWJsZSBQb3J0IEEgKi8KKwkJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfUE9SVF9BOworCQl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl9IGVsc2UgewkJLyogUG9ydCBCIGluIHVzZSAqLworCisJCWJpdHMgPSAweGZmZmYwMDAwOworCisJCS8qIEVuYWJsZSBQb3J0IEIgKi8KKwkJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfUE9SVF9COworCQl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl9CisKKwlpZiAoZGF0YVswXSkgeworCQkvKiBDb25maWcgcG9ydCBhcyBvdXRwdXQgKi8KKwkJcy0+aW9fYml0cyB8PSBiaXRzOworCX0gZWxzZSB7CisJCS8qIENvbmZpZyBwb3J0IGFzIGlucHV0ICovCisJCXMtPmlvX2JpdHMgJj0gfmJpdHM7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIERpZ2l0YWwgaW5zdGFudCBpbnB1dC9vdXRwdXRzICovCitzdGF0aWMgaW50IG1lX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGRhdGFbMF07CisJcy0+c3RhdGUgJj0gfm1hc2s7CisJcy0+c3RhdGUgfD0gKG1hc2sgJiBkYXRhWzFdKTsKKworCW1hc2sgJj0gcy0+aW9fYml0czsKKwlpZiAobWFzayAmIDB4MDAwMGZmZmYpIHsJLyogUG9ydCBBICovCisJCXdyaXRldygocy0+c3RhdGUgJiAweGZmZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9BKTsKKwl9IGVsc2UgeworCQlkYXRhWzFdICY9IH4weDAwMDBmZmZmOworCQlkYXRhWzFdIHw9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQSk7CisJfQorCisJaWYgKG1hc2sgJiAweGZmZmYwMDAwKSB7CS8qIFBvcnQgQiAqLworCQl3cml0ZXcoKChzLT5zdGF0ZSA+PiAxNikgJiAweGZmZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9CKTsKKwl9IGVsc2UgeworCQlkYXRhWzFdICY9IH4weGZmZmYwMDAwOworCQlkYXRhWzFdIHw9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQikgPDwgMTY7CisJfQorCisJcmV0dXJuIDI7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBTkFMT0cgSU5QVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIEFuYWxvZyBpbnN0YW50IGlucHV0ICovCitzdGF0aWMgaW50IG1lX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbMF0pOworCWludCByYW5nID0gQ1JfUkFOR0UoKCZpbnNuLT5jaGFuc3BlYylbMF0pOworCWludCBhcmVmID0gQ1JfQVJFRigoJmluc24tPmNoYW5zcGVjKVswXSk7CisJaW50IGk7CisKKwkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCisJLyogY2xlYXIgY2hhbmxpc3QgYW5kIGFkIGZpZm8gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yICY9IH4oRU5BQkxFX0FERklGTyB8IEVOQUJMRV9DSEFOTElTVCk7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKworCS8qIHJlc2V0IGFueSBwZW5kaW5nIGludGVycnVwdCAqLworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFU0VUX0lOVEVSUlVQVCk7CisKKwkvKiBlbmFibGUgdGhlIGNoYW5saXN0IGFuZCBBREMgZmlmbyAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gKEVOQUJMRV9BREZJRk8gfCBFTkFCTEVfQ0hBTkxJU1QpOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiB3cml0ZSB0byBjaGFubmVsIGxpc3QgZmlmbyAqLworCS8qIGIzOmIwIGFyZSB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwl2YWx1ZSA9IGNoYW4gJiAweDBmOworCS8qIGI1OmI0IGFyZSB0aGUgY2hhbm5lbCBnYWluICovCisJdmFsdWUgfD0gKHJhbmcgJiAweDAzKSA8PCA0OworCS8qIGI2IGNoYW5uZWwgcG9sYXJpdHkgKi8KKwl2YWx1ZSB8PSAocmFuZyAmIDB4MDQpIDw8IDQ7CisJLyogYjcgc2luZ2xlIG9yIGRpZmZlcmVudGlhbCAqLworCXZhbHVlIHw9ICgoYXJlZiAmIEFSRUZfRElGRikgPyAweDgwIDogMCk7CisJd3JpdGV3KHZhbHVlICYgMHhmZiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DSEFOTkVMX0xJU1QpOworCisJLyogc2V0IEFEQyBtb2RlIHRvIHNvZnR3YXJlIHRyaWdnZXIgKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xIHw9IFNPRlRXQVJFX1RSSUdHRVJFRF9BREM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzEsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKworCS8qIHN0YXJ0IGNvbnZlcnNpb24gYnkgcmVhZGluZyBmcm9tIEFEQ19TVEFSVCAqLworCXJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQURDX1NUQVJUKTsKKworCS8qIHdhaXQgZm9yIEFEQyBmaWZvIG5vdCBlbXB0eSBmbGFnICovCisJZm9yIChpID0gMTAwMDAwOyBpID4gMDsgaS0tKQorCQlpZiAoIShyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1NUQVRVUykgJiAweDAwMDQpKQorCQkJYnJlYWs7CisKKwkvKiBnZXQgdmFsdWUgZnJvbSBBREMgZmlmbyAqLworCWlmIChpKSB7CisJCWRhdGFbMF0gPQorCQkJKHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsKKwkJCQlNRV9SRUFEX0FEX0ZJRk8pIF4gMHg4MDApICYgMHgwRkZGOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IENhbm5vdCBnZXQgc2luZ2xlIHZhbHVlXG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhBUkRXQVJFIFRSSUdHRVJFRCBBTkFMT0cgSU5QVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIENhbmNlbCBhbmFsb2cgaW5wdXQgYXV0b3NjYW4gKi8KK3N0YXRpYyBpbnQgbWVfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGVzdCBhbmFsb2cgaW5wdXQgY29tbWFuZCAqLworc3RhdGljIGludCBtZV9haV9kb19jbWRfdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQW5hbG9nIGlucHV0IGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgbWVfYWlfZG9fY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCXJldHVybiAwOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQU5BTE9HIE9VVFBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogQW5hbG9nIGluc3RhbnQgb3V0cHV0ICovCitzdGF0aWMgaW50IG1lX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgY2hhbjsKKwlpbnQgcmFuZzsKKwlpbnQgaTsKKworCS8qIEVuYWJsZSBhbGwgREFDICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfREFDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiBhbmQgc2V0IERBQyB0byAiYnVmZmVyZWQiIG1vZGUgKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IEJVRkZFUkVEX0RBQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCisJLyogU2V0IGRhYy1jb250cm9sIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQljaGFuID0gQ1JfQ0hBTigoJmluc24tPmNoYW5zcGVjKVtpXSk7CisJCXJhbmcgPSBDUl9SQU5HRSgoJmluc24tPmNoYW5zcGVjKVtpXSk7CisKKwkJLyogY2xlYXIgYml0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCAmPSB+KDB4MDg4MCA+PiBjaGFuKTsKKwkJaWYgKHJhbmcgPT0gMCkKKwkJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCB8PQorCQkJCSgoREFDX0JJUE9MQVJfQSB8IERBQ19HQUlOXzFfQSkgPj4gY2hhbik7CisJCWVsc2UgaWYgKHJhbmcgPT0gMSkKKwkJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCB8PQorCQkJCSgoREFDX0JJUE9MQVJfQSB8IERBQ19HQUlOXzBfQSkgPj4gY2hhbik7CisJfQorCXdyaXRldyhkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wsCisJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX0NPTlRST0wpOworCisJLyogVXBkYXRlIGRhYy1jb250cm9sIHJlZ2lzdGVyICovCisJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfQ09OVFJPTF9VUERBVEUpOworCisJLyogU2V0IGRhdGEgcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWNoYW4gPSBDUl9DSEFOKCgmaW5zbi0+Y2hhbnNwZWMpW2ldKTsKKwkJd3JpdGV3KChkYXRhWzBdICYgcy0+bWF4ZGF0YSksCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19EQVRBX0EgKyAoY2hhbiA8PCAxKSk7CisJCWRldl9wcml2YXRlLT5hb19yZWFkYmFja1tjaGFuXSA9IChkYXRhWzBdICYgcy0+bWF4ZGF0YSk7CisJfQorCisJLyogVXBkYXRlIGRhYyB3aXRoIGRhdGEgcmVnaXN0ZXJzICovCisJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfVVBEQVRFKTsKKworCXJldHVybiBpOworfQorCisvKiBBbmFsb2cgb3V0cHV0IHJlYWRiYWNrICovCitzdGF0aWMgaW50IG1lX2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhdGFbaV0gPQorCQkJZGV2X3ByaXZhdGUtPmFvX3JlYWRiYWNrW0NSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbaV0pXTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElOSVRJQUxJU0FUSU9OIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBYaWxpbnggZmlybXdhcmUgZG93bmxvYWQgZm9yIGNhcmQ6IE1FLTI2MDBpICovCitzdGF0aWMgaW50IG1lMjYwMF94aWxpbnhfZG93bmxvYWQoY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgdW5zaWduZWQgY2hhciAqbWUyNjAwX2Zpcm13YXJlLAorCQkJCSAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IGZpbGVfbGVuZ3RoOworCXVuc2lnbmVkIGludCBpOworCisJLyogZGlzYWJsZSBpcnEncyBvbiBQTFggKi8KKwl3cml0ZWwoMHgwMCwgZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwkvKiBGaXJzdCwgbWFrZSBhIGR1bW15IHJlYWQgdG8gcmVzZXQgeGlsaW54ICovCisJdmFsdWUgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIFhJTElOWF9ET1dOTE9BRF9SRVNFVCk7CisKKwkvKiBXYWl0IHVudGlsIHJlc2V0IGlzIG92ZXIgKi8KKwlzbGVlcCgxKTsKKworCS8qIFdyaXRlIGEgZHVtbXkgdmFsdWUgdG8gWGlsaW54ICovCisJd3JpdGViKDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgMHgwKTsKKwlzbGVlcCgxKTsKKworCS8qCisJICogRm9ybWF0IG9mIHRoZSBmaXJtd2FyZQorCSAqIEJ1aWxkIGxvbmdzIGZyb20gdGhlIGJ5dGUtd2lzZSBjb2RlZCBoZWFkZXIKKwkgKiBCeXRlIDEtMzogICBsZW5ndGggb2YgdGhlIGFycmF5CisJICogQnl0ZSA0LTc6ICAgdmVyc2lvbgorCSAqIEJ5dGUgOC0xMTogIGRhdGUKKwkgKiBCeXRlIDEyLTE1OiByZXNlcnZlZAorCSAqLworCWlmIChsZW5ndGggPCAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZmlsZV9sZW5ndGggPSAoKCh1bnNpZ25lZCBpbnQpbWUyNjAwX2Zpcm13YXJlWzBdICYgMHhmZikgPDwgMjQpICsKKwkJICAgICAgKCgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVsxXSAmIDB4ZmYpIDw8IDE2KSArCisJCSAgICAgICgoKHVuc2lnbmVkIGludCltZTI2MDBfZmlybXdhcmVbMl0gJiAweGZmKSA8PCA4KSArCisJCSAgICAgICgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVszXSAmIDB4ZmYpOworCisJLyoKKwkgKiBMb29wIGZvciB3cml0aW5nIGZpcm13YXJlIGJ5dGUgYnkgYnl0ZSB0byB4aWxpbngKKwkgKiBGaXJtd2FyZSBkYXRhIHN0YXJ0IGF0IG9mZmZzZXQgMTYKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmlsZV9sZW5ndGg7IGkrKykKKwkJd3JpdGViKChtZTI2MDBfZmlybXdhcmVbMTYgKyBpXSAmIDB4ZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyAweDApOworCisJLyogV3JpdGUgNSBkdW1teSB2YWx1ZXMgdG8geGlsaW54ICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJd3JpdGViKDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgMHgwKTsKKworCS8qIFRlc3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBkb3dubG9hZCAtPiBJTlRCIHdhcyB0aHJvd24gKi8KKwl2YWx1ZSA9IHJlYWRsKGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCWlmICh2YWx1ZSAmIDB4MjApIHsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKDB4MDAsIGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBYaWxpbnggZG93bmxvYWQgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFdhaXQgdW50aWwgdGhlIFhpbGlueCBpcyByZWFkeSBmb3IgcmVhbCB3b3JrICovCisJc2xlZXAoMSk7CisKKwkvKiBFbmFibGUgUExYLUludGVycnVwdHMgKi8KKwl3cml0ZWwoMHg0MywgZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzZXQgZGV2aWNlICovCitzdGF0aWMgaW50IG1lX3Jlc2V0KGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiBSZXNldCBib2FyZCAqLworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9SRVNFVF9JTlRFUlJVUFQpOworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19DT05UUk9MKTsKKworCS8qIFNhdmUgdmFsdWVzIGluIHRoZSBib2FyZCBjb250ZXh0ICovCisJZGV2X3ByaXZhdGUtPmRhY19jb250cm9sID0gMDsKKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xID0gMDsKKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogQXR0YWNoCisgKgorICogLSBSZWdpc3RlciBQQ0kgZGV2aWNlCisgKiAtIERlY2xhcmUgZGV2aWNlIGRyaXZlciBjYXBhYmlsaXR5CisgKi8KK3N0YXRpYyBpbnQgbWVfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlOworCXN0cnVjdCBtZV9ib2FyZCAqYm9hcmQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBseF9yZWdiYXNlX3RtcDsKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlX3NpemVfdG1wOworCXJlc291cmNlX3NpemVfdCBtZV9yZWdiYXNlX3RtcDsKKwl1bnNpZ25lZCBsb25nIG1lX3JlZ2Jhc2Vfc2l6ZV90bXA7CisJcmVzb3VyY2Vfc2l6ZV90IHN3YXBfcmVnYmFzZV90bXA7CisJdW5zaWduZWQgbG9uZyBzd2FwX3JlZ2Jhc2Vfc2l6ZV90bXA7CisJcmVzb3VyY2Vfc2l6ZV90IHJlZ2Jhc2VfdG1wOworCWludCByZXN1bHQsIGVycm9yLCBpOworCisJLyogQWxsb2NhdGUgcHJpdmF0ZSBtZW1vcnkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgbWVfcHJpdmF0ZV9kYXRhKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuICovCisJZm9yIChwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaV9kZXZpY2UgIT0gTlVMTDsKKwkJcGNpX2RldmljZSA9CisJCXBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXZpY2UpKSB7CisJCWlmIChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUlMSEFVUykgeworCQkJZm9yIChpID0gMDsgaSA8IG1lX2JvYXJkX25icjsgaSsrKSB7CisJCQkJaWYgKG1lX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0KKwkJCQkJcGNpX2RldmljZS0+ZGV2aWNlKSB7CisJCQkJCS8qCisJCQkJCSAqIHdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPworCQkJCQkgKi8KKwkJCQkJaWYgKChpdC0+b3B0aW9uc1swXSAhPSAwKQorCQkJCQkJfHwgKGl0LT5vcHRpb25zWzFdICE9IDApKSB7CisJCQkJCQkvKgorCQkJCQkJICogYXJlIHdlIG9uIHRoZSB3cm9uZyBidXMvc2xvdD8KKwkJCQkJCSAqLworCQkJCQkJaWYgKHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMF0KKwkJCQkJCQl8fCBQQ0lfU0xPVChwY2lfZGV2aWNlLT4KKwkJCQkJCQkJZGV2Zm4pICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWRldi0+Ym9hcmRfcHRyID0gbWVfYm9hcmRzICsgaTsKKwkJCQkJYm9hcmQgPSAoc3RydWN0IG1lX2JvYXJkICopIGRldi0+CisJCQkJCQlib2FyZF9wdHI7CisJCQkJCWRldl9wcml2YXRlLT5wY2lfZGV2aWNlID0gcGNpX2RldmljZTsKKwkJCQkJZ290byBmb3VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCSAgICAgICBkZXYtPm1pbm9yLCBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCXJldHVybiAtRUlPOworCitmb3VuZDoKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogZm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwKKwkJZGV2LT5taW5vciwgbWVfYm9hcmRzW2ldLm5hbWUsCisJCXBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOworCisJLyogRW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgUENJIHJlZ2lvbnMgKi8KKwlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpX2RldmljZSwgTUVfRFJJVkVSX05BTUUpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kICIKKwkJICAgICAgICJyZXF1ZXN0IHJlZ2lvbnNcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTZXQgZGF0YSBpbiBkZXZpY2Ugc3RydWN0dXJlICovCisJZGV2LT5ib2FyZF9uYW1lID0gYm9hcmQtPm5hbWU7CisKKwkvKiBSZWFkIFBMWCByZWdpc3RlciBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzBdLiAqLworCXBseF9yZWdiYXNlX3RtcCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2aWNlLCAwKTsKKwlwbHhfcmVnYmFzZV9zaXplX3RtcCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgMCk7CisJZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlID0KKwkJaW9yZW1hcChwbHhfcmVnYmFzZV90bXAsIHBseF9yZWdiYXNlX3NpemVfdG1wKTsKKwlkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2Vfc2l6ZSA9IHBseF9yZWdiYXNlX3NpemVfdG1wOworCWlmICghZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlKSB7CisJCXByaW50aygiY29tZWRpJWQ6IEZhaWxlZCB0byByZW1hcCBJL08gbWVtb3J5XG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVhZCBTd2FwIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjNV0uICovCisKKwlzd2FwX3JlZ2Jhc2VfdG1wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIDUpOworCXN3YXBfcmVnYmFzZV9zaXplX3RtcCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgNSk7CisKKwlpZiAoIXN3YXBfcmVnYmFzZV90bXApCisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IFN3YXAgbm90IHByZXNlbnRcbiIsIGRldi0+bWlub3IpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdvcmthcm91bmQgc3RhcnQgLS0tKi8KKwlpZiAocGx4X3JlZ2Jhc2VfdG1wICYgMHgwMDgwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IFBMWC1CdWcgZGV0ZWN0ZWRcbiIsIGRldi0+bWlub3IpOworCisJCWlmIChzd2FwX3JlZ2Jhc2VfdG1wKSB7CisJCQlyZWdiYXNlX3RtcCA9IHBseF9yZWdiYXNlX3RtcDsKKwkJCXBseF9yZWdiYXNlX3RtcCA9IHN3YXBfcmVnYmFzZV90bXA7CisJCQlzd2FwX3JlZ2Jhc2VfdG1wID0gcmVnYmFzZV90bXA7CisKKwkJCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldmljZSwKKwkJCQlQQ0lfQkFTRV9BRERSRVNTXzAsIHBseF9yZWdiYXNlX3RtcCk7CisJCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2aWNlLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfNSwgc3dhcF9yZWdiYXNlX3RtcCk7CisJCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXBseF9yZWdiYXNlX3RtcCAtPSAweDgwOworCQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2aWNlLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfMCwgcGx4X3JlZ2Jhc2VfdG1wKTsKKwkJCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJfQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdvcmthcm91bmQgZW5kIC0tLS0tKi8KKworCS8qIFJlYWQgTWVpbGhhdXMgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMyXS4gKi8KKworCW1lX3JlZ2Jhc2VfdG1wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIDIpOworCW1lX3JlZ2Jhc2Vfc2l6ZV90bXAgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIDIpOworCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlX3NpemUgPSBtZV9yZWdiYXNlX3NpemVfdG1wOworCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlID0gaW9yZW1hcChtZV9yZWdiYXNlX3RtcCwgbWVfcmVnYmFzZV9zaXplX3RtcCk7CisJaWYgKCFkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIiwKKwkJICAgICAgIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogRG93bmxvYWQgZmlybXdhcmUgYW5kIHJlc2V0IGNhcmQgKi8KKwlpZiAoYm9hcmQtPmRldmljZV9pZCA9PSBNRTI2MDBfREVWSUNFX0lEKSB7CisJCXVuc2lnbmVkIGNoYXIgKmF1eF9kYXRhOworCQlpbnQgYXV4X2xlbjsKKworCQlhdXhfZGF0YSA9IGNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCk7CisJCWF1eF9sZW4gPSBpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdOworCisJCWlmICghYXV4X2RhdGEgfHwgYXV4X2xlbiA8IDEpIHsKKwkJCWNvbWVkaV9lcnJvcihkZXYsICJZb3UgbXVzdCBwcm92aWRlIG1lMjYwMCBmaXJtd2FyZSAiCisJCQkJICAgICAidXNpbmcgdGhlIC0taW5pdC1kYXRhIG9wdGlvbiBvZiAiCisJCQkJICAgICAiY29tZWRpX2NvbmZpZyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWUyNjAwX3hpbGlueF9kb3dubG9hZChkZXYsIGF1eF9kYXRhLCBhdXhfbGVuKTsKKwl9CisKKwltZV9yZXNldChkZXYpOworCisJLyogZGV2aWNlIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwllcnJvciA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzdWJkZXZpY2UgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXN1YmRldmljZS0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXN1YmRldmljZS0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9DTURfUkVBRDsKKwlzdWJkZXZpY2UtPm5fY2hhbiA9IGJvYXJkLT5haV9jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSBib2FyZC0+YWlfcmVzb2x1dGlvbl9tYXNrOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFpX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YWlfcmFuZ2VfbGlzdDsKKwlzdWJkZXZpY2UtPmNhbmNlbCA9IG1lX2FpX2NhbmNlbDsKKwlzdWJkZXZpY2UtPmluc25fcmVhZCA9IG1lX2FpX2luc25fcmVhZDsKKwlzdWJkZXZpY2UtPmRvX2NtZHRlc3QgPSBtZV9haV9kb19jbWRfdGVzdDsKKwlzdWJkZXZpY2UtPmRvX2NtZCA9IG1lX2FpX2RvX2NtZDsKKworCXN1YmRldmljZSA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJc3ViZGV2aWNlLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJc3ViZGV2aWNlLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFIHwgU0RGX0NPTU1PTjsKKwlzdWJkZXZpY2UtPm5fY2hhbiA9IGJvYXJkLT5hb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSBib2FyZC0+YW9fcmVzb2x1dGlvbl9tYXNrOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFvX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YW9fcmFuZ2VfbGlzdDsKKwlzdWJkZXZpY2UtPmluc25fcmVhZCA9IG1lX2FvX2luc25fcmVhZDsKKwlzdWJkZXZpY2UtPmluc25fd3JpdGUgPSBtZV9hb19pbnNuX3dyaXRlOworCisJc3ViZGV2aWNlID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwlzdWJkZXZpY2UtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJc3ViZGV2aWNlLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEVBQkxFOworCXN1YmRldmljZS0+bl9jaGFuID0gYm9hcmQtPmRpb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSAxOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmRpb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJc3ViZGV2aWNlLT5pbnNuX2JpdHMgPSBtZV9kaW9faW5zbl9iaXRzOworCXN1YmRldmljZS0+aW5zbl9jb25maWcgPSBtZV9kaW9faW5zbl9jb25maWc7CisJc3ViZGV2aWNlLT5pb19iaXRzID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiTUVfRFJJVkVSX05BTUUiIGF0dGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIERldGFjaCAqLworc3RhdGljIGludCBtZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCWlmIChkZXZfcHJpdmF0ZSkgeworCQlpZiAoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UpIHsKKwkJCW1lX3Jlc2V0KGRldik7CisJCQlpb3VubWFwKGRldl9wcml2YXRlLT5tZV9yZWdiYXNlKTsKKwkJfQorCQlpZiAoZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlKQorCQkJaW91bm1hcChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UpOworCQlpZiAoZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UpIHsKKwkJCWlmIChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2Vfc2l6ZSkKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UpOworCisJCQlwY2lfZGV2X3B1dChkZXZfcHJpdmF0ZS0+cGNpX2RldmljZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M1Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9taXRlLmMKKyAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE5JIE1pdGUgUENJIGludGVyZmFjZSBjaGlwCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKKwlUaGUgUENJLU1JTyBFIHNlcmllcyBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorCVRvbWFzeiBNb3R5bGV3c2tpIDwuLi4+LCBhbmQgcG9ydGVkIHRvIGNvbWVkaSBieSBkcy4KKworCVJlZmVyZW5jZXMgZm9yIHNwZWNpZmljYXRpb25zOgorCisJICAgMzIxNzQ3Yi5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChvYnNvbGV0ZSkKKwkgICAzMjE3NDdjLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG5ldykKKwkgICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKKworCU90aGVyIHBvc3NpYmx5IHJlbGV2YW50IGluZm86CisKKwkgICAzMjA1MTdjLnBkZiAgVXNlciBtYW51YWwgKG9ic29sZXRlKQorCSAgIDMyMDUxN2YucGRmICBVc2VyIG1hbnVhbCAobmV3KQorCSAgIDMyMDg4OWEucGRmICBkZWxldGUKKwkgICAzMjA5MDZjLnBkZiAgbWF4aW11bSBzaWduYWwgcmF0aW5ncworCSAgIDMyMTA2NmEucGRmICBhYm91dCAxNngKKwkgICAzMjE3OTFhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmUtMTAgcmV2LiBjCisJICAgMzIxODA4YS5wZGYgIGFib3V0IGF0LW1pby0xNmUtMTAgcmV2IFAKKwkgICAzMjE4MzdhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmRlLTEwIHJldiBkCisJICAgMzIxODM4YS5wZGYgIGFib3V0IGF0LW1pby0xNmRlLTEwIHJldiBOCisKKwlJU1NVRVM6CisKKyovCisKKy8vI2RlZmluZSBVU0VfS01BTExPQworCisjaW5jbHVkZSAibWl0ZS5oIgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFBDSV9NSVRFX1NJWkUJCTQwOTYKKyNkZWZpbmUgUENJX0RBUV9TSVpFCQk0MDk2CisjZGVmaW5lIFBDSV9EQVFfU0laRV82NjBYICAgICAgIDgxOTIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGVfZGV2aWNlcyA9IE5VTEw7CisKKyNkZWZpbmUgVE9QX09GX1BBR0UoeCkgKCh4KXwofihQQUdFX01BU0spKSkKKwordm9pZCBtaXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZTsKKworCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05BVElOU1QpIHsKKwkJCXVuc2lnbmVkIGk7CisKKwkJCW1pdGUgPSBremFsbG9jKHNpemVvZigqbWl0ZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFtaXRlKSB7CisJCQkJcHJpbnRrKCJtaXRlOiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlzcGluX2xvY2tfaW5pdCgmbWl0ZS0+bG9jayk7CisJCQltaXRlLT5wY2lkZXYgPSBwY2lfZGV2X2dldChwY2lkZXYpOworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9NSVRFX0RNQV9DSEFOTkVMUzsgKytpKSB7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0ubWl0ZSA9IG1pdGU7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0uY2hhbm5lbCA9IGk7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0uZG9uZSA9IDE7CisJCQl9CisJCQltaXRlLT5uZXh0ID0gbWl0ZV9kZXZpY2VzOworCQkJbWl0ZV9kZXZpY2VzID0gbWl0ZTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9jaGlwX3NpZ25hdHVyZSh1MzIgY3NpZ3JfYml0cykKK3sKKwlwcmludGsoIm1pdGU6IHZlcnNpb24gPSAlaSwgdHlwZSA9ICVpLCBtaXRlIG1vZGUgPSAlaSwgaW50ZXJmYWNlIG1vZGUgPSAlaVxuIiwgbWl0ZV9jc2lncl92ZXJzaW9uKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3R5cGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfbW1vZGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW1vZGUoY3NpZ3JfYml0cykpOworCXByaW50aygibWl0ZTogbnVtIGNoYW5uZWxzID0gJWksIHdyaXRlIHBvc3QgZmlmbyBkZXB0aCA9ICVpLCB3aW5zID0gJWksIGlvd2lucyA9ICVpXG4iLCBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd3BkZXAoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd2lucyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pb3dpbnMoY3NpZ3JfYml0cykpOworfQorCit1bnNpZ25lZCBtaXRlX2ZpZm9fc2l6ZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKiBtaXRlLCB1bnNpZ25lZCBjaGFubmVsKQoreworCXVuc2lnbmVkIGZjcl9iaXRzID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsKKwkJTUlURV9GQ1IoY2hhbm5lbCkpOworCXVuc2lnbmVkIGVtcHR5X2NvdW50ID0gKGZjcl9iaXRzID4+IDE2KSAmIDB4ZmY7CisJdW5zaWduZWQgZnVsbF9jb3VudCA9IGZjcl9iaXRzICYgMHhmZjsKKwlyZXR1cm4gZW1wdHlfY291bnQgKyBmdWxsX2NvdW50OworfQorCitpbnQgbWl0ZV9zZXR1cDIoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCB1c2VfaW9kd2Jzcl8xKQoreworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCXJlc291cmNlX3NpemVfdCBhZGRyOworCWludCBpOworCXUzMiBjc2lncl9iaXRzOworCXVuc2lnbmVkIHVua25vd25fZG1hX2J1cnN0X2JpdHM7CisKKwlpZiAoY29tZWRpX3BjaV9lbmFibGUobWl0ZS0+cGNpZGV2LCAibWl0ZSIpKSB7CisJCXByaW50aygiZXJyb3IgZW5hYmxpbmcgbWl0ZSBhbmQgcmVxdWVzdGluZyBpbyByZWdpb25zXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKG1pdGUtPnBjaWRldik7CisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1pdGUtPnBjaWRldiwgMCk7CisJbWl0ZS0+bWl0ZV9waHlzX2FkZHIgPSBhZGRyOworCW1pdGUtPm1pdGVfaW9fYWRkciA9IGlvcmVtYXAoYWRkciwgUENJX01JVEVfU0laRSk7CisJaWYgKCFtaXRlLT5taXRlX2lvX2FkZHIpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgbWl0ZSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcmludGsoIk1JVEU6MHglMDhsbHggbWFwcGVkIHRvICVwICIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWl0ZS0+bWl0ZV9waHlzX2FkZHIsIG1pdGUtPm1pdGVfaW9fYWRkcik7CisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1pdGUtPnBjaWRldiwgMSk7CisJbWl0ZS0+ZGFxX3BoeXNfYWRkciA9IGFkZHI7CisJbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihtaXRlLT5wY2lkZXYsIDEpOworCS8vIEluIGNhc2Ugb2YgYSA2NjB4IGJvYXJkLCBEQVEgc2l6ZSBpcyA4ayBpbnN0ZWFkIG9mIDRrIChzZWUgYXMgc2hvd24gYnkgbHNwY2kgb3V0cHV0KQorCW1pdGUtPmRhcV9pb19hZGRyID0gaW9yZW1hcChtaXRlLT5kYXFfcGh5c19hZGRyLCBsZW5ndGgpOworCWlmICghbWl0ZS0+ZGFxX2lvX2FkZHIpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgZGFxIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaW50aygiREFROjB4JTA4bGx4IG1hcHBlZCB0byAlcFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyltaXRlLT5kYXFfcGh5c19hZGRyLCBtaXRlLT5kYXFfaW9fYWRkcik7CisKKwlpZiAodXNlX2lvZHdic3JfMSkgeworCQl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSKTsKKwkJcHJpbnRrKCJtaXRlOiB1c2luZyBJL08gV2luZG93IEJhc2UgU2l6ZSByZWdpc3RlciAxXG4iKTsKKwkJd3JpdGVsKG1pdGUtPgorCQkJZGFxX3BoeXNfYWRkciB8IFdFTkFCIHwKKwkJCU1JVEVfSU9EV0JTUl8xX1dTSVpFX2JpdHMobGVuZ3RoKSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUl8xKTsKKwkJd3JpdGVsKDAsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0NSXzEpOworCX0gZWxzZSB7CisJCXdyaXRlbChtaXRlLT5kYXFfcGh5c19hZGRyIHwgV0VOQUIsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1IpOworCX0KKwkvKiBtYWtlIHN1cmUgZG1hIGJ1cnN0cyB3b3JrLiAgSSBnb3QgdGhpcyBmcm9tIHJ1bm5pbmcgYSBidXMgYW5hbHl6ZXIKKwkgICBvbiBhIHB4aS02MjgxIGFuZCBhIHB4aS02NzEzLiAgNjcxMyBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUKKwkgICBvZiAweDYxZiBhbmQgYnVyc3RzIHdvcmtlZC4gIDYyODEgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlIG9mCisJICAgMHgxZiBhbmQgYnVyc3RzIGRpZG4ndCB3b3JrLiAgVGhlIE5JIHdpbmRvd3MgZHJpdmVyIHJlYWRzIHRoZSByZWdpc3RlciwKKwkgICB0aGVuIGRvZXMgYSBiaXR3aXNlLW9yIG9mIDB4NjAwIHdpdGggaXQgYW5kIHdyaXRlcyBpdCBiYWNrLgorCSAqLworCXVua25vd25fZG1hX2J1cnN0X2JpdHMgPQorCQlyZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyk7CisJdW5rbm93bl9kbWFfYnVyc3RfYml0cyB8PSBVTktOT1dOX0RNQV9CVVJTVF9FTkFCTEVfQklUUzsKKwl3cml0ZWwodW5rbm93bl9kbWFfYnVyc3RfYml0cywKKwkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcpOworCisJY3NpZ3JfYml0cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ1NJR1IpOworCW1pdGUtPm51bV9jaGFubmVscyA9IG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKTsKKwlpZiAobWl0ZS0+bnVtX2NoYW5uZWxzID4gTUFYX01JVEVfRE1BX0NIQU5ORUxTKSB7CisJCXByaW50aygibWl0ZTogYnVnPyBjaGlwIGNsYWltcyB0byBoYXZlICVpIGRtYSBjaGFubmVscy4gIFNldHRpbmcgdG8gJWkuXG4iLCBtaXRlLT5udW1fY2hhbm5lbHMsIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyk7CisJCW1pdGUtPm51bV9jaGFubmVscyA9IE1BWF9NSVRFX0RNQV9DSEFOTkVMUzsKKwl9CisJZHVtcF9jaGlwX3NpZ25hdHVyZShjc2lncl9iaXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWl0ZS0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJd3JpdGVsKENIT1JfRE1BUkVTRVQsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihpKSk7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQl3cml0ZWwoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfCBDSENSX0NMUl9TQVJfSUUgfAorCQkJQ0hDUl9DTFJfRE9ORV9JRSB8IENIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKKwkJCUNIQ1JfQ0xSX0xDX0lFIHwgQ0hDUl9DTFJfQ09OVF9SQl9JRSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihpKSk7CisJfQorCW1pdGUtPmZpZm9fc2l6ZSA9IG1pdGVfZmlmb19zaXplKG1pdGUsIDApOworCXByaW50aygibWl0ZTogZmlmbyBzaXplIGlzICVpLlxuIiwgbWl0ZS0+Zmlmb19zaXplKTsKKwltaXRlLT51c2VkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgbWl0ZV9zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJcmV0dXJuIG1pdGVfc2V0dXAyKG1pdGUsIDApOworfQorCit2b2lkIG1pdGVfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgKm5leHQ7CisKKwlmb3IgKG1pdGUgPSBtaXRlX2RldmljZXM7IG1pdGU7IG1pdGUgPSBuZXh0KSB7CisJCXBjaV9kZXZfcHV0KG1pdGUtPnBjaWRldik7CisJCW5leHQgPSBtaXRlLT5uZXh0OworCQlrZnJlZShtaXRlKTsKKwl9Cit9CisKK3ZvaWQgbWl0ZV91bnNldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwkvL3Vuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGFydCwgbGVuZ3RoOworCisJaWYgKCFtaXRlKQorCQlyZXR1cm47CisKKwlpZiAobWl0ZS0+bWl0ZV9pb19hZGRyKSB7CisJCWlvdW5tYXAobWl0ZS0+bWl0ZV9pb19hZGRyKTsKKwkJbWl0ZS0+bWl0ZV9pb19hZGRyID0gTlVMTDsKKwl9CisJaWYgKG1pdGUtPmRhcV9pb19hZGRyKSB7CisJCWlvdW5tYXAobWl0ZS0+ZGFxX2lvX2FkZHIpOworCQltaXRlLT5kYXFfaW9fYWRkciA9IE5VTEw7CisJfQorCWlmIChtaXRlLT5taXRlX3BoeXNfYWRkcikgeworCQljb21lZGlfcGNpX2Rpc2FibGUobWl0ZS0+cGNpZGV2KTsKKwkJbWl0ZS0+bWl0ZV9waHlzX2FkZHIgPSAwOworCX0KKworCW1pdGUtPnVzZWQgPSAwOworfQorCit2b2lkIG1pdGVfbGlzdF9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCAqbmV4dDsKKworCXByaW50aygiQXZhaWxhYmxlIE5JIGRldmljZSBJRHM6Iik7CisJaWYgKG1pdGVfZGV2aWNlcykKKwkJZm9yIChtaXRlID0gbWl0ZV9kZXZpY2VzOyBtaXRlOyBtaXRlID0gbmV4dCkgeworCQkJbmV4dCA9IG1pdGUtPm5leHQ7CisJCQlwcmludGsoIiAweCUwNHgiLCBtaXRlX2RldmljZV9pZChtaXRlKSk7CisJCQlpZiAobWl0ZS0+dXNlZCkKKwkJCQlwcmludGsoIih1c2VkKSIpOworCQl9CisJcHJpbnRrKCJcbiIpOworCit9CisKK3N0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLCB1bnNpZ25lZCBtaW5fY2hhbm5lbCwKKwl1bnNpZ25lZCBtYXhfY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaXRlX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCisJLy8gc3BpbiBsb2NrIHNvIG1pdGVfcmVsZWFzZV9jaGFubmVsIGNhbiBiZSBjYWxsZWQgc2FmZWx5IGZyb20gaW50ZXJydXB0cworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IG1pbl9jaGFubmVsOyBpIDw9IG1heF9jaGFubmVsOyArK2kpIHsKKwkJaWYgKG1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW2ldID09IDApIHsKKwkJCW1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW2ldID0gMTsKKwkJCWNoYW5uZWwgPSAmbWl0ZS0+Y2hhbm5lbHNbaV07CisJCQljaGFubmVsLT5yaW5nID0gcmluZzsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5uZWw7Cit9CisKK3ZvaWQgbWl0ZV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8gc3BpbiBsb2NrIHRvIHByZXZlbnQgcmFjZXMgd2l0aCBtaXRlX3JlcXVlc3RfY2hhbm5lbAorCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCWlmIChtaXRlLT5jaGFubmVsX2FsbG9jYXRlZFttaXRlX2NoYW4tPmNoYW5uZWxdKSB7CisJCW1pdGVfZG1hX2Rpc2FybShtaXRlX2NoYW4pOworCQltaXRlX2RtYV9yZXNldChtaXRlX2NoYW4pOworLyogZGlzYWJsZSBhbGwgY2hhbm5lbCdzIGludGVycnVwdHMgKGRvIGl0IGFmdGVyIGRpc2FybS9yZXNldCBzbworTUlURV9DSENSIHJlZyBpc24ndCBjaGFuZ2VkIHdoaWxlIGRtYSBpcyBzdGlsbCBhY3RpdmUhKSAqLworCQl3cml0ZWwoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfAorCQkJQ0hDUl9DTFJfU0FSX0lFIHwgQ0hDUl9DTFJfRE9ORV9JRSB8CisJCQlDSENSX0NMUl9NUkRZX0lFIHwgQ0hDUl9DTFJfRFJEWV9JRSB8CisJCQlDSENSX0NMUl9MQ19JRSB8IENIQ1JfQ0xSX0NPTlRfUkJfSUUsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJCW1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW21pdGVfY2hhbi0+Y2hhbm5lbF0gPSAwOworCQltaXRlX2NoYW4tPnJpbmcgPSBOVUxMOworCQltbWlvd2IoKTsKKwl9CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtaXRlX2RtYV9hcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwlpbnQgY2hvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTURQUklOVEsoIm1pdGVfZG1hX2FybSBjaCVpXG4iLCBjaGFubmVsKTsKKwkvKiBtZW1vcnkgYmFycmllciBpcyBpbnRlbmRlZCB0byBpbnN1cmUgYW55IHR3aWRkbGluZyB3aXRoIHRoZSBidWZmZXIKKwkgICBpcyBkb25lIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBtaXRlIHRvIGFybSBkbWEgdHJhbnNmZXIgKi8KKwlzbXBfbWIoKTsKKwkvKiBhcm0gKi8KKwljaG9yID0gQ0hPUl9TVEFSVDsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwltaXRlX2NoYW4tPmRvbmUgPSAwOworCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJbW1pb3diKCk7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKy8vICAgICAgbWl0ZV9kbWFfdGNyKG1pdGUsIGNoYW5uZWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtaXRlX2J1Zl9jaGFuZ2Uoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJdW5zaWduZWQgaW50IG5fbGlua3M7CisJaW50IGk7CisKKwlpZiAocmluZy0+ZGVzY3JpcHRvcnMpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocmluZy0+aHdfZGV2LAorCQkJcmluZy0+bl9saW5rcyAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCisJCQlyaW5nLT5kZXNjcmlwdG9ycywgcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCX0KKwlyaW5nLT5kZXNjcmlwdG9ycyA9IE5VTEw7CisJcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIgPSAwOworCXJpbmctPm5fbGlua3MgPSAwOworCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWZzeiA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwluX2xpbmtzID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID4+IFBBR0VfU0hJRlQ7CisKKwlNRFBSSU5USygicmluZy0+aHdfZGV2PSVwLCBuX2xpbmtzPTB4JTA0eFxuIiwgcmluZy0+aHdfZGV2LCBuX2xpbmtzKTsKKworCXJpbmctPmRlc2NyaXB0b3JzID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KHJpbmctPmh3X2RldiwKKwkJbl9saW5rcyAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCisJCSZyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nLT5kZXNjcmlwdG9ycykgeworCQlwcmludGsoIm1pdGU6IHJpbmcgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJpbmctPm5fbGlua3MgPSBuX2xpbmtzOworCisJZm9yIChpID0gMDsgaSA8IG5fbGlua3M7IGkrKykgeworCQlyaW5nLT5kZXNjcmlwdG9yc1tpXS5jb3VudCA9IGNwdV90b19sZTMyKFBBR0VfU0laRSk7CisJCXJpbmctPmRlc2NyaXB0b3JzW2ldLmFkZHIgPQorCQkJY3B1X3RvX2xlMzIoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uZG1hX2FkZHIpOworCQlyaW5nLT5kZXNjcmlwdG9yc1tpXS5uZXh0ID0KKwkJCWNwdV90b19sZTMyKHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyICsgKGkgKworCQkJCTEpICogc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSk7CisJfQorCXJpbmctPmRlc2NyaXB0b3JzW25fbGlua3MgLSAxXS5uZXh0ID0KKwkJY3B1X3RvX2xlMzIocmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCS8qIGJhcnJpZXIgaXMgbWVhbnQgdG8gaW5zdXJlIHRoYXQgYWxsIHRoZSB3cml0ZXMgdG8gdGhlIGRtYSBkZXNjcmlwdG9ycworCSAgIGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGUgZG1hIGNvbnRyb2xsZXIgaXMgY29tbWFuZGVkIHRvIHJlYWQgdGhlbSAqLworCXNtcF93bWIoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtaXRlX3ByZXBfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKKwl1bnNpZ25lZCBpbnQgbnVtX2RldmljZV9iaXRzLCB1bnNpZ25lZCBpbnQgbnVtX21lbW9yeV9iaXRzKQoreworCXVuc2lnbmVkIGludCBjaG9yLCBjaGNyLCBtY3IsIGRjciwgbGtjcjsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisKKwlNRFBSSU5USygibWl0ZV9wcmVwX2RtYSBjaCVpXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwpOworCisJLyogcmVzZXQgRE1BIGFuZCBGSUZPICovCisJY2hvciA9IENIT1JfRE1BUkVTRVQgfCBDSE9SX0ZSRVNFVDsKKwl3cml0ZWwoY2hvciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogc2hvcnQgbGluayBjaGFpbmluZyBtb2RlICovCisJY2hjciA9IENIQ1JfU0VUX0RNQV9JRSB8IENIQ1JfTElOS1NIT1JUIHwgQ0hDUl9TRVRfRE9ORV9JRSB8CisJCUNIQ1JfQlVSU1RFTjsKKwkvKgorCSAqIExpbmsgQ29tcGxldGUgSW50ZXJydXB0OiBpbnRlcnJ1cHQgZXZlcnkgdGltZSBhIGxpbmsKKwkgKiBpbiBNSVRFX1JJTkcgaXMgY29tcGxldGVkLiBUaGlzIGNhbiBnZW5lcmF0ZSBhIGxvdCBvZgorCSAqIGV4dHJhIGludGVycnVwdHMsIGJ1dCByaWdodCBub3cgd2UgdXBkYXRlIHRoZSB2YWx1ZXMKKwkgKiBvZiBidWZfaW50X3B0ciBhbmQgYnVmX2ludF9jb3VudCBhdCBlYWNoIGludGVycnVwdC4gIEEKKwkgKiBiZXR0ZXIgbWV0aG9kIGlzIHRvIHBvbGwgdGhlIE1JVEUgYmVmb3JlIGVhY2ggdXNlcgorCSAqICJyZWFkKCkiIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZS4KKwkgKi8KKwljaGNyIHw9IENIQ1JfU0VUX0xDX0lFOworCWlmIChudW1fbWVtb3J5X2JpdHMgPT0gMzIgJiYgbnVtX2RldmljZV9iaXRzID09IDE2KSB7CisJCS8qIERvaW5nIGEgY29tYmluZWQgMzIgYW5kIDE2IGJpdCBieXRlc3dhcCBnZXRzIHRoZSAxNiBiaXQgc2FtcGxlcyBpbnRvIHRoZSBmaWZvIGluIHRoZSByaWdodCBvcmRlci4KKwkJICAgVGVzdGVkIGRvaW5nIDMyIGJpdCBtZW1vcnkgdG8gMTYgYml0IGRldmljZSB0cmFuc2ZlcnMgdG8gdGhlIGFuYWxvZyBvdXQgb2YgYSBweGktNjI4MSwKKwkJICAgd2hpY2ggaGFzIG1pdGUgdmVyc2lvbiA9IDEsIHR5cGUgPSA0LiAgVGhpcyBhbHNvIHdvcmtzIGZvciBkbWEgcmVhZHMgZnJvbSB0aGUgY291bnRlcnMKKwkJICAgb24gZS1zZXJpZXMgYm9hcmRzLiAgKi8KKwkJY2hjciB8PSBDSENSX0JZVEVfU1dBUF9ERVZJQ0UgfCBDSENSX0JZVEVfU1dBUF9NRU1PUlk7CisJfQorCWlmIChtaXRlX2NoYW4tPmRpciA9PSBDT01FRElfSU5QVVQpIHsKKwkJY2hjciB8PSBDSENSX0RFVl9UT19NRU07CisJfQorCXdyaXRlbChjaGNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiB0by9mcm9tIG1lbW9yeSAqLworCW1jciA9IENSX1JMKDY0KSB8IENSX0FTRVFVUDsKKwlzd2l0Y2ggKG51bV9tZW1vcnlfYml0cykgeworCWNhc2UgODoKKwkJbWNyIHw9IENSX1BTSVpFODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbWNyIHw9IENSX1BTSVpFMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCW1jciB8PSBDUl9QU0laRTMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydF9wcmludGsKKwkJCSgibWl0ZTogYnVnISBpbnZhbGlkIG1lbSBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCWJyZWFrOworCX0KKwl3cml0ZWwobWNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX01DUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIGZyb20vdG8gZGV2aWNlICovCisJZGNyID0gQ1JfUkwoNjQpIHwgQ1JfQVNFUVVQOworCWRjciB8PSBDUl9QT1JUSU8gfCBDUl9BTURFVklDRSB8IENSX1JFUVNEUlEobWl0ZV9jaGFuLT5jaGFubmVsKTsKKwlzd2l0Y2ggKG51bV9kZXZpY2VfYml0cykgeworCWNhc2UgODoKKwkJZGNyIHw9IENSX1BTSVpFODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZGNyIHw9IENSX1BTSVpFMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWRjciB8PSBDUl9QU0laRTMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydF9wcmludGsKKwkJCSgibWl0ZTogYnVnISBpbnZhbGlkIGRldiBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCWJyZWFrOworCX0KKwl3cml0ZWwoZGNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHJlc2V0IHRoZSBEQVIgKi8KKwl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiB0aGUgbGluayBpcyAzMmJpdHMgKi8KKwlsa2NyID0gQ1JfUkwoNjQpIHwgQ1JfQVNFUVVQIHwgQ1JfUFNJWkUzMjsKKwl3cml0ZWwobGtjciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9MS0NSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogc3RhcnRpbmcgYWRkcmVzcyBmb3IgbGluayBjaGFpbmluZyAqLworCXdyaXRlbChtaXRlX2NoYW4tPnJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyLAorCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwlNRFBSSU5USygiZXhpdCBtaXRlX3ByZXBfZG1hXG4iKTsKK30KKwordTMyIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJcmV0dXJuIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfREFSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworfQorCit1MzIgbWl0ZV9ieXRlc19pbl90cmFuc2l0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXJldHVybiByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKworCQlNSVRFX0ZDUihtaXRlX2NoYW4tPmNoYW5uZWwpKSAmIDB4MDAwMDAwRkY7Cit9CisKKy8vIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJdTMyIGRldmljZV9ieXRlX2NvdW50OworCisJZGV2aWNlX2J5dGVfY291bnQgPSBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pOworCXJldHVybiBkZXZpY2VfYnl0ZV9jb3VudCAtIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworfQorCisvLyByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBpbl90cmFuc2l0X2NvdW50OworCisJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pIC0gaW5fdHJhbnNpdF9jb3VudDsKK30KKworLy8gcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZQordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBkZXZpY2VfYnl0ZV9jb3VudDsKKworCWRldmljZV9ieXRlX2NvdW50ID0gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKTsKKwlyZXR1cm4gZGV2aWNlX2J5dGVfY291bnQgKyBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKK30KKworLy8gcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZQordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBpbl90cmFuc2l0X2NvdW50OworCisJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pICsgaW5fdHJhbnNpdF9jb3VudDsKK30KKwordW5zaWduZWQgbWl0ZV9kbWFfdGNyKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJaW50IHRjcjsKKwlpbnQgbGthcjsKKworCWxrYXIgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJdGNyID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9UQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJTURQUklOVEsoIm1pdGVfZG1hX3RjciBjaCVpLCBsa2FyPTB4JTA4eCB0Y3I9JWRcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCwKKwkJbGthciwgdGNyKTsKKworCXJldHVybiB0Y3I7Cit9CisKK3ZvaWQgbWl0ZV9kbWFfZGlzYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJdW5zaWduZWQgY2hvcjsKKworCS8qIGRpc2FybSAqLworCWNob3IgPSBDSE9SX0FCT1JUOworCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7Cit9CisKK2ludCBtaXRlX3N5bmNfaW5wdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9sZF9hbGxvY19jb3VudDsKKwljb25zdCB1bnNpZ25lZCBieXRlc19wZXJfc2NhbiA9IGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKKworCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CisJLy8gd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4KKwljb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCisJbmJ5dGVzID0gbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihtaXRlX2NoYW4pOworCWlmICgoaW50KShtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKG1pdGVfY2hhbikgLQorCQkJb2xkX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrKCJtaXRlOiBETUEgb3ZlcndyaXRlIG9mIGZyZWUgYXJlYVxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gLTE7CisJfQorCisJY291bnQgPSBuYnl0ZXMgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCS8qIGl0J3MgcG9zc2libGUgY291bnQgd2lsbCBiZSBuZWdhdGl2ZSBkdWUgdG8KKwkgKiBjb25zZXJ2YXRpdmUgdmFsdWUgcmV0dXJuZWQgYnkgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYiAqLworCWlmIChjb3VudCA8PSAwKSB7CisJCXJldHVybiAwOworCX0KKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGNvdW50KTsKKworCWFzeW5jLT5zY2FuX3Byb2dyZXNzICs9IGNvdW50OworCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBieXRlc19wZXJfc2NhbikgeworCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBieXRlc19wZXJfc2NhbjsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCX0KKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwlyZXR1cm4gMDsKK30KKworaW50IG1pdGVfc3luY19vdXRwdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJaW50IGNvdW50OworCXUzMiBuYnl0ZXNfdWIsIG5ieXRlc19sYjsKKwl1bnNpZ25lZCBpbnQgb2xkX2FsbG9jX2NvdW50OworCXUzMiBzdG9wX2NvdW50ID0KKwkJYXN5bmMtPmNtZC5zdG9wX2FyZyAqIGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKKworCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudDsKKwkvLyByZWFkIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuCisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCW5ieXRlc19sYiA9IG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihtaXRlX2NoYW4pOworCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJKGludCkobmJ5dGVzX2xiIC0gc3RvcF9jb3VudCkgPiAwKQorCQluYnl0ZXNfbGIgPSBzdG9wX2NvdW50OworCW5ieXRlc191YiA9IG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihtaXRlX2NoYW4pOworCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJKGludCkobmJ5dGVzX3ViIC0gc3RvcF9jb3VudCkgPiAwKQorCQluYnl0ZXNfdWIgPSBzdG9wX2NvdW50OworCWlmICgoaW50KShuYnl0ZXNfdWIgLSBvbGRfYWxsb2NfY291bnQpID4gMCkgeworCQlydF9wcmludGsoIm1pdGU6IERNQSB1bmRlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gLTE7CisJfQorCWNvdW50ID0gbmJ5dGVzX2xiIC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWlmIChjb3VudCA8PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoY291bnQpIHsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIGNvdW50KTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBtaXRlX2dldF9zdGF0dXMoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hTUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwlpZiAoc3RhdHVzICYgQ0hTUl9ET05FKSB7CisJCW1pdGVfY2hhbi0+ZG9uZSA9IDE7CisJCXdyaXRlbChDSE9SX0NMUkRPTkUsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJfQorCW1taW93YigpOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IG1pdGVfZG9uZShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRvbmU7CisKKwltaXRlX2dldF9zdGF0dXMobWl0ZV9jaGFuKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlkb25lID0gbWl0ZV9jaGFuLT5kb25lOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGRvbmU7Cit9CisKKyNpZmRlZiBERUJVR19NSVRFCisKK3N0YXRpYyB2b2lkIG1pdGVfZGVjb2RlKGNoYXIgKipiaXRfc3RyLCB1bnNpZ25lZCBpbnQgYml0cyk7CisKKy8qIG5hbWVzIG9mIGJpdHMgaW4gbWl0ZSByZWdpc3RlcnMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfQ0hPUl9zdHJpbmdzW10gPSB7CisJInN0YXJ0IiwgImNvbnQiLCAic3RvcCIsICJhYm9ydCIsCisJImZyZXNldCIsICJjbHJsYyIsICJjbHJyYiIsICJjbHJkb25lIiwKKwkiY2xyX2xwYXVzZSIsICJzZXRfbHBhdXNlIiwgImNscl9zZW5kX3RjIiwKKwkic2V0X3NlbmRfdGMiLCAiMTIiLCAiMTMiLCAiMTQiLAorCSIxNSIsICIxNiIsICIxNyIsICIxOCIsCisJIjE5IiwgIjIwIiwgIjIxIiwgIjIyIiwKKwkiMjMiLCAiMjQiLCAiMjUiLCAiMjYiLAorCSIyNyIsICIyOCIsICIyOSIsICIzMCIsCisJImRtYXJlc2V0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0NIQ1Jfc3RyaW5nc1tdID0geworCSJjb250aW51ZSIsICJyaW5nYnVmZiIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAiNiIsICI3IiwKKwkiOCIsICI5IiwgIjEwIiwgIjExIiwKKwkiMTIiLCAiMTMiLCAiYnVyc3RlbiIsICJmaWZvZGlzIiwKKwkiY2xyX2NvbnRfcmJfaWUiLCAic2V0X2NvbnRfcmJfaWUiLCAiY2xyX2xjX2llIiwgInNldF9sY19pZSIsCisJImNscl9kcmR5X2llIiwgInNldF9kcmR5X2llIiwgImNscl9tcmR5X2llIiwgInNldF9tcmR5X2llIiwKKwkiY2xyX2RvbmVfaWUiLCAic2V0X2RvbmVfaWUiLCAiY2xyX3Nhcl9pZSIsICJzZXRfc2FyX2llIiwKKwkiY2xyX2xpbmtwX2llIiwgInNldF9saW5rcF9pZSIsICJjbHJfZG1hX2llIiwgInNldF9kbWFfaWUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfTUNSX3N0cmluZ3NbXSA9IHsKKwkiYW1kZXZpY2UiLCAiMSIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAicG9ydGlvIiwgInBvcnR2eGkiLAorCSJwc2l6ZWJ5dGUiLCAicHNpemVoYWxmIChieXRlICYgaGFsZiA9IHdvcmQpIiwgImFzZXF4cDEiLCAiMTEiLAorCSIxMiIsICIxMyIsICJibG9ja2VuIiwgImJlcmhhbmQiLAorCSJyZXFzaW50bGltL3JlcXMwIiwgInJlcXMxIiwgInJlcXMyIiwgInJkMzIiLAorCSJyZDUxMiIsICJybDEiLCAicmwyIiwgInJsOCIsCisJIjI0IiwgIjI1IiwgIjI2IiwgIjI3IiwKKwkiMjgiLCAiMjkiLCAiMzAiLCAic3RvcGVuIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0RDUl9zdHJpbmdzW10gPSB7CisJImFtZGV2aWNlIiwgIjEiLCAiMiIsICIzIiwKKwkiNCIsICI1IiwgInBvcnRpbyIsICJwb3J0dnhpIiwKKwkicHNpemVieXRlIiwgInBzaXplaGFsZiAoYnl0ZSAmIGhhbGYgPSB3b3JkKSIsICJhc2VxeHAxIiwgImFzZXF4cDIiLAorCSJhc2VxeHA4IiwgIjEzIiwgImJsb2NrZW4iLCAiYmVyaGFuZCIsCisJInJlcXNpbnRsaW0iLCAicmVxczEiLCAicmVxczIiLCAicmQzMiIsCisJInJkNTEyIiwgInJsMSIsICJybDIiLCAicmw4IiwKKwkiMjMiLCAiMjQiLCAiMjUiLCAiMjciLAorCSIyOCIsICJ3c2RldmMiLCAid3NkZXZzIiwgInJ3ZGV2cGFjayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9MS0NSX3N0cmluZ3NbXSA9IHsKKwkiYW1kZXZpY2UiLCAiMSIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAicG9ydGlvIiwgInBvcnR2eGkiLAorCSJwc2l6ZWJ5dGUiLCAicHNpemVoYWxmIChieXRlICYgaGFsZiA9IHdvcmQpIiwgImFzZXF1cCIsICJhc2VxZG93biIsCisJIjEyIiwgIjEzIiwgIjE0IiwgImJlcmhhbmQiLAorCSIxNiIsICIxNyIsICIxOCIsICJyZDMyIiwKKwkicmQ1MTIiLCAicmwxIiwgInJsMiIsICJybDgiLAorCSIyNCIsICIyNSIsICIyNiIsICIyNyIsCisJIjI4IiwgIjI5IiwgIjMwIiwgImNobmdlbmQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfQ0hTUl9zdHJpbmdzW10gPSB7CisJImQuZXJyMCIsICJkLmVycjEiLCAibS5lcnIwIiwgIm0uZXJyMSIsCisJImwuZXJyMCIsICJsLmVycjEiLCAiZHJxMCIsICJkcnExIiwKKwkiZW5kIiwgInhmZXJyIiwgIm9wZXJyMCIsICJvcGVycjEiLAorCSJzdG9wcyIsICJoYWJvcnQiLCAic2Fib3J0IiwgImVycm9yIiwKKwkiMTYiLCAiY29udHNfcmIiLCAiMTgiLCAibGlua2MiLAorCSIyMCIsICJkcmR5IiwgIjIyIiwgIm1yZHkiLAorCSIyNCIsICJkb25lIiwgIjI2IiwgInNhcnMiLAorCSIyOCIsICJscGF1c2VzIiwgIjMwIiwgImludCIsCit9OworCit2b2lkIG1pdGVfZHVtcF9yZWdzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIG1pdGVfaW9fYWRkciA9CisJCSh1bnNpZ25lZCBsb25nKW1pdGVfY2hhbi0+bWl0ZS0+bWl0ZV9pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKKworCXByaW50aygibWl0ZV9kdW1wX3JlZ3MgY2glaVxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsKTsKKwlwcmludGsoIm1pdGUgYWRkcmVzcyBpcyAgPTB4JTA4bHhcbiIsIG1pdGVfaW9fYWRkcik7CisKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hPUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hPUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSENSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hDUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9UQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tUQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01DUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW01DUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX01DUl9zdHJpbmdzLCB0ZW1wKTsKKworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01BUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW01BUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRENSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbRENSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfRENSX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RBUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0RBUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0xLQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0xLQ1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtBUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0xLQVJdYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSFNSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hTUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hTUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9GQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tGQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuXG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pdGVfZGVjb2RlKGNoYXIgKipiaXRfc3RyLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpZiAoYml0cyAmICgxIDw8IGkpKSB7CisJCQlwcmludGsoIiAlcyIsIGJpdF9zdHJbaV0pOworCQl9CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFCitpbnQgX19pbml0IGluaXRfbW9kdWxlKHZvaWQpCit7CisJbWl0ZV9pbml0KCk7CisJbWl0ZV9saXN0X2RldmljZXMoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCW1pdGVfY2xlYW51cCgpOworfQorCitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX3Rjcik7CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2FybSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2Rpc2FybSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc3luY19pbnB1dF9kbWEpOworRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfb3V0cHV0X2RtYSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXApOworRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwMik7CitFWFBPUlRfU1lNQk9MKG1pdGVfdW5zZXR1cCk7CisjaWYgMAorRVhQT1JUX1NZTUJPTChtaXRlX2t2bWVtX3NlZ21lbnRfbG9hZCk7CitFWFBPUlRfU1lNQk9MKG1pdGVfbGxfZnJvbV9rdm1lbSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0cmVncyk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0wobWl0ZV9kZXZpY2VzKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9saXN0X2RldmljZXMpOworRVhQT1JUX1NZTUJPTChtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfcmVsZWFzZV9jaGFubmVsKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9wcmVwX2RtYSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnVmX2NoYW5nZSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19pbl90cmFuc2l0KTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9nZXRfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kb25lKTsKKyNpZmRlZiBERUJVR19NSVRFCitFWFBPUlRfU1lNQk9MKG1pdGVfZGVjb2RlKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kdW1wX3JlZ3MpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZWFmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgICAgbW9kdWxlL21pdGUuaAorICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgTWl0ZSBQQ0kgaW50ZXJmYWNlIGNoaXAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfTUlURV9IXworI2RlZmluZSBfTUlURV9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OQVRJTlNUCQkweDEwOTMKKworLy8gI2RlZmluZSBERUJVR19NSVRFCisjZGVmaW5lIFBDSU1JT19DT01QQVQKKworI2lmZGVmIERFQlVHX01JVEUKKyNkZWZpbmUgTURQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCXByaW50ayhmb3JtYXQgLCAjIyBhcmdzICkKKyNlbHNlCisjZGVmaW5lIE1EUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX01JVEVfRE1BX0NIQU5ORUxTIDgKKworc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IgeworCXUzMiBjb3VudDsKKwl1MzIgYWRkcjsKKwl1MzIgbmV4dDsKKwl1MzIgZGFyOworfTsKKworc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyB7CisJc3RydWN0IGRldmljZSAqaHdfZGV2OworCXVuc2lnbmVkIGludCBuX2xpbmtzOworCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yICpkZXNjcmlwdG9yczsKKwlkbWFfYWRkcl90IGRlc2NyaXB0b3JzX2RtYV9hZGRyOworfTsKKworc3RydWN0IG1pdGVfY2hhbm5lbCB7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlOworCXVuc2lnbmVkIGNoYW5uZWw7CisJaW50IGRpcjsKKwlpbnQgZG9uZTsKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nOworfTsKKworc3RydWN0IG1pdGVfc3RydWN0IHsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm5leHQ7CisJaW50IHVzZWQ7CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXJlc291cmNlX3NpemVfdCBtaXRlX3BoeXNfYWRkcjsKKwl2b2lkICptaXRlX2lvX2FkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IGRhcV9waHlzX2FkZHI7CisJdm9pZCAqZGFxX2lvX2FkZHI7CisKKwlzdHJ1Y3QgbWl0ZV9jaGFubmVsIGNoYW5uZWxzW01BWF9NSVRFX0RNQV9DSEFOTkVMU107CisJc2hvcnQgY2hhbm5lbF9hbGxvY2F0ZWRbTUFYX01JVEVfRE1BX0NIQU5ORUxTXTsKKwlpbnQgbnVtX2NoYW5uZWxzOworCXVuc2lnbmVkIGZpZm9fc2l6ZTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKm1pdGVfYWxsb2NfcmluZyhzdHJ1Y3QKKwltaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyksIEdGUF9LRVJORUwpOworCWlmIChyaW5nID09IE5VTEwpCisJCXJldHVybiByaW5nOworCXJpbmctPmh3X2RldiA9IGdldF9kZXZpY2UoJm1pdGUtPnBjaWRldi0+ZGV2KTsKKwlpZiAocmluZy0+aHdfZGV2ID09IE5VTEwpIHsKKwkJa2ZyZWUocmluZyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyaW5nLT5uX2xpbmtzID0gMDsKKwlyaW5nLT5kZXNjcmlwdG9ycyA9IE5VTEw7CisJcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIgPSAwOworCXJldHVybiByaW5nOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1pdGVfZnJlZV9yaW5nKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcpCit7CisJaWYgKHJpbmcpIHsKKwkJaWYgKHJpbmctPmRlc2NyaXB0b3JzKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChyaW5nLT5od19kZXYsCisJCQkJcmluZy0+bl9saW5rcyAqCisJCQkJc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSwKKwkJCQlyaW5nLT5kZXNjcmlwdG9ycywgcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCQl9CisJCXB1dF9kZXZpY2UocmluZy0+aHdfZGV2KTsKKwkJa2ZyZWUocmluZyk7CisJfQorfTsKKworZXh0ZXJuIHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZV9kZXZpY2VzOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtaXRlX2lycShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJcmV0dXJuIG1pdGUtPnBjaWRldi0+aXJxOworfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1pdGVfZGV2aWNlX2lkKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlyZXR1cm4gbWl0ZS0+cGNpZGV2LT5kZXZpY2U7Cit9OworCit2b2lkIG1pdGVfaW5pdCh2b2lkKTsKK3ZvaWQgbWl0ZV9jbGVhbnVwKHZvaWQpOworaW50IG1pdGVfc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKTsKK2ludCBtaXRlX3NldHVwMihzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIHVzZV9pb2R3YnNyXzEpOwordm9pZCBtaXRlX3Vuc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKTsKK3ZvaWQgbWl0ZV9saXN0X2RldmljZXModm9pZCk7CitzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsCisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywgdW5zaWduZWQgbWluX2NoYW5uZWwsCisJdW5zaWduZWQgbWF4X2NoYW5uZWwpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QKKwkqbWl0ZSwgc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZykKK3sKKwlyZXR1cm4gbWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2UobWl0ZSwgcmluZywgMCwKKwkJbWl0ZS0+bnVtX2NoYW5uZWxzIC0gMSk7Cit9Cit2b2lkIG1pdGVfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CisKK3Vuc2lnbmVkIG1pdGVfZG1hX3RjcihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordm9pZCBtaXRlX2RtYV9hcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3ZvaWQgbWl0ZV9kbWFfZGlzYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CitpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKTsKK2ludCBtaXRlX3N5bmNfb3V0cHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKTsKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordW5zaWduZWQgbWl0ZV9nZXRfc3RhdHVzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CitpbnQgbWl0ZV9kb25lKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CisKKyNpZiAwCit1bnNpZ25lZCBsb25nIG1pdGVfbGxfZnJvbV9rdm1lbShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIGNvbWVkaV9hc3luYyAqIGFzeW5jLAorCWludCBsZW4pOwordm9pZCBtaXRlX3NldHJlZ3Moc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCBsb25nIGxsX3N0YXJ0LCBpbnQgY2hhbiwKKwlpbnQgZGlyKTsKKyNlbmRpZgorCit2b2lkIG1pdGVfcHJlcF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAorCXVuc2lnbmVkIGludCBudW1fZGV2aWNlX2JpdHMsIHVuc2lnbmVkIGludCBudW1fbWVtb3J5X2JpdHMpOworaW50IG1pdGVfYnVmX2NoYW5nZShzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLAorCWNvbWVkaV9hc3luYyAqIGFzeW5jKTsKKworI2lmZGVmIERFQlVHX01JVEUKK3ZvaWQgbWl0ZV9wcmludF9jaHNyKHVuc2lnbmVkIGludCBjaHNyKTsKK3ZvaWQgbWl0ZV9kdW1wX3JlZ3Moc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBDSEFOX09GRlNFVChpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gMHg1MDAgKyAweDEwMCAqIGNoYW5uZWw7Cit9OworCitlbnVtIG1pdGVfcmVnaXN0ZXJzIHsKKwkvKiBUaGUgYml0cyAweDkwMTgwNzAwIGluIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHIGNhbiBiZQorCSAgIHdyaXR0ZW4gYW5kIHJlYWQgYmFjay4gIFRoZSBiaXRzIDB4MWYgYWx3YXlzIHJlYWQgYXMgMS4KKwkgICBUaGUgcmVzdCBhbHdheXMgcmVhZCBhcyB6ZXJvLiAqLworCU1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHID0gMHgyOCwKKwlNSVRFX0lPRFdCU1IgPSAweGMwLAkvL0lPIERldmljZSBXaW5kb3cgQmFzZSBTaXplIFJlZ2lzdGVyCisJTUlURV9JT0RXQlNSXzEgPSAweGM0LAkvLyBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAxCisJTUlURV9JT0RXQ1JfMSA9IDB4ZjQsCisJTUlURV9QQ0lfQ09ORklHX09GRlNFVCA9IDB4MzAwLAorCU1JVEVfQ1NJR1IgPSAweDQ2MAkvL2NoaXAgc2lnbmF0dXJlCit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9DSE9SKGludCBjaGFubmVsKQkvLyBjaGFubmVsIG9wZXJhdGlvbgoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0NIQ1IoaW50IGNoYW5uZWwpCS8vIGNoYW5uZWwgY29udHJvbAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4NDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX1RDUihpbnQgY2hhbm5lbCkJLy8gdHJhbnNmZXIgY291bnQKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9NQ1IoaW50IGNoYW5uZWwpCS8vIG1lbW9yeSBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHhjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTUFSKGludCBjaGFubmVsKQkvLyBtZW1vcnkgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MTA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9EQ1IoaW50IGNoYW5uZWwpCS8vIGRldmljZSBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxNDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0RBUihpbnQgY2hhbm5lbCkJLy8gZGV2aWNlIGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDE4OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTEtDUihpbnQgY2hhbm5lbCkJLy8gbGluayBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxYzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0xLQVIoaW50IGNoYW5uZWwpCS8vIGxpbmsgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MjA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9MTEtBUihpbnQgY2hhbm5lbCkJLy8gc2VlIG1pdGUgc2VjdGlvbiBvZiB0bnQ1MDAyIG1hbnVhbAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MjQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9CQVIoaW50IGNoYW5uZWwpCS8vIGJhc2UgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4Mjg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9CQ1IoaW50IGNoYW5uZWwpCS8vIGJhc2UgY291bnQKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDJjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfU0FSKGludCBjaGFubmVsKQkvLyA/IGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDMwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfV1NDUihpbnQgY2hhbm5lbCkJLy8gPworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MzQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9XU0VSKGludCBjaGFubmVsKQkvLyA/Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzODsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0NIU1IoaW50IGNoYW5uZWwpCS8vIGNoYW5uZWwgc3RhdHVzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzYzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0ZDUihpbnQgY2hhbm5lbCkJLy8gZmlmbyBjb3VudAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4NDA7Cit9OworCitlbnVtIE1JVEVfSU9EV0JTUl9iaXRzIHsKKwlXRU5BQiA9IDB4ODAsCQkvLyB3aW5kb3cgZW5hYmxlCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE1JVEVfSU9EV0JTUl8xX1dTSVpFX2JpdHModW5zaWduZWQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBvcmRlciA9IDA7CisJd2hpbGUgKHNpemUgPj49IDEpCisJCSsrb3JkZXI7CisJQlVHX09OKG9yZGVyIDwgMSk7CisJcmV0dXJuIChvcmRlciAtIDEpICYgMHgxZjsKK30KKworZW51bSBNSVRFX1VOS05PV05fRE1BX0JVUlNUX2JpdHMgeworCVVOS05PV05fRE1BX0JVUlNUX0VOQUJMRV9CSVRTID0gMHg2MDAKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfdmVyc2lvbih1MzIgY3NpZ3JfYml0cykKK3sKKwlyZXR1cm4gY3NpZ3JfYml0cyAmIDB4ZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3R5cGUodTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIG9yaWdpbmFsIG1pdGUgPSAwLCBtaW5pbWl0ZSA9IDEKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gNCkgJiAweGY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9tbW9kZSh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gbWl0ZSBtb2RlLCBtaW5pbWl0ZSA9IDEKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gOCkgJiAweDM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9pbW9kZSh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gY3B1IHBvcnQgaW50ZXJmYWNlIG1vZGUsIHBjaSA9IDB4MworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAxMikgJiAweDM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9kbWFjKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBudW1iZXIgb2YgZG1hIGNoYW5uZWxzCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDE2KSAmIDB4ZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3dwZGVwKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyB3cml0ZSBwb3N0IGZpZm8gZGVwdGgKKwl1bnNpZ25lZCBpbnQgd3BkZXBfYml0cyA9IChjc2lncl9iaXRzID4+IDIwKSAmIDB4NzsKKwlpZiAod3BkZXBfYml0cyA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxIDw8ICh3cGRlcF9iaXRzIC0gMSk7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl93aW5zKHUzMiBjc2lncl9iaXRzKQoreworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAyNCkgJiAweDFmOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfaW93aW5zKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBudW1iZXIgb2YgaW8gd2luZG93cworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAyOSkgJiAweDc7Cit9OworCitlbnVtIE1JVEVfTUNSX2JpdHMgeworCU1DUlBPTiA9IDAsCit9OworCitlbnVtIE1JVEVfRENSX2JpdHMgeworCURDUl9OT1JNQUwgPSAoMSA8PCAyOSksCisJRENSUE9OID0gMCwKK307CisKK2VudW0gTUlURV9DSE9SX2JpdHMgeworCUNIT1JfRE1BUkVTRVQgPSAoMSA8PCAzMSksCisJQ0hPUl9TRVRfU0VORF9UQyA9ICgxIDw8IDExKSwKKwlDSE9SX0NMUl9TRU5EX1RDID0gKDEgPDwgMTApLAorCUNIT1JfU0VUX0xQQVVTRSA9ICgxIDw8IDkpLAorCUNIT1JfQ0xSX0xQQVVTRSA9ICgxIDw8IDgpLAorCUNIT1JfQ0xSRE9ORSA9ICgxIDw8IDcpLAorCUNIT1JfQ0xSUkIgPSAoMSA8PCA2KSwKKwlDSE9SX0NMUkxDID0gKDEgPDwgNSksCisJQ0hPUl9GUkVTRVQgPSAoMSA8PCA0KSwKKwlDSE9SX0FCT1JUID0gKDEgPDwgMyksCS8qIHN0b3Agd2l0aG91dCBlbXB0eWluZyBmaWZvICovCisJQ0hPUl9TVE9QID0gKDEgPDwgMiksCS8qIHN0b3AgYWZ0ZXIgZW1wdHlpbmcgZmlmbyAqLworCUNIT1JfQ09OVCA9ICgxIDw8IDEpLAorCUNIT1JfU1RBUlQgPSAoMSA8PCAwKSwKKwlDSE9SX1BPTiA9IChDSE9SX0NMUl9TRU5EX1RDIHwgQ0hPUl9DTFJfTFBBVVNFKSwKK307CisKK2VudW0gTUlURV9DSENSX2JpdHMgeworCUNIQ1JfU0VUX0RNQV9JRSA9ICgxIDw8IDMxKSwKKwlDSENSX0NMUl9ETUFfSUUgPSAoMSA8PCAzMCksCisJQ0hDUl9TRVRfTElOS1BfSUUgPSAoMSA8PCAyOSksCisJQ0hDUl9DTFJfTElOS1BfSUUgPSAoMSA8PCAyOCksCisJQ0hDUl9TRVRfU0FSX0lFID0gKDEgPDwgMjcpLAorCUNIQ1JfQ0xSX1NBUl9JRSA9ICgxIDw8IDI2KSwKKwlDSENSX1NFVF9ET05FX0lFID0gKDEgPDwgMjUpLAorCUNIQ1JfQ0xSX0RPTkVfSUUgPSAoMSA8PCAyNCksCisJQ0hDUl9TRVRfTVJEWV9JRSA9ICgxIDw8IDIzKSwKKwlDSENSX0NMUl9NUkRZX0lFID0gKDEgPDwgMjIpLAorCUNIQ1JfU0VUX0RSRFlfSUUgPSAoMSA8PCAyMSksCisJQ0hDUl9DTFJfRFJEWV9JRSA9ICgxIDw8IDIwKSwKKwlDSENSX1NFVF9MQ19JRSA9ICgxIDw8IDE5KSwKKwlDSENSX0NMUl9MQ19JRSA9ICgxIDw8IDE4KSwKKwlDSENSX1NFVF9DT05UX1JCX0lFID0gKDEgPDwgMTcpLAorCUNIQ1JfQ0xSX0NPTlRfUkJfSUUgPSAoMSA8PCAxNiksCisJQ0hDUl9GSUZPRElTID0gKDEgPDwgMTUpLAorCUNIQ1JfRklGT19PTiA9IDAsCisJQ0hDUl9CVVJTVEVOID0gKDEgPDwgMTQpLAorCUNIQ1JfTk9fQlVSU1RFTiA9IDAsCisJQ0hDUl9CWVRFX1NXQVBfREVWSUNFID0gKDEgPDwgNiksCisJQ0hDUl9CWVRFX1NXQVBfTUVNT1JZID0gKDEgPDwgNCksCisJQ0hDUl9ESVIgPSAoMSA8PCAzKSwKKwlDSENSX0RFVl9UT19NRU0gPSBDSENSX0RJUiwKKwlDSENSX01FTV9UT19ERVYgPSAwLAorCUNIQ1JfTk9STUFMID0gKDAgPDwgMCksCisJQ0hDUl9DT05USU5VRSA9ICgxIDw8IDApLAorCUNIQ1JfUklOR0JVRkYgPSAoMiA8PCAwKSwKKwlDSENSX0xJTktTSE9SVCA9ICg0IDw8IDApLAorCUNIQ1JfTElOS0xPTkcgPSAoNSA8PCAwKSwKKwlDSENSUE9OID0KKwkJKENIQ1JfQ0xSX0RNQV9JRSB8IENIQ1JfQ0xSX0xJTktQX0lFIHwgQ0hDUl9DTFJfU0FSX0lFIHwKKwkJQ0hDUl9DTFJfRE9ORV9JRSB8IENIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKKwkJQ0hDUl9DTFJfTENfSUUgfCBDSENSX0NMUl9DT05UX1JCX0lFKSwKK307CisKK2VudW0gQ29uZmlnUmVnaXN0ZXJfYml0cyB7CisJQ1JfUkVRU19NQVNLID0gMHg3IDw8IDE2LAorCUNSX0FTRVFET05UID0gMHgwIDw8IDEwLAorCUNSX0FTRVFVUCA9IDB4MSA8PCAxMCwKKwlDUl9BU0VRRE9XTiA9IDB4MiA8PCAxMCwKKwlDUl9BU0VRX01BU0sgPSAweDMgPDwgMTAsCisJQ1JfUFNJWkU4ID0gKDEgPDwgOCksCisJQ1JfUFNJWkUxNiA9ICgyIDw8IDgpLAorCUNSX1BTSVpFMzIgPSAoMyA8PCA4KSwKKwlDUl9QT1JUQ1BVID0gKDAgPDwgNiksCisJQ1JfUE9SVElPID0gKDEgPDwgNiksCisJQ1JfUE9SVFZYSSA9ICgyIDw8IDYpLAorCUNSX1BPUlRNWEkgPSAoMyA8PCA2KSwKKwlDUl9BTURFVklDRSA9ICgxIDw8IDApLAorfTsKK3N0YXRpYyBpbmxpbmUgaW50IENSX1JFUVMoaW50IHNvdXJjZSkKK3sKKwlyZXR1cm4gKHNvdXJjZSAmIDB4NykgPDwgMTY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgQ1JfUkVRU0RSUSh1bnNpZ25lZCBkcnFfbGluZSkKK3sKKwkvKiBUaGlzIGFsc28gd29ya3Mgb24gbS1zZXJpZXMgd2hlbgorCSAgIHVzaW5nIGNoYW5uZWxzIChkcnFfbGluZSkgNCBvciA1LiAqLworCXJldHVybiBDUl9SRVFTKChkcnFfbGluZSAmIDB4MykgfCAweDQpOworfQorc3RhdGljIGlubGluZSBpbnQgQ1JfUkwodW5zaWduZWQgaW50IHJldHJ5X2xpbWl0KQoreworCWludCB2YWx1ZSA9IDA7CisKKwl3aGlsZSAocmV0cnlfbGltaXQpIHsKKwkJcmV0cnlfbGltaXQgPj49IDE7CisJCXZhbHVlKys7CisJfQorCWlmICh2YWx1ZSA+IDB4NykKKwkJcnRfcHJpbnRrKCJjb21lZGk6IGJ1ZyEgcmV0cnlfbGltaXQgdG9vIGxhcmdlXG4iKTsKKwlyZXR1cm4gKHZhbHVlICYgMHg3KSA8PCAyMTsKK30KKworZW51bSBDSFNSX2JpdHMgeworCUNIU1JfSU5UID0gKDEgPDwgMzEpLAorCUNIU1JfTFBBVVNFUyA9ICgxIDw8IDI5KSwKKwlDSFNSX1NBUlMgPSAoMSA8PCAyNyksCisJQ0hTUl9ET05FID0gKDEgPDwgMjUpLAorCUNIU1JfTVJEWSA9ICgxIDw8IDIzKSwKKwlDSFNSX0RSRFkgPSAoMSA8PCAyMSksCisJQ0hTUl9MSU5LQyA9ICgxIDw8IDE5KSwKKwlDSFNSX0NPTlRTX1JCID0gKDEgPDwgMTcpLAorCUNIU1JfRVJST1IgPSAoMSA8PCAxNSksCisJQ0hTUl9TQUJPUlQgPSAoMSA8PCAxNCksCisJQ0hTUl9IQUJPUlQgPSAoMSA8PCAxMyksCisJQ0hTUl9TVE9QUyA9ICgxIDw8IDEyKSwKKwlDSFNSX09QRVJSX21hc2sgPSAoMyA8PCAxMCksCisJQ0hTUl9PUEVSUl9OT0VSUk9SID0gKDAgPDwgMTApLAorCUNIU1JfT1BFUlJfRklGT0VSUk9SID0gKDEgPDwgMTApLAorCUNIU1JfT1BFUlJfTElOS0VSUk9SID0gKDEgPDwgMTApLAkvKiA/Pz8gKi8KKwlDSFNSX1hGRVJSID0gKDEgPDwgOSksCisJQ0hTUl9FTkQgPSAoMSA8PCA4KSwKKwlDSFNSX0RSUTEgPSAoMSA8PCA3KSwKKwlDSFNSX0RSUTAgPSAoMSA8PCA2KSwKKwlDSFNSX0x4RVJSX21hc2sgPSAoMyA8PCA0KSwKKwlDSFNSX0xCRVJSID0gKDEgPDwgNCksCisJQ0hTUl9MUkVSUiA9ICgyIDw8IDQpLAorCUNIU1JfTE9FUlIgPSAoMyA8PCA0KSwKKwlDSFNSX014RVJSX21hc2sgPSAoMyA8PCAyKSwKKwlDSFNSX01CRVJSID0gKDEgPDwgMiksCisJQ0hTUl9NUkVSUiA9ICgyIDw8IDIpLAorCUNIU1JfTU9FUlIgPSAoMyA8PCAyKSwKKwlDSFNSX0R4RVJSX21hc2sgPSAoMyA8PCAwKSwKKwlDSFNSX0RCRVJSID0gKDEgPDwgMCksCisJQ0hTUl9EUkVSUiA9ICgyIDw8IDApLAorCUNIU1JfRE9FUlIgPSAoMyA8PCAwKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXRlX2RtYV9yZXNldChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJd3JpdGVsKENIT1JfRE1BUkVTRVQgfCBDSE9SX0ZSRVNFVCwKKwkJbWl0ZV9jaGFuLT5taXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCkBAIC0wLDAgKzEsNDI5IEBACisvKiBwbHg5MDgwLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogSSBtb2RpZmllZCB0aGlzIGZpbGUgZnJvbSB0aGUgcGx4OTA2MC5oIGhlYWRlciBmb3IgdGhlCisgKiB3YW5YTCBkZXZpY2UgZHJpdmVyIGluIHRoZSBsaW51eCBrZXJuZWwsCisgKiBmb3IgdGhlIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdCBkZWZpbml0aW9ucy4gIE1hZGUgbWlub3IgbW9kaWZpY2F0aW9ucywKKyAqIGFkZGVkIHBseDkwODAgcmVnaXN0ZXJzIGFuZAorICogc3RyaXBwZWQgb3V0IHN0dWZmIHRoYXQgd2FzIHNwZWNpZmljYWxseSBmb3IgdGhlIHdhblhMIGRyaXZlci4KKyAqIE5vdGU6IEkndmUgb25seSBtYWRlIHN1cmUgdGhlIGRlZmluaXRpb25zIGFyZSBjb3JyZWN0IGFzIGZhcgorICogYXMgSSBtYWtlIHVzZSBvZiB0aGVtLiAgVGhlcmUgYXJlIHN0aWxsIHZhcmlvdXMgcGx4OTA2MC1pc21zCisgKiBsZWZ0IGluIHRoaXMgaGVhZGVyIGZpbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFJHIFN0dWRpbyBzLmMuLCBodHRwOi8vd3d3LnJnc3R1ZGlvLmNvbS5wbC8KKyAqIFdyaXR0ZW4gYnkgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHJnc3R1ZGlvLmNvbS5wbD4KKyAqCisgKiBQb3J0aW9ucyAoQykgU0JFIEluYy4sIHVzZWQgYnkgcGVybWlzc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19DT01FRElfUExYOTA4MF9ICisjZGVmaW5lIF9fQ09NRURJX1BMWDkwODBfSAorCisvLyBkZXNjcmlwdG9yIGJsb2NrIHVzZWQgZm9yIGNoYWluZWQgZG1hIHRyYW5zZmVycworc3RydWN0IHBseF9kbWFfZGVzYyB7CisJdm9sYXRpbGUgdWludDMyX3QgcGNpX3N0YXJ0X2FkZHI7CisJdm9sYXRpbGUgdWludDMyX3QgbG9jYWxfc3RhcnRfYWRkcjsKKwkvKiB0cmFuc2Zlcl9zaXplIGlzIGluIGJ5dGVzLCBvbmx5IGZpcnN0IDIzIGJpdHMgb2YgcmVnaXN0ZXIgYXJlIHVzZWQgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCB0cmFuc2Zlcl9zaXplOworCS8qIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yIChxdWFkIHdvcmQgYWxpZ25lZCksIHBsdXMgc29tZQorCSAqIGFkZGl0aW9uYWwgYml0cyAoc2VlIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKSAqLworCXZvbGF0aWxlIHVpbnQzMl90IG5leHQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogICAgICAgICAgICBSZWdpc3RlciBPZmZzZXRzIGFuZCBCaXQgRGVmaW5pdGlvbnMKKyoqCisqKiBOb3RlOiBBbGwgb2Zmc2V0cyB6ZXJvIHJlbGF0aXZlLiAgSUUuIFNvbWUgc3RhbmRhcmQgYmFzZSBhZGRyZXNzCisqKiBtdXN0IGJlIGFkZGVkIHRvIHRoZSBSZWdpc3RlciBOdW1iZXIgdG8gcHJvcGVybHkgYWNjZXNzIHRoZSByZWdpc3Rlci4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBMWF9MQVMwUk5HX1JFRyAgICAgICAgIDB4MDAwMAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDAgUmFuZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX0xBUzFSTkdfUkVHICAgICAgICAgMHgwMGYwCS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgMSBSYW5nZSBSZWdpc3RlciAqLworI2RlZmluZSAgTFJOR19JTyAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBNYXAgdG86IDE9SS9PLCAwPU1lbSAqLworI2RlZmluZSAgTFJOR19BTlkzMiAgICAgICAgMHgwMDAwMDAwMAkvKiBMb2NhdGUgYW55d2hlcmUgaW4gMzIgYml0ICovCisjZGVmaW5lICBMUk5HX0xUMU1CICAgICAgICAweDAwMDAwMDAyCS8qIExvY2F0ZSBpbiAxc3QgbWVnICovCisjZGVmaW5lICBMUk5HX0FOWTY0ICAgICAgICAweDAwMDAwMDA0CS8qIExvY2F0ZSBhbnl3aGVyZSBpbiA2NCBiaXQgKi8KKyNkZWZpbmUgIExSTkdfTUVNX01BU0sgICAgIDB4ZmZmZmZmZjAJLy8gYml0cyB0aGF0IHNwZWNpZnkgcmFuZ2UgZm9yIG1lbW9yeSBpbworI2RlZmluZSAgTFJOR19JT19NQVNLICAgICAweGZmZmZmZmZhCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IHJhbmdlIGZvciBub3JtYWwgaW8KKworI2RlZmluZSBQTFhfTEFTME1BUF9SRUcgICAgICAgICAweDAwMDQJLyogTCwgTG9jYWwgQWRkciBTcGFjZSAwIFJlbWFwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9MQVMxTUFQX1JFRyAgICAgICAgIDB4MDBmNAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDEgUmVtYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIExNQVBfRU4gICAgICAgICAgIDB4MDAwMDAwMDEJLyogRW5hYmxlIHNsYXZlIGRlY29kZSAqLworI2RlZmluZSAgTE1BUF9NRU1fTUFTSyAgICAgMHhmZmZmZmZmMAkvLyBiaXRzIHRoYXQgc3BlY2lmeSBkZWNvZGUgZm9yIG1lbW9yeSBpbworI2RlZmluZSAgTE1BUF9JT19NQVNLICAgICAweGZmZmZmZmZhCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IGRlY29kZSBiaXRzIGZvciBub3JtYWwgaW8KKworLyogTW9kZS9BcmJpdHJhdGlvbiBSZWdpc3Rlci4KKyovCisjZGVmaW5lIFBMWF9NQVJCX1JFRyAgICAgICAgIDB4OAkvKiBMLCBMb2NhbCBBcmJpdHJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfRE1BQVJCX1JFRyAgICAgIDB4YWMKK2VudW0gbWFyYl9iaXRzIHsKKwlNQVJCX0xMVF9NQVNLID0gMHgwMDAwMDBmZiwJLyogTG9jYWwgQnVzIExhdGVuY3kgVGltZXIgKi8KKwlNQVJCX0xQVF9NQVNLID0gMHgwMDAwZmYwMCwJLyogTG9jYWwgQnVzIFBhdXNlIFRpbWVyICovCisJTUFSQl9MVEVOID0gMHgwMDAxMDAwMCwJLyogTGF0ZW5jeSBUaW1lciBFbmFibGUgKi8KKwlNQVJCX0xQRU4gPSAweDAwMDIwMDAwLAkvKiBQYXVzZSBUaW1lciBFbmFibGUgKi8KKwlNQVJCX0JSRVEgPSAweDAwMDQwMDAwLAkvKiBMb2NhbCBCdXMgQlJFUSBFbmFibGUgKi8KKwlNQVJCX0RNQV9QUklPUklUWV9NQVNLID0gMHgwMDE4MDAwMCwKKwlNQVJCX0xCRFNfR0lWRV9VUF9CVVNfTU9ERSA9IDB4MDAyMDAwMDAsCS8qIGxvY2FsIGJ1cyBkaXJlY3Qgc2xhdmUgZ2l2ZSB1cCBidXMgbW9kZSAqLworCU1BUkJfRFNfTExPQ0tfRU5BQkxFID0gMHgwMDQwMDAwMCwJLyogZGlyZWN0IHNsYXZlIExMT0NLbyMgZW5hYmxlICovCisJTUFSQl9QQ0lfUkVRVUVTVF9NT0RFID0gMHgwMDgwMDAwMCwKKwlNQVJCX1BDSXYyMV9NT0RFID0gMHgwMTAwMDAwMCwJLyogcGNpIHNwZWNpZmljYXRpb24gdjIuMSBtb2RlICovCisJTUFSQl9QQ0lfUkVBRF9OT19XUklURV9NT0RFID0gMHgwMjAwMDAwMCwKKwlNQVJCX1BDSV9SRUFEX1dJVEhfV1JJVEVfRkxVU0hfTU9ERSA9IDB4MDQwMDAwMDAsCisJTUFSQl9HQVRFX1RJTUVSX1dJVEhfQlJFUSA9IDB4MDgwMDAwMDAsCS8qIGdhdGUgbG9jYWwgYnVzIGxhdGVuY3kgdGltZXIgd2l0aCBCUkVRICovCisJTUFSQl9QQ0lfUkVBRF9OT19GTFVTSF9NT0RFID0gMHgxMDAwMDAwMCwKKwlNQVJCX1VTRV9TVUJTWVNURU1fSURTID0gMHgyMDAwMDAwMCwKK307CisKKyNkZWZpbmUgUExYX0JJR0VORF9SRUcgMHhjCitlbnVtIGJpZ2VuZF9iaXRzIHsKKwlCSUdFTkRfQ09ORklHID0gMHgxLAkvKiB1c2UgYmlnIGVuZGlhbiBvcmRlcmluZyBmb3IgY29uZmlndXJhdGlvbiByZWdpc3RlciBhY2Nlc3NlcyAqLworCUJJR0VORF9ESVJFQ1RfTUFTVEVSID0gMHgyLAorCUJJR0VORF9ESVJFQ1RfU0xBVkVfTE9DQUwwID0gMHg0LAorCUJJR0VORF9ST00gPSAweDgsCisJQklHRU5EX0JZVEVfTEFORSA9IDB4MTAsCS8qIHVzZSBieXRlIGxhbmUgY29uc2lzdGluZyBvZiBtb3N0IHNpZ25pZmljYW50IGJpdHMgaW5zdGVhZCBvZiBsZWFzdCBzaWduaWZpY2FudCAqLworCUJJR0VORF9ESVJFQ1RfU0xBVkVfTE9DQUwxID0gMHgyMCwKKwlCSUdFTkRfRE1BMSA9IDB4NDAsCisJQklHRU5EX0RNQTAgPSAweDgwLAorfTsKKworLyogTm90ZTogVGhlIEV4cGFuc2lvbiBST00gIHN0dWZmIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIFBDIGVudmlyb25tZW50LgorKiogICAgICAgVGhpcyBleHBhbnNpb24gUk9NIGNvZGUgaXMgZXhlY3V0ZWQgYnkgdGhlIGhvc3QgQ1BVIGF0IGJvb3QgdGltZS4KKyoqICAgICAgIEZvciB0aGlzIHJlYXNvbiBubyBiaXQgZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIGhlcmUuCisqLworI2RlZmluZSBQTFhfUk9NUk5HX1JFRyAgICAgICAgIDB4MDAxMAkvKiBMLCBFeHBuIFJPTSBTcGFjZSBSYW5nZSBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfUk9NTUFQX1JFRyAgICAgICAgIDB4MDAxNAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIFJhbmdlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUExYX1JFR0lPTjBfUkVHICAgICAgICAgMHgwMDE4CS8qIEwsIExvY2FsIEJ1cyBSZWdpb24gMCBEZXNjcmlwdG9yICovCisjZGVmaW5lICBSR05fV0lEVEggICAgICAgICAweDAwMDAwMDAyCS8qIExvY2FsIGJ1cyB3aWR0aCBiaXRzICovCisjZGVmaW5lICBSR05fOEJJVFMgICAgICAgICAweDAwMDAwMDAwCS8qIDA4IGJpdCBMb2NhbCBCdXMgKi8KKyNkZWZpbmUgIFJHTl8xNkJJVFMgICAgICAgIDB4MDAwMDAwMDEJLyogMTYgYml0IExvY2FsIEJ1cyAqLworI2RlZmluZSAgUkdOXzMyQklUUyAgICAgICAgMHgwMDAwMDAwMgkvKiAzMiBiaXQgTG9jYWwgQnVzICovCisjZGVmaW5lICBSR05fTVdTICAgICAgICAgICAweDAwMDAwMDNDCS8qIE1lbW9yeSBBY2Nlc3MgV2FpdCBTdGF0ZXMgKi8KKyNkZWZpbmUgIFJHTl8wTVdTICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgIFJHTl8xTVdTICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJHTl8yTVdTICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJHTl8zTVdTICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgIFJHTl80TVdTICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJHTl82TVdTICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgIFJHTl84TVdTICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJHTl9NUkUgICAgICAgICAgIDB4MDAwMDAwNDAJLyogTWVtb3J5IFNwYWNlIFJlYWR5IElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX01CRSAgICAgICAgICAgMHgwMDAwMDA4MAkvKiBNZW1vcnkgU3BhY2UgQnRlcm0gSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fUkVBRF9QUkVGRVRDSF9ESVNBQkxFIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFJHTl9ST01fUFJFRkVUQ0hfRElTQUJMRSAweDAwMDAwMjAwCisjZGVmaW5lICBSR05fUkVBRF9QUkVGRVRDSF9DT1VOVF9FTkFCTEUgMHgwMDAwMDQwMAorI2RlZmluZSAgUkdOX1JXUyAgICAgICAgICAgMHgwMDNDMDAwMAkvKiBFeHBuIFJPTSBXYWl0IFN0YXRlcyAqLworI2RlZmluZSAgUkdOX1JSRSAgICAgICAgICAgMHgwMDQwMDAwMAkvKiBST00gU3BhY2UgUmVhZHkgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fUkJFICAgICAgICAgICAweDAwODAwMDAwCS8qIFJPTSBTcGFjZSBCdGVybSBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9NQkVOICAgICAgICAgIDB4MDEwMDAwMDAJLyogTWVtb3J5IFNwYWNlIEJ1cnN0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX1JCRU4gICAgICAgICAgMHgwNDAwMDAwMAkvKiBST00gU3BhY2UgQnVyc3QgRW5hYmxlICovCisjZGVmaW5lICBSR05fVEhST1QgICAgICAgICAweDA4MDAwMDAwCS8qIERlLWFzc2VydCBUUkRZIHdoZW4gRklGTyBmdWxsICovCisjZGVmaW5lICBSR05fVFJEICAgICAgICAgICAweEYwMDAwMDAwCS8qIFRhcmdldCBSZWFkeSBEZWxheSAvOCAqLworCisjZGVmaW5lIFBMWF9SRUdJT04xX1JFRyAgICAgICAgIDB4MDBmOAkvKiBMLCBMb2NhbCBCdXMgUmVnaW9uIDEgRGVzY3JpcHRvciAqLworCisjZGVmaW5lIFBMWF9ETVJOR19SRUcgICAgICAgICAgMHgwMDFDCS8qIEwsIERpcmVjdCBNYXN0ZXIgUmFuZ2UgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTFhfTEJBUE1FTV9SRUcgICAgICAgIDB4MDAyMAkvKiBMLCBMY2wgQmFzZSBBZGRyIGZvciBQQ0kgbWVtIHNwYWNlICovCisKKyNkZWZpbmUgUExYX0xCQVBJT19SRUcgICAgICAgICAweDAwMjQJLyogTCwgTGNsIEJhc2UgQWRkciBmb3IgUENJIEkvTyBzcGFjZSAqLworCisjZGVmaW5lIFBMWF9ETU1BUF9SRUcgICAgICAgICAgMHgwMDI4CS8qIEwsIERpcmVjdCBNYXN0ZXIgUmVtYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIERNTV9NQUUgICAgICAgICAgIDB4MDAwMDAwMDEJLyogRGlyZWN0IE1zdHIgTWVtb3J5IEFjYyBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9JQUUgICAgICAgICAgIDB4MDAwMDAwMDIJLyogRGlyZWN0IE1zdHIgSS9PIEFjYyBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9MQ0sgICAgICAgICAgIDB4MDAwMDAwMDQJLyogTE9DSyBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9QRjQgICAgICAgICAgIDB4MDAwMDAwMDgJLyogUHJlZmV0Y2ggNCBNb2RlIEVuYWJsZSAqLworI2RlZmluZSAgRE1NX1RIUk9UICAgICAgICAgMHgwMDAwMDAxMAkvKiBBc3NlcnQgSVJEWSB3aGVuIHJlYWQgRklGTyBmdWxsICovCisjZGVmaW5lICBETU1fUEFGMCAgICAgICAgICAweDAwMDAwMDAwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjEgICAgICAgICAgMHgwMDAwMDAyMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUYyICAgICAgICAgIDB4MDAwMDAwNDAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGMyAgICAgICAgICAweDAwMDAwMDYwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjQgICAgICAgICAgMHgwMDAwMDA4MAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUY1ICAgICAgICAgIDB4MDAwMDAwQTAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGNiAgICAgICAgICAweDAwMDAwMEMwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjcgICAgICAgICAgMHgwMDAwMDBEMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9NQVAgICAgICAgICAgIDB4RkZGRjAwMDAJLyogUmVtYXAgQWRkcmVzcyBCaXRzICovCisKKyNkZWZpbmUgUExYX0NBUl9SRUcgICAgICAgICAgICAweDAwMkMJLyogTCwgQ29uZmlndXJhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lICBDQVJfQ1QwICAgICAgICAgICAweDAwMDAwMDAwCS8qIENvbmZpZyBUeXBlIDAgKi8KKyNkZWZpbmUgIENBUl9DVDEgICAgICAgICAgIDB4MDAwMDAwMDEJLyogQ29uZmlnIFR5cGUgMSAqLworI2RlZmluZSAgQ0FSX1JFRyAgICAgICAgICAgMHgwMDAwMDBGQwkvKiBSZWdpc3RlciBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0ZVTiAgICAgICAgICAgMHgwMDAwMDcwMAkvKiBGdW5jdGlvbiBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0RFViAgICAgICAgICAgMHgwMDAwRjgwMAkvKiBEZXZpY2UgTnVtYmVyIEJpdHMgKi8KKyNkZWZpbmUgIENBUl9CVVMgICAgICAgICAgIDB4MDBGRjAwMDAJLyogQnVzIE51bWJlciBCaXRzICovCisjZGVmaW5lICBDQVJfQ0ZHICAgICAgICAgICAweDgwMDAwMDAwCS8qIENvbmZpZyBTcGMgQWNjZXNzIEVuYWJsZSAqLworCisjZGVmaW5lIFBMWF9EQlJfSU5fUkVHICAgICAgICAgMHgwMDYwCS8qIEwsIFBDSSB0byBMb2NhbCBEb29yYmVsbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9EQlJfT1VUX1JFRyAgICAgICAgMHgwMDY0CS8qIEwsIExvY2FsIHRvIFBDSSBEb29yYmVsbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9JTlRSQ1NfUkVHICAgICAgICAgMHgwMDY4CS8qIEwsIEludGVycnVwdCBDb250cm9sL1N0YXR1cyBSZWcgKi8KKyNkZWZpbmUgIElDU19BRVJSICAgICAgICAgIDB4MDAwMDAwMDEJLyogQXNzZXJ0IExTRVJSIG9uIEFCT1JUICovCisjZGVmaW5lICBJQ1NfUEVSUiAgICAgICAgICAweDAwMDAwMDAyCS8qIEFzc2VydCBMU0VSUiBvbiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgIElDU19TRVJSICAgICAgICAgIDB4MDAwMDAwMDQJLyogR2VuZXJhdGUgUENJIFNFUlIjICovCisjZGVmaW5lICBJQ1NfTUJJRSAgICAgICAgICAweDAwMDAwMDA4CS8vIG1haWxib3ggaW50ZXJydXB0IGVuYWJsZQorI2RlZmluZSAgSUNTX1BJRSAgICAgICAgICAgMHgwMDAwMDEwMAkvKiBQQ0kgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BESUUgICAgICAgICAgMHgwMDAwMDIwMAkvKiBQQ0kgRG9vcmJlbGwgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BBSUUgICAgICAgICAgMHgwMDAwMDQwMAkvKiBQQ0kgQWJvcnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BMSUUgICAgICAgICAgMHgwMDAwMDgwMAkvKiBQQ0kgTG9jYWwgSW50IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1JBRSAgICAgICAgICAgMHgwMDAwMTAwMAkvKiBSZXRyeSBBYm9ydCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19QRElBICAgICAgICAgIDB4MDAwMDIwMDAJLyogUENJIERvb3JiZWxsIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19QQUlBICAgICAgICAgIDB4MDAwMDQwMDAJLyogUENJIEFib3J0IEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19MSUEgICAgICAgICAgIDB4MDAwMDgwMDAJLyogTG9jYWwgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0xJRSAgICAgICAgICAgMHgwMDAxMDAwMAkvKiBMb2NhbCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfTERJRSAgICAgICAgICAweDAwMDIwMDAwCS8qIExvY2FsIERvb3JiZWxsIEludCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19ETUEwX0UgICAgICAgIDB4MDAwNDAwMDAJLyogRE1BICMwIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19ETUExX0UgICAgICAgIDB4MDAwODAwMDAJLyogRE1BICMxIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19MRElBICAgICAgICAgIDB4MDAxMDAwMDAJLyogTG9jYWwgRG9vcmJlbGwgSW50IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0RNQTBfQSAgICAgICAgMHgwMDIwMDAwMAkvKiBETUEgIzAgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0RNQTFfQSAgICAgICAgMHgwMDQwMDAwMAkvKiBETUEgIzEgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0JJQSAgICAgICAgICAgMHgwMDgwMDAwMAkvKiBCSVNUIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19UQV9ETSAgICAgICAgIDB4MDEwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gRGlyZWN0IE1hc3RlciAqLworI2RlZmluZSAgSUNTX1RBX0RNQTAgICAgICAgMHgwMjAwMDAwMAkvKiBUYXJnZXQgQWJvcnQgLSBETUEgIzAgKi8KKyNkZWZpbmUgIElDU19UQV9ETUExICAgICAgIDB4MDQwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gRE1BICMxICovCisjZGVmaW5lICBJQ1NfVEFfUkEgICAgICAgICAweDA4MDAwMDAwCS8qIFRhcmdldCBBYm9ydCAtIFJldHJ5IFRpbWVvdXQgKi8KKyNkZWZpbmUgIElDU19NQklBKHgpICAgICAgICgweDEwMDAwMDAwIDw8ICgoeCkgJiAweDMpKQkvLyBtYWlsYm94IHggaXMgYWN0aXZlCisKKyNkZWZpbmUgUExYX0NPTlRST0xfUkVHICAgICAgICAweDAwNkMJLyogTCwgRUVQUk9NIENudGwgJiBQQ0kgQ21kIENvZGVzICovCisjZGVmaW5lICBDVExfUkRNQSAgICAgICAgICAweDAwMDAwMDBFCS8qIERNQSBSZWFkIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9XRE1BICAgICAgICAgIDB4MDAwMDAwNzAJLyogRE1BIFdyaXRlIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9STUVNICAgICAgICAgIDB4MDAwMDA2MDAJLyogTWVtb3J5IFJlYWQgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1dNRU0gICAgICAgICAgMHgwMDAwNzAwMAkvKiBNZW1vcnkgV3JpdGUgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1VTRVJPICAgICAgICAgMHgwMDAxMDAwMAkvKiBVU0VSTyBvdXRwdXQgcGluIGNvbnRyb2wgYml0ICovCisjZGVmaW5lICBDVExfVVNFUkkgICAgICAgICAweDAwMDIwMDAwCS8qIFVTRVJJIGlucHV0IHBpbiBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRV9DTEsgICAgICAgIDB4MDEwMDAwMDAJLyogRUVQUk9NIENsb2NrIGxpbmUgKi8KKyNkZWZpbmUgIENUTF9FRV9DUyAgICAgICAgIDB4MDIwMDAwMDAJLyogRUVQUk9NIENoaXAgU2VsZWN0ICovCisjZGVmaW5lICBDVExfRUVfVyAgICAgICAgICAweDA0MDAwMDAwCS8qIEVFUFJPTSBXcml0ZSBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRV9SICAgICAgICAgIDB4MDgwMDAwMDAJLyogRUVQUk9NIFJlYWQgYml0ICovCisjZGVmaW5lICBDVExfRUVDSEsgICAgICAgICAweDEwMDAwMDAwCS8qIEVFUFJPTSBQcmVzZW50IGJpdCAqLworI2RlZmluZSAgQ1RMX0VFUkxEICAgICAgICAgMHgyMDAwMDAwMAkvKiBFRVBST00gUmVsb2FkIFJlZ2lzdGVyICovCisjZGVmaW5lICBDVExfUkVTRVQgICAgICAgICAweDQwMDAwMDAwCS8qICEhIEFkYXB0ZXIgUmVzZXQgISEgKi8KKyNkZWZpbmUgIENUTF9SRUFEWSAgICAgICAgIDB4ODAwMDAwMDAJLyogTG9jYWwgSW5pdCBEb25lICovCisKKyNkZWZpbmUgUExYX0lEX1JFRwkweDcwCS8vIGhhcmQtY29kZWQgcGx4IHZlbmRvciBhbmQgZGV2aWNlIGlkcworCisjZGVmaW5lIFBMWF9SRVZJU0lPTl9SRUcJMHg3NAkvLyBzaWxpY29uIHJldmlzaW9uCisKKyNkZWZpbmUgUExYX0RNQTBfTU9ERV9SRUcJMHg4MAkvLyBkbWEgY2hhbm5lbCAwIG1vZGUgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0RNQTFfTU9ERV9SRUcJMHg5NAkvLyBkbWEgY2hhbm5lbCAwIG1vZGUgcmVnaXN0ZXIKKyNkZWZpbmUgIFBMWF9MT0NBTF9CVVNfMTZfV0lERV9CSVRTCTB4MQorI2RlZmluZSAgUExYX0xPQ0FMX0JVU18zMl9XSURFX0JJVFMJMHgzCisjZGVmaW5lICBQTFhfTE9DQUxfQlVTX1dJRFRIX01BU0sJMHgzCisjZGVmaW5lICBQTFhfRE1BX0VOX1JFQURZSU5fQklUCTB4NDAJLy8gZW5hYmxlIHJlYWR5IGluIGlucHV0CisjZGVmaW5lICBQTFhfRU5fQlRFUk1fQklUCTB4ODAJLy8gZW5hYmxlIEJURVJNIyBpbnB1dAorI2RlZmluZSAgUExYX0RNQV9MT0NBTF9CVVJTVF9FTl9CSVQJMHgxMDAJLy8gZW5hYmxlIGxvY2FsIGJ1cnN0IG1vZGUKKyNkZWZpbmUgIFBMWF9FTl9DSEFJTl9CSVQJMHgyMDAJLy8gZW5hYmxlcyBjaGFpbmluZworI2RlZmluZSAgUExYX0VOX0RNQV9ET05FX0lOVFJfQklUCTB4NDAwCS8vIGVuYWJsZXMgaW50ZXJydXB0IG9uIGRtYSBkb25lCisjZGVmaW5lICBQTFhfTE9DQUxfQUREUl9DT05TVF9CSVQJMHg4MDAJLy8gaG9sZCBsb2NhbCBhZGRyZXNzIGNvbnN0YW50IChkb24ndCBpbmNyZW1lbnQpCisjZGVmaW5lICBQTFhfREVNQU5EX01PREVfQklUCTB4MTAwMAkvLyBlbmFibGVzIGRlbWFuZC1tb2RlIGZvciBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9FT1RfRU5BQkxFX0JJVAkweDQwMDAKKyNkZWZpbmUgIFBMWF9TVE9QX01PREVfQklUIDB4ODAwMAorI2RlZmluZSAgUExYX0RNQV9JTlRSX1BDSV9CSVQJMHgyMDAwMAkvLyByb3V0ZXMgZG1hIGludGVycnVwdCB0byBwY2kgYnVzIChpbnN0ZWFkIG9mIGxvY2FsIGJ1cykKKworI2RlZmluZSBQTFhfRE1BMF9QQ0lfQUREUkVTU19SRUcJMHg4NAkvLyBwY2kgYWRkcmVzcyB0aGF0IGRtYSB0cmFuc2ZlcnMgc3RhcnQgYXQKKyNkZWZpbmUgUExYX0RNQTFfUENJX0FERFJFU1NfUkVHCTB4OTgKKworI2RlZmluZSBQTFhfRE1BMF9MT0NBTF9BRERSRVNTX1JFRwkweDg4CS8vIGxvY2FsIGFkZHJlc3MgdGhhdCBkbWEgdHJhbnNmZXJzIHN0YXJ0IGF0CisjZGVmaW5lIFBMWF9ETUExX0xPQ0FMX0FERFJFU1NfUkVHCTB4OWMKKworI2RlZmluZSBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRwkweDhjCS8vIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciAoZmlyc3QgMjMgYml0cykKKyNkZWZpbmUgUExYX0RNQTFfVFJBTlNGRVJfU0laRV9SRUcJMHhhMAorCisjZGVmaW5lIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHCTB4OTAJLy8gZGVzY3JpcHRvciBwb2ludGVyIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9ETUExX0RFU0NSSVBUT1JfUkVHCTB4YTQKKyNkZWZpbmUgIFBMWF9ERVNDX0lOX1BDSV9CSVQJMHgxCS8vIGRlc2NyaXB0b3IgaXMgbG9jYXRlZCBpbiBwY2kgc3BhY2UgKG5vdCBsb2NhbCBzcGFjZSkKKyNkZWZpbmUgIFBMWF9FTkRfT0ZfQ0hBSU5fQklUCTB4MgkvLyBlbmQgb2YgY2hhaW4gYml0CisjZGVmaW5lICBQTFhfSU5UUl9URVJNX0NPVU5UCTB4NAkvLyBpbnRlcnJ1cHQgd2hlbiB0aGlzIGRlc2NyaXB0b3IncyB0cmFuc2ZlciBpcyBmaW5pc2hlZAorI2RlZmluZSAgUExYX1hGRVJfTE9DQUxfVE9fUENJIDB4OAkvLyB0cmFuc2ZlciBmcm9tIGxvY2FsIHRvIHBjaSBidXMgKG5vdCBwY2kgdG8gbG9jYWwpCisKKyNkZWZpbmUgUExYX0RNQTBfQ1NfUkVHCTB4YTgJLy8gY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0RNQTFfQ1NfUkVHCTB4YTkKKyNkZWZpbmUgIFBMWF9ETUFfRU5fQklUCTB4MQkvLyBlbmFibGUgZG1hIGNoYW5uZWwKKyNkZWZpbmUgIFBMWF9ETUFfU1RBUlRfQklUCTB4MgkvLyBzdGFydCBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9ETUFfQUJPUlRfQklUCTB4NAkvLyBhYm9ydCBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQJMHg4CS8vIGNsZWFyIGRtYSBpbnRlcnJ1cHQKKyNkZWZpbmUgIFBMWF9ETUFfRE9ORV9CSVQJMHgxMAkvLyB0cmFuc2ZlciBkb25lIHN0YXR1cyBiaXQKKworI2RlZmluZSBQTFhfRE1BMF9USFJFU0hPTERfUkVHCTB4YjAJLy8gY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKworLyoKKyAqIEFjY2Vzc2VzIG5lYXIgdGhlIGVuZCBvZiBtZW1vcnkgY2FuIGNhdXNlIHRoZSBQTFggY2hpcAorICogdG8gcHJlLWZldGNoIGRhdGEgb2ZmIG9mIGVuZC1vZi1yYW0uICBMaW1pdCB0aGUgc2l6ZSBvZgorICogbWVtb3J5IHNvIGhvc3Qtc2lkZSBhY2Nlc3NlcyBjYW5ub3Qgb2NjdXIuCisgKi8KKworI2RlZmluZSBQTFhfUFJFRkVUQ0ggICAzMgorCisvKgorICogVGhlIFBDSSBJbnRlcmZhY2UsIHZpYSB0aGUgUENJLTkwNjAgQ2hpcCwgaGFzIHVwIHRvIGVpZ2h0ICg4KSBNYWlsYm94CisgKiBSZWdpc3RlcnMuICBUaGUgUFVUUyAoUG93ZXItVXAgVGVzdCBTdWl0ZSkgaGFuZGxlcyB0aGUgYm9hcmQtc2lkZQorICogaW50ZXJmYWNlL2ludGVyYWN0aW9uIHVzaW5nIHRoZSBmaXJzdCA0IHJlZ2lzdGVycy4gIFNwZWNpZmljYXRpb25zIGZvcgorICogdGhlIHVzZSBvZiB0aGUgZnVsbCBQVVRTJyBjb21tYW5kIGFuZCBzdGF0dXMgaW50ZXJmYWNlIGlzIGNvbnRhaW5lZAorICogd2l0aGluIGEgc2VwYXJhdGUgU0JFIFBVVFMgTWFudWFsLiAgVGhlIEhvc3QtU2lkZSBEZXZpY2UgRHJpdmVyIG9ubHkKKyAqIHVzZXMgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgUFVUUyBpbnRlcmZhY2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMoLTEpIC0gTUVNIEFDQ0VTUyBTVFMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9TVFNfVkFMSUQgICAgICAweDU3NTg0NzQ0CS8qICdXWEdEJyAqLworI2RlZmluZSBNQlhfU1RTX0RJTEFWICAgICAgMHg0NDQ3NTg1NwkvKiBzd2FwcGVkID0gJ0RHWFcnICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMCAgLSAgUFVUUyBTVEFUVVMgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfU1RTX01BU0sgICAgICAgMHgwMDAwMDBmZgkvKiBQVVRTIFN0YXR1cyBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1CWF9TVFNfVE1BU0sgICAgICAweDAwMDAwMDBmCS8qIHJlZ2lzdGVyIGJpdHMgZm9yIFRFU1QgbnVtYmVyICovCisKKyNkZWZpbmUgTUJYX1NUU19QQ0lSRVNFVCAgIDB4MDAwMDAxMDAJLyogSG9zdCBpc3N1ZWQgUENJIHJlc2V0IHJlcXVlc3QgKi8KKyNkZWZpbmUgTUJYX1NUU19CVVNZICAgICAgIDB4MDAwMDAwODAJLyogUFVUUyBpcyBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBNQlhfU1RTX0VSUk9SICAgICAgMHgwMDAwMDA0MAkvKiBQVVRTIGhhcyBmYWlsZWQgKi8KKyNkZWZpbmUgTUJYX1NUU19SRVNFUlZFRCAgIDB4MDAwMDAwYzAJLyogVW5kZWZpbmVkIC0+IHN0YXR1cyBpbiB0cmFuc2l0aW9uLgorCQkJCQkgICBXZSBhcmUgaW4gcHJvY2VzcyBvZiBjaGFuZ2luZworCQkJCQkgICBiaXRzOyB3ZSBTRVQgRXJyb3IgYml0IGJlZm9yZQorCQkJCQkgICBSRVNFVCBvZiBCdXN5IGJpdCAqLworCisjZGVmaW5lIE1CWF9SRVNFUlZFRF81ICAgICAweDAwMDAwMDIwCS8qIEZZSTogcmVzZXJ2ZWQvdW51c2VkIGJpdCAqLworI2RlZmluZSBNQlhfUkVTRVJWRURfNCAgICAgMHgwMDAwMDAxMAkvKiBGWUk6IHJlc2VydmVkL3VudXNlZCBiaXQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMSAgLSAgUFVUUyBDT01NQU5EUyAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQW55IGF0dGVtcHQgdG8gZXhlY3V0ZSBhbiB1bmltcGxlbWVudCBjb21tYW5kIHJlc3VsdHMgaW4gdGhlIFBVVFMKKyAqIGludGVyZmFjZSBleGVjdXRpbmcgYSBOT09QIGFuZCBjb250aW51aW5nIGFzIGlmIHRoZSBvZmZlbmRpbmcgY29tbWFuZAorICogY29tcGxldGVkIG5vcm1hbGx5LiAgTm90ZTogdGhpcyBzdXBwbGllcyBhIHNpbXBsZSBtZXRob2QgdG8gaW50ZXJyb2dhdGUKKyAqIG1haWxib3ggY29tbWFuZCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KKworI2RlZmluZSBNQlhfQ01EX01BU0sgICAgICAgMHhmZmZmMDAwMAkvKiBQVVRTIENvbW1hbmQgUmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIE1CWF9DTURfQUJPUlRKICAgICAweDg1MDAwMDAwCS8qIGFib3J0IGFuZCBqdW1wICovCisjZGVmaW5lIE1CWF9DTURfUkVTRVRQICAgICAweDg2MDAwMDAwCS8qIHJlc2V0IGFuZCBwYXVzZSBhdCBzdGFydCAqLworI2RlZmluZSBNQlhfQ01EX1BBVVNFICAgICAgMHg4NzAwMDAwMAkvKiBwYXVzZSBpbW1lZGlhdGVseSAqLworI2RlZmluZSBNQlhfQ01EX1BBVVNFQyAgICAgMHg4ODAwMDAwMAkvKiBwYXVzZSBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lIE1CWF9DTURfUkVTVU1FICAgICAweDg5MDAwMDAwCS8qIHJlc3VtZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgTUJYX0NNRF9TVEVQICAgICAgIDB4OGEwMDAwMDAJLyogc2luZ2xlIHN0ZXAgdGVzdHMgKi8KKworI2RlZmluZSBNQlhfQ01EX0JTV0FQICAgICAgMHg4YzAwMDAwMAkvKiBpZGVudGlmeSBieXRlIHN3YXAgc2NoZW1lICovCisjZGVmaW5lIE1CWF9DTURfQlNXQVBfMCAgICAweDhjMDAwMDAwCS8qIHVzZSBzY2hlbWUgMCAqLworI2RlZmluZSBNQlhfQ01EX0JTV0FQXzEgICAgMHg4YzAwMDAwMQkvKiB1c2Ugc2NoZW1lIDEgKi8KKworI2RlZmluZSBNQlhfQ01EX1NFVEhNUyAgICAgMHg4ZDAwMDAwMAkvKiBzZXR1cCBob3N0IG1lbW9yeSBhY2Nlc3Mgd2luZG93CisJCQkJCSAgIHNpemUgKi8KKyNkZWZpbmUgTUJYX0NNRF9TRVRIQkEgICAgIDB4OGUwMDAwMDAJLyogc2V0dXAgaG9zdCBtZW1vcnkgYWNjZXNzIGJhc2UKKwkJCQkJICAgYWRkcmVzcyAqLworI2RlZmluZSBNQlhfQ01EX01HTyAgICAgICAgMHg4ZjAwMDAwMAkvKiBwZXJmb3JtIG1lbW9yeSBzZXR1cCBhbmQgY29udGludWUKKwkJCQkJICAgKElFLiBEb25lKSAqLworI2RlZmluZSBNQlhfQ01EX05PT1AgICAgICAgMHhGRjAwMDAwMAkvKiBkdW1teSwgaWxsZWdhbCBjb21tYW5kICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMiAgLSAgTUVNT1JZIFNJWkUgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfTUVNU1pfTUFTSyAgICAgMHhmZmZmMDAwMAkvKiBQVVRTIE1lbW9yeSBTaXplIFJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBNQlhfTUVNU1pfMTI4S0IgICAgMHgwMDAyMDAwMAkvKiAxMjgga2lsb2J5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzI1NktCICAgIDB4MDAwNDAwMDAJLyogMjU2IGtpbG9ieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl81MTJLQiAgICAweDAwMDgwMDAwCS8qIDUxMiBraWxvYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfMU1CICAgICAgMHgwMDEwMDAwMAkvKiAxIG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8yTUIgICAgICAweDAwMjAwMDAwCS8qIDIgbWVnYWJ5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzRNQiAgICAgIDB4MDA0MDAwMDAJLyogNCBtZWdhYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfOE1CICAgICAgMHgwMDgwMDAwMAkvKiA4IG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8xNk1CICAgICAweDAxMDAwMDAwCS8qIDE2IG1lZ2FieXRlIGJvYXJkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzIgIC0gIEJPQVJEIFRZUEUgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfQlRZUEVfTUFTSyAgICAgICAgICAweDAwMDBmZmZmCS8qIFBVVFMgQm9hcmQgVHlwZSBSZWdpc3RlciAqLworI2RlZmluZSBNQlhfQlRZUEVfRkFNSUxZX01BU0sgICAweDAwMDBmZjAwCS8qIFBVVFMgQm9hcmQgRmFtaWx5IFJlZ2lzdGVyICovCisjZGVmaW5lIE1CWF9CVFlQRV9TVUJUWVBFX01BU0sgIDB4MDAwMDAwZmYJLyogUFVUUyBCb2FyZCBTdWJ0eXBlICovCisKKyNkZWZpbmUgTUJYX0JUWVBFX1BMWDkwNjAgICAgICAgMHgwMDAwMDEwMAkvKiBQTFggZmFtaWx5IHR5cGUgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1BMWDkwODAgICAgICAgMHgwMDAwMDMwMAkvKiBQTFggd2FuWEwxMDBzIGZhbWlseSB0eXBlICovCisKKyNkZWZpbmUgTUJYX0JUWVBFX1dBTlhMXzQgICAgICAgMHgwMDAwMDEwNAkvKiB3YW5YTDQwMCwgNC1wb3J0ICovCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF8yICAgICAgIDB4MDAwMDAxMDIJLyogd2FuWEwyMDAsIDItcG9ydCAqLworI2RlZmluZSBNQlhfQlRZUEVfV0FOWExfMXMgICAgICAweDAwMDAwMzAxCS8qIHdhblhMMTAwcywgMS1wb3J0ICovCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF8xdCAgICAgIDB4MDAwMDA0MDEJLyogd2FuWEwxMDBUMSwgMS1wb3J0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMyAgLSAgU0hNUSBNQUlMQk9YICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfU01CWF9NQVNLICAgICAgICAgICAweDAwMDAwMGZmCS8qIFBVVFMgU0hNUSBNYWlsYm94IGJpdHMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgR0VORVJJQyBIT1NULVNJREUgRFJJVkVSICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9FUlIgICAgMAorI2RlZmluZSBNQlhfT0sgICAgIDEKKworLyogbWFpbGJveCBjaGVjayByb3V0aW5lIC0gdHlwZSBvZiB0ZXN0aW5nICovCisjZGVmaW5lIE1CWENIS19TVFMgICAgICAweDAwCS8qIGNoZWNrIGZvciBQVVRTIHN0YXR1cyAqLworI2RlZmluZSBNQlhDSEtfTk9XQUlUICAgMHgwMQkvKiBkb250IGNhcmUgYWJvdXQgUFVUUyBzdGF0dXMgKi8KKworLyogc3lzdGVtIGFsbG9jYXRlcyB0aGlzIG1hbnkgYnl0ZXMgZm9yIGFkZHJlc3MgbWFwcGluZyBtYWlsYm94IHNwYWNlICovCisjZGVmaW5lIE1CWF9BRERSX1NQQUNFXzM2MCAweDgwCS8qIHdhblhMMTAwcy8yMDAvNDAwICovCisjZGVmaW5lIE1CWF9BRERSX01BU0tfMzYwIChNQlhfQUREUl9TUEFDRV8zNjAtMSkKKworc3RhdGljIGlubGluZSBpbnQgcGx4OTA4MF9hYm9ydF9kbWEodm9pZCAqaW9iYXNlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkICpkbWFfY3NfYWRkcjsKKwl1aW50OF90IGRtYV9zdGF0dXM7CisJY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjaGFubmVsKQorCQlkbWFfY3NfYWRkciA9IGlvYmFzZSArIFBMWF9ETUExX0NTX1JFRzsKKwllbHNlCisJCWRtYV9jc19hZGRyID0gaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHOworCisJLy8gYWJvcnQgZG1hIHRyYW5zZmVyIGlmIG5lY2Vzc2FyeQorCWRtYV9zdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJaWYgKChkbWFfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCS8vIHdhaXQgdG8gbWFrZSBzdXJlIGRvbmUgYml0IGlzIHplcm8KKwlmb3IgKGkgPSAwOyAoZG1hX3N0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpICYmIGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJY29tZWRpX3VkZWxheSgxKTsKKwkJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkgeworCQlydF9wcmludGsKKwkJCSgicGx4OTA4MDogY2FuY2VsKCkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGRtYSAlaSBkb25lIGNsZWFyXG4iLAorCQkJY2hhbm5lbCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwkvLyBkaXNhYmxlIGFuZCBhYm9ydCBjaGFubmVsCisJd3JpdGViKFBMWF9ETUFfQUJPUlRfQklULCBkbWFfY3NfYWRkcik7CisJLy8gd2FpdCBmb3IgZG1hIGRvbmUgYml0CisJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlmb3IgKGkgPSAwOyAoZG1hX3N0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpID09IDAgJiYgaSA8IHRpbWVvdXQ7IGkrKykgeworCQljb21lZGlfdWRlbGF5KDEpOworCQlkbWFfc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCXJ0X3ByaW50aworCQkJKCJwbHg5MDgwOiBjYW5jZWwoKSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgc2V0XG4iLAorCQkJY2hhbm5lbCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX19DT01FRElfUExYOTA4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkNTI0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtMCwwICsxLDIyODMgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKKyAgICBDb21lZGkgZHJpdmVyIGZvciBSZWFsIFRpbWUgRGV2aWNlcyAoUlREKSBQQ0k0NTIwL0RNNzUyMAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKy8qCitEcml2ZXI6IHJ0ZDUyMAorRGVzY3JpcHRpb246IFJlYWwgVGltZSBEZXZpY2VzIFBDSTQ1MjAvRE03NTIwCitBdXRob3I6IERhbiBDaHJpc3RpYW4KK0RldmljZXM6IFtSZWFsIFRpbWUgRGV2aWNlc10gRE03NTIwSFItMSAocnRkNTIwKSwgRE03NTIwSFItOCwKKyAgUENJNDUyMCwgUENJNDUyMC04CitTdGF0dXM6IFdvcmtzLiAgT25seSB0ZXN0ZWQgb24gRE03NTIwLTguICBOb3QgU01QIHNhZmUuCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgWzBdIC0gUENJIGJ1cyBvZiBkZXZpY2UgKG9wdGlvbmFsKQorICAgICAgICAgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCisgICAgICAgICAgZGV2aWNlIHdpbGwgYmUgdXNlZC4KKyAgWzFdIC0gUENJIHNsb3Qgb2YgZGV2aWNlIChvcHRpb25hbCkKKyovCisvKgorICAgIENyZWF0ZWQgYnkgRGFuIENocmlzdGlhbiwgTkFTQSBBbWVzIFJlc2VhcmNoIENlbnRlci4KKworICAgIFRoZSBQQ0k0NTIwIGlzIGEgUENJIGNhcmQuICBUaGUgRE03NTIwIGlzIGEgUEMvMTA0LXBsdXMgY2FyZC4KKyAgICBCb3RoIGhhdmU6CisgICAgOC8xNiAxMiBiaXQgQURDIHdpdGggRklGTyBhbmQgY2hhbm5lbCBnYWluIHRhYmxlCisgICAgOCBiaXRzIGhpZ2ggc3BlZWQgZGlnaXRhbCBvdXQgKGZvciBleHRlcm5hbCBNVVgpIChvciA4IGluIG9yIDggb3V0KQorICAgIDggYml0cyBoaWdoIHNwZWVkIGRpZ2l0YWwgaW4gd2l0aCBGSUZPIGFuZCBpbnRlcnJ1cHQgb24gY2hhbmdlIChvciA4IElPKQorICAgIDIgMTIgYml0IERBQ3Mgd2l0aCBGSUZPcworICAgIDIgYml0cyBvdXRwdXQKKyAgICAyIGJpdHMgaW5wdXQKKyAgICBidXMgbWFzdGVyaW5nIERNQQorICAgIHRpbWVyczogQURDIHNhbXBsZSwgcGFjZXIsIGJ1cnN0LCBhYm91dCwgZGVsYXksIERBMSwgREEyCisgICAgc2FtcGxlIGNvdW50ZXIKKyAgICAzIHVzZXIgdGltZXIvY291bnRlcnMgKDgyNTQpCisgICAgZXh0ZXJuYWwgaW50ZXJydXB0CisKKyAgICBUaGUgRE03NTIwIGhhcyBzbGlnaHRseSBmZXdlciBmZWF0dXJlcyAoZmV3ZXIgZ2FpbiBzdGVwcykuCisKKyAgICBUaGVzZSBib2FyZHMgY2FuIHN1cHBvcnQgZXh0ZXJuYWwgbXVsdGlwbGV4b3JzIGFuZCBtdWx0aS1ib2FyZAorICAgIHN5bmNocm9uaXphdGlvbiwgYnV0IHRoaXMgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGF0LgorCisgICAgQm9hcmQgZG9jczogaHR0cDovL3d3dy5ydGR1c2EuY29tL1BDMTA0L0RNL2FuYWxvZyUyMElPL2RtNzUyMC5odG0KKyAgICBEYXRhIHNoZWV0OiBodHRwOi8vd3d3LnJ0ZHVzYS5jb20vcGRmL2RtNzUyMC5wZGYKKyAgICBFeGFtcGxlIHNvdXJjZTogaHR0cDovL3d3dy5ydGR1c2EuY29tL2V4YW1wbGVzL2RtL2RtNzUyMC56aXAKKyAgICBDYWxsIHRoZW0gYW5kIGFzayBmb3IgdGhlIHJlZ2lzdGVyIGxldmVsIG1hbnVhbC4KKyAgICBQQ0kgY2hpcDogaHR0cDovL3d3dy5wbHh0ZWNoLmNvbS9wcm9kdWN0cy90b29sYm94LzkwODAuaHRtCisKKyAgICBOb3RlczoKKyAgICBUaGlzIGJvYXJkIGlzIG1lbW9yeSBtYXBwZWQuICBUaGVyZSBpcyBzb21lIElPIHN0dWZmLCBidXQgaXQgaXNuJ3QgbmVlZGVkLgorCisgICAgSSB1c2UgYSBwcmV0dHkgbG9vc2UgbmFtaW5nIHN0eWxlIHdpdGhpbiB0aGUgZHJpdmVyIChydGRfYmxhaCkuCisgICAgQWxsIGV4dGVybmFsbHkgdmlzaWJsZSBuYW1lcyBzaG91bGQgYmUgcnRkNTIwX2JsYWguCisgICAgSSB1c2UgY2FtZWxDYXNlIGZvciBzdHJ1Y3R1cmVzIChhbmQgaW5zaWRlIHRoZW0pLgorICAgIEkgbWF5IGFsc28gdXNlIHVwcGVyIENhbWVsQ2FzZSBmb3IgZnVuY3Rpb24gbmFtZXMgKG9sZCBoYWJpdCkuCisKKyAgICBUaGlzIGJvYXJkIGlzIHNvbWV3aGF0IHJlbGF0ZWQgdG8gdGhlIFJURCBQQ0k0NDAwIGJvYXJkLgorCisgICAgSSBib3Jyb3dlZCBoZWF2aWx5IGZyb20gdGhlIG5pX21pb19jb21tb24sIG5pX2F0bWlvMTZkLCBtaXRlLCBhbmQKKyAgICBkYXMxODAwLCBzaW5jZSB0aGV5IGhhdmUgdGhlIGJlc3QgZG9jdW1lbnRlZCBjb2RlLiAgRHJpdmVyCisgICAgY2JfcGNpZGFzNjQuYyB1c2VzIHRoZSBzYW1lIERNQSBjb250cm9sbGVyLgorCisgICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZSBBYm91dCBpbnRlcnJ1cHQgZG9lc250IHdvcmsgaWYgU2FtcGxlIGlzCisgICAgYWxzbyBlbmFibGVkLiAgSXQgdHVybnMgb3V0IHRoYXQgQWJvdXQgcmVhbGx5IGlzbid0IG5lZWRlZCwgc2luY2UKKyAgICB3ZSBhbHdheXMgY291bnQgZG93biBzYW1wbGVzIHJlYWQuCisKKyAgICBUaGVyZSB3YXMgc29tZSB0aW1lci9jb3VudGVyIGNvZGUsIGJ1dCBpdCBkaWRuJ3QgZm9sbG93IHRoZSByaWdodCBBUEkuCisKKyovCisKKy8qCisgIGRyaXZlciBzdGF0dXM6CisKKyAgQW5hbG9nLUluIHN1cHBvcnRzIGluc3RydWN0aW9uIGFuZCBjb21tYW5kIG1vZGUuCisKKyAgV2l0aCBETUEsIHlvdSBjYW4gc2FtcGxlIGF0IDEuMTVNaHogd2l0aCA3MCUgaWRsZSBvbiBhIDQwME1oeiBLNi0yCisgIChzaW5nbGUgY2hhbm5lbCwgNjRLIHJlYWQgYnVmZmVyKS4gIEkgZ2V0IHJhbmRvbSBzeXN0ZW0gbG9ja3VwcyB3aGVuCisgIHVzaW5nIERNQSB3aXRoIEFMSS0xNXh4IGJhc2VkIHN5c3RlbXMuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRlc3QKKyAgYW55IG90aGVyIGNoaXBzZXRzLiAgVGhlIGxvY2t1cHMgaGFwcGVuIHNvb24gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuCisgIGFjcXVpc3Rpb24sIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgbG9uZyBydW4uCisKKyAgV2l0aG91dCBETUEsIHlvdSBjYW4gZG8gNjIwS2h6IHNhbXBsaW5nIHdpdGggMjAlIGlkbGUgb24gYSA0MDBNaHogSzYtMgorICAod2l0aCBhIDI1NksgcmVhZCBidWZmZXIpLgorCisgIERpZ2l0YWwtSU8gYW5kIEFuYWxvZy1PdXQgb25seSBzdXBwb3J0IGluc3RydWN0aW9uIG1vZGUuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorCisjZGVmaW5lIERSVl9OQU1FICJydGQ1MjAiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEcml2ZXIgc3BlY2lmaWMgc3R1ZmYgKHR1bmFibGUpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEVuYWJsZSB0aGlzIHRvIHRlc3QgdGhlIG5ldyBETUEgc3VwcG9ydC4gWW91IG1heSBnZXQgaGFyZCBsb2NrIHVwcyAqLworLyojZGVmaW5lIFVTRV9ETUEqLworCisvKiBXZSByZWFsbHkgb25seSBuZWVkIDIgYnVmZmVycy4gIE1vcmUgdGhhbiB0aGF0IG1lYW5zIGJlaW5nIG11Y2gKKyAgIHNtYXJ0ZXIgYWJvdXQga25vd2luZyB3aGljaCBvbmVzIGFyZSBmdWxsLiAqLworI2RlZmluZSBETUFfQ0hBSU5fQ09VTlQgMgkvKiBtYXggRE1BIHNlZ21lbnRzL2J1ZmZlcnMgaW4gYSByaW5nIChtaW4gMikgKi8KKworLyogVGFyZ2V0IHBlcmlvZCBmb3IgcGVyaW9kaWMgdHJhbnNmZXJzLiAgVGhpcyBzZXRzIHRoZSB1c2VyIHJlYWQgbGF0ZW5jeS4gKi8KKy8qIE5vdGU6IFRoZXJlIGFyZSBjZXJ0YWluIHJhdGVzIHdoZXJlIHdlIGdpdmUgdGhpcyB1cCBhbmQgdHJhbnNmZXIgMS8yIEZJRk8gKi8KKy8qIElmIHRoaXMgaXMgdG9vIGxvdywgZWZmaWNpZW5jeSBpcyBwb29yICovCisjZGVmaW5lIFRSQU5TX1RBUkdFVF9QRVJJT0QgMTAwMDAwMDAJLyogMTAgbXMgKGluIG5hbm9zZWNvbmRzKSAqLworCisvKiBTZXQgYSBwcmFjdGljYWwgbGltaXQgb24gaG93IGxvbmcgYSBsaXN0IHRvIHN1cHBvcnQgKGFmZmVjdHMgbWVtb3J5IHVzZSkgKi8KKy8qIFRoZSBib2FyZCBzdXBwb3J0IGEgY2hhbm5lbCBsaXN0IHVwIHRvIHRoZSBGSUZPIGxlbmd0aCAoMUsgb3IgOEspICovCisjZGVmaW5lIFJURF9NQVhfQ0hBTkxJU1QJMTI4CS8qIG1heCBjaGFubmVsIGxpc3QgdGhhdCB3ZSBhbGxvdyAqLworCisvKiB0dW5pbmcgZm9yIGFpL2FvIGluc3RydWN0aW9uIGRvbmUgcG9sbGluZyAqLworI2lmZGVmIEZBU1RfU1BJTgorI2RlZmluZSBXQUlUX1FVSUVUTFkJCS8qIGFzIG5vdGhpbmcsIHNwaW4gb24gZG9uZSBiaXQgKi8KKyNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTY2MDAwCS8qIDIgbXNlYyBhdCAzM21oeiBidXMgcmF0ZSAqLworI2RlZmluZSBSVERfREFDX1RJTUVPVVQJNjYwMDAKKyNkZWZpbmUgUlREX0RNQV9USU1FT1VUCTMzMDAwCS8qIDEgbXNlYyAqLworI2Vsc2UKKy8qIGJ5IGRlbGF5aW5nLCBwb3dlciBhbmQgZWxlY3RyaWNhbCBub2lzZSBhcmUgcmVkdWNlZCBzb21ld2hhdCAqLworI2RlZmluZSBXQUlUX1FVSUVUTFkJY29tZWRpX3VkZWxheSAoMSkKKyNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTIwMDAJLyogaW4gdXNlYyAqLworI2RlZmluZSBSVERfREFDX1RJTUVPVVQJMjAwMAkvKiBpbiB1c2VjICovCisjZGVmaW5lIFJURF9ETUFfVElNRU9VVAkxMDAwCS8qIGluIHVzZWMgKi8KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQm9hcmQgc3BlY2lmaWMgc3R1ZmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiByZWdpc3RlcnMgICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECTB4MTQzNQorLyoKKyAgVGhlIGJvYXJkIGhhcyB0aHJlZSBtZW1vcnkgd2luZG93czogbGFzMCwgbGFzMSwgYW5kIGxjZmcgKHRoZSBQQ0kgY2hpcCkKKyAgTGFzMSBoYXMgdGhlIGRhdGEgYW5kIGNhbiBiZSBidXJzdCBETUFlZCAzMmJpdHMgYXQgYSB0aW1lLgorKi8KKyNkZWZpbmUgTENGR19QQ0lJTkRFWAkwCisvKiBQQ0kgcmVnaW9uIDEgaXMgYSAyNTYgYnl0ZSBJTyBzcGFjZSBtYXBwaW5nLiAgVXNlPz8/ICovCisjZGVmaW5lIExBUzBfUENJSU5ERVgJMgkvKiBQQ0kgbWVtb3J5IHJlc291cmNlcyAqLworI2RlZmluZSBMQVMxX1BDSUlOREVYCTMKKyNkZWZpbmUgTENGR19QQ0lTSVpFCTB4MTAwCisjZGVmaW5lIExBUzBfUENJU0laRQkweDIwMAorI2RlZmluZSBMQVMxX1BDSVNJWkUJMHgxMAorCisjZGVmaW5lIFJURF9DTE9DS19SQVRFCTgwMDAwMDAJLyogOE1oeiBvbmJvYXJkIGNsb2NrICovCisjZGVmaW5lIFJURF9DTE9DS19CQVNFCTEyNQkvKiBjbG9jayBwZXJpb2QgaW4gbnMgKi8KKworLyogTm90ZTogdGhlc2Ugc3BlZWQgYXJlIHNsb3dlciB0aGFuIHRoZSBzcGVjLCBidXQgZml0IHRoZSBjb3VudGVyIHJlc29sdXRpb24qLworI2RlZmluZSBSVERfTUFYX1NQRUVECTE2MjUJLyogd2hlbiBzYW1wbGluZywgaW4gbmFub3NlY29uZHMgKi8KKy8qIG1heCBzcGVlZCBpZiB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIHNldHRsaW5nICovCisjZGVmaW5lIFJURF9NQVhfU1BFRURfMQk4NzUJLyogaWYgc2luZ2xlIGNoYW5uZWwsIGluIG5hbm9zZWNvbmRzICovCisKKyNkZWZpbmUgUlREX01JTl9TUEVFRAkyMDk3MTUxODc1CS8qICgyNGJpdCBjb3VudGVyKSBpbiBuYW5vc2Vjb25kcyAqLworLyogbWluIHNwZWVkIHdoZW4gb25seSAxIGNoYW5uZWwgKG5vIGJ1cnN0IGNvdW50ZXIpICovCisjZGVmaW5lIFJURF9NSU5fU1BFRURfMQk1MDAwMDAwCS8qIDIwMEh6LCBpbiBuYW5vc2Vjb25kcyAqLworCisjaW5jbHVkZSAicnRkNTIwLmgiCisjaW5jbHVkZSAicGx4OTA4MC5oIgorCisvKiBTZXR1cCBjb250aW51b3VzIHJpbmcgb2YgMS8yIEZJRk8gdHJhbnNmZXJzLiAgU2VlIFJURCBtYW51YWwgcDkxICovCisjZGVmaW5lIERNQV9NT0RFX0JJVFMgKFwKKwkJICAgICAgIFBMWF9MT0NBTF9CVVNfMTZfV0lERV9CSVRTIFwKKwkJICAgICAgIHwgUExYX0RNQV9FTl9SRUFEWUlOX0JJVCBcCisJCSAgICAgICB8IFBMWF9ETUFfTE9DQUxfQlVSU1RfRU5fQklUIFwKKwkJICAgICAgIHwgUExYX0VOX0NIQUlOX0JJVCBcCisJCSAgICAgICB8IFBMWF9ETUFfSU5UUl9QQ0lfQklUIFwKKwkJICAgICAgIHwgUExYX0xPQ0FMX0FERFJfQ09OU1RfQklUIFwKKwkJICAgICAgIHwgUExYX0RFTUFORF9NT0RFX0JJVCkKKworI2RlZmluZSBETUFfVFJBTlNGRVJfQklUUyAoXAorLyogZGVzY3JpcHRvcnMgaW4gUENJIG1lbW9yeSovIAlQTFhfREVTQ19JTl9QQ0lfQklUIFwKKy8qIGludGVycnVwdCBhdCBlbmQgb2YgYmxvY2sgKi8gfCBQTFhfSU5UUl9URVJNX0NPVU5UIFwKKy8qIGZyb20gYm9hcmQgdG8gUENJICovCQl8IFBMWF9YRkVSX0xPQ0FMX1RPX1BDSSkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENvbWVkaSBzcGVjaWZpYyBzdHVmZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgIFRoZSBib2FyZCBoYXMgMyBpbnB1dCBtb2RlcyBhbmQgdGhlIGdhaW5zIG9mIDEsMiw0LC4uLjMyICgsIDY0LCAxMjgpCisqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FpXzc1MjBfcmFuZ2UgPSB7IDE4LCB7CisJCQkvKiArLTVWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSg1LjApLAorCQkJQklQX1JBTkdFKDUuMCAvIDIpLAorCQkJQklQX1JBTkdFKDUuMCAvIDQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDgpLAorCQkJQklQX1JBTkdFKDUuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAzMiksCisJCQkvKiArLTEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoMTAuMCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA0KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gOCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMzIpLAorCQkJLyogKzEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlVTklfUkFOR0UoMTAuMCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDIpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA0KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gOCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMzIpLAorCisJfQorfTsKKworLyogUENJNDUyMCBoYXMgdHdvIG1vcmUgZ2FpbnMgKDYgbW9yZSBlbnRyaWVzKSAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FpXzQ1MjBfcmFuZ2UgPSB7IDI0LCB7CisJCQkvKiArLTVWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSg1LjApLAorCQkJQklQX1JBTkdFKDUuMCAvIDIpLAorCQkJQklQX1JBTkdFKDUuMCAvIDQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDgpLAorCQkJQklQX1JBTkdFKDUuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAzMiksCisJCQlCSVBfUkFOR0UoNS4wIC8gNjQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDEyOCksCisJCQkvKiArLTEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoMTAuMCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA0KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gOCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMzIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA2NCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDEyOCksCisJCQkvKiArMTBWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCVVOSV9SQU5HRSgxMC4wKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDQpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA4KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMTYpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAzMiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDY0KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMTI4KSwKKwl9Cit9OworCisvKiBUYWJsZSBvcmRlciBtYXRjaGVzIHJhbmdlIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FvX3JhbmdlID0geyA0LCB7CisJCQlSQU5HRSgwLCA1KSwKKwkJCVJBTkdFKDAsIDEwKSwKKwkJCVJBTkdFKC01LCA1KSwKKwkJCVJBTkdFKC0xMCwgMTApLAorCX0KK307CisKKy8qCisgIEJvYXJkIGRlc2NyaXB0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBydGRCb2FyZF9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIG11c3QgYmUgZmlyc3QgKi8KKwlpbnQgZGV2aWNlX2lkOworCWludCBhaUNoYW5zOworCWludCBhaUJpdHM7CisJaW50IGFpTWF4R2FpbjsKKwlpbnQgcmFuZ2UxMFN0YXJ0OwkvKiBzdGFydCBvZiArLTEwViByYW5nZSAqLworCWludCByYW5nZVVuaVN0YXJ0OwkvKiBzdGFydCBvZiArMTBWIHJhbmdlICovCit9IHJ0ZEJvYXJkOworCitzdGF0aWMgY29uc3QgcnRkQm9hcmQgcnRkNTIwQm9hcmRzW10gPSB7CisJeworCSAgICAgIG5hbWU6CSJETTc1MjAiLAorCSAgICAgIGRldmljZV9pZDoweDc1MjAsCisJICAgICAgYWlDaGFuczoJMTYsCisJICAgICAgYWlCaXRzOgkxMiwKKwkgICAgICBhaU1heEdhaW46MzIsCisJICAgICAgcmFuZ2UxMFN0YXJ0OjYsCisJICAgICAgcmFuZ2VVbmlTdGFydDoxMiwKKwkJfSwKKwl7CisJICAgICAgbmFtZToJIlBDSTQ1MjAiLAorCSAgICAgIGRldmljZV9pZDoweDQ1MjAsCisJICAgICAgYWlDaGFuczoJMTYsCisJICAgICAgYWlCaXRzOgkxMiwKKwkgICAgICBhaU1heEdhaW46MTI4LAorCSAgICAgIHJhbmdlMTBTdGFydDo4LAorCSAgICAgIHJhbmdlVW5pU3RhcnQ6MTYsCisJCX0sCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRkNTIwX3BjaV90YWJsZSkgPSB7CisJe1BDSV9WRU5ET1JfSURfUlRELCAweDc1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX1JURCwgMHg0NTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGQ1MjBfcGNpX3RhYmxlKTsKKworLyoKKyAqIFVzZWZ1bCBmb3Igc2hvcnRoYW5kIGFjY2VzcyB0byB0aGUgcGFydGljdWxhciBib2FyZCBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBydGRCb2FyZCAqKWRldi0+Ym9hcmRfcHRyKQorCisvKgorICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLgorICAgVGhpcyBpcyBhbHNvIHVuaXF1ZSBmb3IgZWFjaCBib2FyZCBpbiB0aGUgc3lzdGVtLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBtZW1vcnkgbWFwcGVkIGJvYXJkIHN0cnVjdHVyZXMgKi8KKwl2b2lkICpsYXMwOworCXZvaWQgKmxhczE7CisJdm9pZCAqbGNmZzsKKworCXVuc2lnbmVkIGxvbmcgaW50Q291bnQ7CS8qIGludGVycnVwdCBjb3VudCAqLworCWxvbmcgYWlDb3VudDsJCS8qIHRvdGFsIHRyYW5zZmVyIHNpemUgKHNhbXBsZXMpICovCisJaW50IHRyYW5zQ291bnQ7CQkvKiAjIHRvIHRyYW5mZXIgZGF0YS4gMC0+MS8yRklGTyAqLworCWludCBmbGFnczsJCS8qIGZsYWcgZXZlbnQgbW9kZXMgKi8KKworCS8qIFBDSSBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCWludCBnb3RfcmVnaW9uczsJLyogbm9uLXplcm8gaWYgUENJIHJlZ2lvbnMgb3duZWQgKi8KKworCS8qIGNoYW5uZWwgbGlzdCBpbmZvICovCisJLyogY2hhbkJpcG9sYXIgdHJhY2tzIHdoZXRoZXIgYSBjaGFubmVsIGlzIGJpcG9sYXIgKGFuZCBuZWVkcyArMjA0OCkgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYW5CaXBvbGFyW1JURF9NQVhfQ0hBTkxJU1QgLyA4XTsJLyogYml0IGFycmF5ICovCisKKwkvKiByZWFkIGJhY2sgZGF0YSAqLworCWxzYW1wbF90IGFvVmFsdWVbMl07CS8qIFVzZWQgZm9yIEFPIHJlYWQgYmFjayAqLworCisJLyogdGltZXIgZ2F0ZSAod2hlbiBlbmFibGVkKSAqLworCXU4IHV0Y0dhdGVbNF07CQkvKiAxIGV4dHJhIGFsbG93cyBzaW1wbGUgcmFuZ2UgY2hlY2sgKi8KKworCS8qIHNoYWRvdyByZWdpc3RlcnMgYWZmZWN0IG90aGVyIHJlZ2lzdGVycywgYnV0IGNhbnQgYmUgcmVhZCBiYWNrICovCisJLyogVGhlIG1hY3JvcyBiZWxvdyB1cGRhdGUgdGhlc2Ugb24gd3JpdGVzICovCisJdTE2IGludE1hc2s7CQkvKiBpbnRlcnJ1cHQgbWFzayAqLworCXUxNiBpbnRDbGVhck1hc2s7CS8qIGludGVycnVwdCBjbGVhciBtYXNrICovCisJdTggdXRjQ3RybFs0XTsJCS8qIGNydGwgbW9kZSBmb3IgMyB1dGMgKyByZWFkIGJhY2sgKi8KKwl1OCBkaW9TdGF0dXM7CQkvKiBjb3VsZCBiZSByZWFkIGJhY2sgKGRpbzBDdHJsKSAqLworI2lmZGVmIFVTRV9ETUEKKwkvKiBBbHdheXMgRE1BIDEvMiBGSUZPLiAgQnVmZmVyIChkbWFCdWZmPykgaXMgKGF0IGxlYXN0KSB0d2ljZSB0aGF0IHNpemUuCisJICAgQWZ0ZXIgdHJhbnNmZXJyaW5nLCBpbnRlcnJ1cHQgcHJvY2Vzc2VzIDEvMiBGSUZPIGFuZCBwYXNzZXMgdG8gY29tZWRpICovCisJczE2IGRtYTBPZmZzZXQ7CQkvKiBjdXJyZW50IHByb2Nlc3Npbmcgb2Zmc2V0ICgwLCAxLzIpICovCisJdWludDE2X3QgKmRtYTBCdWZmW0RNQV9DSEFJTl9DT1VOVF07CS8qIERNQSBidWZmZXJzIChmb3IgQURDKSAqLworCWRtYV9hZGRyX3QgZG1hMEJ1ZmZQaHlzQWRkcltETUFfQ0hBSU5fQ09VTlRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgcGx4X2RtYV9kZXNjICpkbWEwQ2hhaW47CS8qIERNQSBkZXNjcmlwdG9yIHJpbmcgZm9yIGRtYUJ1ZmYgKi8KKwlkbWFfYWRkcl90IGRtYTBDaGFpblBoeXNBZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkvKiBzaGFkb3cgcmVnaXN0ZXJzICovCisJdTggZG1hMENvbnRyb2w7CisJdTggZG1hMUNvbnRyb2w7CisjZW5kaWYJCQkJLyogVVNFX0RNQSAqLworCXVuc2lnbmVkIGZpZm9MZW47Cit9IHJ0ZFByaXZhdGU7CisKKy8qIGJpdCBkZWZpbmVzIGZvciAiZmxhZ3MiICovCisjZGVmaW5lIFNFTkRfRU9TCTB4MDEJLyogc2VuZCBFbmQgT2YgU2NhbiBldmVudHMgKi8KKyNkZWZpbmUgRE1BMF9BQ1RJVkUJMHgwMgkvKiBETUEwIGlzIGFjdGl2ZSAqLworI2RlZmluZSBETUExX0FDVElWRQkweDA0CS8qIERNQTEgaXMgYWN0aXZlICovCisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIGNoYW5uZWwgbGlzdCBiaXQgYXJyYXkgKi8KKyNkZWZpbmUgQ0hBTl9BUlJBWV9URVNUKGFycmF5LGluZGV4KSBcCisJKCgoYXJyYXkpWyhpbmRleCkvOF0gPj4gKChpbmRleCkgJiAweDcpKSAmIDB4MSkKKyNkZWZpbmUgQ0hBTl9BUlJBWV9TRVQoYXJyYXksaW5kZXgpIFwKKwkoKChhcnJheSlbKGluZGV4KS84XSB8PSAxIDw8ICgoaW5kZXgpICYgMHg3KSkpCisjZGVmaW5lIENIQU5fQVJSQVlfQ0xFQVIoYXJyYXksaW5kZXgpIFwKKwkoKChhcnJheSlbKGluZGV4KS84XSAmPSB+KDEgPDwgKChpbmRleCkgJiAweDcpKSkpCisKKy8qCisgKiBtb3N0IGRyaXZlcnMgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gbWFrZSBpdCBlYXN5IHRvCisgKiBhY2Nlc3MgdGhlIHByaXZhdGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIGRldnByaXYgKChydGRQcml2YXRlICopZGV2LT5wcml2YXRlKQorCisvKiBNYWNyb3MgdG8gYWNjZXNzIHJlZ2lzdGVycyAqLworCisvKiBSZXNldCBib2FyZCAqLworI2RlZmluZSBSdGRSZXNldEJvYXJkKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0JPQVJEX1JFU0VUKQorCisvKiBSZXNldCBjaGFubmVsIGdhaW4gdGFibGUgcmVhZCBwb2ludGVyICovCisjZGVmaW5lIFJ0ZFJlc2V0Q0dUKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9SRVNFVCkKKworLyogUmVzZXQgY2hhbm5lbCBnYWluIHRhYmxlIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXJzICovCisjZGVmaW5lIFJ0ZENsZWFyQ0dUKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9DTEVBUikKKworLyogUmVzZXQgY2hhbm5lbCBnYWluIHRhYmxlIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXJzICovCisjZGVmaW5lIFJ0ZEVuYWJsZUNHVChkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dUX0VOQUJMRSkKKworLyogV3JpdGUgY2hhbm5lbCBnYWluIHRhYmxlIGVudHJ5ICovCisjZGVmaW5lIFJ0ZFdyaXRlQ0dUYWJsZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9XUklURSkKKworLyogV3JpdGUgQ2hhbm5lbCBHYWluIExhdGNoICovCisjZGVmaW5lIFJ0ZFdyaXRlQ0dMYXRjaChkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHTF9XUklURSkKKworLyogUmVzZXQgQURDIEZJRk8gKi8KKyNkZWZpbmUgUnRkQWRjQ2xlYXJGaWZvKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19GSUZPX0NMRUFSKQorCisvKiBTZXQgQURDIHN0YXJ0IGNvbnZlcnNpb24gc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19DT05WRVJTSU9OKQorCisvKiBTZXQgYnVyc3Qgc3RhcnQgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQnVyc3RTdGFydFNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0JVUlNUX1NUQVJUKQorCisvKiBTZXQgUGFjZXIgc3RhcnQgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkUGFjZXJTdGFydFNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1NUQVJUKQorCisvKiBTZXQgUGFjZXIgc3RvcCBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRQYWNlclN0b3BTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUl9TVE9QKQorCisvKiBTZXQgUGFjZXIgY2xvY2sgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgMD1leHRlcm5hbCAxPWludGVybmFsICovCisjZGVmaW5lIFJ0ZFBhY2VyQ2xvY2tTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1NFTEVDVCkKKworLyogU2V0IHNhbXBsZSBjb3VudGVyIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZEFkY1NhbXBsZUNvdW50ZXJTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9BRENfU0NOVF9TUkMpCisKKy8qIFNldCBQYWNlciB0cmlnZ2VyIG1vZGUgc2VsZWN0ICh3cml0ZSBvbmx5KSAwPXNpbmdsZSBjeWNsZSwgMT1yZXBlYXQgKi8KKyNkZWZpbmUgUnRkUGFjZXJUcmlnZ2VyTW9kZShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVJfUkVQRUFUKQorCisvKiBTZXQgQWJvdXQgY291bnRlciBzdG9wIGVuYWJsZSAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQWJvdXRTdG9wRW5hYmxlKGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9BQ05UX1NUT1BfRU5BQkxFKQorCisvKiBTZXQgZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAod3JpdGUgb25seSkgMD1wb3NpdGl2ZSBlZGdlLCAxPW5lZ2F0aXZlICovCisjZGVmaW5lIFJ0ZFRyaWdnZXJQb2xhcml0eShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfRVRSR19QT0xBUklUWSkKKworLyogU3RhcnQgc2luZ2xlIEFEQyBjb252ZXJzaW9uICovCisjZGVmaW5lIFJ0ZEFkY1N0YXJ0KGRldikgXAorICAgIHdyaXRldyAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQykKKworLyogUmVhZCBvbmUgQURDIGRhdGEgdmFsdWUgKDEyYml0ICh3aXRoIHNpZ24gZXh0ZW5kKSBhcyAxNmJpdCkgKi8KKy8qIE5vdGU6IG1hdGNoZXMgd2hhdCBETUEgd291bGQgZ2V0LiAgQWN0dWFsIHZhbHVlID4+IDMgKi8KKyNkZWZpbmUgUnRkQWRjRmlmb0dldChkZXYpIFwKKyAgICByZWFkdyAoZGV2cHJpdi0+bGFzMStMQVMxX0FEQ19GSUZPKQorCisvKiBSZWFkIHR3byBBREMgZGF0YSB2YWx1ZXMgKERPRVNOVCBXT1JLKSAqLworI2RlZmluZSBSdGRBZGNGaWZvR2V0MihkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMStMQVMxX0FEQ19GSUZPKQorCisvKiBGSUZPIHN0YXR1cyAqLworI2RlZmluZSBSdGRGaWZvU3RhdHVzKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQURDKQorCisvKiBwYWNlciBzdGFydC9zdG9wIHJlYWQ9c3RhcnQsIHdyaXRlPXN0b3AqLworI2RlZmluZSBSdGRQYWNlclN0YXJ0KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVIpCisjZGVmaW5lIFJ0ZFBhY2VyU3RvcChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUikKKworLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KSBcCisgICAgcmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9JVCkKKworLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0TWFzayhkZXYsdikgXAorICAgIHdyaXRldyAoKGRldnByaXYtPmludE1hc2sgPSAodikpLGRldnByaXYtPmxhczArTEFTMF9JVCkKKworLyogSW50ZXJydXB0IHN0YXR1cyBjbGVhciAob25seSBiaXRzIHNldCBpbiBtYXNrKSAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRDbGVhcihkZXYpIFwKKyAgICByZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0NMRUFSKQorCisvKiBJbnRlcnJ1cHQgY2xlYXIgbWFzayAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LHYpIFwKKyAgICB3cml0ZXcgKChkZXZwcml2LT5pbnRDbGVhck1hc2sgPSAodikpLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0xFQVIpCisKKy8qIEludGVycnVwdCBvdmVycnVuIHN0YXR1cyAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfT1ZFUlJVTikKKworLyogSW50ZXJydXB0IG92ZXJydW4gY2xlYXIgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0T3ZlcnJ1bkNsZWFyKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX09WRVJSVU4pCisKKy8qIFBhY2VyIGNvdW50ZXIsIDI0Yml0ICovCisjZGVmaW5lIFJ0ZFBhY2VyQ291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9QQ0xLKQorI2RlZmluZSBSdGRQYWNlckNvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4ZmZmZmZmLGRldnByaXYtPmxhczArTEFTMF9QQ0xLKQorCisvKiBCdXJzdCBjb3VudGVyLCAxMGJpdCAqLworI2RlZmluZSBSdGRCdXJzdENvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQkNMSykKKyNkZWZpbmUgUnRkQnVyc3RDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweDNmZixkZXZwcml2LT5sYXMwK0xBUzBfQkNMSykKKworLyogRGVsYXkgY291bnRlciwgMTZiaXQgKi8KKyNkZWZpbmUgUnRkRGVsYXlDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0RDTEspCisjZGVmaW5lIFJ0ZERlbGF5Q291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHhmZmZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRENMSykKKworLyogQWJvdXQgY291bnRlciwgMTZiaXQgKi8KKyNkZWZpbmUgUnRkQWJvdXRDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0FDTlQpCisjZGVmaW5lIFJ0ZEFib3V0Q291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHhmZmZmLCBkZXZwcml2LT5sYXMwK0xBUzBfQUNOVCkKKworLyogQURDIHNhbXBsZSBjb3VudGVyLCAxMGJpdCAqLworI2RlZmluZSBSdGRBZGNTYW1wbGVDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19TQ05UKQorI2RlZmluZSBSdGRBZGNTYW1wbGVDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweDNmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19TQ05UKQorCisvKiBVc2VyIFRpbWVyL0NvdW50ZXIgKDgyNTQpICovCisjZGVmaW5lIFJ0ZFV0Y0NvdW50ZXJHZXQoZGV2LG4pIFwKKyAgICByZWFkYiAoZGV2cHJpdi0+bGFzMCBcCisgICAgICAgICsgKChuIDw9IDApID8gTEFTMF9VVEMwIDogKCgxID09IG4pID8gTEFTMF9VVEMxIDogTEFTMF9VVEMyKSkpCisKKyNkZWZpbmUgUnRkVXRjQ291bnRlclB1dChkZXYsbix2KSBcCisgICAgd3JpdGViICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzAgOiAoKDEgPT0gbikgPyBMQVMwX1VUQzEgOiBMQVMwX1VUQzIpKSkKKworLyogU2V0IFVUQyAoODI1NCkgY29udHJvbCBieXRlICAqLworI2RlZmluZSBSdGRVdGNDdHJsUHV0KGRldixuLHYpIFwKKyAgICB3cml0ZWIgKGRldnByaXYtPnV0Y0N0cmxbKG4pICYgM10gPSAoKChuKSAmIDMpIDw8IDYpIHwgKCh2KSAmIDB4M2YpLCBcCisgICAgICBkZXZwcml2LT5sYXMwICsgTEFTMF9VVENfQ1RSTCkKKworLyogU2V0IFVUQ24gY2xvY2sgc291cmNlICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRVdGNDbG9ja1NvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICh2LCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzBfQ0xPQ0sgOiBcCisgICAgICAgICAgICgoMSA9PSBuKSA/IExBUzBfVVRDMV9DTE9DSyA6IExBUzBfVVRDMl9DTE9DSykpKQorCisvKiBTZXQgVVRDbiBnYXRlIHNvdXJjZSAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkVXRjR2F0ZVNvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICh2LCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzBfR0FURSA6IFwKKyAgICAgICAgICAgKCgxID09IG4pID8gTEFTMF9VVEMxX0dBVEUgOiBMQVMwX1VUQzJfR0FURSkpKQorCisvKiBVc2VyIG91dHB1dCBOIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFVzck91dFNvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGVsICh2LGRldnByaXYtPmxhczArKChuIDw9IDApID8gTEFTMF9VT1VUMF9TRUxFQ1QgOiBMQVMwX1VPVVQxX1NFTEVDVCkpCisKKy8qIERpZ2l0YWwgSU8gKi8KKyNkZWZpbmUgUnRkRGlvMFJlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPMCkgJiAweGZmKQorI2RlZmluZSBSdGREaW8wV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczArTEFTMF9ESU8wKQorCisjZGVmaW5lIFJ0ZERpbzFSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzEpICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvMVdyaXRlKGRldix2KSBcCisgICAgd3JpdGV3ICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPMSkKKworI2RlZmluZSBSdGREaW9TdGF0dXNSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJT19TVEFUVVMpICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvU3RhdHVzV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKChkZXZwcml2LT5kaW9TdGF0dXMgPSAodikpLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPX1NUQVRVUykKKworI2RlZmluZSBSdGREaW8wQ3RybFJlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPMF9DVFJMKSAmIDB4ZmYpCisjZGVmaW5lIFJ0ZERpbzBDdHJsV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczArTEFTMF9ESU8wX0NUUkwpCisKKy8qIERpZ2l0YWwgdG8gQW5hbG9nIGNvbnZlcnRlciAqLworLyogV3JpdGUgb25lIGRhdGEgdmFsdWUgKHNpZ24gKyAxMmJpdCArIG1hcmtlciBiaXRzKSAqLworLyogTm90ZTogbWF0Y2hlcyB3aGF0IERNQSB3b3VsZCBwdXQuICBBY3R1YWwgdmFsdWUgPDwgMyAqLworI2RlZmluZSBSdGREYWNGaWZvUHV0KGRldixuLHYpIFwKKyAgICB3cml0ZXcgKCh2KSwgZGV2cHJpdi0+bGFzMSArKCgobikgPT0gMCkgPyBMQVMxX0RBQzFfRklGTyA6IExBUzFfREFDMl9GSUZPKSkKKworLyogU3RhcnQgc2luZ2xlIERBQyBjb252ZXJzaW9uICovCisjZGVmaW5lIFJ0ZERhY1VwZGF0ZShkZXYsbikgXAorICAgIHdyaXRldyAoMCwgZGV2cHJpdi0+bGFzMCArKCgobikgPT0gMCkgPyBMQVMwX0RBQzEgOiBMQVMwX0RBQzIpKQorCisvKiBTdGFydCBzaW5nbGUgREFDIGNvbnZlcnNpb24gb24gYm90aCBEQUNzICovCisjZGVmaW5lIFJ0ZERhY0JvdGhVcGRhdGUoZGV2KSBcCisgICAgd3JpdGV3ICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfREFDKQorCisvKiBTZXQgREFDIG91dHB1dCB0eXBlIGFuZCByYW5nZSAqLworI2RlZmluZSBSdGREYWNSYW5nZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICgodikgJiA3LCBkZXZwcml2LT5sYXMwIFwKKwkrKCgobikgPT0gMCkgPyBMQVMwX0RBQzFfQ1RSTCA6IExBUzBfREFDMl9DVFJMKSkKKworLyogUmVzZXQgREFDIEZJRk8gKi8KKyNkZWZpbmUgUnRkRGFjQ2xlYXJGaWZvKGRldixuKSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwKygoKG4pID09IDApID8gTEFTMF9EQUMxX1JFU0VUIDogTEFTMF9EQUMyX1JFU0VUKSkKKworLyogU2V0IHNvdXJjZSBmb3IgRE1BIDAgKHdyaXRlIG9ubHksIHNoYWRvdz8pICovCisjZGVmaW5lIFJ0ZERtYTBTb3VyY2UoZGV2LG4pIFwKKyAgICB3cml0ZWwgKChuKSAmIDB4ZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RNQTBfU1JDKQorCisvKiBTZXQgc291cmNlIGZvciBETUEgMSAod3JpdGUgb25seSwgc2hhZG93PykgKi8KKyNkZWZpbmUgUnRkRG1hMVNvdXJjZShkZXYsbikgXAorICAgIHdyaXRlbCAoKG4pICYgMHhmLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMV9TUkMpCisKKy8qIFJlc2V0IGJvYXJkIHN0YXRlIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwUmVzZXQoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMF9SRVNFVCkKKworLyogUmVzZXQgYm9hcmQgc3RhdGUgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFSZXNldChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9ETUExX1NSQykKKworLyogUExYOTA4MCBpbnRlcnJ1cHQgbWFzayBhbmQgc3RhdHVzICovCisjZGVmaW5lIFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxjZmcrTENGR19JVENTUikKKyNkZWZpbmUgUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxjZmcrTENGR19JVENTUikKKworLyogU2V0ICBtb2RlIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwTW9kZShkZXYsbSkgXAorICAgIHdyaXRlbCAoKG0pLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTU9ERTApCisKKy8qIFNldCBQQ0kgYWRkcmVzcyBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMFBjaUFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQVBBRFIwKQorCisvKiBTZXQgbG9jYWwgYWRkcmVzcyBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMExvY2FsQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTEFEUjApCisKKy8qIFNldCBieXRlIGNvdW50IGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwQ291bnQoZGV2LGMpIFwKKyAgICB3cml0ZWwgKChjKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQVNJWjApCisKKy8qIFNldCBuZXh0IGRlc2NyaXB0b3IgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBOZXh0KGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFEUFIwKQorCisvKiBTZXQgIG1vZGUgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFNb2RlKGRldixtKSBcCisgICAgd3JpdGVsICgobSksIGRldnByaXYtPmxjZmcrTENGR19ETUFNT0RFMSkKKworLyogU2V0IFBDSSBhZGRyZXNzIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExUGNpQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQURSMSkKKworLyogU2V0IGxvY2FsIGFkZHJlc3MgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFMb2NhbEFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUxBRFIxKQorCisvKiBTZXQgYnl0ZSBjb3VudCBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMUNvdW50KGRldixjKSBcCisgICAgd3JpdGVsICgoYyksIGRldnByaXYtPmxjZmcrTENGR19ETUFTSVoxKQorCisvKiBTZXQgbmV4dCBkZXNjcmlwdG9yIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExTmV4dChkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BRFBSMSkKKworLyogU2V0IGNvbnRyb2wgZm9yIERNQSAwICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWEwQ29udHJvbChkZXYsbikgXAorICAgIHdyaXRlYiAoZGV2cHJpdi0+ZG1hMENvbnRyb2wgPSAobiksIGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IwKQorCisvKiBHZXQgc3RhdHVzIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwU3RhdHVzKGRldikgXAorICAgIHJlYWRiIChkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMCkKKworLyogU2V0IGNvbnRyb2wgZm9yIERNQSAxICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWExQ29udHJvbChkZXYsbikgXAorICAgIHdyaXRlYiAoZGV2cHJpdi0+ZG1hMUNvbnRyb2wgPSAobiksIGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IxKQorCisvKiBHZXQgc3RhdHVzIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExU3RhdHVzKGRldikgXAorICAgIHJlYWRiIChkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMSkKKworLyoKKyAqIFRoZSBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZSB0ZWxscyB0aGUgQ29tZWRpIGNvcmUgbW9kdWxlCisgKiB3aGljaCBmdW5jdGlvbnMgdG8gY2FsbCB0byBjb25maWd1cmUvZGVjb25maWd1cmUgKGF0dGFjL2RldGFjaCkKKyAqIHRoZSBib2FyZCwgYW5kIGFsc28gYWJvdXQgdGhlIGtlcm5lbCBtb2R1bGUgdGhhdCBjb250YWlucworICogdGhlIGRldmljZSBjb2RlLgorICovCitzdGF0aWMgaW50IHJ0ZF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgcnRkX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgcnRkNTIwRHJpdmVyID0geworICAgICAgZHJpdmVyX25hbWU6IERSVl9OQU1FLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOnJ0ZF9hdHRhY2gsCisgICAgICBkZXRhY2g6cnRkX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgcnRkX2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCk7CitzdGF0aWMgaW50IHJ0ZF9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworc3RhdGljIGludCBydGRfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKKy8vc3RhdGljIGludCBydGRfYWlfcG9sbCAoY29tZWRpX2RldmljZSAqZGV2LGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBydGRfbnNfdG9fdGltZXIodW5zaWduZWQgaW50ICpucywgaW50IHJvdW5kTW9kZSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcnRkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKTsKK3N0YXRpYyBpbnQgcnRkNTIwX3Byb2JlX2ZpZm9fZGVwdGgoY29tZWRpX2RldmljZSAqZGV2KTsKKworLyoKKyAqIEF0dGFjaCBpcyBjYWxsZWQgYnkgdGhlIENvbWVkaSBjb3JlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgKiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiAgSWYgeW91IHNwZWNpZmllZCBhIGJvYXJkX25hbWUgYXJyYXkKKyAqIGluIHRoZSBkcml2ZXIgc3RydWN0dXJlLCBkZXYtPmJvYXJkX3B0ciBjb250YWlucyB0aGF0CisgKiBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IHJ0ZF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQorewkJCQkvKiBib2FyZCBuYW1lIGFuZCBvcHRpb25zIGZsYWdzICovCisJY29tZWRpX3N1YmRldmljZSAqczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCWludCByZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMwOwkvKiBjb25maWd1YXRpb24gKi8KKwlyZXNvdXJjZV9zaXplX3QgcGh5c0xhczE7CS8qIGRhdGEgYXJlYSAqLworCXJlc291cmNlX3NpemVfdCBwaHlzTGNmZzsJLyogUExYOTA4MCAqLworI2lmZGVmIFVTRV9ETUEKKwlpbnQgaW5kZXg7CisjZW5kaWYKKworCXByaW50aygiY29tZWRpJWQ6IHJ0ZDUyMCBhdHRhY2hpbmcuXG4iLCBkZXYtPm1pbm9yKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19DT01FRElfREVCVUcpICYmIGRlZmluZWQgKFVTRV9ETUEpCisJLyogWW91IGNhbiBzZXQgdGhpcyBhIGxvYWQgdGltZTogbW9kcHJvYmUgY29tZWRpIGNvbWVkaV9kZWJ1Zz0xICovCisJaWYgKDAgPT0gY29tZWRpX2RlYnVnKQkvKiBmb3JjZSBETUEgZGVidWcgcHJpbnRrcyAqLworCQljb21lZGlfZGVidWcgPSAxOworI2VuZGlmCisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBhcmVhLiAgYWxsb2NfcHJpdmF0ZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguCisJICovCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YocnRkUHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuCisJICovCisJZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1JURCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1JURCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCQlpbnQgaTsKKworCQlpZiAoaXQtPm9wdGlvbnNbMF0gfHwgaXQtPm9wdGlvbnNbMV0pIHsKKwkJCWlmIChwY2lkZXYtPmJ1cy0+bnVtYmVyICE9IGl0LT5vcHRpb25zWzBdCisJCQkJfHwgUENJX1NMT1QocGNpZGV2LT5kZXZmbikgIT0KKwkJCQlpdC0+b3B0aW9uc1sxXSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWZvcihpID0gMDsgaSA8IHNpemVvZihydGQ1MjBCb2FyZHMpIC8gc2l6ZW9mKHJ0ZDUyMEJvYXJkc1swXSk7ICsraSkKKwkJeworCQkJaWYocGNpZGV2LT5kZXZpY2UgPT0gcnRkNTIwQm9hcmRzW2ldLmRldmljZV9pZCkKKwkJCXsKKwkJCQlkZXYtPmJvYXJkX3B0ciA9ICZydGQ1MjBCb2FyZHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoZGV2LT5ib2FyZF9wdHIpIGJyZWFrOwkvKiBmb3VuZCBvbmUgKi8KKwl9CisJaWYgKCFwY2lkZXYpIHsKKwkJaWYgKGl0LT5vcHRpb25zWzBdICYmIGl0LT5vcHRpb25zWzFdKSB7CisJCQlwcmludGsoIk5vIFJURCBjYXJkIGF0IGJ1cz0lZCBzbG90PSVkLlxuIiwKKwkJCQlpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJObyBSVEQgY2FyZCBmb3VuZC5cbiIpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZwcml2LT5wY2lfZGV2ID0gcGNpZGV2OworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNib2FyZC0+bmFtZTsKKworCWlmICgocmV0ID0gY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCBEUlZfTkFNRSkpIDwgMCkgeworCQlwcmludGsoIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWRldnByaXYtPmdvdF9yZWdpb25zID0gMTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBiYXNlIGFkZHJlc3NlcworCSAqLworCS8qIEdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIFBDSSBjb25maWcgKi8KKwlwaHlzTGFzMCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQVMwX1BDSUlOREVYKTsKKwlwaHlzTGFzMSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQVMxX1BDSUlOREVYKTsKKwlwaHlzTGNmZyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQ0ZHX1BDSUlOREVYKTsKKwkvKiBOb3cgaGF2ZSB0aGUga2VybmVsIG1hcCB0aGlzIGludG8gbWVtb3J5ICovCisJLyogQVNTVU1FIHBhZ2UgYWxpZ25lZCAqLworCWRldnByaXYtPmxhczAgPSBpb3JlbWFwX25vY2FjaGUocGh5c0xhczAsIExBUzBfUENJU0laRSk7CisJZGV2cHJpdi0+bGFzMSA9IGlvcmVtYXBfbm9jYWNoZShwaHlzTGFzMSwgTEFTMV9QQ0lTSVpFKTsKKwlkZXZwcml2LT5sY2ZnID0gaW9yZW1hcF9ub2NhY2hlKHBoeXNMY2ZnLCBMQ0ZHX1BDSVNJWkUpOworCisJaWYgKCFkZXZwcml2LT5sYXMwIHx8ICFkZXZwcml2LT5sYXMxIHx8ICFkZXZwcml2LT5sY2ZnKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCURQUklOVEsoIiVzOiBMQVMwPSVsbHgsIExBUzE9JWxseCwgQ0ZHPSVsbHguXG4iLCBkZXYtPmJvYXJkX25hbWUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xhczAsICh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xhczEsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xjZmcpOworCXsJCQkvKiBUaGUgUlREIGRyaXZlciBkb2VzIHRoaXMgKi8KKwkJdW5zaWduZWQgY2hhciBwY2lfbGF0ZW5jeTsKKwkJdTE2IHJldmlzaW9uOworCQkvKnVpbnQzMl90IGVwbGRfdmVyc2lvbjsgKi8KKworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXZwcml2LT5wY2lfZGV2LCBQQ0lfUkVWSVNJT05fSUQsCisJCQkmcmV2aXNpb24pOworCQlEUFJJTlRLKCIlczogUENJIHJldmlzaW9uICVkLlxuIiwgZGV2LT5ib2FyZF9uYW1lLCByZXZpc2lvbik7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2cHJpdi0+cGNpX2RldiwKKwkJCVBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOworCQlpZiAocGNpX2xhdGVuY3kgPCAzMikgeworCQkJcHJpbnRrKCIlczogUENJIGxhdGVuY3kgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCWRldi0+Ym9hcmRfbmFtZSwgcGNpX2xhdGVuY3ksIDMyKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZwcml2LT5wY2lfZGV2LAorCQkJCVBDSV9MQVRFTkNZX1RJTUVSLCAzMik7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IFBDSSBsYXRlbmN5ID0gJWRcbiIsIHBjaV9sYXRlbmN5KTsKKwkJfQorCisJCS8qIFVuZG9jdW1lbnRlZCBFUExEIHZlcnNpb24gKGRvZXNudCBtYXRjaCBSVEQgZHJpdmVyIHJlc3VsdHMpICovCisJCS8qRFBSSU5USyAoInJ0ZDUyMDogUmVhZGluZyBlcGxkIGZyb20gJXBcbiIsCisJCSAgIGRldnByaXYtPmxhczArMCk7CisJCSAgIGVwbGRfdmVyc2lvbiA9IHJlYWRsIChkZXZwcml2LT5sYXMwKzApOworCQkgICBpZiAoKGVwbGRfdmVyc2lvbiAmIDB4RjApID4+IDQgPT0gMHgwRikgeworCQkgICBEUFJJTlRLKCJydGQ1MjA6IHByZS12OCBFUExELiAoJXgpXG4iLCBlcGxkX3ZlcnNpb24pOworCQkgICB9IGVsc2UgeworCQkgICBEUFJJTlRLKCJydGQ1MjA6IEVQTEQgdmVyc2lvbiAleC5cbiIsIGVwbGRfdmVyc2lvbiA+PiA0KTsKKwkJICAgfSAqLworCX0KKworCS8qIFNob3cgYm9hcmQgY29uZmlndXJhdGlvbiAqLworCXByaW50aygiJXM6IiwgZGV2LT5ib2FyZF9uYW1lKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLiAgYWxsb2Nfc3ViZGV2aWNlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9CisJCVNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ09NTU9OIHwgU0RGX0RJRkYgfAorCQlTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haUNoYW5zOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpQml0cykgLSAxOworCWlmICh0aGlzYm9hcmQtPmFpTWF4R2FpbiA8PSAzMikgeworCQlzLT5yYW5nZV90YWJsZSA9ICZydGRfYWlfNzUyMF9yYW5nZTsKKwl9IGVsc2UgeworCQlzLT5yYW5nZV90YWJsZSA9ICZydGRfYWlfNDUyMF9yYW5nZTsKKwl9CisJcy0+bGVuX2NoYW5saXN0ID0gUlREX01BWF9DSEFOTElTVDsJLyogZGV2cHJpdi0+Zmlmb0xlbiAqLworCXMtPmluc25fcmVhZCA9IHJ0ZF9haV9yaW5zbjsKKwlzLT5kb19jbWQgPSBydGRfYWlfY21kOworCXMtPmRvX2NtZHRlc3QgPSBydGRfYWlfY21kdGVzdDsKKwlzLT5jYW5jZWwgPSBydGRfYWlfY2FuY2VsOworCS8qcy0+cG9sbCA9IHJ0ZF9haV9wb2xsOyAqLy8qIG5vdCByZWFkeSB5ZXQgKi8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSAyOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpQml0cykgLSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJ0ZF9hb19yYW5nZTsKKwlzLT5pbnNuX3dyaXRlID0gcnRkX2FvX3dpbnNuOworCXMtPmluc25fcmVhZCA9IHJ0ZF9hb19yaW5zbjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCS8qIGRpZ2l0YWwgaS9vIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCS8qIHdlIG9ubHkgc3VwcG9ydCBwb3J0IDAgcmlnaHQgbm93LiAgSWdub3JpbmcgcG9ydCAxIGFuZCB1c2VyIElPICovCisJcy0+bl9jaGFuID0gODsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHJ0ZF9kaW9faW5zbl9iaXRzOworCXMtPmluc25fY29uZmlnID0gcnRkX2Rpb19pbnNuX2NvbmZpZzsKKworCS8qIHRpbWVyL2NvdW50ZXIgc3ViZGV2aWNlcyAobm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDM7CisJcy0+bWF4ZGF0YSA9IDB4ZmZmZjsKKworCS8qIGluaXRpYWxpemUgYm9hcmQsIHBlciBSVEQgc3BlYyAqLworCS8qIGFsc28sIGluaXRpYWxpemUgc2hhZG93IHJlZ2lzdGVycyAqLworCVJ0ZFJlc2V0Qm9hcmQoZGV2KTsKKwljb21lZGlfdWRlbGF5KDEwMCk7CS8qIG5lZWRlZD8gKi8KKwlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIDApOworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsJLyogYW5kIHNldHMgc2hhZG93ICovCisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgfjApOwkvKiBhbmQgc2V0cyBzaGFkb3cgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOwkvKiBjbGVhcnMgYml0cyBzZXQgYnkgbWFzayAqLworCVJ0ZEludGVycnVwdE92ZXJydW5DbGVhcihkZXYpOworCVJ0ZENsZWFyQ0dUKGRldik7CisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisJUnRkRGFjQ2xlYXJGaWZvKGRldiwgMCk7CisJUnRkRGFjQ2xlYXJGaWZvKGRldiwgMSk7CisJLyogY2xlYXIgZGlnaXRhbCBJTyBmaWZvICovCisJUnRkRGlvU3RhdHVzV3JpdGUoZGV2LCAwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAwLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAxLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAyLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAzLCAwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCS8qIFRPRE86IHNldCB1c2VyIG91dCBzb3VyY2UgPz8/ICovCisKKwkvKiBjaGVjayBpZiBvdXIgaW50ZXJydXB0IGlzIGF2YWlsYWJsZSBhbmQgZ2V0IGl0ICovCisJaWYgKChyZXQgPSBjb21lZGlfcmVxdWVzdF9pcnEoZGV2cHJpdi0+cGNpX2Rldi0+aXJxLCBydGRfaW50ZXJydXB0LAorCQkJCUlSUUZfU0hBUkVELCBEUlZfTkFNRSwgZGV2KSkgPCAwKSB7CisJCXByaW50aygiQ291bGQgbm90IGdldCBpbnRlcnJ1cHQhICgldSlcbiIsCisJCQlkZXZwcml2LT5wY2lfZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXYtPmlycSA9IGRldnByaXYtPnBjaV9kZXYtPmlycTsKKwlwcmludGsoIiggaXJxPSV1ICkiLCBkZXYtPmlycSk7CisKKwlyZXQgPSBydGQ1MjBfcHJvYmVfZmlmb19kZXB0aChkZXYpOworCWlmKHJldCA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2cHJpdi0+Zmlmb0xlbiA9IHJldDsKKwlwcmludGsoIiggZmlmb0xlbj0lZCApIiwgZGV2cHJpdi0+Zmlmb0xlbik7CisKKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldi0+aXJxID4gMCkgeworCQlwcmludGsoIiggRE1BIGJ1ZmY9JWQgKVxuIiwgRE1BX0NIQUlOX0NPVU5UKTsKKwkJLyogVGhlIFBMWDkwODAgaGFzIDIgRE1BIGNvbnRyb2xsZXJzLCBidXQgdGhlcmUgY291bGQgYmUgNCBzb3VyY2VzOgorCQkgICBBREMsIGRpZ2l0YWwsIERBQzEsIGFuZCBEQUMyLiAgU2luY2Ugb25seSB0aGUgQURDIHN1cHBvcnRzIGNtZCBtb2RlCisJCSAgIHJpZ2h0IG5vdywgdGhpcyBpc24ndCBhbiBpc3N1ZSAoeWV0KSAqLworCQlkZXZwcml2LT5kbWEwT2Zmc2V0ID0gMDsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBETUFfQ0hBSU5fQ09VTlQ7IGluZGV4KyspIHsKKwkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyLAorCQkJCSZkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7CisJCQlpZiAoZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdID09IE5VTEwpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gcnRkX2F0dGFjaF9kaWVfZXJyb3I7CisJCQl9CisJCQkvKkRQUklOVEsgKCJidWZmWyVkXSBAICVwIHZpcnR1YWwsICV4IFBDSVxuIiwKKwkJCSAgIGluZGV4LAorCQkJICAgZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdLCBkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7ICovCisJCX0KKworCQkvKiBzZXR1cCBETUEgZGVzY3JpcHRvciByaW5nICh1c2UgY3B1X3RvX2xlMzIgZm9yIGJ5dGUgb3JkZXJpbmc/KSAqLworCQlkZXZwcml2LT5kbWEwQ2hhaW4gPQorCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCXNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKSAqIERNQV9DSEFJTl9DT1VOVCwKKwkJCSZkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcik7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IERNQV9DSEFJTl9DT1VOVDsgaW5kZXgrKykgeworCQkJZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5wY2lfc3RhcnRfYWRkciA9CisJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF07CisJCQlkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLmxvY2FsX3N0YXJ0X2FkZHIgPQorCQkJCURNQUxBRERSX0FEQzsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0udHJhbnNmZXJfc2l6ZSA9CisJCQkJc2l6ZW9mKHUxNikgKiBkZXZwcml2LT5maWZvTGVuIC8gMjsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ubmV4dCA9CisJCQkJKGRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyICsgKChpbmRleCArCisJCQkJCQkxKSAlIChETUFfQ0hBSU5fQ09VTlQpKQorCQkJCSogc2l6ZW9mKGRldnByaXYtPmRtYTBDaGFpblswXSkpCisJCQkJfCBETUFfVFJBTlNGRVJfQklUUzsKKwkJCS8qRFBSSU5USyAoInJpbmdbJWRdIEAlbHggUENJOiAleCwgbG9jYWw6ICV4LCBOOiAweCV4LCBuZXh0OiAleFxuIiwKKwkJCSAgIGluZGV4LAorCQkJICAgKChsb25nKWRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyCisJCQkgICArIChpbmRleCAqIHNpemVvZihkZXZwcml2LT5kbWEwQ2hhaW5bMF0pKSksCisJCQkgICBkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLnBjaV9zdGFydF9hZGRyLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5sb2NhbF9zdGFydF9hZGRyLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS50cmFuc2Zlcl9zaXplLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5uZXh0KTsgKi8KKwkJfQorCisJCWlmIChkZXZwcml2LT5kbWEwQ2hhaW4gPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gcnRkX2F0dGFjaF9kaWVfZXJyb3I7CisJCX0KKworCQlSdGREbWEwTW9kZShkZXYsIERNQV9NT0RFX0JJVFMpOworCQlSdGREbWEwU291cmNlKGRldiwgRE1BU19BREZJRk9fSEFMRl9GVUxMKTsJLyogc2V0IERNQSB0cmlnZ2VyIHNvdXJjZSAqLworCX0gZWxzZSB7CisJCXByaW50aygiKCBubyBJUlEtPm5vIERNQSApIik7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCWlmIChkZXYtPmlycSkgewkJLyogZW5hYmxlIHBseDkwODAgaW50ZXJydXB0cyAqLworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIElDU19QSUUgfCBJQ1NfUExJRSk7CisJfQorCisJcHJpbnRrKCJcbmNvbWVkaSVkOiBydGQ1MjAgZHJpdmVyIGF0dGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisKKwlyZXR1cm4gMTsKKworI2lmIDAKKwkvKiBoaXQgYW4gZXJyb3IsIGNsZWFuIHVwIG1lbW9yeSBhbmQgcmV0dXJuIHJldCAqLworLy9ydGRfYXR0YWNoX2RpZV9lcnJvcjoKKyNpZmRlZiBVU0VfRE1BCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBCdWZmW2luZGV4XSkgewkvKiBmcmVlIGJ1ZmZlciBtZW1vcnkgKi8KKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyLAorCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSwKKwkJCQlkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7CisJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0gPSBOVUxMOworCQl9CisJfQorCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBDaGFpbikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykKKwkJCSogRE1BX0NIQUlOX0NPVU5ULAorCQkJZGV2cHJpdi0+ZG1hMENoYWluLCBkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcik7CisJCWRldnByaXYtPmRtYTBDaGFpbiA9IE5VTEw7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwkvKiBzdWJkZXZpY2VzIGFuZCBwcml2IGFyZSBmcmVlZCBieSB0aGUgY29yZSAqLworCWlmIChkZXYtPmlycSkgeworCQkvKiBkaXNhYmxlIGludGVycnVwdCBjb250cm9sbGVyICovCisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpCisJCQkmIH4oSUNTX1BMSUUgfCBJQ1NfRE1BMF9FIHwgSUNTX0RNQTFfRSkpOworCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCisJLyogcmVsZWFzZSBhbGwgcmVnaW9ucyB0aGF0IHdlcmUgYWxsb2NhdGVkICovCisJaWYgKGRldnByaXYtPmxhczApIHsKKwkJaW91bm1hcChkZXZwcml2LT5sYXMwKTsKKwl9CisJaWYgKGRldnByaXYtPmxhczEpIHsKKwkJaW91bm1hcChkZXZwcml2LT5sYXMxKTsKKwl9CisJaWYgKGRldnByaXYtPmxjZmcpIHsKKwkJaW91bm1hcChkZXZwcml2LT5sY2ZnKTsKKwl9CisJaWYgKGRldnByaXYtPnBjaV9kZXYpIHsKKwkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CisJfQorCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworLyoKKyAqIF9kZXRhY2ggaXMgY2FsbGVkIHRvIGRlY29uZmlndXJlIGEgZGV2aWNlLiAgSXQgc2hvdWxkIGRlYWxsb2NhdGUKKyAqIHJlc291cmNlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgd2hlbiBfYXR0YWNoKCkgZmFpbHMsIHNvIGl0IHNob3VsZCBiZQorICogY2FyZWZ1bCBub3QgdG8gcmVsZWFzZSByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseQorICogYWxsb2NhdGVkIGJ5IF9hdHRhY2goKS4gIGRldi0+cHJpdmF0ZSBhbmQgZGV2LT5zdWJkZXZpY2VzIGFyZQorICogZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY29yZS4KKyAqLworc3RhdGljIGludCBydGRfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisjaWZkZWYgVVNFX0RNQQorCWludCBpbmRleDsKKyNlbmRpZgorCisJRFBSSU5USygiY29tZWRpJWQ6IHJ0ZDUyMDogcmVtb3ZpbmcgKCVsZCBpbnRzKVxuIiwKKwkJZGV2LT5taW5vciwgKGRldnByaXYgPyBkZXZwcml2LT5pbnRDb3VudCA6IDBMKSk7CisJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bGNmZykgeworCQlEUFJJTlRLKCIoaW50IHN0YXR1cyAweCV4LCBvdmVycnVuIHN0YXR1cyAweCV4LCBmaWZvIHN0YXR1cyAweCV4KS4uLlxuIiwgMHhmZmZmICYgUnRkSW50ZXJydXB0U3RhdHVzKGRldiksIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSwgKDB4ZmZmZiAmIFJ0ZEZpZm9TdGF0dXMoZGV2KSkgXiAweDY2NjYpOworCX0KKworCWlmIChkZXZwcml2KSB7CisJCS8qIFNodXQgZG93biBhbnkgYm9hcmQgb3BzIGJ5IHJlc2V0dGluZyBpdCAqLworI2lmZGVmIFVTRV9ETUEKKwkJaWYgKGRldnByaXYtPmxjZmcpIHsKKwkJCVJ0ZERtYTBDb250cm9sKGRldiwgMCk7CS8qIGRpc2FibGUgRE1BICovCisJCQlSdGREbWExQ29udHJvbChkZXYsIDApOwkvKiBkaXNhYmxlIERNQSAqLworCQkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCBJQ1NfUElFIHwgSUNTX1BMSUUpOworCQl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCQlpZiAoZGV2cHJpdi0+bGFzMCkgeworCQkJUnRkUmVzZXRCb2FyZChkZXYpOworCQkJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOworCQkJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgfjApOworCQkJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsJLyogY2xlYXJzIGJpdHMgc2V0IGJ5IG1hc2sgKi8KKwkJfQorI2lmZGVmIFVTRV9ETUEKKwkJLyogcmVsZWFzZSBETUEgKi8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCQlpZiAoTlVMTCAhPSBkZXZwcml2LT5kbWEwQnVmZltpbmRleF0pIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJCXNpemVvZih1MTYpICogZGV2cHJpdi0+Zmlmb0xlbiAvIDIsCisJCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSwKKwkJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF0pOworCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9IE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKE5VTEwgIT0gZGV2cHJpdi0+ZG1hMENoYWluKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpICogRE1BX0NIQUlOX0NPVU5ULAorCQkJCWRldnByaXYtPmRtYTBDaGFpbiwgZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIpOworCQkJZGV2cHJpdi0+ZG1hMENoYWluID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCQkvKiByZWxlYXNlIElSUSAqLworCQlpZiAoZGV2LT5pcnEpIHsKKwkJCS8qIGRpc2FibGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwkJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpCisJCQkJJiB+KElDU19QTElFIHwgSUNTX0RNQTBfRSB8IElDU19ETUExX0UpKTsKKwkJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJfQorCisJCS8qIHJlbGVhc2UgYWxsIHJlZ2lvbnMgdGhhdCB3ZXJlIGFsbG9jYXRlZCAqLworCQlpZiAoZGV2cHJpdi0+bGFzMCkgeworCQkJaW91bm1hcChkZXZwcml2LT5sYXMwKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+bGFzMSkgeworCQkJaW91bm1hcChkZXZwcml2LT5sYXMxKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+bGNmZykgeworCQkJaW91bm1hcChkZXZwcml2LT5sY2ZnKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+cGNpX2RldikgeworCQkJaWYgKGRldnByaXYtPmdvdF9yZWdpb25zKSB7CisJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOworCQkJfQorCQkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CisJCX0KKwl9CisKKwlwcmludGsoImNvbWVkaSVkOiBydGQ1MjA6IHJlbW92ZWQuXG4iLCBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCisvKgorICBDb252ZXJ0IGEgc2luZ2xlIGNvbWVkaSBjaGFubmVsLWdhaW4gZW50cnkgdG8gYSBSVEQ1MjAgdGFibGUgZW50cnkKKyovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcnRkQ29udmVydENoYW5HYWluKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGNvbWVkaUNoYW4sIGludCBjaGFuSW5kZXgpCit7CQkJCS8qIGluZGV4IGluIGNoYW5uZWwgbGlzdCAqLworCXVuc2lnbmVkIGludCBjaGFuLCByYW5nZSwgYXJlZjsKKwl1bnNpZ25lZCBzaG9ydCByID0gMDsKKworCWNoYW4gPSBDUl9DSEFOKGNvbWVkaUNoYW4pOworCXJhbmdlID0gQ1JfUkFOR0UoY29tZWRpQ2hhbik7CisJYXJlZiA9IENSX0FSRUYoY29tZWRpQ2hhbik7CisKKwlyIHw9IGNoYW4gJiAweGY7CisKKwkvKiBOb3RlOiB3ZSBhbHNvIHNldHVwIHRoZSBjaGFubmVsIGxpc3QgYmlwb2xhciBmbGFnIGFycmF5ICovCisJaWYgKHJhbmdlIDwgdGhpc2JvYXJkLT5yYW5nZTEwU3RhcnQpIHsJLyogZmlyc3QgYmF0Y2ggYXJlICstNSAqLworCQlyIHw9IDB4MDAwOwkvKiArLTUgcmFuZ2UgKi8KKwkJciB8PSAocmFuZ2UgJiAweDcpIDw8IDQ7CS8qIGdhaW4gKi8KKwkJQ0hBTl9BUlJBWV9TRVQoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfSBlbHNlIGlmIChyYW5nZSA8IHRoaXNib2FyZC0+cmFuZ2VVbmlTdGFydCkgewkvKiBzZWNvbmQgYmF0Y2ggYXJlICstMTAgKi8KKwkJciB8PSAweDEwMDsJLyogKy0xMCByYW5nZSAqLworCQlyIHw9ICgocmFuZ2UgLSB0aGlzYm9hcmQtPnJhbmdlMTBTdGFydCkgJiAweDcpIDw8IDQ7CS8qIGdhaW4gKi8KKwkJQ0hBTl9BUlJBWV9TRVQoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfSBlbHNlIHsJCS8qIGxhc3QgYmF0Y2ggaXMgKzEwICovCisJCXIgfD0gMHgyMDA7CS8qICsxMCByYW5nZSAqLworCQlyIHw9ICgocmFuZ2UgLSB0aGlzYm9hcmQtPnJhbmdlVW5pU3RhcnQpICYgMHg3KSA8PCA0OwkvKiBnYWluICovCisJCUNIQU5fQVJSQVlfQ0xFQVIoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfQorCisJc3dpdGNoIChhcmVmKSB7CisJY2FzZSBBUkVGX0dST1VORDoJLyogb24tYm9hcmQgZ3JvdW5kICovCisJCWJyZWFrOworCisJY2FzZSBBUkVGX0NPTU1PTjoKKwkJciB8PSAweDgwOwkvKiByZWYgZXh0ZXJuYWwgYW5hbG9nIGNvbW1vbiAqLworCQlicmVhazsKKworCWNhc2UgQVJFRl9ESUZGOgorCQlyIHw9IDB4NDAwOwkvKiBkaWZmZXJlbnRpYWwgaW5wdXRzICovCisJCWJyZWFrOworCisJY2FzZSBBUkVGX09USEVSOgkvKiA/Pz8gKi8KKwkJYnJlYWs7CisJfQorCS8qcHJpbnRrICgiY2hhbj0lZCByPSVkIGE9JWQgLT4gMHgleFxuIiwKKwkgICBjaGFuLCByYW5nZSwgYXJlZiwgcik7ICovCisJcmV0dXJuIHI7Cit9CisKKy8qCisgIFNldHVwIHRoZSBjaGFubmVsLWdhaW4gdGFibGUgZnJvbSBhIGNvbWVkaSBsaXN0CisqLworc3RhdGljIHZvaWQgcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGludCBuX2NoYW4sIHVuc2lnbmVkIGludCAqbGlzdCkKK3sKKwlpZiAobl9jaGFuID4gMSkgewkvKiBzZXR1cCBjaGFubmVsIGdhaW4gdGFibGUgKi8KKwkJaW50IGlpOworCQlSdGRDbGVhckNHVChkZXYpOworCQlSdGRFbmFibGVDR1QoZGV2LCAxKTsJLyogZW5hYmxlIHRhYmxlICovCisJCWZvciAoaWkgPSAwOyBpaSA8IG5fY2hhbjsgaWkrKykgeworCQkJUnRkV3JpdGVDR1RhYmxlKGRldiwgcnRkQ29udmVydENoYW5HYWluKGRldiwgbGlzdFtpaV0sCisJCQkJCWlpKSk7CisJCX0KKwl9IGVsc2UgewkJLyoganVzdCB1c2UgdGhlIGNoYW5uZWwgZ2FpbiBsYXRjaCAqLworCQlSdGRFbmFibGVDR1QoZGV2LCAwKTsJLyogZGlzYWJsZSB0YWJsZSwgZW5hYmxlIGxhdGNoICovCisJCVJ0ZFdyaXRlQ0dMYXRjaChkZXYsIHJ0ZENvbnZlcnRDaGFuR2FpbihkZXYsIGxpc3RbMF0sIDApKTsKKwl9Cit9CisKKy8qIGRldGVybWluZSBmaWZvIHNpemUgYnkgZG9pbmcgYWRjIGNvbnZlcnNpb25zIHVudGlsIHRoZSBmaWZvIGhhbGYKK2VtcHR5IHN0YXR1cyBmbGFnIGNsZWFycyAqLworc3RhdGljIGludCBydGQ1MjBfcHJvYmVfZmlmb19kZXB0aChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJbHNhbXBsX3QgY2hhbnNwZWMgPSBDUl9QQUNLKDAsIDAsIEFSRUZfR1JPVU5EKTsKKwl1bnNpZ25lZCBpOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsaW1pdCA9IDB4MjAwMDsKKwl1bnNpZ25lZCBmaWZvX3NpemUgPSAwOworCisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIDEsICZjaGFuc3BlYyk7CisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSAqLworCS8qIGNvbnZlcnQgIHNhbXBsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7ICsraSkgeworCQl1bnNpZ25lZCBmaWZvX3N0YXR1czsKKwkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCisJCVJ0ZEFkY1N0YXJ0KGRldik7CisJCWNvbWVkaV91ZGVsYXkoMSk7CisJCWZpZm9fc3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCQlpZigoZmlmb19zdGF0dXMgJiBGU19BRENfSEVNUFRZKSA9PSAwKSB7CisJCQlmaWZvX3NpemUgPSAyICogaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmKGkgPT0gbGltaXQpCisJeworCQlydF9wcmludGsoIlxuY29tZWRpOiAlczogZmFpbGVkIHRvIHByb2JlIGZpZm8gc2l6ZS5cbiIsIERSVl9OQU1FKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCWlmKGZpZm9fc2l6ZSAhPSAweDQwMCB8fCBmaWZvX3NpemUgIT0gMHgyMDAwKQorCXsKKwkJcnRfcHJpbnRrKCJcbmNvbWVkaTogJXM6IHVuZXhwZWN0ZWQgZmlmbyBzaXplIG9mICVpLCBleHBlY3RlZCAxMDI0IG9yIDgxOTIuXG4iLAorCQkJRFJWX05BTUUsIGZpZm9fc2l6ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gZmlmb19zaXplOworfQorCisvKgorICAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgorICBtb2RlIChzaW1wbGVzdCBjYXNlKS4KKyAgVGhpcyBkb2VzbnQgdXNlIGludGVycnVwdHMuCisKKyAgTm90ZSwgd2UgZG9uJ3QgZG8gYW55IHNldHRsaW5nIGRlbGF5cy4gIFVzZSBhIGluc3RydWN0aW9uIGxpc3QgdG8KKyAgc2VsZWN0LCBkZWxheSwgdGhlbiByZWFkLgorICovCitzdGF0aWMgaW50IHJ0ZF9haV9yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgaWk7CisJaW50IHN0YXQ7CisKKwkvKiBjbGVhciBhbnkgb2xkIGZpZm8gZGF0YSAqLworCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCisJLyogd3JpdGUgY2hhbm5lbCB0byBtdWx0aXBsZXhlciBhbmQgY2xlYXIgY2hhbm5lbCBnYWluIHRhYmxlICovCisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIDEsICZpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBzZXQgY29udmVyc2lvbiBzb3VyY2UgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlICovCisKKwkvKiBjb252ZXJ0IG4gc2FtcGxlcyAqLworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJczE2IGQ7CisJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLworCQlSdGRBZGNTdGFydChkZXYpOworCisJCWZvciAoaWkgPSAwOyBpaSA8IFJURF9BRENfVElNRU9VVDsgKytpaSkgeworCQkJc3RhdCA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkJCWlmIChzdGF0ICYgRlNfQURDX05PVF9FTVBUWSkJLyogMSAtPiBub3QgZW1wdHkgKi8KKwkJCQlicmVhazsKKwkJCVdBSVRfUVVJRVRMWTsKKwkJfQorCQlpZiAoaWkgPj0gUlREX0FEQ19USU1FT1VUKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IEVycm9yOiBBREMgbmV2ZXIgZmluaXNoZWQhIEZpZm9TdGF0dXM9MHgleFxuIiwgc3RhdCBeIDB4NjY2Nik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCS8qIHJlYWQgZGF0YSAqLworCQlkID0gUnRkQWRjRmlmb0dldChkZXYpOwkvKiBnZXQgMnMgY29tcCB2YWx1ZSAqLworCQkvKnByaW50ayAoInJ0ZDUyMDogR290IDB4JXggYWZ0ZXIgJWQgdXNlY1xuIiwgZCwgaWkrMSk7ICovCisJCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlpZiAoQ0hBTl9BUlJBWV9URVNUKGRldnByaXYtPmNoYW5CaXBvbGFyLCAwKSkgeworCQkJZGF0YVtuXSA9IGQgKyAyMDQ4OwkvKiBjb252ZXJ0IHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCisJCX0gZWxzZSB7CisJCQlkYXRhW25dID0gZDsKKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCisJcmV0dXJuIG47Cit9CisKKy8qCisgIEdldCB3aGF0IHdlIGtub3cgaXMgdGhlcmUuLi4uIEZhc3QhCisgIFRoaXMgdXNlcyAxLzIgdGhlIGJ1cyBjeWNsZXMgb2YgcmVhZF9kcmVncyAoYmVsb3cpLgorCisgIFRoZSBtYW51YWwgY2xhaW1zIHRoYXQgd2UgY2FuIGRvIGEgbHdvcmQgcmVhZCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBoZXJlLgorKi8KK3N0YXRpYyBpbnQgYWlfcmVhZF9uKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLCBpbnQgY291bnQpCit7CisJaW50IGlpOworCisJZm9yIChpaSA9IDA7IGlpIDwgY291bnQ7IGlpKyspIHsKKwkJc2FtcGxfdCBzYW1wbGU7CisJCXMxNiBkOworCisJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogZG9uZSAqLworCQkJZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogUmVhZCBOIGFuZCBkaXNjYXJkICovCisJCQljb250aW51ZTsKKwkJfQorI2lmIDAKKwkJaWYgKDAgPT0gKFJ0ZEZpZm9TdGF0dXMoZGV2KSAmIEZTX0FEQ19OT1RfRU1QVFkpKSB7CS8qIERFQlVHICovCisJCQlEUFJJTlRLKCJjb21lZGk6IFJFQUQgT09QUyBvbiAlZCBvZiAlZFxuIiwgaWkgKyAxLAorCQkJCWNvdW50KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogZ2V0IDJzIGNvbXAgdmFsdWUgKi8KKworCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gZCArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9IGQ7CisJCX0KKwkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgc2FtcGxlKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApCS8qIDwgMCwgbWVhbnMgcmVhZCBmb3JldmVyICovCisJCQlkZXZwcml2LT5haUNvdW50LS07CisJfQorCXJldHVybiAwOworfQorCisvKgorICB1bmtub3duIGFtb3V0IG9mIGRhdGEgaXMgd2FpdGluZyBpbiBmaWZvLgorKi8KK3N0YXRpYyBpbnQgYWlfcmVhZF9kcmVncyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl3aGlsZSAoUnRkRmlmb1N0YXR1cyhkZXYpICYgRlNfQURDX05PVF9FTVBUWSkgewkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQlzYW1wbF90IHNhbXBsZTsKKwkJczE2IGQgPSBSdGRBZGNGaWZvR2V0KGRldik7CS8qIGdldCAycyBjb21wIHZhbHVlICovCisKKwkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBkb25lICovCisJCQljb250aW51ZTsJLyogcmVhZCByZXN0ICovCisJCX0KKworCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gZCArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9IGQ7CisJCX0KKwkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgc2FtcGxlKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApCS8qIDwgMCwgbWVhbnMgcmVhZCBmb3JldmVyICovCisJCQlkZXZwcml2LT5haUNvdW50LS07CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX0RNQQorLyoKKyAgVGVybWluYXRlIGEgRE1BIHRyYW5zZmVyIGFuZCB3YWl0IGZvciBldmVyeXRoaW5nIHRvIHF1aWV0IGRvd24KKyovCit2b2lkIGFib3J0X2RtYShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sJCQkJLyogRE1BIGNoYW5uZWwgMCwgMSAqLworCXVuc2lnbmVkIGxvbmcgZG1hX2NzX2FkZHI7CS8qIHRoZSBjb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworCXVpbnQ4X3Qgc3RhdHVzOworCXVuc2lnbmVkIGludCBpaTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkbWFfY3NfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRldnByaXYtPmxjZmcKKwkJKyAoKGNoYW5uZWwgPT0gMCkgPyBMQ0ZHX0RNQUNTUjAgOiBMQ0ZHX0RNQUNTUjEpOworCisJLy8gc3BpbmxvY2sgZm9yIHBseCBkbWEgY29udHJvbC9zdGF0dXMgcmVnCisJLy9jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoICZkZXYtPnNwaW5sb2NrLCBmbGFncyApOworCisJLy8gYWJvcnQgZG1hIHRyYW5zZmVyIGlmIG5lY2Vzc2FyeQorCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlpZiAoKHN0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSA9PSAwKSB7CS8qIG5vdCBlbmFibGVkIChFcnJvcj8pICovCisJCURQUklOVEsoInJ0ZDUyMDogQWJvcnREbWEgb24gbm9uLWFjdGl2ZSBjaGFubmVsICVkICgweCV4KVxuIiwKKwkJCWNoYW5uZWwsIHN0YXR1cyk7CisJCWdvdG8gYWJvcnREbWFFeGl0OworCX0KKworCS8qIHdhaXQgdG8gbWFrZSBzdXJlIGRvbmUgYml0IGlzIHplcm8gKG5lZWRlZD8pICovCisJZm9yIChpaSA9IDA7IChzdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSAmJiBpaSA8IFJURF9ETUFfVElNRU9VVDsgaWkrKykgeworCQlXQUlUX1FVSUVUTFk7CisJCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwl9CisJaWYgKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpIHsKKwkJcHJpbnRrKCJydGQ1MjA6IFRpbWVvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgY2xlYXJcbiIsCisJCQljaGFubmVsKTsKKwkJZ290byBhYm9ydERtYUV4aXQ7CisJfQorCisJLyogZGlzYWJsZSBjaGFubmVsIChyZXF1aXJlZCkgKi8KKwl3cml0ZWIoMCwgZG1hX2NzX2FkZHIpOworCWNvbWVkaV91ZGVsYXkoMSk7CS8qIG5lZWRlZD8/ICovCisJLyogc2V0IGFib3J0IGJpdCBmb3IgY2hhbm5lbCAqLworCXdyaXRlYihQTFhfRE1BX0FCT1JUX0JJVCwgZG1hX2NzX2FkZHIpOworCisJLy8gd2FpdCBmb3IgZG1hIGRvbmUgYml0IHRvIGJlIHNldAorCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlmb3IgKGlpID0gMDsKKwkJKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpID09IDAgJiYgaWkgPCBSVERfRE1BX1RJTUVPVVQ7CisJCWlpKyspIHsKKwkJc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCQlXQUlUX1FVSUVUTFk7CisJfQorCWlmICgoc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgPT0gMCkgeworCQlwcmludGsoInJ0ZDUyMDogVGltZW91dCB3YWl0aW5nIGZvciBkbWEgJWkgZG9uZSBzZXRcbiIsCisJCQljaGFubmVsKTsKKwl9CisKKyAgICAgIGFib3J0RG1hRXhpdDoKKwkvL2NvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmZGV2LT5zcGlubG9jaywgZmxhZ3MgKTsKK30KKworLyoKKyAgUHJvY2VzcyB3aGF0IGlzIGluIHRoZSBETUEgdHJhbnNmZXIgYnVmZmVyIGFuZCBwYXNzIHRvIGNvbWVkaQorICBOb3RlOiB0aGlzIGlzIG5vdCByZS1lbnRyYW50CisqLworc3RhdGljIGludCBhaV9wcm9jZXNzX2RtYShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlpbnQgaWksIG47CisJczE2ICpkcDsKKworCWlmIChkZXZwcml2LT5haUNvdW50ID09IDApCS8qIHRyYW5zZmVyIGFscmVhZHkgY29tcGxldGUgKi8KKwkJcmV0dXJuIDA7CisKKwlkcCA9IGRldnByaXYtPmRtYTBCdWZmW2RldnByaXYtPmRtYTBPZmZzZXRdOworCWZvciAoaWkgPSAwOyBpaSA8IGRldnByaXYtPmZpZm9MZW4gLyAyOykgewkvKiBjb252ZXJ0IHNhbXBsZXMgKi8KKwkJc2FtcGxfdCBzYW1wbGU7CisKKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gKCpkcCA+PiAzKSArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9ICpkcCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJfQorCQkqZHArKyA9IHNhbXBsZTsJLyogcHV0IHByb2Nlc3NlZCB2YWx1ZSBiYWNrICovCisKKwkJaWYgKCsrcy0+YXN5bmMtPmN1cl9jaGFuID49IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuKQorCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKworCQkrK2lpOwkJLyogbnVtYmVyIHJlYWR5IHRvIHRyYW5zZmVyICovCisJCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkgewkvKiA8IDAsIG1lYW5zIHJlYWQgZm9yZXZlciAqLworCQkJaWYgKC0tZGV2cHJpdi0+YWlDb3VudCA9PSAwKSB7CS8qIGRvbmUgKi8KKwkJCQkvKkRQUklOVEsgKCJydGQ1MjA6IEZpbmFsICVkIHNhbXBsZXNcbiIsIGlpKTsgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIG5vdyBwYXNzIHRoZSB3aG9sZSBhcnJheSB0byB0aGUgY29tZWRpIGJ1ZmZlciAqLworCWRwID0gZGV2cHJpdi0+ZG1hMEJ1ZmZbZGV2cHJpdi0+ZG1hME9mZnNldF07CisJbiA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Mocy0+YXN5bmMsIGlpICogc2l6ZW9mKHMxNikpOworCWlmIChuIDwgKGlpICogc2l6ZW9mKHMxNikpKSB7CS8qIGFueSByZXNpZHVhbCBpcyBhbiBlcnJvciAqLworCQlEUFJJTlRLKCJydGQ1MjA6YWlfcHJvY2Vzc19kbWEgYnVmZmVyIG92ZXJmbG93ICVkIHNhbXBsZXMhXG4iLAorCQkJaWkgLSAobiAvIHNpemVvZihzMTYpKSk7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm4gLTE7CisJfQorCWNvbWVkaV9idWZfbWVtY3B5X3RvKHMtPmFzeW5jLCAwLCBkcCwgbik7CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKHMtPmFzeW5jLCBuKTsKKworCS8qIGFsd2F5cyBhdCBsZWFzdCAxIHNjYW4gLS0gMS8yIEZJRk8gaXMgbGFyZ2VyIHRoYW4gb3VyIG1heCBzY2FuIGxpc3QgKi8KKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1M7CisKKwlpZiAoKytkZXZwcml2LT5kbWEwT2Zmc2V0ID49IERNQV9DSEFJTl9DT1VOVCkgewkvKiBuZXh0IGJ1ZmZlciAqLworCQlkZXZwcml2LT5kbWEwT2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisvKgorICBIYW5kbGUgYWxsIHJ0ZDUyMCBpbnRlcnJ1cHRzLgorICBSdW5zIGF0b21pY2FsbHkgYW5kIGlzIG5ldmVyIHJlLWVudGVyZWQuCisgIFRoaXMgaXMgYSAic2xvdyBoYW5kbGVyIjsgIG90aGVyIGludGVycnVwdHMgbWF5IGJlIGFjdGl2ZS4KKyAgVGhlIGRhdGEgY29udmVyc2lvbiBtYXkgc29tZWRheSBoYXBwZW4gaW4gYSAiYm90dG9tIGhhbGYiLgorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBydGRfaW50ZXJydXB0KGludCBpcnEsCS8qIGludGVycnVwdCBudW1iZXIgKGlnbm9yZWQpICovCisJdm9pZCAqZAkJCS8qIG91ciBkYXRhICovCisJUFRfUkVHU19BUkcpCit7CQkJCS8qIGNwdSBjb250ZXh0IChpZ25vcmVkKSAqLworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CS8qIG11c3QgYmUgY2FsbGVkICJkZXYiIGZvciBkZXZwcml2ICovCisJdTE2IHN0YXR1czsKKwl1MTYgZmlmb1N0YXR1czsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsJLyogYW5hbG9nIGluIHN1YmRldmljZSAqLworCisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlkZXZwcml2LT5pbnRDb3VudCsrOwkvKiBERUJVRyBzdGF0aXN0aWNzICovCisKKwlmaWZvU3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCS8qIGNoZWNrIGZvciBGSUZPIGZ1bGwsIHRoaXMgYXV0b21hdGljYWxseSBoYWx0cyB0aGUgQURDISAqLworCWlmICghKGZpZm9TdGF0dXMgJiBGU19BRENfTk9UX0ZVTEwpKSB7CS8qIDAgLT4gZnVsbCAqLworCQlEUFJJTlRLKCJydGQ1MjA6IEZJRk8gZnVsbCEgZmlmb19zdGF0dXM9MHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsJLyogc2hvdWxkIGJlIGFsbCAwcyAqLworCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJfQorI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2cHJpdi0+ZmxhZ3MgJiBETUEwX0FDVElWRSkgewkvKiBDaGVjayBETUEgKi8KKwkJdTMyIGlzdGF0dXMgPSBSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldik7CisKKwkJaWYgKGlzdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CisJCQlpZiAoYWlfcHJvY2Vzc19kbWEoZGV2LCBzKSA8IDApIHsKKwkJCQlEUFJJTlRLKCJydGQ1MjA6IGNvbWVkaSByZWFkIGJ1ZmZlciBvdmVyZmxvdyAoRE1BKSB3aXRoICVsZCB0byBnbyFcbiIsIGRldnByaXYtPmFpQ291bnQpOworCQkJCVJ0ZERtYTBDb250cm9sKGRldiwKKwkJCQkJKGRldnByaXYtPgorCQkJCQkJZG1hMENvbnRyb2wgJgorCQkJCQkJflBMWF9ETUFfU1RBUlRfQklUKQorCQkJCQl8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQpOworCQkJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwkJCX0KKworCQkJLypEUFJJTlRLICgicnRkNTIwOiBETUEgdHJhbnNmZXI6ICVsZCB0byBnbywgaXN0YXR1cyAleFxuIiwKKwkJCSAgIGRldnByaXYtPmFpQ291bnQsIGlzdGF0dXMpOyAqLworCQkJUnRkRG1hMENvbnRyb2woZGV2LAorCQkJCShkZXZwcml2LT5kbWEwQ29udHJvbCAmIH5QTFhfRE1BX1NUQVJUX0JJVCkKKwkJCQl8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQpOworCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZXMgRG9uZSAoRE1BKS5cbiIpOworCQkJCWdvdG8gdHJhbnNmZXJEb25lOworCQkJfQorCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCX0gZWxzZSB7CisJCQkvKkRQUklOVEsgKCJydGQ1MjA6IE5vIERNQSByZWFkeTogaXN0YXR1cyAleFxuIiwgaXN0YXR1cyk7ICovCisJCX0KKwl9CisJLyogRmFsbCB0aHJvdWdoIGFuZCBjaGVjayBmb3Igb3RoZXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKwlzdGF0dXMgPSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KTsKKwkvKiBpZiBpbnRlcnJ1cHQgd2FzIG5vdCBjYXVzZWQgYnkgb3VyIGJvYXJkLCBvciBoYW5kbGVkIGFib3ZlICovCisJaWYgKDAgPT0gc3RhdHVzKSB7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoc3RhdHVzICYgSVJRTV9BRENfQUJPVVRfQ05UKSB7CS8qIHNhbXBsZSBjb3VudCAtPiByZWFkIEZJRk8gKi8KKwkJLyogc2luY2UgdGhlIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIG1heSBoYXZlIHF1ZXVlZCBhIHNhbXBsZQorCQkgICBjb3VudGVyIGludGVycnVwdCwgZXZlbiB0aG91Z2ggd2UgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkLAorCQkgICB3ZSBtdXN0IGhhbmRsZSB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGVyZSBpcyBubyBkYXRhIGhlcmUgKi8KKwkJaWYgKCEoZmlmb1N0YXR1cyAmIEZTX0FEQ19IRU1QVFkpKSB7CS8qIDAgLT4gMS8yIGZ1bGwgKi8KKwkJCS8qRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LCByZWFkaW5nIDEvMkZJRk8uICBmaWZvX3N0YXR1cyAweCV4XG4iLAorCQkJICAgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsgKi8KKwkJCWlmIChhaV9yZWFkX24oZGV2LCBzLCBkZXZwcml2LT5maWZvTGVuIC8gMikgPCAwKSB7CisJCQkJRFBSSU5USygicnRkNTIwOiBjb21lZGkgcmVhZCBidWZmZXIgb3ZlcmZsb3cgKDEvMkZJRk8pIHdpdGggJWxkIHRvIGdvIVxuIiwgZGV2cHJpdi0+YWlDb3VudCk7CisJCQkJZ290byBhYm9ydFRyYW5zZmVyOworCQkJfQorCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZXMgRG9uZSAoMS8yKS4gZmlmb19zdGF0dXMgd2FzIDB4JXhcbiIsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CS8qIHNob3VsZCBiZSBhbGwgMHMgKi8KKwkJCQlnb3RvIHRyYW5zZmVyRG9uZTsKKwkJCX0KKwkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQl9IGVsc2UgaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPiAwKSB7CS8qIHJlYWQgb2Z0ZW4gKi8KKwkJCS8qRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LCByZWFkaW5nICVkICBmaWZvX3N0YXR1cyAweCV4XG4iLAorCQkJICAgZGV2cHJpdi0+dHJhbnNDb3VudCwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsgKi8KKwkJCWlmIChmaWZvU3RhdHVzICYgRlNfQURDX05PVF9FTVBUWSkgewkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQkJCWlmIChhaV9yZWFkX24oZGV2LCBzLCBkZXZwcml2LT50cmFuc0NvdW50KSA8IDApIHsKKwkJCQkJRFBSSU5USygicnRkNTIwOiBjb21lZGkgcmVhZCBidWZmZXIgb3ZlcmZsb3cgKE4pIHdpdGggJWxkIHRvIGdvIVxuIiwgZGV2cHJpdi0+YWlDb3VudCk7CisJCQkJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwkJCQl9CisJCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGVzIERvbmUgKE4pLiBmaWZvX3N0YXR1cyB3YXMgMHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsKKwkJCQkJZ290byB0cmFuc2ZlckRvbmU7CisJCQkJfQorCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJfQorCQl9IGVsc2UgewkvKiB3YWl0IGZvciAxLzIgRklGTyAob2xkKSAqLworCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LiAgV2FpdCBmb3IgMS8yLiBmaWZvX3N0YXR1cyAweCV4XG4iLCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOworCQl9CisJfSBlbHNlIHsKKwkJRFBSSU5USygicnRkNTIwOiB1bmtub3duIGludGVycnVwdCBzb3VyY2UhXG4iKTsKKwl9CisKKwlpZiAoMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpKSB7CS8qIGludGVycnVwdCBvdmVycnVuICovCisJCURQUklOVEsoInJ0ZDUyMDogSW50ZXJydXB0IG92ZXJydW4gd2l0aCAlbGQgdG8gZ28hIG92ZXJfc3RhdHVzPTB4JXhcbiIsIGRldnByaXYtPmFpQ291bnQsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwl9CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgc3RhdHVzKTsKKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOworCXJldHVybiBJUlFfSEFORExFRDsKKworICAgICAgYWJvcnRUcmFuc2ZlcjoKKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsJLyogY2xlYXJzIGZ1bGwgZmxhZyAqLworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCWRldnByaXYtPmFpQ291bnQgPSAwOwkvKiBzdG9wIGFuZCBkb24ndCB0cmFuc2ZlciBhbnkgbW9yZSAqLworCS8qIGZhbGwgaW50byB0cmFuc2ZlckRvbmUgKi8KKworICAgICAgdHJhbnNmZXJEb25lOgorCVJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsIDApOwkvKiBzdG9wIG9uIFNPRlRXQVJFIHN0b3AgKi8KKwlSdGRQYWNlclN0b3AoZGV2KTsJLyogU3RvcCBQQUNFUiAqLworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlciBvbmx5ICovCisJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOwkvKiBtYXNrIG91dCBTQU1QTEUgKi8KKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsKKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBkaXNhYmxlIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIH5JQ1NfRE1BMF9FKTsKKwkJYWJvcnRfZG1hKGRldiwgMCk7CisJCWRldnByaXYtPmZsYWdzICY9IH5ETUEwX0FDVElWRTsKKwkJLyogaWYgVXNpbmcgRE1BLCB0aGVuIHdlIHNob3VsZCBoYXZlIHJlYWQgZXZlcnl0aGluZyBieSBub3cgKi8KKwkJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IExvc3QgRE1BIGRhdGEhICVsZCByZW1haW5cbiIsCisJCQkJZGV2cHJpdi0+YWlDb3VudCk7CisJCX0KKwl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKSB7CS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnl0aGluZyBsZWZ0ICovCisJCWZpZm9TdGF0dXMgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCURQUklOVEsoInJ0ZDUyMDogRmluaXNoaW5nIHVwLiAlbGQgcmVtYWluLCBmaWZvU3RhdD0leFxuIiwgZGV2cHJpdi0+YWlDb3VudCwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsJLyogc2hvdWxkIHJlYWQgYWxsIDBzICovCisJCWFpX3JlYWRfZHJlZ3MoZGV2LCBzKTsJLyogcmVhZCBhbnl0aGluZyBsZWZ0IGluIEZJRk8gKi8KKwl9CisKKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CS8qIHNpZ25hbCBlbmQgdG8gY29tZWRpICovCisJY29tZWRpX2V2ZW50KGRldiwgcyk7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJc3RhdHVzID0gUnRkSW50ZXJydXB0U3RhdHVzKGRldik7CisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgc3RhdHVzKTsKKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOworCisJZmlmb1N0YXR1cyA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsJLyogREVCVUcgKi8KKwlEUFJJTlRLKCJydGQ1MjA6IEFjcXVpc2l0aW9uIGNvbXBsZXRlLiAlbGQgaW50cywgaW50U3RhdD0leCwgb3ZlclN0YXQ9JXhcbiIsIGRldnByaXYtPmludENvdW50LCBzdGF0dXMsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZiAwCisvKgorICByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZQorKi8KK3N0YXRpYyBpbnQgcnRkX2FpX3BvbGwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJLyogVE9ETzogVGhpcyBuZWVkcyB0byBtYXNrIGludGVycnVwdHMsIHJlYWRfZHJlZ3MsIGFuZCB0aGVuIHJlLWVuYWJsZSAqLworCS8qIE5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgRE1BIGlzIGFjdGl2ZSAqLworCXJldHVybiBzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gcy0+YXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworfQorI2VuZGlmCisKKy8qCisgIGNtZHRlc3QgdGVzdHMgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgdG8gc2VlIGlmIGl0IGlzIHZhbGlkLgorICBVc2luZyB0aGUgY21kdGVzdCBpb2N0bCwgYSB1c2VyIGNhbiBjcmVhdGUgYSB2YWxpZCBjbWQKKyAgYW5kIHRoZW4gaGF2ZSBpdCBleGVjdXRlZCBieSB0aGUgY21kIGlvY3RsIChhc3luY3Jvbm91c2x5KS4KKworICBjbWR0ZXN0IHJldHVybnMgMSwyLDMsNCBvciAwLCBkZXBlbmRpbmcgb24gd2hpY2ggdGVzdHMKKyAgdGhlIGNvbW1hbmQgcGFzc2VzLgorKi8KKworc3RhdGljIGludCBydGRfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykgeworCQllcnIrKzsKKwl9CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZQorCSAgIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpIHsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCkgeworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkgeworCQllcnIrKzsKKwl9CisKKwlpZiAoZXJyKSB7CisJCXJldHVybiAyOworCX0KKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkvKiBOb3RlOiB0aGVzZSBhcmUgdGltZSBwZXJpb2RzLCBub3QgYWN0dWFsIHJhdGVzICovCisJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IFJURF9NQVhfU1BFRURfMSkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBSVERfTUFYX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gUlREX01JTl9TUEVFRF8xKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NSU5fU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IFJURF9NQVhfU1BFRUQpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gUlREX01BWF9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiBSVERfTUlOX1NQRUVEKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NSU5fU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzaG91bGQgYmUgbGV2ZWwvZWRnZSwgaGkvbG8gc3BlY2lmaWNhdGlvbiBoZXJlICovCisJCS8qIHNob3VsZCBzcGVjaWZ5IG11bHRpcGxlIGV4dGVybmFsIHRyaWdnZXJzICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gOSkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDk7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IFJURF9NQVhfU1BFRURfMSkgeworCQkJCWNtZC0+Y29udmVydF9hcmcgPSBSVERfTUFYX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPmNvbnZlcnRfYXJnID4gUlREX01JTl9TUEVFRF8xKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NSU5fU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IFJURF9NQVhfU1BFRUQpIHsKKwkJCQljbWQtPmNvbnZlcnRfYXJnID0gUlREX01BWF9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiBSVERfTUlOX1NQRUVEKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NSU5fU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzZWUgYWJvdmUgKi8KKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiA5KSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gOTsKKwkJCWVycisrOworCQl9CisJfQorCisjaWYgMAorCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisjZW5kaWYKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIFRPRE8gY2hlY2sgZm9yIHJvdW5kaW5nIGVycm9yIGR1ZSB0byBjb3VudGVyIHdyYXAgKi8KKworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikgeworCQlyZXR1cm4gMzsKKwl9CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiBSVERfTUFYX0NIQU5MSVNUKSB7CisJCWNtZC0+Y2hhbmxpc3RfbGVuID0gUlREX01BWF9DSEFOTElTVDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisJCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykgeworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOworCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKwkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKSB7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSCisJCQkmJiAoY21kLT5zY2FuX2JlZ2luX2FyZworCQkJCTwgKGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZykpKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJcmV0dXJuIDQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgIEV4ZWN1dGUgYSBhbmFsb2cgaW4gY29tbWFuZCB3aXRoIG1hbnkgcG9zc2libGUgdHJpZ2dlcmluZyBvcHRpb25zLgorICBUaGUgZGF0YSBnZXQgc3RvcmVkIGluIHRoZSBhc3luYyBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZS4KKyAgVGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgYW4gaW50ZXJydXB0IGhhbmRsZXIuCisgIFVzZXJsYW5kIGdldHMgdG8gdGhlIGRhdGEgdXNpbmcgcmVhZCBjYWxscy4KKyovCitzdGF0aWMgaW50IHJ0ZF9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJaW50IHRpbWVyOworCisJLyogc3RvcCBhbnl0aGluZyBjdXJyZW50bHkgcnVubmluZyAqLworCVJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsIDApOwkvKiBzdG9wIG9uIFNPRlRXQVJFIHN0b3AgKi8KKwlSdGRQYWNlclN0b3AoZGV2KTsJLyogbWFrZSBzdXJlIFBBQ0VSIGlzIHN0b3BwZWQgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXIgb25seSAqLworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsKKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsJLyogY2FuY2VsIGFueXRoaW5nIHJ1bm5pbmcgKi8KKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBkaXNhYmxlIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIH5JQ1NfRE1BMF9FKTsKKwkJYWJvcnRfZG1hKGRldiwgMCk7CisJCWRldnByaXYtPmZsYWdzICY9IH5ETUEwX0FDVElWRTsKKwkJaWYgKFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIElDU19ETUEwX0EpIHsJLypjbGVhciBwZW5kaW5nIGludCAqLworCQkJUnRkRG1hMENvbnRyb2woZGV2LCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklUKTsKKwkJfQorCX0KKwlSdGREbWEwUmVzZXQoZGV2KTsJLyogcmVzZXQgb25ib2FyZCBzdGF0ZSAqLworI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsJLyogY2xlYXIgYW55IG9sZCBkYXRhICovCisJUnRkSW50ZXJydXB0T3ZlcnJ1bkNsZWFyKGRldik7CisJZGV2cHJpdi0+aW50Q291bnQgPSAwOworCisJaWYgKCFkZXYtPmlycSkgewkvKiB3ZSBuZWVkIGludGVycnVwdHMgZm9yIHRoaXMgKi8KKwkJRFBSSU5USygicnRkNTIwOiBFUlJPUiEgTm8gaW50ZXJydXB0IGF2YWlsYWJsZSFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIHN0YXJ0IGNvbmZpZ3VyYXRpb24gKi8KKwkvKiBsb2FkIGNoYW5uZWwgbGlzdCBhbmQgcmVzZXQgQ0dUICovCisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIGNtZC0+Y2hhbmxpc3RfbGVuLCBjbWQtPmNoYW5saXN0KTsKKworCS8qIHNldHVwIHRoZSBjb21tb24gY2FzZSBhbmQgb3ZlcnJpZGUgaWYgbmVlZGVkICovCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMSkgeworCQkvKkRQUklOVEsgKCJydGQ1MjA6IE11bHRpIGNoYW5uZWwgc2V0dXBcbiIpOyAqLworCQlSdGRQYWNlclN0YXJ0U291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXJzIHBhY2VyICovCisJCVJ0ZEJ1cnN0U3RhcnRTb3VyY2UoZGV2LCAxKTsJLyogUEFDRVIgdHJpZ2dlcnMgYnVyc3QgKi8KKwkJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDIpOwkvKiBCVVJTVCB0cmlnZ2VycyBBREMgKi8KKwl9IGVsc2UgewkJLyogc2luZ2xlIGNoYW5uZWwgKi8KKwkJLypEUFJJTlRLICgicnRkNTIwOiBzaW5nbGUgY2hhbm5lbCBzZXR1cFxuIik7ICovCisJCVJ0ZFBhY2VyU3RhcnRTb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlcnMgcGFjZXIgKi8KKwkJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDEpOwkvKiBQQUNFUiB0cmlnZ2VycyBBREMgKi8KKwl9CisJUnRkQWJvdXRDb3VudGVyKGRldiwgZGV2cHJpdi0+Zmlmb0xlbiAvIDIgLSAxKTsJLyogMS8yIEZJRk8gKi8KKworCWlmIChUUklHX1RJTUVSID09IGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwkJLyogc2Nhbl9iZWdpbl9hcmcgaXMgaW4gbmFub3NlY29uZHMgKi8KKwkJLyogZmluZCBvdXQgaG93IG1hbnkgc2FtcGxlcyB0byB3YWl0IGJlZm9yZSB0cmFuc2ZlcnJpbmcgKi8KKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1dBS0VfRU9TKSB7CisJCQkvKiB0aGlzIG1heSBnZW5lcmF0ZSB1bi1zdXN0YWluYWJsZSBpbnRlcnJ1cHQgcmF0ZXMgKi8KKwkJCS8qIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nICovCisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gY21kLT5jaGFubGlzdF9sZW47CisJCQlkZXZwcml2LT5mbGFncyB8PSBTRU5EX0VPUzsKKwkJfSBlbHNlIHsKKwkJCS8qIGFycmFuZ2UgdG8gdHJhbnNmZXIgZGF0YSBwZXJpb2RpY2FsbHkgKi8KKwkJCWRldnByaXYtPnRyYW5zQ291bnQKKwkJCQk9CisJCQkJKFRSQU5TX1RBUkdFVF9QRVJJT0QgKiBjbWQtPmNoYW5saXN0X2xlbikgLworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmc7CisJCQlpZiAoZGV2cHJpdi0+dHJhbnNDb3VudCA8IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCQkJLyogdHJhbmZlciBhZnRlciBlYWNoIHNjYW4gKGFuZCBhdm9pZCAwKSAqLworCQkJCWRldnByaXYtPnRyYW5zQ291bnQgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCX0gZWxzZSB7CS8qIG1ha2UgYSBtdWx0aXBsZSBvZiBzY2FuIGxlbmd0aCAqLworCQkJCWRldnByaXYtPnRyYW5zQ291bnQgPQorCQkJCQkoZGV2cHJpdi0+dHJhbnNDb3VudCArCisJCQkJCWNtZC0+Y2hhbmxpc3RfbGVuIC0gMSkKKwkJCQkJLyBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCQlkZXZwcml2LT50cmFuc0NvdW50ICo9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJfQorCQkJZGV2cHJpdi0+ZmxhZ3MgfD0gU0VORF9FT1M7CisJCX0KKwkJaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPj0gKGRldnByaXYtPmZpZm9MZW4gLyAyKSkgeworCQkJLyogb3V0IG9mIGNvdW50ZXIgcmFuZ2UsIHVzZSAxLzIgZmlmbyBpbnN0ZWFkICovCisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gMDsKKwkJCWRldnByaXYtPmZsYWdzICY9IH5TRU5EX0VPUzsKKwkJfSBlbHNlIHsKKwkJCS8qIGludGVycnVwdCBmb3IgZWFjaCB0cmFuZmVyICovCisJCQlSdGRBYm91dENvdW50ZXIoZGV2LCBkZXZwcml2LT50cmFuc0NvdW50IC0gMSk7CisJCX0KKworCQlEUFJJTlRLKCJydGQ1MjA6IHNjYW5MZW49JWQgdHJhbmZlckNvdW50PSVkIGZpZm9MZW49JWRcbiAgc2NhblRpbWUobnMpPSVkIGZsYWdzPTB4JXhcbiIsIGNtZC0+Y2hhbmxpc3RfbGVuLCBkZXZwcml2LT50cmFuc0NvdW50LCBkZXZwcml2LT5maWZvTGVuLCBjbWQtPnNjYW5fYmVnaW5fYXJnLCBkZXZwcml2LT5mbGFncyk7CisJfSBlbHNlIHsJCS8qIHVua25vd24gdGltaW5nLCBqdXN0IHVzZSAxLzIgRklGTyAqLworCQlkZXZwcml2LT50cmFuc0NvdW50ID0gMDsKKwkJZGV2cHJpdi0+ZmxhZ3MgJj0gflNFTkRfRU9TOworCX0KKwlSdGRQYWNlckNsb2NrU291cmNlKGRldiwgMSk7CS8qIHVzZSBJTlRFUk5BTCA4TWh6IGNsb2NrIHNvdXJjZSAqLworCVJ0ZEFib3V0U3RvcEVuYWJsZShkZXYsIDEpOwkvKiBqdXN0IGludGVycnVwdCwgZG9udCBzdG9wICovCisKKwkvKiBCVUc/Pz8gdGhlc2UgbG9vayBsaWtlIGVudW1lcmF0ZWQgdmFsdWVzLCBidXQgdGhleSBhcmUgYml0IGZpZWxkcyAqLworCisJLyogRmlyc3QsIHNldHVwIHdoZW4gdG8gc3RvcCAqLworCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoJLyogc3RvcCBhZnRlciBOIHNjYW5zICovCisJCWRldnByaXYtPmFpQ291bnQgPSBjbWQtPnN0b3BfYXJnICogY21kLT5jaGFubGlzdF9sZW47CisJCWlmICgoZGV2cHJpdi0+dHJhbnNDb3VudCA+IDApCisJCQkmJiAoZGV2cHJpdi0+dHJhbnNDb3VudCA+IGRldnByaXYtPmFpQ291bnQpKSB7CisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gZGV2cHJpdi0+YWlDb3VudDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFJJR19OT05FOgkvKiBzdG9wIHdoZW4gY2FuY2VsIGlzIGNhbGxlZCAqLworCQlkZXZwcml2LT5haUNvdW50ID0gLTE7CS8qIHJlYWQgZm9yZXZlciAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURQUklOVEsoInJ0ZDUyMDogV2FybmluZyEgaWdub3Jpbmcgc3RvcF9zcmMgbW9kZSAlZFxuIiwKKwkJCWNtZC0+c3RvcF9zcmMpOworCX0KKworCS8qIFNjYW4gdGltaW5nICovCisJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJY2FzZSBUUklHX1RJTUVSOgkvKiBwZXJpb2RpYyBzY2FubmluZyAqLworCQl0aW1lciA9IHJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCVRSSUdfUk9VTkRfTkVBUkVTVCk7CisJCS8qIHNldCBQQUNFUiBjbG9jayAqLworCQkvKkRQUklOVEsgKCJydGQ1MjA6IGxvYWRpbmcgJWQgaW50byBwYWNlclxuIiwgdGltZXIpOyAqLworCQlSdGRQYWNlckNvdW50ZXIoZGV2LCB0aW1lcik7CisKKwkJYnJlYWs7CisKKwljYXNlIFRSSUdfRVhUOgorCQlSdGRQYWNlclN0YXJ0U291cmNlKGRldiwgMSk7CS8qIEVYVEVSTkFMeSB0cmlnZ2VyIHBhY2VyICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USygicnRkNTIwOiBXYXJuaW5nISBpZ25vcmluZyBzY2FuX2JlZ2luX3NyYyBtb2RlICVkXG4iLAorCQkJY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJfQorCisJLyogU2FtcGxlIHRpbWluZyB3aXRoaW4gYSBzY2FuICovCisJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CisJY2FzZSBUUklHX1RJTUVSOgkvKiBwZXJpb2RpYyAqLworCQlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAxKSB7CS8qIG9ubHkgbmVlZGVkIGZvciBtdWx0aS1jaGFubmVsICovCisJCQl0aW1lciA9IHJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQlUUklHX1JPVU5EX05FQVJFU1QpOworCQkJLyogc2V0dXAgQlVSU1QgY2xvY2sgKi8KKwkJCS8qRFBSSU5USyAoInJ0ZDUyMDogbG9hZGluZyAlZCBpbnRvIGJ1cnN0XG4iLCB0aW1lcik7ICovCisJCQlSdGRCdXJzdENvdW50ZXIoZGV2LCB0aW1lcik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgVFJJR19FWFQ6CQkvKiBleHRlcm5hbCAqLworCQlSdGRCdXJzdFN0YXJ0U291cmNlKGRldiwgMik7CS8qIEVYVEVSTkFMeSB0cmlnZ2VyIGJ1cnN0ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USygicnRkNTIwOiBXYXJuaW5nISBpZ25vcmluZyBjb252ZXJ0X3NyYyBtb2RlICVkXG4iLAorCQkJY21kLT5jb252ZXJ0X3NyYyk7CisJfQorCS8qIGVuZCBjb25maWd1cmF0aW9uICovCisKKwkvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGNsZWFyIGFuIGludGVycnVwdAorCSAgIHRoYXQgdGhlIHByaW9yaXR5IGNvbnRyb2xsZXIgaGFzIHF1ZXVlZCEgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCB+MCk7CS8qIGNsZWFyIGFueSBleGlzdGluZyBmbGFncyAqLworCVJ0ZEludGVycnVwdENsZWFyKGRldik7CisKKwkvKiBUT0RPOiBhbGxvdyBtdWx0aXBsZSBpbnRlcnJ1cHQgc291cmNlcyAqLworCWlmIChkZXZwcml2LT50cmFuc0NvdW50ID4gMCkgewkvKiB0cmFuc2ZlciBldmVyeSBOIHNhbXBsZXMgKi8KKwkJUnRkSW50ZXJydXB0TWFzayhkZXYsIElSUU1fQURDX0FCT1VUX0NOVCk7CisJCURQUklOVEsoInJ0ZDUyMDogVHJhbnNmZXJyaW5nIGV2ZXJ5ICVkXG4iLCBkZXZwcml2LT50cmFuc0NvdW50KTsKKwl9IGVsc2UgewkJLyogMS8yIEZJRk8gdHJhbnNmZXJzICovCisjaWZkZWYgVVNFX0RNQQorCQlkZXZwcml2LT5mbGFncyB8PSBETUEwX0FDVElWRTsKKworCQkvKiBwb2ludCB0byBmaXJzdCB0cmFuc2ZlciBpbiByaW5nICovCisJCWRldnByaXYtPmRtYTBPZmZzZXQgPSAwOworCQlSdGREbWEwTW9kZShkZXYsIERNQV9NT0RFX0JJVFMpOworCQlSdGREbWEwTmV4dChkZXYsCS8qIHBvaW50IHRvIGZpcnN0IGJsb2NrICovCisJCQlkZXZwcml2LT5kbWEwQ2hhaW5bRE1BX0NIQUlOX0NPVU5UIC0gMV0ubmV4dCk7CisJCVJ0ZERtYTBTb3VyY2UoZGV2LCBETUFTX0FERklGT19IQUxGX0ZVTEwpOwkvKiBzZXQgRE1BIHRyaWdnZXIgc291cmNlICovCisKKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgfCBJQ1NfRE1BMF9FKTsKKwkJLyogTXVzdCBiZSAyIHN0ZXBzLiAgU2VlIFBMWCBhcHAgbm90ZSBhYm91dCAiU3RhcnRpbmcgYSBETUEgdHJhbnNmZXIiICovCisJCVJ0ZERtYTBDb250cm9sKGRldiwgUExYX0RNQV9FTl9CSVQpOwkvKiBlbmFibGUgRE1BIChjbGVhciBJTlRSPykgKi8KKwkJUnRkRG1hMENvbnRyb2woZGV2LCBQTFhfRE1BX0VOX0JJVCB8IFBMWF9ETUFfU1RBUlRfQklUKTsJLypzdGFydCBETUEgKi8KKwkJRFBSSU5USygicnRkNTIwOiBVc2luZyBETUEwIHRyYW5zZmVycy4gcGx4SW50ICV4IFJ0ZEludCAleFxuIiwKKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSwgZGV2cHJpdi0+aW50TWFzayk7CisjZWxzZSAvKiBVU0VfRE1BICovCisJCVJ0ZEludGVycnVwdE1hc2soZGV2LCBJUlFNX0FEQ19BQk9VVF9DTlQpOworCQlEUFJJTlRLKCJydGQ1MjA6IFRyYW5zZmVycmluZyBldmVyeSAxLzIgRklGT1xuIik7CisjZW5kaWYgLyogVVNFX0RNQSAqLworCX0KKworCS8qIEJVRzogc3RhcnRfc3JjIGlzIEFTU1VNRUQgdG8gYmUgVFJJR19OT1cgKi8KKwkvKiBCVUc/IGl0IHNlZW1zIGxpa2UgdGhpbmdzIGFyZSBydW5uaW5nIGJlZm9yZSB0aGUgInN0YXJ0IiAqLworCVJ0ZFBhY2VyU3RhcnQoZGV2KTsJLyogU3RhcnQgUEFDRVIgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgU3RvcCBhIHJ1bm5pbmcgZGF0YSBhcXVpc2l0aW9uLgorKi8KK3N0YXRpYyBpbnQgcnRkX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl1MTYgc3RhdHVzOworCisJUnRkUGFjZXJTdG9wU291cmNlKGRldiwgMCk7CS8qIHN0b3Agb24gU09GVFdBUkUgc3RvcCAqLworCVJ0ZFBhY2VyU3RvcChkZXYpOwkvKiBTdG9wIFBBQ0VSICovCisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VyIG9ubHkgKi8KKwlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CisJZGV2cHJpdi0+YWlDb3VudCA9IDA7CS8qIHN0b3AgYW5kIGRvbid0IHRyYW5zZmVyIGFueSBtb3JlICovCisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXZwcml2LT5mbGFncyAmIERNQTBfQUNUSVZFKSB7CisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwJLyogZGlzYWJsZSBhbnkgbW9yZSBpbnRlcnJ1cHRzICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgJiB+SUNTX0RNQTBfRSk7CisJCWFib3J0X2RtYShkZXYsIDApOworCQlkZXZwcml2LT5mbGFncyAmPSB+RE1BMF9BQ1RJVkU7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwlzdGF0dXMgPSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KTsKKwlEUFJJTlRLKCJydGQ1MjA6IEFjcXVpc2l0aW9uIGNhbmNlbGVkLiAlbGQgaW50cywgaW50U3RhdD0leCwgb3ZlclN0YXQ9JXhcbiIsIGRldnByaXYtPmludENvdW50LCBzdGF0dXMsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgIEdpdmVuIGEgZGVzaXJlZCBwZXJpb2QgYW5kIHRoZSBjbG9jayBwZXJpb2QgKGJvdGggaW4gbnMpLAorICByZXR1cm4gdGhlIHByb3BlciBjb3VudGVyIHZhbHVlIChkaXZpZGVyLTEpLgorICBTZXRzIHRoZSBvcmlnaW5hbCBwZXJpb2QgdG8gYmUgdGhlIHRydWUgdmFsdWUuCisgIE5vdGU6IHlvdSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0aGUgY291bnRlciByYW5nZSEKKyovCitzdGF0aWMgaW50IHJ0ZF9uc190b190aW1lcl9iYXNlKHVuc2lnbmVkIGludCAqbmFub3NlYywJLyogZGVzaXJlZCBwZXJpb2QgKGluIG5zKSAqLworCWludCByb3VuZF9tb2RlLCBpbnQgYmFzZSkKK3sJCQkJLyogY2xvY2sgcGVyaW9kIChpbiBucykgKi8KKwlpbnQgZGl2aWRlcjsKKworCXN3aXRjaCAocm91bmRfbW9kZSkgeworCWNhc2UgVFJJR19ST1VORF9ORUFSRVNUOgorCWRlZmF1bHQ6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC8gMikgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfRE9XTjoKKwkJZGl2aWRlciA9ICgqbmFub3NlYykgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfVVA6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC0gMSkgLyBiYXNlOworCQlicmVhazsKKwl9CisJaWYgKGRpdmlkZXIgPCAyKQorCQlkaXZpZGVyID0gMjsJLyogbWluIGlzIGRpdmlkZSBieSAyICovCisKKwkvKiBOb3RlOiB3ZSBkb24ndCBjaGVjayBmb3IgbWF4LCBiZWNhdXNlIGRpZmZlcmVudCB0aW1lcnMKKwkgICBoYXZlIGRpZmZlcmVudCByYW5nZXMgKi8KKworCSpuYW5vc2VjID0gYmFzZSAqIGRpdmlkZXI7CisJcmV0dXJuIGRpdmlkZXIgLSAxOwkvKiBjb3VudGRvd24gaXMgZGl2aXNvcisxICovCit9CisKKy8qCisgIEdpdmVuIGEgZGVzaXJlZCBwZXJpb2QgKGluIG5zKSwKKyAgcmV0dXJuIHRoZSBwcm9wZXIgY291bnRlciB2YWx1ZSAoZGl2aWRlci0xKSBmb3IgdGhlIGludGVybmFsIGNsb2NrLgorICBTZXRzIHRoZSBvcmlnaW5hbCBwZXJpb2QgdG8gYmUgdGhlIHRydWUgdmFsdWUuCisqLworc3RhdGljIGludCBydGRfbnNfdG9fdGltZXIodW5zaWduZWQgaW50ICpucywgaW50IHJvdW5kX21vZGUpCit7CisJcmV0dXJuIHJ0ZF9uc190b190aW1lcl9iYXNlKG5zLCByb3VuZF9tb2RlLCBSVERfQ0xPQ0tfQkFTRSk7Cit9CisKKy8qCisgIE91dHB1dCBvbmUgKG9yIG1vcmUpIGFuYWxvZyB2YWx1ZXMgdG8gYSBzaW5nbGUgcG9ydCBhcyBmYXN0IGFzIHBvc3NpYmxlLgorKi8KK3N0YXRpYyBpbnQgcnRkX2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBpOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCisJLyogQ29uZmlndXJlIHRoZSBvdXRwdXQgcmFuZ2UgKHRhYmxlIGluZGV4IG1hdGNoZXMgdGhlIHJhbmdlIHZhbHVlcykgKi8KKwlSdGREYWNSYW5nZShkZXYsIGNoYW4sIHJhbmdlKTsKKworCS8qIFdyaXRpbmcgYSBsaXN0IG9mIHZhbHVlcyB0byBhbiBBTyBjaGFubmVsIGlzIHByb2JhYmx5IG5vdAorCSAqIHZlcnkgdXNlZnVsLCBidXQgdGhhdCdzIGhvdyB0aGUgaW50ZXJmYWNlIGlzIGRlZmluZWQuICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47ICsraSkgeworCQlpbnQgdmFsID0gZGF0YVtpXSA8PCAzOworCQlpbnQgc3RhdCA9IDA7CS8qIGluaXRpYWxpemUgdG8gYXZvaWQgYm9ndXMgd2FybmluZyAqLworCQlpbnQgaWk7CisKKwkJLyogVkVSSUZZOiBjb21lZGkgcmFuZ2UgYW5kIG9mZnNldCBjb252ZXJzaW9ucyAqLworCisJCWlmICgocmFuZ2UgPiAxKQkvKiBiaXBvbGFyICovCisJCQkmJihkYXRhW2ldIDwgMjA0OCkpIHsKKwkJCS8qIG9mZnNldCBhbmQgc2lnbiBleHRlbmQgKi8KKwkJCXZhbCA9ICgoKGludClkYXRhW2ldKSAtIDIwNDgpIDw8IDM7CisJCX0gZWxzZSB7CS8qIHVuaXBvbG9yICovCisJCQl2YWwgPSBkYXRhW2ldIDw8IDM7CisJCX0KKworCQlEUFJJTlRLKCJjb21lZGk6IHJ0ZDUyMCBEQUMgY2hhbj0lZCByYW5nZT0lZCB3cml0aW5nICVkIGFzIDB4JXhcbiIsIGNoYW4sIHJhbmdlLCBkYXRhW2ldLCB2YWwpOworCisJCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLworCQlSdGREYWNGaWZvUHV0KGRldiwgY2hhbiwgdmFsKTsJLyogcHV0IHRoZSB2YWx1ZSBpbiAqLworCQlSdGREYWNVcGRhdGUoZGV2LCBjaGFuKTsJLyogdHJpZ2dlciB0aGUgY29udmVyc2lvbiAqLworCisJCWRldnByaXYtPmFvVmFsdWVbY2hhbl0gPSBkYXRhW2ldOwkvKiBzYXZlIGZvciByZWFkIGJhY2sgKi8KKworCQlmb3IgKGlpID0gMDsgaWkgPCBSVERfREFDX1RJTUVPVVQ7ICsraWkpIHsKKwkJCXN0YXQgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCQkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQkJaWYgKHN0YXQgJiAoKDAgPT0gY2hhbikgPyBGU19EQUMxX05PVF9FTVBUWSA6CisJCQkJCUZTX0RBQzJfTk9UX0VNUFRZKSkKKwkJCQlicmVhazsKKwkJCVdBSVRfUVVJRVRMWTsKKwkJfQorCQlpZiAoaWkgPj0gUlREX0RBQ19USU1FT1VUKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IEVycm9yOiBEQUMgbmV2ZXIgZmluaXNoZWQhIEZpZm9TdGF0dXM9MHgleFxuIiwgc3RhdCBeIDB4NjY2Nik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCisJcmV0dXJuIGk7Cit9CisKKy8qIEFPIHN1YmRldmljZXMgc2hvdWxkIGhhdmUgYSByZWFkIGluc24gYXMgd2VsbCBhcyBhIHdyaXRlIGluc24uCisgKiBVc3VhbGx5IHRoaXMgbWVhbnMgY29weWluZyBhIHZhbHVlIHN0b3JlZCBpbiBkZXZwcml2LiAqLworc3RhdGljIGludCBydGRfYW9fcmluc24oY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGk7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvVmFsdWVbY2hhbl07CisJfQorCisJcmV0dXJuIGk7Cit9CisKKy8qCisgICBXcml0ZSBhIG1hc2tlZCBzZXQgb2YgYml0cyBhbmQgdGhlIHJlYWQgYmFjayB0aGUgcG9ydC4KKyAgIFdlIHRyYWNrIHdoYXQgdGhlIGJpdHMgc2hvdWxkIGJlIChpLmUuIHdlIGRvbid0IHJlYWQgdGhlIHBvcnQgZmlyc3QpLgorCisgICBESU8gZGV2aWNlcyBhcmUgc2xpZ2h0bHkgc3BlY2lhbC4gIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgdGhlIGluc25fcmVhZC9pbnNuX3dyaXRlIGludGVyZmFjZSwgaXQgaXMgbXVjaCBtb3JlCisgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCisgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUKKyAqIGNvbWVkaSBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUKKyAqLworc3RhdGljIGludCBydGRfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpZiAoaW5zbi0+biAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpbnNuIGRhdGEgaXMgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0sIGVhY2ggY2hhbm5lbCBjb29yZXNwb25kaW5nIHRvIGEgYml0LiAqLworCWlmIChkYXRhWzBdKSB7CisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKworCQkvKiBXcml0ZSBvdXQgdGhlIG5ldyBkaWdpdGFsIG91dHB1dCBsaW5lcyAqLworCQlSdGREaW8wV3JpdGUoZGV2LCBzLT5zdGF0ZSk7CisJfQorCS8qIG9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0YWwKKwkgKiBpbnB1dCBsaW5lcy4gKi8KKwlkYXRhWzFdID0gUnRkRGlvMFJlYWQoZGV2KTsKKworCS8qRFBSSU5USygicnRkNTIwOnBvcnRfMCB3cm90ZTogMHgleCByZWFkOiAweCV4XG4iLCBzLT5zdGF0ZSwgZGF0YVsxXSk7ICovCisKKwlyZXR1cm4gMjsKK30KKworLyoKKyAgQ29uZmlndXJlIG9uZSBiaXQgb24gYSBJTyBwb3J0IGFzIElucHV0IG9yIE91dHB1dCAoaGVuY2UgdGhlIG5hbWUgOi0pLgorKi8KK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJLyogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULiAqLworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IGNoYW47CS8qIDEgbWVhbnMgT3V0ICovCisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUFJJTlRLKCJydGQ1MjA6IHBvcnRfMF9kaXJlY3Rpb249MHgleCAoMSBtZWFucyBvdXQpXG4iLCBzLT5pb19iaXRzKTsKKwkvKiBUT0RPIHN1cHBvcnQgZGlnaXRhbCBtYXRjaCBpbnRlcnJ1cHRzIGFuZCBzdHJvYmVzICovCisJUnRkRGlvU3RhdHVzV3JpdGUoZGV2LCAweDAxKTsJLyogbWFrZSBEaW8wQ3RybCBwb2ludCB0byBkaXJlY3Rpb24gKi8KKwlSdGREaW8wQ3RybFdyaXRlKGRldiwgcy0+aW9fYml0cyk7CS8qIHNldCBkaXJlY3Rpb24gMSBtZWFucyBPdXQgKi8KKwlSdGREaW9TdGF0dXNXcml0ZShkZXYsIDApOwkvKiBtYWtlIERpbzBDdHJsIGNsZWFyIGludGVycnVwdHMgKi8KKworCS8qIHBvcnQxIGNhbiBvbmx5IGJlIGFsbCBpbnB1dCBvciBhbGwgb3V0cHV0ICovCisKKwkvKiB0aGVyZSBhcmUgYWxzbyAyIHVzZXIgaW5wdXQgbGluZXMgYW5kIDIgdXNlciBvdXRwdXQgbGluZXMgKi8KKworCXJldHVybiAxOworfQorCisvKgorICogQSBjb252ZW5pZW50IG1hY3JvIHRoYXQgZGVmaW5lcyBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSgpLAorICogYXMgbmVjZXNzYXJ5LgorICovCitDT01FRElfUENJX0lOSVRDTEVBTlVQKHJ0ZDUyMERyaXZlciwgcnRkNTIwX3BjaV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViNTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuaApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9ydGQ1MjAuaAorICAgIENvbWVkaSBkcml2ZXIgZGVmaW5lcyBmb3IgUmVhbCBUaW1lIERldmljZXMgKFJURCkgUENJNDUyMC9ETTc1MjAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgQ3JlYXRlZCBieSBEYW4gQ2hyaXN0aWFuLCBOQVNBIEFtZXMgUmVzZWFyY2ggQ2VudGVyLgorICAgIFNlZSBib2FyZCBub3RlcyBpbiBydGQ1MjAuYworKi8KKworLyoKKyAgTEFTMCBSdW50aW1lIEFyZWEKKyAgTG9jYWwgQWRkcmVzcyBTcGFjZSAwIE9mZnNldAkJUmVhZCBGdW5jdGlvbglXcml0ZSBGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMF9TUEFSRV8wMCAgICAweDAwMDAJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfU1BBUkVfMDQgICAgMHgwMDA0CS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX1VTRVJfSU8gICAgIDB4MDAwOAkvLyBSZWFkIFVzZXIgSW5wdXRzICAgICAgICAgICAgICAgIFdyaXRlIFVzZXIgT3V0cHV0cworI2RlZmluZSBMQVMwX1NQQVJFXzBDICAgIDB4MDAwQwkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9BREMgICAgICAgICAweDAwMTAJLy8gUmVhZCBGSUZPIFN0YXR1cyAgICAgICAgICAgICAgICBTb2Z0d2FyZSBBL0QgU3RhcnQKKyNkZWZpbmUgTEFTMF9EQUMxICAgICAgICAweDAwMTQJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBEL0ExIFVwZGF0ZQorI2RlZmluZSBMQVMwX0RBQzIgICAgICAgIDB4MDAxOAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIEQvQTIgVXBkYXRlCisjZGVmaW5lIExBUzBfU1BBUkVfMUMgICAgMHgwMDFDCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX1NQQVJFXzIwICAgIDB4MDAyMAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9EQUMgICAgICAgICAweDAwMjQJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBTaW11bHRhbmVvdXMgRC9BMSBhbmQgRC9BMiBVcGRhdGUKKyNkZWZpbmUgTEFTMF9QQUNFUiAgICAgICAweDAwMjgJLy8gU29mdHdhcmUgUGFjZXIgU3RhcnQgICAgICAgICAgICBTb2Z0d2FyZSBQYWNlciBTdG9wCisjZGVmaW5lIExBUzBfVElNRVIgICAgICAgMHgwMDJDCS8vIFJlYWQgVGltZXIgQ291bnRlcnMgU3RhdHVzICAgICAgSERJTiBTb2Z0d2FyZSBUcmlnZ2VyCisjZGVmaW5lIExBUzBfSVQgICAgICAgICAgMHgwMDMwCS8vIFJlYWQgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgV3JpdGUgSW50ZXJydXB0IEVuYWJsZSBNYXNrIFJlZ2lzdGVyCisjZGVmaW5lIExBUzBfQ0xFQVIgICAgICAgMHgwMDM0CS8vIENsZWFyIElUcyBzZXQgYnkgQ2xlYXIgTWFzayAgICAgU2V0IEludGVycnVwdCBDbGVhciBNYXNrCisjZGVmaW5lIExBUzBfT1ZFUlJVTiAgICAgMHgwMDM4CS8vIFJlYWQgcGVuZGluZyBpbnRlcnJ1cHRzICAgICAgICAgQ2xlYXIgT3ZlcnJ1biBSZWdpc3RlcgorI2RlZmluZSBMQVMwX1NQQVJFXzNDICAgIDB4MDAzQwkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKworLyoKKyAgTEFTMCBSdW50aW1lIEFyZWEgVGltZXIvQ291bnRlcixEaWcuSU8KKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMF9QQ0xLICAgICAgICAweDAwNDAJLy8gUGFjZXIgQ2xvY2sgdmFsdWUgKDI0Yml0KSAgICAgICAgICAgICBQYWNlciBDbG9jayBsb2FkICgyNGJpdCkKKyNkZWZpbmUgTEFTMF9CQ0xLICAgICAgICAweDAwNDQJLy8gQnVyc3QgQ2xvY2sgdmFsdWUgKDEwYml0KSAgICAgICAgICAgICBCdXJzdCBDbG9jayBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9BRENfU0NOVCAgICAweDAwNDgJLy8gQS9EIFNhbXBsZSBjb3VudGVyIHZhbHVlICgxMGJpdCkgICAgICBBL0QgU2FtcGxlIGNvdW50ZXIgbG9hZCAoMTBiaXQpCisjZGVmaW5lIExBUzBfREFDMV9VQ05UICAgMHgwMDRDCS8vIEQvQTEgVXBkYXRlIGNvdW50ZXIgdmFsdWUgKDEwIGJpdCkgICAgRC9BMSBVcGRhdGUgY291bnRlciBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9EQUMyX1VDTlQgICAweDAwNTAJLy8gRC9BMiBVcGRhdGUgY291bnRlciB2YWx1ZSAoMTAgYml0KSAgICBEL0EyIFVwZGF0ZSBjb3VudGVyIGxvYWQgKDEwYml0KQorI2RlZmluZSBMQVMwX0RDTlQgICAgICAgIDB4MDA1NAkvLyBEZWxheSBjb3VudGVyIHZhbHVlICgxNiBiaXQpICAgICAgICAgIERlbGF5IGNvdW50ZXIgbG9hZCAoMTZiaXQpCisjZGVmaW5lIExBUzBfQUNOVCAgICAgICAgMHgwMDU4CS8vIEFib3V0IGNvdW50ZXIgdmFsdWUgKDE2IGJpdCkgICAgICAgICAgQWJvdXQgY291bnRlciBsb2FkICgxNmJpdCkKKyNkZWZpbmUgTEFTMF9EQUNfQ0xLICAgICAweDAwNUMJLy8gREFDIGNsb2NrIHZhbHVlICgxNmJpdCkgICAgICAgICAgICAgICBEQUMgY2xvY2sgbG9hZCAoMTZiaXQpCisjZGVmaW5lIExBUzBfVVRDMCAgICAgICAgMHgwMDYwCS8vIDgyNTQgVEMgQ291bnRlciAwIFVzZXIgVEMgMCB2YWx1ZSAgICAgTG9hZCBjb3VudCBpbiBUQyBDb3VudGVyIDAKKyNkZWZpbmUgTEFTMF9VVEMxICAgICAgICAweDAwNjQJLy8gODI1NCBUQyBDb3VudGVyIDEgVXNlciBUQyAxIHZhbHVlICAgICBMb2FkIGNvdW50IGluIFRDIENvdW50ZXIgMQorI2RlZmluZSBMQVMwX1VUQzIgICAgICAgIDB4MDA2OAkvLyA4MjU0IFRDIENvdW50ZXIgMiBVc2VyIFRDIDIgdmFsdWUgICAgIExvYWQgY291bnQgaW4gVEMgQ291bnRlciAyCisjZGVmaW5lIExBUzBfVVRDX0NUUkwgICAgMHgwMDZDCS8vIDgyNTQgVEMgQ29udHJvbCBXb3JkICAgICAgICAgICAgICAgICAgUHJvZ3JhbSBjb3VudGVyIG1vZGUgZm9yIFRDCisjZGVmaW5lIExBUzBfRElPMCAgICAgICAgMHgwMDcwCS8vIERpZ2l0YWwgSS9PIFBvcnQgMCBSZWFkIFBvcnQgICAgICAgICAgRGlnaXRhbCBJL08gUG9ydCAwIFdyaXRlIFBvcnQKKyNkZWZpbmUgTEFTMF9ESU8xICAgICAgICAweDAwNzQJLy8gRGlnaXRhbCBJL08gUG9ydCAxIFJlYWQgUG9ydCAgICAgICAgICBEaWdpdGFsIEkvTyBQb3J0IDEgV3JpdGUgUG9ydAorI2RlZmluZSBMQVMwX0RJTzBfQ1RSTCAgIDB4MDA3OAkvLyBDbGVhciBkaWdpdGFsIElSUSBzdGF0dXMgZmxhZy9yZWFkICAgIENsZWFyIGRpZ2l0YWwgY2hpcC9wcm9ncmFtIFBvcnQgMAorI2RlZmluZSBMQVMwX0RJT19TVEFUVVMgIDB4MDA3QwkvLyBSZWFkIERpZ2l0YWwgSS9PIFN0YXR1cyB3b3JkICAgICAgICAgIFByb2dyYW0gZGlnaXRhbCBjb250cm9sIHJlZ2lzdGVyICYKKworLyoKKyAgTEFTMCBTZXR1cCBBcmVhCisgIE5hbWUJCQlMb2NhbCBBZGRyZXNzCQkJRnVuY3Rpb24KKyovCisjZGVmaW5lIExBUzBfQk9BUkRfUkVTRVQgICAgICAgIDB4MDEwMAkvLyBCb2FyZCByZXNldAorI2RlZmluZSBMQVMwX0RNQTBfU1JDICAgICAgICAgICAweDAxMDQJLy8gRE1BIDAgU291cmNlcyBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ETUExX1NSQyAgICAgICAgICAgMHgwMTA4CS8vIERNQSAxIFNvdXJjZXMgc2VsZWN0CisjZGVmaW5lIExBUzBfQURDX0NPTlZFUlNJT04gICAgIDB4MDEwQwkvLyBBL0QgQ29udmVyc2lvbiBTaWduYWwgc2VsZWN0CisjZGVmaW5lIExBUzBfQlVSU1RfU1RBUlQgICAgICAgIDB4MDExMAkvLyBCdXJzdCBDbG9jayBTdGFydCBUcmlnZ2VyIHNlbGVjdAorI2RlZmluZSBMQVMwX1BBQ0VSX1NUQVJUICAgICAgICAweDAxMTQJLy8gUGFjZXIgQ2xvY2sgU3RhcnQgVHJpZ2dlciBzZWxlY3QKKyNkZWZpbmUgTEFTMF9QQUNFUl9TVE9QICAgICAgICAgMHgwMTE4CS8vIFBhY2VyIENsb2NrIFN0b3AgVHJpZ2dlciBzZWxlY3QKKyNkZWZpbmUgTEFTMF9BQ05UX1NUT1BfRU5BQkxFICAgMHgwMTFDCS8vIEFib3V0IENvdW50ZXIgU3RvcCBFbmFibGUKKyNkZWZpbmUgTEFTMF9QQUNFUl9SRVBFQVQgICAgICAgMHgwMTIwCS8vIFBhY2VyIFN0YXJ0IFRyaWdnZXIgTW9kZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ESU5fU1RBUlQgICAgICAgICAgMHgwMTI0CS8vIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCBTYW1wbGluZyBTaWduYWwgc2VsZWN0CisjZGVmaW5lIExBUzBfRElOX0ZJRk9fQ0xFQVIgICAgIDB4MDEyOAkvLyBEaWdpdGFsIElucHV0IEZJRk8gQ2xlYXIKKyNkZWZpbmUgTEFTMF9BRENfRklGT19DTEVBUiAgICAgMHgwMTJDCS8vIEEvRCBGSUZPIENsZWFyCisjZGVmaW5lIExBUzBfQ0dUX1dSSVRFICAgICAgICAgIDB4MDEzMAkvLyBDaGFubmVsIEdhaW4gVGFibGUgV3JpdGUKKyNkZWZpbmUgTEFTMF9DR0xfV1JJVEUgICAgICAgICAgMHgwMTM0CS8vIENoYW5uZWwgR2FpbiBMYXRjaCBXcml0ZQorI2RlZmluZSBMQVMwX0NHX0RBVEEgICAgICAgICAgICAweDAxMzgJLy8gRGlnaXRhbCBUYWJsZSBXcml0ZQorI2RlZmluZSBMQVMwX0NHVF9FTkFCTEUJCTB4MDEzQwkvLyBDaGFubmVsIEdhaW4gVGFibGUgRW5hYmxlCisjZGVmaW5lIExBUzBfQ0dfRU5BQkxFICAgICAgICAgIDB4MDE0MAkvLyBEaWdpdGFsIFRhYmxlIEVuYWJsZQorI2RlZmluZSBMQVMwX0NHVF9QQVVTRSAgICAgICAgICAweDAxNDQJLy8gVGFibGUgUGF1c2UgRW5hYmxlCisjZGVmaW5lIExBUzBfQ0dUX1JFU0VUICAgICAgICAgIDB4MDE0OAkvLyBSZXNldCBDaGFubmVsIEdhaW4gVGFibGUKKyNkZWZpbmUgTEFTMF9DR1RfQ0xFQVIgICAgICAgICAgMHgwMTRDCS8vIENsZWFyIENoYW5uZWwgR2FpbiBUYWJsZQorI2RlZmluZSBMQVMwX0RBQzFfQ1RSTCAgICAgICAgICAweDAxNTAJLy8gRC9BMSBvdXRwdXQgdHlwZS9yYW5nZQorI2RlZmluZSBMQVMwX0RBQzFfU1JDICAgICAgICAgICAweDAxNTQJLy8gRC9BMSB1cGRhdGUgc291cmNlCisjZGVmaW5lIExBUzBfREFDMV9DWUNMRSAgICAgICAgIDB4MDE1OAkvLyBEL0ExIGN5Y2xlIG1vZGUKKyNkZWZpbmUgTEFTMF9EQUMxX1JFU0VUICAgICAgICAgMHgwMTVDCS8vIEQvQTEgRklGTyByZXNldAorI2RlZmluZSBMQVMwX0RBQzFfRklGT19DTEVBUiAgICAweDAxNjAJLy8gRC9BMSBGSUZPIGNsZWFyCisjZGVmaW5lIExBUzBfREFDMl9DVFJMICAgICAgICAgIDB4MDE2NAkvLyBEL0EyIG91dHB1dCB0eXBlL3JhbmdlCisjZGVmaW5lIExBUzBfREFDMl9TUkMgICAgICAgICAgIDB4MDE2OAkvLyBEL0EyIHVwZGF0ZSBzb3VyY2UKKyNkZWZpbmUgTEFTMF9EQUMyX0NZQ0xFICAgICAgICAgMHgwMTZDCS8vIEQvQTIgY3ljbGUgbW9kZQorI2RlZmluZSBMQVMwX0RBQzJfUkVTRVQgICAgICAgICAweDAxNzAJLy8gRC9BMiBGSUZPIHJlc2V0CisjZGVmaW5lIExBUzBfREFDMl9GSUZPX0NMRUFSICAgIDB4MDE3NAkvLyBEL0EyIEZJRk8gY2xlYXIKKyNkZWZpbmUgTEFTMF9BRENfU0NOVF9TUkMgICAgICAgMHgwMTc4CS8vIEEvRCBTYW1wbGUgQ291bnRlciBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfUEFDRVJfU0VMRUNUICAgICAgIDB4MDE4MAkvLyBQYWNlciBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMF9TUkMgICAgICAgICAgMHgwMTg0CS8vIFN5bmNCdXMgMCBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfU0JVUzBfRU5BQkxFICAgICAgIDB4MDE4OAkvLyBTeW5jQnVzIDAgZW5hYmxlCisjZGVmaW5lIExBUzBfU0JVUzFfU1JDICAgICAgICAgIDB4MDE4QwkvLyBTeW5jQnVzIDEgU291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1NCVVMxX0VOQUJMRSAgICAgICAweDAxOTAJLy8gU3luY0J1cyAxIGVuYWJsZQorI2RlZmluZSBMQVMwX1NCVVMyX1NSQyAgICAgICAgICAweDAxOTgJLy8gU3luY0J1cyAyIFNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMl9FTkFCTEUgICAgICAgMHgwMTlDCS8vIFN5bmNCdXMgMiBlbmFibGUKKyNkZWZpbmUgTEFTMF9FVFJHX1BPTEFSSVRZICAgICAgMHgwMUE0CS8vIEV4dGVybmFsIFRyaWdnZXIgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIExBUzBfRUlOVF9QT0xBUklUWSAgICAgIDB4MDFBOAkvLyBFeHRlcm5hbCBJbnRlcnJ1cHQgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMF9DTE9DSyAgICAgICAgIDB4MDFBQwkvLyBVVEMwIENsb2NrIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzBfR0FURSAgICAgICAgICAweDAxQjAJLy8gVVRDMCBHYXRlIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzFfQ0xPQ0sgICAgICAgICAweDAxQjQJLy8gVVRDMSBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMxX0dBVEUgICAgICAgICAgMHgwMUI4CS8vIFVUQzEgR2F0ZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMyX0NMT0NLICAgICAgICAgMHgwMUJDCS8vIFVUQzIgQ2xvY2sgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMl9HQVRFICAgICAgICAgIDB4MDFDMAkvLyBVVEMyIEdhdGUgc2VsZWN0CisjZGVmaW5lIExBUzBfVU9VVDBfU0VMRUNUICAgICAgIDB4MDFDNAkvLyBVc2VyIE91dHB1dCAwIHNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VT1VUMV9TRUxFQ1QgICAgICAgMHgwMUM4CS8vIFVzZXIgT3V0cHV0IDEgc291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX0RNQTBfUkVTRVQgICAgICAgICAweDAxQ0MJLy8gRE1BMCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcmVzZXQKKyNkZWZpbmUgTEFTMF9ETUExX1JFU0VUICAgICAgICAgMHgwMUQwCS8vIERNQTEgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHJlc2V0CisKKy8qCisgIExBUzEKKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMV9BRENfRklGTyAgICAgICAgICAgIDB4MDAwMAkvLyBSZWFkIEEvRCBGSUZPICgxNmJpdCkgLQorI2RlZmluZSBMQVMxX0hESU9fRklGTyAgICAgICAgICAgMHgwMDA0CS8vIFJlYWQgSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IEZJRk8gKDE2Yml0KSAtCisjZGVmaW5lIExBUzFfREFDMV9GSUZPICAgICAgICAgICAweDAwMDgJLy8gLSBXcml0ZSBEL0ExIEZJRk8gKDE2Yml0KQorI2RlZmluZSBMQVMxX0RBQzJfRklGTyAgICAgICAgICAgMHgwMDBDCS8vIC0gV3JpdGUgRC9BMiBGSUZPICgxNmJpdCkKKworLyoKKyAgTENGRzogUExYIDkwODAgbG9jYWwgY29uZmlnICYgcnVudGltZSByZWdpc3RlcnMKKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTENGR19JVENTUiAgICAgICAgICAgICAgMHgwMDY4CS8vIElOVENTUiwgSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTU9ERTAgICAgICAgICAgIDB4MDA4MAkvLyBETUEgQ2hhbm5lbCAwIE1vZGUgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFQQURSMCAgICAgICAgICAgMHgwMDg0CS8vIERNQSBDaGFubmVsIDAgUENJIEFkZHJlc3MgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFMQURSMCAgICAgICAgICAgMHgwMDg4CS8vIERNQSBDaGFubmVsIDAgTG9jYWwgQWRkcmVzcyBSZWcKKyNkZWZpbmUgTENGR19ETUFTSVowICAgICAgICAgICAgMHgwMDhDCS8vIERNQSBDaGFubmVsIDAgVHJhbnNmZXIgU2l6ZSAoQnl0ZXMpIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BRFBSMCAgICAgICAgICAgIDB4MDA5MAkvLyBETUEgQ2hhbm5lbCAwIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQU1PREUxICAgICAgICAgICAweDAwOTQJLy8gRE1BIENoYW5uZWwgMSBNb2RlIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BUEFEUjEgICAgICAgICAgIDB4MDA5OAkvLyBETUEgQ2hhbm5lbCAxIFBDSSBBZGRyZXNzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTEFEUjEgICAgICAgICAgIDB4MDA5QwkvLyBETUEgQ2hhbm5lbCAxIExvY2FsIEFkZHJlc3MgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFTSVoxICAgICAgICAgICAgMHgwMEEwCS8vIERNQSBDaGFubmVsIDEgVHJhbnNmZXIgU2l6ZSAoQnl0ZXMpIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BRFBSMSAgICAgICAgICAgIDB4MDBBNAkvLyBETUEgQ2hhbm5lbCAxIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUNTUjAgICAgICAgICAgICAweDAwQTgJLy8gRE1BIENoYW5uZWwgMCBDb21tYW5kL1N0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUNTUjEgICAgICAgICAgICAweDAwQTkJLy8gRE1BIENoYW5uZWwgMCBDb21tYW5kL1N0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUFSQiAgICAgICAgICAgICAweDAwQUMJLy8gRE1BIEFyYml0cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BVEhSICAgICAgICAgICAgIDB4MDBCMAkvLyBETUEgVGhyZXNob2xkIFJlZ2lzdGVyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXNpc3RlciBiaXQgZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyBGSUZPIFN0YXR1cyBXb3JkIEJpdHMgKFJ0ZEZpZm9TdGF0dXMpCisjZGVmaW5lIEZTX0RBQzFfTk9UX0VNUFRZICAgIDB4MDAwMQkvLyBEMCAgLSBEQUMxIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0RBQzFfSEVNUFRZICAgMHgwMDAyCS8vIEQxICAtIERBQzEgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIEZTX0RBQzFfTk9UX0ZVTEwgICAgIDB4MDAwNAkvLyBEMiAgLSBEQUMxIEZJRk8gbm90IGZ1bGwKKyNkZWZpbmUgRlNfREFDMl9OT1RfRU1QVFkgICAgMHgwMDEwCS8vIEQ0ICAtIERBQzIgRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfREFDMl9IRU1QVFkgICAweDAwMjAJLy8gRDUgIC0gREFDMiBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfREFDMl9OT1RfRlVMTCAgICAgMHgwMDQwCS8vIEQ2ICAtIERBQzIgRklGTyBub3QgZnVsbAorI2RlZmluZSBGU19BRENfTk9UX0VNUFRZICAgICAweDAxMDAJLy8gRDggIC0gQURDIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0FEQ19IRU1QVFkgICAgMHgwMjAwCS8vIEQ5ICAtIEFEQyBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfQURDX05PVF9GVUxMICAgICAgMHgwNDAwCS8vIEQxMCAtIEFEQyBGSUZPIG5vdCBmdWxsCisjZGVmaW5lIEZTX0RJTl9OT1RfRU1QVFkgICAgIDB4MTAwMAkvLyBEMTIgLSBESU4gRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfRElOX0hFTVBUWSAgICAweDIwMDAJLy8gRDEzIC0gRElOIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBGU19ESU5fTk9UX0ZVTEwgICAgICAweDQwMDAJLy8gRDE0IC0gRElOIEZJRk8gbm90IGZ1bGwKKworLy8gVGltZXIgU3RhdHVzIFdvcmQgQml0cyAoR2V0VGltZXJTdGF0dXMpCisjZGVmaW5lIFRTX1BDTEtfR0FURSAgIDB4MDAwMQorLy8gRDAgLSBQYWNlciBDbG9jayBHYXRlIFswIC0gZ2F0ZWQsIDEgLSBlbmFibGVkXQorI2RlZmluZSBUU19CQ0xLX0dBVEUgICAweDAwMDIKKy8vIEQxIC0gQnVyc3QgQ2xvY2sgR2F0ZSBbMCAtIGRpc2FibGVkLCAxIC0gcnVubmluZ10KKyNkZWZpbmUgVFNfRENOVF9HQVRFICAgMHgwMDA0CisvLyBEMiAtIFBhY2VyIENsb2NrIERlbGF5ZWQgU3RhcnQgVHJpZ2dlciBbMCAtIGRlbGF5IG92ZXIsIDEgLSBkZWxheSBpbgorLy8gcHJvZ3Jlc3NdCisjZGVmaW5lIFRTX0FDTlRfR0FURSAgIDB4MDAwOAorLy8gRDMgLSBQYWNlciBDbG9jayBBYm91dCBUcmlnZ2VyIFswIC0gY29tcGxldGVkLCAxIC0gaW4gcHJvZ3Jlc3NdCisjZGVmaW5lIFRTX1BDTEtfUlVOICAgIDB4MDAxMAorLy8gRDQgLSBQYWNlciBDbG9jayBTaHV0ZG93biBGbGFnIFswIC0gUGFjZXIgQ2xvY2sgY2Fubm90IGJlIHN0YXJ0CisvLyB0cmlnZ2VyZWQgb25seSBieSBTb2Z0d2FyZSBQYWNlciBTdGFydCBDb21tYW5kLCAxIC0gUGFjZXIgQ2xvY2sgY2FuCisvLyBiZSBzdGFydCB0cmlnZ2VyZWRdCisKKy8vIEV4dGVybmFsIFRyaWdnZXIgcG9sYXJpdHkgc2VsZWN0CisvLyBFeHRlcm5hbCBJbnRlcnJ1cHQgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIFBPTF9QT1NJVElWRSAgICAgICAgIDB4MAkvLyBwb3NpdGl2ZSBlZGdlCisjZGVmaW5lIFBPTF9ORUdBVElWRSAgICAgICAgIDB4MQkvLyBuZWdhdGl2ZSBlZGdlCisKKy8vIFVzZXIgT3V0cHV0IFNpZ25hbCBzZWxlY3QgKFNldFVvdXQwU291cmNlLCBTZXRVb3V0MVNvdXJjZSkKKyNkZWZpbmUgVU9VVF9BREMgICAgICAgICAgICAgICAgMHgwCS8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbAorI2RlZmluZSBVT1VUX0RBQzEgICAgICAgICAgICAgICAweDEJLy8gRC9BMSBVcGRhdGUKKyNkZWZpbmUgVU9VVF9EQUMyICAgICAgICAgICAgICAgMHgyCS8vIEQvQTIgVXBkYXRlCisjZGVmaW5lIFVPVVRfU09GVFdBUkUgICAgICAgICAgIDB4MwkvLyBTb2Z0d2FyZSBQcm9ncmFtbWFibGUKKworLy8gUGFjZXIgY2xvY2sgc2VsZWN0IChTZXRQYWNlclNvdXJjZSkKKyNkZWZpbmUgUENMS19JTlRFUk5BTCAgICAgICAgICAgMQkvLyBJbnRlcm5hbCBQYWNlciBDbG9jaworI2RlZmluZSBQQ0xLX0VYVEVSTkFMICAgICAgICAgICAwCS8vIEV4dGVybmFsIFBhY2VyIENsb2NrCisKKy8vIEEvRCBTYW1wbGUgQ291bnRlciBTb3VyY2VzIChTZXRBZGNudFNvdXJjZSwgU2V0dXBTYW1wbGVDb3VudGVyKQorI2RlZmluZSBBRENfU0NOVF9DR1RfUkVTRVQgICAgICAgICAweDAJLy8gbmVlZHMgcmVzdGFydCB3aXRoIFN0YXJ0UGFjZXIKKyNkZWZpbmUgQURDX1NDTlRfRklGT19XUklURSAgICAgICAgMHgxCisKKy8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbCBTZWxlY3QgKGZvciBTZXRDb252ZXJzaW9uU2VsZWN0KQorI2RlZmluZSBBRENfU1RBUlRfU09GVFdBUkUgICAgICAgICAweDAJLy8gU29mdHdhcmUgQS9EIFN0YXJ0CisjZGVmaW5lIEFEQ19TVEFSVF9QQ0xLICAgICAgICAgICAgIDB4MQkvLyBQYWNlciBDbG9jayAoRXh0LiBJbnQuIHNlZSBGdW5jLjUwOSkKKyNkZWZpbmUgQURDX1NUQVJUX0JDTEsgICAgICAgICAgICAgMHgyCS8vIEJ1cnN0IENsb2NrCisjZGVmaW5lIEFEQ19TVEFSVF9ESUdJVEFMX0lUICAgICAgIDB4MwkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBBRENfU1RBUlRfREFDMV9NQVJLRVIxICAgICAweDQJLy8gRC9BIDEgRGF0YSBNYXJrZXIgMQorI2RlZmluZSBBRENfU1RBUlRfREFDMl9NQVJLRVIxICAgICAweDUJLy8gRC9BIDIgRGF0YSBNYXJrZXIgMQorI2RlZmluZSBBRENfU1RBUlRfU0JVUzAgICAgICAgICAgICAweDYJLy8gU3luY0J1cyAwCisjZGVmaW5lIEFEQ19TVEFSVF9TQlVTMSAgICAgICAgICAgIDB4NwkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgQURDX1NUQVJUX1NCVVMyICAgICAgICAgICAgMHg4CS8vIFN5bmNCdXMgMgorCisvLyBCdXJzdCBDbG9jayBzdGFydCB0cmlnZ2VyIHNlbGVjdCAoU2V0QnVyc3RTdGFydCkKKyNkZWZpbmUgQkNMS19TVEFSVF9TT0ZUV0FSRSAgICAgICAgMHgwCS8vIFNvZnR3YXJlIEEvRCBTdGFydCAoU3RhcnRCdXJzdCkKKyNkZWZpbmUgQkNMS19TVEFSVF9QQ0xLICAgICAgICAgICAgMHgxCS8vIFBhY2VyIENsb2NrCisjZGVmaW5lIEJDTEtfU1RBUlRfRVRSSUcgICAgICAgICAgIDB4MgkvLyBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIEJDTEtfU1RBUlRfRElHSVRBTF9JVCAgICAgIDB4MwkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBCQ0xLX1NUQVJUX1NCVVMwICAgICAgICAgICAweDQJLy8gU3luY0J1cyAwCisjZGVmaW5lIEJDTEtfU1RBUlRfU0JVUzEgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgQkNMS19TVEFSVF9TQlVTMiAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMgorCisvLyBQYWNlciBDbG9jayBzdGFydCB0cmlnZ2VyIHNlbGVjdCAoU2V0UGFjZXJTdGFydCkKKyNkZWZpbmUgUENMS19TVEFSVF9TT0ZUV0FSRSAgICAgICAgMHgwCS8vIFNvZnR3YXJlIFBhY2VyIFN0YXJ0IChTdGFydFBhY2VyKQorI2RlZmluZSBQQ0xLX1NUQVJUX0VUUklHICAgICAgICAgICAweDEJLy8gRXh0ZXJuYWwgdHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUQVJUX0RJR0lUQUxfSVQgICAgICAweDIJLy8gRGlnaXRhbCBpbnRlcnJ1cHQKKyNkZWZpbmUgUENMS19TVEFSVF9VVEMyICAgICAgICAgICAgMHgzCS8vIFVzZXIgVEMgMiBvdXQKKyNkZWZpbmUgUENMS19TVEFSVF9TQlVTMCAgICAgICAgICAgMHg0CS8vIFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUQVJUX1NCVVMxICAgICAgICAgICAweDUJLy8gU3luY0J1cyAxCisjZGVmaW5lIFBDTEtfU1RBUlRfU0JVUzIgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDIKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NPRlRXQVJFICAgICAgMHg4CS8vIERlbGF5ZWQgU29mdHdhcmUgUGFjZXIgU3RhcnQKKyNkZWZpbmUgUENMS19TVEFSVF9EX0VUUklHICAgICAgICAgMHg5CS8vIERlbGF5ZWQgZXh0ZXJuYWwgdHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUQVJUX0RfRElHSVRBTF9JVCAgICAweEEJLy8gRGVsYXllZCBkaWdpdGFsIGludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfVVRDMiAgICAgICAgICAweEIJLy8gRGVsYXllZCBVc2VyIFRDIDIgb3V0CisjZGVmaW5lIFBDTEtfU1RBUlRfRF9TQlVTMCAgICAgICAgIDB4QwkvLyBEZWxheWVkIFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfU0JVUzEgICAgICAgICAweEQJLy8gRGVsYXllZCBTeW5jQnVzIDEKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NCVVMyICAgICAgICAgMHhFCS8vIERlbGF5ZWQgU3luY0J1cyAyCisjZGVmaW5lIFBDTEtfU1RBUlRfRVRSSUdfR0FURUQgICAgIDB4RgkvLyBFeHRlcm5hbCBUcmlnZ2VyIEdhdGVkIGNvbnRyb2xsZWQgbW9kZQorCisvLyBQYWNlciBDbG9jayBTdG9wIFRyaWdnZXIgc2VsZWN0IChTZXRQYWNlclN0b3ApCisjZGVmaW5lIFBDTEtfU1RPUF9TT0ZUV0FSRSAgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBQYWNlciBTdG9wIChTdG9wUGFjZXIpCisjZGVmaW5lIFBDTEtfU1RPUF9FVFJJRyAgICAgICAgICAgIDB4MQkvLyBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RPUF9ESUdJVEFMX0lUICAgICAgIDB4MgkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUT1BfQUNOVCAgICAgICAgICAgICAweDMJLy8gQWJvdXQgQ291bnRlcgorI2RlZmluZSBQQ0xLX1NUT1BfVVRDMiAgICAgICAgICAgICAweDQJLy8gVXNlciBUQzIgb3V0CisjZGVmaW5lIFBDTEtfU1RPUF9TQlVTMCAgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVE9QX1NCVVMxICAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUT1BfU0JVUzIgICAgICAgICAgICAweDcJLy8gU3luY0J1cyAyCisjZGVmaW5lIFBDTEtfU1RPUF9BX1NPRlRXQVJFICAgICAgIDB4OAkvLyBBYm91dCBTb2Z0d2FyZSBQYWNlciBTdG9wCisjZGVmaW5lIFBDTEtfU1RPUF9BX0VUUklHICAgICAgICAgIDB4OQkvLyBBYm91dCBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RPUF9BX0RJR0lUQUxfSVQgICAgIDB4QQkvLyBBYm91dCBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUT1BfQV9VVEMyICAgICAgICAgICAweEMJLy8gQWJvdXQgVXNlciBUQzIgb3V0CisjZGVmaW5lIFBDTEtfU1RPUF9BX1NCVVMwICAgICAgICAgIDB4RAkvLyBBYm91dCBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVE9QX0FfU0JVUzEgICAgICAgICAgMHhFCS8vIEFib3V0IFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUT1BfQV9TQlVTMiAgICAgICAgICAweEYJLy8gQWJvdXQgU3luY0J1cyAyCisKKy8vIEFib3V0IENvdW50ZXIgU3RvcCBFbmFibGUKKyNkZWZpbmUgQUNOVF9TVE9QICAgICAgICAgICAgICAgICAgMHgwCS8vIHN0b3AgZW5hYmxlCisjZGVmaW5lIEFDTlRfTk9fU1RPUCAgICAgICAgICAgICAgIDB4MQkvLyBzdG9wIGRpc2FibGVkCisKKy8vIERBQyB1cGRhdGUgc291cmNlIChTZXREQUMxU3RhcnQgJiBTZXREQUMyU3RhcnQpCisjZGVmaW5lIERBQ19TVEFSVF9TT0ZUV0FSRSAgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBVcGRhdGUKKyNkZWZpbmUgREFDX1NUQVJUX0NHVCAgICAgICAgICAgICAgMHgxCS8vIENHVCBjb250cm9sbGVkIFVwZGF0ZQorI2RlZmluZSBEQUNfU1RBUlRfREFDX0NMSyAgICAgICAgICAweDIJLy8gRC9BIENsb2NrCisjZGVmaW5lIERBQ19TVEFSVF9FUENMSyAgICAgICAgICAgIDB4MwkvLyBFeHRlcm5hbCBQYWNlciBDbG9jaworI2RlZmluZSBEQUNfU1RBUlRfU0JVUzAgICAgICAgICAgICAweDQJLy8gU3luY0J1cyAwCisjZGVmaW5lIERBQ19TVEFSVF9TQlVTMSAgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgREFDX1NUQVJUX1NCVVMyICAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMgorCisvLyBEQUMgQ3ljbGUgTW9kZSAoU2V0REFDMUN5Y2xlLCBTZXREQUMyQ3ljbGUsIFNldHVwREFDKQorI2RlZmluZSBEQUNfQ1lDTEVfU0lOR0xFICAgICAgICAgICAweDAJLy8gbm90IGN5Y2xlCisjZGVmaW5lIERBQ19DWUNMRV9NVUxUSSAgICAgICAgICAgIDB4MQkvLyBjeWNsZQorCisvLyA4MjU0IE9wZXJhdGlvbiBNb2RlcyAoU2V0ODI1NE1vZGUsIFNldHVwVGltZXJDb3VudGVyKQorI2RlZmluZSBNODI1NF9FVkVOVF9DT1VOVEVSICAgICAgICAwCS8vIEV2ZW50IENvdW50ZXIKKyNkZWZpbmUgTTgyNTRfSFdfT05FX1NIT1QgICAgICAgICAgMQkvLyBIYXJkd2FyZS1SZXRyaWdnZXJhYmxlIE9uZS1TaG90CisjZGVmaW5lIE04MjU0X1JBVEVfR0VORVJBVE9SICAgICAgIDIJLy8gUmF0ZSBHZW5lcmF0b3IKKyNkZWZpbmUgTTgyNTRfU1FVQVJFX1dBVkUgICAgICAgICAgMwkvLyBTcXVhcmUgV2F2ZSBNb2RlCisjZGVmaW5lIE04MjU0X1NXX1NUUk9CRSAgICAgICAgICAgIDQJLy8gU29mdHdhcmUgVHJpZ2dlcmVkIFN0cm9iZQorI2RlZmluZSBNODI1NF9IV19TVFJPQkUgICAgICAgICAgICA1CS8vIEhhcmR3YXJlIFRyaWdnZXJlZCBTdHJvYmUgKFJldHJpZ2dlcmFibGUpCisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAwIENsb2NrIFNlbGVjdCAoU2V0VXRjMENsb2NrKQorI2RlZmluZSBDVVRDMF84TUhaICAgICAgICAgICAgICAgICAweDAJLy8gOE1IegorI2RlZmluZSBDVVRDMF9FWFRfVENfQ0xPQ0sxICAgICAgICAweDEJLy8gRXh0LiBUQyBDbG9jayAxCisjZGVmaW5lIENVVEMwX0VYVF9UQ19DTE9DSzIgICAgICAgIDB4MgkvLyBFeHQuIFRDIENsb2NrIDIKKyNkZWZpbmUgQ1VUQzBfRVhUX1BDTEsgICAgICAgICAgICAgMHgzCS8vIEV4dC4gUGFjZXIgQ2xvY2sKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDEgQ2xvY2sgU2VsZWN0IChTZXRVdGMxQ2xvY2spCisjZGVmaW5lIENVVEMxXzhNSFogICAgICAgICAgICAgICAgIDB4MAkvLyA4TUh6CisjZGVmaW5lIENVVEMxX0VYVF9UQ19DTE9DSzEgICAgICAgIDB4MQkvLyBFeHQuIFRDIENsb2NrIDEKKyNkZWZpbmUgQ1VUQzFfRVhUX1RDX0NMT0NLMiAgICAgICAgMHgyCS8vIEV4dC4gVEMgQ2xvY2sgMgorI2RlZmluZSBDVVRDMV9FWFRfUENMSyAgICAgICAgICAgICAweDMJLy8gRXh0LiBQYWNlciBDbG9jaworI2RlZmluZSBDVVRDMV9VVEMwX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDAgb3V0CisjZGVmaW5lIENVVEMxX0RJTl9TSUdOQUwgICAgICAgICAgIDB4NQkvLyBIaWdoLVNwZWVkIERpZ2l0YWwgSW5wdXQgICBTYW1wbGluZyBzaWduYWwKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDIgQ2xvY2sgU2VsZWN0IChTZXRVdGMyQ2xvY2spCisjZGVmaW5lIENVVEMyXzhNSFogICAgICAgICAgICAgICAgIDB4MAkvLyA4TUh6CisjZGVmaW5lIENVVEMyX0VYVF9UQ19DTE9DSzEgICAgICAgIDB4MQkvLyBFeHQuIFRDIENsb2NrIDEKKyNkZWZpbmUgQ1VUQzJfRVhUX1RDX0NMT0NLMiAgICAgICAgMHgyCS8vIEV4dC4gVEMgQ2xvY2sgMgorI2RlZmluZSBDVVRDMl9FWFRfUENMSyAgICAgICAgICAgICAweDMJLy8gRXh0LiBQYWNlciBDbG9jaworI2RlZmluZSBDVVRDMl9VVEMxX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDEgb3V0CisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAwIEdhdGUgU2VsZWN0IChTZXRVdGMwR2F0ZSkKKyNkZWZpbmUgR1VUQzBfTk9UX0dBVEVEICAgICAgICAgICAgMHgwCS8vIE5vdCBnYXRlZAorI2RlZmluZSBHVVRDMF9HQVRFRCAgICAgICAgICAgICAgICAweDEJLy8gR2F0ZWQKKyNkZWZpbmUgR1VUQzBfRVhUX1RDX0dBVEUxICAgICAgICAgMHgyCS8vIEV4dC4gVEMgR2F0ZSAxCisjZGVmaW5lIEdVVEMwX0VYVF9UQ19HQVRFMiAgICAgICAgIDB4MwkvLyBFeHQuIFRDIEdhdGUgMgorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMSBHYXRlIFNlbGVjdCAoU2V0VXRjMUdhdGUpCisjZGVmaW5lIEdVVEMxX05PVF9HQVRFRCAgICAgICAgICAgIDB4MAkvLyBOb3QgZ2F0ZWQKKyNkZWZpbmUgR1VUQzFfR0FURUQgICAgICAgICAgICAgICAgMHgxCS8vIEdhdGVkCisjZGVmaW5lIEdVVEMxX0VYVF9UQ19HQVRFMSAgICAgICAgIDB4MgkvLyBFeHQuIFRDIEdhdGUgMQorI2RlZmluZSBHVVRDMV9FWFRfVENfR0FURTIgICAgICAgICAweDMJLy8gRXh0LiBUQyBHYXRlIDIKKyNkZWZpbmUgR1VUQzFfVVRDMF9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAwIG91dAorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMiBHYXRlIFNlbGVjdCAoU2V0VXRjMkdhdGUpCisjZGVmaW5lIEdVVEMyX05PVF9HQVRFRCAgICAgICAgICAgIDB4MAkvLyBOb3QgZ2F0ZWQKKyNkZWZpbmUgR1VUQzJfR0FURUQgICAgICAgICAgICAgICAgMHgxCS8vIEdhdGVkCisjZGVmaW5lIEdVVEMyX0VYVF9UQ19HQVRFMSAgICAgICAgIDB4MgkvLyBFeHQuIFRDIEdhdGUgMQorI2RlZmluZSBHVVRDMl9FWFRfVENfR0FURTIgICAgICAgICAweDMJLy8gRXh0LiBUQyBHYXRlIDIKKyNkZWZpbmUgR1VUQzJfVVRDMV9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAxIG91dAorCisvLyBJbnRlcnJ1cHQgU291cmNlIE1hc2tzIChTZXRJVE1hc2ssIENsZWFySVRNYXNrLCBHZXRJVFN0YXR1cykKKyNkZWZpbmUgSVJRTV9BRENfRklGT19XUklURSAgICAgICAgMHgwMDAxCS8vIEFEQyBGSUZPIFdyaXRlCisjZGVmaW5lIElSUU1fQ0dUX1JFU0VUICAgICAgICAgICAgIDB4MDAwMgkvLyBSZXNldCBDR1QKKyNkZWZpbmUgSVJRTV9DR1RfUEFVU0UgICAgICAgICAgICAgMHgwMDA4CS8vIFBhdXNlIENHVAorI2RlZmluZSBJUlFNX0FEQ19BQk9VVF9DTlQgICAgICAgICAweDAwMTAJLy8gQWJvdXQgQ291bnRlciBvdXQKKyNkZWZpbmUgSVJRTV9BRENfREVMQVlfQ05UICAgICAgICAgMHgwMDIwCS8vIERlbGF5IENvdW50ZXIgb3V0CisjZGVmaW5lIElSUU1fQURDX1NBTVBMRV9DTlQJICAgMHgwMDQwCS8vIEFEQyBTYW1wbGUgQ291bnRlcgorI2RlZmluZSBJUlFNX0RBQzFfVUNOVCAgICAgICAgICAgICAweDAwODAJLy8gREFDMSBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBJUlFNX0RBQzJfVUNOVCAgICAgICAgICAgICAweDAxMDAJLy8gREFDMiBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBJUlFNX1VUQzEgICAgICAgICAgICAgICAgICAweDAyMDAJLy8gVXNlciBUQzEgb3V0CisjZGVmaW5lIElSUU1fVVRDMV9JTlYgICAgICAgICAgICAgIDB4MDQwMAkvLyBVc2VyIFRDMSBvdXQsIGludmVydGVkCisjZGVmaW5lIElSUU1fVVRDMiAgICAgICAgICAgICAgICAgIDB4MDgwMAkvLyBVc2VyIFRDMiBvdXQKKyNkZWZpbmUgSVJRTV9ESUdJVEFMX0lUICAgICAgICAgICAgMHgxMDAwCS8vIERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIElSUU1fRVhURVJOQUxfSVQgICAgICAgICAgIDB4MjAwMAkvLyBFeHRlcm5hbCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVJRTV9FVFJJR19SSVNJTkcgICAgICAgICAgMHg0MDAwCS8vIEV4dGVybmFsIFRyaWdnZXIgcmlzaW5nLWVkZ2UKKyNkZWZpbmUgSVJRTV9FVFJJR19GQUxMSU5HICAgICAgICAgMHg4MDAwCS8vIEV4dGVybmFsIFRyaWdnZXIgZmFsbGluZy1lZGdlCisKKy8vIERNQSBSZXF1ZXN0IFNvdXJjZXMgKExBUzApCisjZGVmaW5lIERNQVNfRElTQUJMRUQgICAgICAgICAgICAgIDB4MAkvLyBETUEgRGlzYWJsZWQKKyNkZWZpbmUgRE1BU19BRENfU0NOVCAgICAgICAgICAgICAgMHgxCS8vIEFEQyBTYW1wbGUgQ291bnRlcgorI2RlZmluZSBETUFTX0RBQzFfVUNOVCAgICAgICAgICAgICAweDIJLy8gRC9BMSBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBETUFTX0RBQzJfVUNOVCAgICAgICAgICAgICAweDMJLy8gRC9BMiBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBETUFTX1VUQzEgICAgICAgICAgICAgICAgICAweDQJLy8gVXNlciBUQzEgb3V0CisjZGVmaW5lIERNQVNfQURGSUZPX0hBTEZfRlVMTCAgICAgIDB4OAkvLyBBL0QgRklGTyBoYWxmIGZ1bGwKKyNkZWZpbmUgRE1BU19EQUMxX0ZJRk9fSEFMRl9FTVBUWSAgMHg5CS8vIEQvQTEgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIERNQVNfREFDMl9GSUZPX0hBTEZfRU1QVFkgIDB4QQkvLyBEL0EyIEZJRk8gaGFsZiBlbXB0eQorCisvLyBETUEgTG9jYWwgQWRkcmVzc2VzICAgKDB4NDAwMDAwMDArTEFTMSBvZmZzZXQpCisjZGVmaW5lIERNQUxBRERSX0FEQyAgICAgICAweDQwMDAwMDAwCS8vIEEvRCBGSUZPCisjZGVmaW5lIERNQUxBRERSX0hESU4gICAgICAweDQwMDAwMDA0CS8vIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCBGSUZPCisjZGVmaW5lIERNQUxBRERSX0RBQzEgICAgICAweDQwMDAwMDA4CS8vIEQvQTEgRklGTworI2RlZmluZSBETUFMQUREUl9EQUMyICAgICAgMHg0MDAwMDAwQwkvLyBEL0EyIEZJRk8KKworLy8gUG9ydCAwIGNvbXBhcmUgbW9kZXMgKFNldERJTzBDb21wYXJlTW9kZSkKKyNkZWZpbmUgRElPX01PREVfRVZFTlQgICAgIDAJLy8gRXZlbnQgTW9kZQorI2RlZmluZSBESU9fTU9ERV9NQVRDSCAgICAgMQkvLyBNYXRjaCBNb2RlCisKKy8vIERpZ2l0YWwgVGFibGUgRW5hYmxlIChQb3J0IDEgZGlzYWJsZSkKKyNkZWZpbmUgRFRCTF9ESVNBQkxFICAgICAgIDAJLy8gRW5hYmxlIERpZ2l0YWwgVGFibGUKKyNkZWZpbmUgRFRCTF9FTkFCTEUgICAgICAgIDEJLy8gRGlzYWJsZSBEaWdpdGFsIFRhYmxlCisKKy8vIFNhbXBsaW5nIFNpZ25hbCBmb3IgSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IChTZXRIZGluU3RhcnQpCisjZGVmaW5lIEhESU5fU09GVFdBUkUgICAgICAweDAJLy8gU29mdHdhcmUgVHJpZ2dlcgorI2RlZmluZSBIRElOX0FEQyAgICAgICAgICAgMHgxCS8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbAorI2RlZmluZSBIRElOX1VUQzAgICAgICAgICAgMHgyCS8vIFVzZXIgVEMgb3V0IDAKKyNkZWZpbmUgSERJTl9VVEMxICAgICAgICAgIDB4MwkvLyBVc2VyIFRDIG91dCAxCisjZGVmaW5lIEhESU5fVVRDMiAgICAgICAgICAweDQJLy8gVXNlciBUQyBvdXQgMgorI2RlZmluZSBIRElOX0VQQ0xLICAgICAgICAgMHg1CS8vIEV4dGVybmFsIFBhY2VyIENsb2NrCisjZGVmaW5lIEhESU5fRVRSRyAgICAgICAgICAweDYJLy8gRXh0ZXJuYWwgVHJpZ2dlcgorCisvLyBDaGFubmVsIEdhaW4gVGFibGUgLyBDaGFubmVsIEdhaW4gTGF0Y2gKKyNkZWZpbmUgQ1NDX0xBVENIICAgICAgICAgIDAJLy8gQ2hhbm5lbCBHYWluIExhdGNoIG1vZGUKKyNkZWZpbmUgQ1NDX0NHVCAgICAgICAgICAgIDEJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIG1vZGUKKworLy8gQ2hhbm5lbCBHYWluIFRhYmxlIFBhdXNlIEVuYWJsZQorI2RlZmluZSBDR1RfUEFVU0VfRElTQUJMRSAgMAkvLyBDaGFubmVsIEdhaW4gVGFibGUgUGF1c2UgRGlzYWJsZQorI2RlZmluZSBDR1RfUEFVU0VfRU5BQkxFICAgMQkvLyBDaGFubmVsIEdhaW4gVGFibGUgUGF1c2UgRW5hYmxlCisKKy8vIERBQyBvdXRwdXQgdHlwZS9yYW5nZSAocDYzKQorI2RlZmluZSBBT1VUX1VOSVA1ICAgICAgICAgMAkvLyAwLi4rNSBWb2x0CisjZGVmaW5lIEFPVVRfVU5JUDEwICAgICAgICAxCS8vIDAuLisxMCBWb2x0CisjZGVmaW5lIEFPVVRfQklQNSAgICAgICAgICAyCS8vIC01Li4rNSBWb2x0CisjZGVmaW5lIEFPVVRfQklQMTAgICAgICAgICAzCS8vIC0xMC4uKzEwIFZvbHQKKworLy8gR2hhbm5lbCBHYWluIFRhYmxlIGZpZWxkIGRlZmluaXRpb25zIChwNjEpCisvLyBHYWluCisjZGVmaW5lIEdBSU4xICAgICAgICAgICAgICAwCisjZGVmaW5lIEdBSU4yICAgICAgICAgICAgICAxCisjZGVmaW5lIEdBSU40ICAgICAgICAgICAgICAyCisjZGVmaW5lIEdBSU44ICAgICAgICAgICAgICAzCisjZGVmaW5lIEdBSU4xNiAgICAgICAgICAgICA0CisjZGVmaW5lIEdBSU4zMiAgICAgICAgICAgICA1CisjZGVmaW5lIEdBSU42NCAgICAgICAgICAgICA2CisjZGVmaW5lIEdBSU4xMjggICAgICAgICAgICA3CisKKy8vIElucHV0IHJhbmdlL3BvbGFyaXR5CisjZGVmaW5lIEFJTl9CSVA1ICAgICAgICAgICAwCS8vIC01Li4rNSBWb2x0CisjZGVmaW5lIEFJTl9CSVAxMCAgICAgICAgICAxCS8vIC0xMC4uKzEwIFZvbHQKKyNkZWZpbmUgQUlOX1VOSVAxMCAgICAgICAgIDIJLy8gMC4uKzEwIFZvbHQKKworLy8gbm9uIHJlZmVyZW5jZWQgc2luZ2xlIGVuZGVkIHNlbGVjdCBiaXQKKyNkZWZpbmUgTlJTRV9BR05EICAgICAgICAgIDAJLy8gQUdORCByZWZlcmVuY2VkIFNFIGlucHV0CisjZGVmaW5lIE5SU0VfQUlOUyAgICAgICAgICAxCS8vIEFJTiBTRU5TRSByZWZlcmVuY2VkIFNFIGlucHV0CisKKy8vIHNpbmdsZSBlbmRlZCB2cyBkaWZmZXJlbnRpYWwKKyNkZWZpbmUgR05EX1NFCQkwCS8vIFNpbmdsZS1FbmRlZAorI2RlZmluZSBHTkRfRElGRgkxCS8vIERpZmZlcmVudGlhbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZWU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTAsMCArMSwzMjU0IEBACisvKgorICBjb21lZGkvZHJpdmVycy9zNjI2LmMKKyAgU2Vuc29yYXkgczYyNiBDb21lZGkgZHJpdmVyCisKKyAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgQmFzZWQgb24gU2Vuc29yYXkgTW9kZWwgNjI2IExpbnV4IGRyaXZlciBWZXJzaW9uIDAuMgorICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTZW5zb3JheSBDby4sIEluYy4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCitEcml2ZXI6IHM2MjYKK0Rlc2NyaXB0aW9uOiBTZW5zb3JheSA2MjYgZHJpdmVyCitEZXZpY2VzOiBbU2Vuc29yYXldIDYyNiAoczYyNikKK0F1dGhvcnM6IEdpYW5sdWNhIFBhbGxpIDxncGFsbGlAZGVpcy51bmliby5pdD4sCitVcGRhdGVkOiBGcmksIDE1IEZlYiAyMDA4IDEwOjI4OjQyICswMDAwCitTdGF0dXM6IGV4cGVyaW1lbnRhbAorCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFswXSAtIFBDSSBidXMgb2YgZGV2aWNlIChvcHRpb25hbCkKKyAgWzFdIC0gUENJIHNsb3Qgb2YgZGV2aWNlIChvcHRpb25hbCkKKyAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IHN1cHBvcnRlZAorICBQQ0kgZGV2aWNlIGZvdW5kIHdpbGwgYmUgdXNlZC4KKworSU5TTl9DT05GSUcgaW5zdHJ1Y3Rpb25zOgorICBhbmFsb2cgaW5wdXQ6CisgICBub25lCisKKyAgYW5hbG9nIG91dHB1dDoKKyAgIG5vbmUKKworICBkaWdpdGFsIGNoYW5uZWw6CisgICBzNjI2IGhhcyAzIGRpbyBzdWJkZXZpY2VzICgyLDMgYW5kIDQpIGVhY2ggd2l0aCAxNiBpL28gY2hhbm5lbHMKKyAgIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnM6CisgICBJTlNOX0NPTkZJR19ESU9fUVVFUlkKKyAgIENPTUVESV9JTlBVVAorICAgQ09NRURJX09VVFBVVAorCisgIGVuY29kZXI6CisgICBFdmVyeSBjaGFubmVsIG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgcmVhZGluZy4KKworICAgRXhhbXBsZSBjb2RlCisKKyAgIGluc24uaW5zbj1JTlNOX0NPTkZJRzsgICAvL2NvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb24KKyAgIGluc24ubj0xOyAgICAgICAgICAgICAgICAvL251bWJlciBvZiBvcGVyYXRpb24gKG11c3QgYmUgMSkKKyAgIGluc24uZGF0YT0maW5pdGlhbHZhbHVlOyAvL2luaXRpYWwgdmFsdWUgbG9hZGVkIGludG8gZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVyaW5nIGNvbmZpZ3VyYXRpb24KKyAgIGluc24uc3ViZGV2PTU7ICAgICAgICAgICAvL2VuY29kZXIgc3ViZGV2aWNlCisgICBpbnNuLmNoYW5zcGVjPUNSX1BBQ0soZW5jb2Rlcl9jaGFubmVsLDAsQVJFRl9PVEhFUik7IC8vZW5jb2Rlcl9jaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gY29uZmlndXJlCisKKyAgIGNvbWVkaV9kb19pbnNuKGNmLCZpbnNuKTsgLy9leGVjdXRpbmcgY29uZmlndXJhdGlvbgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKworI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgInM2MjYuaCIKKworTU9EVUxFX0FVVEhPUigiR2lhbmx1Y2EgUGFsbGkgPGdwYWxsaUBkZWlzLnVuaWJvLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTZW5zb3JheSA2MjYgQ29tZWRpIGRyaXZlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwordHlwZWRlZiBzdHJ1Y3QgczYyNl9ib2FyZF9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGFpX2NoYW5zOworCWludCBhaV9iaXRzOworCWludCBhb19jaGFuczsKKwlpbnQgYW9fYml0czsKKwlpbnQgZGlvX2NoYW5zOworCWludCBkaW9fYmFua3M7CisJaW50IGVuY19jaGFuczsKK30gczYyNl9ib2FyZDsKKworc3RhdGljIGNvbnN0IHM2MjZfYm9hcmQgczYyNl9ib2FyZHNbXSA9IHsKKwl7CisJICAgICAgbmFtZToJInM2MjYiLAorCSAgICAgIGFpX2NoYW5zOlM2MjZfQURDX0NIQU5ORUxTLAorCSAgICAgIGFpX2JpdHM6CTE0LAorCSAgICAgIGFvX2NoYW5zOlM2MjZfREFDX0NIQU5ORUxTLAorCSAgICAgIGFvX2JpdHM6CTEzLAorCSAgICAgIGRpb19jaGFuczpTNjI2X0RJT19DSEFOTkVMUywKKwkgICAgICBkaW9fYmFua3M6UzYyNl9ESU9fQkFOS1MsCisJICAgICAgZW5jX2NoYW5zOlM2MjZfRU5DT0RFUl9DSEFOTkVMUywKKwkJfQorfTsKKworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzNjI2X2JvYXJkICopZGV2LT5ib2FyZF9wdHIpCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUzYyNiAweDExMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TNjI2IDB4NzE0NgorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoczYyNl9wY2lfdGFibGUpID0geworCXtQQ0lfVkVORE9SX0lEX1M2MjYsIFBDSV9ERVZJQ0VfSURfUzYyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJMH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgczYyNl9wY2lfdGFibGUpOworCitzdGF0aWMgaW50IHM2MjZfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IHM2MjZfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfczYyNiA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJzNjI2IiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDpzNjI2X2F0dGFjaCwKKyAgICAgIGRldGFjaDpzNjI2X2RldGFjaCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl2b2lkICpiYXNlX2FkZHI7CisJaW50IGdvdF9yZWdpb25zOworCXNob3J0IGFsbG9jYXRlZEJ1ZjsKKwl1aW50OF90IGFpX2NtZF9ydW5uaW5nOwkvLyBhaV9jbWQgaXMgcnVubmluZworCXVpbnQ4X3QgYWlfY29udGlub3VzOwkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCWludCBhaV9zYW1wbGVfY291bnQ7CS8vIG51bWJlciBvZiBzYW1wbGVzIHRvIGFxdWlyZQorCXVuc2lnbmVkIGludCBhaV9zYW1wbGVfdGltZXI7CS8vIHRpbWUgYmV0d2VlbiBzYW1wbGVzIGluCisJLy8gdW5pdHMgb2YgdGhlIHRpbWVyCisJaW50IGFpX2NvbnZlcnRfY291bnQ7CS8vIGNvbnZlcnNpb24gY291bnRlcgorCXVuc2lnbmVkIGludCBhaV9jb252ZXJ0X3RpbWVyOwkvLyB0aW1lIGJldHdlZW4gY29udmVyc2lvbiBpbgorCS8vIHVuaXRzIG9mIHRoZSB0aW1lcgorCXVpbnQxNl90IENvdW50ZXJJbnRFbmFiczsJLy9Db3VudGVyIGludGVycnVwdCBlbmFibGUKKwkvL21hc2sgZm9yIE1JU0MyIHJlZ2lzdGVyLgorCXVpbnQ4X3QgQWRjSXRlbXM7CS8vTnVtYmVyIG9mIGl0ZW1zIGluIEFEQyBwb2xsCisJLy9saXN0LgorCURNQUJVRiBSUFNCdWY7CQkvL0RNQSBidWZmZXIgdXNlZCB0byBob2xkIEFEQworCS8vKFJQUzEpIHByb2dyYW0uCisJRE1BQlVGIEFOQUJ1ZjsJCS8vRE1BIGJ1ZmZlciB1c2VkIHRvIHJlY2VpdmUKKwkvL0FEQyBkYXRhIGFuZCBob2xkIERBQyBkYXRhLgorCXVpbnQzMl90ICpwRGFjV0J1ZjsJLy9Qb2ludGVyIHRvIGxvZ2ljYWwgYWRycyBvZgorCS8vRE1BIGJ1ZmZlciB1c2VkIHRvIGhvbGQgREFDCisJLy9kYXRhLgorCXVpbnQxNl90IERhY3BvbDsJLy9JbWFnZSBvZiBEQUMgcG9sYXJpdHkKKwkvL3JlZ2lzdGVyLgorCXVpbnQ4X3QgVHJpbVNldHBvaW50WzEyXTsJLy9JbWFnZXMgb2YgVHJpbURBQyBzZXRwb2ludHMuCisJLy9yZWdpc3RlcnMuCisJdWludDE2X3QgQ2hhcmdlRW5hYmxlZDsJLy9JbWFnZSBvZiBNSVNDMiBCYXR0ZXJ5CisJLy9DaGFyZ2UgRW5hYmxlZCAoMCBvcgorCS8vV1JNSVNDMl9DSEFSR0VfRU5BQkxFKS4KKwl1aW50MTZfdCBXREludGVydmFsOwkvL0ltYWdlIG9mIE1JU0MyIHdhdGNoZG9nCisJLy9pbnRlcnZhbCBjb250cm9sIGJpdHMuCisJdWludDMyX3QgSTJDQWRyczsJLy9JMkMgZGV2aWNlIGFkZHJlc3MgZm9yCisJLy9vbmJvYXJkIEVFUFJPTSAoYm9hcmQgcmV2CisJLy9kZXBlbmRlbnQpLgorCS8vICBzaG9ydCAgICAgICAgIEkyQ2FyZHM7CisJbHNhbXBsX3QgYW9fcmVhZGJhY2tbUzYyNl9EQUNfQ0hBTk5FTFNdOworfSBzNjI2X3ByaXZhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBSRERJbjsKKwl1aW50MTZfdCBXUkRPdXQ7CisJdWludDE2X3QgUkRFZGdTZWw7CisJdWludDE2X3QgV1JFZGdTZWw7CisJdWludDE2X3QgUkRDYXBTZWw7CisJdWludDE2X3QgV1JDYXBTZWw7CisJdWludDE2X3QgUkRDYXBGbGc7CisJdWludDE2X3QgUkRJbnRTZWw7CisJdWludDE2X3QgV1JJbnRTZWw7Cit9IGRpb19wcml2YXRlOworCitzdGF0aWMgZGlvX3ByaXZhdGUgZGlvX3ByaXZhdGVfQSA9IHsKKyAgICAgIFJEREluOkxQX1JERElOQSwKKyAgICAgIFdSRE91dDpMUF9XUkRPVVRBLAorICAgICAgUkRFZGdTZWw6TFBfUkRFREdTRUxBLAorICAgICAgV1JFZGdTZWw6TFBfV1JFREdTRUxBLAorICAgICAgUkRDYXBTZWw6TFBfUkRDQVBTRUxBLAorICAgICAgV1JDYXBTZWw6TFBfV1JDQVBTRUxBLAorICAgICAgUkRDYXBGbGc6TFBfUkRDQVBGTEdBLAorICAgICAgUkRJbnRTZWw6TFBfUkRJTlRTRUxBLAorICAgICAgV1JJbnRTZWw6TFBfV1JJTlRTRUxBLAorfTsKKworc3RhdGljIGRpb19wcml2YXRlIGRpb19wcml2YXRlX0IgPSB7CisgICAgICBSRERJbjpMUF9SRERJTkIsCisgICAgICBXUkRPdXQ6TFBfV1JET1VUQiwKKyAgICAgIFJERWRnU2VsOkxQX1JERURHU0VMQiwKKyAgICAgIFdSRWRnU2VsOkxQX1dSRURHU0VMQiwKKyAgICAgIFJEQ2FwU2VsOkxQX1JEQ0FQU0VMQiwKKyAgICAgIFdSQ2FwU2VsOkxQX1dSQ0FQU0VMQiwKKyAgICAgIFJEQ2FwRmxnOkxQX1JEQ0FQRkxHQiwKKyAgICAgIFJESW50U2VsOkxQX1JESU5UU0VMQiwKKyAgICAgIFdSSW50U2VsOkxQX1dSSU5UU0VMQiwKK307CisKK3N0YXRpYyBkaW9fcHJpdmF0ZSBkaW9fcHJpdmF0ZV9DID0geworICAgICAgUkRESW46TFBfUkRESU5DLAorICAgICAgV1JET3V0OkxQX1dSRE9VVEMsCisgICAgICBSREVkZ1NlbDpMUF9SREVER1NFTEMsCisgICAgICBXUkVkZ1NlbDpMUF9XUkVER1NFTEMsCisgICAgICBSRENhcFNlbDpMUF9SRENBUFNFTEMsCisgICAgICBXUkNhcFNlbDpMUF9XUkNBUFNFTEMsCisgICAgICBSRENhcEZsZzpMUF9SRENBUEZMR0MsCisgICAgICBSREludFNlbDpMUF9SRElOVFNFTEMsCisgICAgICBXUkludFNlbDpMUF9XUklOVFNFTEMsCit9OworCisvKiB0byBncm91cCBkaW8gZGV2aWNlcyAoNDggYml0cyBtYXNrIGFuZCBkYXRhIGFyZSBub3QgYWxsb3dlZCA/Pz8pCitzdGF0aWMgZGlvX3ByaXZhdGUgKmRpb19wcml2YXRlX3dvcmRbXT17CisgICZkaW9fcHJpdmF0ZV9BLAorICAmZGlvX3ByaXZhdGVfQiwKKyAgJmRpb19wcml2YXRlX0MsCit9OworKi8KKworI2RlZmluZSBkZXZwcml2ICgoczYyNl9wcml2YXRlICopZGV2LT5wcml2YXRlKQorI2RlZmluZSBkaW9wcml2ICgoZGlvX3ByaXZhdGUgKilzLT5wcml2YXRlKQorCitDT01FRElfUENJX0lOSVRDTEVBTlVQX05PTU9EVUxFKGRyaXZlcl9zNjI2LCBzNjI2X3BjaV90YWJsZSk7CisKKy8vaW9jdGwgcm91dGluZXMKK3N0YXRpYyBpbnQgczYyNl9haV9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisvKiBzdGF0aWMgaW50IHM2MjZfYWlfcmluc24oY29tZWRpX2RldmljZSAqZGV2LGNvbWVkaV9zdWJkZXZpY2UgKnMsY29tZWRpX2luc24gKmluc24sbHNhbXBsX3QgKmRhdGEpOyAqLworc3RhdGljIGludCBzNjI2X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK3N0YXRpYyBpbnQgczYyNl9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQpOworc3RhdGljIGludCBzNjI2X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CitzdGF0aWMgaW50IHM2MjZfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2Rpb19zZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFuKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9fcmVzZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBncnVvcCwKKwl1bnNpZ25lZCBpbnQgbWFzayk7CitzdGF0aWMgaW50IHM2MjZfZGlvX2NsZWFyX2lycShjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9uc190b190aW1lcihpbnQgKm5hbm9zZWMsIGludCByb3VuZF9tb2RlKTsKK3N0YXRpYyBpbnQgczYyNl9haV9sb2FkX3BvbGxsaXN0KHVpbnQ4X3QgKiBwcGwsIGNvbWVkaV9jbWQgKiBjbWQpOworc3RhdGljIGludCBzNjI2X2FpX2ludHRyaWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50IHRyaWdudW0pOworc3RhdGljIGlycXJldHVybl90IHM2MjZfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRyk7CitzdGF0aWMgbHNhbXBsX3QgczYyNl9haV9yZWdfdG9fdWludChpbnQgZGF0YSk7CisvKiBzdGF0aWMgbHNhbXBsX3QgczYyNl91aW50X3RvX3JlZyhjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgZGF0YSk7ICovCisKKy8vZW5kIGlvY3RsIHJvdXRpbmVzCisKKy8vaW50ZXJuYWwgcm91dGluZXMKK3N0YXRpYyB2b2lkIHM2MjZfZGlvX2luaXQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgdm9pZCBSZXNldEFEQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90ICogcHBsKTsKK3N0YXRpYyB2b2lkIExvYWRUcmltREFDcyhjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB2b2lkIFdyaXRlVHJpbURBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90IExvZ2ljYWxDaGFuLAorCXVpbnQ4X3QgRGFjRGF0YSk7CitzdGF0aWMgdWludDhfdCBJMkNyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgYWRkcik7CitzdGF0aWMgdWludDMyX3QgSTJDaGFuZHNoYWtlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCk7CitzdGF0aWMgdm9pZCBTZXREQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgY2hhbiwgc2hvcnQgZGFjZGF0YSk7CitzdGF0aWMgdm9pZCBTZW5kREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCk7CitzdGF0aWMgdm9pZCBXcml0ZU1JU0MyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IE5ld0ltYWdlKTsKK3N0YXRpYyB2b2lkIERFQkl0cmFuc2Zlcihjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB1aW50MTZfdCBERUJJcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyKTsKK3N0YXRpYyB2b2lkIERFQkl3cml0ZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCB3ZGF0YSk7CitzdGF0aWMgdm9pZCBERUJJcmVwbGFjZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBtYXNrLAorCXVpbnQxNl90IHdkYXRhKTsKK3N0YXRpYyB2b2lkIENsb3NlRE1BQihjb21lZGlfZGV2aWNlICogZGV2LCBETUFCVUYgKiBwZG1hLCBzaXplX3QgYnNpemUpOworCisvLyBDT1VOVEVSIE9CSkVDVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCB7CisJLy8gUG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgZGlmZmVyIGZvciBBIGFuZCBCIGNvdW50ZXJzOgorCXVpbnQxNl90KCpHZXRFbmFibGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1JldHVybiBjbG9jayBlbmFibGUuCisJdWludDE2X3QoKkdldEludFNyYykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIGludGVycnVwdCBzb3VyY2UuCisJdWludDE2X3QoKkdldExvYWRUcmlnKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXR1cm4gcHJlbG9hZCB0cmlnZ2VyIHNvdXJjZS4KKwl1aW50MTZfdCgqR2V0TW9kZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4KKwl2b2lkICgqUHVsc2VJbmRleCkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vR2VuZXJhdGUgc29mdCBpbmRleCBzdHJvYmUuCisJdm9pZCAoKlNldEVuYWJsZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgZW5hYik7CS8vUHJvZ3JhbSBjbG9jayBlbmFibGUuCisJdm9pZCAoKlNldEludFNyYykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgSW50U291cmNlKTsJLy9Qcm9ncmFtIGludGVycnVwdCBzb3VyY2UuCisJdm9pZCAoKlNldExvYWRUcmlnKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqLCB1aW50MTZfdCBUcmlnKTsJLy9Qcm9ncmFtIHByZWxvYWQgdHJpZ2dlciBzb3VyY2UuCisJdm9pZCAoKlNldE1vZGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICosIHVpbnQxNl90IFNldHVwLCB1aW50MTZfdCBEaXNhYmxlSW50U3JjKTsJLy9Qcm9ncmFtIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4KKwl2b2lkICgqUmVzZXRDYXBGbGFncykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmVzZXQgZXZlbnQgY2FwdHVyZSBmbGFncy4KKworCXVpbnQxNl90IE15Q1JBOwkJLy8gICBBZGRyZXNzIG9mIENSQSByZWdpc3Rlci4KKwl1aW50MTZfdCBNeUNSQjsJCS8vICAgQWRkcmVzcyBvZiBDUkIgcmVnaXN0ZXIuCisJdWludDE2X3QgTXlMYXRjaExzdzsJLy8gICBBZGRyZXNzIG9mIExhdGNoIGxlYXN0LXNpZ25pZmljYW50LXdvcmQKKwkvLyAgIHJlZ2lzdGVyLgorCXVpbnQxNl90IE15RXZlbnRCaXRzWzRdOwkvLyAgIEJpdCB0cmFuc2xhdGlvbnMgZm9yIEludFNyYyAtLT5SRE1JU0MyLgorfSBlbmNfcHJpdmF0ZTsJCQkvL2NvdW50ZXIgb2JqZWN0CisKKyNkZWZpbmUgZW5jcHJpdiAoKGVuY19wcml2YXRlICopKGRldi0+c3ViZGV2aWNlcys1KS0+cHJpdmF0ZSkKKworLy9jb3VudGVycyByb3V0aW5lcworc3RhdGljIHZvaWQgczYyNl90aW1lcl9sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgaW50IHRpY2spOworc3RhdGljIHVpbnQzMl90IFJlYWRMYXRjaChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBSZXNldENhcEZsYWdzX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFNldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpOworc3RhdGljIHZvaWQgU2V0TW9kZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgU2V0dXAsCisJdWludDE2X3QgRGlzYWJsZUludFNyYyk7CitzdGF0aWMgdm9pZCBTZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IGVuYWIpOworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBTZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgdmFsdWUpOworLyogc3RhdGljIHVpbnQxNl90IEdldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKTsgKi8KK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKTsKK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgU2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IEludFNvdXJjZSk7CitzdGF0aWMgdm9pZCBTZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgSW50U291cmNlKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CisvKiBzdGF0aWMgdm9pZCBTZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgOyAqLworLyogc3RhdGljIHVpbnQxNl90IEdldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApIDsgKi8KKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4UG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICk7ICovCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrUG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSA7ICovCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFNyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApOyAgKi8KKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqayApOyAgKi8KKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4U3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICk7ICAqLworLyogc3RhdGljIHVpbnQxNl90IEdldEluZGV4U3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmsgKTsgICovCitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUHJlbG9hZChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQzMl90IHZhbHVlKTsKK3N0YXRpYyB2b2lkIENvdW50ZXJzSW5pdChjb21lZGlfZGV2aWNlICogZGV2KTsKKy8vZW5kIGludGVybmFsIHJvdXRpbmVzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvdW50ZXIgb2JqZWN0cyBjb25zdHJ1Y3Rvci4KKworLy8gQ291bnRlciBvdmVyZmxvdy9pbmRleCBldmVudCBmbGFnIG1hc2tzIGZvciBSRE1JU0MyLgorI2RlZmluZSBJTkRYTUFTSyhDKQkJKCAxIDw8ICggKCAoQykgPiAyICkgPyAoIChDKSAqIDIgLSAxICkgOiAoIChDKSAqIDIgKyAgNCApICkgKQorI2RlZmluZSBPVkVSTUFTSyhDKQkJKCAxIDw8ICggKCAoQykgPiAyICkgPyAoIChDKSAqIDIgKyA1ICkgOiAoIChDKSAqIDIgKyAxMCApICkgKQorI2RlZmluZSBFVkJJVFMoQykJCXsgMCwgT1ZFUk1BU0soQyksIElORFhNQVNLKEMpLCBPVkVSTUFTSyhDKSB8IElORFhNQVNLKEMpIH0KKworLy8gVHJhbnNsYXRpb24gdGFibGUgdG8gbWFwIEludFNyYyBpbnRvIGVxdWl2YWxlbnQgUkRNSVNDMiBldmVudCBmbGFnCisvLyBiaXRzLgorLy9zdGF0aWMgY29uc3QgdWludDE2X3QgRXZlbnRCaXRzW11bNF0gPSB7IEVWQklUUygwKSwgRVZCSVRTKDEpLCBFVkJJVFMoMiksIEVWQklUUygzKSwgRVZCSVRTKDQpLCBFVkJJVFMoNSkgfTsKKworLyogZW5jX3ByaXZhdGU7ICovCitzdGF0aWMgZW5jX3ByaXZhdGUgZW5jX3ByaXZhdGVfZGF0YVtdID0geworCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMEEsCisJICAgICAgTXlDUkI6CUxQX0NSMEIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMEFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDApLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMUEsCisJICAgICAgTXlDUkI6CUxQX0NSMUIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMUFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDEpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMkEsCisJICAgICAgTXlDUkI6CUxQX0NSMkIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMkFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDIpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMEEsCisJICAgICAgTXlDUkI6CUxQX0NSMEIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMEJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDMpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMUEsCisJICAgICAgTXlDUkI6CUxQX0NSMUIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMUJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDQpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMkEsCisJICAgICAgTXlDUkI6CUxQX0NSMkIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMkJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDUpLAorCQl9LAorfTsKKworLy8gZW5hYi9kaXNhYmxlIGEgZnVuY3Rpb24gb3IgdGVzdCBzdGF0dXMgYml0KHMpIHRoYXQgYXJlIGFjY2Vzc2VkCisvLyB0aHJvdWdoIE1haW4gQ29udHJvbCBSZWdpc3RlcnMgMSBvciAyLgorI2RlZmluZSBNQ19FTkFCTEUoIFJFR0FEUlMsIENUUkxXT1JEICkJd3JpdGVsKCAgKCAodWludDMyX3QpKCBDVFJMV09SRCApIDw8IDE2ICkgfCAodWludDMyX3QpKCBDVFJMV09SRCApLGRldnByaXYtPmJhc2VfYWRkcisoIFJFR0FEUlMgKSApCisKKyNkZWZpbmUgTUNfRElTQUJMRSggUkVHQURSUywgQ1RSTFdPUkQgKQl3cml0ZWwoICAodWludDMyX3QpKCBDVFJMV09SRCApIDw8IDE2ICwgZGV2cHJpdi0+YmFzZV9hZGRyKyggUkVHQURSUyApICkKKworI2RlZmluZSBNQ19URVNUKCBSRUdBRFJTLCBDVFJMV09SRCApCSggKCByZWFkbChkZXZwcml2LT5iYXNlX2FkZHIrKCBSRUdBRFJTICkpICYgQ1RSTFdPUkQgKSAhPSAwICkKKworLyogI2RlZmluZSBXUjcxNDYoUkVHQVJEUyxDVFJMV09SRCkKKyAgICB3cml0ZWwoQ1RSTFdPUkQsKHVpbnQzMl90KShkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKSkgKi8KKyNkZWZpbmUgV1I3MTQ2KFJFR0FSRFMsQ1RSTFdPUkQpIHdyaXRlbChDVFJMV09SRCxkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKQorCisvKiAjZGVmaW5lIFJSNzE0NihSRUdBUkRTKQorICAgIHJlYWRsKCh1aW50MzJfdCkoZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkpICovCisjZGVmaW5lIFJSNzE0NihSRUdBUkRTKQkJcmVhZGwoZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkKKworI2RlZmluZSBCVUdGSVhfU1RSRUcoUkVHQURSUykgICAoIFJFR0FEUlMgLSA0ICkKKworLy8gV3JpdGUgYSB0aW1lIHNsb3QgY29udHJvbCByZWNvcmQgdG8gVFNMMi4KKyNkZWZpbmUgVkVDVFBPUlQoIFZFQ1ROVU0gKQkJKFBfVFNMMiArICggKFZFQ1ROVU0pIDw8IDIgKSkKKyNkZWZpbmUgU0VUVkVDVCggVkVDVE5VTSwgVkVDVFZBTCApCVdSNzE0NihWRUNUUE9SVCggVkVDVE5VTSApLCAoVkVDVFZBTCkpCisKKy8vIENvZGUgbWFjcm9zIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBJMkMgY29tbWFuZCBieXRlcy4KKyNkZWZpbmUgSTJDX0IyKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDYgKSB8ICggKFZBTCkgPDwgMjQgKSApCisjZGVmaW5lIEkyQ19CMShBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCA0ICkgfCAoIChWQUwpIDw8IDE2ICkgKQorI2RlZmluZSBJMkNfQjAoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgMiApIHwgKCAoVkFMKSA8PCAgOCApICkKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgczYyNl9yYW5nZV90YWJsZSA9IHsgMiwgeworCQkJUkFOR0UoLTUsIDUpLAorCQkJUkFOR0UoLTEwLCAxMCksCisJfQorfTsKKworc3RhdGljIGludCBzNjI2X2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisvKiAgIHVpbnQ4X3QJUG9sbExpc3Q7ICovCisvKiAgIHVpbnQxNl90CUFkY0RhdGE7ICovCisvKiAgIHVpbnQxNl90CVN0YXJ0VmFsOyAqLworLyogICB1aW50MTZfdAlpbmRleDsgKi8KKy8qICAgdW5zaWduZWQgaW50IGRhdGFbMTZdOyAqLworCWludCByZXN1bHQ7CisJaW50IGk7CisJaW50IHJldDsKKwlyZXNvdXJjZV9zaXplX3QgcmVzb3VyY2VTdGFydDsKKwlkbWFfYWRkcl90IGFwcGRtYTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YoczYyNl9wcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUzYyNiwgUENJX0RFVklDRV9JRF9TNjI2LAorCQkJTlVMTCk7IHBkZXYgIT0gTlVMTDsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUzYyNiwKKwkJCVBDSV9ERVZJQ0VfSURfUzYyNiwgcGRldikpIHsKKwkJaWYgKGl0LT5vcHRpb25zWzBdIHx8IGl0LT5vcHRpb25zWzFdKSB7CisJCQlpZiAocGRldi0+YnVzLT5udW1iZXIgPT0gaXQtPm9wdGlvbnNbMF0gJiYKKwkJCQlQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQkvKiBtYXRjaGVzIHJlcXVlc3RlZCBidXMvc2xvdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogbm8gYnVzL3Nsb3Qgc3BlY2lmaWVkICovCisJCQlicmVhazsKKwkJfQorCX0KKwlkZXZwcml2LT5wZGV2ID0gcGRldjsKKworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJzNjI2X2F0dGFjaDogQm9hcmQgbm90IHByZXNlbnQhISFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJlc3VsdCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBkZXYsICJzNjI2IikpIDwgMCkgeworCQlwcmludGsoInM2MjZfYXR0YWNoOiBjb21lZGlfcGNpX2VuYWJsZSBmYWlsc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZwcml2LT5nb3RfcmVnaW9ucyA9IDE7CisKKwlyZXNvdXJjZVN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnByaXYtPnBkZXYsIDApOworCisJZGV2cHJpdi0+YmFzZV9hZGRyID0gaW9yZW1hcChyZXNvdXJjZVN0YXJ0LCBTSVpFT0ZfQUREUkVTU19TUEFDRSk7CisJaWYgKGRldnByaXYtPmJhc2VfYWRkciA9PSBOVUxMKSB7CisJCXByaW50aygiczYyNl9hdHRhY2g6IElPUkVNQVAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGRldnByaXYtPmJhc2VfYWRkcikgeworCQkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCQl3cml0ZWwoMCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJCS8vc29mdCByZXNldAorCQl3cml0ZWwoTUMxX1NPRlRfUkVTRVQsIGRldnByaXYtPmJhc2VfYWRkciArIFBfTUMxKTsKKworCQkvL0RNQSBGSVhNRSBETUEvLworCQlERUJVRygiczYyNl9hdHRhY2g6IERNQSBBTExPQ0FUSU9OXG4iKTsKKworCQkvL2FkYyBidWZmZXIgYWxsb2NhdGlvbgorCQlkZXZwcml2LT5hbGxvY2F0ZWRCdWYgPSAwOworCisJCWlmICgoZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBETUFCVUZfU0laRSwKKwkJCQkJJmFwcGRtYSkpID09IE5VTEwpIHsKKwkJCXByaW50aygiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgPSBhcHBkbWE7CisKKwkJREVCVUcoInM2MjZfYXR0YWNoOiBBbGxvY0RNQUIgQURDIExvZ2ljYWw9JXAsIGJzaXplPSVkLCBQaHlzaWNhbD0weCV4XG4iLCBkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UsIERNQUJVRl9TSVpFLCAodWludDMyX3QpIGRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UpOworCisJCWRldnByaXYtPmFsbG9jYXRlZEJ1ZisrOworCisJCWlmICgoZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBETUFCVUZfU0laRSwKKwkJCQkJJmFwcGRtYSkpID09IE5VTEwpIHsKKwkJCXByaW50aygiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UgPSBhcHBkbWE7CisKKwkJREVCVUcoInM2MjZfYXR0YWNoOiBBbGxvY0RNQUIgUlBTIExvZ2ljYWw9JXAsIGJzaXplPSVkLCBQaHlzaWNhbD0weCV4XG4iLCBkZXZwcml2LT5SUFNCdWYuTG9naWNhbEJhc2UsIERNQUJVRl9TSVpFLCAodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UpOworCisJCWRldnByaXYtPmFsbG9jYXRlZEJ1ZisrOworCisJfQorCisJZGV2LT5ib2FyZF9wdHIgPSBzNjI2X2JvYXJkczsKKwlkZXYtPmJvYXJkX25hbWUgPSB0aGlzYm9hcmQtPm5hbWU7CisKKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDYpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmlvYmFzZSA9ICh1bnNpZ25lZCBsb25nKWRldnByaXYtPmJhc2VfYWRkcjsKKwlkZXYtPmlycSA9IGRldnByaXYtPnBkZXYtPmlycTsKKworCS8vc2V0IHVwIGludGVycnVwdCBoYW5kbGVyCisJaWYgKGRldi0+aXJxID09IDApIHsKKwkJcHJpbnRrKCIgdW5rbm93biBpcnEgKGJhZClcbiIpOworCX0gZWxzZSB7CisJCWlmICgocmV0ID0gY29tZWRpX3JlcXVlc3RfaXJxKGRldi0+aXJxLCBzNjI2X2lycV9oYW5kbGVyLAorCQkJCQlJUlFGX1NIQVJFRCwgInM2MjYiLCBkZXYpKSA8IDApIHsKKwkJCXByaW50aygiIGlycSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJCWRldi0+aXJxID0gMDsKKwkJfQorCX0KKworCURFQlVHKCJzNjI2X2F0dGFjaDogLS0gaXQgb3B0cyAgJWQsJWQgLS0gXG4iLAorCQlpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIHdlIHN1cHBvcnQgc2luZ2xlLWVuZGVkIChncm91bmQpIGFuZCBkaWZmZXJlbnRpYWwgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0RJRkYgfCBTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haV9jaGFuczsKKwlzLT5tYXhkYXRhID0gKDB4ZmZmZiA+PiAyKTsKKwlzLT5yYW5nZV90YWJsZSA9ICZzNjI2X3JhbmdlX3RhYmxlOworCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNib2FyZC0+YWlfY2hhbnM7CS8qIFRoaXMgaXMgdGhlIG1heGltdW0gY2hhbmxpc3QKKwkJCQkJCSAgIGxlbmd0aCB0aGF0IHRoZSBib2FyZCBjYW4KKwkJCQkJCSAgIGhhbmRsZSAqLworCXMtPmluc25fY29uZmlnID0gczYyNl9haV9pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX3JlYWQgPSBzNjI2X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWQgPSBzNjI2X2FpX2NtZDsKKwlzLT5kb19jbWR0ZXN0ID0gczYyNl9haV9jbWR0ZXN0OworCXMtPmNhbmNlbCA9IHM2MjZfYWlfY2FuY2VsOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW9fY2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgweDNmZmYpOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKKwlzLT5pbnNuX3dyaXRlID0gczYyNl9hb193aW5zbjsKKwlzLT5pbnNuX3JlYWQgPSBzNjI2X2FvX3JpbnNuOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJLyogZGlnaXRhbCBJL08gc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gUzYyNl9ESU9fQ0hBTk5FTFM7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+aW9fYml0cyA9IDB4ZmZmZjsKKwlzLT5wcml2YXRlID0gJmRpb19wcml2YXRlX0E7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZGlvX2luc25fY29uZmlnOworCXMtPmluc25fYml0cyA9IHM2MjZfZGlvX2luc25fYml0czsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCS8qIGRpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDE2OworCXMtPm1heGRhdGEgPSAxOworCXMtPmlvX2JpdHMgPSAweGZmZmY7CisJcy0+cHJpdmF0ZSA9ICZkaW9fcHJpdmF0ZV9COworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2Rpb19pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX2JpdHMgPSBzNjI2X2Rpb19pbnNuX2JpdHM7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgNDsKKwkvKiBkaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSAxNjsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5pb19iaXRzID0gMHhmZmZmOworCXMtPnByaXZhdGUgPSAmZGlvX3ByaXZhdGVfQzsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fY29uZmlnID0gczYyNl9kaW9faW5zbl9jb25maWc7CisJcy0+aW5zbl9iaXRzID0gczYyNl9kaW9faW5zbl9iaXRzOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDU7CisJLyogZW5jb2RlciAoY291bnRlcikgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFIHwgU0RGX0xTQU1QTDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmVuY19jaGFuczsKKwlzLT5wcml2YXRlID0gZW5jX3ByaXZhdGVfZGF0YTsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZW5jX2luc25fY29uZmlnOworCXMtPmluc25fcmVhZCA9IHM2MjZfZW5jX2luc25fcmVhZDsKKwlzLT5pbnNuX3dyaXRlID0gczYyNl9lbmNfaW5zbl93cml0ZTsKKwlzLT5tYXhkYXRhID0gMHhmZmZmZmY7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKworCS8vc3RvcCBhaV9jb21tYW5kCisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJaWYgKGRldnByaXYtPmJhc2VfYWRkciAmJiAoZGV2cHJpdi0+YWxsb2NhdGVkQnVmID09IDIpKSB7CisJCWRtYV9hZGRyX3QgcFBoeXNCdWY7CisJCXVpbnQxNl90IGNoYW47CisKKwkJLy8gZW5hYiBERUJJIGFuZCBhdWRpbyBwaW5zLCBlbmFibGUgSTJDIGludGVyZmFjZS4KKwkJTUNfRU5BQkxFKFBfTUMxLCBNQzFfREVCSSB8IE1DMV9BVURJTyB8IE1DMV9JMkMpOworCQkvLyBDb25maWd1cmUgREVCSSBvcGVyYXRpbmcgbW9kZS4KKwkJV1I3MTQ2KFBfREVCSUNGRywgREVCSV9DRkdfU0xBVkUxNgkvLyBMb2NhbCBidXMgaXMgMTYKKwkJCS8vIGJpdHMgd2lkZS4KKwkJCXwgKERFQklfVE9VVCA8PCBERUJJX0NGR19UT1VUX0JJVCkJLy8gRGVjbGFyZSBERUJJCisJCQkvLyB0cmFuc2ZlciB0aW1lb3V0CisJCQkvLyBpbnRlcnZhbC4KKwkJCXwgREVCSV9TV0FQCS8vIFNldCB1cCBieXRlIGxhbmUKKwkJCS8vIHN0ZWVyaW5nLgorCQkJfCBERUJJX0NGR19JTlRFTCk7CS8vIEludGVsLWNvbXBhdGlibGUKKwkJLy8gbG9jYWwgYnVzIChERUJJCisJCS8vIG5ldmVyIHRpbWVzIG91dCkuCisJCURFQlVHKCJzNjI2X2F0dGFjaDogJWQgZGViaSBpbml0IC0tICVkXG4iLAorCQkJREVCSV9DRkdfU0xBVkUxNiB8IChERUJJX1RPVVQgPDwgREVCSV9DRkdfVE9VVF9CSVQpIHwKKwkJCURFQklfU1dBUCB8IERFQklfQ0ZHX0lOVEVMLAorCQkJREVCSV9DRkdfSU5URUwgfCBERUJJX0NGR19UT1EgfCBERUJJX0NGR19JTkNRIHwKKwkJCURFQklfQ0ZHXzE2USk7CisKKwkJLy9ERUJJIElOSVQgUzYyNiBXUjcxNDYoIFBfREVCSUNGRywgREVCSV9DRkdfSU5URUwgfCBERUJJX0NGR19UT1EKKwkJLy98IERFQklfQ0ZHX0lOQ1F8IERFQklfQ0ZHXzE2USk7IC8vZW5kCisKKwkJLy8gUGFnaW5nIGlzIGRpc2FibGVkLgorCQlXUjcxNDYoUF9ERUJJUEFHRSwgREVCSV9QQUdFX0RJU0FCTEUpOwkvLyBEaXNhYmxlIE1NVSBwYWdpbmcuCisKKwkJLy8gSW5pdCBHUElPIHNvIHRoYXQgQURDIFN0YXJ0KiBpcyBuZWdhdGVkLgorCQlXUjcxNDYoUF9HUElPLCBHUElPX0JBU0UgfCBHUElPMV9ISSk7CisKKwkJLy9Jc0JvYXJkUmV2QSBpcyBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9hcmQgaXMKKwkJLy9SZXZBLgorCisJCS8vIFZFUlNJT04gMi4wMSBDSEFOR0U6IFJFViBBICYgQiBCT0FSRFMgTk9XIFNVUFBPUlRFRCBCWSBEWU5BTUlDCisJCS8vIEVFUFJPTSBBRERSRVNTIFNFTEVDVElPTi4gIEluaXRpYWxpemUgdGhlIEkyQyBpbnRlcmZhY2UsIHdoaWNoCisJCS8vIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBvbmJvYXJkIHNlcmlhbCBFRVBST00uICBUaGUgRUVQUk9NJ3MgSTJDCisJCS8vIERldmljZUFkZHJlc3MgaXMgaGFyZHdpcmVkIHRvIGEgdmFsdWUgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlCisJCS8vIDYyNiBib2FyZCByZXZpc2lvbi4gIE9uIGFsbCBib2FyZCByZXZpc2lvbnMsIHRoZSBFRVBST00gc3RvcmVzCisJCS8vIFRyaW1EQUMgY2FsaWJyYXRpb24gY29uc3RhbnRzIGZvciBhbmFsb2cgSS9PLiAgT24gUmV2QiBhbmQKKwkJLy8gaGlnaGVyIGJvYXJkcywgdGhlIERldmljZUFkZHJlc3MgaXMgaGFyZHdpcmVkIHRvIDAgdG8gZW5hYmxlCisJCS8vIHRoZSBFRVBST00gdG8gYWxzbyBzdG9yZSB0aGUgUENJIFN1YlZlbmRvcklEIGFuZCBTdWJEZXZpY2VJRDsKKwkJLy8gdGhpcyBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgU0FBNzE0NiBleHBlY3RzIGEKKwkJLy8gY29uZmlndXJhdGlvbiBFRVBST00gdG8gcmVzaWRlLiAgT24gUmV2QSBib2FyZHMsIHRoZSBFRVBST00KKwkJLy8gZGV2aWNlIGFkZHJlc3MsIHdoaWNoIGlzIGhhcmR3aXJlZCB0byA0LCBwcmV2ZW50cyB0aGUgU0FBNzE0NgorCQkvLyBmcm9tIHJldHJpZXZpbmcgUENJIHN1Yi1JRHMsIHNvIHRoZSBTQUE3MTQ2IHVzZXMgaXRzIGJ1aWx0LWluCisJCS8vIGRlZmF1bHQgdmFsdWVzLCBpbnN0ZWFkLgorCisJCS8vICAgIGRldnByaXYtPkkyQ2FyZHM9IElzQm9hcmRSZXZBID8gMHhBOCA6IDB4QTA7IC8vIFNldCBJMkMgRUVQUk9NCisJCS8vIERldmljZVR5cGUgKDB4QTApCisJCS8vIGFuZCBEZXZpY2VBZGRyZXNzPDwxLgorCisJCWRldnByaXYtPkkyQ0FkcnMgPSAweEEwOwkvLyBJMkMgZGV2aWNlIGFkZHJlc3MgZm9yIG9uYm9hcmQKKwkJLy8gZWVwcm9tKHJldmIpCisKKwkJLy8gSXNzdWUgYW4gSTJDIEFCT1JUIGNvbW1hbmQgdG8gaGFsdCBhbnkgSTJDIG9wZXJhdGlvbiBpbgorCQkvL3Byb2dyZXNzIGFuZCByZXNldCBCVVNZIGZsYWcuCisJCVdSNzE0NihQX0kyQ1NUQVQsIEkyQ19DTEtTRUwgfCBJMkNfQUJPUlQpOwkvLyBXcml0ZSBJMkMgY29udHJvbDoKKwkJLy8gYWJvcnQgYW55IEkyQworCQkvLyBhY3Rpdml0eS4KKwkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9JSUMpOwkvLyBJbnZva2UgY29tbWFuZAorCQkvLyB1cGxvYWQKKwkJd2hpbGUgKChSUjcxNDYoUF9NQzIpICYgTUMyX1VQTERfSUlDKSA9PSAwKSA7CS8vIGFuZCB3YWl0IGZvcgorCQkvLyB1cGxvYWQgdG8KKwkJLy8gY29tcGxldGUuCisKKwkJLy8gUGVyIFNBQTcxNDYgZGF0YSBzaGVldCwgd3JpdGUgdG8gU1RBVFVTIHJlZyB0d2ljZSB0byByZXNldCBhbGwKKwkJLy8gSTJDIGVycm9yIGZsYWdzLgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlXUjcxNDYoUF9JMkNTVEFULCBJMkNfQ0xLU0VMKTsJLy8gV3JpdGUgSTJDIGNvbnRyb2w6IHJlc2V0CisJCQkvLyBlcnJvciBmbGFncy4KKwkJCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfSUlDKTsJLy8gSW52b2tlIGNvbW1hbmQgdXBsb2FkCisJCQl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0lJQykpIDsJLy8gICBhbmQgd2FpdCBmb3IKKwkJCS8vICAgdXBsb2FkIHRvCisJCQkvLyAgIGNvbXBsZXRlLgorCQl9CisKKwkJLy8gSW5pdCBhdWRpbyBpbnRlcmZhY2UgZnVuY3Rpb25hbCBhdHRyaWJ1dGVzOiBzZXQgREFDL0FEQyBzZXJpYWwKKwkJLy8gY2xvY2sgcmF0ZXMsIGludmVydCBEQUMgc2VyaWFsIGNsb2NrIHNvIHRoYXQgREFDIGRhdGEgc2V0dXAKKwkJLy8gdGltZXMgYXJlIHNhdGlzZmllZCwgZW5hYmxlIERBQyBzZXJpYWwgY2xvY2sgb3V0LgorCQlXUjcxNDYoUF9BQ09OMiwgQUNPTjJfSU5JVCk7CisKKwkJLy8gU2V0IHVwIFRTTDEgc2xvdCBsaXN0LCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlCisJCS8vIGFjY3VtdWxhdGlvbiBvZiBBREMgZGF0YTogUlNEMSA9IHNoaWZ0IGRhdGEgaW4gb24gU0QxLiAgU0lCX0ExCisJCS8vID0gc3RvcmUgZGF0YSB1aW50OF90IGF0IG5leHQgYXZhaWxhYmxlIGxvY2F0aW9uIGluIEZCIEJVRkZFUjEKKwkJLy8gcmVnaXN0ZXIuCisJCVdSNzE0NihQX1RTTDEsIFJTRDEgfCBTSUJfQTEpOwkvLyBGZXRjaCBBREMgaGlnaCBkYXRhCisJCS8vIHVpbnQ4X3QuCisJCVdSNzE0NihQX1RTTDEgKyA0LCBSU0QxIHwgU0lCX0ExIHwgRU9TKTsJLy8gRmV0Y2ggQURDIGxvdyBkYXRhCisJCS8vIHVpbnQ4X3Q7IGVuZCBvZgorCQkvLyBUU0wxLgorCisJCS8vIGVuYWIgVFNMMSBzbG90IGxpc3Qgc28gdGhhdCBpdCBleGVjdXRlcyBhbGwgdGhlIHRpbWUuCisJCVdSNzE0NihQX0FDT04xLCBBQ09OMV9BRENTVEFSVCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBSUFMgcmVnaXN0ZXJzIHVzZWQgZm9yIEFEQy4KKworCQkvL1BoeXNpY2FsIHN0YXJ0IG9mIFJQUyBwcm9ncmFtLgorCQlXUjcxNDYoUF9SUFNBRERSMSwgKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlKTsKKworCQlXUjcxNDYoUF9SUFNQQUdFMSwgMCk7CS8vIFJQUyBwcm9ncmFtIHBlcmZvcm1zIG5vCisJCS8vIGV4cGxpY2l0IG1lbSB3cml0ZXMuCisJCVdSNzE0NihQX1JQUzFfVE9VVCwgMCk7CS8vIERpc2FibGUgUlBTIHRpbWVvdXRzLgorCisJCS8vIFNBQTcxNDYgQlVHIFdPUktBUk9VTkQuICBJbml0aWFsaXplIFNBQTcxNDYgQURDIGludGVyZmFjZSB0byBhCisJCS8vIGtub3duIHN0YXRlIGJ5IGludm9raW5nIEFEQ3MgdW50aWwgRkIgQlVGRkVSIDEgcmVnaXN0ZXIgc2hvd3MKKwkJLy8gdGhhdCBpdCBpcyBjb3JyZWN0bHkgcmVjZWl2aW5nIEFEQyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkJLy8gYmVjYXVzZSB0aGUgU0FBNzE0NiBBREMgaW50ZXJmYWNlIGRvZXMgbm90IHN0YXJ0IHVwIGluIGEKKwkJLy8gZGVmaW5lZCBzdGF0ZSBhZnRlciBhIFBDSSByZXNldC4KKworLyogICAgIFBvbGxMaXN0ID0gRU9QTDsJCQkvLyBDcmVhdGUgYSBzaW1wbGUgcG9sbGluZyAqLworLyogCQkJCQkvLyBsaXN0IGZvciBhbmFsb2cgaW5wdXQgKi8KKy8qIAkJCQkJLy8gY2hhbm5lbCAwLiAqLworLyogICAgIFJlc2V0QURDKCBkZXYsICZQb2xsTGlzdCApOyAqLworCisvKiAgICAgczYyNl9haV9yaW5zbihkZXYsZGV2LT5zdWJkZXZpY2VzLE5VTEwsZGF0YSk7IC8vKCAmQWRjRGF0YSApOyAvLyAqLworLyogCQkJCQkJICAvL0dldCBpbml0aWFsIEFEQyAqLworLyogCQkJCQkJICAvL3ZhbHVlLiAqLworCisvKiAgICAgU3RhcnRWYWwgPSBkYXRhWzBdOyAqLworCisvKiAgICAgLy8gVkVSU0lPTiAyLjAxIENIQU5HRTogVElNRU9VVCBBRERFRCBUTyBQUkVWRU5UIEhBTkdFRCBFWEVDVVRJT04uICovCisvKiAgICAgLy8gSW52b2tlIEFEQ3MgdW50aWwgdGhlIG5ldyBBREMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBpbml0aWFsICovCisvKiAgICAgLy8gdmFsdWUgb3IgYSB0aW1lb3V0IG9jY3Vycy4gIFRoZSB0aW1lb3V0IHByb3RlY3RzIGFnYWluc3QgdGhlICovCisvKiAgICAgLy8gcG9zc2liaWxpdHkgdGhhdCB0aGUgZHJpdmVyIGlzIHJlc3RhcnRpbmcgYW5kIHRoZSBBREMgZGF0YSBpcyBhICovCisvKiAgICAgLy8gZml4ZWQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFwcGxpZWQgQURDIGFuYWxvZyBpbnB1dCBiZWluZyAqLworLyogICAgIC8vIHVudXN1YWxseSBxdWlldCBvciBhdCB0aGUgcmFpbC4gKi8KKworLyogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCA1MDA7IGluZGV4KysgKSAqLworLyogICAgICAgeyAqLworLyogCXM2MjZfYWlfcmluc24oZGV2LGRldi0+c3ViZGV2aWNlcyxOVUxMLGRhdGEpOyAqLworLyogCUFkY0RhdGEgPSBkYXRhWzBdOwkvL1JlYWRBREMoICAmQWRjRGF0YSApOyAqLworLyogCWlmICggQWRjRGF0YSAhPSBTdGFydFZhbCApICovCisvKiAJICBicmVhazsgKi8KKy8qICAgICAgIH0gKi8KKworCQkvLyBlbmQgaW5pdEFEQworCisJCS8vIGluaXQgdGhlIERBQyBpbnRlcmZhY2UKKworCQkvLyBJbml0IEF1ZGlvMidzIG91dHB1dCBETUFDIGF0dHJpYnV0ZXM6IGJ1cnN0IGxlbmd0aCA9IDEgRFdPUkQsCisJCS8vIHRocmVzaG9sZCA9IDEgRFdPUkQuCisJCVdSNzE0NihQX1BDSV9CVF9BLCAwKTsKKworCQkvLyBJbml0IEF1ZGlvMidzIG91dHB1dCBETUEgcGh5c2ljYWwgYWRkcmVzc2VzLiAgVGhlIHByb3RlY3Rpb24KKwkJLy8gYWRkcmVzcyBpcyBzZXQgdG8gMSBEV09SRCBwYXN0IHRoZSBiYXNlIGFkZHJlc3Mgc28gdGhhdCBhCisJCS8vIHNpbmdsZSBEV09SRCB3aWxsIGJlIHRyYW5zZmVycmVkIGVhY2ggdGltZSBhIERNQSB0cmFuc2ZlciBpcworCQkvLyBlbmFibGVkLgorCisJCXBQaHlzQnVmID0KKwkJCWRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgKworCQkJKERBQ19XRE1BQlVGX09TICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkJV1I3MTQ2KFBfQkFTRUEyX09VVCwgKHVpbnQzMl90KSBwUGh5c0J1Zik7CS8vIEJ1ZmZlciBiYXNlIGFkcnMuCisJCVdSNzE0NihQX1BST1RBMl9PVVQsICh1aW50MzJfdCkgKHBQaHlzQnVmICsgc2l6ZW9mKHVpbnQzMl90KSkpOwkvLyBQcm90ZWN0aW9uIGFkZHJlc3MuCisKKwkJLy8gQ2FjaGUgQXVkaW8yJ3Mgb3V0cHV0IERNQSBidWZmZXIgbG9naWNhbCBhZGRyZXNzLiAgVGhpcyBpcworCQkvLyB3aGVyZSBEQUMgZGF0YSBpcyBidWZmZXJlZCBmb3IgQTIgb3V0cHV0IERNQSB0cmFuc2ZlcnMuCisJCWRldnByaXYtPnBEYWNXQnVmID0KKwkJCSh1aW50MzJfdCAqKSBkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgKworCQkJREFDX1dETUFCVUZfT1M7CisKKwkJLy8gQXVkaW8yJ3Mgb3V0cHV0IGNoYW5uZWxzIGRvZXMgbm90IHVzZSBwYWdpbmcuICBUaGUgcHJvdGVjdGlvbgorCQkvLyB2aW9sYXRpb24gaGFuZGxpbmcgYml0IGlzIHNldCBzbyB0aGF0IHRoZSBETUFDIHdpbGwKKwkJLy8gYXV0b21hdGljYWxseSBoYWx0IGFuZCBpdHMgUENJIGFkZHJlc3MgcG9pbnRlciB3aWxsIGJlIHJlc2V0CisJCS8vIHdoZW4gdGhlIHByb3RlY3Rpb24gYWRkcmVzcyBpcyByZWFjaGVkLgorCQlXUjcxNDYoUF9QQUdFQTJfT1VULCA4KTsKKworCQkvLyBJbml0aWFsaXplIHRpbWUgc2xvdCBsaXN0IDIgKFRTTDIpLCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wKKwkJLy8gdGhlIGNsb2NrIGdlbmVyYXRpb24gZm9yIGFuZCBzZXJpYWxpemF0aW9uIG9mIGRhdGEgdG8gYmUgc2VudAorCQkvLyB0byB0aGUgREFDIGRldmljZXMuICBTbG90IDAgaXMgYSBOT1AgdGhhdCBpcyB1c2VkIHRvIHRyYXAgVFNMCisJCS8vIGV4ZWN1dGlvbjsgdGhpcyBwZXJtaXRzIG90aGVyIHNsb3RzIHRvIGJlIHNhZmVseSBtb2RpZmllZAorCQkvLyB3aXRob3V0IGZpcnN0IHR1cm5pbmcgb2ZmIHRoZSBUU0wgc2VxdWVuY2VyICh3aGljaCBpcworCQkvLyBhcHBhcmVudGx5IGltcG9zc2libGUgdG8gZG8pLiAgQWxzbywgU0QzICh3aGljaCBpcyBkcml2ZW4gYnkgYQorCQkvLyBwdWxsLXVwIHJlc2lzdG9yKSBpcyBzaGlmdGVkIGluIGFuZCBzdG9yZWQgdG8gdGhlIE1TQiBvZgorCQkvLyBGQl9CVUZGRVIyIHRvIGJlIHVzZWQgYXMgZXZpZGVuY2UgdGhhdCB0aGUgc2xvdCBzZXF1ZW5jZSBoYXMKKwkJLy8gbm90IHlldCBmaW5pc2hlZCBleGVjdXRpbmcuCisJCVNFVFZFQ1QoMCwgWFNEMiB8IFJTRDMgfCBTSUJfQTIgfCBFT1MpOwkvLyBTbG90IDA6IFRyYXAgVFNMCisJCS8vIGV4ZWN1dGlvbiwgc2hpZnQgMHhGRgorCQkvLyBpbnRvIEZCX0JVRkZFUjIuCisKKwkJLy8gSW5pdGlhbGl6ZSBzbG90IDEsIHdoaWNoIGlzIGNvbnN0YW50LiAgU2xvdCAxIGNhdXNlcyBhIERXT1JEIHRvCisJCS8vIGJlIHRyYW5zZmVycmVkIGZyb20gYXVkaW8gY2hhbm5lbCAyJ3Mgb3V0cHV0IEZJRk8gdG8gdGhlIEZJRk8ncworCQkvLyBvdXRwdXQgYnVmZmVyIHNvIHRoYXQgaXQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIHNlbnQgdG8gdGhlIERBQworCQkvLyBkdXJpbmcgc3Vic2VxdWVudCBzbG90cy4gIEFsbCByZW1haW5pbmcgc2xvdHMgYXJlIGR5bmFtaWNhbGx5CisJCS8vIHBvcHVsYXRlZCBhcyByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IERBQyBkZXZpY2UuCisJCVNFVFZFQ1QoMSwgTEZfQTIpOwkvLyBTbG90IDE6IEZldGNoIERXT1JEIGZyb20gQXVkaW8yJ3MKKwkJLy8gb3V0cHV0IEZJRk8uCisKKwkJLy8gU3RhcnQgREFDJ3MgYXVkaW8gaW50ZXJmYWNlIChUU0wyKSBydW5uaW5nLgorCQlXUjcxNDYoUF9BQ09OMSwgQUNPTjFfREFDU1RBUlQpOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJLy8gZW5kIGluaXQgREFDIGludGVyZmFjZQorCisJCS8vIEluaXQgVHJpbSBEQUNzIHRvIGNhbGlicmF0ZWQgdmFsdWVzLiAgRG8gaXQgdHdpY2UgYmVjYXVzZSB0aGUKKwkJLy8gU0FBNzE0NiBhdWRpbyBjaGFubmVsIGRvZXMgbm90IGFsd2F5cyByZXNldCBwcm9wZXJseSBhbmQKKwkJLy8gc29tZXRpbWVzIGNhdXNlcyB0aGUgZmlyc3QgZmV3IFRyaW1EQUMgd3JpdGVzIHRvIG1hbGZ1bmN0aW9uLgorCisJCUxvYWRUcmltREFDcyhkZXYpOworCQlMb2FkVHJpbURBQ3MoZGV2KTsJLy8gSW5zdXJhbmNlLgorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBNYW51YWxseSBpbml0IGFsbCBnYXRlIGFycmF5IGhhcmR3YXJlIGluIGNhc2UgdGhpcyBpcyBhIHNvZnQKKwkJLy8gcmVzZXQgKHdlIGhhdmUgbm8gd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgdGhpcyBpcyBhIHdhcm0gb3IKKwkJLy8gY29sZCBzdGFydCkuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBnYXRlIGFycmF5IHdpbGwKKwkJLy8gcmVzZXQgb25seSBpbiByZXNwb25zZSB0byBhIFBDSSBoYXJkIHJlc2V0OyB0aGVyZSBpcyBubyBzb2Z0CisJCS8vIHJlc2V0IGZ1bmN0aW9uLgorCisJCS8vIEluaXQgYWxsIERBQyBvdXRwdXRzIHRvIDBWIGFuZCBpbml0IGFsbCBEQUMgc2V0cG9pbnQgYW5kCisJCS8vIHBvbGFyaXR5IGltYWdlcy4KKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfREFDX0NIQU5ORUxTOyBjaGFuKyspCisJCQlTZXREQUMoZGV2LCBjaGFuLCAwKTsKKworCQkvLyBJbml0IGltYWdlIG9mIFdSTUlTQzIgQmF0dGVyeSBDaGFyZ2VyIEVuYWJsZWQgY29udHJvbCBiaXQuCisJCS8vIFRoaXMgaW1hZ2UgaXMgdXNlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgY2hhcmdlciBjb250cm9sIGJpdCwKKwkJLy8gd2hpY2ggaGFzIG5vIGRpcmVjdCBoYXJkd2FyZSByZWFkYmFjayBtZWNoYW5pc20sIGlzIHF1ZXJpZWQuCisJCWRldnByaXYtPkNoYXJnZUVuYWJsZWQgPSAwOworCisJCS8vIEluaXQgaW1hZ2Ugb2Ygd2F0Y2hkb2cgdGltZXIgaW50ZXJ2YWwgaW4gV1JNSVNDMi4gIFRoaXMgaW1hZ2UKKwkJLy8gbWFpbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBiaXRzIG9mIE1JU0MyIGFyZQorCQkvLyBjb250aW51b3VzbHkgcmVzZXQgdG8gemVybyBhcyBsb25nIGFzIHRoZSBXRCB0aW1lciBpcyBkaXNhYmxlZC4KKwkJZGV2cHJpdi0+V0RJbnRlcnZhbCA9IDA7CisKKwkJLy8gSW5pdCBDb3VudGVyIEludGVycnVwdCBlbmFiIG1hc2sgZm9yIFJETUlTQzIuICBUaGlzIG1hc2sgaXMKKwkJLy8gYXBwbGllZCBhZ2FpbnN0IE1JU0MyIHdoZW4gdGVzdGluZyB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIKKwkJLy8gZXZlbnRzIGFyZSByZXF1ZXN0aW5nIGludGVycnVwdCBzZXJ2aWNlLgorCQlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgPSAwOworCisJCS8vIEluaXQgY291bnRlcnMuCisJCUNvdW50ZXJzSW5pdChkZXYpOworCisJCS8vIFdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBzdGF0ZSBvZiB0aGUgQmF0dGVyeSBCYWNrdXAgZW5hYiwgZGlzYWJsZQorCQkvLyB0aGUgd2F0Y2hkb2cgdGltZXIsIHNldCBESU8gY2hhbm5lbHMgMC01IHRvIG9wZXJhdGUgaW4gdGhlCisJCS8vIHN0YW5kYXJkIERJTyAodnMuIGNvdW50ZXIgb3ZlcmZsb3cpIG1vZGUsIGRpc2FibGUgdGhlIGJhdHRlcnkKKwkJLy8gY2hhcmdlciwgYW5kIHJlc2V0IHRoZSB3YXRjaGRvZyBpbnRlcnZhbCBzZWxlY3RvciB0byB6ZXJvLgorCQlXcml0ZU1JU0MyKGRldiwgKHVpbnQxNl90KSAoREVCSXJlYWQoZGV2LAorCQkJCQlMUF9SRE1JU0MyKSAmIE1JU0MyX0JBVFRfRU5BQkxFKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgZGlnaXRhbCBJL08gc3Vic3lzdGVtLgorCQlzNjI2X2Rpb19pbml0KGRldik7CisKKwkJLy9lbmFibGUgaW50ZXJydXB0IHRlc3QKKwkJLy8gd3JpdGVsKElSUV9HUElPMyB8IElSUV9SUFMxLGRldnByaXYtPmJhc2VfYWRkcitQX0lFUik7CisJfQorCisJREVCVUcoInM2MjZfYXR0YWNoOiBjb21lZGklZCBzNjI2IGF0dGFjaGVkICUwNHhcbiIsIGRldi0+bWlub3IsCisJCSh1aW50MzJfdCkgZGV2cHJpdi0+YmFzZV9hZGRyKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgbHNhbXBsX3QgczYyNl9haV9yZWdfdG9fdWludChpbnQgZGF0YSkKK3sKKwlsc2FtcGxfdCB0ZW1wZGF0YTsKKworCXRlbXBkYXRhID0gKGRhdGEgPj4gMTgpOworCWlmICh0ZW1wZGF0YSAmIDB4MjAwMCkKKwkJdGVtcGRhdGEgJj0gMHgxZmZmOworCWVsc2UKKwkJdGVtcGRhdGEgKz0gKDEgPDwgMTMpOworCisJcmV0dXJuIHRlbXBkYXRhOworfQorCisvKiBzdGF0aWMgbHNhbXBsX3QgczYyNl91aW50X3RvX3JlZyhjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgZGF0YSl7ICovCisvKiAgIHJldHVybiAwOyAqLworLyogfSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgczYyNl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfY21kICpjbWQ7CisJZW5jX3ByaXZhdGUgKms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQzMl90ICpyZWFkYWRkcjsKKwl1aW50MzJfdCBpcnF0eXBlLCBpcnFzdGF0dXM7CisJaW50IGkgPSAwOworCXNhbXBsX3QgdGVtcGRhdGE7CisJdWludDhfdCBncm91cDsKKwl1aW50MTZfdCBpcnFiaXQ7CisKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IHJlcXVlc3QgcmVjaWV2ZWQhISFcbiIpOworCisJaWYgKGRldi0+YXR0YWNoZWQgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCS8vIGxvY2sgdG8gYXZvaWQgcmFjZSB3aXRoIGNvbWVkaV9wb2xsCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvL3NhdmUgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciBzdGF0ZQorCWlycXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCS8vcmVhZCBpbnRlcnJ1cHQgdHlwZQorCWlycXR5cGUgPSByZWFkbChkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lTUik7CisKKwkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCXdyaXRlbCgwLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwkvL2NsZWFyIGludGVycnVwdAorCXdyaXRlbChpcnF0eXBlLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lTUik7CisKKwkvL2RvIHNvbWV0aGluZ3MKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IHR5cGUgJWRcbiIsIGlycXR5cGUpOworCisJc3dpdGNoIChpcnF0eXBlKSB7CisJY2FzZSBJUlFfUlBTMToJCS8vIGVuZF9vZl9zY2FuIG9jY3VycworCisJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBSUFMxIGlycSBkZXRlY3RlZFxuIik7CisKKwkJLy8gbWFuYWdlIGFpIHN1YmRldmljZQorCQlzID0gZGV2LT5zdWJkZXZpY2VzOworCQljbWQgPSAmKHMtPmFzeW5jLT5jbWQpOworCisJCS8vIEluaXQgcHRyIHRvIERNQSBidWZmZXIgdGhhdCBob2xkcyBuZXcgQURDIGRhdGEuICBXZSBza2lwIHRoZQorCQkvLyBmaXJzdCB1aW50MTZfdCBpbiB0aGUgYnVmZmVyIGJlY2F1c2UgaXQgY29udGFpbnMganVuayBkYXRhIGZyb20KKwkJLy8gdGhlIGZpbmFsIEFEQyBvZiB0aGUgcHJldmlvdXMgcG9sbCBsaXN0IHNjYW4uCisJCXJlYWRhZGRyID0gKGludDMyX3QgKikgZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlICsgMTsKKworCQkvLyBnZXQgdGhlIGRhdGEgYW5kIGhhbmQgaXQgb3ZlciB0byBjb21lZGkKKwkJZm9yIChpID0gMDsgaSA8IChzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbik7IGkrKykgeworCQkJLy8gQ29udmVydCBBREMgZGF0YSB0byAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgYW5kIGNvcHkgdG8gYXBwbGljYXRpb24KKwkJCS8vIGJ1ZmZlci4KKwkJCXRlbXBkYXRhID0gczYyNl9haV9yZWdfdG9fdWludCgoaW50KSpyZWFkYWRkcik7CisJCQlyZWFkYWRkcisrOworCisJCQkvL3B1dCBkYXRhIGludG8gcmVhZCBidWZmZXIKKwkJCS8vIGNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCB0ZW1wZGF0YSk7CisJCQlpZiAoY2ZjX3dyaXRlX3RvX2J1ZmZlcihzLCB0ZW1wZGF0YSkgPT0gMCkKKwkJCQlwcmludGsoInM2MjZfaXJxX2hhbmRsZXI6IGNmY193cml0ZV90b19idWZmZXIgZXJyb3IhXG4iKTsKKworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGFpIGNoYW5uZWwgJWQgYWNxdWlyZWQ6ICVkXG4iLAorCQkJCWksIHRlbXBkYXRhKTsKKwkJfQorCisJCS8vZW5kIG9mIHNjYW4gb2NjdXJzCisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKworCQlpZiAoIShkZXZwcml2LT5haV9jb250aW5vdXMpKQorCQkJZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50LS07CisJCWlmIChkZXZwcml2LT5haV9zYW1wbGVfY291bnQgPD0gMCkgeworCQkJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJCQkvLyBTdG9wIFJQUyBwcm9ncmFtLgorCQkJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCQkJLy9zZW5kIGVuZCBvZiBhY3F1aXNpdGlvbgorCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCisJCQkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCQkJaXJxc3RhdHVzID0gMDsKKwkJfQorCisJCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZyAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZFxuIiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJfQorCQkvLyB0ZWxsIGNvbWVkaSB0aGF0IGRhdGEgaXMgdGhlcmUKKwkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGV2ZW50cyAlZFxuIiwgcy0+YXN5bmMtPmV2ZW50cyk7CisJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQlicmVhazsKKwljYXNlIElSUV9HUElPMzoJLy9jaGVjayBkaW8gYW5kIGNvbnRlciBpbnRlcnJ1cHQKKworCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogR1BJTzMgaXJxIGRldGVjdGVkXG4iKTsKKworCQkvLyBtYW5hZ2UgYWkgc3ViZGV2aWNlCisJCXMgPSBkZXYtPnN1YmRldmljZXM7CisJCWNtZCA9ICYocy0+YXN5bmMtPmNtZCk7CisKKwkJLy9zNjI2X2Rpb19jbGVhcl9pcnEoZGV2KTsKKworCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBTNjI2X0RJT19CQU5LUzsgZ3JvdXArKykgeworCQkJaXJxYml0ID0gMDsKKwkJCS8vcmVhZCBpbnRlcnJ1cHQgdHlwZQorCQkJaXJxYml0ID0gREVCSXJlYWQoZGV2LAorCQkJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRDYXBGbGcpOworCisJCQkvL2NoZWNrIGlmIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgZnJvbSBkaW8gY2hhbm5lbHMKKwkJCWlmIChpcnFiaXQpIHsKKwkJCQlzNjI2X2Rpb19yZXNldF9pcnEoZGV2LCBncm91cCwgaXJxYml0KTsKKwkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY2hlY2sgaW50ZXJydXB0IG9uIGRpbyBncm91cCAlZCAlZFxuIiwgZ3JvdXAsIGkpOworCQkJCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykgeworCQkJCQkvL2NoZWNrIGlmIGludGVycnVwdCBpcyBhbiBhaSBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyCisJCQkJCWlmICgoaXJxYml0ID4+IChjbWQtPnN0YXJ0X2FyZyAtCisJCQkJCQkJCSgxNiAqIGdyb3VwKSkpCisJCQkJCQk9PSAxCisJCQkJCQkmJiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEVkZ2UgY2FwdHVyZSBpbnRlcnJ1cHQgcmVjaWV2ZWQgZnJvbSBjaGFubmVsICVkXG4iLCBjbWQtPnN0YXJ0X2FyZyk7CisKKwkJCQkJCS8vIFN0YXJ0IGV4ZWN1dGluZyB0aGUgUlBTIHByb2dyYW0uCisJCQkJCQlNQ19FTkFCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBhcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXJlZCEhIVxuIik7CisKKwkJCQkJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09CisJCQkJCQkJVFJJR19FWFQpIHsKKwkJCQkJCQlERUJVRygiczYyNl9haV9jbWQ6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWRcbiIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCQkJCQkJczYyNl9kaW9fc2V0X2lycShkZXYsCisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCXNjYW5fYmVnaW5fYXJnKTsKKworCQkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCBzY2FuIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoKGlycWJpdCA+PiAoY21kLT5zY2FuX2JlZ2luX2FyZyAtCisJCQkJCQkJCSgxNiAqIGdyb3VwKSkpCisJCQkJCQk9PSAxCisJCQkJCQkmJiBjbWQtPnNjYW5fYmVnaW5fc3JjID09CisJCQkJCQlUUklHX0VYVCkgeworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEVkZ2UgY2FwdHVyZSBpbnRlcnJ1cHQgcmVjaWV2ZWQgZnJvbSBjaGFubmVsICVkXG4iLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJCQkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBzY2FuIHRyaWdnZXJlZCEhISAlZFxuIiwgZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50KTsKKwkJCQkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09CisJCQkJCQkJVFJJR19FWFQpIHsKKworCQkJCQkJCURFQlVHKCJzNjI2X2FpX2NtZDogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyAtICgxNiAqIGdyb3VwKSwgZ3JvdXApOworCisJCQkJCQkJZGV2cHJpdi0+CisJCQkJCQkJCWFpX2NvbnZlcnRfY291bnQKKwkJCQkJCQkJPQorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljaGFubGlzdF9sZW47CisKKwkJCQkJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwKKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJY29udmVydF9hcmcpOworCisJCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIGNvbnZlcnQgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCQkJCQkJfQorCisJCQkJCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PQorCQkJCQkJCVRSSUdfVElNRVIpIHsKKwkJCQkJCQlrID0gJmVuY3ByaXZbNV07CisJCQkJCQkJZGV2cHJpdi0+CisJCQkJCQkJCWFpX2NvbnZlcnRfY291bnQKKwkJCQkJCQkJPQorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljaGFubGlzdF9sZW47CisJCQkJCQkJay0+U2V0RW5hYmxlKGRldiwgaywKKwkJCQkJCQkJQ0xLRU5BQl9BTFdBWVMpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICgoaXJxYml0ID4+IChjbWQtPmNvbnZlcnRfYXJnIC0KKwkJCQkJCQkJKDE2ICogZ3JvdXApKSkKKwkJCQkJCT09IDEKKwkJCQkJCSYmIGNtZC0+Y29udmVydF9zcmMgPT0KKwkJCQkJCVRSSUdfRVhUKSB7CisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRWRnZSBjYXB0dXJlIGludGVycnVwdCByZWNpZXZlZCBmcm9tIGNoYW5uZWwgJWRcbiIsIGNtZC0+Y29udmVydF9hcmcpOworCisJCQkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9BRENfUlBTKTsKKworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGFkYyBjb252ZXJ0IHRyaWdnZXJlZCEhIVxuIik7CisKKwkJCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQtLTsKKworCQkJCQkJaWYgKGRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPgorCQkJCQkJCTApIHsKKworCQkJCQkJCURFQlVHKCJzNjI2X2FpX2NtZDogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyAtICgxNiAqIGdyb3VwKSwgZ3JvdXApOworCisJCQkJCQkJczYyNl9kaW9fc2V0X2lycShkZXYsCisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCWNvbnZlcnRfYXJnKTsKKworCQkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvL3JlYWQgaW50ZXJydXB0IHR5cGUKKwkJaXJxYml0ID0gREVCSXJlYWQoZGV2LCBMUF9SRE1JU0MyKTsKKworCQkvL2NoZWNrIGludGVycnVwdCBvbiBjb3VudGVycworCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY2hlY2sgY291bnRlcnMgaW50ZXJydXB0ICVkXG4iLAorCQkJaXJxYml0KTsKKworCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMUEpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAxQSBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbMF07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQyQSkgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDJBIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdlsxXTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDNBKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgM0Egb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzJdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMUIpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAxQiBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbM107CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQyQikgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDJCIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdls0XTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisKKwkJCWlmIChkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID4gMCkgeworCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQtLTsKKwkJCQlpZiAoZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA9PSAwKQorCQkJCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0lOREVYKTsKKworCQkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGNvbnZlciB0aW1lciB0cmlnZ2VyISEhICVkXG4iLCBkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50KTsKKworCQkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJCU1DX0VOQUJMRShQX01DMiwgTUMyX0FEQ19SUFMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UM0IpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAzQiBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbNV07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IHNjYW4gdGltZXIgdHJpZ2dlciEhIVxuIik7CisKKwkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisJCQl9CisKKwkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY29udmVydCB0aW1lciB0cmlnZ2VyIGlzIHNldFxuIik7CisJCQkJayA9ICZlbmNwcml2WzRdOworCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0FMV0FZUyk7CisJCQl9CisJCX0KKwl9CisKKwkvL2VuYWJsZSBpbnRlcnJ1cHQKKwl3cml0ZWwoaXJxc3RhdHVzLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogZXhpdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLlxuIik7CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzNjI2X2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWlmIChkZXZwcml2KSB7CisJCS8vc3RvcCBhaV9jb21tYW5kCisJCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCQlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyKSB7CisJCQkvL2ludGVycnVwdCBtYXNrCisJCQlXUjcxNDYoUF9JRVIsIDApOwkvLyBEaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQuCisJCQlXUjcxNDYoUF9JU1IsIElSUV9HUElPMyB8IElSUV9SUFMxKTsJLy8gQ2xlYXIgYm9hcmQncyBJUlEgc3RhdHVzIGZsYWcuCisKKwkJCS8vIERpc2FibGUgdGhlIHdhdGNoZG9nIHRpbWVyIGFuZCBiYXR0ZXJ5IGNoYXJnZXIuCisJCQlXcml0ZU1JU0MyKGRldiwgMCk7CisKKwkJCS8vIENsb3NlIGFsbCBpbnRlcmZhY2VzIG9uIDcxNDYgZGV2aWNlLgorCQkJV1I3MTQ2KFBfTUMxLCBNQzFfU0hVVERPV04pOworCQkJV1I3MTQ2KFBfQUNPTjEsIEFDT04xX0JBU0UpOworCisJCQlDbG9zZURNQUIoZGV2LCAmZGV2cHJpdi0+UlBTQnVmLCBETUFCVUZfU0laRSk7CisJCQlDbG9zZURNQUIoZGV2LCAmZGV2cHJpdi0+QU5BQnVmLCBETUFCVUZfU0laRSk7CisJCX0KKworCQlpZiAoZGV2LT5pcnEpIHsKKwkJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJfQorCisJCWlmIChkZXZwcml2LT5iYXNlX2FkZHIpIHsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+YmFzZV9hZGRyKTsKKwkJfQorCisJCWlmIChkZXZwcml2LT5wZGV2KSB7CisJCQlpZiAoZGV2cHJpdi0+Z290X3JlZ2lvbnMpIHsKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGRldik7CisJCQl9CisJCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wZGV2KTsKKwkJfQorCX0KKworCURFQlVHKCJzNjI2X2RldGFjaDogUzYyNiBkZXRhY2hlZCFcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9ucyBidWlsZCB0aGUgUlBTIHByb2dyYW0gZm9yIGhhcmR3YXJlIGRyaXZlbiBhY3F1aXN0aW9uCisgKi8KK3ZvaWQgUmVzZXRBREMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCAqIHBwbCkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCAqcFJQUzsKKwl1aW50MzJfdCBKbXBBZHJzOworCXVpbnQxNl90IGk7CisJdWludDE2X3QgbjsKKwl1aW50MzJfdCBMb2NhbFBQTDsKKwljb21lZGlfY21kICpjbWQgPSAmKGRldi0+c3ViZGV2aWNlcy0+YXN5bmMtPmNtZCk7CisKKwkvLyBTdG9wIFJQUyBwcm9ncmFtIGluIGNhc2UgaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuCisJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCS8vIFNldCBzdGFydGluZyBsb2dpY2FsIGFkZHJlc3MgdG8gd3JpdGUgUlBTIGNvbW1hbmRzLgorCXBSUFMgPSAodWludDMyX3QgKikgZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlOworCisJLy8gSW5pdGlhbGl6ZSBSUFMgaW5zdHJ1Y3Rpb24gcG9pbnRlci4KKwlXUjcxNDYoUF9SUFNBRERSMSwgKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlKTsKKworCS8vIENvbnN0cnVjdCBSUFMgcHJvZ3JhbSBpbiBSUFNCdWYgRE1BIGJ1ZmZlcgorCisJaWYgKGNtZCAhPSBOVUxMICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpIHsKKwkJREVCVUcoIlJlc2V0QURDOiBzY2FuX2JlZ2luIHBhdXNlIGluc2VydGVkXG4iKTsKKwkJLy8gV2FpdCBmb3IgU3RhcnQgdHJpZ2dlci4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19TSUdBREM7CisJCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX1NJR0FEQzsKKwl9CisJLy8gU0FBNzE0NiBCVUcgV09SS0FST1VORCBEbyBhIGR1bW15IERFQkkgV3JpdGUuICBUaGlzIGlzIG5lY2Vzc2FyeQorCS8vIGJlY2F1c2UgdGhlIGZpcnN0IFJQUyBERUJJIFdyaXRlIGZvbGxvd2luZyBhIG5vbi1SUFMgREVCSSB3cml0ZQorCS8vIHNlZW1zIHRvIGFsd2F5cyBmYWlsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcyBkdW1teSB3cml0ZSwgdGhlIEFEQworCS8vIGdhaW4gbWlnaHQgbm90IGJlIHNldCB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBmaXJzdCBzbG90IGluCisJLy8gdGhlIHBvbGwgbGlzdDsgdGhlIEFEQyBnYWluIHdvdWxkIGluc3RlYWQgcmVtYWluIHVuY2hhbmdlZCBmcm9tCisJLy8gdGhlIHByZXZpb3VzbHkgcHJvZ3JhbW1lZCB2YWx1ZS4KKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBXcml0ZSBjb21tYW5kCisJLy8gYW5kIGFkZHJlc3MgdG8gc2hhZG93IFJBTS4KKwkqcFJQUysrID0gREVCSV9DTURfV1JXT1JEIHwgTFBfR1NFTDsKKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJIGltbWVkaWF0ZSBkYXRhCisJLy8gdG8gc2hhZG93IFJBTToKKwkqcFJQUysrID0gR1NFTF9CSVBPTEFSNVY7CS8vIGFyYml0cmFyeSBpbW1lZGlhdGUgZGF0YQorCS8vIHZhbHVlLgorCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX0RFQkk7CS8vIFJlc2V0ICJzaGFkb3cgUkFNCisJLy8gdXBsb2FkZWQiIGZsYWcuCisJKnBSUFMrKyA9IFJQU19VUExPQUQgfCBSUFNfREVCSTsJLy8gSW52b2tlIHNoYWRvdyBSQU0gdXBsb2FkLgorCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfREVCSTsJLy8gV2FpdCBmb3Igc2hhZG93IHVwbG9hZCB0byBmaW5pc2guCisKKwkvLyBEaWdpdGl6ZSBhbGwgc2xvdHMgaW4gdGhlIHBvbGwgbGlzdC4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhCisJLy8gZm9yIGxvb3AgdG8gbGltaXQgdGhlIHNsb3QgY291bnQgdG8gMTYgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24KKwkvLyBmb3Jnb3QgdG8gc2V0IHRoZSBFT1BMIGZsYWcgaW4gdGhlIGZpbmFsIHNsb3QuCisJZm9yIChkZXZwcml2LT5BZGNJdGVtcyA9IDA7IGRldnByaXYtPkFkY0l0ZW1zIDwgMTY7IGRldnByaXYtPkFkY0l0ZW1zKyspIHsKKwkJLy8gQ29udmVydCBhcHBsaWNhdGlvbidzIHBvbGwgbGlzdCBpdGVtIHRvIHByaXZhdGUgYm9hcmQgY2xhc3MKKwkJLy8gZm9ybWF0LiAgRWFjaCBhcHAgcG9sbCBsaXN0IGl0ZW0gaXMgYW4gdWludDhfdCB3aXRoIGZvcm0KKwkJLy8gKEVPUEwseCx4LFJBTkdFLENIQU48MzowPiksIHdoZXJlIFJBTkdFIGNvZGUgaW5kaWNhdGVzIDAgPQorCQkvLyArLTEwViwgMSA9ICstNVYsIGFuZCBFT1BMID0gRW5kIG9mIFBvbGwgTGlzdCBtYXJrZXIuCisJCUxvY2FsUFBMID0KKwkJCSgqcHBsIDw8IDgpIHwgKCpwcGwgJiAweDEwID8gR1NFTF9CSVBPTEFSNVYgOgorCQkJR1NFTF9CSVBPTEFSMTBWKTsKKworCQkvLyBTd2l0Y2ggQURDIGFuYWxvZyBnYWluLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBjb21tYW5kCisJCS8vIGFuZCBhZGRyZXNzIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBERUJJX0NNRF9XUldPUkQgfCBMUF9HU0VMOworCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJCisJCS8vIGltbWVkaWF0ZSBkYXRhIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBMb2NhbFBQTDsKKwkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfREVCSTsJLy8gUmVzZXQgInNoYWRvdyBSQU0gdXBsb2FkZWQiCisJCS8vIGZsYWcuCisJCSpwUlBTKysgPSBSUFNfVVBMT0FEIHwgUlBTX0RFQkk7CS8vIEludm9rZSBzaGFkb3cgUkFNIHVwbG9hZC4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19ERUJJOwkvLyBXYWl0IGZvciBzaGFkb3cgdXBsb2FkIHRvCisJCS8vIGZpbmlzaC4KKworCQkvLyBTZWxlY3QgQURDIGFuYWxvZyBpbnB1dCBjaGFubmVsLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBjb21tYW5kCisJCS8vIGFuZCBhZGRyZXNzIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBERUJJX0NNRF9XUldPUkQgfCBMUF9JU0VMOworCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJCisJCS8vIGltbWVkaWF0ZSBkYXRhIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBMb2NhbFBQTDsKKwkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfREVCSTsJLy8gUmVzZXQgInNoYWRvdyBSQU0gdXBsb2FkZWQiCisJCS8vIGZsYWcuCisJCSpwUlBTKysgPSBSUFNfVVBMT0FEIHwgUlBTX0RFQkk7CS8vIEludm9rZSBzaGFkb3cgUkFNIHVwbG9hZC4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19ERUJJOwkvLyBXYWl0IGZvciBzaGFkb3cgdXBsb2FkIHRvCisJCS8vIGZpbmlzaC4KKworCQkvLyBEZWxheSBhdCBsZWFzdCAxMCBtaWNyb3NlY29uZHMgZm9yIGFuYWxvZyBpbnB1dCBzZXR0bGluZy4KKwkJLy8gSW5zdGVhZCBvZiBwYWRkaW5nIHdpdGggTk9Qcywgd2UgdXNlIFJQU19KVU1QIGluc3RydWN0aW9ucworCQkvLyBoZXJlOyB0aGlzIGFsbG93cyB1cyB0byBwcm9kdWNlIGEgbG9uZ2VyIGRlbGF5IHRoYW4gaXMKKwkJLy8gcG9zc2libGUgd2l0aCBOT1BzIGJlY2F1c2UgZWFjaCBSUFNfSlVNUCBmbHVzaGVzIHRoZSBSUFMnCisJCS8vIGluc3RydWN0aW9uIHByZWZldGNoIHBpcGVsaW5lLgorCQlKbXBBZHJzID0KKwkJCSh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSArCisJCQkodWludDMyX3QpICgodW5zaWduZWQgbG9uZylwUlBTIC0KKwkJCSh1bnNpZ25lZCBsb25nKWRldnByaXYtPlJQU0J1Zi5Mb2dpY2FsQmFzZSk7CisJCWZvciAoaSA9IDA7IGkgPCAoMTAgKiBSUFNDTEtfUEVSX1VTIC8gMik7IGkrKykgeworCQkJSm1wQWRycyArPSA4OwkvLyBSZXBlYXQgdG8gaW1wbGVtZW50IHRpbWUgZGVsYXk6CisJCQkqcFJQUysrID0gUlBTX0pVTVA7CS8vIEp1bXAgdG8gbmV4dCBSUFMgaW5zdHJ1Y3Rpb24uCisJCQkqcFJQUysrID0gSm1wQWRyczsKKwkJfQorCisJCWlmIChjbWQgIT0gTlVMTCAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XKSB7CisJCQlERUJVRygiUmVzZXRBREM6IGNvbnZlcnQgcGF1c2UgaW5zZXJ0ZWRcbiIpOworCQkJLy8gV2FpdCBmb3IgU3RhcnQgdHJpZ2dlci4KKwkJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfU0lHQURDOworCQkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfU0lHQURDOworCQl9CisJCS8vIFN0YXJ0IEFEQyBieSBwdWxzaW5nIEdQSU8xLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gQmVnaW4gQURDIFN0YXJ0IHB1bHNlLgorCQkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfTE87CisJCSpwUlBTKysgPSBSUFNfTk9QOworCQkvLyBWRVJTSU9OIDIuMDMgQ0hBTkdFOiBTVFJFVENIIE9VVCBBREMgU1RBUlQgUFVMU0UuCisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBFbmQgQURDIFN0YXJ0IHB1bHNlLgorCQkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfSEk7CisKKwkJLy8gV2FpdCBmb3IgQURDIHRvIGNvbXBsZXRlIChHUElPMiBpcyBhc3NlcnRlZCBoaWdoIHdoZW4gQURDIG5vdAorCQkvLyBidXN5KSBhbmQgZm9yIGRhdGEgZnJvbSBwcmV2aW91cyBjb252ZXJzaW9uIHRvIHNoaWZ0IGludG8gRkIKKwkJLy8gQlVGRkVSIDEgcmVnaXN0ZXIuCisJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfR1BJTzI7CS8vIFdhaXQgZm9yIEFEQyBkb25lLgorCisJCS8vIFRyYW5zZmVyIEFEQyBkYXRhIGZyb20gRkIgQlVGRkVSIDEgcmVnaXN0ZXIgdG8gRE1BIGJ1ZmZlci4KKwkJKnBSUFMrKyA9IFJQU19TVFJFRyB8IChCVUdGSVhfU1RSRUcoUF9GQl9CVUZGRVIxKSA+PiAyKTsKKwkJKnBSUFMrKyA9CisJCQkodWludDMyX3QpIGRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgKworCQkJKGRldnByaXYtPkFkY0l0ZW1zIDw8IDIpOworCisJCS8vIElmIHRoaXMgc2xvdCdzIEVuZE9mUG9sbExpc3QgZmxhZyBpcyBzZXQsIGFsbCBjaGFubmVscyBoYXZlCisJCS8vIG5vdyBiZWVuIHByb2Nlc3NlZC4KKwkJaWYgKCpwcGwrKyAmIEVPUEwpIHsKKwkJCWRldnByaXYtPkFkY0l0ZW1zKys7CS8vIEFkanVzdCBwb2xsIGxpc3QgaXRlbSBjb3VudC4KKwkJCWJyZWFrOwkvLyBFeGl0IHBvbGwgbGlzdCBwcm9jZXNzaW5nIGxvb3AuCisJCX0KKwl9CisJREVCVUcoIlJlc2V0QURDOiBBREMgaXRlbXMgJWQgXG4iLCBkZXZwcml2LT5BZGNJdGVtcyk7CisKKwkvLyBWRVJTSU9OIDIuMDEgQ0hBTkdFOiBERUxBWSBDSEFOR0VEIEZST00gMjUwTlMgdG8gMlVTLiAgQWxsb3cgdGhlCisJLy8gQURDIHRvIHN0YWJpbGl6ZSBmb3IgMiBtaWNyb3NlY29uZHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaW5hbAorCS8vIChkdW1teSkgY29udmVyc2lvbi4gIFRoaXMgZGVsYXkgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IHN1ZmZpY2llbnQKKwkvLyB0aW1lIGJldHdlZW4gbGFzdCBjb252ZXJzaW9uIGZpbmlzaGVkIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGR1bW15CisJLy8gY29udmVyc2lvbi4gIFdpdGhvdXQgdGhpcyBkZWxheSwgdGhlIGxhc3QgY29udmVyc2lvbidzIGRhdGEgdmFsdWUKKwkvLyBpcyBzb21ldGltZXMgc2V0IHRvIHRoZSBwcmV2aW91cyBjb252ZXJzaW9uJ3MgZGF0YSB2YWx1ZS4KKwlmb3IgKG4gPSAwOyBuIDwgKDIgKiBSUFNDTEtfUEVSX1VTKTsgbisrKQorCQkqcFJQUysrID0gUlBTX05PUDsKKworCS8vIFN0YXJ0IGEgZHVtbXkgY29udmVyc2lvbiB0byBjYXVzZSB0aGUgZGF0YSBmcm9tIHRoZSBsYXN0CisJLy8gY29udmVyc2lvbiBvZiBpbnRlcmVzdCB0byBiZSBzaGlmdGVkIGluLgorCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBCZWdpbiBBREMgU3RhcnQgcHVsc2UuCisJKnBSUFMrKyA9IEdQSU9fQkFTRSB8IEdQSU8xX0xPOworCSpwUlBTKysgPSBSUFNfTk9QOworCS8vIFZFUlNJT04gMi4wMyBDSEFOR0U6IFNUUkVUQ0ggT1VUIEFEQyBTVEFSVCBQVUxTRS4KKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gRW5kIEFEQyBTdGFydCBwdWxzZS4KKwkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfSEk7CisKKwkvLyBXYWl0IGZvciB0aGUgZGF0YSBmcm9tIHRoZSBsYXN0IGNvbnZlcnNpb24gb2YgaW50ZXJlc3QgdG8gYXJyaXZlCisJLy8gaW4gRkIgQlVGRkVSIDEgcmVnaXN0ZXIuCisJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19HUElPMjsJLy8gV2FpdCBmb3IgQURDIGRvbmUuCisKKwkvLyBUcmFuc2ZlciBmaW5hbCBBREMgZGF0YSBmcm9tIEZCIEJVRkZFUiAxIHJlZ2lzdGVyIHRvIERNQSBidWZmZXIuCisJKnBSUFMrKyA9IFJQU19TVFJFRyB8IChCVUdGSVhfU1RSRUcoUF9GQl9CVUZGRVIxKSA+PiAyKTsJLy8KKwkqcFJQUysrID0KKwkJKHVpbnQzMl90KSBkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlICsKKwkJKGRldnByaXYtPkFkY0l0ZW1zIDw8IDIpOworCisJLy8gSW5kaWNhdGUgQURDIHNjYW4gbG9vcCBpcyBmaW5pc2hlZC4KKwkvLyAqcFJQUysrPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX1NJR0FEQyA7ICAvLyBTaWduYWwgUmVhZEFEQygpIHRoYXQgc2NhbiBpcyBkb25lLgorCisJLy9pbnZva2UgaW50ZXJydXB0CisJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nID09IDEpIHsKKwkJREVCVUcoIlJlc2V0QURDOiBpbnNlcnQgaXJxIGluIEFEQyBSUFMgdGFza1xuIik7CisJCSpwUlBTKysgPSBSUFNfSVJROworCX0KKwkvLyBSZXN0YXJ0IFJQUyBwcm9ncmFtIGF0IGl0cyBiZWdpbm5pbmcuCisJKnBSUFMrKyA9IFJQU19KVU1QOwkvLyBCcmFuY2ggdG8gc3RhcnQgb2YgUlBTIHByb2dyYW0uCisJKnBSUFMrKyA9ICh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZTsKKworCS8vIEVuZCBvZiBSUFMgcHJvZ3JhbSBidWlsZAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQorCisvKiBUTyBDT01QTEVURSwgSUYgTkVDRVNTQVJZICovCitzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogc3RhdGljIGludCBzNjI2X2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldixjb21lZGlfc3ViZGV2aWNlICpzLGNvbWVkaV9pbnNuICppbnNuLGxzYW1wbF90ICpkYXRhKSAqLworLyogeyAqLworLyogICByZWdpc3RlciB1aW50OF90CWk7ICovCisvKiAgIHJlZ2lzdGVyIGludDMyX3QJKnJlYWRhZGRyOyAqLworCisvKiAgIERFQlVHKCJhczYyNl9haV9yaW5zbjogYWlfcmluc24gZW50ZXIgXG4iKTsgICovCisKKy8qICAgLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLiAqLworLyogICBNQ19FTkFCTEUoIFBfTUMyLCBNQzJfQURDX1JQUyApOyAqLworCisvKiAgIC8vIFdhaXQgdW50aWwgQURDIHNjYW4gbG9vcCBpcyBmaW5pc2hlZCAoUlBTIFNpZ25hbCAwIHJlc2V0KS4gKi8KKy8qICAgd2hpbGUgKCBNQ19URVNUKCBQX01DMiwgTUMyX0FEQ19SUFMgKSApOyAqLworCisvKiAgIC8vIEluaXQgcHRyIHRvIERNQSBidWZmZXIgdGhhdCBob2xkcyBuZXcgQURDIGRhdGEuICBXZSBza2lwIHRoZSAqLworLyogICAvLyBmaXJzdCB1aW50MTZfdCBpbiB0aGUgYnVmZmVyIGJlY2F1c2UgaXQgY29udGFpbnMganVuayBkYXRhIGZyb20gKi8KKy8qICAgLy8gdGhlIGZpbmFsIEFEQyBvZiB0aGUgcHJldmlvdXMgcG9sbCBsaXN0IHNjYW4uICovCisvKiAgIHJlYWRhZGRyID0gKHVpbnQzMl90ICopZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlICsgMTsgKi8KKworLyogICAvLyBDb252ZXJ0IEFEQyBkYXRhIHRvIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQgY29weSB0byBhcHBsaWNhdGlvbiAqLworLyogICAvLyBidWZmZXIuCSAqLworLyogICBmb3IgKCBpID0gMDsgaSA8IGRldnByaXYtPkFkY0l0ZW1zOyBpKysgKSB7ICovCisvKiAgICAgKmRhdGEgPSBzNjI2X2FpX3JlZ190b191aW50KCAqcmVhZGFkZHIrKyApOyAqLworLyogICAgIERFQlVHKCJzNjI2X2FpX3JpbnNuOiBkYXRhICVkIFxuIiwqZGF0YSk7ICovCisvKiAgICAgZGF0YSsrOyAqLworLyogICB9ICovCisKKy8qICAgREVCVUcoInM2MjZfYWlfcmluc246IGFpX3JpbnNuIGVzY2FwZSBcbiIpOyAqLworLyogICByZXR1cm4gaTsgKi8KKy8qIH0gKi8KKworc3RhdGljIGludCBzNjI2X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwl1aW50MTZfdCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdWludDE2X3QgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJdWludDE2X3QgQWRjU3BlYyA9IDA7CisJdWludDMyX3QgR3Bpb0ltYWdlOworCWludCBuOworCisvKiAgIC8vaW50ZXJydXB0IGNhbGwgdGVzdCAgKi8KKy8qICAgd3JpdGVsKElSUV9HUElPMyxkZXZwcml2LT5iYXNlX2FkZHIrUF9QU1IpOyAvL1dyaXRpbmcgYSBsb2dpY2FsIDEgKi8KKy8qIAkJCQkJICAgICAvL2ludG8gYW55IG9mIHRoZSBSUFNfUFNSICovCisvKiAJCQkJCSAgICAgLy9iaXRzIGNhdXNlcyB0aGUgKi8KKy8qIAkJCQkJICAgICAvL2NvcnJlc3BvbmRpbmcgaW50ZXJydXB0ICovCisvKiAJCQkJCSAgICAgLy90byBiZSBnZW5lcmF0ZWQgaWYgKi8KKy8qIAkJCQkJICAgICAvL2VuYWJsZWQgKi8KKworCURFQlVHKCJzNjI2X2FpX2luc25fcmVhZDogZW50ZXJpbmdcbiIpOworCisJLy8gQ29udmVydCBhcHBsaWNhdGlvbidzIEFEQyBzcGVjaWZpY2F0aW9uIGludG8gZm9ybQorCS8vIGFwcHJvcHJpYXRlIGZvciByZWdpc3RlciBwcm9ncmFtbWluZy4KKwlpZiAocmFuZ2UgPT0gMCkKKwkJQWRjU3BlYyA9IChjaGFuIDw8IDgpIHwgKEdTRUxfQklQT0xBUjVWKTsKKwllbHNlCisJCUFkY1NwZWMgPSAoY2hhbiA8PCA4KSB8IChHU0VMX0JJUE9MQVIxMFYpOworCisJLy8gU3dpdGNoIEFEQyBhbmFsb2cgZ2Fpbi4KKwlERUJJd3JpdGUoZGV2LCBMUF9HU0VMLCBBZGNTcGVjKTsJLy8gU2V0IGdhaW4uCisKKwkvLyBTZWxlY3QgQURDIGFuYWxvZyBpbnB1dCBjaGFubmVsLgorCURFQkl3cml0ZShkZXYsIExQX0lTRUwsIEFkY1NwZWMpOwkvLyBTZWxlY3QgY2hhbm5lbC4KKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKworCQkvLyBEZWxheSAxMCBtaWNyb3NlY29uZHMgZm9yIGFuYWxvZyBpbnB1dCBzZXR0bGluZy4KKwkJY29tZWRpX3VkZWxheSgxMCk7CisKKwkJLy8gU3RhcnQgQURDIGJ5IHB1bHNpbmcgR1BJTzEgbG93LgorCQlHcGlvSW1hZ2UgPSBSUjcxNDYoUF9HUElPKTsKKwkJLy8gQXNzZXJ0IEFEQyBTdGFydCBjb21tYW5kCisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJCS8vICAgYW5kIHN0cmV0Y2ggaXQgb3V0LgorCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCQkvLyBOZWdhdGUgQURDIFN0YXJ0IGNvbW1hbmQuCisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSB8IEdQSU8xX0hJKTsKKworCQkvLyBXYWl0IGZvciBBREMgdG8gY29tcGxldGUgKEdQSU8yIGlzIGFzc2VydGVkIGhpZ2ggd2hlbgorCQkvLyBBREMgbm90IGJ1c3kpIGFuZCBmb3IgZGF0YSBmcm9tIHByZXZpb3VzIGNvbnZlcnNpb24gdG8KKwkJLy8gc2hpZnQgaW50byBGQiBCVUZGRVIgMSByZWdpc3Rlci4KKworCQkvLyBXYWl0IGZvciBBREMgZG9uZS4KKwkJd2hpbGUgKCEoUlI3MTQ2KFBfUFNSKSAmIFBTUl9HUElPMikpIDsKKworCQkvLyBGZXRjaCBBREMgZGF0YS4KKwkJaWYgKG4gIT0gMCkKKwkJCWRhdGFbbiAtIDFdID0gczYyNl9haV9yZWdfdG9fdWludChSUjcxNDYoUF9GQl9CVUZGRVIxKSk7CisKKwkJLy8gQWxsb3cgdGhlIEFEQyB0byBzdGFiaWxpemUgZm9yIDQgbWljcm9zZWNvbmRzIGJlZm9yZQorCQkvLyBzdGFydGluZyB0aGUgbmV4dCAoZmluYWwpIGNvbnZlcnNpb24uICBUaGlzIGRlbGF5IGlzCisJCS8vIG5lY2Vzc2FyeSB0byBhbGxvdyBzdWZmaWNpZW50IHRpbWUgYmV0d2VlbiBsYXN0CisJCS8vIGNvbnZlcnNpb24gZmluaXNoZWQgYW5kIHRoZSBzdGFydCBvZiB0aGUgbmV4dAorCQkvLyBjb252ZXJzaW9uLiAgV2l0aG91dCB0aGlzIGRlbGF5LCB0aGUgbGFzdCBjb252ZXJzaW9uJ3MKKwkJLy8gZGF0YSB2YWx1ZSBpcyBzb21ldGltZXMgc2V0IHRvIHRoZSBwcmV2aW91cworCQkvLyBjb252ZXJzaW9uJ3MgZGF0YSB2YWx1ZS4KKwkJY29tZWRpX3VkZWxheSg0KTsKKwl9CisKKwkvLyBTdGFydCBhIGR1bW15IGNvbnZlcnNpb24gdG8gY2F1c2UgdGhlIGRhdGEgZnJvbSB0aGUKKwkvLyBwcmV2aW91cyBjb252ZXJzaW9uIHRvIGJlIHNoaWZ0ZWQgaW4uCisJR3Bpb0ltYWdlID0gUlI3MTQ2KFBfR1BJTyk7CisKKwkvL0Fzc2VydCBBREMgU3RhcnQgY29tbWFuZAorCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJLy8gICBhbmQgc3RyZXRjaCBpdCBvdXQuCisJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCS8vIE5lZ2F0ZSBBREMgU3RhcnQgY29tbWFuZC4KKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgfCBHUElPMV9ISSk7CisKKwkvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBhcnJpdmUgaW4gRkIgQlVGRkVSIDEgcmVnaXN0ZXIuCisKKwkvLyBXYWl0IGZvciBBREMgZG9uZS4KKwl3aGlsZSAoIShSUjcxNDYoUF9QU1IpICYgUFNSX0dQSU8yKSkgOworCisJLy8gRmV0Y2ggQURDIGRhdGEgZnJvbSBhdWRpbyBpbnRlcmZhY2UncyBpbnB1dCBzaGlmdAorCS8vIHJlZ2lzdGVyLgorCisJLy8gRmV0Y2ggQURDIGRhdGEuCisJaWYgKG4gIT0gMCkKKwkJZGF0YVtuIC0gMV0gPSBzNjI2X2FpX3JlZ190b191aW50KFJSNzE0NihQX0ZCX0JVRkZFUjEpKTsKKworCURFQlVHKCJzNjI2X2FpX2luc25fcmVhZDogc2FtcGxlcyAlZCwgZGF0YSAlZFxuIiwgbiwgZGF0YVtuIC0gMV0pOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9haV9sb2FkX3BvbGxsaXN0KHVpbnQ4X3QgKiBwcGwsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBjbWQtPmNoYW5saXN0X2xlbjsgbisrKSB7CisJCWlmIChDUl9SQU5HRSgoY21kLT5jaGFubGlzdClbbl0pID09IDApCisJCQlwcGxbbl0gPSAoQ1JfQ0hBTigoY21kLT5jaGFubGlzdClbbl0pKSB8IChSQU5HRV81Vik7CisJCWVsc2UKKwkJCXBwbFtuXSA9IChDUl9DSEFOKChjbWQtPmNoYW5saXN0KVtuXSkpIHwgKFJBTkdFXzEwVik7CisJfQorCXBwbFtuIC0gMV0gfD0gRU9QTDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgdHJpZ251bSkKK3sKKwlpZiAodHJpZ251bSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHKCJzNjI2X2FpX2ludHRyaWc6IHRyaWdnZXIgYWRjIHN0YXJ0Li4uIik7CisKKwkvLyBTdGFydCBleGVjdXRpbmcgdGhlIFJQUyBwcm9ncmFtLgorCU1DX0VOQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKworCURFQlVHKCIgZG9uZVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworLyogIFRPIENPTVBMRVRFICAqLworc3RhdGljIGludCBzNjI2X2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKworCXVpbnQ4X3QgcHBsWzE2XTsKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwllbmNfcHJpdmF0ZSAqazsKKwlpbnQgdGljazsKKworCURFQlVHKCJzNjI2X2FpX2NtZDogZW50ZXJpbmcgY29tbWFuZCBmdW5jdGlvblxuIik7CisKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcHJpbnRrKCJzNjI2X2FpX2NtZDogQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZyAlZFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvL2Rpc2FibGUgaW50ZXJydXB0CisJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCS8vY2xlYXIgaW50ZXJydXB0IHJlcXVlc3QKKwl3cml0ZWwoSVJRX1JQUzEgfCBJUlFfR1BJTzMsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSVNSKTsKKworCS8vY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJczYyNl9kaW9fY2xlYXJfaXJxKGRldik7CisJLy8gIHM2MjZfZW5jX2NsZWFyX2lycShkZXYpOworCisJLy9yZXNldCBhaV9jbWRfcnVubmluZyBmbGFnCisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJLy8gdGVzdCBpZiBjbWQgaXMgdmFsaWQKKwlpZiAoY21kID09IE5VTEwpIHsKKwkJREVCVUcoInM2MjZfYWlfY21kOiBOVUxMIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlERUJVRygiczYyNl9haV9jbWQ6IGNvbW1hbmQgcmVjaWV2ZWQhISFcbiIpOworCX0KKworCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkiczYyNl9haV9jbWQ6IGNhbm5vdCBydW4gY29tbWFuZCB3aXRob3V0IGFuIGlycSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzNjI2X2FpX2xvYWRfcG9sbGxpc3QocHBsLCBjbWQpOworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMTsKKwlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID0gMDsKKworCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgeworCWNhc2UgVFJJR19GT0xMT1c6CisJCWJyZWFrOworCWNhc2UgVFJJR19USU1FUjoKKwkJLy8gc2V0IGEgY29udGVyIHRvIGdlbmVyYXRlIGFkYyB0cmlnZ2VyIGF0IHNjYW5fYmVnaW5fYXJnIGludGVydmFsCisJCWsgPSAmZW5jcHJpdls1XTsKKwkJdGljayA9IHM2MjZfbnNfdG9fdGltZXIoKGludCAqKSZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisKKwkJLy9sb2FkIHRpbWVyIHZhbHVlIGFuZCBlbmFibGUgaW50ZXJydXB0CisJCXM2MjZfdGltZXJfbG9hZChkZXYsIGssIHRpY2spOworCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0FMV0FZUyk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBzY2FuIHRyaWdnZXIgdGltZXIgaXMgc2V0IHdpdGggdmFsdWUgJWRcbiIsCisJCQl0aWNrKTsKKworCQlicmVhazsKKwljYXNlIFRSSUdfRVhUOgorCQkvLyBzZXQgdGhlIGRpZ2l0YWwgbGluZSBhbmQgaW50ZXJydXB0IGZvciBzY2FuIHRyaWdnZXIKKwkJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfRVhUKQorCQkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogRXh0ZXJuYWwgc2NhbiB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CisJY2FzZSBUUklHX05PVzoKKwkJYnJlYWs7CisJY2FzZSBUUklHX1RJTUVSOgorCQkvLyBzZXQgYSBjb250ZXIgdG8gZ2VuZXJhdGUgYWRjIHRyaWdnZXIgYXQgY29udmVydF9hcmcgaW50ZXJ2YWwKKwkJayA9ICZlbmNwcml2WzRdOworCQl0aWNrID0gczYyNl9uc190b190aW1lcigoaW50ICopJmNtZC0+Y29udmVydF9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKworCQkvL2xvYWQgdGltZXIgdmFsdWUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQKKwkJczYyNl90aW1lcl9sb2FkKGRldiwgaywgdGljayk7CisJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfSU5ERVgpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogY29udmVydCB0cmlnZ2VyIHRpbWVyIGlzIHNldCB3aXRoIHZhbHVlICVkXG4iLCB0aWNrKTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX0VYVDoKKwkJLy8gc2V0IHRoZSBkaWdpdGFsIGxpbmUgYW5kIGludGVycnVwdCBmb3IgY29udmVydCB0cmlnZ2VyCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUCisJCQkmJiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkKKwkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEV4dGVybmFsIGNvbnZlcnQgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoKKwkJLy8gZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQKKwkJZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwkJZGV2cHJpdi0+YWlfY29udGlub3VzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBUUklHX05PTkU6CisJCS8vIGNvbnRpbm91cyBhcXVpc2l0aW9uCisJCWRldnByaXYtPmFpX2NvbnRpbm91cyA9IDE7CisJCWRldnByaXYtPmFpX3NhbXBsZV9jb3VudCA9IDA7CisJCWJyZWFrOworCX0KKworCVJlc2V0QURDKGRldiwgcHBsKTsKKworCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKKwljYXNlIFRSSUdfTk9XOgorCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCS8vIE1DX0VOQUJMRSggUF9NQzIsIE1DMl9BRENfUlBTICk7CisKKwkJLy8gU3RhcnQgZXhlY3V0aW5nIHRoZSBSUFMgcHJvZ3JhbS4KKwkJTUNfRU5BQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogQURDIHRyaWdnZXJlZFxuIik7CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBUUklHX0VYVDoKKwkJLy9jb25maWd1cmUgRElPIGNoYW5uZWwgZm9yIGFjcXVpc2l0aW9uIHRyaWdnZXIKKwkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+c3RhcnRfYXJnKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEV4dGVybmFsIHN0YXJ0IHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKworCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVFJJR19JTlQ6CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gczYyNl9haV9pbnR0cmlnOworCQlicmVhazsKKwl9CisKKwkvL2VuYWJsZSBpbnRlcnJ1cHQKKwl3cml0ZWwoSVJRX0dQSU8zIHwgSVJRX1JQUzEsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCURFQlVHKCJzNjI2X2FpX2NtZDogY29tbWFuZCBmdW5jdGlvbiB0ZXJtaW5hdGVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBjbWR0ZXN0IHRlc3RzIGEgcGFydGljdWxhciBjb21tYW5kIHRvIHNlZSBpZiBpdCBpcyB2YWxpZC4gIFVzaW5nCisJICogdGhlIGNtZHRlc3QgaW9jdGwsIGEgdXNlciBjYW4gY3JlYXRlIGEgdmFsaWQgY21kIGFuZCB0aGVuIGhhdmUgaXQKKwkgKiBleGVjdXRlcyBieSB0aGUgY21kIGlvY3RsLgorCSAqCisJICogY21kdGVzdCByZXR1cm5zIDEsMiwzLDQgb3IgMCwgZGVwZW5kaW5nIG9uIHdoaWNoIHRlc3RzIHRoZQorCSAqIGNvbW1hbmQgcGFzc2VzLiAqLworCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19GT0xMT1c7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX05PVzsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkKKwkgICBjb21wYXRpYmxlICovCisKKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVAorCQkmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQorCQllcnIrKzsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX05PVykKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c3RhcnRfYXJnIDwgMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X2FyZyA+IDM5KSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMzk7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAwKSB7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnNjYW5fYmVnaW5fYXJnID4gMzkpIHsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDM5OworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPmNvbnZlcnRfYXJnIDwgMCkgeworCQljbWQtPmNvbnZlcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5jb252ZXJ0X2FyZyA+IDM5KSB7CisJCWNtZC0+Y29udmVydF9hcmcgPSAzOTsKKwkJZXJyKys7CisJfQorI2RlZmluZSBNQVhfU1BFRUQJMjAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIE1JTl9TUEVFRAkyMDAwMDAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgTUFYX1NQRUVEKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gTUFYX1NQRUVEOworCQkJZXJyKys7CisJCX0KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiBNSU5fU1BFRUQpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBNSU5fU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLworCQkvKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycyAqLworLyogICAgIGlmKGNtZC0+c2Nhbl9iZWdpbl9hcmc+OSl7ICovCisvKiAgICAgICBjbWQtPnNjYW5fYmVnaW5fYXJnPTk7ICovCisvKiAgICAgICBlcnIrKzsgKi8KKy8qICAgICB9ICovCisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBNQVhfU1BFRUQpIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSBNQVhfU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA+IE1JTl9TUEVFRCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IE1JTl9TUEVFRDsKKwkJCWVycisrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzZWUgYWJvdmUgKi8KKy8qICAgICBpZihjbWQtPmNvbnZlcnRfYXJnPjkpeyAqLworLyogICAgICAgY21kLT5jb252ZXJ0X2FyZz05OyAqLworLyogICAgICAgZXJyKys7ICovCisvKiAgICAgfSAqLworCX0KKworCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoY21kLT5zdG9wX2FyZyA+IDB4MDBmZmZmZmYpIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAweDAwZmZmZmZmOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLworCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOworCQlzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCisJCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOworCQlzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5jb252ZXJ0X2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpCisJCQllcnIrKzsKKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA8CisJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmcpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQorCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwkvLyBTdG9wIFJQUyBwcm9ncmFtIGluIGNhc2UgaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuCisJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCS8vZGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0CisJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIHBhcnRpY3VsYXIgZm9ybSwgdGhpcyBpcyBqdXN0IHdoYXQKKyAqIGhhcHBlbnMgdG8gYmUgdXNlZCBpbiBzb21lIG9mIHRoZSBkcml2ZXJzLiAgSXQgc2hvdWxkIGNvbnZlcnQgbnMKKyAqIG5hbm9zZWNvbmRzIHRvIGEgY291bnRlciB2YWx1ZSBzdWl0YWJsZSBmb3IgcHJvZ3JhbW1pbmcgdGhlIGRldmljZS4KKyAqIEFsc28sIGl0IHNob3VsZCBhZGp1c3QgbnMgc28gdGhhdCBpdCBjb29yZXNwb25kcyB0byB0aGUgYWN0dWFsIHRpbWUKKyAqIHRoYXQgdGhlIGRldmljZSB3aWxsIHVzZS4gKi8KK3N0YXRpYyBpbnQgczYyNl9uc190b190aW1lcihpbnQgKm5hbm9zZWMsIGludCByb3VuZF9tb2RlKQoreworCWludCBkaXZpZGVyLCBiYXNlOworCisJYmFzZSA9IDUwMDsJCS8vMk1IeiBpbnRlcm5hbCBjbG9jaworCisJc3dpdGNoIChyb3VuZF9tb2RlKSB7CisJY2FzZSBUUklHX1JPVU5EX05FQVJFU1Q6CisJZGVmYXVsdDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLyAyKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9ET1dOOgorCQlkaXZpZGVyID0gKCpuYW5vc2VjKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9VUDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLSAxKSAvIGJhc2U7CisJCWJyZWFrOworCX0KKworCSpuYW5vc2VjID0gYmFzZSAqIGRpdmlkZXI7CisJcmV0dXJuIGRpdmlkZXIgLSAxOworfQorCitzdGF0aWMgaW50IHM2MjZfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgaTsKKwl1aW50MTZfdCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50MTZfdCBkYWNkYXRhOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkYWNkYXRhID0gKGludDE2X3QpIGRhdGFbaV07CisJCWRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXSA9IGRhdGFbaV07CisJCWRhY2RhdGEgLT0gKDB4MWZmZik7CisKKwkJU2V0REFDKGRldiwgY2hhbiwgZGFjZGF0YSk7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9hb19yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8gIERJR0lUQUwgSS9PIEZVTkNUSU9OUyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWxsIERJTyBmdW5jdGlvbnMgYWRkcmVzcyBhIGdyb3VwIG9mIERJTyBjaGFubmVscyBieSBtZWFucyBvZgorLy8gImdyb3VwIiBhcmd1bWVudC4gIGdyb3VwIG1heSBiZSAwLCAxIG9yIDIsIHdoaWNoIGNvcnJlc3BvbmQgdG8gRElPCisvLyBwb3J0cyBBLCBCIGFuZCBDLCByZXNwZWN0aXZlbHkuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgczYyNl9kaW9faW5pdChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVpbnQxNl90IGdyb3VwOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvLyBQcmVwYXJlIHRvIHRyZWF0IHdyaXRlcyB0byBXUkNhcFNlbCBhcyBjYXB0dXJlIGRpc2FibGVzLgorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9OT0VEQ0FQKTsKKworCS8vIEZvciBlYWNoIGdyb3VwIG9mIHNpeHRlZW4gY2hhbm5lbHMgLi4uCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgUzYyNl9ESU9fQkFOS1M7IGdyb3VwKyspIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIDIgKyBncm91cDsKKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JJbnRTZWwsIDApOwkvLyBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLgorCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkNhcFNlbCwgMHhGRkZGKTsJLy8gRGlzYWJsZSBhbGwgZXZlbnQKKwkJLy8gY2FwdHVyZXMuCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRWRnU2VsLCAwKTsJLy8gSW5pdCBhbGwgRElPcyB0bworCQkvLyBkZWZhdWx0IGVkZ2UKKwkJLy8gcG9sYXJpdHkuCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRE91dCwgMCk7CS8vIFByb2dyYW0gYWxsIG91dHB1dHMKKwkJLy8gdG8gaW5hY3RpdmUgc3RhdGUuCisJfQorCURFQlVHKCJzNjI2X2Rpb19pbml0OiBESU8gaW5pdGlhbGl6ZWQgXG4iKTsKK30KKworLyogRElPIGRldmljZXMgYXJlIHNsaWdodGx5IHNwZWNpYWwuICBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0bworICogaW1wbGVtZW50IHRoZSBpbnNuX3JlYWQvaW5zbl93cml0ZSBpbnRlcmZhY2UsIGl0IGlzIG11Y2ggbW9yZQorICogdXNlZnVsIHRvIGFwcGxpY2F0aW9ucyBpZiB5b3UgaW1wbGVtZW50IHRoZSBpbnNuX2JpdHMgaW50ZXJmYWNlLgorICogVGhpcyBhbGxvd3MgcGFja2VkIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgRElPIGNoYW5uZWxzLiAgVGhlIGNvbWVkaQorICogY29yZSBjYW4gY29udmVydCBiZXR3ZWVuIGluc25fYml0cyBhbmQgaW5zbl9yZWFkL3dyaXRlICovCisKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJLyogTGVuZ3RoIG9mIGRhdGEgbXVzdCBiZSAyIChtYXNrIGFuZCBuZXcgZGF0YSwgc2VlIGJlbG93KSAqLworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogczYyNjogczYyNl9kaW9faW5zbl9iaXRzKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zbiBkYXRhIGNvbnNpc3RzIG9mIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEgaW4KKwkgKiBkYXRhWzFdLiBUaGUgbWFzayBkZWZpbmVzIHdoaWNoIGJpdHMgd2UgYXJlIGNvbmNlcm5pbmcgYWJvdXQuCisJICogVGhlIG5ldyBkYXRhIG11c3QgYmUgYW5kZWQgd2l0aCB0aGUgbWFzay4gIEVhY2ggY2hhbm5lbAorCSAqIGNvcnJlc3BvbmRzIHRvIGEgYml0LgorCSAqLworCWlmIChkYXRhWzBdKSB7CisJCS8qIENoZWNrIGlmIHJlcXVlc3RlZCBwb3J0cyBhcmUgY29uZmlndXJlZCBmb3Igb3V0cHV0ICovCisJCWlmICgocy0+aW9fYml0cyAmIGRhdGFbMF0pICE9IGRhdGFbMF0pCisJCQlyZXR1cm4gLUVJTzsKKworCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwkJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisKKwkJLyogV3JpdGUgb3V0IHRoZSBuZXcgZGlnaXRhbCBvdXRwdXQgbGluZXMgKi8KKworCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIHMtPnN0YXRlKTsKKwl9CisJZGF0YVsxXSA9IERFQklyZWFkKGRldiwgZGlvcHJpdi0+UkRESW4pOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwkJZGF0YVsxXSA9CisJCQkocy0+aW9fYml0cyAmICgxIDw8IENSX0NIQU4oaW5zbi0+CisJCQkJCWNoYW5zcGVjKSkpID8gQ09NRURJX09VVFBVVCA6CisJCQlDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCQlicmVhazsKKwljYXNlIENPTUVESV9JTlBVVDoKKwkJcy0+aW9fYml0cyAmPSB+KDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpOworCQlicmVhazsKKwljYXNlIENPTUVESV9PVVRQVVQ6CisJCXMtPmlvX2JpdHMgfD0gMSA8PCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIHMtPmlvX2JpdHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9fc2V0X2lycShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJdW5zaWduZWQgaW50IGJpdG1hc2s7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8vc2VsZWN0IGRpbyBiYW5rCisJZ3JvdXAgPSBjaGFuIC8gMTY7CisJYml0bWFzayA9IDEgPDwgKGNoYW4gLSAoMTYgKiBncm91cCkpOworCURFQlVHKCJzNjI2X2Rpb19zZXRfaXJxOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkIGdyb3VwICVkXG4iLAorCQljaGFuIC0gKDE2ICogZ3JvdXApLCBncm91cCk7CisKKwkvL3NldCBjaGFubmVsIHRvIGNhcHR1cmUgcG9zaXRpdmUgZWRnZQorCXN0YXR1cyA9IERFQklyZWFkKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRFZGdTZWwpOworCURFQkl3cml0ZShkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSRWRnU2VsLCBiaXRtYXNrIHwgc3RhdHVzKTsKKworCS8vZW5hYmxlIGludGVycnVwdCBvbiBzZWxlY3RlZCBjaGFubmVsCisJc3RhdHVzID0gREVCSXJlYWQoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5SREludFNlbCk7CisJREVCSXdyaXRlKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JJbnRTZWwsIGJpdG1hc2sgfCBzdGF0dXMpOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIHdyaXRlIGNvbW1hbmQKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfRURDQVApOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIG9uIHNlbGVjdGVkIGNoYW5uZWwKKwlzdGF0dXMgPSBERUJJcmVhZChkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPlJEQ2FwU2VsKTsKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgYml0bWFzayB8IHN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19yZXNldF9pcnEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGdyb3VwLAorCXVuc2lnbmVkIGludCBtYXNrKQoreworCURFQlVHKCJzNjI2X2Rpb19yZXNldF9pcnE6IGRpc2FibGUgIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgbWFzaywgZ3JvdXApOworCisJLy9kaXNhYmxlIGVkZ2UgY2FwdHVyZSB3cml0ZSBjb21tYW5kCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX05PRURDQVApOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIG9uIHNlbGVjdGVkIGNoYW5uZWwKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19jbGVhcl9pcnEoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisKKwkvL2Rpc2FibGUgZWRnZSBjYXB0dXJlIHdyaXRlIGNvbW1hbmQKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfTk9FRENBUCk7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBTNjI2X0RJT19CQU5LUzsgZ3JvdXArKykgeworCQkvL2NsZWFyIHBlbmRpbmcgZXZlbnRzIGFuZCBpbnRlcnJ1cHQKKwkJREVCSXdyaXRlKGRldiwKKwkJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgMHhmZmZmKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTm93IHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIChkYXRhWzBdKQorICAgYW5kIHNldCB0aGUgc3ViZGV2aWNlLiBUbyBjb21wbGV0ZSB3aXRoIHRyaWdnZXIgYW5kIGludGVycnVwdAorICAgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwl1aW50MTZfdCBTZXR1cCA9IChMT0FEU1JDX0lORFggPDwgQkZfTE9BRFNSQykgfAkvLyBQcmVsb2FkIHVwb24KKwkJLy8gaW5kZXguCisJCShJTkRYU1JDX1NPRlQgPDwgQkZfSU5EWFNSQykgfAkvLyBEaXNhYmxlIGhhcmR3YXJlIGluZGV4LgorCQkoQ0xLU1JDX0NPVU5URVIgPDwgQkZfQ0xLU1JDKSB8CS8vIE9wZXJhdGluZyBtb2RlIGlzIENvdW50ZXIuCisJCShDTEtQT0xfUE9TIDw8IEJGX0NMS1BPTCkgfAkvLyBBY3RpdmUgaGlnaCBjbG9jay4KKwkJLy8oIENOVERJUl9VUCA8PCBCRl9DTEtQT0wgKSB8ICAgICAgLy8gQ291bnQgZGlyZWN0aW9uIGlzIERvd24uCisJCShDTEtNVUxUXzFYIDw8IEJGX0NMS01VTFQpIHwJLy8gQ2xvY2sgbXVsdGlwbGllciBpcyAxeC4KKwkJKENMS0VOQUJfSU5ERVggPDwgQkZfQ0xLRU5BQik7CisJLyogICB1aW50MTZfdCBEaXNhYmxlSW50U3JjPVRSVUU7ICovCisJLy8gdWludDMyX3QgUHJlbG9hZHZhbHVlOyAgICAgICAgICAgICAgLy9Db3VudGVyIGluaXRpYWwgdmFsdWUKKwl1aW50MTZfdCB2YWx1ZVNyY2xhdGNoID0gTEFUQ0hTUkNfQUJfUkVBRDsKKwl1aW50MTZfdCBlbmFiID0gQ0xLRU5BQl9BTFdBWVM7CisJZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl9jb25maWc6IGVuY29kZXIgY29uZmlnXG4iKTsKKworCS8vICAoZGF0YT09TlVMTCkgPyAoUHJlbG9hZHZhbHVlPTApIDogKFByZWxvYWR2YWx1ZT1kYXRhWzBdKTsKKworCWstPlNldE1vZGUoZGV2LCBrLCBTZXR1cCwgVFJVRSk7CisJUHJlbG9hZChkZXYsIGssICooaW5zbi0+ZGF0YSkpOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKwlTZXRMYXRjaFNvdXJjZShkZXYsIGssIHZhbHVlU3JjbGF0Y2gpOworCWstPlNldEVuYWJsZShkZXYsIGssICh1aW50MTZfdCkgKGVuYWIgIT0gMCkpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IG47CisJZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl9yZWFkOiBlbmNvZGVyIHJlYWQgY2hhbm5lbCAlZCBcbiIsCisJCUNSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKTsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWRhdGFbbl0gPSBSZWFkTGF0Y2goZGV2LCBrKTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3JlYWQ6IGVuY29kZXIgc2FtcGxlICVkXG4iLCBkYXRhW25dKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwllbmNfcHJpdmF0ZSAqayA9ICZlbmNwcml2W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3dyaXRlOiBlbmNvZGVyIHdyaXRlIGNoYW5uZWwgJWQgXG4iLAorCQlDUl9DSEFOKGluc24tPmNoYW5zcGVjKSk7CisKKwkvLyBTZXQgdGhlIHByZWxvYWQgcmVnaXN0ZXIKKwlQcmVsb2FkKGRldiwgaywgZGF0YVswXSk7CisKKwkvLyBTb2Z0d2FyZSBpbmRleCBwdWxzZSBmb3JjZXMgdGhlIHByZWxvYWQgcmVnaXN0ZXIgdG8gbG9hZAorCS8vIGludG8gdGhlIGNvdW50ZXIKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDApOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDIpOworCisJREVCVUcoInM2MjZfZW5jX2luc25fd3JpdGU6IEVuZCBlbmNvZGVyIHdyaXRlXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzNjI2X3RpbWVyX2xvYWQoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCBpbnQgdGljaykKK3sKKwl1aW50MTZfdCBTZXR1cCA9IChMT0FEU1JDX0lORFggPDwgQkZfTE9BRFNSQykgfAkvLyBQcmVsb2FkIHVwb24KKwkJLy8gaW5kZXguCisJCShJTkRYU1JDX1NPRlQgPDwgQkZfSU5EWFNSQykgfAkvLyBEaXNhYmxlIGhhcmR3YXJlIGluZGV4LgorCQkoQ0xLU1JDX1RJTUVSIDw8IEJGX0NMS1NSQykgfAkvLyBPcGVyYXRpbmcgbW9kZSBpcyBUaW1lci4KKwkJKENMS1BPTF9QT1MgPDwgQkZfQ0xLUE9MKSB8CS8vIEFjdGl2ZSBoaWdoIGNsb2NrLgorCQkoQ05URElSX0RPV04gPDwgQkZfQ0xLUE9MKSB8CS8vIENvdW50IGRpcmVjdGlvbiBpcyBEb3duLgorCQkoQ0xLTVVMVF8xWCA8PCBCRl9DTEtNVUxUKSB8CS8vIENsb2NrIG11bHRpcGxpZXIgaXMgMXguCisJCShDTEtFTkFCX0lOREVYIDw8IEJGX0NMS0VOQUIpOworCXVpbnQxNl90IHZhbHVlU3JjbGF0Y2ggPSBMQVRDSFNSQ19BX0lORFhBOworCS8vICB1aW50MTZfdCBlbmFiPUNMS0VOQUJfQUxXQVlTOworCisJay0+U2V0TW9kZShkZXYsIGssIFNldHVwLCBGQUxTRSk7CisKKwkvLyBTZXQgdGhlIHByZWxvYWQgcmVnaXN0ZXIKKwlQcmVsb2FkKGRldiwgaywgdGljayk7CisKKwkvLyBTb2Z0d2FyZSBpbmRleCBwdWxzZSBmb3JjZXMgdGhlIHByZWxvYWQgcmVnaXN0ZXIgdG8gbG9hZAorCS8vIGludG8gdGhlIGNvdW50ZXIKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDApOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKworCS8vc2V0IHJlbG9hZCBvbiBjb3VudGVyIG92ZXJmbG93CisJay0+U2V0TG9hZFRyaWcoZGV2LCBrLCAxKTsKKworCS8vc2V0IGludGVycnVwdCBvbiBvdmVyZmxvdworCWstPlNldEludFNyYyhkZXYsIGssIElOVFNSQ19PVkVSKTsKKworCVNldExhdGNoU291cmNlKGRldiwgaywgdmFsdWVTcmNsYXRjaCk7CisJLy8gIGstPlNldEVuYWJsZShkZXYsaywodWludDE2X3QpKGVuYWIgIT0gMCkpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBEQUMgRlVOQ1RJT05TIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gU2xvdCAwIGJhc2Ugc2V0dGluZ3MuCisjZGVmaW5lIFZFQ1QwCSggWFNEMiB8IFJTRDMgfCBTSUJfQTIgKQkvLyBTbG90IDAgYWx3YXlzIHNoaWZ0cyBpbgorCQkJCQkgLy8gMHhGRiBhbmQgc3RvcmUgaXQgdG8KKwkJCQkJIC8vIEZCX0JVRkZFUjIuCisKKy8vIFRyaW1EYWMgTG9naWNhbENoYW4tdG8tUGh5c2ljYWxDaGFuIG1hcHBpbmcgdGFibGUuCitzdGF0aWMgdWludDhfdCB0cmltY2hhbltdID0geyAxMCwgOSwgOCwgMywgMiwgNywgNiwgMSwgMCwgNSwgNCB9OworCisvLyBUcmltRGFjIExvZ2ljYWxDaGFuLXRvLUVlcHJvbUFkcnMgbWFwcGluZyB0YWJsZS4KK3N0YXRpYyB1aW50OF90IHRyaW1hZHJzW10gPQorCXsgMHg0MCwgMHg0MSwgMHg0MiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MyB9OworCitzdGF0aWMgdm9pZCBMb2FkVHJpbURBQ3MoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlyZWdpc3RlciB1aW50OF90IGk7CisKKwkvLyBDb3B5IFRyaW1EYWMgc2V0cG9pbnQgdmFsdWVzIGZyb20gRUVQUk9NIHRvIFRyaW1EYWNzLgorCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHRyaW1jaGFuKSAvIHNpemVvZih0cmltY2hhblswXSkpOyBpKyspCisJCVdyaXRlVHJpbURBQyhkZXYsIGksIEkyQ3JlYWQoZGV2LCB0cmltYWRyc1tpXSkpOworfQorCitzdGF0aWMgdm9pZCBXcml0ZVRyaW1EQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBMb2dpY2FsQ2hhbiwKKwl1aW50OF90IERhY0RhdGEpCit7CisJdWludDMyX3QgY2hhbjsKKworCS8vIFNhdmUgdGhlIG5ldyBzZXRwb2ludCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWFkIGl0IGJhY2sgbGF0ZXIuCisJZGV2cHJpdi0+VHJpbVNldHBvaW50W0xvZ2ljYWxDaGFuXSA9ICh1aW50OF90KSBEYWNEYXRhOworCisJLy8gTWFwIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgdG8gcGh5c2ljYWwgY2hhbm5lbCBudW1iZXIuCisJY2hhbiA9ICh1aW50MzJfdCkgdHJpbWNoYW5bTG9naWNhbENoYW5dOworCisJLy8gU2V0IHVwIFRTTDIgcmVjb3JkcyBmb3IgVHJpbURhYyB3cml0ZSBvcGVyYXRpb24uICBBbGwgc2xvdHMgc2hpZnQKKwkvLyAweEZGIGluIGZyb20gcHVsbGVkLXVwIFNEMyBzbyB0aGF0IHRoZSBlbmQgb2YgdGhlIHNsb3Qgc2VxdWVuY2UKKwkvLyBjYW4gYmUgZGV0ZWN0ZWQuCisJU0VUVkVDVCgyLCBYU0QyIHwgWEZJRk9fMSB8IFdTMyk7CS8vIFNsb3QgMjogU2VuZCBoaWdoIHVpbnQ4X3QKKwkvLyB0byB0YXJnZXQgVHJpbURhYy4KKwlTRVRWRUNUKDMsIFhTRDIgfCBYRklGT18wIHwgV1MzKTsJLy8gU2xvdCAzOiBTZW5kIGxvdyB1aW50OF90IHRvCisJLy8gdGFyZ2V0IFRyaW1EYWMuCisJU0VUVkVDVCg0LCBYU0QyIHwgWEZJRk9fMyB8IFdTMSk7CS8vIFNsb3QgNDogU2VuZCBOT1AgaGlnaAorCS8vIHVpbnQ4X3QgdG8gREFDMCB0byBrZWVwCisJLy8gY2xvY2sgcnVubmluZy4KKwlTRVRWRUNUKDUsIFhTRDIgfCBYRklGT18yIHwgV1MxIHwgRU9TKTsJLy8gU2xvdCA1OiBTZW5kIE5PUCBsb3cKKwkvLyB1aW50OF90IHRvIERBQzAuCisKKwkvLyBDb25zdHJ1Y3QgYW5kIHRyYW5zbWl0IHRhcmdldCBEQUMncyBzZXJpYWwgcGFja2V0OiAoIDAwMDAgQUFBQQorCS8vICksKCBEREREIEREREQgKSwoIDB4MDAgKSwoIDB4MDAgKSB3aGVyZSBBPDM6MD4gaXMgdGhlIERBQworCS8vIGNoYW5uZWwncyBhZGRyZXNzLCBhbmQgRDw3OjA+IGlzIHRoZSBEQUMgc2V0cG9pbnQuICBBcHBlbmQgYSBXT1JECisJLy8gdmFsdWUgKHRoYXQgd3JpdGVzIGEgY2hhbm5lbCAwIE5PUCBjb21tYW5kIHRvIGEgbm9uLWV4aXN0ZW50IG1haW4KKwkvLyBEQUMgY2hhbm5lbCkgdGhhdCBzZXJ2ZXMgdG8ga2VlcCB0aGUgY2xvY2sgcnVubmluZyBhZnRlciB0aGUKKwkvLyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgdGFyZ2V0IERBQy4KKworCVNlbmREQUMoZGV2LCAoKHVpbnQzMl90KSBjaGFuIDw8IDgpCS8vIEFkZHJlc3MgdGhlIERBQyBjaGFubmVsCisJCS8vIHdpdGhpbiB0aGUgdHJpbWRhYyBkZXZpY2UuCisJCXwgKHVpbnQzMl90KSBEYWNEYXRhKTsJLy8gSW5jbHVkZSBEQUMgc2V0cG9pbnQgZGF0YS4KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLyAgRUVQUk9NIEFDQ0VTUyBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWFkIHVpbnQ4X3QgZnJvbSBFRVBST00uCisKK3N0YXRpYyB1aW50OF90IEkyQ3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBhZGRyKQoreworCXVpbnQ4X3QgcnRudmFsOworCisJLy8gU2VuZCBFRVBST00gdGFyZ2V0IGFkZHJlc3MuCisJaWYgKEkyQ2hhbmRzaGFrZShkZXYsIEkyQ19CMihJMkNfQVRUUlNUQVJULCBJMkNXKQkvLyBCeXRlMiA9IEkyQworCQkJLy8gY29tbWFuZDoKKwkJCS8vIHdyaXRlIHRvCisJCQkvLyBJMkMgRUVQUk9NCisJCQkvLyBkZXZpY2UuCisJCQl8IEkyQ19CMShJMkNfQVRUUlNUT1AsIGFkZHIpCS8vIEJ5dGUxID0gRUVQUk9NCisJCQkvLyBpbnRlcm5hbCB0YXJnZXQKKwkJCS8vIGFkZHJlc3MuCisJCQl8IEkyQ19CMChJMkNfQVRUUk5PUCwgMCkpKQkvLyBCeXRlMCA9IE5vdAorCQkvLyBzZW50LgorCXsKKwkJLy8gQWJvcnQgZnVuY3Rpb24gYW5kIGRlY2xhcmUgZXJyb3IgaWYgaGFuZHNoYWtlIGZhaWxlZC4KKwkJREVCVUcoIkkyQ3JlYWQ6IGVycm9yIGhhbmRzaGFrZSBJMkNyZWFkICBhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIEV4ZWN1dGUgRUVQUk9NIHJlYWQuCisJaWYgKEkyQ2hhbmRzaGFrZShkZXYsIEkyQ19CMihJMkNfQVRUUlNUQVJULCBJMkNSKQkvLyBCeXRlMiA9IEkyQworCQkJLy8gY29tbWFuZDogcmVhZAorCQkJLy8gZnJvbSBJMkMgRUVQUk9NCisJCQkvLyBkZXZpY2UuCisJCQl8IEkyQ19CMShJMkNfQVRUUlNUT1AsIDApCS8vIEJ5dGUxIHJlY2VpdmVzCisJCQkvLyB1aW50OF90IGZyb20KKwkJCS8vIEVFUFJPTS4KKwkJCXwgSTJDX0IwKEkyQ19BVFRSTk9QLCAwKSkpCS8vIEJ5dGUwID0gTm90CisJCS8vIHNlbnQuCisJeworCQkvLyBBYm9ydCBmdW5jdGlvbiBhbmQgZGVjbGFyZSBlcnJvciBpZiBoYW5kc2hha2UgZmFpbGVkLgorCQlERUJVRygiSTJDcmVhZDogZXJyb3IgaGFuZHNoYWtlIEkyQ3JlYWQgYlxuIik7CisJCXJldHVybiAwOworCX0KKwkvLyBSZXR1cm4gY29weSBvZiBFRVBST00gdmFsdWUuCisJcnRudmFsID0gKHVpbnQ4X3QpIChSUjcxNDYoUF9JMkNDVFJMKSA+PiAxNik7CisJcmV0dXJuIHJ0bnZhbDsKK30KKworc3RhdGljIHVpbnQzMl90IEkyQ2hhbmRzaGFrZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MzJfdCB2YWwpCit7CisJLy8gV3JpdGUgSTJDIGNvbW1hbmQgdG8gSTJDIFRyYW5zZmVyIENvbnRyb2wgc2hhZG93IHJlZ2lzdGVyLgorCVdSNzE0NihQX0kyQ0NUUkwsIHZhbCk7CisKKwkvLyBVcGxvYWQgSTJDIHNoYWRvdyByZWdpc3RlcnMgaW50byB3b3JraW5nIHJlZ2lzdGVycyBhbmQgd2FpdCBmb3IKKwkvLyB1cGxvYWQgY29uZmlybWF0aW9uLgorCisJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9JSUMpOworCXdoaWxlICghTUNfVEVTVChQX01DMiwgTUMyX1VQTERfSUlDKSkgOworCisJLy8gV2FpdCB1bnRpbCBJMkMgYnVzIHRyYW5zZmVyIGlzIGZpbmlzaGVkIG9yIGFuIGVycm9yIG9jY3Vycy4KKwl3aGlsZSAoKFJSNzE0NihQX0kyQ0NUUkwpICYgKEkyQ19CVVNZIHwgSTJDX0VSUikpID09IEkyQ19CVVNZKSA7CisKKwkvLyBSZXR1cm4gbm9uLXplcm8gaWYgSTJDIGVycm9yIG9jY3VyZWQuCisJcmV0dXJuIFJSNzE0NihQX0kyQ0NUUkwpICYgSTJDX0VSUjsKKworfQorCisvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogV3JpdGUgc2V0cG9pbnQgdG8gYW4gYXBwbGljYXRpb24gREFDIGNoYW5uZWwuCisKK3N0YXRpYyB2b2lkIFNldERBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBjaGFuLCBzaG9ydCBkYWNkYXRhKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IHNpZ25tYXNrOworCXJlZ2lzdGVyIHVpbnQzMl90IFdTSW1hZ2U7CisKKwkvLyBBZGp1c3QgREFDIGRhdGEgcG9sYXJpdHkgYW5kIHNldCB1cCBQb2xhcml0eSBDb250cm9sIFJlZ2lzdGVyCisJLy8gaW1hZ2UuCisJc2lnbm1hc2sgPSAxIDw8IGNoYW47CisJaWYgKGRhY2RhdGEgPCAwKSB7CisJCWRhY2RhdGEgPSAtZGFjZGF0YTsKKwkJZGV2cHJpdi0+RGFjcG9sIHw9IHNpZ25tYXNrOworCX0gZWxzZQorCQlkZXZwcml2LT5EYWNwb2wgJj0gfnNpZ25tYXNrOworCisJLy8gTGltaXQgREFDIHNldHBvaW50IHZhbHVlIHRvIHZhbGlkIHJhbmdlLgorCWlmICgodWludDE2X3QpIGRhY2RhdGEgPiAweDFGRkYpCisJCWRhY2RhdGEgPSAweDFGRkY7CisKKwkvLyBTZXQgdXAgVFNMMiByZWNvcmRzIChha2EgInZlY3RvcnMiKSBmb3IgREFDIHVwZGF0ZS4gIFZlY3RvcnMgVjIKKwkvLyBhbmQgVjMgdHJhbnNtaXQgdGhlIHNldHBvaW50IHRvIHRoZSB0YXJnZXQgREFDLiAgVjQgYW5kIFY1IHNlbmQKKwkvLyBkYXRhIHRvIGEgbm9uLWV4aXN0ZW50IFRyaW1EYWMgY2hhbm5lbCBqdXN0IHRvIGtlZXAgdGhlIGNsb2NrCisJLy8gcnVubmluZyBhZnRlciBzZW5kaW5nIGRhdGEgdG8gdGhlIHRhcmdldCBEQUMuICBUaGlzIGlzIG5lY2Vzc2FyeQorCS8vIHRvIGVsaW1pbmF0ZSB0aGUgY2xvY2sgZ2xpdGNoIHRoYXQgd291bGQgb3RoZXJ3aXNlIG9jY3VyIGF0IHRoZQorCS8vIGVuZCBvZiB0aGUgdGFyZ2V0IERBQydzIHNlcmlhbCBkYXRhIHN0cmVhbS4gIFdoZW4gdGhlIHNlcXVlbmNlCisJLy8gcmVzdGFydHMgYXQgVjAgKGFmdGVyIGV4ZWN1dGluZyBWNSksIHRoZSBnYXRlIGFycmF5IGF1dG9tYXRpY2FsbHkKKwkvLyBkaXNhYmxlcyBnYXRpbmcgZm9yIHRoZSBEQUMgY2xvY2sgYW5kIGFsbCBEQUMgY2hpcCBzZWxlY3RzLgorCVdTSW1hZ2UgPSAoY2hhbiAmIDIpID8gV1MxIDogV1MyOwkvLyBDaG9vc2UgREFDIGNoaXAgc2VsZWN0IHRvCisJLy8gYmUgYXNzZXJ0ZWQuCisJU0VUVkVDVCgyLCBYU0QyIHwgWEZJRk9fMSB8IFdTSW1hZ2UpOwkvLyBTbG90IDI6IFRyYW5zbWl0IGhpZ2gKKwkvLyBkYXRhIGJ5dGUgdG8gdGFyZ2V0IERBQy4KKwlTRVRWRUNUKDMsIFhTRDIgfCBYRklGT18wIHwgV1NJbWFnZSk7CS8vIFNsb3QgMzogVHJhbnNtaXQgbG93IGRhdGEKKwkvLyBieXRlIHRvIHRhcmdldCBEQUMuCisJU0VUVkVDVCg0LCBYU0QyIHwgWEZJRk9fMyB8IFdTMyk7CS8vIFNsb3QgNDogVHJhbnNtaXQgdG8KKwkvLyBub24tZXhpc3RlbnQgVHJpbURhYworCS8vIGNoYW5uZWwgdG8ga2VlcCBjbG9jaworCVNFVFZFQ1QoNSwgWFNEMiB8IFhGSUZPXzIgfCBXUzMgfCBFT1MpOwkvLyBTbG90IDU6IHJ1bm5pbmcgYWZ0ZXIKKwkvLyB3cml0aW5nIHRhcmdldCBEQUMncworCS8vIGxvdyBkYXRhIGJ5dGUuCisKKwkvLyBDb25zdHJ1Y3QgYW5kIHRyYW5zbWl0IHRhcmdldCBEQUMncyBzZXJpYWwgcGFja2V0OiAoIEExMEQgRERERAorCS8vICksKCBEREREIEREREQgKSwoIDB4MEYgKSwoIDB4MDAgKSB3aGVyZSBBIGlzIGNoYW48MD4sIGFuZCBEPDEyOjA+CisJLy8gaXMgdGhlIERBQyBzZXRwb2ludC4gIEFwcGVuZCBhIFdPUkQgdmFsdWUgKHRoYXQgd3JpdGVzIHRvIGEKKwkvLyBub24tZXhpc3RlbnQgVHJpbURhYyBjaGFubmVsKSB0aGF0IHNlcnZlcyB0byBrZWVwIHRoZSBjbG9jaworCS8vIHJ1bm5pbmcgYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSB0YXJnZXQgREFDLgorCVNlbmREQUMoZGV2LCAweDBGMDAwMDAwCS8vQ29udGludWUgY2xvY2sgYWZ0ZXIgdGFyZ2V0IERBQworCQkvL2RhdGEgKHdyaXRlIHRvIG5vbi1leGlzdGVudAorCQkvL3RyaW1kYWMpLgorCQl8IDB4MDAwMDQwMDAJLy8gQWRkcmVzcyB0aGUgdHdvIG1haW4gZHVhbC1EQUMKKwkJLy8gZGV2aWNlcyAoVFNMJ3MgY2hpcCBzZWxlY3QgZW5hYmxlcworCQkvLyB0YXJnZXQgZGV2aWNlKS4KKwkJfCAoKHVpbnQzMl90KSAoY2hhbiAmIDEpIDw8IDE1KQkvLyBBZGRyZXNzIHRoZSBEQUMKKwkJLy8gY2hhbm5lbCB3aXRoaW4gdGhlCisJCS8vIGRldmljZS4KKwkJfCAodWludDMyX3QpIGRhY2RhdGEpOwkvLyBJbmNsdWRlIERBQyBzZXRwb2ludCBkYXRhLgorCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogVHJhbnNtaXQgc2VyaWFsIGRhdGEgdG8gREFDIHZpYSBBdWRpbworLy8gY2hhbm5lbCAyLiAgQXNzdW1lczogKDEpIFRTTDIgc2xvdCByZWNvcmRzIGluaXRpYWxpemVkLCBhbmQgKDIpCisvLyBEYWNwb2wgY29udGFpbnMgdmFsaWQgdGFyZ2V0IGltYWdlLgorCitzdGF0aWMgdm9pZCBTZW5kREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCkKK3sKKworCS8vIFNUQVJUIFRIRSBTRVJJQUwgQ0xPQ0sgUlVOTklORyAtLS0tLS0tLS0tLS0tCisKKwkvLyBBc3NlcnQgREFDIHBvbGFyaXR5IGNvbnRyb2wgYW5kIGVuYWJsZSBnYXRpbmcgb2YgREFDIHNlcmlhbCBjbG9jaworCS8vIGFuZCBhdWRpbyBiaXQgc3RyZWFtIHNpZ25hbHMuICBBdCB0aGlzIHBvaW50IGluIHRpbWUgd2UgbXVzdCBiZQorCS8vIGFzc3VyZWQgb2YgYmVpbmcgaW4gdGltZSBzbG90IDAuICBJZiB3ZSBhcmUgbm90IGluIHNsb3QgMCwgdGhlCisJLy8gc2VyaWFsIGNsb2NrIGFuZCBhdWRpbyBzdHJlYW0gc2lnbmFscyB3aWxsIGJlIGRpc2FibGVkOyB0aGlzIGlzCisJLy8gYmVjYXVzZSB0aGUgZm9sbG93aW5nIERFQkl3cml0ZSBzdGF0ZW1lbnQgKHdoaWNoIGVuYWJsZXMgc2lnbmFscworCS8vIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBnYXRlIGFycmF5KSB3b3VsZCBleGVjdXRlIGJlZm9yZSB0aGUKKwkvLyB0cmFpbGluZyBlZGdlIG9mIFdTMS9XUzMgKHdoaWNoIHR1cm5zIG9mZiB0aGUgc2lnbmFscyksIHRodXMKKwkvLyBjYXVzaW5nIHRoZSBzaWduYWxzIHRvIGJlIGluYWN0aXZlIGR1cmluZyB0aGUgREFDIHdyaXRlLgorCURFQkl3cml0ZShkZXYsIExQX0RBQ1BPTCwgZGV2cHJpdi0+RGFjcG9sKTsKKworCS8vIFRSQU5TRkVSIE9VVFBVVCBEV09SRCBWQUxVRSBJTlRPIEEyJ1MgT1VUUFVUIEZJRk8gLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gQ29weSBEQUMgc2V0cG9pbnQgdmFsdWUgdG8gREFDJ3Mgb3V0cHV0IERNQSBidWZmZXIuCisKKwkvL1dSNzE0NiggKHVpbnQzMl90KWRldnByaXYtPnBEYWNXQnVmLCB2YWwgKTsKKwkqZGV2cHJpdi0+cERhY1dCdWYgPSB2YWw7CisKKwkvLyBlbmFiIHRoZSBvdXRwdXQgRE1BIHRyYW5zZmVyLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBETUFDIHRvIGNvcHkKKwkvLyB0aGUgREFDJ3MgZGF0YSB2YWx1ZSB0byBBMidzIG91dHB1dCBGSUZPLiAgVGhlIERNQSB0cmFuc2ZlciB3aWxsCisJLy8gdGhlbiBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgYmVjYXVzZSB0aGUgcHJvdGVjdGlvbiBhZGRyZXNzIGlzCisJLy8gcmVhY2hlZCB1cG9uIHRyYW5zZmVyIG9mIHRoZSBmaXJzdCBEV09SRCB2YWx1ZS4KKwlNQ19FTkFCTEUoUF9NQzEsIE1DMV9BMk9VVCk7CisKKwkvLyBXaGlsZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGV4ZWN1dGluZyAuLi4KKworCS8vIFJlc2V0IEF1ZGlvMiBvdXRwdXQgRklGTydzIHVuZGVyZmxvdyBmbGFnIChhbG9uZyB3aXRoIGFueSBvdGhlcgorCS8vIEZJRk8gdW5kZXJmbG93L292ZXJmbG93IGZsYWdzKS4gIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbAorCS8vIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBlbWVyZ2VkIGZyb20gc2xvdCAwLgorCVdSNzE0NihQX0lTUiwgSVNSX0FGT1UpOworCisJLy8gV2FpdCBmb3IgdGhlIERNQSB0cmFuc2ZlciB0byBmaW5pc2ggc28gdGhhdCB0aGVyZSB3aWxsIGJlIGRhdGEKKwkvLyBhdmFpbGFibGUgaW4gdGhlIEZJRk8gd2hlbiB0aW1lIHNsb3QgMSB0cmllcyB0byB0cmFuc2ZlciBhIERXT1JECisJLy8gZnJvbSB0aGUgRklGTyB0byB0aGUgb3V0cHV0IGJ1ZmZlciByZWdpc3Rlci4gIFdlIHRlc3QgZm9yIERNQQorCS8vIERvbmUgYnkgcG9sbGluZyB0aGUgRE1BQyBlbmFibGUgZmxhZzsgdGhpcyBmbGFnIGlzIGF1dG9tYXRpY2FsbHkKKwkvLyBjbGVhcmVkIHdoZW4gdGhlIHRyYW5zZmVyIGhhcyBmaW5pc2hlZC4KKwl3aGlsZSAoKFJSNzE0NihQX01DMSkgJiBNQzFfQTJPVVQpICE9IDApIDsKKworCS8vIFNUQVJUIFRIRSBPVVRQVVQgU1RSRUFNIFRPIFRIRSBUQVJHRVQgREFDIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBGSUZPIGRhdGEgaXMgbm93IGF2YWlsYWJsZSwgc28gd2UgZW5hYmxlIGV4ZWN1dGlvbiBvZiB0aW1lIHNsb3RzCisJLy8gMSBhbmQgaGlnaGVyIGJ5IGNsZWFyaW5nIHRoZSBFT1MgZmxhZyBpbiBzbG90IDAuICBOb3RlIHRoYXQgU0QzCisJLy8gd2lsbCBiZSBzaGlmdGVkIGluIGFuZCBzdG9yZWQgaW4gRkJfQlVGRkVSMiBmb3IgZW5kLW9mLXNsb3QtbGlzdAorCS8vIGRldGVjdGlvbi4KKwlTRVRWRUNUKDAsIFhTRDIgfCBSU0QzIHwgU0lCX0EyKTsKKworCS8vIFdhaXQgZm9yIHNsb3QgMSB0byBleGVjdXRlIHRvIGVuc3VyZSB0aGF0IHRoZSBQYWNrZXQgd2lsbCBiZQorCS8vIHRyYW5zbWl0dGVkLiAgVGhpcyBpcyBkZXRlY3RlZCBieSBwb2xsaW5nIHRoZSBBdWRpbzIgb3V0cHV0IEZJRk8KKwkvLyB1bmRlcmZsb3cgZmxhZywgd2hpY2ggd2lsbCBiZSBzZXQgd2hlbiBzbG90IDEgZXhlY3V0aW9uIGhhcworCS8vIGZpbmlzaGVkIHRyYW5zZmVycmluZyB0aGUgREFDJ3MgZGF0YSBEV09SRCBmcm9tIHRoZSBvdXRwdXQgRklGTworCS8vIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHJlZ2lzdGVyLgorCXdoaWxlICgoUlI3MTQ2KFBfU1NSKSAmIFNTUl9BRjJfT1VUKSA9PSAwKSA7CisKKwkvLyBTZXQgdXAgdG8gdHJhcCBleGVjdXRpb24gYXQgc2xvdCAwIHdoZW4gdGhlIFRTTCBzZXF1ZW5jZXIgY3ljbGVzCisJLy8gYmFjayB0byBzbG90IDAgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBFT1MgaW4gc2xvdCA1LiAgQWxzbywKKwkvLyBzaW11bHRhbmVvdXNseSBzaGlmdCBvdXQgYW5kIGluIHRoZSAweDAwIHRoYXQgaXMgQUxXQVlTIHRoZSB2YWx1ZQorCS8vIHN0b3JlZCBpbiB0aGUgbGFzdCBieXRlIHRvIGJlIHNoaWZ0ZWQgb3V0IG9mIHRoZSBGSUZPJ3MgRFdPUkQKKwkvLyBidWZmZXIgcmVnaXN0ZXIuCisJU0VUVkVDVCgwLCBYU0QyIHwgWEZJRk9fMiB8IFJTRDIgfCBTSUJfQTIgfCBFT1MpOworCisJLy8gV0FJVCBGT1IgVEhFIFRSQU5TQUNUSU9OIFRPIEZJTklTSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gV2FpdCBmb3IgdGhlIFRTTCB0byBmaW5pc2ggZXhlY3V0aW5nIGFsbCB0aW1lIHNsb3RzIGJlZm9yZQorCS8vIGV4aXRpbmcgdGhpcyBmdW5jdGlvbi4gIFdlIG11c3QgZG8gdGhpcyBzbyB0aGF0IHRoZSBuZXh0IERBQworCS8vIHdyaXRlIGRvZXNuJ3Qgc3RhcnQsIHRoZXJlYnkgZW5hYmxpbmcgY2xvY2svY2hpcCBzZWxlY3Qgc2lnbmFsczoKKwkvLyAxLiBCZWZvcmUgdGhlIFRTTCBzZXF1ZW5jZSBjeWNsZXMgYmFjayB0byBzbG90IDAsIHdoaWNoIGRpc2FibGVzCisJLy8gdGhlIGNsb2NrL2NzIHNpZ25hbCBnYXRpbmcgYW5kIHRyYXBzIHNsb3QgLy8gbGlzdCBleGVjdXRpb24uICBJZgorCS8vIHdlIGhhdmUgbm90IHlldCBmaW5pc2hlZCBzbG90IDUgdGhlbiB0aGUgY2xvY2svY3Mgc2lnbmFscyBhcmUKKwkvLyBzdGlsbCBnYXRlZCBhbmQgd2UgaGF2ZSAvLyBub3QgZmluaXNoZWQgdHJhbnNtaXR0aW5nIHRoZSBzdHJlYW0uCisJLy8gMi4gV2hpbGUgc2xvdHMgMi01IGFyZSBleGVjdXRpbmcgZHVlIHRvIGEgbGF0ZSBzbG90IDAgdHJhcC4gIEluCisJLy8gdGhpcyBjYXNlLCB0aGUgc2xvdCBzZXF1ZW5jZSBpcyBjdXJyZW50bHkgLy8gcmVwZWF0aW5nLCBidXQgd2l0aAorCS8vIGNsb2NrL2NzIHNpZ25hbHMgZGlzYWJsZWQuICBXZSBtdXN0IHdhaXQgZm9yIHNsb3QgMCB0byB0cmFwCisJLy8gZXhlY3V0aW9uIGJlZm9yZSBzZXR0aW5nIC8vIHVwIHRoZSBuZXh0IERBQyBzZXRwb2ludCBETUEgdHJhbnNmZXIKKwkvLyBhbmQgZW5hYmxpbmcgdGhlIGNsb2NrL2NzIHNpZ25hbHMuICBUbyBkZXRlY3QgdGhlIGVuZCBvZiBzbG90IDUsCisJLy8gd2UgdGVzdCBmb3IgdGhlIEZCX0JVRkZFUjIgTVNCIGNvbnRlbnRzIHRvIGJlIGVxdWFsIHRvIDB4RkYuICBJZgorCS8vIHRoZSBUU0wgaGFzIG5vdCB5ZXQgZmluaXNoZWQgZXhlY3V0aW5nIHNsb3QgNSAuLi4KKwlpZiAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgIT0gMCkgeworCQkvLyBUaGUgdHJhcCB3YXMgc2V0IG9uIHRpbWUgYW5kIHdlIGFyZSBzdGlsbCBleGVjdXRpbmcgc29tZXdoZXJlCisJCS8vIGluIHNsb3RzIDItNSwgc28gd2Ugbm93IHdhaXQgZm9yIHNsb3QgMCB0byBleGVjdXRlIGFuZCB0cmFwCisJCS8vIFRTTCBleGVjdXRpb24uICBUaGlzIGlzIGRldGVjdGVkIHdoZW4gRkJfQlVGRkVSMiBNU0IgY2hhbmdlcworCQkvLyBmcm9tIDB4RkYgdG8gMHgwMCwgd2hpY2ggc2xvdCAwIGNhdXNlcyB0byBoYXBwZW4gYnkgc2hpZnRpbmcKKwkJLy8gb3V0L2luIG9uIFNEMiB0aGUgMHgwMCB0aGF0IGlzIGFsd2F5cyByZWZlcmVuY2VkIGJ5IHNsb3QgNS4KKwkJd2hpbGUgKChSUjcxNDYoUF9GQl9CVUZGRVIyKSAmIDB4RkYwMDAwMDApICE9IDApIDsKKwl9CisJLy8gRWl0aGVyICgxKSB3ZSB3ZXJlIHRvbyBsYXRlIHNldHRpbmcgdGhlIHNsb3QgMCB0cmFwOyB0aGUgVFNMCisJLy8gc2VxdWVuY2VyIHJlc3RhcnRlZCBzbG90IDAgYmVmb3JlIHdlIGNvdWxkIHNldCB0aGUgRU9TIHRyYXAgZmxhZywKKwkvLyBvciAoMikgd2Ugd2VyZSBub3QgbGF0ZSBhbmQgZXhlY3V0aW9uIGlzIG5vdyB0cmFwcGVkIGF0IHNsb3QgMC4KKwkvLyBJbiBlaXRoZXIgY2FzZSwgd2UgbXVzdCBub3cgY2hhbmdlIHNsb3QgMCBzbyB0aGF0IGl0IHdpbGwgc3RvcmUKKwkvLyB2YWx1ZSAweEZGIChpbnN0ZWFkIG9mIDB4MDApIHRvIEZCX0JVRkZFUjIgbmV4dCB0aW1lIGl0IGV4ZWN1dGVzLgorCS8vIEluIG9yZGVyIHRvIGRvIHRoaXMsIHdlIHJlcHJvZ3JhbSBzbG90IDAgc28gdGhhdCBpdCB3aWxsIHNoaWZ0IGluCisJLy8gU0QzLCB3aGljaCBpcyBkcml2ZW4gb25seSBieSBhIHB1bGwtdXAgcmVzaXN0b3IuCisJU0VUVkVDVCgwLCBSU0QzIHwgU0lCX0EyIHwgRU9TKTsKKworCS8vIFdhaXQgZm9yIHNsb3QgMCB0byBleGVjdXRlLCBhdCB3aGljaCB0aW1lIHRoZSBUU0wgaXMgc2V0dXAgZm9yCisJLy8gdGhlIG5leHQgREFDIHdyaXRlLiAgVGhpcyBpcyBkZXRlY3RlZCB3aGVuIEZCX0JVRkZFUjIgTVNCIGNoYW5nZXMKKwkvLyBmcm9tIDB4MDAgdG8gMHhGRi4KKwl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgPT0gMCkgOworfQorCitzdGF0aWMgdm9pZCBXcml0ZU1JU0MyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IE5ld0ltYWdlKQoreworCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9XRU5BQkxFKTsJLy8gZW5hYiB3cml0ZXMgdG8KKwkvLyBNSVNDMiByZWdpc3Rlci4KKwlERUJJd3JpdGUoZGV2LCBMUF9XUk1JU0MyLCBOZXdJbWFnZSk7CS8vIFdyaXRlIG5ldyBpbWFnZSB0byBNSVNDMi4KKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfV0RJU0FCTEUpOwkvLyBEaXNhYmxlIHdyaXRlcyB0byBNSVNDMi4KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbml0aWFsaXplIHRoZSBERUJJIGludGVyZmFjZSBmb3IgYWxsIHRyYW5zZmVycy4KKworc3RhdGljIHVpbnQxNl90IERFQklyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIpCit7CisJdWludDE2X3QgcmV0dmFsOworCisJLy8gU2V0IHVwIERFQkkgY29udHJvbCByZWdpc3RlciB2YWx1ZSBpbiBzaGFkb3cgUkFNLgorCVdSNzE0NihQX0RFQklDTUQsIERFQklfQ01EX1JEV09SRCB8IGFkZHIpOworCisJLy8gRXhlY3V0ZSB0aGUgREVCSSB0cmFuc2Zlci4KKwlERUJJdHJhbnNmZXIoZGV2KTsKKworCS8vIEZldGNoIHRhcmdldCByZWdpc3RlciB2YWx1ZS4KKwlyZXR2YWwgPSAodWludDE2X3QpIFJSNzE0NihQX0RFQklBRCk7CisKKwkvLyBSZXR1cm4gcmVnaXN0ZXIgdmFsdWUuCisJcmV0dXJuIHJldHZhbDsKK30KKworLy8gRXhlY3V0ZSBhIERFQkkgdHJhbnNmZXIuICBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEKKy8vIGNyaXRpY2FsIHNlY3Rpb24uCitzdGF0aWMgdm9pZCBERUJJdHJhbnNmZXIoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwkvLyBJbml0aWF0ZSB1cGxvYWQgb2Ygc2hhZG93IFJBTSB0byBERUJJIGNvbnRyb2wgcmVnaXN0ZXIuCisJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9ERUJJKTsKKworCS8vIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgdXBsb2FkIGZyb20gc2hhZG93IFJBTSB0byBERUJJIGNvbnRyb2wKKwkvLyByZWdpc3Rlci4KKwl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0RFQkkpKSA7CisKKwkvLyBXYWl0IHVudGlsIERFQkkgdHJhbnNmZXIgaXMgZG9uZS4KKwl3aGlsZSAoUlI3MTQ2KFBfUFNSKSAmIFBTUl9ERUJJX1MpIDsKK30KKworLy8gV3JpdGUgYSB2YWx1ZSB0byBhIGdhdGUgYXJyYXkgcmVnaXN0ZXIuCitzdGF0aWMgdm9pZCBERUJJd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3Qgd2RhdGEpCit7CisKKwkvLyBTZXQgdXAgREVCSSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlIGluIHNoYWRvdyBSQU0uCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfV1JXT1JEIHwgYWRkcik7CisJV1I3MTQ2KFBfREVCSUFELCB3ZGF0YSk7CisKKwkvLyBFeGVjdXRlIHRoZSBERUJJIHRyYW5zZmVyLgorCURFQkl0cmFuc2ZlcihkZXYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVwbGFjZSB0aGUgc3BlY2lmaWVkIGJpdHMgaW4gYSBnYXRlIGFycmF5IHJlZ2lzdGVyLiAgSW1wb3J0czogbWFzaworLy8gc3BlY2lmaWVzIGJpdHMgdGhhdCBhcmUgdG8gYmUgcHJlc2VydmVkLCB3ZGF0YSBpcyBuZXcgdmFsdWUgdG8gYmUKKy8vIG9yJ2Qgd2l0aCB0aGUgbWFza2VkIG9yaWdpbmFsLgorc3RhdGljIHZvaWQgREVCSXJlcGxhY2UoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3QgbWFzaywKKwl1aW50MTZfdCB3ZGF0YSkKK3sKKworCS8vIENvcHkgdGFyZ2V0IGdhdGUgYXJyYXkgcmVnaXN0ZXIgaW50byBQX0RFQklBRCByZWdpc3Rlci4KKwlXUjcxNDYoUF9ERUJJQ01ELCBERUJJX0NNRF9SRFdPUkQgfCBhZGRyKTsJLy8gU2V0IHVwIERFQkkgY29udHJvbAorCS8vIHJlZyB2YWx1ZSBpbiBzaGFkb3cKKwkvLyBSQU0uCisJREVCSXRyYW5zZmVyKGRldik7CS8vIEV4ZWN1dGUgdGhlIERFQkkKKwkvLyBSZWFkIHRyYW5zZmVyLgorCisJLy8gV3JpdGUgYmFjayB0aGUgbW9kaWZpZWQgaW1hZ2UuCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfV1JXT1JEIHwgYWRkcik7CS8vIFNldCB1cCBERUJJIGNvbnRyb2wKKwkvLyByZWcgdmFsdWUgaW4gc2hhZG93CisJLy8gUkFNLgorCisJV1I3MTQ2KFBfREVCSUFELCB3ZGF0YSB8ICgodWludDE2X3QpIFJSNzE0NihQX0RFQklBRCkgJiBtYXNrKSk7CS8vIE1vZGlmeSB0aGUgcmVnaXN0ZXIgaW1hZ2UuCisJREVCSXRyYW5zZmVyKGRldik7CS8vIEV4ZWN1dGUgdGhlIERFQkkgV3JpdGUgdHJhbnNmZXIuCit9CisKK3N0YXRpYyB2b2lkIENsb3NlRE1BQihjb21lZGlfZGV2aWNlICogZGV2LCBETUFCVUYgKiBwZG1hLCBzaXplX3QgYnNpemUpCit7CisJdm9pZCAqdmJwdHI7CisJZG1hX2FkZHJfdCB2cHB0cjsKKworCURFQlVHKCJDbG9zZURNQUI6IEVudGVyaW5nIFM2MjZEUlZfQ2xvc2VETUFCKCk6XG4iKTsKKwlpZiAocGRtYSA9PSBOVUxMKQorCQlyZXR1cm47CisJLy9maW5kIHRoZSBtYXRjaGluZyBhbGxvY2F0aW9uIGZyb20gdGhlIGJvYXJkIHN0cnVjdAorCisJdmJwdHIgPSBwZG1hLT5Mb2dpY2FsQmFzZTsKKwl2cHB0ciA9IHBkbWEtPlBoeXNpY2FsQmFzZTsKKwlpZiAodmJwdHIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBic2l6ZSwgdmJwdHIsIHZwcHRyKTsKKwkJcGRtYS0+TG9naWNhbEJhc2UgPSAwOworCQlwZG1hLT5QaHlzaWNhbEJhc2UgPSAwOworCisJCURFQlVHKCJDbG9zZURNQUIoKTogTG9naWNhbD0lcCwgYnNpemU9JWQsIFBoeXNpY2FsPTB4JXhcbiIsCisJCQl2YnB0ciwgYnNpemUsICh1aW50MzJfdCkgdnBwdHIpOworCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLyAgQ09VTlRFUiBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWxsIGNvdW50ZXIgZnVuY3Rpb25zIGFkZHJlc3MgYSBzcGVjaWZpYyBjb3VudGVyIGJ5IG1lYW5zIG9mIHRoZQorLy8gIkNvdW50ZXIiIGFyZ3VtZW50LCB3aGljaCBpcyBhIGxvZ2ljYWwgY291bnRlciBudW1iZXIuICBUaGUgQ291bnRlcgorLy8gYXJndW1lbnQgbWF5IGhhdmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGVnYWwgdmFsdWVzOiAwPTBBLCAxPTFBLAorLy8gMj0yQSwgMz0wQiwgND0xQiwgNT0yQi4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIEEgYW5kIEIKKy8vIGNvdW50ZXJzOgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vIFBSSVZBVEUgQ09VTlRFUiBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWFkIGEgY291bnRlcidzIG91dHB1dCBsYXRjaC4KKworc3RhdGljIHVpbnQzMl90IFJlYWRMYXRjaChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDMyX3QgdmFsdWU7CisJLy9ERUJVRyBGSVhNRSBERUJVRygiUmVhZExhdGNoOiBSZWFkIExhdGNoIGVudGVyXG4iKTsKKworCS8vIExhdGNoIGNvdW50cyBhbmQgZmV0Y2ggTFNXIG9mIGxhdGNoZWQgY291bnRzIHZhbHVlLgorCXZhbHVlID0gKHVpbnQzMl90KSBERUJJcmVhZChkZXYsIGstPk15TGF0Y2hMc3cpOworCisJLy8gRmV0Y2ggTVNXIG9mIGxhdGNoZWQgY291bnRzIGFuZCBjb21iaW5lIHdpdGggTFNXLgorCXZhbHVlIHw9ICgodWludDMyX3QpIERFQklyZWFkKGRldiwgay0+TXlMYXRjaExzdyArIDIpIDw8IDE2KTsKKworCS8vIERFQlVHIEZJWE1FIERFQlVHKCJSZWFkTGF0Y2g6IFJlYWQgTGF0Y2ggZXhpdFxuIik7CisKKwkvLyBSZXR1cm4gbGF0Y2hlZCBjb3VudHMuCisJcmV0dXJuIHZhbHVlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXNldCBhIGNvdW50ZXIncyBpbmRleCBhbmQgb3ZlcmZsb3cgZXZlbnQgY2FwdHVyZSBmbGFncy4KKworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpICh+Q1JCTVNLX0lOVENUUkwpLAorCQlDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQSk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0Q2FwRmxhZ3NfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAofkNSQk1TS19JTlRDVFJMKSwKKwkJQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4gY291bnRlciBzZXR1cCBpbiBhIGZvcm1hdCAoQ09VTlRFUl9TRVRVUCkgdGhhdCBpcyBjb25zaXN0ZW50CisvLyBmb3IgYm90aCBBIGFuZCBCIGNvdW50ZXJzLgorCitzdGF0aWMgdWludDE2X3QgR2V0TW9kZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCXJlZ2lzdGVyIHVpbnQxNl90IHNldHVwOworCisJLy8gRmV0Y2ggQ1JBIGFuZCBDUkIgcmVnaXN0ZXIgaW1hZ2VzLgorCWNyYSA9IERFQklyZWFkKGRldiwgay0+TXlDUkEpOworCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpOworCisJLy8gUG9wdWxhdGUgdGhlIHN0YW5kYXJkaXplZCBjb3VudGVyIHNldHVwIGJpdCBmaWVsZHMuICBOb3RlOgorCS8vIEluZGV4U3JjIGlzIHJlc3RyaWN0ZWQgdG8gRU5DX1ggb3IgSW5keFBvbC4KKwlzZXR1cCA9ICgoY3JhICYgU1RETVNLX0xPQURTUkMpCS8vIExvYWRTcmMgID0gTG9hZFNyY0EuCisJCXwgKChjcmIgPDwgKFNUREJJVF9MQVRDSFNSQyAtIENSQkJJVF9MQVRDSFNSQykpICYgU1RETVNLX0xBVENIU1JDKQkvLyBMYXRjaFNyYyA9IExhdGNoU3JjQS4KKwkJfCAoKGNyYSA8PCAoU1REQklUX0lOVFNSQyAtIENSQUJJVF9JTlRTUkNfQSkpICYgU1RETVNLX0lOVFNSQykJLy8gSW50U3JjICAgPSBJbnRTcmNBLgorCQl8ICgoY3JhIDw8IChTVERCSVRfSU5EWFNSQyAtIChDUkFCSVRfSU5EWFNSQ19BICsgMSkpKSAmIFNURE1TS19JTkRYU1JDKQkvLyBJbmR4U3JjICA9IEluZHhTcmNBPDE+LgorCQl8ICgoY3JhID4+IChDUkFCSVRfSU5EWFBPTF9BIC0gU1REQklUX0lORFhQT0wpKSAmIFNURE1TS19JTkRYUE9MKQkvLyBJbmR4UG9sICA9IEluZHhQb2xBLgorCQl8ICgoY3JiID4+IChDUkJCSVRfQ0xLRU5BQl9BIC0gU1REQklUX0NMS0VOQUIpKSAmIFNURE1TS19DTEtFTkFCKSk7CS8vIENsa0VuYWIgID0gQ2xrRW5hYkEuCisKKwkvLyBBZGp1c3QgbW9kZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4KKwlpZiAoY3JhICYgKDIgPDwgQ1JBQklUX0NMS1NSQ19BKSkJLy8gSWYgVGltZXIgbW9kZSAoQ2xrU3JjQTwxPiA9PSAxKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfVElNRVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBUaW1lciBtb2RlLgorCQkJfCAoKGNyYSA8PCAoU1REQklUX0NMS1BPTCAtIENSQUJJVF9DTEtTUkNfQSkpICYgU1RETVNLX0NMS1BPTCkJLy8gICBTZXQgQ2xrUG9sIHRvIGluZGljYXRlIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQTwwPikuCisJCQl8IChNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKSk7CS8vICAgQ2xrTXVsdCBtdXN0IGJlIDF4IGluIFRpbWVyIG1vZGUuCisKKwllbHNlCQkJLy8gSWYgQ291bnRlciBtb2RlIChDbGtTcmNBPDE+ID09IDApOgorCQlzZXR1cCB8PSAoKENMS1NSQ19DT1VOVEVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgQ291bnRlciBtb2RlLgorCQkJfCAoKGNyYSA+PiAoQ1JBQklUX0NMS1BPTF9BIC0gU1REQklUX0NMS1BPTCkpICYgU1RETVNLX0NMS1BPTCkJLy8gICBQYXNzIHRocm91Z2ggQ2xrUG9sLgorCQkJfCAoKChjcmEgJiBDUkFNU0tfQ0xLTVVMVF9BKSA9PSAoTVVMVF9YMCA8PCBDUkFCSVRfQ0xLTVVMVF9BKSkgPwkvLyAgIEZvcmNlIENsa011bHQgdG8gMXggaWYgbm90IGxlZ2FsLCBlbHNlIHBhc3MgdGhyb3VnaC4KKwkJCQkoTVVMVF9YMSA8PCBTVERCSVRfQ0xLTVVMVCkgOgorCQkJCSgoY3JhID4+IChDUkFCSVRfQ0xLTVVMVF9BIC0KKwkJCQkJCQlTVERCSVRfQ0xLTVVMVCkpICYKKwkJCQkJU1RETVNLX0NMS01VTFQpKSk7CisKKwkvLyBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4KKwlyZXR1cm4gc2V0dXA7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2V0dXA7CisKKwkvLyBGZXRjaCBDUkEgYW5kIENSQiByZWdpc3RlciBpbWFnZXMuCisJY3JhID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQSk7CisJY3JiID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQik7CisKKwkvLyBQb3B1bGF0ZSB0aGUgc3RhbmRhcmRpemVkIGNvdW50ZXIgc2V0dXAgYml0IGZpZWxkcy4gIE5vdGU6CisJLy8gSW5kZXhTcmMgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCXNldHVwID0gKCgoY3JiIDw8IChTVERCSVRfSU5UU1JDIC0gQ1JCQklUX0lOVFNSQ19CKSkgJiBTVERNU0tfSU5UU1JDKQkvLyBJbnRTcmMgICA9IEludFNyY0IuCisJCXwgKChjcmIgPDwgKFNUREJJVF9MQVRDSFNSQyAtIENSQkJJVF9MQVRDSFNSQykpICYgU1RETVNLX0xBVENIU1JDKQkvLyBMYXRjaFNyYyA9IExhdGNoU3JjQi4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0xPQURTUkMgLSBDUkJCSVRfTE9BRFNSQ19CKSkgJiBTVERNU0tfTE9BRFNSQykJLy8gTG9hZFNyYyAgPSBMb2FkU3JjQi4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0lORFhQT0wgLSBDUkJCSVRfSU5EWFBPTF9CKSkgJiBTVERNU0tfSU5EWFBPTCkJLy8gSW5keFBvbCAgPSBJbmR4UG9sQi4KKwkJfCAoKGNyYiA+PiAoQ1JCQklUX0NMS0VOQUJfQiAtIFNUREJJVF9DTEtFTkFCKSkgJiBTVERNU0tfQ0xLRU5BQikJLy8gQ2xrRW5hYiAgPSBDbGtFbmFiQi4KKwkJfCAoKGNyYSA+PiAoKENSQUJJVF9JTkRYU1JDX0IgKyAxKSAtIFNUREJJVF9JTkRYU1JDKSkgJiBTVERNU0tfSU5EWFNSQykpOwkvLyBJbmR4U3JjICA9IEluZHhTcmNCPDE+LgorCisJLy8gQWRqdXN0IG1vZGUtZGVwZW5kZW50IHBhcmFtZXRlcnMuCisJaWYgKChjcmIgJiBDUkJNU0tfQ0xLTVVMVF9CKSA9PSAoTVVMVF9YMCA8PCBDUkJCSVRfQ0xLTVVMVF9CKSkJLy8gSWYgRXh0ZW5kZXIgbW9kZSAoQ2xrTXVsdEIgPT0gTVVMVF9YMCk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX0VYVEVOREVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgRXh0ZW5kZXIgbW9kZS4KKwkJCXwgKE1VTFRfWDEgPDwgU1REQklUX0NMS01VTFQpCS8vICAgSW5kaWNhdGUgbXVsdGlwbGllciBpcyAxeC4KKwkJCXwgKChjcmEgPj4gKENSQUJJVF9DTEtTUkNfQiAtIFNUREJJVF9DTEtQT0wpKSAmIFNURE1TS19DTEtQT0wpKTsJLy8gICBTZXQgQ2xrUG9sIGVxdWFsIHRvIFRpbWVyIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQjwwPikuCisKKwllbHNlIGlmIChjcmEgJiAoMiA8PCBDUkFCSVRfQ0xLU1JDX0IpKQkvLyBJZiBUaW1lciBtb2RlIChDbGtTcmNCPDE+ID09IDEpOgorCQlzZXR1cCB8PSAoKENMS1NSQ19USU1FUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIFRpbWVyIG1vZGUuCisJCQl8IChNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKQkvLyAgIEluZGljYXRlIG11bHRpcGxpZXIgaXMgMXguCisJCQl8ICgoY3JhID4+IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkgJiBTVERNU0tfQ0xLUE9MKSk7CS8vICAgU2V0IENsa1BvbCBlcXVhbCB0byBUaW1lciBjb3VudCBkaXJlY3Rpb24gKENsa1NyY0I8MD4pLgorCisJZWxzZQkJCS8vIElmIENvdW50ZXIgbW9kZSAoQ2xrU3JjQjwxPiA9PSAwKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfQ09VTlRFUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIFRpbWVyIG1vZGUuCisJCQl8ICgoY3JiID4+IChDUkJCSVRfQ0xLTVVMVF9CIC0gU1REQklUX0NMS01VTFQpKSAmIFNURE1TS19DTEtNVUxUKQkvLyAgIENsb2NrIG11bHRpcGxpZXIgaXMgcGFzc2VkIHRocm91Z2guCisJCQl8ICgoY3JiIDw8IChTVERCSVRfQ0xLUE9MIC0gQ1JCQklUX0NMS1BPTF9CKSkgJiBTVERNU0tfQ0xLUE9MKSk7CS8vICAgQ2xvY2sgcG9sYXJpdHkgaXMgcGFzc2VkIHRocm91Z2guCisKKwkvLyBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4KKwlyZXR1cm4gc2V0dXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNwZWNpZmllZCBjb3VudGVyLiAgVGhlIHNldHVwCisvLyBwYXJhbWV0ZXIgaXMgdHJlYXRlZCBhcyBhIENPVU5URVJfU0VUVVAgZGF0YSB0eXBlLiAgVGhlIGZvbGxvd2luZworLy8gcGFyYW1ldGVycyBhcmUgcHJvZ3JhbW1hYmxlIChhbGwgb3RoZXIgcGFybXMgYXJlIGlnbm9yZWQpOiBDbGtNdWx0LAorLy8gQ2xrUG9sLCBDbGtFbmFiLCBJbmRleFNyYywgSW5kZXhQb2wsIExvYWRTcmMuCisKK3N0YXRpYyB2b2lkIFNldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cCA9IFNldHVwOwkvLyBDYWNoZSB0aGUgU3RhbmRhcmQgU2V0dXAuCisKKwkvLyBJbml0aWFsaXplIENSQSBhbmQgQ1JCIGltYWdlcy4KKwljcmEgPSAoKHNldHVwICYgQ1JBTVNLX0xPQURTUkNfQSkJLy8gUHJlbG9hZCB0cmlnZ2VyIGlzIHBhc3NlZCB0aHJvdWdoLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfSU5EWFNSQykgPj4gKFNUREJJVF9JTkRYU1JDIC0gKENSQUJJVF9JTkRYU1JDX0EgKyAxKSkpKTsJLy8gSW5kZXhTcmMgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCisJY3JiID0gKENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BCS8vIFJlc2V0IGFueSBwZW5kaW5nIENvdW50ZXJBIGV2ZW50IGNhcHR1cmVzLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLRU5BQikgPDwgKENSQkJJVF9DTEtFTkFCX0EgLSBTVERCSVRfQ0xLRU5BQikpKTsJLy8gQ2xvY2sgZW5hYmxlIGlzIHBhc3NlZCB0aHJvdWdoLgorCisJLy8gRm9yY2UgSW50U3JjIHRvIERpc2FibGVkIGlmIERpc2FibGVJbnRTcmMgaXMgYXNzZXJ0ZWQuCisJaWYgKCFEaXNhYmxlSW50U3JjKQorCQljcmEgfD0gKChzZXR1cCAmIFNURE1TS19JTlRTUkMpID4+IChTVERCSVRfSU5UU1JDIC0KKwkJCQlDUkFCSVRfSU5UU1JDX0EpKTsKKworCS8vIFBvcHVsYXRlIGFsbCBtb2RlLWRlcGVuZGVudCBhdHRyaWJ1dGVzIG9mIENSQSAmIENSQiBpbWFnZXMuCisJc3dpdGNoICgoc2V0dXAgJiBTVERNU0tfQ0xLU1JDKSA+PiBTVERCSVRfQ0xLU1JDKSB7CisJY2FzZSBDTEtTUkNfRVhURU5ERVI6CS8vIEV4dGVuZGVyIE1vZGU6IEZvcmNlIHRvIFRpbWVyIG1vZGUKKwkJLy8gKEV4dGVuZGVyIHZhbGlkIG9ubHkgZm9yIEIgY291bnRlcnMpLgorCisJY2FzZSBDTEtTUkNfVElNRVI6CS8vIFRpbWVyIE1vZGU6CisJCWNyYSB8PSAoKDIgPDwgQ1JBQklUX0NMS1NSQ19BKQkvLyAgIENsa1NyY0E8MT4gc2VsZWN0cyBzeXN0ZW0gY2xvY2sKKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpID4+IChTVERCSVRfQ0xLUE9MIC0gQ1JBQklUX0NMS1NSQ19BKSkJLy8gICAgIHdpdGggY291bnQgZGlyZWN0aW9uIChDbGtTcmNBPDA+KSBvYnRhaW5lZCBmcm9tIENsa1BvbC4KKwkJCXwgKDEgPDwgQ1JBQklUX0NMS1BPTF9BKQkvLyAgIENsa1BvbEEgYmVoYXZlcyBhcyBhbHdheXMtb24gY2xvY2sgZW5hYmxlLgorCQkJfCAoTVVMVF9YMSA8PCBDUkFCSVRfQ0xLTVVMVF9BKSk7CS8vICAgQ2xrTXVsdCBtdXN0IGJlIDF4LgorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBDb3VudGVyIE1vZGU6CisJCWNyYSB8PSAoQ0xLU1JDX0NPVU5URVIJLy8gICBTZWxlY3QgRU5DX0MgYW5kIEVOQ19EIGFzIGNsb2NrL2RpcmVjdGlvbiBpbnB1dHMuCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA8PCAoQ1JBQklUX0NMS1BPTF9BIC0gU1REQklUX0NMS1BPTCkpCS8vICAgQ2xvY2sgcG9sYXJpdHkgaXMgcGFzc2VkIHRocm91Z2guCisJCQl8ICgoKHNldHVwICYgU1RETVNLX0NMS01VTFQpID09IChNVUxUX1gwIDw8IFNUREJJVF9DTEtNVUxUKSkgPwkvLyAgIEZvcmNlIG11bHRpcGxpZXIgdG8geDEgaWYgbm90IGxlZ2FsLCBvdGhlcndpc2UgcGFzcyB0aHJvdWdoLgorCQkJCShNVUxUX1gxIDw8IENSQUJJVF9DTEtNVUxUX0EpIDoKKwkJCQkoKHNldHVwICYgU1RETVNLX0NMS01VTFQpIDw8IChDUkFCSVRfQ0xLTVVMVF9BIC0KKwkJCQkJCVNUREJJVF9DTEtNVUxUKSkpKTsKKwl9CisKKwkvLyBGb3JjZSBwb3NpdGl2ZSBpbmRleCBwb2xhcml0eSBpZiBJbmR4U3JjIGlzIHNvZnR3YXJlLWRyaXZlbiBvbmx5LAorCS8vIG90aGVyd2lzZSBwYXNzIGl0IHRocm91Z2guCisJaWYgKH5zZXR1cCAmIFNURE1TS19JTkRYU1JDKQorCQljcmEgfD0gKChzZXR1cCAmIFNURE1TS19JTkRYUE9MKSA8PCAoQ1JBQklUX0lORFhQT0xfQSAtCisJCQkJU1REQklUX0lORFhQT0wpKTsKKworCS8vIElmIEludFNyYyBoYXMgYmVlbiBmb3JjZWQgdG8gRGlzYWJsZWQsIHVwZGF0ZSB0aGUgTUlTQzIgaW50ZXJydXB0CisJLy8gZW5hYmxlIG1hc2sgdG8gaW5kaWNhdGUgdGhlIGNvdW50ZXIgaW50ZXJydXB0IGlzIGRpc2FibGVkLgorCWlmIChEaXNhYmxlSW50U3JjKQorCQlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJj0gfmstPk15RXZlbnRCaXRzWzNdOworCisJLy8gV2hpbGUgcmV0YWluaW5nIENvdW50ZXJCIGFuZCBMYXRjaFNyYyBjb25maWd1cmF0aW9ucywgcHJvZ3JhbSB0aGUKKwkvLyBuZXcgY291bnRlciBvcGVyYXRpbmcgbW9kZS4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLCBDUkFNU0tfSU5EWFNSQ19CIHwgQ1JBTVNLX0NMS1NSQ19CLCBjcmEpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfQ0xLRU5BQl9BKSksIGNyYik7Cit9CisKK3N0YXRpYyB2b2lkIFNldE1vZGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cCA9IFNldHVwOwkvLyBDYWNoZSB0aGUgU3RhbmRhcmQgU2V0dXAuCisKKwkvLyBJbml0aWFsaXplIENSQSBhbmQgQ1JCIGltYWdlcy4KKwljcmEgPSAoKHNldHVwICYgU1RETVNLX0lORFhTUkMpIDw8ICgoQ1JBQklUX0lORFhTUkNfQiArIDEpIC0gU1REQklUX0lORFhTUkMpKTsJLy8gSW5kZXhTcmMgZmllbGQgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCisJY3JiID0gKENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9CCS8vIFJlc2V0IGV2ZW50IGNhcHR1cmVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisJCXwgKChzZXR1cCAmIFNURE1TS19DTEtFTkFCKSA8PCAoQ1JCQklUX0NMS0VOQUJfQiAtIFNUREJJVF9DTEtFTkFCKSkJLy8gQ2xvY2sgZW5hYmxlIGlzIHBhc3NlZCB0aHJvdWdoLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfTE9BRFNSQykgPj4gKFNUREJJVF9MT0FEU1JDIC0gQ1JCQklUX0xPQURTUkNfQikpKTsJLy8gUHJlbG9hZCB0cmlnZ2VyIHNvdXJjZSBpcyBwYXNzZWQgdGhyb3VnaC4KKworCS8vIEZvcmNlIEludFNyYyB0byBEaXNhYmxlZCBpZiBEaXNhYmxlSW50U3JjIGlzIGFzc2VydGVkLgorCWlmICghRGlzYWJsZUludFNyYykKKwkJY3JiIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5UU1JDKSA+PiAoU1REQklUX0lOVFNSQyAtCisJCQkJQ1JCQklUX0lOVFNSQ19CKSk7CisKKwkvLyBQb3B1bGF0ZSBhbGwgbW9kZS1kZXBlbmRlbnQgYXR0cmlidXRlcyBvZiBDUkEgJiBDUkIgaW1hZ2VzLgorCXN3aXRjaCAoKHNldHVwICYgU1RETVNLX0NMS1NSQykgPj4gU1REQklUX0NMS1NSQykgeworCWNhc2UgQ0xLU1JDX1RJTUVSOgkvLyBUaW1lciBNb2RlOgorCQljcmEgfD0gKCgyIDw8IENSQUJJVF9DTEtTUkNfQikJLy8gICBDbGtTcmNCPDE+IHNlbGVjdHMgc3lzdGVtIGNsb2NrCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA8PCAoQ1JBQklUX0NMS1NSQ19CIC0gU1REQklUX0NMS1BPTCkpKTsJLy8gICAgIHdpdGggZGlyZWN0aW9uIChDbGtTcmNCPDA+KSBvYnRhaW5lZCBmcm9tIENsa1BvbC4KKwkJY3JiIHw9ICgoMSA8PCBDUkJCSVRfQ0xLUE9MX0IpCS8vICAgQ2xrUG9sQiBiZWhhdmVzIGFzIGFsd2F5cy1vbiBjbG9jayBlbmFibGUuCisJCQl8IChNVUxUX1gxIDw8IENSQkJJVF9DTEtNVUxUX0IpKTsJLy8gICBDbGtNdWx0QiBtdXN0IGJlIDF4LgorCQlicmVhazsKKworCWNhc2UgQ0xLU1JDX0VYVEVOREVSOgkvLyBFeHRlbmRlciBNb2RlOgorCQljcmEgfD0gKCgyIDw8IENSQUJJVF9DTEtTUkNfQikJLy8gICBDbGtTcmNCIHNvdXJjZSBpcyBPdmVyZmxvd0EgKHNhbWUgYXMgInRpbWVyIikKKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpIDw8IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkpOwkvLyAgICAgd2l0aCBkaXJlY3Rpb24gb2J0YWluZWQgZnJvbSBDbGtQb2wuCisJCWNyYiB8PSAoKDEgPDwgQ1JCQklUX0NMS1BPTF9CKQkvLyAgIENsa1BvbEIgY29udHJvbHMgSW5kZXhCIC0tIGFsd2F5cyBzZXQgdG8gYWN0aXZlLgorCQkJfCAoTVVMVF9YMCA8PCBDUkJCSVRfQ0xLTVVMVF9CKSk7CS8vICAgQ2xrTXVsdEIgc2VsZWN0cyBPdmVyZmxvd0EgYXMgdGhlIGNsb2NrIHNvdXJjZS4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLy8gQ291bnRlciBNb2RlOgorCQljcmEgfD0gKENMS1NSQ19DT1VOVEVSIDw8IENSQUJJVF9DTEtTUkNfQik7CS8vICAgU2VsZWN0IEVOQ19DIGFuZCBFTkNfRCBhcyBjbG9jay9kaXJlY3Rpb24gaW5wdXRzLgorCQljcmIgfD0gKCgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA+PiAoU1REQklUX0NMS1BPTCAtIENSQkJJVF9DTEtQT0xfQikpCS8vICAgQ2xrUG9sIGlzIHBhc3NlZCB0aHJvdWdoLgorCQkJfCAoKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA9PSAoTVVMVF9YMCA8PCBTVERCSVRfQ0xLTVVMVCkpID8JLy8gICBGb3JjZSBDbGtNdWx0IHRvIHgxIGlmIG5vdCBsZWdhbCwgb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaC4KKwkJCQkoTVVMVF9YMSA8PCBDUkJCSVRfQ0xLTVVMVF9CKSA6CisJCQkJKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA8PCAoQ1JCQklUX0NMS01VTFRfQiAtCisJCQkJCQlTVERCSVRfQ0xLTVVMVCkpKSk7CisJfQorCisJLy8gRm9yY2UgcG9zaXRpdmUgaW5kZXggcG9sYXJpdHkgaWYgSW5keFNyYyBpcyBzb2Z0d2FyZS1kcml2ZW4gb25seSwKKwkvLyBvdGhlcndpc2UgcGFzcyBpdCB0aHJvdWdoLgorCWlmICh+c2V0dXAgJiBTVERNU0tfSU5EWFNSQykKKwkJY3JiIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5EWFBPTCkgPj4gKFNUREJJVF9JTkRYUE9MIC0KKwkJCQlDUkJCSVRfSU5EWFBPTF9CKSk7CisKKwkvLyBJZiBJbnRTcmMgaGFzIGJlZW4gZm9yY2VkIHRvIERpc2FibGVkLCB1cGRhdGUgdGhlIE1JU0MyIGludGVycnVwdAorCS8vIGVuYWJsZSBtYXNrIHRvIGluZGljYXRlIHRoZSBjb3VudGVyIGludGVycnVwdCBpcyBkaXNhYmxlZC4KKwlpZiAoRGlzYWJsZUludFNyYykKKwkJZGV2cHJpdi0+Q291bnRlckludEVuYWJzICY9IH5rLT5NeUV2ZW50Qml0c1szXTsKKworCS8vIFdoaWxlIHJldGFpbmluZyBDb3VudGVyQSBhbmQgTGF0Y2hTcmMgY29uZmlndXJhdGlvbnMsIHByb2dyYW0gdGhlCisJLy8gbmV3IGNvdW50ZXIgb3BlcmF0aW5nIG1vZGUuCisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwKKwkJKHVpbnQxNl90KSAofihDUkFNU0tfSU5EWFNSQ19CIHwgQ1JBTVNLX0NMS1NSQ19CKSksIGNyYSk7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgQ1JCTVNLX0NMS0VOQUJfQSB8IENSQk1TS19MQVRDSFNSQywgY3JiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IGEgY291bnRlcidzIGVuYWJsZS4gIGVuYWI6IDA9YWx3YXlzIGVuYWJsZWQsIDE9ZW5hYmxlZCBieSBpbmRleC4KKworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKQoreworCURFQlVHKCJTZXRFbmFibGVfQTogU2V0RW5hYmxlX0EgZW50ZXIgMzU0MVxuIik7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfSU5UQ1RSTCB8IENSQk1TS19DTEtFTkFCX0EpKSwKKwkJKHVpbnQxNl90KSAoZW5hYiA8PCBDUkJCSVRfQ0xLRU5BQl9BKSk7Cit9CisKK3N0YXRpYyB2b2lkIFNldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgZW5hYikKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0NMS0VOQUJfQikpLAorCQkodWludDE2X3QpIChlbmFiIDw8IENSQkJJVF9DTEtFTkFCX0IpKTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9DTEtFTkFCX0EpICYgMTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9DTEtFTkFCX0IpICYgMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IGEgY291bnRlciBwYWlyJ3MgbGF0Y2ggdHJpZ2dlciBzb3VyY2UuICAwOiBPbiByZWFkCisvLyBhY2Nlc3MsIDE6IEEgaW5kZXggbGF0Y2hlcyBBLCAyOiBCIGluZGV4IGxhdGNoZXMgQiwgMzogQSBvdmVyZmxvdworLy8gbGF0Y2hlcyBCLgorCitzdGF0aWMgdm9pZCBTZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IHZhbHVlKQoreworCURFQlVHKCJTZXRMYXRjaFNvdXJjZTogU2V0TGF0Y2hTb3VyY2UgZW50ZXIgMzU1MCBcbiIpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfTEFUQ0hTUkMpKSwKKwkJKHVpbnQxNl90KSAodmFsdWUgPDwgQ1JCQklUX0xBVENIU1JDKSk7CisKKwlERUJVRygiU2V0TGF0Y2hTb3VyY2U6IFNldExhdGNoU291cmNlIGV4aXQgXG4iKTsKK30KKworLyogc3RhdGljIHVpbnQxNl90IEdldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAqLworLyogeyAqLworLyogICByZXR1cm4gKCBERUJJcmVhZCggZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0xBVENIU1JDICkgJiAzOyAqLworLyogfSAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IHRoZSBldmVudCB0aGF0IHdpbGwgdHJpZ2dlciB0cmFuc2ZlciBvZiB0aGUgcHJlbG9hZAorLy8gcmVnaXN0ZXIgaW50byB0aGUgY291bnRlci4gIDA9VGhpc0NudHJfSW5kZXgsIDE9VGhpc0NudHJfT3ZlcmZsb3csCisvLyAyPU92ZXJmbG93QSAoQiBjb3VudGVycyBvbmx5KSwgMz1kaXNhYmxlZC4KKworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwgKHVpbnQxNl90KSAofkNSQU1TS19MT0FEU1JDX0EpLAorCQkodWludDE2X3QpIChUcmlnIDw8IENSQUJJVF9MT0FEU1JDX0EpKTsKK30KKworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfTE9BRFNSQ19CIHwgQ1JCTVNLX0lOVENUUkwpKSwKKwkJKHVpbnQxNl90KSAoVHJpZyA8PCBDUkJCSVRfTE9BRFNSQ19CKSk7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkEpID4+IENSQUJJVF9MT0FEU1JDX0EpICYgMzsKK30KKworc3RhdGljIHVpbnQxNl90IEdldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0xPQURTUkNfQikgJiAzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCBjb3VudGVyIGludGVycnVwdCBzb3VyY2UgYW5kIGNsZWFyIGFueSBjYXB0dXJlZAorLy8gaW5kZXgvb3ZlcmZsb3cgZXZlbnRzLiAgSW50U291cmNlOiAwPURpc2FibGVkLCAxPU92ZXJmbG93T25seSwKKy8vIDI9SW5kZXhPbmx5LCAzPUluZGV4QW5kT3ZlcmZsb3cuCisKK3N0YXRpYyB2b2lkIFNldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpCit7CisJLy8gUmVzZXQgYW55IHBlbmRpbmcgY291bnRlciBvdmVyZmxvdyBvciBpbmRleCBjYXB0dXJlcy4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpICh+Q1JCTVNLX0lOVENUUkwpLAorCQlDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQSk7CisKKwkvLyBQcm9ncmFtIGNvdW50ZXIgaW50ZXJydXB0IHNvdXJjZS4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLCB+Q1JBTVNLX0lOVFNSQ19BLAorCQkodWludDE2X3QpIChJbnRTb3VyY2UgPDwgQ1JBQklUX0lOVFNSQ19BKSk7CisKKwkvLyBVcGRhdGUgTUlTQzIgaW50ZXJydXB0IGVuYWJsZSBtYXNrLgorCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyA9CisJCShkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJiB+ay0+TXlFdmVudEJpdHNbM10pIHwgay0+CisJCU15RXZlbnRCaXRzW0ludFNvdXJjZV07Cit9CisKK3N0YXRpYyB2b2lkIFNldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpCit7CisJdWludDE2X3QgY3JiOworCisJLy8gQ2FjaGUgd3JpdGVhYmxlIENSQiByZWdpc3RlciBpbWFnZS4KKwljcmIgPSBERUJJcmVhZChkZXYsIGstPk15Q1JCKSAmIH5DUkJNU0tfSU5UQ1RSTDsKKworCS8vIFJlc2V0IGFueSBwZW5kaW5nIGNvdW50ZXIgb3ZlcmZsb3cgb3IgaW5kZXggY2FwdHVyZXMuCisJREVCSXdyaXRlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKGNyYiB8IENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9CKSk7CisKKwkvLyBQcm9ncmFtIGNvdW50ZXIgaW50ZXJydXB0IHNvdXJjZS4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAoKGNyYiAmIH5DUkJNU0tfSU5UU1JDX0IpIHwgKEludFNvdXJjZSA8PAorCQkJCUNSQkJJVF9JTlRTUkNfQikpKTsKKworCS8vIFVwZGF0ZSBNSVNDMiBpbnRlcnJ1cHQgZW5hYmxlIG1hc2suCisJZGV2cHJpdi0+Q291bnRlckludEVuYWJzID0KKwkJKGRldnByaXYtPkNvdW50ZXJJbnRFbmFicyAmIH5rLT5NeUV2ZW50Qml0c1szXSkgfCBrLT4KKwkJTXlFdmVudEJpdHNbSW50U291cmNlXTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkEpID4+IENSQUJJVF9JTlRTUkNfQSkgJiAzOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0lOVFNSQ19CKSAmIDM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgdGhlIGNsb2NrIG11bHRpcGxpZXIuCisKKy8qIHN0YXRpYyB2b2lkIFNldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLTVVMVCApIHwgKCB2YWx1ZSA8PCBTVERCSVRfQ0xLTVVMVCApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLTVVMVCApICYgMzsgKi8KKy8qIH0gKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGNsb2NrIHBvbGFyaXR5LiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRDbGtQb2woIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLUE9MICkgfCAoIHZhbHVlIDw8IFNUREJJVF9DTEtQT0wgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrUG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLUE9MICkgJiAxOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgY2xvY2sgc291cmNlLiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRDbGtTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLU1JDICkgfCAoIHZhbHVlIDw8IFNUREJJVF9DTEtTUkMgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrU3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLU1JDICkgJiAzOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGluZGV4IHBvbGFyaXR5LiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFBvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19JTkRYUE9MICkgfCAoICh2YWx1ZSAhPSAwKSA8PCBTVERCSVRfSU5EWFBPTCApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRJbmRleFBvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0lORFhQT0wgKSAmIDE7ICovCisvKiB9ICovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgaW5kZXggc291cmNlLiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFNyYyhjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBERUJVRygiU2V0SW5kZXhTcmM6IHNldCBpbmRleCBzcmMgZW50ZXIgMzcwMFxuIik7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0lORFhTUkMgKSB8ICggKHZhbHVlICE9IDApIDw8IFNUREJJVF9JTkRYU1JDICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldEluZGV4U3JjKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfSU5EWFNSQyApICYgMTsgKi8KKy8qIH0gKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2VuZXJhdGUgYW4gaW5kZXggcHVsc2UuCisKK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCisJREVCVUcoIlB1bHNlSW5kZXhfQTogcHVsc2UgaW5kZXggZW50ZXJcbiIpOworCisJY3JhID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQSk7CS8vIFB1bHNlIGluZGV4LgorCURFQkl3cml0ZShkZXYsIGstPk15Q1JBLCAodWludDE2X3QpIChjcmEgXiBDUkFNU0tfSU5EWFBPTF9BKSk7CisJREVCVUcoIlB1bHNlSW5kZXhfQTogcHVsc2UgaW5kZXggc3RlcDFcbiIpOworCURFQkl3cml0ZShkZXYsIGstPk15Q1JBLCBjcmEpOworfQorCitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKworCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpICYgfkNSQk1TS19JTlRDVFJMOwkvLyBQdWxzZSBpbmRleC4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAoY3JiIF4gQ1JCTVNLX0lORFhQT0xfQikpOworCURFQkl3cml0ZShkZXYsIGstPk15Q1JCLCBjcmIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdyaXRlIHZhbHVlIGludG8gY291bnRlciBwcmVsb2FkIHJlZ2lzdGVyLgorCitzdGF0aWMgdm9pZCBQcmVsb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDMyX3QgdmFsdWUpCit7CisJREVCVUcoIlByZWxvYWQ6IHByZWxvYWQgZW50ZXJcbiIpOworCURFQkl3cml0ZShkZXYsICh1aW50MTZfdCkgKGstPk15TGF0Y2hMc3cpLCAodWludDE2X3QpIHZhbHVlKTsJLy8gV3JpdGUgdmFsdWUgdG8gcHJlbG9hZCByZWdpc3Rlci4KKwlERUJVRygiUHJlbG9hZDogcHJlbG9hZCBzdGVwIDFcbiIpOworCURFQkl3cml0ZShkZXYsICh1aW50MTZfdCkgKGstPk15TGF0Y2hMc3cgKyAyKSwKKwkJKHVpbnQxNl90KSAodmFsdWUgPj4gMTYpKTsKK30KKworc3RhdGljIHZvaWQgQ291bnRlcnNJbml0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGNoYW47CisJZW5jX3ByaXZhdGUgKms7CisJdWludDE2X3QgU2V0dXAgPSAoTE9BRFNSQ19JTkRYIDw8IEJGX0xPQURTUkMpIHwJLy8gUHJlbG9hZCB1cG9uCisJCS8vIGluZGV4LgorCQkoSU5EWFNSQ19TT0ZUIDw8IEJGX0lORFhTUkMpIHwJLy8gRGlzYWJsZSBoYXJkd2FyZSBpbmRleC4KKwkJKENMS1NSQ19DT1VOVEVSIDw8IEJGX0NMS1NSQykgfAkvLyBPcGVyYXRpbmcgbW9kZSBpcyBjb3VudGVyLgorCQkoQ0xLUE9MX1BPUyA8PCBCRl9DTEtQT0wpIHwJLy8gQWN0aXZlIGhpZ2ggY2xvY2suCisJCShDTlRESVJfVVAgPDwgQkZfQ0xLUE9MKSB8CS8vIENvdW50IGRpcmVjdGlvbiBpcyB1cC4KKwkJKENMS01VTFRfMVggPDwgQkZfQ0xLTVVMVCkgfAkvLyBDbG9jayBtdWx0aXBsaWVyIGlzIDF4LgorCQkoQ0xLRU5BQl9JTkRFWCA8PCBCRl9DTEtFTkFCKTsJLy8gRW5hYmxlZCBieSBpbmRleAorCisJLy8gRGlzYWJsZSBhbGwgY291bnRlciBpbnRlcnJ1cHRzIGFuZCBjbGVhciBhbnkgY2FwdHVyZWQgY291bnRlciBldmVudHMuCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfRU5DT0RFUl9DSEFOTkVMUzsgY2hhbisrKSB7CisJCWsgPSAmZW5jcHJpdltjaGFuXTsKKwkJay0+U2V0TW9kZShkZXYsIGssIFNldHVwLCBUUlVFKTsKKwkJay0+U2V0SW50U3JjKGRldiwgaywgMCk7CisJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9BTFdBWVMpOworCX0KKwlERUJVRygiQ291bnRlcnNJbml0OiBjb3VudGVycyBpbml0aWFsaXplZCBcbiIpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ4YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAgY29tZWRpL2RyaXZlcnMvczYyNi5oCisgIFNlbnNvcmF5IHM2MjYgQ29tZWRpIGRyaXZlciwgaGVhZGVyIGZpbGUKKworICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICBCYXNlZCBvbiBTZW5zb3JheSBNb2RlbCA2MjYgTGludXggZHJpdmVyIFZlcnNpb24gMC4yCisgIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNlbnNvcmF5IENvLiwgSW5jLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKKyAgRHJpdmVyOiBzNjI2Lm8gKHM2MjYua28pCisgIERlc2NyaXB0aW9uOiBTZW5zb3JheSA2MjYgZHJpdmVyCisgIERldmljZXM6IFNlbnNvcmF5IHM2MjYKKyAgQXV0aG9yczogR2lhbmx1Y2EgUGFsbGkgPGdwYWxsaUBkZWlzLnVuaWJvLml0PiwKKyAgVXBkYXRlZDogVGh1LCAxMiBKdWwgMjAwNQorICBTdGF0dXM6IGV4cGVyaW1lbnRhbAorCisgIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAgYW5hbG9nIGlucHV0OgorICAgbm9uZQorCisgIGFuYWxvZyBvdXRwdXQ6CisgICBub25lCisKKyAgZGlnaXRhbCBjaGFubmVsOgorICAgczYyNiBoYXMgMyBkaW8gc3ViZGV2aWNlcyAoMiwzIGFuZCA0KSBlYWNoIHdpdGggMTYgaS9vIGNoYW5uZWxzCisgICBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOgorICAgSU5TTl9DT05GSUdfRElPX1FVRVJZCisgICBDT01FRElfSU5QVVQKKyAgIENPTUVESV9PVVRQVVQKKworICBlbmNvZGVyOgorICAgRXZlcnkgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHJlYWRpbmcuCisKKyAgIEV4YW1wbGUgY29kZQorCisgICBpbnNuLmluc249SU5TTl9DT05GSUc7ICAgLy9jb25maWd1cmF0aW9uIGluc3RydWN0aW9uCisgICBpbnNuLm49MTsgICAgICAgICAgICAgICAgLy9udW1iZXIgb2Ygb3BlcmF0aW9uIChtdXN0IGJlIDEpCisgICBpbnNuLmRhdGE9JmluaXRpYWx2YWx1ZTsgLy9pbml0aWFsIHZhbHVlIGxvYWRlZCBpbnRvIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1cmluZyBjb25maWd1cmF0aW9uCisgICBpbnNuLnN1YmRldj01OyAgICAgICAgICAgLy9lbmNvZGVyIHN1YmRldmljZQorICAgaW5zbi5jaGFuc3BlYz1DUl9QQUNLKGVuY29kZXJfY2hhbm5lbCwwLEFSRUZfT1RIRVIpOyAvL2VuY29kZXJfY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIGNvbmZpZ3VyZQorCisgICBjb21lZGlfZG9faW5zbihjZiwmaW5zbik7IC8vZXhlY3V0aW5nIGNvbmZpZ3VyYXRpb24KKyovCisKKyNpZmRlZiBfREVCVUdfCisjZGVmaW5lIERFQlVHKC4uLik7ICAgICAgICBydF9wcmludGsoX19WQV9BUkdTX18pOworI2Vsc2UKKyNkZWZpbmUgREVCVUcoLi4uKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUUlVFKQorI2RlZmluZSBUUlVFICAgICgxKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGQUxTRSkKKyNkZWZpbmUgRkFMU0UgICAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRVhURVJOKQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU5MSU5FKQorI2RlZmluZSBJTkxJTkUgc3RhdGljIF9faW5saW5lCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBTNjI2X1NJWkUgMHgwMjAwCisjZGVmaW5lIFNJWkVPRl9BRERSRVNTX1NQQUNFCQkweDAyMDAKKyNkZWZpbmUgRE1BQlVGX1NJWkUJCQk0MDk2CS8vIDRrIHBhZ2VzCisKKyNkZWZpbmUgUzYyNl9BRENfQ0hBTk5FTFMgICAgICAgMTYKKyNkZWZpbmUgUzYyNl9EQUNfQ0hBTk5FTFMgICAgICAgNAorI2RlZmluZSBTNjI2X0VOQ09ERVJfQ0hBTk5FTFMgICA2CisjZGVmaW5lIFM2MjZfRElPX0NIQU5ORUxTICAgICAgIDQ4CisjZGVmaW5lIFM2MjZfRElPX0JBTktTCQkzCS8vIE51bWJlciBvZiBESU8gZ3JvdXBzLgorI2RlZmluZSBTNjI2X0RJT19FWFRDSEFOUwk0MAkvLyBOdW1iZXIgb2YKKwkJCQkJLy8gZXh0ZW5kZWQtY2FwYWJpbGl0eQorCQkJCQkvLyBESU8gY2hhbm5lbHMuCisKKyNkZWZpbmUgTlVNX1RSSU1EQUNTCTEyCS8vIE51bWJlciBvZiB2YWxpZCBUcmltREFDIGNoYW5uZWxzLgorCisvLyBQQ0kgYnVzIGludGVyZmFjZSB0eXBlcy4KKyNkZWZpbmUgSU5URUwJCQkJMQkvLyBJbnRlbCBidXMgdHlwZS4KKyNkZWZpbmUgTU9UT1JPTEEJCQkyCS8vIE1vdG9yb2xhIGJ1cyB0eXBlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUExBVEZPUk0JCUlOVEVMCS8vICoqKiBTRUxFQ1QgUExBVEZPUk0gVFlQRSAqKioKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBSQU5HRV81ViAgICAgICAgICAgICAgICAweDEwCS8vICsvLTVWIHJhbmdlCisjZGVmaW5lIFJBTkdFXzEwViAgICAgICAgICAgICAgIDB4MDAJLy8gKy8tMTBWIHJhbmdlCisKKyNkZWZpbmUgRU9QTAkJCTB4ODAJLy8gRW5kIG9mIEFEQyBwb2xsIGxpc3QgbWFya2VyLgorI2RlZmluZSBHU0VMX0JJUE9MQVI1VgkJMHgwMEYwCS8vIExQX0dTRUwgc2V0dGluZyBmb3IgNVYgYmlwb2xhciByYW5nZS4KKyNkZWZpbmUgR1NFTF9CSVBPTEFSMTBWCQkweDAwQTAJLy8gTFBfR1NFTCBzZXR0aW5nIGZvciAxMFYgYmlwb2xhciByYW5nZS4KKworLy8gRXJyb3IgY29kZXMgdGhhdCBtdXN0IGJlIHZpc2libGUgdG8gdGhpcyBiYXNlIGNsYXNzLgorI2RlZmluZSBFUlJfSUxMRUdBTF9QQVJNCTB4MDAwMTAwMDAJLy8gSWxsZWdhbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdmFsdWUgd2FzIHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0kyQwkJCTB4MDAwMjAwMDAJLy8gSTJDIGVycm9yLgorI2RlZmluZSBFUlJfQ09VTlRFUlNFVFVQCTB4MDAyMDAwMDAJLy8gSWxsZWdhbCBzZXR1cCBzcGVjaWZpZWQgZm9yIGNvdW50ZXIgY2hhbm5lbC4KKyNkZWZpbmUgRVJSX0RFQklfVElNRU9VVAkweDAwNDAwMDAwCS8vIERFQkkgdHJhbnNmZXIgdGltZWQgb3V0LgorCisvLyBPcmdhbml6YXRpb24gKHBoeXNpY2FsIG9yZGVyKSBhbmQgc2l6ZSAoaW4gRFdPUkRzKSBvZiBsb2dpY2FsIERNQSBidWZmZXJzIGNvbnRhaW5lZCBieSBBTkFfRE1BQlVGLgorI2RlZmluZSBBRENfRE1BQlVGX0RXT1JEUwk0MAkvLyBBREMgRE1BIGJ1ZmZlciBtdXN0IGhvbGQgMTYgc2FtcGxlcywgcGx1cyBwcmUvcG9zdCBnYXJiYWdlIHNhbXBsZXMuCisjZGVmaW5lIERBQ19XRE1BQlVGX0RXT1JEUwkxCS8vIERBQyBvdXRwdXQgRE1BIGJ1ZmZlciBob2xkcyBhIHNpbmdsZSBzYW1wbGUuCisKKy8vIEFsbCByZW1haW5pbmcgc3BhY2UgaW4gNEtCIERNQSBidWZmZXIgaXMgYXZhaWxhYmxlIGZvciB0aGUgUlBTMSBwcm9ncmFtLgorCisvLyBBZGRyZXNzIG9mZnNldHMsIGluIERXT1JEUywgZnJvbSBiYXNlIG9mIERNQSBidWZmZXIuCisjZGVmaW5lIERBQ19XRE1BQlVGX09TCQlBRENfRE1BQlVGX0RXT1JEUworCisvLyBJbnRlcnJ1cHQgZW5hYiBiaXQgaW4gSVNSIGFuZCBJRVIuCisjZGVmaW5lIElSUV9HUElPMwkJMHgwMDAwMDA0MAkvLyBJUlEgZW5hYmxlIGZvciBHUElPMy4KKyNkZWZpbmUgSVJRX1JQUzEgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJU1JfQUZPVQkJMHgwMDAwMDgwMAkvLyBBdWRpbyBmaWZvCisJCQkJCQkvLyB1bmRlci9vdmVyZmxvdworCQkJCQkJLy8gZGV0ZWN0ZWQuCisjZGVmaW5lIElSUV9DT0lOVDFBICAgICAgICAgICAgIDB4MDQwMAkvLyBjb250ZXIgMUEgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDFCICAgICAgICAgICAgIDB4MDgwMAkvLyBjb250ZXIgMUIgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDJBICAgICAgICAgICAgIDB4MTAwMAkvLyBjb250ZXIgMkEgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDJCICAgICAgICAgICAgIDB4MjAwMAkvLyBjb250ZXIgMkIgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDNBICAgICAgICAgICAgIDB4NDAwMAkvLyBjb250ZXIgM0Egb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDNCICAgICAgICAgICAgIDB4ODAwMAkvLyBjb250ZXIgM0Igb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisKKy8vIFJQUyBjb21tYW5kIGNvZGVzLgorI2RlZmluZSBSUFNfQ0xSU0lHTkFMCQkweDAwMDAwMDAwCS8vIENMRUFSIFNJR05BTAorI2RlZmluZSBSUFNfU0VUU0lHTkFMCQkweDEwMDAwMDAwCS8vIFNFVCBTSUdOQUwKKyNkZWZpbmUgUlBTX05PUAkJCTB4MDAwMDAwMDAJLy8gTk9QCisjZGVmaW5lIFJQU19QQVVTRQkJMHgyMDAwMDAwMAkvLyBQQVVTRQorI2RlZmluZSBSUFNfVVBMT0FECQkweDQwMDAwMDAwCS8vIFVQTE9BRAorI2RlZmluZSBSUFNfSlVNUAkJMHg4MDAwMDAwMAkvLyBKVU1QCisjZGVmaW5lIFJQU19MRFJFRwkJMHg5MDAwMDEwMAkvLyBMRFJFRyAoMSB1aW50MzJfdCBvbmx5KQorI2RlZmluZSBSUFNfU1RSRUcJCTB4QTAwMDAxMDAJLy8gU1RSRUcgKDEgdWludDMyX3Qgb25seSkKKyNkZWZpbmUgUlBTX1NUT1AJCTB4NTAwMDAwMDAJLy8gU1RPUAorI2RlZmluZSBSUFNfSVJRICAgICAgICAgICAgICAgICAweDYwMDAwMDAwCS8vIElSUQorCisjZGVmaW5lIFJQU19MT0dJQ0FMX09SCQkweDA4MDAwMDAwCS8vIExvZ2ljYWwgT1IgY29uZGl0aW9uYWxzLgorI2RlZmluZSBSUFNfSU5WRVJUCQkweDA0MDAwMDAwCS8vIFRlc3QgZm9yIG5lZ2F0ZWQgc2VtYXBob3Jlcy4KKyNkZWZpbmUgUlBTX0RFQkkJCTB4MDAwMDAwMDIJLy8gREVCSSBkb25lCisKKyNkZWZpbmUgUlBTX1NJRzAJCTB4MDAyMDAwMDAJLy8gUlBTIHNlbWFwaG9yZSAwICh1c2VkIGJ5IEFEQykuCisjZGVmaW5lIFJQU19TSUcxCQkweDAwNDAwMDAwCS8vIFJQUyBzZW1hcGhvcmUgMSAodXNlZCBieSBEQUMpLgorI2RlZmluZSBSUFNfU0lHMgkJMHgwMDgwMDAwMAkvLyBSUFMgc2VtYXBob3JlIDIgKG5vdCB1c2VkKS4KKyNkZWZpbmUgUlBTX0dQSU8yCQkweDAwMDgwMDAwCS8vIFJQUyBHUElPMgorI2RlZmluZSBSUFNfR1BJTzMJCTB4MDAxMDAwMDAJLy8gUlBTIEdQSU8zCisKKyNkZWZpbmUgUlBTX1NJR0FEQwkJUlBTX1NJRzAJLy8gVHJpZ2dlci9zdGF0dXMgZm9yIEFEQydzIFJQUyBwcm9ncmFtLgorI2RlZmluZSBSUFNfU0lHREFDCQlSUFNfU0lHMQkvLyBUcmlnZ2VyL3N0YXR1cyBmb3IgREFDJ3MgUlBTIHByb2dyYW0uCisKKy8vIFJQUyBjbG9jayBwYXJhbWV0ZXJzLgorI2RlZmluZSBSUFNDTEtfU0NBTEFSCQk4CS8vIFRoaXMgaXMgYXBwYXJlbnQgcmF0aW8gb2YgUENJL1JQUyBjbGtzICh1bmRvY3VtZW50ZWQhISkuCisjZGVmaW5lIFJQU0NMS19QRVJfVVMJCSggMzMgLyBSUFNDTEtfU0NBTEFSICkJLy8gTnVtYmVyIG9mIFJQUyBjbG9ja3MgaW4gb25lIG1pY3Jvc2Vjb25kLgorCisvLyBFdmVudCBjb3VudGVyIHNvdXJjZSBhZGRyZXNzZXMuCisjZGVmaW5lIFNCQV9SUFNfQTAJCTB4MjcJLy8gVGltZSBvZiBSUFMwIGJ1c3ksIGluIFBDSSBjbG9ja3MuCisKKy8vIEdQSU8gY29uc3RhbnRzLgorI2RlZmluZSBHUElPX0JBU0UJCTB4MTAwMDQwMDAJLy8gR1BJTyAwLDIsMyA9IGlucHV0cywgR1BJTzMgPSBJUlE7IEdQSU8xID0gb3V0LgorI2RlZmluZSBHUElPMV9MTwkJMHgwMDAwMDAwMAkvLyBHUElPMSBzZXQgdG8gTE9XLgorI2RlZmluZSBHUElPMV9ISQkJMHgwMDAwMTAwMAkvLyBHUElPMSBzZXQgdG8gSElHSC4KKworLy8gUHJpbWFyeSBTdGF0dXMgUmVnaXN0ZXIgKFBTUikgY29uc3RhbnRzLgorI2RlZmluZSBQU1JfREVCSV9FCQkweDAwMDQwMDAwCS8vIERFQkkgZXZlbnQgZmxhZy4KKyNkZWZpbmUgUFNSX0RFQklfUwkJMHgwMDA4MDAwMAkvLyBERUJJIHN0YXR1cyBmbGFnLgorI2RlZmluZSBQU1JfQTJfSU4JCTB4MDAwMDgwMDAJLy8gQXVkaW8gb3V0cHV0IERNQTIgcHJvdGVjdGlvbiBhZGRyZXNzIHJlYWNoZWQuCisjZGVmaW5lIFBTUl9BRk9VCQkweDAwMDAwODAwCS8vIEF1ZGlvIEZJRk8gdW5kZXIvb3ZlcmZsb3cgZGV0ZWN0ZWQuCisjZGVmaW5lIFBTUl9HUElPMgkJMHgwMDAwMDAyMAkvLyBHUElPMiBpbnB1dCBwaW46IDA9QWRjQnVzeSwgMT1BZGNJZGxlLgorI2RlZmluZSBQU1JfRUMwUwkJMHgwMDAwMDAwMQkvLyBFdmVudCBjb3VudGVyIDAgdGhyZXNob2xkIHJlYWNoZWQuCisKKy8vIFNlY29uZGFyeSBTdGF0dXMgUmVnaXN0ZXIgKFNTUikgY29uc3RhbnRzLgorI2RlZmluZSBTU1JfQUYyX09VVAkJMHgwMDAwMDIwMAkvLyBBdWRpbyAyIG91dHB1dCBGSUZPIHVuZGVyL292ZXJmbG93IGRldGVjdGVkLgorCisvLyBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAxIChNQzEpIGNvbnN0YW50cy4KKyNkZWZpbmUgTUMxX1NPRlRfUkVTRVQJCTB4ODAwMDAwMDAJLy8gSW52b2tlIDcxNDYgc29mdCByZXNldC4KKyNkZWZpbmUgTUMxX1NIVVRET1dOCQkweDNGRkYwMDAwCS8vIFNodXQgZG93biBhbGwgTUMxLWNvbnRyb2xsZWQgZW5hYmxlcy4KKworI2RlZmluZSBNQzFfRVJQUzEJCTB4MjAwMAkvLyBlbmFiL2Rpc2FibGUgUlBTIHRhc2sgMS4KKyNkZWZpbmUgTUMxX0VSUFMwCQkweDEwMDAJLy8gZW5hYi9kaXNhYmxlIFJQUyB0YXNrIDAuCisjZGVmaW5lIE1DMV9ERUJJCQkweDA4MDAJLy8gZW5hYi9kaXNhYmxlIERFQkkgcGlucy4KKyNkZWZpbmUgTUMxX0FVRElPCQkweDAyMDAJLy8gZW5hYi9kaXNhYmxlIGF1ZGlvIHBvcnQgcGlucy4KKyNkZWZpbmUgTUMxX0kyQwkJCTB4MDEwMAkvLyBlbmFiL2Rpc2FibGUgSTJDIGludGVyZmFjZS4KKyNkZWZpbmUgTUMxX0EyT1VUCQkweDAwMDgJLy8gZW5hYi9kaXNhYmxlIHRyYW5zZmVyIG9uIEEyIG91dC4KKyNkZWZpbmUgTUMxX0EySU4JCTB4MDAwNAkvLyBlbmFiL2Rpc2FibGUgdHJhbnNmZXIgb24gQTIgaW4uCisjZGVmaW5lIE1DMV9BMUlOCQkweDAwMDEJLy8gZW5hYi9kaXNhYmxlIHRyYW5zZmVyIG9uIEExIGluLgorCisvLyBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAyIChNQzIpIGNvbnN0YW50cy4KKyNkZWZpbmUgTUMyX1VQTERfREVCSXEJCTB4MDAwMjAwMDIJLy8gVXBsb2FkIERFQkkgcmVnaXN0ZXJzLgorI2RlZmluZSBNQzJfVVBMRF9JSUNxCQkweDAwMDEwMDAxCS8vIFVwbG9hZCBJMkMgcmVnaXN0ZXJzLgorI2RlZmluZSBNQzJfUlBTU0lHMl9PTnEJCTB4MjAwMDIwMDAJLy8gQXNzZXJ0IFJQU19TSUcyLgorI2RlZmluZSBNQzJfUlBTU0lHMV9PTnEJCTB4MTAwMDEwMDAJLy8gQXNzZXJ0IFJQU19TSUcxLgorI2RlZmluZSBNQzJfUlBTU0lHMF9PTnEJCTB4MDgwMDA4MDAJLy8gQXNzZXJ0IFJQU19TSUcwLgorI2RlZmluZSBNQzJfVVBMRF9ERUJJX01BU0txCTB4MDAwMDAwMDIJLy8gVXBsb2FkIERFQkkgbWFzay4KKyNkZWZpbmUgTUMyX1VQTERfSUlDX01BU0txCTB4MDAwMDAwMDEJLy8gVXBsb2FkIEkyQyBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMl9NQVNLcQkweDAwMDAyMDAwCS8vIFJQU19TSUcyIGJpdCBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMV9NQVNLcQkweDAwMDAxMDAwCS8vIFJQU19TSUcxIGJpdCBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMF9NQVNLcQkweDAwMDAwODAwCS8vIFJQU19TSUcwIGJpdCBtYXNrLgorCisjZGVmaW5lIE1DMl9ERUxBWVRSSUdfNFVTcQlNQzJfUlBTU0lHMV9PTgorI2RlZmluZSBNQzJfREVMQVlCVVNZXzRVU3EJTUMyX1JQU1NJRzFfTUFTSworCisjZGVmaW5lCU1DMl9ERUxBWVRSSUdfNlVTcQlNQzJfUlBTU0lHMl9PTgorI2RlZmluZSBNQzJfREVMQVlCVVNZXzZVU3EJTUMyX1JQU1NJRzJfTUFTSworCisjZGVmaW5lIE1DMl9VUExEX0RFQkkJCTB4MDAwMgkvLyBVcGxvYWQgREVCSS4KKyNkZWZpbmUgTUMyX1VQTERfSUlDCQkweDAwMDEJLy8gVXBsb2FkIEkyQy4KKyNkZWZpbmUgTUMyX1JQU1NJRzIJCTB4MjAwMAkvLyBSUFMgc2lnbmFsIDIgKG5vdCB1c2VkKS4KKyNkZWZpbmUgTUMyX1JQU1NJRzEJCTB4MTAwMAkvLyBSUFMgc2lnbmFsIDEgKERBQyBSUFMgYnVzeSkuCisjZGVmaW5lIE1DMl9SUFNTSUcwCQkweDA4MDAJLy8gUlBTIHNpZ25hbCAwIChBREMgUlBTIGJ1c3kpLgorCisjZGVmaW5lIE1DMl9BRENfUlBTCQlNQzJfUlBTU0lHMAkvLyBBREMgUlBTIGJ1c3kuCisjZGVmaW5lIE1DMl9EQUNfUlBTCQlNQzJfUlBTU0lHMQkvLyBEQUMgUlBTIGJ1c3kuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy9vbGRpZXMvLy8vLy8vLy8vLworI2RlZmluZSBNQzJfVVBMRF9ERUJJUQkJMHgwMDAyMDAwMgkvLyBVcGxvYWQgREVCSSByZWdpc3RlcnMuCisjZGVmaW5lIE1DMl9VUExEX0lJQ1EJCTB4MDAwMTAwMDEJLy8gVXBsb2FkIEkyQyByZWdpc3RlcnMuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFBDSSBCVVMgKFNBQTcxNDYpIFJFR0lTVEVSIEFERFJFU1MgT0ZGU0VUUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUF9QQ0lfQlRfQQkJMHgwMDRDCS8vIEF1ZGlvIERNQQorCQkJCQkJLy8gYnVyc3QvdGhyZXNob2xkCisJCQkJCQkvLyBjb250cm9sLgorI2RlZmluZSBQX0RFQklDRkcgICAgICAgICAgICAgICAweDAwN0MJLy8gREVCSSBjb25maWd1cmF0aW9uLgorI2RlZmluZSBQX0RFQklDTUQgICAgICAgICAgICAgICAweDAwODAJLy8gREVCSSBjb21tYW5kLgorI2RlZmluZSBQX0RFQklQQUdFICAgICAgICAgICAgICAweDAwODQJLy8gREVCSSBwYWdlLgorI2RlZmluZSBQX0RFQklBRCAgICAgICAgICAgICAgICAweDAwODgJLy8gREVCSSB0YXJnZXQgYWRkcmVzcy4KKyNkZWZpbmUgUF9JMkNDVFJMICAgICAgICAgICAgICAgMHgwMDhDCS8vIEkyQyBjb250cm9sLgorI2RlZmluZSBQX0kyQ1NUQVQgICAgICAgICAgICAgICAweDAwOTAJLy8gSTJDIHN0YXR1cy4KKyNkZWZpbmUgUF9CQVNFQTJfSU4JCTB4MDBBQwkvLyBBdWRpbyBpbnB1dCAyIGJhc2UKKwkJCQkJCS8vIHBoeXNpY2FsIERNQWJ1ZgorCQkJCQkJLy8gYWRkcmVzcy4KKyNkZWZpbmUgUF9QUk9UQTJfSU4JCTB4MDBCMAkvLyBBdWRpbyBpbnB1dCAyCisJCQkJCQkvLyBwaHlzaWNhbCBETUFidWYKKwkJCQkJCS8vIHByb3RlY3Rpb24gYWRkcmVzcy4KKyNkZWZpbmUgUF9QQUdFQTJfSU4JCTB4MDBCNAkvLyBBdWRpbyBpbnB1dCAyCisJCQkJCQkvLyBwYWdpbmcgYXR0cmlidXRlcy4KKyNkZWZpbmUgUF9CQVNFQTJfT1VUCQkweDAwQjgJLy8gQXVkaW8gb3V0cHV0IDIgYmFzZQorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBhZGRyZXNzLgorI2RlZmluZSBQX1BST1RBMl9PVVQJCTB4MDBCQwkvLyBBdWRpbyBvdXRwdXQgMgorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBwcm90ZWN0aW9uIGFkZHJlc3MuCisjZGVmaW5lIFBfUEFHRUEyX09VVAkJMHgwMEMwCS8vIEF1ZGlvIG91dHB1dCAyCisJCQkJCQkvLyBwYWdpbmcgYXR0cmlidXRlcy4KKyNkZWZpbmUgUF9SUFNQQUdFMCAgICAgICAgICAgICAgMHgwMEM0CS8vIFJQUzAgcGFnZS4KKyNkZWZpbmUgUF9SUFNQQUdFMSAgICAgICAgICAgICAgMHgwMEM4CS8vIFJQUzEgcGFnZS4KKyNkZWZpbmUgUF9SUFMwX1RPVVQJCTB4MDBENAkvLyBSUFMwIHRpbWUtb3V0LgorI2RlZmluZSBQX1JQUzFfVE9VVAkJMHgwMEQ4CS8vIFJQUzEgdGltZS1vdXQuCisjZGVmaW5lIFBfSUVSICAgICAgICAgICAgICAgICAgIDB4MDBEQwkvLyBJbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBQX0dQSU8gICAgICAgICAgICAgICAgICAweDAwRTAJLy8gR2VuZXJhbC1wdXJwb3NlIEkvTy4KKyNkZWZpbmUgUF9FQzFTU1IJCTB4MDBFNAkvLyBFdmVudCBjb3VudGVyIHNldCAxCisJCQkJCQkvLyBzb3VyY2Ugc2VsZWN0LgorI2RlZmluZSBQX0VDVDFSCQkJMHgwMEVDCS8vIEV2ZW50IGNvdW50ZXIKKwkJCQkJCS8vIHRocmVzaG9sZCBzZXQgMS4KKyNkZWZpbmUgUF9BQ09OMSAgICAgICAgICAgICAgICAgMHgwMEY0CS8vIEF1ZGlvIGNvbnRyb2wgMS4KKyNkZWZpbmUgUF9BQ09OMiAgICAgICAgICAgICAgICAgMHgwMEY4CS8vIEF1ZGlvIGNvbnRyb2wgMi4KKyNkZWZpbmUgUF9NQzEgICAgICAgICAgICAgICAgICAgMHgwMEZDCS8vIE1hc3RlciBjb250cm9sIDEuCisjZGVmaW5lIFBfTUMyICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvLyBNYXN0ZXIgY29udHJvbCAyLgorI2RlZmluZSBQX1JQU0FERFIwICAgICAgICAgICAgICAweDAxMDQJLy8gUlBTMCBpbnN0cnVjdGlvbiBwb2ludGVyLgorI2RlZmluZSBQX1JQU0FERFIxICAgICAgICAgICAgICAweDAxMDgJLy8gUlBTMSBpbnN0cnVjdGlvbiBwb2ludGVyLgorI2RlZmluZSBQX0lTUiAgICAgICAgICAgICAgICAgICAweDAxMEMJLy8gSW50ZXJydXB0IHN0YXR1cy4KKyNkZWZpbmUgUF9QU1IgICAgICAgICAgICAgICAgICAgMHgwMTEwCS8vIFByaW1hcnkgc3RhdHVzLgorI2RlZmluZSBQX1NTUiAgICAgICAgICAgICAgICAgICAweDAxMTQJLy8gU2Vjb25kYXJ5IHN0YXR1cy4KKyNkZWZpbmUgUF9FQzFSCQkJMHgwMTE4CS8vIEV2ZW50IGNvdW50ZXIgc2V0IDEuCisjZGVmaW5lIFBfQURQNAkJCTB4MDEzOAkvLyBMb2dpY2FsIGF1ZGlvIERNQQorCQkJCQkJLy8gcG9pbnRlciBvZiBhdWRpbworCQkJCQkJLy8gaW5wdXQgRklGTyBBMl9JTi4KKyNkZWZpbmUgUF9GQl9CVUZGRVIxICAgICAgICAgICAgMHgwMTQ0CS8vIEF1ZGlvIGZlZWRiYWNrIGJ1ZmZlciAxLgorI2RlZmluZSBQX0ZCX0JVRkZFUjIgICAgICAgICAgICAweDAxNDgJLy8gQXVkaW8gZmVlZGJhY2sgYnVmZmVyIDIuCisjZGVmaW5lIFBfVFNMMSAgICAgICAgICAgICAgICAgIDB4MDE4MAkvLyBBdWRpbyB0aW1lIHNsb3QgbGlzdCAxLgorI2RlZmluZSBQX1RTTDIgICAgICAgICAgICAgICAgICAweDAxQzAJLy8gQXVkaW8gdGltZSBzbG90IGxpc3QgMi4KKworLy8gTE9DQUwgQlVTIChHQVRFIEFSUkFZKSBSRUdJU1RFUiBBRERSRVNTIE9GRlNFVFMgLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFuYWxvZyBJL08gcmVnaXN0ZXJzOgorI2RlZmluZSBMUF9EQUNQT0wJCTB4MDA4MgkvLyAgV3JpdGUgREFDIHBvbGFyaXR5LgorI2RlZmluZSBMUF9HU0VMCQkJMHgwMDg0CS8vICBXcml0ZSBBREMgZ2Fpbi4KKyNkZWZpbmUgTFBfSVNFTAkJCTB4MDA4NgkvLyAgV3JpdGUgQURDIGNoYW5uZWwgc2VsZWN0LgorLy8gRGlnaXRhbCBJL08gKHdyaXRlIG9ubHkpOgorI2RlZmluZSBMUF9XUklOVFNFTEEJCTB4MDA0MgkvLyAgV3JpdGUgQSBpbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBMUF9XUkVER1NFTEEJCTB4MDA0NAkvLyAgV3JpdGUgQSBlZGdlIHNlbGVjdGlvbi4KKyNkZWZpbmUgTFBfV1JDQVBTRUxBCQkweDAwNDYJLy8gIFdyaXRlIEEgY2FwdHVyZSBlbmFibGUuCisjZGVmaW5lIExQX1dSRE9VVEEJCTB4MDA0OAkvLyAgV3JpdGUgQSBkaWdpdGFsIG91dHB1dC4KKyNkZWZpbmUgTFBfV1JJTlRTRUxCCQkweDAwNTIJLy8gIFdyaXRlIEIgaW50ZXJydXB0IGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JFREdTRUxCCQkweDAwNTQJLy8gIFdyaXRlIEIgZWRnZSBzZWxlY3Rpb24uCisjZGVmaW5lIExQX1dSQ0FQU0VMQgkJMHgwMDU2CS8vICBXcml0ZSBCIGNhcHR1cmUgZW5hYmxlLgorI2RlZmluZSBMUF9XUkRPVVRCCQkweDAwNTgJLy8gIFdyaXRlIEIgZGlnaXRhbCBvdXRwdXQuCisjZGVmaW5lIExQX1dSSU5UU0VMQwkJMHgwMDYyCS8vICBXcml0ZSBDIGludGVycnVwdCBlbmFibGUuCisjZGVmaW5lIExQX1dSRURHU0VMQwkJMHgwMDY0CS8vICBXcml0ZSBDIGVkZ2Ugc2VsZWN0aW9uLgorI2RlZmluZSBMUF9XUkNBUFNFTEMJCTB4MDA2NgkvLyAgV3JpdGUgQyBjYXB0dXJlIGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JET1VUQwkJMHgwMDY4CS8vICBXcml0ZSBDIGRpZ2l0YWwgb3V0cHV0LgorCisvLyBEaWdpdGFsIEkvTyAocmVhZCBvbmx5KToKKyNkZWZpbmUgTFBfUkRESU5BCQkweDAwNDAJLy8gIFJlYWQgZGlnaXRhbCBpbnB1dC4KKyNkZWZpbmUgTFBfUkRDQVBGTEdBCQkweDAwNDgJLy8gIFJlYWQgZWRnZXMgY2FwdHVyZWQuCisjZGVmaW5lIExQX1JESU5UU0VMQQkJMHgwMDRBCS8vICBSZWFkIGludGVycnVwdAorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRFREdTRUxBCQkweDAwNEMJLy8gIFJlYWQgZWRnZQorCQkJCQkJLy8gIHNlbGVjdGlvbgorCQkJCQkJLy8gIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRENBUFNFTEEJCTB4MDA0RQkvLyAgUmVhZCBjYXB0dXJlCisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRERJTkIJCTB4MDA1MAkvLyAgUmVhZCBkaWdpdGFsIGlucHV0LgorI2RlZmluZSBMUF9SRENBUEZMR0IJCTB4MDA1OAkvLyAgUmVhZCBlZGdlcyBjYXB0dXJlZC4KKyNkZWZpbmUgTFBfUkRJTlRTRUxCCQkweDAwNUEJLy8gIFJlYWQgaW50ZXJydXB0CisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SREVER1NFTEIJCTB4MDA1QwkvLyAgUmVhZCBlZGdlCisJCQkJCQkvLyAgc2VsZWN0aW9uCisJCQkJCQkvLyAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JEQ0FQU0VMQgkJMHgwMDVFCS8vICBSZWFkIGNhcHR1cmUKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERElOQwkJMHgwMDYwCS8vICBSZWFkIGRpZ2l0YWwgaW5wdXQuCisjZGVmaW5lIExQX1JEQ0FQRkxHQwkJMHgwMDY4CS8vICBSZWFkIGVkZ2VzIGNhcHR1cmVkLgorI2RlZmluZSBMUF9SRElOVFNFTEMJCTB4MDA2QQkvLyAgUmVhZCBpbnRlcnJ1cHQKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERURHU0VMQwkJMHgwMDZDCS8vICBSZWFkIGVkZ2UKKwkJCQkJCS8vICBzZWxlY3Rpb24KKwkJCQkJCS8vICByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRDQVBTRUxDCQkweDAwNkUJLy8gIFJlYWQgY2FwdHVyZQorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKy8vIENvdW50ZXIgUmVnaXN0ZXJzIChyZWFkL3dyaXRlKToKKyNkZWZpbmUgTFBfQ1IwQQkJCTB4MDAwMAkvLyAgMEEgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMEIJCQkweDAwMDIJLy8gIDBCIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjFBCQkJMHgwMDA0CS8vICAxQSBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IxQgkJCTB4MDAwNgkvLyAgMUIgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMkEJCQkweDAwMDgJLy8gIDJBIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjJCCQkJMHgwMDBBCS8vICAyQiBzZXR1cCByZWdpc3Rlci4KKy8vIENvdW50ZXIgUHJlTG9hZCAod3JpdGUpIGFuZCBMYXRjaCAocmVhZCkgUmVnaXN0ZXJzOgorI2RlZmluZQlMUF9DTlRSMEFMU1cJCTB4MDAwQwkvLyAgMEEgbHN3LgorI2RlZmluZQlMUF9DTlRSMEFNU1cJCTB4MDAwRQkvLyAgMEEgbXN3LgorI2RlZmluZQlMUF9DTlRSMEJMU1cJCTB4MDAxMAkvLyAgMEIgbHN3LgorI2RlZmluZQlMUF9DTlRSMEJNU1cJCTB4MDAxMgkvLyAgMEIgbXN3LgorI2RlZmluZQlMUF9DTlRSMUFMU1cJCTB4MDAxNAkvLyAgMUEgbHN3LgorI2RlZmluZQlMUF9DTlRSMUFNU1cJCTB4MDAxNgkvLyAgMUEgbXN3LgorI2RlZmluZQlMUF9DTlRSMUJMU1cJCTB4MDAxOAkvLyAgMUIgbHN3LgorI2RlZmluZQlMUF9DTlRSMUJNU1cJCTB4MDAxQQkvLyAgMUIgbXN3LgorI2RlZmluZQlMUF9DTlRSMkFMU1cJCTB4MDAxQwkvLyAgMkEgbHN3LgorI2RlZmluZQlMUF9DTlRSMkFNU1cJCTB4MDAxRQkvLyAgMkEgbXN3LgorI2RlZmluZQlMUF9DTlRSMkJMU1cJCTB4MDAyMAkvLyAgMkIgbHN3LgorI2RlZmluZQlMUF9DTlRSMkJNU1cJCTB4MDAyMgkvLyAgMkIgbXN3LgorLy8gTWlzY2VsbGFuZW91cyBSZWdpc3RlcnMgKHJlYWQvd3JpdGUpOgorI2RlZmluZSBMUF9NSVNDMQkJMHgwMDg4CS8vICBSZWFkL3dyaXRlIE1pc2MxLgorI2RlZmluZSBMUF9XUk1JU0MyCQkweDAwOTAJLy8gIFdyaXRlIE1pc2MyLgorI2RlZmluZSBMUF9SRE1JU0MyCQkweDAwODIJLy8gIFJlYWQgTWlzYzIuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzEgcmVnaXN0ZXIgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisjZGVmaW5lIE1JU0MxX1dFTkFCTEUJCTB4ODAwMAkvLyBlbmFiIHdyaXRlcyB0bworCQkJCQkJLy8gTUlTQzIgKGV4Y2VwdCBDbGVhcgorCQkJCQkJLy8gV2F0Y2hkb2cgYml0KS4KKyNkZWZpbmUgTUlTQzFfV0RJU0FCTEUJCTB4MDAwMAkvLyBEaXNhYmxlIHdyaXRlcyB0byBNSVNDMi4KKyNkZWZpbmUgTUlTQzFfRURDQVAJCTB4MTAwMAkvLyBlbmFiIGVkZ2UgY2FwdHVyZQorCQkJCQkJLy8gb24gRElPIGNoYW5zCisJCQkJCQkvLyBzcGVjaWZpZWQgYnkKKwkJCQkJCS8vIExQX1dSQ0FQU0VMeC4KKyNkZWZpbmUgTUlTQzFfTk9FRENBUAkJMHgwMDAwCS8vIERpc2FibGUgZWRnZQorCQkJCQkJLy8gY2FwdHVyZSBvbgorCQkJCQkJLy8gc3BlY2lmaWVkIERJTworCQkJCQkJLy8gY2hhbnMuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzEgcmVnaXN0ZXIgcmVhZHMuCisjZGVmaW5lIFJETUlTQzFfV0RUSU1FT1VUCTB4NDAwMAkvLyBXYXRjaGRvZyB0aW1lciB0aW1lZCBvdXQuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzIgcmVnaXN0ZXIgd3JpdGVzLgorI2RlZmluZSBXUk1JU0MyX1dEQ0xFQVIJCTB4ODAwMAkvLyBSZXNldCB3YXRjaGRvZworCQkJCQkJLy8gdGltZXIgdG8gemVyby4KKyNkZWZpbmUgV1JNSVNDMl9DSEFSR0VfRU5BQkxFCTB4NDAwMAkvLyBlbmFiIGJhdHRlcnkKKwkJCQkJCS8vIHRyaWNrbGUgY2hhcmdpbmcuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzIgcmVnaXN0ZXIgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisjZGVmaW5lIE1JU0MyX0JBVFRfRU5BQkxFCTB4MDAwOAkvLyBCYWNrdXAgYmF0dGVyeSBlbmFibGUuCisjZGVmaW5lIE1JU0MyX1dERU5BQkxFCQkweDAwMDQJLy8gV2F0Y2hkb2cgdGltZXIgZW5hYmxlLgorI2RlZmluZSBNSVNDMl9XRFBFUklPRF9NQVNLCTB4MDAwMwkvLyBXYXRjaGRvZyBpbnRlcnZhbAorCQkJCQkJLy8gc2VsZWN0IG1hc2suCisKKy8vIEJpdCBtYXNrcyBmb3IgQUNPTjEgcmVnaXN0ZXIuCisjZGVmaW5lIEEyX1JVTgkJCTB4NDAwMDAwMDAJLy8gUnVuIEEyIGJhc2VkIG9uIFRTTDIuCisjZGVmaW5lIEExX1JVTgkJCTB4MjAwMDAwMDAJLy8gUnVuIEExIGJhc2VkIG9uIFRTTDEuCisjZGVmaW5lIEExX1NXQVAJCQkweDAwMjAwMDAwCS8vIFVzZSBiaWctZW5kaWFuIGZvciBBMS4KKyNkZWZpbmUgQTJfU1dBUAkJCTB4MDAxMDAwMDAJLy8gVXNlIGJpZy1lbmRpYW4gZm9yIEEyLgorI2RlZmluZSBXU19NT0RFUwkJMHgwMDAxOTk5OQkvLyBXUzAgPSBUU0wxIHRyaWdnZXIKKwkJCQkJCS8vIGlucHV0LCBXUzEtV1M0ID0KKwkJCQkJCS8vIENTKiBvdXRwdXRzLgorCisjaWYgUExBVEZPUk0gPT0gSU5URUwJCS8vIEJhc2UgQUNPTjEgY29uZmlnOgorCQkJCQkJLy8gYWx3YXlzIHJ1biBBMSBiYXNlZAorCQkJCQkJLy8gb24gVFNMMS4KKyNkZWZpbmUgQUNPTjFfQkFTRQkJKCBXU19NT0RFUyB8IEExX1JVTiApCisjZWxpZiBQTEFURk9STSA9PSBNT1RPUk9MQQorI2RlZmluZSBBQ09OMV9CQVNFCQkoIFdTX01PREVTIHwgQTFfUlVOIHwgQTFfU1dBUCB8IEEyX1NXQVAgKQorI2VuZGlmCisKKyNkZWZpbmUgQUNPTjFfQURDU1RBUlQJCUFDT04xX0JBU0UJLy8gU3RhcnQgQURDOiBydW4gQTEKKwkJCQkJCS8vIGJhc2VkIG9uIFRTTDEuCisjZGVmaW5lIEFDT04xX0RBQ1NUQVJUCQkoIEFDT04xX0JBU0UgfCBBMl9SVU4gKQkvLyBTdGFydAorCQkJCQkJCS8vIHRyYW5zbWl0IHRvCisJCQkJCQkJLy8gREFDOiBydW4gQTIKKwkJCQkJCQkvLyBiYXNlZCBvbgorCQkJCQkJCS8vIFRTTDIuCisjZGVmaW5lIEFDT04xX0RBQ1NUT1AJCUFDT04xX0JBU0UJLy8gSGFsdCBBMi4KKworLy8gQml0IG1hc2tzIGZvciBBQ09OMiByZWdpc3Rlci4KKyNkZWZpbmUgQTFfQ0xLU1JDX0JDTEsxCQkweDAwMDAwMDAwCS8vIEExIGJpdCByYXRlID0gQkNMSzEgKEFEQykuCisjZGVmaW5lIEEyX0NMS1NSQ19YMQkJMHgwMDgwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvMSAoREFDcykuCisjZGVmaW5lIEEyX0NMS1NSQ19YMgkJMHgwMEMwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvMiAoREFDcykuCisjZGVmaW5lIEEyX0NMS1NSQ19YNAkJMHgwMTQwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvNCAoREFDcykuCisjZGVmaW5lIElOVkVSVF9CQ0xLMgkJMHgwMDEwMDAwMAkvLyBJbnZlcnQgQkNMSzIgKERBQ3MpLgorI2RlZmluZSBCQ0xLMl9PRQkJMHgwMDA0MDAwMAkvLyBlbmFiIEJDTEsyIChEQUNzKS4KKyNkZWZpbmUgQUNPTjJfWE9STUFTSwkJMHgwMDBDMDAwMAkvLyBYT1IgbWFzayBmb3IgQUNPTjIKKwkJCQkJCS8vIGFjdGl2ZS1sb3cgYml0cy4KKworI2RlZmluZSBBQ09OMl9JTklUCQkoIEFDT04yX1hPUk1BU0sgXiAoIEExX0NMS1NSQ19CQ0xLMSB8IEEyX0NMS1NSQ19YMiB8IElOVkVSVF9CQ0xLMiB8IEJDTEsyX09FICkgKQorCisvLyBCaXQgbWFza3MgZm9yIHRpbWVzbG90IHJlY29yZHMuCisjZGVmaW5lIFdTMQkJICAgICAJMHg0MDAwMDAwMAkvLyBXUyBvdXRwdXQgdG8gYXNzZXJ0LgorI2RlZmluZSBXUzIJCSAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUgV1MzCQkgICAgIAkweDEwMDAwMDAwCisjZGVmaW5lIFdTNAkJICAgICAJMHgwODAwMDAwMAorI2RlZmluZSBSU0QxCQkJMHgwMTAwMDAwMAkvLyBTaGlmdCBBMSBkYXRhIGluIG9uIFNEMS4KKyNkZWZpbmUgU0RXX0ExCQkJMHgwMDgwMDAwMAkvLyBTdG9yZSByY3YnZCBjaGFyIGF0CisJCQkJCQkvLyBuZXh0IGNoYXIgc2xvdCBvZgorCQkJCQkJLy8gRFdPUkQxIGJ1ZmZlci4KKyNkZWZpbmUgU0lCX0ExCQkJMHgwMDQwMDAwMAkvLyBTdG9yZSByY3YnZCBjaGFyIGF0CisJCQkJCQkvLyBuZXh0IGNoYXIgc2xvdCBvZgorCQkJCQkJLy8gRkIxIGJ1ZmZlci4KKyNkZWZpbmUgU0ZfQTEJCQkweDAwMjAwMDAwCS8vIFdyaXRlIHVuc2lnbmVkIGxvbmcKKwkJCQkJCS8vIGJ1ZmZlciB0byBpbnB1dAorCQkJCQkJLy8gRklGTy4KKworLy9TZWxlY3QgcGFyYWxsZWwtdG8tc2VyaWFsIGNvbnZlcnRlcidzIGRhdGEgc291cmNlOgorI2RlZmluZSBYRklGT18wCQkJMHgwMDAwMDAwMAkvLyAgIERhdGEgZmlmbyBieXRlIDAuCisjZGVmaW5lIFhGSUZPXzEJCQkweDAwMDAwMDEwCS8vICAgRGF0YSBmaWZvIGJ5dGUgMS4KKyNkZWZpbmUgWEZJRk9fMgkJCTB4MDAwMDAwMjAJLy8gICBEYXRhIGZpZm8gYnl0ZSAyLgorI2RlZmluZSBYRklGT18zCQkJMHgwMDAwMDAzMAkvLyAgIERhdGEgZmlmbyBieXRlIDMuCisjZGVmaW5lIFhGQjAJCQkweDAwMDAwMDQwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMC4KKyNkZWZpbmUgWEZCMQkJCTB4MDAwMDAwNTAJLy8gICBGQl9CVUZGRVIgYnl0ZSAxLgorI2RlZmluZSBYRkIyCQkJMHgwMDAwMDA2MAkvLyAgIEZCX0JVRkZFUiBieXRlIDIuCisjZGVmaW5lIFhGQjMJCQkweDAwMDAwMDcwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMy4KKyNkZWZpbmUgU0lCX0EyCQkJMHgwMDAwMDIwMAkvLyBTdG9yZSBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3MgaW5wdXQKKwkJCQkJCS8vIHNoaWZ0ZXIgdG8gRkIyCisJCQkJCQkvLyBidWZmZXIuCisjZGVmaW5lIFNGX0EyCQkJMHgwMDAwMDEwMAkvLyBTdG9yZSBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3MgaW5wdXQKKwkJCQkJCS8vIHNoaWZ0ZXIgdG8gaXRzCisJCQkJCQkvLyBpbnB1dCBmaWZvLgorI2RlZmluZSBMRl9BMgkJCTB4MDAwMDAwODAJLy8gTG9hZCBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3Mgb3V0cHV0CisJCQkJCQkvLyBmaWZvIGludG8gaXRzCisJCQkJCQkvLyBvdXRwdXQgZHdvcmQKKwkJCQkJCS8vIGJ1ZmZlci4KKyNkZWZpbmUgWFNEMgkJCTB4MDAwMDAwMDgJLy8gU2hpZnQgZGF0YSBvdXQgb24gU0QyLgorI2RlZmluZSBSU0QzCQkJMHgwMDAwMTgwMAkvLyBTaGlmdCBkYXRhIGluIG9uIFNEMy4KKyNkZWZpbmUgUlNEMgkJCTB4MDAwMDEwMDAJLy8gU2hpZnQgZGF0YSBpbiBvbiBTRDIuCisjZGVmaW5lIExPV19BMgkJCTB4MDAwMDAwMDIJLy8gRHJpdmUgbGFzdCBTRCBsb3cKKwkJCQkJCS8vIGZvciA3IGNsa3MsIHRoZW4KKwkJCQkJCS8vIHRyaS1zdGF0ZS4KKyNkZWZpbmUgRU9TCQkgICAgIAkweDAwMDAwMDAxCS8vIEVuZCBvZiBzdXBlcmZyYW1lLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEkyQyBjb25maWd1cmF0aW9uIGNvbnN0YW50cy4KKyNkZWZpbmUgSTJDX0NMS1NFTAkJMHgwNDAwCS8vIEkyQyBiaXQgcmF0ZSA9CisJCQkJCQkvLyBQQ0ljbGsvNDgwID0gNjguNzUKKwkJCQkJCS8vIEtIei4KKyNkZWZpbmUgSTJDX0JJVFJBVEUJCTY4Ljc1CS8vIEkyQyBidXMgZGF0YSBiaXQKKwkJCQkJCS8vIHJhdGUgKGRldGVybWluZWQgYnkKKwkJCQkJCS8vIEkyQ19DTEtTRUwpIGluIEtIei4KKyNkZWZpbmUgSTJDX1dSVElNRQkJMTUuMAkvLyBXb3JzdCBjYXNlIHRpbWUsaW4KKwkJCQkJCS8vIG1zZWMsIGZvciBFRVBST00KKwkJCQkJCS8vIGludGVybmFsIHdyaXRlIG9wLgorCisvLyBJMkMgbWFuaWZlc3QgY29uc3RhbnRzLgorCisvLyBNYXggcmV0cmllcyB0byB3YWl0IGZvciBFRVBST00gd3JpdGUuCisjZGVmaW5lIEkyQ19SRVRSSUVTCQkoIEkyQ19XUlRJTUUgKiBJMkNfQklUUkFURSAvIDkuMCApCisjZGVmaW5lIEkyQ19FUlIJCQkweDAwMDIJLy8gSTJDIGNvbnRyb2wvc3RhdHVzCisJCQkJCQkvLyBmbGFnIEVSUk9SLgorI2RlZmluZSBJMkNfQlVTWQkJMHgwMDAxCS8vIEkyQyBjb250cm9sL3N0YXR1cworCQkJCQkJLy8gZmxhZyBCVVNZLgorI2RlZmluZSBJMkNfQUJPUlQJCTB4MDA4MAkvLyBJMkMgc3RhdHVzIGZsYWcgQUJPUlQuCisjZGVmaW5lIEkyQ19BVFRSU1RBUlQJCTB4MwkvLyBJMkMgYXR0cmlidXRlIFNUQVJULgorI2RlZmluZSBJMkNfQVRUUkNPTlQJCTB4MgkvLyBJMkMgYXR0cmlidXRlIENPTlQuCisjZGVmaW5lIEkyQ19BVFRSU1RPUAkJMHgxCS8vIEkyQyBhdHRyaWJ1dGUgU1RPUC4KKyNkZWZpbmUgSTJDX0FUVFJOT1AJCTB4MAkvLyBJMkMgYXR0cmlidXRlIE5PUC4KKworLy8gSTJDIHJlYWQgY29tbWFuZCAgfCBFRVBST00gYWRkcmVzcy4KKyNkZWZpbmUgSTJDUgkJCSggZGV2cHJpdi0+STJDQWRycyB8IDEgKQorCisvLyBJMkMgd3JpdGUgY29tbWFuZCB8IEVFUFJPTSBhZGRyZXNzLgorI2RlZmluZSBJMkNXCQkJKCBkZXZwcml2LT5JMkNBZHJzICkKKworLy8gQ29kZSBtYWNyb3MgdXNlZCBmb3IgY29uc3RydWN0aW5nIEkyQyBjb21tYW5kIGJ5dGVzLgorI2RlZmluZSBJMkNfQjIoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgNiApIHwgKCAoVkFMKSA8PCAyNCApICkKKyNkZWZpbmUgSTJDX0IxKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDQgKSB8ICggKFZBTCkgPDwgMTYgKSApCisjZGVmaW5lIEkyQ19CMChBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCAyICkgfCAoIChWQUwpIDw8ICA4ICkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9vbGRlc3QKKyNkZWZpbmUgUF9ERUJJQ0ZHcSAgICAgICAgICAgICAgMHgwMDdDCS8vIERFQkkgY29uZmlndXJhdGlvbi4KKyNkZWZpbmUgUF9ERUJJQ01EcSAgICAgICAgICAgICAgMHgwMDgwCS8vIERFQkkgY29tbWFuZC4KKyNkZWZpbmUgUF9ERUJJUEFHRXEgICAgICAgICAgICAgMHgwMDg0CS8vIERFQkkgcGFnZS4KKyNkZWZpbmUgUF9ERUJJQURxICAgICAgICAgICAgICAgMHgwMDg4CS8vIERFQkkgdGFyZ2V0IGFkZHJlc3MuCisKKyNkZWZpbmUgREVCSV9DRkdfVE9RCQkweDAzQzAwMDAwCS8vIHRpbWVvdXQgKDE1IFBDSSBjeWNsZXMpCisjZGVmaW5lIERFQklfQ0ZHX0ZBU1RRCQkweDEwMDAwMDAwCS8vIGZhc3QgbW9kZSBlbmFibGUKKyNkZWZpbmUgREVCSV9DRkdfMTZRCQkweDAwMDgwMDAwCS8vIDE2LWJpdCBhY2Nlc3MgZW5hYmxlCisjZGVmaW5lIERFQklfQ0ZHX0lOQ1EJCTB4MDAwNDAwMDAJLy8gZW5hYmxlIGFkZHJlc3MgaW5jcmVtZW50CisjZGVmaW5lIERFQklfQ0ZHX1RJTUVST0ZGUQkweDAwMDEwMDAwCS8vIGRpc2FibGUgdGltZXIKKyNkZWZpbmUgREVCSV9DTURfUkRRCQkweDAwMDUwMDAwCS8vIHJlYWQgaW1tZWRpYXRlIDIgYnl0ZXMKKyNkZWZpbmUgREVCSV9DTURfV1JRCQkweDAwMDQwMDAwCS8vIHdyaXRlIGltbWVkaWF0ZSAyIGJ5dGVzCisjZGVmaW5lIERFQklfUEFHRV9ESVNBQkxFUQkweDAwMDAwMDAwCS8vIHBhZ2luZyBkaXNhYmxlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFQkkgY29tbWFuZCBjb25zdGFudHMuCisjZGVmaW5lIERFQklfQ01EX1NJWkUxNgkJKCAyIDw8IDE3ICkJLy8gVHJhbnNmZXIgc2l6ZSBpcworCQkJCQkJLy8gYWx3YXlzIDIgYnl0ZXMuCisjZGVmaW5lIERFQklfQ01EX1JFQUQJCTB4MDAwMTAwMDAJLy8gUmVhZCBvcGVyYXRpb24uCisjZGVmaW5lIERFQklfQ01EX1dSSVRFCQkweDAwMDAwMDAwCS8vIFdyaXRlIG9wZXJhdGlvbi4KKworLy8gUmVhZCBpbW1lZGlhdGUgMiBieXRlcy4KKyNkZWZpbmUgREVCSV9DTURfUkRXT1JECQkoIERFQklfQ01EX1JFQUQgIHwgREVCSV9DTURfU0laRTE2ICkKKworLy8gV3JpdGUgaW1tZWRpYXRlIDIgYnl0ZXMuCisjZGVmaW5lIERFQklfQ01EX1dSV09SRAkJKCBERUJJX0NNRF9XUklURSB8IERFQklfQ01EX1NJWkUxNiApCisKKy8vIERFQkkgY29uZmlndXJhdGlvbiBjb25zdGFudHMuCisjZGVmaW5lIERFQklfQ0ZHX1hJUlFfRU4JMHg4MDAwMDAwMAkvLyBlbmFiIGV4dGVybmFsCisJCQkJCQkvLyBpbnRlcnJ1cHQgb24gR1BJTzMuCisjZGVmaW5lIERFQklfQ0ZHX1hSRVNVTUUJMHg0MDAwMDAwMAkvLyBSZXN1bWUgYmxvY2sKKwkJCQkJCS8vIHRyYW5zZmVyIHdoZW4gWElSUQorCQkJCQkJLy8gZGVhc3NlcnRlZC4KKyNkZWZpbmUgREVCSV9DRkdfRkFTVAkJMHgxMDAwMDAwMAkvLyBGYXN0IG1vZGUgZW5hYmxlLgorCisvLyA0LWJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyBERUJJIHRpbWVvdXQgdmFsdWUgaW4gUENJIGNsb2NrIGN5Y2xlczoKKyNkZWZpbmUgREVCSV9DRkdfVE9VVF9CSVQJMjIJLy8gICBGaW5pc2ggREVCSSBjeWNsZSBhZnRlcgorCQkJCQkvLyAgIHRoaXMgbWFueSBjbG9ja3MuCisKKy8vIDItYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIEVuZGlhbiBieXRlIGxhbmUgc3RlZXJpbmc6CisjZGVmaW5lIERFQklfQ0ZHX1NXQVBfTk9ORQkweDAwMDAwMDAwCS8vICAgU3RyYWlnaHQgLSBkb24ndAorCQkJCQkJLy8gICBzd2FwIGFueSBieXRlcworCQkJCQkJLy8gICAoSW50ZWwpLgorI2RlZmluZSBERUJJX0NGR19TV0FQXzIJCTB4MDAxMDAwMDAJLy8gICAyLWJ5dGUgc3dhcCAoTW90b3JvbGEpLgorI2RlZmluZSBERUJJX0NGR19TV0FQXzQJCTB4MDAyMDAwMDAJLy8gICA0LWJ5dGUgc3dhcC4KKyNkZWZpbmUgREVCSV9DRkdfMTYJCTB4MDAwODAwMDAJLy8gU2xhdmUgaXMgYWJsZSB0bworCQkJCQkJLy8gc2VydmUgMTYtYml0CisJCQkJCQkvLyBjeWNsZXMuCisKKyNkZWZpbmUgREVCSV9DRkdfU0xBVkUxNgkweDAwMDgwMDAwCS8vIFNsYXZlIGlzIGFibGUgdG8KKwkJCQkJCS8vIHNlcnZlIDE2LWJpdAorCQkJCQkJLy8gY3ljbGVzLgorI2RlZmluZSBERUJJX0NGR19JTkMJCTB4MDAwNDAwMDAJLy8gZW5hYiBhZGRyZXNzCisJCQkJCQkvLyBpbmNyZW1lbnQgZm9yIGJsb2NrCisJCQkJCQkvLyB0cmFuc2ZlcnMuCisjZGVmaW5lIERFQklfQ0ZHX0lOVEVMCQkweDAwMDIwMDAwCS8vIEludGVsIHN0eWxlIGxvY2FsIGJ1cy4KKyNkZWZpbmUgREVCSV9DRkdfVElNRVJPRkYJMHgwMDAxMDAwMAkvLyBEaXNhYmxlIHRpbWVyLgorCisjaWYgUExBVEZPUk0gPT0gSU5URUwKKworI2RlZmluZSBERUJJX1RPVVQJCTcJLy8gV2FpdCA3IFBDSSBjbG9ja3MKKwkJCQkJCS8vICgyMTIgbnMpIGJlZm9yZQorCQkJCQkJLy8gcG9sbGluZyBSRFkuCisKKy8vIEludGVsIGJ5dGUgbGFuZSBzdGVlcmluZyAocGFzcyB0aHJvdWdoIGFsbCBieXRlIGxhbmVzKS4KKyNkZWZpbmUgREVCSV9TV0FQCQlERUJJX0NGR19TV0FQX05PTkUKKworI2VsaWYgUExBVEZPUk0gPT0gTU9UT1JPTEEKKworI2RlZmluZSBERUJJX1RPVVQJCTE1CS8vIFdhaXQgMTUgUENJIGNsb2NrcyAoNDU0IG5zKQorCQkJCQkvLyBtYXhpbXVtIGJlZm9yZSB0aW1pbmcgb3V0LgorI2RlZmluZSBERUJJX1NXQVAJCURFQklfQ0ZHX1NXQVBfMgkvLyBNb3Rvcm9sYSBieXRlIGxhbmUgc3RlZXJpbmcuCisKKyNlbmRpZgorCisvLyBERUJJIHBhZ2UgdGFibGUgY29uc3RhbnRzLgorI2RlZmluZSBERUJJX1BBR0VfRElTQUJMRQkweDAwMDAwMDAwCS8vIFBhZ2luZyBkaXNhYmxlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vRVhUUkEgRlJPTSBPVEhFUiBTQU5TT1JBWSAgKiAuaC8vLy8vLy8vCisKKy8vIExvYWRTcmMgdmFsdWVzOgorI2RlZmluZSBMT0FEU1JDX0lORFgJCTAJLy8gUHJlbG9hZCBjb3JlIGluIHJlc3BvbnNlIHRvCisJCQkJCS8vIEluZGV4LgorI2RlZmluZSBMT0FEU1JDX09WRVIJCTEJLy8gUHJlbG9hZCBjb3JlIGluIHJlc3BvbnNlIHRvCisJCQkJCS8vIE92ZXJmbG93LgorI2RlZmluZSBMT0FEU1JDQl9PVkVSQQkJMgkvLyBQcmVsb2FkIEIgY29yZSBpbiByZXNwb25zZQorCQkJCQkvLyB0byBBIE92ZXJmbG93LgorI2RlZmluZSBMT0FEU1JDX05PTkUJCTMJLy8gTmV2ZXIgcHJlbG9hZCBjb3JlLgorCisvLyBJbnRTcmMgdmFsdWVzOgorI2RlZmluZSBJTlRTUkNfTk9ORSAJCTAJLy8gSW50ZXJydXB0cyBkaXNhYmxlZC4KKyNkZWZpbmUgSU5UU1JDX09WRVIgCQkxCS8vIEludGVycnVwdCBvbiBPdmVyZmxvdy4KKyNkZWZpbmUgSU5UU1JDX0lORFggCQkyCS8vIEludGVycnVwdCBvbiBJbmRleC4KKyNkZWZpbmUgSU5UU1JDX0JPVEggCQkzCS8vIEludGVycnVwdCBvbiBJbmRleCBvciBPdmVyZmxvdy4KKworLy8gTGF0Y2hTcmMgdmFsdWVzOgorI2RlZmluZSBMQVRDSFNSQ19BQl9SRUFECTAJLy8gTGF0Y2ggb24gcmVhZC4KKyNkZWZpbmUgTEFUQ0hTUkNfQV9JTkRYQQkxCS8vIExhdGNoIEEgb24gQSBJbmRleC4KKyNkZWZpbmUgTEFUQ0hTUkNfQl9JTkRYQgkyCS8vIExhdGNoIEIgb24gQiBJbmRleC4KKyNkZWZpbmUgTEFUQ0hTUkNfQl9PVkVSQQkzCS8vIExhdGNoIEIgb24gQSBPdmVyZmxvdy4KKworLy8gSW5keFNyYyB2YWx1ZXM6CisjZGVmaW5lIElORFhTUkNfSEFSRAkJMAkvLyBIYXJkd2FyZSBvciBzb2Z0d2FyZSBpbmRleC4KKyNkZWZpbmUgSU5EWFNSQ19TT0ZUCQkxCS8vIFNvZnR3YXJlIGluZGV4IG9ubHkuCisKKy8vIEluZHhQb2wgdmFsdWVzOgorI2RlZmluZSBJTkRYUE9MX1BPUyAJCTAJLy8gSW5kZXggaW5wdXQgaXMgYWN0aXZlIGhpZ2guCisjZGVmaW5lIElORFhQT0xfTkVHIAkJMQkvLyBJbmRleCBpbnB1dCBpcyBhY3RpdmUgbG93LgorCisvLyBDbGtTcmMgdmFsdWVzOgorI2RlZmluZSBDTEtTUkNfQ09VTlRFUgkJMAkvLyBDb3VudGVyIG1vZGUuCisjZGVmaW5lIENMS1NSQ19USU1FUgkJMgkvLyBUaW1lciBtb2RlLgorI2RlZmluZSBDTEtTUkNfRVhURU5ERVIJCTMJLy8gRXh0ZW5kZXIgbW9kZS4KKworLy8gQ2xrUG9sIHZhbHVlczoKKyNkZWZpbmUgQ0xLUE9MX1BPUwkJMAkvLyBDb3VudGVyL0V4dGVuZGVyIGNsb2NrIGlzCisJCQkJCS8vIGFjdGl2ZSBoaWdoLgorI2RlZmluZSBDTEtQT0xfTkVHCQkxCS8vIENvdW50ZXIvRXh0ZW5kZXIgY2xvY2sgaXMKKwkJCQkJLy8gYWN0aXZlIGxvdy4KKyNkZWZpbmUgQ05URElSX1VQCQkwCS8vIFRpbWVyIGNvdW50cyB1cC4KKyNkZWZpbmUgQ05URElSX0RPV04gCQkxCS8vIFRpbWVyIGNvdW50cyBkb3duLgorCisvLyBDbGtFbmFiIHZhbHVlczoKKyNkZWZpbmUgQ0xLRU5BQl9BTFdBWVMJCTAJLy8gQ2xvY2sgYWx3YXlzIGVuYWJsZWQuCisjZGVmaW5lIENMS0VOQUJfSU5ERVgJCTEJLy8gQ2xvY2sgaXMgZW5hYmxlZCBieSBpbmRleC4KKworLy8gQ2xrTXVsdCB2YWx1ZXM6CisjZGVmaW5lIENMS01VTFRfNFggCQkwCS8vIDR4IGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENMS01VTFRfMlggCQkxCS8vIDJ4IGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENMS01VTFRfMVggCQkyCS8vIDF4IGNsb2NrIG11bHRpcGxpZXIuCisKKy8vIEJpdCBGaWVsZCBwb3NpdGlvbnMgaW4gQ09VTlRFUl9TRVRVUCBzdHJ1Y3R1cmU6CisjZGVmaW5lIEJGX0xPQURTUkMJCTkJLy8gUHJlbG9hZCB0cmlnZ2VyLgorI2RlZmluZSBCRl9JTkRYU1JDCQk3CS8vIEluZGV4IHNvdXJjZS4KKyNkZWZpbmUgQkZfSU5EWFBPTAkJNgkvLyBJbmRleCBwb2xhcml0eS4KKyNkZWZpbmUgQkZfQ0xLU1JDCQk0CS8vIENsb2NrIHNvdXJjZS4KKyNkZWZpbmUgQkZfQ0xLUE9MCQkzCS8vIENsb2NrIHBvbGFyaXR5L2NvdW50IGRpcmVjdGlvbi4KKyNkZWZpbmUgQkZfQ0xLTVVMVAkJMQkvLyBDbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBCRl9DTEtFTkFCCQkwCS8vIENsb2NrIGVuYWJsZS4KKworLy8gRW51bWVyYXRlZCBjb3VudGVyIG9wZXJhdGluZyBtb2RlcyBzcGVjaWZpZWQgYnkgQ2xrU3JjIGJpdCBmaWVsZCBpbgorLy8gYSBDT1VOVEVSX1NFVFVQLgorCisjZGVmaW5lIENMS1NSQ19DT1VOVEVSCQkwCS8vIENvdW50ZXI6IEVOQ19DIGNsb2NrLCBFTkNfRAorCQkJCQkvLyBkaXJlY3Rpb24uCisjZGVmaW5lIENMS1NSQ19USU1FUgkJMgkvLyBUaW1lcjogU1lTX0MgY2xvY2ssCisJCQkJCS8vIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkKKwkJCQkJLy8gQ2xrUG9sLgorI2RlZmluZSBDTEtTUkNfRVhURU5ERVIJCTMJLy8gRXh0ZW5kZXI6IE9WUl9BIGNsb2NrLAorCQkJCQkvLyBFTkNfRCBkaXJlY3Rpb24uCisKKy8vIEVudW1lcmF0ZWQgY291bnRlciBjbG9jayBtdWx0aXBsaWVycy4KKworI2RlZmluZSBNVUxUX1gwCQkJMHgwMDAzCS8vIFN1cHBvcnRzIG5vIG11bHRpcGxpZXJzOworCQkJCQkvLyBmaXhlZCBwaHlzaWNhbCBtdWx0aXBsaWVyID0KKwkJCQkJLy8gMy4KKyNkZWZpbmUgTVVMVF9YMQkJCTB4MDAwMgkvLyBTdXBwb3J0cyBtdWx0aXBsaWVyIHgxOworCQkJCQkvLyBmaXhlZCBwaHlzaWNhbCBtdWx0aXBsaWVyID0KKwkJCQkJLy8gMi4KKyNkZWZpbmUgTVVMVF9YMgkJCTB4MDAwMQkvLyBTdXBwb3J0cyBtdWx0aXBsaWVycyB4MSwKKwkJCQkJLy8geDI7IHBoeXNpY2FsIG11bHRpcGxpZXJzID0KKwkJCQkJLy8gMSBvciAyLgorI2RlZmluZSBNVUxUX1g0CQkJMHgwMDAwCS8vIFN1cHBvcnRzIG11bHRpcGxpZXJzIHgxLAorCQkJCQkvLyB4MiwgeDQ7IHBoeXNpY2FsCisJCQkJCS8vIG11bHRpcGxpZXJzID0gMCwgMSBvciAyLgorCisvLyBTYW5pdHktY2hlY2sgbGltaXRzIGZvciBwYXJhbWV0ZXJzLgorCisjZGVmaW5lIE5VTV9DT1VOVEVSUwkJNgkvLyBNYXhpbXVtIHZhbGlkIGNvdW50ZXIKKwkJCQkJLy8gbG9naWNhbCBjaGFubmVsIG51bWJlci4KKyNkZWZpbmUgTlVNX0lOVFNPVVJDRVMJCTQKKyNkZWZpbmUgTlVNX0xBVENIU09VUkNFUwk0CisjZGVmaW5lIE5VTV9DTEtNVUxUUwkJNAorI2RlZmluZSBOVU1fQ0xLU09VUkNFUwkJNAorI2RlZmluZSBOVU1fQ0xLUE9MUwkJMgorI2RlZmluZSBOVU1fSU5ERVhQT0xTCQkyCisjZGVmaW5lIE5VTV9JTkRFWFNPVVJDRVMJMgorI2RlZmluZSBOVU1fTE9BRFRSSUdTCQk0CisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgaW4gQ1JBIGFuZCBDUkIgY291bnRlciBjb250cm9sIHJlZ2lzdGVycy4KKworLy8gQml0IGZpZWxkIHBvc2l0aW9ucyBpbiBDUkE6CisjZGVmaW5lIENSQUJJVF9JTkRYU1JDX0IJMTQJLy8gICBCIGluZGV4IHNvdXJjZS4KKyNkZWZpbmUgQ1JBQklUX0NMS1NSQ19CCQkxMgkvLyAgIEIgY2xvY2sgc291cmNlLgorI2RlZmluZSBDUkFCSVRfSU5EWFBPTF9BCTExCS8vICAgQSBpbmRleCBwb2xhcml0eS4KKyNkZWZpbmUgQ1JBQklUX0xPQURTUkNfQQkgOQkvLyAgIEEgcHJlbG9hZCB0cmlnZ2VyLgorI2RlZmluZSBDUkFCSVRfQ0xLTVVMVF9BCSA3CS8vICAgQSBjbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBDUkFCSVRfSU5UU1JDX0EJCSA1CS8vICAgQSBpbnRlcnJ1cHQgc291cmNlLgorI2RlZmluZSBDUkFCSVRfQ0xLUE9MX0EJCSA0CS8vICAgQSBjbG9jayBwb2xhcml0eS4KKyNkZWZpbmUgQ1JBQklUX0lORFhTUkNfQQkgMgkvLyAgIEEgaW5kZXggc291cmNlLgorI2RlZmluZSBDUkFCSVRfQ0xLU1JDX0EJCSAwCS8vICAgQSBjbG9jayBzb3VyY2UuCisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgaW4gQ1JCOgorI2RlZmluZSBDUkJCSVRfSU5UUkVTRVRDTUQJMTUJLy8gICBJbnRlcnJ1cHQgcmVzZXQgY29tbWFuZC4KKyNkZWZpbmUgQ1JCQklUX0lOVFJFU0VUX0IJMTQJLy8gICBCIGludGVycnVwdCByZXNldCBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9JTlRSRVNFVF9BCTEzCS8vICAgQSBpbnRlcnJ1cHQgcmVzZXQgZW5hYmxlLgorI2RlZmluZSBDUkJCSVRfQ0xLRU5BQl9BCTEyCS8vICAgQSBjbG9jayBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9JTlRTUkNfQgkJMTAJLy8gICBCIGludGVycnVwdCBzb3VyY2UuCisjZGVmaW5lIENSQkJJVF9MQVRDSFNSQwkJIDgJLy8gICBBL0IgbGF0Y2ggc291cmNlLgorI2RlZmluZSBDUkJCSVRfTE9BRFNSQ19CCSA2CS8vICAgQiBwcmVsb2FkIHRyaWdnZXIuCisjZGVmaW5lIENSQkJJVF9DTEtNVUxUX0IJIDMJLy8gICBCIGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENSQkJJVF9DTEtFTkFCX0IJIDIJLy8gICBCIGNsb2NrIGVuYWJsZS4KKyNkZWZpbmUgQ1JCQklUX0lORFhQT0xfQgkgMQkvLyAgIEIgaW5kZXggcG9sYXJpdHkuCisjZGVmaW5lIENSQkJJVF9DTEtQT0xfQgkJIDAJLy8gICBCIGNsb2NrIHBvbGFyaXR5LgorCisvLyBCaXQgZmllbGQgbWFza3MgZm9yIENSQSBhbmQgQ1JCLgorCisjZGVmaW5lIENSQU1TS19JTkRYU1JDX0IJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9JTkRYU1JDX0IpICkKKyNkZWZpbmUgQ1JBTVNLX0NMS1NSQ19CCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0NMS1NSQ19CKSApCisjZGVmaW5lIENSQU1TS19JTkRYUE9MX0EJKCAodWludDE2X3QpKCAxIDw8IENSQUJJVF9JTkRYUE9MX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0xPQURTUkNfQQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0xPQURTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLTVVMVF9BCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLTVVMVF9BKSApCisjZGVmaW5lIENSQU1TS19JTlRTUkNfQQkJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9JTlRTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLUE9MX0EJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLUE9MX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0lORFhTUkNfQQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0lORFhTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLU1JDX0EJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLU1JDX0EpICkKKworI2RlZmluZSBDUkJNU0tfSU5UUkVTRVRDTUQJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTlRSRVNFVENNRCkgKQorI2RlZmluZSBDUkJNU0tfSU5UUkVTRVRfQgkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0lOVFJFU0VUX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0lOVFJFU0VUX0EJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTlRSRVNFVF9BKSApCisjZGVmaW5lIENSQk1TS19DTEtFTkFCX0EJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9DTEtFTkFCX0EpICkKKyNkZWZpbmUgQ1JCTVNLX0lOVFNSQ19CCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JCQklUX0lOVFNSQ19CKSApCisjZGVmaW5lIENSQk1TS19MQVRDSFNSQwkJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9MQVRDSFNSQykgKQorI2RlZmluZSBDUkJNU0tfTE9BRFNSQ19CCSggKHVpbnQxNl90KSggMyA8PCBDUkJCSVRfTE9BRFNSQ19CKSApCisjZGVmaW5lIENSQk1TS19DTEtNVUxUX0IJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9DTEtNVUxUX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0NMS0VOQUJfQgkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0NMS0VOQUJfQikgKQorI2RlZmluZSBDUkJNU0tfSU5EWFBPTF9CCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfSU5EWFBPTF9CKSApCisjZGVmaW5lIENSQk1TS19DTEtQT0xfQgkJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9DTEtQT0xfQikgKQorCisjZGVmaW5lIENSQk1TS19JTlRDVFJMCQkoIENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BIHwgQ1JCTVNLX0lOVFJFU0VUX0IgKQkvLyBJbnRlcnJ1cHQgcmVzZXQgY29udHJvbCBiaXRzLgorCisvLyBCaXQgZmllbGQgcG9zaXRpb25zIGZvciBzdGFuZGFyZGl6ZWQgU0VUVVAgc3RydWN0dXJlLgorCisjZGVmaW5lIFNUREJJVF9JTlRTUkMJCTEzCisjZGVmaW5lIFNUREJJVF9MQVRDSFNSQwkJMTEKKyNkZWZpbmUgU1REQklUX0xPQURTUkMJCSA5CisjZGVmaW5lIFNUREJJVF9JTkRYU1JDCQkgNworI2RlZmluZSBTVERCSVRfSU5EWFBPTAkJIDYKKyNkZWZpbmUgU1REQklUX0NMS1NSQwkJIDQKKyNkZWZpbmUgU1REQklUX0NMS1BPTAkJIDMKKyNkZWZpbmUgU1REQklUX0NMS01VTFQJCSAxCisjZGVmaW5lIFNUREJJVF9DTEtFTkFCCQkgMAorCisvLyBCaXQgZmllbGQgbWFza3MgZm9yIHN0YW5kYXJkaXplZCBTRVRVUCBzdHJ1Y3R1cmUuCisKKyNkZWZpbmUgU1RETVNLX0lOVFNSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9JTlRTUkMgICApICkKKyNkZWZpbmUgU1RETVNLX0xBVENIU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0xBVENIU1JDICkgKQorI2RlZmluZSBTVERNU0tfTE9BRFNSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9MT0FEU1JDICApICkKKyNkZWZpbmUgU1RETVNLX0lORFhTUkMJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfSU5EWFNSQyAgKSApCisjZGVmaW5lIFNURE1TS19JTkRYUE9MCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0lORFhQT0wgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0NMS1NSQyAgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLUE9MCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0NMS1BPTCAgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLTVVMVAkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9DTEtNVUxUICApICkKKyNkZWZpbmUgU1RETVNLX0NMS0VOQUIJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfQ0xLRU5BQiAgKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyogdHlwZWRlZiBzdHJ1Y3QgaW5kZXhDb3VudGVyICovCisvKiB7ICovCisvKiAgIHVuc2lnbmVkIGludCBhbzsgKi8KKy8qICAgdW5zaWduZWQgaW50IGFpOyAqLworLyogICB1bnNpZ25lZCBpbnQgZGlnb3V0OyAqLworLyogICB1bnNpZ25lZCBpbnQgZGlnaW47ICovCisvKiAgIHVuc2lnbmVkIGludCBlbmM7ICovCisvKiB9Q2FsbENvdW50ZXI7ICovCisKK3R5cGVkZWYgc3RydWN0IGJ1ZmZlckRNQSB7CisJZG1hX2FkZHJfdCBQaHlzaWNhbEJhc2U7CisJdm9pZCAqTG9naWNhbEJhc2U7CisJdWludDMyX3QgRE1BSGFuZGxlOworfSBETUFCVUY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxMzgyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwpAQCAtMCwwICsxLDI5MzIgQEAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgorI2RlZmluZSBEUklWRVJfREVTQyAiU3RpcmxpbmcvSVRMIFVTQi1EVVggLS0gQmVybmQuUG9yckBmMnMuY29tIgorLyoKKyAgIGNvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBCZXJuZCBQb3JyLCBCZXJuZC5Qb3JyQGYycy5jb20KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisvKgorRHJpdmVyOiB1c2JkdXgKK0Rlc2NyaXB0aW9uOiBVbml2ZXJzaXR5IG9mIFN0aXJsaW5nIFVTQiBEQVEgJiBJTkNJVEUgVGVjaG5vbG9neSBMaW1pdGVkCitEZXZpY2VzOiBbSVRMXSBVU0ItRFVYICh1c2JkdXgubykKK0F1dGhvcjogQmVybmQgUG9yciA8QmVybmRQb3JyQGYycy5jb20+CitVcGRhdGVkOiAyNSBOb3YgMjAwNworU3RhdHVzOiBUZXN0aW5nCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFlvdSBoYXZlIHRvIHVwbG9hZCBmaXJtd2FyZSB3aXRoIHRoZSAtaSBvcHRpb24uIFRoZQorICBmaXJtd2FyZSBpcyB1c3VhbGx5IGluc3RhbGxlZCB1bmRlciAvdXNyL3NoYXJlL3VzYiBvcgorICAvdXNyL2xvY2FsL3NoYXJlL3VzYiBvciAvbGliL2Zpcm13YXJlLgorCitDb25uZWN0aW9uIHNjaGVtZSBmb3IgdGhlIGNvdW50ZXIgYXQgdGhlIGRpZ2l0YWwgcG9ydDoKKyAgMD0vQ0xLMCwgMT1VUC9ET1dOMCwgMj1SRVNFVDAsIDQ9L0NMSzEsIDU9VVAvRE9XTjEsIDY9UkVTRVQxLgorICBUaGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgY291bnRlciBpcyBhcHByb3hpbWF0ZWx5IDUwMEh6LgorCitQbGVhc2Ugbm90ZSB0aGF0IHVuZGVyIFVTQjIuMCB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFubmVsIGxpc3QgZGV0ZXJtaW5lcwordGhlIG1heCBzYW1wbGluZyByYXRlLiBJZiB5b3Ugc2FtcGxlIG9ubHkgb25lIGNoYW5uZWwgeW91IGdldCA4a0h6CitzYW1wbGluZyByYXRlLiBJZiB5b3Ugc2FtcGxlIHR3byBjaGFubmVscyB5b3UgZ2V0IDRrSHogYW5kIHNvIG9uLgorKi8KKy8qCisgKiBJIG11c3QgZ2l2ZSBjcmVkaXQgaGVyZSB0byBDaHJpcyBCYXVnaGVyIHdobworICogd3JvdGUgdGhlIGRyaXZlciBmb3IgQVQtTUlPLTE2ZC4gSSB1c2VkIHNvbWUgcGFydHMgb2YgdGhpcworICogZHJpdmVyLiBJIGFsc28gbXVzdCBnaXZlIGNyZWRpdHMgdG8gRGF2aWQgQnJvd25lbGwKKyAqIHdobyBzdXBwb3J0ZWQgbWUgd2l0aCB0aGUgVVNCIGRldmVsb3BtZW50LgorICoKKyAqIEJlcm5kIFBvcnIKKyAqCisgKgorICogUmV2aXNpb24gaGlzdG9yeToKKyAqIDAuOTQ6IEQvQSBvdXRwdXQgc2hvdWxkIHdvcmsgbm93IHdpdGggYW55IGNoYW5uZWwgbGlzdCBjb21iaW5hdGlvbnMKKyAqIDAuOTU6IC5vd25lciBjb21tZW50ZWQgb3V0IGZvciBrZXJuZWwgdmVycyBiZWxvdyAyLjQuMTkKKyAqICAgICAgIHNhbml0eSBjaGVja3MgaW4gYWkvYW9fY21kCisgKiAwLjk2OiB0cnlpbmcgdG8gZ2V0IGl0IHdvcmtpbmcgd2l0aCAyLjYsIG1vdmVkIGFsbCBtZW1vcnkgYWxsb2MgdG8gY29tZWRpJ3MKKyAqICAgICAgIGF0dGFjaCBmaW5hbCBVU0IgSURzCisgKiAgICAgICBtb3ZlZCBtZW1vcnkgYWxsb2NhdGlvbiBjb21wbGV0ZWx5IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbWVkaQorICogICAgICAgZnVuY3Rpb25zIGZpcm13YXJlIHVwbG9hZCBpcyBieSBmeGxvYWQgYW5kIG5vIGxvbmdlciBieSBjb21lZGkgKGR1ZSB0bworICogICAgICAgZW51bWVyYXRpb24pCisgKiAwLjk3OiBVU0IgSURzIHJlY2VpdmVkLCBhZGp1c3RlZCB0YWJsZQorICogMC45ODogU01QLCBsb2NraW5nLCBtZW1yb3kgYWxsb2M6IG1vdmVkIGFsbCB1c2IgbWVtb3J5IGFsbG9jCisgKiAgICAgICB0byB0aGUgdXNiIHN1YnN5c3RlbSBhbmQgbW92ZWQgYWxsIGNvbWVkaSByZWxhdGVkIG1lbW9yeQorICogICAgICAgYWxsb2MgdG8gY29tZWRpLgorICogICAgICAgfCBrZXJuZWwgfCByZWdpc3RyYXRpb24gfCB1c2JkdXgtdXNiIHwgdXNiZHV4LWNvbWVkaSB8IGNvbWVkaSB8CisgKiAwLjk5OiBVU0IgMi4wOiBjaGFuZ2VkIHByb3RvY29sIHRvIGlzb2Nocm9ub3VzIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICBJUlEgdHJhbnNmZXIgaXMgdG9vIGJ1Z2d5IGFuZCB0b28gcmlza3kgaW4gMi4wCisgKiAgICAgICAgICAgICAgICBmb3IgdGhlIGhpZ2ggc3BlZWQgSVNPIHRyYW5zZmVyIGlzIG5vdyBhIHdvcmtpbmcgdmVyc2lvbgorICogICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgKiAwLjk5YjogSW5jcmVhc2VkIHRoZSBpc28gdHJhbnNmZXIgYnVmZmVyIGZvciBoaWdoIHNwLnRvIDEwIGJ1ZmZlcnMuIFNvbWUgVklBCisgKiAgICAgICAgY2hpcHNldHMgbWlzcyBvdXQgSVJRcy4gRGVlcGVyIGJ1ZmZlcmluZyBpcyBuZWVkZWQuCisgKiAxLjAwOiBmdWxsIFVTQiAyLjAgc3VwcG9ydCBmb3IgdGhlIEEvRCBjb252ZXJ0ZXIuIE5vdzogbWF4IDhrSHogc2FtcGxpbmcKKyAqICAgICAgIHJhdGUuCisgKiAgICAgICBGaXJtd2FyZSB2ZXJzIDEuMDAgaXMgbmVlZGVkIGZvciB0aGlzLgorICogICAgICAgVHdvIDE2IGJpdCB1cC9kb3duL3Jlc2V0IGNvdW50ZXIgd2l0aCBhIHNhbXBsaW5nIHJhdGUgb2YgMWtIegorICogICAgICAgQW5kIGxvYWRzIG9mIGNsZWFuaW5nIHVwLCBpbiBwYXJ0aWN1bGFyIHN0cmVhbWxpbmluZyB0aGUKKyAqICAgICAgIGJ1bGsgdHJhbnNmZXJzLgorICogMS4xOiAgbW92ZWQgRVA0IHRyYW5zZmVycyB0byBFUDEgdG8gbWFrZSBzcGFjZSBmb3IgYSBQV00gb3V0cHV0IG9uIEVQNAorICogMS4yOiAgYWRkZWQgUFdNIHN1cG9ydCB2aWEgRVA0CisgKiAyLjA6ICBQV00gc2VlbXMgdG8gYmUgc3RhYmxlIGFuZCBpcyBub3QgaW50ZXJmZXJpbmcgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zCisgKiAyLjE6ICBjaGFuZ2VkIFBXTSBBUEkKKyAqCisgKi8KKworLyogZ2VuZXJhdGVzIGxvYWRzIG9mIGRlYnVnIGluZm8gKi8KKy8qICNkZWZpbmUgTk9JU1lfRFVYX0RFQlVHQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBCT0FSRE5BTUUgInVzYmR1eCIKKworLyogdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlciAqLworI2RlZmluZSBFWlRJTUVPVVQgMzAKKworLyogY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX0ZJUk1XQVJFIDB4QTAKKyNkZWZpbmUgVkVORE9SX0RJUl9JTiAgMHhDMAorI2RlZmluZSBWRU5ET1JfRElSX09VVCAweDQwCisKKy8qIGludGVybmFsIGFkcmVzc2VzIG9mIHRoZSA4MDUxIHByb2Nlc3NvciAqLworI2RlZmluZSBVU0JEVVhTVUJfQ1BVQ1MgMHhFNjAwCisKKy8qCisgKiB0aGUgbWlub3IgZGV2aWNlIG51bWJlciwgbWFqb3IgaXMgMTgwIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBhbmQgdG8KKyAqIHVwbG9hZCBzcGVjaWFsIGZpcm13YXJlIChwcm9ncmFtbWluZyB0aGUgZWVwcm9tIGV0Yykgd2hpY2ggaXMgbm90IGNvbXBhdGlibGUKKyAqIHdpdGggdGhlIGNvbWVkaSBmcmFtd29yaworICovCisjZGVmaW5lIFVTQkRVWFNVQl9NSU5PUiAzMgorCisvKiBtYXggbGVuZ2h0aCBvZiB0aGUgdHJhbnNmZXItYnVmZmVyIGZvciBzb2Z0d2FyZSB1cGxvYWQgKi8KKyNkZWZpbmUgVEJfTEVOIDB4MjAwMAorCisvKiBJbnB1dCBlbmRwb2ludCBudW1iZXI6IElTTy9JUlEgKi8KKyNkZWZpbmUgSVNPSU5FUCAgICAgICAgICAgNgorCisvKiBPdXRwdXQgZW5kcG9pbnQgbnVtYmVyOiBJU08vSVJRICovCisjZGVmaW5lIElTT09VVEVQICAgICAgICAgIDIKKworLyogVGhpcyBFUCBzZW5kcyBEVVggY29tbWFuZHMgdG8gVVNCRFVYICovCisjZGVmaW5lIENPTU1BTkRfT1VUX0VQICAgICAxCisKKy8qIFRoaXMgRVAgcmVjZWl2ZXMgdGhlIERVWCBjb21tYW5kcyBmcm9tIFVTQkRVWCAqLworI2RlZmluZSBDT01NQU5EX0lOX0VQICAgICAgICA4CisKKy8qIE91dHB1dCBlbmRwb2ludCBmb3IgUFdNICovCisjZGVmaW5lIFBXTV9FUCAgICAgICAgIDQKKworLyogMzAwSHogbWF4IGZyZXF1IHVuZGVyIFBXTSAqLworI2RlZmluZSBNSU5fUFdNX1BFUklPRCAgKChsb25nKSgxRTkvMzAwKSkKKworLyogRGVmYXVsdCBQV00gZnJlcXVlbmN5ICovCisjZGVmaW5lIFBXTV9ERUZBVUxUX1BFUklPRCAoKGxvbmcpKDFFOS8xMDApKQorCisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyNkZWZpbmUgTlVNQ0hBTk5FTFMgICAgICAgOAorCisvKiBTaXplIG9mIG9uZSBBL0QgdmFsdWUgKi8KKyNkZWZpbmUgU0laRUFESU4gICAgICAgICAgKChzaXplb2YoaW50MTZfdCkpKQorCisvKgorICogU2l6ZSBvZiB0aGUgaW5wdXQtYnVmZmVyIElOIEJZVEVTCisgKiBBbHdheXMgbXVsdGlwbGUgb2YgOCBmb3IgOCBtaWNyb2ZyYW1lcyB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIGhpZ2hzcGVlZCBtb2RlCisgKi8KKyNkZWZpbmUgU0laRUlOQlVGICAgICAgICAgKCg4KlNJWkVBRElOKSkKKworLyogMTYgYnl0ZXMuICovCisjZGVmaW5lIFNJWkVJTlNOQlVGICAgICAgIDE2CisKKy8qIE51bWJlciBvZiBEQSBjaGFubmVscyAqLworI2RlZmluZSBOVU1PVVRDSEFOTkVMUyAgICA4CisKKy8qIHNpemUgb2Ygb25lIHZhbHVlIGZvciB0aGUgRC9BIGNvbnZlcnRlcjogY2hhbm5lbCBhbmQgdmFsdWUgKi8KKyNkZWZpbmUgU0laRURBT1VUICAgICAgICAgICgoc2l6ZW9mKGludDhfdCkrc2l6ZW9mKGludDE2X3QpKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIG91dHB1dC1idWZmZXIgaW4gYnl0ZXMKKyAqIEFjdHVhbGx5IG9ubHkgdGhlIGZpcnN0IDQgdHJpcGxldHMgYXJlIHVzZWQgYnV0IGZvciB0aGUKKyAqIGhpZ2ggc3BlZWQgbW9kZSB3ZSBuZWVkIHRvIHBhZCBpdCB0byA4IChtaWNyb2ZyYW1lcykuCisgKi8KKyNkZWZpbmUgU0laRU9VVEJVRiAgICAgICAgICgoOCpTSVpFREFPVVQpKQorCisvKgorICogU2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZHV4IGNvbW1hbmRzOiBqdXN0IG5vdyBtYXggc2l6ZSBpcyBkZXRlcm1pbmVkCisgKiBieSB0aGUgYW5hbG9ndWUgb3V0ICsgY29tbWFuZCBieXRlICsgcGFuaWMgYnl0ZXMuLi4KKyAqLworI2RlZmluZSBTSVpFT0ZEVVhCVUZGRVIgICAgKCg4KlNJWkVEQU9VVCsyKSkKKworLyogTnVtYmVyIG9mIGluLVVSQnMgd2hpY2ggcmVjZWl2ZSB0aGUgZGF0YTogbWluPTIgKi8KKyNkZWZpbmUgTlVNT0ZJTkJVRkZFUlNGVUxMICAgICA1CisKKy8qIE51bWJlciBvZiBvdXQtVVJCcyB3aGljaCBzZW5kIHRoZSBkYXRhOiBtaW49MiAqLworI2RlZmluZSBOVU1PRk9VVEJVRkZFUlNGVUxMICAgIDUKKworLyogTnVtYmVyIG9mIGluLVVSQnMgd2hpY2ggcmVjZWl2ZSB0aGUgZGF0YTogbWluPTUgKi8KKy8qIG11c3QgaGF2ZSBtb3JlIGJ1ZmZlcnMgZHVlIHRvIGJ1Z2d5IFVTQiBjdHIgKi8KKyNkZWZpbmUgTlVNT0ZJTkJVRkZFUlNISUdIICAgICAxMAorCisvKiBOdW1iZXIgb2Ygb3V0LVVSQnMgd2hpY2ggc2VuZCB0aGUgZGF0YTogbWluPTUgKi8KKy8qIG11c3QgaGF2ZSBtb3JlIGJ1ZmZlcnMgZHVlIHRvIGJ1Z2d5IFVTQiBjdHIgKi8KKyNkZWZpbmUgTlVNT0ZPVVRCVUZGRVJTSElHSCAgICAxMAorCisvKiBUb3RhbCBudW1iZXIgb2YgdXNiZHV4IGRldmljZXMgKi8KKyNkZWZpbmUgTlVNVVNCRFVYICAgICAgICAgICAgIDE2CisKKy8qIEFuYWxvZ3VlIGluIHN1YmRldmljZSAqLworI2RlZmluZSBTVUJERVZfQUQgICAgICAgICAgICAgMAorCisvKiBBbmFsb2d1ZSBvdXQgc3ViZGV2aWNlICovCisjZGVmaW5lIFNVQkRFVl9EQSAgICAgICAgICAgICAxCisKKy8qIERpZ2l0YWwgSS9PICovCisjZGVmaW5lIFNVQkRFVl9ESU8gICAgICAgICAgICAyCisKKy8qIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1VCREVWX0NPVU5URVIgICAgICAgIDMKKworLyogdGltZXIgYWthIHB3bSBvdXRwdXQgKi8KKyNkZWZpbmUgU1VCREVWX1BXTSAgICAgICAgICAgIDQKKworLyogbnVtYmVyIG9mIHJldHJpZXMgdG8gZ2V0IHRoZSByaWdodCBkdXggY29tbWFuZCAqLworI2RlZmluZSBSRVRSSUVTIDEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWVkaSBjb25zdGFudHMgKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VzYmR1eF9haV9yYW5nZSA9IHsgNCwgeworCQkJQklQX1JBTkdFKDQuMDk2KSwKKwkJCUJJUF9SQU5HRSg0LjA5NiAvIDIpLAorCQkJVU5JX1JBTkdFKDQuMDk2KSwKKwkJCVVOSV9SQU5HRSg0LjA5NiAvIDIpCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdXNiZHV4X2FvX3JhbmdlID0geyAyLCB7CisJCQlCSVBfUkFOR0UoNC4wOTYpLAorCQkJVU5JX1JBTkdFKDQuMDk2KSwKKwl9Cit9OworCisvKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgb2Ygb25lIHN1YmRldmljZQorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgYWxsIHRoZSBkYXRhIG9mCisgKiB0aGlzIGRyaXZlciBvbmUgc3ViIGRldmljZSBqdXN0IG5vdzogQS9ECisgKi8KK3N0cnVjdCB1c2JkdXhzdWIgeworCS8qIGF0dGFjaGVkPyAqLworCWludCBhdHRhY2hlZDsKKwkvKiBpcyBpdCBhc3NvY2lhdGVkIHdpdGggYSBzdWJkZXZpY2U/ICovCisJaW50IHByb2JlZDsKKwkvKiBwb2ludGVyIHRvIHRoZSB1c2ItZGV2aWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwkvKiBhY3R1YWwgbnVtYmVyIG9mIGluLWJ1ZmZlcnMgKi8KKwlpbnQgbnVtT2ZJbkJ1ZmZlcnM7CisJLyogYWN0dWFsIG51bWJlciBvZiBvdXQtYnVmZmVycyAqLworCWludCBudW1PZk91dEJ1ZmZlcnM7CisJLyogSVNPLXRyYW5zZmVyIGhhbmRsaW5nOiBidWZmZXJzICovCisJc3RydWN0IHVyYiAqKnVyYkluOworCXN0cnVjdCB1cmIgKip1cmJPdXQ7CisJLyogcHdtLXRyYW5zZmVyIGhhbmRsaW5nICovCisJc3RydWN0IHVyYiAqdXJiUHdtOworCS8qIFBXTSBwZXJpb2QgKi8KKwlsc2FtcGxfdCBwd21QZXJpb2Q7CisJLyogUFdNIGludGVybmFsIGRlbGF5IGZvciB0aGUgR1BJRiBpbiB0aGUgRlgyICovCisJaW50OF90IHB3bURlbGF5OworCS8qIHNpemUgb2YgdGhlIFBXTSBidWZmZXIgd2hpY2ggaG9sZHMgdGhlIGJpdCBwYXR0ZXJuICovCisJaW50IHNpemVQd21CdWY7CisJLyogaW5wdXQgYnVmZmVyIGZvciB0aGUgSVNPLXRyYW5zZmVyICovCisJaW50MTZfdCAqaW5CdWZmZXI7CisJLyogaW5wdXQgYnVmZmVyIGZvciBzaW5nbGUgaW5zbiAqLworCWludDE2X3QgKmluc25CdWZmZXI7CisJLyogb3V0cHV0IGJ1ZmZlciBmb3Igc2luZ2xlIERBIG91dHB1dHMgKi8KKwlpbnQxNl90ICpvdXRCdWZmZXI7CisJLyogaW50ZXJmYWNlIG51bWJlciAqLworCWludCBpZm51bTsKKwkvKiBpbnRlcmZhY2Ugc3RydWN0dXJlIGluIDIuNiAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJLyogY29tZWRpIGRldmljZSBmb3IgdGhlIGludGVycnVwdCBjb250ZXh0ICovCisJY29tZWRpX2RldmljZSAqY29tZWRpZGV2OworCS8qIGlzIGl0IFVTQl9TUEVFRF9ISUdIIG9yIG5vdD8gKi8KKwlzaG9ydCBpbnQgaGlnaF9zcGVlZDsKKwkvKiBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nICovCisJc2hvcnQgaW50IGFpX2NtZF9ydW5uaW5nOworCXNob3J0IGludCBhb19jbWRfcnVubmluZzsKKwkvKiBwd20gaXMgcnVubmluZyAqLworCXNob3J0IGludCBwd21fY21kX3J1bm5pbmc7CisJLyogY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwlzaG9ydCBpbnQgYWlfY29udGlub3VzOworCXNob3J0IGludCBhb19jb250aW5vdXM7CisJLyogbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXF1aXJlICovCisJaW50IGFpX3NhbXBsZV9jb3VudDsKKwlpbnQgYW9fc2FtcGxlX2NvdW50OworCS8qIHRpbWUgYmV0d2VlbiBzYW1wbGVzIGluIHVuaXRzIG9mIHRoZSB0aW1lciAqLworCXVuc2lnbmVkIGludCBhaV90aW1lcjsKKwl1bnNpZ25lZCBpbnQgYW9fdGltZXI7CisJLyogY291bnRlciBiZXR3ZWVuIGFxdWlzaXRpb25zICovCisJdW5zaWduZWQgaW50IGFpX2NvdW50ZXI7CisJdW5zaWduZWQgaW50IGFvX2NvdW50ZXI7CisJLyogaW50ZXJ2YWwgaW4gZnJhbWVzL3VmcmFtZXMgKi8KKwl1bnNpZ25lZCBpbnQgYWlfaW50ZXJ2YWw7CisJLyogRC9BIGNvbW1hbmRzICovCisJaW50OF90ICpkYWNfY29tbWFuZHM7CisJLyogY29tbWFuZHMgKi8KKwlpbnQ4X3QgKmR1eF9jb21tYW5kczsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKKy8qCisgKiBUaGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSB1c2ItZGF0YSBvZiB0aGUgZHJpdmVyIGlzIGFsc28gdGhlIHByaXZhdGUgZGF0YQorICogZm9yIHRoZSBjb21lZGktZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUgZ2xvYmFsIGFzIHRoZSB1c2Igc3Vic3lzdGVtIG5lZWRzCisgKiBnbG9iYWwgdmFyaWFibGVzLiBUaGUgb3RoZXIgcmVhc29uIGlzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGVyZQorICogX2JlZm9yZV8gYW55IGNvbWVkaSBjb21tYW5kIGlzIGlzc3VlZC4gVGhlIHVzYiBzdWJzeXN0ZW0gbXVzdCBiZSBpbml0aWFsaXNlZAorICogYmVmb3JlIGNvbWVkaSBjYW4gYWNjZXNzIGl0LgorICovCitzdGF0aWMgc3RydWN0IHVzYmR1eHN1YiB1c2JkdXhzdWJbTlVNVVNCRFVYXTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc3RhcnRfc3RvcF9zZW0pOworCisvKgorICogU3RvcHMgdGhlIGRhdGEgYWNxdWlzaW9uCisgKiBJdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgY29udGV4dAorICovCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfSW5VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGkgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiSW4pIHsKKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJJbltpXSkgeworCQkJCS8qIFdlIHdhaXQgaGVyZSB1bnRpbCBhbGwgdHJhbnNmZXJzIGhhdmUgYmVlbgorCQkJCSAqIGNhbmNlbGxlZC4gKi8KKwkJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJfQorCQkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaTogdXNiZHV4OiB1bmxpbmtlZCBJblVSQiAlZCwgZXJyPSVkXG4iLAorCQkJCWksIGVycik7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBzdG9wIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIElzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGlzIGRyaXZlciBmcm9tIGJvdGggdGhlCisgKiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgZnJvbSBjb21lZGkKKyAqLworc3RhdGljIGludCB1c2JkdXhfYWlfc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaT86IHVzYmR1eF9haV9zdG9wOiB0aGlzX3VzYmR1eHN1Yj1OVUxMIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9haV9zdG9wXG4iKTsKKworCWlmIChkb191bmxpbmspIHsKKwkJLyogc3RvcCBhcXVpc3Rpb24gKi8KKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19JblVSQnModGhpc191c2JkdXhzdWIpOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyB3aWxsIGNhbmNlbCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uLgorICogVGhpcyBpcyBjYWxsZWQgYnkgY29tZWRpIGJ1dCBuZXZlciBmcm9tIGluc2lkZSB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCWludCByZXMgPSAwOworCisJLyogZm9yY2UgdW5saW5rIG9mIGFsbCB1cmJzICovCisJdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9haV9jYW5jZWxcbiIpOworCisJLyogcHJldmVudCBvdGhlciBDUFVzIGZyb20gc3VibWl0dGluZyBuZXcgY29tbWFuZHMganVzdCBub3cgKi8KKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiB1bmxpbmsgb25seSBpZiB0aGUgdXJiIHJlYWxseSBoYXMgYmVlbiBzdWJtaXR0ZWQgKi8KKwlyZXMgPSB1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKTsKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyogYW5hbG9ndWUgSU4gLSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfYWlfSXNvY0lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGksIGVyciwgbjsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwljb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UgKi8KKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwkvKiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyBzdHJ1Y3QgdXNiZHV4c3ViICovCisJdGhpc191c2JkdXhzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKwkvKiBzdWJkZXZpY2Ugd2hpY2ggaXMgdGhlIEFEIGNvbnZlcnRlciAqLworCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKworCS8qIGZpcnN0IHdlIHRlc3QgaWYgc29tZXRoaW5nIHVudXN1YWwgaGFzIGp1c3QgaGFwcGVuZWQgKi8KKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBjb3B5IHRoZSByZXN1bHQgaW4gdGhlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQltZW1jcHkodGhpc191c2JkdXhzdWItPmluQnVmZmVyLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIFNJWkVJTkJVRik7CisJCWJyZWFrOworCWNhc2UgLUVJTFNFUToKKwkJLyogZXJyb3IgaW4gdGhlIElTT2Nocm9ub3VzIGRhdGEgKi8KKwkJLyogd2UgZG9uJ3QgY29weSB0aGUgZGF0YSBpbnRvIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KKwkJLyogYW5kIHJlY3ljbGUgdGhlIGxhc3QgZGF0YSBieXRlICovCisJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eDogQ1JDIGVycm9yIGluIElTTyBJTiBzdHJlYW0uXG4iLAorCQkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IpOworCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyogaGFwcGVucyBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCQkvKiB3ZSBhcmUgc3RpbGwgcnVubmluZyBhIGNvbW1hbmQgKi8KKwkJCS8qIHRlbGwgdGhpcyBjb21lZGkgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogc3RvcCB0aGUgdHJhbnNmZXIgdy9vIHVubGluayAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciBvbiB0aGUgYnVzICovCisJCS8qIHBhc3MgZXJyb3IgdG8gY29tZWRpIGlmIHdlIGFyZSByZWFsbHkgcnVubmluZyBhIGNvbW1hbmQgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiTm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiBhaSBpbnRyICIKKwkJCQkiY29udGV4dDogJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBhdCB0aGlzIHBvaW50IHdlIGFyZSByZWFzb25hYmx5IHN1cmUgdGhhdCBub3RoaW5nIGRvZGd5IGhhcyBoYXBwZW5lZAorCSAqIGFyZSB3ZSBydW5uaW5nIGEgY29tbWFuZD8KKwkgKi8KKwlpZiAodW5saWtlbHkoKCEodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSkpKSB7CisJCS8qCisJCSAqIG5vdCBydW5uaW5nIGEgY29tbWFuZCwgZG8gbm90IGNvbnRpbnVlIGV4ZWN1dGlvbiBpZiBubworCQkgKiBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nIGluIHBhcnRpY3VsYXIgbm90IHJlc3VibWl0CisJCSAqLworCQlyZXR1cm47CisJfQorCisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2OworCisJLyogcmVzdWJtaXQgdGhlIHVyYiAqLworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkiY29tZWRpXzogdXJiIHJlc3VibWl0IGZhaWxlZCBpbiBpbnQtY29udGV4dCEgZXJyPSVkXG4iLAorCQkJZXJyKTsKKwkJaWYgKGVyciA9PSAtRUwyTlNZTkMpCisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiBJUlEgIgorCQkJCSJoYW5kbGVyIVxuIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQlyZXR1cm47CisJfQorCisJdGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXItLTsKKwlpZiAobGlrZWx5KHRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyID4gMCkpCisJCXJldHVybjsKKworCS8qIHRpbWVyIHplcm8sIHRyYW5zZmVyIG1lYXN1cmVtZW50cyB0byBjb21lZGkgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCS8qIHRlc3QsIGlmIHdlIHRyYW5zbWl0IG9ubHkgYSBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMpKSB7CisJCS8qIG5vdCBjb250aW5vdXMsIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQtLTsKKwkJLyogYWxsIHNhbXBsZXMgcmVjZWl2ZWQ/ICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50IDwgMCkgeworCQkJLyogcHJldmVudCBhIHJlc3VibWl0IG5leHQgdGltZSAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQkJLyogc2F5IGNvbWVkaSB0aGF0IHRoZSBhY3F1aXN0aW9uIGlzIG92ZXIgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgVVNCIGJ1cyBhbmQgaGFuZCBpdCBvdmVyIHRvIGNvbWVkaSAqLworCW4gPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCS8qIHRyYW5zZmVyIGRhdGEgKi8KKwkJaWYgKENSX1JBTkdFKHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RbaV0pIDw9IDEpIHsKKwkJCWNvbWVkaV9idWZfcHV0CisJCQkJKHMtPmFzeW5jLAorCQkJCWxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT4KKwkJCQkJaW5CdWZmZXJbaV0pIF4gMHg4MDApOworCQl9IGVsc2UgeworCQkJY29tZWRpX2J1Zl9wdXQKKwkJCQkocy0+YXN5bmMsCisJCQkJbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluQnVmZmVyW2ldKSk7CisJCX0KKwl9CisJLyogdGVsbCBjb21lZGkgdGhhdCBkYXRhIGlzIHRoZXJlICovCisJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh1c2JkdXhzdWJfdG1wICYmIHVzYmR1eHN1Yl90bXAtPnVyYk91dCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pCisJCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisKKwkJCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGk6IHVzYmR1eDogdW5saW5rZWQgT3V0VVJCICVkOiByZXM9JWRcbiIsCisJCQkJaSwgZXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIHdpbGwgY2FuY2VsIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIGluIGFueSBjb250ZXh0LgorICovCitzdGF0aWMgaW50IHVzYmR1eF9hb19zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiB1c2JkdXhfYW9fY2FuY2VsXG4iKTsKKworCWlmIChkb191bmxpbmspCisJCXJldCA9IHVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisKKwl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogZm9yY2UgdW5saW5rLCBpcyBjYWxsZWQgYnkgY29tZWRpICovCitzdGF0aWMgaW50IHVzYmR1eF9hb19jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXMgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBwcmV2ZW50IG90aGVyIENQVXMgZnJvbSBzdWJtaXR0aW5nIGEgY29tbWFuZCBqdXN0IG5vdyAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHVubGluayBvbmx5IGlmIGl0IGlzIHJlYWxseSBydW5uaW5nICovCisJcmVzID0gdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9hb19Jc29jSXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSwgcmV0OworCWludDhfdCAqZGF0YXA7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisKKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyogYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQsIHVucGx1ZywgLi4uIGV0YyAqLworCQkvKiBubyB1bmxpbmsgbmVlZGVkIGhlcmUuIEFscmVhZHkgc2h1dHRpbmcgZG93bi4gKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJjb21lZGlfOiBOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluIGFvICIKKwkJCQkiaW50ciBjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiB3ZSBkbyBhbiB1bmxpbmsgaWYgd2UgYXJlIGluIHRoZSBoaWdoIHNwZWVkIG1vZGUgKi8KKwkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogYXJlIHdlIGFjdHVhbGx5IHJ1bm5pbmc/ICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSkKKwkJcmV0dXJuOworCisJLyogbm9ybWFsIG9wZXJhdGlvbjogZXhlY3V0aW5nIGEgY29tbWFuZCBpbiB0aGlzIHN1YmRldmljZSAqLworCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyLS07CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyIDw9IDApIHsKKwkJLyogdGltZXIgemVybyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcjsKKworCQkvKiBoYW5kbGUgbm9uIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCWlmICghKHRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMpKSB7CisJCQkvKiBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCQkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudC0tOworCQkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPCAwKSB7CisJCQkJLyogYWxsIHNhbXBsZXMgdHJhbnNtaXR0ZWQgKi8KKwkJCQl1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCQkvKiBubyByZXN1Ym1pdCBvZiB0aGUgdXJiICovCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8qIHRyYW5zbWl0IGRhdGEgdG8gdGhlIFVTQiBidXMgKi8KKwkJKCh1aW50OF90ICopICh1cmItPnRyYW5zZmVyX2J1ZmZlcikpWzBdID0KKwkJCXMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47IGkrKykgeworCQkJc2FtcGxfdCB0ZW1wOworCQkJaWYgKGkgPj0gTlVNT1VUQ0hBTk5FTFMpCisJCQkJYnJlYWs7CisKKwkJCS8qIHBvaW50ZXIgdG8gdGhlIERBICovCisJCQlkYXRhcCA9CisJCQkgICAgICAgKCYoKChpbnQ4X3QgKil1cmItPnRyYW5zZmVyX2J1ZmZlcilbaSAqIDMgKyAxXSkpOworCQkJLyogZ2V0IHRoZSBkYXRhIGZyb20gY29tZWRpICovCisJCQlyZXQgPSBjb21lZGlfYnVmX2dldChzLT5hc3luYywgJnRlbXApOworCQkJZGF0YXBbMF0gPSB0ZW1wOworCQkJZGF0YXBbMV0gPSB0ZW1wID4+IDg7CisJCQlkYXRhcFsyXSA9IHRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV07CisJCQkvKiBwcmludGsoImRhdGFbMF09JXgsIGRhdGFbMV09JXgsIGRhdGFbMl09JXhcbiIsICovCisJCQkvKiBkYXRhcFswXSxkYXRhcFsxXSxkYXRhcFsyXSk7ICovCisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJjb21lZGk6IGJ1ZmZlciB1bmRlcmZsb3dcbiIpOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJCX0KKwkJCS8qIHRyYW5zbWl0IGRhdGEgdG8gY29tZWRpICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJfQorCX0KKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFT1VUQlVGOworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJCS8qIHVmcmFtZXMgKi8KKwkJCXVyYi0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1cmItPmludGVydmFsID0gMTsKKwkJfQorCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IFNJWkVPVVRCVUY7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uc3RhdHVzID0gMDsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJImNvbWVkaV86IGFvIHVyYiByZXN1Ym0gZmFpbGVkIGluIGludC1jb250LiAiCisJCQkJInJldD0lZCIsIHJldCk7CisJCQlpZiAocmV0ID09IEVMMk5TWU5DKQorCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiAiCisJCQkJCSJJUlEgaGFuZGxpbmchXG4iKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdGFydChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCXVpbnQ4X3QgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKworCWlmICh1c2JkdXhzdWItPnByb2JlZCkgeworCQkvKiA3ZjkyIHRvIHplcm8gKi8KKwkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdID0gMDsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCS8qIGNyZWF0ZSBhIHBpcGUgZm9yIGEgY29udHJvbCB0cmFuc2ZlciAqLworCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8qIGJSZXF1ZXN0LCAiRmlybXdhcmUiICovCisJCQlVU0JEVVhTVUJfRklSTVdBUkUsCisJCQkvKiBibVJlcXVlc3RUeXBlICovCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8qIFZhbHVlICovCisJCQlVU0JEVVhTVUJfQ1BVQ1MsCisJCQkvKiBJbmRleCAqLworCQkJMHgwMDAwLAorCQkJLyogYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvKiBMZW5ndGggKi8KKwkJCTEsCisJCQkvKiBUaW1lb3V0ICovCisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisKKwl1aW50OF90IGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisJaWYgKHVzYmR1eHN1Yi0+cHJvYmVkKSB7CisJCS8qIDdmOTIgdG8gb25lICovCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDE7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4c3ViLT51c2JkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4c3ViLT51c2JkZXYsIDApLAorCQkJLyogYlJlcXVlc3QsICJGaXJtd2FyZSIgKi8KKwkJCVVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCS8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLyogVmFsdWUgKi8KKwkJCVVTQkRVWFNVQl9DUFVDUywKKwkJCS8qIEluZGV4ICovCisJCQkweDAwMDAsIGxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8qIExlbmd0aCAqLworCQkJMSwKKwkJCS8qIFRpbWVvdXQgKi8KKwkJCUVaVElNRU9VVCk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogY29udHJvbCBtc2cgZmFpbGVkIChzdG9wKVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfdXBsb2FkKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YiwKKwkJCSAgICB1aW50OF90ICpsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0QWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgZXJyY29kZTsKKworCWlmICh1c2JkdXhzdWItPnByb2JlZCkgeworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXg6IHVwbG9hZGluZyAlZCBieXRlcyIKKwkJCSIgdG8gYWRkciAlZCwgZmlyc3QgYnl0ZT0lZC5cbiIsCisJCQl1c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGxlbiwKKwkJCXN0YXJ0QWRkciwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdKTsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkvKiBicmVxdWVzdCwgZmlybXdhcmUgKi8KKwkJCVVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCS8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLyogdmFsdWUgKi8KKwkJCXN0YXJ0QWRkciwKKwkJCS8qIGluZGV4ICovCisJCQkweDAwMDAsCisJCQkvKiBvdXIgbG9jYWwgc2FmZSBidWZmZXIgKi8KKwkJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8qIGxlbmd0aCAqLworCQkJbGVuLAorCQkJLyogdGltZW91dCAqLworCQkJRVpUSU1FT1VUKTsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiByZXN1bHQ9JWRcbiIsIGVycmNvZGUpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IHVwbG9hZCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBubyBkZXZpY2Ugb24gdGhlIGJ1cyBmb3IgdGhpcyBpbmRleCAqLworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlybXdhcmVVcGxvYWQoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLCB1aW50OF90ICpmaXJtd2FyZUJpbmFyeSwKKwkJCSAgaW50IHNpemVGaXJtd2FyZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFmaXJtd2FyZUJpbmFyeSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB1c2JkdXhzdWJfc3RvcCh1c2JkdXhzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogY2FuIG5vdCBzdG9wIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4c3ViX3VwbG9hZCh1c2JkdXhzdWIsIGZpcm13YXJlQmluYXJ5LCAwLCBzaXplRmlybXdhcmUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogZmlybXdhcmUgdXBsb2FkIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHVzYmR1eHN1Yl9zdGFydCh1c2JkdXhzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogY2FuIG5vdCBzdGFydCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgaSwgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFN1Ym1pdCBhbGwgVVJCcyBhbmQgc3RhcnQgdGhlIHRyYW5zZmVyIG9uIHRoZSBidXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViLT5udW1PZkluQnVmZmVyczsgaSsrKSB7CisJCS8qIGluIGNhc2Ugb2YgYSByZXN1Ym1pc3Npb24gYWZ0ZXIgYW4gdW5saW5rLi4uICovCisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPmludGVydmFsID0gdXNiZHV4c3ViLT5haV9pbnRlcnZhbDsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+Y29udGV4dCA9IHVzYmR1eHN1Yi0+Y29tZWRpZGV2OworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5kZXYgPSB1c2JkdXhzdWItPnVzYmRldjsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+c3RhdHVzID0gMDsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHN1Ym1pdHRpbmcgaW4tdXJiWyVkXTogJXAsJXAgaW50dj0lZFxuIiwKKwkJCXVzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgaSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5jb250ZXh0KSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5kZXYpLAorCQkJKHVzYmR1eHN1Yi0+dXJiSW5baV0tPmludGVydmFsKSk7CisJCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1c2JkdXhzdWItPnVyYkluW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyckZsYWcpIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGFpOiB1c2Jfc3VibWl0X3VyYiglZCkgZXJyb3IgJWRcbiIsCisJCQkJaSwgZXJyRmxhZyk7CisJCQlyZXR1cm4gZXJyRmxhZzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X091dFVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBpLCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yi0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBzdWJtaXR0aW5nIG91dC11cmJbJWRdXG4iLCBpKTsKKwkJLyogaW4gY2FzZSBvZiBhIHJlc3VibWlzc2lvbiBhZnRlciBhbiB1bmxpbmsuLi4gKi8KKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPmNvbnRleHQgPSB1c2JkdXhzdWItPmNvbWVkaWRldjsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPmRldiA9IHVzYmR1eHN1Yi0+dXNiZGV2OworCQl1c2JkdXhzdWItPnVyYk91dFtpXS0+c3RhdHVzID0gMDsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJPdXRbaV0sIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyRmxhZykgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogYW86IHVzYl9zdWJtaXRfdXJiKCVkKSBlcnJvciAlZFxuIiwKKwkJCQlpLCBlcnJGbGFnKTsKKwkJCXJldHVybiBlcnJGbGFnOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwLCB0bXAsIGk7CisJdW5zaWduZWQgaW50IHRtcFRpbWVyOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KKwkvKiBPbmx5IGltbWVkaWF0ZSB0cmlnZ2VycyBhcmUgYWxsb3dlZCAqLworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBzaG91bGQgaGFwcGVuIHRpbWVkICovCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwkvKiBzdGFydCBhIG5ldyBfc2Nhbl8gd2l0aCBhIHRpbWVyICovCisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwkvKiBzY2FubmluZyBpcyBjb250aW5vdXMgKi8KKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCS8qIGlzc3VlIGEgdHJpZ2dlciB3aGVuIHNjYW4gaXMgZmluaXNoZWQgYW5kIHN0YXJ0IGEgbmV3IHNjYW4gKi8KKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiBjb3VudCBldmVudHMgb3Igbm90LCBzdG9wIGNvbmRpdGlvbiBvciBub3QgKi8KKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CisJCS8qIGludGVybmFsIHRyaWdnZXIgKi8KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gMCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSB7CisJCQkvKgorCQkJICogSW4gaGlnaCBzcGVlZCBtb2RlIG1pY3JvZnJhbWVzIGFyZSBwb3NzaWJsZS4KKwkJCSAqIEhvd2V2ZXIsIGR1cmluZyBvbmUgbWljcm9mcmFtZSB3ZSBjYW4gcm91Z2hseQorCQkJICogc2FtcGxlIG9uZSBjaGFubmVsLiBUaHVzLCB0aGUgbW9yZSBjaGFubmVscworCQkJICogYXJlIGluIHRoZSBjaGFubmVsIGxpc3QgdGhlIG1vcmUgdGltZSB3ZSBuZWVkLgorCQkJICovCisJCQlpID0gMTsKKwkJCS8qIGZpbmQgYSBwb3dlciBvZiAyIGZvciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICovCisJCQl3aGlsZSAoaSA8IChjbWQtPmNoYW5saXN0X2xlbikpCisJCQkJaSA9IGkgKiAyOworCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8ICgxMDAwMDAwIC8gOCAqIGkpKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDAgLyA4ICogaTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qIG5vdyBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCBhbGwgdGhlCisJCQkgKiByb3VuZGluZyBlcnJvcnMgKi8KKwkJCXRtcFRpbWVyID0KKwkJCQkoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEyNTAwMCkpICoKKwkJCQkxMjUwMDA7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSB0bXBUaW1lcikgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSB0bXBUaW1lcjsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGZ1bGwgc3BlZWQgKi8KKwkJCS8qIDFrSHogc2NhbnMgZXZlcnkgVVNCIGZyYW1lICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDEwMDAwMDApIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMTAwMDAwMDsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCB0aGUgcm91bmRpbmcgZXJyb3JzCisJCQkgKi8KKwkJCXRtcFRpbWVyID0gKCh1bnNpZ25lZCBpbnQpKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLworCQkJCQkxMDAwMDAwKSkgKiAxMDAwMDAwOworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gdG1wVGltZXIpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gdG1wVGltZXI7CisJCQkJZXJyKys7CisJCQl9CisJCX0KKwl9CisJLyogdGhlIHNhbWUgYXJndW1lbnQgKi8KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBhbnkgY291bnQgaXMgYWxsb3dlZCAqLworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZXMgdGhlIEFEQyBjb21tYW5kIGZvciB0aGUgTUFYMTI3MQorICogcmFuZ2UgaXMgdGhlIHJhbmdlIHZhbHVlIGZyb20gY29tZWRpCisgKi8KK3N0YXRpYyBpbnQ4X3QgY3JlYXRlX2FkY19jb21tYW5kKHVuc2lnbmVkIGludCBjaGFuLCBpbnQgcmFuZ2UpCit7CisJaW50OF90IHAgPSAocmFuZ2UgPD0gMSk7CisJaW50OF90IHIgPSAoKHJhbmdlICUgMikgPT0gMCk7CisJcmV0dXJuIChjaGFuIDw8IDQpIHwgKChwID09IDEpIDw8IDIpIHwgKChyID09IDEpIDw8IDMpOworfQorCisvKiBidWxrIHRyYW5zZmVycyB0byB1c2JkdXggKi8KKworI2RlZmluZSBTRU5EQURDT01NQU5EUyAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VORERBQ09NTUFORFMgICAgICAgICAgICAxCisjZGVmaW5lIFNFTkRESU9DT05GSUdDT01NQU5EICAgICAgMgorI2RlZmluZSBTRU5ERElPQklUU0NPTU1BTkQgICAgICAgIDMKKyNkZWZpbmUgU0VORFNJTkdMRUFEICAgICAgICAgICAgICA0CisjZGVmaW5lIFJFQURDT1VOVEVSQ09NTUFORCAgICAgICAgNQorI2RlZmluZSBXUklURUNPVU5URVJDT01NQU5EICAgICAgIDYKKyNkZWZpbmUgU0VORFBXTU9OICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFNFTkRQV01PRkYgICAgICAgICAgICAgICAgOAorCitzdGF0aWMgaW50IHNlbmRfZHV4X2NvbW1hbmRzKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgY21kX3R5cGUpCit7CisJaW50IHJlc3VsdCwgbnNlbnQ7CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzBdID0gY21kX3R5cGU7CisjaWZkZWYgTk9JU1lfRFVYX0RFQlVHQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiB1c2JkdXg6IGR1eF9jb21tYW5kczogIiwKKwkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IpOworCWZvciAocmVzdWx0ID0gMDsgcmVzdWx0IDwgU0laRU9GRFVYQlVGRkVSOyByZXN1bHQrKykKKwkJcHJpbnRrKCIgJTAyeCIsIHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbcmVzdWx0XSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkJICAgICAgQ09NTUFORF9PVVRfRVApLAorCQkJICAgICAgdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcywgU0laRU9GRFVYQlVGRkVSLAorCQkJICAgICAgJm5zZW50LCAxMCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkiY291bGQgbm90IHRyYW5zbWl0IGR1eF9jb21tYW5kIHRvIHRoZSB1c2ItZGV2aWNlLCAiCisJCQkiZXJyPSVkXG4iLCB0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9kdXhfY29tbWFuZHMoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBjb21tYW5kKQoreworCWludCByZXN1bHQgPSAoLUVGQVVMVCk7CisJaW50IG5yZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVUUklFUzsgaSsrKSB7CisJCXJlc3VsdCA9IHVzYl9idWxrX21zZyh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZSh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJCQkJICAgICAgQ09NTUFORF9JTl9FUCksCisJCQkJICAgICAgdGhpc191c2JkdXhzdWItPmluc25CdWZmZXIsIFNJWkVJTlNOQlVGLAorCQkJCSAgICAgICZucmVjLCAxKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkJImluc246IFVTQiBlcnJvciAlZCB3aGlsZSByZWNlaXZpbmcgRFVYIGNvbW1hbmQiCisJCQkJIlxuIiwgdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIHJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclswXSkgPT0gY29tbWFuZCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIHRoaXMgaXMgb25seSByZWFjaGVkIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCBhIGNvdXBsZSBvZgorCSAqIHRpbWVzICovCisJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGluc246ICIKKwkJIndyb25nIGRhdGEgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZTogd2FudCBjbWQgJWQsIGdvdCBjbWQgJWQuXG4iLAorCQl0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgY29tbWFuZCwKKwkJbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMF0pKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FpX2ludHRyaWdcbiIsIGRldi0+bWlub3IpOworCisJaWYgKHRyaWdudW0gIT0gMCkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9pbnR0cmlnOiBpbnZhbGlkIHRyaWdudW1cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCEodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSkgeworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X0luVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXhfYWlfaW50dHJpZzogIgorCQkJCSJ1cmJTdWJtaXQ6IGVycj0lZFxuIiwgZGV2LT5taW5vciwgcmV0KTsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFpX2ludHRyaWcgYnV0IGFjcXUgaXMgYWxyZWFkeSBydW5uaW5nXG4iLAorCQkJZGV2LT5taW5vcik7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbiwgcmFuZ2U7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0OworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FpX2NtZFxuIiwgZGV2LT5taW5vcik7CisKKwkvKiBibG9jayBvdGhlciBDUFVzIGZyb20gc3RhcnRpbmcgYW4gYWlfY21kICovCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkiYWlfY21kIG5vdCBwb3NzaWJsZS4gQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZy5cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvKiBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybyAqLworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gY21kLT5jaGFubGlzdF9sZW47CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCXJhbmdlID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CisJCWlmIChpID49IE5VTUNIQU5ORUxTKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlicmVhazsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzW2kgKyAyXSA9CisJCQljcmVhdGVfYWRjX2NvbW1hbmQoY2hhbiwgcmFuZ2UpOworCX0KKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZTogc2l6ZT0ldVxuIiwKKwkJZGV2LT5taW5vciwgTlVNQ0hBTk5FTFMpOworCisJcmVzdWx0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRBRENPTU1BTkRTKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaWYgKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSB7CisJCS8qCisJCSAqIGV2ZXJ5IGNoYW5uZWwgZ2V0cyBhIHRpbWUgd2luZG93IG9mIDEyNXVzLiBUaHVzLCBpZiB3ZQorCQkgKiBzYW1wbGUgYWxsIDggY2hhbm5lbHMgd2UgbmVlZCAxbXMuIElmIHdlIHNhbXBsZSBvbmx5IG9uZQorCQkgKiBjaGFubmVsIHdlIG5lZWQgb25seSAxMjV1cworCQkgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsID0gMTsKKwkJLyogZmluZCBhIHBvd2VyIG9mIDIgZm9yIHRoZSBpbnRlcnZhbCAqLworCQl3aGlsZSAoKHRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCkgPCAoY21kLT5jaGFubGlzdF9sZW4pKSB7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPQorCQkJCSh0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwpICogMjsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gKDEyNTAwMCAqCisJCQkodGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsKSk7CisJfSBlbHNlIHsKKwkJLyogaW50ZXJ2YWwgYWx3YXlzIDFtcyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV90aW1lciA8IDEpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGFpX2NtZDogIgorCQkJInRpbWVyPSVkLCBzY2FuX2JlZ2luX2FyZz0lZC4gIgorCQkJIk5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsIGRldi0+bWlub3IsCisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudCA9IGNtZC0+c3RvcF9hcmc7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJLyogZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQkvKiBmaXhtZTogdW5saW5rIGhlcmU/PyAqLworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLyogZG9uJ3QgZW5hYmxlIHRoZSBhY3F1aXNpb24gb3BlcmF0aW9uICovCisJCS8qIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbCAqLworCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eF9haV9pbnR0cmlnOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGUgMCBpcyB1c2VkIHRvIGdldCBhIHNpbmdsZSBjb252ZXJzaW9uIG9uIGRlbWFuZCAqLworc3RhdGljIGludCB1c2JkdXhfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGk7CisJbHNhbXBsX3Qgb25lID0gMDsKKwlpbnQgY2hhbiwgcmFuZ2U7CisJaW50IGVycjsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAwOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IGFpX2luc25fcmVhZCwgaW5zbi0+bj0lZCwgaW5zbi0+c3ViZGV2PSVkXG4iLAorCQlkZXYtPm1pbm9yLCBpbnNuLT5uLCBpbnNuLT5zdWJkZXYpOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFpX2luc25fcmVhZCBub3QgcG9zc2libGUuICIKKwkJCSJBc3luYyBDb21tYW5kIGlzIHJ1bm5pbmcuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzYW1wbGUgb25lIGNoYW5uZWwgKi8KKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJLyogc2V0IGNvbW1hbmQgZm9yIHRoZSBmaXJzdCBjaGFubmVsICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IGNyZWF0ZV9hZGNfY29tbWFuZChjaGFuLCByYW5nZSk7CisKKwkvKiBhZGMgY29tbWFuZHMgKi8KKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9uZSA9IGxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzFdKTsKKwkJaWYgKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSA8PSAxKQorCQkJb25lID0gb25lIF4gMHg4MDA7CisKKwkJZGF0YVtpXSA9IG9uZTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYW5hbG9nIG91dCAqLworCitzdGF0aWMgaW50IHVzYmR1eF9hb19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gdGhpc191c2JkdXhzdWItPm91dEJ1ZmZlcltjaGFuXTsKKworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpLCBlcnI7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGVcbiIsIGRldi0+bWlub3IpOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGU6ICIKKwkJCSJFUlJPUjogYXN5bmNocm9ub3VzIGFvX2NtZCBpcyBydW5uaW5nXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9faW5zbl93cml0ZTogZGF0YVtjaGFuPSVkLGk9JWRdPSVkXG4iLAorCQkJZGV2LT5taW5vciwgY2hhbiwgaSwgZGF0YVtpXSk7CisKKwkJLyogbnVtYmVyIG9mIGNoYW5uZWxzOiAxICovCisJCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAxOworCQkvKiBvbmUgMTYgYml0IHZhbHVlICovCisJCSooKGludDE2X3QgKikgKHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHMgKyAyKSkgPQorCQkJY3B1X3RvX2xlMTYoZGF0YVtpXSk7CisJCXRoaXNfdXNiZHV4c3ViLT5vdXRCdWZmZXJbY2hhbl0gPSBkYXRhW2ldOworCQkvKiBjaGFubmVsIG51bWJlciAqLworCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzRdID0gKGNoYW4gPDwgNik7CisJCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EREFDT01NQU5EUyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRyaWdudW0gIT0gMCkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19pbnR0cmlnOiBpbnZhbGlkIHRyaWdudW1cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykpIHsKKwkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9PdXRVUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19pbnR0cmlnOiBzdWJtaXRVUkI6ICIKKwkJCQkiZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9faW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iLAorCQkJZGV2LT5taW5vcik7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9fY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMCwgdG1wOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FvX2NtZHRlc3RcbiIsIGRldi0+bWlub3IpOworCisJLyogbWFrZSBzdXJlIHRyaWdnZXJzIGFyZSB2YWxpZCAqLworCS8qIE9ubHkgaW1tZWRpYXRlIHRyaWdnZXJzIGFyZSBhbGxvd2VkICovCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0lOVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwkvKiB0cmlnZ2VyIHNob3VsZCBoYXBwZW4gdGltZWQgKi8KKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCS8qIGp1c3Qgbm93IHdlIHNjYW4gYWxzbyBpbiB0aGUgaGlnaCBzcGVlZCBtb2RlIGV2ZXJ5IGZyYW1lICovCisJLyogdGhpcyBpcyBkdWUgdG8gZWhjaSBkcml2ZXIgbGltaXRhdGlvbnMgKi8KKwlpZiAoMCkgewkJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkvKiBzdGFydCBpbW1pZGlhdGVseSBhIG5ldyBzY2FuICovCisJCS8qIHRoZSBzYW1wbGluZyByYXRlIGlzIHNldCBieSB0aGUgY292ZXJzaW9uIHJhdGUgKi8KKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0ZPTExPVzsKKwl9IGVsc2UgeworCQkvKiBzdGFydCBhIG5ldyBzY2FuIChvdXRwdXQgYXQgb25jZSkgd2l0aCBhIHRpbWVyICovCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUjsKKwl9CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCS8qIHNjYW5uaW5nIGlzIGNvbnRpbm91cyAqLworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJLyogd2UgYWx3YXlzIG91dHB1dCBhdCAxa0h6IGp1c3Qgbm93IGFsbCBjaGFubmVscyBhdCBvbmNlICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyoKKwkJICogaW4gdXNiLTIuMCBvbmx5IG9uZSBjb252ZXJzaW9uIGl0IHRyYW5taXR0ZWQgYnV0IHdpdGggOGtIei9uCisJCSAqLworCQljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVI7CisJfSBlbHNlIHsKKwkJLyogYWxsIGNvbnZlcnNpb24gZXZlbnRzIGhhcHBlbiBzaW11bHRhbmVvdXNseSB3aXRoIGEgcmF0ZSBvZgorCQkgKiAxa0h6L24gKi8KKwkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX05PVzsKKwl9CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCS8qIGlzc3VlIGEgdHJpZ2dlciB3aGVuIHNjYW4gaXMgZmluaXNoZWQgYW5kIHN0YXJ0IGEgbmV3IHNjYW4gKi8KKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiBjb3VudCBldmVudHMgb3Igbm90LCBzdG9wIGNvbmRpdGlvbiBvciBub3QgKi8KKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKKwkJLyogaW50ZXJuYWwgdHJpZ2dlciAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSAwKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkvKiB0aW1lciAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDEwMDAwMDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAxMDAwMDAwOworCQkJZXJyKys7CisJCX0KKwl9CisJLyogbm90IHVzZWQgbm93LCBpcyBmb3IgbGF0ZXIgdXNlICovCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IDEyNTAwMCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDEyNTAwMDsKKwkJCWVycisrOworCQl9CisJfQorCisJLyogdGhlIHNhbWUgYXJndW1lbnQgKi8KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBhbnkgY291bnQgaXMgYWxsb3dlZCAqLworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGVycj0lZCwgIgorCQkic2Nhbl9iZWdpbl9zcmM9JWQsIHNjYW5fYmVnaW5fYXJnPSVkLCBjb252ZXJ0X3NyYz0lZCwgIgorCQkiY29udmVydF9hcmc9JWRcbiIsIGRldi0+bWlub3IsIGVyciwgY21kLT5zY2FuX2JlZ2luX3NyYywKKwkJY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5jb252ZXJ0X3NyYywgY21kLT5jb252ZXJ0X2FyZyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjaGFuLCBnYWluOworCWludCBpLCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiAlc1xuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCisJLyogc2V0IGN1cnJlbnQgY2hhbm5lbCBvZiB0aGUgcnVubmluZyBhcXVpc2l0aW9uIHRvIHplcm8gKi8KKwlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7CisJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlnYWluID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CisJCWlmIChpID49IE5VTU9VVENIQU5ORUxTKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiAlczogY2hhbm5lbCBsaXN0IHRvbyBsb25nXG4iLAorCQkJCWRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV0gPSAoY2hhbiA8PCA2KTsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBkYWMgY29tbWFuZCBmb3IgY2ggJWQgaXMgJXhcbiIsCisJCQlkZXYtPm1pbm9yLCBpLCB0aGlzX3VzYmR1eHN1Yi0+ZGFjX2NvbW1hbmRzW2ldKTsKKwl9CisKKwkvKiB3ZSBjb3VudCBpbiBzdGVwcyBvZiAxbXMgKDEyNXVzKSAqLworCS8qIDEyNXVzIG1vZGUgbm90IHVzZWQgeWV0ICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyogMTI1dXMgKi8KKwkJLyogdGltaW5nIG9mIHRoZSBjb252ZXJzaW9uIGl0c2VsZjogZXZlcnkgMTI1IHVzICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMjUwMDA7CisJfSBlbHNlIHsKKwkJLyogMW1zICovCisJCS8qIHRpbWluZyBvZiB0aGUgc2Nhbjogd2UgZ2V0IGFsbCBjaGFubmVscyBhdCBvbmNlICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDAwOworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHNjYW5fYmVnaW5fc3JjPSVkLCBzY2FuX2JlZ2luX2FyZz0lZCwgIgorCQkJImNvbnZlcnRfc3JjPSVkLCBjb252ZXJ0X2FyZz0lZFxuIiwgZGV2LT5taW5vciwKKwkJCWNtZC0+c2Nhbl9iZWdpbl9zcmMsIGNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQljbWQtPmNvbnZlcnRfc3JjLCBjbWQtPmNvbnZlcnRfYXJnKTsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb190aW1lcj0lZCAobXMpXG4iLAorCQkJZGV2LT5taW5vciwgdGhpc191c2JkdXhzdWItPmFvX3RpbWVyKTsKKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA8IDEpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eDogYW9fdGltZXI9JWQsICIKKwkJCQkic2Nhbl9iZWdpbl9hcmc9JWQuICIKKwkJCQkiTm90IHByb3Blcmx5IHRlc3RlZCBieSBjbWR0ZXN0P1xuIiwKKwkJCQlkZXYtPm1pbm9yLCB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIsCisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwl0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcjsKKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogbm90IGNvbnRpbm91cyAqLworCQkvKiBjb3VudGVyICovCisJCS8qIGhpZ2ggc3BlZWQgYWxzbyBzY2FucyBldmVyeXRoaW5nIGF0IG9uY2UgKi8KKwkJaWYgKDApIHsJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA9CisJCQkJKGNtZC0+c3RvcF9hcmcpICogKGNtZC0+c2Nhbl9lbmRfYXJnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZXJlJ3Mgbm8gc2NhbiBhcyB0aGUgc2NhbiBoYXMgYmVlbiAqLworCQkJLyogcGVyZiBpbnNpZGUgdGhlIEZYMiAqLworCQkJLyogZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQgKi8KKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPSBjbWQtPnN0b3BfYXJnOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJLyogZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAwOworCQkJLyogZml4bWU6IHVubGluayBoZXJlPz8gKi8KKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIFRSSUdfSU5UICovCisJCS8qIHN1Ym1pdCB0aGUgdXJicyBsYXRlciAqLworCQkvKiB3YWl0IGZvciBhbiBpbnRlcm5hbCBzaWduYWwgKi8KKwkJcy0+YXN5bmMtPmludHRyaWcgPSB1c2JkdXhfYW9faW50dHJpZzsKKwl9CisKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8qIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4gKi8KKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IGNoYW47CS8qIDEgbWVhbnMgT3V0ICovCisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJLyogd2UgZG9uJ3QgdGVsbCB0aGUgZmlybXdhcmUgaGVyZSBhcyBpdCB3b3VsZCB0YWtlIDggZnJhbWVzICovCisJLyogdG8gc3VibWl0IHRoZSBpbmZvcm1hdGlvbi4gV2UgZG8gaXQgaW4gdGhlIGluc25fYml0cy4gKi8KKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCB1c2JkdXhfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisKKwlpZiAoaW5zbi0+biAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGUgaW5zbiBkYXRhIGlzIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLCBlYWNoIGNoYW5uZWwgY29vcmVzcG9uZGluZyB0byBhIGJpdC4gKi8KKwlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gcy0+aW9fYml0czsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzJdID0gcy0+c3RhdGU7CisKKwkvKiBUaGlzIGNvbW1hbmQgYWxzbyB0ZWxscyB0aGUgZmlybXdhcmUgdG8gcmV0dXJuICovCisJLyogdGhlIGRpZ2l0YWwgaW5wdXQgbGluZXMgKi8KKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORERJT0JJVFNDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5ERElPQklUU0NPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkYXRhWzFdID0gbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMV0pOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMjsKK30KKworLyogcmVhZHMgdGhlIDQgY291bnRlcnMsIG9ubHkgdHdvIGFyZSB1c2VkIGp1c3Qgbm93ICovCitzdGF0aWMgaW50IHVzYmR1eF9jb3VudGVyX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgY2hhbiA9IGluc24tPmNoYW5zcGVjOworCWludCBlcnI7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgUkVBRENPVU5URVJDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcmVjZWl2ZV9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFJFQURDT1VOVEVSQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWRhdGFbMF0gPSBsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlcltjaGFuICsgMV0pOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfY291bnRlcl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gaW5zbi0+Y2hhbnNwZWM7CisJKigoaW50MTZfdCAqKSAodGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcyArIDIpKSA9IGNwdV90b19sZTE2KCpkYXRhKTsKKworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBXUklURUNPVU5URVJDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2NvdW50ZXJfY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCS8qIG5vdGhpbmcgdG8gZG8gc28gZmFyICovCisJcmV0dXJuIDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBXTSAqLworCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfUHdtVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiUHdtKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJQd20pCisJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpOiB1bmxpbmtlZCBQd21VUkI6IHJlcz0lZFxuIiwgZXJyKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyBjYW5jZWxzIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIGluIGFueSBjb250ZXh0LgorICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiAlc1xuIiwgX19mdW5jX18pOworCWlmIChkb191bmxpbmspCisJCXJldCA9IHVzYmR1eHN1Yl91bmxpbmtfUHdtVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogZm9yY2UgdW5saW5rIC0gaXMgY2FsbGVkIGJ5IGNvbWVkaSAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlcyA9IDA7CisKKwkvKiB1bmxpbmsgb25seSBpZiBpdCBpcyByZWFsbHkgcnVubmluZyAqLworCXJlcyA9IHVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyk7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGkgJWQ6IHNlbmRpbmcgcHdtIG9mZiBjb21tYW5kIHRvIHRoZSB1c2IgZGV2aWNlLlxuIiwKKwkJZGV2LT5taW5vcik7CisJcmVzID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRQV01PRkYpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdXNiZHV4c3ViX3B3bV9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHByaW50ayhLRVJOX0RFQlVHICJQV006IElSUVxuIik7ICovCisKKwkvKiB0aGUgY29udGV4dCB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIHN1YmRldmljZSAqLworCXRoaXNfY29tZWRpZGV2ID0gdXJiLT5jb250ZXh0OworCS8qIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHN0cnVjdCB1c2JkdXhzdWIgKi8KKwl0aGlzX3VzYmR1eHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCisJcyA9IHRoaXNfY29tZWRpZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RBOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8qCisJCSAqIGFmdGVyIGFuIHVubGluayBjb21tYW5kLCB1bnBsdWcsIC4uLiBldGMKKwkJICogbm8gdW5saW5rIG5lZWRlZCBoZXJlLiBBbHJlYWR5IHNodXR0aW5nIGRvd24uCisJCSAqLworCQlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykKKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJLyogYSByZWFsIGVycm9yICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IE5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gIgorCQkJCSJwd20gaW50ciBjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogYXJlIHdlIGFjdHVhbGx5IHJ1bm5pbmc/ICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykpCisJCXJldHVybjsKKworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHRoaXNfdXNiZHV4c3ViLT5zaXplUHdtQnVmOworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogcHdtIHVyYiByZXN1Ym0gZmFpbGVkIGluIGludC1jb250LiAiCisJCQkJInJldD0lZCIsIHJldCk7CisJCQlpZiAocmV0ID09IEVMMk5TWU5DKQorCQkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluICIKKwkJCQkJIklSUSBoYW5kbGluZyFcbiIpOworCisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X1B3bVVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaV86IHN1Ym1pdHRpbmcgcHdtLXVyYlxuIik7CisKKwkvKiBpbiBjYXNlIG9mIGEgcmVzdWJtaXNzaW9uIGFmdGVyIGFuIHVubGluay4uLiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHVzYmR1eHN1Yi0+dXJiUHdtLAorCQl1c2JkdXhzdWItPnVzYmRldiwKKwkJdXNiX3NuZGJ1bGtwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCBQV01fRVApLAorCQl1c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyLAorCQl1c2JkdXhzdWItPnNpemVQd21CdWYsIHVzYmR1eHN1Yl9wd21faXJxLCB1c2JkdXhzdWItPmNvbWVkaWRldik7CisKKwllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJQd20sIEdGUF9BVE9NSUMpOworCWlmIChlcnJGbGFnKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogdXNiZHV4OiBwd206IHVzYl9zdWJtaXRfdXJiIGVycm9yICVkXG4iLAorCQkJZXJyRmxhZyk7CisJCXJldHVybiBlcnJGbGFnOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfcHdtX3BlcmlvZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGxzYW1wbF90IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZngyZGVsYXkgPSAyNTU7CisKKwlpZiAocGVyaW9kIDwgTUlOX1BXTV9QRVJJT0QpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBpbGxlZ2FsIHBlcmlvZCBzZXR0aW5nIGZvciBwd20uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZSB7CisJCWZ4MmRlbGF5ID0gcGVyaW9kIC8gKChpbnQpKDYqNTEyKigxLjAvMC4wMzMpKSkgLSA2OworCQlpZiAoZngyZGVsYXkgPiAyNTUpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHBlcmlvZCAlZCBmb3IgcHdtIGlzIHRvbyBsb3cuXG4iLAorCQkJICAgICAgIGRldi0+bWlub3IsIHBlcmlvZCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwl0aGlzX3VzYmR1eHN1Yi0+cHdtRGVsYXkgPSBmeDJkZWxheTsKKwl0aGlzX3VzYmR1eHN1Yi0+cHdtUGVyaW9kID0gcGVyaW9kOworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBmcmVxdT0lZCwgcGVyaW9kPSVkXG4iLAorCQlfX2Z1bmNfXywgcGVyaW9kLCBmeDJkZWxheSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGlzIGNhbGxlZCBmcm9tIGluc24gc28gdGhlcmUncyBubyBuZWVkIHRvIGRvIGFsbCB0aGUgc2FuaXR5IGNoZWNrcyAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX3N0YXJ0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICVzXG4iLAorCQlkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykgeworCQkvKiBhbHJlYWR5IHJ1bm5pbmcgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9ICgoaW50OF90KSB0aGlzX3VzYmR1eHN1Yi0+cHdtRGVsYXkpOworCXJldCA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EUFdNT04pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogaW5pdGFsaXNlIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGhpc191c2JkdXhzdWItPnNpemVQd21CdWY7IGkrKykKKwkJKChjaGFyICopKHRoaXNfdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcikpW2ldID0gMDsKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAxOworCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfUHdtVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyA9IDA7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZXMgdGhlIGJpdCBwYXR0ZXJuIGZvciBQV00gd2l0aCB0aGUgb3B0aW9uYWwgc2lnbiBiaXQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9wYXR0ZXJuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIGludCBjaGFubmVsLCBsc2FtcGxfdCB2YWx1ZSwgbHNhbXBsX3Qgc2lnbikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgaSwgc3pidWY7CisJY2hhciAqcEJ1ZjsKKwljaGFyIHB3bV9tYXNrOworCWNoYXIgc2duX21hc2s7CisJY2hhciBjOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiB0aGlzIGlzIHRoZSBESU8gYml0IHdoaWNoIGNhcnJpZXMgdGhlIFBXTSBkYXRhICovCisJcHdtX21hc2sgPSAoMSA8PCBjaGFubmVsKTsKKwkvKiB0aGlzIGlzIHRoZSBESU8gYml0IHdoaWNoIGNhcnJpZXMgdGhlIG9wdGlvbmFsIGRpcmVjdGlvbiBiaXQgKi8KKwlzZ25fbWFzayA9ICgxNiA8PCBjaGFubmVsKTsKKwkvKiB0aGlzIGlzIHRoZSBidWZmZXIgd2hpY2ggd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgd2l0aCBiaXQgKi8KKwkvKiBwYXR0ZXJuIGZvciBvbmUgcGVyaW9kICovCisJc3pidWYgPSB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsKKwlwQnVmID0gKGNoYXIgKikodGhpc191c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3pidWY7IGkrKykgeworCQljID0gKnBCdWY7CisJCS8qIHJlc2V0IGJpdHMgKi8KKwkJYyA9IGMgJiAofnB3bV9tYXNrKTsKKwkJLyogc2V0IHRoZSBiaXQgYXMgbG9uZyBhcyB0aGUgaW5kZXggaXMgbG93ZXIgdGhhbiB0aGUgdmFsdWUgKi8KKwkJaWYgKGkgPCB2YWx1ZSkKKwkJCWMgPSBjIHwgcHdtX21hc2s7CisJCS8qIHNldCB0aGUgb3B0aW9uYWwgc2lnbiBiaXQgZm9yIGEgcmVsYXkgKi8KKwkJaWYgKCFzaWduKSB7CisJCQkvKiBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJYyA9IGMgJiAofnNnbl9tYXNrKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5lZ2F0aXZlIHZhbHVlICovCisJCQljID0gYyB8IHNnbl9tYXNrOworCQl9CisJCSoocEJ1ZisrKSA9IGM7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9wd21fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChpbnNuLT5uKSAhPSAxKSB7CisJCS8qCisJCSAqIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgdmFsdWUgaGVyZSBiZWNhdXNlCisJCSAqIGl0IHdvdWxkIGp1c3Qgb3ZlcndyaXRlIHRoZSBQV00gYnVmZmVyIGEgY291cGxlIG9mIHRpbWVzCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHRoZSBzaWduIGlzIHNldCB2aWEgYSBzcGVjaWFsIElOU04gb25seSwgdGhpcyBnaXZlcyB1cyA4IGJpdHMgZm9yCisJICogbm9ybWFsIG9wZXJhdGlvbgorCSAqIHJlbGF5IHNpZ24gMCBieSBkZWZhdWx0CisJICovCisJcmV0dXJuIHVzYmR1eF9wd21fcGF0dGVybihkZXYsIHMsIENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpLAorCQkJCSAgZGF0YVswXSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9yZWFkKGNvbWVkaV9kZXZpY2UgKngxLCBjb21lZGlfc3ViZGV2aWNlICp4MiwKKwkJCSAgIGNvbWVkaV9pbnNuICp4MywgbHNhbXBsX3QgKng0KQoreworCS8qIG5vdCBuZWVkZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK307CisKKy8qIHN3aXRjaGVzIG9uL29mZiBQV00gKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19BUk06CisJCS8qIHN3aXRjaCBpdCBvbiAqLworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBwd20gb25cbiIsIGRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJLyoKKwkJICogaWYgbm90IHplcm8gdGhlIFBXTSBpcyBsaW1pdGVkIHRvIGEgY2VydGFpbiB0aW1lIHdoaWNoIGlzCisJCSAqIG5vdCBzdXBwb3J0ZWQgaGVyZQorCQkgKi8KKwkJaWYgKGRhdGFbMV0gIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gdXNiZHV4X3B3bV9zdGFydChkZXYsIHMpOworCWNhc2UgSU5TTl9DT05GSUdfRElTQVJNOgorCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBwd20gb2ZmXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCXJldHVybiB1c2JkdXhfcHdtX2NhbmNlbChkZXYsIHMpOworCWNhc2UgSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVM6CisJCS8qCisJCSAqIHRvIGNoZWNrIGlmIHRoZSBVU0IgdHJhbnNtaXNzaW9uIGhhcyBmYWlsZWQgb3IgaW4gY2FzZSBQV00KKwkJICogd2FzIGxpbWl0ZWQgdG8gbiBjeWNsZXMgdG8gY2hlY2sgaWYgaXQgaGFzIHRlcm1pbmF0ZWQKKwkJICovCisJCWRhdGFbMV0gPSB0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nOworCQlyZXR1cm4gMDsKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfUEVSSU9EOgorCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBzZXR0aW5nIHBlcmlvZFxuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCQlyZXR1cm4gdXNiZHV4X3B3bV9wZXJpb2QoZGV2LCBzLCBkYXRhWzFdKTsKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EOgorCQlkYXRhWzFdID0gdGhpc191c2JkdXhzdWItPnB3bVBlcmlvZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX0hfQlJJREdFOgorCQkvKiB2YWx1ZSBpbiB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIHNpZ24gaW4gdGhlIHNlY29uZCBmb3IgYQorCQkgICByZWxheSAqLworCQlyZXR1cm4gdXNiZHV4X3B3bV9wYXR0ZXJuKGRldiwgcywKKwkJCQkJICAvKiB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwkJCQkJICBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSwKKwkJCQkJICAvKiBhY3R1YWwgUFdNIGRhdGEgKi8KKwkJCQkJICBkYXRhWzFdLAorCQkJCQkgIC8qIGp1c3QgYSBzaWduICovCisJCQkJCSAgKGRhdGFbMl0gIT0gMCkpOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX0dFVF9IX0JSSURHRToKKwkJLyogdmFsdWVzIGFyZSBub3Qga2VwdCBpbiB0aGlzIGRyaXZlciwgbm90aGluZyB0byByZXR1cm4gaGVyZSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIGVuZCBvZiBQV00gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdGlkeV91cChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpOworCisJaWYgKCF1c2JkdXhzdWJfdG1wKQorCQlyZXR1cm47CisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiB0aWRpbmcgdXBcbiIpOworCisJLyogc2hvd3MgdGhlIHVzYiBzdWJzeXN0ZW0gdGhhdCB0aGUgZHJpdmVyIGlzIGRvd24gKi8KKwlpZiAodXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlKQorCQl1c2Jfc2V0X2ludGZkYXRhKHVzYmR1eHN1Yl90bXAtPmludGVyZmFjZSwgTlVMTCk7CisKKwl1c2JkdXhzdWJfdG1wLT5wcm9iZWQgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYkluKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZykgeworCQkJdXNiZHV4c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19JblVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiZHV4c3ViX3RtcC0+dXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKTsKKwkJCXVzYmR1eHN1Yl90bXAtPnVyYkluW2ldID0gTlVMTDsKKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJJbik7CisJCXVzYmR1eHN1Yl90bXAtPnVyYkluID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dCkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyh1c2JkdXhzdWJfdG1wKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXS0+CisJCQkJCXRyYW5zZmVyX2J1ZmZlcik7CisJCQkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJCQlOVUxMOworCQkJfQorCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSkgeworCQkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pOworCQkJCXVzYl9mcmVlX3VyYih1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pOworCQkJCXVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiT3V0KTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0ID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCQl1c2JkdXhzdWJfdG1wLT5wd21fY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHVzYmR1eHN1Yl90bXApOworCQl9CisJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSk7CisJCXVzYmR1eHN1Yl90bXAtPnVyYlB3bSA9IE5VTEw7CisJfQorCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmluQnVmZmVyKTsKKwl1c2JkdXhzdWJfdG1wLT5pbkJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5zbkJ1ZmZlcik7CisJdXNiZHV4c3ViX3RtcC0+aW5zbkJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPmluQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5kYWNfY29tbWFuZHMpOworCXVzYmR1eHN1Yl90bXAtPmRhY19jb21tYW5kcyA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+ZHV4X2NvbW1hbmRzKTsKKwl1c2JkdXhzdWJfdG1wLT5kdXhfY29tbWFuZHMgPSBOVUxMOworCXVzYmR1eHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwl1c2JkdXhzdWJfdG1wLT5hb19jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViX3RtcC0+cHdtX2NtZF9ydW5uaW5nID0gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGhleDJ1bnNpZ25lZChjaGFyICpoKQoreworCXVuc2lnbmVkIGhpLCBsbzsKKworCWlmIChoWzBdID4gJzknKQorCQloaSA9IGhbMF0gLSAnQScgKyAweDBhOworCWVsc2UKKwkJaGkgPSBoWzBdIC0gJzAnOworCisJaWYgKGhbMV0gPiAnOScpCisJCWxvID0gaFsxXSAtICdBJyArIDB4MGE7CisJZWxzZQorCQlsbyA9IGhbMV0gLSAnMCc7CisKKwlyZXR1cm4gaGkgKiAweDEwICsgbG87Cit9CisKKy8qIGZvciBGWDIgKi8KKyNkZWZpbmUgRklSTVdBUkVfTUFYX0xFTiAweDIwMDAKKworLyogdGFrZW4gZnJvbSBEYXZpZCBCcm93bmVsbCdzIGZ4bG9hZCBhbmQgYWRqdXN0ZWQgZm9yIHRoaXMgZHJpdmVyICovCitzdGF0aWMgaW50IHJlYWRfZmlybXdhcmUoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLCB2b2lkICpmaXJtd2FyZVB0ciwKKwkJCSBsb25nIHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXY7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNoYXIgKmZwID0gKGNoYXIgKilmaXJtd2FyZVB0cjsKKwl1bnNpZ25lZCBjaGFyICpmaXJtd2FyZUJpbmFyeSA9IE5VTEw7CisJaW50IHJlcyA9IDA7CisJaW50IG1heEFkZHIgPSAwOworCisJZmlybXdhcmVCaW5hcnkgPSBremFsbG9jKEZJUk1XQVJFX01BWF9MRU4sIEdGUF9LRVJORUwpOworCWlmICghZmlybXdhcmVCaW5hcnkpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiBtZW0gYWxsb2MgZm9yIGZpcm13YXJlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBidWZbMjU2XSwgKmNwOworCQljaGFyIHR5cGU7CisJCWludCBsZW47CisJCWludCBpZHgsIG9mZjsKKwkJaW50IGogPSAwOworCisJCS8qIGdldCBvbmUgbGluZSAqLworCQl3aGlsZSAoKGkgPCBzaXplKSAmJiAoZnBbaV0gIT0gMTMpICYmIChmcFtpXSAhPSAxMCkpIHsKKwkJCWJ1ZltqXSA9IGZwW2ldOworCQkJaSsrOworCQkJaisrOworCQkJaWYgKGogPj0gc2l6ZW9mKGJ1ZikpIHsKKwkJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IGJvZ3VzIGZpcm13YXJlIGZpbGUhXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLyogZ2V0IHJpZCBvZiBMRi9DUi8uLi4gKi8KKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKChmcFtpXSA9PSAxMykgfHwgKGZwW2ldID09IDEwKQorCQkJCXx8IChmcFtpXSA9PSAwKSkpIHsKKwkJCWkrKzsKKwkJfQorCisJCWJ1ZltqXSA9IDA7CisJCS8qIGRldl9kYmcoZGV2LCAiY29tZWRpXzogYnVmPSVzXG4iLCBidWYpOyAqLworCisJCS8qCisJCSAqIEVYVEVOU0lPTjoKKwkJICogIiMgY29tbWVudC10aWxsLWVuZC1vZi1saW5lIiwgZm9yIGNvcHlyaWdodHMgZXRjCisJCSAqLworCQlpZiAoYnVmWzBdID09ICcjJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChidWZbMF0gIT0gJzonKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVwbG9hZDogbm90IGFuIGloZXggcmVjb3JkOiAlcyIsCisJCQkJYnVmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogUmVhZCB0aGUgbGVuZ3RoIGZpZWxkICh1cCB0byAxNiBieXRlcykgKi8KKwkJbGVuID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDEpOworCisJCS8qIFJlYWQgdGhlIHRhcmdldCBvZmZzZXQgKi8KKwkJb2ZmID0gKGhleDJ1bnNpZ25lZChidWYgKyAzKSAqIDB4MDEwMCkgKyBoZXgydW5zaWduZWQoYnVmICsgNSk7CisKKwkJaWYgKChvZmYgKyBsZW4pID4gbWF4QWRkcikKKwkJCW1heEFkZHIgPSBvZmYgKyBsZW47CisKKworCQlpZiAobWF4QWRkciA+PSBGSVJNV0FSRV9NQVhfTEVOKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IGZpcm13YXJlIHVwbG9hZCBnb2VzICIKKwkJCQkiYmV5b25kIEZYMiBSQU0gYm91bmRhcmllcy5cbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogZGV2X2RiZyhkZXYsICJjb21lZGlfOiBvZmY9JXgsIGxlbj0leDpcbiIsIG9mZiwgbGVuKTsgKi8KKworCQkvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSAqLworCQl0eXBlID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDcpOworCisJCS8qIElmIHRoaXMgaXMgYW4gRU9GIHJlY29yZCwgdGhlbiBtYWtlIGl0IHNvLiAqLworCQlpZiAodHlwZSA9PSAxKQorCQkJYnJlYWs7CisKKworCQlpZiAodHlwZSAhPSAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVuc3VwcG9ydGVkIHJlY29yZCB0eXBlOiAldVxuIiwKKwkJCQl0eXBlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJZm9yIChpZHggPSAwLCBjcCA9IGJ1ZiArIDk7IGlkeCA8IGxlbjsgaWR4ICs9IDEsIGNwICs9IDIpIHsKKwkJCWZpcm13YXJlQmluYXJ5W2lkeCArIG9mZl0gPSBoZXgydW5zaWduZWQoY3ApOworCQkJLypwcmludGsoIiUwMnggIixmaXJtd2FyZUJpbmFyeVtpZHgrb2ZmXSk7ICovCisJCX0KKwkJLypwcmludGsoIlxuIik7ICovCisKKwkJaWYgKGkgPj0gc2l6ZSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1bmV4cGVjdGVkIGVuZCBvZiBoZXggZmlsZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJfQorCXJlcyA9IGZpcm13YXJlVXBsb2FkKHVzYmR1eHN1YiwgZmlybXdhcmVCaW5hcnksIG1heEFkZHIgKyAxKTsKKwlrZnJlZShmaXJtd2FyZUJpbmFyeSk7CisJcmV0dXJuIHJlczsKK30KKworLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdXJicyBhbmQgaW5pdGlhbGlzZSB0aGVtICovCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGVyZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYodWludGVyZik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVpbnRlcmYtPmRldjsKKwlpbnQgaTsKKwlpbnQgaW5kZXg7CisKKwlkZXZfZGJnKGRldiwgImNvbWVkaV86IHVzYmR1eF86ICIKKwkJImZpbmRpbmcgYSBmcmVlIHN0cnVjdHVyZSBmb3IgdGhlIHVzYi1kZXZpY2VcbiIpOworCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8qIGxvb2sgZm9yIGEgZnJlZSBwbGFjZSBpbiB0aGUgdXNiZHV4IGFycmF5ICovCisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYOyBpKyspIHsKKwkJaWYgKCEodXNiZHV4c3ViW2ldLnByb2JlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm8gbW9yZSBzcGFjZSAqLworCWlmIChpbmRleCA9PSAtMSkgeworCQlkZXZfZXJyKGRldiwgIlRvbyBtYW55IHVzYmR1eC1kZXZpY2VzIGNvbm5lY3RlZC5cbiIpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVNRklMRTsKKwl9CisJZGV2X2RiZyhkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJInVzYmR1eHN1YlslZF0gaXMgcmVhZHkgdG8gY29ubmVjdCB0byBjb21lZGkuXG4iLCBpbmRleCk7CisKKwlpbml0X01VVEVYKCYodXNiZHV4c3ViW2luZGV4XS5zZW0pKTsKKwkvKiBzYXZlIGEgcG9pbnRlciB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0udXNiZGV2ID0gdWRldjsKKworCS8qIDIuNjogc2F2ZSB0aGUgaW50ZXJmYWNlIGl0c2VsZiAqLworCXVzYmR1eHN1YltpbmRleF0uaW50ZXJmYWNlID0gdWludGVyZjsKKwkvKiBnZXQgdGhlIGludGVyZmFjZSBudW1iZXIgZnJvbSB0aGUgaW50ZXJmYWNlICovCisJdXNiZHV4c3ViW2luZGV4XS5pZm51bSA9IHVpbnRlcmYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkvKiBoYW5kIHRoZSBwcml2YXRlIGRhdGEgb3ZlciB0byB0aGUgdXNiIHN1YnN5c3RlbSAqLworCS8qIHdpbGwgYmUgbmVlZGVkIGZvciBkaXNjb25uZWN0ICovCisJdXNiX3NldF9pbnRmZGF0YSh1aW50ZXJmLCAmKHVzYmR1eHN1YltpbmRleF0pKTsKKworCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4OiBpZm51bT0lZFxuIiwgdXNiZHV4c3ViW2luZGV4XS5pZm51bSk7CisKKwkvKiB0ZXN0IGlmIGl0IGlzIGhpZ2ggc3BlZWQgKFVTQiAyLjApICovCisJdXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkID0KKwkJKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CisKKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBvZiB0aGUgREEgY29udmVydGVyICovCisJdXNiZHV4c3ViW2luZGV4XS5kYWNfY29tbWFuZHMgPSBremFsbG9jKE5VTU9VVENIQU5ORUxTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmR1eHN1YltpbmRleF0uZGFjX2NvbW1hbmRzKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBnb2luZyB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOworCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGluIGJ1ZmZlciBhbmQgc2V0IGl0IHRvIHplcm8gKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmluQnVmZmVyID0ga3phbGxvYyhTSVpFSU5CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0uaW5CdWZmZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBpbkJ1ZmZlclxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2Ugb2YgdGhlIGluc3RydWN0aW9uIGJ1ZmZlciAqLworCXVzYmR1eHN1YltpbmRleF0uaW5zbkJ1ZmZlciA9IGt6YWxsb2MoU0laRUlOU05CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0uaW5zbkJ1ZmZlcikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluc25CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgb3V0YnVmZmVyICovCisJdXNiZHV4c3ViW2luZGV4XS5vdXRCdWZmZXIgPSBremFsbG9jKFNJWkVPVVRCVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0ub3V0QnVmZmVyKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3Igb3V0QnVmZmVyXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHNldHRpbmcgdG8gYWx0ZXJuYXRlIHNldHRpbmcgMzogZW5hYmxpbmcgaXNvIGVwIGFuZCBidWxrIGVwLiAqLworCWkgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldiwKKwkJCSAgICAgIHVzYmR1eHN1YltpbmRleF0uaWZudW0sIDMpOworCWlmIChpIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkiY291bGQgbm90IHNldCBhbHRlcm5hdGUgc2V0dGluZyAzIGluIGhpZ2ggc3BlZWQuXG4iLAorCQkJaW5kZXgpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZkluQnVmZmVycyA9IE5VTU9GSU5CVUZGRVJTSElHSDsKKwllbHNlCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMgPSBOVU1PRklOQlVGRkVSU0ZVTEw7CisKKwl1c2JkdXhzdWJbaW5kZXhdLnVyYkluID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYiAqKSAqIHVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMsCisJCUdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiSW4pKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiBDb3VsZCBub3QgYWxsb2MuIHVyYkluIGFycmF5XG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJLyogb25lIGZyYW1lOiAxbXMgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXSA9IHVzYl9hbGxvY191cmIoMSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiB1cmIoJWQpXG4iLCBpbmRleCwgaSk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmRldiA9IHVzYmR1eHN1YltpbmRleF0udXNiZGV2OworCQkvKiB3aWxsIGJlIGZpbGxlZCBsYXRlciB3aXRoIGEgcG9pbnRlciB0byB0aGUgY29tZWRpLWRldmljZSAqLworCQkvKiBhbmQgT05MWSB0aGVuIHRoZSB1cmIgc2hvdWxkIGJlIHN1Ym1pdHRlZCAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5jb250ZXh0ID0gTlVMTDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+cGlwZSA9CisJCQl1c2JfcmN2aXNvY3BpcGUodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsIElTT0lORVApOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2MoU0laRUlOQlVGLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyKSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi5cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+Y29tcGxldGUgPSB1c2JkdXhzdWJfYWlfSXNvY0lycTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gU0laRUlOQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSBTSVpFSU5CVUY7CisJfQorCisJLyogb3V0ICovCisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMgPSBOVU1PRk9VVEJVRkZFUlNISUdIOworCWVsc2UKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMgPSBOVU1PRk9VVEJVRkZFUlNGVUxMOworCisJdXNiZHV4c3ViW2luZGV4XS51cmJPdXQgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICopICogdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMsCisJCUdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiT3V0KSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiT3V0IGFycmF5XG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJbaW5kZXhdLm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCS8qIG9uZSBmcmFtZTogMW1zICovCisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldID0gdXNiX2FsbG9jX3VyYigxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiB1cmIoJWQpXG4iLCBpbmRleCwgaSk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5kZXYgPSB1c2JkdXhzdWJbaW5kZXhdLnVzYmRldjsKKwkJLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbWVkaS1kZXZpY2UgKi8KKwkJLyogYW5kIE9OTFkgdGhlbiB0aGUgdXJiIHNob3VsZCBiZSBzdWJtaXR0ZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmNvbnRleHQgPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+cGlwZSA9CisJCQl1c2Jfc25kaXNvY3BpcGUodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsIElTT09VVEVQKTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2MoU0laRU9VVEJVRiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIpKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJImNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLlxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+Y29tcGxldGUgPSB1c2JkdXhzdWJfYW9fSXNvY0lycTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFT1VUQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9CisJCQlTSVpFT1VUQlVGOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKSB7CisJCQkvKiB1ZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSAxOworCQl9CisJfQorCisJLyogcHdtICovCisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkgeworCQkvKiBtYXggYnVsayBlcCBzaXplIGluIGhpZ2ggc3BlZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmID0gNTEyOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJIkNvdWxkIG5vdCBhbGxvYy4gcHdtIHVyYlxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2ModXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiY291bGQgbm90IGFsbG9jLiB0cmFuc2IuIGZvciBwd21cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UgeworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9IE5VTEw7CisJCXVzYmR1eHN1YltpbmRleF0uc2l6ZVB3bUJ1ZiA9IDA7CisJfQorCisJdXNiZHV4c3ViW2luZGV4XS5haV9jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViW2luZGV4XS5hb19jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViW2luZGV4XS5wd21fY21kX3J1bm5pbmcgPSAwOworCisJLyogd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBmdW5jdGlvbiAqLworCXVzYmR1eHN1YltpbmRleF0ucHJvYmVkID0gMTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCWRldl9pbmZvKGRldiwgImNvbWVkaV86IHVzYmR1eCVkICIKKwkJICJoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQuXG4iLCBpbmRleCk7CisJLyogc3VjY2VzcyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlpZiAoIXVzYmR1eHN1Yl90bXApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJImNvbWVkaV86IGRpc2Nvbm5lY3QgY2FsbGVkIHdpdGggbnVsbCBwb2ludGVyLlxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVzYmRldiAhPSB1ZGV2KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJjb21lZGlfOiBCVUchIGNhbGxlZCB3aXRoIHdyb25nIHB0ciEhIVxuIik7CisJCXJldHVybjsKKwl9CisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCWRvd24oJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJdGlkeV91cCh1c2JkdXhzdWJfdG1wKTsKKwl1cCgmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCWRldl9kYmcoJmludGYtPmRldiwgImNvbWVkaV86IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSB1c2JcbiIpOworfQorCisvKiBpcyBjYWxsZWQgd2hlbiBjb21lZGktY29uZmlnIGlzIGNhbGxlZCAqLworc3RhdGljIGludCB1c2JkdXhfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJaW50IHJldDsKKwlpbnQgaW5kZXg7CisJaW50IGk7CisJc3RydWN0IHVzYmR1eHN1YiAqdWRldjsKKworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLyogZmluZCBhIHZhbGlkIGRldmljZSB3aGljaCBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24gb2YKKwkgKiB0aGUgdXNiICovCisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYOyBpKyspIHsKKwkJaWYgKCh1c2JkdXhzdWJbaV0ucHJvYmVkKSAmJiAoIXVzYmR1eHN1YltpXS5hdHRhY2hlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiB1c2JkdXg6IGVycm9yOiBhdHRhY2ggZmFpbGVkLCBubyAiCisJCSAgICAgICAidXNiZHV4IGRldnMgY29ubmVjdGVkIHRvIHRoZSB1c2IgYnVzLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXVkZXYgPSAmdXNiZHV4c3ViW2luZGV4XTsKKwlkb3duKCZ1ZGV2LT5zZW0pOworCS8qIHBvaW50ZXIgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBjb21lZGkgZGV2aWNlICovCisJdWRldi0+Y29tZWRpZGV2ID0gZGV2OworCisJLyogdHJ5aW5nIHRvIHVwbG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2hpcCAqLworCWlmIChjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApICYmCisJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pIHsKKwkJcmVhZF9maXJtd2FyZSh1ZGV2LCBjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApLAorCQkJICAgICAgaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSk7CisJfQorCisJZGV2LT5ib2FyZF9uYW1lID0gQk9BUkROQU1FOworCisJLyogc2V0IG51bWJlciBvZiBzdWJkZXZpY2VzICovCisJaWYgKHVkZXYtPmhpZ2hfc3BlZWQpIHsKKwkJLyogd2l0aCBwd20gKi8KKwkJZGV2LT5uX3N1YmRldmljZXMgPSA1OworCX0gZWxzZSB7CisJCS8qIHdpdGhvdXQgcHdtICovCisJCWRldi0+bl9zdWJkZXZpY2VzID0gNDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN1YmRldmljZXMgKi8KKwlyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2LT5uX3N1YmRldmljZXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBlcnJvciBhbGxvYyBzcGFjZSBmb3Igc3ViZGV2XG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbygmdWRldi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiLWRldmljZSAlZCBpcyBhdHRhY2hlZCB0byBjb21lZGkuXG4iLAorCQlkZXYtPm1pbm9yLCBpbmRleCk7CisJLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgaXMgYWxzbyBzaW1wbHkgdGhlIHVzYi1zdHJ1Y3R1cmUgKi8KKwlkZXYtPnByaXZhdGUgPSB1ZGV2OworCisJLyogdGhlIGZpcnN0IHN1YmRldmljZSBpcyB0aGUgQS9EIGNvbnZlcnRlciAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisJLyogdGhlIFVSQnMgZ2V0IHRoZSBjb21lZGkgc3ViZGV2aWNlICovCisJLyogd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcgKi8KKwkvKiB0aGlzIGlzIHRoZSBzdWJkZXZpY2Ugd2hpY2ggcmVhZHMgZGF0YSAqLworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlICovCisJLyogdXNiLXN0cnVjdHVyZSAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCS8qIGFuYWxvZyBpbnB1dCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkvKiByZWFkYWJsZSBhbmQgcmVmIGlzIHRvIGdyb3VuZCAqLworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1JFQUQ7CisJLyogOCBjaGFubmVscyAqLworCXMtPm5fY2hhbiA9IDg7CisJLyogbGVuZ3RoIG9mIHRoZSBjaGFubmVsbGlzdCAqLworCXMtPmxlbl9jaGFubGlzdCA9IDg7CisJLyogY2FsbGJhY2sgZnVuY3Rpb25zICovCisJcy0+aW5zbl9yZWFkID0gdXNiZHV4X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4X2FpX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4X2FpX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhfYWlfY2FuY2VsOworCS8qIG1heCB2YWx1ZSBmcm9tIHRoZSBBL0QgY29udmVydGVyICgxMmJpdCkgKi8KKwlzLT5tYXhkYXRhID0gMHhmZmY7CisJLyogcmFuZ2UgdGFibGUgdG8gY29udmVydCB0byBwaHlzaWNhbCB1bml0cyAqLworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV91c2JkdXhfYWlfcmFuZ2UpOworCisJLyogYW5hbG9nIG91dCAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisJLyogYW5hbG9nIG91dCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkvKiBiYWNrd2FyZCBwb2ludGVyICovCisJZGV2LT53cml0ZV9zdWJkZXYgPSBzOworCS8qIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlICovCisJLyogdXNiLXN0cnVjdHVyZSAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCS8qIGFyZSB3cml0YWJsZSAqLworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1dSSVRFOworCS8qIDQgY2hhbm5lbHMgKi8KKwlzLT5uX2NoYW4gPSA0OworCS8qIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QgKi8KKwlzLT5sZW5fY2hhbmxpc3QgPSA0OworCS8qIDEyIGJpdCByZXNvbHV0aW9uICovCisJcy0+bWF4ZGF0YSA9IDB4MGZmZjsKKwkvKiBiaXBvbGFyIHJhbmdlICovCisJcy0+cmFuZ2VfdGFibGUgPSAoJnJhbmdlX3VzYmR1eF9hb19yYW5nZSk7CisJLyogY2FsbGJhY2sgKi8KKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4X2FvX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4X2FvX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhfYW9fY2FuY2VsOworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9hb19pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZSA9IHVzYmR1eF9hb19pbnNuX3dyaXRlOworCisJLyogZGlnaXRhbCBJL08gKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RJTzsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSA4OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV9kaWdpdGFsKTsKKwlzLT5pbnNuX2JpdHMgPSB1c2JkdXhfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IHVzYmR1eF9kaW9faW5zbl9jb25maWc7CisJLyogd2UgZG9uJ3QgdXNlIGl0ICovCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisKKwkvKiBjb3VudGVyICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9DT1VOVEVSOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSA0OworCXMtPm1heGRhdGEgPSAweEZGRkY7CisJcy0+aW5zbl9yZWFkID0gdXNiZHV4X2NvdW50ZXJfcmVhZDsKKwlzLT5pbnNuX3dyaXRlID0gdXNiZHV4X2NvdW50ZXJfd3JpdGU7CisJcy0+aW5zbl9jb25maWcgPSB1c2JkdXhfY291bnRlcl9jb25maWc7CisKKwlpZiAodWRldi0+aGlnaF9zcGVlZCkgeworCQkvKiB0aW1lciAvIHB3bSAqLworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX1BXTTsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BXTTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1BXTV9IQlJJREdFOworCQlzLT5uX2NoYW4gPSA4OworCQkvKiB0aGlzIGRlZmluZXMgdGhlIG1heCBkdXR5IGN5Y2xlIHJlc29sdXRpb24gKi8KKwkJcy0+bWF4ZGF0YSA9IHVkZXYtPnNpemVQd21CdWY7CisJCXMtPmluc25fd3JpdGUgPSB1c2JkdXhfcHdtX3dyaXRlOworCQlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfcHdtX3JlYWQ7CisJCXMtPmluc25fY29uZmlnID0gdXNiZHV4X3B3bV9jb25maWc7CisJCXVzYmR1eF9wd21fcGVyaW9kKGRldiwgcywgUFdNX0RFRkFVTFRfUEVSSU9EKTsKKwl9CisJLyogZmluYWxseSBkZWNpZGUgdGhhdCBpdCdzIGF0dGFjaGVkICovCisJdWRldi0+YXR0YWNoZWQgPSAxOworCisJdXAoJnVkZXYtPnNlbSk7CisKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCisJZGV2X2luZm8oJnVkZXYtPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGF0dGFjaGVkIHRvIHVzYmR1eC5cbiIsCisJCSBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGk/OiB1c2JkdXg6IGRldGFjaCB3aXRob3V0IGRldiB2YXJpYWJsZS4uLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXVzYmR1eHN1Yl90bXAgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF1c2JkdXhzdWJfdG1wKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaT86IHVzYmR1eDogZGV0YWNoIHdpdGhvdXQgcHRyIHRvIHVzYmR1eHN1YltdXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogZGV0YWNoIHVzYiBkZXZpY2VcbiIsCisJCWRldi0+bWlub3IpOworCisJZG93bigmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwkvKiBEb24ndCBhbGxvdyBkZXRhY2ggdG8gZnJlZSB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwkvKiBJdCdzIG9uZSBlbnRyeSBvZiBvZiB1c2JkdXhzdWJbXSAqLworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJdXNiZHV4c3ViX3RtcC0+YXR0YWNoZWQgPSAwOworCXVzYmR1eHN1Yl90bXAtPmNvbWVkaWRldiA9IE5VTEw7CisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogZGV0YWNoOiBzdWNjZXNzZnVsbHkgcmVtb3ZlZFxuIiwgZGV2LT5taW5vcik7CisJdXAoJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1haW4gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3VzYmR1eCA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CSJ1c2JkdXgiLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJdXNiZHV4X2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJdXNiZHV4X2RldGFjaCwKK307CisKK3N0YXRpYyB2b2lkIGluaXRfdXNiX2RldmljZXModm9pZCkKK3sKKwlpbnQgaW5kZXg7CisKKwkvKiBhbGwgZGV2aWNlcyBlbnRyaWVzIGFyZSBpbnZhbGlkIHRvIGJlZ2luIHdpdGggKi8KKwkvKiB0aGV5IHdpbGwgYmVjb21lIHZhbGlkIGJ5IHRoZSBwcm9iZSBmdW5jdGlvbiAqLworCS8qIGFuZCB0aGVuIGZpbmFsbHkgYnkgdGhlIGF0dGFjaC1mdW5jdGlvbiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTVVTQkRVWDsgaW5kZXgrKykgeworCQltZW1zZXQoJih1c2JkdXhzdWJbaW5kZXhdKSwgMHgwMCwgc2l6ZW9mKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJaW5pdF9NVVRFWCgmKHVzYmR1eHN1YltpbmRleF0uc2VtKSk7CisJfQorfQorCisvKiBUYWJsZSB3aXRoIHRoZSBVU0ItZGV2aWNlczoganVzdCBub3cgb25seSB0ZXN0aW5nIElEcyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmR1eHN1Yl90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDAxKSB9LAorCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDAyKSB9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JkdXhzdWJfdGFibGUpOworCisvKiBUaGUgdXNiZHV4c3ViLWRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYmR1eHN1Yl9kcml2ZXIgPSB7CisgICAgICAubmFtZSA9CQlCT0FSRE5BTUUsCisgICAgICAucHJvYmUgPQkJdXNiZHV4c3ViX3Byb2JlLAorICAgICAgLmRpc2Nvbm5lY3QgPQl1c2JkdXhzdWJfZGlzY29ubmVjdCwKKyAgICAgIC5pZF90YWJsZSA9CXVzYmR1eHN1Yl90YWJsZSwKK307CisKKy8qIENhbid0IHVzZSB0aGUgbmljZSBtYWNybyBhcyBJIGhhdmUgYWxzbyB0byBpbml0aWFsaXNlIHRoZSBVU0IgKi8KKy8qIHN1YnN5c3RlbTogKi8KKy8qIHJlZ2lzdGVyaW5nIHRoZSB1c2Itc3lzdGVtIF9hbmRfIHRoZSBjb21lZGktZHJpdmVyICovCitzdGF0aWMgaW50IGluaXRfdXNiZHV4KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyAiXG4iKTsKKwlpbml0X3VzYl9kZXZpY2VzKCk7CisJdXNiX3JlZ2lzdGVyKCZ1c2JkdXhzdWJfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4KTsKKwlyZXR1cm4gMDsKK30KKworLyogZGVyZWdpc3RlcmluZyB0aGUgY29tZWRpIGRyaXZlciBhbmQgdGhlIHVzYi1zdWJzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIGV4aXRfdXNiZHV4KHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4KTsKKwl1c2JfZGVyZWdpc3RlcigmdXNiZHV4c3ViX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdXNiZHV4KTsKK21vZHVsZV9leGl0KGV4aXRfdXNiZHV4KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAwZmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpAQCAtMCwwICsxLDE3NzggQEAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjk5YSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQmVybmQgUG9yciwgQmVybmRQb3JyQGYycy5jb20iCisjZGVmaW5lIERSSVZFUl9ERVNDICJVU0ItRFVYZmFzdCwgQmVybmRQb3JyQGYycy5jb20iCisvKgorICAgY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgQmVybmQgUG9yciwgQmVybmQuUG9yckBmMnMuY29tCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorRHJpdmVyOiB1c2JkdXhmYXN0CitEZXNjcmlwdGlvbjogSVRMIFVTQi1EVVhmYXN0CitEZXZpY2VzOiBbSVRMXSBVU0ItRFVYICh1c2JkdXhmYXN0Lm8pCitBdXRob3I6IEJlcm5kIFBvcnIgPEJlcm5kUG9yckBmMnMuY29tPgorVXBkYXRlZDogMDQgRGVjIDIwMDYKK1N0YXR1czogdGVzdGluZworKi8KKworLyoKKyAqIEkgbXVzdCBnaXZlIGNyZWRpdCBoZXJlIHRvIENocmlzIEJhdWdoZXIgd2hvCisgKiB3cm90ZSB0aGUgZHJpdmVyIGZvciBBVC1NSU8tMTZkLiBJIHVzZWQgc29tZSBwYXJ0cyBvZiB0aGlzCisgKiBkcml2ZXIuIEkgYWxzbyBtdXN0IGdpdmUgY3JlZGl0cyB0byBEYXZpZCBCcm93bmVsbAorICogd2hvIHN1cHBvcnRlZCBtZSB3aXRoIHRoZSBVU0IgZGV2ZWxvcG1lbnQuCisgKgorICogQmVybmQgUG9ycgorICoKKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogMC45OiBEcm9wcGluZyB0aGUgZmlyc3QgZGF0YSBwYWNrZXQgd2hpY2ggc2VlbXMgdG8gYmUgZnJvbSB0aGUgbGFzdCB0cmFuc2Zlci4KKyAqICAgICAgQnVmZmVyIG92ZXJmbG93cyBpbiB0aGUgRlgyIGFyZSBoYW5kZWQgb3ZlciB0byBjb21lZGkuCisgKiAwLjkyOiBEcm9wcGluZyBub3cgNCBwYWNrZXRzLiBUaGUgcXVhZCBidWZmZXIgaGFzIHRvIGJlIGVtcHRpZWQuCisgKiAgICAgICBBZGRlZCBpbnNuIGNvbW1hbmQgYmFzaWNhbGx5IGZvciB0ZXN0aW5nLiBTYW1wbGUgcmF0ZSBpcyAxTUh6LzE2Y2g9NjIuNWtIegorICogMC45OTogSWFuIEFiYm90dCBwb2ludGVkIG91dCBhIGJ1ZyB3aGljaCBoYXMgYmVlbiBjb3JyZWN0ZWQuIFRoYW5rcyEKKyAqIDAuOTlhOiBhZGRlZCBleHRlcm5hbCB0cmlnZ2VyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8vICh1biljb21tZW50IHRoaXMgaWYgeW91IHdhbnQgdG8gaGF2ZSBkZWJ1ZyBpbmZvLgorLy8jZGVmaW5lIENPTkZJR19DT01FRElfREVCVUcKKyN1bmRlZiAgQ09ORklHX0NPTUVESV9ERUJVRworCisjZGVmaW5lIEJPQVJETkFNRSAidXNiZHV4ZmFzdCIKKworLy8gdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlcgorI2RlZmluZSBFWlRJTUVPVVQgMzAKKworLy8gY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQKKyNkZWZpbmUgVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSAweEEwCisjZGVmaW5lIFZFTkRPUl9ESVJfSU4gIDB4QzAKKyNkZWZpbmUgVkVORE9SX0RJUl9PVVQgMHg0MAorCisvLyBpbnRlcm5hbCBhZHJlc3NlcyBvZiB0aGUgODA1MSBwcm9jZXNzb3IKKyNkZWZpbmUgVVNCRFVYRkFTVFNVQl9DUFVDUyAweEU2MDAKKworLy8gbWF4IGxlbmdodGggb2YgdGhlIHRyYW5zZmVyLWJ1ZmZlciBmb3Igc29mdHdhcmUgdXBsb2FkCisjZGVmaW5lIFRCX0xFTiAweDIwMDAKKworLy8gSW5wdXQgZW5kcG9pbnQgbnVtYmVyCisjZGVmaW5lIEJVTEtJTkVQICAgICAgICAgICA2CisKKy8vIEVuZHBvaW50IGZvciB0aGUgQS9EIGNoYW5uZWxsaXN0OiBidWxrIE9VVAorI2RlZmluZSBDSEFOTkVMTElTVEVQICAgICA0CisKKy8vIE51bWJlciBvZiBjaGFubmVscworI2RlZmluZSBOVU1DSEFOTkVMUyAgICAgICAzMgorCisvLyBzaXplIG9mIHRoZSB3YXZlZm9ybSBkZXNjcmlwdG9yCisjZGVmaW5lIFdBVkVTSVpFICAgICAgICAgIDB4MjAKKworLy8gU2l6ZSBvZiBvbmUgQS9EIHZhbHVlCisjZGVmaW5lIFNJWkVBRElOICAgICAgICAgICgoc2l6ZW9mKGludDE2X3QpKSkKKworLy8gU2l6ZSBvZiB0aGUgaW5wdXQtYnVmZmVyIElOIEJZVEVTCisjZGVmaW5lIFNJWkVJTkJVRiAgICAgICAgIDUxMgorCisvLyAxNiBieXRlcy4KKyNkZWZpbmUgU0laRUlOU05CVUYgICAgICAgNTEyCisKKy8vIFNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgdGhlIGR1eCBjb21tYW5kcworI2RlZmluZSBTSVpFT0ZEVVhCVUZGRVIgICAgMjU2CS8vIGJ5dGVzCisKKy8vIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj01CisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTSElHSCAgICAgMTAKKworLy8gVG90YWwgbnVtYmVyIG9mIHVzYmR1eGZhc3QgZGV2aWNlcworI2RlZmluZSBOVU1VU0JEVVhGQVNUICAgICAgICAgICAgIDE2CisKKy8vIE51bWJlciBvZiBzdWJkZXZpY2VzCisjZGVmaW5lIE5fU1VCREVWSUNFUyAgICAgICAgICAxCisKKy8vIEFuYWxvZ3VlIGluIHN1YmRldmljZQorI2RlZmluZSBTVUJERVZfQUQgICAgICAgICAgICAgMAorCisvLyBtaW4gZGVsYXkgc3RlcHMgZm9yIG1vcmUgdGhhbiBvbmUgY2hhbm5lbAorLy8gYmFzaWNhbGx5IHdoZW4gdGhlIG11eCBnaXZlcyB1cC4gOy0pCisjZGVmaW5lIE1JTl9TQU1QTElOR19QRVJJT0QgOQkvLyBzdGVwcyBhdCAzME1IeiBpbiB0aGUgRlgyCisKKy8vIE1heCBudW1iZXIgb2YgMS8zME1IeiBkZWxheSBzdGVwczoKKyNkZWZpbmUgTUFYX1NBTVBMSU5HX1BFUklPRCA1MDAKKworLy8gTnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgdG8gaWdub3JlIGJlZm9yZSB3ZSBzdGFydCBoYW5kaW5nIGRhdGEgb3ZlciB0byBjb21lZGkuCisvLyBJdCdzIHF1YWQgYnVmZmVyaW5nIGFuZCB3ZSBoYXZlIHRvIGlnbm9yZSA0IHBhY2tldHMuCisjZGVmaW5lIFBBQ0tFVFNfVE9fSUdOT1JFIDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjb21lZGkgY29uc3RhbnRzCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91c2JkdXhmYXN0X2FpX3JhbmdlID0geyAyLCB7CisJCQlCSVBfUkFOR0UoMC43NSksCisJCQlCSVBfUkFOR0UoMC41KSwKKwl9Cit9OworCisvKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgb2Ygb25lIHN1YmRldmljZQorICovCisKKy8vIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBob2xkcyBhbGwgdGhlIGRhdGEgb2YgdGhpcyBkcml2ZXIKKy8vIG9uZSBzdWIgZGV2aWNlIGp1c3Qgbm93OiBBL0QKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBhdHRhY2hlZD8KKwlpbnQgYXR0YWNoZWQ7CisJLy8gaXMgaXQgYXNzb2NpYXRlZCB3aXRoIGEgc3ViZGV2aWNlPworCWludCBwcm9iZWQ7CisJLy8gcG9pbnRlciB0byB0aGUgdXNiLWRldmljZQorCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJLy8gQlVMSy10cmFuc2ZlciBoYW5kbGluZzogdXJiCisJc3RydWN0IHVyYiAqdXJiSW47CisJaW50OF90ICp0cmFuc2Zlcl9idWZmZXI7CisJLy8gaW5wdXQgYnVmZmVyIGZvciBzaW5nbGUgaW5zbgorCWludDE2X3QgKmluc25CdWZmZXI7CisJLy8gaW50ZXJmYWNlIG51bWJlcgorCWludCBpZm51bTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJLy8gaW50ZXJmYWNlIHN0cnVjdHVyZSBpbiAyLjYKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworI2VuZGlmCisJLy8gY29tZWRpIGRldmljZSBmb3IgdGhlIGludGVycnVwdCBjb250ZXh0CisJY29tZWRpX2RldmljZSAqY29tZWRpZGV2OworCS8vIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcKKwlzaG9ydCBpbnQgYWlfY21kX3J1bm5pbmc7CisJLy8gY29udGlub3VzIGFxdWlzaXRpb24KKwlzaG9ydCBpbnQgYWlfY29udGlub3VzOworCS8vIG51bWJlciBvZiBzYW1wbGVzIHRvIGFxdWlyZQorCWxvbmcgaW50IGFpX3NhbXBsZV9jb3VudDsKKwkvLyBjb21tYW5kcworCXVpbnQ4X3QgKmR1eF9jb21tYW5kczsKKwkvLyBjb3VudGVyIHdoaWNoIGlnbm9yZXMgdGhlIGZpcnN0IGJ1ZmZlcnMKKwlpbnQgaWdub3JlOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfSB1c2JkdXhmYXN0c3ViX3Q7CisKKy8vIFRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHVzYi1kYXRhIG9mIHRoZSBkcml2ZXIKKy8vIGlzIGFsc28gdGhlIHByaXZhdGUgZGF0YSBmb3IgdGhlIGNvbWVkaS1kZXZpY2UuCisvLyBUaGlzIGhhcyB0byBiZSBnbG9iYWwgYXMgdGhlIHVzYiBzdWJzeXN0ZW0gbmVlZHMKKy8vIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSBvdGhlciByZWFzb24gaXMgdGhhdCB0aGlzCisvLyBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGVyZSBfYmVmb3JlXyBhbnkgY29tZWRpCisvLyBjb21tYW5kIGlzIGlzc3VlZC4gVGhlIHVzYiBzdWJzeXN0ZW0gbXVzdCBiZQorLy8gaW5pdGlhbGlzZWQgYmVmb3JlIGNvbWVkaSBjYW4gYWNjZXNzIGl0Lgorc3RhdGljIHVzYmR1eGZhc3RzdWJfdCB1c2JkdXhmYXN0c3ViW05VTVVTQkRVWEZBU1RdOworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzdGFydF9zdG9wX3NlbSk7CisKKy8vIGJ1bGsgdHJhbnNmZXJzIHRvIHVzYmR1eGZhc3QKKworI2RlZmluZSBTRU5EQURDT01NQU5EUyAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VORElOSVRFUDYgICAgICAgICAgICAgICAxCisKK3N0YXRpYyBpbnQgc2VuZF9kdXhfY29tbWFuZHModXNiZHV4ZmFzdHN1Yl90ICogdGhpc191c2JkdXhmYXN0c3ViLCBpbnQgY21kX3R5cGUpCit7CisJaW50IHJlc3VsdCwgbnNlbnQ7CisJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbMF0gPSBjbWRfdHlwZTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJaW50IGk7CisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZHV4X2NvbW1hbmRzOiAiLAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IpOworCWZvciAoaSA9IDA7IGkgPCBTSVpFT0ZEVVhCVUZGRVI7IGkrKykgeworCQlwcmludGsoIiAlMDJ4IiwgdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2codGhpc191c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJCSAgICAgIENIQU5ORUxMSVNURVApLAorCQkJICAgICAgdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHMsIFNJWkVPRkRVWEJVRkZFUiwKKwkJCSAgICAgICZuc2VudCwgMTAwMDApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGNvdWxkIG5vdCB0cmFuc21pdCBkdXhfY29tbWFuZHMgdG8gdGhlIHVzYi1kZXZpY2UsIGVycj0lZFxuIiwgdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvLyBTdG9wcyB0aGUgZGF0YSBhY3F1aXNpb24KKy8vIEl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBjb250ZXh0CitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfdW5saW5rX0luVVJCcyh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViX3RtcCkKK3sKKwlpbnQgaiA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAgJiYgdXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKSB7CisJCXVzYmR1eGZhc3RzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDgpCisJCWogPSB1c2JfdW5saW5rX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQlpZiAoaiA8IDApIHsKKwkJCWVyciA9IGo7CisJCX0KKyNlbHNlCisJCS8vIHdhaXRzIHVudGlsIGEgcnVubmluZyB0cmFuc2ZlciBpcyBvdmVyCisJCXVzYl9raWxsX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQlqID0gMDsKKyNlbmRpZgorCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3Q6IHVubGlua2VkIEluVVJCOiByZXM9JWRcbiIsIGopOworI2VuZGlmCisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyB3aWxsIHN0b3AgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbiAqLworLy8gSXMgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgZHJpdmVyIGZyb20gYm90aCB0aGUKKy8vIGludGVycnVwdCBjb250ZXh0IGFuZCBmcm9tIGNvbWVkaQorc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX3N0b3AodXNiZHV4ZmFzdHN1Yl90ICogdGhpc191c2JkdXhmYXN0c3ViLAorCWludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlwcmludGsoImNvbWVkaT86IHVzYmR1eGZhc3RfYWlfc3RvcDogdGhpc191c2JkdXhmYXN0c3ViPU5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaTogdXNiZHV4ZmFzdF9haV9zdG9wXG4iKTsKKyNlbmRpZgorCisJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlpZiAoZG9fdW5saW5rKSB7CisJCS8vIHN0b3AgYXF1aXN0aW9uCisJCXJldCA9IHVzYmR1eGZhc3RzdWJfdW5saW5rX0luVVJCcyh0aGlzX3VzYmR1eGZhc3RzdWIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8vIFRoaXMgd2lsbCBjYW5jZWwgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbi4KKy8vIFRoaXMgaXMgY2FsbGVkIGJ5IGNvbWVkaSBidXQgbmV2ZXIgZnJvbSBpbnNpZGUgdGhlCisvLyBkcml2ZXIuCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViOworCWludCByZXMgPSAwOworCisJLy8gZm9yY2UgdW5saW5rIG9mIGFsbCB1cmJzCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpOiB1c2JkdXhmYXN0X2FpX2NhbmNlbFxuIik7CisjZW5kaWYKKwl0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3RfYWlfY2FuY2VsOiB0aGlzX3VzYmR1eGZhc3RzdWI9TlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkb3duKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvLyB1bmxpbmsKKwlyZXMgPSB1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAxKTsKKwl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCisJcmV0dXJuIHJlczsKK30KKworLy8gYW5hbG9ndWUgSU4KKy8vIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfYWlfSXJxKHN0cnVjdCB1cmIgKnVyYikKKyNlbHNlCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2FpX0lycShzdHJ1Y3QgdXJiICp1cmIgUFRfUkVHU19BUkcpCisjZW5kaWYKK3sKKwlpbnQgbiwgZXJyOworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViOworCWNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdWludDE2X3QgKnA7CisKKwkvLyBzYW5pdHkgY2hlY2tzCisJLy8gaXMgdGhlIHVyYiB0aGVyZT8KKwlpZiAoIXVyYikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBhbyBpbnQtaGFuZGxlciBjYWxsZWQgd2l0aCB1cmI9TlVMTCFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJaWYgKCF0aGlzX2NvbWVkaWRldikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiB1cmIgY29udGV4dCBpcyBhIE5VTEwgcG9pbnRlciFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHVzYmR1eGZhc3RzdWJfdAorCXRoaXNfdXNiZHV4ZmFzdHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IHByaXZhdGUgb2YgY29tZWRpIHN1YmRldiBpcyBhIE5VTEwgcG9pbnRlciFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIGFyZSB3ZSBydW5uaW5nIGEgY29tbWFuZD8KKwlpZiAodW5saWtlbHkoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSkpIHsKKwkJLy8gbm90IHJ1bm5pbmcgYSBjb21tYW5kCisJCS8vIGRvIG5vdCBjb250aW51ZSBleGVjdXRpb24gaWYgbm8gYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZworCQkvLyBpbiBwYXJ0aWN1bGFyIG5vdCByZXN1Ym1pdAorCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KCEodGhpc191c2JkdXhmYXN0c3ViLT5hdHRhY2hlZCkpKSB7CisJCS8vIG5vIGNvbWVkaSBkZXZpY2UgdGhlcmUKKwkJcmV0dXJuOworCX0KKwkvLyBzdWJkZXZpY2Ugd2hpY2ggaXMgdGhlIEFEIGNvbnZlcnRlcgorCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKworCS8vIGZpcnN0IHdlIHRlc3QgaWYgc29tZXRoaW5nIHVudXN1YWwgaGFzIGp1c3QgaGFwcGVuZWQKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKworCQkvLyBoYXBwZW5zIGFmdGVyIGFuIHVubGluayBjb21tYW5kIG9yIHdoZW4gdGhlIGRldmljZSBpcyBwbHVnZ2VkIG91dAorCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8vIHRlbGwgdGhpcyBjb21lZGkKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJLy8gc3RvcCB0aGUgdHJhbnNmZXIgdy9vIHVubGluaworCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogbm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiBhaSBpbnRyIGNvbnRleHQ6ICVkXG4iLCB0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIHVyYi0+c3RhdHVzKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMCk7CisJCXJldHVybjsKKwl9CisKKwlwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWItPmlnbm9yZSkgeworCQlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NvbnRpbm91cykpIHsKKwkJCS8vIG5vdCBjb250aW5vdXMsIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzCisJCQluID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQxNl90KTsKKwkJCWlmICh1bmxpa2VseSh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCA8IG4pKSB7CisJCQkJLy8gd2UgaGF2ZSBzZW5kIG9ubHkgYSBmcmFjdGlvbiBvZiB0aGUgYnl0ZXMgcmVjZWl2ZWQKKwkJCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsCisJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCAqCisJCQkJCXNpemVvZih1aW50MTZfdCkpOworCQkJCXVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDApOworCQkJCS8vIHNheSBjb21lZGkgdGhhdCB0aGUgYWNxdWlzdGlvbiBpcyBvdmVyCisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgLT0gbjsKKwkJfQorCQkvLyB3cml0ZSB0aGUgZnVsbCBidWZmZXIgdG8gY29tZWRpCisJCWNmY193cml0ZV9hcnJheV90b19idWZmZXIocywKKwkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJCS8vIHRlbGwgY29tZWRpIHRoYXQgZGF0YSBpcyB0aGVyZQorCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCisJfSBlbHNlIHsKKwkJLy8gaWdub3JlIHRoaXMgcGFja2V0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+aWdub3JlLS07CisJfQorCisJLy8gY29tbWFuZCBpcyBzdGlsbCBydW5uaW5nCisJLy8gcmVzdWJtaXQgdXJiIGZvciBCVUxLIHRyYW5zZmVyCisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eGZhc3RzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiB1cmIgcmVzdWJtIGZhaWxlZDogJWQiLAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBlcnIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl9zdGFydCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisKKwlpZiAodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSB7CisJCS8vIDdmOTIgdG8gemVybworCQlsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0gPSAwOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCS8vIGNyZWF0ZSBhIHBpcGUgZm9yIGEgY29udHJvbCB0cmFuc2ZlcgorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBiUmVxdWVzdCwgIkZpcm13YXJlIgorCQkJVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSwKKwkJCS8vIGJtUmVxdWVzdFR5cGUKKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLy8gVmFsdWUKKwkJCVVTQkRVWEZBU1RTVUJfQ1BVQ1MsCisJCQkvLyBJbmRleAorCQkJMHgwMDAwLAorCQkJLy8gYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYnVmZmVyCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBMZW5ndGgKKwkJCTEsCisJCQkvLyBUaW1lb3V0CisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfc3RvcCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKworCXVuc2lnbmVkIGNoYXIgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKwlpZiAodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSB7CisJCS8vIDdmOTIgdG8gb25lCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDE7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBiUmVxdWVzdCwgIkZpcm13YXJlIgorCQkJVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSwKKwkJCS8vIGJtUmVxdWVzdFR5cGUKKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLy8gVmFsdWUKKwkJCVVTQkRVWEZBU1RTVUJfQ1BVQ1MsCisJCQkvLyBJbmRleAorCQkJMHgwMDAwLCBsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBMZW5ndGgKKwkJCTEsCisJCQkvLyBUaW1lb3V0CisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY29udHJvbCBtc2cgZmFpbGVkIChzdG9wKVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3VwbG9hZCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViLAorCXVuc2lnbmVkIGNoYXIgKmxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwl1bnNpZ25lZCBpbnQgc3RhcnRBZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBlcnJjb2RlOworCisJaWYgKHVzYmR1eGZhc3RzdWItPnByb2JlZCkgeworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogdXBsb2FkaW5nICVkIGJ5dGVzIiwKKwkJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIGxlbik7CisJCXByaW50aygiIHRvIGFkZHIgJWQsIGZpcnN0IGJ5dGU9JWQuXG4iLAorCQkJc3RhcnRBZGRyLCBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0pOworI2VuZGlmCisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBicmVxdWVzdCwgZmlybXdhcmUKKwkJCVVTQkRVWEZBU1RTVUJfRklSTVdBUkUsCisJCQkvLyBibVJlcXVlc3RUeXBlCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8vIHZhbHVlCisJCQlzdGFydEFkZHIsCisJCQkvLyBpbmRleAorCQkJMHgwMDAwLAorCQkJLy8gb3VyIGxvY2FsIHNhZmUgYnVmZmVyCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBsZW5ndGgKKwkJCWxlbiwKKwkJCS8vIHRpbWVvdXQKKwkJCUVaVElNRU9VVCk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHJlc3VsdD0lZFxuIiwgZXJyY29kZSk7CisjZW5kaWYKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVwcGxvYWQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbm8gZGV2aWNlIG9uIHRoZSBidXMgZm9yIHRoaXMgaW5kZXgKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmlybXdhcmVVcGxvYWQodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YiwKKwl1bnNpZ25lZCBjaGFyICpmaXJtd2FyZUJpbmFyeSwgaW50IHNpemVGaXJtd2FyZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFmaXJtd2FyZUJpbmFyeSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdG9wKHVzYmR1eGZhc3RzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY2FuIG5vdCBzdG9wIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl91cGxvYWQodXNiZHV4ZmFzdHN1YiwKKwkJZmlybXdhcmVCaW5hcnksIDAsIHNpemVGaXJtd2FyZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdGFydCh1c2JkdXhmYXN0c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGNhbiBub3Qgc3RhcnQgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmR1eGZhc3RzdWJfc3VibWl0X0luVVJCcyh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhmYXN0c3ViKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl1c2JfZmlsbF9idWxrX3VyYih1c2JkdXhmYXN0c3ViLT51cmJJbiwKKwkJdXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQl1c2JfcmN2YnVsa3BpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LCBCVUxLSU5FUCksCisJCXVzYmR1eGZhc3RzdWItPnRyYW5zZmVyX2J1ZmZlciwKKwkJU0laRUlOQlVGLCB1c2JkdXhmYXN0c3ViX2FpX0lycSwgdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2KTsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzdWJtaXR0aW5nIGluLXVyYjogJXgsJXhcbiIsCisJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5jb250ZXh0KSwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmRldikpOworI2VuZGlmCisJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eGZhc3RzdWItPnVyYkluLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyRmxhZykgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGFpOiB1c2Jfc3VibWl0X3VyYiBlcnJvciAlZFxuIiwKKwkJCWVyckZsYWcpOworCQlyZXR1cm4gZXJyRmxhZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJaW50IGVyciA9IDAsIHN0b3BfbWFzayA9IDA7CisJbG9uZyBpbnQgc3RlcHMsIHRtcCA9IDA7CisJaW50IG1pblNhbXBsUGVyOworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfY21kdGVzdFxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogY29udmVydF9hcmc9JXUgc2Nhbl9iZWdpbl9hcmc9JXVcbiIsCisJCWRldi0+bWlub3IsIGNtZC0+Y29udmVydF9hcmcsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworI2VuZGlmCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19FWFQgfCBUUklHX0lOVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwlzdG9wX21hc2sgPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWNtZC0+c3RvcF9zcmMgJj0gc3RvcF9tYXNrOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cgJiYKKwkJY21kLT5zdGFydF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQpCisJCWVycisrOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQorCQllcnIrKzsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYKKwkJY21kLT5zdG9wX3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwkvLyBjYW4ndCBoYXZlIGV4dGVybmFsIHN0b3AgYW5kIHN0YXJ0IHRyaWdnZXJzIGF0IG9uY2UKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zdG9wX3NyYyA9PSBUUklHX0VYVCkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJiBjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikgeworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA9PSAxKSB7CisJCW1pblNhbXBsUGVyID0gMTsKKwl9IGVsc2UgeworCQltaW5TYW1wbFBlciA9IE1JTl9TQU1QTElOR19QRVJJT0Q7CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlzdGVwcyA9IGNtZC0+Y29udmVydF9hcmcgKiAzMDsKKwkJaWYgKHN0ZXBzIDwgKG1pblNhbXBsUGVyICogMTAwMCkpIHsKKwkJCXN0ZXBzID0gbWluU2FtcGxQZXIgKiAxMDAwOworCQl9CisJCWlmIChzdGVwcyA+IChNQVhfU0FNUExJTkdfUEVSSU9EICogMTAwMCkpIHsKKwkJCXN0ZXBzID0gTUFYX1NBTVBMSU5HX1BFUklPRCAqIDEwMDA7CisJCX0KKwkJLy8gY2FsYyBhcmcgYWdhaW4KKwkJdG1wID0gc3RlcHMgLyAzMDsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgIT0gdG1wKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gdG1wOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVycisrOworCX0KKwkvLyBzdG9wIHNvdXJjZQorCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoKKwkJaWYgKCFjbWQtPnN0b3BfYXJnKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJJR19OT05FOgorCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJCWJyZWFrOworCQkvLyBUUklHX0VYVCBkb2Vzbid0IGNhcmUgc2luY2UgaXQgZG9lc24ndCB0cmlnZ2VyIG9mZiBhIG51bWJlcmVkIGNoYW5uZWwKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRvd24oJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2ludHRyaWdcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisKKwlpZiAodHJpZ251bSAhPSAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfaW50dHJpZzogaW52YWxpZCB0cmlnbnVtXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSkgeworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4ZmFzdHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2ludHRyaWc6IHVyYlN1Ym1pdDogZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfaW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmdcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworLy8gb2Zmc2V0cyBmb3IgdGhlIEdQSUYgYnl0ZXMKKy8vIHRoZSBmaXJzdCBieXRlIGlzIHRoZSBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgTEVOQkFTRSAxKzB4MDAKKyNkZWZpbmUgT1BCQVNFICAxKzB4MDgKKyNkZWZpbmUgT1VUQkFTRSAxKzB4MTAKKyNkZWZpbmUgTE9HQkFTRSAxKzB4MTgKKworc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbiwgZ2Fpbiwgcm5nbWFzayA9IDB4ZmY7CisJaW50IGksIGosIHJldDsKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0OworCWxvbmcgc3RlcHMsIHN0ZXBzX3RtcDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2NtZFxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZG93bigmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfY21kIG5vdCBwb3NzaWJsZS4gQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvLyBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisKKwkvLyBpZ25vcmUgdGhlIGZpcnN0IGJ1ZmZlcnMgZnJvbSB0aGUgZGV2aWNlIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNvbmRpdGlvbgorCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+aWdub3JlID0gUEFDS0VUU19UT19JR05PUkU7CisKKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAwKSB7CisJCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKTsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQkJaWYgKGNoYW4gIT0gaSkgeworCQkJCXByaW50aygiY29tZWRpJWQ6IGNtZCBpcyBhY2NlcHRpbmcgb25seSBjb25zZWN1dGl2ZSBjaGFubmVscy5cbiIsIGRldi0+bWlub3IpOworCQkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoKGdhaW4gIT0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkpCisJCQkJJiYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMykpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiB0aGUgZ2FpbiBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgY2hhbm5lbHMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXN0ZXBzID0gMDsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHNjYW5fYmVnaW5fc3JjPT1UUklHX1RJTUVSIG5vdCB2YWxpZC5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlzdGVwcyA9IChjbWQtPmNvbnZlcnRfYXJnICogMzApIC8gMTAwMDsKKwl9CisJaWYgKChzdGVwcyA8IE1JTl9TQU1QTElOR19QRVJJT0QpICYmIChjbWQtPmNoYW5saXN0X2xlbiAhPSAxKSkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBhaV9jbWQ6IHN0ZXBzPSVsZCwgc2Nhbl9iZWdpbl9hcmc9JWQuIE5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsIGRldi0+bWlub3IsIHN0ZXBzLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzdGVwcyA+IE1BWF9TQU1QTElOR19QRVJJT0QpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogYWlfY21kOiBzYW1wbGluZyByYXRlIHRvbyBsb3cuXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSAmJiAoY21kLT5jaGFubGlzdF9sZW4gIT0gMSkKKwkJJiYgKGNtZC0+Y2hhbmxpc3RfbGVuICE9IDE2KSkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBhaV9jbWQ6IFRSSUdfRVhUIG9ubHkgd2l0aCAxIG9yIDE2IGNoYW5uZWxzIHBvc3NpYmxlLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogc3RlcHM9JWxkLCBjb252ZXJ0X2FyZz0ldSwgYWlfdGltZXI9JXVcbiIsCisJCWRldi0+bWlub3IsCisJCXN0ZXBzLCBjbWQtPmNvbnZlcnRfYXJnLCB0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3RpbWVyKTsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQtPmNoYW5saXN0X2xlbikgeworCQkvLyBvbmUgY2hhbm5lbAorCWNhc2UgMToKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisKKwkJLy8gZm9yIGV4dGVybmFsIHRyaWdnZXI6IGxvb3BpbmcgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgUkRZMCBwaW4KKwkJLy8gYmVjb21lcyB6ZXJvCisJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewkvLyB3ZSBsb29wIGhlcmUgdW50aWwgcmVhZHkgaGFzIGJlZW4gc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAweDAxOwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAwCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDB4MDA7CS8vIFJEWTAgPSAwCisJCX0gZWxzZSB7CS8vIHdlIGp1c3QgcHJvY2VlZCB0byBzdGF0ZSAxCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAxOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisJCX0KKworCQlpZiAoc3RlcHMgPCBNSU5fU0FNUExJTkdfUEVSSU9EKSB7CisJCQkvLyBmb3IgZmFzdCBzaW5nbGUgY2hhbm5lbCBhcXUgd2l0aG91dCBtdXgKKwkJCWlmIChzdGVwcyA8PSAxKSB7CisJCQkJLy8gd2UganVzdCBzdGF5IGhlcmUgYXQgc3RhdGUgMSBhbmQgcmV4ZWN1dGUgdGhlIHNhbWUgc3RhdGUKKwkJCQkvLyB0aGlzIGdpdmVzIHVzIDMwTUh6IHNhbXBsaW5nIHJhdGUKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSAweDg5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAweDAzOwkvLyBkZWNlaXNpb24gc3RhdGUgd2l0aCBkYXRhCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0KKwkJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJCX0gZWxzZSB7CisJCQkJLy8gd2UgbG9vcCB0aHJvdWdoIHR3byBzdGF0ZXM6IGRhdGEgYW5kIGRlbGF5OiBtYXggcmF0ZSBpcyAxNU1oegorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9CisJCQkJCXN0ZXBzIC0gMTsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDB4MDI7CS8vIGRhdGEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPQorCQkJCQkweEZGICYgcm5nbWFzazsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOwkvLyBkb2Vzbid0IG1hdHRlcgorCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0gMHgwOTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0KKwkJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHdlIGxvb3AgdGhyb3VnaCAzIHN0YXRlczogMnggZGVsYXkgYW5kIDF4IGRhdGEuIFRoaXMgZ2l2ZXMgYSBtaW4KKwkJCS8vIHNhbXBsaW5nIHJhdGUgb2YgNjBrSHouCisKKwkJCS8vIHdlIGhhdmUgMSBzdGF0ZSB3aXRoIGR1cmF0aW9uIDEKKwkJCXN0ZXBzID0gc3RlcHMgLSAxOworCisJCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9CisJCQkJc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9CisJCQkJc3RlcHMgLSBzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQkJLy8gZ2V0IHRoZSBkYXRhIGFuZCBicmFuY2ggYmFjaworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0gMHgwOTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAweDAzOwkvLyBkZWNlaXNpb24gc3RhdGUgdyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjoKKwkJLy8gdHdvIGNoYW5uZWxzCisJCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAxIHN0YXRlIHdpdGggZHVyYXRpb24gMTogc3RhdGUgMAorCQlzdGVwc190bXAgPSBzdGVwcyAtIDE7CisKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMV0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9IDB4RkUgJiBybmdtYXNrOwkvL2NvdW50CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJLy8gYW5kIHRoZSBzZWNvbmQgcGFydAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPQorCQkJc3RlcHNfdG1wIC0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgM10gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAzXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDNdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAzXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIGR1cmF0aW9uIDE6IHN0ZXAgNiBhbmQgdGhlIElETEUgc3RhdGUKKwkJc3RlcHNfdG1wID0gc3RlcHMgLSAyOworCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDRdID0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNF0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy9yZXNldAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAwOworCisJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0KKwkJCXN0ZXBzX3RtcCAtIHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDVdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA1XSA9IDA7CisKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDZdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNl0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDZdID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCS8vIHRocmVlIGNoYW5uZWxzCisJCWZvciAoaiA9IDA7IGogPCAxOyBqKyspIHsKKwkJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0W2pdKSA+IDApCisJCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQkJZWxzZQorCQkJCXJuZ21hc2sgPSAweGZmOworCQkJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8gYW5kIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIGogKiAyXSA9CisJCQkJc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgaiAqIDJdID0gMHgwMjsJLy8gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIGogKiAyXSA9IDB4RkYgJiBybmdtYXNrOwkvLyBubyBjaGFuZ2UKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyBqICogMl0gPSAwOworCisJCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtqICsgMV0pID4gMCkKKwkJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCQllbHNlCisJCQkJcm5nbWFzayA9IDB4ZmY7CisJCQkvLyBkbyB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGRlbGF5CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgaiAqIDIgKyAxXSA9CisJCQkJc3RlcHMgLSBzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyBqICogMiArIDFdID0gMDsJLy8gbm8gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIGogKiAyICsgMV0gPSAweEZFICYgcm5nbWFzazsJLy9jb3VudAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIGogKiAyICsgMV0gPQorCQkJCTA7CisJCX0KKworCQkvLyAyIHN0ZXBzIHdpdGggZHVyYXRpb24gMTogdGhlIGlkZWxlIHN0ZXAgYW5kIHN0ZXAgNjoKKwkJc3RlcHNfdG1wID0gc3RlcHMgLSAyOworCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTyBhbmQgZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA0XSA9IHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMHgwMjsJLy8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAweEZGICYgcm5nbWFzazsJLy8gbm8gY2hhbmdlCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA0XSA9IDA7CisKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCS8vIGRvIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0KKwkJCXN0ZXBzX3RtcCAtIHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsJLy8gbm8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNV0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy8gcmVzZXQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDVdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNl0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA2XSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA2XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNl0gPSAwOworCisJY2FzZSAxNjoKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewkvLyB3ZSBsb29wIGhlcmUgdW50aWwgcmVhZHkgaGFzIGJlZW4gc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAweDAxOwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAwCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gKDB4RkYgLSAweDAyKSAmIHJuZ21hc2s7CS8vIHJlc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAweDAwOwkvLyBSRFkwID0gMAorCQl9IGVsc2UgewkvLyB3ZSBqdXN0IHByb2NlZWQgdG8gc3RhdGUgMQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMjU1OwkvLyAzMHVzIHJlc2V0IHB1bHNlCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy8gcmVzZXQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisJCX0KKworCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIGR1cmF0aW9uIDEKKwkJc3RlcHMgPSBzdGVwcyAtIDI7CisKKwkJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9IHN0ZXBzIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPSAweEZFICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQkvLyBhbmQgdGhlIHNlY29uZCBwYXJ0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAzXSA9CisJCQlzdGVwcyAtIHN0ZXBzIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSAweDA5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAweEZGOwkvLyBkb2Vzbid0IG1hdHRlcgorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJjb21lZGkgJWQ6IHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGNoYW5uZWxzXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwkvLyAwIG1lYW5zIHRoYXQgdGhlIEFEIGNvbW1hbmRzIGFyZSBzZW50CisJcmVzdWx0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhmYXN0c3ViLCBTRU5EQURDT01NQU5EUyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWRjIGNvbW1hbmQgY291bGQgbm90IGJlIHN1Ym1pdHRlZC4gQWJvcnRpbmcuLi5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0KKwkJCShjbWQtPnN0b3BfYXJnKSAqIChjbWQtPnNjYW5fZW5kX2FyZyk7CisJCWlmICh1c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgPCAxKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiAoY21kLT5zdG9wX2FyZykqKGNtZC0+c2Nhbl9lbmRfYXJnKTwxLCBhYm9ydGluZy5cbiIsIGRldi0+bWlub3IpOworCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY29udGlub3VzID0gMDsKKwl9IGVsc2UgeworCQkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NvbnRpbm91cyA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB8fCAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpKSB7CisJCS8vIGVuYWJsZSB0aGlzIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4ZmFzdHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCS8vIGZpeG1lOiB1bmxpbmsgaGVyZT8/CisJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLy8gZG9uJ3QgZW5hYmxlIHRoZSBhY3F1aXNpb24gb3BlcmF0aW9uCisJCS8vIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbAorCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eGZhc3RfYWlfaW50dHJpZzsKKwl9CisJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBNb2RlIDAgaXMgdXNlZCB0byBnZXQgYSBzaW5nbGUgY29udmVyc2lvbiBvbiBkZW1hbmQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGksIGosIG4sIGFjdHVhbF9sZW5ndGg7CisJaW50IGNoYW4sIHJhbmdlLCBybmdtYXNrOworCWludCBlcnI7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF1c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZDogbm8gdXNiIGRldi5cbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZCwgaW5zbi0+bj0lZCwgaW5zbi0+c3ViZGV2PSVkXG4iLAorCQlkZXYtPm1pbm9yLCBpbnNuLT5uLCBpbnNuLT5zdWJkZXYpOworI2VuZGlmCisJZG93bigmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh1c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZCBub3QgcG9zc2libGUuIEFzeW5jIENvbW1hbmQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLy8gc2FtcGxlIG9uZSBjaGFubmVsCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCS8vIHNldCBjb21tYW5kIGZvciB0aGUgZmlyc3QgY2hhbm5lbAorCisJaWYgKHJhbmdlID4gMCkKKwkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCWVsc2UKKwkJcm5nbWFzayA9IDB4ZmY7CisJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8KKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAweDAyOwkvLyBkYXRhCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9IDB4RkYgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCisJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9IDEyOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOworCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0gMHhGRSAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPSAweEZFICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMDsKKworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA0XSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAwOworCisJLy8gc2Vjb25kIHBhcnQKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0gMTI7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDVdID0gMHhGRiAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA1XSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDZdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNl0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNl0gPSAweEZGICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwkvLyAwIG1lYW5zIHRoYXQgdGhlIEFEIGNvbW1hbmRzIGFyZSBzZW50CisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModXNiZHV4ZmFzdHN1YiwgU0VOREFEQ09NTUFORFMpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFkYyBjb21tYW5kIGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuIEFib3J0aW5nLi4uXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzdWJtaXR0aW5nIGluLXVyYjogJXgsJXhcbiIsCisJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5jb250ZXh0KSwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmRldikpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IFBBQ0tFVFNfVE9fSUdOT1JFOyBpKyspIHsKKwkJZXJyID0gdXNiX2J1bGtfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkgICB1c2JfcmN2YnVsa3BpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCQkJICAgQlVMS0lORVApLAorCQkJCSAgIHVzYmR1eGZhc3RzdWItPnRyYW5zZmVyX2J1ZmZlciwgU0laRUlOQlVGLAorCQkJCSAgICZhY3R1YWxfbGVuZ3RoLCAxMDAwMCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiBpbnNuIHRpbWVvdXQuIE5vIGRhdGEuXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCS8vIGRhdGEgcG9pbnRzCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47KSB7CisJCWVyciA9IHVzYl9idWxrX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJICAgdXNiX3JjdmJ1bGtwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkJCSAgIEJVTEtJTkVQKSwKKwkJCQkgICB1c2JkdXhmYXN0c3ViLT50cmFuc2Zlcl9idWZmZXIsIFNJWkVJTkJVRiwKKwkJCQkgICAmYWN0dWFsX2xlbmd0aCwgMTAwMDApOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGklZDogaW5zbiBkYXRhIGVycm9yOiAlZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBlcnIpOworCQkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCW4gPSBhY3R1YWxfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQxNl90KTsKKwkJaWYgKChuICUgMTYpICE9IDApIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IGluc24gZGF0YSBwYWNrZXQgY29ycnVwdGVkLlxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZm9yIChqID0gY2hhbjsgKGogPCBuKSAmJiAoaSA8IGluc24tPm4pOyBqID0gaiArIDE2KSB7CisJCQlkYXRhW2ldID0KKwkJCQkoKHVpbnQxNl90ICopICh1c2JkdXhmYXN0c3ViLT4KKwkJCQkJdHJhbnNmZXJfYnVmZmVyKSlbal07CisJCQlpKys7CisJCX0KKwl9CisJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBoZXgydW5zaWduZWQoY2hhciAqaCkKK3sKKwl1bnNpZ25lZCBoaSwgbG87CisJaWYgKGhbMF0gPiAnOScpIHsKKwkJaGkgPSBoWzBdIC0gJ0EnICsgMHgwYTsKKwl9IGVsc2UgeworCQloaSA9IGhbMF0gLSAnMCc7CisJfQorCWlmIChoWzFdID4gJzknKSB7CisJCWxvID0gaFsxXSAtICdBJyArIDB4MGE7CisJfSBlbHNlIHsKKwkJbG8gPSBoWzFdIC0gJzAnOworCX0KKwlyZXR1cm4gaGkgKiAweDEwICsgbG87Cit9CisKKy8vIGZvciBGWDIKKyNkZWZpbmUgRklSTVdBUkVfTUFYX0xFTiAweDIwMDAKKworLy8gdGFrZW4gZnJvbSBEYXZpZCBCcm93bmVsbCdzIGZ4bG9hZCBhbmQgYWRqdXN0ZWQgZm9yIHRoaXMgZHJpdmVyCitzdGF0aWMgaW50IHJlYWRfZmlybXdhcmUodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1Yiwgdm9pZCAqZmlybXdhcmVQdHIsCisJbG9uZyBzaXplKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyICpmcCA9IChjaGFyICopZmlybXdhcmVQdHI7CisJdW5zaWduZWQgY2hhciAqZmlybXdhcmVCaW5hcnkgPSBOVUxMOworCWludCByZXMgPSAwOworCWludCBtYXhBZGRyID0gMDsKKworCWZpcm13YXJlQmluYXJ5ID0ga21hbGxvYyhGSVJNV0FSRV9NQVhfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpcm13YXJlQmluYXJ5KSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogbWVtIGFsbG9jIGZvciBmaXJtd2FyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWNoYXIgYnVmWzI1Nl0sICpjcDsKKwkJY2hhciB0eXBlOworCQlpbnQgbGVuOworCQlpbnQgaWR4LCBvZmY7CisJCWludCBqID0gMDsKKworCQkvLyBnZXQgb25lIGxpbmUKKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKGZwW2ldICE9IDEzKSAmJiAoZnBbaV0gIT0gMTApKSB7CisJCQlidWZbal0gPSBmcFtpXTsKKwkJCWkrKzsKKwkJCWorKzsKKwkJCWlmIChqID49IHNpemVvZihidWYpKSB7CisJCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBib2d1cyBmaXJtd2FyZSBmaWxlIVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCS8vIGdldCByaWQgb2YgTEYvQ1IvLi4uCisJCXdoaWxlICgoaSA8IHNpemUpICYmICgoZnBbaV0gPT0gMTMpIHx8IChmcFtpXSA9PSAxMCkKKwkJCQl8fCAoZnBbaV0gPT0gMCkpKSB7CisJCQlpKys7CisJCX0KKworCQlidWZbal0gPSAwOworCQkvL3ByaW50aygiY29tZWRpXzogYnVmPSVzXG4iLGJ1Zik7CisKKwkJLyogRVhURU5TSU9OOiAiIyBjb21tZW50LXRpbGwtZW5kLW9mLWxpbmUiLCBmb3IgY29weXJpZ2h0cyBldGMgKi8KKwkJaWYgKGJ1ZlswXSA9PSAnIycpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVmWzBdICE9ICc6JykgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1cGxvYWQ6IG5vdCBhbiBpaGV4IHJlY29yZDogJXMiLCBidWYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBSZWFkIHRoZSBsZW5ndGggZmllbGQgKHVwIHRvIDE2IGJ5dGVzKSAqLworCQlsZW4gPSBoZXgydW5zaWduZWQoYnVmICsgMSk7CisKKwkJLyogUmVhZCB0aGUgdGFyZ2V0IG9mZnNldCAqLworCQlvZmYgPSAoaGV4MnVuc2lnbmVkKGJ1ZiArIDMpICogMHgwMTAwKSArIGhleDJ1bnNpZ25lZChidWYgKyA1KTsKKworCQlpZiAoKG9mZiArIGxlbikgPiBtYXhBZGRyKSB7CisJCQltYXhBZGRyID0gb2ZmICsgbGVuOworCQl9CisKKwkJaWYgKG1heEFkZHIgPj0gRklSTVdBUkVfTUFYX0xFTikgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBmaXJtd2FyZSB1cGxvYWQgZ29lcyBiZXlvbmQgRlgyIFJBTSBib3VuZGFyaWVzLiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLy9wcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IG9mZj0leCwgbGVuPSV4OiIsb2ZmLGxlbik7CisKKwkJLyogUmVhZCB0aGUgcmVjb3JkIHR5cGUgKi8KKwkJdHlwZSA9IGhleDJ1bnNpZ25lZChidWYgKyA3KTsKKworCQkvKiBJZiB0aGlzIGlzIGFuIEVPRiByZWNvcmQsIHRoZW4gbWFrZSBpdCBzby4gKi8KKwkJaWYgKHR5cGUgPT0gMSkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHlwZSAhPSAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVuc3VwcG9ydGVkIHJlY29yZCB0eXBlOiAldVxuIiwgdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaWR4ID0gMCwgY3AgPSBidWYgKyA5OyBpZHggPCBsZW47IGlkeCArPSAxLCBjcCArPSAyKSB7CisJCQlmaXJtd2FyZUJpbmFyeVtpZHggKyBvZmZdID0gaGV4MnVuc2lnbmVkKGNwKTsKKwkJCS8vcHJpbnRrKCIlMDJ4ICIsZmlybXdhcmVCaW5hcnlbaWR4K29mZl0pOworCQl9CisJCS8vcHJpbnRrKCJcbiIpOworCisJCWlmIChpID49IHNpemUpIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdW5leHBlY3RlZCBlbmQgb2YgaGV4IGZpbGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXMgPSBmaXJtd2FyZVVwbG9hZCh1c2JkdXhmYXN0c3ViLCBmaXJtd2FyZUJpbmFyeSwgbWF4QWRkciArIDEpOworCWtmcmVlKGZpcm13YXJlQmluYXJ5KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB0aWR5X3VwKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWJfdG1wKQoreworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHRpZGluZyB1cFxuIik7CisjZW5kaWYKKwlpZiAoIXVzYmR1eGZhc3RzdWJfdG1wKSB7CisJCXJldHVybjsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCS8vIHNob3dzIHRoZSB1c2Igc3Vic3lzdGVtIHRoYXQgdGhlIGRyaXZlciBpcyBkb3duCisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT5pbnRlcmZhY2UpIHsKKwkJdXNiX3NldF9pbnRmZGF0YSh1c2JkdXhmYXN0c3ViX3RtcC0+aW50ZXJmYWNlLCBOVUxMKTsKKwl9CisjZW5kaWYKKworCXVzYmR1eGZhc3RzdWJfdG1wLT5wcm9iZWQgPSAwOworCisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbikgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsOCkKKwkJLy8gd2FpdHMgdW50aWwgYSBydW5uaW5nIHRyYW5zZmVyIGlzIG92ZXIKKwkJLy8gdGh1cywgdW5kZXIgMi40IGhvdHBsdWdnaW5nIHdoaWxlIGEgY29tbWFuZAorCQkvLyBpcyBydW5uaW5nIGlzIG5vdCBzYWZlCisJCXVzYl9raWxsX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworI2VuZGlmCisJCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQlrZnJlZSh1c2JkdXhmYXN0c3ViX3RtcC0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYmR1eGZhc3RzdWJfdG1wLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQl9CisJCXVzYl9mcmVlX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4gPSBOVUxMOworCX0KKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPmluc25CdWZmZXIpIHsKKwkJa2ZyZWUodXNiZHV4ZmFzdHN1Yl90bXAtPmluc25CdWZmZXIpOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+aW5zbkJ1ZmZlciA9IE5VTEw7CisJfQorCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+ZHV4X2NvbW1hbmRzKSB7CisJCWtmcmVlKHVzYmR1eGZhc3RzdWJfdG1wLT5kdXhfY29tbWFuZHMpOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+ZHV4X2NvbW1hbmRzID0gTlVMTDsKKwl9CisJdXNiZHV4ZmFzdHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKK30KKworLy8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdXJicyBhbmQgaW5pdGlhbGlzZSB0aGVtCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCAqdXNiZHV4ZmFzdHN1Yl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwl1bnNpZ25lZCBpbnQgaW50ZXJmbnVtLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisjZWxzZQorc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aW50ZXJmLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYodWludGVyZik7CisjZW5kaWYKKwlpbnQgaTsKKwlpbnQgaW5kZXg7CisKKwlpZiAodWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogVGhpcyBkcml2ZXIgbmVlZHMgVVNCIDIuMCB0byBvcGVyYXRlLiBBYm9ydGluZy4uLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogZmluZGluZyBhIGZyZWUgc3RydWN0dXJlIGZvciB0aGUgdXNiLWRldmljZVxuIik7CisjZW5kaWYKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gbG9vayBmb3IgYSBmcmVlIHBsYWNlIGluIHRoZSB1c2JkdXhmYXN0IGFycmF5CisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYRkFTVDsgaSsrKSB7CisJCWlmICghKHVzYmR1eGZhc3RzdWJbaV0ucHJvYmVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBubyBtb3JlIHNwYWNlCisJaWYgKGluZGV4ID09IC0xKSB7CisJCXByaW50aygiVG9vIG1hbnkgdXNiZHV4ZmFzdC1kZXZpY2VzIGNvbm5lY3RlZC5cbiIpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVNRklMRTsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdXNiZHV4ZmFzdHN1YlslZF0gaXMgcmVhZHkgdG8gY29ubmVjdCB0byBjb21lZGkuXG4iLCBpbmRleCk7CisjZW5kaWYKKworCWluaXRfTVVURVgoJih1c2JkdXhmYXN0c3ViW2luZGV4XS5zZW0pKTsKKwkvLyBzYXZlIGEgcG9pbnRlciB0byB0aGUgdXNiIGRldmljZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLnVzYmRldiA9IHVkZXY7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkvLyBzYXZlIHRoZSBpbnRlcmZhY2UgbnVtYmVyCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uaWZudW0gPSBpbnRlcmZudW07CisjZWxzZQorCS8vIDIuNjogc2F2ZSB0aGUgaW50ZXJmYWNlIGl0c2VsZgorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmludGVyZmFjZSA9IHVpbnRlcmY7CisJLy8gZ2V0IHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZyb20gdGhlIGludGVyZmFjZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtID0gdWludGVyZi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCS8vIGhhbmQgdGhlIHByaXZhdGUgZGF0YSBvdmVyIHRvIHRoZSB1c2Igc3Vic3lzdGVtCisJLy8gd2lsbCBiZSBuZWVkZWQgZm9yIGRpc2Nvbm5lY3QKKwl1c2Jfc2V0X2ludGZkYXRhKHVpbnRlcmYsICYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogaWZudW09JWRcbiIsIHVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtKTsKKyNlbmRpZgorCS8vIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmRzIGdvaW5nIHRvIHRoZSB1c2IgZGV2aWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga21hbGxvYyhTSVpFT0ZEVVhCVUZGRVIsCisJCUdGUF9LRVJORUwpOworCWlmICghdXNiZHV4ZmFzdHN1YltpbmRleF0uZHV4X2NvbW1hbmRzKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gY3JlYXRlIHNwYWNlIG9mIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5pbnNuQnVmZmVyID0ga21hbGxvYyhTSVpFSU5TTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4ZmFzdHN1YltpbmRleF0uaW5zbkJ1ZmZlcikpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluc25CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vIHNldHRpbmcgdG8gYWx0ZXJuYXRlIHNldHRpbmcgMTogZW5hYmxpbmcgYnVsayBlcAorCWkgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkdXhmYXN0c3ViW2luZGV4XS51c2JkZXYsCisJCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtLCAxKTsKKwlpZiAoaSA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gYWx0ZXJuYXRlIHNldHRpbmcgMS5cbiIsIGluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl1c2JkdXhmYXN0c3ViW2luZGV4XS51cmJJbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnVyYkluID09IE5VTEwpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IENvdWxkIG5vdCBhbGxvYy4gdXJiXG4iLCBpbmRleCk7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdXNiZHV4ZmFzdHN1YltpbmRleF0udHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhTSVpFSU5CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IGNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLlxuIiwKKwkJCWluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyB3ZSd2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uCisJdXNiZHV4ZmFzdHN1YltpbmRleF0ucHJvYmVkID0gMTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdCVkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cbiIsCisJCWluZGV4KTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwlyZXR1cm4gKHZvaWQgKikoJnVzYmR1eGZhc3RzdWJbaW5kZXhdKTsKKyNlbHNlCisJLy8gc3VjY2VzcworCXJldHVybiAwOworI2VuZGlmCit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdm9pZCAqcHRyKQoreworCXVzYmR1eGZhc3RzdWJfdCAqdXNiZHV4ZmFzdHN1Yl90bXAgPSAodXNiZHV4ZmFzdHN1Yl90ICopIHB0cjsKKyNlbHNlCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViX3RtcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmCisJaWYgKCF1c2JkdXhmYXN0c3ViX3RtcCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGRpc2Nvbm5lY3QgY2FsbGVkIHdpdGggbnVsbCBwb2ludGVyLlxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT51c2JkZXYgIT0gdWRldikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IEJVRyEgY2FsbGVkIHdpdGggd3JvbmcgcHRyISEhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJZG93bigmdXNiZHV4ZmFzdHN1Yl90bXAtPnNlbSk7CisJdGlkeV91cCh1c2JkdXhmYXN0c3ViX3RtcCk7CisJdXAoJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZGlzY29ubmVjdGVkIGZyb20gdGhlIHVzYlxuIik7CisjZW5kaWYKK30KKworLy8gaXMgY2FsbGVkIHdoZW4gY29tZWRpLWNvbmZpZyBpcyBjYWxsZWQKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworCWludCByZXQ7CisJaW50IGluZGV4OworCWludCBpOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gZmluZCBhIHZhbGlkIGRldmljZSB3aGljaCBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24gb2YgdGhlIHVzYgorCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWEZBU1Q7IGkrKykgeworCQlpZiAoKHVzYmR1eGZhc3RzdWJbaV0ucHJvYmVkKSAmJiAoIXVzYmR1eGZhc3RzdWJbaV0uYXR0YWNoZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZXJyb3I6IGF0dGFjaCBmYWlsZWQsIG5vIHVzYmR1eGZhc3QgZGV2cyBjb25uZWN0ZWQgdG8gdGhlIHVzYiBidXMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG93bigmKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnNlbSkpOworCS8vIHBvaW50ZXIgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBjb21lZGkgZGV2aWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uY29tZWRpZGV2ID0gZGV2OworCisJLy8gdHJ5aW5nIHRvIHVwbG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2hpcAorCWlmIChjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApICYmCisJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pIHsKKwkJcmVhZF9maXJtd2FyZSh1c2JkdXhmYXN0c3ViLAorCQkJY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSwKKwkJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pOworCX0KKworCWRldi0+Ym9hcmRfbmFtZSA9IEJPQVJETkFNRTsKKworCS8qIHNldCBudW1iZXIgb2Ygc3ViZGV2aWNlcyAqLworCWRldi0+bl9zdWJkZXZpY2VzID0gTl9TVUJERVZJQ0VTOworCisJLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJkZXZpY2VzCisJaWYgKChyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgTl9TVUJERVZJQ0VTKSkgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGVycm9yIGFsbG9jIHNwYWNlIGZvciBzdWJkZXZcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiB1c2ItZGV2aWNlICVkIGlzIGF0dGFjaGVkIHRvIGNvbWVkaS5cbiIsCisJCWRldi0+bWlub3IsIGluZGV4KTsKKwkvLyBwcml2YXRlIHN0cnVjdHVyZSBpcyBhbHNvIHNpbXBseSB0aGUgdXNiLXN0cnVjdHVyZQorCWRldi0+cHJpdmF0ZSA9IHVzYmR1eGZhc3RzdWIgKyBpbmRleDsKKwkvLyB0aGUgZmlyc3Qgc3ViZGV2aWNlIGlzIHRoZSBBL0QgY29udmVydGVyCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKwkvLyB0aGUgVVJCcyBnZXQgdGhlIGNvbWVkaSBzdWJkZXZpY2UKKwkvLyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZworCS8vIHRoaXMgaXMgdGhlIHN1YmRldmljZSB3aGljaCByZWFkcyBkYXRhCisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLy8gdGhlIHN1YmRldmljZSByZWNlaXZlcyBhcyBwcml2YXRlIHN0cnVjdHVyZSB0aGUKKwkvLyB1c2Itc3RydWN0dXJlCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisJLy8gYW5hbG9nIGlucHV0CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCS8vIHJlYWRhYmxlIGFuZCByZWYgaXMgdG8gZ3JvdW5kCisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DTURfUkVBRDsKKwkvLyAxNiBjaGFubmVscworCXMtPm5fY2hhbiA9IDE2OworCS8vIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QKKwlzLT5sZW5fY2hhbmxpc3QgPSAxNjsKKwkvLyBjYWxsYmFjayBmdW5jdGlvbnMKKwlzLT5pbnNuX3JlYWQgPSB1c2JkdXhmYXN0X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4ZmFzdF9haV9jbWR0ZXN0OworCXMtPmRvX2NtZCA9IHVzYmR1eGZhc3RfYWlfY21kOworCXMtPmNhbmNlbCA9IHVzYmR1eGZhc3RfYWlfY2FuY2VsOworCS8vIG1heCB2YWx1ZSBmcm9tIHRoZSBBL0QgY29udmVydGVyICgxMmJpdCsxIGJpdCBmb3Igb3ZlcmZsb3cpCisJcy0+bWF4ZGF0YSA9IDB4MTAwMDsKKwkvLyByYW5nZSB0YWJsZSB0byBjb252ZXJ0IHRvIHBoeXNpY2FsIHVuaXRzCisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdXNiZHV4ZmFzdF9haV9yYW5nZTsKKworCS8vIGZpbmFsbHkgZGVjaWRlIHRoYXQgaXQncyBhdHRhY2hlZAorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmF0dGFjaGVkID0gMTsKKworCXVwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCisJcHJpbnRrKCJjb21lZGklZDogc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIHRvIHVzYmR1eGZhc3QuXG4iLCBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViX3RtcDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBkZXRhY2ggdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKworCWlmICghZGV2KSB7CisJCXByaW50aygiY29tZWRpPzogdXNiZHV4ZmFzdDogZGV0YWNoIHdpdGhvdXQgZGV2IHZhcmlhYmxlLi4uXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdXNiZHV4ZmFzdHN1Yl90bXAgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF1c2JkdXhmYXN0c3ViX3RtcCkgeworCQlwcmludGsoImNvbWVkaT86IHVzYmR1eGZhc3Q6IGRldGFjaCB3aXRob3V0IHB0ciB0byB1c2JkdXhmYXN0c3ViW11cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkb3duKCZ1c2JkdXhmYXN0c3ViX3RtcC0+c2VtKTsKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gRG9uJ3QgYWxsb3cgZGV0YWNoIHRvIGZyZWUgdGhlIHByaXZhdGUgc3RydWN0dXJlCisJLy8gSXQncyBvbmUgZW50cnkgb2Ygb2YgdXNiZHV4ZmFzdHN1YltdCisJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl1c2JkdXhmYXN0c3ViX3RtcC0+YXR0YWNoZWQgPSAwOworCXVzYmR1eGZhc3RzdWJfdG1wLT5jb21lZGlkZXYgPSBOVUxMOworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBkZXRhY2g6IHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iLAorCQlkZXYtPm1pbm9yKTsKKyNlbmRpZgorCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJdXAoJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCXJldHVybiAwOworfQorCisvKiBtYWluIGRyaXZlciBzdHJ1Y3QgKi8KK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl91c2JkdXhmYXN0ID0geworICAgICAgZHJpdmVyX25hbWU6InVzYmR1eGZhc3QiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOnVzYmR1eGZhc3RfYXR0YWNoLAorICAgICAgZGV0YWNoOnVzYmR1eGZhc3RfZGV0YWNoLAorfTsKKworc3RhdGljIHZvaWQgaW5pdF91c2JfZGV2aWNlcyh2b2lkKQoreworCWludCBpbmRleDsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBzZXR0aW5nIGFsbCBwb3NzaWJsZSBkZXZzIHRvIGludmFsaWRcbiIpOworI2VuZGlmCisJLy8gYWxsIGRldmljZXMgZW50cmllcyBhcmUgaW52YWxpZCB0byBiZWdpbiB3aXRoCisJLy8gdGhleSB3aWxsIGJlY29tZSB2YWxpZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24KKwkvLyBhbmQgdGhlbiBmaW5hbGx5IGJ5IHRoZSBhdHRhY2gtZnVuY3Rpb24KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1VU0JEVVhGQVNUOyBpbmRleCsrKSB7CisJCW1lbXNldCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSwgMHgwMCwKKwkJCXNpemVvZih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQlpbml0X01VVEVYKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisJfQorfQorCisvLyBUYWJsZSB3aXRoIHRoZSBVU0ItZGV2aWNlczoganVzdCBub3cgb25seSB0ZXN0aW5nIElEcworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmR1eGZhc3RzdWJfdGFibGVbXSA9IHsKKwkvLyAgICAgICAgeyBVU0JfREVWSUNFKDB4NGI0LCAweDg2MTMpLCAvL3Rlc3RpbmcKKwkvLyAgICAgICAgfSwKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAxMCkJLy9yZWFsIElECisJCX0sCisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMTEpCS8vcmVhbCBJRAorCQl9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JkdXhmYXN0c3ViX3RhYmxlKTsKKworLy8gVGhlIHVzYmR1eGZhc3RzdWItZHJpdmVyCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiZHV4ZmFzdHN1Yl9kcml2ZXIgPSB7CisjaWZkZWYgQ09NRURJX0hBVkVfVVNCX0RSSVZFUl9PV05FUgorICAgICAgb3duZXI6VEhJU19NT0RVTEUsCisjZW5kaWYKKyAgICAgIG5hbWU6Qk9BUkROQU1FLAorICAgICAgcHJvYmU6dXNiZHV4ZmFzdHN1Yl9wcm9iZSwKKyAgICAgIGRpc2Nvbm5lY3Q6dXNiZHV4ZmFzdHN1Yl9kaXNjb25uZWN0LAorICAgICAgaWRfdGFibGU6dXNiZHV4ZmFzdHN1Yl90YWJsZSwKK307CisKKy8vIENhbid0IHVzZSB0aGUgbmljZSBtYWNybyBhcyBJIGhhdmUgYWxzbyB0byBpbml0aWFsaXNlIHRoZSBVU0IKKy8vIHN1YnN5c3RlbToKKy8vIHJlZ2lzdGVyaW5nIHRoZSB1c2Itc3lzdGVtIF9hbmRfIHRoZSBjb21lZGktZHJpdmVyCitzdGF0aWMgaW50IGluaXRfdXNiZHV4ZmFzdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIgorCSAgICAgICBEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MgIlxuIik7CisJaW5pdF91c2JfZGV2aWNlcygpOworCXVzYl9yZWdpc3RlcigmdXNiZHV4ZmFzdHN1Yl9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl91c2JkdXhmYXN0KTsKKwlyZXR1cm4gMDsKK30KKworLy8gZGVyZWdpc3RlcmluZyB0aGUgY29tZWRpIGRyaXZlciBhbmQgdGhlIHVzYi1zdWJzeXN0ZW0KK3N0YXRpYyB2b2lkIGV4aXRfdXNiZHV4ZmFzdCh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3VzYmR1eGZhc3QpOworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JkdXhmYXN0c3ViX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdXNiZHV4ZmFzdCk7Cittb2R1bGVfZXhpdChleGl0X3VzYmR1eGZhc3QpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvaW50ZXJydXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2ludGVycnVwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzhlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2ludGVycnVwdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgbGludXgvaW50ZXJydXB0LmggY29tcGF0aWJpbGl0eSBoZWFkZXIKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19DT01QQVRfTElOVVhfSU5URVJSVVBUX0hfCisjZGVmaW5lIF9fQ09NUEFUX0xJTlVYX0lOVEVSUlVQVF9IXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZm5kZWYgSVJRX05PTkUKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KSAodm9pZCkoeCkKKyNlbmRpZgorCisjaWZuZGVmIElSUUZfRElTQUJMRUQKKyNkZWZpbmUgSVJRRl9ESVNBQkxFRCAgICAgICAgICAgU0FfSU5URVJSVVBUCisjZGVmaW5lIElSUUZfU0FNUExFX1JBTkRPTSAgICAgIFNBX1NBTVBMRV9SQU5ET00KKyNkZWZpbmUgSVJRRl9TSEFSRUQgICAgICAgICAgICAgU0FfU0hJUlEKKyNkZWZpbmUgSVJRRl9QUk9CRV9TSEFSRUQgICAgICAgU0FfUFJPQkVJUlEKKyNkZWZpbmUgSVJRRl9QRVJDUFUgICAgICAgICAgICAgU0FfUEVSQ1BVCisjaWZkZWYgU0FfVFJJR0dFUl9NQVNLCisjZGVmaW5lIElSUUZfVFJJR0dFUl9OT05FICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0xPVyAgICAgICAgU0FfVFJJR0dFUl9MT1cKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0hJR0ggICAgICAgU0FfVFJJR0dFUl9ISUdICisjZGVmaW5lIElSUUZfVFJJR0dFUl9GQUxMSU5HICAgIFNBX1RSSUdHRVJfRkFMTElORworI2RlZmluZSBJUlFGX1RSSUdHRVJfUklTSU5HICAgICBTQV9UUklHR0VSX1JJU0lORworI2RlZmluZSBJUlFGX1RSSUdHRVJfTUFTSyAgICAgICBTQV9UUklHR0VSX01BU0sKKyNlbHNlCisjZGVmaW5lIElSUUZfVFJJR0dFUl9OT05FICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0xPVyAgICAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfSElHSCAgICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9GQUxMSU5HICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX1JJU0lORyAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfTUFTSyAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFBUX1JFR1NfQVJHCisjZGVmaW5lIFBUX1JFR1NfQ0FMTAorI2RlZmluZSBQVF9SRUdTX05VTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYzlhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai0kKENPTkZJR19DT01FREkpCSs9IGtjb21lZGlsaWIubworCitrY29tZWRpbGliLW9ianMgOj0JCQkJXAorCQkJZGF0YS5vCQkJXAorCQkJa3N5bXMubwkJCVwKKwkJCWRpby5vCQkJXAorCQkJa2NvbWVkaWxpYl9tYWluLm8JXAorCQkJZ2V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWVjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGF0YS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgICAga2NvbWVkaWxpYi9kYXRhLmMKKyAgICBpbXBsZW1lbnRzIGNvbWVkaV9kYXRhXyooKSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgkvKiBmb3IgY29tZWRpX3VkZWxheSgpICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworaW50IGNvbWVkaV9kYXRhX3dyaXRlKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9XUklURTsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9ICZkYXRhOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIHJhbmdlLCBhcmVmKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kYXRhX3JlYWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICogZGF0YSkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fUkVBRDsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9IGRhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2RhdGFfcmVhZF9oaW50KGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmKQoreworCWNvbWVkaV9pbnNuIGluc247CisJbHNhbXBsX3QgZHVtbXlfZGF0YTsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1JFQUQ7CisJaW5zbi5uID0gMDsKKwlpbnNuLmRhdGEgPSAmZHVtbXlfZGF0YTsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZik7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGF0YV9yZWFkX2RlbGF5ZWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsCisJbHNhbXBsX3QgKiBkYXRhLCB1bnNpZ25lZCBpbnQgbmFub19zZWMpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kYXRhX3JlYWRfaGludChkZXYsIHN1YmRldiwgY2hhbiwgcmFuZ2UsIGFyZWYpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJY29tZWRpX3VkZWxheSgobmFub19zZWMgKyA5OTkpIC8gMTAwMCk7CisKKwlyZXR1cm4gY29tZWRpX2RhdGFfcmVhZChkZXYsIHN1YmRldiwgY2hhbiwgcmFuZ2UsIGFyZWYsIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjQ4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGlvLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAgICBrY29tZWRpbGliL2Rpby5jCisgICAgaW1wbGVtZW50cyBjb21lZGlfZGlvXyooKSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK2ludCBjb21lZGlfZGlvX2NvbmZpZyhjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IGlvKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9DT05GSUc7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSAmaW87CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgMCwgMCk7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGlvX3JlYWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9SRUFEOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gdmFsOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIDAsIDApOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2Rpb193cml0ZShjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fV1JJVEU7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSAmdmFsOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIDAsIDApOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2Rpb19iaXRmaWVsZChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IG1hc2ssCisJdW5zaWduZWQgaW50ICpiaXRzKQoreworCWNvbWVkaV9pbnNuIGluc247CisJbHNhbXBsX3QgZGF0YVsyXTsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fQklUUzsKKwlpbnNuLm4gPSAyOworCWluc24uZGF0YSA9IGRhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisKKwlkYXRhWzBdID0gbWFzazsKKwlkYXRhWzFdID0gKmJpdHM7CisKKwlyZXQgPSBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKKworCSpiaXRzID0gZGF0YVsxXTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZ2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNGFkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9nZXQuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAgICBrY29tZWRpbGliL2dldC5jCisgICAgYSBjb21lZGxpYiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBtb2R1bGVzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCitpbnQgY29tZWRpX2dldF9uX3N1YmRldmljZXMoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5uX3N1YmRldmljZXM7Cit9CisKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZShjb21lZGlfdCAqIGQpCit7CisJcmV0dXJuIENPTUVESV9WRVJTSU9OX0NPREU7Cit9CisKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lOworfQorCitjb25zdCBjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5ib2FyZF9uYW1lOworfQorCitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPnR5cGU7Cit9CisKK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPnN1YmRldl9mbGFnczsKK30KKworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKGNvbWVkaV90ICogZCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzdWJkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlpZiAoc3ViZCA+IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoOyBzdWJkIDwgZGV2LT5uX3N1YmRldmljZXM7IHN1YmQrKykgeworCQlpZiAoZGV2LT5zdWJkZXZpY2VzW3N1YmRdLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBzdWJkOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBjb21lZGlfZ2V0X25fY2hhbm5lbHMoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCXJldHVybiBzLT5uX2NoYW47Cit9CisKK2ludCBjb21lZGlfZ2V0X2xlbl9jaGFubGlzdChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPmxlbl9jaGFubGlzdDsKK30KKworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAocy0+bWF4ZGF0YV9saXN0KQorCQlyZXR1cm4gcy0+bWF4ZGF0YV9saXN0W2NoYW5dOworCisJcmV0dXJuIHMtPm1heGRhdGE7Cit9CisKKyNpZmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWludCByZXQ7CisKKwlpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJcmV0ID0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aDsKKwl9CisKKwlyZXQgPSByZXQgfCAoZGV2LT5taW5vciA8PCAyOCkgfCAoc3ViZGV2aWNlIDw8IDI0KSB8IChjaGFuIDw8IDE2KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50IGNvbWVkaV9nZXRfbl9yYW5nZXMoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJaW50IHJldDsKKworCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCXJldCA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aDsKKwl9IGVsc2UgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBTFBIQSAobm9uLXBvcnRhYmxlKQorKi8KK2ludCBjb21lZGlfZ2V0X2tyYW5nZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgY29tZWRpX2tyYW5nZSAqIGtyYW5nZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqbHI7CisKKwlpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlsciA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl07CisJfSBlbHNlIHsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZTsKKwl9CisJaWYgKHJhbmdlID49IGxyLT5sZW5ndGgpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWNweShrcmFuZ2UsIGxyLT5yYW5nZSArIHJhbmdlLCBzaXplb2YoY29tZWRpX2tyYW5nZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBTFBIQSAobWF5IGJlIHJlbmFtZWQpCisqLwordW5zaWduZWQgaW50IGNvbWVkaV9nZXRfYnVmX2hlYWRfcG9zKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7Cit9CisKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9jb250ZW50cyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJdW5zaWduZWQgaW50IG51bV9ieXRlczsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwludW1fYnl0ZXMgPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUocy0+YXN5bmMpOworCXJldHVybiBudW1fYnl0ZXM7Cit9CisKKy8qCisgKiBBTFBIQQorKi8KK2ludCBjb21lZGlfc2V0X3VzZXJfaW50X2NvdW50KGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgYnVmX3VzZXJfY291bnQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG51bV9ieXRlczsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW51bV9ieXRlcyA9IGJ1Zl91c2VyX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWlmIChudW1fYnl0ZXMgPCAwKQorCQlyZXR1cm4gLTE7CisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfbWFya19idWZmZXJfcmVhZChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwljb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl93cml0dGVuKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCBieXRlc193cml0dGVuOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlieXRlc193cml0dGVuID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGJ5dGVzX3dyaXR0ZW4pOworCWlmIChieXRlc193cml0dGVuICE9IG51bV9ieXRlcykKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX2dldF9idWZmZXJfc2l6ZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXYpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworfQorCitpbnQgY29tZWRpX2dldF9idWZmZXJfb2Zmc2V0KGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhc3luYy0+YnVmX3JlYWRfcHRyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGZiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgICAga2NvbWVkaWxpYi9rY29tZWRpbGliLmMKKyAgICBhIGNvbWVkbGliIGludGVyZmFjZSBmb3Iga2VybmVsIG1vZHVsZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkga2VybmVsIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworY29tZWRpX3QgKmNvbWVkaV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwljb21lZGlfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50IG1pbm9yOworCisJaWYgKHN0cm5jbXAoZmlsZW5hbWUsICIvZGV2L2NvbWVkaSIsIDExKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW1pbm9yID0gc2ltcGxlX3N0cnRvdWwoZmlsZW5hbWUgKyAxMSwgTlVMTCwgMCk7CisKKwlpZiAobWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpCisJCXJldHVybiBOVUxMOworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJaWYoZGV2X2ZpbGVfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZihkZXYgPT0gTlVMTCB8fCAhZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZHJpdmVyLT5tb2R1bGUpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAoY29tZWRpX3QgKikgZGV2OworfQorCitjb21lZGlfdCAqY29tZWRpX29wZW5fb2xkKHVuc2lnbmVkIGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm87CisJY29tZWRpX2RldmljZSAqZGV2OworCisJaWYgKG1pbm9yID49IENPTUVESV9OVU1fTUlOT1JTKQorCQlyZXR1cm4gTlVMTDsKKworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJaWYoZGV2ID09IE5VTEwgfHwgIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIChjb21lZGlfdCAqKSBkZXY7Cit9CisKK2ludCBjb21lZGlfY2xvc2UoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfbG9nbGV2ZWwoaW50IG5ld2xldmVsKQoreworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9wZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlydF9wcmludGsoIiVzOiB1bmtub3duIGVycm9yXG4iLCBtZXNzYWdlKTsKK30KKworY2hhciAqY29tZWRpX3N0cmVycm9yKGludCBlcnIpCit7CisJcmV0dXJuICJ1bmtub3duIGVycm9yIjsKK30KKworaW50IGNvbWVkaV9maWxlbm8oY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwkvKiByZXR1cm4gc29tZXRoaW5nIHJhbmRvbSAqLworCXJldHVybiBkZXYtPm1pbm9yOworfQorCitpbnQgY29tZWRpX2NvbW1hbmQoY29tZWRpX3QgKiBkLCBjb21lZGlfY21kICogY21kKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCXVuc2lnbmVkIHJ1bmZsYWdzOworCisJaWYgKGNtZC0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBjbWQtPnN1YmRldjsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpCisJCXJldHVybiAtRUlPOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlzLT5idXN5ID0gZDsKKworCWlmIChhc3luYy0+Y2JfbWFzayAmIENPTUVESV9DQl9FT1MpCisJCWNtZC0+ZmxhZ3MgfD0gVFJJR19XQUtFX0VPUzsKKworCWFzeW5jLT5jbWQgPSAqY21kOworCisJcnVuZmxhZ3MgPSBTUkZfUlVOTklORzsKKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoY29tZWRpX3N3aXRjaF90b19ydChkZXYpID09IDApCisJCXJ1bmZsYWdzIHw9IFNSRl9SVDsKKyNlbmRpZgorCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIH4wLCBydW5mbGFncyk7CisKKwljb21lZGlfcmVzZXRfYXN5bmNfYnVmKGFzeW5jKTsKKworCXJldHVybiBzLT5kb19jbWQoZGV2LCBzKTsKK30KKworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QoY29tZWRpX3QgKiBkLCBjb21lZGlfY21kICogY21kKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChjbWQtPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgY21kLT5zdWJkZXY7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChzLT5hc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzLT5kb19jbWR0ZXN0KGRldiwgcywgY21kKTsKK30KKworLyoKKyAqCUNPTUVESV9JTlNOCisgKglwZXJmb3JtIGFuIGluc3RydWN0aW9uCisgKi8KK2ludCBjb21lZGlfZG9faW5zbihjb21lZGlfdCAqIGQsIGNvbWVkaV9pbnNuICogaW5zbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5zbi0+aW5zbiAmIElOU05fTUFTS19TUEVDSUFMKSB7CisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fR1RPRDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJCWluc24tPmRhdGFbMF0gPSB0di50dl9zZWM7CisJCQkJaW5zbi0+ZGF0YVsxXSA9IHR2LnR2X3VzZWM7CisJCQkJcmV0ID0gMjsKKworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIElOU05fV0FJVDoKKwkJCS8qIFhYWCBpc24ndCB0aGUgdmFsdWUgc3VwcG9zZWQgdG8gYmUgbmFub3NlY3M/ICovCisJCQlpZiAoaW5zbi0+biAhPSAxIHx8IGluc24tPmRhdGFbMF0gPj0gMTAwKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbWVkaV91ZGVsYXkoaW5zbi0+ZGF0YVswXSk7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9JTlRUUklHOgorCQkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5zbi0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCQkJcnRfcHJpbnRrKCIlZCBub3QgdXNhYmxlIHN1YmRldmljZVxuIiwKKwkJCQkJaW5zbi0+c3ViZGV2KTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKKwkJCWlmICghcy0+YXN5bmMpIHsKKwkJCQlydF9wcmludGsoIm5vIGFzeW5jXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzLT5hc3luYy0+aW50dHJpZykgeworCQkJCXJ0X3ByaW50aygibm8gaW50dHJpZ1xuIik7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHMtPmFzeW5jLT5pbnR0cmlnKGRldiwgcywgaW5zbi0+ZGF0YVswXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGEgc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisJCWlmIChpbnNuLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpbnNuLT5zdWJkZXY7CisKKwkJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCQlydF9wcmludGsoIiVkIG5vdCB1c2VhYmxlIHN1YmRldmljZVxuIiwgaW5zbi0+c3ViZGV2KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogWFhYIGNoZWNrIGxvY2sgKi8KKworCQlpZiAoKHJldCA9IGNoZWNrX2NoYW5saXN0KHMsIDEsICZpbnNuLT5jaGFuc3BlYykpIDwgMCkgeworCQkJcnRfcHJpbnRrKCJiYWQgY2hhbnNwZWNcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAocy0+YnVzeSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzLT5idXN5ID0gZDsKKworCQlzd2l0Y2ggKGluc24tPmluc24pIHsKKwkJY2FzZSBJTlNOX1JFQUQ6CisJCQlyZXQgPSBzLT5pbnNuX3JlYWQoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fV1JJVEU6CisJCQlyZXQgPSBzLT5pbnNuX3dyaXRlKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0JJVFM6CisJCQlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQ09ORklHOgorCQkJLyogWFhYIHNob3VsZCBjaGVjayBpbnN0cnVjdGlvbiBsZW5ndGggKi8KKwkJCXJldCA9IHMtPmluc25fY29uZmlnKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXMtPmJ1c3kgPSBOVUxMOworCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKyNpZiAwCisJLyogWFhYIGRvIHdlIHdhbnQgdGhpcz8gLS0gYWJib3R0aSAjaWYnZWQgaXQgb3V0IGZvciBub3cuICovCisJaWYgKHJldCAhPSBpbnNuLT5uKSB7CisJCXJ0X3ByaW50aygiQlVHOiByZXN1bHQgb2YgaW5zbiAhPSBpbnNuLm5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKyNlbmRpZgorICAgICAgZXJyb3I6CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9MT0NLCisJbG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisJbmVjZXNzYXJ5IGxvY2tpbmc6CisJLSBpb2N0bC9ydCBsb2NrICAodGhpcyB0eXBlKQorCS0gbG9jayB3aGlsZSBzdWJkZXZpY2UgYnVzeQorCS0gbG9jayB3aGlsZSBzdWJkZXZpY2UgYmVpbmcgcHJvZ3JhbW1lZAorCisqLworaW50IGNvbWVkaV9sb2NrKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmJ1c3kpIHsKKwkJcmV0ID0gLUVCVVNZOworCX0gZWxzZSB7CisJCWlmIChzLT5sb2NrKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0gZWxzZSB7CisJCQlzLT5sb2NrID0gZDsKKwkJfQorCX0KKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX1VOTE9DSworCXVubG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisqLworaW50IGNvbWVkaV91bmxvY2soY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IHJldDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmIChzLT5idXN5KSB7CisJCXJldCA9IC1FQlVTWTsKKwl9IGVsc2UgaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSAodm9pZCAqKWQpIHsKKwkJcmV0ID0gLUVBQ0NFUzsKKwl9IGVsc2UgeworCQlzLT5sb2NrID0gTlVMTDsKKworCQlpZiAoYXN5bmMpIHsKKwkJCWFzeW5jLT5jYl9tYXNrID0gMDsKKwkJCWFzeW5jLT5jYl9mdW5jID0gTlVMTDsKKwkJCWFzeW5jLT5jYl9hcmcgPSBOVUxMOworCQl9CisKKwkJcmV0ID0gMDsKKwl9CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9DQU5DRUwKKwljYW5jZWwgYWNxdWlzaXRpb24gaW9jdGwKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vdGhpbmcKKworCXdyaXRlczoKKwkJbm90aGluZworCisqLworaW50IGNvbWVkaV9jYW5jZWwoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGQpCisJCXJldHVybiAtRUFDQ0VTOworCisjaWYgMAorCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocy0+YnVzeSAhPSBkKQorCQlyZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKwlpZiAoIXMtPmNhbmNlbCB8fCAhcy0+YXN5bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChyZXQgPSBzLT5jYW5jZWwoZGV2LCBzKSkpCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JUKSB7CisJCWNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGRldik7CisJfQorI2VuZGlmCisJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JVTk5JTkcgfCBTUkZfUlQsIDApOworCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwlzLT5idXN5ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKgorICAgcmVnaXN0cmF0aW9uIG9mIGNhbGxiYWNrIGZ1bmN0aW9ucworICovCitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCB8fCAhYXN5bmMpCisJCXJldHVybiAtRUlPOworCisJLyogYXJlIHdlIGxvY2tlZD8gKGlvY3RsIGxvY2spICovCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBkKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCS8qIGFyZSB3ZSBidXN5PyAqLworCWlmIChzLT5idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFtYXNrKSB7CisJCWFzeW5jLT5jYl9tYXNrID0gMDsKKwkJYXN5bmMtPmNiX2Z1bmMgPSBOVUxMOworCQlhc3luYy0+Y2JfYXJnID0gTlVMTDsKKwl9IGVsc2UgeworCQlhc3luYy0+Y2JfbWFzayA9IG1hc2s7CisJCWFzeW5jLT5jYl9mdW5jID0gY2I7CisJCWFzeW5jLT5jYl9hcmcgPSBhcmc7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfcG9sbChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQgfHwgIWFzeW5jKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwkvKiBhcmUgd2UgcnVubmluZz8gWFhYIHdyb25nPyAqLworCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcy0+cG9sbChkZXYsIHMpOworfQorCisvKiBXQVJOSU5HOiBub3QgcG9ydGFibGUgKi8KK2ludCBjb21lZGlfbWFwKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdm9pZCAqcHRyKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAoIXMtPmFzeW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwdHIpIHsKKwkJKigodm9pZCAqKilwdHIpID0gcy0+YXN5bmMtPnByZWFsbG9jX2J1ZjsKKwl9CisKKwkvKiBYWFggbm8gcmVmZXJlbmNlIGNvdW50aW5nICovCisKKwlyZXR1cm4gMDsKK30KKworLyogV0FSTklORzogbm90IHBvcnRhYmxlICovCitpbnQgY29tZWRpX3VubWFwKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJaWYgKCFzLT5hc3luYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBYWFggbm8gcmVmZXJlbmNlIGNvdW50aW5nICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiNDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICAgIGNvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMKKyAgICBhIGNvbWVkbGliIGludGVyZmFjZSBmb3Iga2VybmVsIG1vZHVsZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIEVYUE9SVF9TWU1UQUIKKyNkZWZpbmUgRVhQT1JUX1NZTVRBQgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDIwMAorCisvKiBmdW5jdGlvbnMgc3BlY2lmaWMgdG8ga2NvbWVkaWxpYiAqLworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9yZWdpc3Rlcl9jYWxsYmFjayk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfa3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZfaGVhZF9wb3MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfc2V0X3VzZXJfaW50X2NvdW50KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX21hcCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV91bm1hcCk7CisKKy8qIFRoaXMgbGlzdCBjb21lcyBmcm9tIHVzZXItc3BhY2UgY29tZWRpbGliLCB0byBzaG93IHdoaWNoCisgKiBmdW5jdGlvbnMgYXJlIG5vdCBwb3J0ZWQgeWV0LiAqLworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9vcGVuKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Nsb3NlKTsKKworLyogbG9nZ2luZyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfbG9nbGV2ZWwpOworRVhQT1JUX1NZTUJPTChjb21lZGlfcGVycm9yKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N0cmVycm9yKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZXJybm8pOworRVhQT1JUX1NZTUJPTChjb21lZGlfZmlsZW5vKTsKKworLyogZGV2aWNlIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9uX3N1YmRldmljZXMpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3ZlcnNpb25fY29kZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfZHJpdmVyX25hbWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2JvYXJkX25hbWUpOworCisvKiBzdWJkZXZpY2UgcXVlcmllcyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbl9jaGFubmVscyk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3JhbmdlX2lzX2NoYW5fc3BlY2lmaWMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9tYXhkYXRhX2lzX2NoYW5fc3BlY2lmaWMpOworCisvKiBjaGFubmVsIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9tYXhkYXRhKTsKKyNpZmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9yYW5nZXR5cGUpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbl9yYW5nZXMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9maW5kX3JhbmdlKTsKKworLyogYnVmZmVyIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZmZXJfc2l6ZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9tYXhfYnVmZmVyX3NpemUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfYnVmZmVyX3NpemUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2J1ZmZlcl9jb250ZW50cyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYnVmZmVyX29mZnNldCk7CisKKy8qIGxvdy1sZXZlbCBzdHVmZiAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV90cmlnZ2VyKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZG9faW5zbmxpc3QpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZG9faW5zbik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9sb2NrKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3VubG9jayk7CisKKy8qIHBoeXNpY2FsIHVuaXRzICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3RvX3BoeXMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9mcm9tX3BoeXMpOworCisvKiBzeW5jaHJvbm91cyBzdHVmZiAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZGF0YV9yZWFkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfcmVhZF9oaW50KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfcmVhZF9kZWxheWVkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfd3JpdGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fd3JpdGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX2JpdGZpZWxkKTsKKworLyogc2xvd2x5IHZhcnlpbmcgc3R1ZmYgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc3ZfaW5pdCk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3N2X3VwZGF0ZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3N2X21lYXN1cmUpOworCisvKiBjb21tYW5kcyAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfY21kX3NyY19tYXNrKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2NtZF9nZW5lcmljX3RpbWVkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2NhbmNlbCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9jb21tYW5kKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2NvbW1hbmRfdGVzdCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9wb2xsKTsKKworLyogYnVmZmVyIGNvbmZpZ3VyYXRpb24gKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX21hcmtfYnVmZmVyX3JlYWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfbWFya19idWZmZXJfd3JpdHRlbik7CisKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9sZW5fY2hhbmxpc3QpOworCisvKiBkZXByZWNhdGVkICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF90aW1lcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3RpbWVkXzFjaGFuKTsKKworLyogYWxwaGEgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc2V0X2dsb2JhbF9vb3JfYmVoYXZpb3IpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcGNpX2lkcy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wY2lfaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYmE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcGNpX2lkcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DT01QQVRfTElOVVhfUENJX0lEU19ICisjZGVmaW5lIF9fQ09NUEFUX0xJTlVYX1BDSV9JRFNfSAorCisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQU1DQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNQ0MJMHgxMGU4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NCT0FSRFMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DQk9BUkRTCTB4MTMwNworI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9RVUFOQ09NCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUVVBTkNPTQkweDgwMDgKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUVVBTkNPTV9HUElCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBTkNPTV9HUElCCTB4MzMwMgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0NPTVBBVF9MSU5VWF9QQ0lfSURTX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyYjcyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICAgIG1vZHVsZS9wcm9jLmMKKyAgICAvcHJvYyBpbnRlcmZhY2UgZm9yIGNvbWVkaQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorCVRoaXMgaXMgc29tZSBzZXJpb3VzIGJsb2F0d2FyZS4KKworCVRha2VuIGZyb20gRGF2ZSBBLidzIFBDTC03MTEgZHJpdmVyLCAnY3V6IEkgdGhvdWdodCBpdAorCXdhcyBjb29sLgorKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitpbnQgY29tZWRpX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCWludCAqZW9mLCB2b2lkICpkYXRhKTsKKworZXh0ZXJuIGNvbWVkaV9kcml2ZXIgKmNvbWVkaV9kcml2ZXJzOworCitpbnQgY29tZWRpX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCWludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBpOworCWludCBkZXZpY2VzX3EgPSAwOworCWludCBsID0gMDsKKwljb21lZGlfZHJpdmVyICpkcml2OworCisJbCArPSBzcHJpbnRmKGJ1ZiArIGwsCisJCSJjb21lZGkgdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFICJcbiIKKwkJImZvcm1hdCBzdHJpbmc6ICVzXG4iLAorCQkiXCIlMmQ6ICUtMjBzICUtMjBzICU0ZFwiLGksZHJpdmVyX25hbWUsYm9hcmRfbmFtZSxuX3N1YmRldmljZXMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgaSsrKSB7CisJCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhpKTsKKwkJY29tZWRpX2RldmljZSAqZGV2OworCisJCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkgY29udGludWU7CisJCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCQlpZiAoZGV2LT5hdHRhY2hlZCkgeworCQkJZGV2aWNlc19xID0gMTsKKwkJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAiJTJkOiAlLTIwcyAlLTIwcyAlNGRcbiIsCisJCQkJaSwKKwkJCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsCisJCQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPm5fc3ViZGV2aWNlcyk7CisJCX0KKwl9CisJaWYgKCFkZXZpY2VzX3EpIHsKKwkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICJubyBkZXZpY2VzXG4iKTsKKwl9CisKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIlczpcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IGRyaXYtPm51bV9uYW1lczsgaSsrKSB7CisJCQlsICs9IHNwcmludGYoYnVmICsgbCwgIiAlc1xuIiwKKwkJCQkqKGNoYXIgKiopKChjaGFyICopZHJpdi0+Ym9hcmRfbmFtZSArCisJCQkJCWkgKiBkcml2LT5vZmZzZXQpKTsKKwkJfQorCQlpZiAoIWRyaXYtPm51bV9uYW1lcykgeworCQkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIgJXNcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBsOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3ZvaWQgY29tZWRpX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY29tZWRpX3Byb2M7CisKKwljb21lZGlfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjb21lZGkiLCBTX0lGUkVHIHwgU19JUlVHTywgMCk7CisJaWYgKGNvbWVkaV9wcm9jKQorCQljb21lZGlfcHJvYy0+cmVhZF9wcm9jID0gY29tZWRpX3JlYWRfcHJvY21lbTsKK30KKwordm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNvbWVkaSIsIDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkYzNjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAgICBtb2R1bGUvcmFuZ2UuYworICAgIGNvbWVkaSByb3V0aW5lcyBmb3Igdm9sdGFnZSByYW5nZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMTAgPSB7IDEsIHtCSVBfUkFOR0UoMTApfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyNSA9IHsgMSwge0JJUF9SQU5HRSg1KX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjJfNSA9IHsgMSwge0JJUF9SQU5HRSgyLjUpfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmlwb2xhcjEwID0geyAxLCB7VU5JX1JBTkdFKDEwKX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5pcG9sYXI1ID0geyAxLCB7VU5JX1JBTkdFKDUpfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmtub3duID0geyAxLCB7ezAsIDEwMDAwMDAsIFVOSVRfbm9uZX19IH07CisKKy8qCisgICAJQ09NRURJX1JBTkdFSU5GTworCXJhbmdlIGluZm9ybWF0aW9uIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gcmFuZ2VpbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCXJhbmdlIGluZm8gc3RydWN0dXJlCisKKwl3cml0ZXM6CisJCW4gY29tZWRpX2tyYW5nZSBzdHJ1Y3R1cmVzIHRvIHJhbmdlaW5mby0+cmFuZ2VfcHRyCisqLworaW50IGRvX3JhbmdlaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfcmFuZ2VpbmZvICogYXJnKQoreworCWNvbWVkaV9yYW5nZWluZm8gaXQ7CisJaW50IHN1YmQsIGNoYW47CisJY29uc3QgY29tZWRpX2xyYW5nZSAqbHI7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaXQsIGFyZywgc2l6ZW9mKGNvbWVkaV9yYW5nZWluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3ViZCA9IChpdC5yYW5nZV90eXBlID4+IDI0KSAmIDB4ZjsKKwljaGFuID0gKGl0LnJhbmdlX3R5cGUgPj4gMTYpICYgMHhmZjsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN1YmQgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkOworCWlmIChzLT5yYW5nZV90YWJsZSkgeworCQlsciA9IHMtPnJhbmdlX3RhYmxlOworCX0gZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChSQU5HRV9MRU5HVEgoaXQucmFuZ2VfdHlwZSkgIT0gbHItPmxlbmd0aCkgeworCQlEUFJJTlRLKCJ3cm9uZyBsZW5ndGggJWQgc2hvdWxkIGJlICVkICgweCUwOHgpXG4iLAorCQkJUkFOR0VfTEVOR1RIKGl0LnJhbmdlX3R5cGUpLCBsci0+bGVuZ3RoLCBpdC5yYW5nZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihpdC5yYW5nZV9wdHIsIGxyLT5yYW5nZSwKKwkJCXNpemVvZihjb21lZGlfa3JhbmdlKSAqIGxyLT5sZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyZWZfaW52YWxpZChjb21lZGlfc3ViZGV2aWNlICogcywgdW5zaWduZWQgaW50IGNoYW5zcGVjKQoreworCXVuc2lnbmVkIGludCBhcmVmOworCisJLy8gZGlzYWJsZSByZXBvcnRpbmcgaW52YWxpZCBhcmVmcy4uLiBtYXliZSBzb21lZGF5CisJcmV0dXJuIDA7CisKKwlhcmVmID0gQ1JfQVJFRihjaGFuc3BlYyk7CisJc3dpdGNoIChhcmVmKSB7CisJY2FzZSBBUkVGX0RJRkY6CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfRElGRikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfQ09NTU9OOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NPTU1PTikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfR1JPVU5EOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0dST1VORCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfT1RIRVI6CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfT1RIRVIpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCURQUklOVEsoInN1YmRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFyZWYgJWkiLCBhcmVmKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGVhY2ggZWxlbWVudCBpbiBhIGNoYW5uZWwvZ2FpbiBsaXN0IHRvIG1ha2UKKyAgIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZC4KKyovCitpbnQgY2hlY2tfY2hhbmxpc3QoY29tZWRpX3N1YmRldmljZSAqIHMsIGludCBuLCB1bnNpZ25lZCBpbnQgKmNoYW5saXN0KQoreworCWludCBpOworCWludCBjaGFuOworCisJaWYgKHMtPnJhbmdlX3RhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQlpZiAoQ1JfQ0hBTihjaGFubGlzdFtpXSkgPj0gcy0+bl9jaGFuIHx8CisJCQkJQ1JfUkFOR0UoY2hhbmxpc3RbaV0pID49IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGgKKwkJCQl8fCBhcmVmX2ludmFsaWQocywgY2hhbmxpc3RbaV0pKSB7CisJCQkJcnRfcHJpbnRrCisJCQkJCSgiYmFkIGNoYW5saXN0WyVkXT0weCUwOHggbl9jaGFuPSVkIHJhbmdlIGxlbmd0aD0lZFxuIiwKKwkJCQkJaSwgY2hhbmxpc3RbaV0sIHMtPm5fY2hhbiwKKwkJCQkJcy0+cmFuZ2VfdGFibGUtPmxlbmd0aCk7CisjaWYgMAorCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQkJcHJpbnRrKCJbJWRdPTB4JTA4eFxuIiwgaSwgY2hhbmxpc3RbaV0pOworCQkJCX0KKyNlbmRpZgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCX0gZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQljaGFuID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisJCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4gfHwKKwkJCQlDUl9SQU5HRShjaGFubGlzdFtpXSkgPj0KKwkJCQlzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGgKKwkJCQl8fCBhcmVmX2ludmFsaWQocywgY2hhbmxpc3RbaV0pKSB7CisJCQkJcnRfcHJpbnRrKCJiYWQgY2hhbmxpc3RbJWRdPTB4JTA4eFxuIiwgaSwKKwkJCQkJY2hhbmxpc3RbaV0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcnRfcHJpbnRrKCJjb21lZGk6IChidWcpIG5vIHJhbmdlIHR5cGUgbGlzdCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1YjgxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnQuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAgICBjb21lZGkvcnQuYworICAgIGNvbWVkaSBrZXJuZWwgbW9kdWxlCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlIDxsaW51eC9jb21lZGlkZXYuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJydF9wZW5kX3RxLmgiCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKyNpbmNsdWRlIDxydGFpLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisjaW5jbHVkZSA8bnVjbGV1cy9hc20vaGFsLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisjaW5jbHVkZSA8cnRsX2NvcmUuaD4KKyNpbmNsdWRlIDxydGxfc3luYy5oPgorI2VuZGlmCisKK3N0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCB7CisJaW50IHJ0OworCWludCBpcnE7CisJIGlycXJldHVybl90KCpoYW5kbGVyKSAoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1NfQVJHKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGNoYXIgKmRldmljZTsKKwljb21lZGlfZGV2aWNlICpkZXZfaWQ7Cit9OworCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpOworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKmNvbWVkaV9pcnFzW05SX0lSUVNdOworCitpbnQgY29tZWRpX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGlycSwgaXJxcmV0dXJuX3QoKmhhbmRsZXIpIChpbnQsCisJCXZvaWQgKlBUX1JFR1NfQVJHKSwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2aWNlLAorCWNvbWVkaV9kZXZpY2UgKiBkZXZfaWQpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKwlpbnQgcmV0OworCS8qIG51bGwgc2hhcmVkIGludGVycnVwdCBmbGFnLCBzaW5jZSBydCBpbnRlcnJ1cHQgaGFuZGxlcnMgZG8gbm90CisJICogc3VwcG9ydCBpdCwgYW5kIHRoaXMgdmVyc2lvbiBvZiBjb21lZGlfcmVxdWVzdF9pcnEoKSBpcyBvbmx5CisJICogY2FsbGVkIGZvciBrZXJuZWxzIHdpdGggcnQgc3VwcG9ydCAqLworCXVuc2lnbmVkIGxvbmcgdW5zaGFyZWRfZmxhZ3MgPSBmbGFncyAmIH5JUlFGX1NIQVJFRDsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaGFuZGxlciwgdW5zaGFyZWRfZmxhZ3MsIGRldmljZSwgZGV2X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQkvLyB3ZSBmYWlsZWQsIHNvIGZhbGwgYmFjayBvbiBhbGxvd2luZyBzaGFyZWQgaW50ZXJydXB0ICh3aGljaCB3ZSB3b24ndCBldmVyIG1ha2UgUlQpCisJCWlmIChmbGFncyAmIElSUUZfU0hBUkVEKSB7CisJCQlydF9wcmludGsKKwkJCQkoImNvbWVkaTogY2Fubm90IGdldCB1bnNoYXJlZCBpbnRlcnJ1cHQsIHdpbGwgbm90IHVzZSBSVCBpbnRlcnJ1cHRzLlxuIik7CisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIGZsYWdzLCBkZXZpY2UsIGRldl9pZCk7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWl0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaXQtPmhhbmRsZXIgPSBoYW5kbGVyOworCQlpdC0+aXJxID0gaXJxOworCQlpdC0+ZGV2X2lkID0gZGV2X2lkOworCQlpdC0+ZGV2aWNlID0gZGV2aWNlOworCQlpdC0+ZmxhZ3MgPSB1bnNoYXJlZF9mbGFnczsKKwkJY29tZWRpX2lycXNbaXJxXSA9IGl0OworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgY29tZWRpX2RldmljZSAqIGRldl9pZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCisJZnJlZV9pcnEoaXJxLCBkZXZfaWQpOworCisJaXQgPSBjb21lZGlfaXJxc1tpcnFdOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaXQtPnJ0KSB7CisJCXByaW50aygicmVhbC10aW1lIElSUSBhbGxvY2F0ZWQgYXQgYm9hcmQgcmVtb3ZhbCAoaWdub3JlKVxuIik7CisJCWNvbWVkaV9ydF9yZWxlYXNlX2lycShpdCk7CisJfQorCisJa2ZyZWUoaXQpOworCWNvbWVkaV9pcnFzW2lycV0gPSBOVUxMOworfQorCitpbnQgY29tZWRpX3N3aXRjaF90b19ydChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWl0ID0gY29tZWRpX2lycXNbZGV2LT5pcnFdOworCS8qIGRyaXZlcnMgbWlnaHQgbm90IGJlIHVzaW5nIGFuIGludGVycnVwdCBmb3IgY29tbWFuZHMsCisJICAgb3Igd2UgbWlnaHQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIGdldCBhbiB1bnNoYXJlZCBpcnEgKi8KKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRldi0+cnQpCisJCWNvbWVkaV9ydF9nZXRfaXJxKGl0KTsKKworCWRldi0+cnQrKzsKKwlpdC0+cnQgPSAxOworCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaXQgPSBjb21lZGlfaXJxc1tkZXYtPmlycV07CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybjsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJZGV2LT5ydC0tOworCWlmICghZGV2LT5ydCkKKwkJY29tZWRpX3J0X3JlbGVhc2VfaXJxKGl0KTsKKworCWl0LT5ydCA9IDA7CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCit2b2lkIHdha2VfdXBfaW50X2hhbmRsZXIoaW50IGFyZzEsIHZvaWQgKmFyZzIpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKSBhcmcyKTsKK30KKwordm9pZCBjb21lZGlfcnRfcGVuZF93YWtldXAod2FpdF9xdWV1ZV9oZWFkX3QgKiBxKQoreworCXJ0X3BlbmRfY2FsbCh3YWtlX3VwX2ludF9oYW5kbGVyLCAwLCBxKTsKK30KKworLyogUlRBSSBzZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisKKyNpZm5kZWYgSEFWRV9SVF9SRVFVRVNUX0lSUV9XSVRIX0FSRworI2RlZmluZSBERUNMQVJFX1ZPSURfSVJRKGlycSkgXAorc3RhdGljIHZvaWQgaGFuZGxlX3ZvaWRfaXJxXyAjIyBpcnEgKHZvaWQpeyBoYW5kbGVfdm9pZF9pcnEoaXJxKTt9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV92b2lkX2lycShpbnQgaXJxKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2lycV07CisJaWYgKGl0ID09IE5VTEwpIHsKKwkJcnRfcHJpbnRrKCJjb21lZGk6IG51bGwgaXJxIHN0cnVjdD9cbiIpOworCQlyZXR1cm47CisJfQorCWl0LT5oYW5kbGVyKGlycSwgaXQtPmRldl9pZCBQVF9SRUdTX05VTEwpOworCXJ0X2VuYWJsZV9pcnEoaXJxKTsJLy9uZWVkZWQgYnkgcnRhaS1hZGVvcywgc2VlbXMgbGlrZSBpdCBzaG91bGRuJ3QgaHVydCBlYXJsaWVyIHZlcnNpb25zCit9CisKK0RFQ0xBUkVfVk9JRF9JUlEoMCk7CitERUNMQVJFX1ZPSURfSVJRKDEpOworREVDTEFSRV9WT0lEX0lSUSgyKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMyk7CitERUNMQVJFX1ZPSURfSVJRKDQpOworREVDTEFSRV9WT0lEX0lSUSg1KTsKK0RFQ0xBUkVfVk9JRF9JUlEoNik7CitERUNMQVJFX1ZPSURfSVJRKDcpOworREVDTEFSRV9WT0lEX0lSUSg4KTsKK0RFQ0xBUkVfVk9JRF9JUlEoOSk7CitERUNMQVJFX1ZPSURfSVJRKDEwKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTEpOworREVDTEFSRV9WT0lEX0lSUSgxMik7CitERUNMQVJFX1ZPSURfSVJRKDEzKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTQpOworREVDTEFSRV9WT0lEX0lSUSgxNSk7CitERUNMQVJFX1ZPSURfSVJRKDE2KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTcpOworREVDTEFSRV9WT0lEX0lSUSgxOCk7CitERUNMQVJFX1ZPSURfSVJRKDE5KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjApOworREVDTEFSRV9WT0lEX0lSUSgyMSk7CitERUNMQVJFX1ZPSURfSVJRKDIyKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjMpOworCit0eXBlZGVmIHZvaWQgKCpWX0ZQX1YpICh2b2lkKTsKK3N0YXRpYyBWX0ZQX1YgaGFuZGxlX3ZvaWRfaXJxX3B0cnNbXSA9IHsKKwloYW5kbGVfdm9pZF9pcnFfMCwKKwloYW5kbGVfdm9pZF9pcnFfMSwKKwloYW5kbGVfdm9pZF9pcnFfMiwKKwloYW5kbGVfdm9pZF9pcnFfMywKKwloYW5kbGVfdm9pZF9pcnFfNCwKKwloYW5kbGVfdm9pZF9pcnFfNSwKKwloYW5kbGVfdm9pZF9pcnFfNiwKKwloYW5kbGVfdm9pZF9pcnFfNywKKwloYW5kbGVfdm9pZF9pcnFfOCwKKwloYW5kbGVfdm9pZF9pcnFfOSwKKwloYW5kbGVfdm9pZF9pcnFfMTAsCisJaGFuZGxlX3ZvaWRfaXJxXzExLAorCWhhbmRsZV92b2lkX2lycV8xMiwKKwloYW5kbGVfdm9pZF9pcnFfMTMsCisJaGFuZGxlX3ZvaWRfaXJxXzE0LAorCWhhbmRsZV92b2lkX2lycV8xNSwKKwloYW5kbGVfdm9pZF9pcnFfMTYsCisJaGFuZGxlX3ZvaWRfaXJxXzE3LAorCWhhbmRsZV92b2lkX2lycV8xOCwKKwloYW5kbGVfdm9pZF9pcnFfMTksCisJaGFuZGxlX3ZvaWRfaXJxXzIwLAorCWhhbmRsZV92b2lkX2lycV8yMSwKKwloYW5kbGVfdm9pZF9pcnFfMjIsCisJaGFuZGxlX3ZvaWRfaXJxXzIzLAorfTsKKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0X3JlcXVlc3RfZ2xvYmFsX2lycShpdC0+aXJxLCBoYW5kbGVfdm9pZF9pcnFfcHRyc1tpdC0+aXJxXSk7CisJcnRfc3RhcnR1cF9pcnEoaXQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydF9zaHV0ZG93bl9pcnEoaXQtPmlycSk7CisJcnRfZnJlZV9nbG9iYWxfaXJxKGl0LT5pcnEpOworCXJldHVybiAwOworfQorI2Vsc2UKKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBydF9yZXF1ZXN0X2dsb2JhbF9pcnFfYXJnKGl0LT5pcnEsIGl0LT5oYW5kbGVyLCBpdC0+ZmxhZ3MsCisJCWl0LT5kZXZpY2UsIGl0LT5kZXZfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXJ0X3ByaW50aygicnRfcmVxdWVzdF9nbG9iYWxfaXJxX2FyZygpIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlydF9zdGFydHVwX2lycShpdC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0X3NodXRkb3duX2lycShpdC0+aXJxKTsKKwlydF9mcmVlX2dsb2JhbF9pcnEoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKQoreworCXJ0X21vdW50X3J0YWkoKTsKKwlydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCXJ0X3Vtb3VudF9ydGFpKCk7CisJcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisKKyNlbmRpZgorCisvKiBGdXNpb24gc2VjdGlvbiAqLworI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisKK3N0YXRpYyB2b2lkIGZ1c2lvbl9oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0ID0gY29va2llOworCisJaXQtPmhhbmRsZXIoaXJxLCBpdC0+ZGV2X2lkIFBUX1JFR1NfTlVMTCk7CisJcnRoYWxfaXJxX2VuYWJsZShpcnEpOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRoYWxfaXJxX3JlcXVlc3QoaXQtPmlycSwgZnVzaW9uX2hhbmRsZV9pcnEsIGl0KTsKKwlydGhhbF9pcnFfZW5hYmxlKGl0LT5pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0aGFsX2lycV9kaXNhYmxlKGl0LT5pcnEpOworCXJ0aGFsX2lycV9yZWxlYXNlKGl0LT5pcnEpOworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJcnRfcGVuZF90cV9pbml0KCk7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCkKK3sKKwlydF9wZW5kX3RxX2NsZWFudXAoKTsKK30KKworI2VuZGlmIC8qQ09ORklHX0NPTUVESV9GVVNJT04gKi8KKworLyogUlRMaW51eCBzZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKworc3RhdGljIHVuc2lnbmVkIGludCBoYW5kbGVfcnRsX2lycSh1bnNpZ25lZCBpbnQgaXJxIFBUX1JFR1NfQVJHKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2lycV07CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiAwOworCWl0LT5oYW5kbGVyKGlycSwgaXQtPmRldl9pZCBQVF9SRUdTX05VTEwpOworCXJ0bF9oYXJkX2VuYWJsZV9pcnEoaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0bF9yZXF1ZXN0X2dsb2JhbF9pcnEoaXQtPmlycSwgaGFuZGxlX3J0bF9pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0bF9mcmVlX2dsb2JhbF9pcnEoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCkKK3sKKwlydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCXJ0X3BlbmRfdHFfY2xlYW51cCgpOworfQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfUElSUQorc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCWludCByZXQ7CisKKwlmcmVlX2lycShpdC0+aXJxLCBpdC0+ZGV2X2lkKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpdC0+aXJxLCBpdC0+aGFuZGxlciwgaXQtPmZsYWdzIHwgU0FfUFJJT1JJVFksCisJCWl0LT5kZXZpY2UsIGl0LT5kZXZfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlpbnQgcmV0OworCisJZnJlZV9pcnEoaXQtPmlycSwgaXQtPmRldl9pZCk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPmlycSwgaXQtPmhhbmRsZXIsIGl0LT5mbGFncywKKwkJaXQtPmRldmljZSwgaXQtPmRldl9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJLy9ydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCS8vcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5jCkBAIC0wLDAgKzEsMTEzIEBACisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisvKiBydF9wZW5kX3RxLmMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCS8vIGZvciBydCBzcGlubG9ja3MKKyNpbmNsdWRlICJydF9wZW5kX3RxLmgiCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisjaW5jbHVkZSA8cnRhaS5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKyNpbmNsdWRlIDxudWNsZXVzL2FzbS9oYWwuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisjaW5jbHVkZSA8cnRsX2NvcmUuaD4KKyNlbmRpZgorCisjaWZkZWYgc3RhbmRhbG9uZQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2RlZmluZSBydF9wZW5kX3RxX2luaXQgaW5pdF9tb2R1bGUKKyNkZWZpbmUgcnRfcGVuZF90cV9jbGVhbnVwIGNsZWFudXBfbW9kdWxlCisjZW5kaWYKKwordm9sYXRpbGUgc3RhdGljIHN0cnVjdCBydF9wZW5kX3RxIHJ0X3BlbmRfdHFbUlRfUEVORF9UUV9TSVpFXTsKK3ZvbGF0aWxlIHN0YXRpYyBzdHJ1Y3QgcnRfcGVuZF90cSAqdm9sYXRpbGUgcnRfcGVuZF9oZWFkID0gcnRfcGVuZF90cSwKKwkqdm9sYXRpbGUgcnRfcGVuZF90YWlsID0gcnRfcGVuZF90cTsKK2ludCBydF9wZW5kX3RxX2lycSA9IDA7CitzcGlubG9ja190IHJ0X3BlbmRfdHFfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworLy8gV0FSTklORzogZm9sbG93aW5nIGNvZGUgbm90IGNoZWNrZWQgYWdhaW5zdCByYWNlIGNvbmRpdGlvbnMgeWV0LgorI2RlZmluZSBJTkNfQ0lSQ1VMQVJfUFRSKHB0cixiZWdpbixzaXplKSBkbyB7aWYoKysocHRyKT49KGJlZ2luKSsoc2l6ZSkpIChwdHIpPShiZWdpbik7IH0gd2hpbGUoMCkKKyNkZWZpbmUgREVDX0NJUkNVTEFSX1BUUihwdHIsYmVnaW4sc2l6ZSkgZG8ge2lmKC0tKHB0cik8KGJlZ2luKSkgKHB0cik9KGJlZ2luKSsoc2l6ZSktMTsgfSB3aGlsZSgwKQorCitpbnQgcnRfcGVuZF9jYWxsKHZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpLCBpbnQgYXJnMSwgdm9pZCAqYXJnMikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZ1bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJ0X3BlbmRfdHFfaXJxIDw9IDApCisJCXJldHVybiAtRU5PREVWOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisJSU5DX0NJUkNVTEFSX1BUUihydF9wZW5kX2hlYWQsIHJ0X3BlbmRfdHEsIFJUX1BFTkRfVFFfU0laRSk7CisJaWYgKHJ0X3BlbmRfaGVhZCA9PSBydF9wZW5kX3RhaWwpIHsKKwkJLy8gb3ZlcmZsb3csIHdlIGp1c3QgcmVmdXNlIHRvIHRha2UgdGhpcyByZXF1ZXN0CisJCURFQ19DSVJDVUxBUl9QVFIocnRfcGVuZF9oZWFkLCBydF9wZW5kX3RxLCBSVF9QRU5EX1RRX1NJWkUpOworCQljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlydF9wZW5kX2hlYWQtPmZ1bmMgPSBmdW5jOworCXJ0X3BlbmRfaGVhZC0+YXJnMSA9IGFyZzE7CisJcnRfcGVuZF9oZWFkLT5hcmcyID0gYXJnMjsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisJcnRfcGVuZF9saW51eF9zcnEocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKwlydGhhbF9hcGNfc2NoZWR1bGUocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKwlydGxfZ2xvYmFsX3BlbmRfaXJxKHJ0X3BlbmRfdHFfaXJxKTsKKworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKK3ZvaWQgcnRfcGVuZF9pcnFfaGFuZGxlcih2b2lkKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKK3ZvaWQgcnRfcGVuZF9pcnFfaGFuZGxlcih2b2lkICpjb29raWUpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQordm9pZCBydF9wZW5kX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldiBQVF9SRUdTX0FSRykKKyNlbmRpZgoreworCXdoaWxlIChydF9wZW5kX2hlYWQgIT0gcnRfcGVuZF90YWlsKSB7CisJCUlOQ19DSVJDVUxBUl9QVFIocnRfcGVuZF90YWlsLCBydF9wZW5kX3RxLCBSVF9QRU5EX1RRX1NJWkUpOworCQlydF9wZW5kX3RhaWwtPmZ1bmMocnRfcGVuZF90YWlsLT5hcmcxLCBydF9wZW5kX3RhaWwtPmFyZzIpOworCX0KK30KKworaW50IHJ0X3BlbmRfdHFfaW5pdCh2b2lkKQoreworCXJ0X3BlbmRfaGVhZCA9IHJ0X3BlbmRfdGFpbCA9IHJ0X3BlbmRfdHE7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisJcnRfcGVuZF90cV9pcnEgPSBydF9yZXF1ZXN0X3NycSgwLCBydF9wZW5kX2lycV9oYW5kbGVyLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisJcnRfcGVuZF90cV9pcnEgPQorCQlydGhhbF9hcGNfYWxsb2MoImNvbWVkaSBBUEMiLCBydF9wZW5kX2lycV9oYW5kbGVyLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisJcnRfcGVuZF90cV9pcnEgPSBydGxfZ2V0X3NvZnRfaXJxKHJ0X3BlbmRfaXJxX2hhbmRsZXIsICJydF9wZW5kX2lycSIpOworI2VuZGlmCisJaWYgKHJ0X3BlbmRfdHFfaXJxID4gMCkKKwkJcHJpbnRrKCJydF9wZW5kX3RxOiBSVCBib3R0b20gaGFsZiBzY2hlZHVsZXIgaW5pdGlhbGl6ZWQgT0tcbiIpOworCWVsc2UKKwkJcHJpbnRrKCJydF9wZW5kX3RxOiBydGxfZ2V0X3NvZnRfaXJxIGZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRfcGVuZF90cV9jbGVhbnVwKHZvaWQpCit7CisJcHJpbnRrKCJydF9wZW5kX3RxOiB1bmxvYWRpbmdcbiIpOworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorCXJ0X2ZyZWVfc3JxKHJ0X3BlbmRfdHFfaXJxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisJcnRoYWxfYXBjX2ZyZWUocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKwlmcmVlX2lycShydF9wZW5kX3RxX2lycSwgTlVMTCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDcxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgUlRfUEVORF9UUV9TSVpFIDE2CitzdHJ1Y3QgcnRfcGVuZF90cSB7CisJdm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMik7CisJaW50IGFyZzE7CisJdm9pZCAqYXJnMjsKK307CitleHRlcm4gaW50IHJ0X3BlbmRfY2FsbCh2b2lkICgqZnVuYykgKGludCBhcmcxLCB2b2lkICphcmcyKSwgaW50IGFyZzEsCisJdm9pZCAqYXJnMik7CitleHRlcm4gaW50IHJ0X3BlbmRfdHFfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJ0X3BlbmRfdHFfY2xlYW51cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvd3JhcHBlci5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS93cmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmYzY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvd3JhcHBlci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgICAgbGludXgvd3JhcHBlci5oIGNvbXBhdGliaWxpdHkgaGVhZGVyCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQ09NUEFUX0xJTlVYX1dSQVBQRVJfSF8KKyNkZWZpbmUgX19DT01QQVRfTElOVVhfV1JBUFBFUl9IXworCisjZGVmaW5lIG1lbV9tYXBfcmVzZXJ2ZShwKSAgICAgIHNldF9iaXQoUEdfcmVzZXJ2ZWQsICYoKHApLT5mbGFncykpCisjZGVmaW5lIG1lbV9tYXBfdW5yZXNlcnZlKHApICAgIGNsZWFyX2JpdChQR19yZXNlcnZlZCwgJigocCktPmZsYWdzKSkKKworI2VuZGlmIC8qIF9fQ09NUEFUX0xJTlVYX1dSQVBQRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCmluZGV4IDFjYTA5YWYuLmY2ZDg1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETwpAQCAtMSw3ICsxLDUgQEAKIFRPRE86CiAJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCi0JLSBMaW5kZW50Ci0JLSB0eXBlZGVmIHJlbW92YWxzCiAJLSBoYW5kbGUgYml0X29wZXJhdGlvbnMuaCAobWVyZ2UgaW4gb3IgbWFrZSBwYXJ0IG9mIGNvbW1vbiBjb2RlPykKIAktIHJlbW92ZSBwcm9jIGludGVyZmFjZSwgb25seSB1c2UgZWNoby5oIGludGVyZmFjZSAocHJvYyBpbnRlcmZhY2UgaXMKIAkgIHJhY3kgYW5kIG5vdCBjb3JyZWN0LikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaAppbmRleCA5ZmI5NTQzLi4zNGZiODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCkBAIC0xNDksOCArMTQ5LDggQEAKIAlpbnQgTGJnbiwgTGJnbl9hY2MsIExiZ25fdXBwZXIsIExiZ25fdXBwZXJfYWNjOwogCiAJLyogZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBmaWx0ZXIgc3RhdGVzICovCi0JZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGU7Ci0JZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGVfYmc7CisJc3RydWN0IGZpcjE2X3N0YXRlX3QgZmlyX3N0YXRlOworCXN0cnVjdCBmaXIxNl9zdGF0ZV90IGZpcl9zdGF0ZV9iZzsKIAlpbnQxNl90ICpmaXJfdGFwczE2WzJdOwogCiAJLyogREMgYmxvY2tpbmcgZmlsdGVyIHN0YXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmggYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaAppbmRleCA1NjQ1Y2IxLi5kMzVmMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaApAQCAtNzIsMzcgKzcyLDM3IEBACiAgICAgMTYgYml0IGludGVnZXIgRklSIGRlc2NyaXB0b3IuIFRoaXMgZGVmaW5lcyB0aGUgd29ya2luZyBzdGF0ZSBmb3IgYSBzaW5nbGUKICAgICBpbnN0YW5jZSBvZiBhbiBGSVIgZmlsdGVyIHVzaW5nIDE2IGJpdCBpbnRlZ2VyIGNvZWZmaWNpZW50cy4KICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgZmlyMTZfc3RhdGVfdCB7CiAJaW50IHRhcHM7CiAJaW50IGN1cnJfcG9zOwogCWNvbnN0IGludDE2X3QgKmNvZWZmczsKIAlpbnQxNl90ICpoaXN0b3J5OwotfSBmaXIxNl9zdGF0ZV90OworfTsKIAogLyohCiAgICAgMzIgYml0IGludGVnZXIgRklSIGRlc2NyaXB0b3IuIFRoaXMgZGVmaW5lcyB0aGUgd29ya2luZyBzdGF0ZSBmb3IgYSBzaW5nbGUKICAgICBpbnN0YW5jZSBvZiBhbiBGSVIgZmlsdGVyIHVzaW5nIDMyIGJpdCBpbnRlZ2VyIGNvZWZmaWNpZW50cywgYW5kIGZpbHRlcmluZwogICAgIDE2IGJpdCBpbnRlZ2VyIGRhdGEuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGZpcjMyX3N0YXRlX3QgewogCWludCB0YXBzOwogCWludCBjdXJyX3BvczsKIAljb25zdCBpbnQzMl90ICpjb2VmZnM7CiAJaW50MTZfdCAqaGlzdG9yeTsKLX0gZmlyMzJfc3RhdGVfdDsKK307CiAKIC8qIQogICAgIEZsb2F0aW5nIHBvaW50IEZJUiBkZXNjcmlwdG9yLiBUaGlzIGRlZmluZXMgdGhlIHdvcmtpbmcgc3RhdGUgZm9yIGEgc2luZ2xlCiAgICAgaW5zdGFuY2Ugb2YgYW4gRklSIGZpbHRlciB1c2luZyBmbG9hdGluZyBwb2ludCBjb2VmZmljaWVudHMgYW5kIGRhdGEuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGZpcl9mbG9hdF9zdGF0ZV90IHsKIAlpbnQgdGFwczsKIAlpbnQgY3Vycl9wb3M7CiAJY29uc3QgZmxvYXQgKmNvZWZmczsKIAlmbG9hdCAqaGlzdG9yeTsKLX0gZmlyX2Zsb2F0X3N0YXRlX3Q7Cit9OwogCi1zdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIxNl9jcmVhdGUoZmlyMTZfc3RhdGVfdCAqIGZpciwKK3N0YXRpYyBfX2lubGluZV9fIGNvbnN0IGludDE2X3QgKmZpcjE2X2NyZWF0ZShzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyLAogCQkJCQkgICAgICBjb25zdCBpbnQxNl90ICogY29lZmZzLCBpbnQgdGFwcykKIHsKIAlmaXItPnRhcHMgPSB0YXBzOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJcmV0dXJuIGZpci0+aGlzdG9yeTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mbHVzaChmaXIxNl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mbHVzaChzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyKQogewogI2lmIGRlZmluZWQoVVNFX01NWCkgIHx8ICBkZWZpbmVkKFVTRV9TU0UyKSB8fCBkZWZpbmVkKF9fYmZpbl9fKQogCW1lbXNldChmaXItPmhpc3RvcnksIDAsIDIgKiBmaXItPnRhcHMgKiBzaXplb2YoaW50MTZfdCkpOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mcmVlKGZpcjE2X3N0YXRlX3QgKiBmaXIpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjE2X2ZyZWUoc3RydWN0IGZpcjE2X3N0YXRlX3QgKmZpcikKIHsKIAlrZnJlZShmaXItPmhpc3RvcnkpOwogfQpAQCAtMTU3LDE5ICsxNTcsMTkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQxNl90IGZpcjE2KGZpcjE2X3N0YXRlX3QgKiBmaXIsIGludDE2X3Qgc2FtcGxlKQorc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIxNihzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyLCBpbnQxNl90IHNhbXBsZSkKIHsKIAlpbnQzMl90IHk7CiAjaWYgZGVmaW5lZChVU0VfTU1YKQogCWludCBpOwotCW1teF90ICptbXhfY29lZmZzOwotCW1teF90ICptbXhfaGlzdDsKKwl1bmlvbiBtbXhfdCAqbW14X2NvZWZmczsKKwl1bmlvbiBtbXhfdCAqbW14X2hpc3Q7CiAKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc10gPSBzYW1wbGU7CiAJZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3MgKyBmaXItPnRhcHNdID0gc2FtcGxlOwogCi0JbW14X2NvZWZmcyA9IChtbXhfdCAqKSBmaXItPmNvZWZmczsKLQltbXhfaGlzdCA9IChtbXhfdCAqKSAmIGZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXTsKKwltbXhfY29lZmZzID0gKHVuaW9uIG1teF90ICopZmlyLT5jb2VmZnM7CisJbW14X2hpc3QgPSAodW5pb24gbW14X3QgKikmZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOwogCWkgPSBmaXItPnRhcHM7CiAJcHhvcl9yMnIobW00LCBtbTQpOwogCS8qIDggc2FtcGxlcyBwZXIgaXRlcmF0aW9uLCBzbyB0aGUgZmlsdGVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGxvbmcuICovCkBAIC0xOTMsMTQgKzE5MywxNCBAQAogCWVtbXMoKTsKICNlbGlmIGRlZmluZWQoVVNFX1NTRTIpCiAJaW50IGk7Ci0JeG1tX3QgKnhtbV9jb2VmZnM7Ci0JeG1tX3QgKnhtbV9oaXN0OworCXVuaW9uIHhtbV90ICp4bW1fY29lZmZzOworCXVuaW9uIHhtbV90ICp4bW1faGlzdDsKIAogCWZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXSA9IHNhbXBsZTsKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3BvcyArIGZpci0+dGFwc10gPSBzYW1wbGU7CiAKLQl4bW1fY29lZmZzID0gKHhtbV90ICopIGZpci0+Y29lZmZzOwotCXhtbV9oaXN0ID0gKHhtbV90ICopICYgZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOworCXhtbV9jb2VmZnMgPSAodW5pb24geG1tX3QgKilmaXItPmNvZWZmczsKKwl4bW1faGlzdCA9ICh1bmlvbiB4bW1fdCAqKSZmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc107CiAJaSA9IGZpci0+dGFwczsKIAlweG9yX3Iycih4bW00LCB4bW00KTsKIAkvKiAxNiBzYW1wbGVzIHBlciBpdGVyYXRpb24sIHNvIHRoZSBmaWx0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGxvbmcuICovCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlyZXR1cm4gKGludDE2X3QpICh5ID4+IDE1KTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gY29uc3QgaW50MTZfdCAqZmlyMzJfY3JlYXRlKGZpcjMyX3N0YXRlX3QgKiBmaXIsCitzdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIzMl9jcmVhdGUoc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpciwKIAkJCQkJICAgICAgY29uc3QgaW50MzJfdCAqIGNvZWZmcywgaW50IHRhcHMpCiB7CiAJZmlyLT50YXBzID0gdGFwczsKQEAgLTI2MCwxNyArMjYwLDE3IEBACiAJcmV0dXJuIGZpci0+aGlzdG9yeTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mbHVzaChmaXIzMl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mbHVzaChzdHJ1Y3QgZmlyMzJfc3RhdGVfdCAqZmlyKQogewogCW1lbXNldChmaXItPmhpc3RvcnksIDAsIGZpci0+dGFwcyAqIHNpemVvZihpbnQxNl90KSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMzJfZnJlZShmaXIzMl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mcmVlKHN0cnVjdCBmaXIzMl9zdGF0ZV90ICpmaXIpCiB7CiAJa2ZyZWUoZmlyLT5oaXN0b3J5KTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIzMihmaXIzMl9zdGF0ZV90ICogZmlyLCBpbnQxNl90IHNhbXBsZSkKK3N0YXRpYyBfX2lubGluZV9fIGludDE2X3QgZmlyMzIoc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpciwgaW50MTZfdCBzYW1wbGUpCiB7CiAJaW50IGk7CiAJaW50MzJfdCB5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vbW14LmggYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaAppbmRleCAzNTQxMmVmLi40NGU1Y2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaApAQCAtMjcsNyArMjcsNyBAQAogICogdmFsdWVzIGJ5IFVMTCwgbGVzdCB0aGV5IGJlIHRydW5jYXRlZCBieSB0aGUgY29tcGlsZXIpCiAgKi8KIAotdHlwZWRlZiB1bmlvbiB7Cit1bmlvbiBtbXhfdCB7CiAJbG9uZyBsb25nIHE7CQkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyB1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KIAlpbnQgZFsyXTsJCS8qIDIgRG91Ymxld29yZCAoMzItYml0KSB2YWx1ZXMgKi8KQEAgLTM3LDEyICszNywxMiBAQAogCWNoYXIgYls4XTsJCS8qIDggQnl0ZSAoOC1iaXQpIHZhbHVlcyAqLwogCXVuc2lnbmVkIGNoYXIgdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLwogCWZsb2F0IHNbMl07CQkvKiBTaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIHZhbHVlICovCi19IG1teF90OwkJCS8qIE9uIGFuIDgtYnl0ZSAoNjQtYml0KSBib3VuZGFyeSAqLworfTsJCQkJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCiAKIC8qIFNTRSByZWdpc3RlcnMgKi8KLXR5cGVkZWYgdW5pb24gewordW5pb24geG1tX3QgewogCWNoYXIgYlsxNl07Ci19IHhtbV90OworfTsKIAogI2RlZmluZSAgICAgICAgIG1teF9pMnIob3AsaW1tLHJlZykgXAogICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvQmVuY2htYXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0JlbmNobWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGVlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0JlbmNobWFyay5oCkBAIC0wLDAgKzEsNDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaGVhZGVyIGZpbGUgZm9yIGJlbmNobWFya2luZworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEJlbmNobWFyay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzE2IGQuay46ICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9CRU5DSE1BUktfSF8KKyNkZWZpbmUgX0JFTkNITUFSS19IXworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTk9fT1NfKSAmJiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisKKy8vICAgICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2lmZGVmIENPTkZJR19DT0xERklSRQorI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9tNTQ4NWdwaW8uaD4KKworI2RlZmluZSBCRU5DSE1BUktfU0VUKHgpICAgIE1DRl9HUElPX1BPRFJfUENJQkcgfD0gKDEgPDwgKHgpKQkvLyAoeCsxKQorI2RlZmluZSBCRU5DSE1BUktfUkVTRVQoeCkgIE1DRl9HUElPX1BPRFJfUENJQkcgJj0gfigxIDw8ICh4KSkJLy8gKHgrMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1RPR0dMRSh4KSBNQ0ZfR1BJT19QT0RSX1BDSUJSIF49ICgxIDw8ICh4IC0gNSkpCisjZWxzZQorI3VuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAweDAwMDAwMDAwCisjZW5kaWYKKworI2Vsc2UKKyAgICAvLyBkaXNhYmxlIEJlbmNobWFya2luZworI3VuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1ICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4ICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTkgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMCAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjIgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMyAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0ICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjUgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3ICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjggICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzEgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMiAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzAyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDMpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA1KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDYpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDkpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTBfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTEpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTFfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzEyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xM19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTNfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTQpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTRfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE1KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xNikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTZfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTcpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTdfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xOSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTlfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjApCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjBfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzIxKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yMikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjJfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjMpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjNfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI0KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yNSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjVfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjYpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjZfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI3KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yN19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yOCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjkpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjlfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzMwKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8zMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMzIpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzJfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9SRVNFVCh4KQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIF9CRU5DSE1BUktfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWRlOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9EZWJ1Zy5oCkBAIC0wLDAgKzEsNzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgRGVidWcgaW50ZXJmYWNlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRGVidWcuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0RFQlVHX0hfCisjZGVmaW5lIF9ERUJVR19IXworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGltcG9ydGFudCBmb3IgbGV2ZWwtZGVidWcgdHJhY2VzLgorLy8gQSBtYWNybyBERUJVR19HTEJfTFZMKCkgZGVmaW5lcyB0aGUgY3VycmVudCBkZWJ1Zy1sZXZlbCB1c2luZyBmb2xsb3dpbmcgYmlzLgorLy8gSWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldCB0aGVuIHRyYWNlIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIG91dAorLy8gKG9ubHkgaWYgTkRFQlVHIGlzIG5vdCBkZWZpbmVkKS4gVGhlIHVwcGVyIGRlYnVnLWxldmVscyBhcmUgcmVzZXJ2ZWQgZm9yCisvLyB0aGUgZGVidWctbGV2ZWxzIEFMV0FZUywgRVJST1IgYW5kIEFTU0VSVC4KKyNkZWZpbmUgREVCVUdfTFZMXzAxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIERFQlVHX0xWTF8wMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBERUJVR19MVkxfMDMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgREVCVUdfTFZMXzA0ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERFQlVHX0xWTF8wNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBERUJVR19MVkxfMDYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgREVCVUdfTFZMXzA3ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIERFQlVHX0xWTF8wOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBERUJVR19MVkxfMDkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgREVCVUdfTFZMXzEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERFQlVHX0xWTF8xMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBERUJVR19MVkxfMTIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgREVCVUdfTFZMXzEzICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBERUJVR19MVkxfMTUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE2ICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBERUJVR19MVkxfMTggICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE5ICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMCAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBERUJVR19MVkxfMjEgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzIyICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMyAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjQgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI1ICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yNiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjcgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI4ICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVMgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBtYWNyb3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIG1hY3JvIGRlZmluZXMgYSB2ZXJzaW9uIHN0cmluZworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIG1hY3JvIGRlZmluZXMgYSBidWlsZCBpbmZvIHN0cmluZyAoZS5nLiBmb3IgdXNpbmcgaW4gcHJpbnRmKCkpCisjZGVmaW5lIERFQlVHX01BS0VfQlVJTERfSU5GTyhwcmVmaXgscHJvZHVjdCxwcm9kaWQsZGVzY3IsdmVyc3RyLGF1dGhvcikgIlxuIiBcCisgICAgcHJlZml4ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIgXAorICAgIHByZWZpeCAiUHJvamVjdDogICAiIHByb2R1Y3QgIiwgIiBwcm9kaWQgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIkRlc2NyaXB0LjogIiBkZXNjciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICJBdXRob3I6ICAgICIgYXV0aG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiRGF0ZTogICAgICAiIF9fREFURV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIlZlcnNpb246ICAgIiB2ZXJzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIGRlZmF1bHQgZGVidWctbGV2ZWwgaXM6IEVSUk9SIGFuZCBBTFdBWVMuCisvLyBZb3UgY2FuIGRlZmluZSBhbiBvdGhlciBkZWJ1Zy1sZXZlbCBpbiBwcm9qZWN0IHNldHRpbmdzLgorI2lmbmRlZiBERUZfREVCVUdfTFZMCisjZGVmaW5lIERFRl9ERUJVR19MVkwgICAgICAgICAgICAgICAgICAgKERFQlVHX0xWTF9BTFdBWVMgfCBERUJVR19MVkxfRVJST1IpCisjZW5kaWYKKyNpZm5kZWYgREVCVUdfR0xCX0xWTAorI2RlZmluZSBERUJVR19HTEJfTFZMKCkgICAgICAgICAgICAgICAgIChERUZfREVCVUdfTFZMKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKERFVl9TWVNURU0gPT0gX0RFVl9XSU4zMl8pICYmIGRlZmluZWQgKFRSQUNFX01TRykKKworICAgIC8vIEZvciBXSU4zMiB0aGUgbWFjcm8gREVCVUdfVFJBQ0UwIGNhbiBiZSBkZWZpbmVkIGFzIGZ1bmN0aW9uIGNhbGwgVHJhY2VMdmwoKQorICAgIC8vIG9yIGFzIG1hY3JvIFRSQUNFKCkuCisgICAgLy8KKyAgICAvLyBIZXJlIHRoZSBwYXJhbWV0ZXIgJ2x2bCcgY2FuIGJlIHVzZWQgd2l0aCBtb3JlIHRoYW4gb25lCisgICAgLy8gZGVidWctbGV2ZWwgKHVzaW5nIE9SKS4KKyAgICAvLworICAgIC8vIEV4YW1wbGU6IERFQlVHX1RSQUNFMShERUJVR19MVkxfMzAgfCBERUJVR19MVkxfMDIsICJIZWxsbyAlZCIsIGJDb3VudCk7CisKKyNkZWZpbmUgREVCVUdfVFJBQ0UwKGx2bCxzdHIpICAgICAgICAgICAgICAgVHJhY2VMdmwoKGx2bCksc3RyKQorI2RlZmluZSBERUJVR19UUkFDRTEobHZsLHN0cixwMSkgICAgICAgICAgICBUcmFjZUx2bCgobHZsKSxzdHIscDEpCisjZGVmaW5lIERFQlVHX1RSQUNFMihsdmwsc3RyLHAxLHAyKSAgICAgICAgIFRyYWNlTHZsKChsdmwpLHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfVFJBQ0UzKGx2bCxzdHIscDEscDIscDMpICAgICAgVHJhY2VMdmwoKGx2bCksc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19UUkFDRTQobHZsLHN0cixwMSxwMixwMyxwNCkgICBUcmFjZUx2bCgobHZsKSxzdHIscDEscDIscDMscDQpCisjZGVmaW5lIERFQlVHX0dMQl9MVkwoKSAgICAgICAgICAgICAgICAgICAgIGR3RGVidWdMZXZlbF9nCisKKyNlbHNlCisKKyAgICAvLyBBdCBtaWNyb2NvbnRyb2xsZXJzIHdlIGRvIHJlZHVjZSB0aGUgbWVtb3J5IHVzYWdlIGJ5IGRlbGV0aW5nIERFQlVHX1RSQUNFLWxpbmVzCisgICAgLy8gKGNvbXBpbGVyIGRvZXMgZGVsZXRlIHRoZSBsaW5lcykuCisgICAgLy8KKyAgICAvLyBIZXJlIHRoZSBwYXJhbWV0ZXIgJ2x2bCcgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9uZSBkZWJ1Zy1sZXZlbC4KKyAgICAvLworICAgIC8vIEV4YW1wbGU6IERFQlVHX1RSQUNFMShERUJVR19MVkxfRVJST1IsICJlcnJvciBjb2RlICVkIiwgZHdSZXQpOworCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BTFdBWVMpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfRVJST1IpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FTU0VSVCkKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yOSkKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjgpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI3KQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yNikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjUpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI0KQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMykKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzIxKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMCkKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTkpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE4KQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNykKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTYpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE1KQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNCkKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTMpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzEyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xMSkKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTApCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA5KQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wOCkKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDcpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA2KQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wNSkKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDQpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzAzKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wMikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNkZWZpbmUgREVCVUdfVFJBQ0UwKGx2bCxzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfVFJBQ0UxKGx2bCxzdHIscDEpICAgICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfVFJBQ0UyKGx2bCxzdHIscDEscDIpICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfVFJBQ0UzKGx2bCxzdHIscDEscDIscDMpICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfVFJBQ0U0KGx2bCxzdHIscDEscDIscDMscDQpICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgbWFjcm8gREVCVUdfRFVNUF9EQVRBKCkgY2FuIGJlIHVzZWQgd2l0aCB0aGUgc2FtZSBkZWJ1Zy1sZXZlbHMgdG8gZHVtcAorLy8gb3V0IGRhdGEgYnl0ZXMuIEZ1bmN0aW9uIER1bXBEYXRhKCkgaGFzIHRvIGJlIGluY2x1ZGVkLgorLy8gTk9URTogRFVNUF9EQVRBIGhhcyB0byBiZSBkZWZpbmVkIGluIHByb2plY3Qgc2V0dGluZ3MuCisjaWYgKCFkZWZpbmVkIChOREVCVUcpICYmIGRlZmluZWQgKERVTVBfREFUQSkpIHx8IChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwl2b2lkIER1bXBEYXRhKGNoYXIgKnN6U3RyX3AsIEJZVEUgTUVNICogcGJEYXRhX3AsIFdPUkQgd1NpemVfcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQkJCQkvLyB2b24gZXh0ZXJuICJDIgorI2VuZGlmCisjZGVmaW5lIERFQlVHX0RVTVBfREFUQShsdmwsc3RyLHB0cixzaXopICAgIGlmICgoREVCVUdfR0xCX0xWTCgpICYgKGx2bCkpPT0obHZsKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXBEYXRhIChzdHIsIChCWVRFIE1FTSopIChwdHIpLCAoV09SRCkgKHNpeikpOworI2Vsc2UKKworI2RlZmluZSBERUJVR19EVU1QX0RBVEEobHZsLHN0cixwdHIsc2l6KQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBtYWNybyBERUJVR19BU1NFUlQoKSBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgYW4gZXJyb3Igc3RyaW5nIGlmIHRoZQorLy8gcGFyYW1ldGVyZWQgZXhwcmVzaW9uIGRvZXMgbm90IHJlc3VsdCBUUlVFLgorLy8gTk9URTogSWYgREVCVUdfS0VFUF9BU1NFUlQgaXMgZGVmaW5lZCwgdGhlbiBERUJVR19BU1NFUlQtbGluZSB3aWxsIG5vdCBiZQorLy8gICAgICAgZGVsZXRlZCBmcm9tIGNvbXBpbGVyIChpbiByZWxlYXNlIHZlcnNpb24gdG9vKS4KKyNpZiAhZGVmaW5lZCAoTkRFQlVHKSB8fCBkZWZpbmVkIChERUJVR19LRUVQX0FTU0VSVCkKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKQorCisJLy8gRm9yIFdJTjMyIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgYWZ0ZXIgY2xvc2luZyBtZXNzYWdlIGJveC4KKworI2RlZmluZSBERUJVR19BU1NFUlQwKGV4cHIsc3RyKSAgICAgICAgIGlmICghKGV4cHIgKSAmJiAoKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BU1NFUlQpIT0wKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAiIF9fTElORV9fICIgZmlsZSAiIF9fRklMRV9fIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICAgIC0+ICIgc3RyICJcbiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdFByb2Nlc3MgKC0xKTsgfQorCisjZGVmaW5lIERFQlVHX0FTU0VSVDEoZXhwcixzdHIscDEpICAgICAgaWYgKCEoZXhwciApICYmICgoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FTU0VSVCkhPTApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgX19MSU5FX18gIiBmaWxlICIgX19GSUxFX18gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gICAgLT4gIiBzdHIgIlxuIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0UHJvY2VzcyAoLTEpOyB9CisKKyNlbHNlCisKKwkvLyBGb3IgbWljcm9jb250cm9sbGVycyBwcm9jZXNzIHdpbGwgYmUgc3RvcHBlZCB1c2luZyBlbmRsZXNzIGxvb3AuCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMChleHByLHN0cikgICAgICAgICBpZiAoIShleHByICkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UzICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICclcydcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIC0+ICclcydcbiIsIF9fTElORV9fLCBfX0ZJTEVfXywgc3RyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgfQorCisjZGVmaW5lIERFQlVHX0FTU0VSVDEoZXhwcixzdHIscDEpICAgICAgaWYgKCEoZXhwciApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFNCAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAnJXMnXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAtPiAnJXMnXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAtPiAweCUwOGxYXG4iLCBfX0xJTkVfXywgX19GSUxFX18sIHN0ciwgKERXT1JEKSBwMSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7IH0KKworI2VuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMChleHByLHN0cikKKyNkZWZpbmUgREVCVUdfQVNTRVJUMShleHByLHN0cixwMSkKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgbWFjcm8gREVCVUdfT05MWSgpIGltcGxlbWVudHMgY29kZSwgaWYgTkRFQlVHIGlzIG5vdCBkZWZpbmVkLgorI2lmICFkZWZpbmVkIChERUJVR19PTkxZKQorI2lmICFkZWZpbmVkIChOREVCVUcpCisKKyNkZWZpbmUgREVCVUdfT05MWShleHByKSAgICBleHByCisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfT05MWShleHByKQorCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLy8gX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhYjRhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydjgxMzkuYwpAQCAtMCwwICsxLDEyNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBFdGhlcm5ldCBkcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODEzOSBjaGlwcworICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGUgUlRMODEzOUMrLCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIFR4IGRlc2NyaXB0b3IgaGFuZGxpbmcuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydjgxMzkuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwOC8wMi8wNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJlZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBCdWZmZXIgaGFuZGxpbmc6CisvLyBBbGwgYnVmZmVycyBhcmUgY3JlYXRlZCBzdGF0aWNhbGx5IChpLmUuIGF0IGNvbXBpbGUgdGltZSByZXNwLiBhdAorLy8gaW5pdGlhbGlzYXRpb24gdmlhIGttYWxsb2MoKSApIGFuZCBub3QgZHluYW1pY2FsbHkgb24gcmVxdWVzdCAoaS5lLiB2aWEKKy8vIEVkcnZBbGxvY1R4TXNnQnVmZmVyKCkuCisvLyBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcigpIHNlYXJjaGVzIGZvciBhbiB1bnVzZWQgYnVmZmVyIHdoaWNoIGlzIGxhcmdlIGVub3VnaC4KKy8vIEVkcnZJbml0KCkgbWF5IGFsbG9jYXRlIHNvbWUgYnVmZmVycyB3aXRoIHNpemVzIGxlc3MgdGhhbiBtYXhpbXVtIGZyYW1lCisvLyBzaXplIChpLmUuIDE1MTQgYnl0ZXMpLCBlLmcuIGZvciBTb0MsIFNvQSwgU3RhdHVzUmVzcG9uc2UsIElkZW50UmVzcG9uc2UsCisvLyBOTVQgcmVxdWVzdHMgLyBjb21tYW5kcy4gVGhlIGxlc3MgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0aGUgbGVzcyB0aGUKKy8vIG51bWJlciBvZiB0aGUgYnVmZmVyLgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFRFJWX01BWF9UWF9CVUZGRVJTCisjZGVmaW5lIEVEUlZfTUFYX1RYX0JVRkZFUlMgICAgIDIwCisjZW5kaWYKKworI2RlZmluZSBFRFJWX01BWF9GUkFNRV9TSVpFICAgICAweDYwMAorCisjZGVmaW5lIEVEUlZfUlhfQlVGRkVSX1NJWkUgICAgIDB4ODYxMAkvLyAzMiBrQiArIDE2IEJ5dGUgKyAxLDUga0IgKFdSQVAgaXMgZW5hYmxlZCkKKyNkZWZpbmUgRURSVl9SWF9CVUZGRVJfTEVOR1RIICAgKEVEUlZfUlhfQlVGRkVSX1NJWkUgJiAweEY4MDApCS8vIGJ1ZmZlciBzaXplIGN1dCBkb3duIHRvIDIga0IgYWxpZ25tZW50CisKKyNkZWZpbmUgRURSVl9UWF9CVUZGRVJfU0laRSAgICAgKEVEUlZfTUFYX1RYX0JVRkZFUlMgKiBFRFJWX01BWF9GUkFNRV9TSVpFKQkvLyBuICogKE1UVSArIDE0ICsgNCkKKworI2RlZmluZSBEUlZfTkFNRSAgICAgICAgICAgICAgICAiZXBsIgorCisjZGVmaW5lIEVEUlZfUkVHV19JTlRfTUFTSyAgICAgIDB4M0MJLy8gaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9TVEFUVVMgICAgMHgzRQkvLyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUk9LICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1JFUiAgICAgICAweDAwMDIJLy8gUmVjZWl2ZSBlcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9UT0sgICAgICAgMHgwMDA0CS8vIFRyYW5zbWl0IE9LIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RFUiAgICAgICAweDAwMDgJLy8gVHJhbnNtaXQgZXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUlhPVlcgICAgIDB4MDAxMAkvLyBSeCBidWZmZXIgb3ZlcmZsb3cgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUFVOICAgICAgIDB4MDAyMAkvLyBQYWNrZXQgdW5kZXJydW4vIGxpbmsgY2hhbmdlIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX0ZPVlcgICAgICAweDAwNDAJLy8gUnggRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9MRU5DSEcgICAgMHgyMDAwCS8vIENhYmxlIGxlbmd0aCBjaGFuZ2UgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfVElNRU9VVCAgIDB4NDAwMAkvLyBUaW1lIG91dCBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9TRVJSICAgICAgMHg4MDAwCS8vIFN5c3RlbSBlcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLX0RFRiAgKEVEUlZfUkVHV19JTlRfUk9LIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9SRVIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RPSyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVEVSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9SWE9WVyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfRk9WVyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUFVOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9USU1FT1VUIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9TRVJSKQkvLyBkZWZhdWx0IGludGVycnVwdCBtYXNrCisKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkQgICAgICAgMHgzNwkvLyBjb21tYW5kIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JTVCAgIDB4MTAKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfUkUgICAgMHgwOAorI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9URSAgICAweDA0CisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUgIDB4MDEKKworI2RlZmluZSBFRFJWX1JFR0JfQ01EOTM0NiAgICAgICAweDUwCS8vIDkzQzQ2IGNvbW1hbmQgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyAgMHgwMAkvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisjZGVmaW5lIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyAweEMwCS8vIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSICAgICAgICAgIDB4NDQJLy8gUnggY29uZmlndXJhdGlvbiByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9OT19GVEggICAweDAwMDBFMDAwCS8vIG5vIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfUkJMRU4zMksgMHgwMDAwMTAwMAkvLyAzMiBrQiByZWNlaXZlIGJ1ZmZlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIHVubGltaXRlZCBtYXhpbXVtIERNQSBidXJzdCBzaXplCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PV1JBUCAgIDB4MDAwMDAwODAJLy8gZG8gbm90IHdyYXAgZnJhbWUgYXQgZW5kIG9mIGJ1ZmZlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BRVIgICAgICAweDAwMDAwMDIwCS8vIGFjY2VwdCBlcnJvciBmcmFtZXMgKENSQywgYWxpZ25tZW50LCBjb2xsaWRlZCkKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVIgICAgICAgMHgwMDAwMDAxMAkvLyBhY2NlcHQgcnVudAorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BQiAgICAgICAweDAwMDAwMDA4CS8vIGFjY2VwdCBicm9hZGNhc3QgZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FNICAgICAgIDB4MDAwMDAwMDQJLy8gYWNjZXB0IG11bHRpY2FzdCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVBNICAgICAgMHgwMDAwMDAwMgkvLyBhY2NlcHQgcGh5c2ljYWwgbWF0Y2ggZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FBUCAgICAgIDB4MDAwMDAwMDEJLy8gYWNjZXB0IGFsbCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfREVGICAgICAgKEVEUlZfUkVHRFdfUkNSX05PX0ZUSCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTVhETUFVTkwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9OT1dSQVAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BQiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FNIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQVBNKQkvLyBkZWZhdWx0IHZhbHVlCisKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1IgICAgICAgICAgMHg0MAkvLyBUeCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLIDB4N0NDMDAwMDAJLy8gbWFzayBmb3IgaGFyZHdhcmUgdmVyc2lvbgorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfQyAgICAweDc0MDAwMDAwCS8vIFJUTDgxMzlDCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1ZFUl9EICAgIDB4NzQ0MDAwMDAJLy8gUlRMODEzOUQKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfSUZHOTYgICAgMHgwMzAwMDAwMAkvLyBkZWZhdWx0IGludGVyZnJhbWUgZ2FwICg5NjAgbnMpCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX0NSQyAgICAgIDB4MDAwMTAwMDAJLy8gZGlzYWJsZSBhcHBlbmRpbmcgb2YgQ1JDIGJ5IHRoZSBjb250cm9sbGVyCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX01YRE1BVU5MIDB4MDAwMDA3MDAJLy8gbWF4aW11bSBETUEgYnVyc3Qgc2l6ZSBvZiAyMDQ4IGIKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVFhSRVRSWSAgMHgwMDAwMDAwMAkvLyAxNiByZXRyaWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX0RFRiAgICAgIChFRFJWX1JFR0RXX1RDUl9JRkc5NiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX01YRE1BVU5MIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfVFhSRVRSWSkKKworI2RlZmluZSBFRFJWX1JFR1dfTVVMSU5UICAgICAgICAweDVDCS8vIG11bHRpcGxlIGludGVycnVwdCBzZWxlY3QgcmVnaXN0ZXIKKworI2RlZmluZSBFRFJWX1JFR0RXX01QQyAgICAgICAgICAweDRDCS8vIG1pc3NlZCBwYWNrZXQgY291bnRlciByZWdpc3RlcgorCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDAgICAgICAgIDB4MjAJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDAKKyNkZWZpbmUgRURSVl9SRUdEV19UU0FEMSAgICAgICAgMHgyNAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMQorI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQyICAgICAgICAweDI4CS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAyCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDMgICAgICAgIDB4MkMJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDMKKyNkZWZpbmUgRURSVl9SRUdEV19UU0QwICAgICAgICAgMHgxMAkvLyBUcmFuc21pdCBzdGF0dXMgb2YgZGVzY3JpcHRvciAwCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX0NSUyAgICAgIDB4ODAwMDAwMDAJLy8gQ2FycmllciBzZW5zZSBsb3N0CisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RBQlQgICAgIDB4NDAwMDAwMDAJLy8gVHJhbnNtaXQgQWJvcnQKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dDICAgICAgMHgyMDAwMDAwMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiAweDAwMDIwMDAwCS8vIFRyYW5zbWl0IEZJRk8gdGhyZXNob2xkIG9mIDY0IGJ5dGVzCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RPSyAgICAgIDB4MDAwMDgwMDAJLy8gVHJhbnNtaXQgT0sKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFVOICAgICAgMHgwMDAwNDAwMAkvLyBUcmFuc21pdCBGSUZPIHVuZGVycnVuCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX09XTiAgICAgIDB4MDAwMDIwMDAJLy8gT3duZXIKKworI2RlZmluZSBFRFJWX1JFR0RXX1JCU1RBUlQgICAgICAweDMwCS8vIFJlY2VpdmUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKKworI2RlZmluZSBFRFJWX1JFR1dfQ0FQUiAgICAgICAgICAweDM4CS8vIEN1cnJlbnQgYWRkcmVzcyBvZiBwYWNrZXQgcmVhZAorCisjZGVmaW5lIEVEUlZfUkVHRFdfSURSMCAgICAgICAgIDB4MDAJLy8gSUQgcmVnaXN0ZXIgMAorI2RlZmluZSBFRFJWX1JFR0RXX0lEUjQgICAgICAgICAweDA0CS8vIElEIHJlZ2lzdGVyIDQKKworI2RlZmluZSBFRFJWX1JFR0RXX01BUjAgICAgICAgICAweDA4CS8vIE11bHRpY2FzdCBhZGRyZXNzIHJlZ2lzdGVyIDAKKyNkZWZpbmUgRURSVl9SRUdEV19NQVI0ICAgICAgICAgMHgwQwkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWdpc3RlciA0CisKKy8vIGRlZmluZXMgZm9yIHRoZSBzdGF0dXMgd29yZCBpbiB0aGUgcmVjZWl2ZSBidWZmZXIKKyNkZWZpbmUgRURSVl9SWFNUQVRfTUFSICAgICAgICAgMHg4MDAwCS8vIE11bHRpY2FzdCBhZGRyZXNzIHJlY2VpdmVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX1BBTSAgICAgICAgIDB4NDAwMAkvLyBQaHlzaWNhbCBhZGRyZXNzIG1hdGNoZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfQkFSICAgICAgICAgMHgyMDAwCS8vIEJyb2FkY2FzdCBhZGRyZXNzIHJlY2VpdmVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX0lTRSAgICAgICAgIDB4MDAyMAkvLyBJbnZhbGlkIHN5bWJvbCBlcnJvcgorI2RlZmluZSBFRFJWX1JYU1RBVF9SVU5UICAgICAgICAweDAwMTAJLy8gUnVudCBwYWNrZXQgcmVjZWl2ZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfTE9ORyAgICAgICAgMHgwMDA4CS8vIExvbmcgcGFja2V0CisjZGVmaW5lIEVEUlZfUlhTVEFUX0NSQyAgICAgICAgIDB4MDAwNAkvLyBDUkMgZXJyb3IKKyNkZWZpbmUgRURSVl9SWFNUQVRfRkFFICAgICAgICAgMHgwMDAyCS8vIEZyYW1lIGFsaWdubWVudCBlcnJvcgorI2RlZmluZSBFRFJWX1JYU1RBVF9ST0sgICAgICAgICAweDAwMDEJLy8gUmVjZWl2ZSBPSworCisjZGVmaW5lIEVEUlZfUkVHRFdfV1JJVEUoZHdSZWcsIGR3VmFsKSAgd3JpdGVsKGR3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdXX1dSSVRFKGR3UmVnLCB3VmFsKSAgICB3cml0ZXcod1ZhbCwgRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHQl9XUklURShkd1JlZywgYlZhbCkgICAgd3JpdGViKGJWYWwsIEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR0RXX1JFQUQoZHdSZWcpICAgICAgICAgIHJlYWRsKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR1dfUkVBRChkd1JlZykgICAgICAgICAgIHJlYWR3KEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR0JfUkVBRChkd1JlZykgICAgICAgICAgIHJlYWRiKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKworI2RlZmluZSBFRFJWX0NPVU5UX1NFTkQgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIpCisjZGVmaW5lIEVEUlZfQ09VTlRfVElNRU9VVCAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMykKKyNkZWZpbmUgRURSVl9DT1VOVF9QQ0lfRVJSICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg0KQorI2RlZmluZSBFRFJWX0NPVU5UX1RYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDUpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlggICAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNikKKyNkZWZpbmUgRURSVl9DT1VOVF9MQVRFQ09MTElTSU9OICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMCkKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9DT0xfUkwgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMSkKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9GVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMikKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9FUlIgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMykKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9DUkMgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNCkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9FUlIgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNSkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9GT1ZXICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNikKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9QVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNykKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9GQUUgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxOCkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9PVlcgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxOSkKKworI2RlZmluZSBFRFJWX1RSQUNFX0NBUFIoeCkgICAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MDYwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0VfUlhfQ1JDKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwRTAwMDAwMCkKKyNkZWZpbmUgRURSVl9UUkFDRV9SWF9FUlIoeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDBGMDAwMDAwKQorI2RlZmluZSBFRFJWX1RSQUNFX1JYX1BVTih4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MTEwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0UoeCkgICAgICAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYwMDAwKSB8IDB4MDAwMEZFQzApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJPT0wgICAgICAgICAgICBtX2ZVc2VkOworICAgIHVuc2lnbmVkIGludCAgICBtX3VpU2l6ZTsKKyAgICBNQ0RfYnVmRGVzY0ZlYyAqbV9wQnVmRGVzY3I7CisKK30gdEVkcnZUeEJ1ZmZlckludGVybjsKKyovCisKKy8vIFByaXZhdGUgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaV9kZXYgKm1fcFBjaURldjsJLy8gcG9pbnRlciB0byBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorCXZvaWQgKm1fcElvQWRkcjsJLy8gcG9pbnRlciB0byByZWdpc3RlciBzcGFjZSBvZiBFdGhlcm5ldCBjb250cm9sbGVyCisJQllURSAqbV9wYlJ4QnVmOwkvLyBwb2ludGVyIHRvIFJ4IGJ1ZmZlcgorCWRtYV9hZGRyX3QgbV9wUnhCdWZEbWE7CisJQllURSAqbV9wYlR4QnVmOwkvLyBwb2ludGVyIHRvIFR4IGJ1ZmZlcgorCWRtYV9hZGRyX3QgbV9wVHhCdWZEbWE7CisJQk9PTCBtX2FmVHhCdWZVc2VkW0VEUlZfTUFYX1RYX0JVRkZFUlNdOworCXVuc2lnbmVkIGludCBtX3VpQ3VyVHhEZXNjOworCisJdEVkcnZJbml0UGFyYW0gbV9Jbml0UGFyYW07CisJdEVkcnZUeEJ1ZmZlciAqbV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7CisKK30gdEVkcnZJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRWRydkluaXRPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKTsKKworc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBidWZmZXJzIGFuZCBidWZmZXIgZGVzY3JpcHRvcnMgYW5kIHBvaW50ZXJzCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhRWRydlBjaVRibFtdID0geworCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFFZHJ2UGNpVGJsKTsKKworc3RhdGljIHRFZHJ2SW5zdGFuY2UgRWRydkluc3RhbmNlX2w7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBFZHJ2RHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gYUVkcnZQY2lUYmwsCisJLnByb2JlID0gRWRydkluaXRPbmUsCisJLnJlbW92ZSA9IEVkcnZSZW1vdmVPbmUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxlZHJ2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQllURSBFZHJ2Q2FsY0hhc2goQllURSAqIHBiTUFDX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBmb3IgaW5pdCBvZiB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRWRydkluaXRQYXJhbV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgaW5jbHVkaW5nIHRoZSBpbml0LXBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgICAgICA9IGtFcGxTdWNjZXNzZnVsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGtFcGxOb1Jlc291cmNlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydkluaXQodEVkcnZJbml0UGFyYW0gKiBwRWRydkluaXRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpUmVzdWx0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjbGVhciBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFZHJ2SW5zdGFuY2VfbCwgMCwgc2l6ZW9mKEVkcnZJbnN0YW5jZV9sKSk7CisKKwkvLyBzYXZlIHRoZSBpbml0IGRhdGEKKwlFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbSA9ICpwRWRydkluaXRQYXJhbV9wOworCisJLy8gcmVnaXN0ZXIgUENJIGRyaXZlcgorCWlSZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZFZHJ2RHJpdmVyKTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCXByaW50aygiJXMgcGNpX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQgd2l0aCAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgICAgaVJlc3VsdCk7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9PSBOVUxMKSB7CisJCXByaW50aygiJXMgbV9wUGNpRGV2PU5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlYWQgTUFDIGFkZHJlc3MgZnJvbSBjb250cm9sbGVyCisJcHJpbnRrKCIlcyBsb2NhbCBNQUMgPSAiLCBfX0ZVTkNUSU9OX18pOworCWZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspIHsKKwkJcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSA9CisJCSAgICBFRFJWX1JFR0JfUkVBRCgoRURSVl9SRUdEV19JRFIwICsgaVJlc3VsdCkpOworCQlwcmludGsoIiUwMlggIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSk7CisJfQorCXByaW50aygiXG4iKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZTaHV0ZG93bgorLy8KKy8vIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2U2h1dGRvd24odm9pZCkKK3sKKworCS8vIHVucmVnaXN0ZXIgUENJIGRyaXZlcgorCXByaW50aygiJXMgY2FsbGluZyBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJkVkcnZEcml2ZXIpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkKKy8vCisvLyBEZXNjcmlwdGlvbjogU2V0IGEgbXVsdGljYXN0IGVudHJ5IGludG8gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJNYWNBZGRyX3AgICAgID0gcG9pbnRlciB0byBtdWx0aWNhc3QgZW50cnkgdG8gc2V0CisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgICAgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KEJZVEUgKiBwYk1hY0FkZHJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3RGF0YTsKKwlCWVRFIGJIYXNoOworCisJYkhhc2ggPSBFZHJ2Q2FsY0hhc2gocGJNYWNBZGRyX3ApOworLyoKKyAgICBkd0RhdGEgPSBldGhlcl9jcmMoNiwgcGJNYWNBZGRyX3ApOworCisgICAgcHJpbnRrKCJFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoJyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYJykgaGFzaCA9ICV1IC8gJXUgIGV0aGVyX2NyYyA9IDB4JTA4bFhcbiIsCisgICAgICAgIChXT1JEKSBwYk1hY0FkZHJfcFswXSwgKFdPUkQpIHBiTWFjQWRkcl9wWzFdLCAoV09SRCkgcGJNYWNBZGRyX3BbMl0sCisgICAgICAgIChXT1JEKSBwYk1hY0FkZHJfcFszXSwgKFdPUkQpIHBiTWFjQWRkcl9wWzRdLCAoV09SRCkgcGJNYWNBZGRyX3BbNV0sCisgICAgICAgIChXT1JEKSBiSGFzaCwgKFdPUkQpIChkd0RhdGEgPj4gMjYpLCBkd0RhdGEpOworKi8KKwlpZiAoYkhhc2ggPiAzMSkgeworCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKKwkJZHdEYXRhIHw9IDEgPDwgKGJIYXNoIC0gMzIpOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgZHdEYXRhKTsKKwl9IGVsc2UgeworCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKKwkJZHdEYXRhIHw9IDEgPDwgYkhhc2g7CisJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCBkd0RhdGEpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5CisvLworLy8gRGVzY3JpcHRpb246IFJlc2V0IGEgbXVsdGljYXN0IGVudHJ5IGluIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisvLworLy8gUGFyYW1ldGVyczogIHBiTWFjQWRkcl9wICAgICA9IHBvaW50ZXIgdG8gbXVsdGljYXN0IGVudHJ5IHRvIHJlc2V0CisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgICAgICA9IGtFcGxTdWNjZXNzZnVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJRFdPUkQgZHdEYXRhOworCUJZVEUgYkhhc2g7CisKKwliSGFzaCA9IEVkcnZDYWxjSGFzaChwYk1hY0FkZHJfcCk7CisKKwlpZiAoYkhhc2ggPiAzMSkgeworCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVI0KTsKKwkJZHdEYXRhICY9IH4oMSA8PCAoYkhhc2ggLSAzMikpOworCQlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgZHdEYXRhKTsKKwl9IGVsc2UgeworCQlkd0RhdGEgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKKwkJZHdEYXRhICY9IH4oMSA8PCBiSGFzaCk7CisJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCBkd0RhdGEpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZBbGxvY1R4TXNnQnVmZmVyCisvLworLy8gRGVzY3JpcHRpb246IFJlZ2lzdGVyIGEgVHgtQnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gcG9pbnRlciB0byBCdWZmZXIgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcih0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJRFdPUkQgaTsKKworCWlmIChwQnVmZmVyX3AtPm1fdWlNYXhCdWZmZXJMZW4gPiBFRFJWX01BWF9GUkFNRV9TSVpFKSB7CisJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2VhcmNoIGEgZnJlZSBUeCBidWZmZXIgd2l0aCBhcHByb3ByaWF0ZSBzaXplCisJZm9yIChpID0gMDsgaSA8IEVEUlZfTUFYX1RYX0JVRkZFUlM7IGkrKykgeworCQlpZiAoRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFtpXSA9PSBGQUxTRSkgeworCQkJLy8gZnJlZSBjaGFubmVsIGZvdW5kCisJCQlFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID0gVFJVRTsKKwkJCXBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlciA9IGk7CisJCQlwQnVmZmVyX3AtPm1fcGJCdWZmZXIgPQorCQkJICAgIEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiArCisJCQkgICAgKGkgKiBFRFJWX01BWF9GUkFNRV9TSVpFKTsKKwkJCXBCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbiA9IEVEUlZfTUFYX0ZSQU1FX1NJWkU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA+PSBFRFJWX01BWF9UWF9CVUZGRVJTKSB7CisJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyCisvLworLy8gRGVzY3JpcHRpb246IFJlZ2lzdGVyIGEgVHgtQnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gcG9pbnRlciB0byBCdWZmZXIgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyTnVtYmVyOworCisJdWlCdWZmZXJOdW1iZXIgPSBwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXI7CisKKwlpZiAodWlCdWZmZXJOdW1iZXIgPCBFRFJWX01BWF9UWF9CVUZGRVJTKSB7CisJCUVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID0gRkFMU0U7CisJfQorCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZTZW5kVHhNc2cKKy8vCisvLyBEZXNjcmlwdGlvbjogaW1tZWRpYXRlbHkgc3RhcnRzIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQnVmZmVyX3AgICA9IGJ1ZmZlciBkZXNjcmlwdG9yIHRvIHRyYW5zbWl0CisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2U2VuZFR4TXNnKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CisJRFdPUkQgZHdUZW1wOworCisJdWlCdWZmZXJOdW1iZXIgPSBwQnVmZmVyX3AtPm1fdWlCdWZmZXJOdW1iZXI7CisKKwlpZiAoKHVpQnVmZmVyTnVtYmVyID49IEVEUlZfTUFYX1RYX0JVRkZFUlMpCisJICAgIHx8IChFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW3VpQnVmZmVyTnVtYmVyXSA9PSBGQUxTRSkpIHsKKwkJUmV0ID0ga0VwbEVkcnZCdWZOb3RFeGlzdGluZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlciAhPSBOVUxMKSB7CS8vIHRyYW5zbWlzc2lvbiBpcyBhbHJlYWR5IGFjdGl2ZQorCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKwkJZHdUZW1wID0KKwkJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0QwICsKKwkJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICoKKwkJCQkgICAgICBzaXplb2YoRFdPUkQpKSkpOworCQlwcmludGsoIiVzIEludk9wIFRTRCV1ID0gMHglMDhsWCIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CisJCXByaW50aygiICBDbWQgPSAweCUwMlhcbiIsCisJCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gYnVmZmVyIHN0cnVjdHVyZSBmb3IgVHhIYW5kbGVyCisJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBwQnVmZmVyX3A7CisKKwlFRFJWX0NPVU5UX1NFTkQ7CisKKwkvLyBwYWQgd2l0aCB6ZXJvcyBpZiBuZWNlc3NhcnksIGJlY2F1c2UgY29udHJvbGxlciBkb2VzIG5vdCBkbyBpdAorCWlmIChwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiA8IE1JTl9FVEhfU0laRSkgeworCQlFUExfTUVNU0VUKHBCdWZmZXJfcC0+bV9wYkJ1ZmZlciArIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuLCAwLAorCQkJICAgTUlOX0VUSF9TSVpFIC0gcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4pOworCQlwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiA9IE1JTl9FVEhfU0laRTsKKwl9CisJLy8gc2V0IERNQSBhZGRyZXNzIG9mIGJ1ZmZlcgorCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNBRDAgKworCQkJICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSwKKwkJCSAoRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEgKworCQkJICAodWlCdWZmZXJOdW1iZXIgKiBFRFJWX01BWF9GUkFNRV9TSVpFKSkpOworCWR3VGVtcCA9CisJICAgIEVEUlZfUkVHRFdfUkVBRCgoRURSVl9SRUdEV19UU0FEMCArCisJCQkgICAgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKERXT1JEKSkpKTsKKy8vICAgIHByaW50aygiJXMgVFNBRCV1ID0gMHglMDhsWCIsIF9fRlVOQ1RJT05fXywgRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYywgZHdUZW1wKTsKKworCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbgorCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKERXT1JEKSkpLAorCQkJIChFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7CisJZHdUZW1wID0KKwkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKworCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7CisvLyAgICBwcmludGsoIiBUU0QldSA9IDB4JTA4bFggLyAweCUwOGxYXG4iLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXAsIChEV09SRCkoRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgfCBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbikpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyNpZiAwCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2VHhNc2dSZWFkeQorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgY29weWluZyB0aGUgYnVmZmVyIHRvIHRoZSBldGhlcm5ldCBjb250cm9sbGVyJ3MgRklGTworLy8KKy8vIFBhcmFtZXRlcnM6ICBwYkJ1ZmZlcl9wIC0gYnVmZmVyZGVzY3JpcHRvciB0byB0cmFuc21pdAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgLSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZUeE1zZ1JlYWR5KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlR4TXNnU3RhcnQKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIHRyYW5zbWlzc2lvbiBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlcidzIEZJRk8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJCdWZmZXJfcCAtIGJ1ZmZlcmRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlIC0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2VHhNc2dTdGFydCh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZSZWluaXRSeAorLy8KKy8vIERlc2NyaXB0aW9uOiByZWluaXRpYWxpemUgdGhlIFJ4IHByb2Nlc3MsIGJlY2F1c2Ugb2YgZXJyb3IKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIEVkcnZSZWluaXRSeCh2b2lkKQoreworCUJZVEUgYkNtZDsKKworCS8vIHNpbXBseSBzd2l0Y2ggb2ZmIGFuZCBvbiB0aGUgcmVjZWl2ZXIKKwkvLyB0aGlzIHdpbGwgcmVzZXQgdGhlIENBUFIgcmVnaXN0ZXIKKwliQ21kID0gRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgKGJDbWQgJiB+RURSVl9SRUdCX0NPTU1BTkRfUkUpKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIGJDbWQpOworCisJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiAgaW50ZXJydXB0IGhhbmRsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKK3ZvaWQgRWRydkludGVycnVwdEhhbmRsZXIodm9pZCkKK3sKK30KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkKK3N0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCkKKyNlbHNlCitzdGF0aWMgaW50IFRndEV0aElzcihpbnQgbklycU51bV9wLCB2b2lkICpwcERldkluc3REYXRhX3AsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnB0UmVnc19wKQorI2VuZGlmCit7CisvLyAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcigpOworCXRFZHJ2UnhCdWZmZXIgUnhCdWZmZXI7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyOworCVdPUkQgd1N0YXR1czsKKwlEV09SRCBkd1R4U3RhdHVzOworCURXT1JEIGR3UnhTdGF0dXM7CisJV09SRCB3Q3VyUng7CisJQllURSAqcGJSeEJ1ZjsKKwl1bnNpZ25lZCBpbnQgdWlMZW5ndGg7CisJaW50IGlIYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisKKy8vICAgIHByaW50aygipCIpOworCisJLy8gcmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cworCXdTdGF0dXMgPSBFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfSU5UX1NUQVRVUyk7CisKKwkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywgd1N0YXR1cyk7CisKKwlpZiAod1N0YXR1cyA9PSAwKSB7CisJCWlIYW5kbGVkID0gSVJRX05PTkU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcHJvY2VzcyB0YXNrcworCWlmICgod1N0YXR1cyAmIChFRFJWX1JFR1dfSU5UX1RFUiB8IEVEUlZfUkVHV19JTlRfVE9LKSkgIT0gMCkgewkvLyB0cmFuc21pdCBpbnRlcnJ1cHQKKworCQlpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID09IE5VTEwpIHsKKwkJCXByaW50aygiJXMgVHggYnVmZmVycyBjdXJyZW50bHkgbm90IGFsbG9jYXRlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHJlYWQgdHJhbnNtaXQgc3RhdHVzCisJCWR3VHhTdGF0dXMgPQorCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKworCQkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKgorCQkJCSAgICAgIHNpemVvZihEV09SRCkpKSk7CisJCWlmICgoZHdUeFN0YXR1cyAmIChFRFJWX1JFR0RXX1RTRF9UT0sgfCBFRFJWX1JFR0RXX1RTRF9UQUJUIHwgRURSVl9SRUdEV19UU0RfVFVOKSkgIT0gMCkgewkvLyB0cmFuc21pdCBmaW5pc2hlZAorCQkJRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyA9CisJCQkgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKyAxKSAmIDB4MDM7CisJCQlwVHhCdWZmZXIgPSBFZHJ2SW5zdGFuY2VfbC5tX3BMYXN0VHJhbnNtaXR0ZWRUeEJ1ZmZlcjsKKwkJCUVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyID0gTlVMTDsKKworCQkJaWYgKChkd1R4U3RhdHVzICYgRURSVl9SRUdEV19UU0RfVE9LKSAhPSAwKSB7CisJCQkJRURSVl9DT1VOVF9UWDsKKwkJCX0gZWxzZSBpZiAoKGR3VHhTdGF0dXMgJiBFRFJWX1JFR0RXX1RTRF9UVU4pICE9IDApIHsKKwkJCQlFRFJWX0NPVU5UX1RYX0ZVTjsKKwkJCX0gZWxzZSB7CS8vIGFzc3VtZSBFRFJWX1JFR0RXX1RTRF9UQUJUCisJCQkJRURSVl9DT1VOVF9UWF9DT0xfUkw7CisJCQl9CisKKy8vICAgICAgICAgICAgcHJpbnRrKCJUIik7CisJCQlpZiAocFR4QnVmZmVyICE9IE5VTEwpIHsKKwkJCQkvLyBjYWxsIFR4IGhhbmRsZXIgb2YgRGF0YSBsaW5rIGxheWVyCisJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCisJCQkJICAgIG1fcGZuVHhIYW5kbGVyKHBUeEJ1ZmZlcik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlFRFJWX0NPVU5UX1RYX0VSUjsKKwkJfQorCX0KKworCWlmICgod1N0YXR1cyAmIChFRFJWX1JFR1dfSU5UX1JFUiB8IEVEUlZfUkVHV19JTlRfRk9WVyB8IEVEUlZfUkVHV19JTlRfUlhPVlcgfCBFRFJWX1JFR1dfSU5UX1BVTikpICE9IDApIHsJLy8gcmVjZWl2ZSBlcnJvciBpbnRlcnJ1cHQKKworCQlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX0ZPVlcpICE9IDApIHsKKwkJCUVEUlZfQ09VTlRfUlhfRk9WVzsKKwkJfSBlbHNlIGlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUlhPVlcpICE9IDApIHsKKwkJCUVEUlZfQ09VTlRfUlhfT1ZXOworCQl9IGVsc2UgaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9QVU4pICE9IDApIHsJLy8gUGFja2V0IHVuZGVycnVuCisJCQlFRFJWX1RSQUNFX1JYX1BVTih3U3RhdHVzKTsKKwkJCUVEUlZfQ09VTlRfUlhfUFVOOworCQl9IGVsc2UgewkvKmlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfUkVSKSAhPSAwKSAqLworCisJCQlFRFJWX1RSQUNFX1JYX0VSUih3U3RhdHVzKTsKKwkJCUVEUlZfQ09VTlRfUlhfRVJSOworCQl9CisKKwkJLy8gcmVpbml0aWFsaXplIFJ4IHByb2Nlc3MKKwkJRWRydlJlaW5pdFJ4KCk7CisJfQorCisJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9ST0spICE9IDApIHsJLy8gcmVjZWl2ZSBpbnRlcnJ1cHQKKworCQlpZiAoRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID09IE5VTEwpIHsKKwkJCXByaW50aygiJXMgUnggYnVmZmVycyBjdXJyZW50bHkgbm90IGFsbG9jYXRlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHJlYWQgY3VycmVudCBvZmZzZXQgaW4gcmVjZWl2ZSBidWZmZXIKKwkJd0N1clJ4ID0KKwkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKworCQkgICAgIDB4MTApICUgRURSVl9SWF9CVUZGRVJfTEVOR1RIOworCisJCXdoaWxlICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfQlVGRSkgPT0gMCkgewkvLyBmcmFtZSBhdmFpbGFibGUKKworCQkJLy8gY2FsY3VsYXRlIHBvaW50ZXIgdG8gY3VycmVudCBmcmFtZSBpbiByZWNlaXZlIGJ1ZmZlcgorCQkJcGJSeEJ1ZiA9IEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiArIHdDdXJSeDsKKworCQkJLy8gcmVhZCByZWNlaXZlIHN0YXR1cyBEV09SRAorCQkJZHdSeFN0YXR1cyA9IGxlMzJfdG9fY3B1KCooKERXT1JEICopIHBiUnhCdWYpKTsKKworCQkJLy8gY2FsY3VsYXRlIGxlbmd0aCBvZiByZWNlaXZlZCBmcmFtZQorCQkJdWlMZW5ndGggPSBkd1J4U3RhdHVzID4+IDE2OworCisJCQlpZiAodWlMZW5ndGggPT0gMHhGRkYwKSB7CS8vIGZyYW1lIGlzIHVuZmluaXNoZWQgKG1heWJlIGVhcmx5IFJ4IGludGVycnVwdCBpcyBhY3RpdmUpCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX1JPSykgPT0gMCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlY2VpdmluZyB0aGlzIGZyYW1lCisJCQkJLy8gaWdub3JlIGl0CisJCQkJaWYgKChkd1J4U3RhdHVzICYgRURSVl9SWFNUQVRfRkFFKSAhPSAwKSB7CisJCQkJCUVEUlZfQ09VTlRfUlhfRkFFOworCQkJCX0gZWxzZSBpZiAoKGR3UnhTdGF0dXMgJiBFRFJWX1JYU1RBVF9DUkMpICE9IDApIHsKKwkJCQkJRURSVl9UUkFDRV9SWF9DUkMoZHdSeFN0YXR1cyk7CisJCQkJCUVEUlZfQ09VTlRfUlhfQ1JDOworCQkJCX0gZWxzZSB7CisJCQkJCUVEUlZfVFJBQ0VfUlhfRVJSKGR3UnhTdGF0dXMpOworCQkJCQlFRFJWX0NPVU5UX1JYX0VSUjsKKwkJCQl9CisKKwkJCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcworCQkJCUVkcnZSZWluaXRSeCgpOworCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgewkvLyBmcmFtZSBpcyBPSworCQkJCVJ4QnVmZmVyLm1fQnVmZmVySW5GcmFtZSA9CisJCQkJICAgIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU7CisJCQkJUnhCdWZmZXIubV91aVJ4TXNnTGVuID0gdWlMZW5ndGggLSBFVEhfQ1JDX1NJWkU7CisJCQkJUnhCdWZmZXIubV9wYkJ1ZmZlciA9CisJCQkJICAgIHBiUnhCdWYgKyBzaXplb2YoZHdSeFN0YXR1cyk7CisKKy8vICAgICAgICAgICAgICAgIHByaW50aygiUiIpOworCQkJCUVEUlZfQ09VTlRfUlg7CisKKwkJCQkvLyBjYWxsIFJ4IGhhbmRsZXIgb2YgRGF0YSBsaW5rIGxheWVyCisJCQkJRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0uCisJCQkJICAgIG1fcGZuUnhIYW5kbGVyKCZSeEJ1ZmZlcik7CisJCQl9CisKKwkJCS8vIGNhbHVsYXRlIG5ldyBvZmZzZXQgKERXT1JEIGFsaWduZWQpCisJCQl3Q3VyUnggPQorCQkJICAgIChXT1JEKSAoKHdDdXJSeCArIHVpTGVuZ3RoICsgc2l6ZW9mKGR3UnhTdGF0dXMpICsKKwkJCQkgICAgIDMpICYgfjB4Myk7CisJCQlFRFJWX1RSQUNFX0NBUFIod0N1clJ4IC0gMHgxMCk7CisJCQlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0NBUFIsIHdDdXJSeCAtIDB4MTApOworCisJCQkvLyByZXJlYWQgY3VycmVudCBvZmZzZXQgaW4gcmVjZWl2ZSBidWZmZXIKKwkJCXdDdXJSeCA9CisJCQkgICAgKEVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19DQVBSKSArCisJCQkgICAgIDB4MTApICUgRURSVl9SWF9CVUZGRVJfTEVOR1RIOworCisJCX0KKwl9CisKKwlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1NFUlIpICE9IDApIHsJLy8gUENJIGVycm9yCisJCUVEUlZfQ09VTlRfUENJX0VSUjsKKwl9CisKKwlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1RJTUVPVVQpICE9IDApIHsJLy8gVGltZW91dAorCQlFRFJWX0NPVU5UX1RJTUVPVVQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBpSGFuZGxlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkluaXRPbmUKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgb25lIFBDSSBkZXZpY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBjaURldiAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHBJZCAgICAgICAgICAgICAgICAgPSBQQ0kgZGV2aWNlIElECisvLworLy8gUmV0dXJuczogICAgIChpbnQpICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFZHJ2SW5pdE9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBJZCkKK3sKKwlpbnQgaVJlc3VsdCA9IDA7CisJRFdPUkQgZHdUZW1wOworCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBOVUxMKSB7CS8vIEVkcnYgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBQQ0kgZGV2aWNlCisJCXByaW50aygiJXMgZGV2aWNlICVzIGRpc2NhcmRlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgICAgcGNpX25hbWUocFBjaURldikpOworCQlpUmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwUGNpRGV2LT5yZXZpc2lvbiA+PSAweDIwKSB7CisJCXByaW50aworCQkgICAgKCIlcyBkZXZpY2UgJXMgaXMgYW4gZW5oYW5jZWQgODEzOUMrIHZlcnNpb24sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCSAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwUGNpRGV2KSk7CisJCWlSZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIEV4aXQ7CisJfQorCisJRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ID0gcFBjaURldjsKKworCS8vIGVuYWJsZSBkZXZpY2UKKwlwcmludGsoIiVzIGVuYWJsZSBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJaVJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKHBQY2lEZXYpOworCWlmIChpUmVzdWx0ICE9IDApIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBQY2lEZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pID09IDApIHsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwcmludGsoIiVzIHJlcXVlc3QgcmVnaW9uc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpUmVzdWx0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwUGNpRGV2LCBEUlZfTkFNRSk7CisJaWYgKGlSZXN1bHQgIT0gMCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJcHJpbnRrKCIlcyBpb3JlbWFwXG4iLCBfX0ZVTkNUSU9OX18pOworCUVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciA9CisJICAgIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBQY2lEZXYsIDEpLAorCQkgICAgcGNpX3Jlc291cmNlX2xlbihwUGNpRGV2LCAxKSk7CisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciA9PSBOVUxMKSB7CS8vIHJlbWFwIG9mIGNvbnRyb2xsZXIncyByZWdpc3RlciBzcGFjZSBmYWlsZWQKKwkJaVJlc3VsdCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZW5hYmxlIFBDSSBidXNtYXN0ZXIKKwlwcmludGsoIiVzIGVuYWJsZSBidXNtYXN0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJcGNpX3NldF9tYXN0ZXIocFBjaURldik7CisKKwkvLyByZXNldCBjb250cm9sbGVyCisJcHJpbnRrKCIlcyByZXNldCBjb250cm9sbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgRURSVl9SRUdCX0NPTU1BTkRfUlNUKTsKKworCS8vIHdhaXQgdW50aWwgcmVzZXQgaGFzIGZpbmlzaGVkCisJZm9yIChpUmVzdWx0ID0gNTAwOyBpUmVzdWx0ID4gMDsgaVJlc3VsdC0tKSB7CisJCWlmICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfUlNUKQorCQkgICAgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZV90aW1lb3V0KDEwKTsKKwl9CisKKwkvLyBjaGVjayBoYXJkd2FyZSB2ZXJzaW9uLCBpLmUuIGNoaXAgSUQKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpOworCWlmICgoKGR3VGVtcCAmIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLKSAhPSBFRFJWX1JFR0RXX1RDUl9WRVJfQykKKwkgICAgJiYgKChkd1RlbXAgJiBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSykgIT0gRURSVl9SRUdEV19UQ1JfVkVSX0QpKSB7CS8vIHVuc3VwcG9ydGVkIGNoaXAKKwkJcHJpbnRrKCIlcyBVbnN1cHBvcnRlZCBjaGlwISBUQ1IgPSAweCUwOGxYXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgICAgICBkd1RlbXApOworCQlpUmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkaXNhYmxlIGludGVycnVwdHMKKwlwcmludGsoIiVzIGRpc2FibGUgaW50ZXJydXB0c1xuIiwgX19GVU5DVElPTl9fKTsKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKKwkvLyBhY2tub3dsZWRnZSBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLAorCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKKworCS8vIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIKKwlwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJaVJlc3VsdCA9CisJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKKwkJCURSVl9OQU1FIC8qcFBjaURldi0+ZGV2Lm5hbWUgKi8gLCBwUGNpRGV2KTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKy8qCisgICAgLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgICAgcHJpbnRrKCIlcyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DTUQ5MzQ2LCBFRFJWX1JFR0JfQ01EOTM0Nl9VTkxPQ0spOworCisgICAgLy8gY2hlY2sgaWYgdXNlciBzcGVjaWZpZWQgYSBNQUMgYWRkcmVzcworICAgIHByaW50aygiJXMgY2hlY2sgc3BlY2lmaWVkIE1BQyBhZGRyZXNzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCisgICAgeworICAgICAgICBpZiAoRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcltpUmVzdWx0XSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIiVzIHNldCBsb2NhbCBNQUMgYWRkcmVzc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoaXMgTUFDIGFkZHJlc3MgdG8gY29udHJvbGxlcgorICAgICAgICAgICAgRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX0lEUjAsCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoKigoRFdPUkQqKSZFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS5tX2FiTXlNYWNBZGRyWzBdKSkpOworICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSMCk7CisKKyAgICAgICAgICAgIEVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19JRFI0LAorICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcls0XSkpKTsKKyAgICAgICAgICAgIGR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX0lEUjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaVJlc3VsdCA9IDA7CisKKyAgICAvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DTUQ5MzQ2LCBFRFJWX1JFR0JfQ01EOTM0Nl9MT0NLKTsKKyovCisKKwkvLyBhbGxvY2F0ZSBidWZmZXJzCisJcHJpbnRrKCIlcyBhbGxvY2F0ZSBidWZmZXJzXG4iLCBfX0ZVTkNUSU9OX18pOworCUVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9CisJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBQY2lEZXYsIEVEUlZfVFhfQlVGRkVSX1NJWkUsCisJCQkJICZFZHJ2SW5zdGFuY2VfbC5tX3BUeEJ1ZkRtYSk7CisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9PSBOVUxMKSB7CisJCWlSZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIEV4aXQ7CisJfQorCisJRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKKwkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmID09IE5VTEwpIHsKKwkJaVJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzZXQgcG9pbnRlcnMgZm9yIFR4IGJ1ZmZlcnMKKwlwcmludGsoIiVzIHJlc2V0IHBvaW50ZXJzIGZvIFR4IGJ1ZmZlcnNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQwLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMCk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQxLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMSk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQyLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMik7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RTQUQzLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UU0FEMyk7CisKKwlwcmludGsoIiAgICBDb21tYW5kID0gMHglMDJYXG4iLAorCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKworCS8vIHNldCBwb2ludGVyIGZvciByZWNlaXZlIGJ1ZmZlciBpbiBjb250cm9sbGVyCisJcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1JCU1RBUlQsIEVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKKworCS8vIGVuYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKKwlwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwKKwkJCShFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CisJcHJpbnRrKCIgIENvbW1hbmQgPSAweCUwMlhcbiIsCisJICAgICAgIChXT1JEKSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCkpOworCisJLy8gY2xlYXIgbWlzc2VkIHBhY2tldCBjb3VudGVyIHRvIGVuYWJsZSBSeC9UeCBwcm9jZXNzCisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01QQywgMCk7CisKKwkvLyBzZXQgdHJhbnNtaXQgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCXByaW50aygiJXMgc2V0IFR4IGNvbmYgcmVnaXN0ZXIiLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UQ1IsIEVEUlZfUkVHRFdfVENSX0RFRik7CisJcHJpbnRrKCIgPSAweCUwOFhcbiIsIEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RDUikpOworCisJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCXByaW50aygiJXMgc2V0IFJ4IGNvbmYgcmVnaXN0ZXIiLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7CisJcHJpbnRrKCIgPSAweCUwOFhcbiIsIEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1JDUikpOworCisJLy8gcmVzZXQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgorCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisKKy8qCisgICAgLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgorICAgIHByaW50aygiJXMgZW5hYmxlIFR4IGFuZCBSeCIsIF9fRlVOQ1RJT05fXyk7CisgICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCAoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOworICAgIHByaW50aygiICBDb21tYW5kID0gMHglMDJYXG4iLCAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKKyovCisJLy8gZGlzYWJsZSBlYXJseSBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19NVUxJTlQsIDApOworCisJLy8gZW5hYmxlIGludGVycnVwdHMKKwlwcmludGsoIiVzIGVuYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX0ZVTkNUSU9OX18pOworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX01BU0ssIEVEUlZfUkVHV19JTlRfTUFTS19ERUYpOworCisgICAgICBFeGl0OgorCXByaW50aygiJXMgZmluaXNoZWQgd2l0aCAlZFxuIiwgX19GVU5DVElPTl9fLCBpUmVzdWx0KTsKKwlyZXR1cm4gaVJlc3VsdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlJlbW92ZU9uZQorLy8KKy8vIERlc2NyaXB0aW9uOiBzaHV0cyBkb3duIG9uZSBQQ0kgZGV2aWNlCisvLworLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgKHZvaWQpCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldikKK3sKKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldikgewkvLyB0cnlpbmcgdG8gcmVtb3ZlIHVua25vd24gZGV2aWNlCisJCUJVR19PTihFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldik7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZGlzYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIDApOworCisJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgMCk7CisKKwkvLyByZW1vdmUgaW50ZXJydXB0IGhhbmRsZXIKKwlmcmVlX2lycShwUGNpRGV2LT5pcnEsIHBQY2lEZXYpOworCisJLy8gZnJlZSBidWZmZXJzCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9UWF9CVUZGRVJfU0laRSwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlR4QnVmLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BUeEJ1ZkRtYSk7CisJCUVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9IE5VTEw7CisJfQorCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CisJCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9IE5VTEw7CisJfQorCS8vIHVubWFwIGNvbnRyb2xsZXIncyByZWdpc3RlciBzcGFjZQorCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgIT0gTlVMTCkgeworCQlpb3VubWFwKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkcik7CisJfQorCS8vIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UKKwlwY2lfZGlzYWJsZV9kZXZpY2UocFBjaURldik7CisKKwkvLyByZWxlYXNlIG1lbW9yeSByZWdpb25zCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwUGNpRGV2KTsKKworCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IE5VTEw7CisKKyAgICAgIEV4aXQ6OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2Q2FsY0hhc2gKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW50cnkgZm9yIHRoZSBoYXNoLXRhYmxlIGZyb20gTUFDCisvLyAgICAgICAgICAgICAgYWRkcmVzcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwYk1BQ19wIC0gcG9pbnRlciB0byBNQUMgYWRkcmVzcworLy8KKy8vIFJldHVybnM6ICAgICBoYXNoIHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgSEFTSF9CSVRTICAgICAgICAgICAgICA2CS8vIHVzZWQgYml0cyBpbiBoYXNoCisjZGVmaW5lIENSQzMyX1BPTFkgICAgMHgwNEMxMURCNgkvLworLy8jZGVmaW5lIENSQzMyX1BPTFkgICAgMHhFREI4ODMyMCAgLy8KKy8vIEcoeCkgPSB4MzIgKyB4MjYgKyB4MjMgKyB4MjIgKyB4MTYgKyB4MTIgKyB4MTEgKyB4MTAgKyB4OCArIHg3ICsgeDUgKyB4NCArIHgyICsgeCArIDEKKworc3RhdGljIEJZVEUgRWRydkNhbGNIYXNoKEJZVEUgKiBwYk1BQ19wKQoreworCURXT1JEIGR3Qnl0ZUNvdW50ZXI7CisJRFdPUkQgZHdCaXRDb3VudGVyOworCURXT1JEIGR3RGF0YTsKKwlEV09SRCBkd0NyYzsKKwlEV09SRCBkd0NhcnJ5OworCUJZVEUgKnBiRGF0YTsKKwlCWVRFIGJIYXNoOworCisJcGJEYXRhID0gcGJNQUNfcDsKKworCS8vIGNhbGN1bGF0ZSBjcmMzMiB2YWx1ZSBvZiBtYWMgYWRkcmVzcworCWR3Q3JjID0gMHhGRkZGRkZGRjsKKworCWZvciAoZHdCeXRlQ291bnRlciA9IDA7IGR3Qnl0ZUNvdW50ZXIgPCA2OyBkd0J5dGVDb3VudGVyKyspIHsKKwkJZHdEYXRhID0gKnBiRGF0YTsKKwkJcGJEYXRhKys7CisJCWZvciAoZHdCaXRDb3VudGVyID0gMDsgZHdCaXRDb3VudGVyIDwgODsKKwkJICAgICBkd0JpdENvdW50ZXIrKywgZHdEYXRhID4+PSAxKSB7CisJCQlkd0NhcnJ5ID0gKCgoZHdDcmMgPj4gMzEpIF4gZHdEYXRhKSAmIDEpOworCQkJZHdDcmMgPSBkd0NyYyA8PCAxOworCQkJaWYgKGR3Q2FycnkgIT0gMCkgeworCQkJCWR3Q3JjID0gKGR3Q3JjIF4gQ1JDMzJfUE9MWSkgfCBkd0NhcnJ5OworCQkJfQorCQl9CisJfQorCisvLyAgICBwcmludGsoIk15Q1JDID0gMHglMDhsWFxuIiwgZHdDcmMpOworCS8vIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCisJLy8gd2hpY2ggcG9pbnQgdG8gc3BlY2lmaWMgYml0IGluIHRoZSBoYXNoIHJlZ2lzdGVycworCWJIYXNoID0gKEJZVEUpICgoZHdDcmMgPj4gKDMyIC0gSEFTSF9CSVRTKSkgJiAweDNmKTsKKworCXJldHVybiBiSGFzaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNTJmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBldGhlcm5ldGRyaXZlcgorICAgICAgICAgICAgICAgICJmYXN0IGV0aGVybmV0IGNvbnRyb2xsZXIiIChGRUMpCisgICAgICAgICAgICAgICAgZnJlZXNjYWxlIGNvbGRmaXJlIE1DRjUyOHggYW5kIGNvbXBhdGlibGUgRkVDCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydkZlYy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMDgvMDEgbS5iLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWRkVDX0hfCisjZGVmaW5lIF9FRFJWRkVDX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZG8gdGhpcyBpbiBjb25maWcgaGVhZGVyCisjZGVmaW5lIFRBUkdFVF9IQVJEV0FSRSBUR1RIV19TUExDX0NGNTQKKworLy8gYmFzZSBhZGRyZXNzZXMKKyNpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTI4MikKKworI2VsaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzU0ODUpCisKKyNlbHNlCisKKyNlcnJvciAnRVJST1I6IFRhcmdldCB3YXMgbmV2ZXIgaW1wbGVtZW50ZWQhJworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dTdGF0dXM7CQkvLyBjb250cm9sIC8gc3RhdHVzICAtLS0gIHVzZWQgYnkgZWRydiwgZG8gbm90IGNoYW5nZSBpbiBhcHBsaWNhdGlvbgorCVdPUkQgbV93TGVuZ3RoOwkJLy8gdHJhbnNmZXIgbGVuZ3RoCisJQllURSAqbV9wYkRhdGE7CQkvLyBidWZmZXIgYWRkcmVzcworfSB0QnVmZmVyRGVzY3I7CisKKyNpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTI4MikKKworI2VsaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzU0ODUpCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfRkVDX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWM1MjgyLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWM1MjgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2YmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYzUyODIuaApAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgZXRoZXJuZXRkcml2ZXIKKyAgICAgICAgICAgICAgICAiZmFzdCBldGhlcm5ldCBjb250cm9sbGVyIiAoRkVDKQorICAgICAgICAgICAgICAgIGZyZWVzY2FsZSBjb2xkZmlyZSBNQ0Y1Mjh4IGFuZCBjb21wYXRpYmxlIEZFQworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnZGZWM1MjgyLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8wOC8wMSBtLmIuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VEUlZGRUNfSF8KKyNkZWZpbmUgX0VEUlZGRUNfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBiYXNlIGFkZHJlc3NlcworI2RlZmluZSBGRUMwX0FERFIgMHgwMDAwCisjZGVmaW5lIEZFQzFfQUREUiAweDAwMDAJLy90YmQKKworLy8gY29udHJvbCAvIHN0YXR1cyByZWdpc3RlcnMKKyNkZWZpbmUgRkVDX0VJUiAgICAgICAgICAgICAgICAgMHgxMDA0CS8vIGludGVycnVwdCBldmVudCByZWdpc3RlcgorI2RlZmluZSBGRUNfRUlNUiAgICAgICAgICAgICAgICAweDEwMDgJLy8gaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1JEQVIgICAgICAgICAgICAgICAgMHgxMDEwCS8vIHJlY2VpdmUgZGVzY3JpcHRvciBhY3RpdmUgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1REQVIgICAgICAgICAgICAgICAgMHgxMDE0CS8vIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWN0aXZlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19FQ1IgICAgICAgICAgICAgICAgIDB4MTAyNAkvLyBldGhlcm5ldCBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19NTUZSICAgICAgICAgICAgICAgIDB4MTA0MAkvLyBNSUkgZGF0YSByZWdpc3RlcgorI2RlZmluZSBGRUNfTVNDUiAgICAgICAgICAgICAgICAweDEwNDQJLy8gTUlJIHNwZWVkIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19NSUJDICAgICAgICAgICAgICAgIDB4MTA2NAkvLyBNSUIgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1JDUiAgICAgICAgICAgICAgICAgMHgxMDg0CS8vIHJlY2VpdmUgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBGRUNfVENSICAgICAgICAgICAgICAgICAweDEwQzQJLy8gdHJhbnNtaXQgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBGRUNfUEFMUiAgICAgICAgICAgICAgICAweDEwRTQJLy8gcGh5c2ljYWwgYWRkcmVzcyBsb3cgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1BBVVIgICAgICAgICAgICAgICAgMHgxMEU4CS8vIHBoeXNpY2FsIGFkZHJlc3MgaGlnaCArIHR5cGUgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX09QRCAgICAgICAgICAgICAgICAgMHgxMEVDCS8vIG9wY29kZSArIHBhdXNlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19JQVVSICAgICAgICAgICAgICAgIDB4MTExOAkvLyB1cHBlciAzMiBiaXQgb2YgaW5kaXZpZHVhbCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19JQUxSICAgICAgICAgICAgICAgIDB4MTExQwkvLyBsb3dlciAzMiBiaXQgb2YgaW5kaXZpZHVhbCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19HQVVSICAgICAgICAgICAgICAgIDB4MTEyMAkvLyB1cHBlciAzMiBiaXQgb2YgZ3JvdXAgaGFzaCB0YWJsZQorI2RlZmluZSBGRUNfR0FMUiAgICAgICAgICAgICAgICAweDExMjQJLy8gbG93ZXIgMzIgYml0IG9mIGdyb3VwIGhhc2ggdGFibGUKKyNkZWZpbmUgRkVDX1RGV1IgICAgICAgICAgICAgICAgMHgxMTQ0CS8vIHRyYW5zbWl0IEZJRk8gd2F0ZXJtYXJrCisjZGVmaW5lIEZFQ19GUkJSICAgICAgICAgICAgICAgIDB4MTE0QwkvLyBGSUZPIHJlY2VpdmUgYm91bmQgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0ZSU1IgICAgICAgICAgICAgICAgMHgxMTUwCS8vIEZJRk8gcmVjZWl2ZSBGSUZPIHN0YXJ0IHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19FUkRTUiAgICAgICAgICAgICAgIDB4MTE4MAkvLyBwb2ludGVyIHRvIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nCisjZGVmaW5lIEZFQ19FVERTUiAgICAgICAgICAgICAgIDB4MTE4NAkvLyBwb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworI2RlZmluZSBGRUNfRU1SQlIgICAgICAgICAgICAgICAweDExODgJLy8gbWF4aW11bSByZWNlaXZlIGJ1ZmZlciBzaXplCisKKy8vIG1pYiBibG9jayBjb3VudGVycyBtZW1vcnkgbWFwCisjZGVmaW5lIEZFQ19STU9OX1RfRFJPUCAgICAgICAgIDB4MTIwMAkvLyBjb3VudCBvZiBmcmFtZXMgbm90IGNvdW50ZWQgY29ycmVjdGx5CisjZGVmaW5lIEZFQ19STU9OX1RfUEFDS0VUUyAgICAgIDB4MTIwNAkvLyBSTU9OIHR4IHBhY2tldCBjb3VudAorI2RlZmluZSBGRUNfUk1PTl9UX0JDX1BLVCAgICAgICAweDEyMDgJLy8gUk1PTiB0eCBicm9hZGNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX01DX1BLVCAgICAgICAweDEyMEMJLy8gUk1PTiB0eCBtdWx0aWNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX0NSQ19BTElHTiAgICAweDEyMTAJLy8gUk1PTiB0eCBwYWNrZXRzIHcgQ1JDL2FsaWduIGVycm9yCisjZGVmaW5lIEZFQ19STU9OX1RfVU5ERVJTSVpFICAgIDB4MTIxNAkvLyBSTU9OIHR4IHBhY2tldHMgPCA2NCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9PVkVSU0laRSAgICAgMHgxMjE4CS8vIFJNT04gdHggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9GUkFHICAgICAgICAgMHgxMjFDCS8vIFJNT04gdHggcGFja2V0cyA8IDY0IGJ5dGVzLCBiYWQgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1RfSkFCICAgICAgICAgIDB4MTIyMAkvLyBSTU9OIHR4IHBhY2tldHMgPiBNQVhfRkwgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9DT0wgICAgICAgICAgMHgxMjI0CS8vIFJNT04gdHggY29sbGlzaW9uIGNvdW50CisjZGVmaW5lIEZFQ19STU9OX1RfUDY0ICAgICAgICAgIDB4MTIyOAkvLyBSTU9OIHR4ICAgICAgICAgICA2NCBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QNjVUTzEyNyAgICAgMHgxMjJDCS8vIFJNT04gdHggICA2NSB0byAgMTI3IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1AxMjhUTzI1NSAgICAweDEyMzAJLy8gUk1PTiB0eCAgMTI4IHRvICAyNTUgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDI1NlRPNTExICAgIDB4MTIzNAkvLyBSTU9OIHR4ICAyNTYgdG8gIDUxMSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QNTEyVE8xMDIzICAgMHgxMjM4CS8vIFJNT04gdHggIDUxMiB0byAxMDIzIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1AxMDI0VE8yMDQ3ICAweDEyM0MJLy8gUk1PTiB0eCAxMDI0IHRvIDIwNDcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUF9HVEUyMDQ4ICAgIDB4MTI0MAkvLyBSTU9OIHR4IHcgPiAyMDQ4IGJ5dGVzCisjZGVmaW5lIEZFQ19STU9OX1RfT0NURVRTICAgICAgIDB4MTI0NAkvLyBSTU9OIHR4IG9jdGV0cworI2RlZmluZSBGRUNfSUVFRV9UX0RST1AgICAgICAgICAweDEyNDgJLy8gY291bnQgb2YgZnJhbWVzIG5vdCBjb3VudGVkIGNvcnJlY3RseQorI2RlZmluZSBGRUNfSUVFRV9UX0ZSQU1FX09LICAgICAweDEyNEMJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIE9LCisjZGVmaW5lIEZFQ19JRUVFX1RfMUNPTCAgICAgICAgIDB4MTI1MAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBzaW5nbGUgY29sbGlzaW9uCisjZGVmaW5lIEZFQ19JRUVFX1RfTUNPTCAgICAgICAgIDB4MTI1NAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBtdWx0aXBsZSBjb2xsaXNpb25zCisjZGVmaW5lIEZFQ19JRUVFX1RfREVGICAgICAgICAgIDB4MTI1OAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgYWZ0ZXIgZGVmZXJyYWwgZGVsYXkKKyNkZWZpbmUgRkVDX0lFRUVfVF9MQ09MICAgICAgICAgMHgxMjVDCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIGxhdGUgY29sbGlzaW9ucworI2RlZmluZSBGRUNfSUVFRV9UX0VYQ09MICAgICAgICAweDEyNjAJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggZXhjZXNzaXZlIGNvbGxpc2lvbnMKKyNkZWZpbmUgRkVDX0lFRUVfVF9NQUNFUlIgICAgICAgMHgxMjY0CS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIHR4LUZJRk8gdW5kZXJydW4KKyNkZWZpbmUgRkVDX0lFRUVfVF9DU0VSUiAgICAgICAgMHgxMjY4CS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIGNhcnJpZXIgc2Vuc2UgZXJyb3IKKyNkZWZpbmUgRkVDX0lFRUVfVF9TUUUgICAgICAgICAgMHgxMjZDCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIFNRRSBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9UX0ZEWEZDICAgICAgICAweDEyNzAJLy8gZmxvdyBjb250cm9sIHBhdXNlIGZyYW1lcyB0cmFuc21pdHRlZAorI2RlZmluZSBGRUNfSUVFRV9UX09DVEVUU19PSyAgICAweDEyNzQJLy8gb2N0ZXQgY291bnQgZm9yIGZyYW1lcyB0cmFuc21pdHRlZCB3L28gZXJyb3IKKyNkZWZpbmUgRkVDX1JNT05fUl9QQUNLRVRTICAgICAgMHgxMjg0CS8vIFJNT04gcnggcGFja2V0IGNvdW50CisjZGVmaW5lIEZFQ19STU9OX1JfQkNfUEtUICAgICAgIDB4MTI4OAkvLyBSTU9OIHJ4IGJyb2FkY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfTUNfUEtUICAgICAgIDB4MTI4QwkvLyBSTU9OIHJ4IG11bHRpY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfQ1JDX0FMSUdOICAgIDB4MTI5MAkvLyBSTU9OIHJ4IHBhY2tldHMgdyBDUkMvYWxpZ24gZXJyb3IKKyNkZWZpbmUgRkVDX1JNT05fUl9VTkRFUlNJWkUgICAgMHgxMjk0CS8vIFJNT04gcnggcGFja2V0cyA8IDY0IGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9SX09WRVJTSVpFICAgICAweDEyOTgJLy8gUk1PTiByeCBwYWNrZXRzID4gTUFYX0ZMIGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9SX0ZSQUcgICAgICAgICAweDEyOUMJLy8gUk1PTiByeCBwYWNrZXRzIDwgNjQgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fUl9KQUIgICAgICAgICAgMHgxMkEwCS8vIFJNT04gcnggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgYmFkIENSQworI2RlZmluZSBGRUNfUk1PTl9SX1JFU1ZEXzAgICAgICAweDEyQTQJLy8KKyNkZWZpbmUgRkVDX1JNT05fUl9QNjQgICAgICAgICAgMHgxMkE4CS8vIFJNT04gcnggICAgICAgICAgIDY0IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1A2NVQwMTI3ICAgICAweDEyQUMJLy8gUk1PTiByeCAgIDY1IHRvICAxMjcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDEyOFRPMjU1ICAgIDB4MTJCMAkvLyBSTU9OIHJ4ICAxMjggdG8gIDI1NSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QMjU2VE81MTEgICAgMHgxMkI0CS8vIFJNT04gcnggIDI1NiB0byAgNTExIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1A1MTJUTzEwMjMgICAweDEyQjgJLy8gUk1PTiByeCAgNTEyIHRvIDEwMjMgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDEwMjRUTzIwNDcgIDB4MTJCQwkvLyBSTU9OIHJ4IDEwMjQgdG8gMjA0NyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9HVEUyMDQ4ICAgICAgMHgxMkMwCS8vIFJNT04gcnggdyA+IDIwNDggYnl0ZXMKKyNkZWZpbmUgRkVDX1JNT05fUl9PQ1RFVFMgICAgICAgMHgxMkM0CS8vIFJNT04gcnggb2N0ZXRzCisjZGVmaW5lIEZFQ19JRUVFX1JfRFJPUCAgICAgICAgIDB4MTJDOAkvLyBjb3VudCBvZiBmcmFtZXMgbm90IGNvdW50ZWQgY29ycmVjdGx5CisjZGVmaW5lIEZFQ19JRUVFX1JfRlJBTUVfT0sgICAgIDB4MTJDQwkvLyBmcmFtZXMgcmVjZWl2ZWQgT0sKKyNkZWZpbmUgRkVDX0lFRUVfUl9DUkMgICAgICAgICAgMHgxMkQwCS8vIGZyYW1lcyByZWNlaXZlZCB3aXRoIENSQyBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9SX0FMSUdOICAgICAgICAweDEyRDQJLy8gZnJhbWVzIHJlY2VpdmVkIHdpdGggYWxpZ25tZW50IGVycm9yCisjZGVmaW5lIEZFQ19JRUVFX1JfTUFDRVJSICAgICAgIDB4MTJEOAkvLyByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgY291bnQKKyNkZWZpbmUgRkVDX0lFRUVfUl9GRFhGQyAgICAgICAgMHgxMkRDCS8vIGZsb3cgY29udHJvbCBwYXVzZSBmcmFtZXMgcmVjZWl2ZWQKKyNkZWZpbmUgRkVDX0lFRUVfUl9PQ1RFVFNfT0sgICAgMHgxMkUwCS8vIG9jdGV0IGNvdW50IGZvciBmcmFtZXMgcmN2ZCB3L28gZXJyb3IKKworLy8gcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MKKyNkZWZpbmUgRkVDX0VJUl9VTiAgICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIEZFQ19FSVJfUkwgICAgICAgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0xDICAgICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9FQkVSUiAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIEZFQ19FSVJfTUlJICAgICAgICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1JYQiAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9SWEYgICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfVFhCICAgICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1RYRiAgICAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9HUkEgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfQkFCVCAgICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0JBQlIgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9IQkVSUiAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX0VJTVJfVU4gICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1JMICAgICAgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9MQyAgICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfRUJFUlIgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX01JSSAgICAgICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9SWEIgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfUlhGICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1RYQiAgICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9UWEYgICAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfR1JBICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0JBQlQgICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9CQUJSICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfSEJFUlIgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX1JEQVJfUl9ERVNfQUNUSVZFICAgKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkVDX1REQVJfWF9ERVNfQUNUSVZFICAgKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkVDX0VDUl9SRVNFVCAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19FQ1JfRVRIRVJfRU4gICAgICAgICgweDAwMDAwMDAyKQorCisjZGVmaW5lIEZFQ19NTUZSX0RBVEEoeCkgICAgICAgICgoKHgpICYgMHhGRkZGKSkKKyNkZWZpbmUgRkVDX01NRlJfVEEgICAgICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIEZFQ19NTUZSX1JBKHgpICAgICAgICAgICgoKHgpICYgMHgxRikgPDwgMTgpCisjZGVmaW5lIEZFQ19NTUZSX1BBKHgpICAgICAgICAgICgoKHgpICYgMHgxRikgPDwgMjMpCisjZGVmaW5lIEZFQ19NTUZSX09QX1dSICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBGRUNfTU1GUl9PUF9SRCAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgRkVDX01NRlJfU1QgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisKKyNkZWZpbmUgRkVDX01TQ1JfTUlJX1NQRUVEKHgpICAgKCgoeCkgJiAweDFGKSA8PCAxKQorI2RlZmluZSBGRUNfTVNDUl9ESVNfUFJFQU1CTEUgICAoMHgwMDAwMDAwOCkKKworI2RlZmluZSBGRUNfTUlCQ19NSUJfSURMRSAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX01JQkNfTUlCX0RJU0FCTEUgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX1JDUl9MT09QICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19SQ1JfRFJUICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBGRUNfUkNSX01JSV9NT0RFICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgRkVDX1JDUl9QUk9NICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIEZFQ19SQ1JfQkNfUkVKICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBGRUNfUkNSX0ZDRSAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgRkVDX1JDUl9NQVhfRkwoeCkgICAgICAgKCgoeCkgJiAweDA3RkYpIDw8IDE2KQorCisjZGVmaW5lIEZFQ19UQ1JfR1RTICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBGRUNfVENSX0hCQyAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgRkVDX1RDUl9GREVOICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIEZFQ19UQ1JfVEZDX1BBVVNFICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBGRUNfVENSX1JGQ19QQVVTRSAgICAgICAoMHgwMDAwMDAxMCkKKworI2RlZmluZSBGRUNfUEFMUl9CWVRFMyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisvLyNkZWZpbmUgRkVDX1BBVVJfVFlQRSh4KSAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8ICAwKQorI2RlZmluZSBGRUNfUEFVUl9CWVRFNSh4KSAgICAgICAoKCh4KSAmICAgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19QQVVSX0JZVEU0KHgpICAgICAgICgoKHgpICYgICAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfT1BEX1BBVVNFX0RVUih4KSAgICAoKCh4KSAmIDB4RkZGRikpCisvLyNkZWZpbmUgRkVDX09QRF9PUENPREUoeCkgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0lBVVJfQllURTcoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0lBVVJfQllURTYoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0lBVVJfQllURTUoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0lBVVJfQllURTQoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfSUFMUl9CWVRFMyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU3KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU2KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU1KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU0KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisKKyNkZWZpbmUgRkVDX0dBTFJfQllURTMoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0dBTFJfQllURTIoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0dBTFJfQllURTEoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0dBTFJfQllURTAoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKy8vIF5eXl4KKworI2RlZmluZSBGRUNfVEZXUl9YX1dNUktfNjQgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgRkVDX1RGV1JfWF9XTVJLXzEyOCAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEZFQ19URldSX1hfV01SS18xOTIgICAgICgweDAwMDAwMDAzKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0ZSQlJfUl9CT1VORCh4KSAgICAgKCgoeCkgJiAweEZGKSA8PCAyKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0ZSU1JfUl9GU1RBUlQoeCkgICAgKCgoeCkgJiAweEZGKSA8PCAyKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0VSRFNSX1JfREVTX1NUQVJUKHgpICAoKCh4KSAmIDB4M0ZGRkZGRkYpIDw8IDIpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfRVRTRFJfWF9ERVNfU1RBUlQoeCkgICgoKHgpICYgMHgzRkZGRkZGRikgPDwgMikKKworI2RlZmluZSBGRUNfRU1SQlJfUl9CVUZfU0laRSh4KSAoKCh4KSAmIDB4N0YpIDw8ICA0KQorCisjZGVmaW5lIEZFQ19SeEJEX1RSICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBGRUNfUnhCRF9PViAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRkVDX1J4QkRfQ1IgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZFQ19SeEJEX05PICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBGRUNfUnhCRF9MRyAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgRkVDX1J4QkRfTUMgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZFQ19SeEJEX0JDICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBGRUNfUnhCRF9NICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgRkVDX1J4QkRfTCAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEZFQ19SeEJEX1IwMiAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBGRUNfUnhCRF9XICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRkVDX1J4QkRfUjAxICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19SeEJEX0lOVVNFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfUnhCRF9FICAgICAgICAgICAgICAweDgwMDAKKworLy9tLmIuCisvLyNkZWZpbmUgRkVDX1R4QkRfQ1NMICAgICAgICAgICAgMHgwMDAxCisvLyNkZWZpbmUgRkVDX1R4QkRfVU4gICAgICAgICAgICAgMHgwMDAyCisvLyNkZWZpbmUgRkVDX1R4QkRfUkwgICAgICAgICAgICAgMHgwMDQwCisvLyNkZWZpbmUgRkVDX1R4QkRfTEMgICAgICAgICAgICAgMHgwMDgwCisvLyNkZWZpbmUgRkVDX1R4QkRfSEIgICAgICAgICAgICAgMHgwMTAwCisvLyNkZWZpbmUgRkVDX1R4QkRfREVGICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEZFQ19UeEJEX0FCQyAgICAgICAgICAgIDB4MDIwMAorLy8gXl5eXgorI2RlZmluZSBGRUNfVHhCRF9UQyAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkVDX1R4QkRfTCAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEZFQ19UeEJEX1RPMiAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBGRUNfVHhCRF9XICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRkVDX1R4QkRfVE8xICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19UeEJEX0lOVVNFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfVHhCRF9SICAgICAgICAgICAgICAweDgwMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dTdGF0dXM7CQkvLyBjb250cm9sIC8gc3RhdHVzICAtLS0gIHVzZWQgYnkgZWRydiwgZG8gbm90IGNoYW5nZSBpbiBhcHBsaWNhdGlvbgorCVdPUkQgbV93TGVuZ3RoOwkJLy8gdHJhbnNmZXIgbGVuZ3RoCisJQllURSAqbV9wYkRhdGE7CQkvLyBidWZmZXIgYWRkcmVzcworfSB0QnVmZmVyRGVzY3I7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKE5PX09GX0lOU1RBTkNFUyA+IDEpCisjZGVmaW5lIEVDSV9XUklURV9EV19SRUcob2ZmLHZhbCkgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbb2ZmXSkpCisjZWxzZQorI2lmIChFRFJWX1VTRURfRVRIX0NUUkwgPT0gMCkKKyNkZWZpbmUgRUNJX1dSSVRFX0RXX1JFRyhvZmYsdmFsKSAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMwX0FERFIrb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMF9BRERSK29mZl0pKQorI2Vsc2UKKyNkZWZpbmUgRUNJX1dSSVRFX0RXX1JFRyhvZmYsdmFsKSAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMxX0FERFIrb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMV9BRERSK29mZl0pKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfRkVDX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZTaW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydlNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZTaW0uaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBldGhlcm5ldCBkcml2ZXIgc2ltdWxhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnZTaW0uaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE1IGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRURSVlNJTV9IXworI2RlZmluZSBfRURSVlNJTV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBFZHJ2UnhJbnRlcnJ1cHRIYW5kbGVyKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgQllURSAqIHBiRXRoZXJuZXREYXRhX3AsCisJCQkgICAgV09SRCB3RGF0YUxlbl9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZTSU1fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjBmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbC5oCkBAIC0wLDAgKzEsMjczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFUEwgQVBJIGxheWVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9BUElfSF8KKyNkZWZpbmUgX0VQTF9BUElfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbFNkby5oIgorI2luY2x1ZGUgIkVwbE9iZC5oIgorI2luY2x1ZGUgIkVwbExlZC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOworCXRFcGxObXROb2RlRXZlbnQgbV9Ob2RlRXZlbnQ7CisJV09SRCBtX3dFcnJvckNvZGU7CS8vIEVQTCBlcnJvciBjb2RlIGlmIG1fTm9kZUV2ZW50ID09IGtFcGxObXROb2RlRXZlbnRFcnJvcgorCUJPT0wgbV9mTWFuZGF0b3J5OworCit9IHRFcGxBcGlFdmVudE5vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsJLy8gbG9jYWwgTk1UIHN0YXRlCisJdEVwbE5tdEJvb3RFdmVudCBtX0Jvb3RFdmVudDsKKwlXT1JEIG1fd0Vycm9yQ29kZTsJLy8gRVBMIGVycm9yIGNvZGUgaWYgbV9Cb290RXZlbnQgPT0ga0VwbE5tdEJvb3RFdmVudEVycm9yCisKK30gdEVwbEFwaUV2ZW50Qm9vdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxMZWRUeXBlIG1fTGVkVHlwZTsJLy8gdHlwZSBvZiB0aGUgTEVEIChlLmcuIFN0YXR1cyBvciBFcnJvcikKKwlCT09MIG1fZk9uOwkJLy8gc3RhdGUgb2YgdGhlIExFRCAoZS5nLiBvbiBvciBvZmYpCisKK30gdEVwbEFwaUV2ZW50TGVkOworCit0eXBlZGVmIGVudW0geworCWtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlID0gMHgxMCwJLy8gbV9ObXRTdGF0ZUNoYW5nZQorLy8gICAga0VwbEFwaUV2ZW50UmVxdWVzdE5tdCAgICAgPSAweDExLCAgICAvLyBtX2JObXRDbWQKKwlrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yID0gMHgxMiwJLy8gbV9JbnRlcm5hbEVycm9yLCBTdGFjayBoYWx0ZWQKKwlrRXBsQXBpRXZlbnRXYXJuaW5nID0gMHgxMywJLy8gbV9JbnRlcm5hbEVycm9yLCBTdGFjayBydW5uaW5nCisJa0VwbEFwaUV2ZW50Tm9kZSA9IDB4MjAsCS8vIG1fTm9kZQorCWtFcGxBcGlFdmVudEJvb3QgPSAweDIxLAkvLyBtX0Jvb3QKKwlrRXBsQXBpRXZlbnRTZG8gPSAweDYyLAkvLyBtX1NkbworCWtFcGxBcGlFdmVudE9iZEFjY2VzcyA9IDB4NjksCS8vIG1fT2JkQ2JQYXJhbQorCWtFcGxBcGlFdmVudExlZCA9IDB4NzAsCS8vIG1fTGVkCisKK30gdEVwbEFwaUV2ZW50VHlwZTsKKwordHlwZWRlZiB1bmlvbiB7CisJdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgbV9ObXRTdGF0ZUNoYW5nZTsKKwl0RXBsRXZlbnRFcnJvciBtX0ludGVybmFsRXJyb3I7CisJdEVwbFNkb0NvbUZpbmlzaGVkIG1fU2RvOworCXRFcGxPYmRDYlBhcmFtIG1fT2JkQ2JQYXJhbTsKKwl0RXBsQXBpRXZlbnROb2RlIG1fTm9kZTsKKwl0RXBsQXBpRXZlbnRCb290IG1fQm9vdDsKKwl0RXBsQXBpRXZlbnRMZWQgbV9MZWQ7CisKK30gdEVwbEFwaUV2ZW50QXJnOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRFcGxBcGlDYkV2ZW50KSAodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkJCQkgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkJCQkgdm9pZCBHRU5FUklDICogcFVzZXJBcmdfcCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlCT09MIG1fZkFzeW5jT25seTsJLy8gZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgUFJlcworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBsb2NhbCBub2RlIElECisJQllURSBtX2FiTWFjQWRkcmVzc1s2XTsJLy8gbG9jYWwgTUFDIGFkZHJlc3MKKworCS8vIDB4MUY4MjogTk1UX0ZlYXR1cmVGbGFnc19VMzIKKwlEV09SRCBtX2R3RmVhdHVyZUZsYWdzOworCS8vIEN5Y2xlIExlbmd0aCAoMHgxMDA2OiBOTVRfQ3ljbGVMZW5fVTMyKSBpbiBbdXNdCisJRFdPUkQgbV9kd0N5Y2xlTGVuOwkvLyByZXF1aXJlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisJLy8gMHgxRjk4OiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjk4LjE6IElzb2NoclR4TWF4UGF5bG9hZF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUlzb2NoclR4TWF4UGF5bG9hZDsJLy8gY29uc3QKKwkvLyAweDFGOTguMjogSXNvY2hyUnhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyUnhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4zOiBQUmVzTWF4TGF0ZW5jeV9VMzIKKwlEV09SRCBtX2R3UHJlc01heExhdGVuY3k7CS8vIGNvbnN0IGluIFtuc10sIG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJLy8gMHgxRjk4LjQ6IFBSZXFBY3RQYXlsb2FkTGltaXRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlQcmVxQWN0UGF5bG9hZExpbWl0OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gKCsyOCBieXRlcykKKwkvLyAweDFGOTguNTogUFJlc0FjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXNBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiBvZiBQcmVzIGZyYW1lICgrMjggYnl0ZXMpCisJLy8gMHgxRjk4LjY6IEFTbmRNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdBc25kTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNzogTXVsdGlwbEN5Y2xlQ250X1U4CisJdW5zaWduZWQgaW50IG1fdWlNdWx0aXBsQ3ljbGVDbnQ7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTguODogQXN5bmNNVFVfVTE2CisJdW5zaWduZWQgaW50IG1fdWlBc3luY010dTsJLy8gcmVxdWlyZWQgdG8gc2V0IHVwIG1heCBmcmFtZSBzaXplCisJLy8gMHgxRjk4Ljk6IFByZXNjYWxlcl9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXNjYWxlcjsJLy8gcmVxdWlyZWQgZm9yIHN5bmMKKwkvLyAkJCQgTXVsdGlwbGV4ZWQgU2xvdAorCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2U7CisKKwkvLyAweDFGOEE6IE5NVF9NTkN5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdXYWl0U29jUHJlcTsKKworCS8vIDB4MUY4QS4yOiBBc3luY1Nsb3RUaW1lb3V0X1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd0FzeW5jU2xvdFRpbWVvdXQ7CisKKwlEV09SRCBtX2R3RGV2aWNlVHlwZTsJLy8gTk1UX0RldmljZVR5cGVfVTMyCisJRFdPUkQgbV9kd1ZlbmRvcklkOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlZlbmRvcklkX1UzMgorCURXT1JEIG1fZHdQcm9kdWN0Q29kZTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5Qcm9kdWN0Q29kZV9VMzIKKwlEV09SRCBtX2R3UmV2aXNpb25OdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUmV2aXNpb25Ob19VMzIKKwlEV09SRCBtX2R3U2VyaWFsTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlNlcmlhbE5vX1UzMgorCVFXT1JEIG1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dEYXRlOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td1RpbWU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdJcEFkZHJlc3M7CisJRFdPUkQgbV9kd1N1Ym5ldE1hc2s7CisJRFdPUkQgbV9kd0RlZmF1bHRHYXRld2F5OworCUJZVEUgbV9zSG9zdG5hbWVbMzJdOworCUJZVEUgbV9hYlZlbmRvclNwZWNpZmljRXh0Mls0OF07CisKKwljaGFyICptX3BzekRldk5hbWU7CS8vIE5NVF9NYW51ZmFjdERldk5hbWVfVlMgKDB4MTAwOC8wIGxvY2FsIE9EKQorCWNoYXIgKm1fcHN6SHdWZXJzaW9uOwkvLyBOTVRfTWFudWZhY3RId1ZlcnNfVlMgICgweDEwMDkvMCBsb2NhbCBPRCkKKwljaGFyICptX3BzelN3VmVyc2lvbjsJLy8gTk1UX01hbnVmYWN0U3dWZXJzX1ZTICAoMHgxMDBBLzAgbG9jYWwgT0QpCisKKwl0RXBsQXBpQ2JFdmVudCBtX3BmbkNiRXZlbnQ7CisJdm9pZCAqbV9wRXZlbnRVc2VyQXJnOworCXRFcGxTeW5jQ2IgbV9wZm5DYlN5bmM7CisKK30gdEVwbEFwaUluaXRQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKm1fcEltYWdlOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKworfSB0RXBsQXBpUHJvY2Vzc0ltYWdlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpSW5pdGlhbGl6ZSh0RXBsQXBpSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpU2h1dGRvd24odm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVJlYWRPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgdm9pZCAqcERzdERhdGFfbGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlXcml0ZU9iamVjdCh0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICAgdm9pZCAqcFNyY0RhdGFfbGVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wLAorCQkJCSAgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlGcmVlU2RvQ2hhbm5lbCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZExvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCXVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCXVuc2lnbmVkIGludCAqcHVpU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk9iZEFjY2Vzcyh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUxpbmtPYmplY3QodW5zaWduZWQgaW50IHVpT2JqSW5kZXhfcCwKKwkJCQkgICB2b2lkICpwVmFyX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlWYXJFbnRyaWVzX3AsCisJCQkJICAgdEVwbE9iZFNpemUgKiBwRW50cnlTaXplX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpRmlyc3RTdWJpbmRleF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRXhlY05tdENvbW1hbmQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzKHZvaWQpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbE5tdE5vZGVDb21tYW5kIE5vZGVDb21tYW5kX3ApOworI2VuZGlmCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgcHBJZGVudFJlc3BvbnNlX3ApOworCisvLyBmdW5jdGlvbnMgZm9yIHByb2Nlc3MgaW1hZ2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBzZXBhcmF0ZSBmaWxlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VTZXR1cCh2b2lkKTsKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4odEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKTsKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KHRFcGxBcGlQcm9jZXNzSW1hZ2UgKiBwUElfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfQVBJX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBbWkuaApAQCAtMCwwICsxLDM2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIERlZmluaXRpb25zIGZvciBBYnN0cmFjdCBNZW1vcnkgSW50ZXJmYWNlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQW1pLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR0NDCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgIDA2LjAzLjIwMDAgIC1ycworICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24KKworICAgMTYuMDkuMjAwMiAgLWFzCisgICAgICAgICAgICAgICBUbyBzYXZlIGNvZGUgc3BhY2UgdGhlIGZ1bmN0aW9ucyBBbWlTZXRCeXRlIGFuZCBBbWlHZXRCeXRlCisgICAgICAgICAgICAgICBhcmUgcmVwbGFjZWQgYnkgbWFjcm9zLiBGb3IgdGFyZ2V0cyB3aGljaCBhc3NpZ24gQllURSBieQorICAgICAgICAgICAgICAgYW4gMTZCaXQgdHlwZSwgdGhlIGRlZmluaXRpb24gb2YgbWFjcm9zIG11c3QgY2hhbmdlZCB0bworICAgICAgICAgICAgICAgZnVuY3Rpb25zLgorCisgICAyMy4wMi4yMDA1ICByLmQuOgorICAgICAgICAgICAgICAgRnVuY3Rpb25zIGluY2x1ZGVkIGZvciBleHRlbmRlZCBkYXRhIHR5cGVzIHN1Y2ggYXMgVU5TSUdORUQyNCwKKyAgICAgICAgICAgICAgIFVOU0lHTkVENDAsIC4uLgorCisgICAxMy4wNi4yMDA2ICBkLmsuOgorICAgICAgICAgICAgICAgRXh0ZW5kZWQgdGhlIGludGVyZmFjZSBmb3IgRVBMIHdpdGggdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTEFNSV9IXworI2RlZmluZSBfRVBMQU1JX0hfCisKKyNpZiAoKERFVl9TWVNURU0gJiBfREVWXzY0QklUX1NVUFBPUlRfKSA9PSAwKQorLy8gICAgI2lmZGVmIFVTRV9WQVI2NAorI2Vycm9yICdFUlJPUjogZGV2ZWxvcG1lbnQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgNjQgYml0IG9wZXJhdGlvbnMhJworLy8gICAgI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2lmIGRlZmluZWQoSU5MSU5FX0ZVTkNUSU9OX0RFRikKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorI2RlZmluZSBJTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKyNkZWZpbmUgRVBMX0FNSV9JTkxJTkVECisjaW5jbHVkZSAiLi4vRXBsU3RhY2svYW1peDg2LmMiCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykKKyNpZiBkZWZpbmVkKF9fbTY4a19fKQkJLy8gaXQgaXMgYW4gYmlnIGVuZGlhbiBtYWNoaW5lCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBFUExfQU1JX0lOTElORUQKKyNpbmNsdWRlICIuLi9FcGxTdGFjay9hbWliZS5jIgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHdyaXRlIGZ1bmN0aW9ucworLy8KKy8vIFRvIHNhdmUgY29kZSBzcGFjZSB0aGUgZnVuY3Rpb24gQW1pU2V0Qnl0ZSBpcyByZXBsYWNlZCBieQorLy8gYW4gbWFjcm8uCisvLyB2b2lkICAgUFVCTElDICBBbWlTZXRCeXRlICAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCk7CisKKyNkZWZpbmUgQW1pU2V0Qnl0ZVRvQmUocEFkZHJfcCwgYkJ5dGVWYWxfcCkgIHsqKEJZVEUgRkFSKikocEFkZHJfcCkgPSAoYkJ5dGVWYWxfcCk7fQorI2RlZmluZSBBbWlTZXRCeXRlVG9MZShwQWRkcl9wLCBiQnl0ZVZhbF9wKSAgeyooQllURSBGQVIqKShwQWRkcl9wKSA9IChiQnl0ZVZhbF9wKTt9CisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKwl2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHJlYWQgZnVuY3Rpb25zCisvLworLy8gVG8gc2F2ZSBjb2RlIHNwYWNlIHRoZSBmdW5jdGlvbiBBbWlHZXRCeXRlIGlzIHJlcGxhY2VkIGJ5CisvLyBhbiBtYWNyby4KKy8vIEJZVEUgICBQVUJMSUMgIEFtaUdldEJ5dGUgICh2b2lkIEZBUiogcEFkZHJfcCk7CisKKyNkZWZpbmUgQW1pR2V0Qnl0ZUZyb21CZShwQWRkcl9wKSAgKCooQllURSBGQVIqKShwQWRkcl9wKSkKKyNkZWZpbmUgQW1pR2V0Qnl0ZUZyb21MZShwQWRkcl9wKSAgKCooQllURSBGQVIqKShwQWRkcl9wKSkKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisJV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVdPUkQgUFVCTElDIEFtaUdldFdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNCgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSAyNCBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIERXT1JEIGR3RHdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmQyNFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXREd29yZDI0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vI2lmZGVmIFVTRV9WQVI2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQwIGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDBUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDBGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OCgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0OCBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQ4VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDgoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQ4RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNTYoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDU2KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA1NiBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNTZGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNjRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNjRGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlHZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCk7CisKKyNlbmRpZgorCisjdW5kZWYgIElOTElORV9FTkFCTEVECQkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyNkZWZpbmUgRVBMX0FNSV9JTkNMVURFRAorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCQkJCS8vIGlmbmRlZiBfRVBMQU1JX0hfCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlci8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUdlbmVyaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTllMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUdlbmVyaWMuYwpAQCAtMCwwICsxLDIwNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgZ2VuZXJpYyBFUEwgQVBJIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEFwaUdlbmVyaWMuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMjEgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8wNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsTGVkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10Q251LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0NvbXUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbElkZW50dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsU3RhdHVzdS5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpID09IDApCisjZXJyb3IgIkVQTCBBUEkgbGF5ZXIgbmVlZHMgRVBMIG1vZHVsZSBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxBcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQXBpSW5pdFBhcmFtIG1fSW5pdFBhcmFtOworCit9IHRFcGxBcGlJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXBpSW5zdGFuY2UgRXBsQXBpSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5NVCBzdGF0ZSBjaGFuZ2UgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCQlObXRTdGF0ZUNoYW5nZV9wKTsKKworLy8gdXBkYXRlIERMTCBjb25maWd1cmF0aW9uIGZyb20gT0QKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVEbGxDb25maWcoQk9PTCBmVXBkYXRlSWRlbnRpdHlfcCk7CisKKy8vIHVwZGF0ZSBPRCBmcm9tIGluaXQgcGFyYW0KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVPYmQodm9pZCk7CisKKy8vIHByb2Nlc3MgZXZlbnRzIGZyb20gdXNlciBldmVudCBxdWV1ZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gb2YgU0RPIG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiU2RvQ29uKHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKTsKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb25zIG9mIE5tdE1udSBtb2R1bGUKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5vZGVFdmVudCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgdEVwbE5tdE5vZGVFdmVudCBOb2RlRXZlbnRfcCwKKwkJCQkJICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJCSAgIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgICBCT09MIGZNYW5kYXRvcnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkJvb3RFdmVudCh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApOworI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gb2YgTGVkdSBtb2R1bGUKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCUJPT0wgZk9uX3ApOworI2VuZGlmCisKKy8vIE9EIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIChpbXBsZW1lbnRlZCBpbiBPYmpkaWN0LmMpCit0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0UmFtKHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUluaXRpYWxpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjay4KKy8vICAgICAgICAgICAgICBBZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHN0YXJ0CisvLyAgICAgICAgICAgICAgdGhlIE5NVCBzdGF0ZSBtYWNoaW5lIHZpYQorLy8gICAgICAgICAgICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3UmVzZXQpCisvLyAgICAgICAgICAgICAgYW5kIHRoZXJlYnkgdGhlIHdob2xlIEVQTCBzdGFjayA6LSkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgICAgICAgICAgPSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlJbml0aWFsaXplKHRFcGxBcGlJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsT2JkSW5pdFBhcmFtIE9iZEluaXRQYXJhbTsKKwl0RXBsRGxsa0luaXRQYXJhbSBEbGxrSW5pdFBhcmFtOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKyNlbmRpZgorCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsQXBpSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbEFwaUluc3RhbmNlX2cpKTsKKworCUVQTF9NRU1DUFkoJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0sIHBJbml0UGFyYW1fcCwKKwkJICAgbWluKHNpemVvZih0RXBsQXBpSW5pdFBhcmFtKSwKKwkJICAgICAgIHBJbml0UGFyYW1fcC0+bV91aVNpemVPZlN0cnVjdCkpOworCisJLy8gY2hlY2sgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudCA9PSBOVUxMKSB7CS8vIGFwcGxpY2F0aW9uIG11c3QgYWx3YXlzIGhhdmUgYW4gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJLy8gaW5pdCBPRAorLy8gRklYTUUKKy8vICAgIFJldCA9IEVwbE9iZEluaXRSYW0oJk9iZEluaXRQYXJhbSk7CisvLyAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorLy8gICAgeworLy8gICAgICAgIGdvdG8gRXhpdDsKKy8vICAgIH0KKworCS8vIGluaXRpYWxpemUgRXBsT2JkIG1vZHVsZQorCVJldCA9IEVwbE9iZEluaXQoJk9iZEluaXRQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwlTaGJFcnJvciA9IFNoYkluaXQoKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbEV2ZW50ayBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudGtJbml0KEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYlN5bmMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbEV2ZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudHVJbml0KEVwbEFwaVByb2Nlc3NFdmVudCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXQgRXBsVGltZXJrIG1vZHVsZQorCVJldCA9IEVwbFRpbWVya0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxObXRrIG1vZHVsZSBiZWZvcmUgRExMCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCVJldCA9IEVwbE5tdGtJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbERsbGsgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCUVQTF9NRU1DUFkoRGxsa0luaXRQYXJhbS5tX2JlX2FiU3JjTWFjLAorCQkgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzLCA2KTsKKwlSZXQgPSBFcGxEbGxrQWRkSW5zdGFuY2UoJkRsbGtJbml0UGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbEVycm9ySGFuZGxlcmsgbW9kdWxlCisJUmV0ID0gRXBsRXJyb3JIYW5kbGVya0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxEbGxrQ2FsIG1vZHVsZQorCVJldCA9IEVwbERsbGtDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxEbGx1Q2FsIG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQWRkSW5zdGFuY2UoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsUGRvayBtb2R1bGUKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCVJldCA9IEVwbFBkb2tBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbFBkb2tDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxObXRDbnUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisJUmV0ID0gRXBsTm10Q251QWRkSW5zdGFuY2UoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTm9kZUlkKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsTm10dSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dUluaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgTk1UIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0gRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYihFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGluaXRpYWxpemUgRXBsTm10TW51IG1vZHVsZQorCVJldCA9IEVwbE5tdE1udUluaXQoRXBsQXBpQ2JOb2RlRXZlbnQsIEVwbEFwaUNiQm9vdEV2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxJZGVudHUgbW9kdWxlCisJUmV0ID0gRXBsSWRlbnR1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbFN0YXR1c3UgbW9kdWxlCisJUmV0ID0gRXBsU3RhdHVzdUluaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsTGVkdSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisJUmV0ID0gRXBsTGVkdUluaXQoRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0IFNETyBtb2R1bGUKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkgfHwgXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKSkKKwkvLyBpbml0IHNkbyBjb21tYW5kIGxheWVyCisJUmV0ID0gRXBsU2RvQ29tSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgTk1UIHN0YXRlIG1hY2hpbmUKKwkvLyB2aWEgRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dSZXNldCkKKwkvLyBhbmQgdGhlcmVieSB0aGUgd2hvbGUgRVBMIHN0YWNrCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpU2h1dGRvd24oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVNodXRkb3duKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vICQkJCBkLmsuOiBjaGVjayBpZiBOTVQgc3RhdGUgaXMgTk1UX0dTX09GRgorCisJLy8gJCQkIGQuay46IG1heWJlIGRlbGV0ZSBldmVudCBxdWV1ZXMgYXQgZmlyc3QsIGJ1dCB0aGlzIGltcGxpZXMgdGhhdAorCS8vICAgICAgICAgICBubyBvdGhlciBtb2R1bGUgbXVzdCBub3QgdXNlIHRoZSBldmVudCBxdWV1ZXMgZm9yIGNvbW11bmljYXRpb24KKwkvLyAgICAgICAgICAgZHVyaW5nIHNodXRkb3duLgorCisJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgbW9kdWxlcworCisJLy8gZGVpbml0aWFsaXplIEVwbFNkb0NvbSBtb2R1bGUKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkgfHwgXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKSkKKwlSZXQgPSBFcGxTZG9Db21EZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsU2RvQ29tRGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxMZWR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwlSZXQgPSBFcGxMZWR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbExlZHVEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10TW51IG1vZHVsZQorCVJldCA9IEVwbE5tdE1udURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXRNbnVEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxJZGVudHUgbW9kdWxlCisJUmV0ID0gRXBsSWRlbnR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbElkZW50dURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbFN0YXR1c3UgbW9kdWxlCisJUmV0ID0gRXBsU3RhdHVzdURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxTdGF0dXN1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRDbnUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisJUmV0ID0gRXBsTm10Q251RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdENudURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10dSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXR1RGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbERsbHVDYWwgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsdUNhbERlbEluc3RhbmNlKCk6IDB4JVhcbiIsIFJldCk7CisKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbEV2ZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10ayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJUmV0ID0gRXBsTm10a0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXRrRGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbERsbGsgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCVJldCA9IEVwbERsbGtEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsa0RlbEluc3RhbmNlKCk6ICAgIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsa0NhbCBtb2R1bGUKKwlSZXQgPSBFcGxEbGxrQ2FsRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbERsbGtDYWxEZWxJbnN0YW5jZSgpOiAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRXZlbnRrIG1vZHVsZQorCVJldCA9IEVwbEV2ZW50a0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxUaW1lcmsgbW9kdWxlCisJUmV0ID0gRXBsVGltZXJrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbFRpbWVya0RlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJU2hiRXhpdCgpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlFeGVjTm10Q29tbWFuZCgpCisvLworLy8gRGVzY3JpcHRpb246IGV4ZWN1dGVzIGEgTk1UIGNvbW1hbmQsIGkuZS4gcG9zdCB0aGUgTk1UIGNvbW1hbmQvZXZlbnQgdG8gdGhlCisvLyAgICAgICAgICAgICAgTk1UayBtb2R1bGUuIE5NVCBjb21tYW5kcyB3aGljaCBhcmUgbm90IGFwcHJvcHJpYXRlIGluIHRoZSBjdXJyZW50CisvLyAgICAgICAgICAgICAgTk1UIHN0YXRlIGFyZSBzaWxlbnRseSBpZ25vcmVkLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlCisvLyAgICAgICAgICAgICAgTk1UIHN0YXRlIG1heSBjaGFuZ2UgdW50aWwgdGhlIE5NVCBjb21tYW5kIGlzIGFjdHVhbGx5IGV4ZWN1dGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IE5NVCBjb21tYW5kL2V2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUV4ZWNObXRDb21tYW5kKHRFcGxObXRFdmVudCBObXRFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dU5tdEV2ZW50KE5tdEV2ZW50X3ApOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlMaW5rT2JqZWN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gbWFwcyBhcnJheSBvZiBhcHBsaWNhdGlvbiB2YXJpYWJsZXMgb250byBzcGVjaWZpZWQgb2JqZWN0IGluIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpT2JqSW5kZXhfcCAgICAgICAgICAgID0gRnVuY3Rpb24gbWFwcyB2YXJpYWJsZXMgZm9yIHRoaXMgb2JqZWN0IGluZGV4CisvLyAgICAgICAgICAgICAgcFZhcl9wICAgICAgICAgICAgICAgICAgPSBQb2ludGVyIHRvIGRhdGEgbWVtb3J5IGFyZWEgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisvLyAgICAgICAgICAgICAgcHVpVmFyRW50cmllc19wICAgICAgICAgPSBJTjogcG9pbnRlciB0byBudW1iZXIgb2YgZW50cmllcyB0byBtYXAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogcG9pbnRlciB0byBudW1iZXIgb2YgYWN0dWFsbHkgdXNlZCBlbnRyaWVzCisvLyAgICAgICAgICAgICAgcEVudHJ5U2l6ZV9wICAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBzaXplIG9mIG9uZSBlbnRyeTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaXplIGlzIHplcm8sIHRoZSBhY3R1YWwgc2l6ZSB3aWxsIGJlIHJlYWQgZnJvbSBPRAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBwb2ludGVyIHRvIGVudGlyZSBzaXplIG9mIGFsbCBlbnRyaWVzIG1hcHBlZAorLy8gICAgICAgICAgICAgIHVpRmlyc3RTdWJpbmRleF9wICAgICAgID0gVGhpcyBpcyB0aGUgZmlyc3Qgc3ViaW5kZXggdG8gYmUgbWFwcGVkLgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlMaW5rT2JqZWN0KHVuc2lnbmVkIGludCB1aU9iakluZGV4X3AsCisJCQkJICAgdm9pZCAqcFZhcl9wLAorCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpVmFyRW50cmllc19wLAorCQkJCSAgIHRFcGxPYmRTaXplICogcEVudHJ5U2l6ZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUZpcnN0U3ViaW5kZXhfcCkKK3sKKwlCWVRFIGJWYXJFbnRyaWVzOworCUJZVEUgYkluZGV4RW50cmllczsKKwlCWVRFIE1FTSAqcGJEYXRhOworCXVuc2lnbmVkIGludCB1aVN1YmluZGV4OworCXRFcGxWYXJQYXJhbSBWYXJQYXJhbTsKKwl0RXBsT2JkU2l6ZSBFbnRyeVNpemU7CisJdEVwbE9iZFNpemUgVXNlZFNpemU7CisKKwl0RXBsS2VybmVsIFJldENvZGUgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgocFZhcl9wID09IE5VTEwpCisJICAgIHx8IChwdWlWYXJFbnRyaWVzX3AgPT0gTlVMTCkKKwkgICAgfHwgKCpwdWlWYXJFbnRyaWVzX3AgPT0gMCkKKwkgICAgfHwgKHBFbnRyeVNpemVfcCA9PSBOVUxMKSkgeworCQlSZXRDb2RlID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCXBiRGF0YSA9IChCWVRFIE1FTSAqKSBwVmFyX3A7CisJYlZhckVudHJpZXMgPSAoQllURSkgKiBwdWlWYXJFbnRyaWVzX3A7CisJVXNlZFNpemUgPSAwOworCisJLy8gaW5pdCBWYXJQYXJhbSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpT2JqSW5kZXhfcDsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKworCWlmICh1aUZpcnN0U3ViaW5kZXhfcCAhPSAwKSB7CS8vIGNoZWNrIGlmIG9iamVjdCBleGlzdHMgYnkgcmVhZGluZyBzdWJpbmRleCAweDAwLAorCQkvLyBiZWNhdXNlIHVzZXIgd2FudHMgdG8gbGluayBhIHZhcmlhYmxlIHRvIGEgc3ViaW5kZXggdW5lcXVhbCAweDAwCisJCS8vIHJlYWQgbnVtYmVyIG9mIGVudHJpZXMKKwkJRW50cnlTaXplID0gKHRFcGxPYmRTaXplKSBzaXplb2YoYkluZGV4RW50cmllcyk7CisJCVJldENvZGUgPSBFcGxPYmRSZWFkRW50cnkodWlPYmpJbmRleF9wLAorCQkJCQkgIDB4MDAsCisJCQkJCSAgKHZvaWQgR0VORVJJQyAqKSZiSW5kZXhFbnRyaWVzLAorCQkJCQkgICZFbnRyeVNpemUpOworCisJCWlmICgoUmV0Q29kZSAhPSBrRXBsU3VjY2Vzc2Z1bCkgfHwgKGJJbmRleEVudHJpZXMgPT0gMHgwMCkpIHsKKwkJCS8vIE9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGludmFsaWQgZW50cnkgbnVtYmVyCisJCQlSZXRDb2RlID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9IGVsc2UgewkJLy8gdXNlciB3YW50cyB0byBsaW5rIGEgdmFyaWFibGUgdG8gc3ViaW5kZXggMHgwMAorCQkvLyB0aGF0J3MgT0sKKwkJYkluZGV4RW50cmllcyA9IDA7CisJfQorCisJLy8gQ29ycmVjdCBudW1iZXIgb2YgZW50cmllcyBpZiBudW1iZXIgcmVhZCBmcm9tIE9EIGlzIGdyZWF0ZXIKKwkvLyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyLgorCS8vIFRoaXMgaXMgZG9uZSwgc28gdGhhdCB3ZSBkbyBub3Qgc2V0IG1vcmUgZW50cmllcyB0aGFuIHN1YmluZGV4ZXMgdGhlCisJLy8gb2JqZWN0IGFjdHVhbGx5IGhhcy4KKwlpZiAoKGJJbmRleEVudHJpZXMgPiAoYlZhckVudHJpZXMgKyB1aUZpcnN0U3ViaW5kZXhfcCAtIDEpKSAmJgorCSAgICAoYlZhckVudHJpZXMgIT0gMHgwMCkpIHsKKwkJYkluZGV4RW50cmllcyA9IChCWVRFKSAoYlZhckVudHJpZXMgKyB1aUZpcnN0U3ViaW5kZXhfcCAtIDEpOworCX0KKwkvLyBtYXAgZW50cmllcworCWZvciAodWlTdWJpbmRleCA9IHVpRmlyc3RTdWJpbmRleF9wOyB1aVN1YmluZGV4IDw9IGJJbmRleEVudHJpZXM7CisJICAgICB1aVN1YmluZGV4KyspIHsKKwkJLy8gaWYgcGFzc2VkIGVudHJ5IHNpemUgaXMgMCwgdGhlbiBnZXQgc2l6ZSBmcm9tIE9ECisJCWlmICgqcEVudHJ5U2l6ZV9wID09IDB4MDApIHsKKwkJCS8vIHJlYWQgZW50cnkgc2l6ZQorCQkJRW50cnlTaXplID0gRXBsT2JkR2V0RGF0YVNpemUodWlPYmpJbmRleF9wLCB1aVN1YmluZGV4KTsKKworCQkJaWYgKEVudHJ5U2l6ZSA9PSAweDAwKSB7CisJCQkJLy8gaW52YWxpZCBlbnRyeSBzaXplIChtYXliZSBvYmplY3QgZG9lc24ndCBleGlzdCBvciBlbnRyeSBvZiB0eXBlIERPTUFJTiBpcyBlbXB0eSkKKwkJCQlSZXRDb2RlID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CS8vIHVzZSBwYXNzZWQgZW50cnkgc2l6ZQorCQkJRW50cnlTaXplID0gKnBFbnRyeVNpemVfcDsKKwkJfQorCisJCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IHVpU3ViaW5kZXg7CisKKwkJLy8gc2V0IHBvaW50ZXIgdG8gdXNlciB2YXIKKwkJVmFyUGFyYW0ubV9TaXplID0gRW50cnlTaXplOworCQlWYXJQYXJhbS5tX3BEYXRhID0gcGJEYXRhOworCisJCVVzZWRTaXplICs9IEVudHJ5U2l6ZTsKKwkJcGJEYXRhICs9IEVudHJ5U2l6ZTsKKworCQlSZXRDb2RlID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJCWlmIChSZXRDb2RlICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIHNldCBudW1iZXIgb2YgbWFwcGVkIGVudHJpZXMgYW5kIGVudHJ5IHNpemUKKwkqcHVpVmFyRW50cmllc19wID0gKChiSW5kZXhFbnRyaWVzIC0gdWlGaXJzdFN1YmluZGV4X3ApICsgMSk7CisJKnBFbnRyeVNpemVfcCA9IFVzZWRTaXplOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChSZXRDb2RlKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVJlYWRPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIGVudHJ5IGZyb20gdGhlIE9EIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBJZiB0aGlzIG5vZGUgaXMgYSByZW1vdGUgbm9kZSwgaXQgcGVyZm9ybXMgYSBTRE8gdHJhbnNmZXIsIHdoaWNoCisvLyAgICAgICAgICAgICAgbWVhbnMgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGtFcGxBcGlUYXNrRGVmZXJyZWQgYW5kIHRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGlzIGluZm9ybWVkIHZpYSB0aGUgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdGFzayBpcyBjb21wbGV0ZWQuCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21Db25IZGxfcCAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gU0RPIGNvbm5lY3Rpb24gaGFuZGxlIChtYXkgYmUgTlVMTCBpbiBjYXNlIG9mIGxvY2FsIE9EIGFjY2VzcykKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IElOOiBub2RlIElEICgwID0gaXRzZWxmKQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gSU46IGluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICAgICAgICAgID0gSU46IHN1Yi1pbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9sZV9wICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBkYXRhIGluIGxpdHRsZSBlbmRpYW4KKy8vICAgICAgICAgICAgICBwdWlTaXplX3AgICAgICAgICAgICAgICA9IElOT1VUOiBwb2ludGVyIHRvIHNpemUgb2YgZGF0YQorLy8gICAgICAgICAgICAgIFNkb1R5cGVfcCAgICAgICAgICAgICAgID0gSU46IHR5cGUgb2YgU0RPIHRyYW5zZmVyCisvLyAgICAgICAgICAgICAgcFVzZXJBcmdfcCAgICAgICAgICAgICAgPSBJTjogdXNlci1kZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgIHZvaWQgKnBEc3REYXRhX2xlX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlTaXplX3AsCisJCQkJICAgdEVwbFNkb1R5cGUgU2RvVHlwZV9wLCB2b2lkICpwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHVpSW5kZXhfcCA9PSAwKSB8fCAocERzdERhdGFfbGVfcCA9PSBOVUxMKSB8fCAocHVpU2l6ZV9wID09IE5VTEwpCisJICAgIHx8ICgqcHVpU2l6ZV9wID09IDApKSB7CisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWlOb2RlSWRfcCA9PSAwIHx8IHVpTm9kZUlkX3AgPT0gRXBsT2JkR2V0Tm9kZUlkKCkpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGNhbiBiZSBwZXJmb3JtZWQKKwkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCQlPYmRTaXplID0gKHRFcGxPYmRTaXplKSAqIHB1aVNpemVfcDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBEc3REYXRhX2xlX3AsCisJCQkJCSZPYmRTaXplKTsKKwkJKnB1aVNpemVfcCA9ICh1bnNpZ25lZCBpbnQpT2JkU2l6ZTsKKwl9IGVsc2UgewkJLy8gcGVyZm9ybSBTRE8gdHJhbnNmZXIKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCQl0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXggVHJhbnNQYXJhbUJ5SW5kZXg7CisvLyAgICB0RXBsU2RvQ29tQ29uSGRsICAgICAgICAgICAgU2RvQ29tQ29uSGRsOworCisJCS8vIGNoZWNrIGlmIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHNwYWNlIGZvciBoYW5kbGUKKwkJaWYgKHBTZG9Db21Db25IZGxfcCA9PSBOVUxMKSB7CisJCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJZ290byBFeGl0OworLy8gICAgICAgICAgICBwU2RvQ29tQ29uSGRsX3AgPSAmU2RvQ29tQ29uSGRsOworCQl9CisJCS8vIGluaXQgY29tbWFuZCBsYXllciBjb25uZWN0aW9uCisJCVJldCA9IEVwbFNkb0NvbURlZmluZUNvbihwU2RvQ29tQ29uSGRsX3AsIHVpTm9kZUlkX3AsCS8vIHRhcmdldCBub2RlIGlkCisJCQkJCSBTZG9UeXBlX3ApOwkvLyBTRE8gdHlwZQorCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2RvQ29tSGFuZGxlRXhpc3RzKSkgeworCQkJZ290byBFeGl0OworCQl9CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcERhdGEgPSBwRHN0RGF0YV9sZV9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQ7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQ29tQ29uSGRsID0gKnBTZG9Db21Db25IZGxfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aURhdGFTaXplID0gKnB1aVNpemVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aUluZGV4ID0gdWlJbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpU3ViaW5kZXggPSB1aVN1YmluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcGZuU2RvRmluaXNoZWRDYiA9IEVwbEFwaUNiU2RvQ29uOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BVc2VyQXJnID0gcFVzZXJBcmdfcDsKKworCQlSZXQgPSBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCZUcmFuc1BhcmFtQnlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlSZXQgPSBrRXBsQXBpVGFza0RlZmVycmVkOworCisjZWxzZQorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpV3JpdGVPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSB0byB0aGUgT0Qgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIElmIHRoaXMgbm9kZSBpcyBhIHJlbW90ZSBub2RlLCBpdCBwZXJmb3JtcyBhIFNETyB0cmFuc2Zlciwgd2hpY2gKKy8vICAgICAgICAgICAgICBtZWFucyB0aGlzIGZ1bmN0aW9uIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBTRE8gY29ubmVjdGlvbiBoYW5kbGUgKG1heSBiZSBOVUxMIGluIGNhc2Ugb2YgbG9jYWwgT0QgYWNjZXNzKQorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQgKDAgPSBpdHNlbGYpCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX2xlX3AgICAgICAgICAgID0gSU46IHBvaW50ZXIgdG8gZGF0YSBpbiBsaXR0bGUgZW5kaWFuCisvLyAgICAgICAgICAgICAgdWlTaXplX3AgICAgICAgICAgICAgICAgPSBJTjogc2l6ZSBvZiBkYXRhIGluIGJ5dGVzCisvLyAgICAgICAgICAgICAgU2RvVHlwZV9wICAgICAgICAgICAgICAgPSBJTjogdHlwZSBvZiBTRE8gdHJhbnNmZXIKKy8vICAgICAgICAgICAgICBwVXNlckFyZ19wICAgICAgICAgICAgICA9IElOOiB1c2VyLWRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgICB2b2lkICpwU3JjRGF0YV9sZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3AsCisJCQkJICAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKCh1aUluZGV4X3AgPT0gMCkgfHwgKHBTcmNEYXRhX2xlX3AgPT0gTlVMTCkgfHwgKHVpU2l6ZV9wID09IDApKSB7CisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWlOb2RlSWRfcCA9PSAwIHx8IHVpTm9kZUlkX3AgPT0gRXBsT2JkR2V0Tm9kZUlkKCkpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGNhbiBiZSBwZXJmb3JtZWQKKworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwKKwkJCQkJICAgcFNyY0RhdGFfbGVfcCwgdWlTaXplX3ApOworCX0gZWxzZSB7CQkvLyBwZXJmb3JtIFNETyB0cmFuc2ZlcgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCXRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCBUcmFuc1BhcmFtQnlJbmRleDsKKy8vICAgIHRFcGxTZG9Db21Db25IZGwgICAgICAgICAgICBTZG9Db21Db25IZGw7CisKKwkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gcHJvdmlkZXMgc3BhY2UgZm9yIGhhbmRsZQorCQlpZiAocFNkb0NvbUNvbkhkbF9wID09IE5VTEwpIHsKKwkJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisvLyAgICAgICAgICAgIHBTZG9Db21Db25IZGxfcCA9ICZTZG9Db21Db25IZGw7CisJCX0KKwkJLy8gZC5rLjogSG93IHRvIHJlY3ljbGUgY29tbWFuZCBsYXllciBjb25uZWN0aW9uPworCQkvLyAgICAgICBUcnkgdG8gcmVkZWZpbmUgaXQsIHdoaWNoIHdpbGwgcmV0dXJuIGtFcGxTZG9Db21IYW5kbGVFeGlzdHMKKwkJLy8gICAgICAgYW5kIHRoZSBleGlzdGluZyBjb21tYW5kIGxheWVyIGhhbmRsZS4KKwkJLy8gICAgICAgSWYgdGhlIHJldHVybmVkIGhhbmRsZSBpcyBidXN5LCBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCkKKwkJLy8gICAgICAgd2lsbCByZXR1cm4gd2l0aCBlcnJvci4KKwkJLy8gJCQkIGQuay46IENvbGxpc2lvbnMgbWF5IG9jY3VyIHdpdGggQ29uZmlndXJhdGlvbiBNYW5hZ2VyLCBpZiBib3RoIHRoZSBhcHBsaWNhdGlvbiBhbmQKKwkJLy8gICAgICAgICAgIENvbmZpZ3VyYXRpb24gTWFuYWdlciwgYXJlIHRyeWluZyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB2ZXJ5IHNhbWUgbm9kZS4KKwkJLy8gICAgIHBvc3NpYmxlIHNvbHV0aW9uOiBkaXNhbGxvdyBjb21tdW5pY2F0aW9uIGJ5IGFwcGxpY2F0aW9uIGlmIENvbmZpZ3VyYXRpb24gTWFuYWdlciBpcyBidXN5CisKKwkJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwkJUmV0ID0gRXBsU2RvQ29tRGVmaW5lQ29uKHBTZG9Db21Db25IZGxfcCwgdWlOb2RlSWRfcCwJLy8gdGFyZ2V0IG5vZGUgaWQKKwkJCQkJIFNkb1R5cGVfcCk7CS8vIFNETyB0eXBlCisJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHMpKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wRGF0YSA9IHBTcmNEYXRhX2xlX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlV3JpdGU7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQ29tQ29uSGRsID0gKnBTZG9Db21Db25IZGxfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aURhdGFTaXplID0gdWlTaXplX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aVN1YmluZGV4ID0gdWlTdWJpbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BmblNkb0ZpbmlzaGVkQ2IgPSBFcGxBcGlDYlNkb0NvbjsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wVXNlckFyZyA9IHBVc2VyQXJnX3A7CisKKwkJUmV0ID0gRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleCgmVHJhbnNQYXJhbUJ5SW5kZXgpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJUmV0ID0ga0VwbEFwaVRhc2tEZWZlcnJlZDsKKworI2Vsc2UKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKyNlbmRpZgorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUZyZWVTZG9DaGFubmVsKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnJlZXMgdGhlIHNwZWNpZmllZCBTRE8gY2hhbm5lbC4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGVhY2ggY2FsbCB0byBFcGxBcGlSZWFkT2JqZWN0KCkvRXBsQXBpV3JpdGVPYmplY3QoKQorLy8gICAgICAgICAgICAgIHdoaWNoIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgICAgICAgPSBJTjogU0RPIGNvbm5lY3Rpb24gaGFuZGxlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRnJlZVNkb0NoYW5uZWwodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKworCS8vIGluaXQgY29tbWFuZCBsYXllciBjb25uZWN0aW9uCisJUmV0ID0gRXBsU2RvQ29tVW5kZWZpbmVDb24oU2RvQ29tQ29uSGRsX3ApOworCisjZWxzZQorCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUmVhZExvY2FsT2JqZWN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCBlbnRyeSBmcm9tIHRoZSBsb2NhbCBPRC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIGRhdGEgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBkYXRhCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZExvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCXVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCXVuc2lnbmVkIGludCAqcHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCU9iZFNpemUgPSAodEVwbE9iZFNpemUpICogcHVpU2l6ZV9wOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcERzdERhdGFfcCwgJk9iZFNpemUpOworCSpwdWlTaXplX3AgPSAodW5zaWduZWQgaW50KU9iZFNpemU7CisKKwlyZXR1cm4gUmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSB0byB0aGUgbG9jYWwgT0QuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gSU46IGluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICAgICAgICAgID0gSU46IHN1Yi1pbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgICAgICAgICA9IElOOiBwb2ludGVyIHRvIGRhdGEgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHVpU2l6ZV9wICAgICAgICAgICAgICAgID0gSU46IHNpemUgb2YgZGF0YSBpbiBieXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwU3JjRGF0YV9wLAorCQkJICAgICAodEVwbE9iZFNpemUpIHVpU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogdHJpZ2dlcnMgdGhlIHNwZWNpZmllZCBub2RlIGNvbW1hbmQgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIGZvciB3aGljaCB0aGUgbm9kZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQKKy8vICAgICAgICAgICAgICBOb2RlQ29tbWFuZF9wICAgICAgICAgICA9IG5vZGUgY29tbWFuZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgIHRFcGxObXROb2RlQ29tbWFuZCBOb2RlQ29tbWFuZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlSZXQgPSBFcGxObXRNbnVUcmlnZ2VyU3RhdGVDaGFuZ2UodWlOb2RlSWRfcCwgTm9kZUNvbW1hbmRfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk9iZEFjY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT0QgYWNjZXNzZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk9iZEFjY2Vzcyh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgKEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQgIT0gRkFMU0UpCisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJLy8gbXVzdCBiZSBkaXNhYmxlZCBmb3IgRXBsQXBpTGludXhLZXJuZWwuYywgYmVjYXVzZSBvZiByZWVudHJhbmN5IHByb2JsZW0KKwkvLyBmb3IgbG9jYWwgT0QgYWNjZXNzLiBUaGlzIGlzIG5vdCBzbyBiYWQgYXMgdXNlciBjYWxsYmFjayBmdW5jdGlvbiBpbgorCS8vIGFwcGxpY2F0aW9uIGRvZXMgbm90IHVzZSBPRCBjYWxsYmFja3MgYXQgdGhlIG1vbWVudC4KKwlFdmVudEFyZy5tX09iZENiUGFyYW0gPSAqcFBhcmFtX3A7CisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50T2JkQWNjZXNzLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisjZW5kaWYKKworCXN3aXRjaCAocFBhcmFtX3AtPm1fdWlJbmRleCkgeworCQkvL2Nhc2UgMHgxMDA2OiAgICAvLyBOTVRfQ3ljbGVMZW5fVTMyICh2YWxpZCBvbiByZXNldCkKKwljYXNlIDB4MUMxNDoJCS8vIERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIKKwkJLy9jYXNlIDB4MUY5ODogICAgLy8gTk1UX0N5Y2xlVGltaW5nX1JFQyAodmFsaWQgb24gcmVzZXQpCisJCXsKKwkJCWlmIChwUGFyYW1fcC0+bV9PYmRFdmVudCA9PSBrRXBsT2JkRXZQb3N0V3JpdGUpIHsKKwkJCQkvLyB1cGRhdGUgRExMIGNvbmZpZ3VyYXRpb24KKwkJCQlSZXQgPSBFcGxBcGlVcGRhdGVEbGxDb25maWcoRkFMU0UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgMHgxMDIwOgkJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZJZF9VMzIgIT0gMAorCQl7CisJCQlpZiAoKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkKKwkJCSAgICAmJiAocFBhcmFtX3AtPm1fdWlTdWJJbmRleCA9PSAzKQorCQkJICAgICYmICgqKChEV09SRCAqKSBwUGFyYW1fcC0+bV9wQXJnKSAhPSAwKSkgeworCQkJCURXT1JEIGR3VmVyaWZ5Q29uZkludmFsaWQgPSAwOworCQkJCS8vIHNldCBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuVmVyaWZ5Q29uZkludmFsaWRfVTMyIHRvIDAKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAyMCwgNCwKKwkJCQkJCSAgICAgJmR3VmVyaWZ5Q29uZkludmFsaWQsIDQpOworCQkJCS8vIGlnbm9yZSBhbnkgZXJyb3IgYmVjYXVzZSB0aGlzIG9iamVrdCBpcyBvcHRpb25hbAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgMHgxRjlFOgkJLy8gTk1UX1Jlc2V0Q21kX1U4CisJCXsKKwkJCWlmIChwUGFyYW1fcC0+bV9PYmRFdmVudCA9PSBrRXBsT2JkRXZQcmVXcml0ZSkgeworCQkJCUJZVEUgYk5tdENvbW1hbmQ7CisKKwkJCQliTm10Q29tbWFuZCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisJCQkJLy8gY2hlY2sgdmFsdWUgcmFuZ2UKKwkJCQlzd2l0Y2ggKCh0RXBsTm10Q29tbWFuZCkgYk5tdENvbW1hbmQpIHsKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJCQljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQkJCWNhc2Uga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOgorCQkJCQkvLyB2YWxpZCBjb21tYW5kIGlkZW50aWZpZXIgc3BlY2lmaWVkCisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEOworCQkJCQlSZXQgPSBrRXBsT2JkQWNjZXNzVmlvbGF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkgeworCQkJCUJZVEUgYk5tdENvbW1hbmQ7CisKKwkJCQliTm10Q29tbWFuZCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisJCQkJLy8gY2hlY2sgdmFsdWUgcmFuZ2UKKwkJCQlzd2l0Y2ggKCh0RXBsTm10Q29tbWFuZCkgYk5tdENvbW1hbmQpIHsKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50UmVzZXROb2RlKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldENvbSk7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb246CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50UmVzZXRDb25maWcpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRTd1Jlc2V0KTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOgorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9FWENFRURFRDsKKwkJCQkJUmV0ID0ga0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlIGFuZCBmb3J3YXJkcyB0aGVzZSB0bworLy8gICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxFdmVudF9wID0gICBwb2ludGVyIHRvIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRXZlbnRFcnJvciAqcEV2ZW50RXJyb3I7CisJdEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByb2Nlc3MgZXZlbnQKKwlzd2l0Y2ggKHBFcGxFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCQkvLyBlcnJvciBldmVudAorCWNhc2Uga0VwbEV2ZW50VHlwZUVycm9yOgorCQl7CisJCQlwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBwRXBsRXZlbnRfcC0+bV9wQXJnOworCQkJc3dpdGNoIChwRXZlbnRFcnJvci0+bV9FdmVudFNvdXJjZSkgeworCQkJCS8vIHRyZWF0IHRoZSBlcnJvcnMgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMgYXMgY3JpdGljYWwKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRXZlbnRrOgorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudHU6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZURsbGs6CisJCQkJeworCQkJCQlFdmVudFR5cGUgPSBrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yOworCQkJCQkvLyBoYWx0IHRoZSBzdGFjayBieSBlbnRlcmluZyBOTVQgc3RhdGUgT2ZmCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGhlIG90aGVyIGVycm9ycyBhcmUganVzdCB3YXJuaW5ncworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUV2ZW50VHlwZSA9IGtFcGxBcGlFdmVudFdhcm5pbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJCQlSZXQgPQorCQkJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KEV2ZW50VHlwZSwKKwkJCQkJCQkJICAgICAgKHRFcGxBcGlFdmVudEFyZworCQkJCQkJCQkgICAgICAgKikKKwkJCQkJCQkJICAgICAgcEV2ZW50RXJyb3IsCisJCQkJCQkJCSAgICAgIEVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJCSAgICAgIG1fSW5pdFBhcmFtLgorCQkJCQkJCQkgICAgICBtX3BFdmVudFVzZXJBcmcpOworCQkJLy8gZGlzY2FyZCBlcnJvciBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uLCBiZWNhdXNlIHRoaXMgY291bGQgZ2VuZXJhdGUgYW4gZW5kbGVzcyBsb29wCisJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYXQgcHJlc2VudCwgdGhlcmUgYXJlIG5vIG90aGVyIGV2ZW50cyBmb3IgdGhpcyBtb2R1bGUKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBOTVQgc3RhdGUgY2hhbmdlcworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRTdGF0ZUNoYW5nZV9wICAgICAgICA9IE5NVCBzdGF0ZSBjaGFuZ2UgZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCQlObXRTdGF0ZUNoYW5nZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQllURSBiTm10U3RhdGU7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJLy8gc2F2ZSBOTVQgc3RhdGUgaW4gT0QKKwliTm10U3RhdGUgPSAoQllURSkgTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjhDLCAwLCAmYk5tdFN0YXRlLCAxKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZG8gd29yayB3aGljaCBtdXN0IGJlIGRvbmUgaW4gdGhhdCBzdGF0ZQorCXN3aXRjaCAoTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlKSB7CisJCS8vIEVQTCBzdGFjayBpcyBub3QgcnVubmluZworCWNhc2Uga0VwbE5tdEdzT2ZmOgorCQlicmVhazsKKworCQkvLyBmaXJzdCBpbml0IG9mIHRoZSBoYXJkd2FyZQorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorI2lmIDAKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCS8vIGNvbmZpZ3VyZSBTRE8gdmlhIFVEUCAoaS5lLiBiaW5kIGl0IHRvIHRoZSBFUEwgZXRoZXJuZXQgaW50ZXJmYWNlKQorCQlSZXQgPQorCQkgICAgRXBsU2RvVWRwdUNvbmZpZyhFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MsCisJCQkJICAgICBFUExfQ19TRE9fRVBMX1BPUlQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJYnJlYWs7CisKKwkJLy8gaW5pdCBvZiB0aGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIHByb2ZpbGUgYXJlYSBhbmQgdGhlCisJCS8vIHN0YW5kYXJkaXNlZCBkZXZpY2UgcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQl7CisJCQkvLyByZXNldCBhcHBsaWNhdGlvbiBwYXJ0IG9mIE9ECisJCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnQoa0VwbE9iZFBhcnRBcHAsCisJCQkJCQkga0VwbE9iZERpckxvYWQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQl7CisJCQkvLyByZXNldCBjb21tdW5pY2F0aW9uIHBhcnQgb2YgT0QKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChrRXBsT2JkUGFydEdlbiwKKwkJCQkJCSBrRXBsT2JkRGlyTG9hZCk7CisKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyAkJCQgZC5rLjogdXBkYXRlIE9EIG9ubHkgaWYgT0Qgd2FzIG5vdCBsb2FkZWQgZnJvbSBub24tdm9sYXRpbGUgbWVtb3J5CisJCQlSZXQgPSBFcGxBcGlVcGRhdGVPYmQoKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKworCQkJUmV0ID0gRXBsQXBpVXBkYXRlRGxsQ29uZmlnKFRSVUUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkvLyBub2RlIGxpc3RlIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisJY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisJCXsKKwkJCS8vIGluZGljYXRlIGNvbXBsZXRpb24gb2YgcmVzZXQgaW4gTk1UX1Jlc2V0Q21kX1U4CisJCQliTm10U3RhdGUgPSAoQllURSkga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOworCQkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOUUsIDAsICZiTm10U3RhdGUsIDEpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3Mgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3MgaXNvY2hyb251cyBhbmQgYXN5bmNocm9udXMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbnVzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBFUEwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lCisKKwkJLy8gbm9kZSBsaXN0ZW5zIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gRVBMIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJVFJBQ0UwCisJCQkgICAgKCJFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKCk6IHVuaGFuZGxlZCBOTVQgc3RhdGVcbiIpOworCQl9CisJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwkvLyBmb3J3YXJkIGV2ZW50IHRvIExlZCBtb2R1bGUKKwlSZXQgPSBFcGxMZWR1Q2JObXRTdGF0ZUNoYW5nZShObXRTdGF0ZUNoYW5nZV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGZvcndhcmQgZXZlbnQgdG8gTm10TW4gbW9kdWxlCisJUmV0ID0gRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZShObXRTdGF0ZUNoYW5nZV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGNhbGwgdXNlciBjYWxsYmFjaworCUV2ZW50QXJnLm1fTm10U3RhdGVDaGFuZ2UgPSBObXRTdGF0ZUNoYW5nZV9wOworCVJldCA9CisJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJICAgIG1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZSwgJkV2ZW50QXJnLAorCQkJIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wRXZlbnRVc2VyQXJnKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlVcGRhdGVEbGxDb25maWcKKy8vCisvLyBEZXNjcmlwdGlvbjogdXBkYXRlIGNvbmZpZ3VyYXRpb24gb2YgRExMCisvLworLy8gUGFyYW1ldGVyczogIGZVcGRhdGVJZGVudGl0eV9wICAgICAgID0gVFJVRSwgaWYgaWRlbnRpdHkgbXVzdCBiZSB1cGRhdGVkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpVXBkYXRlRGxsQ29uZmlnKEJPT0wgZlVwZGF0ZUlkZW50aXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsQ29uZmlnUGFyYW0gRGxsQ29uZmlnUGFyYW07CisJdEVwbERsbElkZW50UGFyYW0gRGxsSWRlbnRQYXJhbTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCVdPUkQgd1RlbXA7CisJQllURSBiVGVtcDsKKworCS8vIGNvbmZpZ3VyZSBEbGwKKwlFUExfTUVNU0VUKCZEbGxDb25maWdQYXJhbSwgMCwgc2l6ZW9mKERsbENvbmZpZ1BhcmFtKSk7CisJRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCA9IEVwbE9iZEdldE5vZGVJZCgpOworCisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDA2LCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY4MjogTk1UX0ZlYXR1cmVGbGFnc19VMzIKKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxRjgyLCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0ZlYXR1cmVGbGFncywKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGQuay4gVGhlcmUgaXMgbm8gZGVwZW5kYW5jZSBiZXR3ZWVuIEZlYXR1cmVGbGFncyBhbmQgYXN5bmMtb25seSBDTgorCURsbENvbmZpZ1BhcmFtLm1fZkFzeW5jT25seSA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9mQXN5bmNPbmx5OworCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxQzE0LCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjk4OiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjk4LjE6IElzb2NoclR4TWF4UGF5bG9hZF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCAxLCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjI6IElzb2NoclJ4TWF4UGF5bG9hZF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCAyLCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDMsICZEbGxDb25maWdQYXJhbS5tX2R3UHJlc01heExhdGVuY3ksCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA0LCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aVByZXFBY3RQYXlsb2FkTGltaXQgPSB3VGVtcDsKKworCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDUsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjY6IEFTbmRNYXhMYXRlbmN5X1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDYsICZEbGxDb25maWdQYXJhbS5tX2R3QXNuZE1heExhdGVuY3ksCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTguNzogTXVsdGlwbEN5Y2xlQ250X1U4CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNywgJmJUZW1wLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCURsbENvbmZpZ1BhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPSBiVGVtcDsKKworCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA4LCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUFzeW5jTXR1ID0gd1RlbXA7CisKKwkvLyAkJCQgUHJlc2NhbGVyCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyAweDFGOEEuMTogV2FpdFNvQ1BSZXFfVTMyIGluIFtuc10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxRjhBLCAxLCAmRGxsQ29uZmlnUGFyYW0ubV9kd1dhaXRTb2NQcmVxLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10gKG9wdGlvbmFsKQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOEEsIDIsICZEbGxDb25maWdQYXJhbS5tX2R3QXN5bmNTbG90VGltZW91dCwKKwkJCSAgICAmT2JkU2l6ZSk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisjZW5kaWYKKworCURsbENvbmZpZ1BhcmFtLm1fdWlTaXplT2ZTdHJ1Y3QgPSBzaXplb2YoRGxsQ29uZmlnUGFyYW0pOworCVJldCA9IEVwbERsbGtDb25maWcoJkRsbENvbmZpZ1BhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoZlVwZGF0ZUlkZW50aXR5X3AgIT0gRkFMU0UpIHsKKwkJLy8gY29uZmlndXJlIElkZW50aXR5CisJCUVQTF9NRU1TRVQoJkRsbElkZW50UGFyYW0sIDAsIHNpemVvZihEbGxJZGVudFBhcmFtKSk7CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAwMCwgMCwgJkRsbElkZW50UGFyYW0ubV9kd0RldmljZVR5cGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCAxLCAmRGxsSWRlbnRQYXJhbS5tX2R3VmVuZG9ySWQsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAxOCwgMiwgJkRsbElkZW50UGFyYW0ubV9kd1Byb2R1Y3RDb2RlLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDMsCisJCQkJICAgICZEbGxJZGVudFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCA0LCAmRGxsSWRlbnRQYXJhbS5tX2R3U2VyaWFsTnVtYmVyLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCURsbElkZW50UGFyYW0ubV9kd0lwQWRkcmVzcyA9CisJCSAgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3M7CisJCURsbElkZW50UGFyYW0ubV9kd1N1Ym5ldE1hc2sgPQorCQkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3U3VibmV0TWFzazsKKwkJRVBMX01FTUNQWShEbGxJZGVudFBhcmFtLm1fc0hvc3RuYW1lLAorCQkJICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3NIb3N0bmFtZSwKKwkJCSAgIHNpemVvZihEbGxJZGVudFBhcmFtLm1fc0hvc3RuYW1lKSk7CisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDIwLCAxLAorCQkJCSAgICAmRGxsSWRlbnRQYXJhbS5tX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJLy8gaWdub3JlIGFueSBlcnJvciwgYmVjYXVzZSB0aGlzIG9iamVjdCBpcyBvcHRpb25hbAorCisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAyMCwgMiwKKwkJCQkgICAgJkRsbElkZW50UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCS8vIGlnbm9yZSBhbnkgZXJyb3IsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgb3B0aW9uYWwKKworCQkvLyAkJCQgZC5rLjogZmlsbCByZXN0IG9mIGlkZW50IHN0cnVjdHVyZQorCisJCURsbElkZW50UGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihEbGxJZGVudFBhcmFtKTsKKwkJUmV0ID0gRXBsRGxsa1NldElkZW50aXR5KCZEbGxJZGVudFBhcmFtKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVVwZGF0ZU9iZAorLy8KKy8vIERlc2NyaXB0aW9uOiB1cGRhdGUgT0QgZnJvbSBpbml0IHBhcmFtCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZU9iZCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJV09SRCB3VGVtcDsKKwlCWVRFIGJUZW1wOworCisJLy8gc2V0IG5vZGUgaWQgaW4gT0QKKwlSZXQgPSBFcGxPYmRTZXROb2RlSWQoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTm9kZUlkLAkvLyBub2RlIGlkCisJCQkgICAgICBrRXBsT2JkTm9kZUlkSGFyZHdhcmUpOwkvLyBzZXQgYnkgaGFyZHdhcmUKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3Q3ljbGVMZW4gIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDA2LCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0N5Y2xlTGVuLAorCQkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUMxNCwgMCwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlLCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisJLy8gZC5rLiBUaGVyZSBpcyBubyBkZXBlbmRhbmNlIGJldHdlZW4gRmVhdHVyZUZsYWdzIGFuZCBhc3luYy1vbmx5IENOLgorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdGZWF0dXJlRmxhZ3MgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxRjgyLCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3RmVhdHVyZUZsYWdzLCA0KTsKKwkJLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKworCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZDsKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgMSwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZDsKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgMiwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCVJldCA9CisJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAzLAorCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3UHJlc01heExhdGVuY3ksCisJCQkgICAgIDQpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXFBY3RQYXlsb2FkTGltaXQgPD0KKwkgICAgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCkgeworCQl3VGVtcCA9CisJCSAgICAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdDsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDQsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPD0KKwkgICAgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCkgeworCQl3VGVtcCA9CisJCSAgICAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDUsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDYsCisJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc25kTWF4TGF0ZW5jeSwKKwkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250IDw9IDB4RkYpIHsKKwkJYlRlbXAgPSAoQllURSkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNywgJmJUZW1wLCAxKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpQXN5bmNNdHUgPD0KKwkgICAgRVBMX0NfRExMX01BWF9BU1lOQ19NVFUpIHsKKwkJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpQXN5bmNNdHU7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA4LCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXIgPD0gMTAwMCkgeworCQl3VGVtcCA9IChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXI7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA5LCAmd1RlbXAsIDIpOworCQkvLyBpZ25vcmUgcmV0dXJuIGNvZGUKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdXYWl0U29jUHJlcSAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOEEsIDEsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdXYWl0U29jUHJlcSwgNCk7CisJCS8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCSAgIHsKKwkJICAgZ290byBFeGl0OworCQkgICB9ICovCisJfQorCisJaWYgKChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApCisJICAgICYmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IC0xKSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOEEsIDIsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisjZW5kaWYKKworCS8vIGNvbmZpZ3VyZSBJZGVudGl0eQorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdEZXZpY2VUeXBlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwMCwgMCwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0RldmljZVR5cGUsIDQpOworLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3VmVuZG9ySWQgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDE4LCAxLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1ZlbmRvcklkLAorCQkJCSAgICAgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdQcm9kdWN0Q29kZSAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDIsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdQcm9kdWN0Q29kZSwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDMsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdSZXZpc2lvbk51bWJlciwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDE4LCA0LAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3U2VyaWFsTnVtYmVyLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pEZXZOYW1lICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgRGV2aWNlIE5hbWUgKDB4MTAwOCkKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDA4LCAwLAorCQkJCSAgICAgKHZvaWQgR0VORVJJQyAqKUVwbEFwaUluc3RhbmNlX2cuCisJCQkJICAgICBtX0luaXRQYXJhbS5tX3BzekRldk5hbWUsCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3BzekRldk5hbWUpKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcHN6SHdWZXJzaW9uICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgSGFyZHdhcmUgdmVyc2lvbiAoMHgxMDA5KQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDksIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6SHdWZXJzaW9uLAorCQkJCSAgICAgKHRFcGxPYmRTaXplKSBzdHJsZW4oRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fSW5pdFBhcmFtLgorCQkJCQkJCSAgbV9wc3pId1ZlcnNpb24pKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcHN6U3dWZXJzaW9uICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgU29mdHdhcmUgdmVyc2lvbiAoMHgxMDBBKQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMEEsIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6U3dWZXJzaW9uLAorCQkJCSAgICAgKHRFcGxPYmRTaXplKSBzdHJsZW4oRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fSW5pdFBhcmFtLgorCQkJCQkJCSAgbV9wc3pTd1ZlcnNpb24pKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYlNkb0NvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIHRyYW5zZmVycworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tRmluaXNoZWRfcCAgICAgICA9IFNETyBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiU2RvQ29uKHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9TZG8gPSAqcFNkb0NvbUZpbmlzaGVkX3A7CisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50U2RvLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JOb2RlRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG5vZGUgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCBvZiB0aGUgQ04KKy8vICAgICAgICAgICAgICBOb2RlRXZlbnRfcCAgICAgICAgICAgICA9IGV2ZW50IGZyb20gdGhlIHNwZWNpZmllZCBDTgorLy8gICAgICAgICAgICAgIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUgb2YgdGhlIENOCisvLyAgICAgICAgICAgICAgd0Vycm9yQ29kZV9wICAgICAgICAgICAgPSBFUEwgZXJyb3IgY29kZSBpZiBOb2RlRXZlbnRfcD09a0VwbE5tdE5vZGVFdmVudEVycm9yCisvLyAgICAgICAgICAgICAgZk1hbmRhdG9yeV9wICAgICAgICAgICAgPSBmbGFnIGlmIENOIGlzIG1hbmRhdG9yeQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm9kZUV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICB0RXBsTm10Tm9kZUV2ZW50IE5vZGVFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3AsIEJPT0wgZk1hbmRhdG9yeV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9Ob2RlLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCUV2ZW50QXJnLm1fTm9kZS5tX05vZGVFdmVudCA9IE5vZGVFdmVudF9wOworCUV2ZW50QXJnLm1fTm9kZS5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKwlFdmVudEFyZy5tX05vZGUubV93RXJyb3JDb2RlID0gd0Vycm9yQ29kZV9wOworCUV2ZW50QXJnLm1fTm9kZS5tX2ZNYW5kYXRvcnkgPSBmTWFuZGF0b3J5X3A7CisKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnROb2RlLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiQm9vdEV2ZW50CisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBib290IGV2ZW50cworLy8KKy8vIFBhcmFtZXRlcnM6ICBCb290RXZlbnRfcCAgICAgICAgICAgICA9IGV2ZW50IGZyb20gdGhlIGJvb3QtdXAgcHJvY2VzcworLy8gICAgICAgICAgICAgIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBsb2NhbCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICB3RXJyb3JDb2RlX3AgICAgICAgICAgICA9IEVQTCBlcnJvciBjb2RlIGlmIEJvb3RFdmVudF9wPT1rRXBsTm10Qm9vdEV2ZW50RXJyb3IKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkJvb3RFdmVudCh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX0Jvb3QubV9Cb290RXZlbnQgPSBCb290RXZlbnRfcDsKKwlFdmVudEFyZy5tX0Jvb3QubV9ObXRTdGF0ZSA9IE5tdFN0YXRlX3A7CisJRXZlbnRBcmcubV9Cb290Lm1fd0Vycm9yQ29kZSA9IHdFcnJvckNvZGVfcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudEJvb3QsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiTGVkU3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIExFRCBjaGFuZ2UgZXZlbnRzLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBMZWRUeXBlX3AgICAgICAgPSB0eXBlIG9mIExFRAorLy8gICAgICAgICAgICAgIGZPbl9wICAgICAgICAgICA9IHN0YXRlIG9mIExFRAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZSh0RXBsTGVkVHlwZSBMZWRUeXBlX3AsCisJCQkJCQlCT09MIGZPbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9MZWQubV9MZWRUeXBlID0gTGVkVHlwZV9wOworCUV2ZW50QXJnLm1fTGVkLm1fZk9uID0gZk9uX3A7CisKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRMZWQsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2QxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBBUEkgbGF5ZXIgZm9yIExpbnV4IChrZXJuZWwgYW5kIHVzZXIgc3BhY2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpTGludXguaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wOC8yNSAxMjoxNzo0MSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMTEgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfQVBJX0xJTlVYX0hfCisjZGVmaW5lIF9FUExfQVBJX0xJTlVYX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTExJTl9ERVZfTkFNRSAgICAgImVwbCIJLy8gdXNlZCBmb3IgIi9kZXYiIGFuZCAiL3Byb2MiIGVudHJ5CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29tbWFuZHMgZm9yIDxpb2N0bD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMTElOX0NNRF9JTklUSUFMSVpFICAgICAgICAgICAgICAgMAkvLyB1bEFyZ19wIH4gdEVwbEFwaUluaXRQYXJhbSoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9JTiAgICAgICAgICAgICAgICAgICAgMQkvLyB1bEFyZ19wIH4gdEVwbEFwaVByb2Nlc3NJbWFnZSoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9PVVQgICAgICAgICAgICAgICAgICAgMgkvLyB1bEFyZ19wIH4gdEVwbEFwaVByb2Nlc3NJbWFnZSoKKyNkZWZpbmUgRVBMTElOX0NNRF9XUklURV9PQkpFQ1QgICAgICAgICAgICAgMwkvLyB1bEFyZ19wIH4gdEVwbExpblNkb09iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9SRUFEX09CSkVDVCAgICAgICAgICAgICAgNAkvLyB1bEFyZ19wIH4gdEVwbExpblNkb09iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9XUklURV9MT0NBTF9PQkpFQ1QgICAgICAgNQkvLyB1bEFyZ19wIH4gdEVwbExpbkxvY2FsT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1JFQURfTE9DQUxfT0JKRUNUICAgICAgICA2CS8vIHVsQXJnX3AgfiB0RXBsTGluTG9jYWxPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfRlJFRV9TRE9fQ0hBTk5FTCAgICAgICAgIDcJLy8gdWxBcmdfcCB+IHRFcGxTZG9Db21Db25IZGwKKyNkZWZpbmUgRVBMTElOX0NNRF9OTVRfQ09NTUFORCAgICAgICAgICAgICAgOAkvLyB1bEFyZ19wIH4gdEVwbE5tdEV2ZW50CisjZGVmaW5lIEVQTExJTl9DTURfR0VUX0VWRU5UICAgICAgICAgICAgICAgIDkJLy8gdWxBcmdfcCB+IHRFcGxMaW5FdmVudCoKKyNkZWZpbmUgRVBMTElOX0NNRF9NTl9UUklHR0VSX1NUQVRFX0NIQU5HRSAxMAkvLyB1bEFyZ19wIH4gdEVwbExpbk5vZGVDbWRPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfUElfU0VUVVAgICAgICAgICAgICAgICAgMTEJLy8gdWxBcmdfcCB+IDAKKyNkZWZpbmUgRVBMTElOX0NNRF9TSFVURE9XTiAgICAgICAgICAgICAgICAxMgkvLyB1bEFyZ19wIH4gMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRXZlbnRBcmdTaXplOworCXRFcGxBcGlFdmVudEFyZyAqbV9wRXZlbnRBcmc7CisJdEVwbEFwaUV2ZW50VHlwZSAqbV9wRXZlbnRUeXBlOworCXRFcGxLZXJuZWwgbV9SZXRDYkV2ZW50OworCit9IHRFcGxMaW5FdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db21Db25IZGwgbV9TZG9Db21Db25IZGw7CisJQk9PTCBtX2ZWYWxpZFNkb0NvbUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdm9pZCAqbV9sZV9wRGF0YTsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemU7CisJdEVwbFNkb1R5cGUgbV9TZG9UeXBlOworCXZvaWQgKm1fcFVzZXJBcmc7CisKK30gdEVwbExpblNkb09iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKworfSB0RXBsTGluTG9jYWxPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl0RXBsTm10Tm9kZUNvbW1hbmQgbV9Ob2RlQ29tbWFuZDsKKworfSB0RXBsTGluTm9kZUNtZE9iamVjdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfQVBJX0xJTlVYX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4S2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjYTA2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYwpAQCAtMCwwICsxLDEyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBMaW51eCBrZXJuZWwgbW9kdWxlIGFzIHdyYXBwZXIgb2YgRVBMIEFQSSBsYXllciwKKyAgICAgICAgICAgICAgICBpLmUuIGNvdW50ZXJwYXJ0IHRvIGEgTGludXggYXBwbGljYXRpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlMaW51eEtlcm5lbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzExLzIxIDA5OjAwOjM4ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMTEgZC5rLjogIEluaXRpYWwgVmVyc2lvbgorICAyMDA4LzA0LzEwIG0udS46ICBDaGFuZ2VkIHRvIG5ldyBjaGFyIGRyaXZlciBpbml0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIGtlcm5lbCBtb2R1bCBhbmQgZHJpdmVyCisKKy8vI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLy8jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisvLyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKy8vIHNjaGVkdWxpbmcKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvLyBtZW1vcnkgYWNjZXNzCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJFcGwuaCIKKyNpbmNsdWRlICJFcGxBcGlMaW51eC5oIgorLy8jaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNpbmNsdWRlICJwcm9jX2ZzLmgiCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgLy8gcmVtb3ZlICgibWFrZSBpbnZpc2libGUiKSBvYnNvbGV0ZSBzeW1ib2xzIGZvciBrZXJuZWwgdmVyc2lvbnMgMi42CisgICAgLy8gYW5kIGhpZ2hlcgorI2RlZmluZSBNT0RfSU5DX1VTRV9DT1VOVAorI2RlZmluZSBNT0RfREVDX1VTRV9DT1VOVAorI2RlZmluZSBFWFBPUlRfTk9fU1lNQk9MUworI2Vsc2UKKyNlcnJvciAiVGhpcyBkcml2ZXIgbmVlZHMgYSAyLjYueCBrZXJuZWwgb3IgaGlnaGVyIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIE1ldGFpbmZvcm1hdGlvbgorTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworI2lmZGVmIE1PRFVMRV9BVVRIT1IKK01PRFVMRV9BVVRIT1IoIkRhbmllbC5LcnVlZ2VyQFNZU1RFQy1lbGVjdHJvbmljLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUEwgQVBJIGRyaXZlciIpOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExMSU5fRFJWX05BTUUgICAgICJzeXN0ZWNfZXBsIgkvLyB1c2VkIGZvciA8cmVnaXN0ZXJfY2hyZGV2PgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbnN0YW50IGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZW5kaWYKKworI2RlZmluZSBFVkVOVF9TVEFURV9JTklUICAgICAgICAwCisjZGVmaW5lIEVWRU5UX1NUQVRFX0lPQ1RMICAgICAgIDEJLy8gaW9jdGwgZW50ZXJlZCBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBFUEwgZXZlbnQKKyNkZWZpbmUgRVZFTlRfU1RBVEVfUkVBRFkgICAgICAgMgkvLyBFUEwgZXZlbnQgY2FuIGJlIGZvcndhcmRlZCB0byB1c2VyIGFwcGxpY2F0aW9uCisjZGVmaW5lIEVWRU5UX1NUQVRFX1RFUk0gICAgICAgIDMJLy8gdGVybWluYXRlIHByb2Nlc3NpbmcKKworI2RlZmluZSBFUExfU1RBVEVfTk9UT1BFTiAgICAgICAwCisjZGVmaW5lIEVQTF9TVEFURV9OT1RJTklUICAgICAgIDEKKyNkZWZpbmUgRVBMX1NUQVRFX1JVTk5JTkcgICAgICAgMgorI2RlZmluZSBFUExfU1RBVEVfU0hVVERPV04gICAgICAzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2xvYmFsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIENPTkZJR19ERVZGU19GUworCisgICAgLy8gZHJpdmVyIG1ham9yIG51bWJlcgorc3RhdGljIGludCBuRHJ2TWFqb3JOdW1iZXJfZzsKKworI2Vsc2UKKworICAgIC8vIGRldmljZSBudW1iZXIgKG1ham9yIGFuZCBtaW5vcikKK3N0YXRpYyBkZXZfdCBuRGV2TnVtX2c7CitzdGF0aWMgc3RydWN0IGNkZXYgKnBFcGxfY2Rldl9nOworCisjZW5kaWYKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGludCB1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfTk9UT1BFTjsKKworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgU2VtYXBob3JlQ2JFdmVudF9nOwkvLyBzZW1hcGhvcmUgZm9yIEVwbExpbkNiRXZlbnQKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVDYkV2ZW50X2c7CS8vIHdhaXQgcXVldWUgRXBsTGluQ2JFdmVudAorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZVByb2Nlc3NfZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsQXBpUHJvY2VzcyAodXNlciBwcm9jZXNzKQorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZVJlbGVhc2VfZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsTGluUmVsZWFzZQorc3RhdGljIGF0b21pY190IEF0b21pY0V2ZW50U3RhdGVfZyA9IEFUT01JQ19JTklUKEVWRU5UX1NUQVRFX0lOSVQpOworc3RhdGljIHRFcGxBcGlFdmVudFR5cGUgRXZlbnRUeXBlX2c7CS8vIGV2ZW50IHR5cGUgKGVudW0pCitzdGF0aWMgdEVwbEFwaUV2ZW50QXJnICpwRXZlbnRBcmdfZzsJLy8gZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorc3RhdGljIHRFcGxLZXJuZWwgUmV0Q2JFdmVudF9nOwkvLyByZXR1cm4gY29kZSBmcm9tIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlQ2JTeW5jX2c7CS8vIHdhaXQgcXVldWUgRXBsTGluQ2JTeW5jCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUElfSW5fZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbiAodXNlciBwcm9jZXNzKQorc3RhdGljIGF0b21pY190IEF0b21pY1N5bmNTdGF0ZV9nID0gQVRPTUlDX0lOSVQoRVZFTlRfU1RBVEVfSU5JVCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICptX3BVc2VyQXJnOworCXZvaWQgKm1fcERhdGE7CisKK30gdEVwbExpblNkb0J1ZkhlYWRlcjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkJdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkJdm9pZCBHRU5FUklDICogcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiU3luYyh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgRXBsTGluSW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpOworCitzdGF0aWMgaW50IEVwbExpbk9wZW4oc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApOworc3RhdGljIGludCBFcGxMaW5SZWxlYXNlKHN0cnVjdCBpbm9kZSAqcERldmljZUZpbGVfcCwgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wKTsKK3N0YXRpYyBzc2l6ZV90IEVwbExpblJlYWQoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLCBjaGFyICpwRHN0QnVmZl9wLAorCQkJICBzaXplX3QgQnVmZlNpemVfcCwgbG9mZl90ICogcEZpbGVPZmZzX3ApOworc3RhdGljIHNzaXplX3QgRXBsTGluV3JpdGUoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLCBjb25zdCBjaGFyICpwU3JjQnVmZl9wLAorCQkJICAgc2l6ZV90IEJ1ZmZTaXplX3AsIGxvZmZfdCAqIHBGaWxlT2Zmc19wKTsKK3N0YXRpYyBpbnQgRXBsTGluSW9jdGwoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlJb2N0bENtZF9wLCB1bnNpZ25lZCBsb25nIHVsQXJnX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEtlcm5lbCBNb2R1bGUgc3BlY2lmaWMgRGF0YSBTdHJ1Y3R1cmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFWFBPUlRfTk9fU1lNQk9MUzsKKworbW9kdWxlX2luaXQoRXBsTGluSW5pdCk7Cittb2R1bGVfZXhpdChFcGxMaW5FeGl0KTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRXBsTGluRmlsZU9wc19nID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gRXBsTGluT3BlbiwKKwkucmVsZWFzZSA9IEVwbExpblJlbGVhc2UsCisJLnJlYWQgPSBFcGxMaW5SZWFkLAorCS53cml0ZSA9IEVwbExpbldyaXRlLAorCS5pb2N0bCA9IEVwbExpbklvY3RsLAorCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0YWlsaXplIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBpbnNtb2QgZHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKwlpbnQgaUVycjsKKwlpbnQgaVJldDsKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKwlpbnQgbk1pbm9yTnVtYmVyOworI2VuZGlmCisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5Jbml0Li4uXG4iKTsKKwlUUkFDRTIoIkVQTDogICBEcml2ZXIgYnVpbGQ6ICVzIC8gJXNcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlpUmV0ID0gMDsKKworCS8vIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcworCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJc2VtYV9pbml0KCZTZW1hcGhvcmVDYkV2ZW50X2csIDEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUHJvY2Vzc19nKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKwkvLyByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwlUUkFDRTIoIkVQTDogICBJbnN0YWxsaW5nIERyaXZlciAnJXMnLCBWZXJzaW9uICVzLi4uXG4iLAorCSAgICAgICBFUExMSU5fRFJWX05BTUUsIEVQTF9QUk9EVUNUX1ZFUlNJT04pOworCVRSQUNFMCgiRVBMOiAgICh1c2luZyBkeW5hbWljIG1ham9yIG51bWJlciBhc3NpZ25tZW50KVxuIik7CisJbkRydk1ham9yTnVtYmVyX2cgPQorCSAgICByZWdpc3Rlcl9jaHJkZXYoMCwgRVBMTElOX0RSVl9OQU1FLCAmRXBsTGluRmlsZU9wc19nKTsKKwlpZiAobkRydk1ham9yTnVtYmVyX2cgIT0gMCkgeworCQlUUkFDRTIKKwkJICAgICgiRVBMOiAgIERyaXZlciAnJXMnIGluc3RhbGxlZCBzdWNjZXNzZnVsLCBhc3NpZ25lZCBNYWpvck51bWJlcj0lZFxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUsIG5EcnZNYWpvck51bWJlcl9nKTsKKwl9IGVsc2UgeworCQlUUkFDRTEKKwkJICAgICgiRVBMOiAgIEVSUk9SOiBEcml2ZXIgJyVzJyBpcyB1bmFibGUgdG8gZ2V0IGEgZnJlZSBNYWpvck51bWJlciFcbiIsCisJCSAgICAgRVBMTElOX0RSVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjcmVhdGUgZGV2aWNlIG5vZGUgaW4gREVWRlMKKwluTWlub3JOdW1iZXIgPSAwOworCVRSQUNFMSgiRVBMOiAgIENyZWF0aW5nIGRldmljZSBub2RlICcvZGV2LyVzJy4uLlxuIiwgRVBMTElOX0RFVl9OQU1FKTsKKwlpRXJyID0KKwkgICAgZGV2ZnNfbWtfY2RldihNS0RFVihuRHJ2TWFqb3JOdW1iZXJfZywgbk1pbm9yTnVtYmVyKSwKKwkJCSAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLCBFUExMSU5fREVWX05BTUUpOworCWlmIChpRXJyID09IDApIHsKKwkJVFJBQ0UxKCJFUEw6ICAgRGV2aWNlIG5vZGUgJy9kZXYvJXMnIGNyZWF0ZWQgc3VjY2Vzc2Z1bC5cbiIsCisJCSAgICAgICBFUExMSU5fREVWX05BTUUpOworCX0gZWxzZSB7CisJCVRSQUNFMSgiRVBMOiAgIEVSUk9SOiB1bmFibGUgdG8gY3JlYXRlIGRldmljZSBub2RlICcvZGV2LyVzJ1xuIiwKKwkJICAgICAgIEVQTExJTl9ERVZfTkFNRSk7CisJCWlSZXQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCisjZWxzZQorCisJLy8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSBoYW5kbGVyCisJLy8gb25seSBvbmUgTWlub3IgcmVxdWlyZWQKKwlUUkFDRTIoIkVQTDogICBJbnN0YWxsaW5nIERyaXZlciAnJXMnLCBWZXJzaW9uICVzLi4uXG4iLAorCSAgICAgICBFUExMSU5fRFJWX05BTUUsIEVQTF9QUk9EVUNUX1ZFUlNJT04pOworCWlSZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZuRGV2TnVtX2csIDAsIDEsIEVQTExJTl9EUlZfTkFNRSk7CisJaWYgKGlSZXQgPT0gMCkgeworCQlUUkFDRTIKKwkJICAgICgiRVBMOiAgIERyaXZlciAnJXMnIGluc3RhbGxlZCBzdWNjZXNzZnVsLCBhc3NpZ25lZCBNYWpvck51bWJlcj0lZFxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUsIE1BSk9SKG5EZXZOdW1fZykpOworCX0gZWxzZSB7CisJCVRSQUNFMQorCQkgICAgKCJFUEw6ICAgRVJST1I6IERyaXZlciAnJXMnIGlzIHVuYWJsZSB0byBnZXQgYSBmcmVlIE1ham9yTnVtYmVyIVxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKworCS8vIHJlZ2lzdGVyIGNkZXYgc3RydWN0dXJlCisJcEVwbF9jZGV2X2cgPSBjZGV2X2FsbG9jKCk7CisJcEVwbF9jZGV2X2ctPm9wcyA9ICZFcGxMaW5GaWxlT3BzX2c7CisJcEVwbF9jZGV2X2ctPm93bmVyID0gVEhJU19NT0RVTEU7CisJaUVyciA9IGNkZXZfYWRkKHBFcGxfY2Rldl9nLCBuRGV2TnVtX2csIDEpOworCWlmIChpRXJyKSB7CisJCVRSQUNFMigiRVBMOiAgIEVSUk9SICVkOiBEcml2ZXIgJyVzJyBjb3VsZCBub3QgYmUgYWRkZWQhXG4iLAorCQkgICAgICAgaUVyciwgRVBMTElOX0RSVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGNyZWF0ZSBkZXZpY2Ugbm9kZSBpbiBQUk9DRlMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jSW5pdCgpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbkluaXQgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVtb3ZlIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBybW1vZCBkcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKworCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIG1vZHVsZXMKKy8vICAgIEVwbFJldCA9IEVwbEFwaVNodXRkb3duKCk7CisvLyAgICBwcmludGsoIkVwbEFwaVNodXRkb3duKCk6ICAweCVYXG4iLCBFcGxSZXQpOworCisJLy8gZGVpbml0aWFsaXplIHByb2MgZnMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jRnJlZSgpOworCXByaW50aygiRXBsTGluUHJvY0ZyZWUoKTogICAgICAgIDB4JVhcbiIsIEVwbFJldCk7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5FeGl0Li4uXG4iKTsKKworI2lmZGVmIENPTkZJR19ERVZGU19GUworCisJLy8gcmVtb3ZlIGRldmljZSBub2RlIGZyb20gREVWRlMKKwlkZXZmc19yZW1vdmUoRVBMTElOX0RFVl9OQU1FKTsKKwlUUkFDRTEoIkVQTDogICBEZXZpY2Ugbm9kZSAnL2Rldi8lcycgcmVtb3ZlZC5cbiIsIEVQTExJTl9ERVZfTkFNRSk7CisKKwkvLyB1bnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCXVucmVnaXN0ZXJfY2hyZGV2KG5EcnZNYWpvck51bWJlcl9nLCBFUExMSU5fRFJWX05BTUUpOworCisjZWxzZQorCisJLy8gcmVtb3ZlIGNkZXYgc3RydWN0dXJlCisJY2Rldl9kZWwocEVwbF9jZGV2X2cpOworCisJLy8gdW5yZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obkRldk51bV9nLCAxKTsKKworI2VuZGlmCisKKwlUUkFDRTEoIkVQTDogICBEcml2ZXIgJyVzJyByZW1vdmVkLlxuIiwgRVBMTElOX0RSVl9OQU1FKTsKKworCVRSQUNFMCgiRVBMOiAtIEVwbExpbkV4aXRcbiIpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgT3BlbiBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gb3BlbigiL2Rldi9kcml2ZXIiLCBPX1JEV1IpLi4uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpbk9wZW4oc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRvIG9wZW4KKwkJICAgICAgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wKQkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKK3sKKworCWludCBpUmV0OworCisJVFJBQ0UwKCJFUEw6ICsgRXBsTGluT3Blbi4uLlxuIik7CisKKwlNT0RfSU5DX1VTRV9DT1VOVDsKKworCWlmICh1aUVwbFN0YXRlX2cgIT0gRVBMX1NUQVRFX05PVE9QRU4pIHsJLy8gc3RhY2sgYWxyZWFkeSBpbml0aWFsaXplZAorCQlpUmV0ID0gLUVBTFJFQURZOworCX0gZWxzZSB7CisJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJCXNlbWFfaW5pdCgmU2VtYXBob3JlQ2JFdmVudF9nLCAxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUHJvY2Vzc19nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUmVsZWFzZV9nKTsKKwkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csIEVWRU5UX1NUQVRFX0lOSVQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVBJX0luX2cpOworCisJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9OT1RJTklUOworCQlpUmV0ID0gMDsKKwl9CisKKwlUUkFDRTEoIkVQTDogLSBFcGxMaW5PcGVuIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENsb3NlIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBjbG9zZShkZXZpY2UpLi4uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblJlbGVhc2Uoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRvIG9wZW4KKwkJCSBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQoreworCisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpblJlbGVhc2UuLi5cbiIpOworCisJaWYgKHVpRXBsU3RhdGVfZyAhPSBFUExfU1RBVEVfTk9USU5JVCkgeworCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCisJCWlmICh1aUVwbFN0YXRlX2cgPT0gRVBMX1NUQVRFX1JVTk5JTkcpIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZgorCQkJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dpdGNoT2ZmKTsKKworCQl9CisKKwkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJVFJBQ0UwKCJFUEw6ICAgd2FpdGluZyBmb3IgTk1UX0dTX09GRlxuIik7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlUmVsZWFzZV9nLAorCQkJCQkJICh1aUVwbFN0YXRlX2cgPT0KKwkJCQkJCSAgRVBMX1NUQVRFX1NIVVRET1dOKSk7CisJCX0gZWxzZSB7CS8vIHBvc3QgTm10RXZlbnRTd2l0Y2hPZmYgZmFpbGVkCisJCQlUUkFDRTAoIkVQTDogICBldmVudCBwb3N0IGZhaWxlZFxuIik7CisJCX0KKworCQkvLyAkJCQgZC5rLjogV2hhdCBpZiB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWw/CisKKwkJVFJBQ0UwKCJFUEw6ICAgY2FsbCBFcGxBcGlTaHV0ZG93bigpXG4iKTsKKwkJLy8gRVBMIHN0YWNrIGNhbiBiZSBzYWZlbHkgc2h1dCBkb3duCisJCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIEVQTCBtb2R1bGVzCisJCUVwbFJldCA9IEVwbEFwaVNodXRkb3duKCk7CisJCXByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisJfQorCisJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX05PVE9QRU47CisJaVJldCA9IDA7CisKKwlNT0RfREVDX1VTRV9DT1VOVDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpblJlbGVhc2UgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBEYXRhIGZyb20gRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IHJlYWQoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHNzaXplX3QgRXBsTGluUmVhZChzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkJICBjaGFyICpwRHN0QnVmZl9wLAkvLyBhZGRyZXNzIG9mIGJ1ZmZlciB0byBmaWxsIHdpdGggZGF0YQorCQkJICBzaXplX3QgQnVmZlNpemVfcCwJLy8gbGVuZ3RoIG9mIHRoZSBidWZmZXIKKwkJCSAgbG9mZl90ICogcEZpbGVPZmZzX3ApCS8vIG9mZnNldCBpbiB0aGUgZmlsZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5SZWFkLi4uXG4iKTsKKworCVRSQUNFMCgiRVBMOiAgIFNvcnJ5LCB0aGlzIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQuXG4iKTsKKwlpUmV0ID0gLUVJTlZBTDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpblJlYWQgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgRGF0YSB0byBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gd3JpdGUoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHNzaXplX3QgRXBsTGluV3JpdGUoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKKwkJCSAgIGNvbnN0IGNoYXIgKnBTcmNCdWZmX3AsCS8vIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGdldCBkYXRhIGZyb20KKwkJCSAgIHNpemVfdCBCdWZmU2l6ZV9wLAkvLyBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorCQkJICAgbG9mZl90ICogcEZpbGVPZmZzX3ApCS8vIG9mZnNldCBpbiB0aGUgZmlsZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5Xcml0ZS4uLlxuIik7CisKKwlUUkFDRTAoIkVQTDogICBTb3JyeSwgdGhpcyBvcGVyYXRpb24gaXNuJ3Qgc3VwcG9ydGVkLlxuIik7CisJaVJldCA9IC1FSU5WQUw7CisKKwlUUkFDRTEoIkVQTDogLSBFcGxMaW5Xcml0ZSAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZW5lcmljIEFjY2VzcyB0byBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gaW9jdGwoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Jb2N0bChzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkgICAgICAgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKKwkJICAgICAgIHVuc2lnbmVkIGludCB1aUlvY3RsQ21kX3AsCS8vIElvY3RsIGNvbW1hbmQgdG8gZXhlY3V0ZQorCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bEFyZ19wKQkvLyBJb2N0bCBjb21tYW5kIHNwZWNpZmljIGFyZ3VtZW50L3BhcmFtZXRlcgoreworCisJdEVwbEtlcm5lbCBFcGxSZXQ7CisJaW50IGlFcnI7CisJaW50IGlSZXQ7CisKKy8vICAgIFRSQUNFMSgiRVBMOiArIEVwbExpbklvY3RsICh1aUlvY3RsQ21kX3A9JWQpLi4uXG4iLCB1aUlvY3RsQ21kX3ApOworCisJaVJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHVpSW9jdGxDbWRfcCkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0lOSVRJQUxJWkU6CisJCXsKKwkJCXRFcGxBcGlJbml0UGFyYW0gRXBsQXBpSW5pdFBhcmFtOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmRXBsQXBpSW5pdFBhcmFtLAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihFcGxBcGlJbml0UGFyYW0pKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiRXZlbnQgPSBFcGxMaW5DYkV2ZW50OworCQkJRXBsQXBpSW5pdFBhcmFtLm1fcGZuQ2JTeW5jID0gRXBsTGluQ2JTeW5jOworCisJCQlFcGxSZXQgPSBFcGxBcGlJbml0aWFsaXplKCZFcGxBcGlJbml0UGFyYW0pOworCisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfUlVOTklORzsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1NIVVRET1dOOgorCQl7CQkvLyBzaHV0ZG93biB0aGUgdGhyZWFkcworCisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCisJCQlpZiAodWlFcGxTdGF0ZV9nID09IEVQTF9TVEFURV9SVU5OSU5HKSB7CS8vIHBvc3QgTm10RXZlbnRTd2l0Y2hPZmYKKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJCQl9CisKKwkJCWlSZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1JFQURfTE9DQUxfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluTG9jYWxPYmplY3QgTG9jYWxPYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkxvY2FsT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihMb2NhbE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChMb2NhbE9iamVjdC5tX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKExvY2FsT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBEYXRhID0gdm1hbGxvYyhMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocERhdGEgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVJlYWRMb2NhbE9iamVjdChMb2NhbE9iamVjdC5tX3VpSW5kZXgsCisJCQkJCQkgIExvY2FsT2JqZWN0Lm1fdWlTdWJpbmRleCwKKwkJCQkJCSAgcERhdGEsICZMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisKKwkJCWlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpRXJyID0KKwkJCQkgICAgY29weV90b191c2VyKExvY2FsT2JqZWN0Lm1fcERhdGEsIHBEYXRhLAorCQkJCQkJIExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKworCQkJCXZmcmVlKHBEYXRhKTsKKworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gcmV0dXJuIGFjdHVhbCBzaXplIChMb2NhbE9iamVjdC5tX3VpU2l6ZSkKKwkJCQlpRXJyID0gcHV0X3VzZXIoTG9jYWxPYmplY3QubV91aVNpemUsCisJCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmTG9jYWxPYmplY3QuCisJCQkJCQkJCSBtX3VpU2l6ZSAtCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZMb2NhbE9iamVjdCkpOworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJdmZyZWUocERhdGEpOworCQkJfQorCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfV1JJVEVfTE9DQUxfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluTG9jYWxPYmplY3QgTG9jYWxPYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkxvY2FsT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihMb2NhbE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChMb2NhbE9iamVjdC5tX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKExvY2FsT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBEYXRhID0gdm1hbGxvYyhMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocERhdGEgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIocERhdGEsIExvY2FsT2JqZWN0Lm1fcERhdGEsCisJCQkJCSAgIExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdChMb2NhbE9iamVjdC5tX3VpSW5kZXgsCisJCQkJCQkgICBMb2NhbE9iamVjdC5tX3VpU3ViaW5kZXgsCisJCQkJCQkgICBwRGF0YSwgTG9jYWxPYmplY3QubV91aVNpemUpOworCisJCQl2ZnJlZShwRGF0YSk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTExJTl9DTURfUkVBRF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5TZG9PYmplY3QgU2RvT2JqZWN0OworCQkJdm9pZCAqcERhdGE7CisJCQl0RXBsTGluU2RvQnVmSGVhZGVyICpwQnVmSGVhZGVyOworCQkJdEVwbFNkb0NvbUNvbkhkbCAqcFNkb0NvbUNvbkhkbDsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlNkb09iamVjdCwgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKFNkb09iamVjdC5tX2xlX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKFNkb09iamVjdC5tX3VpU2l6ZSA9PSAwKSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlwQnVmSGVhZGVyID0KKwkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpICsKKwkJCQkgICAgU2RvT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwQnVmSGVhZGVyID09IE5VTEwpIHsJLy8gbm8gbWVtb3J5IGF2YWlsYWJsZQorCQkJCWlSZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGluaXRpYXRlIHRlbXBvcmFyeSBidWZmZXIKKwkJCXBCdWZIZWFkZXItPm1fcFVzZXJBcmcgPSBTZG9PYmplY3QubV9wVXNlckFyZzsJLy8gb3JpZ2luYWwgdXNlciBhcmd1bWVudCBwb2ludGVyCisJCQlwQnVmSGVhZGVyLT5tX3BEYXRhID0gU2RvT2JqZWN0Lm1fbGVfcERhdGE7CS8vIG9yaWdpbmFsIGRhdGEgcG9pbnRlciBmcm9tIGFwcAorCQkJcERhdGEgPSBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQlpZiAoU2RvT2JqZWN0Lm1fZlZhbGlkU2RvQ29tQ29uSGRsICE9IEZBTFNFKSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9ICZTZG9PYmplY3QubV9TZG9Db21Db25IZGw7CisJCQl9IGVsc2UgeworCQkJCXBTZG9Db21Db25IZGwgPSBOVUxMOworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVJlYWRPYmplY3QocFNkb0NvbUNvbkhkbCwKKwkJCQkJICAgICBTZG9PYmplY3QubV91aU5vZGVJZCwKKwkJCQkJICAgICBTZG9PYmplY3QubV91aUluZGV4LAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpU3ViaW5kZXgsIHBEYXRhLAorCQkJCQkgICAgICZTZG9PYmplY3QubV91aVNpemUsCisJCQkJCSAgICAgU2RvT2JqZWN0Lm1fU2RvVHlwZSwgcEJ1ZkhlYWRlcik7CisKKwkJCS8vIHJldHVybiBhY3R1YWwgU0RPIGhhbmRsZSAoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsKQorCQkJaUVyciA9IHB1dF91c2VyKFNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbCwKKwkJCQkJKHVuc2lnbmVkIGludCAqKSh1bEFyZ19wICsKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICZTZG9PYmplY3QuCisJCQkJCQkJIG1fU2RvQ29tQ29uSGRsIC0KKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICZTZG9PYmplY3QpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpRXJyID0KKwkJCQkgICAgY29weV90b191c2VyKFNkb09iamVjdC5tX2xlX3BEYXRhLCBwRGF0YSwKKwkJCQkJCSBTZG9PYmplY3QubV91aVNpemUpOworCisJCQkJdmZyZWUocEJ1ZkhlYWRlcik7CisKKwkJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJCWlSZXQgPSAtRUlPOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHJldHVybiBhY3R1YWwgc2l6ZSAoU2RvT2JqZWN0Lm1fdWlTaXplKQorCQkJCWlFcnIgPSBwdXRfdXNlcihTZG9PYmplY3QubV91aVNpemUsCisJCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmU2RvT2JqZWN0LgorCQkJCQkJCQkgbV91aVNpemUgLQorCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmU2RvT2JqZWN0KSk7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0gZWxzZSBpZiAoRXBsUmV0ICE9IGtFcGxBcGlUYXNrRGVmZXJyZWQpIHsJLy8gZXJyb3Igb2N1cnJlZAorCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTExJTl9DTURfV1JJVEVfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluU2RvT2JqZWN0IFNkb09iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCQkJdEVwbExpblNkb0J1ZkhlYWRlciAqcEJ1ZkhlYWRlcjsKKwkJCXRFcGxTZG9Db21Db25IZGwgKnBTZG9Db21Db25IZGw7CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZTZG9PYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChTZG9PYmplY3QubV9sZV9wRGF0YSA9PSBOVUxMKQorCQkJICAgIHx8IChTZG9PYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcEJ1ZkhlYWRlciA9CisJCQkgICAgKHRFcGxMaW5TZG9CdWZIZWFkZXIgKikKKwkJCSAgICB2bWFsbG9jKHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKSArCisJCQkJICAgIFNkb09iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocEJ1ZkhlYWRlciA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBpbml0aWF0ZSB0ZW1wb3JhcnkgYnVmZmVyCisJCQlwQnVmSGVhZGVyLT5tX3BVc2VyQXJnID0gU2RvT2JqZWN0Lm1fcFVzZXJBcmc7CS8vIG9yaWdpbmFsIHVzZXIgYXJndW1lbnQgcG9pbnRlcgorCQkJcEJ1ZkhlYWRlci0+bV9wRGF0YSA9IFNkb09iamVjdC5tX2xlX3BEYXRhOwkvLyBvcmlnaW5hbCBkYXRhIHBvaW50ZXIgZnJvbSBhcHAKKwkJCXBEYXRhID0gcEJ1ZkhlYWRlciArIHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIocERhdGEsIFNkb09iamVjdC5tX2xlX3BEYXRhLAorCQkJCQkgICBTZG9PYmplY3QubV91aVNpemUpOworCisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoU2RvT2JqZWN0Lm1fZlZhbGlkU2RvQ29tQ29uSGRsICE9IEZBTFNFKSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9ICZTZG9PYmplY3QubV9TZG9Db21Db25IZGw7CisJCQl9IGVsc2UgeworCQkJCXBTZG9Db21Db25IZGwgPSBOVUxMOworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVdyaXRlT2JqZWN0KHBTZG9Db21Db25IZGwsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpTm9kZUlkLAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aUluZGV4LAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aVN1YmluZGV4LCBwRGF0YSwKKwkJCQkJICAgICAgU2RvT2JqZWN0Lm1fdWlTaXplLAorCQkJCQkgICAgICBTZG9PYmplY3QubV9TZG9UeXBlLCBwQnVmSGVhZGVyKTsKKworCQkJLy8gcmV0dXJuIGFjdHVhbCBTRE8gaGFuZGxlIChTZG9PYmplY3QubV9TZG9Db21Db25IZGwpCisJCQlpRXJyID0gcHV0X3VzZXIoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsLAorCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdC4KKwkJCQkJCQkgbV9TZG9Db21Db25IZGwgLQorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKEVwbFJldCAhPSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIHN1Y2NlZWRlZCBvciBlcnJvciBvY3VycmVkLCBidXQgdGFzayBub3QgZGVmZXJyZWQKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKwkJCX0KKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0ZSRUVfU0RPX0NIQU5ORUw6CisJCXsKKwkJCS8vIGZvcndhcmQgU0RPIGhhbmRsZSB0byBFUEwgc3RhY2sKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwoKHRFcGxTZG9Db21Db25IZGwpIHVsQXJnX3ApOworCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX01OX1RSSUdHRVJfU1RBVEVfQ0hBTkdFOgorCQl7CisJCQl0RXBsTGluTm9kZUNtZE9iamVjdCBOb2RlQ21kT2JqZWN0OworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTm9kZUNtZE9iamVjdCwKKwkJCQkJICAgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoTm9kZUNtZE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShOb2RlQ21kT2JqZWN0Lm1fdWlOb2RlSWQsCisJCQkJCQkgICAgICAgTm9kZUNtZE9iamVjdC4KKwkJCQkJCSAgICAgICBtX05vZGVDb21tYW5kKTsKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0dFVF9FVkVOVDoKKwkJeworCQkJdEVwbExpbkV2ZW50IEV2ZW50OworCisJCQkvLyBzYXZlIGV2ZW50IHN0cnVjdHVyZQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkV2ZW50LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihFdmVudCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHNhdmUgcmV0dXJuIGNvZGUgZnJvbSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisJCQlSZXRDYkV2ZW50X2cgPSBFdmVudC5tX1JldENiRXZlbnQ7CisKKwkJCWlmIChSZXRDYkV2ZW50X2cgPT0ga0VwbFNodXRkb3duKSB7CisJCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csCisJCQkJCSAgIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJCQkvLyBleGl0IHdpdGggZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZAorCQkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JT0NUTCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJCS8vIGZhbGwgYXNsZWVwIGl0c2VsZiBpbiBvd24gd2FpdCBxdWV1ZQorCQkJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVQcm9jZXNzX2csCisJCQkJCQkJKGF0b21pY19yZWFkCisJCQkJCQkJICgmQXRvbWljRXZlbnRTdGF0ZV9nKQorCQkJCQkJCSA9PSBFVkVOVF9TVEFURV9SRUFEWSkKKwkJCQkJCQl8fAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY0V2ZW50U3RhdGVfZykKKwkJCQkJCQkgPT0gRVZFTlRfU1RBVEVfVEVSTSkpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IEVwbEFwaVByb2Nlc3MoKSB3aWxsIGxlYXZlIHRoZSBpbmZpbml0ZSBsb29wCisJCQkJaVJldCA9IGlFcnI7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSB7CS8vIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzCisJCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBjb3B5IGV2ZW50IHRvIHVzZXIgc3BhY2UKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfdG9fdXNlcihFdmVudC5tX3BFdmVudFR5cGUsICZFdmVudFR5cGVfZywKKwkJCQkJIHNpemVvZihFdmVudFR5cGVfZykpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyBub3QgYWxsIGRhdGEgY291bGQgYmUgY29waWVkCisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gJCQkIGQuay4gcGVyZm9ybSBTRE8gZXZlbnQgcHJvY2Vzc2luZworCQkJaWYgKEV2ZW50VHlwZV9nID09IGtFcGxBcGlFdmVudFNkbykgeworCQkJCXZvaWQgKnBEYXRhOworCQkJCXRFcGxMaW5TZG9CdWZIZWFkZXIgKnBCdWZIZWFkZXI7CisKKwkJCQlwQnVmSGVhZGVyID0KKwkJCQkgICAgKHRFcGxMaW5TZG9CdWZIZWFkZXIgKikgcEV2ZW50QXJnX2ctPm1fU2RvLgorCQkJCSAgICBtX3BVc2VyQXJnOworCQkJCXBEYXRhID0KKwkJCQkgICAgcEJ1ZkhlYWRlciArIHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKTsKKworCQkJCWlmIChwRXZlbnRBcmdfZy0+bV9TZG8ubV9TZG9BY2Nlc3NUeXBlID09CisJCQkJICAgIGtFcGxTZG9BY2Nlc3NUeXBlUmVhZCkgeworCQkJCQkvLyBjb3B5IHJlYWQgZGF0YSB0byB1c2VyIHNwYWNlCisJCQkJCWlFcnIgPQorCQkJCQkgICAgY29weV90b191c2VyKHBCdWZIZWFkZXItPm1fcERhdGEsCisJCQkJCQkJIHBEYXRhLAorCQkJCQkJCSBwRXZlbnRBcmdfZy0+bV9TZG8uCisJCQkJCQkJIG1fdWlUcmFuc2ZlcnJlZEJ5dGUpOworCQkJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQkJCWlSZXQgPSAtRUlPOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQorCQkJCXBFdmVudEFyZ19nLT5tX1Nkby5tX3BVc2VyQXJnID0KKwkJCQkgICAgcEJ1ZkhlYWRlci0+bV9wVXNlckFyZzsKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKwkJCX0KKworCQkJaUVyciA9CisJCQkgICAgY29weV90b191c2VyKEV2ZW50Lm1fcEV2ZW50QXJnLCBwRXZlbnRBcmdfZywKKwkJCQkJIG1pbihzaXplb2YodEVwbEFwaUV2ZW50QXJnKSwKKwkJCQkJICAgICBFdmVudC5tX3VpRXZlbnRBcmdTaXplKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2VzcygpLCB3aGljaCB3aWxsIGNhbGwgdGhlIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCWlSZXQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfUElfU0VUVVA6CisJCXsKKwkJCUVwbFJldCA9IEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKCk7CisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9JTjoKKwkJeworCQkJdEVwbEFwaVByb2Nlc3NJbWFnZSBQcm9jZXNzSW1hZ2VJbjsKKworCQkJLy8gc2F2ZSBwcm9jZXNzIGltYWdlIHN0cnVjdHVyZQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlByb2Nlc3NJbWFnZUluLAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihQcm9jZXNzSW1hZ2VJbikpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfSU9DVEwpOworCisJCQkvLyBmYWxsIGFzbGVlcCBpdHNlbGYgaW4gb3duIHdhaXQgcXVldWUKKwkJCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlUElfSW5fZywKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNTeW5jU3RhdGVfZykgPT0KKwkJCQkJCQkgRVZFTlRfU1RBVEVfUkVBRFkpCisJCQkJCQkJfHwKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNTeW5jU3RhdGVfZykgPT0KKwkJCQkJCQkgRVZFTlRfU1RBVEVfVEVSTSkpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csCisJCQkJCSAgIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IGFwcGxpY2F0aW9uIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gaUVycjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkgewkvLyB0ZXJtaW5hdGlvbiBpbiBwcm9ncmVzcworCQkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJCQkvLyBleGl0IHdpdGggdGhpcyBlcnJvciAtPiBhcHBsaWNhdGlvbiB3aWxsIGxlYXZlIHRoZSBpbmZpbml0ZSBsb29wCisJCQkJaVJldCA9IDE7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZXhjaGFuZ2UgcHJvY2VzcyBpbWFnZQorCQkJRXBsUmV0ID0gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigmUHJvY2Vzc0ltYWdlSW4pOworCisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9PVVQ6CisJCXsKKwkJCXRFcGxBcGlQcm9jZXNzSW1hZ2UgUHJvY2Vzc0ltYWdlT3V0OworCisJCQkvLyBzYXZlIHByb2Nlc3MgaW1hZ2Ugc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmUHJvY2Vzc0ltYWdlT3V0LAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihQcm9jZXNzSW1hZ2VPdXQpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChhdG9taWNfcmVhZCgmQXRvbWljU3luY1N0YXRlX2cpICE9CisJCQkgICAgRVZFTlRfU1RBVEVfUkVBRFkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsSW52YWxpZE9wZXJhdGlvbjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBleGNoYW5nZSBwcm9jZXNzIGltYWdlCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KCZQcm9jZXNzSW1hZ2VPdXQpOworCisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKworCQkJLy8gcmV0dXJuIHRvIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlb3V0KCkKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX05NVF9DT01NQU5EOgorCQl7CisJCQkvLyBmb3J3YXJkIE5NVCBjb21tYW5kIHRvIEVQTCBzdGFjaworCQkJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoKHRFcGxObXRFdmVudCkgdWxBcmdfcCk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKy8vICAgIFRSQUNFMSgiRVBMOiAtIEVwbExpbklvY3RsIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQl0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQl2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJaW50IGlFcnI7CisKKwkvLyBibG9jayBhbnkgZnVydGhlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGkuZS4gZW50ZXIgY3JpdGljYWwgc2VjdGlvbgorCWlFcnIgPSBkb3duX2ludGVycnVwdGlibGUoJlNlbWFwaG9yZUNiRXZlbnRfZyk7CisJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHdhaXQgZm9yIEVwbEFwaVByb2Nlc3MoKSB0byBjYWxsIGlvY3RsCisJLy8gbm9ybWFsbHkgaXQgc2hvdWxkIGJlIHdhaXRpbmcgYWxyZWFkeSBmb3IgdXMgdG8gcGFzcyBhIG5ldyBldmVudAorCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlQ2JFdmVudF9nLAorCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0KKwkJCQkJIEVWRU5UX1NUQVRFX0lPQ1RMKQorCQkJCQl8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0KKwkJCQkJICAgIEVWRU5UX1NUQVRFX1RFUk0pKTsKKwlpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX1RFUk0pKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCWdvdG8gTGVhdmVDcml0aWNhbFNlY3Rpb247CisJfQorCS8vIHNhdmUgZXZlbnQgaW5mb3JtYXRpb24gZm9yIGlvY3RsCisJRXZlbnRUeXBlX2cgPSBFdmVudFR5cGVfcDsKKwlwRXZlbnRBcmdfZyA9IHBFdmVudEFyZ19wOworCisJLy8gcGFzcyBjb250cm9sIHRvIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24sIGkuZS4gRXBsQXBpUHJvY2VzcygpCisJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9SRUFEWSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCisJLy8gbm93LCB0aGUgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGV2ZW50CisKKwkvLyB3YWl0IGZvciBjb21wbGV0aW9uIG9mIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24sIGkuZS4gRXBsQXBpUHJvY2VzcygpIGNhbGxzIGlvY3RsIGFnYWluCisJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVDYkV2ZW50X2csCisJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgRVZFTlRfU1RBVEVfSU9DVEwpCisJCQkJCXx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgICAgRVZFTlRfU1RBVEVfVEVSTSkpOworCWlmICgoaUVyciAhPSAwKSB8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKwkJZ290byBMZWF2ZUNyaXRpY2FsU2VjdGlvbjsKKwl9CisJLy8gcmVhZCByZXR1cm4gY29kZSBmcm9tIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwlFcGxSZXQgPSBSZXRDYkV2ZW50X2c7CisKKyAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uOgorCXVwKCZTZW1hcGhvcmVDYkV2ZW50X2cpOworCisgICAgICBFeGl0OgorCS8vIGNoZWNrIGlmIE5NVF9HU19PRkYgaXMgcmVhY2hlZAorCWlmIChFdmVudFR5cGVfcCA9PSBrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZSkgeworCQlpZiAocEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9PSBrRXBsTm10R3NPZmYpIHsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgd2FzIHNodXQgZG93bgorCQkJVFJBQ0UwKCJFUEw6ICAgRXBsTGluQ2JFdmVudChOTVRfR1NfT0ZGKVxuIik7CisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfU0hVVERPV047CisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJd2FrZV91cCgmV2FpdFF1ZXVlUmVsZWFzZV9nKTsKKwkJfSBlbHNlIHsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgaXMgcnVubmluZworCQkJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX1JVTk5JTkc7CisJCX0KKwl9CisKKwlyZXR1cm4gRXBsUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMaW5DYlN5bmModm9pZCkKK3sKKwl0RXBsS2VybmVsIEVwbFJldCA9IGtFcGxTdWNjZXNzZnVsOworCWludCBpRXJyOworCisJLy8gY2hlY2sgaWYgdXNlciBwcm9jZXNzIHdhaXRzIGZvciBzeW5jCisJaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfSU9DVEwpIHsKKwkJLy8gcGFzcyBjb250cm9sIHRvIGFwcGxpY2F0aW9uLCBpLmUuIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4oKQorCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfUkVBRFkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZVBJX0luX2cpOworCisJCS8vIG5vdywgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NlcyB0aGUgc3luYyBldmVudAorCisJCS8vIHdhaXQgZm9yIGNhbGwgb2YgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoKQorCQlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZUNiU3luY19nLAorCQkJCQkJKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykKKwkJCQkJCSA9PSBFVkVOVF9TVEFURV9JT0NUTCkKKwkJCQkJCXx8CisJCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKQorCQkJCQkJID09IEVWRU5UX1NUQVRFX1RFUk0pKTsKKwkJaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIGFwcGxpY2F0aW9uIGNhbGxlZCB3cm9uZyBmdW5jdGlvbgorCQkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQl9CisJfSBlbHNlIHsJCS8vIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBub3Qgd2FpdGluZyBmb3Igc3luYworCQkvLyBjb250aW51ZSB3aXRob3V0IGludGVycnVwdGlvbgorCQkvLyBUUERPIGFyZSBzZXQgdmFsaWQgYnkgY2FsbGVyIChpLmUuIEVwbEV2ZW50a1Byb2Nlc3MoKSkKKwl9CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCXJldHVybiBFcGxSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpUHJvY2Vzc0ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyZmRmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpUHJvY2Vzc0ltYWdlLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRVBMIEFQSSBtb2R1bGUgKHByb2Nlc3MgaW1hZ2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpUHJvY2Vzc0ltYWdlLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGwuaCIKKy8vI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxBcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMCkgfHwgKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDApKQordHlwZWRlZiBzdHJ1Y3QgeworI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMAorCUJZVEUgbV9hYlByb2Nlc3NJbWFnZUlucHV0W0VQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOXTsKKyNlbmRpZgorI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDAKKwlCWVRFIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXRbRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUXTsKKyNlbmRpZgorCit9IHRFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2UgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZzsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB1cCBzdGF0aWMgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZiAoKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMCkgfHwgKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDApKQorCXVuc2lnbmVkIGludCB1aVZhckVudHJpZXM7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKyNlbmRpZgorCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU47CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMDAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU47CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMDEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDI7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDEwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOIC8gT2JkU2l6ZTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAxMSwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMjAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDQ7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDIxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKyNlbmRpZgorCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMAorCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVDsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAzMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUOworCU9iZFNpemUgPSAxOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDMxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDQwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDQxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDUwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDUxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXBsYWNlcyBwYXNzZWQgaW5wdXQgcHJvY2VzcyBpbWFnZSB3aXRoIHRoZSBvbmUgb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIHBQSV9wICAgICAgICAgICAgICAgICAgID0gaW5wdXQgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKHRFcGxBcGlQcm9jZXNzSW1hZ2UgKiBwUElfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWNvcHlfdG9fdXNlcihwUElfcC0+bV9wSW1hZ2UsCisJCSAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlSW5wdXQsCisJCSAgICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJCSBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCQltX2FiUHJvY2Vzc0ltYWdlSW5wdXQpKSk7CisjZWxzZQorCUVQTF9NRU1DUFkocFBJX3AtPm1fcEltYWdlLAorCQkgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwKKwkJICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJICAgICAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0KSkpOworI2VuZGlmCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY29waWVzIHBhc3NlZCBvdXRwdXQgcHJvY2VzcyBpbWFnZSB0byBFUEwgc3RhY2suCisvLworLy8gUGFyYW1ldGVyczogIHBQSV9wICAgICAgICAgICAgICAgICAgID0gb3V0cHV0IHByb2Nlc3MgaW1hZ2UKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQodEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgPiAwCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWNvcHlfZnJvbV91c2VyKEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cubV9hYlByb2Nlc3NJbWFnZU91dHB1dCwKKwkJICAgICAgIHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgICAgIG1pbihwUElfcC0+bV91aVNpemUsCisJCQkgICBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCQkgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQpKSk7CisjZWxzZQorCUVQTF9NRU1DUFkoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LAorCQkgICBwUElfcC0+bV9wSW1hZ2UsCisJCSAgIG1pbihwUElfcC0+bV91aVNpemUsCisJCSAgICAgICBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQpKSk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQ2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlOTU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQ2ZnLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBjb25maWd1cmF0aW9uIGZpbGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxDZmcuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wNiAgICBrLnQuOiBTdGFydCBvZiBJbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExDRkdfSF8KKyNkZWZpbmUgX0VQTENGR19IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnZW5lcmljIGRlZmluZXMgd2hpY2ggZm9yIHdob2xlIEVQTCBTdGFjaworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfVVNFX0RFTEVURUlOU1RfRlVOQyBUUlVFCisKKy8vIG5lZWRlZCB0byBzdXBwb3J0IGRhdGF0eXBlcyBvdmVyIDMyIGJpdCBieSBnbG9iYWwuaAorI2RlZmluZSBVU0VfVkFSNjQKKworLy8gRVBMX01BWF9JTlNUQU5DRVMgc3BlY2lmaWVzIGNvdW50IG9mIGluc3RhbmNlcyBvZiBhbGwgRVBMIG1vZHVsZXMuCisvLyBJZiBpdCBpcyBncmVhdGVyIHRoYW4gMSB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGFsbAorLy8gZnVuY3Rpb25zIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuCisjZGVmaW5lIEVQTF9NQVhfSU5TVEFOQ0VTICAgICAgICAgICAgICAgMQorCisvLyBUaGlzIGRlZmluZXMgdGhlIHRhcmdldCBoYXJkd2FyZS4gSGVyZSBpcyBlbmNvZGVkIHdpY2ggQ1BVIGFuZCB3aWNoIGV4dGVybmFsCisvLyBwZXJpcGhlcmFscyBhcmUgY29ubmVjdGVkLiBGb3IgcG9zc2libGUgdmFsdWVzIHJlZmVyZSB0byB0YXJnZXQuaC4gSWYKKy8vIG5lY2Vzc2FyeSB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlIEVQTCBzdGFjayBoYXMgdG8KKy8vIGJlIGFkYXB0ZWQgYW5kIHRlc3RlZC4KKyNkZWZpbmUgVEFSR0VUX0hBUkRXQVJFICAgICAgICAgICAgICAgICBUR1RIV19QQ19XUkFQUAorCisvLyB1c2Ugbm8gRklGT3MsIG1ha2UgZGlyZWN0IGNhbGxzCisvLyNkZWZpbmUgRVBMX05PX0ZJRk8KKworLy8gdXNlIG5vIElQQyBiZXR3ZWVuIHVzZXItIGFuZCBrZXJuZWxzcGFjZSBtb2R1bGVzLCBtYWtlIGRpcmVjdCBjYWxscworI2RlZmluZSBFUExfTk9fVVNFUl9LRVJORUwKKworI2lmbmRlZiBCRU5DSE1BUktfTU9EVUxFUworI2RlZmluZSBCRU5DSE1BUktfTU9EVUxFUyAgICAgICAwCS8vMHhFRTgwMDA0MkwKKyNlbmRpZgorCisvLyBEZWZhdWx0IGRlZnVnIGxldmVsOgorLy8gT25seSBkZWJ1ZyB0cmFjZXMgb2YgdGhlc2UgbW9kdWxlcyB3aWxsIGJlIGNvbXBpbGVkIHdoaWNoIGZsYWdzIGFyZSBzZXQgaW4gZGVmaW5lIERFRl9ERUJVR19MVkwuCisjaWZuZGVmIERFRl9ERUJVR19MVkwKKyNkZWZpbmUgREVGX0RFQlVHX0xWTCAgICAgICAgICAgMHhFQzAwMDAwMEwKKyNlbmRpZgorLy8gICBFUExfREJHTFZMX09CRCAgICAgICAgID0gICAweDAwMDAwMDA0TAorLy8gKiBFUExfREJHTFZMX0FTU0VSVCAgICAgID0gICAweDIwMDAwMDAwTAorLy8gKiBFUExfREJHTFZMX0VSUk9SICAgICAgID0gICAweDQwMDAwMDAwTAorLy8gKiBFUExfREJHTFZMX0FMV0FZUyAgICAgID0gICAweDgwMDAwMDAwTAorCisvLyBFUExfTU9EVUxFX0lOVEVHUkFUSU9OIGRlZmluZXMgYWxsIG1vZHVsZXMgd2hpY2ggYXJlIGluY2x1ZGVkIGluCisvLyBFUEwgYXBwbGljYXRpb24uIFBsZWFzZSBhZGQgb3IgZGVsZXRlIG1vZHVsZXMgZm9yIHlvdXIgYXBwbGljYXRpb24uCisjZGVmaW5lIEVQTF9NT0RVTEVfSU5URUdSQVRJT04gRVBMX01PRFVMRV9PQkRLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfUERPSyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX05NVF9NTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET1MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9DIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfU0RPX0FTTkQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9fVURQIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UX0NOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UVSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX05NVEsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9ETExLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfRExMVSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1ZFVEgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9PQkRVCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEVQTCBldGhlcm5ldCBkcml2ZXIgKEVkcnYpIHNwZWNpZmljIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBmYXN0IHR4IGZyYW1lcworI2RlZmluZSBFRFJWX0ZBU1RfVFhGUkFNRVMgICAgICAgICAgICAgIEZBTFNFCisvLyNkZWZpbmUgRURSVl9GQVNUX1RYRlJBTUVTICAgICAgICAgICAgICBUUlVFCisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZWFybHkgcmVjZWl2ZSBpbnRlcnJ1cHRzCisjZGVmaW5lIEVEUlZfRUFSTFlfUlhfSU5UICAgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0VBUkxZX1JYX0lOVCAgICAgICAgICAgICAgIFRSVUUKKworLy8gZW5hYmxlcyBzZXR0aW5nIG9mIHNldmVyYWwgcG9ydCBwaW5zIGZvciBiZW5jaG1hcmtpbmcgcHVycG9zZXMKKyNkZWZpbmUgRURSVl9CRU5DSE1BUksgICAgICAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfQkVOQ0hNQVJLICAgICAgICAgICAgICAgICAgVFJVRSAvLyBNQ0ZfR1BJT19QT0RSX1BDSUJSCisKKy8vIENhbGwgVHggaGFuZGxlciAoaS5lLiBFcGxEbGxDYkZyYW1lVHJhbnNtaXR0ZWQoKSkgYWxyZWFkeSBpZiBETUEgaGFzIGZpbmlzaGVkLAorLy8gb3RoZXJ3aXNlIGNhbGwgdGhlIFR4IGhhbmRsZXIgaWYgZnJhbWUgd2FzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIG92ZXIgZXRoZXJuZXQuCisjZGVmaW5lIEVEUlZfRE1BX1RYX0hBTkRMRVIgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0RNQV9UWF9IQU5ETEVSICAgICAgICAgICAgIFRSVUUKKworLy8gbnVtYmVyIG9mIHVzZWQgZXRoZXJuZXQgY29udHJvbGxlcgorLy8jZGVmaW5lIEVEUlZfVVNFRF9FVEhfQ1RSTCAgICAgICAgICAgICAgMQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEYXRhIExpbmsgTGF5ZXIgKERMTCkgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFZHJ2IHN1cHBvcnRzIGZhc3QgdHggZnJhbWVzCisvLyBhbmQgRExMIHNoYWxsIHBhc3MgUFJlcyBhcyByZWFkeSB0byBFZHJ2IGFmdGVyIFNvQworI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICAgIEZBTFNFCisvLyNkZWZpbmUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAgICBUUlVFCisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZmFzdCB0eCBmcmFtZXMKKy8vIGFuZCBETEwgc2hhbGwgcGFzcyBQUmVzIGFzIHJlYWR5IHRvIEVkcnYgYWZ0ZXIgU29BCisjZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICAgIFRSVUUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT0JEIHNwZWNpZmljIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRXBsIHNob3VsZCBjb21wYXJlIG9iamVjdCByYW5nZQorLy8gYXV0b21hdGljbHkKKyNkZWZpbmUgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgICAgICBUUlVFCisKKy8vIHNldCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIHRoZXJlIGFyZSBzdHJpbmdzIG9yIGRvbWFpbnMgaW4gT0QsIHdoaWNoCisvLyBtYXkgYmUgY2hhbmdlZCBpbiBvYmplY3Qgc2l6ZSBhbmQvb3Igb2JqZWN0IGRhdGEgcG9pbnRlciBieSBpdHMgb2JqZWN0CisvLyBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGVkIGV2ZW50IGtPYmRFdldyU3RyaW5nRG9tYWluKQorLy8jZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIEZBTFNFCisjZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIFRSVUUKKworI2RlZmluZSBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgVFJVRQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaW1lciBtb2R1bGUgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBpZiBUUlVFIGl0IHVzZXMgdGhlIFRpbWVyIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiBvZiBFUEwgdXNlciBhbHNvIGluIEVQTCBrZXJuZWwKKyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9VU0VSICAgICAgICAgICAgICBUUlVFCisKKy8vIGlmIFRSVUUgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUgd2lsbCBiZSB1c2VkCisjZGVmaW5lIEVQTF9USU1FUl9VU0VfSElHSFJFUyAgICAgICAgICAgICAgVFJVRQorLy8jZGVmaW5lIEVQTF9USU1FUl9VU0VfSElHSFJFUyAgICAgICAgICAgICAgRkFMU0UKKworI2VuZGlmIC8vX0VQTENGR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjODEwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGVmLmgKQEAgLTAsMCArMSwzNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBkZWZhdWx0IGNvbnN0YW50cworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERlZi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RFRl9IXworI2RlZmluZSBfRVBMX0RFRl9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfQ19BRFJfQlJPQURDQVNUICAgICAgICAgMHhGRgkvLyBFUEwgYnJvYWRjYXN0IGFkZHJlc3MKKyNkZWZpbmUgRVBMX0NfQURSX0RJQUdfREVGX05PREVfSUQgIDB4RkQJLy8gRVBMIGRlZmF1bHQgYWRkcmVzcyBvZiBkaWdub3N0aWMgZGV2aWNlCisjZGVmaW5lIEVQTF9DX0FEUl9EVU1NWV9OT0RFX0lEICAgICAweEZDCS8vIEVQTCBkdW1teSBub2RlIGFkZHJlc3MKKyNkZWZpbmUgRVBMX0NfQURSX0lOVkFMSUQgICAgICAgICAgIDB4MDAJLy8gaW52YWxpZCBFUEwgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQgICAgMHhGMAkvLyBFUEwgZGVmYXVsdCBhZGRyZXNzIG9mIE1OCisjZGVmaW5lIEVQTF9DX0FEUl9SVDFfREVGX05PREVfSUQgICAweEZFCS8vIEVQTCBkZWZhdWx0IGFkZHJlc3Mgb2Ygcm91dGVyIHR5cGUgMQorI2RlZmluZSBFUExfQ19ETExfQVNORF9QUklPX05NVFJRU1QgNwkvLyBpbmNyZWFzZWQgQVNuZCByZXF1ZXN0IHByaW9yaXR5IHRvIGJlIHVzZWQgYnkgTk1UIFJlcXVlc3RzCisjZGVmaW5lIEVQTF9DX0RMTF9BU05EX1BSSU9fU1REICAgICAwCS8vIHN0YW5kYXJkIEFTbmQgcmVxdWVzdCBwcmlvcml0eQorI2RlZmluZSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCAgICAgMHg4OEFCCisjZGVmaW5lIEVQTF9DX0RMTF9JU09DSFJfTUFYX1BBWUwgICAxNDkwCS8vIEJ5dGU6IG1heGltdW0gc2l6ZSBvZiBQUmVxIGFuZCBQUmVzIHBheWxvYWQgZGF0YSwgcmVxdWlyZXMgQ19JUF9NQVhfTVRVCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfQVNZTkNfTVRVICAgICAxNTAwCS8vIEJ5dGU6IG1heGltdW0gYXN5bmNocm9ub3VzIHBheWxvYWQgaW4gYnl0ZXMKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9QQVlMX09GRlNFVCAgIDE0OTkJLy8gQnl0ZTogbWF4aW11bSBvZmZzZXQgb2YgRXRoZXJuZXQgZnJhbWUgcGF5bG9hZCwgcmVxdWlyZXMgQ19JUF9NQVhfTVRVCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfUlMgICAgICAgICAgICA3CisjZGVmaW5lIEVQTF9DX0RMTF9NSU5fQVNZTkNfTVRVICAgICAyODIJLy8gQnl0ZTogbWluaW11bSBhc3luY2hyb25vdXMgcGF5bG9hZCBpbiBieXRlcy4KKyNkZWZpbmUgRVBMX0NfRExMX01JTl9QQVlMX09GRlNFVCAgIDQ1CS8vIEJ5dGU6IG1pbmltdW0gb2Zmc2V0IG9mIEV0aGVybmV0IGZyYW1lIHBheWxvYWQKKyNkZWZpbmUgRVBMX0NfRExMX01VTFRJQ0FTVF9BU05EICAgIDB4MDExMTFFMDAwMDA0TEwJLy8gRVBMIEFTbmQgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMgICAgMHgwMTExMUUwMDAwMDJMTAkvLyBFUEwgUFJlcyBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09BICAgICAweDAxMTExRTAwMDAwM0xMCS8vIEVQTCBTb0EgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX1NPQyAgICAgMHgwMTExMUUwMDAwMDFMTAkvLyBFUEwgU29jIG11bHRpY2FzdCBNQUMgYWRkcmVzcywgY2Fub25pY2FsIGZvcm0KKyNkZWZpbmUgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgMTAJLy8gbnVtYmVyIG9mIHVuYXNzaWduaW5nIFNvQSBmcmFtZXMgYXQgc3RhcnQgb2YgTk1UX01TX1BSRV9PUEVSQVRJT05BTF8xCisjZGVmaW5lIEVQTF9DX0RMTF9UX0JJVFRJTUUgICAgICAgICAxMAkvLyBuczogVHJhbnNtaXNzaW9uIHRpbWUgcGVyIGJpdCBvbiAxMDAgTWJpdC9zIG5ldHdvcmsKKyNkZWZpbmUgRVBMX0NfRExMX1RfRVBMX1BET19IRUFERVIgIDEwCS8vIEJ5dGU6IHNpemUgb2YgUFJlcSBhbmQgUFJlcyBFUEwgUERPIG1lc3NhZ2UgaGVhZGVyCisjZGVmaW5lIEVQTF9DX0RMTF9UX0VUSDJfV1JBUFBFUiAgICAxOAkvLyBCeXRlOiBzaXplIG9mIEV0aGVybmV0IHR5cGUgSUkgd3JhcHBlciBjb25zaXN0aW5nIG9mIGhlYWRlciBhbmQgY2hlY2tzdW0KKyNkZWZpbmUgRVBMX0NfRExMX1RfSUZHICAgICAgICAgICAgIDY0MAkvLyBuczogRXRoZXJuZXQgSW50ZXJmcmFtZSBHYXAKKyNkZWZpbmUgRVBMX0NfRExMX1RfTUlOX0ZSQU1FICAgICAgIDUxMjAJLy8gbnM6IFNpemUgb2YgbWluaW11bSBFdGhlcm5ldCBmcmFtZSAod2l0aG91dCBwcmVhbWJsZSkKKyNkZWZpbmUgRVBMX0NfRExMX1RfUFJFQU1CTEUgICAgICAgIDk2MAkvLyBuczogU2l6ZSBvZiBFdGhlcm5ldCBmcmFtZSBwcmVhbWJsZQorCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1NPQyAgICAgICAzNgkvLyBtaW5pbXVtIHNpemUgb2YgU29DIHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1BSRVEgICAgICA2MAkvLyBtaW5pbXVtIHNpemUgb2YgUFJlYyB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9QUkVTICAgICAgNjAJLy8gbWluaW11bSBzaXplIG9mIFBSZXMgd2l0aG91dCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfU09BICAgICAgIDI0CS8vIG1pbmltdW0gc2l6ZSBvZiBTb0Egd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfSURFTlRSRVMgIDE3NgkvLyBtaW5pbXVtIHNpemUgb2YgSWRlbnRSZXNwb25zZSB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVMgNzIJLy8gbWluaW11bSBzaXplIG9mIFN0YXR1c1Jlc3BvbnNlIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX05NVENNRCAgICAyMAkvLyBtaW5pbXVtIHNpemUgb2YgTm10Q29tbWFuZCB3aXRob3V0IENvbW1hbmREYXRhLCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUIDUyCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRDb21tYW5kIHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX05NVFJFUSAgICAyMAkvLyBtaW5pbXVtIHNpemUgb2YgTm10UmVxdWVzdCB3aXRob3V0IENvbW1hbmREYXRhLCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UUkVRRVhUIDUyCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRSZXF1ZXN0IHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisKKyNkZWZpbmUgRVBMX0NfRVJSX01PTklUT1JfREVMQVkgICAgIDEwCS8vIEVycm9yIG1vbml0b3Jpbmcgc3RhcnQgZGVsYXkgKG5vdCB1c2VkIGluIERTIDEuMC4wKQorI2RlZmluZSBFUExfQ19JUF9BRFJfSU5WQUxJRCAgICAgICAgMHgwMDAwMDAwMEwJLy8gaW52YWxpZCBJUCBhZGRyZXNzICgwLjAuMC4wKSB1c2VkIHRvIGluZGljYXRlIG5vIGNoYW5nZQorI2RlZmluZSBFUExfQ19JUF9JTlZBTElEX01UVSAgICAgICAgMAkvLyBCeXRlOiBpbnZhbGlkIE1UVSBzaXplIHVzZWQgdG8gaW5kaWNhdGUgbm8gY2hhbmdlCisjZGVmaW5lIEVQTF9DX0lQX01BWF9NVFUgICAgICAgICAgICAxNTE4CS8vIEJ5dGU6IG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgSVAgc3RhY2sgd2hpY2ggbXVzdCBiZSBwcm9jZXNzZWQuCisjZGVmaW5lIEVQTF9DX0lQX01JTl9NVFUgICAgICAgICAgICAzMDAJLy8gQnl0ZTogbWluaW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBJUCBzdGFjayB3aGljaCBtdXN0IGJlIHByb2Nlc3NlZC4KKyNkZWZpbmUgRVBMX0NfTk1UX1NUQVRFX1RPTEVSQU5DRSAgIDUJLy8gQ3ljbGVzOiBtYXhpbXVtIHJlYWN0aW9uIHRpbWUgdG8gTk1UIHN0YXRlIGNvbW1hbmRzCisjZGVmaW5lIEVQTF9DX05NVF9TVEFUUkVRX0NZQ0xFICAgICA1CS8vIHNlYzogU3RhdHVzUmVxdWVzdCBjeWNsZSB0aW1lIHRvIGJlIGFwcGxpZWQgdG8gQXN5bmNPbmx5IENOcworI2RlZmluZSBFUExfQ19TRE9fRVBMX1BPUlQgICAgICAgICAgMzgxOQorCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEUyAgNQkvLyBzZWUgdEVwbERsbEFzbmRTZXJ2aWNlSWQgaW4gRXBsRGxsLmgKKworLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgRVBMX0RfUERPX0dyYW51bGFyaXR5X1U4CisjZGVmaW5lIEVQTF9EX1BET19HcmFudWxhcml0eV9VOCAgICA4CS8vIG1pbmltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG1hcHBlZCBpbiBiaXRzIFVOU0lHTkVEOCBPIE8gMSAxCisjZW5kaWYKKworI2lmbmRlZiBFUExfTk1UX01BWF9OT0RFX0lECisjZGVmaW5lIEVQTF9OTVRfTUFYX05PREVfSUQgICAgICAgICAyNTQJLy8gbWF4aW11bSBub2RlLUlECisjZW5kaWYKKworI2lmbmRlZiBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTgKKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICAgIDIzOQkvLyBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgcmVndWxhciBDTnMgaW4gdGhlIE5vZGUgSUQgcmFuZ2UgMSAuLiAyMzkgVU5TSUdORUQ4IE8gTyAyMzkgMjM5CisjZW5kaWYKKworLy8gZGVmaW5lcyBmb3IgRVBMIEFQSSBsYXllciBzdGF0aWMgcHJvY2VzcyBpbWFnZQorI2lmbmRlZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTgorI2RlZmluZSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAgIDAKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVAorI2RlZmluZSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgIDAKKyNlbmRpZgorCisvLyBjb25maWd1cmUgd2hldGhlciBPRCBhY2Nlc3MgZXZlbnRzIHNoYWxsIGJlIGZvcndhcmRlZAorLy8gdG8gdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKy8vIEJlY2F1c2Ugb2YgcmVlbnRyYW5jeSBmb3IgbG9jYWwgT0QgYWNjZXNzZXMsIHRoaXMgaGFzIHRvIGJlIGRpc2FibGVkCisvLyB3aGVuIGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gb3RoZXIgYWRkcmVzcyBzcGFjZSBhcyB0aGUgc3RhY2sgKGUuZy4gaWYKKy8vIEVwbEFwaUxpbnV4VXNlci5jIGFuZCBFcGxBcGlMaW51eEtlcm5lbC5jIGFyZSB1c2VkKQorI2lmbmRlZiBFUExfQVBJX09CRF9GT1JXQVJEX0VWRU5UCisjZGVmaW5lIEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQgICAgICAgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9NQVhfU1RSSU5HX1NJWkUKKyNkZWZpbmUgRVBMX09CRF9NQVhfU1RSSU5HX1NJWkUgICAgICAgIDMyCS8vIGlzIHVzZWQgZm9yIG9iamVjdHMgMHgxMDA4LzB4MTAwOS8weDEwMEEKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUKKyNkZWZpbmUgRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAgICAgICBGQUxTRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UKKyNkZWZpbmUgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTQorI2RlZmluZSBFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIKKyNkZWZpbmUgRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCICAgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9VU0VfS0VSTkVMCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkKKyNkZWZpbmUgRVBMX09CRF9VU0VfS0VSTkVMICAgICAgICAgICAgICAgICAgVFJVRQorI2Vsc2UKKyNkZWZpbmUgRVBMX09CRF9VU0VfS0VSTkVMICAgICAgICAgICAgICAgICAgRkFMU0UKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQKKyNkZWZpbmUgRVBMX09CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgRkFMU0UKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9WRVRIX05BTUUKKyNkZWZpbmUgRVBMX1ZFVEhfTkFNRSAgICAgICAiZXBsIgkvLyBuYW1lIG9mIG5ldCBkZXZpY2UgaW4gTGludXgKKyNlbmRpZgorCisvKgorI2RlZmluZSBFUExfRF9DRkdfQ29uZmlnTWFuYWdlcl9CT09MIC8vIEFiaWxpdHkgb2YgYSBNTiBub2RlIHRvIHBlcmZvcm0gQ29uZmlndXJhdGlvbiBNYW5hZ2VyIGZ1bmN0aW9ucyBCT09MRUFOIE8gLSBOIC0KKyNkZWZpbmUgRVBMX0RfQ0ZNX1ZlcmlmeUNvbmZfQk9PTCAgIC8vIFN1cHBvcnQgb2Ygb2JqZWN0cyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMsIENGTV9FeHBDb25mRGF0ZUxpc3RfQVUzMiwgQ0ZNX0V4cENvbmZUaW1lTGlzdF9BVTMyIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9DRk1fVmVyaWZ5Q29uZklkX0JPT0wgLy8gU3VwcG9ydCBvZiBvYmplY3RzIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mSWRfVTMyIGFuZCBDRk1fRXhwQ29uZklkTGlzdF9BVTMyIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9ETExfQ05GZWF0dXJlSXNvY2hyX0JPT0wgLy8gQ06ScyBhYmlsaXR5IHRvIHBlcmZvcm0gaXNvY2hyb25vdXMgZnVuY3Rpb25zIEJPT0xFQU4gLSBPIC0gWQorI2RlZmluZSBFUExfRF9ETExfQ05GZWF0dXJlTXVsdGlwbGV4X0JPT0wgLy8gbm9kZZJzIGFiaWxpdHkgdG8gcGVyZm9ybSBjb250cm9sIG9mIG11bHRpcGxleGVkIGlzb2Nocm9ub3VzIGNvbW11bmljYXRpb24gQk9PTEVBTiAtIE8gLSBOCisjZGVmaW5lIEVQTF9EX0RMTF9GZWF0dXJlQ05fQk9PTCAvLyBub2RlknMgYWJpbGl0eSB0byBwZXJmb3JtIENOIGZ1bmN0aW9ucyBCT09MRUFOIE8gTyBZIFkKKyNkZWZpbmUgRVBMX0RfRExMX0ZlYXR1cmVNTl9CT09MIC8vIG5vZGWScyBhYmlsaXR5IHRvIHBlcmZvcm0gTU4gZnVuY3Rpb25zIEJPT0xFQU4gTSBPIC0gTgorI2RlZmluZSBFUExfRF9ETExfTU5GZWF0dXJlTXVsdGlwbGV4X0JPT0wgLy8gTU6ScyBhYmlsaXR5IHRvIHBlcmZvcm0gY29udHJvbCBvZiBtdWx0aXBsZXhlZCBpc29jaHJvbm91cyBjb21tdW5pY2F0aW9uIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9ETExfTU5GZWF0dXJlUFJlc1R4X0JPT0wgLy8gTU6ScyBhYmlsaXR5IHRvIHRyYW5zbWl0IFBSZXMgQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX05NVF9BU25kUnhNYXhQYXlsb2FkX1UxNiAvLyBzaXplIG9mIEFTbmQgZnJhbWUgcmVjZWl2ZSBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9BU25kVHhNYXhQYXlsb2FkX1UxNiAvLyBzaXplIG9mIEFTbmQgZnJhbWUgdHJhbnNtaXQgYnVmZmVyIFVOU0lHTkVEMTYgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05BU25kMlNvQ19VMzIgLy8gbWluaW11bSBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgQVNuZCBhbmQgc3RhcnQgb2YgcmVjZXB0aW9uIG9mIFNvQyBVTlNJR05FRDMyIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0NOQVNuZE1heExhdGVuY3lfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFNvQSByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIEFTbmQgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05QUmVzTWF4TGF0ZW5jeV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgUFJlcSByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIFBSZXMgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05Tb0MyUFJlcV9VMzIgLy8gQ04gU29DIGhhbmRsaW5nIG1heGltdW0gdGltZSwgYSBzdWJzZXF1ZW50IFBSZXEgd29uknQgYmUgaGFuZGxlZCBiZWZvcmUgU29DIGhhbmRsaW5nIHdhcyBmaW5pc2hlZCBVTlNJR05FRDMyIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0RldmljZVR5cGVfVTMyIC8vIERldmljZSBUeXBlIElEIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfRVBMVmVyc19VOCBFUEwgLy8gVmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUgZGV2aWNlIFVOU0lHTkVEOCBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9FeHRTdGF0ZUNtZF9CT09MIC8vIGFiaXRpbHR5IHRvIHN1cHBvcnQgRXh0ZW5kZWQgTk1UIFN0YXRlIENvbW1hbmRzIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9OTVRfSW5mb1N2Y19CT09MIC8vIGFiaWxpdHkgdG8gc3VwcG9ydCBOTVQgSW5mbyBTZXJ2aWNlcyBCT09MRUFOIE8gLSBZIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZUFkZHJfWGhfT1NUUiAvLyBQaHlzaWNhbCBBZGRyZXNzIG9mIEludGVyZmFjZSBOby4gWGggT0NURVRfU1RSSU5HIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZURlc2NyX1hoX1ZTVFIgLy8gRGVzY3JpcHRpb24gdGV4dCBvZiBJbnRlcmZhY2UgTm8uIFhoIFZJU0lCTEVfU1RSSU5HTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlTXR1X1hoX1UzMiAvLyBNVFUgb2YgSW50ZXJmYWNlIE5vLiBYaCBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZVR5cGVfWGhfVTggLy8gVHlwZSBvZiBJbnRlcmZhY2UgTm8uIFhoIFVOU0lHTkVEOCBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgaXNvY2hyb25vdXMgZnJhbWUgcmVjZWl2ZSBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9Jc29jaHJUeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgaXNvY2hyb25vdXMgZnJhbWUgdHJhbnNtaXQgYnVmZmVyIFVOU0lHTkVEMTYgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTWFudWZhY3REZXZOYW1lX1ZTIC8vIE1hbnVmYWN0dXJlciBEZXZpY2UgTmFtZSBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdEh3VmVyc19WUyAvLyBNYW51ZmFjdHVyZXIgSFcgdmVyc2lvbiBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdFN3VmVyc19WUyAvLyBNYW51ZmFjdHVyZXIgU1cgdmVyc2lvbiBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYXhDTk5vZGVJRF9VOCAvLyBtYXhpbXVtIE5vZGUgSUQgYXZhaWxhYmxlIGZvciByZWd1bGFyIENOcyB0aGUgZW50cnkgcHJvdmlkZXMgYW4gdXBwZXIgbGltaXQgdG8gdGhlIE5vZGVJRCBhdmFpbGFibGUgZm9yIGNyb3NzIHRyYWZmaWMgUERPIHJlY2VwdGlvbiBmcm9tIGEgcmVndWxhciBDTiBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTnVtYmVyX1U4IC8vIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCByZWd1bGFyIENOcyBpbiB0aGUgTm9kZSBJRCByYW5nZSAxIC4uIDIzOSBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNkZWZpbmUgRVBMX0RfTk1UX01heEhlYXJ0YmVhdHNfVTggLy8gbnVtYmVyIG9mIGd1YXJkIGNoYW5uZWxzIFVOU0lHTkVEOCBPIE8gMjU0IDI1NAorI2RlZmluZSBFUExfRF9OTVRfTU5BU25kMlNvQ19VMzIgLy8gbWluaW11bSBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgQVNuZCBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQyBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OTXVsdGlwbEN5Y01heF9VOCAvLyBtYXhpbXVtIG51bWJlciBvZiBFUEwgY3ljbGVzIHBlciBtdWx0aXBsZXhlZCBjeWNsZSBVTlNJR05FRDggTyAtIDAgLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzMlBSZXFfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFBSZXMgcmVjZXB0aW9uIGFuZCBzdGFydCBvZiBQUmVxIHRyYW5zbWlzc2lvbiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OUFJlczJQUmVzX1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgUFJlcyBmcm9tIENObiBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFBSZXMgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXNSeDJTb0FfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBQUmVzIGZyb20gQ05uIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGJ5IE1OIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzVHgyU29BX1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiBQUmVzIHRyYW5zbWlzc2lvbiBieSBNTiBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQSBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OU29BMkFTbmRUeF9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQSBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIEFTbmQgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlNvQzJQUmVxX1UzMiAvLyBNTiBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIFNvQyB0cmFuc21pc3Npb24gYW5kIHN0YXJ0IG9mIFBSZXEgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTk1UU3ZjVmlhVURQSVBfQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIE5NVCBzZXJ2aWNlcyB2aWEgVURQL0lQIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9OTVRfTm9kZUlEQnlIV19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHN1cHBvcnQgTm9kZUlEIHNldHVwIGJ5IEhXIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9OTVRfTm9kZUlEQnlTV19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHN1cHBvcnQgTm9kZUlEIHNldHVwIGJ5IFNXIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9OTVRfUHJvZHVjdENvZGVfVTMyIC8vIElkZW50aXR5IE9iamVjdCBQcm9kdWN0IENvZGUgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9SZXZpc2lvbk5vX1UzMiAvLyBJZGVudGl0eSBPYmplY3QgUmV2aXNpb24gTnVtYmVyIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfU2VyaWFsTm9fVTMyIC8vIElkZW50aXR5IE9iamVjdCBTZXJpYWwgTnVtYmVyIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfU2ltcGxlQm9vdF9CT09MIC8vIEFiaWxpdHkgb2YgYSBNTiBub2RlIHRvIHBlcmZvcm0gU2ltcGxlIEJvb3QgUHJvY2VzcywgaWYgbm90IHNldCBJbmRpdnVhbCBCb290IFByb2Nlc3Mgc2hhbGwgYmUgcHJvdmljZWQgQk9PTEVBTiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9WZW5kb3JJRF9VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFZlbmRvciBJRCBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTldMX0ZvcndhcmRfQk9PTCAvLyBBYmlsaXR5IG9mIG5vZGUgdG8gZm9yd2FyZCBkYXRhZ3JhbXMgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX05XTF9JUFN1cHBvcnRfQk9PTCAvLyBBYmlsaXR5IG9mIHRoZSBub2RlIGN1bW11bmljYXRlIHZpYSBJUCBCT09MRUFOIC0gLSBZIFkKKyNkZWZpbmUgRVBMX0RfUERPX0R5bmFtaWNNYXBwaW5nX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gcGVyZm9ybSBkeW5hbWljIFBETyBtYXBwaW5nIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9QRE9fTWF4RGVzY3JNZW1fVTMyIC8vIG1heGltdW0gY3VtdWxhdGl2ZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgVFBETyBhbmQgUlBETyBkZXNjcmliaW5nIG9iamVjdHMgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9DaGFubmVsc19VOCAvLyBudW1iZXIgb2Ygc3VwcG9ydGVkIFJQRE8gY2hhbm5lbHMgVU5TSUdORUQ4IE8gTyAyNTYgMjU2CisjZGVmaW5lIEVQTF9EX1BET19SUERPTWF4TWVtX1UzMiAvLyBNYXhpbXVtIG1lbW9yeSBhdmFpbGFibGUgZm9yIFJQRE8gZGF0YSBwZXIgRVBMIGN5Y2xlIGluIGJ5dGUgVU5TSUdORUQzMiBPIE8gTUFYX1UzMiBNQVhfVTMyCisjZGVmaW5lIEVQTF9EX1BET19SUERPT2JqZWN0c19VOCAvLyBOdW1iZXIgb2Ygc3VwcG9ydGVkIG1hcHBlZCBvYmplY3RzIHBlciBSUERPIGNoYW5uZWwgVU5TSUdORUQ4IE8gTyAyNTQgMjU0CisjZGVmaW5lIEVQTF9EX1BET19UUERPQ2hhbm5lbHNfVTggLy8gbnVtYmVyIG9mIHN1cHBvcnRlZCBUUERPIGNoYW5uZWxzIFVOU0lHTkVEOCBPIC0gMjU2IC0KKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9NYXhNZW1fVTMyIC8vIE1heGltdW0gbWVtb3J5IGF2YWlsYWJsZSBmb3IgVFBETyBkYXRhIHBlciBFUEwgY3ljbGUgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9PYmplY3RzX1U4IC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgbWFwcGVkIG9iamVjdHMgcGVyIFRQRE8gY2hhbm5lbCBVTlNJR05FRDggTyBPIDI1NCAyNTQKKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYUFTbmRfQk9PTCAvLyBBYmlsaXR5IG9mIGEgQ04gdG8gcGVyZm9ybSBTRE8gdHJhbnNmZXIgYnkgRVBMIEFTbmQgQk9PTEVBTiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX1NET19WaWFQRE9fQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBQRE8gQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX1NET19WaWFVRFBJUF9CT09MIC8vIEFiaWxpdHkgb2YgYSBDTiB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBVRFAvSVAgQk9PTEVBTiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX1NZTl9PcHRpbWl6ZWRTeW5jX0JPT0wgLy8gQWJpbGl0eSBvZiBub2RlIHRvIHBlcmZvcm0gb3B0aW1pemVkIHN5bmNocm9uaXNhdGlvbiBCT09MRUFOIE8gTyBOIE4KKyovCisKKy8vIEVtZXJnZW5jeSBlcnJvciBjb2RlcworLy8gPT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfRV9OT19FUlJPUiAgICAgICAgICAgICAgICAgIDB4MDAwMAorLy8gMHhGeHh4IG1hbnVmYWN0dXJlciBzcGVjaWZpYyBlcnJvciBjb2RlcworI2RlZmluZSBFUExfRV9OTVRfTk9fSURFTlRfUkVTICAgICAgICAgIDB4RjAwMQorI2RlZmluZSBFUExfRV9OTVRfTk9fU1RBVFVTX1JFUyAgICAgICAgIDB4RjAwMgorCisvLyAweDgxNnggSFcgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9CQURfUEhZU19NT0RFICAgICAgICAgMHg4MTYxCisjZGVmaW5lIEVQTF9FX0RMTF9DT0xMSVNJT04gICAgICAgICAgICAgMHg4MTYyCisjZGVmaW5lIEVQTF9FX0RMTF9DT0xMSVNJT05fVEggICAgICAgICAgMHg4MTYzCisjZGVmaW5lIEVQTF9FX0RMTF9DUkNfVEggICAgICAgICAgICAgICAgMHg4MTY0CisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX09GX0xJTksgICAgICAgICAgMHg4MTY1CisjZGVmaW5lIEVQTF9FX0RMTF9NQUNfQlVGRkVSICAgICAgICAgICAgMHg4MTY2CisvLyAweDgyeHggUHJvdG9jb2wgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9BRERSRVNTX0NPTkZMSUNUICAgICAgMHg4MjAxCisjZGVmaW5lIEVQTF9FX0RMTF9NVUxUSVBMRV9NTiAgICAgICAgICAgMHg4MjAyCisvLyAweDgyMXggRnJhbWUgc2l6ZSBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfUERPX1NIT1JUX1JYICAgICAgICAgICAgICAweDgyMTAKKyNkZWZpbmUgRVBMX0VfUERPX01BUF9WRVJTICAgICAgICAgICAgICAweDgyMTEKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfTVRVX0RJRiAgICAgICAgICAweDgyMTIKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfTVRVX0xJTSAgICAgICAgICAweDgyMTMKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfVFhfTElNICAgICAgICAgICAweDgyMTQKKy8vIDB4ODIzeCBUaW1pbmcgZXJyb3JzCisjZGVmaW5lIEVQTF9FX05NVF9DWUNMRV9MRU4gICAgICAgICAgICAgMHg4MjMxCisjZGVmaW5lIEVQTF9FX0RMTF9DWUNMRV9FWENFRUQgICAgICAgICAgMHg4MjMyCisjZGVmaW5lIEVQTF9FX0RMTF9DWUNMRV9FWENFRURfVEggICAgICAgMHg4MjMzCisjZGVmaW5lIEVQTF9FX05NVF9JRExFX0xJTSAgICAgICAgICAgICAgMHg4MjM0CisjZGVmaW5lIEVQTF9FX0RMTF9KSVRURVJfVEggICAgICAgICAgICAgMHg4MjM1CisjZGVmaW5lIEVQTF9FX0RMTF9MQVRFX1BSRVNfVEggICAgICAgICAgMHg4MjM2CisjZGVmaW5lIEVQTF9FX05NVF9QUkVRX0NOICAgICAgICAgICAgICAgMHg4MjM3CisjZGVmaW5lIEVQTF9FX05NVF9QUkVRX0xJTSAgICAgICAgICAgICAgMHg4MjM4CisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX0NOICAgICAgICAgICAgICAgMHg4MjM5CisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX1JYX0xJTSAgICAgICAgICAgMHg4MjNBCisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX1RYX0xJTSAgICAgICAgICAgMHg4MjNCCisvLyAweDgyNHggRnJhbWUgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9JTlZBTElEX0ZPUk1BVCAgICAgICAgMHg4MjQxCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1BSRVFfVEggICAgICAgICAgMHg4MjQyCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1BSRVNfVEggICAgICAgICAgMHg4MjQzCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1NPQV9USCAgICAgICAgICAgMHg4MjQ0CisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1NPQ19USCAgICAgICAgICAgMHg4MjQ1CisvLyAweDg0eHggQm9vdFVwIEVycm9ycworI2RlZmluZSBFUExfRV9OTVRfQkExICAgICAgICAgICAgICAgICAgIDB4ODQxMAkvLyBvdGhlciBNTiBpbiBNc05vdEFjdGl2ZSBhY3RpdmUKKyNkZWZpbmUgRVBMX0VfTk1UX0JBMV9OT19NTl9TVVBQT1JUICAgICAweDg0MTEJLy8gTU4gaXMgbm90IHN1cHBvcnRlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMSAgICAgICAgICAgICAgICAgIDB4ODQyMAkvLyBtYW5kYXRvcnkgQ04gd2FzIG5vdCBmb3VuZCBvciBmYWlsZWQgaW4gQm9vdFN0ZXAxCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX0dFVF9JREVOVCAgICAgICAgMHg4NDIxCS8vIElkZW50UmVzIHdhcyBub3QgcmVjZWl2ZWQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfREVWSUNFX1RZUEUgICAgICAweDg0MjIJLy8gd3JvbmcgZGV2aWNlIHR5cGUKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfVkVORE9SX0lEICAgICAgICAweDg0MjMJLy8gd3JvbmcgdmVuZG9yIElECisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX1BST0RVQ1RfQ09ERSAgICAgMHg4NDI0CS8vIHdyb25nIHByb2R1Y3QgY29kZQorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9SRVZJU0lPTl9OTyAgICAgIDB4ODQyNQkvLyB3cm9uZyByZXZpc2lvbiBudW1iZXIKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfU0VSSUFMX05PICAgICAgICAweDg0MjYJLy8gd3Jvbmcgc2VyaWFsIG51bWJlcgorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9DRl9WRVJJRlkgICAgICAgIDB4ODQyOAkvLyB2ZXJpZmljYXRpb24gb2YgY29uZmlndXJhdGlvbiBmYWlsZWQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzIgICAgICAgICAgICAgICAgICAweDg0MzAJLy8gbWFuZGF0b3J5IENOIGZhaWxlZCBpbiBCb290U3RlcDIKKyNkZWZpbmUgRVBMX0VfTk1UX0JSTyAgICAgICAgICAgICAgICAgICAweDg0NDAJLy8gQ2hlY2tDb21tdW5pY2F0aW9uIGZhaWxlZCBmb3IgbWFuZGF0b3J5IENOCisjZGVmaW5lIEVQTF9FX05NVF9XUk9OR19TVEFURSAgICAgICAgICAgMHg4NDgwCS8vIG1hbmRhdG9yeSBDTiBoYXMgd3JvbmcgTk1UIHN0YXRlCisKKy8vIERlZmluZXMgZm9yIG9iamVjdCAweDFGODAgTk1UX1N0YXJ0VXBfVTMyCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMgICAgICAgICAweDAwMDAwMDAyTAkvLyBCaXQgMQorI2RlZmluZSBFUExfTk1UU1RfTk9fQVVUT1NUQVJUICAgICAgICAgIDB4MDAwMDAwMDRMCS8vIEJpdCAyCisjZGVmaW5lIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgICAgICAgICAgMHgwMDAwMDAwOEwJLy8gQml0IDMKKyNkZWZpbmUgRVBMX05NVFNUX1JFU0VUQUxMX01BTkRfQ04gICAgICAweDAwMDAwMDEwTAkvLyBCaXQgNAorI2RlZmluZSBFUExfTk1UU1RfU1RPUEFMTF9NQU5EX0NOICAgICAgIDB4MDAwMDAwNDBMCS8vIEJpdCA2CisjZGVmaW5lIEVQTF9OTVRTVF9OT19BVVRPUFJFT1AyICAgICAgICAgMHgwMDAwMDA4MEwJLy8gQml0IDcKKyNkZWZpbmUgRVBMX05NVFNUX05PX0FVVE9SRUFEWVRPT1AgICAgICAweDAwMDAwMTAwTAkvLyBCaXQgOAorI2RlZmluZSBFUExfTk1UU1RfRVhUX0NOSURFTlRDSEVDSyAgICAgIDB4MDAwMDAyMDBMCS8vIEJpdCA5CisjZGVmaW5lIEVQTF9OTVRTVF9TV1ZFUlNJT05DSEVDSyAgICAgICAgMHgwMDAwMDQwMEwJLy8gQml0IDEwCisjZGVmaW5lIEVQTF9OTVRTVF9DT05GQ0hFQ0sgICAgICAgICAgICAgMHgwMDAwMDgwMEwJLy8gQml0IDExCisjZGVmaW5lIEVQTF9OTVRTVF9OT19SRVRVUk5fUFJFT1AxICAgICAgMHgwMDAwMTAwMEwJLy8gQml0IDEyCisjZGVmaW5lIEVQTF9OTVRTVF9CQVNJQ0VUSEVSTkVUICAgICAgICAgMHgwMDAwMjAwMEwJLy8gQml0IDEzCisKKy8vIERlZmluZXMgZm9yIG9iamVjdCAweDFGODEgTk1UX05vZGVBc3NpZ25tZW50X0FVMzIKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTICAgICAgMHgwMDAwMDAwMUwJLy8gQml0IDAKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiAgICAgICAweDAwMDAwMDAyTAkvLyBCaXQgMQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TVEFSVF9DTiAgICAgICAgIDB4MDAwMDAwMDRMCS8vIEJpdCAyCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTiAgICAgMHgwMDAwMDAwOEwJLy8gQml0IDMKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fS0VFUEFMSVZFICAgICAgICAweDAwMDAwMDEwTAkvL2N1cnJlbnRseSBub3QgdXNlZCBpbiBFUEwgVjIgc3RhbmRhcmQKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fU1dWRVJTSU9OQ0hFQ0sgICAweDAwMDAwMDIwTAkvLyBCaXQgNQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TV1VQREFURSAgICAgICAgIDB4MDAwMDAwNDBMCS8vIEJpdCA2CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX0FTWU5DT05MWV9OT0RFICAgMHgwMDAwMDEwMEwJLy8gQml0IDgKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTVVMVElQTEVYRURfQ04gICAweDAwMDAwMjAwTAkvLyBCaXQgOQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9SVDEgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCS8vIEJpdCAxMAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9SVDIgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCS8vIEJpdCAxMQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9NTl9QUkVTICAgICAgICAgIDB4MDAwMDEwMDBMCS8vIEJpdCAxMgorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9WQUxJRCAgICAgICAgICAgIDB4ODAwMDAwMDBMCS8vIEJpdCAzMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfREVGX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY1N2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGwuaApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRExMIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDggZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMX0hfCisjZGVmaW5lIF9FUExfRExMX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSUQKKyNkZWZpbmUgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEIChFUExfQ19ETExfTUFYX0FTTkRfU0VSVklDRV9JRFMgKyAxKQkvLyBsYXN0IGlzIGtFcGxEbGxBc25kU2RvID09IDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsQXNuZE5vdERlZmluZWQgPSAweDAwLAorCWtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSA9IDB4MDEsCisJa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSA9IDB4MDIsCisJa0VwbERsbEFzbmRObXRSZXF1ZXN0ID0gMHgwMywKKwlrRXBsRGxsQXNuZE5tdENvbW1hbmQgPSAweDA0LAorCWtFcGxEbGxBc25kU2RvID0gMHgwNQorfSB0RXBsRGxsQXNuZFNlcnZpY2VJZDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsQXNuZEZpbHRlck5vbmUgPSAweDAwLAorCWtFcGxEbGxBc25kRmlsdGVyTG9jYWwgPSAweDAxLAkvLyByZWNlaXZlIG9ubHkgQVNuZCBmcmFtZXMgd2l0aCBsb2NhbCBvciBicm9hZGNhc3Qgbm9kZSBJRAorCWtFcGxEbGxBc25kRmlsdGVyQW55ID0gMHgwMiwJLy8gcmVjZWl2ZSBhbnkgQVNuZCBmcmFtZQorfSB0RXBsRGxsQXNuZEZpbHRlcjsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsUmVxU2VydmljZU5vID0gMHgwMCwKKwlrRXBsRGxsUmVxU2VydmljZUlkZW50ID0gMHgwMSwKKwlrRXBsRGxsUmVxU2VydmljZVN0YXR1cyA9IDB4MDIsCisJa0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0ID0gMHgwMywKKwlrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkID0gMHhGRiwKKworfSB0RXBsRGxsUmVxU2VydmljZUlkOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc3luY1JlcVByaW9ObXQgPSAweDA3LAkvLyBQUklPX05NVF9SRVFVRVNUCisJa0VwbERsbEFzeW5jUmVxUHJpbzYgPSAweDA2LAorCWtFcGxEbGxBc3luY1JlcVByaW81ID0gMHgwNSwKKwlrRXBsRGxsQXN5bmNSZXFQcmlvNCA9IDB4MDQsCisJa0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMgPSAweDAzLAkvLyBQUklPX0dFTkVSSUNfUkVRVUVTVAorCWtFcGxEbGxBc3luY1JlcVByaW8yID0gMHgwMiwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fQUJPVkVfR0VORVJJQworCWtFcGxEbGxBc3luY1JlcVByaW8xID0gMHgwMSwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fQkVMT1dfR0VORVJJQworCWtFcGxEbGxBc3luY1JlcVByaW8wID0gMHgwMCwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fR0VORVJJQ19SRVFVRVNUCisKK30gdEVwbERsbEFzeW5jUmVxUHJpb3JpdHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aUZyYW1lU2l6ZTsKKwl0RXBsRnJhbWUgKm1fcEZyYW1lOworCXRFcGxOZXRUaW1lIG1fTmV0VGltZTsKKworfSB0RXBsRnJhbWVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJQk9PTCBtX2ZBc3luY09ubHk7CS8vIGRvIG5vdCBuZWVkIHRvIHJlZ2lzdGVyIFBSZXMtRnJhbWUKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gbG9jYWwgbm9kZSBJRAorCisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCURXT1JEIG1fZHdGZWF0dXJlRmxhZ3M7CisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlEV09SRCBtX2R3Q3ljbGVMZW47CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyVHhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4yOiBJc29jaHJSeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdQcmVzTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXFBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI0IGJ5dGVzKQorCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyNCBieXRlcykKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd0FzbmRNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwl1bnNpZ25lZCBpbnQgbV91aU11bHRpcGxDeWNsZUNudDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUFzeW5jTXR1OwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwkvLyAkJCQgMHgxRjk4Ljk6IFByZXNjYWxlcl9VMTYKKwkvLyAkJCQgTXVsdGlwbGV4ZWQgU2xvdAorCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2U7CisKKwkvLyAweDFGOEE6IE5NVF9NTkN5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdXYWl0U29jUHJlcTsKKworCS8vIDB4MUY4QS4yOiBBc3luY1Nsb3RUaW1lb3V0X1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd0FzeW5jU2xvdFRpbWVvdXQ7CisKK30gdEVwbERsbENvbmZpZ1BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJRFdPUkQgbV9kd0RldmljZVR5cGU7CS8vIE5NVF9EZXZpY2VUeXBlX1UzMgorCURXT1JEIG1fZHdWZW5kb3JJZDsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5WZW5kb3JJZF9VMzIKKwlEV09SRCBtX2R3UHJvZHVjdENvZGU7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUHJvZHVjdENvZGVfVTMyCisJRFdPUkQgbV9kd1JldmlzaW9uTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlJldmlzaW9uTm9fVTMyCisJRFdPUkQgbV9kd1NlcmlhbE51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5TZXJpYWxOb19VMzIKKwlRV09SRCBtX3F3VmVuZG9yU3BlY2lmaWNFeHQxOworCURXT1JEIG1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZEYXRlX1UzMgorCURXT1JEIG1fZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZUaW1lX1UzMgorCURXT1JEIG1fZHdBcHBsaWNhdGlvblN3RGF0ZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3RGF0ZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciBkYXRlIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dUaW1lOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dUaW1lX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIHRpbWUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3SXBBZGRyZXNzOworCURXT1JEIG1fZHdTdWJuZXRNYXNrOworCURXT1JEIG1fZHdEZWZhdWx0R2F0ZXdheTsKKwlCWVRFIG1fc0hvc3RuYW1lWzMyXTsKKwlCWVRFIG1fYWJWZW5kb3JTcGVjaWZpY0V4dDJbNDhdOworCit9IHRFcGxEbGxJZGVudFBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJV09SRCBtX3dQcmVxUGF5bG9hZExpbWl0OwkvLyBvYmplY3QgMHgxRjhCOiBOTVRfTU5QUmVxUGF5bG9hZExpbWl0TGlzdF9BVTE2CisJV09SRCBtX3dQcmVzUGF5bG9hZExpbWl0OwkvLyBvYmplY3QgMHgxRjhEOiBOTVRfUFJlc1BheWxvYWRMaW1pdExpc3RfQVUxNgorCURXT1JEIG1fZHdQcmVzVGltZW91dDsJLy8gb2JqZWN0IDB4MUY5MjogTk1UX01OQ05QUmVzVGltZW91dF9BVTMyCisKK30gdEVwbERsbE5vZGVJbmZvOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbENhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDYwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbENhbC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RMTENBTF9IXworI2RlZmluZSBfRVBMX0RMTENBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyojaWZuZGVmIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYICAgICJFcGxTYmxEbGxDYWxSeCIKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfUlgKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9SWCAgMzI3NjcKKyNlbmRpZgorKi8KKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfTk1UCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX05NVCAgICAgIkVwbFNibERsbENhbFR4Tm10IgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQgICAzMjc2NworI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfR0VOCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX0dFTiAgICAgIkVwbFNibERsbENhbFR4R2VuIgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9HRU4KKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9HRU4gICAzMjc2NworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbERsbEFzbmRTZXJ2aWNlSWQgbV9TZXJ2aWNlSWQ7CisJdEVwbERsbEFzbmRGaWx0ZXIgbV9GaWx0ZXI7CisKK30gdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRGxsUmVxU2VydmljZUlkIG1fU2VydmljZTsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwlCWVRFIG1fYlNvYUZsYWcxOworCit9IHRFcGxEbGxDYWxJc3N1ZVJlcXVlc3Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTEtDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMjY0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsay5jCkBAIC0wLDAgKzEsNDA1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBrZXJuZWwgRExMIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMjEgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAiZWRydi5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCIKKyNlbmRpZgorCisvLyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oIgorLy8jZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLIG5lZWRzIEVQTCBtb2R1bGUgTk1USyEiCisjZW5kaWYKKworI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSAmJiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLOiBzZWxlY3Qgb25seSBvbmUgb2YgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSBhbmQgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQy4iCisjZW5kaWYKKworI2lmICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKSBcCisgICAgJiYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSA9PSAwKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IGN1cnJlbnRseSwgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogaXMgbm90IHN1cHBvcnRlZCBpZiBFUExfTU9EVUxFX05NVF9NTiBpcyBlbmFibGVkLiIKKyNlbmRpZgorCisjaWYgKEVEUlZfRkFTVF9UWEZSQU1FUyA9PSBGQUxTRSkgJiYgXAorICAgICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl8qIGlzIGVuYWJsZWQsIGJ1dCBub3QgRURSVl9GQVNUX1RYRlJBTUVTLiIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisjZGVmaW5lIEVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoa0VwbEV2ZW50U2lua0RsbGsgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgaW5kZXhlcyBvZiB0RXBsRGxsSW5zdGFuY2UubV9wVHhGcmFtZUluZm8KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFUyAgIDAJLy8gSWRlbnRSZXNwb25zZSBvbiBDTiAvIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTICAxCS8vIFN0YXR1c1Jlc3BvbnNlIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVEgICAgIDIJLy8gTk1UIFJlcXVlc3QgZnJvbSBGSUZPIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwgICAgIDMJLy8gbm9uLUVQTCBmcmFtZSBmcm9tIEZJRk8gb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVMgICAgICAgNAkvLyBQUmVzIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9TT0MgICAgICAgIDUJLy8gU29DIG9uIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU09BICAgICAgICA2CS8vIFNvQSBvbiBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVEgICAgICAgNwkvLyBQUmVxIG9uIE1OCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfQ09VTlQgICAgICAoNyArIEVQTF9EX05NVF9NYXhDTk51bWJlcl9VOCArIDIpCS8vIG9uIE1OOiA3ICsgTWF4UFJlcSBvZiByZWd1bGFyIENOcyArIDEgRGlhZyArIDEgUm91dGVyCisjZWxzZQorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX0NPVU5UICAgICAgNQkvLyBvbiBDTjogNQorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX0VNUFRZICAgICAgIDAJLy8gYnVmZmVyIGlzIGVtcHR5CisjZGVmaW5lIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HICAgICAxCS8vIGp1c3QgdGhlIGJ1ZmZlciBpcyBiZWluZyBmaWxsZWQKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX01JTiAgICAgICAgIDYwCS8vIG1pbmltdW0gZXRoZXJuZXQgZnJhbWUgbGVuZ3RoCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsR3NJbml0ID0gMHgwMCwJLy8gTU4vQ046IGluaXRpYWxpc2F0aW9uICg8IFByZU9wMikKKwlrRXBsRGxsQ3NXYWl0UHJlcSA9IDB4MDEsCS8vIENOOiB3YWl0IGZvciBQUmVxIGZyYW1lCisJa0VwbERsbENzV2FpdFNvYyA9IDB4MDIsCS8vIENOOiB3YWl0IGZvciBTb0MgZnJhbWUKKwlrRXBsRGxsQ3NXYWl0U29hID0gMHgwMywJLy8gQ046IHdhaXQgZm9yIFNvQSBmcmFtZQorCWtFcGxEbGxNc05vbkN5Y2xpYyA9IDB4MDQsCS8vIE1OOiByZWR1Y2VkIEVQTCBjeWNsZSAoUHJlT3AxKQorCWtFcGxEbGxNc1dhaXRTb2NUcmlnID0gMHgwNSwJLy8gTU46IHdhaXQgZm9yIFNvQyB0cmlnZ2VyIChjeWNsZSB0aW1lcikKKwlrRXBsRGxsTXNXYWl0UHJlcVRyaWcgPSAweDA2LAkvLyBNTjogd2FpdCBmb3IgKGZpcnN0KSBQUmVxIHRyaWdnZXIgKFdhaXRTb0NQUmVxX1UzMikKKwlrRXBsRGxsTXNXYWl0UHJlcyA9IDB4MDcsCS8vIE1OOiB3YWl0IGZvciBQUmVzIGZyYW1lIGZyb20gQ04KKwlrRXBsRGxsTXNXYWl0U29hVHJpZyA9IDB4MDgsCS8vIE1OOiB3YWl0IGZvciBTb0EgdHJpZ2dlciAoUFJlcyB0cmFuc21pdHRlZCkKKwlrRXBsRGxsTXNXYWl0QXNuZFRyaWcgPSAweDA5LAkvLyBNTjogd2FpdCBmb3IgQVNuZCB0cmlnZ2VyIChTb0EgdHJhbnNtaXR0ZWQpCisJa0VwbERsbE1zV2FpdEFzbmQgPSAweDBBLAkvLyBNTjogd2FpdCBmb3IgQVNuZCBmcmFtZSBpZiBTb0EgY29udGFpbmVkIGludml0YXRpb24KKworfSB0RXBsRGxsU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CisJdEVkcnZUeEJ1ZmZlciAqbV9wVHhCdWZmZXI7CS8vIEJ1ZmZlcnMgZm9yIFR4LUZyYW1lcworCXVuc2lnbmVkIGludCBtX3VpTWF4VHhGcmFtZXM7CisJQllURSBtX2JGbGFnMTsJCS8vIEZsYWcgMSB3aXRoIEVOLCBFQyBmb3IgUFJlcywgU3RhdHVzUmVzCisJQllURSBtX2JNbkZsYWcxOwkvLyBGbGFnIDEgd2l0aCBFQSwgRVIgZnJvbSBQUmVxLCBTb0Egb2YgTU4KKwlCWVRFIG1fYkZsYWcyOwkJLy8gRmxhZyAyIHdpdGggUFIgYW5kIFJTIGZvciBQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzCisJdEVwbERsbENvbmZpZ1BhcmFtIG1fRGxsQ29uZmlnUGFyYW07CisJdEVwbERsbElkZW50UGFyYW0gbV9EbGxJZGVudFBhcmFtOworCXRFcGxEbGxTdGF0ZSBtX0RsbFN0YXRlOworCXRFcGxEbGxrQ2JBc3luYyBtX3BmbkNiQXN5bmM7CisJdEVwbERsbEFzbmRGaWx0ZXIgbV9hQXNuZEZpbHRlcltFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxEbGxrTm9kZUluZm8gKm1fcEZpcnN0Tm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyAqbV9wQ3VyTm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyBtX2FOb2RlSW5mb1tFUExfTk1UX01BWF9OT0RFX0lEXTsKKwl0RXBsRGxsUmVxU2VydmljZUlkIG1fTGFzdFJlcVNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgbV91aUxhc3RUYXJnZXROb2RlSWQ7CisjZW5kaWYKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsQ3ljbGU7CS8vIHVzZWQgZm9yIEVQTCBjeWNsZSBtb25pdG9yaW5nIG9uIENOIGFuZCBnZW5lcmF0aW9uIG9uIE1OCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsUmVzcG9uc2U7CS8vIHVzZWQgZm9yIENOIHJlc3BvbnNlIG1vbml0b3JpbmcKKyNlbmRpZgkJCQkvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKyNlbmRpZgorCisJdW5zaWduZWQgaW50IG1fdWlDeWNsZUNvdW50OwkvLyBjeWNsZSBjb3VudGVyIChuZWVkZWQgZm9yIG11bHRpcGxleGVkIGN5Y2xlIHN1cHBvcnQpCisJdW5zaWduZWQgbG9uZyBsb25nIG1fdWxsRnJhbWVUaW1lb3V0OwkvLyBmcmFtZSB0aW1lb3V0IChjeWNsZSBsZW5ndGggKyBsb3NzIG9mIGZyYW1lIHRvbGVyYW5jZSkKKworfSB0RXBsRGxsa0luc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtJbnN0YW5jZSBFcGxEbGxrSW5zdGFuY2VfZzsKKworc3RhdGljIHRFZHJ2VHhCdWZmZXIgYUVwbERsbGtUeEJ1ZmZlcl9sW0VQTF9ETExLX1RYRlJBTUVfQ09VTlRdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudAorc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoYW5nZVN0YXRlKHRFcGxObXRFdmVudCBObXRFdmVudF9wLAorCQkJCSAgICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3ApOworCisvLyBjYWxsZWQgZnJvbSBFZHJ2SW50ZXJydXB0SGFuZGxlcigpCitzdGF0aWMgdm9pZCBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCk7CisKKy8vIGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkKK3N0YXRpYyB2b2lkIEVwbERsbGtDYkZyYW1lVHJhbnNtaXR0ZWQodEVkcnZUeEJ1ZmZlciAqIHBUeEJ1ZmZlcl9wKTsKKworLy8gY2hlY2sgZnJhbWUgYW5kIHNldCBtaXNzaW5nIGluZm9ybWF0aW9uCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hlY2tGcmFtZSh0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpRnJhbWVTaXplX3ApOworCisvLyBjYWxsZWQgYnkgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZSB0byBtb25pdG9yIEVQTCBjeWNsZSBhcyBDTgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYkNuVGltZXIodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKy8vIE1OOiByZXR1cm5zIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCisvLyB0cmFuc21pdCBTb0EKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRTb2EodEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCwKKwkJCQkgICBCT09MIGZFbmFibGVJbnZpdGF0aW9uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kU29jKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kUHJlcSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQodEVwbERsbFJlcVNlcnZpY2VJZAorCQkJCQkgICAgICAgUmVxU2VydmljZUlkX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCk7CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgICAgICAgICAgPSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzIGxpa2UgTUFDIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZEluc3RhbmNlKHRFcGxEbGxrSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVkcnZJbml0UGFyYW0gRWRydkluaXRQYXJhbTsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbGtJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsa0luc3RhbmNlX2cpKTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCVJldCA9IEVwbFRpbWVySGlnaFJlc2tJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGluaXRpYWxpemluZyBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlCisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGlmIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXZhaWxhYmxlCisJLy8gYWxsb2NhdGUgaW5zdGFuY2Ugc3RydWN0dXJlCisJLy8gYWxsb2NhdGUgVFBETyBhbmQgUlBETyB0YWJsZSB3aXRoIGRlZmF1bHQgc2l6ZQorCisJLy8gaW5pdGlhbGl6ZSBhbmQgbGluayBwb2ludGVycyBpbiBpbnN0YW5jZSBzdHJ1Y3R1cmUgdG8gZnJhbWUgdGFibGVzCisJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXIgPSBhRXBsRGxsa1R4QnVmZmVyX2w7CisJRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzID0KKwkgICAgc2l6ZW9mKGFFcGxEbGxrVHhCdWZmZXJfbCkgLyBzaXplb2YodEVkcnZUeEJ1ZmZlcik7CisKKwkvLyBpbml0aWFsaXplIHN0YXRlCisJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gc2V0IHVwIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICB1aUluZGV4KyspIHsKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS5tX3dQcmVzUGF5bG9hZExpbWl0ID0KKwkJICAgIDB4RkZGRjsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRWRydgorCUVQTF9NRU1DUFkoRWRydkluaXRQYXJhbS5tX2FiTXlNYWNBZGRyLCBwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIDYpOworCUVkcnZJbml0UGFyYW0ubV9wZm5SeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkOworCUVkcnZJbml0UGFyYW0ubV9wZm5UeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVRyYW5zbWl0dGVkOworCVJldCA9IEVkcnZJbml0KCZFZHJ2SW5pdFBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIGV0aGVybmV0IGRyaXZlcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNvcHkgbG9jYWwgTUFDIGFkZHJlc3MgZnJvbSBFdGhlcm5ldCBkcml2ZXIgYmFjayB0byBsb2NhbCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwkvLyBiZWNhdXNlIEV0aGVybmV0IGRyaXZlciBtYXkgaGF2ZSByZWFkIGl0IGZyb20gY29udHJvbGxlciBFRVBST00KKwlFUExfTUVNQ1BZKEVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwKKwkJICAgNik7CisJRVBMX01FTUNQWShwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwgNik7CisKKwkvLyBpbml0aWFsaXplIFR4QnVmZmVyIGFycmF5CisJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lczsKKwkgICAgIHVpSW5kZXgrKykgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUluZGV4XS5tX3BiQnVmZmVyID0gTlVMTDsKKwl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCVJldCA9IFZFdGhBZGRJbnN0YW5jZShwSW5pdFBhcmFtX3ApOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0RlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBzdGF0ZQorCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisJUmV0ID0gVkV0aERlbEluc3RhbmNlKCk7CisjZW5kaWYKKworCVJldCA9IEVkcnZTaHV0ZG93bigpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lCisvLworLy8gRGVzY3JpcHRpb246IGNyZWF0ZXMgdGhlIGJ1ZmZlciBmb3IgYSBUeCBmcmFtZSBhbmQgcmVnaXN0ZXJzIGl0IHRvIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwdWlIYW5kbGVfcCAgICAgICAgICAgICA9IE9VVDogaGFuZGxlIHRvIGZyYW1lIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHBwRnJhbWVfcCAgICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIHBvaW50ZXIgb2YgRVBMIGZyYW1lCisvLyAgICAgICAgICAgICAgcHVpRnJhbWVTaXplX3AgICAgICAgICAgPSBJTi9PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBmcmFtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgc2l6ZSBpcyBhbHdheXMgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBzaXplLCBpZiB0aGF0IGlzIG5vdCBwb3NzaWJsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZAorLy8gICAgICAgICAgICAgIE1zZ1R5cGVfcCAgICAgICAgICAgICAgID0gRVBMIG1lc3NhZ2UgdHlwZQorLy8gICAgICAgICAgICAgIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gU2VydmljZSBJRCBpbiBjYXNlIG9mIEFTbmQgZnJhbWUsIG90aGVyd2lzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbERsbEFzbmROb3REZWZpbmVkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDcmVhdGVUeEZyYW1lKHVuc2lnbmVkIGludCAqcHVpSGFuZGxlX3AsCisJCQkJdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQl1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCXRFcGxNc2dUeXBlIE1zZ1R5cGVfcCwKKwkJCQl0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlID0gRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisKKwlpZiAoTXNnVHlwZV9wID09IGtFcGxNc2dUeXBlQXNuZCkgeworCQkvLyBzZWFyY2ggZm9yIGZpeGVkIFR4IGJ1ZmZlcnMKKwkJaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgeworCQkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX0lERU5UUkVTOworCQl9IGVsc2UgaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpIHsKKwkJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVM7CisJCX0gZWxzZSBpZiAoKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kTm10UmVxdWVzdCkKKwkJCSAgIHx8IChTZXJ2aWNlSWRfcCA9PSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfTk1UUkVROworCQl9CisKKwkJaWYgKHVpSGFuZGxlID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfUFJFUTsKKwkJCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCQkgICAgIHVpSGFuZGxlKyssIHBUeEJ1ZmZlcisrKSB7CisJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciA9PSBOVUxMKSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVOb25FcGwpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX05PTkVQTDsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVByZXMpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1BSRVM7CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVTb2MpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1NPQzsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVNvYSkgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfU09BOworCX0gZWxzZSB7CQkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9QUkVROworCQlwVHhCdWZmZXIgPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdOworCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCSAgICAgdWlIYW5kbGUrKywgcFR4QnVmZmVyKyspIHsKKwkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgPT0gTlVMTCkgewkvLyBmcmVlIGVudHJ5IGZvdW5kCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CisJCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gdGVzdCBpZiByZXF1ZXN0ZWQgZW50cnkgaXMgZnJlZQorCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIGVudHJ5IGlzIG5vdCBmcmVlCisJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0dXAgVHggYnVmZmVyCisJcFR4QnVmZmVyLT5tX0VwbE1zZ1R5cGUgPSBNc2dUeXBlX3A7CisJcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJUmV0ID0gRWRydkFsbG9jVHhNc2dCdWZmZXIocFR4QnVmZmVyKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJZ290byBFeGl0OworCX0KKwkvLyBiZWNhdXNlIGJ1ZmZlciBzaXplIG1heSBiZSBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQKKwkvLyBtZW1vcml6ZSByZWFsIGxlbmd0aCBvZiBmcmFtZQorCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJLy8gZmlsbCB3aG9sZSBmcmFtZSB3aXRoIDAKKwlFUExfTUVNU0VUKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciwgMCwgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuKTsKKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAoTXNnVHlwZV9wICE9IGtFcGxNc2dUeXBlTm9uRXBsKSB7CS8vIGZpbGwgb3V0IEZyYW1lIG9ubHkgaWYgaXQgaXMgYW4gRVBMIGZyYW1lCisJCS8vIGV0aGVydHlwZQorCQlBbWlTZXRXb3JkVG9CZSgmcFR4RnJhbWUtPm1fYmVfd0V0aGVyVHlwZSwKKwkJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJCS8vIHNvdXJjZSBub2RlIElECisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgICAgIG1fdWlOb2RlSWQpOworCQkvLyBzb3VyY2UgTUFDIGFkZHJlc3MKKwkJRVBMX01FTUNQWSgmcFR4RnJhbWUtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkgICAmRXBsRGxsa0luc3RhbmNlX2cubV9iZV9hYlNyY01hY1swXSwgNik7CisJCXN3aXRjaCAoTXNnVHlwZV9wKSB7CisJCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJc3dpdGNoIChTZXJ2aWNlSWRfcCkgeworCQkJY2FzZSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2U6CisJCQljYXNlIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2U6CisJCQkJewkvLyBJZGVudFJlc3BvbnNlcyBhbmQgU3RhdHVzUmVzcG9uc2VzIGFyZSBCcm9hZGNhc3QKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JEc3ROb2RlSWQsCisJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkgICAgICAgRVBMX0NfQURSX0JST0FEQ0FTVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIEFTbmQgU2VydmljZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fbGVfYlNlcnZpY2VJZCwKKwkJCQkgICAgICAgU2VydmljZUlkX3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsTXNnVHlwZVNvYzoKKwkJCS8vIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcFR4RnJhbWUtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcyLCAoQllURSkgMCk7CisJCQlicmVhazsKKworCQljYXNlIGtFcGxNc2dUeXBlU29hOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9DX0FEUl9CUk9BRENBU1QpOworCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzEsIChCWVRFKSAwKTsKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIEVQTCBwcm9maWxlIHZlcnNpb24KKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYkVwbFZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVzOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSwgKEJZVEUpIDApOworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIFBETyBzaXplCisJCQkvL0FtaVNldFdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVxOgorCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcS5tX2xlX2JGbGFnMiwgKEJZVEUpIDApOworCQkJLy8gUERPIHNpemUKKwkJCS8vQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUsIDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCS8vIEVQTCBtZXNzYWdlIHR5cGUKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwgKEJZVEUpIE1zZ1R5cGVfcCk7CisJfQorCisJKnBwRnJhbWVfcCA9IHBUeEZyYW1lOworCSpwdWlGcmFtZVNpemVfcCA9IHBUeEJ1ZmZlci0+bV91aU1heEJ1ZmZlckxlbjsKKwkqcHVpSGFuZGxlX3AgPSB1aUhhbmRsZTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIHRoZSBidWZmZXIgZm9yIGEgVHggZnJhbWUgYW5kIGZyZWVzIGl0IGluIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUhhbmRsZV9wICAgICAgICAgICAgICA9IElOOiBoYW5kbGUgdG8gZnJhbWUgYnVmZmVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVUeEZyYW1lKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKworCWlmICh1aUhhbmRsZV9wID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBoYW5kbGUgaXMgbm90IHZhbGlkCisJCVJldCA9IGtFcGxEbGxJbGxlZ2FsSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlX3BdOworCisJLy8gbWFyayBidWZmZXIgYXMgZnJlZSBzbyB0aGF0IGZyYW1lIHdpbGwgbm90IGJlIHNlbmQgaW4gZnV0dXJlIGFueW1vcmUKKwkvLyAkJCQgZC5rLiBXaGF0J3MgdXAgd2l0aCBydW5uaW5nIHRyYW5zbWlzc2lvbnM/CisJcFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fRU1QVFk7CisJcFR4QnVmZmVyLT5tX3BiQnVmZmVyID0gTlVMTDsKKworCS8vIGRlbGV0ZSBUeCBidWZmZXIKKwlSZXQgPSBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHBUeEJ1ZmZlcik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlbGVhc2luZyBUeCBmcmFtZQorCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3MgdGhlIHBhc3NlZCBldmVudAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisJQllURSBhYk11bHRpY2FzdE1hY1s2XTsKKwl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBBc3luY1JlcVByaW9yaXR5OworCXVuc2lnbmVkIGludCB1aUZyYW1lQ291bnQ7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisjZW5kaWYKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa0NyZWF0ZToKKwkJeworCQkJLy8gJCQkIHJlc2V0IGV0aGVybmV0IGRyaXZlcgorCisJCQlObXRTdGF0ZSA9ICooKHRFcGxObXRTdGF0ZSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKworCQkJLy8gaW5pdGlhbGl6ZSBmbGFncyBmb3IgUFJlcyBhbmQgU3RhdHVzUmVzCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMSA9IEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYk1uRmxhZzEgPSAwOworCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJLy8gaW5pdGlhbGl6ZSBsaW5rZWQgbm9kZSBsaXN0CisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvID0gTlVMTDsKKyNlbmRpZgorCisJCQkvLyByZWdpc3RlciBUeEZyYW1lcyBpbiBFZHJ2CisKKwkJCS8vIElkZW50UmVzcG9uc2UKKwkJCXVpRnJhbWVTaXplID0gRVBMX0NfRExMX01JTlNJWkVfSURFTlRSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBFUEwgcHJvZmlsZSB2ZXJzaW9uCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV9iRXBsUHJvZmlsZVZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCS8vIEZlYXR1cmVGbGFncworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RmVhdHVyZUZsYWdzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQltX2R3RmVhdHVyZUZsYWdzKTsKKwkJCS8vIE1UVQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd010dSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fdWlBc3luY010dSk7CisJCQkvLyBQb2xsSW5TaXplCisJCQlBbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV93UG9sbEluU2l6ZSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICAgICBtX3VpUHJlcUFjdFBheWxvYWRMaW1pdCk7CisJCQkvLyBQb2xsT3V0U2l6ZQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd1BvbGxPdXRTaXplLAorCQkJCSAgICAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICAgIG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0KTsKKwkJCS8vIFJlc3BvbnNlVGltZSAvIFByZXNNYXhMYXRlbmN5CisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdSZXNwb25zZVRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCW1fZHdQcmVzTWF4TGF0ZW5jeSk7CisJCQkvLyBEZXZpY2VUeXBlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdEZXZpY2VUeXBlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdEZXZpY2VUeXBlKTsKKwkJCS8vIFZlbmRvcklkCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdWZW5kb3JJZCwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3VmVuZG9ySWQpOworCQkJLy8gUHJvZHVjdENvZGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd1Byb2R1Y3RDb2RlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdQcm9kdWN0Q29kZSk7CisJCQkvLyBSZXZpc2lvbk51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3UmV2aXNpb25OdW1iZXIsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1JldmlzaW9uTnVtYmVyKTsKKwkJCS8vIFNlcmlhbE51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U2VyaWFsTnVtYmVyLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdTZXJpYWxOdW1iZXIpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQxCisJCQlBbWlTZXRRd29yZDY0VG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQkgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJICBtX2xlX3F3VmVuZG9yU3BlY2lmaWNFeHQxLAorCQkJCQkgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3F3VmVuZG9yU3BlY2lmaWNFeHQxKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dEYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td0RhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dEYXRlKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dUaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td1RpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dUaW1lKTsKKwkJCS8vIElQQWRkcmVzcworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3SXBBZGRyZXNzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdJcEFkZHJlc3MpOworCQkJLy8gU3VibmV0TWFzaworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U3VibmV0TWFzaywKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3U3VibmV0TWFzayk7CisJCQkvLyBEZWZhdWx0R2F0ZXdheQorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RGVmYXVsdEdhdGV3YXksCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0RlZmF1bHRHYXRld2F5KTsKKwkJCS8vIEhvc3ROYW1lCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfc0hvc3RuYW1lWzBdLAorCQkJCSAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJICAgbV9zSG9zdG5hbWVbMF0sCisJCQkJICAgc2l6ZW9mKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3NIb3N0bmFtZSkpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQyCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfYWJWZW5kb3JTcGVjaWZpY0V4dDJbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkgICBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzBdLAorCQkJCSAgIHNpemVvZihFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCSAgbV9hYlZlbmRvclNwZWNpZmljRXh0MikpOworCisJCQkvLyBTdGF0dXNSZXNwb25zZQorCQkJdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gUFJlcyAkJCQgbWF5YmUgbW92ZSB0aGlzIHRvIFBETyBtb2R1bGUKKwkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgPT0KKwkJCSAgICAgRkFMU0UpCisJCQkgICAgJiYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPj0gMzYpKSB7CS8vIGl0IGlzIG5vdCBjb25maWd1cmVkIGFzIGFzeW5jLW9ubHkgQ04sCisJCQkJLy8gc28gdGFrZSBwYXJ0IGluIGlzb2Nocm9ub3VzIHBoYXNlIGFuZCByZWdpc3RlciBQUmVzIGZyYW1lCisJCQkJdWlGcmFtZVNpemUgPQorCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdCArIDI0OworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJCSAmdWlGcmFtZVNpemUsCisJCQkJCQkJIGtFcGxNc2dUeXBlUHJlcywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCS8vIGluaXRpYWxseSBlbmNvZGUgVFBETyAtPiBpbmZvcm0gUERPIG1vZHVsZQorCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBUeEZyYW1lOworCQkJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gdWlGcmFtZVNpemU7CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisjZW5kaWYKKwkJCQkvLyByZXNldCBjeWNsZSBjb3VudGVyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCQkJfSBlbHNlIHsJLy8gaXQgaXMgYW4gYXN5bmMtb25seSBDTgorCQkJCS8vIGZvb2wgRXBsRGxsa0NoYW5nZVN0YXRlKCkgdG8gdGhpbmsgdGhhdCBQUmVzIHdhcyBub3QgZXhwZWN0ZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9IDE7CisJCQl9CisKKwkJCS8vIE5NVCByZXF1ZXN0CisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBlbXB0eQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdLm1fdWlUeE1zZ0xlbiA9CisJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCQkvLyBub24tRVBMIGZyYW1lCisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCSBrRXBsTXNnVHlwZU5vbkVwbCwKKwkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXS5tX3VpVHhNc2dMZW4gPQorCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKworCQkJLy8gcmVnaXN0ZXIgbXVsdGljYXN0IE1BQ3MgaW4gZXRoZXJuZXQgZHJpdmVyCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJUmV0ID0gRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIGlzIE1OCisJCQkJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwkJCQkvLyBTb0MKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQzsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBTb0EKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYSwKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisvLyAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPQorCQkJCQkgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CisJCQkJfQorCisJCQkJLy8gY2FsY3VsYXRlIGN5Y2xlIGxlbmd0aAorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ID0gMTAwMExMCisJCQkJICAgICoKKwkJCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fZHdDeWNsZUxlbik7CisJCQl9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVzdHJveToKKwkJeworCQkJLy8gZGVzdHJveSBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisKKwkJCU5tdFN0YXRlID0gKigodEVwbE5tdFN0YXRlICopIHBFdmVudF9wLT5tX3BBcmcpOworCisJCQkvLyBkZWxldGUgVHggZnJhbWVzCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX0lERU5UUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFUyk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9QUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX05NVFJFUSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIHdhcyBNTgorCQkJCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9TT0MpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NPQSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpIHsKKwkJCQkJCXVpSGFuZGxlID0KKwkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJCSAgICBtX3BQcmVxVHhCdWZmZXIgLQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hTm9kZUluZm9bdWlJbmRleF0uCisJCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyID0gTlVMTDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUKKwkJCQkJCSAgICAodWlIYW5kbGUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPSAweEZGRkY7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJCQkvLyBkZXJlZ2lzdGVyIG11bHRpY2FzdCBNQUNzIGluIGV0aGVybmV0IGRyaXZlcgorCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09DKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9QUkVTKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJUmV0ID0gRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisJCQkvLyBkZWxldGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OgorCQl7CisJCQkvLyBmaWxsIFR4QnVmZmVyIG9mIHNwZWNpZmllZCBwcmlvcml0eSB3aXRoIG5ldyBmcmFtZSBpZiBlbXB0eQorCisJCQlwVHhGcmFtZSA9IE5VTEw7CisJCQlBc3luY1JlcVByaW9yaXR5ID0KKwkJCSAgICAqKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKwkJCXN3aXRjaCAoQXN5bmNSZXFQcmlvcml0eSkgeworCQkJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQkJCXsKKwkJCQkJcFR4QnVmZmVyID0KKwkJCQkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdOworCQkJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gTm10UmVxdWVzdCBkb2VzIGV4aXN0CisJCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKHBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID09CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CisJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZmlsbGluZyBpcyBpbiBwcm9jZXNzCisJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgbV91aVR4TXNnTGVuID0KKwkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkc7CisJCQkJCQkJLy8gc2V0IG1heCBidWZmZXIgc2l6ZSBhcyBpbnB1dCBwYXJhbWV0ZXIKKwkJCQkJCQl1aUZyYW1lU2l6ZSA9CisJCQkJCQkJICAgIHBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlNYXhCdWZmZXJMZW47CisJCQkJCQkJLy8gY29weSBmcmFtZSBmcm9tIHNoYXJlZCBsb29wIGJ1ZmZlciB0byBUeCBidWZmZXIKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lCisJCQkJCQkJICAgIChwVHhCdWZmZXItPgorCQkJCQkJCSAgICAgbV9wYkJ1ZmZlciwKKwkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIEFzeW5jUmVxUHJpb3JpdHkpOworCQkJCQkJCWlmIChSZXQgPT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJCQkgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICopCisJCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbERsbGtDaGVja0ZyYW1lCisJCQkJCQkJCSAgICAocFR4RnJhbWUsCisJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUpOworCisJCQkJCQkJCS8vIHNldCBidWZmZXIgdmFsaWQKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgdWlGcmFtZVNpemU7CisJCQkJCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSkgewkvLyBlbXB0eSBUeCBidWZmZXIgaXMgbm90IGEgcmVhbCBwcm9ibGVtCisJCQkJCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJCQl7CisJCQkJCXBUeEJ1ZmZlciA9CisJCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXTsKKwkJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJCWlmIChwVHhCdWZmZXItPm1fdWlUeE1zZ0xlbiA9PQorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgeworCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGZpbGxpbmcgaXMgaW4gcHJvY2VzcworCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA9CisJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HOworCQkJCQkJCS8vIHNldCBtYXggYnVmZmVyIHNpemUgYXMgaW5wdXQgcGFyYW1ldGVyCisJCQkJCQkJdWlGcmFtZVNpemUgPQorCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCSAgICBtX3VpTWF4QnVmZmVyTGVuOworCQkJCQkJCS8vIGNvcHkgZnJhbWUgZnJvbSBzaGFyZWQgbG9vcCBidWZmZXIgdG8gVHggYnVmZmVyCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhGcmFtZQorCQkJCQkJCSAgICAocFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgIG1fcGJCdWZmZXIsCisJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJICAgICBBc3luY1JlcVByaW9yaXR5KTsKKwkJCQkJCQlpZiAoUmV0ID09CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkJICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAqKQorCQkJCQkJCQkgICAgcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxEbGxrQ2hlY2tGcmFtZQorCQkJCQkJCQkgICAgKHBUeEZyYW1lLAorCQkJCQkJCQkgICAgIHVpRnJhbWVTaXplKTsKKworCQkJCQkJCQkvLyBzZXQgYnVmZmVyIHZhbGlkCisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIHVpRnJhbWVTaXplOworCQkJCQkJCX0gZWxzZSBpZiAoUmV0ID09IGtFcGxEbGxBc3luY1R4QnVmZmVyRW1wdHkpIHsJLy8gZW1wdHkgVHggYnVmZmVyIGlzIG5vdCBhIHJlYWwgcHJvYmxlbQorCQkJCQkJCQkvLyBzbyBqdXN0IGlnbm9yZSBpdAorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGVtcHR5CisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHx8IChObXRTdGF0ZSA9PSBrRXBsTm10TXNCYXNpY0V0aGVybmV0KSkgewkvLyBzZW5kIGZyYW1lIGltbWVkaWF0ZWx5CisJCQkJaWYgKHBUeEZyYW1lICE9IE5VTEwpIHsJLy8gZnJhbWUgaXMgcHJlc2VudAorCQkJCQkvLyBwYWRkaW5nIGlzIGRvbmUgYnkgRWRydiBvciBldGhlcm5ldCBjb250cm9sbGVyCisJCQkJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwkJCQl9IGVsc2UgewkvLyBubyBmcmFtZSBtb3ZlZCB0byBUeEJ1ZmZlcgorCQkJCQkvLyBjaGVjayBpZiBUeEJ1ZmZlcnMgY29udGFpbiB1bnNlbnQgZnJhbWVzCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIE5NVCByZXF1ZXN0IFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdKTsKKwkJCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIG5vbi1FUEwgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0pOworCQkJCQl9CisJCQkJCWlmIChSZXQgPT0ga0VwbEludmFsaWRPcGVyYXRpb24pIHsJLy8gaWdub3JlIGVycm9yIGlmIGNhdXNlZCBieSBhbHJlYWR5IGFjdGl2ZSB0cmFuc21pc3Npb24KKwkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQl9CisJCQkJfQorCQkJCS8vIHJlc2V0IFBSZXMgZmxhZyAyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvLyB1cGRhdGUgRmxhZyAyIChQUiwgUlMpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhDb3VudCgmQXN5bmNSZXFQcmlvcml0eSwKKwkJCQkJCQkgICAgICAmdWlGcmFtZUNvdW50KTsKKwkJCQlpZiAoQXN5bmNSZXFQcmlvcml0eSA9PSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaHRlc3QgcHJpb3JpdHkgaXMgZm9yIE5NVCByZXF1ZXN0cworCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBOTVQgcmVxdWVzdCBUeCBidWZmZXIgY29udGFpbnMgYSBmcmFtZQorCQkJCQkJLy8gYWRkIG9uZSBtb3JlIGZyYW1lCisJCQkJCQl1aUZyYW1lQ291bnQrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaGVzdCBwcmlvcml0eSBpcyBmb3IgZ2VuZXJpYyBmcmFtZXMKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPiBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsJLy8gTk1UIHJlcXVlc3QgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCS8vIHVzZSBOTVQgcmVxdWVzdCBGSUZPLCBiZWNhdXNlIG9mIGhpZ2hlciBwcmlvcml0eQorCQkJCQkJdWlGcmFtZUNvdW50ID0gMTsKKwkJCQkJCUFzeW5jUmVxUHJpb3JpdHkgPQorCQkJCQkJICAgIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBub24tRVBMIFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQkvLyB1c2UgTk1UIHJlcXVlc3QgRklGTywgYmVjYXVzZSBvZiBoaWdoZXIgcHJpb3JpdHkKKwkJCQkJCS8vIGFkZCBvbmUgbW9yZSBmcmFtZQorCQkJCQkJdWlGcmFtZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodWlGcmFtZUNvdW50ID4gNykgewkvLyBsaW1pdCBmcmFtZSByZXF1ZXN0IHRvIHNlbmQgY291bnRlciB0byA3CisJCQkJCXVpRnJhbWVDb3VudCA9IDc7CisJCQkJfQorCQkJCWlmICh1aUZyYW1lQ291bnQgPiAwKSB7CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID0KKwkJCQkJICAgIChCWVRFKSAoKChBc3luY1JlcVByaW9yaXR5IDw8CisJCQkJCQkgICAgICBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQpCisJCQkJCQkgICAgICYgRVBMX0ZSQU1FX0ZMQUcyX1BSKQorCQkJCQkJICAgIHwgKHVpRnJhbWVDb3VudCAmCisJCQkJCQkgICAgICAgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGU6CisJCXsKKwkJCS8vIHN0YXJ0IHRoZSByZWR1Y2VkIGN5Y2xlIGJ5IHByb2dyYW1taW5nIHRoZSBjeWNsZSB0aW1lcgorCQkJLy8gaXQgaXMgaXNzdWVkIGJ5IE5NVCBNTiBtb2R1bGUsIHdoZW4gUHJlT3AxIGlzIGVudGVyZWQKKworCQkJLy8gY2xlYXIgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCk7CisKKwkJCS8vIHJlc2V0IGN5Y2xlIGNvdW50ZXIgKGV2ZXJ5dGltZSBhIFNvQSBpcyB0cmlnZ2VyZCBpbiBQcmVPcDEgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQKKwkJCS8vIGFuZCB3aGVuIGl0IHJlYWNoZXMgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgdGhlIFNvQSBtYXkgY29udGFpbiBpbnZpdGF0aW9ucykKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID0gMDsKKworCQkJLy8gcmVtb3ZlIGFueSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQl3aGlsZSAoRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQkJRXBsRGxsa0RlbGV0ZU5vZGUoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEZpcnN0Tm9kZUluZm8tPm1fdWlOb2RlSWQpOworCQkJfQorCisJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8gTm9uQ3ljbGljLAorCQkJLy8gaGVuY2UgRXBsRGxsa0NoYW5nZVN0YXRlKCkgd2lsbCBub3QgaWdub3JlIHRoZSBuZXh0IGNhbGwKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsTXNOb25DeWNsaWM7CisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICBtX2R3QXN5bmNTbG90VGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeToKKwkJeworCQkJLy8gcG9zdCBQUmVzIHRvIHRyYW5zbWl0IEZJRk8KKworCQkJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHsKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFBSZXMgZG9lcyBleGlzdAorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXS4KKwkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCS8vIHVwZGF0ZSBmcmFtZSAoTk1UIHN0YXRlLCBSRCwgUlMsIFBSLCBNUywgRU4gZmxhZ3MpCisJCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCQkvLyBmYWtlIE5NVCBzdGF0ZSBQcmVPcDIsIGJlY2F1c2UgUFJlcyB3aWxsIGJlIHNlbnQgb25seSBpbiBQcmVPcDIgb3IgZ3JlYXRlcgorCQkJCQkJTm10U3RhdGUgPQorCQkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJfQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkJLy8gJCQkIHJlc2V0IG9ubHkgUkQgZmxhZzsgc2V0IG90aGVyIGZsYWdzIGFwcHJvcHJpYXRlbHkKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJCS8vIG1hcmsgUFJlcyBmcmFtZSBhcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2VHhNc2dSZWFkeSgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgICBbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJZGVmYXVsdDoKKwkJeworCQkJQVNTRVJUTVNHKEZBTFNFLAorCQkJCSAgIkVwbERsbGtQcm9jZXNzKCk6IHVuaGFuZGxlZCBldmVudCB0eXBlIVxuIik7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiBjb25maWd1cmUgcGFyYW1ldGVycyBvZiBETEwKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERsbENvbmZpZ1BhcmFtX3AgICAgICAgPSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NvbmZpZyh0RXBsRGxsQ29uZmlnUGFyYW0gKiBwRGxsQ29uZmlnUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisvLyBkLmsuIGNoZWNrIG9mIE5NVCBzdGF0ZSBkaXNhYmxlZCwgYmVjYXVzZSBDeWNsZUxlbiBpcyBwcm9ncmFtbWVkIGF0IHJ1biB0aW1lIGJ5IE1OIHdpdGhvdXQgcmVzZXQgb2YgQ04KKy8qdEVwbE5tdFN0YXRlICAgIE5tdFN0YXRlOworCisgICAgTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworICAgIGlmIChObXRTdGF0ZSA+IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKyAgICB7ICAgLy8gb25seSBhbGxvd2VkIGluIHN0YXRlIERMTF9HU19JTklUCisgICAgICAgIFJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorKi8KKwlFUExfTUVNQ1BZKCZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLCBwRGxsQ29uZmlnUGFyYW1fcCwKKwkJICAgKHBEbGxDb25maWdQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0IDwKKwkJICAgIHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pID8gcERsbENvbmZpZ1BhcmFtX3AtPgorCQkgICAgbV91aVNpemVPZlN0cnVjdCA6IHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pKSk7CisKKwlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuICE9IDApCisJICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZSAhPSAwKSkgewkvLyBtb25pdG9yIEVQTCBjeWNsZSwgY2FsY3VsYXRlIGZyYW1lIHRpbWVvdXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV91bGxGcmFtZVRpbWVvdXQgPSAoMTAwMExMCisJCQkJCQkgICAgICAgKgorCQkJCQkJICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCW1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkJbV9kd0N5Y2xlTGVuKSkKKwkJICAgICsKKwkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCSAgICAgbV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlKTsKKwl9IGVsc2UgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCA9IDBMTDsKKwl9CisKKwlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgIT0gRkFMU0UpIHsJLy8gaXQgaXMgY29uZmlndXJlZCBhcyBhc3luYy1vbmx5IENOCisJCS8vIGRpc2FibGUgbXVsdGlwbGV4ZWQgY3ljbGUsIHRoYXQgbV91aUN5Y2xlQ291bnQgd2lsbCBub3QgYmUgaW5jcmVtZW50ZWQgc3B1cmlvdXNseSBvbiBTb0MKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID0gMDsKKwl9CisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldElkZW50aXR5CisvLworLy8gRGVzY3JpcHRpb246IGNvbmZpZ3VyZSBpZGVudGl0eSBvZiBsb2NhbCBub2RlIGZvciBJZGVudFJlc3BvbnNlCisvLworLy8gUGFyYW1ldGVyczogIHBEbGxJZGVudFBhcmFtX3AgICAgICAgID0gaWRlbnRpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1NldElkZW50aXR5KHRFcGxEbGxJZGVudFBhcmFtICogcERsbElkZW50UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX01FTUNQWSgmRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLCBwRGxsSWRlbnRQYXJhbV9wLAorCQkgICAocERsbElkZW50UGFyYW1fcC0+bV91aVNpemVPZlN0cnVjdCA8CisJCSAgICBzaXplb2YodEVwbERsbElkZW50UGFyYW0pID8gcERsbElkZW50UGFyYW1fcC0+CisJCSAgICBtX3VpU2l6ZU9mU3RydWN0IDogc2l6ZW9mKHRFcGxEbGxJZGVudFBhcmFtKSkpOworCisJLy8gJCQkIGlmIElkZW50UmVzcG9uc2UgZnJhbWUgZXhpc3RzIHVwZGF0ZSBpdAorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtSZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMgPT0gTlVMTCkgewkvLyBubyBoYW5kbGVyIHJlZ2lzdGVyZWQgeWV0CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9IHBmbkRsbGtDYkFzeW5jX3A7CisJfSBlbHNlIHsJCS8vIGhhbmRsZXIgYWxyZWFkeSByZWdpc3RlcmVkCisJCVJldCA9IGtFcGxEbGxDYkFzeW5jUmVnaXN0ZXJlZDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVyZWdBc3luY0hhbmRsZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVyZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9PSBwZm5EbGxrQ2JBc3luY19wKSB7CS8vIHNhbWUgaGFuZGxlciBpcyByZWdpc3RlcmVkCisJCS8vIGRlcmVnaXN0ZXIgaXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jID0gTlVMTDsKKwl9IGVsc2UgewkJLy8gd3JvbmcgaGFuZGxlciBvciBubyBoYW5kbGVyIHJlZ2lzdGVyZWQKKwkJUmV0ID0ga0VwbERsbENiQXN5bmNSZWdpc3RlcmVkOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgQXNuZFNlcnZpY2VJZC4gSXQgcmVnaXN0ZXJzIENfRExMX01VTFRJQ0FTVF9BU05EIGluIGV0aGVybmV0CisvLyAgICAgICAgICAgICAgZHJpdmVyIGlmIGFueSBBc25kU2VydmljZUlkIGlzIG9wZW4uCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2VydmljZUlkX3AgPCB0YWJlbnRyaWVzKEVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXIpKSB7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXJbU2VydmljZUlkX3BdID0gRmlsdGVyX3A7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldEZsYWcxT2ZOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBGbGFnMSAoZm9yIFBSZXEgYW5kIFNvQSkgb2YgdGhlIHNwZWNpZmllZCBub2RlIElELgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBiU29hRmxhZzFfcCAgICAgICAgICAgICA9IGZsYWcxCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCXBOb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc3RvcmUgZmxhZzEgaW4gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBOb2RlSW5mby0+bV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrR2V0Rmlyc3ROb2RlSW5mbygpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgZmlyc3QgaW5mbyBzdHJ1Y3R1cmUgb2YgZmlyc3Qgbm9kZSBpbiBpc29jaHJvbm91cyBwaGFzZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBvbmx5IHVzZWZ1bCBmb3IgRXJyb3JIYW5kbGVyayBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHBwTm9kZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBwb2ludGVyIG9mIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8odEVwbERsbGtOb2RlSW5mbyAqKiBwcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCSpwcE5vZGVJbmZvX3AgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcEludE5vZGVJbmZvOworCXRFcGxEbGxrTm9kZUluZm8gKipwcEludE5vZGVJbmZvOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8ocE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpOworCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSwKKwkJCQkgICAgICBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCwgMCk7CisKKwkvLyBjb3B5IG5vZGUgY29uZmlndXJhdGlvbgorCXBJbnROb2RlSW5mby0+bV9kd1ByZXNUaW1lb3V0ID0gcE5vZGVJbmZvX3AtPm1fZHdQcmVzVGltZW91dDsKKwlwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQgPSBwTm9kZUluZm9fcC0+bV93UHJlc1BheWxvYWRMaW1pdDsKKworCS8vICQkJCBkLmsuOiBhY3R1YWxseSBhZGQgbm9kZSBvbmx5IGlmIE1OLiBPbiBDTiBpdCBpcyBzdWZmaWNpZW50IHRvIHVwZGF0ZSB0aGUgbm9kZSBjb25maWd1cmF0aW9uCisJaWYgKHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB3ZSBzaGFsbCBzZW5kIFBSZXMgb3Vyc2VsZgorCQkvLyBpbnNlcnQgb3VyIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm8gIT0gTlVMTCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQlpZiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCA9PSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCkgewkvLyBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIHRvIGxpc3QKKwkJCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSB7CS8vIGFkZCBvdXIgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisJCQkJcHBJbnROb2RlSW5mbyA9CisJCQkJICAgICYoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm87CisJCQl9CisJCX0KKwkJLy8gc2V0ICJQUmVxIi1UeEJ1ZmZlciB0byBQUmVzLVR4QnVmZmVyCisJCXBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyID0KKwkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCX0gZWxzZSB7CQkvLyBub3JtYWwgQ04gc2hhbGwgYmUgYWRkZWQgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJLy8gaW5zZXJ0IG5vZGUgaW50byBsaXN0IGluIGFzY2VuZGluZyBvcmRlcgorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkIDwKKwkJCSAgIHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkKQorCQkgICAgICAgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgIT0KKwkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgPT0gcE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpKSB7CS8vIG5vZGUgd2FzIGFscmVhZHkgYWRkZWQgdG8gbGlzdAorCQkJLy8gJCQkIGQuay4gbWF5YmUgdGhpcyBzaG91bGQgYmUgYW4gZXJyb3IKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGluaXRpYWxpemUgZWxlbWVudHMgb2YgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBJbnROb2RlSW5mby0+bV9iU29hRmxhZzEgPSAwOworCXBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9IEZBTFNFOworCXBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwlpZiAocEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPT0gTlVMTCkgewkvLyBjcmVhdGUgVHhCdWZmZXIgZW50cnkKKwkJdWlGcmFtZVNpemUgPSBwTm9kZUluZm9fcC0+bV93UHJlcVBheWxvYWRMaW1pdCArIDI0OworCQlSZXQgPQorCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcEZyYW1lLCAmdWlGcmFtZVNpemUsCisJCQkJCSBrRXBsTXNnVHlwZVByZXEsCisJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPQorCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXTsKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iRHN0Tm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCk7CisKKwkJLy8gc2V0IHVwIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCUVQTF9NRU1DUFkocEZyYW1lLT5tX2JlX2FiRHN0TWFjLCBwSW50Tm9kZUluZm8tPm1fYmVfYWJNYWNBZGRyLAorCQkJICAgNik7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQl7CisJCQl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCQkJLy8gaW5pdGlhbGx5IGVuY29kZSBUUERPIC0+IGluZm9ybSBQRE8gbW9kdWxlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHVpRnJhbWVTaXplOworCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCX0KKyNlbmRpZgorCX0KKwlwSW50Tm9kZUluZm8tPm1fdWxEbGxFcnJvckV2ZW50cyA9IDBMOworCS8vIGFkZCBub2RlIHRvIGxpc3QKKwlwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbyA9ICpwcEludE5vZGVJbmZvOworCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtEZWxldGVOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKwl0RXBsRGxsa05vZGVJbmZvICoqcHBJbnROb2RlSW5mbzsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWRfcCk7CisJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCVJldCA9IGtFcGxEbGxOb05vZGVJbmZvOworCQlnb3RvIEV4aXQ7CisJfQorCisJRVBMX0RMTEtfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlLCB1aU5vZGVJZF9wLCAwKTsKKworCS8vIHNlYXJjaCBub2RlIGluIHdob2xlIGxpc3QKKwlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJd2hpbGUgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKQorCSAgICAgICAmJiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgeworCQlwcEludE5vZGVJbmZvID0gJigqcHBJbnROb2RlSW5mbyktPm1fcE5leHROb2RlSW5mbzsKKwl9CisJaWYgKCgqcHBJbnROb2RlSW5mbyA9PSBOVUxMKSB8fCAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgewkvLyBub2RlIHdhcyBub3QgZm91bmQgaW4gbGlzdAorCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlbW92ZSBub2RlIGZyb20gbGlzdAorCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisKKwlpZiAoKHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpCisJICAgICYmIChwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciAhPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsJLy8gZGVsZXRlIFR4QnVmZmVyIGVudHJ5CisJCXVpSGFuZGxlID0KKwkJICAgIHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyIC0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyOworCQlwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciA9IE5VTEw7CisJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKHVpSGFuZGxlKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBub3QgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLyAgICAgICAgICAgICAgSW5zdGVhZCB0aGUgd2lsbCBiZSByZW1vdmVkIGFmdGVyIGVycm9yIChsYXRlL2xvc3MgUFJlcykgd2l0aG91dAorLy8gICAgICAgICAgICAgIGNoYXJnaW5nIHRoZSBlcnJvci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKworCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocEludE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFUExfRExMS19EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlLAorCQkJCSAgICAgIHVpTm9kZUlkX3AsIDApOworCisJcEludE5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID0gVFJVRTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2hhbmdlU3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudCBhbmQgZGlhZ25vc2Ugc29tZSBjb21tdW5pY2F0aW9uIGVycm9ycworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IERMTCBldmVudCAod3JhcHBlZCBpbiBOTVQgZXZlbnQpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hhbmdlU3RhdGUodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3AsCisJCQkJICAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzID0gMDsKKwlEbGxFdmVudC5tX3VpTm9kZUlkID0gMDsKKwlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKworCXN3aXRjaCAoTm10U3RhdGVfcCkgeworCWNhc2Uga0VwbE5tdEdzT2ZmOgorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCS8vIGVudGVyIERMTF9HU19JTklUCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKE5tdEV2ZW50X3AgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2MpIHsJLy8gU29DIHJlY2VpdmVkCisJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFByZXE7CisJCX0gZWxzZSB7CisJCQkvLyBlbnRlciBETExfR1NfSU5JVAorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdENzT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCisJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQljYXNlIGtFcGxEbGxDc1dhaXRQcmVxOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVE7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q4CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09DIGFuZCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BIHwKKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBjaGVjayBpZiBtdWx0aXBsZXhlZCBhbmQgUFJlcSBzaG91bGQgaGF2ZSBiZWVuIHJlY2VpdmVkIGluIHRoaXMgY3ljbGUKKwkJCQkvLyBhbmQgaWYgPj0gTk1UX0NTX1JFQURZX1RPX09QRVJBVEUKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID09IDApCisJCQkJICAgICYmIChObXRTdGF0ZV9wID49IGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlKSkgewkvLyByZXBvcnQgRExMX0NFVl9MT1NTX09GX1BSRVEKKwkJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVE7CisJCQkJfQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbENzV2FpdFNvYzoKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDEKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gc3RhcnQgb2YgY3ljbGUgYW5kIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfUFJFUQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPQorCQkJCSAgICBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIGZhbGwgdGhyb3VnaAorCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCS8vIERMTF9DVDMKKwkJCQlpZiAoTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gaWdub3JlIGZyYW1lIHRpbWVvdXQgaW4gUHJlT3AyLAorCQkJCQkvLyBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgY3ljbGUgbGVuCisJCQkJCS8vIG1heSBiZSB3cm9uZy4KKwkJCQkJLy8gMjAwOC8xMC8xNSBkLmsuIElmIGl0IHdvdWxkIG5vdCBiZSBpZ25vcmVkLAorCQkJCQkvLyB3ZSB3b3VsZCBnbyBjeWNsaWNhbGx5IHRvIFByZU9wMSBhbmQgb24gbmV4dAorCQkJCQkvLyBTb0MgYmFjayB0byBQcmVPcDIuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBmYWxsIHRocm91Z2gKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MgYW5kIERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0EgfAorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDkKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJICAgIGtFcGxEbGxDc1dhaXRQcmVxOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUMTAKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJLy8gZnVsbCBFUEwgY3ljbGUgaXMgYWN0aXZlLCBidXQgd2l0aG91dCBQUmVxL1BSZXMKKworCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0UHJlcToKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDIKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZQorCQkJCS8vIGl0IGlzIE9rIGlmIG5vIFBSZXEgd2FzIHJlY2VpdmVkCisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDcKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlQXNuZDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQlkZWZhdWx0OgorCQkJCS8vIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGtFcGxEbGxDc1dhaXRTb2M6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCQkvLyBETExfQ1QxCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCS8vIHN0YXJ0IG9mIGN5Y2xlIGFuZCBpc29jaHJvbm91cyBwaGFzZQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOQorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKwkJCQkvLyByZW1haW4gaW4gRExMX0NTX1dBSVRfU09BCisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1QxMAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZSBhbmQgd2UgZG8gbm90IGV4cGVjdCBhbnkgUFJlcQorCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJZGVmYXVsdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgIT0ga0VwbERsbE1zTm9uQ3ljbGljKSB7CS8vIHN0b3AgY3ljbGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbE1zTm9uQ3ljbGljOworCisJCQkvLyBzdG9wIGZ1cnRoZXIgcHJvY2Vzc2luZywKKwkJCS8vIGJlY2F1c2UgaXQgd2lsbCBiZSByZXN0YXJ0ZWQgYnkgTk1UIE1OIG1vZHVsZQorCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJewkvLyBiZWNhdXNlIG9mIHJlZHVjZWQgRVBMIGN5Y2xlIFNvQSBzaGFsbCBiZSB0cmlnZ2VyZWQsIG5vdCBTb0MKKwkJCQl0RXBsRGxsU3RhdGUgRHVtbXlEbGxTdGF0ZTsKKworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCS8vIGdvIGFoZWFkIGFuZCBzZW5kIFNvQQorCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgICAmRHVtbXlEbGxTdGF0ZSwKKwkJCQkJCSAgICAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJbV91aUN5Y2xlQ291bnQgPj0KKwkJCQkJCQlFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUykpOworCQkJCS8vIGluY3JlbWVudCBjeWNsZSBjb3VudGVyIHRvIGRldGVjdCBpZiBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyBlbXB0eSBjeWNsZXMgYXJlIGVsYXBzZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCsrOworCisJCQkJLy8gcmVwcm9ncmFtIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCQl7CisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQkJLy8gJCQkIGNoZWNrIG11bHRpcGxleGVkIGN5Y2xlIHJlc3RhcnQKKwkJCQkJLy8gICAgIC0+IHRvZ2dsZSBNQyBmbGFnCisJCQkJCS8vICAgICAtPiBjaGFuZ2Ugbm9kZSBsaW5rZWQgbGlzdAorCQkJCX0gZWxzZSB7CS8vIG5vbi1tdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJLy8gc3RhcnQgd2l0aCBmaXJzdCBub2RlIGluIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0gTlVMTDsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc05vbkN5Y2xpYzoKKwkJCQkJewkvLyBzdGFydCBjb250aW51b3VzIGN5Y2xlIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbEN5Y2xlLAorCQkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91bGxGcmFtZVRpbWVvdXQsCisJCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsCisJCQkJCQkgICAgIFRSVUUpOworI2VuZGlmCisJCQkJCQkvLyBjb250aW51ZSB3aXRoIHNlbmRpbmcgU29DCisJCQkJCX0KKworCQkJCWNhc2Uga0VwbERsbE1zV2FpdEFzbmQ6CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0U29jVHJpZzoKKwkJCQkJewkvLyBpZiBtX0xhc3RSZXFTZXJ2aWNlSWQgaXMgc3RpbGwgdmFsaWQsCisJCQkJCQkvLyBTb0Egd2FzIG5vdCBjb3JyZWN0bHkgYW5zd2VyZWQKKwkJCQkJCS8vIGFuZCB1c2VyIHBhcnQgaGFzIHRvIGJlIGluZm9ybWVkCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCQkJLy8gc2VuZCBTb0MKKwkJCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2MoKTsKKworCQkJCQkJLy8gbmV3IERMTCBzdGF0ZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFByZXFUcmlnOworCisJCQkJCQkvLyBzdGFydCBXYWl0U29DUFJlcSBUaW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkgICAgIG1fZHdXYWl0U29jUHJlcSwKKwkJCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lclJlc3BvbnNlLAorCQkJCQkJICAgICAwTCwgRkFMU0UpOworI2VuZGlmCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUgLyBjeWNsZSB0aW1lIGV4Y2VlZGVkCisJCQkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsTWVQcmVzVGltZW91dDoKKwkJCXsKKworCQkJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQkJCWNhc2Uga0VwbERsbE1zV2FpdFByZXM6CisJCQkJCXsJLy8gUFJlcyBub3QgcmVjZWl2ZWQKKworCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID09IEZBTFNFKSB7CS8vIG5vcm1hbCBpc29jaHJvbm91cyBDTgorCQkJCQkJCURsbEV2ZW50LgorCQkJCQkJCSAgICBtX3VsRGxsRXJyb3JFdmVudHMKKwkJCQkJCQkgICAgfD0KKwkJCQkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ05fTE9TU19QUkVTOworCQkJCQkJCURsbEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9wQ3VyTm9kZUluZm8tPgorCQkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJfSBlbHNlIHsJLy8gQ04gc2hhbGwgYmUgZGVsZXRlZCBzb2Z0bHkKKwkJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbGtTb2Z0RGVsTm9kZTsKKwkJCQkJCQkvLyAkJCQgZC5rLiBzZXQgRXZlbnQubV9OZXRUaW1lIHRvIGN1cnJlbnQgdGltZQorCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkCisJCQkJCQkJCSAgIGludCk7CisJCQkJCQkJRXZlbnQubV9wQXJnID0KKwkJCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3BDdXJOb2RlSW5mby0+CisJCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRXZlbnRrUG9zdAorCQkJCQkJCSAgICAoJkV2ZW50KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gY29udGludWUgd2l0aCBzZW5kaW5nIG5leHQgUFJlcQorCQkJCQl9CisKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRQcmVxVHJpZzoKKwkJCQkJeworCQkJCQkJLy8gc2VuZCBuZXh0IFBSZXEKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFByZXEKKwkJCQkJCSAgICAoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX0RsbFN0YXRlKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJCXsJLy8gd3JvbmcgRExMIHN0YXRlCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJeworCisJCQkJc3dpdGNoIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlKSB7CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0UHJlczoKKwkJCQkJewkvLyBQUmVzIHJlY2VpdmVkCisJCQkJCQkvLyBzZW5kIG5leHQgUFJlcQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrTW5TZW5kUHJlcQorCQkJCQkJICAgIChObXRTdGF0ZV9wLAorCQkJCQkJICAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsU3RhdGUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvYVRyaWc6CisJCQl7CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRTb2FUcmlnOgorCQkJCQl7CS8vIE1OIFBSZXMgc2VudAorCQkJCQkJLy8gc2VuZCBTb0EKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFNvYShObXRTdGF0ZV9wLAorCQkJCQkJCQkgICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgICBtX0RsbFN0YXRlLAorCQkJCQkJCQkgICAgIFRSVUUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQl7CS8vIEFTbmQgaGFzIGJlZW4gcmVjZWl2ZWQsIGJ1dCBpdCBtYXkgYmUgbm90IHRoZSByZXF1ZXN0ZWQgb25lCisvKgorICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgaWYgU29BIHdhcyBjb3JyZWN0bHkgYW5zd2VyZWQKKyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpOworKi8KKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PQorCQkJCSAgICBrRXBsRGxsTXNXYWl0QXNuZCkgeworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzICE9IDApIHsJLy8gZXJyb3IgZXZlbnQgc2V0IC0+IHBvc3QgaXQgdG8gZXJyb3IgaGFuZGxlcgorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtFcnJrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJLy8gJCQkIGQuay4gc2V0IEV2ZW50Lm1fTmV0VGltZSB0byBjdXJyZW50IHRpbWUKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGZyb20gRWRydkludGVycnVwdEhhbmRsZXIoKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVSZWNlaXZlZCh0RWRydlJ4QnVmZmVyICogcFJ4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJdEVwbE5tdEV2ZW50IE5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm9FdmVudDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJdEVwbERsbFJlcVNlcnZpY2VJZCBSZXFTZXJ2aWNlSWQ7CisJdW5zaWduZWQgaW50IHVpQXNuZFNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJQllURSBiRmxhZzE7CisKKwlCRU5DSE1BUktfTU9EXzAyX1NFVCgzKTsKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwUnhCdWZmZXJfcC0+bV9wYkJ1ZmZlcjsKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UICE9IEZBTFNFCisJc3dpdGNoIChwUnhCdWZmZXJfcC0+bV9CdWZmZXJJbkZyYW1lKSB7CisJY2FzZSBrRWRydkJ1ZmZlckZpcnN0SW5GcmFtZToKKwkJeworCQkJTXNnVHlwZSA9CisJCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCSAgIG1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJCWlmIChNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkgeworCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID09IGtFcGxEbGxDc1dhaXRQcmVxKSB7CS8vIFBSZXEgZXhwZWN0ZWQgYW5kIGFjdHVhbGx5IHJlY2VpdmVkCisJCQkJCS8vIGQuay46IFRoZSBjb25kaXRpb24gYWJvdmUgaXMgc3VmZmljZW50LCBiZWNhdXNlIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJCQkJLy8gICAgICAgYW5kIG5vIG5vbi1FUEwgZnJhbWUgc2hhbGwgYmUgcmVjZWl2ZWQgaW4gaXNvY2hyb25vdXMgcGhhc2UuCisJCQkJCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbiBQUmVzCisJCQkJCS8vICQkJCBXaGF0IGlmIFR4IGJ1ZmZlciBpcyBpbnZhbGlkPworCQkJCQlwVHhCdWZmZXIgPQorCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXTsKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCVJldCA9IEVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpIHsJLy8gbWFyayBQRE8gYXMgaW52YWxpZCBpbiBOTVQgc3RhdGUgT3AKKwkJCQkJCS8vICQkJCByZXNldCBvbmx5IFJEIGZsYWc7IHNldCBvdGhlciBmbGFncyBhcHByb3ByaWF0ZWx5CisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9QcmVzLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwgMCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIG1ha2UgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIFByZXMsIFN0YXR1c1JlcworCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworI2VuZGlmCisJCQkJfQorCQkJfQorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTWlkZGxlSW5GcmFtZToKKwkJeworCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwUnhCdWZmZXJfcC0+bV91aVJ4TXNnTGVuOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd05hbm9TZWMgPSBwUnhCdWZmZXJfcC0+bV9OZXRUaW1lLm1fZHdOYW5vU2VjOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd1NlYyA9IHBSeEJ1ZmZlcl9wLT5tX05ldFRpbWUubV9kd1NlYzsKKworCWlmIChBbWlHZXRXb3JkRnJvbUJlKCZwRnJhbWUtPm1fYmVfd0V0aGVyVHlwZSkgIT0gRVBMX0NfRExMX0VUSEVSVFlQRV9FUEwpIHsJLy8gbm9uLUVQTCBmcmFtZQorCQkvL1RSQUNFMigiRXBsRGxsa0NiRnJhbWVSZWNlaXZlZDogcGZuQ2JBc3luYz0weCVwIFNyY01BQz0weCVsbHhcbiIsIEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYywgQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWUtPm1fYmVfYWJTcmNNYWMpKTsKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyAhPSBOVUxMKSB7CS8vIGhhbmRsZXIgZm9yIGFzeW5jIGZyYW1lcyBpcyByZWdpc3RlcmVkCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMoJkZyYW1lSW5mbyk7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCisJTXNnVHlwZSA9ICh0RXBsTXNnVHlwZSkgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJc3dpdGNoIChNc2dUeXBlKSB7CisJY2FzZSBrRXBsTXNnVHlwZVByZXE6CisJCXsKKwkJCS8vIFBSZXEgZnJhbWUKKwkJCS8vIGQuay46ICh3ZSBhc3N1bWUgdGhhdCB0aGlzIFBSZXEgZnJhbWUgaXMgaW50ZW5kZWQgZm9yIHVzIGFuZCBkb24ndCBjaGVjayBEc3ROb2RlSWQpCisJCQlpZiAoQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB0aGlzIFBSZXEgaXMgbm90IGludGVuZGVkIGZvciB1cworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOworCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIGFjdGl2ZSAtPiB3cm9uZyBtc2cgdHlwZQorCQkJCWJyZWFrOworCQkJfQorI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIHJlc3BvbmQgdG8gYW5kIHByb2Nlc3MgUFJlcSBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3AKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJcFR4QnVmZmVyID0KKwkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCUVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQliRmxhZzEgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgICBtX1ByZXEuCisJCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJCS8vIHNhdmUgRUEgZmxhZworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JNbkZsYWcxID0KKwkJCQkJICAgIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2JNbkZsYWcxICYgfkVQTF9GUkFNRV9GTEFHMV9FQSkKKwkJCQkJICAgIHwgKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FQSk7CisJCQkJCS8vIHByZXNlcnZlIE1TIGZsYWcKKwkJCQkJYkZsYWcxICY9IEVQTF9GUkFNRV9GTEFHMV9NUzsKKwkJCQkJLy8gYWRkIEVOIGZsYWcgZnJvbSBFcnJvciBzaWduYWxpbmcgbW9kdWxlCisJCQkJCWJGbGFnMSB8PQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2JGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FTjsKKwkJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CS8vIG1hcmsgUERPIGFzIGludmFsaWQgaW4gTk1UIHN0YXRlIE9wCisJCQkJCQkvLyByZXNldCBvbmx5IFJEIGZsYWcKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkJCSAgICAgICBiRmxhZzEpOworCQkJCQl9IGVsc2UgewkvLyBsZWF2ZSBSRCBmbGFnIHVudG91Y2hlZAorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCQkJICAgICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJCSgmcFR4RnJhbWUtPgorCQkJCQkJCQkgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkJIG1fbGVfYkZsYWcxKSAmCisJCQkJCQkJCUVQTF9GUkFNRV9GTEFHMV9SRCkKKwkJCQkJCQkgICAgICAgfCBiRmxhZzEpOworCQkJCQl9CisJCQkJCS8vICQkJCB1cGRhdGUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogY29kZQorCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpIHsJLy8gaW5mb3JtIFBETyBtb2R1bGUgb25seSBpbiBSZWFkeVRvT3AgYW5kIE9wCisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgeworCQkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgICAgICBtX1ByZXEuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyBjb21wYXJlcyByZWFsIGZyYW1lIHNpemUgYW5kIFBETyBzaXplCisJCQkJCWlmICgodW5zaWduZWQKKwkJCQkJICAgICBpbnQpKEFtaUdldFdvcmRGcm9tTGUoJnBGcmFtZS0+CisJCQkJCQkJCSAgIG1fRGF0YS4KKwkJCQkJCQkJICAgbV9QcmVxLgorCQkJCQkJCQkgICBtX2xlX3dTaXplKSArCisJCQkJCQkgIDI0KQorCQkJCQkgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkgewkvLyBmb3JtYXQgZXJyb3IKKwkJCQkJCXRFcGxFcnJvckhhbmRsZXJrRXZlbnQgRGxsRXZlbnQ7CisKKwkJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCQkgICAgRVBMX0RMTF9FUlJfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlEbGxFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCQkgICAgIG1fbGVfYlNyY05vZGVJZCk7CisJCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbEVycm9yOworCQkJCQkJRXZlbnQubV9OZXRUaW1lID0KKwkJCQkJCSAgICBGcmFtZUluZm8ubV9OZXRUaW1lOworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihEbGxFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBmb3J3YXJkIFBSZXEgZnJhbWUgYXMgUlBETyB0byBQRE8gbW9kdWxlCisJCQkJCVJldCA9IEVwbFBkb2tDYlBkb1JlY2VpdmVkKCZGcmFtZUluZm8pOworCisJCQkJfQorI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFKQorCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKwkJCQkJLy8gaW5mb3JtIFBETyBtb2R1bGUgYWJvdXQgUFJlcyBhZnRlciBQUmVxCisJCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPQorCQkJCQkgICAgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCQkJfQorI2VuZGlmCisjZW5kaWYKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQkJLy8gJCQkIGluZm9ybSBlbWVyZ2VuY3kgcHJvdG9jb2wgaGFuZGxpbmcgKGVycm9yIHNpZ25hbGluZyBtb2R1bGUpIGFib3V0IGZsYWdzCisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgY3ljbGUgY291bnRlcgorCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZVByZXM6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgSGVhcnRiZWF0RXZlbnQ7CisjZW5kaWYKKworCQkJLy8gUFJlcyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVByZXM7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAoTm10U3RhdGUgPD0ga0VwbE5tdENzT3BlcmF0aW9uYWwpKSB7CS8vIHByb2Nlc3MgUFJlcyBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3Agb2YgQ04KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWQpOworCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PSBrRXBsRGxsTXNXYWl0UHJlcykgewkvLyBvciBwcm9jZXNzIFBSZXMgZnJhbWVzIGluIE1zV2FpdFByZXMKKworCQkJCXBJbnROb2RlSW5mbyA9IEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvOworCQkJCWlmICgocEludE5vZGVJbmZvID09IE5VTEwpIHx8IChwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQgIT0gdWlOb2RlSWQpKSB7CS8vIGlnbm9yZSBQUmVzLCBiZWNhdXNlIGl0IGlzIGZyb20gd3JvbmcgQ04KKwkJCQkJLy8gJCQkIG1heWJlIHBvc3QgZXZlbnQgdG8gTm10TW4gbW9kdWxlCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gZm9yd2FyZCBGbGFnMiB0byBhc3luY2hyb25vdXMgc2NoZWR1bGVyCisJCQkJYkZsYWcxID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICBtX1BheWxvYWQubV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgbV9sZV9iRmxhZzIpOworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDYWxBc3luY1NldFBlbmRpbmdSZXF1ZXN0cyh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICAgKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSkgKChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUFIpID4+IEVQTF9GUkFNRV9GTEFHMl9QUl9TSElGVCkpLCAoYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisKKyNlbmRpZgorCQkJfSBlbHNlIHsJLy8gaWdub3JlIFBSZXMsIGJlY2F1c2UgaXQgd2FzIHJlY2VpdmVkIGluIHdyb25nIE5NVCBzdGF0ZQorCQkJCS8vIGJ1dCBleGVjdXRlIEVwbERsbGtDaGFuZ2VTdGF0ZSgpIGFuZCBwb3N0IGV2ZW50IHRvIE5NVCBtb2R1bGUKKwkJCQlicmVhazsKKwkJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCXsJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJICAgICh0RXBsTm10U3RhdGUpIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyk7CisJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSAhPSBIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlKSB7CS8vIE5NVCBzdGF0ZSBvZiBDTiBoYXMgY2hhbmdlZCAtPiBwb3N0IGV2ZW50IHRvIE5tdE1udSBtb2R1bGUKKwkJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9PSBGQUxTRSkgewkvLyBub3JtYWwgaXNvY2hyb25vdXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHVpTm9kZUlkOworCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRNbnU7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZUhlYXJ0YmVhdDsKKwkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCSAgICBzaXplb2YoSGVhcnRiZWF0RXZlbnQpOworCQkJCQkJRXZlbnQubV9wQXJnID0gJkhlYXJ0YmVhdEV2ZW50OworCQkJCQl9IGVsc2UgewkvLyBDTiBzaGFsbCBiZSBkZWxldGVkIHNvZnRseQorCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGU7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPQorCQkJCQkJICAgICZwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQ7CisJCQkJCX0KKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJCS8vIHNhdmUgY3VycmVudCBOTVQgc3RhdGUgb2YgQ04gaW4gaW50ZXJuYWwgbm9kZSBzdHJ1Y3R1cmUKKwkJCQkJcEludE5vZGVJbmZvLT5tX05tdFN0YXRlID0KKwkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50Lm1fTm10U3RhdGU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpKSB7CS8vIGluZm9ybSBQRE8gbW9kdWxlIG9ubHkgaW4gUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIGNvbXBhcmUgcmVhbCBmcmFtZSBzaXplIGFuZCBQRE8gc2l6ZT8KKwkJCQlpZiAoKCh1bnNpZ25lZAorCQkJCSAgICAgIGludCkoQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgIG1fUHJlcy5tX2xlX3dTaXplKSArCisJCQkJCSAgIDI0KQorCQkJCSAgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJICAgIHx8CisJCQkJICAgIChBbWlHZXRXb3JkRnJvbUxlCisJCQkJICAgICAoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKSA+CisJCQkJICAgICBwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQpCisjZW5kaWYKKwkJCQkgICAgKSB7CS8vIGZvcm1hdCBlcnJvcgorCQkJCQl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCSAgICBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVDsKKwkJCQkJRGxsRXZlbnQubV91aU5vZGVJZCA9IHVpTm9kZUlkOworCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpCisJCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNPcGVyYXRpb25hbCkpIHsKKwkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQl9CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvUmVjZWl2ZWQoJkZyYW1lSW5mbyk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2M6CisJCXsKKwkJCS8vIFNvQyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYzsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFCisJCQkvLyBwb3N0IFBSZXMgdG8gdHJhbnNtaXQgRklGTyBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlciwgYnV0IGRvbid0IHN0YXJ0CisJCQkvLyB0cmFuc21pc3Npb24gb3ZlciBidXMKKwkJCXBUeEJ1ZmZlciA9CisJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJICAgIG1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU107CisJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gUFJlcyBkb2VzIGV4aXN0CisJCQkJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSwgUkQsIFJTLCBQUiwgTVMsIEVOIGZsYWdzKQorCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCS8vIGZha2UgTk1UIHN0YXRlIFByZU9wMiwgYmVjYXVzZSBQUmVzIHdpbGwgYmUgc2VudCBvbmx5IGluIFByZU9wMiBvciBncmVhdGVyCisJCQkJCU5tdFN0YXRlID0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCX0KKwkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIpOworCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkvLyAkJCQgcmVzZXQgb25seSBSRCBmbGFnOyBzZXQgb3RoZXIgZmxhZ3MgYXBwcm9wcmlhdGVseQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCX0KKwkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJLy8gbWFyayBQUmVzIGZyYW1lIGFzIHJlYWR5IGZvciB0cmFuc21pc3Npb24KKwkJCQlSZXQgPSBFZHJ2VHhNc2dSZWFkeShwVHhCdWZmZXIpOworCQkJfQorI2VuZGlmCisKKwkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gU29DIGZyYW1lcyBvbmx5IGluIFByZU9wMiwgUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIHRyaWdnZXIgc3luY2hyb25vdXMgdGFzaworCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlU3luYzsKKwkJCQlFdmVudC5tX3VpU2l6ZSA9IDA7CisJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQl9CisJCQl9CisJCQkvLyByZXByb2dyYW0gdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMKKwkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsCisJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYkNuVGltZXIsIDBMLCBGQUxTRSk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2E6CisJCXsKKwkJCS8vIFNvQSBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYTsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFR4RnJhbWUgPSBOVUxMOworCisJCQlpZiAoKE5tdFN0YXRlICYgRVBMX05NVF9TVVBFUlNUQVRFX01BU0spICE9IEVQTF9OTVRfQ1NfRVBMTU9ERSkgewkvLyBkbyBub3QgcmVzcG9uZCwgaWYgTk1UIHN0YXRlIGlzIDwgUHJlT3AxIChpLmUuIG5vdCBFUExfTU9ERSkKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIGNoZWNrIFRhcmdldE5vZGVJZAorCQkJdWlOb2RlSWQgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkgICAgIG1fbGVfYlJlcVNlcnZpY2VUYXJnZXQpOworCQkJaWYgKHVpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyBsb2NhbCBub2RlIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdAorCisJCQkJLy8gY2hlY2sgU2VydmljZUlkCisJCQkJUmVxU2VydmljZUlkID0KKwkJCQkgICAgKHRFcGxEbGxSZXFTZXJ2aWNlSWQpCisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkJICAgICBtX2xlX2JSZXFTZXJ2aWNlSWQpOworCQkJCWlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VTdGF0dXMpIHsJLy8gU3RhdHVzUmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBTdGF0dXNSZXMgZG9lcyBleGlzdAorCisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS4KKwkJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkJLy8gdXBkYXRlIFN0YXR1c1JlcyBmcmFtZSAoTk1UIHN0YXRlLCBFTiwgRUMsIFJTLCBQUiBmbGFncykKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcxKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCQkvLyBzZW5kIFN0YXR1c1JlcworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoOCk7CisKKwkJCQkJCS8vIHVwZGF0ZSBlcnJvciBzaWduYWxpbmcKKwkJCQkJCWJGbGFnMSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkJICAgICBtX0RhdGEuCisJCQkJCQkJCSAgICAgbV9Tb2EuCisJCQkJCQkJCSAgICAgbV9sZV9iRmxhZzEpOworCQkJCQkJaWYgKCgoYkZsYWcxIF4gRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSkgJiBFUExfRlJBTUVfRkxBRzFfRVIpICE9IDApIHsJLy8gZXhjZXB0aW9uIHJlc2V0IGZsYWcgd2FzIGNoYW5nZWQgYnkgTU4KKwkJCQkJCQkvLyBhc3N1bWUgc2FtZSBzdGF0ZSBmb3IgRUMgaW4gbmV4dCBjeWNsZSAoY2xlYXIgYWxsIG90aGVyIGJpdHMpCisJCQkJCQkJaWYgKChiRmxhZzEgJgorCQkJCQkJCSAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKQorCQkJCQkJCSAgICAhPSAwKSB7CisJCQkJCQkJCS8vIHNldCBFQyBhbmQgcmVzZXQgcmVzdAorCQkJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fYkZsYWcxID0KKwkJCQkJCQkJICAgIEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyByZXNldCBjb21wbGV0ZSBmbGFnIDEgKGluY2x1ZGluZyBFQyBhbmQgRU4pCisJCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9iRmxhZzEgPQorCQkJCQkJCQkgICAgMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBzYXZlIGZsYWcgMSBmcm9tIE1OIGZvciBTdGF0dXMgcmVxdWVzdCByZXNwb25zZSBjeWNsZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSA9CisJCQkJCQkgICAgYkZsYWcxOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBJZGVudFJlcyBkb2VzIGV4aXN0CisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJCS8vIHNlbmQgSWRlbnRSZXMKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QpIHsJLy8gTm10UmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJCS8vIGNoZWNrIGlmIGZyYW1lIGlzIG5vdCBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS4KKwkJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkJLyppZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA8IEVQTF9ETExLX0JVRkxFTl9NSU4pCisJCQkJCQkJICAgeyAgIC8vIHBhZCBmcmFtZQorCQkJCQkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fTUlOOworCQkJCQkJCSAgIH0gKi8KKwkJCQkJCQkvLyBtZW1vcml6ZSB0cmFuc21pc3Npb24KKwkJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkJICAgICh0RXBsRnJhbWUgKikgMTsKKwkJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXSk7CisJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoUmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQpIHsJLy8gdW5zcGVjaWZpZWQgaW52aXRlCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLgorCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA+CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCQkvKmlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuIDwgRVBMX0RMTEtfQlVGTEVOX01JTikKKwkJCQkJCQkgICB7ICAgLy8gcGFkIGZyYW1lCisJCQkJCQkJICAgRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA9IEVQTF9ETExLX0JVRkxFTl9NSU47CisJCQkJCQkJICAgfSAqLworCQkJCQkJCS8vIG1lbW9yaXplIHRyYW5zbWlzc2lvbgorCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkgICAgKHRFcGxGcmFtZSAqKSAxOworCQkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObykgewkvLyBubyBhc3luYyBzZXJ2aWNlIHJlcXVlc3RlZCAtPiBkbyBub3RoaW5nCisJCQkJfQorCQkJfQorI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwkJCWlmIChwVHhGcmFtZSA9PSBOVUxMKSB7CS8vIHNpZ25hbCBwcm9jZXNzIGZ1bmN0aW9uIHJlYWRpbmVzcyBvZiBQUmVzIGZyYW1lCisJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrUHJlc1JlYWR5OworCQkJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCX0KKyNlbmRpZgorCisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisvLyAgICAgICAgICAgIFJldCA9IEVwbFBkb2tDYlNvYSgmRnJhbWVJbmZvKTsKKyNlbmRpZgorCisJCQkvLyAkJCQgcHV0IFNyY05vZGVJZCwgTk1UIHN0YXRlIGFuZCBOZXRUaW1lIGFzIEhlYXJ0YmVhdEV2ZW50IGludG8gZXZlbnRxdWV1ZQorCisJCQkvLyAkJCQgaW5mb3JtIGVtZXJnZW5jeSBwcm90b2NvbCBoYW5kbGluZyBhYm91dCBmbGFncworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQl7CisJCQkvLyBBU25kIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlQXNuZDsKKworCQkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCQl1aUFzbmRTZXJ2aWNlSWQgPQorCQkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgbV9Bc25kLgorCQkJCQkJCSAgIG1fbGVfYlNlcnZpY2VJZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPj0ga0VwbERsbE1zTm9uQ3ljbGljKQorCQkJICAgICYmCisJCQkgICAgKCgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09CisJCQkgICAgICBrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlKQorCQkJICAgICB8fCAoKCh0RXBsRGxsQXNuZFNlcnZpY2VJZCkgdWlBc25kU2VydmljZUlkKSA9PSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UpKSkgewkvLyBTdGF0dXNSZXMgb3IgSWRlbnRSZXMgcmVjZWl2ZWQKKwkJCQl1aU5vZGVJZCA9CisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PQorCQkJCSAgICAgKCh0RXBsRGxsUmVxU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpKQorCQkJCSAgICAmJiAodWlOb2RlSWQgPT0gRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpKSB7CS8vIG1hcmsgcmVxdWVzdCBhcyByZXNwb25kZWQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm87CisJCQkJfQorCQkJCWlmICgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgewkvLyBtZW1vcml6ZSBNQUMgYWRkcmVzcyBvZiBDTiBmb3IgUFJlcQorCQkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisKKwkJCQkJcEludE5vZGVJbmZvID0KKwkJCQkJICAgIEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZCk7CisJCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFUExfTUVNQ1BZKHBJbnROb2RlSW5mby0+CisJCQkJCQkJICAgbV9iZV9hYk1hY0FkZHIsCisJCQkJCQkJICAgcEZyYW1lLT4KKwkJCQkJCQkgICBtX2JlX2FiU3JjTWFjLCA2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBmb3J3YXJkIEZsYWcyIHRvIGFzeW5jaHJvbm91cyBzY2hlZHVsZXIKKwkJCQliRmxhZzEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgIG1fUGF5bG9hZC5tX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMik7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVpTm9kZUlkLAorCQkJCQkJCQkgICAgICAoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMl9QUikgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSksIChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUlMpKTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAodWlBc25kU2VydmljZUlkIDwgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEKSB7CS8vIEFTbmQgc2VydmljZSBJRCBpcyB2YWxpZAorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW3VpQXNuZFNlcnZpY2VJZF0gPT0ga0VwbERsbEFzbmRGaWx0ZXJBbnkpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQKKwkJCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkgICAgKCZGcmFtZUluZm8pOworCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9hQXNuZEZpbHRlclt1aUFzbmRTZXJ2aWNlSWRdID09IGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQsIGJ1dCBvbmx5IGxvY2FsIG5vZGUgSUQgb3IgYnJvYWRjYXN0cworCQkJCQkvLyBzaGFsbCBiZSBmb3J3YXJkZWQKKwkJCQkJdWlOb2RlSWQgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkRzdE5vZGVJZCk7CisJCQkJCWlmICgodWlOb2RlSWQgPT0KKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fdWlOb2RlSWQpCisJCQkJCSAgICB8fCAodWlOb2RlSWQgPT0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsJLy8gQVNuZCBmcmFtZSBpcyBpbnRlbmRlZCBmb3IgdXMKKwkJCQkJCS8vIGZvcndhcmQgZnJhbWUgdmlhIGFzeW5jIHJlY2VpdmUgRklGTyB0byB1c2Vyc3BhY2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkJICAgICgmRnJhbWVJbmZvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChObXRFdmVudCAhPSBrRXBsTm10RXZlbnROb0V2ZW50KSB7CS8vIGV2ZW50IGZvciBETEwgYW5kIE5NVCBzdGF0ZSBtYWNoaW5lIGdlbmVyYXRlZAorCQlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoTm10RXZlbnQsIE5tdFN0YXRlKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJaWYgKChObXRFdmVudCAhPSBrRXBsTm10RXZlbnREbGxDZUFzbmQpCisJCSAgICAmJiAoKE5tdFN0YXRlIDw9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkgfHwgKE5tdEV2ZW50ICE9IGtFcGxObXRFdmVudERsbENlUHJlcykpKSB7CS8vIE5NVCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpbnRlcmVzdGVkIGluIEFTbmQgZnJhbWVzIGFuZCBQUmVzIGZyYW1lcyB3aGVuIG5vdCBDc05vdEFjdGl2ZSBvciBDc1ByZU9wMQorCQkJLy8gaW5mb3JtIE5NVCBtb2R1bGUKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChObXRFdmVudCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKwlCRU5DSE1BUktfTU9EXzAyX1JFU0VUKDMpOworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkuCisvLyAgICAgICAgICAgICAgSXQgc2lnbmFscworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCh0RWRydlR4QnVmZmVyICogcFR4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHk7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKQorCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwVHhCdWZmZXJfcCAtIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyKSA9PSBFUExfRExMS19UWEZSQU1FX05NVFJFUSkgewkvLyBmcmFtZSBmcm9tIE5NVCByZXF1ZXN0IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb05tdDsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZQcmlvcml0eTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJfSBlbHNlIGlmICgocFR4QnVmZmVyX3AgLSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcikgPT0gRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpIHsJLy8gZnJhbWUgZnJvbSBnZW5lcmljIHByaW9yaXR5IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworCQlFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKSkgXAorICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmICgocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXEpCisJCSB8fCAocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXMpKSB7CS8vIFBSZXMgcmVzcC4gUFJlcSBmcmFtZSBzZW50CisKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICAgICAgICAgJiYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgPT0gRkFMU0UpKQorCQl7CisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorCQkJRnJhbWVJbmZvLm1fcEZyYW1lID0KKwkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlcl9wLT5tX3BiQnVmZmVyOworCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwVHhCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbjsKKwkJCVJldCA9IEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkKCZGcmFtZUluZm8pOworCQl9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJeworCQkJLy8gaWYgb3duIFByZXMgb24gTU4sIHRyaWdnZXIgU29BCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAocFR4QnVmZmVyX3AgPT0KKwkJCQkmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsTWVTb2FUcmlnLAorCQkJCQkJICAgICAgIE5tdFN0YXRlKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJCWdvdG8gRXhpdDsKKyNlbmRpZgorCX0KKyNlbmRpZgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmIChwVHhCdWZmZXJfcC0+bV9FcGxNc2dUeXBlID09IGtFcGxNc2dUeXBlU29hKSB7CS8vIFNvQSBmcmFtZSBzZW50CisJCXRFcGxObXRFdmVudCBObXRFdmVudCA9IGtFcGxObXRFdmVudERsbE1lU29hU2VudDsKKworCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW52aXRlZAorCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPT0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgeworCQkJdEVwbEZyYW1lICpwVHhGcmFtZTsKKworCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVN0YXR1cykgewkvLyBTdGF0dXNSZXF1ZXN0CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gU3RhdHVzUmVzIGRvZXMgZXhpc3QKKworCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgU3RhdHVzUmVzIGZyYW1lIChOTVQgc3RhdGUsIEVOLCBFQywgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fU3RhdHVzUmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCS8vIHNlbmQgU3RhdHVzUmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDgpOworCisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIElkZW50UmVzIGRvZXMgZXhpc3QKKwkJCQkJcFR4RnJhbWUgPQorCQkJCQkgICAgKHRFcGxGcmFtZSAqKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQkvLyBzZW5kIElkZW50UmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0KSB7CS8vIE5tdFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkgICAgbV91aVR4TXNnTGVuID4KKwkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkvLyBjaGVjayBpZiB0aGlzIGZyYW1lIGlzIGEgTk1UIGNvbW1hbmQsCisJCQkJCQkvLyB0aGVuIGZvcndhcmQgdGhpcyBmcmFtZSBiYWNrIHRvIE5tdE1udSBtb2R1bGUsCisJCQkJCQkvLyBiZWNhdXNlIGl0IG5lZWRzIHRoZSB0aW1lLCB3aGVuIHRoaXMgZnJhbWUgaXMKKwkJCQkJCS8vIGFjdHVhbGx5IHNlbnQsIHRvIHN0YXJ0IHRoZSB0aW1lciBmb3IgbW9uaXRvcmluZworCQkJCQkJLy8gdGhlIE5NVCBzdGF0ZSBjaGFuZ2UuCisKKwkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCSAgICAodEVwbEZyYW1lICopCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQlpZiAoKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAgKCZwVHhGcmFtZS0+CisJCQkJCQkgICAgICBtX2xlX2JNZXNzYWdlVHlwZSkKKwkJCQkJCSAgICAgPT0gKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCkKKwkJCQkJCSAgICAmJgorCQkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgICgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICBtX2xlX2JTZXJ2aWNlSWQpCisJCQkJCQkgICAgID09IChCWVRFKSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CS8vIHBvc3QgZXZlbnQgZGlyZWN0bHkgdG8gTm10TW51IG1vZHVsZQorCQkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRNbnVObXRDbWRTZW50OworCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0uCisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbjsKKwkJCQkJCQlFdmVudC5tX3BBcmcgPSBwVHhGcmFtZTsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxFdmVudGtQb3N0CisJCQkJCQkJICAgICgmRXZlbnQpOworCisJCQkJCQl9CisJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0pOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkKSB7CS8vIHVuc3BlY2lmaWVkIGludml0ZQorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBub3QgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0uCisJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBBU25kIGZyYW1lIHdhcyBzZW50LCByZW1vdmUgdGhlIHJlcXVlc3QKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObzsKKwkJfQorCQkvLyBmb3J3YXJkIGV2ZW50IHRvIEVycm9ySGFuZGxlciBhbmQgUERPIG1vZHVsZQorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJZWxzZSB7CQkJLy8gZC5rLjogV2h5IHRoYXQgZWxzZT8gb24gQ04gaXQgaXMgZW50ZXJlZCBvbiBJZGVudFJlcyBhbmQgU3RhdHVzUmVzCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzaWduYWwgcHJvY2VzcyBmdW5jdGlvbiByZWFkaW5lc3Mgb2YgUFJlcyBmcmFtZQorCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeTsKKwlFdmVudC5tX3VpU2l6ZSA9IDA7CisJRXZlbnQubV9wQXJnID0gTlVMTDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNlbmRpZgorCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChwVHhCdWZmZXJfcC0+CisJCQkJCQkgICAgbV9FcGxNc2dUeXBlIDw8IDE2KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NoZWNrRnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBmcmFtZSBhbmQgc2V0IG1pc3NpbmcgaW5mb3JtYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBldGhlcm5ldCBmcmFtZQorLy8gICAgICAgICAgICAgIHVpRnJhbWVTaXplX3AgICAgICAgICAgID0gc2l6ZSBvZiBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoZWNrRnJhbWUodEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aUZyYW1lU2l6ZV9wKQoreworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJV09SRCB3RXRoZXJUeXBlOworCisJLy8gY2hlY2sgZnJhbWUKKwlpZiAocEZyYW1lX3AgIT0gTlVMTCkgeworCQkvLyBjaGVjayBTcmNNQUMKKwkJaWYgKEFtaUdldFF3b3JkNDhGcm9tQmUocEZyYW1lX3AtPm1fYmVfYWJTcmNNYWMpID09IDApIHsKKwkJCS8vIHNvdXJjZSBNQUMgYWRkcmVzcworCQkJRVBMX01FTUNQWSgmcEZyYW1lX3AtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWNbMF0sIDYpOworCQl9CisJCS8vIGNoZWNrIGV0aGVydHlwZQorCQl3RXRoZXJUeXBlID0gQW1pR2V0V29yZEZyb21CZSgmcEZyYW1lX3AtPm1fYmVfd0V0aGVyVHlwZSk7CisJCWlmICh3RXRoZXJUeXBlID09IDApIHsKKwkJCS8vIGFzc3VtZSBFUEwgZnJhbWUKKwkJCXdFdGhlclR5cGUgPSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTDsKKwkJCUFtaVNldFdvcmRUb0JlKCZwRnJhbWVfcC0+bV9iZV93RXRoZXJUeXBlLCB3RXRoZXJUeXBlKTsKKwkJfQorCisJCWlmICh3RXRoZXJUeXBlID09IEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMKSB7CisJCQkvLyBzb3VyY2Ugbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JTcmNOb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKTsKKworCQkJLy8gY2hlY2sgbWVzc2FnZSB0eXBlCisJCQlNc2dUeXBlID0KKwkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWVfcC0+bV9sZV9iTWVzc2FnZVR5cGUpOworCQkJaWYgKE1zZ1R5cGUgPT0gMCkgeworCQkJCU1zZ1R5cGUgPSBrRXBsTXNnVHlwZUFzbmQ7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkJICAgICAgIChCWVRFKSBNc2dUeXBlKTsKKwkJCX0KKworCQkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVBc25kKSB7CisJCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcEZyYW1lX3AtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQl9CisKKwkJfQorCX0KKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiQ25UaW1lcigpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBFUEwgY3ljbGUgd2hlbiBpdCBpcyBhIENOLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRBcmdfcCAgICAgICAgICAgICA9IHRpbWVyIGV2ZW50IGFyZ3VtZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsRGxsa0NiQ25UaW1lcih0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJaWYgKHBFdmVudEFyZ19wLT5tX1RpbWVySGRsICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSkgewkvLyB6b21iaWUgY2FsbGJhY2sKKwkJLy8ganVzdCBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQsIE5tdFN0YXRlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMjAwOC8xMC8xNSBkLmsuIHJlcHJvZ3JhbW1pbmcgb2YgdGltZXIgbm90IG5lY2Vzc2FyeSwKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgcHJvZ3JhbW1lZCwgd2hlbiBTb0MgaXMgcmVjZWl2ZWQuCisvKgorICAgIC8vIHJlcHJvZ3JhbSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorICAgIGlmICgoTm10U3RhdGUgPiBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEpCisgICAgICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSkKKyAgICB7CisgICAgICAgIFJldCA9IEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsIEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0LCBFcGxEbGxrQ2JDblRpbWVyLCAwTCwgRkFMU0UpOworICAgIH0KKyNlbmRpZgorKi8KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IHRpbWVyIG1vZHVsZS4gSXQgdHJpZ2dlcnMgdGhlIFNvQyB3aGVuIGl0IGlzIGEgTU4uCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lU29jVHJpZywgTm10U3RhdGUpOworCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCSAgICBtX0RsbFN0YXRlIHwgKGtFcGxObXRFdmVudERsbE1lU29jVHJpZyA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBQUmVzIHRpbWVvdXQuCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsUmVzcG9uc2UpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lUHJlc1RpbWVvdXQsIE5tdFN0YXRlKTsKKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0IDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0dldE5vZGVJbmZvKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBub2RlIGluZm8gc3RydWN0dXJlIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxEbGxrTm9kZUluZm8qICAgICAgID0gcG9pbnRlciB0byBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJLy8gJCQkIGQuay46IHVzZSBoYXNoIGFsZ29yaXRobSB0byByZXRyaWV2ZSB0aGUgYXBwcm9wcmlhdGUgbm9kZSBpbmZvIHN0cnVjdHVyZQorCS8vICAgICAgICAgICBpZiBzaXplIG9mIGFycmF5IGlzIGxlc3MgdGhhbiAyNTQuCisJdWlOb2RlSWRfcC0tOwkJLy8gbm9kZSBJRCBzdGFydHMgYXQgMSBidXQgYXJyYXkgYXQgMAorCWlmICh1aU5vZGVJZF9wID49IHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pKSB7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCXJldHVybiAmRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcF07CisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29hKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICBwRGxsU3RhdGVQcm9wb3NlZF9wICAgICA9IHByb3Bvc2VkIERMTCBzdGF0ZQorLy8gICAgICAgICAgICAgIGZFbmFibGVJbnZpdGF0aW9uX3AgICAgID0gZW5hYmxlIGludml0YXRpb24gZm9yIGFzeW5jaHJvbm91cyBwaGFzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSBkaXNhYmxlZCBmb3IgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgU29BcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wLAorCQkJCSAgIEJPT0wgZkVuYWJsZUludml0YXRpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RXBsRGxsa05vZGVJbmZvICpwTm9kZUluZm87CisKKwkqcERsbFN0YXRlUHJvcG9zZWRfcCA9IGtFcGxEbGxNc05vbkN5Y2xpYzsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQSBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJaWYgKGZFbmFibGVJbnZpdGF0aW9uX3AgIT0gRkFMU0UpIHsJLy8gZmV0Y2ggdGFyZ2V0IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID09IDApIHsJLy8gb3duIHF1ZXVlcyBhcmUgZW1wdHkKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPQorCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZU5vOworCQkJfSBlbHNlIGlmICgoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSkgPT0ga0VwbERsbEFzeW5jUmVxUHJpb05tdCkgewkvLyBmcmFtZXMgaW4gb3duIE5NVCByZXF1ZXN0IHF1ZXVlIGF2YWlsYWJsZQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm10UmVxdWVzdDsKKwkJCX0gZWxzZSB7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VVbnNwZWNpZmllZDsKKwkJCX0KKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCQkgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CS8vIGFzeW5jaHJvbm91cyBwaGFzZSB3aWxsIGJlIGFzc2lnbmVkIHRvIG9uZSBub2RlCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkID09IEVQTF9DX0FEUl9JTlZBTElEKSB7CS8vIGV4Y2hhbmdlIGludmFsaWQgbm9kZSBJRCB3aXRoIGxvY2FsIG5vZGUgSUQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCS8vIGQuay4gRExMIHN0YXRlIFdhaXRBc25kVHJpZyBpcyBub3QgaGVscGZ1bDsKKwkJCQkJLy8gICAgICBzbyBqdXN0IHN0ZXAgb3ZlciB0byBXYWl0U29jVHJpZywKKwkJCQkJLy8gICAgICBiZWNhdXNlIG93biBBU25kIGlzIHNlbnQgYXV0b21hdGljYWxseSBpbiBDYkZyYW1lVHJhbnNtaXR0ZWQoKSBhZnRlciBTb0EuCisJCQkJCS8vKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0QXNuZFRyaWc7CisJCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0gZWxzZSB7CS8vIGFzc2lnbm1lbnQgdG8gQ04KKwkJCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPQorCQkJCQkgICAga0VwbERsbE1zV2FpdEFzbmQ7CisJCQkJfQorCisJCQkJcE5vZGVJbmZvID0KKwkJCQkgICAgRXBsRGxsa0dldE5vZGVJbmZvKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKwkJCQlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gdXBkYXRlIGZyYW1lIChFQSwgRVIgZmxhZ3MpCisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EuCisJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJICAgICAgIHBOb2RlSW5mby0+CisJCQkJCSAgICAgICBtX2JTb2FGbGFnMSAmIChFUExfRlJBTUVfRkxBRzFfRUEKKwkJCQkJCQkgICAgICB8CisJCQkJCQkJICAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKSk7CisJCQl9IGVsc2UgewkvLyBubyBhc3NpZ25tZW50IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCSAgICBFUExfQ19BRFJfSU5WQUxJRDsKKwkJCX0KKworCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwKKwkJCQkgICAgICAgKEJZVEUpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisKKwkJfSBlbHNlIHsJLy8gaW52aXRlIG5vYm9keQorCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLCAoQllURSkgMCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwgKEJZVEUpIDApOworCQl9CisKKwkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUpCisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYk5tdFN0YXR1cywKKwkJCSAgICAgICAoQllURSkgTm10U3RhdGVfcCk7CisKKwkJLy8gc2VuZCBTb0EgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29jKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCXRFcGxFdmVudCBFdmVudDsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQ107CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQyBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJLy8gJCQkIHVwZGF0ZSBOZXRUaW1lCisKKwkJLy8gc2VuZCBTb0MgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gdHJpZ2dlciBzeW5jaHJvbm91cyB0YXNrCisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVN5bmM7CisJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kUHJlcSgpCisvLworLy8gRGVzY3JpcHRpb246IGl0IHVwZGF0ZXMgYW5kIHRyYW5zbWl0cyB0aGUgUFJlcSBmb3IgdGhlIG5leHQgaXNvY2hyb25vdXMgQ04KKy8vICAgICAgICAgICAgICBvciBvd24gUFJlcyBpZiBlbmFibGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRTdGF0ZV9wICAgICAgICAgICAgICA9IGN1cnJlbnQgTk1UIHN0YXRlCisvLyAgICAgICAgICAgICAgcERsbFN0YXRlUHJvcG9zZWRfcCAgICAgPSBwcm9wb3NlZCBETEwgc3RhdGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRQcmVxKHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCSAgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCUJZVEUgYkZsYWcxID0gMDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mbyA9PSBOVUxMKSB7CS8vIHN0YXJ0IHdpdGggZmlyc3QgaXNvY2hyb25vdXMgQ04KKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwl9IGVsc2UgewkJLy8gaXRlcmF0ZSB0byBuZXh0IGlzb2Nocm9ub3VzIENOCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisJfQorCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID09IE5VTEwpIHsJLy8gbGFzdCBpc29jaHJvbm91cyBDTiByZWFjaGVkCisJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwgcERsbFN0YXRlUHJvcG9zZWRfcCwgVFJVRSk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlwVHhCdWZmZXIgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyOworCQliRmxhZzEgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8tPgorCQkgICAgbV9iU29hRmxhZzEgJiBFUExfRlJBTUVfRkxBRzFfRUE7CisJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFByZXM7CisKKwkJLy8gc3RhcnQgUFJlcyBUaW1lcgorCQkvLyAkJCQgZC5rLjogbWF5YmUgbW92ZSB0aGlzIGNhbGwgdG8gQ2JGcmFtZVRyYW5zbWl0dGVkKCksIGJlY2F1c2UgdGhlIHRpbWUgc2hvdWxkIHJ1biBmcm9tIHRoZXJlCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCVJldCA9CisJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcygmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEN1ck5vZGVJbmZvLT4KKwkJCQkJCSAgbV9kd1ByZXNUaW1lb3V0LAorCQkJCQkJICBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UsIDBMLAorCQkJCQkJICBGQUxTRSk7CisjZW5kaWYKKwl9CisKKwlpZiAocFR4QnVmZmVyID09IE5VTEwpIHsJLy8gUFJlcSBkb2VzIG5vdCBleGlzdAorCQlSZXQgPSBrRXBsRGxsVHhCdWZOb3RSZWFkeTsKKwkJZ290byBFeGl0OworCX0KKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAocFR4RnJhbWUgIT0gTlVMTCkgewkvLyBQUmVxIGRvZXMgZXhpc3QKKwkJaWYgKE5tdFN0YXRlX3AgPT0ga0VwbE5tdE1zT3BlcmF0aW9uYWwpIHsJLy8gbGVhdmUgUkQgZmxhZyB1bnRvdWNoZWQKKwkJCWJGbGFnMSB8PQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLgorCQkJCQkgICAgIG1fbGVfYkZsYWcxKSAmIEVQTF9GUkFNRV9GTEFHMV9SRDsKKwkJfQorCisJCWlmIChwVHhCdWZmZXIgPT0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10pIHsJLy8gUFJlcyBvZiBNTiB3aWxsIGJlIHNlbnQKKwkJCS8vIHVwZGF0ZSBOTVQgc3RhdGUKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JObXRTdGF0dXMsCisJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZV9wKTsKKwkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvYVRyaWc7CisJCX0KKwkJLy8gJCQkIGQuay4gc2V0IEVQTF9GUkFNRV9GTEFHMV9NUyBpZiBuZWNlc3NhcnkKKwkJLy8gdXBkYXRlIGZyYW1lIChGbGFnMSkKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCBiRmxhZzEpOworCisJCS8vIGNhbGN1bGF0ZSBmcmFtZSBzaXplIGZyb20gcGF5bG9hZCBzaXplCisJCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUpICsgMjQ7CisKKwkJLy8gc2VuZCBQUmVxIGZyYW1lCisJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsRGxsVHhGcmFtZUludmFsaWQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgZW1wdHkgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcworLy8gICAgICAgICAgICAgIChvbmx5IGtFcGxEbGxBc25kRmlsdGVyQW55KS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZCh0RXBsRGxsUmVxU2VydmljZUlkCisJCQkJCSAgICAgICBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQllURSBhYkJ1ZmZlclsxOF07CisJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIGFiQnVmZmVyOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJLy8gY2hlY2sgaWYgcHJldmlvdXMgU29BIGludml0YXRpb24gd2FzIG5vdCBhbnN3ZXJlZAorCXN3aXRjaCAoUmVxU2VydmljZUlkX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW1JlcVNlcnZpY2VJZF9wXSA9PSBrRXBsRGxsQXNuZEZpbHRlckFueSkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgcmVnaXN0ZXJlZAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJCSAgICAgICAoQllURSkgdWlOb2RlSWRfcCk7CisJCQkvLyBFUEwgTXNnVHlwZSBBU25kCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkgICAgICAgKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCk7CisJCQkvLyBBU25kIFNlcnZpY2UgSUQKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgUmVxU2VydmljZUlkX3ApOworCQkJLy8gY3JlYXRlIGZyYW1lIGluZm8gc3RydWN0dXJlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IDE4OwkvLyBlbXB0eSBub24gZXhpc3RpbmcgQVNuZCBmcmFtZQorCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJUmV0ID0gRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCgmRnJhbWVJbmZvKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvLyBubyBpbnZpdGF0aW9uIGlzc3VlZCBvciBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFuc3dlcmVkIG9yIGl0IGlzIHVuaW50ZXJlc3RpbmcKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGtDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkwODNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMKQEAgLTAsMCArMSwxMjYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisjaWZuZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxEbGxrQ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9ETExLQ0FMX01BWF9RVUVVRVMgIDUJLy8gQ25HZW5SZXEsIENuTm10UmVxLCB7TW5HZW5SZXEsIE1uTm10UmVxfSwgTW5JZGVudFJlcSwgTW5TdGF0dXNSZXEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyAgICB0U2hiSW5zdGFuY2UgICAgbV9TaGJJbnN0YW5jZVJ4OyAgICAgIC8vIEZJRk8gZm9yIFJ4IEFTbmQgZnJhbWVzCisJdFNoYkluc3RhbmNlIG1fU2hiSW5zdGFuY2VUeE5tdDsJLy8gRklGTyBmb3IgVHggZnJhbWVzIHdpdGggTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwl0U2hiSW5zdGFuY2UgbV9TaGJJbnN0YW5jZVR4R2VuOwkvLyBGSUZPIGZvciBUeCBmcmFtZXMgd2l0aCBnZW5lcmljIHByaW9yaXR5CisjZWxzZQorCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplTm10OworCUJZVEUgbV9hYkZyYW1lTm10WzE1MDBdOworCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplR2VuOworCUJZVEUgbV9hYkZyYW1lR2VuWzE1MDBdOworI2VuZGlmCisKKwl0RXBsRGxsa0NhbFN0YXRpc3RpY3MgbV9TdGF0aXN0aWNzOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIElkZW50UmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVJZGVudFJlcVtFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggKyAxXTsJLy8gMSBlbnRyeSBpcyByZXNlcnZlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZ1bGwgYW5kIGVtcHR5CisJdW5zaWduZWQgaW50IG1fdWlXcml0ZUlkZW50UmVxOworCXVuc2lnbmVkIGludCBtX3VpUmVhZElkZW50UmVxOworCisJLy8gU3RhdHVzUmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVTdGF0dXNSZXFbRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICsgMV07CS8vIDEgZW50cnkgaXMgcmVzZXJ2ZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmdWxsIGFuZCBlbXB0eQorCXVuc2lnbmVkIGludCBtX3VpV3JpdGVTdGF0dXNSZXE7CisJdW5zaWduZWQgaW50IG1fdWlSZWFkU3RhdHVzUmVxOworCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVDblJlcXVlc3RzWzI1NCAqIDJdOworCS8vIGZpcnN0IDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgZ2VuZXJpYyByZXF1ZXN0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBub2RlCisJLy8gc2Vjb25kIDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgTk1UIHJlcXVlc3RzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRRdWV1ZUNuUmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRSZXF1ZXN0UXVldWU7CisjZW5kaWYKKworfSB0RXBsRGxsa0NhbEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtDYWxJbnN0YW5jZSBFcGxEbGxrQ2FsSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIERMTCBDQUwgbW9kdWxlCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisKKy8qICAgIFNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIgKEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfUlgsIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYLAorICAgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVJ4LCAmZlNoYk5ld0NyZWF0ZWQpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCisgICAgeworICAgICAgICBSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKyAgICB9CisqLworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQsCisJCQkgICAgICBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9OTVQsCisJCQkgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJICAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYk9wZW5NaXNtYXRjaCwga1NoYk91dE9mTWVtIG9yIGtTaGJJbnZhbGlkQXJnCisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKworLyogICAgU2hiRXJyb3IgPSBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YSAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LCBFcGxEbGxrQ2FsVHhObXRTaWduYWxIYW5kbGVyLCBrU2hiUHJpb3JpdHlOb3JtYWwpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiQWxyZWFkeVNpZ25hbGluZyBvciBrU2hiSW52YWxpZEFyZworCisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyovCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTiwKKwkJCSAgICAgIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX0dFTiwKKwkJCSAgICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sCisJCQkgICAgICAmZlNoYk5ld0NyZWF0ZWQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sIEVwbERsbGtDYWxUeEdlblNpZ25hbEhhbmRsZXIsIGtTaGJQcmlvcml0eU5vcm1hbCk7CisgICAgLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJBbHJlYWR5U2lnbmFsaW5nIG9yIGtTaGJJbnZhbGlkQXJnCisKKyAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgIHsKKyAgICAgICAgUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisgICAgfQorKi8KKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VSeCk7CisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUnggPSBOVUxMOworKi8KKwlTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10KTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQgPSBOVUxMOworCisJU2hiRXJyb3IgPSBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbik7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuID0gTlVMTDsKKworI2Vsc2UKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbFByb2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2VzcyB0aGUgcGFzc2VkIGNvbmZpZ3VyYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgICAgICAgICAgICAgPSBldmVudCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU2VydkZpbHRlcjoKKwkJeworCQkJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgKnBTZXJ2RmlsdGVyOworCisJCQlwU2VydkZpbHRlciA9CisJCQkgICAgKHRFcGxEbGxDYWxBc25kU2VydmljZUlkRmlsdGVyICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHBTZXJ2RmlsdGVyLT4KKwkJCQkJCQkgIG1fU2VydmljZUlkLAorCQkJCQkJCSAgcFNlcnZGaWx0ZXItPgorCQkJCQkJCSAgbV9GaWx0ZXIpOworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSXNzdWVSZXE6CisJCXsKKwkJCXRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKnBJc3N1ZVJlcTsKKworCQkJcElzc3VlUmVxID0gKHRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdChwSXNzdWVSZXEtPm1fU2VydmljZSwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV91aU5vZGVJZCwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV9iU29hRmxhZzEpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtBZGROb2RlOgorCQl7CisJCQl0RXBsRGxsTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCQkJcE5vZGVJbmZvID0gKHRFcGxEbGxOb2RlSW5mbyAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0FkZE5vZGUocE5vZGVJbmZvKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZToKKwkJeworCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWQ7CisKKwkJCXB1aU5vZGVJZCA9ICh1bnNpZ25lZCBpbnQgKilwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZDsKKworCQkJcHVpTm9kZUlkID0gKHVuc2lnbmVkIGludCAqKXBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPSBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHk6CisJCXsKKwkJCXRFcGxEbGxJZGVudFBhcmFtICpwSWRlbnRQYXJhbTsKKworCQkJcElkZW50UGFyYW0gPSAodEVwbERsbElkZW50UGFyYW0gKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCWlmIChwSWRlbnRQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBJZGVudFBhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID0KKwkJCQkgICAgcEV2ZW50X3AtPm1fdWlTaXplOworCQkJfQorCQkJUmV0ID0gRXBsRGxsa1NldElkZW50aXR5KHBJZGVudFBhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrQ29uZmlnOgorCQl7CisJCQl0RXBsRGxsQ29uZmlnUGFyYW0gKnBDb25maWdQYXJhbTsKKworCQkJcENvbmZpZ1BhcmFtID0gKHRFcGxEbGxDb25maWdQYXJhbSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJaWYgKHBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA9CisJCQkJICAgIHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJCX0KKwkJCVJldCA9IEVwbERsbGtDb25maWcocENvbmZpZ1BhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBjb3VudCBvZiBUeCBmcmFtZXMgb2YgRklGTyB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICogcFByaW9yaXR5X3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUNvdW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lQ291bnQ7CisKKwkvLyBnZXQgZnJhbWUgY291bnQgb2YgVHggRklGTyB3aXRoIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJICAgICZ1bEZyYW1lQ291bnQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiSW52YWxpZEFyZworCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRnJhbWVDb3VudCA+CisJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10ID0KKwkJICAgIHVsRnJhbWVDb3VudDsKKwl9CisKKwlpZiAodWxGcmFtZUNvdW50ICE9IDApIHsJLy8gTk1UIHJlcXVlc3RzIGFyZSBpbiBxdWV1ZQorCQkqcFByaW9yaXR5X3AgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworCQkqcHVpQ291bnRfcCA9ICh1bnNpZ25lZCBpbnQpdWxGcmFtZUNvdW50OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBmcmFtZSBjb3VudCBvZiBUeCBGSUZPIHdpdGggZ2VuZXJpYyBwcmlvcml0eQorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCSAgICAmdWxGcmFtZUNvdW50KTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYkludmFsaWRBcmcKKworCS8vIGVycm9yIGhhbmRsaW5nCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bEZyYW1lQ291bnQgPgorCSAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbikgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbiA9CisJCSAgICB1bEZyYW1lQ291bnQ7CisJfQorCisJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJKnB1aUNvdW50X3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVDb3VudDsKKworICAgICAgRXhpdDoKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCSpwdWlDb3VudF9wID0gMTsKKwl9IGVsc2UgaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljOworCQkqcHVpQ291bnRfcCA9IDE7CisJfSBlbHNlIHsKKwkJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCSpwdWlDb3VudF9wID0gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIFR4IGZyYW1lcyBmcm9tIEZJRk8gd2l0aCBzcGVjaWZpZWQgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBidWZmZXIKKy8vICAgICAgICAgICAgICBwdWlGcmFtZVNpemVfcCAgICAgICAgICA9IElOOiBtYXggc2l6ZSBvZiBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogYWN0dWFsIHNpemUgb2YgZnJhbWUKKy8vICAgICAgICAgICAgICBQcmlvcml0eV9wICAgICAgICAgICAgICA9IElOOiBwcmlvcml0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lKHZvaWQgKnBGcmFtZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lU2l6ZTsKKworCXN3aXRjaCAoUHJpb3JpdHlfcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoJLy8gTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyUmVhZERhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJCShCWVRFICopIHBGcmFtZV9wLCAqcHVpRnJhbWVTaXplX3AsCisJCQkJCSZ1bEZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRGF0YVRydW5jYXRlZCwga1NoYkludmFsaWRBcmcsIGtTaGJOb1JlYWRhYmxlRGF0YQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpclJlYWREYXRhQmxvY2soRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkoQllURSAqKSBwRnJhbWVfcCwgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCQkmdWxGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkRhdGFUcnVuY2F0ZWQsIGtTaGJJbnZhbGlkQXJnLCBrU2hiTm9SZWFkYWJsZURhdGEKKwkJYnJlYWs7CisKKwl9CisKKwkvLyBlcnJvciBoYW5kbGluZworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJOb1JlYWRhYmxlRGF0YSkgeworCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eTsKKwkJfSBlbHNlIHsJLy8gb3RoZXIgZXJyb3IKKwkJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQl9CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqcHVpRnJhbWVTaXplX3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVTaXplOworCisgICAgICBFeGl0OgorI2Vsc2UKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCSpwdWlGcmFtZVNpemVfcCA9CisJCSAgICBtaW4oKnB1aUZyYW1lU2l6ZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10KTsKKwkJRVBMX01FTUNQWShwRnJhbWVfcCwgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJICAgKnB1aUZyYW1lU2l6ZV9wKTsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJKnB1aUZyYW1lU2l6ZV9wID0KKwkJICAgIG1pbigqcHVpRnJhbWVTaXplX3AsIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4pOworCQlFUExfTUVNQ1BZKHBGcmFtZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVHZW4sCisJCQkgICAqcHVpRnJhbWVTaXplX3ApOworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKwkJYnJlYWs7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGx1Q2FsOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUFzbmRSeDsKKwlFdmVudC5tX3BBcmcgPSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lOworCUV2ZW50Lm1fdWlTaXplID0gcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCS8vIHBhc3MgTmV0VGltZSBvZiBmcmFtZSB0byB1c2Vyc3BhY2UKKwlFdmVudC5tX05ldFRpbWUgPSBwRnJhbWVJbmZvX3AtPm1fTmV0VGltZTsKKworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyUnhGcmFtZUNvdW50Kys7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhSeEZyYW1lQ291bnQrKzsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNTZW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcHV0cyB0aGUgZ2l2ZW4gZnJhbWUgaW50byB0aGUgdHJhbnNtaXQgRklGTyB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICBwcmlvcml0eS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJc3dpdGNoIChQcmlvcml0eV9wKSB7CisJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJXcml0ZURhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJIG1fU2hiSW5zdGFuY2VUeE5tdCwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJCSBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkV4Y2VlZERhdGFTaXplTGltaXQsIGtTaGJCdWZmZXJGdWxsLCBrU2hiSW52YWxpZEFyZworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpcldyaXRlRGF0YUJsb2NrKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgbV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdCwga1NoYkJ1ZmZlckZ1bGwsIGtTaGJJbnZhbGlkQXJnCisJCWJyZWFrOworCisJfQorCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlzd2l0Y2ggKFNoYkVycm9yKSB7CisJY2FzZSBrU2hiT2s6CisJCWJyZWFrOworCisJY2FzZSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDoKKwkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQlicmVhazsKKworCWNhc2Uga1NoYkJ1ZmZlckZ1bGw6CisJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJJbnZhbGlkQXJnOgorCWRlZmF1bHQ6CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlicmVhazsKKwl9CisKKyNlbHNlCisKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lR2VuLAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKwl9CisKKyNlbmRpZgorCisJLy8gcG9zdCBldmVudCB0byBETEwKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJRXZlbnQubV9wQXJnID0gJlByaW9yaXR5X3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHlfcCk7CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisjaWZkZWYgRVBMX05PX0ZJRk8KKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlc2V0QnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgMTAwMCwKKwkJCSAgICAgIE5VTEwpOworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVzZXRCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLCAxMDAwLAorCQkJICAgICAgTlVMTCk7CisKKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworLy8gICAgRVBMX01FTVNFVCgmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLCAwLCBzaXplb2YgKHRFcGxEbGxrQ2FsU3RhdGlzdGljcykpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNDbGVhclF1ZXVlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjbGVhciBNTiBhc3luY2hyb25vdXMgcXVldWVzCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0gMDsKKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3MoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIHN0YXRpc3RpY3Mgb2YgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMuCisvLworLy8gUGFyYW1ldGVyczogIHBwU3RhdGlzdGljcyAgICAgICAgICAgID0gc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3ModEVwbERsbGtDYWxTdGF0aXN0aWNzICoqIHBwU3RhdGlzdGljcykKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJCSAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLgorCQkJCSAgICBtX3VsQ3VyVHhGcmFtZUNvdW50Tm10KTsKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwKKwkJCQkgICAgJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy4KKwkJCQkgICAgbV91bEN1clR4RnJhbWVDb3VudEdlbik7CisvLyAgICBTaGJFcnJvciA9IFNoYkNpckdldFJlYWRCbG9ja0NvdW50IChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUngsICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clJ4RnJhbWVDb3VudCk7CisKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyVHhGcmFtZUNvdW50Tm10ID0gMTsKKwl9IGVsc2UgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudE5tdCA9IDA7CisJfQorCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID4gMCkgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudEdlbiA9IDE7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxDdXJUeEZyYW1lQ291bnRHZW4gPSAwOworCX0KKyNlbmRpZgorCisJKnBwU3RhdGlzdGljcyA9ICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3M7CisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoYlNvYUZsYWcxX3AgIT0gMHhGRikgeworCQlSZXQgPSBFcGxEbGxrU2V0RmxhZzFPZk5vZGUodWlOb2RlSWRfcCwgYlNvYUZsYWcxX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWRkIG5vZGUgdG8gYXBwcm9wcmlhdGUgcmVxdWVzdCBxdWV1ZQorCXN3aXRjaCAoU2VydmljZV9wKSB7CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZUlkZW50OgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSArCisJCQkgICAgICAxKSAlCisJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCW1fYXVpUXVldWVJZGVudFJlcSkpCisJCQkgICAgPT0gRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVJZGVudFJlcVtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJICAgICAgIG1fdWlXcml0ZUlkZW50UmVxXSA9IHVpTm9kZUlkX3A7CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSA9CisJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgKworCQkJICAgICAgMSkgJQorCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQltX2F1aVF1ZXVlU3RhdHVzUmVxKSkKKwkJCSAgICA9PSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVTdGF0dXNSZXFbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQltX3VpV3JpdGVTdGF0dXNSZXFdID0KKwkJCSAgICB1aU5vZGVJZF9wOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0KKwkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgbmV4dCByZXF1ZXN0IGZvciBTb0EuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTGsgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVxU2VydmljZUlkX3AgICAgICAgICA9IHBvaW50ZXIgdG8gcmVxdWVzdCBzZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTjogYXZhaWxhYmxlIHJlcXVlc3QgZm9yIE1OIE5NVCBvciBnZW5lcmljIHJlcXVlc3QgcXVldWUgKEZsYWcyLlBSKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGtFcGxEbGxSZXFTZXJ2aWNlTm8gaWYgcXVldWVzIGFyZSBlbXB0eQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBuZXh0IHJlcXVlc3QKKy8vICAgICAgICAgICAgICBwdWlOb2RlSWRfcCAgICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBub2RlIElEIG9mIG5leHQgcmVxdWVzdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVQTF9DX0FEUl9JTlZBTElELCBpZiByZXF1ZXN0IGlzIHNlbGYgYWRkcmVzc2VkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFNvYVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCAqIHBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisvLyAgICAqcFJlcVNlcnZpY2VJZF9wID0ga0VwbERsbFJlcVNlcnZpY2VObzsKKworCWZvciAodWlDb3VudCA9IEVQTF9ETExLQ0FMX01BWF9RVUVVRVM7IHVpQ291bnQgPiAwOyB1aUNvdW50LS0pIHsKKwkJc3dpdGNoIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSkgeworCQljYXNlIDA6CisJCQl7CS8vIENuR2VuUmVxCisJCQkJZm9yICg7CisJCQkJICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fdWlOZXh0UXVldWVDblJlcXVlc3QgPAorCQkJCSAgICAgKHRhYmVudHJpZXMKKwkJCQkgICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvIDIpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDE7CisJCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkOworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPj0gKHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsJLy8gbGFzdCBub2RlIHJlYWNoZWQKKwkJCQkJCQkvLyBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlIGF0IG5leHQgU29BCisJCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fdWlOZXh0UmVxdWVzdFF1ZXVlCisJCQkJCQkJICAgID0gMTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBhbGwgQ25HZW5SZXEgcXVldWVzIGFyZSBlbXB0eSAtPiBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMToKKwkJCXsJLy8gQ25ObXRSZXEKKwkJCQlmb3IgKDsKKwkJCQkgICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCA8CisJCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJbV9hdWlRdWV1ZUNuUmVxdWVzdHMpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDEgLQorCQkJCQkJICAgICh0YWJlbnRyaWVzCisJCQkJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvCisJCQkJCQkgICAgIDIpOworCQkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0OworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPiB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzKSkgewkvLyBsYXN0IG5vZGUgcmVhY2hlZAorCQkJCQkJCS8vIHJlc3RhcnQgQ25HZW5SZXEgcXVldWUKKwkJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdAorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJLy8gY29udGludWUgd2l0aCBNbkdlblJlcSBxdWV1ZSBhdCBuZXh0IFNvQQorCQkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3VpTmV4dFJlcXVlc3RRdWV1ZQorCQkJCQkJCSAgICA9IDI7CisJCQkJCQl9CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmVzdGFydCBDbkdlblJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPSAwOworCQkJCS8vIGFsbCBDbk5tdFJlcSBxdWV1ZXMgYXJlIGVtcHR5IC0+IGNvbnRpbnVlIHdpdGggTW5HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAyOgorCQkJewkvLyBNbk5tdFJlcSBhbmQgTW5HZW5SZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgTW5JZGVudFJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gMzsKKwkJCQlpZiAoKnBSZXFTZXJ2aWNlSWRfcCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CisJCQkJCSpwdWlOb2RlSWRfcCA9IEVQTF9DX0FEUl9JTlZBTElEOwkvLyBETExrIG11c3QgZXhjaGFuZ2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgbm9kZSBJRAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMzoKKwkJCXsJLy8gTW5JZGVudFJlcQorCQkJCS8vIG5leHQgcXVldWUgd2lsbCBiZSBNblN0YXR1c1JlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gNDsKKwkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSAhPSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZUlkZW50UmVxCisJCQkJCSAgICBbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRJZGVudFJlcV07CisJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkSWRlbnRSZXEgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZUlkZW50OworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgNDoKKwkJCXsJLy8gTW5TdGF0dXNSZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgQ25HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDA7CisJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkU3RhdHVzUmVxICE9IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZVN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcQorCQkJCQkgICAgW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxXTsKKwkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRTdGF0dXNSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgcGVuZGluZyBhc3luY2hyb25vdXMgZnJhbWUgcmVxdWVzdHMgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIFRoaXMgd2lsbCBhZGQgdGhlIG5vZGUgdG8gdGhlIGFzeW5jaHJvbm91cyByZXF1ZXN0IHNjaGVkdWxlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgQXN5bmNSZXFQcmlvX3AgICAgICAgICAgPSBhc3luY2hyb25vdXMgcmVxdWVzdCBwcmlvcml0eQorLy8gICAgICAgICAgICAgIHVpQ291bnRfcCAgICAgICAgICAgICAgID0gY291bnQgb2YgYXN5bmNocm9ub3VzIGZyYW1lcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwkJCQkJICAgICBBc3luY1JlcVByaW9fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlDb3VudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChBc3luY1JlcVByaW9fcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoKKwkJeworCQkJdWlOb2RlSWRfcC0tOworCQkJaWYgKHVpTm9kZUlkX3AgPj0KKwkJCSAgICAodGFiZW50cmllcworCQkJICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsKKwkJCQlSZXQgPSBrRXBsRGxsSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCXVpTm9kZUlkX3AgKz0KKwkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQl1aU5vZGVJZF9wLS07CisJCQlpZiAodWlOb2RlSWRfcCA+PQorCQkJICAgICh0YWJlbnRyaWVzCisJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyKSkgeworCQkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENhbGxiYWNrIGhhbmRsZXIgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworLypzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4Tm10U2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQgPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKyAgICBFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKyAgICBFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisgICAgRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworICAgIFJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworfQorCitzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4R2VuU2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50R2VuKQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRHZW4gPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKyAgICBFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworICAgIEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisgICAgRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisgICAgRXZlbnQubV9wQXJnID0gJlByaW9yaXR5OworICAgIEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKyAgICBSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKK30KKyovCisjZW5kaWYKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRhMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlIGluIEVQTCB1c2VyIHBhcnQKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1Q2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisKKy8vIGluY2x1ZGUgb25seSBpZiBkaXJlY3QgY2FsbCBiZXR3ZWVuIHVzZXItIGFuZCBrZXJuZWxzcGFjZSBpcyBlbmFibGVkCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsdUNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbERsbHVDYkFzbmQgbV9hcGZuRGxsdUNiQXNuZFtFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCit9IHRFcGxEbGx1Q2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHNoYWxsIGJlIHVzZWQKKy8vIGRlZmluZSBzdHJ1Y3R1cmVzIHN0YXRpY2FsbHkKK3N0YXRpYyB0RXBsRGxsdUNhbEluc3RhbmNlIEVwbERsbHVDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBETEwgQ0FMIG1vZHVsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbHVDYWxJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsdUNhbEluc3RhbmNlX2cpKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxEbGx1Q2FsSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbERsbHVDYWxJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzIHRoZSBwYXNzZWQgYXN5bmNoIGZyYW1lCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gZXZlbnQgY29udGFpbmluZyBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTXNnVHlwZSBNc2dUeXBlOworCXVuc2lnbmVkIGludCB1aUFzbmRTZXJ2aWNlSWQ7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwlpZiAocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVBc25kUngpIHsKKwkJRnJhbWVJbmZvLm1fcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJLy8gZXh0cmFjdCBOZXRUaW1lCisJCUZyYW1lSW5mby5tX05ldFRpbWUgPSBwRXZlbnRfcC0+bV9OZXRUaW1lOworCisJCU1zZ1R5cGUgPQorCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZGcmFtZUluZm8ubV9wRnJhbWUtPgorCQkJCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUpOworCQlpZiAoTXNnVHlwZSAhPSBrRXBsTXNnVHlwZUFzbmQpIHsKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQkJZ290byBFeGl0OworCQl9CisKKwkJdWlBc25kU2VydmljZUlkID0KKwkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmRnJhbWVJbmZvLm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkgICBtX0FzbmQubV9sZV9iU2VydmljZUlkKTsKKwkJaWYgKHVpQXNuZFNlcnZpY2VJZCA8IEVQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRCkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgdmFsaWQKKwkJCWlmIChFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kW3VpQXNuZFNlcnZpY2VJZF0gIT0gTlVMTCkgewkvLyBoYW5kbGVyIHdhcyByZWdpc3RlcmVkCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsdUNhbEluc3RhbmNlX2cuCisJCQkJICAgIG1fYXBmbkRsbHVDYkFzbmRbdWlBc25kU2VydmljZUlkXQorCQkJCSAgICAoJkZyYW1lSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZAorLy8gICAgICAgICAgICAgIEFzbmRTZXJ2aWNlSWQgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlSWRfcCAgICAgICAgICAgICA9IEFTbmQgU2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHBmbkRsbHVDYkFzbmRfcCAgICAgICAgID0gY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBGaWx0ZXJfcCAgICAgICAgICAgICAgICA9IG5vZGUgSUQgZmlsdGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxSZWdBc25kU2VydmljZSh0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkgICAgdEVwbERsbHVDYkFzbmQgcGZuRGxsdUNiQXNuZF9wLAorCQkJCSAgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNlcnZpY2VJZF9wIDwgdGFiZW50cmllcyhFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kKSkgeworCQkvLyBtZW1vcml6ZSBmdW5jdGlvbiBwb2ludGVyCisJCUVwbERsbHVDYWxJbnN0YW5jZV9nLm1fYXBmbkRsbHVDYkFzbmRbU2VydmljZUlkX3BdID0KKwkJICAgIHBmbkRsbHVDYkFzbmRfcDsKKworCQlpZiAocGZuRGxsdUNiQXNuZF9wID09IE5VTEwpIHsJLy8gY2xvc2UgZmlsdGVyCisJCQlGaWx0ZXJfcCA9IGtFcGxEbGxBc25kRmlsdGVyTm9uZTsKKwkJfQorCQkvLyBzZXQgZmlsdGVyIGluIERMTCBtb2R1bGUgaW4ga2VybmVsIHBhcnQKKwkJUmV0ID0gRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIoU2VydmljZUlkX3AsIEZpbHRlcl9wKTsKKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxBc3luY1NlbmQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgZnJhbWUgd2l0aCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IGZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpRnJhbWVTaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwlwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgKz0gMTQ7CS8vIGFkZCBzaXplIG9mIGV0aGVybmV0IGhlYWRlcgorCVJldCA9IEVwbERsbGtDYWxBc3luY1NlbmQocEZyYW1lSW5mb19wLCBQcmlvcml0eV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChTZXJ2aWNlX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJeworCQkJdEVwbEV2ZW50IEV2ZW50OworCQkJdEVwbERsbENhbElzc3VlUmVxdWVzdCBJc3N1ZVJlcTsKKworCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcTsKKwkJCUlzc3VlUmVxLm1fU2VydmljZSA9IFNlcnZpY2VfcDsKKwkJCUlzc3VlUmVxLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCQkJSXNzdWVSZXEubV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZJc3N1ZVJlcTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKElzc3VlUmVxKTsKKworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZTsKKwlFdmVudC5tX3BBcmcgPSBwTm9kZUluZm9fcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih0RXBsRGxsTm9kZUluZm8pOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZTsKKwlFdmVudC5tX3BBcmcgPSAmdWlOb2RlSWRfcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih1aU5vZGVJZF9wKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIHNvZnRseSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOworCUV2ZW50Lm1fcEFyZyA9ICZ1aU5vZGVJZF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHVpTm9kZUlkX3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZm9yd2FyZHMgY2FsbCB0byBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcigpIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgU2VydkZpbHRlcjsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXI7CisJU2VydkZpbHRlci5tX1NlcnZpY2VJZCA9IFNlcnZpY2VJZF9wOworCVNlcnZGaWx0ZXIubV9GaWx0ZXIgPSBGaWx0ZXJfcDsKKwlFdmVudC5tX3BBcmcgPSAmU2VydkZpbHRlcjsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihTZXJ2RmlsdGVyKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWUxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZGVmaW5pdGlvbnMgZm9yIGFsbCBFUEwtZnVuY3Rpb24gcmV0dXJuIGNvZGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyRGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIGFsbAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMTIvMDUgLWFzOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9FUlJPUkRFRl9IXworI2RlZmluZSBfRVBMX0VSUk9SREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXR1cm4gY29kZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJLy8gYXJlYSBmb3IgZ2VuZXJpYyBlcnJvcnMgMHgwMDAwIC0gMHgwMDBGCisJa0VwbFN1Y2Nlc3NmdWwgPSAweDAwMDAsCS8vIG5vIGVycm9yL3N1Y2Nlc3NmdWwgcnVuCisJa0VwbElsbGVnYWxJbnN0YW5jZSA9IDB4MDAwMSwJLy8gdGhlIGNhbGxlZCBJbnN0YW56IGRvZXMgbm90IGV4aXN0CisJa0VwbEludmFsaWRJbnN0YW5jZVBhcmFtID0gMHgwMDAyLAkvLworCWtFcGxOb0ZyZWVJbnN0YW5jZSA9IDB4MDAwMywJLy8gWHh4QWRkSW5zdGFuY2Ugd2FzIGNhbGxlZCBidXQgbm8gZnJlZSBpbnN0YW5jZSBpcyBhdmFpbGFibGUKKwlrRXBsV3JvbmdTaWduYXR1cmUgPSAweDAwMDQsCS8vIHdyb25nIHNpZ25hdHVyZSB3aGlsZSB3cml0aW5nIHRvIG9iamVjdCAweDEwMTAgb3IgMHgxMDExCisJa0VwbEludmFsaWRPcGVyYXRpb24gPSAweDAwMDUsCS8vIG9wZXJhdGlvbiBub3QgYWxsb3dlZCBpbiB0aGlzIHNpdHVhdGlvbgorCWtFcGxJbnZhbGlkTm9kZUlkID0gMHgwMDA3LAkvLyBpbnZhbGlkIE5vZGVJZCB3YXMgc3BlY2lmaWVkCisJa0VwbE5vUmVzb3VyY2UgPSAweDAwMDgsCS8vIHJlc291cmNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIChXaW5kb3dzLCBQeFJPUywgLi4uKQorCWtFcGxTaHV0ZG93biA9IDB4MDAwOSwJLy8gc3RhY2sgaXMgc2h1dHRpbmcgZG93bgorCWtFcGxSZWplY3QgPSAweDAwMEEsCS8vIHJlamVjdCB0aGUgc3Vic2VxdWVudCBjb21tYW5kCisKKwkvLyBhcmVhIGZvciBFRFJWIG1vZHVsZSAweDAwMTAgLSAweDAwMUYKKy8vICAgIGtFcGxFZHJ2Tm9GcmFtZSAgICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgLy8gbm8gQ0FOIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisvLyAgICBrRXBsRWRydk1zZ0hpZ2ggICAgICAgICAgICAgPSAweDAwMTEsICAgICAgIC8vIENBTiBtZXNzYWdlIHdpdGggaGlnaCBwcmlvcml0eSB3YXMgcmVjZWl2ZWQKKy8vICAgIGtFcGxFZHJ2TXNnTG93ICAgICAgICAgICAgICA9IDB4MDAxMiwgICAgICAgLy8gQ0FOIG1lc3NhZ2Ugd2l0aCBsb3cgcHJpb3JpdHkgd2FzIHJlY2VpdmVkCisJa0VwbEVkcnZJbml0RXJyb3IgPSAweDAwMTMsCS8vIGluaXRpYWxpc2F0aW9uIGVycm9yCisJa0VwbEVkcnZOb0ZyZWVCdWZFbnRyeSA9IDB4MDAxNCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBpbnRlcm5hbCBidWZmZXIgdGFibGUgZm9yIFR4IGZyYW1lcworCWtFcGxFZHJ2QnVmTm90RXhpc3RpbmcgPSAweDAwMTUsCS8vIHNwZWNpZmllZCBUeCBidWZmZXIgZG9lcyBub3QgZXhpc3QKKy8vICAgIGtFcGxFZHJ2Tm9GcmVlQ2hhbm5lbCAgICAgICA9IDB4MDAxNCwgICAgICAgLy8gQ0FOIGNvbnRyb2xsZXIgaGFzIG5vdCBhIGZyZWUgY2hhbm5lbAorLy8gICAga0VwbEVkcnZUeEJ1ZmZIaWdoT3ZlcnJ1biAgID0gMHgwMDE1LCAgICAgICAvLyBidWZmZXIgZm9yIGhpZ2ggcHJpb3JpdHkgQ0FOIHRyYW5zbWl0IG1lc3NhZ2VzIGhhcyBvdmVycnVuCisvLyAgICBrRXBsRWRydlR4QnVmZkxvd092ZXJydW4gICAgPSAweDAwMTYsICAgICAgIC8vIGJ1ZmZlciBmb3IgbG93IHByaW9yaXR5IENBTiB0cmFuc21pdCBtZXNzYWdlcyBoYXMgb3ZlcnJ1bgorLy8gICAga0VwbEVkcnZJbGxlZ2FsQmRpICAgICAgICAgID0gMHgwMDE3LCAgICAgICAvLyB1bnN1cHBvcnRlZCBiYXVkcmF0ZSB3aXRoaW4gYmF1ZHJhdGUgdGFibGUKKy8vICAgIGtFcGxFZHJ2QnVzeSAgICAgICAgICAgICAgICA9IDB4MDAxOCwgICAgICAgLy8gcmVtb3RlIGZyYW1lIGNhbiBub3QgYmUgdXBkYXRlZCBiZWNhdXNlIG5vIGJ1cyBjb250YWN0IG9yIENBTgorCS8vIHRyYW5zbWlzc2lvbiBpcyBhY3RpdgorLy8gICAga0VwbEVkcnZJbnZhbGlkRHJpdmVyVHlwZSAgID0gMHgwMDE5LCAgICAgICAvLyAoUEM6IFdpbmRvd3Mgb3IgTGludXgpIGludmFsaWQgZHJpdmVyIHR5cGUKKy8vICAgIGtFcGxFZHJ2RHJpdmVyTm90Rm91bmQgICAgICA9IDB4MDAxQSwgICAgICAgLy8gKFBDOiBXaW5kb3dzIG9yIExpbnV4KSBkcml2ZXIgKERMTCkgY291bGQgbm90IGJlIGZvdW5kCisvLyAgICBrRXBsRWRydkludmFsaWRCYXNlQWRkcmVzcyAgPSAweDAwMUIsICAgICAgIC8vIChQQzogV2luZG93cyBvciBMaW51eCkgZHJpdmVyIGNvdWxkIG5vdCBmb3VuZCB0aGUgQ0FOIGNvbnRyb2xsZXIKKy8vICAgIGtFcGxFZHJ2SW52YWxpZFBhcmFtICAgICAgICA9IDB4MDAxQywgICAgICAgLy8gaW52YWxpZCBwYXJhbSBpbiBmdW5jdGlvbiBjYWxsCisKKwkvLyBhcmVhIGZvciBDT0IgbW9kdWxlIDB4MDAyMCAtIDB4MDAyRgorLyogICAga0VwbENvYk5vRnJlZUVudHJ5ICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIFJYLSBvciBUWC1DT0IgdGFibGUKKyAgICBrRXBsQ29iQWxyZWFkeUV4aXN0ICAgICAgICAgPSAweDAwMjEsICAgICAgIC8vIENPQi1JRCBhbHJlYWR5IGV4aXN0cyBpbiBSWC0gcmVzcC4gVFgtQ09CIHRhYmxlCisgICAgKi8KKwlrRXBsRGxsSWxsZWdhbEhkbCA9IDB4MDAyMiwJLy8gaWxsZWdhbCBoYW5kbGUgZm9yIGEgVHhGcmFtZSB3YXMgcGFzc2VkCisJa0VwbERsbENiQXN5bmNSZWdpc3RlcmVkID0gMHgwMDIzLAkvLyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcyB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGJlZm9yZQorLy8gICAga0VwbERsbEFzeW5jUnhCdWZmZXJGdWxsICAgID0gMHgwMDI0LCAgICAgICAvLyByZWNlaXZlIGJ1ZmZlciBmb3IgYXN5bmNocm9ub3VzIGZyYW1lcyBpcyBmdWxsCisJa0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSA9IDB4MDAyNSwJLy8gdHJhbnNtaXQgYnVmZmVyIGZvciBhc3luY2hyb25vdXMgZnJhbWVzIGlzIGVtcHR5CisJa0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsID0gMHgwMDI2LAkvLyB0cmFuc21pdCBidWZmZXIgZm9yIGFzeW5jaHJvbm91cyBmcmFtZXMgaXMgZnVsbAorCWtFcGxEbGxOb05vZGVJbmZvID0gMHgwMDI3LAkvLyBNTjogdG9vIGxlc3Mgc3BhY2UgaW4gdGhlIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlrRXBsRGxsSW52YWxpZFBhcmFtID0gMHgwMDI4LAkvLyBpbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uCisJa0VwbERsbFR4QnVmTm90UmVhZHkgPSAweDAwMkUsCS8vIFR4QnVmZmVyIChlLmcuIGZvciBQUmVxKSBpcyBub3QgcmVhZHkgeWV0CisJa0VwbERsbFR4RnJhbWVJbnZhbGlkID0gMHgwMDJGLAkvLyBUeEZyYW1lIChlLmcuIGZvciBQUmVxKSBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisvKiAgICBrRXBsQ29iSWxsZWdhbENhbklkICAgICAgICAgPSAweDAwMjMsICAgICAgIC8vIENPQi1JRCBpcyBub3QgYWxsb3dlZCAobGlrZSAweDAwMCBpcyByZXNlcnZlZCBmb3IgTk1ULCAuLi4pCisgICAga0VwbENvYkludmFsaWRDYW5JZCAgICAgICAgID0gMHgwMDI0LCAgICAgICAvLyBDT0ItSUQgaXMgc3dpdGNoZWQgb2ZmCisgICAga0VwbENvYkNkcnZTdGF0ZVNldCAgICAgICAgID0gMHgwMDI1LCAgICAgICAvLyBhdCBsZWFzdCBvbmUgYml0IG9mIENBTiBkcml2ZXIgc3RhdGUgaXMgc2V0CisgICAga0VwbENvYk5vRnJlZUVudHJ5SGlnaEJ1ZiAgID0gMHgwMDI2LCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIGhpZ2ggcHJpb3RpdHkgUlgtIG9yIFRYLUNPQiB0YWJsZQorICAgIGtFcGxDb2JPd25JZCAgICAgICAgICAgICAgICA9IDB4MDAyNywgICAgICAgLy8gQ09CLUlEIGFscmVhZHkgZXhpc3RzIGluIG93biBtb2R1bGUgd2hpY2ggY2FsbHMgQ29iRGVmaW5lKCkgb3IgQ29iQ2hlY2soKQorKi8KKwkvLyBhcmVhIGZvciBPQkQgbW9kdWxlIDB4MDAzMCAtIDB4MDAzRgorCWtFcGxPYmRJbGxlZ2FsUGFydCA9IDB4MDAzMCwJLy8gdW5rbm93biBPRCBwYXJ0CisJa0VwbE9iZEluZGV4Tm90RXhpc3QgPSAweDAwMzEsCS8vIG9iamVjdCBpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBPRAorCWtFcGxPYmRTdWJpbmRleE5vdEV4aXN0ID0gMHgwMDMyLAkvLyBzdWJpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBvYmplY3QgaW5kZXgKKwlrRXBsT2JkUmVhZFZpb2xhdGlvbiA9IDB4MDAzMywJLy8gcmVhZCBhY2Nlc3MgdG8gYSB3cml0ZS1vbmx5IG9iamVjdAorCWtFcGxPYmRXcml0ZVZpb2xhdGlvbiA9IDB4MDAzNCwJLy8gd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IG9iamVjdAorCWtFcGxPYmRBY2Nlc3NWaW9sYXRpb24gPSAweDAwMzUsCS8vIGFjY2VzcyBub3QgYWxsb3dlZAorCWtFcGxPYmRVbmtub3duT2JqZWN0VHlwZSA9IDB4MDAzNiwJLy8gb2JqZWN0IHR5cGUgbm90IGRlZmluZWQva25vd24KKwlrRXBsT2JkVmFyRW50cnlOb3RFeGlzdCA9IDB4MDAzNywJLy8gb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gVmFyRW50cnkgc3RydWN0dXJlCisJa0VwbE9iZFZhbHVlVG9vTG93ID0gMHgwMDM4LAkvLyB2YWx1ZSB0byB3cml0ZSB0byBhbiBvYmplY3QgaXMgdG9vIGxvdworCWtFcGxPYmRWYWx1ZVRvb0hpZ2ggPSAweDAwMzksCS8vIHZhbHVlIHRvIHdyaXRlIHRvIGFuIG9iamVjdCBpcyB0b28gaGlnaAorCWtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yID0gMHgwMDNBLAkvLyB2YWx1ZSB0byB3cml0ZSBpcyB0byBsb25nIG9yIHRvIHNob3J0CisvLyAgICBrRXBsT2JkSWxsZWdhbEZsb2F0ICAgICAgICAgPSAweDAwM0IsICAgICAgIC8vIGlsbGVnYWwgZmxvYXQgdmFyaWFibGUKKy8vICAgIGtFcGxPYmRXcm9uZ09kQnVpbGRlcktleSAgICA9IDB4MDAzRiwgICAgICAgLy8gT0Qgd2FzIGdlbmVyYXRlZCB3aXRoIGRlbW8gdmVyc2lvbiBvZiB0b29sIE9EQnVpbGRlcgorCisJLy8gYXJlYSBmb3IgTk1UIG1vZHVsZSAweDAwNDAgLSAweDAwNEYKKwlrRXBsTm10VW5rbm93bkNvbW1hbmQgPSAweDAwNDAsCS8vIHVua25vd24gTk1UIGNvbW1hbmQKKwlrRXBsTm10SW52YWxpZEZyYW1lUG9pbnRlciA9IDB4MDA0MSwJLy8gcG9pbnRlciB0byB0aGUgZnJhbWUgaXMgbm90IHZhbGlkCisJa0VwbE5tdEludmFsaWRFdmVudCA9IDB4MDA0MiwJLy8gaW52YWxpZCBldmVudCBzZW5kIHRvIE5NVC1tb2R1bAorCWtFcGxObXRJbnZhbGlkU3RhdGUgPSAweDAwNDMsCS8vIHVua25vd24gc3RhdGUgaW4gTk1ULVN0YXRlLU1hc2NoaW5lCisJa0VwbE5tdEludmFsaWRQYXJhbSA9IDB4MDA0NCwJLy8gaW52YWxpZCBwYXJhbWV0ZXJzIHNwZWNpZmllZAorCisJLy8gYXJlYSBmb3IgU0RPL1VEUCBtb2R1bGUgMHgwMDUwIC0gMHgwMDVGCisJa0VwbFNkb1VkcE1pc3NDYiA9IDB4MDA1MCwJLy8gbWlzc2luZyBjYWxsYmFjay1mdW5jdGlvbiBwb2ludGVyIGR1cmluZyBpbnRpIG9mCisJLy8gbW9kdWxlCisJa0VwbFNkb1VkcE5vU29ja2V0ID0gMHgwMDUxLAkvLyBlcnJvciBkdXJpbmcgaW5pdCBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwU29ja2V0RXJyb3IgPSAweDAwNTIsCS8vIGVycm9yIGR1cmluZyB1c2FnZSBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwVGhyZWFkRXJyb3IgPSAweDAwNTMsCS8vIGVycm9yIGR1cmluZyBzdGFydCBvZiBsaXN0ZW4gdGhyZWFkCisJa0VwbFNkb1VkcE5vRnJlZUhhbmRsZSA9IDB4MDA1NCwJLy8gbm8gZnJlZSBjb25uZWN0aW9uIGhhbmRsZSBmb3IgVWRwCisJa0VwbFNkb1VkcFNlbmRFcnJvciA9IDB4MDA1NSwJLy8gRXJyb3IgZHVyaW5nIHNlbmQgb2YgZnJhbWUKKwlrRXBsU2RvVWRwSW52YWxpZEhkbCA9IDB4MDA1NiwJLy8gdGhlIGNvbm5lY3Rpb24gaGFuZGxlIGlzIGludmFsaWQKKworCS8vIGFyZWEgZm9yIFNETyBTZXF1ZW5jZSBsYXllciBtb2R1bGUgMHgwMDYwIC0gMHgwMDZGCisJa0VwbFNkb1NlcU1pc3NDYiA9IDB4MDA2MCwJLy8gbm8gY2FsbGJhY2stZnVuY3Rpb24gYXNzaWduCisJa0VwbFNkb1NlcU5vRnJlZUhhbmRsZSA9IDB4MDA2MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvU2VxSW52YWxpZEhkbCA9IDB4MDA2MiwJLy8gaW52YWxpZCBoYW5kbGUgaW4gU0RPIHNlcXVlbmNlIGxheWVyCisJa0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdCA9IDB4MDA2MywJLy8gdW5zdXBwb3J0ZWQgUHJvdG9jb2wgc2VsZWN0ZWQKKwlrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeSA9IDB4MDA2NCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBoaXN0b3J5CisJa0VwbFNkb1NlcUZyYW1lU2l6ZUVycm9yID0gMHgwMDY1LAkvLyB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVzIGlzIG5vdCBjb3JyZWN0CisJa0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQgPSAweDAwNjYsCS8vIGluZGVpY2F0ZXMgdGhhdCB0aGUgaGlzdG9yeSBidWZmZXIgaXMgZnVsbAorCS8vIGFuZCBhIGFjayByZXF1ZXN0IGlzIG5lZWRlZAorCWtFcGxTZG9TZXFJbnZhbGlkRnJhbWUgPSAweDAwNjcsCS8vIGZyYW1lIG5vdCB2YWxpZAorCWtFcGxTZG9TZXFDb25uZWN0aW9uQnVzeSA9IDB4MDA2OCwJLy8gY29ubmVjdGlvbiBpcyBidXN5IC0+IHJldHJ5IGxhdGVyCisJa0VwbFNkb1NlcUludmFsaWRFdmVudCA9IDB4MDA2OSwJLy8gaW52YWxpZCBldmVudCByZWNlaXZlZAorCisJLy8gYXJlYSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgTW9kdWxlIDB4MDA3MCAtIDB4MDA3RgorCWtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3QgPSAweDAwNzAsCS8vIHVuc3VwcG9ydGVkIFByb3RvY29sIHNlbGVjdGVkCisJa0VwbFNkb0NvbU5vRnJlZUhhbmRsZSA9IDB4MDA3MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQ29tSW52YWxpZFNlcnZpY2VUeXBlID0gMHgwMDcyLAkvLyBpbnZhbGlkIFNETyBzZXJ2aWNlIHR5cGUgc3BlY2lmaWVkCisJa0VwbFNkb0NvbUludmFsaWRIYW5kbGUgPSAweDAwNzMsCS8vIGhhbmRsZSBpbnZhbGlkCisJa0VwbFNkb0NvbUludmFsaWRTZW5kVHlwZSA9IDB4MDA3NCwJLy8gdGhlIHN0YXRlZCB0byBvZiBmcmFtZSB0byBzZW5kIGlzCisJLy8gbm90IHBvc3NpYmxlCisJa0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlID0gMHgwMDc1LAkvLyBpbnRlcm5hbCBlcnJvcjogY29tbWFuZCBsYXllciBoYW5kbGUgaXMKKwkvLyBub3QgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQgZnJvbSBzZXF1ZW5jZSBsYXllcgorCWtFcGxTZG9Db21IYW5kbGVFeGlzdHMgPSAweDAwNzYsCS8vIGhhbmRsZSB0byBzYW1lIG5vZGUgYWxyZWFkeSBleGlzdHMKKwlrRXBsU2RvQ29tSGFuZGxlQnVzeSA9IDB4MDA3NywJLy8gdHJhbnNmZXIgdmlhIHRoaXMgaGFuZGxlIGlzIGFscmVhZHkgcnVubmluZworCWtFcGxTZG9Db21JbnZhbGlkUGFyYW0gPSAweDAwNzgsCS8vIGludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24KKworCS8vIGFyZWEgZm9yIEVQTCBFdmVudC1Nb2R1bCAweDAwODAgLSAweDAwOEYKKwlrRXBsRXZlbnRVbmtub3duU2luayA9IDB4MDA4MCwJLy8gdW5rbm93biBzaW5rIGZvciBldmVudAorCWtFcGxFdmVudFBvc3RFcnJvciA9IDB4MDA4MSwJLy8gZXJyb3IgZHVyaW5nIHBvc3Qgb2YgZXZlbnQKKworCS8vIGFyZWEgZm9yIEVQTCBUaW1lciBNb2R1bCAweDAwOTAgLSAweDAwOUYKKwlrRXBsVGltZXJJbnZhbGlkSGFuZGxlID0gMHgwMDkwLAkvLyBpbnZhbGlkIGhhbmRsZSBmb3IgdGltZXIKKwlrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZCA9IDB4MDA5MSwJLy8gbm8gdGltZXIgd2FzIGNyZWF0ZWQgY2F1c2VkIGJ5CisJLy8gYW4gZXJyb3IKKworCS8vIGFyZWEgZm9yIEVQTCBTRE8vQXNuZCBNb2R1bGUgMHgwMEEwIC0gMHgwQUYKKwlrRXBsU2RvQXNuZEludmFsaWROb2RlSWQgPSAweDAwQTAsCS8vMCBub2RlIGlkIGlzIGludmFsaWQKKwlrRXBsU2RvQXNuZE5vRnJlZUhhbmRsZSA9IDB4MDBBMSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQXNuZEludmFsaWRIYW5kbGUgPSAweDAwQTIsCS8vIGhhbmRsZSBmb3IgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisKKwkvLyBhcmVhIGZvciBQRE8gbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorCWtFcGxQZG9Ob3RFeGlzdCA9IDB4MDBCMCwJLy8gc2VsZWN0ZWQgUERPIGRvZXMgbm90IGV4aXN0CisJa0VwbFBkb0xlbmd0aEV4Y2VlZGVkID0gMHgwMEIxLAkvLyBsZW5ndGggb2YgUERPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYmlzCisJa0VwbFBkb0dyYW51bGFyaXR5TWlzbWF0Y2ggPSAweDAwQjIsCS8vIGNvbmZpZ3VyZWQgUERPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKwlrRXBsUGRvSW5pdEVycm9yID0gMHgwMEIzLAkvLyBlcnJvciBkdXJpbmcgaW5pdGlhbGlzYXRpb24gb2YgUERPIG1vZHVsZQorCWtFcGxQZG9FcnJvclBkb0VuY29kZSA9IDB4MDBCNCwJLy8gZXJyb3IgZHVyaW5nIGVuY29kaW5nIGEgUERPCisJa0VwbFBkb0Vycm9yUGRvRGVjb2RlID0gMHgwMEI1LAkvLyBlcnJvciBkdXJpbmcgZGVjb2RpbmcgYSBQRE8KKwlrRXBsUGRvRXJyb3JTZW5kID0gMHgwMEI2LAkvLyBlcnJvciBkdXJpbmcgc2VuZGluZyBhIFBETworCWtFcGxQZG9FcnJvclN5bmNXaW4gPSAweDAwQjcsCS8vIHRoZSBTWU5DIHdpbmRvdyBydW5zIG91dCBkdXJpbmcgc2VuZGluZyBTWU5DLVBET3MKKwlrRXBsUGRvRXJyb3JNYXBwID0gMHgwMEI4LAkvLyBpbnZhbGlkIFBETyBtYXBwaW5nCisJa0VwbFBkb1Zhck5vdEZvdW5kID0gMHgwMEI5LAkvLyB2YXJpYWJsZSB3YXMgbm90IGZvdW5kIGluIGZ1bmN0aW9uIFBkb1NpZ25hbFZhcigpCisJa0VwbFBkb0Vycm9yRW1jeVBkb0xlbiA9IDB4MDBCQSwJLy8gdGhlIGxlbmd0aCBvZiBhIHJlY2VpdmVkIFBETyBpcyB1bmVxdWFsIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorCWtFcGxQZG9Xcml0ZUNvbnN0T2JqZWN0ID0gMHgwMEJCLAkvLyBjb25zdGFudCBvYmplY3QgY2FuIG5vdCBiZSB3cml0dGVuCisJLy8gKG9ubHkgVHhUeXBlLCBJbmhpYml0LSwgRXZlbnQgVGltZSBmb3IgQ0FOb3BlbiBLaXQpCisKKwkvLyBhcmVhIGZvciBMU1Mgc2xhdmUgbW9kdWxlCisvKiAgICBrRXBsTHNzc1Jlc2V0Tm9kZSAgICAgICAgICAgPSAweDAwODAsICAgICAgIC8vIE5NVCBjb21tYW5kICJyZXNldCBub2RlIiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFmdGVyIExTUyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb2YgTm9kZUlkCisgICAga0VwbExzc3NJbnZhbGlkTm9kZUlkICAgICAgID0gMHgwMDgxLCAgICAgICAvLyBubyB2YWxpZCBOb2RlSWQgaXMgY29uZmlndXJlZCAtPiB3YWl0IHVudGlsIGl0IGlzIGNvbmZpZ3VyZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFNTIHNlcnZpY2UgYmVmb3JlIGNhbGxpbmcgQ2NtQ29ubmVjdFRvTmV0KCkKKyovCisJLy8gYXJlYSBmb3IgZW1lcmdlbmN5IGNvbnN1bWVyIG1vZHVsZSAweDAwOTAgLSAweDAwOUYKKy8qICAgIGtFcGxFbWNjTm9GcmVlUHJvZHVjZXJFbnRyeSA9IDB4MDA5MCwgICAgICAgLy8gbm8gZnJlZSBlbnRyeSB0byBhZGQgYSBFbWVyZ2VuY3kgUHJvZHVjZXIKKyAgICBrRXBsRW1jY05vZGVJZE5vdEV4aXN0ICAgICAgPSAweDAwOTEsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCB3YXMgbmV2ZXIgYWRkZWQKKyAgICBrRXBsRW1jY05vZGVJZEludmFsaWQgICAgICAgPSAweDAwOTIsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCBpcyBvdXRzaWRlIG9mIHJhbmdlICgweDAxIHVudGlsIDB4N0YpCisgICAga0VwbEVtY2NOb2RlSWRFeGlzdCAgICAgICAgID0gMHgwMDkzLCAgICAgICAvLyBzZWxlY3RlZCBOb2RlSWQgYWxyZWFkeSBleGlzdAorKi8KKwkvLyBhcmVhIGZvciBkeW5hbWljIE9EIDB4MDBBMCAtIDB4MDBBRgorLyogICAga0VwbER5bk5vTWVtb3J5ICAgICAgICAgICAgID0gMHgwMEEwLCAgICAgICAvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisgICAga0VwbER5bkludmFsaWRDb25maWcgICAgICAgID0gMHgwMEExLCAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gc2VnbWVudCBjb250YWluZXIKKyovCisJLy8gYXJlYSBmb3IgaGVydGJlYXQgY29uc3VtZXIgbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorLyogICAga0VwbEhiY0VudHJ5Tm90RXhpc3QgICAgICAgID0gMHgwMEIwLCAgICAgICAvLyBIZWFydGJlYXQgUHJvZHVjZXIgbm9kZSBub3QgY29uZmlndXJlZAorICAgIGtFcGxIYmNFbnRyeUFscmVhZHlFeGlzdCAgICA9IDB4MDBCMSwgICAgICAgLy8gTm9kZUlkIHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gaGVhcnRiZWF0IGNvbnN1bWVyIHRhYmxlIChvYmplY3QgMHgxMDE2KQorKi8KKwkvLyBDb25maWd1cmF0aW9uIG1hbmFnZXIgbW9kdWxlIDB4MDBDMCAtIDB4MDBDRgorCWtFcGxDZmdNYUNvbmZpZ0Vycm9yID0gMHgwMEMwLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIKKwlrRXBsQ2ZnTWFTZG9jVGltZU91dEVycm9yID0gMHgwMEMxLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIsIFNkbyB0aW1lb3V0CisJa0VwbENmZ01hSW52YWxpZERjZiA9IDB4MDBDMiwJLy8gY29uZmlncmF0aW9uIGZpbGUgbm90IHZhbGlkCisJa0VwbENmZ01hVW5zdXBwb3J0ZWREY2YgPSAweDAwQzMsCS8vIHVuc3VwcG9ydGVkIERjZiBmb3JtYXQKKwlrRXBsQ2ZnTWFDb25maWdXaXRoRXJyb3JzID0gMHgwMEM0LAkvLyBjb25maWd1cmF0aW9uIGZpbmlzaGVkIHdpdGggZXJyb3JzCisJa0VwbENmZ01hTm9GcmVlQ29uZmlnID0gMHgwMEM1LAkvLyBubyBmcmVlIGNvbmZpZ3VyYXRpb24gZW50cnkKKwlrRXBsQ2ZnTWFOb0NvbmZpZ0RhdGEgPSAweDAwQzYsCS8vIG5vIGNvbmZpZ3VyYXRpb24gZGF0YSBwcmVzZW50CisJa0VwbENmZ01hVW5zdXBwRGF0YXR5cGVEY2YgPSAweDAwQzcsCS8vIHVuc3VwcG9ydGVkIGRhdGF0eXBlIGZvdW5kIGluIGRjZgorCS8vIC0+IHRoaXMgZW50cnkgd2FzIG5vdCBjb25maWd1cmVkCisKKwkvLyBhcmVhIGZvciBMU1MgbWFzdGVyIG1vZHVsZSAweDAwRDAgLSAweDAwREYKKy8qICAgIGtFcGxMc3NtSWxsZWdhbE1vZGUgICAgICAgICA9IDB4MDBEMCwgICAgICAgLy8gaWxsZWdhbCBMU1MgbW9kZSAob3BlcmF0aW9uIC8gY29uZmlndXJhdGlvbikKKyAgICBrRXBsTHNzbUlsbGVnYWxTdGF0ZSAgICAgICAgPSAweDAwRDEsICAgICAgIC8vIGZ1bmN0aW9uIHdhcyBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSBvZiBMU1MgbWFzdGVyCisgICAga0VwbExzc21CdXN5ICAgICAgICAgICAgICAgID0gMHgwMEQyLCAgICAgICAvLyBMU1MgcHJvY2VzcyBpcyBidXN5IHdpdGggYW4gcHJldmlvdXMgc2VydmljZQorICAgIGtFcGxMc3NtSWxsZWdhbENtZCAgICAgICAgICA9IDB4MDBEMywgICAgICAgLy8gaWxsZWdhbCBjb21tYW5kIGNvZGUgd2FzIHNldCBmb3IgZnVuY3Rpb24gTHNzbUlucXVpcmVJZGVudGl0eSgpCisgICAga0VwbExzc21UaW1lb3V0ICAgICAgICAgICAgID0gMHgwMEQ0LCAgICAgICAvLyBMU1Mgc2xhdmUgZGlkIG5vdCBhbnN3ZXIgYSBMU1Mgc2VydmljZQorICAgIGtFcGxMc3NtRXJyb3JJbkNvbmZpcm0gICAgICA9IDB4MDBENSwgICAgICAgLy8gTFNTIHNsYXZlIHJlcGxpZWQgYW4gZXJyb3IgY29kZSBmb3IgYSBMU1Mgc2VydmljZQorKi8KKwkvLyBhcmVhIGZvciBDQ00gbW9kdWxlcyAweDAwRTAgLSAweEVGCisvKiAgICBrRXBsQ2NtU3RvcmVVbnZhbGlkU3RhdGUgICAgPSAweDAwRTAsICAgICAgIC8vIG1lbW9yeSBkZXZpY2Ugbm90IGF2YWlsYWJsZSBkdWUgZGV2aWNlIHN0YXRlCisgICAga0VwbENjbVN0b3JlSHdFcnJvciAgICAgICAgID0gMHgwMEUxLCAgICAgICAvLyBodyBlcnJvciBkdWUgZGV2aWNlIGFjY2VzcworKi8KKwkvLyBhcmVhIGZvciBTUkRPIG1vZHVsZSAweDAxMDAgLSAweDAxMUYKKy8qICAgIGtFcGxTcmRvTm90RXhpc3QgICAgICAgICAgICA9IDB4MDEwMCwgICAgICAgLy8gc2VsZWN0ZWQgU1JETyBkb2VzIG5vdCBleGlzdAorICAgIGtFcGxTcmRvR3JhbnVsYXJpdHlNaXNtYXRjaCA9IDB4MDEwMSwgICAgICAgLy8gY29uZmlndXJlZCBTUkRPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKyAgICBrRXBsU3Jkb0NmZ1RpbWluZ0Vycm9yICAgICAgPSAweDAxMDIsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgbm90IG9rIChUaW1pbmcpCisgICAga0VwbFNyZG9DZmdJZEVycm9yICAgICAgICAgID0gMHgwMTAzLCAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIG5vdCBvayAoQ29iSWRzKQorICAgIGtFcGxTcmRvQ2ZnQ3JjRXJyb3IgICAgICAgICA9IDB4MDEwNCwgICAgICAgLy8gY29uZmlndXJhdGlvbiBpcyBub3Qgb2sgKENSQykKKyAgICBrRXBsU3Jkb05tdEVycm9yICAgICAgICAgICAgPSAweDAxMDUsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgaW4gYSB3cm9uZyBOTVQgc3RhdGUKKyAgICBrRXBsU3Jkb0ludmFsaWRDZmcgICAgICAgICAgPSAweDAxMDYsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgd2l0aCBhbiBpbnZhbGQgU1JETyBjb25maWd1cmF0aW9uCisgICAga0VwbFNyZG9JbnZhbGlkICAgICAgICAgICAgID0gMHgwMTA3LCAgICAgICAvLyBhbiBhY3Rpb24gd2FzIHRyaWVkIHdpdGggYW4gaW52YWxkIFNSRE8KKyAgICBrRXBsU3Jkb1J4VHhDb25mbGljdCAgICAgICAgPSAweDAxMDgsICAgICAgIC8vIGFuIHRyYW5zbWlzc2lvbiB3YXMgdHJpZWQgd2l0aCBhbiByZWNlaXZlIFNSRE8gKG9yIHRoZSBvdGhlciB3YXkpCisgICAga0VwbFNyZG9JbGxlZ2FsQ2FuSWQgICAgICAgID0gMHgwMTA5LCAgICAgICAvLyB0aGUgQ2FuSWQgaXMgaW52YWxpZAorICAgIGtFcGxTcmRvQ2FuSWRBbHJlYWR5SW5Vc2UgICA9IDB4MDEwQSwgICAgICAgLy8gdGhlIENhbklkIGlzIGFscmVhZHkgaW4gdXNlCisgICAga0VwbFNyZG9Ob3RJbk9yZGVyICAgICAgICAgID0gMHgwMTBCLCAgICAgICAvLyB0aGUgdHdvIG1lc3NhZ2VzIG9mIGEgU1JETyBhcmUgbm90IGluIG9yZGVyCisgICAga0VwbFNyZG9TY3RUaW1lb3V0ICAgICAgICAgID0gMHgwMTBDLCAgICAgICAvLyB0aW1lb3V0IG9mIFNDVAorICAgIGtFcGxTcmRvU3J2dFRpbWVvdXQgICAgICAgICA9IDB4MDEwRCwgICAgICAgLy8gdGltZW91dCBvZiBTUlZUCisgICAga0VwbFNyZG9DYW5JZE5vdFZhbGlkICAgICAgID0gMHgwMTBFLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLUlEcyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9EbGNOb3RWYWxpZCAgICAgICAgID0gMHgwMTBGLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLURMQyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9FcnJvck1hcHAgICAgICAgICAgID0gMHgwMTEwLCAgICAgICAvLyB3cm9uZyB2YWx1ZXMgaW4gbWFwcGluZyBmb3VuZAorICAgIGtFcGxTcmRvRGF0YUVycm9yICAgICAgICAgICA9IDB4MDExMSwgICAgICAgLy8gZGF0YSBvZiBDQU4gbWVzc2FnZXMgYXJlIG5vdCBpbnZlcnMKKyAgICBrRXBsU3Jkb0xlbmd0aEV4Y2VlZGVkICAgICAgPSAweDAxMTIsICAgICAgIC8vIGxlbmd0aCBvZiBTUkRPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYml0IHBlciBDQU4tbWVzc2FnZQorICAgIGtFcGxTcmRvTm90SGFuZGxlZEluQXBwICAgICA9IDB4MDExMywgICAgICAgLy8gdGhlIFNSRE8gZXJyb3Igd2FzIG5vdCBoYW5kbGVkIGluIEFwcFNyZG9FcnJvcigpCisgICAga0VwbFNyZG9PdmVycnVuICAgICAgICAgICAgID0gMHgwMTE0ICAgICAgICAvLyBhIFJ4U1JETyB3YXMgcmVjZWl2ZWQgYnV0IHRoZSBwZXZpb3VzIG9uZSB3YXMgbm90IGVsc2UgcHJvY2Vzc2VkCisqLworCisJa0VwbEFwaVRhc2tEZWZlcnJlZCA9IDB4MDE0MCwJLy8gRVBMIHBlcmZvcm1zIHRhc2sgaW4gYmFja2dyb3VuZCBhbmQgaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gKG9yIHZpY2UtdmVyc2EpLCB3aGVuIGl0IGlzIGZpbmlzaGVkCisJa0VwbEFwaUludmFsaWRQYXJhbSA9IDB4MDE0MiwJLy8gcGFzc2VkIGludmFsaWQgcGFyYW1ldGVycyB0byBhIGZ1bmN0aW9uIChlLmcuIGludmFsaWQgbm9kZSBpZCkKKworCS8vIGFyZWEgdW50aWxsIDB4MDdGRiBpcyByZXNlcnZlZAorCS8vIGFyZWEgZm9yIHVzZXIgYXBwbGljYXRpb24gZnJvbSAweDA4MDAgdG8gMHg3RkZGCisKK30gdEVwbEtlcm5lbDsKKworI2VuZGlmCisvL0VPRgorCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJvckhhbmRsZXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jCkBAIC0wLDAgKzEsODEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGVycm9yIGhhbmRsZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyb3JIYW5kbGVyay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMDIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiRXBsTm10LmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCS8vIGZ1bmN0aW9uIHByb3RvdHlwcyBvZiB0aGUgRXBsT0JELU1vZHVsCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIEVycm9ySGFuZGxlciBtb2R1bGUgbmVlZHMgRVBMIG1vZHVsZSBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQgbV9kd0N1bXVsYXRpdmVDbnQ7CS8vIHN1YmluZGV4IDEKKwlEV09SRCBtX2R3VGhyZXNob2xkQ250OwkvLyBzdWJpbmRleCAyCisJRFdPUkQgbV9kd1RocmVzaG9sZDsJLy8gc3ViaW5kZXggMworCit9IHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9Dbkxvc3NTb2M7CS8vIG9iamVjdCAweDFDMEIKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuTG9zc1ByZXE7CS8vIG9iamVjdCAweDFDMEQKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuQ3JjRXJyOwkvLyBvYmplY3QgMHgxQzBGCisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9NbkNyY0VycjsJLy8gb2JqZWN0IDB4MUMwMAorCXRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyIG1fTW5DeWNUaW1lRXhjZWVkOwkvLyBvYmplY3QgMHgxQzAyCisJRFdPUkQgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnRbMjU0XTsJLy8gb2JqZWN0IDB4MUMwNworCURXT1JEIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250WzI1NF07CS8vIG9iamVjdCAweDFDMDgKKwlEV09SRCBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFsyNTRdOwkvLyBvYmplY3QgMHgxQzA5CisJQk9PTCBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbMjU0XTsKKyNlbmRpZgorCit9IHRFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRXJyb3JIYW5kbGVya0luc3RhbmNlIEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIodEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIKKwkJCQkJCSAgICogcEVycm9yQ291bnRlcl9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FcnJvci1IYW5kbGVyPiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IG9ubHkgZXZlbnQgdmFyaWFibGUsCisJLy8gYWxsIG90aGVyIGluc3RhbmNlIG1lbWJlcnMgYXJlIHJlc2V0IGJ5IE9EIG9yIG1heSBrZWVwIHRoZWlyIGN1cnJlbnQgdmFsdWUKKwkvLyBkLmsuOiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGN1bXVsYXRpdmUgY291bnRlcnMsIHdoaWNoIHNoYWxsIG5vdCBiZSByZXNldAorCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyA9IDA7CisKKwkvLyBsaW5rIGNvdW50ZXJzIHRvIE9ECisJLy8gJCQkIGQuay4gaWYgT0QgcmVzaWRlcyBpbiB1c2Vyc3BhY2UsIGZldGNoIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwKKwkvLyAgICAgICAgICB3aGljaCBzaGFsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgaW5zdGFuY2UgKG5lZWRzIHRvIGJlIGRlY2xhcmVkIGdsb2JhbGx5KS4KKwkvLyAgICAgICAgICBPdGhlciBpZGVhOiBlcnJvciBjb3VudGVyIHNoYWxsIGJlbG9uZyB0byB0aGUgcHJvY2VzcyBpbWFnZQorCS8vICAgICAgICAgIChyZXNldCBvZiBjb3VudGVycyBieSBTRE8gd3JpdGUgYXJlIGEgbGl0dGxlIGJpdCB0cmlja3kpLgorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fQ25Mb3NzU29jLCAweDFDMEIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuTG9zc1ByZXEsIDB4MUMwRCk7CisJLy8gaWdub3JlIHJldHVybiBjb2RlLCBiZWNhdXNlIG9iamVjdCAweDFDMEQgaXMgY29uZGl0aW9uYWwKKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuQ3JjRXJyLCAweDFDMEYpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DcmNFcnIsIDB4MUMwMCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DeWNUaW1lRXhjZWVkLCAweDFDMDIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJICAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQsCisJCQkJICAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudCksCisJCQkJICAgICAgMHgxQzA3KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250LAorCQkJCSAgICAgIHRhYmVudHJpZXMoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQpLAorCQkJCSAgICAgIDB4MUMwOCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtBcnJheShFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkgICAgICBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZCwKKwkJCQkgICAgICB0YWJlbnRyaWVzKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJIG1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkKSwKKwkJCQkgICAgICAweDFDMDkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZSBpbnN0YW5jZSBhbiBmcmVlIHRoZSBidWZmZXJzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXJyb3IgZXZlbnRzIGZyb20gRExMCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgbG9uZyB1bERsbEVycm9yRXZlbnRzOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIG1fRXZlbnRUeXBlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxFcnJvcjoKKwkJeworCQkJdEVwbEVycm9ySGFuZGxlcmtFdmVudCAqcEVyckhhbmRsZXJFdmVudCA9CisJCQkgICAgKHRFcGxFcnJvckhhbmRsZXJrRXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZzsKKworCQkJdWxEbGxFcnJvckV2ZW50cyA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWxEbGxFcnJvckV2ZW50czsKKworCQkJLy8gY2hlY2sgdGhlIHNldmVyYWwgZXJyb3IgZXZlbnRzCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9MT1NTX1NPQykgIT0gMCkpIHsJLy8gbG9zcyBvZiBTb0MgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1NvYy5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0xPU1NfU09DX1RICisKKwkJCQkJLy8gcG9zdCBldmVudCB0byBOTVQgc3RhdGUgbWFjaGluZQorCQkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCSAgICAgbV9kd1RocmVzaG9sZCA+IDApCisJCQkgICAgJiYgKCh1bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19QUkVRKSAhPSAwKSkgewkvLyBsb3NzIG9mIFBSZXEgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9MT1NTX1BSRVFfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkgICAgIG1fZHdUaHJlc2hvbGRDbnQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVEpICE9IDApKSB7CS8vIFBSZXEgY29ycmVjdGx5IHJlY2VpdmVkCisJCQkJLy8gZGVjcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQtLTsKKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fQ1JDOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVCkgIT0gMCkgewkvLyBpbnZhbGlkIGZvcm1hdCBlcnJvciBvY2N1cmVkIChvbmx5IGRpcmVjdCByZWFjdGlvbikKKwkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9JTlZBTElEX0ZPUk1BVAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlpZiAocEVyckhhbmRsZXJFdmVudC0+bV9ObXRTdGF0ZSA+PSBrRXBsTm10TXNOb3RBY3RpdmUpIHsJLy8gTU4gaXMgYWN0aXZlCisJCQkJCWlmIChwRXJySGFuZGxlckV2ZW50LT5tX3VpTm9kZUlkICE9IDApIHsKKwkJCQkJCXRFcGxIZWFydGJlYXRFdmVudAorCQkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50OworCisJCQkJCQkvLyByZW1vdmUgbm9kZSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtEZWxldGVOb2RlCisJCQkJCQkgICAgKHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgICBtX3VpTm9kZUlkKTsKKworCQkJCQkJLy8gaW5mb3JtIE5tdE1udSBtb2R1bGUgYWJvdXQgc3RhdGUgY2hhbmdlLCB3aGljaCBzaGFsbCBzZW5kIE5NVCBjb21tYW5kIFJlc2V0Tm9kZSB0byB0aGlzIENOCisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBwRXJySGFuZGxlckV2ZW50LT4KKwkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJCQkgICAga0VwbE5tdENzTm90QWN0aXZlOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0KKwkJCQkJCSAgICBFUExfRV9ETExfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIGFuZCBlbHNlIHNob3VsZCBsZWFkIHRvIEludGVybkNvbUVycm9yCisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl7CS8vIENOIGlzIGFjdGl2ZQorCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ1JDOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSAhPSAwKSkgewkvLyBjeWNsZSB0aW1lIGV4Y2VlZGVkIGV2ZW50IG9jY3VyZWQKKwkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJCSAgICBtX2R3VGhyZXNob2xkQ250ICs9IDg7CisJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLm1fZHdUaHJlc2hvbGRDbnQgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DWUNMRV9FWENFRURfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQkvLyAkJCQgZC5rLjogZWxzZSBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NZQ0xFX0VYQ0VFRAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMpICE9IDApIHsJLy8gQ04gbG9zcyBQUmVzIGV2ZW50IG9jY3VyZWQKKwkJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCQl1aU5vZGVJZCA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWlOb2RlSWQgLSAxOworCQkJCWlmICgodWlOb2RlSWQgPAorCQkJCSAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCW1fYWR3TW5Dbkxvc3NQcmVzQ3VtQ250KSkKKwkJCQkgICAgJiYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQltX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFt1aU5vZGVJZF0gPgorCQkJCQkwKSkgeworCQkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudFt1aU5vZGVJZF0rKzsKKwkJCQkJLy8gaW5jcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDgKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gKz0KKwkJCQkJICAgIDg7CisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250W3VpTm9kZUlkXQorCQkJCQkgICAgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9hZHdNbkNuTG9zc1ByZXNUaHJlc2hvbGRbdWlOb2RlSWRdKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCQl0RXBsSGVhcnRiZWF0RXZlbnQKKwkJCQkJCSAgICBIZWFydGJlYXRFdmVudDsKKworCQkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkgRV9ETExfTE9TU19QUkVTX1RICisKKwkJCQkJCS8vIHJlbW92ZSBub2RlIGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZU5vZGUKKwkJCQkJCSAgICAocEVyckhhbmRsZXJFdmVudC0+CisJCQkJCQkgICAgIG1fdWlOb2RlSWQpOworCisJCQkJCQkvLyBpbmZvcm0gTm10TW51IG1vZHVsZSBhYm91dCBzdGF0ZSBjaGFuZ2UsIHdoaWNoIHNoYWxsIHNlbmQgTk1UIGNvbW1hbmQgUmVzZXROb2RlIHRvIHRoaXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlID0KKwkJCQkJCSAgICBrRXBsTm10Q3NOb3RBY3RpdmU7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3dFcnJvckNvZGUgPQorCQkJCQkJICAgIEVQTF9FX0RMTF9MT1NTX1BSRVNfVEg7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbdWlOb2RlSWRdID0KKwkJCQkJICAgIFRSVUU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1UIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ6CisJCXsKKwkJCWlmICgoKih0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2EpIHsJLy8gU29BIGV2ZW50IG9mIENOIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKworCQkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MpID09IDApIHsJLy8gZGVjcmVtZW50IGxvc3Mgb2YgU29DIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25Mb3NzU29jLm1fZHdUaHJlc2hvbGRDbnQgPiAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX0NuTG9zc1NvYy4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fQ25DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCQkJfQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWVsc2UgaWYgKCgqKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PSBrRXBsTm10RXZlbnREbGxNZVNvYVNlbnQpIHsJLy8gU29BIGV2ZW50IG9mIE1OIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKwkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQkJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJCQkJUmV0ID0gRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8oJnBJbnROb2RlSW5mbyk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgbGlzdAorCQkJCXdoaWxlIChwSW50Tm9kZUluZm8gIT0gTlVMTCkgeworCQkJCQl1aU5vZGVJZCA9IHBJbnROb2RlSW5mby0+bV91aU5vZGVJZCAtIDE7CisJCQkJCWlmICh1aU5vZGVJZCA8CisJCQkJCSAgICB0YWJlbnRyaWVzCisJCQkJCSAgICAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQpKSB7CisJCQkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hZk1uQ25Mb3NzUHJlc0V2ZW50CisJCQkJCQkgICAgW3VpTm9kZUlkXSA9PSBGQUxTRSkgeworCQkJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gPiAwKSB7CisJCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQKKwkJCQkJCQkJICAgIFt1aU5vZGVJZF0tLTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnQKKwkJCQkJCQkgICAgW3VpTm9kZUlkXSA9IEZBTFNFOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXBJbnROb2RlSW5mbyA9CisJCQkJCSAgICBwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbzsKKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fTW5DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fTW5DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSA9PSAwKSB7CS8vIGRlY3JlbWVudCBjeWNsZSBleGNlZWQgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZENudCA+CisJCQkJCSAgICAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgZXJyb3IgZXZlbnRzCisJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgPSAwTDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bmtub3duIHR5cGUKKwlkZWZhdWx0OgorCQl7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50VHlwZSkKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyCisJCQkJCQkgICAqIHBFcnJvckNvdW50ZXJfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd0N1bXVsYXRpdmVDbnQ7CisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gMHgwMTsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd1RocmVzaG9sZENudDsKKwlWYXJQYXJhbS5tX1NpemUgPSBzaXplb2YoRFdPUkQpOworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlWYXJQYXJhbS5tX3VpU3ViaW5kZXggPSAweDAyOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCVJldCA9IEVwbE9iZERlZmluZVZhcigmVmFyUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclBhcmFtLm1fcERhdGEgPSAmcEVycm9yQ291bnRlcl9wLT5tX2R3VGhyZXNob2xkOworCVZhclBhcmFtLm1fU2l6ZSA9IHNpemVvZihEV09SRCk7CisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDM7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisJUmV0ID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCUJZVEUgYkluZGV4RW50cmllczsKKworCUVudHJ5U2l6ZSA9ICh0RXBsT2JkU2l6ZSkgc2l6ZW9mKGJJbmRleEVudHJpZXMpOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSh1aUluZGV4X3AsCisJCQkgICAgICAweDAwLCAodm9pZCBHRU5FUklDICopJmJJbmRleEVudHJpZXMsICZFbnRyeVNpemUpOworCisJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHx8IChiSW5kZXhFbnRyaWVzID09IDB4MDApKSB7CisJCS8vIE9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGludmFsaWQgZW50cnkgbnVtYmVyCisJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKGJJbmRleEVudHJpZXMgPCB1aVZhbHVlQ291bnRfcCkgeworCQl1aVZhbHVlQ291bnRfcCA9IGJJbmRleEVudHJpZXM7CisJfQorCisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisKKwlmb3IgKFZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDE7CisJICAgICBWYXJQYXJhbS5tX3VpU3ViaW5kZXggPD0gdWlWYWx1ZUNvdW50X3A7IFZhclBhcmFtLm1fdWlTdWJpbmRleCsrKSB7CisJCVZhclBhcmFtLm1fcERhdGEgPSBwZHdWYWx1ZV9wOworCQlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCXBkd1ZhbHVlX3ArKzsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkYzFiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnQuaApAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgZXZlbnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5UX0hfCisjZGVmaW5lIF9FUExfRVZFTlRfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbE5tdC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gbmFtZSBhbmQgc2l6ZSBvZiBldmVudCBxdWV1ZXMKKyNkZWZpbmUgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSICAgIlNoYktlcm5lbFRvVXNlciIKKyNpZm5kZWYgRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSCisjZGVmaW5lIEVQTF9FVkVOVF9TSVpFX1NIQl9LRVJORUxfVE9fVVNFUiAgIDMyNzY4CS8vIDMyIGtCeXRlCisjZW5kaWYKKworI2RlZmluZSBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwgICAiU2hiVXNlclRvS2VybmVsIgorI2lmbmRlZiBFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwKKyNkZWZpbmUgRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMICAgMzI3NjgJLy8gMzIga0J5dGUKKyNlbmRpZgorCisvLyBtYXggc2l6ZSBvZiBldmVudCBhcmd1bWVudAorI2lmbmRlZiBFUExfTUFYX0VWRU5UX0FSR19TSVpFCisjZGVmaW5lIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkUgICAgICAyNTYJLy8gYmVjYXVzZSBvZiBQRE8KKyNlbmRpZgorCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NSQyAgICAgICAgICAgMHgwMDAwMDAwMUwJLy8gb2JqZWN0IDB4MUMwMAorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DT0xMSVNJT04gICAgIDB4MDAwMDAwMDJMCS8vIG9iamVjdCAweDFDMDEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fQ1lDVElNRUVYQ0VFRCAweDAwMDAwMDA0TAkvLyBvYmplY3QgMHgxQzAyCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfTElOSyAgICAgMHgwMDAwMDAwOEwJLy8gb2JqZWN0IDB4MUMwMworI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MQVRFX1BSRVMgIDB4MDAwMDAwMTBMCS8vIG9iamVjdHMgMHgxQzA0LTB4MUMwNgorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMgIDB4MDAwMDAwODBMCS8vIG9iamVjdHMgMHgxQzA3LTB4MUMwOQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DT0xMSVNJT04gICAgIDB4MDAwMDA0MDBMCS8vIG9iamVjdCAweDFDMEEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MgICAgICAweDAwMDAwODAwTAkvLyBvYmplY3QgMHgxQzBCCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BICAgICAgMHgwMDAwMTAwMEwJLy8gb2JqZWN0IDB4MUMwQworI2RlZmluZSBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVEgICAgIDB4MDAwMDIwMDBMCS8vIG9iamVjdCAweDFDMEQKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fUkVDVkRfUFJFUSAgICAweDAwMDA0MDAwTAkvLyBkZWNyZW1lbnQgb2JqZWN0IDB4MUMwRC8yCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX1NPQ19KSVRURVIgICAgMHgwMDAwODAwMEwJLy8gb2JqZWN0IDB4MUMwRQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DUkMgICAgICAgICAgIDB4MDAwMTAwMDBMCS8vIG9iamVjdCAweDFDMEYKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19MSU5LICAgICAweDAwMDIwMDAwTAkvLyBvYmplY3QgMHgxQzEwCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfU1RBVFJFUyAgMHgwMDA0MDAwMEwJLy8gb2JqZWN0cyAweDFDMTUtMHgxQzE3IChzaG91bGQgYmUgb3BlcmF0ZWQgYnkgTm10TW51IG1vZHVsZSkKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQkFEX1BIWVNfTU9ERSAgICAweDAwMDgwMDAwTAkvLyBubyBvYmplY3QKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTUFDX0JVRkZFUiAgICAgICAweDAwMTAwMDAwTAkvLyBubyBvYmplY3QgKE5NVF9HVDYpCisjZGVmaW5lIEVQTF9ETExfRVJSX0lOVkFMSURfRk9STUFUICAgMHgwMDIwMDAwMEwJLy8gbm8gb2JqZWN0IChOTVRfR1Q2KQorI2RlZmluZSBFUExfRExMX0VSUl9BRERSRVNTX0NPTkZMSUNUIDB4MDA0MDAwMDBMCS8vIG5vIG9iamVjdCAocmVtb3ZlIENOIGZyb20gY29uZmlndXJhdGlvbikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEV2ZW50VHlwZSBkZXRlcm1pbmVzIHRoZSBhcmd1bWVudCBvZiB0aGUgZXZlbnQKK3R5cGVkZWYgZW51bSB7CisJa0VwbEV2ZW50VHlwZU5tdEV2ZW50ID0gMHgwMSwJLy8gTk1UIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbE5tdEV2ZW50CisJa0VwbEV2ZW50VHlwZVBkb1J4ID0gMHgwMiwJLy8gUERPIGZyYW1lIHJlY2VpdmVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisJa0VwbEV2ZW50VHlwZVBkb1R4ID0gMHgwMywJLy8gUERPIGZyYW1lIHRyYW5zbWl0dGVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lSW5mbworCWtFcGxFdmVudFR5cGVQZG9Tb2EgPSAweDA0LAkvLyBTb0EgZnJhbWUgcmVjZWl2ZWQgZXZlbnQgKGlzb2Nocm9ub3VzIHBoYXNlIGNvbXBsZXRlZCkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZVN5bmMgPSAweDA1LAkvLyBTeW5jIGV2ZW50IChlLmcuIFNvQyBvciBhbnRpY2lwYXRlZCBTb0MpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gbm90aGluZworCWtFcGxFdmVudFR5cGVUaW1lciA9IDB4MDYsCS8vIFRpbWVyIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbFRpbWVyRXZlbnRBcmcKKwlrRXBsRXZlbnRUeXBlSGVhcnRiZWF0ID0gMHgwNywJLy8gSGVhcnRiZWF0IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEhlYXJ0YmVhdEV2ZW50CisJa0VwbEV2ZW50VHlwZURsbGtDcmVhdGUgPSAweDA4LAkvLyBETEwga2VybmVsIGNyZWF0ZSBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRoZSBuZXcgdEVwbE5tdFN0YXRlCisJa0VwbEV2ZW50VHlwZURsbGtEZXN0cm95ID0gMHgwOSwJLy8gRExMIGtlcm5lbCBkZXN0cm95IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdGhlIG9sZCB0RXBsTm10U3RhdGUKKwlrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeCA9IDB4MEEsCS8vIERMTCBrZXJuZWwgZmlsbCBUeEJ1ZmZlciBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5CisJa0VwbEV2ZW50VHlwZURsbGtQcmVzUmVhZHkgPSAweDBCLAkvLyBETEwga2VybmVsIFBSZXMgcmVhZHkgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZUVycm9yID0gMHgwQywJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudEVycm9yCisJa0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlID0gMHgwRCwJLy8gaW5kaWNhdGUgY2hhbmdlIG9mIE5NVC1TdGF0ZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJa0VwbEV2ZW50VHlwZURsbEVycm9yID0gMHgwRSwJLy8gRExMIGVycm9yIGV2ZW50IGZvciBFcnJvciBoYW5kbGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEVycm9ySGFuZGxlcmtFdmVudAorCWtFcGxFdmVudFR5cGVBc25kUnggPSAweDBGLAkvLyByZWNlaXZlZCBBU25kIGZyYW1lIGZvciBETEwgdXNlciBtb2R1bGUKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWUKKwlrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXIgPSAweDEwLAkvLyBjb25maWd1cmUgU2VydmljZUlkRmlsdGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbFNlcnZpY2VJZEZpbHRlcgorCWtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHkgPSAweDExLAkvLyBjb25maWd1cmUgSWRlbnRpdHkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsSWRlbnRQYXJhbQorCWtFcGxFdmVudFR5cGVEbGxrQ29uZmlnID0gMHgxMiwJLy8gY29uZmlndXJlIENvbmZpZ1BhcmFtCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENvbmZpZ1BhcmFtCisJa0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcSA9IDB4MTMsCS8vIGlzc3VlIElkZW50L1N0YXR1cyByZXF1ZXN0CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbElzc3VlUmVxdWVzdAorCWtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSA9IDB4MTQsCS8vIGFkZCBub2RlIHRvIGlzb2Nocm9ub3VzIHBoYXNlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbE5vZGVJbmZvCisJa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlID0gMHgxNSwJLy8gcmVtb3ZlIG5vZGUgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGUgPSAweDE2LAkvLyByZW1vdmUgbm9kZSBzb2Z0bHkgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGUgPSAweDE3LAkvLyBzdGFydCByZWR1Y2VkIEVQTCBjeWNsZSBvbiBNTgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIG5vdGhpbmcKKwlrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudCA9IDB4MTgsCS8vIE5NVCBjb21tYW5kIHdhcyBhY3R1YWxseSBzZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisKK30gdEVwbEV2ZW50VHlwZTsKKworLy8gRXZlbnRTaW5rIGRldGVybWluZXMgdGhlIGNvbnN1bWVyIG9mIHRoZSBldmVudAordHlwZWRlZiBlbnVtIHsKKwlrRXBsRXZlbnRTaW5rU3luYyA9IDB4MDAsCS8vIFN5bmMgZXZlbnQgZm9yIGFwcGxpY2F0aW9uIG9yIGtlcm5lbCBFUEwgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdGsgPSAweDAxLAkvLyBldmVudHMgZm9yIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGsgPSAweDAyLAkvLyBldmVudHMgZm9yIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbHVDYWwgPSAweDAzLAkvLyBldmVudHMgZm9yIERsbHVDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGtDYWwgPSAweDA0LAkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua1Bkb2sgPSAweDA1LAkvLyBldmVudHMgZm9yIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdHUgPSAweDA2LAkvLyBldmVudHMgZm9yIE5tdHUgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycmsgPSAweDA3LAkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycnUgPSAweDA4LAkvLyBldmVudHMgZm9yIEVycm9yIHNpZ25hbGluZyBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rU2RvQXN5U2VxID0gMHgwOSwJLy8gZXZlbnRzIGZvciBhc3luY3Jvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdE1udSA9IDB4MEEsCS8vIGV2ZW50cyBmb3IgTm10TW51IG1vZHVsZQorCWtFcGxFdmVudFNpbmtMZWR1ID0gMHgwQiwJLy8gZXZlbnRzIGZvciBMZWR1IG1vZHVsZQorCWtFcGxFdmVudFNpbmtBcGkgPSAweDBGLAkvLyBldmVudHMgZm9yIEFQSSBtb2R1bGUKKworfSB0RXBsRXZlbnRTaW5rOworCisvLyBFdmVudFNvdXJjZSBkZXRlcm1pbmVzIHRoZSBzb3VyY2Ugb2YgYW4gZXJyb3JldmVudAordHlwZWRlZiBlbnVtIHsKKwkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJa0VwbEV2ZW50U291cmNlRGxsayA9IDB4MDEsCS8vIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlTm10ayA9IDB4MDIsCS8vIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkayA9IDB4MDMsCS8vIE9iZGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlUGRvayA9IDB4MDQsCS8vIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlVGltZXJrID0gMHgwNSwJLy8gVGltZXJrIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUV2ZW50ayA9IDB4MDYsCS8vIEV2ZW50ayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTeW5jQ2IgPSAweDA3LAkvLyBzeW5jLUNiCisJa0VwbEV2ZW50U291cmNlRXJyayA9IDB4MDgsCS8vIEVycm9yIGhhbmRsZXIgbW9kdWxlCisKKwkvLyB1c2Vyc3BhY2UgbW9kdWxlcworCWtFcGxFdmVudFNvdXJjZURsbHUgPSAweDEwLAkvLyBEbGx1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdHUgPSAweDExLAkvLyBObXR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdENudSA9IDB4MTIsCS8vIE5tdENudSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VObXRNbnUgPSAweDEzLAkvLyBObXRNbnUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkdSA9IDB4MTQsCS8vIE9iZHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvVWRwID0gMHgxNSwJLy8gU2RvL1VkcCBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTZG9Bc25kID0gMHgxNiwJLy8gU2RvL0FzbmQgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvQXN5U2VxID0gMHgxNywJLy8gU2RvIGFzeW5jaHJvbnVzIFNlcXVlbmNlIExheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVNkb0NvbSA9IDB4MTgsCS8vIFNkbyBjb21tYW5kIGxheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVRpbWVydSA9IDB4MTksCS8vIFRpbWVydSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VDZmdNYXUgPSAweDFBLAkvLyBDZmdNYXUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlRXZlbnR1ID0gMHgxQiwJLy8gRXZlbnR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUVwbEFwaSA9IDB4MUMsCS8vIEFwaSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VMZWR1ID0gMHgxRCwJLy8gTGVkdSBtb2R1bGUKKworfSB0RXBsRXZlbnRTb3VyY2U7CisKKy8vIHN0cnVjdHVyZSBvZiBFUEwgZXZlbnQgKGVsZW1lbnQgb3JkZXIgbXVzdCBub3QgYmUgY2hhbmdlZCEpCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEV2ZW50VHlwZSBtX0V2ZW50VHlwZSAvKjoyOCAqLyA7CS8vIGV2ZW50IHR5cGUKKwl0RXBsRXZlbnRTaW5rIG1fRXZlbnRTaW5rIC8qOjQgKi8gOwkvLyBldmVudCBzaW5rCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyB0aW1lc3RhbXAKKwl1bnNpZ25lZCBpbnQgbV91aVNpemU7CS8vIHNpemUgb2YgYXJndW1lbnQKKwl2b2lkICptX3BBcmc7CQkvLyBhcmd1bWVudCBvZiBldmVudAorCit9IHRFcGxFdmVudDsKKworLy8gc2hvcnQgc3RydWN0dXJlIG9mIEVQTCBldmVudCB3aXRob3V0IGFyZ3VtZW50IGFuZCBpdHMgc2l6ZSAoZWxlbWVudCBvcmRlciBtdXN0IG5vdCBiZSBjaGFuZ2VkISkKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRUeXBlIG1fRXZlbnRUeXBlIC8qOjI4ICovIDsJLy8gZXZlbnQgdHlwZQorCXRFcGxFdmVudFNpbmsgbV9FdmVudFNpbmsgLyo6NCAqLyA7CS8vIGV2ZW50IHNpbmsKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIHRpbWVzdGFtcAorCit9IHRFcGxFdmVudFNob3J0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgbV91aVN1YkluZGV4OworCit9IHRFcGxFdmVudE9iZEVycm9yOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVFcnJvcgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxFdmVudFNvdXJjZSBtX0V2ZW50U291cmNlOwkvLyBtb2R1bGUgd2hpY2ggcG9zdGVkIHRoaXMgZXJyb3IgZXZlbnQKKwl0RXBsS2VybmVsIG1fRXBsRXJyb3I7CS8vIEVQTCBlcnJvciB3aGljaCBvY2N1cmVkCisJdW5pb24geworCQlCWVRFIG1fYkFyZzsKKwkJRFdPUkQgbV9kd0FyZzsKKwkJdEVwbEV2ZW50U291cmNlIG1fRXZlbnRTb3VyY2U7CS8vIGZyb20gRXZlbnRrL3UgbW9kdWxlIChvcmlnaW5hdGluZyBlcnJvciBzb3VyY2UpCisJCXRFcGxFdmVudE9iZEVycm9yIG1fT2JkRXJyb3I7CS8vIGZyb20gT2JkIG1vZHVsZQorLy8gICAgICAgIHRFcGxFcnJIaXN0b3J5RW50cnkgICAgIG1fSGlzdG9yeUVudHJ5OyAvLyBmcm9tIE5tdGsvdSBtb2R1bGUKKworCX0gbV9Bcmc7CisKK30gdEVwbEV2ZW50RXJyb3I7CisKKy8vIHN0cnVjdHVyZSBmb3Iga0VwbEV2ZW50VHlwZURsbEVycm9yCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CS8vIEVQTF9ETExfRVJSXyoKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsKKworfSB0RXBsRXJyb3JIYW5kbGVya0V2ZW50OworCisvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgaW5mb3JtZWQgYWJvdXQgc3luYyBldmVudAordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTeW5jQ2IpICh2b2lkKTsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGdlbmVyaWMgZXZlbnRzCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFByb2Nlc3NFdmVudENiKSAodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2OGE2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLUtlcm5lbHNwYWNlLUV2ZW50LU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnRrLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNlbmRpZgorCisjaWZkZWYgRVBMX05PX0ZJRk8KKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2Vsc2UKKworI2VuZGlmCisJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKKwl1bnNpZ25lZCBpbnQgbV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudDsKKworfSB0RXBsRXZlbnRrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEV2ZW50a0luc3RhbmNlIEVwbEV2ZW50a0luc3RhbmNlX2c7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGluY29taW5nIGV2ZW50cworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtS2VybmVsc3BhY2UtRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuQ2JTeW5jX3AgPSBjYWxsYmFjay1mdW5jdGlvbiBmb3Igc3luYyBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0luaXQodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50a0FkZEluc3RhbmNlKHBmbkNiU3luY19wKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWRkcyBvbmUgbW9yZSBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5DYlN5bmNfcCA9IGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBzeW5jIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrQWRkSW5zdGFuY2UodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKKworCS8vIHNhdmUgY2ItZnVuY3Rpb24KKwlFcGxFdmVudGtJbnN0YW5jZV9nLm1fcGZuQ2JTeW5jID0gcGZuQ2JTeW5jX3A7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgorCS8vIGtlcm5lbCAtPiB1c2VyCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtzaGJQcmlvcml0eUhpZ2gpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0FkZEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgaW5zdGFuY2UgYW5kIGZyZWVzIHRoZSBidWZmZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UgPSBOVUxMOworCX0KKworCS8vIGZyZWUgYnVmZmVyICBLZXJuZWwgLT4gVXNlcgorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UgPSBOVUxMOworCX0KKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IEtlcm5lbHRocmVhZCB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZXJyb3IgaGFuZGxpbmcgaWYgZXZlbnQgcXVldWUgaXMgZnVsbAorCWlmIChFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPiAwKSB7CS8vIFVzZXJUb0tlcm5lbCBldmVudCBxdWV1ZSBoYXMgcnVuIG91dCBvZiBzcGFjZSAtPiBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJdEVwbEV2ZW50IEV2ZW50OworCQl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisjZW5kaWYKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwkJLy8gZGlyZWN0bHkgY2FsbCBOTVRrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UgZXZlbnQgcXVldWUgaXMgZnVsbAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCVJldCA9IEVwbE5tdGtQcm9jZXNzKCZFdmVudCk7CisjZW5kaWYKKworCQkvLyBOTVQgc3RhdGUgbWFjaGluZSBjaGFuZ2VkIHRvIHJlc2V0IChpLmUuIE5NVF9HU19SRVNFVF9DT01NVU5JQ0FUSU9OKQorCQkvLyBub3csIGl0IGlzIHNhZmUgdG8gcmVzZXQgdGhlIGNvdW50ZXIgYW5kIGVtcHR5IHRoZSBldmVudCBxdWV1ZQorI2lmbmRlZiBFUExfTk9fRklGTworCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJSZXNldEJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLCAxMDAwLCBOVUxMKTsKKyNlbmRpZgorCisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCA9IDA7CisJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIyKTsKKworCQkvLyBhbHNvIGRpc2NhcmQgdGhlIGN1cnJlbnQgZXZlbnQgKGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIGxvc2UgYW5vdGhlciBldmVudCkKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwkJeworCQkJaWYgKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMgIT0gTlVMTCkgeworCQkJCVJldCA9IEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMoKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkJLy8gbWFyayBUUERPcyBhcyB2YWxpZAorCQkJCQlSZXQgPSBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChUUlVFKTsKKyNlbmRpZgorCQkJCX0gZWxzZSBpZiAoKFJldCAhPSBrRXBsUmVqZWN0KQorCQkJCQkgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTeW5jQ2I7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1ULUtlcm5lbC1Nb2R1bAorCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJCQlSZXQgPSBFcGxObXRrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCWlmICgocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVObXRFdmVudCkKKwkJCSAgICAmJgorCQkJICAgICgoKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpID09CisJCQkgICAgICBrRXBsTm10RXZlbnREbGxDZVNvYSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkgICAgIHx8ICgqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0KKwkJCQkga0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50KQorI2VuZGlmCisJCQkgICAgKSkgewkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBlcnJvciBoYW5kbGVyCisJCQkJUmV0ID0gRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3MocEV2ZW50X3ApOworCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkJCSAgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnRrUG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnRrLCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBQRE8gbW9kdWxlCisJCQkJcEV2ZW50X3AtPm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKKwkJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKyNlbmRpZgorCisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy8gZXZlbnRzIGZvciBEbGxrIG1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGxrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtDYWxQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbGs7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vCisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwkJeworCQkJLy8gUERPLU1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VQZG9rOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKKwkJeworCQkJLy8gb25seSBjYWxsIGVycm9yIGhhbmRsZXIgaWYgRExMIGlzIHByZXNlbnQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUG9zdAorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGludCBmQnVmZmVyQ29tcGxldGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHRoZSBldmVudCBtdXN0IGJlIHBvc3RlZCBieSB1c2luZyB0aGUgYWJCdWZmZXIKKwkvLyBpdCBpcyBuZWVkZSBiZWNhdXNlIHRoZSBBcmd1bWVudCBtdXN0IGJ5IGNvcGllZAorCS8vIHRvIHRoZSBidWZmZXIgdG9vIGFuZCBub3Qgb25seSB0aGUgcG9pbnRlcgorCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgorCXVsRGF0YVNpemUgPQorCSAgICBzaXplb2YodEVwbEV2ZW50KSArCisJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOworI2VuZGlmCisKKwkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFNpbmspIHsKKwkJLy8ga2VybmVsc3BhY2UgbW9kdWxlcworCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10azoKKwljYXNlIGtFcGxFdmVudFNpbmtEbGxrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCUJFTkNITUFSS19NT0RfMjdfU0VUKDIpOworCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCXN3aXRjaCAoU2hiRXJyb3IpIHsKKwkJCWNhc2Uga1NoYk9rOgorCQkJCWJyZWFrOworCisJCQljYXNlIGtTaGJCdWZmZXJGdWxsOgorCQkJCXsKKwkJCQkJRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQrKzsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgyKTsKKworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXR1OgorCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwkJeworI2lmbmRlZiBFUExfTk9fRklGTworCQkJLy8gcG9zdCBtZXNzYWdlCisvLyAgICAgICAgICAgIEJFTkNITUFSS19NT0RfMjdfU0VUKDMpOyAgICAvLyA3NCC1cyB1bnRpbCByZXNldAorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoSzJVKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorLy8gICAgICAgICAgICBCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDMpOyAgLy8gODIgtXMgdW50aWwgU2hiQ2lyR2V0UmVhZERhdGFTaXplKCkgaW4gRXBsRXZlbnR1CisKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1Bvc3RFcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGVycm9yIGV2ZW50IGZyb20ga2VybmVsIHBhcnQgdG8gQVBJIGxheWVyCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yIGV2ZW50CisvLyAgICAgICAgICAgICAgRXBsRXJyb3JfcCAgICAgID0gY29kZSBvZiBvY2N1cmVkIGVycm9yCisvLyAgICAgICAgICAgICAgQXJnU2l6ZV9wICAgICAgID0gc2l6ZSBvZiB0aGUgYXJndW1lbnQKKy8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZW50cyBmcm9tIHVzZXIgYW5kIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBTaGJSeEluc3RhbmNlX3AgICAgPSBJbnN0YW5jZS1wb2ludGVyIG9mIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKQoreworCXRFcGxFdmVudCAqcEVwbEV2ZW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKy8vdW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKy8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7CisJQllURSBhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCkgKyBFUExfTUFYX0VWRU5UX0FSR19TSVpFXTsKKwkvLyBkLmsuOiBhYkRhdGFCdWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIHRFcGxFdmVudCBzdHJ1Y3R1cmUKKwkvLyAgICAgICBhbmQgYmVoaW5kIHRoaXMgdGhlIGFyZ3VtZW50CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyMCk7CisKKwlCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDApOworCS8vIGNvcHkgZGF0YSBmcm9tIGV2ZW50IHF1ZXVlCisJU2hiRXJyb3IgPSBTaGJDaXJSZWFkRGF0YUJsb2NrKHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgICZhYkRhdGFCdWZmZXJbMF0sCisJCQkJICAgICAgIHNpemVvZihhYkRhdGFCdWZmZXIpLCAmdWxEYXRhU2l6ZV9wKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCS8vIGVycm9yIGdvdG8gZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc29sdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZQorCXBFcGxFdmVudCA9ICh0RXBsRXZlbnQgKikgYWJEYXRhQnVmZmVyOworCS8vIHNldCBEYXRhc2l6ZQorCXBFcGxFdmVudC0+bV91aVNpemUgPSAodWxEYXRhU2l6ZV9wIC0gc2l6ZW9mKHRFcGxFdmVudCkpOworCWlmIChwRXBsRXZlbnQtPm1fdWlTaXplID4gMCkgeworCQkvLyBzZXQgcG9pbnRlciB0byBhcmd1bWVudAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9ICZhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCldOworCX0gZWxzZSB7CisJCS8vc2V0IHBvaW50ZXIgdG8gTlVMTAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9IE5VTEw7CisJfQorCisJQkVOQ0hNQVJLX01PRF8yN19TRVQoMCk7CisJLy8gY2FsbCBwcm9jZXNzZnVuY3Rpb24KKwlFcGxFdmVudGtQcm9jZXNzKHBFcGxFdmVudCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1ZjlhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLVVzZXJzcGFjZS1FdmVudC1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsRXZlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzeVNlcXUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbExlZHUuaCIKKyNpbmNsdWRlICJCZW5jaG1hcmsuaCIKKworI2lmZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2VuZGlmCisJdEVwbFByb2Nlc3NFdmVudENiIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2I7CisKK30gdEVwbEV2ZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyNpZm5kZWYgRVBMX05PX0ZJRk8KK3N0YXRpYyB0RXBsRXZlbnR1SW5zdGFuY2UgRXBsRXZlbnR1SW5zdGFuY2VfZzsKKy8vI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21taW5nIGV2ZW50cworc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtVXNlci1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBmbkFwaVByb2Nlc3NFdmVudENiX3AgID0gZnVuY3Rpb24gcG9pbnRlciBmb3IgQVBJIGV2ZW50IGNhbGxiYWNrCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1SW5pdCh0RXBsUHJvY2Vzc0V2ZW50Q2IgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50dUFkZEluc3RhbmNlKHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wICA9IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIEFQSSBldmVudCBjYWxsYmFjaworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dUFkZEluc3RhbmNlKHRFcGxQcm9jZXNzRXZlbnRDYgorCQkJCSAgICAgICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBpbnN0YW5jZSB2YXJpYWJsZXMKKwlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgPSBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gaW5pdCBzaGFyZWQgbG9vcCBidWZmZXIKKwkvLyBrZXJuZWwgLT4gdXNlcgorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIGFuIGZyZWUgdGhlIGJ1ZmZlcnN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykgJiYgKFNoYkVycm9yICE9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzKSkgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihVMkspIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9IGVsc2UgeworCQlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlID0gTlVMTDsKKwl9CisKKwkvLyBmcmVlIGJ1ZmZlciAgS2VybmVsIC0+IFVzZXIKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSk7CisJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spICYmIChTaGJFcnJvciAhPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jcykpIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfSBlbHNlIHsKKwkJRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSA9IE5VTEw7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJCS8vIE5NVC1Vc2VyLU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJUmV0ID0gRXBsTm10dVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXR1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyBOTVQtTU4tVXNlci1Nb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJCXsKKwkJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRNbnU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApICAgXAorICAgICB8fCAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSkKKwkJLy8gZXZlbnRzIGZvciBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJCXsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTZG9Bc3lTZXE7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rTGVkdToKKwkJeworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisJCQlSZXQgPSBFcGxMZWR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUxlZHU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIGV2ZW50IGZvciBFUEwgYXBpCisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCQl7CisJCQlpZiAoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BmbkFwaVByb2Nlc3NFdmVudENiICE9IE5VTEwpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkFwaVByb2Nlc3NFdmVudENiKHBFdmVudF9wKTsKKwkJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXBsQXBpOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnR1UG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnR1LCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQl9CisKKwljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgorCQl7CisJCQlSZXQgPSBFcGxEbGx1Q2FsUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGx1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCWNhc2Uga0VwbEV2ZW50U2lua0VycnU6CisJCXsKKwkJCS8qCisJCQkgICBSZXQgPSBFcGxFcnJ1UHJvY2VzcyhwRXZlbnRfcCk7CisJCQkgICBpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKQorCQkJICAgeworCQkJICAgRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJ1OworCisJCQkgICAvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkgICBFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJICAgUmV0LAorCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCSAgICZFdmVudFNvdXJjZSk7CisJCQkgICB9CisJCQkgKi8KKwkJCWJyZWFrOworCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQb3N0CisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXZlbnRzIGZyb20gdXNlcnNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkNpckNodW5rIFNoYkNpckNodW5rOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyAyMDA2LzA4LzAzIGQuay46IEV2ZW50IGFuZCBhcmd1bWVudCBhcmUgcG9zdGVkIGFzIHNlcGFyYXRlIGNodW5rcyB0byB0aGUgZXZlbnQgcXVldWUuCisJdWxEYXRhU2l6ZSA9CisJICAgIHNpemVvZih0RXBsRXZlbnQpICsKKwkgICAgKChwRXZlbnRfcC0+bV9wQXJnICE9IE5VTEwpID8gcEV2ZW50X3AtPm1fdWlTaXplIDogMCk7CisjZW5kaWYKKworCS8vIGRlY2lkZSBpbiB3aGljaCBidWZmZXIgdGhlIGV2ZW50IGhhdmUgdG8gd3JpdGUKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgeworCQkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwljYXNlIGtFcGxFdmVudFNpbmtObXRrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgorCWNhc2Uga0VwbEV2ZW50U2lua0Vycms6CisJCXsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJCS8vIHBvc3QgbWVzc2FnZQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwljYXNlIGtFcGxFdmVudFNpbmtMZWR1OgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCisJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCisJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoSzJVKSAtPiAweCVYXG4iLAorCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgeworCQkJCVNoYkVycm9yID0KKwkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkJICZTaGJDaXJDaHVuaywKKwkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJIHBFdmVudF9wLT5tX3VpU2l6ZSwKKwkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQorCQkJCSAgICB8fCAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkpIHsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkJICAgICBTaGJFcnJvcik7CisJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UG9zdEVycm9yCisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3JldmVudCBmcm9tIHVzZXJzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yZXZlbnQKKy8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICA9IGNvZGUgb2Ygb2NjdXJlZCBlcnJvcgorLy8gICAgICAgICAgICAgIHVpQXJnU2l6ZV9wICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50CisvLyAgICAgICAgICAgICAgcEFyZ19wICAgICAgICAgID0gcG9pbnRlciB0byB0aGUgYXJndW1lbnQKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZXRzIGZyb20ga2VybmVsc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBmb3IgYnVmZmVyCisvLyAgICAgICAgICAgICAgdWxEYXRhU2l6ZV9wICAgICAgICA9IHNpemUgb2YgZGF0YQorLy8KKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEVQTF9OT19GSUZPCitzdGF0aWMgdm9pZCBFcGxFdmVudHVSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7CisJdEVwbEV2ZW50ICpwRXBsRXZlbnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworLy91bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworLy91bnNpZ25lZCBsb25nICAgdWxEYXRhU2l6ZTsKKwlCWVRFIGFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KSArIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQorCS8vICAgICAgIGFuZCBiZWhpbmQgdGhpcyB0aGUgYXJndW1lbnQKKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIxKTsKKworLy8gZC5rLiBub3QgbmVlZGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBkb25lIGluIFNoYXJlZEJ1ZmYKKy8qICAgIGRvCisgICAgeworICAgICAgICBCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsgICAgLy8gNCC1cyB1bnRpbCByZXNldAorICAgICAgICAvLyBnZXQgbWVzc2FnZXNpemUKKyAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUgKHBTaGJSeEluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKKyAgICAgICAgaWYoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7ICAvLyAxNCC1cyB1bnRpbCBzZXQKKyovCisJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKKwlTaGJFcnJvciA9IFNoYkNpclJlYWREYXRhQmxvY2socFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKKwkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJLy8gZXJyb3IgZ290byBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCisJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CisJLy8gc2V0IERhdGFzaXplCisJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CisJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CisJCS8vIHNldCBwb2ludGVyIHRvIGFyZ3VtZW50CisJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07CisJfSBlbHNlIHsKKwkJLy9zZXQgcG9pbnRlciB0byBOVUxMCisJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKKwl9CisKKwlCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsKKwkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgorCUVwbEV2ZW50dVByb2Nlc3MocEVwbEV2ZW50KTsKKworCUJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7CisJLy8gcmVhZCBudW1iZXIgb2YgbGVmdCBtZXNzYWdlcyB0byBwcm9jZXNzCisvLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgorLyogICAgICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKHBTaGJSeEluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOworICAgICAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHVsQmxvY2tDb3VudCA+IDApOworKi8KKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2Y4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEZyYW1lLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBmcmFtZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxGcmFtZS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA2LzIzIDE0OjU2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRlJBTUVfSF8KKyNkZWZpbmUgX0VQTF9GUkFNRV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgRXBsRnJhbWUubV93RmxhZworI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfUkQgICAgICAgICAgMHgwMQkvLyByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQUmVxLCBQUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRVIgICAgICAgICAgMHgwMgkvLyBleGNlcHRpb24gcmVzZXQgKGVycm9yIHNpZ25hbGxpbmcpICAgICAgIChTb0EpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9FQSAgICAgICAgICAweDA0CS8vIGV4Y2VwdGlvbiBhY2tub3dsZWRnZSAoZXJyb3Igc2lnbmFsbGluZykgKFBSZXEsIFNvQSkKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX0VDICAgICAgICAgIDB4MDgJLy8gZXhjZXB0aW9uIGNsZWFyIChlcnJvciBzaWduYWxsaW5nKSAgICAgICAoU3RhdHVzUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRU4gICAgICAgICAgMHgxMAkvLyBleGNlcHRpb24gbmV3IChlcnJvciBzaWduYWxsaW5nKSAgICAgICAgIChQUmVzLCBTdGF0dXNSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9NUyAgICAgICAgICAweDIwCS8vIG11bHRpcGxleGVkIHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgKFBSZXEpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9QUyAgICAgICAgICAweDQwCS8vIHByZXNjYWxlZCBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNvQykKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX01DICAgICAgICAgIDB4ODAJLy8gbXVsdGlwbGV4ZWQgY3ljbGUgY29tcGxldGVkICAgICAgICAgICAgICAoU29DKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUlMgICAgICAgICAgMHgwNwkvLyBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyB0byBzZW5kICAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFIgICAgICAgICAgMHgzOAkvLyBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZSAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQgICAgMwkvLyBzaGlmdCBvZiBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZQorCisvLyBlcnJvciBoaXN0b3J5L3N0YXR1cyBlbnRyeSB0eXBlcworI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9TVEFUVVMgICAgICAgIDB4ODAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9ISVNUT1JZICAgICAgIDB4MDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9FTUNZICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0FDVElWRSAgIDB4MTAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0NMRUFSRUQgIDB4MjAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX09DQ1VSUkVEIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX01BU0sgICAgIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX1ZFTkRPUiAgIDB4MDAwMQorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX0VQTCAgICAgIDB4MDAwMgorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX01BU0sgICAgIDB4MEZGRgorCisvLyBkZWZpbmVzIGZvciBFUEwgdmVyc2lvbiAvIFBETyB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX1NVQiAgICAgICAgICAgICAweDBGCS8vIHN1YiB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX01BSU4gICAgICAgICAgICAweEYwCS8vIG1haW4gdmVyc2lvbgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gJCQkIGQuay46IG1vdmUgdGhpcyBkZWZpbml0aW9uIHRvIGdsb2JhbC5oCisvLyBieXRlLWFsaWduIHN0cnVjdHVyZXMKKyNpZmRlZiBfTVNDX1ZFUgorIyAgICBwcmFnbWEgcGFjayggcHVzaCwgcGFja2luZyApCisjICAgIHByYWdtYSBwYWNrKCAxICkKKyMgICAgZGVmaW5lIFBBQ0tfU1RSVUNUCisjZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisjICAgIGRlZmluZSBQQUNLX1NUUlVDVCAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2Vsc2UKKyMgICAgZXJyb3IgeW91IG11c3QgYnl0ZS1hbGlnbiB0aGVzZSBzdHJ1Y3R1cmVzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGRpcmVjdGl2ZXMKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNQywgUFMKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogcmVzCisJLy8gT2Zmc2V0IDIwCisJdEVwbE5ldFRpbWUgbV9sZV9OZXRUaW1lOwkvLyBzdXBwb3J0ZWQgaWYgRF9OTVRfTmV0VGltZUlzUmVhbFRpbWVfQk9PTCBpcyBzZXQKKwkvLyBPZmZzZXQgMjgKKwlRV09SRCBtX2xlX1JlbGF0aXZlVGltZTsJLy8gaW4gdXMgKHN1cHBvcnRlZCBpZiBEX05NVF9SZWxhdGl2ZVRpbWVfQk9PTCBpcyBzZXQpCisKK30gUEFDS19TVFJVQ1QgdEVwbFNvY0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNUywgRUEsIFJECisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUGRvVmVyc2lvbjsKKwkvLyBPZmZzZXQgMjEKKwlCWVRFIG1fbGVfYlJlczI7CS8vIHJlc2VydmVkCisJLy8gT2Zmc2V0IDIyCisJV09SRCBtX2xlX3dTaXplOworCS8vIE9mZnNldCAyNAorCUJZVEUgbV9sZV9hYlBheWxvYWRbMjU2IC8qRF9OTVRfSXNvY2hyUnhNYXhQYXlsb2FkX1UxNiAqLyBdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxQcmVxRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IE1TLCBFTiwgUkQKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogUFIsIFJTCisJLy8gT2Zmc2V0IDIwCisJQllURSBtX2xlX2JQZG9WZXJzaW9uOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVzMjsJLy8gcmVzZXJ2ZWQKKwkvLyBPZmZzZXQgMjIKKwlXT1JEIG1fbGVfd1NpemU7CisJLy8gT2Zmc2V0IDI0CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2CisJCQkJICAgLyBEX05NVF9Jc29jaHJUeE1heFBheWxvYWRfVTE2ICovIF07CisKK30gUEFDS19TVFJVQ1QgdEVwbFByZXNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxNworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogRUEsIEVSCisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUmVxU2VydmljZUlkOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVxU2VydmljZVRhcmdldDsKKwkvLyBPZmZzZXQgMjIKKwlCWVRFIG1fbGVfYkVwbFZlcnNpb247CisKK30gUEFDS19TVFJVQ1QgdEVwbFNvYUZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dFbnRyeVR5cGU7CisJV09SRCBtX3dFcnJvckNvZGU7CisJdEVwbE5ldFRpbWUgbV9UaW1lU3RhbXA7CisJQllURSBtX2FiQWRkSW5mb1s4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsRXJySGlzdG9yeUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IEVOLCBFQworCUJZVEUgbV9sZV9iRmxhZzI7CS8vIEZsYWdzOiBQUiwgUlMKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJQllURSBtX2xlX2JSZXMxWzNdOworCVFXT1JEIG1fbGVfcXdTdGF0aWNFcnJvcjsJLy8gc3RhdGljIGVycm9yIGJpdCBmaWVsZAorCXRFcGxFcnJIaXN0b3J5RW50cnkgbV9sZV9hRXJySGlzdG9yeUVudHJ5WzE0XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsU3RhdHVzUmVzcG9uc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogcmVzCisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IFBSLCBSUworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwlCWVRFIG1fbGVfYklkZW50UmVzcEZsYWdzOwkvLyBGbGFnczogRlcKKwlCWVRFIG1fbGVfYkVwbFByb2ZpbGVWZXJzaW9uOworCUJZVEUgbV9sZV9iUmVzMTsKKwlEV09SRCBtX2xlX2R3RmVhdHVyZUZsYWdzOwkvLyBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCVdPUkQgbV9sZV93TXR1OwkJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5Bc3luY01UVV9VMTY6IENfSVBfTUlOX01UVSAtIENfSVBfTUFYX01UVQorCVdPUkQgbV9sZV93UG9sbEluU2l6ZTsJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5QUmVxQWN0UGF5bG9hZF9VMTYKKwlXT1JEIG1fbGVfd1BvbGxPdXRTaXplOwkvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDLlBSZXNBY3RQYXlsb2FkX1UxNgorCURXT1JEIG1fbGVfZHdSZXNwb25zZVRpbWU7CS8vIE5NVF9DeWNsZVRpbWluZ19SRUMuUFJlc01heExhdGVuY3lfVTMyCisJV09SRCBtX2xlX3dSZXMyOworCURXT1JEIG1fbGVfZHdEZXZpY2VUeXBlOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVuZG9ySWQ7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRFdPUkQgbV9sZV9kd1Byb2R1Y3RDb2RlOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCURXT1JEIG1fbGVfZHdSZXZpc2lvbk51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCURXT1JEIG1fbGVfZHdTZXJpYWxOdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJUVdPUkQgbV9sZV9xd1ZlbmRvclNwZWNpZmljRXh0MTsKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mRGF0ZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mVGltZV9VMzIKKwlEV09SRCBtX2xlX2R3QXBwbGljYXRpb25Td0RhdGU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd0RhdGVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgZGF0ZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fbGVfZHdBcHBsaWNhdGlvblN3VGltZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3VGltZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciB0aW1lIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9sZV9kd0lwQWRkcmVzczsKKwlEV09SRCBtX2xlX2R3U3VibmV0TWFzazsKKwlEV09SRCBtX2xlX2R3RGVmYXVsdEdhdGV3YXk7CisJQllURSBtX2xlX3NIb3N0bmFtZVszMl07CisJQllURSBtX2xlX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsSWRlbnRSZXNwb25zZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iTm10Q29tbWFuZElkOworCUJZVEUgbV9sZV9iUmVzMTsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdENvbW1hbmRTZXJ2aWNlOworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2xlX2JSZXNlcnZlZDsKKwlCWVRFIG1fbGVfYlRyYW5zYWN0aW9uSWQ7CisJQllURSBtX2xlX2JGbGFnczsKKwlCWVRFIG1fbGVfYkNvbW1hbmRJZDsKKwlXT1JEIG1fbGVfd1NlZ21lbnRTaXplOworCVdPUkQgbV9sZV93UmVzZXJ2ZWQ7CisJQllURSBtX2xlX2FiQ29tbWFuZERhdGFbOF07CS8vIGp1c3QgcmVzZXJ2ZSBhIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIGFzIGEgcGxhY2Vob2xkZXIKKworfSBQQUNLX1NUUlVDVCB0RXBsQXN5U2RvQ29tOworCisvLyBhc3luY2hyb25vdXMgU0RPIFNlcXVlbmNlIEhlYWRlcgordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9sZV9iUmVjU2VxTnVtQ29uOworCUJZVEUgbV9sZV9iU2VuZFNlcU51bUNvbjsKKwlCWVRFIG1fbGVfYWJSZXNlcnZlZFsyXTsKKwl0RXBsQXN5U2RvQ29tIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc3lTZG9TZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYk5tdENvbW1hbmRJZDsKKwlCWVRFIG1fbGVfYlRhcmdldE5vZGVJZDsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdFJlcXVlc3RTZXJ2aWNlOworCit0eXBlZGVmIHVuaW9uIHsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsU3RhdHVzUmVzcG9uc2UgbV9TdGF0dXNSZXNwb25zZTsKKwl0RXBsSWRlbnRSZXNwb25zZSBtX0lkZW50UmVzcG9uc2U7CisJdEVwbE5tdENvbW1hbmRTZXJ2aWNlIG1fTm10Q29tbWFuZFNlcnZpY2U7CisJdEVwbE5tdFJlcXVlc3RTZXJ2aWNlIG1fTm10UmVxdWVzdFNlcnZpY2U7CisJdEVwbEFzeVNkb1NlcSBtX1Nkb1NlcXVlbmNlRnJhbWU7CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9BU25kVHhNYXhQYXlsb2FkX1UxNgorCQkJCSAgIC8gRF9OTVRfQVNuZFJ4TWF4UGF5bG9hZF9VMTYgKi8gXTsKKworfSB0RXBsQXNuZFBheWxvYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYlNlcnZpY2VJZDsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsQXNuZFBheWxvYWQgbV9QYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc25kRnJhbWU7CisKK3R5cGVkZWYgdW5pb24geworCS8vIE9mZnNldCAxNworCXRFcGxTb2NGcmFtZSBtX1NvYzsKKwl0RXBsUHJlcUZyYW1lIG1fUHJlcTsKKwl0RXBsUHJlc0ZyYW1lIG1fUHJlczsKKwl0RXBsU29hRnJhbWUgbV9Tb2E7CisJdEVwbEFzbmRGcmFtZSBtX0FzbmQ7CisKK30gdEVwbEZyYW1lRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAwCisJQllURSBtX2JlX2FiRHN0TWFjWzZdOwkvLyBNQUMgYWRkcmVzcyBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDYKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CS8vIE1BQyBhZGRyZXNzIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxMgorCVdPUkQgbV9iZV93RXRoZXJUeXBlOwkvLyBFdGhlcm5ldCBtZXNzYWdlIHR5cGUgKGJpZyBlbmRpYW4pCisJLy8gT2Zmc2V0IDE0CisJQllURSBtX2xlX2JNZXNzYWdlVHlwZTsJLy8gRVBMIG1lc3NhZ2UgdHlwZQorCS8vIE9mZnNldCAxNQorCUJZVEUgbV9sZV9iRHN0Tm9kZUlkOwkvLyBFUEwgbm9kZSBJRCBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDE2CisJQllURSBtX2xlX2JTcmNOb2RlSWQ7CS8vIEVQTCBub2RlIElEIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxNworCXRFcGxGcmFtZURhdGEgbV9EYXRhOworCit9IFBBQ0tfU1RSVUNUIHRFcGxGcmFtZTsKKworLy8gdW4tYnl0ZS1hbGlnbiBzdHJ1Y3R1cmVzCisjaWZkZWYgX01TQ19WRVIKKyMgICAgcHJhZ21hIHBhY2soIHBvcCwgcGFja2luZyApCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTXNnVHlwZU5vbkVwbCA9IDB4MDAsCisJa0VwbE1zZ1R5cGVTb2MgPSAweDAxLAorCWtFcGxNc2dUeXBlUHJlcSA9IDB4MDMsCisJa0VwbE1zZ1R5cGVQcmVzID0gMHgwNCwKKwlrRXBsTXNnVHlwZVNvYSA9IDB4MDUsCisJa0VwbE1zZ1R5cGVBc25kID0gMHgwNiwKKworfSB0RXBsTXNnVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRlJBTUVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSWRlbnR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTllZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCkBAIC0wLDAgKzEsNDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIElkZW50dS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJZGVudHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbElkZW50dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8eHh4eHg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsSWRlbnRSZXNwb25zZSAqbV9hcElkZW50UmVzcG9uc2VbMjU0XTsJLy8gdGhlIElkZW50UmVzcG9uc2UgYXJlIG1hbmFnZWQgZHluYW1pY2FsbHkKKwl0RXBsSWRlbnR1Q2JSZXNwb25zZSBtX2FwZm5DYlJlc3BvbnNlWzI1NF07CisKK30gdEVwbElkZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxJZGVudHVJbnN0YW5jZSBFcGxJZGVudHVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUNiSWRlbnRSZXNwb25zZSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsSWRlbnR1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJLy8gcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsCisJCQkJICAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlckFueSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVzZXQKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzZXRzIHRoaXMgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVzZXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpSW5kZXg7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWZvciAoaUluZGV4ID0gMDsKKwkgICAgIGlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZSk7CisJICAgICBpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVtpSW5kZXhdICE9IE5VTEwpIHsJLy8gZnJlZSBtZW1vcnkKKwkJCUVQTF9GUkVFKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbaUluZGV4XSk7CisJCX0KKwl9CisKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVHZXRJZGVudFJlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIElkZW50UmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwcElkZW50UmVzcG9uc2VfcCAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gcG9pbnRlciBvZiBJZGVudFJlc3BvbnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzIE5VTEwsIGlmIG5vIElkZW50UmVzcG9uc2UgYXZhaWxhYmxlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgICAgcHBJZGVudFJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2UpKSB7CisJCSpwcElkZW50UmVzcG9uc2VfcCA9CisJCSAgICBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpTm9kZUlkX3BdOworCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCSpwcElkZW50UmVzcG9uc2VfcCA9IE5VTEw7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgSWRlbnRSZXNwb25zZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBmbkNiUmVzcG9uc2VfcCAgICAgICAgICAgICA9IElOOiBmdW5jdGlvbiBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBjYWxsZWQgaWYgSWRlbnRSZXNwb25zZSBpcyByZWNlaXZlZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxJZGVudHVDYlJlc3BvbnNlCisJCQkJCQlwZm5DYlJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZSkpIHsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aU5vZGVJZF9wXSAhPSBOVUxMKSB7CS8vIHJlcXVlc3QgYWxyZWFkeSBpc3N1ZWQgKG1heWJlIGJ5IHNvbWVvbmUgZWxzZSkKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQl9IGVsc2UgeworCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlX3A7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3Qoa0VwbERsbFJlcVNlcnZpY2VJZGVudCwKKwkJCQkJCSAgICh1aU5vZGVJZF9wICsgMSksIDB4RkYpOworCQl9CisjZWxzZQorCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKyNlbmRpZgorCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgYSBiaXQgZmllbGQgd2l0aCB0aGUgcnVubmluZyByZXF1ZXN0cyBmb3Igbm9kZS1JRCAxLTMyCisvLyAgICAgICAgICAgICAganVzdCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgRFdPUkQgUFVCTElDIEVwbElkZW50dUdldFJ1bm5pbmdSZXF1ZXN0cyh2b2lkKQoreworCURXT1JEIGR3UmVxcyA9IDA7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgMzI7IHVpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpSW5kZXhdICE9IE5VTEwpIHsKKwkJCWR3UmVxcyB8PSAoMSA8PCB1aUluZGV4KTsKKwkJfQorCX0KKworCXJldHVybiBkd1JlcXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1Q2JJZGVudFJlc3BvbnNlKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbElkZW50dUNiUmVzcG9uc2UgcGZuQ2JSZXNwb25zZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCXVpSW5kZXggPSB1aU5vZGVJZCAtIDE7CisKKwlpZiAodWlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworCQkvLyBtZW1vcml6ZSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisJCXBmbkNiUmVzcG9uc2UgPSBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF07CisJCS8vIHJlc2V0IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgc28gdGhhdCBjYWxsZXIgbWF5IGlzc3VlIG5leHQgcmVxdWVzdCBpbW1lZGlhdGVseQorCQlFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF0gPSBOVUxMOworCisJCWlmIChwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgPCBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUykgewkvLyBJZGVudFJlc3BvbnNlIG5vdCByZWNlaXZlZCBvciBpdCBoYXMgaW52YWxpZCBzaXplCisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0gcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwgTlVMTCk7CisJCX0gZWxzZSB7CS8vIElkZW50UmVzcG9uc2UgcmVjZWl2ZWQKKwkJCWlmIChFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdID09IE5VTEwpIHsJLy8gbWVtb3J5IGZvciBJZGVudFJlc3BvbnNlIG11c3QgYmUgYWxsb2NhdGVkCisJCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVt1aUluZGV4XSA9CisJCQkJICAgIEVQTF9NQUxMT0Moc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0gPT0gTlVMTCkgewkvLyBtYWxsb2MgZmFpbGVkCisJCQkJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlSZXQgPQorCQkJCQkgICAgcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwKKwkJCQkJCQkgICZwRnJhbWVJbmZvX3AtPgorCQkJCQkJCSAgbV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICBtX0lkZW50UmVzcG9uc2UpOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJLy8gY29weSBJZGVudFJlc3BvbnNlIHRvIGluc3RhbmNlIHN0cnVjdHVyZQorCQkJRVBMX01FTUNQWShFcGxJZGVudHVJbnN0YW5jZV9nLgorCQkJCSAgIG1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdLAorCQkJCSAgICZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCSAgIG1fUGF5bG9hZC5tX0lkZW50UmVzcG9uc2UsCisJCQkJICAgc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLAorCQkJCQkgIEVwbElkZW50dUluc3RhbmNlX2cuCisJCQkJCSAgbV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0pOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmOTNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBiYXNpYyBpbmNsdWRlIGZpbGUgZm9yIGludGVybmFsIEVQTCBzdGFjayBtb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsSW5jLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9JTkNfSF8KKyNkZWZpbmUgX0VQTF9JTkNfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW5jbHVkZSBmaWxlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCisjaWZkZWYgVU5ERVJfUlRTUworCS8vIFJUWCBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHJ0YXBpLmg+CisKKyNlbGlmIF9fQk9STEFORENfXworCS8vIGJvcmxhbmQgQyBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisjZWxpZiBXSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2Vsc2UKKwkvLyBNU1ZDIG5lZWRzIHRvIGluY2x1ZGUgd2luZG93cy5oIGF0IGZpcnN0CisJLy8gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyIG5lY2Vzc2FyeSBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igd2FpdGFibGUgdGltZXJzCisjZGVmaW5lIF9XSU4zMl9XSU5ET1dTIDB4MDQwMQorI2RlZmluZSBfV0lOMzJfV0lOTlQgICAweDA0MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBkZWZpbmVzIGZvciBtb2R1bGUgaW50ZWdyYXRpb24KKy8vIHBvc3NpYmxlIG90aGVyIGluY2x1ZGUgZmlsZSBuZWVkZWQKKy8vIFRoZXNlIGNvbnN0YW50cyBkZWZpbmVzIG1vZHVsZXMgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBFcGwgYXBwbGljYXRpb24uCisvLyBVc2UgdGhpcyBjb25zdGFudHMgZm9yIGRlZmluZSBFUExfTU9EVUxFX0lOVEVHUkFUSU9OIGluIGZpbGUgRXBsQ2ZnLmguCisjZGVmaW5lIEVQTF9NT0RVTEVfT0JESyAgICAgICAgMHgwMDAwMDAwMUwJLy8gT0JEIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1BET0sgICAgICAgIDB4MDAwMDAwMDJMCS8vIFBETyBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9OTVRfTU4gICAgICAweDAwMDAwMDA0TAkvLyBOTVQgTU4gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPUyAgICAgICAgMHgwMDAwMDAwOEwJLy8gU0RPIFNlcnZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9TRE9DICAgICAgICAweDAwMDAwMDEwTAkvLyBTRE8gQ2xpZW50IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19BU05EICAgIDB4MDAwMDAwMjBMCS8vIFNETyBvdmVyIEFzbmQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPX1VEUCAgICAgMHgwMDAwMDA0MEwJLy8gU0RPIG92ZXIgVURQIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19QRE8gICAgIDB4MDAwMDAwODBMCS8vIFNETyBpbiBQRE8gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1UX0NOICAgICAgMHgwMDAwMDEwMEwJLy8gTk1UIENOIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX05NVFUgICAgICAgIDB4MDAwMDAyMDBMCS8vIE5NVCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1USyAgICAgICAgMHgwMDAwMDQwMEwJLy8gTk1UIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0RMTEsgICAgICAgIDB4MDAwMDA4MDBMCS8vIERMTCBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9ETExVICAgICAgICAweDAwMDAxMDAwTAkvLyBETEwgdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX09CRFUgICAgICAgIDB4MDAwMDIwMDBMCS8vIE9CRCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfQ0ZHTUEgICAgICAgMHgwMDAwNDAwMEwJLy8gQ29uZmlndWFydGlvYW4gTWFuYWdlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9WRVRIICAgICAgICAweDAwMDA4MDAwTAkvLyB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9QRE9VICAgICAgICAweDAwMDEwMDAwTAkvLyBQRE8gdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0xFRFUgICAgICAgIDB4MDAwMjAwMDBMCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisKKyNpbmNsdWRlICJFcGxDZmcuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGNvbmZpZ3VyYXRpb24gZnJvbSBhcHBsaWNhdGlvbikKKworI2luY2x1ZGUgImdsb2JhbC5oIgkJLy8gZ2xvYmFsIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxEZWYuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGRlZmF1bHQgY29uZmlndXJhdGlvbikKKyNpbmNsdWRlICJFcGxJbnN0RGVmLmgiCQkvLyBkZWZpbmVzIG1hY3JvcyBmb3IgaW5zdGFuY2UgdHlwZXMgYW5kIHRhYmxlCisjaW5jbHVkZSAiRGVidWcuaCIJCS8vIGRlYnVnIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxFcnJEZWYuaCIJCS8vIEVQTCBlcnJvciBjb2RlcyBmb3IgQVBJIGZ1bnRpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJRUVFIDE1ODggY29uZm9ybWFudCBuZXQgdGltZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3U2VjOworCURXT1JEIG1fZHdOYW5vU2VjOworCit9IHRFcGxOZXRUaW1lOworCisjaW5jbHVkZSAiRXBsVGFyZ2V0LmgiCQkvLyB0YXJnZXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucworCisjaW5jbHVkZSAiRXBsQW1pLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9TUEVDX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgIDB4MjAJLy8gRVRIRVJORVQgUG93ZXJsaW5rIFYuIDIuMAorI2RlZmluZSBFUExfU1RBQ0tfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICAoKCgoRFdPUkQpKHZlcikpICYgMHhGRil8KCgoKERXT1JEKShyZXYpKSYweEZGKTw8OCl8KCgoRFdPUkQpKHJlbCkpPDwxNikpCisjZGVmaW5lIEVQTF9PQkoxMDE4X1ZFUlNJT04odmVyLHJldixyZWwpICAgICgoKChEV09SRCkodmVyKSk8PDE2KSB8KCgoRFdPUkQpKHJldikpJjB4RkZGRikpCisjZGVmaW5lIEVQTF9TVFJJTkdfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICJWIiAjdmVyICIuIiAjcmV2ICIgciIgI3JlbAorCisjaW5jbHVkZSAiRXBsVmVyc2lvbi5oIgorCisvLyBkZWZpbmVzIGZvciBFUEwgRmVhdHVyZUZsYWdzCisjZGVmaW5lIEVQTF9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19VRFAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19BU05EICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19QRE8gICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9JTkZPICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9FWFQgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1BET19EWU4gICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9VRFAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0NGR01BICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0RMTF9NVUxUSVBMRVggICAweDAwMDAwMjAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05PREVJRF9TVyAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9CQVNJQ0VUSCAgICAweDAwMDAwODAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMSAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMiAgICAgICAgICAgICAweDAwMDAyMDAwCisKKy8vIGdlbmVyYXRlIEVQTCBOTVRfRmVhdHVyZUZsYWdzX1UzMgorI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfSVNPQ0hSCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAoRVBMX0ZFQVRVUkVfSVNPQ0hSKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX0FTTkQgICAgICAgIChFUExfRkVBVFVSRV9TRE9fQVNORCkKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORCAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fVURQICAgICAgICAgKEVQTF9GRUFUVVJFX1NET19VRFApCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUCAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19QRE8pKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyAgICAgICAgIChFUExfRkVBVFVSRV9TRE9fUERPKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8gICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4gICAgICAgICAoRVBMX0ZFQVRVUkVfUERPX0RZTikKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOICAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0NGR01BICAgICAgICAgICAoRVBMX0ZFQVRVUkVfQ0ZHTUEpCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEgICAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0ZMQUdTICAgICAgICAgICAgICAgICAgIChFUExfREVGX0ZFQVRVUkVfSVNPQ0hSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19BU05EIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19VRFAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX0NGR01BKQorCisjaWZuZGVmIHRhYmVudHJpZXMKKyNkZWZpbmUgdGFiZW50cmllcyhhKSAgIChzaXplb2YoYSkvc2l6ZW9mKCooYSkpKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbml0aW9ucyBmb3IgRExMIGV4cG9ydAorI2lmICgoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykgfHwgKERFVl9TWVNURU0gPT0gX0RFVl9XSU5fQ0VfKSkgJiYgZGVmaW5lZCAoQ09QX0xJQikKKworI2RlZmluZSBFUExETExFWFBPUlQgICAgX19kZWNsc3BlYyAoZGxsZXhwb3J0KQorCisjZWxzZQorCisjZGVmaW5lIEVQTERMTEVYUE9SVAorCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbW9uIGRlYnVnIG1hY3JvcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZm9yIHVzaW5nIG1hY3JvIERFQlVHX1RSQUNFeCgpCisvLworLy8gRXhhbXBsZToKKy8vICAgICAgREVCVUdfVFJBQ0UxIChFUExfREJHTFZMX09CRCwgIlZhbHVlIGlzICVkXG4iICwgd09iamVjdEluZGV4KTsKKy8vCisvLyBUaGlzIG1lc3NhZ2Ugb25seSB3aWxsIGJlIHByaW50ZWQgaWY6CisvLyAgICAgIC0gTkRFQlVHIGlzIG5vdCBkZWZpbmVkICAgICBBTkQgISEhCisvLyAgICAgIC0gZmxhZyAweDAwMDAwMDA0TCBpcyBzZXQgaW4gREVGX0RFQlVHX0xWTCAoY2FuIGJlIGRlZmluZWQgaW4gY29wY2ZnLmgpCisvLworLy8gZGVmYXVsdCBsZXZlbCBpcyBkZWZpbmVkIGluIGNvcGRlZi5oCisKKy8vIGRlYnVnLWxldmVsIGFuZCBUUkFDRS1tYWNyb3MgICAgICAgICAvLyBzdGFuZGFyZC1sZXZlbCAgIC8vIGZsYWdzIGZvciBERUZfREVCVUdfTFZMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSViAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzAxCS8vIDB4MDAwMDAwMDFMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDFfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0RMTCAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wMgkvLyAweDAwMDAwMDAyTAorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTAgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0UxICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMX1RSQUNFMiAgICAgICAgICAgREVCVUdfTFZMXzAyX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTMgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0U0ICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkQgICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDMJLy8gMHgwMDAwMDAwNEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UwICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFMSAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX09CRF9UUkFDRTIgICAgICAgICAgIERFQlVHX0xWTF8wM19UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UzICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFNCAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1USyAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzA0CS8vIDB4MDAwMDAwMDhMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDRfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX05NVENOICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wNQkvLyAweDAwMDAwMDEwTAorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMCAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTEgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ05fVFJBQ0UyICAgICAgICAgREVCVUdfTFZMXzA1X1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMyAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTQgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDYJLy8gMHgwMDAwMDAyMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX05NVFVfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8wNl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU4gICAgICAgICAgICAgICAgREVCVUdfTFZMXzA3CS8vIDB4MDAwMDAwNDBMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UwICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFMSAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTIgICAgICAgICBERUJVR19MVkxfMDdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UzICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFNCAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTQKKworLy8uLi4KKworI2RlZmluZSBFUExfREJHTFZMX1NETyAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNQkvLyAweDAxMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TRE9fVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjVfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX1ZFVEggICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNgkvLyAweDAyMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9WRVRIX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMjZfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5USyAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNwkvLyAweDA0MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVSAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOAkvLyAweDA4MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVFVfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjhfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTQKKworLy8gU2hhcmVkQnVmZgorI2RlZmluZSBFUExfREJHTFZMX1NIQiAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOQkvLyAweDEwMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TSEJfVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVCAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlQJLy8gMHgyMDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UwICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTEgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUX1RSQUNFMiAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UzICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTQgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUiAgICAgICAgICAgICAgICBERUJVR19MVkxfRVJST1IJLy8gMHg0MDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTAgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0UxICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VSUk9SX1RSQUNFMiAgICAgICAgIERFQlVHX0xWTF9FUlJPUl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTMgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0U0ICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTICAgICAgICAgICAgICAgREVCVUdfTFZMX0FMV0FZUwkvLyAweDgwMDAwMDAwTAorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTAgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFMSAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVNfVFJBQ0UyICAgICAgICBERUJVR19MVkxfQUxXQVlTX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTMgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFNCAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0lOQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluc3REZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVmYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmgKQEAgLTAsMCArMSwzNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJbnN0RGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIHIuZC46IGZpcnN0IGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTElOU1RERUZfSF8KKyNkZWZpbmUgX0VQTElOU1RERUZfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHlwZXMgYW5kIG1hY3JvcyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBlbnVtIHsKKwlrU3RhdGVVbnVzZWQgPSAwLAorCWtTdGF0ZURlbGV0ZWQgPSAxLAorCWtTdGF0ZVVzZWQgPSAweEZGCit9IHRJbnN0U3RhdGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdm9pZCBNRU0gKnRFcGxQdHJJbnN0YW5jZTsKK3R5cGVkZWYgQllURSB0RXBsSW5zdGFuY2VIZGw7CisKKy8vIGRlZmluZSBjb25zdCBmb3IgaWxsZWdhbGUgdmFsdWVzCisjZGVmaW5lIENDTV9JTExJTlNUQU5DRSAgICAgIE5VTEwKKyNkZWZpbmUgQ0NNX0lMTElOU1RBTkNFX0hETCAgMHhGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWYgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSB0aGVuIHVzZSB0aGlzIG1hY3JvcworI2lmIChFUExfTUFYX0lOU1RBTkNFUyA+IDEpCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgaW5zdGFuY2UgdGFibGUgZGVmaW5pdGlvbgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZQorI2RlZmluZSBJTlNUX05FQVIJCS8vIGZhc3RlciBhY2Nlc3MgdG8gdmFyaWFibGVzCisjZGVmaW5lIElOU1RfRkFSCQkvLyB2YXJpYWJsZXMgd2ljaCBoYXZlIHRvIGxvY2F0ZWQgaW4geGRhdGEKKyNkZWZpbmUgU1RBVElDCQkJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTiAgICAgdHlwZWRlZiBzdHJ1Y3QgeworI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORCAgICAgICB9IHRFcGxJbnN0YW5jZUluZm87CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgQVBJIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGRlY2xhcmF0aW9uOgorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETCAgICAgICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXyAgICAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBJbnN0YW5jZUhhbmRsZSwKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgd2l0aGluIGZ1bmN0aW9uIGhlYWRlciBvciBwcm90b3R5cGUgb2YgQVBJIGZ1bmN0aW9ucworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdEVwbEluc3RhbmNlSGRsIE1FTSogcEluc3RhbmNlSGFuZGxlCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgTUVNKiBwSW5zdGFuY2VIYW5kbGUsCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIGluc3RhbmNlIGFzIGxva2FjbCB2YXJpYWJsZSB3aXRoaW4gZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCAgICAgICAgICAgICB0Q2NtSW5zdGFuY2VJbmZvIE1FTSogcEluc3RhbmNlOworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMX0xPQ0FMICAgICAgICAgdEVwbEluc3RhbmNlSGRsICBNRU0qIHBJbnN0YW5jZUhhbmRsZTsKKworICAgIC8vIHJlZmVyZW5jZToKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIGhhbmRsZSBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycworI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlSGFuZGxlLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgaW5zdGFuY2UgcGFyYW1ldGVyIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpICAgICAgICAgICAgICAgICBwYXIKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNXyhwYXIpICAgICAgICAgICAgICAgIHBhciwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIHBhcmFtZXRlciBmb3Igd3JpdGluZyBvciByZWFkaW5nIHZhbHVlcworI2RlZmluZSBDQ01fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpKQorCisgICAgLy8gcHJvY2Vzc2luZzoKKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX0hETCgpICAgICAgICAgICAgICAgIGlmIChJbnN0YW5jZUhhbmRsZSA+PSBFUExfTUFYX0lOU1RBTkNFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSWxsZWdhbEluc3RhbmNlKTt9CisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKSAgICAgICAgICAgIGlmIChwSW5zdGFuY2VIYW5kbGUgPT0gTlVMTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSW52YWxpZEluc3RhbmNlUGFyYW0pO30KKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRGcmVlSW5zdGFuY2VBbmRIYW5kbGUgKHBJbnN0YW5jZUhhbmRsZSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQgKCpwSW5zdGFuY2VIYW5kbGUgIT0gQ0NNX0lMTElOU1RBTkNFX0hETCk7CisKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UgPT0gQ0NNX0lMTElOU1RBTkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxOb0ZyZWVJbnN0YW5jZSk7fQorCisjZGVmaW5lIENDTV9HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBDQ01fR0VUX0ZSRUVfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgcEluc3RhbmNlID0gR2V0RnJlZUluc3RhbmNlICgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2UgIT0gQ0NNX0lMTElOU1RBTkNFKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBzdGFjayBpbnRlcmZhY2UKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyAgICAvLyBEZWNsYXJhdGlvbiBvZiBwb2ludGVycyB3aXRoaW4gZnVuY3Rpb24gcGFyYW1hdGVyIGxpc3QgbXVzdCBkZWZpbmVkIGFzIHZvaWQgTUVNKgorICAgIC8vIHBvaW50ZXIuCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgdm9pZCBNRU0qIHBJbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgIHZvaWQgTUVNKiBwSW5zdGFuY2UsCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgICAgICAgICAgICAgdEVwbFB0ckluc3RhbmNlICBwSW5zdGFuY2U7CisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorI2RlZmluZSBFUExfTUNPX0FERFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UsCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorICAgIC8vIEFuIGFjY2VzcyB0byBhIG1lbWJlciBvZiBpbnN0YW5jZSB0YWJsZSBtdXN0IGJlIGNhc3RlZCBieSB0aGUgbG9jYWwKKyAgICAvLyBkZWZpbmVkIHR5cGUgb2YgaW5zdGFuY2UgdGFibGUuCisjZGVmaW5lIEVQTF9NQ09fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodEVwbFB0ckluc3RhbmNlKXBJbnN0YW5jZSkKKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+dmFyKQorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyNkZWZpbmUgRVBMX01DT19HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSAodEVwbFB0ckluc3RhbmNlKSBHZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgIHBJbnN0YW5jZSA9ICh0RXBsUHRySW5zdGFuY2UpIEdldEZyZWVJbnN0YW5jZSAoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlICE9IENDTV9JTExJTlNUQU5DRSk7CisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpICAgICAgICAgICAgICBBU1NFUlQgKHBJbnN0YW5jZSAhPSBOVUxMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+bV9JbnN0U3RhdGUgPT0ga1N0YXRlVXNlZCk7CisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQgTUVNKiAgTUVNKiBwSW5zdGFuY2VQdHIKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICB2b2lkIE1FTSogIE1FTSogcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8gICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlUHRyICE9IE5VTEwpOworI2RlZmluZSBFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICgqcEluc3RhbmNlUHRyID0gcEluc3RhbmNlKTsKKworI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNKGEpICAgICAgICAgICAgICAgICAgIChhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKSAgICAgICAgICAgICAgICAgIChhKSwKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpICAgICAgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKKyNkZWZpbmUgRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShhKSAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIgKG1fSW5zdFN0YXRlKSA9IGE7CisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gTUVNKiAgIHBJbnN0YW5jZSAgICAgICA9ICZhRXBsSW5zdGFuY2VUYWJsZV9nWzBdOyBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIEluc3ROdW1iZXIgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgICAgICA9IEVQTF9NQVhfSU5TVEFOQ0VTOyAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fSW5zdFN0YXRlID0gKEJZVEUpIGtTdGF0ZVVudXNlZDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fYkluc3RJbmRleCA9IChCWVRFKSBJbnN0TnVtYmVyOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UrKzsgSW5zdE51bWJlcisrOyBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKGkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgLy8gZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggaGFzIHRvIGJlIGRlZmluZWQgaW4gZWFjaCBtb2R1bGUgb2YgQ0FOb3BlbiBzdGFjaworI2RlZmluZSBFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKSBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0SW5zdGFuY2VQdHIgKHRFcGxJbnN0YW5jZUhkbCBJbnN0SGFuZGxlX3ApOyAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEZyZWVJbnN0YW5jZSAodm9pZCk7CisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEluc3RhbmNlUHRyICh0RXBsSW5zdGFuY2VIZGwgSW5zdEhhbmRsZV9wKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAmYUVwbEluc3RhbmNlVGFibGVfZ1tJbnN0SGFuZGxlX3BdOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0RnJlZUluc3RhbmNlICh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qICAgcEluc3RhbmNlICAgPSAmYUVwbEluc3RhbmNlVGFibGVfZ1swXTsgICAgIFwKKyAgICAgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgID0gRVBMX01BWF9JTlNUQU5DRVM7ICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7IGlmIChwSW5zdGFuY2UtPm1fSW5zdFN0YXRlICE9IGtTdGF0ZVVzZWQpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRFcGxQdHJJbnN0YW5jZSkgcEluc3RhbmNlOyB9ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UrKzsgaS0tOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoaSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIENDTV9JTExJTlNUQU5DRTsgfQorCisgICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIHRoZSBpbnN0YW5jZSB0YWJsZS4gRWFjaCBlbnRyeSBpcyByZXNlcnZlZCBmb3IgYW4gaW5zdGFuY2Ugb2YgQ0FOb3Blbi4KKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpIFwKKyAgICAgICAgc3RhdGljIHRFcGxJbnN0YW5jZUluZm8gTUVNIGFFcGxJbnN0YW5jZVRhYmxlX2cgW0VQTF9NQVhfSU5TVEFOQ0VTXTsKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBFcGwgc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpIFwKKyAgICAgICAgU1RBVElDICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSW5zdFN0YXRlOyBcCisgICAgICAgIFNUQVRJQyAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJbnN0SW5kZXg7CisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisKKyNlbHNlIC8vIG9ubHkgb25lIGluc3RhbmNlIGlzIHVzZWQKKworICAgIC8vIE1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZS4KKyNkZWZpbmUgSU5TVF9ORUFSICAgTkVBUgkvLyBmYXN0ZXIgYWNjZXNzIHRvIHZhcmlhYmxlcworI2RlZmluZSBJTlNUX0ZBUiAgICBNRU0JCS8vIHZhcmlhYmxlcyB3aWNoIGhhdmUgdG8gbG9jYXRlZCBpbiB4ZGF0YQorI2RlZmluZSBTVEFUSUMgICAgICBzdGF0aWMJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTgorI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORAorCisvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uLCBpbml0aWFsaXppbmcgYW5kIG1lbWJlciBhY2Nlc3MgZm9yIGluc3RhbmNlIGhhbmRsZQorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQVBJIGZ1bmN0aW9uIHRvIGluZm9ybSBDQ00tbW9kdWwgd2hpY2gKKy8vIGluc3RhbmNlIGlzIHRvIGJlIHVzZWQuCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBoYW5kbGUKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIENBTm9wZW4gQVBJIGZ1bmN0aW9uLgorI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMCisjZGVmaW5lIENDTV9JTlNUQU5DRV9IRExfCisKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZQorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IRExfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9IREwoKQorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZQorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMXworCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19QVFJfSU5TVEFOQ0VfSERMKCkKKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkKKworI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkKKworI2RlZmluZSBDQ01fR0VUX0lOU1RBTkNFX1BUUigpCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKQorCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTV8ocGFyKQorCisjZGVmaW5lIENDTV9JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2NtSW5zdGFuY2VUYWJsZV9nWzBdCisKKy8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24sIGluaXRpYWxpemluZyBhbmQgbWVtYmVyIGFjY2VzcyBmb3IgaW5zdGFuY2UgcG9pbnRlcgorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQ0FOb3BlbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBwb2ludCB0byBvbmUgaW5zdGFuY2UuCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFIKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fQUREUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0dFVF9JTlNUQU5DRV9QVFIoKQorI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpCisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyNkZWZpbmUgRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCkKKyNkZWZpbmUgRVBMX01DT19TRVRfUFRSX0lOU1RBTkNFX1BUUigpCisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTShhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0lOU1RfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgIGFFcGxJbnN0YW5jZVRhYmxlX2dbMF0KKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAodmFyKQorI2RlZmluZSBFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGEpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkKKworICAgIC8vIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHdoaWNoIGhhcyB0byBiZSBkZWZpbmVkIGluIGVhY2ggbW9kdWxlIG9mIENBTm9wZW4gc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUZJTkVfSU5TVEFOQ0VfRkNUKCkKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlZmluZXMgdGhlIGluc3RhbmNlIHRhYmxlLiBFYWNoIGVudHJ5IGlzIHJlc2VydmVkIGZvciBhbiBpbnN0YW5jZSBvZiBDQU5vcGVuLgorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBDQU5vcGVuIHN0YWNrCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCisjZW5kaWYKKworLyoKKyNpZiAoQ0RSVl9NQVhfSU5TVEFOQ0VTID4gMSkKKworICAgICNkZWZpbmUgQ0RSVl9SRUVOVFJBTlQgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRU5UUkFOVAorCisjZWxzZQorCisgICAgI2RlZmluZSBDRFJWX1JFRU5UUkFOVAorCisjZW5kaWYKKyovCisKKyNlbmRpZiAvLyBfRVBMSU5TVERFRl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbExlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjlhZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxMZWQuaApAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBzdGF0dXMgYW5kIGVycm9yIExFRAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbExlZC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMTEvMTcgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMTEVEX0hfCisjZGVmaW5lIF9FUExMRURfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxMZWRUeXBlU3RhdHVzID0gMHgwMCwKKwlrRXBsTGVkVHlwZUVycm9yID0gMHgwMSwKKworfSB0RXBsTGVkVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExMRURfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTFlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZ2xvYmFsIGluY2x1ZGUgZmlsZSBmb3IgRVBMLU5NVC1Nb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExOTVRfSF8KKyNkZWZpbmUgX0VQTE5NVF9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbmUgc3VwZXItc3RhdGVzIGFuZCBtYXNrcyB0byBpZGVudGlmeSBhIHN1cGVyLXN0YXRlCisjZGVmaW5lIEVQTF9OTVRfR1NfUE9XRVJFRCAgICAgICAgICAweDAwMDgJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9HU19JTklUSUFMSVNBVElPTiAgIDB4MDAwOQkvLyBzdXBlciBzdGF0ZQorI2RlZmluZSBFUExfTk1UX0dTX0NPTU1VTklDQVRJTkcgICAgMHgwMDBDCS8vIHN1cGVyIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfQ1NfRVBMTU9ERSAgICAgICAgICAweDAwMEQJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9NU19FUExNT0RFICAgICAgICAgIDB4MDAwRAkvLyBzdXBlciBzdGF0ZQorCisjZGVmaW5lIEVQTF9OTVRfU1VQRVJTVEFURV9NQVNLICAgICAweDAwMEYJLy8gbWFzayB0byBzZWxlY3Qgc3RhdGUKKworI2RlZmluZSBFUExfTk1UX1RZUEVfVU5ERUZJTkVEICAgICAgMHgwMDAwCS8vIHR5cGUgb2YgTk1UIHN0YXRlIGlzIHN0aWxsIHVuZGVmaW5lZAorI2RlZmluZSBFUExfTk1UX1RZUEVfQ1MgICAgICAgICAgICAgMHgwMTAwCS8vIENTIHR5cGUgb2YgTk1UIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfVFlQRV9NUyAgICAgICAgICAgICAweDAyMDAJLy8gTVMgdHlwZSBvZiBOTVQgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9UWVBFX01BU0sgICAgICAgICAgIDB4MDMwMAkvLyBtYXNrIHRvIHNlbGVjdCB0eXBlIG9mIE5NVCBzdGF0ZSAoaS5lLiBDUyBvciBNUykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHRoZSBsb3dlciBCeXRlIG9mIHRoZSBOTVQtU3RhdGUgaXMgZW5jb2RlZAorLy8gbGlrZSB0aGUgdmFsdWVzIGluIHRoZSBFUEwtU3RhbmRhcmQKKy8vIHRoZSBoaWdoZXIgYnl0ZSBpcyB1c2VkIHRvIGVuY29kZSBNTgorLy8gKEJpdCAxIG9mIHRoZSBoaWdoZXIgYnl0ZSA9IDEpIG9yIENOIChCaXQgMCBvZiB0aGUKKy8vIGhpZ2hlciBieXRlICA9IDEpCisvLyB0aGUgc3VwZXItc3RhdGVzIGFyZSBub3QgbWVudGlvbmVkIGluIHRoaXMKKy8vIGVudW0gYmVjYXVzZSB0aGV5IGFyZSBubyByZWFsIHN0YXRlcworLy8gLS0+IHRoZXJlIGFyZSBtYXNrcyBkZWZpbmVkIHRvIGluZGVudGlmeSB0aGUKKy8vIHN1cGVyLXN0YXRlcworCit0eXBlZGVmIGVudW0geworCWtFcGxObXRHc09mZiA9IDB4MDAwMCwKKwlrRXBsTm10R3NJbml0aWFsaXNpbmcgPSAweDAwMTksCisJa0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbiA9IDB4MDAyOSwKKwlrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24gPSAweDAwMzksCisJa0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uID0gMHgwMDc5LAorCWtFcGxObXRDc05vdEFjdGl2ZSA9IDB4MDExQywKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgPSAweDAxMUQsCisJa0VwbE5tdENzU3RvcHBlZCA9IDB4MDE0RCwKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgPSAweDAxNUQsCisJa0VwbE5tdENzUmVhZHlUb09wZXJhdGUgPSAweDAxNkQsCisJa0VwbE5tdENzT3BlcmF0aW9uYWwgPSAweDAxRkQsCisJa0VwbE5tdENzQmFzaWNFdGhlcm5ldCA9IDB4MDExRSwKKwlrRXBsTm10TXNOb3RBY3RpdmUgPSAweDAyMUMsCisJa0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxID0gMHgwMjFELAorCWtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMiA9IDB4MDI1RCwKKwlrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSA9IDB4MDI2RCwKKwlrRXBsTm10TXNPcGVyYXRpb25hbCA9IDB4MDJGRCwKKwlrRXBsTm10TXNCYXNpY0V0aGVybmV0ID0gMHgwMjFFCit9IHRFcGxObXRTdGF0ZTsKKworLy8gTk1ULWV2ZW50cwordHlwZWRlZiBlbnVtIHsKKwkvLyBFdmVudHMgZnJvbSBETEwKKwkvLyBFdmVudHMgZGVmaW5lZCBieSBFUEwgVjIgc3BlY2lmaWNhdGlvbgorCWtFcGxObXRFdmVudE5vRXZlbnQgPSAweDAwLAorLy8gICAga0VwbE5tdEV2ZW50RGxsTWVQcmVzICAgICAgICAgICA9ICAgMHgwMSwKKwlrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0ID0gMHgwMiwKKy8vICAgIGtFcGxObXRFdmVudERsbE1lQXNuZCAgICAgICAgICAgPSAgIDB4MDMsCisvLyAgICBrRXBsTm10RXZlbnREbGxNZUFzbmRUaW1lb3V0ICAgID0gICAweDA0LAorCWtFcGxObXRFdmVudERsbE1lU29hU2VudCA9IDB4MDQsCisJa0VwbE5tdEV2ZW50RGxsTWVTb2NUcmlnID0gMHgwNSwKKwlrRXBsTm10RXZlbnREbGxNZVNvYVRyaWcgPSAweDA2LAorCWtFcGxObXRFdmVudERsbENlU29jID0gMHgwNywKKwlrRXBsTm10RXZlbnREbGxDZVByZXEgPSAweDA4LAorCWtFcGxObXRFdmVudERsbENlUHJlcyA9IDB4MDksCisJa0VwbE5tdEV2ZW50RGxsQ2VTb2EgPSAweDBBLAorCWtFcGxObXRFdmVudERsbENlQXNuZCA9IDB4MEIsCisJa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQgPSAweDBDLAorCisJLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBOTVQtQ29tbWFuZHMKKwlrRXBsTm10RXZlbnRTd1Jlc2V0ID0gMHgxMCwJLy8gTk1UX0dUMSwgTk1UX0dUMiwgTk1UX0dUOAorCWtFcGxObXRFdmVudFJlc2V0Tm9kZSA9IDB4MTEsCisJa0VwbE5tdEV2ZW50UmVzZXRDb20gPSAweDEyLAorCWtFcGxObXRFdmVudFJlc2V0Q29uZmlnID0gMHgxMywKKwlrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMiA9IDB4MTQsCisJa0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGUgPSAweDE1LAorCWtFcGxObXRFdmVudFN0YXJ0Tm9kZSA9IDB4MTYsCS8vIE5NVF9DVDcKKwlrRXBsTm10RXZlbnRTdG9wTm9kZSA9IDB4MTcsCisKKwkvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IGhpZ2hlciBsYXllcgorCWtFcGxObXRFdmVudEVudGVyUmVzZXRBcHAgPSAweDIwLAorCWtFcGxObXRFdmVudEVudGVyUmVzZXRDb20gPSAweDIxLAorCWtFcGxObXRFdmVudEludGVybkNvbUVycm9yID0gMHgyMiwJLy8gTk1UX0dUNiwgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiBlcnJvciAtPiBlbnRlciBSZXNldENvbW11bmljYXRpb24KKwlrRXBsTm10RXZlbnRFbnRlclJlc2V0Q29uZmlnID0gMHgyMywKKwlrRXBsTm10RXZlbnRFbnRlckNzTm90QWN0aXZlID0gMHgyNCwKKwlrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlID0gMHgyNSwKKwlrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQgPSAweDI2LAkvLyBOTVRfQ1QzOyB0aW1lciB0cmlnZ2VyZWQgc3RhdGUgY2hhbmdlIChOb3RBY3RpdmUgLT4gQmFzaWNFdGgpCisJa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMSA9IDB4MjcsCS8vIGVudGVyIFByZU9wMSBvbiBNTiAoTm90QWN0aXZlIC0+IE1zUHJlT3AxKQorCWtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3IgPSAweDI4LAkvLyBOTVRfQ1QxMSwgTk1UX01UNjsgZXJyb3IgZHVyaW5nIGN5Y2xlIC0+IGVudGVyIFByZU9wMQorCWtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIgPSAweDI5LAkvLyBlbnRlciBQcmVPcDIgb24gTU4gKE1zUHJlT3AxIC0+IE1zUHJlT3AyIGlmIGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpCisJa0VwbE5tdEV2ZW50QWxsTWFuZGF0b3J5Q05JZGVudCA9IDB4MkEsCS8vIGVudGVyIFByZU9wMiBvbiBNTiBpZiBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyCisJa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSA9IDB4MkIsCS8vIGFwcGxpY2F0aW9uIHJlYWR5IGZvciB0aGUgc3RhdGUgUmVhZHlUb09wCisJa0VwbE5tdEV2ZW50RW50ZXJNc09wZXJhdGlvbmFsID0gMHgyQywJLy8gZW50ZXIgT3BlcmF0aW9uYWwgb24gTU4KKwlrRXBsTm10RXZlbnRTd2l0Y2hPZmYgPSAweDJELAkvLyBlbnRlciBzdGF0ZSBPZmYKKwlrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yID0gMHgyRSwJLy8gZW50ZXIgc3RhdGUgT2ZmIGJlY2F1c2Ugb2YgY3JpdGljYWwgZXJyb3IKKworfSB0RXBsTm10RXZlbnQ7CisKKy8vIHR5cGUgZm9yIGFyZ3VtZW50IG9mIGV2ZW50IGtFcGxFdmVudFR5cGVObXRTdGF0ZUNoYW5nZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxObXRTdGF0ZSBtX05ld05tdFN0YXRlOworCXRFcGxObXRFdmVudCBtX05tdEV2ZW50OworCit9IHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVIZWFydGJlYXQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkCisJdEVwbE5tdFN0YXRlIG1fTm10U3RhdGU7CS8vIE5NVCBzdGF0ZSAocmVtZW1iZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBNTiAvIENOKQorCVdPUkQgbV93RXJyb3JDb2RlOwkvLyBFUEwgZXJyb3IgY29kZSBpbiBjYXNlIG9mIE5NVCBzdGF0ZSBOb3RBY3RpdmUKKworfSB0RXBsSGVhcnRiZWF0RXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE5vZGVFdmVudEZvdW5kID0gMHgwMCwKKwlrRXBsTm10Tm9kZUV2ZW50VXBkYXRlU3cgPSAweDAxLAkvLyBhcHBsaWNhdGlvbiBzaGFsbCB1cGRhdGUgc29mdHdhcmUgb24gQ04KKwlrRXBsTm10Tm9kZUV2ZW50Q2hlY2tDb25mID0gMHgwMiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgY2hlY2sgYW5kIHVwZGF0ZSBjb25maWd1cmF0aW9uIG9uIENOCisJa0VwbE5tdE5vZGVFdmVudFVwZGF0ZUNvbmYgPSAweDAzLAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBzaGFsbCB1cGRhdGUgY29uZmlndXJhdGlvbiBvbiBDTiAoY2hlY2sgd2FzIGRvbmUgYnkgTm10TW4gbW9kdWxlKQorCWtFcGxObXROb2RlRXZlbnRWZXJpZnlDb25mID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgdmVyaWZ5IGNvbmZpZ3VyYXRpb24gb2YgQ04KKwlrRXBsTm10Tm9kZUV2ZW50UmVhZHlUb1N0YXJ0ID0gMHgwNSwJLy8gaXNzdWVkIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0CisJLy8gYXBwbGljYXRpb24gbXVzdCBjYWxsIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKGtFcGxObXRDbWRTdGFydE5vZGUpIG1hbnVhbGx5CisJa0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlID0gMHgwNiwKKwlrRXBsTm10Tm9kZUV2ZW50RXJyb3IgPSAweDA3LAkvLyBOTVQgZXJyb3Igb2YgQ04KKworfSB0RXBsTm10Tm9kZUV2ZW50OworCit0eXBlZGVmIGVudW0geworCWtFcGxObXROb2RlQ29tbWFuZEJvb3QgPSAweDAxLAkvLyBpZiBFUExfTk9ERUFTU0lHTl9TVEFSVF9DTiBub3Qgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRGb3VuZAorCWtFcGxObXROb2RlQ29tbWFuZFN3T2sgPSAweDAyLAkvLyBhcHBsaWNhdGlvbiB1cGRhdGVkIHNvZnR3YXJlIG9uIENOIHN1Y2Nlc3NmdWxseQorCWtFcGxObXROb2RlQ29tbWFuZFN3VXBkYXRlZCA9IDB4MDMsCS8vIGFwcGxpY2F0aW9uIHVwZGF0ZWQgc29mdHdhcmUgb24gQ04gc3VjY2Vzc2Z1bGx5CisJa0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgaGFzIHVwZGF0ZWQgY29uZmlndXJhdGlvbiBvbiBDTiBzdWNjZXNzZnVsbHkKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQgPSAweDA1LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBoYXMgdXBkYXRlZCBjb25maWd1cmF0aW9uIG9uIENOIHN1Y2Nlc3NmdWxseQorCS8vIGFuZCBDTiBuZWVkcyBSZXNldENvbmYgc28gdGhhdCB0aGUgY29uZmlndXJhdGlvbiBnZXRzIGFjdGl2ZWQKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyID0gMHgwNiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgZmFpbGVkIG9uIHVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gb24gQ04KKwlrRXBsTm10Tm9kZUNvbW1hbmRTdGFydCA9IDB4MDcsCS8vIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRSZWFkeVRvU3RhcnQKKworfSB0RXBsTm10Tm9kZUNvbW1hbmQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdEJvb3RFdmVudEJvb3RTdGVwMUZpbmlzaCA9IDB4MDAsCS8vIFByZU9wMiBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2ggPSAweDAxLAkvLyBSZWFkeVRvT3AgaXMgcG9zc2libGUKKwlrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2ggPSAweDAyLAkvLyBPcGVyYXRpb25hbCBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRPcGVyYXRpb25hbCA9IDB4MDMsCS8vIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPcGVyYXRpb25hbAorCWtFcGxObXRCb290RXZlbnRFcnJvciA9IDB4MDQsCS8vIGJvb3QgcHJvY2VzcyBoYWx0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvcgorCit9IHRFcGxObXRCb290RXZlbnQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdENudS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtQ04tVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdENudS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10Q251LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrIG1fcGZuQ2hlY2tFdmVudENiOworCit9IHRFcGxObXRDbnVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDbnVJbnN0YW5jZSBFcGxObXRDbnVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVDb21tYW5kQ2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVJbml0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsTm10Q251QWRkSW5zdGFuY2UodWlOb2RlSWRfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IHRoZSBhZGQgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVBZGRJbnN0YW5jZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsTm10Q251SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbE5tdENudUluc3RhbmNlX2cpKTsKKworCS8vIHNhdmUgbm9kZWlkCisJRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkID0gdWlOb2RlSWRfcDsKKworCS8vIHJlZ2lzdGVyIGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBOTVQtY29tbWFuZHMKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgRXBsTm10Q251Q29tbWFuZENiLAorCQkJCSAgICAgICBrRXBsRGxsQXNuZEZpbHRlckxvY2FsKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWx0ZSBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwkvLyBkZXJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gRExMCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgTlVMTCwga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QKKy8vCisvLyBEZXNjcmlwdGlvbjogU2VuZCBhbiBOTVQtUmVxdWVzdCB0byB0aGUgTU4KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8gICAgICAgICAgICAgICAgICBObXRDb21tYW5kX3AgPSByZXF1ZXN0ZWQgTk1ULUNvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICAgdEVwbE5tdENvbW1hbmQKKwkJCQkJCSAgICAgICBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEZyYW1lSW5mbyBObXRSZXF1ZXN0RnJhbWVJbmZvOworCXRFcGxGcmFtZSBObXRSZXF1ZXN0RnJhbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJEc3RNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYkRzdE1hYykpOwkvLyBzZXQgYnkgRExMCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJTcmNNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYlNyY01hYykpOwkvLyBzZXQgYnkgRExMCisJQW1pU2V0V29yZFRvQmUoJk5tdFJlcXVlc3RGcmFtZS5tX2JlX3dFdGhlclR5cGUsCisJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX2xlX2JEc3ROb2RlSWQsIChCWVRFKSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpOwkvLyBub2RlIGlkIG9mIHRoZSBNTgorCUFtaVNldEJ5dGVUb0xlKCZObXRSZXF1ZXN0RnJhbWUubV9sZV9iTWVzc2FnZVR5cGUsCisJCSAgICAgICAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJICAgICAgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9iTm10Q29tbWFuZElkLAorCQkgICAgICAgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLm1fbGVfYlRhcmdldE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOwkvLyB0YXJnZXQgZm9yIHRoZSBubXQgY29tbWFuZAorCUVQTF9NRU1TRVQoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLgorCQkgICBtX2xlX2FiTm10Q29tbWFuZERhdGFbMF0sIDB4MDAsCisJCSAgIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9hYk5tdENvbW1hbmREYXRhKSk7CisKKwkvLyBidWlsZCBpbmZvLXN0cnVjdHVyZQorCU5tdFJlcXVlc3RGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fcEZyYW1lID0gJk5tdFJlcXVlc3RGcmFtZTsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9OTVRSRVE7CS8vIHNpemVvZihObXRSZXF1ZXN0RnJhbWUpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZObXRSZXF1ZXN0RnJhbWVJbmZvLAkvLyBwb2ludGVyIHRvIGZyYW1laW5mbworCQkJCSAga0VwbERsbEFzeW5jUmVxUHJpb05tdCk7CS8vIHByaW9yaXR5CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlciBDYWxsYmFjay1mdW5jdGlvbiBnbyBnZXQgaW5mb3JtZWQgYWJvdXQgYQorLy8gICAgICAgICAgICAgIE5NVC1DaGFuZ2UtU3RhdGUtRXZlbnQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3AgPSBmdW5jdGlvbnBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10Q251UmVnaXN0ZXJDaGVja0V2ZW50Q2IodEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2sKKwkJCSAgICAgIHBmbkVwbE5tdENoZWNrRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBzYXZlIGNhbGxiYWNrLWZ1bmN0aW9uIGluIG1vZHVsIGdsb2JhbCB2YXIKKwlFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiID0gcGZuRXBsTm10Q2hlY2tFdmVudENiX3A7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVDb21tYW5kQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVC1Db21tYW5kcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwRnJhbWVJbmZvX3AgPSBGcmFtZSB3aXRoIHRoZSBOTVQtQ29tbWFuZG8KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251Q29tbWFuZENiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCUJPT0wgZk5vZGVJZEluTGlzdDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworCisJaWYgKHBGcmFtZUluZm9fcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkRnJhbWVQb2ludGVyOworCQlnb3RvIEV4aXQ7CisJfQorCisJTm10Q29tbWFuZCA9IEVwbE5tdENudUdldE5tdENvbW1hbmQocEZyYW1lSW5mb19wKTsKKworCS8vIGNoZWNrIE5NVC1Db21tYW5kCisJc3dpdGNoIChObXRDb21tYW5kKSB7CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gcGxhaW4gTk1UIHN0YXRlIGNvbW1hbmRzCisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdGFydE5vZGUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdG9wTm9kZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTdG9wTm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDIKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXROb2RlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Tm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudFJlc2V0Q29tCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXRDb25maWcKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXRDb25maWc7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50U3dSZXNldAorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTd1Jlc2V0OworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBleHRlbmRlZCBOTVQgc3RhdGUgY29tbWFuZHMKKworCWNhc2Uga0VwbE5tdENtZFN0YXJ0Tm9kZUV4OgorCQl7CisJCQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJgorCQkJCQkJKHBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCSBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN0b3BOb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZUV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldE5vZGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbkV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0RXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN3UmVzZXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE5NVCBtYW5hZ2luZyBjb21tYW5kcworCisJCS8vIFRPRE86IGFkZCBmdW5jdGlvbnMgdG8gcHJvY2VzcyBtYW5hZ2luZyBjb21tYW5kIChvcHRpb25hbCkKKworCWNhc2Uga0VwbE5tdENtZE5ldEhvc3ROYW1lU2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRmx1c2hBcnBFbnRyeToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBOTVQgaW5mbyBzZXJ2aWNlcworCisJCS8vIFRPRE86IGZvcndhcmQgZXZlbnQgd2l0aCBpbmZvcyB0byB0aGUgYXBwbGljYXRpb24gKG9wdGlvbmFsKQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaENvbmZpZ3VyZWRDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hBY3RpdmVDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaE9wZXJhdGlvbmFsOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFN0b3BwZWQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoRW1lcmdlbmN5TmV3OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFRpbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBlcnJvciBmcm9tIE1OCisJCS8vIC0+IHJlcXVlc3RlZCBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTU4KKwljYXNlIGtFcGxObXRDbWRJbnZhbGlkU2VydmljZToKKwkJeworCisJCQkvLyBUT0RPOiBlcnJvcmV2ZW50IHRvIGFwcGxpY2F0aW9uCisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGRlZmF1bHQKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10VW5rbm93bkNvbW1hbmQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKE5tdENvbW1hbmQpCisKKwlpZiAoTm10RXZlbnQgIT0ga0VwbE5tdEV2ZW50Tm9FdmVudCkgeworCQlpZiAoRXBsTm10Q251SW5zdGFuY2VfZy5tX3BmbkNoZWNrRXZlbnRDYiAhPSBOVUxMKSB7CisJCQlSZXQgPSBFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiKE5tdEV2ZW50KTsKKwkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQlSZXQgPSBFcGxObXR1Tm10RXZlbnQoTm10RXZlbnQpOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251R2V0Tm10Q29tbWFuZCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIE5NVC1Db21tYW5kIGZyb20gdGhlIGZyYW1lCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IHBvaW50ZXIgdG8gdGhlIEZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIE5NVC1Db21tYW5kCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbE5tdENvbW1hbmQgPSBOTVQtQ29tbWFuZAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCXRFcGxObXRDb21tYW5kU2VydmljZSAqcE5tdENvbW1hbmRTZXJ2aWNlOworCisJcE5tdENvbW1hbmRTZXJ2aWNlID0KKwkgICAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCSAgICBtX05tdENvbW1hbmRTZXJ2aWNlOworCisJTm10Q29tbWFuZCA9CisJICAgICh0RXBsTm10Q29tbWFuZCkgQW1pR2V0Qnl0ZUZyb21MZSgmcE5tdENvbW1hbmRTZXJ2aWNlLT4KKwkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCXJldHVybiBObXRDb21tYW5kOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2sgaWYgdGhlIG93biBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcGJObXRDb21tYW5kRGF0ZV9wID0gcG9pbnRlciB0byB0aGUgZGF0YSBvZiB0aGUgTk1UIENvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICBCT09MID0gVFJVRSBpZiBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlmIG5vZGVpZCBub3Qgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCkKK3sKKwlCT09MIGZOb2RlSWRJbkxpc3Q7CisJdW5zaWduZWQgaW50IHVpQnl0ZU9mZnNldDsKKwlCWVRFIGJCaXRPZmZzZXQ7CisJQllURSBiTm9kZUxpc3RCeXRlOworCisJLy8gZ2V0IGJ5dGUtb2Zmc2V0IG9mIHRoZSBvd24gbm9kZWlkIGluIE5vZGVJZExpc3QKKwkvLyBkZXZpZGUgdGhvdWdoIDgKKwl1aUJ5dGVPZmZzZXQgPSAodW5zaWduZWQgaW50KShFcGxObXRDbnVJbnN0YW5jZV9nLm1fdWlOb2RlSWQgPj4gMyk7CisJLy8gZ2V0IGJpdG9mZnNldAorCWJCaXRPZmZzZXQgPSAoQllURSkgRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkICUgODsKKworCWJOb2RlTGlzdEJ5dGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwYk5tdENvbW1hbmREYXRlX3BbdWlCeXRlT2Zmc2V0XSk7CisJaWYgKChiTm9kZUxpc3RCeXRlICYgYkJpdE9mZnNldCkgPT0gMCkgeworCQlmTm9kZUlkSW5MaXN0ID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJZk5vZGVJZEluTGlzdCA9IFRSVUU7CisJfQorCisJcmV0dXJuIGZOb2RlSWRJbkxpc3Q7Cit9CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRNbnUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMGI2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKQEAgLTAsMCArMSwyODM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1NTi1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRNbnUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTggJCAgJERhdGU6IDIwMDgvMTEvMTkgMDk6NTI6MjQgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorI2Vycm9yICJFUEwgTm10TW51IG1vZHVsZSBuZWVkcyBFUEwgbW9kdWxlIE9CRFUgb3IgT0JESyEiCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShFdmVudF9wLCB1aU5vZGVJZF9wLCB3RXJyb3JDb2RlX3ApIFwKKyAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKGtFcGxFdmVudFNpbmtObXRNbnUgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8vIGRlZmluZXMgZm9yIGZsYWdzIGluIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04gICAgICAgMHgwMDAxCS8vIENOIGlzIGJlaW5nIGFjY2Vzc2VkIGlzb2Nocm9ub3VzbHkKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQgICAgMHgwMDAyCS8vIENOIHdhcyBub3Qgc2Nhbm5lZCBvbmNlIC0+IGRlY3JlbWVudCBTaWduYWxDb3VudGVyIGFuZCByZXNldCBmbGFnCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0hBTFRFRCAgICAgICAgIDB4MDAwNAkvLyBib290IHByb2Nlc3MgZm9yIHRoaXMgQ04gaXMgaGFsdGVkCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05NVF9DTURfSVNTVUVEIDB4MDAwOAkvLyBOTVQgY29tbWFuZCB3YXMganVzdCBpc3N1ZWQsIHdyb25nIE5NVCBzdGF0ZXMgd2lsbCBiZSB0b2xlcmF0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSAgMHgwMzAwCS8vIGNvdW50ZXIgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUiAgIDB4MEMwMAkvLyBjb3VudGVyIGZvciBsb25nZXIgdGltZW91dHMgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRICAgIDB4MDEwMAkvLyBpbmNyZW1lbnQgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19MT05HRVIgICAgIDB4MDQwMAkvLyBpbmNyZW1lbnQgZm9yIGxvbmdlciB0aW1lb3V0cyB0aW1lciBoYW5kbGUKKwkJICAgIC8vIFRoZXNlIGNvdW50ZXJzIHdpbGwgYmUgaW5jcmVtZW50ZWQgYXQgZXZlcnkgdGltZXIgc3RhcnQKKwkJICAgIC8vIGFuZCBjb3BpZWQgdG8gdGltZXJhcmcuIFdoZW4gdGhlIHRpbWVyIGV2ZW50IG9jY3VyZXMKKwkJICAgIC8vIGJvdGggd2lsbCBiZSBjb21wYXJlZCBhbmQgaWYgdW5lcXVhbCB0aGUgdGltZXIgZXZlbnQKKwkJICAgIC8vIHdpbGwgYmUgZGlzY2FyZGVkLCBiZWNhdXNlIGl0IGlzIGFuIG9sZCBvbmUuCisKKy8vIGRlZmluZXMgZm9yIHRpbWVyIGFyZ3VtZW50cyB0byBkcmF3IGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzZXJ2ZXJhbCBldmVudHMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19OT0RFX01BU0sgICAweDAwMDAwMEZGTAkvLyBtYXNrIHRoYXQgY29udGFpbnMgdGhlIG5vZGUtSUQKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19JREVOVFJFUSAgICAweDAwMDEwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgSWRlbnRSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSAgICAgMHgwMDAyMDAwMEwJLy8gdGltZXIgZXZlbnQgaXMgZm9yIFN0YXR1c1JlcXVlc3QKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgICAgICAweDAwMDQwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgbG9uZ2VyIHRpbWVvdXRzCisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVEVfTU9OICAgMHgwMDA4MDAwMEwJLy8gdGltZXIgZXZlbnQgZm9yIFN0YXR1c1JlcXVlc3QgdG8gbW9uaXRvciBleGVjdXRpb24gb2YgTk1UIHN0YXRlIGNoYW5nZXMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUiAgICAweDAwMDAwMzAwTAkvLyBjb3VudGVyIGZvciBTdGF0dXNSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfTE8gICAgMHgwMDAwMEMwMEwJLy8gY291bnRlciBmb3IgbG9uZ2VyIHRpbWVvdXRzCisJCSAgICAvLyBUaGUgY291bnRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHBvc2l0aW9uIGFzIGluIHRoZSBub2RlIGZsYWdzIGFib3ZlLgorCisjZGVmaW5lIEVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRSRVEocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX1NUQVRSRVEpIFwKKyAgICAgICAgICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgXAorICAgICAgICB8IChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX1NUQVRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUShwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwgVGltZXJBcmdfcCkgXAorICAgIHBOb2RlSW5mb19wLT5tX3dGbGFncyA9IFwKKyAgICAgICAgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgKyBFUExfTk1UTU5VX05PREVfRkxBR19JTkNfU1RBVFJFUSkgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSBcCisgICAgICAgIHwgKHBOb2RlSW5mb19wLT5tX3dGbGFncyAmIH5FUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19MT05HRVIocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX0xPTkdFUikgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUik7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpOyBcCisgICAgVGltZXJBcmdfcC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisKKyNkZWZpbmUgRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfU1RBVEVfTU9OKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLCBUaW1lckFyZ19wKSBcCisgICAgcE5vZGVJbmZvX3AtPm1fd0ZsYWdzID0gXAorICAgICAgICAoKHBOb2RlSW5mb19wLT5tX3dGbGFncyArIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRKSBcCisgICAgICAgICAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpOyBcCisgICAgVGltZXJBcmdfcC5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04gfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworLy8gZGVmaW5lcyBmb3IgZ2xvYmFsIGZsYWdzCisjZGVmaW5lIEVQTF9OTVRNTlVfRkxBR19IQUxURUQgICAgICAgICAgMHgwMDAxCS8vIGJvb3QgcHJvY2VzcyBpcyBoYWx0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRCAgICAweDAwMDIJLy8gYXBwbGljYXRpb24gd2FzIGluZm9ybWVkIGFib3V0IHBvc3NpYmxlIE5NVCBzdGF0ZSBjaGFuZ2UKKworLy8gcmV0dXJuIHBvaW50ZXIgdG8gbm9kZSBpbmZvIHN0cnVjdHVyZSBmb3Igc3BlY2lmaWVkIG5vZGUgSUQKKy8vIGQuay4gbWF5IGJlIHJlcGxhY2VkIGJ5IHNwZWNpYWwgKGhhc2gpIGZ1bmN0aW9uIGlmIG5vZGUgSUQgYXJyYXkgaXMgc21hbGxlciB0aGFuIDI1NAorI2RlZmluZSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZF9wKSAoJkVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcCAtIDFdKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSA9IDB4MDAsCisJa0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UgPSAweDAxLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290ID0gMHgwMiwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXhlY1Jlc2V0ID0gMHgwMywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZCA9IDB4MDQsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2UgPSAweDA1LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSA9IDB4MDYsCisJa0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCA9IDB4MDcsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQgPSAweDA4LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxID0gMHgwOSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxID0gMHgwQSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiA9IDB4MEIsCisJa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyID0gMHgwQywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXJyb3IgPSAweDBELAorCit9IHRFcGxObXRNbnVJbnROb2RlRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd24gPSAweDAwLAorCWtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkID0gMHgwMSwKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mID0gMHgwMiwJLy8gQ04gcmVzZXQgYWZ0ZXIgY29uZmlndXJhdGlvbiB1cGRhdGUKKwlrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZCA9IDB4MDMsCS8vIEJvb3RTdGVwMSBjb21wbGV0ZWQKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVhZHlUb09wID0gMHgwNCwJLy8gQm9vdFN0ZXAyIGNvbXBsZXRlZAorCWtFcGxObXRNbnVOb2RlU3RhdGVDb21DaGVja2VkID0gMHgwNSwJLy8gQ29tbXVuaWNhdGlvbiBjaGVja2VkIHN1Y2Nlc3NmdWxseQorCWtFcGxObXRNbnVOb2RlU3RhdGVPcGVyYXRpb25hbCA9IDB4MDYsCS8vIENOIGlzIGluIE5NVCBzdGF0ZSBPUEVSQVRJT05BTAorCit9IHRFcGxObXRNbnVOb2RlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbFN0YXRSZXE7CS8vIHRpbWVyIHRvIGRlbGF5IFN0YXR1c1JlcXVlc3RzIGFuZCBJZGVudFJlcXVlc3RzCisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxMb25nZXI7CS8vIDJuZCB0aW1lciBmb3IgTk1UIGNvbW1hbmQgRW5hYmxlUmVhZHlUb09wIGFuZCBDaGVja0NvbW11bmljYXRpb24KKwl0RXBsTm10TW51Tm9kZVN0YXRlIG1fTm9kZVN0YXRlOwkvLyBpbnRlcm5hbCBub2RlIHN0YXRlIChraW5kIG9mIHN1YiBzdGF0ZSBvZiBOTVQgc3RhdGUpCisJRFdPUkQgbV9kd05vZGVDZmc7CS8vIHN1YmluZGV4IGZyb20gMHgxRjgxCisJV09SRCBtX3dGbGFnczsJCS8vIGZsYWdzOiBDTiBpcyBiZWluZyBhY2Nlc3NlZCBpc29jaHJvbm91c2x5CisKK30gdEVwbE5tdE1udU5vZGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdE1udU5vZGVJbmZvIG1fYU5vZGVJbmZvW0VQTF9OTVRfTUFYX05PREVfSURdOworCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsTm10U3RhdGU7CS8vIHRpbWVvdXQgZm9yIHN0YXkgaW4gTk1UIHN0YXRlCisJdW5zaWduZWQgaW50IG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCXVuc2lnbmVkIGludCBtX3VpU2lnbmFsU2xhdmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXk7CS8vIGluIFttc10gKG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSkKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lb3V0UmVhZHlUb09wOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxRjg5LzUpCisJdW5zaWduZWQgbG9uZyBtX3VsVGltZW91dENoZWNrQ29tOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxMDA2ICogTXVsdGlwbGV4ZWRDeWNsZUNvdW50KQorCVdPUkQgbV93RmxhZ3M7CQkvLyBnbG9iYWwgZmxhZ3MKKwlEV09SRCBtX2R3Tm10U3RhcnR1cDsJLy8gb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwl0RXBsTm10TW51Q2JOb2RlRXZlbnQgbV9wZm5DYk5vZGVFdmVudDsKKwl0RXBsTm10TW51Q2JCb290RXZlbnQgbV9wZm5DYkJvb3RFdmVudDsKKworfSB0RXBsTm10TW51SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdE1udUluc3RhbmNlIEVwbE5tdE1udUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRSZXF1ZXN0KHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICB0RXBsSWRlbnRSZXNwb25zZSAqCisJCQkJCQkgIHBJZGVudFJlc3BvbnNlX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JTdGF0dXNSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgIHRFcGxTdGF0dXNSZXNwb25zZSAqCisJCQkJCQkgICBwU3RhdHVzUmVzcG9uc2VfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAxKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Tm9kZXModm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE5tdFN0YXRlIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCQl0RXBsTm10TW51SW50Tm9kZUV2ZW50CisJCQkJCQlOb2RlRXZlbnRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVJlc2V0KHZvaWQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUluaXQodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkgdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRNbnVBZGRJbnN0YW5jZShwZm5DYk5vZGVFdmVudF9wLCBwZm5DYkJvb3RFdmVudF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUFkZEluc3RhbmNlKHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJCXRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxObXRNbnVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsTm10TW51SW5zdGFuY2VfZykpOworCisJaWYgKChwZm5DYk5vZGVFdmVudF9wID09IE5VTEwpIHx8IChwZm5DYkJvb3RFdmVudF9wID09IE5VTEwpKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50ID0gcGZuQ2JOb2RlRXZlbnRfcDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JCb290RXZlbnQgPSBwZm5DYkJvb3RFdmVudF9wOworCisJLy8gaW5pdGlhbGl6ZSBTdGF0dXNSZXF1ZXN0IGRlbGF5CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsU3RhdHVzUmVxdWVzdERlbGF5ID0gNTAwMEw7CisKKwkvLyByZWdpc3RlciBObXRNblJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10UmVxdWVzdCwKKwkJCQkgICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgTm10TW5SZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZE5tdFJlcXVlc3QsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsTm10TW51UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeAorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgc3BlY2lmaWVkIE5NVCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIHRvIHdoaWNoIHRoZSBOTVQgY29tbWFuZCB3aWxsIGJlIHNlbnQKKy8vICAgICAgICAgICAgICBObXRDb21tYW5kX3AgICAgICAgICAgICA9IE5NVCBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxObXRDb21tYW5kIE5tdENvbW1hbmRfcCwKKwkJCQkgICAgIHZvaWQgKnBObXRDb21tYW5kRGF0YV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCUJZVEUgYWJCdWZmZXJbRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUXTsKKwl0RXBsRnJhbWUgKnBGcmFtZSA9ICh0RXBsRnJhbWUgKikgYWJCdWZmZXI7CisJQk9PTCBmU29mdERlbGV0ZU5vZGUgPSBGQUxTRTsKKworCWlmICgodWlOb2RlSWRfcCA9PSAwKSB8fCAodWlOb2RlSWRfcCA+IEVQTF9DX0FEUl9CUk9BRENBU1QpKSB7CS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBObXRDb21tYW5kRGF0YV9wICE9IE5VTEwpCisJICAgICYmICh1aURhdGFTaXplX3AgPgorCQkoRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUIC0gRVBMX0NfRExMX01JTlNJWkVfTk1UQ01EKSkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKwkvLyAkJCQgZC5rLiBtYXkgYmUgY2hlY2sgaW4gZnV0dXJlIHZlcnNpb25zIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gcGVyZm9ybSBwcm9oaWJpdGVkIHN0YXRlIHRyYW5zaXRpb25zCisJLy8gICAgIHRoZSBDTiBzaG91bGQgbm90IHBlcmZvcm0gdGhlc2UgdHJhbnNpdGlvbnMsIGJ1dCB0aGUgZXhwZWN0ZWQgTk1UIHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBhbmQgbmV2ZXIgZnVsbGZpbGxlZC4KKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVChwRnJhbWUsIDB4MDAsIHNpemVvZihhYkJ1ZmZlcikpOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10Q29tbWFuZCk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9ObXRDb21tYW5kU2VydmljZS4KKwkJICAgICAgIG1fbGVfYk5tdENvbW1hbmRJZCwgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJaWYgKChwTm10Q29tbWFuZERhdGFfcCAhPSBOVUxMKSAmJiAodWlEYXRhU2l6ZV9wID4gMCkpIHsJLy8gY29weSBjb21tYW5kIGRhdGEgdG8gZnJhbWUKKwkJRVBMX01FTUNQWSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJICAgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdLCBwTm10Q29tbWFuZERhdGFfcCwKKwkJCSAgIHVpRGF0YVNpemVfcCk7CisJfQorCS8vIGJ1aWxkIGluZm8gc3RydWN0dXJlCisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IDA7CisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBzaXplb2YoYWJCdWZmZXIpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZGcmFtZUluZm8sCS8vIHBvaW50ZXIgdG8gZnJhbWVpbmZvCisJCQkJICBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KTsJLy8gcHJpb3JpdHkKKyNlbmRpZgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UyKCJOTVRDbWQoJTAyWC0+JTAyWClcbiIsIE5tdENvbW1hbmRfcCwKKwkJCQl1aU5vZGVJZF9wKTsKKworCXN3aXRjaCAoTm10Q29tbWFuZF9wKSB7CisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBub3RoaW5nIGxlZnQgdG8gZG8sCisJCQkvLyBiZWNhdXNlIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgZG9uZQorCQkJLy8gd2hlbiB0aGUgTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgc2VudAorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJeworCQkJZlNvZnREZWxldGVOb2RlID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZ290byBFeGl0OworCX0KKworCS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlOworCS8vIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUgYW5kIG5vdCB3aGVuIE5NVCBjb21tYW5kIGlzIGFjdHVhbGx5IHNlbnQKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgdG9vIGxhdGUgYW5kIG1heSBjYXVzZSB1bndhbnRlZCBlcnJvcnMKKwlpZiAodWlOb2RlSWRfcCAhPSBFUExfQ19BRFJfQlJPQURDQVNUKSB7CisJCWlmIChmU29mdERlbGV0ZU5vZGUgPT0gRkFMU0UpIHsJLy8gcmVtb3ZlIENOIGltbWVkaWF0ZWx5IGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQl9IGVsc2UgewkvLyByZW1vdmUgQ04gZnJvbSBpc29jaHJvbm91cyBwaGFzZSBzb2Z0bHkKKwkJCVJldCA9IEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1aU5vZGVJZF9wKTsKKwkJfQorCX0gZWxzZSB7CQkvLyBkbyBpdCBmb3IgYWxsIGFjdGl2ZSBDTnMKKwkJZm9yICh1aU5vZGVJZF9wID0gMTsKKwkJICAgICB1aU5vZGVJZF9wIDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlOb2RlSWRfcCsrKSB7CisJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApLT4KKwkJCSAgICAgbV9kd05vZGVDZmcgJiAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8CisJCQkJCSAgICBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsKKwkJCQlpZiAoZlNvZnREZWxldGVOb2RlID09IEZBTFNFKSB7CS8vIHJlbW92ZSBDTiBpbW1lZGlhdGVseSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQkJCX0gZWxzZSB7CS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlIHNvZnRseQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlCisJCQkJCSAgICAodWlOb2RlSWRfcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBzcGVjaWZpZWQgTk1UIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgdG8gd2hpY2ggdGhlIE5NVCBjb21tYW5kIHdpbGwgYmUgc2VudAorLy8gICAgICAgICAgICAgIE5tdENvbW1hbmRfcCAgICAgICAgICAgID0gTk1UIGNvbW1hbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9IEVwbE5tdE1udVNlbmRObXRDb21tYW5kRXgodWlOb2RlSWRfcCwgTm10Q29tbWFuZF9wLCBOVUxMLCAwKTsKKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIG5vZGUgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIHRoZSBub2RlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZAorLy8gICAgICAgICAgICAgIE5vZGVDb21tYW5kX3AgICAgICAgICAgID0gbm9kZSBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51VHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRNbnVJbnROb2RlRXZlbnQgTm9kZUV2ZW50OworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisKKwlpZiAoKHVpTm9kZUlkX3AgPT0gMCkgfHwgKHVpTm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVDb21tYW5kX3ApIHsKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZEJvb3Q6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rOgorCQl7CisJCQlOb2RlRXZlbnQgPSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZENvbmZFcnI6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFcnJvcjsKKwkJCXdFcnJvckNvZGUgPSBFUExfRV9OTVRfQlBPMV9DRl9WRVJJRlk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQ6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFeGVjUmVzZXQ7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJewkJLy8gaW52YWxpZCBub2RlIGNvbW1hbmQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGZldGNoIGN1cnJlbnQgTk1UIHN0YXRlCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICB3RXJyb3JDb2RlLCBOb2RlRXZlbnQpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5NVCBzdGF0ZSBjaGFuZ2VzCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlQ2hhbmdlX3AgICAgICAgID0gTk1UIHN0YXRlIGNoYW5nZSBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgICAgTm10U3RhdGVDaGFuZ2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZG8gd29yayB3aGljaCBtdXN0IGJlIGRvbmUgaW4gdGhhdCBzdGF0ZQorCXN3aXRjaCAoTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlKSB7CisJCS8vIEVQTCBzdGFjayBpcyBub3QgcnVubmluZworLyogICAgICAgIGNhc2Uga0VwbE5tdEdzT2ZmOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKyAgICAgICAgY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKyAgICAgICAgLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKyAgICAgICAgY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisgICAgICAgIGNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorKi8KKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkJCS8vIHJlYWQgb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwkJCU9iZFNpemUgPSA0OworCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MCwgMCwKKwkJCQkJICAgICAmRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2R3Tm10U3RhcnR1cCwgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY29tcHV0ZSBTdGF0dXNSZXFEZWxheSA9IG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRQorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDEwMDYsIDAsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxTdGF0dXNSZXF1ZXN0RGVsYXkgPQorCQkJCSAgICBkd1RpbWVvdXQgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSAvIDEwMDBMOworCQkJCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5ID09IDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFN0YXR1c1JlcXVlc3REZWxheSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCS8vICQkJCBmZXRjaCBhbmQgdXNlIE11bHRpcGxleGVkQ3ljbGVDb3VudCBmcm9tIE9ECisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID0KKwkJCQkgICAgZHdUaW1lb3V0ICogRVBMX0NfTk1UX1NUQVRSRVFfQ1lDTEUgLyAxMDAwTDsKKwkJCQlpZiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID09CisJCQkJICAgIDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRDaGVja0NvbSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJfQorCQkJLy8gZmV0Y2ggUmVhZHlUb09wIFRpbWVvdXQgZnJvbSBPRAorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGODksIDUsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQkvLyBjb252ZXJ0IFt1c10gdG8gW21zXQorCQkJCWR3VGltZW91dCAvPSAxMDAwTDsKKwkJCQlpZiAoZHdUaW1lb3V0ID09IDBMKSB7CisJCQkJCWR3VGltZW91dCA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPQorCQkJCSAgICBkd1RpbWVvdXQ7CisJCQl9IGVsc2UgeworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPSAwTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisvKgorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworICAgICAgICAvLyBub2RlIGxpc3RlIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisgICAgICAgIGNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgcHJvY2VzcyBvbmx5IGFzeW5jIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHByb2Nlc3MgaXNvY2hyb251cyBhbmQgYXN5bmNocm9udXMgZnJhbWVzCisgICAgICAgIGNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisgICAgICAgIGNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9ybWFsIHdvcmsgc3RhdGUKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHN0b3BwZWQgYnkgTU4KKyAgICAgICAgLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbnVzIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gRVBMIGN5Y2xlCisgICAgICAgIC8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisgICAgICAgIGNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyovCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gTU4gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQl0RXBsRXZlbnQgRXZlbnQ7CisKKwkJCS8vIGNsZWFyIGdsb2JhbCBmbGFncywgZS5nLiByZWVuYWJsZSBib290IHByb2Nlc3MKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgPSAwOworCisJCQkvLyByZXNldCBJZGVudFJlc3BvbnNlcyBhbmQgcnVubmluZyBJZGVudFJlcXVlc3RzIGFuZCBTdGF0dXNSZXF1ZXN0cworCQkJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKwkJCVJldCA9IEVwbFN0YXR1c3VSZXNldCgpOworCisJCQkvLyByZXNldCB0aW1lcnMKKwkJCVJldCA9IEVwbE5tdE1udVJlc2V0KCk7CisKKwkJCS8vIDIwMDgvMTEvMTggZC5rLiByZXNldCBpbnRlcm5hbCBub2RlIGluZm8gaXMgbm90IG5lY2Vzc2FyeSwKKwkJCS8vICAgICAgICAgICAgICAgICBiZWNhdXNlIHRpbWVyIGZsYWdzIGFyZSBpbXBvcnRhbnQgYW5kIG90aGVyCisJCQkvLyAgICAgICAgICAgICAgICAgdGhpbmdzIGFyZSByZXNldCBieSBFcGxObXRNbnVTdGFydEJvb3RTdGVwMSgpLgorLyoKKyAgICAgICAgICAgIEVQTF9NRU1TRVQoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKSk7CisqLworCisJCQkvLyBpbmZvcm0gRExMIGFib3V0IE5NVCBzdGF0ZSBjaGFuZ2UsCisJCQkvLyBzbyB0aGF0IGl0IGNhbiBjbGVhciB0aGUgYXN5bmNob25vdXMgcXVldWVzIGFuZCBzdGFydCB0aGUgcmVkdWNlZCBjeWNsZQorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtTdGFydFJlZHVjZWRDeWNsZTsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJRXZlbnQubV91aVNpemUgPSAwOworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVzZXQgYWxsIG5vZGVzCisJCQkvLyBkLmsuOiBza2lwIHRoaXMgc3RlcCBpZiB3YXMganVzdCBkb25lIGJlZm9yZSwgZS5nLiBiZWNhdXNlIG9mIGEgUmVzZXROb2RlIGNvbW1hbmQgZnJvbSBhIGRpYWdub3N0aWMgbm9kZQorCQkJaWYgKE5tdFN0YXRlQ2hhbmdlX3AubV9ObXRFdmVudCA9PQorCQkJICAgIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDEpIHsKKwkJCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoMCwKKwkJCQkJCQkJRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCQkJa0VwbE5tdENtZFJlc2V0Tm9kZSk7CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZChFUExfQ19BRFJfQlJPQURDQVNULAorCQkJCQkJCSAgICBrRXBsTm10Q21kUmVzZXROb2RlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIHN0YXJ0IG5ldHdvcmsgc2NhbgorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDEoKTsKKworCQkJLy8gc3RhcnQgdGltZXIgZm9yIDB4MUY4OS8yIE1OVGltZW91dFByZU9wMV9VMzIKKwkJCU9iZFNpemUgPSBzaXplb2YoZHdUaW1lb3V0KTsKKwkJCVJldCA9IEVwbE9iZHVSZWFkRW50cnkoMHgxRjg5LCAyLCAmZHdUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZHdUaW1lb3V0ICE9IDBMKSB7CisJCQkJZHdUaW1lb3V0IC89IDEwMDBMOworCQkJCWlmIChkd1RpbWVvdXQgPT0gMEwpIHsKKwkJCQkJZHdUaW1lb3V0ID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCVRpbWVyQXJnLm1fdWxBcmcgPSAwOworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJkVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkJICAgbV9UaW1lckhkbE5tdFN0YXRlLAorCQkJCQkJCSAgIGR3VGltZW91dCwgVGltZXJBcmcpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBhZGQgaWRlbnRpZmllZCBDTnMgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJCS8vIHNlbmQgRW5hYmxlUmVhZHlUb09wIHRvIGFsbCBpZGVudGlmaWVkIENOcworCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDIoKTsKKworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBjaGVjayBpZiBQUmVzIG9mIENOcyBhcmUgT0sKKwkJCS8vIGQuay4gdGhhdCBtZWFucyB3YWl0IEN5Y2xlTGVuZ3RoICogTXVsdGlwbGV4Q3ljbGVDb3VudCAoaS5lLiBzdGFydCB0aW1lcikKKwkJCS8vICAgICAgYmVjYXVzZSBEbGxrIGNoZWNrcyBQUmVzIG9mIENOcyBhdXRvbWF0aWNhbGx5IGluIFJlYWR5VG9PcAorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRDaGVja0NvbSgpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCS8vIHNlbmQgU3RhcnROb2RlIHRvIENOcworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCVJldCA9IEVwbE5tdE1udVN0YXJ0Tm9kZXMoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gRVBMIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworLy8gICAgICAgICAgICBUUkFDRTAoIkVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZVxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYkNoZWNrRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVCBldmVudHMgYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGV4ZWN1dGVkLgorLy8gICAgICAgICAgICAgIFRoZSBFUEwgQVBJIGxheWVyIG11c3QgZm9yd2FyZCBOTVQgZXZlbnRzIGZyb20gTm10Q251IG1vZHVsZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1vZHVsZSB3aWxsIHJlamVjdCBzb21lIE5NVCBjb21tYW5kcyB3aGlsZSBNTi4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgTm10RXZlbnRfcCAgICAgICAgICAgICAgPSBvdXRzdGFuZGluZyBOTVQgZXZlbnQgZm9yIGFwcHJvdmFsCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICAgICAga0VwbFJlamVjdCAgICAgID0gcmVqZWN0IHRoZSBOTVQgZXZlbnQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYkNoZWNrRXZlbnQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICA9IHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIHRpbWVyIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlVGltZXI6CisJCXsKKwkJCXRFcGxUaW1lckV2ZW50QXJnICpwVGltZXJFdmVudEFyZyA9CisJCQkgICAgKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCXVpTm9kZUlkID0KKwkJCSAgICAodW5zaWduZWQgaW50KShwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgIG1fdWxBcmcgJgorCQkJCQkgICBFUExfTk1UTU5VX1RJTUVSQVJHX05PREVfTUFTSyk7CisJCQlpZiAodWlOb2RlSWQgIT0gMCkgeworCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJQllURSBiTm10U3RhdGU7CisJCQkJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwkJCQlwTm9kZUluZm8gPSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZCk7CisKKwkJCQlPYmRTaXplID0gMTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RSwgdWlOb2RlSWQsCisJCQkJCQkgICAgICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgocFRpbWVyRXZlbnRBcmctPgorCQkJCSAgICAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEpICE9CisJCQkJICAgIDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxLAorCQkJCQkJICAgICB1aU5vZGVJZCwKKwkJCQkJCSAgICAgKChwTm9kZUluZm8tPgorCQkJCQkJICAgICAgIG1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCQkgICAgICB8IDB4RkYpKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKy8qCisgICAgICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSkKKwkJCQkJICE9IDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTm9kZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSA+PiA4KSkpOworKi8KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50CisJCQkJCSAgICAodWlOb2RlSWQsCisJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkgICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmCisJCQkJCSAgRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04pICE9CisJCQkJCSAwTCkgeworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV93RmxhZ3MgJgorCQkJCQkgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiwKKwkJCQkJCSAgICAgdWlOb2RlSWQsCisJCQkJCQkgICAgICgocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgICBtX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkJICAgICAgfCAweEZGKSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisvKgorICAgICAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdGVNb24pOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfTE9OR0VSKQorCQkJCQkgIT0gMEwpIHsKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX0xPKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUikgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9MTykgPj4gOCkpKTsKKyovCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkgICAgICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfAorCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIpOworCQkJCX0KKworCQkJfSBlbHNlIHsJLy8gZ2xvYmFsIHRpbWVyIGV2ZW50CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OgorCQl7CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgKnBIZWFydGJlYXRFdmVudCA9CisJCQkgICAgKHRFcGxIZWFydGJlYXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHBIZWFydGJlYXRFdmVudC0+CisJCQkJCQkJICBtX3VpTm9kZUlkLAorCQkJCQkJCSAgcEhlYXJ0YmVhdEV2ZW50LT4KKwkJCQkJCQkgIG1fTm10U3RhdGUsCisJCQkJCQkJICBwSGVhcnRiZWF0RXZlbnQtPgorCQkJCQkJCSAgbV93RXJyb3JDb2RlLAorCQkJCQkJCSAga0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudDoKKwkJeworCQkJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJCQl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpOworCQkJTm10Q29tbWFuZCA9CisJCQkgICAgKHRFcGxObXRDb21tYW5kKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgICBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJCSAgICAgIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCQkJc3dpdGNoIChObXRDb21tYW5kKSB7CisJCQljYXNlIGtFcGxObXRDbWRTdGFydE5vZGU6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NPcGVyYXRpb25hbCAmIDB4RkYpOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJCQliTm10U3RhdGUgPSAoQllURSkgKGtFcGxObXRDc1N0b3BwZWQgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDI6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCQkJLy8gZC5rLiBkbyBub3QgY2hhbmdlIGV4cGVjdGVkIG5vZGUgc3RhdGUsIGJlY2F1c2Ugb2YgRFMgMS4wLjAgNy4zLjEuMi4xIFBsYWluIE5NVCBTdGF0ZSBDb21tYW5kCisJCQkJLy8gICAgICBhbmQgYmVjYXVzZSBub2RlIG1heSBub3QgY2hhbmdlIE5NVCBzdGF0ZSB3aXRoaW4gRVBMX0NfTk1UX1NUQVRFX1RPTEVSQU5DRQorCQkJCWJObXRTdGF0ZSA9CisJCQkJICAgIChCWVRFKSAoa0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyICYgMHhGRik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NOb3RBY3RpdmUgJiAweEZGKTsKKwkJCQkvLyBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCgpIHNldHMgaW50ZXJuYWwgbm9kZSBzdGF0ZSB0byBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bgorCQkJCS8vIGFmdGVyIG5leHQgdW5yZXNwb25kZWQgSWRlbnRSZXF1ZXN0L1N0YXR1c1JlcXVlc3QKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCS8vIHByb2Nlc3MgYXMgaW50ZXJuYWwgZXZlbnQgd2hpY2ggdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSBpbiBPRAorCQkJaWYgKHVpTm9kZUlkICE9IEVQTF9DX0FEUl9CUk9BRENBU1QpIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICh0RXBsTm10U3RhdGUpCisJCQkJCQkJCSAgICAoYk5tdFN0YXRlIHwKKwkJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJCQkgICAgMCwKKwkJCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50KTsKKworCQkJfSBlbHNlIHsJLy8gcHJvY2VzcyBpbnRlcm5hbCBldmVudCBmb3IgYWxsIGFjdGl2ZSBub2RlcyAoZXhjZXB0IG15c2VsZikKKworCQkJCWZvciAodWlOb2RlSWQgPSAxOworCQkJCSAgICAgdWlOb2RlSWQgPD0KKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCW1fYU5vZGVJbmZvKTsgdWlOb2RlSWQrKykgeworCQkJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkKS0+CisJCQkJCSAgICAgbV9kd05vZGVDZmcgJgorCQkJCQkgICAgIChFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOIHwKKwkJCQkJICAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPQorCQkJCQkgICAgMCkgeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJCSAgICAgMCwKKwkJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQpOworCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRFdmVudDsKKwkJfQorCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aVNpZ25hbFNsYXZlQ291bnRfcCwKKwkJCQkJICAgICBXT1JEICogcHdGbGFnc19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCA9PSBOVUxMKQorCSAgICB8fCAocHVpU2lnbmFsU2xhdmVDb3VudF9wID09IE5VTEwpCisJICAgIHx8IChwd0ZsYWdzX3AgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCSpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCSpwdWlTaWduYWxTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50OworCSpwd0ZsYWdzX3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorRFdPUkQgRXBsTm10TW51R2V0UnVubmluZ1RpbWVyU3RhdFJlcSh2b2lkKQorewordEVwbEtlcm5lbCAgICAgIFJldCA9IGtFcGxTdWNjZXNzZnVsOwordW5zaWduZWQgaW50ICAgIHVpSW5kZXg7Cit0RXBsTm10TW51Tm9kZUluZm8qIHBOb2RlSW5mbzsKKworICAgIHBOb2RlSW5mbyA9IEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm87CisgICAgZm9yICh1aUluZGV4ID0gMTsgdWlJbmRleCA8PSB0YWJlbnRyaWVzKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pOyB1aUluZGV4KyssIHBOb2RlSW5mbysrKQorICAgIHsKKyAgICAgICAgaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IGZsYWcgInNjYW5uZWQgb25jZSIKKyAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX1NDQU5ORUQ7CisKKyAgICAgICAgICAgIFJldCA9IEVwbE5tdE1udU5vZGVCb290U3RlcDIodWlJbmRleCwgcE5vZGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworICAgICAgICAgICAgLy8gc2lnbmFsIHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgU3RhdHVzUmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKyAgICAgICAgICAgIC8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKyAgICAgICAgfQorICAgIH0KKworRXhpdDoKKyAgICByZXR1cm4gUmV0OworfQorKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgTm10UmVxdWVzdAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIE5tdFJlcXVlc3QKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFJlcXVlc3QodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gJCQkIHBlcmZvcm0gTk1UUmVxdWVzdAorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgSWRlbnRSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxJZGVudFJlc3BvbnNlICoKKwkJCQkJCSAgcElkZW50UmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBJZGVudFJlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX0lERU5UX1JFUywJLy8gd2FzIEVQTF9FX05PX0VSUk9SCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSk7CisJfSBlbHNlIHsJCS8vIG5vZGUgYW5zd2VyZWQgSWRlbnRSZXF1ZXN0CisJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCURXT1JEIGR3RGV2VHlwZTsKKwkJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCXRFcGxObXRTdGF0ZSBObXRTdGF0ZSA9CisJCSAgICAodEVwbE5tdFN0YXRlKSAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCSAgICAoJnBJZGVudFJlc3BvbnNlX3AtPgorCQkJCSAgICAgbV9sZV9iTm10U3RhdHVzKSB8IEVQTF9OTVRfVFlQRV9DUyk7CisKKwkJLy8gY2hlY2sgSWRlbnRSZXNwb25zZSAkJCQgbW92ZSB0byBQcm9jZXNzSW50ZXJuLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhbHNvIGlmIENOCisKKwkJLy8gY2hlY2sgRGV2aWNlVHlwZSAoMHgxRjg0KQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjg0LCB1aU5vZGVJZF9wLCAmZHdEZXZUeXBlLCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlpZiAoZHdEZXZUeXBlICE9IDBMKSB7CS8vIGFjdHVhbGx5IGNvbXBhcmUgaXQgd2l0aCBEZXZpY2VUeXBlIGZyb20gSWRlbnRSZXNwb25zZQorCQkJaWYgKEFtaUdldER3b3JkRnJvbUxlKCZwSWRlbnRSZXNwb25zZV9wLT5tX2xlX2R3RGV2aWNlVHlwZSkgIT0gZHdEZXZUeXBlKSB7CS8vIHdyb25nIERldmljZVR5cGUKKwkJCQlObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQl3RXJyb3JDb2RlID0gRVBMX0VfTk1UX0JQTzFfREVWSUNFX1RZUEU7CisJCQl9CisJCX0KKworCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIE5tdFN0YXRlLAorCQkJCQkJICAgIHdFcnJvckNvZGUsCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBTdGF0dXNSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbFN0YXR1c1Jlc3BvbnNlICoKKwkJCQkJCSAgIHBTdGF0dXNSZXNwb25zZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFN0YXR1c1Jlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX1NUQVRVU19SRVMsCS8vIHdhcyBFUExfRV9OT19FUlJPUgorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnROb1N0YXR1c1Jlc3BvbnNlKTsKKwl9IGVsc2UgewkJLy8gbm9kZSBhbnN3ZXJlZCBTdGF0dXNSZXF1ZXN0CisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkKKwkJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICAoJnBTdGF0dXNSZXNwb25zZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDEKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMQorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRCb290U3RlcDEodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aVN1YkluZGV4OworCXVuc2lnbmVkIGludCB1aUxvY2FsTm9kZUlkOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gJCQkIGQuay46IHNhdmUgY3VycmVudCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisKKwkvLyBzdGFydCBuZXR3b3JrIHNjYW4KKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkvLyBjaGVjayAweDFGODEKKwl1aUxvY2FsTm9kZUlkID0gRXBsT2JkdUdldE5vZGVJZCgpOworCWZvciAodWlTdWJJbmRleCA9IDE7IHVpU3ViSW5kZXggPD0gMjU0OyB1aVN1YkluZGV4KyspIHsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MSwgdWlTdWJJbmRleCwgJmR3Tm9kZUNmZywgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJaWYgKHVpU3ViSW5kZXggIT0gdWlMb2NhbE5vZGVJZCkgeworCQkJLy8gcmVzZXQgZmxhZ3MgIm5vdCBzY2FubmVkIiBhbmQgImlzb2Nocm9ub3VzIgorCQkJRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlTdWJJbmRleCktPm1fd0ZsYWdzICY9CisJCQkgICAgfihFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTiB8CisJCQkgICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCk7CisKKwkJCWlmICh1aVN1YkluZGV4ID09IEVQTF9DX0FEUl9ESUFHX0RFRl9OT0RFX0lEKSB7CS8vIGRpYWdub3N0aWMgbm9kZSBtdXN0IGJlIHNjYW5uZWQgYnkgTU4gaW4gYW55IGNhc2UKKwkJCQlkd05vZGVDZmcgfD0KKwkJCQkgICAgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfAorCQkJCSAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpOworCQkJCS8vIGFuZCBpdCBtdXN0IGJlIGlzb2Nocm9ub3VzbHkgYWNjZXNzZWQKKwkJCQlkd05vZGVDZmcgJj0gfkVQTF9OT0RFQVNTSUdOX0FTWU5DT05MWV9OT0RFOworCQkJfQorCQkJLy8gc2F2ZSBub2RlIGNvbmZpZyBpbiBsb2NhbCBub2RlIGluZm8gc3RydWN0dXJlCisJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV9kd05vZGVDZmcgPQorCQkJICAgIGR3Tm9kZUNmZzsKKwkJCUVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpU3ViSW5kZXgpLT5tX05vZGVTdGF0ZSA9CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJCWlmICgoZHdOb2RlQ2ZnICYgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsJLy8gbm9kZSBpcyBjb25maWd1cmVkIGFzIENOCisJCQkJLy8gaWRlbnRpZnkgdGhlIG5vZGUKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1aVN1YkluZGV4LAorCQkJCQkJCQkgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV93RmxhZ3MgfD0KKwkJCQkgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIElkZW50UmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKworCQkJCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiB3YXMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CS8vIHN1YmluZGV4IG9mIE1OCisJCQlpZiAoKGR3Tm9kZUNmZyAmIChFUExfTk9ERUFTU0lHTl9NTl9QUkVTIHwgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPSAwKSB7CS8vIE1OIHNoYWxsIHNlbmQgUFJlcworCQkJCXRFcGxEbGxOb2RlSW5mbyBEbGxOb2RlSW5mbzsKKworCQkJCUVQTF9NRU1TRVQoJkRsbE5vZGVJbmZvLCAwLAorCQkJCQkgICBzaXplb2YoRGxsTm9kZUluZm8pKTsKKwkJCQlEbGxOb2RlSW5mby5tX3VpTm9kZUlkID0gdWlMb2NhbE5vZGVJZDsKKworCQkJCVJldCA9IEVwbERsbHVDYWxBZGROb2RlKCZEbGxOb2RlSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDIKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMi4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZAorLy8gICAgICAgICAgICAgIE5NVCBFbmFibGVSZWFkeVRvT3AuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZCBOTVQgRW5hYmxlUmVhZHlUb09wCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVDb25maWd1cmVkKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aUluZGV4LCBwTm9kZUluZm8pOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCisJCQkJaWYgKChwTm9kZUluZm8tPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJfQorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyCisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0cyBCb290U3RlcDIgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoZSBDTiBpcyBhZGRlZCB0byBpc29jaHJvbm91cyBwaGFzZSBpZiBub3QKKy8vICAgICAgICAgICAgICBhc3luYy1vbmx5IGFuZCBpdCBnZXRzIHRoZSBOTVQgY29tbWFuZCBFbmFibGVSZWFkeVRvT3AuCisvLyAgICAgICAgICAgICAgVGhlIENOIG11c3QgYmUgaW4gbm9kZSBzdGF0ZSBDb25maWd1cmVkLCB3aGVuIGl0IGVudGVycworLy8gICAgICAgICAgICAgIEJvb3RTdGVwMi4gV2hlbiBCb290U3RlcDIgZmluaXNoZXMsIHRoZSBDTiBpcyBpbiBub2RlIHN0YXRlCisvLyAgICAgICAgICAgICAgUmVhZHlUb09wLgorLy8gICAgICAgICAgICAgIElmIFRpbWVvdXRSZWFkeVRvT3AgaW4gb2JqZWN0IDB4MUY4OS81IGlzIGNvbmZpZ3VyZWQsCisvLyAgICAgICAgICAgICAgVGltZXJIZGxMb25nZXIgd2lsbCBiZSBzdGFydGVkIHdpdGggdGhpcyB0aW1lb3V0LgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwTm9kZUluZm9fcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgdEVwbE5tdE1udU5vZGVJbmZvICogcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsTm9kZUluZm8gRGxsTm9kZUluZm87CisJRFdPUkQgZHdOb2RlQ2ZnOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJZHdOb2RlQ2ZnID0gcE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnOworCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApIHsJLy8gYWRkIG5vZGUgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJRGxsTm9kZUluZm8ubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOTIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV9kd1ByZXNUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCU9iZFNpemUgPSAyOworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOEIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV93UHJlcVBheWxvYWRMaW1pdCwKKwkJCQkgICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDI7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RCwgdWlOb2RlSWRfcCwKKwkJCQkgICAgICZEbGxOb2RlSW5mby5tX3dQcmVzUGF5bG9hZExpbWl0LAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgfD0gRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST047CisKKwkJUmV0ID0gRXBsRGxsdUNhbEFkZE5vZGUoJkRsbE5vZGVJbmZvKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwl9CisKKwlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsCisJCQkJCXVpTm9kZUlkX3AsCisJCQkJCWtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZSk7CisKKwlSZXQgPQorCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0UmVhZHlUb09wICE9IDBMKSB7CS8vIHN0YXJ0IHRpbWVyCisJCS8vIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgdGhlIENOIG11c3QgYmUgUmVhZHlUb09wCisJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0xPTkdFUihwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgVGltZXJBcmcpOworLy8gICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICBUaW1lckFyZy5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgfCB1aU5vZGVJZF9wOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIsCisJCQkJCSAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgIG1fdWxUaW1lb3V0UmVhZHlUb09wLCBUaW1lckFyZyk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVN0YXJ0Q2hlY2tDb20KKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIENoZWNrQ29tbXVuaWNhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHdhaXQgc29tZSB0aW1lIGFuZCBjaGVjayB0aGF0IG5vIGNvbW11bmljYXRpb24gZXJyb3Igb2NjdXJzCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZWFkeVRvT3ApIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVOb2RlQ2hlY2tDb20odWlJbmRleCwgcE5vZGVJbmZvKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gdGltZXIgd2FzIHN0YXJ0ZWQKKwkJCQkJLy8gd2FpdCB1bnRpbCBpdCBleHBpcmVzCisJCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgcmVnYXJkbGVzcyBvZiBhbiBlcnJvcgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgbm8gZXJyb3Igb2NjdXJlZAorCQkJfQorCQl9CisJfQorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Tm9kZUNoZWNrQ29tCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBjb21tdW5pY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIHdhaXQgc29tZSB0aW1lIGFuZCBpZiBubyBlcnJvciBvY2N1cmVkIGV2ZXJ5dGhpbmcKKy8vICAgICAgICAgICAgICBpcyBPSy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgcE5vZGVJbmZvX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwlkd05vZGVDZmcgPSBwTm9kZUluZm9fcC0+bV9kd05vZGVDZmc7CisJaWYgKCgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApCisJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0Q2hlY2tDb20gIT0gMEwpKSB7CS8vIENOIGlzIG5vdCBhc3luYy1vbmx5IGFuZCB0aW1lb3V0IGZvciBDaGVja0NvbSB3YXMgc2V0CisKKwkJLy8gY2hlY2sgY29tbXVuaWNhdGlvbiwKKwkJLy8gdGhhdCBtZWFucyB3YWl0IHNvbWUgdGltZSBhbmQgaWYgbm8gZXJyb3Igb2NjdXJlZCBldmVyeXRoaW5nIGlzIE9LOworCisJCS8vIHN0YXJ0IHRpbWVyICh3aGVuIHRoZSB0aW1lciBleHBpcmVzIHRoZSBDTiBtdXN0IGJlIHN0aWxsIFJlYWR5VG9PcCkKKwkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfTE9OR0VSKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisvLyAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3A7CisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm9fcC0+bV9UaW1lckhkbExvbmdlciwKKwkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgbV91bFRpbWVvdXRDaGVja0NvbSwgVGltZXJBcmcpOworCisJCS8vIHVwZGF0ZSBtYW5kYXRvcnkgc2xhdmUgY291bnRlciwgYmVjYXVzZSB0aW1lciB3YXMgc3RhcnRlZAorCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlSZXQgPSBrRXBsUmVqZWN0OworCQl9CisJfSBlbHNlIHsJCS8vIHRpbWVyIHdhcyBub3Qgc3RhcnRlZAorCQkvLyBhc3N1bWUgZXZlcnl0aGluZyBpcyBPSworCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZDsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTdGFydE5vZGVzCisvLworLy8gRGVzY3JpcHRpb246IHJlYWxseSBzdGFydHMgYWxsIG5vZGVzIHdoaWNoIGFyZSBSZWFkeVRvT3AgYW5kIENoZWNrQ29tIGRpZCBub3QgZmFpbAorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnROb2Rlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHNlbmQgTk1UIGNvbW1hbmQgU3RhcnQgTm9kZQorCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9IDA7CisJCS8vIHJlc2V0IGZsYWcgdGhhdCBhcHBsaWNhdGlvbiB3YXMgaW5mb3JtZWQgYWJvdXQgcG9zc2libGUgc3RhdGUgY2hhbmdlCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisKKwkJcE5vZGVJbmZvID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbzsKKwkJZm9yICh1aUluZGV4ID0gMTsKKwkJICAgICB1aUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlJbmRleCsrLCBwTm9kZUluZm8rKykgeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZCkgeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fZHdObXRTdGFydHVwICYgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMpCisJCQkJICAgID09IDApIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJCQkJdWlJbmRleCwKKwkJCQkJCQkJCWtFcGxObXRDbWRTdGFydE5vZGUpOworCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aUluZGV4LAorCQkJCQkJCQkgICAga0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudCsrOworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBPUEVSQVRJT05BTAorCQkJfQorCQl9CisKKwkJLy8gJCQkIGluZm9ybSBhcHBsaWNhdGlvbiBpZiBFUExfTk1UU1RfTk9fU1RBUlROT0RFIGlzIHNldAorCisJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJICAgICBtX2R3Tm10U3RhcnR1cCAmIEVQTF9OTVRTVF9TVEFSVEFMTE5PREVTKSAhPSAwKSB7CisJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsIEVQTF9DX0FEUl9CUk9BRENBU1QsCisJCQkJCQkJa0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisKKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQoRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCSAgICBrRXBsTm10Q21kU3RhcnROb2RlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGludGVybmFsIG5vZGUgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLyAgICAgICAgICAgICAgTm9kZUV2ZW50X3AgICAgICAgICAgICAgPSBvY2N1cmVkIGV2ZW50cworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsTm10U3RhdGUgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQlXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCXRFcGxObXRNbnVJbnROb2RlRXZlbnQKKwkJCQkJCU5vZGVFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCXRFcGxObXRNbnVOb2RlSW5mbyAqcE5vZGVJbmZvOworCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCXBOb2RlSW5mbyA9IEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApOworCU5tdFN0YXRlID0gRXBsTm10dUdldE5tdFN0YXRlKCk7CisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBub3QgYWN0aXZlCisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVFdmVudF9wKSB7CisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SWRlbnRSZXNwb25zZToKKwkJeworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlKTsKKworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSB7CisJCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9CisJCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkOworCQkJfQorCQkJLy8gcmVzZXQgZmxhZ3MgSVNPQ0hST04gYW5kIE5NVF9DTURfSVNTVUVECisJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9IH4oRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04KKwkJCQkJCSB8CisJCQkJCQkgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCQkJLy8gdXBkYXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOCB0byBQcmVPcDEgKGV2ZW4gaWYgbG9jYWwgc3RhdGUgPj0gUHJlT3AyKQorCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgJiAweEZGKTsKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkdVdyaXRlRW50cnkoMHgxRjhGLCB1aU5vZGVJZF9wLCAmYk5tdFN0YXRlLAorCQkJCQkgICAgICAxKTsKKworCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVxdWVzdCBTdGF0dXNSZXNwb25zZSBpbW1lZGlhdGVseSwKKwkJCS8vIGJlY2F1c2Ugd2Ugd2FudCBhIGZhc3QgYm9vdC11cCBvZiBDTnMKKwkJCVJldCA9CisJCQkgICAgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZSh1aU5vZGVJZF9wLAorCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5vZGVFdmVudF9wLAorCQkJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJCQlSZXQpOworCisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIGZyb20gd2l0aGluCisJCQkJCS8vIHRoZSBTdGF0UmVxIHRpbWVyIGV2ZW50LgorCQkJCQkvLyBzbyBpZ25vcmUgdGhpcyBlcnJvci4KKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRGb3VuZCwKKwkJCQkJCSAgICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgICAocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCSAgICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCSAgICAgIT0gMCk7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CS8vIGludGVycnVwdCBib290IHByb2Nlc3Mgb24gdXNlciByZXF1ZXN0CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKE5vZGVFdmVudF9wLCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkgICAgICB8IFJldCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIGNvbnRpbnVlIEJvb3RTdGVwMQorCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OgorCQl7CisKKwkJCS8vICQkJCBjaGVjayBpZGVudGlmaWNhdGlvbiAodmVuZG9yIElELCBwcm9kdWN0IGNvZGUsIHJldmlzaW9uIG5vLCBzZXJpYWwgbm8pCisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlID09CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsKKwkJCQkvLyAkJCQgY2hlY2sgc29mdHdhcmUKKworCQkJCS8vIGNoZWNrL3N0YXJ0IGNvbmZpZ3VyYXRpb24KKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRDaGVja0NvbmYsCisJCQkJCQkgICAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJCSAgICAgKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkgICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pCisJCQkJCQkgICAgICE9IDApOworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyBpbnRlcnJ1cHQgYm9vdCBwcm9jZXNzIG9uIHVzZXIgcmVxdWVzdAorCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudEJvb3QsCisJCQkJCSAgICAgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290LAorCQkJCQkgICAgIHVpTm9kZUlkX3AsCisJCQkJCSAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCSAgICAgIHwgUmV0KSk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vICQkJCBkLmsuOiBjdXJyZW50bHkgd2UgYXNzdW1lIGNvbmZpZ3VyYXRpb24gaXMgT0sKKworCQkJLy8gY29udGludWUgQm9vdFN0ZXAxCisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudENvbmZpZ3VyZWQ6CisJCXsKKwkJCWlmICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgICBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkKKwkJCSAgICAmJiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCisJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ7CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQlpZiAoKHBOb2RlSW5mby0+bV9kd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gZGVjcmVtZW50IG1hbmRhdG9yeSBDTiBjb3VudGVyCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudC0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gcHV0IG9wdGlvbmFsIG5vZGUgdG8gbmV4dCBzdGVwIChCb290U3RlcDIpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aU5vZGVJZF9wLAorCQkJCQkJCSAgIHBOb2RlSW5mbyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0KKwkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisJCQl9CisJCQkvLyAkJCQgZC5rLiBjaGVjayBzdGFydCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisJCQkvLyAkJCQgZC5rLiBjaGVjayBpbmRpdmlkdWFsIHRpbWVvdXQgMHgxRjg5LzYgTU5JZGVudGlmaWNhdGlvblRpbWVvdXRfVTMyCisJCQkvLyBpZiBtYW5kYXRvcnkgbm9kZSBhbmQgdGltZW91dCBlbGFwc2VkIC0+IGhhbHQgYm9vdCBwcm9jZWR1cmUKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluIChpZiA+PSBQcmVPcDIsIGFmdGVyIGRlbGF5KQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikgewkvLyBzdGFydCB0aW1lcgorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0lERU5UUkVRCisJCQkJICAgIChwTm9kZUluZm8sIHVpTm9kZUlkX3AsIFRpbWVyQXJnKTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0lERU5UUkVRIHwgdWlOb2RlSWRfcDsKKy8qCisgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0gZWxzZSB7CS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGltbWVkaWF0ZWx5CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQl9CisJCQkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLCBwTm9kZUluZm8sCisJCQkJCQkgICBOb2RlTm10U3RhdGVfcCwgd0Vycm9yQ29kZV9wLAorCQkJCQkJICAgTm10U3RhdGUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQkvLyByZXF1ZXN0IG5leHQgU3RhdHVzUmVzcG9uc2UgaW1tZWRpYXRlbHkKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwgUmV0KTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTikgPT0gMCkgewkvLyBzdGFydCB0aW1lcgorCQkJCS8vIG5vdCBpc29jaHJvbm91c2x5IGFjY2Vzc2VkIENOIChlLmcuIGFzeW5jLW9ubHkgb3Igc3RvcHBlZCBDTikKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19TVEFUUkVRKHBOb2RlSW5mbywKKwkJCQkJCQkJICAgICAgdWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgICAgVGltZXJBcmcpOworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSB8IHVpTm9kZUlkX3A7CisvKgorICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2U6CisJCXsKKwkJCS8vIGZ1bmN0aW9uIENoZWNrTm10U3RhdGUgc2V0cyBub2RlIHN0YXRlIHRvIHVua25vd24gaWYgbmVjZXNzYXJ5CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEVycm9yOgorCQl7CQkvLyBjdXJyZW50bHkgb25seSBpc3N1ZWQgb24ga0VwbE5tdE5vZGVDb21tYW5kQ29uZkVycgorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAga0VwbE5tdENzTm90QWN0aXZlLAorCQkJCQkJICAgd0Vycm9yQ29kZV9wLCBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEV4ZWNSZXNldDoKKwkJeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0ga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmY7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmCisJCQkJCQkJICAgMHhGRikgPDwgOCkKKwkJCQkJCQkgfAorCQkJCQkJCSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uKSk7CisKKwkJCS8vIHNlbmQgTk1UIHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gQ04gZm9yIGFjdGl2YXRpb24gb2YgY29uZmlndXJhdGlvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24pOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SGVhcnRiZWF0OgorCQl7CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxCisJCQkgICAgKCJUaW1lclN0YXRSZXEtPklkZW50UmVxKCUwMlgpXG4iLCB1aU5vZGVJZF9wKTsKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluCisJCQlSZXQgPQorCQkJICAgIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGlzIGNhbiBoYXBwZW4gYmVjYXVzZSBvZiBhIGJ1ZyBpbiBFcGxUaW1lcnVMaW51eEtlcm5lbC5jCisJCQkJCS8vIHNvIGlnbm9yZSB0aGlzIGVycm9yLgorCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRlTW9uOgorCQl7CisJCQkvLyByZXNldCBOTVQgc3RhdGUgY2hhbmdlIGZsYWcKKwkJCS8vIGJlY2F1c2UgZnJvbSBub3cgb24gdGhlIENOIG11c3QgaGF2ZSB0aGUgY29ycmVjdCBOTVQgc3RhdGUKKwkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQ7CisKKwkJCS8vIGNvbnRpbnVlIHdpdGggbm9ybWFsIFN0YXRSZXEgcHJvY2Vzc2luZworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxKCJUaW1lclN0YXRSZXEtPlN0YXRSZXEoJTAyWClcbiIsCisJCQkJCQl1aU5vZGVJZF9wKTsKKwkJCS8vIHJlcXVlc3QgbmV4dCBTdGF0dXNSZXNwb25zZQorCQkJUmV0ID0KKwkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIHdoaWxlIHByb2Nlc3NpbmcKKwkJCQkJLy8gZXZlbnQgSWRlbnRSZXNwb25zZS4KKwkJCQkJLy8gc28gaWdub3JlIHRoaXMgZXJyb3IuCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyOgorCQl7CisJCQlzd2l0Y2ggKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUpIHsKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ6CisJCQkJewkvLyBub2RlIHNob3VsZCBiZSBSZWFkeVRvT3AgYnV0IGl0IGlzIG5vdAorCisJCQkJCS8vIGNoZWNrIE5NVCBzdGF0ZSB3aGljaCBzaGFsbCBiZSBpbnRlbnRpb25hbGx5IHdyb25nLCBzbyB0aGF0IEVSUk9SX1RSRUFUTUVOVCB3aWxsIGJlIHN0YXJ0ZWQKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgcE5vZGVJbmZvLAorCQkJCQkJCQkgICBrRXBsTm10Q3NOb3RBY3RpdmUsCisJCQkJCQkJCSAgIEVQTF9FX05NVF9CUE8yLAorCQkJCQkJCQkgICBObXRTdGF0ZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDoKKwkJCQl7CS8vIENoZWNrQ29tIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCisJCQkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPQorCQkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQ7CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkKKwkJCQkJICAgICE9IDApIHsKKwkJCQkJCS8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9CisJCQkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJCQl9CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9CisJCQkJCSAgICAwKSB7CisJCQkJCQkvLyBkZWNyZW1lbnQgbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIKKwkJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJCQkJfQorCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdE1zUmVhZHlUb09wZXJhdGUpIHsKKwkJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJCSAgICAoTm9kZUV2ZW50X3AsIHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikKKwkJCQkJCSAgICAgICA8PCA4KQorCQkJCQkJICAgICAgfCBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkJCS8vIHN0YXJ0IG9wdGlvbmFsIENOCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisJCQkJCQkgICAgKHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50OgorCQl7CisJCQlCWVRFIGJObXRTdGF0ZTsKKworCQkJLy8gdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSB3aXRoIHRoZSBvbmUgdGhhdCByZXN1bHRzCisJCQkvLyBmcm9tIHRoZSBzZW50IE5NVCBjb21tYW5kCisJCQliTm10U3RhdGUgPSAoQllURSkgKE5vZGVObXRTdGF0ZV9wICYgMHhGRik7CisKKwkJCS8vIHdyaXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsCisJCQkJCSAgICAgIDEpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc05vdEFjdGl2ZSkgewkvLyByZXN0YXJ0IHByb2Nlc3Npbmcgd2l0aCBJZGVudFJlcXVlc3QKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUQorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisJCQl9IGVsc2UgewkvLyBtb25pdG9yIE5NVCBzdGF0ZSBjaGFuZ2Ugd2l0aCBTdGF0dXNSZXF1ZXN0IGFmdGVyCisJCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXk7CisJCQkJLy8gdW50aWwgdGhlbiB3cm9uZyBOTVQgc3RhdGVzIHdpbGwgYmUgaWdub3JlZAorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRFX01PTgorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisKKwkJCQkvLyBzZXQgTk1UIHN0YXRlIGNoYW5nZSBmbGFnCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRDsKKwkJCX0KKworCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm8tPgorCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgbV91bFN0YXR1c1JlcXVlc3REZWxheSwKKwkJCQkJCSAgIFRpbWVyQXJnKTsKKworCQkJLy8gZmluaXNoIHByb2Nlc3NpbmcsIGJlY2F1c2UgTm10U3RhdGVfcCBpcyB0aGUgZXhwZWN0ZWQgYW5kIG5vdCB0aGUgY3VycmVudCBzdGF0ZQorCQkJZ290byBFeGl0OworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIG5ldHdvcmsgaXMgcmVhZHkgdG8gY2hhbmdlIGxvY2FsIE5NVCBzdGF0ZSBhbmQgdGhpcyB3YXMgbm90IGRvbmUgYmVmb3JlCisJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzICYgKEVQTF9OTVRNTlVfRkxBR19IQUxURUQgfCBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEKSkgPT0gMCkgewkvLyBib290IHByb2Nlc3MgaXMgbm90IGhhbHRlZAorCQlzd2l0Y2ggKE5tdFN0YXRlKSB7CisJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Qm9vdFN0ZXAxRmluaXNoLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIHdhaXQgZm9yIGFwcGxpY2F0aW9uCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBlbnRlciBQcmVPcDIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwkJCXsKKwkJCQlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPT0KKwkJCQkgICAgIDApCisJCQkJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID09IDApKSB7CS8vIGFsbCBvcHRpb25hbCBDTnMgY2hlY2tlZCBvbmNlIGZvciBSZWFkeVRvT3AgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBSZWFkeVRvT3AKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyB8PQorCQkJCQkgICAgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKwkJCQkJLy8gaW5mb3JtIGFwcGxpY2F0aW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wZm5DYkJvb3RFdmVudAorCQkJCQkgICAgKGtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIFJlYWR5VG9PcAorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCQl7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID09CisJCQkJICAgICAwKQorCQkJCSAgICAmJiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9PSAwKSkgewkvLyBhbGwgQ05zIGNoZWNrZWQgZm9yIGVycm9ybGVzcyBjb21tdW5pY2F0aW9uCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIE9wZXJhdGlvbmFsCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlck1zT3BlcmF0aW9uYWwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc09wZXJhdGlvbmFsOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPUEVSQVRJT05BTAorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzIHw9CisJCQkJCSAgICBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCQkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3BmbkNiQm9vdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEJvb3RFdmVudE9wZXJhdGlvbmFsLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIGlnbm9yZSBlcnJvciBjb2RlCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBOTVQgc3RhdGUsIGkuZS4gZXZhbHVhdGVzIGl0IHdpdGggb2JqZWN0IDB4MUY4RgorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVFeHBTdGF0ZV9BVTggYW5kIHVwZGF0ZXMgb2JqZWN0IDB4MUY4RQorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4LgorLy8gICAgICAgICAgICAgIEl0IG1hbmlwdWxhdGVzIG1fTm9kZVN0YXRlIGluIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ICAgICAgICAgID0gQ04gd2FzIGluIHdyb25nIHN0YXRlIGFuZCBoYXMgYmVlbiByZXNldAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJQllURSBiTm10U3RhdGVQcmV2OworCXRFcGxObXRTdGF0ZSBFeHBObXRTdGF0ZTsKKworCU9iZFNpemUgPSAxOworCS8vIHJlYWQgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29tcHV0ZSBleHBlY3RlZCBOTVQgc3RhdGUKKwlFeHBObXRTdGF0ZSA9ICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfCBFUExfTk1UX1RZUEVfQ1MpOworCS8vIGNvbXB1dGUgQllURSBvZiBjdXJyZW50IE5NVCBzdGF0ZQorCWJObXRTdGF0ZSA9ICgoQllURSkgTm9kZU5tdFN0YXRlX3AgJiAweEZGKTsKKworCWlmIChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NOb3RBY3RpdmUpIHsJLy8gaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlLCBiZWNhdXNlIHRoZSBDTiBzaGFsbCBiZSBub3QgYWN0aXZlCisJCVJldCA9IGtFcGxSZWplY3Q7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gUmVhZHlUb09wCisJCS8vIGRlbGV0ZSB0aW1lciBmb3IgdGltZW91dCBoYW5kbGluZworCQlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDsKKworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4IHRvIFJlYWR5VG9PcAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoKHBOb2RlSW5mb19wLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOIC0+IGRlY3JlbWVudCBjb3VudGVyCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50LS07CisJCX0KKwkJaWYgKExvY2FsTm10U3RhdGVfcCA+PSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSkgewkvLyBzdGFydCBwcm9jZWR1cmUgQ2hlY2tDb21tdW5pY2F0aW9uIGZvciB0aGlzIG5vZGUKKwkJCVJldCA9IEVwbE5tdE1udU5vZGVDaGVja0NvbSh1aU5vZGVJZF9wLCBwTm9kZUluZm9fcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsTm10U3RhdGVfcCA9PSBrRXBsTm10TXNPcGVyYXRpb25hbCkKKwkJCSAgICAmJiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09CisJCQkJa0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQpKSB7CisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLCB1aU5vZGVJZF9wLAorCQkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmIDB4RkYpIDw8IDgpCisJCQkJCQkJCSB8CisJCQkJCQkJCSBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkvLyBpbW1lZGlhdGVseSBzdGFydCBvcHRpb25hbCBDTiwgYmVjYXVzZSBjb21tdW5pY2F0aW9uIGlzIGFsd2F5cyBPSyAoZS5nLiBhc3luYy1vbmx5IENOKQorCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgPT0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NPcGVyYXRpb25hbCkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gT1BFUkFUSU9OQUwKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZU9wZXJhdGlvbmFsOworCisJCWlmICgocE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04gLT4gZGVjcmVtZW50IGNvdW50ZXIKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgIT0gTm9kZU5tdFN0YXRlX3ApCisJCSAgICYmICEoKEV4cE5tdFN0YXRlID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpKSkgewkvLyBDTiBpcyBub3QgaW4gZXhwZWN0ZWQgTk1UIHN0YXRlICh3aXRob3V0IHRoZSBleGNlcHRpb25zIGFib3ZlKQorCQlXT1JEIHdiZUVycm9yQ29kZTsKKworCQlpZiAoKHBOb2RlSW5mb19wLT4KKwkJICAgICBtX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEKSAhPSAwKSB7CisJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQgaWYgY2hlY2tlZCBvbmNlCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCX0KKworCQlpZiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09IGtFcGxObXRNbnVOb2RlU3RhdGVVbmtub3duKSB7CS8vIENOIGlzIGFscmVhZHkgaW4gc3RhdGUgdW5rbm93biwgd2hpY2ggbWVhbnMgdGhhdCBpdCBnb3QKKwkJCS8vIE5NVCByZXNldCBjb21tYW5kIGVhcmxpZXIKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyAtPiBDTiBpcyBpbiB3cm9uZyBOTVQgc3RhdGUKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJaWYgKHdFcnJvckNvZGVfcCA9PSAwKSB7CS8vIGFzc3VtZSB3cm9uZyBOTVQgc3RhdGUgZXJyb3IKKwkJCWlmICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpICE9IDApIHsJLy8gTk1UIGNvbW1hbmQgaGFzIGJlZW4ganVzdCBpc3N1ZWQ7CisJCQkJLy8gaWdub3JlIHdyb25nIE5NVCBzdGF0ZSB1bnRpbCB0aW1lciBleHBpcmVzOworCQkJCS8vIG90aGVyIGVycm9ycyBsaWtlIExPU1NfUFJFU19USCBhcmUgc3RpbGwgcHJvY2Vzc2VkCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQl3RXJyb3JDb2RlX3AgPSBFUExfRV9OTVRfV1JPTkdfU1RBVEU7CisJCX0KKworCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkvLyAkJCQgc3RhcnQgRVJST1JfVFJFQVRNRU5UIGFuZCBpbmZvcm0gYXBwbGljYXRpb24KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudEVycm9yLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCSB8IGtFcGxObXRDbWRSZXNldE5vZGUpKTsKKworCQkvLyByZXNldCBDTgorCQkvLyBzdG9yZSBlcnJvciBjb2RlIGluIE5NVCBjb21tYW5kIGRhdGEgZm9yIGRpYWdub3N0aWMgcHVycG9zZQorCQlBbWlTZXRXb3JkVG9MZSgmd2JlRXJyb3JDb2RlLCB3RXJyb3JDb2RlX3ApOworCQlSZXQgPQorCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kUmVzZXROb2RlLAorCQkJCQkgICAgICAmd2JlRXJyb3JDb2RlLAorCQkJCQkgICAgICBzaXplb2Yod2JlRXJyb3JDb2RlKSk7CisJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCVJldCA9IGtFcGxSZWplY3Q7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4IGhhcyB0byBiZSBjaGFuZ2VkCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGVQcmV2LCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCWlmIChiTm10U3RhdGUgIT0gYk5tdFN0YXRlUHJldikgeworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RSBOTVRfTU5Ob2RlQ3VyclN0YXRlX0FVOAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVJlc2V0CisvLworLy8gRGVzY3JpcHRpb246IHJlc2V0IGludGVybmFsIHN0cnVjdHVyZXMsIGUuZy4gdGltZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UmVzZXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlpbnQgaUluZGV4OworCisJUmV0ID0gRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbE5tdE1udUluc3RhbmNlX2cubV9UaW1lckhkbE5tdFN0YXRlKTsKKworCWZvciAoaUluZGV4ID0gMTsgaUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICBpSW5kZXgrKykgeworCQkvLyBkZWxldGUgdGltZXIgaGFuZGxlcworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbFN0YXRSZXEpOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbExvbmdlcik7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmQwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGsuYwpAQCAtMCwwICsxLDE4NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgTk1ULUtlcm5lbHNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJrLmgiCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgkvLyBmb3IgRXBsRGxsa1Byb2Nlc3MoKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorI2RlZmluZSBFUExfTk1US19EQkdfUE9TVF9UUkFDRV9WQUxVRShObXRFdmVudF9wLCBPbGRObXRTdGF0ZV9wLCBOZXdObXRTdGF0ZV9wKSBcCisgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKChrRXBsRXZlbnRTaW5rTm10ayA8PCAyOCkgfCAoTm10RXZlbnRfcCA8PCAxNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoT2xkTm10U3RhdGVfcCAmIDB4RkYpIDw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoTmV3Tm10U3RhdGVfcCAmIDB4RkYpKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3QgZm9yIGluc3RhbmNlIHRhYmxlCitJTlNUQU5DRV9UWVBFX0JFR0lOIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCitTVEFUSUMgdm9sYXRpbGUgdEVwbE5tdFN0YXRlIElOU1RfRkFSIG1fTm10U3RhdGU7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZTsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkFwcFJlYWR5VG9PcGVyYXRlOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mVGltZXJNc1ByZU9wMjsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQ7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZGcm96ZW47CisKK0lOU1RBTkNFX1RZUEVfRU5ECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhpcyBtYWNybyByZXBsYWNlIHRoZSB1bnNwZWNpZmljIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2UgdGhyb3VnaAorLy8gdGhlIG1vZHVsIHNwZWNpZmljIHR5cGUgZm9yIHRoZSBsb2NhbCBpbnN0YW5jZSB0YWJsZS4gVGhpcyBtYWNybworLy8gbXVzdCBkZWZpbmVkIGluIGVhY2ggbW9kdWwuCisvLyNkZWZpbmUgdEVwbFB0ckluc3RhbmNlICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gTUVNKgorRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPE5NVF9LZXJuZWwtTW9kdWxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgbW9kdWxlIHJlYWxpemUgdGhlIE5NVC1TdGF0ZS1NYWNoaW5lIG9mIHRoZSBFUEwtU3RhY2sKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgPSBOb2RlIElkIG9mIHRoZSBsb2thbCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a0luaXQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRrQWRkSW5zdGFuY2UoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkcyBhIG5ldyBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwlFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMIHRFcGxLZXJuZWwgUmV0OworLy90RXBsRXZlbnQgICAgICAgICAgICAgICBFdmVudDsKKy8vdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgTm10U3RhdGVDaGFuZ2U7CisKKwkvLyBjaGVjayBpZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIgdmFsaWQKKwkvLyBnZXQgZnJlZSBpbnN0YW5jZSBhbmQgc2V0IHRoZSBnbG9iYWxlIGluc3RhbmNlIHBvaW50ZXIKKwkvLyBzZXQgYWxzbyB0aGUgaW5zdGFuY2UgYWRkciB0byBwYXJhbWV0ZXJsaXN0CisJRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCk7CisJRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCk7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVzZWQpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBpbml0aWFsaXplIGludGVybiB2YWlhYmxlcworCS8vIDIwMDYvMDcvMzEgZC5rLjogc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NPZmYKKwlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NPZmY7CisJLy8gc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NJbml0aWFsaXNpbmcKKwkvL0VQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRHc0luaXRpYWxpc2luZzsKKworCS8vIHNldCBmbGFncyB0byBGQUxTRQorCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZlRpbWVyTXNQcmVPcDIpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPSBGQUxTRTsKKworLy8gICAgRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpID0gMDsKKworCS8vIGluZm9ybSBoaWdoZXIgbGF5ZXIgYWJvdXQgc3RhdGUgY2hhbmdlCisJLy8gMjAwNi8wNy8zMSBkLmsuOiBUaGUgRVBMIEFQSSBsYXllci9hcHBsaWNhdGlvbiBoYXMgdG8gc3RhcnQgTk1UIHN0YXRlCisJLy8gICAgICAgICAgICAgICAgICBtYWNoaW5lIHZpYSBObXRFdmVudFN3UmVzZXQgYWZ0ZXIgaW5pdGlhbGlzYXRpb24gb2YKKwkvLyAgICAgICAgICAgICAgICAgIGFsbCBtb2R1bGVzIGhhcyBiZWVuIGNvbXBsZXRlZC4gRExMIGhhcyB0byBiZSBpbml0aWFsaXNlZAorCS8vICAgICAgICAgICAgICAgICAgYWZ0ZXIgTk1UayBiZWNhdXNlIE5NVCBzdGF0ZSBzaGFsbCBub3QgYmUgdW5pbml0aWFsaXNlZAorCS8vICAgICAgICAgICAgICAgICAgYXQgdGhhdCB0aW1lLgorLyogICAgTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKyAgICBObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm9FdmVudDsKKyAgICBFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXR1OworICAgIEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOworICAgIEVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworICAgIEV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZTsKKyAgICBFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZSk7CisgICAgUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworKi8KKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsTm10a0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrRGVsSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIHNldCBOTVQtU3RhdGUgdG8ga0VwbE5tdEdzT2ZmCisJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzT2ZmOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1bnVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVudXNlZCk7CisKKwkvLyBkZWxldGUgdGltZXIKKy8vICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLyAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBtYWluIHByb2Nlc3MgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAtPiBwcm9jZXNzIE5NVC1TdGF0ZS1NYXNjaGluZSB1bmQgcmVhZCBOTVQtRXZlbnRzIGZyb20gUXVldWUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZSBwb2ludGVyCisvLyAgICAgICAgICAgICAgcEV2ZW50X3AgICAgPSAgIEVwbC1FdmVudCB3aXRoIE5NVC1ldmVudCB0byBwcm9jZXNzCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a1Byb2Nlc3MoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxObXRTdGF0ZSBPbGRObXRTdGF0ZTsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisJdEVwbEV2ZW50IEV2ZW50OworCXRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlIE5tdFN0YXRlQ2hhbmdlOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ6CisJCXsKKwkJCU5tdEV2ZW50ID0gKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZVRpbWVyOgorCQl7CisJCQlObXRFdmVudCA9CisJCQkgICAgKHRFcGxObXRFdmVudCkgKCh0RXBsVGltZXJFdmVudEFyZyAqKSBwRXZlbnRfcC0+CisJCQkJCSAgICBtX3BBcmcpLT5tX3VsQXJnOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10SW52YWxpZEV2ZW50OworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gc2F2ZSBOTVQtU3RhdGUKKwkvLyBuZWVkZWQgZm9yIGxhdGVyIGNvbXBhcmlzb24gdG8KKwkvLyBpbmZvcm0gaGdoZXIgbGF5ZXIgYWJvdXQgc3RhdGUgY2hhbmdlCisJT2xkTm10U3RhdGUgPSBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSk7CisKKwkvLyBOTVQtU3RhdGUtTWFzY2hpbmUKKwlzd2l0Y2ggKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSkgeworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGdlbmVyYWwgcGFydCBvZiB0aGUgc3RhdGVtYXNjaGluZQorCisJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJY2FzZSBrRXBsTm10R3NPZmY6CisJCXsKKwkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIgc2F5cyBzbworCQkJaWYgKE5tdEV2ZW50ID09IGtFcGxObXRFdmVudFN3UmVzZXQpIHsJLy8gbmV3IHN0YXRlIGtFcGxObXRHc0luaXRpYWxpc2luZworCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJeworCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gUmVzZXRBcHAgc3RhdGUKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gbmV3IHN0YXRlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldEFwcDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgb2YgdGhlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBwcm9maWxlIGFyZWEgYW5kIHRoZQorCQkvLyBzdGFuZGFyZGlzZWQgZGV2aWNlIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldEFwcCBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyCisJCQkJLy8gc2F5IHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVzZXRDb206CisJCQkJeworCQkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBvZiB0aGUgY29tbXVuaWNhdGlvbiBwcm9maWxlIGFyZWEKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldENvbW0gc3RhdGUKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyCisJCQkJLy8gc2F5IHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVzZXRDb25maWc6CisJCQkJeworCQkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGZsYWdzCisJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IEZBTFNFOworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0Q29uZiBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIgc2F5cyBzbworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlckNzTm90QWN0aXZlOgorCQkJCXsJLy8gTm9kZSBzaG91bGQgYmUgQ04KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJNc05vdEFjdGl2ZToKKwkJCQl7CS8vIE5vZGUgc2hvdWxkIGJlIENOCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpID09IDApCisJCQkJCS8vIG5vIE1OIGZ1bmN0aW9uYWxpdHkKKwkJCQkJLy8gVE9ETzogLWNyZWF0ZSBlcnJvciBFX05NVF9CQTFfTk9fTU5fU1VQUE9SVAorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisjZWxzZQorCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNOb3RBY3RpdmU7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGVtYXNjaGluZQorCisJCS8vIG5vZGUgbGlzdGUgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIE5vdEFjdGl2ZSBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXQgQ29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHNlZSBpZiBTb0Egb3IgU29DIHJlY2VpdmVkCisJCQkJLy8gay50LiAyMC4wNy4yMDA2OiBvbmx5IFNvQSBmb3JjZXMgY2hhbmdlIG9mIHN0YXRlCisJCQkJLy8gc2VlIEVQTCBWMiBEUyAxLjAuMCBwLjI2NworCQkJCS8vIGNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gbmV3IHN0YXRlIFBSRV9PUEVSQVRJT05BTDEKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHRpbWVvdXQgZm9yIFNvQSBhbmQgU29jCisJCQljYXNlIGtFcGxObXRFdmVudFRpbWVyQmFzaWNFdGhlcm5ldDoKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBCQVNJQ19FVEhFUk5FVAorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzQmFzaWNFdGhlcm5ldDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY2hlY2sgaWYgU29DIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgaXNvY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQkvLyByZXNldCBmbGFncworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpCisJCQkJCSAgICA9IEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJICAgIEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKQorCQkJCQkgICAgPSBGQUxTRTsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCSAgICBGQUxTRTsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gb3BlcmF0ZQorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgY29tbWFuZCBOTVRFbmFibGVSZWFkeVRvT3BlcmF0ZSBmcm9tIE1OIHdhcyByZWNlaXZlZAorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9PSBUUlVFKSB7CS8vIHJlc2V0IGZsYWdzCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOworCQkJCQl9IGVsc2UgewkvLyBzZXQgRmxhZworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZG8gRW5hYmxlUmVhZHlUb09wZXJhdGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBpcyByZWFkeQorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9PSBUUlVFKSB7CS8vIHJlc2V0IGZsYWdzCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOworCQkJCQl9IGVsc2UgewkvLyBzZXQgRmxhZworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0b3BOb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0b3BOb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1N0b3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0YXJ0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdGFydE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzT3BlcmF0aW9uYWw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdENzT3BlcmF0aW9uYWw6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBFbnRlclByZU9wZXJhdGlvbmFsMgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbm91cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgRW50ZXJQcmVPcGVyYXRpb25hbDIKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gZXBsIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuOiBob3cgZG9lcyB0aGlzIGVycm9yIG9jY3VyPyBvbiBDUkMgZXJyb3JzCisvKiAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyovCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBFcGwtRnJhbWUgb24gbmV0IC0+IHN0b3AgYW55IGNvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gTU4gbGlzdGVuIHRvIG5ldHdvcmsKKwkJLy8gLT4gaWYgbm8gRVBMIHRyYWZmaWMgZ28gdG8gbmV4dCBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpID09IDApCisJCQkvLyBubyBNTiBmdW5jdGlvbmFsaXR5CisJCQkvLyBUT0RPOiAtY3JlYXRlIGVycm9yIEVfTk1UX0JBMV9OT19NTl9TVVBQT1JUCisJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisjZWxzZQorCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQgZXZlbnQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OgorCQkJCXsKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID09IEZBTFNFKSB7CS8vIG5ldyBzdGF0ZSBCYXNpY0V0aGVybmV0CisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dCBldmVudAorCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AxOgorCQkJCXsKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID09IEZBTFNFKSB7CS8vIG5ldyBzdGF0ZSBQcmVPcDEKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZlRpbWVyTXNQcmVPcDIpID0gRkFMU0U7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgPQorCQkJCQkJICAgIEZBTFNFOworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKyNlbmRpZiAvLyAoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKworCQkJYnJlYWs7CisJCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJLy8gTU4gcHJvY2VzcyByZWR1Y2VzIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQkJLy8gZC5rLiBNU1ByZU9wMS0+Q1NQcmVPcDE6IG5vbnNlbnNlIC0+IGtlZXAgc3RhdGUKKwkJCQkvKgorCQkJCSAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQkgICB7CisJCQkJICAgRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCSAgIGJyZWFrOworCQkJCSAgIH0KKwkJCQkgKi8KKworCQkJY2FzZSBrRXBsTm10RXZlbnRBbGxNYW5kYXRvcnlDTklkZW50OgorCQkJCXsJLy8gYWxsIG1hbmRhdG9yeSBDTiBpZGVudGlmaWVkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mVGltZXJNc1ByZU9wMikgIT0KKwkJCQkJICAgIEZBTFNFKSB7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMjoKKwkJCQl7CS8vIHJlc2lkZW5jZSB0aW1lIGZvciBQcmVPcDEgaXMgZWxhcHNlZAorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSCisJCQkJCSAgICAobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgIT0gRkFMU0UpIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOworCQkJCQl9IGVsc2UgeworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZlRpbWVyTXNQcmVPcDIpID0gVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTU4gcHJvY2VzcyBmdWxsIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYWxsIG1hZGF0b3J5IG5vZGVzIHJlYWR5IHRvIG9wZXJhdGUKKwkJLy8gLT4gTU4gcHJvY2VzcyBmdWxsIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBFUEwgZnJhbWVzIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIG90aGVyIE1OIGluIG5ldHdvcmsKKwkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyTXNPcGVyYXRpb25hbDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNPcGVyYXRpb25hbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9ybWFsIGVwbGN5Y2xlIHByb2Nlc3NpbmcKKwljYXNlIGtFcGxObXRNc09wZXJhdGlvbmFsOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gIG5vcm1hbCBldGhlcm5ldCB0cmFmZmljCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuIEJFLT5QcmVPcDEgb24gY3ljbGUgZXJyb3I/IE5vCisvKiAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyovCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJZGVmYXVsdDoKKwkJeworCQkJLy9ERUJVR19FUExfREJHTFZMX05NVEtfVFJBQ0UwKEVQTF9EQkdMVkxfTk1UICwiRXJyb3IgaW4gRXBsTm10UHJvY2VzczogVW5rbm93biBOTVQtU3RhdGUiKTsKKwkJCS8vRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkU3RhdGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCisJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBTdGF0ZS1DaGFuZ2UgaWYgbmVlZGVkCisJaWYgKE9sZE5tdFN0YXRlICE9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSkgeworCQlFUExfTk1US19EQkdfUE9TVF9UUkFDRV9WQUxVRShObXRFdmVudCwgT2xkTm10U3RhdGUsCisJCQkJCSAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSk7CisKKwkJLy8gZC5rLjogbWVtb3JpemUgTk1UIHN0YXRlIGJlZm9yZSBwb3N0aW5nIGFueSBldmVudHMKKwkJTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCQkvLyBpbmZvcm0gRExMCisJCWlmICgoT2xkTm10U3RhdGUgPiBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24pCisJCSAgICAmJiAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpIDw9CisJCQlrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24pKSB7CisJCQkvLyBzZW5kIERMTCBERUlOSVQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRGVzdHJveTsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlFdmVudC5tX3BBcmcgPSAmT2xkTm10U3RhdGU7CisJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihPbGRObXRTdGF0ZSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsLAorCQkJLy8gICAgICAgNC4gZXZlbnQgcXVldWUgaXMgdmVyeSBpbmVmZmljaWVudAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtQcm9jZXNzKCZFdmVudCk7CisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoKE9sZE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKwkJCSAgICYmIChFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPgorCQkJICAgICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikpIHsKKwkJCS8vIHNlbmQgRExMIElOSVQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrQ3JlYXRlOworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlOworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfSBlbHNlCisJCSAgICBpZiAoKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9PSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0KQorCQkJfHwgKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9PQorCQkJICAgIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQpKSB7CisJCQl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBBc3luY1JlcVByaW9yaXR5OworCisJCQkvLyBzZW5kIERMTCBGaWxsIEFzeW5jIFR4IEJ1ZmZlciwgYmVjYXVzZSBzdGF0ZSBCYXNpY0V0aGVybmV0IHdhcyBlbnRlcmVkCisJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlBc3luY1JlcVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCQlFdmVudC5tX3BBcmcgPSAmQXN5bmNSZXFQcmlvcml0eTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKEFzeW5jUmVxUHJpb3JpdHkpOworCQkJLy8gZC5rLjogZGlyZWN0bHkgY2FsbCBETExrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UKKwkJCS8vICAgICAgIDEuIGV4ZWN1dGlvbiBvZiBwcm9jZXNzIGZ1bmN0aW9uIGlzIHN0aWxsIHN5bmNob25pemVkIGFuZCBzZXJpYWxpemVkLAorCQkJLy8gICAgICAgMi4gaXQgaXMgdGhlIHNhbWUgYXMgd2l0aG91dCBldmVudCBxdWV1ZXMgKGkuZS4gd2VsbCB0ZXN0ZWQpLAorCQkJLy8gICAgICAgMy4gRExMayB3aWxsIGdldCB0aG9zZSBuZWNlc3NhcnkgZXZlbnRzIGV2ZW4gaWYgZXZlbnQgcXVldWUgaXMgZnVsbAorCQkJLy8gICAgICAgNC4gZXZlbnQgcXVldWUgaXMgdmVyeSBpbmVmZmljaWVudAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtQcm9jZXNzKCZFdmVudCk7CisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworI2VuZGlmCisJCX0KKwkJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwkJTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCA9IE5tdEV2ZW50OworCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXR1OworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRTdGF0ZUNoYW5nZTsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10U3RhdGVDaGFuZ2UpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCUVQTF9EQkdMVkxfTk1US19UUkFDRTIKKwkJICAgICgiRXBsTm10a1Byb2Nlc3MoTk1ULUV2ZW50ID0gMHglMDRYKTogTmV3IE5NVC1TdGF0ZSA9IDB4JTAzWFxuIiwKKwkJICAgICBObXRFdmVudCwgTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSk7CisKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRrR2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJuIHRoZSBhY3R1ZWxsIE5NVC1TdGF0ZSBhbmQgdGhlIGJpdHMKKy8vICAgICAgICAgICAgICB0byBmb3IgTU4tIG9yIENOLW1vZGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxObXRTdGF0ZSA9IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMKK0VwbE5tdGtHZXRObXRTdGF0ZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKwlObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCXJldHVybiBObXRTdGF0ZTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KK0VQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRrQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ3MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRrQ2FsLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtS2VybmVsLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGtDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10a0NhbC5oIgorCisvLyBUT0RPOiBpbml0IGZ1bmN0aW9uIG5lZWRlZCB0byBwcmVwYXJlIEVwbE5tdGtHZXRObXRTdGF0ZSBmb3IKKy8vICAgICAgIGlvLWNvbnRyb2xsLWNhbGwgZnJvbSBFcGxObXR1Q2FsLU1vZHVsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTE2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHUuYwpAQCAtMCwwICsxLDcwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xMCAxNzoxNzo0MiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrIG1fcGZuTm10Q2hhbmdlQ2I7CisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGw7CisKK30gdEVwbE5tdHVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXR1SW5zdGFuY2UgRXBsTm10dUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXR1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IG90aGVyIGluc3RhbmNlcyBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiID0gTlVMTDsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiA9IE5VTEw7CisKKwkvLyBkZWxldGUgdGltZXIKKwlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsTm10dUluc3RhbmNlX2cubV9UaW1lckhkbCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVObXRFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgTk1ULUV2ZW50IHRvIHRoZSBOTVQtU3RhdGUtTWFzY2hpbmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICA9IE5NVC1FdmVudCB0byBzZW5kCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVObXRFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCUV2ZW50Lm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IDA7CisJRXZlbnQubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50X3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUdldE5tdFN0YXRlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIGFjdHVlbGwgTk1ULVN0YXRlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlICA9IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10dUdldE5tdFN0YXRlKCkKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKwkvLyAkJCQgY2FsbCBmdW5jdGlvbiBvZiBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisjZWxzZQorCU5tdFN0YXRlID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIE5tdFN0YXRlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1UHJvY2Vzc0V2ZW50CisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3NlcyBldmVudHMgZnJvbSBldmVudCBxdWV1ZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxFdmVudF9wID0gICBwb2ludGVyIHRvIGV2ZW50CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByb2Nlc3MgZXZlbnQKKwlzd2l0Y2ggKHBFcGxFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCQkvLyBzdGF0ZSBjaGFuZ2Ugb2YgTk1ULU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOgorCQl7CisJCQl0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSAqcE5tdFN0YXRlQ2hhbmdlOworCisJCQkvLyBkZWxldGUgdGltZXIKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbE5tdHVJbnN0YW5jZV9nLm1fVGltZXJIZGwpOworCisJCQlwTm10U3RhdGVDaGFuZ2UgPQorCQkJICAgICh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSAqKSBwRXBsRXZlbnRfcC0+bV9wQXJnOworCisJCQkvLyBjYWxsIGNiLWZ1bmN0aW9ucyB0byBpbmZvcm0gaGlnaGVyIGxheWVyCisJCQlpZiAoRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiAhPSBOVUxMKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10dUluc3RhbmNlX2cuCisJCQkJICAgIG1fcGZuTm10Q2hhbmdlQ2IoKnBObXRTdGF0ZUNoYW5nZSk7CisJCQl9CisKKwkJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXZlcnl0aGluZyBpcyBPSywgc28gc3dpdGNoIHRvIG5leHQgc3RhdGUgaWYgbmVjZXNzYXJ5CisJCQkJc3dpdGNoIChwTm10U3RhdGVDaGFuZ2UtPm1fTmV3Tm10U3RhdGUpIHsKKwkJCQkJLy8gRVBMIHN0YWNrIGlzIG5vdCBydW5uaW5nCisJCQkJY2FzZSBrRXBsTm10R3NPZmY6CisJCQkJCWJyZWFrOworCisJCQkJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJCQkJY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRBcHApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKwkJCQkJLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKwkJCQljYXNlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb246CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRDb20pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCQkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCQl7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlclJlc2V0Q29uZmlnKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCQkJCQkJLy8gZ2V0IG5vZGUgSUQgZnJvbSBPRAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQl1aU5vZGVJZCA9CisJCQkJCQkgICAgRXBsT2JkdUdldE5vZGVJZAorCQkJCQkJICAgIChFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIpOworI2Vsc2UKKwkJCQkJCXVpTm9kZUlkID0gMDsKKyNlbmRpZgorCQkJCQkJLy9jaGVjayBub2RlIElEIGlmIG5vdCBzaG91bGQgYmUgbWFzdGVyIG9yIHNsYXZlCisJCQkJCQlpZiAodWlOb2RlSWQgPT0gRVBMX0NfQURSX01OX0RFRl9OT0RFX0lEKSB7CS8vIG5vZGUgc2hhbGwgYmUgTU4KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlKTsKKyNlbHNlCisJCQkJCQkJVFJBQ0UwCisJCQkJCQkJICAgICgiRXBsTm10dVByb2Nlc3MoKTogbm8gTU4gZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZFxuIik7CisjZW5kaWYKKwkJCQkJCX0gZWxzZSB7CS8vIG5vZGUgc2hhbGwgYmUgQ04KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyQ3NOb3RBY3RpdmUpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkJCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwkJCQljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXI7CisJCQkJCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCQkJCQkJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJCQkJCQkvLyBjcmVhdGUgdGltZXIgdG8gc3dpdGNoIGF1dG9tYXRpY2FsbHkgdG8gQmFzaWNFdGhlcm5ldCBpZiBubyBNTiBhdmFpbGFibGUgaW4gbmV0d29yaworCisJCQkJCQkvLyByZWFkIE5NVF9DTkJhc2ljRXRoZXJuZXRUaW1lcm91dF9VMzIgZnJvbSBPRAorCQkJCQkJT2JkU2l6ZSA9IHNpemVvZihkd0J1ZmZlcik7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkgfHwgKEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRSkKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsT2JkdVJlYWRFbnRyeQorCQkJCQkJICAgIChFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIDB4MUY5OSwgMHgwMCwgJmR3QnVmZmVyLAorCQkJCQkJICAgICAmT2JkU2l6ZSk7CisjZWxzZQorCQkJCQkJUmV0ID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisjZW5kaWYKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChkd0J1ZmZlciAhPSAwKSB7CS8vIEJhc2ljRXRoZXJuZXQgaXMgZW5hYmxlZAorCQkJCQkJCS8vIGNvbnZlcnQgdXMgaW50byBtcworCQkJCQkJCWR3QnVmZmVyID0KKwkJCQkJCQkgICAgZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkJLy8gc2V0IG9uZSBtcworCQkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQkJfQorCQkJCQkJCVRpbWVyQXJnLm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ7CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworCQkJCQkJCSAgICAoJkVwbE5tdHVJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICAgZHdCdWZmZXIsCisJCQkJCQkJICAgICBUaW1lckFyZyk7CisJCQkJCQkJLy8gcG90ZW50aWFsIGVycm9yIGlzIGZvcndhcmRlZCB0byBldmVudCBxdWV1ZSB3aGljaCBnZW5lcmF0ZXMgZXJyb3IgZXZlbnQKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorCQkJCQl7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwkJCQljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJCQkJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJCQkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbm91cyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm8gRVBMIGN5Y2xlCisJCQkJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJCQkJY2FzZSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gTU4gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwkJCQljYXNlIGtFcGxObXRNc05vdEFjdGl2ZToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXI7CisJCQkJCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCQkJCQkJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJCQkJCQkvLyBjcmVhdGUgdGltZXIgdG8gc3dpdGNoIGF1dG9tYXRpY2FsbHkgdG8gQmFzaWNFdGhlcm5ldC9QcmVPcDEgaWYgbm8gb3RoZXIgTU4gYWN0aXZlIGluIG5ldHdvcmsKKworCQkJCQkJLy8gY2hlY2sgTk1UX1N0YXJ0VXBfVTMyLkJpdDEzCisJCQkJCQkvLyByZWFkIE5NVF9TdGFydFVwX1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjgwLCAweDAwLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoKGR3QnVmZmVyICYgRVBMX05NVFNUX0JBU0lDRVRIRVJORVQpID09IDApIHsJLy8gTk1UX1N0YXJ0VXBfVTMyLkJpdDEzID09IDAKKwkJCQkJCQkvLyBuZXcgc3RhdGUgUHJlT3BlcmF0aW9uYWwxCisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AxOworCQkJCQkJfSBlbHNlIHsJLy8gTk1UX1N0YXJ0VXBfVTMyLkJpdDEzID09IDEKKwkJCQkJCQkvLyBuZXcgc3RhdGUgQmFzaWNFdGhlcm5ldAorCQkJCQkJCVRpbWVyQXJnLm1fdWxBcmcgPQorCQkJCQkJCSAgICAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgICAga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OworCQkJCQkJfQorCisJCQkJCQkvLyByZWFkIE5NVF9Cb290VGltZV9SRUMuTU5XYWl0Tm90QWN0X1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjg5LCAweDAxLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQlkd0J1ZmZlciA9IGR3QnVmZmVyIC8gMTAwMDsKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJZHdCdWZmZXIgPSAxOworCQkJCQkJfQorCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkgICAgKCZFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHdCdWZmZXIsCisJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCS8vIHBvdGVudGlhbCBlcnJvciBpcyBmb3J3YXJkZWQgdG8gZXZlbnQgcXVldWUgd2hpY2ggZ2VuZXJhdGVzIGVycm9yIGV2ZW50CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCQkJCXsKKwkJCQkJCURXT1JEIGR3QnVmZmVyID0gMDsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBQcmVPcDIgaWYgTU4gaWRlbnRpZmllZCBhbGwgbWFuZGF0b3J5IENOcworCisJCQkJCQkvLyByZWFkIE5NVF9Cb290VGltZV9SRUMuTU5XYWl0UHJlT3AxX1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjg5LCAweDAzLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkvLyBpZ25vcmUgZXJyb3IsIGJlY2F1c2UgdGhpcyB0aW1lb3V0IGlzIG9wdGlvbmFsCisJCQkJCQkJZHdCdWZmZXIgPSAwOworCQkJCQkJfQorI2VuZGlmCisJCQkJCQlpZiAoZHdCdWZmZXIgPT0gMCkgewkvLyBkZWxheSBpcyBkZWFjdGl2YXRlZAorCQkJCQkJCS8vIGltbWVkaWF0ZWx5IHBvc3QgdGltZXIgZXZlbnQKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQlkd0J1ZmZlciA9IGR3QnVmZmVyIC8gMTAwMDsKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJZHdCdWZmZXIgPSAxOworCQkJCQkJfQorCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRrOworCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgICAga0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMjsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworCQkJCQkJICAgICgmRXBsTm10dUluc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fVGltZXJIZGwsCisJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKWR3QnVmZmVyLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisJCQkJCQkvLyBwb3RlbnRpYWwgZXJyb3IgaXMgZm9yd2FyZGVkIHRvIGV2ZW50IHF1ZXVlIHdoaWNoIGdlbmVyYXRlcyBlcnJvciBldmVudAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJCQkJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCQkJCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm8gRVBMIGN5Y2xlCisJCQkJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJCQkJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCVRSQUNFMQorCQkJCQkJICAgICgiRXBsTm10dVByb2Nlc3MoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZSAweCVYXG4iLAorCQkJCQkJICAgICBwTm10U3RhdGVDaGFuZ2UtPgorCQkJCQkJICAgICBtX05ld05tdFN0YXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gYXBwbGljYXRpb24gd2FudHMgdG8gY2hhbmdlIE5NVCBzdGF0ZSBpdHNlbGYKKwkJCQkvLyBpdCdzIE9LCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQl9CisKKwkJCUVQTF9EQkdMVkxfTk1UVV9UUkFDRTAKKwkJCSAgICAoIkVwbE5tdHVQcm9jZXNzRXZlbnQoKTogTk1ULVN0YXRlLU1hc2NoaW5lIGFubm91bmNlIGNoYW5nZSBvZiBOTVQgU3RhdGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkRXZlbnQ7CisJCX0KKworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVSZWdpc3RlclN0YXRlQ2hhbmdlQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVnaXN0ZXIgQ2FsbGJhY2stZnVuY3Rpb24gZ28gZ2V0IGluZm9ybWVkIGFib3V0IGEKKy8vICAgICAgICAgICAgICBOTVQtQ2hhbmdlLVN0YXRlLUV2ZW50CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRXBsTm10U3RhdGVDaGFuZ2VDYl9wID0gZnVuY3Rpb25wb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXR1UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiKHRFcGxObXR1U3RhdGVDaGFuZ2VDYWxsYmFjaworCQkJICAgICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHNhdmUgY2FsbGJhY2stZnVuY3Rpb24gaW4gbW9kdWwgZ2xvYmFsIHZhcgorCUVwbE5tdHVJbnN0YW5jZV9nLm1fcGZuTm10Q2hhbmdlQ2IgPSBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3A7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI5ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1Q2FsLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHVDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHVDYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRrQ2FsR2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJuIGN1cnJlbnQgTk1ULVN0YXRlCisvLyAgICAgICAgICAgICAgLT4gZW5jYXBzdWxhdGUgYWNjZXNzIHRvIGtlcm5lbHNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlID0gY3VycmVudCBOTVQtU3RhdGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsTm10U3RhdGUgUFVCTElDIEVwbE5tdGtDYWxHZXRObXRTdGF0ZSgpCit7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCS8vIGZvciB0ZXN0IGRpcmVrdCBjYWxsIGZvciBFcGxObXRrR2V0Tm10U3RhdGUoKQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworI2Vsc2UKKwlObXRTdGF0ZSA9IDA7CisjZW5kaWYKKwlyZXR1cm4gTm10U3RhdGU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuYwpAQCAtMCwwICsxLDMyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgYXBpIGZ1bmN0aW9uIG9mIEVwbE9CRC1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmQuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZDNworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDIgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCQkgICAgIC0+YmFzZWQgb24gQ0FOb3BlbiBPQkQtTW9kdWwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCS8vIGZ1bmN0aW9uIHByb3RvdHlwcyBvZiB0aGUgRXBsT0JELU1vZHVsCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBmbG9hdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zCisjZGVmaW5lIF9TSElGVEVEX0VYUE9ORU5UX01BU0tfU1AgICAweGZmCisjZGVmaW5lIF9CSUFTX1NQICAgICAgICAgICAgICAgICAgICAxMjYKKyNkZWZpbmUgVF9TUCAgICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEVYUE9ORU5UX0RFTk9STV9TUCAgICAgICAgICAoLV9CSUFTX1NQKQorI2RlZmluZSBCQVNFX1RPX1RIRV9UX1NQICAgICAgICAgICAgKChmbG9hdCkgODM4ODYwOC4wKQorI2RlZmluZSBHRVRfRVhQT05FTlRfU1AoeCkgICAgICAgICAgKCgoKHgpID4+IFRfU1ApICYgX1NISUZURURfRVhQT05FTlRfTUFTS19TUCkgLSBfQklBU19TUCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBzdHJ1Y3QgZm9yIGluc3RhbmNlIHRhYmxlCitJTlNUQU5DRV9UWVBFX0JFR0lOIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCitTVEFUSUMgdEVwbE9iZEluaXRQYXJhbSBJTlNUX0ZBUiBtX09iZEluaXRQYXJhbTsKK1NUQVRJQyB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgSU5TVF9ORUFSIG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjazsKKworSU5TVEFOQ0VfVFlQRV9FTkQKKy8vIGRlY29tcG9zaXRpb24gb2YgZmxvYXQKK3R5cGVkZWYgdW5pb24geworCXRFcGxPYmRSZWFsMzIgbV9mbFJlYWxQYXJ0OworCWludCBtX25JbnRlZ2VyUGFydDsKKworfSB0RXBsT2JkUmVhbFBhcnRzOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1hY3JvIHJlcGxhY2UgdGhlIHVuc3BlY2lmaWMgcG9pbnRlciB0byBhbiBpbnN0YW5jZSB0aHJvdWdoCisvLyB0aGUgbW9kdWwgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIGxvY2FsIGluc3RhbmNlIHRhYmxlLiBUaGlzIG1hY3JvCisvLyBtdXN0IGRlZmluZWQgaW4gZWFjaCBtb2R1bC4KKy8vI2RlZmluZSB0RXBsUHRySW5zdGFuY2UgICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qCisKK0VQTF9NQ09fREVDTF9JTlNUQU5DRV9WQVIoKQorCitCWVRFIE1FTSBhYkVwbE9iZFRyYXNoT2JqZWN0X2dbOF07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZENhbGxiYWNrIGZwQ2FsbGJhY2tfcCwKKwkJCQkJICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXREYXRhU2l6ZUludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXRTdHJMZW4odm9pZCAqcE9iakRhdGFfcCwKKwkJCQkgICB0RXBsT2JkU2l6ZSBPYmpMZW5fcCwgdEVwbE9iZFR5cGUgT2JqVHlwZV9wKTsKKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENoZWNrT2JqZWN0UmFuZ2UodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJCSB2b2lkICpwRGF0YV9wKTsKKyNlbmRpZgorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRWYXJFbnRyeSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnlfcCwKKwkJCQkgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXRPYmplY3RTaXplKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0SW5kZXhJbnRlcm4odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkUGFydCBDdXJyZW50T2RQYXJ0X3AsCisJCQkJCSAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50eV9wLAorCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKTsKKworc3RhdGljIHZvaWQgKkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworc3RhdGljIHZvaWQgTUVNICpFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNICoKKwkJCQkJICBwQ2JTdG9yZVBhcmFtX3ApOworCisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKK3N0YXRpYyB2b2lkIEVwbE9iZENvcHlPYmplY3REYXRhKHZvaWQgTUVNICogcERzdERhdGFfcCwKKwkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkgdEVwbE9iZFNpemUgT2JqU2l6ZV9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApOworCit2b2lkICpFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeV9wLAorCQkJCQkgIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgIHZvaWQgKipwcERzdERhdGFfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplX3AsCisJCQkJCSAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwU3ViRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplICogcE9iZFNpemVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5UG9zdChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICB0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5X3AsCisJCQkJCSAgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCwKKwkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEluaXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgID0gaW5pdCBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCUVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCk7CisKKwlpZiAocEluaXRQYXJhbV9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfIHBJbml0UGFyYW1fcCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZHMgYSBuZXcgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJIHBJbml0UGFyYW1fcCkKK3sKKworCUVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBjaGVjayBpZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIgdmFsaWQKKwkvLyBnZXQgZnJlZSBpbnN0YW5jZSBhbmQgc2V0IHRoZSBnbG9iYWxlIGluc3RhbmNlIHBvaW50ZXIKKwkvLyBzZXQgYWxzbyB0aGUgaW5zdGFuY2UgYWRkciB0byBwYXJhbWV0ZXJsaXN0CisJRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCk7CisJRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCk7CisKKwkvLyBzYXZlIGluaXQgcGFyYW1ldGVycworCUVQTF9NRU1DUFkoJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksIHBJbml0UGFyYW1fcCwKKwkJICAgc2l6ZW9mKHRFcGxPYmRJbml0UGFyYW0pKTsKKworCS8vIGNsZWFyIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBjb21tYW5kIExPQUQgYW5kIFNUT1JFCisJRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgPSBOVUxMOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1c2VkCisJRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShrU3RhdGVVc2VkKTsKKworCS8vIGluaXRpYWxpemUgb2JqZWN0IGRpY3Rpb25hcnkKKwkvLyBzbyBhbGwgYWxsIFZhckVudHJpZXMgd2lsbCBiZSBpbml0aWFsaXplZCB0byB0cmFzaCBvYmplY3QgYW5kIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgc2V0IHRvIGN1cnJlbnQgZGF0YQorCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkga0VwbE9iZFBhcnRBbGwsIGtFcGxPYmREaXJJbml0KTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkRGVsZXRlSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkRGVsZXRlSW5zdGFuY2UoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUikKK3sKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIHNpZ24gaW5zdGFuY2UgYXMgdW51c2VkCisJRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShrU3RhdGVVbnVzZWQpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworCit9CisjZW5kaWYgLy8gKEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCXVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQl2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgIHVpSW5kZXhfcCwKKwkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkgIHBTcmNEYXRhX3AsCisJCQkJICAmcERzdERhdGEsCisJCQkJICBTaXplX3AsCisJCQkJICAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5LCAmQ2JQYXJhbSwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgIHBPYmRFbnRyeSwKKwkJCQkgICBwU3ViRW50cnksCisJCQkJICAgJkNiUGFyYW0sIHBTcmNEYXRhX3AsIHBEc3REYXRhLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiByZWFkcyBhbiBvYmplY3QgZW50cnkuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb29mIHRoZSBPRCBlbnRyeSB0byByZWFkCisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gU3ViaW5kZXggdG8gcmVhZAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBmb3IgZGF0YQorLy8gICAgICAgICAgICAgIE9mZnNldF9wICAgICAgICA9IG9mZnNldCBpbiBkYXRhIGZvciByZWFkIGFjY2VzcworLy8gICAgICAgICAgICAgIHBTaXplX3AgICAgICAgICA9IElOOiBTaXplIG9mIHRoZSBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IG51bWJlciBvZiByZWFkZWQgQnl0ZXMKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWFkRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl2b2lkICpwU3JjRGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocERzdERhdGFfcCAhPSBOVUxMKTsKKwlBU1NFUlQocFNpemVfcCAhPSBOVUxMKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIGluZGV4IGFuZCBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisJcFNyY0RhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyBjaGVjayBzb3VyY2UgcG9pbnRlcgorCWlmIChwU3JjRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxPYmRSZWFkVmlvbGF0aW9uOworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGJlZm9yZSByZWFkaW5nCisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBwU3JjRGF0YTsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUgb2YgZGF0YSBhbmQgY2hlY2sgaWYgYXBwbGljYXRpb24gaGFzIHJlc2VydmVkIGVub3VnaCBtZW1vcnkKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocFN1YkVudHJ5KTsKKwkvLyBjaGVjayBpZiBvZmZzZXQgZ2l2ZW4gYW5kIGNhbGMgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCWlmICgqcFNpemVfcCA8IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVhZCB2YWx1ZSBmcm9tIG9iamVjdAorCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGEsIE9iZFNpemUpOworCSpwU2l6ZV9wID0gT2JkU2l6ZTsKKworCS8vIHdyaXRlIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGFmdGVyIHJlYWRpbmcKKwlDYlBhcmFtLm1fcEFyZyA9IHBEc3REYXRhX3A7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UG9zdFJlYWQ7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBY2Nlc3NPZFBhcnQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXN0b3JlcyBkZWZhdWx0IHZhbHVlcyBvZiBvbmUgcGFydCBvZiBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBPYmRQYXJ0X3AKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICB0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApCit7CisKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCUJPT0wgZlBhcnRGb3VudDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyAgcGFydCBhbHdheXMgaGFzIHRvIGJlIHVuZXF1YWwgdG8gTlVMTAorCXBPYmRFbnRyeSA9IEVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BQYXJ0KTsKKwlBU1NFUlRNU0cocE9iZEVudHJ5ICE9IE5VTEwsCisJCSAgIkVwbE9iZEFjY2Vzc09kUGFydCgpOiBubyAgT0QgcGFydCBpcyBkZWZpbmVkIVxuIik7CisKKwkvLyBpZiBPYmRQYXJ0X3AgaXMgbm90IHZhbGlkIGZQYXJ0Rm91bmQga2VlcHMgRkFMU0UgYW5kIGZ1bmN0aW9uIHJldHVybnMga0VwbE9iZElsbGVnYWxQYXJ0CisJZlBhcnRGb3VudCA9IEZBTFNFOworCisJLy8gYWNjZXNzIHRvICBwYXJ0CisJaWYgKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydEdlbikgIT0gMCkgeworCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBrRXBsT2JkUGFydEdlbiwgcE9iZEVudHJ5LAorCQkJCQkgICAgICAgRGlyZWN0aW9uX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWNjZXNzIHRvIG1hbnVmYWN0dXJlciBwYXJ0CisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcE1hbnVmYWN0dXJlclBhcnQpOworCisJaWYgKCgoT2JkUGFydF9wICYga0VwbE9iZFBhcnRNYW4pICE9IDApICYmIChwT2JkRW50cnkgIT0gTlVMTCkpIHsKKwkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAga0VwbE9iZFBhcnRNYW4sIHBPYmRFbnRyeSwKKwkJCQkJICAgICAgIERpcmVjdGlvbl9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCS8vIGFjY2VzcyB0byBkZXZpY2UgcGFydAorCXBPYmRFbnRyeSA9IEVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BEZXZpY2VQYXJ0KTsKKworCWlmICgoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0RGV2KSAhPSAwKSAmJiAocE9iZEVudHJ5ICE9IE5VTEwpKSB7CisJCWZQYXJ0Rm91bnQgPSBUUlVFOworCisJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIGtFcGxPYmRQYXJ0RGV2LCBwT2JkRW50cnksCisJCQkJCSAgICAgICBEaXJlY3Rpb25fcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKwl7CisJCS8vIGFjY2VzcyB0byB1c2VyIHBhcnQKKwkJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcFVzZXJQYXJ0KTsKKworCQlpZiAoKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydFVzcikgIT0gMCkgJiYgKHBPYmRFbnRyeSAhPSBOVUxMKSkgeworCQkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgICBrRXBsT2JkUGFydFVzciwKKwkJCQkJCSAgICAgICBwT2JkRW50cnksIERpcmVjdGlvbl9wKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8vIG5vIGFjY2VzcyB0byBhbiBPRCBwYXJ0IHdhcyBkb25lPyBpbGxlZ2FsIE9EIHBhcnQgd2FzIHNwZWNpZmllZCEKKwlpZiAoZlBhcnRGb3VudCA9PSBGQUxTRSkgeworCQlSZXQgPSBrRXBsT2JkSWxsZWdhbFBhcnQ7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmREZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWZpbmVzIGEgdmFyaWFibGUgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbFZhclBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWZpbmVWYXIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRWYXJFbnRyeSBNRU0gKnBWYXJFbnRyeTsKKwl0RXBsVmFyUGFyYW1WYWxpZCBWYXJWYWxpZDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwVmFyUGFyYW1fcCAhPSBOVUxMKTsJLy8gaXMgbm90IGFsbG93ZWQgdG8gYmUgTlVMTAorCisJLy8gZ2V0IGFkZHJlc3Mgb2Ygc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgcFZhclBhcmFtX3AtPm1fdWlJbmRleCwKKwkJCSAgICAgcFZhclBhcmFtX3AtPm1fdWlTdWJpbmRleCwgTlVMTCwgJnBTdWJpbmRleEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHZhciBlbnRyeQorCVJldCA9IEVwbE9iZEdldFZhckVudHJ5KHBTdWJpbmRleEVudHJ5LCAmcFZhckVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlWYXJWYWxpZCA9IHBWYXJQYXJhbV9wLT5tX1ZhbGlkRmxhZzsKKworCS8vIGNvcHkgb25seSB0aGlzIHZhbHVlcywgd2hpY2ggdmFsaWQgZmxhZyBpcyBzZXQKKwlpZiAoKFZhclZhbGlkICYga1ZhclZhbGlkU2l6ZSkgIT0gMCkgeworCQlpZiAocFN1YmluZGV4RW50cnktPm1fVHlwZSAhPSBrRXBsT2JkVHlwRG9tYWluKSB7CisJCQl0RXBsT2JkU2l6ZSBEYXRhU2l6ZTsKKworCQkJLy8gY2hlY2sgcGFzc2VkIHNpemUgcGFyYW1ldGVyCisJCQlEYXRhU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YmluZGV4RW50cnkpOworCQkJaWYgKERhdGFTaXplICE9IHBWYXJQYXJhbV9wLT5tX1NpemUpIHsJLy8gc2l6ZSBvZiB2YXJpYWJsZSBkb2VzIG5vdCBtYXRjaAorCQkJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gc2l6ZSBjYW4gYmUgc2V0IG9ubHkgZm9yIG9iamVjdHMgb2YgdHlwZSBET01BSU4KKwkJCXBWYXJFbnRyeS0+bV9TaXplID0gcFZhclBhcmFtX3AtPm1fU2l6ZTsKKwkJfQorCX0KKworCWlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWREYXRhKSAhPSAwKSB7CisJCXBWYXJFbnRyeS0+bV9wRGF0YSA9IHBWYXJQYXJhbV9wLT5tX3BEYXRhOworCX0KKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRDYWxsYmFjaykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICBwVmFyRW50cnktPm1fZnBDYWxsYmFjayA9IHBWYXJQYXJhbV9wLT5tX2ZwQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKFZhclZhbGlkICYga1ZhclZhbGlkQXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBWYXJFbnRyeS0+bV9wQXJnID0gcFZhclBhcmFtX3AtPm1fcEFyZzsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKyovCisJLy8gUmV0IGlzIGFscmVhZHkgc2V0IHRvIGtFcGxTdWNjZXNzZnVsIGZyb20gT2JkR2V0VmFySW50ZXJuKCkKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cigpCisvLworLy8gRGVzY3JpcHRpb246IEl0IHJldHVybmVzIHRoZSBjdXJyZW50IGRhdGEgcG9pbnRlci4gQnV0IGlmIG9iamVjdCBpcyBhbgorLy8gICAgICAgICAgICAgIGNvbnN0YW50IG9iamVjdCBpdCByZXR1cm5lcyB0aGUgZGVmYXVsdCBwb2ludGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgPSAgIEluZGV4IG9mIHRoZSBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCA9ICAgU3ViaW5kZXggb2YgdGhlIGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZEdldE9iamVjdERhdGFQdHIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdm9pZCAqcERhdGE7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5OworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0SW5kZXhJbnRlcm4oJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksCisJCQkJICAgdWlJbmRleF9wLCAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXBEYXRhID0gTlVMTDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlwRGF0YSA9IE5VTEw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IERhdGFwb2ludGVyCisJcERhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBPYmRTdWJFbnRyeSk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIHBEYXRhOworCit9CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHVzZXIgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPXBvaW50ZXIgdG8gdXNlciBPRGQKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWdpc3RlclVzZXJPZChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgIHRFcGxPYmRFbnRyeVB0ciBwVXNlck9kX3ApCit7CisKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wVXNlclBhcnQpID0gcFVzZXJPZF9wOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworCit9CisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRJbml0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFZhckVudHJ5X3AgPSBwb2ludGVyIHRvIHZhciBlbnRyeSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBUeXBlX3AgICAgICA9IG9iamVjdCB0eXBlCisvLyAgICAgICAgICAgICAgT2JkU2l6ZV9wICAgPSBzaXplIG9mIG9iamVjdCBkYXRhCisvLworLy8gUmV0dXJuczogICAgIG5vbmUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkSW5pdFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICB0RXBsT2JkVHlwZSBUeXBlX3AsCisJCQkJCSAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApCit7CisvKgorICAgICNpZiAoRVBMX1BET19VU0VfU1RBVElDX01BUFBJTkcgPT0gRkFMU0UpCisgICAgeworICAgICAgICAvLyByZXNldCBwb2ludGVyIHRvIFZBUiBjYWxsYmFjayBhbmQgYXJndW1lbnQKKyAgICAgICAgcFZhckVudHJ5X3AtPm1fZnBDYWxsYmFjayAgPSBOVUxMOworICAgICAgICBwVmFyRW50cnlfcC0+bV9wQXJnID0gTlVMTDsKKyAgICB9CisgICAgI2VuZGlmCisqLworCisvLyAxMC1kZWMtMjAwNCByLmQuOiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIHVzZWQgZm9yIHN0cmluZ3MKKwlpZiAoKFR5cGVfcCA9PSBrRXBsT2JkVHlwRG9tYWluKSkKKy8vICAgICAgICAgKGJUeXBlX3AgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIC8qIHx8CisvLyAgICAgICAgIChiVHlwZV9wID09IGtFcGxPYmRUeXBPU3RyaW5nKSB8fAorLy8gICAgICAgICAoYlR5cGVfcCA9PSBrRXBsT2JkVHlwVVN0cmluZykgICAgKi8gKQorCXsKKwkJLy8gdmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGFzIERPTUFJTiBvciBWU1RSSU5HIHNob3VsZCBub3QgcG9pbnQgdG8KKwkJLy8gdHJhc2ggb2JqZWN0LCBiZWNhdXNlIHRoaXMgdHJhc2ggb2JqZWN0IGNvbnRhaW5zIG9ubHkgOCBieXRlcy4gRE9NQUlOUyBvcgorCQkvLyBTVFJJTkdTIGNhbiBiZSBsb25nZXIuCisJCXBWYXJFbnRyeV9wLT5tX3BEYXRhID0gTlVMTDsKKwkJcFZhckVudHJ5X3AtPm1fU2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJLy8gc2V0IGFkZHJlc3MgdG8gdmFyaWFibGUgZGF0YSB0byB0cmFzaCBvYmplY3QKKwkJLy8gVGhpcyBwcmV2ZW50cyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHVzZXIgZm9yZ2V0cyB0byBjYWxsIEVwbE9iZERlZmluZVZhcigpCisJCS8vIGZvciB0aGlzIHZhcmlhYmxlIGJ1dCBtYXBwZXMgaXQgaW4gYSBQRE8uCisJCXBWYXJFbnRyeV9wLT5tX3BEYXRhID0gJmFiRXBsT2JkVHJhc2hPYmplY3RfZ1swXTsKKwkJcFZhckVudHJ5X3AtPm1fU2l6ZSA9IE9iZFNpemVfcDsKKwl9CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0RGF0YVNpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyAgICAgICAgICAgICAgZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZEdldERhdGFTaXplKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJT2JkU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gc3ViaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YkluZGV4X3AsICZwT2JkU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJT2JkU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocE9iZFN1YkVudHJ5KTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIE9iZFNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJldHVybnMgbm9kZWlkIGZyb20gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2Vwb2ludGVyCisvLworLy8gUmV0dXJuOiAgICAgIHVuc2lnbmVkIGludCA9IE5vZGUgSWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkR2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJOb2RlSWQ7CisKKwliTm9kZUlkID0gMDsKKwlPYmRTaXplID0gc2l6ZW9mKGJOb2RlSWQpOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkgICAgICBFUExfT0JEX05PREVfSURfSU5ERVgsCisJCQkgICAgICBFUExfT0JEX05PREVfSURfU1VCSU5ERVgsICZiTm9kZUlkLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQliTm9kZUlkID0gRVBMX0NfQURSX0lOVkFMSUQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpYk5vZGVJZDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXRzIG5vZGVpZCBpbiBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgPSAgIE5vZGUgSWQgdG8gc2V0CisvLyAgICAgICAgICAgICAgTm9kZUlkVHlwZV9wPSAgIFR5cGUgb24gd2hpY2ggd2F5IHRoZSBOb2RlIElkIHdhcyBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCA9IEVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgICB0RXBsT2JkTm9kZUlkVHlwZSBOb2RlSWRUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGZId0Jvb2w7CisJQllURSBiTm9kZUlkOworCisJLy8gY2hlY2sgTm9kZSBJZAorCWlmICh1aU5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKSB7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCQlnb3RvIEV4aXQ7CisJfQorCWJOb2RlSWQgPSAoQllURSkgdWlOb2RlSWRfcDsKKwlPYmRTaXplID0gc2l6ZW9mKEJZVEUpOworCS8vIHdyaXRlIE5vZGVJZCB0byBPRCBlbnRyeQorCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9JTkRFWCwKKwkJCSAgICAgICBFUExfT0JEX05PREVfSURfU1VCSU5ERVgsICZiTm9kZUlkLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IEhXQk9PTC1GbGFnIGluIFN1YmluZGV4IEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVgKKwlzd2l0Y2ggKE5vZGVJZFR5cGVfcCkgeworCQkvLyB0eXBlIHVua25vd24KKwljYXNlIGtFcGxPYmROb2RlSWRVbmtub3duOgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE9iZE5vZGVJZFNvZnR3YXJlOgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE9iZE5vZGVJZEhhcmR3YXJlOgorCQl7CisJCQlmSHdCb29sID0gT0JEX1RSVUU7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJZkh3Qm9vbCA9IE9CRF9GQUxTRTsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2ggKE5vZGVJZFR5cGVfcCkKKworCS8vIHdyaXRlIGZsYWcKKwlPYmRTaXplID0gc2l6ZW9mKGZId0Jvb2wpOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0lOREVYLAorCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVgsCisJCQkgICAgICAgJmZId0Jvb2wsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRJc051bWVyaWNhbCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGVudHJ5IGlzIG51bWVyaWNhbCBvciBub3QKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICA9IEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgICAgICA9IFN1YmluZGV4CisvLyAgICAgICAgICAgICAgcGZFbnRyeU51bWVyaWNhbF9wICA9IHBvaW50ZXIgdG8gQk9PTCBmb3IgcmV0dXJudmFsdWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFRSVUUgaWYgZW50cnkgYSBudW1lcmljYWwgdmFsdWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IEZBTFNFIGlmIGVudHJ5IG5vdCBhIG51bWVyaWNhbCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJc051bWVyaWNhbChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSBCT09MICogcGZFbnRyeU51bWVyaWNhbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxPYmRJc051bWVyaWNhbEludGVybihwT2JkU3ViRW50cnksIHBmRW50cnlOdW1lcmljYWxfcCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRSZWFkRW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeSBmcm9tIHRoZSBieXRlb2RlcgorLy8gICAgICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gdG8gdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIGZvciBudW1lcmljYWwgdmFsdWVzLgorLy8gICAgICAgICAgICAgIEZvciBvdGhlciB0eXBlcyBhIG5vcm1hbCByZWFkIHdpbGwgYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWZ1bGwgZm9yCisvLyAgICAgICAgICAgICAgdGhlIFBETyBhbmQgU0RPIG1vZHVsZS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeVRvTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCAqcFNyY0RhdGE7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBEc3REYXRhX3AgIT0gTlVMTCk7CisJQVNTRVJUKHBTaXplX3AgIT0gTlVMTCk7CisKKwkvLyBnZXQgYWRkcmVzcyBvZiBpbmRleCBhbmQgc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgdWlJbmRleF9wLCB1aVN1YkluZGV4X3AsICZwT2JkRW50cnksICZwU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QgZGF0YQorCXBTcmNEYXRhID0gRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybihwU3ViRW50cnkpOworCisJLy8gY2hlY2sgc291cmNlIHBvaW50ZXIKKwlpZiAocFNyY0RhdGEgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsT2JkUmVhZFZpb2xhdGlvbjsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGFkZHJlc3Mgb2Ygc291cmNlIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoaXMgZGF0YSBiZWZvcmUgcmVhZGluZworCUNiUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCUNiUGFyYW0ubV91aVN1YkluZGV4ID0gdWlTdWJJbmRleF9wOworCUNiUGFyYW0ubV9wQXJnID0gcFNyY0RhdGE7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UHJlUmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBzaXplIG9mIGRhdGEgYW5kIGNoZWNrIGlmIGFwcGxpY2F0aW9uIGhhcyByZXNlcnZlZCBlbm91Z2ggbWVtb3J5CisJT2JkU2l6ZSA9IEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHBTdWJFbnRyeSk7CisJLy8gY2hlY2sgaWYgb2Zmc2V0IGdpdmVuIGFuZCBjYWxjIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKwlpZiAoKnBTaXplX3AgPCBPYmRTaXplKSB7CisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIG51bWVyaWNhbCB0eXBlCisJc3dpdGNoIChwU3ViRW50cnktPm1fVHlwZSkgeworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIHR5cGVzIHdpdGhvdXQgYW1pCisJY2FzZSBrRXBsT2JkVHlwVlN0cmluZzoKKwljYXNlIGtFcGxPYmRUeXBPU3RyaW5nOgorCWNhc2Uga0VwbE9iZFR5cERvbWFpbjoKKwlkZWZhdWx0OgorCQl7CisJCQkvLyByZWFkIHZhbHVlIGZyb20gb2JqZWN0CisJCQlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhLCBPYmRTaXplKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBudW1lcmljYWwgdHlwZSB3aGljaCBuZWVkcyBhbWktd3JpdGUKKwkJLy8gOCBiaXQgb3Igc21hbGxlciB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBCb29sOgorCWNhc2Uga0VwbE9iZFR5cEludDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDg6CisJCXsKKwkJCUFtaVNldEJ5dGVUb0xlKHBEc3REYXRhX3AsICooKEJZVEUgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDE2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJeworCQkJQW1pU2V0V29yZFRvTGUocERzdERhdGFfcCwgKigoV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAyNCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCQl7CisJCQlBbWlTZXREd29yZDI0VG9MZShwRHN0RGF0YV9wLCAqKChEV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAzMiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwVUludDMyOgorCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKwkJeworCQkJQW1pU2V0RHdvcmRUb0xlKHBEc3REYXRhX3AsICooKERXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQwIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisJCXsKKwkJCUFtaVNldFF3b3JkNDBUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQ4IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJCXsKKwkJCUFtaVNldFF3b3JkNDhUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDU2IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisJCXsKKwkJCUFtaVNldFF3b3JkNTZUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDY0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCQl7CisJCQlBbWlTZXRRd29yZDY0VG9MZShwRHN0RGF0YV9wLCAqKChRV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyB0aW1lIG9mIGRheQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKwkJeworCQkJQW1pU2V0VGltZU9mRGF5KHBEc3REYXRhX3AsICgodFRpbWVPZkRheSAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTdWJFbnRyeS0+bV9UeXBlKQorCisJKnBTaXplX3AgPSBPYmRTaXplOworCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYWZ0ZXIgcmVhZGluZworCUNiUGFyYW0ubV9wQXJnID0gcERzdERhdGFfcDsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0UmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkgZnJvbSBhIHNvdXJjZSB3aXRoCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgdG8gdGhlIG9kIHdpdGggc3lzdGVtIHNwZWN1aWZpYworLy8gICAgICAgICAgICAgIGJ5dGVvcmRlci4gTm90IG51bWVyaWNhbCB2YWx1ZXMgd2lsbCBvbmx5IGJ5IGNvcGllZC4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCVFXT1JEIHF3QnVmZmVyOworCXZvaWQgKnBCdWZmZXIgPSAmcXdCdWZmZXI7CisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgdWlJbmRleF9wLAorCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCSAgcFNyY0RhdGFfcCwKKwkJCQkgICZwRHN0RGF0YSwKKwkJCQkgIFNpemVfcCwKKwkJCQkgICZwT2JkRW50cnksICZwU3ViRW50cnksICZDYlBhcmFtLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgaWYgbnVtZXJpY2FsIHR5cGUKKwlzd2l0Y2ggKHBTdWJFbnRyeS0+bV9UeXBlKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gdHlwZXMgd2l0aG91dCBhbWkKKwlkZWZhdWx0OgorCQl7CQkvLyBkbyBub3RoaW5nLCBpLmUuIHVzZSB0aGUgZ2l2ZW4gc291cmNlIHBvaW50ZXIKKwkJCXBCdWZmZXIgPSBwU3JjRGF0YV9wOworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIG51bWVyaWNhbCB0eXBlIHdoaWNoIG5lZWRzIGFtaS13cml0ZQorCQkvLyA4IGJpdCBvciBzbWFsbGVyIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJeworCQkJKigoQllURSAqKSBwQnVmZmVyKSA9IEFtaUdldEJ5dGVGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDE2IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MTY6CisJCXsKKwkJCSooKFdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRXb3JkRnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAyNCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCQl7CisJCQkqKChEV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldER3b3JkMjRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDMyIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDMyOgorCQl7CisJCQkqKChEV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldER3b3JkRnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA0MCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NDA6CisJY2FzZSBrRXBsT2JkVHlwVUludDQwOgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNDBGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQ4IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJCXsKKwkJCSooKFFXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0UXdvcmQ0OEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ1NjoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDU2RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA2NCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDY0OgorCWNhc2Uga0VwbE9iZFR5cFJlYWw2NDoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyB0aW1lIG9mIGRheQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKwkJeworCQkJQW1pR2V0VGltZU9mRGF5KHBCdWZmZXIsICgodFRpbWVPZkRheSAqKSBwU3JjRGF0YV9wKSk7CisJCQlicmVhazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFN1YkVudHJ5LT5tX1R5cGUpCisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UG9zdChFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICBwT2JkRW50cnksCisJCQkJICAgcFN1YkVudHJ5LAorCQkJCSAgICZDYlBhcmFtLCBwQnVmZmVyLCBwRHN0RGF0YSwgT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRBY2Nlc3NUeXBlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gcmV0dXJucyBhY2Nlc3N0eXBlIG9mIHRoZSBlbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwQWNjZXNzVHlwX3AgICAgPSAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIHN0b3JlIGFjY2Vzc3R5cGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEdldEFjY2Vzc1R5cGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdEVwbE9iZEFjY2VzcyAqIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBhY2Nlc3NUeXBlCisJKnBBY2Nlc3NUeXBfcCA9IHBPYmRTdWJFbnRyeS0+bV9BY2Nlc3M7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkU2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiogcHBWYXJFbnRyeV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5OworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyBnZXQgYWRkcmVzcyBvZiBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgTlVMTCwgJnBTdWJpbmRleEVudHJ5KTsKKwlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCS8vIGdldCB2YXIgZW50cnkKKwkJUmV0ID0gRXBsT2JkR2V0VmFyRW50cnkocFN1YmluZGV4RW50cnksIHBwVmFyRW50cnlfcCk7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxscyBjYWxsYmFjayBmdW5jdGlvbiBvZiBhbiBvYmplY3Qgb3Igb2YgYSB2YXJpYWJsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBmcENhbGxiYWNrX3AKKy8vICAgICAgICAgICAgICBwQ2JQYXJhbV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgIHRFcGxPYmRDYWxsYmFjayBmcENhbGxiYWNrX3AsCisJCQkJCSAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkQ2FsbGJhY2sgTUVNIGZwQ2FsbGJhY2s7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwQ2JQYXJhbV9wICE9IE5VTEwpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBhZGRyZXNzIG9mIGNhbGxiYWNrIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIGl0CisJaWYgKGZwQ2FsbGJhY2tfcCAhPSBOVUxMKSB7CisJCS8vIEtFSUwgQzUxIFY2LjAxIGhhcyBhIGJ1Zy4KKwkJLy8gVGhlcmVmb3JlIHRoZSBwYXJhbWV0ZXIgZnBDYWxsYmFja19wIGhhcyB0byBiZSBjb3BpZWQgaW4gbG9jYWwgdmFyaWFibGUgZnBDYWxsYmFjay4KKwkJZnBDYWxsYmFjayA9IGZwQ2FsbGJhY2tfcDsKKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGlzIG9iamVjdAorCQlSZXQgPSBmcENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCisJCQkJIHBDYlBhcmFtX3ApOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKQoreworCisJdEVwbE9iZFNpemUgRGF0YVNpemU7CisJdm9pZCBNRU0gKnBEYXRhOworCisJLy8gSWYgT0QgZW50cnkgaXMgZGVmaW5lZCBieSBtYWNybyBFUExfT0JEX1NVQklOREVYX1JPTV9WU1RSSU5HCisJLy8gdGhlbiB0aGUgY3VycmVudCBwb2ludGVyIGlzIGFsd2F5cyBOVUxMLiBUaGUgZnVuY3Rpb24KKwkvLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGVmYXVsdCBzdHJpbmcuCisJRGF0YVNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJJbmRleEVudHJ5X3ApOworCisJaWYgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkvLyBUaGUgcG9pbnRlciB0byBjdXJyZW50IHZhbHVlIGNhbiBiZSByZWNlaXZlZCBmcm9tIEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIoKQorCQlwRGF0YSA9CisJCSAgICAoKHZvaWQgTUVNICopRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViSW5kZXhFbnRyeV9wKSk7CisJCWlmIChwRGF0YSAhPSBOVUxMKSB7CisJCQlEYXRhU2l6ZSA9CisJCQkgICAgRXBsT2JkR2V0U3RyTGVuKCh2b2lkICopcERhdGEsIERhdGFTaXplLAorCQkJCQkgICAgcFN1YkluZGV4RW50cnlfcC0+bV9UeXBlKTsKKwkJfQorCisJfQorCisJcmV0dXJuIERhdGFTaXplOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldFN0ckxlbigpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBsZW5ndGggb2Ygc3RyaW5nLiBUaGUgJ1wwJworLy8gICAgICAgICAgICAgIGNoYXJhY3RlciBpcyBpbmNsdWRlZCEhCisvLworLy8gUGFyYW1ldGVyczogIHBPYmpEYXRhX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHN0cmluZworLy8gICAgICAgICAgICAgIE9iakxlbl9wICAgICAgICAgICAgPSBtYXguIGxlbmd0aCBvZiBvYmplY3RyIGVudHJ5CisvLyAgICAgICAgICAgICAgYk9ialR5cGVfcCAgICAgICAgICA9IG9iamVjdCB0eXBlIChWU1RSSU5HLCAuLi4pCisvLworLy8gUmV0dXJuczogICAgIHN0cmluZyBsZW5ndGggKyAxCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldFN0ckxlbih2b2lkICpwT2JqRGF0YV9wLAorCQkJCSAgIHRFcGxPYmRTaXplIE9iakxlbl9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApCit7CisKKwl0RXBsT2JkU2l6ZSBTdHJMZW4gPSAwOworCUJZVEUgKnBiU3RyaW5nOworCisJaWYgKHBPYmpEYXRhX3AgPT0gTlVMTCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFZpc2libGUgU3RyaW5nOiBkYXRhIGZvcm1hdCBieXRlCisJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQlwYlN0cmluZyA9IHBPYmpEYXRhX3A7CisKKwkJZm9yIChTdHJMZW4gPSAwOyBTdHJMZW4gPCBPYmpMZW5fcDsgU3RyTGVuKyspIHsKKwkJCWlmICgqcGJTdHJpbmcgPT0gJ1wwJykgeworCQkJCVN0ckxlbisrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwYlN0cmluZysrOworCQl9CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIG90aGVyIHN0cmluZyB0eXBlcyAuLi4KKworICAgICAgRXhpdDoKKwlyZXR1cm4gKFN0ckxlbik7CisKK30KKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQ2hlY2tPYmplY3RSYW5nZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlIHJhbmdlIG9mIG9iamVjdCBkYXRhCisvLworLy8gTk9USUNFOiBUaGUgcG9pbnRlciBvZiBkYXRhIChwRGF0YV9wKSBtdXN0IHBvaW50IG91dCB0byBhbiBldmVuIGFkZHJlc3MsCisvLyAgICAgICAgIGlmIE9ialR5cGUgaXMgdW5lcXVhbCB0byBrRXBsT2JkVHlwSW50OCBvciBrRXBsT2JkVHlwVUludDghIEJ1dCBpdCBpcworLy8gICAgICAgICBhbHdheXMgcmVhbGljZWQgYmVjYXVzZSBwb2ludGVyIG1fcERlZmF1bHQgcG9pbnRzIGFsd2F5cyB0byBhbgorLy8gICAgICAgICBhcnJheSBvZiB0aGUgU1BFQ0lGSUVEIHR5cGUuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AKKy8vICAgICAgICAgICAgICBwRGF0YV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDaGVja09iamVjdFJhbmdlKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCQkgdm9pZCAqcERhdGFfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXZvaWQgKnBSYW5nZURhdGE7CisKKwlBU1NFUlRNU0cocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRDaGVja09iamVjdFJhbmdlKCk6IG5vIGFkZHJlc3MgdG8gc3ViaW5kZXggc3RydWN0IVxuIik7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGlmIGRhdGEgcmFuZ2UgaGFzIHRvIGJlIGNoZWNrZWQKKwlpZiAoKHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY1JhbmdlKSA9PSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGFkZHJlc3Mgb2YgZGVmYXVsdCBkYXRhCisJcFJhbmdlRGF0YSA9IHBTdWJpbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisKKwkvLyBqdW1wIHRvIGNhbGxlZCBvYmplY3QgdHlwZQorCXN3aXRjaCAoKHRFcGxPYmRUeXBlKSBwU3ViaW5kZXhFbnRyeV9wLT5tX1R5cGUpIHsKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gT2JkVHlwZSBrRXBsT2JkVHlwQm9vbCB3aWxsIG5vdCBiZSBjaGVja2VkIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkKKwkJLy8gdHdvIHBvc3NpYmxlIHZhbHVlcyAwIG9yIDEuCisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gT2JkVHlwZXMgd2hpY2ggaGFzIHRvIGJlIGNoZWNrIHVwIGJlY2F1c2UgbnVtZXJpY2FsIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDg6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjggKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZEludGVnZXI4ICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDg6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDggKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZEludGVnZXIxNiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMTYgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMTYgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMTYgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZEludGVnZXIzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjMyICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDMyICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFJlYWwzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkUmVhbDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRSZWFsMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NDA6CisJY2FzZSBrRXBsT2JkVHlwSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwSW50NjQ6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHNpZ25lZCBRV09SRCAqKXBEYXRhX3ApIDwgKigoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHNpZ25lZCBRV09SRCAqKXBEYXRhX3ApID4gKigoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh1bnNpZ25lZCBRV09SRCAqKXBEYXRhX3ApIDwKKwkJICAgICooKHVuc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodW5zaWduZWQgUVdPUkQgKilwRGF0YV9wKSA+CisJCSAgICAqKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFJlYWw2NCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkUmVhbDY0ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRSZWFsNjQgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyBrRXBsT2JkVHlwWFN0cmluZyBhbmQga0VwbE9iZFR5cERvbWFpbiBjYW4gbm90IGJlIGNoZWNrdCBiZWNhdXNlCisJCS8vIHRoZXkgaGF2ZSBubyBudW1lcmljYWwgdmFsdWUuCisJZGVmYXVsdDoKKworCQlSZXQgPSBrRXBsT2JkVW5rbm93bk9iamVjdFR5cGU7CisJCWJyZWFrOworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZiAvLyAoRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnlQcmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBwcmVwYXJlcyB3cml0ZSBvZiBkYXRhIHRvIGFuIE9CRCBlbnRyeS4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQcmUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJICAgICB2b2lkICoqcHBEc3REYXRhX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkU3ViRW50cnlQdHIgKiBwcFN1YkVudHJ5X3AsCisJCQkJCSAgICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSAqIHBPYmRTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQk9PTCBmRW50cnlOdW1lcmljYWw7CisKKyNpZiAoRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gIT0gRkFMU0UpCisJdEVwbE9iZFZTdHJpbmdEb21haW4gTUVNIE1lbVZTdHJpbmdEb21haW47CisJdm9pZCBNRU0gKnBDdXJyRGF0YTsKKyNlbmRpZgorCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocFNyY0RhdGFfcCAhPSBOVUxMKTsJLy8gc2hvdWxkIG5ldmVyIGJlIE5VTEwKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2V0IGFkZHJlc3Mgb2YgaW5kZXggYW5kIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKwlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKUVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCUFjY2VzcyA9ICh0RXBsT2JkQWNjZXNzKSBwU3ViRW50cnktPm1fQWNjZXNzOworCisJLy8gY2hlY2sgYWNjZXNzIGZvciB3cml0ZQorCS8vIGFjY2VzcyB2aW9sYXRpb24gaWYgYWRyZXNzIHRvIGN1cnJlbnQgdmFsdWUgaXMgTlVMTAorCWlmICgoKEFjY2VzcyAmIGtFcGxPYmRBY2NDb25zdCkgIT0gMCkgfHwgKHBEc3REYXRhID09IE5VTEwpKSB7CisJCVJldCA9IGtFcGxPYmRBY2Nlc3NWaW9sYXRpb247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgc2l6ZSBvZiBvYmplY3QKKwkvLyAtYXMgT2JkU2l6ZSA9IE9iZEdldE9iamVjdFNpemUgKHBTdWJFbnRyeSk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFRvIHVzZSB0aGUgc2FtZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT2JkV3JpdGVFbnRyeSBhcyB3ZWxsIGFzIGZvcgorCS8vIGFuIFNETyBkb3dubG9hZCBjYWxsIGF0IGZpcnN0IChrRXBsT2JkRXZQcmUuLi4pIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCS8vIHdpdGggdGhlIGFyZ3VtZW50IHBvaW50ZXIgdG8gb2JqZWN0IHNpemUuCisJcENiUGFyYW1fcC0+bV91aUluZGV4ID0gdWlJbmRleF9wOworCXBDYlBhcmFtX3AtPm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKworCS8vIEJlY2F1c2Ugb2JqZWN0IHNpemUgYW5kIG9iamVjdCBwb2ludGVyIGFyZQorCS8vIGFkYXB0ZWQgYnkgdXNlciBjYWxsYmFjayBmdW5jdGlvbiwgcmUtcmVhZAorCS8vIHRoaXMgdmFsdWVzLgorCU9iZFNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJFbnRyeSk7CisJcERzdERhdGEgPSAodm9pZCBNRU0gKilFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyAwOS1kZWMtMjAwNCByLmQuOgorCS8vICAgICAgRnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeSgpIGNhbGxzIG5ldyBldmVudCBrRXBsT2JkRXZXclN0cmluZ0RvbWFpbgorCS8vICAgICAgZm9yIFN0cmluZyBvciBEb21haW4gd2hpY2ggbGV0cyBjYWxsZWQgbW9kdWxlIGRpcmVjdGx5IGNoYW5nZQorCS8vICAgICAgdGhlIGRhdGEgcG9pbnRlciBvciBzaXplLiBUaGlzIHByZXZlbnRzIGEgcmVjdXJzaXZlIGNhbGwgdG8KKwkvLyAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpZiBpdCBjYWxscyBFcGxPYmRHZXRFbnRyeSgpLgorI2lmIChFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKwlpZiAoKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB8fAorCSAgICAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikgfHwKKwkgICAgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKSkgeworCQlpZiAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCS8vIHJlc2VydmUgb25lIGJ5dGUgZm9yIDAtdGVybWluYXRpb24KKwkJCS8vIC1hcyBPYmRTaXplIC09IDE7CisJCQlTaXplX3AgKz0gMTsKKwkJfQorCQkvLyBmaWxsIG91dCBuZXcgYXJnLXN0cnVjdAorCQlNZW1WU3RyaW5nRG9tYWluLm1fRG93bmxvYWRTaXplID0gU2l6ZV9wOworCQlNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZSA9IE9iZFNpemU7CisJCU1lbVZTdHJpbmdEb21haW4ubV9wRGF0YSA9IHBEc3REYXRhOworCisJCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZXclN0cmluZ0RvbWFpbjsKKwkJcENiUGFyYW1fcC0+bV9wQXJnID0gJk1lbVZTdHJpbmdEb21haW47CisJCS8vICBjYWxsIHVzZXIgY2FsbGJhY2sKKwkJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssCisJCQkJCSAgICAgICBwQ2JQYXJhbV9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHdyaXRlIGJhY2sgbmV3IHNldHRpbmdzCisJCXBDdXJyRGF0YSA9IHBTdWJFbnRyeS0+bV9wQ3VycmVudDsKKwkJaWYgKChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykKKwkJICAgIHx8IChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykpIHsKKwkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBDdXJyRGF0YSktPm1fU2l6ZSA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwQ3VyckRhdGEpLT5tX3BTdHJpbmcgPQorCQkJICAgIE1lbVZTdHJpbmdEb21haW4ubV9wRGF0YTsKKwkJfSBlbHNlCQkvLyBpZiAocFNkb3NUYWJsZUVudHJ5X3AtPm1fYk9ialR5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikKKwkJeworCQkJKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBDdXJyRGF0YSktPm1fU2l6ZSA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCQkoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcEN1cnJEYXRhKS0+bV9wRGF0YSA9CisJCQkgICAgKHZvaWQgTUVNICopTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCQl9CisKKwkJLy8gQmVjYXVzZSBvYmplY3Qgc2l6ZSBhbmQgb2JqZWN0IHBvaW50ZXIgYXJlCisJCS8vIGFkYXB0ZWQgYnkgdXNlciBjYWxsYmFjayBmdW5jdGlvbiwgcmUtcmVhZAorCQkvLyB0aGlzIHZhbHVlcy4KKwkJT2JkU2l6ZSA9IE1lbVZTdHJpbmdEb21haW4ubV9PYmpTaXplOworCQlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKU1lbVZTdHJpbmdEb21haW4ubV9wRGF0YTsKKwl9CisjZW5kaWYgLy8jaWYgKE9CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gIT0gRkFMU0UpCisKKwkvLyAwNy1kZWMtMjAwNCByLmQuOiBzaXplIGZyb20gYXBwbGljYXRpb24gaXMgbmVlZGVkIGJlY2F1c2UgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGUgb2JqZWN0IHNpemUKKwkvLyAtYXMgMTYuMTEuMDQgQ2JQYXJhbS5tX3BBcmcgICAgID0gJk9iZFNpemU7CisJLy8gMDktZGVjLTIwMDQgci5kLjogQ2JQYXJhbS5tX3BBcmcgICAgID0gJlNpemVfcDsKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSAmT2JkU2l6ZTsKKwlwQ2JQYXJhbV9wLT5tX09iZEV2ZW50ID0ga0VwbE9iZEV2SW5pdFdyaXRlOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChTaXplX3AgPiBPYmRTaXplKSB7CisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCWlmICgoKGNoYXIgTUVNICopcFNyY0RhdGFfcClbU2l6ZV9wIC0gMV0gPT0gJ1wwJykgewkvLyBsYXN0IGJ5dGUgb2Ygc291cmNlIHN0cmluZyBjb250YWlucyBudWxsIGNoYXJhY3RlcgorCisJCQkvLyByZXNlcnZlIG9uZSBieXRlIGluIGRlc3RpbmF0aW9uIGZvciAwLXRlcm1pbmF0aW9uCisJCQlTaXplX3AgLT0gMTsKKwkJfSBlbHNlIGlmIChTaXplX3AgPj0gT2JkU2l6ZSkgewkvLyBzb3VyY2Ugc3RyaW5nIGlzIG5vdCAwLXRlcm1pbmF0ZWQKKwkJCS8vIGFuZCBkZXN0aW5hdGlvbiBidWZmZXIgaXMgdG9vIHNob3J0CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCVJldCA9IEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKHBTdWJFbnRyeSwgJmZFbnRyeU51bWVyaWNhbCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChmRW50cnlOdW1lcmljYWwgIT0gRkFMU0UpCisJICAgICYmIChTaXplX3AgIT0gT2JkU2l6ZSkpIHsKKwkJLy8gdHlwZSBpcyBudW1lcmljYWwsIHRoZXJlZm9yIHNpemUgaGFzIHRvIGZpdCwgYnV0IGl0IGRvZXMgbm90LgorCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKwkvLyB1c2UgZ2l2ZW4gc2l6ZSwgYmVjYXVzZSBub24tbnVtZXJpY2FsIG9iamVjdHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCBzaG9ydGVyIHZhbHVlcworCU9iZFNpemUgPSBTaXplX3A7CisKKwkvLyBzZXQgb3V0cHV0IHBhcmFtZXRlcnMKKwkqcE9iZFNpemVfcCA9IE9iZFNpemU7CisJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwkqcHBTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCSpwcERzdERhdGFfcCA9IHBEc3REYXRhOworCisJLy8gYWxsIGNoZWNrcyBhcmUgZG9uZQorCS8vIHRoZSBjYWxsZXIgbWF5IG5vdyBjb252ZXJ0IHRoZSBudW1lcmlhbCBzb3VyY2UgdmFsdWUgdG8gcGxhdGZvcm0gYnl0ZSBvcmRlciBpbiBhIHRlbXBvcmFyeSBidWZmZXIKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeVBvc3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBmaW5pc2hlcyB3cml0ZSBvZiBkYXRhIHRvIGFuIE9CRCBlbnRyeS4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIGNhbGxlciBjb252ZXJ0ZWQgdGhlIHNvdXJjZSB2YWx1ZSB0byBwbGF0Zm9ybSBieXRlIG9yZGVyCisJLy8gbm93IHRoZSByYW5nZSBvZiB0aGUgdmFsdWUgbWF5IGJlIGNoZWNrZWQKKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKwl7CisJCS8vIGNoZWNrIGRhdGEgcmFuZ2UKKwkJUmV0ID0gRXBsT2JkQ2hlY2tPYmplY3RSYW5nZShwU3ViRW50cnlfcCwgcFNyY0RhdGFfcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCisJLy8gbm93IGNhbGwgdXNlciBjYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayB2YWx1ZQorCS8vIHdyaXRlIGFkZHJlc3Mgb2Ygc291cmNlIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hlY2sgdGhpcyBkYXRhCisJcENiUGFyYW1fcC0+bV9wQXJnID0gcFNyY0RhdGFfcDsKKwlwQ2JQYXJhbV9wLT5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UHJlV3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnlfcC0+bV9mcENhbGxiYWNrLCBwQ2JQYXJhbV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29weSBvYmplY3QgZGF0YSB0byBPQkQKKwlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhX3AsIE9iZFNpemVfcCk7CisKKwkvLyB0ZXJtaW5hdGUgc3RyaW5nIHdpdGggMAorCWlmIChwU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCSgoY2hhciBNRU0gKilwRHN0RGF0YV9wKVtPYmRTaXplX3BdID0gJ1wwJzsKKwl9CisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgZGF0YSBzdWJzZXF1ZW50bHkKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSBwRHN0RGF0YV9wOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0V3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnlfcC0+bV9mcENhbGxiYWNrLCBwQ2JQYXJhbV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0U2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGdldCBzaXplIG9mIG9iamVjdAorLy8gICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB0eXBlIGFuIGZpeGVkIGRhdGEgdHlwZSAoQllURSwgV09SRCwgLi4uKQorLy8gICAgICAgICAgICAgIG9yIG5vbiBmaXhlZCBvYmplY3QgKHN0cmluZywgZG9tYWluKS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRlY2lkZQorLy8gICAgICAgICAgICAgIGlmIGRvd25sb2FkIGRhdGEgYXJlIHN0b3JlZCB0ZW1wb3Jhcnkgb3Igbm90LiBGb3Igb2JqZWN0cyB3aXRoIGZpeGVkIGRhdGEgbGVuZ3RoCisvLyAgICAgICAgICAgICAgYW5kIHR5cGVzIGEgdmFsdWUgcmFuZ2UgY2hlY2tpbmcgY2FuIHByb2Nlc3MuCisvLyAgICAgICAgICAgICAgRm9yIHN0cmluZ3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdob2xlIG9iamVjdCBzaXplIG5vdCB0aGUKKy8vICAgICAgICAgICAgICBsZW5ndGggb2Ygc3RyaW5nLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldE9iamVjdFNpemUodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl0RXBsT2JkU2l6ZSBEYXRhU2l6ZSA9IDA7CisJdm9pZCAqcERhdGE7CisKKwlzd2l0Y2ggKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisKKwkJRGF0YVNpemUgPSAxOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgY2hlY2sgYmVjYXVzZSBudW1lcmljYWwgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZEludGVnZXI4KTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkOCk7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRJbnRlZ2VyMTYpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkMTYpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkSW50ZWdlcjMyKTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRVbnNpZ25lZDMyKTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRSZWFsMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgbm90IGNoZWNrZWQgYmVjYXVzZSBub3QgTlVNIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cERvbWFpbjoKKworCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wQ3VycmVudDsKKwkJaWYgKCh2b2lkIE1FTSAqKXBEYXRhICE9ICh2b2lkIE1FTSAqKU5VTEwpIHsKKwkJCURhdGFTaXplID0gKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVlN0cmluZzoKKwkJLy9jYXNlIGtFcGxPYmRUeXBVU3RyaW5nOgorCisJCS8vIElmIE9EIGVudHJ5IGlzIGRlZmluZWQgYnkgbWFjcm8gRVBMX09CRF9TVUJJTkRFWF9ST01fVlNUUklORworCQkvLyB0aGVuIHRoZSBjdXJyZW50IHBvaW50ZXIgaXMgYWx3YXlzIE5VTEwuIFRoZSBmdW5jdGlvbgorCQkvLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGVmYXVsdCBzdHJpbmcuCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJLy8gdEVwbE9iZFZTdHJpbmcgb2YgY3VycmVudCB2YWx1ZS4KKwkJCS8vICh0eXBlcyB0RXBsT2JkVlN0cmluZywgdEVwbE9iZE9TdHJpbmcgYW5kIHRFcGxPYmRVU3RyaW5nIGhhcyB0aGUgc2FtZSBtZW1iZXJzKQorCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwRGF0YSktPm1fU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG5vdCBkZWNsZWFyZWQuIFRoZSBzdHJpbmcKKwkJCS8vIGlzIGxvY2F0ZWQgaW4gUk9NLCB0aGVyZWZvciB1c2UgZGVmYXVsdCBwb2ludGVyLgorCQkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisJCQlpZiAoKENPTlNUIHZvaWQgUk9NICopcERhdGEgIT0gKENPTlNUIHZvaWQgUk9NICopTlVMTCkgeworCQkJCS8vIFRoZSBtYXguIHNpemUgb2Ygc3RyaW5ncyBkZWZpbmVkIGJ5IFNUUklORy1NYWNybyBpcyBzdG9yZWQgaW4KKwkJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBkZWZhdWx0IHZhbHVlLgorCQkJCURhdGFTaXplID0KKwkJCQkgICAgKChDT05TVCB0RXBsT2JkVlN0cmluZyBST00gKikgcERhdGEpLT4KKwkJCQkgICAgbV9TaXplOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBPU3RyaW5nOgorCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJLy8gdEVwbE9iZFZTdHJpbmcgb2YgY3VycmVudCB2YWx1ZS4KKwkJCS8vICh0eXBlcyB0RXBsT2JkVlN0cmluZywgdEVwbE9iZE9TdHJpbmcgYW5kIHRFcGxPYmRVU3RyaW5nIGhhcyB0aGUgc2FtZSBtZW1iZXJzKQorCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRPU3RyaW5nIE1FTSAqKSBwRGF0YSktPm1fU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG5vdCBkZWNsZWFyZWQuIFRoZSBzdHJpbmcKKwkJCS8vIGlzIGxvY2F0ZWQgaW4gUk9NLCB0aGVyZWZvciB1c2UgZGVmYXVsdCBwb2ludGVyLgorCQkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisJCQlpZiAoKENPTlNUIHZvaWQgUk9NICopcERhdGEgIT0gKENPTlNUIHZvaWQgUk9NICopTlVMTCkgeworCQkJCS8vIFRoZSBtYXguIHNpemUgb2Ygc3RyaW5ncyBkZWZpbmVkIGJ5IFNUUklORy1NYWNybyBpcyBzdG9yZWQgaW4KKwkJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBkZWZhdWx0IHZhbHVlLgorCQkJCURhdGFTaXplID0KKwkJCQkgICAgKChDT05TVCB0RXBsT2JkT1N0cmluZyBST00gKikgcERhdGEpLT4KKwkJCQkgICAgbV9TaXplOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCisJCURhdGFTaXplID0gMzsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisKKwkJRGF0YVNpemUgPSA1OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKworCQlEYXRhU2l6ZSA9IDY7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCisJCURhdGFTaXplID0gNzsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCisJCURhdGFTaXplID0gODsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBUaW1lT2ZEYXk6CisJY2FzZSBrRXBsT2JkVHlwVGltZURpZmY6CisKKwkJRGF0YVNpemUgPSA2OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBEYXRhU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGdldCB0aGUgZGVmYXVsdCBwb2ludGVyICh0eXBlIHNwZWNpZmljKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wICAgID0gcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgKHZvaWQgKikgICA9IHBvaW50ZXIgdG8gZGVmYXVsdCB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpFcGxPYmRHZXRPYmplY3REZWZhdWx0UHRyKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKQoreworCisJdm9pZCAqcERlZmF1bHQ7CisJdEVwbE9iZFR5cGUgVHlwZTsKKworCUFTU0VSVE1TRyhwU3ViSW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIoKTogcG9pbnRlciB0byBTdWJFbnRyeSBub3QgdmFsaWQhXG4iKTsKKworCS8vIGdldCBhZGRyZXNzIHRvIGRlZmF1bHQgZGF0YSBmcm9tIGRlZmF1bHQgcG9pbnRlcgorCXBEZWZhdWx0ID0gcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwlpZiAocERlZmF1bHQgIT0gTlVMTCkgeworCQkvLyB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIHR5cGVzLCB3aG9zZSBkZWZhdWx0IHBvaW50ZXIgYWx3YXlzIGlzIE5VTEwgb3IgaGFzIHRvIGdldCBmcm9tIG90aGVyIHN0cnVjdHVyZQorCQkvLyBnZXQgdHlwZSBmcm9tIHN1YmluZGV4IHN0cnVjdHVyZQorCQlUeXBlID0gcFN1YkluZGV4RW50cnlfcC0+bV9UeXBlOworCisJCS8vIGNoZWNrIGlmIG9iamVjdCB0eXBlIGlzIGEgc3RyaW5nIHZhbHVlCisJCWlmICgoVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykJLyogfHwKKwkJCQkJCSAgIChUeXBlID09IGtFcGxPYmRUeXBVU3RyaW5nKSAqLyApIHsKKworCQkJLy8gRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORworCQkJLy8gICAgdEVwbE9iZFNpemUgICAgICAgICBtX1NpemU7ICAgICAgIC0tPiBzaXplIG9mIGRlZmF1bHQgc3RyaW5nCisJCQkvLyAgICBjaGFyICogICAgbV9wRGVmU3RyaW5nOyAtLT4gcG9pbnRlciB0byAgZGVmYXVsdCBzdHJpbmcKKwkJCS8vICAgIGNoYXIgKiAgICBtX3BTdHJpbmc7ICAgIC0tPiBwb2ludGVyIHRvIHN0cmluZyBpbiBSQU0KKwkJCS8vCisJCQlwRGVmYXVsdCA9CisJCQkgICAgKHZvaWQgKikoKHRFcGxPYmRWU3RyaW5nICopIHBEZWZhdWx0KS0+bV9wU3RyaW5nOworCQl9IGVsc2UgaWYgKFR5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCXBEZWZhdWx0ID0KKwkJCSAgICAodm9pZCAqKSgodEVwbE9iZE9TdHJpbmcgKikgcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCX0KKwl9CisKKwlyZXR1cm4gcERlZmF1bHQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIGEgdmFyaWFibGUgZW50cnkgb2YgYW4gb2JqZWN0CisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AKKy8vICAgICAgICAgICAgICBwcFZhckVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdENvcEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFZhckVudHJ5KHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbE9iZFZhckVudHJ5Tm90RXhpc3Q7CisKKwlBU1NFUlQocHBWYXJFbnRyeV9wICE9IE5VTEwpOwkvLyBpcyBub3QgYWxsb3dlZCB0byBiZSBOVUxMCisJQVNTRVJUKHBTdWJpbmRleEVudHJ5X3AgIT0gTlVMTCk7CisKKwkvLyBjaGVjayBWQVItRmxhZyAtIG9ubHkgdGhpcyBvYmplY3QgcG9pbnRzIHRvIHZhcmlhYmxlcworCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjVmFyKSAhPSAwKSB7CisJCS8vIGNoZWNrIGlmIG9iamVjdCBpcyBhbiBhcnJheQorCQlpZiAoKHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPSAwKSB7CisJCQkqcHBWYXJFbnRyeV9wID0KKwkJCSAgICAmKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBTdWJpbmRleEVudHJ5X3AtPgorCQkJICAgICAgbV9wQ3VycmVudClbcFN1YmluZGV4RW50cnlfcC0+bV91aVN1YkluZGV4IC0gMV07CisJCX0gZWxzZSB7CisJCQkqcHBWYXJFbnRyeV9wID0KKwkJCSAgICAodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwU3ViaW5kZXhFbnRyeV9wLT4KKwkJCSAgICBtX3BDdXJyZW50OworCQl9CisKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBpbmRleCBlbnRyeSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggbnVtYmVyCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBTdWJpbmRleCBudW1iZXIKKy8vICAgICAgICAgICAgICBwcE9iZEVudHJ5X3AgICAgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgcHBPYmRTdWJFbnRyeV9wID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBzdWJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCkKK3sKKworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2V0IGFkZHJlc3Mgb2YgZW50cnkgb2YgaW5kZXgKKwlSZXQgPQorCSAgICBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwgdWlJbmRleF9wLAorCQkJCSAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBlbnRyeSBvZiBzdWJpbmRleAorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJpbmRleF9wLCBwcE9iZFN1YkVudHJ5X3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIHVzZXIvc3RhY2sgdGhhdCBhbiBvYmplY3Qgd2lsbCBiZSBzZWFyY2hlZAorCS8vIGlmIHRoZSBjYWxsZWQgbW9kdWxlIHJldHVybmVzIGFuIGVycm9yIHRoZW4gd2UgYWJvcnQgdGhlIHNlYXJjaGluZyB3aXRoIGtFcGxPYmRJbmRleE5vdEV4aXN0CisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YmluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBOVUxMOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdkNoZWNrRXhpc3Q7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJUmV0ID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBpdCBpcyBhbGxvd2VkIHRvIHNldCBwcE9iZEVudHJ5X3AgdG8gTlVMTAorCS8vIGlmIHNvLCBubyBhZGRyZXNzIHdpbGwgYmUgd3JpdHRlbiB0byBjYWxsaW5nIGZ1bmN0aW9uCisJaWYgKHBwT2JkRW50cnlfcCAhPSBOVUxMKSB7CisJCSpwcE9iZEVudHJ5X3AgPSBwT2JkRW50cnk7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IEN1cnJlbnQgcG9pbnRlciAodHlwZSBzcGVjaWZpYykKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YkluZGV4RW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB2b2lkIE1FTSoKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBNRU0gKkVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl2b2lkIE1FTSAqcERhdGE7CisJdW5zaWduZWQgaW50IHVpQXJyYXlJbmRleDsKKwl0RXBsT2JkU2l6ZSBTaXplOworCisJcERhdGEgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCisJLy8gY2hlY2sgaWYgY29uc3RhbnQgb2JqZWN0CisJaWYgKHBEYXRhICE9IE5VTEwpIHsKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IGlzIGFuIGFycmF5CisJCWlmICgocFN1YkluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpICE9IDApIHsKKwkJCS8vIGNhbGN1bGF0ZSBjb3JyZWN0IGRhdGEgcG9pbnRlcgorCQkJdWlBcnJheUluZGV4ID0gcFN1YkluZGV4RW50cnlfcC0+bV91aVN1YkluZGV4IC0gMTsKKwkJCWlmICgocFN1YkluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjVmFyKSAhPSAwKSB7CisJCQkJU2l6ZSA9IHNpemVvZih0RXBsT2JkVmFyRW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViSW5kZXhFbnRyeV9wKTsKKwkJCX0KKwkJCXBEYXRhID0gKChCWVRFIE1FTSAqKSBwRGF0YSkgKyAoU2l6ZSAqIHVpQXJyYXlJbmRleCk7CisJCX0KKwkJLy8gY2hlY2sgaWYgVmFyRW50cnkKKwkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCS8vIFRoZSBkYXRhIHBvaW50ZXIgaXMgc3RvcmVkIGluIFZhckVudHJ5LT5wRGF0YQorCQkJcERhdGEgPSAoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcERhdGEpLT5tX3BEYXRhOworCQl9CisJCS8vIHRoZSBkZWZhdWx0IHBvaW50ZXIgaXMgc3RvcmVkIGZvciBzdHJpbmdzIGluIHRFcGxPYmRWU3RyaW5nCisJCWVsc2UgaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpCS8qIHx8CisJCQkJCQkJCQkJICAgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVVN0cmluZykgICAgKi8KKwkJCSApIHsKKwkJCXBEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKikoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwRGF0YSktPgorCQkJICAgIG1fcFN0cmluZzsKKwkJfSBlbHNlIGlmIChwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCXBEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKikoKHRFcGxPYmRPU3RyaW5nIE1FTSAqKSBwRGF0YSktPgorCQkJICAgIG1fcFN0cmluZzsKKwkJfQorCX0KKworCXJldHVybiBwRGF0YTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRJbmRleEludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBpbmRleCBlbnRyeSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBJbml0UGFyYW1fcAorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcAorLy8gICAgICAgICAgICAgIHBwT2JkRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0SW5kZXhJbnRlcm4odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCkKK3sKKworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworCXVuc2lnbmVkIGludCBuTG9vcDsKKworCS8vIGlmIHVzZXIgT0QgaXMgdXNlZCB0aGVuIG9iamVrdHMgYWxzbyBoYXMgdG8gYmUgc2VhcmNoZWQgaW4gdXNlciBPRAorCS8vIHRoZXJlIGlzIGxlc3MgY29kZSBuZWVkIGlmIHdlIGRvIHRoaXMgaW4gYSBsb29wCisJbkxvb3AgPSAyOworCisjZW5kaWYKKworCUFTU0VSVE1TRyhwcE9iZEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0SW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBpbmRleCBlbnRyeSBpcyBOVUxMIVxuIik7CisKKwlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKworCS8vIGdldCBzdGFydCBhZGRyZXNzIG9mIE9EIHBhcnQKKwkvLyBzdGFydCBhZGRyZXNzIGRlcGVuZHMgb24gb2JqZWN0IGluZGV4IGJlY2F1c2UKKwkvLyBvYmplY3QgZGljdGlvbmFyeSBpcyBkaXZpZGVkIGluIDMgcGFydHMKKwlpZiAoKHVpSW5kZXhfcCA+PSAweDEwMDApICYmICh1aUluZGV4X3AgPCAweDIwMDApKSB7CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wUGFydDsKKwl9IGVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHgyMDAwKSAmJiAodWlJbmRleF9wIDwgMHg2MDAwKSkgeworCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcE1hbnVmYWN0dXJlclBhcnQ7CisJfQorCS8vIGluZGV4IHJhbmdlIDB4QTAwMCB0byAweEZGRkYgaXMgcmVzZXJ2ZWQgZm9yIERTUC00MDUKKwkvLyBEUy0zMDEgZGVmaW5lcyB0aGF0IHJhbmdlIDB4NjAwMCB0byAweDlGRkYgKCEhISkgaXMgc3RvcmVkIGlmICJzdG9yZSIgd2FzIHdyaXR0ZW4gdG8gMHgxMDEwLzMuCisJLy8gVGhlcmVmb3JlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBPQkRfSU5DTFVERV9BMDAwX1RPX0RFVklDRV9QQVJUID0gRkFMU0UuCisJLy8gQnV0IGEgQ0FOb3BlbiBBcHBsaWNhdGlvbiB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQgZHluYW1pYyBPRCBvciB1c2VyLU9EIGJ1dCB3YW50cyB0byB1c2Ugc3RhdGljIG9iamV0cyAweEEwMDAuLi4KKwkvLyBzaG91bGQgc2V0IE9CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgdG8gVFJVRS4KKworI2lmIChFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCA9PSBGQUxTRSkKKwllbHNlIGlmICgodWlJbmRleF9wID49IDB4NjAwMCkgJiYgKHVpSW5kZXhfcCA8IDB4OUZGRikpCisjZWxzZQorCWVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHg2MDAwKSAmJiAodWlJbmRleF9wIDwgMHhGRkZGKSkKKyNlbmRpZgorCXsKKwkJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BEZXZpY2VQYXJ0OworCX0KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJLy8gaWYgaW5kZXggZG9lcyBub3QgbWF0Y2ggaW4gc3RhdGljIE9EIHRoZW4gaW5kZXggb25seSBoYXMgdG8gYmUgc2VhcmNoZWQgaW4gdXNlciBPRAorCWVsc2UgeworCQkvLyBiZWdpbiBmcm9tIGZpcnN0IGVudHJ5IG9mIHVzZXIgT0QgcGFydAorCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0OworCisJCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJCWlmIChwT2JkRW50cnkgPT0gTlVMTCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIGxvb3AgbXVzdCBvbmx5IHJ1biBvbmNlCisJCW5Mb29wID0gMTsKKwl9CisKKwlkbyB7CisKKyNlbHNlCisKKwkvLyBubyB1c2VyIE9EIGlzIGF2YWlsYWJsZQorCS8vIHNvIG90aGVyIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gT0QKKwllbHNlIHsKKwkJUmV0ID0ga0VwbE9iZElsbGVnYWxQYXJ0OworCQlnb3RvIEV4aXQ7CisJfQorCisjZW5kaWYKKworCS8vIG5vdGU6CisJLy8gVGhlIGVuZCBvZiBJbmRleCB0YWJsZSBpcyBtYXJrZWQgd2l0aCBtX3VpSW5kZXggPSAweEZGRkYuCisJLy8gSWYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHdJbmRleF9wID0gMHhGRkZGLCBlbnRyeQorCS8vIHNob3VsZCBub3QgYmUgZm91bmQuIFRoZXJlZm9yIGl0IGlzIGltcG9ydGFudCB0byB1c2UKKwkvLyB3aGlsZXt9IGluc3RlYWQgb2YgZG97fXdoaWxlICEhIQorCisJLy8gZ2V0IGZpcnN0IGluZGV4IG9mIGluZGV4IHRhYmxlCisJdWlJbmRleCA9IHBPYmRFbnRyeS0+bV91aUluZGV4OworCisJLy8gc2VhcmNoIEluZGV4IGluIE9EIHBhcnQKKwl3aGlsZSAodWlJbmRleCAhPSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCkgeworCQkvLyBnbyB0byB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gaWYgaW5kZXggaXMgZm91bmQKKwkJaWYgKHVpSW5kZXhfcCA9PSB1aUluZGV4KSB7CisJCQkvLyB3cml0ZSBhZGRyZXNzIG9mIE9EIGVudHJ5IHRvIGNhbGxpbmcgZnVuY3Rpb24KKwkJCSpwcE9iZEVudHJ5X3AgPSBwT2JkRW50cnk7CisJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBvYmplY3RzIGFyZSBzb3J0ZWQgaW4gT0QKKwkJLy8gaWYgdGhlIGN1cnJlbnQgaW5kZXggaW4gT0QgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbmRleCB3aGljaCBpcyB0byBzZWFyY2ggdGhlbiBicmVhayBsb29wCisJCS8vIGluIHRoaXMgY2FzZSB1c2VyIE9EIGhhcyB0byBiZSBzZWFyY2ggdG9vCisJCWlmICh1aUluZGV4X3AgPCB1aUluZGV4KSB7CisJCQlicmVhazsKKwkJfQorCQkvLyBuZXh0IGVudHJ5IGluIGluZGV4IHRhYmxlCisJCXBPYmRFbnRyeSsrOworCisJCS8vIGdldCBuZXh0IGluZGV4IG9mIGluZGV4IHRhYmxlCisJCXVpSW5kZXggPSBwT2JkRW50cnktPm1fdWlJbmRleDsKKwl9CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworCS8vIGJlZ2luIGZyb20gZmlyc3QgZW50cnkgb2YgdXNlciBPRCBwYXJ0CisJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BVc2VyUGFydDsKKworCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJaWYgKHBPYmRFbnRyeSA9PSBOVUxMKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc3dpdGNoIG5leHQgbG9vcCBmb3IgdXNlciBPRAorCW5Mb29wLS07CisKK30KKword2hpbGUgKG5Mb29wID4gMCkgOworCisjZW5kaWYKKworICAgIC8vIGluIHRoaXMgbGluZSBJbmRleCB3YXMgbm90IGZvdW5kCisKK0V4aXQ6CisKK3JldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIGEgc3ViaW5kZXggZW50cnkgZnJvbSBhIGluZGV4IGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBPYmRFbnRyeV9wCisvLyAgICAgICAgICAgICAgYlN1YkluZGV4X3AKKy8vICAgICAgICAgICAgICBwcE9iZFN1YkVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCkKK3sKKworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdW5zaWduZWQgaW50IG5TdWJJbmRleENvdW50OworCXRFcGxLZXJuZWwgUmV0OworCisJQVNTRVJUTVNHKHBPYmRFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldFN1YmluZGV4SW50ZXJuKCk6IHBvaW50ZXIgdG8gaW5kZXggaXMgTlVMTCFcbiIpOworCUFTU0VSVE1TRyhwcE9iZFN1YkVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBzdWJpbmRleCBpcyBOVUxMIVxuIik7CisKKwlSZXQgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKworCS8vIGdldCBzdGFydCBhZGRyZXNzIG9mIHN1YmluZGV4IHRhYmxlIGFuZCBjb3VudCBvZiBzdWJpbmRpY2VzCisJcFN1YkVudHJ5ID0gcE9iZEVudHJ5X3AtPm1fcFN1YkluZGV4OworCW5TdWJJbmRleENvdW50ID0gcE9iZEVudHJ5X3AtPm1fdWlDb3VudDsKKwlBU1NFUlRNU0coKHBTdWJFbnRyeSAhPSBOVUxMKSAmJiAoblN1YkluZGV4Q291bnQgPiAwKSwgIk9iZEdldFN1YmluZGV4SW50ZXJuKCk6IGludmFsaWQgc3ViaW5kZXggdGFibGUgd2l0aGluIGluZGV4IHRhYmxlIVxuIik7CS8vIHNob3VsZCBuZXZlciBiZSBOVUxMCisKKwkvLyBzZWFyY2ggc3ViaW5kZXggaW4gc3ViaW5kZXggdGFibGUKKwl3aGlsZSAoblN1YkluZGV4Q291bnQgPiAwKSB7CisJCS8vIGNoZWNrIGlmIGFycmF5IGlzIGZvdW5kCisJCWlmICgocFN1YkVudHJ5LT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0gMCkgeworCQkJLy8gY2hlY2sgaWYgc3ViaW5kZXggaXMgaW4gcmFuZ2UKKwkJCWlmICh1aVN1YkluZGV4X3AgPCBwT2JkRW50cnlfcC0+bV91aUNvdW50KSB7CisJCQkJLy8gdXBkYXRlIHN1YmluZGV4IG51bWJlciAoc3ViaW5kZXggZW50cnkgb2YgYW4gYXJyYXkgaXMgYWx3YXlzIGluIFJBTSAhISEpCisJCQkJcFN1YkVudHJ5LT5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJCQkJKnBwT2JkU3ViRW50cnlfcCA9IHBTdWJFbnRyeTsKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwkJLy8gZ28gdG8gdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGlmIHN1YmluZGV4IGlzIGZvdW5kCisJCWVsc2UgaWYgKHVpU3ViSW5kZXhfcCA9PSBwU3ViRW50cnktPm1fdWlTdWJJbmRleCkgeworCQkJKnBwT2JkU3ViRW50cnlfcCA9IHBTdWJFbnRyeTsKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIG9iamVjdHMgYXJlIHNvcnRlZCBpbiBPRAorCQkvLyBpZiB0aGUgY3VycmVudCBzdWJpbmRleCBpbiBPRCBpcyBncmVhdGVyIHRoYW4gdGhlIHN1YmluZGV4IHdoaWNoIGlzIHRvIHNlYXJjaCB0aGVuIGJyZWFrIGxvb3AKKwkJLy8gaW4gdGhpcyBjYXNlIHVzZXIgT0QgaGFzIHRvIGJlIHNlYXJjaCB0b28KKwkJaWYgKHVpU3ViSW5kZXhfcCA8IHBTdWJFbnRyeS0+bV91aVN1YkluZGV4KSB7CisJCQlicmVhazsKKwkJfQorCisJCXBTdWJFbnRyeSsrOworCQluU3ViSW5kZXhDb3VudC0tOworCX0KKworCS8vIGluIHRoaXMgbGluZSBTdWJJbmRleCB3YXMgbm90IGZvdW50CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gc2V0IGFkZHJlc3MgdG8gY2FsbGJhY2tmdW5jdGlvbiBmb3IgY29tbWFuZCBTdG9yZSBhbmQgTG9hZAorLy8KKy8vIFBhcmFtZXRlcnM6ICBmcENhbGxiYWNrX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkgICAgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgZnBDYWxsYmFja19wKQoreworCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2V0IG5ldyBhZGRyZXNzIG9mIGNhbGxiYWNrIGZ1bmN0aW9uCisJRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgPSBmcENhbGxiYWNrX3A7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcnVucyB0aHJvdWdoIE9EIGFuZCBleGVjdXRlcyBhIGpvYgorLy8KKy8vIFBhcmFtZXRlcnM6ICBDdXJyZW50T2RQYXJ0X3AKKy8vICAgICAgICAgICAgICBwT2JkRW50eV9wCisvLyAgICAgICAgICAgICAgRGlyZWN0aW9uX3AgICAgID0gd2hhdCBpcyB0byBkbyAobG9hZCB2YWx1ZXMgZnJvbSBmbGFzaCBvciBFRVBST00sIHN0b3JlLCAuLi4pCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZFBhcnQgQ3VycmVudE9kUGFydF9wLAorCQkJCQkgICB0RXBsT2JkRW50cnlQdHIgcE9iZEVudHlfcCwKKwkJCQkJICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IG5TdWJJbmRleENvdW50OworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl2b2lkICpwRGVmYXVsdDsKKwl0RXBsT2JkU2l6ZSBPYmpTaXplOworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNIENiU3RvcmU7CisJdEVwbE9iZFZhckVudHJ5IE1FTSAqcFZhckVudHJ5OworCisJQVNTRVJUKHBPYmRFbnR5X3AgIT0gTlVMTCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByZXBhcmUgc3RydWN0dXJlIGZvciBTVE9SRSBSRVNUT1JFIGNhbGxiYWNrIGZ1bmN0aW9uCisJQ2JTdG9yZS5tX2JDdXJyZW50T2RQYXJ0ID0gKEJZVEUpIEN1cnJlbnRPZFBhcnRfcDsKKwlDYlN0b3JlLm1fcERhdGEgPSBOVUxMOworCUNiU3RvcmUubV9PYmpTaXplID0gMDsKKworCS8vIGNvbW1hbmQgb2YgZmlyc3QgYWN0aW9uIGRlcGVuZHMgb24gZGlyZWN0aW9uIHRvIGFjY2VzcworI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCWlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyTG9hZCkgeworCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1PcGVuUmVhZDsKKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmV2aW91cyBjb21tYW5kCisJCVJldCA9IEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAmIENiU3RvcmUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gc2V0IGNvbW1hbmQgZm9yIGluZGV4IGFuZCBzdWJpbmRleCBsb29wCisJCUNiU3RvcmUubV9iQ29tbWFuZCA9IChCWVRFKSBrRXBsT2JkQ29tbVJlYWRPYmo7CisJfSBlbHNlIGlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyU3RvcmUpIHsKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tT3BlbldyaXRlOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByZXZpb3VzIGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBzZXQgY29tbWFuZCBmb3IgaW5kZXggYW5kIHN1YmluZGV4IGxvb3AKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tV3JpdGVPYmo7CisJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisJLy8gd2Ugc2hvdWxkIG5vdCByZXN0b3JlIHRoZSBPRCB2YWx1ZXMgaGVyZQorCS8vIHRoZSBuZXh0IE5NVCBjb21tYW5kICJSZXNldCBOb2RlIiBvciAiUmVzZXQgQ29tbXVuaWNhdGlvbiIgcmVzZXRzIHRoZSBPRCBkYXRhCisJaWYgKERpcmVjdGlvbl9wICE9IGtFcGxPYmREaXJSZXN0b3JlKSB7CisJCS8vIHdhbGsgdGhyb3VnaCBPRCBwYXJ0IHRpbGwgZW5kIGlzIGZvdW5kCisJCXdoaWxlIChwT2JkRW50eV9wLT5tX3VpSW5kZXggIT0gRVBMX09CRF9UQUJMRV9JTkRFWF9FTkQpIHsKKwkJCS8vIGdldCBhZGRyZXNzIHRvIHN1YmluZGV4IHRhYmxlIGFuZCBjb3VudCBvZiBzdWJpbmRpY2VzCisJCQlwU3ViSW5kZXggPSBwT2JkRW50eV9wLT5tX3BTdWJJbmRleDsKKwkJCW5TdWJJbmRleENvdW50ID0gcE9iZEVudHlfcC0+bV91aUNvdW50OworCQkJQVNTRVJUKChwU3ViSW5kZXggIT0gTlVMTCkgJiYgKG5TdWJJbmRleENvdW50ID4gMCkpOwkvLyBzaG91bGQgbmV2ZXIgYmUgTlVMTAorCisJCQkvLyB3YWxrIHRocm91Z2ggc3ViaW5kZXggdGFibGUgdGlsbCBhbGwgc3ViaW5pY2VzIHdlcmUgcmVzdG9yZWQKKwkJCXdoaWxlIChuU3ViSW5kZXhDb3VudCAhPSAwKSB7CisJCQkJQWNjZXNzID0gKHRFcGxPYmRBY2Nlc3MpIHBTdWJJbmRleC0+bV9BY2Nlc3M7CisKKwkJCQkvLyBnZXQgcG9pbnRlciB0byBjdXJyZW50IGFuZCBkZWZhdWx0IGRhdGEKKwkJCQlwRGVmYXVsdCA9IEVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIocFN1YkluZGV4KTsKKwkJCQlwRHN0RGF0YSA9IEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIocFN1YkluZGV4KTsKKworCQkJCS8vIE5PVEUgKGZvciBrRXBsT2JkVHlwVlN0cmluZyk6CisJCQkJLy8gICAgICBUaGUgZnVuY3Rpb24gcmV0dXJuZXMgdGhlIG1heC4gbnVtYmVyIG9mIGJ5dGVzIGZvciBhCisJCQkJLy8gICAgICBjdXJyZW50IHN0cmluZy4KKwkJCQkvLyAgICAgIHIuZC46IEZvciBzdGluZ3MgdGhlIGRlZmF1bHQtc2l6ZSB3aWxsIGJlIHJlYWQgaW4gb3RoZXIgbGluZXMgZm9sbG93aW5nIChrRXBsT2JkRGlySW5pdCkuCisJCQkJT2JqU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkluZGV4KTsKKworCQkJCS8vIHN3aXRjaCBkaXJlY3Rpb24gb2YgT0QgYWNjZXNzCisJCQkJc3dpdGNoIChEaXJlY3Rpb25fcCkgeworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBWYXJFbnRyeSBzdHJ1Y3R1cmVzIGhhcyB0byBiZSBpbml0aWFsaXplZAorCQkJCWNhc2Uga0VwbE9iZERpckluaXQ6CisKKwkJCQkJLy8gSWYgVkFSLUZsYWcgaXMgc2V0LCBtX3BDdXJyZW50IG1lYW5zIG5vdCBhZGRyZXNzIG9mIGRhdGEKKwkJCQkJLy8gYnV0IGFkZHJlc3Mgb2YgdEVwbE9iZFZhckVudHJ5LiBBZGRyZXNzIG9mIGRhdGEgaGFzIHRvIGJlIGdldCBmcm9tCisJCQkJCS8vIHRoaXMgc3RydWN0dXJlLgorCQkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCQkJCUVwbE9iZEdldFZhckVudHJ5KHBTdWJJbmRleCwKKwkJCQkJCQkJICAmcFZhckVudHJ5KTsKKwkJCQkJCUVwbE9iZEluaXRWYXJFbnRyeShwVmFyRW50cnksCisJCQkJCQkJCSAgIHBTdWJJbmRleC0+CisJCQkJCQkJCSAgIG1fVHlwZSwKKwkJCQkJCQkJICAgT2JqU2l6ZSk7CisvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsT2JkSW5pdFZhckVudHJ5IChwU3ViSW5kZXgtPm1fcEN1cnJlbnQsIHBTdWJJbmRleC0+bV9UeXBlLCBPYmpTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsT2JkSW5pdFZhckVudHJ5ICgodEVwbE9iZFZhckVudHJ5IE1FTSopICgoKEJZVEUgTUVNKikgcFN1YkluZGV4LT5tX3BDdXJyZW50KSArIChzaXplb2YgKHRFcGxPYmRWYXJFbnRyeSkgKiBwU3ViSW5kZXgtPm1fdWlTdWJJbmRleCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YkluZGV4LT5tX1R5cGUsIE9ialNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyovCisJCQkJCQkvLyBhdCB0aGlzIHRpbWUgbm8gYXBwbGljYXRpb24gdmFyaWFibGUgaXMgZGVmaW5lZCAhISEKKwkJCQkJCS8vIHRoZXJlZm9yZSBkYXRhIGNhbiBub3QgYmUgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAocFN1YkluZGV4LT5tX1R5cGUgPT0KKwkJCQkJCSAgIGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCQkJCQkvLyBJZiBwb2ludGVyIG1fcEN1cnJlbnQgaXMgbm90IGVxdWFsIHRvIE5VTEwgdGhlbiB0aGUKKwkJCQkJCS8vIHN0cmluZyB3YXMgZGVmaW5lZCB3aXRoIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcuIFRoZSBjdXJyZW50CisJCQkJCQkvLyBwb2ludGVyIHBvaW50cyB0byBzdHJ1Y3QgdEVwbE9iZFZTdHJpbmcgbG9jYXRlZCBpbiBNRU0uCisJCQkJCQkvLyBUaGUgZWxlbWVudCBzaXplIGluY2x1ZGVzIHRoZSBtYXguIG51bWJlciBvZgorCQkJCQkJLy8gYnl0ZXMuIFRoZSBlbGVtZW50IG1fcFN0cmluZyBpbmNsdWRlcyB0aGUgcG9pbnRlcgorCQkJCQkJLy8gdG8gc3RyaW5nIGluIE1FTS4gVGhlIG1lbW9yeSBsb2NhdGlvbiBvZiBkZWZhdWx0IHN0cmluZworCQkJCQkJLy8gbXVzdCBiZSBjb3BpZWQgdG8gbWVtb3J5IGxvY2F0aW9uIG9mIGN1cnJlbnQgc3RyaW5nLgorCisJCQkJCQlwRHN0RGF0YSA9CisJCQkJCQkgICAgcFN1YkluZGV4LT5tX3BDdXJyZW50OworCQkJCQkJaWYgKHBEc3REYXRhICE9IE5VTEwpIHsKKwkJCQkJCQkvLyAwOC1kZWMtMjAwNDogY29kZSBvcHRpbWl6YXRpb24gISEhCisJCQkJCQkJLy8gICAgICAgICAgICAgIGVudHJpZXMgKCh0RXBsT2JkVlN0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX3BTdHJpbmcKKwkJCQkJCQkvLyAgICAgICAgICAgICAgYW5kICgodEVwbE9iZFZTdHJpbmdEZWYgUk9NKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9TaXplIHdlcmUgcmVhZAorCQkJCQkJCS8vICAgICAgICAgICAgICB0d2ljZS4gdGhhdHMgbm90IG5lY2Vzc2FyeSEKKworCQkJCQkJCS8vIEZvciBjb3B5aW5nIGRhdGEgd2UgaGF2ZSB0byBzZXQgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgdG8gdGhlIHJlYWwgUkFNIHN0cmluZy4gVGhpcworCQkJCQkJCS8vIHBvaW50ZXIgdG8gUkFNIHN0cmluZyBpcyBsb2NhdGVkIGluIGRlZmF1bHQgc3RyaW5nIGluZm8gc3RydWN0dXJlLiAodHJhbnNsYXRlZCByLmQuKQorCQkJCQkJCXBEc3REYXRhID0KKwkJCQkJCQkgICAgKHZvaWQgTUVNCisJCQkJCQkJICAgICAqKSgodEVwbE9iZFZTdHJpbmdEZWYgUk9NICopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZzsKKwkJCQkJCQlPYmpTaXplID0KKwkJCQkJCQkgICAgKCh0RXBsT2JkVlN0cmluZ0RlZgorCQkJCQkJCSAgICAgIFJPTSAqKSBwU3ViSW5kZXgtPgorCQkJCQkJCSAgICAgbV9wRGVmYXVsdCktPgorCQkJCQkJCSAgICBtX1NpemU7CisKKwkJCQkJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKQorCQkJCQkJCSBwU3ViSW5kZXgtPgorCQkJCQkJCSBtX3BDdXJyZW50KS0+CisJCQkJICAgICBtX3BTdHJpbmcgPSBwRHN0RGF0YTsKKwkJCQkJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKQorCQkJCQkJCSBwU3ViSW5kZXgtPgorCQkJCQkJCSBtX3BDdXJyZW50KS0+bV9TaXplID0KKwkJCQkgICAgIE9ialNpemU7CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIGlmIChwU3ViSW5kZXgtPm1fVHlwZSA9PQorCQkJCQkJICAga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCQkJCXBEc3REYXRhID0KKwkJCQkJCSAgICBwU3ViSW5kZXgtPm1fcEN1cnJlbnQ7CisJCQkJCQlpZiAocERzdERhdGEgIT0gTlVMTCkgeworCQkJCQkJCS8vIDA4LWRlYy0yMDA0OiBjb2RlIG9wdGltaXphdGlvbiAhISEKKwkJCQkJCQkvLyAgICAgICAgICAgICAgZW50cmllcyAoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZworCQkJCQkJCS8vICAgICAgICAgICAgICBhbmQgKCh0RXBsT2JkT1N0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX1NpemUgd2VyZSByZWFkCisJCQkJCQkJLy8gICAgICAgICAgICAgIHR3aWNlLiB0aGF0cyBub3QgbmVjZXNzYXJ5IQorCisJCQkJCQkJLy8gRm9yIGNvcHlpbmcgZGF0YSB3ZSBoYXZlIHRvIHNldCB0aGUgZGVzdGluYXRpb24gcG9pbnRlciB0byB0aGUgcmVhbCBSQU0gc3RyaW5nLiBUaGlzCisJCQkJCQkJLy8gcG9pbnRlciB0byBSQU0gc3RyaW5nIGlzIGxvY2F0ZWQgaW4gZGVmYXVsdCBzdHJpbmcgaW5mbyBzdHJ1Y3R1cmUuICh0cmFuc2xhdGVkIHIuZC4pCisJCQkJCQkJcERzdERhdGEgPQorCQkJCQkJCSAgICAodm9pZCBNRU0KKwkJCQkJCQkgICAgICopKCh0RXBsT2JkT1N0cmluZ0RlZiBST00gKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nOworCQkJCQkJCU9ialNpemUgPQorCQkJCQkJCSAgICAoKHRFcGxPYmRPU3RyaW5nRGVmCisJCQkJCQkJICAgICAgUk9NICopIHBTdWJJbmRleC0+CisJCQkJCQkJICAgICBtX3BEZWZhdWx0KS0+CisJCQkJCQkJICAgIG1fU2l6ZTsKKworCQkJCQkJCSgodEVwbE9iZE9TdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT4KKwkJCQkgICAgIG1fcFN0cmluZyA9IHBEc3REYXRhOworCQkJCQkJCSgodEVwbE9iZE9TdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT5tX1NpemUgPQorCQkJCSAgICAgT2JqU2l6ZTsKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQkJLy8gbm8gYnJlYWsgISEgYmVjYXVzZSBjb3B5IG9mIGRhdGEgaGFzIHRvIGRvbmUgdG9vLgorCisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIGFsbCBvYmplY3RzIGhhcyB0byBiZSByZXN0b3JlZCB3aXRoIGRlZmF1bHQgdmFsdWVzCisJCQkJY2FzZSBrRXBsT2JkRGlyUmVzdG9yZToKKworCQkJCQkvLyAwOS1kZWMtMjAwNCByLmQuOiBvcHRpbWl6YXRpb24hIHRoZSBzYW1lIGNvZGUgZm9yIGtFcGxPYmREaXJSZXN0b3JlIGFuZCBrRXBsT2JkRGlyTG9hZAorCQkJCQkvLyAgICAgICAgICAgICAgICAgICBpcyByZXBsYWNlZCB0byBmdW5jdGlvbiBPYmRDb3B5T2JqZWN0RGF0YSgpIHdpdGggYSBuZXcgcGFyYW1ldGVyLgorCisJCQkJCS8vIHJlc3RvcmUgb2JqZWN0IGRhdGEgZm9yIGluaXQgcGhhc2UKKwkJCQkJRXBsT2JkQ29weU9iamVjdERhdGEocERzdERhdGEsIHBEZWZhdWx0LAorCQkJCQkJCSAgICAgT2JqU2l6ZSwKKwkJCQkJCQkgICAgIHBTdWJJbmRleC0+bV9UeXBlKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gb2JqZWN0cyB3aXRoIGF0dHJpYnV0ZSBrRXBsT2JkQWNjU3RvcmUgaGFzIHRvIGJlIGxvYWQgZnJvbSBFRVBST00gb3IgZnJvbSBhIGZpbGUKKwkJCQljYXNlIGtFcGxPYmREaXJMb2FkOgorCisJCQkJCS8vIHJlc3RvcmUgb2JqZWN0IGRhdGEgZm9yIGluaXQgcGhhc2UKKwkJCQkJRXBsT2JkQ29weU9iamVjdERhdGEocERzdERhdGEsIHBEZWZhdWx0LAorCQkJCQkJCSAgICAgT2JqU2l6ZSwKKwkJCQkJCQkgICAgIHBTdWJJbmRleC0+bV9UeXBlKTsKKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgdG9vLgorCisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIG9iamVjdHMgd2l0aCBhdHRyaWJ1dGUga0VwbE9iZEFjY1N0b3JlIGhhcyB0byBiZSBzdG9yZWQgaW4gRUVQUk9NIG9yIGluIGEgZmlsZQorCQkJCWNhc2Uga0VwbE9iZERpclN0b3JlOgorCisJCQkJCS8vIHdoZW4gYXR0cmlidXRlIGtFcGxPYmRBY2NTdG9yZSBpcyBzZXQsIHRoZW4gY2FsbCBjYWxsYmFjayBmdW5jdGlvbgorI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCQkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NTdG9yZSkgIT0gMCkgeworCQkJCQkJLy8gZmlsbCBvdXQgZGF0YSBwb2ludGVyIGFuZCBzaXplIG9mIGRhdGEKKwkJCQkJCUNiU3RvcmUubV9wRGF0YSA9IHBEc3REYXRhOworCQkJCQkJQ2JTdG9yZS5tX09ialNpemUgPSBPYmpTaXplOworCisJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZWFkIG9yIHdyaXRlIG9iamVjdAorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBPYmRDYWxsU3RvcmVDYWxsYmFjaworCQkJCQkJICAgIChFUExfTUNPX0lOU1RBTkNFX1BUUl8gJgorCQkJCQkJICAgICBDYlN0b3JlKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gaWYgT0QgQnVpbGRlciBrZXkgaGFzIHRvIGJlIGNoZWNrZWQgbm8gYWNjZXNzIHRvIHN1YmluZGV4IGFuZCBkYXRhIHNob3VsZCBiZSBtYWRlCisJCQkJY2FzZSBrRXBsT2JkRGlyT0JLQ2hlY2s6CisKKwkJCQkJLy8gbm8gYnJlYWsgISEgYmVjYXVzZSB3ZSB3YW50IHRvIGJyZWFrIHRoZSBzZWNvbmQgbG9vcCB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gdW5rbm93biBEaXJlY3Rpb24KKwkJCQlkZWZhdWx0OgorCisJCQkJCS8vIHNvIHdlIGNhbiBicmVhayB0aGUgc2Vjb25kIGxvb3AgZWFybGVyCisJCQkJCW5TdWJJbmRleENvdW50ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJblN1YkluZGV4Q291bnQtLTsKKworCQkJCS8vIG5leHQgc3ViaW5kZXggZW50cnkKKwkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgPT0gMCkgeworCQkJCQlwU3ViSW5kZXgrKzsKKwkJCQkJaWYgKChuU3ViSW5kZXhDb3VudCA+IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKChwU3ViSW5kZXgtPgorCQkJCQkgICAgICBtX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0KKwkJCQkJICAgICAwKSkgeworCQkJCQkJLy8gbmV4dCBzdWJpbmRleCBwb2ludHMgdG8gYW4gYXJyYXkKKwkJCQkJCS8vIHJlc2V0IHN1YmluZGV4IG51bWJlcgorCQkJCQkJcFN1YkluZGV4LT5tX3VpU3ViSW5kZXggPSAxOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG5TdWJJbmRleENvdW50ID4gMCkgeworCQkJCQkJLy8gbmV4dCBzdWJpbmRleCBwb2ludHMgdG8gYW4gYXJyYXkKKwkJCQkJCS8vIGluY3JlbWVudCBzdWJpbmRleCBudW1iZXIKKwkJCQkJCXBTdWJJbmRleC0+bV91aVN1YkluZGV4Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIG5leHQgaW5kZXggZW50cnkKKwkJCXBPYmRFbnR5X3ArKzsKKwkJfQorCX0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNvbW1hbmQgb2YgbGFzdCBhY3Rpb24gZGVwZW5kcyBvbiBkaXJlY3Rpb24gdG8gYWNjZXNzCisJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJPQktDaGVjaykgeworCisJCWdvdG8gRXhpdDsKKwl9CisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJZWxzZSB7CisJCWlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyTG9hZCkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xvc2VSZWFkOworCQl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJTdG9yZSkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xvc2VXcml0ZTsKKwkJfSBlbHNlIGlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyUmVzdG9yZSkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xlYXI7CisJCX0gZWxzZSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsYXN0IGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisvLyAgICBnb3RvIEV4aXQ7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDb3B5T2JqZWN0RGF0YSgpCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBwb2ludGVycyB0byBvYmplY3QgZGF0YSBhbmQgY29weSB0aGVtIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisvLworLy8gUGFyYW1ldGVyczogIHBEc3REYXRhX3AgICAgICAgICAgICAgID0gZGVzdGluYXRpb24gcG9pbnRlcgorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICAgICAgICAgID0gc291cmNlIHBvaW50ZXIKKy8vICAgICAgICAgICAgICBPYmpTaXplX3AgICAgICAgICAgICAgICA9IHNpemUgb2Ygb2JqZWN0CisvLyAgICAgICAgICAgICAgT2JqVHlwZV9wICAgICAgICAgICAgICAgPQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsT2JkQ29weU9iamVjdERhdGEodm9pZCBNRU0gKiBwRHN0RGF0YV9wLAorCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCSB0RXBsT2JkU2l6ZSBPYmpTaXplX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCkKK3sKKworCXRFcGxPYmRTaXplIFN0clNpemUgPSAwOworCisJLy8gaXQgaXMgYWxsb3dlZCB0byBzZXQgZGVmYXVsdCBhbmQgY3VycmVudCBhZGRyZXNzIHRvIE5VTEwgKG5vdGhpbmcgdG8gY29weSkKKwlpZiAocERzdERhdGFfcCAhPSBOVUxMKSB7CisKKwkJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJLy8gVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHJlYWxseSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiBzdHJpbmcuIFRoZQorCQkJLy8gb2JqZWN0IGVudHJ5IHNpemUgY2FuIGJlIGJpZ2dlciBhcyBzdHJpbmcgc2l6ZSBvZiBkZWZhdWx0IHN0cmluZy4KKwkJCS8vIFRoZSAnXDAnLXRlcm1pbmF0aW9uIGlzIGluY2x1ZGVkLiBBIHN0cmluZyB3aXRoIG5vIGNoYXJhY3RlcnMgaGFzIGEKKwkJCS8vIHNpemUgb2YgMS4KKwkJCVN0clNpemUgPQorCQkJICAgIEVwbE9iZEdldFN0ckxlbigodm9pZCAqKXBTcmNEYXRhX3AsIE9ialNpemVfcCwKKwkJCQkJICAgIGtFcGxPYmRUeXBWU3RyaW5nKTsKKworCQkJLy8gSWYgdGhlIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBlbnRyeSBzaXplIGluIE9EIHRoZW4gb25seSBjb3B5CisJCQkvLyBlbnRyeSBzaXplIC0gMSBhbmQgYWx3YXlzIHNldCB0aGUgJ1wwJy10ZXJtaW5hdGlvbi4KKwkJCWlmIChTdHJTaXplID49IE9ialNpemVfcCkgeworCQkJCVN0clNpemUgPSBPYmpTaXplX3AgLSAxOworCQkJfQorCQl9CisKKwkJaWYgKHBTcmNEYXRhX3AgIT0gTlVMTCkgeworCQkJLy8gY29weSBkYXRhCisJCQlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhX3AsIE9ialNpemVfcCk7CisKKwkJCWlmIChPYmpUeXBlX3AgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCQkoKGNoYXIgTUVNICopcERzdERhdGFfcClbU3RyU2l6ZV0gPSAnXDAnOworCQkJfQorCQl9CisJfQorCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hlY2tzIGlmIGEgZW50cnkgaXMgbnVtZXJpY2FsIG9yIG5vdAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgID0gSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgICAgID0gU3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwZkVudHJ5TnVtZXJpY2FsX3AgID0gcG9pbnRlciB0byBCT09MIGZvciByZXR1cm52YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gVFJVRSBpZiBlbnRyeSBhIG51bWVyaWNhbCB2YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gRkFMU0UgaWYgZW50cnkgbm90IGEgbnVtZXJpY2FsIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeV9wLAorCQkJCQkgIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBUeXBlCisJaWYgKChwT2JkU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQorCSAgICB8fCAocE9iZFN1YkVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykKKwkgICAgfHwgKHBPYmRTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikpIHsJLy8gbm90IG51bWVyaWNhbCB0eXBlcworCQkqcGZFbnRyeU51bWVyaWNhbF9wID0gRkFMU0U7CisJfSBlbHNlIHsJCS8vIG51bWVyaWNhbCB0eXBlcworCQkqcGZFbnRyeU51bWVyaWNhbF9wID0gVFJVRTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHRvIGNsYXNzaWZ5IG9iamVjdCB0eXBlIChmaXhlZC9ub24gZml4ZWQpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjaygpCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBhZGRyZXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBjYWxsZXMgaXQgd2hlbiB1bmVxdWFsCisvLyAgICAgICAgICAgICAgdG8gTlVMTAorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IChpbnN0YW5jZSBwb2ludGVyKQorLy8gICAgICAgICAgICAgIHBDYlN0b3JlUGFyYW1fcCAgICAgICAgPSBhZGRyZXNzIHRvIGNhbGxiYWNrIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkgIHBDYlN0b3JlUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlBU1NFUlQocENiU3RvcmVQYXJhbV9wICE9IE5VTEwpOworCisJLy8gY2hlY2sgaWYgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMIC0gaWYgc28sIG5vIGNhbGxiYWNrIHNob3VsZCBiZSBjYWxsZWQKKwlpZiAoRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgIT0gTlVMTCkgeworCQlSZXQgPQorCQkgICAgRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykKKwkJICAgIChFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKQorCQkgICAgIHBDYlN0b3JlUGFyYW1fcCk7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgcG9pbnRlciBvZiBhbiBvYmplY3QuCisvLyAgICAgICAgICAgICAgSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AgPSBwb2ludGVyIHRvIHN1YmluZGV4IGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICpFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wKQoreworCisJdm9pZCAqcERhdGE7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisKKwlBU1NFUlRNU0cocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKCk6IHBvaW50ZXIgdG8gU3ViRW50cnkgbm90IHZhbGlkIVxuIik7CisKKwkvLyB0aGVyZSBhcmUgYXJlIHNvbWUgb2JqZWN0cyB3aG9zZSBkYXRhIHBvaW50ZXIgaGFzIHRvIGdldCBmcm9tIG90aGVyIHN0cnVjdHVyZQorCS8vIGdldCBhY2Nlc3MgdHlwZSBmb3IgdGhpcyBvYmplY3QKKwlBY2Nlc3MgPSBwU3ViaW5kZXhFbnRyeV9wLT5tX0FjY2VzczsKKworCS8vIElmIG9iamVjdCBoYXMgYWNjZXNzIHR5cGUgPSBjb25zdCwKKwkvLyBmb3IgZGF0YSBvbmx5IGV4aXN0cyBkZWZhdWx0IHZhbHVlcy4KKwlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NDb25zdCkgIT0gMCkgeworCQkvLyBUaGUgcG9pbnRlciB0byBkZWZ1YWx0IHZhbHVlIGNhbiBiZSByZWNlaXZlZCBmcm9tIE9iZEdldE9iamVjdERlZmF1bHRQdHIoKQorCQlwRGF0YSA9ICgodm9pZCAqKUVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIocFN1YmluZGV4RW50cnlfcCkpOworCX0gZWxzZSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGN1cnJlbnQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gT2JkR2V0T2JqZWN0Q3VycmVudFB0cigpCisJCXBEYXRhID0gKCh2b2lkICopRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViaW5kZXhFbnRyeV9wKSk7CisJfQorCisJcmV0dXJuIHBEYXRhOworCit9CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Y2MxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5oCkBAIC0wLDAgKzEsNDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBhcGkgZnVuY3Rpb24gb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWQzcKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzAyIGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorCisjaWZuZGVmIF9FUExPQkRfSF8KKyNkZWZpbmUgX0VQTE9CRF9IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgRVBMX09CRF9UQUJMRV9JTkRFWF9FTkQgICAgIDB4RkZGRgorCisvLyBmb3IgdGhlIHVzYWdlIG9mIEJPT0xFQU4gaW4gT0QKKyNkZWZpbmUgT0JEX1RSVUUgICAgMHgwMQorI2RlZmluZSBPQkRfRkFMU0UgICAweDAwCisKKy8vIGRlZmF1bHQgT0QgaW5kZXggZm9yIE5vZGUgaWQKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX0lOREVYICAgICAgICAgICAgICAgMHgxRjkzCisvLyBkZWZhdWx0IHN1YmluZGV4IGZvciBOb2RlSWQgaW4gT0QKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX1NVQklOREVYICAgICAgICAgICAgMHgwMQorLy8gZGVmYXVsdCBzdWJpbmRleCBmb3IgTm9kZUlEQnlIV19CT09MCisjZGVmaW5lIEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVggICAgIDB4MDIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW51bXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gZGlyZWN0aW9ucyBmb3IgYWNjZXNzIHRvIG9iamVjdCBkaWN0aW9uYXJ5Cit0eXBlZGVmIGVudW0geworCWtFcGxPYmREaXJJbml0ID0gMHgwMCwJLy8gaW5pdGlhbGlzaW5nIGFmdGVyIHBvd2VyIG9uCisJa0VwbE9iZERpclN0b3JlID0gMHgwMSwJLy8gc3RvcmUgYWxsIG9iamVjdCB2YWx1ZXMgdG8gbm9uIHZvbGF0aWxlIG1lbW9yeQorCWtFcGxPYmREaXJMb2FkID0gMHgwMiwJLy8gbG9hZCBhbGwgb2JqZWN0IHZhbHVlcyBmcm9tIG5vbiB2b2xhdGlsZSBtZW1vcnkKKwlrRXBsT2JkRGlyUmVzdG9yZSA9IDB4MDMsCS8vIGRlbGV0ZXMgbm9uIHZvbGF0aWxlIG1lbW9yeSAocmVzdG9yZSkKKwlrRXBsT2JkRGlyT0JLQ2hlY2sgPSAweEZGCS8vIHJlc2VydmVkCit9IHRFcGxPYmREaXI7CisKKy8vIGNvbW1hbmRzIGZvciBzdG9yZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsT2JkQ29tbU5vdGhpbmcgPSAweDAwLAorCWtFcGxPYmRDb21tT3BlbldyaXRlID0gMHgwMSwKKwlrRXBsT2JkQ29tbVdyaXRlT2JqID0gMHgwMiwKKwlrRXBsT2JkQ29tbUNsb3NlV3JpdGUgPSAweDAzLAorCWtFcGxPYmRDb21tT3BlblJlYWQgPSAweDA0LAorCWtFcGxPYmRDb21tUmVhZE9iaiA9IDB4MDUsCisJa0VwbE9iZENvbW1DbG9zZVJlYWQgPSAweDA2LAorCWtFcGxPYmRDb21tQ2xlYXIgPSAweDA3LAorCWtFcGxPYmRDb21tVW5rbm93biA9IDB4RkYKK30gdEVwbE9iZENvbW1hbmQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGV2ZW50cyBvZiBvYmplY3QgY2FsbGJhY2sgZnVuY3Rpb24KK3R5cGVkZWYgZW51bSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFyZyBwb2ludHMgdG8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWtFcGxPYmRFdkNoZWNrRXhpc3QgPSAweDA2LAkvLyBjaGVja2luZyBpZiBvYmplY3QgZG9lcyBleGlzdCAocmVhZGluZyBhbmQgd3JpdGluZykgICAgTlVMTAorCWtFcGxPYmRFdlByZVJlYWQgPSAweDAwLAkvLyBiZWZvcmUgcmVhZGluZyBhbiBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGRhdGEgYnVmZmVyIGluIE9ECisJa0VwbE9iZEV2UG9zdFJlYWQgPSAweDAxLAkvLyBhZnRlciByZWFkaW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gZGF0YSBidWZmZXIgZnJvbSBjYWxsZXIKKwlrRXBsT2JkRXZXclN0cmluZ0RvbWFpbiA9IDB4MDcsCS8vIGV2ZW50IGZvciBjaGFuZ2luZyBzdHJpbmcvZG9tYWluIGRhdGEgcG9pbnRlciBvciBzaXplICBzdHJ1Y3QgdEVwbE9iZFZTdHJpbmdEb21haW4gaW4gUkFNCisJa0VwbE9iZEV2SW5pdFdyaXRlID0gMHgwNCwJLy8gaW5pdGlhbGl6ZXMgd3JpdGluZyBhbiBvYmplY3QgKGNoZWNraW5nIG9iamVjdCBzaXplKSAgIHNpemUgb2Ygb2JqZWN0IGluIE9EICh0RXBsT2JkU2l6ZSkKKwlrRXBsT2JkRXZQcmVXcml0ZSA9IDB4MDIsCS8vIGJlZm9yZSB3cml0aW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZGF0YSBidWZmZXIgZnJvbSBjYWxsZXIKKwlrRXBsT2JkRXZQb3N0V3JpdGUgPSAweDAzLAkvLyBhZnRlciB3cml0aW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gZGF0YSBidWZmZXIgaW4gT0QKKy8vICAgIGtFcGxPYmRFdkFib3J0U2RvICAgICAgICAgICAgICA9IDB4MDUgICAgIC8vIGFmdGVyIGFuIGFib3J0IG9mIGFuIFNETyB0cmFuc2ZlcgorCit9IHRFcGxPYmRFdmVudDsKKworLy8gcGFydCBvZiBPRCAoYml0IG9yaWVudGVkKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZFBhcnQ7CisKKyNkZWZpbmUga0VwbE9iZFBhcnRObyAgICAgICAgICAweDAwCS8vIG5vdGhpbmcKKyNkZWZpbmUga0VwbE9iZFBhcnRHZW4gICAgICAgICAweDAxCS8vICBwYXJ0ICAgICAgKDB4MTAwMCAtIDB4MUZGRikKKyNkZWZpbmUga0VwbE9iZFBhcnRNYW4gICAgICAgICAweDAyCS8vIG1hbnVmYWN0dXJlciBwYXJ0ICgweDIwMDAgLSAweDVGRkYpCisjZGVmaW5lIGtFcGxPYmRQYXJ0RGV2ICAgICAgICAgMHgwNAkvLyBkZXZpY2UgcGFydCAgICAgICAoMHg2MDAwIC0gMHg5RkZGKQorI2RlZmluZSBrRXBsT2JkUGFydFVzciAgICAgICAgIDB4MDgJLy8gZHluYW1pYyBwYXJ0IGUuZy4gZm9yIElDRTYxMTMxLTMKKworLy8gY29tYmluYXRpb25zCisjZGVmaW5lIGtFcGxPYmRQYXJ0QXBwICAgICAgICAgKCAgICAgICAgICAgICAga0VwbE9iZFBhcnRNYW4gfCBrRXBsT2JkUGFydERldiB8IGtFcGxPYmRQYXJ0VXNyKQkvLyBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBwYXJ0ICgweDIwMDAgLSAweDlGRkYpIGFuZCB1c2VyIE9ECisjZGVmaW5lIGtFcGxPYmRQYXJ0QWxsICAgICAgICAgKGtFcGxPYmRQYXJ0R2VuIHwga0VwbE9iZFBhcnRNYW4gfCBrRXBsT2JkUGFydERldiB8IGtFcGxPYmRQYXJ0VXNyKQkvLyB3aG9sZSBPRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhY2Nlc3MgdHlwZXMgZm9yIG9iamVjdHMKKy8vIG11c3QgYmUgYSBkaWZpbmUgYmVjYXVzZSBiaXQtZmxhZ3MKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxPYmRBY2Nlc3M7CisKKyNkZWZpbmUga0VwbE9iZEFjY1JlYWQgICAgICAgICAweDAxCS8vIG9iamVjdCBjYW4gYmUgcmVhZAorI2RlZmluZSBrRXBsT2JkQWNjV3JpdGUgICAgICAgIDB4MDIJLy8gb2JqZWN0IGNhbiBiZSB3cml0dGVuCisjZGVmaW5lIGtFcGxPYmRBY2NDb25zdCAgICAgICAgMHgwNAkvLyBvYmplY3QgY29udGFpbnMgYSBjb25zdGFudCB2YWx1ZQorI2RlZmluZSBrRXBsT2JkQWNjUGRvICAgICAgICAgIDB4MDgJLy8gb2JqZWN0IGNhbiBiZSBtYXBwZWQgaW4gYSBQRE8KKyNkZWZpbmUga0VwbE9iZEFjY0FycmF5ICAgICAgICAweDEwCS8vIG9iamVjdCBjb250YWlucyBhbiBhcnJheSBvZiBudW1lcmljYWwgdmFsdWVzCisjZGVmaW5lIGtFcGxPYmRBY2NSYW5nZSAgICAgICAgMHgyMAkvLyBvYmplY3QgY29udGFpbnMgbG93ZXIgYW5kIHVwcGVyIGxpbWl0CisjZGVmaW5lIGtFcGxPYmRBY2NWYXIgICAgICAgICAgMHg0MAkvLyBvYmplY3QgZGF0YSBpcyBwbGFjZWQgaW4gYXBwbGljYXRpb24KKyNkZWZpbmUga0VwbE9iZEFjY1N0b3JlICAgICAgICAweDgwCS8vIG9iamVjdCBkYXRhIGNhbiBiZSBzdG9yZWQgdG8gbm9uIHZvbGF0aWxlIG1lbW9yeQorCisvLyBjb21iaW5hdGlvbnMgKG5vdCBhbGwgY29tYmluYXRpb25zIGFyZSByZXF1aXJlZCkKKyNkZWZpbmUga0VwbE9iZEFjY1IgICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1cgICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1JXICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0NSICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCBrRXBsT2JkQWNjQ29uc3QgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0dSICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0dXICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY0dSVyAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZSICAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZXICAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZSVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQUiAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQUlcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUiAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUlcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFIgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFJXICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NSICAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NXICAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NSVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NDUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCBrRXBsT2JkQWNjQ29uc3QgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NHUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NHVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NHUlcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUlcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFIgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFJXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1IgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1cgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1JXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BSICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BSVyAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZFNpemU7CS8vIEZvciBhbGwgb2JqZWN0cyBhcyBvYmplY3RzIHNpemUgYXJlIHVzZWQgYW4gdW5zaWduZWQgaW50LgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcyBmb3IgZGF0YSB0eXBlcyBkZWZpbmVkIGluIERTMzAxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGVzIG9mIG9iamVjdHMgaW4gb2JqZWN0IGRpY3Rpb25hcnkKKy8vIERTLTMwMSBkZWZpbmVzIHRoZXNlIHR5cGVzIGFzIFdPUkQKK3R5cGVkZWYgZW51bSB7CisvLyB0eXBlcyB3aGljaCBhcmUgYWx3YXlzIHN1cHBvcnRlZAorCWtFcGxPYmRUeXBCb29sID0gMHgwMDAxLAorCisJa0VwbE9iZFR5cEludDggPSAweDAwMDIsCisJa0VwbE9iZFR5cEludDE2ID0gMHgwMDAzLAorCWtFcGxPYmRUeXBJbnQzMiA9IDB4MDAwNCwKKwlrRXBsT2JkVHlwVUludDggPSAweDAwMDUsCisJa0VwbE9iZFR5cFVJbnQxNiA9IDB4MDAwNiwKKwlrRXBsT2JkVHlwVUludDMyID0gMHgwMDA3LAorCWtFcGxPYmRUeXBSZWFsMzIgPSAweDAwMDgsCisJa0VwbE9iZFR5cFZTdHJpbmcgPSAweDAwMDksCisJa0VwbE9iZFR5cE9TdHJpbmcgPSAweDAwMEEsCisJa0VwbE9iZFR5cERvbWFpbiA9IDB4MDAwRiwKKworCWtFcGxPYmRUeXBJbnQyNCA9IDB4MDAxMCwKKwlrRXBsT2JkVHlwVUludDI0ID0gMHgwMDE2LAorCisJa0VwbE9iZFR5cFJlYWw2NCA9IDB4MDAxMSwKKwlrRXBsT2JkVHlwSW50NDAgPSAweDAwMTIsCisJa0VwbE9iZFR5cEludDQ4ID0gMHgwMDEzLAorCWtFcGxPYmRUeXBJbnQ1NiA9IDB4MDAxNCwKKwlrRXBsT2JkVHlwSW50NjQgPSAweDAwMTUsCisJa0VwbE9iZFR5cFVJbnQ0MCA9IDB4MDAxOCwKKwlrRXBsT2JkVHlwVUludDQ4ID0gMHgwMDE5LAorCWtFcGxPYmRUeXBVSW50NTYgPSAweDAwMUEsCisJa0VwbE9iZFR5cFVJbnQ2NCA9IDB4MDAxQiwKKwlrRXBsT2JkVHlwVGltZU9mRGF5ID0gMHgwMDBDLAorCWtFcGxPYmRUeXBUaW1lRGlmZiA9IDB4MDAwRAorfSB0RXBsT2JkVHlwZTsKKy8vIG90aGVyIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcyBmb3IgZGF0YSB0eXBlcyBkZWZpbmVkIGluIERTMzAxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkQm9vbGVhbjsJLy8gMDAwMQordHlwZWRlZiBzaWduZWQgY2hhciB0RXBsT2JkSW50ZWdlcjg7CS8vIDAwMDIKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCB0RXBsT2JkSW50ZWdlcjE2OwkvLyAwMDAzCit0eXBlZGVmIHNpZ25lZCBsb25nIHRFcGxPYmRJbnRlZ2VyMzI7CS8vIDAwMDQKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkVW5zaWduZWQ4OwkvLyAwMDA1Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB0RXBsT2JkVW5zaWduZWQxNjsJLy8gMDAwNgordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRFcGxPYmRVbnNpZ25lZDMyOwkvLyAwMDA3Cit0eXBlZGVmIGZsb2F0IHRFcGxPYmRSZWFsMzI7CS8vIDAwMDgKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkRG9tYWluOwkvLyAwMDBGCit0eXBlZGVmIHNpZ25lZCBsb25nIHRFcGxPYmRJbnRlZ2VyMjQ7CS8vIDAwMTAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0RXBsT2JkVW5zaWduZWQyNDsJLy8gMDAxNgorCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjQwOwkvLyAwMDEyCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjQ4OwkvLyAwMDEzCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjU2OwkvLyAwMDE0Cit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjY0OwkvLyAwMDE1CisKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNDA7CS8vIDAwMTgKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNDg7CS8vIDAwMTkKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNTY7CS8vIDAwMUEKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNjQ7CS8vIDAwMUIKKwordHlwZWRlZiBkb3VibGUgdEVwbE9iZFJlYWw2NDsJLy8gMDAxMQorCit0eXBlZGVmIHRUaW1lT2ZEYXkgdEVwbE9iZFRpbWVPZkRheTsJLy8gMDAwQwordHlwZWRlZiB0VGltZU9mRGF5IHRFcGxPYmRUaW1lRGlmZmVyZW5jZTsJLy8gMDAwRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciBmb3IgZGVmaW5pbmcgYSB2YXJpYWJsZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBlbnVtIHsKKwlrVmFyVmFsaWRTaXplID0gMHgwMSwKKwlrVmFyVmFsaWREYXRhID0gMHgwMiwKKy8vICAgIGtWYXJWYWxpZENhbGxiYWNrICAgICAgID0gMHgwNCwKKy8vICAgIGtWYXJWYWxpZEFyZyAgICAgICAgICAgID0gMHgwOCwKKworCWtWYXJWYWxpZEFsbCA9IDB4MDMJLy8gY3VycmVudGx5IG9ubHkgc2l6ZSBhbmQgZGF0YSBhcmUgaW1wbGVtZW50ZWQgYW5kIHVzZWQKK30gdEVwbFZhclBhcmFtVmFsaWQ7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbFZhckNhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJICB2b2lkICpwUGFyYW1fcCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVmFyUGFyYW1WYWxpZCBtX1ZhbGlkRmxhZzsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdEVwbE9iZFNpemUgbV9TaXplOworCXZvaWQgTUVNICptX3BEYXRhOworLy8gICAgdEVwbFZhckNhbGxiYWNrICAgICBtX2ZwQ2FsbGJhY2s7CisvLyAgICB2b2lkICogICAgICAgbV9wQXJnOworCit9IHRFcGxWYXJQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgTUVNICptX3BEYXRhOworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICAgICAgdEVwbFZhckNhbGxiYWNrICAgIG1fZnBDYWxsYmFjazsKKyAgICAgICAgdm9pZCAqICAgbV9wQXJnOworICAgICNlbmRpZgorKi8KK30gdEVwbE9iZFZhckVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCUJZVEUgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkT1N0cmluZzsJCS8vIDAwMEMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKwljaGFyICptX3BTdHJpbmc7Cit9IHRFcGxPYmRWU3RyaW5nOwkJLy8gMDAwRAorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCWNoYXIgKm1fcERlZlN0cmluZzsJLy8gJCQkIGQuay4gaXQgaXMgdW51c2VkLCBzbyB3ZSBjb3VsZCBkZWxldGUgaXQKKwljaGFyICptX3BTdHJpbmc7CisKK30gdEVwbE9iZFZTdHJpbmdEZWY7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJQllURSAqbV9wRGVmU3RyaW5nOwkvLyAkJCQgZC5rLiBpdCBpcyB1bnVzZWQsIHNvIHdlIGNvdWxkIGRlbGV0ZSBpdAorCUJZVEUgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkT1N0cmluZ0RlZjsKKworLy9yLmQuIHBhcmFtZXRlciBzdHJ1Y3QgZm9yIGNoYW5naW5nIG9iamVjdCBzaXplIGFuZC9vciBwb2ludGVyIHRvIGRhdGEgb2YgU3RyaW5ncyBvciBEb21haW5zCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9Eb3dubG9hZFNpemU7CS8vIGRvd25sb2FkIHNpemUgZnJvbSBTRE8gb3IgQVBQCisJdEVwbE9iZFNpemUgbV9PYmpTaXplOwkvLyBjdXJyZW50IG9iamVjdCBzaXplIGZyb20gT0QgLSBzaG91bGQgYmUgY2hhbmdlZCBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uCisJdm9pZCAqbV9wRGF0YTsJCS8vIGN1cnJlbnQgb2JqZWN0IHB0ciAgZnJvbSBPRCAtIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24KKworfSB0RXBsT2JkVlN0cmluZ0RvbWFpbjsJCS8vIDAwMEQKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHlwZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN1YmluZGV4c3RydWN0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENoYW5nZSBub3QgdGhlIG9yZGVyIGZvciB0aGlzIHN0cnVjdCEhIQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU3ViSW5kZXg7CisJdEVwbE9iZFR5cGUgbV9UeXBlOworCXRFcGxPYmRBY2Nlc3MgbV9BY2Nlc3M7CisJdm9pZCAqbV9wRGVmYXVsdDsKKwl2b2lkIE1FTSAqbV9wQ3VycmVudDsJLy8gcG9pbnRzIGFsd2F5cyB0byBSQU0KKworfSB0RXBsT2JkU3ViRW50cnk7CisKKy8vIHIuZC46IGhhcyBhbHdheXMgdG8gYmUgIGJlY2F1c2UgbmV3IE9CRC1NYWNyb3MgZm9yIGFycmF5cwordHlwZWRlZiB0RXBsT2JkU3ViRW50cnkgKnRFcGxPYmRTdWJFbnRyeVB0cjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG9iamRpY3Rpb25hcnkgbW9kdWwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcGFyYW1ldGVycyBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkRXZlbnQgbV9PYmRFdmVudDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViSW5kZXg7CisJdm9pZCAqbV9wQXJnOworCURXT1JEIG1fZHdBYm9ydENvZGU7CisKK30gdEVwbE9iZENiUGFyYW07CisKKy8vIGRlZmluZSB0eXBlIGZvciBjYWxsYmFjayBmdW5jdGlvbjogcFBhcmFtX3AgcG9pbnRzIHRvIHRFcGxPYmRDYlBhcmFtCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRFcGxPYmRDYWxsYmFjaykgKENDTV9ERUNMX0lOU1RBTkNFX0hETF8KKwkJCQkJCSAgdEVwbE9iZENiUGFyYW0gTUVNICoKKwkJCQkJCSAgcFBhcmFtX3ApOworCisvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBmb3IgdGhpcyBzdHJ1Y3QhISEKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdEVwbE9iZFN1YkVudHJ5UHRyIG1fcFN1YkluZGV4OworCXVuc2lnbmVkIGludCBtX3VpQ291bnQ7CisJdEVwbE9iZENhbGxiYWNrIG1fZnBDYWxsYmFjazsJLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGJhY2sgaWYgb2JqZWN0IGFjY2VzcworCit9IHRFcGxPYmRFbnRyeTsKKworLy8gYWxsd2F5cyAgcG9pbnRlcgordHlwZWRlZiB0RXBsT2JkRW50cnkgKnRFcGxPYmRFbnRyeVB0cjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc3RydWN0dXIgdG8gaW5pdGlhbGl6ZSBPQkQgbW9kdWxlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkRW50cnlQdHIgbV9wUGFydDsKKwl0RXBsT2JkRW50cnlQdHIgbV9wTWFudWZhY3R1cmVyUGFydDsKKwl0RXBsT2JkRW50cnlQdHIgbV9wRGV2aWNlUGFydDsKKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJdEVwbE9iZEVudHJ5UHRyIG1fcFVzZXJQYXJ0OworCisjZW5kaWYKKworfSB0RXBsT2JkSW5pdFBhcmFtOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciBmb3IgcGFyYW1ldGVycyBvZiBTVE9SRSBSRVNUT1JFIGNvbW1hbmQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRDb21tYW5kIG1fYkNvbW1hbmQ7CisJdEVwbE9iZFBhcnQgbV9iQ3VycmVudE9kUGFydDsKKwl2b2lkIE1FTSAqbV9wRGF0YTsKKwl0RXBsT2JkU2l6ZSBtX09ialNpemU7CisKK30gdEVwbE9iZENiU3RvcmVQYXJhbTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKiB0SW5pdFRhYkVudHJ5Q2FsbGJhY2spICh2b2lkIE1FTSAqIHBUYWJFbnRyeV9wLAorCQkJCQkJCXVuc2lnbmVkIGludAorCQkJCQkJCXVpT2JqSW5kZXhfcCk7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICoKKwkJICAgdEVwbE9iZFN0b3JlTG9hZE9iakNhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJIHRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNICoKKwkJCQkJCSBwQ2JTdG9yZVBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIHN0dWN0dXJlIGlzIHVzZWQgZm9yIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIE9iZEluaXRNb2R1bGVUYWIoKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTG93ZXJPYmpJbmRleDsJLy8gbG93ZXIgbGltaXQgb2YgT2JqSW5kZXgKKwl1bnNpZ25lZCBpbnQgbV91aVVwcGVyT2JqSW5kZXg7CS8vIHVwcGVyIGxpbWl0IG9mIE9iakluZGV4CisJdEluaXRUYWJFbnRyeUNhbGxiYWNrIG1fZnBJbml0VGFiRW50cnk7CS8vIHdpbGwgYmUgY2FsbGVkIGlmIE9iakluZGV4IHdhcyBmb3VuZAorCXZvaWQgTUVNICptX3BUYWJCYXNlOwkvLyBiYXNlIGFkZHJlc3Mgb2YgdGFibGUKKwl1bnNpZ25lZCBpbnQgbV91aUVudHJ5U2l6ZTsJLy8gc2l6ZSBvZiB0YWJsZSBlbnRyeSAgICAgIC8vIDI1LWZlYi0yMDA1IHIuZC46IGV4cGFuc2lvbiBmcm9tIEJZVEUgdG8gV09SRCBuZWNlc3NhcnkgZm9yIFBETyBiaXQgbWFwcGluZworCXVuc2lnbmVkIGludCBtX3VpTWF4RW50cmllczsJLy8gbWF4LiB0YWJlbCBlbnRyaWVzCisKK30gdEVwbE9iZE1vZHVsVGFiUGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGVudW0gZm9yIGZ1bmN0aW9uIEVwbE9iZFNldE5vZGVJZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIGVudW0geworCWtFcGxPYmROb2RlSWRVbmtub3duID0gMHgwMCwJLy8gdW5rbm93biBob3cgdGhlIG5vZGUgaWQgd2FzIHNldAorCWtFcGxPYmROb2RlSWRTb2Z0d2FyZSA9IDB4MDEsCS8vIG5vZGUgaWQgc2V0IGJ5IHNvZnR3YXJlCisJa0VwbE9iZE5vZGVJZEhhcmR3YXJlID0gMHgwMgkvLyBub2RlIGlkIHNldCBieSBoYXJkd2FyZQorfSB0RXBsT2JkTm9kZUlkVHlwZTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ2xvYmFsIHZhcmlhYmxlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBwdWJsaWMgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkTWFjcm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkTWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YyYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBtYWNyb3Mgb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZE1hY3JvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wNSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAtPiBiYXNlZCBvbiBDQU5vcGVuIE9iZE1hY3JvLmgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkIChFUExfT0JEX0RFRklORV9NQUNSTykKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgRFdPUkQgIGR3T2JkX09CS19nID0gMHgwMDAwOworI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCisjZGVmaW5lIEVQTF9PQkRfRU5EX0lOREVYKGluZCkKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18weDAxX2cgPSAoZGVmKTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18weDAxX2cgPSAoZGVmKTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2cgICAgICAgID0gdmFsOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZ1szXSAgICAgPSB7dmFsLGxvdyxoaWdofTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgY2hhciAgTUVNIHN6Q3VyIyNpbmQjI18jI3N1YiMjX2dbc2l6ZSsxXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZFZTdHJpbmdEZWYgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyA9IHtzaXplLCB2YWwsIHN6Q3VyIyNpbmQjI18jI3N1YiMjX2d9OworCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgQllURSAgTUVNIGJDdXIjI2luZCMjXyMjc3ViIyNfZ1tzaXplXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZE9TdHJpbmdEZWYgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyA9IHtzaXplLCAoKEJZVEUqKSIiKSwgYkN1ciMjaW5kIyNfIyNzdWIjI19nfTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgIHN0YXRpYyAgZHR5cCAgeERlZiMjaW5kIyNfIyNzdWIjI19nICAgICAgICA9IHZhbDsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2dbM10gICAgID0ge3ZhbCxsb3csaGlnaH07CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9SQU1fREFUQSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICBzdGF0aWMgZHR5cCAgICAgICAgIE1FTSBheEN1ciMjaW5kIyNfZ1tjbnRdOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBhVmFyRW50cnkjI2luZCMjX2dbY250XTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gYVZhckVudHJ5IyNpbmQjI19nW2NudF07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgZHR5cCAgICAgICAgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKSAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWU3RyaW5nICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZE9TdHJpbmcgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRTdWJFbnRyeSBNRU0gYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nW2NudF09IHsKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXksICZ4RGVmIyNpbmQjI18weDAxX2csICAgJmF4Q3VyIyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbXT0geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIGtFcGxPYmRUeXBVSW50OCwga0VwbE9iZEFjY0NSLCAgICAgICAgICAgICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXl8a0VwbE9iZEFjY1ZhciwgJnhEZWYjI2luZCMjXzB4MDFfZywgICAmYVZhckVudHJ5IyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbXT0geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIGtFcGxPYmRUeXBVSW50OCwga0VwbE9iZEFjY0NSLCAgICAgICAgICAgICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXl8a0VwbE9iZEFjY1ZhciwgTlVMTCwgICAgICAgICAgICAgICAgICAmYVZhckVudHJ5IyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyksICAgICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1JhbmdlLCAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZ1swXSwmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyksICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKSAgICAgICAgICAgICAgICAge3N1YixrRXBsT2JkVHlwVlN0cmluZywoYWNjKS8qfGtFcGxPYmRBY2NWYXIqLywgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkgICAgICAgICAgICAgICAgICAgICB7c3ViLGtFcGxPYmRUeXBPU3RyaW5nLChhY2MpLyp8a0VwbE9iZEFjY1ZhciovLCAgICAgICAgICZ4RGVmIyNpbmQjI18jI3N1YiMjX2csICAgJnhDdXIjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWIsa0VwbE9iZFR5cERvbWFpbiwgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhcnxrRXBsT2JkQWNjUmFuZ2UsJnhEZWYjI2luZCMjXyMjc3ViIyNfZ1swXSwmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpICAgICAgICAgIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgTlVMTCwgICAgJlZhckVudHJ5IyNpbmQjI18jI3N1YiMjX2d9LAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJfZ1tdICAgICAgPSB7CisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZEVudHJ5ICBhT2JkVGFiTWFudWZhY3R1cmVyX2dbXSA9IHsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJEZXZpY2VfZ1tdICAgICAgID0geworI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RVBMX09CRF9UQUJMRV9JTkRFWF9FTkQsKHRFcGxPYmRTdWJFbnRyeVB0cikmZHdPYmRfT0JLX2csMCxOVUxMfX07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSxjbnQsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSwoY250KSsxLCh0RXBsT2JkQ2FsbGJhY2spY2FsbH0sCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLChjbnQpKzEsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAge2luZCwodEVwbE9iZFN1YkVudHJ5UHRyKSZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sKGNudCkrMSwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfSU5JVF9GVU5DVElPTiIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BQYXJ0ICAgICAgPSAodEVwbE9iZEVudHJ5UHRyKSAmYU9iZFRhYl9nWzBdOworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BNYW51ZmFjdHVyZXJQYXJ0ID0gKHRFcGxPYmRFbnRyeVB0cikgJmFPYmRUYWJNYW51ZmFjdHVyZXJfZ1swXTsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbS0+bV9wRGV2aWNlUGFydCAgICAgICA9ICh0RXBsT2JkRW50cnlQdHIpICZhT2JkVGFiRGV2aWNlX2dbMF07CisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWCkKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX0lOSVRfU1VCSU5ERVgiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCS8vQ0NNX1NVQklOREVYX1JBTV9PTkxZIChFUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpKTsKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFTFNFIE9GIERFRklORSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplcyx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorCisjZW5kaWYKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9VTkRFRklORV9NQUNSTykKKworLy8gICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9VTkRFRklORV9NQUNSTyIpCisKKyN1bmRlZiBFUExfT0JEX0JFR0lOCisjdW5kZWYgRVBMX09CRF9FTkQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMKKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSCisjdW5kZWYgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRQorI3VuZGVmIEVQTF9PQkRfRU5EX1BBUlQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0KKyN1bmRlZiBFUExfT0JEX0VORF9JTkRFWAorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWQorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWQorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRgorI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVAorCisjZWxzZQorCisjZXJyb3IgIm5vdGhpbmcgZGVmaW5lZCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZGtDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZGtDYWwuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLUtlcm5lbHNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jka0NhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGtDYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4ZDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1PYmQtVXNlcnNwYWNlLW1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHVDYWwuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsV3JpdGVFbnRyeSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVSZWFkRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5LiBUaGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBjYW4gYWx3YXlzIHJlYWQgdGhlIGRhdGEgZXZlbiBpZiBhdHRyaWIga0VwbE9iZEFjY1JlYWQKKy8vICAgICAgICAgICAgICBpcyBub3Qgc2V0LiBUaGUgYXR0cmliIGlzIG9ubHkgY2hlY2tlZCB1cCBmb3IgU0RPIHRyYW5zZmVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlc3RvcmVzIGRlZmF1bHQgdmFsdWVzIG9mIG9uZSBwYXJ0IG9mIE9ECisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcCAgICAgICA9IG9kLXBhcnQgdG8gcmVzZXQKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSBkaXJlY3RvcnkgZmxhZyBmb3IKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQoT2JkUGFydF9wLCBEaXJlY3Rpb25fcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1RGVmaW5lVmFyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVmaW5lcyBhIHZhcmlhYmxlIGluIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBFcGxWYXJQYXJhbV9wID0gdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdURlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICogcFZhclBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsRGVmaW5lVmFyKHBWYXJQYXJhbV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdm9pZCAqcERhdGE7CisKKwlwRGF0YSA9IEVwbE9iZHVDYWxHZXRPYmplY3REYXRhUHRyKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKworCXJldHVybiBwRGF0YTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVJlZ2lzdGVyVXNlck9kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSB1c2VyIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBVc2VyT2RfcCAgID1wb2ludGVyIHRvIHVzZXIgT0RkCisvLworLy8gUmV0dXJuOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlZ2lzdGVyVXNlck9kKHRFcGxPYmRFbnRyeVB0ciBwVXNlck9kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QocFVzZXJPZF9wKTsKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVmFyRW50cnlfcCA9IHBvaW50ZXIgdG8gdmFyIGVudHJ5IHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIGJUeXBlX3AgICAgID0gb2JqZWN0IHR5cGUKKy8vICAgICAgICAgICAgICBPYmRTaXplX3AgICA9IHNpemUgb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBSZXR1cm5zOiAgICAgbm9uZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkdUluaXRWYXJFbnRyeSh0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICAgQllURSBiVHlwZV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKwlFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHBWYXJFbnRyeV9wLCBiVHlwZV9wLCBPYmRTaXplX3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1R2V0RGF0YVNpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyAgICAgICAgICAgICAgZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICA9ICAgSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3A9ICAgU3ViaW5kZXgKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxPYmRTaXplIFBVQkxJQyBFcGxPYmR1R2V0RGF0YVNpemUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbE9iZFNpemUgU2l6ZTsKKworCVNpemUgPSBFcGxPYmR1Q2FsR2V0RGF0YVNpemUodWlJbmRleF9wLCB1aVN1YkluZGV4X3ApOworCisJcmV0dXJuIFNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZXR1cm5zIG5vZGVpZCBmcm9tIGVudHJ5IDB4MUY5MworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybjogICAgICB1bnNpZ25lZCBpbnQgPSBOb2RlIElkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVHZXROb2RlSWQoKQoreworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCXVpTm9kZUlkID0gRXBsT2JkdUNhbEdldE5vZGVJZCgpOworCisJcmV0dXJuIHVpTm9kZUlkOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1U2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gc2V0cyBub2RlaWQgaW4gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1U2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbFNldE5vZGVJZCh1aU5vZGVJZF9wLCBOb2RlSWRUeXBlX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiByZXR1cm5zIGFjY2Vzc3R5cGUgb2YgdGhlIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwQWNjZXNzVHlwX3AgICAgPSAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIHN0b3JlIGFjY2Vzc3R5cAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgICBwQWNjZXNzVHlwX3ApCit7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCisJQWNjZXNzVHlwZSA9CisJICAgIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwQWNjZXNzVHlwX3ApOworCisJcmV0dXJuIEFjY2Vzc1R5cGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWR1RW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeSBmcm9tIHRoZSBieXRlb2RlcgorLy8gICAgICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gdG8gdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIGZvciBudW1lcmljIHZhbHVlcy4KKy8vICAgICAgICAgICAgICBGb3Igb3RoZXIgdHlwZXMgYSBub3JtYWwgcmVhZCB3aWxsIGJlIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VmdWxsIGZvcgorLy8gICAgICAgICAgICAgIHRoZSBQRE8gYW5kIFNETyBtb2R1bGUuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPQorCSAgICBFcGxPYmR1Q2FsUmVhZEVudHJ5VG9MZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcERzdERhdGFfcCwKKwkJCQkgICAgcFNpemVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIE9CRCBlbnRyeSBmcm9tIGEgc291cmNlIHdpdGgKKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuIGJ5dGVvcmRlciB0byB0aGUgb2Qgd2l0aCBzeXN0ZW0gc3BlY3VpZmljCisvLyAgICAgICAgICAgICAgYnl0ZW9yZGVyLiBOb3QgbnVtZXJpYyB2YWx1ZXMgd2lsbCBvbmx5IGJ5IGNvcGllZC4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9CisJICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLAorCQkJCSAgICAgICBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVNlYXJjaFZhckVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyB2YXJpYWJsZSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgaW5kZXggb2YgdGhlIHZhciBlbnRyeSB0byBzZWFyY2gKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgPSAgIHN1YmluZGV4IG9mIHZhciBlbnRyeSB0byBzZWFyY2gKKy8vICAgICAgICAgICAgICBwcFZhckVudHJ5X3AgICAgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIHZhcmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkJICAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqCisJCQkJCQkgICAgIHBwVmFyRW50cnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcHBWYXJFbnRyeV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIzZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1Q2FsLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllcgorICAgICAgICAgICAgICAgIGZvciB0aGUgRXBsLU9iZC1Vc2Vyc3BhY2UtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmR1Q2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdUNhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFdyaXRlRW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFdyaXRlRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBTcmNEYXRhX3AsIFNpemVfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsUmVhZEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFJlYWRFbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkQWNjZXNzT2RQYXJ0CisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcCAgICAgICA9IG9kLXBhcnQgdG8gcmVzZXQKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSBkaXJlY3RvcnkgZmxhZyBmb3IKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnQoT2JkUGFydF9wLCBEaXJlY3Rpb25fcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsRGVmaW5lVmFyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZERlZmluZVZhcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXBsVmFyUGFyYW1fcCA9IHZhcmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgID0gICBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxEZWZpbmVWYXIodEVwbFZhclBhcmFtIE1FTSAqCisJCQkJCQkgICBwVmFyUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIocFZhclBhcmFtX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkR2V0T2JqZWN0RGF0YVB0cgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgPSAgIEluZGV4IG9mIHRoZSBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCA9ICAgU3ViaW5kZXggb2YgdGhlIGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmR1Q2FsR2V0T2JqZWN0RGF0YVB0cih1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKQoreworCXZvaWQgKnBEYXRhOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCXBEYXRhID0gRXBsT2JkR2V0T2JqZWN0RGF0YVB0cih1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisjZWxzZQorCXBEYXRhID0gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIHBEYXRhOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVnaXN0ZXJVc2VyT2QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPSBwb2ludGVyIHRvIHVzZXIgT0QKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyCisJCQkJCQkJcFVzZXJPZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFJlZ2lzdGVyVXNlck9kKHBVc2VyT2RfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxJbml0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkSW5pdFZhckVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBWYXJFbnRyeV9wID0gcG9pbnRlciB0byB2YXIgZW50cnkgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgYlR5cGVfcCAgICAgPSBvYmplY3QgdHlwZQorLy8gICAgICAgICAgICAgIE9iZFNpemVfcCAgID0gc2l6ZSBvZiBvYmplY3QgZGF0YQorLy8KKy8vIFJldHVybnM6ICAgICBub25lCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKgorCQkJCQkJcFZhckVudHJ5X3AsIEJZVEUgYlR5cGVfcCwKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJRXBsT2JkSW5pdFZhckVudHJ5KHBWYXJFbnRyeV9wLCBiVHlwZV9wLCBPYmRTaXplX3ApOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXREYXRhU2l6ZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVDYWxHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsT2JkU2l6ZSBTaXplOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisjZWxzZQorCVNpemUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXROb2RlSWQKKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm46ICAgICAgdW5zaWduZWQgaW50ID0gTm9kZSBJZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCkKK3sKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJdWlOb2RlSWQgPSBFcGxPYmRHZXROb2RlSWQoKTsKKyNlbHNlCisJdWlOb2RlSWQgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gdWlOb2RlSWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkU2V0Tm9kZUlkCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbE9iZE5vZGVJZFR5cGUKKwkJCQkJCSAgIE5vZGVJZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRTZXROb2RlSWQodWlOb2RlSWRfcCwgTm9kZUlkVHlwZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldEFjY2Vzc1R5cGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgICAgIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsT2JkQWNjZXNzIEFjY2VzVHlwZTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlBY2Nlc1R5cGUgPSBFcGxPYmRHZXRBY2Nlc3NUeXBlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwQWNjZXNzVHlwX3ApOworI2Vsc2UKKwlBY2Nlc1R5cGUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gQWNjZXNUeXBlOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFJlYWRFbnRyeVRvTGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodW5zaWduZWQgaW50CisJCQkJCQkJICB1aUluZGV4X3AsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCQkgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkJICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsU2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkU2VhcmNoVmFyRW50cnkodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBwVmFyRW50cnlfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iakRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTMxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iakRlZi5oCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZGVmaW5lcyBvYmpkaWN0IGRpY3Rpb25hcnkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmpEZWYuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA2ICAgIGsudC46ICAgdGFrZSBPYmpEZWYuaCBmcm9tIENBTm9wZW4gYW5kIG1vZGlmeSBmb3IgRVBMCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTE9CSkRFRl9IXworI2RlZmluZSBfRVBMT0JKREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzZWN1cml0eSBjaGVja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYWNyb3MgdG8gaGVscCBidWlsZGluZyBPRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCKSAmJiAoRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCICE9IEZBTFNFKSkKKworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09OTFkoYSkgICAgYTsKKyNkZWZpbmUgQ0NNX1NVQklOREVYX1JBTV9PTkVPRihhLGIpIGEKKworI2Vsc2UKKworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09OTFkoYSkKKyNkZWZpbmUgQ0NNX1NVQklOREVYX1JBTV9PTkVPRihhLGIpIGIKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUbyBwcmV2ZW50IHVudXNlZCBtZW1vcnkgaW4gc3ViaW5kZXggdGFibGVzIHdlIG5lZWQgdGhpcyBtYWNyby4KKy8vIEJ1dCBub3QgYWxsIGNvbXBpbGVycyBzdXBwb3J0IHRvIHByZXNldCB0aGUgbGFzdCBzdHJ1Y3QgdmFsdWUgZm9sbG93ZWQgYnkgYSBjb21tYS4KKy8vIENvbXBpbGVycyB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGEgY29tbWEgYWZ0ZXIgbGFzdCBzdHJ1Y3QgdmFsdWUgaGFzIHRvIHBsYWNlIGluIGEgZHVtbXkgc3ViaW5kZXguCisjaWYgKChERVZfU1lTVEVNICYgX0RFVl9DT01NQV9FWFRfKSAhPSAwKQorCisjZGVmaW5lIEVQTF9PQkRfRU5EX1NVQklOREVYKCkKKyNkZWZpbmUgRVBMX09CRF9NQVhfQVJSQVlfU1VCRU5UUklFUyAgICAyCisKKyNlbHNlCisKKyNkZWZpbmUgRVBMX09CRF9FTkRfU1VCSU5ERVgoKSAgICAgICAgICB7MCwwLDAsTlVMTCxOVUxMfQorI2RlZmluZSBFUExfT0JEX01BWF9BUlJBWV9TVUJFTlRSSUVTICAgIDMKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgZGF0YSBpbiBST00gbWVtb3J5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNyZWF0aW9uIG9mIGRhdGEgaW4gUkFNIG1lbW9yeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNyZWF0aW9uIG9mIHN1YmluZGV4IHRhYmxlcyBpbiBST00gYW5kIFJBTQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1NVQklOREVYX1RBQgorI2luY2x1ZGUgIm9iamRpY3QuaCIKKyN1bmRlZiBFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgaW5kZXggdGFibGVzIGZvciBnZW5lcmljLCBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBwYXJ0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfSU5ERVhfVEFCCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFUExfT0JEX0lOSVRfUkFNX05BTUUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIG9iamVjdCBkaWN0aW9uYXJ5CisvLworLy8gUGFyYW1ldGVyczogIHBJbml0UGFyYW1fcCAgICA9IHBvaW50ZXIgdG8gaW5pdCBwYXJhbSBzdHJ1Y3Qgb2YgRXBsCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFUExfT0JEX0lOSVRfUkFNX05BTUUodEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJICAgICBwSW5pdFBhcmFtX3ApCit7CisKKwl0RXBsT2JkSW5pdFBhcmFtIE1FTSAqcEluaXRQYXJhbSA9IHBJbml0UGFyYW1fcDsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gcGFyYW1ldGVyIHN0cnVjdHVyZSBpcyB2YWxpZAorCS8vIGlmIG5vdCB0aGVuIG9ubHkgY29weSBzdWJpbmRleCB0YWJsZXMgYmVsb3cKKwlpZiAocEluaXRQYXJhbSAhPSBOVUxMKSB7CisJCS8vIGF0IGZpcnN0IGRlbGV0ZSBhbGwgcGFyYW1ldGVycyAoYWxsIHBvaW50ZXJzIHdpbGwgYmUgc2V0IHp1IE5VTEwpCisJCUVQTF9NRU1TRVQocEluaXRQYXJhbSwgMCwgc2l6ZW9mKHRFcGxPYmRJbml0UGFyYW0pKTsKKworI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OCisJCXsKKwkJCS8vIGluc2VydHMgY29kZSB0byBpbml0IHBvaW50ZXIgdG8gaW5kZXggdGFibGVzCisjaW5jbHVkZSAib2JqZGljdC5oIgorCQl9CisjdW5kZWYgRVBMX09CRF9DUkVBVEVfSU5JVF9GVU5DVElPTgorCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisJCXsKKwkJCS8vIHRvIGJlZ2luIG5vIHVzZXIgT0QgaXMgZGVmaW5lZAorCQkJcEluaXRQYXJhbV9wLT5tX3BVc2VyUGFydCA9IE5VTEw7CisJCX0KKyNlbmRpZgorCX0KKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWAorCXsKKwkJLy8gaW5zZXJ0cyBjb2RlIHRvIGNvcHkgc3ViaW5kZXggdGFibGVzCisjaW5jbHVkZSAib2JqZGljdC5oIgorCX0KKyN1bmRlZiBFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYCisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKworI2VuZGlmIC8vIF9FUExPQkpERUZfSF8KKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJhYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG8uaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgUERPIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkby5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPX0hfCisjZGVmaW5lIF9FUExfUERPX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGludmFsaWQgUERPLU5vZGVJZAorI2RlZmluZSBFUExfUERPX0lOVkFMSURfTk9ERV9JRCAgICAgMHhGRgorLy8gTm9kZUlkIGZvciBQUmVxIFJQRE8KKyNkZWZpbmUgRVBMX1BET19QUkVRX05PREVfSUQgICAgICAgIDB4MDAKKy8vIE5vZGVJZCBmb3IgUFJlcyBUUERPCisjZGVmaW5lIEVQTF9QRE9fUFJFU19OT0RFX0lEICAgICAgICAweDAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqbV9wVmFyOworCVdPUkQgbV93T2Zmc2V0OwkJLy8gaW4gQml0cworCVdPUkQgbV93U2l6ZTsJCS8vIGluIEJpdHMKKwlCT09MIG1fZk51bWVyaWM7CS8vIG51bWVyaWMgdmFsdWUgLT4gdXNlIEFNSSBmdW5jdGlvbnMKKworfSB0RXBsUGRvTWFwcGluZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU2l6ZU9mU3RydWN0OworCXVuc2lnbmVkIGludCBtX3VpUGRvSWQ7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJLy8gMHhGRj1pbnZhbGlkLCBSUERPOiAweDAwPVBSZXEsIGxvY2FsTm9kZUlkPVBSZXMsIHJlbW90ZU5vZGVJZD1QUmVzCisJLy8gICAgICAgICAgICAgICBUUERPOiAweDAwPVBSZXMsIE1OOiBDbk5vZGVJZD1QUmVxCisKKwlCT09MIG1fZlR4Ung7CisJQllURSBtX2JNYXBwaW5nVmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgbV91aU1heE1hcHBpbmdFbnRyaWVzOwkvLyBtYXhpbXVtIG51bWJlciBvZiBtYXBwaW5nIGVudHJpZXMsIGkuZS4gc2l6ZSBvZiBtX2FQZG9NYXBwaW5nCisJdEVwbFBkb01hcHBpbmcgbV9hUGRvTWFwcGluZ1sxXTsKKworfSB0RXBsUGRvUGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk5OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rLmMKQEAgLTAsMCArMSw2OTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3Iga2VybmVsIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorI2luY2x1ZGUgInBsY2NvcmUuaCIKKyNkZWZpbmUgUERPX0xFRCAweDA4CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSA9PSAwKQorCisjZXJyb3IgJ0VSUk9SOiBNaXNzaW5nIERMTGstTW9kdWwhJworCisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpID09IDApCisKKyNlcnJvciAnRVJST1I6IE1pc3NpbmcgT0JEay1Nb2R1bCEnCisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9SWF9DT01NX1BBUkFNICAweDE0MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9SWF9NQVBQX1BBUkFNICAweDE2MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9UWF9DT01NX1BBUkFNICAweDE4MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9UWF9NQVBQX1BBUkFNICAweDFBMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxQZG9rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0FkZEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0RlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlBkb1JlY2VpdmVkCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBQUmVzIG9yIFBSZXEgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgcmVjZWl2ZWQuIEl0IHBvc3RzIHRoZSBmcmFtZSB0byB0aGUgZXZlbnQgcXVldWUuCisvLyAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIGluIHN0YXRlcyBOTVRfQ1NfUkVBRFlfVE9fT1BFUkFURSBhbmQgTk1UX0NTX09QRVJBVElPTkFMLgorLy8gICAgICAgICAgICAgIFRoZSBwYXNzZWQgUERPIG5lZWRzIG5vdCB0byBiZSB2YWxpZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1JlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHJlc2V0IExFRAorLy8gICAgTUNGX0dQSU9fUE9EUl9QQ0lCRyAmPSB+UERPX0xFRDsgIC8vIExldmVsCisjZW5kaWYKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvUng7CisJLy8gbGltaXQgY29waWVkIGRhdGEgdG8gc2l6ZSBvZiBQRE8gKGJlY2F1c2UgZnJvbSBzb21lIENOcyB0aGUgZnJhbWUgaXMgbGFyZ2VyIHRoYW4gbmVjZXNzYXJ5KQorCUV2ZW50Lm1fdWlTaXplID0gQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKSArIDI0OwkvLyBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemU7CisJRXZlbnQubV9wQXJnID0gcEZyYW1lSW5mb19wLT5tX3BGcmFtZTsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHNldCBMRUQKKy8vICAgIE1DRl9HUElPX1BPRFJfUENJQkcgfD0gUERPX0xFRDsgIC8vIExldmVsCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBQUmVzIG9yIFBSZXEgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgc2VudC4gSXQgcG9zdHMgdGhlIHBvaW50ZXIgdG8gdGhlIGZyYW1lIHRvIHRoZSBldmVudCBxdWV1ZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgaW4gTk1UX0NTX1BSRV9PUEVSQVRJT05BTF8yLAorLy8gICAgICAgICAgICAgIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwuCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisjaWYgKERFVl9TWVNURU0gPT0gX0RFVl9HTlVfQ0Y1NDhYXykKKwkvLyByZXNldCBMRUQKKwlNQ0ZfR1BJT19QT0RSX1BDSUJHICY9IH5QRE9fTEVEOwkvLyBMZXZlbAorI2VuZGlmCisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtQZG9rOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1R4OworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHRFcGxGcmFtZUluZm8pOworCUV2ZW50Lm1fcEFyZyA9IHBGcmFtZUluZm9fcDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHNldCBMRUQKKwlNQ0ZfR1BJT19QT0RSX1BDSUJHIHw9IFBET19MRUQ7CS8vIExldmVsCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlNvYQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBETEwgaWYgU29BIGZyYW1lIHdhcworLy8gICAgICAgICAgICAgIHJlY2VpdmVkIHJlc3AuIHNlbnQuIEl0IHBvc3RzIHRoaXMgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NiU29hKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtQZG9rOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKKwlFdmVudC5tX3VpU2l6ZSA9IDA7CisJRXZlbnQubV9wQXJnID0gTlVMTDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgcmVjZWl2ZWQgYW5kIHRyYW5zbWl0dGVkIFBET3MuCisvLyAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSBhbnkgb3RoZXIgdGFzaworLy8gICAgICAgICAgICAgIGV4Y2VwdCBJU1JzIChsaWtlIHRoZSBldGhlcm5ldCBkcml2ZXIgSVNSLCB3aGljaCBtYXkgY2FsbAorLy8gICAgICAgICAgICAgIEVwbFBkb2tDYkZyYW1lUmVjZWl2ZWQoKSBvciBFcGxQZG9rQ2JGcmFtZVRyYW5zbWl0dGVkKCkpLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZXZlbnQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJV09SRCB3UGRvU2l6ZTsKKwlXT1JEIHdCaXRPZmZzZXQ7CisJV09SRCB3Qml0U2l6ZTsKKwlXT1JEIHdWYXJTaXplOworCVFXT1JEIHF3T2JqZWN0TWFwcGluZzsKKwlCWVRFIGJNYXBwU3ViaW5kZXg7CisJQllURSBiT2JkU3ViaW5kZXg7CisJV09SRCB3T2JkTWFwcEluZGV4OworCVdPUkQgd09iZENvbW1JbmRleDsKKwlXT1JEIHdQZG9JZDsKKwlCWVRFIGJPYmREYXRhOworCUJZVEUgYk9iamVjdENvdW50OworCUJZVEUgYkZyYW1lRGF0YTsKKwlCT09MIGZWYWxpZDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXRFcGxGcmFtZUluZm8gKnBGcmFtZUluZm87CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisKKwkvLyAweEZGPWludmFsaWQsIFJQRE86IDB4MDA9UFJlcSwgbG9jYWxOb2RlSWQ9UFJlcywgcmVtb3RlTm9kZUlkPVBSZXMKKwkvLyAgICAgICAgICAgICAgIFRQRE86IDB4MDA9UFJlcywgTU46IENuTm9kZUlkPVBSZXEKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlUGRvUng6CS8vIFJQRE8gcmVjZWl2ZWQKKwkJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCS8vIGNoZWNrIGlmIHJlY2VpdmVkIFJQRE8gaXMgdmFsaWQKKwkJYkZyYW1lRGF0YSA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzEpOworCQlpZiAoKGJGcmFtZURhdGEgJiBFUExfRlJBTUVfRkxBRzFfUkQpID09IDApIHsJLy8gUlBETyBpbnZhbGlkCisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gcmV0cmlldmUgRVBMIG1lc3NhZ2UgdHlwZQorCQlNc2dUeXBlID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJCWlmIChNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkgewkvLyBSUERPIGlzIFBSZXEgZnJhbWUKKwkJCXVpTm9kZUlkID0gRVBMX1BET19QUkVRX05PREVfSUQ7CS8vIDB4MDAKKwkJfSBlbHNlIHsJLy8gUlBETyBpcyBQUmVzIGZyYW1lCisJCQkvLyByZXRyaWV2ZSBub2RlIElECisJCQl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKwkJfQorCisJCS8vIHNlYXJjaCBmb3IgYXBwcm9wcmlhdGUgdmFsaWQgUlBETyBpbiBPRAorCQl3T2JkTWFwcEluZGV4ID0gRVBMX1BET0tfT0JEX0lEWF9SWF9NQVBQX1BBUkFNOworCQlmb3IgKHdPYmRDb21tSW5kZXggPSBFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU07CisJCSAgICAgd09iZENvbW1JbmRleCA8IChFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU0gKyAweDAwRkYpOworCQkgICAgIHdPYmRDb21tSW5kZXgrKywgd09iZE1hcHBJbmRleCsrKSB7CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbm9kZSBJRCBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAxLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JkRGF0YSAhPSB1aU5vZGVJZCkgewkvLyBub2RlIElEIGRvZXMgbm90IGVxdWFsIC0gd3JvbmcgUERPLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBudW1iZXIgb2YgbWFwcGVkIG9iamVjdHMgZnJvbSBPRDsgdGhpcyBpbmRpY2F0ZXMgaWYgdGhlIFBETyBpcyB2YWxpZAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwgMHgwMCwgJmJPYmplY3RDb3VudCwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBpbiBPRCBub3QgdmFsaWQsIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlPYmRTaXplID0gMTsKKwkJCS8vIGNoZWNrIFBETyBtYXBwaW5nIHZlcnNpb24KKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDIsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQkvLyByZXRyaWV2ZSBQRE8gdmVyc2lvbiBmcm9tIGZyYW1lCisJCQliRnJhbWVEYXRhID0KKwkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCSAgICAgbV9sZV9iUGRvVmVyc2lvbik7CisJCQlpZiAoKGJPYmREYXRhICYgRVBMX1ZFUlNJT05fTUFJTikgIT0gKGJGcmFtZURhdGEgJiBFUExfVkVSU0lPTl9NQUlOKSkgewkvLyBQRE8gdmVyc2lvbnMgZG8gbm90IG1hdGNoCisJCQkJLy8gJCQkIHJhaXNlIFBETyBlcnJvcgorCQkJCS8vIHRlcm1pYXRlIHByb2Nlc3Npbmcgb2YgdGhpcyBSUERPCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gdmFsaWQgUlBETyBmb3VuZAorCisJCQkvLyByZXRyaWV2ZSBQRE8gc2l6ZQorCQkJd1Bkb1NpemUgPQorCQkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKTsKKworCQkJLy8gcHJvY2VzcyBtYXBwaW5nCisJCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJCSAgICAgYk1hcHBTdWJpbmRleCsrKSB7CisJCQkJT2JkU2l6ZSA9IDg7CS8vIFFXT1JECisJCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsCisJCQkJCQkgICAgYk1hcHBTdWJpbmRleCwKKwkJCQkJCSAgICAmcXdPYmplY3RNYXBwaW5nLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY2hlY2sgaWYgb2JqZWN0IG1hcHBpbmcgZW50cnkgaXMgdmFsaWQsIGkuZS4gdW5lcXVhbCB6ZXJvLCBiZWNhdXNlICJlbXB0eSIgZW50cmllcyBhcmUgYWxsb3dlZAorCQkJCWlmIChxd09iamVjdE1hcHBpbmcgPT0gMCkgewkvLyBpbnZhbGlkIGVudHJ5LCBjb250aW51ZSB3aXRoIG5leHQgZW50cnkKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCQkJCXdPYmRDb21tSW5kZXggPQorCQkJCSAgICAoV09SRCkgKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisJCQkJYk9iZFN1YmluZGV4ID0KKwkJCQkgICAgKEJZVEUpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCQkJCXdCaXRPZmZzZXQgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisJCQkJd0JpdFNpemUgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKKwkJCQkvLyBjaGVjayBpZiBvYmplY3QgZXhjZWVkcyBQRE8gc2l6ZQorCQkJCWlmICgoKHdCaXRPZmZzZXQgKyB3Qml0U2l6ZSkgPj4gMykgPiB3UGRvU2l6ZSkgewkvLyB3cm9uZyBvYmplY3QgbWFwcGluZzsgUERPIHNpemUgaXMgdG9vIGxvdworCQkJCQkvLyAkJCQgcmFpc2UgUERPIGVycm9yCisJCQkJCS8vIHRlcm1pbmF0ZSBwcm9jZXNzaW5nIG9mIHRoaXMgUlBETworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIGNvcHkgb2JqZWN0IGZyb20gUlBETyB0byBwcm9jZXNzL09EIHZhcmlhYmxlCisJCQkJT2JkU2l6ZSA9IHdCaXRTaXplID4+IDM7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh3T2JkQ29tbUluZGV4LAorCQkJCQkJCSAgIGJPYmRTdWJpbmRleCwKKwkJCQkJCQkgICAmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgbV9QcmVzLgorCQkJCQkJCSAgIG1fbGVfYWJQYXlsb2FkWyh3Qml0T2Zmc2V0ID4+IDMpXSwgT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gcHJvY2Vzc2luZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbEV2ZW50VHlwZVBkb1R4OgkvLyBUUERPIHRyYW5zbWl0dGVkCisJCXBGcmFtZUluZm8gPSAodEVwbEZyYW1lSW5mbyAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQlwRnJhbWUgPSBwRnJhbWVJbmZvLT5tX3BGcmFtZTsKKworCQkvLyBzZXQgVFBETyBpbnZhbGlkLCBzbyB0aGF0IG9ubHkgZnVsbHkgcHJvY2Vzc2VkIFRQRE9zIGFyZSBzZW50IGFzIHZhbGlkCisJCWJGcmFtZURhdGEgPQorCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYkZsYWcxKTsKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSwKKwkJCSAgICAgICAoYkZyYW1lRGF0YSAmIH5FUExfRlJBTUVfRkxBRzFfUkQpKTsKKworCQkvLyByZXRyaWV2ZSBFUEwgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVQcmVzKSB7CS8vIFRQRE8gaXMgUFJlcyBmcmFtZQorCQkJdWlOb2RlSWQgPSBFUExfUERPX1BSRVNfTk9ERV9JRDsJLy8gMHgwMAorCQl9IGVsc2UgewkvLyBUUERPIGlzIFBSZXEgZnJhbWUKKwkJCS8vIHJldHJpZXZlIG5vZGUgSUQKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpOworCQl9CisKKwkJLy8gc2VhcmNoIGZvciBhcHByb3ByaWF0ZSB2YWxpZCBUUERPIGluIE9ECisJCXdPYmRNYXBwSW5kZXggPSBFUExfUERPS19PQkRfSURYX1RYX01BUFBfUEFSQU07CisJCXdPYmRDb21tSW5kZXggPSBFUExfUERPS19PQkRfSURYX1RYX0NPTU1fUEFSQU07CisJCWZvciAod1Bkb0lkID0gMDs7IHdQZG9JZCsrLCB3T2JkQ29tbUluZGV4KyssIHdPYmRNYXBwSW5kZXgrKykgeworCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyByZWFkIG5vZGUgSUQgZnJvbSBPRAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZENvbW1JbmRleCwgMHgwMSwgJmJPYmREYXRhLAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKChSZXQgPT0ga0VwbE9iZEluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRJbGxlZ2FsUGFydCkpIHsJLy8gUERPIGRvZXMgbm90IGV4aXN0OyBsYXN0IFBETyByZWFjaGVkCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQlpZiAoYk9iZERhdGEgIT0gdWlOb2RlSWQpIHsJLy8gbm9kZSBJRCBkb2VzIG5vdCBlcXVhbCAtIHdyb25nIFBETywgdHJ5IG5leHQgUERPIGluIE9ECisJCQkJY29udGludWU7CisJCQl9CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzIGZyb20gT0Q7IHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBQRE8gaXMgdmFsaWQKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsIDB4MDAsICZiT2JqZWN0Q291bnQsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JqZWN0Q291bnQgPT0gMCkgewkvLyBQRE8gaW4gT0Qgbm90IHZhbGlkLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIHZhbGlkIFRQRE8gZm91bmQKKworCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyBnZXQgUERPIG1hcHBpbmcgdmVyc2lvbiBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAyLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJLy8gc2V0IFBETyB2ZXJzaW9uIGluIGZyYW1lCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYlBkb1ZlcnNpb24sCisJCQkJICAgICAgIGJPYmREYXRhKTsKKworCQkJLy8gY2FsY3VsYXRlIFBETyBzaXplCisJCQl3UGRvU2l6ZSA9IDA7CisKKwkJCS8vIHByb2Nlc3MgbWFwcGluZworCQkJZm9yIChiTWFwcFN1YmluZGV4ID0gMTsgYk1hcHBTdWJpbmRleCA8PSBiT2JqZWN0Q291bnQ7CisJCQkgICAgIGJNYXBwU3ViaW5kZXgrKykgeworCQkJCU9iZFNpemUgPSA4OwkvLyBRV09SRAorCQkJCS8vIHJlYWQgb2JqZWN0IG1hcHBpbmcgZnJvbSBPRAorCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkTWFwcEluZGV4LAorCQkJCQkJICAgIGJNYXBwU3ViaW5kZXgsCisJCQkJCQkgICAgJnF3T2JqZWN0TWFwcGluZywgJk9iZFNpemUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIGNoZWNrIGlmIG9iamVjdCBtYXBwaW5nIGVudHJ5IGlzIHZhbGlkLCBpLmUuIHVuZXF1YWwgemVybywgYmVjYXVzZSAiZW1wdHkiIGVudHJpZXMgYXJlIGFsbG93ZWQKKwkJCQlpZiAocXdPYmplY3RNYXBwaW5nID09IDApIHsJLy8gaW52YWxpZCBlbnRyeSwgY29udGludWUgd2l0aCBuZXh0IGVudHJ5CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyBkZWNvZGUgb2JqZWN0IG1hcHBpbmcKKwkJCQl3T2JkQ29tbUluZGV4ID0KKwkJCQkgICAgKFdPUkQpIChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgMHgwMDAwMDAwMDAwMDBGRkZGTEwpOworCQkJCWJPYmRTdWJpbmRleCA9CisJCQkJICAgIChCWVRFKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHgwMDAwMDAwMDAwRkYwMDAwTEwpID4+IDE2KTsKKwkJCQl3Qml0T2Zmc2V0ID0KKwkJCQkgICAgKFdPUkQpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDBGRkZGMDAwMDAwMDBMTCkgPj4gMzIpOworCQkJCXdCaXRTaXplID0KKwkJCQkgICAgKFdPUkQpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweEZGRkYwMDAwMDAwMDAwMDBMTCkgPj4gNDgpOworCisJCQkJLy8gY2FsY3VsYXRlIG1heCBQRE8gc2l6ZQorCQkJCU9iZFNpemUgPSB3Qml0U2l6ZSA+PiAzOworCQkJCXdWYXJTaXplID0gKHdCaXRPZmZzZXQgPj4gMykgKyAoV09SRCkgT2JkU2l6ZTsKKwkJCQlpZiAoKHVuc2lnbmVkIGludCkod1ZhclNpemUgKyAyNCkgPiBwRnJhbWVJbmZvLT5tX3VpRnJhbWVTaXplKSB7CS8vIFRQRE8gaXMgdG9vIHNob3J0CisJCQkJCS8vICQkJCByYWlzZSBQRE8gZXJyb3IsIHNldCBSZXQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQlpZiAod1ZhclNpemUgPiB3UGRvU2l6ZSkgewkvLyBtZW1vcml6ZSBuZXcgUERPIHNpemUKKwkJCQkJd1Bkb1NpemUgPSB3VmFyU2l6ZTsKKwkJCQl9CisJCQkJLy8gY29weSBvYmplY3QgZnJvbSBwcm9jZXNzL09EIHZhcmlhYmxlIHRvIFRQRE8KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRSZWFkRW50cnlUb0xlKHdPYmRDb21tSW5kZXgsCisJCQkJCQkJYk9iZFN1YmluZGV4LAorCQkJCQkJCSZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkJbV9sZV9hYlBheWxvYWRbKHdCaXRPZmZzZXQgPj4gMyldLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gc2V0IFBETyBzaXplIGluIGZyYW1lCisJCQlBbWlTZXRXb3JkVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUsCisJCQkJICAgICAgIHdQZG9TaXplKTsKKworCQkJUmV0ID0gRXBsUGRva0NhbEFyZVRwZG9zVmFsaWQoJmZWYWxpZCk7CisJCQlpZiAoZlZhbGlkICE9IEZBTFNFKSB7CisJCQkJLy8gc2V0IFRQRE8gdmFsaWQKKwkJCQliRnJhbWVEYXRhID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkgICAgICAgKGJGcmFtZURhdGEgfAorCQkJCQkJRVBMX0ZSQU1FX0ZMQUcxX1JEKSk7CisJCQl9CisJCQkvLyBwcm9jZXNzaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxFdmVudFR5cGVQZG9Tb2E6CS8vIFNvQSByZWNlaXZlZAorCisJCS8vIGludmFsaWRhdGUgVFBET3MKKwkJUmV0ID0gRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoRkFMU0UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXsKKwkJCUFTU0VSVE1TRyhGQUxTRSwKKwkJCQkgICJFcGxQZG9rUHJvY2VzcygpOiB1bmhhbmRsZWQgZXZlbnQgdHlwZSFcbiIpOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRva0NhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0YzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRva0NhbC5jCkBAIC0wLDAgKzEsMjY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBQRE8gQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsUGRva0NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTCBtX2ZUcGRvc1ZhbGlkOworCit9IHRFcGxQZG9rQ2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFBkb2tDYWxJbnN0YW5jZSBFcGxQZG9rQ2FsSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxBZGRJbnN0YW5jZSh2b2lkKQoreworCisJRVBMX01FTVNFVCgmRXBsUGRva0NhbEluc3RhbmNlX2csIDAsIHNpemVvZihFcGxQZG9rQ2FsSW5zdGFuY2VfZykpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZCgpCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsaWRpdHkgZmxhZyBmb3IgVFBET3MgdG8gdGhlCisvLyAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbHVlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBmVmFsaWRfcCAgICAgICAgICAgICAgICA9IHZhbGlkaXR5IGZsYWcKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoQk9PTCBmVmFsaWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRXBsUGRva0NhbEluc3RhbmNlX2cubV9mVHBkb3NWYWxpZCA9IGZWYWxpZF9wOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NhbEFyZVRwZG9zVmFsaWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbGlkaXR5IGZsYWcgZm9yIFRQRE9zLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZlZhbGlkX3AgICAgICAgICAgICAgICA9IE9VVDogdmFsaWRpdHkgZmxhZworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZChCT09MICogcGZWYWxpZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkqcGZWYWxpZF9wID0gRXBsUGRva0NhbEluc3RhbmNlX2cubV9mVHBkb3NWYWxpZDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG91LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IxMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG91LmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgdXNlciBQRE8gbW9kdWxlCisgICAgICAgICAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1vZHVsZSBqdXN0IGltcGxlbWVudHMgYSBPRCBjYWxsYmFjayBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHRvIGNoZWNrIGlmIHRoZSBQRE8gY29uZmlndXJhdGlvbiBpcyB2YWxpZC4KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG91LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKy8vI2luY2x1ZGUgInVzZXIvRXBsUGRvdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsUGRvdS5oIgorI2luY2x1ZGUgIkVwbFNkb0FjLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET1UpKSAhPSAwKQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkgJiYgKEVQTF9PQkRfVVNFX0tFUk5FTCA9PSBGQUxTRSkKKyNlcnJvciAiRVBMIFBET3UgbW9kdWxlIG5lZWRzIEVQTCBtb2R1bGUgT0JEVSBvciBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1JYX0NPTU1fUEFSQU0gIDB4MTQwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1JYX01BUFBfUEFSQU0gIDB4MTYwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1RYX0NPTU1fUEFSQU0gIDB4MTgwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1RYX01BUFBfUEFSQU0gIDB4MUEwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX01BUFBfUEFSQU0gICAgIDB4MDIwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX01BU0sgICAgICAgICAgIDB4RkYwMAorI2RlZmluZSBFUExfUERPVV9QRE9fSURfTUFTSyAgICAgICAgICAgIDB4MDBGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbFBkb3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eSh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wKTsKKworc3RhdGljIHZvaWQgRXBsUGRvdURlY29kZU9iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlTdWJJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUJpdE9mZnNldF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUJpdFNpemVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJCSAgICB0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGVfcCwKKwkJCQkJICAgIERXT1JEICogcGR3QWJvcnRDb2RlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgKnB1aVBkb1NpemVfcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91QWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb3VBZGRJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91RGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb3VEZWxJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91Q2JPYmRBY2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE9EIGFjY2Vzc2VzCisvLworLy8gUGFyYW1ldGVyczogIHBQYXJhbV9wICAgICAgICAgICAgICAgID0gT0JEIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsUGRvdUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpUGRvSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXhUeXBlOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiT2JqZWN0Q291bnQ7CisJUVdPUkQgcXdPYmplY3RNYXBwaW5nOworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZTsKKwlCWVRFIGJNYXBwU3ViaW5kZXg7CisJdW5zaWduZWQgaW50IHVpQ3VyUGRvU2l6ZTsKKwlXT1JEIHdNYXhQZG9TaXplOworCXVuc2lnbmVkIGludCB1aVN1YkluZGV4OworCisJLy8gZmV0Y2ggUERPIElECisJdWlQZG9JZCA9IHBQYXJhbV9wLT5tX3VpSW5kZXggJiBFUExfUERPVV9QRE9fSURfTUFTSzsKKworCS8vIGZldGNoIG9iamVjdCBpbmRleCB0eXBlCisJdWlJbmRleFR5cGUgPSBwUGFyYW1fcC0+bV91aUluZGV4ICYgRVBMX1BET1VfT0JEX0lEWF9NQVNLOworCisJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ICE9IGtFcGxPYmRFdlByZVdyaXRlKSB7CS8vIHJlYWQgYWNjZXNzZXMsIHBvc3Qgd3JpdGUgZXZlbnRzIGV0Yy4gYXJlIE9LCisJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBpbmRleCB0eXBlCisJc3dpdGNoICh1aUluZGV4VHlwZSkgeworCWNhc2UgRVBMX1BET1VfT0JEX0lEWF9SWF9DT01NX1BBUkFNOgorCQkvLyBSUERPIGNvbW11bmljYXRpb24gcGFyYW1ldGVyIGFjY2Vzc2VkCisJY2FzZSBFUExfUERPVV9PQkRfSURYX1RYX0NPTU1fUEFSQU06CisJCXsJCS8vIFRQRE8gY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXIgYWNjZXNzZWQKKwkJCVJldCA9IEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHBQYXJhbV9wLAorCQkJCQkJICAgICAgKEVQTF9QRE9VX09CRF9JRFhfTUFQUF9QQVJBTQorCQkJCQkJICAgICAgIHwgcFBhcmFtX3AtPm1fdWlJbmRleCkpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBQRE8gaXMgdmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJY2FzZSBFUExfUERPVV9PQkRfSURYX1JYX01BUFBfUEFSQU06CisJCXsJCS8vIFJQRE8gbWFwcGluZyBwYXJhbWV0ZXIgYWNjZXNzZWQKKworCQkJQWNjZXNzVHlwZSA9IGtFcGxPYmRBY2NXcml0ZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfVFhfTUFQUF9QQVJBTToKKwkJewkJLy8gVFBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJCQlBY2Nlc3NUeXBlID0ga0VwbE9iZEFjY1JlYWQ7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJewkJLy8gdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBvbmx5IGZvcgorCQkJLy8gUERPIG1hcHBpbmcgYW5kIGNvbW11bmljYXRpb24gcGFyYW1ldGVycworCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIFJQRE8gYW5kIFRQRE8gbWFwcGluZyBwYXJhbWV0ZXIgYWNjZXNzZWQKKworCWlmIChwUGFyYW1fcC0+bV91aVN1YkluZGV4ID09IDApIHsJLy8gb2JqZWN0IG1hcHBpbmcgY291bnQgYWNjZXNzZWQKKworCQkvLyBQRE8gaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorCQliT2JqZWN0Q291bnQgPSAqKChCWVRFICopIHBQYXJhbV9wLT5tX3BBcmcpOworCisJCWlmIChiT2JqZWN0Q291bnQgPT0gMCkgewkvLyBQRE8gc2hhbGwgYmUgZGlzYWJsZWQKKworCQkJLy8gdGhhdCBpcyBhbHdheXMgcG9zc2libGUKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBQRE8gc2hhbGwgYmUgZW5hYmxlZAorCQkvLyBpdCBzaG91bGQgaGF2ZSBiZWVuIGRpc2FibGVkIGZvciB0aGlzIG9wZXJhdGlvbgorCQlSZXQgPSBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eShwUGFyYW1fcCwgcFBhcmFtX3AtPm1fdWlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gUERPIGlzIHZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoQWNjZXNzVHlwZSA9PSBrRXBsT2JkQWNjV3JpdGUpIHsKKwkJCXVpU3ViSW5kZXggPSAweDA0OwkvLyBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCQl9IGVsc2UgeworCQkJdWlTdWJJbmRleCA9IDB4MDU7CS8vIFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJCX0KKworCQkvLyBmZXRjaCBtYXhpbXVtIFBETyBzaXplIGZyb20gT2JqZWN0IDFGOThoOiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJCU9iZFNpemUgPSBzaXplb2Yod01heFBkb1NpemUpOworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOTgsIHVpU3ViSW5kZXgsICZ3TWF4UGRvU2l6ZSwKKwkJCQkgICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIGNoZWNrIGFsbCBvYmplY3RtYXBwaW5ncworCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJICAgICBiTWFwcFN1YmluZGV4KyspIHsKKwkJCS8vIHJlYWQgb2JqZWN0IG1hcHBpbmcgZnJvbSBPRAorCQkJT2JkU2l6ZSA9IHNpemVvZihxd09iamVjdE1hcHBpbmcpOwkvLyBRV09SRAorCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeShwUGFyYW1fcC0+bV91aUluZGV4LAorCQkJCQkgICAgICAgYk1hcHBTdWJpbmRleCwgJnF3T2JqZWN0TWFwcGluZywKKwkJCQkJICAgICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gY2hlY2sgb2JqZWN0IG1hcHBpbmcKKwkJCVJldCA9IEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcocXdPYmplY3RNYXBwaW5nLAorCQkJCQkJCUFjY2Vzc1R5cGUsCisJCQkJCQkJJnBQYXJhbV9wLT4KKwkJCQkJCQltX2R3QWJvcnRDb2RlLAorCQkJCQkJCSZ1aUN1clBkb1NpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBpbGxlZ2FsIG9iamVjdCBtYXBwaW5nCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAodWlDdXJQZG9TaXplID4gd01heFBkb1NpemUpIHsJLy8gbWFwcGluZyBleGNlZWRzIG9iamVjdCBzaXplCisJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCQl9CisKKwkJfQorCisJfSBlbHNlIHsJCS8vIE9iamVjdE1hcHBpbmcKKwkJUmV0ID0gRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkocFBhcmFtX3AsIHBQYXJhbV9wLT5tX3VpSW5kZXgpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIFBETyBpcyB2YWxpZCBvciBkb2VzIG5vdCBleGlzdAorCQkJZ290byBFeGl0OworCQl9CisJCS8vIGNoZWNrIGV4aXN0ZW5jZSBvZiBvYmplY3QgYW5kIHZhbGlkaXR5IG9mIG9iamVjdCBsZW5ndGgKKworCQlxd09iamVjdE1hcHBpbmcgPSAqKChRV09SRCAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKworCQlSZXQgPSBFcGxQZG91Q2hlY2tPYmplY3RNYXBwaW5nKHF3T2JqZWN0TWFwcGluZywKKwkJCQkJCUFjY2Vzc1R5cGUsCisJCQkJCQkmcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUsCisJCQkJCQkmdWlDdXJQZG9TaXplKTsKKworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2sgaWYgUERPIGlzIHZhbGlkCisvLworLy8gUGFyYW1ldGVyczogIHBQYXJhbV9wICAgICAgICAgICAgICAgID0gT0JEIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkodEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3AsCisJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiT2JqZWN0Q291bnQ7CisKKwlPYmRTaXplID0gMTsKKwkvLyByZWFkIG51bWJlciBvZiBtYXBwZWQgb2JqZWN0cyBmcm9tIE9EOyB0aGlzIGluZGljYXRlcyBpZiB0aGUgUERPIGlzIHZhbGlkCisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSh1aUluZGV4X3AsIDB4MDAsICZiT2JqZWN0Q291bnQsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkgICAgRVBMX1NET0FDX0dFTl9JTlRFUk5BTF9JTkNPTVBBVElCSUxJVFk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwlpZiAoYk9iamVjdENvdW50ICE9IDApIHsJLy8gUERPIGluIE9EIGlzIHN0aWxsIHZhbGlkCisJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTl9QQVJBTV9JTkNPTVBBVElCSUxJVFk7CisJCVJldCA9IGtFcGxQZG9Ob3RFeGlzdDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZworLy8KKy8vIERlc2NyaXB0aW9uOiBkZWNvZGVzIHRoZSBnaXZlbiBvYmplY3QgbWFwcGluZyBlbnRyeSBpbnRvIGluZGV4LCBzdWJpbmRleCwKKy8vICAgICAgICAgICAgICBiaXQgb2Zmc2V0IGFuZCBiaXQgc2l6ZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcXdPYmplY3RNYXBwaW5nX3AgICAgICAgPSBvYmplY3QgbWFwcGluZyBlbnRyeQorLy8gICAgICAgICAgICAgIHB1aUluZGV4X3AgICAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBvYmplY3QgaW5kZXgKKy8vICAgICAgICAgICAgICBwdWlTdWJJbmRleF9wICAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gc3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwdWlCaXRPZmZzZXRfcCAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gYml0IG9mZnNldAorLy8gICAgICAgICAgICAgIHB1aUJpdFNpemVfcCAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBiaXQgc2l6ZQorLy8KKy8vIFJldHVybnM6ICAgICAodm9pZCkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aVN1YkluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0T2Zmc2V0X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0U2l6ZV9wKQoreworCSpwdWlJbmRleF9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKHF3T2JqZWN0TWFwcGluZ19wICYgMHgwMDAwMDAwMDAwMDBGRkZGTEwpOworCisJKnB1aVN1YkluZGV4X3AgPSAodW5zaWduZWQgaW50KQorCSAgICAoKHF3T2JqZWN0TWFwcGluZ19wICYgMHgwMDAwMDAwMDAwRkYwMDAwTEwpID4+IDE2KTsKKworCSpwdWlCaXRPZmZzZXRfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDBGRkZGMDAwMDAwMDBMTCkgPj4gMzIpOworCisJKnB1aUJpdFNpemVfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweEZGRkYwMDAwMDAwMDAwMDBMTCkgPj4gNDgpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBnaXZlbiBvYmplY3QgbWFwcGluZyBlbnRyeS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcXdPYmplY3RNYXBwaW5nX3AgICAgICAgPSBvYmplY3QgbWFwcGluZyBlbnRyeQorLy8gICAgICAgICAgICAgIEFjY2Vzc1R5cGVfcCAgICAgICAgICAgID0gYWNjZXNzIHR5cGUgdG8gbWFwcGVkIG9iamVjdDoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlID0gUlBETyBhbmQgcmVhZCA9IFRQRE8KKy8vICAgICAgICAgICAgICBwdWlQZG9TaXplX3AgICAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gY292ZXJlZCBQRE8gc2l6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldCArIHNpemUpIGluIGJ5dGU7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG1hcHBpbmcgZmFpbGVkCisvLyAgICAgICAgICAgICAgcGR3QWJvcnRDb2RlX3AgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIFNETyBhYm9ydCBjb2RlOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBtYXBwaW5nIGlzIHBvc3NpYmxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJCSAgICB0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGVfcCwKKwkJCQkJICAgIERXT1JEICogcGR3QWJvcnRDb2RlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgKnB1aVBkb1NpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IHVpQml0T2Zmc2V0OworCXVuc2lnbmVkIGludCB1aUJpdFNpemU7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCUJPT0wgZk51bWVyaWNhbDsKKworCWlmIChxd09iamVjdE1hcHBpbmdfcCA9PSAwKSB7CS8vIGRpc2NhcmQgemVybyB2YWx1ZQorCQkqcHVpUGRvU2l6ZV9wID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkZWNvZGUgb2JqZWN0IG1hcHBpbmcKKwlFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAmdWlJbmRleCwKKwkJCQkgICAmdWlTdWJJbmRleCwgJnVpQml0T2Zmc2V0LCAmdWlCaXRTaXplKTsKKworCWlmICgodWlCaXRPZmZzZXQgJiAweDcpICE9IDB4MCkgewkvLyBiaXQgbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvR3JhbnVsYXJpdHlNaXNtYXRjaDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgodWlCaXRTaXplICYgMHg3KSAhPSAweDApIHsJLy8gYml0IG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZAorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJUmV0ID0ga0VwbFBkb0dyYW51bGFyaXR5TWlzbWF0Y2g7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgYWNjZXNzIHR5cGUKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YkluZGV4LCAmQWNjZXNzVHlwZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlbnRyeSBkb2Vzbid0IGV4aXN0CisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1BkbykgPT0gMCkgewkvLyBvYmplY3QgaXMgbm90IG1hcHBhYmxlCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX01BUFBBQkxFOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKEFjY2Vzc1R5cGUgJiBBY2Nlc3NUeXBlX3ApID09IDApIHsJLy8gb2JqZWN0IGlzIG5vdCB3cml0ZWFibGUgKFJQRE8pIG9yIHJlYWRhYmxlIChUUERPKSByZXNwZWN0aXZlbHkKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEU7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBFcGxPYmR1R2V0RGF0YVNpemUodWlJbmRleCwgdWlTdWJJbmRleCk7CisJaWYgKE9iZFNpemUgPCAodWlCaXRTaXplID4+IDMpKSB7CS8vIG9iamVjdCBkb2VzIG5vdCBleGlzdCBvciBoYXMgc21hbGxlciBzaXplCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJfQorCisJUmV0ID0gRXBsT2JkdUlzTnVtZXJpY2FsKHVpSW5kZXgsIHVpU3ViSW5kZXgsICZmTnVtZXJpY2FsKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKGZOdW1lcmljYWwgIT0gRkFMU0UpCisJICAgICYmICgodWlCaXRTaXplID4+IDMpICE9IE9iZFNpemUpKSB7CisJCS8vIG9iamVjdCBpcyBudW1lcmljYWwsCisJCS8vIHRoZXJlZm9yIHNpemUgaGFzIHRvIGZpdCwgYnV0IGl0IGRvZXMgbm90LgorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJUmV0ID0ga0VwbFBkb1Zhck5vdEZvdW5kOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNhbHVjYWxlZCBuZWVkZWQgUERPIHNpemUKKwkqcHVpUGRvU2l6ZV9wID0gKHVpQml0T2Zmc2V0ID4+IDMpICsgKHVpQml0U2l6ZSA+PiAzKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiM2YyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGFwaSBmdW5jdGlvbiBvZiB0aGUgc2RvIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkby5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsRnJhbWUuaCIKKyNpbmNsdWRlICJFcGxTZG9BYy5oIgorCisjaWZuZGVmIF9FUExTRE9fSF8KKyNkZWZpbmUgX0VQTFNET19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBkZWZpbmVzCisjaWZuZGVmIEVQTF9TRE9fTUFYX1BBWUxPQUQKKyNkZWZpbmUgRVBMX1NET19NQVhfUEFZTE9BRCAgICAgMjU2CisjZW5kaWYKKworLy8gaGFuZGxlIGJldHdlZW4gUHJvdG9jb2wgQWJzdHJhY3Rpb24gTGF5ZXIgYW5kIGFzeW5jaHJvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKyNkZWZpbmUgRVBMX1NET19VRFBfSEFORExFICAgICAgMHg4MDAwCisjZGVmaW5lIEVQTF9TRE9fQVNORF9IQU5ETEUgICAgIDB4NDAwMAorI2RlZmluZSBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSyAweEMwMDAKKyNkZWZpbmUgRVBMX1NET19BU1lfSU5WQUxJRF9IREwgMHgzRkZGCisKKy8vIGhhbmRsZSBiZXR3ZWVuICBTRE8gU2VxdWVuY2UgTGF5ZXIgYW5kIHNkbyBjb21tYW5kIGxheWVyCisjZGVmaW5lIEVQTF9TRE9fQVNZX0hBTkRMRSAgICAgIDB4ODAwMAorI2RlZmluZSBFUExfU0RPX1BET19IQU5ETEUgICAgICAweDQwMDAKKyNkZWZpbmUgRVBMX1NET19TRVFfSEFORExFX01BU0sgMHhDMDAwCisjZGVmaW5lIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMIDB4M0ZGRgorCisjZGVmaW5lIEVQTF9BU05EX0hFQURFUl9TSVpFICAgICAgICA0CisvLyNkZWZpbmUgRVBMX1NFUV9IRUFERVJfU0laRSAgICAgICAgIDQKKyNkZWZpbmUgRVBMX0VUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0CisKKyNkZWZpbmUgRVBMX1NFUV9OVU1fTUFTSyAgICAgICAgICAgIDB4RkMKKworLy8gc2l6ZSBmb3Igc2VuZCBidWZmZXIgYW5kIGhpc3RvcnkKKyNkZWZpbmUgRVBMX01BWF9TRE9fRlJBTUVfU0laRSAgICAgIEVQTF9DX0lQX01JTl9NVFUKKy8vIHNpemUgZm9yIHJlY2VpdmUgZnJhbWUKKy8vIC0+IG5lZWRlZCBiZWNhdXNlIFNORC1LaXQgc2VuZHMgdXAgdG8gMTUxOCBCeXRlCisvLyAgICB3aXRob3V0IFNkby1Db21tYW5kOiBNYXhpbXVtIFNlZ21lbnQgU2l6ZQorI2RlZmluZSBFUExfTUFYX1NET19SRUNfRlJBTUVfU0laRSAgRVBMX0NfSVBfTUFYX01UVQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGhhbmRsZSBiZXR3ZWVuIFByb3RvY29sIEFic3RyYWN0aW9uIExheWVyIGFuZCBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsU2RvQ29uSGRsOworCisvLyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIGZvciBQcm90b2NvbCBBYnN0cmFjdGlvbiBMYXllciB0byBjYWxsCisvLyBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFNlcXVMYXllclJlY2VpdmVDYikgKHRFcGxTZG9Db25IZGwgQ29uSGRsX3AsCisJCQkJCQkgICAgIHRFcGxBc3lTZG9TZXEgKgorCQkJCQkJICAgICBwU2RvU2VxRGF0YV9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworLy8gaGFuZGxlIGJldHdlZW4gYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciBhbmQgU0RPIENvbW1hbmQgbGF5ZXIKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9TZXFDb25IZGw7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIgdG8gY2FsbAorLy8gU0RPIENvbW1hbmQgbGF5ZXIgZm9yIHJlY2VpdmVkIGRhdGEKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsU2RvQ29tUmVjZWl2ZUNiKSAodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworLy8gc3RhdHVzIG9mIGNvbm5lY3Rpb24KK3R5cGVkZWYgZW51bSB7CisJa0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkID0gMHgwMCwKKwlrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IgPSAweDAxLAorCWtBc3lTZG9Db25TdGF0ZUNvbkNsb3NlZCA9IDB4MDIsCisJa0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQgPSAweDAzLAorCWtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkID0gMHgwNCwKKwlrQXN5U2RvQ29uU3RhdGVUaW1lb3V0ID0gMHgwNQorfSB0RXBsQXN5U2RvQ29uU3RhdGU7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIgdG8gY2FsbAorLy8gU0RPIENvbW1hbmQgbGF5ZXIgZm9yIGNvbm5lY3Rpb24gc3RhdHVzCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFNkb0NvbUNvbkNiKSAodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvblN0YXRlCisJCQkJCSAgICAgIEFzeVNkb0NvblN0YXRlX3ApOworCisvLyBoYW5kbGUgYmV0d2VlbiAgU0RPIENvbW1hbmQgbGF5ZXIgYW5kIGFwcGxpY2F0aW9uCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsU2RvQ29tQ29uSGRsOworCisvLyBzdGF0dXMgb2YgY29ubmVjdGlvbgordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvQ29tVHJhbnNmZXJOb3RBY3RpdmUgPSAweDAwLAorCWtFcGxTZG9Db21UcmFuc2ZlclJ1bm5pbmcgPSAweDAxLAorCWtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCA9IDB4MDIsCisJa0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkID0gMHgwMywKKwlrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCA9IDB4MDQsCisJa0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0ID0gMHgwNQorfSB0RXBsU2RvQ29tQ29uU3RhdGU7CisKKy8vIFNETyBTZXJ2aWNlcyBhbmQgQ29tbWFuZC1JZHMgZnJvbSBEUyAxLjAuMCBwLjE1MgordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvU2VydmljZU5JTCA9IDB4MDAsCisJa0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXggPSAweDAxLAorCWtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXggPSAweDAyCisJICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgLy8gdGhlIGZvbGxvd2luZyBzZXJ2aWNlcyBhcmUgb3B0aW9uYWwgYW5kCisJICAgIC8vIG5vdCBzdXBwb3J0ZWQgbm93CisvKgorICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVBbGxCeUluZGV4ICAgPSAweDAzLAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEFsbEJ5SW5kZXggICAgPSAweDA0LAorICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeU5hbWUgICAgICAgPSAweDA1LAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5TmFtZSAgICAgICAgPSAweDA2LAorCisgICAga0VwbFNkb1NlcnZpY2VGaWxlV3JpdGUgICAgICAgICA9IDB4MjAsCisgICAga0VwbFNkb1NlcnZpY2VGaWxlUmVhZCAgICAgICAgICA9IDB4MjEsCisKKyAgICBrRXBsU2RvU2VydmljZVdyaXRlTXVsdGlCeUluZGV4ID0gMHgzMSwKKyAgICBrRXBsU2RvU2VydmljZVJlYWRNdWx0aUJ5SW5kZXggID0gMHgzMiwKKworICAgIGtFcGxTZG9TZXJ2aWNlTWF4U2VnU2l6ZSAgICAgICAgPSAweDcwCisKKyAgICAvLyAweDgwIC0gMHhGRiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMKKworICovCit9IHRFcGxTZG9TZXJ2aWNlVHlwZTsKKworLy8gZGVzY3JpYmVzIGlmIHJlYWQgb3Igd3JpdGUgYWNjZXNzCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9BY2Nlc3NUeXBlUmVhZCA9IDB4MDAsCisJa0VwbFNkb0FjY2Vzc1R5cGVXcml0ZSA9IDB4MDEKK30gdEVwbFNkb0FjY2Vzc1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb1R5cGVBdXRvID0gMHgwMCwKKwlrRXBsU2RvVHlwZVVkcCA9IDB4MDEsCisJa0VwbFNkb1R5cGVBc25kID0gMHgwMiwKKwlrRXBsU2RvVHlwZVBkbyA9IDB4MDMKK30gdEVwbFNkb1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb1RyYW5zQXV0byA9IDB4MDAsCisJa0VwbFNkb1RyYW5zRXhwZWRpdGVkID0gMHgwMSwKKwlrRXBsU2RvVHJhbnNTZWdtZW50ZWQgPSAweDAyCit9IHRFcGxTZG9UcmFuc1R5cGU7CisKKy8vIHN0cnVjdHVyZSB0byBpbmZvcm0gYXBwbGljYXRpb24gYWJvdXQgZmluaXNoIG9mIFNETyB0cmFuc2ZlcgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db21Db25IZGwgbV9TZG9Db21Db25IZGw7CisJdEVwbFNkb0NvbUNvblN0YXRlIG1fU2RvQ29tQ29uU3RhdGU7CisJRFdPUkQgbV9kd0Fib3J0Q29kZTsKKwl0RXBsU2RvQWNjZXNzVHlwZSBtX1Nkb0FjY2Vzc1R5cGU7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIE5vZGVJZCBvZiB0aGUgdGFyZ2V0CisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRJbmRleDsJLy8gaW5kZXggd2hpY2ggd2FzIGFjY2Vzc2VkCisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRTdWJJbmRleDsJLy8gc3ViaW5kZXggd2hpY2ggd2FzIGFjY2Vzc2VkCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc2ZlcnJlZEJ5dGU7CS8vIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZAorCXZvaWQgKm1fcFVzZXJBcmc7CS8vIHVzZXIgZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIKKworfSB0RXBsU2RvQ29tRmluaXNoZWQ7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgdG8gaW5mb3JtIGFwcGxpY2F0aW9uIGFib3V0IGNvbm5lY3Rpb24KK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2RvRmluaXNoZWRDYikgKHRFcGxTZG9Db21GaW5pc2hlZCAqCisJCQkJCQlwU2RvQ29tRmluaXNoZWRfcCk7CisKKy8vIHN0cnVjdHVyZSB0byBpbml0IFNETyB0cmFuc2ZlciB0byBSZWFkIG9yIFdyaXRlIGJ5IEluZGV4Cit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdm9pZCAqbV9wRGF0YTsKKwl1bnNpZ25lZCBpbnQgbV91aURhdGFTaXplOworCXVuc2lnbmVkIGludCBtX3VpVGltZW91dDsJLy8gbm90IHVzZWQgaW4gdGhpcyB2ZXJzaW9uCisJdEVwbFNkb0FjY2Vzc1R5cGUgbV9TZG9BY2Nlc3NUeXBlOworCXRFcGxTZG9GaW5pc2hlZENiIG1fcGZuU2RvRmluaXNoZWRDYjsKKwl2b2lkICptX3BVc2VyQXJnOwkvLyB1c2VyIGRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyCisKK30gdEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9BYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9BYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGZiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgU0RPIEFib3J0IGNvZGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQWMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8zMCBrLnQuOiBmaXJzdCBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExTRE9BQ19IXworI2RlZmluZSBfRVBMU0RPQUNfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU0RPIGFib3J0IGNvZGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgICAgRVBMX1NET0FDX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwNDAwMDBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19VTktOT1dOX0NPTU1BTkRfU1BFQ0lGSUVSICAgICAgICAgICAweDA1MDQwMDAxTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9CTE9DS19TSVpFICAgICAgICAgICAgICAgICAgMHgwNTA0MDAwMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0lOVkFMSURfU0VRVUVOQ0VfTlVNQkVSICAgICAgICAgICAgIDB4MDUwNDAwMDNMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAweDA1MDQwMDA1TAorI2RlZmluZSAgICBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTICAgICAgICAgICAgICAgICAgMHgwNjAxMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1JFQURfVE9fV1JJVEVfT05MWV9PQkogICAgICAgICAgICAgIDB4MDYwMTAwMDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19XUklURV9UT19SRUFEX09OTFlfT0JKICAgICAgICAgICAgICAweDA2MDEwMDAyTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgMHgwNjAyMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEUgICAgICAgICAgICAgICAgIDB4MDYwNDAwNDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19QRE9fTEVOR1RIX0VYQ0VFREVEICAgICAgICAgICAgICAgICAweDA2MDQwMDQyTAorI2RlZmluZSAgICBFUExfU0RPQUNfR0VOX1BBUkFNX0lOQ09NUEFUSUJJTElUWSAgICAgICAgICAgMHgwNjA0MDA0M0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX0lOVkFMSURfSEVBUlRCRUFUX0RFQyAgICAgICAgICAgICAgIDB4MDYwNDAwNDRMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5fSU5URVJOQUxfSU5DT01QQVRJQklMSVRZICAgICAgICAweDA2MDQwMDQ3TAorI2RlZmluZSAgICBFUExfU0RPQUNfQUNDRVNTX0ZBSUxFRF9EVUVfSFdfRVJST1IgICAgICAgICAgMHgwNjA2MDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfTk9UX01BVENIICAgICAgICAgIDB4MDYwNzAwMTBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19ISUdIICAgICAgICAgICAweDA2MDcwMDEyTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9UT09fTE9XICAgICAgICAgICAgMHgwNjA3MDAxM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX1NVQl9JTkRFWF9OT1RfRVhJU1QgICAgICAgICAgICAgICAgIDB4MDYwOTAwMTFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9FWENFRURFRCAgICAgICAgICAgICAgICAweDA2MDkwMDMwTAorI2RlZmluZSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0hJR0ggICAgICAgICAgICAgICAgMHgwNjA5MDAzMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX1RPT19MT1cgICAgICAgICAgICAgICAgIDB4MDYwOTAwMzJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19NQVhfVkFMVUVfTEVTU19NSU5fVkFMVUUgICAgICAgICAgICAweDA2MDkwMDM2TAorI2RlZmluZSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfTk9UX1RSQU5TRl9PUl9TVE9SRUQgICAgICAgICAgIDB4MDgwMDAwMjBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX05PVF9UUkFOU0ZfRFVFX0xPQ0FMX0NPTlRST0wgICAweDA4MDAwMDIxTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9OT1RfVFJBTlNGX0RVRV9ERVZJQ0VfU1RBVEUgICAgMHgwODAwMDAyMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX09CSkVDVF9ESUNUSU9OQVJZX05PVF9FWElTVCAgICAgICAgIDB4MDgwMDAwMjNMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19DT05GSUdfREFUQV9FTVBUWSAgICAgICAgICAgICAgICAgICAweDA4MDAwMDI0TAorCisjZW5kaWYgLy8gX0VQTFNET0FDX0hfCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc25kdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc25kdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTAwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU0RPL0FzbmQtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0FzbmR1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNyBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxTZG9Bc25kdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05ECisjZGVmaW5lIEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCA1CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbnN0YW5jZSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX2F1aVNkb0FzbmRDb25uZWN0aW9uW0VQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORF07CisJdEVwbFNlcXVMYXllclJlY2VpdmVDYiBtX2ZwU2RvQXN5U2VxQ2I7CisKK30gdEVwbFNkb0FzbmRJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxTZG9Bc25kSW5zdGFuY2UgU2RvQXNuZEluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUNiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFUEwgU0RPLUFzbmQgUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllcj4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFUEwgU0RPLUFzbmQgUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllcgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQXNuZHVBZGRJbnN0YW5jZShmcFJlY2VpdmVDYl9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgY29udHJvbCBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZTZG9Bc25kSW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKFNkb0FzbmRJbnN0YW5jZV9nKSk7CisKKwkvLyBzYXZlIHBvaW50ZXIgdG8gY2FsbGJhY2stZnVuY3Rpb24KKwlpZiAoZnBSZWNlaXZlQ2JfcCAhPSBOVUxMKSB7CisJCVNkb0FzbmRJbnN0YW5jZV9nLm1fZnBTZG9Bc3lTZXFDYiA9IGZwUmVjZWl2ZUNiX3A7CisJfSBlbHNlIHsKKwkJUmV0ID0ga0VwbFNkb1VkcE1pc3NDYjsKKwl9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU2RvLAorCQkJCSAgICAgICBFcGxTZG9Bc25kdUNiLCBrRXBsRGxsQXNuZEZpbHRlckxvY2FsKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8gICAgICAgICAgICAgIGRlbCBzb2NrZXQgYW5kIGRlbCBMaXN0ZW4tVGhyZWFkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJLy8gZGVyZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIERMTAorCVJldCA9IEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZFNkbywKKwkJCQkgICAgICAgTlVMTCwga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVJbml0Q29uCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgYSBuZXcgY29ubmVjdAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db25IYW5kbGVfcCA9IHBvaW50ZXIgZm9yIHRoZSBuZXcgY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aVRhcmdldE5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSB0YXJnZXQgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUNvbjsKKwl1bnNpZ25lZCBpbnQgKnB1aUNvbm5lY3Rpb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgodWlUYXJnZXROb2RlSWRfcCA9PSBFUExfQ19BRFJfSU5WQUxJRCkKKwkgICAgfHwgKHVpVGFyZ2V0Tm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbFNkb0FzbmRJbnZhbGlkTm9kZUlkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBmcmVlIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EOworCXB1aUNvbm5lY3Rpb24gPSAmU2RvQXNuZEluc3RhbmNlX2cubV9hdWlTZG9Bc25kQ29ubmVjdGlvblswXTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlpZiAoKnB1aUNvbm5lY3Rpb24gPT0gdWlUYXJnZXROb2RlSWRfcCkgewkvLyBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRhcmdldCBub2RlIGZvdW5kCisJCQkvLyBzYXZlIGhhbmRsZSBmb3IgaGlnaGVyIGxheWVyCisJCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpQ291bnQgfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQkJZ290byBFeGl0OworCQl9IGVsc2UgaWYgKCpwdWlDb25uZWN0aW9uID09IDApIHsJLy8gZnJlZSBlbnRyeS0+IHNhdmUgdGFyZ2V0IG5vZGVJZAorCQkJdWlGcmVlQ29uID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXB1aUNvbm5lY3Rpb24rKzsKKwl9CisKKwlpZiAodWlGcmVlQ29uID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQkvLyBubyBmcmVlIGNvbm5lY3Rpb24KKwkJUmV0ID0ga0VwbFNkb0FzbmROb0ZyZWVIYW5kbGU7CisJfSBlbHNlIHsKKwkJcHVpQ29ubmVjdGlvbiA9CisJCSAgICAmU2RvQXNuZEluc3RhbmNlX2cubV9hdWlTZG9Bc25kQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkqcHVpQ29ubmVjdGlvbiA9IHVpVGFyZ2V0Tm9kZUlkX3A7CisJCS8vIHNhdmUgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUZyZWVDb24gfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1U2VuZERhdGEKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZCBkYXRhIHVzaW5nIGV4aXNpdGluZyBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSBwb2ludGVyIHRvIGRhdGEKKy8vICAgICAgICAgICAgICBkd0RhdGFTaXplX3AgICAgPSBudW1iZXIgb2YgZGF0YWJ5dGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgYXNuZC1oZWFkZXIhISEKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgIERXT1JEIGR3RGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKwl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisKKwlpZiAodWlBcnJheSA+IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZmlsbG91dCBBc25kIGhlYWRlcgorCS8vIG93biBub2RlIGlkIG5vdCBuZWVkZWQgLT4gZmlsbGVkIGJ5IERMTAorCisJLy8gc2V0IG1lc3NhZ2UgdHlwZQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwgKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCk7CS8vIEFTbmQgPT0gMHgwNgorCS8vIHRhcmdldCBub2RlIGlkCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYkRzdE5vZGVJZCwKKwkJICAgICAgIChCWVRFKSBTZG9Bc25kSW5zdGFuY2VfZy4KKwkJICAgICAgIG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlBcnJheV0pOworCS8vIHNldCBzb3VyY2Utbm9kZWlkIChmaWxsZWQgYnkgRExMIDApCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYlNyY05vZGVJZCwgMHgwMCk7CisKKwkvLyBjYWxjIHNpemUKKwlkd0RhdGFTaXplX3AgKz0gRVBMX0FTTkRfSEVBREVSX1NJWkU7CisKKwkvLyBzZW5kIGZ1bmN0aW9uIG9mIERMTAorCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gZHdEYXRhU2l6ZV9wOworCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBTcmNEYXRhX3A7CisJRVBMX01FTVNFVCgmRnJhbWVJbmZvLm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKHRFcGxOZXRUaW1lKSk7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBc3luY1NlbmQoJkZyYW1lSW5mbywga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMpOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdURlbENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgY29ubmVjdGlvbiBmcm9tIGludGVybiBzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHVpQXJyYXkgPiBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJUmV0ID0ga0VwbFNkb0FzbmRJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCB0YXJnZXQgbm9kZUlkIHRvIDAKKwlTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpQXJyYXldID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVDYgorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIEFTbmQgZnJhbWVzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IEZyYW1lIHdpdGggU0RPIHBheWxvYWQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUNiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgKnB1aUNvbm5lY3Rpb247CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyeSA9IDB4RkZGRjsKKwl0RXBsU2RvQ29uSGRsIFNkb0NvbkhkbDsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKworCXBGcmFtZSA9IHBGcmFtZUluZm9fcC0+bV9wRnJhbWU7CisKKwl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCS8vIHNlYXJjaCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJcHVpQ29ubmVjdGlvbiA9ICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uWzBdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICh1aU5vZGVJZCA9PSAqcHVpQ29ubmVjdGlvbikgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKCpwdWlDb25uZWN0aW9uID09IDApCisJCQkgICAmJiAodWlGcmVlRW50cnkgPT0gMHhGRkZGKSkgewkvLyBmcmVlIGVudHJ5CisJCQl1aUZyZWVFbnRyeSA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwdWlDb25uZWN0aW9uKys7CisJfQorCisJaWYgKHVpQ291bnQgPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICh1aUZyZWVFbnRyeSAhPSAweEZGRkYpIHsKKwkJCXB1aUNvbm5lY3Rpb24gPQorCQkJICAgICZTZG9Bc25kSW5zdGFuY2VfZy4KKwkJCSAgICBtX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpRnJlZUVudHJ5XTsKKwkJCSpwdWlDb25uZWN0aW9uID0gdWlOb2RlSWQ7CisJCQl1aUNvdW50ID0gdWlGcmVlRW50cnk7CisJCX0gZWxzZSB7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAKKwkJCSAgICAoIkVwbFNkb0FzbmR1Q2IoKTogbm8gZnJlZSBoYW5kbGVcbiIpOworCQkJZ290byBFeGl0OworCQl9CisJfQorLy8gICAgaWYgKHVpTm9kZUlkID09ICpwdWlDb25uZWN0aW9uKQorCXsJCQkvLyBlbnRyeSBmb3VuZCBvciBjcmVhdGVkCisJCVNkb0NvbkhkbCA9ICh1aUNvdW50IHwgRVBMX1NET19BU05EX0hBTkRMRSk7CisKKwkJU2RvQXNuZEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiKFNkb0NvbkhkbCwKKwkJCQkJCSAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgbV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZSwKKwkJCQkJCSAgKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSAtCisJCQkJCQkgICAxOCkpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXN5U2VxdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxYzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXN5U2VxdS5jCkBAIC0wLDAgKzEsMjUyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBhc3ljaHJvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXN5U2VxdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzeVNlcXUuaCIKKworI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSA9PSAwKSAmJlwKKyAgICAgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpID09IDApICAgKQorCisjZXJyb3IgJ0VSUk9SOiBBdCBsZWFzdCBVRFAgb3IgQXNuZCBtb2R1bGUgbmVlZGVkIScKKworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfU0RPX0hJU1RPUllfU0laRSAgICAgICAgNQorCisjaWZuZGVmIEVQTF9NQVhfU0RPX1NFUV9DT04KKyNkZWZpbmUgRVBMX01BWF9TRE9fU0VRX0NPTiAgICAgICAgIDEwCisjZW5kaWYKKworI2RlZmluZSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCAgICAgNTAwMAkvLyBpbiBbbXNdID0+IDUgc2VjCisKKyNkZWZpbmUgRVBMX1NFUV9SRVRSWV9DT1VOVCAgICAgICAgIDUJLy8gPT4gbWF4LiBUaW1lb3V0IDMwIHNlYworCisjZGVmaW5lIEVQTF9TRVFfTlVNX1RIUkVTSE9MRCAgICAgICAxMDAJLy8gdGhyZXNob2xkIHdoaWNoIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyBzZXF1ZW5jZSBudW1iZXJzCisKKy8vIGRlZmluZSBmcmFtZSB3aXRoIHNpemUgb2YgQXNuZC1IZWFkZXItLCBTRE8gU2VxdWVuemUgSGVhZGVyIHNpemUsIFNETyBDb21tYW5kIGhlYWRlcgorLy8gYW5kIEV0aGVybmV0LUhlYWRlciBzaXplCisjZGVmaW5lIEVQTF9TRVFfRlJBTUVfU0laRSAgICAgICAgICAyNAorLy8gc2l6ZSBvZiB0aGUgaGVhZGVyIG9mIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgbGF5ZXIKKyNkZWZpbmUgRVBMX1NFUV9IRUFERVJfU0laRSAgICAgICAgIDQKKworLy8gYnVmZmVyc2l6ZSBmb3Igb25lIGZyYW1lIGluIGhpc3RvcnkKKyNkZWZpbmUgRVBMX1NFUV9ISVNUUk9ZX0ZSQU1FX1NJWkUgIEVQTF9NQVhfU0RPX0ZSQU1FX1NJWkUKKworLy8gbWFzayB0byBnZXQgc2NvbiBhbmQgcmNvbgorI2RlZmluZSBFUExfQVNZX1NET19DT05fTUFTSyAgICAgICAgMHgwMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGV2ZW50cyBmb3IgcHJvY2Vzc2Z1bmN0aW9uCit0eXBlZGVmIGVudW0geworCWtBc3lTZG9TZXFFdmVudE5vRXZlbnQgPSAweDAwLAkvLyBubyBFdmVudAorCWtBc3lTZG9TZXFFdmVudEluaXRDb24gPSAweDAxLAkvLyBpbml0IGNvbm5lY3Rpb24KKwlrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYyA9IDB4MDIsCS8vIGZyYW1lIHJlY2VpdmVkCisJa0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kID0gMHgwMywJLy8gZnJhbWUgdG8gc2VuZAorCWtBc3lTZG9TZXFFdmVudFRpbWVvdXQgPSAweDA0LAkvLyBUaW1lb3V0IGZvciBjb25uZWN0aW9uCisJa0FzeVNkb1NlcUV2ZW50Q2xvc2VDb24gPSAweDA1CS8vIGhpZ2hlciBsYXllciBjbG9zZSBjb25uZWN0aW9uCit9IHRFcGxBc3lTZG9TZXFFdmVudDsKKworLy8gc3RydWN0dXJlIGZvciBIaXN0b3J5LUJ1ZmZlcgordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9iRnJlZUVudHJpZXM7CisJQllURSBtX2JXcml0ZTsJCS8vIGluZGV4IG9mIHRoZSBuZXh0IGZyZWUgYnVmZmVyIGVudHJ5CisJQllURSBtX2JBY2s7CQkvLyBpbmRleCBvZiB0aGUgbmV4dCBtZXNzYWdlIHdoaWNoIHNob3VsZCBiZWNvbWUgYWNrbm93bGVkZ2VkCisJQllURSBtX2JSZWFkOwkJLy8gaW5kZXggYmV0d2VlbiBtX2JBY2sgYW5kIG1fYldyaXRlIHRvIHRoZSBuZXh0IG1lc3NhZ2UgZm9yIHJldHJhbnNtaXNzaW9uCisJQllURSBtX2FhYkhpc3RvcnlGcmFtZVtFUExfU0RPX0hJU1RPUllfU0laRV0KKwkgICAgW0VQTF9TRVFfSElTVFJPWV9GUkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbV9hdWlGcmFtZVNpemVbRVBMX1NET19ISVNUT1JZX1NJWkVdOworCit9IHRFcGxBc3lTZG9Db25IaXN0b3J5OworCisvLyBzdGF0ZSBvZiB0aGUgc3RhdGVtYXNjaGluZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsQXN5U2RvU3RhdGVJZGxlID0gMHgwMCwKKwlrRXBsQXN5U2RvU3RhdGVJbml0MSA9IDB4MDEsCisJa0VwbEFzeVNkb1N0YXRlSW5pdDIgPSAweDAyLAorCWtFcGxBc3lTZG9TdGF0ZUluaXQzID0gMHgwMywKKwlrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQgPSAweDA0LAorCWtFcGxBc3lTZG9TdGF0ZVdhaXRBY2sgPSAweDA1Cit9IHRFcGxBc3lTZG9TdGF0ZTsKKworLy8gY29ubmVjdGlvbiBjb250cm9sIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db25IZGwgbV9Db25IYW5kbGU7CisJdEVwbEFzeVNkb1N0YXRlIG1fU2RvU3RhdGU7CisJQllURSBtX2JSZWNTZXFOdW07CS8vIG5hbWUgZnJvbSB2aWV3IG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwlCWVRFIG1fYlNlbmRTZXFOdW07CS8vIG5hbWUgZnJvbSB2aWV3IG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwl0RXBsQXN5U2RvQ29uSGlzdG9yeSBtX1Nkb0Nvbkhpc3Rvcnk7CisJdEVwbFRpbWVySGRsIG1fRXBsVGltZXJIZGw7CisJdW5zaWduZWQgaW50IG1fdWlSZXRyeUNvdW50OwkvLyByZXRyeSBjb3VudGVyCisJdW5zaWduZWQgaW50IG1fdWlVc2VDb3VudDsJLy8gb25lIHNlcXVlbmNlIGxheWVyIGNvbm5lY3Rpb24gbWF5IGJlIHVzZWQgYnkKKwkvLyBtdWx0aXBsZSBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb25zCisKK30gdEVwbEFzeVNkb1NlcUNvbjsKKworLy8gaW5zdGFuY2Ugc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEFzeVNkb1NlcUNvbiBtX0FzeVNkb0Nvbm5lY3Rpb25bRVBMX01BWF9TRE9fU0VRX0NPTl07CisJdEVwbFNkb0NvbVJlY2VpdmVDYiBtX2ZwU2RvQ29tUmVjZWl2ZUNiOworCXRFcGxTZG9Db21Db25DYiBtX2ZwU2RvQ29tQ29uQ2I7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247CisKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKyNlbmRpZgorCit9IHRFcGxBc3lTZG9TZXF1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXN5U2RvU2VxdUluc3RhbmNlIEFzeVNkb1NlcXVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxUHJvY2Vzcyh1bnNpZ25lZCBpbnQgdWlIYW5kbGVfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgIHRFcGxGcmFtZSAqIHBEYXRhX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcSAqIHBSZWNGcmFtZV9wLAorCQkJCSAgICAgIHRFcGxBc3lTZG9TZXFFdmVudCBFdmVudF9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZEludGVybih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJIHRFcGxGcmFtZSAqIHBEYXRhX3AsCisJCQkJCSBCT09MIGZGcmFtZUluSGlzdG9yeSk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRXBsRnJhbWVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVJlY2VpdmVDYih0RXBsU2RvQ29uSGRsIENvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb1NlcSAqIHBTZG9TZXFEYXRhX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5SW5pdEhpc3Rvcnkodm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWNrRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICBCWVRFIGJSZWNTZXFOdW1iZXJfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICB0RXBsRnJhbWUgKiogcHBGcmFtZV9wLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkJICAgQk9PTCBmSW5pdFJlYWQpOworCitzdGF0aWMgdW5zaWduZWQgaW50IEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqCisJCQkJCQkgICAgICAgcEFzeVNkb1NlcUNvbl9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2V0VGltZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVvdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFUEwgYXN5Y2hyb251cyBTRE8gU2VxdWVuY2UgbGF5ZXI+ICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiB0aGlzIG1vZHVsZSBjb250YWlucyB0aGUgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyIGZvcgorLy8gICAgICAgICAgICAgIHRoZSBFUEwgU0RPIHNlcnZpY2UKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGZwU2RvQ29tQ2JfcCAgICA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBDb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgbmV3IGZyYW1lcworLy8gICAgICAgICAgICAgIGZwU2RvQ29tQ29uQ2JfcCA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBjb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29ubmVjdGlvbiBzdGF0ZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxSW5pdCh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkgICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UoZnBTZG9Db21DYl9wLCBmcFNkb0NvbUNvbkNiX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZvbGxvd2luZyBpbnN0YW5jZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBmcFNkb0NvbUNiX3AgICAgPSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gQ29tbWFuZCBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IG5ldyBmcmFtZXMKKy8vICAgICAgICAgICAgICBmcFNkb0NvbUNvbkNiX3AgPSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gY29tbWFuZCBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IGNvbm5lY3Rpb24gc3RhdGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UodEVwbFNkb0NvbVJlY2VpdmVDYiBmcFNkb0NvbUNiX3AsCisJCQkJCSAgdEVwbFNkb0NvbUNvbkNiIGZwU2RvQ29tQ29uQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgZnVuY3Rpb25wb2ludGVyCisJaWYgKGZwU2RvQ29tQ2JfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFNaXNzQ2I7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tUmVjZWl2ZUNiID0gZnBTZG9Db21DYl9wOworCX0KKworCS8vIGNoZWNrIGZ1bmN0aW9ucG9pbnRlcgorCWlmIChmcFNkb0NvbUNvbkNiX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU2RvU2VxTWlzc0NiOworCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9mcFNkb0NvbUNvbkNiID0gZnBTZG9Db21Db25DYl9wOworCX0KKworCS8vIHNldCBjb250cm9sbHN0cnVjdHVyZSB0byAwCisJRVBMX01FTVNFVCgmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uWzBdLCAweDAwLAorCQkgICBzaXplb2YoQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uKSk7CisKKwkvLyBpbml0IEhpc3RvcnkKKwlSZXQgPSBFcGxTZG9Bc3lJbml0SGlzdG9yeSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbiA9CisJICAgICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBpbml0IGNyaXRpY2FsIHNlY3Rpb24gZm9yIHJlY2VpdmUgY2IgZnVuY3Rpb24KKwlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlID0KKwkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCSAgbV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZSk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkvLyBpbml0IGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvVWRwdUFkZEluc3RhbmNlKEVwbFNkb0FzeVJlY2VpdmVDYik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCS8vIGluaXQgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKEVwbFNkb0FzeVJlY2VpdmVDYik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2VzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlbGV0ZSB0aW1lciBvZiBvcGVuIGNvbm5lY3Rpb25zCisJdWlDb3VudCA9IDA7CisJcEFzeVNkb1NlcUNvbiA9ICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSAhPSAwKSB7CisJCQlFcGxUaW1lcnVEZWxldGVUaW1lcigmcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCk7CisJCX0KKwkJdWlDb3VudCsrOworCQlwQXN5U2RvU2VxQ29uKys7CisJfQorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZGVsZXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlEZWxldGVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJLy8gc2V0IGluc3RhbmNlLXRhYmxlIHRvIDAKKwlFUExfTUVNU0VUKCZBc3lTZG9TZXF1SW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKEFzeVNkb1NlcXVJbnN0YW5jZV9nKSk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJLy8gZGVsZXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvVWRwdURlbEluc3RhbmNlKCk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJLy8gZGVsZXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSgpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFJbml0Q29uCisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0IGluaXRpYWxpemF0aW9uIG9mIGEgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbi4KKy8vICAgICAgICAgICAgICBJdCB0cmllcyB0byByZXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG5vZGUuCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvU2VxQ29uSGRsX3AgPSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSBmb3IgdGhlIGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgID0gTm9kZSBJZCBvZiB0aGUgdGFyZ2V0CisvLyAgICAgICAgICAgICAgU2RvVHlwZSAgICAgICAgICA9IFR5cGUgb2YgdGhlIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0Q29uKHRFcGxTZG9TZXFDb25IZGwgKiBwU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgdEVwbFNkb1R5cGUgU2RvVHlwZSkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXRFcGxTZG9Db25IZGwgQ29uSGFuZGxlOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBTZG9UeXBlCisJLy8gY2FsbCBpbml0IGZ1bmN0aW9uIG9mIHRoZSBwcm90Y29sIGFic3RyYWN0aW9uIGxheWVyCisJLy8gd2hpY2ggdHJpZXMgdG8gZmluZCBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG5vZGUKKwlzd2l0Y2ggKFNkb1R5cGUpIHsKKwkJLy8gU0RPIG92ZXIgVURQCisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJCVJldCA9IEVwbFNkb1VkcHVJbml0Q29uKCZDb25IYW5kbGUsIHVpTm9kZUlkX3ApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKyNlbHNlCisJCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIFNETyBvdmVyIEFzbmQKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQlSZXQgPSBFcGxTZG9Bc25kdUluaXRDb24oJkNvbkhhbmRsZSwgdWlOb2RlSWRfcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorI2Vsc2UKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdW5zdXBwb3J0ZWQgcHJvdG9jb2xzCisJCS8vIC0+IGF1dG8gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGNvbW1hbmQgbGF5ZXIKKwljYXNlIGtFcGxTZG9UeXBlQXV0bzoKKwljYXNlIGtFcGxTZG9UeXBlUGRvOgorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKFNkb1R5cGUpCisKKwkvLyBmaW5kIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZSBvciBmaW5kIGVtcHR5IGVudHJ5IGZvciBjb25uZWN0aW9uCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX01BWF9TRE9fU0VRX0NPTjsKKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblswXTsKKworCXdoaWxlICh1aUNvdW50IDwgRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlpZiAocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPT0gQ29uSGFuZGxlKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gZm91bmQKKwkJCWJyZWFrOworCQl9CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSAwKSB7CisJCQl1aUZyZWVDb24gPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcEFzeVNkb1NlcUNvbisrOworCX0KKworCWlmICh1aUNvdW50ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHVpRnJlZUNvbiA9PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CS8vIG5vIGZyZWUgZW50cnkgZm91bmQKKwkJCXN3aXRjaCAoU2RvVHlwZSkgeworCQkJCS8vIFNETyBvdmVyIFVEUAorCQkJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJCQlSZXQgPSBFcGxTZG9VZHB1RGVsQ29uKENvbkhhbmRsZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIFNETyBvdmVyIEFzbmQKKwkJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQkJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQkJCQlSZXQgPSBFcGxTZG9Bc25kdURlbENvbihDb25IYW5kbGUpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB1bnN1cHBvcnRlZCBwcm90b2NvbHMKKwkJCQkvLyAtPiBhdXRvIHNob3VsZCBiZSByZXBsYWNlZCBieSBjb21tYW5kIGxheWVyCisJCQljYXNlIGtFcGxTZG9UeXBlQXV0bzoKKwkJCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb1R5cGUpCisKKwkJCVJldCA9IGtFcGxTZG9TZXFOb0ZyZWVIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCXBBc3lTZG9TZXFDb24gPQorCQkJICAgICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlGcmVlQ29uXTsKKwkJCXBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID0gQ29uSGFuZGxlOworCQkJdWlDb3VudCA9IHVpRnJlZUNvbjsKKwkJfQorCX0KKwkvLyBzZXQgaGFuZGxlCisJKnBTZG9TZXFDb25IZGxfcCA9ICh1aUNvdW50IHwgRVBMX1NET19BU1lfSEFORExFKTsKKworCS8vIGluY3JlbWVudCB1c2UgY291bnRlcgorCXBBc3lTZG9TZXFDb24tPm1fdWlVc2VDb3VudCsrOworCisJLy8gY2FsbCBpbnRlcm4gcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlDb3VudCwKKwkJCQkgIDAsIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudEluaXRDb24pOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisvLworLy8gRGVzY3JpcHRpb246IHNlbmQgc2F0YSB1bnNpbmcgYSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb1NlcUNvbkhkbF9wID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBTaXplIG9mIEZyYW1lIHRvIHNlbmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpaHRvdXQgU0RPIHNlcXVlbmNlIGxheWVyIGhlYWRlciwgQXNuZCBoZWFkZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBldGhlcm5ldG5ldAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0+IFNETyBTZXF1ZW5jZSBsYXllciBwYXlsb2FkCisvLyAgICAgICAgICAgICAgU2RvVHlwZSAgICAgICAgICA9IFR5cGUgb2YgdGhlIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFTZW5kRGF0YSh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgICB0RXBsRnJhbWUgKiBwYWJEYXRhX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCisJdWlIYW5kbGUgPSAoU2RvU2VxQ29uSGRsX3AgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spOworCisJLy8gY2hlY2sgaWYgY29ubmVjdGlvbiByZWFkeQorCWlmIChBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlIYW5kbGVdLm1fU2RvU3RhdGUgPT0KKwkgICAga0VwbEFzeVNkb1N0YXRlSWRsZSkgeworCQkvLyBubyBjb25uZWN0aW9uIHdpdGggdGhpcyBoYW5kbGUKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV0uCisJCSAgIG1fU2RvU3RhdGUgIT0ga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkKSB7CisJCVJldCA9IGtFcGxTZG9TZXFDb25uZWN0aW9uQnVzeTsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlIYW5kbGUsCisJCQkJICB1aURhdGFTaXplX3AsCisJCQkJICBwYWJEYXRhX3AsIE5VTEwsIGtBc3lTZG9TZXFFdmVudEZyYW1lU2VuZCk7CisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBwcm9jZXNzZXMgZXh0ZXJuIGV2ZW50cworLy8gICAgICAgICAgICAgIC0+IGxhdGVyIG5lZWRlZCBmb3IgdGltZW91dCBjb250cm9sbCB3aXRoIHRpbWVyLW1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxUaW1lckV2ZW50QXJnICpwVGltZXJFdmVudEFyZzsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCXRFcGxUaW1lckhkbCBFcGxUaW1lckhkbDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwRXZlbnRfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkRXZlbnQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocEV2ZW50X3AtPm1fRXZlbnRUeXBlICE9IGtFcGxFdmVudFR5cGVUaW1lcikgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEV2ZW50OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCB0aW1lcmhkbAorCXBUaW1lckV2ZW50QXJnID0gKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT5tX3BBcmc7CisJRXBsVGltZXJIZGwgPSBwVGltZXJFdmVudEFyZy0+bV9UaW1lckhkbDsKKworCS8vIGdldCBwb2ludGVyIHRvIGludGVybiBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisJaWYgKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnID09IDApIHsKKwkJZ290byBFeGl0OworCX0KKwlwQXN5U2RvU2VxQ29uID0gKHRFcGxBc3lTZG9TZXFDb24gKikgcFRpbWVyRXZlbnRBcmctPm1fdWxBcmc7CisKKwkvLyBjaGVjayBpZiB0aW1lIGlzIGN1cnJlbnQKKwlpZiAoRXBsVGltZXJIZGwgIT0gcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCkgeworCQkvLyBkZWxldGUgdGltZXIKKwkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbFRpbWVySGRsKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkZWxldGUgdGltZXIKKwlFcGxUaW1lcnVEZWxldGVUaW1lcigmcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCk7CisKKwkvLyBnZXQgaW5kZXhudW1iZXIgb2YgY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwl3aGlsZSAoKCZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlDb3VudF0pICE9CisJICAgICAgIHBBc3lTZG9TZXFDb24pIHsKKwkJdWlDb3VudCsrOworCQlpZiAodWlDb3VudCA+IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIHByb2Nlc3MgZXZlbnQgYW5kIGNhbGwgcHJvY2Vzc2Z1bmN0aW9uIGlmIG5lZWRlZAorCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlDb3VudCwKKwkJCQkgIDAsIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxRGVsQ29uCisvLworLy8gRGVzY3JpcHRpb246IGRlbCBhbmQgY2xvc2Ugb25lIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9TZXFDb25IZGxfcCA9IGhhbmRsZSBvZiBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxDb24odEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCisJdWlIYW5kbGUgPSAoU2RvU2VxQ29uSGRsX3AgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIGludmFsaWQKKwlpZiAodWlIYW5kbGUgPj0gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb25uZWN0aW9uCisJcEFzeVNkb1NlcUNvbiA9ICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlIYW5kbGVdOworCisJLy8gZGVjcmVtZW50IHVzZSBjb3VudGVyCisJcEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50LS07CisKKwlpZiAocEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50ID09IDApIHsKKwkJLy8gcHJvY2VzcyBjbG9zZSBpbiBwcm9jZXNzZnVuY3Rpb24KKwkJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUhhbmRsZSwKKwkJCQkJICAwLAorCQkJCQkgIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudENsb3NlQ29uKTsKKworCQkvL2NoZWNrIHByb3RvY29sCisJCWlmICgocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgJiBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSykgPT0KKwkJICAgIEVQTF9TRE9fVURQX0hBTkRMRSkgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJCS8vIGNhbGwgY2xvc2UgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCUVwbFNkb1VkcHVEZWxDb24ocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQl9IGVsc2UgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQkvLyBjYWxsIGNsb3NlIGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQlFcGxTZG9Bc25kdURlbENvbihwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSk7CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQl9CisKKwkJLy8gZGVsZXRlIHRpbWVyCisJCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKworCQkvLyBjbGVhbiBjb250cm9sbHN0cnVjdHVyZQorCQlFUExfTUVNU0VUKHBBc3lTZG9TZXFDb24sIDB4MDAsIHNpemVvZih0RXBsQXN5U2RvU2VxQ29uKSk7CisJCXBBc3lTZG9TZXFDb24tPm1fU2RvQ29uSGlzdG9yeS5tX2JGcmVlRW50cmllcyA9CisJCSAgICBFUExfU0RPX0hJU1RPUllfU0laRTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXBsU2RvQXN5U2VxUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyCisvLyAgICAgICAgICAgICAgc3RhdGUgbWFzY2hpbmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUhhbmRsZV9wICAgICAgPSBpbmRleCBvZiB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBzaXplIG9mIGRhdGEgZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIDApCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IHNpemUgb2Ygc2VxdWVuY2UgaGVhZGVyIGFuZCBBc25kIGhlYWRlciEhIQorLy8KKy8vICAgICAgICAgICAgICBwRGF0YV9wICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHNlbmQgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIHBSZWNGcmFtZV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIEV2ZW50X3AgICAgICAgICA9IEV2ZW50IHRvIHByb2Nlc3MKKy8vCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxICogcFJlY0ZyYW1lX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcUV2ZW50IEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpRnJhbWVTaXplOworCXRFcGxGcmFtZSAqcEVwbEZyYW1lOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJdEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGw7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJpZXM7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IGhhbmRsZSBmb3IgaGluZ2VyIGxheWVyCisJU2RvU2VxQ29uSGRsID0gdWlIYW5kbGVfcCB8IEVQTF9TRE9fQVNZX0hBTkRMRTsKKworCS8vIGNoZWNrIGlmIGhhbmRsZSBpbnZhbGlkCisJaWYgKChTZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spID09CisJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV9wXTsKKworCS8vIGNoZWNrIHNpemUKKwlpZiAoKHBEYXRhX3AgPT0gTlVMTCkgJiYgKHBSZWNGcmFtZV9wID09IE5VTEwpICYmICh1aURhdGFTaXplX3AgIT0gMCkpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRGcmFtZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBzdGF0ZQorCXN3aXRjaCAocEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSkgeworCQkvLyBpZGxlIHN0YXRlCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJZGxlOgorCQl7CisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gbmV3IGNvbm5lY3Rpb24KKwkJCQkvLyAtPiBzZW5kIGluaXQgZnJhbWUgYW5kIGNoYW5nZSB0bworCQkJCS8vIGtFcGxBc3lTZG9TdGF0ZUluaXQxCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEluaXRDb246CisJCQkJeworCQkJCQkvLyBzZXQgc2VuZGluZyBzY29uIHRvIDEKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0gMHgwMTsKKwkJCQkJLy8gc2V0IHNldCBzZW5kIHJjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0gMHgwMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLCBGQUxTRSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MTsKKworCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gaW5pdCBjb24gZnJvbSBleHRlcm4KKwkJCQkvLyBjaGVjayByY29uIGFuZCBzY29uCisJCQkJLy8gLT4gc2VuZCBhbnN3ZXIKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworLyoKKyAgICAgICAgICAgICAgICAgICAgUFJJTlRGMygiJXMgc2Nvbj0ldSByY29uPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVjRnJhbWVfcC0+bV9sZV9iUmVjU2VxTnVtQ29uKTsKKyovCisJCQkJCS8vIGNoZWNrIGlmIHNjb24gPT0gMSBhbmQgcmNvbiA9PSAwCisJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMSkpIHsKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJLy8gY3JlYXRlIGFuc3dlciBhbmQgc2VuZCBhbnN3ZXIKKwkJCQkJCS8vIHNldCByY29uIHRvIDEgKGluIHNlbmQgZGlyZWN0aW9uIG93biBzY29uKQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVJbml0MgorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSW5pdDI7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCX0gZWxzZSB7CS8vIGVycm9yIC0+IGNsb3NlCisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IGNvbm5lY3Rpb24gc3RlcCAxCisJCS8vIHdhaXQgZm9yIGZyYW1lIHdpdGggc2NvbiA9IDEKKwkJLy8gYW5kIHJjb24gPSAxCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJbml0MToKKwkJeworLy8gICAgICAgICAgICBQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBTdGF0ZUluaXQxXG4iKTsKKworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAxIGFuZCByY29uID09IDEKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMSkKKwkJCQkJICAgICYmICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMSkpIHsJLy8gY3JlYXRlIGFuc3dlciBvd24gc2NvbiA9IDIKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUluaXQzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MzsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQl9CisJCQkJCS8vIGNoZWNrIGlmIHNjb24gPT0gMSBhbmQgcmNvbiA9PSAwLCBpLmUuIG90aGVyIHNpZGUgd2FudHMgbWUgdG8gYmUgc2VydmVyCisJCQkJCWVsc2UgaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAwKQorCQkJCQkJICYmCisJCQkJCQkgKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIGFuZCBzZW5kIGFuc3dlcgorCQkJCQkJLy8gc2V0IHJjb24gdG8gMSAoaW4gc2VuZCBkaXJlY3Rpb24gb3duIHNjb24pCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUluaXQyCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MjsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLAorCQkJCQkJCSAgICAgTlVMTCwgRkFMU0UpOworCQkJCQkJfQorCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50VGltZW91dDoKKwkJCQl7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKworCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKwkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBjb25uZWN0aW9uIHN0ZXAgMgorCWNhc2Uga0VwbEFzeVNkb1N0YXRlSW5pdDI6CisJCXsKKy8vICAgICAgICAgICAgUFJJTlRGMCgiRXBsU2RvQXN5U2VxdTogU3RhdGVJbml0MlxuIik7CisKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMiBhbmQgcmNvbiA9PSAxCisJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDEpCisJCQkJCSAgICAmJiAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDIpKSB7CS8vIGNyZWF0ZSBhbnN3ZXIgb3duIHJjb24gPSAyCisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQpOworCisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAxIGFuZCByY29uID09IDEsIGkuZS4gb3RoZXIgc2lkZSB3YW50cyBtZSB0byBpbml0aWF0ZSB0aGUgY29ubmVjdGlvbgorCQkJCQllbHNlIGlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0KKwkJCQkJCSAgMHgwMSkKKwkJCQkJCSAmJgorCQkJCQkJICgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmCisJCQkJCQkgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0KKwkJCQkJCSAgMHgwMSkpIHsKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJLy8gY3JlYXRlIGFuc3dlciBhbmQgc2VuZCBhbnN3ZXIKKwkJCQkJCS8vIHNldCByY29uIHRvIDEgKGluIHNlbmQgZGlyZWN0aW9uIG93biBzY29uKQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQzOworCisJCQkJCX0gZWxzZSB7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPQorCQkJCQkJICAgICAweDAwKQorCQkJCQkJICAgIHx8ICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgIT0gMHgwMCkpIHsJLy8gZC5rLiBvbmx5IGFuc3dlciB3aXRoIGNsb3NlIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2Ugc2VudCB3YXMgbm90IGEgY2xvc2UgbWVzc2FnZQorCQkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsCisJCQkJCQkJICAgICBOVUxMLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0OgorCQkJCXsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKworCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IGNvbm5lY3Rpb24gc3RlcCAzCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJbml0MzoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAyIGFuZCByY29uID09IDIKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAyKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZCk7CisKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBzY29uID09IDIgYW5kIHJjb24gPT0gMQorCQkJCQllbHNlIGlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0KKwkJCQkJCSAgMHgwMSkKKwkJCQkJCSAmJiAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDIpKSB7CS8vIGNyZWF0ZSBhbnN3ZXIgb3duIHJjb24gPSAyCisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKys7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQpOworCisJCQkJCX0gZWxzZSB7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJICAgICgmcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPQorCQkJCQkJICAgICAweDAwKQorCQkJCQkJICAgIHx8ICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgIT0gMHgwMCkpIHsJLy8gZC5rLiBvbmx5IGFuc3dlciB3aXRoIGNsb3NlIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2Ugc2VudCB3YXMgbm90IGEgY2xvc2UgbWVzc2FnZQorCQkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsCisJCQkJCQkJICAgICBOVUxMLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0OgorCQkJCXsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKworCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBjb25uZWN0aW9uIGVzdGFibGlzaGVkCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50CisJCQlzd2l0Y2ggKEV2ZW50X3ApIHsKKworCQkJCS8vIGZyYW1lIHRvIHNlbmQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kOgorCQkJCXsKKwkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQkvLyBjaGVjayBpZiBkYXRhIGZyYW1lIG9yIGFjaworCQkJCQlpZiAocERhdGFfcCA9PSBOVUxMKSB7CS8vIHNlbmQgYWNrCisJCQkJCQkvLyBpbmMgc2NvbgorCQkJCQkJLy9wQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gKz0gNDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvLyBzZW5kIGRhdGFmcmFtZQorCQkJCQkJLy8gaW5jcmVtZW50IHNlbmQgc2VxdWVuY2UgbnVtYmVyCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gKz0KKwkJCQkJCSAgICA0OworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIHVpRGF0YVNpemVfcCwgcERhdGFfcCwKKwkJCQkJCSAgICAgVFJVRSk7CisJCQkJCQlpZiAoUmV0ID09IGtFcGxTZG9TZXFSZXF1ZXN0QWNrTmVlZGVkKSB7CS8vIHJlcXVlc3QgYWNrCisJCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIHdhaXQgYWNrCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fU2RvU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVXYWl0QWNrOworCQkJCQkJCS8vIHNldCBSZXQgdG8ga0VwbFN1Y2Nlc3NmdWwsIGJlY2F1c2Ugbm8gZXJyb3IKKwkJCQkJCQkvLyBmb3IgaGlnaGVyIGxheWVyCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkJCQkJCX0gZWxzZSBpZiAoUmV0ICE9CisJCQkJCQkJICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CS8vIGVuZCBvZiBjYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lU2VuZAorCisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQlCWVRFIGJTZW5kU2VxTnVtQ29uID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCS8vIHNldCB0aW1lcgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJLy8gY2hlY2sgc2NvbgorCQkJCQlzd2l0Y2ggKGJTZW5kU2VxTnVtQ29uICYKKwkJCQkJCUVQTF9BU1lfU0RPX0NPTl9NQVNLKSB7CisJCQkJCQkvLyBjbG9zZSBmcm9tIG90aGVyIG5vZGUKKwkJCQkJY2FzZSAwOgorCQkJCQljYXNlIDE6CisJCQkJCQl7CisJCQkJCQkJLy8gcmV0dXJuIHRvIGlkbGUKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbkNsb3NlZCk7CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gUmVxdWVzdCBBY2sgb3IgRXJyb3IgQWNrCisJCQkJCQkvLyBwb3NzaWJsZSBjb250YWluIGRhdGEKKwkJCQkJY2FzZSAzOgorCQkJCQkJLy8gbm9ybWFsIGZyYW1lCisJCQkJCWNhc2UgMjoKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbikKKwkJCQkJCQkgICAgICYKKwkJCQkJCQkgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKQorCQkJCQkJCSAgICA9PSAzKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRGMCgiRXBsU2RvQXN5U2VxdTogZXJyb3IgcmVzcG9uc2UgcmVjZWl2ZWRcbiIpOworCisJCQkJCQkJCS8vIGVycm9yIHJlc3BvbnNlIChyZXRyYW5zbWlzc2lvbiByZXF1ZXN0KQorCQkJCQkJCQkvLyByZXNlbmQgZnJhbWVzIGZyb20gaGlzdG9yeQorCisJCQkJCQkJCS8vIHJlYWQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgICZwRXBsRnJhbWUsCisJCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCQkgICAgIFRSVUUpOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisKKwkJCQkJCQkJd2hpbGUgKChwRXBsRnJhbWUgIT0gTlVMTCkKKwkJCQkJCQkJICAgICAgICYmCisJCQkJCQkJCSAgICAgICAodWlGcmFtZVNpemUKKwkJCQkJCQkJCSE9IDApKSB7CisJCQkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyCisJCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCQkgICAgIHVpRnJhbWVTaXplLAorCQkJCQkJCQkJICAgICBwRXBsRnJhbWUpOworCQkJCQkJCQkJaWYgKFJldAorCQkJCQkJCQkJICAgICE9CisJCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQkJfQorCQkJCQkJCQkJLy8gcmVhZCBuZXh0IGZyYW1lIGZyb20gaGlzdG9yeQorCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJCSAgICAgJnBFcGxGcmFtZSwKKwkJCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJCQlpZiAoUmV0CisJCQkJCQkJCQkgICAgIT0KKwkJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0JLy8gZW5kIG9mIHdoaWxlKChwYWJGcmFtZSAhPSBOVUxMKQorCQkJCQkJCX0JLy8gZW5kIG9mIGlmIChlcnJvciByZXNwb25zZSkKKworCQkJCQkJCWlmICgoKHBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gKyA0KSAmIEVQTF9TRVFfTlVNX01BU0spID09IChiU2VuZFNlcU51bUNvbiAmIEVQTF9TRVFfTlVNX01BU0spKSB7CS8vIG5leHQgZnJhbWUgb2Ygc2VxdWVuY2UgcmVjZWl2ZWQKKwkJCQkJCQkJLy8gc2F2ZSBzZW5kIHNlcXVlbmNlIG51bWJlciAod2l0aG91dCBhY2sgcmVxdWVzdCkKKwkJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICBiU2VuZFNlcU51bUNvbgorCQkJCQkJCQkgICAgJiB+MHgwMTsKKworCQkJCQkJCQkvLyBjaGVjayBpZiBhY2sgb3IgZGF0YS1mcmFtZQorCQkJCQkJCQkvL2lnbm9yZSBhY2sgLT4gYWxyZWFkeSBwcm9jZXNzZWQKKwkJCQkJCQkJaWYgKHVpRGF0YVNpemVfcAorCQkJCQkJCQkgICAgPgorCQkJCQkJCQkgICAgRVBMX1NFUV9IRUFERVJfU0laRSkKKwkJCQkJCQkJeworCQkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCQkgICAgbV9mcFNkb0NvbVJlY2VpdmVDYgorCQkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgICgodEVwbEFzeVNkb0NvbSAqKSAmIHBSZWNGcmFtZV9wLT5tX2xlX2FiU2RvU2VxUGF5bG9hZCksICh1aURhdGFTaXplX3AgLSBFUExfU0VRX0hFQURFUl9TSVpFKSk7CisJCQkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkKTsKKworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVBY2tSZWNlaXZlZCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgaWYgKCgoYlNlbmRTZXFOdW1Db24gLSBwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtIC0gNCkgJiBFUExfU0VRX05VTV9NQVNLKSA8IEVQTF9TRVFfTlVNX1RIUkVTSE9MRCkgewkvLyBmcmFtZSBvZiBzZXF1ZW5jZSB3YXMgbG9zdCwKKwkJCQkJCQkJLy8gYmVjYXVzZSBkaWZmZXJlbmNlIG9mIHJlY2VpdmVkIGFuZCBvbGQgdmFsdWUKKwkJCQkJCQkJLy8gaXMgbGVzcyB0aGVuIGhhbHZlIG9mIHRoZSB2YWx1ZXMgcmFuZ2UuCisKKwkJCQkJCQkJLy8gc2VuZCBlcnJvciBmcmFtZSB3aXRoIG93biByY29uID0gMworCQkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgIHw9IDB4MDM7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAwLCBOVUxMLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJLy8gcmVzdG9yZSBzZW5kIHNlcXVlbmNlIG51bWJlcgorCQkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkJICAgICBtX2JTZW5kU2VxTnVtCisJCQkJCQkJCSAgICAgJgorCQkJCQkJCQkgICAgIEVQTF9TRVFfTlVNX01BU0spCisJCQkJCQkJCSAgICB8IDB4MDI7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKwkJCQkJCQkJLy8gYnJlYWsgaGVyZSwgYmVjYXVzZSBhIHJlcXVlc3RlZCBhY2tub3dsZWRnZQorCQkJCQkJCQkvLyB3YXMgc2VudCBpbXBsaWNpdGx5IGFib3ZlCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQkvLyBlbHNlLCBpZ25vcmUgcmVwZWF0ZWQgZnJhbWUKKworCQkJCQkJCWlmICgoYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMykgewkvLyBhY2sgcmVxdWVzdCByZWNlaXZlZAorCisJCQkJCQkJCS8vIGNyZWF0ZSBhY2sgd2l0aCBvd24gc2NvbiA9IDIKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgIDAsIE5VTEwsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfQkvLyBzd2l0Y2gocEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKQorCQkJCQlicmVhazsKKwkJCQl9CS8vIGVuZCBvZiBjYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCisJCQkJLy9jbG9zZSBldmVudCBmcm9tIGhpZ2hlciBsYXllcgorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRDbG9zZUNvbjoKKwkJCQl7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgICAwLCBOVUxMLCBGQUxTRSk7CisKKwkJCQkJLy8gZGVsZXRlIHRpbWVyCisJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgIG1fRXBsVGltZXJIZGwpOworCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IgaXMgbm90IG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgZXZlbnQgY2FtZSBmcm9tIHRoZXJlCisvLyAgICAgICAgICAgICAgICAgICAgQXN5U2RvU2VxdUluc3RhbmNlX2cubV9mcFNkb0NvbUNvbkNiKFNkb1NlcUNvbkhkbCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0OgorCQkJCXsKKworCQkJCQl1aUZyZWVFbnRyaWVzID0KKwkJCQkJICAgIEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkKKwkJCQkJICAgIChwQXN5U2RvU2VxQ29uKTsKKwkJCQkJaWYgKCh1aUZyZWVFbnRyaWVzIDwKKwkJCQkJICAgICBFUExfU0RPX0hJU1RPUllfU0laRSkKKwkJCQkJICAgICYmIChwQXN5U2RvU2VxQ29uLT5tX3VpUmV0cnlDb3VudCA8IEVQTF9TRVFfUkVUUllfQ09VTlQpKSB7CS8vIHVuYWNrbm93bGVnZGVkIGZyYW1lcyBpbiBoaXN0b3J5CisJCQkJCQkvLyBhbmQgcmV0cnkgY291bnRlciBub3QgZXhjZWVkZWQKKworCQkJCQkJLy8gcmVzZW5kIGRhdGEgd2l0aCBhY2tub3dsZWRnZSByZXF1ZXN0CisKKwkJCQkJCS8vIGluY3JlbWVudCByZXRyeSBjb3VudGVyCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX3VpUmV0cnlDb3VudCsrOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCQkvLyByZWFkIGZpcnN0IGZyYW1lIGZyb20gaGlzdG9yeQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgJnBFcGxGcmFtZSwKKwkJCQkJCSAgICAgJnVpRnJhbWVTaXplLCBUUlVFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisKKwkJCQkJCWlmICgocEVwbEZyYW1lICE9IE5VTEwpCisJCQkJCQkgICAgJiYgKHVpRnJhbWVTaXplICE9IDApKSB7CisKKwkJCQkJCQkvLyBzZXQgYWNrIHJlcXVlc3QgaW4gc2NvbgorCQkJCQkJCUFtaVNldEJ5dGVUb0xlCisJCQkJCQkJICAgICgmcEVwbEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgICBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJCSAgICAgbV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiwKKwkJCQkJCQkgICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgICgmcEVwbEZyYW1lLT4KKwkJCQkJCQkgICAgICBtX0RhdGEubV9Bc25kLgorCQkJCQkJCSAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICBtX1Nkb1NlcXVlbmNlRnJhbWUuCisJCQkJCQkJICAgICAgbV9sZV9iU2VuZFNlcU51bUNvbikKKwkJCQkJCQkgICAgIHwgMHgwMyk7CisKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIKKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICB1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIHBFcGxGcmFtZSk7CisJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB0aW1lb3V0LCBiZWNhdXNlIG9mIG5vIHRyYWZmaWMgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICY9CisJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKworCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVUaW1lb3V0KTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIHdhaXQgZm9yIEFja25vd2xlZGdlIChoaXN0b3J5IGJ1ZmZlciBmdWxsKQorCWNhc2Uga0VwbEFzeVNkb1N0YXRlV2FpdEFjazoKKwkJeworCQkJUFJJTlRGMCgiRXBsU2RvQXN5U2VxdTogU3RhdGVXYWl0QWNrXG4iKTsKKworCQkJLy8gc2V0IHRpbWVyCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZXRUaW1lcihwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkvL1RPRE86IHJldHJ5IG9mIGFja25vd2xlZGdlCisJCQlpZiAoRXZlbnRfcCA9PSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYykgeworCQkJCS8vIGNoZWNrIHJjb24KKwkJCQlzd2l0Y2ggKHBSZWNGcmFtZV9wLT4KKwkJCQkJbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJRVBMX0FTWV9TRE9fQ09OX01BU0spIHsKKwkJCQkJLy8gY2xvc2UtZnJvbWUgb3RoZXIgbm9kZQorCQkJCWNhc2UgMDoKKwkJCQkJeworCQkJCQkJLy8gcmV0dXJuIHRvIGlkbGUKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbkNsb3NlZCk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9ybWFsIGZyYW1lCisJCQkJY2FzZSAyOgorCQkJCQl7CisJCQkJCQkvLyBzaG91bGQgYmUgYWNrCisJCQkJCQkvLyAtPiBjaGFuZ2UgdG8gc3RhdGUga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ7CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUFja1JlY2VpdmVkKTsKKwkJCQkJCS8vIHNlbmQgZGF0YSB0byBoaWdoZXIgbGF5ZXIgaWYgbmVlZGVkCisJCQkJCQlpZiAodWlEYXRhU2l6ZV9wID4KKwkJCQkJCSAgICBFUExfU0VRX0hFQURFUl9TSVpFKSB7CisJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fZnBTZG9Db21SZWNlaXZlQ2IKKwkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkgICAgICgodEVwbEFzeVNkb0NvbSAqKQorCQkJCQkJCSAgICAgICYgcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgIG1fbGVfYWJTZG9TZXFQYXlsb2FkKSwKKwkJCQkJCQkgICAgICh1aURhdGFTaXplX3AgLQorCQkJCQkJCSAgICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gUmVxdWVzdCBBY2sgb3IgRXJyb3IgQWNrCisJCQkJY2FzZSAzOgorCQkJCQl7CisJCQkJCQkvLyAtPiBjaGFuZ2UgdG8gc3RhdGUga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQ7CisKKwkJCQkJCWlmIChwUmVjRnJhbWVfcC0+bV9sZV9iUmVjU2VxTnVtQ29uID09IHBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSkgewkvLyBhY2sgcmVxdWVzdAorCQkJCQkJCS8vIC0+IHNlbmQgYWNrCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQkJLy8gY3JlYXRlIGFuc3dlciBvd24gcmNvbiA9IDIKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtLS07CisKKwkJCQkJCQkvLyBjaGVjayBpZiBhY2sgb3IgZGF0YS1mcmFtZQorCQkJCQkJCWlmICh1aURhdGFTaXplX3AgPgorCQkJCQkJCSAgICBFUExfU0VRX0hFQURFUl9TSVpFKQorCQkJCQkJCXsKKwkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCSAgICBtX2ZwU2RvQ29tUmVjZWl2ZUNiCisJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgICgodEVwbEFzeVNkb0NvbSAqKSAmIHBSZWNGcmFtZV9wLT5tX2xlX2FiU2RvU2VxUGF5bG9hZCksICh1aURhdGFTaXplX3AgLSBFUExfU0VRX0hFQURFUl9TSVpFKSk7CisJCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVGcmFtZVNlbmRlZCk7CisKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgMCwgTlVMTCwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gZXJyb3IgYWNrCisJCQkJCQkJLy8gcmVzZW5kIGZyYW1lcyBmcm9tIGhpc3RvcnkKKworCQkJCQkJCS8vIHJlYWQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCSAgICAgJnBFcGxGcmFtZSwKKwkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIFRSVUUpOworCQkJCQkJCXdoaWxlICgocEVwbEZyYW1lICE9CisJCQkJCQkJCU5VTEwpCisJCQkJCQkJICAgICAgICYmICh1aUZyYW1lU2l6ZQorCQkJCQkJCQkgICAhPSAwKSkgeworCQkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUsCisJCQkJCQkJCSAgICAgcEVwbEZyYW1lKTsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyByZWFkIG5leHQgZnJhbWUKKworCQkJCQkJCQkvLyByZWFkIGZyYW1lIGZyb20gaGlzdG9yeQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5CisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJfQkvLyBlbmQgb2Ygd2hpbGUoKHBhYkZyYW1lICE9IE5VTEwpCisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChwUmVjRnJhbWVfcC0+bV9sZV9iUmVjU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spCisKKwkJCX0gZWxzZSBpZiAoRXZlbnRfcCA9PSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0KSB7CS8vIGVycm9yIC0+IENsb3NlCisJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9IGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gJj0gRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkvLyBzZW5kIGZyYW1lCisJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybihwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKworCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZVRpbWVvdXQpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIHVua25vd24gc3RhdGUKKwlkZWZhdWx0OgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAKKwkJCSAgICAoIkVycm9yOiBVbmtub3duIFN0YXRlIGluIEVwbFNkb0FzeVNlcVByb2Nlc3NcbiIpOworCisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlKQorCisgICAgICBFeGl0OgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUxlYXZlQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKy8vCisvLyBEZXNjcmlwdGlvbjogaW50ZXJuIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgc2VuZCBhIGZyYW1lCisvLyAgICAgICAgICAgICAgLT4gaWYgdWlEYXRhU2l6ZV9wID09IDAgY3JlYXRlIGEgZnJhbWUgd2l0aCBpbmZvcyBmcm9tCisvLyAgICAgICAgICAgICAgICAgcEFzeVNkb1NlcUNvbl9wCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZGF0YSBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgMCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgc2l6ZSBvZiBzZXF1ZW5jZSBoZWFkZXIgYW5kIEFzbmQgaGVhZGVyISEhCisvLyAgICAgICAgICAgICAgcERhdGFfcCAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgTlVMTCkKKy8vICAgICAgICAgICAgICBmRnJhbWVJbkhpc3RvcnkgPSBpZiBUUlVFIGZyYW1lIGlzIHNhdmVkIHRvIGhpc3RvcnkgZWxzZSBub3QKKy8vCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkJIEJPT0wgZkZyYW1lSW5IaXN0b3J5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJQllURSBhYkZyYW1lW0VQTF9TRVFfRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRXBsRnJhbWU7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJpZXM7CisKKwlpZiAocERhdGFfcCA9PSBOVUxMKSB7CS8vIHNldCBwb2ludGVyIHRvIG93biBmcmFtZQorCQlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCQlwRXBsRnJhbWUgPSAodEVwbEZyYW1lICopICYgYWJGcmFtZVswXTsKKwl9IGVsc2UgewkJLy8gc2V0IHBvaW50ZXIgdG8gZnJhbWUgZnJvbSBjYWxsaW5nIGZ1bmN0aW9uCisJCXBFcGxGcmFtZSA9IHBEYXRhX3A7CisJfQorCisJaWYgKGZGcmFtZUluSGlzdG9yeV9wICE9IEZBTFNFKSB7CisJCS8vIGNoZWNrIGlmIG9ubHkgb25lIGZyZWUgZW50cnkgaW4gaGlzdG9yeSBidWZmZXIKKwkJdWlGcmVlRW50cmllcyA9CisJCSAgICBFcGxTZG9Bc3lHZXRGcmVlRW50cmllc0Zyb21IaXN0b3J5KHBBc3lTZG9TZXFDb25fcCk7CisJCWlmICh1aUZyZWVFbnRyaWVzID09IDEpIHsJLy8gcmVxdWVzdCBhbiBhY2tub3dsZWRnZSBpbiBkYXRhZnJhbWUKKwkJCS8vIG93biBzY29uID0gMworCQkJcEFzeVNkb1NlcUNvbl9wLT5tX2JSZWNTZXFOdW0gfD0gMHgwMzsKKwkJfQorCX0KKwkvLyBmaWxsaW4gaGVhZGVyIGluZm9ybWF0aW9ucworCS8vIHNldCBzZXJ2aWNlIGlkIHNkbworCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLCAweDA1KTsKKwlBbWlTZXRCeXRlVG9MZSgmcEVwbEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJCSAgICAgICBtX2xlX2FiUmVzZXJ2ZWQsIDB4MDApOworCS8vIHNldCByZWNlaXZlIHNlcXVlbmNlIG51bWJlciBhbmQgcmNvbgorCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJICAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiwgcEFzeVNkb1NlcUNvbl9wLT5tX2JTZW5kU2VxTnVtKTsKKwkvLyBzZXQgc2VuZCBzZXF1ZW5jZSBudW1iZXIgYW5kIHNjb24KKwlBbWlTZXRCeXRlVG9MZSgmcEVwbEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJCSAgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uLCBwQXN5U2RvU2VxQ29uX3AtPm1fYlJlY1NlcU51bSk7CisKKwkvLyBhZGQgc2l6ZQorCXVpRGF0YVNpemVfcCArPSBFUExfU0VRX0hFQURFUl9TSVpFOworCisJLy8gZm9yd2FyZCBmcmFtZSB0byBhcHByb3ByaWF0ZSBsb3dlciBsYXllcgorCVJldCA9IEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyKHBBc3lTZG9TZXFDb25fcCwgdWlEYXRhU2l6ZV9wLCBwRXBsRnJhbWUpOwkvLyBwb2ludGVyIHRvIGZyYW1lCisKKwkvLyBjaGVjayBpZiBhbGwgYWxscmlnaHQKKwlpZiAoKFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkKKwkgICAgJiYgKGZGcmFtZUluSGlzdG9yeV9wICE9IEZBTFNFKSkgeworCQkvLyBzZXQgb3duIHNjb24gdG8gMiBpZiBuZWVkZWQKKwkJaWYgKChwQXN5U2RvU2VxQ29uX3AtPm1fYlJlY1NlcU51bSAmIDB4MDMpID09IDB4MDMpIHsKKwkJCXBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtLS07CisJCX0KKwkJLy8gc2F2ZSBmcmFtZSB0byBoaXN0b3J5CisJCVJldCA9IEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5KHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJCSBwRXBsRnJhbWUsIHVpRGF0YVNpemVfcCk7CisJCWlmIChSZXQgPT0ga0VwbFNkb1NlcU5vRnJlZUhpc3RvcnkpIHsJLy8gcmVxdWVzdCBBY2sgbmVlZGVkCisJCQlSZXQgPSBrRXBsU2RvU2VxUmVxdWVzdEFja05lZWRlZDsKKwkJfQorCisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogaW50ZXJuIGZ1bmN0aW9uIHRvIHNlbmQgYSBwcmV2aW91c2x5IGNyZWF0ZWQgZnJhbWUgdG8gbG93ZXIgbGF5ZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZGF0YSBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgMCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgc2l6ZSBvZiBBc25kIGhlYWRlciEhIQorLy8gICAgICAgICAgICAgIHBEYXRhX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIE5VTEwpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRXBsRnJhbWVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIGNhbGwgc2VuZC1mdW5jdGlvbgorCS8vIGNoZWNrIGhhbmRsZSBmb3IgVURQIG9yIEFzbmQKKwlpZiAoKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUgJiBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSykgPT0gRVBMX1NET19VRFBfSEFORExFKSB7CS8vIHNlbmQgb3ZlciBVRFAKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCVJldCA9IEVwbFNkb1VkcHVTZW5kRGF0YShwQXN5U2RvU2VxQ29uX3AtPm1fQ29uSGFuZGxlLCBwRXBsRnJhbWVfcCwJLy8gcG9pbnRlciB0byBmcmFtZQorCQkJCQkgdWlEYXRhU2l6ZV9wKTsKKyNlbHNlCisJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKworCX0gZWxzZSBpZiAoKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUgJiBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSykgPT0gRVBMX1NET19BU05EX0hBTkRMRSkgewkvLyBBU05ECisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKwkJUmV0ID0gRXBsU2RvQXNuZHVTZW5kRGF0YShwQXN5U2RvU2VxQ29uX3AtPm1fQ29uSGFuZGxlLCBwRXBsRnJhbWVfcCwJLy8gcG9pbnRlciB0byBmcmFtZQorCQkJCQkgIHVpRGF0YVNpemVfcCk7CisjZWxzZQorCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworI2VuZGlmCisJfSBlbHNlIHsJCS8vIGVycm9yCisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkSGRsOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lSZWNlaXZlQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGNhbGxiYWNrLWZ1bmN0aW9uIGZvciByZWNlaXZlZCBmcmFtZXMgZnJvbSBsb3dlciBsYXllcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBDb25IZGxfcCAgICAgICAgPSBoYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcFNkb1NlcURhdGFfcCAgID0gcG9pbnRlciB0byBmcmFtZQorLy8gICAgICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBzaXplIG9mIGZyYW1lCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5UmVjZWl2ZUNiKHRFcGxTZG9Db25IZGwgQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvU2VxICogcFNkb1NlcURhdGFfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQgPSAwOworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyeSA9IEVQTF9NQVhfU0RPX1NFUV9DT047CisJdEVwbEFzeVNkb1NlcUNvbiAqcEFzeVNkb1NlcUNvbjsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZSk7CisjZW5kaWYKKworCUVQTF9EQkdMVkxfU0RPX1RSQUNFMigiSGFuZGxlOiAweCV4ICwgRmlyc3QgRGF0YWJ5dGUgMHgleFxuIiwgQ29uSGRsX3AsCisJCQkgICAgICAoKEJZVEUgKikgcFNkb1NlcURhdGFfcClbMF0pOworCisJLy8gc2VhcmNoIGNvbnRyb2xsIHN0cnVjdHVyZSBmb3IgdGhpcyBjb25uZWN0aW9uCisJcEFzeVNkb1NlcUNvbiA9ICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlDb3VudF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSBDb25IZGxfcCkgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID09IDApCisJCQkgICAmJiAodWlGcmVlRW50cnkgPT0gRVBMX01BWF9TRE9fU0VRX0NPTikpIHsKKwkJCS8vIGZyZWUgZW50cnkKKwkJCXVpRnJlZUVudHJ5ID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXBBc3lTZG9TZXFDb24rKzsKKwl9CisKKwlpZiAodWlDb3VudCA9PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CS8vIG5ldyBjb25uZWN0aW9uCisJCWlmICh1aUZyZWVFbnRyeSA9PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCQlSZXQgPSBrRXBsU2RvU2VxTm9GcmVlSGFuZGxlOworCQkJZ290byBFeGl0OworCQl9IGVsc2UgeworCQkJcEFzeVNkb1NlcUNvbiA9CisJCQkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJICAgIG1fQXN5U2RvQ29ubmVjdGlvblt1aUZyZWVFbnRyeV07CisJCQkvLyBzYXZlIGhhbmRsZSBmcm9tIGxvd2VyIGxheWVyCisJCQlwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9IENvbkhkbF9wOworCQkJLy8gaW5jcmVtZW50IHVzZSBjb3VudGVyCisJCQlwQXN5U2RvU2VxQ29uLT5tX3VpVXNlQ291bnQrKzsKKwkJCXVpQ291bnQgPSB1aUZyZWVFbnRyeTsKKwkJfQorCX0KKwkvLyBjYWxsIGhpc3RvcnkgYWNrIGZ1bmN0aW9uCisJUmV0ID0gRXBsU2RvQXN5QWNrRnJhbWVUb0hpc3RvcnkocEFzeVNkb1NlcUNvbiwKKwkJCQkJIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgKCZwU2RvU2VxRGF0YV9wLT4KKwkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uKSAmCisJCQkJCSAgRVBMX1NFUV9OVU1fTUFTSykpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uCisJTGVhdmVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZSk7CisjZW5kaWYKKworCS8vIGNhbGwgcHJvY2VzcyBmdW5jdGlvbiB3aXRoIHBvaW50ZXIgb2YgZnJhbWUgYW5kIGV2ZW50IGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjCisJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUNvdW50LAorCQkJCSAgdWlEYXRhU2l6ZV9wLAorCQkJCSAgTlVMTCwgcFNkb1NlcURhdGFfcCwga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWMpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lJbml0SGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgaW50aSBmdW5jdGlvbiBmb3IgaGlzdG9yeSBidWZmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5SW5pdEhpc3Rvcnkodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCS8vIGluaXQgbV9iRnJlZUVudHJpZXMgaW4gaGlzdG9yeS1idWZmZXIKKwlmb3IgKHVpQ291bnQgPSAwOyB1aUNvdW50IDwgRVBMX01BWF9TRE9fU0VRX0NPTjsgdWlDb3VudCsrKSB7CisJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUNvdW50XS4KKwkJICAgIG1fU2RvQ29uSGlzdG9yeS5tX2JGcmVlRW50cmllcyA9IEVQTF9TRE9fSElTVE9SWV9TSVpFOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lBZGRGcmFtZVRvSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gdG8gYWRkIGEgZnJhbWUgdG8gdGhlIGhpc3RvcnkgYnVmZmVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhpcyBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBGcmFtZV9wICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgdWlTaXplX3AgICAgICAgID0gc2l6ZSBvZiB0aGUgZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgc2l6ZSBvZiB0aGUgZXRoZXJuZXQgaGVhZGVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGFzbmQgaGVhZGVyCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lBZGRGcmFtZVRvSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIHRFcGxGcmFtZSAqIHBGcmFtZV9wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsQXN5U2RvQ29uSGlzdG9yeSAqcEhpc3Rvcnk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGFkZCBmcmFtZSB0byBoaXN0b3J5IGJ1ZmZlcgorCisJLy8gY2hlY2sgc2l6ZQorCS8vICQkJCBkLmsuIEVQTF9TRVFfSElTVE9SWV9GUkFNRV9TSVpFIGluY2x1ZGVzIHRoZSBoZWFkZXIgc2l6ZSwgYnV0IHVpU2l6ZV9wIGRvZXMgbm90ISEhCisJaWYgKHVpU2l6ZV9wID4gRVBMX1NFUV9ISVNUUk9ZX0ZSQU1FX1NJWkUpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUZyYW1lU2l6ZUVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgcG9pbnRlciB0byBoaXN0b3J5CisJcEhpc3RvcnkgPSAmcEFzeVNkb1NlcUNvbl9wLT5tX1Nkb0Nvbkhpc3Rvcnk7CisKKwkvLyBjaGVjayBpZiBhIGZyZWUgZW50cnkgaXMgYXZhaWxhYmxlCisJaWYgKHBIaXN0b3J5LT5tX2JGcmVlRW50cmllcyA+IDApIHsJLy8gd3JpdGUgbWVzc2FnZSBpbiBmcmVlIGVudHJ5CisJCUVQTF9NRU1DUFkoJgorCQkJICAgKCh0RXBsRnJhbWUgKikgcEhpc3RvcnktPgorCQkJICAgIG1fYWFiSGlzdG9yeUZyYW1lW3BIaXN0b3J5LT5tX2JXcml0ZV0pLT4KKwkJCSAgIG1fbGVfYk1lc3NhZ2VUeXBlLCAmcEZyYW1lX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLAorCQkJICAgdWlTaXplX3AgKyBFUExfQVNORF9IRUFERVJfU0laRSk7CisJCS8vIHN0b3JlIHNpemUKKwkJcEhpc3RvcnktPm1fYXVpRnJhbWVTaXplW3BIaXN0b3J5LT5tX2JXcml0ZV0gPSB1aVNpemVfcDsKKworCQkvLyBkZWNyZW1lbmQgbnVtYmVyIG9mIGZyZWUgYnVmZmVyZW50cmllcworCQlwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMtLTsKKworCQkvLyBpbmNyZW1lbnQgd3JpdGVpbmRleAorCQlwSGlzdG9yeS0+bV9iV3JpdGUrKzsKKworCQkvLyBjaGVjayBpZiB3cml0ZS1pbmRleCBydW4gb3ZlciBhcnJheS1ib2FyZGVyCisJCWlmIChwSGlzdG9yeS0+bV9iV3JpdGUgPT0gRVBMX1NET19ISVNUT1JZX1NJWkUpIHsKKwkJCXBIaXN0b3J5LT5tX2JXcml0ZSA9IDA7CisJCX0KKworCX0gZWxzZSB7CQkvLyBubyBmcmVlIGVudHJ5CisJCVJldCA9IGtFcGxTZG9TZXFOb0ZyZWVIaXN0b3J5OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5QWNrRnJhbWVUb0hpc3RvcnkKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhY2tub3dsZWRnZWQgZnJhbWVzIGZyb24gaGlzdG9yeSBidWZmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgYlJlY1NlcU51bWJlcl9wID0gcmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHJlY2VpdmVkIGZyYW1lCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWNrRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICBCWVRFIGJSZWNTZXFOdW1iZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsQXN5U2RvQ29uSGlzdG9yeSAqcEhpc3Rvcnk7CisJQllURSBiQWNrSW5kZXg7CisJQllURSBiQ3VycmVudFNlcU51bTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaGlzdG9yeSBidWZmZXIKKwlwSGlzdG9yeSA9ICZwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeTsKKworCS8vIHJlbGVhc2UgYWxsIGFja25vd2xlZGdlZCBmcmFtZXMgZnJvbSBoaXN0b3J5IGJ1ZmZlcgorCisJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gaGlzdG9yeQorCWlmIChwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMgPCBFUExfU0RPX0hJU1RPUllfU0laRSkgeworCQliQWNrSW5kZXggPSBwSGlzdG9yeS0+bV9iQWNrOworCQlkbyB7CisJCQliQ3VycmVudFNlcU51bSA9CisJCQkgICAgKCgodEVwbEZyYW1lICopIHBIaXN0b3J5LT4KKwkJCSAgICAgIG1fYWFiSGlzdG9yeUZyYW1lW2JBY2tJbmRleF0pLT5tX0RhdGEubV9Bc25kLgorCQkJICAgICBtX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX1NFUV9OVU1fTUFTSyk7CisJCQlpZiAoKChiUmVjU2VxTnVtYmVyX3AgLQorCQkJICAgICAgYkN1cnJlbnRTZXFOdW0pICYgRVBMX1NFUV9OVU1fTUFTSykKKwkJCSAgICA8IEVQTF9TRVFfTlVNX1RIUkVTSE9MRCkgeworCQkJCXBIaXN0b3J5LT5tX2F1aUZyYW1lU2l6ZVtiQWNrSW5kZXhdID0gMDsKKwkJCQliQWNrSW5kZXgrKzsKKwkJCQlwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMrKzsKKwkJCQlpZiAoYkFja0luZGV4ID09IEVQTF9TRE9fSElTVE9SWV9TSVpFKSB7CS8vIHJlYWQgaW5kZXggcnVuIG92ZXIgYXJyYXktYm9hcmRlcgorCQkJCQliQWNrSW5kZXggPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIG5vdGhpbmcgdG8gZG8gYW55bW9yZSwKKwkJCQkvLyBiZWNhdXNlIGFueSBmdXJ0aGVyIGZyYW1lIGluIGhpc3RvcnkgaGFzIGxhcmdlciBzZXF1ZW5jZQorCQkJCS8vIG51bWJlciB0aGFuIHRoZSBhY2tub3dsZWRnZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfQorCQl3aGlsZSAoKCgoYlJlY1NlcU51bWJlcl9wIC0gMSAtCisJCQkgIGJDdXJyZW50U2VxTnVtKSAmIEVQTF9TRVFfTlVNX01BU0spCisJCQk8IEVQTF9TRVFfTlVNX1RIUkVTSE9MRCkKKwkJICAgICAgICYmIChwSGlzdG9yeS0+bV9iV3JpdGUgIT0gYkFja0luZGV4KSk7CisKKwkJLy8gc3RvcmUgbG9jYWwgcmVhZC1pbmRleCB0byBnbG9iYWwgdmFyCisJCXBIaXN0b3J5LT5tX2JBY2sgPSBiQWNrSW5kZXg7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIGZ1bmN0aW9uIHRvIG9uZSBmcmFtZSBmcm9tIGhpc3RvcnkKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcHBGcmFtZV9wICAgICAgID0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgdGhlIHN0b3JlZCBmcmFtZQorLy8gICAgICAgICAgICAgICAgICBwdWlTaXplX3AgICAgICAgPSBPVVQ6IHNpemUgb2YgdGhlIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIGZJbml0UmVhZCAgICAgICA9IGJvb2wgd2hpY2ggaW5kaWNhdGUgYSBzdGFydCBvZiByZXRyYW5zbWlzc2lvbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHJldHVybiBsYXN0IG5vdCBhY2tub3dsZWRnZWQgbWVzc2FnZSBpZiBUUlVFCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgIHRFcGxGcmFtZSAqKiBwcEZyYW1lX3AsCisJCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpU2l6ZV9wLAorCQkJCQkgICBCT09MIGZJbml0UmVhZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBc3lTZG9Db25IaXN0b3J5ICpwSGlzdG9yeTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVhZCBvbmUgbWVzc2FnZSBmcm9tIEhpc3RvcnkKKworCS8vIGdldCBwb2ludGVyIHRvIGhpc3RvcnkgYnVmZmVyCisJcEhpc3RvcnkgPSAmcEFzeVNkb1NlcUNvbl9wLT5tX1Nkb0Nvbkhpc3Rvcnk7CisKKwkvLyBjaGVjayBpZiBpbml0CisJaWYgKGZJbml0UmVhZF9wICE9IEZBTFNFKSB7CS8vIGluaXRpYWxpemUgcmVhZCBpbmRleCB0byB0aGUgaW5kZXggd2hpY2ggc2hhbGwgYmUgYWNrbm93bGVkZ2VkIG5leHQKKwkJcEhpc3RvcnktPm1fYlJlYWQgPSBwSGlzdG9yeS0+bV9iQWNrOworCX0KKwkvLyBjaGVjayBpZiBlbnRyaWVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKwlpZiAoKHBIaXN0b3J5LT5tX2JGcmVlRW50cmllcyA8IEVQTF9TRE9fSElTVE9SWV9TSVpFKQorCSAgICAmJiAocEhpc3RvcnktPm1fYldyaXRlICE9IHBIaXN0b3J5LT5tX2JSZWFkKSkgeworLy8gICAgICAgIFBSSU5URjQoIkVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSgpOiBpbml0ID0gJWQsIHJlYWQgPSAldSwgd3JpdGUgPSAldSwgYWNrID0gJXUiLCAoaW50KSBmSW5pdFJlYWRfcCwgKFdPUkQpcEhpc3RvcnktPm1fYlJlYWQsIChXT1JEKXBIaXN0b3J5LT5tX2JXcml0ZSwgKFdPUkQpcEhpc3RvcnktPm1fYkFjayk7CisvLyAgICAgICAgUFJJTlRGMigiLCBmcmVlIGVudHJpZXMgPSAldSwgbmV4dCBmcmFtZSBzaXplID0gJXVcbiIsIChXT1JEKXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcywgcEhpc3RvcnktPm1fYXVpRnJhbWVTaXplW3BIaXN0b3J5LT5tX2JSZWFkXSk7CisKKwkJLy8gcmV0dXJuIHBvaW50ZXIgdG8gc3RvcmVkIGZyYW1lCisJCSpwcEZyYW1lX3AgPQorCQkgICAgKHRFcGxGcmFtZSAqKSBwSGlzdG9yeS0+bV9hYWJIaXN0b3J5RnJhbWVbcEhpc3RvcnktPgorCQkJCQkJCSAgICAgIG1fYlJlYWRdOworCisJCS8vIHNhdmUgc2l6ZQorCQkqcHVpU2l6ZV9wID0gcEhpc3RvcnktPm1fYXVpRnJhbWVTaXplW3BIaXN0b3J5LT5tX2JSZWFkXTsKKworCQlwSGlzdG9yeS0+bV9iUmVhZCsrOworCQlpZiAocEhpc3RvcnktPm1fYlJlYWQgPT0gRVBMX1NET19ISVNUT1JZX1NJWkUpIHsKKwkJCXBIaXN0b3J5LT5tX2JSZWFkID0gMDsKKwkJfQorCisJfSBlbHNlIHsKKy8vICAgICAgICBQUklOVEYzKCJFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkoKTogcmVhZCA9ICV1LCBhY2sgPSAldSwgZnJlZSBlbnRyaWVzID0gJXUsIG5vIGZyYW1lXG4iLCAoV09SRClwSGlzdG9yeS0+bV9iUmVhZCwgKFdPUkQpcEhpc3RvcnktPm1fYkFjaywgKFdPUkQpcEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzKTsKKworCQkvLyBubyBtb3JlIGZyYW1lcyB0byBzZW5kCisJCS8vIHJldHVybiBudWxsIHBvaW50ZXIKKwkJKnBwRnJhbWVfcCA9IE5VTEw7CisKKwkJKnB1aVNpemVfcCA9IDA7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyZWUgaGlzdHJveSBlbnRyaWVzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBBc3lTZG9TZXFDb25fcCA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhpcyBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdW5zaWduZWQgaW50ICAgID0gbnVtYmVyIG9mIGZyZWUgZW50cmllcworLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHVuc2lnbmVkIGludCBFcGxTZG9Bc3lHZXRGcmVlRW50cmllc0Zyb21IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKgorCQkJCQkJICAgICAgIHBBc3lTZG9TZXFDb25fcCkKK3sKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cmllczsKKworCXVpRnJlZUVudHJpZXMgPQorCSAgICAodW5zaWduZWQgaW50KXBBc3lTZG9TZXFDb25fcC0+bV9TZG9Db25IaXN0b3J5Lm1fYkZyZWVFbnRyaWVzOworCisJcmV0dXJuIHVpRnJlZUVudHJpZXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gc2V0cyBvciBtb2RpZnkgdGltZXIgaW4gdGltZXJtb3N1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgdWxUaW1lb3V0ICAgICAgID0gdGltZW91dCBpbiBtcworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHVuc2lnbmVkIGludCAgICA9IG51bWJlciBvZiBmcmVlIGVudHJpZXMKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNldFRpbWVyKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lb3V0KQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCVRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Nkb0FzeVNlcTsKKwlUaW1lckFyZy5tX3VsQXJnID0gKHVuc2lnbmVkIGxvbmcpcEFzeVNkb1NlcUNvbl9wOworCisJaWYgKHBBc3lTZG9TZXFDb25fcC0+bV9FcGxUaW1lckhkbCA9PSAwKSB7CS8vIGNyZWF0ZSBuZXcgdGltZXIKKwkJUmV0ID0gRXBsVGltZXJ1U2V0VGltZXJNcygmcEFzeVNkb1NlcUNvbl9wLT5tX0VwbFRpbWVySGRsLAorCQkJCQkgIHVsVGltZW91dCwgVGltZXJBcmcpOworCX0gZWxzZSB7CQkvLyBtb2RpZnkgZXhpc2l0aW5nIHRpbWVyCisJCVJldCA9IEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBBc3lTZG9TZXFDb25fcC0+bV9FcGxUaW1lckhkbCwKKwkJCQkJICAgICB1bFRpbWVvdXQsIFRpbWVyQXJnKTsKKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Db211LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0NvbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBlYjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Db211LmMKQEAgLTAsMCArMSwzMzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFNETyBDb21tYW5kIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0NvbXUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTQgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxTZG9Db211LmgiCisKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgPT0gMCkgJiZcCisgICAgICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpID09IDApICAgKQorCisjZXJyb3IgJ0VSUk9SOiBBdCBsZWFzdCBTRE8gU2VydmVyIG9yIFNETyBDbGllbnQgc2hvdWxkIGJlIGFjdGl2YXRlIScKKworI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpID09IDApICYmIChFUExfT0JEX1VTRV9LRVJORUwgPT0gRkFMU0UpCisKKyNlcnJvciAnRVJST1I6IFNETyBTZXJ2ZXIgbmVlZHMgT0JEdSBtb2R1bGUhJworCisjZW5kaWYKKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9NQVhfU0RPX0NPTV9DT04KKyNkZWZpbmUgRVBMX01BWF9TRE9fQ09NX0NPTiAgICAgICAgIDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGludGVybiBldmVudHMKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0ID0gMHgwMCwJLy8gZmlyc3QgZnJhbWUgdG8gc2VuZAorCWtFcGxTZG9Db21Db25FdmVudFJlYyA9IDB4MDEsCS8vIGZyYW1lIHJlY2VpdmVkCisJa0VwbFNkb0NvbUNvbkV2ZW50Q29uRXN0YWJsaXNoZWQgPSAweDAyLAkvLyBjb25uZWN0aW9uIGVzdGFibGlzaGVkCisJa0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkID0gMHgwMywJLy8gY29ubmVjdGlvbiBjbG9zZWQKKwlrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZCA9IDB4MDQsCS8vIGFja25vd2xlZGdlIHJlY2VpdmVkIGJ5IGxvd2VyIGxheWVyCisJLy8gLT4gY29udGludWUgc2VuZGluZworCWtFcGxTZG9Db21Db25FdmVudEZyYW1lU2VuZGVkID0gMHgwNSwJLy8gbG93ZXIgaGFzIHNlbmQgYSBmcmFtZQorCWtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvciA9IDB4MDYsCS8vIGVycm9yIGR1cmluZ2luaXRpYWxpc2lhdGlvbgorCS8vIG9mIHRoZSBjb25uZWN0aW9uCisJa0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dCA9IDB4MDcJLy8gdGltZW91dCBpbiBsb3dlciBsYXllcgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkgICAgLAorCisJa0VwbFNkb0NvbUNvbkV2ZW50SW5pdENvbiA9IDB4MDgsCS8vIGluaXQgY29ubmVjdGlvbiAob25seSBjbGllbnQpCisJa0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQgPSAweDA5CS8vIGFib3J0IHNkbyB0cmFuc2ZlciAob25seSBjbGllbnQpCisjZW5kaWYKK30gdEVwbFNkb0NvbUNvbkV2ZW50OworCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9Db21TZW5kVHlwZVJlcSA9IDB4MDAsCS8vIHNlbmQgYSByZXF1ZXN0CisJa0VwbFNkb0NvbVNlbmRUeXBlQWNrUmVzID0gMHgwMSwJLy8gc2VuZCBhIHJlc29uc2Ugd2l0aG91dCBkYXRhCisJa0VwbFNkb0NvbVNlbmRUeXBlUmVzID0gMHgwMiwJLy8gc2VuZCByZXNwb25zZSB3aXRoIGRhdGEKKwlrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCA9IDB4MDMJLy8gc2VuZCBhYm9ydAorfSB0RXBsU2RvQ29tU2VuZFR5cGU7CisKKy8vIHN0YXRlIG9mIHRoZSBzdGF0ZSBtYXNjaGluZQordHlwZWRlZiBlbnVtIHsKKwkvLyBHZW5lcmFsIFN0YXRlCisJa0VwbFNkb0NvbVN0YXRlSWRsZSA9IDB4MDAsCS8vIGlkbGUgc3RhdGUKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKwkvLyBTZXJ2ZXIgU3RhdGVzCisJa0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zID0gMHgwMSwJLy8gc2VuZCBmb2xsb3dpbmcgZnJhbWVzCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkvLyBDbGllbnQgU3RhdGVzCisJa0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQgPSAweDEwLAkvLyB3YWl0IGZvciBpbml0IGNvbm5lY3Rpb24KKwkvLyBvbiBsb3dlciBsYXllcgorCWtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZCA9IDB4MTEsCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwlrRXBsU2RvQ29tU3RhdGVDbGllbnRTZWdtVHJhbnMgPSAweDEyCS8vIHNlbmQgZm9sbG93aW5nIGZyYW1lcworI2VuZGlmCit9IHRFcGxTZG9Db21TdGF0ZTsKKworLy8gY29udHJvbCBzdHJ1Y3R1cmUgZm9yIHRyYW5zYWN0aW9uCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb1NlcUNvbkhkbCBtX1Nkb1NlcUNvbkhkbDsJLy8gaWYgIT0gMCAtPiBlbnRyeSB1c2VkCisJdEVwbFNkb0NvbVN0YXRlIG1fU2RvQ29tU3RhdGU7CisJQllURSBtX2JUcmFuc2FjdGlvbklkOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBOb2RlSWQgb2YgdGhlIHRhcmdldAorCS8vIC0+IG5lZWRlZCB0byByZWluaXQgY29ubmVjdGlvbgorCS8vICAgIGFmdGVyIHRpbWVvdXQKKwl0RXBsU2RvVHJhbnNUeXBlIG1fU2RvVHJhbnNUeXBlOwkvLyBBdXRvLCBFeHBlZGl0ZWQsIFNlZ21lbnRlZAorCXRFcGxTZG9TZXJ2aWNlVHlwZSBtX1Nkb1NlcnZpY2VUeXBlOwkvLyBXcml0ZUJ5SW5kZXgsIFJlYWRCeUluZGV4CisJdEVwbFNkb1R5cGUgbV9TZG9Qcm90VHlwZTsJLy8gcHJvdG9jb2wgbGF5ZXI6IEF1dG8sIFVkcCwgQXNuZCwgUGRvCisJQllURSAqbV9wRGF0YTsJCS8vIHBvaW50ZXIgdG8gZGF0YQorCXVuc2lnbmVkIGludCBtX3VpVHJhbnNTaXplOwkvLyBudW1iZXIgb2YgYnl0ZXMKKwkvLyB0byB0cmFuc2ZlcgorCXVuc2lnbmVkIGludCBtX3VpVHJhbnNmZXJyZWRCeXRlOwkvLyBudW1iZXIgb2YgYnl0ZXMKKwkvLyBhbHJlYWR5IHRyYW5zZmVycmVkCisJdEVwbFNkb0ZpbmlzaGVkQ2IgbV9wZm5UcmFuc2ZlckZpbmlzaGVkOwkvLyBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUKKwkvLyBhcHBsaWNhdGlvbgorCS8vIC0+IGNhbGxlZCBpbiB0aGUgZW5kIG9mCisJLy8gICAgdGhlIFNETyB0cmFuc2ZlcgorCXZvaWQgKm1fcFVzZXJBcmc7CS8vIHVzZXIgZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIKKworCURXT1JEIG1fZHdMYXN0QWJvcnRDb2RlOwkvLyBzYXZlIHRoZSBsYXN0IGFib3J0IGNvZGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJLy8gb25seSBmb3IgY2xpZW50CisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRJbmRleDsJLy8gaW5kZXggdG8gYWNjZXNzCisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRTdWJJbmRleDsJLy8gc3ViaW9uZGV4IHRvIGFjY2VzcworCisJLy8gZm9yIGZ1dHVyZSB1c2UKKwl1bnNpZ25lZCBpbnQgbV91aVRpbWVvdXQ7CS8vIHRpbWVvdXQgZm9yIHRoaXMgY29ubmVjdGlvbgorCisjZW5kaWYKKworfSB0RXBsU2RvQ29tQ29uOworCisvLyBpbnN0YW5jZSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db21Db24gbV9TZG9Db21Db25bRVBMX01BWF9TRE9fQ09NX0NPTl07CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247CisjZW5kaWYKKworfSB0RXBsU2RvQ29tSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbFNkb0NvbUluc3RhbmNlIFNkb0NvbUluc3RhbmNlX2c7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVJlY2VpdmVDYih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Db25DYih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSB0RXBsQXN5U2RvQ29uU3RhdGUgQXN5U2RvQ29uU3RhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlYXJjaENvbkludGVybih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgICB0RXBsU2RvQ29tQ29uRXZlbnQgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgIHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCSAgICB0RXBsU2RvQ29tQ29uU3RhdGUKKwkJCQkJICAgIFNkb0NvbUNvblN0YXRlX3ApOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFJlYWRCeUluZGV4KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybih0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB0RXBsU2RvQ29tU2VuZFR5cGUgU2VuZFR5cGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlckluaXRXcml0ZUJ5SW5kZXgodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50U2VuZCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50UHJvY2Vzc0ZyYW1lKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSAgICAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgRFdPUkQgZHdBYm9ydENvZGVfcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8U0RPIENvbW1hbmQgTGF5ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogU0RPIENvbW1hbmQgbGF5ZXIgTW9kdWwKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogSW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFNkb0NvbUFkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IEluaXQgYWRkaXRpb25hbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUFkZEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgY29udHJvbGwgc3RydWN0dXJlCisJRVBMX01FTVNFVCgmU2RvQ29tSW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKFNkb0NvbUluc3RhbmNlX2cpKTsKKworCS8vIGluaXQgaW5zdGFuY2Ugb2YgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZShFcGxTZG9Db21SZWNlaXZlQ2IsIEVwbFNkb0NvbUNvbkNiKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gY3JlYXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbiA9CisJICAgICZTZG9Db21JbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uOworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oU2RvQ29tSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tRGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tRGVsSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZGVsZXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlEZWxldGVDcml0aWNhbFNlY3Rpb24oU2RvQ29tSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwlSZXQgPSBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21EZWZpbmVDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVmaW5lcyBhIFNETyBjb25uZWN0aW9uIHRvIGFub3RoZXIgbm9kZQorLy8gICAgICAgICAgICAgIC0+IGluaXQgbG93ZXIgbGF5ZXIgYW5kIHJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uLgorLy8gICAgICAgICAgICAgIFR3byBjbGllbnQgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgbm9kZSB2aWEgdGhlIHNhbWUgcHJvdG9jb2wKKy8vICAgICAgICAgICAgICBhcmUgbm90IGFsbG93ZWQuIElmIHRoaXMgZnVuY3Rpb24gZGV0ZWN0cyBzdWNoIGEgc2l0dWF0aW9uCisvLyAgICAgICAgICAgICAgaXQgd2lsbCByZXR1cm4ga0VwbFNkb0NvbUhhbmRsZUV4aXN0cyBhbmQgdGhlIGhhbmRsZSBvZgorLy8gICAgICAgICAgICAgIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIGluIHBTZG9Db21Db25IZGxfcC4KKy8vICAgICAgICAgICAgICBVc2luZyBvZiBleGlzdGluZyBzZXJ2ZXIgY29ubmVjdGlvbnMgaXMgcG9zc2libGUuCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21Db25IZGxfcCAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpVGFyZ2V0Tm9kZUlkX3AgICAgPSBOb2RlSWQgb2YgdGhlIHRhcmdldG5vZGUKKy8vICAgICAgICAgICAgICBQcm90VHlwZV9wICAgICAgICAgID0gdHlwZSBvZiBwcm90b2NvbCB0byB1c2UgZm9yIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tRGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxTZG9UeXBlIFByb3RUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUhkbDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJLy8gY2hlY2sgUGFyYW1ldGVyCisJQVNTRVJUKHBTZG9Db21Db25IZGxfcCAhPSBOVUxMKTsKKworCS8vIGNoZWNrIE5vZGVJZAorCWlmICgodWlUYXJnZXROb2RlSWRfcCA9PSBFUExfQ19BRFJfSU5WQUxJRCkKKwkgICAgfHwgKHVpVGFyZ2V0Tm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisKKwl9CisJLy8gc2VhcmNoIGZyZWUgY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bMF07CisJdWlDb3VudCA9IDA7CisJdWlGcmVlSGRsID0gRVBMX01BWF9TRE9fQ09NX0NPTjsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IDApIHsJLy8gZnJlZSBlbnRyeQorCQkJdWlGcmVlSGRsID0gdWlDb3VudDsKKwkJfSBlbHNlIGlmICgocFNkb0NvbUNvbi0+bV91aU5vZGVJZCA9PSB1aVRhcmdldE5vZGVJZF9wKQorCQkJICAgJiYgKHBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUgPT0gUHJvdFR5cGVfcCkpIHsJLy8gZXhpc3RpbmcgY2xpZW50IGNvbm5lY3Rpb24gd2l0aCBzYW1lIG5vZGUgSUQgYW5kIHNhbWUgcHJvdG9jb2wgdHlwZQorCQkJKnBTZG9Db21Db25IZGxfcCA9IHVpQ291bnQ7CisJCQlSZXQgPSBrRXBsU2RvQ29tSGFuZGxlRXhpc3RzOworCQkJZ290byBFeGl0OworCQl9CisJCXVpQ291bnQrKzsKKwkJcFNkb0NvbUNvbisrOworCX0KKworCWlmICh1aUZyZWVIZGwgPT0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tTm9GcmVlSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW3VpRnJlZUhkbF07CisJLy8gc2F2ZSBoYW5kbGUgZm9yIGFwcGxpY2F0aW9uCisJKnBTZG9Db21Db25IZGxfcCA9IHVpRnJlZUhkbDsKKwkvLyBzYXZlIHBhcmFtZXRlcnMKKwlwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlID0gUHJvdFR5cGVfcDsKKwlwU2RvQ29tQ29uLT5tX3VpTm9kZUlkID0gdWlUYXJnZXROb2RlSWRfcDsKKworCS8vIHNldCBUcmFuc2FjdGlvbiBJZAorCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQgPSAwOworCisJLy8gY2hlY2sgcHJvdG9jb2wKKwlzd2l0Y2ggKFByb3RUeXBlX3ApIHsKKwkJLy8gdWRwCisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworCQkJLy8gY2FsbCBjb25uZWN0aW9uIGludCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJUmV0ID0gRXBsU2RvQXN5U2VxSW5pdENvbigmcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgIHBTZG9Db21Db24tPm1fdWlOb2RlSWQsCisJCQkJCQkgIGtFcGxTZG9UeXBlVWRwKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vIEFzZW5kCisJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJCXsKKwkJCS8vIGNhbGwgY29ubmVjdGlvbiBpbnQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCVJldCA9IEVwbFNkb0FzeVNlcUluaXRDb24oJnBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICBwU2RvQ29tQ29uLT5tX3VpTm9kZUlkLAorCQkJCQkJICBrRXBsU2RvVHlwZUFzbmQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gUGRvIC0+IG5vdCBzdXBwb3J0ZWQKKwljYXNlIGtFcGxTZG9UeXBlUGRvOgorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3Q7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChtX1Byb3RUeXBlX3ApCisKKwkvLyBjYWxsIHByb2Nlc3MgZnVuY3Rpb24KKwlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKHVpRnJlZUhkbCwKKwkJCQkgICAgIGtFcGxTZG9Db21Db25FdmVudEluaXRDb24sIE5VTEwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdCBTRE8gVHJhbnNmZXIgZm9yIGEgZGVmaW5lZCBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tVHJhbnNQYXJhbV9wICAgID0gU3RydWN0dXJlIHdpdGggcGFyYW1ldGVycyBmb3IgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KHRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCAqCisJCQkJCSAgICAgICBwU2RvQ29tVHJhbnNQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAoKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlTdWJpbmRleCA+PSAweEZGKQorCSAgICB8fCAocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aUluZGV4ID09IDApCisJICAgIHx8IChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpSW5kZXggPiAweEZGRkYpCisJICAgIHx8IChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3BEYXRhID09IE5VTEwpCisJICAgIHx8IChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpRGF0YVNpemUgPT0gMCkpIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX1Nkb0NvbUNvbkhkbCA+PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKwlwU2RvQ29tQ29uID0KKwkgICAgJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9TZG9Db21Db25IZGxdOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIG9rCisJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IDApIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaWYgY29tbWFuZCBsYXllciBpcyBpZGxlCisJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNmZXJyZWRCeXRlICsgcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgPiAwKSB7CS8vIGhhbmRsZSBpcyBub3QgaWRsZQorCQlSZXQgPSBrRXBsU2RvQ29tSGFuZGxlQnVzeTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBhcmFtZXRlcgorCS8vIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlbmQgb2YgdHJhbnNmZXIKKwlwU2RvQ29tQ29uLT5tX3BmblRyYW5zZmVyRmluaXNoZWQgPQorCSAgICBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3BmblNkb0ZpbmlzaGVkQ2I7CisJcFNkb0NvbUNvbi0+bV9wVXNlckFyZyA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcFVzZXJBcmc7CisKKwkvLyBzZXQgdHlwZSBvZiBTRE8gY29tbWFuZAorCWlmIChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX1Nkb0FjY2Vzc1R5cGUgPT0ga0VwbFNkb0FjY2Vzc1R5cGVSZWFkKSB7CisJCXBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OworCX0gZWxzZSB7CisJCXBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDsKKworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gZGF0YQorCXBTZG9Db21Db24tPm1fcERhdGEgPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3BEYXRhOworCS8vIG1heGltYWwgYnl0ZXMgdG8gdHJhbnNmZXIKKwlwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aURhdGFTaXplOworCS8vIGJ5dGVzIGFscmVhZHkgdHJhbnNmZXJlZAorCXBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAwOworCisJLy8gcmVzZXQgcGFydHMgb2YgY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisJcFNkb0NvbUNvbi0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNBdXRvOworCS8vIHNhdmUgdGltZW91dAorCS8vcFNkb0NvbUNvbi0+bV91aVRpbWVvdXQgPSBTZG9Db21UcmFuc1BhcmFtX3AubV91aVRpbWVvdXQ7CisKKwkvLyBzYXZlIGluZGV4IGFuZCBzdWJpbmRleAorCXBTZG9Db21Db24tPm1fdWlUYXJnZXRJbmRleCA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlJbmRleDsKKwlwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0U3ViSW5kZXggPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpU3ViaW5kZXg7CisKKwkvLyBjYWxsIHByb2Nlc3MgZnVuY3Rpb24KKwlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQ29tQ29uSGRsLCBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3QsCS8vIGV2ZW50IHRvIHN0YXJ0IHRyYW5zZmVyCisJCQkJICAgICBOVUxMKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tVW5kZWZpbmVDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdW5kZWZpbmUgYSBTRE8gY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbUNvbkhkbF9wICAgID0gaGFuZGxlIGZvciB0aGUgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21VbmRlZmluZUNvbih0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChTZG9Db21Db25IZGxfcCA+PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW1Nkb0NvbUNvbkhkbF9wXTsKKworCS8vICQkJCBkLmsuIGFib3J0IGEgcnVubmluZyB0cmFuc2ZlciBiZWZvcmUgY2xvc2luZyB0aGUgc2VxdWVuY2UgbGF5ZXIKKworCWlmICgoKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsICYgfkVQTF9TRE9fU0VRX0hBTkRMRV9NQVNLKSAhPQorCSAgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREwpCisJICAgICYmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCAhPSAwKSkgeworCQkvLyBjbG9zZSBjb25uZWN0aW9uIGluIGxvd2VyIGxheWVyCisJCXN3aXRjaCAocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSkgeworCQljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJCXsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJCWNhc2Uga0VwbFNkb1R5cGVBdXRvOgorCQlkZWZhdWx0OgorCQkJeworCQkJCVJldCA9IGtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3Q7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCX0JCS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSkKKwl9CisKKwkvLyBjbGVhbiBjb250cm9sbCBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKHBTZG9Db21Db24sIDB4MDAsIHNpemVvZih0RXBsU2RvQ29tQ29uKSk7CisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbUdldFN0YXRlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJldHVybnMgdGhlIHN0YXRlIGZvIHRoZSBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgPSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgcFNkb0NvbUZpbmlzaGVkX3AgPSBwb2ludGVyIHRvIHN0cnVjdHVyIGZvciBzZG8gc3RhdGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tR2V0U3RhdGUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgdEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNkb0NvbUNvbkhkbF9wID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uSGRsX3BdOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIG9rCisJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IDApIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV9wVXNlckFyZyA9IHBTZG9Db21Db24tPm1fcFVzZXJBcmc7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fdWlOb2RlSWQgPSBwU2RvQ29tQ29uLT5tX3VpTm9kZUlkOworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3VpVGFyZ2V0SW5kZXggPSBwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0SW5kZXg7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fdWlUYXJnZXRTdWJJbmRleCA9IHBTZG9Db21Db24tPm1fdWlUYXJnZXRTdWJJbmRleDsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9CisJICAgIHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGU7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fZHdBYm9ydENvZGUgPSBwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZTsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25IZGwgPSBTZG9Db21Db25IZGxfcDsKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9PSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCkgeworCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVXcml0ZTsKKwl9IGVsc2UgeworCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVSZWFkOworCX0KKworCWlmIChwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSAhPSAwKSB7CS8vIHNkbyBhYm9ydAorCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25TdGF0ZSA9CisJCSAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQ7CisKKwkJLy8gZGVsZXRlIGFib3J0IGNvZGUKKwkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCisJfSBlbHNlIGlmICgocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spID09IEVQTF9TRE9fU0VRX0lOVkFMSURfSERMKSB7CS8vIGNoZWNrIHN0YXRlCisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvblN0YXRlID0KKwkJICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydDsKKwl9IGVsc2UgaWYgKHBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPT0ga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQpIHsKKwkJLy8gZmluaXNoZWQKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyTm90QWN0aXZlOworCX0gZWxzZSBpZiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKSB7CS8vIGZpbmlzaGVkCisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvblN0YXRlID0KKwkJICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbVNkb0Fib3J0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGFib3J0IGEgc2RvIHRyYW5zZmVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgPSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgZHdBYm9ydENvZGVfcCAgICAgPSBhYm9ydCBjb2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVNkb0Fib3J0KHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIERXT1JEIGR3QWJvcnRDb2RlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCWlmIChTZG9Db21Db25IZGxfcCA+PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uSGRsX3BdOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIG9rCisJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IDApIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGFib3J0IGNvZGUKKwlwU2RvQ29tQ29uLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZV9wOworCisJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgIGtFcGxTZG9Db21Db25FdmVudEFib3J0LAorCQkJCSAgICAgKHRFcGxBc3lTZG9Db20gKikgTlVMTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVJlY2VpdmVDYgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIFNETyBTZXF1ZW5jZSBMYXllcgorLy8gICAgICAgICAgICAgICAgICAtPiBpbmRpY2F0ZXMgbmV3IGRhdGEKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvU2VxQ29uSGRsX3AgPSBIYW5kbGUgZm9yIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgPSBwb2ludGVyIHRvIGRhdGEKKy8vICAgICAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgPSBzaXplIG9mIGRhdGEgKCQkJCBub3QgdXNlZCB5ZXQsIGJ1dCBpdCBzaG91bGQpCisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21SZWNlaXZlQ2IodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJLy8gc2VhcmNoIGNvbm5lY3Rpb24gaW50ZXJuYWxseQorCVJldCA9IEVwbFNkb0NvbVNlYXJjaENvbkludGVybihTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICAga0VwbFNkb0NvbUNvbkV2ZW50UmVjLCBwQXN5U2RvQ29tX3ApOworCisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UzCisJICAgICgiRXBsU2RvQ29tUmVjZWl2ZUNiIFNkb1NlcUNvbkhkbDogMHglWCwgRmlyc3QgQnl0ZSBvZiBwQXN5U2RvQ29tX3A6IDB4JTAyWCwgdWlEYXRhU2l6ZV9wOiAweCUwNFhcbiIsCisJICAgICBTZG9TZXFDb25IZGxfcCwgKFdPUkQpIHBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCSAgICAgdWlEYXRhU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21Db25DYgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IFNETyBTZXF1ZW5jZSBMYXllciB0byBpbmZvcm0KKy8vICAgICAgICAgICAgICAgICAgY29tbWFuZCBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2Ugb2YgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9TZXFDb25IZGxfcCAgICAgID0gSGFuZGxlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIEFzeVNkb0NvblN0YXRlX3AgICAgPSBFdmVudCBvZiB0aGUgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Db25DYih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSB0RXBsQXN5U2RvQ29uU3RhdGUgQXN5U2RvQ29uU3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uRXZlbnQgU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHN0YXRlCisJc3dpdGNoIChBc3lTZG9Db25TdGF0ZV9wKSB7CisJY2FzZSBrQXN5U2RvQ29uU3RhdGVDb25uZWN0ZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiQ29ubmVjdGlvbiBlc3RhYmxpc2hlZFxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudENvbkVzdGFibGlzaGVkOworCQkJLy8gc3RhcnQgdHJhbnNtaXNzaW9uIGlmIG5lZWRlZAorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkVycm9yIGR1cmluZyBpbml0aWFsaXNhdGlvblxuIik7CisJCQlTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjsKKwkJCS8vIGluZm9ybSBhcHAgYWJvdXQgZXJyb3IgYW5kIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkNvbm5lY3Rpb24gY2xvc2VkXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOworCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVBY2tSZWNlaXZlZDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJBY2tub3dsYWdlIHJlY2VpdmVkXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50QWNrUmVjZWl2ZWQ7CisJCQkvLyBjb250aW51ZSB0cmFuc21pc3Npb24KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIk9uZSBGcmFtZSBzZW50XG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ7CisJCQkvLyB0byBjb250aW51ZSB0cmFuc21pc3Npb24KKwkJCWJyZWFrOworCisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlVGltZW91dDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJUaW1lb3V0XG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDsKKwkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJYnJlYWs7CisKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKEFzeVNkb0NvblN0YXRlX3ApCisKKwlSZXQgPSBFcGxTZG9Db21TZWFyY2hDb25JbnRlcm4oU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgIFNkb0NvbUNvbkV2ZW50LCAodEVwbEFzeVNkb0NvbSAqKSBOVUxMKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZWFyY2hDb25JbnRlcm4KKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIHNlYXJjaCBhIFNkbyBTZXF1ZW5jZSBMYXllciBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUKKy8vICAgICAgICAgICAgICAgICAgY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhlIENvbW1hbmQgTGF5ZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb1NlcUNvbkhkbF9wICAgICA9IEhhbmRsZSB0byBzZWFyY2gKKy8vICAgICAgICAgICAgICAgICAgU2RvQ29tQ29uRXZlbnRfcCA9IGV2ZW50IHRvIHByb2Nlc3MKKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlYXJjaENvbkludGVybih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCQkgICB0RXBsU2RvQ29tQ29uRXZlbnQgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCXRFcGxTZG9Db21Db25IZGwgSGRsQ291bnQ7CisJdEVwbFNkb0NvbUNvbkhkbCBIZGxGcmVlOworCisJUmV0ID0ga0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bMF07CisJSGRsQ291bnQgPSAwOworCUhkbEZyZWUgPSAweEZGRkY7CisJd2hpbGUgKEhkbENvdW50IDwgRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gU2RvU2VxQ29uSGRsX3ApIHsJLy8gbWF0Y2hpbmcgY29tbWFuZCBsYXllciBoYW5kbGUgZm91bmQKKwkJCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4oSGRsQ291bnQsCisJCQkJCQkgICAgIFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisJCX0gZWxzZSBpZiAoKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsID09IDApCisJCQkgICAmJiAoSGRsRnJlZSA9PSAweEZGRkYpKSB7CisJCQlIZGxGcmVlID0gSGRsQ291bnQ7CisJCX0KKworCQlwU2RvQ29tQ29uKys7CisJCUhkbENvdW50Kys7CisJfQorCisJaWYgKFJldCA9PSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGUpIHsJLy8gbm8gcmVzcG9uc2libGUgY29tbWFuZCBsYXllciBoYW5kbGUgZm91bmQKKwkJaWYgKEhkbEZyZWUgPT0gMHhGRkZGKSB7CS8vIG5vIGZyZWUgaGFuZGxlCisJCQkvLyBkZWxldGUgY29ubmVjdGlvbiBpbW1lZGlhdGVseQorCQkJLy8gMjAwOC8wNC8xNCBtLnUuL2Quay4gVGhpcyBjb25uZWN0aW9uIGFjdHVhbGx5IGRvZXMgbm90IGV4aXN0LgorCQkJLy8gICAgICAgICAgICAgICAgICAgICAgcFNkb0NvbUNvbiBpcyBpbnZhbGlkLgorCQkJLy8gUmV0ID0gRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsKTsKKwkJCVJldCA9IGtFcGxTZG9Db21Ob0ZyZWVIYW5kbGU7CisJCX0gZWxzZSB7CS8vIGNyZWF0ZSBuZXcgaGFuZGxlCisJCQlIZGxDb3VudCA9IEhkbEZyZWU7CisJCQlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bSGRsQ291bnRdOworCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPSBTZG9TZXFDb25IZGxfcDsKKwkJCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4oSGRsQ291bnQsCisJCQkJCQkgICAgIFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuCisvLworLy8gRGVzY3JpcHRpb246ICAgICBzZWFyY2ggYSBTZG8gU2VxdWVuY2UgTGF5ZXIgY29ubmVjdGlvbiBoYW5kbGUgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgIGNvbnRyb2wgc3RydWN0ZXIgb2YgdGhlIENvbW1hbmQgTGF5ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvQ29tQ29uX3AgICAgID0gaW5kZXggb2YgY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBTZG9Db21Db25FdmVudF9wID0gZXZlbnQgdG8gcHJvY2VzcworLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSB0RXBsU2RvQ29tQ29uRXZlbnQgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKwlCWVRFIGJGbGFnOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCURXT1JEIGR3QWJvcnRDb2RlOworCXVuc2lnbmVkIGludCB1aVNpemU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oU2RvQ29tSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCSAgICAoIlxuXHRFbnRlckNpdGljYWxTZWN0aW9uIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm5cblxuIik7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uX3BdOworCisJLy8gcHJvY2VzcyBzdGF0ZSBtYXNjaGluZQorCXN3aXRjaCAocFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSkgeworCQkvLyBpZGxlIHN0YXRlCisJY2FzZSBrRXBsU2RvQ29tU3RhdGVJZGxlOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkJCQkvLyBpbml0IGNvbiBmb3IgY2xpZW50CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRDb246CisJCQkJeworCisJCQkJCS8vIGNhbGwgb2YgdGhlIGluaXQgZnVuY3Rpb24gYWxyZWFkeQorCQkJCQkvLyBwcm9jZXNzZWQgaW4gRXBsU2RvQ29tRGVmaW5lQ29uKCkKKwkJCQkJLy8gb25seSBjaGFuZ2Ugc3RhdGUgdG8ga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisKKwkJCQkvLyBpbnQgY29uIGZvciBzZXJ2ZXIKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50UmVjOgorCQkJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisJCQkJCS8vIGNoZWNrIGlmIGluaXQgb2YgYW4gdHJhbnNmZXIgYW5kIG5vIFNETyBhYm9ydAorCQkJCQlpZiAoKHBBc3lTZG9Db21fcC0+bV9sZV9iRmxhZ3MgJiAweDgwKSA9PSAwKSB7CS8vIFNETyByZXF1ZXN0CisJCQkJCQlpZiAoKHBBc3lTZG9Db21fcC0+bV9sZV9iRmxhZ3MgJiAweDQwKSA9PSAwKSB7CS8vIG5vIFNETyBhYm9ydAorCQkJCQkJCS8vIHNhdmUgdGFuc2FjdGlvbiBpZAorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKTsKKwkJCQkJCQkvLyBjaGVjayBjb21tYW5kCisJCQkJCQkJc3dpdGNoIChwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQltX2xlX2JDb21tYW5kSWQpCisJCQkJCQkJeworCQkJCQkJCWNhc2Uga0VwbFNkb1NlcnZpY2VOSUw6CisJCQkJCQkJCXsJLy8gc2ltcGx5IGFja25vd2xlZ2RlIE5JTCBjb21tYW5kIG9uIHNlcXVlbmNlIGxheWVyCisKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCQkgICAgICAqKQorCQkJCQkJCQkJICAgICBOVUxMKTsKKworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKworCQkJCQkJCWNhc2Uga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDoKKwkJCQkJCQkJewkvLyByZWFkIGJ5IGluZGV4CisKKwkJCQkJCQkJCS8vIHNlYXJjaCBlbnRyeSBhbiBzdGFydCB0cmFuc2ZlcgorCQkJCQkJCQkJRXBsU2RvQ29tU2VydmVySW5pdFJlYWRCeUluZGV4CisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisJCQkJCQkJCQkvLyBjaGVjayBuZXh0IHN0YXRlCisJCQkJCQkJCQlpZiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKSB7CS8vIHJlYWR5IC0+IHN0YXkgaWRsZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAgMDsKKwkJCQkJCQkJCX0gZWxzZSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJY2FzZSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDoKKwkJCQkJCQkJeworCisJCQkJCQkJCQkvLyBzZWFyY2ggZW50cnkgYW4gc3RhcnQgd3JpdGUKKwkJCQkJCQkJCUVwbFNkb0NvbVNlcnZlckluaXRXcml0ZUJ5SW5kZXgKKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJCQkJCQkJCS8vIGNoZWNrIG5leHQgc3RhdGUKKwkJCQkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gYWxyZWFkeSAtPiBzdGF5IGlkbGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIDA7CisJCQkJCQkJCQl9IGVsc2UgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZVNlcnZlclNlZ21UcmFuczsKKwkJCQkJCQkJCX0KKworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vICB1bnN1cHBvcnRlZCBjb21tYW5kCisJCQkJCQkJCQkvLyAgICAgICAtPiBhYm9ydCBzZW5kZW4KKwkJCQkJCQkJCWR3QWJvcnRDb2RlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIEVQTF9TRE9BQ19VTktOT1dOX0NPTU1BTkRfU1BFQ0lGSUVSOworCQkJCQkJCQkJLy8gc2VuZCBhYm9ydAorCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgbV9wRGF0YQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICAoQllURQorCQkJCQkJCQkJICAgICAqKQorCQkJCQkJCQkJICAgICYKKwkJCQkJCQkJCSAgICBkd0Fib3J0Q29kZTsKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuCisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKworCQkJCQkJCQl9CisKKwkJCQkJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocEFzeVNkb0NvbV9wLT5tX2xlX2JDb21tYW5kSWQpCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8vIHRoaXMgY29tbWFuZCBsYXllciBoYW5kbGUgaXMgbm90IHJlc3BvbnNpYmxlCisJCQkJCQkvLyAod3JvbmcgZGlyZWN0aW9uIG9yIHdyb25nIHRyYW5zYWN0aW9uIElEKQorCQkJCQkJUmV0ID0ga0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY29ubmVjdGlvbiBjbG9zZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQkJeworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCS8vIGNsZWFuIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCUVQTF9NRU1TRVQocFNkb0NvbUNvbiwgMHgwMCwKKwkJCQkJCSAgIHNpemVvZih0RXBsU2RvQ29tQ29uKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIFNETyBTZXJ2ZXIgcGFydAorCQkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwljYXNlIGtFcGxTZG9Db21TdGF0ZVNlcnZlclNlZ21UcmFuczoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKwkJCQkvLyBzZW5kIG5leHQgZnJhbWUKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWNrUmVjZWl2ZWQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEZyYW1lU2VuZGVkOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgaXQgaXMgYSByZWFkCisJCQkJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCSAgICBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4KSB7CisJCQkJCQkvLyBzZW5kIG5leHQgZnJhbWUKKwkJCQkJCUVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybgorCQkJCQkJICAgIChwU2RvQ29tQ29uLCAwLCAwLAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVSZXMpOworCQkJCQkJLy8gaWYgYWxsIHNlbmQgLT4gYmFjayB0byBpZGxlCisJCQkJCQlpZiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKSB7CS8vIGJhY2sgdG8gaWRsZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlID0KKwkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgMDsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHByb2Nlc3MgbmV4dCBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiB0aGUgZnJhbWUgaXMgYSBTRE8gcmVzcG9uc2UgYW5kIGhhcyB0aGUgcmlnaHQgdHJhbnNhY3Rpb24gSUQKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJaWYgKCgoYkZsYWcgJiAweDgwKSAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkgICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKSA9PQorCQkJCQkgICAgIHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkvLyBjaGVjayBpZiBpdCBpcyBhIGFib3J0CisJCQkJCQlpZiAoKGJGbGFnICYgMHg0MCkgIT0gMCkgewkvLyBTRE8gYWJvcnQKKwkJCQkJCQkvLyBjbGVhciBjb250cm9sIHN0cnVjdHVyZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJCSAgICAwOworCQkJCQkJCS8vIGQuay46IGRvIG5vdCBleGVjdXRlIGFueXRoaW5nIGZ1cnRoZXIgb24gdGhpcyBjb21tYW5kCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvLyBjaGVjayBpZiBpdCBpcyBhIHdyaXRlCisJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkgICAgbV9TZG9TZXJ2aWNlVHlwZSA9PQorCQkJCQkJICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4KQorCQkJCQkJeworCQkJCQkJCS8vIHdyaXRlIGRhdGEgdG8gT0QKKwkJCQkJCQl1aVNpemUgPQorCQkJCQkJCSAgICBBbWlHZXRXb3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplKTsKKwkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJRVBMX01FTUNQWQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fcERhdGEsCisJCQkJCQkJCSAgICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgICAgWzBdLAorCQkJCQkJCQkgICAgIHVpU2l6ZSk7CisJCQkJCQkJfQorCQkJCQkJCS8vIHVwZGF0ZSBjb3VudGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgKz0gdWlTaXplOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIHVpU2l6ZTsKKworCQkJCQkJCS8vIHVwZGF0ZSBwb2ludGVyCisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9PQorCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCSggLyooQllURSopICovCisJCQkJCQkJCSBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJIG1fcERhdGEpICs9CisJCQkJCQkgICAgICB1aVNpemU7CisJCQkJCQkJfQorCQkJCQkJCS8vIGNoZWNrIGVuZCBvZiB0cmFuc2ZlcgorCQkJCQkJCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4MzApID09IDB4MzApIHsJLy8gdHJhbnNmZXIgcmVhZHkKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplCisJCQkJCQkJCSAgICA9IDA7CisKKwkJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJICAgID09IDApIHsKKwkJCQkJCQkJCS8vIHNlbmQgcmVzcG9uc2UKKwkJCQkJCQkJCS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJCQkJCQkJRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuCisJCQkJCQkJCQkgICAgKHBTZG9Db21Db24sCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZVJlcyk7CisJCQkJCQkJCQkvLyBpZiBhbGwgc2VuZCAtPiBiYWNrIHRvIGlkbGUKKwkJCQkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gYmFjayB0byBpZGxlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICAwOworCQkJCQkJCQkJfQorCQkJCQkJCQl9IGVsc2UgewkvLyBzZW5kIGRhYm9ydCBjb2RlCisJCQkJCQkJCQkvLyBzZW5kIGFib3J0CisJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICBtX3BEYXRhCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIChCWVRFCisJCQkJCQkJCQkgICAgICopCisJCQkJCQkJCQkgICAgJgorCQkJCQkJCQkJICAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlOworCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCisJCQkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkJICAgID0gMDsKKworCQkJCQkJCQl9CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgICopIE5VTEwpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gdGhpcyBjb21tYW5kIGxheWVyIGhhbmRsZSBpcyBub3QgcmVzcG9uc2libGUKKwkJCQkJCS8vICh3cm9uZyBkaXJlY3Rpb24gb3Igd3JvbmcgdHJhbnNhY3Rpb24gSUQpCisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY29ubmVjdGlvbiBjbG9zZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQkJeworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCS8vIGNsZWFuIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCUVQTF9NRU1TRVQocFNkb0NvbUNvbiwgMHgwMCwKKwkJCQkJCSAgIHNpemVvZih0RXBsU2RvQ29tQ29uKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIGVuZGlmIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBTRE8gQ2xpZW50IHBhcnQKKwkJLy8gd2FpdCBmb3IgZmluaXNoIG9mIGVzdGFibGlzaGluZyBjb25uZWN0aW9uCisJY2FzZSBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDoKKwkJeworCisJCQkvLyBpZiBjb25uZWN0aW9uIGhhbmRsZSBpcyBpbnZhbGlkIHJlaW5pdCBjb25uZWN0aW9uCisJCQkvLyBkLmsuOiB0aGlzIHdpbGwgYmUgZG9uZSBvbmx5IG9uIG5ldyBldmVudHMgKGkuZS4gSW5pdFRyYW5zZmVyKQorCQkJaWYgKChwU2RvQ29tQ29uLT4KKwkJCSAgICAgbV9TZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spID09CisJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREwpIHsKKwkJCQkvLyBjaGVjayBraW5kIG9mIGNvbm5lY3Rpb24gdG8gcmVpbml0CisJCQkJLy8gY2hlY2sgcHJvdG9jb2wKKwkJCQlzd2l0Y2ggKHBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUpIHsKKwkJCQkJLy8gdWRwCisJCQkJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJCQkJeworCQkJCQkJLy8gY2FsbCBjb25uZWN0aW9uIGludCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFJbml0Q29uCisJCQkJCQkgICAgKCZwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIHBTZG9Db21Db24tPm1fdWlOb2RlSWQsCisJCQkJCQkgICAgIGtFcGxTZG9UeXBlVWRwKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIEFzZW5kIC0+IG5vdCBzdXBwb3J0ZWQKKwkJCQljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJCQkJeworCQkJCQkJLy8gY2FsbCBjb25uZWN0aW9uIGludCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFJbml0Q29uCisJCQkJCQkgICAgKCZwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIHBTZG9Db21Db24tPm1fdWlOb2RlSWQsCisJCQkJCQkgICAgIGtFcGxTZG9UeXBlQXNuZCk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBQZG8gLT4gbm90IHN1cHBvcnRlZAorCQkJCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChtX1Byb3RUeXBlX3ApCisJCQkJLy8gZC5rLjogcmVzZXQgdHJhbnNhY3Rpb24gSUQsIGJlY2F1c2UgbmV3IHNlcXVlbmNlIGxheWVyIGNvbm5lY3Rpb24gd2FzIGluaXRpYWxpemVkCisJCQkJLy8gJCQkIGQuay4gaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PworCQkJCS8vcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCA9IDA7CisJCQl9CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uRXN0YWJsaXNoZWQ6CisJCQkJeworCQkJCQkvL3NlbmQgZmlyc3QgZnJhbWUgaWYgbmVlZGVkCisJCQkJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA+IDApCisJCQkJCSAgICAmJiAocFNkb0NvbUNvbi0+bV91aVRhcmdldEluZGV4ICE9IDApKSB7CS8vIHN0YXJ0IFNETyB0cmFuc2ZlcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Db21DbGllbnRTZW5kCisJCQkJCQkgICAgKHBTZG9Db21Db24pOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoZWNrIGlmIHNlZ2VtdGVkIHRyYW5zZmVyCisJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkgICAgbV9TZG9UcmFuc1R5cGUgPT0KKwkJCQkJCSAgICBrRXBsU2RvVHJhbnNTZWdtZW50ZWQpIHsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFuczsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gZ290byBzdGF0ZSBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0OgorCQkJCXsKKwkJCQkJLy8gaW5mb3MgZm9yIHRyYW5zZmVyIGFscmVhZHkgc2F2ZWQgYnkgZnVuY3Rpb24gRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleAorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQkJeworCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCQkJaWYgKFNkb0NvbUNvbkV2ZW50X3AgPT0KKwkJCQkJICAgIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQpIHsKKwkJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCSAgICBFUExfU0RPQUNfVElNRV9PVVQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkgICAgMDsKKwkJCQkJfQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydCk7CisJCQkJCS8vIGQuay46IGRvIG5vdCBjbGVhbiBjb250cm9sIHN0cnVjdHVyZQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mICBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gY29ubmVjdGVkCisJY2FzZSBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisJCQkJLy8gc2VuZCBhIGZyYW1lCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWNrUmVjZWl2ZWQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEZyYW1lU2VuZGVkOgorCQkJCXsKKwkJCQkJUmV0ID0gRXBsU2RvQ29tQ2xpZW50U2VuZChwU2RvQ29tQ29uKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNoZWNrIGlmIHJlYWQgdHJhbnNmZXIgZmluaXNoZWQKKwkJCQkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApCisJCQkJCSAgICAmJiAocFNkb0NvbUNvbi0+CisJCQkJCQltX3VpVHJhbnNmZXJyZWRCeXRlICE9IDApCisJCQkJCSAgICAmJiAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9PQorCQkJCQkJa0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleCkpIHsKKwkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIDA7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNoZWNrIGlmIHNlZ2VtdGVkIHRyYW5zZmVyCisJCQkJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1RyYW5zVHlwZSA9PQorCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CisJCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRTZWdtVHJhbnM7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50UmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgdGhlIGZyYW1lIGlzIGEgU0RPIHJlc3BvbnNlIGFuZCBoYXMgdGhlIHJpZ2h0IHRyYW5zYWN0aW9uIElECisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWlmICgoKGJGbGFnICYgMHg4MCkgIT0gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkgICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJICAgICAgbV9sZV9iVHJhbnNhY3Rpb25JZCkgPT0KKwkJCQkJICAgICBwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKSkgeworCQkJCQkJLy8gY2hlY2sgaWYgYWJvcnQgb3Igbm90CisJCQkJCQlpZiAoKGJGbGFnICYgMHg0MCkgIT0gMCkgeworCQkJCQkJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsIDAsCisJCQkJCQkJICAgICAodEVwbEZyYW1lICopCisJCQkJCQkJICAgICBOVUxMKTsKKwkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJCS8vIHNhdmUgYWJvcnQgY29kZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkJICAgIEFtaUdldER3b3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICAgWzBdKTsKKwkJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkKTsKKworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0gZWxzZSB7CS8vIG5vcm1hbCBmcmFtZSByZWNlaXZlZAorCQkJCQkJCS8vIGNoZWNrIGZyYW1lCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQ29tQ2xpZW50UHJvY2Vzc0ZyYW1lCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisKKwkJCQkJCQkvLyBjaGVjayBpZiB0cmFuc2ZlciByZWFkeQorCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9PQorCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCSAgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICAqKSBOVUxMKTsKKwkJCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkJICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8vIHRoaXMgY29tbWFuZCBsYXllciBoYW5kbGUgaXMgbm90IHJlc3BvbnNpYmxlCisJCQkJCQkvLyAod3JvbmcgZGlyZWN0aW9uIG9yIHdyb25nIHRyYW5zYWN0aW9uIElEKQorCQkJCQkJUmV0ID0ga0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGNvbm5lY3Rpb24gY2xvc2VkIGV2ZW50IGdvIGJhY2sgdG8ga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50Q29uQ2xvc2VkOgorCQkJCXsJLy8gY29ubmVjdGlvbiBjbG9zZWQgYnkgY29tbXVuaWNhdGlvbiBwYXJ0bmVyCisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCS8vIHNldCBoYW5kbGUgdG8gaW52YWxpZCBhbmQgZW50ZXIga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgfD0KKwkJCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMOworCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDsKKworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCisJCQkJCWdvdG8gRXhpdDsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBhYm9ydCB0byBzZW5kIGZyb20gaGlnaGVyIGxheWVyCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFib3J0OgorCQkJCXsKKwkJCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHBTZG9Db21Db24sCisJCQkJCQkJCSAqKChEV09SRCAqKQorCQkJCQkJCQkgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSkpOworCisJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkgICAgKigoRFdPUkQgKikgcFNkb0NvbUNvbi0+bV9wRGF0YSk7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OgorCQkJCXsKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgfD0KKwkJCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMOworCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICBFUExfU0RPQUNfVElNRV9PVVQ7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0KTsKKworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gcHJvY2VzcyBzZWdtZW50ZWQgdHJhbnNmZXIKKwljYXNlIGtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFuczoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKwkJCQkvLyBzbmVkIGEgZnJhbWUKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0OgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ6CisJCQkJeworCQkJCQlSZXQgPSBFcGxTZG9Db21DbGllbnRTZW5kKHBTZG9Db21Db24pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgcmVhZCB0cmFuc2ZlciBmaW5pc2hlZAorCQkJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCQlrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4KSkgeworCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCSAgICAwOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBhIHJlc3BvbnNlCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWlmICgoKGJGbGFnICYgMHg4MCkgIT0gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkgICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJICAgICAgbV9sZV9iVHJhbnNhY3Rpb25JZCkgPT0KKwkJCQkJICAgICBwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKSkgeworCQkJCQkJLy8gY2hlY2sgaWYgYWJvcnQgb3Igbm90CisJCQkJCQlpZiAoKGJGbGFnICYgMHg0MCkgIT0gMCkgeworCQkJCQkJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsIDAsCisJCQkJCQkJICAgICAodEVwbEZyYW1lICopCisJCQkJCQkJICAgICBOVUxMKTsKKwkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlID0KKwkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQkJCS8vIHNhdmUgYWJvcnQgY29kZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkJICAgIEFtaUdldER3b3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICAgWzBdKTsKKwkJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkKTsKKworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0gZWxzZSB7CS8vIG5vcm1hbCBmcmFtZSByZWNlaXZlZAorCQkJCQkJCS8vIGNoZWNrIGZyYW1lCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsU2RvQ29tQ2xpZW50UHJvY2Vzc0ZyYW1lCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBBc3lTZG9Db21fcCk7CisKKwkJCQkJCQkvLyBjaGVjayBpZiB0cmFuc2ZlciByZWFkeQorCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSA9PQorCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCSAgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICAqKSBOVUxMKTsKKwkJCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPSAwOworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY29ubmVjdGlvbiBjbG9zZWQgZXZlbnQgZ28gYmFjayB0byBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQkJewkvLyBjb25uZWN0aW9uIGNsb3NlZCBieSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gc2V0IGhhbmRsZSB0byBpbnZhbGlkIGFuZCBlbnRlciBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gYWJvcnQgdG8gc2VuZCBmcm9tIGhpZ2hlciBsYXllcgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBYm9ydDoKKwkJCQl7CisJCQkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydChwU2RvQ29tQ29uLAorCQkJCQkJCQkgKigoRFdPUkQgKikKKwkJCQkJCQkJICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEpKTsKKworCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCsrOworCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkgICAgKigoRFdPUkQgKikgcFNkb0NvbUNvbi0+bV9wRGF0YSk7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OgorCQkJCXsKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgfD0KKwkJCQkJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMOworCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICBFUExfU0RPQUNfVElNRV9PVVQ7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0KTsKKworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gZW5kbyBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKyAgICAgIEV4aXQ6CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlFUExfREJHTFZMX1NET19UUkFDRTAKKwkgICAgKCJcblx0TGVhdmVDcml0aWNhbFNlY3Rpb24gRXBsU2RvQ29tUHJvY2Vzc0ludGVyblxuXG4iKTsKKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tU2VydmVySW5pdFJlYWRCeUluZGV4CisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHN0YXJ0IHRoZSBwcm9jZXNzaW5nIG9mIGFuIHJlYWQgYnkgaW5kZXggY29tbWFuZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwU2RvQ29tQ29uX3AgICAgID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIHJlY2VpdmVkIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUluZGV4OworCXVuc2lnbmVkIGludCB1aVN1YmluZGV4OworCXRFcGxPYmRTaXplIEVudHJ5U2l6ZTsKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisJRFdPUkQgZHdBYm9ydENvZGU7CisKKwlkd0Fib3J0Q29kZSA9IDA7CisKKwkvLyBhIGluaXQgb2YgYSByZWFkIGNvdWxkIG5vdCBiZSBhIHNlZ21lbnRlZCB0cmFuc2ZlcgorCS8vIC0+IG5vIHZhcmlhYmxlIHBhcnQgb2YgaGVhZGVyCisKKwkvLyBnZXQgaW5kZXggYW5kIHN1YmluZGV4CisJdWlJbmRleCA9IEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzBdKTsKKwl1aVN1YmluZGV4ID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMl0pOworCisJLy8gY2hlY2sgYWNjZXNzdHlwZSBvZiBlbnRyeQorCS8vIGV4aXN0ZW5zIG9mIGVudHJ5CisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJUmV0ID0gRXBsT2JkdUdldEFjY2Vzc1R5cGUodWlJbmRleCwgdWlTdWJpbmRleCwgJkFjY2Vzc1R5cGUpOworLyojZWxzZQorICAgIFJldCA9IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0OworICAgIEFjY2Vzc1R5cGUgPSAwOworI2VuZGlmKi8KKwlpZiAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KSB7CS8vIHN1YmVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfU1VCX0lOREVYX05PVF9FWElTVDsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlbnRyeSBkb2Vzbid0IGV4aXN0CisJCWR3QWJvcnRDb2RlID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZTsKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJCSAgICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNvbXBhcmUgYWNjZXNzdHlwZSBtdXN0IGJlIHJlYWQgb3IgY29uc3QKKwlpZiAoKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1JlYWQpID09IDApCisJICAgICYmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NDb25zdCkgPT0gMCkpIHsKKworCQlpZiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjV3JpdGUpICE9IDApIHsKKwkJCS8vIGVudHJ5IHJlYWQgYSB3cml0ZSBvbmx5IG9iamVjdAorCQkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfUkVBRF9UT19XUklURV9PTkxZX09CSjsKKwkJfSBlbHNlIHsKKwkJCWR3QWJvcnRDb2RlID0gRVBMX1NET0FDX1VOU1VQUE9SVEVEX0FDQ0VTUzsKKwkJfQorCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGU7CisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCQkgICAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHNlcnZpY2UKKwlwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUgPSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OworCisJLy8gZ2V0IHNpemUgb2Ygb2JqZWN0IHRvIHNlZSBpb2Ygc2VnbWVudGVkIG9yIGV4cGVkaXRlZCB0cmFuc2ZlcgorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCUVudHJ5U2l6ZSA9IEVwbE9iZHVHZXREYXRhU2l6ZSh1aUluZGV4LCB1aVN1YmluZGV4KTsKKy8qI2Vsc2UKKyAgICBFbnRyeVNpemUgPSAwOworI2VuZGlmKi8KKwlpZiAoRW50cnlTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc1NlZ21lbnRlZDsKKwkJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0LWVudHJ5IGRhdGEKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0KKwkJICAgIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKHVpSW5kZXgsIHVpU3ViaW5kZXgpOworLy8jZW5kaWYKKwl9IGVsc2UgewkJLy8gZXhwZWRpdGVkIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQ7CisJfQorCisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gRW50cnlTaXplOworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisKKwlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCSAgICAgdWlTdWJpbmRleCwga0VwbFNkb0NvbVNlbmRUeXBlUmVzKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCS8vIGVycm9yIC0+IGFib3J0CisJCWR3QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZTsKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJCSAgICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybigpOworLy8KKy8vIERlc2NyaXB0aW9uOiAgICBmdW5jdGlvbiBjcmVhdHMgYW5kIHNlbmQgYSBmcmFtZSBmb3Igc2VydmVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICA9IGluZGV4IHRvIHNlbmQgaWYgZXhwZWRpdGVkIHRyYW5zZmVyIGVsc2UgMAorLy8gICAgICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgID0gc3ViaW5kZXggdG8gc2VuZCBpZiBleHBlZGl0ZWQgdHJhbnNmZXIgZWxzZSAwCisvLyAgICAgICAgICAgICAgICAgIFNlbmRUeXBlX3AgICAgICAgPSB0byBvZiBmcmFtZSB0byBzZW5kCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4odEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgdEVwbFNkb0NvbVNlbmRUeXBlIFNlbmRUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJQllURSBhYkZyYW1lW0VQTF9NQVhfU0RPX0ZSQU1FX1NJWkVdOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXRFcGxBc3lTZG9Db20gKnBDb21tYW5kRnJhbWU7CisJdW5zaWduZWQgaW50IHVpU2l6ZU9mRnJhbWU7CisJQllURSBiRmxhZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisKKwlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCisJLy8gYnVpbGQgZ2VuZXJpYyBwYXJ0IG9mIGZyYW1lCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29tbWFuZCBsYXllcnBhcnQgb2YgZnJhbWUKKwlwQ29tbWFuZEZyYW1lID0KKwkgICAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCSAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZDsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iQ29tbWFuZElkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKTsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iVHJhbnNhY3Rpb25JZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9iVHJhbnNhY3Rpb25JZCk7CisKKwkvLyBzZXQgc2l6ZSB0byBoZWFkZXIgc2l6ZQorCXVpU2l6ZU9mRnJhbWUgPSA4OworCisJLy8gY2hlY2sgU2VuZFR5cGUKKwlzd2l0Y2ggKFNlbmRUeXBlX3ApIHsKKwkJLy8gcmVxdWVzdGZyYW1lIHRvIHNlbmQKKwljYXNlIGtFcGxTZG9Db21TZW5kVHlwZVJlcToKKwkJeworCQkJLy8gbm90aGluZyB0byBkbyBmb3Igc2VydmVyCisJCQkvLy0+IGVycm9yCisJCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZFNlbmRUeXBlOworCQkJYnJlYWs7CisJCX0KKworCQkvLyByZXNwb25zZSB3aXRob3V0IGRhdGEgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlQWNrUmVzOgorCQl7CisJCQkvLyBzZXQgcmVzcG9uc2UgZmxhZworCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzLCAweDgwKTsKKworCQkJLy8gc2VuZCBmcmFtZQorCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gcmVzcG9uc2ZyYW1lIHRvIHNlbmQKKwljYXNlIGtFcGxTZG9Db21TZW5kVHlwZVJlczoKKwkJeworCQkJLy8gc2V0IHJlc3BvbnNlIGZsYWcKKwkJCWJGbGFnID0gQW1pR2V0Qnl0ZUZyb21MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MpOworCQkJYkZsYWcgfD0gMHg4MDsKKwkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncywgYkZsYWcpOworCisJCQkvLyBjaGVjayB0eXBlIG9mIHJlc29uc2UKKwkJCWlmIChwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID09IGtFcGxTZG9UcmFuc0V4cGVkaXRlZCkgewkvLyBFeHBlZGl0ZWQgdHJhbnNmZXIKKwkJCQkvLyBjb3B5IGRhdGEgaW4gZnJhbWUKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwkJCQlSZXQgPSBFcGxPYmR1UmVhZEVudHJ5VG9MZSh1aUluZGV4X3AsCisJCQkJCQkJICAgdWlTdWJJbmRleF9wLAorCQkJCQkJCSAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICBbMF0sCisJCQkJCQkJICAgKHRFcGxPYmRTaXplICopICYKKwkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgIG1fdWlUcmFuc1NpemUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKy8vI2VuZGlmCisKKwkJCQkvLyBzZXQgc2l6ZSBvZiBmcmFtZQorCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkgICAgICAgKFdPUkQpIHBTZG9Db21Db25fcC0+CisJCQkJCSAgICAgICBtX3VpVHJhbnNTaXplKTsKKworCQkJCS8vIGNvcnJlY3QgYnl0ZS1jb3VudGVyCisJCQkJdWlTaXplT2ZGcmFtZSArPSBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlICs9CisJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCisJCQkJLy8gc2VuZCBmcmFtZQorCQkJCXVpU2l6ZU9mRnJhbWUgKz0gcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCVJldCA9CisJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+CisJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCSB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCQkJfSBlbHNlIGlmIChwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID09IGtFcGxTZG9UcmFuc1NlZ21lbnRlZCkgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGluaXQsIHNlZ21lbnQgYW5kIGNvbXBsZXRlCisJCQkJaWYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9PSAwKSB7CS8vIGluaXQKKwkJCQkJLy8gc2V0IGluaXQgZmxhZworCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJYkZsYWcgfD0gMHgxMDsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWdzLCBiRmxhZyk7CisJCQkJCS8vIGluaXQgdmFyaWFibGUgaGVhZGVyCisJCQkJCUFtaVNldER3b3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJbV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJbV91aVRyYW5zU2l6ZSk7CisJCQkJCS8vIGNvcHkgZGF0YSBpbiBmcmFtZQorCQkJCQlFUExfTUVNQ1BZKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YVs0XSwKKwkJCQkJCSAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSwKKwkJCQkJCSAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gNCkpOworCisJCQkJCS8vIGNvcnJlY3QgYnl0ZS1jb3VudGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSAtPQorCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KTsKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlICs9CisJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDQpOworCQkJCQkvLyBtb3ZlIGRhdGEgcG9pbnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gNCk7CisKKwkJCQkJLy8gc2V0IHNlZ21lbnQgc2l6ZQorCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkgICAgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLQorCQkJCQkJCTQpKTsKKworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0gRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsCisJCQkJCQkJCSBwRnJhbWUpOworCisJCQkJfSBlbHNlCisJCQkJICAgIGlmICgocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID4gMCkKKwkJCQkJJiYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA+IEVQTF9TRE9fTUFYX1BBWUxPQUQpKSB7CS8vIHNlZ21lbnQKKwkJCQkJLy8gc2V0IHNlZ21lbnQgZmxhZworCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJYkZsYWcgfD0gMHgyMDsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisJCQkJCUVQTF9NRU1DUFkoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhLAorCQkJCQkJICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisKKwkJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09CisJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCS8vIG1vdmUgZGF0YSBwb2ludGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKworCQkJCQkvLyBzZXQgc2VnbWVudCBzaXplCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCSAgICAgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0gRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsCisJCQkJCQkJCSBwRnJhbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID09IDApCisJCQkJCSAgICAmJiAocFNkb0NvbUNvbl9wLT4KKwkJCQkJCW1fU2RvU2VydmljZVR5cGUgIT0KKwkJCQkJCWtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4KSkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCS8vIGNvbXBsZXRlCisJCQkJCS8vIHNldCBzZWdtZW50IGNvbXBsZXRlIGZsYWcKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncyk7CisJCQkJCWJGbGFnIHw9IDB4MzA7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFncywgYkZsYWcpOworCisJCQkJCS8vIGNvcHkgZGF0YSBpbiBmcmFtZQorCQkJCQlFUExfTUVNQ1BZKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkJCQkJCSAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSwKKwkJCQkJCSAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSk7CisKKwkJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlICs9CisJCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisKKwkJCQkJLy8gbW92ZSBkYXRhIHBvaW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisKKwkJCQkJLy8gc2V0IHNlZ21lbnQgc2l6ZQorCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkgICAgICAgKFdPUkQpIHBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgICAgbV91aVRyYW5zU2l6ZSk7CisKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSB1aVNpemVPZkZyYW1lLAorCQkJCQkJCQkgcEZyYW1lKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8vIGFib3J0IHRvIHNlbmQKKwljYXNlIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0OgorCQl7CisJCQkvLyBzZXQgcmVzcG9uc2UgYW5kIGFib3J0IGZsYWcKKwkJCWJGbGFnID0gQW1pR2V0Qnl0ZUZyb21MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MpOworCQkJYkZsYWcgfD0gMHhDMDsKKwkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncywgYkZsYWcpOworCisJCQkvLyBjb3B5IGFib3J0Y29kZSB0byBmcmFtZQorCQkJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCSooKERXT1JEICopIHBTZG9Db21Db25fcC0+bV9wRGF0YSkpOworCisJCQkvLyBzZXQgc2l6ZSBvZiBzZWdtZW50CisJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV93U2VnbWVudFNpemUsCisJCQkJICAgICAgIHNpemVvZihEV09SRCkpOworCisJCQkvLyB1cGRhdGUgY291bnRlcgorCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gc2l6ZW9mKERXT1JEKTsKKwkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkJCS8vIGNhbGMgZnJhbWVzaXplCisJCQl1aVNpemVPZkZyYW1lICs9IHNpemVvZihEV09SRCk7CisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goU2VuZFR5cGVfcCkKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleAorLy8KKy8vIERlc2NyaXB0aW9uOiAgICBmdW5jdGlvbiBzdGFydCB0aGUgcHJvY2Vzc2luZyBvZiBhbiB3cml0ZSBieSBpbmRleCBjb21tYW5kCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlckluaXRXcml0ZUJ5SW5kZXgodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUluZGV4OworCXVuc2lnbmVkIGludCB1aVN1YmluZGV4OworCXVuc2lnbmVkIGludCB1aUJ5dGVzVG9UcmFuc2ZlcjsKKwl0RXBsT2JkU2l6ZSBFbnRyeVNpemU7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCURXT1JEIGR3QWJvcnRDb2RlOworCUJZVEUgKnBiU3JjRGF0YTsKKworCWR3QWJvcnRDb2RlID0gMDsKKworCS8vIGEgaW5pdCBvZiBhIHdyaXRlCisJLy8gLT4gdmFyaWFibGUgcGFydCBvZiBoZWFkZXIgcG9zc2libGUKKworCS8vIGNoZWNrIGlmIGV4cGVkaXRlZCBvciBzZWdtZW50ZWQgdHJhbnNmZXIKKwlpZiAoKHBBc3lTZG9Db21fcC0+bV9sZV9iRmxhZ3MgJiAweDMwKSA9PSAweDEwKSB7CS8vIGluaXRpYXRlIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zU2VnbWVudGVkOworCQkvLyBnZXQgaW5kZXggYW5kIHN1YmluZGV4CisJCXVpSW5kZXggPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbNF0pOworCQl1aVN1YmluZGV4ID0KKwkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzZdKTsKKwkJLy8gZ2V0IHNvdXJjZS1wb2ludGVyIGZvciBjb3B5CisJCXBiU3JjRGF0YSA9ICZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVs4XTsKKwkJLy8gc2F2ZSBzaXplCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9CisJCSAgICBBbWlHZXREd29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0pOworCisJfSBlbHNlIGlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4MzApID09IDB4MDApIHsJLy8gZXhwZWRpdGVkIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQ7CisJCS8vIGdldCBpbmRleCBhbmQgc3ViaW5kZXgKKwkJdWlJbmRleCA9CisJCSAgICBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVswXSk7CisJCXVpU3ViaW5kZXggPQorCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMl0pOworCQkvLyBnZXQgc291cmNlLXBvaW50ZXIgZm9yIGNvcHkKKwkJcGJTcmNEYXRhID0gJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzRdOworCQkvLyBzYXZlIHNpemUKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV93U2VnbWVudFNpemUpOworCQkvLyBzdWJ0cmFjdCBoZWFkZXIKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09IDQ7CisKKwl9IGVsc2UgeworCQkvLyBqdXN0IGlnbm9yZSBhbnkgb3RoZXIgdHJhbnNmZXIgdHlwZQorCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgYWNjZXNzdHlwZSBvZiBlbnRyeQorCS8vIGV4aXN0ZW5zIG9mIGVudHJ5CisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJUmV0ID0gRXBsT2JkdUdldEFjY2Vzc1R5cGUodWlJbmRleCwgdWlTdWJpbmRleCwgJkFjY2Vzc1R5cGUpOworLyojZWxzZQorICAgIFJldCA9IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0OworICAgIEFjY2Vzc1R5cGUgPSAwOworI2VuZGlmKi8KKwlpZiAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KSB7CS8vIHN1YmVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9IEVQTF9TRE9BQ19TVUJfSU5ERVhfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCS8qcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisJCSAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCSAgIHVpSW5kZXgsCisJCSAgIHVpU3ViaW5kZXgsCisJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsgKi8KKwkJZ290byBBYm9ydDsKKwl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlbnRyeSBkb2Vzbid0IGV4aXN0CisJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVDsKKwkJLy8gc2VuZCBhYm9ydAorCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorCQkvKgorCQkgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJmR3QWJvcnRDb2RlOworCQkgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkgICB1aUluZGV4LAorCQkgICB1aVN1YmluZGV4LAorCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7ICovCisJCWdvdG8gQWJvcnQ7CisJfQorCS8vIGNvbXBhcmUgYWNjZXNzdHlwZSBtdXN0IGJlIHJlYWQKKwlpZiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjV3JpdGUpID09IDApIHsKKworCQlpZiAoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjUmVhZCkgIT0gMCkgeworCQkJLy8gZW50cnkgd3JpdGUgYSByZWFkIG9ubHkgb2JqZWN0CisJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCSAgICBFUExfU0RPQUNfV1JJVEVfVE9fUkVBRF9PTkxZX09CSjsKKwkJfSBlbHNlIHsKKwkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJICAgIEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1M7CisJCX0KKwkJLy8gc2VuZCBhYm9ydAorCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorCQkvKnBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKikmZHdBYm9ydENvZGU7CisJCSAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCSAgIHVpSW5kZXgsCisJCSAgIHVpU3ViaW5kZXgsCisJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsgKi8KKwkJZ290byBBYm9ydDsKKwl9CisJLy8gc2F2ZSBzZXJ2aWNlCisJcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlID0ga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg7CisKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAwOworCisJLy8gd3JpdGUgZGF0YSB0byBPRAorCWlmIChwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID09IGtFcGxTZG9UcmFuc0V4cGVkaXRlZCkgewkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJLy8gc2l6ZSBjaGVja2luZyBpcyBkb25lIGJ5IEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKCkKKworLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSh1aUluZGV4LAorCQkJCQkgICAgICB1aVN1YmluZGV4LAorCQkJCQkgICAgICBwYlNyY0RhdGEsCisJCQkJCSAgICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSk7CisJCXN3aXRjaCAoUmV0KSB7CisJCWNhc2Uga0VwbFN1Y2Nlc3NmdWw6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsT2JkQWNjZXNzVmlvbGF0aW9uOgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWNhc2Uga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I6CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX05PVF9NQVRDSDsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKworCQljYXNlIGtFcGxPYmRWYWx1ZVRvb0hpZ2g6CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9UT09fSElHSDsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKworCQljYXNlIGtFcGxPYmRWYWx1ZVRvb0xvdzoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX1RPT19MT1c7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisJCX0KKy8vI2VuZGlmCisJCS8vIHNlbmQgY29tbWFuZCBhY2tub3dsZWRnZQorCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICAwLAorCQkJCQkJICAgICAwLAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBY2tSZXMpOworCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQkvLyBnZXQgc2l6ZSBvZiB0aGUgb2JqZWN0IHRvIGNoZWNrIGlmIGl0IGZpdHMKKwkJLy8gYmVjYXVzZSB3ZSBkaXJlY3RseSB3cml0ZSB0byB0aGUgZGVzdGluYXRpb24gbWVtb3J5CisJCS8vIGQuay4gbm8gb25lIGNhbGxzIHRoZSB1c2VyIE9EIGNhbGxiYWNrIGZ1bmN0aW9uCisKKwkJLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlFbnRyeVNpemUgPSBFcGxPYmR1R2V0RGF0YVNpemUodWlJbmRleCwgdWlTdWJpbmRleCk7CisJCS8qI2Vsc2UKKwkJICAgRW50cnlTaXplID0gMDsKKwkJICAgI2VuZGlmICovCisJCWlmIChFbnRyeVNpemUgPCBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUpIHsJLy8gcGFyYW1ldGVyIHRvbyBiaWcKKwkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19ISUdIOworCQkJLy8gc2VuZCBhYm9ydAorCQkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKwkJCS8qcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKSZkd0Fib3J0Q29kZTsKKwkJCSAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkgICB1aUluZGV4LAorCQkJICAgdWlTdWJpbmRleCwKKwkJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsgKi8KKwkJCWdvdG8gQWJvcnQ7CisJCX0KKworCQl1aUJ5dGVzVG9UcmFuc2ZlciA9CisJCSAgICBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfd1NlZ21lbnRTaXplKTsKKwkJLy8gZWxlbWluYXRlIGhlYWRlciAoQ29tbWFuZCBoZWFkZXIgKDgpICsgdmFyaWFibGUgcGFydCAoNCkgKyBDb21tYW5kIGhlYWRlciAoNCkpCisJCXVpQnl0ZXNUb1RyYW5zZmVyIC09IDE2OworCQkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QgZW50cnkKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gRXBsT2JkdUdldE9iamVjdERhdGFQdHIodWlJbmRleCwKKwkJCQkJCQkJdWlTdWJpbmRleCk7CisvLyNlbmRpZgorCQlpZiAocFNkb0NvbUNvbl9wLT5tX3BEYXRhID09IE5VTEwpIHsKKwkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJLy8gc2VuZCBhYm9ydAorCQkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKy8qICAgICAgICAgICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKSZwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlOworICAgICAgICAgICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU3ViaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyovCisJCQlnb3RvIEFib3J0OworCQl9CisJCS8vIGNvcHkgZGF0YQorCQlFUExfTUVNQ1BZKHBTZG9Db21Db25fcC0+bV9wRGF0YSwgcGJTcmNEYXRhLCB1aUJ5dGVzVG9UcmFuc2Zlcik7CisKKwkJLy8gdXBkYXRlIGludGVybmFsIGNvdW50ZXIKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gdWlCeXRlc1RvVHJhbnNmZXI7CisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSAtPSB1aUJ5dGVzVG9UcmFuc2ZlcjsKKworCQkvLyB1cGRhdGUgdGFyZ2V0IHBvaW50ZXIKKwkJKCAvKihCWVRFKikgKi8gcFNkb0NvbUNvbl9wLT5tX3BEYXRhKSArPSB1aUJ5dGVzVG9UcmFuc2ZlcjsKKworCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkgICAwLCAodEVwbEZyYW1lICopIE5VTEwpOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBBYm9ydDoKKwlpZiAocFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSAhPSAwKSB7CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0KKwkJICAgIChCWVRFICopICYgcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZTsKKwkJUmV0ID0KKwkJICAgIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsIHVpSW5kZXgsCisJCQkJCQkgICB1aVN1YmluZGV4LAorCQkJCQkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCisJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tQ2xpZW50U2VuZAorLy8KKy8vIERlc2NyaXB0aW9uOiAgICBmdW5jdGlvbiBzdGFydHMgYW4gc2RvIHRyYW5zZmVyIGFuIHNlbmQgYWxsIGZ1cnRoZXIgZnJhbWVzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFNlbmQodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX01BWF9TRE9fRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEFzeVNkb0NvbSAqcENvbW1hbmRGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplT2ZGcmFtZTsKKwlCWVRFIGJGbGFnczsKKwlCWVRFICpwYlBheWxvYWQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXBGcmFtZSA9ICh0RXBsRnJhbWUgKikgJiBhYkZyYW1lWzBdOworCisJRVBMX01FTVNFVCgmYWJGcmFtZVswXSwgMHgwMCwgc2l6ZW9mKGFiRnJhbWUpKTsKKworCS8vIGJ1aWxkIGdlbmVyaWMgcGFydCBvZiBmcmFtZQorCS8vIGdldCBwb2ludGVyIHRvIGNvbW1hbmQgbGF5ZXJwYXJ0IG9mIGZyYW1lCisJcENvbW1hbmRGcmFtZSA9CisJICAgICZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkgICAgbV9sZV9hYlNkb1NlcVBheWxvYWQ7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkNvbW1hbmRJZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYlRyYW5zYWN0aW9uSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fYlRyYW5zYWN0aW9uSWQpOworCisJLy8gc2V0IHNpemUgY29uc3RhbnQgcGFydCBvZiBoZWFkZXIKKwl1aVNpemVPZkZyYW1lID0gODsKKworCS8vIGNoZWNrIGlmIGZpcnN0IGZyYW1lIHRvIHNlbmQgLT4gY29tbWFuZCBoZWFkZXIgbmVlZGVkCisJaWYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA+IDApIHsKKwkJaWYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9PSAwKSB7CS8vIHN0YXJ0IFNETyB0cmFuc2ZlcgorCQkJLy8gY2hlY2sgaWYgc2VnbWVudGVkIG9yIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJLy8gb25seSBmb3Igd3JpdGUgY29tbWFuZHMKKwkJCXN3aXRjaCAocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKSB7CisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg6CisJCQkJewkvLyBmaXJzdCBmcmFtZSBvZiByZWFkIGFjY2VzcyBhbHdheXMgZXhwZWRpdGVkCisJCQkJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPQorCQkJCQkgICAga0VwbFNkb1RyYW5zRXhwZWRpdGVkOworCQkJCQlwYlBheWxvYWQgPQorCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhWzBdOworCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwgNCk7CisKKwkJCQkJLy8gY3JlYXRlIGNvbW1hbmQgaGVhZGVyCisJCQkJCUFtaVNldFdvcmRUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCSAgICAgICAoV09SRCkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgICBtX3VpVGFyZ2V0SW5kZXgpOworCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUocGJQYXlsb2FkLAorCQkJCQkJICAgICAgIChCWVRFKSBwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgICAgIG1fdWlUYXJnZXRTdWJJbmRleCk7CisJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQl1aVNpemVPZkZyYW1lICs9IDQ7CisKKwkJCQkJLy8gc2V0IHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSB0byBvbmUKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCXsKKwkJCQkJaWYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA+IEVQTF9TRE9fTUFYX1BBWUxPQUQpIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJCQkvLyAtPiB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlciBuZWVkZWQKKwkJCQkJCS8vIHNhdmUgdGhhdCB0cmFuc2ZlciBpcyBzZWdtZW50ZWQKKwkJCQkJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPQorCQkJCQkJICAgIGtFcGxTZG9UcmFuc1NlZ21lbnRlZDsKKwkJCQkJCS8vIGZpbGwgdmFyaWFibGUgcGFydCBvZiBoZWFkZXIKKwkJCQkJCUFtaVNldER3b3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJCW1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQlbMF0sCisJCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJCW1fdWlUcmFuc1NpemUpOworCQkJCQkJLy8gc2V0IHBvaW50ZXIgdG8gcmVhbCBwYXlsb2FkCisJCQkJCQlwYlBheWxvYWQgPQorCQkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGFbNF07CisJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKwkJCQkJCWJGbGFncyA9IDB4MTA7CisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWdzLAorCQkJCQkJCSAgICAgICBiRmxhZ3MpOworCQkJCQkJLy8gY3JlYXRlIGNvbW1hbmQgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChXT1JEKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0SW5kZXgpOworCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQlBbWlTZXRCeXRlVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChCWVRFKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0U3ViSW5kZXgpOworCQkJCQkJLy8gb24gYnl0ZSBmb3IgcmVzZXJ2ZWQKKwkJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQkJLy8gY2FsYyBzaXplCisJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKworCQkJCQkJLy8gY29weSBwYXlsb2FkCisJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQKKwkJCQkJCQkgICAgLSA4KSk7CisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDgpOworCQkJCQkJLy8gY29ycmVjdCBpbnRlcm4gY291bnRlcgorCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09CisJCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA4KTsKKwkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZSA9CisJCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA4KTsKKworCQkJCQl9IGVsc2UgewkvLyBleHBlZGl0ZWQgdHJhbmRzZmVyCisJCQkJCQkvLyBzYXZlIHRoYXQgdHJhbnNmZXIgaXMgZXhwZWRpdGVkCisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0KKwkJCQkJCSAgICBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQ7CisJCQkJCQlwYlBheWxvYWQgPQorCQkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGFbMF07CisKKwkJCQkJCS8vIGNyZWF0ZSBjb21tYW5kIGhlYWRlcgorCQkJCQkJQW1pU2V0V29yZFRvTGUocGJQYXlsb2FkLAorCQkJCQkJCSAgICAgICAoV09SRCkKKwkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgICAgbV91aVRhcmdldEluZGV4KTsKKwkJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUocGJQYXlsb2FkLAorCQkJCQkJCSAgICAgICAoQllURSkKKwkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgICAgbV91aVRhcmdldFN1YkluZGV4KTsKKwkJCQkJCS8vICsgMiAtPiBvbmUgYnl0ZSBmb3Igc3ViaW5kZXggYW5kIG9uZSBieXRlIHJlc2VydmVkCisJCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJRVBMX01FTUNQWShwYlBheWxvYWQsCisJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJCSAgICAoNCArCisJCQkJCQkgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgIG1fdWlUcmFuc1NpemUpOworCQkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCQkgICAgICAgKFdPUkQpICg0ICsKKwkJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSAgICAgICBtX3VpVHJhbnNTaXplKSk7CisKKwkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZSA9CisJCQkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VOSUw6CisJCQlkZWZhdWx0OgorCQkJCS8vIGludmFsaWQgc2VydmljZSByZXF1ZXN0ZWQKKwkJCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZFNlcnZpY2VUeXBlOworCQkJCWdvdG8gRXhpdDsKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpCisJCX0gZWxzZQkJLy8gKHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA+IDApCisJCXsJCS8vIGNvbnRpbnVlIFNETyB0cmFuc2ZlcgorCQkJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpIHsKKwkJCQkvLyBmb3IgZXhwZWRpdGVkIHJlYWQgaXMgbm90aGluZyB0byBkbworCQkJCS8vIC0+IHNlcnZlciBzZW5kcyBkYXRhCisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg6CisJCQkJewkvLyBzZW5kIG5leHQgZnJhbWUKKwkJCQkJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0KKwkJCQkJICAgIGtFcGxTZG9UcmFuc1NlZ21lbnRlZCkgeworCQkJCQkJaWYgKHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA+IEVQTF9TRE9fTUFYX1BBWUxPQUQpIHsJLy8gbmV4dCBzZWdtZW50CisJCQkJCQkJcGJQYXlsb2FkID0KKwkJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkgICAgWzBdOworCQkJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJCQlBbWlTZXRXb3JkVG9MZQorCQkJCQkJCSAgICAoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkJICAgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKwkJCQkJCQliRmxhZ3MgPSAweDIwOworCQkJCQkJCUFtaVNldEJ5dGVUb0xlCisJCQkJCQkJICAgICgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX2JGbGFncywKKwkJCQkJCQkgICAgIGJGbGFncyk7CisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwYlBheWxvYWQsCisJCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCQkJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQkJCS8vIGNvcnJlY3QgaW50ZXJuIGNvdW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICA9CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCQkJLy8gY2FsYyBzaXplCisJCQkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCisJCQkJCQl9IGVsc2UgewkvLyBlbmQgb2YgdHJhbnNmZXIKKwkJCQkJCQlwYlBheWxvYWQgPQorCQkJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICBbMF07CisJCQkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQkJCUFtaVNldFdvcmRUb0xlCisJCQkJCQkJICAgICgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCQkgICAgIChXT1JEKQorCQkJCQkJCSAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgIG1fdWlUcmFuc1NpemUpOworCQkJCQkJCWJGbGFncyA9IDB4MzA7CisJCQkJCQkJQW1pU2V0Qnl0ZVRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzLAorCQkJCQkJCSAgICAgYkZsYWdzKTsKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemU7CisJCQkJCQkJLy8gY2FsYyBzaXplCisJCQkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCQkJCQkJCS8vIGNvcnJlY3QgaW50ZXJuIGNvdW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0KKwkJCQkJCQkgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZTsKKworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkKKwkJfQorCX0gZWxzZSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjYWxsIHNlbmQgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwlzd2l0Y2ggKHBTZG9Db21Db25fcC0+bV9TZG9Qcm90VHlwZSkgeworCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCWNhc2Uga0VwbFNkb1R5cGVVZHA6CisJCXsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3Q7CisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uX3AtPm1fU2RvUHJvdFR5cGUpCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tQ2xpZW50UHJvY2Vzc0ZyYW1lCisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHByb2Nlc3MgYSByZWNlaXZlZCBmcmFtZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9Db21Db25fcCAgICAgID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgdG8gcHJvY2VzcworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50UHJvY2Vzc0ZyYW1lKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSAgICAgIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJQllURSBiQnVmZmVyOworCXVuc2lnbmVkIGludCB1aUJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyOworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlCisJcFNkb0NvbUNvbiA9ICZTZG9Db21JbnN0YW5jZV9nLm1fU2RvQ29tQ29uW1Nkb0NvbUNvbl9wXTsKKworCS8vIGNoZWNrIGlmIHRyYW5zYWN0aW9uIElkIGZpdAorCWJCdWZmZXIgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYlRyYW5zYWN0aW9uSWQpOworCWlmIChwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkICE9IGJCdWZmZXIpIHsKKwkJLy8gaW5jb3JyZWN0IHRyYW5zYWN0aW9uIGlkCisKKwkJLy8gaWYgcnVubmluZyB0cmFuc2ZlcgorCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgIT0gMCkKKwkJICAgICYmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplICE9IDApKSB7CisJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJLy8gLT4gc2VuZCBhYm9ydAorCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHBTZG9Db21Db24sCisJCQkJCQkgcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUpOworCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkJICAgICAga0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkKTsKKwkJfQorCisJfSBlbHNlIHsJCS8vIGNoZWNrIGlmIGNvcnJlY3QgY29tbWFuZAorCQliQnVmZmVyID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2JDb21tYW5kSWQpOworCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSAhPSBiQnVmZmVyKSB7CisJCQkvLyBpbmNvcnJlY3QgY29tbWFuZAorCQkJLy8gaWYgcnVubmluZyB0cmFuc2ZlcgorCQkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNmZXJyZWRCeXRlICE9IDApCisJCQkgICAgJiYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgIT0gMCkpIHsKKwkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJCS8vIC0+IHNlbmQgYWJvcnQKKwkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCQkgcFNkb0NvbUNvbi0+CisJCQkJCQkJIG1fZHdMYXN0QWJvcnRDb2RlKTsKKwkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCSAgICAgIGtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCk7CisJCQl9CisKKwkJfSBlbHNlIHsJLy8gc3dpdGNoIG9uIGNvbW1hbmQKKwkJCXN3aXRjaCAocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSkgeworCQkJY2FzZSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDoKKwkJCQl7CS8vIGNoZWNrIGlmIGNvbmZpcm1hdGlvbiBmcm9tIHNlcnZlcgorCQkJCQkvLyBub3RoaW5nIG1vcmUgdG8gZG8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg6CisJCQkJewkvLyBjaGVjayBpZiBpdCBpcyBhbiBzZWdtZW50ZWQgb3IgYW4gZXhwZWRpdGVkIHRyYW5zZmVyCisJCQkJCWJCdWZmZXIgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJLy8gbWFzayB1bmludGVyZXNzdGluZyBiaXRzCisJCQkJCWJCdWZmZXIgJj0gMHgzMDsKKwkJCQkJc3dpdGNoIChiQnVmZmVyKSB7CisJCQkJCQkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJCQkJY2FzZSAweDAwOgorCQkJCQkJeworCQkJCQkJCS8vIGNoZWNrIHNpemUgb2YgYnVmZmVyCisJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCSAgICBBbWlHZXRXb3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplKTsKKwkJCQkJCQlpZiAodWlCdWZmZXIgPiBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIGJ1ZmZlciBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gaXMgdG8gc21hbGwKKwkJCQkJCQkJLy8gY29weSBvbmx5IGEgcGFydAorCQkJCQkJCQl1aURhdGFTaXplID0KKwkJCQkJCQkJICAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZTsKKwkJCQkJCQl9IGVsc2UgewkvLyBidWZmZXIgZml0cworCQkJCQkJCQl1aURhdGFTaXplID0KKwkJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCX0KKworCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgWzBdLAorCQkJCQkJCQkgICB1aURhdGFTaXplKTsKKworCQkJCQkJCS8vIGNvcnJlY3QgY291bnRlcgorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICA9IHVpRGF0YVNpemU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIHN0YXJ0IG9mIGEgc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJCWNhc2UgMHgxMDoKKwkJCQkJCXsJLy8gZ2V0IHRvdGFsIHNpemUgb2YgdHJhbnNmZXIKKwkJCQkJCQl1bEJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldER3b3JkRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICAgWzBdKTsKKwkJCQkJCQlpZiAodWxCdWZmZXIgPD0gcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgewkvLyBidWZmZXIgZml0CisJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHVuc2lnbmVkCisJCQkJCQkJCSAgICAgaW50KQorCQkJCQkJCQkgICAgdWxCdWZmZXI7CisJCQkJCQkJfSBlbHNlIHsJLy8gYnVmZmVyIHRvIHNtYWxsCisJCQkJCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfVE9PX0hJR0g7CisJCQkJCQkJCS8vIC0+IHNlbmQgYWJvcnQKKwkJCQkJCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0CisJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJICAgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX2R3TGFzdEFib3J0Q29kZSk7CisJCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkJICAgICBwU2RvQ29tQ29uLAorCQkJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlclJ4QWJvcnRlZCk7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCQkvLyBnZXQgc2VnbWVudCBzaXplCisJCQkJCQkJLy8gY2hlY2sgc2l6ZSBvZiBidWZmZXIKKwkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCS8vIHN1YnRyYWN0IHNpemUgb2YgdmFpYWJsZSBoZWFkZXIgZnJvbSBkYXRhc2l6ZQorCQkJCQkJCXVpQnVmZmVyIC09IDQ7CisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICBbNF0sCisJCQkJCQkJCSAgIHVpQnVmZmVyKTsKKworCQkJCQkJCS8vIGNvcnJlY3QgY291bnRlciBhbiBwb2ludGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+bV9wRGF0YSArPQorCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICArPSB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSAtPQorCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBzZWdtZW50CisJCQkJCWNhc2UgMHgyMDoKKwkJCQkJCXsKKwkJCQkJCQkvLyBnZXQgc2VnbWVudCBzaXplCisJCQkJCQkJLy8gY2hlY2sgc2l6ZSBvZiBidWZmZXIKKwkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCS8vIGNoZWNrIGlmIGRhdGEgdG8gY29weSBmaXQgdG8gYnVmZmVyCisJCQkJCQkJaWYgKHVpQnVmZmVyID49IHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpIHsJLy8gdG8gbXVjaCBkYXRhCisJCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX3VpVHJhbnNTaXplCisJCQkJCQkJCSAgICAgLSAxKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICBbMF0sCisJCQkJCQkJCSAgIHVpQnVmZmVyKTsKKworCQkJCQkJCS8vIGNvcnJlY3QgY291bnRlciBhbiBwb2ludGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+bV9wRGF0YSArPQorCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICArPSB1aUJ1ZmZlcjsKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZSAtPQorCQkJCQkJCSAgICB1aUJ1ZmZlcjsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gbGFzdCBzZWdtZW50CisJCQkJCWNhc2UgMHgzMDoKKwkJCQkJCXsKKwkJCQkJCQkvLyBnZXQgc2VnbWVudCBzaXplCisJCQkJCQkJLy8gY2hlY2sgc2l6ZSBvZiBidWZmZXIKKwkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCS8vIGNoZWNrIGlmIGRhdGEgdG8gY29weSBmaXQgdG8gYnVmZmVyCisJCQkJCQkJaWYgKHVpQnVmZmVyID4gcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgewkvLyB0byBtdWNoIGRhdGEKKwkJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgICAtIDEpOworCQkJCQkJCX0KKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkJICAgdWlCdWZmZXIpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyIGFuIHBvaW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID0gMDsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CS8vIGVuZCBvZiBzd2l0Y2goYkJ1ZmZlciAmIDB4MzApCisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlTklMOgorCQkJZGVmYXVsdDoKKwkJCQkvLyBpbnZhbGlkIHNlcnZpY2UgcmVxdWVzdGVkCisJCQkJLy8gJCQkIGQuay4gV2hhdCBzaG91bGQgd2UgZG8/CisJCQkJYnJlYWs7CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSkKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZW5kIGEgYWJvcnQgbWVzc2FnZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBkd0Fib3J0Q29kZV9wICAgID0gU2RvIGFib3J0IGNvZGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCSAgIERXT1JEIGR3QWJvcnRDb2RlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJQllURSBhYkZyYW1lW0VQTF9NQVhfU0RPX0ZSQU1FX1NJWkVdOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXRFcGxBc3lTZG9Db20gKnBDb21tYW5kRnJhbWU7CisJdW5zaWduZWQgaW50IHVpU2l6ZU9mRnJhbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXBGcmFtZSA9ICh0RXBsRnJhbWUgKikgJiBhYkZyYW1lWzBdOworCisJRVBMX01FTVNFVCgmYWJGcmFtZVswXSwgMHgwMCwgc2l6ZW9mKGFiRnJhbWUpKTsKKworCS8vIGJ1aWxkIGdlbmVyaWMgcGFydCBvZiBmcmFtZQorCS8vIGdldCBwb2ludGVyIHRvIGNvbW1hbmQgbGF5ZXJwYXJ0IG9mIGZyYW1lCisJcENvbW1hbmRGcmFtZSA9CisJICAgICZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkgICAgbV9sZV9hYlNkb1NlcVBheWxvYWQ7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkNvbW1hbmRJZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYlRyYW5zYWN0aW9uSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fYlRyYW5zYWN0aW9uSWQpOworCisJdWlTaXplT2ZGcmFtZSA9IDg7CisKKwkvLyBzZXQgcmVzcG9uc2UgYW5kIGFib3J0IGZsYWcKKwlwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncyB8PSAweDQwOworCisJLy8gY29weSBhYm9ydGNvZGUgdG8gZnJhbWUKKwlBbWlTZXREd29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYWJDb21tYW5kRGF0YVswXSwgZHdBYm9ydENvZGVfcCk7CisKKwkvLyBzZXQgc2l6ZSBvZiBzZWdtZW50CisJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfd1NlZ21lbnRTaXplLCBzaXplb2YoRFdPUkQpKTsKKworCS8vIHVwZGF0ZSBjb3VudGVyCisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gc2l6ZW9mKERXT1JEKTsKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCisJLy8gY2FsYyBmcmFtZXNpemUKKwl1aVNpemVPZkZyYW1lICs9IHNpemVvZihEV09SRCk7CisKKwkvLyBzYXZlIGFib3J0IGNvZGUKKwlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gZHdBYm9ydENvZGVfcDsKKworCS8vIGNhbGwgc2VuZCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCXN3aXRjaCAocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKSB7CisJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9Qcm90VHlwZSkKKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxscyBjYWxsYmFjayBmdW5jdGlvbiBvZiBhcHBsaWNhdGlvbiBpZiBhdmFpbGFibGUKKy8vICAgICAgICAgICAgICBhbmQgY2xlYXJzIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBTZG9Db21Db25TdGF0ZV9wID0gc3RhdGUgb2YgU0RPIHRyYW5zZmVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgIHRFcGxTZG9Db21Db25TdGF0ZSBTZG9Db21Db25TdGF0ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFNkb0NvbUNvbl9wLT5tX3BmblRyYW5zZmVyRmluaXNoZWQgIT0gTlVMTCkgeworCQl0RXBsU2RvRmluaXNoZWRDYiBwZm5UcmFuc2ZlckZpbmlzaGVkOworCQl0RXBsU2RvQ29tRmluaXNoZWQgU2RvQ29tRmluaXNoZWQ7CisKKwkJU2RvQ29tRmluaXNoZWQubV9wVXNlckFyZyA9IHBTZG9Db21Db25fcC0+bV9wVXNlckFyZzsKKwkJU2RvQ29tRmluaXNoZWQubV91aU5vZGVJZCA9IHBTZG9Db21Db25fcC0+bV91aU5vZGVJZDsKKwkJU2RvQ29tRmluaXNoZWQubV91aVRhcmdldEluZGV4ID0gcFNkb0NvbUNvbl9wLT5tX3VpVGFyZ2V0SW5kZXg7CisJCVNkb0NvbUZpbmlzaGVkLm1fdWlUYXJnZXRTdWJJbmRleCA9CisJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUYXJnZXRTdWJJbmRleDsKKwkJU2RvQ29tRmluaXNoZWQubV91aVRyYW5zZmVycmVkQnl0ZSA9CisJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGU7CisJCVNkb0NvbUZpbmlzaGVkLm1fZHdBYm9ydENvZGUgPSBwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlOworCQlTZG9Db21GaW5pc2hlZC5tX1Nkb0NvbUNvbkhkbCA9IFNkb0NvbUNvbl9wOworCQlTZG9Db21GaW5pc2hlZC5tX1Nkb0NvbUNvblN0YXRlID0gU2RvQ29tQ29uU3RhdGVfcDsKKwkJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSA9PQorCQkgICAga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpIHsKKwkJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlV3JpdGU7CisJCX0gZWxzZSB7CisJCQlTZG9Db21GaW5pc2hlZC5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQ7CisJCX0KKworCQkvLyByZXNldCB0cmFuc2ZlciBzdGF0ZSBzbyB0aGlzIGhhbmRsZSBpcyBub3QgYnVzeSBhbnltb3JlCisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkJcGZuVHJhbnNmZXJGaW5pc2hlZCA9IHBTZG9Db21Db25fcC0+bV9wZm5UcmFuc2ZlckZpbmlzaGVkOworCQkvLyBkZWxldGUgZnVuY3Rpb24gcG9pbnRlciB0byBpbmZvcm0gYXBwbGljYXRpb24gb25seSBvbmNlIGZvciBlYWNoIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9wZm5UcmFuc2ZlckZpbmlzaGVkID0gTlVMTDsKKworCQkvLyBjYWxsIGFwcGxpY2F0aW9uJ3MgY2FsbGJhY2sgZnVuY3Rpb24KKwkJcGZuVHJhbnNmZXJGaW5pc2hlZCgmU2RvQ29tRmluaXNoZWQpOworCisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb1VkcHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvVWRwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTIyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb1VkcHUuYwpAQCAtMCwwICsxLDc5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBTRE8vVURQLVByb3RvY29sYWJzdHJhY3Rpb25sYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9VZHB1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxTZG9VZHB1LmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgIlNvY2tldExpbnV4S2VybmVsLmgiCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFAKKyNkZWZpbmUgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFAgIDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fdWxJcEFkZHI7CS8vIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorCXVuc2lnbmVkIGludCBtX3VpUG9ydDsJLy8gaW4gbmV0d29yayBieXRlIG9yZGVyCisKK30gdEVwbFNkb1VkcENvbjsKKworLy8gaW5zdGFuY2UgdGFibGUKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvVWRwQ29uIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25bRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFBdOworCXRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgbV9mcFNkb0FzeVNlcUNiOworCVNPQ0tFVCBtX1VkcFNvY2tldDsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJSEFORExFIG1fVGhyZWFkSGFuZGxlOworCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCXN0cnVjdCBjb21wbGV0aW9uIG1fQ29tcGxldGlvblVkcFRocmVhZDsKKwlpbnQgbV9UaHJlYWRIYW5kbGU7CisJaW50IG1faVRlcm1pbmF0ZVRocmVhZDsKKyNlbmRpZgorCit9IHRFcGxTZG9VZHBJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxTZG9VZHBJbnN0YW5jZSBTZG9VZHBJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCitzdGF0aWMgRFdPUkQgUFVCTElDIEVwbFNkb1VkcFRocmVhZChMUFZPSUQgbHBQYXJhbWV0ZXIpOworCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCitzdGF0aWMgaW50IEVwbFNkb1VkcFRocmVhZCh2b2lkICpwQXJnX3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVQTC1TRE8tVURQLUxheWVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IFByb3RvY29sYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIFVEUAorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVJbml0KHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFNkb1VkcHVBZGRJbnN0YW5jZShmcFJlY2VpdmVDYl9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8gICAgICAgICAgICAgIO5uaXQgc29ja2V0IGFuZCBzdGFydCBMaXN0ZW4tVGhyZWFkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFJlY2VpdmVDYl9wICAgID0gICBmdW5jdGlvbnBvaW50ZXIgdG8gU2RvLVNlcXVlbmNlIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay1mdW5jdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCWludCBpRXJyb3I7CisJV1NBREFUQSBXc2E7CisKKyNlbmRpZgorCisJLy8gc2V0IGluc3RhbmNlIHZhcmlhYmxlcyB0byAwCisJRVBMX01FTVNFVCgmU2RvVWRwSW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKFNkb1VkcEluc3RhbmNlX2cpKTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gc2F2ZSBwb2ludGVyIHRvIGNhbGxiYWNrLWZ1bmN0aW9uCisJaWYgKGZwUmVjZWl2ZUNiX3AgIT0gTlVMTCkgeworCQlTZG9VZHBJbnN0YW5jZV9nLm1fZnBTZG9Bc3lTZXFDYiA9IGZwUmVjZWl2ZUNiX3A7CisJfSBlbHNlIHsKKwkJUmV0ID0ga0VwbFNkb1VkcE1pc3NDYjsKKwkJZ290byBFeGl0OworCX0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gc3RhcnQgd2luc29jazIgZm9yIHdpbjMyCisJLy8gd2luZG93cyBzcGVjaWZpYyBzdGFydCBvZiBzb2NrZXQKKwlpRXJyb3IgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDIsIDApLCAmV3NhKTsKKwlpZiAoaUVycm9yICE9IDApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcE5vU29ja2V0OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBhY2NjZXNzIG9mIGluc3RuYWNlIHZhcmlhYmxlcworCVNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJlNkb1VkcEluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb247CisJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwlpbml0X2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKKwlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDA7CisjZW5kaWYKKworCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSAwOworCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKKworCVJldCA9IEVwbFNkb1VkcHVDb25maWcoSU5BRERSX0FOWSwgMCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLyAgICAgICAgICAgICAgZGVsIHNvY2tldCBhbmQgZGVsIExpc3Rlbi1UaHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJQk9PTCBmVGVybUVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlICE9IDApIHsJLy8gbGlzdGVuIHRocmVhZCB3YXMgc3RhcnRlZAorCQkvLyBjbG9zZSB0aHJlYWQKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQlmVGVybUVycm9yID0KKwkJICAgIFRlcm1pbmF0ZVRocmVhZChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCAwKTsKKwkJaWYgKGZUZXJtRXJyb3IgPT0gRkFMU0UpIHsKKwkJCVJldCA9IGtFcGxTZG9VZHBUaHJlYWRFcnJvcjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCQlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDE7CisJCS8qIGtpbGxfcHJvYyhTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCBTSUdURVJNLCAxICk7ICovCisJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCk7CisjZW5kaWYKKworCQlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gMDsKKwl9CisKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCAhPSBJTlZBTElEX1NPQ0tFVCkgeworCQkvLyBjbG9zZSBzb2NrZXQKKwkJY2xvc2Vzb2NrZXQoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCk7CisJCVNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVDsKKwl9CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBkZWxldGUgY3JpdGljYWwgc2VjdGlvbgorCURlbGV0ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gZm9yIHdpbiAzMgorCVdTQUNsZWFudXAoKTsKKyNlbmRpZgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKyAgICAgIEV4aXQ6CisjZW5kaWYKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1Q29uZmlnCisvLworLy8gRGVzY3JpcHRpb246IHJlY29uZmlndXJhdGUgc29ja2V0IHdpdGggbmV3IElQLUFkZHJlc3MKKy8vICAgICAgICAgICAgICAtPiBuZWVkZWQgZm9yIE5NVCBSZXNldENvbmZpZ3VyYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWxJcEFkZHJfcCAgICAgID0gSXBBZGRyZXNzIGluIHBsYXRmb3JtIGJ5dGUgb3JkZXIKKy8vICAgICAgICAgICAgICB1aVBvcnRfcCAgICAgICAgPSBwb3J0IG51bWJlciBpbiBwbGF0Zm9ybSBieXRlIG9yZGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUNvbmZpZyh1bnNpZ25lZCBsb25nIHVsSXBBZGRyX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpUG9ydF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXN0cnVjdCBzb2NrYWRkcl9pbiBBZGRyOworCWludCBpRXJyb3I7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCUJPT0wgZlRlcm1FcnJvcjsKKwl1bnNpZ25lZCBsb25nIHVsVGhyZWFkSWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHVpUG9ydF9wID09IDApIHsJLy8gc2V0IFVEUCBwb3J0IHRvIGRlZmF1bHQgcG9ydCBudW1iZXIKKwkJdWlQb3J0X3AgPSBFUExfQ19TRE9fRVBMX1BPUlQ7CisJfSBlbHNlIGlmICh1aVBvcnRfcCA+IDY1NTM1KSB7CisJCVJldCA9IGtFcGxTZG9VZHBTb2NrZXRFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlICE9IDApIHsJLy8gbGlzdGVuIHRocmVhZCB3YXMgc3RhcnRlZAorCisJCS8vIGNsb3NlIG9sZCB0aHJlYWQKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQlmVGVybUVycm9yID0KKwkJICAgIFRlcm1pbmF0ZVRocmVhZChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCAwKTsKKwkJaWYgKGZUZXJtRXJyb3IgPT0gRkFMU0UpIHsKKwkJCVJldCA9IGtFcGxTZG9VZHBUaHJlYWRFcnJvcjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCQlTZG9VZHBJbnN0YW5jZV9nLm1faVRlcm1pbmF0ZVRocmVhZCA9IDE7CisJCS8qIGtpbGxfcHJvYyhTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlLCBTSUdURVJNLCAxICk7ICovCisJCXNlbmRfc2lnKFNJR1RFUk0sIFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZTZG9VZHBJbnN0YW5jZV9nLm1fQ29tcGxldGlvblVkcFRocmVhZCk7CisJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMDsKKyNlbmRpZgorCisJCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSAwOworCX0KKworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ICE9IElOVkFMSURfU09DS0VUKSB7CisJCS8vIGNsb3NlIHNvY2tldAorCQlpRXJyb3IgPSBjbG9zZXNvY2tldChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0KTsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IElOVkFMSURfU09DS0VUOworCQlpZiAoaUVycm9yICE9IDApIHsKKwkJCVJldCA9IGtFcGxTZG9VZHBTb2NrZXRFcnJvcjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKwkvLyBjcmVhdGUgU29ja2V0CisJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKKwkJUmV0ID0ga0VwbFNkb1VkcE5vU29ja2V0OworCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkVwbFNkb1VkcHVDb25maWc6IHNvY2tldCgpIGZhaWxlZFxuIik7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gYmluZCBzb2NrZXQKKwlBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCUFkZHIuc2luX3BvcnQgPSBodG9ucygodW5zaWduZWQgc2hvcnQpdWlQb3J0X3ApOworCUFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwodWxJcEFkZHJfcCk7CisJaUVycm9yID0KKwkgICAgYmluZChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJkFkZHIsCisJCSBzaXplb2YoQWRkcikpOworCWlmIChpRXJyb3IgPCAwKSB7CisJCS8vaUVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMQorCQkgICAgKCJFcGxTZG9VZHB1Q29uZmlnOiBiaW5kKCkgZmluaXNoZWQgd2l0aCAlaVxuIiwgaUVycm9yKTsKKwkJUmV0ID0ga0VwbFNkb1VkcE5vU29ja2V0OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNyZWF0ZSBMaXN0ZW4tVGhyZWFkCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBmb3Igd2luMzIKKworCS8vIGNyZWF0ZSB0aHJlYWQKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0gQ3JlYXRlVGhyZWFkKE5VTEwsCisJCQkJCQkgICAgICAgMCwKKwkJCQkJCSAgICAgICBFcGxTZG9VZHBUaHJlYWQsCisJCQkJCQkgICAgICAgJlNkb1VkcEluc3RhbmNlX2csCisJCQkJCQkgICAgICAgMCwgJnVsVGhyZWFkSWQpOworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCisJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9CisJICAgIGtlcm5lbF90aHJlYWQoRXBsU2RvVWRwVGhyZWFkLCAmU2RvVWRwSW5zdGFuY2VfZywgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9PSAwKSB7CisJCVJldCA9IGtFcGxTZG9VZHBUaHJlYWRFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUluaXRDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhIG5ldyBjb25uZWN0CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbkhhbmRsZV9wID0gcG9pbnRlciBmb3IgdGhlIG5ldyBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVpVGFyZ2V0Tm9kZUlkX3AgPSBOb2RlSWQgb2YgdGhlIHRhcmdldCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUluaXRDb24odEVwbFNkb0NvbkhkbCAqIHBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUNvbjsKKwl0RXBsU2RvVWRwQ29uICpwU2RvVWRwQ29uOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgZnJlZSBlbnRyeSBpbiBjb250cm9sIHN0cnVjdHVyZQorCXVpQ291bnQgPSAwOworCXVpRnJlZUNvbiA9IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQOworCXBTZG9VZHBDb24gPSAmU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uWzBdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJaWYgKChwU2RvVWRwQ29uLT5tX3VsSXBBZGRyICYgaHRvbmwoMHhGRikpID09IGh0b25sKHVpVGFyZ2V0Tm9kZUlkX3ApKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGFyZ2V0IG5vZGUgZm91bmQKKwkJCS8vIHNldCBoYW5kbGUKKwkJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlDb3VudCB8IEVQTF9TRE9fVURQX0hBTkRMRSk7CisKKwkJCWdvdG8gRXhpdDsKKwkJfSBlbHNlIGlmICgocFNkb1VkcENvbi0+bV91bElwQWRkciA9PSAwKQorCQkJICAgJiYgKHBTZG9VZHBDb24tPm1fdWlQb3J0ID09IDApKSB7CisJCQl1aUZyZWVDb24gPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcFNkb1VkcENvbisrOworCX0KKworCWlmICh1aUZyZWVDb24gPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJLy8gZXJyb3Igbm8gZnJlZSBoYW5kbGUKKwkJUmV0ID0ga0VwbFNkb1VkcE5vRnJlZUhhbmRsZTsKKwl9IGVsc2UgeworCQlwU2RvVWRwQ29uID0KKwkJICAgICZTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlGcmVlQ29uXTsKKwkJLy8gc2F2ZSBpbmZvcyBmb3IgY29ubmVjdGlvbgorCQlwU2RvVWRwQ29uLT5tX3VpUG9ydCA9IGh0b25zKEVQTF9DX1NET19FUExfUE9SVCk7CisJCXBTZG9VZHBDb24tPm1fdWxJcEFkZHIgPSBodG9ubCgweEMwQTg2NDAwIHwgdWlUYXJnZXROb2RlSWRfcCk7CS8vIDE5Mi4xNjguMTAwLnVpVGFyZ2V0Tm9kZUlkX3AKKworCQkvLyBzZXQgaGFuZGxlCisJCSpwU2RvQ29uSGFuZGxlX3AgPSAodWlGcmVlQ29uIHwgRVBMX1NET19VRFBfSEFORExFKTsKKworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVTZW5kRGF0YQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kIGRhdGEgdXNpbmcgZXhpc2l0aW5nIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gZGF0YQorLy8gICAgICAgICAgICAgIGR3RGF0YVNpemVfcCAgICA9IG51bWJlciBvZiBkYXRhYnl0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBhc2VuZC1oZWFkZXIhISEKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgdEVwbEZyYW1lICogcFNyY0RhdGFfcCwgRFdPUkQgZHdEYXRhU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpRXJyb3I7CisJdW5zaWduZWQgaW50IHVpQXJyYXk7CisJc3RydWN0IHNvY2thZGRyX2luIEFkZHI7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXVpQXJyYXkgPSAoU2RvQ29uSGFuZGxlX3AgJiB+RVBMX1NET19BU1lfSEFORExFX01BU0spOworCWlmICh1aUFycmF5ID49IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCVJldCA9IGtFcGxTZG9VZHBJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCS8vc2V0IG1lc3NhZ2UgdHlwZQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwgMHgwNik7CS8vIFNETworCS8vIHRhcmdldCBub2RlIGlkIChmb3IgVWRwID0gMCkKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iRHN0Tm9kZUlkLCAweDAwKTsKKwkvLyBzZXQgc291cmNlLW5vZGVpZCAoZm9yIFVkcCA9IDApCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYlNyY05vZGVJZCwgMHgwMCk7CisKKwkvLyBjYWxjIHNpemUKKwlkd0RhdGFTaXplX3AgKz0gRVBMX0FTTkRfSEVBREVSX1NJWkU7CisKKwkvLyBjYWxsIHNlbmR0bworCUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJQWRkci5zaW5fcG9ydCA9CisJICAgICh1bnNpZ25lZCBzaG9ydClTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0uCisJICAgIG1fdWlQb3J0OworCUFkZHIuc2luX2FkZHIuc19hZGRyID0KKwkgICAgU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWxJcEFkZHI7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCWlFcnJvciA9IHNlbmR0byhTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0LAkvLyBzb2NrZXRoYW5kbGUKKwkJCShjb25zdCBjaGFyICopJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLAkvLyBkYXRhIHRvIHNlbmQKKwkJCWR3RGF0YVNpemVfcCwJLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHNlbmQKKwkJCTAsCS8vIGZsYWdzCisJCQkoc3RydWN0IHNvY2thZGRyICopJkFkZHIsCS8vIHRhcmdldAorCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwkvLyBzaXplb2YgdGFyZ2V0YWRyZXNzCisJaWYgKGlFcnJvciA8IDApIHsKKwkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UxCisJCSAgICAoIkVwbFNkb1VkcHVTZW5kRGF0YTogc2VuZHRvKCkgZmluaXNoZWQgd2l0aCAlaVxuIiwgaUVycm9yKTsKKwkJUmV0ID0ga0VwbFNkb1VkcFNlbmRFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVEZWxDb24KKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGNvbm5lY3Rpb24gZnJvbSBpbnRlcm4gc3RydWN0dXJlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKworCXVpQXJyYXkgPSAoU2RvQ29uSGFuZGxlX3AgJiB+RVBMX1NET19BU1lfSEFORExFX01BU0spOworCisJaWYgKHVpQXJyYXkgPj0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcEludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl9CisKKwkvLyBkZWxldGUgY29ubmVjdGlvbgorCVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VsSXBBZGRyID0gMDsKKwlTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0ubV91aVBvcnQgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvVWRwVGhyZWFkCisvLworLy8gRGVzY3JpcHRpb246ICAgICB0aHJlYWQgY2hlY2sgc29ja2V0IGZvciBuZXcgZGF0YQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBscFBhcmFtZXRlciA9IHBvaW50ZXIgdG8gcGFyYW1ldGVyIHR5cGUgdEVwbFNkb1VkcFRocmVhZFBhcmEKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICBEV09SRCAgID0gICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorc3RhdGljIERXT1JEIFBVQkxJQyBFcGxTZG9VZHBUaHJlYWQoTFBWT0lEIGxwUGFyYW1ldGVyKQorI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorc3RhdGljIGludCBFcGxTZG9VZHBUaHJlYWQodm9pZCAqcEFyZ19wKQorI2VuZGlmCit7CisKKwl0RXBsU2RvVWRwSW5zdGFuY2UgKnBJbnN0YW5jZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gUmVtb3RlQWRkcjsKKwlpbnQgaUVycm9yOworCWludCBpQ291bnQ7CisJaW50IGlGcmVlRW50cnk7CisJQllURSBhYkJ1ZmZlcltFUExfTUFYX1NET19SRUNfRlJBTUVfU0laRV07CisJdW5zaWduZWQgaW50IHVpU2l6ZTsKKwl0RXBsU2RvQ29uSGRsIFNkb0NvbkhkbDsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJcEluc3RhbmNlID0gKHRFcGxTZG9VZHBJbnN0YW5jZSAqKSBscFBhcmFtZXRlcjsKKworCWZvciAoOzspCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJcEluc3RhbmNlID0gKHRFcGxTZG9VZHBJbnN0YW5jZSAqKSBwQXJnX3A7CisJZGFlbW9uaXplKCJFcGxTZG9VZHBUaHJlYWQiKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwlmb3IgKDsgcEluc3RhbmNlLT5tX2lUZXJtaW5hdGVUaHJlYWQgPT0gMDspCisjZW5kaWYKKworCXsKKwkJLy8gd2FpdCBmb3IgZGF0YQorCQl1aVNpemUgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKKwkJaUVycm9yID0gcmVjdmZyb20ocEluc3RhbmNlLT5tX1VkcFNvY2tldCwJLy8gU29ja2V0CisJCQkJICAoY2hhciAqKSZhYkJ1ZmZlclswXSwJLy8gYnVmZmVyIGZvciBkYXRhCisJCQkJICBzaXplb2YoYWJCdWZmZXIpLAkvLyBzaXplIG9mIHRoZSBidWZmZXIKKwkJCQkgIDAsCS8vIGZsYWdzCisJCQkJICAoc3RydWN0IHNvY2thZGRyICopJlJlbW90ZUFkZHIsCisJCQkJICAoaW50ICopJnVpU2l6ZSk7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCQlpZiAoaUVycm9yID09IC1FUkVTVEFSVFNZUykgeworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZiAoaUVycm9yID4gMCkgeworCQkJLy8gZ2V0IGhhbmRsZSBmb3IgaGlnaGVyIGxheWVyCisJCQlpQ291bnQgPSAwOworCQkJaUZyZWVFbnRyeSA9IDB4RkZGRjsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwkJCUVudGVyQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCQkJd2hpbGUgKGlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fVURQKSB7CisJCQkJLy8gY2hlY2sgaWYgdGhpcyBjb25uZWN0aW9uIGlzIGFscmVhZHkga25vd24KKwkJCQlpZiAoKHBJbnN0YW5jZS0+bV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCSAgICAgbV91bElwQWRkciA9PSBSZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcikKKwkJCQkgICAgJiYgKHBJbnN0YW5jZS0+CisJCQkJCW1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KKwkJCQkJbV91aVBvcnQgPT0gUmVtb3RlQWRkci5zaW5fcG9ydCkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKChwSW5zdGFuY2UtPm1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KKwkJCQkgICAgIG1fdWxJcEFkZHIgPT0gMCkKKwkJCQkgICAgJiYgKHBJbnN0YW5jZS0+CisJCQkJCW1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUNvdW50XS4KKwkJCQkJbV91aVBvcnQgPT0gMCkKKwkJCQkgICAgJiYgKGlGcmVlRW50cnkgPT0gMHhGRkZGKSkKKwkJCQl7CisJCQkJCWlGcmVlRW50cnkgPSBpQ291bnQ7CisJCQkJfQorCisJCQkJaUNvdW50Kys7CisJCQl9CisKKwkJCWlmIChpQ291bnQgPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJCQkvLyBjb25uZWN0aW9uIHVua25vd24KKwkJCQkvLyBzZWUgaWYgdGhlcmUgaXMgYSBmcmVlIGhhbmRsZQorCQkJCWlmIChpRnJlZUVudHJ5ICE9IDB4RkZGRikgeworCQkJCQkvLyBzYXZlIGFkcmVzcyBpbmZvcworCQkJCQlwSW5zdGFuY2UtPgorCQkJCQkgICAgbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpRnJlZUVudHJ5XS4KKwkJCQkJICAgIG1fdWxJcEFkZHIgPQorCQkJCQkgICAgUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHI7CisJCQkJCXBJbnN0YW5jZS0+CisJCQkJCSAgICBtX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lGcmVlRW50cnldLgorCQkJCQkgICAgbV91aVBvcnQgPSBSZW1vdGVBZGRyLnNpbl9wb3J0OworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCQkJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwkJCQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKwkJCQkJLy8gY2FsbCBjYWxsYmFjaworCQkJCQlTZG9Db25IZGwgPSBpRnJlZUVudHJ5OworCQkJCQlTZG9Db25IZGwgfD0gRVBMX1NET19VRFBfSEFORExFOworCQkJCQkvLyBvZmZzZXQgNCAtPiBzdGFydCBvZiBTRE8gU2VxdWVuY2UgaGVhZGVyCisJCQkJCXBJbnN0YW5jZS0+bV9mcFNkb0FzeVNlcUNiKFNkb0NvbkhkbCwKKwkJCQkJCQkJICAgKHRFcGxBc3lTZG9TZXEKKwkJCQkJCQkJICAgICopICYKKwkJCQkJCQkJICAgYWJCdWZmZXJbNF0sCisJCQkJCQkJCSAgIChpRXJyb3IgLQorCQkJCQkJCQkgICAgNCkpOworCQkJCX0gZWxzZSB7CisJCQkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCQkJCQkgICAgKCJFcnJvciBpbiBFcGxTZG9VZHBUaHJlYWQoKSBubyBmcmVlIGhhbmRsZVxuIik7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJCQkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkvLyBrbm93biBjb25uZWN0aW9uCisJCQkJLy8gY2FsbCBjYWxsYmFjayB3aXRoIGNvcnJlY3QgaGFuZGxlCisJCQkJU2RvQ29uSGRsID0gaUNvdW50OworCQkJCVNkb0NvbkhkbCB8PSBFUExfU0RPX1VEUF9IQU5ETEU7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJCQkJTGVhdmVDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCQkJCS8vIG9mZnNldCA0IC0+IHN0YXJ0IG9mIFNETyBTZXF1ZW5jZSBoZWFkZXIKKwkJCQlwSW5zdGFuY2UtPm1fZnBTZG9Bc3lTZXFDYihTZG9Db25IZGwsCisJCQkJCQkJICAgKHRFcGxBc3lTZG9TZXEgKikgJgorCQkJCQkJCSAgIGFiQnVmZmVyWzRdLAorCQkJCQkJCSAgIChpRXJyb3IgLSA0KSk7CisJCQl9CisJCX0JCS8vIGVuZCBvZiAgaWYoaUVycm9yIT1TT0NLRVRfRVJST1IpCisJfQkJCS8vIGVuZCBvZiBmb3IoOzspCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJY29tcGxldGVfYW5kX2V4aXQoJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFN0YXR1c3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU3RhdHVzdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWY5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFN0YXR1c3UuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBTdGF0dXN1LU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFN0YXR1c3UuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFN0YXR1c3UuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPHh4eHh4PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFN0YXR1c3VDYlJlc3BvbnNlIG1fYXBmbkNiUmVzcG9uc2VbMjU0XTsKKworfSB0RXBsU3RhdHVzdUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxTdGF0dXN1SW5zdGFuY2UgRXBsU3RhdHVzdUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUNiU3RhdHVzUmVzcG9uc2UodEVwbEZyYW1lSW5mbyAqCisJCQkJCQkgICAgcEZyYW1lSW5mb19wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxTdGF0dXN1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IG90aGVyIGluc3RhbmNlcyBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbFN0YXR1c3VJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsU3RhdHVzdUluc3RhbmNlX2cpKTsKKworCS8vIHJlZ2lzdGVyIFN0YXR1c1Jlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UsCisJCQkJICAgICBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZSwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyQW55KTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBkZXJlZ2lzdGVyIFN0YXR1c1Jlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1UmVzZXQKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzZXRzIHRoaXMgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdVJlc2V0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsU3RhdHVzdUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxTdGF0dXN1SW5zdGFuY2VfZykpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIFN0YXR1c1Jlc3BvbnNlIGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgICAgICA9IElOOiBub2RlIElECisvLyAgICAgICAgICAgICAgcGZuQ2JSZXNwb25zZV9wICAgICAgICAgICAgID0gSU46IGZ1bmN0aW9uIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGNhbGxlZCBpZiBTdGF0dXNSZXNwb25zZSBpcyByZWNlaXZlZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICB0RXBsU3RhdHVzdUNiUmVzcG9uc2UKKwkJCQkJCSAgcGZuQ2JSZXNwb25zZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBkZWNyZW1lbnQgbm9kZSBJRCwgYmVjYXVzZSBhcnJheSBpcyB6ZXJvIGJhc2VkCisJdWlOb2RlSWRfcC0tOworCWlmICh1aU5vZGVJZF9wIDwgdGFiZW50cmllcyhFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQlpZiAoRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aU5vZGVJZF9wXSAhPSBOVUxMKSB7CS8vIHJlcXVlc3QgYWxyZWFkeSBpc3N1ZWQgKG1heWJlIGJ5IHNvbWVvbmUgZWxzZSkKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQl9IGVsc2UgeworCQkJRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aU5vZGVJZF9wXSA9CisJCQkgICAgcGZuQ2JSZXNwb25zZV9wOworCQkJUmV0ID0KKwkJCSAgICBFcGxEbGx1Q2FsSXNzdWVSZXF1ZXN0KGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzLAorCQkJCQkJICAgKHVpTm9kZUlkX3AgKyAxKSwgMHhGRik7CisJCX0KKyNlbHNlCisJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworI2VuZGlmCisJfSBlbHNlIHsJCS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdUNiU3RhdHVzUmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIFN0YXR1c1Jlc3BvbnNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBGcmFtZSB3aXRoIHRoZSBTdGF0dXNSZXNwb25zZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUNiU3RhdHVzUmVzcG9uc2UodEVwbEZyYW1lSW5mbyAqCisJCQkJCQkgICAgcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCXVuc2lnbmVkIGludCB1aUluZGV4OworCXRFcGxTdGF0dXN1Q2JSZXNwb25zZSBwZm5DYlJlc3BvbnNlOworCisJdWlOb2RlSWQgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJdWlJbmRleCA9IHVpTm9kZUlkIC0gMTsKKworCWlmICh1aUluZGV4IDwgdGFiZW50cmllcyhFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworCQkvLyBtZW1vcml6ZSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisJCXBmbkNiUmVzcG9uc2UgPSBFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpSW5kZXhdOworCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gcmVzZXQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBzbyB0aGF0IGNhbGxlciBtYXkgaXNzdWUgbmV4dCByZXF1ZXN0CisJCUVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF0gPSBOVUxMOworCisJCWlmIChwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgPCBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVMpIHsJLy8gU3RhdHVzUmVzcG9uc2Ugbm90IHJlY2VpdmVkIG9yIGl0IGhhcyBpbnZhbGlkIHNpemUKKwkJCVJldCA9IHBmbkNiUmVzcG9uc2UodWlOb2RlSWQsIE5VTEwpOworCQl9IGVsc2UgewkvLyBTdGF0dXNSZXNwb25zZSByZWNlaXZlZAorCQkJUmV0ID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLAorCQkJCQkgICZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCSAgbV9Bc25kLm1fUGF5bG9hZC5tX1N0YXR1c1Jlc3BvbnNlKTsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGFyZ2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjY2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRhcmdldC5oCkBAIC0wLDAgKzEsMjMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB0YXJnZXQgYXBpIGZ1bmN0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGFyZ2V0LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8xMi8wNSAtYXM6ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMVEFSR0VUX0hfCisjZGVmaW5lIF9FUExUQVJHRVRfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNyb3MgZm9yIG1lbW9yeSBhY2Nlc3MgKGRlcGVuZHMgb24gdGFyZ2V0IHN5c3RlbSkKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gTk9URToKKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbWJpbmUgc3RhbmRhcmQgbGlicmFyeSBkZWZpbml0aW9ucy4gU29tZQorLy8gYXBwbGljYXRpb25zIG5lZWRzIHRvIHVzZSBvbmUgY29tbW9uIGxpYnJhcnkgZnVuY3Rpb24gKGUuZy4gbWVtY3B5KCkpLiBTbworLy8geW91IGNhbiBzZXQgKG9yIGNoYW5nZSkgaXQgaGVyZS4KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisKKyNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDAxCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAgIDB4MDQwMAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworICAgIC8vMjkuMTEuMjAwNCBmLmouIHNvbnN0IGlzdCBtZW1jcHkgdW5kIG1lbXNldCB1bmJla2FubnQKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBFUExfTUVNQ1BZKGRzdCxzcmMsc2l6KSAgICAgbWVtY3B5KCh2b2lkKikoZHN0KSwoY29uc3Qgdm9pZCopKHNyYyksKHNpemVfdCkoc2l6KSk7CisjZGVmaW5lIEVQTF9NRU1TRVQoZHN0LHZhbCxzaXopICAgICBtZW1zZXQoKHZvaWQqKShkc3QpLChpbnQpKHZhbCksKHNpemVfdCkoc2l6KSk7CisKKyAgICAvLyBmLmouOiBkaWUgRnVua3Rpb25lbiBm/HIgPE1lbUFsbG9jPiB1bmQgPE1lbUZyZWU+IHNpbmQgaW4gV2luTWVtLmMgZGVmaW5pZXJ0CisgICAgLy9kZWZpbml0aW9uIGRlciBQcm90b3R5cGVuCit2b2lkIEZBUiAqTWVtQWxsb2MoRFdPUkQgZHdNZW1TaXplX3ApOwordm9pZCBNZW1GcmVlKHZvaWQgRkFSICogcE1lbV9wKTsKKworI2RlZmluZSBFUExfTUFMTE9DKHNpeikgICAgICAgICAgICAgbWFsbG9jKChzaXplX3QpKHNpeikpCisjZGVmaW5lIEVQTF9GUkVFKHB0cikgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopcHRyKQorCisjaWZuZGVmIFBSSU5URjAKK3ZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UKKyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFRSQUNFMChhcmcpCisjZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBUUkFDRTEoYXJnLHAxKQorI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgVFJBQ0UyKGFyZyxwMSxwMikKKyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFRSQUNFMyhhcmcscDEscDIscDMpCisjZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoYXJnLHAxLHAyLHAzLHA0KQorCS8vI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmCisJLy8jZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBQUklOVEYoYXJnKQorCS8vI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgUFJJTlRGKGFyZyxwMSkKKwkvLyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFBSSU5URihhcmcscDEscDIpCisJLy8jZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBQUklOVEYoYXJnLHAxLHAyLHAzKQorCS8vI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgUFJJTlRGKGFyZyxwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWZkZWYgQVNTRVJUTVNHCisjdW5kZWYgQVNTRVJUTVNHCisjZW5kaWYKKworI2RlZmluZSBBU1NFUlRNU0coZXhwcixzdHJpbmcpICBpZiAoIShleHByKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgc3RyaW5nLCAiQXNzZXJ0aW9uIGZhaWxlZCIsIE1CX09LIHwgTUJfSUNPTkVSUk9SKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKC0xKTt9CisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9OT19PU18pCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisgICAgLy8yOS4xMS4yMDA0IGYuai4gc29uc3QgaXN0IG1lbWNweSB1bmQgbWVtc2V0IHVuYmVrYW5udAorLy8gICAgI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEVQTF9NRU1DUFkoZHN0LHNyYyxzaXopICAgICBtZW1jcHkoKHZvaWQqKShkc3QpLChjb25zdCB2b2lkKikoc3JjKSwoc2l6ZV90KShzaXopKTsKKyNkZWZpbmUgRVBMX01FTVNFVChkc3QsdmFsLHNpeikgICAgIG1lbXNldCgodm9pZCopKGRzdCksKGludCkodmFsKSwoc2l6ZV90KShzaXopKTsKKworI2RlZmluZSBFUExfTUFMTE9DKHNpeikgICAgICAgICAgICAgbWFsbG9jKChzaXplX3QpKHNpeikpCisjZGVmaW5lIEVQTF9GUkVFKHB0cikgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopcHRyKQorCisjaWZuZGVmIFBSSU5URjAKKyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIFRSQUNFCisjZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBUUkFDRTAoYXJnKQorI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgVFJBQ0UxKGFyZyxwMSkKKyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFRSQUNFMihhcmcscDEscDIpCisjZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoYXJnLHAxLHAyLHAzKQorI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgVFJBQ0U0KGFyZyxwMSxwMixwMyxwNCkKKwkvLyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIHByaW50ZgorCS8vI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgUFJJTlRGKGFyZykKKwkvLyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFBSSU5URihhcmcscDEpCisJLy8jZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBQUklOVEYoYXJnLHAxLHAyKQorCS8vI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgUFJJTlRGKGFyZyxwMSxwMixwMykKKwkvLyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFBSSU5URihhcmcscDEscDIscDMscDQpCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykKKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbHNlCisvLyAgICAgICAgI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2VuZGlmCisKKyAgICAvLzI5LjExLjIwMDQgZi5qLiBzb25zdCBpc3QgbWVtY3B5IHVuZCBtZW1zZXQgdW5iZWthbm50CisvLyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgRVBMX01FTUNQWShkc3Qsc3JjLHNpeikgICAgIG1lbWNweSgodm9pZCopKGRzdCksKGNvbnN0IHZvaWQqKShzcmMpLChzaXplX3QpKHNpeikpOworI2RlZmluZSBFUExfTUVNU0VUKGRzdCx2YWwsc2l6KSAgICAgbWVtc2V0KCh2b2lkKikoZHN0KSwoaW50KSh2YWwpLChzaXplX3QpKHNpeikpOworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgRVBMX01BTExPQyhzaXopICAgICAgICAgICAgIG1hbGxvYygoc2l6ZV90KShzaXopKQorI2RlZmluZSBFUExfRlJFRShwdHIpICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKXB0cikKKyNlbHNlCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBrbWFsbG9jKChzaXplX3QpKHNpeiksIEdGUF9LRVJORUwpCisjZGVmaW5lIEVQTF9GUkVFKHB0cikgICAgICAgICAgICAgICBrZnJlZSgodm9pZCAqKXB0cikKKyNlbmRpZgorCisjaWZuZGVmIFBSSU5URjAKKyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIFRSQUNFCisjZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBUUkFDRTAoYXJnKQorI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgVFJBQ0UxKGFyZyxwMSkKKyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFRSQUNFMihhcmcscDEscDIpCisjZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoYXJnLHAxLHAyLHAzKQorI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgVFJBQ0U0KGFyZyxwMSxwMixwMyxwNCkKKwkvLyNkZWZpbmUgUFJJTlRGICAgICAgICAgICAgICAgICAgICAgIHByaW50ZgorCS8vI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgUFJJTlRGKGFyZykKKwkvLyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFBSSU5URihhcmcscDEpCisJLy8jZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBQUklOVEYoYXJnLHAxLHAyKQorCS8vI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgUFJJTlRGKGFyZyxwMSxwMixwMykKKwkvLyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFBSSU5URihhcmcscDEscDIscDMscDQpCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgRVBMX1RHVF9JTlRNQVNLX0VUSCAgICAgMHgwMDAxCS8vIGV0aGVybmV0IGludGVycnVwdAorI2RlZmluZSBFUExfVEdUX0lOVE1BU0tfRE1BICAgICAweDAwMDIJLy8gRE1BIGludGVycnVwdAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGN1cnJlbnRseSBubyBUaW1lciBmdW5jdGlvbnMgYXJlIG5lZWRlZCBieSBFUEwgc3RhY2sKKy8vIHNvIHRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKy8vdm9pZCAgUFVCTElDIFRndFRpbWVySW5pdCh2b2lkKTsKKy8vRFdPUkQgUFVCTElDIFRndEdldFRpY2tDb3VudCh2b2lkKTsKKy8vdm9pZCBQVUJMSUMgVGd0R2V0TmV0VGltZSh0RXBsTmV0VGltZSAqIHBOZXRUaW1lX3ApOworCisvLyBmdW5jdGlvbnMgZm9yIGV0aGVybmV0IGRyaXZlcgordEVwbEtlcm5lbCBQVUJMSUMgVGd0SW5pdEV0aElzcih2b2lkKTsKK3ZvaWQgUFVCTElDIFRndEZyZWVFdGhJc3Iodm9pZCk7Cit2b2lkIFBVQkxJQyBUZ3RFbmFibGVHbG9iYWxJbnRlcnJ1cHQoQllURSBmRW5hYmxlX3ApOwordm9pZCBQVUJMSUMgVGd0RW5hYmxlRXRoSW50ZXJydXB0MChCWVRFIGZFbmFibGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbnRlcnJ1cHRNYXNrX3ApOwordm9pZCBQVUJMSUMgVGd0RW5hYmxlRXRoSW50ZXJydXB0MShCWVRFIGZFbmFibGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbnRlcnJ1cHRNYXNrX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVEFSR0VUX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjYmZkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXIuaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRXBsIFRpbWVyLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVyLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsRXZlbnQuaCIKKworI2lmbmRlZiBfRVBMVElNRVJfSF8KKyNkZWZpbmUgX0VQTFRJTUVSX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdHlwZSBmb3IgdGltZXIgaGFuZGxlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdEVwbFRpbWVySGRsOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEV2ZW50U2luayBtX0V2ZW50U2luazsKKwl1bnNpZ25lZCBsb25nIG1fdWxBcmc7CS8vIGQuay46IGNvbnZlcnRlZCB0byB1bnNpZ25lZCBsb25nIGJlY2F1c2UKKwkvLyBpdCBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHBvaW50ZXIgYnkgdGhlCisJLy8gdGltZXIgbW9kdWxlIGFuZCB0aGUgZGF0YSB0aGUKKwkvLyBwb2ludGVyIHBvaW50cyB0byBpcyBub3Qgc2F2ZWQgaW4gYW55IHdheS4KKwkvLyBJdCBpcyBqdXN0IGEgdmFsdWUuIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlCisJLy8gdG8gc3RvcmUgdGhlIGRhdGEgc3RhdGljYWxseSBhbmQgY29udmVydAorCS8vIHRoZSBwb2ludGVyIGJldHdlZW4gYWRkcmVzcyBzcGFjZXMuCisKK30gdEVwbFRpbWVyQXJnOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGw7CisJdW5zaWduZWQgbG9uZyBtX3VsQXJnOwkvLyBkLmsuOiBjb252ZXJ0ZWQgdG8gdW5zaWduZWQgbG9uZyBiZWNhdXNlCisJLy8gaXQgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBwb2ludGVyIGJ5IHRoZQorCS8vIHRpbWVyIG1vZHVsZSBhbmQgdGhlIGRhdGEgdGhlCisJLy8gcG9pbnRlciBwb2ludHMgdG8gaXMgbm90IHNhdmVkIGluIGFueSB3YXkuCisJLy8gSXQgaXMganVzdCBhIHZhbHVlLgorCit9IHRFcGxUaW1lckV2ZW50QXJnOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFRpbWVya0NhbGxiYWNrKSAodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJIHBFdmVudEFyZ19wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExUSU1FUl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVMaW51eEtlcm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVMaW51eEtlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODIwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydUxpbnV4S2VybmVsLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRVBMIFVzZXIgVGltZXJtb2R1bGUgZm9yIExpbnV4IGtlcm5lbCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnVMaW51eEtlcm5lbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxUaW1lcnUuaCIKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB0aW1lcl9saXN0IG1fVGltZXI7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJndW1lbnQ7CisKK30gdEVwbFRpbWVydURhdGE7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgUFVCTElDIEVwbFRpbWVydUNiTXModW5zaWduZWQgbG9uZyB1bFBhcmFtZXRlcl9wKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgTGludXggS2VybmVsPiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgTGludXggS2VybmVsCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRzIGZpcnN0IGluc3RhbmNlCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFRpbWVydUFkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0cyBhZGRpdGlvbmFsIGluc3RhbmNlCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgaW5zdGFuY2UKKy8vICAgICAgICAgICAgICAtPiB1bmRlciBMaW51eCBub3RoaW5nIHRvIGRvCisvLyAgICAgICAgICAgICAgLT4gbm8gaW5zdGFuY2UgdGFibGUgbmVlZGVkCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY3JlYXRlcyBhIHRpbWVyIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1U2V0VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCSAgICAgIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCisJLy8gY2hlY2sgcG9pbnRlciB0byBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgRVBMX01BTExPQyhzaXplb2YodEVwbFRpbWVydURhdGEpKTsKKwlpZiAocERhdGEgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWluaXRfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKwlwRGF0YS0+bV9UaW1lci5mdW5jdGlvbiA9IEVwbFRpbWVydUNiTXM7CisJcERhdGEtPm1fVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBEYXRhOworCXBEYXRhLT5tX1RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdWxUaW1lX3AgKiBIWiAvIDEwMDA7CisKKwlFUExfTUVNQ1BZKCZwRGF0YS0+VGltZXJBcmd1bWVudCwgJkFyZ3VtZW50X3AsIHNpemVvZih0RXBsVGltZXJBcmcpKTsKKworCWFkZF90aW1lcigmcERhdGEtPm1fVGltZXIpOworCisJKnBUaW1lckhkbF9wID0gKHRFcGxUaW1lckhkbCkgcERhdGE7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjaGFuZ2VzIGEgdGltZXIgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCisJLy8gY2hlY2sgcG9pbnRlciB0byBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGhhbmRsZSBpdHNlbGYsIGkuZS4gd2FzIHRoZSBoYW5kbGUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJaWYgKCpwVGltZXJIZGxfcCA9PSAwKSB7CisJCVJldCA9IEVwbFRpbWVydVNldFRpbWVyTXMocFRpbWVySGRsX3AsIHVsVGltZV9wLCBBcmd1bWVudF9wKTsKKwkJZ290byBFeGl0OworCX0KKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSAqIHBUaW1lckhkbF9wOworCWlmICgodEVwbFRpbWVydURhdGEgKikgcERhdGEtPm1fVGltZXIuZGF0YSAhPSBwRGF0YSkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJbW9kX3RpbWVyKCZwRGF0YS0+bV9UaW1lciwgKGppZmZpZXMgKyB1bFRpbWVfcCAqIEhaIC8gMTAwMCkpOworCisJLy8gY29weSB0aGUgVGltZXJBcmcgYWZ0ZXIgdGhlIHRpbWVyIGlzIHJlc3RhcnRlZCwKKwkvLyBzbyB0aGF0IGEgdGltZXIgb2NjdXJlZCBpbW1lZGlhdGVseSBiZWZvcmUgbW9kX3RpbWVyCisJLy8gd29uJ3QgdXNlIHRoZSBuZXcgVGltZXJBcmcgYW5kCisJLy8gdGhlcmVmb3JlIHRoZSBvbGQgdGltZXIgY2Fubm90IGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgbmV3IG9uZS4KKwkvLyBCdXQgaWYgdGhlIG5ldyB0aW1lciBpcyB0b28gZmFzdCwgaXQgbWF5IGdldCBsb3N0LgorCUVQTF9NRU1DUFkoJnBEYXRhLT5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCisJLy8gY2hlY2sgaWYgdGltZXIgaXMgcmVhbGx5IHJ1bm5pbmcKKwlpZiAodGltZXJfcGVuZGluZygmcERhdGEtPm1fVGltZXIpID09IDApIHsJLy8gdGltZXIgaXMgbm90IHJ1bm5pbmcKKwkJLy8gcmV0cnkgc3RhcnRpbmcgaXQKKwkJYWRkX3RpbWVyKCZwRGF0YS0+bV9UaW1lcik7CisJfQorCS8vIHNldCBoYW5kbGUgdG8gcG9pbnRlciBvZiB0RXBsVGltZXJ1RGF0YQorLy8gICAgKnBUaW1lckhkbF9wID0gKHRFcGxUaW1lckhkbCkgcERhdGE7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsZXRlVGltZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlcyBhIHRpbWVyCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBoYW5kbGUgaXRzZWxmLCBpLmUuIHdhcyB0aGUgaGFuZGxlIGluaXRpYWxpemVkIGJlZm9yZQorCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgeworCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJZ290byBFeGl0OworCX0KKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSAqIHBUaW1lckhkbF9wOworCWlmICgodEVwbFRpbWVydURhdGEgKikgcERhdGEtPm1fVGltZXIuZGF0YSAhPSBwRGF0YSkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisvKiAgICBpZiAoZGVsX3RpbWVyKCZwRGF0YS0+bV9UaW1lcikgPT0gMSkKKyAgICB7CisgICAgICAgIGtmcmVlKHBEYXRhKTsKKyAgICB9CisqLworCS8vIHRyeSB0byBkZWxldGUgdGhlIHRpbWVyCisJZGVsX3RpbWVyKCZwRGF0YS0+bV9UaW1lcik7CisJLy8gZnJlZSBtZW1vcnkgaW4gYW55IGNhc2UKKwlrZnJlZShwRGF0YSk7CisKKwkvLyB1bmluaXRpYWxpemUgaGFuZGxlCisJKnBUaW1lckhkbF9wID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUlzVGltZXJBY3RpdmUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIGlmIHRoZSB0aW1lciByZWZlcmVuY2VkIGJ5IHRoZSBoYW5kbGUgaXMgY3VycmVudGx5CisvLyAgICAgICAgICAgICAgYWN0aXZlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBUaW1lckhkbF9wICA9IGhhbmRsZSBvZiB0aGUgdGltZXIgdG8gY2hlY2sKKy8vCisvLyBSZXR1cm5zOiAgICAgQk9PTCAgICAgICAgPSBUUlVFLCBpZiBhY3RpdmU7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQk9PTCBQVUJMSUMgRXBsVGltZXJ1SXNUaW1lckFjdGl2ZSh0RXBsVGltZXJIZGwgVGltZXJIZGxfcCkKK3sKKwlCT09MIGZBY3RpdmUgPSBGQUxTRTsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBoYW5kbGUgaXRzZWxmLCBpLmUuIHdhcyB0aGUgaGFuZGxlIGluaXRpYWxpemVkIGJlZm9yZQorCWlmIChUaW1lckhkbF9wID09IDApIHsJLy8gdGltZXIgd2FzIG5vdCBjcmVhdGVkIHlldCwgc28gaXQgaXMgbm90IGFjdGl2ZQorCQlnb3RvIEV4aXQ7CisJfQorCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopIFRpbWVySGRsX3A7CisJaWYgKCh0RXBsVGltZXJ1RGF0YSAqKSBwRGF0YS0+bV9UaW1lci5kYXRhICE9IHBEYXRhKSB7CS8vIGludmFsaWQgdGltZXIKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBpZiB0aW1lciBpcyBydW5uaW5nCisJaWYgKHRpbWVyX3BlbmRpbmcoJnBEYXRhLT5tX1RpbWVyKSA9PSAwKSB7CS8vIHRpbWVyIGlzIG5vdCBydW5uaW5nCisJCWdvdG8gRXhpdDsKKwl9CisKKwlmQWN0aXZlID0gVFJVRTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gZkFjdGl2ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUNiTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gcHJvY2VzcyB0aW1lcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBzdHJ1Y3R1ciBvZiB0eXBlIHRFcGxUaW1lcnVEYXRhCisvLworLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIFBVQkxJQyBFcGxUaW1lcnVDYk1zKHVuc2lnbmVkIGxvbmcgdWxQYXJhbWV0ZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisJdEVwbFRpbWVyRXZlbnRBcmcgVGltZXJFdmVudEFyZzsKKworCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopIHVsUGFyYW1ldGVyX3A7CisKKwkvLyBjYWxsIGV2ZW50IGZ1bmN0aW9uCisJVGltZXJFdmVudEFyZy5tX1RpbWVySGRsID0gKHRFcGxUaW1lckhkbCkgcERhdGE7CisJVGltZXJFdmVudEFyZy5tX3VsQXJnID0gcERhdGEtPlRpbWVyQXJndW1lbnQubV91bEFyZzsKKworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0gcERhdGEtPlRpbWVyQXJndW1lbnQubV9FdmVudFNpbms7CisJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlVGltZXI7CisJRVBMX01FTVNFVCgmRXBsRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YodEVwbE5ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3BBcmcgPSAmVGltZXJFdmVudEFyZzsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihUaW1lckV2ZW50QXJnKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkVwbEV2ZW50KTsKKworCS8vIGQuay4gZG8gbm90IGZyZWUgbWVtb3J5LCB1c2VyIGhhcyB0byBjYWxsIEVwbFRpbWVydURlbGV0ZVRpbWVyKCkKKwkvL2tmcmVlKHBEYXRhKTsKKworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TnVsbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVOdWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjZTQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TnVsbC5jCkBAIC0wLDAgKzEsMzEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgTlVMTC1JbXBsZW1lbnRhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVydU51bGwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIE5VTEwtSW1wbGVtZW50YXRpb24+ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIE5VTEwtSW1wbGVtZW50YXRpb24KKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdCBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFRpbWVydUFkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBpbnN0YW5jZQorLy8gICAgICAgICAgICAgIC0+IHVuZGVyIFdpbjMyIG5vdGhpbmcgdG8gZG8KKy8vICAgICAgICAgICAgICAtPiBubyBpbnN0bmFjZSB0YWJsZSBuZWVkZWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVTZXRUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNyZWF0ZSBhIHRpbWVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIHBvaW50ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1U2V0VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCSAgICAgIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoYW5nZSBhIHRpbWVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIHBvaW50ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJCSB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsZXRlVGltZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsdGUgYSB0aW1lcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgaGFuZGxlIGludmFsaWRlCisJKnBUaW1lckhkbF9wID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1V2luMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1V2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY3YjRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVXaW4zMi5jCkBAIC0wLDAgKzEsNTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgZm9yIFdpbjMyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJ1V2luMzIuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxUaW1lckFyZyBUaW1lckFyZ3VtZW50OworCUhBTkRMRSBEZWx0ZUhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHVsVGltZW91dDsKKworfSB0RXBsVGltZXJ1VGhyZWFkOworCit0eXBlZGVmIHN0cnVjdCB7CisJTFBDUklUSUNBTF9TRUNUSU9OIG1fcENyaXRpY2FsU2VjdGlvbjsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uOworfSB0RXBsVGltZXJ1SW5zdGFuY2U7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxUaW1lcnVJbnN0YW5jZSBFcGxUaW1lcnVJbnN0YW5jZV9nOworc3RhdGljIHRFcGxUaW1lcnVUaHJlYWQgVGhyZWFkRGF0YV9sOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEV09SRCBQVUJMSUMgRXBsU2RvVGltZXJ1VGhyZWFkbXMoTFBWT0lEIGxwUGFyYW1ldGVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgV2luMzI+ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgV2luMzIKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdCBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFRpbWVydUFkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGFkZGl0aW9uYWwgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbgorCUVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJkVwbFRpbWVydUluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb247CisJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBpbnN0YW5jZQorLy8gICAgICAgICAgICAgIC0+IHVuZGVyIFdpbjMyIG5vdGhpbmcgdG8gZG8KKy8vICAgICAgICAgICAgICAtPiBubyBpbnN0bmFjZSB0YWJsZSBuZWVkZWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVTZXRUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNyZWF0ZSBhIHRpbWVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIHBvaW50ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1U2V0VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCSAgICAgIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUhBTkRMRSBEZWxldGVIYW5kbGU7CisJSEFORExFIFRocmVhZEhhbmRsZTsKKwlEV09SRCBUaHJlYWRJZDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCS8vIGZpcnN0IGNyZWF0ZSBldmVudCB0byBkZWxldGUgdGltZXIKKwlEZWxldGVIYW5kbGUgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworCWlmIChEZWxldGVIYW5kbGUgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgaGFuZGxlIGZvciBjYWxsZXIKKwkqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBEZWxldGVIYW5kbGU7CisKKwkvLyBmaWxsIGRhdGEgZm9yIHRocmVhZAorCVRocmVhZERhdGFfbC5EZWx0ZUhhbmRsZSA9IERlbGV0ZUhhbmRsZTsKKwlFUExfTUVNQ1BZKCZUaHJlYWREYXRhX2wuVGltZXJBcmd1bWVudCwgJkFyZ3VtZW50X3AsCisJCSAgIHNpemVvZih0RXBsVGltZXJBcmcpKTsKKwlUaHJlYWREYXRhX2wudWxUaW1lb3V0ID0gdWxUaW1lX3A7CisKKwkvLyBjcmVhdGUgdGhyZWFkIHRvIGNyZWF0ZSB3YWl0YWJsZSB0aW1lciBhbmQgd2FpdCBmb3IgdGltZXIKKwlUaHJlYWRIYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwKKwkJCQkgICAgMCwKKwkJCQkgICAgRXBsU2RvVGltZXJ1VGhyZWFkbXMsCisJCQkJICAgICZUaHJlYWREYXRhX2wsIDAsICZUaHJlYWRJZCk7CisJaWYgKFRocmVhZEhhbmRsZSA9PSBOVUxMKSB7CisJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwkJTGVhdmVDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJCS8vIGRlbHRlIGhhbmRsZQorCQlDbG9zZUhhbmRsZShEZWxldGVIYW5kbGUpOworCisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoYW5nZSBhIHRpbWVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIHBvaW50ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCA9IHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gZmlsbCBpbiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxUaW1lX3AgICAgPSB0aW1lIGZvciB0aW1lciBpbiBtcworLy8gICAgICAgICAgICAgIEFyZ3VtZW50X3AgID0gYXJndW1lbnQgZm9yIHRpbWVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJCSB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlIQU5ETEUgRGVsZXRlSGFuZGxlOworCUhBTkRMRSBUaHJlYWRIYW5kbGU7CisJRFdPUkQgVGhyZWFkSWQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlEZWxldGVIYW5kbGUgPSAoSEFORExFKSAoKnBUaW1lckhkbF9wKTsKKworCS8vIHNldCBldmVudCB0byBlbmQgdGltZXIgdGFzayBmb3IgdGhpcyB0aW1lcgorCVNldEV2ZW50KERlbGV0ZUhhbmRsZSk7CisKKwkvLyBjcmVhdGUgbmV3IHRpbWVyCisJLy8gZmlyc3QgY3JlYXRlIGV2ZW50IHRvIGRlbGV0ZSB0aW1lcgorCURlbGV0ZUhhbmRsZSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisJaWYgKERlbGV0ZUhhbmRsZSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCBoYW5kbGUgZm9yIGNhbGxlcgorCSpwVGltZXJIZGxfcCA9ICh0RXBsVGltZXJIZGwpIERlbGV0ZUhhbmRsZTsKKworCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJLy8gZmlsbCBkYXRhIGZvciB0aHJlYWQKKwlUaHJlYWREYXRhX2wuRGVsdGVIYW5kbGUgPSBEZWxldGVIYW5kbGU7CisJRVBMX01FTUNQWSgmVGhyZWFkRGF0YV9sLlRpbWVyQXJndW1lbnQsICZBcmd1bWVudF9wLAorCQkgICBzaXplb2YodEVwbFRpbWVyQXJnKSk7CisJVGhyZWFkRGF0YV9sLnVsVGltZW91dCA9IHVsVGltZV9wOworCisJLy8gY3JlYXRlIHRocmVhZCB0byBjcmVhdGUgd2FpdGFibGUgdGltZXIgYW5kIHdhaXQgZm9yIHRpbWVyCisJVGhyZWFkSGFuZGxlID0gQ3JlYXRlVGhyZWFkKE5VTEwsCisJCQkJICAgIDAsCisJCQkJICAgIEVwbFNkb1RpbWVydVRocmVhZG1zLAorCQkJCSAgICAmVGhyZWFkRGF0YV9sLCAwLCAmVGhyZWFkSWQpOworCWlmIChUaHJlYWRIYW5kbGUgPT0gTlVMTCkgeworCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uCisJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCQkvLyBkZWx0ZSBoYW5kbGUKKworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsZXRlVGltZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsdGUgYSB0aW1lcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxldGVUaW1lcih0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlIQU5ETEUgRGVsZXRlSGFuZGxlOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisJRGVsZXRlSGFuZGxlID0gKEhBTkRMRSkgKCpwVGltZXJIZGxfcCk7CisKKwkvLyBzZXQgZXZlbnQgdG8gZW5kIHRpbWVyIHRhc2sgZm9yIHRoaXMgdGltZXIKKwlTZXRFdmVudChEZWxldGVIYW5kbGUpOworCisJLy8gc2V0IGhhbmRsZSBpbnZhbGlkZQorCSpwVGltZXJIZGxfcCA9IDA7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVGltZXJ1VGhyZWFkbXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gcHJvY2VzcyB0aW1lciBhcyB0aHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBscFBhcmFtZXRlciA9IHBvaW50ZXIgdG8gc3RydWN0dXIgb2YgdHlwZSB0RXBsVGltZXJ1VGhyZWFkCisvLworLy8KKy8vIFJldHVybnM6ICAgICBEV09SRCA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRFdPUkQgUFVCTElDIEVwbFNkb1RpbWVydVRocmVhZG1zKExQVk9JRCBscFBhcmFtZXRlcikKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsVGltZXJ1VGhyZWFkICpwVGhyZWFkRGF0YTsKKwlIQU5ETEUgYUhhbmRsZXNbMl07CisJQk9PTCBmUmV0dXJuOworCUxBUkdFX0lOVEVHRVIgVGltZW91dFRpbWU7CisJdW5zaWduZWQgbG9uZyB1bEV2ZW50OworCXRFcGxFdmVudCBFcGxFdmVudDsKKwl0RXBsVGltZXJ1VGhyZWFkIFRocmVhZERhdGE7CisJdEVwbFRpbWVyRXZlbnRBcmcgVGltZXJFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gZGF0YQorCXBUaHJlYWREYXRhID0gKHRFcGxUaW1lcnVUaHJlYWQgKikgbHBQYXJhbWV0ZXI7CisJLy8gY29weSB0aHJlYWQgZGF0YQorCUVQTF9NRU1DUFkoJlRocmVhZERhdGEsIHBUaHJlYWREYXRhLCBzaXplb2YoVGhyZWFkRGF0YSkpOworCXBUaHJlYWREYXRhID0gJlRocmVhZERhdGE7CisKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uCisJTGVhdmVDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJLy8gY3JlYXRlIHdhaXRhYmxlIHRpbWVyCisJYUhhbmRsZXNbMV0gPSBDcmVhdGVXYWl0YWJsZVRpbWVyKE5VTEwsIEZBTFNFLCBOVUxMKTsKKwlpZiAoYUhhbmRsZXNbMV0gPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZXQgdGltZXIKKwkvLyBzZXQgdGltZW91dCBpbnRlcnZhbCAtPiBuZWVkZWQgdG8gYmUgbmVnYXRpdgorCS8vIC0+IGJlY2F1c2UgcmVsYXRpdmUgdGltZW91dAorCS8vIC0+IG11bHRpcGx5IGJ5IDEwMDAwIGZvciAxMDAgbnMgdGltZWJhc2Ugb2YgZnVuY3Rpb24KKwlUaW1lb3V0VGltZS5RdWFkUGFydCA9ICgoKGxvbmcgbG9uZylwVGhyZWFkRGF0YS0+dWxUaW1lb3V0KSAqIC0xMDAwMCk7CisJZlJldHVybiA9IFNldFdhaXRhYmxlVGltZXIoYUhhbmRsZXNbMV0sCisJCQkJICAgJlRpbWVvdXRUaW1lLCAwLCBOVUxMLCBOVUxMLCBGQUxTRSk7CisJaWYgKGZSZXR1cm4gPT0gMCkgeworCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIGRlbHRlIGV2ZW50IGhhbmRsZSBpbiBoYW5kbGUgYXJyYXkKKwlhSGFuZGxlc1swXSA9IHBUaHJlYWREYXRhLT5EZWx0ZUhhbmRsZTsKKworCS8vIHdhaXQgZm9yIG9uZSBvZiB0aGUgZXZlbnRzCisJdWxFdmVudCA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwgJmFIYW5kbGVzWzBdLCBGQUxTRSwgSU5GSU5JVEUpOworCWlmICh1bEV2ZW50ID09IFdBSVRfT0JKRUNUXzApIHsJLy8gZGVsdGUgZXZlbnQKKworCQkvLyBjbG9zZSBoYW5kZWxzCisJCUNsb3NlSGFuZGxlKGFIYW5kbGVzWzFdKTsKKwkJLy8gdGVybWluYXRlIHRocmVhZAorCQlnb3RvIEV4aXQ7CisJfSBlbHNlIGlmICh1bEV2ZW50ID09IChXQUlUX09CSkVDVF8wICsgMSkpIHsJLy8gdGltZXIgZXZlbnQKKwkJLy8gY2FsbCBldmVudCBmdW5jdGlvbgorCQlUaW1lckV2ZW50QXJnLm1fVGltZXJIZGwgPQorCQkgICAgKHRFcGxUaW1lckhkbCkgcFRocmVhZERhdGEtPkRlbHRlSGFuZGxlOworCQlUaW1lckV2ZW50QXJnLm1fdWxBcmcgPSBwVGhyZWFkRGF0YS0+VGltZXJBcmd1bWVudC5tX3VsQXJnOworCisJCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0gcFRocmVhZERhdGEtPlRpbWVyQXJndW1lbnQubV9FdmVudFNpbms7CisJCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVRpbWVyOworCQlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZih0RXBsTmV0VGltZSkpOworCQlFcGxFdmVudC5tX3BBcmcgPSAmVGltZXJFdmVudEFyZzsKKwkJRXBsRXZlbnQubV91aVNpemUgPSBzaXplb2YoVGltZXJFdmVudEFyZyk7CisKKwkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJCS8vIGNsb3NlIGhhbmRlbHMKKwkJQ2xvc2VIYW5kbGUoYUhhbmRsZXNbMV0pOworCQkvLyB0ZXJtaW5hdGUgdGhyZWFkCisJCWdvdG8gRXhpdDsKKworCX0gZWxzZSB7CQkvLyBlcnJvcgorCQl1bEV2ZW50ID0gR2V0TGFzdEVycm9yKCk7CisJCVRSQUNFMSgiRXJyb3IgaW4gV2FpdEZvck11bHRpcGxlT2JqZWN0cyBFcnJvcmNvZGU6IDB4JXhcbiIsCisJCSAgICAgICB1bEV2ZW50KTsKKwkJLy8gdGVybWluYXRlIHRocmVhZAorCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxWZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU3MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxWZXJzaW9uLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFUEwgdmVyc2lvbiBmb3IgdGhlIHN0YWNrLCBhcyBzdHJpbmcKKyAgICAgICAgICAgICAgICBhbmQgZm9yIG9iamVjdCAweDEwMTggd2l0aGluIG9iamVjdCBkaWN0aW9uYXJ5LgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFZlcnNpb24uaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgYWxsCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9WRVJTSU9OX0hfCisjZGVmaW5lIF9FUExfVkVSU0lPTl9IXworCisvLyBOT1RFOgorLy8gQWxsIHZlcnNpb24gbWFjcm9zIHNob3VsZCBjb250YWluIHRoZSBzYW1lIHZlcnNpb24gbnVtYmVyLiBCdXQgZG8gbm90IHVzZQorLy8gZGVmaW5lcyBpbnN0ZWFkIG9mIHRoZSBudW1iZXJzLiBCZWNhdXNlIHRoZSBtYWNybyBFUExfU1RSSU5HX1ZFUlNJT04oKSBjYW4gbm90CisvLyBjb252ZXJ0IGEgZGVmaW5lIHRvIGEgc3RyaW5nLgorLy8KKy8vIEZvcm1hdDogbWFqLm1pbi5idWlsZAorLy8gICAgICAgICBtYWogICAgICAgICAgICA9IG1ham9yIHZlcnNpb24KKy8vICAgICAgICAgICAgIG1pbiAgICAgICAgPSBtaW5vciB2ZXJzaW9uICh3aWxsIGJlIHNldCB0byAwIGlmIG1ham9yIHZlcnNpb24gd2lsbCBiZSBpbmNyZW1lbnRlZCkKKy8vICAgICAgICAgICAgICAgICBidWlsZCAgPSBjdXJyZW50IGJ1aWxkICh3aWxsIGJlIHNldCB0byAwIGlmIG1pbm9yIHZlcnNpb24gd2lsbCBiZSBpbmNyZW1lbnRlZCkKKy8vCisjZGVmaW5lIERFRklORURfU1RBQ0tfVkVSU0lPTiAgICAgICBFUExfU1RBQ0tfVkVSU0lPTiAgICgxLCAzLCAwKQorI2RlZmluZSBERUZJTkVEX09CSjEwMThfVkVSU0lPTiAgICAgRVBMX09CSjEwMThfVkVSU0lPTiAoMSwgMywgMCkKKyNkZWZpbmUgREVGSU5FRF9TVFJJTkdfVkVSU0lPTiAgICAgIEVQTF9TVFJJTkdfVkVSU0lPTiAgKDEsIDMsIDApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9QUk9EVUNUX05BTUUgICAgICAgICAgICAiRVBMIFYyIgorI2RlZmluZSBFUExfUFJPRFVDVF9WRVJTSU9OICAgICAgICAgREVGSU5FRF9TVFJJTkdfVkVSU0lPTgorI2RlZmluZSBFUExfUFJPRFVDVF9NQU5VRkFDVFVSRVIgICAgIlNZUyBURUMgZWxlY3Ryb25pYyBHbWJIIgorCisjZGVmaW5lIEVQTF9QUk9EVUNUX0tFWSAgICAgICAgICJTTy0xMDgzIgorI2RlZmluZSBFUExfUFJPRFVDVF9ERVNDUklQVElPTiAib3BlblBPV0VSTElOSyBQcm90b2NvbCBTdGFjayBTb3VyY2UiCisKKyNlbmRpZiAvLyBfRVBMX1ZFUlNJT05fSF8KKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5MzlkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBFUEwKKwl0cmlzdGF0ZSAib3BlblBPV0VSTElOSyBwcm90b2NvbCBzdGFjayIKKwlkZXBlbmRzIG9uIE5FVCAmJiBISUdIX1JFU19USU1FUlMgJiYgWDg2CisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBvcGVuUE9XRVJMSU5LIG5ldHdvcmsgcHJvdG9jb2wgc3RhY2suCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmM4MjQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9NYWtlZmlsZQpAQCAtMCwwICsxLDQxIEBACitvYmotJChDT05GSUdfRVBMKQkrPSBlcGwubworCitlcGwtb2JqcyA6PSAJXAorCUVwbEFwaUdlbmVyaWMubwkJXAorCUVwbEFwaUxpbnV4S2VybmVsLm8JXAorCUVwbEFwaVByb2Nlc3NJbWFnZS5vCVwKKwlFcGxEbGxrLm8JCVwKKwlFcGxEbGxrQ2FsLm8JCVwKKwlFcGxEbGx1Q2FsLm8JCVwKKwlFcGxFcnJvckhhbmRsZXJrLm8JXAorCUVwbEV2ZW50ay5vCQlcCisJRXBsRXZlbnR1Lm8JCVwKKwlFcGxJZGVudHUubwkJXAorCUVwbE5tdENudS5vCQlcCisJRXBsTm10ay5vCQlcCisJRXBsTm10a0NhbC5vCQlcCisJRXBsTm10TW51Lm8JCVwKKwlFcGxObXR1Lm8JCVwKKwlFcGxObXR1Q2FsLm8JCVwKKwlFcGxPYmQubwkJXAorCUVwbE9iZGtDYWwubwkJXAorCUVwbE9iZHUubwkJXAorCUVwbE9iZHVDYWwubwkJXAorCUVwbFBkb2subwkJXAorCUVwbFBkb2tDYWwubwkJXAorCUVwbFBkb3UubwkJXAorCUVwbFNkb0FzbmR1Lm8JCVwKKwlFcGxTZG9Bc3lTZXF1Lm8JCVwKKwlFcGxTZG9Db211Lm8JCVwKKwlFcGxTZG9VZHB1Lm8JCVwKKwlFcGxTdGF0dXN1Lm8JCVwKKwlFcGxUaW1lcnVMaW51eEtlcm5lbC5vCVwKKwlhbWl4ODYubwkJXAorCVNoYXJlZEJ1ZmYubwkJXAorCVNoYklwYy1MaW51eEtlcm5lbC5vCVwKKwlUaW1lckhpZ2hSZXNrWDg2Lm8JXAorCVZpcnR1YWxFdGhlcm5ldExpbnV4Lm8JXAorCVNvY2tldExpbnV4S2VybmVsLm8JXAorCXByb2NfZnMubwkJXAorCWRlbW9fbWFpbi5vCQlcCisJRWRydjgxMzkubwkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIwOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmMKQEAgLTAsMCArMSwxNzk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIHBsYXRmb3JtIGluZGVwZW5kZW5kIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCisjaWZkZWYgVU5ERVJfUlRTUworCS8vIFJUWCBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHJ0YXBpLmg+CisKKyNlbGlmIF9fQk9STEFORENfXworCS8vIGJvcmxhbmQgQyBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisjZWxpZiBXSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2Vsc2UKKwkvLyBNU1ZDIG5lZWRzIHRvIGluY2x1ZGUgd2luZG93cy5oIGF0IGZpcnN0CisJLy8gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyIG5lY2Vzc2FyeSBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igd2FpdGFibGUgdGltZXJzCisjZGVmaW5lIF9XSU4zMl9XSU5ET1dTIDB4MDQwMQorI2RlZmluZSBfV0lOMzJfV0lOTlQgICAweDA0MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgorI2luY2x1ZGUgIlNoYklwYy5oIgorCisvLyBkLmsuIExpbnV4IGtlcm5lbCBtb2R1bGVzIG5lZWRzIG90aGVyIGhlYWRlciBmaWxlcyBmb3IgbWVtY3B5KCkKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICghZGVmaW5lZChTSEFSRURCVUZGX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbmZpZ3VyYXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgU0JDX01BR0lDX0lEICAgIDB4NTM0MjQzMjMJLy8gbWFnaWMgSUQgKCJTQkMjIikKKyNkZWZpbmUgU0JMX01BR0lDX0lEICAgIDB4NTM0MjRDMjMJLy8gbWFnaWMgSUQgKCJTQkwjIikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gc3RydWN0dXJlIHRvIGFkbWluaXN0cmF0ZSBjaXJjdWxhciBzaGFyZWQgYnVmZmVyIGhlYWQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fU2hiQ2lyTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkMjIikKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJUb3RhbFNpemU7CS8vIG92ZXItYWxsIHNpemUgb2YgY29tcGxldGUgYnVmZmVyCisJdW5zaWduZWQgbG9uZyBtX3VsQnVmZmVyRGF0YVNpemU7CS8vIHNpemUgb2YgY29tcGxldGUgZGF0YSBhcmVhCisJdW5zaWduZWQgbG9uZyBtX3VsV3JJbmRleDsJLy8gY3VycmVudCB3cml0ZSBpbmRleCAoc2V0IGJldm9yZSB3cml0ZSkKKwl1bnNpZ25lZCBsb25nIG1fdWxSZEluZGV4OwkvLyBjdXJyZW50IHJlYWQgaW5kZXggKHNldCBhZnRlciByZWFkKQorCXVuc2lnbmVkIGxvbmcgbV91bE51bU9mV3JpdGVKb2JzOwkvLyBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKSB3cml0ZSBvcGVyYXRpb25zCisJdW5zaWduZWQgbG9uZyBtX3VsRGF0YUluVXNlOwkvLyBjdXJyZW50bHkgdXNlZCBidWZmZXIgc2l6ZSAoaW5jbC4gdW5jb21wbGV0ZWQgd3JpdGUgb3BlcmF0aW9ucykKKwl1bnNpZ25lZCBsb25nIG1fdWxEYXRhQXBlbmRlZDsJLy8gYnVmZmVyIHNpemUgb2YgY29tcGxldGUgbmV3IHdyaXR0ZW4gYnV0IG5vdCB5ZXQgcmVhZGFibGUgZGF0YSAoaW4gY2FzZSBvZiBtX3VsTnVtT2ZXcml0ZUpvYnM+MSkKKwl1bnNpZ25lZCBsb25nIG1fdWxCbG9ja3NBcGVuZGVkOwkvLyBudW1iZXIgb2YgY29tcGxldGUgbmV3IHdyaXR0ZW4gYnV0IG5vdCB5ZXQgcmVhZGFibGUgZGF0YSBibG9ja3MgKGluIGNhc2Ugb2YgbV91bE51bU9mV3JpdGVKb2JzPjEpCisJdW5zaWduZWQgbG9uZyBtX3VsRGF0YVJlYWRhYmxlOwkvLyBidWZmZXIgc2l6ZSB3aXRoIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhCisJdW5zaWduZWQgbG9uZyBtX3VsQmxvY2tzUmVhZGFibGU7CS8vIG51bWJlciBvZiByZWFkYWJsZSAoY29tcGxldGUgd3JpdHRlbikgZGF0YSBibG9ja3MKKwl0U2hiQ2lyU2lnSG5kbHJOZXdEYXRhIG1fcGZuU2lnSG5kbHJOZXdEYXRhOwkvLyBhcHBsaWNhdGlvbiBoYW5kbGVyIHRvIHNpZ25hbCBuZXcgZGF0YQorCXVuc2lnbmVkIGludCBtX2ZCdWZmZXJMb2NrZWQ7CS8vIFRSVUUgaWYgYnVmZmVyIGlzIGxvY2tlZCAoYmVjYXVzZSBvZiBwZW5kaW5nIHJlc2V0IHJlcXVlc3QpCisJdFNoYkNpclNpZ0huZGxyUmVzZXQgbV9wZm5TaWdIbmRsclJlc2V0OwkvLyBhcHBsaWNhdGlvbiBoYW5kbGVyIHRvIHNpZ25hbCBidWZmZXIgcmVzZXQgaXMgZG9uZQorCXVuc2lnbmVkIGNoYXIgbV9EYXRhOwkvLyBzdGFydCBvZiBkYXRhIGFyZWEgKHRoZSByZWFsIGRhdGEgc2l6ZSBpcyB1bmtub3duIGF0IHRoaXMgdGltZSkKKworfSB0U2hiQ2lyQnVmZjsKKworLy8gc3RydWN0dXJlIHRvIGFkbWluaXN0cmF0ZSBsaW5lYXIgc2hhcmVkIGJ1ZmZlciBoZWFkCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fU2hiTGluTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkwjIikKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJUb3RhbFNpemU7CS8vIG92ZXItYWxsIHNpemUgb2YgY29tcGxldGUgYnVmZmVyCisJdW5zaWduZWQgbG9uZyBtX3VsQnVmZmVyRGF0YVNpemU7CS8vIHNpemUgb2YgY29tcGxldGUgZGF0YSBhcmVhCisJdW5zaWduZWQgY2hhciBtX0RhdGE7CS8vIHN0YXJ0IG9mIGRhdGEgYXJlYSAodGhlIHJlYWwgZGF0YSBzaXplIGlzIHVua25vd24gYXQgdGhpcyB0aW1lKQorCit9IHRTaGJMaW5CdWZmOworCisvLyB0eXBlIHRvIHNhdmUgc2l6ZSBvZiBhIHNpbmdsZSBkYXRhIGJsb2NrIGluc2lkZSB0aGUgY2lyY3VsYXIgc2hhcmVkIGJ1ZmZlcgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRnVsbEJsb2NrU2l6ZToyODsJLy8gYSBzaW5nbGUgYmxvY2sgbXVzdCBub3QgZXhjZWVkIGEgbGVuZ3RoIG9mIDI1Nk1CeXRlIDotKQorCXVuc2lnbmVkIGludCBtX3VpQWxpZ25GaWxsQnl0ZXM6NDsKKworfSB0U2hiQ2lyQmxvY2tTaXplOworCisjZGVmaW5lIFNCQ19CTE9DS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICA0CS8vIGFsaWdubWVudCBtdXN0ICpub3QqIGJlIGxvd2VyIHRoYW4gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpIQorI2RlZmluZSBTQkNfTUFYX0JMT0NLX1NJWkUgICAgICAgICAoKDE8PDI4KS0xKQkvLyA9ICgyXjI4IC0gMSkgPSAoMjU2TUJ5dGUgLSAxKSAtPiBzaG91bGQgYmUgZW5vdWdodCBmb3IgcmVhbCBsaWZlIDotKQorCisjZGVmaW5lIFNCTF9CTE9DS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFNCTF9NQVhfQkxPQ0tfU0laRSAgICAgICAgICgoMTw8MjgpLTEpCS8vID0gKDJeMjggLSAxKSA9ICgyNTZNQnl0ZSAtIDEpIC0+IHNob3VsZCBiZSBlbm91Z2h0IGZvciByZWFsIGxpZmUgOi0pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2xvYmFsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJDaXJCdWZmICpTaGJDaXJHZXRCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCisJcFNoYkNpckJ1ZmYgPSAodFNoYkNpckJ1ZmYgKikgU2hiSXBjR2V0U2hNZW1QdHIocFNoYkluc3RhbmNlX3ApOworCUFTU0VSVChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEID09IFNCQ19NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJDaXJCdWZmKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkxpbkJ1ZmYgKlNoYkxpbkdldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisKKwlwU2hiTGluQnVmZiA9ICh0U2hiTGluQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2VfcCk7CisJQVNTRVJUKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgPT0gU0JMX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYkxpbkJ1ZmYpOworCit9CisKKy8vIG5vdCBpbmxpbmVkIGludGVybmFsIGZ1bmN0aW9ucworaW50IFNoYkNpclNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit2b2lkIFNoYkNpclNpZ25hbEhhbmRsZXJSZXNldCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCk7CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorLy8gbm90IGlubGluZWQgZXh0ZXJuYWwgZnVuY3Rpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSW5pdGlhbGl6ZSBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkluaXQodm9pZCkKK3sKKworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0gU2hiSXBjSW5pdCgpOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWluaXRpYWxpemUgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJFeGl0KHZvaWQpCit7CisKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlTaGJFcnJvciA9IFNoYklwY0V4aXQoKTsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgQyBpIHIgYyB1IGwgYSByICAgUyBoIGEgciBlIGQgICBCIHUgZiBmIGUgciAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJDaXJBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlckRhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJUb3RhbFNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKCh1bEJ1ZmZlclNpemVfcCA9PSAwKSB8fCAocHBTaGJJbnN0YW5jZV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgbWVtb3J5IHRvIGFsbG9jYXRlCisJdWxCdWZmZXJEYXRhU2l6ZSA9CisJICAgICh1bEJ1ZmZlclNpemVfcCArCisJICAgICAoU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpKSAmIH4oU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpOworCXVsQnVmZmVyVG90YWxTaXplID0gdWxCdWZmZXJEYXRhU2l6ZSArIHNpemVvZih0U2hiQ2lyQnVmZik7CisKKwkvLyBhbGxvY2F0ZSBhIG5ldyBvciBvcGVuIGFuIGV4aXN0aW5nIHNoYXJlZCBidWZmZXIKKwlTaGJFcnJvciA9IFNoYklwY0FsbG9jQnVmZmVyKHVsQnVmZmVyVG90YWxTaXplLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgJnBTaGJJbnN0YW5jZSwgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFNoYkluc3RhbmNlID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBnZXQgcG9pbnRlciB0byBzaGFyZWQgYnVmZmVyCisJcFNoYkNpckJ1ZmYgPSAodFNoYkNpckJ1ZmYgKikgU2hiSXBjR2V0U2hNZW1QdHIocFNoYkluc3RhbmNlKTsKKworCS8vIGlmIHRoZSBzaGFyZWQgYnVmZmVyIHdhcyBuZXcgY3JlYXRlZCwgdGhhbiB0aGlzIHByb2Nlc3MgaGFzCisJLy8gdG8gaW5pdGlhbGl6ZSBpdCwgb3RoZXJ3aXNlIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBpbiB1c2UKKwkvLyBhbmQgKm11c3Qgbm90KiBiZSByZXNldGVkCisJaWYgKGZTaGJOZXdDcmVhdGVkKSB7CisjaWZuZGVmIE5ERUJVRworCQl7CisJCQltZW1zZXQocFNoYkNpckJ1ZmYsIDB4Q0MsIHVsQnVmZmVyVG90YWxTaXplKTsKKwkJfQorI2VuZGlmCisKKwkJcFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCA9IFNCQ19NQUdJQ19JRDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJUb3RhbFNpemUgPSB1bEJ1ZmZlclRvdGFsU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSA9IHVsQnVmZmVyRGF0YVNpemU7CisJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgPSAwOworCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCQlwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkID0gRkFMU0U7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCSpwZlNoYk5ld0NyZWF0ZWRfcCA9IGZTaGJOZXdDcmVhdGVkOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJDaXJSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiRXJyb3IgPSBTaGJJcGNSZWxlYXNlQnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZiAvLyAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworI2lmICghZGVmaW5lZChTSEFSRURCVUZGX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlc2V0IENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyUmVzZXRCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVPdXRfcCwKKwkJCQkJICAgIHRTaGJDaXJTaWdIbmRsclJlc2V0CisJCQkJCSAgICBwZm5TaWduYWxIYW5kbGVyUmVzZXRfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBsb25nIHVsTnVtT2ZXcml0ZUpvYnMgPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gc3RhcnQgcmVzZXQgam9iIGJ5IHNldHRpbmcgcmVxdWVzdCByZXF1ZXN0IGluIGJ1ZmZlciBoZWFkZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJaWYgKCFwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkKSB7CisJCQl1bE51bU9mV3JpdGVKb2JzID0gcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9iczsKKworCQkJcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCA9IFRSVUU7CisJCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0ID0KKwkJCSAgICBwZm5TaWduYWxIYW5kbGVyUmVzZXRfcDsKKwkJfSBlbHNlIHsKKwkJCVNoYkVycm9yID0ga1NoYkFscmVhZHlSZXNldGluZzsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHJ1bm5pbmcgd3JpdGUgb3BlcmF0aW9uIHRoZW4gcmVzZXQgYnVmZmVyCisJLy8gaW1tZWRpYXRlbHksIG90aGVyd2lzZSB3YWl0IHVudGlsIHRoZSBsYXN0IHdyaXRlIGpvYiBpcyByZWFkeSBieQorCS8vIHN0YXJ0aW5nIGEgc2lnbmFsIHByb2Nlc3MKKwlpZiAodWxOdW1PZldyaXRlSm9icyA9PSAwKSB7CisJCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBubyBydW5uaW5nIHdyaXRlIG9wZXJhdGlvbgorCQkvLyAtPiByZXNldCBidWZmZXIgaW1tZWRpYXRlbHkKKwkJU2hiQ2lyU2lnbmFsSGFuZGxlclJlc2V0KHBTaGJJbnN0YW5jZV9wLCBGQUxTRSk7CisJCVNoYkVycm9yID0ga1NoYk9rOworCX0gZWxzZSB7CisJCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhdCBsZWFzdCBvbmUgcnVubmluZyB3cml0ZSBvcGVyYXRpb24KKwkJLy8gLT4gc3RhcnRpbmcgc2lnbmFsIHByb2Nlc3MgdG8gd2FpdCB1bnRpbCB0aGUgbGFzdCB3cml0ZSBqb2IgaXMgcmVhZHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiSXBjU3RhcnRTaWduYWxpbmdKb2JSZWFkeShwU2hiSW5zdGFuY2VfcCwgdWxUaW1lT3V0X3AsCisJCQkJCQkgU2hiQ2lyU2lnbmFsSGFuZGxlclJlc2V0KTsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdyaXRlIGRhdGEgYmxvY2sgdG8gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUJsb2NrX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGludCB1aUZ1bGxCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpQWxpZ25GaWxsQnl0ZXM7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgY2hhciAqcFNjckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxDaHVua1NpemU7CisJdW5zaWduZWQgbG9uZyB1bFdySW5kZXggPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl1bnNpZ25lZCBpbnQgZlNpZ25hbE5ld0RhdGE7CisJdW5zaWduZWQgaW50IGZTaWduYWxSZXNldDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkVycm9yIFNoYkVycm9yMjsKKwlpbnQgZlJlczsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBTcmNEYXRhQmxvY2tfcCA9PSBOVUxMKSB8fCAodWxEYXRhQmxvY2tTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJsb2NrU2l6ZV9wID4gU0JDX01BWF9CTE9DS19TSVpFKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJcFNjckRhdGFQdHIgPSAodW5zaWduZWQgY2hhciAqKXBTcmNEYXRhQmxvY2tfcDsKKwlmU2lnbmFsTmV3RGF0YSA9IEZBTFNFOworCWZTaWduYWxSZXNldCA9IEZBTFNFOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2FsY3VsYXRlIGRhdGEgYmxvY2sgc2l6ZSBpbiBjaXJjdWxhciBidWZmZXIKKwl1bERhdGFTaXplID0KKwkgICAgKHVsRGF0YUJsb2NrU2l6ZV9wICsKKwkgICAgIChTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWlGdWxsQmxvY2tTaXplID0gdWxEYXRhU2l6ZSArIHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsJLy8gZGF0YSBzaXplICsgaGVhZGVyCisJdWlBbGlnbkZpbGxCeXRlcyA9IHVsRGF0YVNpemUgLSB1bERhdGFCbG9ja1NpemVfcDsKKworCVNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSA9IHVpRnVsbEJsb2NrU2l6ZTsKKwlTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzID0gdWlBbGlnbkZpbGxCeXRlczsKKworCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJLy8gYW5kIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGluIHRoZSBjaXJjdWxhciBidWZmZXIgaGVhZGVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSB0byBzdG9yZQorCQkvLyB0aGUgbmV3IGRhdGEKKwkJZlJlcyA9CisJCSAgICB1aUZ1bGxCbG9ja1NpemUgPD0KKwkJICAgIChwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0KKwkJICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSk7CisJCWlmIChmUmVzKSB7CisJCQkvLyBzZXQgd3JpdGUgcG9pbnRlciBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCS8vIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvaW50ZXIgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCQkJdWxXckluZGV4ID0gcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4OworCisJCQkvLyByZXNlcnZlIHRoZSBuZWVkZWQgbWVtb3J5IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgKz0gdWlGdWxsQmxvY2tTaXplOworCisJCQkvLyBzZXQgbmV3IHdyaXRlIHBvaW50ZXIgYmVoaW5kIHRoZSByZXNlcnZlZCBtZW1vcnkKKwkJCS8vIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICs9IHVpRnVsbEJsb2NrU2l6ZTsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCAlPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJCS8vIGluY3JlbWVudCBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKQorCQkJLy8gd3JpdGUgb3BlcmF0aW9ucworCQkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icysrOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoIWZSZXMpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVyRnVsbDsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIGl0c2VsZiB3aWxsIGJlIGRvbmUgb3V0c2lkZSBvZiBhbnkKKwkvLyBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisKKwkvLyB3cml0ZSByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCkgPSBTaGJDaXJCbG9ja1NpemU7CisJdWxXckluZGV4ICs9IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwl1bFdySW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCWlmICh1bFdySW5kZXggKyB1bERhdGFCbG9ja1NpemVfcCA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCS8vIGxpbmVhciB3cml0ZSBvcGVyYXRpb24KKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4LCBwU2NyRGF0YVB0ciwKKwkJICAgICAgIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl9IGVsc2UgeworCQkvLyB3cmFwLWFyb3VuZCB3cml0ZSBvcGVyYXRpb24KKwkJdWxDaHVua1NpemUgPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxXckluZGV4OworCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLCB1bENodW5rU2l6ZSk7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciwgcFNjckRhdGFQdHIgKyB1bENodW5rU2l6ZSwKKwkJICAgICAgIHVsRGF0YUJsb2NrU2l6ZV9wIC0gdWxDaHVua1NpemUpOworCX0KKworCS8vIGFkanVzdCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIGNpcmN1bGFyIGJ1ZmZlciB3aXRoIHByb3BlcnRpZXMKKwkvLyBvZiB0aGUgd2lyaXR0ZW4gZGF0YSBibG9jaworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkICs9IHVpRnVsbEJsb2NrU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkKys7CisKKwkJLy8gZGVjcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpIHdyaXRlIG9wZXJhdGlvbnMKKwkJaWYgKCEtLXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMpIHsKKwkJCS8vIGlmIHRoZXJlIGlzIG5vIG90aGVyIHdyaXRlIHByb2Nlc3MgcnVubmluZyB0aGVuCisJCQkvLyBzZXQgbmV3IHNpemUgb2YgcmVhZGFibGUgKGNvbXBsZXRlIHdyaXR0ZW4pIGRhdGEgYW5kCisJCQkvLyBhZGp1c3QgbnVtYmVyIG9mIHJlYWRhYmxlIGJsb2NrcworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgKz0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSArPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZDsKKworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQgPSAwOworCisJCQlmU2lnbmFsTmV3RGF0YSA9IFRSVUU7CisJCQlmU2lnbmFsUmVzZXQgPSBwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkvLyBzaWduYWwgbmV3IGRhdGEgZXZlbnQgdG8gYSBwb3RlbnRpYWxseSByZWFkaW5nIGFwcGxpY2F0aW9uCisJaWYgKGZTaWduYWxOZXdEYXRhKSB7CisJCVNoYkVycm9yMiA9IFNoYklwY1NpZ25hbE5ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKwkvLyBzaWduYWwgdGhhdCB0aGUgbGFzdCB3cml0ZSBqb2IgaGFzIGJlZW4gZmluaXNoZWQgdG8gYWxsb3cKKwkvLyBhIHdhaXRpbmcgYXBwbGljYXRpb24gdG8gcmVzZXQgdGhlIGJ1ZmZlciBub3cKKwlpZiAoZlNpZ25hbFJlc2V0KSB7CisJCVNoYkVycm9yMiA9IFNoYklwY1NpZ25hbEpvYlJlYWR5KHBTaGJJbnN0YW5jZV9wKTsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQkJU2hiRXJyb3IgPSBTaGJFcnJvcjI7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIGJsb2NrIHdpdGhpbiB0aGUgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlciBmb3IgY2h1bmsgd3JpdGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJBbGxvY0RhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQnVmZmVyU2l6ZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGludCB1aUZ1bGxCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpQWxpZ25GaWxsQnl0ZXM7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxXckluZGV4ID0gMDsJLy8gZC5rLiBHQ0MgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgb3RoZXJ3aXNlCisJdFNoYkVycm9yIFNoYkVycm9yOworCWludCBmUmVzOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocFNoYkNpckNodW5rX3AgPT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCdWZmZXJTaXplX3AgPT0gMCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJ1ZmZlclNpemVfcCA+IFNCQ19NQVhfQkxPQ0tfU0laRSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2FsY3VsYXRlIGRhdGEgYmxvY2sgc2l6ZSBpbiBjaXJjdWxhciBidWZmZXIKKwl1bERhdGFTaXplID0KKwkgICAgKHVsRGF0YUJ1ZmZlclNpemVfcCArCisJICAgICAoU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpKSAmIH4oU0JDX0JMT0NLX0FMSUdOTUVOVCAtIDEpOworCXVpRnVsbEJsb2NrU2l6ZSA9IHVsRGF0YVNpemUgKyBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CS8vIGRhdGEgc2l6ZSArIGhlYWRlcgorCXVpQWxpZ25GaWxsQnl0ZXMgPSB1bERhdGFTaXplIC0gdWxEYXRhQnVmZmVyU2l6ZV9wOworCisJU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplID0gdWlGdWxsQmxvY2tTaXplOworCVNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMgPSB1aUFsaWduRmlsbEJ5dGVzOworCisJLy8gcmVzZXJ2ZSB0aGUgbmVlZGVkIG1lbW9yeSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkvLyBhbmQgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciBoZWFkZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlIHRvIHN0b3JlCisJCS8vIHRoZSBuZXcgZGF0YQorCQlmUmVzID0KKwkJICAgICh1aUZ1bGxCbG9ja1NpemUgPD0KKwkJICAgICAocFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtCisJCSAgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlKSk7CisJCWlmIChmUmVzKSB7CisJCQkvLyBzZXQgd3JpdGUgcG9pbnRlciBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkJCS8vIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvaW50ZXIgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCQkJdWxXckluZGV4ID0gcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4OworCisJCQkvLyByZXNlcnZlIHRoZSBuZWVkZWQgbWVtb3J5IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgKz0gdWlGdWxsQmxvY2tTaXplOworCisJCQkvLyBzZXQgbmV3IHdyaXRlIHBvaW50ZXIgYmVoaW5kIHRoZSByZXNlcnZlZCBtZW1vcnkKKwkJCS8vIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICs9IHVpRnVsbEJsb2NrU2l6ZTsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCAlPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJCS8vIGluY3JlbWVudCBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKQorCQkJLy8gd3JpdGUgb3BlcmF0aW9ucworCQkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icysrOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoIWZSZXMpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVyRnVsbDsKKwkJZ290byBFeGl0OworCX0KKworCS8vIHNldHVwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgYWxsb2NhdGVkIGJ1ZmZlcgorCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKworCS8vIHdyaXRlIHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4KSA9IFNoYkNpckJsb2NrU2l6ZTsKKwl1bFdySW5kZXggKz0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCXVsV3JJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJLy8gc2V0dXAgY2h1bmsgZGVzY3JpcHRvcgorCXBTaGJDaXJDaHVua19wLT5tX3VpRnVsbEJsb2NrU2l6ZSA9IHVpRnVsbEJsb2NrU2l6ZTsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUgPSB1bERhdGFCdWZmZXJTaXplX3A7CisJcFNoYkNpckNodW5rX3AtPm1fdWxXckluZGV4ID0gdWxXckluZGV4OworCXBTaGJDaXJDaHVua19wLT5tX2ZCdWZmZXJDb21wbGV0ZWQgPSBGQUxTRTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZGF0YSBjaHVuayBpbnRvIGFuIGFsbG9jYXRlZCBidWZmZXIgb2YgdGhlIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICAgdFNoYkNpckNodW5rICogcFNoYkNpckNodW5rX3AsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUNodW5rX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUNodW5rU2l6ZV9wLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgICAqcGZCdWZmZXJDb21wbGV0ZWRfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwU2NyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsU3ViQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxXckluZGV4OworCXVuc2lnbmVkIGludCBmQnVmZmVyQ29tcGxldGVkOworCXVuc2lnbmVkIGludCBmU2lnbmFsTmV3RGF0YTsKKwl1bnNpZ25lZCBpbnQgZlNpZ25hbFJlc2V0OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocFNoYkNpckNodW5rX3AgPT0gTlVMTCkKKwkgICAgfHwgKHBmQnVmZmVyQ29tcGxldGVkX3AgPT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocFNyY0RhdGFDaHVua19wID09IE5VTEwpIHx8ICh1bERhdGFDaHVua1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocFNoYkNpckNodW5rX3AtPm1fZkJ1ZmZlckNvbXBsZXRlZCkgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJBbHJlYWR5Q29tcGxldGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUNodW5rU2l6ZV9wID4gcFNoYkNpckNodW5rX3AtPm1fdWxBdmFpbGFibGVTaXplKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJcFNjckRhdGFQdHIgPSAodW5zaWduZWQgY2hhciAqKXBTcmNEYXRhQ2h1bmtfcDsKKwlmU2lnbmFsTmV3RGF0YSA9IEZBTFNFOworCWZTaWduYWxSZXNldCA9IEZBTFNFOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJdWxXckluZGV4ID0gcFNoYkNpckNodW5rX3AtPm1fdWxXckluZGV4OworCisJLy8gY29weSB0aGUgZGF0YSB0byB0aGUgY2lyY3VsYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3MgaXRzZWxmIHdpbGwgYmUgZG9uZSBvdXRzaWRlIG9mIGFueQorCS8vIGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKworCWlmICh1bFdySW5kZXggKyB1bERhdGFDaHVua1NpemVfcCA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCS8vIGxpbmVhciB3cml0ZSBvcGVyYXRpb24KKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4LCBwU2NyRGF0YVB0ciwKKwkJICAgICAgIHVsRGF0YUNodW5rU2l6ZV9wKTsKKwl9IGVsc2UgeworCQkvLyB3cmFwLWFyb3VuZCB3cml0ZSBvcGVyYXRpb24KKwkJdWxTdWJDaHVua1NpemUgPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxXckluZGV4OworCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLCB1bFN1YkNodW5rU2l6ZSk7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciwgcFNjckRhdGFQdHIgKyB1bFN1YkNodW5rU2l6ZSwKKwkJICAgICAgIHVsRGF0YUNodW5rU2l6ZV9wIC0gdWxTdWJDaHVua1NpemUpOworCX0KKworCS8vIGFkanVzdCBjaHVuayBkZXNjcmlwdG9yCisJdWxXckluZGV4ICs9IHVsRGF0YUNodW5rU2l6ZV9wOworCXVsV3JJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJcFNoYkNpckNodW5rX3AtPm1fdWxBdmFpbGFibGVTaXplIC09IHVsRGF0YUNodW5rU2l6ZV9wOworCXBTaGJDaXJDaHVua19wLT5tX3VsV3JJbmRleCA9IHVsV3JJbmRleDsKKworCWZCdWZmZXJDb21wbGV0ZWQgPSAocFNoYkNpckNodW5rX3AtPm1fdWxBdmFpbGFibGVTaXplID09IDApOworCXBTaGJDaXJDaHVua19wLT5tX2ZCdWZmZXJDb21wbGV0ZWQgPSBmQnVmZmVyQ29tcGxldGVkOworCisJLy8gaWYgdGhlIGNvbXBsZXRlIGFsbG9jYXRlZCBidWZmZXIgaXMgZmlsbGVkIHdpdGggZGF0YSB0aGVuCisJLy8gYWRqdXN0IGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgY2lyY3VsYXIgYnVmZmVyIHdpdGggcHJvcGVydGllcworCS8vIG9mIHRoZSB3aXJpdHRlbiBkYXRhIGJsb2NrCisJaWYgKGZCdWZmZXJDb21wbGV0ZWQpIHsKKwkJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwkJeworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCArPQorCQkJICAgIHBTaGJDaXJDaHVua19wLT5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCsrOworCisJCQkvLyBkZWNyZW1lbnQgbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykgd3JpdGUgb3BlcmF0aW9ucworCQkJaWYgKCEtLXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMpIHsKKwkJCQkvLyBpZiB0aGVyZSBpcyBubyBvdGhlciB3cml0ZSBwcm9jZXNzIHJ1bm5pbmcgdGhlbgorCQkJCS8vIHNldCBuZXcgc2l6ZSBvZiByZWFkYWJsZSAoY29tcGxldGUgd3JpdHRlbikgZGF0YSBhbmQKKwkJCQkvLyBhZGp1c3QgbnVtYmVyIG9mIHJlYWRhYmxlIGJsb2NrcworCQkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlICs9CisJCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQ7CisJCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSArPQorCQkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQ7CisKKwkJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQgPSAwOworCisJCQkJZlNpZ25hbE5ld0RhdGEgPSBUUlVFOworCQkJCWZTaWduYWxSZXNldCA9IHBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQ7CisJCQl9CisJCX0KKwkJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl9CisKKwkvLyBzaWduYWwgbmV3IGRhdGEgZXZlbnQgdG8gYSBwb3RlbnRpYWxseSByZWFkaW5nIGFwcGxpY2F0aW9uCisJaWYgKGZTaWduYWxOZXdEYXRhKSB7CisJCVNoYkVycm9yMiA9IFNoYklwY1NpZ25hbE5ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKwkvLyBzaWduYWwgdGhhdCB0aGUgbGFzdCB3cml0ZSBqb2IgaGFzIGJlZW4gZmluaXNoZWQgdG8gYWxsb3cKKwkvLyBhIHdhaXRpbmcgYXBwbGljYXRpb24gdG8gcmVzZXQgdGhlIGJ1ZmZlciBub3cKKwlpZiAoZlNpZ25hbFJlc2V0KSB7CisJCVNoYkVycm9yMiA9IFNoYklwY1NpZ25hbEpvYlJlYWR5KHBTaGJJbnN0YW5jZV9wKTsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQkJU2hiRXJyb3IgPSBTaGJFcnJvcjI7CisJCX0KKwl9CisKKwkqcGZCdWZmZXJDb21wbGV0ZWRfcCA9IGZCdWZmZXJDb21wbGV0ZWQ7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlYWQgZGF0YSBibG9jayBmcm9tIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyUmVhZERhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFJkQnVmZlNpemVfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhUmVhZGFibGU7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgY2hhciAqcERzdERhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplID0gMDsJLy8gZC5rLiBHQ0MgY29tcGxhaW5zIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgb3RoZXJ3aXNlCisJdW5zaWduZWQgbG9uZyB1bENodW5rU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsUmRJbmRleDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwdWxEYXRhQmxvY2tTaXplX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJaWYgKChwRHN0RGF0YUJsb2NrX3AgPT0gTlVMTCkgfHwgKHVsUmRCdWZmU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCVNoYkVycm9yID0ga1NoYk9rOworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwRHN0RGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcERzdERhdGFCbG9ja19wOworCXVsRGF0YVNpemUgPSAwOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gZ2V0IHRvdGFsIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyBmb3IgdGhlIHdob2xlIGNpcmN1bGFyIGJ1ZmZlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQl1bERhdGFSZWFkYWJsZSA9IHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJLy8gaWYgdGhlcmUgYXJlIHJlYWRhYmxlIGRhdGEgYXZhaWxhYmxlLCB0aGVuIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QKKwkvLyBvbmUgY29tcGxldGUgcmVhZGFibGUgZGF0YSBibG9jaworCWlmICh1bERhdGFSZWFkYWJsZSA+IDApIHsKKwkJLy8gZ2V0IHBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhIGFuZCBjdXJyZW50IHJlYWQgaW5kZXgKKwkJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCQl1bFJkSW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXg7CisKKwkJLy8gZ2V0IHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkJU2hiQ2lyQmxvY2tTaXplID0KKwkJICAgICoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgpOworCQl1bFJkSW5kZXggKz0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCQl1bFJkSW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkvLyBnZXQgc2l6ZSBvZiB1c2VyIGRhdGEgaW5zaWRlIHRoZSBjdXJyZW50IGJsb2NrCisJCXVsRGF0YVNpemUgPQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplIC0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXM7CisJCXVsRGF0YVNpemUgLT0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCX0KKworCS8vIHVsRGF0YVNpemUgPSBNSU4odWxEYXRhU2l6ZSwgdWxSZEJ1ZmZTaXplX3ApOworCWlmICh1bERhdGFTaXplID4gdWxSZEJ1ZmZTaXplX3ApIHsKKwkJdWxEYXRhU2l6ZSA9IHVsUmRCdWZmU2l6ZV9wOworCQlTaGJFcnJvciA9IGtTaGJEYXRhVHJ1bmNhdGVkOworCX0KKworCWlmICh1bERhdGFTaXplID09IDApIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk5vUmVhZGFibGVEYXRhOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjaXJjdWxhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyBpdHNlbGYgd2lsbCBiZSBkb25lIG91dHNpZGUgb2YgYW55CisJLy8gY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJaWYgKHVsUmRJbmRleCArIHVsRGF0YVNpemUgPD0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkvLyBsaW5lYXIgcmVhZCBvcGVyYXRpb24KKwkJbWVtY3B5KHBEc3REYXRhUHRyLCBwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwgdWxEYXRhU2l6ZSk7CisJfSBlbHNlIHsKKwkJLy8gd3JhcC1hcm91bmQgcmVhZCBvcGVyYXRpb24KKwkJdWxDaHVua1NpemUgPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxSZEluZGV4OworCQltZW1jcHkocERzdERhdGFQdHIsIHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCB1bENodW5rU2l6ZSk7CisJCW1lbWNweShwRHN0RGF0YVB0ciArIHVsQ2h1bmtTaXplLCBwU2hiQ2lyRGF0YVB0ciwKKwkJICAgICAgIHVsRGF0YVNpemUgLSB1bENodW5rU2l6ZSk7CisJfQorCisjaWZuZGVmIE5ERUJVRworCXsKKwkJdFNoYkNpckJsb2NrU2l6ZSBDbHJTaGJDaXJCbG9ja1NpemU7CisKKwkJaWYgKHVsUmRJbmRleCArIHVsRGF0YVNpemUgPD0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkJLy8gbGluZWFyIGJ1ZmZlcgorCQkJbWVtc2V0KHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCAweERELCB1bERhdGFTaXplKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHdyYXAtYXJvdW5kIHJlYWQgb3BlcmF0aW9uCisJCQl1bENodW5rU2l6ZSA9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtIHVsUmRJbmRleDsKKwkJCW1lbXNldChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwgMHhERCwgdWxDaHVua1NpemUpOworCQkJbWVtc2V0KHBTaGJDaXJEYXRhUHRyLCAweERELCB1bERhdGFTaXplIC0gdWxDaHVua1NpemUpOworCQl9CisKKwkJQ2xyU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplID0gLyoodW5zaWduZWQgaW50KSAqLyAtMTsJLy8gLTEgPSB4RkZGRkZGRgorCQlDbHJTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzID0gLyoodW5zaWduZWQgaW50KSAqLyAtMTsJLy8gLTEgPSBGeHh4eHh4eAorCQkqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsKKwkJCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4KSA9CisJCSAgICBDbHJTaGJDaXJCbG9ja1NpemU7CisJfQorI2VuZGlmIC8vICNpZm5kZWYgTkRFQlVHCisKKwkvLyBzZXQgbmV3IHNpemUgb2YgcmVhZGFibGUgZGF0YSwgZGF0YSBpbiB1c2UsIG5ldyByZWFkIGluZGV4CisJLy8gYW5kIGFkanVzdCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlIC09IFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgLT0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZS0tOworCisJCS8vJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkCisJCWlmICgocFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgPT0gMCkKKwkJICAgICYmIChwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSA9PSAwKSkgeworCQkJQVNTRVJUKHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUgPT0gMCk7CisKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggPSAwOworCQl9IGVsc2UKKwkJCS8vJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkCisJCXsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCArPQorCQkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCAlPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCSpwdWxEYXRhQmxvY2tTaXplX3AgPSB1bERhdGFTaXplOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgZGF0YSBzaXplIG9mIG5leHQgcmVhZGFibGUgYmxvY2sgZnJvbSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpckdldFJlYWREYXRhU2l6ZSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCQl1bnNpZ25lZCBsb25nCisJCQkJCQkqcHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhUmVhZGFibGU7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHB1bERhdGFCbG9ja1NpemVfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJdWxEYXRhU2l6ZSA9IDA7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBnZXQgdG90YWwgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIGZvciB0aGUgd2hvbGUgY2lyY3VsYXIgYnVmZmVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXVsRGF0YVJlYWRhYmxlID0gcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGU7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkvLyBpZiB0aGVyZSBhcmUgcmVhZGFibGUgZGF0YSBhdmFpbGFibGUsIHRoZW4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAorCS8vIG9uZSBjb21wbGV0ZSByZWFkYWJsZSBkYXRhIGJsb2NrCisJaWYgKHVsRGF0YVJlYWRhYmxlID4gMCkgeworCQlwU2hiQ2lyRGF0YVB0ciA9CisJCSAgICAmcFNoYkNpckJ1ZmYtPm1fRGF0YSArIHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleDsKKworCQkvLyBnZXQgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCQlTaGJDaXJCbG9ja1NpemUgPSAqKHRTaGJDaXJCbG9ja1NpemUgKikgcFNoYkNpckRhdGFQdHI7CisKKwkJLy8gZ2V0IHNpemUgb2YgdXNlciBkYXRhIGluc2lkZSB0aGUgY3VycmVudCBibG9jaworCQl1bERhdGFTaXplID0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZSAtCisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzOworCQl1bERhdGFTaXplIC09IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwkqcHVsRGF0YUJsb2NrU2l6ZV9wID0gdWxEYXRhU2l6ZTsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IG51bWJlciBvZiByZWFkYWJsZSBibG9ja3MgZnJvbSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgdW5zaWduZWQgbG9uZworCQkJCQkJICAqcHVsRGF0YUJsb2NrQ291bnRfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBsb25nIHVsQmxvY2tDb3VudDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwdWxEYXRhQmxvY2tDb3VudF9wID09IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJdWxCbG9ja0NvdW50ID0gMDsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQl1bEJsb2NrQ291bnQgPSBwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJKnB1bERhdGFCbG9ja0NvdW50X3AgPSB1bEJsb2NrQ291bnQ7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFNldCBhcHBsaWNhdGlvbiBoYW5kbGVyIHRvIHNpZ25hbCBuZXcgZGF0YSBmb3IgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8gIGQuay46IG5ldyBwYXJhbWV0ZXIgcHJpb3JpdHkgYXMgZW51bQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YSh0U2hiSW5zdGFuY2UKKwkJCQkJCQlwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCQl0U2hiQ2lyU2lnSG5kbHJOZXdEYXRhCisJCQkJCQkJcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCwKKwkJCQkJCQl0U2hiUHJpb3JpdHkKKwkJCQkJCQlTaGJQcmlvcml0eV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCAhPSBOVUxMKSB7CisJCS8vIHNldCBhIG5ldyBzaWduYWwgaGFuZGxlcgorCQlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKwkJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wOworCQlTaGJFcnJvciA9CisJCSAgICBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3AsCisJCQkJCQlTaGJDaXJTaWduYWxIYW5kbGVyTmV3RGF0YSwKKwkJCQkJCVNoYlByaW9yaXR5X3ApOworCX0gZWxzZSB7CisJCS8vIHJlbW92ZSBleGlzdGluZyBzaWduYWwgaGFuZGxlcgorCQlTaGJFcnJvciA9IFNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKHBTaGJJbnN0YW5jZV9wKTsKKwkJaWYgKHBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSB7CisJCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEocFNoYkluc3RhbmNlX3AsIDApOworCQl9CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBERUJVRzogVHJhY2UgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKK3RTaGJFcnJvciBTaGJDaXJUcmFjZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJY2hhciBzek1hZ2lnSURbc2l6ZW9mKFNCQ19NQUdJQ19JRCkgKyAxXTsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVJlYWRhYmxlOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxCbG9ja0luZGV4OworCXVuc2lnbmVkIGludCBuQmxvY2tDb3VudDsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bENodW5rU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsUmRJbmRleDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlUUkFDRTAoIlxuXG4jIyMjIyBDaXJjdWxhciBTaGFyZWQgQnVmZmVyICMjIyMjXG4iKTsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVRSQUNFMSgiXG5FUlJPUjogaW52YWxpZCBidWZmZXIgYWRkcmVzcyAoMHglMDhsWClcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiSW5zdGFuY2VfcCk7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqKHVuc2lnbmVkIGxvbmcgKikmc3pNYWdpZ0lEWzBdID0gcFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRDsKKwlzek1hZ2lnSURbc2l6ZW9mKFNCQ19NQUdJQ19JRCldID0gJ1wwJzsKKworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlUUkFDRTEoIlxuQnVmZmVyIEFkZHJlc3M6ICAgMHglMDhsWFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJDaXJCdWZmKTsKKworCQlUUkFDRTAoIlxuSGVhZGVyIEluZm86Iik7CisJCVRSQUNFMigiXG5NYWdpZ0lEOiAgICAgICAgICAnJXMnICglMDhsWCkiLCBzek1hZ2lnSUQsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlclRvdGFsU2l6ZTogICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlclRvdGFsU2l6ZSk7CisJCVRSQUNFMSgiXG5CdWZmZXJEYXRhU2l6ZTogICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSk7CisJCVRSQUNFMSgiXG5XckluZGV4OiAgICAgICAgICAlNGx1IiwgcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4KTsKKwkJVFJBQ0UxKCJcblJkSW5kZXg6ICAgICAgICAgICU0bHUiLCBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXgpOworCQlUUkFDRTEoIlxuTnVtT2ZXcml0ZUpvYnM6ICAgJTRsdSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKTsKKwkJVFJBQ0UxKCJcbkRhdGFJblVzZTogICAgICAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSk7CisJCVRSQUNFMSgiXG5EYXRhQXBlbmRlZDogICAgICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCk7CisJCVRSQUNFMSgiXG5CbG9ja3NBcGVuZGVkOiAgICAlNGx1IiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCk7CisJCVRSQUNFMSgiXG5EYXRhUmVhZGFibGU6ICAgICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUpOworCQlUUkFDRTEoIlxuQmxvY2tzUmVhZGFibGU6ICAgJTRsdSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlKTsKKwkJVFJBQ0UxKCJcblNpZ0huZGxyTmV3RGF0YTogICUwOGxYIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSk7CisJCVRSQUNFMSgiXG5CdWZmZXJMb2NrZWQ6ICAgICAlZCIsIHBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQpOworCQlUUkFDRTEoIlxuU2lnSG5kbHJSZXNldDogICAgJTA4bFgiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCk7CisKKwkJU2hiVHJhY2VEdW1wKCZwU2hiQ2lyQnVmZi0+bV9EYXRhLAorCQkJICAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplLCAweDAwMDAwMDAwTCwKKwkJCSAgICAgIlxuRGF0YSBBcmVhOiIpOworCisJCXVsRGF0YVJlYWRhYmxlID0gcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGU7CisJCW5CbG9ja0NvdW50ID0gMTsKKwkJdWxCbG9ja0luZGV4ID0gcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4OworCisJCXdoaWxlICh1bERhdGFSZWFkYWJsZSA+IDApIHsKKwkJCVRSQUNFMSgiXG5cbi0tLSBCbG9jayAjJXUgLS0tIiwgbkJsb2NrQ291bnQpOworCisJCQkvLyBnZXQgcG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGFyZWEgYW5kIGN1cnJlbnQgcmVhZCBpbmRleAorCQkJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCQkJdWxSZEluZGV4ID0gdWxCbG9ja0luZGV4OworCisJCQkvLyBnZXQgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCQkJU2hiQ2lyQmxvY2tTaXplID0KKwkJCSAgICAqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4KTsKKwkJCXVsUmRJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJCQl1bFJkSW5kZXggJT0gcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJLy8gZ2V0IHNpemUgb2YgdXNlciBkYXRhIGluc2lkZSB0aGUgY3VycmVudCBibG9jaworCQkJdWxEYXRhU2l6ZSA9CisJCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplIC0KKwkJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUFsaWduRmlsbEJ5dGVzOworCQkJdWxEYXRhU2l6ZSAtPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisKKwkJCVRSQUNFMQorCQkJICAgICgiXG5GdWxsIERhdGEgU2l6ZTogICAgICAgJTR1IFtCeXRlc10gKGluY2wuIGhlYWRlciBhbmQgYWxpZ25tZW50IGZpbGwgYnl0ZXMpIiwKKwkJCSAgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplKTsKKwkJCVRSQUNFMSgiXG5Vc2VyIERhdGEgU2l6ZTogICAgICAgJTRsdSBbQnl0ZXNdIiwKKwkJCSAgICAgICB1bERhdGFTaXplKTsKKwkJCVRSQUNFMSgiXG5BbGlnbm1lbnQgRmlsbCBCeXRlczogJTR1IFtCeXRlc10iLAorCQkJICAgICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMpOworCisJCQlpZiAodWxSZEluZGV4ICsgdWxEYXRhU2l6ZSA8PQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJCQkvLyBsaW5lYXIgZGF0YSBidWZmZXIKKwkJCQlTaGJUcmFjZUR1bXAocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsCisJCQkJCSAgICAgdWxEYXRhU2l6ZSwgMHgwMDAwMDAwMEwsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQkvLyB3cmFwLWFyb3VuZCBkYXRhIGJ1ZmZlcgorCQkJCXVsQ2h1bmtTaXplID0KKwkJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSAtIHVsUmRJbmRleDsKKwkJCQlTaGJUcmFjZUR1bXAocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsCisJCQkJCSAgICAgdWxDaHVua1NpemUsIDB4MDAwMDAwMDBMLCBOVUxMKTsKKwkJCQlTaGJUcmFjZUR1bXAocFNoYkNpckRhdGFQdHIsCisJCQkJCSAgICAgdWxEYXRhU2l6ZSAtIHVsQ2h1bmtTaXplLAorCQkJCQkgICAgIHVsQ2h1bmtTaXplLCBOVUxMKTsKKwkJCX0KKworCQkJbkJsb2NrQ291bnQrKzsKKworCQkJdWxCbG9ja0luZGV4ICs9IFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJCXVsQmxvY2tJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCQl1bERhdGFSZWFkYWJsZSAtPSBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemU7CisJCX0KKworCQlBU1NFUlQocFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9PSBuQmxvY2tDb3VudCAtIDEpOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIEwgaSBuIGUgYSByICAgUyBoIGEgciBlIGQgICBCIHUgZiBmIGUgciAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkxpbkFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCkKK3sKKworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlclRvdGFsU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHVsQnVmZmVyU2l6ZV9wID09IDApIHx8IChwcFNoYkluc3RhbmNlX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJLy8gY2FsY3VsYXRlIGxlbmd0aCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUKKwl1bEJ1ZmZlckRhdGFTaXplID0KKwkgICAgKHVsQnVmZmVyU2l6ZV9wICsKKwkgICAgIChTQkxfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkxfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWxCdWZmZXJUb3RhbFNpemUgPSB1bEJ1ZmZlckRhdGFTaXplICsgc2l6ZW9mKHRTaGJMaW5CdWZmKTsKKworCS8vIGFsbG9jYXRlIGEgbmV3IG9yIG9wZW4gYW4gZXhpc3Rpbmcgc2hhcmVkIGJ1ZmZlcgorCVNoYkVycm9yID0gU2hiSXBjQWxsb2NCdWZmZXIodWxCdWZmZXJUb3RhbFNpemUsIHBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAmcFNoYkluc3RhbmNlLCAmZlNoYk5ld0NyZWF0ZWQpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2hiSW5zdGFuY2UgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCBwb2ludGVyIHRvIHNoYXJlZCBidWZmZXIKKwlwU2hiTGluQnVmZiA9ICh0U2hiTGluQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2UpOworCisJLy8gaWYgdGhlIHNoYXJlZCBidWZmZXIgd2FzIG5ldyBjcmVhdGVkLCB0aGFuIHRoaXMgcHJvY2VzcyBoYXMKKwkvLyB0byBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGluIHVzZQorCS8vIGFuZCAqbXVzdCBub3QqIGJlIHJlc2V0ZWQKKwlpZiAoZlNoYk5ld0NyZWF0ZWQpIHsKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCW1lbXNldChwU2hiTGluQnVmZiwgMHhDQywgdWxCdWZmZXJUb3RhbFNpemUpOworCQl9CisjZW5kaWYKKworCQlwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEID0gU0JMX01BR0lDX0lEOworCQlwU2hiTGluQnVmZi0+bV91bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyVG90YWxTaXplOworCQlwU2hiTGluQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplID0gdWxCdWZmZXJEYXRhU2l6ZTsKKwl9IGVsc2UgeworCQlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCisJKnBwU2hiSW5zdGFuY2VfcCA9IHBTaGJJbnN0YW5jZTsKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hiTmV3Q3JlYXRlZDsKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVsZWFzZSBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkxpblJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlTaGJFcnJvciA9IFNoYklwY1JlbGVhc2VCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQVJFREJVRkZfSU5MSU5FRCkpIHx8IGRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZGF0YSBibG9jayB0byBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJMaW5Xcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRHN0QnVmZmVyT2Zmc19wLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFCbG9ja19wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwl1bnNpZ25lZCBjaGFyICpwU2hiTGluRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwU2NyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocFNyY0RhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bERhdGFCbG9ja1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQmxvY2tTaXplX3AgPiBTQkxfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJMaW5CdWZmID0gU2hiTGluR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwU2NyRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcFNyY0RhdGFCbG9ja19wOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgIT0gU0JMX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgaWYgb2ZmZXNldCBhbmQgc2l6ZSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiBtYXRjaGVzIHdpdGgKKwkvLyB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIGJ1ZmZlcgorCXVsQnVmZmVyRGF0YVNpemUgPSBwU2hiTGluQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCWlmICgodWxEc3RCdWZmZXJPZmZzX3AgPiB1bEJ1ZmZlckRhdGFTaXplKSB8fAorCSAgICAodWxEYXRhQmxvY2tTaXplX3AgPiB1bEJ1ZmZlckRhdGFTaXplKSB8fAorCSAgICAoKHVsRHN0QnVmZmVyT2Zmc19wICsgdWxEYXRhQmxvY2tTaXplX3ApID4gdWxCdWZmZXJEYXRhU2l6ZSkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRGF0YU91dHNpZGVCdWZmZXJBcmVhOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY29weSB0aGUgZGF0YSB0byB0aGUgbGluZWFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIHdpbGwgYmUgZG9uZSBpbnNpZGUgb2YgYW55IGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCXBTaGJMaW5EYXRhUHRyID0gJnBTaGJMaW5CdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKwlwU2hiTGluRGF0YVB0ciArPSB1bERzdEJ1ZmZlck9mZnNfcDsKKworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQltZW1jcHkocFNoYkxpbkRhdGFQdHIsIHBTY3JEYXRhUHRyLCB1bERhdGFCbG9ja1NpemVfcCk7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlYWQgZGF0YSBibG9jayBmcm9tIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkxpblJlYWREYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YUJsb2NrX3AsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxTcmNCdWZmZXJPZmZzX3AsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisJdW5zaWduZWQgY2hhciAqcFNoYkxpbkRhdGFQdHI7CisJdW5zaWduZWQgY2hhciAqcERzdERhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlckRhdGFTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBEc3REYXRhQmxvY2tfcCA9PSBOVUxMKSB8fCAodWxEYXRhQmxvY2tTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJsb2NrU2l6ZV9wID4gU0JMX01BWF9CTE9DS19TSVpFKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTGluQnVmZiA9IFNoYkxpbkdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJcERzdERhdGFQdHIgPSAodW5zaWduZWQgY2hhciAqKXBEc3REYXRhQmxvY2tfcDsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEICE9IFNCTF9NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNoZWNrIGlmIG9mZmVzZXQgYW5kIHNpemUgZm9yIHRoZSByZWFkIG9wZXJhdGlvbiBtYXRjaGVzIHdpdGgKKwkvLyB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIGJ1ZmZlcgorCXVsQnVmZmVyRGF0YVNpemUgPSBwU2hiTGluQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCWlmICgodWxTcmNCdWZmZXJPZmZzX3AgPiB1bEJ1ZmZlckRhdGFTaXplKSB8fAorCSAgICAodWxEYXRhQmxvY2tTaXplX3AgPiB1bEJ1ZmZlckRhdGFTaXplKSB8fAorCSAgICAoKHVsU3JjQnVmZmVyT2Zmc19wICsgdWxEYXRhQmxvY2tTaXplX3ApID4gdWxCdWZmZXJEYXRhU2l6ZSkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRGF0YU91dHNpZGVCdWZmZXJBcmVhOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY29weSB0aGUgZGF0YSB0byB0aGUgbGluZWFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIHdpbGwgYmUgZG9uZSBpbnNpZGUgb2YgYW55IGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCXBTaGJMaW5EYXRhUHRyID0gJnBTaGJMaW5CdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKwlwU2hiTGluRGF0YVB0ciArPSB1bFNyY0J1ZmZlck9mZnNfcDsKKworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQltZW1jcHkocERzdERhdGFQdHIsIHBTaGJMaW5EYXRhUHRyLCB1bERhdGFCbG9ja1NpemVfcCk7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERFQlVHOiBUcmFjZSBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKK3RTaGJFcnJvciBTaGJMaW5UcmFjZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisJY2hhciBzek1hZ2lnSURbc2l6ZW9mKFNCTF9NQUdJQ19JRCkgKyAxXTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlUUkFDRTAoIlxuXG4jIyMjIyBMaW5lYXIgU2hhcmVkIEJ1ZmZlciAjIyMjI1xuIik7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlUUkFDRTEoIlxuRVJST1I6IGludmFsaWQgYnVmZmVyIGFkZHJlc3MgKDB4JTA4bFgpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkluc3RhbmNlX3ApOworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkxpbkJ1ZmYgPSBTaGJMaW5HZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgIT0gU0JMX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJKih1bnNpZ25lZCBpbnQgKikmc3pNYWdpZ0lEWzBdID0gcFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRDsKKwlzek1hZ2lnSURbc2l6ZW9mKFNCTF9NQUdJQ19JRCldID0gJ1wwJzsKKworCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlUUkFDRTEoIlxuQnVmZmVyIEFkZHJlc3M6ICAgMHglMDhsWFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJMaW5CdWZmKTsKKworCQlUUkFDRTAoIlxuSGVhZGVyIEluZm86Iik7CisJCVRSQUNFMigiXG5NYWdpZ0lEOiAgICAgICAgICAnJXMnICglMDhYKSIsIHN6TWFnaWdJRCwKKwkJICAgICAgIHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQpOworCQlUUkFDRTEoIlxuQnVmZmVyVG90YWxTaXplOiAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlckRhdGFTaXplOiAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiTGluQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKTsKKworCQlTaGJUcmFjZUR1bXAoJnBTaGJMaW5CdWZmLT5tX0RhdGEsCisJCQkgICAgIHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUsIDB4MDAwMDAwMDBMLAorCQkJICAgICAiXG5EYXRhIEFyZWE6Iik7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRHVtcCBidWZmZXIgY29udGVudHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgTkRFQlVHCit0U2hiRXJyb3IgU2hiVHJhY2VEdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhYlN0YXJ0QWRkcl9wLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3AsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsQWRkck9mZnNldF9wLCBjb25zdCBjaGFyICpwc3pJbmZvVGV4dF9wKQoreworCisJY29uc3QgdW5zaWduZWQgY2hhciAqcGFiQnVmZkRhdGE7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZTaXplOworCXVuc2lnbmVkIGNoYXIgYkRhdGE7CisJaW50IG5Sb3c7CisJaW50IG5Db2w7CisKKwkvLyBnZXQgcG9pbnRlciB0byBidWZmZXIgYW5kIGxlbmd0aCBvZiBidWZmZXIKKwlwYWJCdWZmRGF0YSA9IHBhYlN0YXJ0QWRkcl9wOworCXVsQnVmZlNpemUgPSB1bERhdGFTaXplX3A7CisKKwlpZiAocHN6SW5mb1RleHRfcCAhPSBOVUxMKSB7CisJCVRSQUNFMChwc3pJbmZvVGV4dF9wKTsKKwl9CisJLy8gZHVtcCBidWZmZXIgY29udGVudHMKKwlmb3IgKG5Sb3cgPSAwOzsgblJvdysrKSB7CisJCVRSQUNFMSgiXG4lMDhsWDogICAiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5Sb3cgKiAweDEwKSArIHVsQWRkck9mZnNldF9wKTsKKworCQlmb3IgKG5Db2wgPSAwOyBuQ29sIDwgMTY7IG5Db2wrKykgeworCQkJaWYgKCh1bnNpZ25lZCBsb25nKW5Db2wgPCB1bEJ1ZmZTaXplKSB7CisJCQkJVFJBQ0UxKCIlMDJYICIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpKihwYWJCdWZmRGF0YSArIG5Db2wpKTsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UwKCIgICAiKTsKKwkJCX0KKwkJfQorCisJCVRSQUNFMCgiICIpOworCisJCWZvciAobkNvbCA9IDA7IG5Db2wgPCAxNjsgbkNvbCsrKSB7CisJCQliRGF0YSA9ICpwYWJCdWZmRGF0YSsrOworCQkJaWYgKCh1bnNpZ25lZCBsb25nKW5Db2wgPCB1bEJ1ZmZTaXplKSB7CisJCQkJaWYgKChiRGF0YSA+PSAweDIwKSAmJiAoYkRhdGEgPCAweDdGKSkgeworCQkJCQlUUkFDRTEoIiVjIiwgYkRhdGEpOworCQkJCX0gZWxzZSB7CisJCQkJCVRSQUNFMCgiLiIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0UwKCIgIik7CisJCQl9CisJCX0KKworCQlpZiAodWxCdWZmU2l6ZSA+IDE2KSB7CisJCQl1bEJ1ZmZTaXplIC09IDE2OworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKyNlbmRpZiAvLyAjaWZuZGVmIE5ERUJVRworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBIYW5kbGVyIHRvIHNpZ25hbCBuZXcgZGF0YSBldmVudCBmb3IgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFNoYkNpclNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bEJsb2NrQ291bnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gY2FsbCBhcHBsaWNhdGlvbiBoYW5kbGVyCisJaWYgKHBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSB7CisvKiAgICAgICAgZG8KKyAgICAgICAgeyovCisJCVNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZERhdGFTaXplKHBTaGJJbnN0YW5jZV9wLCAmdWxEYXRhU2l6ZSk7CisJCWlmICgodWxEYXRhU2l6ZSA+IDApICYmIChTaGJFcnJvciA9PSBrU2hiT2spKSB7CisJCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEocFNoYkluc3RhbmNlX3AsCisJCQkJCQkJICB1bERhdGFTaXplKTsKKwkJfQorCisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KHBTaGJJbnN0YW5jZV9wLCAmdWxCbG9ja0NvdW50KTsKKy8qICAgICAgICB9CisgICAgICAgIHdoaWxlICgodWxCbG9ja0NvdW50ID4gMCkgJiYgKFNoYkVycm9yID09IGtTaGJPaykpOyovCisJfQorCS8vIFJldHVybiBUUlVFIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGJsb2Nrcy4KKwkvLyBJbiB0aGF0IGNhc2UgU2hiSXBjIHRyaWVzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiBpbW1lZGlhdGVseSBpZiB0aGVyZQorCS8vIGlzIG5vIG90aGVyIGZpbGxlZCBzaGFyZWQgYnVmZmVyIHdpdGggaGlnaGVyIHByaW9yaXR5LgorCXJldHVybiAoKHVsQmxvY2tDb3VudCA+IDApICYmIChTaGJFcnJvciA9PSBrU2hiT2spKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEhhbmRsZXIgdG8gcmVzZXQgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlyZXR1cm47CisJfQorCisJLy8gcmVzZXQgYnVmZmVyIGhlYWRlcgorCWlmICghZlRpbWVPdXRfcCkgeworCQlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCQl7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9IDA7CisJCX0KKwkJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJbWVtc2V0KCZwU2hiQ2lyQnVmZi0+bV9EYXRhLCAweENDLAorCQkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpOworCQl9CisjZW5kaWYKKwl9CisKKwkvLyBjYWxsIGFwcGxpY2F0aW9uIGhhbmRsZXIKKwlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCAhPSBOVUxMKSB7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQocFNoYkluc3RhbmNlX3AsIGZUaW1lT3V0X3ApOworCX0KKworCS8vIHVubG9jayBidWZmZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCA9IEZBTFNFOworCQlwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0ID0gTlVMTDsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCXJldHVybjsKKworfQorCisjZW5kaWYKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzFiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuaApAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBEZWNsYXJhdGlvbiBvZiBwbGF0Zm9ybSBpbmRlcGVuZGVuZCBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNi8yNyAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NIQVJFREJVRkZfSF8KKyNkZWZpbmUgX1NIQVJFREJVRkZfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUeXBlIGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtTaGJPayA9IDAsCisJa1NoYk5vUmVhZGFibGVEYXRhID0gMSwKKwlrU2hiRGF0YVRydW5jYXRlZCA9IDIsCisJa1NoYkJ1ZmZlckZ1bGwgPSAzLAorCWtTaGJEYXRhT3V0c2lkZUJ1ZmZlckFyZWEgPSA0LAorCWtTaGJCdWZmZXJBbHJlYWR5Q29tcGxldGVkID0gNSwKKwlrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jcyA9IDYsCisJa1NoYk9wZW5NaXNtYXRjaCA9IDcsCisJa1NoYkludmFsaWRCdWZmZXJUeXBlID0gOCwKKwlrU2hiSW52YWxpZEFyZyA9IDksCisJa1NoYkJ1ZmZlckludmFsaWQgPSAxMCwKKwlrU2hiT3V0T2ZNZW0gPSAxMSwKKwlrU2hiQWxyZWFkeVJlc2V0aW5nID0gMTIsCisJa1NoYkFscmVhZHlTaWduYWxpbmcgPSAxMywKKwlrU2hiRXhjZWVkRGF0YVNpemVMaW1pdCA9IDE0LAorCit9IHRTaGJFcnJvcjsKKworLy8gMjAwNi8wOC8yNCBkLmsuOiBQcmlvcml0eSBmb3IgdGhyZWFkcyAobmV3IGRhdGEsIGpvYiBzaWduYWxpbmcpCit0eXBlZGVmIGVudW0geworCWtTaGJQcmlvcml0eUxvdyA9IDAsCisJa1NoYlByaW9yaXR5Tm9ybWFsID0gMSwKKwlrc2hiUHJpb3JpdHlIaWdoID0gMgorfSB0U2hiUHJpb3JpdHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aUZ1bGxCbG9ja1NpemU7CS8vIHJlYWwgc2l6ZSBvZiBhbGxvY2F0ZWQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCXVuc2lnbmVkIGxvbmcgbV91bEF2YWlsYWJsZVNpemU7CS8vIHN0aWxsIGF2YWlsYWJsZSBzaXplIGZvciBkYXRhCisJdW5zaWduZWQgbG9uZyBtX3VsV3JJbmRleDsJLy8gY3VycmVudCB3cml0ZSBpbmRleAorCXVuc2lnbmVkIGludCBtX2ZCdWZmZXJDb21wbGV0ZWQ7CS8vIFRSVUUgaWYgYWxsb2NhdGVkIGJsb2NrIGlzIGNvbXBsZXRlIGZpbGxlZCB3aXRoIGRhdGEKKworfSB0U2hiQ2lyQ2h1bms7CisKK3R5cGVkZWYgdm9pZCAqdFNoYkluc3RhbmNlOworCit0eXBlZGVmIHZvaWQgKCp0U2hiQ2lyU2lnSG5kbHJOZXdEYXRhKSAodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQl1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKTsKK3R5cGVkZWYgdm9pZCAoKnRTaGJDaXJTaWdIbmRsclJlc2V0KSAodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmVGltZU91dF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qI2lmIGRlZmluZWQoSU5MSU5FX0ZVTkNUSU9OX0RFRikKKyAgICAjdW5kZWYgIElOTElORV9GVU5DVElPTgorICAgICNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisgICAgI2RlZmluZSBJTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKyAgICAjZGVmaW5lIFNIQVJFREJVRkZfSU5MSU5FRAorICAgICNpbmNsdWRlICJTaGFyZWRCdWZmLmMiCisjZW5kaWYKKyovCisKKwl0U2hiRXJyb3IgU2hiSW5pdCh2b2lkKTsKKwl0U2hiRXJyb3IgU2hiRXhpdCh2b2lkKTsKKworLy8gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorCXRTaGJFcnJvciBTaGJDaXJBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApOworCXRTaGJFcnJvciBTaGJDaXJSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworCXRTaGJFcnJvciBTaGJDaXJSZXNldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lT3V0X3AsCisJCQkJICAgIHRTaGJDaXJTaWdIbmRsclJlc2V0CisJCQkJICAgIHBmblNpZ25hbEhhbmRsZXJSZXNldF9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyV3JpdGVEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUJsb2NrX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJBbGxvY0RhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHRTaGJDaXJDaHVuayAqIHBTaGJDaXJDaHVua19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJ1ZmZlclNpemVfcCk7CisJdFNoYkVycm9yIFNoYkNpcldyaXRlRGF0YUNodW5rKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdFNoYkNpckNodW5rICogcFNoYkNpckNodW5rX3AsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQ2h1bmtfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFDaHVua1NpemVfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwZkJ1ZmZlckNvbXBsZXRlZF9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyUmVhZERhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdm9pZCAqcERzdERhdGFCbG9ja19wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxSZEJ1ZmZTaXplX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZERhdGFTaXplKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqcHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgKnB1bERhdGFCbG9ja0NvdW50X3ApOworCXRTaGJFcnJvciBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCQl0U2hiQ2lyU2lnSG5kbHJOZXdEYXRhCisJCQkJCQlwZm5TaGJTaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJdFNoYlByaW9yaXR5IFNoYlByaW9yaXR5X3ApOworCisjZW5kaWYKKworLy8gTGluZWFyIFNoYXJlZCBCdWZmZXIKKwl0U2hiRXJyb3IgU2hiTGluQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKTsKKwl0U2hiRXJyb3IgU2hiTGluUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKwl0U2hiRXJyb3IgU2hiTGluV3JpdGVEYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRHN0QnVmZmVyT2Zmc19wLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUJsb2NrX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJMaW5SZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICB2b2lkICpwRHN0RGF0YUJsb2NrX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFNyY0J1ZmZlck9mZnNfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisJdFNoYkVycm9yIFNoYkNpclRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisJdFNoYkVycm9yIFNoYkxpblRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisJdFNoYkVycm9yIFNoYlRyYWNlRHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpwYWJTdGFydEFkZHJfcCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsQWRkck9mZnNldF9wLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnBzekluZm9UZXh0X3ApOworI2Vsc2UKKyNkZWZpbmUgU2hiQ2lyVHJhY2VCdWZmZXIocDApCisjZGVmaW5lIFNoYkxpblRyYWNlQnVmZmVyKHAwKQorI2RlZmluZSBTaGJUcmFjZUR1bXAocDAsIHAxLCBwMiwgcDMpCisjZW5kaWYKKworI3VuZGVmICBJTkxJTkVfRU5BQkxFRAkJLy8gZGlzYWJsZSBhY3R1YWwgaW5saW5pbmcgb2YgZnVuY3Rpb25zCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04JCS8vIGRlZmluZSBJTkxJTkVfRlVOQ1RJT04gdG8gbm90aGluZworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCQkJCS8vICNpZm5kZWYgX1NIQVJFREJVRkZfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLUxpbnV4S2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1MaW51eEtlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2NiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1MaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsOTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAoSW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEtlcm5lbFNwYWNlKQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjggLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgorI2luY2x1ZGUgIlNoYklwYy5oIgorI2luY2x1ZGUgIlNoYkxpbnV4S2VybmVsLmgiCisjaW5jbHVkZSAiRGVidWcuaCIKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25zdGFudCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfTEVOX0JVRkZFUl9JRCAgICAgICAyNTYKKworI2RlZmluZSBUSU1FT1VUX0VOVEVSX0FUT01JQyAgICAxMDAwCS8vIChtcykgZm9yIGRlYmdnaW5nOiBJTkZJTklURQorI2RlZmluZSBUSU1FT1VUX1RFUk1fVEhSRUFEICAgICAxMDAwCisjZGVmaW5lIElORklOSVRFICAgICAgICAgICAgICAgIDM2MDAKKworI2RlZmluZSBTQklfTUFHSUNfSUQgICAgICAgICAgICAweDUzNDI0OTJCCS8vIG1hZ2ljIElEICgiU0JJKyIpCisjZGVmaW5lIFNCSF9NQUdJQ19JRCAgICAgICAgICAgIDB4NTM0MjQ4MkEJLy8gbWFnaWMgSUQgKCJTQkgqIikKKworI2RlZmluZSBJTlZBTElEX0lEICAgICAgICAgICAgICAtMQorCisjZGVmaW5lIFRBQkxFX1NJWkUgICAgICAgICAgICAgIDEwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBjb21tb24gaGVhZGVyIGZvciB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gdXNlZAorLy8gYnkgYWxsIHByb2Nlc3NlcyBhdHRhY2hlZCB0aGlzIHNoYXJlZCBtZW1vcnkuIEl0IGluY2x1ZGVzIGNvbW1vbgorLy8gaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkIGJ1ZmZlciBmcm9tIGEgY291cGxlIG9mCisvLyBzZXBhcmF0ZWQgcHJvY2Vzc2VzIChlLmcuIHRoZSByZWZlcm5jZSBjb3VudGVyKS4gVGhpcyBzdHJ1Y3R1cmUgaXMKKy8vIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBpdHNlbGYgYW5kIGV4aXN0cworLy8gY29uc2VxdWVudGx5IG9ubHkgb25lIHRpbWVzIHBlciBzaGFyZWQgbWVtb3J5IGluc3RhbmNlLgordHlwZWRlZiBzdHJ1Y3QgeworCisJdW5zaWduZWQgbG9uZyBtX3VsU2hNZW1TaXplOworCXVuc2lnbmVkIGxvbmcgbV91bFJlZkNvdW50OworCWludCBtX2lCdWZmZXJJZDsKKy8vICAgIGludCAgICAgICAgICAgICAgICAgbV9pVXNlclNwYWNlTWVtOyAgICAgICAgICAgLy8wIGZvciB1c2Vyc3BhY2UgbWVtICAgIT0wIGtlcm5lbHNwYWNlIG1lbQorCXNwaW5sb2NrX3QgbV9TcGlubG9ja0J1ZmZBY2Nlc3M7CisJQk9PTCBtX2ZOZXdEYXRhOworCUJPT0wgbV9mSm9iUmVhZHk7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbV9XYWl0UXVldWVOZXdEYXRhOworCXdhaXRfcXVldWVfaGVhZF90IG1fV2FpdFF1ZXVlSm9iUmVhZHk7CisKKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsT3duZXJQcm9jSUQ7CisjZW5kaWYKKworfSB0U2hiTWVtSGVhZGVyOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgImV4dGVybmFsIGVudHJ5IHBvaW50IiBmcm9tIGEgc2VwYXJhdGUgcHJvY2VzcworLy8gdG8gZ2V0IGFjY2VzcyB0byBhIHNoYXJlZCBidWZmZXIuIFRoaXMgc3RydWN0dXJlIGluY2x1ZGVzIGFsbCBwbGF0Zm9ybQorLy8gcmVzcC4gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZAorLy8gYnVmZmVyIGZyb20gYSBzZXBhcmF0ZSBwcm9jZXNzLiBFdmVyeSBwcm9jZXNzIGF0dGFjaGVkIHRvIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBoYXMgaXRzIG93biBydW50aW1lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggaXRzIGluZGl2aWR1YWwKKy8vIHJ1bnRpbWUgZGF0YSAoZS5nLiB0aGUgc2NvcGUgb2YgYW4gZXZlbnQgaGFuZGxlIGlzIGxpbWl0dGVkIHRvIHRoZQorLy8gb3duZXIgcHJvY2VzcyBvbmx5KS4gVGhlIHN0cnVjdHVyZSBtZW1iZXIgPG1fcFNoYk1lbUhlYWRlcj4gcG9pbnRzCisvLyB0byB0aGUgKHByb2Nlc3Mgc3BlY2lmaWMpIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCisvLyBpdHNlbGYuCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX1NiaU1hZ2ljSUQ7CS8vIG1hZ2ljIElEICgiU0JJKyIpCisvLyAgICB2b2lkKiAgICAgICAgICAgICAgIG1fcFNoYXJlZE1lbTsKKwlpbnQgbV90VGhyZWFkTmV3RGF0YUlkOworCWxvbmcgbV9sVGhyZWFkTmV3RGF0YU5pY2U7CS8vIG5pY2UgdmFsdWUgb2YgdGhlIG5ldyBkYXRhIHRocmVhZAorCWludCBtX3RUaHJlYWRKb2JSZWFkeUlkOworCXVuc2lnbmVkIGxvbmcgbV91bEZsYWdzQnVmZkFjY2VzczsJLy8gZC5rLiBtb3ZlZCBmcm9tIHRTaGJNZW1IZWFkZXIsIGJlY2F1c2UgZWFjaAorCS8vIHByb2Nlc3MgbmVlZHMgdG8gc3RvcmUgdGhlIGludGVycnVwdCBmbGFncyBzZXBhcmF0ZWx5CisJdFNpZ0huZGxyTmV3RGF0YSBtX3BmblNpZ0huZGxyTmV3RGF0YTsKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJdFNpZ0huZGxySm9iUmVhZHkgbV9wZm5TaWdIbmRsckpvYlJlYWR5OworCXRTaGJNZW1IZWFkZXIgKm1fcFNoYk1lbUhlYWRlcjsKKwlpbnQgbV9pVGhyZWFkVGVybUZsYWc7CisJc3RydWN0IGNvbXBsZXRpb24gbV9Db21wbGV0aW9uTmV3RGF0YTsKKy8qCisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtQnVmZkFjY2VzczsKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICptX3BTZW1OZXdEYXRhOworICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgKm1fcFNlbVN0b3BTaWduYWxpbmdOZXdEYXRhOworICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgKm1fcFNlbUpvYlJlYWR5OworKi8KKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSUROZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgbV91bFRocmVhZElESm9iUmVhZHk7CisjZW5kaWYKK30gdFNoYk1lbUluc3Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vdFNoYk1lbUluc3QqICAgICAgICAgICAgU2hiSXBjR2V0U2hiTWVtSW5zdCAgICAgICAgICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworLy90U2hiTWVtSGVhZGVyKiAgICAgICAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIgICAgICAgKHRTaGJNZW1JbnN0KiBwU2hiTWVtSW5zdF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGlubGluZSB0U2hiTWVtSW5zdCAqU2hiSXBjR2V0U2hiTWVtSW5zdCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisKKwlwU2hiTWVtSW5zdCA9ICh0U2hiTWVtSW5zdCAqKSBwU2hiSW5zdGFuY2VfcDsKKworCXJldHVybiAocFNoYk1lbUluc3QpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbmxpbmUgdFNoYk1lbUhlYWRlciAqU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHRTaGJNZW1JbnN0ICogcFNoYk1lbUluc3RfcCkKK3sKKworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlwU2hiTWVtSGVhZGVyID0gcFNoYk1lbUluc3RfcC0+bV9wU2hiTWVtSGVhZGVyOworCisJcmV0dXJuIChwU2hiTWVtSGVhZGVyKTsKKworfQorCisvLyAgR2V0IHBvaW50ZXIgdG8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKy8vI2RlZmluZSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKSAoKHRTaGJNZW1JbnN0KilwU2hiSW5zdGFuY2VfcCkKKworLy8gIEdldCBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgaGVhZGVyCisvLyNkZWZpbmUgU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0X3ApIChwU2hiTWVtSW5zdF9wLT5tX3BTaGJNZW1IZWFkZXIpCisKKy8vIG5vdCBpbmxpbmVkIGludGVybmFsIGZ1bmN0aW9ucworaW50IFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEodm9pZCAqcHZUaHJlYWRQYXJhbV9wKTsKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSh2b2lkICpwdlRocmVhZFBhcmFtX3ApOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCitzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCk7CitzdGF0aWMgaW50IFNoYklwY0ZpbmRMaXN0RWxlbWVudChpbnQgaUJ1ZmZlcklkLAorCQkJCSBzdHJ1Y3Qgc1NoYk1lbVRhYmxlCisJCQkJICoqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KTsKK3N0YXRpYyB2b2lkIFNoYklwY0FwcGVuZExpc3RFbGVtZW50KHN0cnVjdCBzU2hiTWVtVGFibGUgKnNOZXdNZW1UYWJsZUVsZW1lbnQpOworc3RhdGljIHZvaWQgU2hiSXBjRGVsZXRlTGlzdEVsZW1lbnQoaW50IGlCdWZmZXJJZCk7CitzdGF0aWMgdm9pZCBTaGJJcGNDcmMzMkdlblRhYmxlKHVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBTaGJJcGNDcmMzMkdldENyYyhjb25zdCBjaGFyICpwY1N0cmluZywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKTsKKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorLy8gbm90IGlubGluZWQgZXh0ZXJuYWwgZnVuY3Rpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSW5pdGlhbGl6ZSBJUEMgZm9yIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjSW5pdCh2b2lkKQoreworCXBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZyA9IE5VTEw7CisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVpbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNFeGl0KHZvaWQpCit7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwlpbnQgaUJ1ZmZlcklkID0gMDsKKwl1bnNpZ25lZCBsb25nIHVsQ3JjMzIgPSAwOworCXVuc2lnbmVkIGludCB1aUZpcnN0UHJvY2VzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB1bFNoTWVtU2l6ZTsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdCA9IE5VTEw7CisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl1bnNpZ25lZCBpbnQgZlNoTWVtTmV3Q3JlYXRlZCA9IEZBTFNFOworCXZvaWQgKnBTaGFyZWRNZW0gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XTsKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudDsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY0FsbG9jQnVmZmVyIFxuIik7CisJdWxTaE1lbVNpemUgPSB1bEJ1ZmZlclNpemVfcCArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKworCS8vY3JlYXRlIEJ1ZmZlciBJRAorCVNoYklwY0NyYzMyR2VuVGFibGUoYXVsQ3JjVGFibGUpOworCXVsQ3JjMzIgPSBTaGJJcGNDcmMzMkdldENyYyhwc3pCdWZmZXJJRF9wLCBhdWxDcmNUYWJsZSk7CisJaUJ1ZmZlcklkID0gdWxDcmMzMjsKKwlERUJVR19MVkxfMjlfVFJBQ0UyCisJICAgICgiU2hiSXBjQWxsb2NCdWZmZXIgQnVmZmVyU2l6ZTolZCBzaXplb2YodFNoYi4uKTolZFxuIiwKKwkgICAgIHVsQnVmZmVyU2l6ZV9wLCBzaXplb2YodFNoYk1lbUhlYWRlcikpOworCURFQlVHX0xWTF8yOV9UUkFDRTIoIlNoYklwY0FsbG9jQnVmZmVyIEJ1ZmZlcklkOiVkIE1lbVNpemU6JWRcbiIsCisJCQkgICAgaUJ1ZmZlcklkLCB1bFNoTWVtU2l6ZSk7CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyAoMSkgb3BlbiBhbiBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgc2hhcmVkIG1lbW9yeQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy90ZXN0IGlmIGJ1ZmZlciBhbHJlYWR5IGV4aXN0cworCWlmIChTaGJJcGNGaW5kTGlzdEVsZW1lbnQoaUJ1ZmZlcklkLCAmcHNNZW1UYWJsZUVsZW1lbnQpID09IDApIHsKKwkJLy9CdWZmZXIgYWxyZWFkeSBleGlzdHMKKwkJZlNoTWVtTmV3Q3JlYXRlZCA9IEZBTFNFOworCQlwU2hhcmVkTWVtID0gcHNNZW1UYWJsZUVsZW1lbnQtPm1fcEJ1ZmZlcjsKKwkJREVCVUdfTFZMXzI5X1RSQUNFMQorCQkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciBhdHRhY2ggQnVmZmVyIGF0OiVwIElkOiVkXG4iLAorCQkgICAgIHBTaGFyZWRNZW0pOworCQl1aUZpcnN0UHJvY2VzcyA9IDE7CisJfSBlbHNlIHsKKwkJLy9jcmVhdGUgbmV3IEJ1ZmZlcgorCQlmU2hNZW1OZXdDcmVhdGVkID0gVFJVRTsKKwkJdWlGaXJzdFByb2Nlc3MgPSAwOworCQlwU2hhcmVkTWVtID0ga21hbGxvYyh1bFNoTWVtU2l6ZSwgR0ZQX0tFUk5FTCk7CisJCURFQlVHX0xWTF8yOV9UUkFDRTIKKwkJICAgICgiU2hiSXBjQWxsb2NCdWZmZXIgQ3JlYXRlIE5ldyBCdWZmZXIgYXQ6JXAgSWQ6JWRcbiIsCisJCSAgICAgcFNoYXJlZE1lbSwgaUJ1ZmZlcklkKTsKKwkJaWYgKHBTaGFyZWRNZW0gPT0gTlVMTCkgeworCQkJLy91bmFibGUgdG8gY3JlYXRlIG1lbQorCQkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgY3JlYXRlIHNlbWFzXG4iKTsKKwkJLy8gYXBwZW5kIEVsZW1lbnQgdG8gTWVtIFRhYmxlCisJCXBzTWVtVGFibGVFbGVtZW50ID0KKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzU2hiTWVtVGFibGUpLCBHRlBfS0VSTkVMKTsKKwkJcHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkID0gaUJ1ZmZlcklkOworCQlwc01lbVRhYmxlRWxlbWVudC0+bV9wQnVmZmVyID0gcFNoYXJlZE1lbTsKKwkJcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0gTlVMTDsKKwkJU2hiSXBjQXBwZW5kTGlzdEVsZW1lbnQocHNNZW1UYWJsZUVsZW1lbnQpOworCX0KKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY0FsbG9jQnVmZmVyIHVwZGF0ZSBoZWFkZXJcbiIpOworCS8vdXBkYXRlIGhlYWRlcgorCXBTaGJNZW1IZWFkZXIgPSAodFNoYk1lbUhlYWRlciAqKSBwU2hhcmVkTWVtOworCURFQlVHX0xWTF8yOV9UUkFDRTEKKwkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciAwIHBTaGJNZW1IZWFkZXItPm1fdWxTaE1lbVNpemU6ICVkXG4iLAorCSAgICAgcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSk7CisJLy8gYWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBwcm9jZXNzIHNwZWNpZmljIG1lbXBvb2wgdG8gc2F2ZQorCS8vIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkIGJ1ZmZlcgorCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY0FsbG9jQnVmZmVyIGFsbG9jIHByaXZhdGUgbWVtXG4iKTsKKwlwU2hiTWVtSW5zdCA9CisJICAgICh0U2hiTWVtSW5zdCAqKSBTaGJJcGNBbGxvY1ByaXZhdGVNZW0oc2l6ZW9mKHRTaGJNZW1JbnN0KSk7CisJaWYgKHBTaGJNZW1JbnN0ID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzZXQgY29tcGxldGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzCisJLy9wU2hiTWVtSW5zdC0+bV9TYmlNYWdpY0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNCSV9NQUdJQ19JRDsKKy8vICAgIHBTaGJNZW1JbnN0LT5tX3BTaGFyZWRNZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwU2hhcmVkTWVtOworCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQgPSBJTlZBTElEX0lEOworCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWRKb2JSZWFkeUlkID0gSU5WQUxJRF9JRDsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ID0gMDsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gTlVMTDsKKwlwU2hiTWVtSW5zdC0+bV9wU2hiTWVtSGVhZGVyID0gcFNoYk1lbUhlYWRlcjsKKwlwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgPSAwOworCisJLy8gaW5pdGlhbGl6ZSBjb21wbGV0aW9uIGV0Yy4KKwlpbml0X2NvbXBsZXRpb24oJnBTaGJNZW1JbnN0LT5tX0NvbXBsZXRpb25OZXdEYXRhKTsKKworCVNoYkVycm9yID0ga1NoYk9rOworCWlmIChmU2hNZW1OZXdDcmVhdGVkKSB7CisJCS8vIHRoaXMgcHJvY2VzcyB3YXMgdGhlIGZpcnN0IHdobyB3YW50ZWQgdG8gdXNlIHRoZSBzaGFyZWQgbWVtb3J5LAorCQkvLyBzbyBhIG5ldyBzaGFyZWQgbWVtb3J5IHdhcyBjcmVhdGVkCisJCS8vIC0+IHNldHVwIG5ldyBoZWFkZXIgaW5mb3JtYXRpb24gaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorCQkvLyAgICBpdHNlbGYKKwkJcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSA9IHVsU2hNZW1TaXplOworCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQgPSAxOworCQlwU2hiTWVtSGVhZGVyLT5tX2lCdWZmZXJJZCA9IGlCdWZmZXJJZDsKKwkJLy8gaW5pdGlhbGl6ZSBzcGlubG9jaworCQlzcGluX2xvY2tfaW5pdCgmcFNoYk1lbUhlYWRlci0+bV9TcGlubG9ja0J1ZmZBY2Nlc3MpOworCQkvLyBpbml0aWFsaXplIHdhaXQgcXVldWVzCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlTmV3RGF0YSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlSm9iUmVhZHkpOworCX0gZWxzZSB7CisJCS8vIGFueSBvdGhlciBwcm9jZXNzIGhhcyBjcmVhdGVkIHRoZSBzaGFyZWQgbWVtb3J5IGFuZCB0aGlzCisJCS8vIHByb2Nlc3Mgb25seSBoYXMgdG8gYXR0YWNoIHRvIGl0CisJCS8vIC0+IGNoZWNrIGFuZCB1cGRhdGUgZXhpc3RpbmcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUKKwkJLy8gICAgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmCisJCWlmIChwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplICE9IHVsU2hNZW1TaXplKSB7CisJCQlTaGJFcnJvciA9IGtTaGJPcGVuTWlzbWF0Y2g7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcFNoYk1lbUhlYWRlci0+bV91bFJlZkNvdW50Kys7CisJfQorCisgICAgICBFeGl0OgorCXBTaGJJbnN0YW5jZSA9ICh0U2hiSW5zdGFuY2UgKikgcFNoYk1lbUluc3Q7CisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoTWVtTmV3Q3JlYXRlZDsKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVsZWFzZSBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisKKwlERUJVR19MVkxfMjZfVFJBQ0UxKCJTaGJJcGNSZWxlYXNlQnVmZmVyKCVwKVxuIiwgcFNoYkluc3RhbmNlX3ApOworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYk9rKTsKKwl9CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCS8vIHN0b3AgdGhyZWFkcyBpbiBhbnkgY2FzZSwgYmVjYXVzZSB0aGV5IGFyZSBib3VuZCB0byB0aGF0IHNwZWNpZmljIGluc3RhbmNlCisJU2hiRXJyb3IyID0gU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCS8vIGQuay46IFdoYXRzIHVwIHdpdGggSm9iUmVhZHkgdGhyZWFkPworCS8vICAgICAgIEp1c3Qgd2FrZSBpdCB1cCwgYnV0IHdpdGhvdXQgc2V0dGluZyB0aGUgc2VtYXBob3JlIHZhcmlhYmxlCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZUpvYlJlYWR5KTsKKworCWlmICghLS1wU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCS8vIGRlbGV0ZSBtZW0gdGFibGUgZWxlbWVudAorCQlTaGJJcGNEZWxldGVMaXN0RWxlbWVudChwU2hiTWVtSGVhZGVyLT5tX2lCdWZmZXJJZCk7CisJCS8vIGRlbGV0ZSBzaGFyZWQgbWVtCisJCWtmcmVlKHBTaGJNZW1JbnN0LT5tX3BTaGJNZW1IZWFkZXIpOworCX0gZWxzZSB7CisJCVNoYkVycm9yID0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3M7CisJfQorCS8vZGVsZXRlIHByaXZhdCBtZW0KKwlrZnJlZShwU2hiTWVtSW5zdCk7CisJcmV0dXJuIChTaGJFcnJvcik7Cit9CisKKyNlbmRpZiAvLyAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hCSVBDX0lOTElORUQpKSB8fCBkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBFbnRlciBhdG9taWMgc2VjdGlvbiBmb3IgU2hhcmVkIEJ1ZmZlciBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiZW50ZXIgYXRvbWljXG4iKTsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJLy8gbG9jayBpbnRlcnJ1cHRzCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBTaGJNZW1IZWFkZXItPm1fU3BpbmxvY2tCdWZmQWNjZXNzLAorCQkJICBwU2hiTWVtSW5zdC0+bV91bEZsYWdzQnVmZkFjY2Vzcyk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTGVhdmUgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0xlYXZlQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisJLy8gdW5sb2NrIGludGVycnVwdHMKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwU2hiTWVtSGVhZGVyLT5tX1NwaW5sb2NrQnVmZkFjY2VzcywKKwkJCSAgICAgICBwU2hiTWVtSW5zdC0+bV91bEZsYWdzQnVmZkFjY2Vzcyk7CisKKyAgICAgIEV4aXQ6CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiTGVhdmUgQXRvbWljIFxuIik7CisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RhcnQgc2lnbmFsaW5nIG9mIG5ldyBkYXRhIChjYWxsZWQgZnJvbSByZWFkaW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICAgICAgdFNpZ0huZGxyTmV3RGF0YQorCQkJCQkJICAgICAgcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCwKKwkJCQkJCSAgICAgIHRTaGJQcmlvcml0eQorCQkJCQkJICAgICAgU2hiUHJpb3JpdHlfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCItLS0tLS0tPlNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YVxuIik7CisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKChwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkICE9IElOVkFMSURfSUQpCisJICAgIHx8IChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKwlERUJVR19MVkxfMjZfVFJBQ0UyCisJICAgICgiU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKCVwKSBtX3BmblNpZ0huZGxyTmV3RGF0YSA9ICVwXG4iLAorCSAgICAgcFNoYkluc3RhbmNlX3AsIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3ApOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3A7CisJcFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSA9IEZBTFNFOworCXBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9IDA7CisKKwlzd2l0Y2ggKFNoYlByaW9yaXR5X3ApIHsKKwljYXNlIGtTaGJQcmlvcml0eUxvdzoKKwkJcFNoYk1lbUluc3QtPm1fbFRocmVhZE5ld0RhdGFOaWNlID0gLTI7CisJCWJyZWFrOworCisJY2FzZSBrU2hiUHJpb3JpdHlOb3JtYWw6CisJCXBTaGJNZW1JbnN0LT5tX2xUaHJlYWROZXdEYXRhTmljZSA9IC05OworCQlicmVhazsKKworCWNhc2Uga3NoYlByaW9yaXR5SGlnaDoKKwkJcFNoYk1lbUluc3QtPm1fbFRocmVhZE5ld0RhdGFOaWNlID0gLTIwOworCQlicmVhazsKKworCX0KKworCS8vY3JlYXRlIHRocmVhZCBmb3Igc2lnbmFsbGluZyBuZXcgZGF0YQorCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQgPQorCSAgICBrZXJuZWxfdGhyZWFkKFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEsIHBTaGJJbnN0YW5jZV9wLAorCQkJICBDTE9ORV9LRVJORUwpOworCisgICAgICBFeGl0OgorCXJldHVybiBTaGJFcnJvcjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0b3Agc2lnbmFsaW5nIG9mIG5ldyBkYXRhIChjYWxsZWQgZnJvbSByZWFkaW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICBwU2hiSW5zdGFuY2VfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCItLS0tLS0tPlNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhXG4iKTsKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJU2hiRXJyb3IgPSBrU2hiT2s7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCURFQlVHX0xWTF8yNl9UUkFDRTIKKwkgICAgKCJTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSglcCkgcGZuU2lnbkhuZGxyTmV3RGF0YT0lcFxuIiwKKwkgICAgIHBTaGJJbnN0YW5jZV9wLCBwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEpOworCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgewkvLyBzaWduYWwgaGFuZGxlciB3YXMgc2V0IGJlZm9yZQorCQlpbnQgaUVycjsKKwkJLy9zZXQgdGVybWluYXRpb24gZmxhZyBpbiBtZW0gaGVhZGVyCisJCXBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9IDE7CisKKwkJLy8gY2hlY2sgaWYgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcgYXQgYWxsIGJ5IHNlbmRpbmcgdGhlIG51bGwtc2lnbmFsIHRvIHRoaXMgdGhyZWFkCisJCS8qIGlFcnIgPSBraWxsX3Byb2MocFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCwgMCwgMSk7ICovCisJCWlFcnIgPSBzZW5kX3NpZygwLCBwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkLCAxKTsKKwkJaWYgKGlFcnIgPT0gMCkgeworCQkJLy8gd2FrZSB1cCB0aHJlYWQsIGJlY2F1c2UgaXQgaXMgc3RpbGwgcnVubmluZworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwU2hiTWVtSGVhZGVyLT4KKwkJCQkJICAgICAgbV9XYWl0UXVldWVOZXdEYXRhKTsKKworCQkJLy93YWl0IGZvciB0ZXJtaW5hdGlvbiBvZiB0aHJlYWQKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBTaGJNZW1JbnN0LT5tX0NvbXBsZXRpb25OZXdEYXRhKTsKKwkJfQorCisJCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQgPSBJTlZBTElEX0lEOworCX0KKworCXJldHVybiBTaGJFcnJvcjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFNpZ25hbCBuZXcgZGF0YSAoY2FsbGVkIGZyb20gd3JpdGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTaWduYWxOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCXBTaGJNZW1IZWFkZXIgPQorCSAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIoU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkpOworCS8vc2V0IHNlbWFwaG9yZQorCXBTaGJNZW1IZWFkZXItPm1fZk5ld0RhdGEgPSBUUlVFOworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY1NpZ25hbE5ld0RhdGEgc2V0IFNlbSAtPiBOZXcgRGF0YVxuIik7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlTmV3RGF0YSk7CisJcmV0dXJuIChrU2hiT2spOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBmb3Igam9iIHJlYWR5IChjYWxsZWQgZnJvbSB3YWl0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZworCQkJCQkJICAgICAgIHVsVGltZU91dF9wLAorCQkJCQkJICAgICAgIHRTaWdIbmRsckpvYlJlYWR5CisJCQkJCQkgICAgICAgcGZuU2lnbmFsSGFuZGxlckpvYlJlYWR5X3ApCit7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocGZuU2lnbmFsSGFuZGxlckpvYlJlYWR5X3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwlTaGJFcnJvciA9IGtTaGJPazsKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX3RUaHJlYWRKb2JSZWFkeUlkICE9IElOVkFMSURfSUQpCisJICAgIHx8IChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisJcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgPSB1bFRpbWVPdXRfcDsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gcGZuU2lnbmFsSGFuZGxlckpvYlJlYWR5X3A7CisJcFNoYk1lbUhlYWRlci0+bV9mSm9iUmVhZHkgPSBGQUxTRTsKKwkvL2NyZWF0ZSB0aHJlYWQgZm9yIHNpZ25hbGxpbmcgbmV3IGRhdGEKKwlwU2hiTWVtSW5zdC0+bV90VGhyZWFkSm9iUmVhZHlJZCA9CisJICAgIGtlcm5lbF90aHJlYWQoU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHksIHBTaGJJbnN0YW5jZV9wLAorCQkJICBDTE9ORV9LRVJORUwpOworICAgICAgRXhpdDoKKwlyZXR1cm4gU2hiRXJyb3I7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gZXhlY3V0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbEpvYlJlYWR5KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjU2lnbmFsSm9iUmVhZHlcbiIpOworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKwlwU2hiTWVtSGVhZGVyID0KKwkgICAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyKFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApKTsKKwkvL3NldCBzZW1hcGhvcmUKKwlwU2hiTWVtSGVhZGVyLT5tX2ZKb2JSZWFkeSA9IFRSVUU7CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjU2lnbmFsSm9iUmVhZHkgc2V0IFNlbSAtPiBKb2IgUmVhZHkgXG4iKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSk7CisJcmV0dXJuIChrU2hiT2spOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIGNvbW1vbiB1c2VkIHNoYXJlIG1lbW9yeSBhcmVhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCAqU2hiSXBjR2V0U2hNZW1QdHIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl2b2lkICpwU2hiU2hNZW1QdHI7CisKKwlwU2hiTWVtSGVhZGVyID0KKwkgICAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyKFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApKTsKKwlpZiAocFNoYk1lbUhlYWRlciAhPSBOVUxMKSB7CisJCXBTaGJTaE1lbVB0ciA9IChCWVRFICopIHBTaGJNZW1IZWFkZXIgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisJfSBlbHNlIHsKKwkJcFNoYlNoTWVtUHRyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHBTaGJTaE1lbVB0cik7CisKK30KKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKnRTaGJNZW1JbnN0KiAgU2hiSXBjR2V0U2hiTWVtSW5zdCAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCit0U2hiTWVtSW5zdCogIHBTaGJNZW1JbnN0OworCisgICAgcFNoYk1lbUluc3QgPSAodFNoYk1lbUluc3QqKXBTaGJJbnN0YW5jZV9wOworCisgICAgcmV0dXJuIChwU2hiTWVtSW5zdCk7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qdFNoYk1lbUhlYWRlciogIFNoYklwY0dldFNoYk1lbUhlYWRlciAoCisgICAgdFNoYk1lbUluc3QqIHBTaGJNZW1JbnN0X3ApCit7CisKK3RTaGJNZW1IZWFkZXIqICBwU2hiTWVtSGVhZGVyOworCisgICAgcFNoYk1lbUhlYWRlciA9IHBTaGJNZW1JbnN0X3AtPm1fcFNoYk1lbUhlYWRlcjsKKworICAgIHJldHVybiAocFNoYk1lbUhlYWRlcik7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBwcm9jZXNzIHNwZWNpZmljIG1lbXBvb2wKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCkKK3sKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdm9pZCAqcE1lbTsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIlNoYklwY0FsbG9jUHJpdmF0ZU1lbSBcbiIpOworCS8vZ2V0IHByaXZhdGUgbWVtCisJcE1lbSA9IGttYWxsb2ModWxNZW1TaXplX3AsIEdGUF9LRVJORUwpOworCWlmIChwTWVtID09IE5VTEwpIHsKKwkJLy91bmFibGUgdG8gY3JlYXRlIG1lbQorCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKyAgICAgIEV4aXQ6CisJcmV0dXJuIChwTWVtKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFRocmVhZCBmb3IgbmV3IGRhdGEgc2lnbmFsaW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSh2b2lkICpwdlRocmVhZFBhcmFtX3ApCit7CisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwlpbnQgaVJldFZhbCA9IC0xOworCWludCBmQ2FsbEFnYWluOworCisJZGFlbW9uaXplKCJTaGJORCVwIiwgcHZUaHJlYWRQYXJhbV9wKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJcFNoYkluc3RhbmNlID0gKHRTaGJNZW1JbnN0ICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCURFQlVHX0xWTF8yNl9UUkFDRTEoIlNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoJXApXG4iLCBwdlRocmVhZFBhcmFtX3ApOworCisJc2V0X3VzZXJfbmljZShjdXJyZW50LCBwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UpOworCisvLyAgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTEoIlNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEgd2FpdCBmb3IgTmV3IERhdGEgU2VtICVwXG4iLHBTaGJNZW1JbnN0LT5tX3BTZW1OZXdEYXRhKTsKKwlkbyB7CisJCWlSZXRWYWwgPQorCQkgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlTmV3RGF0YSwKKwkJCQkJICAgICAocFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnICE9CisJCQkJCSAgICAgIDApCisJCQkJCSAgICAgfHwgKHBTaGJNZW1IZWFkZXItPm1fZk5ld0RhdGEgIT0KKwkJCQkJCSBGQUxTRSkpOworCisJCWlmIChpUmV0VmFsICE9IDApIHsJLy8gc2lnbmFsIHBlbmRpbmcKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBTaGJNZW1IZWFkZXItPm1fZk5ld0RhdGEgIT0gRkFMU0UpIHsKKwkJCXBTaGJNZW1IZWFkZXItPm1fZk5ld0RhdGEgPSBGQUxTRTsKKwkJCWRvIHsKKwkJCQlmQ2FsbEFnYWluID0KKwkJCQkgICAgcFNoYk1lbUluc3QtPgorCQkJCSAgICBtX3BmblNpZ0huZGxyTmV3RGF0YShwU2hiSW5zdGFuY2UpOworCQkJCS8vIGNhbGwgc2NoZWR1bGVyLCB3aGljaCB3aWxsIGV4ZWN1dGUgYW55IHRhc2sgd2l0aCBoaWdoZXIgcHJpb3JpdHkKKwkJCQlzY2hlZHVsZSgpOworCQkJfSB3aGlsZSAoZkNhbGxBZ2FpbiAhPSBGQUxTRSk7CisJCX0KKwl9IHdoaWxlIChwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgPT0gMCk7CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSB0ZXJtaW5hdGVkIFxuIik7CisJLy9zZXQgdGhyZWFkIGNvbXBsZXRlZAorCWNvbXBsZXRlX2FuZF9leGl0KCZwU2hiTWVtSW5zdC0+bV9Db21wbGV0aW9uTmV3RGF0YSwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBKb2IgUmVhZHkgc2lnbmFsaW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkodm9pZCAqcHZUaHJlYWRQYXJhbV9wKQoreworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJbG9uZyBsVGltZU91dDsKKwlpbnQgaVJldFZhbCA9IC0xOworCisJZGFlbW9uaXplKCJTaGJKUiVwIiwgcHZUaHJlYWRQYXJhbV9wKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJcFNoYkluc3RhbmNlID0gKHRTaGJNZW1JbnN0ICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAKKwkgICAgKCJTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSB3YWl0IGZvciBqb2IgcmVhZHkgU2VtXG4iKTsKKwlpZiAocFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgIT0gMCkgeworCQlsVGltZU91dCA9IChsb25nKXBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5OworCQkvL3dhaXQgZm9yIGpvYiByZWFkeSBzZW1hcGhvcmUKKwkJaVJldFZhbCA9CisJCSAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwU2hiTWVtSGVhZGVyLT4KKwkJCQkJCSAgICAgbV9XYWl0UXVldWVKb2JSZWFkeSwKKwkJCQkJCSAgICAgKHBTaGJNZW1IZWFkZXItPgorCQkJCQkJICAgICAgbV9mSm9iUmVhZHkgIT0gRkFMU0UpLAorCQkJCQkJICAgICBsVGltZU91dCk7CisJfSBlbHNlIHsKKwkJLy93YWl0IGZvciBqb2IgcmVhZHkgc2VtYXBob3JlCisJCWlSZXRWYWwgPQorCQkgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlSm9iUmVhZHksCisJCQkJCSAgICAgKHBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5ICE9CisJCQkJCSAgICAgIEZBTFNFKSk7CisJfQorCisJaWYgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgIT0gTlVMTCkgeworCQkvL2NhbGwgSGFuZGxlcgorCQlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5KHBTaGJJbnN0YW5jZSwKKwkJCQkJCSAgICFwU2hiTWVtSGVhZGVyLT5tX2ZKb2JSZWFkeSk7CisJfQorCisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8vQnVpbGQgdGhlIGNyYyB0YWJsZQorc3RhdGljIHZvaWQgU2hiSXBjQ3JjMzJHZW5UYWJsZSh1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl0pCit7CisJdW5zaWduZWQgbG9uZyB1bENyYywgdWxQb2x5OworCWludCBpSW5kZXhJLCBpSW5kZXhKOworCisJdWxQb2x5ID0gMHhFREI4ODMyMEw7CisJZm9yIChpSW5kZXhJID0gMDsgaUluZGV4SSA8IDI1NjsgaUluZGV4SSsrKSB7CisJCXVsQ3JjID0gaUluZGV4STsKKwkJZm9yIChpSW5kZXhKID0gODsgaUluZGV4SiA+IDA7IGlJbmRleEotLSkgeworCQkJaWYgKHVsQ3JjICYgMSkgeworCQkJCXVsQ3JjID0gKHVsQ3JjID4+IDEpIF4gdWxQb2x5OworCQkJfSBlbHNlIHsKKwkJCQl1bENyYyA+Pj0gMTsKKwkJCX0KKwkJfQorCQlhdWxDcmNUYWJsZVtpSW5kZXhJXSA9IHVsQ3JjOworCX0KK30KKworLy9DYWxjdWxhdGUgdGhlIGNyYyB2YWx1ZQorc3RhdGljIHVuc2lnbmVkIGxvbmcgU2hiSXBjQ3JjMzJHZXRDcmMoY29uc3QgY2hhciAqcGNTdHJpbmcsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XSkKK3sKKwl1bnNpZ25lZCBsb25nIHVsQ3JjOworCWludCBpSW5kZXg7CisKKwl1bENyYyA9IDB4RkZGRkZGRkY7CisJZm9yIChpSW5kZXggPSAwOyBpSW5kZXggPCBzdHJsZW4ocGNTdHJpbmcpOyBpSW5kZXgrKykgeworCQl1bENyYyA9CisJCSAgICAoKHVsQ3JjID4+IDgpICYgMHgwMEZGRkZGRikgXgorCQkgICAgYXVsQ3JjVGFibGVbKHVsQ3JjIF4gcGNTdHJpbmdbaUluZGV4XSkgJiAweEZGXTsKKwl9CisJcmV0dXJuICh1bENyYyBeIDB4RkZGRkZGRkYpOworCit9CisKK3N0YXRpYyB2b2lkIFNoYklwY0FwcGVuZExpc3RFbGVtZW50KHN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTmV3TWVtVGFibGVFbGVtZW50KQoreworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50ID0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nOworCXBzTmV3TWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCA9IE5VTEw7CisKKwlpZiAocHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nICE9IE5VTEwpIHsJLyogc2luZCBFbGVtZW50ZSB2b3JoYW5kZW4gKi8KKwkJd2hpbGUgKHBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCAhPSBOVUxMKSB7CS8qIHN1Y2hlIGRhcyBsZXR6dGUgRWxlbWVudCAqLworCQkJcHNNZW1UYWJsZUVsZW1lbnQgPQorCQkJICAgIHBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKKwkJfQorCQlwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgPSBwc05ld01lbVRhYmxlRWxlbWVudDsJLyogIEhhZW5nZSBkYXMgRWxlbWVudCBoaW50ZW4gYW4gKi8KKwl9IGVsc2UgewkJLyogd2VubiBkaWUgbGlzdGUgbGVlciBpc3QsIGJpbiBpY2ggZGFzIGVyc3RlIEVsZW1lbnQgKi8KKwkJcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nID0gcHNOZXdNZW1UYWJsZUVsZW1lbnQ7CisJfQorfQorCitzdGF0aWMgaW50IFNoYklwY0ZpbmRMaXN0RWxlbWVudChpbnQgaUJ1ZmZlcklkLAorCQkJCSBzdHJ1Y3Qgc1NoYk1lbVRhYmxlICoqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KQoreworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50ID0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nOworCXdoaWxlIChwc01lbVRhYmxlRWxlbWVudCAhPSBOVUxMKSB7CisJCWlmIChwc01lbVRhYmxlRWxlbWVudC0+bV9pQnVmZmVySWQgPT0gaUJ1ZmZlcklkKSB7CisvL3ByaW50aygiU2hiSXBjRmluZExpc3RFbGVtZW50IEJ1ZmZlciBhdDolcCBJZDolZFxuIixwc01lbVRhYmxlRWxlbWVudC0+bV9wQnVmZmVyLHBzTWVtVGFibGVFbGVtZW50LT5tX2lCdWZmZXJJZCk7CisJCQkqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50ID0gcHNNZW1UYWJsZUVsZW1lbnQ7CisvL3ByaW50aygiU2hiSXBjRmluZExpc3RFbGVtZW50IEJ1ZmZlciBhdDolcCBJZDolZFxuIiwoKnBwc1JldHVybk1lbVRhYmxlRWxlbWVudCktPm1fcEJ1ZmZlciwoKnBwc1JldHVybk1lbVRhYmxlRWxlbWVudCktPm1faUJ1ZmZlcklkKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBzTWVtVGFibGVFbGVtZW50ID0gcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIFNoYklwY0RlbGV0ZUxpc3RFbGVtZW50KGludCBpQnVmZmVySWQpCit7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnRPbGQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJaWYgKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsKKwkJd2hpbGUgKChwc01lbVRhYmxlRWxlbWVudCAhPSBOVUxMKQorCQkgICAgICAgJiYgKHBzTWVtVGFibGVFbGVtZW50LT5tX2lCdWZmZXJJZCAhPSBpQnVmZmVySWQpKSB7CisJCQlwc01lbVRhYmxlRWxlbWVudE9sZCA9IHBzTWVtVGFibGVFbGVtZW50OworCQkJcHNNZW1UYWJsZUVsZW1lbnQgPQorCQkJICAgIHBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKKwkJfQorCQlpZiAocHNNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkgeworCQkJaWYgKHBzTWVtVGFibGVFbGVtZW50ICE9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZykgeworCQkJCXBzTWVtVGFibGVFbGVtZW50T2xkLT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCA9CisJCQkJICAgIHBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKKwkJCQlrZnJlZShwc01lbVRhYmxlRWxlbWVudCk7CisJCQl9IGVsc2UgeworCQkJCWtmcmVlKHBzTWVtVGFibGVFbGVtZW50KTsKKwkJCQlwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgPSBOVUxMOworCQkJfQorCisJCX0KKwl9CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1XaW4zMi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtV2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE4MTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLVdpbjMyLmMKQEAgLTAsMCArMSwxMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAoSW1wbGVtZW50YXRpb24gZm9yIFdpbjMyKQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFdJTlZFUiAgICAgICAweDA0MDAJLy8gI2RlZmluZXMgbmVjZXNzYXJ5IGZvciB1c2FnZSBvZgorI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCS8vIGZ1bmN0aW9uIDxTaWduYWxPYmplY3RBbmRXYWl0PgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAic2hhcmVkYnVmZi5oIgorI2luY2x1ZGUgInNoYmlwYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25zdGFudCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfTEVOX0JVRkZFUl9JRCAgICAgICBNQVhfUEFUSAorCisjZGVmaW5lIElEWF9FVkVOVF9ORVdfREFUQSAgICAgIDAKKyNkZWZpbmUgSURYX0VWRU5UX1RFUk1fUkVRVSAgICAgMQorI2RlZmluZSBJRFhfRVZFTlRfVEVSTV9SRVNQICAgICAyCisKKyNkZWZpbmUgTkFNRV9NVVRFWF9CVUZGX0FDQ0VTUyAgIkJ1ZmZBY2Nlc3MiCisjZGVmaW5lIE5BTUVfRVZFTlRfTkVXX0RBVEEgICAgICJOZXdEYXRhIgorI2RlZmluZSBOQU1FX0VWRU5UX1RFUk1fUkVRVSAgICAiVGVybVJlcXUiCisjZGVmaW5lIE5BTUVfRVZFTlRfVEVSTV9SRVNQICAgICJUZXJtUmVzcCIKKyNkZWZpbmUgTkFNRV9FVkVOVF9KT0JfUkVBRFkgICAgIkpvYlJlYWR5IgorCisjZGVmaW5lIFRJTUVPVVRfRU5URVJfQVRPTUlDICAgIDEwMDAJLy8gZm9yIGRlYmdnaW5nOiBJTkZJTklURQorI2RlZmluZSBUSU1FT1VUX1RFUk1fVEhSRUFEICAgICAyMDAwCisKKyNkZWZpbmUgU0JJX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDkyQgkvLyBtYWdpYyBJRCAoIlNCSSsiKQorI2RlZmluZSBTQkhfTUFHSUNfSUQgICAgICAgICAgICAweDUzNDI0ODJBCS8vIG1hZ2ljIElEICgiU0JIKiIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBjb21tb24gaGVhZGVyIGZvciB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gdXNlZAorLy8gYnkgYWxsIHByb2Nlc3NlcyBhdHRhY2hlZCB0aGlzIHNoYXJlZCBtZW1vcnkuIEl0IGluY2x1ZGVzIGNvbW1vbgorLy8gaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkIGJ1ZmZlciBmcm9tIGEgY291cGxlIG9mCisvLyBzZXBhcmF0ZWQgcHJvY2Vzc2VzIChlLmcuIHRoZSByZWZlcm5jZSBjb3VudGVyKS4gVGhpcyBzdHJ1Y3R1cmUgaXMKKy8vIGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBpdHNlbGYgYW5kIGV4aXN0cworLy8gY29uc2VxdWVudGx5IG9ubHkgb25lIHRpbWVzIHBlciBzaGFyZWQgbWVtb3J5IGluc3RhbmNlLgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TYmhNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCXVuc2lnbmVkIGxvbmcgbV91bFNoTWVtU2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1fdWxSZWZDb3VudDsKKwljaGFyIG1fc3pCdWZmZXJJRFtNQVhfTEVOX0JVRkZFUl9JRF07CisKKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsT3duZXJQcm9jSUQ7CisjZW5kaWYKKworfSB0U2hiTWVtSGVhZGVyOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgImV4dGVybmFsIGVudHJ5IHBvaW50IiBmcm9tIGEgc2VwYXJhdGUgcHJvY2VzcworLy8gdG8gZ2V0IGFjY2VzcyB0byBhIHNoYXJlZCBidWZmZXIuIFRoaXMgc3RydWN0dXJlIGluY2x1ZGVzIGFsbCBwbGF0Zm9ybQorLy8gcmVzcC4gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZAorLy8gYnVmZmVyIGZyb20gYSBzZXBhcmF0ZSBwcm9jZXNzLiBFdmVyeSBwcm9jZXNzIGF0dGFjaGVkIHRvIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBoYXMgaXRzIG93biBydW50aW1lIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggaXRzIGluZGl2aWR1YWwKKy8vIHJ1bnRpbWUgZGF0YSAoZS5nLiB0aGUgc2NvcGUgb2YgYW4gZXZlbnQgaGFuZGxlIGlzIGxpbWl0dGVkIHRvIHRoZQorLy8gb3duZXIgcHJvY2VzcyBvbmx5KS4gVGhlIHN0cnVjdHVyZSBtZW1iZXIgPG1fcFNoYk1lbUhlYWRlcj4gcG9pbnRzCisvLyB0byB0aGUgKHByb2Nlc3Mgc3BlY2lmaWMpIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCisvLyBpdHNlbGYuCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX1NiaU1hZ2ljSUQ7CS8vIG1hZ2ljIElEICgiU0JJKyIpCisJSEFORExFIG1faFNoYXJlZE1lbTsKKwlIQU5ETEUgbV9oTXV0ZXhCdWZmQWNjZXNzOworCUhBTkRMRSBtX2hUaHJlYWROZXdEYXRhOwkvLyB0aHJhZWQgdG8gc2lnbmFsIHRoYXQgbmV3IGRhdGEgYXJlIGF2YWlsYWJsZQorCUhBTkRMRSBtX2FoRXZlbnROZXdEYXRhWzNdOwkvLyBJRFhfRVZFTlRfTkVXX0RBVEEgKyBJRFhfRVZFTlRfVEVSTV9SRVFVICsgSURfRVZFTlRfVEVSTV9SRVNQCisJdFNpZ0huZGxyTmV3RGF0YSBtX3BmblNpZ0huZGxyTmV3RGF0YTsKKwlIQU5ETEUgbV9oVGhyZWFkSm9iUmVhZHk7CS8vIHRocmVhZCB0byBzaWduYWwgdGhhdCBhIGpvYi9vcGVyYXRpb24gaXMgcmVhZHkgbm93IChlLmcuIHJlc2V0IGJ1ZmZlcikKKwlIQU5ETEUgbV9oRXZlbnRKb2JSZWFkeTsKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJdFNpZ0huZGxySm9iUmVhZHkgbV9wZm5TaWdIbmRsckpvYlJlYWR5OworCXRTaGJNZW1IZWFkZXIgKm1fcFNoYk1lbUhlYWRlcjsKKworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxUaHJlYWRJRE5ld0RhdGE7CisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSURKb2JSZWFkeTsKKyNlbmRpZgorCit9IHRTaGJNZW1JbnN0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdsb2JhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMgb2YgaW50ZXJuYWwgZnVuY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYk1lbUluc3QgKlNoYklwY0dldFNoYk1lbUluc3QodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCisJcFNoYk1lbUluc3QgPSAodFNoYk1lbUluc3QgKikgcFNoYkluc3RhbmNlX3A7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgPT0gU0JJX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYk1lbUluc3QpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiTWVtSGVhZGVyICpTaGJJcGNHZXRTaGJNZW1IZWFkZXIodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSW5zdC0+bV9wU2hiTWVtSGVhZGVyOworCUFTU0VSVChwU2hiTWVtSGVhZGVyLT5tX1NiaE1hZ2ljSUQgPT0gU0JIX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYk1lbUhlYWRlcik7CisKK30KKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitEV09SRCBXSU5BUEkgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKTsKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKTsKK2NvbnN0IGNoYXIgKlNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKGNvbnN0IGNoYXIgKnBzekV2ZW50Sm9iTmFtZV9wLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBCT09MIGZHbG9iYWxPYmplY3RfcCk7CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorLy8gdHJ1ZSBpbnRlcm5hbCBmdW5jdGlvbnMgKG5vdCBpbmxpbmVkKQorc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKTsKK3N0YXRpYyB2b2lkIFNoYklwY1JlbGVhc2VQcml2YXRlTWVtKHZvaWQgKnBNZW1fcCk7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNJbml0KHZvaWQpCit7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWluaXRpYWxpemUgSVBDIGZvciBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0V4aXQodm9pZCkKK3sKKworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisKKwlIQU5ETEUgaFNoYXJlZE1lbTsKKwlMUFZPSUQgcFNoYXJlZE1lbTsKKwl1bnNpZ25lZCBsb25nIHVsU2hNZW1TaXplOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdW5zaWduZWQgaW50IGZTaE1lbU5ld0NyZWF0ZWQ7CisJY29uc3QgY2hhciAqcHN6T2JqZWN0TmFtZTsKKwlIQU5ETEUgaE11dGV4QnVmZkFjY2VzczsKKwlIQU5ETEUgaEV2ZW50TmV3RGF0YTsKKwlIQU5ETEUgaEV2ZW50Sm9iUmVhZHk7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJdWxTaE1lbVNpemUgPSB1bEJ1ZmZlclNpemVfcCArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwlwU2hhcmVkTWVtID0gTlVMTDsKKwlwU2hiSW5zdGFuY2UgPSBOVUxMOworCWZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gKDEpIG9wZW4gYW4gZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IHNoYXJlZCBtZW1vcnkKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIHRyeSB0byBvcGVuIGFuIGFscmVhZHkgZXhpc3Rpbmcgc2hhcmVkIG1lbW9yeQorCS8vIChjcmVhdGVkIGJ5IGFuIGFub3RoZXIgcHJvY2VzcykKKwloU2hhcmVkTWVtID0gT3BlbkZpbGVNYXBwaW5nKEZJTEVfTUFQX0FMTF9BQ0NFU1MsCS8vIERXT1JEIGR3RGVzaXJlZEFjY2VzcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaGVyaXRIYW5kbGUKKwkJCQkgICAgIHBzekJ1ZmZlcklEX3ApOwkvLyBMUENUU1RSIGxwTmFtZQorCWlmIChoU2hhcmVkTWVtICE9IE5VTEwpIHsKKwkJLy8gYSBzaGFyZWQgbWVtb3J5IGFscmVhZHkgZXhpc3RzCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvLyBpdCBzZWFtcyB0aGF0IHRoaXMgcHJvY2VzcyBpcyB0aGUgZmlyc3Qgd2hvIHdhbnRzIHRvIHVzZSB0aGUKKwkJLy8gc2hhcmVkIG1lbW9yeSwgc28gaXQgaGFzIHRvIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJCWhTaGFyZWRNZW0gPSBDcmVhdGVGaWxlTWFwcGluZyhJTlZBTElEX0hBTkRMRV9WQUxVRSwJLy8gSEFORExFIGhGaWxlCisJCQkJCSAgICAgICBOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBBdHRyaWJ1dGVzCisJCQkJCSAgICAgICBQQUdFX1JFQURXUklURSwJLy8gRFdPUkQgZmxQcm90ZWN0CisJCQkJCSAgICAgICAwLAkvLyBEV09SRCBkd01heGltdW1TaXplSGlnaAorCQkJCQkgICAgICAgdWxTaE1lbVNpemUsCS8vIERXT1JEIGR3TWF4aW11bVNpemVMb3cKKwkJCQkJICAgICAgIHBzekJ1ZmZlcklEX3ApOwkvLyBMUENUU1RSIGxwTmFtZQorCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBUUlVFOworCX0KKworCWlmIChoU2hhcmVkTWVtID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgyKSBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBtZW1vcnkKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXBTaGFyZWRNZW0gPSBNYXBWaWV3T2ZGaWxlKGhTaGFyZWRNZW0sCS8vIEhBTkRMRSBoRmlsZU1hcHBpbmdPYmplY3QKKwkJCQkgICBGSUxFX01BUF9BTExfQUNDRVNTLAkvLyBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsCisJCQkJICAgMCwJLy8gRFdPUkQgZHdGaWxlT2Zmc2V0SGlnaCwKKwkJCQkgICAwLAkvLyBEV09SRCBkd0ZpbGVPZmZzZXRMb3csCisJCQkJICAgdWxTaE1lbVNpemUpOwkvLyBTSVpFX1QgZHdOdW1iZXJPZkJ5dGVzVG9NYXAKKworCWlmIChwU2hhcmVkTWVtID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgzKSBzZXR1cCBvciB1cGRhdGUgaGVhZGVyIGFuZCBtYW5hZ2VtZW50IGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwU2hiTWVtSGVhZGVyID0gKHRTaGJNZW1IZWFkZXIgKikgcFNoYXJlZE1lbTsKKworCS8vIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sIHRvIHNhdmUKKwkvLyBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIKKwlwU2hiTWVtSW5zdCA9CisJICAgICh0U2hiTWVtSW5zdCAqKSBTaGJJcGNBbGxvY1ByaXZhdGVNZW0oc2l6ZW9mKHRTaGJNZW1JbnN0KSk7CisJaWYgKHBTaGJNZW1JbnN0ID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT3V0T2ZNZW07CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzZXQgY29tcGxldGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzCisJcFNoYk1lbUluc3QtPm1fU2JpTWFnaWNJRCA9IFNCSV9NQUdJQ19JRDsKKwlwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtID0gaFNoYXJlZE1lbTsKKwlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSA9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IDA7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlciA9IHBTaGJNZW1IZWFkZXI7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElETmV3RGF0YSA9IDA7CisJCXBTaGJNZW1JbnN0LT5tX3VsVGhyZWFkSURKb2JSZWFkeSA9IDA7CisJfQorI2VuZGlmCisKKwkvLyBjcmVhdGUgbXV0ZXggZm9yIGJ1ZmZlciBhY2Nlc3MKKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9NVVRFWF9CVUZGX0FDQ0VTUywgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaE11dGV4QnVmZkFjY2VzcyA9IENyZWF0ZU11dGV4KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscE11dGV4QXR0cmlidXRlcworCQkJCSAgICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbE93bmVyCisJCQkJICAgICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3MgPSBoTXV0ZXhCdWZmQWNjZXNzOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzICE9IE5VTEwpOworCisJLy8gVGhlIEV2ZW50TmV3RGF0YSBpcyB1c2VkIGZvciBzaWduYWxpbmcgb2YgbmV3IGRhdGEgYWZ0ZXIgYSB3cml0ZQorCS8vIG9wZXJhdGlvbiAoU2V0RXZlbnQpIGFzIHdlbGwgYXMgZm9yIHdhaXRpbmcgZm9yIG5ldyBkYXRhIG9uIHRoZQorCS8vIHJlYWRlciBzaWRlIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKS4gQmVjYXVzZSBpdCdzIG5vdCBrbm93biBpZgorCS8vIHRoaXMgcHJvY2VzcyB3aWxsIGJlIHJlYWQgb3Igd3JpdGUgZGF0YSwgdGhlIGV2ZW50IHdpbGwgYmUKKwkvLyBhbHdheXMgY3JlYXRlZCBoZXJlLgorCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX05FV19EQVRBLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBUUlVFKTsKKwloRXZlbnROZXdEYXRhID0gQ3JlYXRlRXZlbnQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwRXZlbnRBdHRyaWJ1dGVzCisJCQkJICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0gPSBoRXZlbnROZXdEYXRhOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdICE9IE5VTEwpOworCisJLy8gVGhlIEV2ZW50Sm9iUmVhZHkgaXMgdXNlZCBmb3Igc2lnbmFsaW5nIHRoYXQgYSBqb2IgaXMgZG9uZSAoU2V0RXZlbnQpCisJLy8gYXMgd2VsbCBhcyBmb3Igd2FpdGluZyBmb3IgZmluaXNoaW5nIG9mIGEgam9iIChXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKS4KKwkvLyBCZWNhdXNlIGl0J3Mgbm90IGtub3duIGlmIHRoaXMgcHJvY2VzcyB3aWxsIHNpZ25hbCBvciB3YWl0LCB0aGUgZXZlbnQKKwkvLyB3aWxsIGJlIGFsd2F5cyBjcmVhdGVkIGhlcmUuCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfRVZFTlRfSk9CX1JFQURZLCBwc3pCdWZmZXJJRF9wLAorCQkJCSAgICAgICBUUlVFKTsKKwloRXZlbnRKb2JSZWFkeSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYk1hbnVhbFJlc2V0CisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSA9IGhFdmVudEpvYlJlYWR5OworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBOVUxMKTsKKworCWlmIChmU2hNZW1OZXdDcmVhdGVkKSB7CisJCS8vIHRoaXMgcHJvY2VzcyB3YXMgdGhlIGZpcnN0IHdobyB3YW50ZWQgdG8gdXNlIHRoZSBzaGFyZWQgbWVtb3J5LAorCQkvLyBzbyBhIG5ldyBzaGFyZWQgbWVtb3J5IHdhcyBjcmVhdGVkCisJCS8vIC0+IHNldHVwIG5ldyBoZWFkZXIgaW5mb3JtYXRpb24gaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorCQkvLyAgICBpdHNlbGYKKwkJcFNoYk1lbUhlYWRlci0+bV9TYmhNYWdpY0lEID0gU0JIX01BR0lDX0lEOworCQlwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplID0gdWxTaE1lbVNpemU7CisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCA9IDE7CisJCXN0cm5jcHkocFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBwc3pCdWZmZXJJRF9wLAorCQkJc2l6ZW9mKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCkgLSAxKTsKKworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJcFNoYk1lbUhlYWRlci0+bV91bE93bmVyUHJvY0lEID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQkvLyBhbnkgb3RoZXIgcHJvY2VzcyBoYXMgY3JlYXRlZCB0aGUgc2hhcmVkIG1lbW9yeSBhbmQgdGhpcworCQkvLyBwcm9jZXNzIGhhcyBvbmx5IGF0dGFjaGVkIHRvIGl0CisJCS8vIC0+IGNoZWNrIGFuZCB1cGRhdGUgZXhpc3RpbmcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUKKwkJLy8gICAgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmCisJCWlmIChwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplICE9IHVsU2hNZW1TaXplKSB7CisJCQlTaGJFcnJvciA9IGtTaGJPcGVuTWlzbWF0Y2g7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCWlmIChzdHJuY21wCisJCQkgICAgKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgcHN6QnVmZmVySURfcCwKKwkJCSAgICAgc2l6ZW9mKHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCkgLSAxKSkgeworCQkJCVNoYkVycm9yID0ga1NoYk9wZW5NaXNtYXRjaDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCsrOworCX0KKworCS8vIHNldCBhYnN0YXJjdCAiaGFuZGxlIiBmb3IgcmV0dXJuaW5nIHRvIGFwcGxpY2F0aW9uCisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwU2hiTWVtSW5zdDsKKworICAgICAgRXhpdDoKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJaWYgKHBTaGJNZW1JbnN0ICE9IE5VTEwpIHsKKwkJCVNoYklwY1JlbGVhc2VQcml2YXRlTWVtKHBTaGJNZW1JbnN0KTsKKwkJfQorCQlpZiAocFNoYXJlZE1lbSAhPSBOVUxMKSB7CisJCQlVbm1hcFZpZXdPZkZpbGUocFNoYXJlZE1lbSk7CisJCX0KKwkJaWYgKGhTaGFyZWRNZW0gIT0gTlVMTCkgeworCQkJQ2xvc2VIYW5kbGUoaFNoYXJlZE1lbSk7CisJCX0KKwl9CisKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hNZW1OZXdDcmVhdGVkOworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY1JlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJPayk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghLS1wU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jczsKKwl9CisKKwlTaGJFcnJvcjIgPSBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJaEV2ZW50TmV3RGF0YSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV07CisJaWYgKGhFdmVudE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUoaEV2ZW50TmV3RGF0YSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0gPQorCQkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJaE11dGV4QnVmZkFjY2VzcyA9IHBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3M7CisJaWYgKGhNdXRleEJ1ZmZBY2Nlc3MgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUoaE11dGV4QnVmZkFjY2Vzcyk7CisJCXBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3MgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlVbm1hcFZpZXdPZkZpbGUocFNoYk1lbUhlYWRlcik7CisJaWYgKHBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1faFNoYXJlZE1lbSk7CisJCXBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbShwU2hiTWVtSW5zdCk7CisKKwlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCX0KKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZiAvLyAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hCSVBDX0lOTElORUQpKSB8fCBkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBFbnRlciBhdG9taWMgc2VjdGlvbiBmb3IgU2hhcmVkIEJ1ZmZlciBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlIQU5ETEUgaE11dGV4QnVmZkFjY2VzczsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzOworCWlmIChoTXV0ZXhCdWZmQWNjZXNzICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCWR3V2FpdFJlc3VsdCA9CisJCSAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhNdXRleEJ1ZmZBY2Nlc3MsIFRJTUVPVVRfRU5URVJfQVRPTUlDKTsKKwkJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFdBSVRfVElNRU9VVDoKKwkJCXsKKwkJCQlUUkFDRTAKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX1RJTUVPVVQiKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIFdBSVRfQUJBTkRPTkVEOgorCQkJeworCQkJCVRSQUNFMAorCQkJCSAgICAoIlxuU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKCk6IFdBSVRfQUJBTkRPTkVEIik7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX0ZBSUxFRDoKKwkJCXsKKwkJCQlUUkFDRTEKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX0ZBSUxFRCAtPiBMYXN0RXJyb3I9JWxkIiwKKwkJCQkgICAgIEdldExhc3RFcnJvcigpKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMQorCQkJCSAgICAoIlxuU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKCk6IHVua25vd24gZXJyb3IgLT4gTGFzdEVycm9yPSVsZCIsCisJCQkJICAgICBHZXRMYXN0RXJyb3IoKSk7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCX0KKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTGVhdmUgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0xlYXZlQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJQk9PTCBmUmVzOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwloTXV0ZXhCdWZmQWNjZXNzID0gcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzczsKKwlpZiAoaE11dGV4QnVmZkFjY2VzcyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlmUmVzID0gUmVsZWFzZU11dGV4KGhNdXRleEJ1ZmZBY2Nlc3MpOworCQlBU1NFUlQoZlJlcyk7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgICAgIHRTaWdIbmRsck5ld0RhdGEKKwkJCQkJCSAgICAgIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQkgICAgICB0U2hiUHJpb3JpdHkKKwkJCQkJCSAgICAgIFNoYlByaW9yaXR5X3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwljb25zdCBjaGFyICpwc3pPYmplY3ROYW1lOworCUhBTkRMRSBoRXZlbnRUZXJtUmVxdTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlc3A7CisJSEFORExFIGhUaHJlYWROZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJRE5ld0RhdGE7CisJdFNoYkVycm9yIFNoYkVycm9yOworCWludCBpUHJpb3JpdHk7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB8fAorCSAgICAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0KKwkgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0KKwkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJICAgIHx8IChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3A7CisKKwkvLyBCZWNhdXNlIHRoZSBldmVudCA8cFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXT4KKwkvLyBpcyB1c2VkIGZvciBzaWduYWxpbmcgb2YgbmV3IGRhdGEgYWZ0ZXIgYSB3cml0ZSBvcGVyYXRpb24gdG9vICh1c2luZworCS8vIFNldEV2ZW50KSwgaXQgaXMgYWx3YXlzIGNyZWF0ZWQgaGVyZSAoc2VlIDxTaGJJcGNBbGxvY0J1ZmZlcj4pLgorCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfRVZFTlRfVEVSTV9SRVFVLAorCQkJCSAgICAgICBwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQsIEZBTFNFKTsKKwloRXZlbnRUZXJtUmVxdSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYk1hbnVhbFJlc2V0CisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiSW5pdGlhbFN0YXRlCisJCQkJICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSA9IGhFdmVudFRlcm1SZXF1OworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSAhPSBOVUxMKTsKKworCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX1RFUk1fUkVTUCwKKwkJCQkgICAgICAgcFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBGQUxTRSk7CisJaEV2ZW50VGVybVJlc3AgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gPSBoRXZlbnRUZXJtUmVzcDsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0gTlVMTCk7CisKKwloVGhyZWFkTmV3RGF0YSA9IENyZWF0ZVRocmVhZChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzCisJCQkJICAgICAgMCwJLy8gU0laRV9UIGR3U3RhY2tTaXplCisJCQkJICAgICAgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSwJLy8gTFBUSFJFQURfU1RBUlRfUk9VVElORSBscFN0YXJ0QWRkcmVzcworCQkJCSAgICAgIHBTaGJJbnN0YW5jZV9wLAkvLyBMUFZPSUQgbHBQYXJhbWV0ZXIKKwkJCQkgICAgICAwLAkvLyBEV09SRCBkd0NyZWF0aW9uRmxhZ3MKKwkJCQkgICAgICAmdWxUaHJlYWRJRE5ld0RhdGEpOwkvLyBMUERXT1JEIGxwVGhyZWFkSWQKKworCXN3aXRjaCAoU2hiUHJpb3JpdHlfcCkgeworCWNhc2Uga1NoYlByaW9yaXR5TG93OgorCQlpUHJpb3JpdHkgPSBUSFJFQURfUFJJT1JJVFlfQkVMT1dfTk9STUFMOworCQlicmVhazsKKworCWNhc2Uga1NoYlByaW9yaXR5Tm9ybWFsOgorCQlpUHJpb3JpdHkgPSBUSFJFQURfUFJJT1JJVFlfTk9STUFMOworCQlicmVhazsKKworCWNhc2Uga3NoYlByaW9yaXR5SGlnaDoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX0FCT1ZFX05PUk1BTDsKKwkJYnJlYWs7CisKKwl9CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgIT0gTlVMTCk7CisKKwlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkTmV3RGF0YSwgaVByaW9yaXR5KTsKKworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhID0gaFRocmVhZE5ld0RhdGE7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElETmV3RGF0YSA9IHVsVGhyZWFkSUROZXdEYXRhOworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdG9wIHNpZ25hbGluZyBvZiBuZXcgZGF0YSAoY2FsbGVkIGZyb20gcmVhZGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhFdmVudFRlcm1SZXF1OworCUhBTkRMRSBoRXZlbnRUZXJtUmVzcDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCisJLy8gdGVybWluYXRlIG5ldyBkYXRhIHNpZ25hbGluZyB0aHJlYWQKKwkvLyAoc2V0IGV2ZW50IDxoRXZlbnRUZXJtUmVxdT4gdG8gd2FrZXVwIHRoZSB0aHJlYWQgYW5kIGRpc3Bvc2UgaXQKKwkvLyB0byBleGl0LCB0aGVuIHdhaXQgZm9yIGNvbmZpcm1hdGlvbiB1c2luZyBldmVudCA8aEV2ZW50VGVybVJlc3A+KQorCWhFdmVudFRlcm1SZXF1ID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV07CisJaEV2ZW50VGVybVJlc3AgPSBwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXTsKKwlpZiAoKGhFdmVudFRlcm1SZXF1ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJgorCSAgICAoaEV2ZW50VGVybVJlc3AgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSB7CisJCVRSQUNFMCgiXG5TaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSgpOiBlbnRlciB3YWl0IHN0YXRlIik7CisJCWR3V2FpdFJlc3VsdCA9IFNpZ25hbE9iamVjdEFuZFdhaXQoaEV2ZW50VGVybVJlcXUsCS8vIEhBTkRMRSBoT2JqZWN0VG9TaWduYWwKKwkJCQkJCSAgIGhFdmVudFRlcm1SZXNwLAkvLyBIQU5ETEUgaE9iamVjdFRvV2FpdE9uCisJCQkJCQkgICBUSU1FT1VUX1RFUk1fVEhSRUFELAkvLyBEV09SRCBkd01pbGxpc2Vjb25kcworCQkJCQkJICAgRkFMU0UpOwkvLyBCT09MIGJBbGVydGFibGUKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEoKTogd2FpdCBzdGF0ZSBsZWF2ZWQ6IC0tLT4gIik7CisJCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6CS8vIGV2ZW50ICJuZXcgZGF0YSBzaWduYWxpbmcgdGhyZWFkIHRlcm1pbmF0ZWQiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMCIpOworCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQl7CisJCQkJVFJBQ0UwKCJVbmhhbmRsZWQgRXZlbnQiKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEpOworCQlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlDbG9zZUhhbmRsZShwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlDbG9zZUhhbmRsZShwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSk7CisJCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHdyaXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJQk9PTCBmUmVzOworCisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbE5ld0RhdGEoKTogZW50ZXJcbiIpOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdICE9CisJICAgICAgIElOVkFMSURfSEFORExFX1ZBTFVFKTsKKwloRXZlbnROZXdEYXRhID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXTsKKwlpZiAoaEV2ZW50TmV3RGF0YSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlmUmVzID0gU2V0RXZlbnQoaEV2ZW50TmV3RGF0YSk7CisJCS8vIFRSQUNFMSgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IEV2ZW50TmV3RGF0YSBzZXQgKFJlc3VsdD0lZClcbiIsIChpbnQpZlJlcyk7CisJCUFTU0VSVChmUmVzKTsKKwl9CisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbE5ld0RhdGEoKTogbGVhdmVcbiIpOworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0YXJ0IHNpZ25hbGluZyBmb3Igam9iIHJlYWR5IChjYWxsZWQgZnJvbSB3YWl0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkodFNoYkluc3RhbmNlCisJCQkJCQkgICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZworCQkJCQkJICAgICAgIHVsVGltZU91dF9wLAorCQkJCQkJICAgICAgIHRTaWdIbmRsckpvYlJlYWR5CisJCQkJCQkgICAgICAgcGZuU2lnbmFsSGFuZGxlckpvYlJlYWR5X3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwlIQU5ETEUgaFRocmVhZEpvYlJlYWR5OworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJREpvYlJlYWR5OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgfHwKKwkgICAgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ID0gdWxUaW1lT3V0X3A7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wOworCisJLy8gQmVjYXVzZSB0aGUgZXZlbnQgPHBTaGJNZW1JbnN0LT5tX2FoRXZlbnRKb2JSZWFkeT4gaXMgdXNlZCBmb3IKKwkvLyBzaWduYWxpbmcgb2YgYSBmaW5pc2hlZCBqb2IgdG9vICh1c2luZyBTZXRFdmVudCksIGl0IGlzIGFsd2F5cworCS8vIGNyZWF0ZWQgaGVyZSAoc2VlIDxTaGJJcGNBbGxvY0J1ZmZlcj4pLgorCisJaFRocmVhZEpvYlJlYWR5ID0gQ3JlYXRlVGhyZWFkKE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFRocmVhZEF0dHJpYnV0ZXMKKwkJCQkgICAgICAgMCwJLy8gU0laRV9UIGR3U3RhY2tTaXplCisJCQkJICAgICAgIFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5LAkvLyBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIGxwU3RhcnRBZGRyZXNzCisJCQkJICAgICAgIHBTaGJJbnN0YW5jZV9wLAkvLyBMUFZPSUQgbHBQYXJhbWV0ZXIKKwkJCQkgICAgICAgMCwJLy8gRFdPUkQgZHdDcmVhdGlvbkZsYWdzCisJCQkJICAgICAgICZ1bFRocmVhZElESm9iUmVhZHkpOwkvLyBMUERXT1JEIGxwVGhyZWFkSWQKKworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSA9IGhUaHJlYWRKb2JSZWFkeTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ICE9IE5VTEwpOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJREpvYlJlYWR5ID0gdWxUaHJlYWRJREpvYlJlYWR5OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgam9iIHJlYWR5IChjYWxsZWQgZnJvbSBleGVjdXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnRKb2JSZWFkeTsKKwlCT09MIGZSZXM7CisKKwkvLyBUUkFDRTAoIlxuU2hiSXBjU2lnbmFsSm9iUmVhZHkoKTogZW50ZXJcbiIpOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisJaEV2ZW50Sm9iUmVhZHkgPSBwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeTsKKwlpZiAoaEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFNldEV2ZW50KGhFdmVudEpvYlJlYWR5KTsKKwkJLy8gVFJBQ0UxKCJcblNoYklwY1NpZ25hbEpvYlJlYWR5KCk6IEV2ZW50Sm9iUmVhZHkgc2V0IChSZXN1bHQ9JWQpXG4iLCAoaW50KWZSZXMpOworCQlBU1NFUlQoZlJlcyk7CisJfQorCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxKb2JSZWFkeSgpOiBsZWF2ZVxuIik7CisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gY29tbW9uIHVzZWQgc2hhcmUgbWVtb3J5IGFyZWEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXZvaWQgKnBTaGJTaE1lbVB0cjsKKworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCWlmIChwU2hiTWVtSGVhZGVyICE9IE5VTEwpIHsKKwkJcFNoYlNoTWVtUHRyID0gKEJZVEUgKikgcFNoYk1lbUhlYWRlciArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwl9IGVsc2UgeworCQlwU2hiU2hNZW1QdHIgPSBOVUxMOworCX0KKworCXJldHVybiAocFNoYlNoTWVtUHRyKTsKKworfQorCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBwcm9jZXNzIHNwZWNpZmljIG1lbXBvb2wKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCkKK3sKKworCUhHTE9CQUwgaE1lbTsKKwl2b2lkICpwTWVtOworCisJaE1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fRklYRUQsIHVsTWVtU2l6ZV9wICsgc2l6ZW9mKEhHTE9CQUwpKTsKKwlwTWVtID0gR2xvYmFsTG9jayhoTWVtKTsKKwlpZiAocE1lbSAhPSBOVUxMKSB7CisJCSooSEdMT0JBTCAqKSBwTWVtID0gaE1lbTsKKwkJKEJZVEUgKikgcE1lbSArPSBzaXplb2YoSEdMT0JBTCk7CisJfQorCisjaWZuZGVmIE5ERUJVRworCXsKKwkJbWVtc2V0KHBNZW0sIDB4YWEsIHVsTWVtU2l6ZV9wKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAocE1lbSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbSh2b2lkICpwTWVtX3ApCit7CisKKwlIR0xPQkFMIGhNZW07CisKKwlpZiAocE1lbV9wID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCShCWVRFICopIHBNZW1fcCAtPSBzaXplb2YoSEdMT0JBTCk7CisJaE1lbSA9ICooSEdMT0JBTCAqKSBwTWVtX3A7CisKKwlHbG9iYWxVbmxvY2soaE1lbSk7CisJR2xvYmFsRnJlZShoTWVtKTsKKworCXJldHVybjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENyZWF0ZSB1bmlmb3JtIG9iamVjdCBuYW1lIChuZWVkZWQgZm9yIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbikKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIgKlNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKGNvbnN0IGNoYXIgKnBzek9iamVjdEpvYk5hbWVfcCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgQk9PTCBmR2xvYmFsT2JqZWN0X3ApCit7CisKKwlzdGF0aWMgY2hhciBzek9iamVjdE5hbWVbTUFYX1BBVEhdOworCWNoYXIgc3pPYmplY3RQcmVmaXhbTUFYX1BBVEhdOworCisJaWYgKGZHbG9iYWxPYmplY3RfcCkgeworCQlzdHJuY3B5KHN6T2JqZWN0UHJlZml4LCAiR2xvYmFsXFwiLCBzaXplb2Yoc3pPYmplY3RQcmVmaXgpKTsKKwl9IGVsc2UgeworCQlfc25wcmludGYoc3pPYmplY3RQcmVmaXgsIHNpemVvZihzek9iamVjdFByZWZpeCksICJQSUQlMDhsWF8iLAorCQkJICAodW5zaWduZWQgbG9uZylHZXRDdXJyZW50UHJvY2Vzc0lkKCkpOworCX0KKworCV9zbnByaW50Zihzek9iamVjdE5hbWUsIHNpemVvZihzek9iamVjdE5hbWUpLCAiJXMlcyMlcyIsCisJCSAgc3pPYmplY3RQcmVmaXgsIHBzekJ1ZmZlcklEX3AsIHBzek9iamVjdEpvYk5hbWVfcCk7CisKKwlyZXR1cm4gKHN6T2JqZWN0TmFtZSk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCkKK3sKKworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCURXT1JEIGR3V2FpdFJlc3VsdDsKKwlCT09MIGZUZXJtUmVxdTsKKwlpbnQgZkNhbGxBZ2FpbjsKKworCVRSQUNFMQorCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiBTaWduYWxUaHJlYWQgc3RhcnRlZCAocFNoYkluc3RhbmNlPTB4JTA4bFgpXG4iLAorCSAgICAgKERXT1JEKSBwdlRocmVhZFBhcmFtX3ApOworCisJcFNoYkluc3RhbmNlID0gKHRTaGJNZW1JbnN0ICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlmVGVybVJlcXUgPSBGQUxTRTsKKworCWRvIHsKKwkJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVswXSAhPQorCQkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCSAgICAgICAmJiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMF0gIT0gTlVMTCkpOworCQlBU1NFUlQoKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhWzFdICE9CisJCQlJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJICAgICAgICYmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVsxXSAhPSBOVUxMKSk7CisKKwkJVFJBQ0UwKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCQlkd1dhaXRSZXN1bHQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsCS8vIERXT1JEIG5Db3VudAorCQkJCQkJICAgICAgcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGEsCS8vIGNvbnN0IEhBTkRMRSogbHBIYW5kbGVzCisJCQkJCQkgICAgICBGQUxTRSwJLy8gQk9PTCBiV2FpdEFsbAorCQkJCQkJICAgICAgSU5GSU5JVEUpOwkvLyBEV09SRCBkd01pbGxpc2Vjb25kcworCQlUUkFDRTAKKwkJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCQlzd2l0Y2ggKGR3V2FpdFJlc3VsdCkgeworCQljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMCIpOworCQkJCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworCQkJCQlUUkFDRTAKKwkJCQkJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IGNhbGxpbmcgU2lnbmFsSGFuZGxlck5ld0RhdGEiKTsKKwkJCQkJZG8geworCQkJCQkJZkNhbGxBZ2FpbiA9CisJCQkJCQkgICAgcFNoYk1lbUluc3QtPgorCQkJCQkJICAgIG1fcGZuU2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgKHBTaGJJbnN0YW5jZSk7CisJCQkJCQkvLyBkLmsuOiB0cnkgdG8gcnVuIGFueSBzaGFyZWQgYnVmZmVyIHdoaWNoIGhhcyBoaWdoZXIgcHJpb3JpdHkuCisJCQkJCQkvLyAgICAgICAgICAgdW5kZXIgV2luZG93cyB0aGlzIGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdpbmRvd3Mgc2NoZWR1bGVyCisJCQkJCQkvLyAgICAgICAgICAgYWxyZWFkeSBwcmVlbXB0cyB0YXNrcyB3aXRoIGxvd2VyIHByaW9yaXR5LgorCQkJCQl9IHdoaWxlIChmQ2FsbEFnYWluICE9IEZBTFNFKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMToJLy8gZXZlbnQgInRlcm1pbmF0ZSIKKwkJCXsKKwkJCQlUUkFDRTAoIkV2ZW50ID0gV0FJVF9PQkpFQ1RfMCsxIik7CisJCQkJZlRlcm1SZXF1ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQkJQVNTRVJUKDApOworCQkJCWZUZXJtUmVxdSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJd2hpbGUgKCFmVGVybVJlcXUpOworCisJaWYgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCVNldEV2ZW50KHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdKTsKKwl9CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogU2lnbmFsVGhyZWFkIHRlcm1pbmF0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcFNoYkluc3RhbmNlKTsKKworCUV4aXRUaHJlYWQoMCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KExQVk9JRCBwdlRocmVhZFBhcmFtX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgKnBTaGJJbnN0YW5jZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJRFdPUkQgdWxUaW1lT3V0OworCURXT1JEIGR3V2FpdFJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgZlRpbWVPdXQ7CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IFNpZ25hbFRocmVhZCBzdGFydGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHB2VGhyZWFkUGFyYW1fcCk7CisKKwlwU2hiSW5zdGFuY2UgPSAodFNoYkluc3RhbmNlICopIHB2VGhyZWFkUGFyYW1fcDsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlKTsKKwlmVGltZU91dCA9IEZBTFNFOworCisJaWYgKHBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5ICE9IDApIHsKKwkJdWxUaW1lT3V0ID0gcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJfSBlbHNlIHsKKwkJdWxUaW1lT3V0ID0gSU5GSU5JVEU7CisJfQorCisJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkgICAgICAgJiYgKHBTaGJNZW1JbnN0LT5tX2hFdmVudEpvYlJlYWR5ICE9IE5VTEwpKTsKKworCVRSQUNFMCgiXG5TaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSgpOiBlbnRlciB3YWl0IHN0YXRlIik7CisJZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSwJLy8gSEFORExFIGhIYW5kbGUKKwkJCQkJICAgdWxUaW1lT3V0KTsJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwlUUkFDRTAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogd2FpdCBzdGF0ZSBsZWF2ZWQ6IC0tLT4gIik7CisJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEiCisJCXsKKwkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCWZUaW1lT3V0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBXQUlUX1RJTUVPVVQ6CisJCXsKKwkJCVRSQUNFMCgiXG5FdmVudCA9IFdBSVRfVElNRU9VVCIpOworCQkJZlRpbWVPdXQgPSBUUlVFOworCQkJLy8gQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQlmVGltZU91dCA9IFRSVUU7CisJCQlBU1NFUlQoMCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpIHsKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogY2FsbGluZyBTaWduYWxIYW5kbGVySm9iUmVhZHkiKTsKKwkJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeShwU2hiSW5zdGFuY2UsIGZUaW1lT3V0KTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gTlVMTDsKKworCVRSQUNFMQorCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogU2lnbmFsVGhyZWFkIHRlcm1pbmF0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcFNoYkluc3RhbmNlKTsKKworCUV4aXRUaHJlYWQoMCk7CisKK30KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkODg0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgRGVjbGFyYXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEJJUENfSF8KKyNkZWZpbmUgX1NIQklQQ19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFR5cGUgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgaW50ICgqdFNpZ0huZGxyTmV3RGF0YSkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0eXBlZGVmIHZvaWQgKCp0U2lnSG5kbHJKb2JSZWFkeSkgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCk7CisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2lmIGRlZmluZWQoSU5MSU5FX0ZVTkNUSU9OX0RFRikKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorI2RlZmluZSBTSEJJUENfSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZGVmaW5lIFNIQklQQ19JTkxJTkVECisjaW5jbHVkZSAiU2hiSXBjLVdpbjMyLmMiCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgU0hCSVBDX0lOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBTSEJJUENfSU5MSU5FRAorI2luY2x1ZGUgIlNoYklwYy1MaW51eEtlcm5lbC5jIgorI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjSW5pdCh2b2lkKTsKK3RTaGJFcnJvciBTaGJJcGNFeGl0KHZvaWQpOworCit0U2hiRXJyb3IgU2hiSXBjQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKTsKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKK3RTaGJFcnJvciBTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKK3RTaGJFcnJvciBTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdFNpZ0huZGxyTmV3RGF0YQorCQkJCSAgICAgIHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJICAgICAgdFNoYlByaW9yaXR5IFNoYlByaW9yaXR5X3ApOwordFNoYkVycm9yIFNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0U2hiRXJyb3IgU2hiSXBjU2lnbmFsTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCit0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdKb2JSZWFkeSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lT3V0X3AsCisJCQkJICAgICAgIHRTaWdIbmRsckpvYlJlYWR5CisJCQkJICAgICAgIHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wKTsKK3RTaGJFcnJvciBTaGJJcGNTaWduYWxKb2JSZWFkeSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCit2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworI2VuZGlmCisKKyN1bmRlZiAgU0hCSVBDX0lOTElORV9FTkFCTEVECS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OCQkvLyBkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OIHRvIG5vdGhpbmcKKworI2VuZGlmIC8vICNpZm5kZWYgX1NIQklQQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjcwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYkxpbnV4S2VybmVsLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBEZWNsYXJhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNy8yMCAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NIQkxJTlVYS0VSTkVMX0hfCisjZGVmaW5lIF9TSEJMSU5VWEtFUk5FTF9IXworCitzdHJ1Y3Qgc1NoYk1lbVRhYmxlIHsKKwlpbnQgbV9pQnVmZmVySWQ7CisJdm9pZCAqbV9wQnVmZmVyOworCXN0cnVjdCBzU2hiTWVtVGFibGUgKm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworfTsKKworZXh0ZXJuIHN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKworI2VuZGlmIC8vIF9TSEJMSU5VWEtFUk5FTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBXcmFwcGVyIGZvciBCU0Qgc29ja2V0IEFQSSBmb3IgTGludXgga2VybmVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogU29ja2V0TGludXhLZXJuZWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzI1IGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSAiU29ja2V0TGludXhLZXJuZWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU09DS0VUIHNvY2tldChpbnQgYWYsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisJaW50IHJjOworCVNPQ0tFVCBzb2NrZXQ7CisKKwlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oYWYsIHR5cGUsIHByb3RvY29sLCAmc29ja2V0KTsKKwlpZiAocmMgPCAwKSB7CisJCXNvY2tldCA9IE5VTEw7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIHNvY2tldDsKK30KKworaW50IGJpbmQoU09DS0VUIHNvY2tldF9wLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuKQoreworCWludCByYzsKKworCXJjID0gc29ja2V0X3AtPm9wcy0+YmluZChzb2NrZXRfcCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsIGFkZHJsZW4pOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2xvc2Vzb2NrZXQoU09DS0VUIHNvY2tldF9wKQoreworCXNvY2tfcmVsZWFzZShzb2NrZXRfcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlY3Zmcm9tKFNPQ0tFVCBzb2NrZXRfcCwgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsCisJICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIGludCAqZnJvbWxlbikKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZSA9IGZyb207CS8vIHdpbGwgYmUgc3RydWN0IHNvY2tfYWRkcgorCW1zZy5tc2dfbmFtZWxlbiA9ICpmcm9tbGVuOworCWlvdi5pb3ZfbGVuID0gbGVuOworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKworCXJjID0ga2VybmVsX3JlY3Ztc2coc29ja2V0X3AsICZtc2csICZpb3YsIDEsIGlvdi5pb3ZfbGVuLCAwKTsKKworCXJldHVybiByYzsKK30KKworaW50IHNlbmR0byhTT0NLRVQgc29ja2V0X3AsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIGludCB0b2xlbikKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKil0bzsJLy8gd2lsbCBiZSBzdHJ1Y3Qgc29ja19hZGRyCisJbXNnLm1zZ19uYW1lbGVuID0gdG9sZW47CisJbXNnLm1zZ19mbGFncyA9IDA7CisJaW92Lmlvdl9sZW4gPSBsZW47CisJaW92Lmlvdl9iYXNlID0gKGNoYXIgKilidWY7CisKKwlyYyA9IGtlcm5lbF9zZW5kbXNnKHNvY2tldF9wLCAmbXNnLCAmaW92LCAxLCBsZW4pOworCisJcmV0dXJuIHJjOworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFkNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5oCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBCU0Qgc29ja2V0IEFQSSBmb3IgTGludXgga2VybmVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogU29ja2V0TGludXhLZXJuZWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDgvMjUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU09DS0VUTElOVVhLRVJORUxfSF8KKyNkZWZpbmUgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAgMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3Qgc29ja2V0ICpTT0NLRVQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgYmluZChTT0NLRVQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbik7CisKK2ludCBjbG9zZXNvY2tldChTT0NLRVQgcyk7CisKK2ludCByZWN2ZnJvbShTT0NLRVQgcywgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwKKwkgICAgIGludCAqZnJvbWxlbik7CisKK2ludCBzZW5kdG8oU09DS0VUIHMsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIGludCB0b2xlbik7CisKK1NPQ0tFVCBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvVGltZXJIaWdoUmVza1g4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWVlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHRhcmdldCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUgZm9yIFg4NiB1bmRlciBMaW51eAorICAgICAgICAgICAgICAgIFRoZSBMaW51eCBrZXJuZWwgaGFzIHRvIGJlIGNvbXBpbGVkIHdpdGggaGlnaCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgdGltZXJzIGVuYWJsZWQuIFRoaXMgaXMgZG9uZSBieSBjb25maWd1cmluZyB0aGUga2VybmVsCisgICAgICAgICAgICAgICAgd2l0aCBDT05GSUdfSElHSF9SRVNfVElNRVJTIGVuYWJsZWQuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogVGltZXJIaWdoUmVza1g4Ni5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM4OjAxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHTlUKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVElNRVJfQ09VTlQgICAgICAgICAgIDIJLyogbWF4IDE1IHRpbWVycyBzZWxlY3RhYmxlICovCisjZGVmaW5lIFRJTUVSX01JTl9WQUxfU0lOR0xFICA1MDAwCS8qIG1pbiA1dXMgKi8KKyNkZWZpbmUgVElNRVJfTUlOX1ZBTF9DWUNMRSAgIDEwMDAwMAkvKiBtaW4gMTAwdXMgKi8KKworI2RlZmluZSBQUk9WRV9PVkVSUlVOCisKKyNpZm5kZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworI2Vycm9yICJLZXJuZWwgc3ltYm9sIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgcmVxdWlyZWQuIgorI2VuZGlmCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorI2RlZmluZSBIUlRfREJHX1BPU1RfVFJBQ0VfVkFMVUUoRXZlbnRfcCwgdWlOb2RlSWRfcCwgd0Vycm9yQ29kZV9wKSBcCisgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgweEUgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKyNkZWZpbmUgVElNRVJIRExfTUFTSyAgICAgICAgIDB4MEZGRkZGRkYKKyNkZWZpbmUgVElNRVJIRExfU0hJRlQgICAgICAgIDI4CisjZGVmaW5lIEhETF9UT19JRFgoSGRsKSAgICAgICAoKEhkbCA+PiBUSU1FUkhETF9TSElGVCkgLSAxKQorI2RlZmluZSBIRExfSU5JVChJZHgpICAgICAgICAgKChJZHggKyAxKSA8PCBUSU1FUkhETF9TSElGVCkKKyNkZWZpbmUgSERMX0lOQyhIZGwpICAgICAgICAgICgoKEhkbCArIDEpICYgVElNRVJIRExfTUFTSykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEhkbCAmIH5USU1FUkhETF9NQVNLKSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxUaW1lckV2ZW50QXJnIG1fRXZlbnRBcmc7CisJdEVwbFRpbWVya0NhbGxiYWNrIG1fcGZuQ2FsbGJhY2s7CisJc3RydWN0IGhydGltZXIgbV9UaW1lcjsKKwlCT09MIG1fZkNvbnRpbnVvdXNseTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbV91bGxQZXJpb2Q7CisKK30gdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm87CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyBtX2FUaW1lckluZm9bVElNRVJfQ09VTlRdOworCit9IHRFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZSBFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0luaXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0FkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFUExfTUVNU0VUKCZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbCwgMCwKKwkJICAgc2l6ZW9mKEVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sKSk7CisKKyNpZm5kZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCXByaW50aworCSAgICAoIkVwbFRpbWVySGlnaFJlc2s6IEtlcm5lbCBzeW1ib2wgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyByZXF1aXJlZC5cbiIpOworCVJldCA9IGtFcGxOb1Jlc291cmNlOworCXJldHVybiBSZXQ7CisjZW5kaWYKKworCS8qCisJICogSW5pdGlhbGl6ZSBocnRpbWVyIHN0cnVjdHVyZXMgZm9yIGFsbCB1c2FibGUgdGltZXJzLgorCSAqLworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCBUSU1FUl9DT1VOVDsgdWlJbmRleCsrKSB7CisJCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCQlzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyOworCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCQlwVGltZXIgPSAmcFRpbWVySW5mby0+bV9UaW1lcjsKKwkJaHJ0aW1lcl9pbml0KHBUaW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKworCQlwVGltZXItPmZ1bmN0aW9uID0gRXBsVGltZXJIaWdoUmVza0NhbGxiYWNrOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNodXRzIGRvd24gdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKHZvaWQpCit7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCBUSU1FUl9DT1VOVDsgdWlJbmRleCsrKSB7CisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvWzBdOworCQlwVGltZXJJbmZvLT5tX3BmbkNhbGxiYWNrID0gTlVMTDsKKwkJcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsID0gMDsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlIHdlIGNhbiBub3QganVzdCB0cnkgdG8gY2FuY2VsIHRoZSB0aW1lci4KKwkJICogV2UgYWN0dWFsbHkgaGF2ZSB0byB3YWl0IHVudGlsIGl0cyBjYWxsYmFjayBmdW5jdGlvbgorCQkgKiBoYXMgcmV0dXJuZWQuCisJCSAqLworCQlocnRpbWVyX2NhbmNlbCgmcFRpbWVySW5mby0+bV9UaW1lcik7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcygpCisvLworLy8gRGVzY3JpcHRpb246IG1vZGlmaWVzIHRoZSB0aW1lb3V0IG9mIHRoZSB0aW1lciB3aXRoIHRoZSBzcGVjaWZpZWQgaGFuZGxlLgorLy8gICAgICAgICAgICAgIElmIHRoZSBoYW5kbGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIGlzIHplcm8sIHRoZSB0aW1lciBtdXN0CisvLyAgICAgICAgICAgICAgYmUgY3JlYXRlZCBmaXJzdC4KKy8vICAgICAgICAgICAgICBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gc3RvcCB0aGUgb2xkIHRpbWVyLAorLy8gICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYWx3YXlzIGFzc3VyZXMgdGhhdCB0aGUgb2xkIHRpbWVyIGRvZXMgbm90CisvLyAgICAgICAgICAgICAgdHJpZ2dlciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBoYW5kbGUgYXMgdGhlIG5ldworLy8gICAgICAgICAgICAgIHRpbWVyLiBUaGF0IG1lYW5zIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGNoZWNrIHRoZSBwYXNzZWQKKy8vICAgICAgICAgICAgICBoYW5kbGUgd2l0aCB0aGUgb25lIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uIElmIHRoZXNlIGFyZQorLy8gICAgICAgICAgICAgIHVuZXF1YWwsIHRoZSBjYWxsIGNhbiBiZSBkaXNjYXJkZWQuCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wICAgICA9IHBvaW50ZXIgdG8gdGltZXIgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWxsVGltZU5zX3AgICAgID0gcmVsYXRpdmUgdGltZW91dCBpbiBbbnNdCisvLyAgICAgICAgICAgICAgcGZuQ2FsbGJhY2tfcCAgID0gY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCBtdXR1YWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmUgd2l0aCB0aGUgRWRydiBjYWxsYmFjayBmdW5jdGlvbnMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUnggYW5kIFR4KS4KKy8vICAgICAgICAgICAgICB1bEFyZ3VtZW50X3AgICAgPSB1c2VyLXNwZWNpZmljIGFyZ3VtZW50CisvLyAgICAgICAgICAgICAgZkNvbnRpbnVvdXNseV9wID0gaWYgVFJVRSwgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzbHk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBhIG9uZXNob3QgdGltZXIuCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkJdW5zaWduZWQgbG9uZyBsb25nIHVsbFRpbWVOc19wLAorCQkJCQkJdEVwbFRpbWVya0NhbGxiYWNrCisJCQkJCQlwZm5DYWxsYmFja19wLAorCQkJCQkJdW5zaWduZWQgbG9uZyB1bEFyZ3VtZW50X3AsCisJCQkJCQlCT09MIGZDb250aW51b3VzbHlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKwlrdGltZV90IFJlbFRpbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgewkvLyBubyB0aW1lciBjcmVhdGVkIHlldAorCisJCS8vIHNlYXJjaCBmcmVlIHRpbWVyIGluZm8gc3RydWN0dXJlCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvWzBdOworCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7CisJCSAgICAgdWlJbmRleCsrLCBwVGltZXJJbmZvKyspIHsKKwkJCWlmIChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPT0gMCkgewkvLyBmcmVlIHN0cnVjdHVyZSBmb3VuZAorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIG5vIGZyZWUgc3RydWN0dXJlIGZvdW5kCisJCQlSZXQgPSBrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IEhETF9JTklUKHVpSW5kZXgpOworCX0gZWxzZSB7CisJCXVpSW5kZXggPSBIRExfVE9fSURYKCpwVGltZXJIZGxfcCk7CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQkJZ290byBFeGl0OworCQl9CisKKwkJcFRpbWVySW5mbyA9ICZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbC5tX2FUaW1lckluZm9bdWlJbmRleF07CisJfQorCisJLyoKKwkgKiBpbmNyZW1lbnQgdGltZXIgaGFuZGxlCisJICogKGlmIHRpbWVyIGV4cGlyZXMgcmlnaHQgYWZ0ZXIgdGhpcyBzdGF0ZW1lbnQsIHRoZSB1c2VyCisJICogd291bGQgZGV0ZWN0IGFuIHVua25vd24gdGltZXIgaGFuZGxlIGFuZCBkaXNjYXJkIGl0KQorCSAqLworCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9CisJICAgIEhETF9JTkMocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsKTsKKwkqcFRpbWVySGRsX3AgPSBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGw7CisKKwkvLyByZWplY3QgdG9vIHNtYWxsIHRpbWUgdmFsdWVzCisJaWYgKChmQ29udGludW91c2x5X3AgJiYgKHVsbFRpbWVOc19wIDwgVElNRVJfTUlOX1ZBTF9DWUNMRSkpCisJICAgIHx8ICghZkNvbnRpbnVvdXNseV9wICYmICh1bGxUaW1lTnNfcCA8IFRJTUVSX01JTl9WQUxfU0lOR0xFKSkpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fdWxBcmcgPSB1bEFyZ3VtZW50X3A7CisJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IHBmbkNhbGxiYWNrX3A7CisJcFRpbWVySW5mby0+bV9mQ29udGludW91c2x5ID0gZkNvbnRpbnVvdXNseV9wOworCXBUaW1lckluZm8tPm1fdWxsUGVyaW9kID0gdWxsVGltZU5zX3A7CisKKwkvKgorCSAqIEhSVElNRVJfTU9ERV9SRUwgZG9lcyBub3QgaW5mbHVlbmNlIGdlbmVyYWwgaGFuZGxpbmcgb2YgdGhpcyB0aW1lci4KKwkgKiBJdCBvbmx5IHNldHMgcmVsYXRpdmUgbW9kZSBmb3IgdGhpcyBzdGFydCBvcGVyYXRpb24uCisJICogLT4gRXhwaXJlIHRpbWUgaXMgY2FsY3VsYXRlZCBieTogTm93ICsgUmVsVGltZQorCSAqIGhydGltZXJfc3RhcnQgYWxzbyBza2lwcyBwZW5kaW5nIHRpbWVyIGV2ZW50cy4KKwkgKiBUaGUgc3RhdGUgSFJUSU1FUl9TVEFURV9DQUxMQkFDSyBpcyBpZ25vcmVkLgorCSAqIFdlIGhhdmUgdG8gY29wZSB3aXRoIHRoYXQgaW4gb3VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCSAqLworCVJlbFRpbWUgPSBrdGltZV9hZGRfbnMoa3RpbWVfc2V0KDAsIDApLCB1bGxUaW1lTnNfcCk7CisJaHJ0aW1lcl9zdGFydCgmcFRpbWVySW5mby0+bV9UaW1lciwgUmVsVGltZSwgSFJUSU1FUl9NT0RFX1JFTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIHRoZSB0aW1lciB3aXRoIHRoZSBzcGVjaWZpZWQgaGFuZGxlLiBBZnRlcndhcmQgdGhlCisvLyAgICAgICAgICAgICAgaGFuZGxlIGlzIHNldCB0byB6ZXJvLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCAgICAgPSBwb2ludGVyIHRvIHRpbWVyIGhhbmRsZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKwl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKworCS8vIGNoZWNrIHBvaW50ZXIgdG8gaGFuZGxlCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgqcFRpbWVySGRsX3AgPT0gMCkgewkvLyBubyB0aW1lciBjcmVhdGVkIHlldAorCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJdWlJbmRleCA9IEhETF9UT19JRFgoKnBUaW1lckhkbF9wKTsKKwkJaWYgKHVpSW5kZXggPj0gVElNRVJfQ09VTlQpIHsJLy8gaW52YWxpZCBoYW5kbGUKKwkJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcFRpbWVySW5mbyA9ICZFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbC5tX2FUaW1lckluZm9bdWlJbmRleF07CisJCWlmIChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgIT0gKnBUaW1lckhkbF9wKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKwkqcFRpbWVySGRsX3AgPSAwOworCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IDA7CisJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IE5VTEw7CisKKwkvKgorCSAqIFRocmVlIHJldHVybiBjYXNlcyBvZiBocnRpbWVyX3RyeV90b19jYW5jZWwgaGF2ZSB0byBiZSB0cmFja2VkOgorCSAqICAxIC0gdGltZXIgaGFzIGJlZW4gcmVtb3ZlZAorCSAqICAwIC0gdGltZXIgd2FzIG5vdCBhY3RpdmUKKwkgKiAgICAgIFdlIG5lZWQgbm90IGRvIGFueXRoaW5nLiBocnRpbWVyIHRpbWVycyBqdXN0IGNvbnNpc3Qgb2YKKwkgKiAgICAgIGEgaHJ0aW1lciBzdHJ1Y3QsIHdoaWNoIHdlIG1pZ2h0IGVucXVldWUgaW4gdGhlIGhydGltZXJzCisJICogICAgICBldmVudCBsaXN0IGJ5IGNhbGxpbmcgaHJ0aW1lcl9zdGFydCgpLgorCSAqICAgICAgSWYgYSB0aW1lciBpcyBub3QgZW5xdWV1ZWQsIGl0IGlzIG5vdCBwcmVzZW50IGluIGhydGltZXJzLgorCSAqIC0xIC0gY2FsbGJhY2sgZnVuY3Rpb24gaXMgcnVubmluZworCSAqICAgICAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHRpbWVyIGlzIG5vdAorCSAqICAgICAgY29udGludW91c2x5IHJlc3RhcnRlZC4gVGhpcyBoYXMgYmVlbiBkb25lIGJ5IGNsZWFyaW5nCisJICogICAgICBpdHMgaGFuZGxlLgorCSAqLworCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmcFRpbWVySW5mby0+bV9UaW1lcik7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBDYWxsYmFjayBmdW5jdGlvbiBjb21tb25seSB1c2VkIGZvciBhbGwgdGltZXJzLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJfcCA9IHBvaW50ZXIgdG8gaHJ0aW1lcgorLy8KKy8vIFJldHVybjoKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqcFRpbWVyX3ApCit7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJdEVwbFRpbWVySGRsIE9yZ1RpbWVySGRsOworCWVudW0gaHJ0aW1lcl9yZXN0YXJ0IFJldDsKKworCUJFTkNITUFSS19NT0RfMjRfU0VUKDQpOworCisJUmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJcFRpbWVySW5mbyA9CisJICAgIGNvbnRhaW5lcl9vZihwVGltZXJfcCwgdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8sIG1fVGltZXIpOworCXVpSW5kZXggPSBIRExfVE9fSURYKHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCk7CisJaWYgKHVpSW5kZXggPj0gVElNRVJfQ09VTlQpIHsJLy8gaW52YWxpZCBoYW5kbGUKKwkJZ290byBFeGl0OworCX0KKworCS8qCisJICogV2Ugc3RvcmUgdGhlIHRpbWVyIGhhbmRsZSBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKwkgKiBhcyB0aGUgdGltZXIgY2FuIGJlIG1vZGlmaWVkIGluc2lkZSBpdC4KKwkgKi8KKwlPcmdUaW1lckhkbCA9IHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbDsKKworCWlmIChwVGltZXJJbmZvLT5tX3BmbkNhbGxiYWNrICE9IE5VTEwpIHsKKwkJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjaygmcFRpbWVySW5mby0+bV9FdmVudEFyZyk7CisJfQorCisJaWYgKHBUaW1lckluZm8tPm1fZkNvbnRpbnVvdXNseSkgeworCQlrdGltZV90IEludGVydmFsOworI2lmZGVmIFBST1ZFX09WRVJSVU4KKwkJa3RpbWVfdCBOb3c7CisJCXVuc2lnbmVkIGxvbmcgT3ZlcnJ1bnM7CisjZW5kaWYKKworCQlpZiAoT3JnVGltZXJIZGwgIT0gcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsKSB7CisJCQkvKiBtb2RpZmllZCB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHJlc3RhcnRlZCAqLworCQkJZ290byBFeGl0OworCQl9CisjaWZkZWYgUFJPVkVfT1ZFUlJVTgorCQlOb3cgPSBrdGltZV9nZXQoKTsKKwkJSW50ZXJ2YWwgPQorCQkgICAga3RpbWVfYWRkX25zKGt0aW1lX3NldCgwLCAwKSwgcFRpbWVySW5mby0+bV91bGxQZXJpb2QpOworCQlPdmVycnVucyA9IGhydGltZXJfZm9yd2FyZChwVGltZXJfcCwgTm93LCBJbnRlcnZhbCk7CisJCWlmIChPdmVycnVucyA+IDEpIHsKKwkJCXByaW50aworCQkJICAgICgiRXBsVGltZXJIaWdoUmVzazogQ29udGludW91cyB0aW1lciAoaGFuZGxlIDB4JWxYKSBoYWQgdG8gc2tpcCAlbHUgaW50ZXJ2YWwocykhXG4iLAorCQkJICAgICBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwsIE92ZXJydW5zIC0gMSk7CisJCX0KKyNlbHNlCisJCXBUaW1lcl9wLT5leHBpcmVzID0ga3RpbWVfYWRkX25zKHBUaW1lcl9wLT5leHBpcmVzLAorCQkJCQkJIHBUaW1lckluZm8tPm1fdWxsUGVyaW9kKTsKKyNlbmRpZgorCisJCVJldCA9IEhSVElNRVJfUkVTVEFSVDsKKwl9CisKKyAgICAgIEV4aXQ6CisJQkVOQ0hNQVJLX01PRF8yNF9SRVNFVCg0KTsKKwlyZXR1cm4gUmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1ZpcnR1YWxFdGhlcm5ldExpbnV4LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBWaXJ0dWFsIEV0aGVybmV0IERyaXZlciBmb3IgTGludXgKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBWaXJ0dWFsRXRoZXJuZXRMaW51eC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzIwIDE3OjA2OjUxICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgLWFyOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyAgMjAwNi8wOS8xOCBkLmsuOiAgaW50ZWdyYXRpb24gaW50byBFUEwgRExMayBtb2R1bGUKKworICBUb0RvOgorCisgIHZvaWQgbmV0aWZfY2Fycmllcl9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisgIHZvaWQgbmV0aWZfY2Fycmllcl9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgkvKiBmb3Igc3RydWN0IHNrX2J1ZmYgKi8KKworI2luY2x1ZGUgImtlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9WRVRIX1RYX1RJTUVPVVQKKy8vI2RlZmluZSBFUExfVkVUSF9UWF9USU1FT1VUICgyKkhaKQorI2RlZmluZSBFUExfVkVUSF9UWF9USU1FT1VUIDAJLy8gZC5rLjogd2UgdXNlIG5vIHRpbWVvdXQKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcFZFdGhOZXREZXZpY2VfZyA9IE5VTEw7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFZFdGhPcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIGludCBWRXRoQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgaW50IFZFdGhYbWl0KHN0cnVjdCBza19idWZmICpwU2tiX3AsIHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpWRXRoR2V0U3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgdm9pZCBWRXRoVGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyB0RXBsS2VybmVsIFZFdGhSZWN2RnJhbWUodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWRXRoT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvL29wZW4gdGhlIGRldmljZQorLy8Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIHBTdGF0cyA9IG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7CisKKwkvL3N0YXJ0IHRoZSBpbnRlcmZhY2UgcXVldWUgZm9yIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCW5ldGlmX3N0YXJ0X3F1ZXVlKHBOZXREZXZpY2VfcCk7CisKKwkvLyByZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiBpbiBETEwKKwlSZXQgPSBFcGxEbGxrUmVnQXN5bmNIYW5kbGVyKFZFdGhSZWN2RnJhbWUpOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMQorCSAgICAoIlZFdGhPcGVuOiBFcGxEbGxrUmVnQXN5bmNIYW5kbGVyIHJldHVybmVkIDB4JTAyWFxuIiwgUmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IFZFdGhDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoQ2xvc2VcbiIpOworCisJUmV0ID0gRXBsRGxsa0RlcmVnQXN5bmNIYW5kbGVyKFZFdGhSZWN2RnJhbWUpOworCisJLy9zdG9wIHRoZSBpbnRlcmZhY2UgcXVldWUgZm9yIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCW5ldGlmX3N0b3BfcXVldWUocE5ldERldmljZV9wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBWRXRoWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqcFNrYl9wLCBzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwkvL3RyYW5zbWl0IGZ1bmN0aW9uCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7CisKKwkvL3NhdmUgdGltZXN0ZW1wCisJcE5ldERldmljZV9wLT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSAodEVwbEZyYW1lICopIHBTa2JfcC0+ZGF0YTsKKwlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBTa2JfcC0+bGVuOworCisJLy9jYWxsIHNlbmQgZmt0IG9uIERMTAorCVJldCA9IEVwbERsbGtDYWxBc3luY1NlbmQoJkZyYW1lSW5mbywga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMQorCQkgICAgKCJWRXRoWG1pdDogRXBsRGxsa0NhbEFzeW5jU2VuZCByZXR1cm5lZCAweCUwMlhcbiIsIFJldCk7CisJCW5ldGlmX3N0b3BfcXVldWUocE5ldERldmljZV9wKTsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAoIlZFdGhYbWl0OiBmcmFtZSBwYXNzZWQgdG8gRExMXG4iKTsKKwkJZGV2X2tmcmVlX3NrYihwU2tiX3ApOworCisJCS8vc2V0IHN0YXRzIGZvciB0aGUgZGV2aWNlCisJCXBTdGF0cy0+dHhfcGFja2V0cysrOworCQlwU3RhdHMtPnR4X2J5dGVzICs9IEZyYW1lSW5mby5tX3VpRnJhbWVTaXplOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlZFdGhHZXRTdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKQoreworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAoIlZFdGhHZXRTdGF0c1xuIik7CisKKwlyZXR1cm4gbmV0ZGV2X3ByaXYocE5ldERldmljZV9wKTsKK30KKworc3RhdGljIHZvaWQgVkV0aFRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoVGltZW91dChcbiIpOworCisJLy8gJCQkIGQuay46IG1vdmUgdG8gZXh0cmEgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCBieSBETEwgd2hlbiBuZXcgc3BhY2UgaXMgYXZhaWxhYmxlIGluIFR4RmlmbworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHBOZXREZXZpY2VfcCkpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShwTmV0RGV2aWNlX3ApOworCX0KK30KKworc3RhdGljIHRFcGxLZXJuZWwgVkV0aFJlY3ZGcmFtZSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2UgPSBwVkV0aE5ldERldmljZV9nOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYjsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEoIlZFdGhSZWN2RnJhbWU6IEZyYW1lU2l6ZT0ldVxuIiwKKwkJCSAgICAgICBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCisJcFNrYiA9IGRldl9hbGxvY19za2IocEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplICsgMik7CisJaWYgKHBTa2IgPT0gTlVMTCkgeworCQlwU3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJZ290byBFeGl0OworCX0KKwlwU2tiLT5kZXYgPSBwTmV0RGV2aWNlOworCisJc2tiX3Jlc2VydmUocFNrYiwgMik7CisKKwltZW1jcHkoKHZvaWQgKilza2JfcHV0KHBTa2IsIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSksCisJICAgICAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisKKwlwU2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBTa2IsIHBOZXREZXZpY2UpOworCXBTa2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJLy8gY2FsbCBuZXRpZl9yeCB3aXRoIHNrYgorCW5ldGlmX3J4KHBTa2IpOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMSgiVkV0aFJlY3ZGcmFtZTogU3JjTUFDPTB4JWxseFxuIiwKKwkJCSAgICAgICBBbWlHZXRRd29yZDQ4RnJvbUJlKHBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPgorCQkJCQkJICAgbV9iZV9hYlNyY01hYykpOworCisJLy8gdXBkYXRlIHJlY2VpdmUgc3RhdGlzdGljcworCXBTdGF0cy0+cnhfcGFja2V0cysrOworCXBTdGF0cy0+cnhfYnl0ZXMgKz0gcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhBZGRJbnN0YW5jZSh0RXBsRGxsa0luaXRQYXJhbSAqIHBJbml0UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gYWxsb2NhdGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBwcml2IHBvaW50aW5nIHRvIHN0YXRzIHN0cnVjdHVyZQorCXBWRXRoTmV0RGV2aWNlX2cgPQorCSAgICBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwgRVBMX1ZFVEhfTkFNRSwKKwkJCSBldGhlcl9zZXR1cCk7CisvLyAgICBwVkV0aE5ldERldmljZV9nID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJaWYgKHBWRXRoTmV0RGV2aWNlX2cgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCXBWRXRoTmV0RGV2aWNlX2ctPm9wZW4gPSBWRXRoT3BlbjsKKwlwVkV0aE5ldERldmljZV9nLT5zdG9wID0gVkV0aENsb3NlOworCXBWRXRoTmV0RGV2aWNlX2ctPmdldF9zdGF0cyA9IFZFdGhHZXRTdGF0czsKKwlwVkV0aE5ldERldmljZV9nLT5oYXJkX3N0YXJ0X3htaXQgPSBWRXRoWG1pdDsKKwlwVkV0aE5ldERldmljZV9nLT50eF90aW1lb3V0ID0gVkV0aFRpbWVvdXQ7CisJcFZFdGhOZXREZXZpY2VfZy0+d2F0Y2hkb2dfdGltZW8gPSBFUExfVkVUSF9UWF9USU1FT1VUOworCXBWRXRoTmV0RGV2aWNlX2ctPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworCS8vIGNvcHkgb3duIE1BQyBhZGRyZXNzIHRvIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisJbWVtY3B5KHBWRXRoTmV0RGV2aWNlX2ctPmRldl9hZGRyLCBwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIDYpOworCisJLy9yZWdpc3RlciBWRXRoIHRvIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCWlmIChyZWdpc3Rlcl9uZXRkZXYocFZFdGhOZXREZXZpY2VfZykpIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMAorCQkgICAgKCJWRXRoQWRkSW5zdGFuY2U6IENvdWxkIG5vdCByZWdpc3RlciBWRXRoLi4uXG4iKTsKKwl9IGVsc2UgeworCQlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwCisJCSAgICAoIlZFdGhBZGRJbnN0YW5jZTogUmVnaXN0ZXIgVkV0aCBzdWNjZXNzZnVsbC4uLlxuIik7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFZFdGhOZXREZXZpY2VfZyAhPSBOVUxMKSB7CisJCS8vdW5yZWdpc3RlciBWRXRoIGZyb20gdGhlIG5ldHdvcmsgc3Vic3lzdGVtCisJCXVucmVnaXN0ZXJfbmV0ZGV2KHBWRXRoTmV0RGV2aWNlX2cpOworCQkvLyBkZXN0cnVjdG9yIHdhcyBzZXQgdG8gZnJlZV9uZXRkZXYsCisJCS8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGNhbGwgZnJlZV9uZXRkZXYgaGVyZQorCQlwVkV0aE5ldERldmljZV9nID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvYW1peDg2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jCkBAIC0wLDAgKzEsOTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgQWJzdHJhY3QgTWVtb3J5IEludGVyZmFjZSBmb3IgeDg2IGNvbXBhdGlibGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBhbWl4ODYuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgci5zLjogZmlyc3QgaW1wbGVtZXRhdGlvbgorCisgIDIwMDYtMDYtMTMgIGQuay46IGR1cGxpY2F0ZSBmdW5jdGlvbnMgZm9yIGxpdHRsZSBlbmRpYW4gYW5kIGJpZyBlbmRpYW4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8jaW5jbHVkZSAiZ2xvYmFsLmgiCisvLyNpbmNsdWRlICJFcGxBbWkuaCIKKyNpbmNsdWRlICJFcGxJbmMuaCIKKworI2lmICghZGVmaW5lZChFUExfQU1JX0lOTElORUQpKSB8fCBkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCVdPUkQgbV93V29yZDsKKworfSB0d1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCURXT1JEIG1fZHdEd29yZDsKKworfSB0ZHdTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlRV09SRCBtX3F3UXdvcmQ7CisKK30gdHF3U3RydWN0OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0WFhYVG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vICAgICAgICAgICAgICB4WFhYVmFsX3AgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBCWVRFIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgordm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9CZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKK3sKKworICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCXR3U3RydWN0IHdWYWx1ZTsKKworCXdWYWx1ZS5tX3dXb3JkID0gKFdPUkQpICgod1dvcmRWYWxfcCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgorCXdWYWx1ZS5tX3dXb3JkIHw9IChXT1JEKSAoKHdXb3JkVmFsX3AgJiAweEZGMDApID4+IDgpOwkvL01TQiB0byBMU0IKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXB3U3RydWN0LT5tX3dXb3JkID0gd1ZhbHVlLm1fd1dvcmQ7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIERXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICBEV09SRCBkd0R3b3JkVmFsX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCXRkd1N0cnVjdCBkd1ZhbHVlOworCisJZHdWYWx1ZS5tX2R3RHdvcmQgPSAoKGR3RHdvcmRWYWxfcCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweDAwMDBGRjAwKSA8PCA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4MDBGRjAwMDApID4+IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd1ZhbHVlLm1fZHdEd29yZDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRYWFhUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogd3JpdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcworLy8gICAgICAgICAgICAgIHhYWFhWYWxfcCAgICAgICAgICAgICAgID0gdmFsdWUKKy8vCisvLyBSZXR1cm5zOiAgICAgKG5vbmUpCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIEJZVEUgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCit2b2lkICBQVUJMSUMgIEFtaVNldEJ5dGVUb0xlICh2b2lkIEZBUiogcEFkZHJfcCwgQllURSBiQnl0ZVZhbF9wKQoreworCisgICAqKEJZVEUgRkFSKilwQWRkcl9wID0gYkJ5dGVWYWxfcDsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIFdPUkQgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgV09SRCB3V29yZFZhbF9wKQoreworCXR3U3RydWN0IEZBUiAqcHdTdHJ1Y3Q7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwd1N0cnVjdC0+bV93V29yZCA9IHdXb3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHdyaXRlIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICBEV09SRCBkd0R3b3JkVmFsX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCisJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwZHdTdHJ1Y3QtPm1fZHdEd29yZCA9IGR3RHdvcmRWYWxfcDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRYWFhGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIHZhbHVlIGZyb20gdGhlIGFic29sdXRlIGFkZHJlc3MgaW4KKy8vICAgICAgICAgICAgICBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICAgICAgICAgID0gYWJzb2x1dGUgYWRkcmVzcworLy8KKy8vIFJldHVybnM6ICAgICBYWFggICAgICAgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgQllURSBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCitCWVRFICBQVUJMSUMgIEFtaUdldEJ5dGVGcm9tQmUgKHZvaWQgRkFSKiBwQWRkcl9wKQoreworCisgICByZXR1cm4gKCAqKEJZVEUgRkFSKilwQWRkcl9wICk7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIFdPUkQgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBXT1JEIFBVQkxJQyBBbWlHZXRXb3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCXR3U3RydWN0IHdWYWx1ZTsKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCisJd1ZhbHVlLm1fd1dvcmQgPSAoV09SRCkgKChwd1N0cnVjdC0+bV93V29yZCAmIDB4MDBGRikgPDwgOCk7CS8vTFNCIHRvIE1TQgorCXdWYWx1ZS5tX3dXb3JkIHw9IChXT1JEKSAoKHB3U3RydWN0LT5tX3dXb3JkICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCisKKwlyZXR1cm4gKHdWYWx1ZS5tX3dXb3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBEV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7CisJdGR3U3RydWN0IGR3VmFsdWU7CisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCisJZHdWYWx1ZS5tX2R3RHdvcmQgPSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMDAwMDBGRikgPDwgMjQpOwkvL0xTQiB0byBNU0IKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHgwMDAwRkYwMCkgPDwgOCk7CisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDBGRjAwMDApID4+IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgocGR3U3RydWN0LT5tX2R3RHdvcmQgJiAweEZGMDAwMDAwKSA+PiAyNCk7CS8vTVNCIHRvIExTQgorCisJcmV0dXJuIChkd1ZhbHVlLm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgWFhYICAgICAgICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIEJZVEUgaW4gbGl0dGxlIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorQllURSAgUFVCTElDICBBbWlHZXRCeXRlRnJvbUxlICh2b2lkIEZBUiogcEFkZHJfcCkKK3sKKworICAgcmV0dXJuICggKihCWVRFIEZBUiopcEFkZHJfcCApOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKworCXB3U3RydWN0ID0gKHR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXJldHVybiAocHdTdHJ1Y3QtPm1fd1dvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcmV0dXJuIChwZHdTdHJ1Y3QtPm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgMjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldER3b3JkMjRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzBdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0RHdvcmQyNEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgMjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRkd1N0cnVjdCBkd1N0cnVjdDsKKworCWR3U3RydWN0Lm1fZHdEd29yZCA9IEFtaUdldER3b3JkRnJvbUJlKHBBZGRyX3ApOworCWR3U3RydWN0Lm1fZHdEd29yZCA+Pj0gODsKKworCXJldHVybiAoZHdTdHJ1Y3QubV9kd0R3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXREd29yZDI0RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBEV09SRCAgICAgICAgICAgPSByZWFkIHZhbHVlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkMjRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdGR3U3RydWN0IGR3U3RydWN0OworCisJZHdTdHJ1Y3QubV9kd0R3b3JkID0gQW1pR2V0RHdvcmRGcm9tTGUocEFkZHJfcCk7CisJZHdTdHJ1Y3QubV9kd0R3b3JkICY9IDB4MDBGRkZGRkY7CisKKwlyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7CisKK30KKworLy8jaWZkZWYgVVNFX1ZBUjY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNjRUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNjRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzddOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs2XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs2XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbN10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0VG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA2NCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCVFXT1JEIEZBUiAqcHF3RHN0OworCisJcHF3RHN0ID0gKFFXT1JEIEZBUiAqKSBwQWRkcl9wOworCSpwcXdEc3QgPSBxd1F3b3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzBdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs3XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVsxXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbNl07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMl0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzNdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs0XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbM107CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNV0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzZdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs3XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbMF07CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDY0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBGQVIgKnBxd1N0cnVjdDsKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlwcXdTdHJ1Y3QgPSAodHF3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXF3U3RydWN0Lm1fcXdRd29yZCA9IHBxd1N0cnVjdC0+bV9xd1F3b3JkOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDBUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQwIGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDBUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0MCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoRFdPUkQgRkFSICopIHBBZGRyX3ApWzBdID0gKChEV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUJlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tQmUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkID4+PSAyNDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDQwRnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA0MCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tTGUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDAwMDAwRkZGRkZGRkZGRkxMOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDhUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzJdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVszXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzVdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDggYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0OFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKFdPUkQgRkFSICopIHBBZGRyX3ApWzJdID0gKChXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gMTY7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0OEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDggYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDBGRkZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs2XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzRdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVszXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzFdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDU2VG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA1NiBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoRFdPUkQgRkFSICopIHBBZGRyX3ApWzBdID0gKChEV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCSgoV09SRCBGQVIgKikgcEFkZHJfcClbMl0gPSAoKFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNTYgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gODsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDU2RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA1NiBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDU2RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRxd1N0cnVjdCBxd1N0cnVjdDsKKworCXF3U3RydWN0Lm1fcXdRd29yZCA9IEFtaUdldFF3b3JkNjRGcm9tTGUocEFkZHJfcCk7CisJcXdTdHJ1Y3QubV9xd1F3b3JkICY9IDB4MDBGRkZGRkZGRkZGRkZGRkxMOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSBUSU1FX09GX0RBWSAoQ0FOb3BlbikgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBwVGltZU9mRGF5X3AgICAgPSBwb2ludGVyIHRvIHN0cnVjdCBUSU1FX09GX0RBWQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0VGltZU9mRGF5KHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgIHRUaW1lT2ZEYXkgRkFSICogcFRpbWVPZkRheV9wKQoreworCisJQW1pU2V0RHdvcmRUb0xlKCgoQllURSBGQVIgKikgcEFkZHJfcCksCisJCQlwVGltZU9mRGF5X3AtPm1fZHdNcyAmIDB4MEZGRkZGRkYpOworCUFtaVNldFdvcmRUb0xlKCgoQllURSBGQVIgKikgcEFkZHJfcCkgKyA0LCBwVGltZU9mRGF5X3AtPm1fd0RheXMpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaUdldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCkKK3sKKworCXBUaW1lT2ZEYXlfcC0+bV9kd01zID0KKwkgICAgQW1pR2V0RHdvcmRGcm9tTGUoKChCWVRFIEZBUiAqKSBwQWRkcl9wKSkgJiAweDBGRkZGRkZGOworCXBUaW1lT2ZEYXlfcC0+bV93RGF5cyA9IEFtaUdldFdvcmRGcm9tTGUoKChCWVRFIEZBUiAqKSBwQWRkcl9wKSArIDQpOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2RlbW9fbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNmYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYwpAQCAtMCwwICsxLDk2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGRlbW9hcHBsaWNhdGlvbiBmb3IgRVBMIE1OICh3aXRoIFNETyBvdmVyIFVEUCkKKyAgICAgICAgICAgICAgICB1bmRlciBMaW51eCBvbiBYODYgd2l0aCBSVEw4MTM5IEV0aGVybmV0IGNvbnRyb2xsZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBkZW1vX21haW4uYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDgvMTEvMTkgMTg6MTE6NDMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR0NDCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8wMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSAiRXBsLmgiCisjaW5jbHVkZSAicHJvY19mcy5oIgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorICAgIC8vIHJlbW92ZSAoIm1ha2UgaW52aXNpYmxlIikgb2Jzb2xldGUgc3ltYm9scyBmb3Iga2VybmVsIHZlcnNpb25zIDIuNgorICAgIC8vIGFuZCBoaWdoZXIKKyNkZWZpbmUgTU9EX0lOQ19VU0VfQ09VTlQKKyNkZWZpbmUgTU9EX0RFQ19VU0VfQ09VTlQKKyNkZWZpbmUgRVhQT1JUX05PX1NZTUJPTFMKKyNlbHNlCisjZXJyb3IgIlRoaXMgZHJpdmVyIG5lZWRzIGEgMi42Lngga2VybmVsIG9yIGhpZ2hlciIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBNZXRhaW5mb3JtYXRpb24KK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKyNpZmRlZiBNT0RVTEVfQVVUSE9SCitNT0RVTEVfQVVUSE9SKCJEYW5pZWwuS3J1ZWdlckBTWVNURUMtZWxlY3Ryb25pYy5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVBMIE1OIGRlbW8iKTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2VuZGlmCisKKyNkZWZpbmUgTk9ERUlEICAgICAgMHhGMAkvLz0+IE1OCisjZGVmaW5lIENZQ0xFX0xFTiAgIDUwMDAJLy8gW3VzXQorI2RlZmluZSBJUF9BRERSICAgICAweGMwYTg2NDAxCS8vIDE5Mi4xNjguMTAwLjEKKyNkZWZpbmUgU1VCTkVUX01BU0sgMHhGRkZGRkYwMAkvLyAyNTUuMjU1LjI1NS4wCisjZGVmaW5lIEhPU1ROQU1FICAgICJTWVMgVEVDIGVsZWN0cm9uaWMgRVBMIFN0YWNrICAgICIKKyNkZWZpbmUgSUZfRVRIICAgICAgRVBMX1ZFVEhfTkFNRQorCisvLyBMSUdIVCBFRkZFQ1QKKyNkZWZpbmUgREVGQVVMVF9NQVhfQ1lDTEVfQ09VTlQgMjAJLy8gNiBpcyB2ZXJ5IGZhc3QKKyNkZWZpbmUgQVBQX0RFRkFVTFRfTU9ERSAgICAgICAgMHgwMQorI2RlZmluZSBBUFBfTEVEX0NPVU5UICAgICAgICAgICA1CS8vIG51bWJlciBvZiBMRURzIGluIG9uZSByb3cKKyNkZWZpbmUgQVBQX0xFRF9NQVNLICAgICAgICAgICAgKCgxIDw8IEFQUF9MRURfQ09VTlQpIC0gMSkKKyNkZWZpbmUgQVBQX0RPVUJMRV9MRURfTUFTSyAgICAgKCgxIDw8IChBUFBfTEVEX0NPVU5UICogMikpIC0gMSkKKyNkZWZpbmUgQVBQX01PREVfQ09VTlQgICAgICAgICAgNQorI2RlZmluZSBBUFBfTU9ERV9NQVNLICAgICAgICAgICAoKDEgPDwgQVBQX01PREVfQ09VTlQpIC0gMSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDT05TVCBCWVRFIGFiTWFjQWRkcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKK0JZVEUgYlZhckluMV9sOworQllURSBiVmFyT3V0MV9sOworQllURSBiVmFyT3V0MU9sZF9sOworQllURSBiTW9kZVNlbGVjdF9sOwkJLy8gc3RhdGUgb2YgdGhlIHB1c2hidXR0b25zIHRvIHNlbGVjdCB0aGUgbW9kZQorQllURSBiU3BlZWRTZWxlY3RfbDsJCS8vIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucyB0byBpbmNyZWFzZS9kZWNyZWFzZSB0aGUgc3BlZWQKK0JZVEUgYlNwZWVkU2VsZWN0T2xkX2w7CQkvLyBvbGQgc3RhdGUgb2YgdGhlIHB1c2hidXR0b25zCitEV09SRCBkd0xlZHNfbDsJCQkvLyBjdXJyZW50IHN0YXRlIG9mIGFsbCBMRURzCitCWVRFIGJMZWRzUm93MV9sOwkJLy8gY3VycmVudCBzdGF0ZSBvZiB0aGUgTEVEcyBpbiByb3cgMQorQllURSBiTGVkc1JvdzJfbDsJCS8vIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRHMgaW4gcm93IDIKK0JZVEUgYWJTZWxlY3RfbFszXTsJCS8vIHB1c2hidXR0b25zIGZyb20gQ05zCisKK0RXT1JEIGR3TW9kZV9sOwkJCS8vIGN1cnJlbnQgbW9kZQoraW50IGlDdXJDeWNsZUNvdW50X2w7CQkvLyBjdXJyZW50IGN5Y2xlIGNvdW50CitpbnQgaU1heEN5Y2xlQ291bnRfbDsJCS8vIG1heGltdW0gY3ljbGUgY291bnQgKGkuZS4gbnVtYmVyIG9mIGN5Y2xlcyB1bnRpbCBuZXh0IGxpZ2h0IG1vdmVtZW50IHN0ZXApCitpbnQgaVRvZ2dsZTsJCQkvLyBpbmRpY2F0ZXMgdGhlIGxpZ2h0IG1vdmVtZW50IGRpcmVjdGlvbgorCitCWVRFIGFiRG9tYWluX2xbMzAwMF07CisKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVTaHV0ZG93bl9nOwkvLyB3YWl0IHF1ZXVlIGZvciB0RXBsTm10RXZlbnRTd2l0Y2hPZmYKK3N0YXRpYyBhdG9taWNfdCBBdG9taWNTaHV0ZG93bl9nID0gQVRPTUlDX0lOSVQoRkFMU0UpOworCitzdGF0aWMgRFdPUkQgZHdfbGVfQ3ljbGVMZW5fZzsKKworc3RhdGljIHVpbnQgdWlOb2RlSWRfZyA9IEVQTF9DX0FEUl9JTlZBTElEOworbW9kdWxlX3BhcmFtX25hbWVkKG5vZGVpZCwgdWlOb2RlSWRfZywgdWludCwgMCk7CisKK3N0YXRpYyB1aW50IHVpQ3ljbGVMZW5fZyA9IENZQ0xFX0xFTjsKK21vZHVsZV9wYXJhbV9uYW1lZChjeWNsZWxlbiwgdWlDeWNsZUxlbl9nLCB1aW50LCAwKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IGZvciB5b3VyIG9iamVjdCBkaWN0aW9uYXJ5LiBJdCBpcyBkZWZpbmVkCisvLyBpbiBPQkpESUNULkMgYnkgZGVmaW5lIEVQTF9PQkRfSU5JVF9SQU1fTkFNRS4gVXNlIHRoaXMgZnVuY3Rpb24gbmFtZSB0byBkZWZpbmUKKy8vIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlIGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSBtb3JlIHRoYW4gb25lIEVwbAorLy8gaW5zdGFuY2VzIHRoZW4gdGhlIGZ1bmN0aW9uIG5hbWUgb2YgZWFjaCBvYmplY3QgZGljdGlvbmFyeSBoYXMgdG8gZGlmZmVyLgorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0UmFtKHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCSAgICAgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkgICAgIHZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBBcHBDYlN5bmModm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IEVwbExpbkluaXQodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgRXBsTGluRXhpdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBLZXJuZWwgTW9kdWxlIHNwZWNpZmljIERhdGEgU3RydWN0dXJlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVhQT1JUX05PX1NZTUJPTFM7CisKKy8vbW9kdWxlX2luaXQoRXBsTGluSW5pdCk7CisvL21vZHVsZV9leGl0KEVwbExpbkV4aXQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQ7CisJaW50IGlSZXQ7CisJc3RhdGljIHRFcGxBcGlJbml0UGFyYW0gRXBsQXBpSW5pdFBhcmFtID0geyAwIH07CisJY2hhciAqc0hvc3RuYW1lID0gSE9TVE5BTUU7CisJY2hhciAqYXJndls0XSwgKmVudnBbM107CisJY2hhciBzQnVmZmVyWzE2XTsKKwl1bnNpZ25lZCBpbnQgdWlWYXJFbnRyaWVzOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBUUlVFKTsKKworCS8vIGdldCBub2RlIElEIGZyb20gaW5zbW9kIGNvbW1hbmQgbGluZQorCUVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkID0gdWlOb2RlSWRfZzsKKworCWlmIChFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZCA9PSBFUExfQ19BRFJfSU5WQUxJRCkgewkvLyBpbnZhbGlkIG5vZGUgSUQgc2V0CisJCS8vIHNldCBkZWZhdWx0IG5vZGUgSUQKKwkJRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQgPSBOT0RFSUQ7CisJfQorCisJdWlOb2RlSWRfZyA9IEVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkOworCisJLy8gY2FsY3VsYXRlIElQIGFkZHJlc3MKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyA9CisJICAgICgweEZGRkZGRjAwICYgSVBfQUREUikgfCBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKworCUVwbEFwaUluaXRQYXJhbS5tX2ZBc3luY09ubHkgPSBGQUxTRTsKKworCUVwbEFwaUluaXRQYXJhbS5tX3VpU2l6ZU9mU3RydWN0ID0gc2l6ZW9mKEVwbEFwaUluaXRQYXJhbSk7CisJRVBMX01FTUNQWShFcGxBcGlJbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MsIGFiTWFjQWRkciwKKwkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbS5tX2FiTWFjQWRkcmVzcykpOworLy8gICAgRXBsQXBpSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzWzVdID0gKEJZVEUpIEVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkOworCUVwbEFwaUluaXRQYXJhbS5tX2R3RmVhdHVyZUZsYWdzID0gLTE7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdDeWNsZUxlbiA9IHVpQ3ljbGVMZW5fZzsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCUVwbEFwaUluaXRQYXJhbS5tX3VpSXNvY2hyVHhNYXhQYXlsb2FkID0gMTAwOwkvLyBjb25zdAorCUVwbEFwaUluaXRQYXJhbS5tX3VpSXNvY2hyUnhNYXhQYXlsb2FkID0gMTAwOwkvLyBjb25zdAorCUVwbEFwaUluaXRQYXJhbS5tX2R3UHJlc01heExhdGVuY3kgPSA1MDAwMDsJLy8gY29uc3Q7IG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJRXBsQXBpSW5pdFBhcmFtLm1fdWlQcmVxQWN0UGF5bG9hZExpbWl0ID0gMzY7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI4IGJ5dGVzKQorCUVwbEFwaUluaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA9IDM2OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gb2YgUHJlcyBmcmFtZSAoKzI4IGJ5dGVzKQorCUVwbEFwaUluaXRQYXJhbS5tX2R3QXNuZE1heExhdGVuY3kgPSAxNTAwMDA7CS8vIGNvbnN0OyBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCUVwbEFwaUluaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID0gMDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCUVwbEFwaUluaXRQYXJhbS5tX3VpQXN5bmNNdHUgPSAxNTAwOwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwlFcGxBcGlJbml0UGFyYW0ubV91aVByZXNjYWxlciA9IDI7CS8vIHJlcXVpcmVkIGZvciBzeW5jCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZSA9IDUwMDAwMDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0FzeW5jU2xvdFRpbWVvdXQgPSAzMDAwMDAwOworCUVwbEFwaUluaXRQYXJhbS5tX2R3V2FpdFNvY1ByZXEgPSAxNTAwMDA7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdEZXZpY2VUeXBlID0gLTE7CS8vIE5NVF9EZXZpY2VUeXBlX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3VmVuZG9ySWQgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5WZW5kb3JJZF9VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1Byb2R1Y3RDb2RlID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUHJvZHVjdENvZGVfVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciA9IC0xOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlJldmlzaW9uTm9fVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5TZXJpYWxOb19VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1N1Ym5ldE1hc2sgPSBTVUJORVRfTUFTSzsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0RlZmF1bHRHYXRld2F5ID0gMDsKKwlFUExfTUVNQ1BZKEVwbEFwaUluaXRQYXJhbS5tX3NIb3N0bmFtZSwgc0hvc3RuYW1lLAorCQkgICBzaXplb2YoRXBsQXBpSW5pdFBhcmFtLm1fc0hvc3RuYW1lKSk7CisKKwkvLyBjdXJyZW50bHkgdW5zZXQgcGFyYW1ldGVycyBsZWZ0IGF0IGRlZmF1bHQgdmFsdWUgMAorCS8vRXBsQXBpSW5pdFBhcmFtLm1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOyAvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOyAvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd0FwcGxpY2F0aW9uU3dEYXRlOyAgICAgICAvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwkvL0VwbEFwaUluaXRQYXJhbS5tX2R3QXBwbGljYXRpb25Td1RpbWU7ICAgICAgIC8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCS8vRXBsQXBpSW5pdFBhcmFtLm1fYWJWZW5kb3JTcGVjaWZpY0V4dDJbNDhdOworCisJLy8gc2V0IGNhbGxiYWNrIGZ1bmN0aW9ucworCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiRXZlbnQgPSBBcHBDYkV2ZW50OworCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiU3luYyA9IEFwcENiU3luYzsKKworCXByaW50aworCSAgICAoIlxuXG4gSGVsbG8sIEknbSBhIHNpbXBsZSBQT1dFUkxJTksgbm9kZSBydW5uaW5nIGFzICVzIVxuICAoYnVpbGQ6ICVzIC8gJXMpXG5cbiIsCisJICAgICAodWlOb2RlSWRfZyA9PQorCSAgICAgIEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCA/ICJNYW5hZ2luZyBOb2RlIiA6ICJDb250cm9sbGVkIE5vZGUiKSwKKwkgICAgIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwkvLyBpbml0aWFsaXplIHRoZSBMaW51eCBhIHdhaXQgcXVldWUgZm9yIHNodXRkb3duIG9mIHRoaXMgbW9kdWxlCisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlU2h1dGRvd25fZyk7CisKKwkvLyBpbml0aWFsaXplIHRoZSBwcm9jZnMgZGV2aWNlCisJRXBsUmV0ID0gRXBsTGluUHJvY0luaXQoKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBQT1dFUkxJTksgc3RhY2sKKwlFcGxSZXQgPSBFcGxBcGlJbml0aWFsaXplKCZFcGxBcGlJbml0UGFyYW0pOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBsaW5rIHByb2Nlc3MgdmFyaWFibGVzIHVzZWQgYnkgQ04gdG8gb2JqZWN0IGRpY3Rpb25hcnkKKwlPYmRTaXplID0gc2l6ZW9mKGJWYXJJbjFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjAwMCwgJmJWYXJJbjFfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlZhck91dDFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjIwMCwgJmJWYXJPdXQxX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAweDAxKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gbGluayBwcm9jZXNzIHZhcmlhYmxlcyB1c2VkIGJ5IE1OIHRvIG9iamVjdCBkaWN0aW9uYXJ5CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJT2JkU2l6ZSA9IHNpemVvZihiTGVkc1JvdzFfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJMZWRzUm93MV9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiTGVkc1JvdzJfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJMZWRzUm93Ml9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMik7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiU3BlZWRTZWxlY3RfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJTcGVlZFNlbGVjdF9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMyk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihiU3BlZWRTZWxlY3RPbGRfbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4MjAwMCwgJmJTcGVlZFNlbGVjdE9sZF9sLCAmdWlWYXJFbnRyaWVzLAorCQkJICAgICAmT2JkU2l6ZSwgMHgwNCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJT2JkU2l6ZSA9IHNpemVvZihhYlNlbGVjdF9sWzBdKTsKKwl1aVZhckVudHJpZXMgPSBzaXplb2YoYWJTZWxlY3RfbCk7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIyMDAsICZhYlNlbGVjdF9sWzBdLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBsaW5rIGEgRE9NQUlOIHRvIG9iamVjdCAweDYxMDAsIGJ1dCBkbyBub3QgZXhpdCwgaWYgaXQgaXMgbWlzc2luZworCU9iZFNpemUgPSBzaXplb2YoYWJEb21haW5fbCk7CisJdWlWYXJFbnRyaWVzID0gMTsKKwlFcGxSZXQgPQorCSAgICBFcGxBcGlMaW5rT2JqZWN0KDB4NjEwMCwgJmFiRG9tYWluX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAweDAwKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXByaW50aygiRXBsQXBpTGlua09iamVjdCgweDYxMDApOiByZXR1cm5zIDB4JVhcbiIsIEVwbFJldCk7CisJfQorCS8vIHJlc2V0IG9sZCBwcm9jZXNzIHZhcmlhYmxlcworCWJWYXJPdXQxT2xkX2wgPSAwOworCWJTcGVlZFNlbGVjdE9sZF9sID0gMDsKKwlkd01vZGVfbCA9IEFQUF9ERUZBVUxUX01PREU7CisJaU1heEN5Y2xlQ291bnRfbCA9IERFRkFVTFRfTUFYX0NZQ0xFX0NPVU5UOworCisJLy8gY29uZmlndXJlIElQIGFkZHJlc3Mgb2YgdmlydHVhbCBuZXR3b3JrIGludGVyZmFjZQorCS8vIGZvciBUQ1AvSVAgY29tbXVuaWNhdGlvbiBvdmVyIHRoZSBQT1dFUkxJTksgbmV0d29yaworCXNwcmludGYoc0J1ZmZlciwgIiVsdS4lbHUuJWx1LiVsdSIsCisJCShFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyA+PiAyNCksCisJCSgoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gMTYpICYgMHhGRiksCisJCSgoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gOCkgJiAweEZGKSwKKwkJKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzICYgMHhGRikpOworCS8qIHNldCB1cCBhIG1pbmltYWwgZW52aXJvbm1lbnQgKi8KKwlpUmV0ID0gMDsKKwllbnZwW2lSZXQrK10gPSAiSE9NRT0vIjsKKwllbnZwW2lSZXQrK10gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7CisJZW52cFtpUmV0XSA9IE5VTEw7CisKKwkvKiBzZXQgdXAgdGhlIGFyZ3VtZW50IGxpc3QgKi8KKwlpUmV0ID0gMDsKKwlhcmd2W2lSZXQrK10gPSAiL3NiaW4vaWZjb25maWciOworCWFyZ3ZbaVJldCsrXSA9IElGX0VUSDsKKwlhcmd2W2lSZXQrK10gPSBzQnVmZmVyOworCWFyZ3ZbaVJldF0gPSBOVUxMOworCisJLyogY2FsbCBpZmNvbmZpZyB0byBjb25maWd1cmUgdGhlIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UgKi8KKwlpUmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCAxKTsKKwlwcmludGsoImlmY29uZmlnICVzICVzIHJldHVybmVkICVkXG4iLCBhcmd2WzFdLCBhcmd2WzJdLCBpUmV0KTsKKworCS8vIHN0YXJ0IHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCUVwbFJldCA9IEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3UmVzZXQpOworCWF0b21pY19zZXQoJkF0b21pY1NodXRkb3duX2csIEZBTFNFKTsKKworICAgICAgRXhpdDoKKwlwcmludGsoIkVwbExpbkluaXQoKTogcmV0dXJucyAweCVYXG4iLCBFcGxSZXQpOworCXJldHVybiBFcGxSZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQ7CisKKwkvLyBoYWx0IHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCS8vIHNvIHRoZSBwcm9jZXNzaW5nIG9mIFBPV0VSTElOSyBmcmFtZXMgc3RvcHMKKwlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJLy8gd2FpdCB1bnRpbCBOTVQgc3RhdGUgbWFjaGluZSBpcyBzaHV0IGRvd24KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlU2h1dGRvd25fZywKKwkJCQkgKGF0b21pY19yZWFkKCZBdG9taWNTaHV0ZG93bl9nKSA9PSBUUlVFKSk7CisvKiAgICBpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNTaHV0ZG93bl9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkpCisgICAgeyAgIC8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBhcHBsaWNhdGlvbiBjYWxsZWQgd3JvbmcgZnVuY3Rpb24KKyAgICAgICAgRXBsUmV0ID0ga0VwbFNodXRkb3duOworICAgIH0qLworCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIG1vZHVsZXMKKwlFcGxSZXQgPSBFcGxBcGlTaHV0ZG93bigpOworCXByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgcHJvYyBmcworCUVwbFJldCA9IEVwbExpblByb2NGcmVlKCk7CisJcHJpbnRrKCJFcGxMaW5Qcm9jRnJlZSgpOiAgICAgICAgMHglWFxuIiwgRXBsUmV0KTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQXBwQ2JFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgRVBMIEFQSSBsYXllciB3aXRoaW4KKy8vICAgICAgICAgICAgICB1c2VyIHBhcnQgKGxvdyBwcmlvcml0eSkuCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50VHlwZV9wICAgICA9IGV2ZW50IHR5cGUKKy8vICAgICAgICAgICAgICBwRXZlbnRBcmdfcCAgICAgPSBwb2ludGVyIHRvIHVuaW9uLCB3aGljaCBkZXNjcmliZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgaW4gZGV0YWlsCisvLyAgICAgICAgICAgICAgcFVzZXJBcmdfcCAgICAgID0gdXNlciBzcGVjaWZpYyBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFcGxTdWNjZXNzZnVsID0gbm8gZXJyb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ID0gcmVqZWN0IGZ1cnRoZXIgcHJvY2Vzc2luZworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA9IHBvc3QgZXJyb3IgZXZlbnQgdG8gQVBJIGxheWVyCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCSAgICAgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkgICAgIHZvaWQgR0VORVJJQyAqIHBVc2VyQXJnX3ApCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGlmIE5NVF9HU19PRkYgaXMgcmVhY2hlZAorCXN3aXRjaCAoRXZlbnRUeXBlX3ApIHsKKwljYXNlIGtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlOgorCQl7CisJCQlzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGUpIHsKKwkJCWNhc2Uga0VwbE5tdEdzT2ZmOgorCQkJCXsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgd2FzIHNodXQgZG93biwKKwkJCQkJLy8gYmVjYXVzZSBvZiB1c2VyIHNpZ25hbCAoQ1RSTC1DKSBvciBjcml0aWNhbCBFUEwgc3RhY2sgZXJyb3IKKwkJCQkJLy8gLT4gYWxzbyBzaHV0IGRvd24gRXBsQXBpUHJvY2VzcygpIGFuZCBtYWluKCkKKwkJCQkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCisJCQkJCXByaW50aworCQkJCQkgICAgKCJBcHBDYkV2ZW50KGtFcGxObXRHc09mZikgb3JpZ2luYXRpbmcgZXZlbnQgPSAweCVYXG4iLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTm10RXZlbnQpOworCisJCQkJCS8vIHdha2UgdXAgRXBsTGluRXhpdCgpCisJCQkJCWF0b21pY19zZXQoJkF0b21pY1NodXRkb3duX2csIFRSVUUpOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKKwkJCQkJICAgICgmV2FpdFF1ZXVlU2h1dGRvd25fZyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb246CisJCQkJeworCQkJCQlEV09SRCBkd0J1ZmZlcjsKKworCQkJCQkvLyBjb25maWd1cmUgT0QgZm9yIE1OIGluIHN0YXRlIFJlc2V0Q29tbSBhZnRlciByZXNldGluZyB0aGUgT0QKKwkJCQkJLy8gVE9ETzogc2V0dXAgeW91ciBvd24gbmV0d29yayBjb25maWd1cmF0aW9uIGhlcmUKKwkJCQkJZHdCdWZmZXIgPSAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8IEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTKTsJLy8gMHgwMDAwMDAwM0wKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDAxLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDIsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwMywKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA0LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDUsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNiwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA3LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDgsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgyMCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweEZFLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4NkUsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisKKy8vICAgICAgICAgICAgICAgICAgICBkd0J1ZmZlciB8PSBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ047ICAgIC8vIDB4MDAwMDAwMEJMCisvLyAgICAgICAgICAgICAgICAgICAgRXBsUmV0ID0gRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4NkUsICZkd0J1ZmZlciwgNCk7CisJCQkJCWR3QnVmZmVyID0gKEVQTF9OT0RFQVNTSUdOX01OX1BSRVMgfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUyk7CS8vIDB4MDAwMTAwMDFMCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHhGMCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKworCQkJCQkvLyBjb250aW51ZQorCQkJCX0KKworCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgdWlTaXplOworCisJCQkJCS8vIGZldGNoIG9iamVjdCAweDEwMDYgTk1UX0N5Y2xlTGVuX1UzMiBmcm9tIGxvY2FsIE9EIChpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIpCisJCQkJCS8vIGZvciBjb25maWd1cmF0aW9uIG9mIHJlbW90ZSBDTgorCQkJCQl1aVNpemUgPSA0OworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpUmVhZE9iamVjdChOVUxMLCAwLCAweDEwMDYsCisJCQkJCQkJICAgICAweDAwLAorCQkJCQkJCSAgICAgJmR3X2xlX0N5Y2xlTGVuX2csCisJCQkJCQkJICAgICAmdWlTaXplLAorCQkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kLAorCQkJCQkJCSAgICAgTlVMTCk7CisJCQkJCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGZhaWxlZAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkJCXsKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIkFwcENiRXZlbnQoMHglWCkgb3JpZ2luYXRpbmcgZXZlbnQgPSAweCVYXG4iLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTmV3Tm10U3RhdGUsCisJCQkJCSAgICAgcEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UuCisJCQkJCSAgICAgbV9ObXRFdmVudCk7CisKKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCQkJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQkJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCQljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxObXRDc09wZXJhdGlvbmFsOgorCQkJY2FzZSBrRXBsTm10TXNPcGVyYXRpb25hbDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworLyoKKyAgICAgICAgICAgIHN3aXRjaCAocEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJBcHBDYkV2ZW50KDB4JVgpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTmV3Tm10U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yOgorCWNhc2Uga0VwbEFwaUV2ZW50V2FybmluZzoKKwkJewkJLy8gZXJyb3Igb3Igd2FybmluZyBvY2N1cmVkIHdpdGhpbiB0aGUgc3RhY2sgb3IgdGhlIGFwcGxpY2F0aW9uCisJCQkvLyBvbiBlcnJvciB0aGUgQVBJIGxheWVyIHN0b3BzIHRoZSBOTVQgc3RhdGUgbWFjaGluZQorCisJCQlwcmludGsKKwkJCSAgICAoIkFwcENiRXZlbnQoRXJyL1dhcm4pOiBTb3VyY2U9JTAyWCBFcGxFcnJvcj0weCUwM1giLAorCQkJICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXZlbnRTb3VyY2UsCisJCQkgICAgIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FcGxFcnJvcik7CisJCQkvLyBjaGVjayBhZGRpdGlvbmFsIGFyZ3VtZW50CisJCQlzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FdmVudFNvdXJjZSkgeworCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudGs6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZUV2ZW50dToKKwkJCQl7CS8vIGVycm9yIG9jY3VyZWQgd2l0aGluIGV2ZW50IHByb2Nlc3NpbmcKKwkJCQkJLy8gZWl0aGVyIGluIGtlcm5lbCBvciBpbiB1c2VyIHBhcnQKKwkJCQkJcHJpbnRrKCIgT3JnU291cmNlPSUwMlhcbiIsCisJCQkJCSAgICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLgorCQkJCQkgICAgICAgbV9BcmcubV9FdmVudFNvdXJjZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VEbGxrOgorCQkJCXsJLy8gZXJyb3Igb2NjdXJlZCB3aXRoaW4gdGhlIGRhdGEgbGluayBsYXllciAoZS5nLiBpbnRlcnJ1cHQgcHJvY2Vzc2luZykKKwkJCQkJLy8gdGhlIERXT1JEIGFyZ3VtZW50IGNvbnRhaW5zIHRoZSBETEwgc3RhdGUgYW5kIHRoZSBOTVQgZXZlbnQKKwkJCQkJcHJpbnRrKCIgdmFsPSVsWFxuIiwKKwkJCQkJICAgICAgIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IuCisJCQkJCSAgICAgICBtX0FyZy5tX2R3QXJnKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsQXBpRXZlbnROb2RlOgorCQl7CisvLyAgICAgICAgICAgIHByaW50aygiQXBwQ2JFdmVudChOb2RlKTogU291cmNlPSUwMlggRXBsRXJyb3I9MHglMDNYIiwgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0V2ZW50U291cmNlLCBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXBsRXJyb3IpOworCQkJLy8gY2hlY2sgYWRkaXRpb25hbCBhcmd1bWVudAorCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9Ob2RlLm1fTm9kZUV2ZW50KSB7CisJCQljYXNlIGtFcGxObXROb2RlRXZlbnRDaGVja0NvbmY6CisJCQkJeworCQkJCQl0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbDsKKwkJCQkJLy8gdXBkYXRlIG9iamVjdCAweDEwMDYgb24gQ04KKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlT2JqZWN0KCZTZG9Db21Db25IZGwsCisJCQkJCQkJICAgICAgcEV2ZW50QXJnX3AtPgorCQkJCQkJCSAgICAgIG1fTm9kZS5tX3VpTm9kZUlkLAorCQkJCQkJCSAgICAgIDB4MTAwNiwgMHgwMCwKKwkJCQkJCQkgICAgICAmZHdfbGVfQ3ljbGVMZW5fZywKKwkJCQkJCQkgICAgICA0LAorCQkJCQkJCSAgICAgIGtFcGxTZG9UeXBlQXNuZCwKKwkJCQkJCQkgICAgICBOVUxMKTsKKwkJCQkJaWYgKEVwbFJldCA9PSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIFNETyB0cmFuc2ZlciBzdGFydGVkCisJCQkJCQlFcGxSZXQgPSBrRXBsUmVqZWN0OworCQkJCQl9IGVsc2UgaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBsb2NhbCBPRCBhY2Nlc3MgKHNob3VsZCBub3Qgb2NjdXIpCisJCQkJCQlwcmludGsKKwkJCQkJCSAgICAoIkFwcENiRXZlbnQoTm9kZSkgd3JpdGUgdG8gbG9jYWwgT0RcbiIpOworCQkJCQl9IGVsc2UgewkvLyBlcnJvciBvY2N1cmVkCisJCQkJCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCQkJCQkJRXBsUmV0ID0KKwkJCQkJCSAgICBFcGxBcGlGcmVlU2RvQ2hhbm5lbAorCQkJCQkJICAgIChTZG9Db21Db25IZGwpOworCQkJCQkJU2RvQ29tQ29uSGRsID0gMDsKKworCQkJCQkJRXBsUmV0ID0KKwkJCQkJCSAgICBFcGxBcGlXcml0ZU9iamVjdAorCQkJCQkJICAgICgmU2RvQ29tQ29uSGRsLAorCQkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9Ob2RlLgorCQkJCQkJICAgICBtX3VpTm9kZUlkLCAweDEwMDYsIDB4MDAsCisJCQkJCQkgICAgICZkd19sZV9DeWNsZUxlbl9nLCA0LAorCQkJCQkJICAgICBrRXBsU2RvVHlwZUFzbmQsIE5VTEwpOworCQkJCQkJaWYgKEVwbFJldCA9PSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIFNETyB0cmFuc2ZlciBzdGFydGVkCisJCQkJCQkJRXBsUmV0ID0ga0VwbFJlamVjdDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcHJpbnRrCisJCQkJCQkJICAgICgiQXBwQ2JFdmVudChOb2RlKTogRXBsQXBpV3JpdGVPYmplY3QoKSByZXR1cm5lZCAweCUwMlhcbiIsCisJCQkJCQkJICAgICBFcGxSZXQpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50U2RvOgorCQl7CQkvLyBTRE8gdHJhbnNmZXIgZmluaXNoZWQKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwocEV2ZW50QXJnX3AtPm1fU2RvLgorCQkJCQkJIG1fU2RvQ29tQ29uSGRsKTsKKwkJCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWlmIChwRXZlbnRBcmdfcC0+bV9TZG8ubV9TZG9Db21Db25TdGF0ZSA9PSBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCkgewkvLyBjb250aW51ZSBib290LXVwIG9mIENOIHdpdGggTk1UIGNvbW1hbmQgUmVzZXQgQ29uZmlndXJhdGlvbgorCQkJCUVwbFJldCA9CisJCQkJICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKHBFdmVudEFyZ19wLT4KKwkJCQkJCQkgICAgICAgbV9TZG8ubV91aU5vZGVJZCwKKwkJCQkJCQkgICAgICAga0VwbE5tdE5vZGVDb21tYW5kQ29uZlJlc2V0KTsKKwkJCX0gZWxzZSB7CS8vIGluZGljYXRlIGNvbmZpZ3VyYXRpb24gZXJyb3IgQ04KKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShwRXZlbnRBcmdfcC0+CisJCQkJCQkJICAgICAgIG1fU2RvLm1fdWlOb2RlSWQsCisJCQkJCQkJICAgICAgIGtFcGxObXROb2RlQ29tbWFuZENvbmZFcnIpOworCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gRXBsUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBcHBDYlN5bmMKKy8vCisvLyBEZXNjcmlwdGlvbjogc3luYyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgZXZlbnQgbW9kdWxlIHdpdGhpbgorLy8gICAgICAgICAgICAgIGtlcm5lbCBwYXJ0IChoaWdoIHByaW9yaXR5KS4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG91dHB1dHMsIHJlYWRzIHRoZSBpbnB1dHMgYW5kIHJ1bnMKKy8vICAgICAgICAgICAgICB0aGUgY29udHJvbCBsb29wLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbFN1Y2Nlc3NmdWwgPSBubyBlcnJvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA9IHBvc3QgZXJyb3IgZXZlbnQgdG8gQVBJIGxheWVyCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JTeW5jKHZvaWQpCit7CisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChiVmFyT3V0MU9sZF9sICE9IGJWYXJPdXQxX2wpIHsJLy8gb3V0cHV0IHZhcmlhYmxlIGhhcyBjaGFuZ2VkCisJCWJWYXJPdXQxT2xkX2wgPSBiVmFyT3V0MV9sOworCQkvLyBzZXQgTEVEcworCisvLyAgICAgICAgcHJpbnRrKCJiVmFySW4gPSAweCUwMlggYlZhck91dCA9IDB4JTAyWFxuIiwgKFdPUkQpIGJWYXJJbl9sLCAoV09SRCkgYlZhck91dF9sKTsKKwl9CisJaWYgKHVpTm9kZUlkX2cgIT0gRVBMX0NfQURSX01OX0RFRl9OT0RFX0lEKSB7CisJCWJWYXJJbjFfbCsrOworCX0KKworCWlmICh1aU5vZGVJZF9nID09IEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCkgewkvLyB3ZSBhcmUgdGhlIG1hc3RlciBhbmQgbXVzdCBydW4gdGhlIGNvbnRyb2wgbG9vcAorCisJCS8vIGNvbGxlY3QgaW5wdXRzIGZyb20gQ05zIGFuZCBvd24gaW5wdXQKKwkJYlNwZWVkU2VsZWN0X2wgPSAoYlZhckluMV9sIHwgYWJTZWxlY3RfbFswXSkgJiAweDA3OworCisJCWJNb2RlU2VsZWN0X2wgPSBhYlNlbGVjdF9sWzFdIHwgYWJTZWxlY3RfbFsyXTsKKworCQlpZiAoKGJNb2RlU2VsZWN0X2wgJiBBUFBfTU9ERV9NQVNLKSAhPSAwKSB7CisJCQlkd01vZGVfbCA9IGJNb2RlU2VsZWN0X2wgJiBBUFBfTU9ERV9NQVNLOworCQl9CisKKwkJaUN1ckN5Y2xlQ291bnRfbC0tOworCisJCWlmIChpQ3VyQ3ljbGVDb3VudF9sIDw9IDApIHsKKwkJCWlmICgoZHdNb2RlX2wgJiAweDAxKSAhPSAwKSB7CS8vIGZpbGwtdXAKKwkJCQlpZiAoaVRvZ2dsZSkgeworCQkJCQlpZiAoKGR3TGVkc19sICYgQVBQX0RPVUJMRV9MRURfTUFTSykgPT0KKwkJCQkJICAgIDB4MDApIHsKKwkJCQkJCWR3TGVkc19sID0gMHgwMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCQkJZHdMZWRzX2wrKzsKKwkJCQkJCWlmIChkd0xlZHNfbCA+PQorCQkJCQkJICAgIEFQUF9ET1VCTEVfTEVEX01BU0spIHsKKwkJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCQlpZiAoKGR3TGVkc19sICYgQVBQX0RPVUJMRV9MRURfTUFTSykgPT0KKwkJCQkJICAgIDB4MDApIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJCWJMZWRzUm93MV9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKGR3TGVkc19sICYgQVBQX0xFRF9NQVNLKTsKKwkJCQliTGVkc1JvdzJfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKSgoZHdMZWRzX2wgPj4gQVBQX0xFRF9DT1VOVCkKKwkJCQkJCSAgICAmIEFQUF9MRURfTUFTSyk7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MDIpICE9IDApIHsJLy8gcnVubmluZyBsaWdodCBmb3J3YXJkCisJCQkJZHdMZWRzX2wgPDw9IDE7CisJCQkJaWYgKChkd0xlZHNfbCA+IEFQUF9ET1VCTEVfTEVEX01BU0spCisJCQkJICAgIHx8IChkd0xlZHNfbCA9PSAweDAwMDAwMDAwTCkpIHsKKwkJCQkJZHdMZWRzX2wgPSAweDAxOworCQkJCX0KKwkJCQliTGVkc1JvdzFfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKShkd0xlZHNfbCAmIEFQUF9MRURfTUFTSyk7CisJCQkJYkxlZHNSb3cyX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoKGR3TGVkc19sID4+IEFQUF9MRURfQ09VTlQpCisJCQkJCQkgICAgJiBBUFBfTEVEX01BU0spOworCQkJfQorCisJCQllbHNlIGlmICgoZHdNb2RlX2wgJiAweDA0KSAhPSAwKSB7CS8vIHJ1bm5pbmcgbGlnaHQgYmFja3dhcmQKKwkJCQlkd0xlZHNfbCA+Pj0gMTsKKwkJCQlpZiAoKGR3TGVkc19sID4gQVBQX0RPVUJMRV9MRURfTUFTSykKKwkJCQkgICAgfHwgKGR3TGVkc19sID09IDB4MDAwMDAwMDBMKSkgeworCQkJCQlkd0xlZHNfbCA9IDEgPDwgKEFQUF9MRURfQ09VTlQgKiAyKTsKKwkJCQl9CisJCQkJYkxlZHNSb3cxX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoZHdMZWRzX2wgJiBBUFBfTEVEX01BU0spOworCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKChkd0xlZHNfbCA+PiBBUFBfTEVEX0NPVU5UKQorCQkJCQkJICAgICYgQVBQX0xFRF9NQVNLKTsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgwOCkgIT0gMCkgewkvLyBLbmlnaHRyaWRlcgorCQkJCWlmIChiTGVkc1JvdzFfbCA9PSAweDAwKSB7CisJCQkJCWJMZWRzUm93MV9sID0gMHgwMTsKKwkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJfSBlbHNlIGlmIChpVG9nZ2xlKSB7CisJCQkJCWJMZWRzUm93MV9sIDw8PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPj0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpKSB7CisJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWJMZWRzUm93MV9sID4+PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPD0gMHgwMSkgeworCQkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQkJYkxlZHNSb3cyX2wgPSBiTGVkc1JvdzFfbDsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgxMCkgIT0gMCkgewkvLyBLbmlnaHRyaWRlcgorCQkJCWlmICgoYkxlZHNSb3cxX2wgPT0gMHgwMCkKKwkJCQkgICAgfHwgKGJMZWRzUm93Ml9sID09IDB4MDApCisJCQkJICAgIHx8ICgoYkxlZHNSb3cyX2wgJiB+QVBQX0xFRF9NQVNLKSAhPSAwKSkgeworCQkJCQliTGVkc1JvdzFfbCA9IDB4MDE7CisJCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpOworCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQl9IGVsc2UgaWYgKGlUb2dnbGUpIHsKKwkJCQkJYkxlZHNSb3cxX2wgPDw9IDE7CisJCQkJCWJMZWRzUm93Ml9sID4+PSAxOworCQkJCQlpZiAoYkxlZHNSb3cxX2wgPj0KKwkJCQkJICAgICgxIDw8IChBUFBfTEVEX0NPVU5UIC0gMSkpKSB7CisJCQkJCQlpVG9nZ2xlID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWJMZWRzUm93MV9sID4+PSAxOworCQkJCQliTGVkc1JvdzJfbCA8PD0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sIDw9IDB4MDEpIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLy8gc2V0IG93biBvdXRwdXQKKwkJCWJWYXJPdXQxX2wgPSBiTGVkc1JvdzFfbDsKKy8vICAgICAgICAgICAgYlZhck91dDFfbCA9IChiTGVkc1JvdzFfbCAmIDB4MDMpIHwgKGJMZWRzUm93Ml9sIDw8IDIpOworCisJCQkvLyByZXN0YXJ0IGN5Y2xlIGNvdW50ZXIKKwkJCWlDdXJDeWNsZUNvdW50X2wgPSBpTWF4Q3ljbGVDb3VudF9sOworCQl9CisKKwkJaWYgKGJTcGVlZFNlbGVjdE9sZF9sID09IDApIHsKKwkJCWlmICgoYlNwZWVkU2VsZWN0X2wgJiAweDAxKSAhPSAwKSB7CisJCQkJaWYgKGlNYXhDeWNsZUNvdW50X2wgPCAyMDApIHsKKwkJCQkJaU1heEN5Y2xlQ291bnRfbCsrOworCQkJCX0KKwkJCQliU3BlZWRTZWxlY3RPbGRfbCA9IGJTcGVlZFNlbGVjdF9sOworCQkJfSBlbHNlIGlmICgoYlNwZWVkU2VsZWN0X2wgJiAweDAyKSAhPSAwKSB7CisJCQkJaWYgKGlNYXhDeWNsZUNvdW50X2wgPiAxKSB7CisJCQkJCWlNYXhDeWNsZUNvdW50X2wtLTsKKwkJCQl9CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0gZWxzZSBpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwNCkgIT0gMCkgeworCQkJCWlNYXhDeWNsZUNvdW50X2wgPSBERUZBVUxUX01BWF9DWUNMRV9DT1VOVDsKKwkJCQliU3BlZWRTZWxlY3RPbGRfbCA9IGJTcGVlZFNlbGVjdF9sOworCQkJfQorCQl9IGVsc2UgaWYgKGJTcGVlZFNlbGVjdF9sID09IDApIHsKKwkJCWJTcGVlZFNlbGVjdE9sZF9sID0gMDsKKwkJfQorCX0KKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDEpOworCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTk4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaApAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgZXRoZXJuZXRkcml2ZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBlZHJ2LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8wOC8wMSBtLmIuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VEUlZfSF8KKyNkZWZpbmUgX0VEUlZfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbEZyYW1lLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUFYX0VUSF9EQVRBX1NJWkUgICAgICAgMTUwMAorI2RlZmluZSBNSU5fRVRIX0RBVEFfU0laRSAgICAgICAgIDQ2CisKKyNkZWZpbmUgRVRIX0hEUl9PRkZTRVQgCSAwCS8vIEV0aGVybmV0IGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBmcmFtZQorI2RlZmluZSBFVEhfSERSX1NJWkUJMTQJLy8gc2l6ZSBvZiBFdGhlcm5ldCBoZWFkZXIKKyNkZWZpbmUgTUlOX0VUSF9TSVpFICAgICAoTUlOX0VUSF9EQVRBX1NJWkUgKyBFVEhfSERSX1NJWkUpCS8vIHdpdGhvdXQgQ1JDCisKKyNkZWZpbmUgRVRIX0NSQ19TSVpFCSA0CS8vIHNpemUgb2YgRXRoZXJuZXQgQ1JDLCBpLmUuIEZDUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHBvc2l0aW9uIG9mIGEgYnVmZmVyIGluIGFuIGV0aGVybmV0LWZyYW1lCit0eXBlZGVmIGVudW0geworCWtFZHJ2QnVmZmVyRmlyc3RJbkZyYW1lID0gMHgwMSwJLy8gZmlyc3QgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKKwlrRWRydkJ1ZmZlck1pZGRsZUluRnJhbWUgPSAweDAyLAkvLyBhIG1pZGRsZSBkYXRhIGJ1ZmZlciBpbiBhbiBldGhlcm5ldCBmcmFtZQorCWtFZHJ2QnVmZmVyTGFzdEluRnJhbWUgPSAweDA0CS8vIGxhc3QgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKK30gdEVkcnZCdWZmZXJJbkZyYW1lOworCisvLyBmb3JtYXQgb2YgYSB0eC1idWZmZXIKK3R5cGVkZWYgc3RydWN0IF90RWRydlR4QnVmZmVyIHsKKwl0RXBsTXNnVHlwZSBtX0VwbE1zZ1R5cGU7CS8vIElOOiB0eXBlIG9mIEVQTCBtZXNzYWdlLCBzZXQgYnkgY2FsbGluZyBmdW5jdGlvbgorCXVuc2lnbmVkIGludCBtX3VpVHhNc2dMZW47CS8vIElOOiBsZW5ndGggb2YgbWVzc2FnZSB0byBiZSBzZW5kIChzZXQgZm9yIGVhY2ggdHJhbnNtaXQgY2FsbCkKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdW5zaWduZWQgaW50IG1fdWlCdWZmZXJOdW1iZXI7CS8vIE9VVDogbnVtYmVyIG9mIHRoZSBidWZmZXIsIHNldCBieSBldGhlcm5ldGRyaXZlcgorCUJZVEUgKm1fcGJCdWZmZXI7CS8vIE9VVDogcG9pbnRlciB0byB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIE9VVDogVGltZXN0YW1wIG9mIGVuZCBvZiB0cmFuc21pc3Npb24sIHNldCBieSBldGhlcm5ldGRyaXZlcgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl1bnNpZ25lZCBpbnQgbV91aU1heEJ1ZmZlckxlbjsJLy8gSU4vT1VUOiBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYnVmZmVyCit9IHRFZHJ2VHhCdWZmZXI7CisKKy8vIGZvcm1hdCBvZiBhIHJ4LWJ1ZmZlcgordHlwZWRlZiBzdHJ1Y3QgX3RFZHJ2UnhCdWZmZXIgeworCXRFZHJ2QnVmZmVySW5GcmFtZSBtX0J1ZmZlckluRnJhbWU7CS8vIE9VVCBwb3NpdGlvbiBvZiByZWNlaXZlZCBidWZmZXIgaW4gYW4gZXRoZXJuZXQtZnJhbWUKKwl1bnNpZ25lZCBpbnQgbV91aVJ4TXNnTGVuOwkvLyBPVVQ6IGxlbmd0aCBvZiByZWNlaXZlZCBidWZmZXIgKHdpdGhvdXQgQ1JDKQorCUJZVEUgKm1fcGJCdWZmZXI7CS8vIE9VVDogcG9pbnRlciB0byB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIE9VVDogVGltZXN0YW1wIG9mIGVuZCBvZiByZWNlaXB0aW9uCisKK30gdEVkcnZSeEJ1ZmZlcjsKKworLy90eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgdEJ1ZmZlckRlc2NyICogcGJCdWZmZXJfcCk7CisvL3R5cGVkZWYgdm9pZCAoKnRFZHJ2UnhIYW5kbGVyKSAoQllURSBiQnVmZmVySW5GcmFtZV9wLCBCWVRFICogcGJFdGhlcm5ldERhdGFfcCwgV09SRCB3RGF0YUxlbl9wKTsKK3R5cGVkZWYgdm9pZCAoKnRFZHJ2UnhIYW5kbGVyKSAodEVkcnZSeEJ1ZmZlciAqIHBSeEJ1ZmZlcl9wKTsKK3R5cGVkZWYgdm9pZCAoKnRFZHJ2VHhIYW5kbGVyKSAodEVkcnZUeEJ1ZmZlciAqIHBUeEJ1ZmZlcl9wKTsKKworLy8gZm9ybWF0IG9mIGluaXQgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2FiTXlNYWNBZGRyWzZdOwkvLyB0aGUgb3duIE1BQyBhZGRyZXNzCisKKy8vICAgIEJZVEUgICAgICAgICAgICBtX2JOb09mUnhCdWZmRGVzY3I7ICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBpbiByeCBidWZmZXJkZXNjcmlwdG9yIHRhYmxlCisvLyAgICB0QnVmZmVyRGVzY3IgKiAgbV9wUnhCdWZmRGVzY3JUYWJsZTsgICAgLy8gcnggYnVmZmVyZGVzY3JpcHRvciB0YWJsZQorLy8gICAgV09SRCAgICAgICAgICAgIG1fd1J4QnVmZmVyU2l6ZTsgICAgICAgIC8vIHNpemUgb2YgdGhlIHdob2xlIHJ4IGJ1ZmZlcgorCisJdEVkcnZSeEhhbmRsZXIgbV9wZm5SeEhhbmRsZXI7CisJdEVkcnZUeEhhbmRsZXIgbV9wZm5UeEhhbmRsZXI7CisKK30gdEVkcnZJbml0UGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVkcnZJbml0KHRFZHJ2SW5pdFBhcmFtICogcEVkcnZJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgRWRydlNodXRkb3duKHZvaWQpOworCit0RXBsS2VybmVsIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApOwordEVwbEtlcm5lbCBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApOworCisvL3RFcGxLZXJuZWwgRWRydkRlZmluZVVuaWNhc3RFbnRyeSAgICAgKEJZVEUgKiBwYlVDRW50cnlfcCk7CisvL3RFcGxLZXJuZWwgRWRydlVuZGZpbmVVbmljYXN0RW50cnkgICAgKEJZVEUgKiBwYlVDRW50cnlfcCk7CisKK3RFcGxLZXJuZWwgRWRydkFsbG9jVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7CisKKy8vdEVwbEtlcm5lbCBFZHJ2V3JpdGVNc2cgICAgICAgICAgICAgICAodEJ1ZmZlckRlc2NyICogcGJCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZTZW5kVHhNc2codEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7Cit0RXBsS2VybmVsIEVkcnZUeE1zZ1JlYWR5KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2VHhNc2dTdGFydCh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKTsKKworLy90RXBsS2VybmVsIEVkcnZSZWFkTXNnICAgICAgICAgICAgICAgICh2b2lkKTsKKworLy8gaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRhcmdldCBzcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlcgordm9pZCBFZHJ2SW50ZXJydXB0SGFuZGxlcih2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvZ2xvYmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTY3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oCkBAIC0wLDAgKzEsMTM5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIGdsb2JhbCBwcm9qZWN0IGRlZmluaXRpb24gZmlsZQorCisgICAgMTIuMDYuMTk5OCAgIC1ycworICAgIDExLjAyLjIwMDIgICByLmQuIEVyd2VpdGVydW5nZW4sIEVyZ2Flbnp1bmdlbgorICAgIDIwLjA4LjIwMDIgICBTWVMgVEVDIGVsZWN0cm9uaWMgLWFzCisgICAgICAgICAgICAgICAgIERlZmluaXRpb24gU2NobHVlc3NlbHdvcnQgJ0dFTkVSSUMnCisgICAgICAgICAgICAgICAgIGZ1ZXIgZGFzIEVyemV1Z2VuIHZvbiBHZW5lcmljIFBvaW50ZXIKKyAgICAyOC4wOC4yMDAyICAgci5kLiBlcndlaXRlcnRlciBTWVMgVEVDIERlYnVnIENvZGUKKyAgICAxNi4wOS4yMDAyICAgci5kLiBrb21wbGV0dGUgVWViZXJzZXR6dW5nIGluIEVuZ2xpc2NoCisgICAgMTEuMDQuMjAwMyAgIGYuai4gRXJnYWVuenVuZyBmdWVyIE1pdHN1YmlzaGkgTkMzMCBDb21waWxlcgorICAgIDE3LjA2LjIwMDMgICAtcnMgIERlZmluaXRpb24gdm9uIEJhc2lzdHlwZW4gaW4gPCNpZm5kZWYgX1dJTkRFRl8+IGdlc2V0enQKKyAgICAxNi4wNC4yMDA0ICAgci5kLiBFcmdhZW56dW5nIGZ1ZXIgQm9ybGFuZCBDKysgQnVpbGRlcgorICAgIDMwLjA4LjIwMDQgICAtcnMgIFRSQUNFNSBlaW5nZWb8Z3QKKyAgICAyMy4xMi4yMDA1ICAgZC5rLiBEZWZpbml0aW9ucyBmb3IgSUFSIGNvbXBpbGVyCisKKyAgICAkSWQ6IGdsb2JhbC5oLHYgMS42IDIwMDgvMTEvMDcgMTM6NTU6NTYgRC5LcnVlZ2VyIEV4cCAkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0dMT0JBTF9IXworI2RlZmluZSBfR0xPQkFMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZWxlbWVudHMgb2YgZGVmaW5lcyBmb3IgZGV2ZWxvcG1lbnQgc3lzdGVtCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0aGVzZSBkZWZpbmVzIGFyZSBuZWNlc3NhcnkgdG8gY2hlY2sgc29tZSBvZiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGRldmVsb3BtZW50IHN5c3RlbQorI2RlZmluZSBfREVWX0JJR0VORF8gICAgICAgICAgICAweDgwMDAwMDAwTAkvLyBiaWcgZW5kaWFuIChtb3Rvcm9sbGEgZm9ybWF0KQorI2RlZmluZSBfREVWX0FMSUdOTUVOVF80XyAgICAgICAweDAwNDAwMDAwTAkvLyAgICAgICAgICAgICAgICAgIHRoZSBDUFUgbmVlZHMgYWxpZ25tZW50IG9mIDQgYnl0ZXMKKyNkZWZpbmUgX0RFVl9PTkxZX0lOVF9NQUlOXyAgICAgMHgwMDAwNDAwMEwJLy8gICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIgbmVlZHMgImludCBtYWluKGludCkiIGluc3RlYWQgb2YgInZvaWQgbWFpbih2b2lkKSIKKyNkZWZpbmUgX0RFVl9DT01NQV9FWFRfICAgICAgICAgMHgwMDAwMjAwMEwJLy8gICAgICAgICAgICAgICAgICBzdXBwb3J0IG9mIGxhc3QgY29tbWEgaW4gc3RydWN0IHByZWRlZmluaXRpb24KKyNkZWZpbmUgX0RFVl82NEJJVF9TVVBQT1JUXyAgICAgMHgwMDAwMTAwMEwJLy8gICAgICAgICAgICAgICAgICBzdXBwb3J0IG9mIDY0IGJpdCBvcGVyYXRpb25zCisjZGVmaW5lIF9ERVZfQklUNjRfICAgICAgICAgICAgIDB4MDAwMDA0MDBMCS8vIGNvdW50IG9mIGJpdHM6ICAgNjQgYml0CisjZGVmaW5lIF9ERVZfQklUMzJfICAgICAgICAgICAgIDB4MDAwMDAzMDBMCS8vICAgICAgICAgICAgICAgICAgMzIgYml0CisjZGVmaW5lIF9ERVZfQklUMTZfICAgICAgICAgICAgIDB4MDAwMDAyMDBMCS8vICAgICAgICAgICAgICAgICAgMTYgYml0CisjZGVmaW5lIF9ERVZfQklUOF8gICAgICAgICAgICAgIDB4MDAwMDAxMDBMCS8vICAgICAgICAgICAgICAgICAgOCBiaXQKKyNkZWZpbmUgX0RFVl9SVkNUX0FSTV8gICAgICAgICAgMHgwMDAwMDAxQ0wJLy8gICAgICAgICAgICAgICAgICBSZWFsVmlldyBBUk0KKyNkZWZpbmUgX0RFVl9SRU5FU0FTTTMyQyAgICAgICAgMHgwMDAwMDAxQkwJLy8gY29tcGlsZXIgZnJvbTogICBSZW5lc2FzCisjZGVmaW5lIF9ERVZfR05VQ19NSVBTMl8gICAgICAgIDB4MDAwMDAwMUFMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBNSVBTMgorI2RlZmluZSBfREVWX01QTEFCX0MzMF8gICAgICAgICAweDAwMDAwMDE5TAkvLyAgICAgICAgICAgICAgICAgIE1QTEFCIEMzMCBmb3IgTWljcm9jaGlwIGRzUElDMzNGIHNlcmllcworI2RlZmluZSBfREVWX0dOVUNfVENfICAgICAgICAgICAweDAwMDAwMDE4TAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgSW5maW5lb24gVHJpQ29yZQorI2RlZmluZSBfREVWX0dOVUNfWDg2XyAgICAgICAgICAweDAwMDAwMDE3TAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgSTM4NgorI2RlZmluZSBfREVWX0lBUl9BUk1fICAgICAgICAgICAweDAwMDAwMDE2TAkvLyAgICAgICAgICAgICAgICAgIEFSTSBJQVIgQy9DKysgQ29tcGlsZXIKKyNkZWZpbmUgX0RFVl9QQVJBREdNX1g4NiAgICAgICAgMHgwMDAwMDAxNUwJLy8gICAgICAgICAgICAgICAgICBQYXJhZGlnbSBDL0MrKyBmb3IgQmVjayAxeDMKKyNkZWZpbmUgX0RFVl9HTlVDX0NGXyAgICAgICAgICAgMHgwMDAwMDAxNEwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIENvbGRmaXJlCisjZGVmaW5lIF9ERVZfS0VJTF9BUk1fICAgICAgICAgIDB4MDAwMDAwMTNMCS8vICAgICAgICAgICAgICAgICAgS2VpbCBBUk0KKyNkZWZpbmUgX0RFVl9NU0VWQ18gICAgICAgICAgICAgMHgwMDAwMDAxMkwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgZW1iZWRkZWQgVmlzdWFsIEMvQysrCisjZGVmaW5lIF9ERVZfSElHSFRFQ19HTlVDX1g4Nl8gIDB4MDAwMDAwMTFMCS8vICAgICAgICAgICAgICAgICAgSGlnaHRlYyBlbGYzODYgZ2NjCisjZGVmaW5lIF9ERVZfTVNWQ19SVFhfICAgICAgICAgIDB4MDAwMDAwMTBMCS8vICAgICAgICAgICAgICAgICAgVkM2MDAgKyBSVFgKKyNkZWZpbmUgX0RFVl9NU1ZDX1YxXzVfICAgICAgICAgMHgwMDAwMDAwRkwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrIFYxLjUKKyNkZWZpbmUgX0RFVl9HTlVDX0FSTTdfICAgICAgICAgMHgwMDAwMDAwRUwJLy8gICAgICAgICAgICAgICAgICBHTlUgQ29tcGlsZXIgZ2NjIGZvciBBUk03CisjZGVmaW5lIF9ERVZfTUVUUk9XRVJLU19DV18gICAgIDB4MDAwMDAwMERMCS8vICAgICAgICAgICAgICAgICAgTWV0cm93ZXJrcyBDb2RlIFdhcnJpb3IKKyNkZWZpbmUgX0RFVl9NSVRTVUJJU0hJTTE2Q18gICAgMHgwMDAwMDAwQ0wJLy9jb21waWxlciBmcm9tOiAgICBNaXRzdWJpc2hpCisjZGVmaW5lIF9ERVZfR05VQ19DMTZYXyAgICAgICAgIDB4MDAwMDAwMEJMCS8vICAgICAgICAgICAgICAgICAgR05VIENvbXBpbGVyIGdjYzE2NiBmb3IgSW5maW5lb24gQzE2eAorI2RlZmluZSBfREVWX0xJTlVYX0dDQ18gICAgICAgICAweDAwMDAwMDBBTAkvLyAgICAgICAgICAgICAgICAgIExpbnV4IEdOVSBDb21waWxlciBnY2MKKyNkZWZpbmUgX0RFVl9HTlVDX01QQzVYNSAgICAgICAgMHgwMDAwMDAwOUwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIE1vdG9yb2xhIFBQQzV4NQorI2RlZmluZSBfREVWX1RBU0tJTkdNMTZDXyAgICAgICAweDAwMDAwMDA4TAkvLyAgICAgICAgICAgICAgICAgIFRhc2tpbmcgZm9yIE1pdHN1YmlzaGkgTTE2QworI2RlZmluZSBfREVWX0ZVSklUU1VfICAgICAgICAgICAweDAwMDAwMDA3TAkvLyAgICAgICAgICAgICAgICAgIEZ1aml0c3UKKyNkZWZpbmUgX0RFVl9UQVNLSU5HOF8gICAgICAgICAgMHgwMDAwMDAwNkwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIDgwNTEKKyNkZWZpbmUgX0RFVl9UQVNLSU5HMTZfICAgICAgICAgMHgwMDAwMDAwNUwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIDE2NgorI2RlZmluZSBfREVWX0tFSUw4XyAgICAgICAgICAgICAweDAwMDAwMDA0TAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQzUxCisjZGVmaW5lIF9ERVZfS0VJTDE2XyAgICAgICAgICAgIDB4MDAwMDAwMDNMCS8vICAgICAgICAgICAgICAgICAgS2VpbCBDMTY2CisjZGVmaW5lIF9ERVZfQk9STEFORENfICAgICAgICAgIDB4MDAwMDAwMDJMCS8vICAgICAgICAgICAgICAgICAgQm9ybGFuZCBDL0MrKworI2RlZmluZSBfREVWX01TVkMxNl8gICAgICAgICAgICAweDAwMDAwMDAxTAkvLyAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQy9DKysKKyNkZWZpbmUgX0RFVl9NU1ZDMzJfICAgICAgICAgICAgMHgwMDAwMDAwMEwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrCisKKy8vIHRoZXNlIGRlZmluZXMgY2FuIGJlIHVzZWQgdG8gbWFzayBwcmV2aW91cyBlbGVtZW50cworI2RlZmluZSBfREVWX01BU0tfQ09NUElMRVIgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBfREVWX01BU0tfQklUQ09VTlQgICAgICAweDAwMDAwRjAwTAorI2RlZmluZSBfREVWX01BU0tfQUREU1VQUE9SVCAgICAweDAwMDBGMDAwTAorI2RlZmluZSBfREVWX01BU0tfQUxJR05NRU5UICAgICAweDAwRjAwMDAwTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluZXMgZm9yIGRldmVsb3BtZW50IHN5c3RlbSAoREVWX1NZU1RFTSkgaW5jbHVkaW5nIHByZXZpb3VzIGVsZW1lbnRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIF9ERVZfV0lOMTZfICAgICAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfTVNWQzE2XyAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9XSU4zMl8gICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDMzJfICAgICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9NU1ZDX0RPU18gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDX1YxXzVfICAgICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX0JPUkxBTkRfRE9TXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0JPUkxBTkRDXyAgICAgICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0tFSUxfQzUxWF8gICAgICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX0tFSUw4XyAgICAgfCBfREVWX0JJR0VORF8gfCBfREVWX0NPTU1BX0VYVF8pCS8vIGF0IGxlYXN0IEM1MSB2ZXJzaW9uIDcuMDUgc3VwcG9ydHMgY29tbWEgZXh0ZW5zaW9uCisjZGVmaW5lIF9ERVZfS0VJTF9DMTZYXyAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfS0VJTDE2XyAgICAgICAgICAgICAgICAgICB8IF9ERVZfQ09NTUFfRVhUXykJLy8gYXQgbGVhc3QgQzE2NiB2ZXJzaW9uIDUuMDMgc3VwcG9ydHMgY29tbWEgZXh0ZW5zaW9uCisjZGVmaW5lIF9ERVZfVEFTS0lOR19DNTFYXyAgICAgIChfREVWX0JJVDhfICB8IF9ERVZfVEFTS0lORzhfICB8IF9ERVZfQklHRU5EXykKKyNkZWZpbmUgX0RFVl9UQVNLSU5HX0MxNlhfICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9UQVNLSU5HMTZfICAgICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX0ZVSklUU1VfRjU5MF8gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX0ZVSklUU1VfICAgICAgICAgICAgICAgICAgfCBfREVWX0NPTU1BX0VYVF8pCS8vIHNvZnR1bmUgaXMgbm90IGFibGUgdG8gc3VwcG9ydCA2NCBiaXQgdmFyaWFibGVzIFFXT1JEICEhIQorLy9mLmouMjkuMDQuMDMgTTE2QyBrYW5uIGVmZmVrdGl2IG1pdCBCeXRlcyB1bWdlaGVuCisvLyNkZWZpbmUgX0RFVl9UQVNLSU5HX00xNkNfICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX1RBU0tJTkdfTTE2Q18gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX1RBU0tJTkdNMTZDXyAgICAgICAgICAgICApCisjZGVmaW5lIF9ERVZfTUlUU1VCSVNISV9NMTZDXyAgIChfREVWX0JJVDhfICB8IF9ERVZfTUlUU1VCSVNISU0xNkNfICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9HTlVfTVBDNVg1XyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX01QQzVYNXwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9MSU5VWF8gICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9MSU5VWF9HQ0NfICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfQzE2WF8gICAgICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9HTlVDX0MxNlhfICAgICAgICAgICAgICAgKQkvL3wgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX01DV19NUEM1WDVfICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0dOVV9BUk03XyAgICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfQVJNN18gICAgICAgICAgICAgICAgfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXykKKyNkZWZpbmUgX0RFVl9XSU4zMl9SVFhfICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU1ZDX1JUWF8gICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9ISUdIVEVDX1g4Nl8gICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9ISUdIVEVDX0dOVUNfWDg2XyAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9XSU5fQ0VfICAgICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NU0VWQ18gICAgICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9LRUlMX0NBUk1fICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9LRUlMX0FSTV8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9JQVJfQ0FSTV8gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9JQVJfQVJNXyAgICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9SVkNUX0NBUk1fICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9SVkNUX0FSTV8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfTUNXX01DRjVYWFhfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTUVUUk9XRVJLU19DV18gICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0NGNTI4Ml8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19DRl8gICB8IF9ERVZfQklHRU5EXykKKyNkZWZpbmUgX0RFVl9QQVJfQkVDSzFYM18gICAgICAgKF9ERVZfQklUMTZfIHwgX0RFVl9QQVJBREdNX1g4NikKKyNkZWZpbmUgX0RFVl9HTlVfQ0Y1NDhYXyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX0NGXyAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfSTM4Nl8gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX1g4Nl8gICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfR05VX1RSSUNPUkVfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19UQ18gICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fIHwgX0RFVl9BTElHTk1FTlRfNF8pCisjZGVmaW5lIF9ERVZfTVBMQUJfRFNQSUMzM0ZfICAgIChfREVWX0JJVDE2XyB8IF9ERVZfTVBMQUJfQzMwXyAgICAgICAgICAgICAgICkJLy98IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfTUlQU0VMXyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX01JUFMyXyAgICAgfCBfREVWX0JJR0VORF8gfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXykKKworI2RlZmluZSBfREVWX1JFTkVTQVNfTTMyQ18gICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX1JFTkVTQVNNMzJDKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHVzZWZ1bGwgbWFjcm9zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENIRUNLX0lGX09OTFlfSU5UX01BSU4oKSAgICAoREVWX1NZU1RFTSAmIF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIENIRUNLX01FTU9SWV9BTElOTUVOVCgpICAgICAoREVWX1NZU1RFTSAmIF9ERVZfTUFTS19BTElHTk1FTlQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5lcyBmb3IgdGFyZ2V0IHN5c3RlbSAoVEFSR0VUX1NZU1RFTSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgX0RPU18gICAgICAgICAgICAgICgxNiArIDB4MTAwMDApCisjZGVmaW5lIF9XSU4xNl8gICAgICAgICAgICAgMTYKKyNkZWZpbmUgX1dJTjMyXyAgICAgICAgICAgICAzMgorI2RlZmluZSBfV0lOQ0VfICAgICAgICAgICAgKDMyICsgMHgyMDAwMCkKKyNkZWZpbmUgX05PX09TXyAgICAgICAgICAgICAgMAorI2RlZmluZSBfTElOVVhfICAgICAgICAgICAgICAxCisjZGVmaW5lIF9QWFJPU18gICAgICAgICAgICAgIDIKKyNkZWZpbmUgX0VDT1NQUk9fICAgICAgICAgICAgMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBmdW5jdGlvbiBpbmxpbmluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04JCS8vIGVtcHR5IGRlZmluZQorI3VuZGVmICBJTkxJTkVfRU5BQkxFRAkJLy8gZGlzYWJsZSBhY3R1YWwgaW5saW5pbmcgb2YgZnVuY3Rpb25zCisjdW5kZWYgIElOTElORV9GVU5DVElPTl9ERUYJLy8gZGlzYWJsZSBpbmxpbmluZyBmb3IgYWxsIGNvbXBpbGVycyBwZXIgZGVmYXVsdAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBLZWlsIEM1MQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmICBfX0M1MV9fCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfS0VJTF9DNTFYXworCisjcHJhZ21hIERFQlVHIE9CSkVDVEVYVEVORAorI3ByYWdtYSBXQVJOSU5HTEVWRUwoMikJCS8vIG1heGltdW0gd2FybmluZyBsZXZlbAorCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgeGRhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgICAgICAgICAgY29kZQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHhkYXRhCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFICAgICAgICAgICBsYXJnZQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgeGRhdGEJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQgICAgICAgcmVlbnRyYW50CisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEdOVSBDb21waWxlciBmb3IgSW5maW5lb24gQzE2eAorLy8gIC0gaXQgaGF2ZSB0byBiZSBiZWZvciBLZWlsIChpdCBoYXMgX19DMTY2X18gdG9vKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19DMTY2X18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX0MxNlhfCisKKy8vICAgICNkZWZpbmUgTkVBUiAgICAgICAgICAgIGlkYXRhICAgICAgIC8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBuZWFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisvLyAgICAjZGVmaW5lIEZBUiAgICAgICAgICAgICB4aHVnZSAgICAgICAvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgaHVnZQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworLy8gICAgI2RlZmluZSBIV0FDQyAgICAgICAgICAgc2RhdGEgICAgICAgLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIGh1Z2UJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKy8vICAgICNkZWZpbmUgR0VORVJJQyAgICAgICAgIHhodWdlICAgICAgIC8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICBodWdlCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKworI2RlZmluZSBBU1NFUlQocCkgIFwKKyAgICAgICAgICAgIGlmIChwKSAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA7ICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQUklOVEYwKCJBc3NlcnQgZmFpbGVkOiAiICNwICIgKGZpbGUgJXMgbGluZSAlZClcbiIsIF9fRklMRV9fLCAoaW50KSBfX0xJTkVfXyApOyBcCisgICAgICAgICAgICAgICAgd2hpbGUgKDEpOyBcCisgICAgICAgICAgICB9CisjZWxzZQorI2RlZmluZSBBU1NFUlQocCkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBLZWlsIEMxNjYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DMTY2X18pCS8vIDI0LjAxLjIwMDUgci5kLjogS2VpbCBBUk03IG5lZWRzIGRpcmVjdGl2ZSAnZGVmaW5lZCcKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9LRUlMX0MxNlhfCisKKyNwcmFnbWEgQ09ERQorI3ByYWdtYSBNT0QxNjcKKyNwcmFnbWEgTk9JTklUCisjcHJhZ21hIERFQlVHCisjcHJhZ21hIFdBUk5JTkdMRVZFTCgzKQkJLy8gbWF4aW11bSB3YXJuaW5nIGxldmVsCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDQ3CS8vIHdhcm5pbmcgPHVucmVmZXJlbmNlZCBwYXJhbWV0ZXI+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDM4CS8vIHdhcm5pbmcgPGVtcHR5IHRyYW5zbGF0aW9uIHVuaXQ+ID0gT0ZGCisvLyAgI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxMDIgICAgICAgLy8gd2FybmluZyA8ZGlmZmVyZW50IGNvbnN0L3ZvbGF0aWxlIHF1YWxpZmllcnM+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDE3NAkvLyB3YXJuaW5nIDx1bnJlZmVyZW5jZWQgJ3N0YXRpYycgZnVuY3Rpb24+ID0gT0ZGCisjcHJhZ21hIFdBUk5JTkcgRElTQUJMRSA9IDE4MwkvLyB3YXJuaW5nIDxkZWFkIGFzc2lnbmVtZW50IGVsaW1pbmF0ZWQ+ID0gT0ZGCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIGlkYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICB4aHVnZQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworLy8gICAgI2RlZmluZSBIV0FDQyAgICAgICAgICAgc2RhdGEgICAgICAgLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgSFdBQ0MgICAgICAgICAgIGh1Z2UJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQyAgICAgICAgIHhodWdlCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNUExBQiBDMzAgZm9yIGRzUElDMzNGIHNlcmllcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0MzMF9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01QTEFCX0RTUElDMzNGXworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKy8vICAgICNpZm5kZWYgUVdPUkQKKy8vICAgICAgICAjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworLy8gICAgI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBBUk0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DQV9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0tFSUxfQ0FSTV8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgUmVhbFZpZXcgQVJNIGNvbXBpbGF0aW9uIHRvb2xzIChwcm92aWRlZCBieSByZWNlbnQgS2VpbCBNaWNyb2NvbnRyb2xsZXIgRGV2ZWxvcG1lbnQgS2l0cykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1JWQ1RfQ0FSTV8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIEFTU0VSVChleHByKSAgICBpZiAoIShleHByKSkge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UwICgiQXNzZXJ0aW9uIGZhaWxlZDogIiAjZXhwciApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpO30KKyNlbHNlCisjZGVmaW5lIEFTU0VSVChleHByKQorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQVJNIElBUiBDIENvbXBpbGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fSUNDQVJNX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfSUFSX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisgICAgLy8gV29ya2Fyb3VuZDoKKyAgICAvLyBJZiB3ZSB1c2UgSUFSIGFuZCB3YW50IHRvIGRlYnVnIGJ1dCBkb24ndCB3YW50IHRvIHVzZSBDLVNweSBEZWJ1Z2dlcgorICAgIC8vIGFzc2VydCgpIGRvZXNuJ3Qgd29yayBpbiBkZWJ1ZyBtb2RlIGJlY2F1c2UgaXQgbmVlZHMgc3VwcG9ydCBmb3IgRklMRSBkZXNjcmlwdG9ycworICAgIC8vIChfRExJQl9GSUxFX0RFU0NSSVBUT1IgPT0gMSkuCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBBU1NFUlQoZXhwcikgICAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2V4cHIgKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorLy8gICAgICAgICNkZWZpbmUgVFJBQ0UgIFBSSU5URjQKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBUYXNraW5nIDgwNTEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9DQzUxKQorCisjaW5jbHVkZSA8Y2M1MS5oPgorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfQzUxWF8KKworI2RlZmluZSBORUFSICAgICAgICAgICAgX2RhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIF94ZGF0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBfeGRhdAkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTSAgICAgICAgICAgICBfeGRhdAkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVCAgICAgICBfcmVlbnRyYW50CisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFRhc2tpbmcgQzE2N0NSIGFuZCBDMTY0Q0kKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9DMTY2KQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfQzE2WF8KKworI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisgICAgLy8gU3RkaW8uaCBoYXMgdG8gYmUgYWx3YXkgaW5jbHVkZWQgaGVyZS4gSWYgcHJpbnRmKCkgaXMgdXNlZCBzdGRpby5oIGRlZmluZXMgTlVMTAorICAgIC8vIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaXMgYWxyZWFkeSBpbmNsdWRlZC4gU28gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXBpbGluZy4KKyAgICAvLyAoci5kLikKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgRlVKSVRTVSBGRk1DLTE2TFggTUI5MDU5MAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8jZWxpZiAoZGVmaW5lZCAoRjU5MCkgfHwgZGVmaW5lZCAoRjU0MykgfHwgZGVmaW5lZCAoRjU5OCkgfHwgZGVmaW5lZCAoRjQ5NSkgfHwgZGVmaW5lZCAoRjM1MCkpCisjZWxpZiBkZWZpbmVkKF9fQ09NUElMRVJfRkNDOTA3X18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfRlVKSVRTVV9GNTkwXworCisjZGVmaW5lIE5FQVIgICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgLyogdG8gYmUgZGVmaW5lZCAqLwkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyAgICAvLyBzb2Z0dW5lIGlzIG5vdCBhYmxlIHRvIHN1cHBvcnQgNjQgYml0IHZhcmlhYmxlcyBRV09SRCAhISEKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTWl0c3ViaXNoaSBNMTZDIGZhbWlseSBmb3IgVEFTS0lORyBDb21waWxlciBDTTE2CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQ00xNkMpCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfVEFTS0lOR19NMTZDXworCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBfbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgX2ZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgX2ZhcnJvbQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBfbmVhcgkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDICAgICAgICAgX2ZhcgkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKwkJCQkJLy8gZG8geW91IHVzZSBtZW1vcnkgbW9kZWwgU01BTEwsIHRoYW4geW91IGhhdmUgdG8gc2V0IF9mYXIKKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyAgICAvLyBTdGRpby5oIGhhcyB0byBiZSBhbHdheSBpbmNsdWRlZCBoZXJlLiBJZiBwcmludGYoKSBpcyB1c2VkIHN0ZGlvLmggZGVmaW5lcyBOVUxMCisgICAgLy8gd2l0aG91dCBjaGVja2luZyBpZiBpdCBpcyBhbHJlYWR5IGluY2x1ZGVkLiBTbyBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tcGlsaW5nLgorICAgIC8vIChyLmQuKQorI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNaXRzdWJpc2hpIE0xNkMgZmFtaWx5IGZvciBNaXRzdWJpc2hpIENvbXBpbGVyIE5DMzAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBuYW1lIE5DMzAsIGFuZGVyZSBGb3JtIHdpbGwgZGVyIENvbXBpbGVyIG5pY2h0ICEhCisjZWxpZiBkZWZpbmVkIChOQzMwKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01JVFNVQklTSElfTTE2Q18KKworI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICBuZWFyCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICBmYXIJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFJlbmVzYXMgTTMyQyBmYW1pbHkgZm9yIFJlbmVzYXMgQ29tcGlsZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChOQzMwOCkKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9SRU5FU0FTX00zMkNfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgICBuZWFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICAgZmFyCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgIGZhcgkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLyAgICAjZXJyb3IgKCJSRU5FU0FTIG8uay4iKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBBUk03IGZhbWlseSB3aXRoIEdOVSBjb21waWxlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX0xJTlVYX0FSTV9BUkNIX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX0FSTTdfCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZwkJLy8gaS5BLiBkdXJjaCBIZXJyIEt1c2NoZWwKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1vdG9yb2xhIFBvd2VyUEMgZmFtaWx5IDV4NSAoNTU1LzU2NSkKKy8vICBkZWZpbml0aW9ucyBMaW51eC1QQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisKKyNpZiBkZWZpbmVkIChMSU5VWCkgfHwgZGVmaW5lZCAobGludXgpIHx8IGRlZmluZWQgKF9fbGludXhfXykKKyNkZWZpbmUgTElOVVhfU1lTVEVNCQkvLyBkZWZpbmUgJ0xJTlVYX1NZU1RFTScgdW5pZm9ybSBmb3IgYWxsIExpbnV4IGJhc2VkIHN5c3RlbXMKKwkvLyByLmQuOiBXZSB3aWxsIG5lZWQgYW4gb3RoZXIgc29sdXRpb24gaGVyZSEgVGhlcmUgYXJlIHR3byBzZWN0aW9ucyBoZXJlIHdoaWNoIGRvIGNoZWNrIHRoZSBwcmVwcm9jLWRlZmluaXRpb25zOgorCS8vICAgICBMSU5VWCBhbmQgX19saW51eF9fIC4gVGhlIGZpcnN0IG9uZSB3YXMgTGludXggZm9yIFBDLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGlzIHNlY3Rpb24gZm9yIGVtYmVkZGVkIExpbnV4IChNQ0Y1eHh4KS4KKwkvLyAgICAgQnV0IExpbnV4IGZvciBQQyBkb2VzIG5vdCBuZWVkIHRoZSBkZWZpbml0aW9ucyBmb3IgZW1iZWRkZWQgTGludXguCisjZW5kaWYKKworICAgIC8vIEdOVSBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIGlubGluaW5nCisjZGVmaW5lIElOTElORV9GVU5DVElPTl9ERUYgZXh0ZXJuIGlubGluZQorCisgICAgLy8gdG8gYWN0dWFsbHkgZW5hYmxlIGlubGluaW5nIGp1c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzCisgICAgLy8gI3VuZGVmIElOTElORV9GVU5DVElPTgorICAgIC8vICNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisgICAgLy8gI2RlZmluZSBJTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKworI2lmZGVmIFBYUk9TCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX1BYUk9TXworI2lmZGVmIF9faTM4Nl9fCisjdW5kZWYgTElOVVgJCQkvLyB0aGlzIGRlZmluZSBzZWVtcyB0byBiZSBzZXQgZnJvbSBjb21waWxlcgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9ISUdIVEVDX1g4Nl8KKyNlbGlmIGRlZmluZWQgKF9fdHJpY29yZV9fKQorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9HTlVfVFJJQ09SRV8KKyNlbHNlIC8vIE1QQzV4NQorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9HTlVfTVBDNVg1XworI2VuZGlmCisKKyNlbGlmIGRlZmluZWQgKExJTlVYKSB8fCBkZWZpbmVkIChfX2xpbnV4X18pCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX0xJTlVYXwkvLyBMaW51eCBkZWZpbml0aW9uCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9MSU5VWF8KKworI2VsaWYgZGVmaW5lZCAoR05VX0NGNTI4MikKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfQ0Y1MjgyXworCisjZWxpZiBkZWZpbmVkIChFQ09TUFJPX0kzODZfUEVBS19QQ0kpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX0VDT1NQUk9fCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfSTM4Nl8KKworI2VsaWYgZGVmaW5lZCAoR05VX0NGNTQ4WCkKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICAgICAgX0RFVl9HTlVfQ0Y1NDhYXworI2Vsc2UKKyNlcnJvciAnRVJST1I6IERFVl9TWVNURU0gbm90IGZvdW5kIScKKyNlbmRpZgorCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQKKyNlbmRpZgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1BYUk9TXykKKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00gICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJICAgIC8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIFFXT1JECisjZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIEdOVUMgZm9yIEkzODYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSB8fCAoVEFSR0VUX1NZU1RFTSA9PSBfRUNPU1BST18pCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbHNlCisjZGVmaW5lIFRSQUNFICBwcmludGsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBHTlUgd2l0aG91dCBPUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9OT19PU18pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisvLyAgICAgICAgICAgICNpbmNsdWRlICJ4dWFydGRydi5oIgorLy8gICAgICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgICAgIC8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisvLyAgICAgICAgICAgICNkZWZpbmUgVFJBQ0UgIG1wcmludGYKKy8vICAgICAgICAgICAgI2lmbmRlZiBUUkFDRQorLy8gICAgICAgICAgICAgICAgI2RlZmluZSBUUkFDRSB0cmFjZQorLy8gICAgICAgICAgICAgICAgdm9pZCB0cmFjZSAoY2hhciAqZm10LCAuLi4pOworLy8gICAgICAgICAgICAjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTVBDNTY1CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgX19NV0VSS1NfXworCisjaWZkZWYgX19NQzY4S19fCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSA9IF9NQ0Y1NDhYXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NQ1dfTUNGNVhYWF8KKworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSA9IF9NUEM1NjVfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01DV19NUEM1WDVfCisjZW5kaWYKKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQkVDSyAxeDMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pICYmIGRlZmluZWQgKF9fUEFSQURJR01fXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgX0RFVl9QQVJfQkVDSzFYM18KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgIC8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorI2RlZmluZSBORUFSIF9fbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBfX2ZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFBDCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl8JLy8gV0lOMzIgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl8KKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfRE9TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9CT1JMQU5EX0RPU18KKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIFdJTjMyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfRE9TXykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBuZWFyCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgIGZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgorCisjZWxpZiAoX01TQ19WRVIgPT0gODAwKQkJLy8gUEMgTVMgVmlzdWFsIEMvQysrIGZvciBET1MgYXBwbGljYXRpb25zCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9ET1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX01TVkNfRE9TXworCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyBuZWFyCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBuZWFyCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgIGZhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBUUkFDRSBwcmludGYKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZWZpbml0aW9ucyBmb3IgUlRYIHVuZGVyIFdJTjMyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgKGRlZmluZWQgKFVOREVSX1JUU1MpICYmIGRlZmluZWQgKFdJTjMyKSkKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl9SVFhfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1dJTjMyX1JUWF8KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIFJ0UHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVmaW5pdGlvbnMgZm9yIFdpbkNFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoX1dJTjMyX1dDRSkKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgICAgICAgX1dJTkNFXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgICAgICBfREVWX1dJTl9DRV8KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCSAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKworI2RlZmluZSBMQVJHRQorCisjaWZuZGVmIFFXT1JECisgICAgICAvLyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nIGludCAvLyBNU1ZDIC5ORVQgY2FuIHVzZSAibG9uZyBsb25nIGludCIgdG9vIChsaWtlIEdOVSkKKyNkZWZpbmUgUVdPUkQgX19pbnQ2NAorI2VuZGlmCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfX2NkZWNsCisKKyNpZmRlZiBBU1NFUlRNU0cKKyN1bmRlZiBBU1NFUlRNU0cKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSBwcmludGYKKy8vICAgICAgICAgICAgdm9pZCB0cmFjZSAoY2hhciAqZm10LCAuLi4pOworI2VuZGlmCisjZW5kaWYKKworI2Vsc2UgLy8gPT09PiBQQyBNUyBWaXN1YWwgQy9DKysKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBkZWZpbml0aW9uIHRhcmdldCBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX1dJTjMyXwkvLyBXSU4zMiBkZWZpbml0aW9uCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1dJTjMyXworI2Vsc2UKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4xNl8JLy8gV0lOMTYgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4xNl8KKyNlbmRpZgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIFdJTjE2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjE2XykKKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisJLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKwkvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2lmbmRlZiBORUFSCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUiBmYXIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9mYXIgX3Bhc2NhbCBfZXhwb3J0CisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIHRyYWNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisJdm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4zMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorI2lmbmRlZiBDT05TVAorI2RlZmluZSBDT05TVCBjb25zdAkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZW5kaWYKKyNkZWZpbmUgTEFSR0UKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfX3N0ZGNhbGwKKyNpZm5kZWYgUVdPUkQKKwkgIC8vI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50IC8vIE1TVkMgLk5FVCBjYW4gdXNlICJsb25nIGxvbmcgaW50IiB0b28gKGxpa2UgR05VKQorI2RlZmluZSBRV09SRCBfX2ludDY0CisjZW5kaWYKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjZGVmaW5lIFRSQUNFIHRyYWNlCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisJdm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKwkvLyBNUyBWaXN1YWwgQysrIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIGlubGluaW5nCisjZGVmaW5lIElOTElORV9GVU5DVElPTl9ERUYgX19mb3JjZWlubGluZQorCS8vIHRvIGFjdHVhbGx5IGVuYWJsZSBpbmxpbmluZyBqdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyB0d28gbGluZXMvLyAjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRi8vICNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisjZW5kaWYKKyNlbmRpZgkJCQkvLyA9PT0+IFBDCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vICBkZWZpbml0aW9ucyBvZiBiYXNpYyB0eXBlcy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIF9XSU5ERUZfCQkvLyBkZWZpbmVkIGluIFdJTkRFRi5ILCBpbmNsdWRlZCBieSA8d2luZG93cy5oPgorICAgIC8vIC0tLSBhcml0aG1ldGljIHR5cGVzIC0tLQorI2lmbmRlZiBTSE9SVAorI2RlZmluZSBTSE9SVCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBVU0hPUlQKKyNkZWZpbmUgVVNIT1JUIHVuc2lnbmVkIHNob3J0IGludAorI2VuZGlmCisjaWZuZGVmIElOVAorI2RlZmluZSBJTlQgaW50CisjZW5kaWYKKyNpZm5kZWYgVUlOVAorI2RlZmluZSBVSU5UIHVuc2lnbmVkIGludAorI2VuZGlmCisjaWZuZGVmIExPTkcKKyNkZWZpbmUgTE9ORyBsb25nIGludAorI2VuZGlmCisjaWZuZGVmIFVMT05HCisjZGVmaW5lIFVMT05HIHVuc2lnbmVkIGxvbmcgaW50CisjZW5kaWYKKyAgICAvLyAtLS0gbG9naWMgdHlwZXMgLS0tCisjaWZuZGVmIEJZVEUKKyNkZWZpbmUgQllURSB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyNpZm5kZWYgV09SRAorI2RlZmluZSBXT1JEIHVuc2lnbmVkIHNob3J0IGludAorI2VuZGlmCisjaWZuZGVmIERXT1JECisjZGVmaW5lIERXT1JEIHVuc2lnbmVkIGxvbmcgaW50CisjZW5kaWYKKyNpZm5kZWYgQk9PTAorI2RlZmluZSBCT09MIHVuc2lnbmVkIGNoYXIKKyNlbmRpZgorICAgIC8vIC0tLSBhbGlhcyB0eXBlcyAtLS0KKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFICAweEZGCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMHgwMAorI2VuZGlmCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIF9USU1FX09GX0RBWV9ERUZJTkVEXwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaW50IG1fZHdNczsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgbV93RGF5czsKKworfSB0VGltZU9mRGF5OworCisjZGVmaW5lIF9USU1FX09GX0RBWV9ERUZJTkVEXworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWZpbml0aW9uIHZvbiBUUkFDRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKKworI2lmbmRlZiBUUkFDRTAKKyNkZWZpbmUgVFJBQ0UwKHAwKSAgICAgICAgICAgICAgICAgICAgICBUUkFDRShwMCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMQorI2RlZmluZSBUUkFDRTEocDAsIHAxKSAgICAgICAgICAgICAgICAgIFRSQUNFKHAwLCBwMSkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMgorI2RlZmluZSBUUkFDRTIocDAsIHAxLCBwMikgICAgICAgICAgICAgIFRSQUNFKHAwLCBwMSwgcDIpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTMKKyNkZWZpbmUgVFJBQ0UzKHAwLCBwMSwgcDIsIHAzKSAgICAgICAgICBUUkFDRShwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNAorI2RlZmluZSBUUkFDRTQocDAsIHAxLCBwMiwgcDMsIHA0KSAgICAgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNQorI2RlZmluZSBUUkFDRTUocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTYKKyNkZWZpbmUgVFJBQ0U2KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KSAgVFJBQ0UocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpCisjZW5kaWYKKworI2Vsc2UKKworI2lmbmRlZiBUUkFDRTAKKyNkZWZpbmUgVFJBQ0UwKHAwKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UxCisjZGVmaW5lIFRSQUNFMShwMCwgcDEpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTIKKyNkZWZpbmUgVFJBQ0UyKHAwLCBwMSwgcDIpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTMKKyNkZWZpbmUgVFJBQ0UzKHAwLCBwMSwgcDIsIHAzKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U0CisjZGVmaW5lIFRSQUNFNChwMCwgcDEsIHAyLCBwMywgcDQpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTUKKyNkZWZpbmUgVFJBQ0U1KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTYKKyNkZWZpbmUgVFJBQ0U2KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KQorI2VuZGlmCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb24gb2YgQVNTRVJUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEFTU0VSVAorI2lmICFkZWZpbmVkIChfX2xpbnV4X18pICYmICFkZWZpbmVkIChfX0tFUk5FTF9fKQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmbmRlZiBBU1NFUlQKKyNkZWZpbmUgQVNTRVJUKHApICAgIGFzc2VydChwKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBBU1NFUlQocCkKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU1lTIFRFQyBleHRlbnNpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1hY3JvIGRvZXNuJ3QgcHJpbnQgb3V0IEMtZmlsZSBhbmQgbGluZSBudW1iZXIgb2YgdGhlIGZhaWxlZCBhc3NlcnRpb24KKy8vIGJ1dCBhIHN0cmluZywgd2hpY2ggZXhhY3RseSBuYW1lcyB0aGUgbWlzdGFrZS4KKyNpZm5kZWYgTkRFQlVHCisKKyNkZWZpbmUgQVNTRVJUTVNHKGV4cHIsc3RyaW5nKSAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRGMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgc3RyaW5nICk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlRNU0coZXhwcixzdHJpbmcpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0dMT0JBTF9IXworCisvLyBQbGVhc2Uga2VlcCBhbiBlbXB0eSBsaW5lIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGU4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbHNwYWNlIERMTCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExLX0hfCisjZGVmaW5lIF9FUExfRExMS19IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoKnRFcGxEbGxrQ2JBc3luYykgKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2JlX2FiU3JjTWFjWzZdOworCit9IHRFcGxEbGxrSW5pdFBhcmFtOworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCitzdHJ1Y3QgX3RFZHJ2VHhCdWZmZXI7CisKK3N0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyB7CisJc3RydWN0IF90RXBsRGxsa05vZGVJbmZvICptX3BOZXh0Tm9kZUluZm87CisJc3RydWN0IF90RWRydlR4QnVmZmVyICptX3BQcmVxVHhCdWZmZXI7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJRFdPUkQgbV9kd1ByZXNUaW1lb3V0OworCXVuc2lnbmVkIGxvbmcgbV91bERsbEVycm9yRXZlbnRzOworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOworCVdPUkQgbV93UHJlc1BheWxvYWRMaW1pdDsKKwlCWVRFIG1fYmVfYWJNYWNBZGRyWzZdOworCUJZVEUgbV9iU29hRmxhZzE7CisJQk9PTCBtX2ZTb2Z0RGVsZXRlOwkvLyBkZWxldGUgbm9kZSBhZnRlciBlcnJvciBhbmQgaWdub3JlIGVycm9yCisKK307CisKK3R5cGVkZWYgc3RydWN0IF90RXBsRGxsa05vZGVJbmZvIHRFcGxEbGxrTm9kZUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtBZGRJbnN0YW5jZSh0RXBsRGxsa0luaXRQYXJhbSAqIHBJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBjYWxsZWQgYmVmb3JlIE5NVF9HU19DT01NVU5JQ0FUSU5HIHdpbGwgYmUgZW50ZXJlZCB0byBjb25maWd1cmUgZml4ZWQgcGFyYW1ldGVycwordEVwbEtlcm5lbCBFcGxEbGxrQ29uZmlnKHRFcGxEbGxDb25maWdQYXJhbSAqIHBEbGxDb25maWdQYXJhbV9wKTsKKworLy8gc2V0IGlkZW50aXR5IG9mIGxvY2FsIG5vZGUgKG1heSBiZSBhdCBhbnkgdGltZSwgZS5nLiBpbiBjYXNlIG9mIGhvc3RuYW1lIGNoYW5nZSkKK3RFcGxLZXJuZWwgRXBsRGxsa1NldElkZW50aXR5KHRFcGxEbGxJZGVudFBhcmFtICogcERsbElkZW50UGFyYW1fcCk7CisKKy8vIHByb2Nlc3MgaW50ZXJuYWwgZXZlbnRzIGFuZCBkbyB3b3JrIHRoYXQgY2Fubm90IGJlIGRvbmUgaW4gaW50ZXJydXB0LWNvbnRleHQKK3RFcGxLZXJuZWwgRXBsRGxsa1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyByZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKK3RFcGxLZXJuZWwgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCk7CisKKy8vIGRlcmVnaXN0ZXJzIGhhbmRsZXIgZm9yIG5vbi1FUEwgZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCk7CisKKy8vIHJlZ2lzdGVyIENfRExMX01VTFRJQ0FTVF9BU05EIGluIGV0aGVybmV0IGRyaXZlciBpZiBhbnkgQXNuZFNlcnZpY2VJZCBpcyByZWdpc3RlcmVkCit0RXBsS2VybmVsIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCQkgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCisvLyBjcmVhdGVzIHRoZSBidWZmZXIgZm9yIGEgVHggZnJhbWUgYW5kIHJlZ2lzdGVycyBpdCB0byB0aGUgZXRoZXJuZXQgZHJpdmVyCit0RXBsS2VybmVsIEVwbERsbGtDcmVhdGVUeEZyYW1lKHVuc2lnbmVkIGludCAqcHVpSGFuZGxlX3AsCisJCQkJdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQl1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCXRFcGxNc2dUeXBlIE1zZ1R5cGVfcCwKKwkJCQl0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0RlbGV0ZVR4RnJhbWUodW5zaWduZWQgaW50IHVpSGFuZGxlX3ApOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrU29mdERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8odEVwbERsbGtOb2RlSW5mbyAqKiBwcE5vZGVJbmZvX3ApOworCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTEtfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRkYzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsa0NhbC5oCkBAIC0wLDAgKzEsMTQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWxzcGFjZSBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrQ2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExLQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMS0NBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsQ3VyVHhGcmFtZUNvdW50R2VuOworCXVuc2lnbmVkIGxvbmcgbV91bEN1clR4RnJhbWVDb3VudE5tdDsKKwl1bnNpZ25lZCBsb25nIG1fdWxDdXJSeEZyYW1lQ291bnQ7CisJdW5zaWduZWQgbG9uZyBtX3VsTWF4VHhGcmFtZUNvdW50R2VuOworCXVuc2lnbmVkIGxvbmcgbV91bE1heFR4RnJhbWVDb3VudE5tdDsKKwl1bnNpZ25lZCBsb25nIG1fdWxNYXhSeEZyYW1lQ291bnQ7CisKK30gdEVwbERsbGtDYWxTdGF0aXN0aWNzOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbERlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4Q291bnQodEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgKiBwUHJpb3JpdHlfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqcHVpQ291bnRfcCk7Cit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUodm9pZCAqcEZyYW1lX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisvLyBvbmx5IGZyYW1lcyB3aXRoIHJlZ2lzdGVyZWQgQXNuZFNlcnZpY2VJZHMgYXJlIHBhc3NlZCB0byBDQUwKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jQ2xlYXJCdWZmZXIodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3ModEVwbERsbGtDYWxTdGF0aXN0aWNzICoqIHBwU3RhdGlzdGljcyk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxJc3N1ZVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCBTZXJ2aWNlX3AsCisJCQkJICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkICogcFJlcVNlcnZpY2VJZF9wLAorCQkJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwkJCQkJICAgICBBc3luY1JlcVByaW9fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlDb3VudF9wKTsKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExLQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2N2VmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbEVycm9ySGFuZGxlcmsuaApAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIGVycm9yIGhhbmRsZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyb3JIYW5kbGVyay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMDIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVJST1JIQU5ETEVSS19IXworI2RlZmluZSBfRVBMX0VSUk9SSEFORExFUktfSF8KKworI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGluaXQgZnVuY3Rpb24KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtJbml0KHZvaWQpOworCisvLyBhZGQgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtBZGRJbnN0YW5jZSh2b2lkKTsKKworLy8gZGVsZXRlIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrRGVsSW5zdGFuY2Uodm9pZCk7CisKKy8vIHByb2Nlc3NlcyBlcnJvciBldmVudHMKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEVycm9ySGFuZGxlcmtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FUlJPUkhBTkRMRVJLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbEV2ZW50ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjVhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIGV2ZW50IG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50ay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVZFTlRLX0hfCisjZGVmaW5lIF9FUExfRVZFTlRLX0hfCisKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtJbml0KHRFcGxTeW5jQ2IgZnBTeW5jQ2IpOworCisvLyBhZGQgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0FkZEluc3RhbmNlKHRFcGxTeW5jQ2IgZnBTeW5jQ2IpOworCisvLyBkZWxldGUgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIHBvc3QgZXZlbnRzIGZyb20ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGVycm9yZXZlbnRzIGZyb20ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVEtfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQwOWNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10ay5oCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtS2VybmVsc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10ay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMTk1US19IXworI2RlZmluZSBfRVBMTk1US19IXworCisjaW5jbHVkZSAiLi4vRXBsTm10LmgiCisjaW5jbHVkZSAiRXBsRXZlbnRrLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRrQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdGtEZWxJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrUHJvY2VzcyhFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgdEVwbEV2ZW50ICogcEV2ZW50X3ApOworCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQworRXBsTm10a0dldE5tdFN0YXRlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkZWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGtDYWwuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyIG9mIHRoZQorICAgICAgICAgICAgICAgIE5NVC1LZXJuZWwtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10a0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbE5tdGsuaCIKKworI2lmbmRlZiBfRVBMTk1US0NBTF9IXworI2RlZmluZSBfRVBMTk1US0NBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1US0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWY1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbC1PYmQtS2VybmVsLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jkay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRLX0hfCisjZGVmaW5lIF9FUExPQkRLX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiBCWVRFIE1FTSBhYkVwbE9iZFRyYXNoT2JqZWN0X2dbOF07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEluaXQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqCisJCQkJCQkgcEluaXRQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkRGVsZXRlSW5zdGFuY2UoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCXVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCXRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkgICAgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgZnBDYWxsYmFja19wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWNjZXNzT2RQYXJ0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlZmluZVZhcihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdEVwbFZhclBhcmFtIE1FTSAqIHBWYXJQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZEdldE9iamVjdERhdGFQdHIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVnaXN0ZXJVc2VyT2QoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICB0RXBsT2JkRW50cnlQdHIgcFVzZXJPZF9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkSW5pdFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICB0RXBsT2JkVHlwZSBUeXBlX3AsCisJCQkJCSAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkR2V0RGF0YVNpemUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkR2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZXROb2RlSWQoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICAgdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSXNOdW1lcmljYWwoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgQk9PTCAqIHBmRW50cnlOdW1lcmljYWwpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeUZyb21MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgICAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkUmVhZEVudHJ5VG9MZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkR2V0QWNjZXNzVHlwZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgIHBBY2Nlc3NUeXBfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkJICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKioKKwkJCQkJCSAgICBwcFZhckVudHJ5X3ApOworCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3M2E5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGtDYWwuaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLUtlcm5lbHNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jka0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRLQ0FMX0hfCisjZGVmaW5lIF9FUExPQkRLQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRLQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMThmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2suaApAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9LX0hfCisjZGVmaW5lIF9FUExfUERPS19IXworCisjaW5jbHVkZSAiLi4vRXBsUGRvLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcHJvY2VzcyBldmVudHMgZnJvbSBxdWV1ZSAoUERPcy9mcmFtZXMgYW5kIFNvQSBmb3Igc3luY2hyb25pemF0aW9uKQordEVwbEtlcm5lbCBFcGxQZG9rUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIGNvcGllcyBSUERPIHRvIGV2ZW50IHF1ZXVlIGZvciBwcm9jZXNzaW5nCisvLyBpcyBjYWxsZWQgYnkgRExMIGluIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwKKy8vIFBETyBuZWVkcyBub3QgdG8gYmUgdmFsaWQKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vIHBvc3RzIHBvaW50ZXIgYW5kIHNpemUgb2YgVFBETyB0byBldmVudCBxdWV1ZQorLy8gaXMgY2FsbGVkIGJ5IERMTCBpbiBOTVRfQ1NfUFJFX09QRVJBVElPTkFMXzIsCisvLyAgICAgTk1UX0NTX1JFQURZX1RPX09QRVJBVEUgYW5kIE5NVF9DU19PUEVSQVRJT05BTAordEVwbEtlcm5lbCBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy8gcG9zdHMgU29BIGV2ZW50IHRvIHF1ZXVlCit0RXBsS2VybmVsIEVwbFBkb2tDYlNvYSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxQZG9rQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0RlbEluc3RhbmNlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET0tfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4M2ViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRva0NhbC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBQRE8gQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rQ2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9QRE9LQ0FMX0hfCisjZGVmaW5lIF9FUExfUERPS0NBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsSW5jLmgiCisvLyNpbmNsdWRlICJFcGxQZG8uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbERlbEluc3RhbmNlKHZvaWQpOworCisvLyBzZXRzIGZsYWcgZm9yIHZhbGlkaXR5IG9mIFRQRE9zIGluIHNoYXJlZCBtZW1vcnkKK3RFcGxLZXJuZWwgRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoQk9PTCBmVmFsaWRfcCk7CisKKy8vIGdldHMgZmxhZyBmb3IgdmFsaWRpdHkgb2YgVFBET3MgZnJvbSBzaGFyZWQgbWVtb3J5Cit0RXBsS2VybmVsIEVwbFBkb2tDYWxBcmVUcGRvc1ZhbGlkKEJPT0wgKiBwZlZhbGlkX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET0tDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQwNDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFUEwgaGlnaCByZXNvbHV0aW9uIFRpbWVybW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJIaWdoUmVzay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMjkgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFRpbWVyLmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSSElHSFJFU0tfSF8KKyNkZWZpbmUgX0VQTFRJTUVSSElHSFJFU0tfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0luaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrU2V0VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdWxsVGltZU5zX3AsCisJCQkJCSAgICAgdEVwbFRpbWVya0NhbGxiYWNrIHBmbkNhbGxiYWNrX3AsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1bEFyZ3VtZW50X3AsCisJCQkJCSAgICAgQk9PTCBmQ29udGludW91c2x5X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB1bGxUaW1lTnNfcCwKKwkJCQkJCXRFcGxUaW1lcmtDYWxsYmFjaworCQkJCQkJcGZuQ2FsbGJhY2tfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkJQk9PTCBmQ29udGludW91c2x5X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJISUdIUkVTS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTYwZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBLZXJuZWwtVGltZXJtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcmsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorI2luY2x1ZGUgIi4uL3VzZXIvRXBsRXZlbnR1LmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSS19IXworI2RlZmluZSBfRVBMVElNRVJLX0hfCisKKyNpZiBFUExfVElNRVJfVVNFX1VTRVIgIT0gRkFMU0UKKyNpbmNsdWRlICIuLi91c2VyL0VwbFRpbWVydS5oIgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgRVBMX1RJTUVSX1VTRV9VU0VSICE9IEZBTFNFCisjZGVmaW5lIEVwbFRpbWVya0luaXQgICAgICAgICAgIEVwbFRpbWVydUluaXQKKyNkZWZpbmUgRXBsVGltZXJrQWRkSW5zdGFuY2UgICAgRXBsVGltZXJ1QWRkSW5zdGFuY2UKKyNkZWZpbmUgRXBsVGltZXJrRGVsSW5zdGFuY2UgICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKyNkZWZpbmUgRXBsVGltZXJrU2V0VGltZXJNcyAgICAgRXBsVGltZXJ1U2V0VGltZXJNcworI2RlZmluZSBFcGxUaW1lcmtNb2RpZnlUaW1lck1zICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisjZGVmaW5lIEVwbFRpbWVya0RlbGV0ZVRpbWVyICAgIEVwbFRpbWVydURlbGV0ZVRpbWVyCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEVQTF9USU1FUl9VU0VfVVNFUiA9PSBGQUxTRQordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrSW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya0RlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrRGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApOworI2VuZGlmCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMVElNRVJLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL1ZpcnR1YWxFdGhlcm5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBWaXJ0dWFsRXRoZXJuZXQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMTkgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfVkVUSF9IXworI2RlZmluZSBfRVBMX1ZFVEhfSF8KKworI2luY2x1ZGUgIkVwbERsbGsuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgVkV0aEFkZEluc3RhbmNlKHRFcGxEbGxrSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgVkV0aERlbEluc3RhbmNlKHZvaWQpOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9WRVRIKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9WRVRIX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTEwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHByb2MgZnMgZW50cnkgd2l0aCBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHVuZGVyIExpbnV4CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogcHJvY19mcy5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMyAkICAkRGF0ZTogMjAwOC8xMS8wNyAxMzo1NTo1NiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8zMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10dS5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorI2luY2x1ZGUgInVzZXIvRXBsTm10TW51LmgiCisjZW5kaWYKKworI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSAiZmVjLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX1BST0NfREVWX05BTUUKKyNkZWZpbmUgRVBMX1BST0NfREVWX05BTUUgICAgImVwbCIKKyNlbmRpZgorCisjaWZuZGVmIERCR19UUkFDRV9QT0lOVFMKKyNkZWZpbmUgREJHX1RSQUNFX1BPSU5UUyAgICAyMwkvLyAjIG9mIHN1cHBvcnRlZCBkZWJ1ZyB0cmFjZSBwb2ludHMKKyNlbmRpZgorCisjaWZuZGVmIERCR19UUkFDRV9WQUxVRVMKKyNkZWZpbmUgREJHX1RSQUNFX1ZBTFVFUyAgICAyNAkvLyAjIG9mIHN1cHBvcnRlZCBkZWJ1ZyB0cmFjZSB2YWx1ZXMgKHNpemUgb2YgY2lyY3VsYXIgYnVmZmVyKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCithdG9taWNfdCBhYXRtRGJnVHJhY2VQb2ludF9sW0RCR19UUkFDRV9QT0lOVFNdOworRFdPUkQgYWR3RGJnVHJhY2VWYWx1ZV9sW0RCR19UUkFDRV9WQUxVRVNdOworRFdPUkQgZHdEYmdUcmFjZVZhbHVlT2xkX2w7Cit1bnNpZ25lZCBpbnQgdWlEYmdUcmFjZVZhbHVlUG9zX2w7CitzcGlubG9ja190IHNwaW5sb2NrRGJnVHJhY2VWYWx1ZV9sOwordW5zaWduZWQgbG9uZyB1bERiVHJhY2VWYWx1ZUZsYWdzX2w7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUHJvY1JlYWQoY2hhciAqcGNCdWZmZXJfcCwgY2hhciAqKnBwY1N0YXJ0X3AsIG9mZl90IE9mZnNldF9wLAorCQkJICBpbnQgbkJ1ZmZlclNpemVfcCwgaW50ICpwRW9mX3AsIHZvaWQgKnBEYXRhX3ApOworc3RhdGljIGludCBFcGxMaW5Qcm9jV3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CisKK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKworRVBMRExMRVhQT1JUIERXT1JEIFBVQkxJQyBFcGxJZGVudHVHZXRSdW5uaW5nUmVxdWVzdHModm9pZCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCit0RXBsS2VybmVsIEVwbExpblByb2NJbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwUHJvY0RpckVudHJ5OworCXBQcm9jRGlyRW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShFUExfUFJPQ19ERVZfTkFNRSwgU19JUlVHTywgTlVMTCk7CisJaWYgKHBQcm9jRGlyRW50cnkgIT0gTlVMTCkgeworCQlwUHJvY0RpckVudHJ5LT5yZWFkX3Byb2MgPSBFcGxMaW5Qcm9jUmVhZDsKKwkJcFByb2NEaXJFbnRyeS0+d3JpdGVfcHJvYyA9IEVwbExpblByb2NXcml0ZTsKKwkJcFByb2NEaXJFbnRyeS0+ZGF0YSA9IE5VTEw7CS8vIGRldmljZSBudW1iZXIgb3Igc29tZXRoaW5nIGVsc2UKKworCX0gZWxzZSB7CisJCXJldHVybiBrRXBsTm9SZXNvdXJjZTsKKwl9CisKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KKwkvLyBpbml0aWFsaXplIHNwaW5sb2NrIGFuZCBjaXJjdWxhciBidWZmZXIgcG9zaXRpb24KKwlzcGluX2xvY2tfaW5pdCgmc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2wpOworCXVpRGJnVHJhY2VWYWx1ZVBvc19sID0gMDsKKwlkd0RiZ1RyYWNlVmFsdWVPbGRfbCA9IDA7CisjZW5kaWYKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jRnJlZSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KEVQTF9QUk9DX0RFVl9OQU1FLCBOVUxMKTsKKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUYXJnZXQgc3BlY2lmaWMgZXZlbnQgc2lnbmFsaW5nIChGRUMgVHgtL1J4LUludGVycnVwdCwgdXNlZCBieSBFZHJ2KQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApCit7CisKKwlpZiAoYlRyYWNlUG9pbnROdW1iZXJfcCA+PQorCSAgICAoc2l6ZW9mKGFhdG1EYmdUcmFjZVBvaW50X2wpIC8gc2l6ZW9mKGFhdG1EYmdUcmFjZVBvaW50X2xbMF0pKSkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJYXRvbWljX2luYygmYWF0bURiZ1RyYWNlUG9pbnRfbFtiVHJhY2VQb2ludE51bWJlcl9wXSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm47CisKK30KKwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApCit7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2wsIHVsRGJUcmFjZVZhbHVlRmxhZ3NfbCk7CisJaWYgKGR3RGJnVHJhY2VWYWx1ZU9sZF9sICE9IGR3VHJhY2VWYWx1ZV9wKSB7CisJCWFkd0RiZ1RyYWNlVmFsdWVfbFt1aURiZ1RyYWNlVmFsdWVQb3NfbF0gPSBkd1RyYWNlVmFsdWVfcDsKKwkJdWlEYmdUcmFjZVZhbHVlUG9zX2wgPQorCQkgICAgKHVpRGJnVHJhY2VWYWx1ZVBvc19sICsgMSkgJSBEQkdfVFJBQ0VfVkFMVUVTOworCQlkd0RiZ1RyYWNlVmFsdWVPbGRfbCA9IGR3VHJhY2VWYWx1ZV9wOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9ja0RiZ1RyYWNlVmFsdWVfbCwgdWxEYlRyYWNlVmFsdWVGbGFnc19sKTsKKworCXJldHVybjsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBmdW5jdGlvbiBmb3IgUFJPQy1GUyByZWFkIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Qcm9jUmVhZChjaGFyICpwY0J1ZmZlcl9wLAorCQkJICBjaGFyICoqcHBjU3RhcnRfcCwKKwkJCSAgb2ZmX3QgT2Zmc2V0X3AsCisJCQkgIGludCBuQnVmZmVyU2l6ZV9wLCBpbnQgKnBFb2ZfcCwgdm9pZCAqcERhdGFfcCkKK3sKKworCWludCBuU2l6ZTsKKwlpbnQgRW9mOworCXRFcGxEbGxrQ2FsU3RhdGlzdGljcyAqcERsbGtDYWxTdGF0czsKKworCW5TaXplID0gMDsKKwlFb2YgPSAwOworCisJLy8gY291bnQgY2FsbHMgb2YgdGhpcyBmdW5jdGlvbgorI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXworCVRndERiZ1NpZ25hbFRyYWNlUG9pbnQoMCk7CisjZW5kaWYKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2VuZXJhdGUgc3RhdGljIGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIC0tLS0gRHJpdmVyIGluZm9ybWF0aW9uIC0tLS0KKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIiVzICAgICVzICAgIChjKSAyMDA2ICVzXG4iLAorCQkJICBFUExfUFJPRFVDVF9OQU1FLCBFUExfUFJPRFVDVF9WRVJTSU9OLAorCQkJICBFUExfUFJPRFVDVF9NQU5VRkFDVFVSRVIpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZW5lcmF0ZSBwcm9jZXNzIGluZm9ybWF0aW9uCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS8vIC0tLS0gRVBMIHN0YXRlIC0tLS0KKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIk5NVCBzdGF0ZTogICAgICAgICAgICAgICAgICAweCUwNFhcbiIsCisJCQkgIChXT1JEKSBFcGxObXRrR2V0Tm10U3RhdGUoKSk7CisKKwlFcGxEbGxrQ2FsR2V0U3RhdGlzdGljcygmcERsbGtDYWxTdGF0cyk7CisKKwluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCSAgIkN1ckFzeW5jVHhHZW49JWx1IEN1ckFzeW5jVHhObXQ9JWx1IEN1ckFzeW5jUng9JWx1XG5NYXhBc3luY1R4R2VuPSVsdSBNYXhBc3luY1R4Tm10PSVsdSBNYXhBc3luY1J4PSVsdVxuIiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clR4RnJhbWVDb3VudEdlbiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clR4RnJhbWVDb3VudE5tdCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bEN1clJ4RnJhbWVDb3VudCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFR4RnJhbWVDb3VudEdlbiwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFR4RnJhbWVDb3VudE5tdCwKKwkJCSAgcERsbGtDYWxTdGF0cy0+bV91bE1heFJ4RnJhbWVDb3VudCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gZmV0Y2ggcnVubmluZyBJZGVudFJlcXVlc3RzCisJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkgICJydW5uaW5nIElkZW50UmVxdWVzdHM6ICAgICAgMHglMDhsWFxuIiwKKwkJCSAgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzKCkpOworCisJLy8gZmV0Y2ggc3RhdGUgb2YgTm10TW51IG1vZHVsZQorCXsKKwkJdW5zaWduZWQgaW50IHVpTWFuZGF0b3J5U2xhdmVDb3VudDsKKwkJdW5zaWduZWQgaW50IHVpU2lnbmFsU2xhdmVDb3VudDsKKwkJV09SRCB3RmxhZ3M7CisKKwkJRXBsTm10TW51R2V0RGlhZ25vc3RpY0luZm8oJnVpTWFuZGF0b3J5U2xhdmVDb3VudCwKKwkJCQkJICAgJnVpU2lnbmFsU2xhdmVDb3VudCwgJndGbGFncyk7CisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiTU4gIE1hbmRTbGF2ZUNvdW50OiAldSAgU2lnU2xhdmVDb3VudDogJXUgIEZsYWdzOiAweCVYXG4iLAorCQkJCSAgdWlNYW5kYXRvcnlTbGF2ZUNvdW50LCB1aVNpZ25hbFNsYXZlQ291bnQsCisJCQkJICB3RmxhZ3MpOworCisJfQorI2VuZGlmCisKKwkvLyAtLS0tIEZFQyBzdGF0ZSAtLS0tCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisJeworCQkvLyBSZWNlaXZlIHRoZSBiYXNlIGFkZHJlc3MKKwkJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CisjaWYgKEVEUlZfVVNFRF9FVEhfQ1RSTCA9PSAwKQorCQkvLyBTZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiBGRUMwCisJCWJhc2VfYWRkciA9IEZFQ19CQVNFX0FERFJfRkVDMDsKKyNlbHNlCisJCS8vIFNldCB0aGUgYmFzZSBhZGRyZXNzIG9mIEZFQzEKKwkJYmFzZV9hZGRyID0gRkVDX0JBU0VfQUREUl9GRUMxOworI2VuZGlmCisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiRkVDX0VDUiA9IDB4JTA4WCBGRUNfRUlSID0gMHglMDhYIEZFQ19FSU1SID0gMHglMDhYXG5GRUNfVENSID0gMHglMDhYIEZFQ1RGU1IgPSAweCUwOFggRkVDUkZTUiA9IDB4JTA4WFxuIiwKKwkJCQkgIEZFQ19FQ1IoYmFzZV9hZGRyKSwgRkVDX0VJUihiYXNlX2FkZHIpLAorCQkJCSAgRkVDX0VJTVIoYmFzZV9hZGRyKSwgRkVDX1RDUihiYXNlX2FkZHIpLAorCQkJCSAgRkVDX0ZFQ1RGU1IoYmFzZV9hZGRyKSwKKwkJCQkgIEZFQ19GRUNSRlNSKGJhc2VfYWRkcikpOworCX0KKyNlbmRpZgorCisJLy8gLS0tLSBEQkc6IFRyYWNlUG9pbnRzIC0tLS0KKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KKwl7CisJCWludCBuTnVtOworCisJCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgIkRiZ1RyYWNlUG9pbnRzOlxuIik7CisJCWZvciAobk51bSA9IDA7CisJCSAgICAgbk51bSA8IChzaXplb2YoYWF0bURiZ1RyYWNlUG9pbnRfbCkgLyBzaXplb2YoYXRvbWljX3QpKTsKKwkJICAgICBuTnVtKyspIHsKKwkJCW5TaXplICs9CisJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAgICAiIFRyYWNlUG9pbnRbJTJkXTogJWRcbiIsIChpbnQpbk51bSwKKwkJCQkgICAgIGF0b21pY19yZWFkKCZhYXRtRGJnVHJhY2VQb2ludF9sW25OdW1dKSk7CisJCX0KKworCQluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICJEYmdUcmFjZVZhbHVlczpcbiIpOworCQlmb3IgKG5OdW0gPSAwOyBuTnVtIDwgREJHX1RSQUNFX1ZBTFVFUzsgbk51bSsrKSB7CisJCQlpZiAobk51bSA9PSB1aURiZ1RyYWNlVmFsdWVQb3NfbCkgewkvLyBuZXh0IHZhbHVlIHdpbGwgYmUgc3RvcmVkIGF0IHRoYXQgcG9zaXRpb24KKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiKiUwOGxYIiwKKwkJCQkJICAgICBhZHdEYmdUcmFjZVZhbHVlX2xbbk51bV0pOworCQkJfSBlbHNlIHsKKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiICUwOGxYIiwKKwkJCQkJICAgICBhZHdEYmdUcmFjZVZhbHVlX2xbbk51bV0pOworCQkJfQorCQkJaWYgKChuTnVtICYgMHgwMDAwMDAwNykgPT0gMHgwMDAwMDAwNykgewkvLyA4IHZhbHVlcyBwcmludGVkIC0+IGVuZCBvZiBsaW5lIHJlYWNoZWQKKwkJCQluU2l6ZSArPQorCQkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsCisJCQkJCSAgICAgbkJ1ZmZlclNpemVfcCAtIG5TaXplLCAiXG4iKTsKKwkJCX0KKwkJfQorCQlpZiAoKG5OdW0gJiAweDAwMDAwMDA3KSAhPSAweDAwMDAwMDA3KSB7CS8vIG51bWJlciBvZiB2YWx1ZXMgcHJpbnRlZCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IC0+IHByaW50IG5ldyBsaW5lCisJCQluU2l6ZSArPQorCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgICAgIlxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCUVvZiA9IDE7CisJZ290byBFeGl0OworCisgICAgICBFeGl0OgorCisJKnBFb2ZfcCA9IEVvZjsKKworCXJldHVybiAoblNpemUpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZnVuY3Rpb24gZm9yIFBST0MtRlMgd3JpdGUgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblByb2NXcml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYWJCdWZmZXJbY291bnQgKyAxXTsKKwlpbnQgaUVycjsKKwlpbnQgaVZhbCA9IDA7CisJdEVwbE5tdEV2ZW50IE5tdEV2ZW50OworCisJaWYgKGNvdW50ID4gMCkgeworCQlpRXJyID0gY29weV9mcm9tX3VzZXIoYWJCdWZmZXIsIGJ1ZmZlciwgY291bnQpOworCQlpZiAoaUVyciAhPSAwKSB7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJYWJCdWZmZXJbY291bnRdID0gJ1wwJzsKKworCQlpRXJyID0gc3NjYW5mKGFiQnVmZmVyLCAiJWkiLCAmaVZhbCk7CisJfQorCWlmICgoaVZhbCA8PSAwKSB8fCAoaVZhbCA+IDB4MkYpKSB7CisJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3dSZXNldDsKKwl9IGVsc2UgeworCQlObXRFdmVudCA9ICh0RXBsTm10RXZlbnQpIGlWYWw7CisJfQorCS8vIGV4ZWN1dGUgc3BlY2lmaWVkIE5NVCBjb21tYW5kIG9uIHdyaXRlIGFjY2VzcyBvZiAvcHJvYy9lcGwKKwlFcGxObXR1Tm10RXZlbnQoTm10RXZlbnQpOworCisJcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgcHJvYyBmcyBlbnRyeSB1bmRlciBMaW51eAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IHByb2NfZnMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMyAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8zMSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTFBST0NGU19IXworI2RlZmluZSBfRVBMUFJPQ0ZTX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbExpblByb2NJbml0KHZvaWQpOwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jRnJlZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFBST0NGU19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbENmZ01hdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbENmZ01hdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWExZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsQ2ZnTWF1LmgKQEAgLTAsMCArMSwyODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVwbCBDb25maWd1cmF0aW9uIE1hbmFnZXIgTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQ2ZnTWF1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgVkM3CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8xNCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgLT4gYmFzZWQgb24gQ0FOb3BlbiBDZmdNYS1Nb2R1bCAoQ0FOb3BlbiB2ZXJzaW9uIDUuMzQpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxJbmMuaCIKKworI2lmbmRlZiBfRVBMQ0ZHTUFfSF8KKyNkZWZpbmUgX0VQTENGR01BX0hfCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKworI2luY2x1ZGUgIkVwbE9iZHUuaCIKKyNpbmNsdWRlICJFcGxTZG9Db211LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9kZWZpbmUgbWF4IG51bWJlciBvZiB0aW1lb3V0cyBmb3IgY29uZmlndXJhdGlvbiBvZiAxIGRldmljZQorI2RlZmluZSBFUExfQ0ZHTUFfTUFYX1RJTUVPVVQgICAzCisKKy8vY2FsbGJhY2tmdW5jdGlvbiwgY2FsbGVkIGlmIGNvbmZpZ3VyYXRpb24gaXMgZmluaXNoZWQKK3R5cGVkZWYgdm9pZCAoUFVCTElDICogdGZwRXBsQ2ZnTWFDYikgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsS2VybmVsIEVycm9yc3RhdGVfcCk7CisKKy8vU3RhdGUgZm9yIGNvbmZpZ3VhcnRpb24gbWFuYWdlciBTdGF0ZW1hY2hpbmUKK3R5cGVkZWYgZW51bSB7CisJLy8gZ2VuZXJhbCBzdGF0ZXMKKwlrRXBsQ2ZnTWFJZGxlID0gMHgwMDAwLAkvLyBDb25maWd1cmF0aW9uc3Byb2Nlc3MKKwkvLyBpcyBpZGxlCisJa0VwbENmZ01hV2FpdEZvclNkb2NFdmVudCA9IDB4MDAwMSwJLy8gd2FpdCB1bnRpbCB0aGUgbGFzdAorCS8vIFNET0MgaXMgZmluaXNjaGVkCisJa0VwbENmZ01hU2tpcE1hcHBpbmdTdWIwID0gMHgwMDAyLAkvLyB3cml0ZSBTdWIwIG9mIG1hcHBpbmcKKwkvLyBwYXJhbWV0ZXIgd2l0aCAwCisKKwlrRXBsQ2ZnTWFGaW5pc2hlZCA9IDB4MDAwNAkvLyBjb25maWd1YXJ0aW9uIGlzIGZpbmlzaGVkCit9IHRFcGxDZmdTdGF0ZTsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsQ2ZnTWFEY2ZUeXBTeXN0ZWNTZWcgPSAweDAwLAorCWtFcGxDZmdNYURjZlR5cENvbkRjZiA9IDB4MDEsCisJa0VwbENmZ01hRGNmVHlwRGNmID0gMHgwMiwJLy8gbm90IHN1cHBvcnRlZAorCWtFcGxDZmdNYURjZlR5cFhkYyA9IDB4MDMJLy8gbm90IHN1cHBvcnRlZAorfSB0RXBsQ2ZnTWFEY2ZUeXA7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbENmZ01hQ29tbW9uID0gMCwJLy8gYWxsIG90aGVyIGluZGV4CisJa0VwbENmZ01hUGRvQ29tbSA9IDEsCS8vIGNvbW11bmljYXRpb24gaW5kZXgKKwlrRXBsQ2ZnTWFQZG9NYXBwID0gMiwJLy8gbWFwcGluZyBpbmRleAorCWtFcGxDZmdNYVBkb0NvbW1BZnRlck1hcHAgPSAzLAkvLyB3cml0ZSBQRE8gQ29iLUlkIGFmdGVyIG1hcHBpbmcgc3ViaW5kZXggMChzZXQgUERPIHZhbGlkKQorCit9IHRFcGxDZmdNYUluZGV4VHlwZTsKKworLy9iaXRjb2RlZCBhbnN3ZXIgYWJvdXQgdGhlIGxhc3Qgc2RvIHRyYW5zZmVyIHNhdmVkIGluIG1fU2RvY1N0YXRlCisvLyBhbHNvIHVzZWQgdG8gc2luZ2FsIHN0YXJ0IG9mIHRoZSBTdGF0ZSBNYXNjaGluZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsQ2ZnTWFTZG9jQnVzeSA9IDB4MDAsCS8vIFNET0MgYWN0aXYKKwlrRXBsQ2ZnTWFTZG9jUmVhZHkgPSAweDAxLAkvLyBTRE9DIGZpbmlzaGVkCisJa0VwbENmZ01hU2RvY1RpbWVvdXQgPSAweDAyLAkvLyBTRE9DIFRpbWVvdXQKKwlrRXBsQ2ZnTWFTZG9jQWJvcnRSZWNlaXZlZCA9IDB4MDQsCS8vIFNET0MgQWJvcnQsIHNlZSBBYm9ydGNvZGUKKwlrRXBsQ2ZnTWFTZG9jU3RhcnQgPSAweDA4CS8vIHN0YXJ0IFN0YXRlIE1zY2hpbmUKK30gdEVwbFNkb2NTdGF0ZTsKKworLy9pbnRlcm5hbCBzdHJ1Y3R1cmUgKGluc3RhbmNldGFibGUgZm9yIG1vZHVsIGNvbmZpZ3VyYXRpb24gbWFuYWdlcikKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQ2ZnU3RhdGUgbV9DZmdTdGF0ZTsJLy8gc3RhdGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUgbWFzY2hpbmUKKwl0RXBsU2RvQ29tQ29uSGRsIG1fU2RvQ29tQ29uSGRsOwkvLyBoYW5kbGUgZm9yIHNkbyBjb25uZWN0aW9uCisJRFdPUkQgbV9kd0xhc3RBYm9ydENvZGU7CisJdW5zaWduZWQgaW50IG1fdWlMYXN0SW5kZXg7CS8vIGxhc3QgaW5kZXggb2YgY29uZmlndXJhdGlvbiwgdG8gY29tcGFpciB3aXRoIGFjdHVhbCBpbmRleAorCUJZVEUgKm1fcGJDb25jaXNlOwkvLyBQdHIgdG8gY29uY2lzZSBEQ0YKKwlCWVRFICptX3BiQWN0dWFsSW5kZXg7CS8vIFB0ciB0byBhY3R1YWwgaW5kZXggaW4gdGhlIERDRiBzZWdtZW50CisJdGZwRXBsQ2ZnTWFDYiBtX3BmbkNmZ01hQ2I7CS8vIFB0ciB0byBDZmdNYSBDYWxsYmFjaywgaXMgY2FsbCBpZiBjb25maWd1cmF0aW9uIGZpbmlzaGVkCisJdEVwbEtlcm5lbCBtX0VwbEtlcm5lbEVycm9yOwkvLyBlcnJvcmNvZGUKKwlEV09SRCBtX2R3TnVtVmFsdWVDb3B5OwkvLyBudW1lcmljIHZhbHVlcyBhcmUgY29waWVkIGluIHRoaXMgdmFyaWFibGUKKwl1bnNpZ25lZCBpbnQgbV91aVBkb05vZGVJZDsJLy8gYnVmZmVyIGZvciBQRE8gbm9kZSBpZAorCUJZVEUgbV9iTnJPZk1hcHBlZE9iamVjdDsJLy8gbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzCisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIEVwbCBub2RlIGFkZHJlc3NlCisJdEVwbFNkb2NTdGF0ZSBtX1Nkb2NTdGF0ZTsJLy8gYml0Y29kZWQgc3RhdGUgb2YgdGhlIFNETyB0cmFuc2ZlcgorCXVuc2lnbmVkIGludCBtX3VpTGFzdFN1YkluZGV4OwkvLyBsYXN0IHN1YmluZGV4IG9mIGNvbmZpZ3VyYXRpb24KKwlCT09MIG1fZk9uZVRyYW5mZXJPazsJLy8gYXRsZWFzZWQgb25lIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsCisJQllURSBtX2JFdmVudEZsYWc7CS8vIGZvciBFdmVudHNpZ25hbGluZyB0byB0aGUgU3RhdGUgTWFzY2hpbmUKKwlEV09SRCBtX2R3Q250T2JqZWN0SW5EY2Y7CS8vIG51bWJlciBvZiBPYmplY3RzIGluIERDRgorCXRFcGxDZmdNYUluZGV4VHlwZSBtX1NraXBDZmc7CS8vIFRSVUUgaWYgYSBhZHNpdGlvbmFsIENvbmZpZ3VyYXRpb25wcm9jZXNzCisJLy8gaGF2ZSB0byBpbnNlcnQgZS5nLiBQRE8tbWFwcGluZworCVdPUkQgbV93VGltZU91dENudDsJLy8gVGltZW91dCBDb3VudGVyLCBicmVhayBjb25maWd1cmF0aW9uIGlzCisJLy8gbV93VGltZU91dENudCA9PSBDRkdNQV9NQVhfVElNRU9VVAorCit9IHRFcGxDZmdNYU5vZGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hSW5pdCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNyZWF0ZXMgZmlyc3QgaW5zdGFuY2Ugb2YgQ29uZmlndXJhdGlvbiBNYW5hZ2VyCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFJbml0KCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNyZWF0ZXMgYWRkaXRpb25hbCBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uIE1hbmFnZXIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYUFkZEluc3RhbmNlKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGRlbGV0ZSBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uIE1hbmFnZXIKKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYURlbEluc3RhbmNlKCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFTdGFydENvbmZpZygpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0cyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCisvLyAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gdGhlIHN0YXRlbWFjaGluZSBmb3IgQ2ZnTWEtIHByb2Nlc3MKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgcGJDb25jaXNlX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIERDRgorLy8gICAgICAgICAgICAgIGZwQ2ZnTWFDYl9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiAoc2hvdWxkIG5vdCBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIFNpemVPZkNvbmNpc2VfcCAgICAgICAgID0gc2l6ZSBvZiBEQ0YgaW4gQllURSAtPiBmb3IgZnV0dXJlIHVzZQorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hU3RhcnRDb25maWcodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgQllURSAqIHBiQ29uY2lzZV9wLAorCQkJCSAgICAgIHRmcEVwbENmZ01hQ2IgZnBDZmdNYUNiX3AsCisJCQkJICAgICAgdEVwbE9iZFNpemUgU2l6ZU9mQ29uY2lzZV9wLAorCQkJCSAgICAgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIENmZ01hU3RhcnRDb25maWd1cmF0aW9uTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0ZWQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworLy8gICAgICAgICAgICAgIHdpdGggdGhlIERDRiBmcm9tIGFjY29yZGluZyBPRC1lbnRyeSBTdWJpbmRleCA9PSBiTm9kZUlkX3AKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgZnBDZmdNYUNiX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIChzaG91bGQgbm90IGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFTdGFydENvbmZpZ05vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgdGZwRXBsQ2ZnTWFDYiBmcENmZ01hQ2JfcCwKKwkJCQkJICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYVN0YXJ0Q29uZmlnTm9kZURjZigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHN0YXJ0cyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCisvLyAgICAgICAgICAgICAgYW5kIGxpbmtzIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgdG8gdGhlIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkIG9mIHRoZSBub2RlIHRvIGNvbmZpZ3VyZQorLy8gICAgICAgICAgICAgIHBiQ29uY2lzZV9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBEQ0YKKy8vICAgICAgICAgICAgICBmcENmZ01hQ2JfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gKHNob3VsZCBub3QgYmUgTlVMTCkKKy8vICAgICAgICAgICAgICBTaXplT2ZDb25jaXNlX3AgICAgICAgICA9IHNpemUgb2YgRENGIGluIEJZVEUgLT4gZm9yIGZ1dHVyZSB1c2UKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYVN0YXJ0Q29uZmlnTm9kZURjZih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICBCWVRFICogcGJDb25jaXNlX3AsCisJCQkJCSAgICAgdGZwRXBsQ2ZnTWFDYiBmcENmZ01hQ2JfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplT2ZDb25jaXNlX3AsCisJCQkJCSAgICAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFMaW5rRGNmKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gbGlua3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSB0byB0aGUgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBOb2RlSWQgb2YgdGhlIG5vZGUgdG8gY29uZmlndXJlCisvLyAgICAgICAgICAgICAgcGJDb25jaXNlX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIERDRgorLy8gICAgICAgICAgICAgIFNpemVPZkNvbmNpc2VfcCAgICAgICAgPSBzaXplIG9mIERDRiBpbiBCWVRFIC0+IGZvciBmdXR1cmUgdXNlCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFMaW5rRGNmKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgQllURSAqIHBiQ29uY2lzZV9wLAorCQkJCSAgdEVwbE9iZFNpemUgU2l6ZU9mQ29uY2lzZV9wLAorCQkJCSAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFDaGVja0RjZigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGNoZWNrIGlmIHRoZXJlIGlzIGFsbHJlYWR5IGEgY29uZmlndXJhdGlvbiBmaWxlIGxpbmtlZAorLy8gICAgICAgICAgICAgIHRvIHRoZSBPRCAodHlwZSBpcyBnaXZlbiBieSBEY2ZUeXBlX3ApCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFDaGVja0RjZih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworI2VuZGlmIC8vICNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKworI2VuZGlmIC8vIF9FUExDRkdNQV9IXworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjhiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB1c2Vyc3BhY2UgRExMIG1vZHVsZSBmb3IgYXN5bmNocm9ub3VzIGNvbW11bmljYXRpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExVX0hfCisjZGVmaW5lIF9FUExfRExMVV9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxEbGx1Q2JBc25kKSAodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbHVBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdVJlZ0FzbmRTZXJ2aWNlKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCSB0RXBsRGxsdUNiQXNuZCBwZm5EbGx1Q2JBc25kX3AsCisJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1QXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3AsCisJCQkgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKKy8vIHByb2Nlc3NlcyBhc3luY2ggZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbHVQcm9jZXNzKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdUNhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHVDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRjZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHVDYWwuaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlIGluIEVQTCB1c2VyIHBhcnQKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1Q2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9ETExVQ0FMX0hfCisjZGVmaW5lIF9FUExfRExMVUNBTF9IXworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbERsbHVDYkFzbmQpICh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2UodEVwbERsbEFzbmRTZXJ2aWNlSWQgU2VydmljZUlkX3AsCisJCQkJICAgIHRFcGxEbGx1Q2JBc25kIHBmbkRsbHVDYkFzbmRfcCwKKwkJCQkgICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxBc3luY1NlbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm8sCisJCQkgICAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHlfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFkZE5vZGUodEVwbERsbE5vZGVJbmZvICogcE5vZGVJbmZvX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsU29mdERlbGV0ZU5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCBTZXJ2aWNlX3AsCisJCQkJICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCk7CisKKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTFVDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxFdmVudHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxFdmVudHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJjZmZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbEV2ZW50dS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWwgZXZlbnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9FVkVOVFVfSF8KKyNkZWZpbmUgX0VQTF9FVkVOVFVfSF8KKworI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVJbml0KHRFcGxQcm9jZXNzRXZlbnRDYiBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVBZGRJbnN0YW5jZSh0RXBsUHJvY2Vzc0V2ZW50Q2IKKwkJCQkgICAgICAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCk7CisKKy8vIGRlbGV0ZSBpbnN0YW5jZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1RGVsSW5zdGFuY2Uodm9pZCk7CisKKy8vIFRhc2sgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiB1c2Vyc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGV2ZW50cyBmcm9tIHVzZXJzcGFjZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKy8vIHBvc3QgZXJyb3JldmVudHMgZnJvbSB1c2Vyc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVBvc3RFcnJvcih0RXBsRXZlbnRTb3VyY2UgRXZlbnRTb3VyY2VfcCwKKwkJCQkgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxJZGVudHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxJZGVudHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzMwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbElkZW50dS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBJZGVudHUtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsSWRlbnR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMS8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKyNpZm5kZWYgX0VQTElERU5UVV9IXworI2RlZmluZSBfRVBMSURFTlRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxJZGVudHVDYlJlc3BvbnNlKSAodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsSWRlbnRSZXNwb25zZSAqCisJCQkJCQkgICBwSWRlbnRSZXNwb25zZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVzZXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgICAgcHBJZGVudFJlc3BvbnNlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxJZGVudHVDYlJlc3BvbnNlCisJCQkJCQlwZm5DYlJlc3BvbnNlX3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMSURFTlRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTGVkdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbExlZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU3MGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbExlZHUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Igc3RhdHVzIGFuZCBlcnJvciBMRUQgdXNlciBwYXJ0IG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbExlZHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMSAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA4LzExLzE3IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxMZWQuaCIKKyNpbmNsdWRlICIuLi9FcGxObXQuaCIKKyNpbmNsdWRlICJFcGxFdmVudHUuaCIKKworI2lmbmRlZiBfRVBMTEVEVV9IXworI2RlZmluZSBfRVBMTEVEVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsTGVkdVN0YXRlQ2hhbmdlQ2FsbGJhY2spICh0RXBsTGVkVHlwZSBMZWRUeXBlX3AsCisJCQkJCQkJICBCT09MIGZPbl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1SW5pdCh0RXBsTGVkdVN0YXRlQ2hhbmdlQ2FsbGJhY2sgcGZuQ2JTdGF0ZUNoYW5nZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGVkdUFkZEluc3RhbmNlKHRFcGxMZWR1U3RhdGVDaGFuZ2VDYWxsYmFjaworCQkJCSAgICAgcGZuQ2JTdGF0ZUNoYW5nZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGVkdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgIE5tdFN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMZWR1UHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKTsKKworI2VuZGlmIC8vICNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTEVEVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdENudS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdENudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDgwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10Q251LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIE5NVC1DTi1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10Q251LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsTm10dS5oIgorI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEZyYW1lLmgiCisKKyNpZm5kZWYgX0VQTE5NVENOVV9IXworI2RlZmluZSBfRVBMTk1UQ05VX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudUluaXQodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251QWRkSW5zdGFuY2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251RGVsSW5zdGFuY2Uodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVTZW5kTm10UmVxdWVzdCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgICB0RXBsTm10Q29tbWFuZAorCQkJCQkJICAgICAgIE5tdENvbW1hbmRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10Q251UmVnaXN0ZXJDaGVja0V2ZW50Q2IodEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2sKKwkJCSAgICAgIHBmbkVwbE5tdENoZWNrRXZlbnRDYl9wKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVENOVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdE1udS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdE1udS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NGVmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10TW51LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIE5NVC1NTi1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10TW51LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsTm10dS5oIgorCisjaWZuZGVmIF9FUExOTVRNTlVfSF8KKyNkZWZpbmUgX0VQTE5NVE1OVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsTm10TW51Q2JOb2RlRXZlbnQpICh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICB0RXBsTm10Tm9kZUV2ZW50CisJCQkJCQkgICAgTm9kZUV2ZW50X3AsCisJCQkJCQkgICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJCQkgICAgV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICAgQk9PTCBmTWFuZGF0b3J5X3ApOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICoKKwkJICAgdEVwbE5tdE1udUNiQm9vdEV2ZW50KSAodEVwbE5tdEJvb3RFdmVudCBCb290RXZlbnRfcCwKKwkJCQkJICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJCSAgIFdPUkQgd0Vycm9yQ29kZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxObXRNbnVJbml0KHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJIHRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVBZGRJbnN0YW5jZSh0RXBsTm10TW51Q2JOb2RlRXZlbnQgcGZuQ2JOb2RlRXZlbnRfcCwKKwkJCQl0RXBsTm10TW51Q2JCb290RXZlbnQgcGZuQ2JCb290RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgRXBsTm10TW51RGVsSW5zdGFuY2Uodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEV2ZW50X3ApOworCit0RXBsS2VybmVsIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgIHRFcGxObXRDb21tYW5kIE5tdENvbW1hbmRfcCk7CisKK3RFcGxLZXJuZWwgRXBsTm10TW51VHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJICAgIE5tdFN0YXRlQ2hhbmdlX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYkNoZWNrRXZlbnQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVHZXREaWFnbm9zdGljSW5mbyh1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAqcHVpTWFuZGF0b3J5U2xhdmVDb3VudF9wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlTaWduYWxTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgV09SRCAqIHB3RmxhZ3NfcCk7CisKKyNlbmRpZgorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UTU5VX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTU2YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHUuaApAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsTm10LmgiCisjaW5jbHVkZSAiRXBsRXZlbnR1LmgiCisKKyNpZm5kZWYgX0VQTE5NVFVfSF8KKyNkZWZpbmUgX0VQTE5NVFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbm10IGNvbW1hbmRzCit0eXBlZGVmIGVudW0geworCS8vIHJlcXVlc3RhYmxlIEFTbmQgU2VydmljZUlkcyAgICAweDAxLi4weDFGCisJa0VwbE5tdENtZElkZW50UmVzcG9uc2UgPSAweDAxLAorCWtFcGxObXRDbWRTdGF0dXNSZXNwb25zZSA9IDB4MDIsCisJLy8gcGxhaW4gTk1UIHN0YXRlIGNvbW1hbmRzICAgICAgIDB4MjAuLjB4M0YKKwlrRXBsTm10Q21kU3RhcnROb2RlID0gMHgyMSwKKwlrRXBsTm10Q21kU3RvcE5vZGUgPSAweDIyLAorCWtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMiA9IDB4MjMsCisJa0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlID0gMHgyNCwKKwlrRXBsTm10Q21kUmVzZXROb2RlID0gMHgyOCwKKwlrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uID0gMHgyOSwKKwlrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uID0gMHgyQSwKKwlrRXBsTm10Q21kU3dSZXNldCA9IDB4MkIsCisJLy8gZXh0ZW5kZWQgTk1UIHN0YXRlIGNvbW1hbmRzICAgIDB4NDAuLjB4NUYKKwlrRXBsTm10Q21kU3RhcnROb2RlRXggPSAweDQxLAorCWtFcGxObXRDbWRTdG9wTm9kZUV4ID0gMHg0MiwKKwlrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDJFeCA9IDB4NDMsCisJa0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlRXggPSAweDQ0LAorCWtFcGxObXRDbWRSZXNldE5vZGVFeCA9IDB4NDgsCisJa0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbkV4ID0gMHg0OSwKKwlrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uRXggPSAweDRBLAorCWtFcGxObXRDbWRTd1Jlc2V0RXggPSAweDRCLAorCS8vIE5NVCBtYW5hZ2luZyBjb21tYW5kcyAgICAgICAgICAweDYwLi4weDdGCisJa0VwbE5tdENtZE5ldEhvc3ROYW1lU2V0ID0gMHg2MiwKKwlrRXBsTm10Q21kRmx1c2hBcnBFbnRyeSA9IDB4NjMsCisJLy8gTk1UIGluZm8gc2VydmljZXMgICAgICAgICAgICAgIDB4ODAuLjB4QkYKKwlrRXBsTm10Q21kUHVibGlzaENvbmZpZ3VyZWRDTiA9IDB4ODAsCisJa0VwbE5tdENtZFB1Ymxpc2hBY3RpdmVDTiA9IDB4OTAsCisJa0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDEgPSAweDkxLAorCWtFcGxObXRDbWRQdWJsaXNoUHJlT3BlcmF0aW9uYWwyID0gMHg5MiwKKwlrRXBsTm10Q21kUHVibGlzaFJlYWR5VG9PcGVyYXRlID0gMHg5MywKKwlrRXBsTm10Q21kUHVibGlzaE9wZXJhdGlvbmFsID0gMHg5NCwKKwlrRXBsTm10Q21kUHVibGlzaFN0b3BwZWQgPSAweDk1LAorCWtFcGxObXRDbWRQdWJsaXNoRW1lcmdlbmN5TmV3ID0gMHhBMCwKKwlrRXBsTm10Q21kUHVibGlzaFRpbWUgPSAweEIwLAorCisJa0VwbE5tdENtZEludmFsaWRTZXJ2aWNlID0gMHhGRgorfSB0RXBsTm10Q29tbWFuZDsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxObXR1U3RhdGVDaGFuZ2VDYWxsYmFjaykgKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCQkgTm10U3RhdGVDaGFuZ2VfcCk7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsTm10dUNoZWNrRXZlbnRDYWxsYmFjaykgKHRFcGxObXRFdmVudCBObXRFdmVudF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1SW5pdCh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVBZGRJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVEZWxJbnN0YW5jZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVObXRFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKK0VQTERMTEVYUE9SVCB0RXBsTm10U3RhdGUgUFVCTElDIEVwbE5tdHVHZXRObXRTdGF0ZSh2b2lkKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdHVSZWdpc3RlclN0YXRlQ2hhbmdlQ2IodEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrCisJCQkgICAgIHBmbkVwbE5tdFN0YXRlQ2hhbmdlQ2JfcCk7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHVDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1Q2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4MTU4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1Q2FsLmgKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHVDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE2IC1rLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsTm10dS5oIgorI2luY2x1ZGUgIi4uL2tlcm5lbC9FcGxObXRrLmgiCisKKyNpZm5kZWYgX0VQTE5NVFVDQUxfSF8KKyNkZWZpbmUgX0VQTE5NVFVDQUxfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsTm10U3RhdGUgUFVCTElDIEVwbE5tdGtDYWxHZXRObXRTdGF0ZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVFVDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWUxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwtT2JkLVVzZXJzcGFjZS1tb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsT2JkLmgiCisKKyNpZm5kZWYgX0VQTE9CRFVfSF8KKyNkZWZpbmUgX0VQTE9CRFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKyNpZiBFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UKKyNlcnJvciAiRVBMIE9CRHUgbW9kdWxlIGVuYWJsZWQsIGJ1dCBPQkRfVVNFX0tFUk5FTCA9PSBUUlVFIgorI2VuZGlmCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSB0RXBsT2JkU2l6ZSBTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCXRFcGxPYmRTaXplICogcFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVEZWZpbmVWYXIodEVwbFZhclBhcmFtIE1FTSAqIHBWYXJQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlZ2lzdGVyVXNlck9kKHRFcGxPYmRFbnRyeVB0ciBwVXNlck9kX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1SW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKiBwVmFyRW50cnlfcCwKKwkJCQkJICAgICBCWVRFIGJUeXBlX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkdUdldE5vZGVJZCh2b2lkKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVNldE5vZGVJZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxPYmROb2RlSWRUeXBlIE5vZGVJZFR5cGVfcCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICAgcEFjY2Vzc1R5cF9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWFkRW50cnlUb0xlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkJICAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqCisJCQkJCQkgICAgIHBwVmFyRW50cnlfcCk7CisKKyNlbGlmIEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRQorI2luY2x1ZGUgIi4uL2tlcm5lbC9FcGxPYmRrLmgiCisKKyNkZWZpbmUgRXBsT2JkdVdyaXRlRW50cnkgICAgICAgRXBsT2JkV3JpdGVFbnRyeQorCisjZGVmaW5lIEVwbE9iZHVSZWFkRW50cnkgICAgICAgIEVwbE9iZFJlYWRFbnRyeQorCisjZGVmaW5lIEVwbE9iZHVBY2Nlc3NPZFBhcnQgICAgIEVwbE9iZEFjY2Vzc09kUGFydAorCisjZGVmaW5lIEVwbE9iZHVEZWZpbmVWYXIgICAgICAgIEVwbE9iZERlZmluZVZhcgorCisjZGVmaW5lIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyIEVwbE9iZEdldE9iamVjdERhdGFQdHIKKworI2RlZmluZSBFcGxPYmR1UmVnaXN0ZXJVc2VyT2QgICBFcGxPYmRSZWdpc3RlclVzZXJPZAorCisjZGVmaW5lIEVwbE9iZHVJbml0VmFyRW50cnkgICAgIEVwbE9iZEluaXRWYXJFbnRyeQorCisjZGVmaW5lIEVwbE9iZHVHZXREYXRhU2l6ZSAgICAgIEVwbE9iZEdldERhdGFTaXplCisKKyNkZWZpbmUgRXBsT2JkdUdldE5vZGVJZCAgICAgICAgRXBsT2JkR2V0Tm9kZUlkCisKKyNkZWZpbmUgRXBsT2JkdVNldE5vZGVJZCAgICAgICAgRXBsT2JkU2V0Tm9kZUlkCisKKyNkZWZpbmUgRXBsT2JkdUdldEFjY2Vzc1R5cGUgICAgRXBsT2JkR2V0QWNjZXNzVHlwZQorCisjZGVmaW5lIEVwbE9iZHVSZWFkRW50cnlUb0xlICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUKKworI2RlZmluZSBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlCisKKyNkZWZpbmUgRXBsT2JkdVNlYXJjaFZhckVudHJ5ICAgRXBsT2JkU2VhcmNoVmFyRW50cnkKKworI2RlZmluZSBFcGxPYmR1SXNOdW1lcmljYWwgICAgICBFcGxPYmRJc051bWVyaWNhbAorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE9CRFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxPYmR1Q2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdUNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGUwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdUNhbC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLVVzZXJzcGFjZS1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHVDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JEVUNBTF9IXworI2RlZmluZSBfRVBMT0JEVUNBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxXcml0ZUVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgIHRFcGxPYmRTaXplIFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxSZWFkRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgdEVwbE9iZFNpemUgKiBwU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEFjY2Vzc09kUGFydCh0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgICAgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbERlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICoKKwkJCQkJCSAgIHBWYXJQYXJhbV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVDYWxHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyCisJCQkJCQkJcFVzZXJPZF9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkdUNhbEluaXRWYXJFbnRyeSh0RXBsT2JkVmFyRW50cnkgTUVNICoKKwkJCQkJCXBWYXJFbnRyeV9wLCBCWVRFIGJUeXBlX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSBPYmRTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsT2JkU2l6ZSBQVUJMSUMgRXBsT2JkdUNhbEdldERhdGFTaXplKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgIHVpU3ViSW5kZXhfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkdUNhbEdldE5vZGVJZCh2b2lkKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFNldE5vZGVJZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgIHRFcGxPYmROb2RlSWRUeXBlCisJCQkJCQkgICBOb2RlSWRUeXBlX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsR2V0QWNjZXNzVHlwZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgICAgICBwQWNjZXNzVHlwX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxXcml0ZUVudHJ5RnJvbUxlKHVuc2lnbmVkIGludAorCQkJCQkJCSAgdWlJbmRleF9wLAorCQkJCQkJCSAgdW5zaWduZWQgaW50CisJCQkJCQkJICB1aVN1YkluZGV4X3AsCisJCQkJCQkJICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJCSAgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JEVUNBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFBkb3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxQZG91LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkZTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxQZG91LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHVzZXJzcGFjZSBQRE8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRvdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzExLzE5IDE3OjE0OjM4ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPVV9IXworI2RlZmluZSBfRVBMX1BET1VfSF8KKworI2luY2x1ZGUgIi4uL0VwbFBkby5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb3VBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxQZG91RGVsSW5zdGFuY2Uodm9pZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET1UpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsUGRvdUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKTsKKyNlbHNlCisjZGVmaW5lIEVwbFBkb3VDYk9iZEFjY2VzcwkJTlVMTAorI2VuZGlmCisKKy8vIHJldHVybnMgZXJyb3IgaWYgYlBkb0lkX3AgaXMgYWxyZWFkeSB2YWxpZAorLyoKK3RFcGxLZXJuZWwgRXBsUGRvdVNldE1hcHBpbmcoCisgICAgQllURSBiUGRvSWRfcCwgQk9PTCBmVHhSeF9wLCBCWVRFIGJOb2RlSWQsIEJZVEUgYk1hcHBpbmdWZXJzaW9uLAorICAgIHRFcGxQZG9NYXBwaW5nICogcE1hcHBpbmdfcCwgQllURSBiTWF4RW50cmllc19wKTsKKwordEVwbEtlcm5lbCBFcGxQZG91R2V0TWFwcGluZygKKyAgICBCWVRFIGJQZG9JZF9wLCBCT09MIGZUeFJ4X3AsIEJZVEUgKiBwYk5vZGVJZCwgQllURSAqIHBiTWFwcGluZ1ZlcnNpb24sCisgICAgdEVwbFBkb01hcHBpbmcgKiBwTWFwcGluZ19wLCBCWVRFICogcGJNYXhFbnRyaWVzX3ApOworKi8KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9QRE9VX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXNuZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc25kdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDk1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXNuZHUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgU0RPL0FzbmQtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0FzbmR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNyBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsU2RvLmgiCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKyNpZm5kZWYgX0VQTFNET0FTTkRVX0hfCisjZGVmaW5lIF9FUExTRE9BU05EVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdVNlbmREYXRhKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICAgdEVwbEZyYW1lICogcFNyY0RhdGFfcCwKKwkJCQkgICAgICBEV09SRCBkd0RhdGFTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKTsKKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET0FTTkRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXN5U2VxdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzeVNlcXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU4YjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzeVNlcXUuaApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgYXN5Y2hyaW9udXMgU0RPIFNlcXVlbmNlIExheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0FzeVNlcXUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKyNpbmNsdWRlICJFcGxTZG9VZHB1LmgiCisjaW5jbHVkZSAiRXBsU2RvQXNuZHUuaCIKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorI2luY2x1ZGUgIkVwbFRpbWVydS5oIgorCisjaWZuZGVmIF9FUExTRE9BU1lTRVFVX0hfCisjZGVmaW5lIF9FUExTRE9BU1lTRVFVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0KHRFcGxTZG9Db21SZWNlaXZlQ2IgZnBTZG9Db21DYl9wLAorCQkJCSAgIHRFcGxTZG9Db21Db25DYiBmcFNkb0NvbUNvbkNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZSh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkJICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxRGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcUluaXRDb24odEVwbFNkb1NlcUNvbkhkbCAqIHBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICB0RXBsU2RvVHlwZSBTZG9UeXBlKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxU2VuZERhdGEodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkgICAgICAgdEVwbEZyYW1lICogcERhdGFfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcURlbENvbih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET0FTWVNFUVVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Db211LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQ29tdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDU0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQ29tdS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBTRE8gQ29tbWFuZCBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Db211LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsU2RvLmgiCisjaW5jbHVkZSAiLi4vRXBsT2JkLmgiCisjaW5jbHVkZSAiLi4vRXBsU2RvQWMuaCIKKyNpbmNsdWRlICJFcGxPYmR1LmgiCisjaW5jbHVkZSAiRXBsU2RvQXN5U2VxdS5oIgorCisjaWZuZGVmIF9FUExTRE9DT01VX0hfCisjZGVmaW5lIF9FUExTRE9DT01VX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21BZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tRGVsSW5zdGFuY2Uodm9pZCk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbURlZmluZUNvbih0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3AsCisJCQkJICAgICB0RXBsU2RvVHlwZSBQcm90VHlwZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleCh0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXggKgorCQkJCQkgICAgICAgcFNkb0NvbVRyYW5zUGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVVuZGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21HZXRTdGF0ZSh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICB0RXBsU2RvQ29tRmluaXNoZWQgKiBwU2RvQ29tRmluaXNoZWRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVNkb0Fib3J0KHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIERXT1JEIGR3QWJvcnRDb2RlX3ApOworCisjZW5kaWYKKworLy8gZm9yIGZ1dHVyZSBleHRlbnRpb24KKy8qCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJBbGxCeUluZGV4KHRFcGxTZG9Db21UcmFuc1BhcmFtQWxsQnlJbmRleCogcFNkb0NvbVRyYW5zUGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5TmFtZSh0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5TmFtZSogcFNkb0NvbVRyYW5zUGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckZpbGUodEVwbFNkb0NvbVRyYW5zUGFyYW1GaWxlKiBwU2RvQ29tVHJhbnNQYXJhbV9wKTsKKworKi8KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET0NPTVVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9VZHB1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvVWRwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzdiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvVWRwdS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBTRE8vVURQLVByb3RvY29sbGFic3RyYWN0aW9ubGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvVWRwdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFNkby5oIgorCisjaWZuZGVmIF9FUExTRE9VRFBVX0hfCisjZGVmaW5lIF9FUExTRE9VRFBVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1SW5pdCh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1QWRkSW5zdGFuY2UodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1Q29uZmlnKHVuc2lnbmVkIGxvbmcgdWxJcEFkZHJfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlQb3J0X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgdEVwbEZyYW1lICogcFNyY0RhdGFfcCwKKwkJCQkgICAgIERXT1JEIGR3RGF0YVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCk7CisKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET1VEUFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTdGF0dXN1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU3RhdHVzdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTE5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU3RhdHVzdS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBTdGF0dXN1LU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFN0YXR1c3UuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKworI2lmbmRlZiBfRVBMU1RBVFVTVV9IXworI2RlZmluZSBfRVBMU1RBVFVTVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU3RhdHVzdUNiUmVzcG9uc2UpICh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICB0RXBsU3RhdHVzUmVzcG9uc2UgKgorCQkJCQkJICAgIHBTdGF0dXNSZXNwb25zZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1QWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdVJlc2V0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICB0RXBsU3RhdHVzdUNiUmVzcG9uc2UKKwkJCQkJCSAgcGZuQ2JSZXNwb25zZV9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNUQVRVU1VfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxUaW1lcnUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxUaW1lcnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFRpbWVydS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJ1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsVGltZXIuaCIKKyNpbmNsdWRlICJFcGxFdmVudHUuaCIKKworI2lmbmRlZiBfRVBMVElNRVJVX0hfCisjZGVmaW5lIF9FUExUSU1FUlVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1SW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1QWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1RGVsZXRlVGltZXIodEVwbFRpbWVySGRsICogcFRpbWVySGRsX3ApOworCitCT09MIFBVQkxJQyBFcGxUaW1lcnVJc1RpbWVyQWN0aXZlKHRFcGxUaW1lckhkbCBUaW1lckhkbF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKaW5kZXggYTk1YzI2MC4uMzBlYWFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCkBAIC0xMzQ1LDcgKzEzNDUsNiBAQAogewogCVBNUF9UQ0IgcE1wVGNiOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBFbnRyeTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcFBhY2tldCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsb2NrZmxhZ3M7CiAJdWludDMyX3QgRnJlZUNvdW50ZXIgPSAwOwogCkBAIC0xMzU4LDggKzEzNTcsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQWRhcHRlci0+U2VuZFdhaXRMb2NrLCBsb2NrZmxhZ3MpOwogCiAJCXBFbnRyeSA9IHBBZGFwdGVyLT5UeFJpbmcuU2VuZFdhaXRRdWV1ZS5uZXh0OwotCi0JCXBQYWNrZXQgPSBOVUxMOwogCX0KIAogCXBBZGFwdGVyLT5UeFJpbmcubldhaXRTZW5kID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWJ1Zy5oCmluZGV4IGRhYjYwODAuLjk5NDEwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaApAQCAtODIsMTEgKzgyLDExIEBACiAjZGVmaW5lIERCR19MVkwJMwogI2VuZGlmIC8qIERCR19MVkwgKi8KIAotI2RlZmluZSBEQkdfREVGQVVMVFMJCShEQkdfRVJST1JfT04gfCBEQkdfV0FSTklOR19PTiB8IERCR19CUkVBS19PTiApCisjZGVmaW5lIERCR19ERUZBVUxUUwkJKERCR19FUlJPUl9PTiB8IERCR19XQVJOSU5HX09OIHwgREJHX0JSRUFLX09OKQogCi0jZGVmaW5lIERCR19GTEFHUyhBKQkJKEEpLT5kYmdGbGFncwotI2RlZmluZSBEQkdfTkFNRShBKQkJKEEpLT5kYmdOYW1lCi0jZGVmaW5lIERCR19MRVZFTChBKQkJKEEpLT5kYmdMZXZlbAorI2RlZmluZSBEQkdfRkxBR1MoQSkJCSgoQSktPmRiZ0ZsYWdzKQorI2RlZmluZSBEQkdfTkFNRShBKQkJKChBKS0+ZGJnTmFtZSkKKyNkZWZpbmUgREJHX0xFVkVMKEEpCQkoKEEpLT5kYmdMZXZlbCkKIAogI2lmbmRlZiBEQkdfUFJJTlQKICNkZWZpbmUgREJHX1BSSU5UKFMuLi4pCQlwcmludGsoS0VSTl9ERUJVRyBTKQpAQCAtMTA4LDU2ICsxMDgsMTEwIEBACiAjZGVmaW5lIF9EQkdfTEVBVkUoQSkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiUuKnM6JXNcbiIsIERCR19OQU1FKEEpLAlcCiAJCQkJREJHX0xFVkVMKEEpLS0sIF9MRUFWRV9TVFIsIF9fZnVuY19fKQogCi0jZGVmaW5lIERCR19FTlRFUihBKSAgICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19FTlRFUihBKTt9CisjZGVmaW5lIERCR19FTlRFUihBKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKQkJCVwKKwkJCV9EQkdfRU5URVIoQSk7CQkJCQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfTEVBVkUoQSkgICAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfTEVBVkUoQSk7fQorI2RlZmluZSBEQkdfTEVBVkUoQSkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikJCQlcCisJCQlfREJHX0xFQVZFKEEpOwkJCQkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUEFSQU1fT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUklOVCgiICAlcyAtLSAiRiJcbiIsTixTKTt9CisjZGVmaW5lIERCR19QQVJBTShBLCBOLCBGLCBTLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19QQVJBTV9PTikJCQlcCisJCQlEQkdfUFJJTlQoIiAgJXMgLS0gIkYiICIsIE4sIFMpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikJXAotCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfRVJST1JfT04pIHsJCQkJXAotCQlEQkdfUFJJTlQoIiVzOkVSUk9SOiVzICIsREJHX05BTUUoQSksIF9fZnVuY19fKTsJXAotCQlEQkdfUFJJTlRDKFMpOwkJCQkJCVwKLQkJREJHX1RSQVA7CQkJCQkJXAotCX0KKyNkZWZpbmUgREJHX0VSUk9SKEEsIFMuLi4pCQkJCQkJIFwKKwlkbyB7CQkJCQkJCQkgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSB7CQkJIFwKKwkJCURCR19QUklOVCgiJXM6RVJST1I6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTtcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJIFwKKwkJCURCR19UUkFQOwkJCQkJIFwKKwkJfQkJCQkJCQkgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1dBUk5JTkcoQSxTLi4uKSB7aWYgKERCR19GTEFHUyhBKSAmIERCR19XQVJOSU5HX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOldBUk5JTkc6JXMgIixEQkdfTkFNRShBKSxfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQorI2RlZmluZSBEQkdfV0FSTklORyhBLCBTLi4uKQkJCQkJCSAgICBcCisJZG8gewkJCQkJCQkJICAgIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19XQVJOSU5HX09OKSB7CQkJICAgIFwKKwkJCURCR19QUklOVCgiJXM6V0FSTklORzolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJICAgIFwKKwkJfQkJCQkJCQkgICAgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX05PVElDRShBLFMuLi4pICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19OT1RJQ0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6Tk9USUNFOiVzICIsREJHX05BTUUoQSksX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX05PVElDRShBLCBTLi4uKQkJCQkJCSAgIFwKKwlkbyB7CQkJCQkJCQkgICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfTk9USUNFX09OKSB7CQkJICAgXAorCQkJREJHX1BSSU5UKCIlczpOT1RJQ0U6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgIFwKKwkJfQkJCQkJCQkgICBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVFJBQ0UoQSxTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOlRSQUNFOiVzICIsREJHX05BTUUoQSksIF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CisjZGVmaW5lIERCR19UUkFDRShBLCBTLi4uKQkJCQkJCSAgXAorCWRvIHsJCQkJCQkJCSAgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSB7CQkJICBcCisJCQlEQkdfUFJJTlQoIiVzOlRSQUNFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgIFwKKwkJfQkJCQkJCQkgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19WRVJCT1NFKEEsUy4uLikge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVkVSQk9TRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpWRVJCT1NFOiVzICIsREJHX05BTUUoQSksIF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CisjZGVmaW5lIERCR19WRVJCT1NFKEEsIFMuLi4pCQkJCQkJICAgIFwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1ZFUkJPU0VfT04pIHsJCQkgICAgXAorCQkJREJHX1BSSU5UKCIlczpWRVJCT1NFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgICAgXAorCQl9CQkJCQkJCSAgICBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUlgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKyNkZWZpbmUgREJHX1JYKEEsIFMuLi4pCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pCVwKKwkJCURCR19QUklOVChTKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19SWF9FTlRFUihBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19FTlRFUihBKTt9CisjZGVmaW5lIERCR19SWF9FTlRFUihBKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKQlcCisJCQlfREJHX0VOVEVSKEEpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1JYX0xFQVZFKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0xFQVZFKEEpO30KKyNkZWZpbmUgREJHX1JYX0xFQVZFKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pCVwKKwkJCV9EQkdfTEVBVkUoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVFgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKyNkZWZpbmUgREJHX1RYKEEsIFMuLi4pCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pCVwKKwkJCURCR19QUklOVChTKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UWF9FTlRFUihBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19FTlRFUihBKTt9CisjZGVmaW5lIERCR19UWF9FTlRFUihBKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKQlcCisJCQlfREJHX0VOVEVSKEEpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1RYX0xFQVZFKEEpICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0xFQVZFKEEpO30KKyNkZWZpbmUgREJHX1RYX0xFQVZFKEEpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pCVwKKwkJCV9EQkdfTEVBVkUoQSk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfQVNTRVJUKEMpICAgICAgIHtpZiAoIShDKSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcylcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNDLF9fRklMRV9fLF9fTElORV9fLF9fZnVuY19fKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfVFJBUDt9fQorI2RlZmluZSBEQkdfQVNTRVJUKEMpCQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoIShDKSkgewkJCQkJXAorCQkJREJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcykgIiwgIFwKKwkJCSAgICAgI0MsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOyBcCisJCQlEQkdfVFJBUDsJCQkJXAorCQl9CQkJCQkJXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgU1RBVElDCiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyMTg1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIFRSQU5aUE9SVAorCXRyaXN0YXRlICJGcm9udGllciBUcmFuenBvcnQgYW5kIEFscGhhdHJhY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRnJvbnRpZXIgVHJhbnpwb3J0IGFuZCBBbHBoYXRyYWNrIGRldmljZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYWM5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19UUkFOWlBPUlQpCQkrPSB0cmFuenBvcnQubworb2JqLSQoQ09ORklHX1RSQU5aUE9SVCkJCSs9IGFscGhhdHJhY2subwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIFVTQiBUcmFuenBvcnQgYW5kIEFscGhhdHJhY2sgS2VybmVsIGRyaXZlcnMgZm9yIExpbnV4LgorCitBdCBwcmVzZW50IHRoZSB0cmFuenBvcnQgZG9lcyByZWFkcy93cml0ZXMgb2YgOCBieXRlIGNtZHMgdG8gL2Rldi90cmFuenBvcnQwIHRvIGNvbnRyb2wKK3RoZSBsaWdodHMgYW5kIHNjcmVlbiBhbmQgd2hlZWwKKworQXQgcHJlc2VudCB0aGUgYWxwaGF0cmFjayBhY2NlcHRzIHJlYWRzL3dyaXRlcyBvZiAxMiBieXRlIGNtZHMgdG8gL2Rldi90cmFuenBvcnQwIHRvIGNvbnRyb2wKK3RoZSBsaWdodHMgYW5kIHNjcmVlbiBhbmQgZmFkZXIuCisKK0JvdGggZHJpdmVycyBhbHNvIGhhdmUgc29tZSBzeXNmcyBob29rcyB0aGF0IGFyZSBub24tZnVuY3Rpb25hbCBhdCB0aGUgbW9tZW50LgorCitUaGUgQVBJIGlzIGN1cnJlbnRseSBjbG9zZWx5IHRpZWQgdG8gdGhlIGFyZG91ciByZXZpc2lvbiBhbmQgV0lMTCBjaGFuZ2UuCisKK0Egc3lzZnMgaW50ZXJmYWNlIGlzIFBFUkZFQ1QgZm9yIHNpbXBsZSB1c2Vyc3BhY2UgYXBwcyB0byBkbyBmdW4gdGhpbmdzIHdpdGggdGhlCitsaWdodHMgYW5kIHNjcmVlbi4gSXQncyBmYWlybHkgbG91c3kgZm9yIGhhbmRsaW5nIGlucHV0IGV2ZW50cyBhbmQgdmVyeSBsb3VzeQorZm9yIHdhdGNoaW5nIHRoZSBzdGF0ZSBvZiB0aGUgc2h1dHRsZSB3aGVlbC4KKworQSBsaW51eCBpbnB1dCBldmVudHMgaW50ZXJmYWNlIGlzIGdyZWF0IGZvciB0aGUgaW5wdXQgZXZlbnRzIGFuZCBzaHV0dGxlIHdoZWVsLiBJdCdzCit0aGVvcmV0aWNhbGx5IE9LIG9uIExFRHMuIEEgRmFkZXIgY2FuIGJlIG1hcHBlZCB0byBhbiBhYnNvbHV0ZSBtb3VzZSBkZXZpY2UuCitCdXQgdGhlcmUgaXMgbm8gTENEIHN1cHBvcnQgYXQgYWxsLgorCitJbiB0aGUgZW5kIHRoaXMgaXMgZ29pbmcgdG8gYmUgZHJpdmVuIGJ5IGEgbWlkaSBsYXllciwgd2hpY2ggaGFuZGxlcyBhbGwgdGhvc2UKK2Nhc2VzIHZpYSBhIGRlZmluZWQgQVBJLCBidXQgLSBhbW9uZyBvdGhlciB0aGluZ3MgLSBpcyBzbG93LCBkb2Vzbid0IGRvCitmbG93IGNvbnRyb2wsIGFuZCBpcyBhIExPVCBvZiBleHRyYSB3b3JrLiBGcmFua2x5LCBJJ2QgbGlrZSB0byBrZWVwIHRoZQorY29yZSBkcml2ZXIgc2ltcGxlIGJlY2F1c2UgdGhlIG9ubHkgcmVhbHRpbWUgd29yayByZWFsbHkgcmVxdWlyZWQgaXMKK3RoZSBib3R0b20gaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGhlIG91dHB1dCBvdmVybGFwcGluZy4KKworRXhwb3Npbmcgc29tZSBzb3J0IG9mIGNsZWFuIGFpbyBhcGkgdG8gdXNlcnNwYWNlIHdvdWxkIGJlIHBlcmZlY3QuIFdoYXQgdGhhdAorQVBJIGxvb2tzIGxpa2U/IEdhaC4gYmVhdHMgbWUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjBhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFuCisJLSBzcGFyc2UgY2xlYW4KKwktIGZpeCB1c2Vyc3BhY2UgaW50ZXJmYWNlIHRvIGJlIHNhbmUKKwktIHBvc3NpYmx5IGp1c3QgcG9ydCB0byB1c2Vyc3BhY2Ugd2l0aCBsaWJ1c2IKKwktIHJldmlldyBieSB0aGUgVVNCIGRldmVsb3BlciBjb21tdW5pdHkKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgZm9yIHRoaXMgZHJpdmVyIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CithbmQgRGF2aWQgVGFodCA8ZEB0ZWtsaWJyZS5jb20+LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkN2M1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBGcm9udGllciBEZXNpZ25zIEFscGhhdHJhY2sgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgVGFodCAobUB0YWh0Lm5ldCkKKyAqCisgKiBCYXNlZCBvbiB0aGUgdXNibGVkIGRyaXZlciBhbmQgbGR1c2IgZHJpdmVycyBieQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgSHVuZCA8bWh1bmRAbGQtZGlkYWN0aWMuZGU+CisgKgorICogVGhlIGxkdXNiIGRyaXZlciB3YXMsIGluIHR1cm4sIGRlcml2ZWQgZnJvbSBMZWdvIFVTQiBUb3dlciBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBHbGFuY2UgPGFkdmlkZ3NmQHNvdXJjZWZvcmdlLm5ldD4KKyAqCQkgMjAwMS0yMDA0IEp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKy8qKgorICogVGhpcyBkcml2ZXIgdXNlcyBhIHJpbmcgYnVmZmVyIGZvciB0aW1lIGNyaXRpY2FsIHJlYWRpbmcgb2YKKyAqIGludGVycnVwdCBpbiByZXBvcnRzIGFuZCBwcm92aWRlcyByZWFkIGFuZCB3cml0ZSBtZXRob2RzIGZvcgorICogcmF3IGludGVycnVwdCByZXBvcnRzLgorICovCisKKy8qIE5vdGU6IHRoaXMgY3VycmVudGx5IHVzZXMgYSBkdW1iIHJpbmdidWZmZXIgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisgKiBBIG1vcmUgb3B0aW1hbCBkcml2ZXIgd291bGQgY2FjaGUgYW5kIGtpbGwgb2ZmIG91dHN0YW5kaW5nIHVyYnMgdGhhdCBhcmUKKyAqIG5vdyBpbnZhbGlkLCBhbmQgaWdub3JlIG9uZXMgdGhhdCBhbHJlYWR5IHdlcmUgaW4gdGhlIHF1ZXVlIGJ1dCB2YWxpZAorICogYXMgd2Ugb25seSBoYXZlIDMwIGNvbW1hbmRzIGZvciB0aGUgYWxwaGF0cmFjay4gSW4gcGFydGljdWxhciB0aGlzIGlzCisgKiBrZXkgZm9yIGdldHRpbmcgbGlnaHRzIHRvIGZsYXNoIGluIHRpbWUgYXMgb3RoZXJ3aXNlIG1hbnkgY29tbWFuZHMKKyAqIGNhbiBiZSBidWZmZXJlZCB1cCBiZWZvcmUgdGhlIGxpZ2h0IGNoYW5nZSBtYWtlcyBpdCB0byB0aGUgaW50ZXJmYWNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisjaW5jbHVkZSAic3VyZmFjZV9zeXNmcy5oIgorCisvKiBtYWtlIHRoaXMgd29yayBvbiBvbGRlciBrZXJuZWwgdmVyc2lvbnMgKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorI2luY2x1ZGUgImZyb250aWVyX2NvbXBhdC5oIgorI2VuZGlmIC8qIG9sZGVyIGtlcm5lbCB2ZXJzaW9ucyAqLworCisjaW5jbHVkZSAiYWxwaGF0cmFjay5oIgorCisjZGVmaW5lIFZFTkRPUl9JRAkweDE2NWIKKyNkZWZpbmUgUFJPRFVDVF9JRAkweGZhZDEKKworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRQkwCisjZWxzZQorLy8gRklYTUUgMTc2IC0gaXMgYW5vdGhlciBkcml2ZXIncyBtaW5vciAtIGFwcGx5IGZvciB0aGF0CisvLyAjZGVmaW5lIFVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UJMTc3CisjZGVmaW5lIFVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UJMTc2CisjZW5kaWYKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9hbHBoYXRyYWNrX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShWRU5ET1JfSUQsIFBST0RVQ1RfSUQpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9hbHBoYXRyYWNrX3RhYmxlKTsKK01PRFVMRV9WRVJTSU9OKCIwLjQwIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIFRhaHQgPG1AdGFodC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFscGhhdHJhY2sgVVNCIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkZyb250aWVyIERlc2lnbnMgQWxwaGF0cmFjayBDb250cm9sIFN1cmZhY2UiKTsKKworLyogVGhlc2UgYXJlbid0IGRvbmUgeWV0ICovCisKKyNkZWZpbmUgU1VQUFJFU1NfRVhUUkFfT05MSU5FX0VWRU5UUyAwCisjZGVmaW5lIEJVRkZFUkVEX1dSSVRFUyAwCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTIDAKKyNkZWZpbmUgQ09NUFJFU1NfRkFERVJfRVZFTlRTIDAKKworI2RlZmluZSBCVUZGRVJFRF9SRUFEUyAxCisjZGVmaW5lIFJJTkdfQlVGRkVSX1NJWkUgNTEyCisjZGVmaW5lIFdSSVRFX0JVRkZFUl9TSVpFIDM0CisjZGVmaW5lIEFMUEhBVFJBQ0tfVVNCX1RJTUVPVVQgMTAKKyNkZWZpbmUgT1VUUFVUX0NNRF9TSVpFIDgKKyNkZWZpbmUgSU5QVVRfQ01EX1NJWkUgMTIKKworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKKworLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjZGVmaW5lIGRiZ19pbmZvKGRldiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGFscGhhdHJhY2tfb2NtZF9pbmZvKGRldiwgY21kLCBmb3JtYXQsIGFyZy4uLikKKworI2RlZmluZSBhbHBoYXRyYWNrX2ljbWRfaW5mbyhkZXYsIGNtZCwgZm9ybWF0LCBhcmcuLi4pCisKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCisvKiBBbGwgaW50ZXJydXB0IGluIHRyYW5zZmVycyBhcmUgY29sbGVjdGVkIGluIGEgcmluZyBidWZmZXIgdG8KKyAqIGF2b2lkIHJhY2luZyBjb25kaXRpb25zIGFuZCBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlIG9mIHRoZSBkcml2ZXIuCisgKi8KKworc3RhdGljIGludCByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsKKworbW9kdWxlX3BhcmFtKHJpbmdfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyaW5nX2J1ZmZlcl9zaXplLCAiUmVhZCByaW5nIGJ1ZmZlciBzaXplIik7CisKKy8qIFRoZSB3cml0ZV9idWZmZXIgY2FuIG9uZSBkYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIGludGVycnVwdCBvdXQgdHJhbnNmZXIuCisgKi8KKworc3RhdGljIGludCB3cml0ZV9idWZmZXJfc2l6ZSA9IFdSSVRFX0JVRkZFUl9TSVpFOworbW9kdWxlX3BhcmFtKHdyaXRlX2J1ZmZlcl9zaXplLCBpbnQsICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Mod3JpdGVfYnVmZmVyX3NpemUsICJXcml0ZSBidWZmZXIgc2l6ZSIpOworCisvKgorICogSW5jcmVhc2UgdGhlIGludGVydmFsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBvciBzZXQgdG8gMSB0byB1c2UgdGhlIHN0YW5kYXJkIGludGVydmFsIGZyb20gdGhlIGVuZHBvaW50IGRlc2NyaXB0b3JzLgorICovCisKK3N0YXRpYyBpbnQgbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA9IEFMUEhBVFJBQ0tfVVNCX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCwgIk1pbmltdW0gaW50ZXJydXB0IGluIGludGVydmFsIGluIG1zIik7CisKK3N0YXRpYyBpbnQgbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBBTFBIQVRSQUNLX1VTQl9USU1FT1VUOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgIk1pbmltdW0gaW50ZXJydXB0IG91dCBpbnRlcnZhbCBpbiBtcyIpOworCisKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KKworc3RydWN0IHVzYl9hbHBoYXRyYWNrIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJCS8qIGxvY2tzIHRoaXMgc3RydWN0dXJlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UqCWludGY7CQkvKiBzYXZlIG9mZiB0aGUgdXNiIGludGVyZmFjZSBwb2ludGVyICovCisJaW50CQkJb3Blbl9jb3VudDsJLyogbnVtYmVyIG9mIHRpbWVzIHRoaXMgcG9ydCBoYXMgYmVlbiBvcGVuZWQgKi8KKworCXN0cnVjdCBhbHBoYXRyYWNrX2ljbWQJKCpyaW5nX2J1ZmZlcilbUklOR19CVUZGRVJfU0laRV07IC8qIGp1c3QgbWFrZSBjIGhhcHB5ICovCisJc3RydWN0IGFscGhhdHJhY2tfb2NtZAkoKndyaXRlX2J1ZmZlcilbV1JJVEVfQlVGRkVSX1NJWkVdOyAvKiBqdXN0IG1ha2UgYyBoYXBweSAqLworCXVuc2lnbmVkIGludAkJcmluZ19oZWFkOworCXVuc2lnbmVkIGludAkJcmluZ190YWlsOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwl1bnNpZ25lZCBjaGFyKgkJaW50ZXJydXB0X2luX2J1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyKgkJb2xkaV9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9pbl91cmI7CisJaW50CQkJaW50ZXJydXB0X2luX2ludGVydmFsOworCXNpemVfdAkJCWludGVycnVwdF9pbl9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9pbl9ydW5uaW5nOworCWludAkJCWludGVycnVwdF9pbl9kb25lOworCisJY2hhcioJCQlpbnRlcnJ1cHRfb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9vdXRfdXJiOworCWludAkJCWludGVycnVwdF9vdXRfaW50ZXJ2YWw7CisJc2l6ZV90CQkJaW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9vdXRfYnVzeTsKKworCWF0b21pY190IHdyaXRlc19wZW5kaW5nOworCWludCBldmVudDsgLyogYWx0ZXJuYXRlIGludGVyZmFjZSB0byBldmVudHMgKi8KKwlpbnQgZmFkZXI7IC8qIDEwIGJpdHMgKi8KKwlpbnQgbGlnaHRzOyAvKiAyMyBiaXRzICovCisJdW5zaWduZWQgY2hhciBkdW1wX3N0YXRlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlOyAvKiAwIGlmIGRpc2FibGVkIDEgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgb2ZmbGluZTsgLyogaWYgdGhlIGRldmljZSBpcyBvdXQgb2YgcmFuZ2Ugb3IgYXNsZWVwICovCisJdW5zaWduZWQgY2hhciB2ZXJib3NlOyAvKiBiZSB2ZXJib3NlIGluIGVycm9yIHJlcG9ydGluZyAqLworCXVuc2lnbmVkIGNoYXIgIGxhc3RfY21kW09VVFBVVF9DTURfU0laRV07CisJdW5zaWduZWQgY2hhciAgc2NyZWVuWzMyXTsKK307CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFRklORV9NVVRFWChkaXNjb25uZWN0X211dGV4KTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX2FscGhhdHJhY2tfZHJpdmVyOworCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2Fib3J0X3RyYW5zZmVycworICogICAgICBhYm9ydHMgdHJhbnNmZXJzIGFuZCBmcmVlcyBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcworICovCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19hYm9ydF90cmFuc2ZlcnMoc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYpCit7CisJLyogc2h1dGRvd24gdHJhbnNmZXIgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZykgeworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfZGVsZXRlCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9hbHBoYXRyYWNrX2RlbGV0ZShzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldikKK3sKKwl1c2JfYWxwaGF0cmFja19hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisJa2ZyZWUoZGV2LT5yaW5nX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKKwlrZnJlZShkZXYpOyAvLyBmaXhtZSBvbGRpX2J1ZmZlcgorfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9pbl9jYWxsYmFjaworICovCisKK3N0YXRpYyB2b2lkIHVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYgPSB1cmItPmNvbnRleHQ7CisJdW5zaWduZWQgaW50IG5leHRfcmluZ19oZWFkOworCWludCByZXR2YWwgPSAtMTsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKKwkJCWdvdG8gZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBub256ZXJvIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KKwkJfQorCX0KKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gSU5QVVRfQ01EX1NJWkUpIHsKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCBcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJIGFscGhhdHJhY2tfb2NtZF9pbmZvKCZkZXYtPmludGYtPmRldiwmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kLCIlcyIsICJibGEiKTsKKwkJIGlmKG1lbWNtcChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsZGV2LT5vbGRpX2J1ZmZlcixJTlBVVF9DTURfU0laRSk9PTApIHsKKwkJCQkJCWdvdG8gcmVzdWJtaXQ7CisJCX0KKwkJbWVtY3B5KGRldi0+b2xkaV9idWZmZXIsZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLElOUFVUX0NNRF9TSVpFKTsKKworI2lmIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTCisJaWYoZGV2LT5vZmZsaW5lID09IDIgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZ290byByZXN1Ym1pdDsgfQorCQlpZihkZXYtPm9mZmxpbmUgPT0gMSAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAyOyBnb3RvIHJlc3VibWl0OyB9CisvKiBBbHdheXMgcGFzcyBvbmUgb2ZmbGluZSBldmVudCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYoZGV2LT5vZmZsaW5lID4gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gIT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAwOyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDE7IH0KKyNlbmRpZgorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX0ZVTkNUSU9OX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCQluZXh0X3JpbmdfaGVhZCA9IChkZXYtPnJpbmdfaGVhZCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisKKwkJaWYgKG5leHRfcmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKSB7CisJCQltZW1jcHkoJigoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ19oZWFkXSksCisJCQkJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJZGV2LT5yaW5nX2hlYWQgPSBuZXh0X3JpbmdfaGVhZDsKKwkJCXJldHZhbCA9IDA7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9IGVsc2UgeworCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9CisJfQorCityZXN1Ym1pdDoKKwkvKiByZXN1Ym1pdCBpZiB3ZSdyZSBzdGlsbCBydW5uaW5nICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgJiYgZGV2LT5pbnRmKSB7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXR2YWwpCisJCQlkZXZfZXJyKCZkZXYtPmludGYtPmRldiwKKwkJCQkidXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJfQorCitleGl0OgorCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9vdXRfY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKKwkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCWF0b21pY19kZWMoJmRldi0+d3JpdGVzX3BlbmRpbmcpOworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfb3BlbgorICovCitzdGF0aWMgaW50IHVzYl9hbHBoYXRyYWNrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmdXNiX2FscGhhdHJhY2tfZHJpdmVyLCBzdWJtaW5vcik7CisKKwlpZiAoIWludGVyZmFjZSkgeworCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZFxuIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICghZGV2KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBsb2NrIHRoaXMgZGV2aWNlICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGFsbG93IG9wZW5pbmcgb25seSBvbmNlICovCisJaWYgKGRldi0+b3Blbl9jb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWRldi0+b3Blbl9jb3VudCA9IDE7CisKKwkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLworCWRldi0+cmluZ19oZWFkID0gMDsKKwlkZXYtPnJpbmdfdGFpbCA9IDA7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsCisJCQkgaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLAorCQkJIHVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9pbl9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDE7CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDA7CisJZGV2LT5lbmFibGUgPSAxOworCWRldi0+b2ZmbGluZSA9IDA7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X2luX3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWRldi0+b3Blbl9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2F2ZSBkZXZpY2UgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3JlbGVhc2UKKyAqLworc3RhdGljIGludCB1c2JfYWxwaGF0cmFja19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCS8qIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBiZWZvcmUgdGhlIGZpbGUgd2FzIHJlbGVhc2VkICovCisJCXVwKCZkZXYtPnNlbSk7CisJCS8qIHVubG9jayBoZXJlIGFzIHVzYl9hbHBoYXRyYWNrX2RlbGV0ZSBmcmVlcyBkZXYgKi8KKwkJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwl1c2JfYWxwaGF0cmFja19hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwlkZXYtPm9wZW5fY291bnQgPSAwOworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcG9sbAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVzYl9hbHBoYXRyYWNrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPnJlYWRfd2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZkZXYtPndyaXRlX3dhaXQsIHdhaXQpOworCisJaWYgKGRldi0+cmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3JlYWQKKyAqLworc3RhdGljIHNzaXplX3QgdXNiX2FscGhhdHJhY2tfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJaW50IGMgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCXdoaWxlIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCQkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJCQkJCQlnb3RvIHVubG9ja19leGl0OworCQkJCQl9CisJCQkJCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAwIDsKKwkJCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+cmVhZF93YWl0LCBkZXYtPmludGVycnVwdF9pbl9kb25lKTsKKwkJCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkJCQkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCQkJCX0KKwl9CisKKwlhbHBoYXRyYWNrX29jbWRfaW5mbygmZGV2LT5pbnRmLT5kZXYsICYoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWQsICIlcyIsICI6IGNvcHlpbmcgdG8gdXNlcnNwYWNlIik7CisKKwkgICBjID0gMDsKKwkgICB3aGlsZSgoYyA8IGNvdW50KSAmJiAoZGV2LT5yaW5nX3RhaWwgIT0gZGV2LT5yaW5nX2hlYWQpKSB7CisJCQkJCQkgaWYgKGNvcHlfdG9fdXNlcigmYnVmZmVyW2NdLCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0sIElOUFVUX0NNRF9TSVpFKSkgeworCQkJCQkJCQkJCSByZXR2YWwgPSAtRUZBVUxUOworCQkJCQkJCQkJCSBnb3RvIHVubG9ja19leGl0OworCQkJCQkJIH0KKwkJCQkJCSBkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCQkJCQkgYys9SU5QVVRfQ01EX1NJWkU7CisJCQkJCQkgZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19GVU5DVElPTl9fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwkgICB9CisJICAgcmV0dmFsID0gYzsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfd3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgdXNiX2FscGhhdHJhY2tfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHByZXZpb3VzIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIGludGVycnVwdF9vdXRfYnVmZmVyIGZyb20gdXNlcnNwYWNlICovCisgIC8qIEZJWE1FIC0gaWYgeW91IHdyaXRlIG1vcmUgdGhhbiAxMiBieXRlcyB0aGlzIGJyZWFrcyAqLworCWJ5dGVzX3RvX3dyaXRlID0gbWluKGNvdW50LCB3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSk7CisJaWYgKGJ5dGVzX3RvX3dyaXRlIDwgY291bnQpCisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwgIldyaXRlIGJ1ZmZlciBvdmVyZmxvdywgJXpkIGJ5dGVzIGRyb3BwZWRcbiIsY291bnQtYnl0ZXNfdG9fd3JpdGUpOworCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19GVU5DVElPTl9fLCBjb3VudCwgYnl0ZXNfdG9fd3JpdGUpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKSB7CisJCWVycigiRW5kcG9pbnQgc2hvdWxkIG5vdCBiZSBiZSBudWxsISBcbiIpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHNlbmQgb2ZmIHRoZSB1cmIgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIsCisJCQkgaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJIHVzYl9zbmRpbnRwaXBlKGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCQkJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLAorCQkJIGJ5dGVzX3RvX3dyaXRlLAorCQkJIHVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9vdXRfY2FsbGJhY2ssCisJCQkgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCk7CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAxOworCWF0b21pY19pbmMoJmRldi0+d3JpdGVzX3BlbmRpbmcpOworCXdtYigpOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CisJCWVycigiQ291bGRuJ3Qgc3VibWl0IGludGVycnVwdF9vdXRfdXJiICVkXG4iLCByZXR2YWwpOworCQlhdG9taWNfZGVjKCZkZXYtPndyaXRlc19wZW5kaW5nKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJcmV0dmFsID0gYnl0ZXNfdG9fd3JpdGU7CisKK3VubG9ja19leGl0OgorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBmaWxlIG9wZXJhdGlvbnMgbmVlZGVkIHdoZW4gd2UgcmVnaXN0ZXIgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYl9hbHBoYXRyYWNrX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlYWQgID0JdXNiX2FscGhhdHJhY2tfcmVhZCwKKwkud3JpdGUgPQl1c2JfYWxwaGF0cmFja193cml0ZSwKKwkub3BlbiA9CQl1c2JfYWxwaGF0cmFja19vcGVuLAorCS5yZWxlYXNlID0JdXNiX2FscGhhdHJhY2tfcmVsZWFzZSwKKwkucG9sbCA9CQl1c2JfYWxwaGF0cmFja19wb2xsLAorfTsKKworLyoKKyAqIHVzYiBjbGFzcyBkcml2ZXIgaW5mbyBpbiBvcmRlciB0byBnZXQgYSBtaW5vciBudW1iZXIgZnJvbSB0aGUgdXNiIGNvcmUsCisgKiBhbmQgdG8gaGF2ZSB0aGUgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZHJpdmVyIGNvcmUKKyAqLworCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgdXNiX2FscGhhdHJhY2tfY2xhc3MgPSB7CisJLm5hbWUgPQkJImFscGhhdHJhY2slZCIsCisJLmZvcHMgPQkJJnVzYl9hbHBoYXRyYWNrX2ZvcHMsCisJLm1pbm9yX2Jhc2UgPQlVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFLAorfTsKKworCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgdXNiX2FscGhhdHJhY2tfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwlpbnQgaTsKKwlpbnQgdHJ1ZV9zaXplOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbnRpYWxpemUgaXQgKi8KKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOworCWRldi0+aW50ZiA9IGludGY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5yZWFkX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d3JpdGVfd2FpdCk7CisKKwlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQorCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKQorCQkJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID0gZW5kcG9pbnQ7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkludGVycnVwdCBpbiBlbmRwb2ludCBub3QgZm91bmRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IG5vdCBmb3VuZCAodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisKKwlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKworCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplICE9IDY0KQorCSAgICBkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IHNpemUgaXMgbm90IDY0IVxuIik7CisKKwlpZihyaW5nX2J1ZmZlcl9zaXplID09IDApIHsgcmluZ19idWZmZXJfc2l6ZSA9IFJJTkdfQlVGRkVSX1NJWkU7IH0KKworCXRydWVfc2l6ZSA9IG1pbihyaW5nX2J1ZmZlcl9zaXplLFJJTkdfQlVGRkVSX1NJWkUpOworCisJLyogRklYTUUgLSB0aGVyZSBhcmUgbW9yZSB1c2JfYWxsb2Mgcm91dGluZXMgZm9yIGRtYSBjb3JyZWN0bmVzcy4gTmVlZGVkPyAqLworCisvLwlkZXYtPnJpbmdfYnVmZmVyID0ga21hbGxvYygodHJ1ZV9zaXplKnNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19pY21kKSkrMTIsIEdGUF9LRVJORUwpOworCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKCh0cnVlX3NpemUqc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX2ljbWQpKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+cmluZ19idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW5wdXQgcmluZ19idWZmZXIgb2Ygc2l6ZSAlZFxuIix0cnVlX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5vbGRpX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPm9sZGlfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIG9sZCBidWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplID0gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID8gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgOgorCQkJCQkJCQkJIHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOworCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplICE9NjQpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IHNpemUgaXMgbm90IDY0ISlcbiIpOworCisJaWYod3JpdGVfYnVmZmVyX3NpemUgPT0gMCkgeyB3cml0ZV9idWZmZXJfc2l6ZSA9IFdSSVRFX0JVRkZFUl9TSVpFOyB9CisJdHJ1ZV9zaXplID0gbWluKHdyaXRlX2J1ZmZlcl9zaXplLFdSSVRFX0JVRkZFUl9TSVpFKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKHRydWVfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+d3JpdGVfYnVmZmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFscGhhdHJhY2tfb2NtZCkqdHJ1ZV9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT53cml0ZV9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgd3JpdGVfYnVmZmVyIFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsOworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQpCisJCWRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKworCWF0b21pY19zZXQoJmRldi0+d3JpdGVzX3BlbmRpbmcsMCk7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmdXNiX2FscGhhdHJhY2tfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiQWxwaGF0cmFjayBEZXZpY2UgIyVkIG5vdyBhdHRhY2hlZCB0byBtYWpvciAlZCBtaW5vciAlZFxuIiwKKwkJKGludGYtPm1pbm9yIC0gVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRSksIFVTQl9NQUpPUiwgaW50Zi0+bWlub3IpOworCitleGl0OgorCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCXVzYl9hbHBoYXRyYWNrX2RlbGV0ZShkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19kaXNjb25uZWN0CisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9hbHBoYXRyYWNrX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJaW50IG1pbm9yOworCisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlkb3duKCZkZXYtPnNlbSk7CisKKwltaW5vciA9IGludGYtPm1pbm9yOworCisJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRmLCAmdXNiX2FscGhhdHJhY2tfY2xhc3MpOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCXVzYl9hbHBoYXRyYWNrX2RlbGV0ZShkZXYpOworCX0gZWxzZSB7CisJCWRldi0+aW50ZiA9IE5VTEw7CisJCXVwKCZkZXYtPnNlbSk7CisJfQorCisJYXRvbWljX3NldCgmZGV2LT53cml0ZXNfcGVuZGluZywwKTsKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJZGV2X2luZm8oJmludGYtPmRldiwgIkFscGhhdHJhY2sgU3VyZmFjZSAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwKKwkJIChtaW5vciAtIFVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UpKTsKK30KKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl9hbHBoYXRyYWNrX2RyaXZlciA9IHsKKwkubmFtZSA9CQkiYWxwaGF0cmFjayIsCisJLnByb2JlID0JdXNiX2FscGhhdHJhY2tfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2JfYWxwaGF0cmFja19kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXVzYl9hbHBoYXRyYWNrX3RhYmxlLAorfTsKKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVzYl9hbHBoYXRyYWNrX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiX2FscGhhdHJhY2tfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQgZm9yIHRoZSAiX19GSUxFX18iIGRyaXZlci4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19leGl0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfYWxwaGF0cmFja19leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9hbHBoYXRyYWNrX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl9hbHBoYXRyYWNrX2luaXQpOworbW9kdWxlX2V4aXQodXNiX2FscGhhdHJhY2tfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmggYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzkwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5oCkBAIC0wLDAgKzEsOTIgQEAKKyNkZWZpbmUgc2hvd19zZXRfYml0KGEpIHNob3dfc2V0X21iaXQoYWxwaGF0cmFjayxhKQorI2RlZmluZSBzaG93X3NldF9jbWQoYSkgc2hvd19zZXRfbWNtZChhbHBoYXRyYWNrLGEpCisjZGVmaW5lIHNob3dfc2V0X2ludChhKSBzaG93X3NldF9taW50KGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfY2hhcihhKSBzaG93X3NldF9tY2hhcihhbHBoYXRyYWNrLGEpCisjZGVmaW5lIHNob3dfc2V0X2xpZ2h0KGEpIHNob3dfc2V0X2ViaXQoYWxwaGF0cmFjayxMaWdodElELGxpZ2h0cyxhKQorI2RlZmluZSBzaG93X3NldF9idXR0b24oYSkgc2hvd19zZXRfZWJpdChhbHBoYXRyYWNrLEJ1dHRvbklELGJ1dHRvbixhKQorCitzdHJ1Y3QgYWxwaGF0cmFja19pY21kIHsKKyAgICB1bnNpZ25lZCBjaGFyIGNtZFsxMl07Cit9OworCitzdHJ1Y3QgYWxwaGF0cmFja19vY21kIHsKKyAgICB1bnNpZ25lZCBjaGFyIGNtZFs4XTsKK307CisKK2VudW0gTGlnaHRJRCB7CisgICAgICAgIExJR0hUX0VRID0gMCwKKyAgICAgICAgTElHSFRfT1VULAorICAgICAgICBMSUdIVF9GMiwKKyAgICAgICAgTElHSFRfU0VORCwKKyAgICAgICAgTElHSFRfSU4sCisgICAgICAgIExJR0hUX0YxLAorICAgICAgICBMSUdIVF9QQU4sCisgICAgICAgIExJR0hUX1VOREVGMSwKKyAgICAgICAgTElHSFRfVU5ERUYyLAorICAgICAgICBMSUdIVF9TSElGVCwKKyAgICAgICAgTElHSFRfVFJBQ0tNVVRFLAorICAgICAgICBMSUdIVF9UUkFDS1NPTE8sCisgICAgICAgIExJR0hUX1RSQUNLUkVDLAorICAgICAgICBMSUdIVF9SRUFELAorICAgICAgICBMSUdIVF9XUklURSwKKyAgICAgICAgTElHSFRfQU5ZU09MTywKKyAgICAgICAgTElHSFRfQVVUTywKKyAgICAgICAgTElHSFRfRjQsCisgICAgICAgIExJR0hUX1JFQ09SRCwKKyAgICAgICAgTElHSFRfV0lORE9XLAorICAgICAgICBMSUdIVF9QTFVHSU4sCisgICAgICAgIExJR0hUX0YzLAorICAgICAgICBMSUdIVF9MT09QCit9OworCisjZGVmaW5lIEJVVFRPTk1BU0tfQkFUVEVSWSAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0JBQ0tMSUdIVCAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GQVNURk9SV0FSRCAweDA0MDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tNVVRFICAgMHgwMDA0MDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLU09MTyAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS0xFRlQgICAweDgwMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUkVDT1JEICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1NISUZUICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19QVU5DSCAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tSSUdIVCAgMHgwMDAyMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1JFV0lORCAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19TVE9QICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfTE9PUCAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLUkVDICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19QTEFZICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVE9VQ0gxICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCVVRUT05NQVNLX1RPVUNIMiAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQlVUVE9OTUFTS19UT1VDSDMgICAgICAweDAwMDAwMDIwCisKKyNkZWZpbmUgQlVUVE9OTUFTS19QUkVTUzEgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIEJVVFRPTk1BU0tfUFJFU1MyICAgICAgMHgwMDAwODAxMAorI2RlZmluZSBCVVRUT05NQVNLX1BSRVNTMyAgICAgIDB4MDAwMDIwMjAKKworLy8gbGFzdCAzIGJ5dGVzIGFyZSB0aGUgc2xpZGVyIHBvc2l0aW9uCisvLyA0MCBpcyB0aGUgYWN0dWFsIHNsaWRlciBtb3ZpbmcsIHRoZSBtb3N0IHNpZyBiaXRzLCBhbmQgMyBsc2IKKworI2RlZmluZSBCVVRUT05NQVNLX0ZMSVAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRjEgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GMiAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0YzICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRjQgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19QQU4gICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCVVRUT05NQVNLX1NFTkQgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRVEgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19QTFVHSU4gICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCVVRUT05NQVNLX0FVVE8gICAgICAgICAweDAwMDAwMTAwCisKKworLy8gI2RlZmluZSBCVVRUT05NQVNLX0ZPT1RTV0lUQ0ggRklYTUUKKworLy8gTG9va3VwLiBuYW1lLiBtaWRpIG91dC4gbWlkaSBpbi4KKworc3RydWN0IGJ1dHRvbm1hcF90IHsKKwl1MzIgbWFzazsKKwlzaG9ydCBtaWRpX2luOworCXNob3J0IG1pZGlfb3V0OworCWNoYXIgKm5hbWU7CisvLyAgCXZvaWQgKCpmdW5jdGlvbikgKGJ1dHRvbm1hcF90ICopOworICAJdm9pZCAoKmZ1bmN0aW9uKSAodm9pZCk7Cit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvZnJvbnRpZXJfY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvZnJvbnRpZXJfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0NTBlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9mcm9udGllcl9jb21wYXQuaApAQCAtMCwwICsxLDYzIEBACisvKiBVU0IgZGVmaW5lcyBmb3Igb2xkZXIga2VybmVscyAqLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisKKy8qKgorICogdXNiX2VuZHBvaW50X2Rpcl9vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIE9VVCBkaXJlY3Rpb24KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgT1VULCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfZGlyX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2Rpcl9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pOworfQorCisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfaW50IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpbnRlcnJ1cHQsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisgICAgICAgICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpOworfQorCisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKK30KKworI2VuZGlmIC8qIG9sZGVyIGtlcm5lbCB2ZXJzaW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3N1cmZhY2Vfc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9zdXJmYWNlX3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwYTU2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvc3VyZmFjZV9zeXNmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBJZiB5b3UgYXJlIGdvaW5nIHRvIGFidXNlIHRoZSBwcmVwcm9jZXNzb3IsIHdoeSBub3QgQUJVU0UgdGhlIHByZXByb2Nlc3Nvcj8KKyAgIEkgc3R1Y2sgdGhpcyBoZWFkZXIgaW4gYSBzZXBhcmF0ZSBmaWxlIHNvIEkgZG9uJ3QgaGF2ZSB0byBsb29rIGF0IGl0ICovCisKKy8vIEZJWE1FIE5lZWQgbG9ja2luZyBvciBhdG9taWMgb3BzCisKKyNkZWZpbmUgc2hvd19zZXRfbWJpdChkbmFtZSx2YWx1ZSxiaXQpCQkJCQkJCQkJCQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gKDEgJiYgKHQtPnZhbHVlICYgKDEgPDwgYml0KSkpOwkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJaWYodGVtcCA+IDApIHsgbG9uZyBiID0gMSA8PCBiaXQ7IHQtPnZhbHVlIHw9IGI7IH0gXAorCWVsc2UgeyBsb25nIGIgPSB+KDEgPDwgYml0KTsgdC0+dmFsdWUgJj0gYiA7CQkJCSBcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKyNkZWZpbmUgc2hvd19zZXRfZWJpdChkbmFtZSxlbnVtbmFtZSx2YWx1ZSxiaXQpCQkJCQkJCQkJCQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNiaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKyAgZW51bSBlbnVtbmFtZSBsID0gYml0OyBcCisgIGludCB0ZW1wID0gdC0+dmFsdWUgJiAoMSA8PCBsKTsJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyNiaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisgIGVudW0gZW51bW5hbWUgbCA9IGJpdDtcCisJbG9uZyBiICA9IDEgPDwgbDsgXAorCWlmKHRlbXAgPiAwKSB7IHQtPnZhbHVlIHw9IGI7IH0JXAorCWVsc2UgeyB0LT52YWx1ZSAmPSB+YiA7CQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworLy8gRklYTUUgRk9SIENPUlJFQ1RMWSBTRVRUSU5HIEhFWCBmcm9tIGEgc3RyaW5nCisjZGVmaW5lIHNob3dfc2V0X21jbWQoZG5hbWUsdmFsdWUpCQkJCQkJCQkJCQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorICBpbnQgY291bnQgPSAwO1wKKwlpbnQgaTsgXAorCWZvciAoaSA9IDAsaTxzaXplb2YoZG5hbWUpOyBpKyspIGNvdW50ICs9IHNucHJpbnRmKGJ1ZiwgIiUwMngiLHQtPmRuYW1lW2ldKTsgXAorICByZXR1cm4oY291bnQpO1wKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwl0LT52YWx1ZSA9IHRlbXA7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisjZGVmaW5lIHNob3dfc2V0X21pbnQoZG5hbWUsdmFsdWUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0LT52YWx1ZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKyNkZWZpbmUgc2hvd19zZXRfbWNoYXIoZG5hbWUsdmFsdWUpCQkJCQkJCQkJCQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlY1xuIiwgdC0+dmFsdWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwl0LT52YWx1ZSA9IHRlbXA7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWZhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKQEAgLTAsMCArMSwxMDA2IEBACisvKgorICogRnJvbnRpZXIgRGVzaWducyBUcmFuenBvcnQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pY2hhZWwgVGFodCAobUB0YWh0Lm5ldCkKKyAqCisgKiBCYXNlZCBvbiB0aGUgdXNibGVkIGRyaXZlciBhbmQgbGR1c2IgZHJpdmVycyBieQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgSHVuZCA8bWh1bmRAbGQtZGlkYWN0aWMuZGU+CisgKgorICogVGhlIGxkdXNiIGRyaXZlciB3YXMsIGluIHR1cm4sIGRlcml2ZWQgZnJvbSBMZWdvIFVTQiBUb3dlciBkcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBHbGFuY2UgPGFkdmlkZ3NmQHNvdXJjZWZvcmdlLm5ldD4KKyAqCQkgMjAwMS0yMDA0IEp1ZXJnZW4gU3R1YmVyIDxzdGFyYmx1ZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICovCisKKy8qKgorICogVGhpcyBkcml2ZXIgdXNlcyBhIHJpbmcgYnVmZmVyIGZvciB0aW1lIGNyaXRpY2FsIHJlYWRpbmcgb2YKKyAqIGludGVycnVwdCBpbiByZXBvcnRzIGFuZCBwcm92aWRlcyByZWFkIGFuZCB3cml0ZSBtZXRob2RzIGZvcgorICogcmF3IGludGVycnVwdCByZXBvcnRzLgorICovCisKKy8qIE5vdGU6IHRoaXMgY3VycmVudGx5IHVzZXMgYSBkdW1iIHJpbmdidWZmZXIgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisgKiBBIG1vcmUgb3B0aW1hbCBkcml2ZXIgd291bGQgY2FjaGUgYW5kIGtpbGwgb2ZmIG91dHN0YW5kaW5nIHVyYnMgdGhhdCBhcmUKKyAqIG5vdyBpbnZhbGlkLCBhbmQgaWdub3JlIG9uZXMgdGhhdCBhbHJlYWR5IHdlcmUgaW4gdGhlIHF1ZXVlIGJ1dCB2YWxpZAorICogYXMgd2Ugb25seSBoYXZlIDE3IGNvbW1hbmRzIGZvciB0aGUgdHJhbnpwb3J0LiBJbiBwYXJ0aWN1bGFyIHRoaXMgaXMKKyAqIGtleSBmb3IgZ2V0dGluZyBsaWdodHMgdG8gZmxhc2ggaW4gdGltZSBhcyBvdGhlcndpc2UgbWFueSBjb21tYW5kcworICogY2FuIGJlIGJ1ZmZlcmVkIHVwIGJlZm9yZSB0aGUgbGlnaHQgY2hhbmdlIG1ha2VzIGl0IHRvIHRoZSBpbnRlcmZhY2UuCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorI2luY2x1ZGUgZnJvbnRpZXJfY29tcGF0LmgKKyNlbmRpZgorCisvKiBEZWZpbmUgdGhlc2UgdmFsdWVzIHRvIG1hdGNoIHlvdXIgZGV2aWNlcyAqLworI2RlZmluZSBWRU5ET1JfSUQgICAweDE2NWIKKyNkZWZpbmUgUFJPRFVDVF9JRAkweDgxMDEKKworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgVVNCX1RSQU5aUE9SVF9NSU5PUl9CQVNFCTAKKyNlbHNlCisvLyBGSVhNRSAxNzYgLSBpcyB0aGUgbGR1c2IgZHJpdmVyJ3MgbWlub3IgLSBhcHBseSBmb3IgYSBtaW5vciBzb29uCisjZGVmaW5lIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRQkxNzcKKyNlbmRpZgorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX3RyYW56cG9ydF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0lELCBQUk9EVUNUX0lEKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfdHJhbnpwb3J0X3RhYmxlKTsKK01PRFVMRV9WRVJTSU9OKCIwLjMzIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIFRhaHQgPG1AdGFodC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRyYW56cG9ydCBVU0IgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiRnJvbnRpZXIgRGVzaWducyBUcmFuenBvcnQgQ29udHJvbCBTdXJmYWNlIik7CisKKy8qIFRoZXNlIHR3byBhcmVuJ3QgZG9uZSB5ZXQgKi8KKworI2RlZmluZSBTVVBQUkVTU19FWFRSQV9PTkxJTkVfRVZFTlRTIDAKKyNkZWZpbmUgQlVGRkVSRURfV1JJVEVTIDAKKworI2RlZmluZSBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUyAxCisjZGVmaW5lIENPTVBSRVNTX1dIRUVMX0VWRU5UUyAxCisjZGVmaW5lIEJVRkZFUkVEX1JFQURTIDEKKyNkZWZpbmUgUklOR19CVUZGRVJfU0laRSAxMDAwCisjZGVmaW5lIFdSSVRFX0JVRkZFUl9TSVpFIDM0CisjZGVmaW5lIFRSQU5aUE9SVF9VU0JfVElNRU9VVCAxMAorCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworLyogQWxsIGludGVycnVwdCBpbiB0cmFuc2ZlcnMgYXJlIGNvbGxlY3RlZCBpbiBhIHJpbmcgYnVmZmVyIHRvCisgKiBhdm9pZCByYWNpbmcgY29uZGl0aW9ucyBhbmQgZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBvZiB0aGUgZHJpdmVyLgorICovCisKK3N0YXRpYyBpbnQgcmluZ19idWZmZXJfc2l6ZSA9IFJJTkdfQlVGRkVSX1NJWkU7CisKK21vZHVsZV9wYXJhbShyaW5nX2J1ZmZlcl9zaXplLCBpbnQsICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocmluZ19idWZmZXJfc2l6ZSwgIlJlYWQgcmluZyBidWZmZXIgc2l6ZSBpbiByZXBvcnRzIik7CisKKy8qIFRoZSB3cml0ZV9idWZmZXIgY2FuIG9uZSBkYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIGludGVycnVwdCBvdXQgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyX3NpemUgPSBXUklURV9CVUZGRVJfU0laRTsKK21vZHVsZV9wYXJhbSh3cml0ZV9idWZmZXJfc2l6ZSwgaW50LCAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHdyaXRlX2J1ZmZlcl9zaXplLCAiV3JpdGUgYnVmZmVyIHNpemUiKTsKKworLyoKKyAqIEluY3JlYXNlIHRoZSBpbnRlcnZhbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICogb3Igc2V0IHRvIDEgdG8gdXNlIHRoZSBzdGFuZGFyZCBpbnRlcnZhbCBmcm9tIHRoZSBlbmRwb2ludCBkZXNjcmlwdG9ycy4KKyAqLworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBUUkFOWlBPUlRfVVNCX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCwgIk1pbmltdW0gaW50ZXJydXB0IGluIGludGVydmFsIGluIG1zIik7CisKK3N0YXRpYyBpbnQgbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBUUkFOWlBPUlRfVVNCX1RJTUVPVVQ7Cittb2R1bGVfcGFyYW0obWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCAiTWluaW11bSBpbnRlcnJ1cHQgb3V0IGludGVydmFsIGluIG1zIik7CisKK3N0cnVjdCB0cmFuenBvcnRfY21kIHsKKyAgICB1bnNpZ25lZCBjaGFyIGNtZFs4XTsKK307CisKK2VudW0gTGlnaHRJRCB7CisJTGlnaHRSZWNvcmQgPSAwLAorCUxpZ2h0VHJhY2tyZWMsCisJTGlnaHRUcmFja211dGUsCisJTGlnaHRUcmFja3NvbG8sCisJTGlnaHRBbnlzb2xvLAorCUxpZ2h0TG9vcCwKKwlMaWdodFB1bmNoCisJfTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KKworc3RydWN0IHVzYl90cmFuenBvcnQgeworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJaW50ZjsJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKworCWludAkJCW9wZW5fY291bnQ7CS8qIG51bWJlciBvZiB0aW1lcyB0aGlzIHBvcnQgaGFzIGJlZW4gb3BlbmVkICovCisKKwlzdHJ1Y3QgdHJhbnpwb3J0X2NtZAkoKnJpbmdfYnVmZmVyKVtSSU5HX0JVRkZFUl9TSVpFXTsgLyoganVzdCBtYWtlIGMgaGFwcHkgKi8KKwl1bnNpZ25lZCBpbnQJCXJpbmdfaGVhZDsKKwl1bnNpZ25lZCBpbnQJCXJpbmdfdGFpbDsKKworCXdhaXRfcXVldWVfaGVhZF90CXJlYWRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0OworCisJdW5zaWduZWQgY2hhcioJCWludGVycnVwdF9pbl9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9pbl91cmI7CisJaW50CQkJaW50ZXJydXB0X2luX2ludGVydmFsOworCXNpemVfdAlpbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fcnVubmluZzsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fZG9uZTsKKworCWNoYXIqCQkJaW50ZXJydXB0X291dF9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfb3V0X2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfb3V0X3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2ludGVydmFsOworCXNpemVfdAlpbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X291dF9idXN5OworCisJLyogU3lzZnMgYW5kIHRyYW5zbGF0aW9uIHN1cHBvcnQgKi8KKworCWludCBldmVudDsgLyogYWx0ZXJuYXRlIGludGVyZmFjZSB0byBldmVudHMgKi8KKwlpbnQgd2hlZWw7IC8qIC0gZm9yIG5lZ2F0aXZlLCAwIGZvciBub25lLCArIGZvciBwb3NpdGl2ZSAqLworCXVuc2lnbmVkIGNoYXIgZHVtcF9zdGF0ZTsgLyogMCBpZiBkaXNhYmxlZCAxIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGVuYWJsZTsgLyogMCBpZiBkaXNhYmxlZCAxIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIG9mZmxpbmU7IC8qIGlmIHRoZSBkZXZpY2UgaXMgb3V0IG9mIHJhbmdlIG9yIGFzbGVlcCAqLworCXVuc2lnbmVkIGNoYXIgY29tcHJlc3Nfd2hlZWw7IC8qIGZsYWcgdG8gY29tcHJlc3Mgd2hlZWwgZXZlbnRzICovCisJdW5zaWduZWQgY2hhciBsaWdodDsgLyogNyBiaXRzIHVzZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGxhc3RfY21kWzhdOworCXVuc2lnbmVkIGNoYXIgbGFzdF9pbnB1dFs4XTsKKwl1bnNpZ25lZCBjaGFyIHNjcmVlbls0MF07IC8vIFdlJ2xsIGFsc28gaGF2ZSBjZWxscworCit9OworCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoZGlzY29ubmVjdF9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfdHJhbnpwb3J0X2RyaXZlcjsKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2Fib3J0X3RyYW5zZmVycworICogICAgICBhYm9ydHMgdHJhbnNmZXJzIGFuZCBmcmVlcyBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcworICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2Fib3J0X3RyYW5zZmVycyhzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2KQoreworCS8qIHNodXRkb3duIHRyYW5zZmVyICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworfQorCisvLyBGSVhNRSB+bGlnaHQgbm90IGdvb2QgZW5vdWdoIG9yIGNvcnJlY3QgLSBuZWVkIGF0b21pYyBzZXRfYml0CisKKyNkZWZpbmUgc2hvd19zZXRfbGlnaHQodmFsdWUpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCVwKKwllbnVtIExpZ2h0SUQgbGlnaHQgPSB2YWx1ZTsJCQkJCVwKKwlpbnQgdGVtcCA9ICgxICYmICh0LT5saWdodCAmICgxIDw8IGxpZ2h0KSkpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCApOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCWVudW0gTGlnaHRJRCBsaWdodCA9ICh0ZW1wIDw8IHZhbHVlKSAmICh0LT5saWdodCA8PCB2YWx1ZSk7CVwKKwl0LT5saWdodCA9ICh0LT5saWdodCAmIH5saWdodCkgOwkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0UmVjb3JkKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0VHJhY2tyZWMpOworc2hvd19zZXRfbGlnaHQoTGlnaHRUcmFja211dGUpOworc2hvd19zZXRfbGlnaHQoTGlnaHRUcmFja3NvbG8pOworc2hvd19zZXRfbGlnaHQoTGlnaHRBbnlzb2xvKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0TG9vcCk7CitzaG93X3NldF9saWdodChMaWdodFB1bmNoKTsKKworCisjZGVmaW5lIHNob3dfc2V0X2ludCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdC0+dmFsdWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCQkJCQkJCQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKK3Nob3dfc2V0X2ludChlbmFibGUpOworc2hvd19zZXRfaW50KG9mZmxpbmUpOworc2hvd19zZXRfaW50KGNvbXByZXNzX3doZWVsKTsKK3Nob3dfc2V0X2ludChkdW1wX3N0YXRlKTsKK3Nob3dfc2V0X2ludCh3aGVlbCk7CitzaG93X3NldF9pbnQoZXZlbnQpOworCisjZGVmaW5lIHNob3dfc2V0X2NtZCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdC0+dmFsdWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCQkJCQkJCQkJXAorCXQtPnZhbHVlID0gdGVtcDsJCQkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKworCisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9kZWxldGUKKyAqLworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9kZWxldGUoc3RydWN0IHVzYl90cmFuenBvcnQgKmRldikKK3sKKwl1c2JfdHJhbnpwb3J0X2Fib3J0X3RyYW5zZmVycyhkZXYpOworCS8qICBUaGlzIGlzIGp1c3QgdG9vIHR3aXN0ZWQgdG8gYmUgY29ycmVjdCAqLworCWlmKGRldi0+aW50ZiAhPSBOVUxMKSB7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UmVjb3JkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3JlYyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2ttdXRlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3NvbG8pOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrbXV0ZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0QW55c29sbyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0TG9vcCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UHVuY2gpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl93aGVlbCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX2V2ZW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfb2ZmbGluZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX2NvbXByZXNzX3doZWVsKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9kdW1wX3N0YXRlKTsKKwl9CisKKwkvKiBmcmVlIGRhdGEgc3RydWN0dXJlcyAqLworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9mcmVlX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKKwlrZnJlZShkZXYtPnJpbmdfYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIpOworCWtmcmVlKGRldik7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfaW5fY2FsbGJhY2sKKyAqLworCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldiA9IHVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBpbnQgbmV4dF9yaW5nX2hlYWQ7CisJaW50IHJldHZhbCA9IC0xOworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikgeworCQkJZ290byBleGl0OworCQl9IGVsc2UgeworCQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IG5vbnplcm8gc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLworCQl9CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA4KSB7CisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKKwkJCSAiVXJiIGxlbmd0aCB3YXMgJWQgYnl0ZXMhISBEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnQgXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCX0gZWxzZSB7CisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiByZWNlaXZlZDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgX19GVU5DVElPTl9fLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsyXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbM10sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzRdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls1XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNl0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzddKTsKKyNpZiBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUworCQlpZihkZXYtPm9mZmxpbmUgPT0gMiAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBnb3RvIHJlc3VibWl0OyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAxICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDI7IGdvdG8gcmVzdWJtaXQ7IH0KKworLyogQWx3YXlzIHBhc3Mgb25lIG9mZmxpbmUgZXZlbnQgdXAgdGhlIHN0YWNrICovCisJCWlmKGRldi0+b2ZmbGluZSA+IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdICE9IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMDsgfQorCQlpZihkZXYtPm9mZmxpbmUgPT0gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAxOyB9CisKKyNlbmRpZgorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX0ZVTkNUSU9OX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCisJCW5leHRfcmluZ19oZWFkID0gKGRldi0+cmluZ19oZWFkKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKworCQlpZiAobmV4dF9yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJCW1lbWNweSgmKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX2hlYWRdKSwgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJZGV2LT5yaW5nX2hlYWQgPSBuZXh0X3JpbmdfaGVhZDsKKwkJCXJldHZhbCA9IDA7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9IGVsc2UgeworCQkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJCSAiUmluZyBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAwLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9CisJfQorCityZXN1Ym1pdDoKKwkvKiByZXN1Ym1pdCBpZiB3ZSdyZSBzdGlsbCBydW5uaW5nICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgJiYgZGV2LT5pbnRmKSB7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXR2YWwpCisJCQlkZXZfZXJyKCZkZXYtPmludGYtPmRldiwKKwkJCQkidXNiX3N1Ym1pdF91cmIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJfQorCitleGl0OgorCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yZWFkX3dhaXQpOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfaW50ZXJydXB0X291dF9jYWxsYmFjaworICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9vdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKKwkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X29wZW4KKyAqLworc3RhdGljIGludCB1c2JfdHJhbnpwb3J0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZ1c2JfdHJhbnpwb3J0X2RyaXZlciwgc3VibWlub3IpOworCisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogbG9jayB0aGlzIGRldmljZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBhbGxvdyBvcGVuaW5nIG9ubHkgb25jZSAqLworCWlmIChkZXYtPm9wZW5fY291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPm9wZW5fY291bnQgPSAxOworCisJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwlkZXYtPnJpbmdfaGVhZCA9IDA7CisJZGV2LT5yaW5nX3RhaWwgPSAwOworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCSB1c2JfcmN2aW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwKKwkJCSB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9pbl9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDE7CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDA7CisJZGV2LT5lbmFibGUgPSAxOworCWRldi0+b2ZmbGluZSA9IDA7CisJZGV2LT5jb21wcmVzc193aGVlbCA9IDE7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X2luX3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWRldi0+b3Blbl9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2F2ZSBkZXZpY2UgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfcmVsZWFzZQorICovCitzdGF0aWMgaW50IHVzYl90cmFuenBvcnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCS8qIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBiZWZvcmUgdGhlIGZpbGUgd2FzIHJlbGVhc2VkICovCisJCXVwKCZkZXYtPnNlbSk7CisJCS8qIHVubG9jayBoZXJlIGFzIHVzYl90cmFuenBvcnRfZGVsZXRlIGZyZWVzIGRldiAqLworCQl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogd2FpdCB1bnRpbCB3cml0ZSB0cmFuc2ZlciBpcyBmaW5pc2hlZCAqLworCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3ksIDIgKiBIWik7CisJdXNiX3RyYW56cG9ydF9hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwlkZXYtPm9wZW5fY291bnQgPSAwOworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9wb2xsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNiX3RyYW56cG9ydF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPnJlYWRfd2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZkZXYtPndyaXRlX3dhaXQsIHdhaXQpOworCisJaWYgKGRldi0+cmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfcmVhZAorICovCitzdGF0aWMgc3NpemVfdCB1c2JfdHJhbnpwb3J0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2OworCWludCByZXR2YWwgPSAwOworCisjaWYgQlVGRkVSRURfUkVBRFMKKwlpbnQgYyA9IDA7CisjZW5kaWYKKworI2lmIENPTVBSRVNTX1dIRUVMX0VWRU5UUworCXNpZ25lZCBjaGFyIG9sZHdoZWVsOworCXNpZ25lZCBjaGFyIG5ld3doZWVsOworCWludCBjYW5jb21wcmVzcyA9IDE7CisJaW50IG5leHRfdGFpbDsKKyNlbmRpZgorCisvKiBkbyBJIGhhdmUgc3VjaCBhIHRoaW5nIGFzIGEgbnVsbCBldmVudD8gKi8KKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHJlYWQgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwl3aGlsZSAoZGV2LT5yaW5nX2hlYWQgPT0gZGV2LT5yaW5nX3RhaWwpIHsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJCS8vIGF0b21pY19jbXBfZXhjaGFuZ2UoJmRldi0+aW50ZXJydXB0X2luX2RvbmUsMCwwKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDAgOyAvKiB0aW55IHJhY2UgLSBGSVhNRTogbWFrZSBhdG9taWM/ICovCisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJlYWRfd2FpdCwgZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJfQorCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvcHlpbmcgdG8gdXNlcnNwYWNlOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSBfX0ZVTkNUSU9OX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCisjaWYgQlVGRkVSRURfUkVBRFMKKwkgICBjID0gMDsKKwkgICB3aGlsZSgoYyA8IGNvdW50KSAmJiAoZGV2LT5yaW5nX3RhaWwgIT0gZGV2LT5yaW5nX2hlYWQpKSB7CisKKy8qIFRoaXMgc3RhcnRlZCBvZmYgaW4gdGhlIGxvd2VyIGxldmVsIHNlcnZpY2Ugcm91dGluZSwgYW5kIEkgbW92ZWQgaXQgaGVyZS4gVGhlbiBteSBicmFpbiBkaWVkLiBOb3QgZG9uZSB5ZXQuICovCisjaWYgQ09NUFJFU1NfV0hFRUxfRVZFTlRTCisJCW5leHRfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCWlmKGRldi0+Y29tcHJlc3Nfd2hlZWwpIGNhbmNvbXByZXNzID0gMTsKKwkJd2hpbGUoZGV2LT5yaW5nX2hlYWQgIT0gbmV4dF90YWlsICYmIGNhbmNvbXByZXNzID09IDEgKSB7CisJCQluZXd3aGVlbCA9ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNl07CisJCQlvbGR3aGVlbCA9ICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XTsKKwkJCS8vIGlmIGJvdGggYXJlIHdoZWVsIGV2ZW50cywgYW5kIG5vIGJ1dHRvbnMgaGF2ZSBjaGFuZ2VzIChGSVhNRSwgZG8gSSBoYXZlIHRvIGNoZWNrPyksCisJCQkvLyBhbmQgd2UgYXJlIHRoZSBzYW1lIHNpZ24sIHdlIGNhbiBjb21wcmVzcyArLSA3RgorCQkJLy8gRklYTUU6IHNhbmVyIGNoZWNrIGZvciBvdmVyZmxvdyEgLSBtYXggb2YgKy0gN0YKKwkJCS8vIEZJWE1FIHRoZSBtYXRoIGlzIHdyb25nIGZvciBnb2luZyBpbiByZXZlcnNlLCBhY3R1YWxseSwgYXMgdGhlIG1pZGkgc3BlYyBkb2Vzbid0IGFsbG93IHNpZ25lZCBjaGFycworCisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHRyeWluZyB0byBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkgX19GVU5DVElPTl9fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKworCisJCQlpZigoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdICE9IDAgJiYKKwkJCSAgICAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzZdICE9IDAgKSAmJgorCQkJCSgobmV3d2hlZWwgPiAwICYmIG9sZHdoZWVsID4gMCkgfHwKKwkJCQkobmV3d2hlZWwgPCAwICYmIG9sZHdoZWVsIDwgMCkpICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzJdKSAmJgorCQkJCSgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10gPT0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFszXSkgJiYKKwkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNF0pICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzVdKSkKKyB7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHNob3VsZCBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgX19GVU5DVElPTl9fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKworCQkJCW5ld3doZWVsICs9IG9sZHdoZWVsOworCQkJCWlmKG9sZHdoZWVsID4gMCAmJiAhKG5ld3doZWVsID4gMCkpIHsKKwkJCQkJbmV3d2hlZWwgPSAweDdmOworCQkJCQljYW5jb21wcmVzcyA9IDA7CisJCQkJfQorCQkJCWlmKG9sZHdoZWVsIDwgMCAmJiAhKG5ld3doZWVsIDwgMCkpIHsKKwkJCQkJbmV3d2hlZWwgPSAweDgwOworCQkJCQljYW5jb21wcmVzcyA9IDA7CisJCQkJfQorCisJCQkJKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFs2XSA9IG5ld3doZWVsOworCQkJCWRldi0+cmluZ190YWlsID0gbmV4dF90YWlsOworCQkJCW5leHRfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCQl9IGVsc2UgeworCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIENPTVBSRVNTX1dIRUVMX0VWRU5UUyAqLworCisJCWlmIChjb3B5X3RvX3VzZXIoJmJ1ZmZlcltjXSwgJigqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLCA4KSkgeworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKworCQlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCWMrPTg7CisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fRlVOQ1RJT05fXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisJICAgfQorCSAgIHJldHZhbCA9IGM7CisKKyNlbHNlCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsICYoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXSwgOCkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19GVU5DVElPTl9fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKworCXJldHZhbCA9IDg7CisjZW5kaWYgLyogQlVGRkVSRURfUkVBRFMgKi8KKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF93cml0ZQorICovCitzdGF0aWMgc3NpemVfdCB1c2JfdHJhbnpwb3J0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHByZXZpb3VzIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIGludGVycnVwdF9vdXRfYnVmZmVyIGZyb20gdXNlcnNwYWNlICovCisJYnl0ZXNfdG9fd3JpdGUgPSBtaW4oY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplKTsKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZXJyKCJFbmRwb2ludCBzaG91bGQgbm90IGJlIGJlIG51bGwhIFxuIik7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwKKwkJCSBpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkgdXNiX3NuZGludHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLAorCQkJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkgYnl0ZXNfdG9fd3JpdGUsCisJCQkgdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAxOworCXdtYigpOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CisJCWVycigiQ291bGRuJ3Qgc3VibWl0IGludGVycnVwdF9vdXRfdXJiICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlyZXR2YWwgPSBieXRlc190b193cml0ZTsKKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGZpbGUgb3BlcmF0aW9ucyBuZWVkZWQgd2hlbiB3ZSByZWdpc3RlciB0aGlzIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3RyYW56cG9ydF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkICA9CXVzYl90cmFuenBvcnRfcmVhZCwKKwkud3JpdGUgPQl1c2JfdHJhbnpwb3J0X3dyaXRlLAorCS5vcGVuID0JCXVzYl90cmFuenBvcnRfb3BlbiwKKwkucmVsZWFzZSA9CXVzYl90cmFuenBvcnRfcmVsZWFzZSwKKwkucG9sbCA9CQl1c2JfdHJhbnpwb3J0X3BvbGwsCit9OworCisvKgorICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKKyAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgY29yZQorICovCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgdXNiX3RyYW56cG9ydF9jbGFzcyA9IHsKKwkubmFtZSA9CQkidHJhbnpwb3J0JWQiLAorCS5mb3BzID0JCSZ1c2JfdHJhbnpwb3J0X2ZvcHMsCisJLm1pbm9yX2Jhc2UgPQlVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UsCit9OworCisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHVzYl90cmFuenBvcnRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCB0cnVlX3NpemU7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCisJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IG5vdCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kICh1c2luZyBjb250cm9sIGVuZHBvaW50IGluc3RlYWQpXG4iKTsKKworCisJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSAhPSA4KQorCSAgICBkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IGluIGVuZHBvaW50IHNpemUgaXMgbm90IDghXG4iKTsKKworCWlmKHJpbmdfYnVmZmVyX3NpemUgPT0gMCkgeyByaW5nX2J1ZmZlcl9zaXplID0gUklOR19CVUZGRVJfU0laRTsgfQorCXRydWVfc2l6ZSA9IG1pbihyaW5nX2J1ZmZlcl9zaXplLFJJTkdfQlVGRkVSX1NJWkUpOworCS8qIEZJWE1FIC0gdGhlcmUgYXJlIG1vcmUgdXNiX2FsbG9jIHJvdXRpbmVzIGZvciBkbWEgY29ycmVjdG5lc3MuIE5lZWRlZD8gKi8KKworCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKCh0cnVlX3NpemUqc2l6ZW9mKHN0cnVjdCB0cmFuenBvcnRfY21kKSkrOCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+cmluZ19idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmluZ19idWZmZXIgb2Ygc2l6ZSAlZFxuIix0cnVlX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSA9IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA/IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+d01heFBhY2tldFNpemUpIDoKKwkJCQkJCQkJCSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSAhPTgpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IHNpemUgaXMgbm90IDghKVxuIik7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyh3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsOworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQpCisJCWRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID4gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl90cmFuenBvcnRfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UmVjb3JkKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3JlYykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2ttdXRlKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja3NvbG8pKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodEFueXNvbG8pKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodExvb3ApKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFB1bmNoKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfd2hlZWwpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9ldmVudCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2R1bXBfc3RhdGUpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9jb21wcmVzc193aGVlbCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX29mZmxpbmUpKSkgZ290byBlcnJvcjsKKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVHJhbnpwb3J0IERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UpLCBVU0JfTUFKT1IsIGludGYtPm1pbm9yKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKwl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IG1pbm9yOworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlkb3duKCZkZXYtPnNlbSk7CisJbWlub3IgPSBpbnRmLT5taW5vcjsKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZ1c2JfdHJhbnpwb3J0X2NsYXNzKTsKKworCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW5lZCwgdGhlbiB3ZSBjbGVhbiB1cCByaWdodCBub3cgKi8KKwlpZiAoIWRldi0+b3Blbl9jb3VudCkgeworCQl1cCgmZGV2LT5zZW0pOworCQl1c2JfdHJhbnpwb3J0X2RlbGV0ZShkZXYpOworCX0gZWxzZSB7CisJCWRldi0+aW50ZiA9IE5VTEw7CisJCXVwKCZkZXYtPnNlbSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJUcmFuenBvcnQgU3VyZmFjZSAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwKKwkJIChtaW5vciAtIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSkpOworfQorCisvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX3RyYW56cG9ydF9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInRyYW56cG9ydCIsCisJLnByb2JlID0JdXNiX3RyYW56cG9ydF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl90cmFuenBvcnRfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQl1c2JfdHJhbnpwb3J0X3RhYmxlLAorfTsKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX3RyYW56cG9ydF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl90cmFuenBvcnRfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQgZm9yIHRoZSAiX19GSUxFX18iIGRyaXZlci4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl90cmFuenBvcnRfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfdHJhbnpwb3J0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl90cmFuenBvcnRfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2JfdHJhbnpwb3J0X2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKaW5kZXggNTkzZmRiNy4uZjJjZjdmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZwpAQCAtMjUsMyArMjUsMTMgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdvNzAwNy11c2IKIAorY29uZmlnIFZJREVPX0dPNzAwN19VU0JfUzIyNTBfQk9BUkQKKwl0cmlzdGF0ZSAiU2Vuc29yYXkgMjI1MC8yMjUxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19HTzcwMDdfVVNCICYmIERWQl9VU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdmlkZW80bGludXggZHJpdmVyIGZvciB0aGUgU2Vuc29yYXkgMjI1MC8yMjUxIGRldmljZQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzMjI1MC1ib2FyZAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQppbmRleCA5YjkzMTBjLi5lNTE0YjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKQEAgLTUsMTQgKzUsMjMgQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwNykgKz0gZ283MDA3Lm8KIG9iai0kKENPTkZJR19WSURFT19HTzcwMDdfVVNCKSArPSBnbzcwMDctdXNiLm8KK29iai0kKENPTkZJR19WSURFT19HTzcwMDdfVVNCX1MyMjUwX0JPQVJEKSArPSBzMjI1MC5vCiAKLWdvNzAwNy1vYmpzICs9IGdvNzAwNy12NGwyLm8gZ283MDA3LWRyaXZlci5vIGdvNzAwNy1pMmMubyBnbzcwMDctZncubyBzbmQtZ283MDA3Lm8KK2dvNzAwNy1vYmpzICs9IGdvNzAwNy12NGwyLm8gZ283MDA3LWRyaXZlci5vIGdvNzAwNy1pMmMubyBnbzcwMDctZncubyBcCisJCXNuZC1nbzcwMDcubyB3aXMtc2FhNzExMy5vCiAKK3MyMjUwLW9ianMgKz0gczIyNTAtYm9hcmQubyBzMjI1MC1sb2FkZXIubwogCi0jaWZuZXEgKCQoU0FBNzEzNF9CVUlMRCksKQotI29iai1tICs9IHNhYTcxMzQtZ283MDA3Lm8KKyMgVW5jb21waWxlIHdoZW4gdGhlIHNhYTcxMzQgcGF0Y2hlcyBnZXQgaW50byB1cHN0cmVhbQorI2lmbmVxICgkKENPTkZJR19WSURFT19TQUE3MTM0KSwpCisjb2JqLSQoQ09ORklHX1ZJREVPX1NBQTcxMzQpICs9IHNhYTcxMzQtZ283MDA3Lm8KKyNFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQKICNlbmRpZgogCitpZm5lcSAoJChDT05GSUdfVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRCksKQorRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgorZW5kaWYKKwogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL3NhYTcxMzQKIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcwogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKaW5kZXggZTRlYWQ5Ni4uNThiZmM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMKQEAgLTIxNyw2ICsyMTcsOSBAQAogCWNhc2UgSTJDX0RSSVZFUklEX1dJU19PVjc2NDA6CiAJCW1vZG5hbWUgPSAid2lzLW92NzY0MCI7CiAJCWJyZWFrOworCWNhc2UgSTJDX0RSSVZFUklEX1MyMjUwOgorCQltb2RuYW1lID0gInMyMjUwLWJvYXJkIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbW9kbmFtZSA9IE5VTEw7CiAJCWJyZWFrOwpAQCAtMjI3LDcgKzIzMCw3IEBACiAJCXJldHVybiAwOwogCWlmIChtb2RuYW1lICE9IE5VTEwpCiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSJnbzcwMDc6IHByb2JpbmcgZm9yIG1vZHVsZSAlcyBmYWlsZWQiLCBtb2RuYW1lKTsKKwkJCSJnbzcwMDc6IHByb2JpbmcgZm9yIG1vZHVsZSAlcyBmYWlsZWRcbiIsIG1vZG5hbWUpOwogCWVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkJImdvNzAwNzogc2Vuc29yICV1IHNlZW1zIHRvIGJlIHVuc3VwcG9ydGVkIVxuIiwgaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWZ3LmMKaW5kZXggYTBlMTdiMC4uODcxZWQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAk1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MwogfTsKIAotc3RhdGljIGludCBjb3B5X3BhY2thZ2VzKHUxNiAqZGVzdCwgdTE2ICpzcmMsIGludCBwa2dfY250LCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGNvcHlfcGFja2FnZXMoX19sZTE2ICpkZXN0LCB1MTYgKnNyYywgaW50IHBrZ19jbnQsIGludCBzcGFjZSkKIHsKIAlpbnQgaSwgY250ID0gcGtnX2NudCAqIDMyOwogCkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJZm9yIChpID0gMDsgaSA8IGNudDsgKytpKQotCQlkZXN0W2ldID0gX19jcHVfdG9fbGUxNihzcmNbaV0pOworCQlkZXN0W2ldID0gY3B1X3RvX2xlMTZwKHNyYyArIGkpOwogCiAJcmV0dXJuIGNudDsKIH0KQEAgLTM3Miw3ICszNzIsNyBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW50IGdlbl9tanBlZ2hkcl90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgZ2VuX21qcGVnaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCXU4ICpidWY7CiAJdTE2IG1lbSA9IDB4M2UwMDsKQEAgLTY0Myw3ICs2NDMsNyBAQAogfQogCiBzdGF0aWMgaW50IGdlbl9tcGVnMWhkcl90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLAotCQkJCQl1MTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKKwkJCQkJX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCiB7CiAJdTggKmJ1ZjsKIAl1MTYgbWVtID0gMHgzZTAwOwpAQCAtODMxLDcgKzgzMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuX21wZWc0aGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sCi0JCQkJCXUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQorCQkJCQlfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKIHsKIAl1OCAqYnVmOwogCXUxNiBtZW0gPSAweDNlMDA7CkBAIC05MzYsNyArOTM2LDcgQEAKIH0KIAogc3RhdGljIGludCBicmN0cmxfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywKLQkJCQkJdTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCisJCQkJCV9fbGUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQogewogCWludCBjb252ZXJnZV9zcGVlZCA9IDA7CiAJaW50IGxhbWJkYSA9IChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcgfHwgZ28tPmR2ZF9tb2RlKSA/CkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDYsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBjb25maWdfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGNvbmZpZ19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgZnBzID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgLyBnby0+ZnBzX3NjYWxlIC8gMTAwMDsKIAlpbnQgcm93cyA9IGdvLT5pbnRlcmxhY2VfY29kaW5nID8gZ28tPmhlaWdodCAvIDMyIDogZ28tPmhlaWdodCAvIDE2OwpAQCAtMTIxMyw3ICsxMjEzLDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCA1LCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgc2VxaGVhZF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSwKK3N0YXRpYyBpbnQgc2VxaGVhZF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwKIAlpbnQgKCpzZXF1ZW5jZV9oZWFkZXJfZnVuYykoc3RydWN0IGdvNzAwNyAqZ28sCiAJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGV4dCkpCiB7CkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogCXJldHVybiBiaWc7CiB9CiAKLXN0YXRpYyBpbnQgYXZzeW5jX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBhdnN5bmNfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IGFyYXRlID0gZ28tPmJvYXJkX2luZm8tPmF1ZGlvX3JhdGUgKiAxMDAxICogZ28tPmZwc19zY2FsZTsKIAlpbnQgcmF0aW8gPSBhcmF0ZSAvIGdvLT5zZW5zb3JfZnJhbWVyYXRlOwpAQCAtMTMyMyw3ICsxMzIzLDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCAxLCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgZmluYWxfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGZpbmFsX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCByb3dzID0gZ28tPmludGVybGFjZV9jb2RpbmcgPyBnby0+aGVpZ2h0IC8gMzIgOiBnby0+aGVpZ2h0IC8gMTY7CiAJdTE2IHBhY2tbXSA9IHsKQEAgLTEzODYsNyArMTM4Niw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgMSwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IGF1ZGlvX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBhdWRpb190b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgY2xvY2tfY29uZmlnID0gKChnby0+Ym9hcmRfaW5mby0+YXVkaW9fZmxhZ3MgJgogCQkJCUdPNzAwN19BVURJT19JMlNfTUFTVEVSID8gMSA6IDApIDw8IDExKSB8CkBAIC0xNDM2LDcgKzE0MzYsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDIsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBtb2RldF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgbW9kZXRfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IHJldCwgbWIsIGksIGFkZHIsIGNudCA9IDA7CiAJdTE2IHBhY2tbMzJdOwpAQCAtMTUwNSw3ICsxNTA1LDcgQEAKIAlyZXR1cm4gY250OwogfQogCi1zdGF0aWMgaW50IGRvX3NwZWNpYWwoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiB0eXBlLCB1MTYgKmNvZGUsIGludCBzcGFjZSwKK3N0YXRpYyBpbnQgZG9fc3BlY2lhbChzdHJ1Y3QgZ283MDA3ICpnbywgdTE2IHR5cGUsIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlLAogCQkJaW50ICpmcmFtZWxlbikKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTE1NTUsNyArMTU1NSw3IEBACiBpbnQgZ283MDA3X2NvbnN0cnVjdF9md19pbWFnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTggKipmdywgaW50ICpmd2xlbikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OwotCXUxNiAqY29kZSwgKnNyYzsKKwlfX2xlMTYgKmNvZGUsICpzcmM7CiAJaW50IGZyYW1lbGVuWzhdID0geyB9OyAvKiBob2xkcyB0aGUgbGVuZ3RocyBvZiBlbXB0eSBmcmFtZSB0ZW1wbGF0ZXMgKi8KIAlpbnQgY29kZXNwYWNlID0gNjQgKiAxMDI0LCBpID0gMCwgc3JjbGVuLCBjaHVua19sZW4sIGNodW5rX2ZsYWdzOwogCWludCBtb2RlX2ZsYWc7CkBAIC0xNTkwLDcgKzE1OTAsNyBAQAogCQlnb3RvIGZ3X2ZhaWxlZDsKIAl9CiAJbWVtc2V0KGNvZGUsIDAsIGNvZGVzcGFjZSAqIDIpOwotCXNyYyA9ICh1MTYgKilmd19lbnRyeS0+ZGF0YTsKKwlzcmMgPSAoX19sZTE2ICopZndfZW50cnktPmRhdGE7CiAJc3JjbGVuID0gZndfZW50cnktPnNpemUgLyAyOwogCXdoaWxlIChzcmNsZW4gPj0gMikgewogCQljaHVua19mbGFncyA9IF9fbGUxNl90b19jcHUoc3JjWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaAppbmRleCAwMDU1NDJkLi4zNzJmMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0xJRkVWSUVXX0xSMTkyCTIxIC8qIFRWIFdhbGtlciBVbHRyYSAqLwogI2RlZmluZSBHTzcwMDdfQk9BUkRJRF9FTkRVUkEJCTIyCiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0FETElOS19NUEcyNAkyMworI2RlZmluZSBHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwCTI0IC8qIFNlbnNvcmF5IDIyNTAvMjI1MSAqLwogCiAvKiBWYXJpb3VzIGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIGJvYXJkICovCiAjZGVmaW5lIEdPNzAwN19CT0FSRF9IQVNfQVVESU8JCSgxPDwwKQpAQCAtMTA0LDYgKzEwNSw3IEBACiAJaW50ICgqc3RyZWFtX3N0YXJ0KShzdHJ1Y3QgZ283MDA3ICpnbyk7CiAJaW50ICgqc3RyZWFtX3N0b3ApKHN0cnVjdCBnbzcwMDcgKmdvKTsKIAlpbnQgKCpzZW5kX2Zpcm13YXJlKShzdHJ1Y3QgZ283MDA3ICpnbywgdTggKmRhdGEsIGludCBsZW4pOworCWludCAoKnNlbmRfY29tbWFuZCkoc3RydWN0IGdvNzAwNyAqZ28sIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiB9OwogCiAvKiBUaGUgdmlkZW8gYnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFBBR0VfU0laRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwppbmRleCAzZjVlZTM0Li44M2VlYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJCS5pbnB1dHMgCSA9IHsKIAkJCXsKIAkJCQkudmlkZW9faW5wdXQJPSAxLAotCQkuYXVkaW9faW5wdXQJID0gVFZBVURJT19JTlBVVF9FWFRFUk4sCisJCQkJLmF1ZGlvX2lucHV0CT0gVFZBVURJT19JTlBVVF9FWFRFUk4sCiAJCQkJLm5hbWUJCT0gIkNvbXBvc2l0ZSIsCiAJCQl9LAogCQkJewpAQCAtMzk4LDYgKzM5OCw0MSBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IGdvNzAwN191c2JfYm9hcmQgYm9hcmRfc2Vuc29yYXlfMjI1MCA9IHsKKwkuZmxhZ3MJCT0gR083MDA3X1VTQl9FWlVTQiB8IEdPNzAwN19VU0JfRVpVU0JfSTJDLAorCS5tYWluX2luZm8JPSB7CisJCS5maXJtd2FyZQkgPSAiZ283MDA3dHYuYmluIiwKKwkJLmF1ZGlvX2ZsYWdzCSA9IEdPNzAwN19BVURJT19JMlNfTU9ERV8xIHwKKwkJCQkJR083MDA3X0FVRElPX0kyU19NQVNURVIgfAorCQkJCQlHTzcwMDdfQVVESU9fV09SRF8xNiwKKwkJLmZsYWdzCQkgPSBHTzcwMDdfQk9BUkRfSEFTX0FVRElPLAorCQkuYXVkaW9fcmF0ZQkgPSA0ODAwMCwKKwkJLmF1ZGlvX2JjbGtfZGl2CSA9IDgsCisJCS5hdWRpb19tYWluX2RpdgkgPSAyLAorCQkuaHBpX2J1ZmZlcl9jYXAgID0gNywKKwkJLnNlbnNvcl9mbGFncwkgPSBHTzcwMDdfU0VOU09SXzY1NiB8CisJCQkJCUdPNzAwN19TRU5TT1JfVFYsCisJCS5udW1faTJjX2RldnMJID0gMSwKKwkJLmkyY19kZXZzCSA9IHsKKwkJCXsKKwkJCQkuaWQJPSBJMkNfRFJJVkVSSURfUzIyNTAsCisJCQkJLmFkZHIJPSAweDM0LAorCQkJfSwKKwkJfSwKKwkJLm51bV9pbnB1dHMJID0gMiwKKwkJLmlucHV0cyAJID0geworCQkJeworCQkJCS52aWRlb19pbnB1dAk9IDAsCisJCQkJLm5hbWUJCT0gIkNvbXBvc2l0ZSIsCisJCQl9LAorCQkJeworCQkJCS52aWRlb19pbnB1dAk9IDEsCisJCQkJLm5hbWUJCT0gIlMtVmlkZW8iLAorCQkJfSwKKwkJfSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGdvNzAwN191c2JfaWRfdGFibGVbXSA9IHsKIAl7CiAJCS5tYXRjaF9mbGFncwk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX0FORF9WRVJTSU9OIHwKQEAgLTQ5MSw2ICs1MjYsMTQgQEAKIAkJLmJjZERldmljZV9oaQk9IDB4MSwKIAkJLmRyaXZlcl9pbmZvCT0gKGtlcm5lbF91bG9uZ190KUdPNzAwN19CT0FSRElEX0xJRkVWSUVXX0xSMTkyLAogCX0sCisJeworCQkubWF0Y2hfZmxhZ3MJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRV9BTkRfVkVSU0lPTiwKKwkJLmlkVmVuZG9yCT0gMHgxOTQzLCAgLyogVmVuZG9yIElEIFNlbnNvcmF5ICovCisJCS5pZFByb2R1Y3QJPSAweDIyNTAsICAvKiBQcm9kdWN0IElEIG9mIDIyNTAvMjI1MSAqLworCQkuYmNkRGV2aWNlX2xvCT0gMHgxLAorCQkuYmNkRGV2aWNlX2hpCT0gMHgxLAorCQkuZHJpdmVyX2luZm8JPSAoa2VybmVsX3Vsb25nX3QpR083MDA3X0JPQVJESURfU0VOU09SQVlfMjI1MCwKKwl9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTYzNyw5ICs2ODAsMTAgQEAKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IChzdHJ1Y3QgZ283MDA3ICopdXJiLT5jb250ZXh0OwogCXUxNiAqcmVncyA9ICh1MTYgKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlpZiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTiAmJgorCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyAhPSAtRVNIVVRET1dOICYmCiAJCQkJZ28tPnN0YXR1cyAhPSBTVEFUVVNfU0hVVERPV04pIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJnbzcwMDctdXNiOiBlcnJvciBpbiByZWFkIGludGVycnVwdDogJWRcbiIsCkBAIC02ODAsMTUgKzcyNCwxNCBAQAogc3RhdGljIHZvaWQgZ283MDA3X3VzYl9yZWFkX3ZpZGVvX3BpcGVfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7Ci0JaW50IHI7CisJaW50IHIsIHN0YXR1cyA9IHVyYi0+IHN0YXR1czsKIAogCWlmICghZ28tPnN0cmVhbWluZykgewogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmdvLT5mcmFtZV93YWl0cSk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnbzcwMDctdXNiOiBlcnJvciBpbiB2aWRlbyBwaXBlOiAlZFxuIiwKLQkJCQl1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIHZpZGVvIHBpcGU6ICVkXG4iLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7CkBAIC03MDQsMTMgKzc0NywxMiBAQAogc3RhdGljIHZvaWQgZ283MDA3X3VzYl9yZWFkX2F1ZGlvX3BpcGVfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7Ci0JaW50IHI7CisJaW50IHIsIHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCiAJaWYgKCFnby0+c3RyZWFtaW5nKQogCQlyZXR1cm47Ci0JaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnbzcwMDctdXNiOiBlcnJvciBpbiBhdWRpbyBwaXBlOiAlZFxuIiwKLQkJCQl1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIGF1ZGlvIHBpcGU6ICVkXG4iLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7CkBAIC03NTEsNyArNzkzLDcgQEAKIAlyZXR1cm4gMDsKIAogYXVkaW9fc3VibWl0X2ZhaWxlZDoKLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCiAJCXVzYl9raWxsX3VyYih1c2ItPmF1ZGlvX3VyYnNbaV0pOwogdmlkZW9fc3VibWl0X2ZhaWxlZDoKIAlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQpAQCAtOTY1LDE2ICsxMDA3LDIwIEBACiAJCW5hbWUgPSAiTGlmZXZpZXcgVFYgV2Fsa2VyIFVsdHJhIjsKIAkJYm9hcmQgPSAmYm9hcmRfbGlmZXZpZXdfbHIxOTI7CiAJCWJyZWFrOworCWNhc2UgR083MDA3X0JPQVJESURfU0VOU09SQVlfMjI1MDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2Vuc29yYXkgMjI1MCBmb3VuZFxuIik7CisJCW5hbWUgPSAiU2Vuc29yYXkgMjI1MC8yMjUxXG4iOworCQlib2FyZCA9ICZib2FyZF9zZW5zb3JheV8yMjUwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IHVua25vd24gYm9hcmQgSUQgJWQhXG4iLAogCQkJCSh1bnNpZ25lZCBpbnQpaWQtPmRyaXZlcl9pbmZvKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdXNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdvNzAwN191c2IpLCBHRlBfS0VSTkVMKTsKKwl1c2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ283MDA3X3VzYiksIEdGUF9LRVJORUwpOwogCWlmICh1c2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHVzYiwgMCwgc2l6ZW9mKHN0cnVjdCBnbzcwMDdfdXNiKSk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgVVJCIGFuZCBidWZmZXIgZm9yIHJlY2VpdmluZyBpbmNvbWluZyBpbnRlcnJ1cHRzICovCiAJdXNiLT5pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CkBAIC0xMTc5LDYgKzEyMjUsNyBAQAogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCXN0cnVjdCB1cmIgKnZ1cmIsICphdXJiOwogCWludCBpOwogCiAJZ28tPnN0YXR1cyA9IFNUQVRVU19TSFVURE9XTjsKQEAgLTExODYsMTUgKzEyMzMsMTkgQEAKIAogCS8qIEZyZWUgVVNCLXJlbGF0ZWQgc3RydWN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLQkJaWYgKHVzYi0+dmlkZW9fdXJic1tpXSAhPSBOVUxMKSB7Ci0JCQlpZiAodXNiLT52aWRlb191cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgIT0gTlVMTCkKLQkJCQlrZnJlZSh1c2ItPnZpZGVvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCQl1c2JfZnJlZV91cmIodXNiLT52aWRlb191cmJzW2ldKTsKKwkJdnVyYiA9IHVzYi0+dmlkZW9fdXJic1tpXTsKKwkJaWYgKHZ1cmIpIHsKKwkJCXVzYl9raWxsX3VyYih2dXJiKTsKKwkJCWlmICh2dXJiLT50cmFuc2Zlcl9idWZmZXIpCisJCQkJa2ZyZWUodnVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYl9mcmVlX3VyYih2dXJiKTsKIAkJfQotCQlpZiAodXNiLT5hdWRpb191cmJzW2ldICE9IE5VTEwpIHsKLQkJCWlmICh1c2ItPmF1ZGlvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciAhPSBOVUxMKQotCQkJCWtmcmVlKHVzYi0+YXVkaW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJCXVzYl9mcmVlX3VyYih1c2ItPmF1ZGlvX3VyYnNbaV0pOworCQlhdXJiID0gdXNiLT5hdWRpb191cmJzW2ldOworCQlpZiAoYXVyYikgeworCQkJdXNiX2tpbGxfdXJiKGF1cmIpOworCQkJaWYgKGF1cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCQlrZnJlZShhdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKGF1cmIpOwogCQl9CiAJfQogCWtmcmVlKHVzYi0+aW50cl91cmItPnRyYW5zZmVyX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKaW5kZXggOTRlMTE0MS4uNGY3MjM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYwpAQCAtMzgsNiArMzgsMTQgQEAKICNpbmNsdWRlICJnbzcwMDctcHJpdi5oIgogI2luY2x1ZGUgIndpcy1pMmMuaCIKIAorLyogVGVtcG9yYXJ5IGRlZmluZXMgdW50aWwgYWNjZXB0ZWQgaW4gdjRsLWR2YiAqLworI2lmbmRlZiBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNCisjZGVmaW5lCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0gICA2IC8qIE1QRUcgZWxlbWVudGFyeSBzdHJlYW0gKi8KKyNlbmRpZgorI2lmbmRlZiBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180CisjZGVmaW5lCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQgICAzCisjZW5kaWYKKwogc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9idWZmZXIoc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmKQogewogCWludCBpOwpAQCAtODEsNyArODksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdvNzAwN19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBnbzcwMDdfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwogCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maDsKQEAgLTk5LDcgKzEwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGdvNzAwN19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOwpAQCAtMzE5LDYgKzMyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAwCiBzdGF0aWMgaW50IGNsaXBfdG9fbW9kZXRfbWFwKHN0cnVjdCBnbzcwMDcgKmdvLCBpbnQgcmVnaW9uLAogCQlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwX2xpc3QpCiB7CkBAIC0zNzUsNDk5ICszODQsODAxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG1wZWdfcXVlcnljdHJsKHUzMiBpZCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsKQogewotCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbCA9IDA7CisJc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7CisJCVY0TDJfQ0lEX1VTRVJfQ0xBU1MsCisJCTAKKwl9OworCXN0YXRpYyBjb25zdCB1MzIgbXBlZ19jdHJsc1tdID0geworCQlWNEwyX0NJRF9NUEVHX0NMQVNTLAorCQlWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVCwKKwkJVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSwKKwkJVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRSwKKwkJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAorCQkwCisJfTsKKwlzdGF0aWMgY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXSA9IHsKKwkJdXNlcl9jdHJscywKKwkJbXBlZ19jdHJscywKKwkJTlVMTAorCX07CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOwotCi0JCW1lbXNldChjYXAsIDAsIHNpemVvZigqY2FwKSk7Ci0JCXN0cmNweShjYXAtPmRyaXZlciwgImdvNzAwNyIpOwotCQlzdHJuY3B5KGNhcC0+Y2FyZCwgZ28tPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQkJY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgOSwgOCk7Ci0JCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJVjRMMl9DQVBfU1RSRUFNSU5HOyAvKiB8IFY0TDJfQ0FQX0FVRElPOyAqLwotCQlpZiAoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikKLQkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCS8qIFRoZSBjdHJsIG1heSBhbHJlYWR5IGNvbnRhaW4gdGhlIHF1ZXJpZWQgaTJjIGNvbnRyb2xzLAorCSAqIHF1ZXJ5IHRoZSBtcGVnIGNvbnRyb2xzIGlmIHRoZSBleGlzdGluZyBjdHJsIGlkIGlzCisJICogZ3JlYXRlciB0aGFuIHRoZSBuZXh0IG1wZWcgY3RybCBpZC4KKwkgKi8KKwlpZCA9IHY0bDJfY3RybF9uZXh0KGN0cmxfY2xhc3NlcywgaWQpOworCWlmIChpZCA+PSBjdHJsLT5pZCAmJiBjdHJsLT5uYW1lWzBdKQogCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfRU5VTV9GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQkJY2hhciAqZGVzYzsKLQkJdTMyIHBpeGVsZm9ybWF0OwogCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN3aXRjaCAoZm10LT5pbmRleCkgewotCQljYXNlIDA6Ci0JCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKLQkJCWRlc2MgPSAiTW90aW9uLUpQRUciOworCW1lbXNldChjdHJsLCAwLCBzaXplb2YoKmN0cmwpKTsKKwljdHJsLT5pZCA9IGlkOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoY3RybCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZELAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0sIDEsCisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQsIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5LCAxLAorCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKGN0cmwpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQk2NDAwMCwKKwkJCQkxMDAwMDAwMCwgMSwKKwkJCQk5ODAwMDAwKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbXBlZ19zX2NvbnRyb2woc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCwgc3RydWN0IGdvNzAwNyAqZ28pCit7CisJLyogcHJldHR5IHN1cmUgd2UgY2FuJ3QgY2hhbmdlIGFueSBvZiB0aGVzZSB3aGlsZSBzdHJlYW1pbmcgKi8KKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzI7CisJCQlnby0+Yml0cmF0ZSA9IDk4MDAwMDA7CisJCQlnby0+Z29wX3NpemUgPSAxNTsKKwkJCWdvLT5wYWxpID0gMHg0ODsKKwkJCWdvLT5jbG9zZWRfZ29wID0gMTsKKwkJCWdvLT5yZXBlYXRfc2VxaGVhZCA9IDA7CisJCQlnby0+c2VxX2hlYWRlcl9lbmFibGUgPSAxOworCQkJZ28tPmdvcF9oZWFkZXJfZW5hYmxlID0gMTsKKwkJCWdvLT5kdmRfbW9kZSA9IDE7CiAJCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKLQkJCWRlc2MgPSAiTVBFRzEvTVBFRzIvTVBFRzQiOworCQljYXNlIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU06CisJCQkvKiB0b2RvOiAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpbmRleCA9IGZtdC0+aW5kZXg7Ci0JCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7Ci0JCWZtdC0+aW5kZXggPSBpbmRleDsKLQkJZm10LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlmbXQtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOwotCQlzdHJuY3B5KGZtdC0+ZGVzY3JpcHRpb24sIGRlc2MsIHNpemVvZihmbXQtPmRlc2NyaXB0aW9uKSk7Ci0JCWZtdC0+cGl4ZWxmb3JtYXQgPSBwaXhlbGZvcm1hdDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfVFJZX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOwotCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzE7CisJCQlnby0+cGFsaSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yOgorCQkJZ28tPmZvcm1hdCA9IEdPNzAwN19GT1JNQVRfTVBFRzI7CisJCQkvKmlmIChtcGVnLT5wYWxpID4+IDI0ID09IDIpCisJCQkJZ28tPnBhbGkgPSBtcGVnLT5wYWxpICYgMHhmZjsKKwkJCWVsc2UqLworCQkJCWdvLT5wYWxpID0gMHg0ODsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQ6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHNDsKKwkJCS8qaWYgKG1wZWctPnBhbGkgPj4gMjQgPT0gNCkKKwkJCQlnby0+cGFsaSA9IG1wZWctPnBhbGkgJiAweGZmOworCQkJZWxzZSovCisJCQkJZ28tPnBhbGkgPSAweGY1OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMSk7Ci0JfQotCWNhc2UgVklESU9DX0dfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCX0KKwkJZ28tPmdvcF9oZWFkZXJfZW5hYmxlID0KKwkJCS8qbXBlZy0+ZmxhZ3MgJiBHTzcwMDdfTVBFR19PTUlUX0dPUF9IRUFERVIKKwkJCT8gMCA6Ki8gMTsKKwkJLyppZiAobXBlZy0+ZmxhZ3MgJiBHTzcwMDdfTVBFR19SRVBFQVRfU0VRSEVBREVSKQorCQkJZ28tPnJlcGVhdF9zZXFoZWFkID0gMTsKKwkJZWxzZSovCisJCQlnby0+cmVwZWF0X3NlcWhlYWQgPSAwOworCQlnby0+ZHZkX21vZGUgPSAwOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlpZiAoZ28tPmZvcm1hdCA9PSBHTzcwMDdfRk9STUFUX01KUEVHKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7Ci0JCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJZm10LT5mbXQucGl4LndpZHRoID0gZ28tPndpZHRoOwotCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0gZ28tPmhlaWdodDsKLQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gZ28tPmZvcm1hdCA9PSBHTzcwMDdfRk9STUFUX01KUEVHID8KLQkJCVY0TDJfUElYX0ZNVF9NSlBFRyA6IFY0TDJfUElYX0ZNVF9NUEVHOwotCQlmbXQtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JCWZtdC0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSAwOwotCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gR083MDA3X0JVRl9TSVpFOwotCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07IC8qID8/ICovCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOwotCi0JCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlzd2l0Y2ggKGN0cmwtPnZhbHVlKSB7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDE6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzFfMTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOgorCQkJZ28tPmFzcGVjdF9yYXRpbyA9IEdPNzAwN19SQVRJT180XzM7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDk6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzE2Xzk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzIyMXgxMDA6CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAwKTsKLQl9Ci0JY2FzZSBWSURJT0NfR19GQlVGOgotCWNhc2UgVklESU9DX1NfRkJVRjoKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CisJCWdvLT5nb3Bfc2l6ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCWlmIChjdHJsLT52YWx1ZSAhPSAwICYmIGN0cmwtPnZhbHVlICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ28tPmNsb3NlZF9nb3AgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCS8qIFVwcGVyIGJvdW5kIGlzIGtpbmQgb2YgYXJiaXRyYXJ5IGhlcmUgKi8KKwkJaWYgKGN0cmwtPnZhbHVlIDwgNjQwMDAgfHwgY3RybC0+dmFsdWUgPiAxMDAwMDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnby0+Yml0cmF0ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIFZJRElPQ19SRVFCVUZTOgotCXsKLQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGNvdW50LCBpOworCX0KKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWlmIChyZXEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8Ci0JCQkJcmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKK3N0YXRpYyBpbnQgbXBlZ19nX2NvbnRyb2woc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCwgc3RydWN0IGdvNzAwNyAqZ28pCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJaWYgKGdvLT5kdmRfbW9kZSkKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX0RWRDsKKwkJZWxzZQorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXN3aXRjaCAoZ28tPmZvcm1hdCkgeworCQljYXNlIEdPNzAwN19GT1JNQVRfTVBFRzE6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzE7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfRk9STUFUX01QRUcyOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yOworCQkJYnJlYWs7CisJCWNhc2UgR083MDA3X0ZPUk1BVF9NUEVHNDoKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJc3dpdGNoIChnby0+YXNwZWN0X3JhdGlvKSB7CisJCWNhc2UgR083MDA3X1JBVElPXzFfMToKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDE7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfUkFUSU9fNF8zOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MzsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19SQVRJT18xNl85OgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJY3RybC0+dmFsdWUgPSBnby0+Z29wX3NpemU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwkJY3RybC0+dmFsdWUgPSBnby0+Y2xvc2VkX2dvcDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCWN0cmwtPnZhbHVlID0gZ28tPmJpdHJhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCi0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCWZvciAoaSA9IDA7IGkgPCBnb2ZoLT5idWZfY291bnQ7ICsraSkKLQkJCWlmIChnb2ZoLT5idWZzW2ldLm1hcHBlZCA+IDApCi0JCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJZG93bigmZ28tPmh3X2xvY2spOwotCQlpZiAoZ28tPmluX3VzZSA+IDAgJiYgZ29maC0+YnVmX2NvdW50ID09IDApIHsKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJnbzcwMDciLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgZ28tPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKyNpZiAwCisJc3RybGNweShjYXAtPmJ1c19pbmZvLCBkZXZfbmFtZSgmZGV2LT51ZGV2LT5kZXYpLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOworI2VuZGlmCisKKwljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCA5LCA4KTsKKworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkgICAgVjRMMl9DQVBfU1RSRUFNSU5HOyAvKiB8IFY0TDJfQ0FQX0FVRElPOyAqLworCisJaWYgKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpCisJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJY2hhciAqZGVzYyA9IE5VTEw7CisKKwlzd2l0Y2ggKGZtdC0+aW5kZXgpIHsKKwljYXNlIDA6CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTUpQRUc7CisJCWRlc2MgPSAiTW90aW9uLUpQRUciOworCQlicmVhazsKKwljYXNlIDE6CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJZGVzYyA9ICJNUEVHMS9NUEVHMi9NUEVHNCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZm10LT5mbGFncyA9IFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRDsKKworCXN0cm5jcHkoZm10LT5kZXNjcmlwdGlvbiwgZGVzYywgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZm10LT5mbXQucGl4LndpZHRoID0gZ28tPndpZHRoOworCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBnby0+aGVpZ2h0OworCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcpID8KKwkJCQkgICBWNEwyX1BJWF9GTVRfTUpQRUcgOiBWNEwyX1BJWF9GTVRfTVBFRzsKKwlmbXQtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7CisJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9IEdPNzAwN19CVUZfU0laRTsKKwlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBzZXRfY2FwdHVyZV9zaXplKGdvLCBmbXQsIDApOworfQorCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlpbnQgcmV0dmFsID0gLUVCVVNZOworCXVuc2lnbmVkIGludCBjb3VudCwgaTsKKworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHJlcS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJCXJlcS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmZ29maC0+bG9jayk7CisJZm9yIChpID0gMDsgaSA8IGdvZmgtPmJ1Zl9jb3VudDsgKytpKQorCQlpZiAoZ29maC0+YnVmc1tpXS5tYXBwZWQgPiAwKQorCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCWRvd24oJmdvLT5od19sb2NrKTsKKwlpZiAoZ28tPmluX3VzZSA+IDAgJiYgZ29maC0+YnVmX2NvdW50ID09IDApIHsKKwkJdXAoJmdvLT5od19sb2NrKTsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwlpZiAoZ29maC0+YnVmX2NvdW50ID4gMCkKKwkJa2ZyZWUoZ29maC0+YnVmcyk7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCWNvdW50ID0gcmVxLT5jb3VudDsKKwlpZiAoY291bnQgPiAwKSB7CisJCWlmIChjb3VudCA8IDIpCisJCQljb3VudCA9IDI7CisJCWlmIChjb3VudCA+IDMyKQorCQkJY291bnQgPSAzMjsKKworCQlnb2ZoLT5idWZzID0ga21hbGxvYyhjb3VudCAqIHNpemVvZihzdHJ1Y3QgZ283MDA3X2J1ZmZlciksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWdvZmgtPmJ1ZnMpIHsKIAkJCXVwKCZnby0+aHdfbG9jayk7CiAJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCQl9Ci0JCWlmIChnb2ZoLT5idWZfY291bnQgPiAwKQotCQkJa2ZyZWUoZ29maC0+YnVmcyk7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWNvdW50ID0gcmVxLT5jb3VudDsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKGNvdW50IDwgMikKLQkJCQljb3VudCA9IDI7Ci0JCQlpZiAoY291bnQgPiAzMikKLQkJCQljb3VudCA9IDMyOwotCQkJZ29maC0+YnVmcyA9IGttYWxsb2MoY291bnQgKgotCQkJCQkJc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZ29maC0+YnVmcyA9PSBOVUxMKSB7Ci0JCQkJdXAoJmdvLT5od19sb2NrKTsKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkJfQotCQkJbWVtc2V0KGdvZmgtPmJ1ZnMsIDAsCi0JCQkJCWNvdW50ICogc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJCWdvZmgtPmJ1ZnNbaV0uZ28gPSBnbzsKLQkJCQlnb2ZoLT5idWZzW2ldLmluZGV4ID0gaTsKLQkJCQlnb2ZoLT5idWZzW2ldLnN0YXRlID0gQlVGX1NUQVRFX0lETEU7Ci0JCQkJZ29maC0+YnVmc1tpXS5tYXBwZWQgPSAwOwotCQkJfQotCQkJZ28tPmluX3VzZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlnby0+aW5fdXNlID0gMDsKKworCQltZW1zZXQoZ29maC0+YnVmcywgMCwgY291bnQgKiBzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQkJZ29maC0+YnVmc1tpXS5nbyA9IGdvOworCQkJZ29maC0+YnVmc1tpXS5pbmRleCA9IGk7CisJCQlnb2ZoLT5idWZzW2ldLnN0YXRlID0gQlVGX1NUQVRFX0lETEU7CisJCQlnb2ZoLT5idWZzW2ldLm1hcHBlZCA9IDA7CiAJCX0KLQkJZ29maC0+YnVmX2NvdW50ID0gY291bnQ7Ci0JCXVwKCZnby0+aHdfbG9jayk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKLQkJcmVxLT5jb3VudCA9IGNvdW50OwotCQlyZXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCXJlcS0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQkJcmV0dXJuIDA7CisKKwkJZ28tPmluX3VzZSA9IDE7CisJfSBlbHNlIHsKKwkJZ28tPmluX3VzZSA9IDA7CiAJfQotCWNhc2UgVklESU9DX1FVRVJZQlVGOgotCXsKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKIAotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpbmRleCA9IGJ1Zi0+aW5kZXg7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlpZiAoaW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKLQkJYnVmLT5pbmRleCA9IGluZGV4OwotCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCXN3aXRjaCAoZ29maC0+YnVmc1tpbmRleF0uc3RhdGUpIHsKLQkJY2FzZSBCVUZfU1RBVEVfUVVFVUVEOgotCQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlVGX1NUQVRFX0RPTkU6Ci0JCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19ET05FOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYtPmZsYWdzID0gMDsKLQkJfQotCQlpZiAoZ29maC0+YnVmc1tpbmRleF0ubWFwcGVkKQotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKLQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7Ci0JCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOwotCQl1cCgmZ29maC0+bG9jayk7CisJZ29maC0+YnVmX2NvdW50ID0gY291bnQ7CisJdXAoJmdvLT5od19sb2NrKTsKKwl1cCgmZ29maC0+bG9jayk7CiAKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1FCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOwotCQlpbnQgcmV0OworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJCQlidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlnb2J1ZiA9ICZnb2ZoLT5idWZzW2J1Zi0+aW5kZXhdOwotCQlpZiAoZ29idWYtPm1hcHBlZCA9PSAwKQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJcmV0dmFsID0gLUVCVVNZOwotCQlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9JRExFKQotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJLyogb2Zmc2V0IHdpbGwgYmUgMCB1bnRpbCB3ZSByZWFsbHkgc3VwcG9ydCBVU0VSUFRSIHN0cmVhbWluZyAqLwotCQlnb2J1Zi0+b2Zmc2V0ID0gZ29idWYtPnVzZXJfYWRkciAmIH5QQUdFX01BU0s7Ci0JCWdvYnVmLT5ieXRlc3VzZWQgPSAwOwotCQlnb2J1Zi0+ZnJhbWVfb2Zmc2V0ID0gMDsKLQkJZ29idWYtPm1vZGV0X2FjdGl2ZSA9IDA7Ci0JCWlmIChnb2J1Zi0+b2Zmc2V0ID4gMCkKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUyArIDE7Ci0JCWVsc2UKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUzsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKLQkJCQlnb2J1Zi0+dXNlcl9hZGRyICYgUEFHRV9NQVNLLCBnb2J1Zi0+cGFnZV9jb3VudCwKLQkJCQkxLCAxLCBnb2J1Zi0+cGFnZXMsIE5VTEwpOwotCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlpZiAocmV0ICE9IGdvYnVmLT5wYWdlX2NvdW50KSB7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCByZXQ7ICsraSkKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZ29idWYtPnBhZ2VzW2ldKTsKLQkJCWdvYnVmLT5wYWdlX2NvdW50ID0gMDsKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQkJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX1FVRVVFRDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZnb2J1Zi0+c3RyZWFtLCAmZ28tPnN0cmVhbSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOwotCQl1cCgmZ29maC0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19EUUJVRjoKLQl7Ci0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7Ci0JCXUzMiBmcmFtZV90eXBlX2ZsYWc7Ci0JCURFRklORV9XQUlUKHdhaXQpOworCXJlcS0+Y291bnQgPSBjb3VudDsKKwlyZXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJcmVxLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCi0JCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWRvd24oJmdvZmgtPmxvY2spOwotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAobGlzdF9lbXB0eSgmZ28tPnN0cmVhbSkpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlnb2J1ZiA9IGxpc3RfZW50cnkoZ28tPnN0cmVhbS5uZXh0LAotCQkJCXN0cnVjdCBnbzcwMDdfYnVmZmVyLCBzdHJlYW0pOwotCQlyZXR2YWwgPSAtRUFHQUlOOwotCQlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FICYmCi0JCQkJIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQkJCWZvciAoOzspIHsKLQkJCQlwcmVwYXJlX3RvX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQsCi0JCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCWlmIChnb2J1Zi0+c3RhdGUgPT0gQlVGX1NUQVRFX0RPTkUpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzY2hlZHVsZSgpOwotCQkJfQotCQkJZmluaXNoX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQpOwotCQl9Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWRlYWN0aXZhdGVfYnVmZmVyKGdvYnVmKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWZyYW1lX3R5cGVfZmxhZyA9IGdldF9mcmFtZV90eXBlX2ZsYWcoZ29idWYsIGdvLT5mb3JtYXQpOwotCQlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKLQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKLQkJYnVmLT5pbmRleCA9IGdvYnVmLT5pbmRleDsKLQkJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlidWYtPmJ5dGVzdXNlZCA9IGdvYnVmLT5ieXRlc3VzZWQ7Ci0JCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IGZyYW1lX3R5cGVfZmxhZzsKLQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQkJYnVmLT50aW1lc3RhbXAgPSBnb2J1Zi0+dGltZXN0YW1wOwotCQlidWYtPnNlcXVlbmNlID0gZ29idWYtPnNlcTsKLQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlidWYtPm0ub2Zmc2V0ID0gZ29idWYtPmluZGV4ICogR083MDA3X0JVRl9TSVpFOwotCQlidWYtPmxlbmd0aCA9IEdPNzAwN19CVUZfU0laRTsKLQkJYnVmLT5yZXNlcnZlZCA9IGdvYnVmLT5tb2RldF9hY3RpdmU7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NUUkVBTU9OOgotCXsKLQkJdW5zaWduZWQgaW50ICp0eXBlID0gYXJnOworCXJldHVybiAwOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWRvd24oJmdvLT5od19sb2NrKTsKLQkJaWYgKCFnby0+c3RyZWFtaW5nKSB7Ci0JCQlnby0+c3RyZWFtaW5nID0gMTsKLQkJCWdvLT5uZXh0X3NlcSA9IDA7Ci0JCQlnby0+YWN0aXZlX2J1ZiA9IE5VTEw7Ci0JCQlpZiAoZ283MDA3X3N0YXJ0X2VuY29kZXIoZ28pIDwgMCkKLQkJCQlyZXR2YWwgPSAtRUlPOwotCQkJZWxzZQotCQkJCXJldHZhbCA9IDA7Ci0JCX0KLQkJdXAoJmdvLT5od19sb2NrKTsKLQkJdXAoJmdvZmgtPmxvY2spOwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgotCXsKLQkJdW5zaWduZWQgaW50ICp0eXBlID0gYXJnOwogCi0JCWlmICgqdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWdvNzAwN19zdHJlYW1vZmYoZ28pOwotCQl1cCgmZ29maC0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JewotCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7Ci0JCXUzMiBpZDsKKwlpbmRleCA9IGJ1Zi0+aW5kZXg7CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCWlkID0gY3RybC0+aWQ7Ci0JCW1lbXNldChjdHJsLCAwLCBzaXplb2YoKmN0cmwpKTsKLQkJY3RybC0+aWQgPSBpZDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCBhcmcpOwotCQlyZXR1cm4gY3RybC0+bmFtZVswXSA9PSAwID8gLUVJTlZBTCA6IDA7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAoaW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCi0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKLQkJcXVlcnkuaWQgPSBjdHJsLT5pZDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnkpOwotCQlpZiAocXVlcnkubmFtZVswXSA9PSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfQ1RSTCwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCWJ1Zi0+aW5kZXggPSBpbmRleDsKKwlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOwotCQlxdWVyeS5pZCA9IGN0cmwtPmlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7Ci0JCWlmIChxdWVyeS5uYW1lWzBdID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19DVFJMLCBhcmcpOwotCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGdvZmgtPmJ1ZnNbaW5kZXhdLnN0YXRlKSB7CisJY2FzZSBCVUZfU1RBVEVfUVVFVUVEOgorCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCWJyZWFrOworCWNhc2UgQlVGX1NUQVRFX0RPTkU6CisJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ1Zi0+ZmxhZ3MgPSAwOwogCX0KLQljYXNlIFZJRElPQ19HX1BBUk06Ci0JewotCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtID0gYXJnOwotCQlzdHJ1Y3QgdjRsMl9mcmFjdCB0aW1lcGVyZnJhbWUgPSB7Ci0JCQkubnVtZXJhdG9yID0gMTAwMSAqICBnby0+ZnBzX3NjYWxlLAotCQkJLmRlbm9taW5hdG9yID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUsCi0JCX07CiAKLQkJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChwYXJtLCAwLCBzaXplb2YoKnBhcm0pKTsKLQkJcGFybS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJcGFybS0+cGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgfD0gVjRMMl9DQVBfVElNRVBFUkZSQU1FOwotCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gdGltZXBlcmZyYW1lOwotCQlyZXR1cm4gMDsKKwlpZiAoZ29maC0+YnVmc1tpbmRleF0ubWFwcGVkKQorCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7CisJdXAoJmdvZmgtPmxvY2spOworCisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisJaW50IHJldDsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisJCQlidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQlyZXR1cm4gcmV0dmFsOworCisJZG93bigmZ29maC0+bG9jayk7CisJaWYgKGJ1Zi0+aW5kZXggPCAwIHx8IGJ1Zi0+aW5kZXggPj0gZ29maC0+YnVmX2NvdW50KQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJZ29idWYgPSAmZ29maC0+YnVmc1tidWYtPmluZGV4XTsKKwlpZiAoIWdvYnVmLT5tYXBwZWQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisKKwlyZXR2YWwgPSAtRUJVU1k7CisJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfSURMRSkKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCS8qIG9mZnNldCB3aWxsIGJlIDAgdW50aWwgd2UgcmVhbGx5IHN1cHBvcnQgVVNFUlBUUiBzdHJlYW1pbmcgKi8KKwlnb2J1Zi0+b2Zmc2V0ID0gZ29idWYtPnVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJZ29idWYtPmJ5dGVzdXNlZCA9IDA7CisJZ29idWYtPmZyYW1lX29mZnNldCA9IDA7CisJZ29idWYtPm1vZGV0X2FjdGl2ZSA9IDA7CisJaWYgKGdvYnVmLT5vZmZzZXQgPiAwKQorCQlnb2J1Zi0+cGFnZV9jb3VudCA9IEdPNzAwN19CVUZfUEFHRVMgKyAxOworCWVsc2UKKwkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTOworCisJcmV0dmFsID0gLUVOT01FTTsKKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sCisJCQlnb2J1Zi0+dXNlcl9hZGRyICYgUEFHRV9NQVNLLCBnb2J1Zi0+cGFnZV9jb3VudCwKKwkJCTEsIDEsIGdvYnVmLT5wYWdlcywgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChyZXQgIT0gZ29idWYtPnBhZ2VfY291bnQpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCByZXQ7ICsraSkKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShnb2J1Zi0+cGFnZXNbaV0pOworCQlnb2J1Zi0+cGFnZV9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAJfQotCWNhc2UgVklESU9DX1NfUEFSTToKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0gPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBuLCBkOwogCi0JCWlmIChwYXJtLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAocGFybS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbiA9IGdvLT5zZW5zb3JfZnJhbWVyYXRlICoKLQkJCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yOwotCQlkID0gMTAwMSAqIHBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7Ci0JCWlmIChuICE9IDAgJiYgZCAhPSAwICYmIG4gPiBkKQotCQkJZ28tPmZwc19zY2FsZSA9IChuICsgZC8yKSAvIGQ7Ci0JCWVsc2UKLQkJCWdvLT5mcHNfc2NhbGUgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpzdGQgPSBhcmc7CisJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX1FVRVVFRDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZ29idWYtPnN0cmVhbSwgJmdvLT5zdHJlYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOworCXVwKCZnb2ZoLT5sb2NrKTsKIAotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgewotCQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJCXJldHVybiAtRUlPOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkJVklESU9DX0VOVU1TVEQsIGFyZyk7Ci0JCQlpZiAoIXN0ZC0+aWQpIC8qIGhhY2sgdG8gaW5kaWNhdGUgRUlOVkFMIGZyb20gdHVuZXIgKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIGlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgewotCQkJc3dpdGNoIChzdGQtPmluZGV4KSB7Ci0JCQljYXNlIDA6Ci0JCQkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHN0ZCwKLQkJCQkJCVY0TDJfU1REX05UU0MsICJOVFNDIik7CisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IGdvNzAwN19idWZmZXIgKmdvYnVmOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGZyYW1lX3R5cGVfZmxhZzsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gcmV0dmFsOworCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQlyZXR1cm4gcmV0dmFsOworCisJZG93bigmZ29maC0+bG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmdvLT5zdHJlYW0pKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCWdvYnVmID0gbGlzdF9lbnRyeShnby0+c3RyZWFtLm5leHQsCisJCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciwgc3RyZWFtKTsKKworCXJldHZhbCA9IC1FQUdBSU47CisJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRE9ORSAmJgorCQkJIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwkJZm9yICg7OykgeworCQkJcHJlcGFyZV90b193YWl0KCZnby0+ZnJhbWVfd2FpdHEsICZ3YWl0LAorCQkJCQlUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKGdvYnVmLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRE9ORSkKIAkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RkLAotCQkJCQkJVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0sCi0JCQkJCQkiUEFML1NFQ0FNIik7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN0ZC0+aW5kZXggIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCW1lbXNldChzdGQsIDAsIHNpemVvZigqc3RkKSk7Ci0JCQlzbnByaW50ZihzdGQtPm5hbWUsIHNpemVvZihzdGQtPm5hbWUpLCAiJWR4JWQsICVkZnBzIiwKLQkJCQlnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoLAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0LAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZnJhbWVyYXRlIC8gMTAwMCk7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7Ci0JCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0KLQkJCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGU7CisJCQlzY2hlZHVsZSgpOwogCQl9Ci0JCXJldHVybiAwOworCQlmaW5pc2hfd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCk7CiAJfQotCWNhc2UgVklESU9DX0dfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwogCi0JCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKLQkJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7Ci0JCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCQlWSURJT0NfR19TVEQsIGFyZyk7Ci0JCX0gZWxzZSBpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpIHsKLQkJCWlmIChnby0+c3RhbmRhcmQgPT0gR083MDA3X1NURF9OVFNDKQotCQkJCSpzdGQgPSBWNEwyX1NURF9OVFNDOwotCQkJZWxzZQotCQkJCSpzdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTTsKLQkJfSBlbHNlCi0JCQkqc3RkID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfU1REOgotCXsKLQkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJZGVhY3RpdmF0ZV9idWZmZXIoZ29idWYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdvLT5zcGlubG9jaywgZmxhZ3MpOworCWZyYW1lX3R5cGVfZmxhZyA9IGdldF9mcmFtZV90eXBlX2ZsYWcoZ29idWYsIGdvLT5mb3JtYXQpOworCWdvYnVmLT5zdGF0ZSA9IEJVRl9TVEFURV9JRExFOwogCi0JCWlmIChnby0+c3RyZWFtaW5nKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKCEoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpICYmCi0JCQkJKnN0ZCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICgqc3RkID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKLQkJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKLQkJCQkJCVZJRElPQ19TX1NURCwgYXJnKTsKLQkJCWlmICghKnN0ZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLwotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICgqc3RkICYgVjRMMl9TVERfTlRTQykgewotCQkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9OVFNDOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAzMDAwMDsKLQkJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfUEFMKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX1BBTDsKLQkJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7Ci0JCX0gZWxzZSBpZiAoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX1BBTDsKLQkJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkgICAgVklESU9DX1NfU1RELCBzdGQpOwotCQlzZXRfY2FwdHVyZV9zaXplKGdvLCBOVUxMLCAwKTsKLQkJcmV0dXJuIDA7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKwlidWYtPmluZGV4ID0gZ29idWYtPmluZGV4OworCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlidWYtPmJ5dGVzdXNlZCA9IGdvYnVmLT5ieXRlc3VzZWQ7CisJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgZnJhbWVfdHlwZV9mbGFnOworCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJYnVmLT50aW1lc3RhbXAgPSBnb2J1Zi0+dGltZXN0YW1wOworCWJ1Zi0+c2VxdWVuY2UgPSBnb2J1Zi0+c2VxOworCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwlidWYtPm0ub2Zmc2V0ID0gZ29idWYtPmluZGV4ICogR083MDA3X0JVRl9TSVpFOworCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOworCWJ1Zi0+cmVzZXJ2ZWQgPSBnb2J1Zi0+bW9kZXRfYWN0aXZlOworCisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiAwOworCit1bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlkb3duKCZnby0+aHdfbG9jayk7CisKKwlpZiAoIWdvLT5zdHJlYW1pbmcpIHsKKwkJZ28tPnN0cmVhbWluZyA9IDE7CisJCWdvLT5uZXh0X3NlcSA9IDA7CisJCWdvLT5hY3RpdmVfYnVmID0gTlVMTDsKKwkJaWYgKGdvNzAwN19zdGFydF9lbmNvZGVyKGdvKSA8IDApCisJCQlyZXR2YWwgPSAtRUlPOworCQllbHNlCisJCQlyZXR2YWwgPSAwOwogCX0KKwl1cCgmZ28tPmh3X2xvY2spOworCXVwKCZnb2ZoLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlnbzcwMDdfc3RyZWFtb2ZmKGdvKTsKKwl1cCgmZ29maC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxdWVyeSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCXJldHVybiAtRUlPOworCisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCBxdWVyeSk7CisKKwlyZXR1cm4gKCFxdWVyeS0+bmFtZVswXSkgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKKwlxdWVyeS5pZCA9IGN0cmwtPmlkOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKKwlpZiAocXVlcnkubmFtZVswXSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX0NUUkwsIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcXVlcnk7CisKKwlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCXJldHVybiAtRUlPOworCisJbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7CisJcXVlcnkuaWQgPSBjdHJsLT5pZDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7CisJaWYgKHF1ZXJ5Lm5hbWVbMF0gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19DVFJMLCBjdHJsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0pCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX2ZyYWN0IHRpbWVwZXJmcmFtZSA9IHsKKwkJLm51bWVyYXRvciA9IDEwMDEgKiAgZ28tPmZwc19zY2FsZSwKKwkJLmRlbm9taW5hdG9yID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUsCisJfTsKKworCWlmIChwYXJtLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJtLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSB8PSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZSA9IHRpbWVwZXJmcmFtZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0pCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXVuc2lnbmVkIGludCBuLCBkOworCisJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGFybS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbiA9IGdvLT5zZW5zb3JfZnJhbWVyYXRlICoKKwkJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7CisJZCA9IDEwMDEgKiBwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworCWlmIChuICE9IDAgJiYgZCAhPSAwICYmIG4gPiBkKQorCQlnby0+ZnBzX3NjYWxlID0gKG4gKyBkLzIpIC8gZDsKKwllbHNlCisJCWdvLT5mcHNfc2NhbGUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFZJRElPQ19FTlVNU1REIG9uIGdvNzAwNyB3ZXJlIHVzZWQgZm9yIGVudW1iZXJhdGluZyB0aGUgc3VwcG9ydGVkIGZwcyBhbmQKKyAgIGl0cyByZXNvbHV0aW9uLCB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBUVi4KKyAgIFRoaXMgd2VyZSBhbiBBUEkgYWJ1c2UsIHByb2JhYmx5IHVzZWQgYnkgdGhlIGxhY2sgb2Ygc3BlY2lmaWMgSU9DVEwncyB0bworICAgZW51bWJlcmF0ZSBpdCwgYnkgdGhlIHRpbWUgdGhlIGRyaXZlciB3ZXJlIHdyaXR0ZW4uCisKKyAgIEhvd2V2ZXIsIHNpbmNlIGtlcm5lbCAyLjYuMTksIHR3byBuZXcgaW9jdGxzIChWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUworICAgYW5kIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMpIHdlcmUgYWRkZWQgZm9yIHRoaXMgcHVycG9zZS4KKworICAgVGhlIHR3byBmdW5jdGlvbnMgYmVsbG93IGltcGxlbWVudHMgdGhlIG5ld2VyIGlvY3RscworKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJCQkgIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwkvKiBSZXR1cm4gLUVJTlZBTCwgaWYgaXQgaXMgYSBUViBib2FyZCAqLworCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgfHwKKwkgICAgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZnNpemUtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc2l6ZS0+dHlwZSA9IFY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFOworCWZzaXplLT5kaXNjcmV0ZS53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJZnNpemUtPmRpc2NyZXRlLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCQkJICAgICAgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmZpdmFsKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCS8qIFJldHVybiAtRUlOVkFMLCBpZiBpdCBpcyBhIFRWIGJvYXJkICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSB8fAorCSAgICAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmaXZhbC0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpdmFsLT50eXBlID0gVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEU7CisJZml2YWwtPmRpc2NyZXRlLm51bWVyYXRvciA9IDEwMDE7CisJZml2YWwtPmRpc2NyZXRlLmRlbm9taW5hdG9yID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgJiYKKwkJCSpzdGQgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKnN0ZCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKKwkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKKwkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQkJcmV0dXJuIC1FSU87CisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKKwkJCQkJVklESU9DX1NfU1RELCBzdGQpOworCQlpZiAoISpzdGQpIC8qIGhhY2sgdG8gaW5kaWNhdGUgRUlOVkFMIGZyb20gdHVuZXIgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgqc3RkICYgVjRMMl9TVERfTlRTQykgeworCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX05UU0M7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMzAwMDA7CisJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfUEFMKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOworCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDI1MDI1OworCX0gZWxzZSBpZiAoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOworCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDI1MDI1OworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCisJCQkJCVZJRElPQ19TX1NURCwgc3RkKTsKKwlzZXRfY2FwdHVyZV9zaXplKGdvLCBOVUxMLCAwKTsKKworCXJldHVybiAwOworfQorCisjaWYgMAogCWNhc2UgVklESU9DX1FVRVJZU1REOgogCXsKIAkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKQEAgLTg4NCwyMTkgKzExOTUsMjY5IEBACiAJCQkqc3RkID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2lucHV0ICppbnAgPSBhcmc7Ci0JCWludCBpbmRleDsKKyNlbmRpZgogCi0JCWlmIChpbnAtPmluZGV4ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZGV4ID0gaW5wLT5pbmRleDsKLQkJbWVtc2V0KGlucCwgMCwgc2l6ZW9mKCppbnApKTsKLQkJaW5wLT5pbmRleCA9IGluZGV4OwotCQlzdHJuY3B5KGlucC0+bmFtZSwgZ28tPmJvYXJkX2luZm8tPmlucHV0c1tpbmRleF0ubmFtZSwKLQkJCQlzaXplb2YoaW5wLT5uYW1lKSk7Ci0JCS8qIElmIHRoaXMgYm9hcmQgaGFzIGEgdHVuZXIsIGl0IHdpbGwgYmUgdGhlIGxhc3QgaW5wdXQgKi8KLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWluZGV4ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkKLQkJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQkJZWxzZQotCQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJaW5wLT5hdWRpb3NldCA9IDA7Ci0JCWlucC0+dHVuZXIgPSAwOwotCQlpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpCi0JCQlpbnAtPnN0ZCA9IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9QQUwgfAotCQkJCQkJCVY0TDJfU1REX1NFQ0FNOwotCQllbHNlCi0JCQlpbnAtPnN0ZCA9IDA7Ci0JCXJldHVybiAwOworc3RhdGljIGludCB2aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChpbnAtPmluZGV4ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cm5jcHkoaW5wLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucC0+aW5kZXhdLm5hbWUsCisJCQlzaXplb2YoaW5wLT5uYW1lKSk7CisKKwkvKiBJZiB0aGlzIGJvYXJkIGhhcyBhIHR1bmVyLCBpdCB3aWxsIGJlIHRoZSBsYXN0IGlucHV0ICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgorCQkJaW5wLT5pbmRleCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpCisJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwllbHNlCisJCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisKKwlpbnAtPmF1ZGlvc2V0ID0gMDsKKwlpbnAtPnR1bmVyID0gMDsKKwlpZiAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpCisJCWlucC0+c3RkID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCB8CisJCQkJCQlWNEwyX1NURF9TRUNBTTsKKwllbHNlCisJCWlucC0+c3RkID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaW5wdXQpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJKmlucHV0ID0gZ28tPmlucHV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpbnB1dCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoaW5wdXQgPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJZ28tPmlucHV0ID0gaW5wdXQ7CisJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpIHsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19JTlBVVCwKKwkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucHV0XS52aWRlb19pbnB1dCk7CisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfQVVESU8sCisJCQkmZ28tPmJvYXJkX2luZm8tPmlucHV0c1tpbnB1dF0uYXVkaW9faW5wdXQpOwogCX0KLQljYXNlIFZJRElPQ19HX0lOUFVUOgotCXsKLQkJaW50ICppbnB1dCA9IGFyZzsKIAotCQkqaW5wdXQgPSBnby0+aW5wdXQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCXsKLQkJaW50ICppbnB1dCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoKmlucHV0ID49IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzKQorc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHQtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX1RVTkVSLCB0KTsKKworCXQtPmluZGV4ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHQtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGdvLT5ib2FyZF9pZCkgeworCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX05BOgorCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX0pQOgorCQkvKiBObyBzZWxlY3RhYmxlIG9wdGlvbnMgY3VycmVudGx5ICovCisJCWlmICh0LT5hdWRtb2RlICE9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlnby0+aW5wdXQgPSAqaW5wdXQ7Ci0JCWlmIChnby0+aTJjX2FkYXB0ZXJfb25saW5lKSB7Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0lOUFVULAotCQkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzWyppbnB1dF0udmlkZW9faW5wdXQpOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19BVURJTywKLQkJCQkmZ28tPmJvYXJkX2luZm8tPmlucHV0c1sqaW5wdXRdLmF1ZGlvX2lucHV0KTsKLQkJfQotCQlyZXR1cm4gMDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+aW5kZXggIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19UVU5FUiwgYXJnKTsKLQkJdC0+aW5kZXggPSAwOwotCQlyZXR1cm4gMDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX1RVTkVSLCB0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19GUkVRVUVOQ1ksIGYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0ZSRVFVRU5DWSwgZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfY3JvcGNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KKwlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgeworCWNhc2UgR083MDA3X1NURF9OVFNDOgorCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7CisJCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSA0ODA7CisJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA0ODA7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9QQUw6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDU3NjsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOworCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDU3NjsKKwkJYnJlYWs7CisJY2FzZSBHTzcwMDdfU1REX09USEVSOgorCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOworCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3BjYXAtPmRlZnJlY3QuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWJyZWFrOwogCX0KLQljYXNlIFZJRElPQ19TX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CiAKLQkJaWYgKCEoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHQtPmluZGV4ICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCXN3aXRjaCAoZ28tPmJvYXJkX2lkKSB7Ci0JCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX05BOgotCQljYXNlIEdPNzAwN19CT0FSRElEX1BYX1RWNDAyVV9KUDoKLQkJCS8qIE5vIHNlbGVjdGFibGUgb3B0aW9ucyBjdXJyZW50bHkgKi8KLQkJCWlmICh0LT5hdWRtb2RlICE9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU8pCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX1RVTkVSLCBhcmcpOwotCQlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcm9wLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KKwlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgeworCWNhc2UgR083MDA3X1NURF9OVFNDOgorCQljcm9wLT5jLnRvcCA9IDA7CisJCWNyb3AtPmMubGVmdCA9IDA7CisJCWNyb3AtPmMud2lkdGggPSA3MjA7CisJCWNyb3AtPmMuaGVpZ2h0ID0gNDgwOworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfUEFMOgorCQljcm9wLT5jLnRvcCA9IDA7CisJCWNyb3AtPmMubGVmdCA9IDA7CisJCWNyb3AtPmMud2lkdGggPSA3MjA7CisJCWNyb3AtPmMuaGVpZ2h0ID0gNTc2OworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfT1RIRVI6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3AtPmMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisJCWJyZWFrOwogCX0KLQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwotCQlmLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfRlJFUVVFTkNZLCBhcmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JewotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19GUkVRVUVOQ1ksIGFyZyk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19DUk9QQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoY3JvcGNhcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGNyb3BjYXAsIDAsIHNpemVvZigqY3JvcGNhcCkpOwotCQljcm9wY2FwLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLwotCQlzd2l0Y2ggKGdvLT5zdGFuZGFyZCkgewotCQljYXNlIEdPNzAwN19TVERfTlRTQzoKLQkJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDQ4MDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA0ODA7Ci0JCQlicmVhazsKLQkJY2FzZSBHTzcwMDdfU1REX1BBTDoKLQkJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDU3NjsKLQkJCWNyb3BjYXAtPmRlZnJlY3QudG9wID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSA1NzY7Ci0JCQlicmVhazsKLQkJY2FzZSBHTzcwMDdfU1REX09USEVSOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOwotCQkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX3dpZHRoOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKLQkJCWJyZWFrOwotCQl9CisvKiBGSVhNRTogdmlkaW9jX3NfY3JvcCBpcyBub3QgcmVhbGx5IGltcGxlbWVudGVkISEhCisgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKK3sKKwlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19HX0NST1A6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoY3JvcCwgMCwgc2l6ZW9mKCpjcm9wKSk7Ci0JCWNyb3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCS8qIFRoZXNlIHNwZWNpZnkgdGhlIHJhdyBpbnB1dCBvZiB0aGUgc2Vuc29yICovCi0JCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7Ci0JCWNhc2UgR083MDA3X1NURF9OVFNDOgotCQkJY3JvcC0+Yy50b3AgPSAwOwotCQkJY3JvcC0+Yy5sZWZ0ID0gMDsKLQkJCWNyb3AtPmMud2lkdGggPSA3MjA7Ci0JCQljcm9wLT5jLmhlaWdodCA9IDQ4MDsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfUEFMOgotCQkJY3JvcC0+Yy50b3AgPSAwOwotCQkJY3JvcC0+Yy5sZWZ0ID0gMDsKLQkJCWNyb3AtPmMud2lkdGggPSA3MjA7Ci0JCQljcm9wLT5jLmhlaWdodCA9IDU3NjsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfT1RIRVI6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wLT5jLmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJYnJlYWs7Ci0JCX0KK3N0YXRpYyBpbnQgdmlkaW9jX2dfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMpCit7CisJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKwlwYXJhbXMtPnF1YWxpdHkgPSA1MDsgLyogPz8gKi8KKwlwYXJhbXMtPmpwZWdfbWFya2VycyA9IFY0TDJfSlBFR19NQVJLRVJfREhUIHwKKwkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVDsKIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19DUk9QOgotCXsKLQkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKKwlyZXR1cm4gMDsKK30KIAotCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfSlBFR0NPTVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcyA9IGFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX3NfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMpCit7CisJaWYgKHBhcmFtcy0+cXVhbGl0eSAhPSA1MCB8fAorCQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgIT0gKFY0TDJfSlBFR19NQVJLRVJfREhUIHwKKwkJCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKLQkJcGFyYW1zLT5xdWFsaXR5ID0gNTA7IC8qID8/ICovCi0JCXBhcmFtcy0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQgfAotCQkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVDsKKwlyZXR1cm4gMDsKK30KIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGFyYW1zID0gYXJnOworLyogRklYTUU6CisJVGhvc2UgaW9jdGxzIGFyZSBwcml2YXRlLCBhbmQgbm90IG5lZWRlZCwgc2luY2Ugc2V2ZXJhbCBzdGFuZGFyZAorCWV4dGVuZGVkIGNvbnRyb2xzIGFscmVhZHkgcHJvdmlkZSBzdHJlYW1pbmcgY29udHJvbC4KKwlTbywgdGhvc2UgaW9jdGxzIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byB2aWRpb2NfZ19leHRfY3RybHMoKQorCWFuZCB2aWRpb2Nfc19leHRfY3RybHMoKQorICovCiAKLQkJaWYgKHBhcmFtcy0+cXVhbGl0eSAhPSA1MCB8fAotCQkJCXBhcmFtcy0+anBlZ19tYXJrZXJzICE9IChWNEwyX0pQRUdfTUFSS0VSX0RIVCB8Ci0JCQkJCQkJVjRMMl9KUEVHX01BUktFUl9EUVQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCX0KKyNpZiAwCiAJLyogVGVtcG9yYXJ5IGlvY3RscyBmb3IgY29udHJvbGxpbmcgY29tcHJlc3Npb24gY2hhcmFjdGVyaXN0aWNzICovCiAJY2FzZSBHTzcwMDdJT0NfU19CSVRSQVRFOgogCXsKQEAgLTEzMTYsMjcgKzE2NzcsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiBjbGlwX3RvX21vZGV0X21hcChnbywgcmVnaW9uLT5yZWdpb24sIHJlZ2lvbi0+Y2xpcHMpOwogCX0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiZ283MDA3OiB1bnN1cHBvcnRlZCBpb2N0bCAlZFxuIiwgY21kKTsKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLXVubG9ja19hbmRfcmV0dXJuOgotCXVwKCZnb2ZoLT5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IGdvNzAwN19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGdvZmgtPmdvLT5zdGF0dXMgIT0gU1RBVFVTX09OTElORSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBnbzcwMDdfZG9faW9jdGwpOwotfQorI2VuZGlmCiAKIHN0YXRpYyBzc2l6ZV90IGdvNzAwN19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZGF0YSwKIAkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0xNDQxLDIzICsxNzgyLDU5IEBACiAJCWtmcmVlKGdvKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ283MDA3X2ZvcHMgPSB7CitzdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGdvNzAwN19mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBnbzcwMDdfb3BlbiwKIAkucmVsZWFzZQk9IGdvNzAwN19yZWxlYXNlLAotCS5pb2N0bAkJPSBnbzcwMDdfaW9jdGwsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkucmVhZAkJPSBnbzcwMDdfcmVhZCwKIAkubW1hcAkJPSBnbzcwMDdfbW1hcCwKIAkucG9sbAkJPSBnbzcwMDdfcG9sbCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdmlkZW9faW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgICAgICAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwICA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2NfZ19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcCAgID0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXAgICAgID0gdmlkaW9jX3NfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19yZXFidWZzICAgICAgICAgICA9IHZpZGlvY19yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYgICAgICAgICAgPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmICAgICAgICAgICAgICA9IHZpZGlvY19xYnVmLAorCS52aWRpb2NfZHFidWYgICAgICAgICAgICAgPSB2aWRpb2NfZHFidWYsCisJLnZpZGlvY19zX3N0ZCAgICAgICAgICAgICA9IHZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX2VudW1faW5wdXQgICAgICAgID0gdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgICAgICAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgICAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgICAgICAgID0gdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX3N0cmVhbW9uICAgICAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfZ190dW5lciAgICAgICAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgICAgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSAgICAgICA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfZ19wYXJtICAgICAgICAgICAgPSB2aWRpb2NfZ19wYXJtLAorCS52aWRpb2Nfc19wYXJtICAgICAgICAgICAgPSB2aWRpb2Nfc19wYXJtLAorCS52aWRpb2NfZW51bV9mcmFtZXNpemVzICAgPSB2aWRpb2NfZW51bV9mcmFtZXNpemVzLAorCS52aWRpb2NfZW51bV9mcmFtZWludGVydmFscyA9IHZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzLAorCS52aWRpb2NfY3JvcGNhcCAgICAgICAgICAgPSB2aWRpb2NfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcCAgICAgICAgICAgID0gdmlkaW9jX2dfY3JvcCwKKwkudmlkaW9jX3NfY3JvcCAgICAgICAgICAgID0gdmlkaW9jX3NfY3JvcCwKKwkudmlkaW9jX2dfanBlZ2NvbXAgICAgICAgID0gdmlkaW9jX2dfanBlZ2NvbXAsCisJLnZpZGlvY19zX2pwZWdjb21wICAgICAgICA9IHZpZGlvY19zX2pwZWdjb21wLAorfTsKKwogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgZ283MDA3X3RlbXBsYXRlID0gewogCS5uYW1lCQk9ICJnbzcwMDciLAogCS52ZmxfdHlwZQk9IFZJRF9UWVBFX0NBUFRVUkUsCiAJLmZvcHMJCT0gJmdvNzAwN19mb3BzLAogCS5taW5vcgkJPSAtMSwKIAkucmVsZWFzZQk9IGdvNzAwN192ZmxfcmVsZWFzZSwKKwkuaW9jdGxfb3BzCT0gJnZpZGVvX2lvY3RsX29wcywKKwkudHZub3Jtcwk9IFY0TDJfU1REX0FMTCwKKwkuY3VycmVudF9ub3JtCT0gVjRMMl9TVERfTlRTQywKIH07CiAKIGludCBnbzcwMDdfdjRsMl9pbml0KHN0cnVjdCBnbzcwMDcgKmdvKQpAQCAtMTQ3Nyw2ICsxODU0LDggQEAKIAl9CiAJdmlkZW9fc2V0X2RydmRhdGEoZ28tPnZpZGVvX2RldiwgZ28pOwogCSsrZ28tPnJlZl9jb3VudDsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBkZXZpY2UgdmlkZW8lZCBbdjRsMl1cbiIsCisJICAgICAgIGdvLT52aWRlb19kZXYtPm5hbWUsIGdvLT52aWRlb19kZXYtPm51bSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY3NzJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0CkBAIC0wLDAgKzEsNDgxIEBACitUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgV0lTIEdPNzAwN1NCIG11bHRpLWZvcm1hdCB2aWRlbyBlbmNvZGVyLgorCitQZXRlIEViZXJsZWluIDxwZXRlQHNlbnNvcmF5LmNvbT4KKworVGhlIGRyaXZlciB3YXMgb3JpZ25hbGx5IHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgYW5kIGlzIGN1cnJlbnRseSBob3N0ZWQgYXQ6CitodHRwOi8vbmlrb3NhcGkub3JnL3dpa2kvaW5kZXgucGhwL1dJU19HbzcwMDdfTGludXhfZHJpdmVyCitUaGUgZ283MDA3IGZpcm13YXJlIGNhbiBiZSBhY3F1aXJlZCBmcm9tIHRoZSBwYWNrYWdlIG9uIHRoZSBzaXRlIGFib3ZlLgorCitJJ3ZlIG1vZGlmaWVkIHRoZSBkcml2ZXIgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIFZpZGVvNExpbnV4MiBNUEVHCitjb250cm9scywgd2l0aCBhY2NlcHRhYmxlIHZhbHVlczoKKworVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZECisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTQorVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMgorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQKK1Y0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkKK1Y0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUJaW50ZWdlcgorVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFCTY0MDAwIC4uIDEwMDAwMDAwCisKK1RoZXNlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG5vbi1zdGFuZGFyZCBHTzcwMDcgaW9jdGxzIGRlc2NyaWJlZAorYmVsb3cuCisKKworVGhlIFJFQURNRSBmaWxlcyBmcm9tIHRoZSBvcmlnbmFsIHBhY2thZ2UgYXBwZWFyIGJlbG93OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgIFdJUyBHTzcwMDdTQiBQdWJsaWMgTGludXggRHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisqKiogUGxlYXNlIHNlZSB0aGUgZmlsZSBSRUxFQVNFLU5PVEVTIGZvciBpbXBvcnRhbnQgbGFzdC1taW51dGUgdXBkYXRlcyAqKioKKworCisgIDAuIE9WRVJWSUVXIEFORCBMSUNFTlNJTkcvRElTQ0xBSU1FUgorCisKK1RoaXMgZHJpdmVyIGtpdCBjb250YWlucyBMaW51eCBkcml2ZXJzIGZvciB0aGUgV0lTIEdPNzAwN1NCIG11bHRpLWZvcm1hdAordmlkZW8gZW5jb2Rlci4gIE9ubHkga2VybmVsIHZlcnNpb24gMi42LnggaXMgc3VwcG9ydGVkLiAgVGhlIHZpZGVvIHN0cmVhbQoraXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZpZGVvNExpbnV4MiBBUEkgYW5kIHRoZSBhdWRpbyBzdHJlYW0gaXMgYXZhaWxhYmxlCit0aHJvdWdoIHRoZSBBTFNBIEFQSSAob3IgdGhlIE9TUyBlbXVsYXRpb24gbGF5ZXIgb2YgdGhlIEFMU0Egc3lzdGVtKS4KKworVGhlIGZpbGVzIGluIGtlcm5lbC8gYW5kIGhvdHBsdWcvIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIFZlcnNpb24gMiBmcm9tIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UKK2lzIGluY2x1ZGVkIGluIHRoZSBmaWxlIENPUFlJTkcuCisKK1RoZSBleGFtcGxlIGFwcGxpY2F0aW9ucyBpbiBhcHBzLyBhbmQgQyBoZWFkZXIgZmlsZXMgaW4gaW5jbHVkZS8gYXJlCitsaWNlbnNlZCB1bmRlciBhIHBlcm1pc3NpdmUgbGljZW5zZSBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGVzIHdoaWNoCithbGxvd3MgY29weWluZywgbW9kaWZpY2F0aW9uIGFuZCByZWRpc3RyaWJ1dGlvbiBmb3IgYW55IHB1cnBvc2Ugd2l0aG91dAorYXR0cmlidXRpb24uCisKK1RoZSBmaXJtd2FyZSBmaWxlcyBpbmNsdWRlZCBpbiB0aGUgZmlybXdhcmUvIGRpcmVjdG9yeSBtYXkgYmUgZnJlZWx5CityZWRpc3RyaWJ1dGVkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGlzIGRvY3VtZW50OyBidXQgbW9kaWZpY2F0aW9uLAordGFtcGVyaW5nIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nIGFyZSBwcm9oaWJpdGVkLgorCitNSUNST05BUyBVU0EsIElOQy4sIE1BS0VTIE5PIFdBUlJBTlRJRVMgVE8gQU5ZIFBFUlNPTiBPUiBFTlRJVFkgV0lUSAorUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUgT1IgQU5ZIERFUklWQVRJVkVTIFRIRVJFT0YgT1IgQU5ZIFNFUlZJQ0VTIE9SCitMSUNFTlNFUyBBTkQgRElTQ0xBSU1TIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04KK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTVVBQT1JULCBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorCisKKyAgMS4gU1lTVEVNIFJFUVVJUkVNRU5UUworCisKK1RoaXMgZHJpdmVyIHJlcXVpcmVzIExpbnV4IGtlcm5lbCAyLjYuICBLZXJuZWwgMi40IGlzIG5vdCBzdXBwb3J0ZWQuICBVc2luZwora2VybmVsIDIuNi4xMCBvciBsYXRlciBpcyByZWNvbW1lbmRlZCwgYXMgZWFybGllciBrZXJuZWxzIGFyZSBrbm93biB0byBoYXZlCit1bnN0YWJsZSBVU0IgMi4wIHN1cHBvcnQuCisKK0EgZnVsbHkgYnVpbHQga2VybmVsIHNvdXJjZSB0cmVlIG11c3QgYmUgYXZhaWxhYmxlLiAgVHlwaWNhbGx5IHRoaXMgd2lsbCBiZQorbGlua2VkIGZyb20gIi9saWIvbW9kdWxlcy88S0VSTkVMIFZFUlNJT04+L2J1aWxkIiBmb3IgY29udmVuaWVuY2UuICBJZiB0aGlzCitsaW5rIGRvZXMgbm90IGV4aXN0LCBhbiBleHRyYSBwYXJhbWV0ZXIgd2lsbCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUKK2BtYWtlYCBjb21tYW5kLgorCitBbGwgdmVuZG9yLWJ1aWx0IGtlcm5lbHMgc2hvdWxkIGFscmVhZHkgYmUgY29uZmlndXJlZCBwcm9wZXJseS4gIEhvd2V2ZXIsCitmb3IgY3VzdG9tLWJ1aWx0IGtlcm5lbHMsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBuZWVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlCitrZXJuZWwgYXMgYnVpbHQtaW4gb3IgbW9kdWxlczoKKworICAgICAgICBDT05GSUdfSE9UUExVRyAgICAgICAgICAgLSBTdXBwb3J0IGZvciBob3QtcGx1Z2dhYmxlIGRldmljZXMKKyAgICAgICAgQ09ORklHX01PRFVMRVMgICAgICAgICAgIC0gRW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisgICAgICAgIENPTkZJR19LTU9EICAgICAgICAgICAgICAtIEF1dG9tYXRpYyBrZXJuZWwgbW9kdWxlIGxvYWRpbmcKKyAgICAgICAgQ09ORklHX0ZXX0xPQURFUiAgICAgICAgIC0gSG90cGx1ZyBmaXJtd2FyZSBsb2FkaW5nIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX0kyQyAgICAgICAgICAgICAgIC0gSTJDIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX1ZJREVPX0RFViAgICAgICAgIC0gVmlkZW8gRm9yIExpbnV4CisgICAgICAgIENPTkZJR19TT1VORCAgICAgICAgICAgICAtIFNvdW5kIGNhcmQgc3VwcG9ydAorICAgICAgICBDT05GSUdfU05EICAgICAgICAgICAgICAgLSBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyAgICAgICAgQ09ORklHX1VTQiAgICAgICAgICAgICAgIC0gU3VwcG9ydCBmb3IgSG9zdC1zaWRlIFVTQgorICAgICAgICBDT05GSUdfVVNCX0RFVklDRUZTICAgICAgLSBVU0IgZGV2aWNlIGZpbGVzeXN0ZW0KKyAgICAgICAgQ09ORklHX1VTQl9FSENJX0hDRCAgICAgIC0gRUhDSSBIQ0QgKFVTQiAyLjApIHN1cHBvcnQKKworQWRkaXRpb25hbGx5LCB0byB1c2UgdGhlIGV4YW1wbGUgYXBwbGljYXRpb24sIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBuZWVkIHRvCitiZSBlbmFibGVkIGluIHRoZSBBTFNBIHNlY3Rpb246CisKKyAgICAgICAgQ09ORklHX1NORF9NSVhFUl9PU1MgICAgIC0gT1NTIE1peGVyIEFQSQorICAgICAgICBDT05GSUdfU05EX1BDTV9PU1MgICAgICAgLSBPU1MgUENNIChkaWdpdGFsIGF1ZGlvKSBBUEkKKworVGhlIGhvdHBsdWcgc2NyaXB0cywgYWxvbmcgd2l0aCB0aGUgZnhsb2FkIHV0aWxpdHksIG11c3QgYWxzbyBiZSBpbnN0YWxsZWQuCitUaGVzZSBzY3JpcHRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIDxodHRwOi8vbGludXgtaG90cGx1Zy5zb3VyY2Vmb3JnZS5uZXQvPi4KK0hvdHBsdWdnaW5nIGlzIHVzZWQgZm9yIGxvYWRpbmcgZmlybXdhcmUgaW50byB0aGUgQ3lwcnVzcyBFWi1VU0IgY2hpcCB1c2luZworZnhsb2FkIGFuZCBmb3IgbG9hZGluZyBmaXJtd2FyZSBpbnRvIHRoZSBkcml2ZXIgdXNpbmcgdGhlIGZpcm13YXJlIGFnZW50LgorCisKKyAgMi4gQ09NUElMSU5HIEFORCBJTlNUQUxMSU5HIFRIRSBEUklWRVIKKworCitNb3N0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNvbXBpbGUgdGhlIGRyaXZlciBieSBzaW1wbHkgcnVubmluZzoKKworICAgICAgICAkIG1ha2UKKworaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIGRyaXZlciBraXQuICBGaXJzdCB0aGUga2VybmVsIG1vZHVsZXMKK3dpbGwgYmUgYnVpbHQsIGZvbGxvd2VkIGJ5IHRoZSBleGFtcGxlIGFwcGxpY2F0aW9ucy4KKworSWYgdGhlIGJ1aWxkIHN5c3RlbSBpcyB1bmFibGUgdG8gbG9jYXRlIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgZm9yIHRoZQorY3VycmVudGx5LXJ1bm5pbmcga2VybmVsLCBvciBpZiB0aGUgbW9kdWxlIHNob3VsZCBiZSBidWlsdCBmb3IgYSBrZXJuZWwKK290aGVyIHRoYW4gdGhlIGN1cnJlbnRseS1ydW5uaW5nIGtlcm5lbCwgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBuZWVkCit0byBiZSBwYXNzZWQgdG8gbWFrZSB0byBzcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBrZXJuZWwgc291cmNlIGRpcmVjdG9yeToKKworICAgICAgICAkIG1ha2UgS0VSTkVMU1JDPS91c3Ivc3JjL2xpbnV4LTIuNi4xMC1jdXN0b20zCisKK09uY2UgdGhlIGNvbXBpbGUgY29tcGxldGVzLCB0aGUgZHJpdmVyIGFuZCBmaXJtd2FyZSBmaWxlcyBzaG91bGQgYmUKK2luc3RhbGxlZCBieSBydW5uaW5nOgorCisgICAgICAgICQgbWFrZSBpbnN0YWxsCisKK1RoZSBrZXJuZWwgbW9kdWxlcyB3aWxsIGJlIHBsYWNlZCBpbiAiL2xpYi9tb2R1bGVzLzxLRVJORUwgVkVSU0lPTj4vZXh0cmEiCithbmQgdGhlIGZpcm13YXJlIGZpbGVzIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBhcHByb3ByaWF0ZSBob3RwbHVnIGZpcm13YXJlCitkaXJlY3RvcnksIHVzdWFsbHkgL2xpYi9maXJtd2FyZS4gIEluIGFkZGl0aW9uLCBVU0IgbWFwcyBhbmQgc2NyaXB0cyB3aWxsCitiZSBwbGFjZWQgaW4gL2V0Yy9ob3RwbHVnL3VzYiB0byBlbmFibGUgZnhsb2FkIHRvIGluaXRpYWxpemUgdGhlIEVaLVVTQgorY29udHJvbCBjaGlwIHdoZW4gdGhlIGRldmljZSBpcyBjb25uZWN0ZWQuCisKKworICAzLiBQQUwvU0VDQU0gVFVORVIgQ09ORklHVVJBVElPTiAoVFY0MDJVLUVVIG9ubHkpCisKKworVGhlIFBBTCBtb2RlbCBvZiB0aGUgUGxleHRvciBDb252ZXJ0WCBUVjQwMlUgbWF5IHJlcXVpcmUgYWRkaXRpb25hbAorY29uZmlndXJhdGlvbiB0byBjb3JyZWN0bHkgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBUViBmcmVxdWVuY3kgYmFuZCBhbmQKK2F1ZGlvIHN1YmNoYW5uZWwuCisKK1VzZXJzIHdpdGggYSBkZXZpY2Ugb3RoZXIgdGhhbiB0aGUgUGxleHRvciBDb252ZXJ0WCBUVjQwMlUtRVUgc2hvdWxkIHNraXAKK3RoaXMgc2VjdGlvbi4KKworVGhlIHdpZGUgdmFyaWV0eSBvZiBQQUwgVFYgc3lzdGVtcyB1c2VkIGluIEV1cm9wZSByZXF1aXJlcyB0aGF0IGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBUViBzdGFuZGFyZHMgYmUgcGFzc2VkIHRvIHRoZSBkcml2ZXIgaW4gb3JkZXIKK3RvIHByb3Blcmx5IHR1bmUgVFYgY2hhbm5lbHMuICBUaGUgdHdvIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGFyZSAoYSkgdGhlIFBBTAorVFYgYmFuZCwgYW5kIChiKSB0aGUgYXVkaW8gc3ViY2hhbm5lbCBmb3JtYXQgaW4gdXNlLgorCitJbiBtYW55IGNhc2VzLCB0aGUgYXBwcm9wcmlhdGUgVFYgYmFuZCBzZWxlY3Rpb24gaXMgcGFzc2VkIHRvIHRoZSBkcml2ZXIKK2Zyb20gYXBwbGljYXRpb25zLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcywgdGhlIGFwcGxpY2F0aW9uIG9ubHkgc3BlY2lmaWVzCit0aGF0IHRoZSBkcml2ZXIgc2hvdWxkIHVzZSBQQUwgYnV0IG5vdCB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCithcHByb3ByaWF0ZSBUViBiYW5kLiAgVG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgdGhlIGNvcnJlY3QgVFYgYmFuZCBtYXkgYmUKK3NwZWNpZmllZCBpbiB0aGUgImZvcmNlX2JhbmQiIHBhcmFtZXRlciB0byB0aGUgd2lzLXNvbnktdHVuZXIgbW9kdWxlOgorCisgICAgIFRWIGJhbmQgICAgICAgICAgIGZvcmNlX2JhbmQKKyAgICAgLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICBQQUwgQi9HICAgICAgICAgICAgICAgIEIKKyAgICAgUEFMIEkgICAgICAgICAgICAgICAgICBJCisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgRAorICAgICBTRUNBTSBMICAgICAgICAgICAgICAgIEwKKworSWYgdGhlICJmb3JjZV9iYW5kIiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgZHJpdmVyIHdpbGwgaWdub3JlIGFueSBUVgorYmFuZCBzcGVjaWZpZWQgYnkgYXBwbGljYXRpb25zIGFuZCB3aWxsIGFsd2F5cyB1c2UgdGhlIGJhbmQgcHJvdmlkZWQgaW4gdGhlCittb2R1bGUgcGFyYW1ldGVyLgorCitUaGUgb3RoZXIgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpcyB0aGUgYXVkaW8gc3ViY2hhbm5lbCBmb3JtYXQuCitUaGVyZSBhcmUgc2V2ZXJhbCBzdGVyZW8gYXVkaW8gY2FycmllciBzeXN0ZW1zIGluIHVzZSwgaW5jbHVkaW5nIE5JQ0FNIGFuZAordGhyZWUgdmFyaWV0aWVzIG9mIEEyLiAgVG8gcmVjZWl2ZSBhdWRpbyBicm9hZGNhc3Qgb24gb25lIG9mIHRoZXNlIHN0ZXJlbworY2FycmllcnMsIHRoZSAiZm9yY2VfbXB4X21vZGUiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCB0byB0aGUKK3dpcy1zb255LXR1bmVyIG1vZHVsZS4KKworICAgICBUViBiYW5kICAgICAgICAgICBBdWRpbyBzdWJjYXJyaWVyICAgICAgIGZvcmNlX21weF9tb2RlCisgICAgIC0tLS0tLS0gICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgUEFMIEIvRyAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgMQorICAgICBQQUwgQi9HICAgICAgICAgICAgICAgICAgQTIgICAgICAgICAgICAgICAgICAgICAyCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgIDMKKyAgICAgUEFMIEkgICAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgNAorICAgICBQQUwgSSAgICAgICAgICAgICAgICAgICBOSUNBTSAgICAgICAgICAgICAgICAgICA1CisgICAgIFBBTCBEL0sgICAgICAgICAgICBNb25vIChkZWZhdWx0KSAgICAgICAgICAgICAgIDYKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgQTIgKDEpICAgICAgICAgICAgICAgICAgNworICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBBMiAoMikgICAgICAgICAgICAgICAgICA4CisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgIEEyICgzKSAgICAgICAgICAgICAgICAgIDkKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAxMAorICAgICBTRUNBTSBMICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgIDExCisgICAgIFNFQ0FNIEwgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgMTIKKworSWYgdGhlICJmb3JjZV9tcHhfbW9kZSIgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb3JyZWN0IG1vbm8tb25seQorbW9kZSB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgVFYgYmFuZC4gIEhvd2V2ZXIsIHRoZSB0dW5lciB3aWxsIG5vdAorcmVjZWl2ZSBzdGVyZW8gYXVkaW8gb3IgYmlsaW5ndWFsIGJyb2FkY2FzdHMgY29ycmVjdGx5LgorCitUbyBwYXNzIHRoZSAiZm9yY2VfYmFuZCIgb3IgImZvcmNlX21weF9tb2RlIiBwYXJhbWV0ZXJzIHRvIHRoZQord2lzLXNvbnktdHVuZXIgbW9kdWxlLCB0aGUgZm9sbG93aW5nIGxpbmUgbXVzdCBiZSBhZGRlZCB0byB0aGUgbW9kcHJvYmUKK2NvbmZpZ3VyYXRpb24gZmlsZSwgd2hpY2ggdmFyaWVzIGZyb20gb25lIExpbnV4IGRpc3RyaWJ1dGlvbiB0byBhbm90aGVyLgorCisgICAgIG9wdGlvbnMgd2lzLXNvbnktdHVuZXIgZm9yY2VfYmFuZD1CIGZvcmNlX21weF9tb2RlPTIKKworVGhlIGFib3ZlIGV4YW1wbGUgd291bGQgZm9yY2UgdGhlIHR1bmVyIHRvIHRoZSBQQUwgQi9HIFRWIGJhbmQgYW5kIHJlY2VpdmUKK3N0ZXJlbyBhdWRpbyBicm9hZGNhc3RzIG9uIHRoZSBBMiBjYXJyaWVyLgorCitUbyB2ZXJpZnkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24sCitleGVjdXRlOgorCisgICAgICAgICQgbW9kcHJvYmUgLWMgfCBncmVwIHdpcy1zb255LXR1bmVyCisKK0lmIHRoZSBjb25maWd1cmF0aW9uIGxpbmUgYXBwZWFycywgdGhlbiBtb2Rwcm9iZSB3aWxsIHBhc3MgdGhlIHBhcmFtZXRlcnMKK2NvcnJlY3RseSB0aGUgbmV4dCB0aW1lIHRoZSB3aXMtc29ueS10dW5lciBtb2R1bGUgaXMgbG9hZGVkIGludG8gdGhlCitrZXJuZWwuCisKKworICA0LiBURVNUSU5HIFRIRSBEUklWRVIKKworCitCZWNhdXNlIGZldyBMaW51eCBhcHBsaWNhdGlvbnMgYXJlIGFibGUgdG8gY29ycmVjdGx5IGNhcHR1cmUgZnJvbQorVmlkZW80TGludXgyIGRldmljZXMgd2l0aCBvbmx5IGNvbXByZXNzZWQgZm9ybWF0cyBzdXBwb3J0ZWQsIHRoZSBuZXcgZHJpdmVyCitzaG91bGQgYmUgdGVzdGVkIHdpdGggdGhlICJnb3JlY29yZCIgYXBwbGljYXRpb24gaW4gdGhlIGFwcHMvIGRpcmVjdG9yeS4KKworRmlyc3QgY29ubmVjdCBhIHZpZGVvIHNvdXJjZSB0byB0aGUgZGV2aWNlLCBzdWNoIGFzIGEgRFZEIHBsYXllciBvciBWQ1IuCitUaGlzIHdpbGwgYmUgY2FwdHVyZWQgdG8gYSBmaWxlIGZvciB0ZXN0aW5nIHRoZSBkcml2ZXIuICBJZiBhbiBpbnB1dCBzb3VyY2UKK2lzIHVuYXZhaWxhYmxlLCBhIHRlc3QgZmlsZSBjYW4gc3RpbGwgYmUgY2FwdHVyZWQsIGJ1dCB0aGUgdmlkZW8gd2lsbCBiZQorYmxhY2sgYW5kIHRoZSBhdWRpbyB3aWxsIGJlIHNpbGVudC4KKworVGhpcyBhcHBsaWNhdGlvbiB3aWxsIGF1dG8tZGV0ZWN0IHRoZSBWNEwyIGFuZCBBTFNBL09TUyBkZXZpY2UgbmFtZXMgb2YgdGhlCitoYXJkd2FyZSBhbmQgd2lsbCByZWNvcmQgdmlkZW8gYW5kIGF1ZGlvIHRvIGFuIEFWSSBmaWxlIGZvciBhIHNwZWNpZmllZAorbnVtYmVyIG9mIHNlY29uZHMuICBGb3IgZXhhbXBsZToKKworICAgICAgICAkIGFwcHMvZ29yZWNvcmQgLWR1cmF0aW9uIDYwIGNhcHR1cmUuYXZpCisKK0lmIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VjY2Vzc2Z1bGx5IHJlY29yZCBhbiBBVkkgZmlsZSwgdGhlIGVycm9yCittZXNzYWdlcyBwcm9kdWNlZCBieSBnb3JlY29yZCBhbmQgcmVjb3JkZWQgaW4gdGhlIHN5c3RlbSBsb2cgKHVzdWFsbHkgaW4KKy92YXIvbG9nL21lc3NhZ2VzKSBzaG91bGQgcHJvdmlkZSBpbmZvcm1hdGlvbiB0byBoZWxwIHJlc29sdmUgdGhlIHByb2JsZW0uCisKK1N1cHBseWluZyBubyBwYXJhbWV0ZXJzIHRvIGdvcmVjb3JkIHdpbGwgY2F1c2UgaXQgdG8gcHJvYmUgdGhlIGF2YWlsYWJsZQorZGV2aWNlcyBhbmQgZXhpdC4gIFVzZSB0aGUgLWhlbHAgZmxhZyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uCisKKworICA1LiBVU0lORyBUSEUgRFJJVkVSCisKKworVGhlIFY0TDIgZGV2aWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXIgcHJvdmlkZXMgYSBzdGFuZGFyZCBjb21wcmVzc2VkCitmb3JtYXQgQVBJLCB3aXRoaW4gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToKKworICAqIEFwcGxpY2F0aW9ucyB0aGF0IG9ubHkgc3VwcG9ydCB0aGUgb3JpZ2luYWwgVmlkZW80TGludXgxIEFQSSB3aWxsIG5vdAorICAgIGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzIGRyaXZlciBhdCBhbGwuCisKKyAgKiBObyByYXcgdmlkZW8gbW9kZXMgYXJlIHN1cHBvcnRlZCwgc28gYXBwbGljYXRpb25zIGxpa2UgeGF3dHYgdGhhdAorICAgIGV4cGVjdCBvbmx5IHVuY29tcHJlc3NlZCB2aWRlbyB3aWxsIG5vdCBmdW5jdGlvbi4KKworICAqIFN1cHBvcnRlZCBjb21wcmVzc2lvbiBmb3JtYXRzIGFyZTogTW90aW9uLUpQRUcsIE1QRUcxLCBNUEVHMiBhbmQgTVBFRzQuCisKKyAgKiBNUEVHIHZpZGVvIGZvcm1hdHMgYXJlIGRlbGl2ZXJlZCBhcyBWaWRlbyBFbGVtZW50YXJ5IFN0cmVhbXMgb25seS4KKyAgICBQcm9ncmFtIFN0cmVhbSAoUFMpLCBUcmFuc3BvcnQgU3RyZWFtIChUUykgYW5kIFBhY2tldGl6ZWQgRWxlbWVudGFyeQorICAgIFN0cmVhbSAoUEVTKSBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkLgorCisgICogVmlkZW8gcGFyYW1ldGVycyBzdWNoIGFzIGZvcm1hdCBhbmQgaW5wdXQgcG9ydCBtYXkgbm90IGJlIGNoYW5nZWQgd2hpbGUKKyAgICB0aGUgZW5jb2RlciBpcyBhY3RpdmUuCisKKyAgKiBUaGUgYXVkaW8gY2FwdHVyZSBkZXZpY2Ugb25seSBmdW5jdGlvbnMgd2hlbiB0aGUgdmlkZW8gZW5jb2RlciBpcworICAgIGFjdGl2ZWx5IGNhcHR1cmluZyB2aWRlby4gIEF0dGVtcHRzIHRvIHJlYWQgZnJvbSB0aGUgYXVkaW8gZGV2aWNlIHdoZW4KKyAgICB0aGUgZW5jb2RlciBpcyBpbmFjdGl2ZSB3aWxsIHJlc3VsdCBpbiBhbiBJL08gZXJyb3IuCisKKyAgKiBUaGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgYXVkaW8gZGV2aWNlIGlzIDQ4S2h6IDItY2hhbm5lbCAxNi1iaXQKKyAgICBsaXR0bGUtZW5kaWFuIFBDTSwgZGVsaXZlcmVkIHRocm91Z2ggdGhlIEFMU0Egc3lzdGVtLiAgTm8gYXVkaW8KKyAgICBjb21wcmVzc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgaGFyZHdhcmUuICBBTFNBIG1heSBjb252ZXJ0IHRvIG90aGVyCisgICAgdW5jb21wcmVzc2VkIGZvcm1hdHMgb24gdGhlIGZseS4KKworVGhlIGluY2x1ZGUvIGRpcmVjdG9yeSBjb250YWlucyBhIEMgaGVhZGVyIGZpbGUgZGVzY3JpYmluZyBub24tc3RhbmRhcmQKK2ZlYXR1cmVzIG9mIHRoZSBHTzcwMDdTQiBlbmNvZGVyLCB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93OgorCisKKyAgR083MDA3SU9DX1NfQ09NUF9QQVJBTVMsIEdPNzAwN0lPQ19HX0NPTVBfUEFSQU1TCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gbmVnb3RpYXRlIGdlbmVyYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycy4KKworICAgIFRvIHF1ZXJ5IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGNhbGwgdGhlIEdPNzAwN0lPQ19HX0NPTVBfUEFSQU1TIGlvY3RsCisgICAgd2l0aCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgVG8gY2hhbmdlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBhIHN0cnVjdAorICAgIGdvNzAwN19jb21wX3BhcmFtcyBhbmQgY2FsbCB0aGUgR083MDA3X0lPQ19TX0NPTVBfUEFSQU1TIGlvY3RsIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGUgZHJpdmVyIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgcGFyYW1ldGVycyB3aXRoIGFueSBuZWNlc3NhcnkgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBsaW1pdGF0aW9ucyBvZgorICAgIHRoZSBoYXJkd2FyZSBvciBjdXJyZW50IGNvbXByZXNzaW9uIG1vZGUuICBBbnkgb3IgYWxsIGZpZWxkcyBjYW4gYmUgc2V0CisgICAgdG8gemVybyB0byByZXF1ZXN0IGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLiAgV2hlbiBJL08KKyAgICBpcyBpbiBwcm9ncmVzcywgdGhlIEVCVVNZIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIEZpZWxkcyBpbiBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zOgorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyBpbiBlYWNoCisgICAgICAgICAgZ29wX3NpemUgICAgICAgICAgICAgICAgICAgR3JvdXAgT2YgUGljdHVyZXM7IGkuZS4gdGhlIG1heGltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZnJhbWVzIG1pbnVzIG9uZSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBrZXkgZnJhbWUuCisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VxdWVudGlhbAorICAgICAgICAgIG1heF9iX2ZyYW1lcyAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxseS1wcmVkaWN0ZWQgZnJhbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCLWZyYW1lcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuKQorCisgICAgICAgIGVudW0gZ283MDA3X2FzcGVjdF9yYXRpbyAgICAgVGhlIGFzcGVjdCByYXRpbyB0byBiZSBlbmNvZGVkIGluIHRoZQorICAgICAgICAgIGFzcGVjdF9yYXRpbyAgICAgICAgICAgICAgIG1ldGEtZGF0YSBvZiB0aGUgY29tcHJlc3NlZCBmb3JtYXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzFfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fNF8zX05UU0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzRfM19QQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfQVNQRUNUX1JBVElPXzE2XzlfTlRTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMTZfOV9QQUwKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIEJpdC13aXNlIE9SIG9mIGNvbnRyb2wgZmxhZ3MgKGJlbG93KQorICAgICAgICAgIGZsYWdzCisKKyAgICBGbGFncyBpbiBzdHJ1Y3QgZ283MDA3X2NvbXBfcGFyYW1zOgorCisgICAgICAgIEdPNzAwN19DT01QX0NMT1NFRF9HT1AgICAgICAgT25seSBwcm9kdWNlIHNlbGYtY29udGFpbmVkIEdPUHMsIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm9kdWNlIHN0cmVhbXMgYXBwcm9wcmlhdGUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tIHNlZWtpbmcuCisKKyAgICAgICAgR083MDA3X0NPTVBfT01JVF9TRVFfSEVBREVSICBPbWl0IHRoZSBzdHJlYW0gc2VxdWVuY2UgaGVhZGVyLgorCisKKyAgR083MDA3SU9DX1NfTVBFR19QQVJBTVMsIEdPNzAwN0lPQ19HX01QRUdfUEFSQU1TCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gbmVnb3RpYXRlIE1QRUctc3BlY2lmaWMgc3RyZWFtIHBhcmFtZXRlcnMgd2hlbgorICAgIHRoZSBwaXhlbGZvcm1hdCBoYXMgYmVlbiBzZXQgdG8gVjRMMl9QSVhfRk1UX01QRUcuCisKKyAgICBUbyBxdWVyeSB0aGUgY3VycmVudCBwYXJhbWV0ZXJzLCBjYWxsIHRoZSBHTzcwMDdJT0NfR19NUEVHX1BBUkFNUyBpb2N0bAorICAgIHdpdGggYSBwb2ludGVyIHRvIGEgc3RydWN0IGdvNzAwN19tcGVnX3BhcmFtcy4gIElmIHRoZSBkcml2ZXIgaXMgbm90CisgICAgc2V0IHRvIE1QRUcgZm9ybWF0LCB0aGUgRUlOVkFMIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIFRvIGNoYW5nZSB0aGUgY3VycmVudCBwYXJhbWV0ZXJzLCBpbml0aWFsaXplIGFsbCBmaWVsZHMgb2YgYSBzdHJ1Y3QKKyAgICBnbzcwMDdfbXBlZ19wYXJhbXMgYW5kIGNhbGwgdGhlIEdPNzAwN19JT0NfU19NUEVHX1BBUkFNUyBpb2N0bCB3aXRoIGEKKyAgICBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlIGRyaXZlciB3aWxsIHJldHVybiB0aGUgY3VycmVudAorICAgIHBhcmFtZXRlcnMgd2l0aCBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gY29uZm9ybSB0byB0aGUgbGltaXRhdGlvbnMgb2YKKyAgICB0aGUgaGFyZHdhcmUgb3Igc2VsZWN0ZWQgTVBFRyBtb2RlLiAgQW55IG9yIGFsbCBmaWVsZHMgY2FuIGJlIHNldCB0bworICAgIHplcm8gdG8gcmVxdWVzdCBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZS4gIElmIHRoZSBkcml2ZXIgaXMgbm90IHNldAorICAgIHRvIE1QRUcgZm9ybWF0LCB0aGUgRUlOVkFMIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4gIFdoZW4gSS9PIGlzIGluCisgICAgcHJvZ3Jlc3MsIHRoZSBFQlVTWSBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICBGaWVsZHMgaW4gc3RydWN0IGdvNzAwN19tcGVnX3BhcmFtczoKKworICAgICAgICBlbnVtIGdvNzAwN19tcGVnX3ZpZGVvX3N0YW5kYXJkCisgICAgICAgICAgbXBlZ192aWRlb19zdGFuZGFyZCAgICAgICAgVGhlIE1QRUcgdmlkZW8gc3RhbmRhcmQgaW4gd2hpY2ggdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzcyB0aGUgdmlkZW8uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFR19WSURFT19NUEVHMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHX1ZJREVPX01QRUcyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUdfVklERU9fTVBFRzQKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIEJpdC13aXNlIE9SIG9mIGNvbnRyb2wgZmxhZ3MgKGJlbG93KQorICAgICAgICAgIGZsYWdzCisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW5kaWNhdGlvbiB0byBiZQorICAgICAgICAgIHBhbGkgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGUgc2VxdWVuY2UgaGVhZGVyLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciwgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUgTVBFRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzIHVzZWQgaW4gdGhlIHZpZGVvIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgZm9yIE1QRUcxLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvaWNlcyBmb3IgTVBFRzIgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHMl9QUk9GSUxFX01BSU5fTUFJTgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvaWNlcyBmb3IgTVBFRzQgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9TX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVJUU19MMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0w0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0w1CisKKyAgICBGbGFncyBpbiBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zOgorCisgICAgICAgIEdPNzAwN19NUEVHX0ZPUkNFX0RWRF9NT0RFICAgRm9yY2UgYWxsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSBjb250cm9sIHNldHRpbmdzIHRvIGNvbXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggRFZEIE1QRUcyIHN0cmVhbSByZXF1aXJlbWVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvdmVycmlkZXMgbW9zdCBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIHNldHRpbmdzIQorCisgICAgICAgIEdPNzAwN19NUEVHX09NSVRfR09QX0hFQURFUiAgT21pdCB0aGUgR09QIGhlYWRlci4KKworICAgICAgICBHTzcwMDdfTVBFR19SRVBFQVRfU0VRSEVBREVSIFJlcGVhdCB0aGUgTVBFRyBzZXF1ZW5jZSBoZWFkZXIgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgZWFjaCBHT1AuCisKKworICBHTzcwMDdJT0NfU19CSVRSQVRFLCBHTzcwMDdJT0NfR19CSVRSQVRFCisKKyAgICBUaGVzZSBpb2N0bHMgYXJlIHVzZWQgdG8gc2V0IGFuZCBxdWVyeSB0aGUgdGFyZ2V0IGJpdHJhdGUgdmFsdWUgZm9yIHRoZQorICAgIGNvbXByZXNzZWQgdmlkZW8gc3RyZWFtLiAgVGhlIGJpdHJhdGUgbWF5IGJlIHNlbGVjdGVkIGJ5IHN0b3JpbmcgdGhlCisgICAgdGFyZ2V0IGJpdHMgcGVyIHNlY29uZCBpbiBhbiBpbnQgYW5kIGNhbGxpbmcgR083MDA3SU9DX1NfQklUUkFURSB3aXRoIGEKKyAgICBwb2ludGVyIHRvIHRoZSBpbnQuICBUaGUgYml0cmF0ZSBtYXkgYmUgcXVlcmllZCBieSBjYWxsaW5nCisgICAgR083MDA3SU9DX0dfQklUUkFURSB3aXRoIGEgcG9pbnRlciB0byBhbiBpbnQgd2hlcmUgdGhlIGN1cnJlbnQgYml0cmF0ZQorICAgIHdpbGwgYmUgc3RvcmVkLgorCisgICAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHByaW1hcnkgbWVhbnMgb2YgY29udHJvbGxpbmcgdGhlIHZpZGVvIHF1YWxpdHkKKyAgICBmb3IgYWxsIGNvbXByZXNzaW9uIG1vZGVzLCBpbmNsdWRpbmcgVjRMMl9QSVhfRk1UX01KUEVHLiAgVGhlCisgICAgVklESU9DX1NfSlBFR0NPTVAgaW9jdGwgaXMgbm90IHN1cHBvcnRlZC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgSW5zdGFsbGluZyB0aGUgV0lTIFBDSSBWb3lhZ2VyIERyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBXSVMgUENJIFZveWFnZXIgZHJpdmVyIHJlcXVpcmVzIHNldmVyYWwgcGF0Y2hlcyB0byB0aGUgTGludXggMi42LjExLngKK2tlcm5lbCBzb3VyY2UgdHJlZSBiZWZvcmUgY29tcGlsaW5nIHRoZSBkcml2ZXIuICBUaGVzZSBwYXRjaGVzIHVwZGF0ZSB0aGUKK2luLWtlcm5lbCBTQUE3MTM0IGRyaXZlciB0byB0aGUgbmV3ZXN0IGRldmVsb3BtZW50IHZlcnNpb24gYW5kIHBhdGNoIGJ1Z3MKK2luIHRoZSBUREE4MjkwL1REQTgyNzUgdHVuZXIgZHJpdmVyLgorCitUaGUgZm9sbG93aW5nIHBhdGNoZXMgbXVzdCBiZSBkb3dubG9hZGVkIGZyb20gR2VyZCBLbm9ycidzIHdlYnNpdGUgYW5kCithcHBsaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQ6CisKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi9pMmMtdHVuZXIKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi9pMmMtdHVuZXIyCisJaHR0cDovL2RsLmJ5dGVzZXgub3JnL3BhdGNoZXMvMi42LjExLTIvdjRsMi1hcGktbXBlZworCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL3NhYTcxMzQtdXBkYXRlCisKK1RoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgaW5jbHVkZWQgd2l0aCB0aGlzIFNESyBhbmQgY2FuIGJlIGFwcGxpZWQgaW4gYW55CitvcmRlcjoKKworCXBhdGNoZXMvMi42LjExL3NhYTcxMzQtdm95YWdlci5kaWZmCisJcGF0Y2hlcy8yLjYuMTEvdGRhODI3NS1uZXdhZGRyLmRpZmYKKwlwYXRjaGVzLzIuNi4xMS90ZGE4MjkwLW50c2MuZGlmZgorCitDaGVjayB0byBtYWtlIHN1cmUgdGhlIENPTkZJR19WSURFT19TQUE3MTM0IG9wdGlvbiBpcyBlbmFibGVkIGluIHRoZSBrZXJuZWwKK2NvbmZpZ3VyYXRpb24sIGFuZCBidWlsZCBhbmQgaW5zdGFsbCB0aGUga2VybmVsLgorCitBZnRlciByZWJvb3RpbmcgaW50byB0aGUgbmV3IGtlcm5lbCwgdGhlIEdPNzAwNyBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIGFuZAoraW5zdGFsbGVkOgorCisJJCBtYWtlIFNBQTcxMzRfQlVJTEQ9eQorCSQgbWFrZSBpbnN0YWxsCisJJCBtb2Rwcm9iZSBzYWE3MTM0LWdvNzAwNworCitUaGVyZSB3aWxsIGJlIHR3byBWNEwgdmlkZW8gZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBDSSBWb3lhZ2VyLiAgVGhlCitmaXJzdCBkZXZpY2UgKG1vc3QgbGlrZWx5IC9kZXYvdmlkZW8wKSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHJhdyB2aWRlbworY2FwdHVyZSBtb2RlIG9mIHRoZSBTQUE3MTMzIGRldmljZSBhbmQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHNvdXJjZQordmlkZW8gcGFyYW1ldGVycyBhbmQgdHVuZSB0aGUgVFYgdHVuZXIuICBUaGlzIGRldmljZSBjYW4gYmUgdXNlZCB3aXRoIHhhd3R2CitvciBvdGhlciBWNEwoMikgdmlkZW8gc29mdHdhcmUgYXMgYSBzdGFuZGFyZCB1bmNvbXByZXNzZWQgZGV2aWNlLgorCitUaGUgc2Vjb25kIGRldmljZSAobW9zdCBsaWtlbHkgL2Rldi92aWRlbzEpIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKK2NvbXByZXNzaW9uIGZ1bmN0aW9ucyBvZiB0aGUgR083MDA3LiAgSXQgY2FuIGJlIHRlc3RlZCB1c2luZyB0aGUgZ29yZWNvcmQKK2FwcGxpY2F0aW9uIGluIHRoZSBhcHBzLyBkaXJlY3Rvcnkgb2YgdGhpcyBTREs6CisKKwkkIGFwcHMvZ29yZWNvcmQgLXZkZXZpY2UgL2Rldi92aWRlbzEgLW5vYXVkaW8gdGVzdC5hdmkKKworQ3VycmVudGx5IHRoZSBmcmFtZSByZXNvbHV0aW9uIGlzIGZpeGVkIGF0IDcyMHg0ODAgKE5UU0MpIG9yIDcyMHg1NzYgKFBBTCksCithbmQgdGhlIHZpZGVvIHN0YW5kYXJkIG11c3QgYmUgc3BlY2lmaWVkIHRvIGJvdGggdGhlIHJhdyBhbmQgdGhlIGNvbXByZXNzZWQKK3ZpZGVvIGRldmljZXMgKHhhd3R2IGFuZCBnb3JlY29yZCwgZm9yIGV4YW1wbGUpLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRUxFQVNFIE5PVEVTIEZPUiBXSVMgR083MDA3U0IgTElOVVggRFJJVkVSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGFzdCB1cGRhdGVkOiA1IE5vdmVtYmVyIDIwMDUKKworIC0gUmVsZWFzZSAwLjkuNyBpbmNsdWRlcyBuZXcgc3VwcG9ydCBmb3IgdXNpbmcgdWRldiB0byBydW4gZnhsb2FkLiAgVGhlCisgICBpbnN0YWxsIHNjcmlwdCBzaG91bGQgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgb2xkIGhvdHBsdWcKKyAgIHNjcmlwdHMgb3IgdGhlIG5ldyB1ZGV2IHJ1bGVzIHNob3VsZCBiZSB1c2VkLiAgVG8gZm9yY2UgdGhlIHVzZSBvZgorICAgaG90cGx1ZywgcnVuICJtYWtlIGluc3RhbGwgVVNFX1VERVY9biIuICBUbyBmb3JjZSB0aGUgdXNlIG9mIHVkZXYsIHJ1bgorICAgIm1ha2UgaW5zdGFsbCBVU0VfVURFVj15Ii4KKworIC0gTW90aW9uIGRldGVjdGlvbiBpcyBzdXBwb3J0ZWQgYnV0IHVuZG9jdW1lbnRlZC4gIFRyeSB0aGUgYG1vZGV0YCBhcHAKKyAgIGZvciBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSB0aGUgZmFjaWxpdHkuCisKKyAtIFVzaW5nIFVTQjIuMCBkZXZpY2VzIHN1Y2ggYXMgdGhlIFRWNDAyVSB3aXRoIFVTQjEuMSBIQ0RzIG9yIGh1YnMgY2FuCisgICBjYXVzZSBidWZmZXIgb3ZlcnJ1bnMgYW5kIGZyYW1lIGRyb3BzLCBldmVuIGF0IGxvdyBmcmFtZXJhdGVzLCBkdWUgdG8KKyAgIGluY29uc2lzdGVuY3kgaW4gdGhlIGJpdHJhdGUgY29udHJvbCBtZWNoYW5pc20uCisKKyAtIE9uIGRldmljZXMgd2l0aCBhbiBTQUE3MTE1LCBpbmNsdWRpbmcgdGhlIFBsZXh0b3IgQ29udmVydFgsIHZpZGVvIGhlaWdodAorICAgdmFsdWVzIG9mIDk2LCAxMjgsIDE2MCwgMTkyLCAyNTYsIDMyMCwgYW5kIDM4NCBkbyBub3Qgd29yayBpbiBOVFNDIG1vZGUuCisgICBBbGwgdmFsaWQgaGVpZ2h0cyB1cCB0byA1MTIgd29yayBjb3JyZWN0bHkgaW4gUEFMIG1vZGUuCisKKyAtIFRoZSBXSVMgU3RhciBUcmVrIGFuZCBQQ0kgVm95YWdlciBib2FyZHMgaGF2ZSBubyBzdXBwb3J0IHlldCBmb3IgYXVkaW8KKyAgIG9yIHRoZSBUViB0dW5lci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY4NDVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jCkBAIC0wLDAgKzEsNjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFNlbnNvcmF5IENvbXBhbnkgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlICJnbzcwMDctcHJpdi5oIgorI2luY2x1ZGUgIndpcy1pMmMuaCIKKworZXh0ZXJuIGludCBzMjI1MGxvYWRlcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgczIyNTBsb2FkZXJfY2xlYW51cCh2b2lkKTsKKworI2RlZmluZSBUTFYzMjBfQUREUkVTUyAgICAgIDB4MzQKKyNkZWZpbmUgUzIyNTBfVklEREVDICAgICAgICAweDg2CisjZGVmaW5lIFZQWDMyMl9BRERSX0FOQUxPR0NPTlRST0wxCTB4MDIKKyNkZWZpbmUgVlBYMzIyX0FERFJfQlJJR0hUTkVTUzAJCTB4MDEyNworI2RlZmluZSBWUFgzMjJfQUREUl9CUklHSFRORVNTMQkJMHgwMTMxCisjZGVmaW5lIFZQWDMyMl9BRERSX0NPTlRSQVNUMAkJMHgwMTI4CisjZGVmaW5lIFZQWDMyMl9BRERSX0NPTlRSQVNUMQkJMHgwMTMyCisjZGVmaW5lIFZQWDMyMl9BRERSX0hVRQkJCTB4MDBkYworI2RlZmluZSBWUFgzMjJfQUREUl9TQVQJIAkgICAgICAgIDB4MDAzMAorCitzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCB7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnbzcwMDdfYm9hcmRfaW5mbyBtYWluX2luZm87Cit9OworCitzdHJ1Y3QgZ283MDA3X3VzYiB7CisJc3RydWN0IGdvNzAwN191c2JfYm9hcmQgKmJvYXJkOworCXN0cnVjdCBzZW1hcGhvcmUgaTJjX2xvY2s7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwlzdHJ1Y3QgdXJiICp2aWRlb191cmJzWzhdOworCXN0cnVjdCB1cmIgKmF1ZGlvX3VyYnNbOF07CisJc3RydWN0IHVyYiAqaW50cl91cmI7Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdWRfcmVnc1tdID0geworCTB4MWUsIDB4MDAsCisJMHgwMCwgMHgxNywKKwkweDAyLCAweDE3LAorCTB4MDQsIDB4ZjksCisJMHgwNiwgMHhmOSwKKwkweDA4LCAweDAyLAorCTB4MGEsIDB4MDAsCisJMHgwYywgMHgwMCwKKwkweDBhLCAweDAwLAorCTB4MGMsIDB4MDAsCisJMHgwZSwgMHgwMiwKKwkweDEwLCAweDAwLAorCTB4MTIsIDB4MDEsCisJMHgwMCwgMHgwMCwKK307CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdmlkX3JlZ3NbXSA9IHsKKwkweEYyLCAweDBmLAorCTB4QUEsIDB4MDAsCisJMHhGOCwgMHhmZiwKKwkweDAwLCAweDAwLAorfTsKKworc3RhdGljIHUxNiB2aWRfcmVnc19mcFtdID0geworCTB4MDI4LCAweDA2NywKKwkweDEyMCwgMHgwMTYsCisJMHgxMjEsIDB4Y0YyLAorCTB4MTIyLCAweDBGMiwKKwkweDEyMywgMHgwMGMsCisJMHgxMjQsIDB4MmQwLAorCTB4MTI1LCAweDJlMCwKKwkweDEyNiwgMHgwMDQsCisJMHgxMjgsIDB4MUUwLAorCTB4MTJBLCAweDAxNiwKKwkweDEyQiwgMHgwRjIsCisJMHgxMkMsIDB4MEYyLAorCTB4MTJELCAweDAwYywKKwkweDEyRSwgMHgyZDAsCisJMHgxMkYsIDB4MmUwLAorCTB4MTMwLCAweDAwNCwKKwkweDEzMiwgMHgxRTAsCisJMHgxNDAsIDB4MDYwLAorCTB4MTUzLCAweDAwQywKKwkweDE1NCwgMHgyMDAsCisJMHgxNTAsIDB4ODAxLAorCTB4MDAwLCAweDAwMAorfTsKKworLyogUEFMIHNwZWNpZmljIHZhbHVlcyAqLworc3RhdGljIHUxNiB2aWRfcmVnc19mcF9wYWxbXSA9Cit7CisJMHgxMjAsIDB4MDE3LAorCTB4MTIxLCAweGQyMiwKKwkweDEyMiwgMHgxMjIsCisJMHgxMkEsIDB4MDE3LAorCTB4MTJCLCAweDEyMiwKKwkweDEyQywgMHgxMjIsCisJMHgxNDAsIDB4MDYwLAorCTB4MDAwLCAweDAwMCwKK307CisKK3N0cnVjdCBzMjI1MCB7CisJaW50IHN0ZDsKKwlpbnQgaW5wdXQ7CisJaW50IGJyaWdodG5lc3M7CisJaW50IGNvbnRyYXN0OworCWludCBzYXR1cmF0aW9uOworCWludCBodWU7CisJaW50IHJlZzEyYl92YWw7CisJaW50IGF1ZGlvX2lucHV0OworfTsKKworLyogZnJvbSBnbzcwMDctdXNiLmMgd2hpY2ggaXMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgTWljcm9uYXMgVVNBIEluYy4qLworc3RhdGljIGludCBnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgcmVxdWVzdCwKKwl1MTYgdmFsdWUsIHUxNiBpbmRleCwgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgbGVuZ3RoLCBpbnQgaW4pCit7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwlpbnQgdGltZW91dCA9IDUwMDA7CisKKwlpZiAoaW4pIHsKKwkJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1c2ItPnVzYmRldiwKKwkJCQl1c2JfcmN2Y3RybHBpcGUodXNiLT51c2JkZXYsIDApLCByZXF1ZXN0LAorCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAorCQkJCXZhbHVlLCBpbmRleCwgdHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgsIHRpbWVvdXQpOworCX0gZWxzZSB7CisJCXJldHVybiB1c2JfY29udHJvbF9tc2codXNiLT51c2JkZXYsCisJCQkJdXNiX3NuZGN0cmxwaXBlKHVzYi0+dXNiZGV2LCAwKSwgcmVxdWVzdCwKKwkJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJCXZhbHVlLCBpbmRleCwgdHJhbnNmZXJfYnVmZmVyLCBsZW5ndGgsIHRpbWVvdXQpOworCX0KK30KKy8qIGVuZCBmcm9tIGdvNzAwNy11c2IuYyB3aGljaCBpcyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNyb25hcyBVU0EgSW5jLiovCisKK3N0YXRpYyBpbnQgd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggdmFsdWUpCit7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwlpbnQgcmM7CisJaW50IGRldl9hZGRyID0gY2xpZW50LT5hZGRyOworCXU4ICpidWY7CisKKwlpZiAoZ28gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZ28tPnN0YXR1cyA9PSBTVEFUVVNfU0hVVERPV04pCisJCXJldHVybiAtRUJVU1k7CisKKwlidWYgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNiLT5pMmNfbG9jaykgIT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJpMmMgbG9jayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlRSOworCX0KKwlyYyA9IGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NTUsIGRldl9hZGRyLAorCQkJCSAgICAgICAocmVnPDw4IHwgdmFsdWUpLAorCQkJCSAgICAgICBidWYsCisJCQkJICAgICAgIDE2LCAxKTsKKworCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwlrZnJlZShidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3cml0ZV9yZWdfZnAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHUxNiB2YWwpCit7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKwl1OCAqYnVmOworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoZ28gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZ28tPnN0YXR1cyA9PSBTVEFUVVNfU0hVVERPV04pCisJCXJldHVybiAtRUJVU1k7CisKKwlidWYgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCisJbWVtc2V0KGJ1ZiwgMHhjZCwgNik7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImkyYyBsb2NrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVFI7CisJfQorCWlmIChnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDU3LCBhZGRyLCB2YWwsIGJ1ZiwgMTYsIDEpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1cCgmdXNiLT5pMmNfbG9jayk7CisJaWYgKGJ1ZlswXSA9PSAwKSB7CisJCXVuc2lnbmVkIGludCBzdWJhZGRyLCB2YWxfcmVhZDsKKworCQlzdWJhZGRyID0gKGJ1Zls0XSA8PCA4KSArIGJ1Zls1XTsKKwkJdmFsX3JlYWQgPSAoYnVmWzJdIDw8IDgpICsgYnVmWzNdOworCQlpZiAodmFsX3JlYWQgIT0gdmFsKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpbnZhbGlkIGZwIHdyaXRlICV4ICV4XG4iLAorCQkJICAgICAgIHZhbF9yZWFkLCB2YWwpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHN1YmFkZHIgIT0gYWRkcikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW52YWxpZCBmcCB3cml0ZSBhZGRyICV4ICV4XG4iLAorCQkJICAgICAgIHN1YmFkZHIsIGFkZHIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBzYXZlIGxhc3QgMTJiIHZhbHVlICovCisJaWYgKGFkZHIgPT0gMHgxMmIpCisJCWRlYy0+cmVnMTJiX3ZhbCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKnJlZ3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAhKChyZWdzW2ldID09IDB4MDApICYmIChyZWdzW2krMV0gPT0gMHgwMCkpOyBpICs9IDIpIHsKKwkJaWYgKHdyaXRlX3JlZyhjbGllbnQsIHJlZ3NbaV0sIHJlZ3NbaSsxXSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJzMjI1MDogZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9yZWdzX2ZwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICEoKHJlZ3NbaV0gPT0gMHgwMCkgJiYgKHJlZ3NbaSsxXSA9PSAweDAwKSk7IGkgKz0gMikgeworCQlpZiAod3JpdGVfcmVnX2ZwKGNsaWVudCwgcmVnc1tpXSwgcmVnc1tpKzFdKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmYWlsZWQgZnBcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgczIyNTBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgczIyNTAgKmRlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCXsKKwkJaW50IHZpZHN5czsKKwkJaW50ICppbnB1dCA9IGFyZzsKKworCQl2aWRzeXMgPSAoZGVjLT5zdGQgPT0gVjRMMl9TVERfTlRTQykgPyAweDAxIDogMHgwMDsKKwkJaWYgKCppbnB1dCA9PSAwKSB7CisJCQkvKiBjb21wb3NpdGUgKi8KKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDIwIHwgdmlkc3lzKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjYyKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0gZWxzZSB7CisJCQkvKiBTLVZpZGVvICovCisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDA0MCB8IHZpZHN5cyk7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIxLCAweDY2Nik7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOworCQl9CisJCWRlYy0+aW5wdXQgPSAqaW5wdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCXUxNiB2aWRzb3VyY2U7CisKKwkJdmlkc291cmNlID0gKGRlYy0+aW5wdXQgPT0gMSkgPyAweDA0MCA6IDB4MDIwOworCQlkZWMtPnN0ZCA9ICpzdGQ7CisJCXN3aXRjaCAoZGVjLT5zdGQpIHsKKwkJY2FzZSBWNEwyX1NURF9OVFNDOgorCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIHZpZHNvdXJjZSB8IDEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9TVERfUEFMOgorCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKTsKKwkJCXdyaXRlX3JlZ3NfZnAoY2xpZW50LCB2aWRfcmVnc19mcF9wYWwpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgdmlkc291cmNlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKKwkJc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7CisJCQlWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJVjRMMl9DSURfQ09OVFJBU1QsCisJCQlWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkJVjRMMl9DSURfSFVFLAorCQkJMAorCQl9OworCQlzdGF0aWMgY29uc3QgdTMyICpjdHJsX2NsYXNzZXNbXSA9IHsKKwkJCXVzZXJfY3RybHMsCisJCQlOVUxMCisJCX07CisKKwkJY3RybC0+aWQgPSB2NGwyX2N0cmxfbmV4dChjdHJsX2NsYXNzZXMsIGN0cmwtPmlkKTsKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwgMCwgMTAwLCAxLCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwgMCwgMTAwLCAxLCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAtNTAsIDUwLCAxLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3RybC0+bmFtZVswXSA9ICdcMCc7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKwkJaW50IHZhbHVlMTsKKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmdXR1cmUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmdXR1cmUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQlpZiAoY3RybC0+dmFsdWUgPiAxMjcpCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gMTI3OworCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAwKQorCQkJCWRlYy0+c2F0dXJhdGlvbiA9IDA7CisJCQllbHNlCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gY3RybC0+dmFsdWU7CisKKwkJCXZhbHVlMSA9IGRlYy0+c2F0dXJhdGlvbiAqIDQxNDAgLyAxMDA7CisJCQlpZiAodmFsdWUxID4gNDA5NCkKKwkJCQl2YWx1ZTEgPSA0MDk0OworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfU0FULCB2YWx1ZTEpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJaWYgKGN0cmwtPnZhbHVlID4gNTApCisJCQkJZGVjLT5odWUgPSA1MDsKKwkJCWVsc2UgaWYgKGN0cmwtPnZhbHVlIDwgLTUwKQorCQkJCWRlYy0+aHVlID0gLTUwOworCQkJZWxzZQorCQkJCWRlYy0+aHVlID0gY3RybC0+dmFsdWU7CisJCQkvKiBjbGFtcCB0aGUgaHVlIHJhbmdlICovCisJCQl2YWx1ZTEgPSBkZWMtPmh1ZSAqIDI4MCAvIDUwOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgVlBYMzIyX0FERFJfSFVFLCB2YWx1ZTEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisKKwkJc3dpdGNoIChjdHJsLT5pZCkgeworCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+YnJpZ2h0bmVzczsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPmNvbnRyYXN0OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWN0cmwtPnZhbHVlID0gZGVjLT5zYXR1cmF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPmh1ZTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOworCQlpZiAoZm10LT5mbXQucGl4LmhlaWdodCA8IDY0MCkgeworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxMmIsIGRlYy0+cmVnMTJiX3ZhbCB8IDB4NDAwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDEyYiwgZGVjLT5yZWcxMmJfdmFsICYgfjB4NDAwKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0dfQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8gPSBhcmc7CisKKwkJbWVtc2V0KGF1ZGlvLCAwLCBzaXplb2YoKmF1ZGlvKSk7CisJCWF1ZGlvLT5pbmRleCA9IGRlYy0+YXVkaW9faW5wdXQ7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCX0KKwljYXNlIFZJRElPQ19FTlVNQVVESU86CisJeworCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8gPSBhcmc7CisKKwkJc3dpdGNoIChhdWRpby0+aW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTGluZSBJbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXN0cmNweShhdWRpby0+bmFtZSwgIk1pYyIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0cmNweShhdWRpby0+bmFtZSwgIk1pYyBCb29zdCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhdWRpby0+bmFtZVswXSA9ICdcMCc7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdWRpby0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwkJYXVkaW8tPm1vZGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQljbGllbnQtPmFkZHIgPSBUTFYzMjBfQUREUkVTUzsKKwkJc3dpdGNoIChhdWRpby0+aW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJd3JpdGVfcmVnKGNsaWVudCwgMHgwOCwgMHgwMik7IC8qIExpbmUgSW4gKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDA0KTsgLyogTWljICovCisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJd3JpdGVfcmVnKGNsaWVudCwgMHgwOCwgMHgwNSk7IC8qIE1pYyBCb29zdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZWMtPmF1ZGlvX2lucHV0ID0gYXVkaW8tPmluZGV4OworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJzMjI1MDogdW5rbm93biBjb21tYW5kIDB4JXhcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHMyMjUwX2RyaXZlcjsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IHMyMjUwX2NsaWVudF90ZW1wbCA9IHsKKwkubmFtZQkJPSAiU2Vuc29yYXkgMjI1MCIsCisJLmRyaXZlcgkJPSAmczIyNTBfZHJpdmVyLAorfTsKKworc3RhdGljIGludCBzMjI1MF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgczIyNTAgKmRlYzsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7CisJc3RydWN0IGdvNzAwN191c2IgKnVzYiA9IGdvLT5ocGlfY29udGV4dDsKKworCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoY2xpZW50LCAmczIyNTBfY2xpZW50X3RlbXBsLAorCSAgICAgICBzaXplb2YoczIyNTBfY2xpZW50X3RlbXBsKSk7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKworCWRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzMjI1MCksIEdGUF9LRVJORUwpOworCWlmIChkZWMgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZWMtPnN0ZCA9IFY0TDJfU1REX05UU0M7CisJZGVjLT5icmlnaHRuZXNzID0gNTA7CisJZGVjLT5jb250cmFzdCA9IDUwOworCWRlYy0+c2F0dXJhdGlvbiA9IDUwOworCWRlYy0+aHVlID0gMDsKKwljbGllbnQtPmFkZHIgPSBUTFYzMjBfQUREUkVTUzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWMpOworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgInMyMjUwOiBpbml0aWFsaXppbmcgdmlkZW8gZGVjb2RlciBvbiAlc1xuIiwKKwkgICAgICAgYWRhcHRlci0+bmFtZSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBhdWRpbyAqLworCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCWlmICh3cml0ZV9yZWdzKGNsaWVudCwgYXVkX3JlZ3MpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzMjI1MDogZXJyb3IgaW5pdGlhbGl6aW5nIGF1ZGlvXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsaWVudC0+YWRkciA9IFMyMjUwX1ZJRERFQzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkZWMpOworCisJaWYgKHdyaXRlX3JlZ3MoY2xpZW50LCB2aWRfcmVncykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInMyMjUwOiBlcnJvciBpbml0aWFsaXppbmcgZGVjb2RlclxuIik7CisJCWtmcmVlKGNsaWVudCk7CisJCWtmcmVlKGRlYyk7CisJCXJldHVybiAwOworCX0KKwlpZiAod3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBkZWNvZGVyXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgKi8KKwkvKiBjb21wb3NpdGUgKi8KKwl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCAweDAyMCB8IDEpOworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjYyKTsKKwl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDE0MCwgMHgwNjApOworCisJLyogc2V0IGRlZmF1bHQgYXVkaW8gaW5wdXQgKi8KKwlkZWMtPmF1ZGlvX2lucHV0ID0gMDsKKwl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDAyKTsgLyogTGluZSBJbiAqLworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNiLT5pMmNfbG9jaykgPT0gMCkgeworCQlkYXRhID0ga3phbGxvYygxNiwgR0ZQX0tFUk5FTCk7CisJCWlmIChkYXRhICE9IE5VTEwpIHsKKwkJCWludCByYzsKKwkJCXJjID0gZ283MDA3X3VzYl92ZW5kb3JfcmVxdWVzdChnbywgMHg0MSwgMCwgMCwKKwkJCQkJCSAgICAgICBkYXRhLCAxNiwgMSk7CisJCQlpZiAocmMgPiAwKSB7CisJCQkJdTggbWFzazsKKwkJCQlkYXRhWzBdID0gMDsKKwkJCQltYXNrID0gMTw8NTsKKwkJCQlkYXRhWzBdICY9IH5tYXNrOworCQkJCWRhdGFbMV0gfD0gbWFzazsKKwkJCQlnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDQwLCAwLAorCQkJCQkJCSAgKGRhdGFbMV08PDgpCisJCQkJCQkJICArIGRhdGFbMV0sCisJCQkJCQkJICBkYXRhLCAxNiwgMCk7CisJCQl9CisJCQlrZnJlZShkYXRhKTsKKwkJfQorCQl1cCgmdXNiLT5pMmNfbG9jayk7CisJfQorCisJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlwcmludGsoInMyMjUwOiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMyMjUwX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHI7CisKKwlyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJa2ZyZWUoY2xpZW50KTsKKwlrZnJlZShkZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczIyNTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIlNlbnNvcmF5IDIyNTAgYm9hcmQgZHJpdmVyIiwKKwl9LAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUzIyNTAsCisJLmRldGFjaF9jbGllbnQJPSBzMjI1MF9kZXRhY2gsCisJLmNvbW1hbmQJPSBzMjI1MF9jb21tYW5kLAorfTsKKworc3RhdGljIGludCBfX2luaXQgczIyNTBfaW5pdCh2b2lkKQoreworCWludCByOworCisJciA9IHMyMjUwbG9hZGVyX2luaXQoKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJciA9IGkyY19hZGRfZHJpdmVyKCZzMjI1MF9kcml2ZXIpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJcmV0dXJuIHdpc19pMmNfYWRkX2RyaXZlcihzMjI1MF9kcml2ZXIuaWQsIHMyMjUwX2RldGVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzMjI1MF9jbGVhbnVwKHZvaWQpCit7CisJd2lzX2kyY19kZWxfZHJpdmVyKHMyMjUwX2RldGVjdCk7CisJaTJjX2RlbF9kcml2ZXIoJnMyMjUwX2RyaXZlcik7CisKKwlzMjI1MGxvYWRlcl9jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KHMyMjUwX2luaXQpOworbW9kdWxlX2V4aXQoczIyNTBfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCb2FyZCBkcml2ZXIgZm9yIFNlbnNvcnlyYXkgMjI1MCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvczIyNTAtbG9hZGVyLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2Vuc29yYXkgQ29tcGFueSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxkdmItdXNiLmg+CisKKyNkZWZpbmUgUzIyNTBfTE9BREVSX0ZJUk1XQVJFCSJzMjI1MF9sb2FkZXIuZnciCisjZGVmaW5lIFMyMjUwX0ZJUk1XQVJFCQkiczIyNTAuZnciCisKK3R5cGVkZWYgc3RydWN0IGRldmljZV9leHRlbnNpb25fcyB7CisgICAgc3RydWN0IGtyZWYgICAgIGtyZWY7CisgICAgaW50IG1pbm9yOworICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7Cit9IGRldmljZV9leHRlbnNpb25fdCwgKnBkZXZpY2VfZXh0ZW5zaW9uX3Q7CisKKyNkZWZpbmUgVVNCX3MyMjUwbG9hZGVyX01BSk9SIDI0MAorI2RlZmluZSBVU0JfczIyNTBsb2FkZXJfTUlOT1JfQkFTRSAwCisjZGVmaW5lIE1BWF9ERVZJQ0VTIDI1NgorCitzdGF0aWMgcGRldmljZV9leHRlbnNpb25fdCBzMjI1MF9kZXZfdGFibGVbTUFYX0RFVklDRVNdOworc3RhdGljIERFQ0xBUkVfTVVURVgoczIyNTBfZGV2X3RhYmxlX211dGV4KTsKKworI2RlZmluZSB0b19zMjI1MGxvYWRlcl9kZXZfY29tbW9uKGQpIGNvbnRhaW5lcl9vZihkLCBkZXZpY2VfZXh0ZW5zaW9uX3QsIGtyZWYpCitzdGF0aWMgdm9pZCBzMjI1MGxvYWRlcl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gdG9fczIyNTBsb2FkZXJfZGV2X2NvbW1vbihrcmVmKTsKKwlzMjI1MF9kZXZfdGFibGVbcy0+bWlub3JdID0gTlVMTDsKKwlrZnJlZShzKTsKK30KKworc3RhdGljIGludCBzMjI1MGxvYWRlcl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCWludCBtaW5vciwgcmV0OworCXBkZXZpY2VfZXh0ZW5zaW9uX3QgcyA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKworCXVzYmRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJaWYgKCF1c2JkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFbnRlciBzMjI1MGxvYWRlcl9wcm9iZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkVudGVyIHMyMjUwbG9hZGVyX3Byb2JlIDIuNiBrZXJuZWxcbiIpOworCXByaW50ayhLRVJOX0lORk8gInZlbmRvciBpZCAweCV4LCBkZXZpY2UgaWQgMHgleCBkZXZudW06JWRcbiIsCisJICAgdXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yLCB1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0LAorCSAgIHVzYmRldi0+ZGV2bnVtKTsKKworCWlmICh1c2JkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBoYW5kbGUgbXVsdGlwbGUgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkb3duKCZzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworCisJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgTUFYX0RFVklDRVM7IG1pbm9yKyspIHsKKwkJaWYgKHMyMjUwX2Rldl90YWJsZVttaW5vcl0gPT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKworCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPj0gTUFYX0RFVklDRVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1pbm9yOiAlZFxuIiwgbWlub3IpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBkZXYgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlzID0ga21hbGxvYyhzaXplb2YoZGV2aWNlX2V4dGVuc2lvbl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJczIyNTBfZGV2X3RhYmxlW21pbm9yXSA9IHM7CisKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9wcm9iZTogRGV2aWNlICVkIG9uIEJ1cyAlZCBNaW5vciAlZFxuIiwKKwkJdXNiZGV2LT5kZXZudW0sIHVzYmRldi0+YnVzLT5idXNudW0sIG1pbm9yKTsKKworCW1lbXNldChzLCAwLCBzaXplb2YoZGV2aWNlX2V4dGVuc2lvbl90KSk7CisJcy0+dXNiZGV2ID0gdXNiZGV2OworCXByaW50ayhLRVJOX0lORk8gImxvYWRpbmcgMjI1MCBsb2FkZXJcbiIpOworCisJa3JlZl9pbml0KCYocy0+a3JlZikpOworCisJdXAoJnMyMjUwX2Rldl90YWJsZV9tdXRleCk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIFMyMjUwX0xPQURFUl9GSVJNV0FSRSwgJnVzYmRldi0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJzMjI1MDogdW5hYmxlIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBmaWxlIFwiJXNcIlxuIiwKKwkJCVMyMjUwX0xPQURFUl9GSVJNV0FSRSk7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1c2JkZXYsIGZ3LCBDWVBSRVNTX0ZYMik7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAibG9hZGVyIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIFMyMjUwX0ZJUk1XQVJFLCAmdXNiZGV2LT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJInMyMjUwOiB1bmFibGUgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGZpbGUgXCIlc1wiXG4iLAorCQkJUzIyNTBfRklSTVdBUkUpOworCQlnb3RvIGZhaWxlZDI7CisJfQorCXJldCA9IHVzYl9jeXByZXNzX2xvYWRfZmlybXdhcmUodXNiZGV2LCBmdywgQ1lQUkVTU19GWDIpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWlmICgwICE9IHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZpcm13YXJlX3MyMjUwIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgcyk7CisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwl1cCgmczIyNTBfZGV2X3RhYmxlX211dGV4KTsKK2ZhaWxlZDI6CisJaWYgKHMpCisJCWtyZWZfcHV0KCYocy0+a3JlZiksIHMyMjUwbG9hZGVyX2RlbGV0ZSk7CisKKwlwcmludGsoS0VSTl9FUlIgInByb2JlIGZhaWxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBzMjI1MGxvYWRlcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBkaXNjb25uZWN0XG4iKTsKKwlsb2NrX2tlcm5lbCgpOworCXMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCWtyZWZfcHV0KCYocy0+a3JlZiksIHMyMjUwbG9hZGVyX2RlbGV0ZSk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgczIyNTBsb2FkZXJfaWRzW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgxOTQzLCAweGEyNTApfSwKKwl7fSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzMjI1MGxvYWRlcl9pZHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgczIyNTBsb2FkZXJfZHJpdmVyID0geworCS5uYW1lCQk9ICJzMjI1MC1sb2FkZXIiLAorCS5wcm9iZQkJPSBzMjI1MGxvYWRlcl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHMyMjUwbG9hZGVyX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gczIyNTBsb2FkZXJfaWRzLAorfTsKKworaW50IHMyMjUwbG9hZGVyX2luaXQodm9pZCkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgaSsrKQorCQlzMjI1MF9kZXZfdGFibGVbaV0gPSBOVUxMOworCisJciA9IHVzYl9yZWdpc3RlcigmczIyNTBsb2FkZXJfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcmludGsoS0VSTl9FUlIgInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9pbml0OiBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHMyMjUwbG9hZGVyX2luaXQpOworCit2b2lkIHMyMjUwbG9hZGVyX2NsZWFudXAodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzMjI1MGxvYWRlcl9jbGVhbnVwXG4iKTsKKwl1c2JfZGVyZWdpc3RlcigmczIyNTBsb2FkZXJfZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0woczIyNTBsb2FkZXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKaW5kZXggYzRhNmQ4ZS4uNjY1YmJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjaW5jbHVkZSAic2FhNzEzNC1yZWcuaCIKICNpbmNsdWRlICJzYWE3MTM0LmgiCkBAIC0zMTQsNyArMzE0LDEzIEBACiBzdGF0aWMgaW50IHNhYTcxMzRfZ283MDA3X3N0cmVhbV9zdG9wKHN0cnVjdCBnbzcwMDcgKmdvKQogewogCXN0cnVjdCBzYWE3MTM0X2dvNzAwNyAqc2FhID0gZ28tPmhwaV9jb250ZXh0OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gc2FhLT5kZXY7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXY7CisKKwlpZiAoIXNhYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2ID0gc2FhLT5kZXY7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogU2h1dCBkb3duIFRTIEZJRk8gKi8KIAlzYWFfY2xlYXJsKFNBQTcxMzRfTUFJTl9DVFJMLCBTQUE3MTM0X01BSU5fQ1RSTF9URTUpOwpAQCAtMzczLDYgKzM3OSw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNhYTcxMzRfZ283MDA3X3NlbmRfY29tbWFuZChzdHJ1Y3QgZ283MDA3ICpnbywgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJdm9pZCAqYXJnKQoreworCXN0cnVjdCBzYWE3MTM0X2dvNzAwNyAqc2FhID0gZ28tPmhwaV9jb250ZXh0OworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gc2FhLT5kZXY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJcmV0dXJuIHNhYTcxMzRfc19zdGRfaW50ZXJuYWwoZGV2LCBOVUxMLCBzdGQpOworCX0KKwljYXNlIFZJRElPQ19HX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCSpzdGQgPSBkZXYtPnR2bm9ybS0+aWQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfcXVlcnljdHJsKE5VTEwsIE5VTEwsIGN0cmwpOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpZiAoVjRMMl9DVFJMX0lEMkNMQVNTKGN0cmwtPmlkKSA9PSBWNEwyX0NUUkxfQ0xBU1NfVVNFUikKKwkJCXJldHVybiBzYWE3MTM0X2dfY3RybF9pbnRlcm5hbChkZXYsIE5VTEwsIGN0cmwpOworCX0KKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpZiAoVjRMMl9DVFJMX0lEMkNMQVNTKGN0cmwtPmlkKSA9PSBWNEwyX0NUUkxfQ0xBU1NfVVNFUikKKwkJCXJldHVybiBzYWE3MTM0X3NfY3RybF9pbnRlcm5hbChkZXYsIE5VTEwsIGN0cmwpOworCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7CisKK30KKwogc3RhdGljIHN0cnVjdCBnbzcwMDdfaHBpX29wcyBzYWE3MTM0X2dvNzAwN19ocGlfb3BzID0gewogCS5pbnRlcmZhY2VfcmVzZXQJPSBzYWE3MTM0X2dvNzAwN19pbnRlcmZhY2VfcmVzZXQsCiAJLndyaXRlX2ludGVycnVwdAk9IHNhYTcxMzRfZ283MDA3X3dyaXRlX2ludGVycnVwdCwKQEAgLTM4MCw2ICs0MjcsNyBAQAogCS5zdHJlYW1fc3RhcnQJCT0gc2FhNzEzNF9nbzcwMDdfc3RyZWFtX3N0YXJ0LAogCS5zdHJlYW1fc3RvcAkJPSBzYWE3MTM0X2dvNzAwN19zdHJlYW1fc3RvcCwKIAkuc2VuZF9maXJtd2FyZQkJPSBzYWE3MTM0X2dvNzAwN19zZW5kX2Zpcm13YXJlLAorCS5zZW5kX2NvbW1hbmQJCT0gc2FhNzEzNF9nbzcwMDdfc2VuZF9jb21tYW5kLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKiBBZGQvcmVtb3ZlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1pMmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCmluZGV4IDk5M2Y2NTguLjQzMWY0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lCUkyQ19EUklWRVJJRF9XSVNfU0FBNzExMwkweGYwZjQKICNkZWZpbmUJSTJDX0RSSVZFUklEX1dJU19PVjc2NDAJCTB4ZjBmNQogI2RlZmluZQlJMkNfRFJJVkVSSURfV0lTX1RXMjgwNAkJMHhmMGY2CisjZGVmaW5lCUkyQ19EUklWRVJJRF9TMjI1MAkJMHhmMGY3CiAjZGVmaW5lCUkyQ19BTEdPX0dPNzAwNwkJCTB4ZjAwMDAwCiAjZGVmaW5lCUkyQ19BTEdPX0dPNzAwN19VU0IJCTB4ZjEwMDAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYwppbmRleCA1YTkxZWU0Li41OGZkZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCkBAIC02MDQsNyArNjA0LDcgQEAKIAl7CiAJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW4gPSBhcmc7CiAKLQkJbWVtc2V0KHQsIDAsIHNpemVvZigqdHVuKSk7CisJCW1lbXNldCh0dW4sIDAsIHNpemVvZigqdHVuKSk7CiAJCXN0cmNweSh0dW4tPm5hbWUsICJUZWxldmlzaW9uIik7CiAJCXR1bi0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQl0dW4tPnJhbmdlbG93ID0gMFVMOyAvKiBkb2VzIGFueXRoaW5nIHVzZSB0aGVzZT8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWU0MDAwL21lNDAwMC5jCmluZGV4IDAzOTRlMjcuLmUxYzRhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYwpAQCAtNTM2LDI1ICs1MzYsMTkgQEAKIAogc3RhdGljIHZvaWQgY2xlYXJfYm9hcmRfaW5mb19saXN0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYm9hcmRfcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpkYWNfcDsKLQlzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm87Ci0Jc3RydWN0IG1lNDAwMF9hb19jb250ZXh0ICphb19jb250ZXh0OworCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbywgKmJvYXJkX2luZm9fc2FmZTsKKwlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQsICphb19jb250ZXh0X3NhZmU7CiAKIAkvKiBDbGVhciBjb250ZXh0IGxpc3RzICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgYm9hcmRfcCAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgYm9hcmRfcCA9IGJvYXJkX3AtPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCS8qIENsZWFyIGFuYWxvZyBvdXRwdXQgY29udGV4dCBsaXN0ICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSkgewotCQkJZGFjX3AgPSBib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QubmV4dDsKLQkJCWFvX2NvbnRleHQgPQotCQkJICAgIGxpc3RfZW50cnkoZGFjX3AsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhb19jb250ZXh0LCBhb19jb250ZXh0X3NhZmUsCisJCQkJJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCwgbGlzdCkgewogCQkJbWU0MDAwX2FvX3Jlc2V0KGFvX2NvbnRleHQpOwogCQkJZnJlZV9pcnEoYW9fY29udGV4dC0+aXJxLCBhb19jb250ZXh0KTsKIAkJCWlmIChhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpCiAJCQkJa2ZyZWUoYW9fY29udGV4dC0+Y2lyY19idWYuYnVmKTsKLQkJCWxpc3RfZGVsKGRhY19wKTsKKwkJCWxpc3RfZGVsKCZhb19jb250ZXh0LT5saXN0KTsKIAkJCWtmcmVlKGFvX2NvbnRleHQpOwogCQl9CiAKQEAgLTU3NCwxMSArNTY4LDEwIEBACiAJfQogCiAJLyogQ2xlYXIgdGhlIGJvYXJkIGluZm8gbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkpIHsKLQkJYm9hcmRfcCA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9hcmRfaW5mbywgYm9hcmRfaW5mb19zYWZlLAorCQkJJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhib2FyZF9pbmZvLT5wY2lfZGV2X3ApOwotCQlsaXN0X2RlbChib2FyZF9wKTsKKwkJbGlzdF9kZWwoJmJvYXJkX2luZm8tPmxpc3QpOwogCQlrZnJlZShib2FyZF9pbmZvKTsKIAl9CiB9CkBAIC02NjMsMTYgKzY1NiwxNyBAQAogCX0KIAogCS8qIEdldCB0aGUgaW5kZXggb2YgdGhlIGJvYXJkIGluIHRoZSBnbG9iYWwgbGlzdCAqLwotCWZvciAoYm9hcmRfcCA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dCwgaSA9IDA7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCwgaSsrKSB7CisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaChib2FyZF9wLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQlpZiAoYm9hcmRfcCA9PSAmYm9hcmRfaW5mby0+bGlzdCkgewogCQkJYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPSBpOwogCQkJYnJlYWs7CiAJCX0KKwkJaSsrOwogCX0KIAlpZiAoYm9hcmRfcCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJNRTQwMDA6aW5pdF9ib2FyZF9pbmZvKCk6Q2Fubm90IGdldCBpbmRleCBvZiBiYW9yZFxuIik7CisJCSAgICAgICAiTUU0MDAwOmluaXRfYm9hcmRfaW5mbygpOkNhbm5vdCBnZXQgaW5kZXggb2YgYm9hcmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTg2MywxNiArODU3LDE0IEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VfYW9fY29udGV4dHMoc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmRhY19wOwotCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dDsKKwlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQsICphb19jb250ZXh0X3NhZmU7CiAKIAkvKiBDbGVhciBhbmFsb2cgb3V0cHV0IGNvbnRleHQgbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSkgewotCQlkYWNfcCA9IGJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdC5uZXh0OwotCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShkYWNfcCwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYW9fY29udGV4dCwgYW9fY29udGV4dF9zYWZlLAorCQkJJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCwgbGlzdCkgewogCQlmcmVlX2lycShhb19jb250ZXh0LT5pcnEsIGFvX2NvbnRleHQpOwogCQlrZnJlZShhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpOwotCQlsaXN0X2RlbChkYWNfcCk7CisJCWxpc3RfZGVsKCZhb19jb250ZXh0LT5saXN0KTsKIAkJa2ZyZWUoYW9fY29udGV4dCk7CiAJfQogfQpAQCAtMTE4MCw3ICsxMTcyLDcgQEAKIAogCS8qIFdhaXQgdW50aWwgL0lOSVQgcGluIGlzIHNldCAqLwogCXVkZWxheSgyMCk7Ci0JaWYgKCFpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApIHsKKwlpZiAoIShpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6Q2FuJ3QgaW5pdCBYaWxpbnhcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTMwMywxMiArMTI5NSwxMyBAQAogCQkgICAgICAgZGV2LCBtb2RlKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCWlmIChpID09IGJvYXJkKQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTEzMTgsMTQgKzEzMTEsMTMgQEAKIAkJfQogCiAJCS8qIFNlYXJjaCBmb3IgdGhlIGRhYyBjb250ZXh0ICovCi0JCWZvciAocHRyID0gYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0Lm5leHQsIGkgPSAwOwotCQkgICAgIHB0ciAhPSAmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0OwotCQkgICAgIHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwKLQkJCQkJCQkJCWxpc3QpOworCQlpID0gMDsKKwkJbGlzdF9mb3JfZWFjaChwdHIsICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpIHsKIAkJCWlmIChpID09IGRldikKIAkJCQlicmVhazsKKwkJCWkrKzsKIAkJfQorCQlhb19jb250ZXh0ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCwgbGlzdCk7CiAKIAkJaWYgKHB0ciA9PSAmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTEzODQsMTIgKzEzNzYsMTMgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmFpIGJvYXJkID0gJWQgbW9kZSA9ICVkXG4iLCBib2FyZCwgbW9kZSk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dCwgaSA9IDA7Ci0JCSAgICAgcHRyICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBwdHIgPSBwdHItPm5leHQsIGkrKykgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlpID0gMDsKKwkJbGlzdF9mb3JfZWFjaChwdHIsICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlpZiAoaSA9PSBib2FyZCkKIAkJCQlicmVhazsKKwkJCWkrKzsKIAkJfQorCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CiAKIAkJaWYgKHB0ciA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC0xNDM4LDE0ICsxNDMxLDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC0xNDgzLDE0ICsxNDc0LDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC0xNTI2LDE0ICsxNTE1LDEyIEBACiAJCVBERUJVRygibWU0MDAwX29wZW4oKTpib2FyZCA9ICVkXG4iLCBib2FyZCk7CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCQlpZiAoYm9hcmRfaW5mby0+Ym9hcmRfY291bnQgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CisJCWlmICgmYm9hcmRfaW5mby0+bGlzdCA9PSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIk1FNDAwMDptZTQwMDBfb3BlbigpOkJvYXJkICVkIG5vdCBpbiBkZXZpY2UgbGlzdFxuIiwKIAkJCSAgICAgICBib2FyZCk7CkBAIC01OTU1LDcgKzU5NDIsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWU0MDAwX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYm9hcmRfcDsKIAlzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm87CiAKIAlDQUxMX1BERUJVRygiY2xlYW51cF9tb2R1bGUoKSBpcyBleGVjdXRlZFxuIik7CkBAIC01OTc1LDkgKzU5NjEsNyBAQAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWU0MDAwX2RyaXZlcik7CiAKIAkvKiBSZXNldCB0aGUgYm9hcmRzICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgYm9hcmRfcCAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgYm9hcmRfcCA9IGJvYXJkX3AtPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkoYm9hcmRfcCwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCW1lNDAwMF9yZXNldF9ib2FyZChib2FyZF9pbmZvKTsKIAl9CiAKQEAgLTU5OTIsNyArNTk3Niw2IEBACiAJaW50IGxlbiA9IDA7CiAJaW50IGxpbWl0ID0gY291bnQgLSAxMDAwOwogCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAKIAlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbk1FNDAwMCBEUklWRVIgVkVSU0lPTiAlWC4lWC4lWFxuXG4iLAogCQkgICAgICAgKE1FNDAwMF9EUklWRVJfVkVSU0lPTiAmIDB4RkYwMDAwKSA+PiAxNiwKQEAgLTYwMDAsMTEgKzU5ODMsNyBAQAogCQkgICAgICAgKE1FNDAwMF9EUklWRVJfVkVSU0lPTiAmIDB4RkYpKTsKIAogCS8qIFNlYXJjaCBmb3IgdGhlIGJvYXJkIGNvbnRleHQgKi8KLQlmb3IgKHB0ciA9IG1lNDAwMF9ib2FyZF9pbmZvX2xpc3QubmV4dDsKLQkgICAgIChwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpICYmIChsZW4gPCBsaW1pdCk7Ci0JICAgICBwdHIgPSBwdHItPm5leHQpIHsKLQkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShib2FyZF9pbmZvLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCwgbGlzdCkgewogCQlsZW4gKz0KIAkJICAgIHNwcmludGYoYnVmICsgbGVuLCAiQm9hcmQgbnVtYmVyICVkOlxuIiwKIAkJCSAgICBib2FyZF9pbmZvLT5ib2FyZF9jb3VudCk7CkBAIC02MTEwLDYgKzYwODksOCBAQAogCQkgICAgc3ByaW50ZihidWYgKyBsZW4sICJBTyAzIHN0YXR1cyByZWdpc3RlciA9IDB4JTA4WFxuIiwKIAkJCSAgICBpbmwoYm9hcmRfaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKwogCQkJCU1FNDAwMF9BT18wM19TVEFUVVNfUkVHKSk7CisJCWlmIChsZW4gPj0gbGltaXQpCisJCQlicmVhazsKIAl9CiAKIAkqZW9mID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlZjgzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9LY29uZmlnCkBAIC0wLDAgKzEsMTI3IEBACisjCisjIE1laWxoYXVzIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudWNvbmZpZyBNRUlMSEFVUworCXRyaXN0YXRlICJNZWlsaGF1cyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgTWVpbGhhdXMgY2FyZCwgc2F5IFkgKG9yIE0pIGhlcmUuCisKKwkgIFlvdSBuZWVkIGJvdGggdGhpcyBkcml2ZXIsIGFuZCB0aGUgZHJpdmVyIGZvciB0aGUgcGFydGljdWxhcgorCSAgZGF0YSBjb2xsZWN0aW9uIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1lbWFpbi4KKworaWYgTUVJTEhBVVMKKworY29uZmlnIE1FMDYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS02MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS02MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMDYwMC4KKworY29uZmlnIE1FMDkwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS05MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS05MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMDkwMC4KKworY29uZmlnIE1FMTAwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS0xMDAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtMTAwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUxMDAwLgorCitjb25maWcgTUUxNDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTE0MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS0xNDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTE0MDAuCisKK2NvbmZpZyBNRTE2MDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtMTYwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTE2MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMTYwMC4KKworY29uZmlnIE1FNDYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS00NjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtNDYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU0NjAwLgorCitjb25maWcgTUU2MDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTYwMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS02MDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTYwMDAuCisKK2NvbmZpZyBNRTgxMDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtODEwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTgxMDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lODEwMC4KKworY29uZmlnIE1FODIwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS04MjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtODIwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU4MjAwLgorCitjb25maWcgTUVEVU1NWQorCXRyaXN0YXRlICJNZWlsaGF1cyBkdW1teSBkcml2ZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIHByb3ZpZGVzIGEgZHVtbXkgZHJpdmVyIGZvciB0aGUgTWVpbGhhdXMgZHJpdmVyIHBhY2thZ2UKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWVkdW1teS4KKworZW5kaWYgIyBNRUlMSEFVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjJjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyBNYWtlZmlsZSBmb3IgTWVpbGhhdXMgbGludXggZHJpdmVyIHN5c3RlbQorIworCitvYmotJChDT05GSUdfTUVJTEhBVVMpICs9IG1lbWFpbi5vCitvYmotJChDT05GSUdfTUUxNjAwKSArPSBtZTE2MDAubworb2JqLSQoQ09ORklHX01FMTAwMCkgKz0gbWUxMDAwLm8KK29iai0kKENPTkZJR19NRTE0MDApICs9IG1lMTQwMC5vCitvYmotJChDT05GSUdfTUU0NjAwKSArPSBtZTQ2MDAubworb2JqLSQoQ09ORklHX01FNjAwMCkgKz0gbWU2MDAwLm8KK29iai0kKENPTkZJR19NRTA2MDApICs9IG1lMDYwMC5vCitvYmotJChDT05GSUdfTUU4MTAwKSArPSBtZTgxMDAubworb2JqLSQoQ09ORklHX01FODIwMCkgKz0gbWU4MjAwLm8KK29iai0kKENPTkZJR19NRTA5MDApICs9IG1lMDkwMC5vCitvYmotJChDT05GSUdfTUVEVU1NWSkgKz0gbWVkdW1teS5vCisKKworbWUxNjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTYwMF9kZXZpY2UubworbWUxNjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lMTYwMF9hby5vCisKK21lMTAwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTEwMDBfZGV2aWNlLm8KK21lMTAwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTEwMDBfZGlvLm8KKworbWUxNDAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTQwMF9kZXZpY2UubworbWUxNDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lODI1NC5vIG1lODI1NS5vIG1lMTQwMF9leHRfaXJxLm8KKworbWU0NjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lZmlybXdhcmUubyBtZTQ2MDBfZGV2aWNlLm8KK21lNDYwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTQ2MDBfZG8ubyBtZTQ2MDBfZGkubyBtZTQ2MDBfZGlvLm8gbWU4MjU0Lm8gbWU0NjAwX2FpLm8gbWU0NjAwX2FvLm8gbWU0NjAwX2V4dF9pcnEubworCittZTYwMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWVmaXJtd2FyZS5vIG1lNjAwMF9kZXZpY2UubworbWU2MDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lNjAwMF9kaW8ubyBtZTYwMDBfYW8ubworCittZTA2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUwNjAwX2RldmljZS5vCittZTA2MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUwNjAwX3JlbGF5Lm8gbWUwNjAwX3R0bGkubyBtZTA2MDBfb3B0b2kubyBtZTA2MDBfZGlvLm8gbWUwNjAwX2V4dF9pcnEubworCittZTgxMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWU4MTAwX2RldmljZS5vCittZTgxMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MTAwX2RpLm8gbWU4MTAwX2RvLm8gbWU4MjU0Lm8KKworbWU4MjAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lODIwMF9kZXZpY2UubworbWU4MjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lODIwMF9kaS5vIG1lODIwMF9kby5vIG1lODIwMF9kaW8ubworCittZTA5MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUwOTAwX2RldmljZS5vCittZTA5MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUwOTAwX2RvLm8gbWUwOTAwX2RpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjMjUyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgaXNzdWVzCisJLSBMaW5kZW50CisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlCisJLSBoYW5kbGUgZmlybXdhcmUgcHJvcGVybHkKKwktIHBvc3NpYmxlIGNvbWVkaSBtZXJnZQorCitQbGVhc2Ugc2VuZCBjbGVhbnVwIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK2FuZCBDQzogRGF2aWQgS2lsaWFuaSA8bWFpbEBkYXZpZGtpbGlhbmkuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTUwZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9yZWxheS5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpLmgiCisjaW5jbHVkZSAibWUwNjAwX29wdG9pLmgiCisjaW5jbHVkZSAibWUwNjAwX2Rpby5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxLmgiCisKK21lX2RldmljZV90ICptZTA2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lMDYwMF9kZXZpY2VfdCAqbWUwNjAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUwNjAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTA2MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUwNjAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWUwNjAwX2RldmljZS0+ZGlvX2N0cmxfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTA2MDBfZGV2aWNlLT5pbnRjc3JfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLm9wdG9pX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDYwMF9vcHRvaV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkJYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkJcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnJlbGF5X3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDYwMF9yZWxheV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkJYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkJcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnR0bGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX3R0bGlfY29uc3RydWN0b3IobWUwNjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgIHJlZ19iYXNlc1syXSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwNjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX2Rpb19jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWUwNjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZXh0X2lycV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKQorCQkgICAgbWUwNjAwX2V4dF9pcnFfY29uc3RydWN0b3IobWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkJICAgICAgIG1lMDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCSAgICAgICAmbWUwNjAwX2RldmljZS0+aW50Y3NyX2xvY2ssIGksCisJCQkJCSAgICAgICBtZTA2MDBfZGV2aWNlLT5iYXNlLmlycSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTA2MDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMDYwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdChtZTA2MDBfaW5pdCk7CisKK21vZHVsZV9leGl0KG1lMDYwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNRS02eHggRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNnh4IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUwNjAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNhOGFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS02MzAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUUwNjAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjMwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IHJlbGF5X3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IHR0bGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgb3B0b2lfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGV4dF9pcnFfc3ViZGV2aWNlczsKK30gbWUwNjAwX3ZlcnNpb25fdDsKKworLyoqCisgKiBAYnJpZWYgRGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMDYwMF92ZXJzaW9uX3QgbWUwNjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwLCAxLCAxLCAxLCAyLCAyfSwKKwl7MH0sCit9OworCisjZGVmaW5lIE1FMDYwMF9ERVZJQ0VfVkVSU0lPTlMgKHNpemVvZihtZTA2MDBfdmVyc2lvbnMpIC8gc2l6ZW9mKG1lMDYwMF92ZXJzaW9uX3QpIC0gMSkJLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUwNjAwX3ZlcnNpb25zLiAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGVudHJ5IGluICNtZTA2MDBfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWUwNjAwX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZTA2MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleCh1aW50MTZfdCBkZXZpY2VfaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1FMDYwMF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1lMDYwMF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MzAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIENoaWxkIGNsYXNzIGF0dHJpYnV0ZXMuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9yZWdfbG9jazsKKwlzcGlubG9ja190IGludGNzcl9sb2NrOworfSBtZTA2MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MzAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS02MzAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUwNjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNzc1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTYzMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQkJcG9ydF9yZWcpICYgKDB4MDAwMSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisJdWludDhfdCBieXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCWJ5dGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRiKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRElPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9CWVRFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfZGlvX3N1YmRldmljZV90ICptZTA2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfZGlvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfRElPX0NPTkZJR19SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwNjAwX0RJT19QT1JUX1JFRyArIGRpb19pZHg7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwNjAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwNzVjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfRElPX0hfCisjZGVmaW5lIF9NRTA2MDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwNjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3VwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBkaWdpdGFsIGkvbyBwb3J0IG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKm1lMDYwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNmVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGlvX3JlZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2Rpb19yZWcuaAorICoKKyAqIEBicmllZiBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ESU9fUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfRElPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX1JFRwkJMHgwMDA3CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF8wX1JFRwkJMHgwMDA4CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF8xX1JFRwkJMHgwMDA5CisjZGVmaW5lIE1FMDYwMF9ESU9fUE9SVF9SRUcJCQlNRTA2MDBfRElPX1BPUlRfMF9SRUcKKworI2RlZmluZSBNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAJMHgwMDAxCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMQkweDAwMDQKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0OWFiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZXh0X2lycV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfZXh0X2lycS5oIgorCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CSVQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1IoIldyb25nIGlkeD0lZC5cbiIsIGluc3RhbmNlLT5saW50bm8pOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKGlycV9zb3VyY2UgIT0gTUVfSVJRX1NPVVJDRV9ESU9fTElORSkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmludGNzcik7CisJc3dpdGNoIChpbnN0YW5jZS0+bGludG5vKSB7CisJY2FzZSAwOgorCQl0bXAgfD0KKwkJICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PQorCQkgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJCSAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCWJyZWFrOworCX0KKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmludGNzcik7CisJUERFQlVHX1JFRygiaW50Y3NyIG91dGwocGx4OjB4JVgpPTB4JXhcbiIsIGluc3RhbmNlLT5pbnRjc3IsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9faXJxX3dhaXQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPnJpc2VkIDw9IDApIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPm47CisJKnZhbHVlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9faXJxX3N0b3Aoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1IoIldyb25nIGlkeD0lZC5cbiIsIGluc3RhbmNlLT5saW50bm8pOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmludGNzcik7CisJc3dpdGNoIChpbnN0YW5jZS0+bGludG5vKSB7CisJY2FzZSAwOgorCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8IFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwkJdG1wICY9IH5QTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU47CisJCWJyZWFrOworCX0KKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmludGNzcik7CisJUERFQlVHX1JFRygiaW50Y3NyIG91dGwocGx4OjB4JVgpPTB4JXhcbiIsIGluc3RhbmNlLT5pbnRjc3IsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCWluc3RhbmNlLT5uID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkJaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRVhUX0lSUTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkc7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1lMDYwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsICh2b2lkICopaW5zdGFuY2UpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUwNjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lMDYwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgbWFzayA9IFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoaW5zdGFuY2UtPmxpbnRubyA+IDEpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMCisJCSAgICAoIiVzKCk6V3Jvbmcgc3ViZGV2aWNlIGluZGV4PSVkIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFguXG4iLAorCQkgICAgIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmxpbnRubywgaW5sKGluc3RhbmNlLT5pbnRjc3IpKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmludGNzcik7CisJc3dpdGNoIChpbnN0YW5jZS0+bGludG5vKSB7CisJY2FzZSAwOgorCQltYXNrIHw9IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9TVEFURSB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltYXNrIHw9IFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTjsKKwkJYnJlYWs7CisJfQorCisJaWYgKChzdGF0dXMgJiBtYXNrKSA9PSBtYXNrKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJCWluc3RhbmNlLT5uKys7CisJCWluYihpbnN0YW5jZS0+cmVzZXRfcmVnKTsKKwkJUERFQlVHKCJJbnRlcnJ1cHQgZGV0ZWN0ZWQuXG4iKTsKKwl9IGVsc2UgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTAgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJldCA9IElSUV9OT05FOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIHJldDsKK30KKworbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBtZTA2MDBfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGludGNzcl9sb2NrLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGV4dF9pcnFfaWR4LAorCQkJCQkJICAgICAgIGludCBpcnEpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgNjMwX2V4dF9pcnEgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmludGNzcl9sb2NrID0gaW50Y3NyX2xvY2s7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJc3ViZGV2aWNlLT5saW50bm8gPSBleHRfaXJxX2lkeDsKKworCS8qIFJlcXVlc3QgaW50ZXJydXB0IGxpbmUgKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTA2MDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUUwNjAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IGludGVycnVwdCBsaW5lLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+aW50Y3NyID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKwlzdWJkZXZpY2UtPnJlc2V0X3JlZyA9CisJICAgIG1lMDYwMF9yZWdfYmFzZSArIE1FMDYwMF9JTlRfMF9SRVNFVF9SRUcgKyBleHRfaXJxX2lkeDsKKworCS8qIEluaXRpYWxpemUgdGhlIHN1YmRldmljZSBtZXRob2RzICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lMDYwMF9leHRfaXJxX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMDYwMF9leHRfaXJxX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPm4gPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmMjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2V4dF9pcnEuaAorICoKKyAqIEBicmllZiBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FMDYwMF9FWFRfSVJRX0hfCisjZGVmaW5lIF9NRTA2MDBfRVhUX0lSUV9IXworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICppbnRjc3JfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2ludGNzci4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkvKio8IFF1ZXVlIHRvIHB1dCBvbiB0aHJlYWRzIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdC4gKi8KKworCWludCBpcnE7CQkJCS8qKjwgVGhlIGlycSBudW1iZXIgYXNzaWduZWQgYnkgUENJIEJJT1MuICovCisJaW50IHJpc2VkOwkJCQkvKio8IElmIHRydWUgYW4gaW50ZXJydXB0IGhhcyBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBuOwkJCQkvKio8IFRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHNpbmNlIHRoZSBkcml2ZXIgd2FzIGxvYWRlZC4gKi8KKwl1bnNpZ25lZCBpbnQgbGludG5vOwkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgUENJIGludGVycnVwdC4gKi8KKworCXVpbnQzMl90IGludGNzcjsJCQkvKio8IFRoZSBQTFggaW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCByZXNldF9yZWc7CQkJLyoqPCBUaGUgY29udHJvbCByZWdpc3Rlci4gKi8KK30gbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHBseF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBQTFggY2hpcCBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWUwNjAwX3JlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1FLTYzMCBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGlycSBUaGUgaXJxIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTA2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUwNjAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBpbnRjc3JfbG9jaywKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZXh0X2lycV9pZHgsCisJCQkJCQkgICAgICAgaW50IGlycSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxOThmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDE4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0VYVF9JUlFfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfRVhUX0lSUV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA2MDBfSU5UXzBfUkVTRVRfUkVHICAgICAweDAwMDUKKyNkZWZpbmUgTUUwNjAwX0lOVF8xX1JFU0VUX1JFRyAgICAgMHgwMDA2CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkOTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfb3B0b2kuYworICoKKyAqIEBicmllZiBNRS02MzAgT3B0b2lzb2xhdGVkIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9vcHRvaV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfb3B0b2kuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgIT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQlQRVJST1IoIkludmFsaWQgcG9ydCBkaXJlY3Rpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqbWUwNjAwX29wdG9pX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKQoreworCW1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9PUFRPX0lOUFVUX1JFRzsKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9vcHRvaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX29wdG9pX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9CisJICAgIG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF9vcHRvaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9vcHRvaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2OWJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX29wdG9pLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX09QVE9JX0hfCisjZGVmaW5lIF9NRTA2MDBfT1BUT0lfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9vcHRvaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworfSBtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBPcHRvaXNvbGF0ZWQgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICptZTA2MDBfb3B0b2lfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2lfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiYzQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2lfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfb3B0b2lfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX09QVE9JX1JFR19IXworI2RlZmluZSBfTUUwNjAwX09QVE9JX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9PUFRPX0lOUFVUX1JFRyAgICAgIDB4MDAwNAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjVjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3JlbGF5LmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIHJlbGF5IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9yZWxheV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfcmVsYXkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlvdXRiKDB4MCwgaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfMF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF8wX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0YigweDAsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0XzFfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfMV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgIT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSBpZiAoKGNoYW5uZWwgPj0gOCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCSp2YWx1ZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKSAmICgweDEgPDwgKGNoYW5uZWwgLSA4KSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9ICh1aW50MzJfdCkgaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKSA8PCA4OworCQkJKnZhbHVlIHw9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IGNoYW5uZWwsCisJCQkJCWludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQlzdGF0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZSAmCisJCQkJCQkJCSAgfigweDEgPDwKKwkJCQkJCQkJICAgIGNoYW5uZWwpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmICgoY2hhbm5lbCA+PSA4KSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQkJc3RhdGUgPQorCQkJICAgIHZhbHVlID8gKHN0YXRlIHwgKDB4MSA8PCAoY2hhbm5lbCAtIDgpKSkgOiAoc3RhdGUgJgorCQkJCQkJCQkJfigweDEgPDwKKwkJCQkJCQkJCSAgKGNoYW5uZWwKKwkJCQkJCQkJCSAgIC0KKwkJCQkJCQkJCSAgIDgpKSk7CisJCQlvdXRiKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJCW91dGIodmFsdWUgPj4gOCwgaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKm1lMDYwMF9yZWxheV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSkKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX3JlbGF5X3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPnBvcnRfMF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9SRUxBSVNfMF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0XzFfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfUkVMQUlTXzFfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF9yZWxheV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX3JlbGF5X3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA2MDBfcmVsYXlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTdkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmgKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfcmVsYXkuaAorICoKKyAqIEBicmllZiBNRS02MzAgcmVsYXkgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9SRUxBWV9IXworI2RlZmluZSBfTUUwNjAwX1JFTEFZX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfcmVsYXlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0XzBfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBwb3J0XzFfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIHJlbGF5IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICptZTA2MDBfcmVsYXlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0ZGIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXlfcmVnLmgKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfcmVsYXlfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIHJlbGF5IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfUkVMQVlfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfUkVMQVlfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX1JFTEFJU18wX1JFRyAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1FMDYwMF9SRUxBSVNfMV9SRUcgICAgICAgIDB4MDAwMgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3R0bGkuYworICoKKyAqIEBicmllZiBNRS02MzAgVFRMIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCBjaGFubmVsLAorCQkJCQlpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJaW50IHJlZiwKKwkJCQkJaW50IHRyaWdfY2hhbiwKKwkJCQkJaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF90dGxpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyAhPSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF90dGxpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKm1lMDYwMF90dGxpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9UVExfSU5QVVRfUkVHOworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX3R0bGlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF90dGxpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9CisJICAgIG1lMDYwMF90dGxpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX3R0bGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTA2MDBfdHRsaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkwMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfdHRsaS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9UVExJX0hfCisjZGVmaW5lIF9NRTA2MDBfVFRMSV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX3R0bGlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KK30gbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKm1lMDYwMF90dGxpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk4NmQxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF90dGxpX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9UVExJX1JFR19IXworI2RlZmluZSBfTUUwNjAwX1RUTElfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX1RUTF9JTlBVVF9SRUcgICAgICAgMHgwMDAzCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRkNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX2RvLmgiCisjaW5jbHVkZSAibWUwOTAwX2RpLmgiCisKK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lMDkwMF9kZXZpY2VfdCAqbWUwOTAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCWludCBwb3J0X3NoaWZ0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUwOTAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTA5MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUwOTAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8qIEluaXRpYWxpemUgODI1NSBjaGlwIHRvIGRlc2lyZWQgbW9kZSAqLworCWlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCSAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCkgeworCQlvdXRiKDB4OUIsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJfSBlbHNlIGlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCQkgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MCkgeworCQlvdXRiKDB4ODksCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJCW91dGIoMHgwMCwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX1dSSVRFX0VOQUJMRV9SRUcpOworCX0gZWxzZSBpZiAobWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjApIHsKKwkJb3V0YigweDhCLAorCQkgICAgIG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJICAgICBNRTA5MDBfQ1RSTF9SRUcpOworCQlvdXRiKDB4MDAsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHKTsKKwl9CisKKwlwb3J0X3NoaWZ0ID0KKwkgICAgKG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJICAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MCkgPyAxIDogMDsKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTA5MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDkwMF9kaV9jb25zdHJ1Y3RvcihtZTA5MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBpICsgcG9ydF9zaGlmdCk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwOTAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA5MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwOTAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA5MDBfZG9fY29uc3RydWN0b3IobWUwOTAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZSk7CisJCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDkwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lMDkwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMDkwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWUwOTAwX2luaXQpOworbW9kdWxlX2V4aXQobWUwOTAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTl4IERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTl4IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUwOTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE3ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0wOTAwIChNRS05eCkgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUUwOTAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtMDkwMCAoTUUtOXgpIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7Cit9IG1lMDkwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTA5MDBfdmVyc2lvbl90IG1lMDkwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCwgMiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwLCAwLCAyfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAsIDEsIDF9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUUwOTAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lMDkwMF92ZXJzaW9ucykgLyBzaXplb2YobWUwOTAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTA5MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMDkwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTA5MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUwOTAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUwOTAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworfSBtZTA5MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS05eCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNzM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGkuYworICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA5MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA5MDBfZGlfc3ViZGV2aWNlX3QgKm1lMDkwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4KQoreworCW1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA5MDBfZGlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJaWYgKGRpX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1BPUlRfQV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDkwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwOTAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRmMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwOTAwX0RJX0hfCisjZGVmaW5lIF9NRTA5MDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBpbnQgZGlfaWR4OworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA5MDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTl4IGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RpX3N1YmRldmljZV90ICptZTA5MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWUwOTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjljM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA5MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCW91dGIoMHhGRiwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhmZik7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA5MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCXN0YXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgKCF2YWx1ZSkgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZSAmCisJCQkJCQkJCSAgICAgfigweDEgPDwKKwkJCQkJCQkJICAgICAgIGNoYW5uZWwpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIofih2YWx1ZSksIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDkwMF9kb19zdWJkZXZpY2VfdCAqbWUwOTAwX2RvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkb19pZHgpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwOTAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5kb19pZHggPSBkb19pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9QT1JUX0FfUkVHOworCQlzdWJkZXZpY2UtPmVuYWJsZV9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHOworCQlzdWJkZXZpY2UtPmRpc2FibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRElTQUJMRV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwkJc3ViZGV2aWNlLT5lbmFibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRzsKKwkJc3ViZGV2aWNlLT5kaXNhYmxlX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1dSSVRFX0RJU0FCTEVfUkVHOworCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwOTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA5MDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwOTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwOTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U4YThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ET19IXworI2RlZmluZSBfTUUwOTAwX0RPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZG9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdW5zaWduZWQgaW50IGRvX2lkeDsKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGVuYWJsZV9yZWc7CisJdW5zaWduZWQgbG9uZyBkaXNhYmxlX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwOTAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS05eCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RvX3N1YmRldmljZV90ICptZTA5MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYxNjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS05eCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA5MDBfUkVHX0hfCisjZGVmaW5lIF9NRTA5MDBfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwOTAwX1BPUlRfQV9SRUcgICAgICAgICAgMHgwMAorI2RlZmluZSBNRTA5MDBfUE9SVF9CX1JFRyAgICAgICAgICAweDAxCisjZGVmaW5lIE1FMDkwMF9QT1JUX0NfUkVHICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUUwOTAwX0NUUkxfUkVHICAgICAgICAgICAgMHgwMwkvLyAoICx3KQorI2RlZmluZSBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRyAgICAweDA0CS8vIChyLHcpCisjZGVmaW5lIE1FMDkwMF9XUklURV9ESVNBQkxFX1JFRyAgIDB4MDgJLy8gKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kaW8uaCIKKworc3RhdGljIGludCBtZTEwMDBfY29uZmlnX2xvYWQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwltZTEwMDBfZGV2aWNlX3QgKm1lMTAwMF9kZXZpY2U7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqZGlvOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWUxMDAwX2RldmljZSA9IChtZTEwMDBfZGV2aWNlX3QgKikgbWVfZGV2aWNlOworCisJaWYgKGNvbmZpZy0+Y291bnQgPT0gMikgeworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJLy8gTm90aGluZyB0byBkby4KKwkJfSBlbHNlIHsKKwkJCS8vIFJlbW92ZSAyIGV4dHJhIHN1YmRldmljZXMKKwkJCWRpbyA9CisJCQkgICAgKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJc2xpc3QpOworCQkJaWYgKGRpbykKKwkJCQlkaW8tPmJhc2UuCisJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKQorCQkJCQkJCSAgICBkaW8pOworCisJCQlkaW8gPQorCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkgICAgbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCXNsaXN0KTsKKwkJCWlmIChkaW8pCisJCQkJZGlvLT5iYXNlLgorCQkJCSAgICBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcigobWVfc3ViZGV2aWNlX3QgKikKKwkJCQkJCQkgICAgZGlvKTsKKwkJfQorCX0gZWxzZSBpZiAoY29uZmlnLT5jb3VudCA9PSA0KSB7CisJCS8vQWRkIDIgc3ViZGV2aWNlcworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJZGlvID0KKwkJCSAgICBtZTEwMDBfZGlvX2NvbnN0cnVjdG9yKG1lMTAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCQkgICByZWdfYmFzZXNbMl0sIDIsCisJCQkJCQkgICAmbWUxMDAwX2RldmljZS0+Y3RybF9sb2NrKTsKKwkJCWlmICghZGlvKSB7CisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisKKwkJCWRpbyA9CisJCQkgICAgbWUxMDAwX2Rpb19jb25zdHJ1Y3RvcihtZTEwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkJICAgcmVnX2Jhc2VzWzJdLCAzLAorCQkJCQkJICAgJm1lMTAwMF9kZXZpY2UtPmN0cmxfbG9jayk7CisJCQlpZiAoIWRpbykgeworCQkJCWRpbyA9CisJCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkJICAgIG1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+CisJCQkJCQkJCWJhc2Uuc2xpc3QpOworCQkJCWlmIChkaW8pCisJCQkJCWRpby0+YmFzZS4KKwkJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKSBkaW8pOworCisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisJCX0gZWxzZSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvLgorCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXZpY2UpCit7CisJbWUxMDAwX2RldmljZV90ICptZTEwMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lMTAwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTEwMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWUxMDAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBNRS0xMDAwIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUxMDAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTEwMDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTEwMDBfZGV2aWNlLT5jdHJsX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTAwMF9kaW9fY29uc3RydWN0b3IobWUxMDAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAgJm1lMTAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGN0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUxMDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBPdmVyd3JpdGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCW1lMTAwMF9kZXZpY2UtPmJhc2UubWVfZGV2aWNlX2NvbmZpZ19sb2FkID0gbWUxMDAwX2NvbmZpZ19sb2FkOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTEwMDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KK3N0YXRpYyBpbnQgX19pbml0IG1lMTAwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxMDAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG1lMTAwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTAwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNZWlsaGF1cyBNRS0xMDAwIERldmljZXMiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS0xMDAwIERpZ2l0YWwgSS9PIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxMDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApAQCAtMCwwICsxLDU5IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfSF8KKyNkZWZpbmUgX01FMTAwMF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUxMDAwX01BR0lDX05VTUJFUgkxMDAwCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xMDAwIGRldmljZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTAwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGN0cmxfbG9jazsJCS8qKjwgR3VhcmRzIHRoZSBESU8gbW9kZSByZWdpc3Rlci4gKi8KK30gbWUxMDAwX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTAwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTEwMDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qKgorICogQGZpbGUgbWUxMDAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTEwMDAgRElPIHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTAwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWUxMDAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FMTAwMF9ESU9fTUFHSUNfTlVNQkVSCTB4MTAwMAkvKio8IFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGNsYXNzIHN0cnVjdHVyZS4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgweDAwMDAwMDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgIGludCByZWYsCisJCQkJICAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY3RybDsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJY3RybCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJY3RybCB8PSAweDEgPDwgaW5zdGFuY2UtPmRpb19pZHg7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbi5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9faW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDMyKSkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDgpKSAmIDB4RkY7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDE2KSkgJgorCQkJICAgIDB4RkZGRjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY29uZmlnOworCXVpbnQzMl90IHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY29uZmlnID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZykgJiAoMHgxIDw8IGluc3RhbmNlLT5kaW9faWR4KTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAzMikpIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlzdGF0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCXN0YXRlID0KKwkJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZQorCQkJCQkJCQkJICAmCisJCQkJCQkJCQkgIH4oMHgxCisJCQkJCQkJCQkgICAgPDwKKwkJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQkJb3V0bChzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkYgPDwgKGNoYW5uZWwgKiA4KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRikgPDwgKGNoYW5uZWwgKiA4KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkZGRiA8PCAoY2hhbm5lbCAqIDE2KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRkZGKSA8PCAoY2hhbm5lbCAqIDE2KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0RXT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSBNRTEwMDBfRElPX05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9EV09SRDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTEwMDBfZGlvX3N1YmRldmljZV90ICptZTEwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtMTAwMCBESU8gaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+PSBNRTEwMDBfRElPX05VTUJFUl9QT1JUUykgeworCQlQRVJST1IoIkRJTyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBESU8gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTEwMDBfUE9SVF9NT0RFOworCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FMTAwMF9QT1JUICsgKGRpb19pZHggKiBNRTEwMDBfUE9SVF9TVEVQKTsKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMTAwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxMDAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ZTkzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtMTAwMCBkaWdpdGFsIGkvbyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfRElPX0hfCisjZGVmaW5lIF9NRTEwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTEwMDAgRElPIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxMDAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKy8vICAgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIHVuaXF1ZSBmb3IgdGhpcyBzdHJ1Y3R1cmUuICovCisKKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJaW50IGRpb19pZHg7CQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgRElPIHBvcnQgb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byByZWFkIG9yIHdyaXRlIGEgdmFsdWUgZnJvbSBvciB0byB0aGUgcG9ydCByZXNwZWN0aXZlbHkuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgRElPIG1vZGVzLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTEwMDBfZGlvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS0xMDAwIERJTyBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgRElPIG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqbWUxMDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDViMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTEwMDAgZGlnaXRhbCBpL28gcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxMDAwX0RJT19SRUdfSF8KKyMgZGVmaW5lIF9NRTEwMDBfRElPX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyBkZWZpbmUgTUUxMDAwX0RJT19OVU1CRVJfQ0hBTk5FTFMJMzIJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBESU8gcG9ydC4gKi8KKyMgZGVmaW5lIE1FMTAwMF9ESU9fTlVNQkVSX1BPUlRTCTQJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIHBlciBNRS0xMDAwLiAqLworCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBBIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgQiBiYXNlIHJlZ2lzdGVyIG9mZnNldC4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IEMgYmFzZSByZWdpc3RlciBvZmZzZXQuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBEIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyBkZWZpbmUgTUUxMDAwX1BPUlQJCQkJMHgwMDAwCQkJLyoqPCBCYXNlIGZvciBwb3J0J3MgcmVnaXN0ZXIuICovCisjIGRlZmluZSBNRTEwMDBfUE9SVF9TVEVQCQkJNAkJCQkvKio8IERpc3RhbmNlIGJldHdlZW4gcG9ydCdzIHJlZ2lzdGVyLiAqLworCisjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFCQkJMHgwMDEwCQkJLyoqPCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRvIHN3aXRjaCB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9BICAgKDEgPDwgMCkgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgQSBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfTU9ERV9PVVRQVVRfQiAgICgxIDw8IDEpICAgICAgICAgICAgICAgIC8qKjwgSWYgc2V0LCBwb3J0IEIgaXMgaW4gb3V0cHV0LCBvdGhlcndpc2UgaW4gaW5wdXQgbW9kZS4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREVfT1VUUFVUX0MgICAoMSA8PCAyKSAgICAgICAgICAgICAgICAvKio8IElmIHNldCwgcG9ydCBDIGlzIGluIG91dHB1dCwgb3RoZXJ3aXNlIGluIGlucHV0IG1vZGUuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9EICAgKDEgPDwgMykgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgRCBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworCisjIGVuZGlmCS8vX19LRVJORUxfXworI2VuZGlmIC8vX01FMTAwMF9ESU9fUkVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTViYjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFVzZXIgYXBwbGljYXRpb24gY291bGQgYWxzbyBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiBCdXQgdGhlCisgKiByZWFsIGtlcm5lbCBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBieSAjaWZkZWYgX19LRVJORUxfXy4KKyAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgbW9kdWxlLmggaXMgaW5jbHVkZWQuIE5vdCBuZWVkZWQsIHdoZW4KKyAqIGl0IGlzIGEgYnVpbHQgaW4gZHJpdmVyLgorICovCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorI2luY2x1ZGUgIm1lODI1NF9yZWcuaCIKKyNpbmNsdWRlICJtZTgyNTUuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycS5oIgorCittZV9kZXZpY2VfdCAqbWUxNDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCW1lMTQwMF9kZXZpY2VfdCAqbWUxNDAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeDsKKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeDsKKwl1bnNpZ25lZCBpbnQgY3RyX2lkeDsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9pZHg7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE0MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTQwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgMTQwMGF0ZSBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lMTQwMF9kZXZpY2UsIDAsIHNpemVvZihtZTE0MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ2hlY2sgZm9yIE1FMTQwMCBleHRlbnNpb24gZGV2aWNlLiBJZiBkZXRlY3RlZCB3ZSBmYWtlIGEgTUUtMTQwMCBEIGRldmljZSBpZC4gKi8KKwlpZiAobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMpIHsKKwkJdWludDhfdCBjdHJsOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisJCW91dGIoY3RybCB8IDB4RjAsCisJCSAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRyk7CisJCVBERUJVR19SRUcoInh4eF9yZWcgb3V0YigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCB8IDB4RjApOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisKKwkJaWYgKChjdHJsICYgMHhGMCkgPT0gMHhGMCkgeworCQkJUElORk8oIk1FMTQwMCBEIGRldGVjdGVkLlxuIik7CisJCQltZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9CisJCQkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBkaWdpdGFsIGkvbyBzdWJkZXZpY2VzLiAqLworCWZvciAobWU4MjU1X2lkeCA9IDA7IG1lODI1NV9pZHggPCBNRTE0MDBfTUFYXzgyNTU7IG1lODI1NV9pZHgrKykgeworCQltZTE0MDBfZGV2aWNlLT5kaW9fY3VycmVudF9tb2RlW21lODI1NV9pZHhdID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmRpb19jdHJsX3JlZ19sb2NrW21lODI1NV9pZHhdKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBjb3VudGVyIHN1YmRldmljZXMuICovCisJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmNsa19zcmNfcmVnX2xvY2spOworCisJZm9yIChtZTgyNTRfaWR4ID0gMDsgbWU4MjU0X2lkeCA8IE1FMTQwMF9NQVhfODI1NDsgbWU4MjU0X2lkeCsrKQorCQlzcGluX2xvY2tfaW5pdCgmbWUxNDAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0pOworCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTE0MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvKiBHZW5lcmF0ZSBESU8gc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKG1lODI1NV9pZHggPSAwOworCSAgICAgbWU4MjU1X2lkeCA8IG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX2NoaXBzOworCSAgICAgbWU4MjU1X2lkeCsrKSB7CisJCWZvciAoZGlvX2lkeCA9IDA7IGRpb19pZHggPCAzOyBkaW9faWR4KyspIHsKKwkJCXN1YmRldmljZSA9CisJCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCQkgICAgbWU4MjU1X2NvbnN0cnVjdG9yKG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLCBtZTgyNTVfaWR4LAorCQkJCQkgICAgICAgZGlvX2lkeCwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT4KKwkJCQkJICAgICAgIGRpb19jdXJyZW50X21vZGVbbWU4MjU1X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBkaW9fY3RybF9yZWdfbG9ja1ttZTgyNTVfaWR4XSk7CisKKwkJCWlmICghc3ViZGV2aWNlKSB7CisJCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNDAwX2RldmljZSk7CisJCQkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJCSAgICBzdWJkZXZpY2UpOworCQl9CisJfQorCisJLyogR2VuZXJhdGUgY291bnRlciBzdWJkZXZpY2UgaW5zdGFuY2VzLiAqLworCWZvciAobWU4MjU0X2lkeCA9IDA7CisJICAgICBtZTgyNTRfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5jdHJfY2hpcHM7CisJICAgICBtZTgyNTRfaWR4KyspIHsKKwkJZm9yIChjdHJfaWR4ID0gMDsgY3RyX2lkeCA8IDM7IGN0cl9pZHgrKykgeworCQkJc3ViZGV2aWNlID0KKwkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZTgyNTRfY29uc3RydWN0b3IobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIGRldmljZV9pZCwKKwkJCQkJICAgICAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIG1lODI1NF9pZHgsCisJCQkJCSAgICAgICBjdHJfaWR4LAorCQkJCQkgICAgICAgJm1lMTQwMF9kZXZpY2UtPgorCQkJCQkgICAgICAgY3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCQlrZnJlZShtZTE0MDBfZGV2aWNlKTsKKwkJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTE0MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkJICAgIHN1YmRldmljZSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKGV4dF9pcnFfaWR4ID0gMDsKKwkgICAgIGV4dF9pcnFfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7CisJICAgICBleHRfaXJxX2lkeCsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pcnEpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMTQwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNDAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTE0MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQobWUxNDAwX2luaXQpOworbW9kdWxlX2V4aXQobWUxNDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1laWxoYXVzIE1FLTE0eHggZGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE0eHggTUlPIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxNDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE1YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgZmFtaWx5IGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9ERVZJQ0VfSF8KKyNkZWZpbmUgX01FMTQwMF9ERVZJQ0VfSF8KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gc3RvcmUgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNDAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsJCQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2NoaXBzOwkJCQkvKio8IFRoZSBudW1iZXIgb2YgODI1NSBjaGlwcyBvbiB0aGUgZGV2aWNlLiAqLworCXVuc2lnbmVkIGludCBjdHJfY2hpcHM7CQkJCS8qKjwgVGhlIG51bWJlciBvZiA4MjU0IGNoaXBzIG9uIHRoZSBkZXZpY2UuICovCisJdW5zaWduZWQgaW50IGV4dF9pcnFfc3ViZGV2aWNlczsJLyoqPCBUaGUgbnVtYmVyIG9mIGV4dGVybmFsIGludGVycnVwdCBpbnB1dHMgb24gdGhlIGRldmljZS4gKi8KK30gbWUxNDAwX3ZlcnNpb25fdDsKKworLyoqCisgICogQGJyaWVmIERlZmluZXMgZm9yIGVhY2ggTUUtMTQwMCBkZXZpY2UgdmVyc2lvbiBpdHMgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUxNDAwX3ZlcnNpb25fdCBtZTE0MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMsIDEsIDUsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRCwgMiwgMTAsIDF9LAorCXswfQorfTsKKworI2RlZmluZSBNRTE0MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE0MDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lMTQwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWUxNDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lMTQwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWUxNDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTE0MDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTE0MDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisjZGVmaW5lIE1FMTQwMF9NQVhfODI1NAkJMTAJLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgODI1NCBjb3VudGVyIHN1YmRldmljZXMgYXZhaWxhYmxlIG9uIGFueSBNRS0xNDAwIGRldmljZS4gKi8KKyNkZWZpbmUgTUUxNDAwX01BWF84MjU1CQkyCS8qKjwgVGhlIG1heGltdW0gbnVtYmVyIG9mIDgyNTUgZGlnaXRhbCBpL28gc3ViZGV2aWNlcyBhdmFpbGFibGUgb24gYW55IE1FLTE0MDAgZGV2aWNlLiAqLworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTQwMCBkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwlzcGlubG9ja190IGNsa19zcmNfcmVnX2xvY2s7CQkJCQkJLyoqPCBHdWFyZHMgdGhlIDgyNTQgY2xvY2sgc291cmNlIHJlZ2lzdGVycy4gKi8KKwlzcGlubG9ja190IGN0cl9jdHJsX3JlZ19sb2NrW01FMTQwMF9NQVhfODI1NF07CQkvKio8IEd1YXJkcyB0aGUgODI1NCBjdHJsIHJlZ2lzdGVycy4gKi8KKworCWludCBkaW9fY3VycmVudF9tb2RlW01FMTQwMF9NQVhfODI1NV07CQkJCS8qKjwgU2F2ZXMgdGhlIGN1cnJlbnQgbW9kZSBzZXR0aW5nIG9mIGEgc2luZ2xlIDgyNTUgRElPIGNoaXAuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9yZWdfbG9ja1tNRTE0MDBfTUFYXzgyNTVdOwkJLyoqPCBHdWFyZHMgdGhlIDgyNTUgY3RybCByZWdpc3RlciBhbmQgI2Rpb19jdXJyZW50X21vZGUuICovCit9IG1lMTQwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE0MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNDAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTQwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMjY5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2V4dF9pcnEuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycV9yZWcuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9NQUdJQ19OVU1CRVIJMHgxNDAxCS8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgY2xhc3Mgc3RydWN0dXJlLiAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19JUlFfU1RBUlRfRElPX0JJVCkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19MSU5FKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgc291cmNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX1JJU0lORykgeworCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgSVJRIG9uIFBMWAorLy8gICAgICAgICAgICAgICAgICAgICAgdG1wID0gaW5iKGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKSB8IChQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9MT0NBTF9JTlQxX1BPTCB8IFBMWF9QQ0lfSU5UX0VOKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgICAgICAgICBQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKFBMWDoweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnBseF9pbnRjc19yZWcsIHRtcCk7CisKKwkvLyBFbmFibGUgSVJRCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQl0bXAgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9IE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOOworCQlvdXRiKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlsb25nIHQgPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWUgb3V0LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCS8qIENvbnZlcnQgdG8gdGlja3MgKi8KKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPm47CisJKnZhbHVlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfaW9faXJxX3N0b3Aoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIElSUSBvbiBQTFgKKy8vICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGluYihpbnN0YW5jZS0+cGx4X2ludGNzX3JlZykgJiAoIH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfCBQTFhfUENJX0lOVF9FTikpOworLy8gICAgICAgICAgICAgICAgICAgICAgb3V0Yih0bXAsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIFBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUExYOjB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZywgdG1wKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJb3V0YigweDAwLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0KKwkgICAgKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaW5zdGFuY2UtPm4gPSAwOworCXJldHVybiBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUUxNDAwX0VYVF9JUlFfTlVNQkVSX0NIQU5ORUxTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRVhUX0lSUTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkc7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlCisJCQkJCQkgICAgKnN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgICBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDhfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgaWYgKCEoKHN0YXR1cyAmIFBMWF9MT0NBTF9JTlQxX1NUQVRFKSAmJiAoc3RhdHVzICYgUExYX0xPQ0FMX0lOVDFfRU4pICYmIChzdGF0dXMgJiBQTFhfUENJX0lOVF9FTikpKQorCWlmICgoc3RhdHVzICYKKwkgICAgIChQTFhfTE9DQUxfSU5UMV9TVEFURSB8IFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX1BDSV9JTlRfRU4pKSAhPQorCSAgICAoUExYX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9QQ0lfSU5UX0VOKSkgeworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UtPm4rKzsKKwlpbnN0YW5jZS0+cmlzZWQgPSAxOworCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ6CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCXRtcCA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl0bXAgJj0gfk1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOOworCQlvdXRiKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJdG1wIHw9IE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOOworCQlvdXRiKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJb3V0YigwLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJb3V0YihNRTE0MDBBQl9FWFRfSVJRX0lSUV9FTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtZTE0MDBfZXh0X2lycV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwkvLyBEaXNhYmxlIElSUSBvbiBQTFgKKwl0bXAgPQorCSAgICBpbmIoaW5zdGFuY2UtPgorCQlwbHhfaW50Y3NfcmVnKSAmICh+KFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX0xPQ0FMX0lOVDFfUE9MIHwKKwkJCQkgICAgUExYX1BDSV9JTlRfRU4pKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPnBseF9pbnRjc19yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIocGx4OjB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZywKKwkJICAgdG1wKTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsICh2b2lkICopaW5zdGFuY2UpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTE0MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJCQkgICAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHVpbnQzMl90IG1lMTQwMF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICoKKwkJCQkJCSAgICAgICBjbGtfc3JjX3JlZ19sb2NrLAorCQkJCQkJICAgICAgIGludCBpcnEpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCXVpbnQ4X3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgMTQwMF9leHRfaXJxIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y2xrX3NyY19yZWdfbG9jayA9IGNsa19zcmNfcmVnX2xvY2s7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1lMTQwMF9leHRfaXJxX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkgIE1FMTQwMF9OQU1FLCAodm9pZCAqKXN1YmRldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGlycS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlzdWJkZXZpY2UtPnBseF9pbnRjc19yZWcgPSBwbHhfcmVnX2Jhc2UgKyBQTFhfSU5UQ1NSX1JFRzsKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gbWUxNDAwX3JlZ19iYXNlICsgTUUxNDAwQUJfRVhUX0lSUV9DVFJMX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTE0MDBfcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEVuYWJsZSBJUlEgb24gUExYCisJdG1wID0KKwkgICAgaW5iKHN1YmRldmljZS0+CisJCXBseF9pbnRjc19yZWcpIHwgKFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX0xPQ0FMX0lOVDFfUE9MIHwKKwkJCQkgIFBMWF9QQ0lfSU5UX0VOKTsKKwlvdXRiKHRtcCwgc3ViZGV2aWNlLT5wbHhfaW50Y3NfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKFBwbHg6MHglbFgpPTB4JXhcbiIsIHN1YmRldmljZS0+cGx4X2ludGNzX3JlZywKKwkJICAgdG1wKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN1YmRldmljZSBtZXRob2RzICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMTQwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMTQwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWUxNDAwX2V4dF9pcnFfZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+biA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjcyYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmgKQEAgLTAsMCArMSw2MiBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZXh0X2lycS5oCisgKgorICogQGJyaWVmIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FMTQwMF9FWFRfSVJRX0hfCisjZGVmaW5lIF9NRTE0MDBfRVhUX0lSUV9IXworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY2xrX3NyY19yZWdfbG9jazsJLyoqPCBMb2NrIHByb3RlY3RpbmcgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIuICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkvKio8IFF1ZXVlIHRvIHB1dCBvbiB0aHJlYWRzIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdC4gKi8KKworCXVpbnQzMl90IGRldmljZV9pZDsJCQkJLyoqPCBUaGUgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUgc3ViZGV2aWNlLiAqLworCWludCBpcnE7CQkJCQkJLyoqPCBUaGUgaXJxIG51bWJlciBhc3NpZ25lZCBieSBQQ0kgQklPUy4gKi8KKwlpbnQgcmlzZWQ7CQkJCQkJLyoqPCBJZiB0cnVlIGFuIGludGVycnVwdCBoYXMgb2NjdXJlZC4gKi8KKwl1bnNpZ25lZCBpbnQgbjsJCQkJCS8qKjwgVGhlIG51bWJlciBvZiBpbnRlcnJ1cHQgc2luY2UgdGhlIGRyaXZlciB3YXMgbG9hZGVkLiAqLworCisJdW5zaWduZWQgbG9uZyBwbHhfaW50Y3NfcmVnOwkvKio8IFRoZSBQTFggaW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3Rlci4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgVGhlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcGx4X3JlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIFBMWCBjaGlwIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBtZTE0MDBfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgTUUtMTQwMCBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGlycSBUaGUgaXJxIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTE0MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJCQkgICAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHVpbnQzMl90IG1lMTQwMF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICoKKwkJCQkJCSAgICAgICBjbGtfc3JjX3JlZ19sb2NrLAorCQkJCQkJICAgICAgIGludCBpcnEpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzQwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmgKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZXh0X2lycV9yZWcuaAorICoKKyAqIEBicmllZiBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTE0MDBfRVhUX0lSUV9SRUdfSF8KKyMgZGVmaW5lIF9NRTE0MDBfRVhUX0lSUV9SRUdfSF8KKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGRlZmluZSBQTFhfSU5UQ1NSX1JFRwkJCQkweDRDCS8qKjwgVGhlIFBMWCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG9mZnNldC4gKi8KKyMgIGRlZmluZSBQTFhfSUNSX1JFRwkJCQkJMHg1MAkvKio8IFRoZSBQTFggaW5pdGlhbGl6YXRpb24gY29udHJvbCByZWdpc3RlciBvZmZzZXQuICovCisKKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMV9FTgkJCQkweDAxCS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQxX1BPTAkJCTB4MDIJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAxIHBvbGFyaXR5IGlzIGhpZ2ggYWN0aXZlLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQxX1NUQVRFCQkJMHgwNAkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDEgaXMgYWN0aXYuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDJfRU4JCQkJMHgwOAkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDIgaXMgZW5hYmxlZC4gKi8KKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMl9QT0wJCQkweDEwCS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMiBwb2xhcml0eSBpcyBoaWdoIGFjdGl2ZS4gKi8KKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMl9TVEFURQkJCTB4MjAJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAyIGlzIGFjdGl2LiAqLworIyAgZGVmaW5lIFBMWF9QQ0lfSU5UX0VOCQkJCTB4NDAJLyoqPCBJZiBzZXQgdGhlIFBDSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gKi8KKyMgIGRlZmluZSBQTFhfU09GVF9JTlQJCQkJCTB4ODAJLyoqPCBJZiBzZXQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gKi8KKworIyAgZGVmaW5lIE1FMTQwMEFCX0VYVF9JUlFfQ1RSTF9SRUcJCTB4MTEJLyoqPCBUaGUgZXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0LiAqLworCisjICBkZWZpbmUgTUUxNDAwQUJfRVhUX0lSUV9DTEtfRU4JCTB4MDEJLyoqPCBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBjbG9jayBvdXRwdXQgaXMgZW5hYmxlZC4gKi8KKyMgIGRlZmluZSBNRTE0MDBBQl9FWFRfSVJRX0lSUV9FTgkJMHgwMgkvKio8IElmIHNldCB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IGlzIGVuYWJsZWQuIENsZWFyaW5nIHRoaXMgYml0IGNsZWFycyBhIHBlbmRpbmcgaW50ZXJydXB0LiAqLworCisjICBkZWZpbmUgTUUxNDAwQ0RfRVhUX0lSUV9DVFJMX1JFRwkJMHgxMQkvKio8IFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBvZmZzZXQuICovCisKKyMgIGRlZmluZSBNRTE0MDBDRF9FWFRfSVJRX0NMS19FTgkJMHgxMAkvKio8IElmIHNldCB0aGUgZXh0ZXJuYWwgaW50ZXJydXB0IGlzIGVuYWJsZWQuIENsZWFyaW5nIHRoaXMgYml0IGNsZWFycyBhIHBlbmRpbmcgaW50ZXJydXB0LiovCisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisKKyNlbmRpZiAvL19NRTE0MDBfRVhUX0lSUV9SRUdfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjI2NjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jCkBAIC0wLDAgKzEsMTAzMyBAQAorLyoqCisgKiBAZmlsZSBtZTE2MDBfYW8uYworICoKKyAqIEBicmllZiBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKiBJbmNsdWRlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZTE2MDBfYW9fcmVnLmgiCisjaW5jbHVkZSAibWUxNjAwX2FvLmgiCisKKy8qIERlZmluZXMKKyAqLworCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKHZvaWQgKnN1YmRldmljZSk7CisjZWxzZQorc3RhdGljIHZvaWQgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworc3RhdGljIGludCBtZTE2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsIGludCByZWYsIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBjaGFubmVsLCBpbnQgKnZhbHVlLAorCQkJCSAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBjaGFubmVsLCBpbnQgdmFsdWUsCisJCQkJICAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKnR5cGUsCisJCQkJCSAgaW50ICpzdWJ0eXBlKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqY2Fwcyk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsIGludCAqbWluLCBpbnQgKm1heCwKKwkJCQkJICAgIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgdW5pdCwKKwkJCQkJIGludCAqY291bnQpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwgaW50ICptaW4sIGludCAqbWF4LAorCQkJCSAgICAgIGludCAqbWF4ZGF0YSk7CisKKy8qIEZ1bmN0aW9ucworICovCisKK21lMTYwMF9hb19zdWJkZXZpY2VfdCAqbWUxNjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBhb19pZHgsCisJCQkJCSAgICAgaW50IGN1cnIsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGNvbmZpZ19yZWdzX2xvY2ssCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGFvX3NoYWRvd3NfbG9jaywKKwkJCQkJICAgICBtZTE2MDBfYW9fc2hhZG93X3QgKgorCQkJCQkgICAgIGFvX3JlZ3Nfc2hhZG93cywKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dxKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGFvX2lkeCk7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTE2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUgorCQkgICAgKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTYwMF9hb19zdWJkZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzdWJkZXZpY2UtPmNvbmZpZ19yZWdzX2xvY2sgPSBjb25maWdfcmVnc19sb2NrOworCXN1YmRldmljZS0+YW9fc2hhZG93c19sb2NrID0gYW9fc2hhZG93c19sb2NrOworCisJLy8gU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4LgorCXN1YmRldmljZS0+YW9faWR4ID0gYW9faWR4OworCisJLy8gSW5pdGlhbGl6ZSByYW5nZSBsaXN0cy4KKwlzdWJkZXZpY2UtPnVfcmFuZ2VzX2NvdW50ID0gMjsKKworCXN1YmRldmljZS0+dV9yYW5nZXNbMF0ubWluID0gMDsJLy8wVgorCXN1YmRldmljZS0+dV9yYW5nZXNbMF0ubWF4ID0gOTk5NzU1ODsJLy8xMFYKKworCXN1YmRldmljZS0+dV9yYW5nZXNbMV0ubWluID0gLTEwRTY7CS8vLTEwVgorCXN1YmRldmljZS0+dV9yYW5nZXNbMV0ubWF4ID0gOTk5NTExNzsJLy8xMFYKKworCWlmIChjdXJyKSB7CQkvLyBUaGlzIGlzIHZlcnNpb24gd2l0aCBjdXJyZW50IG91dHB1dHMuCisJCXN1YmRldmljZS0+aV9yYW5nZXNfY291bnQgPSAyOworCisJCXN1YmRldmljZS0+aV9yYW5nZXNbMF0ubWluID0gMDsJLy8wbUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5tYXggPSAxOTk5NTExNzsJLy8yMG1BCisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5taW4gPSA0RTM7CS8vNG1BCisJCXN1YmRldmljZS0+aV9yYW5nZXNbMV0ubWF4ID0gMTk5OTUxMTg7CS8vMjBtQQorCX0gZWxzZSB7CQkvLyBUaGlzIGlzIHZlcnNpb24gd2l0aG91dCBjdXJyZW50IG91dHB1dHMuCisJCXN1YmRldmljZS0+aV9yYW5nZXNfY291bnQgPSAwOworCisJCXN1YmRldmljZS0+aV9yYW5nZXNbMF0ubWluID0gMDsJLy8wbUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5tYXggPSAwOwkvLzBtQQorCisJCXN1YmRldmljZS0+aV9yYW5nZXNbMV0ubWluID0gMDsJLy8wbUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5tYXggPSAwOwkvLzBtQQorCX0KKworCS8vIEluaXRpYWxpemUgcmVnaXN0ZXJzLgorCXN1YmRldmljZS0+dW5pX2JpX3JlZyA9IHJlZ19iYXNlICsgTUUxNjAwX1VOSV9CSV9SRUc7CisJc3ViZGV2aWNlLT5pX3JhbmdlX3JlZyA9IHJlZ19iYXNlICsgTUUxNjAwXzAyMF80MjBfUkVHOworCXN1YmRldmljZS0+c2ltX291dHB1dF9yZWcgPSByZWdfYmFzZSArIE1FMTYwMF9TSU1fT1VUUFVUX1JFRzsKKwlzdWJkZXZpY2UtPmN1cnJlbnRfb25fcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfQ1VSUkVOVF9PTl9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEluaXRpYWxpemUgc2hhZG93IHN0cnVjdHVyZS4KKwlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cyA9IGFvX3JlZ3Nfc2hhZG93czsKKworCS8vIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTE2MDBfYW9fZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMTYwMF9hb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUxNjAwX2FvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lMTYwMF9hb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMTYwMF9hb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTE2MDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZTE2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPQorCSAgICBtZTE2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZTE2MDBfYW9fcXVlcnlfcmFuZ2VfaW5mbzsKKworCS8vIEluaXRpYWxpemUgd2FpdCBxdWV1ZS4KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLy8gUHJlcGFyZSB3b3JrIHF1ZXVlLgorCXN1YmRldmljZS0+bWUxNjAwX3dvcmtxdWV1ZSA9IG1lMTYwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssIG1lMTYwMF9hb193b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywKKwkJCSAgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCisJLy8gUmVzZXQgc3ViZGV2aWNlIHRvIGFzdXJlIGNsZWFuIGV4aXQuCisJbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJICAgICBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCisJLy8gUmVtb3ZlIGFueSB0YXNrcyBmcm9tIHdvcmsgcXVldWUuIFRoaXMgaXMgcGFyYW5vaWMgYmVjYXVzZSBpdCB3YXMgZG9uZSBhbGxyZWFkeSBpbiByZXNldCgpLgorCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaykpIHsJLy9XYWl0IDIgdGlja3MgdG8gYmUgc3VyZSB0aGF0IGNvbnRyb2wgdGFzayBpcyByZW1vdmVkIGZyb20gcXVldWUuCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJfQorfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgdG1wOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsJLy9DYW5jZWxsIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisKKwkvLyBSZXNldCBhbGwgc2V0dGluZ3MuCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF0gPSAwOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsJLy9Ob3Qgd2FpdGluZyBmb3IgdHJpZ2dlcmluZy4KKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL0luZGl2aWR1YWwgdHJpZ2dlcmluZy4KKworCS8vIFNldCBvdXRwdXQgdG8gZGVmYXVsdCAoc2FmZSkgc3RhdGUuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jb25maWdfcmVnc19sb2NrKTsKKwl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJdG1wID0gaW53KGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CS8vIFZvbHRzIG9ubHkhCisJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXRtcCAmPSAweDAwRkY7CisJb3V0dyh0bXAsIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CisJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwl0bXAgPSBpbncoaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsJLy8gMC4uMjBtQSA8PSBJZiBleGlzdHMuCisJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCVBERUJVR19SRUcoImlfcmFuZ2VfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJb3V0dygwLCAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT5hb19pZHhdKTsKKwlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0gLQorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCisJLy8gVHJpZ2dlciBvdXRwdXQuCisJb3V0dygweDAwMDAsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDAwMCk7CisJb3V0dygweEZGRkYsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4RkZGRik7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCisJLy8gU2V0IHN0YXR1cyB0byAnbm9uZScKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IHRtcDsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJLy8gQ2hlY2tpbmcgcGFyYW1ldGVycy4KKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU29mdHdhcmUgdHJpZ2dlciBoYXMgbm90IGVkZ2UuIE11c3QgYmUgTUVfVFJJR19FREdFX05PTkVcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJfQorCisJaWYgKHRyaWdfdHlwZSAhPSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gTXVzdCBiZSBNRV9UUklHX1RZUEVfU1cuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICgodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKQorCSAgICAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmIChyZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCByZWZlcmVuY2UuIEFuYWxvZyBvdXRwdXRzIGhhdmUgdG8gaGF2ZSBnb3QgUkVGX0FPX0dST1VORC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCgoc2luZ2xlX2NvbmZpZyArIDEpID4KKwkgICAgIChpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQpKQorCSAgICB8fCAoc2luZ2xlX2NvbmZpZyA8IDApKSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisJLy8gQ2hlY2tpbmcgcGFyYW1ldGVycyAtIGRvbmUuIEFsbCBpcyBmaW5lLiBEbyBjb25maWcuCisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL0NhbmNlbGwgd2FpdGluZyBmb3IgdHJpZ2dlci4KKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF0gPSAwOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jb25maWdfcmVnc19sb2NrKTsKKwlzd2l0Y2ggKHNpbmdsZV9jb25maWcpIHsKKwljYXNlIDA6CQkvLyAwViAxMFYKKwkJdG1wID0gaW53KGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CS8vIFZvbHRzCisJCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CisJCVBERUJVR19SRUcoImN1cnJlbnRfb25fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJLy8gMFYKKwkJb3V0dygwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gdW5pcG9sYXIKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyAwLi4yMG1BIDw9IElmIGV4aXN0cy4KKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CQkvLyAtMTBWIDEwVgorCQl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMKKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyAwVgorCQlvdXR3KDB4MDgwMCwKKwkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT5hb19pZHhdKTsKKwkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPgorCQkJCQkJCQkgYW9faWR4XSAtCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDgwMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gYmlwb2xhcgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyAwLi4yMG1BIDw9IElmIGV4aXN0cy4KKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyAwbUEgMjBtQQorCQl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gbUFtcGVycworCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CisJCVBERUJVR19SRUcoImN1cnJlbnRfb25fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEKKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyAwbUEKKwkJb3V0dygwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gdW5pcG9sYXIKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMzoJCS8vIDRtQSAyMG1BCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBtQW1wZXJzCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsJLy8gNC4uMjBtQQorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CisJCVBERUJVR19SRUcoImlfcmFuZ2VfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+aV9yYW5nZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJLy8gNG1BCisJCW91dHcoMCwKKwkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT5hb19pZHhdKTsKKwkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPgorCQkJCQkJCQkgYW9faWR4XSAtCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CS8vIHVuaXBvbGFyCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPnVuaV9iaV9yZWcpOworCQlQREVCVUdfUkVHKCJ1bmlfYmlfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dW5pX2JpX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisJfQorCisJLy8gVHJpZ2dlciBvdXRwdXQuCisJb3V0dygweDAwMDAsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDAwMCk7CisJb3V0dygweEZGRkYsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4RkZGRik7CisKKwlpZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CS8vIEluZGl2aWR1YWwgdHJpZ2dlcmluZy4KKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zeW5jaHJvbm91cyAmPQorCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCVBERUJVRygiSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLlxuIik7CisJfSBlbHNlIGlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CS8vIFN5bmNocm9ub3VzIHRyaWdnZXJpbmcuCisJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgfD0KKwkJICAgICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCVBERUJVRygiU3luY2hyb25vdXMgdHJpZ2dlcmluZy5cbiIpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y29uZmlnX3JlZ3NfbG9jayk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJdW5zaWduZWQgbG9uZyBqID0gMDsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9OT05CTE9DS0lORykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuICVkXG4iLCBmbGFncyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKCghZmxhZ3MpICYmICgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJiBpbnN0YW5jZS0+YW9faWR4KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHNvZnR3YXJlIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKCEoKGluc3RhbmNlLT4KKwkJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzKS0+CisJCQkJCQkgICAgdHJpZ2dlciAmIGluc3RhbmNlLT4KKwkJCQkJCSAgICBhb19pZHgpKSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlID09IGFvX3N0YXR1c19ub25lKSB7CS8vIFJlc2V0IHdhcyBjYWxsZWQuCisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCX0KKworCSp2YWx1ZSA9IChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT5hb19pZHhdOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBqID0gMDsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTIHwKKwkgICAgICBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHZhbHVlICYgfk1FMTYwMF9BT19NQVhfREFUQSkgeworCQlQRVJST1IoIkludmFsaWQgdmFsdWUgcHJvdmlkZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1ZBTFVFX09VVF9PRl9SQU5HRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vQ2FuY2VsbCB3YWl0aW5nIGZvciB0cmlnZ2VyLgorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisJLy9Xcml0ZSB2YWx1ZS4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaW5zdGFuY2UtPmFvX2lkeF0gPQorCSAgICAodWludDE2X3QpIHZhbHVlOworCisJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgewkvLyBUcmlnZ2VyIGFsbCBvdXRwdXRzIGZyb20gc3luY2hyb25vdXMgbGlzdC4KKwkJZm9yIChpID0gMDsgaSA8IChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+Y291bnQ7IGkrKykgeworCQkJaWYgKCgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICYgKDB4MSA8PCBpKSkgfHwgKGkgPT0gaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU2V0IGFsbCBmcm9tIHN5bmNocm9ub3VzIGxpc3QgdG8gY29ycmVjdCBzdGF0ZS4KKwkJCQlQREVCVUcKKwkJCQkgICAgKCJTeW5jaHJvbm91cyB0cmlnZ2VyaW5nOiBvdXRwdXQgJWQuIGlkeD0lZFxuIiwKKwkJCQkgICAgIGksIGluc3RhbmNlLT5hb19pZHgpOworCQkJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2ldID0KKwkJCQkgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV07CisKKwkJCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2ldLAorCQkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpXSk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2ldIC0KKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2ldKTsKKworCQkJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPQorCQkJCSAgICB+KDB4MSA8PCBpKTsKKwkJCX0KKwkJfQorCisJCS8vIFRyaWdnZXIgb3V0cHV0LgorCQlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwkJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJCW91dHcoMHhGRkZGLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgMHhGRkZGKTsKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCX0gZWxzZSB7CQkvLyBJbmRpdmlkdWFsIG1vZGUuCisJCWlmICgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICYgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgewkvLyBQdXQgb24gc3luY2hyb25vdXMgc3RhcnQgbGlzdC4gU2V0IG91dHB1dCBhcyB3YWl0aW5nIGZvciB0cmlnZ2VyLgorCQkJUERFQlVHKCJBZGQgdG8gc3luY2hyb25vdXMgbGlzdC4gaWR4PSVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyIHw9CisJCQkgICAgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX3J1bjsKKwkJCVBERUJVRygiU3luY2hyb25vdXMgbGlzdDogMHgleC5cbiIsCisJCQkgICAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zeW5jaHJvbm91cyk7CisJCX0gZWxzZSB7CS8vIEZpcmVkIHRoaXMgb25lLgorCQkJUERFQlVHKCJUcmlnZ2VyaW5nLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF0gPQorCQkJICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT4KKwkJCQkJCQkJYW9faWR4XTsKKworCQkJb3V0dygoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPgorCQkJICAgICBzaGFkb3dbaW5zdGFuY2UtPmFvX2lkeF0sCisJCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPgorCQkJCQkJCQkgICBhb19pZHhdKTsKKwkJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkJICAgcmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0gLQorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPgorCQkJCSAgIHNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSk7CisKKwkJCS8vIFNldCBvdXRwdXQgYXMgdHJpZ2dlcmVkLgorCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9CisJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkJCS8vIFRyaWdnZXIgb3V0cHV0LgorCQkJb3V0dygweDAwMDAsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLQorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJCQlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAweEZGRkYpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQl9CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCisJLy9Jbml0IGNvbnRyb2wgdGFzaworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lMTYwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoKCFmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSAmJiAoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICYgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy9CbG9ja2luZyBtb2RlLiBXYWl0IGZvciBzb2Z0d2FyZSB0cmlnZ2VyLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJCWlmIChkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gMTsKKwkJfQorCisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBUaGlzIHByb2NlZHVyZSBoYXMgb3duIHRpbWVvdXQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICghKChpbnN0YW5jZS0+CisJCQkJCQkgICAgIGFvX3JlZ3Nfc2hhZG93cyktPgorCQkJCQkJICAgIHRyaWdnZXIgJiBpbnN0YW5jZS0+CisJCQkJCQkgICAgYW9faWR4KSksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5IDogTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZSA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqbnVtYmVyID0gMTsJCS8vRXZlcnkgc3ViZGV2aWNlIGhhcyBvbmx5IDEgY2hhbm5lbC4KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJICBpbnQgKnN1YnR5cGUpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSp0eXBlID0gTUVfVFlQRV9BTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGk7CisJaW50IHIgPSAtMTsKKwlpbnQgZGlmZiA9IDIxRTY7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgoKm1heCAtICptaW4pIDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX01JTl9NQVg7CisJfQorCS8vIE1heGltdW0gcmFuZ2VzIGFyZSBzbGlnaHRseSBsZXNzIHRoZW4gMTBWIG9yIDIwbUEuIEZvciBjb252ZW5pZW50IHdlIGFjY2VwdGVkIHRoaXMgdmFsdWUgYXMgdmFsaWQgb25lLgorCWlmICh1bml0ID09IE1FX1VOSVRfVk9MVCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50OyBpKyspIHsKKwkJCWlmICgoaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbiA8PSAqbWluKQorCQkJICAgICYmICgoaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1heCArIDUwMDApID49ICptYXgpKSB7CisJCQkJaWYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT51X3Jhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkgICAqbWluKSA8CisJCQkJICAgIGRpZmYpIHsKKwkJCQkJciA9IGk7CisJCQkJCWRpZmYgPQorCQkJCQkgICAgKGluc3RhbmNlLT51X3Jhbmdlc1tpXS5tYXggLQorCQkJCQkgICAgIGluc3RhbmNlLT51X3Jhbmdlc1tpXS5taW4pIC0KKwkJCQkJICAgICgqbWF4IC0gKm1pbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHIgPCAwKSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGZvdW5kLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0gZWxzZSB7CisJCQkqbWluID0gaW5zdGFuY2UtPnVfcmFuZ2VzW3JdLm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+dV9yYW5nZXNbcl0ubWF4OworCQkJKnJhbmdlID0gcjsKKwkJfQorCX0gZWxzZSBpZiAodW5pdCA9PSBNRV9VTklUX0FNUEVSRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPmlfcmFuZ2VzX2NvdW50OyBpKyspIHsKKwkJCWlmICgoaW5zdGFuY2UtPmlfcmFuZ2VzW2ldLm1pbiA8PSAqbWluKQorCQkJICAgICYmIChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWF4ICsgNTAwMCA+PSAqbWF4KSkgeworCQkJCWlmICgoaW5zdGFuY2UtPmlfcmFuZ2VzW2ldLm1heCAtCisJCQkJICAgICBpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWluKSAtICgqbWF4IC0KKwkJCQkJCQkJICAgKm1pbikgPAorCQkJCSAgICBkaWZmKSB7CisJCQkJCXIgPSBpOworCQkJCQlkaWZmID0KKwkJCQkJICAgIChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWF4IC0KKwkJCQkJICAgICBpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWluKSAtCisJCQkJCSAgICAoKm1heCAtICptaW4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyIDwgMCkgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBmb3VuZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9IGVsc2UgeworCQkJKm1pbiA9IGluc3RhbmNlLT5pX3Jhbmdlc1tyXS5taW47CisJCQkqbWF4ID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JdLm1heDsKKwkJCSpyYW5nZSA9IHIgKyBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcGh5c2ljYWwgdW5pdCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVU5JVDsKKwl9CisJKm1heGRhdGEgPSBNRTE2MDBfQU9fTUFYX0RBVEE7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCXN3aXRjaCAodW5pdCkgeworCWNhc2UgTUVfVU5JVF9WT0xUOgorCQkqY291bnQgPSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQ7CisJCWJyZWFrOworCWNhc2UgTUVfVU5JVF9BTVBFUkU6CisJCSpjb3VudCA9IGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudDsKKwkJYnJlYWs7CisJY2FzZSBNRV9VTklUX0FOWToKKwkJKmNvdW50ID0gaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50ICsgaW5zdGFuY2UtPmlfcmFuZ2VzX2NvdW50OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoKChyYW5nZSArIDEpID4KKwkgICAgIChpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQpKQorCSAgICB8fCAocmFuZ2UgPCAwKSkgeworCQlQRVJST1IoIkludmFsaWQgcmFuZ2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SQU5HRTsKKwl9CisKKwlpZiAocmFuZ2UgPCBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQpIHsKKwkJKnVuaXQgPSBNRV9VTklUX1ZPTFQ7CisJCSptaW4gPSBpbnN0YW5jZS0+dV9yYW5nZXNbcmFuZ2VdLm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT51X3Jhbmdlc1tyYW5nZV0ubWF4OworCX0gZWxzZSBpZiAocmFuZ2UgPCBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQpIHsKKwkJKnVuaXQgPSBNRV9VTklUX0FNUEVSRTsKKwkJKm1pbiA9IGluc3RhbmNlLT5pX3Jhbmdlc1tyYW5nZSAtIGluc3RhbmNlLT51X3Jhbmdlc19jb3VudF0ubWluOworCQkqbWF4ID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JhbmdlIC0gaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50XS5tYXg7CisJfQorCSptYXhkYXRhID0gTUUxNjAwX0FPX01BWF9EQVRBOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKQorI2Vsc2UKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb193b3JrX2NvbnRyb2xfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisjZW5kaWYKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCByZXNjaGVkdWxlID0gMTsKKwlpbnQgc2lnbmFsaW5nID0gMDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworI2Vsc2UKKwlpbnN0YW5jZSA9CisJICAgIGNvbnRhaW5lcl9vZigodm9pZCAqKXdvcmssIG1lMTYwMF9hb19zdWJkZXZpY2VfdCwgYW9fY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMsCisJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoISgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJiBpbnN0YW5jZS0+YW9faWR4KSkgewkvLyBPdXRwdXQgd2FzIHRyaWdnZXJkLgorCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJc2lnbmFsaW5nID0gMTsKKwkJcmVzY2hlZHVsZSA9IDA7CisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfcnVuKSB7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKworCX0gZWxzZSBpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQlzcGluX2xvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisJCS8vIFJlc3RvcmUgb2xkIHNldHRpbmdzLgorCQlQREVCVUcoIldyaXRlIG9sZCB2YWx1ZSBiYWNrIHRvIHJlZ2lzdGVyLlxuIik7CisJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0KKwkJICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT5hb19pZHhdOworCisJCW91dHcoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF0sCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgICBhb19pZHhdKTsKKworCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0cnQgbGlzdC4KKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9CisJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKwkJfQorCQlzcGluX3VubG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKworCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJc2lnbmFsaW5nID0gMTsKKwkJcmVzY2hlZHVsZSA9IDA7CisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTE2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJiZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5oCkBAIC0wLDAgKzEsMTMyIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxNjAwX0FPX0hfCisjZGVmaW5lIF9NRTE2MDBfQU9fSF8KKworIyBpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjIGluY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyMgaWZkZWYgX19LRVJORUxfXworCisjICBkZWZpbmUgTUUxNjAwX01BWF9SQU5HRVMJMgkvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmFuZ2VzIGluIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6dV9yYW5nZXMgdW5kIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6aV9yYW5nZXMuICovCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBlbnRyeSBpbiB0aGUgcmFuZ2UgdGFibGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19yYW5nZV9lbnRyeSB7CisJaW50MzJfdCBtaW47CisJaW50MzJfdCBtYXg7Cit9IG1lMTYwMF9hb19yYW5nZV9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lMTYwMF9hb190aW1lb3V0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19zaGFkb3cgeworCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nICpyZWdpc3RyeTsKKwl1aW50MTZfdCAqc2hhZG93OworCXVpbnQxNl90ICptaXJyb3I7CisJdWludDE2X3Qgc3luY2hyb25vdXM7CQkJCQkJCQkJLyoqPCBTeW5jaHJvbml6YXRpb24gbGlzdC4gKi8KKwl1aW50MTZfdCB0cmlnZ2VyOwkJCQkJCQkJCQkvKio8IFN5bmNocm9uaXphdGlvbiBmbGFnLiAqLworfSBtZTE2MDBfYW9fc2hhZG93X3Q7CisKK3R5cGVkZWYgZW51bSBNRTE2MDBfQU9fU1RBVFVTIHsKKwlhb19zdGF0dXNfbm9uZSA9IDAsCisJYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19sYXN0Cit9IE1FMTYwMF9BT19TVEFUVVM7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJaW50IGFvX2lkeDsJCQkJCQkJCQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4gKi8KKworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjb25maWdfcmVnc19sb2NrOwkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgdV9yYW5nZXNfY291bnQ7CQkJCQkJCQkJCS8qKjwgVGhlIG51bWJlciBvZiB2b2x0YWdlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisJbWUxNjAwX2FvX3JhbmdlX2VudHJ5X3QgdV9yYW5nZXNbTUUxNjAwX01BWF9SQU5HRVNdOwkvKio8IEFycmF5IGhvbGRpbmcgdGhlIHZvbHRhZ2UgcmFuZ2VzIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCWludCBpX3Jhbmdlc19jb3VudDsJCQkJCQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGN1cnJlbnQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4gKi8KKwltZTE2MDBfYW9fcmFuZ2VfZW50cnlfdCBpX3Jhbmdlc1tNRTE2MDBfTUFYX1JBTkdFU107CS8qKjwgQXJyYXkgaG9sZGluZyB0aGUgY3VycmVudCByYW5nZXMgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBSZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHVuaV9iaV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB1bmlwb2FyIGFuZCBiaXBvbGFyIG91dHB1dCBtb2RlLiAqLworCXVuc2lnbmVkIGxvbmcgaV9yYW5nZV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiByYW5nZXMuICovCisJdW5zaWduZWQgbG9uZyBzaW1fb3V0cHV0X3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciB1c2VkIGluIG9yZGVyIHRvIHVwZGF0ZSBhbGwgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuICovCisJdW5zaWduZWQgbG9uZyBjdXJyZW50X29uX3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciBlbmFibGluZyBjdXJyZW50IG91dHB1dCBvbiB0aGUgZm91cnRoIHN1YmRldmljZS4gKi8KKyMgICBpZmRlZiBQREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyMgICBlbmRpZgorCisJTUUxNjAwX0FPX1NUQVRVUyBzdGF0dXM7CisJbWUxNjAwX2FvX3NoYWRvd190ICphb19yZWdzX3NoYWRvd3M7CQkJCQkvKio8IEFkZHJlc3NlcyBhbmQgc2hhZG93cyBvZiBvdXRwdXQncyByZWdpc3RlcnMuICovCisJc3BpbmxvY2tfdCAqYW9fc2hhZG93c19sb2NrOwkJCQkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCisJaW50IG1vZGU7CQkJCQkJCQkJCQkJLyoqPCBNb2RlIGluIHdpdGNoIG91dHB1dCBzaG91bGQgd29ya3MuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCQkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKwltZTE2MDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJCQkJCS8qKjwgVGhlIHRpbWVvdXQgZm9yIHN0YXJ0IGluIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgbW9kZS4gKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KK30gbWUxNjAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBzdWJkZXZpY2UgdGVtcGxhdGUgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gYW9faWR4IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdXJyZW50IEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuYWxvZyBvdXRwdXQgd2l0aCAjYW9faWR4IG9mIDMgaXMgY2FwYWJsZSBvZiBjdXJyZW50IG91dHB1dC4KKyAqIEBwYXJhbSBjb25maWdfcmVnc19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CisJCQkJCSAgICAgKm1lMTYwMF93cSk7CisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUUxNjAwX0FPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3ODAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTYwMF9BT19SRUdfSF8KKyNkZWZpbmUgX01FMTYwMF9BT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8wX1JFRyAgICAweDAwCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzFfUkVHICAgIDB4MDIJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMl9SRUcgICAgMHgwNAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAyLiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8zX1JFRyAgICAweDA2CS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzRfUkVHICAgIDB4MDgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfNV9SRUcgICAgMHgwQQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA1LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF82X1JFRyAgICAweDBDCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDYuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzdfUkVHICAgIDB4MEUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNy4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfOF9SRUcgICAgMHgxMAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA4LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF85X1JFRyAgICAweDEyCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDkuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEwX1JFRyAgIDB4MTQJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzExX1JFRyAgIDB4MTYJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTEuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyAgIDB4MTgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTIuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEzX1JFRyAgIDB4MUEJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE0X1JFRyAgIDB4MUMJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTQuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyAgIDB4MUUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTUuICovCisKKy8qIEV2ZXJ5IGNoYW5uZWwgb25lIGJpdDogYmlwb2xhciA9IDAsIHVuaXBvbGFyID0gMSAqLworI2RlZmluZSBNRTE2MDBfVU5JX0JJX1JFRwkJMHgyMAkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHVuaXBvbGFyIGFuZCBiaXBvbGFyLiAqLworCisvKiBFdmVyeSBjaGFubmVsIG9uZSBiaXQgKG9ubHkgbG93ZXIgOCBCaXRzKTogMC4uMjBtQSA9IDAsIDQuLjIwbUEgPSAxICovCisjZGVmaW5lIE1FMTYwMF8wMjBfNDIwX1JFRwkJMHgyMgkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gY3VycmVudCByYW5nZXMuICovCisKKy8qIElmIGEgYml0IGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgREFDICg0IHBvcnRzIGVhY2gpIGlzCisgICBub3Qgc2V0IGF0IHRoZSBtb21lbnQgeW91IHdyaXRlIHRvIGFuIG91dHB1dCBvZiBpdC4KKyAgIENsZWFyaW5nIHRoZSBiaXQgdXBkYXRlcyB0aGUgcG9ydC4gKi8KKyNkZWZpbmUgTUUxNjAwX1NJTV9PVVRQVVRfUkVHCTB4MjQJLyoqPCBSZWdpc3RlciB0byB1cGRhdGUgYWxsIGNoYW5uZWxzIG9mIGEgc3ViZGV2aWNlIHNpbXVsdGFuZW91c2x5LiAqLworCisvKiBDdXJyZW50IG9uL29mZiAob25seSBsb3dlciA4IGJpdHMpOiBvZmYgPSAwLCBvbiAgPSAxICovCisjZGVmaW5lIE1FMTYwMF9DVVJSRU5UX09OX1JFRwkweDI2CS8qKjwgUmVnaXN0ZXIgdG8gc3dpY2h0IGJldHdlZW4gdm9sdGFnZSBhbmQgY3VycmVudCBvdXRwdXQuICovCisKKyNkZWZpbmUgTUUxNjAwX0FPX01BWF9EQVRBCQkweDBGRkYJLyoqPCBUaGUgbWF4aW11bSBkaWdpdGFsIGRhdGEgYWNjZXB0ZWQgYnkgYW4gYW5hbG9nIG91dHB1dCBjaGFubmVsLiAqLworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMmNiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTE2MDBfZGV2aWNlLmgiCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZV90ICogc3ViZGV2aWNlLCB1aW50MzJfdCByZWdfYmFzZSk7CitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBHbG9iYWwgdmFyaWFibGUuCisgKiBUaGlzIGlzIHdvcmtpbmcgcXVldWUgZm9yIHJ1bmluZyBhIHNlcGFyYXRlIGF0YXNrIHRoYXQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3Igd29yayBzdGF0dXMgKHN0YXJ0LCBzdG9wLCB0aW1lb3V0cykuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJaW50IGVycjsKKwltZTE2MDBfZGV2aWNlX3QgKm1lMTYwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZHg7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTE2MDBfZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lMTYwMF9kZXZpY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTE2MDBfZGV2aWNlLT5hb19zaGFkb3dzX2xvY2spOworCisJLy8gR2V0IHRoZSBudW1iZXIgb2YgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2VzLgorCWNoaXBfaWR4ID0KKwkgICAgbWUxNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUxNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gQ3JlYXRlIHNoYWRvdyBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPQorCSAgICBtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzOworCW1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeSA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJICAgIEdGUF9LRVJORUwpOworCW1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZSwKKwkJCSAgICBtZTE2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSk7CisJbWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnNoYWRvdyA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1aW50MTZfdCksCisJCSAgICBHRlBfS0VSTkVMKTsKKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yID0KKwkgICAga21hbGxvYyhtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzICogc2l6ZW9mKHVpbnQxNl90KSwKKwkJICAgIEdGUF9LRVJORUwpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lMTYwMF92ZXJzaW9uc1tjaGlwX2lkeF0uYW9fY2hpcHM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTYwMF9hb19jb25zdHJ1Y3RvcihtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAoKG1lMTYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgICBbY2hpcF9pZHhdLmN1cnIgPgorCQkJCQkJCSAgICAgICBpKSA/IDEgOiAwKSwKKwkJCQkJCQkgICAgICZtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGNvbmZpZ19yZWdzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19zaGFkb3dzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MsCisJCQkJCQkJICAgICBtZTE2MDBfd29ya3F1ZXVlKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTE2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJbWUxNjAwX2RldmljZS0+YmFzZS5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9kZXN0cnVjdG9yOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE2MDBfZGV2aWNlOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpCit7CisJbWUxNjAwX2RldmljZV90ICptZTE2MDBfZGV2aWNlID0gKG1lMTYwMF9kZXZpY2VfdCAqKSBkZXZpY2U7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gRGVzdHJveSBzaGFkb3cgaW5zdGFuY2UuCisJa2ZyZWUobWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3Muc2hhZG93KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yKTsKKworCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTYwMF9kZXZpY2UpOworCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfc2V0X3JlZ2lzdHJ5KG1lMTYwMF9kZXZpY2VfdCAqIHN1YmRldmljZSwgdWludDMyX3QgcmVnX2Jhc2UpCit7CQkJCS8vIENyZWF0ZSBzaGFkb3cgc3RydWN0dXJlLgorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzBdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDIpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMV0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMykgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsyXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8yX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA0KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzNdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDUpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbNF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gNikgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs1XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF81X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA3KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzZdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzZfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDgpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbN10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfN19SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gOSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs4XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF84X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs5XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF85X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxMF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDEyKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzExXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTMpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTJdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxNCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxM10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDE1KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzE0XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTYpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTVdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+IDE2KSB7CisJCVBFUlJPUigiTW9yZSB0aGFuIDE2IG91dHB1dHMhICglZClcbiIsCisJCSAgICAgICBzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCk7CisJfQorfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwltZTE2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lMTYwMCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxNjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwlmbHVzaF93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7Cit9CisKK21vZHVsZV9pbml0KG1lMTYwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTYwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNRS0xNjAwIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE2MDAgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTE2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjIzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTE2MDBfSAorI2RlZmluZSBfTUUxNjAwX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9hby5oIgorI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIHRvIHN0b3JlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgYW9fY2hpcHM7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIGFuYWxvZyBvdXRwdXRzIG9uIHRoZSBkZXZpY2UuICovCisJaW50IGN1cnI7CQkJCQkJLyoqPCBGbGFnIHRvIGlkZW50aWZ5IGFtb3VudHMgb2YgY3VycmVudCBvdXRwdXQuICovCit9IG1lMTYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICAqIEBicmllZiBEZWZpbmVzIGZvciBlYWNoIE1FLTE2MDAgZGV2aWNlIHZlcnNpb24gaXRzIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMTYwMF92ZXJzaW9uX3QgbWUxNjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVLCA0LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUsIDgsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUsIDEyLCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVLCAxNiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SSwgMTYsIDh9LAorCXswfQorfTsKKworLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUxNjAwX3ZlcnNpb25zLiAqLworI2RlZmluZSBNRTE2MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNjAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE2MDBfdmVyc2lvbl90KSAtIDEpCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMTYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTE2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMTYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUxNjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUxNjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGNvbmZpZ19yZWdzX2xvY2s7CQkJLyoqPCBQcm90ZWN0cyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisKKwltZTE2MDBfYW9fc2hhZG93X3QgYW9fcmVnc19zaGFkb3dzOwkJLyoqPCBBZGRyZXNzZXMgYW5kIHNoYWRvd3Mgb2Ygb3V0cHV0J3MgcmVnaXN0ZXJzLiAqLworCXNwaW5sb2NrX3QgYW9fc2hhZG93c19sb2NrOwkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCit9IG1lMTYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBkZTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jCkBAIC0wLDAgKzEsMzQzNCBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYWkuYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKworI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYWlfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgKGxvY2FsKQorICovCisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBpbmxpbmUgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkX2dldF92YWx1ZShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKgorCQkJCQkJICAgICBpbnN0YW5jZSwgaW50ICp2YWx1ZXMsCisJCQkJCQkgICAgIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCSAgICAgY29uc3QgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqY2Fwcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworc3RhdGljIGludCBhaV9tdXhfdG9nZ2xlcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKiogSW1taWRpYXRlIHN0b3AuCisqIFJlc2V0IGFsbCBJUlEncyBzb3VyY2VzLiAoYmxvY2sgbGFjaGVzKQorKiBQcmVzZXJ2ZSBGSUZPCisqLworc3RhdGljIGludCBhaV9zdG9wX2ltbWVkaWF0ZWx5KG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIEltbWlkaWF0ZSBzdG9wLgorKiBSZXNldCBhbGwgSVJRJ3Mgc291cmNlcy4gKGJsb2NrIGxhY2hlcykKKyogUmVzZXQgZGF0YSBGSUZPCisqLwordm9pZCBpbmxpbmUgYWlfc3RvcF9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogSW50ZXJydXB0IGxvZ2ljcy4KKyogUmVhZCBkYXRhcworKiBSZXNldCBsYXRjaGVzCisqLwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKKworLyoqIExhc3QgY2h1bmNrIG9mIGRhdGFzLiBXZSBtdXN0IHJlc2NoZWR1bGUgc2FtcGxlIGNvdW50ZXIuCisqIExlYXZpbmcgU0NfUkVMT0FEIGRvZXNuJ3QgZG8gYW55IGhhcm0sIGJ1dCBpbiBzb21lIGJhZCBjYXNlIGNhbiBtYWtlIGV4dHJhIGludGVycnVwdHMuCisqIFdoZW4gdGhyZXNob2xkIGlzIHdyb25nbHkgc2V0IHNvbWUgSVJRIGFyZSBsb3N0LighISEpCisqLwordm9pZCBpbmxpbmUgYWlfcmVzY2hlZHVsZV9TQyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBSZWFkIGRhdGFzIGZyb20gRklGTyBhbmQgY29weSB0aGVtIHRvIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgICAgIGNvbnN0IGludCBjb3VudCk7CisKKy8qKiBDb3B5IHJlc3Qgb2YgZGF0YSBmcm9tIGZpZm8gdG8gY2lyY3VsYXIgYnVmZmVyLiovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGFfcG9vbGluZyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhdGUgZm9yIGluZmluaXRlIGRhdGEgYXF1c2F0aW9uIG1vZGUqLwordm9pZCBpbmxpbmUgYWlfaW5maW5pdGVfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIFNldCBJU00gdG8gbmV4dCBzdGF0ZSBmb3IgZGVmaW5lIGFtb3VudCBvZiBkYXRhIGFxdXNhdGlvbiBtb2RlKi8KK3ZvaWQgaW5saW5lIGFpX2xpbWl0ZWRfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgdWludDMyX3QgaXJxX3N0YXR1cyk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhZ2UgZm9yIGxpbWl0ZWQgbW9kZSAqLwordm9pZCBpbmxpbmUgYWlfZGF0YV9hY3F1aXNpdGlvbl9sb2dpYyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucworICovCisKK21lNDYwMF9haV9zdWJkZXZpY2VfdCAqbWU0NjAwX2FpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2VzLAorCQkJCQkgICAgIGludCBpc29sYXRlZCwKKwkJCQkJICAgICBpbnQgc2gsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaywKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dxKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FpX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8vIEluaXRpYWxpemUgY2lyY3VsYXIgYnVmZmVyLgorCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCAtIDE7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJICAgICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJUERFQlVHKCJjaXJjX2J1ZiA9ICVwIHNpemU9JWxkXG4iLCBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkgICAgICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCisJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgY2lyY3VsYXIgYnVmZmVyLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCXN1YmRldmljZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBTYXZlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisJc3ViZGV2aWNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisJCXN1YmRldmljZS0+c2luZ2xlX2NvbmZpZ1tpXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsJLy9ub3QgY29uZmlndXJlZAorCX0KKworCS8vIFNhdmUgaWYgaXNvbGF0ZWQgZGV2aWNlLgorCXN1YmRldmljZS0+aXNvbGF0ZWQgPSBpc29sYXRlZDsKKworCS8vIFNhdmUgaWYgc2FtcGxlIGFuZCBob2xkIGlzIGF2YWlsYWJsZS4KKwlzdWJkZXZpY2UtPnNoID0gc2g7CisKKwkvLyBTZXQgc3RyZWFtIGNvbmZpZyB0byBub3QgY29uZmlndXJlZCBzdGF0ZS4KKwlzdWJkZXZpY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IDA7CisJc3ViZGV2aWNlLT5kYXRhX3JlcXVpcmVkID0gMDsKKwlzdWJkZXZpY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMgYWRkcmVzc2VzLgorCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+Y2hhbm5lbF9saXN0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUc7CisJc3ViZGV2aWNlLT5kYXRhX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0RBVEFfUkVHOworCXN1YmRldmljZS0+Y2hhbl90aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfbG93X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUc7CisJc3ViZGV2aWNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c3RhcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU1RBUlRfUkVHOworCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnNhbXBsZV9jb3VudGVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSByYW5nZXMuCisJc3ViZGV2aWNlLT5yYW5nZXNfbGVuID0gcmFuZ2VzOworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1pbiA9IC0xMEU2OworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1heCA9IDk5OTk2OTQ7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1sxXS5taW4gPSAwOworCXN1YmRldmljZS0+cmFuZ2VzWzFdLm1heCA9IDk5OTk4NDc7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5taW4gPSAtMjVFNTsKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5tYXggPSAyNDk5OTIzOworCisJc3ViZGV2aWNlLT5yYW5nZXNbM10ubWluID0gMDsKKwlzdWJkZXZpY2UtPnJhbmdlc1szXS5tYXggPSAyNDk5OTYxOworCisJLy8gV2UgaGF2ZSB0byBzd2l0Y2ggdGhlIG11eCBpbiBvcmRlciB0byBnZXQgaXQgd29yayBjb3JyZWN0bHkuCisJYWlfbXV4X3RvZ2dsZXIoc3ViZGV2aWNlKTsKKworCS8vIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTQ2MDBfYWlfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJUEVSUk9SKCJDYW5ub3QgcmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvLyBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FpX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYWlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYWlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9haV9xdWVyeV90aW1lcjsKKworCS8vIFByZXBhcmUgd29yayBxdWV1ZS4KKwlzdWJkZXZpY2UtPm1lNDYwMF93b3JrcXVldWUgPSBtZTQ2MDBfd3E7CisKKy8qIHdvcmtxdWV1ZSBBUEkgY2hhbmdlZCBpbiBrZXJuZWwgMi42LjIwICovCisjaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApICkKKwlJTklUX1dPUksoJnN1YmRldmljZS0+YWlfY29udHJvbF90YXNrLCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2ssCisJCSAgKHZvaWQgKilzdWJkZXZpY2UpOworI2Vsc2UKKwlJTklUX0RFTEFZRURfV09SSygmc3ViZGV2aWNlLT5haV9jb250cm9sX3Rhc2ssCisJCQkgIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJLy8gUmVzZXQgc3ViZGV2aWNlIHRvIGFzdXJlIGNsZWFuIGV4aXQuCisJbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJICAgICBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCisJLy8gUmVtb3ZlIGFueSB0YXNrcyBmcm9tIHdvcmsgcXVldWUuIFRoaXMgaXMgcGFyYW5vaWMgYmVjYXVzZSBpdCB3YXMgZG9uZSBhbGxyZWFkeSBpbiByZXNldCgpLgorCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzaykpIHsJLy9XYWl0IDIgdGlja3MgdG8gYmUgc3VyZSB0aGF0IGNvbnRyb2wgdGFzayBpcyByZW1vdmVkIGZyb20gcXVldWUuCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJfQorCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWNvbnN0IGludCB0aW1lb3V0ID0gSFogLyAxMDsJLy8xMDBtcworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgc3RhdHVzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL1N0b3AgRE1BCisJCWN0cmwgJj0gfk1FNDYwMF9BSV9DVFJMX1JQQ0lfRklGTzsKKwkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEKKwkJY3RybCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NUT1A7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpCisJCQlicmVhazsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCS8vIENsZWFyIGFsbCBmZWF0dXJlcy4gRGlzc2FibGUgaW50ZXJydXB0cy4KKwljdHJsICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX1NUT1AKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlEKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwljdHJsIHw9IChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJIHwgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAorCQkgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCisJCSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpOworCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBzdGF0dXMpOworCisJb3V0bChNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUyk7CisJb3V0bChNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUyAtIDEsIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fcHJlX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbHhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX01JTl9BQ1FfVElDS1MpOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgweEVGRkZGRkZGLCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICAweEVGRkZGRkZGKTsKKworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisJaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcy4KKwlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPmNoYW5uZWxzOyBpKyspIHsKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uc3RhdHVzID0KKwkJICAgIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVEOworCX0KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGk7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNvZnR3YXJlIHRyaWdnZXIgaGFzIG5vdCBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoaW5zdGFuY2UtPmNoYW5uZWxzIDw9IDE2KQkvL09ubHkgdmVyc2lvbnMgd2l0aCAzMiBjaGFubmVscyBoYXZlIGFuYWxvZyB0cmlnZ2VyICg0NjcwIGFuZCA0NjgwKQorCQl7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0FOWSkKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX1JJU0lORykKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0ZBTExJTkcpKSB7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmICgoc2luZ2xlX2NvbmZpZyA8IDApIHx8IChzaW5nbGVfY29uZmlnID49IGluc3RhbmNlLT5yYW5nZXNfbGVuKSkgeworCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSAmJiAocmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKChzaW5nbGVfY29uZmlnICUgMikgJiYgKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSkgeworCQlQRVJST1IoIkludmFsaWQgYW5hbG9nIHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmICgocmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpCisJICAgICYmICgoaW5zdGFuY2UtPmNoYW5uZWxzID09IDE2KSB8fCAoY2hhbm5lbCA+PSAxNikpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKGNoYW5uZWwgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY2hhbm5lbCA+PSBpbnN0YW5jZS0+Y2hhbm5lbHMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy9QcmVwYXJlIGRhdGEgZW50cnkuCisJLy8gQ29tbW9uIGZvciBhbGwgbW9kZXMuCisJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgPQorCSAgICBjaGFubmVsIHwgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWTsKKworCWlmIChyZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgewkvLyBNRV9SRUZfQUlfRElGRkVSRU5USUFMCisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5IHw9CisJCSAgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUw7CisJfQorLyoKKwkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQllbHNlCisJCXsvLyBNRV9SRUZfQUlfR1JPVU5ECisJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQ7CisJCX0KKyovCisJc3dpdGNoIChzaW5nbGVfY29uZmlnKSB7CisJY2FzZSAwOgkJLy8tMTBWLi4xMFYKKy8qCisJCQkJCS8vIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAgPSAweDAwMDAKKwkJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQkJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8gYnJlYWs7CisKKwljYXNlIDE6CQkvLzBWLi4xMFYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vLTIuNVYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQlicmVhazsKKworCWNhc2UgMzoJCS8vMFYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJfQorCisJLy8gUHJlcGFyZSBjb250cm9sIHJlZ2lzdGVyLgorCS8vIENvbW1vbiBmb3IgYWxsIG1vZGVzLgorCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgPQorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRzsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5jdHJsIHw9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnX2VkZ2UpIHsKKwljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8PQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQk9USDsKKworCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0ZBTExJTkc7CisJCWJyZWFrOworCX0KKworCS8vIEVuYWJsZSB0aGlzIGNoYW5uZWwKKwlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVEOworCisJLy8gQ29weSB0aGlzIHNldHRpbmdzIHRvIG90aGVyIG91dHB1dHMuCisJaWYgKGZsYWdzID09IE1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJZm9yIChpID0gY2hhbm5lbCArIDE7IGkgPCBpbnN0YW5jZS0+Y2hhbm5lbHM7IGkrKykgeworCQkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uY3RybCA9CisJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybDsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLmVudHJ5ID0KKwkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCQkgICAgTUVfU0lOR0xFX0NIQU5ORUxfQ09ORklHVVJFRDsKKwkJfQorCX0KKworCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl2b2xhdGlsZSB1aW50MzJfdCB0bXA7CisJdm9sYXRpbGUgdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoKGNoYW5uZWwgPiBpbnN0YW5jZS0+Y2hhbm5lbHMpIHx8IChjaGFubmVsIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uc3RhdHVzICE9CisJICAgIE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQpIHsKKwkJUEVSUk9SKCJDaGFubmVsIGlzIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvLyBDYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLlxuIik7CisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrKTsKKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIE1hcmsgdGhhdCBTdHJlYW1Db25maWcgaXMgcmVtb3ZlZC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkvLy8gQG5vdGUgSW1wcnRhbnQ6IFByZXNlcnZlIEVYVCBJUlEgc2V0dGluZ3MuCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUSk7CisJdG1wIHw9CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVDsKKworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisKKwkvL1JlYWN0aXZlIEZJRk9zLiBFbmFibGUgd29yay4KKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5LAorCSAgICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkpOworCisJLy8gUHJlc2VydmUgRVhUIElSUSBzZXR0aW5ncy4KKwl0bXAgJj0gKE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQKKwkJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCQlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkJZGVsYXkgPSAyOworCX0KKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCWlmIChkZWxheSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQuCisJCQkJUEVSUk9SKCJWYWx1ZSBub3QgYXZhaWxhYmxlIGFmdGVyIHdhaXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCX0gZWxzZSB7CS8vIEV4dGVybmFsIHN0YXJ0LgorCQkJCVBFUlJPUigiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQpIHsKKwkJCVBFUlJPUigiV2FpdCBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBSZWFkIHZhbHVlLgorCWlmICghZXJyKSB7CisJCXZhbCA9IGlubChpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwOworCQlQREVCVUdfUkVHKCJkYXRhX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+ZGF0YV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbCk7CisJCSp2YWx1ZSA9IHZhbCAmIE1FNDYwMF9BSV9NQVhfREFUQTsKKwl9IGVsc2UgeworCQkqdmFsdWUgPSAweEZGRkZGRkZGOworCX0KKworCS8vIFJlc3RvcmUgc2V0dGluZ3MuCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMuCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUTsKKwl0bXAgfD0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwgTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgaTsJCQkvLyBpbnRlcm5hbCBtdWx0aXB1cnBvc2UgdmFyaWFibGUKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV9yZXF1aXJlZDsKKworCXZvbGF0aWxlIHVpbnQzMl90IGVudHJ5OworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmwgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJdm9sYXRpbGUgdWludDMyX3QgdG1wOwkvLyB1c2Ugd2hlbiBjdXJyZW50IGNvcHkgb2YgcmVnaXN0ZXIncyB2YWx1ZSBuZWVkZWQKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCXVpbnQ2NF90IGFjcV90aWNrczsKKwl1aW50NjRfdCBzY2FuX3RpY2tzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGFjcV9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgYWNxX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0hpZ2g7CisJdW5zaWduZWQgaW50IHNjYW5fc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICAvLyBDb252ZXJ0IHRpY2tzIHRvIDY0IGJpdCBsb25nIHZhbHVlcworCSAgICBhY3FfdGlja3MgPQorCSAgICAodWludDY0X3QpIGFjcV9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBhY3Ffc3RhcnRfdGlja3NfaGlnaCA8PCAzMik7CisJc2Nhbl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgc2Nhbl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCS8vIENoZWNrIHNldHRpbmdzIC0gYmVnaW4KKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKQorCSAgICAmJiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJCWdvdG8gRVJST1I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGFjcV90aWNrcyA8IE1FNDYwMF9BSV9NSU5fQUNRX1RJQ0tTKQorCSAgICB8fCAoYWNxX3RpY2tzID4gTUU0NjAwX0FJX01BWF9BQ1FfVElDS1MpKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoc2Nhbl90aWNrcyA8IE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUykKKwkJICAgIHx8IChzY2FuX3RpY2tzID4gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTKQorCQkgICAgfHwgKHNjYW5fdGlja3MgPCBjb3VudCAqIGNvbnZfdGlja3MpCisJCSAgICApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZCAoQWNxIGlzIEhXIGRpZ2l0YWwpXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkIChBY3EgaXMgSFcgYW5hbG9nKVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUNvbnZTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9USU1FUjoKKwkJaWYgKChjb252X3RpY2tzIDwgTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTKQorCQkgICAgfHwgKGNvbnZfdGlja3MgPiBNRTQ2MDBfQUlfTUFYX0NIQU5fVElDS1MpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykKKwkJICAgIHx8ICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSAhPQorCQkJTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKQorCQkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9CisJCQlNRV9UUklHX1RZUEVfRVhUX0FOQUxPRykpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKy8qKgorKiBBY2VwdGFibGUgc2V0dGluZ3M6CisqIGlTY2FuU3RvcFRyaWdUeXBlCQk6CWlBY3FTdG9wVHJpZ1R5cGUKKyoKKyogTUVfVFJJR19UWVBFX05PTkUJCToJTUVfVFJJR19UWVBFX05PTkUJLT4gaW5maW5pdGUgY291bnQgd2l0aCBtYW51YWwgc3RvcAorKiBNRV9UUklHX1RZUEVfTk9ORQkJOglNRV9UUklHX1RZUEVfQ09VTlQJLT4gc3RvcCBhZnRlciBnZXR0aW5nIGlTY2FuU3RvcENvdW50IGxpc3Qgb2YgdmFsdWVzIChpU2NhblN0b3BDb3VudCAqIGNvdW50KQorKiBNRV9UUklHX1RZUEVfQ09VTlQJOglNRV9UUklHX1RZUEVfRk9MTE9XCS0+IHN0b3AgYWZ0ZXIgZ2V0dGluZyBpQWNxU3RvcENvdW50IHZhbHVlcyAoaXQgY2FuIHN0b3BzIGluIG1pZGxlIG9mIHRoZSBsaXN0KQorKi8KKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9DT1VOVCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gb3Igc2NhbiBzdG9wIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgoY291bnQgPD0gMCkgfHwgKGNvdW50ID4gTUU0NjAwX0FJX0xJU1RfQ09VTlQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorLy8vVGhpcyBpcyBnZW5lcmFsIGxpbWl0YXRpb24KKy8vICAgICAgaWYgKGZpZm9faXJxX3RocmVzaG9sZCA8IDAgfHwgZmlmb19pcnFfdGhyZXNob2xkID49IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCkKKy8vL1RoaXMgaXMgbGltaXRhdGlvbiBmcm9tIFdpbmRvd3MuIEkgdXNlIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCWlmIChmaWZvX2lycV90aHJlc2hvbGQgPCAwCisJICAgIHx8IGZpZm9faXJxX3RocmVzaG9sZCA+PSBNRTQ2MDBfQUlfRklGT19DT1VOVCkgeworCQlQRVJST1IoIkludmFsaWQgZmlmbyBpcnEgdGhyZXNob2xkIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZJRk9fSVJRX1RIUkVTSE9MRDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkgICAgJiYgKGluc3RhbmNlLT5jaGFubmVscyA9PSAxNikpIHsKKwkJUEVSUk9SCisJCSAgICAoIkRpZmZlcmVudGlhbCByZWZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1NBTVBMRV9BTkRfSE9MRCkgeworCQlpZiAoIWluc3RhbmNlLT5zaCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBib2FyZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPCAwKQorCQkgICAgfHwgKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPj0gaW5zdGFuY2UtPnJhbmdlc19sZW4pKSB7CisJCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gTUVfUkVGX0FJX0dST1VORCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pUmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlcyBpbiB0aGUgbGlzdC4gUmVmPTB4JXhcbiIsCisJCQkgICAgICAgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyAlIDIpIHsJLy8gU3RyZWFtQ29uZmlnOiAxIG9yIDMKKwkJCWlmIChjb25maWdfbGlzdFtpXS5pUmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJPbmx5IGJpcG9sYXIgbW9kZXMgc3VwcG9ydCBkaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9CisKKwkJaWYgKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gY29uZmlnX2xpc3RbMF0uaVJlZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJOb3QgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbGlzdCBhcmUgZXF1YWwuIFJlZlswXT0weCV4IFJlZlslZF09MHgleFxuIiwKKwkJCSAgICAgY29uZmlnX2xpc3RbMF0uaVJlZiwgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA+PSAxNikpIHsKKwkJCVBFUlJPUigiQ2hhbm5lbCBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJaWYgKChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA8IDApCisJCSAgICB8fCAoY29uZmlnX2xpc3RbaV0uaUNoYW5uZWwgPj0gaW5zdGFuY2UtPmNoYW5uZWxzKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJZ290byBFUlJPUjsKKwkJfQorCX0KKworCS8vIENoZWNrIHNldHRpbmdzIC0gZW5kCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suXG4iKTsKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCisJLy8gV29yayBhcm91bmQgZnJvbSBLZWl0aCBIYXJ0bGV5IC0gYmVnaW4KKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9USU1FUikgeworCQlpZiAoY291bnQgPT0gMSkgeworCQkJLy8gVGhlIGhhcmR3YXJlIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCBhIG5vbi16ZXJvIHNjYW4gdGltZQorCQkJLy8gaWYgdGhlcmUgaXMgb25seSBPTkUgY2hhbm5lbCBpbiB0aGUgY2hhbm5lbCBsaXN0LiBJbiB0aGlzIGNhc2UKKwkJCS8vIHdlIG11c3Qgc2V0IHRoZSBzY2FuIHRpbWUgdG8gemVybyBhbmQgdXNlIHRoZSBjaGFubmVsIHRpbWUuCisKKwkJCWNvbnZfdGlja3MgPSBzY2FuX3RpY2tzOworCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfSBlbHNlIGlmIChzY2FuX3RpY2tzID09IGNvdW50ICogY29udl90aWNrcykgeworCQkJLy8gQW5vdGhlciBoYXJkd2FyZSBwcm9ibGVtLiBJZiB0aGUgbnVtYmVyIG9mIHNjYW4gdGlja3MgaXMKKwkJCS8vIGV4YWN0bHkgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaGFubmVsIHRpY2tzIG11bHRpcGxpZWQgYnkKKwkJCS8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlbiB0aGUgc2FtcGxpbmcgcmF0ZSBpcyByZWR1Y2VkCisJCQkvLyBieSBoYWxmLgorCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfQorCX0KKwkvLyBXb3JrIGFyb3VuZCBmcm9tIEtlaXRoIEhhcnRsZXkgLSBlbmQKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU3RvcCBhbGwgYWN0aW9ucy4gQmxvY2sgYWxsIGludGVycnVwdHMuIENsZWFyIChkaXNhYmxlKSBGSUZPcy4KKwljdHJsID0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gU2VuZCBpdCB0byByZWdpc3Rlci4KKwlvdXRsKHRtcCB8IGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCB8IGN0cmwpOworCisJLy8gRW5hYmxlIGNoYW5uZWwgZmlmbyAtPiBkYXRhIGZpZm8gaW4gc3RyZWFtX3N0YXJ0KCkuCisJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPOworCW91dGwodG1wIHwgY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wIHwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIFdyaXRlIHRoZSBjaGFubmVsIGxpc3QKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllbnRyeSA9IGNvbmZpZ19saXN0W2ldLmlDaGFubmVsOworCisJCXN3aXRjaCAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZykgeworCQljYXNlIDA6CS8vQklQT0xBUiAxMFYKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA9IDB4MDAwMAorCQkJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwJyA8PT0gRG8gbm90aGluZy4gUmVtb3ZlZC4KKwkJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8vVU5JUE9MQVIgMTBWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8vQklQT0xBUiAyLjVWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJCWJyZWFrOworCQljYXNlIDM6CS8vVU5JUE9MQVIgMi41VgorCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgRVJST1IgaW4gY29uZmlnX2xpc3QhXG4iKTsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiV1JPTkcgcmFuZ2VcblBvc2l0aW9uOiVkIFJhbmdlOjB4JTA0WFxuIiwgaSwKKwkJCSAgICAgY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyk7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChjb25maWdfbGlzdFtpXS5pUmVmKSB7CisJCWNhc2UgTUVfUkVGX0FJX0dST1VORDoJLy9TSU5HTEUgRU5ERUQKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCcgPT0+IERvIG5vdGhpbmcuIFJlbW92ZWQuCisJCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEOworKi8gYnJlYWs7CisJCWNhc2UgTUVfUkVGX0FJX0RJRkZFUkVOVElBTDoJLy9ESUZGRVJFTlRJQUwKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIEVSUk9SIGluIGNvbmZpZ19saXN0IVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIHJlZmVyZW5jZVxuUG9zaXRpb246JWQgUmVmZXJlbmNlOjB4JTA0WFxuIiwKKwkJCSAgICAgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLy9BZGQgbGFzdCBlbnRyeSBmbGFnCisJCWlmIChpID09IChjb3VudCAtIDEpKSB7CisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9MQVNUX0VOVFJZOworCQl9CisKKwkJb3V0bChlbnRyeSwgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGVudHJ5KTsKKwl9CisKKwkvLyBTZXQgdHJpZ2dlcmluZyByZWdpc3RlcnMKKwktLWFjcV90aWNrczsKKwlvdXRsKGFjcV90aWNrcywgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl9wcmVfdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBhY3FfdGlja3MpOworCW91dGwoYWNxX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGFjcV90aWNrcyAmIDB4RkZGRkZGRkYpOworCW91dGwoKGFjcV90aWNrcyA+PiAzMiksIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGFjcV90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCS8vIFNldCB0cmlnZ2VycworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUpIHsKKwkJLy8gSW50ZXJuYWwKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJLy8gTm90aGluZyB0byBzZXQuCisJCWJyZWFrOworCisJCS8vIEV4dGVybmFsCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0c7CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUc7CisKKwkJLy8gRXh0ZXJuYWwgdHJpZ2dlciBuZWVkcyBlZGdlJ3MgZGVmaW5pdGlvbgorCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORzsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HIHwKKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiVU5DSEVDSyBUUklHR0VSIEVER0UgaW4gdHJpZ2dlcnMgc3RydWN0dXJlIVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCSAgICAgdHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBUUklHR0VSIGluIHRyaWdnZXJzIHN0cnVjdHVyZSFcbiIpOworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSk7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwkJZ290byBWRVJJRllfRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCS0tc2Nhbl90aWNrczsKKwkJb3V0bChzY2FuX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBzY2FuX3RpY2tzICYgMHhGRkZGRkZGRik7CisJCW91dGwoKHNjYW5fdGlja3MgPj4gMzIpLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoc2Nhbl90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCQlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKwkJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgMCk7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMjsKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIDApOworCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBzY2FuIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX1RJTUVSOgorCQktLWNvbnZfdGlja3M7CisJCW91dGwoY29udl90aWNrcywgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY29udl90aWNrcyk7CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJb3V0bCgwLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwgTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBjb252IHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKworCQlicmVhazsKKwl9CisKKwkvL1NhbXBsZSAmIEhvbGQgZmVhdHVyZQorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xEKSB7CisJCWlmIChpbnN0YW5jZS0+c2gpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NBTVBMRV9IT0xEOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIFMmSCBmZWF0dXJlIVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCX0KKwl9CisJLy9FbmFibGUgSVJRcyBzb3VyY2VzIGJ1dCBsZWF2ZSBsYXRjaGVzIGJsb2NrZWQuCisJY3RybCB8PSAoTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKTsJLy9UaGUgbGFzdCBJUlEgc291cmNlIChNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKSBpcyB1bnVzZWQhCisKKwkvL0V2ZXJ5dGhpbmcgaXMgZ29vZC4gRmluYWxpemUKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCS8vUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gd3JpdGUgdGhlIGNvbnRyb2wgd29yZAorCW91dGwoY3RybCB8IHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCB8IHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vU2V0IHRoZSBnbG9iYWwgcGFyYW1ldGVycyBlbmQgZXhpdC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IGNvdW50OworCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSBmaWZvX2lycV90aHJlc2hvbGQ7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsKKwkJZGF0YV9yZXF1aXJlZCA9CisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRyaWdnZXItPmlBY3FTdG9wQ291bnQgKgorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudDsKKwkJaWYgKGRhdGFfcmVxdWlyZWQgPiBVSU5UX01BWCkKKwkJCWRhdGFfcmVxdWlyZWQgPSBVSU5UX01BWDsKKwkJaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPSAodW5zaWduZWQgaW50KWRhdGFfcmVxdWlyZWQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpCisJCWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID0KKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJZWxzZQorCQlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisKKwkvLyBNYXJrIHN1YmRldmljZSBhcyBjb25maWd1cmVkIHRvIHdvcmsgaW4gc3RyZWFtIG1vZGUuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDsKKworCS8vIERlaW5pdCBzaW5nbGUgY29uZmlnLiBTZXQgYWxsIGVudHJpZXMgdG8gTk9UX0NPTkZJR1VSRUQuCisJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5jaGFubmVsczsgaSsrKSB7CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCSAgICBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsKKwl9CisKKyAgICAgIFZFUklGWV9FUlJPUjoJCS8vIEVycm9yIGluIGNvZGUuIFdyb25nIHNldHRpbmcgY2hlY2suIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisgICAgICBFUlJPUjoJCQkvLyBFcnJvciBpbiBzZXR0aW5ncy4KKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBsb25nIGo7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfSBlbHNlIHsJCS8vIE1heCB0aW1lLgorCQl0ID0gTE9OR19NQVg7CisJfQorCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKDEpIHsKKwkJLy8gT25seSBydW5pbmcgZGV2aWNlIGNhbiBnZW5lcmF0ZSBicmVhay4KKwkJaGVhZCA9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGhlYWQgIT0KKwkJCQkJCSAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJICB8fAorCQkJCQkJICAoKGluc3RhbmNlLT5zdGF0dXMgPD0KKwkJCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPj0KKwkJCQkJCSAgICAgICBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSkpLAorCQkJCQkJIHQpOworCisJCWlmIChoZWFkICE9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CS8vIE5ldyBkYXRhIGluIGJ1ZmZlci4KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsJLy8gRW5kIG9mIHdvcmsuCisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yKSB7CisJCQllcnIgPSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCWJyZWFrOworCQl9CisJCS8vIENvcnJlY3QgdGltZW91dC4KKwkJdCAtPSBqaWZmaWVzIC0gajsKKwl9CisKKwkqY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUobWU0NjAwX2FpX3N1YmRldmljZV90ICoKKwkJCQkJCSAgICAgaW5zdGFuY2UsIGludCAqdmFsdWVzLAorCQkJCQkJICAgICBjb25zdCBpbnQgY291bnQsCisJCQkJCQkgICAgIGNvbnN0IGludCBmbGFncykKK3sKKwlpbnQgbjsKKwlpbnQgaTsKKwl1aW50MzJfdCB2YWx1ZTsKKworCS8vL0NoZWNraW5nIGhvdyBtYW55IGRhdGFzIGNhbiBiZSBjb3BpZWQuCisJbiA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlpZiAobiA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChuID4gY291bnQpCisJCW4gPSBjb3VudDsKKworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9SRUFEX0ZSQU1FUykgeworCQlpZiAobiA8IGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKQkvL05vdCBlbm91Z2ggZGF0YSEKKwkJCXJldHVybiAwOworCQluIC09IG4gJSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCQlpZiAocHV0X3VzZXIodmFsdWUsIHZhbHVlcyArIGkpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBjb3B5IG5ldyB2YWx1ZXMgdG8gdXNlci5cbiIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCByZWFkX21vZGUsCisJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgcmV0OworCisJaW50IGMgPSAqY291bnQ7CisJaW50IG1pbiA9IGM7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIXZhbHVlcyB8fCAhY291bnQpIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHBvaW50ZXIuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUE9JTlRFUjsKKwl9CisKKwlpZiAoYyA8IDApIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHZhbHVlJ3MgY291bnRlci5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAoKHJlYWRfbW9kZSAhPSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChyZWFkX21vZGUgIT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgcmVhZCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUFEX01PREU7CisJfQorCisJaWYgKGMgPT0gMCkgewkJLy9Zb3UgZ2V0IHdoYXQgeW91IHdhbnQhIE5vdGhpbmcgbW9yZSBvciBsZXNzLgorCQlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2hlY2sgaWYgc3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQuCisJaWYgKGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuIDw9IDApIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugd2Fzbid0IGNvbmZpZ3VyZWQuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCWlmIChjIDwgaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4pIHsJLy9Ob3QgZW5vdWdoIGRhdGEgcmVxdWVzdGVkLgorCQkJUEVSUk9SCisJCQkgICAgKCJXaGVuIHVzaW5nIEZSQU1FX1JFQUQgbW9kZSBtaW5pbWFsIHNpemUgaXMgZGVmaW5lZCBieSBjaGFubmVsIGxpc3QuXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCX0KKwl9CisKKwlpZiAoYyA+IChNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQgLSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbikpIHsJLy8gVG8gcmV0dXJuIGFjY2VwdGFibGUgYW1vdW50IG9mIGRhdGEgd2hlbiB1c2VyIHBhc3MgdG9vIGJpZyB2YWx1ZS4KKwkJbWluID0gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIC0gaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW47CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCS8vV2FpdCBmb3Igd2hvbGUgbGlzdC4KKwkJaWYgKHJlYWRfbW9kZSA9PSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpIHsKKwkJCW1pbiA9IGMgLSAoYyAlIGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKTsKKwkJfQorCisJCWlmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQltaW4gPSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwkJfQorCX0KKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy9Xb3JraW5nCisJCS8vSWYgYmxvY2tpbmcgbW9kZSAtPiB3YWl0IGZvciBkYXRhLgorCQlpZiAoKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSA8IG1pbikKKwkJICAgICYmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX0JMT0NLSU5HKSkgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfdmFsdWVzCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikgPj0gbWluKQorCQkJCQkJICB8fCAhKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykKKwkJCQkJCSAgICAgICAmCisJCQkJCQkgICAgICAgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUoaW5zdGFuY2UsIHZhbHVlcywgYywgZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWVyciA9IC1yZXQ7CisJCSpjb3VudCA9IDA7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQkqY291bnQgPSAwOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX25vbmUpIHsKKwkJCVBERUJVRygiU3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0gZWxzZSB7CisJCSpjb3VudCA9IHJldDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBhcXVzYXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworCitzdGF0aWMgaW50IGFpX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisJY29uc3QgaW50IHRpbWVvdXQgPSBIWiAvIDEwOwkvLzEwMG1zCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwkJY3RybCB8PQorCQkgICAgKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCWJyZWFrOworCQl9CisKKwkJUElORk8oIldhaXQgZm9yIHN0b3A6ICVkXG4iLCBpICsgMSk7CisJCS8vU3RpbGwgd29ya2luZyEKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA+IHRpbWVvdXQpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIHJlZjsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCXZvbGF0aWxlIHVpbnQzMl90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKQorCSAgICAmJiAoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAoKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsKKwkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPT0gMCkgewkvL05vdCBjb25maWd1cmVkIQorCQlQRVJST1IoIlN1YmRldmljZSBpcyBub3QgY29uZmlndXJlZCB0byB3b3JrIGluIHN0cmVhbSBtb2RlIVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoISh0bXAgJiAoTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8yKSkpIHsJLy9Nb2RlIDAgPSBzaW5nbGUgd29yayA9PiBubyBzdHJlYW0gY29uZmlnCisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCS8vUmVzZXQgc3RvcCBiaXRzLgorCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vU3RhcnQgZGF0YXMnIEZJRk8uCisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJLy9GcmVlIHN0b3AgYml0cy4KKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay5cbiIpOworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzayk7CisKKwkvL1NldCB0aGUgc3RhcnRpbmcgdmFsdWVzLgorCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgPSAwOworCWluc3RhbmNlLT5JU00ucmVhZCA9IDA7CisJLy9DbGVhciBjaXJjdWxhciBidWZmZXIKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJLy9TZXQgZXZlcnl0aGluZy4KKwlhaV9kYXRhX2FjcXVpc2l0aW9uX2xvZ2ljKGluc3RhbmNlKTsKKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwkvLyBTZXQgY29udHJvbCB0YXNrJ3MgdGltZW91dAorCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL0xldHMgZ28hIFN0YXJ0IHdvcmsKKwlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJUERFQlVHX1JFRygic3RhcnRfcmVnIGlubCgweCVsWCsweCVsWClcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkvLyBTY2hlZHVsZSBjb250cm9sIHRhc2sKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU0NjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKworCVBERVZFTE9QKCJEZWxheTolbGRcbiIsIGRlbGF5KTsKKworCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsJLy9XYWl0IGZvciBzdGFydC4KKwkJcmVmID0gamlmZmllczsKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX3J1bikKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUERFQlVHKCJTdGFydGluZyBzdHJlYW0gY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3N0cmVhbV9ydW4pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSByZWYpID4gZGVsYXkgKyAxKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlE9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX1NDX1JFTE9BRD0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKyNlbmRpZgorCisgICAgICBFUlJPUjoKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsKKwljYXNlIGFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0JVU1k7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwlkZWZhdWx0OgorCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKwl9CisKKwlpZiAoKHdhaXQgPT0gTUVfV0FJVF9JRExFKSAmJiAoKnN0YXR1cyA9PSBNRV9TVEFUVVNfQlVTWSkpIHsKKwkJLy8gT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFpX3N0YXR1c19zdHJlYW1fcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJXYWl0IGZvciBJRExFIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IGZvciBJRExFIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlQREVCVUcoIm1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKT0lZC5cbiIsICp2YWx1ZXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisvKioKKyBAbm90ZSBTdG9wIGlzIGltcGxlbWVudGVkIG9ubHkgaW4gYmxvY2tpbmcgbW9kZS4KKyBAbm90ZSBGdW5jdGlvbiByZXR1cm4gd2hlbiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BlZC4KKyovCisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCBjdHJsOworCWludCByZXQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpCisJICAgICYmIChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdG9wIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy8gTWFyayBhcyBzdG9wcGluZy4gPT4gU29mdHdhcmUgc3RvcC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlyZXQgPSBhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCQlpZiAocmV0KSB7CisJCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJfQorCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJLy8gU2V0IHN0b3AgYml0IGluIHJlZ2lzdHJ5LgorCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJCS8vIE9ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJcmV0ID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJcmV0ID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisJCS8vIEVuZCBvZiB3b3JrLgorCQlhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCX0KKworCXJldCA9IGFpX3JlYWRfZGF0YV9wb29saW5nKGluc3RhbmNlKTsKKwlpZiAocmV0ID4gMCkgewkJLy8gRXZlcnl0aGluZyBmaW5lLiBNb3JlIGRhdGFzIHB1dCB0byBzb2Z0d2FyZSBidWZmZXIuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJLy8gU2lnbmFsIHRoYXQgd2UgcHV0IGxhc3QgZGF0YSB0byBzb2Z0d2FyZSBidWZmZXIuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CS8vIEV2ZXJ5dGhpbmcgZmluZS4gTm8gbW9yZSBkYXRhcyBpbiBGSUZPLgorCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCXJldCA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJfSBlbHNlIGlmIChyZXQgPT0gLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XKSB7CS8vIFN0b3AgaXMgdW5zdWNjZXNzZnVsLCBidWZmZXIgaXMgb3ZlcmZsb3cuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9IGVsc2UgewkJLy8gU3RvcCBpcyB1bnN1Y2Nlc3NmdWwKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQlyZXQgPSAtcmV0OworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGk7CisJaW50IHIgPSAtMTsKKwlpbnQgZGlmZiA9IDIxRTY7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5yYW5nZXNfbGVuOyBpKyspIHsKKwkJCWlmICgoaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4gPD0gKm1pbikKKwkJCSAgICAmJiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4ICsgMTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5yYW5nZXNbaV0ubWluKSAtICgqbWF4IC0gKm1pbikgPAorCQkJCSAgICBkaWZmKSB7CisJCQkJCXIgPSBpOworCQkJCQlkaWZmID0KKwkJCQkJICAgIChpbnN0YW5jZS0+cmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkJICptaW4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyIDwgMCkgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBmb3VuZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9IGVsc2UgeworCQkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWF4OworCQkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBoeXNpY2FsIHVuaXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1VOSVQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSBpbnN0YW5jZS0+cmFuZ2VzX2xlbjsKKwl9IGVsc2UgeworCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoKHJhbmdlIDwgaW5zdGFuY2UtPnJhbmdlc19sZW4pICYmIChyYW5nZSA+PSAwKSkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1heDsKKwkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkFOR0U7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCXN3aXRjaCAodGltZXIpIHsKKworCWNhc2UgTUVfVElNRVJfQUNRX1NUQVJUOgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1k7CisJCSptaW5fdGlja3MgPSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUzsKKwkJKm1heF90aWNrcyA9IE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfU0NBTl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9TQ0FOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfQ09OVl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB0aW1lciBzcGVjaWZpZWQuKDB4JTA0eClcbiIsIHRpbWVyKTsKKworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwkqbnVtYmVyID0gaW5zdGFuY2UtPmNoYW5uZWxzOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCSp0eXBlID0gTUVfVFlQRV9BSTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU1RSRUFNSU5HOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0FJX1RSSUdfU1lOQ0hST05PVVMgfCBNRV9DQVBTX0FJX0ZJRk8gfAorCSAgICBNRV9DQVBTX0FJX0ZJRk9fVEhSRVNIT0xEOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eSBhcmd1bWVudCBjb3VudC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DQVBfQVJHX0NPVU5UOworCX0KKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBNRV9DQVBfQUlfRklGT19TSVpFOgorCQlhcmdzWzBdID0gTUU0NjAwX0FJX0ZJRk9fQ09VTlQ7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuIEhGIG5lZWQgcmVzZXRpbmcuCisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBpbnN0YW5jZS0+SVNNLm5leHQpICE9IGluc3RhbmNlLT5JU00ubmV4dCkgewkvL0VSUk9SIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSD0wOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorCQkJLy9FbmQgb2Ygd29yay4KKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CisJCQlpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0hBTEYpICE9IE1FNDYwMF9BSV9GSUZPX0hBTEYpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggPSAwOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCS8vRW5kIG9mIHdvcmsuCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJLy9Db250aW51ZS4KKwkJCQlhaV9saW1pdGVkX0lTTShpbnN0YW5jZSwgaXJxX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJLy9TaWduYWwgdXNlci4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0gZWxzZQkJCS8vaWYoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkKKwl7CisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpbnN0YW5jZS0+SVNNLnJlYWQgPSAwOworCQkJaWYgKChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fSEFMRikKKwkJCSAgICAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkKKwkJCXsKKwkJCQl0b19yZWFkID0KKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRiAtCisJCQkJICAgIChNRTQ2MDBfQUlfRklGT19IQUxGICUKKwkJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQkJCVBERUJVRworCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSCAhPSAwOiBOb3QgZmFzdCBlbm91Z2ggZGF0YSBhcXVzaXRpb24hIGNvcnJlY3Rpb249JWRcbiIsCisJCQkJICAgICB0b19yZWFkKTsKKwkJCX0gZWxzZSB7CisJCQkJdG9fcmVhZCA9IGluc3RhbmNlLT5JU00ubmV4dDsKKwkJCX0KKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gdG9fcmVhZDsKKworCQkJYWlfcmVzY2hlZHVsZV9TQyhpbnN0YW5jZSk7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggIT0gMDogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCQkvL0VuZCBvZiB3b3JrLgorCQkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCS8vQ29udGludWUuCisJCQkJYWlfbGltaXRlZF9JU00oaW5zdGFuY2UsIGlycV9zdGF0dXMpOworCQkJfQorCisJCQkvL1NpZ25hbCB1c2VyLgorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCQl9IGVsc2UgaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCWluc3RhbmNlLT5JU00ucmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQkJUEVSUk9SCisJCQkJICAgICgiTGltaXRlZCBhbW91bnRzIGFxdXNpdGlvbiB3aXRoIFRIICE9IDA6IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCS8vU2lnbmFsIHVzZXIuCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgd2FpdF9xdWV1ZSk7CisJCQl9IGVsc2UgeworCQkJCS8vQ291bnRpbnVlLgorCQkJCWFpX2xpbWl0ZWRfSVNNKGluc3RhbmNlLCBpcnFfc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID49IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vRW5kIG9mIHdvcmsuIE5leHQgcGFyYW5vaWQgcGljZSBvZiBjb2RlOiAnPj0nIGluc3RlYWQgb2QgJz09JyBvbmx5IHRvIGJlIHN1cmUuCisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorI2lmZGVmIE1FREVCVUdfRVJST1IKKwkJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID4gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uOiBSZWFkIG1vcmUgZGF0YSB0aGFuIG5lY2Vzc2FyeSEgZGF0YV9yZXF1aXJlZD0lZCA8IHJlYWQ9JWRcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCwKKwkJCQkgICAgIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQpOworCQkJCS8vU2lnbmFsIGVycm9yICh3YXJuaW5nPz8pLgorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJfQorI2VuZGlmCisJCX0KKwl9Cit9CisKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsJLy9uZXh0IGNodW5jayBvZiBkYXRhIC0+IHJlYWQgZmlmbworCQkvL1NldCBuZXcgc3RhdGUgaW4gSVNNLgorCQlpZiAoKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19IQUxGKSAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkgewkvL1RoZXJlIGlzIG1vcmUgZGF0YSB0aGFuIHdlIGVjcGVjdGVkLiBQcm9wYWJseSB3ZSBhcmVuJ3QgZmFzdCBlbm91Z2guIFJlYWQgYXMgbWFueSBhcyBwb3NzaWJsZS4KKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CisJCQkJdG9fcmVhZCA9CisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEYgLQorCQkJCSAgICAoTUU0NjAwX0FJX0ZJRk9fSEFMRiAlCisJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKTsKKwkJCQlpZiAodG9fcmVhZCA+IGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsKKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIkluZmluaXRlIGFxdXNpdGlvbjogTm90IGZhc3QgZW5vdWdoIGRhdGEgYXF1c2l0aW9uISBUSCAhPSAwOiBjb3JyZWN0aW9uPSVkXG4iLAorCQkJCQkgICAgIHRvX3JlYWQpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vTm8gdGhyZXNob2xkIHNwZWNpZmllZC4KKwkJCQl0b19yZWFkID0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRvX3JlYWQgPSBpbnN0YW5jZS0+SVNNLm5leHQ7CisJCX0KKworCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gdG9fcmVhZDsKKworCQkvL0dldCBkYXRhCisJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCVBFUlJPUigiSW5maW5pdGUgYXF1c2l0aW9uOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQl9IGVsc2UgeworCQkJYWlfaW5maW5pdGVfSVNNKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gaW5zdGFuY2UtPklTTS5yZWFkOworCQkJaW5zdGFuY2UtPklTTS5yZWFkID0gMDsKKwkJfQorCisJCS8vU2lnbmFsIGRhdGEgdG8gdXNlcgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CS8vZmlmbyBpcyBoYWxmIGZ1bGwgLT4gcmVhZCBmaWZvICAgICAgIExhcmdlIGJsb2NrcyBvbmx5IQorCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQlQRVJST1IoIkluZmluaXRlIGFxdXNpdGlvbjogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKworCQkJLy9TaWduYWwgaXQuCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCX0gZWxzZSB7CisJCQlhaV9pbmZpbml0ZV9JU00oaW5zdGFuY2UpOworCQl9CisJfQorfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCXVpbnQzMl90IGN0cmxfc3RhdHVzOworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJLy9pbnQgdG9fcmVhZDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEKKwkgICAgKGlycV9zdGF0dXMgJgorCSAgICAgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykpKSB7CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWlmICgoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpKSA9PSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIExFIGlzIHVudXNlZC4gVGhpcyBzaG91bGQgbmV2ZXIgZXZlciBoYXBwZW5kLgorCQkJUElORk8KKwkJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz1MRV9JUlFcbiIsCisJCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXyk7CisJCX0gZWxzZSB7CisJCQlQSU5GTworCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpcnFfc3RhdHVzKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsJLy9TZWN1cml0eSBjaGVjay4KKwkJUEVSUk9SX0NSSVRJQ0FMKCJDSVJDVUxBUiBCVUZGRVIgTk9UIEVYSVNUUyFcbiIpOworCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLy9HZXQgdGhlIHN0YXR1cyByZWdpc3Rlci4KKwljdHJsX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisKKyNpZmRlZiBNRURFQlVHX0lORk8KKwlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikKKwkJUElORk8oIkhGIGludGVycnVwdCBhY3RpdmVcbiIpOworCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKQorCQlQSU5GTygiU0MgaW50ZXJydXB0IGFjdGl2ZVxuIik7CisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpCisJCVBJTkZPKCJMRSBpbnRlcnJ1cHQgYWN0aXZlXG4iKTsKKyNlbmRpZgorCisJLy9UaGlzIGlzIHNhZmV0eSBjaGVjayEKKwlpZiAoKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpCisJICAgICYmIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSB7CisJCVBERUJVRygiSEYgaW50ZXJydXB0IGFjdGl2ZSBidXQgRklGTyB1bmRlciBoYWxmXG4iKTsKKwkJLy9SZXNldCBIRiBpbnRlcnJ1cHQgbGF0Y2guCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCW91dGwoY3RybF9zdGF0dXMgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VULAorCQkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBjdHJsX3N0YXR1cyk7CisJCW91dGwoY3RybF9zdGF0dXMsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBjdHJsX3N0YXR1cyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKyNpZmRlZiBNRURFQlVHX0lORk8KKwlQSU5GTygiU1RBVFVTX0JJVF9GU009JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgPyAib24iIDogIm9mZiIpOworCisJUElORk8oIlNUQVRVU19CSVRfRUZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfQ0hBTk5FTCkgPyAibm90IGVtcHR5IiA6CisJICAgICAgImVtcHR5Iik7CisJUElORk8oIlNUQVRVU19CSVRfSEZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfQ0hBTk5FTCkgPyAiIDwgSEYiIDoKKwkgICAgICAiID4gSEYiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9GRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9DSEFOTkVMKSA/ICJub3QgZnVsbCIgOgorCSAgICAgICJmdWxsIik7CisKKwlQSU5GTygiU1RBVFVTX0JJVF9FRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSA/ICJub3QgZW1wdHkiIDoKKwkgICAgICAiZW1wdHkiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9IRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKSA/ICIgPCBIRiIgOiAiID4gSEYiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9GRl9EQVRBPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKSA/ICJub3QgZnVsbCIgOgorCSAgICAgICJmdWxsIik7CisKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKSA/ICJyZXNldCIgOgorCSAgICAgICJ3b3JrIik7CisJUElORk8oIkNUUkxfQklUX1NDX0lSUT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX1NDX1JFTE9BRD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRCkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpID8gInJlc2V0IiA6CisJICAgICAgIndvcmsiKTsKKyNlbmRpZgorCisJLy9Mb29rIGZvciBvdmVyZmxvdyBlcnJvci4KKwlpZiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpKSB7CisJCS8vRklGTyBpcyBmdWxsLiBSZWFkIGRhdGFzIGFuZCByZXNldCBhbGwgc2V0dGluZ3MuCisJCVBFUlJPUigiRklGTyBvdmVyZmxvdy5cbiIpOworCQlhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0NPVU5UKTsKKwkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisJCS8vU2lnbmFsIGl0LgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICghaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9UaGlzIGlzIGluZmluaXRlIGFxdXNpdGlvbi4KKyNpZmRlZiBNRURFQlVHX0VSUk9SCisJCWlmICgoaXJxX3N0YXR1cyAmCisJCSAgICAgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykpCisJCSAgICA9PQorCQkgICAgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykpIHsKKwkJCS8vL0luIGluZmluaXRlIG1vZGUgb25seSBvbmUgaW50ZXJydXB0IHNvdXJjZSBzaG91bGQgYmUgcmVwb3J0ZWQhCisJCQlQRVJST1IKKwkJCSAgICAoIkVycm9yIGluIElTTSEgSW5maW5pdGUgYXF1c2l0aW9uOiBIRiBhbmQgU0MgaW50ZXJydXB0cyBhY3RpdmUhIHRocmVzaG9sZD0lZCBuZXh0PSVkIGN0cmw9MHglMDRYIGlycV9zdGF0dXNfcmVnPTB4JTA0WCIsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsIGluc3RhbmNlLT5JU00ubmV4dCwKKwkJCSAgICAgY3RybF9zdGF0dXMsIGlycV9zdGF0dXMpOworCQl9CisjZW5kaWYKKworCQlhaV9pbmZpbml0ZV9pc3IoaW5zdGFuY2UsIGlycV9zdGF0dXMsIGN0cmxfc3RhdHVzKTsKKworI2lmZGVmIE1FREVCVUdfSU5GTworCQljdHJsX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworI2VuZGlmCisJfSBlbHNlIHsKKworCQlhaV9saW1pdGVkX2lzcihpbnN0YW5jZSwgaXJxX3N0YXR1cywgY3RybF9zdGF0dXMpOworCQljdHJsX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKGN0cmxfc3RhdHVzICYgKE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKSkpIHsJLy9IRiBhY3RpdmUsIGJ1dCB3ZSBoYXZlIG1vcmUgdGhhbiBoYWxmIGFscmVhZHkgPT4gSEYgd2lsbCBuZXZlciBjb21lCisJCQlQREVCVUcKKwkJCSAgICAoIk1JU1NFRCBIRi4gZGF0YV9yZXF1aXJlZD0lZCBJU00ucmVhZD0lZCBJU00uZ2xvYmFsPSVkIElTTS5uZXh0PSVkXG4iLAorCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCwgaW5zdGFuY2UtPklTTS5yZWFkLAorCQkJICAgICBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkLCBpbnN0YW5jZS0+SVNNLm5leHQpOworCQkJYWlfbGltaXRlZF9pc3IoaW5zdGFuY2UsIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiwKKwkJCQkgICAgICAgY3RybF9zdGF0dXMpOworCQl9CisJfQorCisjaWZkZWYgTUVERUJVR19JTkZPCisJUElORk8oIlNUQVRVU19CSVRfRlNNPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pID8gIm9uIiA6ICJvZmYiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0NIQU5ORUwpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwpID8gIiA8IEhGIiA6CisJICAgICAgIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTCkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIlNUQVRVU19CSVRfRUZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkgPyAibm90IGVtcHR5IiA6CisJICAgICAgImVtcHR5Iik7CisJUElORk8oIlNUQVRVU19CSVRfSEZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkgPyAiIDwgSEYiIDogIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIkNUUkxfQklUX0hGX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19SRUxPQUQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKSA/ICJyZXNldCIgOgorCSAgICAgICJ3b3JrIik7CisJUElORk8oIiVsZCBFTkRcbiIsIGppZmZpZXMpOworI2VuZGlmCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBhcXVzYXRpb24gb2YgZGF0YS4gUmVzZXQgaW50ZXJydXB0cycgbGFjaGVzLiBDbGVhciBkYXRhJ3MgRklGTy4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKi8KK3ZvaWQgaW5saW5lIGFpX3N0b3BfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzb2Z0IHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJcmVnaXN0ZXIgdWludDMyX3QgdG1wOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkvL1N0b3AgYWxsLiBSZXNldCBpbnRlcnJ1cHQgbGFjaGVzLiBSZXNldCBkYXRhIEZJRk8uCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wIHw9CisJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCisJICAgICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBmaWZvIHRvIGNpcmN1bGFyIGJ1ZmZlci4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZGF0YS4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XLgorKi8KK3N0YXRpYyBpbnQgaW5saW5lIGFpX3JlYWRfZGF0YShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwKKwkJCSAgICAgICBjb25zdCBpbnQgY291bnQpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJaW50IGMgPSBjb3VudDsKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZCA9IDA7CisJaW50IGksIGo7CisKKwllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZCgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlpZiAoZW1wdHlfc3BhY2UgPD0gMCkgeworCQlQREVCVUcoIkNpcmN1bGFyIGJ1ZmZlciBmdWxsLlxuIik7CisJCXJldHVybiAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJfQorCisJaWYgKGVtcHR5X3NwYWNlIDwgYykgewkvL0NvcHkgZmlyc3QgcGFydC4gTWF4IHRvIGVuZCBvZiBidWZmZXIuCisJCVBERUJVRworCQkgICAgKCJUcnkgdG8gY29weSAlZCB2YWx1ZXMgZnJvbSBGSUZPIHRvIGNpcmN1bGFyIGJ1ZmZlciAocGFzcyAxKS5cbiIsCisJCSAgICAgZW1wdHlfc3BhY2UpOworCQlmb3IgKGkgPSAwOyBpIDwgZW1wdHlfc3BhY2U7IGkrKykgeworCQkJKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpID0KKwkJCSAgICAoaW53KGluc3RhbmNlLT5kYXRhX3JlZykgXiAweDgwMDApOworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJYyAtPSBlbXB0eV9zcGFjZTsKKwkJY29waWVkID0gZW1wdHlfc3BhY2U7CisKKwkJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfQorCisJaWYgKGVtcHR5X3NwYWNlID4gMCkgeworCQlqID0gKGVtcHR5X3NwYWNlIDwgYykgPyBlbXB0eV9zcGFjZSA6IGM7CisJCVBERUJVRworCQkgICAgKCJUcnkgdG8gY29weSAlZCB2YWx1ZXMgZnJvbSBGSUZPIHRvIGNpcmN1bGFyIGJ1ZmZlciAocGFzcyAyKS5cbiIsCisJCSAgICAgYyk7CisJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKwkJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCQkgICAgKGludyhpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwKTsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWNvcGllZCArPSBqOworCX0KKwlyZXR1cm4gY29waWVkOworfQorCit2b2lkIGlubGluZSBhaV9pbmZpbml0ZV9JU00obWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJcmVnaXN0ZXIgdm9sYXRpbGUgdWludDMyX3QgY3RybF9zZXQsIGN0cmxfcmVzZXQsIHRtcDsKKworCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vIE9ubHkgc2FtcGxlIGNvdW50ZXIgd2l0aCByZWxvYWRuaWcgaXMgd29ya2luZy4gUmVzZXQgaXQuCisJCVBJTkZPCisJCSAgICAoIk9ubHkgc2FtcGxlIGNvdW50ZXIgd2l0aCByZWxvYWRuaWcgaXMgd29ya2luZy4gUmVzZXQgaXQuXG4iKTsKKwkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQljdHJsX3Jlc2V0ID0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJfSBlbHNlIGlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID09IGluc3RhbmNlLT5JU00ucmVhZCkgewkvL1RoaXMgaXMgU0MgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay4gVGhlIHdob2xlIHNlY3Rpb24gaXMgZG9uZS4gUmVzZXQgU0NfSVJRIGFuIEhGX0lSUSBhbmQgc3RhcnQgZXZlcnl0aGluZyBhZ2FpbiBmcm9tIGJlZ2lubmluZy4KKwkJUElORk8KKwkJICAgICgiVGhpcyBpcyBTQyBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLiBUaGUgd2hvbGUgc2VjdGlvbiBpcyBkb25lLiBSZXNldCBTQ19JUlEgYW4gSEZfSVJRIGFuZCBzdGFydCBldmVyeXRoaW5nIGFnYWluIGZyb20gYmVnaW5uaW5nLlxuIik7CisJCWN0cmxfc2V0ID0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9CisJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKTsKKwl9IGVsc2UgaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPj0gKE1FNDYwMF9BSV9GSUZPX01BWF9TQyArIGluc3RhbmNlLT5JU00ucmVhZCkpIHsJLy9UaGlzIGlzIEhGIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suVGhlIG5leHQgaW50ZXJydXB0IHNob3VsZCBiZSBmcm9tIEhGLCBhbHNvLiBSZXNldCBIRi4KKwkJUElORk8KKwkJICAgICgiVGhpcyBpcyBIRiBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLlRoZSBuZXh0IGludGVycnVwdCBzaG91bGQgYmUgZnJvbSBIRiwgYWxzby4gUmVzZXQgSEYuXG4iKTsKKwkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQljdHJsX3Jlc2V0ID0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJfSBlbHNlIHsJCS8vVGhpcyBpcyBIRiBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLlRoZSBuZXh0IGludGVycnVwdCBzaG91bGQgYmUgZnJvbSBTQy4gRG9uJ3QgcmVzZXQgSEYhCisJCVBJTkZPCisJCSAgICAoIlRoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gU0MuIERvbid0IHJlc2V0IEhGIVxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9IDB4RkZGRkZGRkY7CisJfQorCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2guCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQSU5GTygiY3RybD0weCV4IGN0cmxfc2V0PTB4JXggY3RybF9yZXNldD0weCV4XG4iLCB0bXAsIGN0cmxfc2V0LAorCSAgICAgIGN0cmxfcmVzZXQpOworCXRtcCB8PSBjdHJsX3NldDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlpZiAoY3RybF9yZXNldCAhPSAweEZGRkZGRkZGKSB7CisJCW91dGwodG1wICYgY3RybF9yZXNldCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZXNldCBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgdG1wICYgY3RybF9yZXNldCk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworfQorCit2b2lkIGlubGluZSBhaV9saW1pdGVkX0lTTShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwKKwkJCSAgIHVpbnQzMl90IGlycV9zdGF0dXMpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJcmVnaXN0ZXIgdm9sYXRpbGUgdWludDMyX3QgY3RybF9zZXQsIGN0cmxfcmVzZXQgPSAweEZGRkZGRkZGLCB0bXA7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNDIGVuZHMgd29yay4KKwkJUElORk8oIk5vIHRocmVzaG9sZCBwcm92aWRlZC4gU0MgZW5kcyB3b3JrLlxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJaWYgKGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID4gKE1FNDYwMF9BSV9GSUZPX0NPVU5UIC0gMSArIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQpKSB7CS8vSEYgbmVlZCByZXNldGluZy4KKwkJCWN0cmxfcmVzZXQgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCX0KKwl9IGVsc2UJCQkvL2lmKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpCisJeworCQlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRikgeworCQkJUElORk8oIlRocmVzaG9sZCBwcm92aWRlZC4gQ2xlYXIgSEYgbGF0Y2guXG4iKTsKKwkJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKworCQkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPj0gKE1FNDYwMF9BSV9GSUZPX01BWF9TQyArIGluc3RhbmNlLT5JU00ucmVhZCkpIHsJLy9UaGlzIGlzIG5vdCB0aGUgbGFzdCBvbmUuIEhGIG5lZWQgcmVzZXRpbmcuCisJCQkJUElORk8KKwkJCQkgICAgKCJUaGUgbmV4dCBpbnRlcnJ1cHQgaXMgSEYuIEhGIG5lZWQgYmUgYWN0aXZhdGluZy5cbiIpOworCQkJCWN0cmxfcmVzZXQgPSB+TUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJCX0KKwkJfQorCisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlQSU5GTygiVGhyZXNob2xkIHByb3ZpZGVkLiBSZXN0YXJ0IFNDLlxuIik7CisJCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCQljdHJsX3Jlc2V0ICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCisJCQlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA+PSBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsJLy9UaGlzIGlzIG5vdCB0aGUgbGFzdCBvbmUuIEhGIG5lZWQgdG8gYmUgYWN0aXZhdGluZy4KKwkJCQlQSU5GTworCQkJCSAgICAoIlRoZSBuZXh0IGludGVycnVwdCBpcyBIRi4gSEYgbmVlZCB0byBiZSBhY3RpdmF0aW5nLlxuIik7CisJCQkJY3RybF9yZXNldCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJCX0KKwkJfQorCX0KKworCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wIHw9IGN0cmxfc2V0OworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJaWYgKGN0cmxfcmVzZXQgIT0gMHhGRkZGRkZGRikgeworCQlvdXRsKHRtcCAmIGN0cmxfcmVzZXQsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICB0bXAgJiBjdHJsX3Jlc2V0KTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCit9CisKKy8qKiBAYnJpZWYgTGFzdCBjaHVuY2sgb2YgZGF0YXMuIFdlIG11c3QgcmVzY2hlZHVsZSBzYW1wbGUgY291bnRlci4KKyoJQG5vdGUgTGFzdCBjaHVuY2suCisqCUxlYXZpbmcgU0NfUkVMT0FEIGRvZXNuJ3QgZG8gYW55IGhhcm0sIGJ1dCBpbiBzb21lIGJhZCBjYXNlIGNhbiBtYWtlIGV4dHJhIGludGVycnVwdHMuCisqCUB3YXJuaW5nIFdoZW4gdGhyZXNob2xkIGlzIHdyb25nbHkgc2V0IHNvbWUgSVJRIGFyZSBsb3N0LighISEpCisqLwordm9pZCBpbmxpbmUgYWlfcmVzY2hlZHVsZV9TQyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCByZXN0OworCisJaWYgKGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkIDw9IGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQpCisJCXJldHVybjsKKworCXJlc3QgPSBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCAtIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQ7CisJaWYgKHJlc3QgPCBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vRW5kIG9mIHdvcmsgc29vbiAuLi4uCisJCVBERUJVRygiUmVzY2hlZHVsaW5nIFNDIGZyb20gJWQgdG8gJWQuXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCwgcmVzdCk7CisJCS8vLyBAbm90ZSBXcml0ZSBuZXcgdmFsdWUgdG8gU0MgPD09ICBEQU5HRVIhIFRoaXMgaXMgbm90IHNhZmUgc29sdXRpb24hIFdlIGNhbiBtaXNzIHNvbWUgaW5wdXRzLgorCQlvdXRsKHJlc3QsIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCQlQREVCVUdfUkVHKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICByZXN0KTsKKwkJaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IHJlc3Q7CisKKwkJaWYgKHJlc3QgPCBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsKKwkJCWluc3RhbmNlLT5JU00ubmV4dCA9IHJlc3Q7CisJCX0gZWxzZSB7CisJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSByZXN0ICUgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCWlmIChpbnN0YW5jZS0+SVNNLm5leHQgKyBNRTQ2MDBfQUlfRklGT19IQUxGIDwKKwkJCSAgICBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqIFN0YXJ0IHRoZSBJU00uIEFsbCBtdXN0IGJlIHJlc2V0ZWQgYmVmb3JlIGVudGVyIHRvIHRoaXMgZnVuY3Rpb24uICovCit2b2lkIGlubGluZSBhaV9kYXRhX2FjcXVpc2l0aW9uX2xvZ2ljKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IHRtcDsKKworCWlmICghaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9UaGlzIGlzIGluZmluaXRlIGFxdXNpdGlvbi4KKwkJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgU0MgdG8gMC41KkZJRk8uIENsZWFyIHRoZSBTQydzIGxhdGNoLgorCQkJLy9TZXQgdGhlIHNhbXBsZSBjb3VudGVyCisJCQlvdXRsKE1FNDYwMF9BSV9GSUZPX0hBTEYsIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCQkJUERFQlVHX1JFRworCQkJICAgICgic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRik7CisJCX0gZWxzZSB7CS8vVGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgU0MgdG8gdHJlc2hvbGQuIENsZWFyIHRoZSBTQydzIGxhdGNoLgorCQkJLy9TZXQgdGhlIHNhbXBsZSBjb3VudGVyCisJCQlvdXRsKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCQkJUERFQlVHX1JFRworCQkJICAgICgic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCk7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA8IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgewkvL0VuYWJsZSBvbmx5IHNhbXBsZSBjb3VudGVyJ3MgaW50ZXJydXB0LiBTZXQgcmVsb2FkIGJpdC4gQ2xlYXIgdGhlIFNDJ3MgbGF0Y2guCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRDsKKwkJCXRtcCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCQlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNldCBJU00ubmV4dCB0byAwLjUqRklGTy4KKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJfSBlbHNlIHsJLy9UaHJlc2hvbGQgcHJvdmlkZWQuIFNldCBJU00ubmV4dCB0byB0cmVzaG9sZC4KKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJCSAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkOworCQkJfQorCQl9IGVsc2UgewkvL0VuYWJsZSBzYW1wbGUgY291bnRlcidzIGFuZCBIRidzIGludGVycnVwdHMuCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRDsKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8CisJCQkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCAlIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQlpZiAoaW5zdGFuY2UtPklTTS5uZXh0ICsgTUU0NjAwX0FJX0ZJRk9fSEFMRiA8CisJCQkgICAgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQl9CisJCX0KKwl9IGVsc2UgewkJLy9UaGlzIGFxdXNpdGlvbiBpcyBsaW1pdGVkIHRvIHNldCBudW1iZXIgb2YgZGF0YS4KKwkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPj0gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9TdHVwaWQgc2l0dWF0aW9uLgorCQkJaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IDA7CisJCQlQREVCVUcKKwkJCSAgICAoIlN0dXBpZCBzaXR1YXRpb246IGRhdGFfcmVxdWlyZWQoJWQpIDwgdGhyZXNob2xkKCVkKS5cbiIsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsCisJCQkgICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKTsKKwkJfQorCisJCWlmICghaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL05vIHRocmVzaG9sZCBwcm92aWRlZC4gRWFzeSBjYXNlOiBIRj1yZWFkIGFuZCBTQz1lbmQuCisJCQkvL1NldCB0aGUgc2FtcGxlIGNvdW50ZXIgdG8gZGF0YV9yZXF1aXJlZC4KKwkJCW91dGwoaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCQkJUERFQlVHX1JFRworCQkJICAgICgic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpOworCisJCQkvL1Jlc2V0IHRoZSBsYXRjaGVzIG9mIHNhbXBsZSBjb3VudGVyIGFuZCBIRiAoaWYgU0M+RklGTykuCisJCQkvL05vIFNDIHJlbG9hZCEKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8CisJCQkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEKTsKKwkJCWlmIChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA+CisJCQkgICAgKE1FNDYwMF9BSV9GSUZPX0NPVU5UIC0gMSkpIHsKKwkJCQl0bXAgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCQkgICAgaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgJQorCQkJCSAgICBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCisJCQl9IGVsc2UgeworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkOworCQkJfQorCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdG1wKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCQl9IGVsc2UgewkvL1RoZSBtb3N0IGdlbmVyYWwgY2FzZS4gV2UgaGF2ZSBjb25jcmV0IG51bWJlIG9mIHJlcXVpcmVkIGRhdGEgYW5kIHRocmVzaG9sZC4gU0M9VEgKKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlciB0byB0aHJlc2hvbGQuCisJCQlvdXRsKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcpOworCQkJUERFQlVHX1JFRworCQkJICAgICgic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPnNhbXBsZV9jb3VudGVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCk7CisKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCS8vSW4gdGhpcyBtb21lbnQgd2UgYXJlIHN1cmUgdGhhdCBTQyB3aWxsIGNvbWUgbW9yZSB0aGFuIG9uY2UuCisJCQl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRDsKKworCQkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsJLy9UaGUgdGhyZXNob2xkIGlzIHNvIHNtYWxsIHRoYXQgd2UgZG8gbmVlZCBIRi4KKwkJCQl0bXAgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCQkgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZDsKKwkJCX0gZWxzZSB7CS8vVGhlIHRocmVzaG9sZCBpcyBsYXJnZS4gVGhlIEhGIG11c3QgYmUgdXNlLgorCQkJCXRtcCAmPQorCQkJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkJCSAgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgJQorCQkJCSAgICBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJCWlmIChpbnN0YW5jZS0+SVNNLm5leHQgKyBNRTQ2MDBfQUlfRklGT19IQUxGIDwKKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQkJCWluc3RhbmNlLT5JU00ubmV4dCArPQorCQkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCQl9CisJCQl9CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGFpX211eF90b2dnbGVyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVpbnQzMl90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcpOworCVBERUJVR19SRUcoInNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcpOworCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCg2NSwgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgNjUpOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fcHJlX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKworCS8vIFR1cm4gb24gaW50ZXJuYWwgcmVmZXJlbmNlLgorCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJLy8gQ2xlYXIgZGF0YSBhbmQgY2hhbm5lbCBmaWZvLgorCXRtcCAmPQorCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPKTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkvLyBXcml0ZSBjaGFubmVsIGVudHJ5LgorCW91dGwoTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMIHwKKwkgICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNSB8IDMxLAorCSAgICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMIHwKKwkJICAgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81IHwgMzEpOworCisJLy8gU3RhcnQgY29udmVyc2lvbi4KKwlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJUERFQlVHX1JFRygic3RhcnRfcmVnIGlubCgweCVsWCsweCVsWClcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisJdWRlbGF5KDEwKTsKKworCS8vIENsZWFyIGRhdGEgYW5kIGNoYW5uZWwgZmlmby4KKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJLy8gV3JpdGUgY2hhbm5lbCBlbnRyeS4KKwkvLyBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfCBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwIDw9IDB4MDAwMAorCW91dGwoTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEIHwKKwkgICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAsIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCB8CisJCSAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTApOworCisJLy8gU3RhcnQgY29udmVyc2lvbi4KKwlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJUERFQlVHX1JFRygic3RhcnRfcmVnIGlubCgweCVsWCsweCVsWClcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisJdWRlbGF5KDEwKTsKKworCS8vIENsZWFyIGNvbnRyb2wgcmVnaXN0ZXIuCisJdG1wICY9IChNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworLyoqIEBicmllZiBDb3B5IHJlc3Qgb2YgZGF0YSBmcm9tIGZpZm8gdG8gY2lyY3VsYXIgYnVmZmVyLgorKiBAbm90ZSBIZWxwZXIgZm9yIFNUT1AgY29tbWFuZC4gQWZ0ZXIgRlNNIGlzIHN0b3BwZWQuCisqIEBub3RlIFRoaXMgaXMgc2xvdyBmdW5jdGlvbiB0aGF0IGNvcHkgYWxsIHJlbWFpbmlnIGRhdGEgZnJvbSBGSUZPIHRvIGJ1ZmZlci4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgdmFsdWVzLgorKiBAcmV0dXJuIE9uIGVycm9yOiBOZWdhdGl2ZSBlcnJvciBjb2RlIC1NRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVy4KKyovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGFfcG9vbGluZyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZCA9IDA7CisJaW50IHN0YXR1cyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoIlNwYWNlIGxlZnQgaW4gY2lyY3VsYXIgYnVmZmVyID0gJWQuXG4iLAorCSAgICAgICBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSk7CisKKwl3aGlsZSAoKGVtcHR5X3NwYWNlID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpKSB7CisJCWlmICghKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgewkvL05vIG1vcmUgZGF0YS4gc3RhdHVzID0gTUVfRVJSTk9fU1VDQ0VTUyA9IDAKKwkJCWJyZWFrOworCQl9CisJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCSAgICAoaW53KGluc3RhbmNlLT5kYXRhX3JlZykgXiAweDgwMDApOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisKKyNpZmRlZiBNRURFQlVHX0VSUk9SCisJaWYgKCFzdGF0dXMpCisJCVBERUJVRworCQkgICAgKCJDb3BpZWQgYWxsIHJlbWFpbmluZyBkYXRhcyAoJWQpIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIuXG4iLAorCQkgICAgIGNvcGllZCk7CisJZWxzZSB7CisJCVBERUJVRygiTm8gbW9yZSBlbXB0eSBzcGFjZSBpbiBidWZmZXIuXG4iKTsKKwkJUERFQlVHKCJDb3BpZWQgJWQgZGF0YXMgZnJvbSBGSUZPIHRvIGNpcmN1bGFyIGJ1ZmZlci5cbiIsCisJCSAgICAgICBjb3BpZWQpOworCQlQREVCVUcoIkZJRk8gc3RpbGwgbm90IGVtcHR5LlxuIik7CisJfQorI2VuZGlmCisJcmV0dXJuICghc3RhdHVzKSA/IGNvcGllZCA6IC1NRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpCisjZWxzZQorc3RhdGljIHZvaWQgbWU0NjAwX2FpX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKyNlbmRpZgoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCWludCByZXNjaGVkdWxlID0gMDsKKwlpbnQgc2lnbmFsaW5nID0gMDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworI2Vsc2UKKwlpbnN0YW5jZSA9CisJICAgIGNvbnRhaW5lcl9vZigodm9pZCAqKXdvcmssIG1lNDYwMF9haV9zdWJkZXZpY2VfdCwgYWlfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCVBJTkZPKCI8JXM6ICVsZD4gZXhlY3V0ZWQuXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKwkJLy8gTm90IGNvbmZpZ3VyZWQgZm9yIHdvcmsuCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwkJYnJlYWs7CisKKwkJLy9UaGlzIGFyZSBzdGFibGUgbW9kZXMuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICg/KQorCWNhc2UgYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQRVJST1IoIlNob3VsZG4ndCBiZSBydW5uaW5nIS5cbiIpOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gSVNNIHN0YXJ0ZWQuLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuOworCQkJLy8gU2lnbmFsIHRoZSBlbmQgb2Ygd2FpdCBmb3Igc3RhcnQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJLy8gV2FpdCBub3cgZm9yIHN0b3AuCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJCWJyZWFrOworCisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIFJlc2V0IEZJRk8gPT4gVG9vIGxhdGUhCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gSVNNIHN0b3BlZC4gT3ZlcndyaXRlIElTUi4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kIG9mIHdhaXQgZm9yIHN0b3AuCisJCQlzaWduYWxpbmcgPSAxOworCQl9IGVsc2UgeworCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vRW5kIHdvcmsuCisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RpbGwgd29ya2luZz8gU3RvcCBpdCEKKwkJCVBFUlJPUgorCQkJICAgICgiU3RhdHVzIGlzICdhaV9zdGF0dXNfc3RyZWFtX2VuZCcgYnV0IGhhcmR3YXJlIGlzIHN0aWxsIHdvcmtpbmchXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVhMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oCkBAIC0wLDAgKzEsMTgwIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9haS5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UgIChrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FJX0hfCisjZGVmaW5lIF9NRTQ2MDBfQUlfSF8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1laW9jdGwuaCIKKyNpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9EQVRBCQkJCTB4RkZGRgorCisjaWZkZWYgTUVfU1lOQVBTRQorIyBkZWZpbmUgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIJOAkvLyAyXm4gUEFHRVMgPT4+IE1heGltdW0gdmFsdWUgb2YgMU1CIGZvciBTeW5hcHNlCisjZWxzZQorIyBkZWZpbmUgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIJNQkvLyAyXm4gUEFHRVMgPT4+IDEyOEtCCisjZW5kaWYKKyNkZWZpbmUgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUgCQlQQUdFX1NJWkU8PE1FNDYwMF9BSV9DSVJDX0JVRl9TSVpFX09SREVSCS8vIEJ1ZmZlciBzaXplIGluIGJ5dGVzLgorCisjaWZkZWYgX0NCVUZGXzMyYl90CisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQJCSgoTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQzMl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyNlbHNlCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQJCSgoTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQxNl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyNlbmRpZgorCisjZGVmaW5lIE1FNDYwMF9BSV9GSUZPX0hBTEYJCQkJMTAyNAkvL01FNDYwMF9BSV9GSUZPX0NPVU5ULzIgICAgICAgICAgICAgICAgLy8xMDI0CisjZGVmaW5lIE1FNDYwMF9BSV9GSUZPX01BWF9TQwkJCTEzNTIJLy8wLjY2Kk1FNDYwMF9BSV9GSUZPX0NPVU5UICAgICAgICAgICAgIC8vMTM1MgorCit0eXBlZGVmIGVudW0gTUU0NjAwX0FJX1NUQVRVUyB7CisJYWlfc3RhdHVzX25vbmUgPSAwLAorCWFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCwKKwlhaV9zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQsCisJYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCwKKwlhaV9zdGF0dXNfc3RyZWFtX3J1biwKKwlhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0LAorCWFpX3N0YXR1c19zdHJlYW1fZW5kLAorCWFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvciwKKwlhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvciwKKwlhaV9zdGF0dXNfc3RyZWFtX2Vycm9yLAorCWFpX3N0YXR1c19sYXN0Cit9IE1FNDYwMF9BSV9TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9zaW5nbGVfY29uZmlnX2VudHJ5IHsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdWludDMyX3QgZW50cnk7CisJdWludDMyX3QgY3RybDsKK30gbWU0NjAwX3NpbmdsZV9jb25maWdfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX3JhbmdlX2VudHJ5IHsKKwlpbnQgbWluOworCWludCBtYXg7Cit9IG1lNDYwMF9yYW5nZV9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYWlfSVNNIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZ2xvYmFsX3JlYWQ7CQkJCS8qKjwgVGhlIG51bWJlciBvZiBkYXRhIHJlYWQgaW4gdG90YWwuICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJlYWQ7CQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVhZCBmb3IgdGhpcyBjaHVuY2suICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG5leHQ7CQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVxdWVzdCBieSB1c2VyLiAqLworfSBtZTQ2MDBfYWlfSVNNX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9haV90aW1lb3V0IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKK30gbWU0NjAwX2FpX3RpbWVvdXRfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJCQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCS8qIEhhcmR3YXJlIGZlYXV0cmVzICovCisJdW5zaWduZWQgaW50IGlycTsJCQkJCQkJCS8qKjwgVGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuICovCisJaW50IGlzb2xhdGVkOwkJCQkJCQkJCS8qKjwgTWFya3MgaWYgdGhpcyBzdWJkZXZpY2UgaXMgb24gYW4gb3B0b2lzb2xhdGVkIGRldmljZS4gKi8KKwlpbnQgc2g7CQkJCQkJCQkJCQkvKio8IE1hcmtzIGlmIHRoaXMgc3ViZGV2aWNlIGhhcyBzYW1wbGUgYW5kIGhvbGQgZGV2aWNlcy4gKi8KKworCXVuc2lnbmVkIGludCBjaGFubmVsczsJCQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4gKi8KKwltZTQ2MDBfc2luZ2xlX2NvbmZpZ19lbnRyeV90IHNpbmdsZV9jb25maWdbMzJdOwkvKio8IFRoZSBjb25maWd1cmF0aW9uIHNldCBmb3Igc2luZ2xlIGFjcXVpc2l0aW9uLiAqLworCisJdW5zaWduZWQgaW50IGRhdGFfcmVxdWlyZWQ7CQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVxdWVzdCBieSB1c2VyLiAqLworCXVuc2lnbmVkIGludCBmaWZvX2lycV90aHJlc2hvbGQ7CQkJCS8qKjwgVGhlIHVzZXIgYWRqdXN0ZWQgRklGTyBoaWdoIHdhdGVyIGludGVycnVwdCBsZXZlbC4gKi8KKwl1bnNpZ25lZCBpbnQgY2hhbl9saXN0X2xlbjsJCQkJCQkvKio8IFRoZSBsZW5ndGggb2YgdGhlIHVzZXIgZGVmaW5lZCBjaGFubmVsIGxpc3QuICovCisKKwltZTQ2MDBfYWlfSVNNX3QgSVNNOwkJCQkJCQkvKio8IFRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0IGJ5IEludGVycnVwdC1TdGF0ZS1NYWNoaW5lLiAqLworCXZvbGF0aWxlIGVudW0gTUU0NjAwX0FJX1NUQVRVUyBzdGF0dXM7CQkJLyoqPCBUaGUgY3VycmVudCBzdHJlYW0gc3RhdHVzIGZsYWcuICovCisJbWU0NjAwX2FpX3RpbWVvdXRfdCB0aW1lb3V0OwkJCQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkJCS8qIFJlZ2lzdGVycyAqLy8qKjwgQWxsIHJlZ2lzdGVycyBhcmUgMzIgYml0cyBsb25nLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbm5lbF9saXN0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbl90aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3ByZV90aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3RpbWVyX2xvd19yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3RpbWVyX2hpZ2hfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBzYW1wbGVfY291bnRlcl9yZWc7CisKKwl1bnNpZ25lZCBpbnQgcmFuZ2VzX2xlbjsKKwltZTQ2MDBfcmFuZ2VfZW50cnlfdCByYW5nZXNbNF07CQkJCQkvKio8IFRoZSByYW5nZXMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCisJLyogU29mdHdhcmUgYnVmZmVyICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJCQkJLyoqPCBDaXJjdWxhciBidWZmZXIgaG9sZGluZyBtZWFzdXJtZW50IGRhdGEuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCQkJCS8qKjwgV2FpdCBxdWV1ZSB0byBwdXQgb24gdGFza3Mgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUuICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFpX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhaV9jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhaV9jb250cm9sX3Rhc2tfZmxhZzsJCQkJLyoqPCBGbGFnIGNvbnRyb2xpbmcgcmVleGVjdXRpbmcgb2YgY29udHJvbCB0YXNrICovCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2FpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIG51bWJlciBvZiBhbmFsb2cgaW5wdXQgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLgorICogQHBhcmFtIGNoYW5uZWxzIFRoZSBudW1iZXIgb2YgYW5hbG9nIGlucHV0IHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuCisgKiBAcGFyYW0gaXNvbGF0ZWQgRmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgZGV2aWNlIGlzIG9wdG8gaXNvbGF0ZWQuCisgKiBAcGFyYW0gc2ggRmxhZyBpbmRpY2F0aW5nIGlmIHNhbXBsZSBhbmQgaG9sZCBkZXZpY2VzIGFyZSBhdmFpbGFibGUuCisgKiBAcGFyYW0gaXJxIFRoZSBpcnEgbnVtYmVyIGFzc2lnbmVkIGJ5IFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2FpX3N1YmRldmljZV90ICptZTQ2MDBfYWlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCByYW5nZXMsCisJCQkJCSAgICAgaW50IGlzb2xhdGVkLAorCQkJCQkgICAgIGludCBzaCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CisJCQkJCSAgICAgKm1lNDYwMF93cSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNmYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haV9yZWcuaApAQCAtMCwwICsxLDEwNyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYWlfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9BSV9SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9BSV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9SRUcJCQkJCTB4NzQJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfUkVHCQkJCTB4NzQJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOTkVMX0xJU1RfUkVHCQkJMHg3OAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX0RBVEFfUkVHCQkJCQkweDdDCS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQUlfQ0hBTl9USU1FUl9SRUcJCQkweDgwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfQ0hBTl9QUkVfVElNRVJfUkVHCQkweDg0CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9USU1FUl9MT1dfUkVHCQkweDg4CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9USU1FUl9ISUdIX1JFRwkJMHg4QwkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUcJMHg5MAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHCTB4OTQJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFSVF9SRUcJCQkJCTB4OTgJLy8gUi9fCisKKyNkZWZpbmUgTUU0NjAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRwkJMHhDMAkvLyBfL1cKKworI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8wCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8xCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8yCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0FNUExFX0hPTEQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NUT1AJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPCQkweDAwMDAwMDQwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8JCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfT0ZGU0VUCQkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0cJMHgwMDAwMDQwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRwkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORwkweDAwMDAxMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEJCQkweDAwMDAyMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRCQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEJCQkweDAwMDgwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRAkJMHgwMDIwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RICQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfQ0hBTk5FTAkJMHgwMDQwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9DSEFOTkVMCQkweDAwODAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0NIQU5ORUwJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBCQkweDA0MDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfTEUJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00JCQkweDIwMDAwMDAwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfUlBDSV9GSUZPCQkJMHg0MDAwMDAwMAkvL0Fsd2F5cyBzZXQgdG8gemVybyEKKworI2RlZmluZSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1kJCQkzM0U2CisKKyNkZWZpbmUgTUU0NjAwX0FJX01JTl9BQ1FfVElDS1MJCQkJNjZMTAorI2RlZmluZSBNRTQ2MDBfQUlfTUFYX0FDUV9USUNLUwkJCQkweEZGRkZGRkZGTEwKKworI2RlZmluZSBNRTQ2MDBfQUlfTUlOX1NDQU5fVElDS1MJCQk2NkxMCisjZGVmaW5lIE1FNDYwMF9BSV9NQVhfU0NBTl9USUNLUwkJCTB4RkZGRkZGRkZGTEwKKworI2RlZmluZSBNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1MJCQk2NkxMCisjZGVmaW5lIE1FNDYwMF9BSV9NQVhfQ0hBTl9USUNLUwkJCTB4RkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9GSUZPX0NPVU5UCQkJCTIwNDgKKworI2RlZmluZSBNRTQ2MDBfQUlfTElTVF9DT1VOVAkJCQkxMDI0CisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVECTB4MDAwCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTAkweDAyMAorCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAJCTB4MDAwCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81CTB4MDQwCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwCTB4MDgwCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNQkweDBDMAorCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX0xBU1RfRU5UUlkJCTB4MTAwCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5MmU2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYwpAQCAtMCwwICsxLDYwMTEgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FvLmMKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLy8vQ29tbW9uIHBhcnQuIChGb3Igbm9ybWFsIGFuZCBCb3NjaCBidWlsZHMuKQorCisvKiBJbmNsdWRlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTQ2MDBfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9hby5oIgorCisvKiBEZWZpbmVzCisgKi8KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcik7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKyNpZm5kZWYgQk9TQ0gKKy8vLyBAbm90ZSBOT1JNQUwgQlVJTEQKKy8vLyBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlICAgKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKy8qIEluY2x1ZGVzCisgKi8KKworIyBpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworLyogRGVmaW5lcworICovCisKKy8qKiBSZW1vdmUgc3ViZGV2aWNlLgorKi8KK3N0YXRpYyB2b2lkIG1lNDYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CisKKy8qKiBSZXNldCBzdWJkZXZpY2UuIFN0b3AgYWxsIGFjdGlvbnMuIFJlc2V0IHJlZ2lzdHJ5LiBEaXNhYmxlIEZJRk8uIFNldCBvdXRwdXQgdG8gMFYgYW5kIHN0YXR1cyB0byAnbm9uZScuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncyk7CisKKy8qKiBTZXQgb3V0cHV0IGFzIHNpbmdsZQorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisvKiogUGFzcyB0byB1c2VyIGFjdHVhbCB2YWx1ZSBvZiBvdXRwdXQuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIFdyaXRlIHRvIG91dHB1dCByZXF1ZWQgdmFsdWUuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc3RyZWFtZWQgZGV2aWNlLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworCisvKiogV2FpdCBmb3IgLyBDaGVjayBlbXB0eSBzcGFjZSBpbiBidWZmZXIuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIFN0YXJ0IHN0cmVhbWluZy4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogQ2hlY2sgYWN0dWFsIHN0YXRlLiAvIFdhaXQgZm9yIGVuZC4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKKy8qKiBTdG9wIHN0cmVhbWluZy4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgZGF0YXMgdG8gYnVmZm9yLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKy8qKiBJbnRlcnJ1cHQgaGFuZGxlci4gQ29weSBmcm9tIGJ1ZmZlciB0byBGSUZPLgorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorCQkJCSAsIHN0cnVjdCBwdF9yZWdzICpyZWdzCisjZW5kaWYKKyAgICApOworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KSBpbiB3cmFwYXJvdW5kIG1vZGUuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgICAgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoc2xvdykuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3Bvb2xpbmcobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGNpcmN1bGFyIGJ1ZmZlci4KKyovCitpbnQgaW5saW5lIGFvX2dldF9kYXRhX2Zyb21fdXNlcihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgKnVzZXJfdmFsdWVzKTsKKworLyoqIFN0b3AgcHJlc2VudGF0aW9uLiBQcmVzZXJ2ZSBGSUZPcy4KKyovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogVGFzayBmb3IgYXN5bmNocm9uaWNhbCBzdGF0ZSB2ZXJpZnlpbmcuCisqLworc3RhdGljIHZvaWQgbWU0NjAwX2FvX3dvcmtfY29udHJvbF90YXNrKAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwkJCQkJICAgICAgIHZvaWQgKnN1YmRldmljZQorI2Vsc2UKKwkJCQkJICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaworI2VuZGlmCisgICAgKTsKKy8qIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJLy9TdG9wIHN0YXRlIG1hY2hpbmUuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisKKwkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJdG1wICY9CisJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJLy9TZXQgc2luZ2xlIG1vZGUsIGRpc3NhYmxlIEZJRk8sIGRpc3NhYmxlIGV4dGVybmFsIHRyaWdnZXIsIHNldCBvdXRwdXQgdG8gYW5hbG9nLCBibG9jayBpbnRlcnJ1cHQuCisJb3V0bChNRTQ2MDBfQU9fTU9ERV9TSU5HTEUgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FPX01PREVfU0lOR0xFIHwgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRKTsKKworCS8vU2V0IG91dHB1dCB0byAwVgorCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvL1NldCBzdGF0dXMgdG8gc2lnbmFsIHRoYXQgZGV2aWNlIGlzIHVuY29uZmlndXJlZC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLiBNdXN0IGJlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1MuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3dpdGNoICh0cmlnX3R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJaWYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU29mdHdhcmUgdHJpZ2dlciBoYXMgbm90IGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlzd2l0Y2ggKHRyaWdfZWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuIFRyaWdnZXIgbXVzdCBiZSBzb2Z0d2FyZSBvciBkaWdpdGFsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAoKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkKKwkgICAgJiYgKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfQ0hBTjsKKwl9CisKKwlpZiAocmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgcmVmZXJlbmNlLiBBbmFsb2cgb3V0cHV0cyBoYXZlIHRvIGhhdmUgZ290IFJFRl9BT19HUk9VTkQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmIChzaW5nbGVfY29uZmlnICE9IDApIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuIE9ubHkgb25lIHJhbmdlIGZvciBhbmxvZyBvdXRwdXRzIGlzIGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLiBBbmFsb2cgb3V0cHV0IGhhdmUgb25seSBvbmUgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vU3ViZGV2aWNlIHJ1bm5pbmcgaW4gc3RyZWFtIG1vZGUhCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID49IGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzIDwgYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGJ1c3kuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKy8vLyBAbm90ZSBGb3Igc2luZ2xlIGFsbCBjYWxscyAoY29uZmlnIGFuZCB3cml0ZSkgYXJlIGVyYXNpbmcgcHJldmlvdXMgc3RhdGUhCisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisKKwkvLyBDb3JyZWN0IHNpbmdsZSBtaXJyb3JzCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvLyBTZXQgY29udHJvbCByZWdpc3Rlci4KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCS8vIFNldCBzdG9wIGJpdC4gU3RvcCBzdHJlYW1pbmcgbW9kZS4KKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9SZXNldCBhbGwgYml0cy4KKwljdHJsID0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1A7CisKKwlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQlQSU5GTygiRXh0ZXJuYWwgZGlnaXRhbCB0cmlnZ2VyLlxuIik7CisKKwkJaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfQU5ZKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfRkFMTElORykgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfUklTSU5HKSB7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCX0KKwl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJUERFQlVHKCJTb2Z0d2FyZSB0cmlnZ2VyXG4iKTsKKwkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCX0KKworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy8gU2V0IHByZWxvYWQvc3luY2hyb25pemF0aW9uIHJlZ2lzdGVyLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCSAgICB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHg7CisJfQorCisJaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwl9IGVsc2UJCQkvL2lmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKQorCXsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHw9CisJCSAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisJfQorCisJLy9SZXNldCBoYXJkd2FyZSByZWdpc3RlcgorCXN5bmMgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jKTsKKwlzeW5jICY9IH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJc3luYyB8PSBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkvL091dHB1dCBjb25maWd1cmVkIGluIGRlZmF1bHQgKHNhZmUpIG1vZGUuCisJb3V0bChzeW5jLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9OT05CTE9DS0lORykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuICVkXG4iLCBmbGFncyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID49IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPD0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisJaWYgKCghZmxhZ3MpICYmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpKSB7CS8vQmxvY2tpbmcgbW9kZS4gV2FpdCBmb3IgdHJpZ2dlci4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCQlpZiAoZGVsYXkgPT0gMCkKKwkJCQlkZWxheSA9IDE7CisJCX0KKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gVGhpcyBwcm9jZWR1cmUgaGFzIG93biB0aW1lb3V0LgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsKKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCisJCSp2YWx1ZSA9CisJCSAgICAoIWVycikgPyBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gOiBpbnN0YW5jZS0+CisJCSAgICBzaW5nbGVfdmFsdWU7CisJfSBlbHNlIHsJCS8vTm9uLWJsb2NraW5nIG1vZGUKKwkJLy9SZWFkIHZhbHVlCisJCSp2YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDB4MDsKKworCS8vUmVnaXN0cnkgaGFuZGxpbmcgdmFyaWFibGVzLgorCXVpbnQzMl90IHN5bmNfbWFzazsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IHRtcDsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN0YXR1czsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTIHwKKwkgICAgICBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHZhbHVlICYgfk1FNDYwMF9BT19NQVhfREFUQSkgeworCQlQRVJST1IoIkludmFsaWQgdmFsdWUgcHJvdmlkZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1ZBTFVFX09VVF9PRl9SQU5HRTsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpCisJICAgIHx8IChpbnN0YW5jZS0+c3RhdHVzID4gYW9fc3RhdHVzX3NpbmdsZV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKy8vLyBAbm90ZSBGb3Igc2luZ2xlIGFsbCBjYWxscyAoY29uZmlnIGFuZCB3cml0ZSkgYXJlIGVyYXNpbmcgcHJldmlvdXMgc3RhdGUhCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gdmFsdWU7CisKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CS8vTm8gRklGTworCQkvL1NldCB0aGUgc2luZ2xlIG1vZGUuCisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX01PREVfTUFTSzsKKworCQkvL1dyaXRlIHZhbHVlCisJCVBERUJVRygiV3JpdGUgdmFsdWVcbiIpOworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfSBlbHNlIHsJCS8vIG1peC1tb2RlCisJCS8vU2V0IHNwZWVkCisJCW91dGwoTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJCVBERUJVR19SRUcoInRpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnRpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnQpTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTKTsKKwkJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKworCQkvL1NldCB0aGUgY29udGlub3VzIG1vZGUuCisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCisJCS8vUHJlcGFyZSBGSUZPCisJCWlmICghKGN0cmwgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyB3YXNuJ3QgZW5hYmVsZWQuIERvIGl0LgorCQkJUElORk8oIkVuYWJsZWluZyBGSUZPLlxuIik7CisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCX0gZWxzZSB7CS8vQ2hlY2sgaWYgRklGTyBpcyBlbXB0eQorCQkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSB7CS8vRklGTyBub3QgZW1wdHkKKwkJCQlQSU5GTygiUmVzZXRpbmcgRklGTy5cbiIpOworCQkJCWN0cmwgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRKTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkJCWN0cmwgfD0KKwkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPIHwKKwkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCX0gZWxzZSB7CS8vRklGTyBlbXB0eSwgb25seSBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgZGlzYWJsZWQhCisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJfQorCQl9CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL1dyaXRlIG91dHB1dCAtIDEgdmFsdWUgdG8gRklGTworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJb3V0bCh2YWx1ZSA8PD0gMTYsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQlQREVCVUdfUkVHKCJmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUgPDw9IDE2KTsKKwkJfSBlbHNlIHsKKwkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQlQREVCVUdfUkVHKCJmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUpOworCQl9CisJfQorCisJbW9kZSA9ICppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyA+PiBpbnN0YW5jZS0+YW9faWR4OworCW1vZGUgJj0gKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyk7CisKKwlQSU5GTygiVHJpZ2dlcmluZyBtb2RlOiAweCV4XG4iLCBtb2RlKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJc3luY19tYXNrID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY19tYXNrKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CQkvL0luZGl2aWR1YWwgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy8gTm8gRklGTyAtIEluIHRoaXMgY2FzZSByZXNldHRpbmcgJ01FNDYwMF9BT19TWU5DX0hPTEQnIHdpbGwgdHJpZ2dlciBvdXRwdXQuCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4gVGhpcyBpcyBleGNlcHRpb24uIEl0IGlzIHNldCB0byBzeW5jaHJvbm91cyBhbmQgdHJpZ2dlcmVkIGxhdGVyLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIEZJRk8KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUc6CS8vSW5kaXZpZHVhbCBoYXJkd2FyZQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoIWluc3RhbmNlLT5maWZvKSB7CS8vIE5vIEZJRk8gLSBJbiB0aGlzIGNhc2UgcmVzZXR0aW5nICdNRTQ2MDBfQU9fU1lOQ19IT0xEJyB3aWxsIHRyaWdnZXIgb3V0cHV0LgorCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IE1FNDYwMF9BT19TWU5DX0hPTEQpIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUKKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlzeW5jX21hc2sgfD0KKwkJCQkgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9IGVsc2UgewkvLyBGSUZPCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gMHgwKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KChNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyB8CisJCQkJICAgICAgIE1FNDYwMF9BT19TWU5DX0hPTEQpIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBNRTQ2MDBfQU9fU1lOQ19IT0xEOgkvL1N5bmNocm9ub3VzIHNvZnR3YXJlCisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IE1FNDYwMF9BT19TWU5DX0hPTEQpCisJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJc3luY19tYXNrIHw9CisJCQkgICAgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfbWFzayAmPSB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJc3luY19tYXNrIHw9IE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyk6CS8vU3luY2hyb25vdXMgaGFyZHdhcmUKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJc3luY19tYXNrIHw9CisJCQkgICAgKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICBpbnN0YW5jZS0+YW9faWR4OworCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCWJyZWFrOworCX0KKy8vICAgICAgICAgICAgICBzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7ICAgICAgICAvLyBNb3ZlZCBkb3duLgorCisJLy9BY3RpdmF0ZSBJU00gKHJlbW92ZSAnc3RvcCcgYml0cykKKwljdHJsICY9CisJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwljdHJsIHw9IGluc3RhbmNlLT5jdHJsX3RyZzsKKwljdHJsICY9IH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisvLy8gQG5vdGUgV2hlbiBmbGFnICdNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTJyBpcyBzZXQgdGhhbiBvdXRwdXQgaXMgdHJpZ2dlcmVkLiBBTFdBWVMhCisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CS8vTm8gRklGTworCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuCisJCQl0bXAgPSB+KCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8IDB4RkZGRjAwMDApOworCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzLiBtYXNrOjB4JTA4eFxuIiwKKwkJCSAgICAgdG1wKTsKKwkJCXRtcCB8PSBzeW5jX21hc2sgJiAweEZGRkYwMDAwOworCQkJLy8gQWRkIHRoaXMgY2hhbm5lbCB0byBsaXN0CisJCQl0bXAgJj0gfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKwkJfSBlbHNlIGlmICghbW9kZSkgewkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCW91dGwoc3luY19tYXNrICYKKwkJCSAgICAgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJIGluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKwkJfQorCisJfSBlbHNlIHsJCS8vIG1peC1tb2RlIC0gYmVnaW4KKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgewkvL1RyaWdnZXIgb3V0cHV0cworCQkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNfbWFzayB8CisJCQkgICAgIChNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayB8IChNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQlpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJCS8vRmlyZQorCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0IC8vPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQkJb3V0bChzeW5jX21hc2sgJiB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKyovCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAweDgwMDApOworCisvKgkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzIC8vPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY19tYXNrKTsKKyovCisJCX0KKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaiA9IGppZmZpZXM7CisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ7CisKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKCEoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKCgoIWRlbGF5KSB8fCAoKGppZmZpZXMgLSBqKSA8PSBkZWxheSkpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc2luZ2xlX2VuZCkpIHsKKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9lbmQpIHsKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGppZmZpZXMgLSBqKSA+IGRlbGF5KSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIFNpZ25hbCBjb21lIGJ1dCBzdGF0dXMgaXMgc3RyYW5nZTogJWRcbiIsCisJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJfQorCisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQl9CisKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NIaWdoOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZIHwgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ECisJICAgICAgfCBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CisJCWlmICghZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZIGhhcyB0byBiZSB3aXRoIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpCisJCSAgICB8fCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZSBtdXN0IGJlIGluIGluZmluaXRlIG1vZGUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQl9CisJfQorCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJPbmx5IDEgZW50cnkgaW4gY29uZmlnIGxpc3QgYWNjZXB0YWJsZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05GSUdfTElTVF9DT1VOVDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaUNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlTdHJlYW1Db25maWcgIT0gMCkgeworCQlQRVJST1IoIk9ubHkgb25lIHJhbmdlIGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVFJFQU1fQ09ORklHOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pUmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SKCJPdXRwdXQgaXMgcmVmZXJlbmNlZCB0byBncm91bmQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgIT0gMCkKKwkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCAhPSAwKSkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfQVJHOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pRmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbmZpZyBsaXN0IGZsYWcuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX1NXOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfQU5ZOgorCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykgeworCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1RJTUVSKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKChjb252X3RpY2tzIDwgTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTKQorCSAgICB8fCAoY29udl90aWNrcyA+IE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCkgeworCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0xvdyB8fCB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfQVJHOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgIT0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQl9CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4pIHsKKwljYXNlIE1FX1RSSUdfQ0hBTl9ERUZBVUxUOgorCWNhc2UgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICgoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSAmJiAhaW5zdGFuY2UtPmJpdHBhdHRlcm4pIHsKKwkJUEVSUk9SKCJUaGlzIHN1YmRldmljZSBub3Qgc3VwcG9ydCBvdXRwdXQgcmVkaXJlY3Rpb24uXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwkvL1N0b3AgZGV2aWNlCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vQ2hlY2sgaWYgc3RhdGUgbWFjaGluZSBpcyBzdG9wcGVkLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkvL1Jlc2V0IGNvbnRyb2wgcmVnaXN0ZXIuIEJsb2NrIGFsbCBhY3Rpb25zLiBEaXNhYmxlIElSUS4gRGlzYWJsZSBGSUZPLgorCWN0cmwgPQorCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCS8vVGhpcyBpcyBwYXJhbm9pYywgYnV0IHRvIGJlIHN1cmUuCisJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkvKiBTZXQgbW9kZS4gKi8KKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsJLy9XcmFwYXJvdW5kCisJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfSEFSRFdBUkVfT05MWSkgewkvL0hhcmR3YXJlIHdyYXBhcm91bmQKKwkJCVBJTkZPKCJIYXJkd2FyZSB3cmFwYXJvdW5kLlxuIik7CisJCQljdHJsIHw9IE1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQ7CisJCQlpbnN0YW5jZS0+bW9kZSA9IE1FNDYwMF9BT19IV19XUkFQX01PREU7CisJCX0gZWxzZSB7CS8vU29mdHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIlNvZnR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUzsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU0NjAwX0FPX1NXX1dSQVBfTU9ERTsKKwkJfQorCX0gZWxzZSB7CQkvL0NvbnRpbm91cworCQlQSU5GTygiQ29udGlub3VzLlxuIik7CisJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUzsKKwkJaW5zdGFuY2UtPm1vZGUgPSBNRTQ2MDBfQU9fQ09OVElOT1VTOworCX0KKworCS8vU2V0IHRoZSB0cmlnZ2VyIGVkZ2UuCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgewkvL1NldCB0aGUgdHJpZ2dlciB0eXBlIGFuZCBlZGdlIGZvciBleHRlcm5hbCB0cmlnZ2VyLgorCQlQSU5GTygiRXh0ZXJuYWwgZGlnaXRhbCB0cmlnZ2VyLlxuIik7CisJCWluc3RhbmNlLT5zdGFydF9tb2RlID0gTUU0NjAwX0FPX0VYVF9UUklHOworLyoKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworKi8KKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IHJpc2luZy5cbiIpOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogZmFsbGluZy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IGJvdGggZWRnZXMuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJUElORk8oIkludGVybmFsIHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSAwOworCX0KKworCS8vU2V0IHRoZSBzdG9wIG1vZGUgYW5kIHZhbHVlLgorCWlmICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkgewkvL0Ftb3VudCBvZiBkYXRhCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTQ2MDBfQU9fQUNRX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCX0gZWxzZSBpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mICdzY2FucycKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNDYwMF9BT19TQ0FOX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwl9IGVsc2UgewkJLy9JbmZpbml0ZQorCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU0NjAwX0FPX0lORl9TVE9QX01PREU7CisJCWluc3RhbmNlLT5zdG9wX2NvdW50ID0gMDsKKwl9CisKKwlQSU5GTygiU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CS8vU3luY2hyb25vdXMgc3RhcnQKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgfD0gTUU0NjAwX0FPX1NZTkNfSE9MRDsKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgewkvL0V4dGVybmFseSB0cmlnZ2VyZWQKKwkJCVBJTkZPKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgYWN0aXZlLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRzsKKwkJfQorI2lmZGVmIE1FREVCVUdfSU5GTworCQllbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgZGlzc2FibGVkLlxuIik7CisJCX0KKyNlbmRpZgorCisJfQorCS8vU2V0IHNwZWVkCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb252X3RpY2tzIC0gMik7CisJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSAoaW50KShjb252X3RpY2tzICogSFopIC8gTUU0NjAwX0FPX0JBU0VfRlJFUVVFTkNZOwkvLzw9PSBNVVNUIGJlIHdpdGggY2FzdCEKKworCS8vQ29uZWN0IG91dHB1dHMgdG8gYW5hbG9nIG9yIGRpZ2l0YWwgcG9ydC4KKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSB7CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwl9CisJLy8gV3JpdGUgdGhlIGNvbnRyb2wgd29yZAorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1NldCBzdGF0dXMuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJbG9uZyBqOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2lyY3VsYXIgYnVmZmVyIG5vdCBleGlzdHMuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoZSBidWZmZXIgaXMgTk9UIGZ1bGwuCisJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CQkvL1RoZSBidWZmZXIgaXMgZnVsbC4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQkJaWYgKHQgPT0gMCkKKwkJCQl0ID0gMTsKKwkJfSBlbHNlIHsJLy9NYXggdGltZS4KKwkJCXQgPSBMT05HX01BWDsKKwkJfQorCisJCSpjb3VudCA9IDA7CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gSW50ZXJydXB0cyBhcmUgd2hlbiBGSUZPIEhGIGlzIHNpZ25hbGVkLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKG1lX2NpcmNfYnVmX3NwYWNlCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSwKKwkJCQkJCSB0KTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsJLy9VZmYuLi4gYWxsIGlzIGdvb2QuIEluZm9ybSB1c2VyIGFib3V0IGVtcHR5IHNwYWNlLgorCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgY291bnQgPSAwOworCWludCBjaXJjX2J1ZmZlcl9jb3VudDsKKworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncyAmIH5NRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICgoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKQorCSAgICAmJiAoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsJLy9DaGVja2luZyBhY3R1YWwgbW9kZS4KKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCQkvL0NvcnJlY3QgbW9kZXMhCisJCWJyZWFrOworCisJCS8vVGhlIGRldmljZSBpcyBpbiB3cm9uZyBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCQlQRVJST1IKKwkJICAgICgiU3ViZGV2aWNlIG11c3QgYmUgcHJlaW5pdGlhbGl6ZSBjb3JyZWN0bHkgZm9yIHN0cmVhbWluZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBERUJVRygiQmVmb3JlIHJlc3RhcnQgYnJva2Ugc3RyZWFtICdTVE9QJyBtdXN0IGJlIGNhbGVkLlxuIik7CisJCXJldHVybiBNRV9TVEFUVVNfRVJST1I7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCVBERUJVRygiU3RyZWFtIGlzIGFscmVhZHkgd29ya2luZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisKKwlkZWZhdWx0OgorCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJTdGF0dXMgaXMgaW4gd3Jvbmcgc3RhdGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCWNpcmNfYnVmZmVyX2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCisJaWYgKCFjaXJjX2J1ZmZlcl9jb3VudCAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL05vIHZhbHVlcyBpbiBidWZmZXIKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCVBFUlJPUigiTm8gdmFsdWVzIGluIGJ1ZmZlciFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTEFDS19PRl9SRVNPVVJDRVM7CisJfQorCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisJLy9TZXQgdmFsdWVzIGZvciBzaW5nbGVfcmVhZCgpCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IE1FNDYwMF9BT19NQVhfREFUQSArIDE7CisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gTUU0NjAwX0FPX01BWF9EQVRBICsgMTsKKworCS8vU2V0dGluZyBzdG9wIHBvaW50cworCWlmIChpbnN0YW5jZS0+c3RvcF9tb2RlID09IE1FNDYwMF9BT19TQ0FOX1NUT1BfTU9ERSkgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0KKwkJICAgIGluc3RhbmNlLT5zdG9wX2NvdW50ICogY2lyY19idWZmZXJfY291bnQ7CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA9IGluc3RhbmNlLT5zdG9wX2NvdW50OworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAhPSAwKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8IGNpcmNfYnVmZmVyX2NvdW50KSkgeworCQlQRVJST1IoIk1vcmUgZGF0YSBpbiBidWZmZXIgdGhhbiBwcmV2aW91c2x5IHNldCBsaW1pdCFcbiIpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCS8vQ2hlY2sgRklGTworCWlmICghKGN0cmwgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyB3YXNuJ3QgZW5hYmVsZWQuIERvIGl0LiA8PSBUaGlzIHNob3VsZCBiZSBkb25lIGJ5IHVzZXIgY2FsbCB3aXRoIE1FX1dSSVRFX01PREVfUFJFTE9BRAorCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJY3RybCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPIHwKKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9IGVsc2UgewkJLy9CbG9jayBJUlEKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGN0cmwgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRKTsKKworCS8vRmlsbCBGSUZPIDw9IEdlbmVyYWx5IHRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBwcmUtbG9hZCBjYWxsIGJ1dCB0aGlzIGlzIHNlY29uZCBwbGFjZSB0byBkbyBpdC4KKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvL0ZJRk8gZW1wdHkKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPT0gMCkgeworCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVDsKKwkJfSBlbHNlIHsKKwkJCWNvdW50ID0KKwkJCSAgICAoTUU0NjAwX0FPX0ZJRk9fQ09VTlQgPAorCQkJICAgICBpbnN0YW5jZS0+CisJCQkgICAgIHN0b3BfZGF0YV9jb3VudCkgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCA6CisJCQkgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudDsKKwkJfQorCisJCS8vQ29weSBkYXRhCisJCWNvdW50ID0KKwkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKworCQlpZiAoY291bnQgPCAwKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCVBFUlJPUl9DUklUSUNBTCgiQ09QWSBGSU5JU0ggV0lUSCBFUlJPUiFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfQorCS8vU2V0IHByZS1sb2FkIGZlYXR1cmVzLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlzeW5jaCAmPQorCSAgICB+KChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCXN5bmNoIHw9CisJICAgIChpbnN0YW5jZS0+c3RhcnRfbW9kZSAmIH5NRTQ2MDBfQU9fRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHg7CisJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCS8vRGVmYXVsdCBjb3VudCBpcyAnMCcKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY291bnQ7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0gZWxzZSB7CQkvL1dyYXBhcm91bmQKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisKKwkJLy9TcGVjaWFsIGNhc2U6IEluZmluaXRlIHdyYXBhcm91bmQgd2l0aCBsZXNzIHRoYW4gRklGTyBkYXRhcyBhbHdheXMgc2hvdWxkIHJ1bnMgaW4gaGFyZHdhcmUgbW9kZS4KKwkJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlID09IE1FNDYwMF9BT19JTkZfU1RPUF9NT0RFKQorCQkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IE1FNDYwMF9BT19GSUZPX0NPVU5UKSkgewkvL0NoYW5nZSB0byBoYXJkd2FyZSB3cmFwYXJvdW5kCisJCQlQREVCVUcKKwkJCSAgICAoIkNoYW5nZWluZyBtb2RlIGZyb20gc29mdHdhcmUgd3JhcGFyb3VuZCB0byBoYXJkd2FyZSB3cmFwYXJvdW5kLlxuIik7CisJCQkvL0NvcHkgYWxsIGRhdGEKKwkJCWNvdW50ID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID09IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1Jlc2V0IHBvc2l0aW9uIGluZGljYXRvci4KKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwl9CisKKwkvL1NldCBzdGF0dXMgdG8gJ3dhaXQgZm9yIHN0YXJ0JworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0OworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkvL1N0YXJ0IHN0YXRlIG1hY2hpbmUgYW5kIGludGVycnVwdHMKKwljdHJsICY9IH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCWlmIChpbnN0YW5jZS0+c3RhcnRfbW9kZSA9PSBNRTQ2MDBfQU9fRVhUX1RSSUcpIHsJLy8gRXh0ZXJuYWwgdHJpZ2dlci4KKwkJUElORk8oIkV4dGVybmFsIHRyaWdnZXIuXG4iKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJfQorCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL01vcmUgdGhhbiBoYWxmIQorCQlpZiAoKGN0cmwgJiBNRTQ2MDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVMpIHsJLy9FbmFibGUgSVJRIG9ubHkgd2hlbiBoYXJkd2FyZV9jb250aW5vdXMgaXMgc2V0IGFuZCBGSUZPIGlzIG1vcmUgdGhhbiBoYWxmCisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJfQorCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vVHJpZ2dlciBvdXRwdXQKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQlvdXRsKHN5bmNoIHwgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHN5bmNoIHwgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCS8vRmlyZQorCQlQSU5GTworCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCX0gZWxzZSBpZiAoIWluc3RhbmNlLT5zdGFydF9tb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgorCQkvL1JlbW92ZSBjaGFubmVsIGZyb20gc3RhcnQgbGlzdC4JLy8gPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCW91dGwoc3luY2ggJiB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2ggJiB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworKi8KKwkJLy9GaXJlCisJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisvKgorCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MuCS8vIDw9PSBVbm5lY2Vzc2FyeS4gUmVtb3ZlZC4KKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisqLworCX0KKwkvLyBTZXQgY29udHJvbCB0YXNrJ3MgdGltZW91dAorCXJlZiA9IGppZmZpZXM7CisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gcmVmOworCisJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vTGVzcyB0aGFuIGhhbGYgYnV0IG5vdCBlbXB0eSEKKwkJUElORk8oIkxlc3MgdGhhbiBoYWxmLlxuIik7CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApIHsKKwkJCWNvdW50ID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgICgoTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyKSA8CisJCQkgICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLworCQkJICAgIDIgOiBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQl9IGVsc2UgewkvL1dyYXBhcm91bmQKKwkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKworCQkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJfQorCS8vU3BlY2lhbCBjYXNlOiBMaW1pdGVkIHdyYXBhcm91bmQgd2l0aCBsZXNzIHRoYW4gSEFMRiBGSUZPIGRhdGFzIG5lZWQgd29yayBhcm91bmQgdG8gZ2VuZXJhdGUgZmlyc3QgaW50ZXJydXB0LgorCWlmICgoaW5zdGFuY2UtPnN0b3BfbW9kZSAhPSBNRTQ2MDBfQU9fSU5GX1NUT1BfTU9ERSkKKwkgICAgJiYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19TV19XUkFQX01PREUpCisJICAgICYmIChjaXJjX2J1ZmZlcl9jb3VudCA8PSAoTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyKSkpIHsJLy9QdXQgbW9yZSBkYXRhIHRvIEZJRk8KKwkJUElORk8oIkxpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJFUlJPUiBXSEVOIExPQURJTkcgVkFMVUVTIEZPUiBXUkFQQVJPVU5EIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCXdoaWxlIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID4gaW5zdGFuY2UtPmRhdGFfY291bnQpIHsJLy9NYXhpbXVtIGRhdGEgbm90IHNldCBqZXQuCisJCQkvL0NvcHkgdG8gYnVmZmVyCisJCQlpZiAoY2lyY19idWZmZXJfY291bnQgIT0gYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY2lyY19idWZmZXJfY291bnQsIDApKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJFUlJPUiBXSEVOIExPQURJTkcgVkFMVUVTIEZPUiBXUkFQQVJPVU5EIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY2lyY19idWZmZXJfY291bnQ7CisKKwkJCWlmICghKChzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL0ZJRk8gaXMgbW9yZSB0aGFuIGhhbGYuIEVuYWJsZSBJUlEgYW5kIGVuZCBjb3B5LgorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisJCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8vIFNjaGVkdWxlIGNvbnRyb2wgdGFzay4KKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU0NjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsJLy9XYWl0IGZvciBzdGFydC4KKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUERFQlVHKCJTdGFydGluZyBzdHJlYW0gY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSByZWYpID49IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoamlmZmllcyAtIHJlZikgPiBkZWxheSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIFNpZ25hbCBjb21lIGJ1dCBzdGF0dXMgaXMgc3RyYW5nZTogJWRcbiIsCisJCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQl9CisJCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCh3YWl0ICE9IE1FX1dBSVRfTk9ORSkgJiYgKHdhaXQgIT0gTUVfV0FJVF9JRExFKSkgeworCQlQRVJST1IoIkludmFsaWQgd2FpdCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JTlZBTElEOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XQUlUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgeworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19ub25lOgorCWRlZmF1bHQ6CisJCSpzdGF0dXMgPQorCQkgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pID8KKwkJICAgIE1FX1NUQVRVU19CVVNZIDogTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCX0KKworCWlmICgod2FpdCA9PSBNRV9XQUlUX0lETEUpICYmICgqc3RhdHVzID09IE1FX1NUQVRVU19CVVNZKSkgeworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc2luZ2xlX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3N0cmVhbV9ydW4pCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIldhaXQgZm9yIElETEUgY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgZm9yIElETEUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCX0KKworCSp2YWx1ZXMgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQorewkJCQkvLyBTdG9wIHdvcmsgYW5kIGVtcHR5IGJ1ZmZlciBhbmQgRklGTworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdm9sYXRpbGUgdWludDMyX3QgY3RybDsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVE9QX1BSRVNFUlZFX0JVRkZFUlMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpCisJICAgICYmIChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdG9wIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChpbnN0YW5jZS0+c3RhdHVzIDwgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKSB7CisJCS8vVGhlcmUgaXMgbm90aGluZyB0byBzdG9wIQorCQlQRVJST1IoIlN1YmRldmljZSBub3QgaW4gc3RyZWFtaW5nIG1vZGUuICVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9NYXJrIGFzIHN0b3BwaW5nLiA9PiBTb2Z0d2FyZSBzdG9wLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCisJaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfSU1NRURJQVRFKSB7CS8vU3RvcHBlZCBub3chCisJCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCX0gZWxzZSBpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSB7CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKSAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJaWYgKGN0cmwgPT0gTUU0NjAwX0FPX01PREVfV1JBUEFST1VORCkgewkvL0hhcmR3YXJlIHdyYXBhcm91bmQgPT4gSGFyZHdhcmUgc3RvcC4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJTdG9wcGluZyBzdHJlYW0gY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJTdG9wcGluZyBzdHJlYW0gaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PQorCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJaWYgKCFmbGFncykgewkJLy9SZXNldCBGSUZPCisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwl9CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IHNvZnR3YXJlIGJ1ZmZlcgorCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCByZWdfY29weTsKKworCWludCBjb3BpZWRfZnJvbV91c2VyID0gMDsKKwlpbnQgbGVmdF90b19jb3B5X2Zyb21fdXNlciA9ICpjb3VudDsKKworCWludCBjb3BpZWRfdmFsdWVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvL0NoZWNraW5nIGFyZ3VtZW50cworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKmNvdW50IDw9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJfQorCisJaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisJCVBFUlJPUigiSW52YWxpZCBhZGRyZXNzIG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUE9JTlRFUjsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHx8IChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCkpIHsJLy9UaGUgZGV2aWNlIGlzIGluIHNpbmdsZSBtb2RlLgorCQlQRVJST1IKKwkJICAgICgiU3ViZGV2aWNlIG11c3QgYmUgcHJlaW5pdGlhbGl6ZSBjb3JyZWN0bHkgZm9yIHN0cmVhbWluZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKy8vLyBAbm90ZSBJZiBubyAncHJlLWxvYWQnIGlzIHVzZWQuIHN0cmVhbV9zdGFydCgpIHdpbGwgbW92ZSBkYXRhIHRvIEZJRk8uCisJc3dpdGNoICh3cml0ZV9tb2RlKSB7CisJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisKKwkJLy9EZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQl9CisJCWJyZWFrOworCWNhc2UgTUVfV1JJVEVfTU9ERV9OT05CTE9DS0lORzoKKwljYXNlIE1FX1dSSVRFX01PREVfQkxPQ0tJTkc6CisJCS8vLyBAbm90ZSBJbiBibG9ja2luZyBtb2RlOiBXaGVuIGRldmljZSBpcyBub3QgcnVuaW5nIGFuZCB0aGVyZSBpcyBub3QgZW5vdWdodCBzcGFjZSBjYWxsIHdpbGwgYmxvY2tlZCB1cCEKKwkJLy8vIEBub3RlIFNvbWUgb3RoZXIgdGhyZWFkIG11c3QgZW1wdHkgYnVmZmVyIGJ5IHN0YXJ0aW5nIGVuZ2luZS4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgd3JpdGUgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTQ2MDBfQU9fV1JBUF9NT0RFKSB7CS8vV3JhcGFyb3VuZCBtb2RlLiBEZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCQl9CisJfQorCisJaWYgKChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fSFdfV1JBUF9NT0RFKSAmJiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX1BSRUxPQUQpKSB7CS8vIGhhcmR3YXJlIHdyYXBfYXJvdW5kIG1vZGUuCisJCS8vVGhpcyBpcyB0cmFuc3BhcmVudCBmb3IgdXNlci4KKwkJUERFQlVHKCJDaGFuZ2luZyB3cml0ZV9tb2RlIHRvIE1FX1dSSVRFX01PREVfUFJFTE9BRC5cbiIpOworCQl3cml0ZV9tb2RlID0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh3cml0ZV9tb2RlID09IE1FX1dSSVRFX01PREVfUFJFTE9BRCkgewkvL0luaXQgZW52aXJvbWVudCAtIHByZWxvYWQKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJLy9DaGVjayBGSUZPCisJCWlmICghKHJlZ19jb3B5ICYgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPKSkgewkvL0ZJRk8gbm90IGFjdGl2ZS4gRW5hYmxlIGl0LgorCQkJcmVnX2NvcHkgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJLy9Db3B5IHRvIGJ1ZmZlci4gVGhpcyBzdGVwIGlzIGNvbW1vbiBmb3IgYWxsIG1vZGVzLgorCQljb3BpZWRfZnJvbV91c2VyID0KKwkJICAgIGFvX2dldF9kYXRhX2Zyb21fdXNlcihpbnN0YW5jZSwgbGVmdF90b19jb3B5X2Zyb21fdXNlciwKKwkJCQkJICB2YWx1ZXMgKyAoKmNvdW50IC0KKwkJCQkJCSAgICBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSk7CisJCWxlZnRfdG9fY29weV9mcm9tX3VzZXIgLT0gY29waWVkX2Zyb21fdXNlcjsKKworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX3J1bikgJiYgIShyZWdfY29weSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy9CUk9LRU4gUElQRSEgVGhlIHN0YXRlIG1hY2hpbmUgaXMgc3RvcGVkIGJ1dCBsb2dpY2FsIHN0YXR1cyBzaG93IHRoYXQgc2hvdWxkIGJlIHdvcmtpbmcuCisJCQlQRVJST1IoIkJyb2tlbiBwaXBlIGluIHdyaXRlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX3J1bikgJiYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpICYmIChyZWdfY29weSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL0NvbnRpbm91cyBtb2RlIHJ1bmluZyBhbmQgZGF0YSBhcmUgYmVsb3cgaGFsZiEKKworCQkJLy8gQmxvY2sgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJLy9yZWdfY29weSAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlyZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL0Zhc3QgY29weQorCQkJY29waWVkX3ZhbHVlcyA9CisJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyLAorCQkJCQkgIDApOworCQkJaWYgKGNvcGllZF92YWx1ZXMgPiAwKSB7CisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY29waWVkX3ZhbHVlczsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIEFjdGl2YXRlIGludGVycnVwdHMuCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCS8vcmVnX2NvcHkgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlyZWdfY29weSAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCW91dGwocmVnX2NvcHksIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgcmVnX2NvcHkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKGNvcGllZF92YWx1ZXMgPT0gMCkgewkvL1RoaXMgd2FzIGNoZWNrZWQgYW5kIG5ldmVyIHNob3VsZCBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTCgiQ09QSU5HIEZJTklTSCBXSVRIIDAhXG4iKTsKKwkJCX0KKworCQkJaWYgKGNvcGllZF92YWx1ZXMgPCAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkJICAgICgiQ09QSU5HIEZJTklTSCBXSVRIIEFOIEVSUk9SIVxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghbGVmdF90b19jb3B5X2Zyb21fdXNlcikgewkvL0FsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWJyZWFrOworCQl9IGVsc2UgewkvL05vdCBhbGwgZGF0YXMgd2VyZSBjb3BpZWQuCisJCQlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTQ2MDBfQU9fV1JBUF9NT0RFKSB7CS8vRXJyb3IgdG9vIG11Y2ggZGF0YXMhIFdyYXBhcm91bmQgaXMgbGltaXRlZCBpbiBzaXplIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIHdyYXBhcm91bmQgbW9kZSEgIEV4Y2VlZGVkIHNpemUgb2YgJWxkLlxuIiwKKwkJCQkgICAgIE1FNDYwMF9BT19DSVJDX0JVRl9DT1VOVCAtIDEpOworCQkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX0JMT0NLSU5HKSB7CS8vTm9uIGJsb2NraW5nIGNhbGxzCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPgorCQkJCQkJCQkgICBjaXJjX2J1ZikpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IoIldyaXRpbmcgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy9SZXNldAorCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh3cml0ZV9tb2RlID09IE1FX1dSSVRFX01PREVfUFJFTE9BRCkgewkvL0NvcHkgZGF0YSB0byBGSUZPIC0gcHJlbG9hZAorCQljb3BpZWRfdmFsdWVzID0KKwkJICAgIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhpbnN0YW5jZSwgTUU0NjAwX0FPX0ZJRk9fQ09VTlQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKworCQlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19IV19XUkFQX01PREUpCisJCSAgICAmJiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpID4KKwkJCU1FNDYwMF9BT19GSUZPX0NPVU5UKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJUb28gbXVjaCBkYXRhIGZvciBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUhIEV4Y2VlZGVkIHNpemUgb2YgJWQuXG4iLAorCQkJICAgICBNRTQ2MDBfQU9fRklGT19DT1VOVCk7CisJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJfQorCX0KKworCSpjb3VudCA9ICpjb3VudCAtIGxlZnRfdG9fY29weV9mcm9tX3VzZXI7CisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisJCQkJICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKKyNlbmRpZgorICAgICkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gZGV2X2lkOworCXVpbnQzMl90IGlycV9zdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghKGlycV9zdGF0dXMgJiAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPX0hGIDw8IGluc3RhbmNlLT5hb19pZHgpKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IElEPSVkOiBzdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+YW9faWR4LCBpcnFfc3RhdHVzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmICghaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZikgeworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJDSVJDVUxBUiBCVUZGRVIgTk9UIEVYSVNUUyFcbiIpOworCQkvL0Jsb2NrIGludGVycnVwdHMuIFN0b3AgbWFjaGluZS4KKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJY3RybCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUSB8CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL0luZm9ybSB1c2VyCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL1RvbyBsYXRlLiBOb3Qgd29ya2luZyEgRU5EPyBCUk9LRU4gUElQRT8KKwkJUERFQlVHKCJJbnRlcnJ1cHQgY29tZSBidXQgSVNNIGlzIG5vdCB3b3JraW5nIVxuIik7CisJCS8vQmxvY2sgaW50ZXJydXB0cy4gU3RvcCBtYWNoaW5lLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJRIHwgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLy9HZW5lcmFsIHByb2NlZHVyZS4gUHJvY2VzcyBtb3JlIGRhdGFzLgorCisjaWZkZWYgTUVERUJVR19ERUJVRworCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vQnVmZmVyIGlzIGVtcHR5IQorCQlQREVCVUcoIkNpcmN1bGFyIGJ1ZmZlciBlbXB0eSFcbiIpOworCX0KKyNlbmRpZgorCisJLy9DaGVjayBGSUZPCisJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vT0sgbGVzcyB0aGFuIGhhbGYKKworCQkvL0Jsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCWRvIHsKKwkJCS8vQ2FsY3VsYXRlIGhvdyBtYW55IHNob3VsZCBiZSBjb3BpZWQuCisJCQljb3VudCA9CisJCQkgICAgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gaW5zdGFuY2UtPgorCQkJICAgIHN0b3BfZGF0YV9jb3VudCAtCisJCQkgICAgaW5zdGFuY2UtPmRhdGFfY291bnQgOiBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQlpZiAoTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyIDwgY291bnQpIHsKKwkJCQljb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJCX0KKwkJCS8vQ29weSBkYXRhCisJCQlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQkJCWNvdW50ID0gYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCWlmIChjb3VudCA+IDApIHsKKwkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisKKwkJCQkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpICYmICFtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9TdG9waW5nLiBXaG9sZSBidWZmZXIgd2FzIGNvcGllZC4KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX1NXX1dSQVBfTU9ERSkgJiYgKChjdHJsICYgTUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLKSA9PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTKSkgewkvL1dyYXBhcm91bmQgKHNvZnR3YXJlKQorCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpIHsJLy9XZSBzdG9waW5nID0+IENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCQkJCQljb3VudCA9CisJCQkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgMCk7CisJCQkJfSBlbHNlIHsJLy9Db3B5IGluIHdyYXBhcm91bmQgbW9kZS4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKGluc3RhbmNlLAorCQkJCQkJCQkgICAgIGNvdW50LAorCQkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBwcmVsb2FkZWRfY291bnQpOworCQkJCX0KKworCQkJCWlmIChjb3VudCA+IDApIHsKKwkJCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY291bnQ7CisJCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgJT0KKwkJCQkJICAgIG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgICBjaXJjX2J1Zik7CisKKwkJCQkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKChjb3VudCA8PSAwKSB8fCAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpKSB7CS8vRW5kIG9mIHdvcmsuCisJCQkJYnJlYWs7CisJCQl9CisJCX0JCS8vUmVwZWF0IGlmIHN0aWxsIGlzIHVuZGVyIGhhbGYgZmlmbworCQl3aGlsZSAoKHN0YXR1cyA9CisJCQlpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKTsKKworCQkvL1VuYmxvY2sgaW50ZXJydXB0cworCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWlmIChjb3VudCA+PSAwKSB7CS8vQ29weSB3YXMgc3VjY2Vzc2Z1bC4KKwkJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDw9IGluc3RhbmNlLT5kYXRhX2NvdW50KSkgewkvL0ZpbmlzaGluZyB3b3JrLiBObyBtb3JlIGludGVycnVwdHMuCisJCQkJUERFQlVHKCJGaW5pc2hpbmcgd29yay4gSW50ZXJydXB0IGRpc2FibGVkLlxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisJCQl9IGVsc2UgaWYgKGNvdW50ID4gMCkgewkvL05vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LgorCQkJCVBERUJVRygiTm9ybWFsIHdvcmsuIEVuYWJsZSBpbnRlcnJ1cHQuXG4iKTsKKwkJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQl9IGVsc2UgewkvL05vcm1hbCB3b3JrIGJ1dCB0aGVyZSBhcmUgbm8gbW9yZSBkYXRhIGluIGJ1ZmZlci4gSW50ZXJydXB0IGFjdGl2ZSBidXQgYmxvY2tlZC4gc3RyZWFtX3dyaXRlKCkgd2lsbCB1bmJsb2NrIGl0LgorCQkJCVBERUJVRworCQkJCSAgICAoIk5vIGRhdGEgaW4gc29mdHdhcmUgYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC5cbiIpOworCQkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQl9CisJCX0gZWxzZSB7CS8vRXJyb3IgZHVyaW5nIGNvcHkuCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQl9CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9IGVsc2UgewkJLy8/PyBtb3JlIHRoYW4gaGFsZgorCQlQREVCVUcKKwkJICAgICgiSW50ZXJydXB0IGNvbWUgYnV0IEZJRk8gbW9yZSB0aGFuIGhhbGYgZnVsbCEgUmVzZXQgaW50ZXJydXB0LlxuIik7CisJCS8vUmVzZXQgcGVuZGluZyBpbnRlcnJ1cHQKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfQorCisJUElORk8oIklTUjogQnVmZmVyIGNvdW50OiAlZC4oVDolZCBIOiVkKVxuIiwKKwkgICAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZiksIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsLAorCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKTsKKwlQSU5GTygiSVNSOiBTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKwlQSU5GTygiSVNSOiBTdG9wIGRhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCk7CisJUElORk8oIklTUjogRGF0YSBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+ZGF0YV9jb3VudCk7CisKKwkvL0luZm9ybSB1c2VyCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtZTQ2MDBfYW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKworCS8vIFJlc2V0IHN1YmRldmljZSB0byBhc3VyZSBjbGVhbiBleGl0LgorCW1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2Uoc3ViZGV2aWNlLCBOVUxMLAorCQkJCSAgICAgTUVfSU9fUkVTRVRfU1VCREVWSUNFX05PX0ZMQUdTKTsKKworCS8vIFJlbW92ZSBhbnkgdGFza3MgZnJvbSB3b3JrIHF1ZXVlLiBUaGlzIGlzIHBhcmFub2ljIGJlY2F1c2UgaXQgd2FzIGRvbmUgYWxscmVhZHkgaW4gcmVzZXQoKS4KKwlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spKSB7CS8vV2FpdCAyIHRpY2tzIHRvIGJlIHN1cmUgdGhhdCBjb250cm9sIHRhc2sgaXMgcmVtb3ZlZCBmcm9tIHF1ZXVlLgorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDIpOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQlpZiAoaW5zdGFuY2UtPmlycSkgeworCQkJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPmlycSA9IDA7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZikgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpbnN0YW5jZS0+Y2lyY19idWYuYnVmLAorCQkJCSAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCittZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKm1lNDYwMF9hb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJICAgICB1aW50MzJfdCAqIHByZWxvYWRfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgZmlmbywKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd3EpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgYW9faWR4KTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLgorCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9hb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisKKwkvLyBTdG9yZSBhbmFsb2cgb3V0cHV0IGluZGV4LgorCXN1YmRldmljZS0+YW9faWR4ID0gYW9faWR4OworCisJLy8gU3RvcmUgaWYgYW5hbG9nIG91dHB1dCBoYXMgZmlmby4KKwlzdWJkZXZpY2UtPmZpZm8gPSAoYW9faWR4IDwgZmlmbykgPyAxIDogMDsKKworCWlmIChzdWJkZXZpY2UtPmZpZm8pIHsJLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY2lyY3VsYXIgYnVmZmVyLgorCQlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxOworCisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0KKwkJICAgICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkgICAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJUERFQlVHKCJjaXJjX2J1ZiA9ICVwIHNpemU9JWxkXG4iLCBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJICAgICAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFKTsKKworCQlpZiAoIXN1YmRldmljZS0+Y2lyY19idWYuYnVmKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZW1zZXQoc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsIDAsIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFKTsKKwl9IGVsc2UgewkJLy8gTm8gRklGTy4KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gMDsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKworCXN1YmRldmljZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCXN1YmRldmljZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJc3ViZGV2aWNlLT50aW1lb3V0LmRlbGF5ID0gMDsKKwlzdWJkZXZpY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvLyBJbml0aWFsaXplIHdhaXQgcXVldWUuCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8vIEluaXRpYWxpemUgc2luZ2xlIHZhbHVlIHRvIDBWLgorCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvLyBSZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorCWlmIChzdWJkZXZpY2UtPmZpZm8pIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJCWlmIChyZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU0NjAwX2FvX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCU1FNDYwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgICAgIFBBR0VfU0hJRlQgPDwgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIHN1YmRldmljZS0+aXJxKTsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmlycSA9IDA7CisJfQorCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMuCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+cHJlbG9hZF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT19TWU5DX1JFRzsKKwlpZiAoYW9faWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Yml0cGF0dGVybiA9IDA7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMSkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5iaXRwYXR0ZXJuID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAyKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAwOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDMpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Yml0cGF0dGVybiA9IDE7CisJfSBlbHNlIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBTVUJERVZJQ0UgaWR4PSVkISIsIGFvX2lkeCk7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWlmIChzdWJkZXZpY2UtPmZpZm8pIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQl9CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNDYwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU0NjAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZTQ2MDBfYW9fcXVlcnlfdGltZXI7CisKKwkvLyBQcmVwYXJlIHdvcmsgcXVldWUKKwlzdWJkZXZpY2UtPm1lNDYwMF93b3JrcXVldWUgPSBtZTQ2MDBfd3E7CisKKy8qIHdvcmtxdWV1ZSBBUEkgY2hhbmdlZCBpbiBrZXJuZWwgMi42LjIwICovCisjaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApICkKKwlJTklUX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLCBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2ssCisJCSAgKHZvaWQgKilzdWJkZXZpY2UpOworI2Vsc2UKKwlJTklUX0RFTEFZRURfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssCisJCQkgIG1lNDYwMF9hb193b3JrX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKworCWlmIChzdWJkZXZpY2UtPmZpZm8pIHsJLy8gU2V0IHNwZWVkIGZvciBzaW5nbGUgb3BlcmF0aW9ucy4KKwkJb3V0bChNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBzdWJkZXZpY2UtPnRpbWVyX3JlZyk7CisJCXN1YmRldmljZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKwl9CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCisvKiogQGJyaWVmIFN0b3AgcHJlc2VudGF0aW9uLiBQcmVzZXJ2ZSBGSUZPcy4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKi8KK2ludCBpbmxpbmUgYW9fc3RvcF9pbW1lZGlhdGVseShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCBjdHJsOworCWludCB0aW1lb3V0OworCWludCBpOworCisJdGltZW91dCA9CisJICAgIChpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA+CisJICAgICAoSFogLyAxMCkpID8gaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgOiBIWiAvIDEwOworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgfD0KKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCSAgICB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCWN0cmwgJj0KKwkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCWJyZWFrOworCQl9CisJCS8vU3RpbGwgd29ya2luZyEKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA+IHRpbWVvdXQpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KSBpbiB3cmFwYXJvdW5kLgorKiBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24uIENoZWNraW5nIGlzIGRvbmUgYXQgYmVnaW5pbmcgYW5kIGVuZCBvbmx5LgorKiBAbm90ZSBUaGUgaXMgbm90IHJlYXNvbmFibGUgd2F5IHRvIGNoZWNrIGhvdyBtYW55IHdhbHVlcyB3YXMgaW4gRklGTyBhdCBiZWdpbmluZy4gVGhlIGNvdW50IG11c3QgYmUgbWFuYWdlZCBleHRlcm5hbHkuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcGFyYW0gc3RhcnRfcG9zIFBvc2l0aW9uIG9mIHRoZSBmaXJzIHZhbHVlIGluIGJ1ZmZlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JTm8gZGF0YXMgd2VyZSBjb3BpZWQgPT4gbm8gZGF0YSBpbiBidWZmZXIuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChpIDwgbG9jYWxfY291bnQpIHsKKwkJLy9HZXQgdmFsdWUgZnJvbSBidWZmZXIKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQkvL1ByZXBhcmUgaXQKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisKKwkJcG9zKys7CisJCXBvcyAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJaWYgKHBvcyA9PSBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgeworCQkJcG9zID0gaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWw7CisJCX0KKwkJaSsrOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRkYpKSB7CS8vRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhCisJCVBFUlJPUigiRklGTyB3YXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkISBpZHg9JWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwl9IGVsc2UgewkJLy9BZGQgbGFzdCB2YWx1ZQorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCVBJTkZPKCJXUkFQQVJPVU5EIExPQURFRCAlZCB2YWx1ZXMuIGlkeD0lZFxuIiwgbG9jYWxfY291bnQsCisJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgbWF4X2NvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoIkZJRk8gd2FzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEgaWR4PSVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiRkFTVCBMT0FERUQgJWQgdmFsdWVzLiBpZHg9JWRcbiIsIGxvY2FsX2NvdW50LCBpbnN0YW5jZS0+YW9faWR4KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gc29mdHdhcmUgYnVmZmVyIHRvIGZpZm8gKHNsb3cpLgorKiBAbm90ZSBUaGlzIGlzIHNsb3cgZnVuY3Rpb24gdGhhdCBjb3B5IGFsbCBkYXRhIGZyb20gYnVmZmVyIHRvIEZJRk8gd2l0aCBmdWxsIGNvbnRyb2wuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcGFyYW0gc3RhcnRfcG9zIFBvc2l0aW9uIG9mIHRoZSBmaXJzIHZhbHVlIGluIGJ1ZmZlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglGSUZPIHdhcyBmdWxsIGF0IGJlZ2luaW5nLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fUklOR19CVUZGRVJfVU5ERUZGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV9wb29saW5nKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHNsb3cgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IGk7CisJaW50IG1heF9jb3VudDsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCVBFUlJPUigiU0xPVyBMT0FERUQ6IFdyb25nIGNvdW50ISBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwltYXhfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgLSBzdGFydF9wb3M7CisJaWYgKG1heF9jb3VudCA8PSAwKSB7CS8vTm8gZGF0YSB0byBjb3B5IQorCQlQRVJST1IoIlNMT1cgTE9BREVEOiBObyBkYXRhIHRvIGNvcHkhIGlkeD0lZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF4X2NvdW50IDwgY291bnQpIHsKKwkJbG9jYWxfY291bnQgPSBtYXhfY291bnQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxvY2FsX2NvdW50OyBpKyspIHsKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRkYpKSB7CS8vRklGTyBpcyBmdWxsIQorCQkJcmV0dXJuIGk7CisJCX0KKwkJLy9HZXQgdmFsdWUgZnJvbSBidWZmZXIKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQkvL1ByZXBhcmUgaXQKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisKKwkJcG9zKys7CisJCXBvcyAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisKKwlQSU5GTygiU0xPVyBMT0FERUQgJWQgdmFsdWVzLiBpZHg9JWRcbiIsIGxvY2FsX2NvdW50LCBpbnN0YW5jZS0+YW9faWR4KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBjaXJjdWxhciBidWZmZXIuCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE51bWJlciBvZiBkYXRhcyBpbiB1c2VyIHNwYWNlLgorKiBAcGFyYW0gdXNlcl92YWx1ZXMgQnVmZmVyJ3MgcG9pbnRlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0lOVEVSTkFMLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpCit7CisJaW50IGksIGVycjsKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZDsKKwlpbnQgdmFsdWU7CisKKwllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCS8vV2UgaGF2ZSBvbmx5IHRoaXMgc3BhY2UgZnJlZS4KKwljb3BpZWQgPSAoY291bnQgPCBlbXB0eV9zcGFjZSkgPyBjb3VudCA6IGVtcHR5X3NwYWNlOworCWZvciAoaSA9IDA7IGkgPCBjb3BpZWQ7IGkrKykgewkvL0NvcHkgZnJvbSB1c2VyIHRvIGJ1ZmZlcgorCQlpZiAoKGVyciA9IGdldF91c2VyKHZhbHVlLCAoaW50ICopKHVzZXJfdmFsdWVzICsgaSkpKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJCVUZGRVIgTE9BREVEOiBnZXRfdXNlcigweCVwKSByZXR1cm4gYW4gZXJyb3I6ICVkLiBpZHg9JWRcbiIsCisJCQkgICAgIHVzZXJfdmFsdWVzICsgaSwgZXJyLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCXJldHVybiAtTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwkJLy8vIEBub3RlIFRoZSBhbmFsb2cgb3V0cHV0IGluIG1lNDYwMCBzZXJpZXMgaGFzIHNpemUgb2YgMTYgYml0cy4KKwkJKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpID0KKwkJICAgICh1aW50MTZfdCkgdmFsdWU7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKworCVBJTkZPKCJCVUZGRVIgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBjb3BpZWQsIGluc3RhbmNlLT5hb19pZHgpOworCXJldHVybiBjb3BpZWQ7Cit9CisKKy8qKiBAYnJpZWYgQ2hlY2tpbmcgYWN0dWFsIGhhcmR3YXJlIGFuZCBsb2dpY2FsIHN0YXRlLgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworc3RhdGljIHZvaWQgbWU0NjAwX2FvX3dvcmtfY29udHJvbF90YXNrKAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwkJCQkJICAgICAgIHZvaWQgKnN1YmRldmljZQorI2Vsc2UKKwkJCQkJICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaworI2VuZGlmCisgICAgKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCByZXNjaGVkdWxlID0gMDsKKwlpbnQgc2lnbmFsaW5nID0gMDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworI2Vsc2UKKwlpbnN0YW5jZSA9CisJICAgIGNvbnRhaW5lcl9vZigodm9pZCAqKXdvcmssIG1lNDYwMF9hb19zdWJkZXZpY2VfdCwgYW9fY29udHJvbF90YXNrKTsKKyNlbmRpZgorCVBJTkZPKCI8JXM6ICVsZD4gZXhlY3V0ZWQuIGlkeD0lZFxuIiwgX19GVU5DVElPTl9fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKworCQkvLyBOb3QgY29uZmlndXJlZCBmb3Igd29yay4KKwljYXNlIGFvX3N0YXR1c19ub25lOgorCQlicmVhazsKKworCQkvL1RoaXMgYXJlIHN0YWJsZSBtb2Rlcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKD8pCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBFUlJPUigiU2hvdWxkbid0IGJlIHJ1bm5pbmchLlxuIik7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZyBidXQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gZW5kLiBGb3JjZSBzdG9wLgorCisJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJcmVzY2hlZHVsZSA9IDE7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUAorCQkgICAgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJY3RybCAmPQorCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlicmVhazsKKworCQkvLyBTaW5nbGUgbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJaWYgKCgoaW5zdGFuY2UtPmZpZm8pCisJCQkgICAgICYmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkpCisJCQkgICAgfHwgKCEoaW5zdGFuY2UtPmZpZm8pKSkgewkvLyBTaW5nbGUgaXMgaW4gZW5kIHN0YXRlLgorCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIENoZWNrIHRpbWVvdXQuCisJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJLy8vIEZpeCBmb3IgdGltZW91dCBlcnJvci4KKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvL0Rpc2FibGluZyBGSUZPCisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJfQorCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzeW5jaCAmPQorCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJaWYgKCEoaW5zdGFuY2UtPmZpZm8pKSB7CS8vIE5vIEZJRk8gLSBzZXQgdG8gc2luZ2xlIHNhZmUgbW9kZQorCQkJCXN5bmNoIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCX0KKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY2gpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQlpZiAoIShpbnN0YW5jZS0+ZmlmbykpIHsJLy8gTm8gRklGTworCQkJCS8vIFJlc3RvcmUgb2xkIHNldHRpbmdzLgorCQkJCVBERUJVRygiV3JpdGUgb2xkIHZhbHVlIGJhY2sgdG8gcmVnaXN0ZXIuXG4iKTsKKwkJCQlvdXRsKGluc3RhbmNlLT5zaW5nbGVfdmFsdWUsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSk7CisJCQl9CisJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0YXJ0IGZpbmlzaC4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bjsKKworCQkJLy8gU2lnbmFsIGVuZCBvZiB0aGlzIHN0ZXAKKwkJCXNpZ25hbGluZyA9IDE7CisJCX0gZWxzZSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy8gRklGTyBpcyBlbXB0eS4gUHJvY2VkdXJlIGhhcyBzdGFydGVkIGFuZCBmaW5pc2ggYWxyZWFkeSEKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBDaGVjayB0aW1lb3V0LgorCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXN5bmNoICY9CisJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNoKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFRoaXMgaXMgYW4gZXJyb3IuCisJCQkvLyBCUk9LRU4gUElQRSEKKwkJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSB7CS8vRmluaXNoaW5nIHdvcmsuIFJlcXVlZCBkYXRhIHNob3duLgorCQkJCQkJUERFQlVHCisJCQkJCQkgICAgKCJJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCQl9IGVsc2UgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisJCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkJCSAgICBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBUaGVyZSBhcmUgc3RpbGwgZGF0YXMgaW4gRklGTy4KKwkJCQlpZiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZCBidXQgc29tZSBkYXRhIGluIEZJRk8gYW5kIGJ1ZmZlci5cbiIpOworCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJfQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisKKwkJCX0KKworCQkJLy8gU2lnbmFsIHRoZSBmYWlsdXJlLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0b3AgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKK30KKyNlbHNlCisvLy8gQG5vdGUgU1BFQ0lBTCBCVUlMRCBGT1IgQk9TQ0gKKy8vLyBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgOworCisJb3V0bChNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCwKKwkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJaWYgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCWlmIChzaW5nbGVfY29uZmlnID09IDApIHsKKwkJCWlmIChyZWYgPT0gTUVfUkVGX0FPX0dST1VORCkgeworCQkJCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJCQkJaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCQkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdG1wIHw9CisJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl0bXAgPQorCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCQl0bXAgPQorCQkJCQkJICAgIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJdG1wICY9CisJCQkJCQkgICAgfigweDEwMDAxIDw8IGluc3RhbmNlLT4KKwkJCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIGlmICh0cmlnX3R5cGUgPT0KKwkJCQkJCSAgIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJCQkJaWYgKHRyaWdfZWRnZSA9PQorCQkJCQkJICAgIE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCQkJCQljdHJsX3JlZyk7CisJCQkJCQkJdG1wIHw9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PQorCQkJCQkJCSAgIE1FX1RSSUdfRURHRV9GQUxMSU5HKQorCQkJCQkJeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRworCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PQorCQkJCQkJCSAgIE1FX1RSSUdfRURHRV9BTlkpIHsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCQkJCQljdHJsX3JlZyk7CisJCQkJCQkJdG1wIHw9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS5cbiIpOworCQkJCQkJCWVyciA9CisJCQkJCQkJICAgIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisKKwkJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICBwcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCXRtcCAmPQorCQkJCQkJICAgIH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+CisJCQkJCQkgICAgICBhb19pZHgpOworCQkJCQkJdG1wIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgICAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLlxuIik7CisJCQkJCQllcnIgPQorCQkJCQkJICAgIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAodHJpZ19jaGFuID09CisJCQkJCSAgIE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykgeworCQkJCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgJj0KKwkJCQkJCSAgICB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPgorCQkJCQkJICAgICAgYW9faWR4KTsKKwkJCQkJCXRtcCB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCQkJCW91dGwodG1wLAorCQkJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHw9CisJCQkJCQkgICAgMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICAgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PQorCQkJCQkJICAgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQkJCQlpZiAodHJpZ19lZGdlID09CisJCQkJCQkgICAgTUVfVFJJR19FREdFX1JJU0lORykgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0ZBTExJTkcpCisJCQkJCQl7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0FOWSkgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJCQkJZXJyID0KKwkJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCisJCQkJCQl0bXAgPQorCQkJCQkJICAgIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJdG1wIHw9CisJCQkJCQkgICAgMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgICAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLlxuIik7CisJCQkJCQllcnIgPQorCQkJCQkJICAgIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYW5hbG9nIHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNpbmdsZSBjb25maWcgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQlnb3RvIEVSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAodG1wICYgMHgzKSB7CisJCVBFUlJPUigiTm90IGluIHNpbmdsZSBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9IGVsc2UgeworCQkqdmFsdWUgPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgaTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAodG1wICYgMHgzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJUEVSUk9SKCJOb3QgaW4gc2luZ2xlIG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICh0bXAgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpIHsKKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCQlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQkJaiA9IGppZmZpZXM7CisKKwkJCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnF1ZXVlLCAxKTsKKworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaWYgKGRlbGF5ICYmICgoamlmZmllcyAtIGopID4gZGVsYXkpKSB7CisJCQkJCVBFUlJPUigiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkKKwkJICAgPT0gKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsKKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IHZhbHVlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCEoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKwkJCQlqID0gamlmZmllczsKKworCQkJCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkgICAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CisJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcXVldWUsCisJCQkJCQkJCSAgICAgICAxKTsKKworCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCisJCQkJCWlmIChkZWxheSAmJiAoKGppZmZpZXMgLSBqKSA+IGRlbGF5KSkgeworCQkJCQkJUEVSUk9SKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IHZhbHVlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpCisJCSAgID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsKKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisKKwkJUERFQlVHKCJTeW5jaHJvbm91cyBTVywgZmxhZ3MgPSAweCVYLlxuIiwgZmxhZ3MpOworCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCVBERUJVRygiVHJpZ2dlciBzeW5jaHJvbm91cyBTVy5cbiIpOworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0FPX01BWF9TVUJERVZJQ0VTOyBpKyspIHsKKwkJCQlpZiAoKCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmICgweDEgPDwgaSkpKSB7CisJCQkJCWlmICgodG1wICYgKDB4MTAwMDEgPDwgaSkpID09CisJCQkJCSAgICAoMHgxIDw8IGkpKSB7CisJCQkJCQltYXNrIHw9IDB4MSA8PCBpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQl0bXAgJj0gfihtYXNrKTsKKworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIHsKKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjdHJsOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NIaWdoOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGJ1c3kuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCWdvdG8gRVJST1I7CisJfQorCisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsID0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdHJlYW0gY29uZmlndXJhdGlvbiBsaXN0IGNvdW50IHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pU3RyZWFtQ29uZmlnICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0cmVhbSBjb25maWcgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgIT0gMCkKKwkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCAhPSAwKSkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJCWdvdG8gRVJST1I7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQljdHJsIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCisJCQlnb3RvIEVSUk9SOworCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisKKwkJZ290byBFUlJPUjsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfRk9MTE9XOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX1RJTUVSOgorCQlpZiAoKGNvbnZfdGlja3MgPCBNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpCisJCSAgICB8fCAoY29udl90aWNrcyA+IE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUykpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfQVJHOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisKKwkJZ290byBFUlJPUjsKKworCQlicmVhazsKKwl9CisKKwkvKiBQcmVzZXQgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlICovCisJaW5zdGFuY2UtPmZsYWdzICY9IH4oTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKTsKKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkY7CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IDA7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSAwOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCS8qIFNldCBmbGFncyB0byBpbmRpY2F0ZSB1c2FnZSBvZiBzb2Z0d2FyZSBtb2RlLiAqLworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOOworCQkJaW5zdGFuY2UtPndyYXBfY291bnQgPSB0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfTk9ORToKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIGNvdW50IHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCS8qIFNldCBmbGFncyB0byBpbmRpY2F0ZSB1c2FnZSBvZiBzb2Z0d2FyZSBtb2RlLiAqLworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOOworCQkJaW5zdGFuY2UtPndyYXBfY291bnQgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gdHJpZ2dlci0+aUFjcVN0b3BDb3VudDsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Agc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdDaGFuKSB7CisKKwljYXNlIE1FX1RSSUdfQ0hBTl9ERUZBVUxUOgorCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJdG1wICY9IH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJdG1wICY9IH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJdG1wIHw9IDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOOworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCW91dGwoY29udl90aWNrcyAtIDIsIGluc3RhbmNlLT50aW1lcl9yZWcpOworCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19CSVRfUEFUVEVSTikgeworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCA9PSAzKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRE87CisJCX0gZWxzZSB7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBFUlJPUjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ID09IDMpIHsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRE87CisJCX0KKwl9CisKKwkvKiBTZXQgaGFyZHdhcmUgbW9kZS4gKi8KKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8wOworCX0gZWxzZSB7CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMTsKKwl9CisKKwlQREVCVUcoIlByZWxvYWQgd29yZCA9IDB4JVguXG4iLCBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSk7CisKKwlQREVCVUcoIkN0cmwgd29yZCA9IDB4JWxYLlxuIiwgY3RybCk7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOwkvLyBXcml0ZSB0aGUgY29udHJvbCB3b3JkCisKKyAgICAgIEVSUk9SOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCWxvbmcgajsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJKmNvdW50ID0gMDsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh0KSB7CisJCWogPSBqaWZmaWVzOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKG1lX2NpcmNfYnVmX3NwYWNlCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSwKKwkJCQkJCSB0KTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gaikgPj0gdCkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyB0aW1lZCBvdXQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0gZWxzZSB7CisJCQkqY291bnQgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJfQorCX0gZWxzZSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJICAgKCZpbnN0YW5jZS0+Y2lyY19idWYpKQorCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBFUlJPUigiQU8gc3ViZGV2aWNlIGlzIG5vdCBydW5uaW5nLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIHsKKwkJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2ltbWVkaWF0ZWx5KG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IHRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlzd2l0Y2ggKHRtcCAmIChNRTQ2MDBfQU9fQ1RSTF9NQVNLX01PREUpKSB7CisKKwljYXNlIDA6CQkvLyBTaW5nbGUgbW9kZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQgaW4gc2luZ2xlIG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQlnb3RvIEVSUk9SOworCisJY2FzZSAxOgkJLy8gV3JhcGFyb3VuZCBtb2RlCisJCWlmICh0bXAgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpIHsJLy8gTm9ybWFsIHdyYXBhcm91bmQgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsKKwkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwkJCQlpZiAoZGVsYXkpIHsKKwkJCQkJcmVmID0gamlmZmllczsKKworCQkJCQl3aGlsZSAoIQorCQkJCQkgICAgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKworCQkJCQkJaWYgKCgoamlmZmllcyAtIHJlZikgPj0gZGVsYXkpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlICghCisJCQkJCSAgICAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHN0YXJ0IG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEwMDAwIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFN5bmNocm9ub3VzIHdpdGggZXh0ZXJuYWwgdHJpZ2dlcgorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJCXRtcCAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsKKwkJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJCWlmIChkZWxheSkgeworCQkJCQkJcmVmID0gamlmZmllczsKKworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCgoamlmZmllcyAtIHJlZikgPj0KKwkJCQkJCQkgICAgIGRlbGF5KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXdoaWxlICghCisJCQkJCQkgICAgICAgKGlubAorCQkJCQkJCShpbnN0YW5jZS0+CisJCQkJCQkJIHN0YXR1c19yZWcpICYKKwkJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKQorCQkJCQkJeworCQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJCWlmIChzaWduYWxfcGVuZGluZworCQkJCQkJCSAgICAoY3VycmVudCkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PQorCQkJCQkgICBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKChpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSAmICgweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpKSA9PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFN5bmNocm9ub3VzIHdyYXBhcm91bmQgd2l0aCBzdyB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfSBlbHNlIHsJLy8gU29mdHdhcmUgc3RhcnQKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSAyOgkJLy8gQ29udGludW91cyBtb2RlCisJCWlmICh0bXAgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpIHsJLy8gRXh0ZXJuYWxseSB0cmlnZ2VyZWQKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IGluc3RhbmNlLT53cmFwX2NvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCQkJCWlmIChkZWxheSkgeworCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCXdoaWxlICghCisJCQkJCSAgICAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykgeworCQkJCS8qIERvIG5vdGhpbmcgKi8KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHN0YXJ0IG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCQkJc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEwMDAwIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFN5bmNocm9ub3VzIHdpdGggZXh0ZXJuYWwgdHJpZ2dlcgorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCQl0bXAgfD0KKwkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHIHwKKwkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCQlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CisJCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCQkJCQlpZiAoZGVsYXkpIHsKKwkJCQkJCXJlZiA9IGppZmZpZXM7CisKKwkJCQkJCXdoaWxlICghCisJCQkJCQkgICAgICAgKGlubAorCQkJCQkJCShpbnN0YW5jZS0+CisJCQkJCQkJIHN0YXR1c19yZWcpICYKKwkJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKQorCQkJCQkJeworCQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJCWlmIChzaWduYWxfcGVuZGluZworCQkJCQkJCSAgICAoY3VycmVudCkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKworCQkJCQkJCWlmICgoKGppZmZpZXMgLSByZWYpID49CisJCQkJCQkJICAgICBkZWxheSkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQl3aGlsZSAoIQorCQkJCQkJICAgICAgIChpbmwKKwkJCQkJCQkoaW5zdGFuY2UtPgorCQkJCQkJCSBzdGF0dXNfcmVnKSAmCisJCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcKKwkJCQkJCQkgICAgKGN1cnJlbnQpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHN0YXJ0X21vZGUgPT0KKwkJCQkJICAgTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykgeworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHN0YXJ0IG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCQkJCXN0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKChpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSAmICgweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpKSA9PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFN5bmNocm9ub3VzIHdyYXBhcm91bmQgd2l0aCBzdyB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlQREVCVUcoIkNUUkwgUmVnID0gMHglWC5cbiIsIGlubChpbnN0YW5jZS0+Y3RybF9yZWcpKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBzdGFydAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IGluc3RhbmNlLT53cmFwX2NvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIkludmFsaWQgbW9kZSBjb25maWd1cmVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQlnb3RvIEVSUk9SOworCX0KKworICAgICAgRVJST1I6CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAod2FpdCA9PSBNRV9XQUlUX05PTkUpIHsKKwkJKnN0YXR1cyA9CisJCSAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgPworCQkgICAgTUVfU1RBVFVTX0JVU1kgOiBNRV9TVEFUVVNfSURMRTsKKwkJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSBpZiAod2FpdCA9PSBNRV9XQUlUX0lETEUpIHsKKwkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcXVldWUsIDEpOworCisJCQlpZiAoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFKSB7CisJCQkJUEVSUk9SKCJPdXRwdXQgc3RyZWFtIHdhcyBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCSpzdGF0dXMgPSBNRV9TVEFUVVNfRVJST1I7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJKnN0YXR1cyA9IE1FX1NUQVRVU19JTlZBTElEOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9CisKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCisJCSp2YWx1ZXMgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgd2FpdCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JTlZBTElEOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1dBSVQ7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0gZWxzZSBpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1NUT1A7CisJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVE9QX01PREU7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGk7CisJaW50IHZhbHVlOworCWludCBjbnQgPSAqY291bnQ7CisJaW50IGM7CisJaW50IGs7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKCpjb3VudCA8PSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb3VudCBvZiB2YWx1ZXMgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoICh0bXAgJiAweDMpIHsKKworCWNhc2UgMToJCS8vIFdyYXBhcm91bmQgbW9kZQorCQlpZiAoaW5zdGFuY2UtPmJvc2NoX2Z3KSB7CS8vIEJvc2NoIGZpcm13YXJlCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY250ICE9IDcpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuIDcgZXhwZWN0ZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcykpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWlmIChpID09IDApIHsKKwkJCQkJLyogTWF4aW11bSB2b2x0YWdlICovCisJCQkJCXZhbHVlIDw8PSAxNjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhENCkgJiAweEZGRkY7CisJCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5yZWdfYmFzZSArIDB4RDQpOworCQkJCX0gZWxzZSBpZiAoaSA9PSAxKSB7CisJCQkJCS8qIE1pbmltdW0gdm9sdGFnZSAqLworCQkJCQl2YWx1ZSAmPSAweEZGRkY7CisJCQkJCXZhbHVlIHw9CisJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnJlZ19iYXNlICsKKwkJCQkJCTB4RDQpICYgMHhGRkZGMDAwMDsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhENCk7CisJCQkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCQkJLyogRGVsdGEgdXAgKi8KKwkJCQkJdmFsdWUgPDw9IDE2OworCQkJCQl2YWx1ZSB8PQorCQkJCQkgICAgaW5sKGluc3RhbmNlLT5yZWdfYmFzZSArCisJCQkJCQkweEQ4KSAmIDB4RkZGRjsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhEOCk7CisJCQkJfSBlbHNlIGlmIChpID09IDMpIHsKKwkJCQkJLyogRGVsdGEgZG93biAqLworCQkJCQl2YWx1ZSAmPSAweEZGRkY7CisJCQkJCXZhbHVlIHw9CisJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnJlZ19iYXNlICsKKwkJCQkJCTB4RDgpICYgMHhGRkZGMDAwMDsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhEOCk7CisJCQkJfSBlbHNlIGlmIChpID09IDQpIHsKKwkJCQkJLyogU3RhcnQgdmFsdWUgKi8KKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhEQyk7CisJCQkJfSBlbHNlIGlmIChpID09IDUpIHsKKwkJCQkJLyogSW52ZXJ0ICovCisJCQkJCWlmICh2YWx1ZSkgeworCQkJCQkJdmFsdWUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXZhbHVlIHw9IDB4MTAwOworCQkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZhbHVlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl2YWx1ZSAmPSB+MHgxMDA7CisJCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChpID09IDYpIHsKKwkJCQkJLyogVGltZXIgZm9yIHBvc2l0aXZlIHJhbXAgKi8KKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhFMCk7CisJCQkJfQorCisJCQkJdmFsdWVzKys7CisJCQl9CisJCX0gZWxzZSB7CS8vIE5vcm1hbCBmaXJtd2FyZQorCQkJUERFQlVHKCJXcml0ZSBmb3Igd3JhcGFyb3VuZCBtb2RlLlxuIik7CisKKwkJCWlmIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUaGVyZSBpcyBhbHJlYWR5IGEgY29udmVyc2lvbiBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCisJCQlpZiAoKCpjb3VudCA+IE1FNDYwMF9BT19GSUZPX0NPVU5UKSB8fAorCQkJICAgICgoaW5zdGFuY2UtPgorCQkJICAgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spID09CisJCQkgICAgIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOKSkgeworCQkJCXRtcCAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzEpOworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8xOworCQkJfQorCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmICgoKmNvdW50IDw9IE1FNDYwMF9BT19GSUZPX0NPVU5UKSAmJgorCQkJICAgICgoaW5zdGFuY2UtPgorCQkJICAgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spID09CisJCQkgICAgIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfSU5GKSkgeworCQkJCWZvciAoaSA9IDA7IGkgPCAqY291bnQ7IGkrKykgeworCQkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcyArIGkpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkNhbm5vdCBjb3B5IHZhbHVlIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisKKwkJCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpCisJCQkJCQl2YWx1ZSA8PD0gMTY7CisKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCgqY291bnQgPD0gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UKSAmJgorCQkJCSAgICgoaW5zdGFuY2UtPgorCQkJCSAgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spCisJCQkJICAgID09IE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfSU5GKSkgeworCQkJCWZvciAoaSA9IDA7IGkgPCAqY291bnQ7IGkrKykgeworCQkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcyArIGkpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkNhbm5vdCBjb3B5IHZhbHVlIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisKKwkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZltpXSA9IHZhbHVlOwkvKiBVc2VkIHRvIGhvbGQgdGhlIHZhbHVlcy4gKi8KKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CS8qIFVzZWQgYXMgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi4gKi8KKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9ICpjb3VudDsJLyogVXNlZCBhcyB0aGUgYnVmZmVyIHNpemUuICovCisKKwkJCQkvKiBQcmVsb2FkIHRoZSBGSUZPLiAqLworCisJCQkJZm9yIChpID0gMDsgaSA8IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCQkJCSAgICAgaSsrLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrKSB7CisJCQkJCWlmIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA+PQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCisJCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkJCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpCisJCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCQkgdGFpbF0gPDwgMTYsCisJCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJCWVsc2UKKwkJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJCSB0YWlsXSwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCgqY291bnQgPD0gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UKSAmJgorCQkJCSAgICgoaW5zdGFuY2UtPgorCQkJCSAgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spCisJCQkJICAgID09IE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOKSkgeworCQkJCXVuc2lnbmVkIGludCBwcmVsb2FkX2NvdW50OworCisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYuYnVmW2ldID0gdmFsdWU7CS8qIFVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzLiAqLworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsJLyogVXNlZCBhcyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLiAqLworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gKmNvdW50OwkvKiBVc2VkIGFzIHRoZSBidWZmZXIgc2l6ZS4gKi8KKworCQkJCS8qIFRyeSB0byBwcmVsb2FkIHRoZSB3aG9sZSBGSUZPLiAqLworCQkJCXByZWxvYWRfY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVDsKKworCQkJCWlmIChwcmVsb2FkX2NvdW50ID4gaW5zdGFuY2UtPndyYXBfY291bnQpCisJCQkJCXByZWxvYWRfY291bnQgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKworCQkJCS8qIFByZWxvYWQgdGhlIEZJRk8uICovCisJCQkJZm9yIChpID0gMDsgaSA8IHByZWxvYWRfY291bnQ7CisJCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyspIHsKKwkJCQkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID49CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkKKwkJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJCSB0YWlsXSA8PCAxNiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQkJZWxzZQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdLAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKworCQkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9CisJCQkJICAgIGluc3RhbmNlLT53cmFwX2NvdW50IC0gcHJlbG9hZF9jb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJUbyBtYW55IHZhbHVlcyB3cml0dGVuLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyBDb250aW51b3VzIG1vZGUKKwkJLyogQ2hlY2sgaWYgaW4gU1cgd3JhcHJvdW5kIG1vZGUgKi8KKwkJaWYgKGluc3RhbmNlLT5mbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQgU1cgd3JhcHJvdW5kIG1vZGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlzd2l0Y2ggKHdyaXRlX21vZGUpIHsKKworCQljYXNlIE1FX1dSSVRFX01PREVfQkxPQ0tJTkc6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlQREVCVUcoIldyaXRlIGZvciBibG9ja2luZyBjb250aW51b3VzIG1vZGUuXG4iKTsKKworCQkJd2hpbGUgKGNudCA+IDApIHsKKwkJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkJIChjID0KKwkJCQkJCQkgIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZAorCQkJCQkJCSAgKCZpbnN0YW5jZS0+CisJCQkJCQkJICAgY2lyY19idWYpKSk7CisKKwkJCQlpZiAoaW5zdGFuY2UtPgorCQkJCSAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQnJva2VuIHBpcGUgaW4gYmxvY2tpbmcgd3JpdGUuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIldhaXQgZm9yIGZyZWUgYnVmZmVyIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlQREVCVUcoIlNwYWNlIHRvIGVuZCA9ICVkLlxuIiwgYyk7CisKKwkJCQkvKiBPbmx5IGFibGUgdG8gd3JpdGUgc2l6ZSBvZiBmcmVlIGJ1ZmZlciBvciBzaXplIG9mIGNvdW50ICovCisKKwkJCQlpZiAoY250IDwgYykKKwkJCQkJYyA9IGNudDsKKwkJCQlrID0gc2l6ZW9mKGludCkgKiBjOworCQkJCWsgLT0gY29weV9mcm9tX3VzZXIoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArCisJCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQsCisJCQkJCQkgICAgdmFsdWVzLCBrKTsKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJDb3B5ICVkIHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iLCBjKTsKKworCQkJCWlmICghYykgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKworCQkJCS8qIFZhbHVlcyBhcmUgbm93IGF2YWlsYWJsZSBzbyBlbmFibGUgaW50ZXJydXB0cyAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisKKwkJCQlpZiAobWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsKKwkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisKKwkJCSpjb3VudCA9IHJldDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HOgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJUERFQlVHKCJXcml0ZSBmb3Igbm9uIGJsb2NraW5nIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCWlmIChpbnN0YW5jZS0+CisJCQkJICAgIGZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJNRTQ2MDA6QnJva2VuIHBpcGUgaW4gbm9uYmxvY2tpbmcgd3JpdGUuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWMgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGNpcmNfYnVmKTsKKworCQkJCWlmICghYykgeworCQkJCQlQREVCVUcKKwkJCQkJICAgICgiUmV0dXJuaW5nIGZyb20gbm9uYmxvY2tpbmcgd3JpdGUuXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJUERFQlVHKCJTcGFjZSB0byBlbmQgPSAlZC5cbiIsIGMpOworCisJCQkJLyogT25seSBhYmxlIHRvIHdyaXRlIHNpemUgb2YgZnJlZSBidWZmZXIgb3Igc2l6ZSBvZiBjb3VudCAqLworCisJCQkJaWYgKGNudCA8IGMpCisJCQkJCWMgPSBjbnQ7CisJCQkJayA9IHNpemVvZihpbnQpICogYzsKKwkJCQlrIC09IGNvcHlfZnJvbV91c2VyKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkLAorCQkJCQkJICAgIHZhbHVlcywgayk7CisJCQkJYyA9IGsgLyBzaXplb2YoaW50KTsKKworCQkJCVBERUJVRygiQ29weSAlZCB2YWx1ZXMgZnJvbSB1c2VyIHNwYWNlLlxuIiwgYyk7CisKKwkJCQlpZiAoIWMpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbm5vdCBjb3B5IHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPQorCQkJCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgKworCQkJCSAgICAgYykgJiAoaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2spOworCisJCQkJdmFsdWVzICs9IGM7CisJCQkJY250IC09IGM7CisJCQkJcmV0ICs9IGM7CisKKwkJCQkvKiBWYWx1ZXMgYXJlIG5vdyBhdmFpbGFibGUgc28gZW5hYmxlIGludGVycnVwdHMgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkJICBjcHVfZmxhZ3MpOworCisJCQkJaWYgKG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CisJCQkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCX0KKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJfQorCisJCQkqY291bnQgPSByZXQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfV1JJVEVfTU9ERV9QUkVMT0FEOgorCQkJUERFQlVHKCJXcml0ZSBmb3IgcHJlbG9hZCBjb250aW51b3VzIG1vZGUuXG4iKTsKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUgorCQkJCSAgICAoIkNhbid0IFByZWxvYWQgREFDIEZJRk8gd2hpbGUgY29udmVyc2lvbiBpcyBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCXRtcCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlpbnN0YW5jZS0+ZmxhZ3MgJj0gfk1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJYyA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCisJCQlpZiAoY250IDwgYykKKwkJCQljID0gY250OworCisJCQlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7CisJCQkJaWYgKGdldF91c2VyKHZhbHVlLCB2YWx1ZXMpKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJDYW4ndCBjb3B5IHZhbHVlIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJdmFsdWUgPDw9IDE2OworCisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKworCQkJCXZhbHVlcysrOworCQkJfQorCisJCQljbnQgLT0gYzsKKworCQkJcmV0ICs9IGM7CisKKwkJCVBERUJVRygiV3JvdGUgJWQgdmFsdWVzIHRvIGZpZm8uXG4iLCBjKTsKKworCQkJd2hpbGUgKDEpIHsKKwkJCQljID0gbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kKCZpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjaXJjX2J1Zik7CisKKwkJCQlpZiAoYyA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWlmIChjbnQgPCBjKQorCQkJCQljID0gY250OworCisJCQkJaWYgKGMgPD0gMCkKKwkJCQkJYnJlYWs7CisKKwkJCQlrID0gc2l6ZW9mKGludCkgKiBjOworCisJCQkJayAtPSBjb3B5X2Zyb21fdXNlcihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCwKKwkJCQkJCSAgICB2YWx1ZXMsIGspOworCisJCQkJYyA9IGsgLyBzaXplb2YoaW50KTsKKworCQkJCVBERUJVRygiV3JvdGUgJWQgdmFsdWVzIHRvIGNpcmN1bGFyIGJ1ZmZlci5cbiIsCisJCQkJICAgICAgIGMpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJDYW4ndCBjb3B5IHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPQorCQkJCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgKworCQkJCSAgICAgYykgJiAoaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2spOworCisJCQkJdmFsdWVzICs9IGM7CisJCQkJY250IC09IGM7CisJCQkJcmV0ICs9IGM7CisJCQl9CisKKwkJCSpjb3VudCA9IHJldDsKKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCVBFUlJPUigiSW52YWxpZCB3cml0ZSBtb2RlIHNwZWNpZmllZC5cbiIpOworCisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBTaW5nbGUgbW9kZSBvZiBpbnZhbGlkCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHZhbHVlOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJaW50IGk7CisJaW50IGMgPSAwOworCWludCBjMSA9IDA7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUERFQlVHKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCEoKDB4MSA8PCAoaW5zdGFuY2UtPmFvX2lkeCArIDMpKSAmIGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpKSkgeworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKworCWlmICghKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSAmJgorCSAgICAodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpICYmCisJICAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsKKwkJYyA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCQlQREVCVUcoIkZpZm8gZW1wdHkuXG4iKTsKKwl9IGVsc2UgaWYgKCh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRikgJiYKKwkJICAgKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSAmJgorCQkgICAodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CisJCWMgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCVBERUJVRygiRmlmbyB1bmRlciBoYWxmIGZ1bGwuXG4iKTsKKwl9IGVsc2UgeworCQljID0gMDsKKwkJUERFQlVHKCJGaWZvIGZ1bGwuXG4iKTsKKwl9CisKKwlQREVCVUcoIlRyeSB0byB3cml0ZSAweCUwNFggdmFsdWVzLlxuIiwgYyk7CisKKwlpZiAoKGluc3RhbmNlLT5mbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpIHsKKwkJd2hpbGUgKGMpIHsKKwkJCWMxID0gYzsKKworCQkJaWYgKGMxID4gKGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkIC0gaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpKQkvKiBPbmx5IHVwIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCQkJCWMxID0gKGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkIC0KKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCk7CisKKwkJCS8qIFdyaXRlIHRoZSB2YWx1ZXMgdG8gdGhlIEZJRk8gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjMTsgaSsrLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrLCBjLS0pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSA8PCAxNiwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCWVsc2UKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCS8qIFN0YXJ0IGZyb20gYmVnaW5uaW5nICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBFUlJPUigiQnJva2VuIHBpcGUuXG4iKTsKKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEU7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0KKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwl9IGVsc2UgaWYgKChpbnN0YW5jZS0+ZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spID09CisJCSAgIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOKSB7CisJCXdoaWxlIChjICYmIGluc3RhbmNlLT53cmFwX3JlbWFpbmluZykgeworCQkJYzEgPSBjOworCisJCQlpZiAoYzEgPiAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCkpCS8qIE9ubHkgdXAgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCQkJYzEgPSAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLQorCQkJCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKTsKKworCQkJaWYgKGMxID4gaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKQkvKiBPbmx5IHVwIHRvIGNvdW50IG9mIHVzZXIgZGVmaW5lZCBudW1iZXIgb2YgdmFsdWVzICovCisJCQkJYzEgPSBpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmc7CisKKwkJCS8qIFdyaXRlIHRoZSB2YWx1ZXMgdG8gdGhlIEZJRk8gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjMTsKKwkJCSAgICAgaSsrLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrLCBjLS0sCisJCQkgICAgIGluc3RhbmNlLT53cmFwX3JlbWFpbmluZy0tKSB7CisJCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpCisJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYudGFpbF0gPDwgMTYsCisJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQllbHNlCisJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYudGFpbF0sCisJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID49IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQkvKiBTdGFydCBmcm9tIGJlZ2lubmluZyAqLworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJfQorCisJCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIWluc3RhbmNlLT53cmFwX3JlbWFpbmluZykgeworCQkJUERFQlVHKCJGaW5pdGUgU1cgd3JhcGFyb3VuZCBkb25lLlxuIik7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisKKwkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBFUlJPUigiQnJva2VuIHBpcGUuXG4iKTsKKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEU7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0KKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCX0gZWxzZSB7CQkvKiBSZWd1bGFyIGNvbnRpbnVvdXMgbW9kZSAqLworCisJCXdoaWxlICgxKSB7CisJCQljMSA9IG1lX2NpcmNfYnVmX3ZhbHVlc190b19lbmQoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCQlQREVCVUcoIlZhbHVlcyB0byBlbmQgPSAlZC5cbiIsIGMxKTsKKworCQkJaWYgKGMxID4gYykKKwkJCQljMSA9IGM7CisKKwkJCWlmIChjMSA8PSAwKSB7CisJCQkJUERFQlVHKCJXb3JrIGRvbmUgb3IgYnVmZmVyIGVtcHR5LlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQkJZm9yIChpID0gMDsgaSA8IGMxOyBpKyspIHsKKwkJCQkJdmFsdWUgPQorCQkJCQkgICAgKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKworCQkJCQkgICAgICBpKSA8PCAxNjsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlvdXRzbChpbnN0YW5jZS0+Zmlmb19yZWcsCisJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArCisJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwsIGMxKTsKKworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPQorCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArCisJCQkgICAgIGMxKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCVBERUJVRygiJWQgdmFsdWVzIHdyb3RlIHRvIHBvcnQgMHglMDRYLlxuIiwgYzEsCisJCQkgICAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKworCQkJYyAtPSBjMTsKKwkJfQorCisJCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIW1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgeworCQkJUERFQlVHCisJCQkgICAgKCJEaXNhYmxlIEludGVycnVwdCBiZWNhdXNlIG5vIHZhbHVlcyBsZWZ0IGluIGJ1ZmZlci5cbiIpOworCQkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJfQorCisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCisJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQREVCVUcoIkJyb2tlbiBwaXBlIGluIG1lNDYwMF9hb19pc3IuXG4iKTsKKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEU7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0KKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwlrZnJlZShpbnN0YW5jZS0+Y2lyY19idWYuYnVmKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCittZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKm1lNDYwMF9hb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJICAgICB1aW50MzJfdCAqIHByZWxvYWRfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwgaW50IGZpZm8sIGludCBpcnEpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9hb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrID0gcHJlbG9hZF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSBwcmVsb2FkX2ZsYWdzOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY2lyY3VsYXIgYnVmZmVyICovCisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IGttYWxsb2MoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpOworCisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8qIEluaXRpYWxpemUgc2luZ2xlIHZhbHVlIHRvIDBWICovCisJc3ViZGV2aWNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisKKwkvKiBTdG9yZSBhbmFsb2cgb3V0cHV0IGluZGV4ICovCisJc3ViZGV2aWNlLT5hb19pZHggPSBhb19pZHg7CisKKwkvKiBTdG9yZSBpZiBhbmFsb2cgb3V0cHV0IGhhcyBmaWZvICovCisJc3ViZGV2aWNlLT5maWZvID0gZmlmbzsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisKKwlpZiAoYW9faWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisKKwkJaWYgKGlubChzdWJkZXZpY2UtPnJlZ19iYXNlICsgTUU0NjAwX0FPX0JPU0NIX1JFRykgPT0gMHgyMDAwMCkgeworCQkJUElORk8oIkJvc2NoIGZpcm13YXJlIGluIHVzZSBmb3IgY2hhbm5lbCAwLlxuIik7CisJCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXN1YmRldmljZS0+Ym9zY2hfZncgPSAwOworCQl9CisJfSBlbHNlIGlmIChhb19pZHggPT0gMSkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Ym9zY2hfZncgPSAwOworCX0KKworCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fTE9BRFNFVFJFR19YWDsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWlmIChyZXF1ZXN0X2lycQorCSAgICAoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9hb19pc3IsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCSAgICAgTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IGludGVycnVwdCBsaW5lLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWtmcmVlKHN1YmRldmljZS0+Y2lyY19idWYuYnVmKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNDYwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU0NjAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZTQ2MDBfYW9fcXVlcnlfdGltZXI7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCisjZW5kaWYgLy8gQk9TQ0gKKworLyogQ29tbW9uIGZ1bmN0aW9ucworKi8KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgoKm1heCAtICptaW4pIDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX01JTl9NQVg7CisJfQorCisJaWYgKCh1bml0ID09IE1FX1VOSVRfVk9MVCkgfHwgKHVuaXQgPT0gTUVfVU5JVF9BTlkpKSB7CisJCWlmICgoKm1heCA8PSAoTUU0NjAwX0FPX01BWF9SQU5HRSArIDEwMDApKQorCQkgICAgJiYgKCptaW4gPj0gTUU0NjAwX0FPX01JTl9SQU5HRSkpIHsKKwkJCSptaW4gPSBNRTQ2MDBfQU9fTUlOX1JBTkdFOworCQkJKm1heCA9IE1FNDYwMF9BT19NQVhfUkFOR0U7CisJCQkqbWF4ZGF0YSA9IE1FNDYwMF9BT19NQVhfREFUQTsKKwkJCSpyYW5nZSA9IDA7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGF2YWlsYWJsZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBoeXNpY2FsIHVuaXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1VOSVQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJKmNvdW50ID0gMTsKKwl9IGVsc2UgeworCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKHJhbmdlID09IDApIHsKKwkJKnVuaXQgPSBNRV9VTklUX1ZPTFQ7CisJCSptaW4gPSBNRTQ2MDBfQU9fTUlOX1JBTkdFOworCQkqbWF4ID0gTUU0NjAwX0FPX01BWF9SQU5HRTsKKwkJKm1heGRhdGEgPSBNRTQ2MDBfQU9fTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkFOR0U7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoKHRpbWVyICE9IE1FX1RJTUVSX0FDUV9TVEFSVCkgJiYgKHRpbWVyICE9IE1FX1RJTUVSX0NPTlZfU1RBUlQpKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRVI7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vU3RyZWFtaW5nIGRldmljZS4KKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FPX0JBU0VfRlJFUVVFTkNZOworCQlpZiAodGltZXIgPT0gTUVfVElNRVJfQUNRX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU0NjAwX0FPX01JTl9BQ1FfVElDS1M7CisJCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FPX01BWF9BQ1FfVElDS1M7CisJCX0gZWxzZSBpZiAodGltZXIgPT0gTUVfVElNRVJfQ09OVl9TVEFSVCkgeworCQkJKm1pbl90aWNrcyA9IE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTQ2MDBfQU9fTUFYX0NIQU5fVElDS1M7CisJCX0KKwl9IGVsc2UgewkJLy9Ob3Qgc3RyZWFtaW5nIGRldmljZSEKKwkJKmJhc2VfZnJlcXVlbmN5ID0gMDsKKwkJKm1pbl90aWNrcyA9IDA7CisJCSptYXhfdGlja3MgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqbnVtYmVyID0gMTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqdHlwZSA9IE1FX1RZUEVfQU87CisJKnN1YnR5cGUgPSAoaW5zdGFuY2UtPmZpZm8pID8gTUVfU1VCVFlQRV9TVFJFQU1JTkcgOiBNRV9TVUJUWVBFX1NJTkdMRTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqY2FwcyA9CisJICAgIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUyB8ICgoaW5zdGFuY2UtPmZpZm8pID8gTUVfQ0FQU19BT19GSUZPIDoKKwkJCQkJICAgTUVfQ0FQU19OT05FKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5IGFyZ3VtZW50IGNvdW50LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQ7CisJfQorCisJc3dpdGNoIChjYXApIHsKKwljYXNlIE1FX0NBUF9BSV9GSUZPX1NJWkU6CisJCWFyZ3NbMF0gPSAoaW5zdGFuY2UtPmZpZm8pID8gTUU0NjAwX0FPX0ZJRk9fQ09VTlQgOiAwOworCQlicmVhazsKKworCWNhc2UgTUVfQ0FQX0FJX0JVRkZFUl9TSVpFOgorCQlhcmdzWzBdID0KKwkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSA/IE1FNDYwMF9BT19DSVJDX0JVRl9DT1VOVCA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DQVA7CisJCWFyZ3NbMF0gPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiYzRhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaApAQCAtMCwwICsxLDI2MyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYW8uaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9BT19IXworIyBkZWZpbmUgX01FNDYwMF9BT19IXworCisjIGluY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyMgaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyMgaW5jbHVkZSAibWVjaXJjX2J1Zi5oIgorIyBpbmNsdWRlICJtZWlvY3RsLmgiCisKKyMgaWZkZWYgX19LRVJORUxfXworCisjICBpZmRlZiBCT1NDSAorIyAgIHVuZGVmIE1FX1NZTkFQU0UKKyMgICBpZm5kZWYgX0NCVUZGXzMyYl90CisjIAkgZGVmaW5lIF9DQlVGRl8zMmJfdAorIyAgIGVuZGlmIC8vX0NCVUZGXzMyYl90CisjICBlbmRpZiAvL0JPU0NICisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUFYX1NVQkRFVklDRVMJCTQKKyMgIGRlZmluZSBNRTQ2MDBfQU9fRklGT19DT1VOVAkJCTQwOTYKKworIyAgZGVmaW5lIE1FNDYwMF9BT19CQVNFX0ZSRVFVRU5DWQkJMzMwMDAwMDBMTAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01JTl9BQ1FfVElDS1MJCTBMTAorIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfQUNRX1RJQ0tTCQkwTEwKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUwkJNjZMTAorIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUwkJMHhGRkZGRkZGRkxMCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUlOX1JBTkdFCQkJLTEwMDAwMDAwCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9SQU5HRQkJCTk5OTk2OTQKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfREFUQQkJCTB4RkZGRgorCisjICBpZmRlZiBNRV9TWU5BUFNFCisjICAgZGVmaW5lIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSIAkJOAkvLyAyXm4gUEFHRVMgPT4+IE1heGltdW0gdmFsdWUgb2YgMU1CIGZvciBTeW5hcHNlCisjICBlbHNlCisjICAgZGVmaW5lIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSIAkJNQkvLyAyXm4gUEFHRVMgPT4+IDEyOEtCCisjICBlbmRpZgorIyAgZGVmaW5lIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFIAkJUEFHRV9TSVpFPDxNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUgkvLyBCdWZmZXIgc2l6ZSBpbiBieXRlcy4KKworIyAgaWZkZWYgX0NCVUZGXzMyYl90CisjICAgZGVmaW5lIE1FNDYwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MzJfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbHNlCisjICAgZGVmaW5lIE1FNDYwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MTZfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbmRpZgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0NPTlRJTk9VUwkJCQkJMHgwCisjICBkZWZpbmUgTUU0NjAwX0FPX1dSQVBfTU9ERQkJCQkJMHgxCisjICBkZWZpbmUgTUU0NjAwX0FPX0hXX01PREUJCQkJCQkweDIKKworIyAgZGVmaW5lIE1FNDYwMF9BT19IV19XUkFQX01PREUJCQkJKE1FNDYwMF9BT19XUkFQX01PREUgfCBNRTQ2MDBfQU9fSFdfTU9ERSkKKyMgIGRlZmluZSBNRTQ2MDBfQU9fU1dfV1JBUF9NT0RFCQkJCU1FNDYwMF9BT19XUkFQX01PREUKKworIyAgZGVmaW5lIE1FNDYwMF9BT19JTkZfU1RPUF9NT0RFCQkJCTB4MAorIyAgZGVmaW5lIE1FNDYwMF9BT19BQ1FfU1RPUF9NT0RFCQkJCTB4MQorIyAgZGVmaW5lIE1FNDYwMF9BT19TQ0FOX1NUT1BfTU9ERQkJCQkweDIKKworIyAgaWZkZWYgQk9TQ0gJCQkvL1NQRUNJQUwgQlVJTEQgRk9SIEJPU0NICisKKy8qIEJpdHMgZm9yIGZsYWdzIGF0dHJpYnV0ZS4gKi8KKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFCQkJMHgxCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfMAkJMHgyCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfMQkJMHg0CisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSwkoTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8wIHwgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8xKQorCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTk9ORQkweDAKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYJCTB4MgorIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0ZJTgkJMHg0CisKKwkvKioKKwkqIEBicmllZiBUaGUgTUUtNDAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKwkqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKnByZWxvYWRfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXVpbnQzMl90ICpwcmVsb2FkX2ZsYWdzOworCisJdW5zaWduZWQgaW50IGlycTsJCQkJCS8qKjwgVGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJLyoqPCBDaXJjdWxhciBidWZmZXIgaG9sZGluZyBtZWFzdXJtZW50IGRhdGEuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCS8qKjwgV2FpdCBxdWV1ZSB0byBwdXQgb24gdGFza3Mgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUuICovCisKKwlpbnQgc2luZ2xlX3ZhbHVlOwkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHZhbHVlIHdyaXR0ZW4gaW4gc2luZ2xlIG1vZGUuICovCisKKwlpbnQgdm9sYXRpbGUgZmxhZ3M7CQkJCQkvKio8IEZsYWdzIHVzZWQgZm9yIHN0b3JpbmcgU1cgd3JhcGFyb3VuZCBzZXR1cCBhbmQgZXJyb3Igc2lnbmFsbGluZyBmcm9tIElTUi4gKi8KKwl1bnNpZ25lZCBpbnQgd3JhcF9jb3VudDsJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgd3JhcGFyb3VuZCBjeWNsZSBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgd3JhcF9yZW1haW5pbmc7CQkvKio8IFRoZSB3cmFwYXJvdW5kIGN5Y2xlIGRvd24gY291bnRlciB1c2VkIGJ5IGEgcnVubmluZyBjb252ZXJzaW9uLiAqLworCXVuc2lnbmVkIGludCBhb19pZHg7CQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoaXMgYW5hbG9nIG91dHB1dCBvbiB0aGlzIGRldmljZS4gKi8KKwlpbnQgZmlmbzsJCQkJCQkJLyoqPCBJZiBzZXQgdGhpcyBkZXZpY2UgaGFzIGEgRklGTy4gKi8KKworCWludCBib3NjaF9mdzsJCQkJCQkvKio8IElmIHNldCB0aGUgYm9zY2ggZmlybXdhcmUgaXMgaW4gUFJPTS4gKi8KKworCS8qIFJlZ2lzdGVycyAqLworCXVpbnQzMl90IGN0cmxfcmVnOworCXVpbnQzMl90IHN0YXR1c19yZWc7CisJdWludDMyX3QgZmlmb19yZWc7CisJdWludDMyX3Qgc2luZ2xlX3JlZzsKKwl1aW50MzJfdCB0aW1lcl9yZWc7CisJdWludDMyX3QgaXJxX3N0YXR1c19yZWc7CisJdWludDMyX3QgcHJlbG9hZF9yZWc7CisJdWludDMyX3QgcmVnX2Jhc2U7Cit9IG1lNDYwMF9hb19zdWJkZXZpY2VfdDsKKworCS8qKgorCSogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UgZm9yIEJPU0NIIHByb2plY3QuCisJKgorCSogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisJKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisJKiBAcGFyYW0gcHJlbG9hZF9mbGFncyBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBob2xkJnRyaWdnZXIgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKwkqIEBwYXJhbSBhb19pZHggU3ViZGV2aWNlIG51bWJlci4KKwkqIEBwYXJhbSBmaWZvIEZsYWcgc2V0IGlmIHN1YmRldmljZSBoYXMgaGFyZHdhcmUgRklGTy4KKwkqIEBwYXJhbSBpcnEgSVJRIG51bWJlci4KKwkqCisJKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKwkqIE5VTEwgb24gZXJyb3IuCisJKi8KK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LCBpbnQgZmlmbywgaW50IGlycSk7CisKKyMgIGVsc2UJLy9+Qk9TQ0gKKworLy9NRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUgaXMgT0JTT0xFVEUgPT4gTm93IHByb2JsZW1zIGFyZSByZXBvcnRlZCBpbiBzdGF0dXMuCisKK3R5cGVkZWYgZW51bSBNRTQ2MDBfQU9fU1RBVFVTIHsKKwlhb19zdGF0dXNfbm9uZSA9IDAsCisJYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW4sCisJYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCwKKwlhb19zdGF0dXNfc2luZ2xlX2VuZCwKKwlhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCwKKwlhb19zdGF0dXNfc3RyZWFtX3J1biwKKwlhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0LAorCWFvX3N0YXR1c19zdHJlYW1fZW5kLAorCWFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvciwKKwlhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvciwKKwlhb19zdGF0dXNfc3RyZWFtX2Vycm9yLAorCWFvX3N0YXR1c19sYXN0Cit9IE1FNDYwMF9BT19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9hb190aW1lb3V0IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKK30gbWU0NjAwX2FvX3RpbWVvdXRfdDsKKworCS8qKgorCSogQGJyaWVmIFRoZSBNRS00NjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorCSovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisJdW5zaWduZWQgaW50IGFvX2lkeDsJCQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGlzIGFuYWxvZyBvdXRwdXQgb24gdGhpcyBkZXZpY2UuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKnByZWxvYWRfcmVnX2xvY2s7CQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgcHJlbG9hZF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVpbnQzMl90ICpwcmVsb2FkX2ZsYWdzOworCisJLyogSGFyZHdhcmUgZmVhdXRyZXMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJCQkvKio8IFRoZSBpbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLiAqLworCWludCBmaWZvOwkJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIGhhcyBhIEZJRk8uICovCisJaW50IGJpdHBhdHRlcm47CQkJCQkJCQkvKio8IElmIHNldCB0aGlzIGRldmljZSB1c2UgYml0cGF0dGVybi4gKi8KKworCWludCBzaW5nbGVfdmFsdWU7CQkJCQkJCS8qKjwgTWlycm9yIG9mIHRoZSBvdXRwdXQgdmFsdWUgaW4gc2luZ2xlIG1vZGUuICovCisJaW50IHNpbmdsZV92YWx1ZV9pbl9maWZvOwkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHZhbHVlIHdyaXR0ZW4gaW4gc2luZ2xlIG1vZGUuICovCisJdWludDMyX3QgY3RybF90cmc7CQkJCQkJCS8qKjwgTWlycm9yIG9mIHRoZSB0cmlnZ2VyIHNldHRpbmdzLiAqLworCisJdm9sYXRpbGUgaW50IG1vZGU7CQkJCQkJCS8qKjwgRmxhZ3MgdXNlZCBmb3Igc3RvcmluZyBTVyB3cmFwYXJvdW5kIHNldHVwKi8KKwlpbnQgc3RvcF9tb2RlOwkJCQkJCQkJLyoqPCBUaGUgdXNlciBkZWZpbmVkIHN0b3AgY29uZGl0aW9uIGZsYWcuICovCisJdW5zaWduZWQgaW50IHN0YXJ0X21vZGU7CisJdW5zaWduZWQgaW50IHN0b3BfY291bnQ7CQkJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgZGF0ZXMgcHJlc2VudGF0aW9uIGVuZCBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgc3RvcF9kYXRhX2NvdW50OwkJCQkvKio8IFRoZSBzdG9wIHByZXNlbnRhdGlvbiBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9jb3VudDsJCQkJCS8qKjwgVGhlIHJlYWwgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBwcmVsb2FkZWRfY291bnQ7CQkJCS8qKjwgVGhlIG5leHQgZGF0YSBhZGRyZXMgaW4gYnVmZmVyLiA8PSBmb3Igd3JhcGFyb3VuZCBtb2RlLiAqLworCWludCBoYXJkd2FyZV9zdG9wX2RlbGF5OwkJCQkJLyoqPCBUaGUgdGltZSB0aGF0IHN0b3AgY2FuIHRha2UuIFRoaXMgaXMgb25seSB0byBub3Qgc2hvdyBoYXJkd2FyZSBidWcgdG8gdXNlci4gKi8KKworCXZvbGF0aWxlIGVudW0gTUU0NjAwX0FPX1NUQVRVUyBzdGF0dXM7CQkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTQ2MDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJCS8qKjwgVGhlIHRpbWVvdXQgZm9yIHN0YXJ0IGluIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgbW9kZS4gKi8KKworCQkJCQkJCQkJCS8qIFJlZ2lzdGVycyAqLy8qKjwgQWxsIHJlZ2lzdGVycyBhcmUgMzIgYml0cyBsb25nLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgZmlmb19yZWc7CisJdW5zaWduZWQgbG9uZyBzaW5nbGVfcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBwcmVsb2FkX3JlZzsKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworCisJLyogU29mdHdhcmUgYnVmZmVyICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gMzIgYml0IGxvbmcgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJCQkvKio8IFdhaXQgcXVldWUgdG8gcHV0IG9uIHRhc2tzIHdhaXRpbmcgZm9yIGRhdGEgdG8gYXJyaXZlLiAqLworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNDYwMF93b3JrcXVldWU7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCXN0cnVjdCB3b3JrX3N0cnVjdCBhb19jb250cm9sX3Rhc2s7CisjZWxzZQorCXN0cnVjdCBkZWxheWVkX3dvcmsgYW9fY29udHJvbF90YXNrOworI2VuZGlmCisKKwl2b2xhdGlsZSBpbnQgYW9fY29udHJvbF90YXNrX2ZsYWc7CQkJLyoqPCBGbGFnIGNvbnRyb2xpbmcgcmVleGVjdXRpbmcgb2YgY29udHJvbCB0YXNrICovCisKK30gbWU0NjAwX2FvX3N1YmRldmljZV90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDYwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKwkqCisJKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKwkqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKwkqIEBwYXJhbSBwcmVsb2FkX2ZsYWdzIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGhvbGQmdHJpZ2dlciByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIGFvX2lkeCBTdWJkZXZpY2UgbnVtYmVyLgorCSogQHBhcmFtIGZpZm8gRmxhZyBzZXQgaWYgc3ViZGV2aWNlIGhhcyBoYXJkd2FyZSBGSUZPLgorCSogQHBhcmFtIGlycSBJUlEgbnVtYmVyLgorCSogQHBhcmFtIG1lNDYwMF93cSBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHRhc2sgKDEgcXVldWUgZm9yIGFsbCBzdWJkZXZpY2Ugb24gMSBib2FyZCkuCisJKgorCSogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisJKiBOVUxMIG9uIGVycm9yLgorCSovCittZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKm1lNDYwMF9hb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJICAgICB1aW50MzJfdCAqIHByZWxvYWRfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgZmlmbywKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CisJCQkJCSAgICAgKm1lNDYwMF93cSk7CisKKyMgIGVuZGlmIC8vQk9TQ0gKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy8gfl9NRTQ2MDBfQU9fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4M2Q4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvX3JlZy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9BT19SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9BT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfQU9fMDBfQ1RSTF9SRUcJCQkJCTB4MDAJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMF9TVEFUVVNfUkVHCQkJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQU9fMDBfRklGT19SRUcJCQkJCTB4MDgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BT18wMF9TSU5HTEVfUkVHCQkJCQkweDBDCS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDBfVElNRVJfUkVHCQkJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BT18wMV9DVFJMX1JFRwkJCQkJMHgxOAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX1NUQVRVU19SRUcJCQkJCTB4MUMJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wMV9GSUZPX1JFRwkJCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX1NJTkdMRV9SRUcJCQkJCTB4MjQJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMV9USU1FUl9SRUcJCQkJCTB4MjgJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPXzAyX0NUUkxfUkVHCQkJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDJfU1RBVFVTX1JFRwkJCQkJMHgzNAkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FPXzAyX0ZJRk9fUkVHCQkJCQkweDM4CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQU9fMDJfU0lOR0xFX1JFRwkJCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAyX1RJTUVSX1JFRwkJCQkJMHg0MAkvLyBfL1cKKworI2RlZmluZSBNRTQ2MDBfQU9fMDNfQ1RSTF9SRUcJCQkJCTB4NDgJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wM19TVEFUVVNfUkVHCQkJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQU9fMDNfRklGT19SRUcJCQkJCTB4NTAJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BT18wM19TSU5HTEVfUkVHCQkJCQkweDU0CS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDNfVElNRVJfUkVHCQkJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BT19ERU1VWF9BREpVU1RfUkVHCQkJCTB4QkMJLy8gLS9XCisjZGVmaW5lIE1FNDYwMF9BT19ERU1VWF9BREpVU1RfVkFMVUUJCQkweDRDCisKKyNpZmRlZiBCT1NDSAorIyBkZWZpbmUgTUU0NjAwX0FPX0JPU0NIX1JFRwkJCQkJMHhDNAorCisjIGRlZmluZSBNRTQ2MDBfQU9fTE9BRFNFVFJFR19YWAkJCQkweEI0CS8vIFIvVworCisjIGRlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8wCQkJCTB4MDAxCisjIGRlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8xCQkJCTB4MDAyCisjIGRlZmluZSBNRTQ2MDBfQU9fQ1RSTF9NQVNLX01PREUJCQkJMHgwMDMKKworI2Vsc2UgLy9+Qk9TQ0gKKworI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19SRUcJCQkJCQkweEI0CS8vIFIvVyAgICAvLy9NRTQ2MDBfQU9fU1lOQ19SRUcgPD09PiBNRTQ2MDBfQU9fUFJFTE9BRF9SRUcgPD09PiBNRTQ2MDBfQU9fTE9BRFNFVFJFR19YWAorCisjIGRlZmluZSBNRTQ2MDBfQU9fTU9ERV9TSU5HTEUJCQkJCTB4MDAwMDAwMDAKKyMgZGVmaW5lIE1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQJCQkJMHgwMDAwMDAwMQorIyBkZWZpbmUgTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUwkJCQkweDAwMDAwMDAyCisjIGRlZmluZSBNRTQ2MDBfQU9fQ1RSTF9NT0RFX01BU0sJCQkJKE1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQgfCBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTKQorI2VuZGlmIC8vQk9TQ0gKKworI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV9XUkFQQVJPVU5ECQlNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5ECisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFX0NPTlRJTk9VUwkJTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUworI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUAkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCQkweDAwMDAwMDA4CisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRwkJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEJCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEJCQkweDAwMDAwNDAwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USAkweDAwMDAwODAwCisvKgorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19IT0xEXzAJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRF8xCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19IT0xEXzMJCQkJCTB4MDAwMDAwMDgKKyovCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTEQJCQkJCQkweDAwMDAwMDAxCisKKy8qCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHXzAJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJR18xCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHXzMJCQkJMHgwMDA4MDAwMAorKi8KKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcJCQkJCTB4MDAwMTAwMDAKKworI2RlZmluZSBNRTQ2MDBfQU9fRVhUX1RSSUcJCQkJCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUU0NjAwX0FPX1NUQVRVU19CSVRfRkYJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYJCQkJCTB4MDAwMDAwMDgKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDU1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RldmljZS5jCkBAIC0wLDAgKzEsMzczIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS00NjAwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lNDYwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKworI2luY2x1ZGUgIm1lZmlybXdhcmUuaCIKKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWU0NjAwX2RvLmgiCisjaW5jbHVkZSAibWU0NjAwX2RpLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpby5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorI2luY2x1ZGUgIm1lNDYwMF9haS5oIgorI2luY2x1ZGUgIm1lNDYwMF9hby5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxLmgiCisKKy8qKgorICogQGJyaWVmIEdsb2JhbCB2YXJpYWJsZS4KKyAqIFRoaXMgaXMgd29ya2luZyBxdWV1ZSBmb3IgcnVuaW5nIGEgc2VwYXJhdGUgYXRhc2sgdGhhdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB3b3JrIHN0YXR1cyAoc3RhcnQsIHN0b3AsIHRpbWVvdXRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd29ya3F1ZXVlOworCisjaWZkZWYgQk9TQ0gKK21lX2RldmljZV90ICptZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlLCBpbnQgbWVfYm9zY2hfZncpCisjZWxzZSAvL35CT1NDSAorbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisjZW5kaWYJCQkJLy9CT1NDSAoreworCW1lNDYwMF9kZXZpY2VfdCAqbWU0NjAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWU0NjAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTQ2MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIE1FLTQ2MDAgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTQ2MDBfZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBEb3dubG9hZCB0aGUgeGlsaW54IGZpcm13YXJlLgorCWlmIChtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMCkgewkvL0pla3lsbCA8PT4gbWU0NjEwCisJCWVyciA9CisJCSAgICBtZV94aWxpbnhfZG93bmxvYWQobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbNV0sICZwY2lfZGV2aWNlLT5kZXYsCisJCQkJICAgICAgICJtZTQ2MTAuYmluIik7CisJfSBlbHNlIHsJCS8vIEdlbmVyYWwgbWU0NjAwIGZpcm13YXJlCisjaWZkZWYgQk9TQ0gKKwkJZXJyID0KKwkJICAgIG1lX3hpbGlueF9kb3dubG9hZChtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbMV0sCisJCQkJICAgICAgIG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1s1XSwgJnBjaV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgKG1lX2Jvc2NoX2Z3KSA/ICJtZTQ2MDBfYm9zY2guYmluIiA6CisJCQkJICAgICAgICJtZTQ2MDAuYmluIik7CisjZWxzZSAvL35CT1NDSAorCQllcnIgPQorCQkgICAgbWVfeGlsaW54X2Rvd25sb2FkKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkgICAgICAgbWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzVdLCAmcGNpX2RldmljZS0+ZGV2LAorCQkJCSAgICAgICAibWU0NjAwLmJpbiIpOworI2VuZGlmCisJfQorCisJaWYgKGVycikgeworCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGRvd25sb2FkIGZpcm13YXJlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lNDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwltZTQ2MDBfZGV2aWNlLT5wcmVsb2FkX2ZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5kaW9fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lNDYwMF9kZXZpY2UtPmFpX2N0cmxfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lNDYwMF9kZXZpY2UtPmN0cl9jdHJsX3JlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+Y3RyX2Nsa19zcmNfcmVnX2xvY2spOworCisJLy8gQ3JlYXRlIGRpZ2l0YWwgaW5wdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9kaV9jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBkaW9fbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgZGlnaXRhbCBvdXRwdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9kb19jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBkaW9fbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgZGlnaXRhbCBpbnB1dC9vdXRwdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICAgZG9fc3ViZGV2aWNlcyArCisJCQkJCQkJICAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgICBkaV9zdWJkZXZpY2VzICsgaSwKKwkJCQkJCQkgICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gQ3JlYXRlIGFuYWxvZyBpbnB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uYWlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2FpX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgIGFpX2NoYW5uZWxzLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYWlfcmFuZ2VzLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYWlfaXNvbGF0ZWQsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9zaCwKKwkJCQkJCQkgICAgIG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEsCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhaV9jdHJsX2xvY2ssCisJCQkJCQkJICAgICBtZTQ2MDBfd29ya3F1ZXVlKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBhbmFsb2cgb3V0cHV0IGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWU0NjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5hb19zdWJkZXZpY2VzOyBpKyspIHsKKyNpZmRlZiBCT1NDSAorCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9hb19jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkJCSAgICAgJm1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9mbGFncywgaSwKKwkJCQkJCQkgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgIGFvX2ZpZm8sCisJCQkJCQkJICAgICBtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxKTsKKyNlbHNlIC8vfkJPU0NICisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2FvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX2ZsYWdzLCBpLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYW9fZmlmbywKKwkJCQkJCQkgICAgIG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEsCisJCQkJCQkJICAgICBtZTQ2MDBfd29ya3F1ZXVlKTsKKyNlbmRpZgorCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gQ3JlYXRlIGNvdW50ZXIgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyNTRfY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLmRldmljZV9pZCwKKwkJCQkJCQkgIG1lNDYwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJICBpbmZvLnBjaS5yZWdfYmFzZXNbM10sCisJCQkJCQkJICAwLCBpLAorCQkJCQkJCSAgJm1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgY3RyX2N0cmxfcmVnX2xvY2ssCisJCQkJCQkJICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICBjdHJfY2xrX3NyY19yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgZXh0ZXJuYWwgaW50ZXJydXB0IGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWU0NjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCSAgICBtZTQ2MDBfZXh0X2lycV9jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkgICAgICAgbWU0NjAwX2RldmljZS0+YmFzZS5pcnEsCisJCQkJCSAgICAgICAmbWU0NjAwX2RldmljZS0+YWlfY3RybF9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lNDYwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisjaWZuZGVmIEJPU0NICisJbWU0NjAwX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJtZTQ2MDAiKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWU0NjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKyNpZm5kZWYgQk9TQ0gKKwlmbHVzaF93b3JrcXVldWUobWU0NjAwX3dvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobWU0NjAwX3dvcmtxdWV1ZSk7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQobWU0NjAwX2luaXQpOworbW9kdWxlX2V4aXQobWU0NjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTQ2eHggRGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTQ2eHggRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODEyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RldmljZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS00NjAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfREVWSUNFX0gKKyNkZWZpbmUgX01FNDYwMF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIE1FLTQ2MDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGN0cl9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBhaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBhaV9jaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgYWlfcmFuZ2VzOworCXVuc2lnbmVkIGludCBhaV9pc29sYXRlZDsKKwl1bnNpZ25lZCBpbnQgYWlfc2g7CisJdW5zaWduZWQgaW50IGFvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFvX2ZpZm87CS8vSG93IG1hbnkgZGV2aWNlcyBoYXZlIEZJRk8KKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9zdWJkZXZpY2VzOworfSBtZTQ2MDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBNRS00NjAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTQ2MDBfdmVyc2lvbl90IG1lNDYwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMCwgMCwgMCwgNCwgMywgMSwgMTYsIDEsIDAsIDAsIDAsIDAsIDF9LAorCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwLCAwLCAwLCA0LCAwLCAxLCAxNiwgNCwgMCwgMCwgMCwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAsIDAsIDAsIDQsIDMsIDEsIDE2LCA0LCAwLCAwLCAyLCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJLCAxLCAxLCAyLCAzLCAxLCAxNiwgNCwgMSwgMCwgMiwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUywgMCwgMCwgNCwgMywgMSwgMTYsIDQsIDAsIDEsIDIsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTLCAxLCAxLCAyLCAzLCAxLCAxNiwgNCwgMSwgMSwgMiwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzAsIDAsIDAsIDQsIDMsIDEsIDMyLCA0LCAwLCAwLCA0LCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJLCAxLCAxLCAyLCAzLCAxLCAzMiwgNCwgMSwgMCwgNCwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUywgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDEsIDQsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTLCAxLCAxLCAyLCAzLCAxLCAzMiwgNCwgMSwgMSwgNCwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODAsIDAsIDAsIDQsIDMsIDEsIDMyLCA0LCAwLCAwLCA0LCA0LCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJLCAxLCAxLCAyLCAzLCAxLCAzMiwgNCwgMSwgMCwgNCwgNCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUywgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDEsIDQsIDQsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTLCAxLCAxLCAyLCAzLCAxLCAzMiwgNCwgMSwgMSwgNCwgNCwgMX0sCisKKwl7MH0sCit9OworCisjZGVmaW5lIE1FNDYwMF9ERVZJQ0VfVkVSU0lPTlMgKHNpemVvZihtZTQ2MDBfdmVyc2lvbnMpIC8gc2l6ZW9mKG1lNDYwMF92ZXJzaW9uX3QpIC0gMSkJLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWU0NjAwX3ZlcnNpb25zLiAqLworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGVudHJ5IGluICNtZTQ2MDBfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWU0NjAwX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZTQ2MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleCh1aW50MTZfdCBkZXZpY2VfaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE1FNDYwMF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1lNDYwMF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIENoaWxkIGNsYXNzIGF0dHJpYnV0ZXMuICovCisJc3BpbmxvY2tfdCBwcmVsb2FkX3JlZ19sb2NrOwkJLyoqPCBHdWFyZHMgdGhlIHByZWxvYWQgcmVnaXN0ZXIgb2YgdGhlIGFuYW9sb2cgb3V0cHV0IGRldmljZXMuICovCisJdW5zaWduZWQgaW50IHByZWxvYWRfZmxhZ3M7CQkJLyoqPCBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggI3ByZWxvYWRfcmVnX2xvY2suICovCisJc3BpbmxvY2tfdCBkaW9fbG9jazsJCQkJLyoqPCBMb2NrcyB0aGUgY29udHJvbCByZWdpc3RlciBvZiB0aGUgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlcy4gKi8KKwlzcGlubG9ja190IGFpX2N0cmxfbG9jazsJCQkvKio8IExvY2tzIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlLiAqLworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2s7CQkvKio8IExvY2tzIHRoZSBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJc3BpbmxvY2tfdCBjdHJfY2xrX3NyY19yZWdfbG9jazsJLyoqPCBOb3QgdXNlZCBvbiB0aGlzIGRldmljZSBidXQgbmVlZGVkIGZvciB0aGUgbWU4MjU0IHN1YmRldmljZSBjb25zdHJ1Y3RvciBjYWxsLiAqLworfSBtZTQ2MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKiBAcGFyYW0gbWVfYm9zY2hfZncgSWYgc2V0IHRoZSBkZXZpY2Ugc2hhbGwgdXNlIHRoZSBib3NjaCBmaXJtd2FyZS4gKE9ubHkgZm9yIHNwZWNpYWwgQk9TQ0ggYnVpbGQpCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KKworI2lmZGVmIEJPU0NICisvKioKKyAqIEBicmllZiBUaGUgTUUtNDYwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICogQHBhcmFtIG1lX2Jvc2NoX2Z3IElmIHNldCB0aGUgZGV2aWNlIHNoYWxsIHVzZSB0aGUgYm9zY2ggZmlybXdhcmUuCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlLCBpbnQgbWVfYm9zY2hfZncpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKyNlbHNlIC8vfkJPU0NICisvKioKKyAqIEBicmllZiBUaGUgTUUtNDYwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTQ2MDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWU0NjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworI2VuZGlmCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzlmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZGkuYworICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpb19yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTQ2MDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMiB8IE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zKTsJLy8weEZGRjMKKwlvdXRsKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dGwoMCwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU0NjAwX2RpX3N1YmRldmljZV90ICptZTQ2MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fUE9SVF8xX1JFRzsKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRElPX0NUUkxfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9kaV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZGlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTQ2MDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RpLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4YjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaApAQCAtMCwwICsxLDY0IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaS5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RJX0hfCisjZGVmaW5lIF9NRTQ2MDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lNDYwMF9kaV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lNDYwMF9kaV9zdWJkZXZpY2VfdCAqbWU0NjAwX2RpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjk1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpby5jCkBAIC0wLDAgKzEsNTEwIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLyogU2V0IHBvcnQgdG8gaW5wdXQgbW9kZSAqLworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwltb2RlICY9CisJICAgIH4oKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3Qgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKwl1aW50MzJfdCBtYXNrOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJCW1vZGUgfD0KKwkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgZGlvX2lkeCAqIDIpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX01VWDMyTSkgeworCQkJCW1hc2sgPQorCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAgMik7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCW1vZGUgJj0gfm1hc2s7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0RFTVVYMzIpIHsKKwkJCQltYXNrID0KKwkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICAgIGRpb19pZHggKgorCQkJCQkJCQkgICAgIDIpOworCQkJCW1hc2sgfD0KKwkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xOworCQkJCW1hc2sgfD0KKwkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCA8PAorCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQltb2RlICY9IH5tYXNrOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKTsKKwkJCQkJbW9kZSB8PSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzA7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMDsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCA8PAorCQkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0KKwkJCQkgICBNRV9TSU5HTEVfQ09ORklHX0RJT19CSVRfUEFUVEVSTikgeworCQkJCW1hc2sgPQorCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAgMik7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCW1vZGUgJj0gfm1hc2s7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKTsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCA8PAorCQkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRsKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCWJ5dGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0bChieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU0NjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIGRpZ2l0YWwgaS9vIGluZGV4ICovCisJc3ViZGV2aWNlLT5kaW9faWR4ID0gZGlvX2lkeDsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUX1JFRyArIChkaW9faWR4ICogNCk7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU0NjAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lNDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyNWJhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmgKQEAgLTAsMCArMSw2OSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RJT19IXworI2RlZmluZSBfTUU0NjAwX0RJT19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdW5zaWduZWQgaW50IGRpb19pZHg7CQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIG9uIHRoZSBkZXZpY2UuICovCisKKwkvKiBSZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lNDYwMF9kaW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTQwMDAgZGlnaXRhbCBpbnB1dC9vdXB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZGlvX2lkeCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIHBvcnQgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU0NjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQwMTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9ESU9fUkVHX0hfCisjZGVmaW5lIF9NRTQ2MDBfRElPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF8wX1JFRwkJCQkweEEwCQkJCQkvKio8IFBvcnQgMCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzFfUkVHCQkJCTB4QTQJCQkJCS8qKjwgUG9ydCAxIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfRElPX1BPUlRfMl9SRUcJCQkJMHhBOAkJCQkJLyoqPCBQb3J0IDIgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF8zX1JFRwkJCQkweEFDCQkJCQkvKio8IFBvcnQgMyByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTQ2MDBfRElPX0RJUl9SRUcJCQkJCTB4QjAJCQkJCS8qKjwgRGlyZWN0aW9uIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfRElPX1BPUlRfUkVHCQkJCQlNRTQ2MDBfRElPX1BPUlRfMF9SRUcJLyoqPCBCYXNlIGZvciBwb3J0J3MgcmVnaXN0ZXIuICovCisKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX1JFRwkJCQkJMHhCOAkJCQkJLyoqPCBDb250cm9sIHJlZ2lzdGVyLiAqLworLyoqIFBvcnQgQSAtIERPICovCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wCQkJMHgwMDAxCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xCQkJMHgwMDAyCisvKiogUG9ydCBCIC0gREkgKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzIJCQkweDAwMDQKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzMJCQkweDAwMDgKKy8qKiBQb3J0IEMgLSBESU8gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzQJCQkweDAwMTAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzUJCQkweDAwMjAKKy8qKiBQb3J0IEQgLSBESU8gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzYJCQkweDAwNDAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzcJCQkweDAwODAKKworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAJCTB4MDEwMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEJCTB4MDIwMAorCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAJCTB4MDQwMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8xCQkweDA4MDAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMgkJMHgxMDAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzMJCTB4MjAwMAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTkxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9kb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvKiBTZXQgcG9ydCB0byBvdXRwdXQgbW9kZSAqLworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwltb2RlICY9IH5NRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMTsJLy8weEZGRkQKKwltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wOwkvLzB4MQorCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCWludCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0gfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19NVVgzMk0pIHsKKwkJCQltb2RlICY9IH4oTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCQkgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMSB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEpOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xCisJCQkJCQkgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHBvcnQgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09CisJCQkJICAgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMikgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAKKwkJCQkJCSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0KKwkJCQkgICBNRV9TSU5HTEVfQ09ORklHX0RJT19CSVRfUEFUVEVSTikgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZG9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0KKwkgICAgaW5sKGluc3RhbmNlLT4KKwkJY3RybF9yZWcpICYgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCisJaWYgKG1vZGUgPT0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApIHsKKwkJc3dpdGNoIChmbGFncykgeworCQljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweEZGOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBieXRlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9CisJICAgIGlubChpbnN0YW5jZS0+CisJCWN0cmxfcmVnKSAmIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKTsKKworCWlmIChtb2RlID09IE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wKSB7CisJCXN3aXRjaCAoZmxhZ3MpIHsKKworCQljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJCWJ5dGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0bChieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwkJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJCWlmIChjaGFubmVsID09IDApIHsKKwkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lNDYwMF9kb19zdWJkZXZpY2VfdCAqbWU0NjAwX2RvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lNDYwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNDYwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRElPX0NUUkxfUkVHOworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fUE9SVF8wX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTQ2MDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU0NjAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM4NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RPX0hfCisjZGVmaW5lIF9NRTQ2MDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lNDYwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lNDYwMF9kb19zdWJkZXZpY2VfdCAqbWU0NjAwX2RvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExMGRjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNDY3IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWU0NjAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9haV9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZXh0X2lycV9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZXh0X2lycS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IGlycV9zb3VyY2UsCisJCQkJICAgICAgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzICYgfk1FX0lPX0lSUV9TVEFSVF9ESU9fQklUKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX1JJU0lORykKKwkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0ZBTExJTkcpCisJICAgICYmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9BTlkpCisJICAgICkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFOworCX0KKworCWlmIChpcnFfc291cmNlICE9IE1FX0lSUV9TT1VSQ0VfRElPX0xJTkUpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXRtcCA9IDB4MDsJCS8vaW5sKGluc3RhbmNlLT5leHRfaXJxX2NvbmZpZ19yZWcpOworCisJaWYgKGlycV9lZGdlID09IE1FX0lSUV9FREdFX1JJU0lORykgeworCQkvL3RtcCAmPSB+TUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0s7CisJCS8vdG1wIHw9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX1JJU0lORzsKKwl9IGVsc2UgaWYgKGlycV9lZGdlID09IE1FX0lSUV9FREdFX0ZBTExJTkcpIHsKKwkJLy90bXAgJj0gfk1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLOworCQkvL3RtcCB8PSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19GQUxMSU5HOworCQl0bXAgPSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19GQUxMSU5HOworCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCS8vdG1wICY9IH5NRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSzsKKwkJLy90bXAgfD0gTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfQU5ZOworCQl0bXAgPSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlk7CisJfQorCisJb3V0bCh0bXAsIGluc3RhbmNlLT5leHRfaXJxX2NvbmZpZ19yZWcpOworCVBERUJVR19SRUcoImV4dF9pcnFfY29uZmlnX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5leHRfaXJxX2NvbmZpZ19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlE7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX2lycV93YWl0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPnJpc2VkIDw9IDApIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgd2FpdF9xdWV1ZSwKKwkJCQkJCQkgICAgIChpbnN0YW5jZS0+cmlzZWQgIT0KKwkJCQkJCQkgICAgICAwKSwgdCk7CisKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+Y291bnQ7CisJKnZhbHVlID0gaW5zdGFuY2UtPnZhbHVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVndiBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZ3Ygb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJb3V0bChNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlksIGluc3RhbmNlLT5leHRfaXJxX2NvbmZpZ19yZWcpOworCVBERUJVR19SRUcoImV4dF9pcnFfY29uZmlnX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5leHRfaXJxX2NvbmZpZ19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkJaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9FWFRfSVJROworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0KKwkgICAgTUVfQ0FQU19FWFRfSVJRX0VER0VfUklTSU5HIHwgTUVfQ0FQU19FWFRfSVJRX0VER0VfRkFMTElORyB8CisJICAgIE1FX0NBUFNfRVhUX0lSUV9FREdFX0FOWTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfZXh0X2lycV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfZXh0X2lycV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3QgaXJxX3N0YXR1czsKKworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9FWCkpIHsKKwkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwlpbnN0YW5jZS0+dmFsdWUgPSBpbmwoaW5zdGFuY2UtPmV4dF9pcnFfdmFsdWVfcmVnKTsKKwlpbnN0YW5jZS0+Y291bnQrKzsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVDsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQ7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK21lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTQ2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSAgICAgICBpbnQgaXJxLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWlmIChyZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU0NjAwX2V4dF9pcnFfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJUEVSUk9SKCJDYW5ub3QgcmVnaXN0ZXIgaW50ZXJydXB0LlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5leHRfaXJxX2NvbmZpZ19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19SRUc7CisJc3ViZGV2aWNlLT5leHRfaXJxX3ZhbHVlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0VYVF9JUlFfVkFMVUVfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWU0NjAwX2V4dF9pcnFfaW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTQ2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmNvdW50ID0gMDsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2IyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuaApAQCAtMCwwICsxLDc4IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9leHRfaXJxLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtNDAwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9FWFRfSVJRX0hfCisjZGVmaW5lIF9NRTQ2MDBfRVhUX0lSUV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKKworCWludCBpcnE7CisKKwlpbnQgcmlzZWQ7CisJaW50IHZhbHVlOworCWludCBjb3VudDsKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGV4dF9pcnFfY29uZmlnX3JlZzsKKwl1bnNpZ25lZCBsb25nIGV4dF9pcnFfdmFsdWVfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBpcnEgVGhlIGludGVycnVwdCBudW1iZXIgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lNDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkJICAgICAgIGludCBpcnEsCisJCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqCisJCQkJCQkgICAgICAgY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4ZTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRVhUX0lSUV9SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9FWFRfSVJRX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19SRUcJCTB4Q0MJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX1ZBTFVFX1JFRwkJMHhEMAkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19SSVNJTkcJMHgwCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkcJMHgxCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWQkJMHgzCisjZGVmaW5lIE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLCQkweDMKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTUyYmJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9yZWcuaApAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19SRUcJCQkweDlDCS8vIFIvXworCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9FWAkJMHgwMQorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUJCTB4MDIKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGCQkweDA0CisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18wX0hGCTB4MDgKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzFfSEYJMHgxMAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fMl9IRgkweDIwCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18zX0hGCTB4NDAKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDCQkweDgwCisKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPX0hGCQlNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fMF9IRgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNWZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmMKQEAgLTAsMCArMSwzNzM5IEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9hby5jCisgKgorICogQGJyaWVmIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lNjAwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfYW9fcmVnLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvLmgiCisKKy8qIERlZmluZXMKKyAqLworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKmNhcHMpOworCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworLyoqIFJlbW92ZSBzdWJkZXZpY2UuICovCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpOworCisvKiogUmVzZXQgc3ViZGV2aWNlLiBTdG9wIGFsbCBhY3Rpb25zLiBSZXNldCByZWdpc3RyeS4gRGlzYWJsZSBGSUZPLiBTZXQgb3V0cHV0IHRvIDBWIGFuZCBzdGF0dXMgdG8gJ25vbmUnLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncyk7CisKKy8qKiBTZXQgb3V0cHV0IGFzIHNpbmdsZSAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKy8qKiBQYXNzIHRvIHVzZXIgYWN0dWFsIHZhbHVlIG9mIG91dHB1dC4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSB0byBvdXRwdXQgcmVxdWVkIHZhbHVlLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc3RyZWFtZWQgZGV2aWNlLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKy8qKiBXYWl0IGZvciAvIENoZWNrIGVtcHR5IHNwYWNlIGluIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKy8qKiBTdGFydCBzdHJlYW1pbmcuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogQ2hlY2sgYWN0dWFsIHN0YXRlLiAvIFdhaXQgZm9yIGVuZC4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKTsKKworLyoqIFN0b3Agc3RyZWFtaW5nLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKKworLyoqIFdyaXRlIGRhdGFzIHRvIGJ1ZmZvci4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKy8qKiBJbnRlcnJ1cHQgaGFuZGxlci4gQ29weSBmcm9tIGJ1ZmZlciB0byBGSUZPLiAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNjAwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KSBpbiB3cmFwYXJvdW5kIG1vZGUuICovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4qLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoc2xvdykuKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV9wb29saW5nKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCBzdGFydF9wb3MpOworCisvKiogQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBjaXJjdWxhciBidWZmZXIuICovCitpbnQgaW5saW5lIGFvX2dldF9kYXRhX2Zyb21fdXNlcihtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgKnVzZXJfdmFsdWVzKTsKKworLyoqIFN0b3AgcHJlc2VudGF0aW9uLiBQcmVzZXJ2ZSBGSUZPcy4gKi8KK2ludCBpbmxpbmUgYW9fc3RvcF9pbW1lZGlhdGVseShtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBGdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGltZW91dCBpbiBub24tYmxvY2tpbmcgbW9kZS4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgdG1wOworCXVpbnQzMl90IGN0cmw7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJLy9TdG9wIHN0YXRlIG1hY2hpbmUuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisKKwkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LgorCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJdG1wICY9CisJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisKKwkvL1Jlc2V0IHRyaWdnZXJpbmcgZmxhZworCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsKKwkJLy9TZXQgc2luZ2xlIG1vZGUsIGRpc3NhYmxlIEZJRk8sIGRpc3NhYmxlIGV4dGVybmFsIHRyaWdnZXIsIGJsb2NrIGludGVycnVwdC4KKwkJY3RybCA9IE1FNjAwMF9BT19NT0RFX1NJTkdMRTsKKworCQkvL0Jsb2NrIElTTS4KKwkJY3RybCB8PQorCQkgICAgKE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCS8vU2V0IHNwZWVkCisJCW91dGwoTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisJfQorCisJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisKKwkvL1NldCBvdXRwdXQgdG8gMFYKKwlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHg4MDAwKTsKKworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gMHg4MDAwOworCisJLy9TZXQgc3RhdHVzIHRvIHNpZ25hbCB0aGF0IGRldmljZSBpcyB1bmNvbmZpZ3VyZWQuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmM7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gSUQ9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJLy8gQ2hlY2tpbmcgcGFyYW1ldGVycworCWlmIChmbGFncykgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gTXVzdCBiZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvL1N0cmVhbSBoYXJkd2FyZSAod2l0aCBvciB3aXRob3V0IGZpZm8pCisJCWlmICgodHJpZ19lZGdlID09IE1FX1RSSUdfVFlQRV9TVykKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisKKwkJaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJCXN3aXRjaCAodHJpZ19lZGdlKSB7CisJCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCQl9CisJCX0KKworCQlpZiAoKHRyaWdfdHlwZSAhPSBNRV9UUklHX1RZUEVfU1cpCisJCSAgICAmJiAodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuIFRyaWdnZXIgbXVzdCBiZSBzb2Z0d2FyZSBvciBkaWdpdGFsLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCX0KKwl9IGVsc2UgewkJLy9TaW5nbGUKKwkJaWYgKHRyaWdfZWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU2luZ2xlIG91dHB1dCB0cmlnZ2VyIGhhc24ndCBvd24gZWRnZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisKKwkJaWYgKHRyaWdfdHlwZSAhPSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuIFRyaWdnZXIgbXVzdCBiZSBzb2Z0d2FyZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisKKwl9CisKKwlpZiAoKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkKKwkgICAgJiYgKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfQ0hBTjsKKwl9CisvKgorCWlmICgodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgJiYgKHRyaWdfY2hhbiAhPSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpKQorCXsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuIE11c3QgYmUgc3luY2hyb25vdXMgd2hlbiBkaWdpdGFsIGlzIGNob29zZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorKi8KKwlpZiAocmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgcmVmZXJlbmNlLiBBbmFsb2cgb3V0cHV0cyBoYXZlIHRvIGhhdmUgZ290IFJFRl9BT19HUk9VTkQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmIChzaW5nbGVfY29uZmlnICE9IDApIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuIE9ubHkgb25lIHJhbmdlIGZvciBhbmxvZyBvdXRwdXRzIGlzIGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLiBBbmFsb2cgb3V0cHV0IGhhdmUgb25seSBvbmUgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vU3ViZGV2aWNlIHJ1bm5pbmcgaW4gc3RyZWFtIG1vZGUhCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID49IGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzIDwgYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGJ1c3kuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKy8vLyBAbm90ZSBGb3Igc2luZ2xlIGFsbCBjYWxscyAoY29uZmlnIGFuZCB3cml0ZSkgYXJlIGVyYXNpbmcgcHJldmlvdXMgc3RhdGUhCisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisKKwkvLyBDb3JyZWN0IHNpbmdsZSBtaXJyb3JzCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvLyBTZXQgY29udHJvbCByZWdpc3Rlci4KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJLy8gU2V0IHN0b3AgYml0LiBTdG9wIHN0cmVhbWluZyBtb2RlIChJZiBydW5uaW5nLikuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJLy9SZXNldCBhbGwgYml0cy4KKwkJY3RybCA9CisJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKworCQkJaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfQU5ZKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQl9IGVsc2UgaWYgKHRyaWdfZWRnZSA9PSBNRV9UUklHX0VER0VfRkFMTElORykgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0gTUVfVFJJR19FREdFX1JJU0lORykgeworCQkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJCX0KKwkJfSBlbHNlIGlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQlQREVCVUcoIlNPRlRXQVJFIFRSSUdHRVJcbiIpOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQl9CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlQREVCVUcoIlNPRlRXQVJFIFRSSUdHRVJcbiIpOworCX0KKworCS8vIFNldCBwcmVsb2FkL3N5bmNocm9uaXphdGlvbiByZWdpc3Rlci4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCSAgICB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHg7CisJfQorCisJaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwl9IGVsc2UJCQkvL2lmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKQorCXsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHw9CisJCSAgICBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisJfQorCisJLy9SZXNldCBoYXJkd2FyZSByZWdpc3RlcgorCXN5bmMgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jKTsKKwlzeW5jICY9IH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJc3luYyB8PSBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkvL091dHB1dCBjb25maWd1cmVkIGluIGRlZmF1bHQgbW9kZSAoc2FmZSBvbmUpCisJb3V0bChzeW5jLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9OT05CTE9DS0lORykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuICVkXG4iLCBmbGFncyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA+PSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzIDw9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBub3QgY29uZmlndXJlZCB0byB3b3JrIGluIHNpbmdsZSBtb2RlIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisJaWYgKCghZmxhZ3MpICYmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpKSB7CS8vQmxvY2tpbmcgbW9kZS4gV2FpdCBmb3IgdHJpZ2dlci4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCQlpZiAoZGVsYXkgPT0gMCkKKwkJCQlkZWxheSA9IDE7CisJCX0KKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gVGhpcyBwcm9jZWR1cmUgaGFzIG93biB0aW1lb3V0LgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsKKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKworCQkqdmFsdWUgPQorCQkgICAgKCFlcnIpID8gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvIDogaW5zdGFuY2UtPgorCQkgICAgc2luZ2xlX3ZhbHVlOworCX0gZWxzZSB7CQkvL05vbi1ibG9ja2luZyBtb2RlCisJCS8vUmVhZCB2YWx1ZQorCQkqdmFsdWUgPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJdWludDMyX3Qgc3luY19tYXNrOworCXVpbnQzMl90IG1vZGU7CisKKwl1aW50MzJfdCB0bXA7CisKKy8vLyBXb3JrYXJvdW5kIGZvciBtaXgtbW9kZSAtIGJlZ2luCisJdWludDMyX3QgY3RybCA9IDB4MDsKKwl1aW50MzJfdCBzdGF0dXM7CisvLy8gV29ya2Fyb3VuZCBmb3IgbWl4LW1vZGUgLSBlbmQKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTIHwKKwkgICAgICBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkKKwkgICAgfHwgKGluc3RhbmNlLT5zdGF0dXMgPiBhb19zdGF0dXNfc2luZ2xlX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh2YWx1ZSAmIH5NRTYwMDBfQU9fTUFYX0RBVEEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHZhbHVlIHByb3ZpZGVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19WQUxVRV9PVVRfT0ZfUkFOR0U7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKy8vLyBAbm90ZSBGb3Igc2luZ2xlIGFsbCBjYWxscyAoY29uZmlnIGFuZCB3cml0ZSkgYXJlIGVyYXNpbmcgcHJldmlvdXMgc3RhdGUhCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAoZGVsYXkgPT0gMCkKKwkJCWRlbGF5ID0gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gdmFsdWU7CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgewkvLy8gV29ya2Fyb3VuZCBmb3IgbWl4LW1vZGUgLSBiZWdpbgorCQkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIGluc3RhbmNlLT50aW1lcl9yZWcpOworCQlQREVCVUdfUkVHKCJ0aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT50aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW50KU1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyk7CisJCWluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisKKwkJLy9TZXQgdGhlIGNvbnRpbm91cyBtb2RlLgorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0s7CisJCWN0cmwgfD0gTUU2MDAwX0FPX01PREVfQ09OVElOVU9VUzsKKworCQkvL1ByZXBhcmUgRklGTworCQlpZiAoIShjdHJsICYgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPKSkgewkvL0ZJRk8gd2Fzbid0IGVuYWJlbGVkLiBEbyBpdC4KKwkJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJfSBlbHNlIHsJLy9DaGVjayBpZiBGSUZPIGlzIGVtcHR5CisJCQlpZiAoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpIHsJLy9GSUZPIG5vdCBlbXB0eQorCQkJCVBJTkZPKCJSZXNldGluZyBGSUZPLlxuIik7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJCX0gZWxzZSB7CS8vRklGTyBlbXB0eSwgb25seSBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgZGlzYWJsZWQhCisJCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQl9CisJCX0KKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJLy9Xcml0ZSBvdXRwdXQgLSAxIHZhbHVlIHRvIEZJRk8KKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCW91dGwodmFsdWUgPDw9IDE2LCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJUERFQlVHX1JFRygiZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlIDw8PSAxNik7CisJCX0gZWxzZSB7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJUERFQlVHX1JFRygiZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlKTsKKwkJfQorCQkvLy8gV29ya2Fyb3VuZCBmb3IgbWl4LW1vZGUgLSBlbmQKKwl9IGVsc2UgewkJLy9ObyBGSUZPIC0gYWx3YXlzIGluIHNpbmdsZSBtb2RlCisJCS8vV3JpdGUgdmFsdWUKKwkJUERFQlVHKCJXcml0ZSB2YWx1ZVxuIik7CisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwltb2RlID0gKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzID4+IGluc3RhbmNlLT5hb19pZHg7CisJbW9kZSAmPSAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKTsKKworCVBJTkZPKCJUcmlnZ2VyaW5nIG1vZGU6IDB4JTA4eFxuIiwgbW9kZSk7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXN5bmNfbWFzayA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNfbWFzayk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgkJLy8weDAwMDAwMDAwOiBJbmRpdmlkdWFsIHNvZnR3YXJlCisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gMHgwKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KChNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyB8CisJCQkJICAgICAgIE1FNjAwMF9BT19TWU5DX0hPTEQpIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9IGVsc2UgewkvLyBObyBGSUZPIC0gU2luZ2xlIG1vZGU6IEluIHRoaXMgY2FzZSByZXNldHRpbmcgJ01FNjAwMF9BT19TWU5DX0hPTEQnIHdpbGwgdHJpZ2dlciBvdXRwdXQuCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU2MDAwX0FPX1NZTkNfSE9MRCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4gVGhpcyBpcyBleGNlcHRpb24uIEl0IGlzIHNldCB0byBzeW5jaHJvbm91cyBhbmQgdHJpZ2dlcmVkIGxhdGVyLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUc6CS8vMHgwMDAxMDAwMDogSW5kaXZpZHVhbCBoYXJkd2FyZQorCQlQREVCVUcoIkRJR0lUQUwgVFJJR0dFUlxuIik7CisJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmIChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgewkvLyBGSUZPIC0gQ29udGlub3VzIG1vZGUKKwkJCWlmICgoc3luY19tYXNrICYgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIE5vIEZJRk8gLSBTaW5nbGUgbW9kZQorCQkJaWYgKChzeW5jX21hc2sgJgorCQkJICAgICAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpKSAhPSBNRTYwMDBfQU9fU1lOQ19IT0xEKSB7CisJCQkJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUKKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlzeW5jX21hc2sgfD0KKwkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBNRTYwMDBfQU9fU1lOQ19IT0xEOgkvLzB4MDAwMDAwMDE6IFN5bmNocm9ub3VzIHNvZnR3YXJlCisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoKHN5bmNfbWFzayAmCisJCSAgICAgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpKSAhPQorCQkgICAgKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykpIHsKKwkJCS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJc3luY19tYXNrIHw9IE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJLy9TZXQgdHJpZ2dlcmluZyBmbGFnCisJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJYnJlYWs7CisKKwljYXNlIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpOgkvLzB4MDAwMTAwMDE6IFN5bmNocm9ub3VzIGhhcmR3YXJlCisJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKChzeW5jX21hc2sgJgorCQkgICAgICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KSkgIT0KKwkJICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CisJCQkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJc3luY19tYXNrIHw9CisJCQkgICAgKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICBpbnN0YW5jZS0+YW9faWR4OworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKwkJfQorCQkvL1NldCB0cmlnZ2VyaW5nIGZsYWcKKwkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQlicmVhazsKKwl9CisvLyAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOyAgICAgICAgLy8gTW92ZWQgZG93bi4KKworCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvL0FjdGl2YXRlIElTTSAocmVtb3ZlICdzdG9wJyBiaXRzKQorCQljdHJsICY9CisJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCQljdHJsIHw9IGluc3RhbmNlLT5jdHJsX3RyZzsKKwkJY3RybCAmPQorCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisvLy8gQG5vdGUgV2hlbiBmbGFnICdNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTJyBpcyBzZXQgdGhhbiBvdXRwdXQgaXMgdHJpZ2dlcmVkLiBBTFdBWVMhCisKKwlQSU5GTygiPCVzPiBzdGFydCBtb2RlPSAweCUwOHggJXNcbiIsIF9fRlVOQ1RJT05fXywgbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQkJb3V0bChzeW5jX21hc2sgfAorCQkJICAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2sgfCAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPCisJCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAweDgwMDApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2sgJiB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNfbWFzayk7CisqLworCQl9CisvLy8gQG5vdGUgVGhpcyBpcyBtaXgtbW9kZSBjYXNlLiBGb3Igbm93IEkgZG8gbm90IGhhdmUgcG9zc2liaWxpdHkgdG8gdHJpZ2dlciBmaXJzdCA0IGNoYW5uZWxzIChjb250aW5vdXMgbW9kZSkgYW5kIG90aGVyIChzaW5nbGUpIG9uZXMgYXQgb25jZS4KKy8vLyBAbm90ZSBCZWNhdXNlIHRyaWdnZXJpbmcgaXMgbm90IHdvcmtpbmcgaXQgY2FuIG5vdCBiZSBhZGQgdG8gc3luY2hyb25vdXMgbGlzdC4gRmlyc3QgNCBjaGFubmVscyBkb24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24sIGFueXdheS4KKwkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9IDB4RkZGRkZGRjA7CisJfSBlbHNlIHsJCS8vIE5vIEZJRk8gLSBTaW5nbGUgbW9kZQorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuCisJCQl0bXAgPSB+KCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8IDB4RkZGRjAwMDApOworCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzLiBtYXNrOjB4JTA4eFxuIiwKKwkJCSAgICAgdG1wKTsKKwkJCXRtcCB8PSBzeW5jX21hc2sgJiAweEZGRkYwMDAwOworCQkJLy8gQWRkIHRoaXMgY2hhbm5lbCB0byBsaXN0CisJCQl0bXAgJj0gfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfSBlbHNlIGlmICghbW9kZSkgewkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCW91dGwoc3luY19tYXNrICYKKwkJCSAgICAgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJIGluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfQorCisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OworCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJfQorCisJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50NjRfdCBjb252X3RpY2tzOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZIHwKKwkgICAgICBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlICE9IE1FX1RSSUdfVFlQRV9OT05FKSkgeworCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCX0KKworCWlmICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykgeworCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1RJTUVSKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKChjb252X3RpY2tzIDwgTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTKQorCSAgICB8fCAoY29udl90aWNrcyA+IE1FNjAwMF9BT19NQVhfQ0hBTl9USUNLUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCkgeworCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0xvdyB8fCB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfQVJHOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgIT0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQl9CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHOworCQkJfQorCQl9CisvLyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKy8vICAgICAgICAgICAgICAgICAgICAgIH0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdDaGFuKSB7CisJY2FzZSBNRV9UUklHX0NIQU5fREVGQVVMVDoKKwljYXNlIE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL1N0b3AgZGV2aWNlCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vQ2hlY2sgaWYgc3RhdGUgbWFjaGluZSBpcyBzdG9wcGVkLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkvL1Jlc2V0IGNvbnRyb2wgcmVnaXN0ZXIuIEJsb2NrIGFsbCBhY3Rpb25zLiBEaXNhYmxlIElSUS4gRGlzYWJsZSBGSUZPLgorCWN0cmwgPSBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU2MDAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNjAwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTYwMDBfQU9fRVhUX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IHJpc2luZy5cbiIpOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogZmFsbGluZy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IGJvdGggZWRnZXMuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJUElORk8oIkludGVybmFsIHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSAwOworCX0KKworCS8vU2V0IHRoZSBzdG9wIG1vZGUgYW5kIHZhbHVlLgorCWlmICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkgewkvL0Ftb3VudCBvZiBkYXRhCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTYwMDBfQU9fQUNRX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCX0gZWxzZSBpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mICdzY2FucycKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwl9IGVsc2UgewkJLy9JbmZpbml0ZQorCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU2MDAwX0FPX0lORl9TVE9QX01PREU7CisJCWluc3RhbmNlLT5zdG9wX2NvdW50ID0gMDsKKwl9CisKKwlQSU5GTygiU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CS8vU3luY2hyb25vdXMgc3RhcnQKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRDsKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgewkvL0V4dGVybmFseSB0cmlnZ2VyZWQKKwkJCVBJTkZPKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgYWN0aXZlLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRzsKKwkJfQorI2lmZGVmIE1FREVCVUdfSU5GTworCQllbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgZGlzc2FibGVkLlxuIik7CisJCX0KKyNlbmRpZgorCisJfQorCS8vU2V0IHNwZWVkCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb252X3RpY2tzIC0gMik7CisJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSAoaW50KShjb252X3RpY2tzICogSFopIC8gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOwkvLzw9PSBNVVNUIGJlIHdpdGggY2FzdCEKKworCS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9TZXQgc3RhdHVzLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCWxvbmcgajsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2lyY3VsYXIgYnVmZmVyIG5vdCBleGlzdHMuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoZSBidWZmZXIgaXMgTk9UIGZ1bGwuCisJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CQkvL1RoZSBidWZmZXIgaXMgZnVsbC4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQkJaWYgKHQgPT0gMCkKKwkJCQl0ID0gMTsKKwkJfSBlbHNlIHsJLy9NYXggdGltZS4KKwkJCXQgPSBMT05HX01BWDsKKwkJfQorCisJCSpjb3VudCA9IDA7CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gSW50ZXJydXB0cyBhcmUgd2hlbiBGSUZPIEhGIGlzIHNpZ25hbGVkLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKG1lX2NpcmNfYnVmX3NwYWNlCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSwKKwkJCQkJCSB0KTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsJLy9VZmYuLi4gYWxsIGlzIGdvb2QuIEluZm9ybSB1c2VyIGFib3V0IGVtcHR5IHNwYWNlLgorCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgY291bnQgPSAwOworCWludCBjaXJjX2J1ZmZlcl9jb3VudDsKKworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU2MDAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTYwMDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU2MDAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9IGVsc2UgewkJLy9CbG9jayBJUlEKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkvL0ZpbGwgRklGTyA8PSBHZW5lcmFseSB0aGlzIHNob3VsZCBiZSBkb25lIGJ5IHVzZXIgcHJlLWxvYWQgY2FsbCBidXQgdGhpcyBpcyBzZWNvbmQgcGxhY2UgdG8gZG8gaXQuCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy9GSUZPIGVtcHR5CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQ7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKE1FNjAwMF9BT19GSUZPX0NPVU5UIDwKKwkJCSAgICAgaW5zdGFuY2UtPgorCQkJICAgICBzdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOgorCQkJICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKwkvL1NldCBwcmUtbG9hZCBmZWF0dXJlcy4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJc3luY2ggJj0KKwkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzeW5jaCB8PQorCSAgICAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgJiB+TUU2MDAwX0FPX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4OworCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL0RlZmF1bHQgY291bnQgaXMgJzAnCisJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9IGVsc2UgewkJLy9XcmFwYXJvdW5kCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY291bnQ7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCS8vU3BlY2lhbCBjYXNlOiBJbmZpbml0ZSB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEZJRk8gZGF0YXMgYWx3YXlzIHNob3VsZCBydW5zIGluIGhhcmR3YXJlIG1vZGUuCisJCWlmICgoaW5zdGFuY2UtPnN0b3BfbW9kZSA9PSBNRTYwMDBfQU9fSU5GX1NUT1BfTU9ERSkKKwkJICAgICYmIChjaXJjX2J1ZmZlcl9jb3VudCA8PSBNRTYwMDBfQU9fRklGT19DT1VOVCkpIHsJLy9DaGFuZ2UgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUERFQlVHCisJCQkgICAgKCJDaGFuZ2VpbmcgbW9kZSBmcm9tIHNvZnR3YXJlIHdyYXBhcm91bmQgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJLy9Db3B5IGFsbCBkYXRhCisJCQljb3VudCA9CisJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY2lyY19idWZmZXJfY291bnQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0s7CisJCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQ7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiUFJFTE9BREVEIE1PUkUgVkFMVUVTIFRIQU4gQVJFIElOIEJVRkZFUiFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfQorCisJLy9TZXQgc3RhdHVzIHRvICd3YWl0IGZvciBzdGFydCcKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDsKKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJLy9TdGFydCBzdGF0ZSBtYWNoaW5lIGFuZCBpbnRlcnJ1cHRzCisJUElORk8oIjwlczolZD4gU3RhcnQgc3RhdGUgbWFjaGluZS5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCWN0cmwgJj0gfihNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJaWYgKGluc3RhbmNlLT5zdGFydF9tb2RlID09IE1FNjAwMF9BT19FWFRfVFJJRykgeworCQlQREVCVUcoIkRJR0lUQUwgVFJJR0dFUlxuIik7CisJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCX0KKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Nb3JlIHRoYW4gaGFsZiEKKwkJaWYgKChjdHJsICYgTUU2MDAwX0FPX0NUUkxfTU9ERV9NQVNLKSA9PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTKSB7CS8vRW5hYmxlIElSUSBvbmx5IHdoZW4gaGFyZHdhcmVfY29udGlub3VzIGlzIHNldCBhbmQgRklGTyBpcyBtb3JlIHRoYW4gaGFsZgorCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIF9fTElORV9fKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCX0KKwl9CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvL1RyaWdnZXIgb3V0cHV0CisJUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHgleCAlc1xuIiwgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+c3RhcnRfbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQlvdXRsKHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCS8vRmlyZQorCQlQSU5GTworCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCX0gZWxzZSBpZiAoIWluc3RhbmNlLT5zdGFydF9tb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgorCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpKTsKKyovCisJCS8vRmlyZQorCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHg4MDAwKTsKKworLyoKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworKi8KKwl9CisJLy8gU2V0IGNvbnRyb2wgdGFzaydzIHRpbWVvdXQKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vTGVzcyB0aGFuIGhhbGYgYnV0IG5vdCBlbXB0eSEKKwkJUElORk8oIkxlc3MgdGhhbiBoYWxmLlxuIik7CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID09IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgICgoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyKSA8CisJCQkgICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLworCQkJICAgIDIgOiBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQl9IGVsc2UgewkvL1dyYXBhcm91bmQKKwkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKworCQkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIF9fTElORV9fKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJfQorCS8vU3BlY2lhbCBjYXNlOiBMaW1pdGVkIHdyYXBhcm91bmQgd2l0aCBsZXNzIHRoYW4gSEFMRiBGSUZPIGRhdGFzIG5lZWQgd29yayBhcm91bmQgdG8gZ2VuZXJhdGUgZmlyc3QgaW50ZXJydXB0LgorCWlmICgoaW5zdGFuY2UtPnN0b3BfbW9kZSAhPSBNRTYwMDBfQU9fSU5GX1NUT1BfTU9ERSkKKwkgICAgJiYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19TV19XUkFQX01PREUpCisJICAgICYmIChjaXJjX2J1ZmZlcl9jb3VudCA8PSAoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyKSkpIHsJLy9QdXQgbW9yZSBkYXRhIHRvIEZJRk8KKwkJUElORk8oIkxpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJFUlJPUiBXSEVOIExPQURJTkcgVkFMVUVTIEZPUiBXUkFQQVJPVU5EIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCXdoaWxlIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID4gaW5zdGFuY2UtPmRhdGFfY291bnQpIHsJLy9NYXhpbXVtIGRhdGEgbm90IHNldCBqZXQuCisJCQkvL0NvcHkgdG8gYnVmZmVyCisJCQlpZiAoY2lyY19idWZmZXJfY291bnQgIT0gYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY2lyY19idWZmZXJfY291bnQsIDApKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJFUlJPUiBXSEVOIExPQURJTkcgVkFMVUVTIEZPUiBXUkFQQVJPVU5EIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY2lyY19idWZmZXJfY291bnQ7CisKKwkJCWlmICghKChzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL0ZJRk8gaXMgbW9yZSB0aGFuIGhhbGYuIEVuYWJsZSBJUlEgYW5kIGVuZCBjb3B5LgorCQkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisJCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyBTY2hlZHVsZSBjb250cm9sIHRhc2sKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsJLy9XYWl0IGZvciBzdGFydC4KKwkJcmVmID0gamlmZmllczsKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUERFQlVHKCJTdGFydGluZyBzdHJlYW0gY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSByZWYpID49IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSByZWYpID4gZGVsYXkpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIFNpZ25hbCBjb21lIGJ1dCBzdGF0dXMgaXMgc3RyYW5nZTogJWRcbiIsCisJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHdhaXQgIT0gTUVfV0FJVF9OT05FKSAmJiAod2FpdCAhPSBNRV9XQUlUX0lETEUpKSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dBSVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19CVVNZOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJZGVmYXVsdDoKKwkJKnN0YXR1cyA9CisJCSAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkgPworCQkgICAgTUVfU1RBVFVTX0JVU1kgOiBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh3YWl0ID09IE1FX1dBSVRfSURMRSkgJiYgKCpzdGF0dXMgPT0gTUVfU1RBVFVTX0JVU1kpKSB7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpKSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiV2FpdCBmb3IgSURMRSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBmb3IgSURMRSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CQkJCS8vLyBAbm90ZSBTdG9wIHdvcmsgYW5kIGVtcHR5IGJ1ZmZlciBhbmQgRklGTworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdm9sYXRpbGUgdWludDMyX3QgY3RybDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVE9QX1BSRVNFUlZFX0JVRkZFUlMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpCisJICAgICYmIChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdG9wIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwl9CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpIHsKKwkJLy9UaGVyZSBpcyBub3RoaW5nIHRvIHN0b3AhCisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBpbiBzdHJlYW1pbmcgbW9kZS4gJWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL01hcmsgYXMgc3RvcHBpbmcuID0+IFNvZnR3YXJlIHN0b3AuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisKKwlpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpIHsJLy9TdG9wcGVkIG5vdyEKKwkJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpICYgTUU2MDAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQlpZiAoY3RybCA9PSBNRTYwMDBfQU9fTU9ERV9XUkFQQVJPVU5EKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZCA9PiBIYXJkd2FyZSBzdG9wLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX1NUT1A7CisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCQl9CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJTdG9wcGluZyBzdHJlYW0gY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJTdG9wcGluZyBzdHJlYW0gaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IEZJRk8KKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCWlmICghZmxhZ3MpIHsJCS8vUmVzZXQgc29mdHdhcmUgYnVmZmVyCisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHJlZ19jb3B5OworCisJaW50IGNvcGllZF9mcm9tX3VzZXIgPSAwOworCWludCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyID0gKmNvdW50OworCisJaW50IGNvcGllZF92YWx1ZXM7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vQ2hlY2tpbmcgYXJndW1lbnRzCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCpjb3VudCA8PSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb3VudCBvZiB2YWx1ZXMgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCX0KKworCWlmICh2YWx1ZXMgPT0gTlVMTCkgeworCQlQRVJST1IoIkludmFsaWQgYWRkcmVzcyBvZiB2YWx1ZXMgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1BPSU5URVI7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB8fCAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQpKSB7CS8vVGhlIGRldmljZSBpcyBpbiBzaW5nbGUgbW9kZS4KKwkJUEVSUk9SCisJCSAgICAoIlN1YmRldmljZSBtdXN0IGJlIHByZWluaXRpYWxpemUgY29ycmVjdGx5IGZvciBzdHJlYW1pbmcuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlzd2l0Y2ggKHdyaXRlX21vZGUpIHsKKwljYXNlIE1FX1dSSVRFX01PREVfUFJFTE9BRDoKKworCQkvL0RldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HOgorCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJLy8vIEBub3RlIEluIGJsb2NraW5nIG1vZGU6IFdoZW4gZGV2aWNlIGlzIG5vdCBydW5pbmcgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2h0IHNwYWNlIGNhbGwgd2lsbCBibG9ja2VkIHVwIQorCQkvLy8gQG5vdGUgU29tZSBvdGhlciB0aHJlYWQgbXVzdCBlbXB0eSBidWZmZXIgYnkgc3RyYXRpbmcgZW5naW5lLgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB3cml0ZSBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCX0KKworCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNjAwMF9BT19XUkFQX01PREUpIHsJLy9XcmFwYXJvdW5kIG1vZGUuIERldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19IV19XUkFQX01PREUpCisJICAgICYmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfUFJFTE9BRCkpIHsKKy8qCisJCVBFUlJPUigiT25seSAncHJlLWxvYWQnIHdyaXRlIGlzIGFjY2VwdGFibGUgaW4gaGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisqLworCQkvL1RoaXMgaXMgdHJhbnNwYXJlbnQgZm9yIHVzZXIuCisJCVBERUJVRygiQ2hhbmdpbmcgd3JpdGVfbW9kZSB0byBNRV9XUklURV9NT0RFX1BSRUxPQUQuXG4iKTsKKwkJd3JpdGVfbW9kZSA9IE1FX1dSSVRFX01PREVfUFJFTE9BRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAod3JpdGVfbW9kZSA9PSBNRV9XUklURV9NT0RFX1BSRUxPQUQpIHsJLy9Jbml0IGVudmlyb21lbnQgLSBwcmVsb2FkCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCS8vQ2hlY2sgRklGTworCQlpZiAoIShyZWdfY29weSAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIG5vdCBhY3RpdmUuIEVuYWJsZSBpdC4KKwkJCXJlZ19jb3B5IHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJCW91dGwocmVnX2NvcHksIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgcmVnX2NvcHkpOworCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0KKworCXdoaWxlICgxKSB7CisJCS8vQ29weSB0byBidWZmZXIuIFRoaXMgc3RlcCBpcyBjb21tb24gZm9yIGFsbCBtb2Rlcy4KKwkJY29waWVkX2Zyb21fdXNlciA9CisJCSAgICBhb19nZXRfZGF0YV9mcm9tX3VzZXIoaW5zdGFuY2UsIGxlZnRfdG9fY29weV9mcm9tX3VzZXIsCisJCQkJCSAgdmFsdWVzICsgKCpjb3VudCAtCisJCQkJCQkgICAgbGVmdF90b19jb3B5X2Zyb21fdXNlcikpOworCQlsZWZ0X3RvX2NvcHlfZnJvbV91c2VyIC09IGNvcGllZF9mcm9tX3VzZXI7CisKKwkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pICYmICEocmVnX2NvcHkgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vQlJPS0VOIFBJUEUhIFRoZSBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BlZCBidXQgbG9naWNhbCBzdGF0dXMgc2hvdyB0aGF0IHNob3VsZCBiZSB3b3JraW5nLgorCQkJUEVSUk9SKCJCcm9rZW4gcGlwZSBpbiB3cml0ZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pICYmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fQ09OVElOT1VTKSAmJiAocmVnX2NvcHkgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Db250aW5vdXMgbW9kZSBydW5pbmcgYW5kIGRhdGEgYXJlIGJlbG93IGhhbGYhCisKKwkJCS8vIEJsb2NrIGludGVycnVwdHMuCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXJlZ19jb3B5ICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwocmVnX2NvcHksIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgcmVnX2NvcHkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJLy9GYXN0IGNvcHkKKwkJCWNvcGllZF92YWx1ZXMgPQorCQkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIE1FNjAwMF9BT19GSUZPX0NPVU5UIC8gMiwKKwkJCQkJICAwKTsKKwkJCWlmIChjb3BpZWRfdmFsdWVzID4gMCkgeworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvcGllZF92YWx1ZXM7CisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0KKwkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkJLy8gQWN0aXZhdGUgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJcmVnX2NvcHkgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmIChjb3BpZWRfdmFsdWVzID09IDApIHsJLy9UaGlzIHdhcyBjaGVja2VkIGFuZCBuZXZlciBzaG91bGQgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggMCFcbiIpOworCQkJfQorCisJCQlpZiAoY29waWVkX3ZhbHVlcyA8IDApIHsJLy9UaGlzIHdhcyBjaGVja2VkIGFuZCBuZXZlciBzaG91bGQgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSB7CS8vQWxsIGRhdGFzIHdlcmUgY29waWVkLgorCQkJYnJlYWs7CisJCX0gZWxzZSB7CS8vTm90IGFsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNjAwMF9BT19XUkFQX01PREUpIHsJLy9FcnJvciB0b28gbXVjaCBkYXRhcyEgV3JhcGFyb3VuZCBpcyBsaW1pdGVkIGluIHNpemUhCisJCQkJUEVSUk9SCisJCQkJICAgICgiVG9vIG11Y2ggZGF0YSBmb3Igd3JhcGFyb3VuZCBtb2RlISAgRXhjZWVkZWQgc2l6ZSBvZiAlbGQuXG4iLAorCQkJCSAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMSk7CisJCQkJZXJyID0gTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfQkxPQ0tJTkcpIHsJLy9Ob24gYmxvY2tpbmcgY2FsbHMKKwkJCQlicmVhazsKKwkJCX0KKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGNpcmNfYnVmKSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgewkvL1Jlc2V0CisJCQkJUEVSUk9SKCJXcml0aW5nIGludGVycnVwdGVkIGJ5IHJlc2V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vQ29weSBkYXRhIHRvIEZJRk8gLSBwcmVsb2FkCisJCWNvcGllZF92YWx1ZXMgPQorCQkgICAgYW9fd3JpdGVfZGF0YV9wb29saW5nKGluc3RhbmNlLCBNRTYwMDBfQU9fRklGT19DT1VOVCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCisJCWlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0hXX1dSQVBfTU9ERSkKKwkJICAgICYmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgPgorCQkJTUU2MDAwX0FPX0ZJRk9fQ09VTlQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZSEgRXhjZWVkZWQgc2l6ZSBvZiAlZC5cbiIsCisJCQkgICAgIE1FNjAwMF9BT19GSUZPX0NPVU5UKTsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQl9CisJfQorCisJKmNvdW50ID0gKmNvdW50IC0gbGVmdF90b19jb3B5X2Zyb21fdXNlcjsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU2MDAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNjAwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJdWludDMyX3QgaXJxX3N0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEoaXJxX3N0YXR1cyAmIChNRTYwMDBfSVJRX1NUQVRVU19CSVRfQU9fSEYgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CisJCVBJTkZPKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogSUQ9JWQ6IHN0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5hb19pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIkNJUkNVTEFSIEJVRkZFUiBOT1QgRVhJU1RTIVxuIik7CisJCS8vQmxvY2sgaW50ZXJydXB0cy4gU3RvcCBtYWNoaW5lLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9CisJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL0luZm9ybSB1c2VyCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL1RvbyBsYXRlLiBOb3Qgd29ya2luZyEgRU5EPyBCUk9LRU4gUElQRT8KKwkJLy8vIEBub3RlIEVycm9yIGNoZWNraW5nIHdhcyBtb3ZlZCB0byBzZXBhcmF0ZSB0YXNrLgorCQlQREVCVUcoIkludGVycnVwdCBjb21lIGJ1dCBJU00gaXMgbm90IHdvcmtpbmchXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJLy8vIEBub3RlIFVzZXIgbm90aWZpY2F0aW9uIHdhcyBhbHNvIG1vdmVkIHRvIHNlcGFyYXRlIHRhc2suCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLy9HZW5lcmFsIHByb2NlZHVyZS4gUHJvY2VzcyBtb3JlIGRhdGFzLgorCisjaWZkZWYgTUVERUJVR19ERUJVRworCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vQnVmZmVyIGlzIGVtcHR5IQorCQlQREVCVUcoIkNpcmN1bGFyIGJ1ZmZlciBlbXB0eSFcbiIpOworCX0KKyNlbmRpZgorCisJLy9DaGVjayBGSUZPCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vT0sgbGVzcyB0aGFuIGhhbGYKKworCQkvL0Jsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlkbyB7CisJCQkvL0NhbGN1bGF0ZSBob3cgbWFueSBzaG91bGQgYmUgY29waWVkLgorCQkJY291bnQgPQorCQkJICAgIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KSA/IGluc3RhbmNlLT4KKwkJCSAgICBzdG9wX2RhdGFfY291bnQgLQorCQkJICAgIGluc3RhbmNlLT5kYXRhX2NvdW50IDogTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJaWYgKE1FNjAwMF9BT19GSUZPX0NPVU5UIC8gMiA8IGNvdW50KSB7CisJCQkJY291bnQgPSBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQl9CisJCQkvL0NvcHkgZGF0YQorCQkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCQljb3VudCA9IGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19TV19XUkFQX01PREUpICYmICgoY3RybCAmIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU2MDAwX0FPX01PREVfQ09OVElOVU9VUykpIHsJLy9XcmFwYXJvdW5kIChzb2Z0d2FyZSkKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSB7CS8vV2Ugc3RvcGluZyA9PiBDb3B5IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCX0gZWxzZSB7CS8vQ29weSBpbiB3cmFwYXJvdW5kIG1vZGUuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChpbnN0YW5jZSwKKwkJCQkJCQkJICAgICBjb3VudCwKKwkJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgcHJlbG9hZGVkX2NvdW50KTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICU9CisJCQkJCSAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgY2lyY19idWYpOworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoY291bnQgPD0gMCkgfHwgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSkgewkvL0VuZCBvZiB3b3JrLgorCQkJCWJyZWFrOworCQkJfQorCQl9CQkvL1JlcGVhdCBpZiBzdGlsbCBpcyB1bmRlciBoYWxmIGZpZm8KKwkJd2hpbGUgKChzdGF0dXMgPQorCQkJaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRik7CisKKwkJLy9VbmJsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlpZiAoY291bnQgPj0gMCkgewkvL0NvcHkgd2FzIHN1Y2Nlc3NmdWwuCisJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gTm8gbW9yZSBpbnRlcnJ1cHRzLgorCQkJCVBERUJVRygiRmluaXNoaW5nIHdvcmsuIEludGVycnVwdCBkaXNhYmxlZC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCQkJfSBlbHNlIGlmIChjb3VudCA+IDApIHsJLy9Ob3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC4KKwkJCQlQREVCVUcoIk5vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LlxuIik7CisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0gZWxzZSB7CS8vTm9ybWFsIHdvcmsgYnV0IHRoZXJlIGFyZSBubyBtb3JlIGRhdGEgaW4gYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC4gc3RyZWFtX3dyaXRlKCkgd2lsbCB1bmJsb2NrIGl0LgorCQkJCVBERUJVRworCQkJCSAgICAoIk5vIGRhdGEgaW4gc29mdHdhcmUgYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC5cbiIpOworCQkJfQorCQl9IGVsc2UgewkvL0Vycm9yIGR1cmluZyBjb3B5LgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfSBlbHNlIHsJCS8vPz8gbW9yZSB0aGFuIGhhbGYKKwkJUERFQlVHCisJCSAgICAoIkludGVycnVwdCBjb21lIGJ1dCBGSUZPIG1vcmUgdGhhbiBoYWxmIGZ1bGwhIFJlc2V0IGludGVycnVwdC5cbiIpOworCX0KKworCVBJTkZPKCJJU1I6IEJ1ZmZlciBjb3VudDogJWQuKFQ6JWQgSDolZClcbiIsCisJICAgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwKKwkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCk7CisJUElORk8oIklTUjogU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisJUElORk8oIklTUjogU3RvcCBkYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpOworCVBJTkZPKCJJU1I6IERhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPmRhdGFfY291bnQpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9JbmZvcm0gdXNlcgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU2MDAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJaWYgKGluc3RhbmNlLT5pcnEpIHsKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5pcnEgPSAwOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICAgICAgUEFHRV9TSElGVCA8PCBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNjAwMF9hb19zdWJkZXZpY2VfdCAqbWU2MDAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICB1aW50MzJfdCAqIHRyaWdnZXJpbmdfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgZmlmbywKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIGludCBoaWdoX3JhbmdlLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd3EpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQgSUQ9JWQuXG4iLCBhb19pZHgpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTYwMDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisJc3ViZGV2aWNlLT50cmlnZ2VyaW5nX2ZsYWdzID0gdHJpZ2dlcmluZ19mbGFnczsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJaWYgKHN1YmRldmljZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPQorCQkgICAgKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJCSAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlQREVCVUcoImNpcmNfYnVmID0gJXAgc2l6ZT0lbGRcbiIsIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkgICAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCisJCWlmICghc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IDA7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJc3ViZGV2aWNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlzdWJkZXZpY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBJbml0aWFsaXplIHNpbmdsZSB2YWx1ZSB0byAwViAqLworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvKiBJbml0aWFsaXplIHJhbmdlIGJvYXJkZXJzICovCisJaWYgKGhpZ2hfcmFuZ2UpIHsKKwkJc3ViZGV2aWNlLT5taW4gPSBNRTYwMDBfQU9fTUlOX1JBTkdFX0hJR0g7CisJCXN1YmRldmljZS0+bWF4ID0gTUU2MDAwX0FPX01BWF9SQU5HRV9ISUdIOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+bWluID0gTUU2MDAwX0FPX01JTl9SQU5HRTsKKwkJc3ViZGV2aWNlLT5tYXggPSBNRTYwMDBfQU9fTUFYX1JBTkdFOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KKworCWlmIChzdWJkZXZpY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJCWlmIChyZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU2MDAwX2FvX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCU1FNjAwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgICAgIFBBR0VfU0hJRlQgPDwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+aXJxID0gMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCS8vIE9ubHkgc3RyZWFtZWQgc3ViZGV2aWNlcyBzdXBwb3J0IGludGVycnVwdHMuIEZvciB0aGUgcmVzdCB0aGlzIHJlZ2lzdGVyIGhhcyBubyBtZWFuaW5nLgorCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fUFJFTE9BRF9SRUc7CisKKwlpZiAoYW9faWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfU0lOR0xFX1JFRzsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUc7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+aXJxX3Jlc2V0X3JlZyA9CisJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9JUlFfUkVTRVRfUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9TSU5HTEVfUkVHOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDMpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAzX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfU0lOR0xFX1JFRzsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPX0RVTVk7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRzsKKwkJaWYgKGFvX2lkeCA9PSA0KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDUpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gNikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSA3KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDgpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gOSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMykgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xM19TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBTVUJERVZJQ0UgSUQ9JWQhIiwgYW9faWR4KTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCQlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLgorCQkJCQkgICBidWYsIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCX0KKwkJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNjAwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU2MDAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9CisJICAgIG1lNjAwMF9hb19pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGF0dXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lNjAwMF9hb19pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZTYwMDBfYW9fcXVlcnlfdGltZXI7CisKKwkvL3ByZXBhcmUgd29yayBxdWV1ZSBhbmQgd29yayBmdW5jdGlvbgorCXN1YmRldmljZS0+bWU2MDAwX3dvcmtxdWV1ZSA9IG1lNjAwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssIG1lNjAwMF9hb193b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywKKwkJCSAgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJaWYgKHN1YmRldmljZS0+ZmlmbykgewkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIHN1YmRldmljZS0+dGltZXJfcmVnKTsKKwkJc3ViZGV2aWNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworaW50IGlubGluZSBhb19zdG9wX2ltbWVkaWF0ZWx5KG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IGN0cmw7CisJaW50IHRpbWVvdXQ7CisJaW50IGk7CisJdWludDMyX3Qgc2luZ2xlX21hc2s7CisKKwlzaW5nbGVfbWFzayA9CisJICAgIChpbnN0YW5jZS0+YW9faWR4IC0gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUIDwKKwkgICAgIDApID8gMHgwMDAwIDogKDB4MDAwMSA8PCAoaW5zdGFuY2UtPmFvX2lkeCAtCisJCQkJICAgICAgIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCkpOworCisJdGltZW91dCA9CisJICAgIChpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA+CisJICAgICAoSFogLyAxMCkpID8gaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgOiBIWiAvIDEwOworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQljdHJsICY9CisJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBzaW5nbGVfbWFzaykpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCVBJTkZPKCI8JXM+IFdhaXQgZm9yIHN0b3A6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworCisJCS8vU3RpbGwgd29ya2luZyEKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA+IHRpbWVvdXQpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KSBpbiB3cmFwYXJvdW5kLgorKiBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24uIENoZWNraW5nIGlzIGRvbmUgYXQgYmVnaW5pbmcgYW5kIGVuZCBvbmx5LgorKiBAbm90ZSBUaGUgaXMgbm90IHJlYXNvbmFibGUgd2F5IHRvIGNoZWNrIGhvdyBtYW55IHdhbHVlcyB3YXMgaW4gRklGTyBhdCBiZWdpbmluZy4gVGhlIGNvdW50IG11c3QgYmUgbWFuYWdlZCBleHRlcm5hbHkuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE1heGltdW0gbnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcGFyYW0gc3RhcnRfcG9zIFBvc2l0aW9uIG9mIHRoZSBmaXJzIHZhbHVlIGluIGJ1ZmZlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JTm8gZGF0YXMgd2VyZSBjb3BpZWQgPT4gbm8gZGF0YSBpbiBidWZmZXIuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChpIDwgbG9jYWxfY291bnQpIHsKKwkJLy9HZXQgdmFsdWUgZnJvbSBidWZmZXIKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQkvL1ByZXBhcmUgaXQKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisKKwkJcG9zKys7CisJCXBvcyAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwkJaWYgKHBvcyA9PSBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgeworCQkJcG9zID0gaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWw7CisJCX0KKwkJaSsrOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRkYpKSB7CS8vRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhCisJCVBFUlJPUigiaWR4PSVkIEZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIVxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCX0gZWxzZSB7CQkvL0FkZCBsYXN0IHZhbHVlCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJUElORk8oImlkeD0lZCBXUkFQQVJPVU5EIExPQURFRCAlZCB2YWx1ZXNcbiIsIGluc3RhbmNlLT5hb19pZHgsCisJICAgICAgbG9jYWxfY291bnQpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBzb2Z0d2FyZSBidWZmZXIgdG8gZmlmbyAoZmFzdCkuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YShtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IG1heF9jb3VudDsKKwlpbnQgaSA9IDE7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlyZXR1cm4gMDsKKwl9CisKKwltYXhfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgLSBzdGFydF9wb3M7CisJaWYgKG1heF9jb3VudCA8PSAwKSB7CS8vTm8gZGF0YSB0byBjb3B5IQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF4X2NvdW50IDwgY291bnQpIHsKKwkJbG9jYWxfY291bnQgPSBtYXhfY291bnQ7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJpZHg9JWQgRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiaWR4PSVkIEZBU1QgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwgbG9jYWxfY291bnQpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBzb2Z0d2FyZSBidWZmZXIgdG8gZmlmbyAoc2xvdykuCisqIEBub3RlIFRoaXMgaXMgc2xvdyBmdW5jdGlvbiB0aGF0IGNvcHkgYWxsIGRhdGEgZnJvbSBidWZmZXIgdG8gRklGTyB3aXRoIGZ1bGwgY29udHJvbC4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgdmFsdWVzLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCUZJRk8gd2FzIGZ1bGwgYXQgYmVnaW5pbmcuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19SSU5HX0JVRkZFUl9VTkRFRkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3Bvb2xpbmcobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgc2xvdyBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgaTsKKwlpbnQgbWF4X2NvdW50OworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJUEVSUk9SKCJpZHg9JWQgU0xPVyBMT0FERUQ6IFdyb25nIGNvdW50IVxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCVBFUlJPUigiaWR4PSVkIFNMT1cgTE9BREVEOiBObyBkYXRhIHRvIGNvcHkhXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbG9jYWxfY291bnQ7IGkrKykgeworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwhCisJCQlyZXR1cm4gaTsKKwkJfQorCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKworCVBJTkZPKCJpZHg9JWQgU0xPVyBMT0FERUQgJWQgdmFsdWVzXG4iLCBpbnN0YW5jZS0+YW9faWR4LCBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZGF0YXMgaW4gdXNlciBzcGFjZS4KKyogQHBhcmFtIHVzZXJfdmFsdWVzIEJ1ZmZlcidzIHBvaW50ZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19JTlRFUk5BTC4KKyovCitpbnQgaW5saW5lIGFvX2dldF9kYXRhX2Zyb21fdXNlcihtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgKnVzZXJfdmFsdWVzKQoreworCWludCBpLCBlcnI7CisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQ7CisJaW50IHZhbHVlOworCisJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkvL1dlIGhhdmUgb25seSB0aGlzIHNwYWNlIGZyZWUuCisJY29waWVkID0gKGNvdW50IDwgZW1wdHlfc3BhY2UpID8gY291bnQgOiBlbXB0eV9zcGFjZTsKKwlmb3IgKGkgPSAwOyBpIDwgY29waWVkOyBpKyspIHsJLy9Db3B5IGZyb20gdXNlciB0byBidWZmZXIKKwkJaWYgKChlcnIgPSBnZXRfdXNlcih2YWx1ZSwgKGludCAqKSh1c2VyX3ZhbHVlcyArIGkpKSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiaWR4PSVkIEJVRkZFUiBMT0FERUQ6IGdldF91c2VyKDB4JXApIHJldHVybiBhbiBlcnJvcjogJWRcbiIsCisJCQkgICAgIGluc3RhbmNlLT5hb19pZHgsIHVzZXJfdmFsdWVzICsgaSwgZXJyKTsKKwkJCXJldHVybiAtTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwkJLy8vIEBub3RlIFRoZSBhbmFsb2cgb3V0cHV0IGluIG1lNjAwMCBzZXJpZXMgaGFzIHNpemUgb2YgMTYgYml0cy4KKwkJKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpID0KKwkJICAgICh1aW50MTZfdCkgdmFsdWU7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCX0KKworCVBJTkZPKCJpZHg9JWQgQlVGRkVSIExPQURFRCAlZCB2YWx1ZXNcbiIsIGluc3RhbmNlLT5hb19pZHgsIGNvcGllZCk7CisJcmV0dXJuIGNvcGllZDsKK30KKworc3RhdGljIHZvaWQgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwkJCQkJICAgICAgIHZvaWQgKnN1YmRldmljZQorI2Vsc2UKKwkJCQkJICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaworI2VuZGlmCisgICAgKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCByZXNjaGVkdWxlID0gMDsKKwlpbnQgc2lnbmFsaW5nID0gMDsKKwl1aW50MzJfdCBzaW5nbGVfbWFzazsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworI2Vsc2UKKwlpbnN0YW5jZSA9CisJICAgIGNvbnRhaW5lcl9vZigodm9pZCAqKXdvcmssIG1lNjAwMF9hb19zdWJkZXZpY2VfdCwgYW9fY29udHJvbF90YXNrKTsKKyNlbmRpZgorCVBJTkZPKCI8JXM6ICVsZD4gZXhlY3V0ZWQuIGlkeD0lZFxuIiwgX19GVU5DVElPTl9fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworLy8vIEBub3RlIEFPX1NUQVRVU19CSVRfRlNNIGRvZXNuJ3Qgd29yayBhcyBzaG91bGQgYmUgZm9yIHB1cmUgc2luZ2xlIGNoYW5uZWxzIChpZHg+PTQpCisvLyAgICAgIHNpbmdsZV9tYXNrID0gKGluc3RhbmNlLT5hb19pZHgtTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUIDwgMCkgPyAweDAwMDAgOiAoMHgwMDAxIDw8IChpbnN0YW5jZS0+YW9faWR4LU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCkpOworCXNpbmdsZV9tYXNrID0gKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICYgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKworCQkvLyBOb3QgY29uZmlndXJlZCBmb3Igd29yay4KKwljYXNlIGFvX3N0YXR1c19ub25lOgorCQlicmVhazsKKworCQkvL1RoaXMgYXJlIHN0YWJsZSBtb2Rlcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKD8pCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBFUlJPUigiU2hvdWxkbid0IGJlIHJ1bm5pbmchLlxuIik7CisJCWJyZWFrOworCisJCS8vIFNpbmdsZSBtb2RlcworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKwkJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vIEV4dHJhIHJlZ2lzdGVycy4KKwkJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4KKwkJCQlpZiAoKChpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykKKwkJCQkgICAgICYmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSkpCisJCQkJICAgIHx8ICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkpIHsJLy8gU2luZ2xlIGlzIGluIGVuZCBzdGF0ZS4KKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIlNpbmdsZSBjYWxsIGhhcyBiZWVuIGNvbXBsaXRlZC5cbiIpOworCisJCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0KKwkJCQkJICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbzsKKworCQkJCQkvLyBTZXQgc3RhdHVzIGFzICdhb19zdGF0dXNfc2luZ2xlX2VuZCcKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCWlmICgoc2luZ2xlX21hc2spICYmICgqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJiAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSkpIHsJLy8gVGhpcyBpcyBvbmUgb2Ygc3luY2hyb25vdXMgc3RhcnQgY2hhbm5lbHMuIFNldCBhbGwgYXMgdHJpZ2dlcmVkLgorCQkJCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzID0KKwkJCQkJCSAgICAweDAwMDAwMDAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy9TZXQgdGhpcyBjaGFubmVsIGFzIHRyaWdnZXJlZCAobm9uZSBhY3RpdmUpLgorCQkJCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9CisJCQkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJCX0KKwkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCQlzaWduYWxpbmcgPSAxOworCQkJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCQkJcmVzY2hlZHVsZSA9IDE7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gQ2hlY2sgdGltZW91dC4KKwkJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkJICBjcHVfZmxhZ3MpOworCQkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQljdHJsIHw9CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCWN0cmwgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCQljdHJsICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJCQkvL0Rpc2FibGluZyBGSUZPCisJCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCisJCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJc3luY2ggJj0KKwkJCQkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8CisJCQkJICAgICAgIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTyAtIHNldCB0byBzaW5nbGUgc2FmZSBtb2RlCisJCQkJCXN5bmNoIHw9CisJCQkJCSAgICBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT4KKwkJCQkJICAgIGFvX2lkeDsKKwkJCQl9CisJCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNoKTsKKwkJCQkvL1NldCB0aGlzIGNoYW5uZWwgYXMgdHJpZ2dlcmVkIChub25lIGFjdGl2ZSkuCisJCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9CisJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9CisJCQkJICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJfQorCQl9IGVsc2UgewkvLyBObyBleHRyYSByZWdpc3RlcnMuCisvKgorCQkJCWlmICghKHN0YXR1cyAmIHNpbmdsZV9tYXNrKSkKKwkJCQl7Ly8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4KKwkJCQkJUERFQlVHKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbzsKKworCQkJCQkvLyBTZXQgc3RhdHVzIGFzICdhb19zdGF0dXNfc2luZ2xlX2VuZCcKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCQlzaWduYWxpbmcgPSAxOworCQkJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCQkJcmVzY2hlZHVsZSA9IDE7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorKi8KKwkJCWlmICghc2luZ2xlX21hc2spIHsJLy8gV2FzIHRyaWdnZXJlZC4KKwkJCQlQREVCVUcoIlNpbmdsZSBjYWxsIGhhcyBiZWVuIGNvbXBsaXRlZC5cbiIpOworCisJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9CisJCQkJICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbzsKKworCQkJCS8vIFNldCBzdGF0dXMgYXMgJ2FvX3N0YXR1c19zaW5nbGVfZW5kJworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIENoZWNrIHRpbWVvdXQuCisJCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisKKwkJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCXN5bmNoICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY2ggfD0KKwkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNoKTsKKwkJCQkvL1NldCB0aGlzIGNoYW5uZWwgYXMgdHJpZ2dlcmVkIChub25lIGFjdGl2ZSkuCisJCQkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9CisJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJCS8vIFJlc3RvcmUgb2xkIHNldHRpbmdzLgorCQkJCVBERUJVRygiV3JpdGUgb2xkIHZhbHVlIGJhY2sgdG8gcmVnaXN0ZXIuXG4iKTsKKwkJCQlvdXRsKGluc3RhbmNlLT5zaW5nbGVfdmFsdWUsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSk7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfQorCisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmQ6CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvLyBFeHRyYSByZWdpc3RlcnMuCisJCQlpZiAoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZyBidXQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gZW5kLiBGb3JjZSBzdG9wLgorCisJCQkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMgYW5kIHRyaWdnZXIuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1A7CisJCQljdHJsICY9CisJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisJCX0gZWxzZSB7CS8vIE5vIGV4dHJhIHJlZ2lzdGVycy4KKy8qCisJCQkJaWYgKHN0YXR1cyAmIHNpbmdsZV9tYXNrKQorCQkJCXsvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcgYnV0IHRoZSBzdGF0dXMgaXMgc2V0IHRvIGVuZC4gRm9yY2Ugc3RvcC4KKworCQkJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJCQlyZXNjaGVkdWxlID0gMTsKKwkJCQl9CisqLworCQl9CisJCWJyZWFrOworCisJCS8vIFN0cmVhbSBtb2RlcworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8KKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0YXJ0IGZpbmlzaC4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bjsKKworCQkJLy8gU2lnbmFsIGVuZCBvZiB0aGlzIHN0ZXAKKwkJCXNpZ25hbGluZyA9IDE7CisJCX0gZWxzZSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy8gRklGTyBpcyBlbXB0eS4gUHJvY2VkdXJlIGhhcyBzdGFydGVkIGFuZCBmaW5pc2ggYWxyZWFkeSEKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBDaGVjayB0aW1lb3V0LgorCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJY3RybCAmPQorCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXN5bmNoICY9CisJCQkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNoKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8KKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLiBUaGlzIGlzIGFuIGVycm9yLgorCQkJLy8gQlJPS0VOIFBJUEUhCisJCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy8gRklGTyBpcyBlbXB0eS4KKwkJCQlpZiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCisJCQkJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDw9IGluc3RhbmNlLT5kYXRhX2NvdW50KSkgewkvL0ZpbmlzaGluZyB3b3JrLiBSZXF1ZWQgZGF0YSBzaG93bi4KKwkJCQkJCVBERUJVRworCQkJCQkJICAgICgiSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisJCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkJCSAgICBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiT3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBicm9rZW4uIElTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIG5vdCBlbXB0eS5cbiIpOworCQkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCQkgICAgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgZW1wdHkuCisJCQkJCVBERUJVRworCQkJCQkgICAgKCJJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBlbXB0eS5cbiIpOworCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJfQorCQkJfSBlbHNlIHsJLy8gVGhlcmUgYXJlIHN0aWxsIGRhdGFzIGluIEZJRk8uCisJCQkJaWYgKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgbm90IGVtcHR5LgorCQkJCQlQRVJST1IKKwkJCQkJICAgICgiT3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBicm9rZW4uIElTTSBzdG9wZWQgYnV0IHNvbWUgZGF0YSBpbiBGSUZPIGFuZCBidWZmZXIuXG4iKTsKKwkJCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgZW1wdHkuCisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZCBidXQgc29tZSBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBlbXB0eS5cbiIpOworCQkJCX0KKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCisJCQl9CisKKwkJCS8vIFNpZ25hbCB0aGUgZmFpbHVyZS4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvLyBXYWl0IGZvciBzdG9wLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4gV2FpdGluZyBmb3Igc3RvcCBmaW5pc2guCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZy4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SX0NSSVRJQ0FMKCJTdGF0dXMgaXMgaW4gd3Jvbmcgc3RhdGUgKCVkKSFcbiIsCisJCQkJaW5zdGFuY2UtPnN0YXR1cyk7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJc2lnbmFsaW5nID0gMTsKKwkJYnJlYWs7CisKKwl9CisKKwlpZiAoc2lnbmFsaW5nKSB7CS8vU2lnbmFsIGl0LgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfQorCisJaWYgKGluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyAmJiByZXNjaGVkdWxlKSB7CS8vIFJlc2NoZWR1bGUgdGFzaworCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNjAwMF93b3JrcXVldWUsCisJCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCX0gZWxzZSB7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChpbnN0YW5jZS0+bWF4ICsgMTAwMCkpICYmICgqbWluID49IGluc3RhbmNlLT5taW4pKSB7CisJCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+bWF4OworCQkJKm1heGRhdGEgPSBNRTYwMDBfQU9fTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSAwOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBhdmFpbGFibGUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCh1bml0ID09IE1FX1VOSVRfVk9MVCkgfHwgKHVuaXQgPT0gTUVfVU5JVF9BTlkpKSB7CisJCSpjb3VudCA9IDE7CisJfSBlbHNlIHsKKwkJKmNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChyYW5nZSA9PSAwKSB7CisJCSp1bml0ID0gTUVfVU5JVF9WT0xUOworCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5tYXg7CisJCSptYXhkYXRhID0gTUU2MDAwX0FPX01BWF9EQVRBOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vU3RyZWFtaW5nIGRldmljZS4KKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOworCQlpZiAodGltZXIgPT0gTUVfVElNRVJfQUNRX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU2MDAwX0FPX01JTl9BQ1FfVElDS1M7CisJCQkqbWF4X3RpY2tzID0gTUU2MDAwX0FPX01BWF9BQ1FfVElDS1M7CisJCX0gZWxzZSBpZiAodGltZXIgPT0gTUVfVElNRVJfQ09OVl9TVEFSVCkgeworCQkJKm1pbl90aWNrcyA9IE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1M7CisJCX0KKwl9IGVsc2UgewkJLy9Ob3Qgc3RyZWFtaW5nIGRldmljZSEKKwkJKmJhc2VfZnJlcXVlbmN5ID0gMDsKKwkJKm1pbl90aWNrcyA9IDA7CisJCSptYXhfdGlja3MgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqbnVtYmVyID0gMTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0KKwkgICAgKGluc3RhbmNlLT4KKwkgICAgIGZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pID8gTUVfU1VCVFlQRV9TVFJFQU1JTkcgOgorCSAgICBNRV9TVUJUWVBFX1NJTkdMRTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqY2FwcyA9CisJICAgIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUyB8ICgoaW5zdGFuY2UtPmZpZm8pID8gTUVfQ0FQU19BT19GSUZPIDoKKwkJCQkJICAgTUVfQ0FQU19OT05FKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5IGFyZ3VtZW50IGNvdW50LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQ7CisJfQorCisJc3dpdGNoIChjYXApIHsKKwljYXNlIE1FX0NBUF9BSV9GSUZPX1NJWkU6CisJCWFyZ3NbMF0gPSAoaW5zdGFuY2UtPmZpZm8pID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOiAwOworCQlicmVhazsKKworCWNhc2UgTUVfQ0FQX0FJX0JVRkZFUl9TSVpFOgorCQlhcmdzWzBdID0KKwkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSA/IE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVCA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DQVA7CisJCWFyZ3NbMF0gPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyOTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uaApAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW8uaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9BT19IXworI2RlZmluZSBfTUU2MDAwX0FPX0hfCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfU1VCREVWSUNFUwkxNgorI2RlZmluZSBNRTYwMDBfQU9fRklGT19DT1VOVAkJODE5MgorCisjZGVmaW5lIE1FNjAwMF9BT19CQVNFX0ZSRVFVRU5DWQkzMzAwMDAwMEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfQUNRX1RJQ0tTCQkwTEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MJNjZMTAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1MJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU2MDAwX0FPX01JTl9SQU5HRQkJCS0xMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjZGVmaW5lIE1FNjAwMF9BT19NSU5fUkFOR0VfSElHSAkwCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfUkFOR0VfSElHSAk0OTk5OTIzNworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfREFUQQkJCTB4RkZGRgorCisjaWZkZWYgTUVfU1lOQVBTRQorIyBkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUiAJCTUJLy8gMl5uIFBBR0VTID0+PiAxMjhLQgorI2VuZGlmCisjZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFIAkJUEFHRV9TSVpFPDxNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUgkvLyBCdWZmZXIgc2l6ZSBpbiBieXRlcy4KKworIyAgaWZkZWYgX0NCVUZGXzMyYl90CisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MzJfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbHNlCisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MTZfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbmRpZgorCisjICBkZWZpbmUgTUU2MDAwX0FPX0NPTlRJTk9VUwkJCQkJMHgwCisjICBkZWZpbmUgTUU2MDAwX0FPX1dSQVBfTU9ERQkJCQkJMHgxCisjICBkZWZpbmUgTUU2MDAwX0FPX0hXX01PREUJCQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19IV19XUkFQX01PREUJCQkJKE1FNjAwMF9BT19XUkFQX01PREUgfCBNRTYwMDBfQU9fSFdfTU9ERSkKKyMgIGRlZmluZSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFCQkJCU1FNjAwMF9BT19XUkFQX01PREUKKworIyAgZGVmaW5lIE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFCQkJCTB4MAorIyAgZGVmaW5lIE1FNjAwMF9BT19BQ1FfU1RPUF9NT0RFCQkJCTB4MQorIyAgZGVmaW5lIE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19FWFRSQV9IQVJEV0FSRQkJCQkweDEKKyMgIGRlZmluZSBNRTYwMDBfQU9fSEFTX0ZJRk8JCQkJCTB4MgorCit0eXBlZGVmIGVudW0gTUU2MDAwX0FPX1NUQVRVUyB7CisJYW9fc3RhdHVzX25vbmUgPSAwLAorCWFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQsCisJYW9fc3RhdHVzX3NpbmdsZV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9ydW4sCisJYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCwKKwlhb19zdGF0dXNfc3RyZWFtX2VuZCwKKwlhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9lcnJvciwKKwlhb19zdGF0dXNfbGFzdAorfSBNRTYwMDBfQU9fU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lNjAwMF9hb190aW1lb3V0X3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKnByZWxvYWRfcmVnX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisJdWludDMyX3QgKnRyaWdnZXJpbmdfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgZmlmbzsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIGhhcyBhIEZJRk8uICovCisKKwkvL1JhbmdlCisJaW50IG1pbjsKKwlpbnQgbWF4OworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkvKio8IE1pcnJvciBvZiB0aGUgb3V0cHV0IHZhbHVlIGluIHNpbmdsZSBtb2RlLiAqLworCWludCBzaW5nbGVfdmFsdWVfaW5fZmlmbzsJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHZhbHVlIHdyaXR0ZW4gaW4gc2luZ2xlIG1vZGUuICovCisJdWludDMyX3QgY3RybF90cmc7CQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkvKio8IEZsYWdzIHVzZWQgZm9yIHN0b3JpbmcgU1cgd3JhcGFyb3VuZCBzZXR1cCovCisJaW50IHN0b3BfbW9kZTsJCQkJCQkJLyoqPCBUaGUgdXNlciBkZWZpbmVkIHN0b3AgY29uZGl0aW9uIGZsYWcuICovCisJdW5zaWduZWQgaW50IHN0YXJ0X21vZGU7CisJdW5zaWduZWQgaW50IHN0b3BfY291bnQ7CQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJLyoqPCBUaGUgc3RvcCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IGRhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHJlYWwgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBwcmVsb2FkZWRfY291bnQ7CQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCS8qKjwgVGhlIHRpbWUgdGhhdCBzdG9wIGNhbiB0YWtlLiBUaGlzIGlzIG9ubHkgdG8gbm90IHNob3cgaGFyZHdhcmUgYnVnIHRvIHVzZXIuICovCisKKwl2b2xhdGlsZSBlbnVtIE1FNjAwMF9BT19TVEFUVVMgc3RhdHVzOwkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTYwMDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkvKiBSZWdpc3RlcnMgKi8vKio8IEFsbCByZWdpc3RlcnMgYXJlIDMyIGJpdHMgbG9uZy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZpZm9fcmVnOworCXVuc2lnbmVkIGxvbmcgc2luZ2xlX3JlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgcHJlbG9hZF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfcmVzZXRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogU29mdHdhcmUgYnVmZmVyICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYW9fY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFvX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFvX2NvbnRyb2xfdGFza19mbGFnOwkJLyoqPCBGbGFnIGNvbnRyb2xpbmcgcmVleGVjdXRpbmcgb2YgY29udHJvbCB0YXNrICovCisKK30gbWU2MDAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisgKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisgKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisgKiBAcGFyYW0gaGlnaF9yYW5nZSBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhpZ2ggY3VycmVuIG91dHB1dC4KKyAqIEBwYXJhbSBtZTYwMDBfd3EgUXVldWUgZm9yIGFzeW5jaHJvbm91cyB0YXNrICgxIHF1ZXVlIGZvciBhbGwgc3ViZGV2aWNlIG9uIDEgYm9hcmQpLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU2MDAwX2FvX3N1YmRldmljZV90ICptZTYwMDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIHVpbnQzMl90ICogdHJpZ2dlcmluZ19mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgaW50IGhpZ2hfcmFuZ2UsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU2MDAwX3dxKTsKKworI2VuZGlmIC8vX19LRVJORUxfXworI2VuZGlmIC8vX01FNjAwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4ZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0FPX1JFR19IXworI2RlZmluZSBfTUU2MDAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyBBTworI2RlZmluZSBNRTYwMDBfQU9fMDBfQ1RSTF9SRUcJCQkJCTB4MDAJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHCQkJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDBfRklGT19SRUcJCQkJCTB4MDgJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TSU5HTEVfUkVHCQkJCQkweDBDCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDBfVElNRVJfUkVHCQkJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wMV9DVFJMX1JFRwkJCQkJMHgxOAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NUQVRVU19SRUcJCQkJCTB4MUMJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT18wMV9GSUZPX1JFRwkJCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUcJCQkJCTB4MjQJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMV9USU1FUl9SRUcJCQkJCTB4MjgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0NUUkxfUkVHCQkJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU1RBVFVTX1JFRwkJCQkJMHgzNAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0ZJRk9fUkVHCQkJCQkweDM4CS8vIF8vVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU0lOR0xFX1JFRwkJCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX1RJTUVSX1JFRwkJCQkJMHg0MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDNfQ1RSTF9SRUcJCQkJCTB4NDgJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHCQkJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDNfRklGT19SRUcJCQkJCTB4NTAJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TSU5HTEVfUkVHCQkJCQkweDU0CS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDNfVElNRVJfUkVHCQkJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRwkJCQkweEE0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQJCQk0CS8vVGhlIGZpcnN0IHNpbmdsZSBzdWJkZXZpY2UgPT4gYml0IDAgaW4gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHLgorCisjZGVmaW5lIE1FNjAwMF9BT18wNF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUcJCQkJCTB4NzQJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA1X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRwkJCQkJMHg3OAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDZfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHCQkJCQkweDdDCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wN19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUcJCQkJCTB4ODAJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA4X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRwkJCQkJMHg4NAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDlfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHCQkJCQkweDg4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xMF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEwX1NJTkdMRV9SRUcJCQkJCTB4OEMJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzExX1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTFfU0lOR0xFX1JFRwkJCQkJMHg5MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTJfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHCQkJCQkweDk0CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xM19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEzX1NJTkdMRV9SRUcJCQkJCTB4OTgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzE0X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTRfU0lOR0xFX1JFRwkJCQkJMHg5QwkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTVfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHCQkJCQkweEEwCS8vIF8vVworCisvL01FNjAwMF9BT19DVFJMX1JFRworI2RlZmluZSBNRTYwMDBfQU9fTU9ERV9TSU5HTEUJCQkJCTB4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0sJCQkJKE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQgfCBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTKQorCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCTB4MDAxCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX0NPTlRJTlVPVVMJCTB4MDAyCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwNAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCQkweDAwOAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcJCTB4MDEwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAyMAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDQwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwODAKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIIAkweDgwMAorCisvL01FNjAwMF9BT19TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTQkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGCQkJCQkweDAyCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGCQkJCQkweDA0CisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGCQkJCQkweDA4CisKKyNkZWZpbmUgTUU2MDAwX0FPX1BSRUxPQURfUkVHCQkJCQkweEE4CS8vIFIvVyAgICAvLy9NRTYwMDBfQU9fU1lOQ19SRUcgPD09PiBNRTYwMDBfQU9fUFJFTE9BRF9SRUcKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzQJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF81CQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfNgkJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzcJCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF84CQkJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfOQkJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEwCQkJCQkweDAwMDAwNDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTEJCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xMgkJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEzCQkJCQkweDAwMDAyMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTQJCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xNQkJCQkJMHgwMDAwODAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzAJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzMJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR180CQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfNQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzYJCQkJMHgwMDQwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR183CQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfOAkJCQkweDAxMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzkJCQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMAkJCQkweDA0MDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzExCQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTIJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMwkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzE0CQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTUJCQkJMHg4MDAwMDAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcJCQkJCTB4MDAwMTAwMDAKKworI2RlZmluZSBNRTYwMDBfQU9fRVhUX1RSSUcJCQkJCQkweDgwMDAwMDAwCisKKy8vIEFPLUlSUQorI2RlZmluZSBNRTYwMDBfQU9fSVJRX1NUQVRVU19SRUcJCQkJMHg2MAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAwX0lSUV9SRVNFVF9SRUcJCQkJMHg2NAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUcJCQkJMHg2OAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0lSUV9SRVNFVF9SRUcJCQkJMHg2QwkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAzX0lSUV9SRVNFVF9SRUcJCQkJMHg3MAkvLyBSL18KKworI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAkJCQkJMHgwMQorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMQkJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMgkJCQkJMHgwNAorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMwkJCQkJMHgwOAorCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF9BT19IRgkJCQlNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAorCisvL0RVTVkgcmVnaXN0ZXIKKyNkZWZpbmUgTUU2MDAwX0FPX0RVTVkJCQkJCQkJCQkweEZDCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlNGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5jCisgKgorICogQGJyaWVmIERldmljZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZmlybXdhcmUuaCIKKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU2MDAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvLmgiCisKKy8qKgorICogQGJyaWVmIEdsb2JhbCB2YXJpYWJsZS4KKyAqIFRoaXMgaXMgd29ya2luZyBxdWV1ZSBmb3IgcnVuaW5nIGEgc2VwYXJhdGUgYXRhc2sgdGhhdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB3b3JrIHN0YXR1cyAoc3RhcnQsIHN0b3AsIHRpbWVvdXRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworCittZV9kZXZpY2VfdCAqbWU2MDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTYwMDBfZGV2aWNlX3QgKm1lNjAwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKwlpbnQgaGlnaF9yYW5nZSA9IDA7CisJaW50IGZpZm87CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTYwMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU2MDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNjAwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTYwMDBfZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lNjAwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUgKi8KKwllcnIgPSBtZV94aWxpbnhfZG93bmxvYWQobWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMV0sCisJCQkJIG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJCSAmcGNpX2RldmljZS0+ZGV2LCAibWU2MDAwLmJpbiIpOworCisJaWYgKGVycikgeworCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTYwMDBfZGV2aWNlKTsKKwkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTYwMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTYwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lNjAwMF9kZXZpY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTYwMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisKKwkvKiBDcmVhdGUgZGlnaXRhbCBpbnB1dC9vdXRwdXQgaW5zdGFuY2VzLiAqLworCWZvciAoaSA9IDA7IGkgPCBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfZGlvX2NvbnN0cnVjdG9yKG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzNdLCBpLAorCQkJCQkJCSAgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fY3RybF9yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvKiBDcmVhdGUgYW5hbG9nIG91dHB1dCBpbnN0YW5jZXMuICovCisJZm9yIChpID0gMDsgaSA8IG1lNjAwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uYW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCWhpZ2hfcmFuZ2UgPSAoKGkgPT0gOCkKKwkJCSAgICAgICYmCisJCQkgICAgICAoKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTkpCisJCQkgICAgICAgfHwgKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTkpCisJCQkgICAgICApCisJCSAgICApPyAxIDogMDsKKworCQlmaWZvID0KKwkJICAgIChpIDwKKwkJICAgICBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLgorCQkgICAgIGFvX2ZpZm8pID8gTUU2MDAwX0FPX0hBU19GSUZPIDogMHgwOworCQlmaWZvIHw9IChpIDwgNCkgPyBNRTYwMDBfQU9fRVhUUkFfSEFSRFdBUkUgOiAweDA7CisKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfYW9fY29uc3RydWN0b3IobWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsCisJCQkJCQkJICAgICAmbWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICB0cmlnZ2VyaW5nX2ZsYWdzLAorCQkJCQkJCSAgICAgaSwgZmlmbywKKwkJCQkJCQkgICAgIG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEsCisJCQkJCQkJICAgICBoaWdoX3JhbmdlLAorCQkJCQkJCSAgICAgbWU2MDAwX3dvcmtxdWV1ZSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTYwMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCW1lNjAwMF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibWU2MDAwIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTYwMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWZsdXNoX3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKK30KKworbW9kdWxlX2luaXQobWU2MDAwX2luaXQpOworbW9kdWxlX2V4aXQobWU2MDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTYwMDAgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNjAwMCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNjAwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjYzdkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU2MDAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjAwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworfSBtZTYwMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBNRS02MDAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTYwMDBfdmVyc2lvbl90IG1lNjAwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMEYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNEYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OSwgMiwgOSwgMH0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTksIDIsIDksIDR9LAorCisJezB9LAorfTsKKworI2RlZmluZSBNRTYwMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU2MDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTYwMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lNjAwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU2MDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lNjAwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU2MDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTYwMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTYwMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjAwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCBwcmVsb2FkX2ZsYWdzOworCXVpbnQzMl90IHRyaWdnZXJpbmdfZmxhZ3M7CisKKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworfSBtZTYwMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNjAwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTYwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSIHNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqbWU2MDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTZXQgdGhlIHN1YmRldmljZSBwb3J0cyAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9ESU9fQ1RSTF9SRUc7CisJc3dpdGNoIChkaW9faWR4KSB7CisJY2FzZSAwOgorCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfRElPX1BPUlRfMF9SRUc7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0RJT19QT1JUXzFfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTYwMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThiZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTYwMDBfRElPX0hfCisjZGVmaW5lIF9NRTYwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU2MDAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTYwMDBfZGlvX3N1YmRldmljZV90ICptZTYwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2E3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNjAwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU2MDAwX0RJT19DVFJMX1JFRwkJCQkweDAwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMF9SRUcJCQkweDAxCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMV9SRUcJCQkweDAyCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfUkVHCQkJCU1FNjAwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMQorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMQkJMHgwMgorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMgkJMHgwNAorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjczMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX1JFR19IXworI2RlZmluZSBfTUU2MDAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9JTklUX1hJTElOWF9SRUcJCTB4QUMJLy8gUi8tCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGkuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG8uaCIKKyNpbmNsdWRlICJtZTgyNTQuaCIKKworbWVfZGV2aWNlX3QgKm1lODEwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWU4MTAwX2RldmljZV90ICptZTgxMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTgxMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lODEwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTgxMDBfZGV2aWNlLCAwLCBzaXplb2YobWU4MTAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU4MTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTgxMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lODEwMF9kZXZpY2UtPmN0cl9jdHJsX3JlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MTAwX2RldmljZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODEwMF9kaV9jb25zdHJ1Y3RvcihtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMV0sIGksCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTgxMDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU4MTAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lODEwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MTAwX2RvX2NvbnN0cnVjdG9yKG1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICZtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19jdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyNTRfY29uc3RydWN0b3IobWU4MTAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLmRldmljZV9pZCwKKwkJCQkJCQkgIG1lODEwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJICBpbmZvLnBjaS5yZWdfYmFzZXNbMl0sCisJCQkJCQkJICAwLCBpLAorCQkJCQkJCSAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgY3RyX2N0cmxfcmVnX2xvY2ssCisJCQkJCQkJICAmbWU4MTAwX2RldmljZS0+CisJCQkJCQkJICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lODEwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lODEwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWU4MTAwX2luaXQpOworCittb2R1bGVfZXhpdChtZTgxMDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUigiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIFRlbXBsYXRlIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFRlbXBsYXRlIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWU4MTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM0MmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgxMDBfREVWSUNFX0gKKyNkZWZpbmUgX01FODEwMF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIE1FLTgxMDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MTAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7Cit9IG1lODEwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTgxMDBfdmVyc2lvbl90IG1lODEwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BLCAxLCAxLCAzfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiwgMiwgMiwgM30sCisJezB9LAorfTsKKworI2RlZmluZSBNRTgxMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU4MTAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTgxMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lODEwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU4MTAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lODEwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTgxMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTgxMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtODEwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCBjbGtfc3JjX3JlZ19sb2NrOworfSBtZTgxMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MTAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODEwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgxMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNDYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZGkuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODEwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dHcoMCwgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0dygwLCBpbnN0YW5jZS0+cGF0dGVybl9yZWcpOworCVBERUJVR19SRUcoInBhdHRlcm5fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBhdHRlcm5fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+aXJxX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCW91dGwoUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wgfAorCSAgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOLCBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoInBseDppcnFfc3RhdHVzX3JlZyBvdXRsKDB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcsCisJCSAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDE2X3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCWlmIChmbGFncyAmCisJCSAgICB+KE1FX0lPX0lSUV9TVEFSVF9QQVRURVJOX0ZJTFRFUklORyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfTk9UX1VTRUQpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFOworCQl9CisJfSBlbHNlIGlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX01BU0spIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwkJfQorCisJCWlmICghKGlycV9hcmcgJiAweEZGRkYpKSB7CisJCQlQRVJST1IoIk5vIG1hc2sgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPnBhdHRlcm5fcmVnKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwl9CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJY3RybCAmPSB+TUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzE7CisJfQorCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xOworCX0KKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgY291bnQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJUERFVkVMT1AoIlBJRDogJWQuXG4iLCBjdXJyZW50LT5waWQpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUyB8IE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJCWNvdW50ID0gaW5zdGFuY2UtPmlycV9jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGlycV9jb3VudCkKKwkJCQkJCQkgICAgICB8fCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgIHJpc2VkIDwgMCkpLAorCQkJCQkJCSAgICAgdCk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsIChpbnN0YW5jZS0+cmlzZWQgIT0gMCksIHQpOworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGNvdW50ICE9IGluc3RhbmNlLT5pcnFfY291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5pcnFfY291bnQ7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJfSBlbHNlIHsJLy8gVXNlIGRlZmF1bHQKKwkJCWlmICghaW5zdGFuY2UtPnN0YXR1c19mbGFnKSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworLyoKKwkJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSAwOworCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisqLworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfaW9faXJxX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQkqdmFsdWUgPSAoaW53KGluc3RhbmNlLT5wb3J0X3JlZykgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRIHwgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgxMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODEwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgxMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IGljc3I7CisKKwl1aW50MTZfdCBpcnFfc3RhdHVzOworCXVpbnQxNl90IGxpbmVfdmFsdWUgPSAwOworCisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWljc3IgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAwKSB7CisKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTAgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpY3NyKTsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAxKSB7CisJCWlmICgoaWNzciAmCisJCSAgICAgKFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSB8IFBMWF9JTlRDU1JfUENJX0lOVF9FTiB8CisJCSAgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTikpICE9CisJCSAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4pKSB7CisJCQlQSU5GTworCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0xIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaWNzcik7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIiVzKCk6V3JvbmcgaW50ZXJydXB0IGlkeD0lZCBjc3I9MHglWC5cbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGluc3RhbmNlLT5kaV9pZHgsIGljc3IpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJtZTgxMDBfaXNyKCk6SW50ZXJydXB0IGZyb20gaWR4PSVkIG9jY3VyZWQuXG4iLAorCSAgICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW53KGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwlsaW5lX3ZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwlpcnFfc3RhdHVzID0gaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50MTZfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQxNl90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIH5saW5lX3ZhbHVlKSk7CS8vRmFsbAorCisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MTAwX2RpX3N1YmRldmljZV90ICptZTgxMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODEwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgxMDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUU4MTAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9ESV9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+bWFza19yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfTUFTS19SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+cGF0dGVybl9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfUEFUVEVSTl9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+ZGluX2ludF9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfSU5UX0RJX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkgICAgbWU4MTAwX3JlZ19iYXNlICsgTUU4MTAwX1JFU19JTlRfUkVHX0EgKyBkaV9pZHggKiBNRTgxMDBfUkVHX09GRlNFVDsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgxMDBfcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODEwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODEwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MTAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgxMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MTAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmlycV9jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGI3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9IXworI2RlZmluZSBfTUU4MTAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGlfc3ViZGV2aWNlIHsKKwkvLyBJbmhlcml0YW5jZQorCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisKKwl1bnNpZ25lZCBkaV9pZHg7CisKKwlpbnQgaXJxOworCXZvbGF0aWxlIGludCByaXNlZDsKKwl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OworCisJdWludCBzdGF0dXNfZmxhZzsJCQkJLyoqPCBEZWZhdWx0IGludGVydXB0IHN0YXR1cyBmbGFnICovCisJdWludCBzdGF0dXNfdmFsdWU7CQkJCS8qKjwgSW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBzdGF0dXNfdmFsdWVfZWRnZXM7CQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKworCXVpbnQxNl90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkaW5faW50X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9yZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKworfSBtZTgxMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgxMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgxMDBfZGlfc3ViZGV2aWNlX3QgKm1lODEwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgxMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9sZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfUkVTX0lOVF9SRUdfQQkJMHgwMgkvLyhyLCApCisjZGVmaW5lIE1FODEwMF9ESV9SRUdfQQkJCTB4MDQJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfUEFUVEVSTl9SRUdfQQkJMHgwOAkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9NQVNLX1JFR19BCQkweDBBCS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0lOVF9ESV9SRUdfQQkJMHgwQQkvLyhyLCApCisKKyNkZWZpbmUgTUU4MTAwX1JFU19JTlRfUkVHX0IJCTB4MEUJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfRElfUkVHX0IJCQkweDEwCS8vKHIsICkKKyNkZWZpbmUgTUU4MTAwX1BBVFRFUk5fUkVHX0IJCTB4MTQJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfTUFTS19SRUdfQgkJMHgxNgkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9JTlRfRElfUkVHX0IJCTB4MTYJLy8ociwgKQorCisjZGVmaW5lIE1FODEwMF9SRUdfT0ZGU0VUCQkweDBDCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YjlmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uYwpAQCAtMCwwICsxLDM5MSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZG8uYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODEwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG9fcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgY3RybDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsICY9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xIHwgTUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzA7CisJb3V0dyhjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0dygwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPSAwOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY29uZmlnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWNvbmZpZyA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJICAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFKSB7CisJCQkJY29uZmlnICY9IH4oTUU4MTAwX0RJT19DVFJMX0JJVF9FTkFCTEVfRElPKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LKSB7CisJCQkJY29uZmlnIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTzsKKwkJCQljb25maWcgJj0gfk1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRSkgeworCQkJCWNvbmZpZyB8PQorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX0VOQUJMRV9ESU8gfAorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX1NPVVJDRTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dHcoY29uZmlnLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb25maWcpOworCX0KKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgJiAweEZGOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJKnZhbHVlID0gKGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgxMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPQorCQkJICAgIHZhbHVlID8gKGluc3RhbmNlLT4KKwkJCQkgICAgIHBvcnRfcmVnX21pcnJvciB8ICgweDEgPDwgY2hhbm5lbCkpCisJCQkgICAgOiAoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmIH4oMHgxIDw8IGNoYW5uZWwpKTsKKwkJCW91dHcoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgfD0gdmFsdWUgJiAweEZGOworCQkJb3V0dyhpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjAwOworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciB8PSAodmFsdWUgPDwgOCkgJiAweEZGMDA7CisJCQlvdXR3KGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcik7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yID0gdmFsdWU7CisJCQlvdXR3KHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxNjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX1NJTktfU09VUkNFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTgxMDBfZG9fc3ViZGV2aWNlX3QgKm1lODEwMF9kb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZG9faWR4LAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODEwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgxMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfRE9fUkVHX0E7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BOworCX0gZWxzZSBpZiAoZG9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MTAwX0RPX1JFR19COworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfQ1RSTF9SRUdfQjsKKwl9IGVsc2UgeworCQlQRVJST1IoIldyb25nIHN1YmRldmljZSBpZHg9JWQuXG4iLCBkb19pZHgpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+ZG9faWR4ID0gZG9faWR4OworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODEwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQGZpbGUgbWU4MTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MTAwX0RPX0hfCisjZGVmaW5lIF9NRTgxMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODEwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlICNjdHJsX3JlZy4gKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CisKKwl1aW50MTZfdCBwb3J0X3JlZ19taXJyb3I7CQkvKio8IE1pcnJvciB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgcG9ydCByZWdpc3RlciBzZXR0aW5nIHdoaWNoIGlzIHdyaXRlIG9ubHkuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODEwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MTAwX2RvX3N1YmRldmljZV90ICptZTgxMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ET19SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ET19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfRE9fUkVHX0EJCQkweDA2CS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0RPX1JFR19CCQkJMHgxMgkvLyggLHcpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQQkJCTB4MDAJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQgkJCTB4MEMJLy8oICx3KQorCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFCQkweDEwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xCQkweDIwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wCQkweDQwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTwkJMHg4MAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCittZV9kZXZpY2VfdCAqbWU4MjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTgyMDBfZGV2aWNlX3QgKm1lODIwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lODIwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWU4MjAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lODIwMF9kZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTgyMDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTgyMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lODIwMF9kZXZpY2UtPmlycV9jdHJsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTgyMDBfZGV2aWNlLT5pcnFfbW9kZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MjAwX2RldmljZS0+ZGlvX2N0cmxfbG9jayk7CisKKwkvKiBTZXR1cCB0aGUgUExYIGludGVycnVwdCBjb25maWd1cmF0aW9uICovCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4sCisJICAgICBtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1sxXSArIFBMWF9JTlRDU1IpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyMDBfZGlfY29uc3RydWN0b3IobWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGlycV9jdHJsX2xvY2ssCisJCQkJCQkJICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBpcnFfbW9kZV9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MjAwX2RldmljZSk7CisJCQlrZnJlZShtZTgyMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODIwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgyMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODIwMF9kb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICBtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODIwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgaXJxX21vZGVfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MjAwX2Rpb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTgyMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTgyMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7Cit9CisKK21vZHVsZV9pbml0KG1lODIwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWU4MjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lODIwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTgyMDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS04MjAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRpb19zdWJkZXZpY2VzOworfSBtZTgyMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWU4MjAwX3ZlcnNpb25fdCBtZTgyMDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQSwgMSwgMSwgMn0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IsIDIsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUU4MjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lODIwMF92ZXJzaW9ucykgLyBzaXplb2YobWU4MjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTgyMDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lODIwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTgyMDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lODIwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU4MjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU4MjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTgyMDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGlycV9jdHJsX2xvY2s7CS8qKjwgTG9jayBmb3IgdGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgaXJxX21vZGVfbG9jazsJLyoqPCBMb2NrIGZvciB0aGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9sb2NrOwkvKio8IExvY2sgZm9yIHRoZSBkaWdpdGFsIGkvbyBjb250cm9sIHJlZ2lzdGVyLiAqLworfSBtZTgyMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODIwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgyMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9JbmNsdWRlcworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaS5oIgorCisvLy8gRGVmaW5lcworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX2lycV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKy8vL0Z1bmN0aW9ucworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXZvbGF0aWxlIHVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9OT1RfVVNFRCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKwl9IGVsc2UgaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQlpZiAoZmxhZ3MgJgorCQkgICAgfihNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCQkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0ZBTExJTkcpCisJCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKworCQlpZiAoIShpcnFfYXJnICYgMHhGRikpIHsKKwkJCVBFUlJPUigiTm8gbWFzayBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9BUkc7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJb3V0YihpcnFfYXJnLCBpbnN0YW5jZS0+Y29tcGFyZV9yZWcpOworCQlQREVCVUdfUkVHKCJjb21wYXJlX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNvbXBhcmVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBpcnFfYXJnKTsKKwkJb3V0YigweEZGLCBpbnN0YW5jZS0+bWFza19yZWcpOworCQlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPm1hc2tfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweGZmKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dGIoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwkJUERFQlVHX1JFRygibWFza19yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgaXJxX2FyZyk7CisJCWluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZyA9IDA7CisJfQorCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9tb2RlX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX01BU0sgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJdG1wIHw9CisJCSAgICBNRTgyMDBfSVJRX01PREVfTUFTS19DT01QQVJFIDw8IChNRTgyMDBfSVJRX01PREVfRElfU0hJRlQgKgorCQkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCXRtcCB8PQorCQkgICAgTUU4MjAwX0lSUV9NT0RFX01BU0tfTUFTSyA8PCAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICoKKwkJCQkJCSAgaW5zdGFuY2UtPmRpX2lkeCk7CisJfQorCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX21vZGVfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfbW9kZV9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX21vZGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9FTkFCTEUgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgIGluc3RhbmNlLT5kaV9pZHgpOworCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQl0bXAgJj0KKwkJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRSA8PAorCQkgICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCQlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORyA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9GQUxMSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcgPDwKKwkJCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCk7CisJCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0FOWSA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfQorCX0KKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGNvdW50OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCVBERVZFTE9QKCJQSUQ6ICVkLlxuIiwgY3VycmVudC0+cGlkKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMgfCBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQljb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkJICAgICAgfHwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICByaXNlZCA8IDApKSwKKwkJCQkJCQkgICAgIHQpOworLy8gICAgICAgICAgICAgICAgICAgICAgdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApLCB0KTsKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChjb3VudCAhPSBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwlpZiAoIWVycikgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19JUlFfV0FJVF9OT1JNQUxfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQl9IGVsc2UgaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQl9IGVsc2UgewkvLyBVc2UgZGVmYXVsdAorCQkJaWYgKCFpbnN0YW5jZS0+c3RhdHVzX2ZsYWcpIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisvKgorCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKyovCisJfSBlbHNlIHsKKwkJKnZhbHVlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwKKwkgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0bXAgJj0gfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8IChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJcmV0dXJuIG1lODIwMF9kaV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCAwKTsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0RJT19CSVRfUEFUVEVSTl9JUlEgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY3RybDsKKwl1aW50OF90IGlycV9zdGF0dXM7CisJdWludDhfdCBsaW5lX3ZhbHVlID0gMDsKKwl1aW50OF90IGxpbmVfc3RhdHVzID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5kaV9pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJY3RybCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9CisJICAgIE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgaW5zdGFuY2UtPmRpX2lkeCk7CisJb3V0YihjdHJsLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwljdHJsICY9CisJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0YihjdHJsLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCWxpbmVfdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisKKwlsaW5lX3N0YXR1cyA9ICgodWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlKTsKKworCS8vIE1ha2UgZXh0ZW5kZWQgaW5mb3JtYXRpb24uCisJc3RhdHVzX3ZhbCB8PSAoMHgwMEZGICYgKH4odWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQ4X3QpIGluc3RhbmNlLT5saW5lX3ZhbHVlICYgfmxpbmVfdmFsdWUpKTsJLy9GYWxsCisKKwlpbnN0YW5jZS0+bGluZV92YWx1ZSA9IChpbnQpbGluZV92YWx1ZTsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPT0gMCkgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gaXJxX3N0YXR1cyB8IGxpbmVfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXMgfCBsaW5lX3N0YXR1czsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyB8PSBzdGF0dXNfdmFsOworCX0KKworCWlmIChpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcpIHsJLy8gRm9yIGNvbXBhcmUgbW9kZSBvbmx5LgorCQlpZiAoaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPT0gaW5zdGFuY2UtPmxpbmVfdmFsdWUpIHsKKwkJCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJCQlpbnN0YW5jZS0+Y291bnQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJCWluc3RhbmNlLT5jb3VudCsrOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyX0VYKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgaXJxX3N0YXR1cyA9IDA7CisJdWludDE2X3QgaXJxX3N0YXR1c19FWCA9IDA7CisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisJaW50IGksIGo7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vUmVzZXQgbGF0Y2hlcy4gQ29weSBzdGF0dXMgdG8gZXh0ZW5kZWQgcmVnaXN0ZXJzLgorCWlycV9zdGF0dXMgPSBpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDJYXG4iLCBpbnN0YW5jZS0+ZGlfaWR4LAorCQkgICBpcnFfc3RhdHVzKTsKKworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5kaV9pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1c19FWCA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19sb3dfcmVnKTsKKwlpcnFfc3RhdHVzX0VYIHw9IChpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcpIDw8IDgpOworCisJUERFVkVMT1AoIkVYVEVOREVEIFJFRzogMHglMDR4XG4iLCBpcnFfc3RhdHVzX0VYKTsKKwlpbnN0YW5jZS0+bGluZV92YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJLy8gRm9ybWF0IGV4dGVuZGVkIGluZm9ybWF0aW9uLgorCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgODsgaSsrLCBqICs9IDIpIHsKKwkJc3RhdHVzX3ZhbCB8PSAoKDB4MDEgPDwgaikgJiBpcnFfc3RhdHVzX0VYKSA+PiAoaiAtIGkpOwkvL0ZhbGwKKwkJc3RhdHVzX3ZhbCB8PSAoKDB4MDEgPDwgKGogKyAxKSkgJiBpcnFfc3RhdHVzX0VYKSA8PCAoMTUgLSBqICsgaSk7CS8vUmFpc2UKKwl9CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmNvdW50Kys7CisJCX0KKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQlpbnN0YW5jZS0+Y291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lODIwMF9kaV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsICh2b2lkICopaW5zdGFuY2UpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lODIwMF9kaV9zdWJkZXZpY2VfdCAqbWU4MjAwX2RpX2NvbnN0cnVjdG9yKHVpbnQzMl90IG1lODIwMF9yZWdiYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX2N0cmxfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX21vZGVfbG9jaykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU4MjAwX2RpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIENoZWNrIGZpcm13YXJlIHZlcnNpb24uCisJbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24oc3ViZGV2aWNlLAorCQkJCW1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmlycV9jdHJsX2xvY2sgPSBpcnFfY3RybF9sb2NrOworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXguICovCisJc3ViZGV2aWNlLT5kaV9pZHggPSBkaV9pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkaV9pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfUE9SVF8wX1JFRzsKKwkJc3ViZGV2aWNlLT5tYXNrX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX01BU0tfMF9SRUc7CisJCXN1YmRldmljZS0+Y29tcGFyZV9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ09NUEFSRV8wX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9DSEFOR0VfMF9SRUc7CisKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX2xvd19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0xPV19SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19oaWdoX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzBfSElHSF9SRUc7CisJfSBlbHNlIGlmIChkaV9pZHggPT0gMSkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfUE9SVF8xX1JFRzsKKwkJc3ViZGV2aWNlLT5tYXNrX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX01BU0tfMV9SRUc7CisJCXN1YmRldmljZS0+Y29tcGFyZV9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ09NUEFSRV8xX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9DSEFOR0VfMV9SRUc7CisKKwkJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX2xvd19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8xX0xPV19SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19oaWdoX3JlZyA9CisJCSAgICBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfSElHSF9SRUc7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJXcm9uZyBzdWJkZXZpY2UgaWR4PSVkLlxuIiwgZGlfaWR4KTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN1YmRldmljZS0+aXJxX2N0cmxfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfSVJRX0NUUkxfUkVHOworCXN1YmRldmljZS0+aXJxX21vZGVfcmVnID0gbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfSVJRX01PREVfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IG1lODIwMF9yZWdiYXNlOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWU4MjAwX2RpX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWU4MjAwX2RpX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTgyMDBfZGlfaW9faXJxX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTgyMDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lODIwMF9kaV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kaV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZGlfZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKwlpZiAoc3ViZGV2aWNlLT52ZXJzaW9uID4gMCkgewkvLyBORVcKKwkJZXJyID0gcmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lODIwMF9pc3JfRVgsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCX0gZWxzZSB7CQkvL09MRAorCQllcnIgPSByZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU4MjAwX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCQkgIE1FODIwMF9OQU1FLCAodm9pZCAqKXN1YmRldmljZSk7CisJfQorCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQREVCVUcoIlJlZ2lzdHJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZGlfY2hlY2tfdmVyc2lvbihtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlLT52ZXJzaW9uID0gMHgwMDAwMDBGRiAmIGluYihhZGRyKTsKKwlQREVWRUxPUCgibWU4MjAwIGZpcm13YXJlIHZlcnNpb246ICVkXG4iLCBpbnN0YW5jZS0+dmVyc2lvbik7CisKKwkvLy8gQG5vdGUgRml4IGZvciB3cm9uZyB2YWx1ZXMgaW4gdGhpcyByZWdpc3RyeS4KKwlpZiAoKGluc3RhbmNlLT52ZXJzaW9uIDwgMHg3KSB8fCAoaW5zdGFuY2UtPnZlcnNpb24gPiAweDFGKSkKKwkJaW5zdGFuY2UtPnZlcnNpb24gPSAweDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzYjAwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaS5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJX0hfCisjZGVmaW5lIF9NRTgyMDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsKKwlzcGlubG9ja190ICppcnFfY3RybF9sb2NrOworCXNwaW5sb2NrX3QgKmlycV9tb2RlX2xvY2s7CisKKwl1bnNpZ25lZCBpbnQgZGlfaWR4OworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCisJaW50IGlycTsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgdGhlIGludGVycnVwdCByZXF1ZXN0LiAqLworCXZvbGF0aWxlIGludCByaXNlZDsJCQkJLyoqPCBGbGFnIHRvIGluZGljYXRlIGlmIGFuIGludGVycnVwdCBvY2N1cmVkLiAqLworCXVpbnQgc3RhdHVzX2ZsYWc7CQkJCS8qKjwgRGVmYXVsdCBpbnRlcnVwdCBzdGF0dXMgZmxhZyAqLworCXVpbnQgc3RhdHVzX3ZhbHVlOwkJCQkvKio8IEludGVydXB0IHN0YXR1cyAqLworCXVpbnQgc3RhdHVzX3ZhbHVlX2VkZ2VzOwkJCS8qKjwgRXh0ZW5kZWQgaW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBsaW5lX3ZhbHVlOworCWludCBjb3VudDsJCQkJCQkvKio8IENvdW50cyB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgb2NjdXJlZC4gKi8KKwl1aW50OF90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CS8qKjwgVG8gd2FpdCBvbiBpbnRlcnJ1cHRzLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIGlucHV0IHBvcnQuICovCisJdW5zaWduZWQgbG9uZyBjb21wYXJlX3JlZzsJCS8qKjwgVGhlIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aC4gKi8KKwl1bnNpZ25lZCBsb25nIG1hc2tfcmVnOwkJCS8qKjwgVGhlIHJlZ2lzdGVyIHRvIGhvbGQgdGhlIG1hc2suICovCisJdW5zaWduZWQgbG9uZyBpcnFfbW9kZV9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgbW9kZSByZWdpc3Rlci4gKi8KKwl1bnNpZ25lZCBsb25nIGlycV9jdHJsX3JlZzsJCS8qKjwgVGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CS8qKjwgVGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIuIEFsc28gaW50ZXJydXB0IHJlc2V0aW5nIHJlZ2lzdGVyIChmaXJtd2FyZSB2ZXJzaW9uIDcgYW5kIGxhdGVyKS4qLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgZmlybXdhcmVfdmVyc2lvbl9yZWc7CS8qKjwgVGhlIGludGVycnVwdCByZXNldGluZyByZWdpc3Rlci4gKi8KKworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19sb3dfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgZXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyIChsb3cgcGFydCkuICovCisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX2hpZ2hfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgZXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyIChoaWdoIHBhcnQpLiAqLworfSBtZTgyMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyMDBfZGlfc3ViZGV2aWNlX3QgKm1lODIwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgyMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRpX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfY3RybF9sb2NrLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YTYxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RpX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RJX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyBDb21tb24gcmVnaXN0cnkgZm9yIHdob2xlIGZhbWlseS4KKyNkZWZpbmUgTUU4MjAwX0RJX1BPUlRfMF9SRUcJCQkJCTB4MwkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9QT1JUXzFfUkVHCQkJCQkweDQJLy8gUgorCisjZGVmaW5lIE1FODIwMF9ESV9NQVNLXzBfUkVHCQkJCQkweDUJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESV9NQVNLXzFfUkVHCQkJCQkweDYJLy8gUi9XCisKKyNkZWZpbmUgTUU4MjAwX0RJX0NPTVBBUkVfMF9SRUcJCQkJCTB4QQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJX0NPTVBBUkVfMV9SRUcJCQkJCTB4QgkvLyBSL1cKKworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfUkVHCQkJCQkweEMJLy8gUi9XCisKKyNpZm5kZWYgTUU4MjAwX0lSUV9NT0RFX1JFRworIyBkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1JFRwkJCQkJMHhECS8vIFIvVworI2VuZGlmCisKKy8vIFRoaXMgcmVnaXN0cnkgYXJlIGZvciBhbGwgdmVyc2lvbnMKKyNkZWZpbmUgTUU4MjAwX0RJX0NIQU5HRV8wX1JFRwkJCQkJMHhFCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0NIQU5HRV8xX1JFRwkJCQkJMHhGCS8vIFIKKworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSCQkJMHg0CisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFCQkJMHg4CisKKy8vIFRoaXMgcmVnaXN0cnkgYXJlIGZvciBmaXJtd2FyZSB2ZXJzaW9ucyA3IGFuZCBsYXRlcgorI2RlZmluZSBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0xPV19SRUcJCTB4MTAJLy8gUgorI2RlZmluZSBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0hJR0hfUkVHCQkweDExCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9MT1dfUkVHCQkweDEyCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9ISUdIX1JFRwkJMHgxMwkvLyBSCisKKyNpZm5kZWYgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHCisjIGRlZmluZSBNRTgyMDBfRklSTVdBUkVfVkVSU0lPTl9SRUcJCQkweDE0CS8vIFIKKyNlbmRpZgorCisvLyBCaXQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRQkJCTB4MworI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORwkJMHgwCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0VfRkFMTElORwkweDEKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRV9BTlkJCTB4MworCisvLyBPdGhlcnMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUCQkJCTQKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOGNhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jCkBAIC0wLDAgKzEsNDE4IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaW8uYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KDB4MyA8PCAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3Qgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJCW1vZGUgfD0KKwkJCQkgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgZGlvX2lkeCAqIDIpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIHBvcnQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQkJcG9ydF9yZWcpICYgKDB4MDAwMSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHx8ICFtb2RlKSB7CisJCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisJdWludDhfdCBieXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBieXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlvdXRiKHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU4MjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU4MjAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgZGlnaXRhbCBpL28gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0RJT19DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRElPX1BPUlRfUkVHICsgZGlvX2lkeDsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTgyMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRkOTNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgyMDBfRElPX0hfCisjZGVmaW5lIF9NRTgyMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU4MjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyMDBfZGlvX3N1YmRldmljZV90ICptZTgyMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTRhMTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESU9fUkVHX0hfCisjZGVmaW5lIF9NRTgyMDBfRElPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9SRUcJCQkJCTB4NwkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUXzBfUkVHCQkJCTB4OAkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUXzFfUkVHCQkJCTB4OQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RJT19QT1JUX1JFRwkJCQkJTUU4MjAwX0RJT19QT1JUXzBfUkVHCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wCQkJMHgwMQorI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMQkJCTB4MDIKKyNkZWZpbmUgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzIJCQkweDA0CisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8zCQkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGJhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvLmMKQEAgLTAsMCArMSw2MDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmIChpcnFfc291cmNlICE9IE1FX0lSUV9TT1VSQ0VfRElPX09WRVJfVEVNUCkgeworCQlQRVJST1IoIkludmFsaWQgaW50ZXJydXB0IHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwgKE1FODIwMF9JUlFfTU9ERV9QT1dFUl9TSElGVCAqCisJCQkJCQkgaW5zdGFuY2UtPmRvX2lkeCk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisKKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgd2FpdF9xdWV1ZSwKKwkJCQkJCQkgICAgIChpbnN0YW5jZS0+cmlzZWQgIT0KKwkJCQkJCQkgICAgICAwKSwgdCk7CisKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGV4dGVybmFsIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+Y291bnQ7CisJKnZhbHVlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX2lycV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUICogaW5zdGFuY2UtPmRvX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUiA8PAorCSAgICAgIChNRTgyMDBfSVJRX01PREVfUE9XRVJfU0hJRlQgKiBpbnN0YW5jZS0+ZG9faWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IC0xOworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19PVVRQVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQlzdGF0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJc3RhdGUgPQorCQkJICAgIHZhbHVlID8gKHN0YXRlIHwgKDB4MSA8PCBjaGFubmVsKSkgOiAoc3RhdGUgJgorCQkJCQkJCQkgIH4oMHgxIDw8CisJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQlvdXRiKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRE87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19PVkVSX1RFTVBfSVJROworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZG9fZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9kb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfZG9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdWludDhfdCBpcnFfc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIGRldl9pZDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5iKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEKKwkgICAgKGlycV9zdGF0dXMgJgorCSAgICAgKE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUgPDwgaW5zdGFuY2UtPmRvX2lkeCkpKSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmRvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwlpbnN0YW5jZS0+Y291bnQrKzsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9IE1FODIwMF9JUlFfTU9ERV9CSVRfQ0xFQVJfUE9XRVIgPDwgaW5zdGFuY2UtPmRvX2lkeDsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0gfihNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSIDw8IGluc3RhbmNlLT5kb19pZHgpOworCW91dHcoY3RybCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgKi8KKwlzdWJkZXZpY2UtPmRvX2lkeCA9IGRvX2lkeDsKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fUE9SVF8wX1JFRzsKKwl9IGVsc2UgaWYgKGRvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ET19QT1JUXzFfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRvX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fSVJRX1NUQVRVU19SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVxdWVzdCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1lODIwMF9kb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIGlycSk7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTgyMDBfZG9faW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTgyMDBfZG9faW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lODIwMF9kb19pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZG9fZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX0hfCisjZGVmaW5lIF9NRTgyMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqaXJxX21vZGVfbG9jazsKKworCWludCBpcnE7CQkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZCAqLworCWludCBjb3VudDsJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBUbyB3YWl0IG9uIGludGVycnVwdHMgKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBkaWdpdGFsIG91dHB1dCAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIG91dHB1dCBwb3J0ICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX1JFRwkJCTB4MAkvLyBSCisjZGVmaW5lIE1FODIwMF9ET19QT1JUXzBfUkVHCQkJCTB4MQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RPX1BPUlRfMV9SRUcJCQkJMHgyCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUJCTB4MQorI2RlZmluZSBNRTgyMDBfRE9fSVJRX1NUQVRVU19TSElGVAkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX1JFR19IXworI2RlZmluZSBfTUU4MjAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJMHhECS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLICAgICAJCQkweDMKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfTUFTS19NQVNLCQkJMHgwCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLX0NPTVBBUkUJCQkweDEKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUgkJMHgxMAorI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSCQkJMHg0MAorCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9ESV9TSElGVAkJCTIKKyNkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0LmMKQEAgLTAsMCArMSwxMTc2IEBACisvKioKKyAqIEBmaWxlIG1lODI1NC5jCisgKgorICogQGJyaWVmIDgyNTQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjU0X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FODI1NF9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSX1dJRFRIIDE2CQkJLyoqPCBPbmUgY291bnRlciBoYXMgMTYgYml0cy4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY2xrX3NyYzsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMCB8CisJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwljbGtfc3JjID0gaW5iKGluc3RhbmNlLT5jbGtfc3JjX3JlZyk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0KKwkJCQkgICAgfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaIHwKKwkJCQkgICAgICBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8yX0NMS19TUkNfUFJFVik7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkKKwkJCQljbGtfc3JjICY9CisJCQkJICAgIH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWiB8CisJCQkJICAgICAgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19RVUFSWik7CisJCQllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYpOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCisJCS8qIE5vIGNsb2NrIHNvdXJjZSByZWdpc3RlciBhdmFpbGFibGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKCFlcnIpCisJCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE0MDBfYWJfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUFJFVik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9QUkVWSU9VUzoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9CXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFo6CisJCWlmIChpbnN0YW5jZS0+bWU4MjU0X2lkeCA9PSAwKSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfY2RfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX1BSRVZJT1VTOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfTUFTSyk7CisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQ0RfODI1NF9BQ0VfMV9DTEtfU1JDX1BSRVYpOworCQkJfSBlbHNlIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9JTlRFUk5BTF8xTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwlzd2l0Y2ggKHJlZikgeworCisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQkvLyBOb3RoaW5nIHRvIGRvCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX3JlZl9jb25maWcobWU4MjU0X3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCByZWYpCit7CisJc3dpdGNoIChyZWYpIHsKKworCWNhc2UgTUVfUkVGX0NUUl9FWFRFUk5BTDoKKwkJLy8gTm90aGluZyB0byBkbworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkvLyBDb25maWd1cmUgdGhlIGNvdW50ZXIgbW9kZXMKKwlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMSkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00xIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMiB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTMgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX000IHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiIpOworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQl9CisJfQorCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUI6CisJCWVyciA9IG1lMTQwMF9hYl9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQllcnIgPSBtZTE0MDBfY2RfcmVmX2NvbmZpZyhpbnN0YW5jZSwgcmVmKTsKKworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCWVyciA9IG1lNDYwMF9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJZXJyID0gbWU4MTAwX3JlZl9jb25maWcoaW5zdGFuY2UsIHJlZik7CisKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU0X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBsb19ieXRlOworCXVpbnQxNl90IGhpX2J5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfVExPLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJbG9fYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJaGlfYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJKnZhbHVlID0gbG9fYnl0ZSB8IChoaV9ieXRlIDw8IDgpOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTRfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoKHZhbHVlID4+IDgpLCBpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IE1FODI1NF9OVU1CRVJfQ0hBTk5FTFM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9DVFI7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX0NUUl84MjU0OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCSpjYXBzID0gaW5zdGFuY2UtPmNhcHM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlpZiAoY2FwID09IE1FX0NBUF9DVFJfV0lEVEgpIHsKKwkJYXJnc1swXSA9IE1FODI1NF9DVFJfV0lEVEg7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBBQl84MjU0X0FfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CX0NUUkxfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMEFCX2dldF9jbGtfc3JjX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCQkgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfQ0xLX1NSQ19SRUcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCX0NMS19TUkNfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF92YWxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLCB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9BXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0JfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgMzoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9EXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0VfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgNjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0NfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDE6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRyk7CisKKwljYXNlIDQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRyk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDc6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0VfQ1RSTF9SRUcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQ0RfZ2V0X2Nsa19zcmNfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJCSB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzBfUkVHKTsKKworCWNhc2UgMjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfQ0xLX1NSQ18xX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMV9SRUcpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzJfUkVHKTsKKworCWNhc2UgNToKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzFfUkVHKTsKKworCWNhc2UgODoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18xX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzJfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lNDYwMF9nZXRfdmFsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJcmV0dXJuIChyZWdfYmFzZSArIE1FNDYwMF84MjU0XzBfVkFMX1JFRyArIGN0cl9pZHgpOworfQorCitzdGF0aWMgdWludDMyX3QgbWU0NjAwX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTQ2MDBfODI1NF9DVFJMX1JFRyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtZTgxMDBfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTgxMDBfQ09VTlRFUl9SRUdfMCArIGN0cl9pZHggKiAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IG1lODEwMF9nZXRfY3RybF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlyZXR1cm4gKHJlZ19iYXNlICsgTUU4MTAwX0NPVU5URVJfQ1RSTF9SRUcpOworfQorCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jaykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UKKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyNTRfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIDgyNTQgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODI1NF9zdWJkZXZpY2VfdCkpOworCisJLy8gQ2hlY2sgaWYgY291bnRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKworCWlmIChjdHJfaWR4ID4gMikgeworCQlQRVJST1IoIkNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPmNsa19zcmNfcmVnX2xvY2sgPSBjbGtfc3JjX3JlZ19sb2NrOworCisJLy8gU2F2ZSB0eXBlIG9mIE1laWxoYXVzIGRldmljZQorCXN1YmRldmljZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisJLy8gU2F2ZSB0aGUgaW5kaWNlcworCXN1YmRldmljZS0+bWU4MjU0X2lkeCA9IG1lODI1NF9pZHg7CisJc3ViZGV2aWNlLT5jdHJfaWR4ID0gY3RyX2lkeDsKKworCS8vIERvIGRldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLy8gRmFsbCB0aHJvdWdoCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKQorCQkJc3ViZGV2aWNlLT5jYXBzID0KKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWiB8CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUw7CisJCWVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gNCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiA5KSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKSB7CisJCQlpZiAobWU4MjU0X2lkeCA9PSAwKQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUyB8CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQkJZWxzZQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQl9IGVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQ0RfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvLyBJbml0aWFsaXplIHRoZSBjb3VudGVycyBjYXBhYmlsaXRpZXMKKwkJc3ViZGV2aWNlLT5jYXBzID0gTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTQ2MDBfZ2V0X3ZhbF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0KKwkJICAgIG1lNDYwMF9nZXRfY3RybF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmNsa19zcmNfcmVnID0gMDsJLy8gTm90IHVzZWQKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkvLyBDaGVjayBpZiA4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZQorCQlpZiAobWU4MjU0X2lkeCA+IDApIHsKKwkJCVBFUlJPUigiODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgY2FwYWJpbGl0aWVzCisJCXN1YmRldmljZS0+Y2FwcyA9IE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTDsKKworCQkvLyBHZXQgdGhlIGNvdW50ZXJzIHJlZ2lzdGVycworCQlzdWJkZXZpY2UtPnZhbF9yZWcgPQorCQkgICAgbWU4MTAwX2dldF92YWxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJCSAgICBtZTgxMDBfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9IDA7CS8vIE5vdCB1c2VkCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCVBFUlJPUigiTm8gODI1NCBzdWJkZXZpY2VzIGF2YWlsYWJsZSBmb3Igc3ViZGV2aWNlIGRldmljZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiVW5rbm93biBkZXZpY2UgdHlwZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTRfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU0X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU0X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogQGZpbGUgbWU4MjU0LmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODI1NF9IXworI2RlZmluZSBfTUU4MjU0X0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIDgyNTQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyNTRfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIHR5cGUgY2FycnlpbmcgdGhlIDgyNTQgY2hpcC4gKi8KKwlpbnQgbWU4MjU0X2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBjdHJfaWR4OwkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgY291bnRlciBvbiB0aGUgODI1NCBjaGlwLiAqLworCisJaW50IGNhcHM7CQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuICovCisKKwl1bnNpZ25lZCBsb25nIHZhbF9yZWc7CQkJLyoqPCBIb2xkcyB0aGUgYWN0dWFsIGNvdW50ZXIgdmFsdWUuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgODI1NCBtb2Rlcy4gKi8KKwl1bnNpZ25lZCBsb25nIGNsa19zcmNfcmVnOwkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIGNvdW50ZXIgY29ubmVjdGlvbnMuICovCit9IG1lODI1NF9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU0LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU0X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGN0cl9pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTQgY2hpcC4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIDgyNTQgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIGNsa19zcmNfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyNTRfcmVnLmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FODI1NF9SRUdfSF8KKyNkZWZpbmUgX01FODI1NF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogTUUxNDAwIEEvQiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9WQUxfUkVHCQkweDAwMDUgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDA2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRwkJMHgwMDA3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9WQUxfUkVHCQkweDAwMEQgLyoqPCBPZmZzZXQgb2YgODI1NCBCIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDBFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl9DVFJMX1JFRwkJMHgwMDBGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCX0NMS19TUkNfUkVHCQkJMHgwMDEwIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3Rlci4gKi8KKworLyogTUUxNDAwIEMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8xX1ZBTF9SRUcJCTB4MDAwNSAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8yX1ZBTF9SRUcJCTB4MDAwNiAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRwkJCTB4MDAwNyAvKio8IE9mZnNldCBvZiA4MjU0IEEgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8xX1ZBTF9SRUcJCTB4MDAwRCAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8yX1ZBTF9SRUcJCTB4MDAwRSAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRwkJCTB4MDAwRiAvKio8IE9mZnNldCBvZiA4MjU0IEIgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcJCTB4MDAxMCAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18xX1ZBTF9SRUcJCTB4MDAxMSAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18yX1ZBTF9SRUcJCTB4MDAxMiAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRwkJCTB4MDAxMyAvKio8IE9mZnNldCBvZiA4MjU0IEMgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8wX1ZBTF9SRUcJCTB4MDAxNCAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8xX1ZBTF9SRUcJCTB4MDAxNSAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8yX1ZBTF9SRUcJCTB4MDAxNiAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRwkJCTB4MDAxNyAvKio8IE9mZnNldCBvZiA4MjU0IEQgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8wX1ZBTF9SRUcJCTB4MDAxOCAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8xX1ZBTF9SRUcJCTB4MDAxOSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8yX1ZBTF9SRUcJCTB4MDAxQSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRwkJCTB4MDAxQiAvKio8IE9mZnNldCBvZiA4MjU0IEUgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDX0NMS19TUkNfMF9SRUcgIAkJCTB4MDAxQyAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMC4gKi8KKyNkZWZpbmUgTUUxNDAwQ19DTEtfU1JDXzFfUkVHICAJCQkweDAwMUQgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDEuICovCisjZGVmaW5lIE1FMTQwMENfQ0xLX1NSQ18yX1JFRyAgCQkJMHgwMDFFIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAyLiAqLworCisvKiBNRTE0MDAgRCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzBfVkFMX1JFRwkJMHgwMDQ0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzFfVkFMX1JFRwkJMHgwMDQ1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDQ2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BX0NUUkxfUkVHCQkJMHgwMDQ3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRwkJMHgwMDRDIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzFfVkFMX1JFRwkJMHgwMDREIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDRFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CX0NUUkxfUkVHCQkJMHgwMDRGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzBfVkFMX1JFRwkJMHgwMDUwIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzFfVkFMX1JFRwkJMHgwMDUxIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzJfVkFMX1JFRwkJMHgwMDUyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DX0NUUkxfUkVHCQkJMHgwMDUzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzBfVkFMX1JFRwkJMHgwMDU0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzFfVkFMX1JFRwkJMHgwMDU1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzJfVkFMX1JFRwkJMHgwMDU2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EX0NUUkxfUkVHCQkJMHgwMDU3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzBfVkFMX1JFRwkJMHgwMDU4IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzFfVkFMX1JFRwkJMHgwMDU5IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzJfVkFMX1JFRwkJMHgwMDVBIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FX0NUUkxfUkVHCQkJMHgwMDVCIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyAgCQkJMHgwMDVDIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAwLiAqLworI2RlZmluZSBNRTE0MDBEX0NMS19TUkNfMV9SRUcgIAkJCTB4MDA1RCAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMS4gKi8KKyNkZWZpbmUgTUUxNDAwRF9DTEtfU1JDXzJfUkVHICAJCQkweDAwNUUgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDIuICovCisKKy8qIE1FNDYwMCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FNDYwMF84MjU0XzBfVkFMX1JFRwkJCTB4MDAwMCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfODI1NF8xX1ZBTF9SRUcJCQkweDAwMDEgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMCB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwXzgyNTRfMl9WQUxfUkVHCQkJMHgwMDAyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF84MjU0X0NUUkxfUkVHCQkJMHgwMDAzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisvKiBDb21tYW5kIHdvcmRzIGZvciA4MjU0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfU0MwICAgMHgwMAkgLyoqPCBDb3VudGVyIDAgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9TQzEgICAweDQwCSAvKio8IENvdW50ZXIgMSBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX1NDMiAgIDB4ODAJIC8qKjwgQ291bnRlciAyIHNlbGVjdGlvbi4gKi8KKworI2RlZmluZSBNRTgyNTRfQ1RSTF9UTE8gICAweDAwCSAvKio8IENvdW50ZXIgbGF0Y2hpbmcgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9MU0IgICAweDEwCSAvKio8IE9ubHkgcmVhZCBMU0IuICovCisjZGVmaW5lIE1FODI1NF9DVFJMX01TQiAgIDB4MjAJIC8qKjwgT25seSByZWFkIE1TQi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTE0gICAgMHgzMAkgLyoqPCBGaXJzdCByZWFkIExTQiwgdGhlbiBNU0IuICAqLworCisjZGVmaW5lIE1FODI1NF9DVFJMX00wICAgIDB4MDAJIC8qKjwgTW9kZSAwIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTEgICAgMHgwMgkgLyoqPCBNb2RlIDEgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NMiAgICAweDA0CSAvKio8IE1vZGUgMiBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX00zICAgIDB4MDYJIC8qKjwgTW9kZSAzIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTQgICAgMHgwOAkgLyoqPCBNb2RlIDQgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NNSAgICAweDBBCSAvKio8IE1vZGUgNSBzZWxlY3Rpb24uICovCisKKyNkZWZpbmUgTUU4MjU0X0NUUkxfQklOICAgMHgwMAkgLyoqPCBCaW5hcnkgY291bnRlci4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfQkNEICAgMHgwMQkgLyoqPCBCQ0QgY291bnRlci4gKi8KKworLyogTUUtMTQwMCBBL0IgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzBfQ0xLX1NSQ18xTUhaCQkoMCA8PCA3KQkvKio8IDFNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfMTBNSFoJCSgxIDw8IDcpCS8qKjwgMTBNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUElOCQkoMCA8PCA2KQkvKio8IENMSyAwIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaCQkoMSA8PCA2KQkvKio8IENvbm5lY3QgQ0xLIDAgd2l0aCBxdWFyei4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9DTEtfU1JDX1BJTgkJKDAgPDwgNSkJLyoqPCBDTEsgMSB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWCQkoMSA8PCA1KQkvKio8IENvbm5lY3QgT1VUIDAgd2l0aCBDTEsgMS4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMl9DTEtfU1JDX1BJTgkJKDAgPDwgNCkJLyoqPCBDTEsgMiB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWCQkoMSA8PCA0KQkvKio8IENvbm5lY3QgT1VUIDEgd2l0aCBDTEsgMi4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDXzFNSFoJCSgwIDw8IDMpCS8qKjwgMU1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWgkJKDEgPDwgMykJLyoqPCAxME1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19QSU4JCSgwIDw8IDIpCS8qKjwgQ0xLIDAgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX0NMS19TUkNfUVVBUloJCSgxIDw8IDIpCS8qKjwgQ29ubmVjdCBDTEsgMCB3aXRoIHF1YXJ6LiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUElOCQkoMCA8PCAxKQkvKio8IENMSyAxIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYJCSgxIDw8IDEpCS8qKjwgQ29ubmVjdCBPVVQgMCB3aXRoIENMSyAxLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUElOCQkoMCA8PCAwKQkvKio8IENMSyAyIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYJCSgxIDw8IDApCS8qKjwgQ29ubmVjdCBPVVQgMSB3aXRoIENMSyAyLiAqLworCisvKiBNRS0xNDAwIEMvRCBjbG9jayBzb3VyY2UgcmVnaXN0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0sJMHgwMwkvKio8IE1hc2tzIGFsbCBDTEsgc291cmNlIGJpdHMuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QSU4JCTB4MDAJLyoqPCBDb25uZWN0IENMSyB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDXzFNSFoJMHgwMQkvKio8IENvbm5lY3QgQ0xLIHRvIDFNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWgkweDAyCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWCTB4MDMJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dCBvbiBNRS0xNDAwIEQgZXh0ZW5zaW9uLiAqLworCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLCTB4MDQJLyoqPCBNYXNrcyBhbGwgQ0xLIHNvdXJjZSBiaXRzLiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19QUkVWCTB4MDQJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8yX0NMS19TUkNfTUFTSwkweDA4CS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX1BJTgkJMHgwMAkvKio8IENvbm5lY3QgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWCTB4MDgJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLCQkweDMwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8wX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzFNSFoJCTB4MTAJLyoqPCBDb25uZWN0IENMSyB0byAxTUh6LiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xME1IWgkweDIwCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX1BSRVYJCTB4MzAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLCQkweDQwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX1BSRVYJCTB4NDAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLCQkweDgwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8yX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYJCTB4ODAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworLyogTUUtODEwMCBjb3VudGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9SRUdfMAkJCQkweDE4CS8vKHIsdykKKyNkZWZpbmUgTUU4MTAwX0NPVU5URVJfUkVHXzEJCQkJMHgxQQkvLyhyLHcpCisjZGVmaW5lIE1FODEwMF9DT1VOVEVSX1JFR18yCQkJCTB4MUMJLy8ocix3KQorI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9DVFJMX1JFRwkJCQkweDFFCS8vKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBlN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5jCkBAIC0wLDAgKzEsNDYyIEBACisvKioKKyAqIEBmaWxlIG1lODI1NS5jCisgKgorICogQGJyaWVmIDgyNTUgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWU4MjU1X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdWludDhfdCBnZXRfbW9kZV9mcm9tX21pcnJvcih1aW50MzJfdCBtaXJyb3IpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzBfT1VUUFVUKSB7CisJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8xX09VVFBVVCkgeworCQkJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzJfT1VUUFVUKSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX09PTzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX0lPTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PSU87CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JSU87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMV9PVVRQVVQpIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PT0k7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JT0k7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMl9PVVRQVVQpIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfT0lJOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfSUlJOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yICY9CisJICAgIH4oTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjU1X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkqaW5zdGFuY2UtPmN0cmxfcmVnX21pcnJvciAmPQorCQkgICAgfihNRTgyNTVfUE9SVF8wX09VVFBVVCA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCQkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yIHw9CisJCSAgICAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCQlvdXRiKGdldF9tb2RlX2Zyb21fbWlycm9yKCppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yKSwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyNTVfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgYnl0ZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCWlmICgqaW5zdGFuY2UtPgorCQkJICAgIGN0cmxfcmVnX21pcnJvciAmIChNRTgyNTVfUE9SVF8wX09VVFBVVCA8PAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmRpb19pZHgpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoKmluc3RhbmNlLT4KKwkJCSAgICBjdHJsX3JlZ19taXJyb3IgJiAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5kaW9faWR4KSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUU4MjU1X05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjU1X3N1YmRldmljZV90ICptZTgyNTVfY29uc3RydWN0b3IodWludDMyX3QgZGV2aWNlX2lkLAorCQkJCSAgICAgICB1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG1lODI1NV9pZHgsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCSAgICAgICBpbnQgKmN0cmxfcmVnX21pcnJvciwKKwkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjU1X3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjU1X3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciA4MjU1IGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyNTVfc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+IDIpIHsKKwkJUEVSUk9SKCJESU8gaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIGdsb2JhbCBwb3J0IHNldHRpbmdzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19taXJyb3IgPSBjdHJsX3JlZ19taXJyb3I7CisKKwkvKiBTYXZlIHR5cGUgb2YgTWVpbGhhdXMgZGV2aWNlICovCisJc3ViZGV2aWNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisKKwkvKiBTYXZlIHRoZSBpbmRpY2VzICovCisJc3ViZGV2aWNlLT5tZTgyNTVfaWR4ID0gbWU4MjU1X2lkeDsKKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogRG8gZGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLyogQ2hlY2sgaWYgODI1NSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkJaWYgKG1lODI1NV9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogR2V0IHRoZSByZWdpc3RlcnMgKi8KKwkJaWYgKG1lODI1NV9pZHggPT0gMCkgeworCQkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUxNDAwQUJfUE9SVF9BX0NUUkw7CisJCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQV8wICsgZGlvX2lkeDsKKwkJfSBlbHNlIGlmIChtZTgyNTVfaWR4ID09IDEpIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQl9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBBQl9QT1JUX0JfMCArIGRpb19pZHg7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMSkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIEdldCB0aGUgcmVnaXN0ZXJzICovCisJCWlmIChtZTgyNTVfaWR4ID09IDApIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMENEX1BPUlRfQV9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0FfMCArIGRpb19pZHg7CisJCX0gZWxzZSBpZiAobWU4MjU1X2lkeCA9PSAxKSB7CisJCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0JfQ1RSTDsKKwkJCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUUxNDAwQ0RfUE9SVF9CXzAgKyBkaW9faWR4OworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIlVua25vd24gZGV2aWNlIHR5cGUuIGRldiBJRDogMHglMDR4XG4iLCBkZXZpY2VfaWQpOworCisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU1X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTVfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU1X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU1X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU1X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgyMzAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQGZpbGUgbWU4MjU1LmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgUElPIDgyNTUgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X0hfCisjZGVmaW5lIF9NRTgyNTVfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgODI1NSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODI1NV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgKmN0cmxfcmVnX21pcnJvcjsJCQkvKio8IFBvaW50ZXIgdG8gbWlycm9yIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBhbmQgI2N0cmxfcmVnX21pcnJvciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUgODI1NSBjaGlwLiAqLworCWludCBtZTgyNTVfaWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBkaW9faWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIERJTyBwb3J0IG9uIHRoZSA4MjU1IGNoaXAuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZSBhIHZhbHVlIGZyb20gb3IgdG8gdGhlIHBvcnQgcmVzcGVjdGl2ZWx5LiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIDgyNTUgbW9kZXMuICovCit9IG1lODI1NV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU1LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU1X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTUgY2hpcC4KKyAqIEBwYXJhbSBjdHJfcmVnX21pcnJvciBQb2ludGVyIHRvIG1pcnJvciBvZiBjb250cm9sIHJlZ2lzdGVyLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgODI1NSBjb250cm9sIHJlZ2lzdGVyIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTVfc3ViZGV2aWNlX3QgKm1lODI1NV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJICAgICAgIGludCAqY3RybF9yZWdfbWlycm9yLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU1X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIEBmaWxlIG1lODI1NV9yZWcuaAorICoKKyAqIEBicmllZiA4MjU1IGNvdW50ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X1JFR19IXworI2RlZmluZSBfTUU4MjU1X1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODI1NV9OVU1CRVJfQ0hBTk5FTFMJCTgJCS8qKjwgVGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgODI1NSBwb3J0LiAqLworCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV8wCQkJMHgwMDAwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9BXzEJCQkweDAwMDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0FfMgkJCTB4MDAwMgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV9DVFJMCQkweDAwMDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEEuICovCisKKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CXzAJCQkweDAwMDgJLyoqPCBQb3J0IDAgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0JfMQkJCTB4MDAwOQkvKio8IFBvcnQgMSBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQl8yCQkJMHgwMDBBCS8qKjwgUG9ydCAyIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CX0NUUkwJCTB4MDAwQgkvKio8IENvbnRyb2wgcmVnaXN0ZXIgZm9yIDgyNTUgQi4gKi8KKworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfMAkJCTB4MDAwMAkvKio8IFBvcnQgMCBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQV8xCQkJMHgwMDAxCS8qKjwgUG9ydCAxIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9BXzIJCQkweDAwMDIJLyoqPCBQb3J0IDIgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfQ1RSTAkJMHgwMDAzCS8qKjwgQ29udHJvbCByZWdpc3RlciBmb3IgODI1NSBBLiAqLworCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl8wCQkJMHgwMDQwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9CXzEJCQkweDAwNDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0JfMgkJCTB4MDA0MgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl9DVFJMCQkweDAwNDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEIuICovCisKKyNkZWZpbmUgTUU4MjU1X01PREVfT09PCQkJCTB4ODAJLyoqPCBQb3J0IDIgPSBPdXRwdXQsIFBvcnQgMSA9IE91dHB1dCwgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPTwkJCQkweDg5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IE91dHB1dCAqLworI2RlZmluZSBNRTgyNTVfTU9ERV9PSU8JCQkJMHg4MgkvKio8IFBvcnQgMiA9IE91dHB1dCwgUG9ydCAxID0gSW5wdXQsICBQb3J0IDAgPSBPdXRwdXQgKi8KKyNkZWZpbmUgTUU4MjU1X01PREVfSUlPCQkJCTB4OEIJLyoqPCBQb3J0IDIgPSBJbnB1dCwgIFBvcnQgMSA9IElucHV0LCAgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09PSQkJCQkweDkwCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPSQkJCQkweDk5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09JSQkJCQkweDkyCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lJSQkJCQkweDlCCS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisKKyNkZWZpbmUgTUU4MjU1X1BPUlRfMF9PVVRQVVQJCTB4MQkJLyoqPCBJZiBzZXQgaW4gbWlycm9yIHRoZW4gcG9ydCAwIGlzIGluIG91dHB1dCBtb2RlLiAqLworI2RlZmluZSBNRTgyNTVfUE9SVF8xX09VVFBVVAkJMHgyCQkvKio8IElmIHNldCBpbiBtaXJyb3IgdGhlbiBwb3J0IDEgaXMgaW4gb3V0cHV0IG1vZGUuICovCisjZGVmaW5lIE1FODI1NV9QT1JUXzJfT1VUUFVUCQkweDQJCS8qKjwgSWYgc2V0IGluIG1pcnJvciB0aGVuIHBvcnQgMiBpcyBpbiBvdXRwdXQgbW9kZS4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWNpcmNfYnVmLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioKKyAqIEBmaWxlIG1lY2lyY19idWYuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBjaXJjdWxhciBidWZmZXIgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FQ0lSQ19CVUZfSF8KKyNkZWZpbmUgX01FQ0lSQ19CVUZfSF8KKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisKK3R5cGVkZWYgc3RydWN0IG1lX2NpcmNfYnVmIHsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKy8vICAgICAgdW5zaWduZWQgaW50IGNvdW50OworCXVpbnQzMl90ICpidWY7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisJaW50IHZvbGF0aWxlIHRhaWw7Cit9IG1lX2NpcmNfYnVmX3Q7CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlcyhtZV9jaXJjX2J1Zl90ICogYnVmKQoreworLy8gICAgICByZXR1cm4gKChidWYtPmhlYWQgLSBidWYtPnRhaWwpICYgKGJ1Zi0+Y291bnQgLSAxKSk7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfc3BhY2UobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKy8vICAgICAgcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPmNvdW50IC0gMSkpOworCXJldHVybiAoKGJ1Zi0+dGFpbCAtIChidWYtPmhlYWQgKyAxKSkgJiAoYnVmLT5tYXNrKSk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlc190b19lbmQobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKwlpbnQgZW5kOworCWludCBuOworLy8gICAgICBlbmQgPSBidWYtPmNvdW50IC0gYnVmLT50YWlsOworLy8gICAgICBuID0gKGJ1Zi0+aGVhZCArIGVuZCkgJiAoYnVmLT5jb3VudCAtIDEpOworCWVuZCA9IGJ1Zi0+bWFzayArIDEgLSBidWYtPnRhaWw7CisJbiA9IChidWYtPmhlYWQgKyBlbmQpICYgKGJ1Zi0+bWFzayk7CisJcmV0dXJuIChuIDwgZW5kKSA/IG4gOiBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCWludCBlbmQ7CisJaW50IG47CisKKy8vICAgICAgZW5kID0gYnVmLT5jb3VudCAtIDEgLSBidWYtPmhlYWQ7CisvLyAgICAgIG4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPmNvdW50IC0gMSk7CisJZW5kID0gYnVmLT5tYXNrIC0gYnVmLT5oZWFkOworCW4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPm1hc2spOworCXJldHVybiAobiA8PSBlbmQpID8gbiA6IChlbmQgKyAxKTsKK30KKworI2RlZmluZSBfQ0JVRkZfMzJiX3QKKworIyAgZWxzZQkvL35CT1NDSAorLy8vIEBub3RlIGJ1Zi0+bWFzayA9IGJ1Zi0+Y291bnQtMSA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVC0xCisKKyMgICBpZmRlZiBfQ0JVRkZfMzJiX3QKKwkvLzMyIGJpdAordHlwZWRlZiBzdHJ1Y3QgbWVfY2lyY19idWZfMzJiIHsKKwlpbnQgdm9sYXRpbGUgaGVhZDsKKwlpbnQgdm9sYXRpbGUgdGFpbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsJLy9idWZmb3Igc2l6ZS0xIG11c3QgYmUgMl5uLTEgdG8gd29yaworCXVpbnQzMl90ICpidWY7Cit9IG1lX2NpcmNfYnVmX3Q7CisjICAgZWxzZQorCS8vMTYgYml0Cit0eXBlZGVmIHN0cnVjdCBtZV9jaXJjX2J1Zl8xNmIgeworCWludCB2b2xhdGlsZSBoZWFkOworCWludCB2b2xhdGlsZSB0YWlsOworCXVuc2lnbmVkIGludCBtYXNrOwkvL2J1ZmZvciBzaXplLTEgbXVzdCBiZSAyXm4tMSB0byB3b3JrCisJdWludDE2X3QgKmJ1ZjsKK30gbWVfY2lyY19idWZfdDsKKyMgICBlbmRpZiAvL19DQlVGRl8zMmJfdAorCisvKiogSG93IG1hbnkgdmFsdWVzIGlzIGluIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHNwYWNlIGxlZnQgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHZhbHVlcyBjYW4gYmUgcmVhZCBmcm9tIGJ1ZmZvciBpbiBvbmUgY2h1bmNrLiAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSA6IChidWYtPm1hc2sgLSBidWYtPnRhaWwgKworCQkJCQkJCTEpOworfQorCisvKiogSG93IG1hbnkgdmFsdWVzIGNhbiBiZSB3cml0ZSB0byBidWZmZXIgaW4gb25lIGNodW5jay4gKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5tYXNrIC0gYnVmLT5oZWFkICsgMSkgOiAoYnVmLT50YWlsIC0KKwkJCQkJCQkgICAgYnVmLT5oZWFkIC0gMSk7Cit9CisKKyMgIGVuZGlmIC8vQk9TQ0gKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVDSVJDX0JVRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ3YzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUJOm1lY29tbW9uLmgKKyAqIEF1dGhvcgk6R0cgKEd1ZW50ZXIgR2ViaGFyZHQpCTxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yCTpLRyAoS3J6eXN6dG9mIEdhbnR6a2UpCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVDT01NT05fSF8KKyNkZWZpbmUgX01FQ09NTU9OX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRoZSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBNRV9WRVJTSU9OX0RSSVZFUgorLyogVW5rbm93biB2ZXJzaW9uICovCisjIGRlZmluZSBNRV9WRVJTSU9OX0RSSVZFUgkweEZGRkZGRkZGCisjZW5kaWYKKworI2lmbmRlZiBMSUJNRURSSVZFUl9WRVJTSU9OCisvKiBVbmtub3duIHZlcnNpb24gKi8KKyMgZGVmaW5lIExJQk1FRFJJVkVSX1ZFUlNJT04JMHhGRkZGRkZGRgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKgorICogQGZpbGUgbWVkZWJ1Zy5oCisgKgorICogQGJyaWVmIERlYnVnZ2luZyBkZWZpbmVzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKyNpZm5kZWYgX01FREVCVUdfSF8KKyNkZWZpbmUgX01FREVCVUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvL01lc3NhZ2VzIGNvbnRyb2wuCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfQUxMCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGFsbCBpbmZvIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19URVNUCisjICBkZWZpbmUgTUVERUJVR19URVNUCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1RfSU5GTworIyAgZGVmaW5lIE1FREVCVUdfVEVTVF9JTkZPCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHX1JFRworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfUkVHCS8qIFN3aXRjaCB0byBlbmFibGUgcmVnaXN0cnkgYWNjZXNzIGRlYnVnaW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorIyBpZm5kZWYgTUVERUJVR19ERUJVR19MT0NLUworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfTE9DS1MJLyogU3dpdGNoIHRvIGVuYWJsZSBsb2NraW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfSU5GTwkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gIGFuZCB0ZXN0IG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19JTkZPCisjICBkZWZpbmUgTUVERUJVR19JTkZPCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gbWVzc2FnZXMuICovCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1QKKyMgIGRlZmluZSBNRURFQlVHX1RFU1QKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19URVNUCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGRlYnVnIHRlc3QgbWVzc2FnZXMuICovCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHCisjICBkZWZpbmUgTUVERUJVR19ERUJVRwkJLyogU3dpdGNoIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4gKi8KKyMgZW5kaWYKKyMgaWZuZGVmIE1FREVCVUdfRVJST1IKKyMgIGRlZmluZSBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19FUlJPUl9DUklUSUNBTAkvKiBBbHNvIGNyaXRpY2FsIGVycm9yIG1lc3NhZ2VzLiAqLworIyAgZGVmaW5lIE1FREVCVUdfRVJST1JfQ1JJVElDQUwJLyogU3dpdGNoIHRvIGVuYWJsZSBoaWdoIGltcG9ydGFuY2UgZXJyb3IgbWVzc2FnZXMuICovCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIFBERUJVRwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQSU5GTwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQRVJST1IJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUEVSUk9SX0NSSVRJQ0FMCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUERFQlVHX1JFRwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBERUJVR19MT0NLUwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBTRUNVUklUWQkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBMT0cJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisjIGRlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIEQ6IDwlcz4gIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfREVCVUdfTE9DS1MKKyMgZGVmaW5lIFBERUJVR19MT0NLUyhmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgTDogPCVzPiAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX0xPQ0tTKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKyMgZGVmaW5lIFBERUJVR19SRUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIFI6IDwlczolZD4gUkVHOiIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX1JFRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfSU5GTworIyBkZWZpbmUgUElORk8oZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlYgSTogIiBmbXQsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQSU5GTyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1IKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIiTUVfRFJWIEU6IDwlczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1JfQ1JJVElDQUwKKyMgZGVmaW5lIFBFUlJPUl9DUklUSUNBTChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBDOiA8JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQRVJST1JfQ1JJVElDQUwoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8vVGhpcyBkZWJ1ZyBpcyBvbmx5IHRvIGRldGVjdCBsb2dpY2FsIGVycm9ycyEKKyMgZGVmaW5lIFBTRUNVUklUWShmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBTRUNVUklUWTogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjYXJncykKKy8vVGhpcyBkZWJ1ZyBpcyB0byBrZWVwIHRyYWNrIGluIGN1c3RvbWVycycgc3lzdGVtCisjIGRlZmluZSBQTE9HKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0lORk8iTUVfRFJWOiAiIGZtdCwgIyNhcmdzKQorCisvL1RoaXMgZGVidWcgaXMgdG8gY2hlY2sgbmV3IHBhcnRzIGR1cmluZyBkZXZlbG9wbWVudAorI2lmZGVmIE1FREVCVUdfREVWRUxPUAorIyBkZWZpbmUgUERFVkVMT1AoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fQ1JJVCJNRV9EUlY6IDwlczolczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFVkVMT1AoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNlbmRpZiAvL19fS0VSTkVMX18KKyNlbmRpZiAvL19NRURFQlVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OGVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlZmluZXMuaApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWRlZmluZXMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yICAgICAgOiBLRyAoS3J6eXN6dG9mIEdhbnR6a2UpICA8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FREVGSU5FU19IXworI2RlZmluZSBfTUVERUZJTkVTX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEdlbmVyYWwKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfVkFMVUVfTk9UX1VTRUQJCQkJCQkJMHgwCisjZGVmaW5lIE1FX1ZBTFVFX0lOVkFMSUQJCQkJCQkJfjB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBhY2Nlc3MgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfUkVMRUFTRQkJCQkJCQkJMHgwMDAxMDAwMQorI2RlZmluZSBNRV9MT0NLX1NFVAkJCQkJCQkJCTB4MDAwMTAwMDIKKyNkZWZpbmUgTUVfTE9DS19DSEVDSwkJCQkJCQkJMHgwMDAxMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lT3BlbiBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9PUEVOX05PX0ZMQUdTCQkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lQ2xvc2UgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0xPU0VfTk9fRkxBR1MJCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrRHJpdmVyIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfRFJJVkVSX05PX0ZMQUdTCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrRGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfREVWSUNFX05PX0ZMQUdTCQkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgbWVMb2NrU3ViZGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0xPQ0tfU1VCREVWSUNFX05PX0ZMQUdTCQkJCQkweDAKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBlcnJvciBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfRVJST1JfTVNHX01BWF9DT1VOVAkJCQkJCTI1NgorCisjZGVmaW5lIE1FX1NXSVRDSF9ESVNBQkxFCQkJCQkJCTB4MDAwMjAwMDEKKyNkZWZpbmUgTUVfU1dJVENIX0VOQUJMRQkJCQkJCQkweDAwMDIwMDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgY29tbW9uIHRvIGlvIGZ1bmN0aW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9SRUZfRElPX0ZJRk9fTE9XCQkJCQkJCTB4MDAwMzAwMDEKKyNkZWZpbmUgTUVfUkVGX0RJT19GSUZPX0hJR0gJCQkJCQkweDAwMDMwMDAyCisKKyNkZWZpbmUgTUVfUkVGX0NUUl9QUkVWSU9VUwkJCQkJCQkweDAwMDQwMDAxCisjZGVmaW5lIE1FX1JFRl9DVFJfSU5URVJOQUxfMU1IWgkJCQkJMHgwMDA0MDAwMgorI2RlZmluZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaCQkJCQkweDAwMDQwMDAzCisjZGVmaW5lIE1FX1JFRl9DVFJfRVhURVJOQUwJCQkJCQkJMHgwMDA0MDAwNAorCisjZGVmaW5lIE1FX1JFRl9BSV9HUk9VTkQJCQkJCQkJMHgwMDA1MDAwMQorI2RlZmluZSBNRV9SRUZfQUlfRElGRkVSRU5USUFMCQkJCQkJMHgwMDA1MDAwMgorCisjZGVmaW5lIE1FX1JFRl9BT19HUk9VTkQJCQkJCQkJMHgwMDA2MDAwMQorCisjZGVmaW5lIE1FX1RSSUdfQ0hBTl9ERUZBVUxUCQkJCQkJMHgwMDA3MDAwMQorI2RlZmluZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMJCQkJCTB4MDAwNzAwMDIKKworI2RlZmluZSBNRV9UUklHX1RZUEVfTk9ORQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RSSUdfVFlQRV9TVwkJCQkJCQkJMHgwMDA4MDAwMQorI2RlZmluZSBNRV9UUklHX1RZUEVfVEhSRVNIT0xECQkJCQkJMHgwMDA4MDAwMgorI2RlZmluZSBNRV9UUklHX1RZUEVfV0lORE9XCQkJCQkJCTB4MDAwODAwMDMKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VER0UJCQkJCQkJMHgwMDA4MDAwNAorI2RlZmluZSBNRV9UUklHX1RZUEVfU0xPUEUJCQkJCQkJMHgwMDA4MDAwNQorI2RlZmluZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwJCQkJCTB4MDAwODAwMDYKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0cJCQkJCQkweDAwMDgwMDA3CisjZGVmaW5lIE1FX1RSSUdfVFlQRV9QQVRURVJOCQkJCQkJMHgwMDA4MDAwOAorI2RlZmluZSBNRV9UUklHX1RZUEVfVElNRVIJCQkJCQkJMHgwMDA4MDAwOQorI2RlZmluZSBNRV9UUklHX1RZUEVfQ09VTlQJCQkJCQkJMHgwMDA4MDAwQQorI2RlZmluZSBNRV9UUklHX1RZUEVfRk9MTE9XCQkJCQkJCTB4MDAwODAwMEIKKworI2RlZmluZSBNRV9UUklHX0VER0VfTk9ORQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RSSUdfRURHRV9BQk9WRQkJCQkJCQkweDAwMDkwMDAxCisjZGVmaW5lIE1FX1RSSUdfRURHRV9CRUxPVwkJCQkJCQkweDAwMDkwMDAyCisjZGVmaW5lIE1FX1RSSUdfRURHRV9FTlRSWQkJCQkJCQkweDAwMDkwMDAzCisjZGVmaW5lIE1FX1RSSUdfRURHRV9FWElUCQkJCQkJCTB4MDAwOTAwMDQKKyNkZWZpbmUgTUVfVFJJR19FREdFX1JJU0lORwkJCQkJCQkweDAwMDkwMDA1CisjZGVmaW5lIE1FX1RSSUdfRURHRV9GQUxMSU5HCQkJCQkJMHgwMDA5MDAwNgorI2RlZmluZSBNRV9UUklHX0VER0VfQU5ZCQkJCQkJCTB4MDAwOTAwMDcKKworI2RlZmluZSBNRV9USU1FUl9BQ1FfU1RBUlQJCQkJCQkJMHgwMDBBMDAwMQorI2RlZmluZSBNRV9USU1FUl9TQ0FOX1NUQVJUCQkJCQkJCTB4MDAwQTAwMDIKKyNkZWZpbmUgTUVfVElNRVJfQ09OVl9TVEFSVAkJCQkJCQkweDAwMEEwMDAzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9GcmVxdWVuY3lUb1RpY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0ZSRVFVRU5DWV9UT19USUNLU19OT19GTEFHUwkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU3RhcnQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fUEFUVEVSTgkJCQkJMHgwMDBCMDAwMQorI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19NQVNLCQkJCQkJMHgwMDBCMDAwMgorI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19MSU5FCQkJCQkJMHgwMDBCMDAwMworI2RlZmluZSBNRV9JUlFfU09VUkNFX0RJT19PVkVSX1RFTVAJCQkJCTB4MDAwQjAwMDQKKworI2RlZmluZSBNRV9JUlFfRURHRV9OT1RfVVNFRAkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfSVJRX0VER0VfUklTSU5HCQkJCQkJCTB4MDAwQzAwMDEKKyNkZWZpbmUgTUVfSVJRX0VER0VfRkFMTElORwkJCQkJCQkweDAwMEMwMDAyCisjZGVmaW5lIE1FX0lSUV9FREdFX0FOWQkJCQkJCQkJMHgwMDBDMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU3RhcnQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX05PX0ZMQUdTCQkJCQkweDAwMDAwMAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0JJVAkJCQkJCTB4MDAwMDAxCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9ESU9fQllURQkJCQkJMHgwMDAwMDIKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19XT1JECQkJCQkweDAwMDAwNAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0RXT1JECQkJCQkweDAwMDAwOAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfUEFUVEVSTl9GSUxURVJJTkcJCQkweDAwMDAxMAorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTCQkJCTB4MDAwMDIwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9JcnFXYWl0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUX05PX0ZMQUdTCQkJCQkJMHgwMDAwMDAKKyNkZWZpbmUgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUwkJCQkweDAwMDAwMQorI2RlZmluZSBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMJCQkJMHgwMDAwMDIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0b3AgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NUT1BfTk9fRkxBR1MJCQkJCQkweDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxU2V0Q2FsbGJhY2sgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fSVJRX1NFVF9DQUxMQkFDS19OT19GTEFHUwkJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1Jlc2V0RGV2aWNlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1JFU0VUX0RFVklDRV9OT19GTEFHUwkJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9SZXNldFN1YmRldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TaW5nbGVDb25maWcgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQJCQkJCTB4MDAwRDAwMDEKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUCQkJCQkweDAwMEQwMDAyCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFCQkJMHgwMDBEMDAwMworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LCQkJCQkweDAwMEQwMDA0CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRQkJCQkJMHgwMDBEMDAwNQorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19NVVgzMk0JCQkJCTB4MDAwRDAwMDYKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMgkJCQkweDAwMEQwMDA3CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOCQkJMHgwMDBEMDAwOAorCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wCQkJMHgwMDBFMDAwMQorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMQkJCTB4MDAwRTAwMDIKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIJCQkweDAwMEUwMDAzCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zCQkJMHgwMDBFMDAwNAorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNAkJCTB4MDAwRTAwMDUKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUJCQkweDAwMEUwMDA2CisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUwkJCQkweDAwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVAkJCQkJMHgwMQorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCQkJCTB4MDIKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRAkJCQkweDA0CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JECQkJCTB4MDgKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19NVUxUSVNJR19MRURfT04JCQkweDEwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTVVMVElTSUdfTEVEX09GRgkJMHgyMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0FJX1JNUwkJCQkJMHg0MAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0NPTlRJTlVFCQkJCTB4ODAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1NpbmdsZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TSU5HTEVfTk9fRkxBR1MJCQkJCQkweDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HCQkJCQkweDIwCisKKyNkZWZpbmUgTUVfRElSX0lOUFVUCQkJCQkJCQkweDAwMEYwMDAxCisjZGVmaW5lIE1FX0RJUl9PVVRQVVQJCQkJCQkJCTB4MDAwRjAwMDIKKworI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9OT19GTEFHUwkJCQkJMHgwMAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUCQkJCQkweDAxCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFCQkJCQkweDAyCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JECQkJCQkweDA0CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19EV09SRAkJCQkJMHgwOAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTCQkJMHgxMAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9XUklURV9OT05CTE9DS0lORwkJCTB4MjAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbUNvbmZpZyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX05PX0ZMQUdTCQkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOCQkJCTB4MQorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQJCQkJMHgyCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xECQkJMHg0CisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfSEFSRFdBUkVfT05MWQkJCTB4OAorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUdfVFlQRV9OT19GTEFHUwkJCTB4MAorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9UUklHR0VSX1RZUEVfTk9fRkxBR1MJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVJlYWQgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfUkVBRF9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDEwMDAwMQorI2RlZmluZSBNRV9SRUFEX01PREVfTk9OQkxPQ0tJTkcJCQkJCTB4MDAxMDAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRF9OT19GTEFHUwkJCQkJMHgwCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9SRUFEX0ZSQU1FUwkJCQkJMHgxCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1Xcml0ZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9XUklURV9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDExMDAwMQorI2RlZmluZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTEwMDAyCisjZGVmaW5lIE1FX1dSSVRFX01PREVfUFJFTE9BRAkJCQkJCTB4MDAxMTAwMDMKKworI2RlZmluZSBNRV9JT19TVFJFQU1fV1JJVEVfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFSVF9OT19GTEFHUwkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIE1FX1NUQVJUX01PREVfQkxPQ0tJTkcJCQkJCQkweDAwMTIwMDAxCisjZGVmaW5lIE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcJCQkJCTB4MDAxMjAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9OT19GTEFHUwkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTCTB4MQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU3RvcCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9OT19GTEFHUwkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9QUkVTRVJWRV9CVUZGRVJTCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1FX1NUT1BfTU9ERV9JTU1FRElBVEUJCQkJCQkweDAwMTMwMDAxCisjZGVmaW5lIE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFCQkJCQkJMHgwMDEzMDAwMgorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVE9QX1RZUEVfTk9fRkxBR1MJCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU3RhdHVzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1dBSVRfTk9ORQkJCQkJCQkJMHgwMDE0MDAwMQorI2RlZmluZSBNRV9XQUlUX0lETEUJCQkJCQkJCTB4MDAxNDAwMDIKKworI2RlZmluZSBNRV9TVEFUVVNfSU5WQUxJRAkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1NUQVRVU19JRExFCQkJCQkJCQkweDAwMTUwMDAxCisjZGVmaW5lIE1FX1NUQVRVU19CVVNZCQkJCQkJCQkweDAwMTUwMDAyCisjZGVmaW5lIE1FX1NUQVRVU19FUlJPUgkJCQkJCQkJMHgwMDE1MDAwMworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFUVVNfTk9fRkxBR1MJCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtU2V0Q2FsbGJhY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TRVRfQ0FMTEJBQ0tTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtTmV3VmFsdWVzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9ORVdfVkFMVUVTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPVGltZVRvVGlja3MgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1RJTUVfVE9fVElDS1NfTk9fRkxBR1MJCQkweDAwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1vZHVsZSB0eXBlcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19OT05FCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzEwVgkJCTB4MDAxNjAwMDEKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzIwVgkJCTB4MDAxNjAwMDIKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfRElGRjE2XzUwVgkJCTB4MDAxNjAwMDMKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfQ1VSUkVOVDE2XzBfMjBNQQkweDAwMTYwMDA0CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQxMDAJCQkweDAwMTYwMDA1CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQ1MDAJCQkweDAwMTYwMDA2CisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX1JURDhfUFQxMDAwCQkJMHgwMDE2MDAwNworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9CCQkJMHgwMDE2MDAwOAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9FCQkJMHgwMDE2MDAwOQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9KCQkJMHgwMDE2MDAwQQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9LCQkJMHgwMDE2MDAwQgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9OCQkJMHgwMDE2MDAwQworI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9SCQkJMHgwMDE2MDAwRAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9TCQkJMHgwMDE2MDAwRQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVFlQRV9UCQkJMHgwMDE2MDAwRgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19URThfVEVNUF9TRU5TT1IJCTB4MDAxNjAwMTAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVRdWVyeVN1YmRldmljZUNhcHMgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0FQU19OT05FCQkJCQkJCQkweDAwMDAwMDAwCisKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX0JJVAkJCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9CWVRFCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0RJT19ESVJfV09SRAkJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX0RXT1JECQkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRV9DQVBTX0RJT19TSU5LX1NPVVJDRQkJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9NQVNLX0lSUV9FREdFX1JJU0lORwkJMHgwMDAwMDA0MAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HCQkweDAwMDAwMDgwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9NQVNLX0lSUV9FREdFX0FOWQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fT1ZFUl9URU1QX0lSUQkJCQkJMHgwMDAwMDIwMAorCisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUwkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWgkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xME1IWgkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTAkJCQkJMHgwMDAwMDAwOAorCisjZGVmaW5lIE1FX0NBUFNfQUlfVFJJR19TWU5DSFJPTk9VUwkJCQkJMHgwMDAwMDAwMQorLy8vIEBub3RlIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIG1lMTYwMCBpbiBvbGQgc3R5bGUuCisjZGVmaW5lIE1FX0NBUFNfQUlfVFJJR19TSU1VTFRBTkVPVVMJCQkJTUVfQ0FQU19BSV9UUklHX1NZTkNIUk9OT1VTCisjZGVmaW5lIE1FX0NBUFNfQUlfRklGTwkJCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0FJX0ZJRk9fVEhSRVNIT0xECQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTCQkJCQkweDAwMDAwMDAxCisvLy8gQG5vdGUgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgbWUxNjAwIGluIG9sZCBzdHlsZS4KKyNkZWZpbmUgTUVfQ0FQU19BT19UUklHX1NJTVVMVEFORU9VUwkJCQlNRV9DQVBTX0FPX1RSSUdfU1lOQ0hST05PVVMKKyNkZWZpbmUgTUVfQ0FQU19BT19GSUZPCQkJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfQU9fRklGT19USFJFU0hPTEQJCQkJCTB4MDAwMDAwMDQKKworI2RlZmluZSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkcJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVfQ0FQU19FWFRfSVJRX0VER0VfRkFMTElORwkJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FX0NBUFNfRVhUX0lSUV9FREdFX0FOWQkJCQkJMHgwMDAwMDAwNAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZVF1ZXJ5U3ViZGV2aWNlQ2Fwc0FyZ3MgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfQ0FQX0FJX0ZJRk9fU0laRQkJCQkJCQkweDAwMUQwMDAwCisjZGVmaW5lIE1FX0NBUF9BSV9CVUZGRVJfU0laRQkJCQkJCTB4MDAxRDAwMDEKKworI2RlZmluZSBNRV9DQVBfQU9fRklGT19TSVpFCQkJCQkJCTB4MDAxRjAwMDAKKyNkZWZpbmUgTUVfQ0FQX0FPX0JVRkZFUl9TSVpFCQkJCQkJMHgwMDFGMDAwMQorCisjZGVmaW5lIE1FX0NBUF9DVFJfV0lEVEgJCQkJCQkJMHgwMDIwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBxdWVyeSBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfVU5JVF9JTlZBTElECQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1VOSVRfVk9MVAkJCQkJCQkJMHgwMDE3MDAwMQorI2RlZmluZSBNRV9VTklUX0FNUEVSRQkJCQkJCQkJMHgwMDE3MDAwMgorI2RlZmluZSBNRV9VTklUX0FOWQkJCQkJCQkJCTB4MDAxNzAwMDMKKworI2RlZmluZSBNRV9UWVBFX0lOVkFMSUQJCQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfVFlQRV9BTwkJCQkJCQkJCTB4MDAxODAwMDEKKyNkZWZpbmUgTUVfVFlQRV9BSQkJCQkJCQkJCTB4MDAxODAwMDIKKyNkZWZpbmUgTUVfVFlQRV9ESU8JCQkJCQkJCQkweDAwMTgwMDAzCisjZGVmaW5lIE1FX1RZUEVfRE8JCQkJCQkJCQkweDAwMTgwMDA0CisjZGVmaW5lIE1FX1RZUEVfREkJCQkJCQkJCQkweDAwMTgwMDA1CisjZGVmaW5lIE1FX1RZUEVfQ1RSCQkJCQkJCQkJMHgwMDE4MDAwNgorI2RlZmluZSBNRV9UWVBFX0VYVF9JUlEJCQkJCQkJCTB4MDAxODAwMDcKKworI2RlZmluZSBNRV9TVUJUWVBFX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9TVUJUWVBFX1NJTkdMRQkJCQkJCQkweDAwMTkwMDAxCisjZGVmaW5lIE1FX1NVQlRZUEVfU1RSRUFNSU5HCQkJCQkJMHgwMDE5MDAwMgorI2RlZmluZSBNRV9TVUJUWVBFX0NUUl84MjU0CQkJCQkJCTB4MDAxOTAwMDMKKyNkZWZpbmUgTUVfU1VCVFlQRV9BTlkJCQkJCQkJCTB4MDAxOTAwMDQKKworI2RlZmluZSBNRV9ERVZJQ0VfRFJJVkVSX05BTUVfTUFYX0NPVU5UCQkJCTY0CisjZGVmaW5lIE1FX0RFVklDRV9OQU1FX01BWF9DT1VOVAkJCQkJNjQKKworI2RlZmluZSBNRV9ERVZJQ0VfREVTQ1JJUFRJT05fTUFYX0NPVU5UCQkJCTI1NgorCisjZGVmaW5lIE1FX0JVU19UWVBFX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9CVVNfVFlQRV9QQ0kJCQkJCQkJCTB4MDAxQTAwMDEKKyNkZWZpbmUgTUVfQlVTX1RZUEVfVVNCCQkJCQkJCQkweDAwMUEwMDAyCisKKyNkZWZpbmUgTUVfUExVR0dFRF9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfUExVR0dFRF9JTgkJCQkJCQkJMHgwMDFCMDAwMQorI2RlZmluZSBNRV9QTFVHR0VEX09VVAkJCQkJCQkJMHgwMDFCMDAwMgorCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX0lOVkFMSUQJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTk9ORQkJCQkJCTB4MDAxQzAwMDEKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTVVYMzJNCQkJCQkweDAwMUMwMDAyCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX0RFTVVYMzIJCQkJCTB4MDAxQzAwMDMKKyNkZWZpbmUgTUVfRVhURU5TSU9OX1RZUEVfTVVYMzJTCQkJCQkweDAwMUMwMDA0CisKKyNkZWZpbmUgTUVfQUNDRVNTX1RZUEVfSU5WQUxJRAkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfQUNDRVNTX1RZUEVfTE9DQUwJCQkJCQkweDAwMUQwMDAxCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX1JFTU9URQkJCQkJCTB4MDAxRDAwMDIKKworLy8vIEBub3RlIEFkZCBieSBLRworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZVV0aWxpdHlQV00KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIE1FX1BXTV9TVEFSVF9DT05ORUNUX0lOVEVSTkFMCQkJCTB4MDAyMDAwMDEKKworLyogRmxhZ3MgZm9yIFNpbmdsZUNvbmZpZyBjaGFubmVscyBjb25maWd1cmUgKi8KKyNkZWZpbmUgTUVfU0lOR0xFX0NIQU5ORUxfTk9UX0NPTkZJR1VSRUQJCQkweDAwCisjZGVmaW5lIE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQJCQkJMHgwMQorCisvKiBEZWZpbmUgaWYgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgZG93bmxvYWRlZCB0byBkcml2ZXIgKi8KKyNkZWZpbmUgTUVfQ09ORklHX0xPQURfTk9fRkxBR1MJCQkJCQkweDAKKyNkZWZpbmUgTUVfQ09ORklHX0xPQURfVE9fRFJJVkVSCQkJCQkweDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjJlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYwpAQCAtMCwwICsxLDE3NDAgQEAKKy8qKgorICogQGZpbGUgbWVkZXZpY2UuYworICoKKyAqIEBicmllZiBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQocywKKwkJCQkJCSAgIGZpbGVwLAorCQkJCQkJICAgY2hhbm5lbCwKKwkJCQkJCSAgIGlycV9zb3VyY2UsCisJCQkJCQkgICBpcnFfZWRnZSwgaXJxX2FyZywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX2lycV93YWl0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQocywKKwkJCQkJCSAgZmlsZXAsCisJCQkJCQkgIGNoYW5uZWwsCisJCQkJCQkgIGlycV9jb3VudCwKKwkJCQkJCSAgdmFsdWUsIHRpbWVfb3V0LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9faXJxX3N0b3Aoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIGludCBzdWJkZXZpY2UsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19pcnFfc3RvcChzLCBmaWxlcCwgY2hhbm5lbCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKwlpbnQgaSwgbjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIHN1YmRldmljZXMuICovCisJbiA9IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCk7CisKKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogUmVzZXQgZXZlcnkgc3ViZGV2aWNlIGluIGxpc3QuICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgaSk7CisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UocywgZmlsZXAsIGZsYWdzKTsKKworCQlpZiAoZXJyKSB7CisJCQlQRVJST1IoIkNhbm5vdCByZXNldCBzdWJkZXZpY2UuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzLCBmaWxlcCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICBjaGFubmVsLAorCQkJCQkJICAgICAgIHNpbmdsZV9jb25maWcsCisJCQkJCQkgICAgICAgcmVmLAorCQkJCQkJICAgICAgIHRyaWdfY2hhbiwKKwkJCQkJCSAgICAgICB0cmlnX3R5cGUsCisJCQkJCQkgICAgICAgdHJpZ19lZGdlLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQocywKKwkJCQkJCSAgICAgZmlsZXAsCisJCQkJCQkgICAgIGNoYW5uZWwsCisJCQkJCQkgICAgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUocywKKwkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJICAgICAgY2hhbm5lbCwKKwkJCQkJCSAgICAgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICBjb25maWdfbGlzdCwKKwkJCQkJCSAgICAgICBjb3VudCwKKwkJCQkJCSAgICAgICB0cmlnZ2VyLAorCQkJCQkJICAgICAgIGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJCSAgICAgICBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhzLAorCQkJCQkJCSAgIGZpbGVwLAorCQkJCQkJCSAgIHRpbWVfb3V0LAorCQkJCQkJCSAgIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCByZWFkX21vZGUsCisJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHMsCisJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJICAgICByZWFkX21vZGUsCisJCQkJCQkgICAgIHZhbHVlcywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHMsCisJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgIHN0YXJ0X21vZGUsCisJCQkJCQkgICAgICB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMocywKKwkJCQkJCSAgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgICB3YWl0LAorCQkJCQkJICAgICAgIHN0YXR1cywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN1YmRldmljZSwgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcChzLAorCQkJCQkJICAgICBmaWxlcCwgc3RvcF9tb2RlLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZShzLAorCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkgICAgICB3cml0ZV9tb2RlLAorCQkJCQkJICAgICAgdmFsdWVzLCBjb3VudCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2xvY2tfZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXJldHVybiBtZV9kbG9ja19sb2NrKCZkZXZpY2UtPmRsb2NrLAorCQkJICAgICBmaWxlcCwgbG9jaywgZmxhZ3MsICZkZXZpY2UtPnNsaXN0KTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfbG9ja19zdWJkZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKHMsIGZpbGVwLCBsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgY2hhciAqKmRlc2NyaXB0aW9uKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqZGVzY3JpcHRpb24gPSBkZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnZlbmRvcl9pZCwKKwkJCQkgICAgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJICAgICAgIGludCAqc2VyaWFsX25vLAorCQkJCSAgICAgICBpbnQgKmJ1c190eXBlLAorCQkJCSAgICAgICBpbnQgKmJ1c19ubywKKwkJCQkgICAgICAgaW50ICpkZXZfbm8sIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChkZXZpY2UtPmJ1c190eXBlID09IE1FX0JVU19UWVBFX1BDSSkgeworCQkqdmVuZG9yX2lkID0gZGV2aWNlLT5pbmZvLnBjaS52ZW5kb3JfaWQ7CisJCSpkZXZpY2VfaWQgPSBkZXZpY2UtPmluZm8ucGNpLmRldmljZV9pZDsKKwkJKnNlcmlhbF9ubyA9IGRldmljZS0+aW5mby5wY2kuc2VyaWFsX25vOworCQkqYnVzX3R5cGUgPSBNRV9CVVNfVFlQRV9QQ0k7CisJCSpidXNfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnBjaV9idXNfbm87CisJCSpkZXZfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZfbm87CisJCSpmdW5jX25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfZnVuY19ubzsKKwkJKnBsdWdnZWQgPSBNRV9QTFVHR0VEX0lOOworCX0gZWxzZSB7CisJCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9PVVQ7CisJfQorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsIGNoYXIgKipuYW1lKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbmFtZSA9IGRldmljZS0+ZGV2aWNlX25hbWU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgIGNoYXIgKipuYW1lKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbmFtZSA9IGRldmljZS0+ZHJpdmVyX25hbWU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIG1lX3NsaXN0X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0LCBudW1iZXIpOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyhzLCBudW1iZXIpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgaW50IHN1YmRldmljZSwgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHMsIHVuaXQsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgocywKKwkJCQkJCQkgICAgIHVuaXQsCisJCQkJCQkJICAgICBtaW4sCisJCQkJCQkJICAgICBtYXgsCisJCQkJCQkJICAgICBtYXhkYXRhLCByYW5nZSk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyhzLAorCQkJCQkJICAgICAgIHJhbmdlLAorCQkJCQkJICAgICAgIHVuaXQsIG1pbiwgbWF4LCBtYXhkYXRhKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgICBpbnQgdHlwZSwKKwkJCQkJICAgICBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJcmV0dXJuIG1lX3NsaXN0X2dldF9zdWJkZXZpY2VfYnlfdHlwZSgmZGV2aWNlLT5zbGlzdCwKKwkJCQkJICAgICAgc3RhcnRfc3ViZGV2aWNlLAorCQkJCQkgICAgICB0eXBlLCBzdWJ0eXBlLCBzdWJkZXZpY2UpOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKHMsIHR5cGUsIHN1YnR5cGUpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzLCBjYXBzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MocywKKwkJCQkJCQkJY2FwLAorCQkJCQkJCQlhcmdzLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfdGltZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIHVpbnQ2NF90ICogbWluX3RpY2tzLCB1aW50NjRfdCAqIG1heF90aWNrcykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyKHMsCisJCQkJCQkgIHRpbWVyLAorCQkJCQkJICBiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkJCSAgbWluX3RpY2tzLCBtYXhfdGlja3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCQkgaW50ICp2ZXJzaW9uKQorLyoqIEB0b2RvIFZlcnNpb25zIHNob2xkIGJlIHJlYWQgZnJvbSBkcml2ZXIuIEkgbXVzdCBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiBpbiBlYWNoIG1vZHVsZS4gSGVyZSBzaG91bGQgYmUgcmV0dXJuZWQgYW4gZXJyb3IhCisqLworeworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9jb25maWdfbG9hZChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsJLy9JZiBubyBuZWVkIGZvciBjb25maWcgcmV0dXJuIHN1Y2Nlc3MuCisvLyAgICAgIHJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgdm9pZCBtZV9kZXZpY2VfZGVzdHJ1Y3RvcihtZV9kZXZpY2VfdCAqIG1lX2RldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfZGV2aWNlX2RlaW5pdChtZV9kZXZpY2UpOworCWtmcmVlKG1lX2RldmljZSk7Cit9CisKKy8qIC8vbWVfZGV2aWNlX3VzYl9pbml0CitpbnQgbWVfZGV2aWNlX3VzYl9pbml0KG1lX2RldmljZV90ICptZV9kZXZpY2UsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAtMTsKK30KKyovCisKK3N0YXRpYyBpbnQgZ2V0X2RldmljZV9kZXNjcmlwdGlvbnModWludDE2X3QgZGV2aWNlX2lkLAorCQkJCSAgIGNoYXIgKipkZXZpY2VfbmFtZSwKKwkJCQkgICBjaGFyICoqZGV2aWNlX2Rlc2NyaXB0aW9uLAorCQkJCSAgIGNoYXIgKipkcml2ZXJfbmFtZSkKKy8qKiBAdG9kbyBUaGlzIGlzIHdyb25nIGNvbmNlcHQhIFN0YXRpYyB0YWJsZSBoYXMgdG9vIHN0cm9uZyBsaW1pdGF0aW9ucyEKKyogJ2RldmljZV9uYW1lJyBhbmQgJ2RyaXZlcl9uYW1lJyBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tICdkZXZpY2VfaWQnCisqICdkZXZpY2VfZGVzY3JpcHRpb24nIHNob3VsZCBiZSByZWFkIGZyb20gZGV2aWNlIG9yIG1vdmVkIHRvIHVzZXIgc3BhY2UgYW5kIGhhbmRsZWQgYnkgbGlicmFyeSEKKyovCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTAwMF9OQU1FX0RFVklDRV9NRTEwMDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTEwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTAwMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxMDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBBOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBBOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUE7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVCOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEM7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRDsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA0VTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwOFU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlU6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDEyVTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4STsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2MTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDYxMDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY1MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MDsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSTsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBJUzsKKwkJKmRyaXZlcl9uYW1lID0gTUU0NjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFODsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFODsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFMTY7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDhESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDhESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDhESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3ODoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTk6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYyMDBJOURJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MjAwSTlESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MzAwSTlESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjMwMEk5RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMDoKKwkJKmRldmljZV9uYW1lID0gTUUwNjAwX05BTUVfREVWSUNFX01FMDYzMDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwOworCQkqZHJpdmVyX25hbWUgPSBNRTA2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqZGV2aWNlX25hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJKmRldmljZV9uYW1lID0gTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FODEwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0E6CisJCSpkZXZpY2VfbmFtZSA9IE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBBOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBBOworCQkqZHJpdmVyX25hbWUgPSBNRTgyMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9COgorCQkqZGV2aWNlX25hbWUgPSBNRTgyMDBfTkFNRV9ERVZJQ0VfTUU4MjAwQjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODIwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MjAwQjsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NDA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NTA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk1MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NjA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwOTAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpkZXZpY2VfbmFtZSA9IE1FUEhJU1RPX1MxX05BTUVfREVWSUNFOworCQkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJCSpkcml2ZXJfbmFtZSA9IE1FUEhJU1RPX1MxX05BTUVfRFJJVkVSOworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpkZXZpY2VfbmFtZSA9IEVNUFRZX05BTUVfREVWSUNFOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gRU1QVFlfREVTQ1JJUFRJT05fREVWSUNFOworCQkqZHJpdmVyX25hbWUgPSBFTVBUWV9OQU1FX0RSSVZFUjsKKworCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIGlkLlxuIik7CisKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZV9kZXZpY2VfcGNpX2luaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBJbml0aWFsaXplIGRldmljZSBsaXN0IGhlYWQuCisJSU5JVF9MSVNUX0hFQUQoJm1lX2RldmljZS0+bGlzdCk7CisKKwkvLyBJbml0aWFsaXplIGRldmljZSBkZXNjcmlwdGlvbiBzdHJpbmdzLgorCWVyciA9IGdldF9kZXZpY2VfZGVzY3JpcHRpb25zKHBjaV9kZXZpY2UtPmRldmljZSwKKwkJCQkgICAgICAmbWVfZGV2aWNlLT5kZXZpY2VfbmFtZSwKKwkJCQkgICAgICAmbWVfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24sCisJCQkJICAgICAgJm1lX2RldmljZS0+ZHJpdmVyX25hbWUpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBkZXNjcmlwdGlvbiBzdHJpbmdzLlxuIik7CisJCXJldHVybiAxOworCX0KKwkvLyBFbmFibGUgdGhlIHBjaSBkZXZpY2UuCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldmljZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCBlbmFibGUgUENJIGRldmljZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLy8gUmVxdWVzdCB0aGUgUENJIHJlZ2lzdGVyIHJlZ2lvbnMuCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2aWNlLCBtZV9kZXZpY2UtPmRldmljZV9uYW1lKTsKKworCWlmIChlcnIgPCAwKSB7CisJCVBFUlJPUigiQ2Fubm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBFUlJPUl8wOworCX0KKwkvLyBUaGUgYnVzIGNhcnJ5aW5nIHRoZSBkZXZpY2UgaXMgYSBQQ0kgYnVzLgorCW1lX2RldmljZS0+YnVzX3R5cGUgPSBNRV9CVVNfVFlQRV9QQ0k7CisKKwkvLyBTdG9yZSB0aGUgUENJIGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2FnZS4KKwltZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZpY2UgPSBwY2lfZGV2aWNlOworCisJLy8gR2V0IFBDSSByZWdpc3RlciBiYXNlcyBhbmQgc2l6ZXMuCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQltZV9kZXZpY2UtPmluZm8ucGNpLnJlZ19iYXNlc1tpXSA9CisJCSAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldmljZSwgaSk7CisJCW1lX2RldmljZS0+aW5mby5wY2kucmVnX3NpemVzW2ldID0KKwkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgaSk7CisJfQorCisJLy8gR2V0IHRoZSBQQ0kgbG9jYXRpb24uCisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfYnVzX25vID0gcGNpX2RldmljZS0+YnVzLT5udW1iZXI7CisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2X25vID0gUENJX1NMT1QocGNpX2RldmljZS0+ZGV2Zm4pOworCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2Z1bmNfbm8gPSBQQ0lfRlVOQyhwY2lfZGV2aWNlLT5kZXZmbik7CisKKwkvLyBHZXQgTWVpbGhhdXMgc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLgorCW1lX2RldmljZS0+aW5mby5wY2kudmVuZG9yX2lkID0gcGNpX2RldmljZS0+dmVuZG9yOworCW1lX2RldmljZS0+aW5mby5wY2kuZGV2aWNlX2lkID0gcGNpX2RldmljZS0+ZGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZpY2UsIDB4MDgsCisJCQkgICAgICZtZV9kZXZpY2UtPmluZm8ucGNpLmh3X3JldmlzaW9uKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldmljZSwgMHgyQywgJm1lX2RldmljZS0+aW5mby5wY2kuc2VyaWFsX25vKTsKKworCS8vIEdldCB0aGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyLgorCW1lX2RldmljZS0+aXJxID0gcGNpX2RldmljZS0+aXJxOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKwllcnIgPSBtZV9kbG9ja19pbml0KCZtZV9kZXZpY2UtPmRsb2NrKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgbG9jayBpbnN0YW5jZS5cbiIpOworCQlnb3RvIEVSUk9SXzE7CisJfQorCS8vIEluaXRpYWxpemUgc3ViZGV2aWNlIGxpc3QgaW5zdGFuY2UuCisJbWVfc2xpc3RfaW5pdCgmbWVfZGV2aWNlLT5zbGlzdCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGxpc3QgaW5zdGFuY2UuXG4iKTsKKwkJZ290byBFUlJPUl8yOworCX0KKwkvLyBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycy4KKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RhcnQgPSBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0OworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX2lycV93YWl0ID0gbWVfZGV2aWNlX2lvX2lycV93YWl0OworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX2lycV9zdG9wID0gbWVfZGV2aWNlX2lvX2lycV9zdG9wOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSA9IG1lX2RldmljZV9pb19yZXNldF9kZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0gbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnID0gbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWc7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWc7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQgPSBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3AgPSBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3A7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0gbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZSA9IG1lX2RldmljZV9sb2NrX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9sb2NrX3N1YmRldmljZSA9IG1lX2RldmljZV9sb2NrX3N1YmRldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlID0gbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlID0gbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciA9CisJICAgIG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPSBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbzsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdGltZXIgPSBtZV9kZXZpY2VfcXVlcnlfdGltZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcjsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZCA9IG1lX2RldmljZV9jb25maWdfbG9hZDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yID0gbWVfZGV2aWNlX2Rlc3RydWN0b3I7CisKKwlyZXR1cm4gMDsKKworICAgICAgRVJST1JfMDoKKwltZV9kbG9ja19kZWluaXQoJm1lX2RldmljZS0+ZGxvY2spOworCisgICAgICBFUlJPUl8xOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2RldmljZSk7CisKKyAgICAgIEVSUk9SXzI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXZpY2UpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbWVfZGV2aWNlX2RlaW5pdChtZV9kZXZpY2VfdCAqIG1lX2RldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwltZV9zbGlzdF9kZWluaXQoJm1lX2RldmljZS0+c2xpc3QpOworCW1lX2Rsb2NrX2RlaW5pdCgmbWVfZGV2aWNlLT5kbG9jayk7CisKKwlpZiAobWVfZGV2aWNlLT5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhtZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9kZXZpY2UpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UobWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlKTsKKwl9CisvKgorCWVsc2UKKwl7CisJCS8vIE11c3QgYmUgYW4gVVNCIGRldmljZS4KKwl9CisqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRhODI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmgKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkZXZpY2UuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxzdXBwb3J0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FREVWSUNFX0hfCisjZGVmaW5lIF9NRURFVklDRV9IXworCisjaWZuZGVmIEtCVUlMRF9NT0ROQU1FCisjICBkZWZpbmUgS0JVSUxEX01PRE5BTUUgS0JVSUxEX1NUUihtZW1haW4pCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorLy8jaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZWRsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gYSBQQ0kgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9wY2lfY29uc3RydWN0b3JfdCkgKHN0cnVjdCBwY2lfZGV2ICopOworCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgTUUtNDAwMCBQQ0kgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KKyNpZmRlZiBCT1NDSAordHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlICooKm1lX2Jvc2NoX2NvbnN0cnVjdG9yX3QpIChzdHJ1Y3QgcGNpX2RldiAqLAorCQkJCQkJICAgICBpbnQgbWVfYm9zY2hfZncpOworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gYSBVU0IgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KKy8vdHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlICooKm1lX3VzYl9jb25zdHJ1Y3Rvcl90KShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKKworLyoqCisgKiBAYnJpZWYgRGVmaW5lcyBhIHBvaW50ZXIgdHlwZSB0byB0aGUgZHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9kdW1teV9jb25zdHJ1Y3Rvcl90KSAodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJCQkgICAgIGludCBidXNfdHlwZSwKKwkJCQkJCSAgICAgaW50IGJ1c19ubywKKwkJCQkJCSAgICAgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pOworCisvL2V4dGVybiBtZV91c2JfY29uc3RydWN0b3JfdCBtZXBoaXN0b19zMV9jb25zdHJ1Y3RvciBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisvKioKKyAqIEBicmllZiBIb2xkcyB0aGUgUENJIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfcGNpX2luZm8geworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOwkJCS8qKjwgS2VybmVsIFBDSSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCXVpbnQzMl90IHJlZ19iYXNlc1s2XTsJCQkJLyoqPCBUaGUgYmFzZSBhZHJlc3NlcyBvZiB0aGUgUENJIGJhcnMuICovCisJdWludDMyX3QgcmVnX3NpemVzWzZdOwkJCQkvKio8IFRoZSBzaXplcyBvZiB0aGUgUENJIGJhcnMuICovCisKKwl1aW50MzJfdCBwY2lfYnVzX25vOwkJCQkvKio8IFBDSSBidXMgbnVtYmVyLiAqLworCXVpbnQzMl90IHBjaV9kZXZfbm87CQkJCS8qKjwgUENJIGRldmljZSBudW1iZXIuICovCisJdWludDMyX3QgcGNpX2Z1bmNfbm87CQkJCS8qKjwgUENJIGZ1bmN0aW9uIG51bWJlci4gKi8KKworCXVpbnQxNl90IHZlbmRvcl9pZDsJCQkJCS8qKjwgTWVpbGhhdXMgUENJIHZlbmRvciBpZC4gKi8KKwl1aW50MTZfdCBkZXZpY2VfaWQ7CQkJCQkvKio8IE1laWxoYXVzIGRldmljZSBpZC4gKi8KKwl1aW50OF90IGh3X3JldmlzaW9uOwkJCQkvKio8IEhhcmR3YXJlIHJldmlzaW9uIG9mIHRoZSBkZXZpY2UuICovCisJdWludDMyX3Qgc2VyaWFsX25vOwkJCQkJLyoqPCBTZXJpYWwgbnVtYmVyIG9mIHRoZSBkZXZpY2UuICovCit9IG1lX3BjaV9pbmZvX3Q7CisKKy8qKgorICogQGJyaWVmIEhvbGRzIHRoZSBVU0IgZGV2aWNlIGluZm9ybWF0aW9uLgorICovCisvL3R5cGVkZWYgc3RydWN0IG1lX3VzYl9pbmZvIHsKKy8vfSBtZV91c2JfaW5mb190OworCisvKioKKyAqIEBicmllZiBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgeworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkJCS8qKjwgRW5hYmxlcyB0aGUgZGV2aWNlIHRvIGJlIGFkZGVkIHRvIGEgZHluYW1pYyBsaXN0LiAqLworLy8gICAgICBpbnQgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUuICovCisKKwlpbnQgYnVzX3R5cGU7CQkJCQkJLyoqPCBUaGUgZGVzY3JpbWluYXRvciBmb3IgdGhlIHVuaW9uLiAqLworCXVuaW9uIHsKKwkJbWVfcGNpX2luZm9fdCBwY2k7CQkJCS8qKjwgUENJIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4gKi8KKy8vICAgICAgICAgICAgICBtZV91c2JfaW5mb190IHVzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVTQiBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uICovCisJfSBpbmZvOwkJCQkJCQkJLyoqPCBIb2xkcyB0aGUgZGV2aWNlIGluZm9ybWF0aW9uLiAqLworCisJaW50IGlycTsJCQkJCQkJLyoqPCBUaGUgaXJxIGFzc2lnbmVkIHRvIHRoaXMgZGV2aWNlLiAqLworCisJbWVfZGxvY2tfdCBkbG9jazsJCQkJCS8qKjwgVGhlIGRldmljZSBsb2NraW5nIHN0cnVjdHVyZS4gKi8KKwltZV9zbGlzdF90IHNsaXN0OwkJCQkJLyoqPCBUaGUgY29udGFpbmVyIGhvbGRpbmcgYWxsIHN1YmRldmljZXMgYmVsb25naW5nIHRvIHRoaXMgZGV2aWNlLiAqLworCisJY2hhciAqZGV2aWNlX25hbWU7CQkJCQkvKio8IFRoZSBuYW1lIG9mIHRoZSBNZWlsaGF1cyBkZXZpY2UuICovCisJY2hhciAqZGV2aWNlX2Rlc2NyaXB0aW9uOwkJCS8qKjwgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBNZWlsaGF1cyBkZXZpY2UuICovCisJY2hhciAqZHJpdmVyX25hbWU7CQkJCQkvKio8IFRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgZHJpdmVyIG1vZHVsZSBzdXBwb3J0aW5nIHRoZSBkZXZpY2UgZmFtaWx5LiAqLworCisJLyogTWV0aG9kcyAqLworCWludCAoKm1lX2RldmljZV9pb19pcnFfc3RhcnQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IGlycV9zb3VyY2UsCisJCQkJICAgICAgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3dhaXQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3N0b3ApIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwgaW50IGNoYW5uZWwsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSAgIGludCByZWYsCisJCQkJCSAgIGludCB0cmlnX2NoYW4sCisJCQkJCSAgIGludCB0cmlnX3R5cGUsCisJCQkJCSAgIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJIGludCBzdWJkZXZpY2UsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkJICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJCSAgIGludCBjb3VudCwKKwkJCQkJICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJCSAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgdGltZV9vdXQsCisJCQkJCSAgICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IHJlYWRfbW9kZSwKKwkJCQkJIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCBzdGFydF9tb2RlLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgaW50IHdhaXQsCisJCQkJCSAgIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fd3JpdGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkJICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9sb2NrX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCBsb2NrLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICBjaGFyICoqZGVzY3JpcHRpb24pOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgIGludCAqdmVuZG9yX2lkLAorCQkJCQkgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJCSAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkJICAgIGludCAqYnVzX3R5cGUsCisJCQkJCSAgICBpbnQgKmJ1c19ubywKKwkJCQkJICAgIGludCAqZGV2X25vLAorCQkJCQkgICAgaW50ICpmdW5jX25vLCBpbnQgKnBsdWdnZWQpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgIGNoYXIgKipuYW1lKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgY2hhciAqKm5hbWUpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcik7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgIGludCB1bml0LCBpbnQgKmNvdW50KTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkJIGludCB1bml0LAorCQkJCQkJIGludCAqbWluLAorCQkJCQkJIGludCAqbWF4LAorCQkJCQkJIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIGludCByYW5nZSwKKwkJCQkJICAgaW50ICp1bml0LAorCQkJCQkgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCQkJICBpbnQgdHlwZSwKKwkJCQkJCSAgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgICAgIGludCBzdWJkZXZpY2UsIGludCAqY2Fwcyk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkJCSAgICBpbnQgY2FwLAorCQkJCQkJICAgIGludCAqYXJncywgaW50IGNvdW50KTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV90aW1lcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgdGltZXIsCisJCQkJICAgICAgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgICAgICB1aW50NjRfdCAqIG1pbl90aWNrcywKKwkJCQkgICAgICB1aW50NjRfdCAqIG1heF90aWNrcyk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgICAgIGludCAqdmVyc2lvbik7CisKKwlpbnQgKCptZV9kZXZpY2VfY29uZmlnX2xvYWQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJICAgICAgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKTsKKworCXZvaWQgKCptZV9kZXZpY2VfZGVzdHJ1Y3RvcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UpOworfSBtZV9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBQQ0kgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBQQ0kgZGV2aWNlIGNvbnRleHQgYXMgaGFuZGVkIG92ZXIgYnkga2VybmVsLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGV2aWNlX3BjaV9pbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgVVNCIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdXNiX2ludGVyZmFjZSBUaGUgVVNCIGRldmljZSBpbnRlcmZhY2UgYXMgaGFuZGVkIG92ZXIgYnkga2VybmVsLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCisvL2ludCBtZV9kZXZpY2VfdXNiX2luaXQobWVfZGV2aWNlX3QgKm1lX2RldmljZSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CisKKy8qKgorICAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgZGV2aWNlIGJhc2UgY2xhc3Mgc3RydWN0dXJlIGFuZCBmcmVlcyBhbnkgcHJldmlvdXNseQorICAqIHJlcXVlc3RlZCByZXNvdXJjZXMgcmVsYXRlZCB3aXRoIHRoaXMgc3RydWN0dXJlLiBJdCBhbHNvIGZyZWVzIGFueSBzdWJkZXZpY2UKKyAgKiBpbnN0YW5jZSBob2xkIGJ5IHRoZSBzdWJkZXZpY2UgbGlzdC4KKyAgKgorICAqIEBwYXJhbSBtZV9kZXZpY2UgVGhlIGRldmljZSBjbGFzcyB0byBkZWluaXRpYWxpemUuCisgICovCit2b2lkIG1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZTM2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qKgorICogQGZpbGUgbWVfZGxpc3QuYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaW5jbHVkZSAibWVkbGlzdC5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworaW50IG1lX2RsaXN0X3F1ZXJ5X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIGludCAqbnVtYmVyKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJKm51bWJlciA9IGRsaXN0LT5uOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit1bnNpZ25lZCBpbnQgbWVfZGxpc3RfZ2V0X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKwlyZXR1cm4gZGxpc3QtPm47Cit9CisKK21lX2RldmljZV90ICptZV9kbGlzdF9nZXRfZGV2aWNlKHN0cnVjdCBtZV9kbGlzdCAqIGRsaXN0LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChpbmRleCA+PSBkbGlzdC0+bikgeworCQlQRVJST1IoIkluZGV4IG91dCBvZiByYW5nZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmRsaXN0LT5oZWFkKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQkrK2k7CisJfQorCisJcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBtZV9kbGlzdF9hZGRfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCwgbWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bGlzdCwgJmRsaXN0LT5oZWFkKTsKKwkrK2RsaXN0LT5uOworfQorCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZGVsX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0OworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJaWYgKGxpc3RfZW1wdHkoJmRsaXN0LT5oZWFkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsYXN0ID0gZGxpc3QtPmhlYWQucHJldjsKKworCWRldmljZSA9IGxpc3RfZW50cnkobGFzdCwgbWVfZGV2aWNlX3QsIGxpc3QpOworCisJbGlzdF9kZWwobGFzdCk7CisKKwktLWRsaXN0LT5uOworCisJcmV0dXJuIGRldmljZTsKK30KKworaW50IG1lX2RsaXN0X2luaXQobWVfZGxpc3RfdCAqIGRsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlJTklUX0xJU1RfSEVBRCgmZGxpc3QtPmhlYWQpOworCWRsaXN0LT5uID0gMDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZV9kbGlzdF9kZWluaXQobWVfZGxpc3RfdCAqIGRsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGxpc3QtPmhlYWQpKSB7CisJCXMgPSBkbGlzdC0+aGVhZC5uZXh0OworCQlsaXN0X2RlbChzKTsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShzLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCWRldmljZS0+bWVfZGV2aWNlX2Rlc3RydWN0b3IoZGV2aWNlKTsKKwl9CisKKwlkbGlzdC0+biA9IDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTFjMTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaApAQCAtMCwwICsxLDkxIEBACisvKioKKyAqIEBmaWxlIG1lX2RsaXN0LmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIGRldmljZSBsaXN0IGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FX0RMSVNUX0hfCisjZGVmaW5lIF9NRV9ETElTVF9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIGRldmljZSBsaXN0IGNvbnRhaW5lci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGxpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgVGhlIGhlYWQgb2YgdGhlIGludGVybmFsIGxpc3QuICovCisJdW5zaWduZWQgaW50IG47CQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRldmljZXMgaW4gdGhlIGxpc3QuICovCit9IG1lX2RsaXN0X3Q7CisKKy8qKgorICogQGJyaWVmIFF1ZXJpZXMgdGhlIG51bWJlciBvZiBkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIG51bWJlciBUaGUgbnVtYmVyIG9mIGRldmljZXMuCisgKgorICogQHJldHVybiBNRS1pRFMgZXJyb3IgY29kZS4KKyAqLworaW50IG1lX2RsaXN0X3F1ZXJ5X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIGludCAqbnVtYmVyKTsKKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRldmljZXMgY3VycmVudGx5IGluc2lkZSB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBsaXN0LgorICovCit1bnNpZ25lZCBpbnQgbWVfZGxpc3RfZ2V0X251bWJlcl9kZXZpY2VzKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpOworCisvKioKKyAqIEBicmllZiBHZXQgYSBkZXZpY2UgYnkgaW5kZXguCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRldmljZSB0byBnZXQgaW4gdGhlIGxpc3QuCisgKgorICogQHJldHVybiBUaGUgZGV2aWNlIGF0IGluZGV4IGlmIGF2YWlsYWJsZS5cbgorICogICAgICAgICBOVUxMIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KK21lX2RldmljZV90ICptZV9kbGlzdF9nZXRfZGV2aWNlKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIHVuc2lnbmVkIGludCBpbmRleCk7CisKKy8qKgorICogQGJyaWVmIEFkZHMgYSBkZXZpY2UgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBhZGQgYSBkZXZpY2UgdG8uCisgKiBAcGFyYW0gZGV2aWNlIFRoZSBkZXZpY2UgdG8gYWRkIHRvIHRoZSBsaXN0LgorICovCit2b2lkIG1lX2RsaXN0X2FkZF9kZXZpY2VfdGFpbChzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBtZV9kZXZpY2VfdCAqIGRldmljZSk7CisKKy8qKgorICogQGJyaWVmIFJlbW92ZXMgYSBkZXZpY2UgZnJvbSB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0LgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgcmVtb3ZlZCBzdWJkZWl2Y2UuXG4KKyAqICAgICAgICAgTlVMTCBpbiBjYXNlcyB3aGVyZSB0aGUgbGlzdCB3YXMgZW1wdHkuCisgKi8KK21lX2RldmljZV90ICptZV9kbGlzdF9kZWxfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgZGV2aWNlIGxpc3Qgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBsb2NrIFRoZSBkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxpc3RfaW5pdChtZV9kbGlzdF90ICogZGxpc3QpOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIGFuZCBkZXN0cnVjdHMgZXZlcnkgZGV2aWNlIGluIGl0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGRlaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCit2b2lkIG1lX2RsaXN0X2RlaW5pdChtZV9kbGlzdF90ICogZGxpc3QpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0OWUzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qKgorICogQGZpbGUgbWVkbG9jay5jCisgKgorICogQGJyaWVmIEltcGxlbWVudHMgdGhlIGRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lZGxvY2suaCIKKworaW50IG1lX2Rsb2NrX2VudGVyKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJaWYgKChkbG9jay0+ZmlsZXApICE9IE5VTEwgJiYgKGRsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJUEVSUk9SKCJEZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJfQorCisJZGxvY2stPmNvdW50Kys7CisKKwlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworaW50IG1lX2Rsb2NrX2V4aXQoc3RydWN0IG1lX2Rsb2NrICpkbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisJZGxvY2stPmNvdW50LS07CisJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9kbG9ja19sb2NrKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssCisJCSAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzLCBtZV9zbGlzdF90ICogc2xpc3QpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJaW50IGk7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlpZiAoKGRsb2NrLT5maWxlcCA9PSBmaWxlcCkgfHwgKGRsb2NrLT5maWxlcCA9PSBOVUxMKSkgeworCQkJZGxvY2stPmZpbGVwID0gTlVMTDsKKworCQkJLyogVW5sb2NrIGFsbCBwb3NzaWJseSBsb2NrZWQgc3ViZGV2aWNlcy4gKi8KKworCQkJZm9yIChpID0gMDsgaSA8IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzbGlzdCk7CisJCQkgICAgIGkrKykgeworCQkJCXN1YmRldmljZSA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc2xpc3QsIGkpOworCisJCQkJaWYgKHN1YmRldmljZSkKKwkJCQkJZXJyID0KKwkJCQkJICAgIHN1YmRldmljZS0+CisJCQkJCSAgICBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UKKwkJCQkJICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX1JFTEVBU0UsCisJCQkJCSAgICAgZmxhZ3MpOworCQkJCWVsc2UKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCWlmIChkbG9jay0+Y291bnQpIHsKKwkJCVBFUlJPUigiRGV2aWNlIGlzIHVzZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKChkbG9jay0+ZmlsZXAgIT0gTlVMTCkgJiYgKGRsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJCVBFUlJPUigiRGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfSBlbHNlIGlmIChkbG9jay0+ZmlsZXAgPT0gTlVMTCkgeworCQkJLyogQ2hlY2sgYW55IHN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLiAqLworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHNsaXN0KTsKKwkJCSAgICAgaSsrKSB7CisJCQkJc3ViZGV2aWNlID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzbGlzdCwgaSk7CisKKwkJCQlpZiAoc3ViZGV2aWNlKSB7CisJCQkJCWlmICgoZXJyID0KKwkJCQkJICAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgIG1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZQorCQkJCQkgICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX0NIRUNLLAorCQkJCQkgICAgICBmbGFncykpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkEgc3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJfQorCQkJfQorCisJCQkvKiBJZiBubyBzdWJkZXZpY2VzIGFyZSBsb2NrZWQgYnkgb3RoZXIgcHJvY2Vzc2VzLAorCQkJICAgd2UgY2FuIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkZXZpY2UuIE90aGVyd2lzZSB3ZSBqdW1wIGFoZWFkLiAqLworCQkJaWYgKCFlcnIpCisJCQkJZGxvY2stPmZpbGVwID0gZmlsZXA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19DSEVDSzoKKwkJaWYgKGRsb2NrLT5jb3VudCkgeworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoZGxvY2stPmZpbGVwICE9IE5VTEwpICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQllcnIgPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSBpZiAoZGxvY2stPmZpbGVwID09IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc2xpc3QpOworCQkJICAgICBpKyspIHsKKwkJCQlzdWJkZXZpY2UgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHNsaXN0LCBpKTsKKworCQkJCWlmIChzdWJkZXZpY2UpIHsKKwkJCQkJaWYgKChlcnIgPQorCQkJCQkgICAgIHN1YmRldmljZS0+CisJCQkJCSAgICAgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlCisJCQkJCSAgICAgKHN1YmRldmljZSwgZmlsZXAsIE1FX0xPQ0tfQ0hFQ0ssCisJCQkJCSAgICAgIGZsYWdzKSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQSBzdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBsb2NrLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9MT0NLOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbWVfZGxvY2tfZGVpbml0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworfQorCitpbnQgbWVfZGxvY2tfaW5pdChtZV9kbG9ja190ICogZGxvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJZGxvY2stPmZpbGVwID0gTlVMTDsKKwlkbG9jay0+Y291bnQgPSAwOworCXNwaW5fbG9ja19pbml0KCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZGRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmgKQEAgLTAsMCArMSw3NiBAQAorLyoqCisgKiBAZmlsZSBtZWRsb2NrLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIGRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FRExPQ0tfSF8KKyNkZWZpbmUgX01FRExPQ0tfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGxvY2sgeworCXN0cnVjdCBmaWxlICpmaWxlcDsJCS8qKjwgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBkZXZpY2UuICovCisJaW50IGNvdW50OwkJCQkvKio8IE51bWJlciBvZiB0YXNrcyB3aGljaCBhcmUgaW5zaWRlIHRoZSBkZXZpY2UuICovCisJc3BpbmxvY2tfdCBzcGluX2xvY2s7CS8qKjwgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KK30gbWVfZGxvY2tfdDsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gZW50ZXIgYSBkZXZpY2UuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2Rsb2NrX2VudGVyKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIEV4aXRzIGEgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19leGl0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIHBlcmZvcm0gYSBsb2NraW5nIGFjdGlvbiBvbiBhIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICogQHBhcmFtIFRoZSBhY3Rpb24gdG8gYmUgZG9uZS4KKyAqIEBwYXJhbSBmbGFncyBGbGFncyBmcm9tIHVzZXIgc3BhY2UuCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IG9mIHRoZSBkZXZpY2UuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19sb2NrKHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssCisJCSAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzLCBtZV9zbGlzdF90ICogc2xpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfaW5pdChtZV9kbG9ja190ICogZGxvY2spOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgbG9jayBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBsb2NrIHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9kbG9ja19kZWluaXQobWVfZGxvY2tfdCAqIGRsb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlMjQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZHJpdmVyLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqICBBdXRob3I6CUtyenlzenRvZiBHYW50emtlCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVEUklWRVJfSF8KKyNkZWZpbmUgX01FRFJJVkVSX0hfCisKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVPcGVuKGludCBpRmxhZ3MpOworCWludCBtZUNsb3NlKGludCBpRmxhZ3MpOworCisJaW50IG1lTG9ja0RyaXZlcihpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCWludCBtZUxvY2tEZXZpY2UoaW50IGlEZXZpY2UsIGludCBpTG9jaywgaW50IGlGbGFncyk7CisJaW50IG1lTG9ja1N1YmRldmljZShpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCBpTG9jaywgaW50IGlGbGFncyk7CisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUVycm9yR2V0TGFzdE1lc3NhZ2UoY2hhciAqcGNFcnJvck1zZywgaW50IGlDb3VudCk7CisJaW50IG1lRXJyb3JHZXRNZXNzYWdlKGludCBpRXJyb3JDb2RlLCBjaGFyICpwY0Vycm9yTXNnLCBpbnQgaUNvdW50KTsKKwlpbnQgbWVFcnJvclNldERlZmF1bHRQcm9jKGludCBpU3dpdGNoKTsKKwlpbnQgbWVFcnJvclNldFVzZXJQcm9jKG1lRXJyb3JDQl90IHBFcnJvclByb2MpOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIHBlcmZvcm0gSS9PIG9uIGEgZGV2aWNlCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUlPSXJxU2V0Q2FsbGJhY2soCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT0lycUNCX3QgcENhbGxiYWNrLAorCQkJdm9pZCAqcENhbGxiYWNrQ29udGV4dCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPSXJxU3RhcnQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlJcnFTb3VyY2UsCisJCQlpbnQgaUlycUVkZ2UsCisJCQlpbnQgaUlycUFyZywKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPSXJxU3RvcCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNoYW5uZWwsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVdhaXQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50ICpwaUlycUNvdW50LAorCQkJaW50ICpwaVZhbHVlLAorCQkJaW50IGlUaW1lT3V0LAorCQkJaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1Jlc2V0RGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1Jlc2V0U3ViZGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaVN1YmRldmljZSwgaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1N0cmVhbUZyZXF1ZW5jeVRvVGlja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lciwKKwkJCWRvdWJsZSAqcGRGcmVxdWVuY3ksCisJCQlpbnQgKnBpVGlja3NMb3csCisJCQlpbnQgKnBpVGlja3NIaWdoLAorCQkJaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1NpbmdsZUNvbmZpZygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNoYW5uZWwsCisJCQlpbnQgaVNpbmdsZUNvbmZpZywKKwkJCWludCBpUmVmLAorCQkJaW50IGlUcmlnQ2hhbiwKKwkJCWludCBpVHJpZ1R5cGUsCisJCQlpbnQgaVRyaWdFZGdlLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TaW5nbGUobWVJT1NpbmdsZV90ICpwU2luZ2xlTGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisKKwlpbnQgbWVJT1N0cmVhbUNvbmZpZygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQltZUlPU3RyZWFtQ29uZmlnX3QgKnBDb25maWdMaXN0LAorCQkJaW50IGlDb3VudCwKKwkJCW1lSU9TdHJlYW1UcmlnZ2VyX3QgKnBUcmlnZ2VyLAorCQkJaW50IGlGaWZvSXJxVGhyZXNob2xkLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1OZXdWYWx1ZXMoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lT3V0LAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1SZWFkKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmVhZE1vZGUsCisJCQlpbnQgKnBpVmFsdWVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1Xcml0ZSgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVdyaXRlTW9kZSwKKwkJCWludCAqcGlWYWx1ZXMsCisJCQlpbnQgKnBpQ291bnQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0YXJ0KG1lSU9TdHJlYW1TdGFydF90ICpwU3RhcnRMaXN0LCBpbnQgaUNvdW50LCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0b3AobWVJT1N0cmVhbVN0b3BfdCAqcFN0b3BMaXN0LCBpbnQgaUNvdW50LCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVN0YXR1cygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVdhaXQsCisJCQlpbnQgKnBpU3RhdHVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TZXRDYWxsYmFja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT1N0cmVhbUNCX3QgcFN0YXJ0Q0IsCisJCQl2b2lkICpwU3RhcnRDQkNvbnRleHQsCisJCQltZUlPU3RyZWFtQ0JfdCBwTmV3VmFsdWVzQ0IsCisJCQl2b2lkICpwTmV3VmFsdWVzQ0JDb250ZXh0LAorCQkJbWVJT1N0cmVhbUNCX3QgcEVuZENCLAorCQkJdm9pZCAqcEVuZENCQ29udGV4dCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtVGltZVRvVGlja3MoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlUaW1lciwKKwkJCWRvdWJsZSAqcGRUaW1lLAorCQkJaW50ICpwaVRpY2tzTG93LAorCQkJaW50ICpwaVRpY2tzSGlnaCwKKwkJCWludCBpRmxhZ3MpOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgRnVuY3Rpb25zIHRvIHF1ZXJ5IHRoZSBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVF1ZXJ5RGVzY3JpcHRpb25EZXZpY2UoaW50IGlEZXZpY2UsIGNoYXIgKnBjRGVzY3JpcHRpb24sIGludCBpQ291bnQpOworCisJaW50IG1lUXVlcnlJbmZvRGV2aWNlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgKnBpVmVuZG9ySWQsCisJCQlpbnQgKnBpRGV2aWNlSWQsCisJCQlpbnQgKnBpU2VyaWFsTm8sCisJCQlpbnQgKnBpQnVzVHlwZSwKKwkJCWludCAqcGlCdXNObywKKwkJCWludCAqcGlEZXZObywKKwkJCWludCAqcGlGdW5jTm8sCisJCQlpbnQgKnBpUGx1Z2dlZCk7CisKKwlpbnQgbWVRdWVyeU5hbWVEZXZpY2UoaW50IGlEZXZpY2UsIGNoYXIgKnBjTmFtZSwgaW50IGlDb3VudCk7CisJaW50IG1lUXVlcnlOYW1lRGV2aWNlRHJpdmVyKGludCBpRGV2aWNlLCBjaGFyICpwY05hbWUsIGludCBpQ291bnQpOworCisJaW50IG1lUXVlcnlOdW1iZXJEZXZpY2VzKGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyU3ViZGV2aWNlcyhpbnQgaURldmljZSwgaW50ICpwaU51bWJlcik7CisJaW50IG1lUXVlcnlOdW1iZXJDaGFubmVscyhpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyUmFuZ2VzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWludCAqcGlOdW1iZXIpOworCisJaW50IG1lUXVlcnlSYW5nZUJ5TWluTWF4KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEsCisJCQlpbnQgKnBpUmFuZ2UpOworCWludCBtZVF1ZXJ5UmFuZ2VJbmZvKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmFuZ2UsCisJCQlpbnQgKnBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEpOworCisJaW50IG1lUXVlcnlTdWJkZXZpY2VCeVR5cGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3RhcnRTdWJkZXZpY2UsCisJCQlpbnQgaVR5cGUsCisJCQlpbnQgaVN1YnR5cGUsCisJCQlpbnQgKnBpU3ViZGV2aWNlKTsKKwlpbnQgbWVRdWVyeVN1YmRldmljZVR5cGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50ICpwaVR5cGUsCisJCQlpbnQgKnBpU3VidHlwZSk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VDYXBzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlDYXBzKTsKKwlpbnQgbWVRdWVyeVN1YmRldmljZUNhcHNBcmdzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2FwLAorCQkJaW50ICpwaUFyZ3MsCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5VmVyc2lvbkxpYnJhcnkoaW50ICpwaVZlcnNpb24pOworCWludCBtZVF1ZXJ5VmVyc2lvbk1haW5Ecml2ZXIoaW50ICpwaVZlcnNpb24pOworCWludCBtZVF1ZXJ5VmVyc2lvbkRldmljZURyaXZlcihpbnQgaURldmljZSwgaW50ICpwaVZlcnNpb24pOworCisKKwkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVV0aWxpdHlFeHRyYWN0VmFsdWVzKAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50ICpwaUFJQnVmZmVyLAorCQkJaW50IGlBSUJ1ZmZlckNvdW50LAorCQkJbWVJT1N0cmVhbUNvbmZpZ190ICpwQ29uZmlnTGlzdCwKKwkJCWludCBpQ29uZmlnTGlzdENvdW50LAorCQkJaW50ICpwaUNoYW5CdWZmZXIsCisJCQlpbnQgKnBpQ2hhbkJ1ZmZlckNvdW50KTsKKwlpbnQgbWVVdGlsaXR5RGlnaXRhbFRvUGh5c2ljYWwoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJaW50IGlEYXRhLAorCQkJaW50IGlNb2R1bGVUeXBlLAorCQkJZG91YmxlIGRSZWZWYWx1ZSwKKwkJCWRvdWJsZSAqcGRQaHlzaWNhbCk7CisJaW50IG1lVXRpbGl0eURpZ2l0YWxUb1BoeXNpY2FsVigKKwkJCWRvdWJsZSBkTWluLAorCQkJZG91YmxlIGRNYXgsCisJCQlpbnQgaU1heERhdGEsCisJCQlpbnQgKnBpRGF0YUJ1ZmZlciwKKwkJCWludCBpQ291bnQsCisJCQlpbnQgaU1vZHVsZVR5cGUsCisJCQlkb3VibGUgZFJlZlZhbHVlLAorCQkJZG91YmxlICpwZFBoeXNpY2FsQnVmZmVyKTsKKwlpbnQgbWVVdGlsaXR5UGh5c2ljYWxUb0RpZ2l0YWwoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJZG91YmxlIGRQaHlzaWNhbCwKKwkJCWludCAqcGlEYXRhKTsKKwlpbnQgbWVVdGlsaXR5UFdNU3RhcnQoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlMSwKKwkJCWludCBpU3ViZGV2aWNlMiwKKwkJCWludCBpU3ViZGV2aWNlMywKKwkJCWludCBpUmVmLAorCQkJaW50IGlQcmVzY2FsZXIsCisJCQlpbnQgaUR1dHlDeWNsZSwKKwkJCWludCBpRmxhZyk7CisJaW50IG1lVXRpbGl0eVBXTVN0b3AoaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEpOworCWludCBtZVV0aWxpdHlQV01SZXN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpUHJlc2NhbGVyKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUgaW50byBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZUNvbmZpZ0xvYWQoY2hhciAqcGNDb25maWdGaWxlKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBxdWVyeSBhIHJlbW90ZSBkcml2ZXIgc3lzdGVtCisJICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCWludCBtZVJRdWVyeURlc2NyaXB0aW9uRGV2aWNlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWNoYXIgKnBjRGVzY3JpcHRpb24sCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVJRdWVyeUluZm9EZXZpY2UoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50ICpwaVZlbmRvcklkLAorCQkJaW50ICpwaURldmljZUlkLAorCQkJaW50ICpwaVNlcmlhbE5vLAorCQkJaW50ICpwaUJ1c1R5cGUsCisJCQlpbnQgKnBpQnVzTm8sCisJCQlpbnQgKnBpRGV2Tm8sCisJCQlpbnQgKnBpRnVuY05vLAorCQkJaW50ICpwaVBsdWdnZWQpOworCisJaW50IG1lUlF1ZXJ5TmFtZURldmljZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQljaGFyICpwY05hbWUsCisJCQlpbnQgaUNvdW50KTsKKworCWludCBtZVJRdWVyeU51bWJlckRldmljZXMoY2hhciAqbG9jYXRpb24sIGludCAqcGlOdW1iZXIpOworCWludCBtZVJRdWVyeU51bWJlclN1YmRldmljZXMoY2hhciAqbG9jYXRpb24sIGludCBpRGV2aWNlLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJDaGFubmVscygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlOdW1iZXIpOworCWludCBtZVJRdWVyeU51bWJlclJhbmdlcygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVW5pdCwKKwkJCWludCAqcGlOdW1iZXIpOworCisJaW50IG1lUlF1ZXJ5UmFuZ2VJbmZvKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlSYW5nZSwKKwkJCWludCAqcGlVbml0LAorCQkJZG91YmxlICpwZE1pbiwKKwkJCWRvdWJsZSAqcGRNYXgsCisJCQlpbnQgKnBpTWF4RGF0YSk7CisKKwlpbnQgbWVSUXVlcnlTdWJkZXZpY2VUeXBlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50ICpwaVR5cGUsCisJCQlpbnQgKnBpU3VidHlwZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5ZjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMKQEAgLTAsMCArMSwxMjY2IEBACisvKiBEZXZpY2UgZHJpdmVyIGZvciBNZWlsaGF1cyBNRS1EVU1NWSBkZXZpY2VzLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogICAgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFVzZXIgYXBwbGljYXRpb24gY291bGQgYWxzbyBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiBCdXQgdGhlCisgKiByZWFsIGtlcm5lbCBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBieSAjaWZkZWYgX19LRVJORUxfXy4KKyAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgbW9kdWxlLmggaXMgaW5jbHVkZWQuIE5vdCBuZWVkZWQsIHdoZW4KKyAqIGl0IGlzIGEgYnVpbHQgaW4gZHJpdmVyLgorICovCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVkdW1teS5oIgorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9faXJxX3N0YXJ0KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQlpbnQgc3ViZGV2aWNlLAorCQkJCWludCBjaGFubmVsLAorCQkJCWludCBpcnFfc291cmNlLAorCQkJCWludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19pcnFfd2FpdChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCSAgICAgICBpbnQgKmlycV9jb3VudCwKKwkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZW91dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX2lycV9zdG9wKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3Jlc2V0X2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19yZXNldF9zdWJkZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zaW5nbGVfY29uZmlnKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgaW50IHJlZiwKKwkJCQkgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3NpbmdsZV9yZWFkKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc2luZ2xlX3dyaXRlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCBjaGFubmVsLAorCQkJCSAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX2NvbmZpZyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgaW50IGNvdW50LAorCQkJCSAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCBzdWJkZXZpY2UsCisJCQkJCWludCB0aW1lb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3JlYWQobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgaW50IHJlYWRfbW9kZSwKKwkJCQkgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXJ0KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fc3RhdHVzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgIGludCB3YWl0LAorCQkJCSAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fc3RvcChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fd3JpdGUobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9sb2NrX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfbG9ja19zdWJkZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgIGNoYXIgKipkZXNjcmlwdGlvbikKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpZiAoaW5zdGFuY2UtPm1hZ2ljICE9IE1FRFVNTVlfTUFHSUNfTlVNQkVSKQorLy8gICAgICB7CisvLyAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vICAgICAgICAgICAgICByZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisvLyAgICAgIH0KKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQjoKKwkJKmRlc2NyaXB0aW9uID0gTUUxMDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTEwMDA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBDOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBEOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA0VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwOFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzEyVToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxMlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SToKKwkJKmRlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4STsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjEwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MFM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OToKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0I6CisJCSpkZXNjcmlwdGlvbiA9IE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTQwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MDoKKwkJKmRlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MDsKKworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpkZXNjcmlwdGlvbiA9IE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRTsKKworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpkZXNjcmlwdGlvbiA9IEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBpZCBpbiBkZXZpY2UgaW5mby5cbiIpOworCisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X2luZm9fZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgaW50ICp2ZW5kb3JfaWQsCisJCQkJICAgICBpbnQgKmRldmljZV9pZCwKKwkJCQkgICAgIGludCAqc2VyaWFsX25vLAorCQkJCSAgICAgaW50ICpidXNfdHlwZSwKKwkJCQkgICAgIGludCAqYnVzX25vLAorCQkJCSAgICAgaW50ICpkZXZfbm8sIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKQoreworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lZHVtbXlfZGV2aWNlX3QgKikgZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisvLyAgICAgIGlmIChpbnN0YW5jZS0+bWFnaWMgIT0gTUVEVU1NWV9NQUdJQ19OVU1CRVIpCisvLyAgICAgIHsKKy8vICAgICAgICAgICAgICBQRVJST1IoIldyb25nIG1hZ2ljIG51bWJlci5cbiIpOworLy8gICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKy8vICAgICAgfQorCisJKnZlbmRvcl9pZCA9IGluc3RhbmNlLT52ZW5kb3JfaWQ7CisJKmRldmljZV9pZCA9IGluc3RhbmNlLT5kZXZpY2VfaWQ7CisJKnNlcmlhbF9ubyA9IGluc3RhbmNlLT5zZXJpYWxfbm87CisJKmJ1c190eXBlID0gaW5zdGFuY2UtPmJ1c190eXBlOworCSpidXNfbm8gPSBpbnN0YW5jZS0+YnVzX25vOworCSpkZXZfbm8gPSBpbnN0YW5jZS0+ZGV2X25vOworCSpmdW5jX25vID0gaW5zdGFuY2UtPmZ1bmNfbm87CisJKnBsdWdnZWQgPSBNRV9QTFVHR0VEX09VVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKG1lX2RldmljZV90ICogZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBNRURVTU1ZX05BTUVfRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsIGNoYXIgKipuYW1lKQoreworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lZHVtbXlfZGV2aWNlX3QgKikgZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisvLyAvLyAvLyAgICAgICAgaWYgKGluc3RhbmNlLT5tYWdpYyAhPSBNRURVTU1ZX01BR0lDX05VTUJFUikKKy8vIC8vIC8vICAgICAgICB7CisvLyAvLyAvLyAgICAgICAgICAgICAgICBQRVJST1IoIldyb25nIG1hZ2ljIG51bWJlci5cbiIpOworLy8gLy8gLy8gICAgICAgICAgICAgICAgcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworLy8gLy8gLy8gICAgICAgIH0KKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQToKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQjoKKwkJKm5hbWUgPSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQToKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBEOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwNFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA4VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEk6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MFM6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTg7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1ODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDhESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1ODoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGOgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMDoKKwkJKm5hbWUgPSBNRTA2MDBfTkFNRV9ERVZJQ0VfTUUwNjMwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCQkqbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkqbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTQwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MDoKKwkJKm5hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwOworCisJCWJyZWFrOworLyoKKwkJY2FzZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxOgorCQkJKm5hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RFVklDRTsKKworCQkJYnJlYWs7CisqLworCWRlZmF1bHQ6CisJCSpuYW1lID0gRU1QVFlfTkFNRV9ERVZJQ0U7CisJCVBFUlJPUigiSW52YWxpZCBQQ0kgZGV2aWNlIGlkLlxuIik7CisKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMobWVfZGV2aWNlX3QgKiBkZXZpY2UsIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgICAgIGludCBzdWJkZXZpY2UsIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQlpbnQgc3ViZGV2aWNlLCBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgaW50IHR5cGUsCisJCQkJCSAgIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IHVuaXQsCisJCQkJCSAgaW50ICptaW4sCisJCQkJCSAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9yYW5nZV9pbmZvKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgcmFuZ2UsCisJCQkJICAgIGludCAqdW5pdCwgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitpbnQgbWVkdW1teV9xdWVyeV90aW1lcihtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCWludCBzdWJkZXZpY2UsCisJCQlpbnQgdGltZXIsCisJCQlpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJdWludDY0X3QgKiBtaW5fdGlja3MsIHVpbnQ2NF90ICogbWF4X3RpY2tzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICAgICAgIGludCAqdmVyc2lvbikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkqdmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZWR1bW15X2Rlc3RydWN0b3IobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWtmcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kZXZpY2VfaW5mbyh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkgICAgaW50IGJ1c190eXBlLAorCQkJICAgIGludCBidXNfbm8sCisJCQkgICAgaW50IGRldl9ubywKKwkJCSAgICBpbnQgZnVuY19ubywgbWVkdW1teV9kZXZpY2VfdCAqIGluc3RhbmNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpbnN0YW5jZS0+bWFnaWMgPSBNRURVTU1ZX01BR0lDX05VTUJFUjsKKwlpbnN0YW5jZS0+dmVuZG9yX2lkID0gdmVuZG9yX2lkOworCWluc3RhbmNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisJaW5zdGFuY2UtPnNlcmlhbF9ubyA9IHNlcmlhbF9ubzsKKwlpbnN0YW5jZS0+YnVzX3R5cGUgPSBidXNfdHlwZTsKKwlpbnN0YW5jZS0+YnVzX25vID0gYnVzX25vOworCWluc3RhbmNlLT5kZXZfbm8gPSBkZXZfbm87CisJaW5zdGFuY2UtPmZ1bmNfbm8gPSBmdW5jX25vOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9jb25maWdfbG9hZChtZV9kZXZpY2VfdCAqIGRldmljZSwgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJICAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kZXZpY2VfaW5zdGFuY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bGlzdCk7CisKKwlkZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RhcnQgPSBtZWR1bW15X2lvX2lycV9zdGFydDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19pcnFfd2FpdCA9IG1lZHVtbXlfaW9faXJxX3dhaXQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0b3AgPSBtZWR1bW15X2lvX2lycV9zdG9wOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSA9IG1lZHVtbXlfaW9fcmVzZXRfZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9IG1lZHVtbXlfaW9fcmVzZXRfc3ViZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZWR1bW15X2lvX3NpbmdsZV9jb25maWc7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZWR1bW15X2lvX3NpbmdsZV9yZWFkOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lZHVtbXlfaW9fc2luZ2xlX3dyaXRlOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPSBtZWR1bW15X2lvX3N0cmVhbV9jb25maWc7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPSBtZWR1bW15X2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVkdW1teV9pb19zdHJlYW1fcmVhZDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQgPSBtZWR1bW15X2lvX3N0cmVhbV9zdGFydDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzID0gbWVkdW1teV9pb19zdHJlYW1fc3RhdHVzOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVkdW1teV9pb19zdHJlYW1fc3RvcDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fd3JpdGUgPSBtZWR1bW15X2lvX3N0cmVhbV93cml0ZTsKKworCWRldmljZS0+bWVfZGV2aWNlX2xvY2tfZGV2aWNlID0gbWVkdW1teV9sb2NrX2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9sb2NrX3N1YmRldmljZSA9IG1lZHVtbXlfbG9ja19zdWJkZXZpY2U7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UgPQorCSAgICBtZWR1bW15X3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSA9IG1lZHVtbXlfcXVlcnlfaW5mb19kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVkdW1teV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXI7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2UgPSBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgPQorCSAgICBtZWR1bW15X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9IG1lZHVtbXlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPSBtZWR1bW15X3F1ZXJ5X251bWJlcl9yYW5nZXM7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWVkdW1teV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPSBtZWR1bW15X3F1ZXJ5X3JhbmdlX2luZm87CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgPQorCSAgICBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0gbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdGltZXIgPSBtZWR1bW15X3F1ZXJ5X3RpbWVyOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyID0KKwkgICAgbWVkdW1teV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXI7CisKKwlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yID0gbWVkdW1teV9kZXN0cnVjdG9yOworCWRldmljZS0+bWVfZGV2aWNlX2NvbmZpZ19sb2FkID0gbWVkdW1teV9jb25maWdfbG9hZDsKKwlyZXR1cm4gMDsKK30KKworbWVfZGV2aWNlX3QgKm1lZHVtbXlfY29uc3RydWN0b3IodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJIGludCBidXNfdHlwZSwKKwkJCQkgaW50IGJ1c19ubywgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pCit7CisJaW50IHJlc3VsdCA9IDA7CisJbWVkdW1teV9kZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBhdHRyaWJ1dGVzICovCisJaW5zdGFuY2UgPSBrbWFsbG9jKHNpemVvZihtZWR1bW15X2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChpbnN0YW5jZSwgMCwgc2l6ZW9mKG1lZHVtbXlfZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGluZm8gKi8KKwlyZXN1bHQgPSBpbml0X2RldmljZV9pbmZvKHZlbmRvcl9pZCwKKwkJCQkgIGRldmljZV9pZCwKKwkJCQkgIHNlcmlhbF9ubywKKwkJCQkgIGJ1c190eXBlLCBidXNfbm8sIGRldl9ubywgZnVuY19ubywgaW5zdGFuY2UpOworCisJaWYgKHJlc3VsdCkgeworCQlQRVJST1IoIkNhbm5vdCBpbml0IGJhb3JkIGluZm8uXG4iKTsKKwkJa2ZyZWUoaW5zdGFuY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBpbnN0YW5jZSAqLworCXJlc3VsdCA9IGluaXRfZGV2aWNlX2luc3RhbmNlKChtZV9kZXZpY2VfdCAqKSBpbnN0YW5jZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXQgYmFvcmQgaW5mby5cbiIpOworCQlrZnJlZShpbnN0YW5jZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgaW5zdGFuY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHVtbXlfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoZHVtbXlfaW5pdCk7CisKK21vZHVsZV9leGl0KGR1bW15X2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNZWlsaGF1cyBNRS1EVU1NWSBEZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtRFVNTVkgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZWR1bW15X2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkdW1teS5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVEVU1NWV9IXworI2RlZmluZSBfTUVEVU1NWV9IXworCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVEVU1NWV9NQUdJQ19OVU1CRVIJMHhERERECisKK3R5cGVkZWYgc3RydWN0IG1lZHVtbXlfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworLy8gICAgICBpbnQgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZDsJLyoqPCBWZW5kb3IgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CS8qKjwgRGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IHNlcmlhbF9ubzsJCS8qKjwgU2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlICovCisJaW50IGJ1c190eXBlOwkJCQkvKio8IEJ1cyB0eXBlICovCisJaW50IGJ1c19ubzsJCQkJCS8qKjwgQnVzIG51bWJlciAqLworCWludCBkZXZfbm87CQkJCQkvKio8IERldmljZSBudW1iZXIgKi8KKwlpbnQgZnVuY19ubzsJCQkJLyoqPCBGdW5jdGlvbiBudW1iZXIgKi8KK30gbWVkdW1teV9kZXZpY2VfdDsKKworbWVfZGV2aWNlX3QgKm1lZHVtbXlfY29uc3RydWN0b3IodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJIGludCBidXNfdHlwZSwKKwkJCQkgaW50IGJ1c19ubywKKwkJCQkgaW50IGRldl9ubywKKwkJCQkgaW50IGZ1bmNfbm8pIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVlcnJvci5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWRhNGJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWVycm9yLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqIEF1dGhvciAgICAgIDogS0cgKEtyenlzenRvZiBHYW50emtlKQk8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRVJST1JfSF8KKyNkZWZpbmUgX01FRVJST1JfSF8KKworZXh0ZXJuIGNoYXIgKm1lRXJyb3JNc2dUYWJsZVtdOworCisjZGVmaW5lIE1FX0VSUk5PX1NVQ0NFU1MJCQkJCQkwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfREVWSUNFCQkJCQkxCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFCQkJCTIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMCQkJCTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHCQkJNAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JFRgkJCQkJNQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RSSUdfQ0hBTgkJCQk2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFCQkJCTcKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0UJCQkJOAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQJCQkJOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTCQkJCQkxMAorI2RlZmluZSBNRV9FUlJOT19PUEVOCQkJCQkJCTExCisjZGVmaW5lIE1FX0VSUk5PX0NMT1NFCQkJCQkJCTEyCisjZGVmaW5lIE1FX0VSUk5PX05PVF9PUEVOCQkJCQkJMTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9ESVIJCQkJCTE0CisjZGVmaW5lIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRwkJCQkxNQorI2RlZmluZSBNRV9FUlJOT19OT1RfU1VQUE9SVEVECQkJCQkxNgorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfVFlQRQkJCQkJMTcKKyNkZWZpbmUgTUVfRVJSTk9fVVNFUl9CVUZGRVJfU0laRQkJCQkxOAorI2RlZmluZSBNRV9FUlJOT19MT0NLRUQJCQkJCQkJMTkKKyNkZWZpbmUgTUVfRVJSTk9fTk9NT1JFX1NVQkRFVklDRV9UWVBFCQkJMjAKKyNkZWZpbmUgTUVfRVJSTk9fVElNRU9VVAkJCQkJCTIxCisjZGVmaW5lIE1FX0VSUk5PX1NJR05BTAkJCQkJCQkyMgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0UJCQkJMjMKKyNkZWZpbmUgTUVfRVJSTk9fVEhSRUFEX1JVTk5JTkcJCQkJCTI0CisjZGVmaW5lIE1FX0VSUk5PX1NUQVJUX1RIUkVBRAkJCQkJMjUKKyNkZWZpbmUgTUVfRVJSTk9fQ0FOQ0VMX1RIUkVBRAkJCQkJMjYKKyNkZWZpbmUgTUVfRVJSTk9fTk9fQ0FMTEJBQ0sJCQkJCTI3CisjZGVmaW5lIE1FX0VSUk5PX1VTRUQJCQkJCQkJMjgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9VTklUCQkJCQkyOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX01JTl9NQVgJCQkJMzAKKyNkZWZpbmUgTUVfRVJSTk9fTk9fUkFOR0UJCQkJCQkzMQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JBTkdFCQkJCQkzMgorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWQkJCQkJMzMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9MT0NLCQkJCQkzNAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NXSVRDSAkJCQkJMzUKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9FUlJPUl9NU0dfQ09VTlQJCTM2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRwkJCTM3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQJCTM4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRQkzOQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0UJNDAKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19DSEFOCTQxCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RJTUVPVVQJCTQyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRwkJCTQzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEUJNDQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX0FSRwkJCTQ1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEUJNDYKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRwkJCTQ3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRQk0OAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkcJCQk0OQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRQkJNTAKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkcJCQk1MQorI2RlZmluZSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkcJCQk1MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1JFQURfTU9ERQkJCQk1MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UCQkJNTQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFCQkJCTU1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVElNRVIJCQkJCTU2CisjZGVmaW5lIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQJCQkJNTcKKyNkZWZpbmUgTUVfRVJSTk9fVVNFRF9JTlRFUk5BTAkJCQkJNTgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9EVVRZX0NZQ0xFCQkJCTU5CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfV0FJVAkJCQkJNjAKKyNkZWZpbmUgTUVfRVJSTk9fQ09OTkVDVF9SRU1PVEUJCQkJCTYxCisjZGVmaW5lIE1FX0VSUk5PX0NPTU1VTklDQVRJT04JCQkJCTYyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0xJU1QJCQk2MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX01PRFVMRV9UWVBFCQkJNjQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFCQkJCTY1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFCQkJCTY2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRklGT19JUlFfVEhSRVNIT0xECQk2NworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1BPSU5URVIJCQkJNjgKKyNkZWZpbmUgTUVfRVJSTk9fQ1JFQVRFX0VWRU5UCQkJCQk2OQorI2RlZmluZSBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUwkJCQk3MAorI2RlZmluZSBNRV9FUlJOT19DQU5DRUxMRUQJCQkJCQk3MQorI2RlZmluZSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVwkJCTcyCisjZGVmaW5lIE1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVwkJCTczCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0UJCQkJNzQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHCQkJCTc1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ0FQCQkJCQk3NgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQJCQk3NworI2RlZmluZSBNRV9FUlJOT19JTlRFUk5BTAkJCQkJCTc4CisKKy8qKiBOZXcgZXJyb3IgZm9yIHJhbmdlIGNoZWNrICovCisjZGVmaW5lIE1FX0VSUk5PX1ZBTFVFX09VVF9PRl9SQU5HRQkJCQk3OQorI2RlZmluZSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVwkJCTgwCisjZGVmaW5lIE1FX0VSUk5PX0ZJRk9fQlVGRkVSX1VOREVGRkxPVwkJCTgxCisKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9FUlJPUl9OVU1CRVIJCQk4MgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVmaXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoqCisgKiBAZmlsZSBtZWZpcm13YXJlLmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgZmlybXdhcmUgaGFuZGxpbmcuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKSAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgS3J6eXN6dG9mIEdhbnR6a2Ugay5nYW50emtlQG1laWxoYXVzLmRlICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBLQlVJTERfTU9ETkFNRQorIyAgZGVmaW5lIEtCVUlMRF9NT0ROQU1FIEtCVUlMRF9TVFIobWVmaXJtd2FyZSkKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKKyNpbmNsdWRlICJtZWZpcm13YXJlLmgiCisKK2ludCBtZV94aWxpbnhfZG93bmxvYWQodW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2NvbnRyb2wsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX2Jhc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fRklSTVdBUkU7CisJdWludDMyX3QgdmFsdWUgPSAwOworCWludCBpZHggPSAwOworCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmICghZmlybXdhcmVfbmFtZSkgeworCQlQRVJST1IoIlJlcXVlc3QgZm9yIGZpcm13YXJlIGZhaWxlZC4gTm8gbmFtZSBwcm92aWRlZC4gXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlQSU5GTygiUmVxdWVzdCAnJXMnIGZpcm13YXJlLlxuIiwgZmlybXdhcmVfbmFtZSk7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpcm13YXJlX25hbWUsIGRldik7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiUmVxdWVzdCBmb3IgZmlybXdhcmUgZmFpbGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIFNldCBQTFggbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgdG8gaGlnaC4KKwkvLyBJbnRlcnJ1cHQgaXMgdGhyb3duIGJ5IGluaXQgcGluIG9mIHhpbGlueC4KKwlvdXRsKFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wsIHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpOworCisJLy8gU2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbngKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSBNRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCS8vIEluaXQgWGlsaW54IHdpdGggQ1MxCisJaW5sKHJlZ2lzdGVyX2Jhc2VfZGF0YSArIE1FX1hJTElOWF9DUzFfUkVHKTsKKworCS8vIFdhaXQgZm9yIGluaXQgdG8gY29tcGxldGUKKwl1ZGVsYXkoMjApOworCisJLy8gQ2hlY2tsIC9JTklUIHBpbgorCWlmICghCisJICAgIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lOVENTUikgJgorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFKSkgeworCQlQRVJST1IoIkNhbid0IGluaXQgWGlsaW54LlxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLy8gUmVzZXQgL0NTIGFuZCAvV1JJVEUgb2YgdGhlIFhpbGlueAorCXZhbHVlID0gaW5sKHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JQ1IpOworCXZhbHVlICY9IH5NRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCS8vIERvd25sb2FkIFhpbGlueCBmaXJtd2FyZQorCXVkZWxheSgxMCk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGZ3LT5zaXplOyBpZHgrKykgeworCQlvdXRsKGZ3LT5kYXRhW2lkeF0sIHJlZ2lzdGVyX2Jhc2VfZGF0YSk7CisjaWZkZWYgTUU2MDAwX3YyXzQKKy8vLyAgICAgVGhpcyBjaGVja2luZyBvbmx5IGZvciBib2FyZCdzIHZlcnNpb24gMi40CisJCS8vIENoZWNrIGlmIEJVU1kgZmxhZyBpcyBzZXQgKGxvdyA9IHJlYWR5LCBoaWdoID0gYnVzeSkKKwkJaWYgKGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKSAmCisJCSAgICBNRV9GSVJNV0FSRV9CVVNZX0ZMQUcpIHsKKwkJCVBFUlJPUigiWGlsaW54IGlzIHN0aWxsIGJ1c3kgKGlkeCA9ICVkKVxuIiwgaWR4KTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKyNlbmRpZiAvL01FNjAwMF92Ml80CisJfQorCVBERUJVRygiRG93bmxvYWQgZmluaXNoZWQuICVkIGJ5dGVzIHdyaXR0ZW4gdG8gUExYLlxuIiwgaWR4KTsKKworCS8vIElmIGRvbmUgZmxhZyBpcyBoaWdoIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsCisJaWYgKGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKSAmIE1FX0ZJUk1XQVJFX0RPTkVfRkxBRykgeworCQlQREVCVUcoIlNVQ0NFU1MuIERvbmUgZmxhZyBpcyBzZXQuXG4iKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkZBSUxVUkUuIERPTkUgZmxhZyBpcyBub3Qgc2V0LlxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvLyBTZXQgL0NTIGFuZCAvV1JJVEUKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSB8PSBNRV9GSVJNV0FSRV9DU19XUklURTsKKwlvdXRsKHZhbHVlLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKworCVBERUJVRygiRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBpbnRlcmZhY2UuXG4iKTsKKwlvdXRsKE1FX1BMWF9QQ0lfQUNUSVZBVEUsIHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVmaXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY4NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaApAQCAtMCwwICsxLDU3IEBACisvKioKKyAqIEBmaWxlIG1lZmlybXdhcmUuaAorICoKKyAqIEBicmllZiBEZWZpbml0aW9ucyBvZiB0aGUgZmlybXdhcmUgaGFuZGxpbmcgZnVuY3Rpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpICAgICAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBieSBLcnp5c3p0b2YgR2FudHprZSBrLmdhbnR6a2VAbWVpbGhhdXMuZGUgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9NRUZJUk1XQVJFX0gKKyMgZGVmaW5lIF9NRUZJUk1XQVJFX0gKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVfRVJSTk9fRklSTVdBUkUJCS0xCisKKy8qKgorKiBSZWdpc3RyeQorKi8KKyNkZWZpbmUgTUVfWElMSU5YX0NTMV9SRUcJCTB4MDBDOAorCisvKioKKyogRmxhZ3MgKGJpdHMpCisqLworCisjZGVmaW5lIE1FX0ZJUk1XQVJFX0JVU1lfRkxBRwkweDAwMDAwMDIwCisjZGVmaW5lIE1FX0ZJUk1XQVJFX0RPTkVfRkxBRwkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0ZJUk1XQVJFX0NTX1dSSVRFCTB4MDAwMDAxMDAKKworI2RlZmluZSBNRV9QTFhfUENJX0FDVElWQVRFCQkweDQzCisKK2ludCBtZV94aWxpbnhfZG93bmxvYWQodW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2NvbnRyb2wsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZ2lzdGVyX2Jhc2VfZGF0YSwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSk7CisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisKKyNlbmRpZiAvL19NRUZJUk1XQVJFX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlNzU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVpZHMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSURTX0hfCisjZGVmaW5lIF9NRUlEU19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERyaXZlciBuYW1lcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FTUFJTl9OQU1FCQkJCSJtZW1haW4iCisjZGVmaW5lIE1FMTAwMF9OQU1FCQkJCSJtZTEwMDAiCisjZGVmaW5lIE1FMTQwMF9OQU1FCQkJCSJtZTE0MDAiCisjZGVmaW5lIE1FMTYwMF9OQU1FCQkJCSJtZTE2MDAiCisjZGVmaW5lIE1FNDYwMF9OQU1FCQkJCSJtZTQ2MDAiCisjZGVmaW5lIE1FNjAwMF9OQU1FCQkJCSJtZTYwMDAiCisjZGVmaW5lIE1FMDYwMF9OQU1FCQkJCSJtZTA2MDAiCS8vIm1lNjMwIgorI2RlZmluZSBNRTgxMDBfTkFNRQkJCQkibWU4MTAwIgorI2RlZmluZSBNRTgyMDBfTkFNRQkJCQkibWU4MjAwIgorI2RlZmluZSBNRTA5MDBfTkFNRQkJCQkibWUwOTAwIgkvLyJtZTl4IgorLy8jZGVmaW5lIE1FUEhJU1RPX1MxX05BTUUgICAgICAgICAgICAgICAgICAgICAgIm1lcGhpc3RvX3MxIgorI2RlZmluZSBNRURVTU1ZX05BTUUJCQkibWVkdW1teSIKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTI2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laW50ZXJuYWwuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSU5URVJOQUxfSF8KKyNkZWZpbmUgX01FSU5URVJOQUxfSF8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgVmVuZG9yIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVJTEhBVVMJCQkJCQkweDE0MDIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgRGV2aWNlIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwCQkJCTB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9BCQkJCTB4MTAwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9CCQkJCTB4MTAwQgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwCQkJCTB4MTQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQQkJCQkweDE0MEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEIJCQkJMHgxNDBCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwCQkJCTB4MTRFMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQQkJCQkweDE0RUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUIJCQkJMHgxNEVCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDCQkJCTBYMTQwQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRAkJCQkwWDE0MEQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VQkJCTB4MTYwNCAvLyA0IHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VQkJCTB4MTYwOCAvLyA4IHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUJCQkweDE2MEMgLy8gMTIgdm9sdGFnZSBvdXRwdXRzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VQkJCTB4MTYwRiAvLyAxNiB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJCQkweDE2OEYgLy8gMTYgdm9sdGFnZS84IGN1cnJlbnQgby4KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMAkJCQkweDQ2MTAgLy8gSmVreWxsCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAJCQkJMHg0NjUwIC8vIExvdyBDb3N0IHZlcnNpb24KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MAkJCQkweDQ2NjAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEkJCQkJMHg0NjYxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTCQkJCTB4NDY2MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMJCQkJMHg0NjYzIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MAkJCQkweDQ2NzAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEkJCQkJMHg0NjcxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTCQkJCTB4NDY3MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMJCQkJMHg0NjczIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MAkJCQkweDQ2ODAgLy8gU3RhbmRhcmQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEkJCQkJMHg0NjgxIC8vIElzb2xhdGVkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTCQkJCTB4NDY4MiAvLyBTdGFuZGFyZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMJCQkJMHg0NjgzIC8vIElzb2xhdGVkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKworLyogTUU2MDAwIHN0YW5kYXJkIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQgICAJCQkweDYwMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDggICAJCQkweDYwMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYgICAJCQkweDYwMEYKKworLyogTUU2MDAwIGlzb2xhdGVkIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQgICAJCQkweDYwMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTggICAJCQkweDYwMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYgICAJCQkweDYwMUYKKworLyogTUU2MDAwIGlzbGUgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCAgIAkJCTB4NjAzNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzOCAgIAkJCTB4NjAzOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRiAgIAkJCTB4NjAzRgorCisvKiBNRTYwMDAgc3RhbmRhcmQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCAgIAkJCTB4NjA0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0OCAgIAkJCTB4NjA0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RiAgIAkJCTB4NjA0RgorCisvKiBNRTYwMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCAgIAkJCTB4NjA1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1OCAgIAkJCTB4NjA1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RiAgIAkJCTB4NjA1RgorCisvKiBNRTYwMDAgaXNsZSB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0ICAgCQkJMHg2MDc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4ICAgCQkJMHg2MDc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDdGICAgCQkJMHg2MDdGCisKKy8qIE1FNjEwMCBzdGFuZGFyZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0ICAgCQkJMHg2MTA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4ICAgCQkJMHg2MTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGICAgCQkJMHg2MTBGCisKKy8qIE1FNjEwMCBpc29sYXRlZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE0ICAgCQkJMHg2MTE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4ICAgCQkJMHg2MTE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGICAgCQkJMHg2MTFGCisKKy8qIE1FNjEwMCBpc2xlIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzQgICAJCQkweDYxMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzggICAJCQkweDYxMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YgICAJCQkweDYxM0YKKworLyogTUU2MTAwIHN0YW5kYXJkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQJCQkJMHg2MTQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4ICAgCQkJMHg2MTQ4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGICAgCQkJMHg2MTRGCisKKy8qIE1FNjEwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU0ICAgCQkJMHg2MTU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4ICAgCQkJMHg2MTU4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGICAgCQkJMHg2MTVGCisKKy8qIE1FNjEwMCBpc2xlIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzQgICAJCQkweDYxNzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzggICAJCQkweDYxNzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YgICAJCQkweDYxN0YKKworLyogTUU2MjAwIGlzb2xhdGVkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTkJCQkJMHg2MjU5CisKKy8qIE1FNjMwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5CQkJCTB4NjM1OQorCisvKiBNRTA2MzAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAJCQkJMHgwNjMwCisKKy8qIE1FODEwMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BCQkJCTB4ODEwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9CICAJCQkweDgxMEIKKworLyogTUU4MjAwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0EJCQkJMHg4MjBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IgIAkJCTB4ODIwQgorCisvKiBNRTA5MDAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDAJCQkJMHgwOTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwCQkJCTB4MDk1MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MAkJCQkweDA5NjAKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVTQiBWZW5kb3IgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8vI2RlZmluZSBVU0JfVkVORE9SX0lEX01FUEhJU1RPX1MxCQkJCQkweDA0MDMKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVTQiBEZXZpY2UgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8vI2RlZmluZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxCQkJCQkweERDRDAKKworCisvKiBNRS0xMDAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxMDAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xMDAwIgorCisjZGVmaW5lIE1FMTAwMF9OQU1FX0RFVklDRV9NRTEwMDAJCQkJCSJNRS0xMDAwIgorCisjZGVmaW5lIE1FMTAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxMDAwCQkJIk1FLTEwMDAgZGV2aWNlLCAxMjggZGlnaXRhbCBpL28gbGluZXMuIgorCisvKiBNRS0xNDAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxNDAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xNDAwIgorCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDAJCQkJCSJNRS0xNDAwIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRQkJCQkJIk1FLTE0MDBFIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQQkJCQkJIk1FLTE0MDBBIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUEJCQkJCSJNRS0xNDAwRUEiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCCQkJCQkiTUUtMTQwMEIiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBFQgkJCQkJIk1FLTE0MDBFQiIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEMJCQkJCSJNRS0xNDAwQyIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEQJCQkJCSJNRS0xNDAwRCIKKworI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMAkJCSJNRS0xNDAwIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEUJCQkiTUUtMTQwMEUgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQQkJCSJNRS0xNDAwQSBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQQkJCSJNRS0xNDAwRUEgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQgkJCSJNRS0xNDAwQiBkZXZpY2UsIDQ4IGRpZ2l0YWwgaS9vIGxpbmVzLCA2IGNvdW50ZXJzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQgkJCSJNRS0xNDAwRUIgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgNiBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQwkJCSJNRS0xNDAwQyBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLCAxNSBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRAkJCSJNRS0xNDAwRCBkZXZpY2UsIDQ4IGRpZ2l0YWwgaS9vIGxpbmVzLCAzMCBjb3VudGVycy4iCisKKy8qIE1FLTE2MDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTE2MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTE2MDAiCisKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDRVCQkJCQkiTUUtMTYwMC80VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDhVCQkJCQkiTUUtMTYwMC84VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDEyVQkJCQkiTUUtMTYwMC8xMlUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlUJCQkJIk1FLTE2MDAvMTZVIgorI2RlZmluZSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVOEkJCQkJIk1FLTE2MDAvMTZVOEkiCisKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA0VQkJCSJNRS0xNjAwLzRVIGRldmljZSwgNCB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVCQkJIk1FLTE2MDAvOFUgZGV2aWNlLCA4IHZvbHRhZ2Ugb3V0cHV0cy4iCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTJVCQkJIk1FLTE2MDAvMTJVIGRldmljZSwgMTIgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlUJCQkiTUUtMTYwMC8xNlUgZGV2aWNlLCAxNiB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDE2VThJCQkiTUUtMTYwMC8xNlU4SSBkZXZpY2UsIDE2IHZvbHRhZ2UsIDggY3VycmVudCBvdXRwdXRzLiIKKworLyogTUUtNDAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtNDYwMCIKKworI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwCQkJCQkiTUUtNDYxMCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY1MAkJCQkJIk1FLTQ2NTAiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjAJCQkJCSJNRS00NjYwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSQkJCQkJIk1FLTQ2NjBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwUwkJCQkJIk1FLTQ2NjBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwSVMJCQkJCSJNRS00NjYwSVMiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzAJCQkJCSJNRS00NjcwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSQkJCQkJIk1FLTQ2NzBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUwkJCQkJIk1FLTQ2NzBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSVMJCQkJCSJNRS00NjcwSVMiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODAJCQkJCSJNRS00NjgwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSQkJCQkJIk1FLTQ2ODBJIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwUwkJCQkJIk1FLTQ2ODBTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSVMJCQkJCSJNRS00NjgwSVMiCisKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2MTAJCQkiTUUtNDYxMCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY1MAkJCSJNRS00NjUwIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwCQkJIk1FLTQ2NjAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSQkJCSJNRS00NjYwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MFMJCQkiTUUtNDY2MCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MElTCQkJIk1FLTQ2NjBJIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzAJCQkiTUUtNDY3MCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJCQkJIk1FLTQ2NzBJIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwUwkJCSJNRS00NjcwUyBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MElTCQkJIk1FLTQ2NzBJUyBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwCQkJIk1FLTQ2ODAgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSQkJCSJNRS00NjgwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFMJCQkiTUUtNDY4MFMgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVMJCQkiTUUtNDY4MElTIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKworLyogTUUtNjAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtNjAwMCIKKworI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNAkJCQkJIk1FLTYwMDAvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDgJCQkJCSJNRS02MDAwLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDAxNgkJCQkJIk1FLTYwMDAvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNAkJCQkJIk1FLTYwMDBJLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJOAkJCQkJIk1FLTYwMDBJLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJMTYJCQkJIk1FLTYwMDBJLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQJCQkJIk1FLTYwMDBJU0xFLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOAkJCQkiTUUtNjAwMElTTEUvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNgkJCQkiTUUtNjAwMElTTEUvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0CQkJCQkiTUUtNjEwMC80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwOAkJCQkJIk1FLTYxMDAvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2CQkJCQkiTUUtNjEwMC8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0CQkJCQkiTUUtNjEwMEkvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4CQkJCQkiTUUtNjEwMEkvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNgkJCQkiTUUtNjEwMEkvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNAkJCQkiTUUtNjEwMElTTEUvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4CQkJCSJNRS02MTAwSVNMRS84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2CQkJCSJNRS02MTAwSVNMRS8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDRESU8JCQkJIk1FLTYwMDAvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPCQkJCSJNRS02MDAwLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU8JCQkJIk1FLTYwMDAvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTRESU8JCQkJIk1FLTYwMDBJLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU8JCQkJIk1FLTYwMDBJLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPCQkJCSJNRS02MDAwSS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFNERJTwkJCSJNRS02MDAwSVNMRS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU4RElPCQkJIk1FLTYwMDBJU0xFLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPCQkJIk1FLTYwMDBJU0xFLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDRESU8JCQkJIk1FLTYxMDAvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPCQkJCSJNRS02MTAwLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU8JCQkJIk1FLTYxMDAvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTRESU8JCQkJIk1FLTYxMDBJLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU8JCQkJIk1FLTYxMDBJLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPCQkJCSJNRS02MTAwSS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFNERJTwkJCSJNRS02MTAwSVNMRS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU4RElPCQkJIk1FLTYxMDBJU0xFLzgvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPCQkJIk1FLTYxMDBJU0xFLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjIwMEk5RElPCQkJCSJNRS02MjAwSS85L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjMwMEk5RElPCQkJCSJNRS02MzAwSS85L0RJTyIKKworI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDQJCQkiTUUtNjAwMC80IGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDgJCQkiTUUtNjAwMC84IGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwMTYJCQkiTUUtNjAwMC8xNiBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNAkJCSJNRS02MDAwSS80IGlzb2xhdGVkIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTgJCQkiTUUtNjAwMEkvOCBpc29sYXRlZCBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNgkJCSJNRS02MDAwSS8xNiBpc29sYXRlZCBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNAkJIk1FLTYwMDBJU0xFLzQgaXNsZSBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU4CQkiTUUtNjAwMElTTEUvOCBpc2xlIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2CQkiTUUtNjAwMElTTEUvMTYgaXNsZSBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0CQkJIk1FLTYxMDAvNCBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4CQkJIk1FLTYxMDAvOCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwMTYJCQkiTUUtNjEwMC8xNiBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk0CQkJIk1FLTYxMDBJLzQgaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTgJCQkiTUUtNjEwMEkvOCBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2CQkJIk1FLTYxMDBJLzE2IGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTQJCSJNRS02MTAwSVNMRS80IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTgJCSJNRS02MTAwSVNMRS84IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEUxNgkJIk1FLTYxMDBJU0xFLzE2IGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPCQkiTUUtNjAwMC80L0RJTyBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwOERJTwkJIk1FLTYwMDAvOC9ESU8gZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2RElPCQkiTUUtNjAwMC8xNi9ESU8gZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk0RElPCQkiTUUtNjAwMEkvNC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPCQkiTUUtNjAwMEkvOC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEkxNkRJTwkJIk1FLTYwMDBJLzE2L0RJTyBpc29sYXRlZCBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPCSJNRS02MDAwSVNMRS80L0RJTyBpc2xlIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTwkiTUUtNjAwMElTTEUvOC9ESU8gaXNsZSBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPCSJNRS02MDAwSVNMRS8xNi9ESU8gaXNsZSBkZXZpY2UsIDE2IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDRESU8JCSJNRS02MTAwLzQvRElPIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPCQkiTUUtNjEwMC84L0RJTyBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2RElPCQkiTUUtNjEwMC8xNi9ESU8gZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU8JCSJNRS02MTAwSS80L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSThESU8JCSJNRS02MTAwSS84L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNkRJTwkJIk1FLTYxMDBJLzE2L0RJTyBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNERJTwkiTUUtNjEwMElTTEUvNC9ESU8gaXNsZSBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRThESU8JIk1FLTYxMDBJU0xFLzgvRElPIGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU8JIk1FLTYxMDBJU0xFLzE2L0RJTyBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPCQkiTUUtNjIwMEkvOS9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA5IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjMwMEk5RElPCQkiTUUtNjMwMEkvOS9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNSBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKworLyogTUUtNjMwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUwNjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0wNjAwIgorCisjZGVmaW5lIE1FMDYwMF9OQU1FX0RFVklDRV9NRTA2MzAJCQkJCSJNRS02MzAiCisKKyNkZWZpbmUgTUUwNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA2MzAJCQkiTUUtNjMwIGRldmljZSwgdXAgdG8gMTYgcmVsYXksIDggZGlnaXRhbCB0dGwgaW5wdXQgbGluZXMsIDggaXNvbGF0ZWQgZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMsIDIgZXh0ZXJuYWwgaW50ZXJydXB0cy4iCisKKy8qIE1FLTgxMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTgxMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTgxMDAiCisKKyNkZWZpbmUgTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEEJCQkJCSJNRS04MTAwQSIKKyNkZWZpbmUgTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEIJCQkJCSJNRS04MTAwQiIKKworI2RlZmluZSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEEJCQkiTUUtODEwMEEgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLiIKKyNkZWZpbmUgTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBCCQkJIk1FLTgxMDBCIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAzMiBkaWdpdGFsIGlucHV0IGxpbmVzLCAzMiBkaWdpdGFsIG91dHB1dCBsaW5lcywgMyBjb3VudGVycy4iCisKKy8qIE1FLTgyMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTgyMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTgyMDAiCisKKyNkZWZpbmUgTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEEJCQkJCSJNRS04MjAwQSIKKyNkZWZpbmUgTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEIJCQkJCSJNRS04MjAwQiIKKworI2RlZmluZSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEEJCQkiTUUtODIwMEEgb3B0byBpc29sYXRlZCBkZXZpY2UsIDggZGlnaXRhbCBvdXRwdXQgbGluZXMsIDggZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEIJCQkiTUUtODIwMEIgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisKKy8qIE1FLTA5MDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTA5MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTA5MDAiCisKKyNkZWZpbmUgTUUwOTAwX05BTUVfREVWSUNFX01FMDk0MAkJCQkJIk1FLTk0IgorI2RlZmluZSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwCQkJCQkiTUUtOTUiCisjZGVmaW5lIE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NjAJCQkJCSJNRS05NiIKKworI2RlZmluZSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MAkJCSJNRS05NCBkZXZpY2UsIDE2IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDIgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmVzLiIKKyNkZWZpbmUgTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTAJCQkiTUUtOTUgZGV2aWNlLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcy4iCisjZGVmaW5lIE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTYwCQkJIk1FLTk2IGRldmljZSwgOCBkaWdpdGFsIGlucHV0IGxpbmVzLCA4IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdCBsaW5lcy4iCisKKy8qIE1FLURVTU1ZIGRlZmluZXMgKi8KKyNkZWZpbmUgTUVEVU1NWV9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtRHVtbXkiCisKKy8qIE1FUEhJU1RPX1MxIGRlZmluZXMgKi8KKy8qCisjZGVmaW5lIE1FUEhJU1RPX1MxX05BTUVfRFJJVkVSCQkJCQkJIk1FcGhpc3RvIFNjb3BlIDEiCisjZGVmaW5lIE1FUEhJU1RPX1MxX05BTUVfREVWSUNFCQkJCQkJIk1FcGhpc3RvIFNjb3BlIDEiCisjZGVmaW5lIE1FUEhJU1RPX1MxX0RFU0NSSVBUSU9OX0RFVklDRQkJCQkiTUVwaGlzdG8gU2NvcGUgMSBkZXZpY2UsIDIgYW5hbG9nIGlucHV0cywgMjQgZGlnaXRhbCBpL28uIgorKi8KKy8qIEVycm9yIGRlZmluZXMgKi8KKyNkZWZpbmUgRU1QVFlfTkFNRV9EUklWRVIJCQkJCQkJIk1FLT8/PyIKKyNkZWZpbmUgRU1QVFlfTkFNRV9ERVZJQ0UJCQkJCQkJIk1FLT8/PyIKKyNkZWZpbmUgRU1QVFlfREVTQ1JJUFRJT05fREVWSUNFCQkJCQkiTUUtPz8/IHVua25vd24gZGV2aWNlIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzcxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laW9jdGwuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FSU9DVExfSF8KKyNkZWZpbmUgX01FSU9DVExfSF8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgaW5wdXQvb3V0cHV0IGlvY3RscworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19pcnFfc3RhcnQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgaXJxX3NvdXJjZTsKKwlpbnQgaXJxX2VkZ2U7CisJaW50IGlycV9hcmc7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9faXJxX3N0YXJ0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3dhaXQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgaXJxX2NvdW50OworCWludCB2YWx1ZTsKKwlpbnQgdGltZV9vdXQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9faXJxX3dhaXRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19pcnFfc3RvcCB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV9zdG9wX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fcmVzZXRfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3Jlc2V0X2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3Jlc2V0X3N1YmRldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3Jlc2V0X3N1YmRldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3NpbmdsZV9jb25maWcgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgc2luZ2xlX2NvbmZpZzsKKwlpbnQgcmVmOworCWludCB0cmlnX2NoYW47CisJaW50IHRyaWdfdHlwZTsKKwlpbnQgdHJpZ19lZGdlOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3NpbmdsZV9jb25maWdfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zaW5nbGUgeworCW1lSU9TaW5nbGVfdCAqc2luZ2xlX2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3NpbmdsZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9jb25maWcgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwltZUlPU3RyZWFtQ29uZmlnX3QgKmNvbmZpZ19saXN0OworCWludCBjb3VudDsKKwltZUlPU3RyZWFtVHJpZ2dlcl90IHRyaWdnZXI7CisJaW50IGZpZm9faXJxX3RocmVzaG9sZDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fY29uZmlnX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX25ld192YWx1ZXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdGltZV9vdXQ7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3JlYWQgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgcmVhZF9tb2RlOworCWludCAqdmFsdWVzOworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fcmVhZF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdGFydCB7CisJbWVJT1N0cmVhbVN0YXJ0X3QgKnN0YXJ0X2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9zdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdGF0dXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgd2FpdDsKKwlpbnQgc3RhdHVzOworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fc3RhdHVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3N0b3AgeworCW1lSU9TdHJlYW1TdG9wX3QgKnN0b3BfbGlzdDsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3N0b3BfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fd3JpdGUgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgd3JpdGVfbW9kZTsKKwlpbnQgKnZhbHVlczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3dyaXRlX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGxvY2sgaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBsb2NrOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2xvY2tfZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfbG9ja19kcml2ZXIgeworCWludCBmbGFnczsKKwlpbnQgbG9jazsKKwlpbnQgZXJybm87Cit9IG1lX2xvY2tfZHJpdmVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfbG9ja19zdWJkZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgbG9jazsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9sb2NrX3N1YmRldmljZV90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVHlwZXMgZm9yIHRoZSBxdWVyeSBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfaW5mb19kZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHZlbmRvcl9pZDsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzZXJpYWxfbm87CisJaW50IGJ1c190eXBlOworCWludCBidXNfbm87CisJaW50IGRldl9ubzsKKwlpbnQgZnVuY19ubzsKKwlpbnQgcGx1Z2dlZDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWNoYXIgKm5hbWU7CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbmFtZV9kZXZpY2UgeworCWludCBkZXZpY2U7CisJY2hhciAqbmFtZTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9uYW1lX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciB7CisJaW50IGRldmljZTsKKwljaGFyICpuYW1lOworCWludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXIgeworCWludCB2ZXJzaW9uOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciB7CisJaW50IGRldmljZTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzIHsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyB7CisJaW50IGRldmljZTsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX3JhbmdlcyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCB1bml0OworCWludCBudW1iZXI7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgeworCWludCBkZXZpY2U7CisJaW50IHN0YXJ0X3N1YmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3VidHlwZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCB0eXBlOworCWludCBzdWJ0eXBlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjYXBzOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNhcDsKKwlpbnQgYXJnc1s4XTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfdGltZXIgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdGltZXI7CisJaW50IGJhc2VfZnJlcXVlbmN5OworCWxvbmcgbG9uZyBtaW5fdGlja3M7CisJbG9uZyBsb25nIG1heF90aWNrczsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3RpbWVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heCB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjaGFubmVsOworCWludCB1bml0OworCWludCBtaW47CisJaW50IG1heDsKKwlpbnQgbWF4X2RhdGE7CisJaW50IHJhbmdlOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3JhbmdlX2luZm8geworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgcmFuZ2U7CisJaW50IG1pbjsKKwlpbnQgbWF4OworCWludCBtYXhfZGF0YTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3JhbmdlX2luZm9fdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgY29uZmlndXJhdGlvbiBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3RjcGlwX2xvY2F0aW9uIHsKKwlpbnQgYWNjZXNzX3R5cGU7CisJY2hhciAqcmVtb3RlX2hvc3Q7CisJaW50IHJlbW90ZV9kZXZpY2VfbnVtYmVyOworfSBtZV9jZmdfdGNwaXBfbG9jYXRpb25fdDsKKworCit0eXBlZGVmIHVuaW9uIG1lX2NmZ190Y3BpcCB7CisJaW50IGFjY2Vzc190eXBlOworCW1lX2NmZ190Y3BpcF9sb2NhdGlvbl90IGxvY2F0aW9uOworfSBtZV9jZmdfdGNwaXBfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfcGNpX2h3X2xvY2F0aW9uIHsKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJdW5zaWduZWQgaW50IGJ1c19ubzsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX25vOworCXVuc2lnbmVkIGludCBmdW5jdGlvbl9ubzsKK30gbWVfY2ZnX3BjaV9od19sb2NhdGlvbl90OworCisvKgordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3VzYl9od19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IGJ1c190eXBlOworCXVuc2lnbmVkIGludCByb290X2h1Yl9ubzsKK30gbWVfY2ZnX3VzYl9od19sb2NhdGlvbl90OworKi8KKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfaHdfbG9jYXRpb24geworCXVuc2lnbmVkIGludCBidXNfdHlwZTsKKwltZV9jZmdfcGNpX2h3X2xvY2F0aW9uX3QgcGNpOworLy8JbWVfY2ZnX3VzYl9od19sb2NhdGlvbl90IHVzYjsKK30gbWVfY2ZnX2h3X2xvY2F0aW9uX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX2RldmljZV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yX2lkOworCXVuc2lnbmVkIGludCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IHNlcmlhbF9ubzsKKwltZV9jZmdfaHdfbG9jYXRpb25fdCBod19sb2NhdGlvbjsKK30gbWVfY2ZnX2RldmljZV9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3N1YmRldmljZV9pbmZvIHsKKwlpbnQgdHlwZTsKKwlpbnQgc3ViX3R5cGU7CisJdW5zaWduZWQgaW50IG51bWJlcl9jaGFubmVsczsKK30gbWVfY2ZnX3N1YmRldmljZV9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3JhbmdlX2VudHJ5IHsKKwlpbnQgdW5pdDsKKwlkb3VibGUgbWluOworCWRvdWJsZSBtYXg7CisJdW5zaWduZWQgaW50IG1heF9kYXRhOworfSBtZV9jZmdfcmFuZ2VfZW50cnlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfbXV4MzJtX2RldmljZSB7CisJaW50IHR5cGU7CisJaW50IHRpbWVkOworCXVuc2lnbmVkIGludCBhaV9jaGFubmVsOworCXVuc2lnbmVkIGludCBkaW9fZGV2aWNlOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9kZXZpY2U7CisJdW5zaWduZWQgaW50IHRpbWVyX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgbXV4MzJzX2NvdW50OworfSBtZV9jZmdfbXV4MzJtX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZW11eDMyX2RldmljZSB7CisJaW50IHR5cGU7CisJaW50IHRpbWVkOworCXVuc2lnbmVkIGludCBhb19jaGFubmVsOworCXVuc2lnbmVkIGludCBkaW9fZGV2aWNlOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9kZXZpY2U7CisJdW5zaWduZWQgaW50IHRpbWVyX3N1YmRldmljZTsKK30gbWVfY2ZnX2RlbXV4MzJfZGV2aWNlX3Q7CisKKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfZXh0ZXJuYWxfZGV2aWNlIHsKKwlpbnQgdHlwZTsKKwltZV9jZmdfbXV4MzJtX2RldmljZV90IG11eDMybTsKKwltZV9jZmdfZGVtdXgzMl9kZXZpY2VfdCBkZW11eDMyOworfSBtZV9jZmdfZXh0ZXJuYWxfZGV2aWNlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3N1YmRldmljZV9lbnRyeSB7CisJbWVfY2ZnX3N1YmRldmljZV9pbmZvX3QgaW5mbzsKKwltZV9jZmdfcmFuZ2VfZW50cnlfdCAqcmFuZ2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGxvY2tlZDsKKwltZV9jZmdfZXh0ZXJuYWxfZGV2aWNlX3QgZXh0ZXJuYWxfZGV2aWNlOworfSBtZV9jZmdfc3ViZGV2aWNlX2VudHJ5X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX2RldmljZV9lbnRyeSB7CisJbWVfY2ZnX3RjcGlwX3QgdGNwaXA7CisJbWVfY2ZnX2RldmljZV9pbmZvX3QgaW5mbzsKKwltZV9jZmdfc3ViZGV2aWNlX2VudHJ5X3QgKnN1YmRldmljZV9saXN0OworCXVuc2lnbmVkIGludCBjb3VudDsKK30gbWVfY2ZnX2RldmljZV9lbnRyeV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NvbmZpZ19sb2FkIHsKKwltZV9jZmdfZGV2aWNlX2VudHJ5X3QgKmRldmljZV9saXN0OworCXVuc2lnbmVkIGludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX2NvbmZpZ19sb2FkX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUaGUgaW9jdGxzIG9mIHRoZSBib2FyZAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FTUFJTl9NQUdJQyAneScKKworI2RlZmluZSBNRV9JT19JUlFfRU5BQkxFCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMSwgbWVfaW9faXJxX3N0YXJ0X3QpCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUCQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIsIG1lX2lvX2lycV93YWl0X3QpCisjZGVmaW5lIE1FX0lPX0lSUV9ESVNBQkxFCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMywgbWVfaW9faXJxX3N0b3BfdCkKKworI2RlZmluZSBNRV9JT19SRVNFVF9ERVZJQ0UJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA0LCBtZV9pb19yZXNldF9kZXZpY2VfdCkKKyNkZWZpbmUgTUVfSU9fUkVTRVRfU1VCREVWSUNFCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA1LCBtZV9pb19yZXNldF9zdWJkZXZpY2VfdCkKKworI2RlZmluZSBNRV9JT19TSU5HTEUJCQkJCV9JT1dSKE1FTUFJTl9NQUdJQywgNiwgbWVfaW9fc2luZ2xlX3QpCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUcJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA3LCBtZV9pb19zaW5nbGVfY29uZmlnX3QpCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJRwkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDgsIG1lX2lvX3N0cmVhbV9jb25maWdfdCkKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX05FV19WQUxVRVMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDksIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9SRUFECQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMTAsIG1lX2lvX3N0cmVhbV9yZWFkX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFSVAkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDExLCBtZV9pb19zdHJlYW1fc3RhcnRfdCkKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVRVUwkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEyLCBtZV9pb19zdHJlYW1fc3RhdHVzX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVE9QCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTMsIG1lX2lvX3N0cmVhbV9zdG9wX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9XUklURQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE0LCBtZV9pb19zdHJlYW1fd3JpdGVfdCkKKworI2RlZmluZSBNRV9MT0NLX0RSSVZFUgkJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxNSwgbWVfbG9ja19kcml2ZXJfdCkKKyNkZWZpbmUgTUVfTE9DS19ERVZJQ0UJCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTYsIG1lX2xvY2tfZGV2aWNlX3QpCisjZGVmaW5lIE1FX0xPQ0tfU1VCREVWSUNFCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTcsIG1lX2xvY2tfc3ViZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfREVTQ1JJUFRJT05fREVWSUNFCQlfSU9SIChNRU1BSU5fTUFHSUMsIDE4LCBtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2VfdCkKKworI2RlZmluZSBNRV9RVUVSWV9JTkZPX0RFVklDRQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMTksIG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfTkFNRV9ERVZJQ0UJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIwLCBtZV9xdWVyeV9uYW1lX2RldmljZV90KQorI2RlZmluZSBNRV9RVUVSWV9OQU1FX0RFVklDRV9EUklWRVIJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjEsIG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90KQorCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9ERVZJQ0VTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyMiwgbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCkKKyNkZWZpbmUgTUVfUVVFUllfTlVNQkVSX1NVQkRFVklDRVMJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjMsIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9DSEFOTkVMUwkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNCwgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9SQU5HRVMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI1LCBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfUkFOR0VfQllfTUlOX01BWAkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNiwgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90KQorI2RlZmluZSBNRV9RVUVSWV9SQU5HRV9JTkZPCQkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjcsIG1lX3F1ZXJ5X3JhbmdlX2luZm9fdCkKKworI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQllfVFlQRQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyOCwgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdCkKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX1RZUEUJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI5LCBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZV90KQorI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQUwkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjksIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3QpCisjZGVmaW5lIE1FX1FVRVJZX1NVQkRFVklDRV9DQVBTX0FSR1MJX0lPUiAoTUVNQUlOX01BR0lDLCAzMCwgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190KQorCisjZGVmaW5lIE1FX1FVRVJZX1RJTUVSCQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDMxLCBtZV9xdWVyeV90aW1lcl90KQorCisjZGVmaW5lIE1FX1FVRVJZX1ZFUlNJT05fREVWSUNFX0RSSVZFUglfSU9SIChNRU1BSU5fTUFHSUMsIDMyLCBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdCkKKyNkZWZpbmUgTUVfUVVFUllfVkVSU0lPTl9NQUlOX0RSSVZFUglfSU9SIChNRU1BSU5fTUFHSUMsIDMzLCBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QpCisKKyNkZWZpbmUgTUVfQ09ORklHX0xPQUQJCQkJCV9JT1dSKE1FTUFJTl9NQUdJQywgMzQsIG1lX2NvbmZpZ19sb2FkX3QpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWQxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmMKQEAgLTAsMCArMSwyMDIyIEBACisvKioKKyAqIEBmaWxlIG1lbWFpbi5jCisgKgorICogQGJyaWVmIE1haW4gTWVpbGhhdXMgZGV2aWNlIGRyaXZlci4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisvLyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lbWFpbi5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzCisqLworCisjaWZkZWYgQk9TQ0gKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVfYm9zY2hfZncgPSAwOworCisjIGlmZGVmIG1vZHVsZV9wYXJhbQorbW9kdWxlX3BhcmFtKG1lX2Jvc2NoX2Z3LCBpbnQsIFNfSVJVR08pOworIyBlbHNlCitNT0RVTEVfUEFSTShtZV9ib3NjaF9mdywgImkiKTsKKyMgZW5kaWYKKworTU9EVUxFX1BBUk1fREVTQyhtZV9ib3NjaF9mdywKKwkJICJGbGFncyB3aGljaCBzaWduYWxzIHRoZSBNRS00NjAwIGRyaXZlciB0byBsb2FkIHRoZSBib3NjaCBmaXJtd2FyZSAoZGVmYXVsdCA9IDApLiIpOworI2VuZGlmIC8vQk9TQ0gKKworc3RhdGljIHVuc2lnbmVkIGludCBtYWpvciA9IDA7CisjaWZkZWYgbW9kdWxlX3BhcmFtCittb2R1bGVfcGFyYW0obWFqb3IsIGludCwgU19JUlVHTyk7CisjZWxzZQorTU9EVUxFX1BBUk0obWFqb3IsICJpIik7CisjZW5kaWYKKworLyogR2xvYmFsIERyaXZlciBMb2NrCisqLworCitzdGF0aWMgc3RydWN0IGZpbGUgKm1lX2ZpbGVwID0gTlVMTDsKK3N0YXRpYyBpbnQgbWVfY291bnQgPSAwOworc3RhdGljIHNwaW5sb2NrX3QgbWVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKG1lX3J3c2VtKTsKKworLyogQm9hcmQgaW5zdGFuY2VzIGFyZSBrZXB0IGluIGEgZ2xvYmFsIGxpc3QgKi8KK0xJU1RfSEVBRChtZV9kZXZpY2VfbGlzdCk7CisKKy8qIFByb3RvdHlwZXMKKyovCisKK3N0YXRpYyBpbnQgbWVfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBtZV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworc3RhdGljIGludCBpbnNlcnRfdG9fZGV2aWNlX2xpc3QobWVfZGV2aWNlX3QgKiBuX2RldmljZSk7CitzdGF0aWMgaW50IHJlcGxhY2Vfd2l0aF9kdW1teShpbnQgdmVuZG9yX2lkLCBpbnQgZGV2aWNlX2lkLCBpbnQgc2VyaWFsX25vKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2RldmljZV9saXN0KHZvaWQpOworc3RhdGljIGludCBtZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIGludCBtZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbWVfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisvL3N0YXRpYyBpbnQgbWVfcHJvYmVfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CisvL3N0YXRpYyB2b2lkIG1lX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworCisvKiBDaGFyYWN0ZXIgZGV2aWNlIHN0cnVjdHVyZQorKi8KKworc3RhdGljIHN0cnVjdCBjZGV2ICpjZGV2cDsKKworLyogRmlsZSBvcGVyYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBtb2R1bGUKKyovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1lX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSBtZV9pb2N0bCwKKwkub3BlbiA9IG1lX29wZW4sCisJLnJlbGVhc2UgPSBtZV9yZWxlYXNlLAorfTsKKworc3RydWN0IHBjaV9kcml2ZXIgbWVfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IE1FTUFJTl9OQU1FLAorCS5pZF90YWJsZSA9IG1lX3BjaV90YWJsZSwKKwkucHJvYmUgPSBtZV9wcm9iZV9wY2ksCisJLnJlbW92ZSA9IG1lX3JlbW92ZV9wY2kKK307CisKKy8qIC8vbWVfdXNiX2RyaXZlcgorc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1lX3VzYl9kcml2ZXIgPQoreworCS5uYW1lID0gTUVNQUlOX05BTUUsCisJLmlkX3RhYmxlID0gbWVfdXNiX3RhYmxlLAorCS5wcm9iZSA9IG1lX3Byb2JlX3VzYiwKKwkuZGlzY29ubmVjdCA9IG1lX2Rpc2Nvbm5lY3RfdXNiCit9OworKi8KKworI2lmZGVmIE1FX0xPQ0tfTVVMVElQTEVYX1RFTVBMQVRFCitNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURSgibWVfbG9ja19kZXZpY2UiLAorCQkJICAgbWVfbG9ja19kZXZpY2VfdCwKKwkJCSAgIG1lX2xvY2tfZGV2aWNlLAorCQkJICAgbWVfZGV2aWNlX2xvY2tfZGV2aWNlLAorCQkJICAgKGRldmljZSwgZmlsZXAsIGthcmcubG9jaywga2FyZy5mbGFncykpCisKKyAgICBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURSgibWVfbG9ja19zdWJkZXZpY2UiLAorCQkJICAgbWVfbG9ja19zdWJkZXZpY2VfdCwKKwkJCSAgIG1lX2xvY2tfc3ViZGV2aWNlLAorCQkJICAgbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlLAorCQkJICAgKGRldmljZSwgZmlsZXAsIGthcmcuc3ViZGV2aWNlLCBrYXJnLmxvY2ssCisJCQlrYXJnLmZsYWdzKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFCitNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV9zdGFydCIsCisJCQkgbWVfaW9faXJxX3N0YXJ0X3QsCisJCQkgbWVfaW9faXJxX3N0YXJ0LAorCQkJIG1lX2RldmljZV9pb19pcnFfc3RhcnQsCisJCQkgKGRldmljZSwKKwkJCSAgZmlsZXAsCisJCQkgIGthcmcuc3ViZGV2aWNlLAorCQkJICBrYXJnLmNoYW5uZWwsCisJCQkgIGthcmcuaXJxX3NvdXJjZSwKKwkJCSAga2FyZy5pcnFfZWRnZSwga2FyZy5pcnFfYXJnLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9faXJxX3dhaXQiLAorCQkJIG1lX2lvX2lycV93YWl0X3QsCisJCQkgbWVfaW9faXJxX3dhaXQsCisJCQkgbWVfZGV2aWNlX2lvX2lycV93YWl0LAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5jaGFubmVsLAorCQkgICAgICAma2FyZy5pcnFfY291bnQsICZrYXJnLnZhbHVlLCBrYXJnLnRpbWVfb3V0LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9faXJxX3N0b3AiLAorCQkJIG1lX2lvX2lycV9zdG9wX3QsCisJCQkgbWVfaW9faXJxX3N0b3AsCisJCQkgbWVfZGV2aWNlX2lvX2lycV9zdG9wLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5jaGFubmVsLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fcmVzZXRfZGV2aWNlIiwKKwkJCSBtZV9pb19yZXNldF9kZXZpY2VfdCwKKwkJCSBtZV9pb19yZXNldF9kZXZpY2UsCisJCQkgbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSwgKGRldmljZSwgZmlsZXAsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19yZXNldF9zdWJkZXZpY2UiLAorCQkJIG1lX2lvX3Jlc2V0X3N1YmRldmljZV90LAorCQkJIG1lX2lvX3Jlc2V0X3N1YmRldmljZSwKKwkJCSBtZV9kZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlLAorCQkJIChkZXZpY2UsIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3NpbmdsZV9jb25maWciLAorCQkJIG1lX2lvX3NpbmdsZV9jb25maWdfdCwKKwkJCSBtZV9pb19zaW5nbGVfY29uZmlnLAorCQkJIG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5jaGFubmVsLAorCQkgICAgICBrYXJnLnNpbmdsZV9jb25maWcsCisJCSAgICAgIGthcmcucmVmLAorCQkgICAgICBrYXJnLnRyaWdfY2hhbiwKKwkJICAgICAga2FyZy50cmlnX3R5cGUsIGthcmcudHJpZ19lZGdlLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX25ld192YWx1ZXMiLAorCQkJIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QsCisJCQkgbWVfaW9fc3RyZWFtX25ld192YWx1ZXMsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwga2FyZy50aW1lX291dCwgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zdHJlYW1fcmVhZCIsCisJCQkgbWVfaW9fc3RyZWFtX3JlYWRfdCwKKwkJCSBtZV9pb19zdHJlYW1fcmVhZCwKKwkJCSBtZV9kZXZpY2VfaW9fc3RyZWFtX3JlYWQsCisJCQkgKGRldmljZSwKKwkJICAgICAgZmlsZXAsCisJCSAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkgICAgICBrYXJnLnJlYWRfbW9kZSwga2FyZy52YWx1ZXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3N0YXR1cyIsCisJCQkgbWVfaW9fc3RyZWFtX3N0YXR1c190LAorCQkJIG1lX2lvX3N0cmVhbV9zdGF0dXMsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMsCisJCQkgKGRldmljZSwKKwkJICAgICAgZmlsZXAsCisJCSAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkgICAgICBrYXJnLndhaXQsICZrYXJnLnN0YXR1cywgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zdHJlYW1fd3JpdGUiLAorCQkJIG1lX2lvX3N0cmVhbV93cml0ZV90LAorCQkJIG1lX2lvX3N0cmVhbV93cml0ZSwKKwkJCSBtZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy53cml0ZV9tb2RlLCBrYXJnLnZhbHVlcywgJmthcmcuY291bnQsIGthcmcuZmxhZ3MpKQorI2Vsc2UKKyNlcnJvciBtYWNybyBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZkZWYgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURQorTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSgibWVfcXVlcnlfbmFtZV9kZXZpY2UiLAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX3QsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2UsCisJCQkJbWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlLCAoZGV2aWNlLCAmbXNnKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUoIm1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciIsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyX3QsCisJCQkJbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyLAorCQkJCW1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIsCisJCQkJKGRldmljZSwgJm1zZykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKCJtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UiLAorCQkJCW1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90LAorCQkJCW1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSwKKwkJCQltZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlLAorCQkJCShkZXZpY2UsICZtc2cpKQorI2Vsc2UKKyNlcnJvciBtYWNybyBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURQorTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9pbmZvX2RldmljZSIsCisJCQkgICAgbWVfcXVlcnlfaW5mb19kZXZpY2VfdCwKKwkJCSAgICBtZV9xdWVyeV9pbmZvX2RldmljZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2UsCisJCQkgICAgKGRldmljZSwKKwkJCSAgICAgJmthcmcudmVuZG9yX2lkLAorCQkJICAgICAma2FyZy5kZXZpY2VfaWQsCisJCQkgICAgICZrYXJnLnNlcmlhbF9ubywKKwkJCSAgICAgJmthcmcuYnVzX3R5cGUsCisJCQkgICAgICZrYXJnLmJ1c19ubywKKwkJCSAgICAgJmthcmcuZGV2X25vLCAma2FyZy5mdW5jX25vLCAma2FyZy5wbHVnZ2VkKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzLAorCQkJICAgIChkZXZpY2UsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9jaGFubmVscyIsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzX3QsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlIiwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZV90LAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSwKKwkJCSAgICAoZGV2aWNlLAorCQkJIGthcmcuc3RhcnRfc3ViZGV2aWNlLAorCQkJIGthcmcudHlwZSwga2FyZy5zdWJ0eXBlLCAma2FyZy5zdWJkZXZpY2UpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLnR5cGUsICZrYXJnLnN1YnR5cGUpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsICZrYXJnLmNhcHMpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzIiwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncywKKwkJCSAgICAoZGV2aWNlLCBrYXJnLnN1YmRldmljZSwga2FyZy5jYXAsIGthcmcuYXJncywKKwkJCSBrYXJnLmNvdW50KSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfbnVtYmVyX3JhbmdlcyIsCisJCQkgICAgbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsIGthcmcudW5pdCwgJmthcmcubnVtYmVyKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heCIsCisJCQkgICAgbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90LAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN1YmRldmljZSwKKwkJCSBrYXJnLnVuaXQsCisJCQkgJmthcmcubWluLCAma2FyZy5tYXgsICZrYXJnLm1heF9kYXRhLCAma2FyZy5yYW5nZSkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3JhbmdlX2luZm8iLAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2luZm9fdCwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9pbmZvLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvLAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy5yYW5nZSwKKwkJCSAma2FyZy51bml0LCAma2FyZy5taW4sICZrYXJnLm1heCwgJmthcmcubWF4X2RhdGEpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV90aW1lciIsCisJCQkgICAgbWVfcXVlcnlfdGltZXJfdCwKKwkJCSAgICBtZV9xdWVyeV90aW1lciwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfdGltZXIsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN1YmRldmljZSwKKwkJCSBrYXJnLnRpbWVyLAorCQkJICZrYXJnLmJhc2VfZnJlcXVlbmN5LAorCQkJICZrYXJnLm1pbl90aWNrcywgJmthcmcubWF4X3RpY2tzKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyIiwKKwkJCSAgICBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdCwKKwkJCSAgICBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciwKKwkJCSAgICAoZGV2aWNlLCAma2FyZy52ZXJzaW9uKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqLworCitzdGF0aWMgbWVfZGV2aWNlX3QgKmdldF9kdW1teV9pbnN0YW5jZSh1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcmlhbF9ubywKKwkJCQkgICAgICAgaW50IGJ1c190eXBlLAorCQkJCSAgICAgICBpbnQgYnVzX25vLCBpbnQgZGV2X25vLCBpbnQgZnVuY19ubykKK3sKKwlpbnQgZXJyOworCW1lX2R1bW15X2NvbnN0cnVjdG9yX3QgY29uc3RydWN0b3IgPSBOVUxMOworCW1lX2RldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmICgoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lZHVtbXlfY29uc3RydWN0b3IpKSA9PSBOVUxMKSB7CisJCWVyciA9IHJlcXVlc3RfbW9kdWxlKE1FRFVNTVlfTkFNRSk7CisKKwkJaWYgKGVycikgeworCQkJUEVSUk9SKCJFcnJvciB3aGlsZSByZXF1ZXN0IGZvciBtb2R1bGUgJXMuXG4iLAorCQkJICAgICAgIE1FRFVNTVlfTkFNRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICgoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lZHVtbXlfY29uc3RydWN0b3IpKSA9PSBOVUxMKSB7CisJCQlQRVJST1IoIkNhbid0IGdldCAlcyBkcml2ZXIgbW9kdWxlIGNvbnN0cnVjdG9yLlxuIiwKKwkJCSAgICAgICBNRURVTU1ZX05BTUUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlID0gKCpjb25zdHJ1Y3RvcikgKHZlbmRvcl9pZCwKKwkJCQkJZGV2aWNlX2lkLAorCQkJCQlzZXJpYWxfbm8sCisJCQkJCWJ1c190eXBlLAorCQkJCQlidXNfbm8sIGRldl9ubywgZnVuY19ubykpID09IE5VTEwpCisJCXN5bWJvbF9wdXQobWVkdW1teV9jb25zdHJ1Y3Rvcik7CisKKwlyZXR1cm4gaW5zdGFuY2U7Cit9CisKK3N0YXRpYyBpbnQgbWVfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyOworCW1lX3BjaV9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yID0gTlVMTDsKKyNpZmRlZiBCT1NDSAorCW1lX2Jvc2NoX2NvbnN0cnVjdG9yX3QgY29uc3RydWN0b3JfYm9zY2ggPSBOVUxMOworI2VuZGlmCisJbWVfZGV2aWNlX3QgKm5fZGV2aWNlID0gTlVMTDsKKwl1aW50MzJfdCBkZXZpY2U7CisKKwljaGFyIGNvbnN0cnVjdG9yX25hbWVbMjRdID0gIm1lMDAwMF9wY2lfY29uc3RydWN0b3IiOworCWNoYXIgbW9kdWxlX25hbWVbN10gPSAibWUwMDAwIjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlkZXZpY2UgPSBkZXYtPmRldmljZTsKKwlpZiAoKGRldmljZSAmIDB4RjAwMCkgPT0gMHg2MDAwKSB7CS8vIEV4Y2VwdGlvbnM6IG1lNjF4eCwgbWU2Mnh4LCBtZTYzeHggYXJlIGhhbmRsZWQgYnkgb25lIGRyaXZlci4KKwkJZGV2aWNlICY9IDB4RjBGRjsKKwl9CisKKwljb25zdHJ1Y3Rvcl9uYW1lWzJdICs9IChjaGFyKSgoZGV2aWNlID4+IDEyKSAmIDB4MDAwRik7CisJY29uc3RydWN0b3JfbmFtZVszXSArPSAoY2hhcikoKGRldmljZSA+PiA4KSAmIDB4MDAwRik7CisJUERFQlVHKCJjb25zdHJ1Y3Rvcl9uYW1lOiAlc1xuIiwgY29uc3RydWN0b3JfbmFtZSk7CisJbW9kdWxlX25hbWVbMl0gKz0gKGNoYXIpKChkZXZpY2UgPj4gMTIpICYgMHgwMDBGKTsKKwltb2R1bGVfbmFtZVszXSArPSAoY2hhcikoKGRldmljZSA+PiA4KSAmIDB4MDAwRik7CisJUERFQlVHKCJtb2R1bGVfbmFtZTogJXNcbiIsIG1vZHVsZV9uYW1lKTsKKworCWlmICgoY29uc3RydWN0b3IgPQorCSAgICAgKG1lX3BjaV9jb25zdHJ1Y3Rvcl90KSBzeW1ib2xfZ2V0KGNvbnN0cnVjdG9yX25hbWUpKSA9PSBOVUxMKSB7CisJCWlmIChyZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFtZSkpIHsKKwkJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVxdWVzdCBmb3IgbW9kdWxlICVzLlxuIiwKKwkJCSAgICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWlmICgoY29uc3RydWN0b3IgPQorCQkgICAgIChtZV9wY2lfY29uc3RydWN0b3JfdCkgc3ltYm9sX2dldChjb25zdHJ1Y3Rvcl9uYW1lKSkgPT0KKwkJICAgIE5VTEwpIHsKKwkJCVBFUlJPUigiQ2FuJ3QgZ2V0ICVzIGRyaXZlciBtb2R1bGUgY29uc3RydWN0b3IuXG4iLAorCQkJICAgICAgIG1vZHVsZV9uYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorI2lmZGVmIEJPU0NICisJaWYgKChkZXZpY2UgJiAweEYwMDApID09IDB4NDAwMCkgewkvLyBCb3NjaCBidWlsZCBoYXMgZGlmZmVybnQgY29uc3RydWN0b3IgZm9yIG1lNDYwMC4KKwkJaWYgKChuX2RldmljZSA9CisJCSAgICAgKCpjb25zdHJ1Y3Rvcl9ib3NjaCkgKGRldiwgbWVfYm9zY2hfZncpKSA9PSBOVUxMKSB7CisJCQlzeW1ib2xfcHV0KGNvbnN0cnVjdG9yX25hbWUpOworCQkJUEVSUk9SCisJCQkgICAgKCJDYW4ndCBnZXQgZGV2aWNlIGluc3RhbmNlIG9mICVzIGRyaXZlciBtb2R1bGUuXG4iLAorCQkJICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisjZW5kaWYKKwkJaWYgKChuX2RldmljZSA9ICgqY29uc3RydWN0b3IpIChkZXYpKSA9PSBOVUxMKSB7CisJCQlzeW1ib2xfcHV0KGNvbnN0cnVjdG9yX25hbWUpOworCQkJUEVSUk9SCisJCQkgICAgKCJDYW4ndCBnZXQgZGV2aWNlIGluc3RhbmNlIG9mICVzIGRyaXZlciBtb2R1bGUuXG4iLAorCQkJICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorI2lmZGVmIEJPU0NICisJfQorI2VuZGlmCisKKwlpbnNlcnRfdG9fZGV2aWNlX2xpc3Qobl9kZXZpY2UpOworCWVyciA9CisJICAgIG5fZGV2aWNlLT5tZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlKG5fZGV2aWNlLCBOVUxMLAorCQkJCQkJTUVfSU9fUkVTRVRfREVWSUNFX05PX0ZMQUdTKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVzZXRpbmcgZGV2aWNlLlxuIik7CisJfSBlbHNlIHsKKwkJUERFQlVHKCJSZXNldGluZyBkZXZpY2Ugd2FzIHN1Y2Vzc2Z1bC5cbiIpOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9pbnN0YW5jZShtZV9kZXZpY2VfdCAqIGRldmljZSkKK3sKKwlpbnQgdmVuZG9yX2lkOworCWludCBkZXZpY2VfaWQ7CisJaW50IHNlcmlhbF9ubzsKKwlpbnQgYnVzX3R5cGU7CisJaW50IGJ1c19ubzsKKwlpbnQgZGV2X25vOworCWludCBmdW5jX25vOworCWludCBwbHVnZ2VkOworCisJdWludDMyX3QgZGV2X2lkOworCisJY2hhciBjb25zdHJ1Y3Rvcl9uYW1lWzI0XSA9ICJtZTAwMDBfcGNpX2NvbnN0cnVjdG9yIjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKGRldmljZSwKKwkJCQkJICAgICZ2ZW5kb3JfaWQsCisJCQkJCSAgICAmZGV2aWNlX2lkLAorCQkJCQkgICAgJnNlcmlhbF9ubywKKwkJCQkJICAgICZidXNfdHlwZSwKKwkJCQkJICAgICZidXNfbm8sCisJCQkJCSAgICAmZGV2X25vLCAmZnVuY19ubywgJnBsdWdnZWQpOworCisJZGV2X2lkID0gZGV2aWNlX2lkOworCWRldmljZS0+bWVfZGV2aWNlX2Rlc3RydWN0b3IoZGV2aWNlKTsKKworCWlmIChwbHVnZ2VkICE9IE1FX1BMVUdHRURfSU4pIHsKKwkJUERFQlVHKCJyZWxlYXNlOiBtZWR1bW15X2NvbnN0cnVjdG9yXG4iKTsKKworCQlzeW1ib2xfcHV0KCJtZWR1bW15X2NvbnN0cnVjdG9yIik7CisJfSBlbHNlIHsKKwkJaWYgKChkZXZfaWQgJiAweEYwMDApID09IDB4NjAwMCkgewkvLyBFeGNlcHRpb25zOiBtZTYxeHgsIG1lNjJ4eCwgbWU2M3h4IGFyZSBoYW5kbGVkIGJ5IG9uZSBkcml2ZXIuCisJCQlkZXZfaWQgJj0gMHhGMEZGOworCQl9CisKKwkJY29uc3RydWN0b3JfbmFtZVsyXSArPSAoY2hhcikoKGRldl9pZCA+PiAxMikgJiAweDAwMEYpOworCQljb25zdHJ1Y3Rvcl9uYW1lWzNdICs9IChjaGFyKSgoZGV2X2lkID4+IDgpICYgMHgwMDBGKTsKKwkJUERFQlVHKCJyZWxlYXNlOiAlc1xuIiwgY29uc3RydWN0b3JfbmFtZSk7CisKKwkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3RvX2RldmljZV9saXN0KG1lX2RldmljZV90ICogbl9kZXZpY2UpCit7CisJbWVfZGV2aWNlX3QgKm9fZGV2aWNlID0gTlVMTDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgbl92ZW5kb3JfaWQ7CisJaW50IG5fZGV2aWNlX2lkOworCWludCBuX3NlcmlhbF9ubzsKKwlpbnQgbl9idXNfdHlwZTsKKwlpbnQgbl9idXNfbm87CisJaW50IG5fZGV2X25vOworCWludCBuX2Z1bmNfbm87CisJaW50IG5fcGx1Z2dlZDsKKwlpbnQgb192ZW5kb3JfaWQ7CisJaW50IG9fZGV2aWNlX2lkOworCWludCBvX3NlcmlhbF9ubzsKKwlpbnQgb19idXNfdHlwZTsKKwlpbnQgb19idXNfbm87CisJaW50IG9fZGV2X25vOworCWludCBvX2Z1bmNfbm87CisJaW50IG9fcGx1Z2dlZDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCW5fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uobl9kZXZpY2UsCisJCQkJCSAgICAgICZuX3ZlbmRvcl9pZCwKKwkJCQkJICAgICAgJm5fZGV2aWNlX2lkLAorCQkJCQkgICAgICAmbl9zZXJpYWxfbm8sCisJCQkJCSAgICAgICZuX2J1c190eXBlLAorCQkJCQkgICAgICAmbl9idXNfbm8sCisJCQkJCSAgICAgICZuX2Rldl9ubywKKwkJCQkJICAgICAgJm5fZnVuY19ubywgJm5fcGx1Z2dlZCk7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCW9fZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCSAgICAgICZvX3ZlbmRvcl9pZCwKKwkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCSAgICAgICZvX2J1c190eXBlLAorCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJICAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJaWYgKG9fcGx1Z2dlZCA9PSBNRV9QTFVHR0VEX09VVCkgeworCQkJaWYgKCgob192ZW5kb3JfaWQgPT0gbl92ZW5kb3JfaWQpICYmCisJCQkgICAgIChvX2RldmljZV9pZCA9PSBuX2RldmljZV9pZCkgJiYKKwkJCSAgICAgKG9fc2VyaWFsX25vID09IG5fc2VyaWFsX25vKSAmJgorCQkJICAgICAob19idXNfdHlwZSA9PSBuX2J1c190eXBlKSkgfHwKKwkJCSAgICAoKG9fdmVuZG9yX2lkID09IG5fdmVuZG9yX2lkKSAmJgorCQkJICAgICAob19kZXZpY2VfaWQgPT0gbl9kZXZpY2VfaWQpICYmCisJCQkgICAgIChvX2J1c190eXBlID09IG5fYnVzX3R5cGUpICYmCisJCQkgICAgIChvX2J1c19ubyA9PSBuX2J1c19ubykgJiYKKwkJCSAgICAgKG9fZGV2X25vID09IG5fZGV2X25vKSAmJgorCQkJICAgICAob19mdW5jX25vID09IG5fZnVuY19ubykpKSB7CisJCQkJbl9kZXZpY2UtPmxpc3QucHJldiA9IHBvcy0+cHJldjsKKwkJCQluX2RldmljZS0+bGlzdC5uZXh0ID0gcG9zLT5uZXh0OworCQkJCXBvcy0+cHJldi0+bmV4dCA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlwb3MtPm5leHQtPnByZXYgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcmVsZWFzZV9pbnN0YW5jZShvX2RldmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwgJm1lX2RldmljZV9saXN0KTsKKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1lX3JlbW92ZV9wY2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgdmVuZG9yX2lkID0gZGV2LT52ZW5kb3I7CisJaW50IGRldmljZV9pZCA9IGRldi0+ZGV2aWNlOworCWludCBzdWJzeXN0ZW1fdmVuZG9yID0gZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWludCBzdWJzeXN0ZW1fZGV2aWNlID0gZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCWludCBzZXJpYWxfbm8gPSAoc3Vic3lzdGVtX2RldmljZSA8PCAxNikgfCBzdWJzeXN0ZW1fdmVuZG9yOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJUElORk8oIlZlbmRvciBpZCA9IDB4JTA4WFxuIiwgdmVuZG9yX2lkKTsKKwlQSU5GTygiRGV2aWNlIGlkID0gMHglMDhYXG4iLCBkZXZpY2VfaWQpOworCVBJTkZPKCJTZXJpYWwgTnVtYmVyID0gMHglMDhYXG4iLCBzZXJpYWxfbm8pOworCisJcmVwbGFjZV93aXRoX2R1bW15KHZlbmRvcl9pZCwgZGV2aWNlX2lkLCBzZXJpYWxfbm8pOworfQorCitzdGF0aWMgaW50IHJlcGxhY2Vfd2l0aF9kdW1teShpbnQgdmVuZG9yX2lkLCBpbnQgZGV2aWNlX2lkLCBpbnQgc2VyaWFsX25vKQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisJbWVfZGV2aWNlX3QgKm9fZGV2aWNlID0gTlVMTDsKKwlpbnQgb192ZW5kb3JfaWQ7CisJaW50IG9fZGV2aWNlX2lkOworCWludCBvX3NlcmlhbF9ubzsKKwlpbnQgb19idXNfdHlwZTsKKwlpbnQgb19idXNfbm87CisJaW50IG9fZGV2X25vOworCWludCBvX2Z1bmNfbm87CisJaW50IG9fcGx1Z2dlZDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJb19kZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlvX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKG9fZGV2aWNlLAorCQkJCQkJICAgICAgJm9fdmVuZG9yX2lkLAorCQkJCQkJICAgICAgJm9fZGV2aWNlX2lkLAorCQkJCQkJICAgICAgJm9fc2VyaWFsX25vLAorCQkJCQkJICAgICAgJm9fYnVzX3R5cGUsCisJCQkJCQkgICAgICAmb19idXNfbm8sCisJCQkJCQkgICAgICAmb19kZXZfbm8sCisJCQkJCQkgICAgICAmb19mdW5jX25vLCAmb19wbHVnZ2VkKTsKKworCQlpZiAob19wbHVnZ2VkID09IE1FX1BMVUdHRURfSU4pIHsKKwkJCWlmICgoKG9fdmVuZG9yX2lkID09IHZlbmRvcl9pZCkgJiYKKwkJCSAgICAgKG9fZGV2aWNlX2lkID09IGRldmljZV9pZCkgJiYKKwkJCSAgICAgKG9fc2VyaWFsX25vID09IHNlcmlhbF9ubykpKSB7CisJCQkJbl9kZXZpY2UgPSBnZXRfZHVtbXlfaW5zdGFuY2Uob192ZW5kb3JfaWQsCisJCQkJCQkJICAgICAgb19kZXZpY2VfaWQsCisJCQkJCQkJICAgICAgb19zZXJpYWxfbm8sCisJCQkJCQkJICAgICAgb19idXNfdHlwZSwKKwkJCQkJCQkgICAgICBvX2J1c19ubywKKwkJCQkJCQkgICAgICBvX2Rldl9ubywKKwkJCQkJCQkgICAgICBvX2Z1bmNfbm8pOworCisJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQlQRVJST1IoIkNhbm5vdCBnZXQgZHVtbXkgaW5zdGFuY2UuXG4iKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCisJCQkJbl9kZXZpY2UtPmxpc3QucHJldiA9IHBvcy0+cHJldjsKKworCQkJCW5fZGV2aWNlLT5saXN0Lm5leHQgPSBwb3MtPm5leHQ7CisJCQkJcG9zLT5wcmV2LT5uZXh0ID0gJm5fZGV2aWNlLT5saXN0OworCQkJCXBvcy0+bmV4dC0+cHJldiA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlyZWxlYXNlX2luc3RhbmNlKG9fZGV2aWNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfZGV2aWNlX2xpc3Qodm9pZCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwkvLyBDbGVhciB0aGUgZGV2aWNlIGluZm8gbGlzdCAuCisJZG93bl93cml0ZSgmbWVfcndzZW0pOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtZV9kZXZpY2VfbGlzdCkpIHsKKwkJZW50cnkgPSBtZV9kZXZpY2VfbGlzdC5uZXh0OworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGVudHJ5LCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCWxpc3RfZGVsKGVudHJ5KTsKKwkJcmVsZWFzZV9pbnN0YW5jZShkZXZpY2UpOworCX0KKworCXVwX3dyaXRlKCZtZV9yd3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja19kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX2RldmljZV90ICpkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCWlmIChtZV9jb3VudCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJEcml2ZXIgU3lzdGVtIGlzIGN1cnJlbnRseSB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJEcml2ZXIgU3lzdGVtIGlzIGFscmVhZHkgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZtZV9kZXZpY2VfbGlzdCwgbGlzdCkgeworCQkJCWVyciA9CisJCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2xvY2tfZGV2aWNlKGRldmljZSwgZmlsZXAsCisJCQkJCQkJCSAgTUVfTE9DS19DSEVDSywKKwkJCQkJCQkJICBmbGFncyk7CisKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFlcnIpCisJCQkJbWVfZmlsZXAgPSBmaWxlcDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX1JFTEVBU0U6CisJCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmbWVfZGV2aWNlX2xpc3QsIGxpc3QpIHsKKwkJCQlkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZShkZXZpY2UsIGZpbGVwLAorCQkJCQkJCSAgICAgIE1FX0xPQ0tfUkVMRUFTRSwKKwkJCQkJCQkgICAgICBmbGFncyk7CisJCQl9CisKKwkJCW1lX2ZpbGVwID0gTlVMTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGxvY2sgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9MT0NLOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCXVwX3JlYWQoJm1lX3J3c2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfbG9ja19kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9sb2NrX2RyaXZlcl90ICogYXJnKQoreworCWludCBlcnIgPSAwOworCisJbWVfbG9ja19kcml2ZXJfdCBsb2NrOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmxvY2ssIGFyZywgc2l6ZW9mKG1lX2xvY2tfZHJpdmVyX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbG9jay5lcnJubyA9IGxvY2tfZHJpdmVyKGZpbGVwLCBsb2NrLmxvY2ssIGxvY2suZmxhZ3MpOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmxvY2ssIHNpemVvZihtZV9sb2NrX2RyaXZlcl90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCS8vIE5vdGhpbmcgdG8gZG8gaGVyZS4KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbG9ja19kcml2ZXIoZmlsZXAsIE1FX0xPQ0tfUkVMRUFTRSwgTUVfTE9DS19EUklWRVJfTk9fRkxBR1MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcihzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCW1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCW1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCBrYXJnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJa2FyZy52ZXJzaW9uID0gTUVfVkVSU0lPTl9EUklWRVI7CisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgcXVlcnkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX2NvbmZpZ19sb2FkX2RldmljZShzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGthcmcsIGludCBkZXZpY2Vfbm8pCit7CisKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgayA9IDA7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCW1lX2RldmljZV90ICpkZXZpY2UgPSBOVUxMOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlpZiAoayA9PSBkZXZpY2Vfbm8pIHsKKwkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQlicmVhazsKKwkJfQorCisJCWsrKzsKKwl9CisKKwlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQlQRVJST1IoIlJlc291cmNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSB7CisJCQltZV9jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCQllcnIgPQorCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2NvbmZpZ19sb2FkKGRldmljZSwgZmlsZXAsIGthcmcpOworCisJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJbWVfY291bnQtLTsKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfY29uZmlnX2xvYWQoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9jb25maWdfbG9hZF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGk7CisJbWVfY29uZmlnX2xvYWRfdCBjZmdfc2V0dXA7CisJbWVfY29uZmlnX2xvYWRfdCBrYXJnX2NmZ19zZXR1cDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ld19saXN0OworCW1lX2RldmljZV90ICpvX2RldmljZTsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2U7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDb3B5IGFyZ3VtZW50IHRvIGtlcm5lbCBzcGFjZS4KKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZ19jZmdfc2V0dXAsIGFyZywgc2l6ZW9mKG1lX2NvbmZpZ19sb2FkX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8vIEFsbG9jYXRlIGtlcm5lbCBidWZmZXIgZm9yIGRldmljZSBsaXN0LgorCWNmZ19zZXR1cC5kZXZpY2VfbGlzdCA9CisJICAgIGttYWxsb2Moc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKiBrYXJnX2NmZ19zZXR1cC5jb3VudCwKKwkJICAgIEdGUF9LRVJORUwpOworCisJaWYgKCFjZmdfc2V0dXAuZGV2aWNlX2xpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyICVsaSBmb3IgZGV2aWNlIGxpc3QuXG4iLAorCQkgICAgICAgc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKiBrYXJnX2NmZ19zZXR1cC5jb3VudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyBDb3B5IGRldmljZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS4KKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihjZmdfc2V0dXAuZGV2aWNlX2xpc3QsIGthcmdfY2ZnX3NldHVwLmRldmljZV9saXN0LAorCQkJICAgc2l6ZW9mKG1lX2NmZ19kZXZpY2VfZW50cnlfdCkgKgorCQkJICAga2FyZ19jZmdfc2V0dXAuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgZGV2aWNlIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWNmZ19zZXR1cC5jb3VudCA9IGthcmdfY2ZnX3NldHVwLmNvdW50OworCisJSU5JVF9MSVNUX0hFQUQoJm5ld19saXN0KTsKKworCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlrYXJnX2NmZ19zZXR1cC5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmdfY2ZnX3NldHVwLmNvdW50OyBpKyspIHsKKwkJCVBERUJVRygibWVfY29uZmlnX2xvYWQoKSBkZXZpY2U9JWQuXG4iLCBpKTsKKwkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0udGNwaXAuYWNjZXNzX3R5cGUgPT0KKwkJCSAgICBNRV9BQ0NFU1NfVFlQRV9MT0NBTCkgeworCQkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQkJb19kZXZpY2UgPQorCQkJCQkgICAgbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCQkJb19kZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlCisJCQkJCSAgICAob19kZXZpY2UsICZvX3ZlbmRvcl9pZCwKKwkJCQkJICAgICAmb19kZXZpY2VfaWQsICZvX3NlcmlhbF9ubywKKwkJCQkJICAgICAmb19idXNfdHlwZSwgJm9fYnVzX25vLCAmb19kZXZfbm8sCisJCQkJCSAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJCQkJaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkgICAgaHdfbG9jYXRpb24uYnVzX3R5cGUgPT0KKwkJCQkJICAgIE1FX0JVU19UWVBFX1BDSSkgeworCQkJCQkJaWYgKCgob192ZW5kb3JfaWQgPT0KKwkJCQkJCSAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgIGluZm8udmVuZG9yX2lkKQorCQkJCQkJICAgICAmJiAob19kZXZpY2VfaWQgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBkZXZpY2VfaWQpCisJCQkJCQkgICAgICYmIChvX3NlcmlhbF9ubyA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIHNlcmlhbF9ubykKKwkJCQkJCSAgICAgJiYgKG9fYnVzX3R5cGUgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5idXNfdHlwZSkpCisJCQkJCQkgICAgfHwKKwkJCQkJCSAgICAoKG9fdmVuZG9yX2lkID09CisJCQkJCQkgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgICBpbmZvLnZlbmRvcl9pZCkKKwkJCQkJCSAgICAgJiYgKG9fZGV2aWNlX2lkID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgZGV2aWNlX2lkKQorCQkJCQkJICAgICAmJiAob19idXNfdHlwZSA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGh3X2xvY2F0aW9uLmJ1c190eXBlKQorCQkJCQkJICAgICAmJiAob19idXNfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuYnVzX25vKQorCQkJCQkJICAgICAmJiAob19kZXZfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuCisJCQkJCQkJIGRldmljZV9ubykKKwkJCQkJCSAgICAgJiYgKG9fZnVuY19ubyA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCQkgZnVuY3Rpb25fbm8pKSkgeworCQkJCQkJCWxpc3RfbW92ZV90YWlsKHBvcywKKwkJCQkJCQkJICAgICAgICZuZXdfbGlzdCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKy8qCisJCQkJCWVsc2UgaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlID09IE1FX0JVU19UWVBFX1VTQikKKwkJCQkJeworCQkJCQkJaWYgKCgob192ZW5kb3JfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkKSAmJgorCQkJCQkJICAgICAgICAob19kZXZpY2VfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uZGV2aWNlX2lkKSAmJgorCQkJCQkJICAgICAgICAob19zZXJpYWxfbm8gPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uc2VyaWFsX25vKSAmJgorCQkJCQkJICAgICAgICAob19idXNfdHlwZSA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSkpIHx8CisJCQkJCQkgICAgICAgICgob192ZW5kb3JfaWQgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkKSAmJgorCQkJCQkJICAgICAgICAgKG9fZGV2aWNlX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmRldmljZV9pZCkgJiYKKwkJCQkJCSAgICAgICAgIChvX2J1c190eXBlID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlKSAmJgorCQkJCQkJICAgICAgICAgKG9fYnVzX25vID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLnVzYi5yb290X2h1Yl9ubykpKQorCQkJCQkJeworCQkJCQkJCWxpc3RfbW92ZV90YWlsKHBvcywgJm5ld19saXN0KTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorKi8KKwkJCQkJZWxzZSB7CisJCQkJCQlQRVJST1IoIldyb25nIGJ1cyB0eXBlOiAlZC5cbiIsCisJCQkJCQkgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICAgIGluZm8uaHdfbG9jYXRpb24uCisJCQkJCQkgICAgICAgYnVzX3R5cGUpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsJLy8gRGV2aWNlIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0CisJCQkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJICAgIGh3X2xvY2F0aW9uLmJ1c190eXBlID09CisJCQkJCSAgICBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJCQkJCW5fZGV2aWNlID0KKwkJCQkJCSAgICBnZXRfZHVtbXlfaW5zdGFuY2UKKwkJCQkJCSAgICAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLnZlbmRvcl9pZCwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmRldmljZV9pZCwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLnNlcmlhbF9ubywKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlLAorCQkJCQkJICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgIGluZm8uaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJICAgICBidXNfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5wY2kuCisJCQkJCQkgICAgIGRldmljZV9ubywKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCSAgICAgZnVuY3Rpb25fbm8pOworCisJCQkJCQlpZiAoIW5fZGV2aWNlKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiQ2FuJ3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCQkJa2ZyZWUoY2ZnX3NldHVwLgorCQkJCQkJCSAgICAgIGRldmljZV9saXN0KTsKKwkJCQkJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJCQkJCW1lX2NvdW50LS07CisJCQkJCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQkJCQkJCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCQl9CisKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJm5fZGV2aWNlLT5saXN0LAorCQkJCQkJCSAgICAgICZuZXdfbGlzdCk7CisJCQkJCX0KKy8qCisJCQkJCWVsc2UgaWYgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLmJ1c190eXBlID09IE1FX0JVU19UWVBFX1VTQikKKwkJCQkJeworCQkJCQkJbl9kZXZpY2UgPSBnZXRfZHVtbXlfaW5zdGFuY2UoCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby52ZW5kb3JfaWQsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5kZXZpY2VfaWQsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5zZXJpYWxfbm8sCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSwKKwkJCQkJCSAgICAgICAgICAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmh3X2xvY2F0aW9uLnVzYi5yb290X2h1Yl9ubywKKwkJCQkJCSAgICAgICAgICAgICAgIDAsCisJCQkJCQkgICAgICAgICAgICAgICAwKTsKKworCQkJCQkJaWYgKCFuX2RldmljZSkKKwkJCQkJCXsKKwkJCQkJCQlQRVJST1IoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQkJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCQkJCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQltZV9jb3VudC0tOworCQkJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwgJm5ld19saXN0KTsKKwkJCQkJfQorKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKDAsCisJCQkJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwkJCQlpZiAoIW5fZGV2aWNlKSB7CisJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCQkJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCQkJCW1lX2NvdW50LS07CisJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZuZXdfbGlzdCk7CisJCQl9CisJCX0KKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1lX2RldmljZV9saXN0KSkgeworCQkJb19kZXZpY2UgPQorCQkJICAgIGxpc3RfZW50cnkobWVfZGV2aWNlX2xpc3QubmV4dCwgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCQkgICAgICAmb192ZW5kb3JfaWQsCisJCQkJCQkJICAgICAgJm9fZGV2aWNlX2lkLAorCQkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCQkgICAgICAmb19idXNfdHlwZSwKKwkJCQkJCQkgICAgICAmb19idXNfbm8sCisJCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJCSAgICAgICZvX2Z1bmNfbm8sCisJCQkJCQkJICAgICAgJm9fcGx1Z2dlZCk7CisKKwkJCWlmIChvX3BsdWdnZWQgPT0gTUVfUExVR0dFRF9JTikgeworCQkJCWxpc3RfbW92ZV90YWlsKG1lX2RldmljZV9saXN0Lm5leHQsICZuZXdfbGlzdCk7CisJCQl9IGVsc2UgeworCQkJCWxpc3RfZGVsKG1lX2RldmljZV9saXN0Lm5leHQpOworCQkJCXJlbGVhc2VfaW5zdGFuY2Uob19kZXZpY2UpOworCQkJfQorCQl9CisKKwkJLy8gTW92ZSB0ZW1wb3JhcnkgbmV3IGxpc3QgdG8gZ2xvYmFsIGRyaXZlciBsaXN0LgorCQlsaXN0X3NwbGljZSgmbmV3X2xpc3QsICZtZV9kZXZpY2VfbGlzdCk7CisKKwkJa2FyZ19jZmdfc2V0dXAuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjZmdfc2V0dXAuY291bnQ7IGkrKykgeworCisJCWthcmdfY2ZnX3NldHVwLmVycm5vID0KKwkJICAgIG1lX2NvbmZpZ19sb2FkX2RldmljZShmaWxlcCwgJmNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXSwgaSk7CisJCWlmIChrYXJnX2NmZ19zZXR1cC5lcnJubykgeworCQkJUEVSUk9SKCJtZV9jb25maWdfbG9hZF9kZXZpY2UoJWQpPSVkXG4iLCBpLAorCQkJICAgICAgIGthcmdfY2ZnX3NldHVwLmVycm5vKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCW1lX2NvdW50LS07CisJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZ19jZmdfc2V0dXAsIHNpemVvZihtZV9jb25maWdfbG9hZF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBjb25maWcgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGNmZ19zZXR1cC5kZXZpY2VfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc3RyZWFtX3N0YXJ0X3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9zdGFydF90IGthcmc7CisJbWVJT1N0cmVhbVN0YXJ0X3QgKmxpc3Q7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZywgYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0YXJ0X3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbVN0YXJ0X3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzdGFydCBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuc3RhcnRfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtU3RhcnRfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0YXJ0IGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwkJCWsgPSAwOworCQkJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQkJCWlmIChrID09IGxpc3RbaV0uaURldmljZSkgeworCQkJCQlkZXZpY2UgPQorCQkJCQkgICAgbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaysrOworCQkJfQorCisJCQlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdFtpXS5pRXJybm8gPQorCQkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQoZGV2aWNlLAorCQkJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN0YXJ0TW9kZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVRpbWVPdXQsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlGbGFncyk7CisKKwkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RhcnRfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9CisJICAgIGNvcHlfdG9fdXNlcihrYXJnLnN0YXJ0X2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TdHJlYW1TdGFydF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RhcnQgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc2luZ2xlKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc2luZ2xlX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3NpbmdsZV90IGthcmc7CisJbWVJT1NpbmdsZV90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3NpbmdsZV90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIHNpbmdsZSBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuc2luZ2xlX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1NpbmdsZV90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc2luZ2xlIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwga2FyZy5jb3VudDsgaSsrKSB7CisJCQlrID0gMDsKKworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlmIChsaXN0W2ldLmlEaXIgPT0gTUVfRElSX09VVFBVVCkgeworCQkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJCSAgICBkZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZShkZXZpY2UsCisJCQkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpU3ViZGV2aWNlLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpQ2hhbm5lbCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVZhbHVlLAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpVGltZU91dCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaUZsYWdzKTsKKworCQkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJCWthcmcuZXJybm8gPSBsaXN0W2ldLmlFcnJubzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChsaXN0W2ldLmlEaXIgPT0gTUVfRElSX0lOUFVUKSB7CisJCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkJICAgIGRldmljZS0+CisJCQkJCSAgICBtZV9kZXZpY2VfaW9fc2luZ2xlX3JlYWQoZGV2aWNlLAorCQkJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlDaGFubmVsLAorCQkJCQkJCQkgICAgICZsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlWYWx1ZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlUaW1lT3V0LAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaUZsYWdzKTsKKworCQkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJCWthcmcuZXJybm8gPSBsaXN0W2ldLmlFcnJubzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBzaW5nbGUgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCQlsaXN0W2ldLmlFcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfRElSOworCQkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ESVI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zaW5nbGVfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZXJyID0KKwkgICAgY29weV90b191c2VyKGthcmcuc2luZ2xlX2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHNpbmdsZSBsaXN0IHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfaW9fc3RyZWFtX2NvbmZpZ190ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGsgPSAwOworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpkZXZpY2U7CisJbWVfaW9fc3RyZWFtX2NvbmZpZ190IGthcmc7CisJbWVJT1N0cmVhbUNvbmZpZ190ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9jb25maWdfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbUNvbmZpZ190KSAqIGthcmcuY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFsaXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciBmb3IgY29uZmlnIGxpc3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIobGlzdCwga2FyZy5jb25maWdfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtQ29uZmlnX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBjb25maWcgbGlzdCB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fTE9DS0VEOworCX0gZWxzZSB7CisJCW1lX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKworCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQlpZiAoayA9PSBrYXJnLmRldmljZSkgeworCQkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWsrKzsKKwkJfQorCisJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJfSBlbHNlIHsKKwkJCWthcmcuZXJybm8gPQorCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoZGV2aWNlLCBmaWxlcCwKKwkJCQkJCQkgICAgICAga2FyZy5zdWJkZXZpY2UsCisJCQkJCQkJICAgICAgIGxpc3QsIGthcmcuY291bnQsCisJCQkJCQkJICAgICAgICZrYXJnLnRyaWdnZXIsCisJCQkJCQkJICAgICAgIGthcmcuCisJCQkJCQkJICAgICAgIGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJCQkgICAgICAga2FyZy5mbGFncyk7CisJCX0KKworCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX2NvbmZpZ190KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgbWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCW1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3Qga2FyZzsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWthcmcubnVtYmVyID0gMDsKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCWthcmcubnVtYmVyKys7CisJfQorCisJdXBfcmVhZCgmbWVfcndzZW0pOworCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9zdG9wX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwlpbnQgaSwgazsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9zdG9wX3Qga2FyZzsKKwltZUlPU3RyZWFtU3RvcF90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9zdG9wX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlsaXN0ID0ga21hbGxvYyhzaXplb2YobWVJT1N0cmVhbVN0b3BfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIHN0b3AgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnN0b3BfbGlzdCwKKwkJCSAgIHNpemVvZihtZUlPU3RyZWFtU3RvcF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RvcCBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJayA9IDA7CisJCQlkb3duX3JlYWQoJm1lX3J3c2VtKTsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkgICAgZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3AoZGV2aWNlLAorCQkJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJCQkgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdG9wTW9kZSwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlGbGFncyk7CisKKwkJCQlpZiAobGlzdFtpXS5pRXJybm8pIHsKKwkJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCQltZV9jb3VudC0tOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJfQorCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RvcF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X3RvX3VzZXIoa2FyZy5zdG9wX2xpc3QsIGxpc3QsCisJCQkgc2l6ZW9mKG1lSU9TdHJlYW1TdG9wX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzdG9wIGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUobGlzdCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiAgLy9tZV9wcm9iZV91c2IKK3N0YXRpYyBpbnQgbWVfcHJvYmVfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwkvL2ludCBlcnI7CisJLy9tZV91c2JfY29uc3RydWN0b3JfdCAqY29uc3RydWN0b3IgPSBOVUxMOworCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzd2l0Y2ggKGlkLT5pZFByb2R1Y3QpCisJeworCQkJY2FzZSBVU0JfREVWSUNFX0lEX01FUEhJU1RPX1MxOgorCQkJCWlmKChjb25zdHJ1Y3RvciA9IHN5bWJvbF9nZXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpKSA9PSBOVUxMKXsKKwkJCQkJZXJyID0gcmVxdWVzdF9tb2R1bGUoTUVQSElTVE9fUzFfTkFNRSk7CisJCQkJCWlmKGVycil7CisJCQkJCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlcXVlc3QgZm9yIG1vZHVsZSAlcy5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQkJaWYoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZXBoaXN0b19zMV9jb25zdHJ1Y3RvcikpID09IE5VTEwpeworCQkJCQkJUEVSUk9SKCJDYW4ndCBnZXQgJXMgZHJpdmVyIG1vZHVsZSBjb25zdHJ1Y3Rvci5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZigobl9kZXZpY2UgPSAoKmNvbnN0cnVjdG9yKShpbnRlcmZhY2UpKSA9PSBOVUxMKXsKKwkJCQkJc3ltYm9sX3B1dChtZXBoaXN0b19zMV9jb25zdHJ1Y3Rvcik7CisJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwgTUVQSElTVE9fUzFfTkFNRSk7CisJCQkJCXJldHVybiAtRU5PREVWOworCQkJCX0KKworCQkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IoIkludmFsaWQgcHJvZHVjdCBpZC5cbiIpOworCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaW5zZXJ0X3RvX2RldmljZV9saXN0KG5fZGV2aWNlKTsKK30KKyovCisKKy8qICAvL21lX2Rpc2Nvbm5lY3RfdXNiCitzdGF0aWMgdm9pZCBtZV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlpbnQgdmVuZG9yX2lkID0gZGV2aWNlLT5kZXNjcmlwdG9yLmlkVmVuZG9yOworCWludCBkZXZpY2VfaWQgPSBkZXZpY2UtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OworCWludCBzZXJpYWxfbm87CisKKwlzc2NhbmYoJmRldmljZS0+c2VyaWFsWzJdLCAiJXgiLCAmc2VyaWFsX25vKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCVBJTkZPKCJWZW5kb3IgaWQgPSAweCUwOFhcbiIsIHZlbmRvcl9pZCk7CisJUElORk8oIkRldmljZSBpZCA9IDB4JTA4WFxuIiwgZGV2aWNlX2lkKTsKKwlQSU5GTygiU2VyaWFsIE51bWJlciA9IDB4JTA4WFxuIiwgc2VyaWFsX25vKTsKKworCXJlcGxhY2Vfd2l0aF9kdW1teSh2ZW5kb3JfaWQsIGRldmljZV9pZCwgc2VyaWFsX25vKTsKK30KKyovCisKK3N0YXRpYyBpbnQgbWVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZXAsCisJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBzZXJ2aWNlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChfSU9DX1RZUEUoc2VydmljZSkgIT0gTUVNQUlOX01BR0lDKSB7CisJCVBFUlJPUigiSW52YWxpZCBtYWdpYyBudW1iZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJUERFQlVHKCJzZXJ2aWNlIG51bWJlcjogMHgleC5cbiIsIHNlcnZpY2UpOworCisJc3dpdGNoIChzZXJ2aWNlKSB7CisJY2FzZSBNRV9JT19JUlFfRU5BQkxFOgorCQlyZXR1cm4gbWVfaW9faXJxX3N0YXJ0KGZpbGVwLCAobWVfaW9faXJxX3N0YXJ0X3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fSVJRX1dBSVQ6CisJCXJldHVybiBtZV9pb19pcnFfd2FpdChmaWxlcCwgKG1lX2lvX2lycV93YWl0X3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fSVJRX0RJU0FCTEU6CisJCXJldHVybiBtZV9pb19pcnFfc3RvcChmaWxlcCwgKG1lX2lvX2lycV9zdG9wX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fUkVTRVRfREVWSUNFOgorCQlyZXR1cm4gbWVfaW9fcmVzZXRfZGV2aWNlKGZpbGVwLCAobWVfaW9fcmVzZXRfZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fUkVTRVRfU1VCREVWSUNFOgorCQlyZXR1cm4gbWVfaW9fcmVzZXRfc3ViZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgIChtZV9pb19yZXNldF9zdWJkZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHOgorCQlyZXR1cm4gbWVfaW9fc2luZ2xlX2NvbmZpZyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3NpbmdsZV9jb25maWdfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TSU5HTEU6CisJCXJldHVybiBtZV9pb19zaW5nbGUoZmlsZXAsIChtZV9pb19zaW5nbGVfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fQ09ORklHOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX2NvbmZpZyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3N0cmVhbV9jb25maWdfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fTkVXX1ZBTFVFUzoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzKGZpbGVwLAorCQkJCQkgICAgICAgKG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzX3QgKikKKwkJCQkJICAgICAgIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9SRUFEOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3JlYWQoZmlsZXAsIChtZV9pb19zdHJlYW1fcmVhZF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVEFSVDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9zdGFydChmaWxlcCwgKG1lX2lvX3N0cmVhbV9zdGFydF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVEFUVVM6CisJCXJldHVybiBtZV9pb19zdHJlYW1fc3RhdHVzKGZpbGVwLAorCQkJCQkgICAobWVfaW9fc3RyZWFtX3N0YXR1c190ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9TVE9QOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3N0b3AoZmlsZXAsIChtZV9pb19zdHJlYW1fc3RvcF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1NUUkVBTV9XUklURToKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV93cml0ZShmaWxlcCwgKG1lX2lvX3N0cmVhbV93cml0ZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfRFJJVkVSOgorCQlyZXR1cm4gbWVfbG9ja19kcml2ZXIoZmlsZXAsIChtZV9sb2NrX2RyaXZlcl90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfREVWSUNFOgorCQlyZXR1cm4gbWVfbG9ja19kZXZpY2UoZmlsZXAsIChtZV9sb2NrX2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0xPQ0tfU1VCREVWSUNFOgorCQlyZXR1cm4gbWVfbG9ja19zdWJkZXZpY2UoZmlsZXAsIChtZV9sb2NrX3N1YmRldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX0lORk9fREVWSUNFOgorCQlyZXR1cm4gbWVfcXVlcnlfaW5mb19kZXZpY2UoZmlsZXAsCisJCQkJCSAgICAobWVfcXVlcnlfaW5mb19kZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9ERVNDUklQVElPTl9ERVZJQ0U6CisJCXJldHVybiBtZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UoZmlsZXAsCisJCQkJCQkgICAobWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3QKKwkJCQkJCSAgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OQU1FX0RFVklDRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X25hbWVfZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgKG1lX3F1ZXJ5X25hbWVfZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTkFNRV9ERVZJQ0VfRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgKG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90CisJCQkJCQkgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX0RFVklDRVM6CisJCXJldHVybiBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9xdWVyeV9udW1iZXJfZGV2aWNlc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OVU1CRVJfU1VCREVWSUNFUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKGZpbGVwLAorCQkJCQkJICAobWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXNfdAorCQkJCQkJICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX0NIQU5ORUxTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKGZpbGVwLAorCQkJCQkJKG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190ICopCisJCQkJCQlhcmcpOworCisJY2FzZSBNRV9RVUVSWV9OVU1CRVJfUkFOR0VTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX3JhbmdlcyhmaWxlcCwKKwkJCQkJICAgICAgKG1lX3F1ZXJ5X251bWJlcl9yYW5nZXNfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9SQU5HRV9CWV9NSU5fTUFYOgorCQlyZXR1cm4gbWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heChmaWxlcCwKKwkJCQkJCSAobWVfcXVlcnlfcmFuZ2VfYnlfbWluX21heF90ICopCisJCQkJCQkgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfUkFOR0VfSU5GTzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3JhbmdlX2luZm8oZmlsZXAsCisJCQkJCSAgIChtZV9xdWVyeV9yYW5nZV9pbmZvX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0JZX1RZUEU6CisJCXJldHVybiBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZShmaWxlcCwKKwkJCQkJCSAgKG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3QKKwkJCQkJCSAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9UWVBFOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0NBUFM6CisJCXJldHVybiBtZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQU19BUkdTOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhmaWxlcCwKKwkJCQkJCSAgICAobWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190CisJCQkJCQkgICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1RJTUVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdGltZXIoZmlsZXAsIChtZV9xdWVyeV90aW1lcl90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1ZFUlNJT05fTUFJTl9EUklWRVI6CisJCXJldHVybiBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgIChtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QKKwkJCQkJCSAgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfVkVSU0lPTl9ERVZJQ0VfRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyKGZpbGVwLAorCQkJCQkJICAgICAgKG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcl90CisJCQkJCQkgICAgICAgKikgYXJnKTsKKworCWNhc2UgTUVfQ09ORklHX0xPQUQ6CisJCXJldHVybiBtZV9jb25maWdfbG9hZChmaWxlcCwgKG1lX2NvbmZpZ19sb2FkX3QgKikgYXJnKTsKKwl9CisKKwlQRVJST1IoIkludmFsaWQgaW9jdGwgbnVtYmVyLlxuIik7CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorc3RhdGljIGludCBtZW1haW5faW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWRldl90IGRldiA9IE1LREVWKG1ham9yLCAwKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIFJlZ2lzdGVyIHBjaSBkcml2ZXIuIFRoaXMgd2lsbCByZXR1cm4gMCBpZiB0aGUgUENJIHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlLgorCXJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW4ndCByZWdpc3RlciBwY2kgZHJpdmVyLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl8xOworCX0KKworLyoKKwkvLyBSZWdpc3RlciB1c2IgZHJpdmVyLiBUaGlzIHdpbGwgcmV0dXJuIC1FTk9ERVYgaWYgbm8gVVNCIHN1YnN5c3RlbSBpcyBhdmFpbGFibGUuCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZtZV91c2JfZHJpdmVyKTsKKworCWlmIChyZXN1bHQpCisJeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCXsKKwkJCVBFUlJPUigiTm8gVVNCIHN1YnN5c3RlbSBhdmFpbGFibGUuXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVBFUlJPUigiQ2FuJ3QgcmVnaXN0ZXIgdXNiIGRyaXZlci5cbiIpOworCQkJZ290byBJTklUX0VSUk9SXzI7CisJCX0KKwl9CisqLworCS8vIFJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLgorCWlmIChtYWpvcikgeworCQlyZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSwgTUVNQUlOX05BTUUpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgMCwgMSwgTUVNQUlOX05BTUUpOworCQltYWpvciA9IE1BSk9SKGRldik7CisJfQorCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgbWFqb3IgZHJpdmVyIG5vLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl8zOworCX0KKworCWNkZXZwID0gY2Rldl9hbGxvYygpOworCisJaWYgKCFjZGV2cCkgeworCQlQRVJST1IoIkNhbid0IGdldCBjaGFyYWN0ZXIgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIElOSVRfRVJST1JfNDsKKwl9CisKKwljZGV2cC0+b3BzID0gJm1lX2ZpbGVfb3BlcmF0aW9uczsKKworCWNkZXZwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmVzdWx0ID0gY2Rldl9hZGQoY2RldnAsIGRldiwgMSk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJZ290byBJTklUX0VSUk9SXzU7CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIElOSVRfRVJST1JfNToKKwljZGV2X2RlbChjZGV2cCk7CisKKyAgICAgIElOSVRfRVJST1JfNDoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAxKTsKKworICAgICAgSU5JVF9FUlJPUl8zOgorLy8gICAgICB1c2JfZGVyZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisKKy8vSU5JVF9FUlJPUl8yOgorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWVfcGNpX2RyaXZlcik7CisJY2xlYXJfZGV2aWNlX2xpc3QoKTsKKworICAgICAgSU5JVF9FUlJPUl8xOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZW1haW5fZXhpdCh2b2lkKQoreworCWRldl90IGRldiA9IE1LREVWKG1ham9yLCAwKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWNkZXZfZGVsKGNkZXZwKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAxKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworLy8gICAgICB1c2JfZGVyZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisJY2xlYXJfZGV2aWNlX2xpc3QoKTsKK30KKworbW9kdWxlX2luaXQobWVtYWluX2luaXQpOworbW9kdWxlX2V4aXQobWVtYWluX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ2VudHJhbCBtb2R1bGUgZm9yIE1laWxoYXVzIERyaXZlciBTeXN0ZW0uIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgUENJL2NQQ0kgYm9hcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgQk9TQ0gKKy8vIEV4cG9ydCB0aGUgZmxhZyBmb3IgdGhlIEJPU0NIIGZpcm13YXJlLgorRVhQT1JUX1NZTUJPTChtZV9ib3NjaF9mdyk7CisjZW5kaWYgLy8gQk9TQ0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE2ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5oCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lbWFpbi5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVNQUlOX0hfCisjZGVmaW5lIF9NRU1BSU5fSF8KKworI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKy8qI2luY2x1ZGUgIm1lMTAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTE0MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxNjAwX2RldmljZS5oIiovCisjaW5jbHVkZSAibWU0NjAwX2RldmljZS5oIgorLyojaW5jbHVkZSAibWU2MDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMDYwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMDkwMF9kZXZpY2UuaCIqLworI2luY2x1ZGUgIm1lZHVtbXkuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgZGV2aWNlIHRhYmxlLgorICBUaGlzIGlzIHVzZWQgYnkgbW9kcHJvYmUgdG8gdHJhbnNsYXRlIFBDSSBJRHMgdG8gZHJpdmVycy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1lX3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0IsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEEsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUEsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlUsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTBGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDRGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTRGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTksIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MzU5LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDYzMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0IsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWVfcGNpX3RhYmxlKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgZGV2aWNlIHRhYmxlLgorICBUaGlzIGlzIHVzZWQgYnkgbW9kcHJvYmUgdG8gdHJhbnNsYXRlIFVTQiBJRHMgdG8gZHJpdmVycy4KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbWVfdXNiX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NRVBISVNUT19TMSwgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMSkgfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBtZV91c2JfdGFibGUpOworKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUZW1wbGF0ZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURShOQU1FLCBUWVBFLCBDQUxMLCBERVZfQ0FMTCwgQVJHUykJXAorc3RhdGljIGludCBDQUxMKHN0cnVjdCBmaWxlICpmaWxlcCwgVFlQRSAqYXJnKXsJXAorCWludCBlcnIgPSAwOyBcCisJaW50IGsgPSAwOyBcCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOyBcCisJbWVfZGV2aWNlX3QgKmRldmljZTsgXAorCVRZUEUga2FyZzsgXAorCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwlcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsgXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOyBcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsgXAorCX0gXAorCWVsc2V7IFwKKwkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsJXAorCQlpZigobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSl7CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQkJUEVSUk9SKCJSZXNvdXJjZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzXG4iKTsJXAorCQkJaWYoa2FyZy5sb2NrID09IE1FX0xPQ0tfU0VUKQlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsJXAorCQkJZWxzZSBpZihrYXJnLmxvY2sgPT0gTUVfTE9DS19SRUxFQVNFKQlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1NVQ0NFU1M7CVwKKwkJCWVsc2V7CVwKKwkJCQlQRVJST1IoIkludmFsaWQgbG9jayBzcGVjaWZpZWRcbiIpOwlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsJXAorCQkJfVwKKwkJfQlcCisJCWVsc2UgewlcCisJCQltZV9jb3VudCsrOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVwKKwkJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJCVwKKwkJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJCW1lX2NvdW50LS07CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQl9CVwKKwl9IFwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIGJhY2sgdG8gdXNlciBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKwlcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7IFwKK30KKworI2RlZmluZSBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsgXAorCWludCBrID0gMDsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsgXAorCW1lX2RldmljZV90ICpkZXZpY2U7IFwKKwlUWVBFIGthcmc7IFwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsgXAorCQlyZXR1cm4gLUVGQVVMVDsgXAorCX0gXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7IFwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsgXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7IFwKKwl9IFwKKwllbHNleyBcCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJaWYoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpewlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVBFUlJPUigiUmVzb3VyY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzc1xuIik7CVwKKwkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CVwKKwkJfQlcCisJCWVsc2UgewlcCisJCQltZV9jb3VudCsrOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVwKKwkJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJCVwKKwkJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJCW1lX2NvdW50LS07CVwKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsJXAorCQl9CVwKKwl9IFwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIGJhY2sgdG8gdXNlciBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKyBcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7IFwKK30KKworI2RlZmluZSBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7CVwKKwlpbnQgayA9IDA7CVwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CVwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOwlcCisJY2hhciAqbXNnID0gTlVMTDsJXAorCVRZUEUga2FyZzsJXAorCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwlcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsJXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOwlcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsJXAorCX0JXAorCWVsc2V7CVwKKwkJa2FyZy5lcnJubyA9IGRldmljZS0+REVWX0NBTEwgQVJHUzsJXAorCQlpZigha2FyZy5lcnJubyl7CVwKKwkJCWlmKChzdHJsZW4obXNnKSArIDEpID4ga2FyZy5jb3VudCl7CVwKKwkJCQlQRVJST1IoIlVzZXIgYnVmZmVyIGZvciBkZXZpY2UgbmFtZSBpcyB0byBsaXR0bGVcbiIpOwlcCisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX1VTRVJfQlVGRkVSX1NJWkU7CVwKKwkJCX0JXAorCQkJZWxzZXsJXAorCQkJCWVyciA9IGNvcHlfdG9fdXNlcihrYXJnLm5hbWUsIG1zZywgc3RybGVuKG1zZykgKyAxKTsJXAorCQkJCWlmKGVycil7CVwKKwkJCQkJUEVSUk9SKCJDYW4ndCBjb3B5IGRldmljZSBuYW1lIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCQkJCXJldHVybiAtRUZBVUxUOwlcCisJCQkJfQlcCisJCQl9CVwKKwkJfQlcCisJfQlcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZVxuIik7CVwKKwkJcmV0dXJuIC1FRkFVTFQ7CVwKKwl9CVwKKwlcCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7CVwKK30KKworI2RlZmluZSBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsJXAorCWludCBrID0gMDsJXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsJXAorCW1lX2RldmljZV90ICpkZXZpY2U7CVwKKwlUWVBFIGthcmc7CVwKKwkJXAorCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsgXAorCSBcCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKFRZUEUpKTsJXAorCWlmKGVycil7CVwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBmcm9tIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCWRvd25fcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpewlcCisJCWlmKGsgPT0ga2FyZy5kZXZpY2UpewlcCisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOwlcCisJCQlicmVhazsJXAorCQl9CVwKKwkJaysrOwlcCisJfQlcCisJCVwKKwlpZihwb3MgPT0gJm1lX2RldmljZV9saXN0KXsJXAorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIG51bWJlciBzcGVjaWZpZWRcbiIpOwlcCisJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsJXAorCX0JXAorCWVsc2V7CVwKKwkJa2FyZy5lcnJubyA9IGRldmljZS0+REVWX0NBTEwgQVJHUzsJXAorCX0JXAorCVwKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8gdXNlciBzcGFjZVxuIik7CVwKKwkJcmV0dXJuIC1FRkFVTFQ7CVwKKwl9CVwKKwkJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOwlcCit9CisKKyNlbmRpZiAvL19fS0VSTkVMX18KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njg2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVwbHhfcmVnLmgKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBAZmlsZSBtZXBseF9yZWcuaAorICoKKyAqIEBicmllZiBQTFggOTA1MiBQQ0kgYnJpZGdlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FUExYX1JFR19IXworI2RlZmluZSBfTUVQTFhfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUExYX0lOVENTUgkJCQkweDRDCQkvKio8IEludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTgkJMHgwMQkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQgKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wJCTB4MDIJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBwb2xhcml0eSBpcyBhY3RpdmUgaGlnaCAoci93KS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFCQkweDA0CQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgYWN0aXZlIChyL18pLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4JCTB4MDgJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MCQkweDEwCQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURQkJMHgyMAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIGlzIGFjdGl2ZSAgKHIvXykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfUENJX0lOVF9FTgkJCTB4NDAJCS8qKjwgSWYgc2V0LCBQQ0kgaW50ZXJydXB0IGlzIGVuYWJsZWQgKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfU09GVF9JTlQJCQkweDgwCQkvKio8IElmIHNldCwgYSBzb2Z0d2FyZSBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIChyL3cpLiAqLworCisjZGVmaW5lIFBMWF9JQ1IJCQkJCTB4NTAJCS8qKjwgSW5pdGlhbGl6YXRpb24gY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NMT0NLX1NFVAkJMHgwMTAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fQ0hJUF9TRUxFQ1QJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1dSSVRFCQkweDA0MDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9SRUFECQkJMHgwODAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fVkFMSUQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBQTFhfSUNSX01BU0tfRUVQUk9NCQkJMHgxRjAwMDAwMAorI2RlZmluZSBFRVBST01fREVMQVkJCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4YjY2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogQGZpbGUgbWVfc2xpc3QuYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBzdWJkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorCisjaW5jbHVkZSAibWVzbGlzdC5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworaW50IG1lX3NsaXN0X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsIGludCAqbnVtYmVyKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJKm51bWJlciA9IHNsaXN0LT5uOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit1bnNpZ25lZCBpbnQgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKwlyZXR1cm4gc2xpc3QtPm47Cit9CisKK21lX3N1YmRldmljZV90ICptZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zbGlzdCAqIHNsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGkgPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChpbmRleCA+PSBzbGlzdC0+bikgeworCQlQRVJST1IoIkluZGV4IG91dCBvZiByYW5nZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnNsaXN0LT5oZWFkKSB7CisJCWlmIChpID09IGluZGV4KSB7CisJCQlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfc3ViZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQkrK2k7CisJfQorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworaW50IG1lX3NsaXN0X2dldF9zdWJkZXZpY2VfYnlfdHlwZShzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSAgIHVuc2lnbmVkIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJICAgaW50IHR5cGUsIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSkKK3sKKwltZV9zdWJkZXZpY2VfdCAqcG9zOworCWludCBzX3R5cGUsIHNfc3VidHlwZTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSAwOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChzdGFydF9zdWJkZXZpY2UgPj0gc2xpc3QtPm4pIHsKKwkJUEVSUk9SKCJTdGFydCBpbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PTU9SRV9TVUJERVZJQ0VfVFlQRTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNsaXN0LT5oZWFkLCBsaXN0KSB7CisJCWlmIChpbmRleCA8IHN0YXJ0X3N1YmRldmljZSkgewkvLyBHbyBmb3J3YXJkIHRvIHN0YXJ0IHN1YmRldmljZS4KKwkJCSsraW5kZXg7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBvcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKHBvcywKKwkJCQkJCSAgICAgICAmc190eXBlLCAmc19zdWJ0eXBlKTsKKworCQlpZiAoc3VidHlwZSA9PSBNRV9TVUJUWVBFX0FOWSkgeworCQkJaWYgKHNfdHlwZSA9PSB0eXBlKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKChzX3R5cGUgPT0gdHlwZSkgJiYgKHNfc3VidHlwZSA9PSBzdWJ0eXBlKSkKKwkJCQlicmVhazsKKwkJfQorCisJCSsraW5kZXg7CisJfQorCisJaWYgKGluZGV4ID49IHNsaXN0LT5uKSB7CisJCXJldHVybiBNRV9FUlJOT19OT01PUkVfU1VCREVWSUNFX1RZUEU7CisJfQorCisJKnN1YmRldmljZSA9IGluZGV4OworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3ZvaWQgbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJIG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlsaXN0X2FkZF90YWlsKCZzdWJkZXZpY2UtPmxpc3QsICZzbGlzdC0+aGVhZCk7CisJKytzbGlzdC0+bjsKK30KKworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqbGFzdDsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChsaXN0X2VtcHR5KCZzbGlzdC0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJbGFzdCA9IHNsaXN0LT5oZWFkLnByZXY7CisKKwlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KGxhc3QsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKworCWxpc3RfZGVsKGxhc3QpOworCisJLS1zbGlzdC0+bjsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK2ludCBtZV9zbGlzdF9pbml0KG1lX3NsaXN0X3QgKiBzbGlzdCkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJnNsaXN0LT5oZWFkKTsKKwlzbGlzdC0+biA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfc2xpc3RfZGVpbml0KG1lX3NsaXN0X3QgKiBzbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnM7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNsaXN0LT5oZWFkKSkgeworCQlzID0gc2xpc3QtPmhlYWQubmV4dDsKKwkJbGlzdF9kZWwocyk7CisJCXN1YmRldmljZSA9IGxpc3RfZW50cnkocywgbWVfc3ViZGV2aWNlX3QsIGxpc3QpOworCQlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9kZXN0cnVjdG9yKHN1YmRldmljZSk7CisJfQorCisJc2xpc3QtPm4gPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2Yzg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKgorICogQGZpbGUgbWVfc2xpc3QuaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVfU0xJU1RfSF8KKyNkZWZpbmUgX01FX1NMSVNUX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGxpc3QgY29udGFpbmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9zbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBUaGUgaGVhZCBvZiB0aGUgaW50ZXJuYWwgbGlzdC4gKi8KKwl1bnNpZ25lZCBpbnQgbjsJCQkvKio8IFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBpbiB0aGUgbGlzdC4gKi8KK30gbWVfc2xpc3RfdDsKKworLyoqCisgKiBAYnJpZWYgUXVlcmllcyB0aGUgbnVtYmVyIG9mIHN1YmRldmljZXMgY3VycmVudGx5IGluc2lkZSB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtW291dF0gbnVtYmVyIFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gTUUtaURTIGVycm9yIGNvZGUuCisgKi8KK2ludCBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LCBpbnQgKm51bWJlcik7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBpbiB0aGUgbGlzdC4KKyAqLwordW5zaWduZWQgaW50IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgc3ViZGV2aWNlIGJ5IGluZGV4LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2UgdG8gZ2V0IGluIHRoZSBsaXN0LgorICoKKyAqIEByZXR1cm4gVGhlIHN1YmRldmljZSBhdCBpbmRleCBpZiBhdmFpbGFibGUuXG4KKyAqICAgICAgICAgTlVMTCBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICovCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisvKioKKyAqIEBicmllZiBHZXQgYSBzdWJkZXZpY2UgaW5kZXggYnkgdHlwZSBhbmQgc3VidHlwZS4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtIHN0YXJ0X3N1YmRldmljZSBUaGUgc3ViZGV2aWNlIGluZGV4IGF0IHdoaWNoIHRoZSBzdGFydCBzaGFsbCBiZWdpbi4KKyAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBzdWJkZXZpY2UgdG8gcXVlcnkuCisgKiBAcGFyYW0gc3VidHlwZSBUaGUgc3VidHlwZSBvZiB0aGUgc3ViZGV2aWNlIHRvIHF1ZXJ5LgorICogQHBhcmFtW291dF0gc3ViZGV2aWNlIE9uIHN1Y2Nlc3MgdGhpcyBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBtYXRjaGluZyB0aGUgcmVxdWVzdGVkIHR5cGUuCisgKgorICogQHJldHVybiBNRV9FUlJOT19TVUNDRVNTIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCSAgIGludCB0eXBlLCBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBBZGRzIGEgc3ViZGV2aWNlIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gYWRkIGEgc3ViZGV2aWNlIHRvLgorICogQHBhcmFtIHN1YmRldmljZSBUaGUgc3ViZGV2aWNlIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAqLwordm9pZCBtZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgbWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBSZW1vdmVzIGEgc3ViZGV2aWNlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIHJlbW92ZWQgc3ViZGVpdmNlLlxuCisgKiAgICAgICAgIE5VTEwgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3Qgd2FzIGVtcHR5LgorICovCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gbG9jayBUaGUgc3ViZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3NsaXN0X2luaXQobWVfc2xpc3RfdCAqIHNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSBhbmQgZGVzdHJ1Y3RzIGV2ZXJ5IHN1YmRldmljZSBpbiBpdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9zbGlzdF9kZWluaXQobWVfc2xpc3RfdCAqIHNsaXN0KTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzBiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jCkBAIC0wLDAgKzEsMTM2IEBACisvKioKKyAqIEBmaWxlIG1lc2xvY2suYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBzdWJkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKK2ludCBtZV9zbG9ja19lbnRlcihzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCWlmICgoc2xvY2stPmZpbGVwKSAhPSBOVUxMICYmIChzbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCX0KKworCXNsb2NrLT5jb3VudCsrOworCisJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9zbG9ja19leGl0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCXNsb2NrLT5jb3VudC0tOworCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfc2xvY2tfbG9jayhzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXN3aXRjaCAobG9jaykgeworCisJY2FzZSBNRV9MT0NLX1JFTEVBU0U6CisJCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJaWYgKHNsb2NrLT5maWxlcCA9PSBmaWxlcCkKKwkJCXNsb2NrLT5maWxlcCA9IE5VTEw7CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX1NFVDoKKwkJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlpZiAoc2xvY2stPmNvdW50KSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlQRVJST1IoIlN1YmRldmljZSBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoc2xvY2stPmZpbGVwID09IE5VTEwpCisJCQlzbG9jay0+ZmlsZXAgPSBmaWxlcDsKKwkJZWxzZSBpZiAoc2xvY2stPmZpbGVwICE9IGZpbGVwKSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlQRVJST1IoIlN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9MT0NLX0NIRUNLOgorCQlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWlmIChzbG9jay0+Y291bnQpIHsKKwkJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJCXJldHVybiBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKChzbG9jay0+ZmlsZXAgIT0gTlVMTCkgJiYgKHNsb2NrLT5maWxlcCAhPSBmaWxlcCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJCXJldHVybiBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKworCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordm9pZCBtZV9zbG9ja19kZWluaXQoc3RydWN0IG1lX3Nsb2NrICpzbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7Cit9CisKK2ludCBtZV9zbG9ja19pbml0KG1lX3Nsb2NrX3QgKiBzbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzbG9jay0+ZmlsZXAgPSBOVUxMOworCXNsb2NrLT5jb3VudCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnNsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDJiMjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaApAQCAtMCwwICsxLDczIEBACisvKioKKyAqIEBmaWxlIG1lc2xvY2suaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGxvY2sgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVTTE9DS19IXworI2RlZmluZSBfTUVTTE9DS19IXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHN1YmRldmljZSBsb2NrIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9zbG9jayB7CisJc3RydWN0IGZpbGUgKmZpbGVwOwkJLyoqPCBQb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlIGhvbGRpbmcgdGhlIHN1YmRldmljZS4gKi8KKwlpbnQgY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgdGFza3Mgd2hpY2ggYXJlIGluc2lkZSB0aGUgc3ViZGV2aWNlLiAqLworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOwkJLyoqPCBTcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgYXR0cmlidXRlcyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworfSBtZV9zbG9ja190OworCisvKioKKyAqIEBicmllZiBUcmllcyB0byBlbnRlciBhIHN1YmRldmljZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xvY2tfZW50ZXIoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKTsKKworLyoqCisgKiBAYnJpZWYgRXhpdHMgYSBzdWJkZXZpY2UuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2V4aXQoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKTsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gcGVyZm9ybSBhIGxvY2tpbmcgYWN0aW9uIG9uIGEgc3ViZGV2aWNlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgc3ViZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKiBAcGFyYW0gVGhlIGFjdGlvbiB0byBiZSBkb25lLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xvY2tfbG9jayhzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2luaXQobWVfc2xvY2tfdCAqIHNsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfc2xvY2tfZGVpbml0KG1lX3Nsb2NrX3QgKiBzbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDRmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoqCisgKiBAZmlsZSBtZXN1YmRldmljZS5jCisgKgorICogQGJyaWVmIFN1YmRldmljZSBiYXNlIGNsYXNzIGltcGxlbWVudGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IGlycV9zb3VyY2UsCisJCQkJICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgY2hhbm5lbCwKKwkJCQkJaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJCSBpbnQgY291bnQsCisJCQkJCSBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkJIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgICAgaW50IHRpbWVfb3V0LAorCQkJCQkgICAgIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgcmVhZF9tb2RlLAorCQkJCSAgICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCB3YWl0LAorCQkJCQkgaW50ICpzdGF0dXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCB3cml0ZV9tb2RlLAorCQkJCQlpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIG1lX3Nsb2NrX2xvY2soJnN1YmRldmljZS0+bG9jaywgZmlsZXAsIGxvY2spOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCB1bml0LAorCQkJCQkgICAgICAgaW50ICptaW4sCisJCQkJCSAgICAgICBpbnQgKm1heCwKKwkJCQkJICAgICAgIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8oc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgaW50IHJhbmdlLAorCQkJCQkgaW50ICp1bml0LAorCQkJCQkgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZQorCQkJCQkJICAqc3ViZGV2aWNlLCBpbnQgY2FwLAorCQkJCQkJICBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgaW50IHRpbWVyLAorCQkJCSAgICBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSAgICBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9jb25maWdfbG9hZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfc3ViZGV2aWNlX2RlaW5pdChzdWJkZXZpY2UpOworCWtmcmVlKHN1YmRldmljZSk7Cit9CisKK2ludCBtZV9zdWJkZXZpY2VfaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogSW5pdCBsaXN0IGhlYWQgKi8KKwlJTklUX0xJU1RfSEVBRCgmc3ViZGV2aWNlLT5saXN0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlICovCisKKwllcnIgPSBtZV9zbG9ja19pbml0KCZzdWJkZXZpY2UtPmxvY2spOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIFN1YmRldmljZSBiYXNlIGNsYXNzIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWVfc3ViZGV2aWNlX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZV9zdWJkZXZpY2VfcXVlcnlfdGltZXI7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQgPSBtZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQ7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lX3N1YmRldmljZV9kZXN0cnVjdG9yOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfc3ViZGV2aWNlX2RlaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJbWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJCU1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisJbWVfc2xvY2tfZGVpbml0KCZzdWJkZXZpY2UtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWVjMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qKgorICogQGZpbGUgbWVzdWJkZXZpY2UuaAorICoKKyAqIEBicmllZiBQcm92aWRlcyB0aGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUVTVUJERVZJQ0VfSF8KKyNkZWZpbmUgX01FU1VCREVWSUNFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJtZXR5cGVzLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworIyBpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdXNlZCB0byBlbnRlciBhIHN1YmRldmljZS4KKyAqLworI2RlZmluZSBNRV9TVUJERVZJQ0VfRU5URVIJXAoreyBcCisJaW50IGVycjsgXAorCWVyciA9IG1lX3Nsb2NrX2VudGVyKCZpbnN0YW5jZS0+YmFzZS5sb2NrLCBmaWxlcCk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2Fubm90IGVudGVyIHN1YmRldmljZS5cbiIpOyBcCisJCXJldHVybiBlcnI7IFwKKwl9IFwKK30KKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdXNlZCB0byBleGl0IGEgc3ViZGV2aWNlLgorICovCisjZGVmaW5lIE1FX1NVQkRFVklDRV9FWElUCVwKK3tcCisJaW50IGVycjsgXAorCWVyciA9IG1lX3Nsb2NrX2V4aXQoJmluc3RhbmNlLT5iYXNlLmxvY2ssIGZpbGVwKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW5ub3QgZXhpdCBzdWJkZXZpY2UuXG4iKTsgXAorCQlyZXR1cm4gZXJyOyBcCisJfSBcCit9CisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc3ViZGV2aWNlIHsKKwkvKiBBdHRyaWJ1dGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyoqPCBFbmFibGVzIHRoZSBzdWJkZXZpY2UgdG8gYmUgYWRkZWQgdG8gYSBkeW5hbWljIGxpc3QuICovCisJbWVfc2xvY2tfdCBsb2NrOwkJLyoqPCBVc2VkIGJ5IHVzZXIgYXBwbGljYXRpb24gaW4gb3JkZXIgdG8gbG9jayB0aGUgc3ViZGV2aWNlIGZvciBleGNsdXNpdmUgdXNhZ2UuICovCisKKwkvKiBNZXRob2RzICovCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV93YWl0KSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkJc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgICAgICBpbnQgcmVmLAorCQkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCQkgICAgICBpbnQgdHJpZ190eXBlLAorCQkJCQkgICAgICBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgIGludCAqdmFsdWUsCisJCQkJCSAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCQkgICAgIGludCB2YWx1ZSwKKwkJCQkJICAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgICAgICBpbnQgY291bnQsCisJCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLAorCQkJCQkgICAgICBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwKKwkJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LAorCQkJCQkJICBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgcmVhZF9tb2RlLAorCQkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgIGludCBzdGFydF9tb2RlLAorCQkJCQkgICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICAgaW50IHdhaXQsCisJCQkJCSAgICAgIGludCAqc3RhdHVzLAorCQkJCQkgICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkJICAgICBpbnQgKnZhbHVlcywKKwkJCQkJICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICBpbnQgbG9jaywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSAgIHN1YmRldmljZSwgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkJIGludCAqY291bnQpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICoKKwkJCQkJCSAgICBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkJICAgIGludCAqbWluLCBpbnQgKm1heCwKKwkJCQkJCSAgICBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8pIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwgaW50ICp0eXBlLAorCQkJCQkJICBpbnQgKnN1YnR5cGUpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgIHN1YmRldmljZSwgaW50ICpjYXBzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICAgICAgc3ViZGV2aWNlLCBpbnQgY2FwLAorCQkJCQkJICAgICAgIGludCAqYXJncywgaW50IGNvdW50KTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV90aW1lcikgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdGltZXIsCisJCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsCisJCQkJCSBsb25nIGxvbmcgKm1heF90aWNrcyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgbWVfY2ZnX2RldmljZV9lbnRyeV90ICogY29uZmlnKTsKKworCXZvaWQgKCptZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcikgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UpOworfSBtZV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBzdWJkZXZpY2UgVGhlIHN1YmRldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc3ViZGV2aWNlX2luaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBEZWluaXRpYWxpemVzIGEgc3ViZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc3ViZGV2aWNlIFRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKi8KK3ZvaWQgbWVfc3ViZGV2aWNlX2RlaW5pdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODYzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoqCisgKiBAZmlsZSBtZXRlbXBsX2RldmljZS5jCisgKgorICogQGJyaWVmIHRlbXBsYXRlIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWlkcy5oPgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1ldGVtcGxfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yi5oIgorCittZV9kZXZpY2VfdCAqbWV0ZW1wbF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWV0ZW1wbF9kZXZpY2VfdCAqbWV0ZW1wbF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1ldGVtcGxfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWV0ZW1wbF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZXRlbXBsX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1ldGVtcGxfZGV2aWNlLCAwLCBzaXplb2YobWV0ZW1wbF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1ldGVtcGxfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWV0ZW1wbF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWV0ZW1wbF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1ldGVtcGxfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZXRlbXBsX2RldmljZS0+Y3RybF9yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWV0ZW1wbF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWV0ZW1wbF9zdWJfY29uc3RydWN0b3IobWV0ZW1wbF9kZXZpY2UtPgorCQkJCQkJCSAgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAgICZtZXRlbXBsX2RldmljZS0+CisJCQkJCQkJICAgICAgIGN0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZSk7CisJCQlrZnJlZShtZXRlbXBsX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZXRlbXBsX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLyogT3ZlcndyaXRlIGJhc2UgY2xhc3MgbWV0aG9kcyBpZiBhcHBsaWNhYmxlLiAqLworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1ldGVtcGxfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZXRlbXBsX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworfQorCittb2R1bGVfaW5pdChtZXRlbXBsX2luaXQpOworCittb2R1bGVfZXhpdChtZXRlbXBsX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1ldGVtcGxfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzNzAyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9kZXZpY2UuaAorICoKKyAqIEBicmllZiB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVURU1QTF9ERVZJQ0VfSAorI2RlZmluZSBfTUVURU1QTF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIHRlbXBsYXRlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1ldGVtcGxfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBzdWJkZXZpY2VzOworfSBtZXRlbXBsX3ZlcnNpb25fdDsKKworLyoqCisgKiBAYnJpZWYgRGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1ldGVtcGxfdmVyc2lvbl90IG1ldGVtcGxfdmVyc2lvbnNbXSA9IHsKKwl7MHhERUFELCAxfSwKKwl7MH0sCit9OworCisjZGVmaW5lIE1FVEVNUExfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWV0ZW1wbF92ZXJzaW9ucykgLyBzaXplb2YobWV0ZW1wbF92ZXJzaW9uX3QpIC0gMSkgLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZXRlbXBsX3ZlcnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtZXRlbXBsX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRVRFTVBMX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWV0ZW1wbF92ZXJzaW9uc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIENoaWxkIGNsYXNzIGF0dHJpYnV0ZXMuICovCisJc3BpbmxvY2tfdCBjdHJsX3JlZ19sb2NrOworfSBtZXRlbXBsX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyB0ZW1wbGF0ZSBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZXRlbXBsX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ2NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWIuYworICoKKyAqIEBicmllZiBTdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yl9yZWcuaCIKKyNpbmNsdWRlICJtZXRlbXBsX3N1Yi5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBtZXRlbXBsX3N1Yl9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJaW5zdGFuY2UgPSAobWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJLyogVW50aWwgdGhlcmUgdGhpcyB3YXMgdGhlIHRoaW5ncyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBkb2VzLgorCSAgIElmIHlvdSBkbyBub3QgaGF2ZSBhbnkgYWRkaXRpb25hbCB0aGluZ3MgdG8gZG8geW91IGNhbiB3aXBlIGl0IG91dC4gKi8KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWV0ZW1wbF9zdWJfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IDA7CisJKnN1YnR5cGUgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1ldGVtcGxfc3ViX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21ldGVtcGxfc3ViX3N1YmRldmljZV90ICptZXRlbXBsX3N1Yl9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgc3ViX2lkeCwKKwkJCQkJCSBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1ldGVtcGxfc3ViX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1ldGVtcGxfc3ViX3N1YmRldmljZV90KSk7CisKKwkvKiBDaGVjayBpZiBzdWJkZXZpY2UgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoc3ViX2lkeCA+PSAyKSB7CisJCVBFUlJPUigiVGVtcGxhdGUgc3ViZGV2aWNlIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5zdWJfaWR4ID0gc3ViX2lkeDsKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZXRlbXBsX3N1Yl9kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM4YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmgKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBAZmlsZSBtZXRlbXBsX3N1Yi5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVRFTVBMX1NVQl9IXworI2RlZmluZSBfTUVURU1QTF9TVUJfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1ldGVtcGxfc3ViX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlpbnQgc3ViX2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLiAqLworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgbW9kZXMuICovCit9IG1ldGVtcGxfc3ViX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gc3ViX2lkeCBUaGUgaW5kZXggb2YgdGhlIHN1YmRldmljZSBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKm1ldGVtcGxfc3ViX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkJIHVuc2lnbmVkIGludCBzdWJfaWR4LAorCQkJCQkJIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJjYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViX3JlZy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWJfcmVnLmgKKyAqCisgKiBAYnJpZWYgU3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FVEVNUExfU1VCX1JFR19IXworI2RlZmluZSBfTUVURU1QTF9TVUJfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUVURU1QTF9QT1JUX01PREUJCQkweDAwMTAJCS8qKjwgQ29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOGVhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWV0eXBlcy5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVUWVBFU19IXworI2RlZmluZSBfTUVUWVBFU19IXworCisKK3R5cGVkZWYgaW50ICgqbWVFcnJvckNCX3QpKGNoYXIgKnBjRnVuY3Rpb25OYW1lLCBpbnQgaUVycm9yQ29kZSk7CisKK3R5cGVkZWYgaW50ICgqbWVJT1N0cmVhbUNCX3QpKAorCQlpbnQgaURldmljZSwKKwkJaW50IGlTdWJkZXZpY2UsCisJCWludCBpQ291bnQsCisJICAgCXZvaWQgKnB2Q29udGV4dCwKKwkgICAJaW50IGlFcnJvckNvZGUpOworCit0eXBlZGVmIGludCAoKm1lSU9JcnFDQl90KSgKKwkJaW50IGlEZXZpY2UsCisJICAgCWludCBpU3ViZGV2aWNlLAorCSAgIAlpbnQgaUNoYW5uZWwsCisJCWludCBpSXJxQ291bnQsCisJICAgCWludCBpVmFsdWUsCisJICAgCXZvaWQgKnB2Q29udGV4dCwKKwkgICAJaW50IGlFcnJvckNvZGUpOworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TaW5nbGUgeworCWludCBpRGV2aWNlOworCWludCBpU3ViZGV2aWNlOworCWludCBpQ2hhbm5lbDsKKwlpbnQgaURpcjsKKwlpbnQgaVZhbHVlOworCWludCBpVGltZU91dDsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TaW5nbGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtQ29uZmlnIHsKKwlpbnQgaUNoYW5uZWw7CisJaW50IGlTdHJlYW1Db25maWc7CisJaW50IGlSZWY7CisJaW50IGlGbGFnczsKK30gbWVJT1N0cmVhbUNvbmZpZ190OworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TdHJlYW1UcmlnZ2VyIHsKKwlpbnQgaUFjcVN0YXJ0VHJpZ1R5cGU7CisJaW50IGlBY3FTdGFydFRyaWdFZGdlOworCWludCBpQWNxU3RhcnRUcmlnQ2hhbjsKKwlpbnQgaUFjcVN0YXJ0VGlja3NMb3c7CisJaW50IGlBY3FTdGFydFRpY2tzSGlnaDsKKwlpbnQgaUFjcVN0YXJ0QXJnc1sxMF07CisJaW50IGlTY2FuU3RhcnRUcmlnVHlwZTsKKwlpbnQgaVNjYW5TdGFydFRpY2tzTG93OworCWludCBpU2NhblN0YXJ0VGlja3NIaWdoOworCWludCBpU2NhblN0YXJ0QXJnc1sxMF07CisJaW50IGlDb252U3RhcnRUcmlnVHlwZTsKKwlpbnQgaUNvbnZTdGFydFRpY2tzTG93OworCWludCBpQ29udlN0YXJ0VGlja3NIaWdoOworCWludCBpQ29udlN0YXJ0QXJnc1sxMF07CisJaW50IGlTY2FuU3RvcFRyaWdUeXBlOworCWludCBpU2NhblN0b3BDb3VudDsKKwlpbnQgaVNjYW5TdG9wQXJnc1sxMF07CisJaW50IGlBY3FTdG9wVHJpZ1R5cGU7CisJaW50IGlBY3FTdG9wQ291bnQ7CisJaW50IGlBY3FTdG9wQXJnc1sxMF07CisJaW50IGlGbGFnczsKK30gbWVJT1N0cmVhbVRyaWdnZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtU3RhcnQgeworCWludCBpRGV2aWNlOworCWludCBpU3ViZGV2aWNlOworCWludCBpU3RhcnRNb2RlOworCWludCBpVGltZU91dDsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TdHJlYW1TdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lSU9TdHJlYW1TdG9wIHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaVN0b3BNb2RlOworCWludCBpRmxhZ3M7CisJaW50IGlFcnJubzsKK30gbWVJT1N0cmVhbVN0b3BfdDsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiYTRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBJTlBVVF9NSU1JTworCXRyaXN0YXRlICJNaW1pbyBYaSBpbnRlcmFjdGl2ZSB3aGl0ZWJvYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IE4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIE1pbWlvIFhpIGludGVyYWN0aXZlCisJICB3aGl0ZWJvYXJkIGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWltaW8uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4MDdlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfSU5QVVRfTUlNSU8pCSs9IG1pbWlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL21pbWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhODEwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jCkBAIC0wLDAgKzEsOTE0IEBACisvKgorICogSGFyZHdhcmUgZXZlbnQgPT4gaW5wdXQgZXZlbnQgbWFwcGluZzoKKyAqCisgKgorICoKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUEVOICAgICAgICAgICAgMHgxNDAgYmxhY2sKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUlVCQkVSICAgICAgICAgMHgxNDEgYmx1ZQorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9CUlVTSCAgICAgICAgICAweDE0MiBncmVlbgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9QRU5DSUwgICAgICAgICAweDE0MyByZWQKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfQUlSQlJVU0ggICAgICAgMHgxNDQgZXJhc2VyCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX0ZJTkdFUiAgICAgICAgIDB4MTQ1IHNtYWxsIGVyYXNlcgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9NT1VTRSAgICAgICAgICAweDE0NiBtaW1pbyBpbnRlcmFjdGl2ZQorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9MRU5TICAgICAgICAgICAweDE0NyBtaW1pbyBpbnRlcmFjdGl2ZSBidXQxCisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkExICAgIDB4MTRhIG1pbWlvIGludGVyYWN0aXZlIGJ1dDIgPT0gQlROX1RPVUNICisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEyICAgIDB4MTRiIG1pbWlvIGV4dHJhIHBlbnMgKG9yYW5nZSwgYnJvd24sIHllbGxvdywgcHVycGxlKSA9PSBCVE5fU1RZTFVTCisgaW5wdXQuaDojZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEzICAgIDB4MTRjIHVudXNlZCA9PSBCVE5fU1RZTFVTMgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9ET1VCTEVUQVAgICAgICAweDE0ZCB1bnVzZWQKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfVFJJUExFVEFQICAgICAgMHgxNGUgdW51c2VkCisgKgorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fSykgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUEVOKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fQikgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUlVCQkVSKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fRykgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfQlJVU0gpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9SKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9QRU5DSUwpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9BSVJCUlVTSCkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0VTKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0ZJTkdFUikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0kpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX01PVVNFKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fSUwpICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfTEVOUykKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0lSKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0RPVUJMRVRBUCkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0VYKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1RSSVBMRVRBUCkKKyAqIE1JTUlPX0VWX1BFTkRBVEEgICAgICAgICAgICAgICAgID0+IEVWX0FCUyBCSVQoQUJTX1gpLCBCSVQoQUJTX1kpCisgKiBNSU1JT19FVl9NRU1SRVNFVCAgICAgICAgICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMCkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfTkVXUEFHRSkgICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMSkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfVEFHUEFHRSkgICAgICA9PiBFVl9LRVkgQklUKEJUTl8yKQorICogTUlNSU9fRVZfQUNDKEFDQ19QUklOVFBBR0UpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMykKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfTUFYSU1JWkUpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fNCkKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfRklORENUTFBOTCkgICAgICA9PiBFVl9LRVkgQklUKEJUTl81KQorICoKKyAqCisgKiBvcGVuIGlzc3VlczoKKyAqICAgICAgLSBjb2xkLWxvYWQgb2YgZGF0YSBjYXB0dXJlZCB3aGVuIG1pbWlvIGluIHN0YW5kYWxvbmUgbW9kZSBub3QgeWV0CisgKiAgICAgICAgIHN1cHBvcnRlZDsgbmVlZCB0byBzbm9vcCBXaW4zMiBib3ggdG8gc2VlIGRhdGFzdHJlYW0gZm9yIHRoaXMuCisgKiAgICAgICAtIG1pbWlvIG1vdXNlIG5vdCB5ZXQgc3VwcG9ydGVkOyBuZWVkIHRvIHNub29wIFdpbjMyIGJveCB0byBzZWUgdGhlCisgKiAgICAgICAgIGRhdGFzdHJlYW0gZm9yIHRoaXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjAzMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIm13aWxkZXJAY3Mubm1zdS5lZHUiCisjZGVmaW5lIERSSVZFUl9ERVNDCQkiVVNCIG1pbWlvLXhpIGRyaXZlciIKKworZW51bSB7VVBWQUxVRSwgRE9XTlZBTFVFLCBNT1ZFVkFMVUV9OworCisjZGVmaW5lIE1JTUlPX1hSQU5HRV9NQVgJOTYwMAorI2RlZmluZSBNSU1JT19ZUkFOR0VfTUFYCTQ4MDAKKworI2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMQlCVE5fVE9VQ0gKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTIJQlROX1NUWUxVUworI2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMwlCVE5fU1RZTFVTMgorCisjZGVmaW5lIE1JTUlPX1ZFTkRPUl9JRAkJMHgwOGQzCisjZGVmaW5lIE1JTUlPX1BST0RVQ1RfSUQJMHgwMDAxCisjZGVmaW5lIE1JTUlPX01BWFBBWUxPQUQJKDgpCisjZGVmaW5lIE1JTUlPX01BWE5BTUVMRU4JKDY0KQorI2RlZmluZSBNSU1JT19UWFdBSVQJCSgxKQorI2RlZmluZSBNSU1JT19UWERPTkUJCSgyKQorCisjZGVmaW5lIE1JTUlPX0VWX1BFTkRPV04JKDB4MjIpCisjZGVmaW5lIE1JTUlPX0VWX1BFTkRBVEEJKDB4MjQpCisjZGVmaW5lIE1JTUlPX0VWX1BFTlVQCQkoMHg1MSkKKyNkZWZpbmUgTUlNSU9fRVZfTUVNUkVTRVQJKDB4NDUpCisjZGVmaW5lIE1JTUlPX0VWX0FDQwkJKDB4YjIpCisKKyNkZWZpbmUgTUlNSU9fUEVOX0sJCSgxKQkvKiBibGFjayBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0IJCSgyKQkvKiBibHVlIHBlbiAqLworI2RlZmluZSBNSU1JT19QRU5fRwkJKDMpCS8qIGdyZWVuIHBlbiAqLworI2RlZmluZSBNSU1JT19QRU5fUgkJKDQpCS8qIHJlZCBwZW4gKi8KKy8qIDUsIDYsIDcsIDggYXJlIGV4dHJhIHBlbnMgKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0UJCSg5KQkvKiBiaWcgZXJhc2VyICovCisjZGVmaW5lIE1JTUlPX1BFTl9FUwkJKDEwKQkvKiBsaWwgZXJhc2VyICovCisjZGVmaW5lIE1JTUlPX1BFTkpVTVBfU1RBUlQJKDEwKQorI2RlZmluZSBNSU1JT19QRU5KVU1QCQkoNikKKyNkZWZpbmUgTUlNSU9fUEVOX0kJCSgxNykJLyogbWltaW8gaW50ZXJhY3RpdmUgKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0lMCQkoMTgpCS8qIG1pbWlvIGludGVyYWN0aXZlIGJ1dHRvbiAxICovCisjZGVmaW5lIE1JTUlPX1BFTl9JUgkJKDE5KQkvKiBtaW1pbyBpbnRlcmFjdGl2ZSBidXR0b24gMiAqLworCisjZGVmaW5lIE1JTUlPX1BFTl9NQVgJCShNSU1JT19QRU5fSVIpCisKKyNkZWZpbmUgQUNDX0RPTkUJCSgwKQorI2RlZmluZSBBQ0NfTkVXUEFHRQkJKDEpCisjZGVmaW5lIEFDQ19UQUdQQUdFCQkoMikKKyNkZWZpbmUgQUNDX1BSSU5UUEFHRQkJKDQpCisjZGVmaW5lIEFDQ19NQVhJTUlaRQkJKDgpCisjZGVmaW5lIEFDQ19GSU5EQ1RMUE5MCQkoMTYpCisKKyNkZWZpbmUgaXN2YWxpZHR4c2l6ZShuKQkoKG4pID4gMCAmJiAobikgPD0gTUlNSU9fTUFYUEFZTE9BRCkKKworCitzdHJ1Y3QgcGt0YnVmIHsKKwl1bnNpZ25lZCBjaGFyIGluc3RyOworCXVuc2lnbmVkIGNoYXIgYnVmWzE2XTsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnE7Cit9OworCitzdHJ1Y3QgdXNiaW50ZW5kcHQgeworCWRtYV9hZGRyX3QgZG1hOworCXN0cnVjdCB1cmIgKnVyYjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOworfTsKKworc3RydWN0IG1pbWlvIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aWZjOworCWludCBvcGVuOworCWludCBwcmVzZW50OworCWludCBncmVldGVkOworCWludCB0eGZsYWdzOworCWNoYXIgcGh5c1tNSU1JT19NQVhOQU1FTEVOXTsKKwlzdHJ1Y3QgdXNiaW50ZW5kcHQgaW47CisJc3RydWN0IHVzYmludGVuZHB0IG91dDsKKwlzdHJ1Y3QgcGt0YnVmIHBrdGJ1ZjsKKwl1bnNpZ25lZCBjaGFyIG1pbm9yOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXNwaW5sb2NrX3QgdHhsb2NrOworCXZvaWQgKCpyeGhhbmRsZXIpKHN0cnVjdCBtaW1pbyAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CisJaW50IGxhc3RfcGVuX2Rvd247Cit9OworCitzdGF0aWMgdm9pZCBtaW1pb19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICopOworc3RhdGljIHZvaWQgbWltaW9fZGVhbGxvYyhzdHJ1Y3QgbWltaW8gKik7CitzdGF0aWMgdm9pZCBtaW1pb19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworc3RhdGljIGludCBtaW1pb19ncmVldChzdHJ1Y3QgbWltaW8gKik7CitzdGF0aWMgdm9pZCBtaW1pb19pcnFfaW4oc3RydWN0IHVyYiAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX2lycV9vdXQoc3RydWN0IHVyYiAqKTsKK3N0YXRpYyBpbnQgbWltaW9fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICopOworc3RhdGljIGludCBtaW1pb19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX3J4X2hhbmRsZXIoc3RydWN0IG1pbWlvICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgbWltaW9fdHgoc3RydWN0IG1pbWlvICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworc3RhdGljIGNoYXIgbWltaW9fbmFtZVtdID0gIlZpcnR1YWxJbmsgbWltaW8tWGkiOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1pbWlvX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShNSU1JT19WRU5ET1JfSUQsIE1JTUlPX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKDB4MDUyNSwgMHhhNGEwKSB9LCAvKiBnYWRnZXQgemVybyBmaXJtd2FyZSAqLworCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG1pbWlvX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1pbWlvX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtaW1pbyIsCisJLnByb2JlID0gbWltaW9fcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBtaW1pb19kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IG1pbWlvX3RhYmxlLAorfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCitzdGF0aWMgdm9pZCBtaW1pb19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCWlmICghbWltaW8pIHsKKwkJZGV2X2VycigmaWRldi0+ZGV2LCAibnVsbCBtaW1pbyBhdHRhY2hlZCB0byBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1pbWlvLT5vcGVuIDw9IDApCisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm1pbWlvIG5vdCBvcGVuLlxuIik7CisJZWxzZQorCQltaW1pby0+b3Blbi0tOworCisJaWYgKG1pbWlvLT5wcmVzZW50ID09IDAgJiYgbWltaW8tPm9wZW4gPT0gMCkKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2RlYWxsb2Moc3RydWN0IG1pbWlvICptaW1pbykKK3sKKwlpZiAobWltaW8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdXNiX2tpbGxfdXJiKG1pbWlvLT5pbi51cmIpOworCisJdXNiX2tpbGxfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCWlmIChtaW1pby0+aWRldikgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShtaW1pby0+aWRldik7CisJCWlmIChtaW1pby0+aWRldi0+Z3JhYikKKwkJCWlucHV0X2Nsb3NlX2RldmljZShtaW1pby0+aWRldi0+Z3JhYik7CisJCWVsc2UKKwkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJtaW1pby0+aWRldi0+Z3JhYiA9PSBOVUxMIgorCQkJCSIgLS0gZGlkbid0IGNhbGwgaW5wdXRfY2xvc2VfZGV2aWNlXG4iKTsKKwl9CisKKwl1c2JfZnJlZV91cmIobWltaW8tPmluLnVyYik7CisKKwl1c2JfZnJlZV91cmIobWltaW8tPm91dC51cmIpOworCisJaWYgKG1pbWlvLT5pbi5idWYpIHsKKwkJdXNiX2J1ZmZlcl9mcmVlKG1pbWlvLT51ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBtaW1pby0+aW4uYnVmLAorCQkJCW1pbWlvLT5pbi5kbWEpOworCX0KKworCWlmIChtaW1pby0+b3V0LmJ1ZikKKwkJdXNiX2J1ZmZlcl9mcmVlKG1pbWlvLT51ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBtaW1pby0+b3V0LmJ1ZiwKKwkJCQltaW1pby0+b3V0LmRtYSk7CisKKwlpZiAobWltaW8tPmlkZXYpCisJCWlucHV0X2ZyZWVfZGV2aWNlKG1pbWlvLT5pZGV2KTsKKworCWtmcmVlKG1pbWlvKTsKK30KKworc3RhdGljIHZvaWQgbWltaW9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZjKQoreworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisKKwltaW1pbyA9IHVzYl9nZXRfaW50ZmRhdGEoaWZjKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYywgTlVMTCk7CisJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImRpc2Nvbm5lY3RcbiIpOworCisJaWYgKG1pbWlvKSB7CisJCW1pbWlvLT5wcmVzZW50ID0gMDsKKworCQlpZiAobWltaW8tPm9wZW4gPD0gMCkKKwkJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCX0KKworCXVwKCZkaXNjb25uZWN0X3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fZ3JlZXQoc3RydWN0IG1pbWlvICptaW1pbykKK3sKKwljb25zdCBzdHJ1Y3QgZ3J0cGt0IHsKKwkJaW50IG5ieXRlczsKKwkJdW5zaWduZWQgZGVsYXk7CisJCWNoYXIgZGF0YVs4XTsKKwl9IGdydHBrdHNbXSA9IHsKKwkJeyAzLCAwLCB7IDB4MTEsIDB4NTUsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHg1MywgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDQzLCAweDU1LCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MzMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHg1ZSwgMHgwMiwgMHg0ZiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDEzLCAweDAwLCAweDA0LCAweDAzLCAweDE0LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAyLCB7IDB4MTMsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHgwZCwgMHgwOCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDEzLCAweDAwLCAweDRkLCAweDAxLCAweDVmLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyAzLCAwLCB7IDB4ZjEsIDB4NTUsIDB4YTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDcsIDIsIHsgMHg1MiwgMHg1NSwgMHgwMCwgMHgwNywgMHgzMSwgMHg1NSwgMHg2NCwgMHgwMCB9IH0sCisJCXsgMCwgMCwgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwl9OworCWludCByc2x0OworCWNvbnN0IHN0cnVjdCBncnRwa3QgKnBrdDsKKworCWZvciAocGt0ID0gZ3J0cGt0czsgcGt0LT5uYnl0ZXM7IHBrdCsrKSB7CisJCXJzbHQgPSBtaW1pb190eChtaW1pbywgcGt0LT5kYXRhLCBwa3QtPm5ieXRlcyk7CisJCWlmIChyc2x0KQorCQkJcmV0dXJuIHJzbHQ7CisJCWlmIChwa3QtPmRlbGF5KQorCQkJbXNsZWVwKHBrdC0+ZGVsYXkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19pcnFfaW4oc3RydWN0IHVyYiAqdXJiKQoreworCWludCByc2x0OworCWNoYXIgKmRhdGE7CisJY29uc3QgY2hhciAqcmVhc29uID0gImdvaW5nIGRvd24iOworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IHVyYi0+Y29udGV4dDsKKworCWlmIChtaW1pbyA9PSBOVUxMKQorCQkvKiBwYXJhbm9pYSAqLworCQlyZXR1cm47CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJcmVhc29uID0gInRpbWVvdXQgLS0gdW5wbHVnZ2VkPyI7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiJXMuXG4iLCByZWFzb24pOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInVua25vd24gdXJiLXN0YXR1czogJWQuXG4iLAorCQkJdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCWRhdGEgPSBtaW1pby0+aW4uYnVmOworCisJaWYgKG1pbWlvLT5yeGhhbmRsZXIpCisJCW1pbWlvLT5yeGhhbmRsZXIobWltaW8sIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CitleGl0OgorCS8qCisJICogS2VlcCBsaXN0ZW5pbmcgdG8gZGV2aWNlIG9uIHNhbWUgdXJiLgorCSAqLworCXJzbHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyc2x0KQorCQlkZXZfZXJyKCZtaW1pby0+aWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbHVyZTogJWQuXG4iLAorCQkJcnNsdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKworCW1pbWlvID0gdXJiLT5jb250ZXh0OworCisJaWYgKHVyYi0+c3RhdHVzKQorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidXJiLXN0YXR1czogJWQuXG4iLCB1cmItPnN0YXR1cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCW1pbWlvLT50eGZsYWdzIHw9IE1JTUlPX1RYRE9ORTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaW1pby0+dHhsb2NrLCBmbGFncyk7CisJd21iKCk7CisJd2FrZV91cCgmbWltaW8tPndhaXRxKTsKK30KKworc3RhdGljIGludCBtaW1pb19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYpCit7CisJaW50IHJzbHQ7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKworCXJzbHQgPSAwOworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKwltaW1pbyA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCWRldl9kYmcoJmlkZXYtPmRldiwgIm1pbWlvX29wZW5cbiIpOworCisJaWYgKG1pbWlvID09IE5VTEwpIHsKKwkJZGV2X2VycigmaWRldi0+ZGV2LCAibnVsbCBtaW1pby5cbiIpOworCQlyc2x0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWlmIChtaW1pby0+b3BlbisrKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAobWltaW8tPnByZXNlbnQgJiYgIW1pbWlvLT5ncmVldGVkKSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IG1pbWlvLT5pbi51cmI7CisJCW1pbWlvLT5pbi51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCQlyc2x0ID0gdXNiX3N1Ym1pdF91cmIobWltaW8tPmluLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyc2x0KSB7CisJCQlkZXZfZXJyKCZpZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlICIKKwkJCQkiKHJlcyA9ICVkOiAlcykuIE5vdCBncmVldGluZy5cbiIsCisJCQkJcnNsdCwKKwkJCQkoIXVyYiA/ICJ1cmIgaXMgTlVMTCIgOgorCQkJCSAodXJiLT5oY3ByaXYgPyAidXJiLT5oY3ByaXYgaXMgbm9uLU5VTEwiIDoKKwkJCQkgICghdXJiLT5jb21wbGV0ZSA/ICJ1cmIgaXMgbm90IGNvbXBsZXRlIiA6CisJCQkJICAgKHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPD0gMCA/ICJ1cmIgaGFzIG5vIHBhY2tldHMiIDoKKwkJCQkgICAgKHVyYi0+aW50ZXJ2YWwgPD0gMCA/ICJ1cmIgaW50ZXJ2YWwgdG9vIHNtYWxsIiA6CisJCQkJICAgICAidXJiIGludGVydmFsIHRvbyBsYXJnZSBvciBzb21lIG90aGVyIGVycm9yIikpKSkpKTsKKwkJCXJzbHQgPSAtRUlPOworCQkJZ290byBleGl0OworCQl9CisJCXJzbHQgPSBtaW1pb19ncmVldChtaW1pbyk7CisJCWlmIChyc2x0ID09IDApIHsKKwkJCWRldl9kYmcoJmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0ZWQgT0suXG4iKTsKKwkJCW1pbWlvLT5ncmVldGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0IEZhaWx1cmUgKCVkKVxuIiwKKwkJCQlyc2x0KTsKKwkJfQorCX0KKworZXhpdDoKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgaW50IG1pbWlvX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmMsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJY2hhciBwYXRoWzY0XTsKKwlpbnQgcGlwZSwgbWF4cDsKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmhvc3RpZmM7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCByZXMgPSAwOworCWludCBpOworCisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaWZjKTsKKworCW1pbWlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pbWlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaW1pbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWltaW8tPnVpZmMgPSBpZmM7CisJbWltaW8tPnVkZXYgPSB1ZGV2OworCW1pbWlvLT5wa3RidWYucCA9IG1pbWlvLT5wa3RidWYuYnVmOworCW1pbWlvLT5wa3RidWYucSA9IG1pbWlvLT5wa3RidWYuYnVmOworCS8qIGluaXRfaW5wdXRfZGV2KG1pbWlvLT5pZGV2KTsgKi8KKwltaW1pby0+aWRldiA9IGlucHV0X2RldjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaW1pby0+d2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZtaW1pby0+dHhsb2NrKTsKKwlob3N0aWZjID0gaWZjLT5jdXJfYWx0c2V0dGluZzsKKworCWlmIChob3N0aWZjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMikgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJVbmV4cGVjdGVkIGVuZHBvaW50IGNvdW50OiAlZC5cbiIsCisJCQlob3N0aWZjLT5kZXNjLmJOdW1FbmRwb2ludHMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWltaW8tPmluLmRlc2MgPSAmKGhvc3RpZmMtPmVuZHBvaW50WzBdLmRlc2MpOworCW1pbWlvLT5vdXQuZGVzYyA9ICYoaG9zdGlmYy0+ZW5kcG9pbnRbMV0uZGVzYyk7CisKKwltaW1pby0+aW4uYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBHRlBfS0VSTkVMLAorCQkJCQkgJm1pbWlvLT5pbi5kbWEpOworCW1pbWlvLT5vdXQuYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBNSU1JT19NQVhQQVlMT0FELCBHRlBfS0VSTkVMLAorCQkJCQkgICZtaW1pby0+b3V0LmRtYSk7CisKKwlpZiAobWltaW8tPmluLmJ1ZiA9PSBOVUxMIHx8IG1pbWlvLT5vdXQuYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAidXNiX2J1ZmZlcl9hbGxvYyBmYWlsdXJlLlxuIik7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltaW1pby0+aW4udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwltaW1pby0+b3V0LnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobWltaW8tPmluLnVyYiA9PSBOVUxMIHx8IG1pbWlvLT5vdXQudXJiID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAidXNiX2FsbG9jX3VyYiBmYWlsdXJlLlxuIik7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBpbnB1dCB1cmIuCisJICovCisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHVkZXYsIG1pbWlvLT5pbi5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisJaWYgKG1heHAgPiBNSU1JT19NQVhQQVlMT0FEKQorCQltYXhwID0gTUlNSU9fTUFYUEFZTE9BRDsKKwl1c2JfZmlsbF9pbnRfdXJiKG1pbWlvLT5pbi51cmIsIHVkZXYsIHBpcGUsIG1pbWlvLT5pbi5idWYsIG1heHAsCisJCQkgbWltaW9faXJxX2luLCBtaW1pbywgbWltaW8tPmluLmRlc2MtPmJJbnRlcnZhbCk7CisJbWltaW8tPmluLnVyYi0+dHJhbnNmZXJfZG1hID0gbWltaW8tPmluLmRtYTsKKwltaW1pby0+aW4udXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qCisJICogQnVpbGQgdGhlIG91dHB1dCB1cmIuCisJICovCisJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKHVkZXYsIG1pbWlvLT5vdXQuZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChtYXhwID4gTUlNSU9fTUFYUEFZTE9BRCkKKwkJbWF4cCA9IE1JTUlPX01BWFBBWUxPQUQ7CisJdXNiX2ZpbGxfaW50X3VyYihtaW1pby0+b3V0LnVyYiwgdWRldiwgcGlwZSwgbWltaW8tPm91dC5idWYsIG1heHAsCisJCQkgbWltaW9faXJxX291dCwgbWltaW8sIG1pbWlvLT5vdXQuZGVzYy0+YkludGVydmFsKTsKKwltaW1pby0+b3V0LnVyYi0+dHJhbnNmZXJfZG1hID0gbWltaW8tPm91dC5kbWE7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJLyoKKwkgKiBCdWlsZCBpbnB1dCBkZXZpY2UgaW5mbworCSAqLworCXVzYl9tYWtlX3BhdGgodWRldiwgcGF0aCwgNjQpOworCXNucHJpbnRmKG1pbWlvLT5waHlzLCBNSU1JT19NQVhOQU1FTEVOLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBtaW1pbyk7CisJLyogaW5wdXRfZGV2LT5kZXYgPSAmaWZjLT5kZXY7ICovCisJaW5wdXRfZGV2LT5vcGVuID0gbWltaW9fb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gbWltaW9fY2xvc2U7CisJaW5wdXRfZGV2LT5uYW1lID0gbWltaW9fbmFtZTsKKwlpbnB1dF9kZXYtPnBoeXMgPSBtaW1pby0+cGh5czsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmaWZjLT5kZXY7CisKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOworCWlucHV0X2Rldi0+aWQudmVuZG9yID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKKwlmb3IgKGkgPSBCVE5fVE9PTF9QRU47IGkgPD0gTE9DQUxCVE5fVE9PTF9FWFRSQTI7ICsraSkKKwkJc2V0X2JpdChpLCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fTUlTQyldIHw9IEJJVF9NQVNLKEJUTl8wKSB8CisJCQkJCQkgQklUX01BU0soQlROXzEpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fMikgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl8zKSB8CisJCQkJCQkgQklUX01BU0soQlROXzQpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fNSk7CisJLyogICBpbnB1dF9kZXYtPmtleWJpdFtCVE5fTU9VU0VdIHw9IEJJVChCVE5fTEVGVCk7ICovCisJaW5wdXRfZGV2LT5hYnNiaXRbMF0gfD0gQklUX01BU0soQUJTX1gpIHwgQklUX01BU0soQUJTX1kpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIE1JTUlPX1hSQU5HRV9NQVgsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIE1JTUlPX1lSQU5HRV9NQVgsIDAsIDApOworCWlucHV0X2Rldi0+YWJzYml0W0JJVF9XT1JEKEFCU19NSVNDKV0gfD0gQklUX01BU0soQUJTX01JU0MpOworCisjaWYgMAorCWlucHV0X2Rldi0+YWJzbWluW0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNtaW5bQUJTX1ldID0gMDsKKwlpbnB1dF9kZXYtPmFic21heFtBQlNfWF0gPSA5NjAwOworCWlucHV0X2Rldi0+YWJzbWF4W0FCU19ZXSA9IDQ4MDA7CisJaW5wdXRfZGV2LT5hYnNmdXp6W0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmdXp6W0FCU19ZXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmbGF0W0FCU19YXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNmbGF0W0FCU19ZXSA9IDA7CisjZW5kaWYKKworI2lmIDAKKwkvKiB0aGlzIHdpbGwganVzdCByZWR1Y2UgdGhlIHByZWNpc2lvbiAqLworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWF0gPSA4OyAvKiBleHBlcmltZW50YWw7IG1heSBuZWVkIHRvIGNoYW5nZSAqLworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWV0gPSA4OyAvKiBleHBlcmltZW50YWw7IG1heSBuZWVkIHRvIGNoYW5nZSAqLworI2VuZGlmCisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UuCisJICovCisJcmVzID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG1pbWlvLT5pZGV2KTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImlucHV0X3JlZ2lzdGVyX2RldmljZSBmYWlsdXJlICglZClcbiIsCisJCQlyZXMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnB1dDogJXMgb24gJXMgKHJlcyA9ICVkKS5cbiIsCisJCWlucHV0X2Rldi0+bmFtZSwgaW5wdXRfZGV2LT5waHlzLCByZXMpOworCisJdXNiX3NldF9pbnRmZGF0YShpZmMsIG1pbWlvKTsKKwltaW1pby0+cHJlc2VudCA9IDE7CisKKwkvKgorCSAqIFN1Ym1pdCB0aGUgaW5wdXQgdXJiIHRvIHRoZSB1c2Igc3Vic3lzdGVtLgorCSAqLworCW1pbWlvLT5pbi51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCXJlcyA9IHVzYl9zdWJtaXRfdXJiKG1pbWlvLT5pbi51cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXMpIHsKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmUgKCVkKVxuIiwKKwkJCXJlcyk7CisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gZ3JlZXQgdGhlIG1pbWlvIGFmdGVyIGdpdmluZworCSAqIGl0IHNvbWUgcG9zdC1pbml0IHNldHRsaW5nIHRpbWUuCisJICoKKwkgKiBub3RlOiBzb21ldGltZXMgdGhpcyBzbGVlcCBpbnRlcnZhbCBpc24ndAorCSAqIGxvbmcgZW5vdWdoIHRvIHBlcm1pdCB0aGUgZGV2aWNlIHRvIHJlLWluaXQKKwkgKiBhZnRlciBhIGhvdC1zd2FwOyBtYXliZSBuZWVkIHRvIGJ1bXAgaXQgdXAuCisJICoKKwkgKiBBcyBpdCBpcywgdGhpcyBwcm9iYWJseSBicmVha3MgbW9kdWxlIHVubG9hZGluZyBzdXBwb3J0IQorCSAqLworCW1zbGVlcCgxMDI0KTsKKworCXJlcyA9IG1pbWlvX2dyZWV0KG1pbWlvKTsKKwlpZiAocmVzID09IDApIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0ZWQgT0suXG4iKTsKKwkJbWltaW8tPmdyZWV0ZWQgPSAxOworCQltaW1pby0+cnhoYW5kbGVyID0gbWltaW9fcnhfaGFuZGxlcjsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiTWltaW8gZ3JlZXQgRmFpbHVyZSAoJWQpXG4iLCByZXMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9taW1pb19yeF9wZW51cGRvd24oc3RydWN0IG1pbWlvICptaW1pbywKKwkJCQkgICAgIGludCBkb3duLAorCQkJCSAgICAgY29uc3QgY2hhciAqY29uc3QgaW5zdHJbXSwKKwkJCQkgICAgIGNvbnN0IGludCBpbnN0cl9vZnN0W10pCit7CisJaW50IHBlbmlkLCB4OworCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCAoZG93biA/IDQgOiAzKSkKKwkJcmV0dXJuIDE7IAkJLyogcGFydGlhbCBwa3QgKi8KKworCWlmIChkb3duKSB7CisJCXggPSAqbWltaW8tPnBrdGJ1Zi5wIF4gKihtaW1pby0+cGt0YnVmLnAgKyAxKSBeCisJCQkqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDMpKSB7CisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiRVZfUEVOJXM6IGJhZCB4c3VtLlxuIiwKKwkJCQlkb3duID8gIkRPV04iOiJVUCIpOworCQkJLyogc2tpcCB0aGlzIGV2ZW50IGRhdGEgKi8KKwkJCW1pbWlvLT5wa3RidWYucCArPSA0OworCQkJLyogZGVjb2RlIGFueSByZW1haW5pbmcgZXZlbnRzICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlwZW5pZCA9IG1pbWlvLT5wa3RidWYuaW5zdHIgPSAqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQlpZiAocGVuaWQgPiBNSU1JT19QRU5fTUFYKSB7CisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LAorCQkJCSJVbm1hcHBlZCBwZW5JRCAobm90IGluIFswLCAlZF0pOiAlZFxuIiwKKwkJCQlNSU1JT19QRU5fTUFYLCAoaW50KW1pbWlvLT5wa3RidWYuaW5zdHIpOworCQkJcGVuaWQgPSBtaW1pby0+cGt0YnVmLmluc3RyID0gMDsKKwkJfQorCQltaW1pby0+bGFzdF9wZW5fZG93biA9IHBlbmlkOworCX0gZWxzZSB7CisJCXBlbmlkID0gbWltaW8tPmxhc3RfcGVuX2Rvd247CisJfQorCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICIlcyAoaWQgJWQsIGNvZGUgJWQpICVzLlxuIiwgaW5zdHJbcGVuaWRdLAorCQlpbnN0cl9vZnN0W3BlbmlkXSwgcGVuaWQsIGRvd24gPyAiZG93biIgOiAidXAiKTsKKworCWlmIChpbnN0cl9vZnN0W3BlbmlkXSA+PSAwKSB7CisJCWludCBjb2RlID0gQlROX1RPT0xfUEVOICsgaW5zdHJfb2ZzdFtwZW5pZF07CisJCWludCB2YWx1ZSA9IGRvd24gPyBET1dOVkFMVUUgOiBVUFZBTFVFOworCQlpZiAoY29kZSA+IEtFWV9NQVgpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBjb2RlICglZCkgPiBLRVlfTUFYXG4iLCBjb2RlKTsKKwkJaWYgKCF0ZXN0X2JpdChjb2RlLCBtaW1pby0+aWRldi0+a2V5Yml0KSkKKwkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnB1dF9ldmVudCB3aWxsIGlnbm9yZSAiCisJCQkJIi0tIGJpdCBmb3IgY29kZSAoJWQpIG5vdCBlbmFibGVkXG4iLCBjb2RlKTsKKwkJaWYgKCEhdGVzdF9iaXQoY29kZSwgbWltaW8tPmlkZXYtPmtleSkgPT0gdmFsdWUpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBiaXQgZm9yIGNvZGUgKCVkKSBhbHJlYWR5IHNldCB0byAlZFxuIiwKKwkJCQljb2RlLCB2YWx1ZSk7CisJCWlmICh2YWx1ZSAhPSBET1dOVkFMVUUpIHsKKwkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJaW5wdXRfcmVwb3J0X2tleShtaW1pby0+aWRldiwgY29kZSwgdmFsdWUpOworCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCX0gZWxzZSB7CisJCQkvKiB3YWl0IHVudGlsIHdlIGdldCBzb21lIGNvb3JkaW5hdGVzICovCisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAicGVuSUQgb2Zmc2V0WyVkXSA9PSAlZCBpcyA8IDAgIgorCQkJIi0gbm90IHNlbmRpbmdcbiIsIHBlbmlkLCBpbnN0cl9vZnN0W3BlbmlkXSk7CisJfQorCW1pbWlvLT5wa3RidWYucCArPSBkb3duID8gNCA6IDM7IC8qIDMgZm9yIHVwLCA0IGZvciBkb3duICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF5IHR1bmVkIGZvciBwYXJ0aWFsLXBhY2tldCBleGNpdGVtZW50LgorICoKKyAqIFRoaXMgcm91dGluZSBidWZmZXJzIGRhdGEgcGFja2V0cyByZWNlaXZlZCBmcm9tIHRoZSBtaW1pbyBkZXZpY2UKKyAqIGluIHRoZSBtaW1pbydzIGRhdGEgc3BhY2UuICBUaGlzIGJ1ZmZlcmluZyBpcyBuZWNlc3NhcnkgYmVjYXVzZQorICogdGhlIG1pbWlvJ3MgaW4gZW5kcG9pbnQgY2FuIHNlcnZlIHVzIHBhcnRpYWwgcGFja2V0cyBvZiBkYXRhLCBhbmQKKyAqIHdlIHdhbnQgdGhlIGRyaXZlciB0byBzdXBwb3J0IHRoZSBzZXJ2aWNpbmcgb2YgbXVsdGlwbGUgbWltaW9zLgorICogRW1waXJpY2FsIGV2aWRlbmNlIGdhdGhlcmVkIHNvIGZhciBzdWdnZXN0cyB0aGF0IHRoZSBtZXRob2Qgb2YKKyAqIGJ1ZmZlcmluZyBwYWNrZXQgZGF0YSBpbiB0aGUgbWltaW8ncyBkYXRhIHNwYWNlIHdvcmtzLiAgUHJldmlvdXMKKyAqIHZlcnNpb25zIG9mIHRoaXMgZHJpdmVyIGRpZCBub3QgYnVmZmVyIHBhY2tldCBkYXRhIGluIGVhY2ggbWltaW8ncworICogZGF0YS1zcGFjZSwgYW5kIHdlcmUgdGhlcmVmb3JlIG5vdCBhYmxlIHRvIHNlcnZpY2UgbXVsdGlwbGUgbWltaW9zLgorICogTm90ZSB0aGF0IHNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIGlzIHJ1bm5pbmcgaW4gaW50ZXJydXB0CisgKiBjb250ZXh0LCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoaXMgcm91dGluZSBkb2VzIG5vdAorICogYmVjb21lIGJsb2F0ZWQsIGFuZCBpdCBtYXkgYmUgdGhhdCBhbm90aGVyIHNwaW5sb2NrIGlzIG5lZWRlZCBpbiBlYWNoCisgKiBtaW1pbyB0byBndWFyZCB0aGUgYnVmZmVyZWQgcGFja2V0IGRhdGEgcHJvcGVybHkuCisgKi8KK3N0YXRpYyB2b2lkIG1pbWlvX3J4X2hhbmRsZXIoc3RydWN0IG1pbWlvICptaW1pbywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWltaW8tPmlkZXYtPmRldjsKKwl1bnNpZ25lZCBpbnQgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc3RyW10gPSB7CisJCSI/MCIsCisJCSJibGFjayBwZW4iLCAiYmx1ZSBwZW4iLCAiZ3JlZW4gcGVuIiwgInJlZCBwZW4iLAorCQkiYnJvd24gcGVuIiwgIm9yYW5nZSBwZW4iLCAicHVycGxlIHBlbiIsICJ5ZWxsb3cgcGVuIiwKKwkJImJpZyBlcmFzZXIiLCAibGlsIGVyYXNlciIsCisJCSI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IiwgIj8xNiIsCisJCSJtaW1pbyBpbnRlcmFjdGl2ZSIsICJpbnRlcmFjdGl2ZSBidXR0b24xIiwKKwkJImludGVyYWN0aXZlIGJ1dHRvbjIiCisJfTsKKworCS8qIE1pbWlvIEludGVyYWN0aXZlIGdpdmVzOgorCSAqIGRvd246IFsweDIyIDB4MDEgMHgxMSAweDMyIDB4MjRdCisJICogYjEgIDogWzB4MjIgMHgwMSAweDEyIDB4MzEgMHgyNF0KKwkgKiBiMiAgOiBbMHgyMiAweDAxIDB4MTMgMHgzMCAweDI0XQorCSAqLworCXN0YXRpYyBjb25zdCBpbnQgaW5zdHJfb2ZzdFtdID0geworCQktMSwKKwkJMCwgMSwgMiwgMywKKwkJOSwgOSwgOSwgOSwKKwkJNCwgNSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJNiwgNywgOCwKKwl9OworCisJbWVtY3B5KG1pbWlvLT5wa3RidWYucSwgZGF0YSwgbmJ5dGVzKTsKKwltaW1pby0+cGt0YnVmLnEgKz0gbmJ5dGVzOworCisJd2hpbGUgKG1pbWlvLT5wa3RidWYucCA8IG1pbWlvLT5wa3RidWYucSkgeworCQlpbnQgdCA9ICptaW1pby0+cGt0YnVmLnA7CisJCXN3aXRjaCAodCkgeworCQljYXNlIE1JTUlPX0VWX1BFTlVQOgorCQljYXNlIE1JTUlPX0VWX1BFTkRPV046CisJCQlpZiAoaGFuZGxlX21pbWlvX3J4X3BlbnVwZG93bihtaW1pbywKKwkJCQkJCSAgICAgIHQgPT0gTUlNSU9fRVZfUEVORE9XTiwKKwkJCQkJCSAgICAgIGluc3RyLCBpbnN0cl9vZnN0KSkKKwkJCQlyZXR1cm47IC8qIHBhcnRpYWwgcGFja2V0ICovCisJCQlicmVhazsKKworCQljYXNlIE1JTUlPX0VWX1BFTkRBVEE6CisJCQlpZiAobWltaW8tPnBrdGJ1Zi5xIC0gbWltaW8tPnBrdGJ1Zi5wIDwgNikKKwkJCQkvKiBwYXJ0aWFsIHBrdCAqLworCQkJCXJldHVybjsKKwkJCXggPSAqbWltaW8tPnBrdGJ1Zi5wIF4gKihtaW1pby0+cGt0YnVmLnAgKyAxKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyAyKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyAzKSBeCisJCQkJKihtaW1pby0+cGt0YnVmLnAgKyA0KTsKKwkJCWlmICh4ICE9ICoobWltaW8tPnBrdGJ1Zi5wICsgNSkpIHsKKwkJCQlkZXZfZGJnKGRldiwgIkVWX1BFTkRBVEE6IGJhZCB4c3VtLlxuIik7CisJCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDY7IC8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQkJYnJlYWs7IC8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJfQorCQkJeCA9ICoobWltaW8tPnBrdGJ1Zi5wICsgMSk7CisJCQl4IDw8PSA4OworCQkJeCB8PSAqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQkJeSA9ICoobWltaW8tPnBrdGJ1Zi5wICsgMyk7CisJCQl5IDw8PSA4OworCQkJeSB8PSAqKG1pbWlvLT5wa3RidWYucCArIDQpOworCQkJZGV2X2RiZyhkZXYsICJjb29yZDogKCVkLCAlZClcbiIsIHgsIHkpOworCQkJaWYgKGluc3RyX29mc3RbbWltaW8tPnBrdGJ1Zi5pbnN0cl0gPj0gMCkgeworCQkJCWludCBjb2RlID0gQlROX1RPT0xfUEVOICsKKwkJCQkJICAgaW5zdHJfb2ZzdFttaW1pby0+bGFzdF9wZW5fZG93bl07CisjaWYgMAorCQkJCS8qIFV0dGVyIGhhY2sgdG8gZW5zdXJlIHdlIGdldCBmb3J3YXJkZWQgX0FORF8KKwkJCQkgKiBzbyB3ZSBjYW4gaWRlbnRpZnkgd2hlbiBhIGNvbXBsZXRlIHNpZ25hbCBpcworCQkJCSAqIHJlY2VpdmVkICovCisJCQkJbWltaW8tPmlkZXYtPmFic1tBQlNfWV0gPSAtMTsKKwkJCQltaW1pby0+aWRldi0+YWJzW0FCU19YXSA9IC0xOworI2VuZGlmCisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfcmVwb3J0X2FicyhtaW1pby0+aWRldiwgQUJTX1gsIHgpOworCQkJCWlucHV0X3JlcG9ydF9hYnMobWltaW8tPmlkZXYsIEFCU19ZLCB5KTsKKwkJCQkvKiBmYWtlIGEgcGVudXAgKi8KKwkJCQljaGFuZ2VfYml0KGNvZGUsIG1pbWlvLT5pZGV2LT5rZXkpOworCQkJCWlucHV0X3JlcG9ydF9rZXkobWltaW8tPmlkZXYsCisJCQkJCQkgY29kZSwKKwkJCQkJCSBET1dOVkFMVUUpOworCQkJCS8qIGFsd2F5cyBzeW5jIGhlcmUgKi8KKwkJCQltaW1pby0+aWRldi0+c3luYyA9IDA7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQl9CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNjsKKwkJCWJyZWFrOworCQljYXNlIE1JTUlPX0VWX01FTVJFU0VUOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDcpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQlkZXZfZGJnKGRldiwgIm1lbS1yZXNldC5cbiIpOworCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMCwgMSk7CisJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMCwgMCk7CisJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCW1pbWlvLT5wa3RidWYucCArPSA3OworCQkJYnJlYWs7CisJCWNhc2UgTUlNSU9fRVZfQUNDOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDQpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMik7CisJCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDMpKSB7CisJCQkJZGV2X2RiZyhkZXYsICJFVl9BQ0M6IGJhZCB4c3VtLlxuIik7CisJCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDQ7IC8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQkJYnJlYWs7IC8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJfQorCQkJc3dpdGNoICgqKG1pbWlvLT5wa3RidWYucCArIDIpKSB7CisJCQljYXNlIEFDQ19ORVdQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJuZXctcGFnZS5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8xLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMSwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19UQUdQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJ0YWctcGFnZS5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8yLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMiwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19QUklOVFBBR0U6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInByaW50LXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl8zLCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMywgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19NQVhJTUlaRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LAorCQkJCQkibWF4aW1pemUtd2luZG93LlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzQsIDEpOworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl80LCAwKTsKKwkJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNDX0ZJTkRDVExQTkw6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImZpbmQtY3RsLXBhbmVsLlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7ICovCisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzUsIDEpOworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl81LCAwKTsKKwkJCQlpbnB1dF9zeW5jKG1pbWlvLT5pZGV2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNDX0RPTkU6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImFjYy1kb25lLlxuIik7CisJCQkJLyogbm8gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byB0aGUgaW5wdXQKKwkJCQkgKiBzdWJzeXN0ZW0gZm9yIHRoaXMgZGV2aWNlIGV2ZW50LgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZGJnKGRldiwgInVua25vd24gYWNjIGV2ZW50LlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWltaW8tPnBrdGJ1Zi5wKys7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogTm8gcGFydGlhbCBldmVudCB3YXMgcmVjZWl2ZWQsIHNvIHJlc2V0IG1pbWlvJ3MgcGt0YnVmIHB0cnMuCisJICovCisJbWltaW8tPnBrdGJ1Zi5wID0gbWltaW8tPnBrdGJ1Zi5xID0gbWltaW8tPnBrdGJ1Zi5idWY7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fdHgoc3RydWN0IG1pbWlvICptaW1pbywgY29uc3QgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQoreworCWludCByc2x0OworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoIShpc3ZhbGlkdHhzaXplKG5ieXRlcykpKSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJpbnZhbGlkIGFyZzogbmJ5dGVzOiAlZC5cbiIsCisJCQluYnl0ZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEluaXQgdGhlIG91dCB1cmIgYW5kIGNvcHkgdGhlIGRhdGEgdG8gc2VuZC4KKwkgKi8KKwltaW1pby0+b3V0LnVyYi0+ZGV2ID0gbWltaW8tPnVkZXY7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBuYnl0ZXM7CisJbWVtY3B5KG1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgbmJ5dGVzKTsKKworCS8qCisJICogU2VuZCB0aGUgZGF0YS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCW1pbWlvLT50eGZsYWdzID0gTUlNSU9fVFhXQUlUOworCXJzbHQgPSB1c2Jfc3VibWl0X3VyYihtaW1pby0+b3V0LnVyYiwgR0ZQX0FUT01JQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJyc2x0OiAlZC5cbiIsIHJzbHQpOworCisJaWYgKHJzbHQpIHsKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmU6ICVkLlxuIiwKKwkJCXJzbHQpOworCQlyZXR1cm4gcnNsdDsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIGNvbXBsZXRpb24gdG8gYmUgc2lnbmFsbGVkICh0aGUgbWltaW9faXJxX291dAorCSAqIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIG9yIE1JTUlPX1RYRE9ORSBpbiB3aXRoIHR4ZmxhZ3MpLgorCSAqLworCXRpbWVvdXQgPSBIWjsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKCZtaW1pby0+d2FpdHEsICZ3YWl0KTsKKworCXdoaWxlICh0aW1lb3V0ICYmICgobWltaW8tPnR4ZmxhZ3MgJiBNSU1JT19UWERPTkUpID09IDApKSB7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQlybWIoKTsKKwl9CisKKwlpZiAoKG1pbWlvLT50eGZsYWdzICYgTUlNSU9fVFhET05FKSA9PSAwKQorCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidHggdGltZWQgb3V0LlxuIik7CisKKwkvKgorCSAqIE5vdyB0aGF0IGNvbXBsZXRpb24gaGFzIGJlZW4gc2lnbmFsbGVkLAorCSAqIHVubGluayB0aGUgdXJiIHNvIHRoYXQgaXQgY2FuIGJlIHJlY3ljbGVkLgorCSAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJm1pbWlvLT53YWl0cSwgJndhaXQpOworCXVzYl91bmxpbmtfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBtaW1pb19pbml0KHZvaWQpCit7CisJaW50IHJzbHQ7CisKKwlyc2x0ID0gdXNiX3JlZ2lzdGVyKCZtaW1pb19kcml2ZXIpOworCWlmIChyc2x0ICE9IDApIHsKKwkJZXJyKCIlczogdXNiX3JlZ2lzdGVyIGZhaWx1cmU6ICVkIiwgX19mdW5jX18sIHJzbHQpOworCQlyZXR1cm4gcnNsdDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6IgorCSAgICAgICBEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJcmV0dXJuIHJzbHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaW1pb19leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm1pbWlvX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1pbWlvX2luaXQpOworbW9kdWxlX2V4aXQobWltaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvYW1zZHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTEyM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZHZXRBbXNkdVN1YkZyYW1lICAgICAgICAgICovCisvKiAgICAgIEdldCBhIHN1YmZyYW1lIGZyb20gYS1NU0RVLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBBLU1TRFUgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogb2Zmc2V0IG9mIHN1YmZyYW1lIGluIHRoZSBBLU1TRFUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTlVMTCBvciBzdWJmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRBbXNkdVN1YkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIG9mZnNldCkKK3sKKyAgICB1MTZfdCBzdWJmcmFtZUxlbjsKKyAgICB1MTZfdCBhbXNkdUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIHpidWZfdCogbmV3QnVmOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfQU1TRFUoZGV2LCBidWYsIGFtc2R1TGVuKTsKKworICAgIC8qIFZlcmlmeSBBLU1TRFUgbGVuZ3RoICovCisgICAgaWYgKGFtc2R1TGVuIDwgKCpvZmZzZXQgKyAxNCkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBMb2NhdGUgQS1NU0RVIHN1YmZyYW1lIGJ5IG9mZnNldCBhbmQgdmVyaWZ5IHN1YmZyYW1lIGxlbmd0aCAqLworICAgIHN1YmZyYW1lTGVuID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsICpvZmZzZXQgKyAxMikgPDwgOCkgKworICAgICAgICAgICAgICAgICAgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKm9mZnNldCArIDEzKTsKKyAgICBpZiAoc3ViZnJhbWVMZW4gPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIFZlcmlmeSBBLU1TRFUgc3ViZnJhbWUgbGVuZ3RoICovCisgICAgaWYgKCgqb2Zmc2V0KzE0K3N1YmZyYW1lTGVuKSA8PSBhbXNkdUxlbikKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciAqLworICAgICAgICBpZiAoKG5ld0J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMjQrMitzdWJmcmFtZUxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgIC8qIENvcHkgYW5kIGNvbnZlcnQgc3ViZnJhbWUgdG8gd2xhbiBmcmFtZSBmb3JtYXQgKi8KKyAgICAgICAgICAgIC8qIFNIQUxMIE5PVCBJTkNMVURFIFFPUyBhbmQgQU1TRFUgaGVhZGVyLiBSYXkgMjAwNzA4MDcgRm9yIFZpc3RhICovCisgICAgICAgICAgICB6ZlJ4QnVmZmVyQ29weShkZXYsIG5ld0J1ZiwgYnVmLCAwLCAwLCAyNCk7CisgICAgICAgICAgICB6ZlJ4QnVmZmVyQ29weShkZXYsIG5ld0J1ZiwgYnVmLCAyNCwgKm9mZnNldCsxNCwgc3ViZnJhbWVMZW4pOworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgMjQrc3ViZnJhbWVMZW4pOworI2Vsc2UKKyAgICAgICAgICAgIC8qIENvcHkgc3ViZnJhbWUgdG8gbmV3IGJ1ZmZlciAqLworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMCwgKm9mZnNldCwgMTQrc3ViZnJhbWVMZW4pOworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgMTQrc3ViZnJhbWVMZW4pOworI2VuZGlmCisgICAgICAgICAgICAvKiBVcGRhdGUgb2Zmc2V0ICovCisgICAgICAgICAgICAqb2Zmc2V0ICs9ICgoKDE0K3N1YmZyYW1lTGVuKSszKSAmIDB4ZmZmYyk7CisKKyAgICAgICAgICAgIC8qIFJldHVybiBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgcmV0dXJuIG5ld0J1ZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEZUFtc2R1ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIERlLUFNU0RVLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBBLU1TRFUgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogVkFQIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB1MTZfdCBvZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIrWk1fU0laRV9PRl9RT1NfQ1RSTDsKKyAgICB6YnVmX3QqIHN1YmZyYW1lQnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIGlmIChlbmNyeU1vZGUgPT0gWk1fQUVTIHx8IGVuY3J5TW9kZSA9PSBaTV9US0lQKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ICs9IChaTV9TSVpFX09GX0lWICsgWk1fU0laRV9PRl9FWFRfSVYpOworICAgIH0KKyAgICBlbHNlIGlmIChlbmNyeU1vZGUgPT0gWk1fV0VQNjQgfHwgZW5jcnlNb2RlID09IFpNX1dFUDEyOCkKKyAgICB7CisgICAgICAgIG9mZnNldCArPSBaTV9TSVpFX09GX0lWOworICAgIH0KKworICAgIC8qIFJlcGVhdGx5IGNhbGxpbmcgemZHZXRBbXNkdVN1YkZyYW1lKCkgdW50aWwgTlVMTCByZXR1cm5lZCAqLworICAgIHdoaWxlICgoc3ViZnJhbWVCdWYgPSB6ZkdldEFtc2R1U3ViRnJhbWUoZGV2LCBidWYsICZvZmZzZXQpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdkV0aCAhPSBOVUxMKQorICAgIAl7CisgICAgICAgICAgICB3ZC0+emZjYlJlY3ZFdGgoZGV2LCBzdWJmcmFtZUJ1ZiwgKHU4X3QpdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgIH0KKyAgICB9CisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZkMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYwpAQCAtMCwwICsxLDM2MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGNhZ2cuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgQS1NUERVIGFnZ3JlZ2F0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2V4dGVybiB1OF90IHpjVXBUb0FjWzhdOworY29uc3QgdThfdCBwcmlbXSA9IHszLDMsMiwzLDIsMSwzLDIsMSwwfTsKKworCit1MTZfdCBhZ2dyX2NvdW50OwordTMyX3Qgc3VjY2Vzc19tcGR1OwordTMyX3QgdG90YWxfbXBkdTsKKwordm9pZCB6ZkFnZ0luaXQoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaSxqOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICAvKgorICAgICAqIHJlc2V0IHN0YSBpbmZvcm1hdGlvbgorICAgICAqLworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+YWdnSW5pdGlhdGVkID0gMDsKKyAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisgICAgd2QtPmFkZGJhQ291bnQgPSAwOworICAgIHdkLT5yZW9yZGVyID0gMTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaj0wOyBqPFpNX0FDOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPmFnZ1N0YVtpXS5hZ2dRTnVtYmVyW2pdID0gWk1fQUdHX1BPT0xfU0laRTsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0uYWdnRmxhZ1tqXSA9IHdkLT5hZ2dTdGFbaV0uY291bnRbal0gPSAwOworICAgICAgICAgICAgd2QtPmFnZ1N0YVtpXS50aWRfdHhbal0gPSBOVUxMOworICAgICAgICAgICAgd2QtPmFnZ1N0YVtpXS50aWRfdHhbaisxXSA9IE5VTEw7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogcmVzZXQgVHgvUnggYWdncmVnYXRpb24gcXVldWUgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB3ZC0+YWdnU3RhdGUgPSAwOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHJlc2V0IHR4IGFnZ3JlZ2F0aW9uIHF1ZXVlCisgICAgICAgICAqLworICAgICAgICB3ZC0+YWdnUVBvb2xbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgaWYoIXdkLT5hZ2dRUG9vbFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ0hlYWQgPSB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1RhaWwgPQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkID0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dSZWFkeSA9CisgICAgICAgIHdkLT5hZ2dRUG9vbFtpXS0+Y2xlYXJGbGFnID0gd2QtPmFnZ1FQb29sW2ldLT5kZWxldGVGbGFnID0gMDsKKyAgICAgICAgLy93ZC0+YWdnUVBvb2xbaV0tPmFnZ1NpemUgPSAxNjsKKworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCByeCBhZ2dyZWdhdGlvbiBxdWV1ZQorICAgICAgICAgKi8KKyAgICAgICAgd2QtPnRpZF9yeFtpXSA9IHpmd01lbUFsbG9jYXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBhZ2dfdGlkX3J4KSk7CisgICAgICAgIGlmICghd2QtPnRpZF9yeFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3ZC0+dGlkX3J4W2ldLT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHdkLT50aWRfcnhbaV0tPnNlcV9zdGFydCA9IHdkLT50aWRfcnhbaV0tPmJhd19oZWFkID0gXAorICAgICAgICB3ZC0+dGlkX3J4W2ldLT5iYXdfdGFpbCA9IDA7CisgICAgICAgIHdkLT50aWRfcnhbaV0tPnNxX2V4Y2VlZF9jb3VudCA9IHdkLT50aWRfcnhbaV0tPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgICAgIGZvciAoaj0wOyBqPD1aTV9BR0dfQkFXX1NJWkU7IGorKykKKyAgICAgICAgICAgIHdkLT50aWRfcnhbaV0tPmZyYW1lW2pdLmJ1ZiA9IDA7CisgICAgICAgIC8qCisgICAgICAgICAqIHJlc2V0IEFEREJBIGV4Y2hhbmdlIHN0YXR1cyBjb2RlCisgICAgICAgICAqIDA6IE5VTEwKKyAgICAgICAgICogMTogQUREQkEgUmVxdWVzdCBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDI6IEFDSyBmb3IgQUREQkEgUmVxdWVzdCBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDM6IEFEREJBIFJlc3BvbnNlIHNlbnQvcmVjZWl2ZWQKKyAgICAgICAgICogNDogQUNLIGZvciBBRERCQSBSZXNwb25zZSBzZW50L3JlY2VpdmVkCisgICAgICAgICAqLworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5hZGRCYUV4Y2hhbmdlU3RhdHVzQ29kZSA9IDA7CisKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZkFnZ1RhbGx5UmVzZXQoZGV2KTsKKyAgICBERVNUUS5pbml0ID0gemZBZ2dEZXN0SW5pdDsKKyAgICBERVNUUS5pbml0KGRldik7CisgICAgd2QtPmFnZ0luaXRpYXRlZCA9IDE7CisgICAgYWdncl9jb3VudCA9IDA7CisgICAgc3VjY2Vzc19tcGR1ID0gMDsKKyAgICB0b3RhbF9tcGR1ID0gMDsKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKyAgICBCQVcgPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICBpZighQkFXKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCQVctPmluaXQgPSB6ZkJhd0luaXQ7CisgICAgQkFXLT5pbml0KGRldik7CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ0dldFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFNUQSBBSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgYnVmIGFzIGlucHV0LCB1c2UgdGhlIGRlc3QgYWRkcmVzcyBvZiBidWYgYXMgaW5kZXggdG8gICAgICAqLworLyogICAgICBzZWFyY2ggU1RBIEFJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIGZvciBvbmUgcGFydGljdWxhciBwYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK3UxNl90IHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZCA9IDA7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyNpZiBaTV9BR0dfRlBHQV9ERUJVRworICAgIGlkID0gMDsKKyNlbmRpZgorCisgICAgcmV0dXJuIGlkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4R2V0UXVldWUgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFF1ZXVlIFBvb2wgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgYWlkIGFzIGlucHV0LCBsb29rIGZvciB0aGUgcXVldWUgaW5kZXggYXNzb2NpYXRlZCAgICAgICAgICAqLworLyogICAgICB3aXRoIHRoaXMgYWlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4R2V0UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkKQoreworICAgIC8vdTE2X3QgICBpOworICAgIFRJRF9UWCAgdGlkX3R4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogbm90IGEgU1RBIGFpZAorICAgICAqLworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF90eCA9IHdkLT5hZ2dTdGFbYWlkXS50aWRfdHhbdGlkXTsKKyAgICBpZiAoIXRpZF90eCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKDAgPT0gdGlkX3R4LT5hZ2dRRW5hYmxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gdGlkX3R4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeE5ld1F1ZXVlICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBRdWV1ZSBQb29sIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGFpZCBhcyBpbnB1dCwgZmluZCBhIG5ldyBxdWV1ZSBmb3IgdGhpcyBhaWQuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIGk7CisgICAgVElEX1RYICB0aWRfdHg9TlVMTDsKKyAgICB1MTZfdCAgIGFjID0gemNVcFRvQWNbdGlkJjB4N10gJiAweDM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogbm90IGEgU1RBIGFpZAorICAgICAqLworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIGZpbmQgb25lIG5ldyBxdWV1ZSBmb3Igc3RhCisgICAgICovCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIHRoaXMgcSBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1FFbmFibGVkID0gMTsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnUVNUQSA9IGFpZDsKKyAgICAgICAgICAgIHRpZF90eC0+YWMgPSBhYzsKKyAgICAgICAgICAgIHRpZF90eC0+dGlkID0gdGlkOworICAgICAgICAgICAgdGlkX3R4LT5hZ2dIZWFkID0gdGlkX3R4LT5hZ2dUYWlsID0gdGlkX3R4LT5zaXplID0gMDsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnUmVhZHkgPSAwOworICAgICAgICAgICAgd2QtPmFnZ1N0YVthaWRdLnRpZF90eFt0aWRdID0gdGlkX3R4OworICAgICAgICAgICAgdGlkX3R4LT5kc3RbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHRpZF90eC0+ZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgICAgICAgICB0aWRfdHgtPmRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4RW5xdWV1ZSAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFN0YXR1cyBjb2RlIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGFpZCxhYyxxbnVtLGJ1ZikgYXMgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhaWQgOiBhc3NvY2lhdGVkIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHFudW06IHRoZSBxdWV1ZSBudW1iZXIgdG8gd2hpY2ggd2lsbCBiZSBlbnF1ZXVlZCAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiB0aGUgcGFja2V0IHRvIGJlIHF1ZXVlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0dXMgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQsIFRJRF9UWCB0aWRfdHgpCit7CisgICAgLy91MTZfdCAgIHFsZW4sIGZyYW1lTGVuOworICAgIHUzMl90ICAgdGltZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisKKyAgICBpZiAodGlkX3R4LT5zaXplIDwgKFpNX0FHR1FfU0laRSAtIDIpKQorICAgIHsKKyAgICAgICAgLyogUXVldWUgbm90IGZ1bGwgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIGJ1ZmZlciBjb3B5CisgICAgICAgICAqIGluIHpmd0J1ZkZyZWUgd2lsbCByZXR1cm4gYSBuZGlzbXNlbmRjb21wbGV0ZQorICAgICAgICAgKiB0byByZXNvbHZlIHRoZSBzeW5jaHJvbml6ZSBwcm9ibGVtIGluIGFnZ3JlZ2F0ZQorICAgICAgICAgKi8KKworICAgICAgICB1OF90ICAgIHNlbmRDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYnVmID0gYnVmOworICAgICAgICB0aW1lID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYXJyaXZhbFRpbWUgPSB0aW1lOworICAgICAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dIZWFkXS5iYXdfcmV0cmFuc21pdCA9IDA7CisKKyAgICAgICAgdGlkX3R4LT5hZ2dIZWFkID0gKCh0aWRfdHgtPmFnZ0hlYWQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLKTsKKyAgICAgICAgdGlkX3R4LT5sYXN0QXJyaXZhbCA9IHRpbWU7CisgICAgICAgIHRpZF90eC0+c2l6ZSsrOworICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgaWYgKGJ1ZiAmJiAodGlkX3R4LT5zaXplIDwgKFpNX0FHR1FfU0laRSAtIDEwKSkpIHsKKyAgICAgICAgICAgIHRpZF90eC0+Y29tcGxldGUgPSB0aWRfdHgtPmFnZ0hlYWQ7CisgICAgICAgICAgICBzZW5kQ29tcGxldGUgPSAxOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKCFERVNUUS5leGlzdChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCkpIHsKKyAgICAgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAidGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgidGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisKKyAgICAgICAgaWYgKGJ1ZiAmJiBzZW5kQ29tcGxldGUgJiYgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+emZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24oZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgLyppZiAodGlkX3R4LT5zaXplID49IDE2ICYmIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSA+IDIwKQorICAgICAgICAgICAgemZBZ2dUeFNlbmQoZGV2LCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldiksIHRpZF90eCk7CisgICAgICAgICovCisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiY2FuJ3QgZW5xdWV1ZSwgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFF1ZXVlIEZ1bGwKKyAgICAgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogem1fbXNnMV9hZ2coWk1fTFZfMCwgIlF1ZXVlIGZ1bGwsIHFudW0gPSAiLCBxbnVtKTsKKyAgICAgICAgICogd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICogemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgICAqIHptX21zZzFfYWdnKFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBWVFhRIGZ1bGwsIGFjPSIsIGFjKTsKKyAgICAgICAgICoKKyAgICAgICAgICogcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICAgKi8KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCFERVNUUS5leGlzdChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCkpIHsKKyAgICAgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworfQorCit1MTZfdCAgICB6ZkFnZ0Rlc3RFeGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIHUxNl90IGFjLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKSB7CisgICAgc3RydWN0IGRlc3QqIGRlc3Q7CisgICAgdTE2X3QgICBleGlzdCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCFERVNUUS5IZWFkW2FjXSkgeworICAgICAgICBleGlzdCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZXN0ID0gREVTVFEuSGVhZFthY107CisgICAgICAgIGlmIChkZXN0LT50aWRfdHggPT0gdGlkX3R4KSB7CisgICAgICAgICAgICBleGlzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoZGVzdC0+bmV4dCAhPSBERVNUUS5IZWFkW2FjXSkgeworICAgICAgICAgICAgICAgIGRlc3QgPSBkZXN0LT5uZXh0OworICAgICAgICAgICAgICAgIGlmIChkZXN0LT50aWRfdHggPT0gdGlkX3R4KXsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGV4aXN0OworfQorCit2b2lkICAgIHpmQWdnRGVzdEluc2VydCh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIHUxNl90IGFjLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKQoreworICAgIHN0cnVjdCBkZXN0KiBuZXdfZGVzdDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3X2Rlc3QgPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgZGVzdCkpOworICAgIGlmKCFuZXdfZGVzdCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmV3X2Rlc3QtPlF0eXBlID0gUXR5cGU7CisgICAgbmV3X2Rlc3QtPnRpZF90eCA9IHRpZF90eDsKKyAgICBpZiAoMCA9PSBRdHlwZSkKKyAgICAgICAgbmV3X2Rlc3QtPnRpZF90eCA9IHRpZF90eDsKKyAgICBlbHNlCisgICAgICAgIG5ld19kZXN0LT52dHhxID0gdnR4cTsKKyAgICBpZiAoIURFU1RRLkhlYWRbYWNdKSB7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgbmV3X2Rlc3QtPm5leHQgPSBuZXdfZGVzdDsKKyAgICAgICAgREVTVFEuSGVhZFthY10gPSBERVNUUS5kZXN0W2FjXSA9IG5ld19kZXN0OworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBuZXdfZGVzdC0+bmV4dCA9IERFU1RRLmRlc3RbYWNdLT5uZXh0OworICAgICAgICBERVNUUS5kZXN0W2FjXS0+bmV4dCA9IG5ld19kZXN0OworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworCisgICAgLy9ERVNUUS5zaXplW2FjXSsrOworICAgIHJldHVybjsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3REZWxldGUoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCBUSURfVFggdGlkX3R4LCB2b2lkKiB2dHhxKQoreworICAgIHN0cnVjdCBkZXN0KiBkZXN0LCAqdGVtcDsKKyAgICB1MTZfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPmRlc3RMb2NrKSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgaWYgKCFERVNUUS5IZWFkW2ldKSBjb250aW51ZTsKKyAgICAgICAgZGVzdCA9IERFU1RRLkhlYWRbaV07CisgICAgICAgIGlmICghZGVzdCkgY29udGludWU7CisKKworICAgICAgICB3aGlsZSAoZGVzdCAmJiAoZGVzdC0+bmV4dCAhPSBERVNUUS5IZWFkW2ldKSkgeworICAgICAgICAgICAgaWYgKFF0eXBlID09IDAgJiYgZGVzdC0+bmV4dC0+dGlkX3R4ID09IHRpZF90eCl7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUXR5cGUgPT0gMSAmJiBkZXN0LT5uZXh0LT52dHhxID09IHZ0eHEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3QgPSBkZXN0LT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChRdHlwZSA9PSAwICYmIGRlc3QtPm5leHQtPnRpZF90eCA9PSB0aWRfdHgpIHx8IChRdHlwZSA9PSAxICYmIGRlc3QtPm5leHQtPnZ0eHEgPT0gdnR4cSkpIHsKKworICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBpZiAodGlkX3R4LT5zaXplKSB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIURFU1RRLkhlYWRbaV0pIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAgPSBkZXN0LT5uZXh0OworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IGRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgREVTVFEuSGVhZFtpXSA9IERFU1RRLmRlc3RbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAvL0RFU1RRLnNpemVbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdC0+bmV4dCA9IGRlc3QtPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsvKiBkbyBub3RoaW5nICovfSAvL3pmd01lbUZyZWUoZGV2LCB0ZW1wLCBzaXplb2Yoc3RydWN0IGRlc3QpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZndNZW1GcmVlKGRldiwgdGVtcCwgc2l6ZW9mKHN0cnVjdCBkZXN0KSk7CisKKyAgICAgICAgICAgIC8qem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmIChERVNUUS5zaXplW2ldID4gMCkKKyAgICAgICAgICAgICAgICBERVNUUS5zaXplW2ldLS07CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgKi8KKyAgICAgICAgfQorCisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkICAgIHpmQWdnRGVzdEluaXQoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgLy93ZC0+ZGVzdFEuSGVhZFtpXS5uZXh0ID0gd2QtPmRlc3RRLkhlYWRbaV07CisgICAgICAgIC8vd2QtPmRlc3RRLmRlc3RbaV0gPSB3ZC0+ZGVzdFEuSGVhZFtpXTsKKyAgICAgICAgLy9ERVNUUS5zaXplW2ldID0gMDsKKyAgICAgICAgREVTVFEuSGVhZFtpXSA9IE5VTEw7CisgICAgfQorICAgIERFU1RRLmluc2VydCAgPSB6ZkFnZ0Rlc3RJbnNlcnQ7CisgICAgREVTVFEuZGVsZXRlICA9IHpmQWdnRGVzdERlbGV0ZTsKKyAgICBERVNUUS5pbml0ICAgID0gemZBZ2dEZXN0SW5pdDsKKyAgICBERVNUUS5nZXROZXh0ID0gemZBZ2dEZXN0R2V0TmV4dDsKKyAgICBERVNUUS5leGlzdCAgID0gemZBZ2dEZXN0RXhpc3Q7CisgICAgREVTVFEucHByaSA9IDA7CisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgZGVzdCogemZBZ2dEZXN0R2V0TmV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpCit7CisgICAgc3RydWN0IGRlc3QgKmRlc3QgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmIChERVNUUS5kZXN0W2FjXSkgeworICAgICAgICBkZXN0ID0gREVTVFEuZGVzdFthY107CisgICAgICAgIERFU1RRLmRlc3RbYWNdID0gREVTVFEuZGVzdFthY10tPm5leHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZXN0ID0gTlVMTDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBkZXN0OworfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCit1MTZfdCAgIHpmQWdnVGlkVHhJbnNlcnRIZWFkKHpkZXZfdCogZGV2LCBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm8sVElEX1RYIHRpZF90eCkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MzJfdCB0aW1lOworICAgIHN0cnVjdCBiYXdfaGVhZGVyICpiYXdfaGVhZGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgYnVmID0gYnVmX2luZm8tPmJ1ZjsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh0aWRfdHgtPnNpemUgPj0gKFpNX0FHR1FfU0laRSAtIDIpKSB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF90eC0+YWdnVGFpbCA9ICh0aWRfdHgtPmFnZ1RhaWwgPT0gMCk/IFpNX0FHR1FfU0laRV9NQVNLOiB0aWRfdHgtPmFnZ1RhaWwgLSAxOworICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmJ1ZiA9IGJ1ZjsKKyAgICAvL3RpbWUgPSB6bV9hZ2dfR2V0VGltZSgpOworICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmFycml2YWxUaW1lID0gYnVmX2luZm8tPnRpbWVzdGFtcDsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5iYXdfcmV0cmFuc21pdCA9IGJ1Zl9pbmZvLT5iYXdfcmV0cmFuc21pdDsKKworICAgIGJhd19oZWFkZXIgPSAmdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYmF3X2hlYWRlcjsKKyAgICBiYXdfaGVhZGVyLT5oZWFkZXJMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJMZW47CisgICAgYmF3X2hlYWRlci0+bWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgIGJhd19oZWFkZXItPnNuYXBMZW4gICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXBMZW47CisgICAgYmF3X2hlYWRlci0+cmVtb3ZlTGVuICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuOworICAgIGJhd19oZWFkZXItPmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+aGVhZGVyLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXIsIDU4KTsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+bWljICAgLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWMgICAsIDgpOworICAgIHpmd01lbW9yeUNvcHkoKHU4X3QgKiliYXdfaGVhZGVyLT5zbmFwICAsICh1OF90ICopYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAgICwgOCk7CisKKyAgICB0aWRfdHgtPnNpemUrKzsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy90aWRfdHgtPmxhc3RBcnJpdmFsID0gdGltZTsKKyAgICBpZiAoMSA9PSB0aWRfdHgtPnNpemUpIHsKKyAgICAgICAgREVTVFEuaW5zZXJ0KGRldiwgMCwgdGlkX3R4LT5hYywgdGlkX3R4LCBOVUxMKTsKKyAgICB9CisKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIweEMyOmluc2VydEhlYWQsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisKK3ZvaWQgICAgemZpVHhDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHx8CisgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKSApIHsKKyAgICAgICAgemZBZ2dUeFNjaGVkdWxlcihkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworVElEX1RYICB6ZkFnZ1R4UmVhZHkoemRldl90KiBkZXYpIHsKKyAgICAvL3N0cnVjdCBkZXN0KiBkZXN0OworICAgIHUxNl90ICAgaTsKKyAgICBUSURfVFggIHRpZF90eCA9IE5VTEw7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPnNpemUgPj0gMTYpIHsKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gdGlkX3R4OworfQorCit1MTZfdCAgIHpmQWdnVmFsaWRUaWRUeCh6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90ICAgaSwgdmFsaWQgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0gPT0gdGlkX3R4KQorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHZhbGlkOworfQorCit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKQoreworICAgIFRJRF9UWCAgdGlkX3R4ID0gTlVMTDsKKyAgICB2b2lkKiAgIHZ0eHE7CisgICAgc3RydWN0IGRlc3QqIGRlc3Q7CisgICAgemJ1Zl90KiAgYnVmOworICAgIHUzMl90IHR4cWwsIG1pbl90eHFsOworICAgIC8vdTE2X3QgYWdncl9zaXplID0gMTsKKyAgICB1MTZfdCB0eHFfdGhyZXNob2xkOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIXdkLT5hZ2dJbml0aWF0ZWQpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZGVidWcgKi8KKyAgICB0eHFsID0gVFhRTDsKKyAgICBtaW5fdHhxbCA9IEFHR19NSU5fVFhRTDsKKworICAgIGlmKHdkLT50eHFfdGhyZXNob2xkKQorICAgICAgICB0eHFfdGhyZXNob2xkID0gd2QtPnR4cV90aHJlc2hvbGQ7CisgICAgZWxzZQorICAgICAgICB0eHFfdGhyZXNob2xkID0gQUdHX01JTl9UWFFMOworCisgICAgdGlkX3R4ID0gemZBZ2dUeFJlYWR5KGRldik7CisgICAgaWYgKHRpZF90eCkgU2NhbkFuZENsZWFyID0gMDsKKyAgICB3aGlsZSAoemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMjAgJiYgKFRYUUwgPCB0eHFfdGhyZXNob2xkIHx8IHRpZF90eCkpIHsKKyAgICAvL3doaWxlICh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgPiAyMCAmJiAoU2NhbkFuZENsZWFyIHx8IHRpZF90eCkpIHsKKyAgICAvL3doaWxlIChUWFFMIDwgdHhxX3RocmVzaG9sZCkgeworICAgICAgICB1MTZfdCBpOworICAgICAgICB1OF90IGFjOworICAgICAgICBzOF90IGRlc3RRX2NvdW50ID0gMDsKKyAgICAvL3doaWxlICgoemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+IDMyKSB7CisKKyAgICAgICAgLy9EYmdQcmludCgiemZBZ2dUeFNjaGVkdWxlcjogaW4gd2hpbGUgbG9vcCIpOworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChERVNUUS5IZWFkW2ldKSBkZXN0UV9jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmICgwID49IGRlc3RRX2NvdW50KSBicmVhazsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBhYyA9IHByaVtERVNUUS5wcHJpXTsgREVTVFEucHByaSA9IChERVNUUS5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBmb3IgKGk9MDsgaTwxMDsgaSsrKXsKKyAgICAgICAgICAgIGlmKERFU1RRLkhlYWRbYWNdKSBicmVhazsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGFjID0gcHJpW0RFU1RRLnBwcmldOyBERVNUUS5wcHJpID0gKERFU1RRLnBwcmkgKyAxKSAlIDEwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAxMCkgYnJlYWs7CisgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGhhdmUgZGVzdCBRIik7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5kZXN0TG9jayA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgZGVzdCA9IERFU1RRLmdldE5leHQoZGV2LCBhYyk7CisgICAgICAgIGlmICghZGVzdCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBEYmdQcmludCgiYnVnIHJlcG9ydCEgREVTVFEuZ2V0TmV4dCBnb3Qgbm90aGluZyEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0LT5RdHlwZSA9PSAwKSB7CisgICAgICAgICAgICB0aWRfdHggPSBkZXN0LT50aWRfdHg7CisKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGhhdmUgdGlkX3R4IFEiKTsKKworICAgICAgICAgICAgaWYodGlkX3R4ICYmIHpmQWdnVmFsaWRUaWRUeChkZXYsIHRpZF90eCkpCisgICAgICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPmRlc3RMb2NrID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAodGlkX3R4ICYmICF0aWRfdHgtPnNpemUpIHsKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHdkLT5hZ2dTdGF0ZSA9PSAwKXsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAgICAgICAgIC8vd2QtPmFnZ1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZ0eHEgPSBkZXN0LT52dHhxOworICAgICAgICAgICAgYnVmID0gemZHZXRWdHhxKGRldiwgYWMpOworICAgICAgICAgICAgem1fYXNzZXJ0KCBidWYgIT0gMCApOworCisgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKworICAgICAgICB9CisgICAgICAgIC8qZmx1c2ggYWxsIGJ1dCA8IDE2IGZyYW1lcyBpbiB0aWRfdHggdG8gVFhRKi8KKyAgICAgICAgdGlkX3R4ID0gemZBZ2dUeFJlYWR5KGRldik7CisgICAgfQorCisgICAgLyp3aGlsZSAoKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPiAzMikgeworICAgIC8vd2hpbGUgKCh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID4gMzIpIHsKKworICAgICAgICBkZXN0UV9jb3VudCA9IDA7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgZGVzdFFfY291bnQgKz0gd2QtPmRlc3RRLnNpemVbaV07CisgICAgICAgIGlmICgwID49IGRlc3RRX2NvdW50KSBicmVhazsKKworICAgICAgICBhYyA9IHByaVt3ZC0+ZGVzdFEucHByaV07IHdkLT5kZXN0US5wcHJpID0gKHdkLT5kZXN0US5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgZm9yIChpPTA7IGk8MTA7IGkrKyl7CisgICAgICAgICAgICBpZih3ZC0+ZGVzdFEuc2l6ZVthY10hPTApIGJyZWFrOworICAgICAgICAgICAgYWMgPSBwcmlbd2QtPmRlc3RRLnBwcmldOyB3ZC0+ZGVzdFEucHByaSA9ICh3ZC0+ZGVzdFEucHByaSArIDEpICUgMTA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMTApIGJyZWFrOworICAgICAgICBkZXN0ID0gd2QtPmRlc3RRLmdldE5leHQoZGV2LCBhYyk7CisgICAgICAgIGlmIChkZXN0LT5RdHlwZSA9PSAwKSB7CisgICAgICAgICAgICB0aWRfdHggPSBkZXN0LT50aWRfdHg7CisgICAgICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgICAgIGlmICghdGlkX3R4LT5zaXplKSB7CisgICAgICAgICAgICAgICAgd2QtPmRlc3RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCh3ZC0+YWdnU3RhdGUgPT0gMCkgJiYgKHRpZF90eC0+c2l6ZSA+PSAxNikpeworICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICAqLworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHggICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gU3RhdHVzIGNvZGUgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBBLU1QRFUgYWdncmVnYXRpb24gZnVuY3Rpb24sICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1hbmFnZW1lbnQgYWdncmVnYXRpb24gcXVldWUsIGNhbGN1bGF0ZSBhcnJpdmFscmF0ZSwgICAgICAgICAgICAqLworLyogICAgICBhZGQvZGVsZXRlIGFuIGFnZ3JlZ2F0aW9uIHF1ZXVlIG9mIGEgc3RyZWFtLCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZW5xdWV1ZSBwYWNrZXRzIGludG8gcmVzcG9uc2libGUgYWdncmVnYXRlIHF1ZXVlLiAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYnVmLCBhYykgYXMgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBwYWNrZXQgYnVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RhdHVzIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCB0aWQpCit7CisgICAgdTE2X3QgYWlkOworICAgIC8vdTE2X3QgcW51bTsKKyAgICAvL3UxNl90IGFnZ2ZsYWcgPSAwOworICAgIC8vdTE2X3QgYXJyaXZhbHJhdGUgPSAwOworICAgIFRJRF9UWCB0aWRfdHg7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYoIXdkLT5hZ2dJbml0aWF0ZWQpCisgICAgeworICAgICAgICByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBhaWQgPSB6ZkFnZ0dldFN0YShkZXYsIGJ1Zik7CisKKyAgICAvL2Fycml2YWxyYXRlID0gemZBZ2dUeEFycml2YWxSYXRlKGRldiwgYWlkLCB0aWQpOworCisgICAgaWYgKDB4ZmZmZiA9PSBhaWQpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTVEEgbm90IGFzc29jaWF0ZWQsIHRoaXMgaXMgYSBCQy9NQyBvciBTVEEtPkFQIHBhY2tldAorICAgICAgICAgKi8KKworICAgICAgICByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNUQSBhc3NvY2lhdGVkLCBhIHVuaWNhc3QgcGFja2V0CisgICAgICovCisKKyAgICB0aWRfdHggPSB6ZkFnZ1R4R2V0UXVldWUoZGV2LCBhaWQsIHRpZCk7CisKKyAgICAvKnRpZF9xLnRpZF90eCA9IHRpZF90eDsKKyAgICB3ZC0+ZGVzdFEuaW5zZXJ0ID0gemZBZ2dEZXN0SW5zZXJ0OworICAgIHdkLT5kZXN0US5pbnNlcnQoZGV2LCAwLCB0aWRfcSk7CisgICAgKi8KKyAgICBpZiAodGlkX3R4ICE9IE5VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB0aGlzIChhaWQsIGFjKSBpcyBhZ2dyZWdhdGVkCisgICAgICAgICAqLworCisgICAgICAgIC8vaWYgKGFycml2YWxyYXRlIDwgWk1fQUdHX0xPV19USFJFU0hPTEQpCisgICAgICAgIGlmICgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbCByYXRlIHRvbyBsb3cKKyAgICAgICAgICAgICAqIGRlbGV0ZSB0aGlzIGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIC8vd2QtPmFnZ1FQb29sW3FudW1dLT5jbGVhckZsYWcgPSB3ZC0+YWdnUVBvb2xbcW51bV0tPmRlbGV0ZUZsYWcgPTE7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB6ZkFnZ1R4RW5xdWV1ZShkZXYsIGJ1ZiwgYWlkLCB0aWRfdHgpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHRoaXMgKGFpZCwgYWMpIG5vdCB5ZXQgYWdncmVnYXRlZAorICAgICAgICAgKiBxdWV1ZSBub3QgZm91bmQKKyAgICAgICAgICovCisKKyAgICAgICAgLy9pZiAoYXJyaXZhbHJhdGUgPiBaTV9BR0dfSElHSF9USFJFU0hPTEQpCisgICAgICAgIGlmICgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbHJhdGUgaGlnaCBlbm91Z2ggdG8gZ2V0IGEgbmV3IGFnZyBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHRpZF90eCA9IHpmQWdnVHhOZXdRdWV1ZShkZXYsIGFpZCwgdGlkLCBidWYpOworCisgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgbmV3IEFnZ1F1ZXVlIHFudW0gPSAiLCB0aWRfdHgtPik7CisKKyAgICAgICAgICAgIGlmICh0aWRfdHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBnb3QgYSBuZXcgYWdncmVnYXRlIHF1ZXVlCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDE7CisKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGFkZCBBRERCQSBmdW5jdGlvbnMgaGVyZQorICAgICAgICAgICAgICAgICAqIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgICAgICAqLworCisKKyAgICAgICAgICAgICAgICAvL3pmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHRpZF90eC0+ZHN0LCB0aWRfdHgtPmFjLCB0aWRfdHgtPnRpZCk7CisgICAgICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhW2FpZF0uYWdnRmxhZ1thY10gPSAwOworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHpmQWdnVHhFbnF1ZXVlKGRldiwgYnVmLCBhaWQsIHRpZF90eCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGp1c3QgY2FuJ3QgZ2V0IGEgbmV3IGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogYXJyaXZhbCByYXRlIGlzIG5vdCBoaWdoIGVub3VnaCB0byBnZXQgYSBuZXcgYWdnIHF1ZXVlCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKyAgICB9CisKKworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhSZWFkeUNvdW50ICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gY291bnRlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYykgYXMgaW5wdXQsIG9ubHkgY2FsY3VsYXRlIHRoZSByZWFkeSB0byBhZ2dyZWdhdGUgICovCisvKiAgICAgIHF1ZXVlcyBvZiBvbmUgcGFydGljdWxhciBhYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjb3VudGVyIG9mIHJlYWR5IHRvIGFnZ3JlZ2F0ZSBxdWV1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeFJlYWR5Q291bnQoemRldl90KiBkZXYsIHUxNl90IGFjKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmVhZHljb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wIDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCAmJiAod2QtPmFnZ1FQb29sW2ldLT5hZ2dSZWFkeSB8fCBcCisgICAgICAgICAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5jbGVhckZsYWcpICYmIGFjID09IHdkLT5hZ2dRUG9vbFtpXS0+YWMpCisgICAgICAgICAgICByZWFkeWNvdW50Kys7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiByZWFkeWNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFBhcnRpYWwgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiB0aGUgbnVtYmVyIHRoYXQgVnR4cSBoYXMgdG8gc2VuZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGFjLCByZWFkeWNvdW50KSBhcyBpbnB1dCwgY2FsY3VsYXRlIHRoZSByYXRpbyBvZiAgICAgKi8KKy8qICAgICAgVnR4cSBsZW5ndGggdG8gKFZ0eHEgbGVuZ3RoICsgcmVhZHljb3VudCkgb2YgYSBwYXJ0aWN1bGFyIGFjLCAgICovCisvKiAgICAgIGFuZCByZXR1cm5zIHRoZSBWdHhxIGxlbmd0aCAqIHRoZSByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmVhZHljb3VudDogdGhlIG51bWJlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzIG9mIHRoaXMgYWMgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVnR4cSBsZW5ndGggKiByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCkKK3sKKyAgICB1MTZfdCBxbGVuOworICAgIHUxNl90IHBhcnRpYWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHFsZW4gPSB6bV9hZ2dfcWxlbihkZXYsIHdkLT52dHhxSGVhZFthY10sIHdkLT52dHhxVGFpbFthY10pOworCisgICAgaWYgKChxbGVuICsgcmVhZHljb3VudCkgPiAwKQorICAgIHsKKyAgICAgICAgcGFydGlhbCA9ICh1MTZfdCkoIHptX2FnZ193ZWlnaHQoYWMpICogKCh1MTZfdClxbGVuLyhxbGVuICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHljb3VudCkpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBhcnRpYWwgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocGFydGlhbCA+IHFsZW4pCisgICAgICAgIHBhcnRpYWwgPSBxbGVuOworCisgICAgcmV0dXJuIHBhcnRpYWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhTZW5kICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gc2VudGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYywgbikgYXMgaW5wdXQsIG4gaXMgdGhlIG51bWJlciBvZiBzY2hlZHVsZWQgYWdnICAgICovCisvKiAgICAgIHF1ZXVlcyB0byBiZSBzZW50IG9mIHRoZSBwYXJ0aWN1bGFyIGFjLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbiAgIDogdGhlIG51bWJlciBvZiBzY2hlZHVsZWQgYWdncmVnYXRpb24gcXVldWVzIHRvIGJlIHNlbnQgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VudGNvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KQoreworICAgIC8vdTE2X3QgICBxbnVtOworICAgIC8vdTE2X3QgICBxbGVuOworICAgIHUxNl90ICAgajsKKyAgICAvL3UxNl90ICAgc2VudGNvdW50ID0gMDsKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgIGFnZ0NvbnRyb2wgYWdnQ29udHJvbDsKKyAgICB1MTZfdCAgIGFnZ0xlbjsKKyAgICAvL3pidWZfdCogIG5ld0J1ZjsKKyAgICAvL3UxNl90ICAgYnVmTGVuOworICAgIC8vVElEX0JBVyB0aWRfYmF3ID0gTlVMTDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL3doaWxlICh0aWRfdHgtPnNpemUgPiAwKQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICBhZ2dMZW4gPSB6bV9hZ2dfbWluKDE2LCB6bV9hZ2dfbWluKHRpZF90eC0+c2l6ZSwgKHUxNl90KShmcmVlVHhkIC0gMikpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogd2h5IHRoZXJlIGhhdmUgdG8gYmUgMiBmcmVlIFR4ZD8KKyAgICAgICAgICAgICAqLworICAgIGlmIChhZ2dMZW4gPD0wICkKKyAgICAgICAgcmV0dXJuIDA7CisKKworICAgIGlmIChhZ2dMZW4gPT0gMSkgeworICAgICAgICBidWYgPSB6ZkFnZ1R4R2V0VnR4cShkZXYsIHRpZF90eCk7CisgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGcmVlIFR4ZCBxdWV1ZSBpcyBiaWcgZW5vdWdoIHRvIHB1dCBhZ2dyZWdhdGlvbgorICAgICAgICAgICAgICAgICAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT5hZ2dTdGF0ZSA9PSAxKSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3ZC0+YWdnU3RhdGUgPSAxOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhZ2dMZW49IiwgYWdnTGVuKTsKKyAgICB0aWRfdHgtPmFnZ0ZyYW1lU2l6ZSA9IDA7CisgICAgZm9yIChqPTA7IGogPCBhZ2dMZW47IGorKykgeworICAgICAgICBidWYgPSB6ZkFnZ1R4R2V0VnR4cShkZXYsIHRpZF90eCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKCBidWYgKSB7CisgICAgICAgICAgICAvL3N0cnVjdCBhZ2dUYWxseSAqYWdnX3RhbDsKKyAgICAgICAgICAgIHUxNl90IGNvbXBsZXRlSW5kZXg7CisKKyAgICAgICAgICAgIGlmICgwID09IGopIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19GSVJTVF9NUERVOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgoaiA9PSAoYWdnTGVuIC0gMSkpIHx8IHRpZF90eC0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFnZ0NvbnRyb2wuYW1wZHVJbmRpY2F0aW9uID0gWk1fQUdHX0xBU1RfTVBEVTsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19NSURETEVfTVBEVTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgcGFja2V0IGlzIGRlbGF5ZWQgbW9yZSB0aGFuIDUwMCBtcywgZHJvcCBpdCAqLworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aWRfdHgtPmFnZ0ZyYW1lU2l6ZSArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGFnZ0NvbnRyb2wuYWRkYmFJbmRpY2F0aW9uID0gMDsKKyAgICAgICAgICAgIGFnZ0NvbnRyb2wuYWdnRW5hYmxlZCA9IDE7CisKKyNpZmRlZiBaTV9BR0dfVEFMTFkKKyAgICAgICAgICAgIGFnZ190YWwgPSAmd2QtPmFnZ190YWw7CisgICAgICAgICAgICBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKys7CisKKyNlbmRpZgorCisgICAgICAgICAgICB6ZkFnZ1R4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAmYWdnQ29udHJvbCwgdGlkX3R4KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGNvbXBsZXRlSW5kZXggPSB0aWRfdHgtPmNvbXBsZXRlOworICAgICAgICAgICAgaWYoem1fYWdnX2luUSh0aWRfdHgsIHRpZF90eC0+Y29tcGxldGUpKQorICAgICAgICAgICAgICAgIHptX2FnZ19wbHVzKHRpZF90eC0+Y29tcGxldGUpOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgaWYoem1fYWdnX2luUSh0aWRfdHgsIGNvbXBsZXRlSW5kZXgpICYmIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiB0aWRfdHgtPmFnZ3Z0eHFbY29tcGxldGVJbmRleF0uYnVmKSB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKGRldiwgdGlkX3R4LT5hZ2d2dHhxW2NvbXBsZXRlSW5kZXhdLmJ1Zik7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW4gcXVldWUgY29tcGxldGUgd29ya2VkISIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhpcyBhZ2dyZWdhdGlvbiBxdWV1ZSBpcyBlbXB0eQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYWdnTGVuIG5vdCByZWFjaGVkLCBidXQgbm8gbW9yZSBmcmFtZSwgaj0iLCBqKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+YWdnU3RhdGUgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3ptX2FjcXVpcmVfYWdnX3NwaW5fbG9jayhBZGFwdGVyKTsKKyAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAvL3ptX3JlbGVhc2VfYWdnX3NwaW5fbG9jayhBZGFwdGVyKTsKKworICAgIGlmICh0aWRfdHgtPnNpemUgPT0gMCkgeworICAgICAgICAvL0RFU1RRLmRlbGV0ZShkZXYsIDAsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisKKworICAgIC8vemZBZ2dJbnZva2VCYXIoZGV2LCB0aWRfdHgpOworICAgIGlmKGo+MCkgeworICAgICAgICBhZ2dyX2NvdW50Kys7CisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIweEMyOnNlbnQgMSBhZ2dyLCBhZ2dyX2NvdW50PSIsIGFnZ3JfY291bnQpOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjpzZW50IDEgYWdnciwgYWdncl9zaXplPSIsIGopOworICAgIH0KKyAgICByZXR1cm4gajsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFJlYWR5UXVldWUgICAgICAgICovCisvKiAgICAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBhZ2dyZWdhdGlvbiBxdWV1ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGFjKSBhcyBpbnB1dCwgZmluZCB0aGUgYWdnIHF1ZXVlIHdpdGggc21hbGxlc3QgICAgICAgKi8KKy8qICAgICAgYXJyaXZhbCB0aW1lICh3YWl0ZWQgbG9uZ2VzdCkgYW1vbmcgdGhvc2UgcmVhZHkgb3IgY2xlYXJGbGFnICAgICovCisvKiAgICAgIHNldCBxdWV1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhYyAgOiBhY2Nlc3MgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZ2dyZWdhdGlvbiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVElEX1RYIHpmQWdnVHhHZXRSZWFkeVF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhYykKK3sKKyAgICAvL3UxNl90ICAgICAgIHFudW0gPSBaTV9BR0dfUE9PTF9TSVpFOworICAgIHUxNl90ICAgICAgIGk7CisgICAgdTMyX3QgICAgICAgdGltZSA9IDA7CisgICAgVElEX1RYICAgICAgdGlkX3R4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpPTAgO2k8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCAmJiBhYyA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFjICYmCisgICAgICAgICAgICAgICAgKHdkLT5hZ2dRUG9vbFtpXS0+c2l6ZSA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCA9PSB0aW1lIHx8IHRpbWUgPiB3ZC0+YWdnUVBvb2xbaV0tPmFnZ3Z0eHFbIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmFnZ0hlYWQgXS5hcnJpdmFsVGltZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICAgICAgdGltZSA9IHRpZF90eC0+YWdndnR4cVsgdGlkX3R4LT5hZ2dIZWFkIF0uYXJyaXZhbFRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4R2V0VnR4cSAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIGFuIE1TRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgcW51bSkgYXMgaW5wdXQsIHJldHVybiBhbiBNU0RVIG91dCBvZiB0aGUgYWdnIHF1ZXVlLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhIE1TRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkFnZ1R4R2V0VnR4cSh6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB6YnVmX3QqIGJ1ZiA9IE5VTEw7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHRpZF90eC0+YWdnSGVhZCAhPSB0aWRfdHgtPmFnZ1RhaWwpCisgICAgeworICAgICAgICBidWYgPSB0aWRfdHgtPmFnZ3Z0eHFbIHRpZF90eC0+YWdnVGFpbCBdLmJ1ZjsKKworICAgICAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5idWYgPSBOVUxMOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHRpZF90eC0+YWdnVGFpbCA9ICgodGlkX3R4LT5hZ2dUYWlsICsgMSkgJiBaTV9BR0dRX1NJWkVfTUFTSyk7CisgICAgICAgIGlmKHRpZF90eC0+c2l6ZSA+IDApIHRpZF90eC0+c2l6ZS0tOworICAgICAgICB0aWRfdHgtPnNpemUgPSB6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gYnVmKSB7CisgICAgICAgICAgICAvL3RpZF90eC0+YWdnVGFpbCA9IHRpZF90eC0+YWdnSGVhZCA9IHRpZF90eC0+c2l6ZSA9IDA7CisgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJHZXRWdHhxIGJ1ZiA9PSBOVUxMLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBpcyBlbXB0eQorICAgICAgICAgKi8KKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInRpZF90eC0+YWdnSGVhZCA9PSB0aWRfdHgtPmFnZ1RhaWwsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgfQorCisgICAgaWYgKHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpICE9IHRpZF90eC0+c2l6ZSkKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInFsZW4hPXRpZF90eC0+c2l6ZSEgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeERlbGV0ZVF1ZXVlICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBaTV9TVUNDRVNTIChjYW4ndCBmYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIHFudW0pIGFzIGlucHV0LCByZXNldCAoZGVsZXRlKSB0aGlzIGFnZ3JlZ2F0ZSBxdWV1ZSwgKi8KKy8qICAgICAgdGhpcyBxdWV1ZSBpcyB2aXJ0dWFsbHkgcmV0dXJuZWQgdG8gdGhlIGFnZ3JlZ2F0ZSBxdWV1ZSBwb29sLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHFudW06IHF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pCit7CisgICAgdTE2X3QgYWMsIHRpZDsKKyAgICBzdHJ1Y3QgYWdnUXVldWUgKnR4X3RpZDsKKyAgICBzdHJ1Y3QgYWdnU3RhICAgKmFnZ19zdGE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgdHhfdGlkID0gd2QtPmFnZ1FQb29sW3FudW1dOworICAgIGFnZ19zdGEgPSAmd2QtPmFnZ1N0YVt0eF90aWQtPmFnZ1FTVEFdOworICAgIGFjID0gdHhfdGlkLT5hYzsKKyAgICB0aWQgPSB0eF90aWQtPnRpZDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB0eF90aWQtPmFnZ1FFbmFibGVkID0gMDsKKyAgICB0eF90aWQtPmFnZ0hlYWQgPSB0eF90aWQtPmFnZ1RhaWwgPSAwOworICAgIHR4X3RpZC0+YWdnUmVhZHkgPSAwOworICAgIHR4X3RpZC0+Y2xlYXJGbGFnID0gdHhfdGlkLT5kZWxldGVGbGFnID0gMDsKKyAgICB0eF90aWQtPnNpemUgPSAwOworICAgIGFnZ19zdGEtPmNvdW50W2FjXSA9IDA7CisKKyAgICBhZ2dfc3RhLT50aWRfdHhbdGlkXSA9IE5VTEw7CisgICAgYWdnX3N0YS0+YWdnRmxhZ1thY10gPSAwOworCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJxdWV1ZSBkZWxldGVkISBxbnVtPSIsIHFudW0pOworCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3ZvaWQgemZCYXdDb3JlKHpkZXZfdCogZGV2LCB1MTZfdCBiYXdfc2VxLCB1MzJfdCBiaXRtYXAsIHUxNl90IGFnZ0xlbikgeworICAgIFRJRF9CQVcgdGlkX2JhdzsKKyAgICBzMTZfdCBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgdGlkX2JhdyA9IEJBVy0+Z2V0UShkZXYsIGJhd19zZXEpOworICAgIC8vdGlkX2JhdyA9IE5VTEw7CisgICAgaWYgKE5VTEwgPT0gdGlkX2JhdykKKyAgICAgICAgcmV0dXJuOworCisgICAgdG90YWxfbXBkdSArPSBhZ2dMZW47CisgICAgZm9yIChpID0gYWdnTGVuIC0gMTsgaT49MDsgaS0tKSB7CisgICAgICAgIGlmICgoKGJpdG1hcCA+PiBpKSAmIDB4MSkgPT0gMCkgeworICAgICAgICAgICAgYnVmX2luZm8gPSBCQVctPnBvcChkZXYsIGksIHRpZF9iYXcpOworICAgICAgICAgICAgYnVmID0gYnVmX2luZm8tPmJ1ZjsKKyAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgemZBZ2dUaWRUeEluc2VydEhlYWQoZGV2LCBidWZfaW5mbywgdGlkX2Jhdy0+dGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3NfbXBkdSsrOworICAgICAgICB9CisgICAgfQorICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2KTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzdWNjZXNzX21wZHUgPSAiLCBzdWNjZXNzX21wZHUpOworICAgIHptX2RlYnVnX21zZzEoIiAgdG90YWxfbXBkdSA9ICIsIHRvdGFsX21wZHUpOworfQorCit2b2lkICAgIHpmQmF3SW5pdCh6ZGV2X3QqIGRldikgeworICAgIFRJRF9CQVcgdGlkX2JhdzsKKyAgICB1MTZfdCBpLGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGZvciAoaT0wOyBpPFpNX0JBV19QT09MX1NJWkU7IGkrKyl7CisgICAgICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W2ldOworICAgICAgICBmb3IgKGo9MDsgajxaTV9WVFhRX1NJWkU7IGorKykgeworICAgICAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbal0uYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0aWRfYmF3LT5lbmFibGVkID0gdGlkX2Jhdy0+aGVhZCA9IHRpZF9iYXctPnRhaWwgPSB0aWRfYmF3LT5zaXplID0gMDsKKyAgICAgICAgdGlkX2Jhdy0+c3RhcnRfc2VxID0gMDsKKyAgICB9CisgICAgQkFXLT5kZWxQb2ludCA9IDA7CisgICAgQkFXLT5jb3JlID0gemZCYXdDb3JlOworICAgIEJBVy0+Z2V0TmV3USA9IHpmQmF3R2V0TmV3UTsKKyAgICBCQVctPmluc2VydCA9IHpmQmF3SW5zZXJ0OworICAgIEJBVy0+cG9wID0gemZCYXdQb3A7CisgICAgQkFXLT5lbmFibGUgPSB6ZkJhd0VuYWJsZTsKKyAgICBCQVctPmRpc2FibGUgPSB6ZkJhd0Rpc2FibGU7CisgICAgQkFXLT5nZXRRID0gemZCYXdHZXRROworfQorCisKKworVElEX0JBVyB6ZkJhd0dldE5ld1EoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgVElEX1RYIHRpZF90eCkgeworICAgIFRJRF9CQVcgdGlkX2Jhdz1OVUxMOworICAgIFRJRF9CQVcgbmV4dF9iYXc9TlVMTDsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgIGZvciAoaT0wOyBpPFpNX0JBV19QT09MX1NJWkU7IGkrKyl7CisgICAgICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W2ldOworICAgICAgICBpZiAoRkFMU0UgPT0gdGlkX2Jhdy0+ZW5hYmxlZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqLworCisgICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbQkFXLT5kZWxQb2ludF07CisgICAgaSA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy9pZiAoWk1fQkFXX1BPT0xfU0laRSA9PSBpKSB7CisgICAgICAgIC8vcmV0dXJuIE5VTEw7CisgICAgLy8gICAgdThfdCB0ZW1wID0gQkFXLT5kZWxQb2ludDsKKyAgICAvLyAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tCQVctPmRlbFBvaW50XTsKKyAgICAvLyAgICBCQVctPmRpc2FibGUoZGV2LCB0aWRfYmF3KTsKKyAgICAvLyAgICBCQVctPmRlbFBvaW50ID0gKEJBVy0+ZGVsUG9pbnQgPCAoWk1fQkFXX1BPT0xfU0laRSAtIDEpKT8gKEJBVy0+ZGVsUG9pbnQgKyAxKTogMDsKKyAgICAvLyAgICB0ZW1wID0gQkFXLT5kZWxQb2ludDsKKyAgICAvL30KKworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgbmV3IHRpZF9iYXcsIGluZGV4PSIsIGkpOworICAgIEJBVy0+ZGVsUG9pbnQgPSAoaSA8IChaTV9CQVdfUE9PTF9TSVpFIC0xKSk/IChpICsgMSk6IDA7CisgICAgbmV4dF9iYXcgPSAmQkFXLT50aWRfYmF3W0JBVy0+ZGVsUG9pbnRdOworICAgIGlmICgxID09IG5leHRfYmF3LT5lbmFibGVkKSBCQVctPmRpc2FibGUoZGV2LCBuZXh0X2Jhdyk7CisKKyAgICBCQVctPmVuYWJsZShkZXYsIHRpZF9iYXcsIHN0YXJ0X3NlcSk7CisgICAgdGlkX2Jhdy0+dGlkX3R4ID0gdGlkX3R4OworCisgICAgcmV0dXJuIHRpZF9iYXc7Cit9CisKK3UxNl90ICAgemZCYXdJbnNlcnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgLy91MTZfdCAgIGJ1ZkxlbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKHRpZF9iYXctPnNpemUgPCAoWk1fVlRYUV9TSVpFIC0gMSkpIHsKKyAgICAgICAgc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXIgPSAmdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uYmF3X2hlYWRlcjsKKworICAgICAgICBiYXdfaGVhZGVyLT5oZWFkZXJMZW4gICA9IGhlYWRlcl9yLT5oZWFkZXJMZW47CisgICAgICAgIGJhd19oZWFkZXItPm1pY0xlbiAgICAgID0gaGVhZGVyX3ItPm1pY0xlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+c25hcExlbiAgICAgPSBoZWFkZXJfci0+c25hcExlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+cmVtb3ZlTGVuICAgPSBoZWFkZXJfci0+cmVtb3ZlTGVuOworICAgICAgICBiYXdfaGVhZGVyLT5rZXlJZHggICAgICA9IGhlYWRlcl9yLT5rZXlJZHg7CisgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QgKiliYXdfaGVhZGVyLT5oZWFkZXIsICh1OF90ICopaGVhZGVyX3ItPmhlYWRlciwgNTgpOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+bWljICAgLCAodThfdCAqKWhlYWRlcl9yLT5taWMgICAsIDgpOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+c25hcCAgLCAodThfdCAqKWhlYWRlcl9yLT5zbmFwICAsIDgpOworICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIGJ1ZiwgMSk7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uYmF3X3NlcSA9IGJhd19zZXE7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19yZXRyYW5zbWl0ID0gYmF3X3JldHJhbnNtaXQgKyAxOworCisgICAgICAgIC8vdGlkX2Jhdy0+ZnJhbWVbdGlkX2Jhdy0+aGVhZF0uZGF0YSA9IHBCdWYtPmRhdGE7CisgICAgICAgIHRpZF9iYXctPmhlYWQrKzsKKyAgICAgICAgdGlkX2Jhdy0+c2l6ZSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDApOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgLy96YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgYnVmX2luZm8gPSAmd2QtPmJ1Zl9pbmZvOworICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyID0gTlVMTDsKKworICAgIGlmIChOVUxMID09IChidWZfaW5mby0+YnVmID0gdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJ1ZikpCisgICAgICAgIHJldHVybiBidWZfaW5mbzsKKworICAgIGJ1Zl9pbmZvLT5iYXdfcmV0cmFuc21pdCA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS5iYXdfcmV0cmFuc21pdDsKKyAgICBidWZfaW5mby0+YmF3X2hlYWRlciA9ICZ0aWRfYmF3LT5mcmFtZVtpbmRleF0uYmF3X2hlYWRlcjsKKyAgICBidWZfaW5mby0+dGltZXN0YW1wID0gdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLnRpbWVzdGFtcDsKKyAgICAvL3BCdWYtPmRhdGEgPSBwQnVmLT5idWZmZXI7CisgICAgLy93ZC0+emZjYlJlc3RvcmVCdWZEYXRhKGRldiwgYnVmKTsKKyAgICB0aWRfYmF3LT5mcmFtZVtpbmRleF0uYnVmID0gTlVMTDsKKworICAgIHJldHVybiBidWZfaW5mbzsKK30KKwordm9pZCAgICB6ZkJhd0VuYWJsZSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpIHsKKyAgICAvL1RJRF9CQVcgdGlkX2JhdzsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHRpZF9iYXctPmVuYWJsZWQgPSBUUlVFOworICAgIHRpZF9iYXctPmhlYWQgPSB0aWRfYmF3LT50YWlsID0gdGlkX2Jhdy0+c2l6ZSA9IDA7CisgICAgdGlkX2Jhdy0+c3RhcnRfc2VxID0gc3RhcnRfc2VxOworfQorCit2b2lkICAgIHpmQmF3RGlzYWJsZSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisgICAgdTE2X3QgaTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9WVFhRX1NJWkU7IGkrKykgeworICAgICAgICBpZiAodGlkX2Jhdy0+ZnJhbWVbaV0uYnVmKSB7CisKKyAgICAgICAgICAgIC8vd2QtPnpmY2JTZXRCYXdRKGRldiwgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmLCAwKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB0aWRfYmF3LT5mcmFtZVtpXS5idWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpZF9iYXctPmVuYWJsZWQgPSBGQUxTRTsKK30KKworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc9TlVMTDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgaWYgKFRSVUUgPT0gdGlkX2Jhdy0+ZW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImdldCBhbiBvbGQgdGlkX2JhdywgYmF3X3NlcT0iLCBiYXdfc2VxKTsKKyAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJjaGVjayBhICB0aWRfYmF3LT5zdGFydF9zZXE9IiwgdGlkX2Jhdy0+c3RhcnRfc2VxKTsKKyAgICAgICAgICAgIGlmKGJhd19zZXEgPT0gdGlkX2Jhdy0+c3RhcnRfc2VxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisgICAgaWYgKFpNX0JBV19QT09MX1NJWkUgPT0gaSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRpZF9iYXc7Cit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisKK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgYWdnVGFsbHkqIGFnZ190YWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSA9IDA7CisgICAgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSA9IDA7CisgICAgYWdnX3RhbC0+c2VudF9ieXRlc19zdW0gPSAwOworICAgIGFnZ190YWwtPnNlbnRfcGFja2V0c19zdW0gPSAwOworICAgIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyA9IDA7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgPSAwOworICAgIGFnZ190YWwtPnRpbWUgPSAwOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1NjYW5BbmRDbGVhciAgICAgICAgICAgKi8KKy8qICAgICAgSWYgdGhlIHBhY2tldHMgaW4gYSBxdWV1ZSBoYXZlIHdhaXRlZCBmb3IgdG9vIGxvbmcsIGNsZWFyIGFuZCAgICovCisvKiAgICAgIGRlbGV0ZSB0aGlzIGFnZ3JlZ2F0aW9uIHF1ZXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiAgICAgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0aW1lICAgIDogY3VycmVudCB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IGhlYWQ7CisgICAgdTE2X3QgdGFpbDsKKyAgICB1MzJfdCB0aWNrOworICAgIHUzMl90IGFycml2YWxUaW1lOworICAgIC8vdTE2X3QgYWlkLCBhYzsKKyAgICBUSURfVFggdGlkX3R4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCEod2QtPnN0YXRlID09IFpNX1dMQU5fU1RBVEVfRU5BQkxFRCkpIHJldHVybiAwOworICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAxKTsKKyAgICB0aWNrID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXdkLT5hZ2dRUG9vbFtpXSkgcmV0dXJuIDA7CisgICAgICAgIGlmICgxID09IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF90eCA9IHdkLT5hZ2dRUG9vbFtpXTsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGhlYWQgPSB0aWRfdHgtPmFnZ0hlYWQ7CisgICAgICAgICAgICB0YWlsID0gdGlkX3R4LT5hZ2dUYWlsOworCisgICAgICAgICAgICBhcnJpdmFsVGltZSA9ICh1MzJfdCl0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5hcnJpdmFsVGltZTsKKworCisgICAgICAgICAgICBpZigodGljayAtIGFycml2YWxUaW1lKSA8PSBaTV9BR0dfQ0xFQVJfVElNRSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigodGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCkpID4gMCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRpZF90eC0+Y2xlYXJGbGFnID0gMTsKKworICAgICAgICAgICAgICAgIC8vem1fbXNnMV9hZ2coWk1fTFZfMCwgImNsZWFyIHF1ZXVlICAgIHRpY2sgPSIsIHRpY2spOworICAgICAgICAgICAgICAgIC8vem1fbXNnMV9hZ2coWk1fTFZfMCwgImNsZWFyIHF1ZXVlIGFycml2YWwgPSIsIGFycml2YWxUaW1lKTsKKworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIC8vemZBZ2dUeFNjaGVkdWxlcihkZXYpOworICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGlkX3R4LT5zaXplID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBxdWV1ZSBlbXB0eQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh0aWNrIC0gdGlkX3R4LT5sYXN0QXJyaXZhbCA+IFpNX0FHR19ERUxFVEVfVElNRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJkZWxldGUgcXVldWUsIGlkbGUgZm9yIG4gc2VjLiBuID0gIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX0FHR19ERUxFVEVfVElNRS8xMCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZBZ2dUeERlbGV0ZVF1ZXVlKGRldiwgaSk7CisgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgICAgIHpmQWdnUnhDbGVhcihkZXYsIHRpbWUpOworCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgaWYoKHdkLT50aWNrICUgMTAwKSA9PSAwKSB7CisgICAgICAgIHpmQWdnUHJpbnRUYWxseShkZXYpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBhZ2dUYWxseSogYWdnX3RhbDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGFnZ190YWwgPSAmd2QtPmFnZ190YWw7CisKKyAgICBpZihhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0gPCAxMCkKKyAgICB7CisgICAgICAgIHpmQWdnVGFsbHlSZXNldChkZXYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhZ2dfdGFsLT50aW1lKys7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9wYWNrZXRzID0gKGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyAqIChhZ2dfdGFsLT50aW1lIC0gMSkgKworICAgICAgICAgICAgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyA9IChhZ2dfdGFsLT5hdmdfZ290X2J5dGVzICogKGFnZ190YWwtPnRpbWUgLSAxKSArCisgICAgICAgICAgICBhZ2dfdGFsLT5nb3RfYnl0ZXNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyA9IChhZ2dfdGFsLT5hdmdfc2VudF9wYWNrZXRzICogKGFnZ190YWwtPnRpbWUgLSAxKQorICAgICAgICAgICAgKyBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgPSAoYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMgKiAoYWdnX3RhbC0+dGltZSAtIDEpICsKKyAgICAgICAgICAgIGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtKSAvIGFnZ190YWwtPnRpbWU7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImdvdF9wYWNrZXRzX3N1bSA9IiwgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiICBnb3RfYnl0ZXNfc3VtID0iLCBhZ2dfdGFsLT5nb3RfYnl0ZXNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAic2VudF9wYWNrZXRzX3N1bT0iLCBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtKTsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiIHNlbnRfYnl0ZXNfc3VtID0iLCBhZ2dfdGFsLT5zZW50X2J5dGVzX3N1bSk7CisgICAgYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtID0gYWdnX3RhbC0+Z290X2J5dGVzX3N1bSA9YWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bQorICAgICAgICAgICAgICAgID0gYWdnX3RhbC0+c2VudF9ieXRlc19zdW0gPSAwOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhdmdfZ290X3BhY2tldHMgPSIsIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgYXZnX2dvdF9ieXRlcyA9IiwgYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImF2Z19zZW50X3BhY2tldHM9IiwgYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiBhdmdfc2VudF9ieXRlcyA9IiwgYWdnX3RhbC0+YXZnX3NlbnRfYnl0ZXMpOworICAgIGlmICgod2QtPmNvbW1UYWxseS5CQV9GYWlsID09IDApIHx8ICh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkpCisgICAgeworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiSGFyZHdhcmUgVHggTVBEVT0iLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUpOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiICBCQSBGYWlsIG51bWJlcj0iLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIxLyhCQSBmYWlsIHJhdGUpPSIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVS93ZC0+Y29tbVRhbGx5LkJBX0ZhaWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQWdnUnhDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSkKK3sKKyAgICB1MTZfdCAgIGk7CisgICAgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICBpZiAodGlkX3J4LT5iYXdfaGVhZCAhPSB0aWRfcngtPmJhd190YWlsKQorICAgICAgICB7CisgICAgICAgICAgICB1MTZfdCBqID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgICAgIHdoaWxlICgoaiAhPSB0aWRfcngtPmJhd19oZWFkKSAmJiAhdGlkX3J4LT5mcmFtZVtqXS5idWYpIHsKKyAgICAgICAgICAgIAlqID0gKGogKyAxKSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaiAhPSB0aWRfcngtPmJhd19oZWFkKSAmJiAodGltZSAtIHRpZF9yeC0+ZnJhbWVbal0uYXJyaXZhbFRpbWUpID4KKyAgICAgICAgICAgICAgICAgICAgKFpNX0FHR19DTEVBUl9USU1FIC0gNSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX2FnZyhaTV9MVl8xLCAicXVldWUgUnhGbHVzaCBieSBSeENsZWFyIik7CisgICAgICAgICAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgMCwgdGlkX3J4KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3N0cnVjdCBhZ2dfdGlkX3J4KiB6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBkc3QwLCBzcmNbM10sIGFjLCBhaWQsIGZyYWdPZmY7CisgICAgdThfdCAgICB1cDsKKyAgICB1MTZfdCAgIG9mZnNldCA9IDA7CisgICAgdTE2X3QgICBzZXFfbm87CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTMyX3QgdGNwX3NlcTsKKyAgICAvL3N0cnVjdCBhZ2dTdGEgKmFnZ19zdGE7CisjaWYgWk1fQUdHX0ZQR0FfUkVPUkRFUklORworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisjZW5kaWYKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjIpID4+IDQ7CisgICAgLy9EYmdQcmludCgiUnggc2VxPSVkXG4iLCBzZXFfbm8pOworICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICBmcmFtZVR5cGUgPSBmcmFtZUN0cmwgJiAweGY7CisgICAgZnJhbWVTdWJ0eXBlID0gZnJhbWVDdHJsICYgMHhmMDsKKworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpIC8vbm9uLVFvcyBEYXRhPyAoZnJhbWVTdWJ0eXBlJjB4ODApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BFUkZPUk1BTkNFX0VWQUxVQVRJT04KKyAgICB0Y3Bfc2VxID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzYpIDw8IDI0OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzcpIDw8IDE2OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzgpIDw8IDg7CisgICAgdGNwX3NlcSArPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyMiszOSk7CisjZW5kaWYKKworICAgIFpNX1NFUV9ERUJVRygiSW4gICAgICAgICAgICAgICAgICAgJTVkLCAlMTJ1XG4iLCBzZXFfbm8sIHRjcF9zZXEpOworICAgIGRzdDAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrNCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKworI2lmIFpNX0FHR19GUEdBX0RFQlVHCisgICAgYWlkID0gMDsKKyNlbHNlCisgICAgYWlkID0gemZBcEZpbmRTdGEoZGV2LCBzcmMpOworI2VuZGlmCisKKyAgICAvL2FnZ19zdGEgPSAmd2QtPmFnZ1N0YVthaWRdOworICAgIC8vemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgLy9hYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICAvKgorICAgICAqIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHksIGFpZCA9PSAwIGlzIGZvciBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgaWYgKChkc3QwICYgMHgxKSA9PSAwICYmIGFpZCA9PSAwKQorICAgIHsKKyNpZiBaTV9BR0dfRlBHQV9SRU9SREVSSU5HCisgICAgICAgIHRpZF9yeCA9IHpmQWdnUnhHZXRRdWV1ZShkZXYsIGJ1ZikgOworICAgICAgICBpZighdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5hZGRCYUV4Y2hhbmdlU3RhdHVzQ29kZSA9PSBaTV9BR0dfQUREQkFfUkVTUE9OU0UpCisgICAgICAgICAgICByZXR1cm4gdGlkX3J4OworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit1MTZfdCB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHMxNl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBvZmZzZXQgPSAwOworICAgIHpidWZfdCogcGJ1ZjsKKyAgICB1OF90ICAgIGZyYW1lU3ViVHlwZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICBaTV9QRVJGT1JNQU5DRV9SWF9SRU9SREVSKGRldik7CisKKyAgICBzZXFfbm8gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMjIpID4+IDQ7CisKKyAgICBpbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgIC8qCisgICAgICogZm9yIGRlYnVnCisgICAgICovCisKKyAgICAvKiB6bV9tc2cyX2FnZyhaTV9MVl8wLCAicXVldWUgc2VxID0gIiwgc2VxX25vKTsKKyAgICAgKiBEYmdQcmludCgiJXM6JXMlbHhoICVzJWx4aFxuIiwgX19GVU5DVElPTl9fLCAicXVldWUgc2VxPSIsIHNlcV9ubywKKyAgICAgKiAgICI7IHNlcV9zdGFydD0iLCB0aWRfcngtPnNlcV9zdGFydCk7CisgICAgICovCisKKyAgICAvL0RiZ1ByaW50KCJzZXFfbm89JWQsIHNlcV9zdGFydD0lZFxuIiwgc2VxX25vLCB0aWRfcngtPnNlcV9zdGFydCk7CisKKyAgICAvKiBJbiBzb21lIEFQcywgd2UgZm91bmQgdGhhdCBpdCBtaWdodCB0cmFuc21pdCBOVUxMIGRhdGEgd2hvc2Ugc2VxdWVuY2UgbnVtYmVyCisgICAgICAgaXMgb3V0IG9yIG9yZGVyLiBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGlnbm9yZSB0aGVzZSBOVUxMIGRhdGEuCisgICAgICovCisKKyAgICBmcmFtZVN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCkgJiAweEYwKSA+PiA0OworCisgICAgLyogSWYgdGhpcyBpcyBhIE5VTEwgZGF0YSBpbnN0ZWFkIG9mIFFvcyBOVUxMIGRhdGEgKi8KKyAgICBpZiAoKGZyYW1lU3ViVHlwZSAmIDB4MEMpID09IDB4MDQpCisgICAgeworICAgICAgICBzMTZfdCBzZXFfZGlmZjsKKworICAgICAgICBzZXFfZGlmZiA9IChzZXFfbm8gPiB0aWRfcngtPnNlcV9zdGFydCkgPworICAgICAgICAgICAgICAgICAgICAgICBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA6IHRpZF9yeC0+c2VxX3N0YXJ0IC0gc2VxX25vOworCisgICAgICAgIGlmIChzZXFfZGlmZiA+IFpNX0FHR19CQVdfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRnJlZSBSeCBOVUxMIGRhdGEgaW4gemZBZ2dSeCIpOworCisgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciAqLworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHNlcXVlbmNlIG51bWJlciB3cmFwIGF0IDRrCisgICAgICovCisgICAgaWYgKHRpZF9yeC0+c2VxX3N0YXJ0ID4gc2VxX25vKQorICAgIHsKKyAgICAgICAgLy9pbmRleCArPSA0MDk2OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+PSA0MDk2KSB7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIH0KKworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA9PSBzZXFfbm8pIHsKKyAgICAJem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAJaWYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+IDApIHsKKyAgICAJICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB9CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworICAgIAl6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1Zik7CisKKyAgICAJaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcV9ubyk7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCIxLiBzZXE9JWRcbiIsIHNlcV9ubyk7CisKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXpmQWdnUnhFbnF1ZXVlKGRldiwgYnVmLCB0aWRfcngsIGFkZEluZm8pKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlZCBwYWNrZXQKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpIHsvLyAmJiB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZikKKyAgICAgICAgdTE2X3QgdGFpbEluZGV4OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgdGFpbEluZGV4ID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWY7CisgICAgICAgIHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWYgPSAwOworICAgICAgICBpZiAoIXBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIDEpICYgKDQwOTYgLSAxKTsKKworCisgICAgICAgIC8vaWYocGJ1ZiAmJiB0aWRfcngtPmJhd19zaXplID4gMCkKKyAgICAgICAgLy8gICAgdGlkX3J4LT5iYXdfc2l6ZS0tOworCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUlhfU0VRKGRldiwgcGJ1Zik7CisKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgLy9EYmdQcmludCgiMS4gc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBwYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgcGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RydWN0IGFnZ190aWRfcnggKnpmQWdnUnhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBzcmNbM107CisgICAgdTE2X3QgICBhaWQsIGFjLCBpOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKworICAgIGFjID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI0KSAmIDB4Rik7CisKKyAgICAvLyBtYXJrIGJ5IHNwaW4gbG9jayBkZWJ1ZworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkUgOyBpKyspCisgICAgeworICAgICAgICBpZigod2QtPnRpZF9yeFtpXS0+YWlkID09IGFpZCkgJiYgKHdkLT50aWRfcnhbaV0tPmFjID09IGFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWFyayBieSBzcGluIGxvY2sgZGVidWcKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF9yeDsKK30KKworCit1MTZfdCAgIHpmQWdnUnhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKQoreworICAgIHUxNl90IHNlcV9ubywgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBxX2luZGV4OworICAgIHMxNl90IGluZGV4OworICAgIHU4X3QgIGJkcm9wZnJhbWUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICBpbmRleCAgPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKworICAgIC8qCisgICAgICogc2VxdWVuY2UgbnVtYmVyIHdyYXAgYXQgNGsKKyAgICAgKiAtMTAwMDogY2hlY2sgZm9yIGR1cGxpY2F0ZSBwYXN0IHBhY2tldAorICAgICAqLworICAgIGJkcm9wZnJhbWUgPSAwOworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+IHNlcV9ubykgeworICAgICAgICBpZiAoKHRpZF9yeC0+c2VxX3N0YXJ0ID4gMzk2NykgJiYgKHNlcV9ubyA8IDEyOCkpIHsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0gZWxzZSBpZiAodGlkX3J4LT5zZXFfc3RhcnQgLSBzZXFfbm8gPiA3MCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50Kys7CisgICAgICAgICAgICBpZiAodGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPiAzKSB7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA+IDcwKSB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQrKzsKKyAgICAgICAgICAgIGlmICh0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJkcm9wZnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiZHJvcGZyYW1lID09IDEpIHsKKyAgICAgICAgLyppZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkgeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfSovCisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfRlJFRShkZXYsIGJ1Zik7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8qemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgKi8KKworICAgICAgICAvL0RiZ1ByaW50KCJGcmVlIGFuIG9sZCBwYWNrZXQsIHNlcV9zdGFydD0lZCwgc2VxX25vPSVkXG4iLCB0aWRfcngtPnNlcV9zdGFydCwgc2VxX25vKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBkdXBsaWNhdGUgcGFzdCBwYWNrZXQKKyAgICAgICAgICogaGFwcGVucyBvbmx5IGluIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBlbnZpcm9ubWVudAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfZXhjZWVkX2NvdW50ID4gMCl7CisgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50ID4gMCkgeworICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIC8vaWYgKGluZGV4ID49IChaTV9BR0dfQkFXX1NJWkUgLSAxKSkKKyAgICBpZiAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBmdWxsCisgICAgICAgICAqLworICAgICAgICAvL0RiZ1ByaW50KCJpbmRleCA+PSA2NCwgc2VxX3N0YXJ0PSVkLCBzZXFfbm89JWRcbiIsIHRpZF9yeC0+c2VxX3N0YXJ0LCBzZXFfbm8pOworICAgICAgICB6ZkFnZ1J4Rmx1c2goZGV2LCBzZXFfbm8sIHRpZF9yeCk7CisgICAgICAgIC8vdGlkX3J4LT5zZXFfc3RhcnQgPSBzZXFfbm87CisgICAgICAgIGluZGV4ID0gc2VxX25vIC0gdGlkX3J4LT5zZXFfc3RhcnQ7CisgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICB7CisgICAgICAgIC8vaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgLy9pbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgICAgICB3aGlsZSAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoImluZGV4ID49IDY0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIFpNX0FHR19CQVdfTUFTSykgJiAoNDA5NiAtIDEpOworICAgICAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHFfaW5kZXggPSAodGlkX3J4LT5iYXdfdGFpbCArIGluZGV4KSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICBpZiAodGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgJiYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+CisgICAgICAgICAgICAgICAgKCgocV9pbmRleCkgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykpKQorICAgIHsKKworICAgICAgICBaTV9QRVJGT1JNQU5DRV9EVVAoZGV2LCB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiwgYnVmKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8vRGJnUHJpbnQoIkZyZWUgYSBkdXBsaWNhdGUgcGFja2V0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlIHBhY2tldAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYsIDApOworICAgICAgICB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiA9IDA7CisgICAgfQorCisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgPSBidWY7CisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5hcnJpdmFsVGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgemZ3TWVtb3J5Q29weSgodm9pZCopJnRpZF9yeC0+ZnJhbWVbcV9pbmRleF0uYWRkSW5mbywgKHZvaWQqKWFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKworICAgIC8qCisgICAgICogZm9yIGRlYnVnIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBvbmx5LAorICAgICAqIHNob3VsZCBiZSBkb25lIGluIHJ4IG9mIEFEREJBIFJlcXVlc3QKKyAgICAgKi8KKyAgICAvL3RpZF9yeC0+YWRkSW5mbyA9IGFkZEluZm87CisKKworICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0gaW5kZXgpCisgICAgeworICAgICAgICAvL3RpZF9yeC0+YmF3X3NpemUgPSBpbmRleCArIDE7CisgICAgICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0KKyAgICAgICAgICAgICAgICAvLygocV9pbmRleCArIDEpICYgWk1fQUdHX0JBV19NQVNLKSkKKyAgICAgICAgICAgICAgICAoKChxX2luZGV4KSAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSkvL3RpZF9yeC0+YmF3X3NpemUgKQorICAgICAgICAgICAgdGlkX3J4LT5iYXdfaGVhZCA9IChxX2luZGV4ICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICAvL0RiZ1ByaW50KCJoZWFkPSVkLCB0YWlsPSVkLCBzdGFydD0lZCIsIHRpZF9yeC0+YmF3X2hlYWQsIHRpZF9yeC0+YmF3X3RhaWwsIHRpZF9yeC0+c2VxX3N0YXJ0KTsKKyAgICByZXR1cm4gMTsKK30KKwordTE2X3QgemZBZ2dSeEZsdXNoKHpkZXZfdCogZGV2LCB1MTZfdCBzZXFfbm8sIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcngpCit7CisgICAgemJ1Zl90KiBwYnVmOworICAgIHUxNl90ICAgc2VxOworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfRkxVU0goZGV2KTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X3RhaWwgPT0gdGlkX3J4LT5iYXdfaGVhZCkgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGlkX3J4LT5iYXdfdGFpbF0uYnVmOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh2b2lkKikmYWRkSW5mbywgKHZvaWQqKSZ0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKyAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAvL2lmKHBidWYgJiYgdGlkX3J4LT5iYXdfc2l6ZSA+IDApIHRpZF9yeC0+YmF3X3NpemUtLTsKKyAgICAgICAgdGlkX3J4LT5iYXdfdGFpbCA9ICh0aWRfcngtPmJhd190YWlsICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworCSAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmIChwYnVmKQorICAgICAgICB7CisKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIHBidWYpOworCisgICAgICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgcGJ1ZiwgMjIpID4+IDQ7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcSk7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiMi4gc2VxPSVkXG4iLCBzZXEpOworICAgICAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgcGJ1ZiwgJmFkZEluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBwYnVmLCAyMikgPj4gNDsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSZWN2IGluZGljYXRlIHNlcT0lZFxuIiwgc2VxKTsKKyAgICAgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBwYnVmLCAmYWRkSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiAxOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnUnhGcmVlQnVmICAgICAgICAgICAgICAqLworLyogICAgICBGcmVlcyBhbGwgcXVldWVkIHBhY2tldHMgaW4gYnVmZmVyIHdoZW4gdGhlIGRyaXZlciBpcyBkb3duLiAgICAgKi8KKy8qICAgICAgVGhlIHpmRnJlZVJlc291cmNlKCkgd2lsbCBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGFsbCBmcmVlZC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2ICAgICA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dSeEZyZWVCdWYoemRldl90KiBkZXYsIHUxNl90IGRlc3Ryb3kpCit7CisgICAgdTE2X3QgICBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgdTE2X3QgajsKKworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworCisgICAgICAgIGZvcihqPTA7IGogPD0gWk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBidWYgPSB0aWRfcngtPmZyYW1lW2pdLmJ1ZjsKKyAgICAgICAgICAgIHRpZF9yeC0+ZnJhbWVbal0uYnVmID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoIHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmID0gdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWY7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5iYXdfc2l6ZSA+IDApdGlkX3J4LT5iYXdfc2l6ZS0tOworICAgICAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICAgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICAgICAgdGlkX3J4LT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgICAgICAjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgICAgIGlmICh0aWRfYmF3LT5lbmFibGVkKSB7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiRGV2aWNlIGRvd24sIGNsZWFyIEJBVyBxdWV1ZToiLCBpKTsKKyAgICAgICAgICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCkgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICAgICAgd2hpbGUgKGJ1ZikgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IHpmQWdnVHhHZXRWdHhxKGRldiwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3Ryb3kpIHsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+YWdnUVBvb2xbaV0sIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+dGlkX3J4W2ldLCBzaXplb2Yoc3RydWN0IGFnZ190aWRfcngpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVworICAgIGlmKGRlc3Ryb3kpIHpmd01lbUZyZWUoZGV2LCBCQVcsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCit2b2lkIHpmQWdnUmVjdkJBUih6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYpIHsKKyAgICB1MTZfdCBzdGFydF9zZXEsIGxlbjsKKyAgICB1OF90IGksIGJpdG1hcFs4XTsKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBzdGFydF9zZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBsZW4tMik7CisgICAgRGJnUHJpbnQoIlJlY2VpdmVkIGEgQkFSIENvbnRyb2wgZnJhbWUsIHN0YXJ0X3NlcT0lZCIsIHN0YXJ0X3NlcT4+NCk7CisgICAgLyogdG9kbzogc2V0IHRoZSBiaXRtYXAgYnkgcmVvcmRlcmluZyBidWZmZXIhICovCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSBiaXRtYXBbaV09MDsKKyAgICB6ZlNlbmRCQShkZXYsIHN0YXJ0X3NlcSwgYml0bWFwKTsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90IHJlbW92ZUxlbjsKKyAgICB1MTZfdCBlcnI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMTVdOworICAgICAgICBhZ2dDb250cm9sLT50aWRfYmF3LT5zdGFydF9zZXEgPSB0aWRfdHgtPmJhcl9zc24gPj4gNDsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInN0YXJ0IHNlcT0iLCB0aWRfdHgtPmJhcl9zc24gPj4gNCk7CisgICAgfQorICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNF0gfD0gKDEgPDwgMTEpOworICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgLy9pZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wICYmICEoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlcls2XSYweDEpKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vaWYgKCgoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICAgICAgaWYgKFpNX0FHR19MQVNUX01QRFUgPT0gYWdnQ29udHJvbC0+YW1wZHVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsxXSAmPSB+MHg0MDAwOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlpNX0FHR19MQVNUX01QRFUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZSB7CisgICAgICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCBoZWFkZXJbMl0mMHgzID0gIixidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgLy8gICAgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAvL30KKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZSB7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9ICIsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbik7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNl0mMHgxKSk7CisgICAgICAgIC8vICAgIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQgPSAwOworICAgICAgICAvL30KKyAgICB9CisKKyAgICAvKmlmIChhZ2dDb250cm9sLT50aWRfYmF3KSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyX3IgaGVhZGVyX3I7CisKKyAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyOworICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWM7CisgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXA7CisgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbjsKKyAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5yZW1vdmVMZW47CisgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKworICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1Zl9pbmZvLT5idWYsIHRpZF90eC0+YmFyX3NzbiA+PiA0LCBhZ2dDb250cm9sLT50aWRfYmF3LCBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQsICZoZWFkZXJfcik7CisgICAgfSovCisKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YnVmLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuLAorICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsCisgICAgICAgICAgICAgICAgICAgICh1OF90KXRpZF90eC0+YWMsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHgpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIHJldHVybjsKKworemxFcnJvcjoKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmX2luZm8tPmJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGggICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGVsYXllci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiwgSG9uZGEgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdThfdCBmbGFnLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGlkOworICAgIHUxNl90IGRhWzNdOworICAgIHUxNl90IHNhWzNdOworICAgIHU4X3QgdXA7CisgICAgdThfdCBxb3NUeXBlLCBrZXlJZHggPSAwOworICAgIHUxNl90IGZyYWdPZmY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vCisgICAgfQorI2Vsc2UKKyAgICAvKiBEQSAqLworICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIC8qIFNBICovCisgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworI2VuZGlmCisgICAgLy9EZWNpZGUgS2V5IEluZGV4IGluIEFUT00sIE5vIG1lYW5pbmcgaW4gT1RVUy0tQ1dZYW5nKG0pCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAga2V5SWR4ID0gd2QtPmFwLmJjSGFsS2V5SWR4W3BvcnRdOworICAgICAgICBpZCA9IHpmQXBGaW5kU3RhKGRldiwgZGEpOworICAgICAgICBpZiAoaWQgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBjYXNlIFpNX1RLSVA6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAga2V5SWR4ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICBrZXlJZHggPSB3ZC0+c3RhLmtleUlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgIGtleUlkeCA9IDU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUlkeCA9IHdkLT5zdGEuY2VuY0tleUlkOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIFNOQVAgKi8KKyAgICByZW1vdmVMZW4gPSB6ZlR4R2VuV2xhblNuYXAoZGV2LCBidWYsIHNuYXAsICZzbmFwTGVuKTsKKyAgICAvL3ptX21zZzFfdHgoWk1fTFZfMCwgImZyYWdPZmY9IiwgZnJhZ09mZik7CisKKyAgICBmcmFnTGVuID0gd2QtPmZyYWdUaHJlc2hvbGQ7CisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBmcmFtZUxlbiAtPSByZW1vdmVMZW47CisKKyNpZiAwCisgICAgLyogQ3JlYXRlIE1JQyAqLworICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fVEtJUCkgKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZUxlbiA+IGZyYWdMZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcHBlbmQgTUlDIGJ5IEhNQUMgKi8KKyAgICAgICAgICAgIG1pY0xlbiA9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWljTGVuID0gMDsKKyAgICB9CisjZWxzZQorICAgIGlmICggZnJhbWVMZW4gPiBmcmFnTGVuICkKKyAgICB7CisgICAgICAgIG1pY0xlbiA9IHpmVHhHZW5XbGFuVGFpbChkZXYsIGJ1Ziwgc25hcCwgc25hcExlbiwgbWljKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYXBwZW5kIE1JQyBieSBITUFDICovCisgICAgICAgIG1pY0xlbiA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogQXNzaWduIHNlcXVlbmNlIG51bWJlciAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZnJhZy5zZXFbMF0gPSAoKHdkLT5zZXFbemNVcFRvQWNbdXAmMHg3XV0rKykgPDwgNCk7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGZyYWcuc2VxWzBdOworCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJzdGFydCBzZXE9IiwgdGlkX3R4LT5iYXJfc3NuID4+IDQpOworICAgIH0KKyAgICAvL3RpZF90eC0+YmF3X2J1Zlt0aWRfdHgtPmJhd19oZWFkLTFdLmJhd19zZXE9ZnJhZy5zZXFbMF07CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgICAgIGZyYWcuYnVmWzBdID0gYnVmOworICAgICAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgICAgICBmcmFnLmZsYWdbMF0gPSBmbGFnOworICAgICAgICBmcmFnTnVtID0gMTsKKworICAgIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgIGlmICh1cCAhPTAgKSB6bV9kZWJ1Z19tc2cxKCJ1cCBub3QgMCwgdXA9Iix1cCk7CisgICAgICAgIGhlYWRlckxlbiA9IHpmVHhHZW5XbGFuSGVhZGVyKGRldiwgZnJhZy5idWZbaV0sIGhlYWRlciwgZnJhZy5zZXFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1tpXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgZGEsIHNhLCB1cCwgJm1pY0xlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnQ29udHJvbCk7CisKKyAgICAgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBmcmFnLmJ1ZltpXSwgJmFkZHJUYmwpKSA9PSAwKQorICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGZyYWcuYnVmW2ldLCAmYWRkclRibCkpID09IDApCisgICAgICAgIC8veworICAgICAgICAvLyAgICBlcnIgPSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSOworICAgICAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgICAgIC8vfQorCisgICAgICAgIC8qIEZsdXNoIGJ1ZmZlciBvbiBjYWNoZSAqLworICAgICAgICAvL3pmd0J1ZkZsdXNoKGRldiwgZnJhZy5idWZbaV0pOworCisjaWYgMAorICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJoZWFkZXJMZW49IiwgaGVhZGVyTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAic25hcExlbj0iLCBzbmFwTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAibWljTGVuPSIsIG1pY0xlbik7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgInJlbW92ZUxlbj0iLCByZW1vdmVMZW4pOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgImZyYWcuYnVmVHlwZVswXT0iLCBmcmFnLmJ1ZlR5cGVbMF0pOworI2VuZGlmCisKKyAgICAgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSk7CisgICAgICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisjaWYgMCAvL1dobyBjYXJlIHRoaXM/CisgICAgICAgIGlmICggKGkpJiYoaSA9PSAoZnJhZ051bS0xKSkgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dHJhZlRhbGx5LnR4RGF0YUJ5dGVDb3VudCAtPSBtaWNMZW47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qaWYgKGFnZ0NvbnRyb2wtPnRpZF9iYXcgJiYgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCkgeworICAgICAgICAgICAgc3RydWN0IGJhd19oZWFkZXJfciBoZWFkZXJfcjsKKworICAgICAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBoZWFkZXI7CisgICAgICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IG1pYzsKKyAgICAgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gc25hcDsKKyAgICAgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gaGVhZGVyTGVuOworICAgICAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBtaWNMZW47CisgICAgICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IHNuYXBMZW47CisgICAgICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IHJlbW92ZUxlbjsKKyAgICAgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0ga2V5SWR4OworCisgICAgICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1ZiwgdGlkX3R4LT5iYXJfc3NuID4+IDQsIGFnZ0NvbnRyb2wtPnRpZF9iYXcsIDAsICZoZWFkZXJfcik7CisgICAgICAgIH0qLworCisgICAgICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhlYWRlckxlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljLCBtaWNMZW4sIGZyYWcuYnVmW2ldLCByZW1vdmVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSwgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisKKworICAgICAgICBjb250aW51ZTsKKworemxFcnJvcjoKKyAgICAgICAgaWYgKGZyYWcuYnVmVHlwZVtpXSA9PSBaTV9FWFRFUk5BTF9BTExPQ19CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBmcmFnLmJ1ZltpXSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmcmFnLmJ1ZlR5cGVbaV0gPT0gWk1fSU5URVJOQUxfQUxMT0NfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgZnJhZy5idWZbaV0sIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfSAvKiBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyoKKyAqIHpmQWdnU2VuZEFEREJBKCkgcmVmZXJzIHpmU2VuZE1tRnJhbWUoKSBpbiBjbW0uYworICovCit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgdTE2X3QgKmRzdCwgdTE2X3QgYWMsIHUxNl90IHVwKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KGRldiwgYnVmLCBvZmZzZXQsIGFjLCB1cCk7CisKKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKgorICAgICAqIENvcHkgd2xhbiBoZWFkZXIKKyAgICAgKi8KKyAgICB6ZkFnZ0dlbkFkZGJhSGVhZGVyKGRldiwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAib2Zmc2V0PSIsIG9mZnNldCk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJobGVuPSIsIGhsZW4pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5sZW5bMF09IiwgYWRkclRibC5sZW5bMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5waHlzQWRkcmxbMF09IiwgYWRkclRibC5waHlzQWRkcmxbMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CisKKyAgICAjaWYgMAorICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwLCBidWYsIDAsCisgICAgICAgICAgICBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDAsIDB4ZmYpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICAjZWxzZQorICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisKK30KKwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBhYywgdTE2X3QgdXApCit7CisgICAgdTE2X3QgYmFfcGFyYW1ldGVyLCBzdGFydF9zZXE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiBBRERCQSBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ2F0ZWdvcnkKKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDMpOworICAgIC8qCisgICAgICogQWN0aW9uIGRldGFpbHMgPSAwCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUpOworICAgIC8qCisgICAgICogRGlhbG9nIFRva2VuID0gbm9uemVybworICAgICAqIFRCRDogZGVmaW5lIGhvdyB0byBnZXQgZGlhbG9nIHRva2VuPworICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMik7CisgICAgLyoKKyAgICAgKiBCbG9jayBBY2sgcGFyYW1ldGVyIHNldAorICAgICAqIEJBIHBvbGljeSA9IDEgZm9yIGltbWVkaWF0ZSBCQSwgMCBmb3IgZGVsYXllZCBCQQorICAgICAqIFRJRCg0Yml0cykgJiBidWZmZXIgc2l6ZSg0Yml0cykgKFRJRD11cCAmIGJ1ZmZlciBzaXplPTB4ODApCisgICAgICogVEJEOiBob3cgdG8gZ2V0IGJ1ZmZlciBzaXplPworICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgKiCieCAgICBCMCAgICCieCAgICBCMSAgICAgonggQjIgIEI1IKJ4IEI2ICAgICAgQjE1IKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4IFJlc2VydmVkIKJ4IEJBIHBvbGljeSCieCAgVElEICAgonggQnVmZmVyIHNpemUgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgYmFfcGFyYW1ldGVyID0gMSA8PCAxMjsgICAgIC8vIGJ1ZmZlciBzaXplID0gMHg0MCg2NCkKKyAgICBiYV9wYXJhbWV0ZXIgfD0gdXAgPDwgMjsgICAgLy8gdGlkID0gdXAKKyAgICBiYV9wYXJhbWV0ZXIgfD0gMjsgICAgICAgICAgLy8gYmEgcG9saWN5ID0gMQorICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIGJhX3BhcmFtZXRlcik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQkEgdGltZW91dCB2YWx1ZQorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDApOworICAgIG9mZnNldCs9MjsKKyAgICAvKgorICAgICAqIEJBIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggRnJhZyBudW0oMCkgonggQkEgc3RhcnRpbmcgc2VxIG51bSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgc3RhcnRfc2VxID0gKCh3ZC0+c2VxW2FjXSkgPDwgNCkgJiAweEZGRjA7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgc3RhcnRfc2VxKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCit1MTZfdCB6ZkFnZ0dlbkFkZGJhSGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMzI7ICAgICAgICAvLyBNQUMgY3RybCArIFBIWSBjdHJsICsgODAyLjExIE1NIGhlYWRlcgorICAgIC8vdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nCisgICAgICovCisgICAgLy9ib2R5TGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaGVhZGVyWzBdID0gMjQrbGVuKzQ7ICAgLy9MZW5ndGgKKyAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAvL01BQyBjb250cm9sLCBiYWNrb2ZmICsgKGFjaykKKworI2lmIDAKKyAgICAvKiBDQ0sgMU0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZWxzZQorICAgIC8qIE9GRE0gNk0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDE7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZW5kaWYKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgV0xBTiBoZWFkZXIKKyAgICAgKiBGcmFtZSBjb250cm9sIGZyYW1lIHR5cGUgYW5kIHN1YnR5cGUKKyAgICAgKi8KKyAgICBoZWFkZXJbNCswXSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisgICAgLyoKKyAgICAgKiBEdXJhdGlvbgorICAgICAqLworICAgIGhlYWRlcls0KzFdID0gMDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDMgPSAwMDowMDowMDowMDowMDowMCAqLworICAgICAgICBoZWFkZXJbNCs4XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzldID0gMDsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5tYWNBZGRyWzJdICsgKHZhcDw8OCk7CisgICAgfQorCisgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICBoZWFkZXJbNCsyXSA9IGRzdFswXTsKKyAgICBoZWFkZXJbNCszXSA9IGRzdFsxXTsKKyAgICBoZWFkZXJbNCs0XSA9IGRzdFsyXTsKKworICAgIC8qIEFkZHJlc3MgMiA9IFNBICovCisgICAgaGVhZGVyWzQrNV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbNCs2XSA9IHdkLT5tYWNBZGRyWzFdOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXTsKKyAgICB9CisKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBoZWFkZXJbNCsxMV0gPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgcmV0dXJuIGhsZW47Cit9CisKKwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGNhdGVnb3J5OworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICB6ZkFnZ0Jsb2NrQWNrQWN0aW9uRnJhbWUoZGV2LCBidWYpOworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGFjdGlvbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWN0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXF1ZXN0Iik7CisgICAgICAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdChkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXNwb25zZSIpOworICAgICAgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9XTEFOX0RFTEJBX0ZSQU1FOgorICAgICAgICB6ZkFnZ1JlY3ZEZWxiYShkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy91MTZfdCBkaWFsb2c7CisgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgYmY7CisgICAgdTE2X3QgaTsKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjcpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIC8qCisgICAgICogQkEgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyCisgICAgICovCisgICAgYmYuYmFfc3RhcnRfc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpID4+IDQ7CisKKyAgICBpPTI2OworICAgIHdoaWxlKGkgPCAzMikgeworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJSZWN2IEFEREJBIFJlcToiLCB6bXdfcnhfYnVmX3JlYWRiKGRldixidWYsaSkpOworICAgICAgICBpKys7CisgICAgfQorCisgICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZShkZXYsICZiZik7CisKKyAgICB6ZkFnZ0FkZGJhU2V0VGlkUngoZGV2LCBidWYsICZiZik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYpCit7CisgICAgdTE2X3QgaSwgYWMsIGFpZCwgZnJhZ09mZjsKKyAgICB1MTZfdCBzcmNbM107CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1OF90ICB1cDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKyAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKyAgICBhYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICBhYyA9IGJmLT50aWQ7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFIDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKHdkLT50aWRfcnhbaV0tPmFpZCA9PSBhaWQpICYmICh3ZC0+dGlkX3J4W2ldLT5hYyA9PSBhYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF9yeCA9IHdkLT50aWRfcnhbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGlkX3J4KQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnRpZF9yeFtpXS0+YWlkID09IFpNX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF9yeC0+YWlkID0gYWlkOworICAgIHRpZF9yeC0+YWMgPSBhYzsKKyAgICB0aWRfcngtPmFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlID0gWk1fQUdHX0FEREJBX1JFU1BPTlNFOworICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gYmYtPmJhX3N0YXJ0X3NlcTsKKyAgICB0aWRfcngtPmJhd19oZWFkID0gdGlkX3J4LT5iYXdfdGFpbCA9IDA7CisgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQgPSB0aWRfcngtPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGksYWMsIGFpZD0wOworICAgIHUxNl90IHNyY1szXTsKKyAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciBiZjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgYmYuc3RhdHVzX2NvZGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNyk7CisgICAgaWYgKCFiZi5zdGF0dXNfY29kZSkKKyAgICB7CisgICAgICAgIHdkLT5hZGRiYUNvbXBsZXRlPTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpOworCisgICAgaT0yNjsKKyAgICB3aGlsZShpIDwgMzIpIHsKKyAgICAgICAgem1fZGVidWdfbXNnMigiUmVjdiBBRERCQSBSc3A6Iiwgem13X3J4X2J1Zl9yZWFkYihkZXYsYnVmLGkpKTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIGFjID0gemNVcFRvQWNbYmYudGlkJjB4N10gJiAweDM7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDA7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ1JlY3ZEZWxiYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZSh6ZGV2X3QqIGRldiwgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyoKKyAgICAgKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgbWFuYWdtZW50IGZyYW1lCisgICAgICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXJ2ZSByb29tIGZvciB3bGFuIGhlYWRlcgorICAgICAqLworICAgIG9mZnNldCA9IGhsZW47CisKKyAgICAvKgorICAgICAqIGFkZCBhZGRiYSBmcmFtZSBib2R5CisgICAgICovCisgICAgb2Zmc2V0ID0gemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KGRldiwgYnVmLCBiZiwgb2Zmc2V0KTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJmLT5idWYsIDEwKTsKKyAgICBkc3RbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYmYtPmJ1ZiwgMTIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBiZi0+YnVmLCAxNCk7CisgICAgemZBZ2dHZW5BZGRiYUhlYWRlcihkZXYsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOworICAgIGZvciAoaT0wOyBpPChobGVuPj4xKTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmxTaXplPSIsIGFkZHJUYmxTaXplKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwubGVuWzBdPSIsIGFkZHJUYmwubGVuWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+ZGF0YT0iLCBidWYtPmRhdGEpOworCisgICAgI2lmIDAKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB6ZlB1dFZtbXEoZGV2LCBidWYpOworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICAjZW5kaWYKKworICAgIC8vemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgZHN0LCB6Y1VwVG9BY1tiZi0+dGlkJjB4N10gJiAweDMsIGJmLT50aWQpOworICAgIHJldHVybiBaTV9TVUNDRVNTOworCit9CisKK3UxNl90ICAgemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYsIHUxNl90IG9mZnNldCkKK3sKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQUREQkEgUmVxdWVzdCBmcmFtZSBib2R5CisgICAgICovCisKKyAgICAvKgorICAgICAqIENhdGVnb3J5CisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAzKTsKKyAgICAvKgorICAgICAqIEFjdGlvbiBkZXRhaWxzID0gMAorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSk7CisgICAgLyoKKyAgICAgKiBEaWFsb2cgVG9rZW4gPSBub256ZXJvCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBiZi0+ZGlhbG9nKTsKKyAgICAvKgorICAgICAqIFN0YXR1cyBjb2RlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQmxvY2sgQWNrIHBhcmFtZXRlciBzZXQKKyAgICAgKiBCQSBwb2xpY3kgPSAxIGZvciBpbW1lZGlhdGUgQkEsIDAgZm9yIGRlbGF5ZWQgQkEKKyAgICAgKiBUSUQoNGJpdHMpICYgYnVmZmVyIHNpemUoNGJpdHMpIChUSUQ9MHgxICYgYnVmZmVyIHNpemU9MHg4MCkKKyAgICAgKiBUQkQ6IGhvdyB0byBnZXQgVElEIG51bWJlciBhbmQgYnVmZmVyIHNpemU/CisgICAgICogonqid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworICAgICAqIKJ4ICAgIEIwICAgIKJ4ICAgIEIxICAgICCieCBCMiAgQjUgonggQjYgICAgICBCMTUgongKKyAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggUmVzZXJ2ZWQgonggQkEgcG9saWN5IKJ4ICBUSUQgICCieCBCdWZmZXIgc2l6ZSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiZi0+YmFfcGFyYW1ldGVyKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyoKKyAgICAgKiBCQSB0aW1lb3V0IHZhbHVlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgYmYtPmJhX3RpbWVvdXQpOworICAgIG9mZnNldCs9MjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgICB6ZkFnZ0ludm9rZUJhcih6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICBzdHJ1Y3QgYWdnQmFyQ29udHJvbCBhZ2dCYXJDb250cm9sOworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8vYmFyX2NvbnRyb2wgPSBhZ2dCYXJDb250cm9sLT50aWRfaW5mbyA8PCAxMiB8IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwIDw8IDIKKyAgICAvLyAgICAgICAgfCBhZ2dCYXJDb250cm9sLT5tdWx0aV90aWQgPDwgMSB8IGFnZ0JhckNvbnRyb2wtPmJhcl9hY2tfcG9saWN5OworICAgIGFnZ0JhckNvbnRyb2wuYmFyX2Fja19wb2xpY3kgPSAwOworICAgIGFnZ0JhckNvbnRyb2wubXVsdGlfdGlkID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLmNvbXByZXNzZWRfYml0bWFwID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLnRpZF9pbmZvID0gdGlkX3R4LT50aWQ7CisgICAgemZBZ2dTZW5kQmFyKGRldiwgdGlkX3R4LCAmYWdnQmFyQ29udHJvbCk7CisKKyAgICByZXR1cm47CisKK30KKy8qCisgKiB6ZkFnZ1NlbmRCYXIoKSByZWZlcnMgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KCkKKyAqLwordTE2X3QgICB6ZkFnZ1NlbmRCYXIoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgsIHN0cnVjdCBhZ2dCYXJDb250cm9sICphZ2dCYXJDb250cm9sKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMTYrODsgIC8qIG1hYyBoZWFkZXIgKyBjb250cm9sIGhlYWRlcnMqLworICAgIHUxNl90IGhlYWRlclsoOCsyNCsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEJhckJvZHkoZGV2LCBidWYsIG9mZnNldCwgdGlkX3R4LCBhZ2dCYXJDb250cm9sKTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworICAgIHpmQWdnR2VuQmFySGVhZGVyKGRldiwgdGlkX3R4LT5kc3QsIGhlYWRlciwgb2Zmc2V0LWhsZW4sIGJ1ZiwgdmFwLCBlbmNyeXB0KTsKKyAgICBmb3IgKGk9MDsgaTwoaGxlbj4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIGhlYWRlcltpXSk7CisgICAgfQorCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJvZmZzZXQ9Iiwgb2Zmc2V0KTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKworfQorCit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpCit7CisgICAgdTE2X3QgYmFyX2NvbnRyb2wsIHN0YXJ0X3NlcTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQkFSIENvbnRyb2wgZnJhbWUgYm9keQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBCQVIgQ29udHJvbCBGaWVsZAorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggICAgQjAgICCieCAgICBCMSAgICAgonggICAgIEIyICAgICCieCBCMyAgIEIxMSCieCBCMTIgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggQkFSIEFjayCieCBNdWx0aS1USUQgonggQ29tcHJlc3NlZCCieCBSZXNlcnZlZCCieCBUSURfSU5GTyCieAorICAgICAqIKJ4ICBQb2xpY3kgonggICAgICAgICAgIKJ4ICAgQml0bWFwICAgonggICAgICAgICAgonggICAgICAgICAgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneifQorICAgICAqLworICAgIGJhcl9jb250cm9sID0gYWdnQmFyQ29udHJvbC0+dGlkX2luZm8gPDwgMTIgfCBhZ2dCYXJDb250cm9sLT5jb21wcmVzc2VkX2JpdG1hcCA8PCAyCisgICAgICAgICAgICB8IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCA8PCAxIHwgYWdnQmFyQ29udHJvbC0+YmFyX2Fja19wb2xpY3k7CisKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiYXJfY29udHJvbCk7CisgICAgb2Zmc2V0Kz0yOworICAgIGlmICgwID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCkgeworICAgICAgICAvKgorICAgICAgICAgKiBCQSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIKKyAgICAgICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAgICAgKiCieCBGcmFnIG51bSgwKSCieCBCQSBzdGFydGluZyBzZXEgbnVtIKJ4CisgICAgICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICAgICAqLworICAgICAgICBzdGFydF9zZXEgPSAodGlkX3R4LT5iYXJfc3NuIDw8IDQpICYgMHhGRkYwOworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzdGFydF9zZXEpOworICAgICAgICBvZmZzZXQrPTI7CisgICAgfQorICAgIGlmICgxID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCAmJiAxID09IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwKSB7CisgICAgICAgIC8qIG11bHRpLXRpZCBCbG9ja0Fja1JlcSB2YXJpYW50LCBub3QgaW1wbGVtZW50ZWQqLworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3UxNl90IHpmQWdnR2VuQmFySGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMTYrODsgICAgICAgIC8vIE1BQyBjdHJsICsgUEhZIGN0cmwgKyA4MDIuMTEgTU0gaGVhZGVyCisgICAgLy91OF90IGZyYW1lVHlwZSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcKKyAgICAgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAxNitsZW4rNDsgICAvL0xlbmd0aAorICAgIGhlYWRlclsxXSA9IDB4ODsgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyAoYWNrKQorCisjaWYgMQorICAgIC8qIENDSyAxTSAqLworICAgIGhlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyNlbHNlCisgICAgLyogQ0NLIDZNICovCisgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorCisjZW5kaWYKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIFdMQU4gaGVhZGVyCisgICAgICogRnJhbWUgY29udHJvbCBmcmFtZSB0eXBlIGFuZCBzdWJ0eXBlCisgICAgICovCisgICAgaGVhZGVyWzQrMF0gPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkFSOworICAgIC8qCisgICAgICogRHVyYXRpb24KKyAgICAgKi8KKyAgICBoZWFkZXJbNCsxXSA9IDA7CisKKyAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgIGhlYWRlcls0KzJdID0gZHN0WzBdOworICAgIGhlYWRlcls0KzNdID0gZHN0WzFdOworICAgIGhlYWRlcls0KzRdID0gZHN0WzJdOworCisgICAgLyogQWRkcmVzcyAyID0gU0EgKi8KKyAgICBoZWFkZXJbNCs1XSA9IHdkLT5tYWNBZGRyWzBdOworICAgIGhlYWRlcls0KzZdID0gd2QtPm1hY0FkZHJbMV07CisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOworICAgIH0KKworICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGhlYWRlcls0KzExXSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICByZXR1cm4gaGxlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODdhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogY2FnZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBBLU1QRFUgYWdncmVnYXRpb24gcmVsYXRpdmVkIGZ1bmN0aW9ucy4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypSZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIb25kYSAgICAgICAxMi00LTA2ICAgICBjcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NBR0dfSAorI2RlZmluZSBfQ0FHR19ICisKKworLyoKKyAqIHRoZSBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgZmxhZywgMCBpZiBkb24ndCBkbyBhZ2dyZWdhdGUKKyAqLworCisjZGVmaW5lIFpNX0FHR19GUEdBX0RFQlVHICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fQUdHX0ZQR0FfUkVPUkRFUklORyAgICAgICAgICAgICAgMQorCisjaWZuZGVmIFpNX0FHR19UQUxMWQorLy8jZGVmaW5lIFpNX0FHR19UQUxMWQorI2VuZGlmCisvKgorICogQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fQkFXX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fQUdHUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fQUdHUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX0FHR1FfU0laRS0xKQorI2RlZmluZSBaTV9BR0dfTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDUKKworLyoKKyAqIG51bWJlciBvZiBhY2Nlc3MgY2F0ZWdvcmllcyAoYWMpCisgKi8KKyNkZWZpbmUgWk1fQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorLyoKKyAqIHRoZSB0aW1lciB0byBjbGVhciBhZ2dyZWdhdGlvbiBxdWV1ZSwgdW5pdDogMSB0aWNrCisgKiBpZiB0aGUgcGFja2V0IGlzIHRvbyBvbGQgKGN1cnJlbnQgdGltZSAtIGFycml2YWwgdGltZSkKKyAqIHRoZSBwYWNrZXQgYW5kIHRoZSBhZ2dyZWdhdGUgcXVldWUgd2lsbCBiZSBjbGVhcmVkCisgKi8KKyNkZWZpbmUgWk1fQUdHX0NMRUFSX1RJTUUgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBkZWxldGUgdGhlIHF1ZXVlIGlmIGlkbGUgZm9yIFpNX0RFTEVURV9USU1FCisgKiB1bml0OiAxMG1zCisgKi8KKyNkZWZpbmUgWk1fQUdHX0RFTEVURV9USU1FICAgICAgICAgICAgICAgICAgMTAwMDAKKworLyoKKyAqIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQorICovCisjZGVmaW5lIFpNX0FHR19CQVdfU0laRSAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX0FHR19CQVdfTUFTSyAgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQkFXX1NJWkUtMSkKKy8qCisgKiBvcmlnaW5hdG9yICAgICBBRERCQSBSZXNxdWVzdCAgICByZWNlaXZlcgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDF8ICAgICAgICAgIEFDSyAgICAgICAgICAgICAgICAgfDEKKyAqICAgICAgfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAyfCAgICAgICAgIEFEREJBIFJlc3BvbnNlICAgICAgIHwyCisgKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgM3wgICAgICAgICAgQUNLICAgICAgICAgICAgICAgICB8MworICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAqLworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVRVUVTVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19BRERCQV9SRVFVRVNUX0FDSyAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQUdHX0FEREJBX1JFU1BPTlNFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVTUE9OU0VfQUNLICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fQUdHX1NJTkdMRV9NUERVICAgICAgICAgICAgICAgICAgMDAKKyNkZWZpbmUgWk1fQUdHX0ZJUlNUX01QRFUgICAgICAgICAgICAgICAgICAgMDEKKyNkZWZpbmUgWk1fQUdHX01JRERMRV9NUERVICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgWk1fQUdHX0xBU1RfTVBEVSAgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBlbmQgb2YgQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIFRJRF9UWCAgc3RydWN0IGFnZ1F1ZXVlKgorI2RlZmluZSBUSURfQkFXIHN0cnVjdCBiYXdfcSoKKyNkZWZpbmUgQkFXIHdkLT5iYXdfZW5hYmxlcgorI2RlZmluZSBERVNUUSB3ZC0+ZGVzdFEKKworLyoKKyAqIFF1ZXVlIGFjY2VzcworICovCisjZGVmaW5lIHptX2FnZ19xbGVuKGRldiwgaGVhZCwgdGFpbCkgKChoZWFkIC0gdGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykKKyNkZWZpbmUgem1fYWdnX2luUSh0aWRfdHgsIHB0KSAoKCgocHQgLSB0aWRfdHgtPmFnZ1RhaWwpICYgWk1fQUdHUV9TSVpFX01BU0spIDwgXAorICAgICAgICAoKHRpZF90eC0+YWdnSGVhZCAtIHRpZF90eC0+YWdnVGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykpPyBUUlVFOkZBTFNFKQorI2RlZmluZSB6bV9hZ2dfcGx1cyhwdCkgcHQgPSAocHQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLCisjZGVmaW5lIHptX2FnZ19taW4oQSwgQikgKChBPkIpPyBCOkEpCisjZGVmaW5lIHptX2FnZ19HZXRUaW1lKCkgd2QtPnRpY2sKKyNkZWZpbmUgVFhRTCAoemZIcEdldE1heFR4ZENvdW50KGRldikgLSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpCisKKy8qIGRvbid0IGNoYW5nZSBBR0dfTUlOX1RYUUwgZWFzaWx5LCB0aGlzIG1pZ2h0IGNhdXNlIEJBVyBCU09EICovCisjZGVmaW5lIEFHR19NSU5fVFhRTCAgICAgICAgICAgICAgICAgICAgICAgIDIKKy8qCisgKiBjb25zaWRlciB0Y3AsdWRwLGFjKDEyMzQpCisgKi8KKyNkZWZpbmUgem1fYWdnX2R5bmFtaWNfdGhyZXNob2xkKGRldiwgYXIpICAgKChhciA+IDE2KT8gMTE6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDEyKT8gODogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyID4gOCk/IDU6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDQpPyAyOjEpCisjZGVmaW5lIHptX2FnZ193ZWlnaHQoYWMpICAgKCgzID09IGFjKT8gNDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPT0gYWMpPyAyOjEpCisvKgorICogdGhlIHJlcXVpcmVkIGZyZWUgcXVldWUgcmF0aW8gcGVyIGFjCisgKi8KKworI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgICgoMyA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPT0gYWMpPyAoemZIcEdldE1heFR4ZENvdW50KGRldikqMS80KTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9PSBhYyk/ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpmSHBHZXRNYXhUeGRDb3VudChkZXYpKjMvNCkpCisKKy8vI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgIDMKKy8qCisgKiBlbmQgb2YgUXVldWUgYWNjZXNzCisgKi8KKworI2RlZmluZSBaTV9BR0dNU0dfTEVWICAgIFpNX0xWXzMKKyNkZWZpbmUgem1fbXNnMF9hZ2cobHYsIG1zZykgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfYWdnKGx2LCBtc2csIHZhbCkgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9hZ2cobHYsIG1zZywgdmFsKSBpZiAoWk1fQUdHTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCitzdHJ1Y3QgYmF3X2hlYWRlcl9yIHsKKyAgICB1MTZfdCAgICAgICAqaGVhZGVyOworICAgIHUxNl90ICAgICAgICptaWM7CisgICAgdTE2X3QgICAgICAgKnNuYXA7CisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwTGVuOworICAgIHUxNl90ICAgICAgIHJlbW92ZUxlbjsKKyAgICB1OF90ICAgICAgICBrZXlJZHg7Cit9OworCitzdHJ1Y3QgYmF3X2hlYWRlciB7CisgICAgdTE2X3QgICAgICAgaGVhZGVyWzI5XTsvL1soOCszMCsyKzE4KS8yXTsgIDU4IGJ5dGVzICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY1s0XTsgLy9bOC8yXTsgOCBieXRlcworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwWzRdOyAvL1s4LzJdOyA4IGJ5dGVzCisgICAgdTE2X3QgICAgICAgc25hcExlbjsKKyAgICB1MTZfdCAgICAgICByZW1vdmVMZW47CisgICAgdThfdCAgICAgICAga2V5SWR4OworfTsKKworc3RydWN0IGJ1ZkluZm8geworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1OF90ICAgICAgICBiYXdfcmV0cmFuc21pdDsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7CisgICAgc3RydWN0IGJhd19oZWFkZXIgICAqYmF3X2hlYWRlcjsKK307CisjZW5kaWYKK3N0cnVjdCBhZ2dFbGVtZW50Cit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUzMl90ICAgICAgIGFycml2YWxUaW1lOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgIGJhd19oZWFkZXI7Cit9OworCisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3N0cnVjdCBiYXdfYnVmCit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUxNl90ICAgICAgIGJhd19zZXE7CisgICAgdTMyX3QgICAgICAgdGltZXN0YW1wOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCBiYXdfaGVhZGVyIGJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X3EgeworICAgIHN0cnVjdCBiYXdfYnVmICBmcmFtZVtaTV9WVFhRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgc3RhcnRfc2VxOworICAgIHUxNl90ICAgICAgIGhlYWQ7CisgICAgdTE2X3QgICAgICAgdGFpbDsKKyAgICB1MTZfdCAgICAgICBzaXplOworICAgIFRJRF9UWCAgICAgIHRpZF90eDsKKworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X2VuYWJsZXIKK3sKKyAgICBzdHJ1Y3QgYmF3X3EgICAgdGlkX2Jhd1taTV9CQVdfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgIGRlbFBvaW50OworICAgIHZvaWQgICAgKCpjb3JlKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pOworICAgIC8vdm9pZCAgICAoKmNvcmUpOworICAgIHZvaWQgICAgKCppbml0KSh6ZGV2X3QqIGRldik7CisgICAgVElEX0JBVyAoKmdldE5ld1EpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOworICAgIFRJRF9CQVcgKCpnZXRRKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSk7CisgICAgdTE2X3QgICAoKmluc2VydCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKTsKKyAgICBzdHJ1Y3QgYnVmSW5mbyogKCpwb3ApKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKKyAgICB2b2lkICAgICgqZW5hYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpOworICAgIHZvaWQgICAgKCpkaXNhYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KTsKKworfTsKKyNlbmRpZgorc3RydWN0IGFnZ1F1ZXVlCit7CisgICAgc3RydWN0ICAgICAgYWdnRWxlbWVudCAgYWdndnR4cVtaTV9BR0dRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGFnZ0hlYWQ7CisgICAgdTE2X3QgICAgICAgYWdnVGFpbDsKKyAgICBzMTZfdCAgICAgICBzaXplOworICAgIHUxNl90ICAgICAgIGFnZ1FTVEE7CisgICAgdTE2X3QgICAgICAgYWdnUUVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgYWM7CisgICAgdTE2X3QgICAgICAgdGlkOworICAgIHUxNl90ICAgICAgIGFnZ1JlYWR5OworICAgIHUxNl90ICAgICAgIGNsZWFyRmxhZzsKKyAgICB1MTZfdCAgICAgICBkZWxldGVGbGFnOworICAgIHUzMl90ICAgICAgIGxhc3RBcnJpdmFsOworICAgIHUxNl90ICAgICAgIGFnZ0ZyYW1lU2l6ZTsKKyAgICB1MTZfdCAgICAgICBiYXJfc3NuOyAgICAvKiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaW4gQkFSICovCisgICAgdTE2X3QgICAgICAgZHN0WzNdOworICAgIHUxNl90ICAgICAgIGNvbXBsZXRlOyAgICAgLyogY29tcGxldGUgaW5kaWNhdGlvbiBwb2ludGVyICovCit9OworCitzdHJ1Y3QgYWdnU3RhCit7CisgICAgdTE2X3QgICAgICAgY291bnRbWk1fQUNdOworICAgIFRJRF9UWCAgICAgIHRpZF90eFs4XTsKKyAgICB1MTZfdCAgICAgICBhZ2dGbGFnW1pNX0FDXTsKK307CisKK3N0cnVjdCBhZ2dfdGlkX3J4Cit7CisgICAgdTE2X3QgICAgICAgYWlkOworICAgIHUxNl90ICAgICAgIGFjOworICAgIHUxNl90ICAgICAgIGFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlOworICAgIC8vc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvOworICAgIHUxNl90ICAgICAgIHNlcV9zdGFydDsJCS8qIGZpcnN0IHNlcSBleHBlY3RlZCBuZXh0ICovCisgICAgdTE2X3QgICAgICAgYmF3X2hlYWQ7CQkvKiBoZWFkIG9mIHZhbGlkIGJsb2NrIGFjayB3aW5kb3cgKi8KKyAgICB1MTZfdCAgICAgICBiYXdfdGFpbDsJCS8qIHRhaWwgb2YgdmFsaWQgYmxvY2sgYWNrIHdpbmRvdyAqLworICAgIC8vdTE2X3QgICAgICAgZnJlZV9jb3VudDsJCS8qIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQkqLworICAgIHU4X3QgICAgICAgIHNxX2V4Y2VlZF9jb3VudDsKKyAgICB1OF90ICAgICAgICBzcV9iZWhpbmRfY291bnQ7CisgICAgc3RydWN0IGFnZ0VsZW1lbnQgZnJhbWVbWk1fQUdHX0JBV19TSVpFICsgMV07IC8qIG91dC1vZi1vcmRlciByeCBmcmFtZXMgKi8KK307CisKK3N0cnVjdCBhZ2dDb250cm9sCit7CisgICAgdTE2X3QgICAgICAgYWdnRW5hYmxlZDsKKyAgICB1MTZfdCAgICAgICBhbXBkdUluZGljYXRpb247CisgICAgdTE2X3QgICAgICAgYWRkYmFJbmRpY2F0aW9uOworICAgIC8vVElEX0JBVyAgICAgdGlkX2JhdzsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlcgoreworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1MTZfdCAgICAgICBiYV9wYXJhbWV0ZXI7CisgICAgdThfdCAgICAgICAgZGlhbG9nOworICAgIHUxNl90ICAgICAgIGJhX3BvbGljeTsKKyAgICB1MTZfdCAgICAgICB0aWQ7CisgICAgdTE2X3QgICAgICAgYnVmZmVyX3NpemU7CisgICAgdTE2X3QgICAgICAgYmFfdGltZW91dDsKKyAgICB1MTZfdCAgICAgICBiYV9zdGFydF9zZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzX2NvZGU7Cit9OworCitzdHJ1Y3QgYWdnQmFyQ29udHJvbAoreworICAgIHUxNl90ICAgICAgIGJhcl9hY2tfcG9saWN5ICAgICAgOworICAgIHUxNl90ICAgICAgIG11bHRpX3RpZCAgICAgICAgICAgOworICAgIHUxNl90ICAgICAgIGNvbXByZXNzZWRfYml0bWFwICAgOworICAgIHUxNl90ICAgICAgIHRpZF9pbmZvICAgICAgICAgICAgOworfTsKKworc3RydWN0IGFnZ1RhbGx5Cit7CisgICAgdTMyX3QgICAgICAgZ290X3BhY2tldHNfc3VtOworICAgIHUzMl90ICAgICAgIGdvdF9ieXRlc19zdW07CisgICAgdTMyX3QgICAgICAgc2VudF9wYWNrZXRzX3N1bTsKKyAgICB1MzJfdCAgICAgICBzZW50X2J5dGVzX3N1bTsKKyAgICB1MzJfdCAgICAgICBhdmdfZ290X3BhY2tldHM7CisgICAgdTMyX3QgICAgICAgYXZnX2dvdF9ieXRlczsKKyAgICB1MzJfdCAgICAgICBhdmdfc2VudF9wYWNrZXRzOworICAgIHUzMl90ICAgICAgIGF2Z19zZW50X2J5dGVzOworICAgIHUxNl90ICAgICAgIHRpbWU7Cit9OworCisKK3N0cnVjdCBkZXN0USB7CisgICAgc3RydWN0IGRlc3R7CisgICAgICAgIHUxNl90ICAgUXR5cGUgOiAxOyAvKiAwIGFnZ3IsIDEgdnR4cSAqLworICAgICAgICBUSURfVFggIHRpZF90eDsKKyAgICAgICAgdm9pZCogICB2dHhxOworCisgICAgICAgIHN0cnVjdCBkZXN0KiBuZXh0OworICAgIH0gKmRlc3RbNF07CisgICAgc3RydWN0IGRlc3QqIEhlYWRbNF07CisgICAgLy9zMTZfdCAgIHNpemVbNF07CisgICAgdTE2X3QgICBwcHJpOworICAgIHZvaWQgICAgKCppbnNlcnQpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworICAgIHZvaWQgICAgKCpkZWxldGUpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgdm9pZCAgICAoKmluaXQpKHpkZXZfdCogZGV2KTsKKyAgICBzdHJ1Y3QgZGVzdCogKCpnZXROZXh0KSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpOworICAgIHUxNl90ICAgKCpleGlzdCkoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgLy92b2lkICAgICgqc2NhbikoemRldl90KiBkZXYpOworfTsKKy8qCisgKiBhZ2dyZWdhdGlvbiB0eAorICovCit2b2lkICAgIHpmQWdnSW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCAgIHpmQXBGaW5kU3RhKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkcik7Cit1MTZfdCAgIHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitUSURfVFggIHpmQWdnVHhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWlkLCB1MTZfdCB0aWQpOworVElEX1RYICB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dUeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHRpZCk7Cit1MTZfdCAgIHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCk7Cit1MTZfdCAgIHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KTsKK1RJRF9UWCAgemZBZ2dUeEdldFJlYWR5UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFjKTsKK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pOwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSk7Cit1MTZfdCAgIHpmQWdnQ2xlYXJRdWV1ZSh6ZGV2X3QqIGRldik7Cit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKTsKKworLyogdGlkX3R4IG1hbmlwdWxhdGlvbiAqLworI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8qIGJ1Zl9pbmZvLCBUSURfVFggdGlkX3R4KTsKKyNlbmRpZgordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7Cit2b2lkICAgIHpmQWdnRGVzdERlbGV0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KTsKK3N0cnVjdCBkZXN0KiB6ZkFnZ0Rlc3RHZXROZXh0KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnRGVzdEV4aXN0KHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworLyoKKyAqIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KTsKK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4R2V0UXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dSeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4LCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gKmFkZEluZm8pOwordTE2X3QgICB6ZkFnZ1J4Rmx1c2goemRldl90KiBkZXYsIHUxNl90IHNlcV9ubywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCk7Cit1MTZfdCAgIHpmQWdnUnhGcmVlQnVmKHpkZXZfdCogZGV2LCB1MTZfdCBkZXN0cm95KTsKK3UxNl90ICAgemZBZ2dSeENsZWFyKHpkZXZfdCogZGV2LCB1MzJfdCB0aW1lKTsKK3ZvaWQgICAgemZBZ2dSZWN2QkFSKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKgorICogZW5kIG9mIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KKworLyoKKyAqIEFEREJBCisgKi8KK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KHpkZXZfdCogZGV2LCB1MTZfdCAqZHN0LCB1MTZfdCBhYywgdTE2X3QgdXApOwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFjLCB1MTZfdCB1cCk7Cit1MTZfdCAgIHpmQWdnR2VuQWRkYmFIZWFkZXIoemRldl90KiBkZXYsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgdTE2X3QqIGhlYWRlciwgdTE2X3QgbGVuLCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5cHQpOwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkRlbGJhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7Cit1MTZfdCAgIHpmQWdnU2V0QWRkYmFSZXNwb25zZUZyYW1lQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmLCB1MTZfdCBvZmZzZXQpOwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7CisvKgorICogemZBZ2dUeFNlbmRFdGgKKyAqLwordTE2X3QgemZBZ2dUeFNlbmRFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0LCB1MTZfdCBidWZUeXBlLCB1OF90IGZsYWcsIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sLCBUSURfVFggdGlkX3R4KTsKKworLyoKKyAqIHN0YXRpc3RpY3MgZnVuY3Rpb25zCisgKi8KK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldik7CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KTsKKworLyoKKyAqIEJBUgorICovCit2b2lkICAgIHpmQWdnSW52b2tlQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dTZW5kQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4LCBzdHJ1Y3QgYWdnQmFyQ29udHJvbCAqYWdnQmFyQ29udHJvbCk7Cit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpOwordTE2X3QgICB6ZkFnZ0dlbkJhckhlYWRlcih6ZGV2X3QqIGRldiwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7CisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKy8qIEJBVyBCQSByZXRyYW5zbWlzc2lvbiAqLwordm9pZCAgICB6ZkJhd0NvcmUoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEsIHUzMl90IGJpdG1hcCwgdTE2X3QgYWdnTGVuKTsKK3ZvaWQgICAgemZCYXdJbml0KHpkZXZfdCogZGV2KTsKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkJhd0luc2VydCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGJhd19zZXEsIFRJRF9CQVcgdGlkX2JhdywgdThfdCBiYXdfcmV0cmFuc21pdCwgc3RydWN0IGJhd19oZWFkZXJfciAqaGVhZGVyX3IpOworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKTsKK3ZvaWQgICAgemZCYXdEaXNhYmxlKHpkZXZfdCogZGV2LCBUSURfQkFXIHRpZF9iYXcpOworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpOwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCk7CisjZW5kaWYKKy8qIGV4dGVybiBmdW5jdGlvbnMgKi8KK2V4dGVybiB6YnVmX3QqIHpmR2V0VnR4cSh6ZGV2X3QqIGRldiwgdThfdCBhYyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DQUdHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5OTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTAsMCArMSwxODYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjbWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1hbmQgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworCit1MTZfdCB6ZldsYW5SZXNldCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZlVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldik7CisKKworZXh0ZXJuIHZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZmlVc2JPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnT3V0Q29tcGxldGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmSHBSZWluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisKKy8qIEdldCBzaXplIChieXRlKSBvZiBkcml2ZXIgY29yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICovCisvKiBUaGlzIHNpemUgd2lsbCBiZSB1c2VkIGJ5IGRyaXZlciB3cmFwcGVyIHRvIGFsbG9jYXRlICAgICAqLworLyogYSBtZW1vcnkgc3BhY2UgZm9yIGRyaXZlciBjb3JlIHRvIHN0b3JlIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3UxNl90IHpmaUdsb2JhbERhdGFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IHJldDsKKyAgICByZXQgPSAoc2l6ZW9mKHN0cnVjdCB6c1dsYW5EZXYpKTsKKyAgICB6bV9hc3NlcnQoKHJldD4+MTYpID09IDApOworICAgIHJldHVybiAodTE2X3QpcmV0OworfQorCisKKy8qIEluaXRpYWxpemUgV0xBTiBoYXJkd2FyZSBhbmQgc29mdHdhcmUsIHJlc291cmNlIHdpbGwgYmUgYWxsb2NhdGVkICovCisvKiBmb3IgV0xBTiBvcGVyYXRpb24sIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSBvdGhlciBmdW5jdGlvbi4gICAqLworZXh0ZXJuIHUxNl90IHpmaVdsYW5PcGVuKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDYkZ1bmNUYmwqIGNiRnVuY1RibCkKK3sKKyAgICAvL3UxNl90IHJldDsKKyAgICAvL3UzMl90IGk7CisgICAgLy91OF90KiBjaDsKKyAgICAvL3U4X3QgIGJQYXNzaXZlOworICAgIHUzMl90IGRldlNpemU7CisgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIGNiVXNiRnVuY1RibDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJzdGFydCIpOworCisgICAgZGV2U2l6ZSA9IHNpemVvZihzdHJ1Y3QgenNXbGFuRGV2KTsKKyAgICAvKiBaZXJvaXplIHpzV2xhbkRldiBzdHJ1Y3QgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLCAodTE2X3QpZGV2U2l6ZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICB6ZkFnZ0luaXQoZGV2KTsKKyNlbmRpZgorCisgICAgemZDd21Jbml0KGRldik7CisKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsID0gMDsKKyAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKworICAgIGlmIChjYkZ1bmNUYmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHpmY2JSZWN2RXRoKCkgaXMgbWFuZGF0b3J5ICovCisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNiRnVuY1RibC0+emZjYlJlY3ZFdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogemZjYlJlY3ZFdGgoKSBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JEaXNBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFwQ29ubmVjdE5vdGlmeSA9IGNiRnVuY1RibC0+emZjYkFwQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTY2FuTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiU2Nhbk5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWljRmFpbHVyZU5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgICAgIHdkLT56ZmNiSWJzc1BhcnRuZXJOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JJYnNzUGFydG5lck5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWFjQWRkcmVzc05vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uID0gY2JGdW5jVGJsLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICAgICAgd2QtPnpmY2JSZWN2RXRoID0gY2JGdW5jVGJsLT56ZmNiUmVjdkV0aDsKKyAgICAgICAgd2QtPnpmY2JSZXN0b3JlQnVmRGF0YSA9IGNiRnVuY1RibC0+emZjYlJlc3RvcmVCdWZEYXRhOworICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMSA9IGNiRnVuY1RibC0+emZjYlJlY3Y4MDIxMTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ2VuY0Fzb2NOb3RpZnk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgPSBjYkZ1bmNUYmwtPnpmY2JDbGFzc2lmeVR4UGFja2V0OworICAgICAgICB3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JId1dhdGNoRG9nTm90aWZ5OworICAgIH0KKworICAgIC8vYWRkIGJ5IGhvbmRhIDAzMzAKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYlJlY3YgPSB6ZmlVc2JSZWN2OworICAgIGNiVXNiRnVuY1RibC56ZmNiVXNiUmVnSW4gPSB6ZmlVc2JSZWdJbjsKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYk91dENvbXBsZXRlID0gemZpVXNiT3V0Q29tcGxldGU7CisgICAgY2JVc2JGdW5jVGJsLnpmY2JVc2JSZWdPdXRDb21wbGV0ZSA9IHpmaVVzYlJlZ091dENvbXBsZXRlOworICAgIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soZGV2LCAmY2JVc2JGdW5jVGJsKTsKKyAgICAvKiBJbml0IE9XTiBNQUMgYWRkcmVzcyAqLworICAgIHdkLT5tYWNBZGRyWzBdID0gMHg4MDAwOworICAgIHdkLT5tYWNBZGRyWzFdID0gMHgwMDAwOworICAgIHdkLT5tYWNBZGRyWzJdID0gMHgwMDAwOworCisgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID0gMHhmZmZmOworCisgICAgemZIcEluaXQoZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgIC8qIGluaXQgcmVnaW9uIGNvZGUgKi8KKyAgICAvL3dkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5VTEwxX1dPUkxEOyAvL09ubHkgMi40ZyBSZWdDb2RlCisgICAgLy96ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBOVUxMMV9XT1JMRCk7CisgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWQKKyAgICAvKiBHZXQgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKyAgICAvL3dkLT5mcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3RDaGFubmVsKGRldiwgJmJQYXNzaXZlKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgIC8vd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisjZW5kaWYKKworICAgIC8vU1RBIG1vZGUKKyAgICB3ZC0+c3RhLm1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS51VHhSYXRlID0gMHgzOworICAgIHdkLT5zdGEubW1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS5hZGFwdGVyU3RhdGUgPSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gPSAweDAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSA9IDB4MDA7CisKKyAgICB3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgd2QtPnN0YS5odEN0cmxTVEJDID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybFNHID0gMDsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSA9IDA7CisgICAgLy93ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCA9IFpNX1RJTUVfQUNUSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisJeworCQl1OF90IER1ciA9IFpNX1RJTUVfQUNUSVZFX1NDQU47CisJCXpmd0dldEFjdGl2ZVNjYW5EdXIoZGV2LCAmRHVyKTsKKwkJd2QtPnN0YS5hY3RpdmVzY2FuVGlja1BlckNoYW5uZWwgPSBEdXIvWk1fTVNfUEVSX1RJQ0s7CisKKwl9CisgICAgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsID0gWk1fVElNRV9QQVNTSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisgICAgd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgd2QtPnN0YS5kcm9wVW5lbmNyeXB0ZWRQa3RzID0gRkFMU0U7CisKKyAgICAvKiBzZXQgZGVmYXVsdCB0byBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgZm9yIGxpbnV4LCB3aW5kb3cgWFAgd291bGQgc2V0IDAgYnkgd3JhcHBlciBpbml0aWFsaXphdGlvbiAqLworCXdkLT5zdGEuYkFsbE11bHRpY2FzdCA9IDE7CisKKyAgICAvKiBJbml0aWFsIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICB3ZC0+c3RhLnJpZnNTdGF0ZSA9IFpNX1JJRlNfU1RBVEVfREVURUNUSU5HOworICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgd2QtPnN0YS5yaWZzQ291bnQgPSAwOworCisgICAgd2QtPnN0YS5vc1J4RmlsdGVyID0gMDsKKyAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAvL0NvbW1vbgorICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QpOworICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICB3ZC0+cnRzVGhyZXNob2xkID0gMjM0NjsKKyAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgd2QtPnR4TUNTID0gMHhmZjsgICAgLy9BVVRPCisgICAgd2QtPmR0aW0gPSAxOworICAgIC8vd2QtPnR4TVQgPSAxOyAgICAgICAvL09GRE0KKyAgICB3ZC0+dGljayA9IDE7CisgICAgd2QtPm1heFR4UG93ZXIyID0gMHhmZjsKKyAgICB3ZC0+bWF4VHhQb3dlcjUgPSAweGZmOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IDB4ZmZmZmZmZmY7CisgICAgd2QtPndzLmFkaG9jTW9kZSA9IFpNX0FESE9DQkFORF9HOworICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKworICAgIC8vQVAgbW9kZQorICAgIC8vd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSA2OworICAgIHdkLT5hcC5zc2lkWzBdWzBdID0gJ1onOworICAgIHdkLT5hcC5zc2lkWzBdWzFdID0gJ0QnOworICAgIHdkLT5hcC5zc2lkWzBdWzJdID0gJzEnOworICAgIHdkLT5hcC5zc2lkWzBdWzNdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzRdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzVdID0gJzEnOworCisgICAgLy8gSW5pdCB0aGUgY291bnRyeSBpc28gbmFtZSBhcyBOQQorICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IDA7CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gMDsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworCisJLyogaW5pdCBmcmFnbWVudGF0aW9uIGlzIGRpc2FibGVkICovCisJLy96ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOworCisJLyogYWlyb3BlZWsgOiBzd1NuaWZmZXIgMT0+b24gIDA9Pm9mZiAqLworCXdkLT5zd1NuaWZmZXIgPSAwOworICAgIHdkLT5YTGlua01vZGUgPSAwOworCisvLyBqaGxlZSBIVCAwCisjaWYgMQorICAgIC8qIEFQIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGggPSAyNjsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5NSU1PUG93ZXJTYXZlID0gMzsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlNob3J0R0lmb3I0ME1IeiA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPmFwLkhUQ2FwLkRhdGEuRFNTU2FuZENDS2luNDBNSHogPSAwOworICAgIHdkLT5hcC5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5hcC5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKworICAgIC8qIEluaXQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5Db250cm9sQ2hhbm5lbCA9IDY7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5FeHRDaGFubmVsT2Zmc2V0ID0gMzsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQ7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5SSUZTTW9kZSA9IDE7CisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworCisgICAgLyogU1RBIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkVsZW1lbnRJRCA9IFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFk7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCA9IDI2OworCisgICAgLyogVGVzdCB3aXRoIDVHLUFQIDogNzYwMyAqLworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDE7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TTUVuYWJsZWQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TaG9ydEdJZm9yNDBNSHo7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IejsKKyNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX01heEFNU0RVTGVuZ3RoOworI2VuZGlmCisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuTUlNT1Bvd2VyU2F2ZSA9IDA7CisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuU2hvcnRHSWZvcjQwTUh6ID0gMDsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLkRTU1NhbmRDQ0tpbjQwTUh6ID0gMDsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSB8PSBIVENBUF9NYXhSeEFNUERVMzsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5NQ1NTZXRbMV0gPSAweEZGOyAvLyBNQ1MgOCB+IDE1CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLlBDTyB8PSBIVENBUF9UcmFuc21pc3Npb25UaW1lMzsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5UcmFuc21pc3Npb25UaW1lID0gMDsKKyAgICAvKiBJbml0IEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQgPSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuQ29udHJvbENoYW5uZWwgPSA2OworCisgICAgLy93ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRXh0Q2hhbm5lbE9mZnNldCB8PSAzOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICAvL3dkLT5zdGEuRXh0SFRDYXAuRGF0YS5SZWNvbVR4V2lkdGhTZXQgPSAxOworICAgIC8vd2QtPnN0YS5FeHRIVENhcC5EYXRhLlJJRlNNb2RlID0gMTsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworI2VuZGlmCisKKyNpZiAwCisgICAgLyogV01FIHRlc3QgY29kZSAqLworICAgIHdkLT5hcC5xb3NNb2RlWzBdID0gMTsKKyNlbmRpZgorCisgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdID0gMHgyMjIxOworICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9IDB4MjIyMTsKKworICAgIHpmVGltZXJJbml0KGRldik7CisKKyAgICBaTV9QRVJGT1JNQU5DRV9JTklUKGRldik7CisKKyAgICB6ZkJzc0luZm9DcmVhdGUoZGV2KTsKKyAgICB6ZlNjYW5NZ3JJbml0KGRldik7CisgICAgemZQb3dlclNhdmluZ01nckluaXQoZGV2KTsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHUzMl90IGtleVs0XSA9IHsweGZmZmZmZmZmLCAweGZmLCAwLCAwfTsKKyAgICAgICAgdTE2X3QgYWRkclszXSA9IHsweDgwMDAsIDB4MDFhYiwgMHgwMDAwfTsKKyAgICAgICAgLy96ZlNldEtleShkZXYsIDAsIDAsIFpNX1dFUDY0LCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgMCwgMCwgWk1fQUVTLCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgNjQsIDAsIDEsIHdkLT5tYWNBZGRyLCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gV01FIHNldHRpbmdzCisgICAgd2QtPndzLnN0YVdtZUVuYWJsZWQgPSAxOyAgICAgICAgICAgLy8gRW5hYmxlIFdNRSBieSBkZWZhdWx0CisgICAgI2RlZmluZSBaTV9VQVBTRF9RX1NJWkUgMzIgLy8yXk4KKyAgICB3ZC0+YXAudWFwc2RRID0gemZRdWV1ZUNyZWF0ZShkZXYsIFpNX1VBUFNEX1FfU0laRSk7CisgICAgem1fYXNzZXJ0KHdkLT5hcC51YXBzZFEgIT0gTlVMTCk7CisgICAgd2QtPnN0YS51YXBzZFEgPSB6ZlF1ZXVlQ3JlYXRlKGRldiwgWk1fVUFQU0RfUV9TSVpFKTsKKyAgICB6bV9hc3NlcnQod2QtPnN0YS51YXBzZFEgIT0gTlVMTCk7CisKKyAgICAvL3pmSHBJbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIC8vemZIcFNldE1hY0FkZHJlc3MoZGV2LCB3ZC0+bWFjQWRkciwgMCk7CisgICAgemZIcEdldE1hY0FkZHJlc3MoZGV2KTsKKworICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisjaWYgWk1fUENJX0xPT1BfQkFDSyA9PSAxCisgICAgemZ3V3JpdGVSZWcoZGV2LCBaTV9SRUdfUENJX0NPTlRST0wsIDYpOworI2VuZGlmIC8qICNpZiBaTV9QQ0lfTE9PUF9CQUNLID09IDEgKi8KKworICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSA4MDIuMTFkCisgICAgLy96ZmlXbGFuU2V0RG90MTFIREZTTW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWggREZTCisgICAgd2QtPnN0YS5ERlNFbmFibGUgPSAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8vemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDUyNjAwMDAsIFRSVUUpOworICAgIC8vemZpV2xhblNldEFuaU1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSBBTkkKKworICAgIC8qIFRyZ2dlciBSeCBETUEgKi8KKyAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJlbmQiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBXTEFOIGhhcmR3YXJlIHdpbGwgYmUgc2h1dGRvd24gYW5kIGFsbCByZXNvdXJjZSB3aWxsIGJlIHJlbGVhc2UgKi8KK3UxNl90IHpmaVdsYW5DbG9zZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgImVudGVyIik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEOworCisgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmV2xhblJlc2V0KGRldik7CisKKyAgICB6ZkhwU3RvcFJlY3YoZGV2KTsKKworICAgIC8qIERpc2FibGUgTUFDICovCisgICAgLyogRGlzYWJsZSBQSFkgKi8KKyAgICAvKiBEaXNhYmxlIFJGICovCisKKyAgICB6ZkhwUmVsZWFzZShkZXYpOworCisgICAgemZRdWV1ZURlc3Ryb3koZGV2LCB3ZC0+YXAudWFwc2RRKTsKKyAgICB6ZlF1ZXVlRGVzdHJveShkZXYsIHdkLT5zdGEudWFwc2RRKTsKKworICAgIHpmQnNzSW5mb0Rlc3Ryb3koZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMSk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyNlbmRpZgorCisgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJleGl0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdldFdyYXBwZXJTZXR0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBiUGFzc2l2ZTsKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworI2lmIDAKKyAgICBpZiAoICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMF0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gIT0gJ1wwJykgKQorICAgIHsKKyAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKAorICAgICAgICAgICAgZGV2LAorICAgICAgICAgICAgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZShkZXYsIHdkLT53cy5jb3VudHJ5SXNvTmFtZSkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPndsYW5Nb2RlID0gd2QtPndzLndsYW5Nb2RlOworCisgICAgLyogc2V0IGNoYW5uZWwgKi8KKyAgICBpZiAoIHdkLT53cy5mcmVxdWVuY3kgKQorICAgIHsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHdkLT53cy5mcmVxdWVuY3k7CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZiUGFzc2l2ZSk7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IFpNX0NIX0FfMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gWk1fQ0hfR182OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLyogaG9uZGEgYWRkIGZvciBkZWJ1ZywgMjQzNyBjaGFubmVsIDYsIDI0NTIgY2hhbm5lbCA5ICovCisgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworI2VuZGlmCisKKyAgICAvKiBzZXQgcHJlYW1ibGUgdHlwZSAqLworICAgIHN3aXRjaCAod2QtPndzLnByZWFtYmxlVHlwZSkKKyAgICB7CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX0FVVE86CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUOgorICAgIGNhc2UgWk1fUFJFQU1CTEVfVFlQRV9MT05HOgorICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlID0gd2QtPndzLnByZWFtYmxlVHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB3ZC0+d3MucHJlYW1ibGVUeXBlID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5hdXRoQWxnb1swXSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbMF0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkICsgMV0gPSB3ZC0+d3MuYXV0aE1vZGU7CisgICAgICAgICAgICB3ZC0+YXAuZW5jcnlNb2RlW3ZhcElkICsgMV0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5hdXRoTW9kZSA9IDA7CisgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisKKyAgICAgICAgLyogR2V0IGJlYWNvbkludGVydmFsIGZyb20gV3JhcHBlclNldHRpbmcgKi8KKyAgICAgICAgaWYgKCh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPj0gMjApICYmICh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPD0gMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHdkLT53cy5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsgLy8xMDBtcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT53cy5kdGltID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmR0aW0gPSB3ZC0+d3MuZHRpbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5kdGltID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHdkLT5hcC5xb3NNb2RlID0gd2QtPndzLmFwV21lRW5hYmxlZCAmIDB4MTsKKyAgICAgICAgd2QtPmFwLnVhcHNkRW5hYmxlZCA9ICh3ZC0+d3MuYXBXbWVFbmFibGVkICYgMHgyKSA+PiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmF1dGhNb2RlID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSB3ZC0+d3Mud2VwU3RhdHVzOworCisgICAgICAgIGlmICggd2QtPndzLmJlYWNvbkludGVydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gd2QtPndzLmJlYWNvbkludGVydmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gMHg2NDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEuIFNldCBkZWZhdWx0IGNoYW5uZWwgNiAoMjQzN01IeikgKi8KKy8vICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisKKyAgICAgICAgICAgIC8qIDIuIE90dXMgc3VwcG9ydCA4MDIuMTFnIE1vZGUgKi8KKyAgICAgICAgICAgIGlmICgod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRykgfHwKKyAgICAgICAgICAgICAgICAod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcpIHx8CisgICAgICAgICAgICAgICAgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRykgKSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogMy4gc2V0IHNob3J0IHByZWFtYmxlICAqLworICAgICAgICAgICAgLy93ZC0+c3RhLnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQgOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IEFUSU0gd2luZG93ICovCisgICAgICAgIGlmICggd2QtPndzLmF0aW1XaW5kb3cgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmF0aW1XaW5kb3cgPSB3ZC0+d3MuYXRpbVdpbmRvdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5hdGltV2luZG93ID0gMHgwYTsKKyAgICAgICAgICAgIHdkLT5zdGEuYXRpbVdpbmRvdyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdGluZ0hpZGRlbkFQID0gMTsvL3dkLT53cy5jb25uZWN0aW5nSGlkZGVuQVA7CisgICAgICAgIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9IHdkLT53cy5kcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgICAgICB3ZC0+c3RhLmlic3NKb2luT25seSA9IHdkLT53cy5pYnNzSm9pbk9ubHk7CisKKyAgICAgICAgaWYgKCB3ZC0+d3MuYkRlc2lyZWRCc3NpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmRlc2lyZWRCc3NpZCwgd2QtPndzLmRlc2lyZWRCc3NpZCwgNik7CisgICAgICAgICAgICB3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPndzLmJEZXNpcmVkQnNzaWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYkRlc2lyZWRCc3NpZCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgc3NpZCAqLworICAgICAgICBpZiAoIHdkLT53cy5zc2lkTGVuICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICghemZNZW1vcnlJc0VxdWFsKHdkLT53cy5zc2lkLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbikpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT53cy5zc2lkTGVuICE9IHdkLT5zdGEuc3NpZExlbil8fAorICAgICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBKXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEFQU0spIHx8CisgICAgICAgICAgICAgICAgICh3ZC0+d3Muc3RhV21lUW9zSW5mbyE9IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKmlmIHUtQVBTRCB0ZXN0KHNldCBRb3NJbmZvKSwgY2xlYXIgY29ubmVjdEJ5UmVhc3NvIHRvIGRvIGFzc29jaWF0aW9uIChub3QgcmVhc3NvY2lhdGlvbikqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5mYWlsQ250T2ZSZWFzc28gPSAwOworICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgPSAwOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuID0gd2QtPndzLnNzaWRMZW47CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuc3NpZCwgd2QtPndzLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA8IDMyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZFt3ZC0+c3RhLnNzaWRMZW5dID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLyogQU5ZIEJTUyAqLworICAgICAgICAgICAgd2QtPnN0YS5zc2lkWzBdID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+c3RhLndtZUVuYWJsZWQgPSB3ZC0+d3Muc3RhV21lRW5hYmxlZDsKKyAgICAgICAgd2QtPnN0YS53bWVRb3NJbmZvID0gd2QtPndzLnN0YVdtZVFvc0luZm87CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZldsYW5FbmFibGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICAgYnNzaWRbNl0gPSB7MHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1VOS05PV04gKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiVW5rbm93biBNb2RlLi4uU2tpcC4uLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB1MTZfdCB2YXBJZDsKKworICAgICAgICB2YXBJZCA9IHpmd0dldFZhcElkKGRldik7CisKKyAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgemZBcEluaXRTdGFUYmwoZGV2KTsKKworICAgICAgICAgICAgLyogQVAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICB3ZC0+YlJhdGUgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGUgPSAweGZmOworICAgICAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDB4MDsKKyAgICAgICAgICAgIC8vd2QtPmJlYWNvbkludGVydmFsID0gMTAwOworICAgICAgICAgICAgd2QtPmFwLmFwQml0bWFwID0gMTsKKyAgICAgICAgICAgIHdkLT5hcC5iZWFjb25Db3VudGVyID0gMDsKKyAgICAgICAgICAgIC8vd2QtPmFwLnZhcE51bWJlciA9IDE7ICAgIC8vbWFyayBieSB5Z3dlaSBmb3IgVmFwCisKKyAgICAgICAgICAgIHdkLT5hcC5oaWRlU3NpZFswXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjID0gMTAqNjA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhUHJvYmluZ1RpbWVTZWMgPSA2MDsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY0hlYWRbaV0gPSB3ZC0+YXAuYmNtY1RhaWxbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3dkLT5hcC51bmlIZWFkID0gd2QtPmFwLnVuaVRhaWwgPSAwOworCisgICAgICAgICAgICAvKiBsb2FkIEFQIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIHdkLT5iUmF0ZUJhc2ljID0gd2QtPndzLmJSYXRlQmFzaWM7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IHdkLT53cy5nUmF0ZUJhc2ljOworICAgICAgICAgICAgd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFswXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNldCBTaG9ydCBTbG90IFRpbWUgYml0IGlmIG5vdCAxMWIgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAud2xhblR5cGVbMF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2QtPmFwLmNhcGFiWzBdIHw9IDB4NDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZC0+YXAudmFwTnVtYmVyID0gMTsgICAgLy8gbWFyayBieSB5Z3dlaSBmb3IgVmFwIFRlc3QKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDM7CisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMV0gPSAweDQwMTsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkTGVuWzFdID0gNDsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzBdID0gJ3YnOworICAgICAgICAgICAgd2QtPmFwLnNzaWRbMV1bMV0gPSAnYSc7CisgICAgICAgICAgICB3ZC0+YXAuc3NpZFsxXVsyXSA9ICdwJzsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzNdID0gJzEnOworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvWzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisgICAgICAgICAgICB3ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbHNlCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDEgfCAoMHgwMSA8PCAodmFwSWQrMSkpOworCisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bdmFwSWQrMV0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFt2YXBJZCsxXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbdmFwSWQrMV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQxMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkKzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVt2YXBJZCsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYmUgbW9kaWZpZWQgd2hlbiBWQVAgaXMgdXNlZCAqLworICAgICAgICAgICAgLy93ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlcisrOworCisgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisgICAgICAgIHpmSW5pdE1hY0FwTW9kZShkZXYpOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworCisgICAgICAgIHpmQXBTZW5kQmVhY29uKGRldik7CisgICAgfSAvKmlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9IDA7ICAgIC8qIHJlc2V0IG9wcG9zaXRlIGNvdW50ICovCisgICAgICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IHdkLT5zdGEuYkF1dG9SZWNvbm5lY3RFbmFibGVkOworICAgICAgICAvL3dkLT5zdGEuc2NhbldpdGhTU0lEID0gMDsKKyAgICAgICAgemZTdGFJbml0T3Bwb3NpdGVJbmZvKGRldik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgemZTdGFSZXNldFN0YXR1cyhkZXYsIDApOworCisgICAgICAgIGlmICggKHdkLT5zdGEuY21EaXNhbGxvd1NzaWRMZW5ndGggIT0gMCkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCkmJgorICAgICAgICAgICAgICh6Zk1lbW9yeUlzRXF1YWwod2QtPnN0YS5zc2lkLCB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkgJiYKKyAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9US0lQKSkKKyAgICAgICAgeyAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiY291bnRlcm1lYXN1cmVzIGRpc2FsbG93IGFzc29jaWF0aW9uIik7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggd2QtPndsYW5Nb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSUJTUzoKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSByZWdpc3RlcnMgbWF5IGJlIHNldCBoZXJlICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBcFN0YU1vZGUoZGV2LCBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9NT0RFX0lCU1MiKTsKKyAgICAgICAgICAgICAgICAgICAgemZJYnNzQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSU5GUkFTVFJVQ1RVUkU6CisgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgcmVnaXN0ZXJzIG1heSBiZSBzZXQgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfU1RBKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfUFNFVURPOgorICAgICAgICAgICAgICAgICAgICAvKiBzb21lIHJlZ2lzdGVycyBtYXkgYmUgc2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX1NUQSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy9pZiAoICh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgIC8vICAgICAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVApICkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETyApCisgICAgeworICAgICAgICAvKiBSZXNldCBXbGFuIHN0YXR1cyAqLworICAgICAgICB6ZldsYW5SZXNldChkZXYpOworCisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgfQorCisKKyAgICBpZih3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIC8vemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBBc3NpZ24gZGVmYXVsdCBUeCBSYXRlCisgICAgaWYgKCB3ZC0+c3RhLkVuYWJsZUhUICkKKyAgICB7CisJCXUzMl90IG9uZVR4U3RyZWFtQ2FwOworCQlvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKwkJaWYob25lVHhTdHJlYW1DYXApCisJCQl3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisJCWVsc2UKKwkJCXdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMjcwMDAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gNTQwMDA7CisgICAgfQorCisgICAgd2QtPnN0YXRlID0gWk1fV0xBTl9TVEFURV9FTkFCTEVEOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIFdsYW4gb3BlcmF0aW9uICovCit1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgIkVuYWJsZSBXbGFuIik7CisKKyAgICB6ZkdldFdyYXBwZXJTZXR0aW5nKGRldik7CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnRyYWZUYWxseSwgc2l6ZW9mKHN0cnVjdCB6c1RyYWZUYWxseSkpOworCisgICAgLy8gUmVzZXQgY21NaWNGYWlsdXJlQ291bnQgdG8gMCBmb3IgbmV3IGFzc29jaWF0aW9uIHJlcXVlc3QKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICB9CisKKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIGlmICgod2QtPnF1ZXVlRmx1c2hlZCAmIDB4MTApICE9IDApCisgICAgeworICAgICAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyAgICB9CisgICAgcmV0ID0gemZXbGFuRW5hYmxlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorLyogQWRkIGEgZmxhZyBuYW1lZCBSZXNldEtleUNhY2hlIHRvIHNob3cgaWYgS2V5Q2FjaGUgc2hvdWxkIGJlIGNsZWFyZWQuCisgICBmb3IgaG9zdGFwZCBpbiBBUCBtb2RlLCBpZiBkcml2ZXIgcmVjZWl2ZXMgaXdjb25maWcgaW9jdGwKKyAgIGFmdGVyIHNldHRpbmcgZ3JvdXAga2V5LCBpdCBzaG91bGRuJ3QgY2xlYXIgS2V5Q2FjaGUuICAgICAgICAgICAgICAgICAqLwordTE2X3QgemZpV2xhbkRpc2FibGUoemRldl90KiBkZXYsIHU4X3QgUmVzZXRLZXlDYWNoZSkKK3sKKyAgICB1MTZfdCAgaTsKKyAgICB1OF90IGlzQ29ubmVjdGVkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisjZW5kaWYKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiRGlzYWJsZSBXbGFuIik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gemZTdGFJc0Nvbm5lY3RlZChkZXYpOworCisgICAgICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAgICAgKHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9XUEEyKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZpV2xhbkRlYXV0aChkZXYsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCB3ZC0+c3RhLmJzc2lkLCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAvL3ptd19kZWJ1Z19tc2cwKCJzZW5kIGEgRGVhdXRoIGZyYW1lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY29ubmVjdGVkIHBlZXIgc3RhdGlvbnMKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yID0gMDsKKyAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IpOworICAgICAgICAgICAgemZTdGFJYnNzTW9uaXRvcmluZyhkZXYsIDEpOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfSU5JVDsKKworICAgICAgICAvKiByZXNldCBjb25uZWN0IHRpbWVvdXQgY291bnRlciAqLworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgICAgIC8qIHJlc2V0IGNvbm5lY3RTdGF0ZSB0byBOb25lICovCisgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKworICAgICAgICAvKiByZXNldCBsZWFwIGVuYWJsZSB2YXJpYWJsZSAqLworICAgICAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICAgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgICAgIHdkLT5zdGEucmlmc0NvdW50ID0gMDsKKworICAgICAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgICAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CisgICAgICAgIGlmIChSZXNldEtleUNhY2hlKQorICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKworICAgICAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JDb25uZWN0Tm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVELCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlYXNvbiA6IFNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkciwgMywgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUmVzZXRLZXlDYWNoZSkKKyAgICAgICAgICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlci0tOworICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgLyogRmx1c2ggQVAgUFMgcXVldWVzICovCisgICAgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKGRldik7CisgICAgLyogRnJlZSBidWZmZXIgaW4gZGVmcmFnbWVudCBsaXN0Ki8KKyAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMCk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyAgICAjZW5kaWYKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICAvKiBUdXJuIG9mZiBTb2Z0d2FyZSBXRVAvVEtJUCAqLworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRGlzYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uIik7CisgICAgICAgIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbihkZXYpOworICAgIH0KKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZpV2xhblN1c3BlbmQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIEhBTCBzdGF0ZSB0byBpbml0IHNvIHRoYXQgYW55IHBhY2tldCBjYW4ndCBiZSB0cmFuc21pdHRlZCBiZXR3ZWVuCisgICAgLy8gcmVzdW1lICYgSEFMIHJlaW5pdC4gVGhpcyB3b3VsZCBjYXVzZSB0aGUgY2hpcCBoYW5nIGlzc3VlIGluIE9UVVMuCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+aGFsU3RhdGUgPSBaTV9IQUxfU1RBVEVfSU5JVDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXN1bWUoemRldl90KiBkZXYsIHU4X3QgZG9SZWNvbm4pCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogUmVkb3dubG9hZCBmaXJtd2FyZSwgUmVpbml0IE1BQyxQSFksUkYgKi8KKyAgICB6ZkhwUmVpbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvL1NldCBjaGFubmVsIGFjY29yZGluZyB0byBBUCdzIGNvbmZpZ3VyYXRpb24KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgd2QtPkJhbmRXaWR0aDQwLAorICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIHdkLT5tYWNBZGRyLCAwKTsKKworICAgIC8qIFN0YXJ0IFJ4ICovCisgICAgemZIcFN0YXJ0UmVjdihkZXYpOworCisgICAgemZGbHVzaFZ0eHEoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKyAgICAgICAgIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmVzdW1lIFdsYW4iKTsKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpIHx8ICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKSApCisgICAgeworICAgICAgICBpZiAoZG9SZWNvbm4gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmUtY29ubmVjdC4uLiIpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICB6ZldsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkb1JlY29ubiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwU2V0Um9sbENhbGxUYWJsZShkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEFsbFF1ZXVlZEJ1ZmZlcnMgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEsIE1tUSwgUFMgZnJhbWVzIGFuZCBkZWZyYWdtZW50IGxpc3QgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBGbHVzaCBWVHhRIGFuZCBNbVEgKi8KKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIC8qIEZsdXNoIEFQIFBTIHF1ZXVlcyAqLworICAgIHpmQXBGbHVzaEJ1ZmZlcmVkUHNGcmFtZShkZXYpOworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKK30KKworLyogRG8gV0xBTiBzaXRlIHN1cnZleSAqLwordTE2X3QgemZpV2xhblNjYW4oemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0ID0gMTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgd2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiB8PSBaTV9CU1NJRF9MSVNUX1NDQU47CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisgICAgICAgIC8vd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQgPSAwOworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoICF6ZlN0YUJsb2NrV2xhblNjYW4oZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInNjYW4gcmVxdWVzdCIpOworICAgICAgICAgICAgLy96ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCBaTV9USUNLX1pFUk8pOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfc2NhbjsKKyAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgZ290byBzdGFydF9zY2FuOworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKKworc3RhcnRfc2NhbjoKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgJiBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBKSAgIC8vIGZsYWcgZm9yIEFscGhhCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcgfD0gWk1fTEVEX0NUUkxfRkxBR19BTFBIQTsKKworICAgIHJldCA9IHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgem1fZGVidWdfbXNnMSgicmV0ID0gIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogcmF0ZSAgICAgICAgICovCisvKiAgICAwIDogQVVUTyAgKi8KKy8qICAgIDEgOiBDQ0sgMU0gKi8KKy8qICAgIDIgOiBDQ0sgMk0gKi8KKy8qICAgIDMgOiBDQ0sgNS41TSAqLworLyogICAgNCA6IENDSyAxMU0gKi8KKy8qICAgIDUgOiBPRkRNIDZNICovCisvKiAgICA2IDogT0ZETSA5TSAqLworLyogICAgNyA6IE9GRE0gMTJNICovCisvKiAgICA4IDogT0ZETSAxOE0gKi8KKy8qICAgIDkgOiBPRkRNIDI0TSAqLworLyogICAgMTAgOiBPRkRNIDM2TSAqLworLyogICAgMTEgOiBPRkRNIDQ4TSAqLworLyogICAgMTIgOiBPRkRNIDU0TSAqLworLyogICAgMTMgOiBNQ1MgMCAqLworLyogICAgMjggOiBNQ1MgMTUgKi8KK3UxNl90IHpjUmF0ZVRvTUNTW10gPQorICAgIHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLCAweDgsIDB4Y307Cit1MTZfdCB6Y1JhdGVUb01UW10gPSB7MCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisKK3UxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpCit7ICAgLy8gamhsZWUgSFQgMAorICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChyYXRlIDw9MTIpCisgICAgeworICAgICAgICB3ZC0+dHhNQ1MgPSB6Y1JhdGVUb01DU1tyYXRlXTsKKyAgICAgICAgd2QtPnR4TVQgPSB6Y1JhdGVUb01UW3JhdGVdOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHJhdGU8PTI4KXx8KHJhdGU9PTEzKzMyKSkKKyAgICB7CisgICAgICAgIHdkLT50eE1DUyA9IHJhdGUgLSAxMiAtIDE7CisgICAgICAgIHdkLT50eE1UID0gMjsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9JTlZBTElEX1RYX1JBVEU7Cit9CisKK2NvbnN0IHUzMl90IHpjUmF0ZUlkVG9LYnBzNDBNW10gPQorICAgIHsKKyAgICAgICAgMTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2MDAwLCA5MDAwLCAxMjAwMCwgMTgwMDAsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0MDAwLCAzNjAwMCwgNDgwMDAsIDU0MDAwLCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTM1MDAsIDI3MDAwLCA0MDUwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsIDEzNTAwMCwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyMDAwLCAyMTYwMDAsIDI0MzAwMCwgMjcwMDAwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAwMDAsIDMwMDAwMCwgMTUwMDAwICAgICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTMyX3QgemNSYXRlSWRUb0ticHMyME1bXSA9CisgICAgeworICAgICAgICAxMDAwLCAyMDAwLCA1NTAwLCAxMTAwMCwgICAgICAgICAgICAgICAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDYwMDAsIDkwMDAsIDEyMDAwLCAxODAwMCwgICAgICAgICAgICAgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjQwMDAsIDM2MDAwLCA0ODAwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogMjRNICAzNk0gIDQ4TSAgNTRNICAgICAgICwgIDggIDkgMTAgMTEqLworICAgICAgICA2NTAwLCAxMzAwMCwgMTk1MDAsIDI2MDAwLCAgICAgICAgICAgICAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDM5MDAwLCA1MjAwMCwgNTg1MDAsIDY1MDAwLCAgICAgICAgICAgICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsICAgICAgICAgICAgICAgLyogTUNTOCBNQ1M5IE1DUzEwIE1DUzExICAgICwgMjAgMjEgMjIgMjMqLworICAgICAgICA3ODAwMCwgMTA0MDAwLCAxMTcwMDAsIDEzMDAwMCwgICAgICAgICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDEzMDAwMCwgMTQ0NDAwLCA3MjIwMCAgICAgICAgICAgICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0csIE1TRzdTRyAsIDI4IDI5IDMwKi8KKyAgICB9OworCit1MzJfdCB6ZmlXbGFuUXVlcnlUeFJhdGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCByYXRlSWQgPSAweGZmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogSWYgVHggcmF0ZSBoYWQgbm90IGJlZW4gdHJhaW5lZCwgcmV0dXJuIG1heGltdW0gVHggcmF0ZSBpbnN0ZWFkICovCisgICAgaWYgKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL05vdCBpbiBmaXhlZCByYXRlIG1vZGUKKyAgICAgICAgaWYgKHdkLT50eE1DUyA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5mbGFnICYgWk1fUkNfVFJBSU5FRF9CSVQpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUlkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVDb3VudC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlSWQgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwub3BlcmF0aW9uUmF0ZVNldFt3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgaWYgKHJhdGVJZCAhPSAweGZmKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemNSYXRlSWRUb0ticHM0ME1bcmF0ZUlkXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6Y1JhdGVJZFRvS2JwczIwTVtyYXRlSWRdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+Q3VycmVudFR4UmF0ZUticHM7CisgICAgfQorfQorCit2b2lkIHpmV2xhblVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHUzMl90IHJ4UmF0ZUticHM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiYWRkSW5mby0+VGFpbC5EYXRhLlJ4TWFjU3RhdHVzID0iLCBhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDAzKTsKKworICAgIC8qIGI1fmI0OiBNUERVIGluZGljYXRpb24uICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgIDAwOiBTaW5nbGUgTVBEVS4gICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgMTA6IEZpcnN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAqLworICAgIC8qICAgICAgICAxMTogTWlkZGxlIE1QRFUgb2YgQS1NUERVLiAgICAgICovCisgICAgLyogICAgICAgIDAxOiBMYXN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAgKi8KKyAgICAvKiBPbmx5IEZpcnN0IE1QRFUgYW5kIFNpbmdsZSBNUERVIGhhdmUgUExDUCBoZWFkZXIgKi8KKyAgICAvKiBGaXJzdCBNUERVICA6IChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCAqLworICAgIC8qIFNpbmdsZSBNUERVIDogKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDEwKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTW9kdWxhdGlvbiB0eXBlICovCisgICAgICAgIHdkLT5tb2R1bGF0aW9uVHlwZSA9IGFkZEluZm8tPlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAmIDB4MDM7CisgICAgICAgIHN3aXRjaCh3ZC0+bW9kdWxhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAJCWNhc2UgMHgwOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4ZmY7IC8vQ0NLIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cnhJbmZvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWNhc2UgMHgxOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4MGY7IC8vTGVnYWN5LU9GRE0gbW9kZQorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yeEluZm8gPSAwOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJY2FzZSAweDI6IHdkLT5yYXRlRmllbGQgPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzNdOyAvL0hULU9GRE0gbW9kZQorICAgIAkJICAgICAgICAgIHdkLT5yeEluZm8gPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzZdOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgcnhSYXRlS2JwcyA9IHpmVXBkYXRlUnhSYXRlKGRldik7CisgICAgICAgIGlmICh3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ4UmF0ZUticHMgPiB3ZC0+Q3VycmVudFJ4UmF0ZUticHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gcnhSYXRlS2JwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IHJ4UmF0ZUticHM7CisgICAgICAgICAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorfQorI2lmIDAKK3UxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl0gPSB7NjUwMCwgMTMwMDAsIDE5NTAwLCAyNjAwMCwgMzkwMDAsIDUyMDAwLCA1ODUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MDAwLCAxMzAwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNzgwMDAsIDEwNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNzAwMCwgMTMwMDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVOMjBTWzE2XSA9IHs3MjAwLCAxNDQwMCwgMjE3MDAsIDI4OTAwLCA0MzMwMCwgNTc4MDAsIDY1MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIyMDAsIDE0NDAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA4NjcwMCwgMTE1NjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMDAwLCAxNDQ0MDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MExbMTZdID0gezEzNTAwLCAyNzAwMCwgNDA1MDAsIDU0MDAwLCA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwMDAsIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTYyMDAwLCAyMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMwMDAsIDI3MDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl0gPSB7MTUwMDAsIDMwMDAwLCA0NTAwMCwgNjAwMDAsIDkwMDAwLCAxMjAwMDAsIDEzNTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAwMCwgMzAwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxODAwMDAsIDI0MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MDAwMCwgMzAwMDAwfTsKKyNlbmRpZgorCitleHRlcm4gdTE2X3QgemNJbmRleHRvUmF0ZUJHWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl07CitleHRlcm4gdTMyX3QgemNJbmRleHRvUmF0ZU4yMFNbMTZdOworZXh0ZXJuIHUzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl07CisKK3UzMl90IHpmaVdsYW5RdWVyeVJ4UmF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAwOworICAgIHJldHVybiB3ZC0+Q3VycmVudFJ4UmF0ZUticHM7Cit9CisKK3UzMl90IHpmVXBkYXRlUnhSYXRlKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgbWNzLCBiYW5kd2lkdGg7CisgICAgdTMyX3QgcnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5tb2R1bGF0aW9uVHlwZSkKKyAgICB7CisJCWNhc2UgMHgwOiAvL0NDSyBtb2RlCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdkLT5yYXRlRmllbGQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBhOiByeFJhdGVLYnBzID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6IHJ4UmF0ZUticHMgPSAyMDAwOworCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDM3OiByeFJhdGVLYnBzID0gNTUwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmU6IHJ4UmF0ZUticHMgPSAxMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgxOiAvL0xlZ2FjeS1PRkRNIG1vZGUKKyAgICAgICAgICAgICAgICAgIGlmICh3ZC0+cmF0ZUZpZWxkIDw9IDE1KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlQkdbd2QtPnJhdGVGaWVsZF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSAweDI6IC8vSFQtT0ZETSBtb2RlCisJCSAgICAgICAgICBtY3MgPSB3ZC0+cmF0ZUZpZWxkICYgMHg3RjsKKwkJICAgICAgICAgIGJhbmR3aWR0aCA9IHdkLT5yYXRlRmllbGQgJiAweDgwOworICAgICAgICAgICAgICAgICAgaWYgKG1jcyA8PSAxNSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZHdpZHRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDQwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU40MExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDIwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU4yMExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAid2QtPkN1cnJlbnRSeFJhdGVLYnBzPSIsIHdkLT5DdXJyZW50UnhSYXRlS2Jwcyk7CisKKyAgICAgLy8gVG9EbzogdXNlIGJhbmR3aXRoIGZpZWxkIHRvIGRlZmluZSA0ME1CCisgICAgcmV0dXJuIHJ4UmF0ZUticHM7Cit9CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCit1MTZfdCB6ZmlXbGFuR2V0U3RhdGlzdGljcyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBSZXR1cm4gbGluayBzdGF0aXN0aWNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgcmV0dXJuIHpmV2xhblJlc2V0KGRldik7Cit9CisKKy8qIFJlc2V0IFdMQU4gKi8KK3UxNl90IHpmV2xhblJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgaXNDb25uZWN0ZWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzAoInpmV2xhblJlc2V0Iik7CisKKyAgICBpc0Nvbm5lY3RlZCA9IHpmU3RhSXNDb25uZWN0ZWQoZGV2KTsKKworICAgIC8vaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSAhPSBaTV9BVVRIX01PREVfV1BBMikgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZW5kIGRlYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5EZWF1dGgoZGV2LCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLy96bXdfZGVidWdfbXNnMCgic2VuZCBhIERlYXV0aCBmcmFtZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpOworICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgeworICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX1JFU0VULCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogYWRkIGJ5IGhvbmRhICovCisgICAgemZBZ2dSeEZyZWVCdWYoZGV2LCAwKTsgIC8vMSBmb3IgcmVsZWFzZSBzdHJ1Y3R1cmUgbWVtb3J5CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworICAgICNlbmRpZgorCisgICAgemZTdGFSZWZyZXNoQmxvY2tMaXN0KGRldiwgMSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lCU1NfTU9OSVRPUik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSKTsKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gMDsKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gMDsKKyAgICB3ZC0+c3RhLkludGVybmFsU2NhblJlcSA9IDA7CisgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworICAgIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgIHdkLT5zdGEuaWJzc0Jzc0lzQ3JlYXRvciA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworI2VuZGlmCisgICAgLyogcmVzZXQgY29ubmVjdCB0aW1lb3V0IGNvdW50ZXIgKi8KKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgLyogcmVzZXQgbGVhcCBlbmFibGUgdmFyaWFibGUgKi8KKyAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgIC8qIFJlc2V0IHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgIHpmSHBEaXNhYmxlUmlmcyhkZXYpOworICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKyAgICB3ZC0+c3RhLnJpZnNDb3VudCA9IDA7CisKKyAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgIHdkLT5zdGEuYlNhZmVNb2RlID0gMDsKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZTY2FuTWdyU2NhblN0b3AoZGV2LCBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMKTsKKyAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgLyogVHVybiBvZmYgU29mdHdhcmUgV0VQL1RLSVAgKi8KKyAgICBpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2FibGUgc29mdHdhcmUgZW5jcnlwdGlvbiIpOworICAgICAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKKyAgICB9CisKKyAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOworCisgICAgLyogS2VlcCBQc2V1ZG8gbW9kZSAqLworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfUFNFVURPICkKKyAgICB7CisgICAgICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBEZWF1dGhlbnRpY2F0ZSBhIFNUQSAqLwordTE2X3QgemZpV2xhbkRlYXV0aCh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUxNl90IHJlYXNvbikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8vdTE2X3QgaWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2Ugd2lsbCByZXNldCBhbGwga2V5IGluIHpmSHBSZXNldEtleUNhY2hlKCkgd2hlbiBjYWxsCisgICAgICAgICAqIHpmaVdsYW5EaXNhYmxlKCksIGlmIHdlIHdhbnQgdG8gcmVzZXQgUGFpcndpc2VLZXkgZm9yIGVhY2ggc3RhLAorICAgICAgICAgKiBuZWVkIHRvIHVzZSBhIG51bGxBZGRyIHRvIGxldCBrZXlpbmRleCBub3QgbWF0Y2guCisgICAgICAgICAqIG90aGVyd2lzZSBoYXJkd2FyZSB3aWxsIHN0aWxsIGZpbmQgUGFpcndpc2VLZXkgd2hlbiBBUCBjaGFuZ2UKKyAgICAgICAgICogZW5jcnlwdGlvbiBtb2RlIGZyb20gV1BBIHRvIFdFUAorICAgICAgICAgKi8KKworICAgICAgICAvKgorICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICB1MzJfdCBrZXlbOF07CisgICAgICAgICAgICB1MTZfdCBudWxsQWRkclszXSA9IHsgMHgwLCAweDAsIDB4MCB9OworCisgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSAhPSBaTV9OT19XRVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCBudWxsQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCAodTE2X3QgKiltYWNBZGRyLAorICAgICAgICAgICAgLy8gICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaWQrMSk7CisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBtYWNBZGRyLCByZWFzb24sIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgfQorCisgICAgLyogSXNzdWUgREVBVVRIIGNvbW1hbmQgdG8gRlcgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKy8qIDA9PmRpc2FibGUgKi8KK3ZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAic3RhLmJBbGxNdWx0aWNhc3QgPSAiLCBzZXR0aW5nKTsKKyAgICB3ZC0+c3RhLmJBbGxNdWx0aWNhc3QgPSAodThfdClzZXR0aW5nOworfQorCisKKy8qIEhUIGNvbmZpZ3VyZSBBUEkgKi8KK3ZvaWQgemZpV2xhblNldEhUQ3RybCh6ZGV2X3QqIGRldiwgdTMyX3QgKnNldHRpbmcsIHUzMl90IGZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnByZWFtYmxlVHlwZSAgICAgICAgPSAodThfdClzZXR0aW5nWzBdOworICAgIHdkLT5zdGEucHJlYW1ibGVUeXBlSFQgID0gKHU4X3Qpc2V0dGluZ1sxXTsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9ICh1OF90KXNldHRpbmdbMl07CisgICAgd2QtPnN0YS5odEN0cmxTVEJDICAgICAgPSAodThfdClzZXR0aW5nWzNdOworICAgIHdkLT5zdGEuaHRDdHJsU0cgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s0XTsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSAgICAgICA9ICh1OF90KXNldHRpbmdbNV07CisgICAgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uICAgPSAodThfdClzZXR0aW5nWzZdOworICAgIHdkLT5lbmFibGVXRFMgICAgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s3XTsKKworICAgIHdkLT5mb3JjZVR4VFBDICAgICAgICAgID0gZm9yY2VUeFRQQzsKK30KKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgKmZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc2V0dGluZ1swXSA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgc2V0dGluZ1sxXSA9IHdkLT5zdGEucHJlYW1ibGVUeXBlSFQ7CisgICAgc2V0dGluZ1syXSA9IHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoOworICAgIHNldHRpbmdbM10gPSB3ZC0+c3RhLmh0Q3RybFNUQkM7CisgICAgc2V0dGluZ1s0XSA9IHdkLT5zdGEuaHRDdHJsU0c7CisgICAgc2V0dGluZ1s1XSA9IHdkLT5zdGEuZGVmYXVsdFRBOworICAgIHNldHRpbmdbNl0gPSB3ZC0+ZW5hYmxlQWdncmVnYXRpb247CisgICAgc2V0dGluZ1s3XSA9IHdkLT5lbmFibGVXRFM7CisKKyAgICAqZm9yY2VUeFRQQyA9IHdkLT5mb3JjZVR4VFBDOworfQorCit2b2lkIHpmaVdsYW5EYmcoemRldl90KiBkZXYsIHU4X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZW5hYmxlSEFMRGJnSW5mbyA9IHNldHRpbmc7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5TZXRSeFBhY2tldER1bXAoemRldl90KiBkZXYsIHUzMl90IHNldHRpbmcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIGlmIChzZXR0aW5nKQorICAgIHsKKyAgICAgICAgd2QtPnJ4UGFja2V0RHVtcCA9IDE7ICAgLyogZW5hYmxlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOyAgIC8qIGRpc2FibGUgKi8KKyAgICB9Cit9CisKKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KKy8qIFRhbGx5ICovCit2b2lkIHpmaVdsYW5SZXNldFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0gPSAwOwkJLy90eFVuaWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtID0gMDsJCS8vdHhNdWx0aWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdE9jdGV0cyA9IDA7CS8vdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RPY3RldHMgPSAwOwkvL3R4TXVsdGlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhGcm1VcHBlck5ESVMgPSAwOworCSAgIHdkLT5jb21tVGFsbHkudHhGcm1EcnZNZ3QgPSAwOworCSAgIHdkLT5jb21tVGFsbHkuUmV0cnlGYWlsQ250ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0gPSAwOwkJLy9IYXJkd2FyZSB0b3RhbCBUeCBGcmFtZQorCSAgIHdkLT5jb21tVGFsbHkuSHdfUmV0cnlDbnQgPSAwOwkJLy90eE11bHRpcGxlUmV0cmllc0ZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkuSHdfVW5kZXJydW5DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSA9IDA7CQkvL3J4VW5pY2FzdEZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkucnhNdWx0aWNhc3RGcm0gPSAwOwkvL3J4TXVsdGljYXN0RnJhbWVzCisJICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgPSAwOwkvL3J4VW5pT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzID0gMDsJLy9yeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSA9IDA7Ly8gRGlzY2FyZCBieSBWYWxpZGF0ZUZyYW1lCisJICAgd2QtPmNvbW1UYWxseS5MZXNzVGhhbkRhdGFNaW5MZW4gPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5HcmVhdGVyVGhhbk1heExlbiA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlNdWx0aWNhc3RMaXN0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlGcm1DdHJsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TmVlZEZyZ0ZybSA9IDA7CQkvLyBuZWVkIG1vcmUgZnJnIGZybQorCSAgIHdkLT5jb21tVGFsbHkuRHJpdmVyUnhNZ3RGcm1DbnQgPSAwOworCSAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0gPSAwOwkvL1JlY2VpdmUgYnJvYWRjYXN0IGZyYW1lIGNvdW50CisJICAgd2QtPmNvbW1UYWxseS5yeEJyb2FkY2FzdE9jdGV0cyA9IDA7CS8vUmVjZWl2ZSBicm9hZGNhc3QgZnJhbWUgYnl0ZSBzaXplCisJICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgPSAwOwkJLy9yeFBMQ1BDUkNFcnJDbnQKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250ID0gMDsJCS8vcnhDUkMzMkVyckNudAorCSAgIHdkLT5jb21tVGFsbHkuSHdfRGVjcnlwRXJyX1VOSSA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkxvc3NBUCA9IDA7Ly8KKworCSAgIHdkLT5jb21tVGFsbHkuVHhfTVBEVSA9IDA7CisJICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPSAwOworCisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFswXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsxXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsyXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFszXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFs0XSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5WFJFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeU9GRE1FcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5SFRFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVRvdGFsQ291bnQgPSAwOworCisjaWYJKGRlZmluZWQoR0NDSykgJiYgZGVmaW5lZChPRkRNKSkKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4MTFiRGF0YUZyYW1lID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4T0ZETURhdGFGcmFtZSA9IDA7CisjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5RdWVyeVRhbGx5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDb21tVGFsbHkgKnRhbGx5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHpmTWVtb3J5Q29weSgodThfdCopdGFsbHksICh1OF90Kikmd2QtPmNvbW1UYWxseSwgc2l6ZW9mKHN0cnVjdCB6c0NvbW1UYWxseSkpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9Cit2b2lkIHpmaVdsYW5RdWVyeVRyYWZUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzVHJhZlRhbGx5ICp0YWxseSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXRhbGx5LCAodThfdCopJndkLT50cmFmVGFsbHksIHNpemVvZihzdHJ1Y3QgenNUcmFmVGFsbHkpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzTW9uSGFsUnhJbmZvICptb25IYWxSeEluZm8pCit7CisgICAgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKGRldiwgKHU4X3QgKiltb25IYWxSeEluZm8pOworfQorCisvKiBwYXJzZSB0aGUgbW9kZU1ES0VuYWJsZSB0byBEcnZDb3JlICovCit2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1vZGVNREtFbmFibGUgPSBlbmFibGU7CisgICAgem1fZGVidWdfbXNnMSgibW9kZU1ES0VuYWJsZSA9ICIsIHdkLT5tb2RlTURLRW5hYmxlKTsKK30KKworLyogYWlyb1BlZWsgKi8KK3UzMl90IHpmaVdsYW5RdWVyeVBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN3U25pZmZlcjsKK30KKworLyogYWlyb1BlZWsgKi8KK3ZvaWQgemZpV2xhblNldFBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0VmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisJICAgd2QtPnN3U25pZmZlciA9IHNldFZhbHVlOworCSAgIHptX21zZzFfbW0oWk1fTFZfMCwgIndkLT5zd1NuaWZmZXIgIiwgd2QtPnN3U25pZmZlcik7CisJICAgaWYgKHNldFZhbHVlKQorCSAgIHsKKwkgICAgICAgCS8qIHdyaXRlIHJlZ2lzdGVyIGZvciBzbmlmZmVyIG1vZGUgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbmlmZmVyTW9kZShkZXYsIDEpOworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiZW5hbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworICAgICAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJkaXNhbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KK30KKwordm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+WExpbmtNb2RlID0gc2V0VmFsdWU7CisgICAgaWYgKHNldFZhbHVlKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgZm9yIHNuaWZmZXIgbW9kZSAqLworICAgICAgICB6ZkhwU2V0U25pZmZlck1vZGUoZGV2LCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZCB6ZlN0YUNoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1OF90IHNjYW4pOwordm9pZCB6ZmlTZXRDaGFubmVsTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICAgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDE7CisgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0ICAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAxOworICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMTsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgd2QtPnN0YS5FbmFibGVIVCA9IDE7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCAgID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCk7Cit9CisKK3ZvaWQgemZpU2V0Umlmcyh6ZGV2X3QqIGRldiwgdTE2X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SSUZTTW9kZTsKKyAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDA7CisvLyAgICAgICAgICAgIHpmSHBTZXRSaWZzKGRldiwgMSwgMCwgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApPyAxOjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMTsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAxLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMDsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAwLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYgRXh0SHRDYXBfUklGU01vZGUpCisgICAgeworLy8gICAgICAgIHpmSHBTZXRSaWZzKGRldiwgd2QtPnN0YS5FbmFibGVIVCwgd2QtPnN0YS5IVDIwNDAsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2V0UmVvcmRlcih6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnJlb3JkZXIgPSB2YWx1ZTsKK30KKwordm9pZCB6ZmlTZXRTZXFEZWJ1Zyh6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnNlcV9kZWJ1ZyA9IHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M0OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMKQEAgLTAsMCArMSwxMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3U4X3QgemZRdWVyeU9wcG9zaXRlUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBkc3RfbWFjWzZdLCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBGb3IgQVAncyByYXRlIGFkYXB0aW9uICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBGb3IgU1RBJ3MgcmF0ZSBhZGFwdGlvbiAqLworICAgIGlmICggKGZyYW1lVHlwZSAmIDB4MGMpID09IFpNX1dMQU5fREFUQV9GUkFNRSApCisgICAgeworICAgICAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVChkc3RfbWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLm1UeFJhdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2QtPnN0YS51VHhSYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5zdGEubW1UeFJhdGU7Cit9CisKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlUb1J4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCisgICAgeworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CisgICAgfQorfQorCit2b2lkIHpmQ29weUZyb21JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlGcm9tUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGRzdFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCtpKTsKKyAgICB9Cit9CisKKyNpZiAxCit2b2lkIHpmTWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIHpmd01lbW9yeUNvcHkoZHN0LCBzcmMsIGxlbmd0aCk7Cit9CisKK3ZvaWQgemZNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgemZ3TWVtb3J5TW92ZShkc3QsIHNyYywgbGVuZ3RoKTsKK30KKwordm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB6ZndaZXJvTWVtb3J5KHZhLCBsZW5ndGgpOworfQorCit1OF90IHpmTWVtb3J5SXNFcXVhbCh1OF90KiBtMSwgdThfdCogbTIsIHUxNl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gemZ3TWVtb3J5SXNFcXVhbChtMSwgbTIsIGxlbmd0aCk7Cit9CisjZW5kaWYKKwordThfdCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4X3QqIHN0ciwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgICAgICBpZiAoIGNoICE9IHN0cltpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkIHpmVHhCdWZmZXJDb3B5KHpkZXZfdCpkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZHN0T2Zmc2V0LCB1MTZfdCBzcmNPZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgZHN0LCBkc3RPZmZzZXQraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIHNyYywgc3JjT2Zmc2V0K2kpKTsKKyAgICB9Cit9CisKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBkc3QsIGRzdE9mZnNldCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgc3JjLCBzcmNPZmZzZXQraSkpOworICAgIH0KK30KKworCit2b2lkIHpmQ29sbGVjdEhXVGFsbHkoemRldl90KmRldiwgdTMyX3QqIHJzcCwgdThfdCBpZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19VbmRlcnJ1bkNudCArPSAoMHhGRkZGICYgcnNwWzFdKTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtICs9IHJzcFsyXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19DUkMzMkNudCArPSByc3BbM107CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgKz0gcnNwWzRdOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgIC8qIFRoZXNlIGNvZGUgYXJlIGhlcmUgdG8gc2F0aXNmeSBWaXN0YSBEVE0gKi8KKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JICs9ICgocnNwWzVdPjUwKSAmJiAocnNwWzVdPDYwKSk/NTA6cnNwWzVdOworICAgICAgICAjZWxzZQorICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9VTkkgKz0gcnNwWzVdOworICAgICAgICAjZW5kaWYKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfTXVsICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCArPSByc3BbOF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVG90YWxUeEZybSArPSByc3BbOV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ICs9cnNwWzEwXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5LlR4X01QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsICs9IHJzcFsxMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgKz0gcnNwWzEzXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVICs9IHJzcFsxNF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCArPSByc3BbMTJdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSArPSByc3BbMV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEcm9wTVBEVSArPSByc3BbMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEZWxNUERVICs9IHJzcFszXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yICs9IHJzcFs0XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IgKz0gcnNwWzVdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5T0ZETUVycm9yICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IgKz0gcnNwWzhdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5VG90YWxDb3VudCArPSByc3BbOV07CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAicnNwbGVuID0iLCByc3BbMF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19VbmRlcnJ1bkNudCAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfVG90YWxSeEZybSAgICAgPSAiLCByc3BbMl0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19DUkMzMkNudCAgICAgICA9ICIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0NSQzE2Q250ICAgICAgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX1VOSSAgPSAiLCByc3BbNV0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHJzcFs2XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9NdWwgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUmV0cnlDbnQgICAgICAgPSAiLCByc3BbOF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19Ub3RhbFR4RnJtICAgICA9ICIsIHJzcFs5XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgcnNwWzEwXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIlR4X01QRFUgICAgICAgICAgID0gIiwgcnNwWzExXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkJBX0ZhaWwgICAgICAgICAgID0gIiwgcnNwWzEyXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X0FNUERVICAgICAgID0gIiwgcnNwWzEzXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X01QRFUgICAgICAgID0gIiwgcnNwWzE0XSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgInJzcGxlbiAgICAgICAgICAgICA9ICIsIHJzcFswXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4TVBEVSAgICAgICAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEZWxNUERVICAgICAgID0gIiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgcnNwWzVdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlPRkRNRXJyb3IgID0gIiwgcnNwWzZdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlDQ0tFcnJvciAgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgcnNwWzhdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlUb3RhbENvdW50ID0gIiwgcnNwWzldKTsKKyAgICB9CisKK30KKworLyogVGltZXIgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQgemZUaW1lckluaXQoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID0gWk1fTUFYX1RJTUVSX0NPVU5UOworICAgIHdkLT50aW1lckxpc3QuaGVhZCA9ICYod2QtPnRpbWVyTGlzdC5saXN0WzBdKTsKKyAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMV0pOworICAgIHdkLT50aW1lckxpc3QuaGVhZC0+cHJlID0gTlVMTDsKKyAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPm5leHQgPSAmKHdkLT50aW1lckxpc3QubGlzdFsxXSk7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5wcmUgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMl0pOworICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IE5VTEw7CisKKyAgICBmb3IoIGk9MTsgaTwoWk1fTUFYX1RJTUVSX0NPVU5ULTEpOyBpKysgKQorICAgIHsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5saXN0W2ldLnByZSA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2ktMV0pOworICAgICAgICB3ZC0+dGltZXJMaXN0Lmxpc3RbaV0ubmV4dCA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2krMV0pOworICAgIH0KKworICAgIHdkLT5iVGltZXJSZWFkeSA9IFRSVUU7Cit9CisKKwordTE2X3QgemZUaW1lclNjaGVkdWxlKHpkZXZfdCogZGV2LCB1MTZfdCBldmVudCwgdTMyX3QgdGljaykKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRnJlZUVudHJ5OworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID09IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gbW9yZSB0aW1lciIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgidGFyZ2V0IHRpY2sgPSAiLCB3ZC0+dGljayArIHRpY2spOworCisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGlmICggY291bnQgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudC0tOworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPmV2ZW50ID0gZXZlbnQ7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZC0+dGltZXIgPSB3ZC0+dGljayArIHRpY2s7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudCA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwRnJlZUVudHJ5ID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgIHBGcmVlRW50cnktPnRpbWVyID0gd2QtPnRpY2sgKyB0aWNrOworICAgIHBGcmVlRW50cnktPmV2ZW50ID0gZXZlbnQ7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcEZyZWVFbnRyeS0+cHJlOworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiBwRnJlZUVudHJ5LT50aW1lciApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSBwRnJlZUVudHJ5LT50aW1lcikgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUtPm5leHQgPSBwRnJlZUVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBGcmVlRW50cnktPnByZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gcEZyZWVFbnRyeTsKKyAgICAgICAgICAgIHBGcmVlRW50cnktPm5leHQgPSBwRW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQgPSBwRnJlZUVudHJ5OworICAgIH0KKworICAgIGlmICggaSA9PSBjb3VudCApCisgICAgeworICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgcEZyZWVFbnRyeS0+cHJlLT5uZXh0ID0gcEZyZWVFbnRyeTsKKyAgICAgICAgcEVudHJ5LT5wcmUgPSBwRnJlZUVudHJ5OworICAgICAgICBwRnJlZUVudHJ5LT5uZXh0ID0gcEVudHJ5OworICAgIH0KKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50LS07CisgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KQoreworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudChiKSA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICBjb3VudCA9IFpNX01BWF9USU1FUl9DT1VOVCAtIHdkLT50aW1lckxpc3QuZnJlZUNvdW50OworCisgICAgZm9yKCBpPTA7IGk8Y291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBFbnRyeS0+ZXZlbnQgPT0gZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBFbnRyeSA9PSB3ZC0+dGltZXJMaXN0LmhlYWQgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkIGVudHJ5ICovCisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnktPnByZSA9IHdkLT50aW1lckxpc3QudGFpbDsKKyAgICAgICAgICAgICAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSBwRW50cnk7CisgICAgICAgICAgICAgICAgcEVudHJ5ID0gd2QtPnRpbWVyTGlzdC5oZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBub24taGVhZCBlbnRyeSAqLworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlLT5uZXh0ID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHBFbnRyeS0+bmV4dC0+cHJlID0gcEVudHJ5LT5wcmU7CisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5uZXh0ID0gcEVudHJ5OworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzEoImZyZWUgdGltZXIgY291bnQoYSkgPSAiLCB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlRpbWVyQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQ7Cit9CisKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRW50cnk7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqcFRoZUxhc3RFbnRyeSA9IE5VTEw7CisgICAgdTE2X3QgIGV2ZW50W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgdThfdCAgIGksIGo9MCwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhd2QtPmJUaW1lclJlYWR5ICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwRW50cnkgPSB3ZC0+dGltZXJMaXN0LmhlYWQ7CisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiB3ZC0+dGljayApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSB3ZC0+dGljaykgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRbaisrXSA9IHBFbnRyeS0+ZXZlbnQ7CisgICAgICAgIHBUaGVMYXN0RW50cnkgPSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGogPiAwICkKKyAgICB7CisgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkLT5wcmUgPSB3ZC0+dGltZXJMaXN0LnRhaWw7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZCA9IHBFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcFRoZUxhc3RFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgKz0gajsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlByb2Nlc3NFdmVudChkZXYsIGV2ZW50LCBqKTsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkNvcmVTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZysrOworICAgIHptX2RlYnVnX21zZzEoIiAgIHpmQ29yZVNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsIG1hYywga2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisjaWYgMAorICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMDsKKyNlbHNlCisgICAgaWYod2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZy0tOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbmRpZgorICAgIHptX2RlYnVnX21zZzEoIiAgemZDb3JlU2V0S2V5Q29tcGxldGUtLS0gIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworCisgICAgemZQdXNoVnR4cShkZXYpOworfQorCit2b2lkIHpmQ29yZUhhbEluaXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmhhbFN0YXRlID0gWk1fSEFMX1NUQVRFX1JVTk5JTkc7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUHVzaFZ0eHEoZGV2KTsKK30KKwordm9pZCB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5tYWNBZGRyWzBdID0gYWRkclswXSB8ICgodTE2X3QpYWRkclsxXTw8OCk7CisgICAgd2QtPm1hY0FkZHJbMV0gPSBhZGRyWzJdIHwgKCh1MTZfdClhZGRyWzNdPDw4KTsKKyAgICB3ZC0+bWFjQWRkclsyXSA9IGFkZHJbNF0gfCAoKHUxNl90KWFkZHJbNV08PDgpOworCisKKyAgICAvL3pmSHBTZXRNYWNBZGRyZXNzKGRldiwgd2QtPm1hY0FkZHIsIDApOworICAgIGlmICh3ZC0+emZjYk1hY0FkZHJlc3NOb3RpZnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworICAgIH0KK30KKwordm9pZCB6ZkNvcmVTZXRJc29OYW1lKHpkZXZfdCogZGV2LCB1OF90KiBpc29OYW1lKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGlzb05hbWVbMF07CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gaXNvTmFtZVsxXTsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworIH0KKworCitleHRlcm4gdm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlByb2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QqIGV2ZW50QXJyYXksIHU4X3QgZXZlbnRDb3VudCkKK3sKKyAgICB1OF90IGksIGosIGJ5cGFzcyA9IEZBTFNFOworICAgIHUxNl90IGV2ZW50QnlwYXNzWzMyXTsKKyAgICB1OF90IGV2ZW50QnlwYXNzQ291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmWmVyb01lbW9yeSgodThfdCopIGV2ZW50QnlwYXNzLCA2NCk7CisKKyAgICBmb3IoIGk9MDsgaTxldmVudENvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqPTA7IGo8ZXZlbnRCeXBhc3NDb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBldmVudEJ5cGFzc1tqXSA9PSBldmVudEFycmF5W2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXBhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBieXBhc3MgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCggZXZlbnRBcnJheVtpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFN0YXJ0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX1NDQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IHJlczsKKworICAgICAgICAgICAgICAgICAgICByZXMgPSB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0lCU1NfTU9OSVRPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhSWJzc01vbml0b3JpbmcoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfSU5fU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0NNX1RJTUVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiWk1fRVZFTlRfQ01fVElNRVIiKTsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIFJlc29sdXRpb24gb24gV2luWFAgaXMgMTUvMTYgbXMgICovCisgICAgICAgICAgICAgICAgICAgIC8qIERlY3JlYXNlIFRpbWUgb2Zmc2V0IGZvciA8WFA+IENvdW50ZXIgTWVhc3VyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVElDS19DTV9CTE9DS19USU1FT1VUIC0gWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbU1pY0ZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fQkxPQ0tfVElNRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9FVkVOVF9DTV9CTE9DS19USU1FUiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSOmJBdXRvUmVjb25uZWN0IT0wIik7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgemZTY2FuTWdyU2NhblN0YXJ0KGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX0FEREJBOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZC0+YWRkYmFDb21wbGV0ZSAmJiAod2QtPmFkZGJhQ291bnQgPCA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgd2QtPnN0YS5ic3NpZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9BRERCQSwgMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX1RJTUVPVVRfUEVSRk9STUFOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRToKKwkJCQkvL2VuYWJsZSB0aGUgQ291bnRlcm1lYXN1cmUKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogRW5hYmxlIE1JQyBDaGVjayAiKTsKKwkJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDA7CisJCQkJfQorCQkJCWJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmQnNzSW5mb0NyZWF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID0gMDsKKyAgICB3ZC0+c3RhLmJzc0xpc3QuaGVhZCA9IE5VTEw7CisgICAgd2QtPnN0YS5ic3NMaXN0LnRhaWwgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9IDA7CisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsID0gMDsKKyAgICB3ZC0+c3RhLmJzc0luZm9GcmVlQ291bnQgPSBaTV9NQVhfQlNTOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuYnNzSW5mb0FycmF5W2ldID0gJih3ZC0+c3RhLmJzc0luZm9Qb29sW2ldKTsKKyAgICAgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0Rlc3Ryb3koemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZCc3NJbmZvUmVmcmVzaChkZXYsIDEpOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHdkLT5zdGEuYnNzSW5mb0FycmF5W2ldLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50ID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcEJzc0luZm8gPSB3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWRdOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5W3dkLT5zdGEuYnNzSW5mb0FycmF5SGVhZF0gPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWQgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50LS07CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXBCc3NJbmZvLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit2b2lkIHpmQnNzSW5mb0ZyZWUoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWxdID09IE5VTEwpOworCisgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gcEJzc0luZm8tPnNpZ25hbFF1YWxpdHkgPSAwOworICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSAwOworCisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsXSA9IHBCc3NJbmZvOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5VGFpbCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWwgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50Kys7Cit9CisKK3ZvaWQgemZCc3NJbmZvUmVvcmRlckxpc3QoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBJbnNCc3NJbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTmV4dEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBQcmVCc3NJbmZvID0gTlVMTDsKKyAgICB1OF90IGkgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID4gMSkKKyAgICB7CisgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEluc0Jzc0luZm87CisgICAgICAgIHBCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID49IHBJbnNCc3NJbmZvLT5zaWduYWxTdHJlbmd0aCkKKyAgICAgICAgICAgICAgICBpZiggcEJzc0luZm8tPnNvcnRWYWx1ZSA+PSBwSW5zQnNzSW5mby0+c29ydFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IEJzc0luZm8gdG8gaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0QnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPm5leHQgPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnNlcnQgQnNzSW5mbyB0byBuZWl0aGVyIGhlYWQgbm9yIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5uZXh0ID0gcEluc0Jzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEluc0Jzc0luZm8tPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TaWduYWwgc3RyZW5ndGggc21hbGxlciB0aGFuIGN1cnJlbnQgQnNzSW5mbywgY2hlY2sgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgcFByZUJzc0luZm8gPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0luc2VydCBCc3NJbmZvIHRvIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA+IDEpCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0luc2VydFRvTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fYXNzZXJ0KHBCc3NJbmZvKTsKKworICAgIC8vem1fZGVidWdfbXNnMigicEJzc0luZm8gPSAiLCBwQnNzSW5mbyk7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA9PSAwICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC5oZWFkID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorCisgICAgcEJzc0luZm8tPm5leHQgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCsrOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwUHJlQnNzSW5mbyA9IE5VTEw7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9hc3NlcnQocEJzc0luZm8pOworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJwQnNzSW5mbyA9ICIsIHBCc3NJbmZvKTsKKworICAgIHBOb3dCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBOb3dCc3NJbmZvID09IHBCc3NJbmZvICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJlQnNzSW5mby0+bmV4dCA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGkgPT0gKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCAtIDEpICkKKyAgICAgICAgICAgIHsgICAvKiByZW1vdmUgdGFpbCAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcFByZUJzc0luZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFByZUJzc0luZm8gPSBwTm93QnNzSW5mbzsKKyAgICAgICAgcE5vd0Jzc0luZm8gPSBwTm93QnNzSW5mby0+bmV4dDsKKyAgICB9CisKKyAgICB6bV9hc3NlcnQoaSAhPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudC0tOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiAgIHBOZXh0QnNzSW5mbzsKKyAgICB1OF90ICAgaSwgYnNzQ291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIGJzc0NvdW50ID0gd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50OworCisgICAgZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAobW9kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gcE5leHRCc3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+ZmxhZyAmIFpNX0JTU19JTkZPX1ZBTElEX0JJVCApCisgICAgICAgICAgICB7ICAgLyogdGhpcyBvbmUgbXVzdCBiZSBrZXB0ICovCisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZsYWcgJj0gflpNX0JTU19JTkZPX1ZBTElEX0JJVDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNkZWZpbmUgWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMgICAyMDAwMAorICAgICAgICAgICAgICAgIGlmICgod2QtPnRpY2sgLSBwQnNzSW5mby0+dGljaykgPiAoWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMvWk1fTVNfUEVSX1RJQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5leHRCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKQoreworICAgIHU4X3QgYnVmWzUwXTsKKyAgICB1OF90IHRtcExlbmd0aCA9IGxlbmd0aDsKKworICAgIGlmICggdG1wTGVuZ3RoID4gNDkgKQorICAgIHsKKyAgICAgICAgdG1wTGVuZ3RoID0gNDk7CisgICAgfQorCisgICAgemZNZW1vcnlDb3B5KGJ1ZiwgdmFsdWUsIHRtcExlbmd0aCk7CisgICAgYnVmW3RtcExlbmd0aF0gPSAnXDAnOworICAgIC8vcHJpbnRrKCJTU0lEOiAlc1xuIiwgYnVmKTsKKyAgICAvL3ptX2RlYnVnX21zZ19zKCJzc2lkID0gIiwgdmFsdWUpOworfQorCit2b2lkIHpmQ29yZVJlaW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyA9IDA7CisgICAgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMDsKK30KKwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKQoreworICAgIC8vVUxPTkdMT05HICAgdGltZTsKKyAgICB1MzJfdCB0aW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdGltZSA9IHdkLT50aWNrOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSByYW5kb20gQlNTSUQgdG8gYmUgdGhlIHNhbWUgYXMgTUFDIGFkZHJlc3MuCisgICAgLy8KKworICAgIC8vIFJ0bENvcHlNZW1vcnkoQlNTSUQsIE1BQ0FkZHIsIHNpemVvZihET1QxMV9NQUNfQUREUkVTUykpOworICAgIHpmTWVtb3J5Q29weShCU1NJRCwgTUFDQWRkciwgNik7CisKKyAgICAvLworICAgIC8vIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gMTAgbWlsbGlzZWNvbmQuCisgICAgLy8KKworICAgIC8vIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJnRpbWUpOworICAgIC8vIHRpbWUgLz0gMTAwMDAwOworCisgICAgLy8KKyAgICAvLyBSYW5kb21pemUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgQlNTSUQuCisgICAgLy8KKworICAgIEJTU0lEWzBdIF49ICh1OF90KSh0aW1lICYgMHhmZik7CisgICAgQlNTSURbMF0gJj0gfjB4MDE7ICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBtdWx0aWNhc3QgYml0CisgICAgQlNTSURbMF0gfD0gMHgwMjsgICAgICAgICAgICAgICAvLyBUdXJuIG9uIGxvY2FsIGJpdAorCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsxXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsyXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFszXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworfQorCit1OF90IHpmaVdsYW5HZXREZXN0QWRkckZyb21CdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCAqbWFjQWRkcikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIG1hY0FkZHJbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgbWFjQWRkclsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBtYWNBZGRyWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgbWFjQWRkclsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAgIC8qIERBICovCisgICAgbWFjQWRkclswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLworCit1MTZfdCB6ZkZpbmRDbGVhbkZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRob2NNb2RlKQoreworICAgIHU4X3QgICBpLCBqOworICAgIHUxNl90ICByZXR1cm5DaGFubmVsOworICAgIHUxNl90ICBjb3VudF8yNEcgPSAwLCBtaW4yNEdJbmRleCA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMCwgIG1pbjVHSW5kZXggPSAwOworICAgIHUxNl90ICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHWzE1XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluMjRHWzE3XSAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1MTZfdCAgQXJyYXlfMjRHWzE1XSAgICAgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluNUdbMzFdICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEFycmF5XzVHWzMxXSAgICAgICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICAgICAgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CRyB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkNoYW5uZWwgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuQ2hhbm5lbCA9IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuQ2hhbm5lbDsKKyAgICB9CisKKyAgICAvKiAjMSBHZXQgQWxsb3dlZCBDaGFubmVsIGZvbGxvd2luZyBDb3VudHJ5IENvZGUgISAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgMzAwMCkKKyAgICAgICAgeyAvLyAyLjRHSHoKKyAgICAgICAgICAgIEFycmF5XzI0R1tjb3VudF8yNEddID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICAgICAgQXJyYXlfNUdbaV0gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3aGlsZSggcEJzc0luZm8gIT0gTlVMTCApCisgICAgeworICAgICAgICAvKiAjMl8xIENvdW50IEJTUyBudW1iZXIgaW4gc29tZSBzcGVjaWZpY2VkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8CisgICAgICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpPTA7IGk8PShjb3VudF8yNEcrMyk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfMjRHW2ldICkKKyAgICAgICAgICAgICAgICB7IC8vIEFycmF5XzI0R1swXSBjb3JyZXNwb25kIHRvIEJzc051bWJlckluMjRHWzJdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW3BCc3NJbmZvLT5jaGFubmVsKzFdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogIzJfMiBDb3VudCBCU1MgbnVtYmVyIGluIHNvbWUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gNUdIeiBiYW5kICEgKi8KKyAgICAgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaT0wOyBpPGNvdW50XzVHOyBpKysgKQorICAgICAgICAgICAgeyAvLyA1R0h6IGNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIGFycmF5IGluZGV4CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfNUdbaV0gKQorICAgICAgICAgICAgICAgIHsgLy8gQXJyYXlfNUdbMF0gY29ycmVzcG9uZCB0byBCc3NOdW1iZXJJbjVHWzBdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluNUdbaV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgIH0KKworI2lmIDAKKyAgICBmb3IoaT0wOyBpPD0oY291bnRfMjRHKzMpOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIjIuNEdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW4yNEdbaV0pOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnRfNUc7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50aygiNUdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW41R1tpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIC8qICMzXzEgQ291bnQgQlNTIG51bWJlciB0aGF0IGluZmx1ZW5jZSB0aGUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gMi40R0h6ICEgKi8KKyAgICAgICAgZm9yKCBqPTA7IGo8Y291bnRfMjRHOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHW2pdID0gQnNzTnVtYmVySW4yNEdbal0gICArIEJzc051bWJlckluMjRHW2orMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW2orMl0gKyBCc3NOdW1iZXJJbjI0R1tqKzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NOdW1iZXJJbjI0R1tqKzRdOworICAgICAgICAgICAgLy9wcmludGsoIkFmdGVyIGNvbWJpbmUsIHRoZSBudW1iZXIgb2YgQlNTIG5ldHdvcmsgY2hhbm5lbCAlZCBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiAsIENvbWJpbmF0aW9uQnNzTnVtYmVySW4yNEdbal0pOworICAgICAgICB9CisKKyAgICAgICAgLyogIzRfMSBGaW5kIHRoZSBsZXNzIHV0aWxpemVkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIG1pbjI0R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0RywgY291bnRfMjRHKTsKKyAgICB9CisKKyAgICAvKiAjNF8yIEZpbmQgdGhlIGxlc3MgdXRpbGl6ZWQgZnJlcXVlbmN5IGluIDVHSHogYmFuZCAhICovCisgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgeworICAgICAgICBtaW41R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQnNzTnVtYmVySW41RywgY291bnRfNUcpOworICAgIH0KKworICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5XzI0R1ttaW4yNEdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSApCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlfNUdbbWluNUdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIGlmICggQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0R1ttaW4yNEdJbmRleF0gPD0gQnNzTnVtYmVySW41R1ttaW41R0luZGV4XSApCisgICAgICAgICAgICByZXR1cm4gQXJyYXlfMjRHW21pbjI0R0luZGV4XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFycmF5XzVHW21pbjVHSW5kZXhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAyNDEyOworfQorCit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpCit7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIHRlbXBNaW5JbmRleCwgdGVtcE1pblZhbHVlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9IDE7CisgICAgdGVtcE1pbkluZGV4ID0gMDsKKyAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVt0ZW1wTWluSW5kZXhdOworICAgIHdoaWxlKCBpPCBjb3VudCApCisgICAgeworICAgICAgICBpZiggYXJyYXlbaV0gPCB0ZW1wTWluVmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIHRlbXBNaW5JbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB0ZW1wTWluSW5kZXg7Cit9CisKK3U4X3QgemZDb21wYXJlV2l0aEJzc2lkKHpkZXZfdCogZGV2LCB1MTZfdCogYnNzaWQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKWJzc2lkLCAodThfdCopd2QtPnN0YS5ic3NpZCwgNikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBmdW5jX2V4dHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHByb3RvdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NGVU5DX0gKKyNkZWZpbmUgX0NGVU5DX0gKKworI2luY2x1ZGUgInF1ZXVlLmgiCisKKy8qIGFtc2R1LmMgKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSk7CisKKy8qIGNzY2FubWdyLmMgKi8KK3ZvaWQgemZTY2FuTWdySW5pdCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU2Nhbk1nclNjYW5TdGFydCh6ZGV2X3QqIGRldiwgdThfdCBzY2FuVHlwZSk7Cit2b2lkIHpmU2Nhbk1nclNjYW5TdG9wKHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKTsKK3ZvaWQgemZTY2FuTWdyU2NhbkFjayh6ZGV2X3QqIGRldik7CisKKy8qIGNwc21nci5jICovCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclNldE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldik7Cit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckNvbm5lY3ROb3RpZnkoemRldl90ICpkZXYpOwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldik7CisKKy8qIGNjbWQuYyAqLwordTE2X3QgemZXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKKworLyogY2Z1bmMuYyAqLwordThfdCB6ZlF1ZXJ5T3Bwb3NpdGVSYXRlKHpkZXZfdCogZGV2LCB1OF90IGRzdF9tYWNbNl0sIHU4X3QgZnJhbWVUeXBlKTsKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weVRvUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpOwordm9pZCB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weUZyb21SeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOwordm9pZCB6Zk1lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmWmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZSeEJ1ZmZlckVxdWFsVG9TdHIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBjb25zdCB1OF90KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZUeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKKwordm9pZCB6ZkNvbGxlY3RIV1RhbGx5KHpkZXZfdCpkZXYsIHUzMl90KiByc3AsIHU4X3QgaWQpOwordm9pZCB6ZlRpbWVySW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlRpbWVyU2NoZWR1bGUoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KTsKK3ZvaWQgemZUaW1lckNsZWFyKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmUHJvY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCB1MTZfdCogZXZlbnRBcnJheSwgdThfdCBldmVudENvdW50KTsKKwordm9pZCB6ZkJzc0luZm9DcmVhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9EZXN0cm95KHpkZXZfdCogZGV2KTsKKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9GcmVlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1Jlb3JkZXJMaXN0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZCc3NJbmZvSW5zZXJ0VG9MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5KTsKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwKKyAgICAgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IsIHU4X3QgZm9yY2VTZXRGcmVxKTsKK3ZvaWQgemZSZVNldEN1cnJlbnRGcmVxdWVuY3koemRldl90KiBkZXYpOwordTMyX3QgemZDb3JlU2V0S2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwKKyAgICAgICAgdTE2X3QqIG1hYywgdTMyX3QqIGtleSk7Cit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlUmVpbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlTWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCAqYWRkcik7Cit2b2lkIHpmQ29yZVNldElzb05hbWUoemRldl90KiBkZXYsIHU4X3QqIGlzb05hbWUpOwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKTsKK3ZvaWQgemZDb3JlSGFsSW5pdENvbXBsZXRlKHpkZXZfdCogZGV2KTsKKwordTE2X3QgemZGaW5kQ2xlYW5GcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGFkaG9jTW9kZSk7Cit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpOwordThfdCB6ZkNvbXBhcmVXaXRoQnNzaWQoemRldl90KiBkZXYsIHUxNl90KiBic3NpZCk7CisKKy8qIGNoYi5jICovCit2b2lkIHpmRHVtcEJzc0xpc3QoemRldl90KiBkZXYpOworCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpOworCisKKy8qIGNpYy5jICovCit2b2lkIHpmVXBkYXRlQnNzaWQoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKTsKK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZlVwZGF0ZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXkpOwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpOwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSk7Cit1OF90IHpmUFNEZXZpY2VTbGVlcCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKTsKK3ZvaWQgemZDb3JlRXZlbnQoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1OF90KiByc3ApOwordm9pZCB6ZkJlYWNvbkNmZ0ludGVycnVwdCh6ZGV2X3QqIGRldiwgdThfdCogcnNwKTsKK3ZvaWQgemZFbmRPZkF0aW1XaW5kb3dJbnRlcnJ1cHQoemRldl90KiBkZXYpOworCisvKiBjaW5pdC5jICovCit1MTZfdCB6ZlR4R2VuV2xhbkhlYWRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBoZWFkZXIsIHUxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgZmxhZywgdTE2X3QgcGx1c0xlbiwgdTE2X3QgbWludXNMZW4sIHUxNl90IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCogZGEsIHUxNl90KiBzYSwgdThfdCB1cCwgdTE2X3QgKm1pY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCk7Cit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7Cit2b2lkIHpmSW5pdE1hY0FwTW9kZSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TmV4dENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCogcGJQYXNzaXZlKTsKK3UxNl90IHpmQ2hHZXRGaXJzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0Rmlyc3Q1R2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQ2hOdW1Ub0ZyZXEoemRldl90KiBkZXYsIHU4X3QgY2gsIHU4X3QgZnJlcUJhbmQpOwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIGJJczVHQmFuZCk7CisKKy8qIGNtbS5jICovCit2b2lkIHpmUHJvY2Vzc01hbmFnZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOyAvL0NXWWFuZyhtKQordm9pZCB6ZlNlbmRNbUZyYW1lKHpkZXZfdCogZGV2LCB1OF90IGZyYW1lVHlwZSwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKTsKK3UxNl90IHpmRmluZEVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IGVpZCk7Cit1MTZfdCB6ZkZpbmRXaWZpRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSwgdThfdCBzdWJ0eXBlKTsKK3UxNl90IHpmRmluZFN1cGVyR0VsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpOwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKTsKK3UxNl90IHpmUmVtb3ZlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90IGVpZCk7Cit1MTZfdCB6ZlVwZGF0ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCogdXBkYXRlZWlkKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordTE2X3QgemZTZW5kUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgYldpdGhTU0lEKTsKK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdThfdCBlaWQsIHU4X3QgcmF0ZVNldCk7Cit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordm9pZCB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpOwordTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7IC8vQ1dZYW5nKCspCit1MTZfdCB6Zk1tQWRkUHJlTkhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOyAvL0NXWWFuZygrKQordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpOwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kTWFydmVsRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkZpbmRCcm9hZGNvbUV4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisvKiBjbW1hcC5jICovCit2b2lkIHpmTW1BcFRpbWVUaWNrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEFnaW5nU3RhKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQXBBZGRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0ZSwgdTE2X3QgYXBJZCwgdThfdCB0eXBlLAorICAgICAgICAgICAgICAgICB1OF90IHFvc1R5cGUsIHU4X3QgcW9zSW5mbyk7Cit2b2lkIHpmQXBQcm90Y3Rpb25Nb25pdG9yKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NBdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZkFwUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpOwordTE2X3QgemZBcEFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKTsKK3ZvaWQgemZBcFNlbmRCZWFjb24oemRldl90KiBkZXYpOwordTE2X3QgemZBcEdldFNUQUluZm8oemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCogc3RhdGUsIHU4X3QqIHZhcCk7Cit1MTZfdCB6ZkludHJhYnNzRm9yd2FyZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3Qgc3JjVmFwKTsKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7Cit2b2lkIHpmQXBJbml0U3RhVGJsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEdldFN0YVR4UmF0ZUFuZFFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCogcW9zVHlwZSwgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpOwordm9pZCB6ZkFwR2V0U3RhUW9zVHlwZSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHU4X3QqIHFvc1R5cGUpOwordm9pZCB6ZkFwU2V0U3RhVHhSYXRlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QgcGh5Q3RybCk7CitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZkFwR2V0VHhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBxb3NUeXBlKTsKK3UxNl90IHpmQXBBZGRJZVdtZVBhcmEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCk7Cit1MTZfdCB6ZkFwVXBkYXRlUHNCaXQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiB2YXAsIHU4X3QqIHVhcHNkVHJpZyk7Cit2b2lkIHpmQXBQcm9jZXNzUHNQb2xsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkFwRmluZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKTsKK3ZvaWQgemZBcEdldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIGl2MTYsIHUzMl90KiBpdjMyKTsKK3ZvaWQgemZBcFNldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QgaXYxNiwgdTMyX3QgaXYzMik7Cit2b2lkIHpmQXBDbGVhclN0YUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsCisgICAgICAgIHU4X3QgKmtleUlkeCk7Cit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3ZvaWQgemZBcFNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBtb2RlKTsKK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFNlbmRGYWlsdXJlKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKK3U4X3QgemZBcFJlbW92ZUZyb21Qc1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBpZCwgdTE2X3QqIHNyYyk7Cit2b2lkIHpmQXBQcm9jZXNzQWN0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKiBjbW1zdGEuYyAqLwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpOwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpOyAgLy8gTXh6ZW5nCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZlN0YVByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc0RlYXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXRpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVN0b3JlQXNvY1JzcEllKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhQ2hhbm5lbE1hbmFnZW1lbnQoemRldl90KiBkZXYsIHU4X3Qgc2Nhbik7Cit2b2lkIHpmSWJzc0Nvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZJbmZyYUNvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3U4X3QgemZDaGVja0F1dGhlbnRpY2F0aW9uKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKTsKK3UxNl90IHpmU3RhQWRkSWVTc2lkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3UxNl90IHpmU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKTsKK3UxNl90IHpmU3RhQWRkSWVJYnNzKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTdGFTdGFydENvbm5lY3QoemRldl90KiBkZXYsIHU4X3QgYklzU2hhcmVkS2V5KTsKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KTsKK3U4X3QgemZTdGFJc0Rpc2Nvbm5lY3QoemRldl90KiBkZXYpOwordm9pZCB6ZlN0YVNlbmRCZWFjb24oemRldl90KiBkZXYpOwordm9pZCB6ZlNlbmROdWxsRGF0YSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKTsKK3ZvaWQgemZTZW5kUFNQb2xsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTZW5kQkEoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgdThfdCAqYml0bWFwKTsKK3ZvaWQgemRSYXRlSW5mb0NvdW50VHgoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZlN0YUdldFR4TWljS2V5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YU1pY0ZhaWx1cmVIYW5kbGluZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordThfdCB6ZlN0YUJsb2NrV2xhblNjYW4oemRldl90KiBkZXYpOwordm9pZCB6ZlN0YUlic3NQU0NoZWNrU3RhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCk7Cit1MTZfdCB6ZlN0YUFkZEllV21lSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBxb3NJbmZvKTsKK3ZvaWQgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7Cit2b2lkIHpmU3RhSW5pdE9wcG9zaXRlSW5mbyh6ZGV2X3QqIGRldik7Cit2b2lkIHpmU3RhSWJzc01vbml0b3JpbmcoemRldl90KiBkZXYsIHU4X3QgcmVzZXQpOworc3RydWN0IHpzQnNzSW5mbyogemZTdGFGaW5kQnNzSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyICpwUHJvYmVSc3BIZWFkZXIpOwordThfdCB6ZlN0YUluaXRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlciwKKyAgICAgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8sIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbywgdThfdCB0eXBlKTsKK3M4X3QgemZTdGFGaW5kRnJlZU9wcG9zaXRlKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIGludCAqcEZvdW5kSWR4KTsKK3M4X3QgemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoemRldl90KiBkZXYsIHUxNl90ICpzYSwgdThfdCAqcEZvdW5kSWR4KTsKK3ZvaWQgemZTdGFSZWZyZXNoQmxvY2tMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpOwordm9pZCB6ZlN0YUNvbm5lY3RGYWlsKHpkZXZfdCogZGV2LCB1MTZfdCByZWFzb24sIHUxNl90KiBic3NpZCwgdThfdCB3ZWlnaHQpOwordm9pZCB6ZlN0YUdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUzMl90KiBwaHlDdHJsLAorICAgICAgICB1MTZfdCogcmNQcm9iaW5nRmxhZyk7Cit1MTZfdCB6ZlN0YVByb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3N0cnVjdCB6c1RraXBTZWVkKiB6ZlN0YUdldFJ4U2VlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSk7Cit2b2lkIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldik7Cit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCk7Cit1MTZfdCB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworCisvKiBjdGtpcC5jICovCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpOwordm9pZCB6Zk1pY1NldEtleSh1OF90KiBrZXksIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQXBwZW5kQnl0ZSh1OF90IGIsIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQ2xlYXIoc3RydWN0IHpzTWljVmFyKiBwTWljKTsKK3ZvaWQgemZNaWNBcHBlbmRUeEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRhLCB1OF90KiBzYSwKKyAgICAgICAgICAgICAgICAgICAgICB1MTZfdCByZW1vdmVMZW4sIHU4X3QqIG1pYyk7Cit1OF90IHpmTWljUnhWZXJpZnkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZNaWNHZXRNaWModThfdCogZHN0LCBzdHJ1Y3QgenNNaWNWYXIqIHBNaWMpOwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKTsKK3ZvaWQgemZUS0lQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIGtleSwgdTMyX3QqIGljdik7Cit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KTsKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCk7Cit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpOwordThfdCB6ZlRraXBQaGFzZTJLZXlNaXgodTE2X3QgaXYxNiwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkKTsKK3ZvaWQgemZXRVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdik7Cit1MTZfdCB6ZldFUERlY3J5cHQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3Qga2V5TGVuLCB1OF90KiBXZXBLZXksIHU4X3QgKml2KTsKKworLyogY3R4cnguYyAqLwordTE2X3QgemZTZW5kODAyMTFGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZklzclBjaVR4Q29tcCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmVHhQY2lEbWFTdGFydCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlR4UG9ydENvbnRyb2woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgIHUxNl90IGJ1ZlR5cGUsIHUxNl90IGZsYWcpOwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYyk7Cit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pOwordm9pZCB6ZlR4R2V0SXBUb3NBbmRGcmFnKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdXAsIHUxNl90KiBmcmFnT2ZmKTsKK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3U4X3QgemZJc1Z0eHFFbXB0eSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFNlcUN0cmwoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordThfdCB6ZkdldEZyYWdObyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlNob3dSeEVBUE9MKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOwordTE2X3QgemZQdXRWbW1xKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmRmx1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBZ2luZ0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHUxNl90IGZsdXNoRmxhZyk7CisKK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpOwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KTsKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJUeXBlKTsKKworLyogcXVldWUuYyAqLworc3RydWN0IHpzUXVldWUqIHpmUXVldWVDcmVhdGUoemRldl90KiBkZXYsIHUxNl90IHNpemUpOwordm9pZCB6ZlF1ZXVlRGVzdHJveSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljayk7Cit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKTsKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYik7Cit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpOwordm9pZCB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsCisgICAgICAgIHU4X3QqIHVuaUJpdE1hcCwgdTE2X3QqIGhpZ2hlc3RCeXRlKTsKKworLyogaHBtYWluLmMgKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordTE2X3QgemZIcFJlbGVhc2UoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpOwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpOwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNldEFwU3RhTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbik7Cit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpOwordm9pZCB6ZkhwU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbik7Cit2b2lkIHpmSHBFbmFibGVCZWFjb24oemRldl90KiBkZXYsIHUxNl90IG1vZGUsIHUxNl90IGJjbkludGVydmFsLCB1MTZfdCBkdGltLCB1OF90IGVuYWJsZUF0aW0pOwordm9pZCB6ZkhwRGlzYWJsZUJlYWNvbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTZXRCYXNpY1JhdGVTZXQoemRldl90KiBkZXYsIHUxNl90IGJSYXRlQmFzaWMsIHUxNl90IGdSYXRlQmFzaWMpOwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSk7Cit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKTsKK3UzMl90IHpmSHBHZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QsIHU4X3QgYkFsbE11bHRpY2FzdCk7CisKK3UxNl90IHpmSHBSZW1vdmVLZXkoemRldl90KiBkZXYsIHUxNl90IHVzZXIpOwordTMyX3QgemZIcFNldEtleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90IHR5cGUsCisgICAgICAgIHUxNl90KiBtYWMsIHUzMl90KiBrZXkpOworLy91MzJfdCB6ZkhwU2V0U3RhUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBhcE1hY0FkZHIsIHU4X3QgdHlwZSwKKy8vICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KTsKKy8vdTMyX3QgemZIcFNldFN0YUdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisvLyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSk7Cit1MzJfdCB6ZkhwU2V0QXBQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIHN0YU1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3Qgc3RhQWlkKTsKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKTsKK3UzMl90IHpmSHBTZXREZWZhdWx0S2V5KHpkZXZfdCogZGV2LCB1OF90IGtleUlkLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOwordTMyX3QgemZIcFNldFBlclVzZXJLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCogbWFjLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOworCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3UxNl90IHpmSHBHZXRQYXlsb2FkTGVuKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwbGNwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCisgICAgICAgICAgICAgICAgICAgICAgICApOwordTMyX3QgemZIcEdldEZyZWVUeGRDb3VudCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKKyAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90KiB0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeSh6ZGV2X3QqIGRldiwgdTE2X3QgQ291bnRyeUNvZGUpOwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKTsKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpOwordTE2X3QgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUpOwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBMZWRDdHJsKHpkZXZfdCogZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBSZXNldFR4UngoemRldl90KiBkZXYpOwordTE2X3QgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UzMl90IHpmSHBDd21VcGRhdGUoemRldl90KiBkZXYpOwordTMyX3QgemZIcEFuaVVwZGF0ZSh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKTsKK3ZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBBbmlBclBvbGwoemRldl90KiBkZXYsIHUzMl90IGxpc3RlblRpbWUsIHUzMl90IHBoeUNudDEsIHUzMl90IHBoeUNudDIpOwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpOwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBzdGFNb2RlLCB1OF90IHBzTW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwpOwordTE2X3QgemZIcElzRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsTkNTKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCk7Cit1MTZfdCB6ZkhwSXNBbGxvd2VkQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit2b2lkIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdThfdCBkaXNhYmxlRmxhZyk7Cit2b2lkIHpmSHBTZXRUVFNJRlNUaW1lKHpkZXZfdCogZGV2LCB1OF90IHNpZnNfdGltZSk7CisKK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pOworCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKTsKK3ZvaWQgemZIcFNldEFnZ1BrdE51bSh6ZGV2X3QqIGRldiwgdTMyX3QgbnVtKTsKK3ZvaWQgemZIcFNldE1QRFVEZW5zaXR5KHpkZXZfdCogZGV2LCB1OF90IGRlbnNpdHkpOwordm9pZCB6ZkhwU2V0U2xvdFRpbWUoemRldl90KiBkZXYsIHU4X3QgdHlwZSk7Cit2b2lkIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZkhwU2V0Umlmcyh6ZGV2X3QqIGRldiwgdThfdCBodF9lbmFibGUsIHU4X3QgaHQyMDQwLCB1OF90IGdfbW9kZSk7Cit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KTsKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTV0RlY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK3ZvaWQgemZIcFNXRW5jcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOwordTMyX3QgemZIcENhcGFiaWxpdHkoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0Um9sbENhbGxUYWJsZSh6ZGV2X3QqIGRldik7Cit1OF90IHpmSHByZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmU3RhQWRkSWVQb3dlckNhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KTsKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpOwordTE2X3QgemZTdGFBZGRJZVN1cHBvcnRDaCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApOwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfQ0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWMxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2hiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgaG91c2Uga2VlcGluZyBhbmQgdGltZXIgZnVuY3Rpb25zLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKiBDYWxsZWQgYnkgd3JhcHBlciBldmVyeSAxMCBtc2VjICovCit2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+dGljaysrOworCisjaWYgMAorICAgIC8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworICAgIGlmICh3ZC0+Y3dtLmN3X2VuYWJsZSAmJiAoKHdkLT50aWNrICYgMHg3ZikgPT0gMHgzZikpCisgICAgeworICAgICAgICB6ZkhwQ3dtVXBkYXRlKGRldik7CisgICAgfQorI2VuZGlmCisgICAgLyogPT4gZXZlcnkgMi41NiBzZWNvbmRzICovCisgICAgaWYgKCh3ZC0+dGljayAmIDB4ZmYpID09IDApCisgICAgeworICAgICAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworICAgIH0KKworICAgIC8qIFdhdGNoIERvZyAqLworICAgIC8vemZXYXRjaERvZygpOworCisgICAgLyogTEVEIENvbnRyb2wgKHBlciAxMDBtcykgKi8KKyAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDkpCisgICAgeworICAgICAgICB6ZkxlZDEwMG1zQ3RybChkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICBpZiAoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlEYmdSZWFkVGFsbHkoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX1JFV1JJVEVfQkVBQ09OX1NUQVJUX0FERFJFU1MKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbisrOyAgLy8gYWRkIDEwbXMKKworICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9PSAyKSAmJgorICAgICAgICAgICAgICAgICAod2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9PSAzMDApICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPCAzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSXQgaXMgaGFwcGVuISEhIE5vIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICB6ZlJlU2V0Q3VycmVudEZyZXF1ZW5jeShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYod2QtPnN0YS5SZWNlaXZlZFBhY2tldFJhdGVDb3VudGVyIDw9IDApCisgICAgeworICAgICAgICB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA9IHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCS8vem1fZGVidWdfbXNnMSgiUmVjZWl2ZSBQYWNrZXQgUGVyIFNlY29uZCAgPSAiLCB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCk7CisJICAgIGlmICh3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyAhPSAwKQorCSAgICB7CisJICAgICAgICB3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzID0gd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZUJ5dGVzL3dkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyA9IDY0MDsKKwkgICAgfQorICAgICAgICB3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyA9IDA7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyA9IDA7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlciA9IDEwMDsgLypmb3IgYW5vdGhlciAxcyovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlci0tOworICAgIH0KKworCS8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworCWlmKCh3ZC0+dGljayAmIDB4N2YpID09IDB4M2YpCisJeworCQlpZiggd2QtPnN0YS5Ob25OQVBjb3VudCA+IDApCisJCXsKKwkJCXdkLT5zdGEuUlRTSW5BR0dNb2RlID0gVFJVRTsKKwkJCXdkLT5zdGEuTm9uTkFQY291bnQgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJd2QtPnN0YS5SVFNJbkFHR01vZGUgPSBGQUxTRTsKKwkJfQorCX0KKworCisKKyAgICAvKiBNYWludGFpbiBtYW5hZ2VtZW50IHRpbWUgdGljayAqLworICAgIHpmTW1BcFRpbWVUaWNrKGRldik7CisgICAgemZNbVN0YVRpbWVUaWNrKGRldik7CisKKyAgICAvL3pmUGh5Q3JUdW5pbmcoZGV2KTsKKworICAgIC8vemZUeFBvd2VyQ29udHJvbChkZXYpOworICAgIHpmSHBIZWFydEJlYXQoZGV2KTsKKworfQorCisKK3ZvaWQgemZEdW1wQnNzTGlzdCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICB1OF90ICAgc3RyWzMzXTsKKyAgICB1OF90ICAgaSwgajsKKyAgICB1MzJfdCAgYWRkcjEsIGFkZHIyOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fZGVidWdfbXNnMCgiKioqKiogQnNzIHNjYW4gcmVzdWx0ICoqKioqIik7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIGkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoIkJTUyAjIiwgaSk7CisgICAgICAgIGZvcihqPTA7IGo8cEJzc0luZm8tPnNzaWRbMV07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyW2pdID0gcEJzc0luZm8tPnNzaWRbMitqXTsKKyAgICAgICAgfQorICAgICAgICBzdHJbcEJzc0luZm8tPnNzaWRbMV1dID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU1NJRCA9ICIpOworICAgICAgICB6bV9kZWJ1Z19tc2cwKHN0cik7CisKKyAgICAgICAgYWRkcjEgPSAocEJzc0luZm8tPmJzc2lkWzBdIDw8IDE2KSArIChwQnNzSW5mby0+YnNzaWRbMV0gPDwgOCApCisgICAgICAgICAgICAgICAgKyBwQnNzSW5mby0+YnNzaWRbMl07CisgICAgICAgIGFkZHIyID0gKHBCc3NJbmZvLT5ic3NpZFszXSA8PCAxNikgKyAocEJzc0luZm8tPmJzc2lkWzRdIDw8IDggKQorICAgICAgICAgICAgICAgICsgcEJzc0luZm8tPmJzc2lkWzVdOworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJCc3NpZCA9ICIsIGFkZHIxKTsKKyAgICAgICAgem1fZGVidWdfbXNnMigiICAgICAgICAiLCBhZGRyMik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSA9ICIsIHBCc3NJbmZvLT5mcmVxdWVuY3kpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzZWN1cml0eSB0eXBlID0gIiwgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSk7CisgICAgICAgIHptX2RlYnVnX21zZzEoIldNRSA9ICIsIHBCc3NJbmZvLT53bWVTdXBwb3J0KTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiYmVhY29uIGludGVydmFsID0gIiwgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdIDw8IDgpKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY2FwYWJpbGl0eSA9ICIsIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmNhcGFiaWxpdHlbMV0gPDwgOCkpOworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlc1sxXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGo9MDsgajxwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXNbMV07IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigic3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqPTA7IGo8cEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cyKCJleHQgc3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICB9CisKKyAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaWMuYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKKwordm9pZCB6ZlVwZGF0ZUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc2lkWzBdID0gYnNzaWRbMF0gKyAoKCh1MTZfdCkgYnNzaWRbMV0pIDw8IDgpOworICAgIHdkLT5zdGEuYnNzaWRbMV0gPSBic3NpZFsyXSArICgoKHUxNl90KSBic3NpZFszXSkgPDwgOCk7CisgICAgd2QtPnN0YS5ic3NpZFsyXSA9IGJzc2lkWzRdICsgKCgodTE2X3QpIGJzc2lkWzVdKSA8PCA4KTsKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZkhwU2V0QnNzaWQoZGV2LCBic3NpZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSZXNldCBzdXBwb3J0IHJhdGUgdG8gZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZTogWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICA9PiByZXNldCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QgPT4gcmVzZXQgdG8gZGlzY29ubmVjdCBzdGF0dXMgICAgICAqLworLyogICAgICAgICAgICBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgID0+IHJlc2V0IHRvIElCU1MgY3JlYXRvcihiIG1vZGUpICAgKi8KKy8qICAgICAgICAgICAgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICA9PiByZXNldCB0byBJQlNTIGNyZWF0b3IoYS9nIG1vZGUpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTzoKKyAgICAgICAgd2QtPmJSYXRlID0gMDsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAwOworICAgICAgICB3ZC0+Z1JhdGUgPSAwOworICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMHhmZjsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAweDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQjoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMDsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUc6CisgICAgICAgIHdkLT5iUmF0ZSA9IDB4ZjsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgIHdkLT5nUmF0ZSA9IDB4ZmY7CisgICAgICAgIHdkLT5nUmF0ZUJhc2ljID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmVXBkYXRlU3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGJSYXRlPTAsIGJSYXRlQmFzaWM9MCwgZ1JhdGU9MCwgZ1JhdGVCYXNpYz0wOworICAgIHU4X3QgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIHU4X3QgaSwgajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTI7IGk8bGVuZ3RoKzI7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChyYXRlQXJyYXlbaV0gJiAweDdmKSA9PSB6ZzExYlJhdGVUYmxbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIGlmICggcmF0ZUFycmF5W2ldICYgMHg4MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaiA9PSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGo9MDsgajw4OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJhdGVBcnJheVtpXSAmIDB4ODAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICB3ZC0+YlJhdGUgfD0gYlJhdGU7CisgICAgd2QtPmJSYXRlQmFzaWMgfD0gYlJhdGVCYXNpYzsKKyAgICB3ZC0+Z1JhdGUgfD0gZ1JhdGU7CisgICAgd2QtPmdSYXRlQmFzaWMgfD0gZ1JhdGVCYXNpYzsKK30KKwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpCit7CisgICAgdThfdCBsZW5ndGggPSByYXRlQXJyYXlbMV07CisgICAgdThfdCBpLCBqOworCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoICgocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKHJhdGVBcnJheVtpXSAmIDB4ODApICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGdhdGhlckJNb2RlW1pNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90IGksIGosIGsgPSAwOworICAgIHU4X3QgbGVuZ3RoOworCisgICAgZ2F0aGVyQk1vZGVbMF0gPSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEU7CisgICAgZ2F0aGVyQk1vZGVbMV0gPSAwOworCisgICAgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGlmICggKHJhdGVBcnJheVtpXSAmIDB4N2YpID09IHpnMTFiUmF0ZVRibFtqXSApIHsKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsyK2tdID0gcmF0ZUFycmF5W2ldOworCisgICAgICAgICAgICAgICAgZ2F0aGVyQk1vZGVbMV0rKzsKKyAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBleHRyYXRlQXJyYXlbMV07CisgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKCAoZXh0cmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWJSYXRlVGJsW2pdICkgeworICAgICAgICAgICAgICAgIGdhdGhlckJNb2RlWzIra10gPSBleHRyYXRlQXJyYXlbaV07CisKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsxXSsrOworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4dHJhdGVBcnJheVswXSA9IGV4dHJhdGVBcnJheVsxXSA9IDA7CisgICAgemZNZW1vcnlDb3B5KHJhdGVBcnJheSwgZ2F0aGVyQk1vZGUsIGdhdGhlckJNb2RlWzFdKzIpOworfQorCit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKQoreworI2lmIDAKKyAgICAvKiBDb21waWxlci9MaW5rZXIgZXJyb3Igb24gTGludXggKi8KKyAgICBpZiAoIGluaXRWYWx1ZSApCisgICAgeworICAgICAgICBzcmFuZChpbml0VmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAoKHUxNl90KXJhbmQoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZlBTRGV2aWNlU2xlZXAoemRldl90KiBkZXYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBlbnRlciBQUyBtb2RlICovCisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6Y09mZG1QaHlDcnRsVG9SYXRlW10gPQoreworICAgIC8qIDB4OD00OE0sIDB4OT0yNE0sIDB4YT0xMk0sIDB4Yj02TSwgMHhjPTU0TSwgMHhkPTM2TSwgMHhlPTE4TSwgMHhmPTlNICovCisgICAgICAgICAgICAxMCwgICAgICAgOCwgICAgICAgNiwgICAgICA0LCAgICAgIDExLCAgICAgICA5LCAgICAgICA3LCAgICAgIDUKK307CisKK3U4X3QgemZQaHlDdHJsVG9SYXRlKHUzMl90IHBoeUN0cmwpCit7CisgICAgdTMyX3QgbXQsIG1jcywgc2c7CisgICAgdThfdCByYXRlID0gMDsKKworICAgIG10ID0gcGh5Q3RybCAmIDB4MzsKKyAgICBtY3MgPSAocGh5Q3RybD4+MTgpICYgMHgzZjsKKyAgICBzZyA9IChwaHlDdHJsPj4zMSkgJiAweDE7CisKKyAgICBpZiAoKG10ID09IDApICYmIChtY3MgPD0zKSkKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCltY3M7CisgICAgfQorICAgIGVsc2UgaWYgKChtdCA9PSAxKSAmJiAobWNzID49IDB4OCkgJiYgKG1jcyA8PSAweGYpKQorICAgIHsKKyAgICAgICAgcmF0ZSA9IHpjT2ZkbVBoeUNydGxUb1JhdGVbbWNzLThdOworICAgIH0KKyAgICBlbHNlIGlmICgobXQgPT0gMikgJiYgKG1jcyA8PSAxNSkpCisgICAgeworICAgICAgICByYXRlID0gKHU4X3QpbWNzICsgMTI7CisgICAgICAgIGlmKHNnKSB7CisgICAgICAgICAgICBpZiAobWNzICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KW1jcyArIDEyICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9NQ1M3LVNHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KTMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKKwordm9pZCB6ZkNvcmVFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QgZXZlbnQsIHU4X3QqIHJzcCkKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCogcHNCdWY7CisgICAgdThfdCBtb3JlRGF0YTsKKyAgICB1OF90IHZhcCA9IDA7CisgICAgdThfdCBwZWVySWR4OworICAgIHM4X3QgcmVzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFwU2VuZEJlYWNvbihkZXYpOworCisgICAgICAgICAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogU2VuZCBxdWV1ZWQgYnJvYWRjYXN0IGZyYW1lcyBhdCBCQy9NQyBldmVudCAqLworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG1vcmVEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5iY21jVGFpbFt2YXBdICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgQkNNQyBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLmJjbWNBcnJheVt2YXBdW3dkLT5hcC5iY21jSGVhZFt2YXBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jSGVhZFt2YXBdID0gKHdkLT5hcC5iY21jSGVhZFt2YXBdICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmJjbWNUYWlsW3ZhcF0gIT0gd2QtPmFwLmJjbWNIZWFkW3ZhcF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogY29uZmlnIG1vcmVEYXRhIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBwc0J1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlKHBzQnVmICE9IE5VTEwpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTVEEgbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPiBaTV9TVEFfUFNfTk9ORSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2VuZCBxdWV1ZWQgcGFja2V0cyAqLworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB3ZC0+c3RhLnN0YVBTRGF0YVF1ZXVlW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNEYXRhQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU3RhU2VuZEJlYWNvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuaWJzc0F0aW1UaW1lciA9IFpNX0JJVF8xNSB8IHdkLT5zdGEuYXRpbVdpbmRvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByZVRCVFRJbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9pZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAxKSAvL1JldHJ5IGNvbXBsZXRlZCBldmVudAorICAgIHsKKyAgICAgICAgdTMyX3QgcmV0cnlSYXRlOworCisgICAgICAgIHJldHJ5UmF0ZSA9ICh1MzJfdCkocnNwWzZdKSArICgoKHUzMl90KShyc3BbN10pKTw8OCkKKyAgICAgICAgICAgICAgICArICgoKHUzMl90KShyc3BbOF0pKTw8MTYpICsgKCgodTMyX3QpKHJzcFs5XSkpPDwyNCk7CisgICAgICAgIC8qIERlZ3JhZGUgVHggUmF0ZSAqLworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoKGk9emZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKXJzcCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPmFwLnN0YVRhYmxlW2ldLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopcnNwLCAmcGVlcklkeCk7CisgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucmNDZWxsLCAwLCh1MzJfdCl6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfSAvL2Vsc2UgaWYgKGV2ZW50ID09IDEpIC8vUmV0cnkgY29tcGxldGVkIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gMikgLy9UeCBGYWlsIGV2ZW50CisgICAgeworICAgICAgICB1MzJfdCByZXRyeVJhdGU7CisKKyAgICAgICAgcmV0cnlSYXRlID0gKHUzMl90KShyc3BbNl0pICsgKCgodTMyX3QpKHJzcFs3XSkpPDw4KQorICAgICAgICAgICAgICAgICsgKCgodTMyX3QpKHJzcFs4XSkpPDwxNikgKyAoKCh1MzJfdCkocnNwWzldKSk8PDI0KTsKKworICAgICAgICAvKiBEZWdyYWRlIFR4IFJhdGUgKi8KKyAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKChpPXpmQXBGaW5kU3RhKGRldiwgKHUxNl90Kilyc3ApKSAhPSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5hcC5zdGFUYWJsZVtpXS5yY0NlbGwsIDAsKHUzMl90KXpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmQXBTZW5kRmFpbHVyZShkZXYsIHJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QqKXJzcCwgJnBlZXJJZHgpOworICAgICAgICAgICAgaWYgKCByZXMgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9lbHNlIGlmIChldmVudCA9PSAyKSAvL1R4IEZhaWwgZXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAzKSAvL1R4IENvbXAgZXZlbnQKKyAgICB7CisgICAgICAgIHUzMl90IHJldHJ5UmF0ZTsKKworICAgICAgICByZXRyeVJhdGUgPSAodTMyX3QpKHJzcFs2XSkgKyAoKCh1MzJfdCkocnNwWzddKSk8PDgpCisgICAgICAgICAgICAgICAgKyAoKCh1MzJfdCkocnNwWzhdKSk8PDE2KSArICgoKHUzMl90KShyc3BbOV0pKTw8MjQpOworCisgICAgICAgIC8qIFRPRE8gOiBUeCBjb21wbGV0ZWQsIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwcm9iaW5nICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICgoaT16ZkFwRmluZFN0YShkZXYsICh1MTZfdCopcnNwKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+YXAuc3RhVGFibGVbaV0ucmNDZWxsLCB6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgKHUxNl90Kilyc3AsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1twZWVySWR4XS5yY0NlbGwsIHpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICB9IC8vZWxzZSBpZiAoZXZlbnQgPT0gMykgLy9UeCBDb21wIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gNCkgLy9CQSBmYWlsZWQgY291bnQKKyAgICB7CisgICAgICAgIHUzMl90IGZhaWw7CisgICAgICAgIHUzMl90IHJhdGU7CisgICAgICAgIHBlZXJJZHggPSAwOworCisgICAgICAgIGZhaWw9KCh1MzJfdCopcnNwKVswXSAmIDB4RkZGRjsKKyAgICAgICAgcmF0ZT0oKHUzMl90Kilyc3ApWzBdID4+IDE2OworCisgICAgICAgIGlmIChyYXRlID4gMTUpIHsKKyAgICAgICAgICAgIHJhdGUgPSAocmF0ZSAmIDB4RikgKyAxMiArIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByYXRlID0gcmF0ZSArIDEyOworICAgICAgICB9CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgKHU4X3QpcmF0ZSwgZmFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmQmVhY29uQ2ZnSW50ZXJydXB0KHpkZXZfdCogZGV2LCB1OF90KiByc3ApCit7CisgICAgdTMyX3QgdHhCZWFjb25Db3VudGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB0eEJlYWNvbkNvdW50ZXIgPSAqKCh1MzJfdCAqKXJzcCk7CisgICAgICAgIGlmICggd2QtPnN0YS5iZWFjb25UeENudCAhPSB0eEJlYWNvbkNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnR4QmVhY29uSW5kID0gMTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEudHhCZWFjb25JbmQgPSAwOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19ERUxBWUVEX0pPSU5fSU5ESUNBVElPTgorICAgICAgICBpZiAoIHdkLT5zdGEudHhCZWFjb25JbmQgJiYgd2QtPnN0YS5pYnNzRGVsYXllZEluZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmlic3NEZWxheWVkSW5kID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS5iZWFjb25UeENudCA9IHR4QmVhY29uQ291bnRlcjsKKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0aW1lIGlzIGV4cGlyZWQgYWZ0ZXIgQVRJTSB3aW5kb3c/PworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYnVmZmVyZWQgYW55IGRhdGEgZm9yIHRob3NlIHN0YXRpb25zIHRoYXQgYXJlIHNsZWVwaW5nCisgICAgICAgIC8vIElmIGl0J3MgdHJ1ZSwgdGhlbiB0cmFuc21pdHRpbmcgQVRJTSBwa3QgdG8gbm90aWZ5IHRoZW0KKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2hlY2sgaWYgdGhlIHN0YXRpb24gcmVjZWl2ZSBvdXIgQVRJTSBwa3Q/Pz8KKyAgICAgICAgemZTdGFJYnNzUFNTZW5kKGRldik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF0aW1XaW5kb3cgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IHJlY2VpdmUgdGhlIGVuZCBvZiBBVElNIGlzciBzbyB3ZSBmYWtlIGl0CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCit2b2lkIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KHpkZXZfdCogZGV2KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8vIFRyYW5zbWl0IGFueSBxdWV1ZWQgcGt0IGZvciB0aGUgc3RhdGlvbnMhIQorICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Npbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jCkBAIC0wLDAgKzEsMTkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBpbml0IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjWzhdOworCit1MTZfdCB6Y0luZGV4dG9SYXRlQkdbMTZdID0gezEwMDAsIDIwMDAsIDU1MDAsIDExMDAwLCAwLCAwLCAwLCAwLCA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMTIwMDAsIDYwMDAsIDU0MDAwLCAzNjAwMCwgMTgwMDAsIDkwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU4yMExbMTZdID0gezY1MDAsIDEzMDAwLCAxOTUwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNTg1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTAwMCwgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsIDc4MDAwLCAxMDQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcwMDAsIDEzMDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwU1sxNl0gPSB7NzIwMCwgMTQ0MDAsIDIxNzAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA2NTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjAwLCAxNDQwMCwgMjg5MDAsIDQzMzAwLCA1NzgwMCwgODY3MDAsIDExNTYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDAwMCwgMTQ0NDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XSA9IHsxMzUwMCwgMjcwMDAsIDQwNTAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTIxNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1MDAwLCAyNzAwMCwgNTQwMDAsIDgxMDAwLCAxMDgwMDAsIDE2MjAwMCwgMjE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzMDAwLCAyNzAwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MFNbMTZdID0gezE1MDAwLCAzMDAwMCwgNDUwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxMzUwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwMDAsIDMwMDAwLCA2MDAwMCwgOTAwMDAsIDEyMDAwMCwgMTgwMDAwLCAyNDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAwMDAsIDMwMDAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2VuV2xhbkhlYWRlciAgICAgICAgICAgKi8KKy8qICAgICAgR2VuZXJhdGUgV0xBTiBNQUMgaGVhZGVyIGFuZCBMTEMgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IEluZGV4IG9mIFR4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuZ3RoIG9mIHJlbW92ZWQgRXRoZXJuZXQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhHZW5XbGFuSGVhZGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBmbGFnLCB1MTZfdCBwbHVzTGVuLCB1MTZfdCBtaW51c0xlbiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCAqbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sKQoreworCisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IG1hY0N0cmw7CisgICAgdTMyX3QgcGh5Q3RybDsKKyAgICB1MTZfdCBobGVuID0gMTY7CisgICAgdTE2X3QgaWN2TGVuID0gMDsKKyAgICB1MTZfdCB3ZHNQb3J0SWQ7CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBtY3MgPSAwOworICAgIHUxNl90IG10ID0gMDsKKyAgICB1OF90ICBxb3NUeXBlOworICAgIHU4X3QgIGIxLCBiMjsKKyAgICB1MTZfdCB3ZHNQb3J0OworICAgIHU4X3QgIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGU7CisgICAgdTE2X3QgcmF0ZVByb2JpbmdGbGFnID0gMDsKKyAgICB1OF90ICB0a2lwRnJhbWVPZmZzZXQgPSAwOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgcmVzLCBwZWVySWR4OworICAgIHU4X3QgICAgdXNlcklkeD0wOworICAgIHUxNl90ICAgKml2MTY7CisgICAgdTMyX3QgICAqaXYzMjsKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAvKiBHZW5lcmF0ZSBXTEFOIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICBoZWFkZXJbNF0gPSAweDAwMDggfCAoZmxhZzw8OCk7CisgICAgLyogRHVyYXRpb24gKi8KKyAgICBoZWFkZXJbNV0gPSAweDAwMDA7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICAvKiBUb0RTIGJpdCAqLworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOworCisgICAgICAgIC8qU29tZXRpbWVzIHdlIHdha2UgdXAgdG8gdHgvcnggYnV0IEFQIHN0aWxsIHRoaW5rIHdlIGFyZSBzbGVlcGluZywgc28gc3RpbGwgbmVlZCB0byBzZXQgdGhpcyBiaXQqLworICAgICAgICBpZiAoIHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikgfHwgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkcmVzcyAxID0gQlNTSUQgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzddID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzhdID0gd2QtPnN0YS5ic3NpZFsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IGRhWzBdOworICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSBkYVsyXTsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgIGhlYWRlcls3XSA9IGRhWzFdOworICAgICAgICBoZWFkZXJbOF0gPSBkYVsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IDA7CisgICAgICAgIGhlYWRlclsxM10gPSAwOworICAgICAgICBoZWFkZXJbMTRdID0gMDsKKworICAgICAgICAvKiBQU0VVRE8gdGVzdCA6IFdEUyAqLworICAgICAgICBpZiAod2QtPmVuYWJsZVdEUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVG9EUyBhbmQgRnJvbURTIGJpdCAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDMwMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyA0ID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxNl0gPSAwOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDA7CisgICAgICAgICAgICBoZWFkZXJbMThdID0gMDsKKworICAgICAgICAgICAgaGxlbiA9IDE5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICBoZWFkZXJbNl0gPSBkYVswXTsKKyAgICAgICAgaGVhZGVyWzddID0gZGFbMV07CisgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAvKiBBZGRyZXNzIDMgPSBCU1NJRCAqLworICAgICAgICBoZWFkZXJbMTJdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzEzXSA9IHdkLT5zdGEuYnNzaWRbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsIGRhLCAmcGVlcklkeCk7CisgICAgICAgIGlmKHJlcyA9PSAwKSAvLyBGaW5kIG9wcG9zaXRlIGluIG91ciBPcHBvc2l0ZUluZm8gU3RydWN0dXJlICEKKyAgICAgICAgeworICAgICAgICAgICAgdXNlcklkeCA9IHBlZXJJZHg7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0IDwgMHgyMCkKKyAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMjAwOworCisgICAgICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbN10gPSBkYVsxXTsKKyAgICAgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAgICAgLyogQWRkcmVzcyAzID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxMl0gPSBzYVswXTsKKyAgICAgICAgICAgIGhlYWRlclsxM10gPSBzYVsxXTsKKyAgICAgICAgICAgIGhlYWRlclsxNF0gPSBzYVsyXTsKKworICAgICAgICAgICAgaWYgKHBvcnQgPCBaTV9NQVhfQVBfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXAgPSBwb3J0OworICAgICAgICAgICAgICAgIGhlYWRlclsxNF0gKz0gKHZhcDw8OCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAvKiBXRFMgcG9ydCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RTIGFuZCBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMzAwOworCisgICAgICAgICAgICB3ZHNQb3J0SWQgPSBwb3J0IC0gMHgyMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyAxID0gUkEgKi8KKyAgICAgICAgICAgIGhlYWRlcls2XSA9IHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzBdOworICAgICAgICAgICAgaGVhZGVyWzddID0gd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMV07CisgICAgICAgICAgICBoZWFkZXJbOF0gPSB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVsyXTsKKyAgICAgICAgICAgIC8qIEFkZHJlc3MgMyA9IERBICovCisgICAgICAgICAgICBoZWFkZXJbMTJdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgICAgICBoZWFkZXJbMTRdID0gZGFbMl07CisgICAgICAgICAgICAvKiBBZGRyZXNzIDQgPSBTQSAqLworICAgICAgICAgICAgaGVhZGVyWzE2XSA9IHNhWzBdOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IHNhWzFdOworICAgICAgICAgICAgaGVhZGVyWzE4XSA9IHNhWzJdOworCisgICAgICAgICAgICBobGVuID0gMTk7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAqLworCisgICAgLyogQWRkcmVzcyAyID0gVEEgKi8KKyAgICBoZWFkZXJbOV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbMTBdID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgJiYgKHdkLT5YTGlua01vZGUpICkKKyAgICB7CisgICAgICAgIGhlYWRlcls5XSAgPSBzYVswXTsKKyAgICAgICAgaGVhZGVyWzEwXSA9IHNhWzFdOworICAgICAgICBoZWFkZXJbMTFdID0gc2FbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIGhlYWRlclsxNV0gPSBzZXE7CisKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKGRldiwgZGEsICZwaHlDdHJsLCAmcW9zVHlwZSwgJnJhdGVQcm9iaW5nRmxhZyk7CisgICAgICAgIG10ID0gKHUxNl90KShwaHlDdHJsICYgMHgzKTsKKyAgICAgICAgbWNzID0gKHUxNl90KSgocGh5Q3RybCA+PiAxNikgJiAweDNmKTsKKyNpZiAxCisgICAgICAgIC8vemZBcEdldFN0YVFvc1R5cGUoZGV2LCBkYSwgJnFvc1R5cGUpOworCisgICAgICAgIC8qIGlmIERBID09IFdNRSBTVEEgKi8KKyAgICAgICAgaWYgKHFvc1R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDAwODA7CisKKyAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSB1cDsKKyAgICAgICAgICAgIGhsZW4gKz0gMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWYgMAorICAgIC8vQUdHIFRlc3QgQ29kZQorICAgIGlmIChoZWFkZXJbNl0gPT0gMHg4MDAwKQorICAgIHsKKyAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAvKiBRb1MgQ29udHJvbCAqLworICAgICAgICBoZWFkZXJbaGxlbl0gPSAwOworICAgICAgICBobGVuICs9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgLyogVG9kbzogcmF0ZSBjb250cm9sIGhlcmUgZm9yIHFvcyBmaWVsZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmF0ZSBjb250cm9sICovCisgICAgICAgIHpmU3RhR2V0VHhSYXRlKGRldiwgZGEsICZwaHlDdHJsLCAmcmF0ZVByb2JpbmdGbGFnKTsKKyAgICAgICAgbXQgPSAodTE2X3QpKHBoeUN0cmwgJiAweDMpOworICAgICAgICBtY3MgPSAodTE2X3QpKChwaHlDdHJsID4+IDE2KSAmIDB4M2YpOworICAgIH0KKworICAgIGlmICh3ZC0+dHhNQ1MgIT0gMHhmZikKKyAgICB7CisgICAgICAgIC8qIGZpeGVkIHJhdGUgKi8KKwkgICAgcGh5Q3RybCA9ICgodTMyX3Qpd2QtPnR4TUNTPDwxNikgKyB3ZC0+dHhNVDsKKyAgICAgICAgbWNzID0gd2QtPnR4TUNTOworICAgICAgICBtdCA9IHdkLT50eE1UOworICAgIH0KKworICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb24pCisgICAgeworICAgICAgICAvKiBmb3JjZSBlbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbj09MiAmJiAhKGhlYWRlcls2XSYweDEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBRb1MgZGF0YSAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgLyogUW9TIENvbnRyb2wgKi8KKyAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICBobGVuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyoKKyAgICAgKiBhZ2dyZWdhdGlvbiBjb250cm9sCisgICAgICovCisKKyAgICAvKgorICAgICAqIFFvUyBkYXRhCisgICAgICovCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIG10ID09IDIpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMDgwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBRb1MgQ29udHJvbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBNU0RVIExlbmd0aAorICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nICovCisgICAgLyogQmFja29mZiwgTm9uLUJ1cnN0IGFuZCBoYXJkd2FyZSBkdXJhdGlvbiAqLworICAgIG1hY0N0cmwgPSAweDIwODsKKworICAgIC8qIEFDSyAqLworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgOiBTZXQgTk8tQUNLIGJpdCAqLworICAgICAgICBtYWNDdHJsIHw9IDB4NDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogdW5pY2FzdCBmcmFtZSAqLworICAgICNpZiAwCisgICAgICAgIC8vIEVuYWJsZSBSVFMgYWNjb3JkaW5nIHRvIE1QRFUgTGVuZ3RocyAoIG5vdCBNU0RVIExlbmd0aHMgKQorICAgICAgICBpZiAobGVuID49IHdkLT5ydHNUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBSVFMgKi8KKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorICAgIH0KKyAgICAvKiBWQVAgdGVzdCBjb2RlICovCisgICAgLy9tYWNDdHJsIHw9IDB4NDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHU4X3QgZW5jcnlUeXBlOworICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICB1MzJfdCBpdjMyOworCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworICAgICAgICBpZiAoKGhlYWRlcls2XSAmIDB4MSkgPT0gMHgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5hcC5pdjE2W3ZhcF0gPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5hcC5pdjE2W3ZhcF07CisgICAgICAgICAgICAgICAgYjIgPSAweDIwIHwgKHdkLT5hcC5iY0tleUluZGV4W3ZhcF0gPDwgNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIHdkLT5hcC5pdjMyW3ZhcF07CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPmFwLml2MTZbdmFwXTsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPmFwLml2MTZbdmFwXSA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDAgfCAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNCk7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKHdkLT5hcC5pdjMyW3ZhcF0gPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3UzMl90IHR4aXZbNF07CisKKyAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzBdKys7CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVswXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAudHhpdlt2YXBdWzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC50eGl2W3ZhcF1bMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSAmIDB4MDAwMSk7ICAgIC8qIEZvciBLZXkgSWQgYW5kIHJlc2VydmVkIGZpZWxkICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVswXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVswXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsxXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis0XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsxXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsyXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rN10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVszXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis4XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVszXSA+PiAxNik7CisKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gMTY7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBTVEEncyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHpmQXBHZXRTdGFFbmNyeVR5cGUoZGV2LCBkYSwgJmVuY3J5VHlwZSk7CisKKyAgICAgICAgICAgIGlmIChlbmNyeVR5cGUgPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKGl2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIGl2MTY7CisgICAgICAgICAgICAgICAgYjIgPSAweDIwOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSBpdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAoaXYzMiA+PiAxNik7CisKKyAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKworICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAqbWljTGVuID0gODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBpdjE2IGFuZCBpdjMyICovCisgICAgICAgICAgICAgICAgemZBcFNldFN0YVdwYUl2KGRldiwgZGEsIGl2MTYsIGl2MzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZW5jcnlUeXBlID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAoaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIChpdjMyKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKGl2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworCisgICAgICAgICAgICAgICAgLyogU2V0IGl2MTYgYW5kIGl2MzIgKi8KKyAgICAgICAgICAgICAgICB6ZkFwU2V0U3RhV3BhSXYoZGV2LCBkYSwgaXYxNiwgaXYzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuY3J5VHlwZSA9PSBaTV9DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHR4aXZbNF07CisgICAgICAgICAgICAgICAgdThfdCBrZXlJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBHZXQgQ0VOQyBUeElWICovCisgICAgICAgICAgICAgICAgemZBcEdldFN0YUNlbmNJdkFuZEtleUlkeChkZXYsIGRhLCB0eGl2LCAma2V5SWR4KTsKKworICAgICAgICAgICAgICAgIHR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzBdID09IDAgfHwgdHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoa2V5SWR4ICYgMHgwMDAxKTsgICAgLyogRm9yIEtleSBJZCBhbmQgcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICh1MTZfdCl0eGl2WzBdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSh0eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCl0eGl2WzFdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzRdID0gKHUxNl90KSh0eGl2WzFdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCl0eGl2WzJdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzZdID0gKHUxNl90KSh0eGl2WzJdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis3XSA9ICh1MTZfdCl0eGl2WzNdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSh0eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSAxNjsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgQ0VOQyBJViAqLworICAgICAgICAgICAgICAgIHpmQXBTZXRTdGFDZW5jSXYoZGV2LCBkYSwgdHhpdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFNlbGYtQ1RTICovCisgICAgICAgICAgICBtYWNDdHJsICY9IDB4RkZGQzsKKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJhdGUgQ29udHJvbCAqLworICAgICAgICBpZiAocG9ydCA8IDB4MjApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFQICovCisgICAgICAgICAgICAvKiBJViAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQpIHx8CisgICAgICAgICAgICAgICAgICAgICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQMTI4KSB8fAorICAgICAgICAgICAgICAgICAgICAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX1dFUDI1NikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAweDA7ICAgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkLS1DV1lhbmcobSkKKyAgICAgICAgICAgICAgICBobGVuICs9IDI7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXRFMgKi8KKworICAgICAgICAgICAgLyogVE9ETyA6IEZpeGVkIHJhdGUgdG8gNTRNICovCisgICAgICAgICAgICBwaHlDdHJsID0gMHhjMDAwMTsgICAvL1BIWSBjb250cm9sIEwKKworICAgICAgICAgICAgLyogV0RTIHBvcnQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICgod2RzUG9ydCA9IChwb3J0IC0gMHgyMCkpID49IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZHNQb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8qIElWICovCisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSB3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoIShzZXEgJiAweGYpKSYmKCEoZmxhZyAmIDB4NCkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNMZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsgLyogU2V0IHRvIEFFUyBpbiBjb250cm9sIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gODsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7IC8qIFNldCBXRVAgYml0IGluIHdsYW4gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsgLyogcGx1cyBJViBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9LyogZW5kIG9mIHN3aXRjaCAqLworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICovCisgICAgeworICAgICAgICBlbmNFeGVtcHRpb25BY3Rpb25UeXBlID0gemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZShkZXYsIGJ1Zik7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZiAxCisgICAgICAgICAgICAvKiBpZiBXTUUgQVAgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFFvUyBkYXRhICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gdXA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA8IFpNX0FVVEhfTU9ERV9XUEEgKQorICAgICAgICAgICAgICAgIHsgICAvKiBub24tV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdIHw9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgU29mdHdhcmUgV0VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1dFUF9FTkNSWV9FTikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdlswXSA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSAweDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2WzJdID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVbd2QtPnN0YS5rZXlJZF0gPT0gWk1fV0VQMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZldFUEVuY3J5cHQoZGV2LCBidWYsICh1OF90Kikgc25hcCwgc25hcExlbiwgbWludXNMZW4sIGtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndlcEtleVt3ZC0+c3RhLmtleUlkXSwgaXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICAgLyogV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53cGFTdGF0ZSA+PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGVuY3J5cHRpb24gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKGIxIHwgMHgyMCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAweDIwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpIHwgKCgodTE2X3QpYjIgPDwgOCkgKyBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBIGluIGluZnJhc3RydWN0dXJlIG1vZGUgc2hvdWxkIHVzZSBrZXlJZCA9IDAgdG8gdHJhbnNtaXQgdW5pY2FzdCAhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCliMiA8PCA4KSArIGIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNvZnR3YXJlIGVuY3J5cHRpb24gZW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBzYW1lIHRvIFdFUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1pY0xlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBtaWNbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgaWN2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBjcml0aWNpYWwgc2VjdGlvbiBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDYWxUeE1pYyhkZXYsIGJ1ZiwgKHU4X3QgKilzbmFwLCBzbmFwTGVuLCBtaW51c0xlbiwgZGEsIHNhLCB1cCwgbWljKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcHBlbmQgTUlDIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWljLCBvZmZzZXQsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBLZXkgTWl4aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMUtleU1peCh3ZC0+c3RhLml2MzIsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peCh3ZC0+c3RhLml2MTYsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcEdldHNlZWRzKHdkLT5zdGEuaXYxNiwgUkM0S2V5LCAmd2QtPnN0YS50eFNlZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHQgRGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlRLSVBFbmNyeXB0KGRldiwgYnVmLCAodThfdCAqKXNuYXAsIHNuYXBMZW4sIG1pbnVzTGVuLCAxNiwgUkM0S2V5LCAmaWN2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJbaGxlbisxXSA9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCkgfCAoMHgyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSBzaG91bGQgdXNlIGtleUlkID0gMCB0byB0cmFuc21pdCB1bmljYXN0ICEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlswXSA9PSAwIHx8IHdkLT5zdGEudHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsyXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPnN0YS5jZW5jS2V5SWQgJiAweDAwMDEpOyAgICAvKiBGb3IgS2V5IElkIGFuZCByZXNlcnZlZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMF0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzVdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMl0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rOF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbM10gPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICB9IC8qIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKSAqLworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgICAgICBpZiggd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPj0gWk1fU1RBX1dQQV9TVEFURV9QS19PSyB8fCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXNVbmljYXN0ID0gMSA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWNhc3QgPSAwIDsgLy8gTm90IHVuaWNhc3QgLCBpcyBicm9hZGNhc3QKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7IC8qIFRoZSBJViBvcmRlciBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB1bmljYXN0IGFuZCBicm9hZGNhc3QgISAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1VuaWNhc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2MTYgPSAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdjMyID0gJndkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYxNiA9ICZ3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYzMiA9ICZ3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdjE2ID0gJndkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl2MzIgPSAmd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKCppdjE2KSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoICppdjE2ID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGUgPT0gWk1fQUVTIHx8IHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIlN0YXRpb24gZW5jcnlwdGlvbiBtb2RlIGlzIEFFUy1DQ01QXG4iKSA7CisgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAoKml2MTYpOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAodThfdCkgKCgqaXYxNikgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAoKml2MzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICgoKml2MzIpID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVA2NCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDEyOCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogLS0tLS0gMjAwNzA0MDUgYWRkIGJ5IE14emVuZyAtLS0tLSAqLworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlzVW5pY2FzdCA9IDEgOworCisgICAgICAgICAgICAgICAgICAgIGlmKChkYVswXSYgMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmljYXN0ID0gMCA7IC8vIE5vdCB1bmljYXN0ICwgaXMgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLml2MTYgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiU3RhdGlvbiBlbmNyeXB0aW9uIG1vZGUgaXMgQUVTLUNDTVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQNjQpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQMTI4KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSAgIC8vIEVuZCBpZiAoIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGUgPT0gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OICkKKyAgICAgICAgfSAgIC8vIEVuZCBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKwkgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5pdjE2ID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5zdGEuaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPnN0YS5pdjE2OworICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfS8qIGVuZCBvZiBQU0VVRE8gVEtJUCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICB9LyogZW5kIG9mIFBTRVVETyBBRVMgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzBdID09IDAgfHwgd2QtPnN0YS50eGl2WzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzNdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpIHdkLT5zdGEudHhpdlsxXTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCkgd2QtPnN0YS50eGl2WzJdOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkgKHdkLT5zdGEudHhpdlsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA5OworCQkJCWJyZWFrOworCQkgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJCX0vKiBlbmQgb2Ygc3dpdGNoICovCisJCX0KKworICAgICAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKworICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZT09MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JjZSBlbmFibGUgcHJvdGVjdGlvbjogc2VsZiBjdHMgICovCisgICAgICAgICAgICAgICAgbWFjQ3RybCAmPSAweEZGRkM7CisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTAgPT4gYXV0byAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTZWxmLUNUUyAqLworICAgICAgICAgICAgICAgIG1hY0N0cmwgJj0gMHhGRkZDOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHdkLT50eE1DUyAhPSAweGZmKQorICAgIHsKKyAgICAgICAgLyogZml4ZWQgcmF0ZSAqLworCSAgICBwaHlDdHJsID0gKCh1MzJfdCl3ZC0+dHhNQ1M8PDE2KSArIHdkLT50eE1UOworICAgICAgICBtY3MgPSB3ZC0+dHhNQ1M7CisgICAgICAgIG10ID0gd2QtPnR4TVQ7CisgICAgfQorCisgICAgaWYgKG10ID09IDIpCisgICAgeworI2lmIDAKKyAgICAgICAgLyogSFQgUFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJICAgIGlmICh3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID09IFpNX1BSRUFNQkxFX1RZUEVfR1JFRU5fRklFTEQpCisJICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gMHg0OyAgICAgLyogQml0IDIgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgLyogU1RCQyAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxTVEJDPD0weDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKHdkLT5zdGEuaHRDdHJsU1RCQzw8MjgpOyAgIC8qIEJJVCAyMyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogU2hvcnQgR0kgKi8KKyAgICAgICAgaWYod2QtPnN0YS5odEN0cmxTRykKKyAgICAgICAgeworICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg4MDAwPDwxNik7ICAgICAgICAgLyogQklUIDMxICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUQSAqLworICAgICAgICBpZiAoICgobWNzID49MHg4KSAmJiAobWNzPD0weGYpKSAgfHwgKHdkLT5zdGEuaHRDdHJsU1RCQykgKQorICAgICAgICB7CisgICAgICAgCSAgICBwaHlDdHJsIHw9IDB4MTgwMDsgICAgICAgICAgICAgICAvKiBCSVQgMTEgMTIgKi8KKyAgICAJfQorICAgIH0KKyAgICBlbHNlIGlmKG10ID09IDEpCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICAvL2J1ZyB0aGF0IGNhdXNlIE9GRE0gcmF0ZSBiZWNvbWUgZHVwbGljYXRlIGxlZ2FjeSByYXRlCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgICAgIG10ID0gMzsgICAgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBsZWdhY3kgKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gbXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYobXQgPT0gMCkKKyAgICB7CisJLyogQ0NLIFBUOiBMZWdjeSBQcmVhbWJsZTogMSBsb25nIHByZWFtYmxlICAgIDIgc2hvcnQgcHJlYW1ibGUgKi8KKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVCkKKyAgICAgICAgeworICAgIAkgICAgICAgLy9waHlDdHJsIHw9IDB4NDsgICAgLyogQklUIDIgKi8KKyAgICAJfQorICAgIH0KKworICAgIC8qIFRBICovCisgICAgaWYgKHdkLT5zdGEuZGVmYXVsdFRBKQorICAgIHsKKyAgICAgICAgcGh5Q3RybCB8PSAweDEwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBoeUN0cmwgfD0gMHgwODAwOworICAgIH0KKworICAgIC8vR2V0IEN1cnJlbnRUeFJhdGUgLS0gQ1dZYW5nKCspCisgICAgaWYgKChtdCA9PSAwKSB8fCAobXQgPT0gMSkpIC8vQixHIFJhdGUKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZUJHW21jc107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobXQgPT0gMikKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVONDBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgNDAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVOMjBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgMjAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vODAyLjExIGhlYWRlcihpbmNsdWRlIElWKSA9IChobGVuPDwxKS04CisgICAgLy9ldGhlcm5ldCBmcmFtZSA9IGxlbgorICAgIC8vc25hcCArIG1pYyA9IHBsdXNMZW4KKyAgICAvL2V0aGVybmV0IGhlYWRlciA9IG1pbnVzTGVuCisgICAgLy9pY3YgPSBpY3ZMZW4KKyAgICAvL2NyYzMyID0gNAorICAgIC8vbGVuZ3RoPTgwMi4xMSBoZWFkZXIrc25hcCsoZXRoZXJuZXQgZnJhbWUtZXRoZXJuZXQgaGVhZGVyKSttaWMraWN2K2NyYzMyCisgICAgaGVhZGVyWzBdID0gKChobGVuPDwxKS04KStwbHVzTGVuKyhsZW4tbWludXNMZW4pK2ljdkxlbis0OyAgLy9MZW5ndGgKKworICAgIC8vIGhlYWRlclswXSA6IE1QRFUgTGVuZ3RocworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSAhPSAweDEpIC8vIFVuaWNhc3QgRnJhbWUKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXJbMF0gPj0gd2QtPnJ0c1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFJUUyAqLworICAgICAgICAgICAgbWFjQ3RybCB8PSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGlmKCB3ZC0+c3RhLkVuYWJsZUhUICE9IDEgKQorICAgIHsgLy8gQWdncmVnYXRpb24gc2hvdWxkIG5vdCBiZSBmcmFnbWVudGVkICEKKyAgICAgICAgaWYgKCBoZWFkZXJbMF0gPiAoIHdkLT5mcmFnVGhyZXNob2xkICsgdGtpcEZyYW1lT2Zmc2V0ICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkICEgIQorICAgICAgICB9CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgIC8veworICAgIC8vICAgIHptX2RlYnVnX21zZzEoImN0cmwgbGVuZ3RoID0gIiwgaGVhZGVyWzBdKTsKKyAgICAvL30KKworICAgIC8vTUFDIGNvbnRyb2wKKyAgICBpZiAocmF0ZVByb2JpbmdGbGFnICE9IDApCisgICAgeworICAgICAgICBtYWNDdHJsIHw9IDB4ODAwMDsKKyAgICB9CisgICAgaGVhZGVyWzFdID0gbWFjQ3RybDsKKyAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbMl0gPSAodTE2X3QpICgocGh5Q3RybCYweGZmZmYpIHwgMHg3MDAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTMpKTsKKyAgICAvL1BIWSBjb250cm9sIEgKKyAgICBoZWFkZXJbM10gPSAodTE2X3QpICgocGh5Q3RybD4+MTYpIHwgMHg3MDApOworCisgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbikKKyAgICB7CisgICAgICAgIC8qIGZvcmNlIGVuYWJsZSBhZ2dyZWdhdGlvbiAqLworICAgICAgICBpZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0yICYmICEoaGVhZGVyWzZdJjB4MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKGhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgaWYgKHdkLT5hZGRiYUNvbXBsZXRlKSB7CisgICAgICAgICNpZmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgICAgIGlmICghKGhlYWRlcls2XSYweDEpICYmICFyYXRlUHJvYmluZ0ZsYWcgJiYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbiAhPSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgc29mdHdhcmUgZW5jcnlwdGlvbiBpbiBzaW5nbGUgcGFja2V0IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9ICgweDIwIHwgKHpjVXBUb0FjW3VwJjB4N108PDEwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNzdWU6IC1QQjQyIEVuYWJsZSBSVFMvQ1RTIHRvIHByZXZlbnQgT1dMIFR4IGhhbmcgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgT3dsIEFwLCBlbmFibGUgUlRTL0NUUyBwcm90ZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmF0aE93bEFwID09IDEpIHx8ICh3ZC0+c3RhLlJUU0luQUdHTW9kZSA9PSBUUlVFKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdICY9IDB4ZmZmYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHgxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUklGUyA6IHdvcmthcm91bmQgODU0VCBSVFMvQ1RTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQxMyA6IFRJIGVuYWJsZSBSSUZTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvL2hlYWRlclsxXSB8PSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgLyoKKyAgICAgICAgICogYWdncmVnYXRpb24gYW1wZHVJbmRpY2F0aW9uIGNvbnRyb2wKKyAgICAgICAgICovCisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChoZWFkZXJbMl0gJiAweDMpID09IDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDIwOworICAgICAgICAgICAgICAgICAgICBpZiAoWk1fQUdHX0xBU1RfTVBEVSA9PSBhZ2dDb250cm9sLT5hbXBkdUluZGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibm8gYWdnciwgaGVhZGVyWzJdJjB4MyA9ICIsaGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24gPSAiLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGhlYWRlcls2XSYweDEpKTsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAjaWZkZWYgWk1fQUdHUl9CSVRfT04KKyAgICAgICAgaWYgKCEoaGVhZGVyWzZdJjB4MSkgJiYgIXJhdGVQcm9iaW5nRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gKDB4MjAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTApKTsKKworICAgICAgICAgICAgICAgIC8vaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUlRTL0NUUyB0byBwcmV2ZW50IE9XTCBUeCBoYW5nIHVwICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSAmPSAweGZmZmM7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIChobGVuPDwxKTsKK30KKworCit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICAvL3UxNl90IGJvZHlMZW47CisgICAgdThfdCAgaGxlbiA9IDMyOyAgICAgICAgLy8gTUFDIGN0cmwgKyBQSFkgY3RybCArIDgwMi4xMSBNTSBoZWFkZXIKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAyNCtsZW4rNDsgICAvL0xlbmd0aAorICAgIGlmICgoZHN0WzBdICYgMHgxKSAhPSAwKSAvL0Jyb2FkY2FzdCwgbXVsdGljYXN0IGZyYW1lcworICAgIHsKKyAgICAgICAgaGVhZGVyWzFdID0gMHhjOyAgICAgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyBub2FjaworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAgICAgLy9NQUMgY29udHJvbCwgYmFja29mZiArIChhY2spCisgICAgfQorICAgIC8qIER1YWxiYW5kIE1hbmFnZW1lbnQgZnJhbWUgdHggUmF0ZSAqLworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICAgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyA2TSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyAyTSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4MGYwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICB9CisgICAgfQorICAgIC8qIEdlbmVyYXRlIFdMQU4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIGhlYWRlcls0KzBdID0gZnJhbWVUeXBlOworICAgIC8qIER1cmF0aW9uICovCisgICAgaGVhZGVyWzQrMV0gPSAwOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQSApIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5zdGEuYnNzaWRbMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzQrOF0gPSAwOworICAgICAgICBoZWFkZXJbNCs5XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzEwXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICBoZWFkZXJbNCs4XSA9IHdkLT5zdGEuYnNzaWRbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPnN0YS5ic3NpZFsyXTsKKworICAgICAgICBpZiAoIGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHB1dCBBVElNIHRvIHF1ZXVlIDV0aCAqLworICAgICAgICAgICAgLy9oZWFkZXJbMl0gfD0gKFpNX0JJVF8xM3xaTV9CSVRfMTQpOworICAgICAgICAgICAgaGVhZGVyWzJdIHw9IFpNX0JJVF8xNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgICAgICAvL2lmIGluIHNjYW4sIG11c3Qgc2V0IGFkZHJlc3MgMyB0byBicm9hZGNhc3QgYmVjYXVzZSBvZiBzb21lIGFwIHdvdWxkIGNhcmUgdGhpcworICAgICAgICAvL2lmICgod2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiAmIFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy8gICAgICAgID09IFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy9pZiBGcmFtZVR5cGUgaXMgUHJvYmUgUmVxdWVzdCwgQWRkcmVzczMgc2hvdWxkIGJlIGJvcmFkY2FzdAorICAgICAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZHJlc3MgMSA9IERBICovCisgICAgaGVhZGVyWzQrMl0gPSBkc3RbMF07CisgICAgaGVhZGVyWzQrM10gPSBkc3RbMV07CisgICAgaGVhZGVyWzQrNF0gPSBkc3RbMl07CisKKyAgICAvKiBBZGRyZXNzIDIgPSBTQSAqLworICAgIGhlYWRlcls0KzVdID0gd2QtPm1hY0FkZHJbMF07CisgICAgaGVhZGVyWzQrNl0gPSB3ZC0+bWFjQWRkclsxXTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXSArICh2YXA8PDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaGVhZGVyWzQrMTFdID0gKCh3ZC0+bW1zZXErKyk8PDQpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCApCisgICAgeworICAgICAgICAvKlFvcyBDb250cm9sKi8KKyAgICAgICAgaGVhZGVyWzQrMTJdID0gMHgwOworICAgICAgICBobGVuKz0yOworICAgICAgICBoZWFkZXJbMF0rPTI7CisgICAgfQorCisgICAgaWYgKCBlbmNyeXB0ICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyWzE2XSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlclsxN10gfD0gKCgodTE2X3QpIHdkLT5zdGEua2V5SWQpIDw8IDE0KTsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbMF0gKz0gODsgICAgICAgICAvLyBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDQwOyAgICAgIC8vIGVuYWJsZSBlbmNyeXB0aW9uIG9uIG1hY0N0cmwKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmFibGUgSFcgZHVyYXRpb24KKyAgICBpZiAoIGZyYW1lVHlwZSAhPSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICkKKyAgICB7CisgICAgICAgIGhlYWRlclsxXSB8PSAweDIwMDsKKyAgICB9CisKKyAgICByZXR1cm4gaGxlbjsKK30KKwordm9pZCB6ZkluaXRNYWNBcE1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0FQLCAod2QtPmJlYWNvbkludGVydmFsL3dkLT5hcC52YXBOdW1iZXIpLCAxLCAwKTsKKworICAgIC8qIEFQIG1vZGUgKi8KKyAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfQVApOworCisgICAgLyogVkFQIHRlc3QgY29kZSAqLworICAgIC8qIEFQICsgVkFQIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLnZhcE51bWJlciA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgod2QtPmFwLmFwQml0bWFwID4+IGkpICYgMHgxKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgICAgICBtYWNbMF0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICAgICAgICAgICAgICBtYWNbMV0gPSB3ZC0+bWFjQWRkclsxXTsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICAgICAgICAgIG1hY1syXSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgICAgICAgICAgbWFjWzJdID0gd2QtPm1hY0FkZHJbMl0gKyAoaTw8OCk7IC8vVkFQCisjZW5kaWYKKyAgICAgICAgICAgICAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgaSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJhc2ljIHJhdGUgc2V0dGluZyAqLworICAgIHpmSHBTZXRCYXNpY1JhdGVTZXQoZGV2LCB3ZC0+YlJhdGVCYXNpYywgd2QtPmdSYXRlQmFzaWMpOworCisgICAgLyogU2V0IFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIEFQIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmQ2hHZXROZXh0Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGk7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSA9PSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQtMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkNoR2V0Rmlyc3RDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFswXS5jaGFubmVsRmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbMF0uY2hhbm5lbDsKK30KKwordTE2X3QgemZDaEdldEZpcnN0MkdoekNoYW5uZWwoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKCBpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPCAzMDAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgMkdoeiBjaGFubmVsICovCisgICAgICAgICAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbiBub3QgZmluZCBhbnkgMkdoeiBjaGFubmVsICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgdGhlIGZpcnN0IDVHaHogY2hhbm5lbCAqLworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYW4gbm90IGZpbmQgYW55IDVHaHogY2hhbm5lbCAqLworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSkKK3sKKyAgICB1OF90ICAgYlBhc3NpdmU7CisgICAgdThfdCAgIENoYW5uZWxJbmRleDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIENoYW5uZWxJbmRleCA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250LTE7CisKKyAgICAvKiBBdm9pZCBOVUxMIHZhbHVlICovCisgICAgaWYgKCBwYlBhc3NpdmUgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYlBhc3NpdmUgPSAmYlBhc3NpdmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtDaGFubmVsSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbQ2hhbm5lbEluZGV4XS5jaGFubmVsOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKyAgICB1MTZfdCAgIGxhc3Q1R2h6ZnJlcXVlbmN5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGFzdDVHaHpmcmVxdWVuY3kgPSAwOworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3Q1R2h6ZnJlcXVlbmN5ID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0NUdoemZyZXF1ZW5jeTsKK30KKworLyogZnJlcUJhbmQgPSAwID0+IGF1dG8gY2hlY2sgICAqLworLyogICAgICAgICAgPSAxID0+IDIuNCBHSHogYmFuZCAqLworLyogICAgICAgICAgPSAyID0+IDUgR0h6IGJhbmQgICAqLwordTE2X3QgemZDaE51bVRvRnJlcSh6ZGV2X3QqIGRldiwgdThfdCBjaCwgdThfdCBmcmVxQmFuZCkKK3sKKyAgICB1MTZfdCBmcmVxID0gMHhmZmZmOworCisgICAgaWYgKCBmcmVxQmFuZCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmIChjaCA+IDE0KQorICAgICAgICB7ICAgLyogYWRhcHRlciBpcyBhdCA1IEdIeiBiYW5kICovCisgICAgICAgICAgICBmcmVxQmFuZCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxQmFuZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZyZXFCYW5kID09IDIgKQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDUgR0h6IGJhbmQgKi8KKyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNDAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNTAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDIuNCBHSHogYmFuZCAqLworICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcSA9IFpNX0NIX0dfMTQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gWk1fQ0hfR18xICsgKGNoLTEpKjU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJlcTsKK30KKwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIHBiSXM1R0JhbmQpCit7CisgICAgdThfdCAgIGNoOworICAgIHU4X3QgICBJczVHQmFuZDsKKworICAgIC8qIHRvIGF2b2lkIE5VTEwgdmFsdWUgKi8KKyAgICBpZiAoIHBiSXM1R0JhbmQgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYklzNUdCYW5kID0gJklzNUdCYW5kOworICAgIH0KKworICAgICpwYklzNUdCYW5kID0gRkFMU0U7CisKKyAgICBpZiAoIGZyZXEgPT0gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICBjaCA9IDE0OworICAgIH0KKyAgICBlbHNlIGlmICggZnJlcSA8IDQwMDAgKQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIFpNX0NIX0dfMSkgLyA1ICsgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZyZXEgPCA1MDAwICkKKyAgICB7CisgICAgICAgIGNoID0gKGZyZXEgLSA0MDAwKSAvIDU7CisgICAgICAgICpwYklzNUdCYW5kID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIDUwMDApIC8gNTsKKyAgICAgICAgKnBiSXM1R0JhbmQgPSBUUlVFOworICAgIH0KKworICAgIHJldHVybiBjaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0wLDAgKzEsMjE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgorCisvKiBUT0RPIDogcHV0IGFsbCBjb25zdGFudCB0YWJsZXMgdG8gYSBmaWxlICovCitjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9OworY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOH07CisKKy8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLworY29uc3QgdThfdCB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtdID0KK3sKKyAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KKyAgICA2LCAgICAgIC8qICAxIDogYXNvYyByc3AgKi8KKyAgICAxMCwgICAgIC8qICAyIDogcmVhc29jIHJlcSovCisgICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KKyAgICAwLCAgICAgIC8qICA0IDogcHJvYmUgcmVxICovCisgICAgMTIsICAgICAvKiAgNSA6IHByb2JlIHJzcCAqLworICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogIDcgOiByZXNlcnZlZCAqLworICAgIDEyLCAgICAgLyogIDggOiBiZWFjb24gKi8KKyAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLworICAgIDB4ZmYsICAgLyogMTAgOiBkaXNhc29jICovCisgICAgNiwgICAgICAvKiAxMSA6IGF1dGggKi8KKyAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCisgICAgNCwgICAgICAvKiAxMyA6IGFjdGlvbiAqLworICAgIDB4ZmYsICAgLyogMTQgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZEVsZW1lbnQgICAgICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVpZCA6IHRhcmdldCBlbGVtZW50IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ5dGUgb2Zmc2V0IG9mIHRhcmdldCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZCwgSFRFaWQ9MDsKKyAgICB1OF90IG91aVs0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKKyAgICB1OF90IG91aTExblszXSA9IHsweDAwLDB4OTAsMHg0Q307CisgICAgdThfdCBIVFR5cGUgPSAwOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICAvLyBqaGxlZSBIVCAwCisKKyAgICBpZiAoKGVpZCA9PSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8fAorICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQorICAgIHsKKyAgICAgICAgSFRFaWQgPSBlaWQ7CisgICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKKyAgICAgICAgSFRUeXBlID0gMTsKKyAgICB9CisKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCAmJiBlaWQgIT0gWk1fV0xBTl9FSURfU1NJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWlkID09IFpNX1dMQU5fRUlEX1dQQV9JRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkgJiYgemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIG91aSwgb2Zmc2V0KzIsIDQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgICAgIC8vIENXWWFuZygrKQorCisgICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpID09IEhURWlkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIDU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgICNpZiAxCisgICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZFdpZmlFbGVtZW50ICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiBPVUkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3IgMHhmZmZmIGlmIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRmluZFdpZmlFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4NTApCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSkgPT0gdHlwZSkpCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnR5cGUgIT0gMHhmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpID09IHN1YnR5cGUgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZlJlbW92ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCBlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgIEhURWlkID0gMDsKKyAgICB1OF90ICBvdWlbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CisgICAgdThfdCAgb3VpMTFuWzNdID0gezB4MDAsMHg5MCwweDRDfTsKKyAgICB1OF90ICBIVFR5cGUgPSAwOworCisgICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKKyAgICAgICAgKGVpZCA9PSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkKKyAgICB7CisgICAgICAgIEhURWlkID0gZWlkOworICAgICAgICBlaWQgPSBaTV9XTEFOX0VJRF9XUEFfSUU7CisgICAgICAgIEhUVHlwZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpCisgICAgeworICAgICAgICBlbGVuID0gKihidWYrb2Zmc2V0KzEpOworCisgICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpWzBdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWlbMV0pCisgICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzQpID09IG91aVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gb3VpWzNdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aTExblswXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWkxMW5bMV0pCisgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpMTFuWzJdKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IEhURWlkKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3UxNl90IHpmVXBkYXRlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90KiB1cGRhdGVlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgZWxlbiA9ICooYnVmK29mZnNldCsxKTsKKworICAgICAgICBpZiAoKihidWYrb2Zmc2V0KSA9PSB1cGRhdGVlaWRbMF0pIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVlaWRbMV0gPD0gZWxlbikgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS0oZWxlbi11cGRhdGVlaWRbMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIHVwZGF0ZWVpZCwgdXBkYXRlZWlkWzFdKzIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUrKHVwZGF0ZWVpZFsxXS1lbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKwordTE2X3QgemZGaW5kU3VwZXJHRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCBzdXBlcl9mZWF0dXJlOworICAgIHU4X3Qgb3VpU3VwZXJHWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDEsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWlTdXBlckcsIG9mZnNldCsyLCA2KSAmJiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSA+PSA2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBlcl9mZWF0dXJlIDA6dXNlRmFzdEZyYW1lLCAxOnVzZUNvbXByZXNzaW9uLCAyOnVzZVR1cmJvUHJpbWUgKi8KKyAgICAgICAgICAgICAgICBzdXBlcl9mZWF0dXJlPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKChzdXBlcl9mZWF0dXJlICYgMHgwMSkgfHwgKHN1cGVyX2ZlYXR1cmUgJiAweDAyKSB8fCAoc3VwZXJfZmVhdHVyZSAmIDB4MDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IG91aXhyWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDMsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVN1cHBvcnRSYXRlICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTdXBwb3J0IFJhdGUgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICBlaWQgOiBlbGVtZW50IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQoreworICAgIHU4X3QgbGVuID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy9pZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gb2Zmc2V0OworICAgIC8vfQorCisgICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KKyAgICBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfQ0NLICkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YlJhdGUgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrbGVuKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgLy9pZiAoKDB4ZmYgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZzExZ1JhdGVUYmxbaV0rKCh3ZC0+Z1JhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpKTsKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBJRCAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCBlaWQpOworCisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrMSwgbGVuKTsKKworICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgb2Zmc2V0ICs9ICgyK2xlbik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBEUyB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9EUyk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IERTICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllRXJwICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZUVycCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9FUlApOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOworCisgICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5lcnBFbGVtZW50KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBXUEEgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgaW50IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgLy96bXdfaW50dHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAud3BhTGVuKTsKKyAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCisgICAgeworICAgICAgICAvKiBJbmZvcm1hdGlvbiA6IFdQQSAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRIVENhcGFiaWxpdHkgICAgICAgICAqLworLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBQcm9iIElEICovCisgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQpOworCisgICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKK3UxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIC8vdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkgICAqLworLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuQnl0ZVtpKzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCisvKiAgICAgIFNlbmQgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmcmFtZVR5cGUgOiBtYW5hZ2VtZW50IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHAxIDogcGFyYW1ldGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwMiA6IHBhcmFtZXRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwcm9iZSByc3AgOiBwMT0+UiwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZGVhdXRoIDogcDE9PlJlYXNvbiBDb2RlLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCisvKiBBVElNIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHJlKWFzb2MgcnNwIDogcDE9PlN0YXR1cyBDb2RlLCBwMj0+QUlELCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgKi8KKy8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZWFzb2MgcmVxIDogcDE9PkFQIE1BQ1swXSwgcDI9PkFQIE1BQ1sxXSwgcDM9PkFQIE1BQ1syXSAgICAgICAgICAgICAqLworLyogYXV0aCA6IHAxPT5sb3c9QWxnb3JpdGhtLCBoaWdoPVRyYW5zYWN0aW9uLCBwMj0+U3RhdHVzLCBwMz0+VkFQIElEICAgKi8KK3ZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgdTMyX3QgcDEsIHUzMl90IHAyLCB1MzJfdCBwMykKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IG9mZnNldCA9IDA7CisgICAgdTE2X3QgaGxlbiA9IDMyOworICAgIHUxNl90IGhlYWRlclsoMjQrMjUrMSkvMl07CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZW5jcnlwdCA9IDA7CisgICAgdTE2X3QgYWlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJTZW5kIG1tIGZyYW1lLCB0eXBlPSIsIGZyYW1lVHlwZSk7CisgICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnbWVudCBmcmFtZSAqLworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9SZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIHN3aXRjaCAoZnJhbWVUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgb2Zmc2V0ID0gemZTZW5kUHJvYmVSZXEoZGV2LCBidWYsIG9mZnNldCwgKHU4X3QpIHAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJzcCIpOworICAgICAgICAgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIFdPTidUIGZpbGwgdGhpcyBmaWVsZCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzIsIDApOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCs0LCAwKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgICAgICAgICBvZmZzZXQrPTg7CisKKyAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5hcC5jYXBhYlt2YXBdKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CisgICAgICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0pOworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKTsKKyAgICAgICAgICAgICAgICAvKiBTU0lEICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogVE9ETyChRyBJQlNTICovCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5lcnBFbGVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIEcgTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisJCWlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCisgICAgICAgICAgICAvKiBUT0RPIDogUlNOICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgJiYgd2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVdwYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgJiYgd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5xb3NNb2RlID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogTmVlZCB0byBjaGVjayBpZiBpdCBpcyBvayAqLworICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIIDoKKyAgICAgICAgICAgIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgICAgICAgIC8vIGZvciByZXNlcnZpbmcgd2VwIGhlYWRlcgorICAgICAgICAgICAgICAgIGVuY3J5cHQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGdvdHJpdGhtIE51bWJlciAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMSYweGZmZmYpKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gTnVtYmVyICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxPj4xNikpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAyKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoYWxsZW5nZSBUZXh0ID0+IHNoYXJlLTIgb3Igc2hhcmUtMyAqLworICAgICAgICAgICAgaWYgKHAxID09IDB4MjAwMDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAyID09IDApIC8vU3RhdHVzID09IHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ODAxMCk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUtMiA6IEFQIGdlbmVyYXRlIGNoYWxsZW5nZSB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuY2hhbGxlbmdlVGV4dFtpXSA9ICh1OF90KXpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNoYXJlLTMgOiBTVEEgcmV0dXJuIGNoYWxsZW5nZSBUZXh0ICovCisgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSA6CisgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAgICAgICAgIC8qIExpc3RlbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDA1KTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogUmVhc3NvY2FpdGVkIFJlcXVlc3QgOiBDdXJyZW50IEFQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMV0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMl0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gJiBaTV9CSVRfMCkgPT0gMSkKKyAgICAgICAgICAgIHsgICAvL3NwZWN0cnVtIG1hbmFnbWVudCBmbGFnIGVuYWJsZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVQb3dlckNhcChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3VwcG9ydENoKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL29mZnNldCA9IHpmU3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKKyAgICAgICAgICAgIC8vTW92ZSB0byB3cmFwcGVyIGZ1bmN0aW9uLCBmb3IgT1MgZGlmZmVyZW5jZS0tQ1dZYW5nKG0pCisgICAgICAgICAgICAvL2ZvciB3aW5kb3dzIHdyYXBwZXIsIHpmd1N0YUFkZEllV3BhUnNuKCkgc2hvdWxkIGJlIGJlbG93OgorICAgICAgICAgICAgLy91MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB6ZlN0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIG9mZnNldCA9IHpmd1N0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgLyogQ0VOQyAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVDZW5jKGRldiwgYnVmLCBvZmZzZXQpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmICgoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCkgIT0gMCkgLy9XTUUgZW5hYmxlZAorICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEuYXBXbWVDYXBhYmlsaXR5ICYgMHgxKSAhPSAwKSkgLy9XTUUgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLmFwV21lQ2FwYWJpbGl0eSAmIDB4ODApICE9IDApIC8vVUFQU0QgQVAKKyAgICAgICAgICAgICAgICAgJiYgKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCkgIT0gMCkpIC8vVUFQU0QgZW5hYmxlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS53bWVRb3NJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgOEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9NYXhBTVNEVUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgNEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gfkhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSAmPSB+SFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVxdWVzdCBmcmFtZSBib2R5LCBmb3IgVklTVEEgb25seQorICAgICAgICAgICAgd2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZSA9ICgob2Zmc2V0IC0gaGxlbikgPgorICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpPworICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU6KG9mZnNldCAtIGhsZW4pOworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVtpXSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkgKyBobGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKKworICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAxKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogQUlEICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAyfDB4YzAwMCkpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisKKyAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IGlmIFdNRSBTVEEgdGhlbiBzZW5kIFdNRSBwYXJhbWV0ZXIgZWxlbWVudCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAucW9zTW9kZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllV21lUGFyYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGpobGVlIEhUIDAKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSA6CisgICAgICAgICAgICAvKiBOVUxMIGZyYW1lICovCisgICAgICAgICAgICAvKiBUT0RPIDogYWRkIHR3byBkdW1iIGJ5dGVzIHRlbXBvcmFyaWx5ICovCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1FPU19OVUxMIDoKKyAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAxMCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9EQVRBX0ZSQU1FIDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOworCisgICAgICAgICAgICAgIGlmICgoYWlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAvKiBDbGVhciBTVEEgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKworICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiRGlzQXNvY05vdGlmeShkZXYsICh1OF90Kilkc3QsIHZhcCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDEpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm1hbmFnZW1lbnQgZnJhbWUgYm9keSBzaXplPSIsIG9mZnNldC1obGVuKTsKKworICAgIC8vQ29weSB3bGFuIGhlYWRlcgorICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIGZyYW1lVHlwZSwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm47CisjaWYgMAoremxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybjsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKSAvL0NXWWFuZyhtKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHRhWzNdOworICAgIHUxNl90IHJhWzNdOworICAgIHUxNl90IHZhcCA9IDAsIGluZGV4ID0gMDsKKyAgICAvL3UxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIHJhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgcmFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKworICAgIHRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgIHRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmIDEKKyAgICAgICAgdmFwID0gMDsKKyAgICAgICAgaWYgKChyYVswXSAmIDB4MSkgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgOiBGaW5kIHZpcnR1YWwgQVAgKi8KKyAgICAgICAgICAgIGlmICgoaW5kZXggPSB6ZkFwRmluZFN0YShkZXYsIHRhKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udmFwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMiwgInZhcD0iLCB2YXApOworI2VuZGlmCisKKyAgICAgICAgLyogRGlzcGF0Y2ggYnkgZnJhbWUgdHlwZSAqLworICAgICAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0JlYWNvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXV0aChkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXNvY1JlcShkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICAgICAgICAgIC8vemZBcFByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGVhdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEaXNhc3NvY2lhdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CisgICAgICAgICAgICAgICAgemZBcFByb2Nlc3NEaXNhc29jKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSA6CisgICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvL2lmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHx8ICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKSkKKyAgICB7CisgICAgICAgIC8qIERpc3BhdGNoIGJ5IGZyYW1lIHR5cGUgKi8KKyAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLworICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJj0gfihaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAmIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0JlYWNvbihkZXYsIGJ1ZiwgQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIC8qIFRPRE8gOiB2YXAgcGFyYW1ldGVyIGlzIHVzZWxlc3MgaW4gU1RBIG1vZGUsIGdldCByaWQgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHZhcCBwYXJhbWV0ZXIgaXMgdXNlbGVzcyBpbiBTVEEgbW9kZSwgZ2V0IHJpZCBvZiBpdCAqLworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoZGV2LCBidWYsIHRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIERlYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCA6CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0RlYXV0aChkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2Fzc29jaWF0aW9uIHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxKGRldiwgYnVmLCB0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFuZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIHByb2JlIHJlc3BvbnNlIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU06CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQXRpbShkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQWN0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgorICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgIlByb2Nlc3NBY3Rpb25NZ3RGcmFtZSIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJlcSAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUHJvY2Vzc1Byb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYykKK3sKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdThfdCBsZW47CisgICAgdTE2X3QgaSwgajsKKyAgICB1OF90IGNoOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiUGFja2V0cyBkcm9wcGVkIGR1ZSB0byBkaXNjb25uZWN0IHN0YXRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCAwLCAwLCAwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJlcSBTU0lEIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPmFwLmFwQml0bWFwICYgKDE8PGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5oaWRlU3NpZFtpXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyK2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW5kRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbmRGbGFnID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2VuZCBwcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AsIHNyYywgaSwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJzcCAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXNwb25zZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFkZEluZm8gOiBSeCBIZWFkZXIgYW5kIFJ4IE1hYyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBBcmVzcyBZYW5nICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiBHYXRoZXIgc2NhbiByZXN1bHQgKi8KKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKiAgcFByb2JlUnNwSGVhZGVyOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvOworICAgIHU4X3QgICBwQnVmW3NpemVvZihzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlcildOworICAgIGludCAgICByZXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIpKTsKKyAgICBwUHJvYmVSc3BIZWFkZXIgPSAoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyKTsKKworICAgIC8vaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgaWYgKCBwQnNzSW5mbyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5IGlmIEJTUyBub3QgaW4gdGhlIHNjYW4gbGlzdCAqLworICAgICAgICBwQnNzSW5mbyA9IHpmQnNzSW5mb0FsbG9jYXRlKGRldik7CisgICAgICAgIGlmIChwQnNzSW5mbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUluaXRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyLCBwQnNzSW5mbywgQWRkSW5mbywgMSk7CisgICAgICAgIGlmIChyZXMgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZCc3NJbmZvUmVtb3ZlRnJvbUxpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeDsKKworICAgICAgICAgICAgLy8gSXQgd291bGQgcmVzZXQgdGhlIGFsaXZlIGNvdW50ZXIgaWYgdGhlIHBlZXIgc3RhdGlvbiBpcyBmb3VuZCEKKyAgICAgICAgICAgIHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsICh1MTZfdCAqKXBCc3NJbmZvLT5tYWNhZGRyLCAmaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNlbmRQcm9iZVJlcSAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UxNl90IHpmU2VuZFByb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGJXaXRoU1NJRCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyogU1NJRCAqLworICAgIGlmIChiV2l0aFNTSUQgPT0gMCkgIC8qIGJyb2FkY2FzdCBzc2lkICovCisgICAgeworICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsgICAvKiBsZW5ndGggPSAwICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuKTsKKyAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7IC8qIHNzaWQgKi8KKyAgICAgICAgICAgIG9mZnNldCArPSB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLyogU3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICB7ICAgLyogODAyLjExYitnICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPndmYy5iSWJzc0dNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIDgwMi4xMWEgKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIGRlZmF1bHQgdmFsdWUuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1vZGUgOiAwPT5TVEEsIDE9PkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXBkYXRlRGVmYXVsdFFvc1BhcmFtZXRlcih6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHUxNl90IGN3bWluWzVdOworICAgIHUxNl90IGN3bWF4WzVdOworICAgIHUxNl90IGFpZnNbNV07CisgICAgdTE2X3QgdHhvcFs1XTsKKworICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIFNUQSAqLworICAgIC8qIEJlc3QgRWZmb3IgKi8KKyAgICBjd21pblswXSA9IDE1OworICAgIGN3bWF4WzBdID0gMTAyMzsKKyAgICBhaWZzWzBdID0gMyAqIDkgKyAxMDsKKyAgICB0eG9wWzBdID0gMDsKKyAgICAvKiBCYWNrIEdyb3VuZCAqLworICAgIGN3bWluWzFdID0gMTU7CisgICAgY3dtYXhbMV0gPSAxMDIzOworICAgIGFpZnNbMV0gPSA3ICogOSArIDEwOworICAgIHR4b3BbMV0gPSAwOworICAgIC8qIFZJREVPICovCisgICAgY3dtaW5bMl0gPSA3OworICAgIGN3bWF4WzJdID0gMTU7CisgICAgYWlmc1syXSA9IDIgKiA5ICsgMTA7CisgICAgdHhvcFsyXSA9IDk0OworICAgIC8qIFZPSUNFICovCisgICAgY3dtaW5bM10gPSAzOworICAgIGN3bWF4WzNdID0gNzsKKyAgICBhaWZzWzNdID0gMiAqIDkgKyAxMDsKKyAgICB0eG9wWzNdID0gNDc7CisgICAgLyogU3BlY2lhbCBUeFEgKi8KKyAgICBjd21pbls0XSA9IDM7CisgICAgY3dtYXhbNF0gPSA3OworICAgIGFpZnNbNF0gPSAyICogOSArIDEwOworICAgIHR4b3BbNF0gPSAwOworCisgICAgLyogV01NIHBhcmFtZXRlciBmb3IgQVAgKi8KKyAgICBpZiAobW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgY3dtYXhbMF0gPSA2MzsKKyAgICAgICAgYWlmc1szXSA9IDEgKiA5ICsgMTA7CisgICAgICAgIGFpZnNbNF0gPSAxICogOSArIDEwOworICAgIH0KKyAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKK30KKwordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgwMykKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPT0gc3VidHlwZSAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4MTgpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHg1MCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSAweDdGKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaW5nbyAqLworICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRNYXJ2ZWxFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IHRtcDsKKworICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLworICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CisKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQorICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmRmluZEJyb2FkY29tRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MTApCisgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDE4KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIDB4ZmZmZjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwOWZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgQVAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjW107CisKK3ZvaWQgemZNbUFwVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgdTMyX3Qgbm93OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgid2QtPndsYW5Nb2RlIDogIiwgd2QtPndsYW5Nb2RlKTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiA9PiBldmVyeSAxLjI4IHNlY29uZHMgKi8KKyAgICAgICAgLyogQVAgOiBhZ2luZyBTVEEgdGhhdCBkb2VzIG5vdCBhY3RpdmUgZm9yIHdkLT5hcC5zdGFBZ2luZ1RpbWUgICAgKi8KKyAgICAgICAgbm93ID0gd2QtPnRpY2sgJiAweDdmOworICAgICAgICBpZiAobm93ID09IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZBcEFnaW5nU3RhKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm93ID09IDB4MWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmUXVldWVBZ2UoZGV2LCB3ZC0+YXAudWFwc2RRLCB3ZC0+dGljaywgMTAwMDApOworICAgICAgICB9CisgICAgICAgIC8qIEFQIDogY2hlY2sgKHdkLT5hcC5wcm90ZWN0ZWRPYnNzKSBhbmQgKHdkLT5hcC5iU3RhQXNzb2NpYXRlZCkgICovCisgICAgICAgIC8qICAgICAgdG8gZW5hYmxlIE5vbkVycCBhbmQgUHJvdGVjdGlvbiBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKG5vdyA9PSAweDNmKQorICAgICAgICB7CisgICAgICAgICAgICAvL3pmQXBQcm90Y3Rpb25Nb25pdG9yKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwSW5pdFN0YVRibCAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW5pdCBBUCdzIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEluaXRTdGFUYmwoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF0gPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclsxXSA9IDA7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFwID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmluZFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmluZCBhIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBUYXJnZXQgU1RBIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEZpbmRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclswXSA9PSBhZGRyWzBdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV0gPT0gYWRkclsxXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID09IGFkZHJbMl0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmQXBHZXRTVEFJbmZvKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLCB1OF90KiB2YXApCit7CisgICAgdTE2X3QgaWQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqdmFwID0gd2QtPmFwLnN0YVRhYmxlW2lkXS52YXA7CisgICAgICAgICpzdGF0ZSA9IHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5zdGF0ZTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGlkOworfQorCisKK3ZvaWQgemZBcEdldFN0YVFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1OF90KiBxb3NUeXBlKQoreworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QqIHBoeUN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QqIHFvc1R5cGUsIHUxNl90KiByY1Byb2JpbmdGbGFnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgcmF0ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCl6ZlJhdGVDdHJsR2V0VHhSYXRlKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpZF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgICAgICAvL3JhdGUgPSAxNTsKKyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICAvL2hlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICAvL2hlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgICAgICAqcGh5Q3RybCA9IDB4MDAwMDBGMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIC8vaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIC8vaGVhZGVyWzNdID0gMHgwMDBCOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgICAgICpwaHlDdHJsID0gMHgwMDBCMEYwMTsKKyAgICAgICAgfQorICAgICAgICAqcW9zVHlwZSA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIlBoeUN0cmw9IiwgKnBoeUN0cmwpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKmVuY3J5VHlwZSA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqZW5jcnlUeXBlID0gWk1fTk9fV0VQOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJlbmN5clR5cGU9IiwgKmVuY3J5VHlwZSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFXcGFJdih6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90KiBpdjE2LCB1MzJfdCogaXYzMikKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICppdjE2ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2OworICAgICAgICAqaXYzMiA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uaXYzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKml2MTYgPSAwOworICAgICAgICAqaXYzMiA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MTY9IiwgKml2MTYpOworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MzI9IiwgKml2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0U3RhV3BhSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBpdjE2LCB1MzJfdCBpdjMyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2ID0gaXYxNjsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gaXYzMjsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8zLCAiaXYxNj0iLCBpdjE2KTsKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJpdjMyPSIsIGl2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwQ2xlYXJTdGFLZXkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGJjQWRkclszXSA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCopYmNBZGRyLCAodThfdCopYWRkciwgc2l6ZW9mKGJjQWRkcikpID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBUdXJuIG9mZiBncm91cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAvLyAgICB6ZkNsZWFyS2V5KGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBTVEEncyBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBpZCsxKTsKKworICAgICAgICAgICAgLyogVXBkYXRlIFNUQSdzIEVuY3J5cHRpb24gVHlwZSAqLworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJDYW4ndCBmaW5kIFNUQSBhZGRyZXNzXG4iKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsIHU4X3QgKmtleUlkeCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqaXYrKyA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlswXTsKKyAgICAgICAgKml2KysgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMV07CisgICAgICAgICppdisrID0gd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdOworICAgICAgICAqaXYgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbM107CisgICAgICAgICprZXlJZHggPSB3ZC0+YXAuc3RhVGFibGVbaWRdLmNlbmNLZXlJZHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICppdisrID0gMHg1YzM2NWMzNzsKKyAgICAgICAgKml2KysgPSAweDVjMzY1YzM2OworICAgICAgICAqaXYrKyA9IDB4NWMzNjVjMzY7CisgICAgICAgICppdiA9IDB4NWMzNjVjMzY7CisgICAgICAgICprZXlJZHggPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgdTE2X3QgaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gKml2Kys7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlsxXSA9ICppdisrOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMl0gPSAqaXYrKzsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gKml2OworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmx1c2hCdWZmZXJlZFBzRnJhbWUgICAgKi8KKy8qICAgICAgRnJlZSBidWZmZXJlZCBQUyBmcmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGVtcHR5RmxhZzsKKyAgICB1MTZfdCBmcmVlQ291bnQ7CisgICAgdTE2X3QgdmFwOworICAgIHpidWZfdCogcHNCdWYgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZnJlZUNvdW50ID0gMDsKKyAgICBlbXB0eUZsYWcgPSAwOworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPmFwLnVuaUhlYWQgIT0gd2QtPmFwLnVuaVRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLnVuaUFycmF5W3dkLT5hcC51bmlIZWFkXTsKKyAgICAgICAgICAgIHdkLT5hcC51bmlIZWFkID0gKHdkLT5hcC51bmlIZWFkICsgMSkgJiAoWk1fVU5JX0FSUkFZX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtcHR5RmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCBaTV9FUlJfRkxVU0hfUFNfUVVFVUUpOworICAgICAgICB9CisgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9VTklfQVJSQVlfU0laRSoyKSk7CisKKyAgICAgICAgaWYgKGVtcHR5RmxhZyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFwPTA7IHZhcDxaTV9NQVhfQVBfU1VQUE9SVDsgdmFwKyspCisgICAgeworICAgICAgICBmcmVlQ291bnQgPSAwOworICAgICAgICBlbXB0eUZsYWcgPSAwOworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuYmNtY0hlYWRbdmFwXSAhPSB3ZC0+YXAuYmNtY1RhaWxbdmFwXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc0J1ZiA9IHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY0hlYWRbdmFwXV07CisgICAgICAgICAgICAgICAgd2QtPmFwLmJjbWNIZWFkW3ZhcF0gPSAod2QtPmFwLmJjbWNIZWFkW3ZhcF0gKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1wdHlGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9CQ01DX0FSUkFZX1NJWkUqMikpOworCisgICAgICAgICAgICBpZiAoZW1wdHlGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBhZGRyWzNdOworICAgIHUxNl90IHZhcCA9IDA7CisgICAgdThfdCB1cDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHU4X3QgYWM7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChwb3J0IDwgWk1fTUFYX0FQX1NVUFBPUlQpCisgICAgeworICAgICAgICB2YXAgPSBwb3J0OworICAgIH0KKworICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICBhZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgaWYgKChhZGRyWzBdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVBvd2VyU2F2aW5nID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogQnVmZmVyIHRoaXMgQkMgb3IgTUMgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICgoKHdkLT5hcC5iY21jVGFpbFt2YXBdKzEpJihaTV9CQ01DX0FSUkFZX1NJWkUtMSkpCisgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY1RhaWxbdmFwXSsrXSA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY1RhaWxbdmFwXSAmPSAoWk1fQkNNQ19BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzAsICJCdWZmZXIgQkNNQyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGJjbWNBcnJheSBmdWxsICovCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHptX21zZzBfdHgoWk1fTFZfMCwgIkJDTUMgYnVmZmVyIGZ1bGwiKTsKKworICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSA9PSAxKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgICAgICAgICAgICAgYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGUgPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvICYgKDB4OD4+YWMpKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmUXVldWVQdXROY3MoZGV2LCB3ZC0+YXAudWFwc2RRLCBidWYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBaTV9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfQVBfVUFQU0RfUVVFVUVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgdGhpcyB1bmljYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgaWYgKCgod2QtPmFwLnVuaVRhaWwrMSkmKFpNX1VOSV9BUlJBWV9TSVpFLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnVuaUhlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudW5pQXJyYXlbd2QtPmFwLnVuaVRhaWwrK10gPSBidWY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC51bmlUYWlsICY9IChaTV9VTklfQVJSQVlfU0laRS0xKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiQnVmZmVyIFVOSSIpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHVuaUFycmF5IGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiVU5JIGJ1ZmZlciBmdWxsIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfVU5JX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gLyogaWYgKHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5wc01vZGUgPT0gMSkgKi8KKyAgICAgICAgfSAvKiBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKSAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFwR2V0U1RBSW5mb0FuZFVwZGF0ZVBzKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90KiB2YXAsIHUxNl90IHBzTW9kZSwgdThfdCogdWFwc2RUcmlnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgdWFwc2RTdGFBd2FrZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLy9wc01vZGU9MDsKKyNlbmRpZgorCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGlmIChwc01vZGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAicHNNb2RlID0gMSIpOworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucHNNb2RlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVBvd2VyU2F2aW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiVUFQU0QgdHJpZ2dlciIpOworICAgICAgICAgICAgICAgICAgICAqdWFwc2RUcmlnID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZy0tOworICAgICAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlID09IDEpICYmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvJjB4ZikhPTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWFwc2RTdGFBd2FrZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgPSAodThfdCkgcHNNb2RlOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnRpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgKnZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udmFwOworICAgICAgICAqc3RhdGUgPSB3ZC0+YXAuc3RhVGFibGVbaWQrK10uc3RhdGU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh1YXBzZFN0YUF3YWtlID09IDEpCisgICAgeworICAgICAgICB6YnVmX3QqIHBzQnVmOworICAgICAgICB1OF90IG1iOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBzQnVmID0gemZRdWV1ZUdldFdpdGhNYWMoZGV2LCB3ZC0+YXAudWFwc2RRLCAodThfdCopYWRkciwgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEdldE5ld1N0YSAgICAgICAgICAgICAgICovCisvKiAgICAgIEdldCBhIG5ldyBTVEEgZnJvbSBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEdldE5ld1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgInpmQXBHZXROZXdTdGE9IiwgaSk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkU3RhICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGEgU1RBIHRvIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTVEEgTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0ZSA6IFNUQSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYXBJZCA6IFZpcnR1YWwgQVAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBPdGhlciA6IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXRlLCB1MTZfdCBhcElkLCB1OF90IHR5cGUsCisgICAgICAgICAgICAgICAgIHU4X3QgcW9zVHlwZSwgdThfdCBxb3NJbmZvKQoreworICAgIHUxNl90IGluZGV4OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiU1RBIHR5cGU9IiwgdHlwZSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpbmRleCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgImZvdW5kIik7CisgICAgICAgIC8qIFVwZGF0ZSBTVEEgc3RhdGUgKi8KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFpNX1NUQVRFX0FTT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSkKKyAgICAgICAgICAgICAgICAgICAgLy8mJiAod2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPT0gYXBJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0ucW9zVHlwZSA9IHFvc1R5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5xb3NJbmZvID0gcW9zSW5mbzsKKworICAgICAgICAgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgMTFiL2cgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdCAxMWEgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBcENvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXBDb25uZWN0Tm90aWZ5KGRldiwgKHU4X3QqKWFkZHIsIGFwSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzIsICJOb3QgZm91bmQiKTsKKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBhIG5ldyBTVEEgYW5kIHVwZGF0ZSBzdGF0ZSAqLworICAgICAgICAgICAgaW5kZXggPSB6ZkFwR2V0TmV3U3RhKGRldik7CisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzEsICJuZXcgU1RBIGluZGV4PSIsIGluZGV4KTsKKworICAgICAgICAgICAgaWYgKGluZGV4ICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLmFkZHJbaV0gPSBhZGRyW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS50aW1lID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEFnaW5nU3RhICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFnaW5nIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG51bWJlciBvZiAxMWIgU1RBIGluIFNUQSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBBZ2luZ1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IGRlbHRhTXM7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCB0eEZsYWc7CisgICAgdTE2X3QgcHNTdGFDb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgd2QtPmFwLmdTdGFBc3NvY2lhdGVkID0gd2QtPmFwLmJTdGFBc3NvY2lhdGVkID0gMDsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgdHhGbGFnID0gMDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyWzBdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF07CisgICAgICAgICAgICBhZGRyWzFdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV07CisgICAgICAgICAgICBhZGRyWzJdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMl07CisgICAgICAgICAgICAvKiBtaWxsaXNlY29uZCAqLworICAgICAgICAgICAgZGVsdGFNcyA9ICh1MzJfdCkoKHUzMl90KXdkLT50aWNrLSh1MzJfdCl3ZC0+YXAuc3RhVGFibGVbaV0udGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAqIFpNX01TX1BFUl9USUNLOworCisgICAgICAgICAgICAvKiBwcmVhdXRoICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpXS5zdGF0ZSA9PSBaTV9TVEFURV9QUkVBVVRIKQorICAgICAgICAgICAgICAgICAgICAmJiAoZGVsdGFNcyA+IFpNX1BSRUFVVEhfVElNRU9VVF9NUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQWdpbmcgU1RBICovCisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYXV0aFNoYXJpbmcgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGF1dGggKi8KKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID09IFpNX1NUQVRFX0FVVEgpCisgICAgICAgICAgICAgICAgICAgICYmIChkZWx0YU1zID4gWk1fQVVUSF9USU1FT1VUX01TKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFzb2MgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0uc3RhdGUgPT0gWk1fU1RBVEVfQVNPQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNTdGFDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gKCh1MzJfdCl3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiQWdlIFNUQSBpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHhGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGFNcyA+ICgodTMyX3Qpd2QtPmFwLnN0YVByb2JpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9iaW5nIG5vbi1QUyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlByb2JpbmcgU1RBIGluZGV4PSIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5hcC5zdGFQcm9iaW5nVGltZVNlYyAqIFpNX1RJQ0tfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eEZsYWcgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh0eEZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCBkZWF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBhZGRyLCA0LCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eEZsYWcgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fREFUQV9GUkFNRSwgYWRkciwgMCwgMCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZyA9IHBzU3RhQ291bnQ7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZBcFByb3RjdGlvbk1vbml0b3IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkID0+IG5vbkVycCwgUHJvdGVjdCAqLworICAgIGlmICh3ZC0+YXAuYlN0YUFzc29jaWF0ZWQgPiAwKQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICB3ZC0+ZXJwRWxlbWVudCA9IFpNX1dMQU5fTk9OX0VSUF9QUkVTRU5UX0JJVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQ7CisKKyAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoZGV2LCAxKTsKKworICAgIH0KKyAgICAvKiAxMWIgU1RBIG5vdCBhc3NvY2lhdGVkLCBwcm90ZWN0aW9uIE9CU1MgcHJlc2VudCA9PiBQcm90ZWN0ICovCisgICAgZWxzZSBpZiAod2QtPmFwLnByb3RlY3RlZE9ic3MgPiAyKSAvL1RocmVzaG9sZAorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kaXNhYmxlU2VsZkN0cyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVDsKKworICAgICAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICAgICAgemZBcFNldFByb3RlY3Rpb25Nb2RlKGRldiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBOb25FcnAgYml0IGluIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworICAgIH0KKyAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcyA9IDA7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHU4X3QgY2g7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJSeCBiZWFjb24iKTsKKworICAgIC8qIHVwZGF0ZSBOb24tRVJQIGZsYWcod2QtPmFwLm5vbkVycE9ic3MpICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FUlApKSA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWIgT0JTUyAqLworICAgICAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcysrOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisgICAgaWYgKChjaCAmIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUKSA9PSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFByb3RlY3RlZCBPQlNTICovCisgICAgICAgIHdkLT5hcC5wcm90ZWN0ZWRPYnNzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmQXBQcm9jZXNzQXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWxnbywgc2VxLCBzdGF0dXM7CisgICAgdThfdCBhdXRoU2hhcmluZzsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoYWxsZW5nZVBhc3NlZCA9IDA7CisgICAgdThfdCBmcmFtZUN0cmw7CisgICAgdTMyX3QgcmV0QWxnb1NlcTsKKyAgICB1MzJfdCByZXRTdGF0dXM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworICAgIC8qIEFQIDogQXV0aCBzaGFyZSAzICovCisgICAgLyogc2hpZnQgZm9yIFdFUCBJViAqLworICAgIGlmICgoZnJhbWVDdHJsICYgMHg0MCkgIT0gMCkKKyAgICB7CisgICAgICAgIGFsZ28gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyOCk7CisgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGdvID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOworICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgIHN0YXR1cyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI4KTsKKyAgICB9CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSeCBBdXRoLCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIFNldCBkZWZhdWx0IHRvIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBub3Qgc3VwcG9ydCAqLworICAgIHJldEFsZ29TZXEgPSAweDIwMDAwIHwgYWxnbzsKKyAgICByZXRTdGF0dXMgPSAxMzsgLyogYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIG5vdCBzdXBwb3J0ICovCisKKyAgICAvKiBBUCA6IEF1dGggb3BlbiAxICovCisgICAgaWYgKGFsZ28gPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuYXV0aEFsZ29bYXBJZF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDA7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGF1dGggKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHpmQXBBZGRTdGEoZGV2LCBzcmMsIFpNX1NUQVRFX0FVVEgsIGFwSWQsIDAsIDAsIDApKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IGNhbGwgemZ3QXV0aE5vdGlmeSgpIGZvciBob3N0IHRvIGp1ZGdlICovCisgICAgICAgICAgICAgICAgICAgIC8vemZ3QXV0aE5vdGlmeShkZXYsIHNyYyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCB1bnNwZWNpZmljIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9Miwgc2VxdWVuY2UgbnVtYmVyIG91dCBvZiBleHBlY3RlZCAqLworICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIEFQIDogQXV0aCBzaGFyZSAxICovCisgICAgZWxzZSBpZiAoYWxnbyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hcC5hdXRoQWxnb1thcElkXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDE7CisKKyAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRoU2hhcmluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgaWYgKGF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHJlc3BvbnNlIEF1dGggc2VxPTIsIHN0YXR1cyA9IGZhaWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIHByZWF1dGggKi8KKyAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfUFJFQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiBjYWxsIHpmd0F1dGhOb3RpZnkoKSBmb3IgaG9zdCB0byBqdWRnZSAqLworICAgICAgICAgICAgICAgICAgICAvL3pmd0F1dGhOb3RpZnkoZGV2LCBzcmMpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNlcSA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEFsZ29TZXEgPSAweDQwMDAxOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5hdXRoU2hhcmluZyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgY2hhbGxlbmdlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19idWZfcmVhZGgoZGV2LCBidWYsIDMwKzQpID09IDB4ODAxMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5jaGFsbGVuZ2VUZXh0W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzIraSs0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VQYXNzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWxsZW5nZVBhc3NlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHVwZGF0ZSBTVEEgdG8gYXV0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiwgY2hhbGxlbmdlIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE1OworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogZGVsZXRlIFNUQSAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4NDAwMDE7CisgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHNyYywgcmV0QWxnb1NlcSwKKyAgICAgICAgICAgIHJldFN0YXR1cywgYXBJZCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWlkID0gMHhmZmZmOworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IHN0YVR5cGUgPSAwOworICAgIHU4X3QgcW9zVHlwZSA9IDA7CisgICAgdThfdCBxb3NJbmZvID0gMDsKKyAgICB1OF90IHRtcDsKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVuY01vZGUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8qIEFQIDogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPmFwLnZhcE51bWJlcjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkTGVuW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoayA9PSB3ZC0+YXAudmFwTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHpsRGVhdXRoOworICAgICAgICB9CisKKyAgICAgICAgayA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ZC0+YXAudmFwTnVtYmVyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5hcC5zc2lkTGVuW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2pdW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gd2QtPmFwLnNzaWRMZW5bal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrID09IHdkLT5hcC52YXBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY2hlY2sgY2FwYWJpbGl0eSAqLworCisgICAgLyogQVAgOiBjaGVjayBzdXBwb3J0IHJhdGUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWcgU1RBICovCisgICAgICAgIHN0YVR5cGUgPSAxOworICAgIH0KKyAgICAvL0NXWWFuZygrKQorICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIDExbiBTVEEgKi8KKyAgICAgICAgc3RhVHlwZSA9IDI7CisgICAgfQorCisgICAgLyogVE9ETyA6IGRvIG5vdCBhbGxvdyAxMWIgU1RBIHRvIGFzc29jaWF0ZWQgaW4gUHVyZSBHIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW2FwSWRdID09IFpNX1dMQU5fVFlQRV9QVVJFX0cgJiYgc3RhVHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgMywgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBJbiBwdXJlIEIgbW9kZSwgd2Ugc2V0IEcgU1RBIGludG8gQiBtb2RlICovCisgICAgaWYgKHdkLT5hcC53bGFuVHlwZVthcElkXSA9PSBaTV9XTEFOX1RZUEVfUFVSRV9CICYmIHN0YVR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHN0YVR5cGUgPSAwOworICAgIH0KKworICAgIC8qIEFQIDogY2hlY2sgMTFpIGFuZCBXUEEgKi8KKyAgICAvKiBBUCA6IGNoZWNrIDExaCAqLworCisgICAgLyogQVAgOiBjaGVjayBXTUUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZFdpZmlFbGVtZW50KGRldiwgYnVmLCAyLCAwKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogV01FIFNUQSAqLworICAgICAgICBxb3NUeXBlID0gMTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiV01FIFNUQSIpOworCisgICAgICAgIGlmICh3ZC0+YXAudWFwc2RFbmFibGVkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHFvc0luZm8gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbYXBJZF0gPT0gMSkKKyAgICB7CisgICAgICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX1dQQV9JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBXUEEgSUUgKi8KKyAgICAgICAgICAgIHU4X3QgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworCisgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiV1BBIE1vZGUgemZ3QXNvY05vdGlmeSwgYXBJZD0iLCBhcElkKTsKKworICAgICAgICAgICAgICAgIC8qIEFQIDogQ2FsbCB6ZndBc29jTm90aWZ5KCkgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkoZGV2LCBzcmMsIHdkLT5hcC5zdGF3cGFJZVthcElkXSwgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9SU05fSUUpKSAhPSAweGZmZmYgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBnZXQgUlNOIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGgrMiA8IFpNX01BWF9XUEFJRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdID0gbGVuZ3RoKzI7CisgICAgICAgICAgICAgICAgZW5jTW9kZSA9IDE7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJSU04gTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkFzb2NOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXNvY05vdGlmeShkZXYsIHNyYywgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdLCBhcElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byB6bERlYXV0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfQ0VOQ19JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBDRU5DIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkNFTkMgTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkNlbmNBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5KGRldiwgc3JjLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8qIGFwIGlzIGVuY3J5cHRpb24gYnV0IHN0YSBoYXMgbm8gd3BhL3JzbiBpZSAqLworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgNiwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3RhIGhhcyB3cGEvcnNuIGllIGJ1dCBhcCBpcyBubyBlbmNyeXB0aW9uICovCisgICAgaWYgKCh3ZC0+YXAud3BhU3VwcG9ydFthcElkXSA9PSAwKSAmJiAoZW5jTW9kZSA9PSAxKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGFzb2MgKi8KKyAgICBhaWQgPSB6ZkFwQWRkU3RhKGRldiwgc3JjLCBaTV9TVEFURV9BU09DLCBhcElkLCBzdGFUeXBlLCBxb3NUeXBlLCBxb3NJbmZvKTsKKworICAgIHpmQXBTdG9yZUFzb2NSZXFJZShkZXYsIGJ1ZiwgYWlkKTsKKworemxEZWF1dGg6CisgICAgLyogQVAgOiBzZW5kIGFzb2MgcnNwMiAqLworICAgIGlmIChhaWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICAgICAgaWYgKGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSkKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUT0RPIDogc2VuZCBkZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKiBwQXNzb0ZyYW1lOworICAgIC8vdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgeworICAgICAgICB3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKzI0KTsKKyAgICB9CisgICAgLyogY2FwYWJpbGl0eTogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNDsKKworICAgIC8qIExpc3RlbiBpbnRlcnZhbDogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBvZmZzZXQgPSAyODsKKworICAgIC8qIHN1cHBvcnRlZCByYXRlcyAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmKQorICAgICAgICByZXR1cm47CisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgMSk7CisKKyAgICAvKiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSA9PSAweGZmZmYpCisgICAgICAgIHJldHVybjsKKyAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKworICAgIC8qIHBvd2VyIGNhcGFiaWxpdHk6NCBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyAyICsgbGVuZ3RoOworCisgICAgLyogc3VwcG9ydGVkIGNoYW5uZWxzOiA0IG9jdGV0cyAqLworICAgIG9mZnNldCA9IG9mZnNldCArIDIgKyA0OworCisgICAgLyogUlNOICovCisKKyAgICAvKiBRb1MgKi8KKworICAgIC8qIEhUIGNhcGFiaWxpdGllczogMjggb2N0ZXRzICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+YXAuaWVbYWlkXS5IdENhcDsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDI2OworICAgICAgICBmb3IgKGk9MTsgaTw9MjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaSsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5hcC5pZVthaWRdLkh0Q2FwOworICAgICAgICBmb3IgKGk9MDsgaTwyODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIHN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKyAgICB7CisgICAgdThfdCAqaHRjYXA7CisgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMgaW5mbz0iLCAoKHUxNl90ICopaHRjYXApWzFdKTsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBBLU1QRFUgcGFyYW1ldGVycz0iLCBodGNhcFs0XSk7CisgICAgLy96bV9kZWJ1Z19tc2cyKCJBU09DOiAgU3VwcG9ydGVkIE1DUyBzZXQ9IiwgKCh1MzJfdCAqKWh0Y2FwKVsxXT4+OCk7CisgICAgfQorCit9CisKK3ZvaWQgemZBcFByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKworfQorCit2b2lkIHpmQXBQcm9jZXNzRGVhdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKQoreworI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJSeCBwcm9iZXJzcCIpOworCisgICAgLyogR2F0aGVyIHNjYW4gcmVzdWx0ICovCisKKyAgICAvL3ptX2RlYnVnX21zZzEoImJzc0xpc3QgQ291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIC8qIHJldHVybiBpZiBub3QgaW4gc2Nhbm5pbmcgKi8KKyAgICBpZiAoKHdkLT5oZWFydEJlYXROb3RpZmljYXRpb24gJiBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgICAgICAgICAhPSBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEucFVwZGF0ZUJzc0xpc3QtPmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIGlmICggd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmUHJvY2Vzc1Byb2JlUnNwKGRldiwgYnVmLCBBZGRJbmZvKTsKKworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkSWVTc2lkICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIEFQIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogdmlydHVhbCBBUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQXBBZGRJZVNzaWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLnNzaWRMZW5bdmFwXSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IFNTSUQgKi8KKyAgICBmb3IgKGk9MDsgaTx3ZC0+YXAuc3NpZExlblt2YXBdOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5zc2lkW3ZhcF1baV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVRpbSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgQVAgaW5mb3JtYXRpb24gZWxlbWVudCBUSU0gdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllVGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YXApCit7CisgICAgdThfdCB1bmlCaXRNYXBbOV07CisgICAgdTE2X3QgaGlnaGVzdEJ5dGU7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBsZW5PZmZzZXQ7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworICAgIHUxNl90IGFpZDsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB6YnVmX3QqIHRtcEJ1ZkFycmF5W1pNX1VOSV9BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCB0bXBCdWZBcnJheVNpemUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1RJTSk7CisKKyAgICAvKiBvZmZzZXQgb2YgRWxlbWVudCBMZW5ndGggKi8KKyAgICBsZW5PZmZzZXQgPSBvZmZzZXQrKzsKKworICAgIC8qIEluZm9ybWF0aW9uIDogVElNICovCisgICAgLyogRFRJTSBjb3VudCAqLworICAgIC8qIFRPRE8gOiBEb2Vzbid0IHdvcmsgZm9yIFZpcnR1YWwgQVAncyBjYXNlICovCisgICAgd2QtPkN1cnJlbnREdGltQ291bnQrKzsKKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPj0gd2QtPmR0aW0pCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudER0aW1Db3VudCA9IDA7CisgICAgfQorICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPkN1cnJlbnREdGltQ291bnQpOworICAgIC8qIERUSU0gcGVyaW9kICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+ZHRpbSk7CisgICAgLyogYml0bWFwIG9mZnNldCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7CisKKyAgICAvKiBVcGRhdGUgQkNNQyBiaXQgKi8KKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAod2QtPmFwLmJjbWNUYWlsW3ZhcF0hPXdkLT5hcC5iY21jSGVhZFt2YXBdKT8xOjA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAwOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBVbmljYXN0IGJpdG1hcCAqLworICAgIC8qIHJlc2V0IGJpdCBtYXAgKi8KKyAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgeworICAgICAgICB1bmlCaXRNYXBbaV0gPSAwOworICAgIH0KKyAgICBoaWdoZXN0Qnl0ZSA9IDA7CisjaWYgMQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIC8qIFRPRE8gOiBBZ2luZyBQUyBmcmFtZSBhZnRlciBxdWV1aW5nIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcyAqLworCisgICAgICAgIC8qIGdldCBkZXN0aW5hdGlvbiBTVEEncyBhaWQgKi8KKyAgICAgICAgZHN0WzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgZHN0WzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCA0KTsKKyAgICAgICAgaWYgKChhaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVthaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgImFpZD0iLGFpZCk7CisgICAgICAgICAgICAgICAgYWlkKys7CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KGFpZDw9NjQpOworICAgICAgICAgICAgICAgIGJpdFBvc2l0aW9uID0gKDEgPDwgKGFpZCAmIDB4NykpOworICAgICAgICAgICAgICAgIGJ5dGVQb3NpdGlvbiA9IChhaWQgPj4gMyk7CisgICAgICAgICAgICAgICAgdW5pQml0TWFwW2J5dGVQb3NpdGlvbl0gfD0gYml0UG9zaXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZVBvc2l0aW9uPmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkID0gKGlkKzEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgUFMgZnJhbWUgd2hpY2ggU1RBIG5vIGxvbmdlciBpbiBQUyBtb2RlIik7CisgICAgICAgICAgICAgICAgLyogU2VuZCBQUyBmcmFtZSB3aGljaCBTVEEgbm8gbG9uZ2VyIGluIFBTIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgICAgICB0bXBCdWZBcnJheVt0bXBCdWZBcnJheVNpemUrK10gPSBwc0J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkZyZWUgZ2FyYmFnZSBQUyBmcmFtZSIpOworICAgICAgICAgICAgLyogRnJlZSBnYXJiYWdlIFBTIGZyYW1lICovCisgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbShkZXYsIHdkLT5hcC51YXBzZFEsIHVuaUJpdE1hcCwgJmhpZ2hlc3RCeXRlKTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMywgImJtPSIsdW5pQml0TWFwWzBdKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJoaWdoZXN0Qnl0ZT0iLGhpZ2hlc3RCeXRlKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJ0aW1CY21jQml0W109Iix3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKworICAgIC8qIGJpdG1hcCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmlCaXRNYXBbMF0gfCB3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKyAgICBmb3IgKGk9MDsgaTxoaWdoZXN0Qnl0ZTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB1bmlCaXRNYXBbaSsxXSk7CisgICAgfQorCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgbGVuT2Zmc2V0LCBoaWdoZXN0Qnl0ZSs0KTsKKworICAgIGZvciAoaT0wOyBpPHRtcEJ1ZkFycmF5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgIHpmUHV0VnR4cShkZXYsIHRtcEJ1ZkFycmF5W2ldKTsKKyAgICB9CisgICAgLyogUHVzaCBWVFhRW2FjXSAqLworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFJlbW92ZUZyb21Qc1F1ZXVlICAgICAgICovCisvKiAgICAgIFJlbW92ZSB6YnVmIGZyb20gUFMgcXVldWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IGluZGV4IGluIHBzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlIGRhdGEgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoemRldl90KiBkZXYsIHUxNl90IGlkLCB1MTZfdCogYWRkcikKK3sKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgbmlkOworICAgIHU4X3QgbW9yZURhdGEgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5hcC51bmlUYWlsID0gKHdkLT5hcC51bmlUYWlsLTEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgIHdoaWxlIChpZCAhPSB3ZC0+YXAudW5pVGFpbCkKKyAgICB7CisgICAgICAgIG5pZCA9IChpZCArIDEpICYgKFpNX1VOSV9BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgIHdkLT5hcC51bmlBcnJheVtpZF0gPSB3ZC0+YXAudW5pQXJyYXlbbmlkXTsKKworICAgICAgICAvKiBTZWFyY2ggdW50aWwgdGFpbCB0byBjb25maWcgbW9yZSBkYXRhIGJpdCAqLworICAgICAgICBkc3RbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgd2QtPmFwLnVuaUFycmF5W2lkXSwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd19idWZfcmVhZGgoZGV2LCB3ZC0+YXAudW5pQXJyYXlbaWRdLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X2J1Zl9yZWFkaChkZXYsIHdkLT5hcC51bmlBcnJheVtpZF0sIDQpOworICAgICAgICBpZiAoKGFkZHJbMF0gPT0gZHN0WzBdKSAmJiAoYWRkclsxXSA9PSBkc3RbMV0pCisgICAgICAgICAgICAgICAgJiYgKGFkZHJbMl0gPT0gZHN0WzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgaWQgPSBuaWQ7CisgICAgfQorICAgIHJldHVybiBtb3JlRGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVdtZVBhcmEgICAgICAgICAgICAqLworLyogICAgICBBZGQgV01FIFBhcmFtZXRlciBFbGVtZW50IHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllV21lUGFyYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dJRklfSUUpOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDI0KTsKKworICAgIC8qIE9VSSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDUwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4RjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDEpOworCisgICAgLyogUW9TIEluZm8gKi8KKyAgICBpZiAod2QtPmFwLnVhcHNkRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg4MSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB9CisKKyAgICAvKiBSZXNlcnZlZCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisKKyAgICAvKiBCZXN0IEVmZm9ydCBBQyBwYXJhbWV0ZXJzICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAzKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4QTQpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICAvKiBCYWNrZnJvdW5kIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MjcpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHhBNCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZpZGVvIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg0Myk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDVFKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZvaWNlIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgzMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDJGKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFNlbmRCZWFjb24gICAgICAgICAgICAgICovCisvKiAgICAgIFNuZWQgQVAgbW9kZSBiZWFjb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCB2YXA7CisgICAgdTE2X3Qgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdkLT5hcC5iZWFjb25Db3VudGVyKys7CisgICAgaWYgKHdkLT5hcC5iZWFjb25Db3VudGVyID49IHdkLT5hcC52YXBOdW1iZXIpCisgICAgeworICAgICAgICB3ZC0+YXAuYmVhY29uQ291bnRlciA9IDA7CisgICAgfQorICAgIHZhcCA9IHdkLT5hcC5iZWFjb25Db3VudGVyOworCisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzIsICJTZW5kIGJlYWNvbiwgdmFwPSIsIHZhcCk7CisKKyAgICAvKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgYmVhY29uICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgYmVhY29uIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKworICAgIC8qIHdsYW4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDA4MCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIER1cmF0aW9uICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDAwKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAxICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAzICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNlcSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHNlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIHdpbGwgZmlsbCB0aGlzIGZpZWxkICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsyLCAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzQsIDApOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgb2Zmc2V0Kz04OworCisgICAgLyogQmVhY29uIEludGVydmFsICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBpZiAod2QtPmFwLmhpZGVTc2lkW3ZhcF0gPT0gMCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsKKworICAgIH0KKworICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgIHsKKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIFRJTSAqLworICAgIG9mZnNldCA9IHpmQXBBZGRJZVRpbShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworCisgICAgLyogSWYgV0xBTiBUeXBlIGlzIG5vdCBQVVJFIEIgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICB7CisgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICB7CisgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgIC8qIFRPRE8gOiBSU04gKi8KKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllV3BhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgfQorCisgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KKyAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVdtZVBhcmEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisKKyAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIDEyMTIgOiB3cml0ZSB0byBiZWFjb24gZmlmbyAqLworICAgIC8qIDEyMjEgOiB3cml0ZSB0byBzaGFyZSBtZW1vcnkgKi8KKyAgICB6ZkhwU2VuZEJlYWNvbihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIEZyZWUgYmVhY29uIGJ1ZmZlciAqLworICAgIC8qIFRPRE86IEluIG9yZGVyIHRvIGZpdCB0aGUgbWFkd2lmaSBiZWFjb24gYXJjaGl0ZWN0dXJlLCB3ZSBuZWVkIHRvCisgICAgICAgZnJlZSBiZWFjb24gYnVmZmVyIGluIHRoZSBIQUwgbGF5ZXIuCisgICAgICovCisKKyAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkludHJhYnNzRm9yd2FyZCAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IGludHJhLUJTUyBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogdW5pY2FzdCBpbnRyYXMtQlNTIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG90aGVyIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSW50cmFic3NGb3J3YXJkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCBzcmNWYXApCit7CisgICAgdTE2X3QgZXJyOworICAgIHUxNl90IGFzb2NGbGFnID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHN0YVN0YXRlOworICAgIHpidWZfdCogdHhCdWY7CisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgdGVtcDsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCB2YXAgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyNlbHNlCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYgIC8vIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorCisgICAgLyogRG8gSW50cmEtQlNTIGZvcndhcmQoZGF0YSBjb3B5KSBpZiBuZWNlc3NhcnkqLworICAgIGlmICgoZHN0WzBdJjB4MSkgIT0gMHgxKQorICAgIHsKKyAgICAgICAgYWlkID0gemZBcEdldFNUQUluZm8oZGV2LCBkc3QsICZzdGFTdGF0ZSwgJnZhcCk7CisgICAgICAgIGlmICgoYWlkICE9IDB4ZmZmZikgJiYgKHN0YVN0YXRlID09IFpNX1NUQVRFX0FTT0MpICYmIChzcmNWYXAgPT0gdmFwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNvY0ZsYWcgPSAxOworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSW50cmEtQlNTIGZvcndhcmQgOiBhc29jIFNUQSIpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFwID0gc3JjVmFwOworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJbnRyYS1CU1MgZm9yd2FyZCA6IEJDb3JNQyIpOworICAgIH0KKworICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgPSBhc3NvY2lhdGVkIFNUQSBvciBCQy9NQyAqLworICAgIGlmICgoYXNvY0ZsYWcgPT0gMSkgfHwgKChkc3RbMF0mMHgxKSA9PSAweDEpKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgZnJhbWUgKi8KKyAgICAgICAgaWYgKCh0eEJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fUlhfRlJBTUVfU0laRSkpCisgICAgICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQWxsb2MgaW50cmEtYnNzIGJ1ZiBGYWlsISIpOworICAgICAgICAgICAgZ290byB6bEFsbG9jRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IGZyYW1lICovCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIGksIHRlbXApOworICAgICAgICB9CisgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCB0eEJ1ZiwgbGVuKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgICAgICAvKiBUeC1BMiA9IFJ4LUExLCBUeC1BMyA9IFJ4LUEyLCBUeC1BMSA9IFJ4LUEzICovCisgICAgICAgIGZvciAoaT0wOyBpPDY7IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQraSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIHR4QnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraSwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCB0eEJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUK2ksIHRlbXApOworICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCtpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCtpLCB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFRyYW5zbWl0IGZyYW1lICovCisgICAgICAgIC8qIFJldHVybiBlcnJvciBpZiBwb3J0IGlzIGRpc2FibGVkICovCisgICAgICAgIGlmICgoZXJyID0gemZUeFBvcnRDb250cm9sKGRldiwgdHhCdWYsIHZhcCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IFpNX0VSUl9UWF9QT1JUX0RJU0FCTEVEOworICAgICAgICAgICAgZ290byB6bFR4RXJyb3I7CisgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIHR4QnVmLCB2YXApKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3J3YXJkIGZyYW1lIGlmIG5vdCBiZWVuIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgICAgICByZXQgPSB6ZlB1dFZ0eHEoZGV2LCB0eEJ1Zik7CisgICAgICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgICAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB0eEJ1ZiwgdmFwLCBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBhc29jRmxhZzsKKworemxUeEVycm9yOgorICAgIHpmd0J1ZkZyZWUoZGV2LCB0eEJ1ZiwgMCk7Cit6bEFsbG9jRXJyb3I6CisgICAgcmV0dXJuIGFzb2NGbGFnOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHNhLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgbWFjQWRkclswXSA9IHNhWzBdICsgKHNhWzFdIDw8IDgpOworICAgIG1hY0FkZHJbMV0gPSBzYVsyXSArIChzYVszXSA8PCA4KTsKKyAgICBtYWNBZGRyWzJdID0gc2FbNF0gKyAoc2FbNV0gPDwgOCk7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHFvc1R5cGUpCit7CisgICAgdThfdCBkYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoZGV2LCBidWYsIGRhLCAwLCA2KTsKKworICAgIG1hY0FkZHJbMF0gPSBkYVswXSArIChkYVsxXSA8PCA4KTsKKyAgICBtYWNBZGRyWzFdID0gZGFbMl0gKyAoZGFbM10gPDwgOCk7CisgICAgbWFjQWRkclsyXSA9IGRhWzRdICsgKGRhWzVdIDw8IDgpOworCisgICAgaWYgKChtYWNBZGRyWzBdICYgMHgxKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoJndkLT5hcC5iY01pY0tleVswXSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgbWFjQWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlOworICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBcFVwZGF0ZVBzQml0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdmFwLCB1OF90KiB1YXBzZFRyaWcpCit7CisgICAgdTE2X3Qgc3RhU3RhdGU7CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHBzQml0OworICAgIHUxNl90IHNyY1szXTsKKyAgICB1MTZfdCBkc3RbMV07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykKKyAgICB7CisgICAgICAgIC8qIEFQICovCisgICAgICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgICAgIHBzQml0ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgxMCkgPj4gNDsKKyAgICAgICAgLyogR2V0IEFJRCBhbmQgdXBkYXRlIFNUQSBQUyBtb2RlICovCisgICAgICAgIGFpZCA9IHpmQXBHZXRTVEFJbmZvQW5kVXBkYXRlUHMoZGV2LCBzcmMsICZzdGFTdGF0ZSwgdmFwLCBwc0JpdCwgdWFwc2RUcmlnKTsKKworICAgICAgICAvKiBpZiBTVEEgbm90IGFzc29jaWF0ZWQsIHNlbmQgZGVhdXRoICovCisgICAgICAgIGlmICgoYWlkID09IDB4ZmZmZikgfHwgKHN0YVN0YXRlICE9IFpNX1NUQVRFX0FTT0MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGRzdFswXSYweDEpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDB4NywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRDsKKyAgICAgICAgfQorICAgIH0gLyogaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXRFMgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1dEU19TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLndkcy53ZHNCaXRtYXAgJiAoMTw8aSkpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzcmNbMF0gPT0gd2QtPmFwLndkcy5tYWNBZGRyW2ldWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNyY1sxXSA9PSB3ZC0+YXAud2RzLm1hY0FkZHJbaV1bMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3JjWzJdID09IHdkLT5hcC53ZHMubWFjQWRkcltpXVsyXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqdmFwID0gMHgyMCArIGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordm9pZCB6ZkFwUHJvY2Vzc1BzUG9sbCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdFszXTsKKyAgICB6YnVmX3QqIHBzQnVmID0gTlVMTDsKKyAgICB1MTZfdCBpZDsKKyAgICB1OF90IG1vcmVEYXRhID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgc3JjWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHNyY1syXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKworICAgIC8qIEZpbmQgcHMgYnVmZmVyIGZvciBQc1BvbGwgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIGRzdFswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMik7CisgICAgICAgIGRzdFsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgNCk7CisKKyAgICAgICAgaWYgKChzcmNbMF0gPT0gZHN0WzBdKSAmJiAoc3JjWzFdID09IGRzdFsxXSkgJiYgKHNyY1syXSA9PSBkc3RbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBtb3JlRGF0YSA9IHpmQXBSZW1vdmVGcm9tUHNRdWV1ZShkZXYsIGlkLCBzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWQgPSAoaWQgKyAxKSAmIChaTV9VTklfQVJSQVlfU0laRSAtIDEpOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU2VuZCBwcyBidWZmZXIgKi8KKyAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgd2l0aCBtb3JlIGRhdGEgYml0ICovCisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgbW9yZURhdGEpOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1vZGUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgIT0gbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgTUFDJlBIWSByZWdpc3RlcnMgdG8gZGlzYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnByb3RlY3Rpb25Nb2RlICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdyaXRlIE1BQyZQSFkgcmVnaXN0ZXJzIHRvIGVuYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwU2VuZEZhaWx1cmUgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWNlaXZlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kRmFpbHVyZSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBzdGFBZGRyWzNdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgc3RhQWRkclswXSA9IGFkZHJbMF0gKyAoKCh1MTZfdClhZGRyWzFdKTw8OCk7CisgICAgc3RhQWRkclsxXSA9IGFkZHJbMl0gKyAoKCh1MTZfdClhZGRyWzNdKTw8OCk7CisgICAgc3RhQWRkclsyXSA9IGFkZHJbNF0gKyAoKCh1MTZfdClhZGRyWzVdKTw8OCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBzdGFBZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogU2VuZCBmYWlsdHVyZSA6IEFkZCAzIG1pbnV0ZXMgdG8gaW5hY3RpdmUgdGltZSB0aGF0IHdpbGwgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgIHdpbGwgbWFrZSBTVEEgYmVlbiBraWNrZWQgb3V0IHNvb24gKi8KKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50aW1lIC09ICgzKlpNX1RJQ0tfUEVSX01JTlVURSk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgY2F0ZWdvcnkgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNCk7CisKKyAgICBzd2l0Y2ggKGNhdGVnb3J5KQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRToKKyAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWJhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKQEAgLTAsMCArMSw1NzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicmF0ZWN0cmwuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworLyogVE9ETyA6IGNoYW5nZSBnbG9iYWwgdmFyaWFibGUgdG8gY29uc3RhbnQgKi8KK3U4X3QgICB6Z1dwYVJhZGl1c091aVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAxIH07Cit1OF90ICAgemdXcGFBZXNPdWlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordThfdCAgIHpnV3BhMlJhZGl1c091aVtdID0geyAweDAwLCAweDBmLCAweGFjLCAweDAxIH07Cit1OF90ICAgemdXcGEyQWVzT3VpW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQgfTsKKworY29uc3QgdTE2X3QgemNDd1RsYlsxNl0gPSB7ICAgMCwgICAgMSwgICAgMywgICAgNywgICAxNSwgICAzMSwgICA2MywgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsICA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDQwOTUsIDQwOTUsIDQwOTV9OworCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0Q2IoemRldl90KiBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QgICovCisvKiAgICAgIFB1dCBBUCBpbnRvIGJsb2NraW5nIEFQIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBic3NpZCA6IEFQJ3MgQlNTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2VpZ2h0IDogd2VpZ2h0IG9mIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB1MTZfdCBpLCBqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHdlaWdodCA+IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvKkZpbmQgc2FtZSBic3NpZCBlbnRyeSBmaXJzdCovCisgICAgICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSE9IGJzc2lkW2pdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihqPT02KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qVGhpcyBic3NpZCBkb2Vzbid0IGhhdmUgb2xkIHJlY29yZC5GaW5kIGFuIGVtcHR5IGVudHJ5Ki8KKyAgICAgICAgaWYgKGkgPT0gWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGxpc3QgaXMgZnVsbCwgcGljayBvbmUgZW50cnkgZm9yIHJlcGxhY2VtZW50ICovCisgICAgICAgIGlmIChpID09IFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBic3NpZFs1XSAmIChaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFLTEpOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIEFQIGFkZHJlc3MgYW5kIHdlaWdodCAqLworICAgICAgICBmb3IgKGo9MDsgajw2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSA9IGJzc2lkW2pdOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUlzQXBJbkJsb2NraW5nTGlzdCAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJzc2lkIDogQVAncyBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRSVUUgOiBBUCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGQUxTRSA6IEFQIG5vdCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKQoreworICAgIHUxNl90IGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLmFkZHJbal0gIT0gYnNzaWRbal0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QgICAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IGZsdXNoIHdob2xlIGJsb2NraW5nIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhUmVmcmVzaEJsb2NrTGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgZmx1c2hGbGFnKQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmx1c2hGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0ud2VpZ2h0LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwgICAgICAgICAgICAqLworLyogICAgICBIYW5kbGUgQ29ubmVjdCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnNzaWQgOiBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYXNvbiA6IHJlYXNvbiBvZiBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhQ29ubmVjdEZhaWwoemRldl90KiBkZXYsIHUxNl90IHJlYXNvbiwgdTE2X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBDaGFuZ2UgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICAvKiBOb3RpZnkgd3JhcHBlciBvZiBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2VzICovCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgcmVhc29uLCBic3NpZCk7CisgICAgfQorCisgICAgLyogUHV0IEFQIGludG8gaW50ZXJuYWwgYmxvY2tpbmcgbGlzdCAqLworICAgIHpmU3RhUHV0QXBJbnRvQmxvY2tpbmdMaXN0KGRldiwgKHU4X3QgKilic3NpZCwgd2VpZ2h0KTsKKworICAgIC8qIElzc3VlIGFub3RoZXIgU0NBTiAqLworICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJTdGFydCBpbnRlcm5hbCBzY2FuLi4uIik7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgIH0KK30KKwordThfdCB6ZmlXbGFuSUJTU0dldFBlZXJTdGF0aW9uc0NvdW50KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7Cit9CisKK3U4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpCit7CisgICAgdThfdCBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgaTsKKyAgICB1OF90IGluZGV4ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKyAgICBpZiAoIG9wcG9zaXRlQ291bnQgPiBudW1Ub0l0ZXJhdGUgKQorICAgIHsKKyAgICAgICAgb3Bwb3NpdGVDb3VudCA9IG51bVRvSXRlcmF0ZTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayhkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXSwgY3R4LCBpbmRleCsrKTsKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCitzOF90IHpmU3RhRmluZEZyZWVPcHBvc2l0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgKnNhLCBpbnQgKnBGb3VuZElkeCkKK3sKKyAgICBpbnQgb3Bwb3NpdGVDb3VudDsKKyAgICBpbnQgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9wcG9zaXRlQ291bnQgPSB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgc2EsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlciA9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSOworCisgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IHN0b3JlZCAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHN0aWxsIHNwYWNlIGZvciBuZXcgY29tZXIKKyAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9PSBaTV9NQVhfT1BQT1NJVEVfQ09VTlQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEZpbmQgYW4gdW51c2VkIHNsb3QgZm9yIG5ldyBwZWVyIHN0YXRpb24KKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSBpOworICAgIHJldHVybiAwOworfQorCitzOF90IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIHU4X3QgKnBGb3VuZElkeCkKK3sKKyAgICB1MzJfdCBvcHBvc2l0ZUNvdW50OworICAgIHUzMl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBvcHBvc2l0ZUNvdW50ID0gd2QtPnN0YS5vcHBvc2l0ZUNvdW50OworCisgICAgZm9yKGk9MDsgaSA8IFpNX01BWF9PUFBPU0lURV9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBvcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCgodThfdCopIHNhLCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCA2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRm91bmRJZHggPSAodThfdClpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6ZlN0YUluaXRDb21tb25PcHBvc2l0ZUluZm8oemRldl90KiBkZXYsIGludCBpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIHNldCB0aGUgZGVmYXVsdCByYXRlIHRvIHRoZSBoaWdoZXN0IHJhdGUgKi8KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDE7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUNvdW50Kys7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgLyogU2V0IHBhcmFtZXRlcnMgZm9yIG5ldyBvcHBvc2l0ZSBwZWVyIHN0YXRpb24gISEhICovCisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uY2FtSWR4ID0gMHhmZjsgIC8vIE5vdCBzZXQga2V5IGluIHRoaXMgbG9jYXRpb24KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5wa0luc3RhbGxlZCA9IDA7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgOyAgLy8gTm8gZW5jcnlwdGlvbgorI2VuZGlmCit9CisKK2ludCB6ZlN0YVNldE9wcG9zaXRlSW5mb0Zyb21CU1NJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICB1OF90KiAgZHN0OworICAgIHUxNl90ICBzYVszXTsKKyAgICBpbnQgcmVzOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZNZW1vcnlDb3B5KCh1OF90Kikgc2EsIHBCc3NJbmZvLT5tYWNhZGRyLCA2KTsKKworICAgIHJlcyA9IHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsIHNhLCAmaSk7CisgICAgaWYgKCByZXMgIT0gMCApCisgICAgeworICAgICAgICBnb3RvIHpsUmV0dXJuOworICAgIH0KKworICAgIGRzdCA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHI7CisgICAgemZNZW1vcnlDb3B5KGRzdCwgKHU4X3QgKilzYSwgNik7CisKKyAgICBvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKworICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMi40R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDAsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMCwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDEsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7Cit6bFJldHVybjoKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBpbnQgICBpOworICAgIHU4X3QqICBkc3Q7CisgICAgdTE2X3QgIHNhWzNdOworICAgIGludCByZXMgPSAwOworICAgIHUxNl90ICBvZmZzZXQ7CisgICAgdThfdCAgIGJTdXBwb3J0RXh0UmF0ZTsKKyAgICB1MzJfdCBydHNjdHNSYXRlID0gMHhmZmZmZmZmZjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgdTMyX3Qgb25lVHhTdHJlYW1DYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBzYVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCsyKTsKKyAgICBzYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXMgPSB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCBzYSwgJmkpOworICAgIGlmICggcmVzICE9IDAgKQorICAgIHsKKyAgICAgICAgZ290byB6bFJldHVybjsKKyAgICB9CisKKyAgICBkc3QgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyOworICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZHN0LCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgaWYgKCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJTdXBwb3J0RXh0UmF0ZSA9IDE7CisgICAgfQorCisgICAgaWYgKCAoYlN1cHBvcnRFeHRSYXRlID09IDEpCisgICAgICAgICAmJiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICYmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgICAgICAgJiYgKHdkLT53ZmMuYklic3NHTW9kZSA9PSAwKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0KKworICAgIHdkLT5zdGEuY29ubmVjdGlvbl8xMWIgPSAwOworICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworCisgICAgaWYgKCAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoYlN1cHBvcnRFeHRSYXRlID09IDEpICkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5nCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MDAwMDFiYjsgLyogQ1RTOkNDSyAxTSwgUlRTOk9GRE0gNk0gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5hCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWEKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MTBiMDFiYjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExbmcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwMDAwMWJiOyAvKiBDVFM6Q0NLIDFNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFiCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMCwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwOyAvKiBDVFM6Q0NLIDFNLCBSVFM6Q0NLIDFNICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0aW9uXzExYiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFuYQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIChvbmVUeFN0cmVhbUNhcCE9MCk/MzoyLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFhCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMSwgMCwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ0c2N0c1JhdGUgPSAweDEwYjAxYmI7IC8qIENUUzpPRkRNIDZNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICB9CisgICAgfQorCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7CisKK3psUmV0dXJuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocnRzY3RzUmF0ZSAhPSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgICAgemZIcFNldFJUU0NUU1JhdGUoZGV2LCBydHNjdHNSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCB6ZlN0YVByb3RFcnBNb25pdG9yKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIG9mZnNldDsKKyAgICB1OF90ICAgIGVycDsKKyAgICB1OF90ICAgIGJzc2lkWzZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpJiYoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSApCisgICAgeworICAgICAgICBaTV9NQUNfV09SRF9UT19CWVRFKHdkLT5zdGEuYnNzaWQsIGJzc2lkKTsKKworICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfRVJQKSkgIT0gMHhmZmZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIGVycCAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJwcm90ZWN0aW9uIG1vZGUgb2ZmIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy9DaGVjayB0aGUgZXhpc3RlbmNlIG9mIE5vbi1OIEFQCisJCS8vRm9sbG93IHRoZSBjaGVjayB0aGUgInBCc3NJbmZvLT5FbmFibGVIVCIKKwkJCWlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKwkJCXt9CisJCQllbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorCQkJe30KKwkJCWVsc2UKKwkJCXt3ZC0+c3RhLk5vbk5BUGNvdW50Kys7fQorICAgIH0KK30KKwordm9pZCB6ZlN0YVVwZGF0ZVdtZVBhcmFtZXRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICB0bXA7CisgICAgdTE2X3QgICBhaWZzWzVdOworICAgIHUxNl90ICAgY3dtaW5bNV07CisgICAgdTE2X3QgICBjd21heFs1XTsKKyAgICB1MTZfdCAgIHR4b3BbNV07CisgICAgdThfdCAgICBhY207CisgICAgdThfdCAgICBhYzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1MTZfdCAgIGk7CisgICAJdTE2X3QgICBvZmZzZXQ7CisgICAgdThfdCAgICByeFdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogVXBkYXRlIGlmIFdNRSBwYXJhbWV0ZXIgc2V0IGNvdW50IGlzIGNoYW5nZWQgKi8KKyAgICAvKiBJZiBjb25uZWN0IHRvIFdNRSBBUCAqLworICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgIHsKKyAgICAgICAgLyogRmluZCBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID49IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnhXbWVQYXJhbWV0ZXJTZXRDb3VudD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKHJ4V21lUGFyYW1ldGVyU2V0Q291bnQgIT0gd2QtPnN0YS53bWVQYXJhbWV0ZXJTZXRDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIndtZVBhcmFtZXRlclNldENvdW50IGNoYW5nZWQhIik7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEud21lUGFyYW1ldGVyU2V0Q291bnQgPSByeFdtZVBhcmFtZXRlclNldENvdW50OworICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSBXTUUgcGFyYW1ldGVyIGFuZCB1cGRhdGUgVHhRIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgYWNtID0gMHhmOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gKDgrKGkqNCkrNCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wPXptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMCtpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjID0gKHRtcCA+PiA1KSAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4MTApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY20gJj0gKH4oMTw8YWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1thY10gPSAoKHRtcCAmIDB4ZikgKiA5KSArIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEraSo0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIDJebiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluW2FjXSA9IHpjQ3dUbGJbKHRtcCAmIDB4ZildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4W2FjXSA9IHpjQ3dUbGJbKHRtcCA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhvcFthY109em13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsxMitpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhY20gJiAweDQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluWzJdID0gY3dtaW5bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjd21heFsyXSA9IGN3bWF4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1syXSA9IGFpZnNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0eG9wWzJdID0gdHhvcFswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFjbSAmIDB4OCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3dtaW5bM10gPSBjd21pblsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4WzNdID0gY3dtYXhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhaWZzWzNdID0gYWlmc1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4b3BbM10gPSB0eG9wWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN3bWluWzRdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgY3dtYXhbNF0gPSA3OworICAgICAgICAgICAgICAgICAgICBhaWZzWzRdID0gMjg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjd21pblsyXSthaWZzWzJdKSA+ICgoY3dtaW5bMF0rYWlmc1swXSkrMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCit9CisvKiBwcm9jZXNzIDgwMi4xMWggRHluYW1pYyBGcmVxdWVuY3kgU2VsZWN0aW9uICovCit2b2lkIHpmU3RhVXBkYXRlRG90MTFIREZTKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKgorICAgIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBFbGVtZW50IEZvcm1hdAorICAgICstLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfEZvcm1hdHxFbGVtZW50IElEfExlbmd0aHxDaGFubmVsIFN3aXRjaCBNb2RlfE5ldyBDaGFubmVsIE51bWJlcnxDaGFubmVsIFN3aXRjaCBDb3VudHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxCeXRlcyB8ICAgMSAgICAgIHwgIDEgICB8CSAgICAgMSAgICAgICAgICAgfCAgICAgICAxICAgICAgICAgIHwgICAgICAgICAgMSAgICAgICAgIHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxWYWx1ZSB8ICAgMzcgICAgIHwgIDMgICB8ICAgICAgIDAgb3IgMSAgICAgIHx1bnNpZ25lZCBpbnRlZ2VyICB8dW5zaWduZWQgaW50ZWdlciAgICB8CisgICAgKy0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAqLworICAgIC8vdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBvZmZzZXQ7CisKKyAgICAvKiBnZXQgRUlEKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSkpID09IDB4ZmZmZiApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgPT0gMHgzICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIGZvdW5kIik7CisKKyAgICAgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIC8vemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMsIG9mZnNldCwgbGVuZ3RoKzIpOworCisgICAgICAgIC8vQ2hhbmVsbCBTd2l0Y2ggTW9kZSBzZXQgdG8gMSwgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRyYW5zbWl0IGltbWVkaWF0ZQorICAgICAgICAvL3dlIGRvIHRoaXMgYnkgcG9sbCBDQ0EgaGlnaAorICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpID09IDB4MSApCisgICAgICAgIHsKKyAgICAgICAgCS8vdXNlIFpNX09JRF9JTlRFUk5BTF9XUklURSxaTV9DTURfUkVTRVQgdG8gbm90aWNlIGZpcm13YXJlIGZsdXNoIHF1ZW5lIGFuZCBzdG9wIGRtYSwKKyAgICAgICAgCS8vdGhlbiByZXN0YXJ0IHJ4IGRtYSBidXQgbm90IHR4IGRtYQorICAgICAgICAJaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4ICE9IFRSVUUpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHpmSHBSZXNldFR4Unggd291bGQgY2F1c2UgUnggaGFuZyAqLworICAgICAgICAgICAgICAgIC8vemZIcFJlc2V0VHhSeChkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuREZTRGlzYWJsZVR4ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBUcmdnZXIgUnggRE1BICovCisgICAgICAgICAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAJLy9BZGFwdGVyLT5aRDgwMjExSFNldHRpbmcuRGlzYWJsZVR4Qnk4MDIxMUg9VFJVRTsKKyAgICAgICAgCS8vQWNxdWlyZUN0ck9mUGh5UmVnKEFkYXB0ZXIpOworICAgICAgICAJLy9aRDEyMDVfV1JJVEVfUkVHSVNURVIoQWRhcHRlcixDUjI0LCAweDApOworICAgICAgICAJLy9SZWxlYXNlRG9Ob3RTbGVlcChBZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkgPD0gMHgyICkKKyAgICAgICAgeworICAgICAgICAJLy9DaGFubmVsIFN3aXRjaAorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA9IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGltbWVkaWF0ZWx5LgorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA+IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGFmdGVyIFRCVFQqY291bnQKKyAgICAgICAgCS8vQnV0IGl0IHdvbid0IGJlIGFjY3VyYXRlIHRvIGxldCBkcml2ZXIgY2FsY3VsYXRlIFRCVFQqY291bnQsIGFuZCB0aGUgdmFsdWUgb2YKKyAgICAgICAgCS8vQ2hhbm5lbCBTd2l0Y2ggQ291bnQgd2lsbCBkZWNyZWFzZSBieSBvbmUgZWFjaCB3aGVuIGNvbnRpbnVlIHJlY2V2aW5nIGJlYWNvbgorICAgICAgICAJLy9TbyB3ZSBjaGFuZ2UgY2hhbm5lbCBoZXJlIHdoZW4gd2UgcmVjZWl2ZSBjb3VudCA8PTIuCisKKyAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwoZGV2LCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kpOworICAgICAgICAJd2QtPmZyZXF1ZW5jeSA9IHpmQ2hOdW1Ub0ZyZXEoZGV2LCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyksIDApOworICAgICAgICAJLy96ZkhwQWRkQWxsb3dDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl6bV9kZWJ1Z19tc2cxKCJDV1kgLSBqdW1wIHRvIGZyZXF1ZW5jeSA9ICIsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAJemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl3ZC0+c3RhLkRGU0Rpc2FibGVUeCA9IEZBTFNFOworICAgICAgICAgICAgLyogSW5jcmVhc2UgcnhCZWFjb25Db3VudCB0byBwcmV2ZW50IGJlYWNvbiBsb3N0ICovCisgICAgICAgICAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDEgPDwgNjsgLy8gMiB0aW1lcyBvZiBjaGVjayB3b3VsZCBwYXNzCisgICAgICAgICAgICB9CisgICAgICAgIAkvL3N0YXJ0IHR4IGRtYSB0byB0cmFuc21pdCBwYWNrZXQKKworICAgICAgICAJLy9pZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpICE9IHdkLT5mcmVxdWVuY3kpCisgICAgICAgIAkvL3sKKyAgICAgICAgCS8vCS8vWkREYmdQcmludCgoIlJhZGFyIERldGVjdCBieSBBUFxuIikpOworICAgICAgICAJLy8JemZDb3JlU2V0RnJlcXVlbmN5KCk7CisgICAgICAgIAkvLwlQcm9jZXNzUmFkYXJEZXRlY3RFdmVudChBZGFwdGVyKTsKKyAgICAgICAgCS8vCVNldF9SRl9DaGFubmVsKEFkYXB0ZXIsIFN3UmZkLT5SZmQtPlJ4QnVmZmVyW2luZGV4KzNdLCAoVUNIQVIpQWRhcHRlci0+UkZfTW9kZSwgMSk7CisgICAgICAgIAkvLwlBZGFwdGVyLT5DYXJkU2V0dGluZy5DaGFubmVsID0gU3dSZmQtPlJmZC0+UnhCdWZmZXJbaW5kZXgrM107CisgICAgICAgIAkvLwlBZGFwdGVyLT5TYXZlQ2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvLwlBZGFwdGVyLT5VdGlsaXR5Q2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvL30KKyAgICAgICAgfQorICAgIH0KKworfQorLyogVE9ETyA6IHByb2Nlc3MgODAyLjExaCBUcmFuc21pc3Npb24gUG93ZXIgQ29udHJvbCAqLwordm9pZCB6ZlN0YVVwZGF0ZURvdDExSFRQQyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNDaGVja1N0YXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90ICAgaSwgZnJhbWVDdHJsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBCU1NJRCAqLworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VULCA2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CisKKyAgICAvKiBjaGVjayBwb3dlciBtYW5hZ2VtZW50IGJpdCAqLworICAgIGlmICggZnJhbWVDdHJsICYgWk1fQklUXzQgKQorICAgIHsKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHNvdXJjZSBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJVc2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaSA9PSBaTV9NQVhfUFNfU1RBICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU1RBIGxpc3QgaXMgZnVsbCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZW5hYmxlIEFUSU0gd2luZG93CisgICAgICAgICAgICAvL3pmRW5hYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmNvdW50ICkKKyAgICB7CisgICAgICAgIGZvcihpPTE7IGk8Wk1fTUFYX1BTX1NUQTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYlVzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQtLTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iRGF0YVF1ZXVlZCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgcXVldWVkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuY291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRpc2FibGUgQVRJTSB3aW5kb3cgKi8KKyAgICAgICAgICAgIC8vemZEaXNhYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICB9Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBkYVszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICYmIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA8PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBEQSAqLworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCArIDIpOworICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICsgNCk7CisjZWxzZQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworI2VuZGlmCisKKyAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QoZGEpICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVswXS5iRGF0YVF1ZXVlZCA9IFRSVUU7CisgICAgICAgIHdkLT5zdGEuaWJzc1BTRGF0YVF1ZXVlW3dkLT5zdGEuaWJzc1BTRGF0YUNvdW50KytdID0gYnVmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBVbmljYXN0IHBhY2tldC4uLgorCisgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCh3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKSBkYSwgNikgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQrK10gPSBidWY7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisjaWYgMAorICAgIGlmICggd2QtPnN0YS5wb3dlclNhdmVNb2RlID4gWk1fU1RBX1BTX05PTkUgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zdGFQU0RhdGFRdWV1ZVt3ZC0+c3RhLnN0YVBTRGF0YUNvdW50KytdID0gYnVmOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9QU19TVEE7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJEYXRhUXVldWVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjYXN0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2VuZCBBVElNIHRvIHByZXZlbnQgdGhlIHBlZXIgdG8gZ28gdG8gc2xlZXAKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QqKSB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDAsCisgICAgICAgICAgICAgICAgICAgIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ID0gd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7CisgICAgd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQgPSAwOworfQorCisKK3ZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICYmCisgICAgICAgICB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpfHwoemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFJlY292ZXIgemVybyBTU0lEIGxlbmd0aCAgKi8KKyAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHdkLT53cy5zc2lkTGVuID09IDApKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFSZWNvbm5lY3Q6IE5PVCBTdXBwb3J0ISEgU2V0IFNTSUQgdG8gYW55IEJTUyIpOworICAgICAgICAvKiBBTlkgQlNTICovCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuc3NpZFswXSA9IDA7CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLy8gUkFZOiBUbyBlbnN1cmUgbm8gVFggcGVuZGluZyBiZWZvcmUgcmUtY29ubmVjdGluZworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgemZXbGFuRW5hYmxlKGRldik7CisgICAgemZTY2FuTWdyU2NhbkFjayhkZXYpOworfQorCit2b2lkIHpmU3RhVGltZXIxMDBtcyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICh3ZC0+dGljayAlIDEwKSA9PSAwICkKKyAgICB7CisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKy8vICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyTWFpbihkZXYpOworICAgIH0KK30KKworCit2b2lkIHpmU3RhQ2hlY2tSeEJlYWNvbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5iZWFjb25JbnRlcnZhbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAod2QtPnRpY2sgJSAoKHdkLT5iZWFjb25JbnRlcnZhbCAqIDEwKSAvIFpNX01TX1BFUl9USUNLKSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJ4QmVhY29uQ291bnQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJLypub3RpZnkgQVAgdGhhdCB3ZSBsZWZ0Ki8KKyAgICAgICAgICAgIAl6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLyogQmVhY29uIExvc3QgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uTWlzc1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCit2b2lkIHpmU3RhQ2hlY2tDb25uZWN0VGltZW91dCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0aW5nKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8yKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFKSApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+dGljayAtIHdkLT5zdGEuY29ubmVjdFRpbWVyKSA+IFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZmFpbENudE9mUmVhc3NvKys7CisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA+IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNvbm5lY3QgdGltZW91dCwgc3RhdGUgPSAiLCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworCitmYWlsZWQ6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9BVVRPKQorCXsgLy8gRml4IHNvbWUgQVAgbm90IHNlbmQgYXV0aGVudGljYXRpb24gZmFpbGVkIG1lc3NhZ2UgdG8gc3RhIGFuZCBsZWFkIHRvIGNvbm5lY3QgdGltZW91dCAhCisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQrKzsKKwl9CisgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQsIHdkLT5zdGEuYnNzaWQsIDIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogYWlyb3BlZWsgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgJiYgIXdkLT5zd1NuaWZmZXIpCisgICAgeworICAgICAgICBpZiAoIHdkLT50aWNrICYgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmVGltZXJDaGVja0FuZEhhbmRsZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgemZTdGFDaGVja1J4QmVhY29uKGRldik7CisgICAgICAgIHpmU3RhVGltZXIxMDBtcyhkZXYpOworICAgICAgICB6ZlN0YUNoZWNrQ29ubmVjdFRpbWVvdXQoZGV2KTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqLworICAgIHpmQWdnU2NhbkFuZENsZWFyKGRldiwgd2QtPnRpY2spOworI2VuZGlmCit9CisKK3ZvaWQgemZTdGFTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldCwgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiXG4iKTsKKworICAgIC8qIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBiZWFjb24gKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBbGxvY2F0ZSBiZWFjb24gYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKyAgICAvKiB3bGFuIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwODApOworICAgIG9mZnNldCs9MjsKKyAgICAvKiBEdXJhdGlvbiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAwMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMSAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5tYWNBZGRyWzBdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMV0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsyXSk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFsyXSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogU2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzZXEgPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzZXEpOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIDI0LTMxIFRpbWUgU3RhbXAgOiBoYXJkd2FyZSB3aWxsIGZpbGwgdGhpcyBmaWVsZCAqLworICAgIG9mZnNldCs9ODsKKworICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAvKiBTU0lEICovCisgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICBpZih3ZC0+ZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpICAvLyAyLjQgR0h6ICBiK2cKKyAgICB7CisKKyAgICAJLyogU3VwcG9ydCBSYXRlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAJLyogRFMgcGFyYW1ldGVyIHNldCAqLworICAgIAlvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIAlvZmZzZXQgPSB6ZlN0YUFkZEllSWJzcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICBpZiggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAmJiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKSAgICAvLyBPbmx5IGFjY29tcGFueSB3aXRoIGVuYWJsaW5nIGEgbW9kZSAuCisgICAgICAgIHsKKyAgICAgIAkgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgCSAgICB3ZC0+ZXJwRWxlbWVudCA9IDA7CisgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgCX0KKworICAgICAgIAkvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBSU04gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gemZ3U3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmFibGUgRyBNb2RlICovCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAJICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCSAgICB9CisgICAgfQorICAgIGVsc2UgICAgLy8gNUdIeiBhCisgICAgeworICAgICAgICAvKiBTdXBwb3J0IFJhdGUgYSBNb2RlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKworICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZURzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgCW9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgIC8qIFRPRE8gOiBjb3VudHJ5IGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIFJTTiAqLworICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQTJQU0sgKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgb2sgKi8KKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogMTIxMiA6IHdyaXRlIHRvIGJlYWNvbiBmaWZvICovCisgICAgLyogMTIyMSA6IHdyaXRlIHRvIHNoYXJlIG1lbW9yeSAqLworICAgIHpmSHBTZW5kQmVhY29uKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmZmVyICovCisgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKK30KKwordm9pZCB6ZlN0YVNpZ25hbFN0YXRpc3RpYyh6ZGV2X3QqIGRldiwgdThfdCBTaWduYWxTdHJlbmd0aCwgdThfdCBTaWduYWxRdWFsaXR5KSAvL0NXWWFuZygrKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEFkZCBZb3VyIENvZGUgdG8gRG8gV29ya3MgTGlrZSBNb3ZpbmcgQXZlcmFnZSBIZXJlICovCisgICAgd2QtPlNpZ25hbFN0cmVuZ3RoID0gKHdkLT5TaWduYWxTdHJlbmd0aCAqIDcgKyBTaWduYWxTdHJlbmd0aCAqIDMpLzEwOworICAgIHdkLT5TaWduYWxRdWFsaXR5ID0gKHdkLT5TaWduYWxRdWFsaXR5ICogNyArIFNpZ25hbFF1YWxpdHkgKiAzKS8xMDsKKworfQorCitzdHJ1Y3QgenNCc3NJbmZvKiB6ZlN0YUZpbmRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlcikKK3sKKyAgICB1OF90ICAgIGk7CisgICAgdThfdCAgICBqOworICAgIHU4X3QgICAgazsKKyAgICB1OF90ICAgIGlzTWF0Y2hlZCwgbGVuZ3RoLCBjaGFubmVsOworICAgIHUxNl90ICAgb2Zmc2V0LCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzIoImNoZWNrIHBCc3NJbmZvID0gIiwgcEJzc0luZm8pOworCisgICAgICAgIC8qIENoZWNrIEJTU0lEICovCisgICAgICAgIGZvciggaj0wOyBqPDY7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IHBQcm9iZVJzcEhlYWRlci0+YnNzaWRbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkJLyogQ2hlY2sgU1NJRCAqLworICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdIDw9IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvbXBhcmUgbGVuZ3RoIGFuZCBzc2lkICovCisgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMTsKKwkJCQlpZigocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICE9IDApICYmIChwQnNzSW5mby0+c3NpZFsxXSAhPSAwKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgZm9yKCBrPTE7IGs8cFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICsgMTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnNzaWRba10gIT0gcFByb2JlUnNwSGVhZGVyLT5zc2lkW2tdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpc01hdGNoZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgY2hhbm5lbCAqLworICAgICAgICAvKiBBZGQgY2hlY2sgY2hhbm5lbCB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMiAqLworICAgICAgICBpZiAoaXNNYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0RTKSkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0FsbG93ZWRDaGFubmVsKGRldiwgemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApOzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICggKChmcmVxdWVuY3kgPiAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA+IDMwMDApKQorICAgICAgICAgICAgICAgICAgICAgfHwgKChmcmVxdWVuY3kgPCAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA8IDMwMDApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVkdW5kYW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCisgICAgaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit1OF90IHpmU3RhSW5pdEJzc0luZm8oemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICBzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciAqcFByb2JlUnNwSGVhZGVyLAorICAgICAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbywgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvLCB1OF90IHR5cGUpCit7CisgICAgdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBpLCBvZmZzZXQ7CisgICAgdThfdCAgICBhcFFvc0luZm87CisgICAgdTE2X3QgICAgZWFjaElFbGVuZ3RoID0gMDsKKyAgICB1MTZfdCAgIGFjY3VtdWxhdGVMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCh0eXBlID09IDEpICYmICgocEJzc0luZm8tPmZsYWcgJiBaTV9CU1NfSU5GT19WQUxJRF9CSVQpICE9IDApKQorICAgIHsKKyAgICAgICAgZ290byB6bFVwZGF0ZVJzc2k7CisgICAgfQorCisgICAgLyogZ2V0IFNTSUQgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBub3QgZm91bmQiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworCXsKKwkJdThfdCBTaG93X0ZsYWcgPSAwOworCQl6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoZGV2LCAmU2hvd19GbGFnKTsKKworCQlpZihTaG93X0ZsYWcpCisJCXsKKwkJCWlmIChsZW5ndGggPiBaTV9NQVhfU1NJRF9MRU5HVEggKQorCQkJeworCQkJCXptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisJCQkJZ290byB6bEVycm9yOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NTSURfTEVOR1RIICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKwkJfQorCX0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zc2lkLCBvZmZzZXQsIGxlbmd0aCsyKTsKKworICAgIC8qIGdldCBEUyBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9EUykpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIGlmICggbGVuZ3RoICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBYm5vcm1hbCBEUyBQYXJhbSBTZXQgSUUiKTsKKyAgICAgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjaGFubmVsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworCisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHpmQ2hOdW1Ub0ZyZXEoZGV2LCBjaGFubmVsLCAwKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvLT5mcmVxdWVuY3kgPSB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7IC8vIGF1dG8gY2hlY2sKKyAgICAgICAgcEJzc0luZm8tPmNoYW5uZWwgPSBjaGFubmVsOworCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRFMgcGFyYW1ldGVyIG5vdCBmb3VuZCAqLworICAgICAgICBwQnNzSW5mby0+ZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5LCAmaXM1Ryk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzZWN1cml0eSB0eXBlICovCisgICAgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSA9IFpNX1NFQ1VSSVRZX1RZUEVfTk9ORTsKKworICAgIC8qIGdldCBtYWNhZGRyICovCisgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5tYWNhZGRyW2ldID0gcFByb2JlUnNwSGVhZGVyLT5zYVtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYnNzaWQgKi8KKyAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJzc2lkW2ldID0gcFByb2JlUnNwSGVhZGVyLT5ic3NpZFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGltZXN0YW1wICovCisgICAgZm9yKCBpPTA7IGk8ODsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT50aW1lU3RhbXBbaV0gPSBwUHJvYmVSc3BIZWFkZXItPnRpbWVTdGFtcFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYmVhY29uIGludGVydmFsICovCisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdID0gcFByb2JlUnNwSGVhZGVyLT5iZWFjb25JbnRlcnZhbFswXTsKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0gPSBwUHJvYmVSc3BIZWFkZXItPmJlYWNvbkludGVydmFsWzFdOworCisgICAgLyogZ2V0IGNhcGFiaWxpdHkgKi8KKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVswXTsKKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVsxXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVsxXTsKKworICAgIC8qIENvcHkgZnJhbWUgYm9keSAqLworICAgIG9mZnNldCA9IDM2OyAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0aGUgc3RhcnQgb2YgdmFyaWFibGUgSUUKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldDsKKyAgICBpZiAocEJzc0luZm8tPmZyYW1lQm9keXNpemUgPiAoWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xKSkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xOworICAgIH0KKyAgICBhY2N1bXVsYXRlTGVuID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgZWFjaElFbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgYWNjdW11bGF0ZUxlbisxKSArIDI7ICAvL0xlbisoRUlEK0RhdGEpCisKKyAgICAgICAgaWYgKCAoZWFjaElFbGVuZ3RoID49IDIpCisgICAgICAgICAgICAgJiYgKChhY2N1bXVsYXRlTGVuICsgZWFjaElFbGVuZ3RoKSA8PSBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5mcmFtZUJvZHkrYWNjdW11bGF0ZUxlbiwgb2Zmc2V0K2FjY3VtdWxhdGVMZW4sIGVhY2hJRWxlbmd0aCk7CisgICAgICAgICAgICBhY2N1bXVsYXRlTGVuKz0odTE2X3QpZWFjaElFbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAicHJvYmVyc3AgZnJhbWVCb2R5c2l6ZSBhYm5vcm1hbCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoYWNjdW11bGF0ZUxlbiA8IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplKTsKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IGFjY3VtdWxhdGVMZW47CisKKyAgICAvKiBnZXQgc3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChzdXBwb3J0ZWQgcmF0ZXMpIG5vdCBmb3VuZCIpOworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlN1cHBvcnRlZCByYXRlcyBJRSBsZW5ndGggYWJub3JtYWwiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcywgb2Zmc2V0LCBsZW5ndGgrMik7CisKKworCisgICAgLyogZ2V0IENvdW50cnkgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DT1VOVFJZKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9DT1VOVFJZX0lORk9fU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmNvdW50cnlJbmZvLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgLyogY2hlY2sgODAyLjExZCBzdXBwb3J0IGRhdGEgKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuYjgwMl8xMUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tSVNPKGRldiwgKHU4X3QgKikmcEJzc0luZm8tPmNvdW50cnlJbmZvLCAzKTsKKyAgICAgICAgICAgIC8qIG9ubHkgc2V0IHJlZ3VsYXRvcnkgb25lIHRpbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEuYjgwMl8xMUQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIC8qIGdldCBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkV4dGVuZGVkIHJhdGVzIElFIGxlbmd0aCBhYm5vcm1hbCIpOworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdID0gMDsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BBIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfV1BBX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53cGFJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPndwYUllWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BTIElFICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgNCwgMHhmZikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9XUFNfSUVfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IFpNX01BWF9XUFNfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53c2NJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT53c2NJZVsxXSA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IFN1cGVyRyBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kU3VwZXJHRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+YXBDYXAgfD0gWk1fU3VwZXJHX0FQOworICAgIH0KKworICAgIC8qIGdldCBYUiBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kWFJFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hcENhcCB8PSBaTV9YUl9BUDsKKyAgICB9CisKKyAgICAvKiBnZXQgUlNOIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfUlNOX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5yc25JZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPnJzbkllWzFdID0gMDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBnZXQgQ0VOQyBJRSAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0NFTkNfSUUpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICBpZiAobGVuZ3RoID4gWk1fTUFYX0lFX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5jZW5jSWUsIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICBwQnNzSW5mby0+c2VjdXJpdHlUeXBlID0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DOworICAgICAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmPSAweGZmZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0gPSAwOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgLyogZ2V0IFdNRSBQYXJhbWV0ZXIgSUUsIHByb2JlIHJzcCBtYXkgY29udGFpbiBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAvL2lmICggd2QtPmJRb1NFbmFibGUgKQorICAgIHsKKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgYXBRb3NJbmZvID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpICYgMHg4MDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT53bWVTdXBwb3J0ID0gMSB8IGFwUW9zSW5mbzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kV2lmaUVsZW1lbnQoZGV2LCBidWYsIDIsIDApKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwUW9zSW5mbyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODA7CisgICAgICAgICAgICBwQnNzSW5mby0+d21lU3VwcG9ydCA9IDEgIHwgYXBRb3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPndtZVN1cHBvcnQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIC8vQ1dZYW5nKCspCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogMTFuIEFQICovCisgICAgICAgIHBCc3NJbmZvLT5FbmFibGVIVCA9IDE7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgJiAweDAyKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpICYgMHg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMW4gQVAgKi8KKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMTsKKyAgICAgICAgcEJzc0luZm8tPmFwQ2FwIHw9IFpNX0FsbDExTl9BUDsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikgJiAweDQwKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICB9CisgICAgLyogSFQgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBhdGhlcm9zIHByZSBuICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogcHJlIG4gMi4wIHN0YW5kYXJkICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKCAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICAgICAgICYmICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ICE9IDEpICYmIChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgIT0gMykpICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICB9CisKKyAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3krKChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ9PTEpPzIwOi0yMCkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIG5vdCBhbiBhbGxvd2VkIGNoYW5uZWwsIHRyZWF0IEFQIGFzIG5vbi1IVCBtb2RlICovCisgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmVuYWJsZUhUNDAgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmV4dENoT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBBVEggRXh0ZW5kZWQgQ2FwYWJpbGl0eSAqLworICAgIGlmICggKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSYmCisgICAgICAgICgob2Zmc2V0ID0gemZGaW5kQnJkY21NcnZsUmxua0V4dENhcChkZXYsIGJ1ZikpID09IDB4ZmZmZikpCisKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IEJyb2FkY29tIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyAgICBpZiAoIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkgLy8oKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoKG9mZnNldCA9IHpmRmluZEJyb2FkY29tRXh0Q2FwKGRldiwgYnVmKSkgIT0gMHhmZmZmKSApCisgICAgeworICAgICAgICBwQnNzSW5mby0+YnJvYWRjb21IVEFwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJyb2FkY29tSFRBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IE1hcnZlbCBFeHRlbmRlZCBDYXBhYmlsaXR5ICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRNYXJ2ZWxFeHRDYXAoZGV2LCBidWYpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAwOworICAgIH0KKworICAgIC8qIGdldCBBVElNIHdpbmRvdyAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0lCU1MpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLG9mZnNldCsyKTsKKyAgICB9CisKKyAgICAvKiBGaXQgZm9yIHN1cHBvcnQgbW9kZSAqLworICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81X04pIHsKKyNpZiAwCisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81XzU0KSB7CisgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBhLCBuICovCisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG4gKi8KKyAgICAgICAgICAgICAgICAvKiByZWplY3Qgbm9uLW4gYnNzIGluZm8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfNV81NCkgeworICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYSAqLworICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+YXBDYXAgJj0gKH5aTV9BbGwxMU5fQVApOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUSU5GT1JNQVRJT04pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfTikgeworI2lmIDAKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBnLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IGcsIG4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoICghcEJzc0luZm8tPkVuYWJsZUhUKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIDEuIHJlamVjdCBnLW9ubHkgYnNzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICogMi4gaWYgbm9uIGctb25seSwgZGVsZXRlIGcgbW9kZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhcEJzc0luZm8tPkVuYWJsZUhUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZXJwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VSUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmVXBkYXRlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIHJlamVjdCBub24tbiBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsZXRlIG4gbW9kZSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5hcENhcCAmPSAoflpNX0FsbDExTl9BUCk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTik7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiwgZyAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBnICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICggemZJc0dPbmx5TW9kZShkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3ksIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gemxFcnJvcjI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lcnAgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVJQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlVwZGF0ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQnNzSW5mby0+ZmxhZyB8PSBaTV9CU1NfSU5GT19WQUxJRF9CSVQ7CisKK3psVXBkYXRlUnNzaToKKyAgICAvKiBVcGRhdGUgVGltZXIgaW5mb3JtYXRpb24gKi8KKyAgICBwQnNzSW5mby0+dGljayA9IHdkLT50aWNrOworCisgICAgLyogVXBkYXRlIEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIGlmKCAoczhfdClwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPCAoczhfdClBZGRJbmZvLT5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxICkKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzaWduYWwgc3RyZW5ndGggKi8KKyAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gKHU4X3QpQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMTsKKyAgICAgICAgLyogVXBkYXRlIHNpZ25hbCBxdWFsaXR5ICovCisgICAgICAgIHBCc3NJbmZvLT5zaWduYWxRdWFsaXR5ID0gKHU4X3QpKEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgKiAyKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIHNvcnRpbmcgdmFsdWUgICovCisgICAgICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzZdICsgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHJldHVybiAxOworCit6bEVycm9yMjoKKworICAgIHJldHVybiAyOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKK3sKKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciogIHBCZWFjb25IZWFkZXI7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgdThfdCAgIHBCdWZbc2l6ZW9mKHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlcildOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICBpbnQgICAgcmVzOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHN0YSByb3V0aW5lIGpvYnMgKi8KKyAgICB6ZlN0YVByb3RFcnBNb25pdG9yKGRldiwgYnVmKTsgIC8qIGNoZWNrIHByb3RlY3Rpb24gbW9kZSAqLworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICB7CisgICAgICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBic3NpZCwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oZGV2LCBidWYpOworICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlV21lUGFyYW1ldGVyKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIREZTKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBldmVudDsKKworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIjIwMDcwOTE2IFJlY2VpdmUgb3Bwb3NpdGUgQmVhY29uISIpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pYnNzUmVjZWl2ZUJlYWNvbkNvdW50Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJlcyA9IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBwZWVyIHN0YXRpb24gZm91bmQuIE5vdGlmeSB0aGUgd3JhcHBlciBub3cKKyAgICAgICAgICAgICAgICAgICAgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KGRldiwgYnVmLCAmZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSBpZiAoIHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPT0gWk1fSUJTU19QQVJUTkVSX0xPU1QgKQorICAgICAgICAgICAgLy8gV2h5IGRvZXMgdGhpcyBoYXBwZW4gaW4gSUJTUz8/IFRoZSBpbXBhY3Qgb2YgVmlzdGEgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdGVsbCBpdCB0aGUgQlNTSUQKKyNpZiAwCisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5vcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIElCU1MgbWVyZ2UgaWYgU1NJRCBtYXRjaGVkICovCisgICAgICAgICAgICAgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLnNzaWRMZW4gPT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsyLCB3ZC0+c3RhLnNzaWRMZW4pKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgbWVyZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBic3NpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIGdvdG8gemxSZXR1cm47CisgICAgfQorCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLCBzaXplb2Yoc3RydWN0IHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyKSk7CisgICAgcEJlYWNvbkhlYWRlciA9IChzdHJ1Y3QgenNXbGFuQmVhY29uRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlcik7CisKKyAgICBpZiAoIHBCc3NJbmZvID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgZW50cnkgaWYgQlNTIG5vdCBpbiB0aGUgc2NhbiBsaXN0ICovCisgICAgICAgIHBCc3NJbmZvID0gemZCc3NJbmZvQWxsb2NhdGUoZGV2KTsKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBCZWFjb25IZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDEpOworICAgICAgICBpZiAocmVzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHg7CisKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIHJlc2V0IHRoZSBhbGl2ZSBjb3VudGVyIGlmIHRoZSBwZWVyIHN0YXRpb24gaXMgZm91bmQhCisgICAgICAgICAgICB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCAodTE2X3QgKilwQnNzSW5mby0+bWFjYWRkciwgJmlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit6bFJldHVybjoKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmQXV0aEZyZXFDb21wbGV0ZUNiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSIpOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworICAgIHN0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIqIHBBdXRoRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcildOworICAgIHUzMl90IHAxLCBwMjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEF1dGhGcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiApCisgICAgeworICAgICAgICBpZiAoICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAwKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5zdGF0dXMpID09IDApICkKKyAgICAgICAgeworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy9TZXQgY2hhbm5lbCBhY2NvcmRpbmcgdG8gQVAncyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAvL01vdmUgdG8gaGVyZSBiZWNhdXNlIG9mIENpc2NvIDExbiBBUCBmZWF0dXJlCisgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgemZBdXRoRnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAxOworICAgICAgICAgICAgICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FVVEhfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xICkKKyAgICB7CisgICAgICAgIGlmICggKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAxKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSkKKyAgICAgICAgICAgICAgLy8mJiAocEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dFsxXSA8PSAyNTUpICkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuY2hhbGxlbmdlVGV4dCwgcEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aEZyYW1lLT5jaGFsbGVuZ2VUZXh0WzFdKzIpOworCisgICAgICAgICAgICAvKiBzZW5kIHRoZSAzcmQgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIHAxID0gMHgzMDAwMTsKKyAgICAgICAgICAgIHAyID0gMDsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCwgcDEsIHAyLCAwKTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFRpbWVyID0gd2QtPnRpY2s7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVUJfU1RBVEVfQVVUSF9TSEFSRV8yIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMjsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhdXRoZW50aWNhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgKQorICAgIHsKKyAgICAgICAgaWYgKCAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPmFsZ28pID09IDEpJiYKKyAgICAgICAgICAgICAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPnNlcSkgPT0gNCkmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy9Nb3ZlIHRvIGhlcmUgYmVjYXVzZSBvZiBDaXNjbyAxMW4gQVAgZmVhdHVyZQorICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5RXgoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQsIE5VTEwpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NVQl9TVEFURV9BU1NPQ0lBVEUiKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QiKTsKKyAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgidW5rbm93biBjYXNlIik7CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHN0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIqIHBBc3NvRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEFzc29GcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSApCisgICAgeworICAgICAgICBpZiAoIHBBc3NvRnJhbWUtPnN0YXR1cyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgod2QtPnN0YS53bWVFbmFibGVkICYgWk1fU1RBX1dNRV9FTkFCTEVfQklUKSAhPSAwKSAvL1dNRSBlbmFibGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNvYyByc3AgbWF5IGNvbnRhaW4gV01FIHBhcmFtZXRlciBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIldNRSBlbmFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiVUFQU0QgZW5hYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5xb3NJbmZvID0gd2QtPnN0YS53bWVRb3NJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVXbWVQYXJhbWV0ZXIoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0yNDsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplID4gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpmU3RhU3RvcmVBc29jUnNwSWUoZGV2LCBidWYpOworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICh3ZC0+RXh0T2Zmc2V0ICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy96ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgIC8vICAgICAgICB3ZC0+RXh0T2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHdkLT5zdGEuYnNzaWQsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBLCAxMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2V0IFJJRlMgc3VwcG9ydCAqLworICAgICAgICAgICAgaWYod2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9SSUZTTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDE7CisvLyAgICAgICAgICAgICAgICB6ZkhwU2V0UmlmcyhkZXYsIHdkLT5zdGEuRW5hYmxlSFQsIDEsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnN0YS5haWQgPSBwQXNzb0ZyYW1lLT5haWQgJiAweDNmZmY7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPSAwOyAgICAvKiByZXNldCBvcHBvc2l0ZSBjb3VudCAqLworICAgICAgICAgICAgemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tUnhCdWYoZGV2LCBidWYpOworCisgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPSAxNjsKKworICAgICAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCAhPSAwKSAvKiAxMW4gKi8KKyAgICAgICAgICAgIAl7CisgICAgCQkgICAgICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworICAgIAkJICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gMSkgLyogSFQ0MCovCisgICAgCQkgICAgICAgIHsKKyAgICAJCQkJCWlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDE1MDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkJCSAgICBlbHNlIC8qIFR3byBUeCBzdHJlYW1zICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDMwMDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAyNzAwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkgICAgICAgIH0KKyAgICAJCSAgICAgICAgZWxzZSAvKiBIVDIwICovCisgICAgCQkgICAgICAgIHsKKyAgICAJCSAgICAgICAgICAgIGlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gNjUwMDAwOworICAgIAkJCQkJCXdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICAJCQkJICAgIH0KKyAgICAJCQkJICAgIGVsc2UgLyogVHdvIFR4IHN0cmVhbXMgKi8KKyAgICAJCQkJICAgIHsKKyAgICAJCQkJICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzAwMDA7CisgICAgCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTMwMDAwOworICAgIAkJCQkgICAgfQorICAgIAkJICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogMTFhYmcgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmNvbm5lY3Rpb25fMTFiICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDExMDAwOworICAgIAkJCSAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAJCQkgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDU0MDAwOworICAgIAkJCSAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IFRSVUU7CisgICAgICAgICAgICB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA9IDA7CisKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JDb25uZWN0Tm90aWZ5KGRldik7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgaGVyZSBiZWNhdXNlIGZpeGVkIHJhdGUgaXMgb25seSBmb3IgdGVzdCwgVEJELiAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5FbmFibGVIVCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgd2QtPnR4TUNTID0gNzsgLy9SYXRlID0gNjVNYnBzCisgICAgICAgICAgICAvLyAgICB3ZC0+dHhNVCA9IDI7IC8vIEh0IHJhdGUKKyAgICAgICAgICAgIC8vICAgIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9IDI7IC8vIEVuYWJsZSBBZ2dyZWdhdGlvbgorICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IEZBTFNFOworICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FTT0NfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIHpmU3RhU3RvcmVBc29jUnNwSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisgICAgdThfdCAgYXNvY0J3NDAgPSAwOworICAgIHU4X3QgIGFzb2NFeHRPZmZzZXQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgfQorCisgICAgLyogSFQgY2FwYWJpbGl0aWVzOiAyOCBvY3RldHMgKi8KKyAgICBpZiAoICAgICgod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID4gMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzVfTikpCisgICAgICAgICB8fCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApICYmICEod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKQorICAgIHsKKyAgICAgICAgLyogbm90IDExbiBBUCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICB3ZC0+RXh0T2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgiYXRoZXJvcyBwcmUgbiIpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGh0Y2FwWzBdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgaHRjYXBbMV0gPSAyNjsKKyAgICAgICAgZm9yIChpPTE7IGk8PTI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2krMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2krMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBwcmUgbiAyLjAgc3RhbmRhcmQgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicHJlIG4gMi4wIHN0YW5kYXJkIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNvY0J3NDAgPSAodThfdCkoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSA+PiAxKTsKKworICAgIC8qIEhUIGluZm9ybWF0aW9uICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogYXRoZXJvcyBwcmUgbiAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJhdGhlcm9zIHByZSBuIEhUSU5GTyIpOworICAgICAgICBsZW5ndGggPSAyMjsKKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDIyOworICAgICAgICBmb3IgKGk9MTsgaTw9MjI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpKzFdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJwcmUgbiAyLjAgc3RhbmRhcmQgSFRJTkZPIik7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIDEpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRJbmZvOworICAgICAgICBmb3IgKGk9MDsgaTwyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gSFRJTkZPIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdEluZm87CisgICAgICAgIGZvciAoaT0wOyBpPDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc29jRXh0T2Zmc2V0ID0gd2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICBpZiAoKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgJiYgKGFzb2NCdzQwID09IDEpICYmICgoYXNvY0V4dE9mZnNldCA9PSAxKSB8fCAoYXNvY0V4dE9mZnNldCA9PSAzKSkpCisgICAgeworICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBhc29jQnc0MDsKKyAgICAgICAgd2QtPkV4dE9mZnNldCA9IGFzb2NFeHRPZmZzZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogU1RBIDogaWYgU0E9Y29ubmVjdGVkIEFQIHRoZW4gZGlzY29ubmVjdCB3aXRoIEFQICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICBhcE1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICBhcE1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMik7CisgICAgICAgIGFwTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyAgCWlmICgoYXBNYWNBZGRyWzBdID09IHdkLT5zdGEuYnNzaWRbMF0pICYmIChhcE1hY0FkZHJbMV0gPT0gd2QtPnN0YS5ic3NpZFsxXSkgJiYgKGFwTWFjQWRkclsyXSA9PSB3ZC0+c3RhLmJzc2lkWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpID49IDI0KzIpIC8vbm90IGEgbWFsZm9ybWVkIGZyYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHpmU3RhSXNDb25uZWN0aW5nKGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB1MTZfdCBwZWVyTWFjQWRkclszXTsKKyAgICAgICAgdThfdCAgcGVlcklkeDsKKyAgICAgICAgczhfdCAgcmVzOworCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGVlck1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgcGVlck1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICBwZWVyTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgcGVlck1hY0FkZHIsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLmFsaXZlQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Rpc2Fzb2MoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFNUQSA6IGlmIFNBPWNvbm5lY3RlZCBBUCB0aGVuIGRpc2Nvbm5lY3Qgd2l0aCBBUCAqLworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgYXBNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKTsKKyAgICAgICAgYXBNYWNBZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICBhcE1hY0FkZHJbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCk7CisKKyAgICAgICAgaWYgKChhcE1hY0FkZHJbMF0gPT0gd2QtPnN0YS5ic3NpZFswXSkgJiYgKGFwTWFjQWRkclsxXSA9PSB3ZC0+c3RhLmJzc2lkWzFdKSAmJiAoYXBNYWNBZGRyWzJdID09IHdkLT5zdGEuYnNzaWRbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgPj0gMjQrMikgLy9ub3QgYSBtYWxmb3JtZWQgZnJhbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQywgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIHByb2JlIHJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IGxlbjsKKyAgICB1MTZfdCBpLCBqOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSB8fCAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBTU0lEICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcmVxIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQVBfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+YXAuYXBCaXRtYXAgJiAoaTw8aSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAoKGxlbiA9PSAwKSAmJiAod2QtPmFwLmhpZGVTc2lkW2ldID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxK2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnNzaWRbaV1bal0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VuZEZsYWcgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIHByb2JlIHJlc3BvbnNlICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCBpLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlN0YVByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIC8vIFByb2JlIHJlc3BvbnNlIGlzIHNlbnQgd2l0aCB1bmljYXN0LiBJcyB0aGlzIHJlcXVpcmVkPworICAgIC8vIElCU1Mgd291bGQgc2VuZCBwcm9iZSByZXF1ZXN0IGFuZCB0aGUgY29kZSBiZWxvdyB3b3VsZCBwcmV2ZW50CisgICAgLy8gdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gaGFuZGxpbmcuCisgICAgI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgICNlbmRpZgorCisgICAgemZQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworfQorCit2b2lkIHpmSUJTU1NldHVwQnNzRGVzYyh6ZGV2X3QgKmRldikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCBpOworI2VuZGlmCisgICAgc3RydWN0IHpzQnNzSW5mbyAqcEJzc0luZm87CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBCc3NJbmZvID0gJndkLT5zdGEuaWJzc0Jzc0Rlc2M7CisgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcEJzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICBwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPSAxMDA7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+bWFjYWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciw2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+YnNzaWQsICh1OF90ICopd2QtPnN0YS5ic3NpZCwgNik7CisKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdID0gKHU4X3QpKCh3ZC0+YmVhY29uSW50ZXJ2YWwpID4+IDgpIDsKKworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzBdOworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzFdOworCisgICAgcEJzc0luZm8tPnNzaWRbMF0gPSBaTV9XTEFOX0VJRF9TU0lEOworICAgIHBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZwQnNzSW5mby0+c3NpZFsyXSwgKHU4X3QgKil3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJnBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0XSwgKHU4X3QgKilwQnNzSW5mby0+c3NpZCwKKyAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuICsgMik7CisgICAgb2Zmc2V0ICs9IHdkLT5zdGEuc3NpZExlbiArIDI7CisKKyAgICAvKiBzdXBwb3J0IHJhdGUgKi8KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCk7CisgICAgcEJzc0luZm8tPmZyZXF1ZW5jeSA9IHdkLT5mcmVxdWVuY3k7CisgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICB7CisgICAgICAgIHU4X3QgcnNuWzY0XT0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsCisgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICB9OworCisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgemdXcGEyQWVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSU04gZWxlbWVudCBpZAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1JTTl9JRSA7CisKKyAgICAgICAgLy8gUlNOIGxlbmd0aAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IHJzblsxXSA7CisKKyAgICAgICAgLy8gUlNOIGluZm9ybWF0aW9uCisgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworICAgICAgICB9CisKKyAgICAgICAgemZNZW1vcnlDb3B5KHBCc3NJbmZvLT5yc25JZSwgcnNuLCByc25bMV0rMik7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgemZJYnNzQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyB0bXBCc3NJbmZvOworICAgIHU4X3QgICBtYWNBZGRyWzZdLCBic3NpZFs2XSwgYnNzTm90Rm91bmQgPSBUUlVFOworICAgIHUxNl90ICBpLCBqPTEwMDsKKyAgICB1MTZfdCAgazsKKyAgICBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgZXZlbnQ7CisgICAgdTMyX3QgIGNoYW5uZWxGbGFnczsKKyAgICB1MTZfdCAgb3Bwb3NpdGVXZXBTdGF0dXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogY2hhbmdlIHN0YXRlIHRvIENPTk5FQ1RJTkcgYW5kIHN0b3AgdGhlIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNUSU5HKTsKKyAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworCisgICAgLyogRVNTIGJpdCBvZmYgKi8KKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF8wOworICAgIC8qIElCU1MgYml0IG9uICovCisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8xOworICAgIC8qIG5vdCBub3QgdXNlIHNob3J0IHNsb3QgdGltZSAqLworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSB+Wk1fQklUXzI7CisKKyAgICB3ZC0+c3RhLndtZUNvbm5lY3RlZCA9IDA7CisgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB3ZC0+c3RhLnFvc0luZm8gPSAwOworICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgd2QtPkV4dE9mZnNldCA9IDA7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICAgICAgemZCc3NJbmZvUmVvcmRlckxpc3QoZGV2KTsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMjAwNzA4MDYgIzEgUHJpdmFjeSBiaXQKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNCApCisgICAgICAgICAgICB7IC8vIFByaXZhY3kgSWJzcyBuZXR3b3JrCisvLyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IGJpdCBvbiIpOworICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRDsKKworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAocEJzc0luZm8tPnJzbkllWzddID09IDB4MDEpIHx8IChwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNSkgKQorICAgICAgICAgICAgICAgICAgICB7IC8vIFdFUC00MCAmIFdFUC0xMDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQNDAgb3IgV0VQMTA0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5yc25JZVs3XSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICAgICAgeyAvLyBUS0lQCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNCApCisgICAgICAgICAgICAgICAgICAgIHsgLy8gQUVTCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNDTVAtQUVTIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiUHJpdmFjeSBiaXQgb2ZmIik7CisgICAgICAgICAgICAgICAgb3Bwb3NpdGVXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoemZNZW1vcnlJc0VxdWFsKCYocEJzc0luZm8tPnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS5zc2lkTGVuID09IHBCc3NJbmZvLT5zc2lkWzFdKSYmCisgICAgICAgICAgICAgICAgIChvcHBvc2l0ZVdlcFN0YXR1cyA9PSB3ZC0+c3RhLndlcFN0YXR1cykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0FfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyB8PSBDSEFOTkVMX0hUNDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0E7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0dfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCAgICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfQikgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8wKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9HKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzEpKQorICAgICAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9IVDIwKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzMpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBCeXBhc3MgREZTIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbE5DUyhkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQnlwYXNzIERGUyBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGNoZWNrIElCU1MgYml0ICovCisgICAgICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1heSBjaGVjayB0aW1lc3RhbXAgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KSAmJiAocEJzc0luZm8gIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QqKSZ0bXBCc3NJbmZvLCAodThfdCopKHBCc3NJbmZvKSwgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gJnRtcEJzc0luZm87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vaWYgKCBqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ICkKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXM7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgZm91bmQiKTsKKworICAgICAgICAgICAgLyogRm91bmQgSUJTUywgcmVzZXQgYnNzTm90Rm91bmRDb3VudCAqLworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBic3NOb3RGb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gcEJzc0luZm8tPmF0aW1XaW5kb3c7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIHBCc3NJbmZvLT5ic3NpZCk7CisgICAgICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5leHRTdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXSkgPDwgOCk7CisKKyAgICAgICAgICAgIGlmICh3ZC0+YmVhY29uSW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJzbiBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcEJzc0luZm8tPnJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+cnNuSWVbMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgLyogSWYgbm90IHVzZSBSU05BICwgcnVuIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yc25JZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByaXZhY3kgYml0ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdICYgWk1fQklUXzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSB8PSBaTV9CSVRfNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF80OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcmVhbWJsZSB0eXBlICovCisgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF81KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPSBaTV9QUkVBTUJMRV9UWVBFX0xPTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0xPTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplICsgMTI7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemUgPiBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGs9MDsgazw4OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbOF0gPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF07CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzEwXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdOworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTFdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMV07CisgICAgICAgICAgICAvL2ZvciAoaz0xMjsgazx3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemU7IGsrKykKKyAgICAgICAgICAgIGZvciAoaz0wOyBrPHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbaysxMl0gPSBwQnNzSW5mby0+ZnJhbWVCb2R5W2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tQlNTSW5mbyhkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKikocEJzc0luZm8tPmJzc2lkKSwgNik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LnBlZXJNYWNBZGRyLCAodThfdCAqKShwQnNzSW5mby0+bWFjYWRkciksIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy96ZndJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZldmVudCk7CisgICAgICAgICAgICBnb3RvIGNvbm5lY3RfZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElCU1Mgbm90IGZvdW5kICovCisgICAgaWYgKCBic3NOb3RGb3VuZCApCisgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgdTE2X3Qgb2Zmc2V0IDsKKyNlbmRpZgorICAgICAgICBpZiAoIHdkLT5zdGEuaWJzc0pvaW5Pbmx5ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSUJTUyBqb2luIG9ubHkuLi5yZXRyeS4uLiIpOworICAgICAgICAgICAgZ290byByZXRyeV9pYnNzOworICAgICAgICB9CisKKyAgICAgICAgaWYod2QtPnN0YS5ic3NOb3RGb3VuZENvdW50PDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgZG8gc2l0ZXN1cnZleSEhICBic3NOb3RGb3VuZENvdW50PSIsIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCk7CisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQrKzsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBnb3RvIHJldHJ5X2lic3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLyogRmFpbCBJQlNTIGZvdW5kLCBUT0RPIGNyZWF0ZSBJQlNTICovCisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCB3ZC0+ZnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSA+IDMwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID09IDAgKQorICAgICAgICB7IC8qIEF1dG8gc2V0IGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiQ3JlYXRlIEFkIEhvYyBOZXR3b3JrIEJhbmQgIiwgd2QtPndzLmFkaG9jTW9kZSk7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZGaW5kQ2xlYW5GcmVxdWVuY3koZGV2LCB3ZC0+d3MuYWRob2NNb2RlKTsKKyAgICAgICAgICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgY3JlYXRlZCBvbmUgaW4gY2hhbm5lbCAiLCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAxOworCisgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gd2QtPnN0YS5kZXNpcmVkQnNzaWRba107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgbWFjQWRkclswXSA9ICh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgICAgICAgICAgbWFjQWRkclsxXSA9ICh3ZC0+bWFjQWRkclswXSA+PiA4KTsKKyAgICAgICAgICAgIG1hY0FkZHJbMl0gPSAod2QtPm1hY0FkZHJbMV0gJiAweGZmKTsKKyAgICAgICAgICAgIG1hY0FkZHJbM10gPSAod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgICAgICAgICBtYWNBZGRyWzRdID0gKHdkLT5tYWNBZGRyWzJdICYgMHhmZik7CisgICAgICAgICAgICBtYWNBZGRyWzVdID0gKHdkLT5tYWNBZGRyWzJdID4+IDgpOworICAgICAgICAgICAgemZHZW5lcmF0ZVJhbmRvbUJTU0lEKGRldiwgKHU4X3QgKil3ZC0+bWFjQWRkciwgKHU4X3QgKilic3NpZCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gKHU4X3QpIHpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic3NpZFswXSAmPSB+Wk1fQklUXzA7CisgICAgICAgICAgICBic3NpZFswXSB8PSBaTV9CSVRfMTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgLy93ZC0+c3RhLmF0aW1XaW5kb3cgPSAweDBhOworCisgICAgICAgIC8qIHJhdGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgaWYod2QtPmZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSAgLy8gMi40IEdIeiAgYitnCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSB+Wk1fQklUXzQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgIH0KKworICAgICAgICB6ZklCU1NTZXR1cEJzc0Rlc2MoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKworICAgICAgICAvLyAyMDA3MDQxMSBBZGQgV1BBMlBTSyBpbmZvcm1hdGlvbiB0byBpdHMgSUJTUyBuZXR3b3JrICEhIQorICAgICAgICBvZmZzZXQgPSAwIDsKKworICAgICAgICAvKiB0aW1lc3RhbXAgKi8KKyAgICAgICAgb2Zmc2V0ICs9IDggOworCisgICAgICAgIC8qIGJlYWNvbiBpbnRlcnZhbCAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9ICh1OF90KSgod2QtPmJlYWNvbkludGVydmFsKSA+PiA4KSA7CisKKyAgICAgICAgLyogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBzc2lkICovCisgICAgICAgIC8vIHNzaWQgZWxlbWVudCBpZAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9TU0lEIDsKKyAgICAgICAgLy8gc3NpZCBsZW5ndGgKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5zc2lkTGVuIDsKKyAgICAgICAgLy8gc3NpZCBpbmZvcm1hdGlvbgorICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLnNzaWRbaV0gOworICAgICAgICB9CisKKyAgICAgICAgLyogc3VwcG9ydCByYXRlICovCisgICAgICAgIHJhdGVTZXQgPSBaTV9SQVRFX1NFVF9DQ0sgOworICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ICs9IDAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc3VwcG9ydCByYXRlIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSA7CisKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrOworCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5iUmF0ZSAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9CisgICAgICAgICAgICAgICAgCSAgICB6ZzExYlJhdGVUYmxbaV0rKCh3ZC0+YlJhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpIDsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtsZW5PZmZzZXRdID0gbGVuIDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gRFMgcGFyYW1ldGVyIHNldCBlbGVtZXQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfRFMgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0KKyAgICAgICAgIAl6ZkNoRnJlcVRvTnVtKHdkLT5mcmVxdWVuY3ksIE5VTEwpIDsKKworICAgICAgICAvKiBJQlNTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfSUJTUyA7CisKKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGxlbmd0aAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAyIDsKKworICAgICAgICAvLyBJQlNTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0XSA9IHdkLT5zdGEuYXRpbVdpbmRvdyA7CisgICAgICAgIG9mZnNldCArPSAyIDsKKworICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gYW5kIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICBpZiAoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworICAgICAgICAgICAgLy8gRVJQIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VSUCA7CisKKyAgICAgICAgICAgIC8vIEVSUCBsZW5ndGgKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgICAgICAvLyBFUlAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5lcnBFbGVtZW50IDsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gMCA7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgZWxlbWVudCBpZAorICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUgOworCisgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzIGxlbmd0aAorICAgICAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrIDsKKworICAgICAgICAgICAgICAgIC8vIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dGVuZGVkIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIAkgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2xlbk9mZnNldF0gPSBsZW4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFJTTiA6IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbmZsdWVuY2UgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBJQlNTIG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA7CisgICAgICAgICAgICB1OF90ICAgIHJzbls2NF09CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB0eXBlLCBkZWZhdWx0PVBTSyAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTTiBjYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbis0LCB6Z1dwYTJBZXNPdWksIDQpOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVyd3JpdGUgUGFpcndpc2UgQ2lwaGVyIFN1aXRlIGJ5IEFFUyAqLworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJTTiBlbGVtZW50IGlkCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9SU05fSUUgOworCisgICAgICAgICAgICAvLyBSU04gbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSByc25bMV0gOworCisgICAgICAgICAgICAvLyBSU04gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcnNuLCByc25bMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAvKiBJZiBub3QgdXNlIFJTTkEgLCBydW4gdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgICNpZiAwCisgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgT1VJWzNdID0geyAweDAgLCAweDkwICwgMHg0QyB9IDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfV1BBX0lFIDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IE9VSVtpXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICB7CisgICAgICAgICAgICB1OF90IE9VSVszXSA9IHsgMHgwICwgMHg5MCAsIDB4NEMgfSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1dQQV9JRSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggKyA0IDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBPVUlbaV0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEIDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IG9mZnNldCA7CisKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLy8gMjAwNzA0MTYgTGV0IENyZWF0ZSBJQlNTIG5ldHdvcmsgY291bGQgZW50ZXIgdGhlIHpmd0lic3NQYXJ0bmVyTm90aWZ5IGZ1bmN0aW9uCisgICAgICAgIC8vIGJzc05vdEZvdW5kID0gRkFMU0UgOworCisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAxID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKSA7CisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAyID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKSA7CisgICAgICAgIGZvcihrPTA7IGs8d2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplOyBrKyspCisgICAgICAgIHsKKwkgICAgIHByaW50aygiJTAyeCAiLCB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtrXSkgOworICAgICAgICB9CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKilic3NpZCwgNik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5wZWVyTWFjQWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciwgNik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL3dkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPSBaTV9JQlNTX1BBUlRORVJfTE9TVDsKKyAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAwOworICAgIH0KKworY29ubmVjdF9kb25lOgorICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgemZTdGFTZW5kQmVhY29uKGRldik7IC8vIFJlZnJlc2ggQmVhY29uIGNvbnRlbnQgZm9yIFpEMTIxMUIgSGFsUGx1cworICAgIHpmSHBTZXRBdGltV2luZG93KGRldiwgd2QtPnN0YS5hdGltV2luZG93KTsKKworICAgIC8vIFN0YXJ0IHRoZSBJQlNTIHRpbWVyIHRvIG1vbml0b3IgZm9yIG5ldyBzdGF0aW9ucworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfSUJTU19NT05JVE9SLCBaTV9USUNLX0lCU1NfTU9OSVRPUik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgIH0KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNURUQpOworICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX0RFTEFZRURfSk9JTl9JTkRJQ0FUSU9OCisgICAgaWYgKCAhYnNzTm90Rm91bmQgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5pYnNzRGVsYXllZEluZCA9IDE7CisgICAgICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQsICh1OF90ICopJmV2ZW50LCBzaXplb2Yoc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50KSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoICFic3NOb3RGb3VuZCApCisgICAgeworICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworCityZXRyeV9pYnNzOgorICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcpOworICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQsIHdkLT5zdGEuYnNzaWQsIDApOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NBdGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJSZWNlaXZpbmcgQXRpbSB3aW5kb3cgbm90aWZpY2F0aW9uIik7CisKKyAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMTsKK30KKworc3RhdGljIHN0cnVjdCB6c0Jzc0luZm8qIHpmSW5mcmFGaW5kQVBUb0Nvbm5lY3QoemRldl90KiBkZXYsCisgICAgICAgIHN0cnVjdCB6c0Jzc0luZm8qIGNhbmRpZGF0ZUJzcykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbz1OVUxMOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0LCBhcFdlcFN0YXR1czsKKyAgICB1MzJfdCBrOworICAgIHUzMl90IGNoYW5uZWxGbGFnczsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCh6Zk1lbW9yeUlzRXF1YWwoJihwQnNzSW5mby0+c3NpZFsyXSksIHdkLT5zdGEuc3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnNzaWRMZW4pKSYmCisgICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gcEJzc0luZm8tPnNzaWRbMV0pKXx8CisgICAgICAgICAgICAgKCh3ZC0+c3RhLnNzaWRMZW4gPT0gMCkmJgorICAgICAgICAgICAgICAgLyogY29ubmVjdCB0byBhbnkgQlNTOiBBUCdzIGFucyBTVEEncyBXRVAgc3RhdHVzIG11c3QgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IGFwV2VwU3RhdHVzICkmJgorICAgICAgICAgICAgICAocEJzc0luZm8tPnNlY3VyaXR5VHlwZSAhPSBaTV9TRUNVUklUWV9UWVBFX1dQQSkgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnNzaWRMZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQU5ZIEJTUyBmb3VuZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICgod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQgJiYgYXBXZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgJiYKKyAgICAgICAgICAgICAgICAgKGFwV2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICYmIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9PSAxKSkpICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID49IFpNX0FVVEhfTU9ERV9PUEVOICYmIHdkLT5zdGEuYXV0aE1vZGUgPD0gWk1fQVVUSF9NT0RFX0FVVE8pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IHBvbGljeSBpcyBpbmNvbnNpc3RlbnQiKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgV1BBIG5lZ2F0aXZlIHRlc3QgKi8KKyAgICAgICAgICAgIGlmICggIXpmQ2hlY2tBdXRoZW50aWNhdGlvbihkZXYsIHBCc3NJbmZvKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgYnNzaWQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazw2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5kZXNpcmVkQnNzaWRba10gIT0gcEJzc0luZm8tPmJzc2lkW2tdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzEsICJkZXNpcmVkIGJzc2lkIG5vdCBtYXRjaGVkIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGsgIT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMSwgImRlc2lyZWQgYnNzaWQgbm90IG1hdGNoZWQgMiIpOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPiAzMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCAgIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9BX0hUOworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggICAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgICAgIHx8IChwQnNzSW5mby0+YXBDYXAgJiBaTV9BbGwxMU5fQVApICkgLy8xMW4gQVAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfR19IVDsKKyAgICAgICAgICAgICAgICAgICAgaWYocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9COworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICAgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9CKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzApKQorICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfRykgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8xKSkKKyAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgJiBDSEFOTkVMX0hUMjApICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMykpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIGlmIEFQIGluIGJsb2NraW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoZGV2LCBwQnNzSW5mby0+YnNzaWQpKSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkNhbmRpZGF0ZSBBUCBpbiBibG9ja2luZyBMaXN0LCBza2lwIGlmIHRoZXJlJ3Mgc3RpbGxhIGNob2ljZSEiKTsKKyAgICAgICAgICAgICAgICBwTm93QnNzSW5mbyA9IHBCc3NJbmZvOworICAgICAgICAgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfMCApICAvLyBjaGVjayBpZiBpbmZyYS1CU1MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5vd0Jzc0luZm8gPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgPSBwQnNzSW5mby0+d21lU3VwcG9ydDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCitkb25lOgorICAgIGlmIChwTm93QnNzSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodm9pZCopY2FuZGlkYXRlQnNzLCAodm9pZCopcE5vd0Jzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisgICAgICAgIHBOb3dCc3NJbmZvID0gY2FuZGlkYXRlQnNzOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcE5vd0Jzc0luZm87Cit9CisKKwordm9pZCB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogcE5vd0Jzc0luZm89TlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvIGNhbmRpZGF0ZUJzczsKKyAgICAvL3UxNl90IGksIGo9MTAwLCBxdWFsaXR5PTEwMDAwOworICAgIC8vdThfdCByZXQ9RkFMU0UsIGFwV2VwU3RhdHVzOworICAgIHU4X3QgcmV0PUZBTFNFOworICAgIHUxNl90IGs7CisgICAgdThfdCBkZW5zaXR5ID0gWk1fTVBEVV9ERU5TSVRZX05PTkU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIFJlc2V0IGJzc05vdEZvdW5kQ291bnQgZm9yIEFkLUhvYzpJQlNTICovCisgICAgLyogTmVlZCByZXZpZXcgOiBJYnNzQ29ubiAtPiBJbmZyYUNvbm4gLT4gSWJzc0Nvbm4gZXRjLCBmbGFnL2NvdW50ZXIgcmVzZXQ/ICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QoZGV2LCAwKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBDT05ORUNUSU5HIGFuZCBzdG9wIHRoZSBjaGFubmVsIHNjYW5uaW5nICovCisgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyk7CisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAwOworICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgd2QtPnN0YS5xb3NJbmZvID0gMDsKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCB3ZC0+c3RhLnVhcHNkUSk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisKKyAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICB6ZkJzc0luZm9SZW9yZGVyTGlzdChkZXYpOworCisgICAgcE5vd0Jzc0luZm8gPSB6ZkluZnJhRmluZEFQVG9Db25uZWN0KGRldiwgJmNhbmRpZGF0ZUJzcyk7CisKKwlpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKwl7CisJICAgIGlmICh3ZC0+c3RhLmJTYWZlTW9kZSA9PSAwKQorCSAgICB7CisJCSAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsvL1F1aWNrbHkgcmVib290CisJICAgIH0KKwl9CisgICAgaWYgKCBwTm93QnNzSW5mbyAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vem1fYXNzZXJ0KHBOb3dCc3NJbmZvICE9IE5VTEwpOworCisgICAgICAgIHBCc3NJbmZvID0gcE5vd0Jzc0luZm87CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IHBCc3NJbmZvLT5zc2lkWzFdOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5zc2lkLCAmKHBCc3NJbmZvLT5zc2lkWzJdKSwgcEJzc0luZm8tPnNzaWRbMV0pOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgLy93ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPSAxOworCisgICAgICAgIC8vemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBwQnNzSW5mby0+YnNzaWQpOworICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXMpOworCisgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUxNl90KSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0pIDw8IDgpOworICAgICAgICBpZiAod2QtPmJlYWNvbkludGVydmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVTUyBiaXQgb24gKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8wOworICAgICAgICAvKiBJQlNTIGJpdCBvZmYgKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfMTsKKworICAgICAgICAvKiAxMW4gQVAgZmxhZyAqLworICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gcEJzc0luZm8tPkVuYWJsZUhUOworICAgICAgICB3ZC0+c3RhLlNHNDAgPSBwQnNzSW5mby0+U0c0MDsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS53bWVFbmFibGVkID0gMDsgLy9EaXNhYmxlIFdNTSBpbiBDRU5DCisgICAgICAgICAgICBjZW5jSW5pdChkZXYpOworICAgICAgICAgICAgY2VuY1NldENFTkNNb2RlKGRldiwgTmRpc0NFTkNfUFNLKTsKKyAgICAgICAgICAgIHdkLT5zdGEud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQ7CisgICAgICAgICAgICAvKiBDRU5DICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jZW5jSWVbMV0gIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQ0VOQzsKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKyAgICAgICAgICAgICAgICB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3BvbihkZXYsICh1OF90ICopJnBCc3NJbmZvLT5jZW5jSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKSZwQnNzSW5mby0+c3NpZCwgKHU4X3QgKikmcEJzc0luZm8tPm1hY2FkZHIpOworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmNlbmNJZSwgcEJzc0luZm8tPmNlbmNJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jZW5jSWVbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvbiBzb2Z0d2FyZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZm9yIFRLSVAgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFFbmFibGVTV0VuY3J5cHRpb24oZGV2LCAoWk1fU1dfVEtJUF9FTkNSWV9FTnxaTV9TV19US0lQX0RFQ1JZX0VOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRG8gbm90IHN1cHBvcnQgVEtJUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5FbmFibGVIVCA9IDA7CisgICAgICAgICAgICAgICAgLy9wQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworCisgICAgICAgICAgICAgICAgLyogSWYgQVAgc3VwcG9ydHMgSFQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IE1QRFUgZGVuc2l0eSB0byA4IHVzKi8KKyAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT53cGFJZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgcEJzc0luZm8tPndwYUllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+d3BhSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFJZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCBwQnNzSW5mby0+cnNuSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5yc25JZVsxXSsyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJzbkllWzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvKiBjaGVjayBwcmVhbWJsZSBiaXQgKi8KKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9MT05HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF81OworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgODAyLjExbiA0ME1IeiBTZXR0aW5nICovCisgICAgICAgIGlmICgocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgJiYKKyAgICAgICAgICAgICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ID09IDEpIHx8IChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPT0gMykpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBwQnNzSW5mby0+ZW5hYmxlSFQ0MDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgPSBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayA4MDIuMTFIIHN1cHBvcnQgYml0ICovCisKKyAgICAgICAgLyogY2hlY2sgT3dsIEFwICovCisgICAgICAgIGlmICggcEJzc0luZm8tPmF0aE93bEFwICYgWk1fQklUXzAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGVuYWJsZSwgWk1fTUFDX1JFR19SRVRSWV9NQVgKKyAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIDAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBEaXNhYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDE7CisgICAgICAgICAgICAvKiBTZXQgTVBEVSBkZW5zaXR5IHRvIDggdXMqLworICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGRpc2FibGUsIFpNX01BQ19SRUdfUkVUUllfTUFYCisgICAgICAgICAgICAgICB3aWxsIGJlIHNldCB0byAzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6ZkhwRW5hYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlb3JkZXIgPSAxOworCisgICAgICAgIC8qIFNldCBNUERVIGRlbnNpdHkgKi8KKyAgICAgICAgemZIcFNldE1QRFVEZW5zaXR5KGRldiwgZGVuc2l0eSk7CisKKyAgICAgICAgLyogY2hlY2sgc2hvcnQgc2xvdCB0aW1lIGJpdCAqLworICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdICYgWk1fQklUXzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gfD0gWk1fQklUXzI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5lcnAgJiBaTV9CSVRfMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IFRSVUU7CisgICAgICAgICAgICB6ZkhwU2V0U2xvdFRpbWUoZGV2LCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9mZiIpOworICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBCc3NJbmZvLT5tYXJ2ZWxBcCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMDsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiA4NzAxIDogTmV0R2VhciAzNTAwIChNQVJWRUxMKQorICAgICAgICAgICAgICogRG93bmxpbmsgaXNzdWUgOiBzZXQgc2xvdHRpbWUgdG8gMjAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgbm90IGdvb2QgZm9yIGhlcmUgZG8gcmVzZXQgc2xvdCB0aW1lLgorICAgICAgICAgICAgICogSSB0aGluayBpdCBzaG91bGQgcmVzZXQgd2hlbiBsZWF2ZSBNQVJWRUxMIGFwCisgICAgICAgICAgICAgKiBvciBlbnRlciBkaXNjb25uZWN0IHN0YXRlIGV0Yy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lUmVnaXN0ZXIoZGV2LCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3RvcmUgcHJvYmUgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gcEJzc0luZm8tPmZyYW1lQm9keXNpemUgKyAxMjsKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisgICAgICAgIGZvciAoaz0wOyBrPDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICB9CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzhdID0gcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTBdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMF07CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzExXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdOworICAgICAgICBmb3IgKGs9MDsgazwod2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplIC0gMTIpOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2srMTJdID0gcEJzc0luZm8tPmZyYW1lQm9keVtrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkmJgorICAgICAgICAgICAgICgoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX09QRU4gKXx8CisgICAgICAgICAgICAgICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSl8fAorICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTykpICkKKyAgICAgICAgeyAgIC8qIHByaXZhY3kgZW5hYmxlZCAqLworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBZGFwdGVyIGlzIG5vIFdFUCwgdHJ5IHRvIGNvbm5lY3QgdG8gV0VQIEFQIik7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIG5vdCBzdXBwb3J0IFdFUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHNvZnR3YXJlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmb3IgV0VQICovCisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhRW5hYmxlU1dFbmNyeXB0aW9uKGRldiwgKFpNX1NXX1dFUF9FTkNSWV9FTnxaTV9TV19XRVBfREVDUllfRU4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIC8vd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgICAgICAvL3dkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTyApCisgICAgICAgICAgICB7IC8qIFRyeSB0byB1c2Ugb3BlbiBhbmQgc2hhcmVkLWtleSBhdXRoZWh0aWNhdGlvbiBhbHRlcm5hdGl2ZWx5ICovCisgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0VGltZW91dENvdW50ICUgMikgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZICkKKyAgICAgICAgICAgIHsgICAvKiBvcGVuICBvciBhdXRvICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9PUEVOICkKKyAgICAgICAgICAgIHsgICAvKiBzaGFyZWQga2V5ICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDEpIDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJJc1NoYXJlZEtleSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChwQnNzSW5mby0+c2VjdXJpdHlUeXBlID09IFpNX1NFQ1VSSVRZX1RZUEVfV1BBKXx8CisgICAgICAgICAgICAgICAgIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF80OworICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgV1BBIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSAoflpNX0JJVF80KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXV0aGVudGljYXRpb24gd2l0aCBvcGVuIHN5c3RlbSAqLworICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsIGRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUgKi8KKyAgICAgICAgLyoKKyAgICAgICAgaWYgKCAocEJzc0luZm8tPmJyb2FkY29tSFRBcCA9PSAxKQorICAgICAgICAgICAgICYmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHhhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEZXNpcmVkIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIGdvdG8gemxDb25uZWN0RmFpbGVkOworICAgIH0KKworCisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB6ZlN0YVN0YXJ0Q29ubmVjdENiKTsKKyAgICByZXR1cm47CisKK3psQ29ubmVjdEZhaWxlZDoKKyAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5ELCB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICByZXR1cm47Cit9CisKK3U4X3QgemZDaGVja1dQQUF1dGgoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1OF90ICAgcG1rQ291bnQ7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgICBlbmNBbGdvVHlwZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX1RLSVA7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX0FFUzsKKyAgICB9CisKKyAgICBzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+d3BhSWVbMV0gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBta0NvdW50ID0gcEJzc0luZm8tPndwYUllWzEyXTsKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBwbWtDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndwYUllWzE3ICsgNCppXSA9PSBlbmNBbGdvVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG1rQ291bnQgPSBwQnNzSW5mby0+cnNuSWVbOF07CisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcG1rQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxMyArIDQqaV0gPT0gZW5jQWxnb1R5cGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKwordThfdCB6ZkNoZWNrQXV0aGVudGljYXRpb24oemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1MTZfdCAgZW5jQWxnb1R5cGU7CisgICAgdTE2X3QgVW5pY2FzdENpcGhlck51bTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIENvbm5lY3RpbmcgdG8gQU5ZIGhhcyBiZWVuIGNoZWNrZWQgKi8KKyAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKwlzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKwkvL3N3aXRjaCh3ZC0+d3MuYXV0aE1vZGUpLy9RdWlja2x5IHJlYm9vdAorICAgIHsKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBX0FVVE86CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPOgorICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSAwOworICAgICAgICAgICAgaWYocEJzc0luZm8tPnJzbkllWzFdICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVW5pY2FzdENpcGhlck51bSA9IChwQnNzSW5mby0+cnNuSWVbOF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT5yc25JZVs5XSA8PCA4KTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgaWYgKFVuaWNhc3RDaXBoZXJOdW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY0FsZ29UeXBlID0gcEJzc0luZm8tPnJzbkllWzEzXTsKKyAgICAgICAgICAgICAgICAgICAgLy9lbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT5yc25JZVs3XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgaWk7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IGRlc2lyZWRDaXBoZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB1MTZfdCBJRU9mZlNldCA9IDEzOworCisgICAgICAgICAgICAgICAgICAgIC8qIEVudW1lcmF0ZSBhbGwgdGhlIHN1cHBvcnRlZCB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBVbmljYXN0Q2lwaGVyTnVtOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdID4gZGVzaXJlZENpcGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2lwaGVyID0gcEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSBkZXNpcmVkQ2lwaGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZW5jQWxnb1R5cGUgPT0gMHgwMiApCisgICAgICAgICAgICAgICAgeworICAgIAkJCSAgICB3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKworICAgIAkJCSAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihwQnNzSW5mby0+d3BhSWVbMV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbmljYXN0Q2lwaGVyTnVtID0gKHBCc3NJbmZvLT53cGFJZVsxMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT53cGFJZVsxM10gPDwgOCk7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgIGlmIChVbmljYXN0Q2lwaGVyTnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT53cGFJZVsxN107CisgICAgICAgICAgICAgICAgICAgIC8vZW5jQWxnb1R5cGUgPSBwQnNzSW5mby0+d3BhSWVbMTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZGVzaXJlZENpcGhlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IElFT2ZmU2V0ID0gMTc7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRW51bWVyYXRlIGFsbCB0aGUgc3VwcG9ydGVkIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IFVuaWNhc3RDaXBoZXJOdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF0gPiBkZXNpcmVkQ2lwaGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRDaXBoZXIgPSBwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IGRlc2lyZWRDaXBoZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBlbmNBbGdvVHlwZSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgCQkJICAgIHdkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworCisgICAgCQkJICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBX0FVVE8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL1pNX0FVVEhfTU9ERV9XUEFQU0tfQVVUTworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy9aTV9BVVRIX01PREVfV1BBUFNLX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9XUEFfTk9ORToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMjoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMlBTSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgIT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gemZDaGVja1dQQUF1dGgoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9PUEVOOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9BVVRPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndzY0llWzFdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBBUCBpcyBhIEp1bXBzdGFydCBBUCwgaXQncyBvayEhIFJheQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYWRhcHRlclN0YXRlID09IFpNX1NUQV9TVEFURV9DT05ORUNURUQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNEaXNjb25uZWN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKQoreworICAgIHU4X3QgcmV0ID0gVFJVRTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL2lmICggbmV3U3RhdGUgPT0gd2QtPnN0YS5hZGFwdGVyU3RhdGUgKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBGQUxTRTsKKyAgICAvL30KKworICAgIHN3aXRjaChuZXdTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCk7CisKKyAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdG9wIHRoZSBhY3Rpb24gb2YgY2hhbm5lbCBzY2FubmluZyAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0ID0gIFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICNpZiAxCisgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgYWN0aW9uIG9mIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIHJldCA9ICBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vaWYgKCByZXQgKQorICAgIC8veworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmFkYXB0ZXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHptX2RlYnVnX21zZzEoImNoYW5nZSBhZGFwdGVyIHN0YXRlID0gIiwgbmV3U3RhdGUpOworICAgIC8vfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhTW1BZGRJZVNzaWQgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTU0lEIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5zc2lkTGVuKTsKKworICAgIC8qIEluZm9ybWF0aW9uIDogU1NJRCAqLworICAgIGZvciAoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLnNzaWRbaV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YU1tQWRkSWVXcGEgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBKaS1IdWFuZyBMZWUgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4wMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit7CisgICAgdTMyX3QgIGk7CisgICAgdThfdCAgICBzc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVUkgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHcm91cCBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDUwLCAweGYyLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUEEgY2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgdThfdCAgICByc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogR3JvdXAgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUsIGRlZmF1bHQ9UFNLICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQVBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzE0LCB6Z1dwYUFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBzc24sIG9mZnNldCwgc3NuWzFdKzIpOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgc3NuLCBzc25bMV0rMik7CisgICAgICAgIG9mZnNldCArPSAoc3NuWzFdKzIpOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQSApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBLZXkgTWFuYWdlbWVudCBTdWl0ZSBieSBXUEEtUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShzc24rMjAsIHpnV3BhUmFkaXVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShzc24rMTQsIHpnV3BhQWVzT3VpLCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHNzbiwgb2Zmc2V0LCBzc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLndwYUllLCBzc24sIHNzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChzc25bMV0rMik7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzQsIHdkLT5zdGEucnNuSWUrNCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90Kikgd2QtPnN0YS5ic3NpZCwgNikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcnNuWzIyXSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgIHJzblsyM10gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5wbWtpZCwgMTYpOworCQkJICAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgcnNuLCBvZmZzZXQsIHJzblsxXSsyKTsKKyAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEucnNuSWUsIHJzbiwgcnNuWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHJzblsxXSsyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyICkKKyAgICB7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgd2QtPnN0YS5yc25JZSs0LCA0KTsKKyAgICAgICAgLyogT3ZlcndyaXRlIEtleSBNYW5hZ2VtZW50IFN1aXRlIGJ5IFdQQTItUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTYsIHpnV3BhMlJhZGl1c091aSwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgfHwgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEgKSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByc25bMjJdID0gMTsKKyAgICAgICAgICAgICAgICByc25bMjNdID0gMDsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBUaGUgY2FsbGVyIGlzIHJlc3Buc2libGUgdG8gZ2l2ZSB1cyB0aGUgcmVsZXZhbnQgUE1LSUQuCisgICAgICAgICAgICAgICAgICogIFdlJ2xsIG9ubHkgYWNjZXB0IDEgUE1LSUQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLCAodThfdCopIHdkLT5zdGEuYnNzaWQsIDYpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHJzbiwgb2Zmc2V0LCByc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCByc24sIHJzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChyc25bMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQWRkSWVJYnNzICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBJQlNTIHBhcmFtZXRlciB0byBidWZmZXIuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllSWJzcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9JQlNTKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIC8qIEFUSU0gd2luZG93ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5hdGltV2luZG93KTsKKyAgICBvZmZzZXQgKz0gMjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFBZGRJZVdtZUluZm8gICAgICAgICAgICovCisvKiAgICAgIEFkZCBXTUUgSW5mb3JtYXRpb24gRWxlbWVudCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmU3RhQWRkSWVXbWVJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IHFvc0luZm8pCit7CisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV0lGSV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgNyk7CisKKyAgICAvKiBPVUkgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg1MCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweEYyKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKworICAgIC8qIFFvUyBJbmZvICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBxb3NJbmZvKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllUG93ZXJDYXAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgUG93ZXIgY2FwYWJpbGl0eSB0byBidWZmZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDcuMTIgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVBvd2VyQ2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgTWF4VHhQb3dlcjsKKyAgICB1OF90IE1pblR4UG93ZXI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIE1pblR4UG93ZXIgPSAodThfdCkoemZIcEdldE1pblR4UG93ZXIoZGV2KS8yKTsKKyAgICBNYXhUeFBvd2VyID0gKHU4X3QpKHpmSHBHZXRNYXhUeFBvd2VyKGRldikvMik7CisKKyAgICAvKiBNaW4gVHJhbnNtaXQgUG93ZXIgQ2FwICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCBNaW5UeFBvd2VyKTsKKworICAgIC8qIE1heCBUcmFuc21pdCBQb3dlciBDYXAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KyssIE1heFR4UG93ZXIpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllU3VwcG9ydENoICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBzdXBwb3J0ZWQgY2hhbm5lbHMgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAyMDA3LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3VwcG9ydENoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIGNvdW50XzI0RyA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMDsKKyAgICB1MTZfdCAgY2hhbm5lbE51bTsKKyAgICB1OF90ICAgbGVuZ3RoOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgIHsgLy8gMi40SHoKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoID0gKHU4X3QpKGNvdW50XzVHICogMiArIDIpOyAvLzVHIGZpbGwgYnkgcGFpciwgMiw0RyAoY29udGludW91cyBjaGFubmVscykgZmlsbCAyIGJ5dGVzCisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBsZW5ndGgpOworCisgICAgLy8gMi40R0h6IChjb250aW51b3VzIGNoYW5uZWxzKQorICAgIC8qIEZpcnN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCAxKTsgLy9TdGFydCBmcm9tIGNoYW5ubGUgMQorICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY291bnRfMjRHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gNDAwMCAmJiB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgNTAwMCkKKyAgICAgICAgeyAvLyA1R0h6IDQwMDAgLTUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC00MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSA1MDAwKQorICAgICAgICB7IC8vIDVHSHogPjUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC01MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICB9CisgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCB6ZlN0YVN0YXJ0Q29ubmVjdENiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworfQorCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGJJc1NoYXJlZEtleSkKK3sKKyAgICB1MzJfdCBwMSwgcDI7CisgICAgdThfdCBuZXdDb25uU3RhdGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHAxX2xvdyA9IGFsZ29yaXRobSBudW1iZXIsIHAxX2hpZ2ggPSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBpZiAoIGJJc1NoYXJlZEtleSApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzE7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSIpOworICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19TSEFSRURfS0VZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU47CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiIpOworICAgICAgICBpZiggd2QtPnN0YS5sZWFwRW5hYmxlZCApCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19MRUFQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19PUEVOX1NZU1RFTTsKKyAgICB9CisKKyAgICAvKiBzdGF0dXMgY29kZSAqLworICAgIHAyID0gMHgwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gbmV3Q29ublN0YXRlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBzZW5kIHRoZSAxc3QgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHdkLT5zdGEuYnNzaWQsIHAxLCBwMiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZTZW5kTnVsbERhdGEoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBobGVuOworICAgIHUxNl90IGhlYWRlclsoMzQrOCsxKS8yXTsKKyAgICB1MTZfdCBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLDB4ZmZmZiwweGZmZmZ9OworICAgIHUxNl90ICpkc3RBZGRyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAwKTsKKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5sZW49IiwgYnVmLT5sZW4pOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IGJjYXN0QWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IHdkLT5zdGEuYnNzaWQ7CisgICAgfQorCisgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgeworICAgICAgICAvKiBJZiBjb25uZWN0IHRvIGEgV01NIEFQLCBTZW5kIFFvUyBOdWxsIGRhdGEgKi8KKyAgICAgICAgaGxlbiA9IHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgZHN0QWRkciwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBobGVuID0gemZUeEdlbk1tSGVhZGVyKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX05VTEwsIGRzdEFkZHIsIGhlYWRlciwgMCwgYnVmLCAwLCAwKTsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOyAvL1RPRFMgYml0CisgICAgfQorCisgICAgaWYgKCB0eXBlID09IDEgKQorICAgIHsKKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MTAwMDsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvKmluY3JlYXNlIHVuaWNhc3QgZnJhbWUgY291bnRlciovCisgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRQU1BvbGwoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIDApOworCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmxlbj0iLCBidWYtPmxlbik7CisKKyAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMLCB3ZC0+c3RhLmJzc2lkLCBoZWFkZXIsIDAsIGJ1ZiwgMCwgMCk7CisKKyAgICBoZWFkZXJbMF0gPSAyMDsKKyAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgIGhlYWRlcls1XSA9IHdkLT5zdGEuYWlkIHwgMHhjMDAwOyAvL0JvdGggYml0LTE0IGFuZCBiaXQtMTUgYXJlIDEKKyAgICBobGVuID0gMTYgKyA4OworCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRCQSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhcnRfc2VxLCB1OF90ICpiaXRtYXApCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisgICAgdTE2X3QgaSwgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgMTIpOyAvLyAyOCA9IEZDIDIgKyBEVSAyICsgUkEgNiArIFRBIDYgKyBCQUMgMiArIFNFUSAyICsgQml0TWFwIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyID0gQkFDIDIgKyBTRVEgMiArIEJpdE1hcCA4CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+bGVuPSIsIGJ1Zi0+bGVuKTsKKworICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9CQSwgd2QtPnN0YS5ic3NpZCwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworCisgICAgaGVhZGVyWzBdID0gMzI7IC8qIE1BQyBoZWFkZXIgMTYgKyBCQSBjb250cm9sIDIgKyBCQSBpbmZvIDEwICsgRkNTIDQqLworICAgIGhlYWRlclsxXSA9IDB4NDsgIC8qIE5vIEFDSyAqLworCisgICAgLyogc2VuZCBieSBPRkRNIDZNICovCisgICAgaGVhZGVyWzJdID0gKHUxNl90KSh6Y1JhdGVUb1BoeUN0cmxbNF0gJiAweGZmZmYpOworICAgIGhlYWRlclszXSA9ICh1MTZfdCkoemNSYXRlVG9QaHlDdHJsWzRdPj4xNikgJiAweGZmZmY7CisKKyAgICBobGVuID0gMTYgKyA4OyAgLyogTUFDIGhlYWRlciAxNiArIGNvbnRyb2wgOCovCisgICAgb2Zmc2V0ID0gMDsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDA1KTsgLypjb21wcmVzc2VkIGJpdG1hcCBvbiovCisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHN0YXJ0X3NlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGJpdG1hcFtpXSk7CisgICAgICAgIG9mZnNldCsrOworICAgIH0KKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuOworCit6bEVycm9yOgorCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFHZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpCit7CisgICAgdThfdCAgIGFkZHJbNl0sIGk7CisgICAgdThfdCAgIHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9NQUNfV09SRF9UT19CWVRFKG1hY0FkZHIsIGFkZHIpOworICAgICpwaHlDdHJsID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKy8vI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgLy9yYXRlID0gMjc7CisvLyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRyWzBdICYmIDB4MDEgPT0gMSApIC8vIFRoZSBkZWZhdWx0IGJlYWNvbiB0cmFuc21pdHRlZCByYXRlIGlzIENDSyBhbmQgMSBNYnBzICwgYnV0IHRoZSBhIG1vZGUgc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9GRE0gbW9kdWxhdGlvbiBhbmQgNk1icHMgdG8gdHJhbnNtaXQgYmVhY29uLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyAgICAgICAgICAgICAgICByYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbMF07CisgICAgICAgICAgICAgICAgKnBoeUN0cmwgPSB6Y1JhdGVUb1BoeUN0cmxbcmF0ZV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggemZNZW1vcnlJc0VxdWFsKGFkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlID0gKHU4X3QpemZSYXRlQ3RybEdldFR4UmF0ZShkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIHJjUHJvYmluZ0ZsYWcpOworICAgICAgICAgICAgICAgICpwaHlDdHJsID0gemNSYXRlVG9QaHlDdHJsW3JhdGVdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmU3RhR2V0UnhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qga2V5SW5kZXg7CisgICAgdThfdCBkYTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBpZiBuZWVkIG5vdCBjaGVjayBNSUMsIHJldHVybiBOVUxMICovCisgICAgaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgICAgICAgKHdkLT5zdGEud3BhU3RhdGUgPCBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKSApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSAmIDB4ODApID09IDB4ODApCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzUpOyAvKiBRb3MgUGFja2V0Ki8KKyAgICBlbHNlCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzMpOyAvKiBub3JtYWwgUGFja2V0Ki8KKyAgICBrZXlJbmRleCA9IChrZXlJbmRleCAmIDB4YzApID4+IDY7CisKKyAgICByZXR1cm4gKCZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZGV4XSk7Cit9CisKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIC8vaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgIC8vICAgICAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSB8fCAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoJndkLT5zdGEudHhNaWNLZXkpOworfQorCit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGZyYW1lVHlwZSwgZnJhbWVDdHJsOworICAgIHU4X3QgICBkYTA7CisgICAgLy91MTZfdCAgc2FbM107CisgICAgdTE2X3QgIHJldDsKKyAgICB1MTZfdCAgaTsKKyAgICAvL3U4X3QgICAgc2EwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAvL3NhMCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCk7CisKKyAgICBpZiAoICghemZTdGFJc0Nvbm5lY3RlZChkZXYpKSYmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9EQVRBX0JFRk9SRV9DT05ORUNURUQ7CisgICAgfQorCisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpJiYoKGZyYW1lVHlwZSAmIDB4ZikgPT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSApCisgICAgeworICAgICAgICAvKiBjaGVjayBCU1NJRCAqLworICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmlnIEVuZGlhbiBhbmQgTGl0dGxlIEVuZGlhbiBDb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICB1MTZfdCBtYWNbM107CisgICAgICAgICAgICBtYWNbMF0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFswXSk7CisgICAgICAgICAgICBtYWNbMV0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsxXSk7CisgICAgICAgICAgICBtYWNbMl0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsyXSk7CisgICAgICAgICAgICBpZiAoICF6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgKHU4X3QgKiltYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKy8qV2Ugd2lsbCBnZXQgbG90cyBvZiBnYXJiYWdlIGRhdGEsIGVzcGVjaWFsbHkgaW4gQUVTIG1vZGUuKi8KKy8qVG8gYXZvaWQgc2VuZGluZyB0b28gbWFueSBkZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyBpbiBTVEEgbW9kZSwgbWFyayBpdC4qLworI2lmIDAKKyAgICAgICAgICAgICAgICAvKiBJZiB1bmljYXN0IGZyYW1lLCBzZW5kIGRlYXV0aCB0byB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCBkYTAgJiAweDAxICkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qIElmIG11dGlsY2FzdCBhZGRyZXNzLCBkb24ndCBzZW5kIGRlYXV0aGVudGljYXRpb24qLworCQkJCQlpZiAoKCBzYTAgJiAweDAxICkgPT0gMCkKKwkgICAgICAgICAgICAgICAgICAJemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNhLCA3LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgIG1hY1swXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzBdKTsKKyAgICAgICAgICAgIG1hY1sxXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICAgICAgICAgIG1hY1syXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzJdKTsKKyAgICAgICAgICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCAqKW1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgIC8qIGNoZWNrIHNlY3VyaXR5IGJpdCAqLworICAgICAgICBpZiAoIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyAmJgorICAgICAgICAgICAgICh3ZC0+c3RhLndlcFN0YXR1cyAhPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApJiYKKyAgICAgICAgICAgICAoICEoZnJhbWVDdHJsICYgWk1fQklUXzYpICkgKQorICAgICAgICB7ICAgLyogc2VjdXJpdHkgb24sIGJ1dCBnb3QgZGF0YSB3aXRob3V0IGVuY3J5cHRpb24gKi8KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHJldCA9IFpNX0VSUl9EQVRBX05PVF9FTkNSWVBURUQ7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeERyb3BVbmVuY3J5cHRlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEud2VwU3RhdHVzICE9IFpNX0VOQ1JZUFRJT05fVEtJUCkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgIT0gWk1fRU5DUllQVElPTl9BRVMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBkYTA7CisgICAgdThfdCAgIG1pY05vdGlmeSA9IDE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlIDwgIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50Kys7CisKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIGZpcnN0IE1JQyBmYWlsdXJlIik7CisgICAgICAgIC8vemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfQ01fVElNRVIsIFpNX1RJQ0tfQ01fVElNRU9VVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX1RJTUVSLCBaTV9USUNLX0NNX1RJTUVPVVQgLSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMiApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIHNlY29uZCBNSUMgZmFpbHVyZSIpOworICAgICAgICAvKiByZXNlcnZlIDIgc2Vjb25kIGZvciBPUyB0byBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCB0byBBUCAqLworICAgICAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gd2QtPnN0YS5zc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5jbURpc2FsbG93U3NpZCwgd2QtPnN0YS5zc2lkLCB3ZC0+c3RhLnNzaWRMZW4pOworICAgICAgICAvL3dkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAtIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtaWNOb3RpZnkgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobWljTm90aWZ5ID09IDEpCisgICAgeworICAgICAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICBpZiAoIGRhMCAmIDB4MDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5KGRldiwgd2QtPnN0YS5ic3NpZCwgWk1fTUlDX0dST1VQX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkoZGV2LCB3ZC0+c3RhLmJzc2lkLCBaTV9NSUNfUEFJUldJU0VfRVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3U4X3QgemZTdGFCbG9ja1dsYW5TY2FuKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICByZXQ9RkFMU0U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCkKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBEaXNhYmxlQmVhY29uKGRldik7CisKKyAgICB3ZC0+ZHRpbSA9IDE7CisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdID0gMHgwMTsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gPSAweDAwOworICAgIC8qIDgwMi4xMWggKi8KKyAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUgfHwgd2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8qIHJlbGVhc2UgcXVldWVkIHBhY2tldHMgKi8KKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50OyBpKyspCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIHdkLT5zdGEuc3RhUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50ID0gMDsKKyAgICB3ZC0+c3RhLnN0YVBTRGF0YUNvdW50ID0gMDsKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnN0YS5zdGFQU0xpc3QsIHNpemVvZihzdHJ1Y3QgenNTdGFQU0xpc3QpKTsKKworICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgIHdkLT5zdGEucW9zSW5mbyA9IDA7CisgICAgemZRdWV1ZUZsdXNoKGRldiwgd2QtPnN0YS51YXBzZFEpOworCisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFJYnNzTW9uaXRvcmluZyh6ZGV2X3QqIGRldiwgdThfdCByZXNldCkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IG9wcG9zaXRlQ291bnQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGV2ZW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZTdGFJYnNzTW9uaXRvcmluZyAlZCIsIHdkLT5zdGEub3Bwb3NpdGVDb3VudCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKworICAgIGZvcihpPTA7IGkgPCBaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggb3Bwb3NpdGVDb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXR0aW5nIGFsaXZlIHRvICIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlcik7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyICE9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90Kil3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlci0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFJYnNzTW9uaXRvcmluZyByZW1vdmUgdGhlIHBlZXIgc3RhdGlvbiIpOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LmJzc2lkLCAodThfdCAqKSh3ZC0+c3RhLmJzc2lkKSwgNik7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoZXZlbnQucGVlck1hY0FkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpOworCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQtLTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMCwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitkb25lOgorICAgIGlmICggcmVzZXQgPT0gMCApCisgICAgeworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IsIFpNX1RJQ0tfSUJTU19NT05JVE9SKTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmSW5pdFBhcnRuZXJOb3RpZnlFdmVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7CisgICAgdTE2X3QgICpwZWVyTWFjQWRkcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBlZXJNYWNBZGRyID0gKHUxNl90ICopZXZlbnQtPnBlZXJNYWNBZGRyOworCisgICAgemZNZW1vcnlDb3B5KGV2ZW50LT5ic3NpZCwgKHU4X3QgKikod2QtPnN0YS5ic3NpZCksIDYpOworICAgIHBlZXJNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBwZWVyTWFjQWRkclsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCArIDIpOworICAgIHBlZXJNYWNBZGRyWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUICsgNCk7Cit9CisKK3ZvaWQgemZTdGFJbml0T3Bwb3NpdGVJbmZvKHpkZXZfdCogZGV2KQoreworICAgIGludCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKGk9MDsgaTxaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgfQorfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5jZW5jSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHdkLT5zdGEuY2VuY0llLCBvZmZzZXQsIHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3UxNl90IHpmU3RhUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeSwgYWN0aW9uRGV0YWlsczsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKyAgICBhY3Rpb25EZXRhaWxzID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgICAgICBjYXNlIDA6CQkvL1NwZWN0cnVtIE1hbmFnZW1lbnQKKwkgICAgICAgIHN3aXRjaChhY3Rpb25EZXRhaWxzKQorCSAgICAgICAgeworCSAgICAgICAgCWNhc2UgMDoJCQkvL01lYXN1cmVtZW50IFJlcXVlc3QKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAxOgkJCS8vTWVhc3VyZW1lbnQgUmVwb3J0CisJICAgICAgICAJCS8vUHJvY2Vzc0FjdGlvblNwZWN0cnVtRnJhbWVfTWVhc3VyZW1lbnRSZXBvcnQoQWRhcHRlcixwQWN0aW9uQm9keSszKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAyOgkJCS8vVFBDIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAzOgkJCS8vVFBDIHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAvL2lmICh3ZC0+c3RhLlRQQ0VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgemZTdGFVcGRhdGVEb3QxMUhUUEMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAljYXNlIDQ6CQkJLy9DaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVEb3QxMUhERlMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAlkZWZhdWx0OgorCSAgICAgICAgCQl6bV9kZWJ1Z19tc2cxKCJBY3Rpb24gRnJhbWUgY29udGFpbiBub3Qgc3VwcG9ydCBhY3Rpb24gZmllbGQgIiwgYWN0aW9uRGV0YWlscyk7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgfQorICAgICAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgkvL1FvcyBNYW5hZ2VtZW50CisgICAgICAgIAlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRGV0ZXJtaW5lIHRoZSB0aW1lIG5vdCBzZW5kIGJlYWNvbiAsIGlmIG1vcmUgdGhhbiBzb21lIHZhbHVlICwKKyAgIHJlLXdyaXRlIHRoZSBiZWFjb24gc3RhcnQgYWRkcmVzcyAqLwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnRpY2tJYnNzU2VuZEJlYWNvbisrOyAgICAvLyBJbmNyZWFzZSAxIHBlciAxMG1zIC4KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+dGlja0lic3NTZW5kQmVhY29uID09IDQwICkKKyAgICB7CisvLyAgICAgICAgRGJnUHJpbnQoIjIwMDcwNzI3Iik7CisgICAgICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworc3RydWN0IHpzVGtpcFNlZWQqIHpmU3RhR2V0UnhTZWVkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGtleUluZGV4OworICAgIHU4X3QgZGEwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIGlmICggKCh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSYmKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX0FFUykpfHwKKyAgICAgICAgICh3ZC0+c3RhLndwYVN0YXRlIDwgWk1fU1RBX1dQQV9TVEFURV9QS19PSykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKworICAgIGlmICgoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgJiAweDgwKSA9PSAweDgwKQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCs1KTsgLyogUW9zIFBhY2tldCovCisgICAgZWxzZQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCszKTsgLyogbm9ybWFsIFBhY2tldCovCisgICAga2V5SW5kZXggPSAoa2V5SW5kZXggJiAweGMwKSA+PiA2OworCisgICAgcmV0dXJuICgmd2QtPnN0YS5yeFNlZWRba2V5SW5kZXhdKTsKK30KKwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSA9IHZhbHVlOworICAgIHpmSHBTV0RlY3J5cHQoZGV2LCAxKTsKKyAgICB6ZkhwU1dFbmNyeXB0KGRldiwgMSk7Cit9CisKK3ZvaWQgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKHpkZXZfdCAqZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlID0gMDsKKyAgICB6ZkhwU1dEZWNyeXB0KGRldiwgMCk7CisgICAgemZIcFNXRW5jcnlwdChkZXYsIDApOworfQorCit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCkKK3sKKwl1OF90ICB3ZWlnaHRPZkIgICAgICAgICAgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHQmVsb3dUaHIgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHVXBUaHIgICAgID0gMTU7CisJdThfdCAgd2VpZ2h0T2ZOMjBCZWxvd1RociA9IDE1OworCXU4X3QgIHdlaWdodE9mTjIwVXBUaHIgICAgPSAzMDsKKwl1OF90ICB3ZWlnaHRPZk40MEJlbG93VGhyID0gMTY7CisJdThfdCAgd2VpZ2h0T2ZONDBVcFRociAgICA9IDMyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYoIGlzQk1vZGUgPT0gMCApCisgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZkIpOyAgICAvLyBwdXJlIGIgbW9kZSAsIGRvIG5vdCBhZGQgdGhlIHdlaWdodCB2YWx1ZSBmb3IgdGhpcyBBUCAhCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGlzSFQgPT0gMCAmJiBpc0hUNDAgPT0gMCApCisgICAgICAgIHsgLy8gYSAsIGcgLCBiL2cgbW9kZSAhIGFkZCB0aGUgd2VpZ2h0IHZhbHVlIDE1IGZvciB0aGlzIEFQIGlmIGl0J3Mgc2lnbmFsIHN0cmVuZ3RoIGlzIG1vcmUgdGhhbiBzb21lIHZhbHVlICEKKyAgICAgICAgICAgIGlmKCBzaWduYWxTdHJlbmd0aCA8IDE4ICkgLy8gLTc3IGRCbQorCQkJCXJldHVybiBzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mQUdCZWxvd1RocjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHNpZ25hbFN0cmVuZ3RoICsgd2VpZ2h0T2ZBR1VwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBpc0hUID09IDEgJiYgaXNIVDQwID09IDAgKQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSAyME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMjMgKSAvLyAtNzIgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjIwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk4yMFVwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGlzSFQgPT0gMSAmJiBpc0hUNDAgPT0gMQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSA0ME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMTYgKSAvLyAtNzkgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjQwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk40MFVwVGhyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordTE2X3QgemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCXUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jb2lkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDdmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCkBAIC0wLDAgKzEsMjY5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBPSUQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzICAgICAgKi8KKy8qICAgICAgUXVlcnkgT1dOIE1BQyBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IGZvciByZXR1cm4gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgYWRkclswXSA9ICh1OF90KSh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgIGFkZHJbMV0gPSAodThfdCkod2QtPm1hY0FkZHJbMF0gPj4gOCk7CisgICAgYWRkclsyXSA9ICh1OF90KSh3ZC0+bWFjQWRkclsxXSAmIDB4ZmYpOworICAgIGFkZHJbM10gPSAodThfdCkod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgYWRkcls0XSA9ICh1OF90KSh3ZC0+bWFjQWRkclsyXSAmIDB4ZmYpOworICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIGFkZHJbNV0gPSAodThfdCkod2QtPm1hY0FkZHJbMl0gPj4gOCk7CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBhZGRyWzVdID0gKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvLyBNdWx0aXBsZSBTU0lECisjZWxzZQorICAgICAgICBhZGRyWzVdID0gdmFwSWQgKyAxICsgKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3QoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3QqIHBCc3NMaXN0KQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwRHN0QnNzSW5mbzsKKyAgICB1OF90ICAgaTsKKyAgICB1OF90KiAgcE1lbUxpc3Q7CisgICAgdThfdCogIHBNZW1JbmZvOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHBNZW1MaXN0ID0gKHU4X3QqKSBwQnNzTGlzdDsKKyAgICBwTWVtSW5mbyA9IHBNZW1MaXN0ICsgc2l6ZW9mKHN0cnVjdCB6c0Jzc0xpc3QpOworICAgIHBCc3NMaXN0LT5oZWFkID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIHBEc3RCc3NJbmZvID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKyAgICBwQnNzTGlzdC0+YnNzQ291bnQgPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXBEc3RCc3NJbmZvLCAodThfdCopcEJzc0luZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgcERzdEJzc0luZm8tPm5leHQgPSBwRHN0QnNzSW5mbyArIDE7CisgICAgICAgICAgICBwRHN0QnNzSW5mbysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlCc3NMaXN0VjEoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3RWMSogYnNzTGlzdFYxKQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgLy9zdHJ1Y3QgenNCc3NJbmZvKiAgIHBEc3RCc3NJbmZvOworICAgIHU4X3QgICBpLCBqLCBiZHJvcCA9IDAsIGsgPSAwLCBTYW1lX0NvdW50ID0gMDsKKyAgICB1OF90ICAgYnNzaWRbNl07CisgICAgLy91OF90KiAgcE1lbUxpc3Q7CisgICAgLy91OF90KiAgcE1lbUluZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgYnNzTGlzdFYxLT5ic3NDb3VudCA9IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgWk1fTUFDX1dPUkRfVE9fQllURSh3ZC0+c3RhLmJzc2lkLCBic3NpZCk7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBiZHJvcCA9IDA7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkgKQorICAgICAgICB7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IGJzc2lkW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgICggKGogPT0gNikKKyAgICAgICAgICAgICAgICAgICYmKChwQnNzSW5mby0+c3NpZFsxXSA9PSB3ZC0+c3RhLnNzaWRMZW4pIHx8IChwQnNzSW5mby0+c3NpZFsxXSA9PSAwKSApJiYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gd2QtPmZyZXF1ZW5jeSkgKQorICAgICAgICAgICAgeworCQkJCWlmKHBCc3NJbmZvLT5zc2lkWzFdID09IDApCisJCQkJCXBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworCisJCQkJaWYoU2FtZV9Db3VudCA9PSAwKQorCQkJCXsvL0ZpcnN0IG1lZXQKKwkJCQkJU2FtZV9Db3VudCsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vc2FtZSBvbmUKKwkJCQkJYmRyb3AgPSAxOworCQkJCQlic3NMaXN0VjEtPmJzc0NvdW50LS07CisJCQkJfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmRyb3AgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90KikoJmJzc0xpc3RWMS0+YnNzSW5mb1trXSksICh1OF90KilwQnNzSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisJCQlpZihTYW1lX0NvdW50ID09IDEpCisJCQl7CisJCQkJemZNZW1vcnlDb3B5KCYoYnNzTGlzdFYxLT5ic3NJbmZvW2tdLnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisJCQkJU2FtZV9Db3VudCsrOworCQkJfQorCisJCQlrKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mbywgKHU4X3QgKikmd2QtPnN0YS5pYnNzQnNzRGVzYywgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlTdXBwb3J0TW9kZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN1cHBvcnRNb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSB7CisgICAgICAgIHJldCA9IHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEJzc0xpc3QgICAgICAgICAqLworLyogICAgICBGbHVzaCBCU1NJRCBMaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZmlXbGFuRmx1c2hCc3NMaXN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIENhbGwgemZCc3NJbmZvUmVmcmVzaCgpIHR3aWNlIHRvIHJlbW92ZSBhbGwgZW50cnkgKi8KKyAgICB6ZkJzc0luZm9SZWZyZXNoKGRldiwgMSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0V2xhbk1vZGUoemRldl90KiBkZXYsIHU4X3Qgd2xhbk1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndsYW5Nb2RlID0gd2xhbk1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT53cy5hdXRoTW9kZSA9IGF1dGhNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCB3ZXBTdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndlcFN0YXR1cyA9IHdlcFN0YXR1czsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldFNTSUQoemRldl90KiBkZXYsIHU4X3QqIHNzaWQsIHU4X3Qgc3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHNzaWRMZW5ndGggPD0gMzIgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IHNzaWRMZW5ndGg7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+d3Muc3NpZCwgc3NpZCwgc3NpZExlbmd0aCk7CisKKyAgICAgICAgaWYgKCBzc2lkTGVuZ3RoIDwgMzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+d3Muc3NpZFtzc2lkTGVuZ3RoXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0WzBdLnNzaWRMZW4gPSBzc2lkTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFswXS5zc2lkLCBzc2lkLCBzc2lkTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtpXS5zc2lkTGVuID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBmcmFnVGhyZXNob2xkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGZyYWdUaHJlc2hvbGQgPT0gMCkKKyAgICB7ICAgLyogZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZCAqLworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIH0KKyAgICBlbHNlIGlmIChmcmFnVGhyZXNob2xkIDwgMjU2KQorICAgIHsKKyAgICAgICAgLyogTWluaW11bSBmcmFnbWVudCB0aHJlc2hvbGQgKi8KKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyNTY7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYWdUaHJlc2hvbGQgPiAyMzQ2KQorICAgIHsKKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyMzQ2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IGZyYWdUaHJlc2hvbGQgJiAweGZmZmU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBydHNUaHJlc2hvbGQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnJ0c1RocmVzaG9sZCA9IHJ0c1RocmVzaG9sZDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9ICh1MTZfdCkgKGZyZXF1ZW5jeS8xMDAwKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmKCBmcmVxdWVuY3kgPT0gMCApCisgICAgICAgIHsgLy8gQXV0byBzZWxlY3QgY2xlYW4gY2hhbm5lbCBkZXBlbmQgb24gd2lyZWxlc3MgZW52aXJvbm1lbnQgIQorICAgICAgICAgICAgd2QtPndzLmF1dG9TZXRGcmVxdWVuY3kgPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxdWVuY3kvMTAwMCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB3ZC0+d3MuZGVzaXJlZEJzc2lkW2ldID0gYnNzaWRbaV07CisgICAgfQorICAgIHdkLT53cy5iRGVzaXJlZEJzc2lkID0gVFJVRTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgIGJlYWNvbkludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCAgIGJJbW1lZGlhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggYkltbWVkaWF0ZSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBiZWFjb25JbnRlcnZhbDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiB1cGRhdGUgYmVhY29uIGludGVydmFsIGhlcmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPndzLmJlYWNvbkludGVydmFsID0gYmVhY29uSW50ZXJ2YWw7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblNldER0aW1Db3VudCh6ZGV2X3QqIGRldiwgdThfdCAgZHRpbSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoZHRpbSA+IDApCisgICAgeworICAgICAgICB3ZC0+d3MuZHRpbSA9IGR0aW07CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbmRvdywgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBhdGltIHdpbmRvdyBoZXJlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0RW5jcnlNb2RlKHpkZXZfdCogZGV2LCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiBIb3N0YXBkIElzc3VlICovCisgICAgICAgIGlmICgod2QtPndzLmVuY3J5TW9kZSAhPSBaTV9BRVMpICYmICh3ZC0+d3MuZW5jcnlNb2RlICE9IFpNX1RLSVApKQorICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldERlZmF1bHRLZXlJZCh6ZGV2X3QqIGRldiwgdThfdCBrZXlJZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmtleUlkID0ga2V5SWQ7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcikKK3sKKyAgICB1OF90IGlzSW5zdGFsbGVkID0gMDsKKworI2lmIDEKKy8vI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgcmVzLCBwZWVySWR4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QgKilzdGFNYWNBZGRyLCAmcGVlcklkeCk7CisgICAgaWYoIHJlcyA9PSAwICkKKyAgICB7CisgICAgICAgIGlzSW5zdGFsbGVkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucGtJbnN0YWxsZWQ7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisvLyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gaXNJbnN0YWxsZWQ7Cit9CisKK3U4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKQoreworICAgIHUxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgdTMyX3QqIGtleTsKKyAgICB1OF90ICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgZW5jcnlUeXBlID0gWk1fTk9fV0VQOworI2VuZGlmCisgICAgdThfdCAgIG1pY0tleVsxNl07CisgICAgdTE2X3QgIGlkID0gMDsKKyAgICB1OF90ICAgdmFwSWQsIGksIGFkZHJbNl07CisgICAgdThfdCAgIHVzZXJJZHg9MDsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAvKiBEZXRlcm1pbmUgb3Bwb3NpdGUgZXhpc3Qgb3Igbm90ICovCisgICAgdThfdCAgIHJlcywgcGVlcklkeDsKKy8vICAgIHU4X3QgICB1c2VySWR4PTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuaWJzc1dwYTJQc2sgPT0gMSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopa2V5SW5mby5tYWNBZGRyLCAmcGVlcklkeCk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZXJJZHggPSBwZWVySWR4OworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5jYW1JZHggPT0gMHhmZiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uY2FtSWR4ID0gdXNlcklkeDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworI2VuZGlmCisKKyAgICBpZiAoIGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgKQorICAgIHsgICAvKiBzZXQga2V5IGJ5IGF1dGhlbnRpY2F0b3IgKi8KKyAgICAgICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGtleUluZm8ubWFjQWRkcikpID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBTVEEgaW4gdGhlIHN0YVRhYmxlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLml2MTYgPSAwOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gMDsKKworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDMyKQorICAgICAgICAgICAgeyAgIC8qIFRLSVAgKi8KKyAgICAgICAgICAgICAgICAvL3U4X3QgS2V5UnNjWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworCisgICAgICAgICAgICAgICAgLyogSW4gdGhlIGN1cnJlbnQgQVAgbW9kZSwgd2Ugc2V0IEtleVJzYyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgLy96ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0udHhTZWVkKSwgS2V5UnNjKTsKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikga2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0ucnhTZWVkKSwgS2V5UnNjKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiU2V0IENFTkMgcGFpcndpc2UgS2V5Iik7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9DRU5DOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMl0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBLZXkgSW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5jZW5jS2V5SWR4ID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX1RLSVA7CisKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KG1pY0tleSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSgmbWljS2V5WzhdLCAma2V5SW5mby5rZXlbMjRdLCA4KTsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopIG1pY0tleSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50YXRpb24sIHdlIHVzZSBzb2Z0d2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KSwgJihrZXlJbmZvLmtleVsxNl0pLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KSwgJihrZXlJbmZvLmtleVsyNF0pLCA4KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDE2KQorICAgICAgICAgICAgeyAgIC8qIEFFUyAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBLZXkgSW5mbyAqLworICAgICAgICAgICAgICAgIHpmQXBDbGVhclN0YUtleShkZXYsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDAsIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIHpmSHBTZXRBcFBhaXJ3aXNlS2V5KGRldiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSwgKHUzMl90Kikga2V5SW5mby5rZXksCisgICAgICAgICAgICAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0sIGlkKzEpOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHggPSBpZCArIDEgKyA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0dLKQorICAgICAgICB7CisgICAgICAgICAgICB2YXBJZCA9IGtleUluZm8udmFwSWQ7CisKKyAgICAgICAgICAgIHdkLT5hcC5pdjE2W3ZhcElkXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBJZF0gPSAwOworCisgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMzIpCisgICAgICAgICAgICB7ICAgLyogVEtJUCAqLworICAgICAgICAgICAgICAgIC8vdThfdCBLZXlSc2NbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICYod2QtPmFwLmJjU2VlZCksIEtleVJzYyk7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX0NFTkMsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IE1JQyBrZXkgdG8gSE1BQyAqLworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJihrZXlJbmZvLmtleVsxNl0pLCAmKHdkLT5hcC5iY01pY0tleVswXSkpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAxNikKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ1dZIC0gU2V0IEFFUyBHcm91cCBLZXkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgS2V5IEluZm8gKi8KKyAgICAgICAgICAgICAgICB6ZkFwQ2xlYXJTdGFLZXkoZGV2LCBicm9hZGNhc3QpOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgV0VQIGJpdCBpbiB0aGUgY2FwYWJpbGl0eSBmaWVsZCAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5jYXBhYlt2YXBJZF0gJj0gMHhmZmVmOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIFdFUCAqLworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDEzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDI1NjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uIGZvciBDQU0gbm90IHN1cHBvcnQgVkFQIHNlYXJjaAorICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCAwLCAwLCBlbmNyeU1vZGUsIGJyb2FkY2FzdCwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCB3ZC0+bWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCBrZXlJbmZvLnZhcEFkZHIsIGtleSk7CisgICAgICAgICAgICB6ZkhwU2V0QXBHcm91cEtleShkZXYsIHdkLT5tYWNBZGRyLCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgIGtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSwgdmFwSWQpOworCisgICAgICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBlbmNyeU1vZGUpOworICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgLyogc2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbdmFwSWRdID0gZW5jcnlNb2RlOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIG11bHRpY2FzdCBrZXkgaW5kZXggKi8KKyAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB3ZC0+YXAuYmNIYWxLZXlJZHhbdmFwSWRdID0gdmFwSWQgKyA2MDsKKworICAgICAgICAgICAgLyogVHVybiBvbiBXRVAgYml0IGluIHRoZSBjYXBhYmlsaXR5IGZpZWxkICovCisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWRdIHw9IDB4MTA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBzZXQgYnkgc3VwcGxpY2FudCAqLworCisgICAgICAgIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEsgKQorICAgICAgICB7ICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworCisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgJndkLT5zdGEudHhTZWVkLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAmd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8uaW5pdEl2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5pYnNzV3BhMlBzayA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB1bmljYXN0IC0tID4gcGFpcndpc2Uga2V5ICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNiA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYzMiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5wa0luc3RhbGxlZCA9IDE7CisjZWxzZQorICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuaXYzMiA9IDA7CisKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLnBrSW5zdGFsbGVkID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+bWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnR4U2VlZCwga2V5SW5mby5pbml0SXYpOworICAgICAgICAgICAgICAgIHpmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIHBhaXJ3aXNlIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlszXSA9IDB4NWMzNjVjMzY7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgS2V5IEluZGV4ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY2VuY0tleUlkID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fVEtJUDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzE2XSwgJndkLT5zdGEudHhNaWNLZXkpOworICAgICAgICAgICAgICAgICAgICB6Zk1pY1NldEtleSgma2V5SW5mby5rZXlbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2QtPnN0YS5yeE1pY0tleVtrZXlJbmZvLmtleUluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDE2ICkKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDAgKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuYnNzaWQsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIC8vemZIcFNldFN0YVBhaXJ3aXNlS2V5KGRldiwgd2QtPnN0YS5ic3NpZCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7IC8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4LCAgLy8ga2V5IGlkID09IDAgKCBQYWlyd2lzZSBrZXkgPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKWtleUluZm8ubWFjQWRkciwgICAvLyBSWCBuZWVkIFNvdXJjZSBBZGRyZXNzICggQWRkcmVzcyAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlUeXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaV0gPSB3ZC0+c3RhLmJzc2lkW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaSArIDFdID0gd2QtPnN0YS5ic3NpZFtpXSA+PiA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkhwU2V0UGVyVXNlcktleShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9VU0VSX0tFWV9QSywgICAvLyB1c2VyIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsLy8odThfdCAqKXdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEua2V5SWQgPSA0OworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8qIEJpZyBFbmRpYW4gYW5kIExpdHRsZSBFbmRpYW4gQ29tcGF0aWJpbGl0eSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyWzIgKiBpXSA9IHdkLT5zdGEuYnNzaWRbaV0gJiAweGZmOworICAgICAgICAgICAgICAgIGFkZHJbMiAqIGkgKyAxXSA9IHdkLT5zdGEuYnNzaWRbaV0gPj4gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1VTRVJfS0VZX1BLLCAgIC8vIHVzZXIgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwvLyh1OF90ICopd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICB3ZC0+c3RhLmtleUlkID0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfR0sgKQorICAgICAgICB7ICAgLyogc2V0IGdyb3VwIGtleSAqLworCisgICAgICAgICAgICB6ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywga2V5SW5mby52YXBBZGRyLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1RLSVA7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLnRrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggIShrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19JTklUX0lWKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0uaXYzMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgTUlDIGtleSB0byBITUFDICovCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMSwgWk1fVEtJUCwgYnJvYWRjYXN0LAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhNaWNLZXlba2V5SW5mby5rZXlJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7ICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8va2V5ID0gKHUzMl90Kikgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0udGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgLyogV0VQICovCisgICAgICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSA1ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMTMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMjkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDggKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMCwgZW5jcnlNb2RlLCBicm9hZGNhc3QsIGtleSk7CisgICAgICAgICAgICAvL3pmSHBTZXRTdGFHcm91cEtleShkZXYsIGJyb2FkY2FzdCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICAgICAgaWYgKCAoa2V5SW5mby5rZXlMZW5ndGg9PTE2KSAmJiAod2QtPnN0YS5pYnNzV3BhMlBzaz09MSkgKQorICAgICAgICAgICAgey8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXgsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHU4X3QgKilicm9hZGNhc3QsICAgICAgICAgICAgICAgICAgLy8gZm9yIG9ubHkgMiBzdGF0aW9ucyBJQlNTIG5ldHdybCAoIEEyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KilrZXlJbmZvLm1hY0FkZHIsICAgLy8gZm9yIG11bHRpcGxlICggPiAyICkgc3RhdGlvbnMgSUJTUyBuZXR3b3JrICggQTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QgKilicm9hZGNhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8ga2V5IGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKWJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvKiBsZWdhY3kgV0VQICovCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJsZWdhY3kgV0VQIik7CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlJbmRleCA+PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gNSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDY0Iik7CisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9XRVA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDEyOCIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+c3RhLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZm8ua2V5SW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYnJvYWRjYXN0IC0tID4gZ3JvdXAga2V5ICovCisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgaW5pdGlhbGl6ZSB3aGVuIHNldCBvdXIgZGVmYXVsdCBrZXkgISAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDI1NiIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgNjQsIDEsIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgd2QtPnN0YS5ic3NpZCwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJrZXkgPSAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBrZXlJbmZvLmtleUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigiIiwga2V5SW5mby5rZXlbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9mb3IgV0VQIGRlZmF1bHQga2V5IDF+MyBhbmQgQVRPTSBwbGF0Zm9ybS0tQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0hhbEtleUlkeFt2YXBJZF0gPSBrZXlJbmZvLmtleUluZGV4OworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5rZXlJZCA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB9CisKKwkJCWlmKGVuY3J5TW9kZSA9PSBaTV9US0lQKQorCQkJeworCQkJCWlmKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MSkKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogQ2FuY2VsIE9sZCBUaW1lciAiKTsKKwkJCQkJemZUaW1lckNhbmNlbChkZXYsCVpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IENyZWF0ZSBOZXcgVGltZXIgIik7CisJCQkJfQorCisJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDE7CisJCQkJemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRSwgMTUwKTsKKwkJCX0KKworCisKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0IGtleSAqLworICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUluZm8ua2V5SW5kZXgsIDAsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLCB3ZC0+c3RhLmJzc2lkLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgfHwKKyAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBrZXlJbmZvLmtleUluZGV4LCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7LyogSWYgbm90IEFFUy1DQ01QIGFuZCBpYnNzIG5ldHdvcmsgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0s7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXREZWZhdWx0S2V5KGRldiwga2V5SW5mby5rZXlJbmRleCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIC8qIFNhdmUga2V5IGZvciBzb2Z0d2FyZSBXRVAgKi8KKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53ZXBLZXlba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgdGhlIFNXRW5jcnlNb2RlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJbmZvLmtleUluZGV4XSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8vICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMTsKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIFBTRVVETyB0ZXN0ICovCit1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbykKK3sKKyAgICAvL3UxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgLy91MzJfdCoga2V5OworICAgIHU4X3QgICBtaWNLZXlbMTZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoIChrZXlJbmZvLmtleUxlbmd0aCkKKyAgICB7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVA2NCwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDEzOgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9XRVAxMjg7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVAxMjgsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAJY2FzZSAyOToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQga2V5ICovCisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMSwgWk1fV0VQMjU2LCAgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1dFUDI1NiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDE2OgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0FFUywgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMCwgWk1fQUVTLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgCWNhc2UgMzI6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGJvYXJkY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgICAgICAgICAgICAgdTE2X3QgQWRkcl9hW10gPSB7IDB4MDAwMCwgMHgwMDgwLCAweDA5MDF9OworICAgICAgICAgICAgICAgIHUxNl90IEFkZHJfYltdID0geyAweDAwMDAsIDB4MDA4MCwgMHgwOTAyfTsKKyAgICAgICAgICAgICAgICAvKiBDRU5DIHRlc3Q6IHVzZXIwLDEgYW5kIHVzZXIyIGZvciBib2FyZGNhc3QgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9hLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYSwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMSwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9iLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYiwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMiwgMSwgWk1fQ0VOQywgKHUxNl90ICopYm9hcmRjYXN0QWRkciwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAyLCAwLCBaTV9DRU5DLCAodTE2X3QgKilib2FyZGNhc3RBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAxLCBaTV9US0lQLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIG1pY0tleSk7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZpV2xhblNldFBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyNpZiAwCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wb3dlclNhdmVNb2RlID0gbW9kZTsKKworICAgIC8qIHNlbmQgbnVsbCBkYXRhIHdpdGggUHdyQml0IHRvIGluZm9ybSBBUCAqLworICAgIGlmICggbW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV2aWNlIGludG8gUFMgbW9kZSAqLworICAgICAgICB6ZlBTRGV2aWNlU2xlZXAoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKGRldiwgbW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1hY0FkZHJbMF0gPSBtYWNbMF07CisgICAgd2QtPm1hY0FkZHJbMV0gPSBtYWNbMV07CisgICAgd2QtPm1hY0FkZHJbMl0gPSBtYWNbMl07CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgMCk7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53bGFuTW9kZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZGFwdGVyU3RhdGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGF0ZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBdXRoZW50aWNhdGlvbk1vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdThfdCAgIGF1dGhNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9hdXRoTW9kZSA9IHdkLT5zdGEuYXV0aE1vZGU7CisgICAgICAgIGF1dGhNb2RlID0gd2QtPnN0YS5jdXJyZW50QXV0aE1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGF1dGhNb2RlOworfQorCit1OF90IHpmaVdsYW5RdWVyeVdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcikKK3sKKyAgICB1OF90IHdlcFN0YXR1czsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggYldyYXBwZXIgKQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPndzLndlcFN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPnN0YS53ZXBTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdlcFN0YXR1czsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90KiBwU3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5hcC5zc2lkTGVuWzBdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkWzBdLCB3ZC0+YXAuc3NpZExlblswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFNzaWRMZW5ndGggPSB3ZC0+YXAuc3NpZExlblt2YXBJZCArIDFdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkW3ZhcElkICsgMV0sIHdkLT5hcC5zc2lkTGVuW3ZhcElkICsgMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5zdGEuc3NpZExlbjsKKyAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5zdGEuc3NpZCwgd2QtPnN0YS5zc2lkTGVuKTsKKyAgICB9Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5mcmFnVGhyZXNob2xkOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSdHNUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5ydHNUaHJlc2hvbGQ7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeUZyZXF1ZW5jeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gKHdkLT5mcmVxdWVuY3kqMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHpmaVdsYW5RdWVyeUN1cnJlbnRGcmVxdWVuY3kKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgLSAgIDAgOiBubyB2YWxpZGF0ZSBjdXJyZW50IGZyZXF1ZW5jeQorICogICAtICg+MCk6IGN1cnJlbnQgZnJlcXVlbmN5IGRlcGVuZCBvbiAicW1vZGUiCisgKiBJbnB1dDoKKyAqICAgLSBxbW9kZToKKyAqICAgICAgMDogcmV0dXJuIHZhbHVlIGRlcGVuZCBvbiB0aGUgc3VwcG9ydCBtb2RlLCB0aGlzCisgICAgICAgICAgIHFtb2RlIGlzIHVzZSB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMworICogICAgICAxOiByZXR1cm4gdGhlIGFjdHVhbGx5IGN1cnJlbnQgZnJlcXVlbmN5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKQoreworICAgIHUzMl90IGZyZXF1ZW5jeTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAocW1vZGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaEdldExhc3Q1R2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIGZyZXF1ZW5jeSA9IHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKworICAgIHJldHVybiAoZnJlcXVlbmN5KjEwMDApOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXEpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdThfdCAgaTsKKyAgICB1MTZfdCBmcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxLzEwMDApOworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kgKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBCYW5kV2lkdGggIDA9PjIwICAxPT40MCAqLworLyogRXh0T2Zmc2V0ICAwPT4yMCAgMT0+aGlnaCBjb250cm9sIDQwICAgMz0+bG93IGNvbnRyb2wgNDAgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5RnJlcXVlbmN5SFQoemRldl90KiBkZXYsIHUzMl90ICpiYW5kV2lkdGgsIHUzMl90ICpleHRPZmZzZXQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKmJhbmRXaWR0aCA9IHdkLT5CYW5kV2lkdGg0MDsKKyAgICAqZXh0T2Zmc2V0ID0gd2QtPkV4dE9mZnNldDsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfbW9kZTsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5Q1dFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfZW5hYmxlOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKyAgICB1OF90ICAgYWRkcls2XTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYWRkcik7CisgICAgemZNZW1vcnlDb3B5KGJzc2lkLCBhZGRyLCA2KTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5iZWFjb25JbnRlcnZhbDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5UnhCZWFjb25Ub3RhbCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgd2QtPnN0YS5yeEJlYWNvblRvdGFsICs9IHdkLT5zdGEucnhCZWFjb25Db3VudDsKKworICAgIHJldHVybiB3ZC0+c3RhLnJ4QmVhY29uVG90YWw7Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgYXRpbVdpbmRvdzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyAgICByZXR1cm4gYXRpbVdpbmRvdzsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICByZXR1cm4gd2QtPmFwLmVuY3J5TW9kZVswXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBjYXBhYmlsaXR5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgY2FwYWJpbGl0eSA9IHdkLT5zdGEuY2FwYWJpbGl0eVswXSArCisgICAgICAgICAgICAgICAgICgoKHUxNl90KSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pIDw8IDgpOworCisgICAgcmV0dXJuIGNhcGFiaWxpdHk7CisKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWlkKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLmFpZDsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+YlJhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWJSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw4OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+Z1JhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWdSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmdSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlSc25JZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpCit7CisgICAgdThfdCBsZW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBsZW4gPSB3ZC0+c3RhLnJzbkllWzFdICsgMjsKKyAgICB6Zk1lbW9yeUNvcHkoaWUsIHdkLT5zdGEucnNuSWUsIGxlbik7CisgICAgKnBMZW5ndGggPSBsZW47Cit9CisKK3ZvaWQgemZpV2xhblF1ZXJ5V3BhSWUoemRldl90KiBkZXYsIHU4X3QqIGllLCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgbGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGVuID0gd2QtPnN0YS53cGFJZVsxXSArIDI7CisgICAgemZNZW1vcnlDb3B5KGllLCB3ZC0+c3RhLndwYUllLCBsZW4pOworICAgICpwTGVuZ3RoID0gbGVuOworCit9CisKK3U4X3QgemZpV2xhblF1ZXJ5TXVsdGljYXN0Q2lwaGVyQWxnbyh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucnNuSWVbN10gPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1RLSVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTSzoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBOgorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnJzbkllWzExXSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fVEtJUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICB9Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOkxlZ2FuY3ksIDE6TgorICAgIHJldHVybiB3ZC0+c3RhLkVuYWJsZUhUOworfQorCit1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOjIwTSwgMTo0ME0KKyAgICByZXR1cm4gd2QtPkJhbmRXaWR0aDQwOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSZWdpb25Db2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGU7Cit9Cit2b2lkIHpmaVdsYW5TZXRXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QgTGVuZ3RoKQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHptX2Fzc2VydChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSk7CisgICAgICAgIGlmIChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLndwYUxlblt2YXBJZF0gPSBMZW5ndGg7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPmFwLndwYUllW3ZhcElkXSwgaWUsIHdkLT5hcC53cGFMZW5bdmFwSWRdKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhTGVuID0gTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgaWUsIHdkLT5zdGEud3BhTGVuKTsKKyAgICB9CisgICAgLy96ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgIHsKKyAgICAgICAgd2QtPmFwLndwYVN1cHBvcnRbdmFwSWRdID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS53cGFTdXBwb3J0ID0gMTsKKyAgICB9CisKK30KKwordm9pZCB6ZmlXbGFuU2V0V3BhU3VwcG9ydCh6ZGV2X3QqIGRldiwgdThfdCBXcGFTdXBwb3J0KQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHdkLT5hcC53cGFTdXBwb3J0W3ZhcElkXSA9IFdwYVN1cHBvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhU3VwcG9ydCA9IFdwYVN1cHBvcnQ7CisgICAgfQorCit9CisKK3ZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBtb2RlOworICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgIH0KKworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIndkLT5wcm90ZWN0aW9uTW9kZT0iLCB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldEJhc2ljUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBiUmF0ZVNldCwgdThfdCBnUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBuUmF0ZVNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuYlJhdGVCYXNpYyA9IGJSYXRlU2V0OworICAgIHdkLT53cy5nUmF0ZUJhc2ljID0gZ1JhdGVTZXQ7CisgICAgd2QtPndzLm5SYXRlQmFzaWMgPSBuUmF0ZVNldDsKK30KKwordm9pZCB6ZmlXbGFuU2V0QkdNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmJnTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgemZpV2xhblNldHByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5wcmVhbWJsZVR5cGUgPSB0eXBlOworfQorCit1OF90IHpmaVdsYW5RdWVyeXByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPndzLnByZWFtYmxlVHlwZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlQb3dlclNhdmVNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGU7Cit9CisKK3U4X3QgemZpV2xhblNldFBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdTE2X3QqIGJzc2lkLCB1OF90KiBwbWtpZCkKK3sKKyAgICB1MzJfdCAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKSB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KikgYnNzaWQsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICB7CisgICAgICAgIC8qIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0ucG1raWQsIHBta2lkLCAxNik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggaSA8IFpNX1BNS0lEX01BWF9CU1NfQ05UICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkWzBdID0gYnNzaWRbMF07CisgICAgICAgICAgICB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWRbMV0gPSBic3NpZFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5ic3NpZFsyXSA9IGJzc2lkWzJdOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCBwbWtpZCwgMTYpOworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pCit7CisgICAgLy9zdHJ1Y3QgenNQbWtpZEluZm8qIHBQbWtpZEluZm8gPSAoIHN0cnVjdCB6c1Bta2lkSW5mbyogKSBidWY7CisgICAgdTMyX3QgIHNpemU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaXplID0gc2l6ZW9mKHUzMl90KSArCisgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgKiBzaXplb2Yoc3RydWN0IHpzUG1raWRCc3NpZEluZm8pOworCisgICAgaWYgKCBsZW4gPCBzaXplICkKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50OworICAgIH0KKworICAgIHpmTWVtb3J5Q29weShidWYsICh1OF90KikgJndkLT5zdGEucG1raWRJbmZvLCAodTE2X3QpIHNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZpV2xhblNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHU4X3QgICBiQWxsTXVsdGljYXN0ID0gMDsKKyAgICAvL3UzMl90ICB2YWx1ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplID0gc2l6ZTsKKyAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgcE1hY0xpc3RbaV0uYWRkciwgNik7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgYkFsbE11bHRpY2FzdCA9IDE7CisgICAgemZIcFNldE11bHRpY2FzdExpc3QoZGV2LCBzaXplLCBwTGlzdCwgYkFsbE11bHRpY2FzdCk7CisKK30KKwordm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpCit7CisgICAgdTE2X3QgIGZha2VNYWNBZGRyWzNdID0gezAsIDAsIDB9OworICAgIHUzMl90ICBmYWtlS2V5WzRdID0gezAsIDAsIDAsIDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBrZXlUeXBlID09IDAgKQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIFdFUCBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIFdFUCBrZXkiKTsKKyAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwKKyAgICAgICAgICAgICAgICAgWk1fTk9fV0VQLCBmYWtlTWFjQWRkciwgZmFrZUtleSk7CisgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgIH0KKyAgICBlbHNlIGlmICgga2V5VHlwZSA9PSAxICkKKyAgICB7CisgICAgICAgIC8qIHJlbW92ZSBwYWlyd2lzZSBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIHBhaXJ3aXNlIGtleSIpOworICAgICAgICB6ZkhwUmVtb3ZlS2V5KGRldiwgWk1fVVNFUl9LRVlfUEspOworICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIGdyb3VwIGtleSAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJyZW1vdmUgZ3JvdXAga2V5Iik7CisgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBaTV9VU0VSX0tFWV9HSyk7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKSBwRW50cnksICh1OF90KikgJndkLT5yZWd1bGF0aW9uVGFibGUsCisgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUpKTsKK30KKworLyogcGFyYW1ldGVyICJ0aW1lIiBpcyBzcGVjaWZpZWQgaW4gbXMgKi8KK3ZvaWQgemZpV2xhblNldFNjYW5UaW1lclBlckNoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IHRpbWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgic2NhbiB0aW1lIChtcykgPSAiLCB0aW1lKTsKKworICAgIHdkLT5zdGEuYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsID0gdGltZSAvIFpNX01TX1BFUl9USUNLOworfQorCit2b2lkIHpmaVdsYW5TZXRBdXRvUmVjb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gZW5hYmxlOworICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdEVuYWJsZWQgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUsIHU4X3QgdWFwc2RJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5zdGFXbWVFbmFibGVkID0gZW5hYmxlICYgMHgzOworICAgIGlmICgoZW5hYmxlICYgMHgyKSAhPSAwKQorICAgIHsKKyAgICAgICAgd2QtPndzLnN0YVdtZVFvc0luZm8gPSB1YXBzZEluZm8gJiAweDZmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+d3Muc3RhV21lUW9zSW5mbyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRBcFdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmFwV21lRW5hYmxlZCA9IGVuYWJsZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnl3bWVFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5zdGFXbWVFbmFibGVkOworfQorCit2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoKHNzaWRMZW4gPD0gMzIpICYmIChlbnRyeSA8IFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFKSkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbZW50cnldLnNzaWRMZW4gPSBzc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFtlbnRyeV0uc3NpZCwgc3NpZCwgc3NpZExlbik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5TZXREaXNhYmxlUHJvYmluZ1dpdGhTc2lkKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkID0gbW9kZTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZmlXbGFuU2V0RHJvcFVuZW5jcnlwdGVkUGFja2V0cyh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmRyb3BVbmVuY3J5cHRlZFBrdHMgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVJ4U2VjdXJpdHlDaGVja0NiKHpkZXZfdCogZGV2LCB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wU3RhUnhTZWN1cml0eUNoZWNrQ2IgPSBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NKb2luT25seSh6ZGV2X3QqIGRldiwgdThfdCBqb2luT25seSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuaWJzc0pvaW5Pbmx5ID0gam9pbk9ubHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlDb25maWdXZHNQb3J0ICAgICAgICAgICAgKi8KKy8qICAgICAgQ29uZmlndXJlIFdEUyBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHdkc1BvcnRJZCA6IFdEUyBwb3J0IElELCBzdGFydCBmcm9tIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogMD0+ZGlzYWJsZSBXRFMgcG9ydCwgMT0+ZW5hYmxlIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2RzQWRkciA6IFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVuY1R5cGUgOiBlbmNyeXB0aW9uIHR5cGUgZm9yIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB3ZHNLZXkgOiBlbmNyeXB0aW9uIGtleSBmb3IgV0RTIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpQ29uZmlnV2RzUG9ydCh6ZGV2X3QqIGRldiwgdThfdCB3ZHNQb3J0SWQsIHUxNl90IGZsYWcsIHUxNl90KiB3ZHNBZGRyLAorICAgICAgICB1MTZfdCBlbmNUeXBlLCB1MzJfdCogd2RzS2V5KQoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTMyX3Qga2V5WzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkc1BvcnRJZCA+IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfV0RTX1BPUlRfSUQ7CisgICAgfQorCisgICAgaWYgKGZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBXRFMgcG9ydCAqLworICAgICAgICB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVswXSA9IHdkc0FkZHJbMF07CisgICAgICAgIHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzFdID0gd2RzQWRkclsxXTsKKyAgICAgICAgd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMl0gPSB3ZHNBZGRyWzJdOworCisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwIHw9ICgxIDw8IHdkc1BvcnRJZCk7CisgICAgICAgIHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRJZF0gPSAodThfdCkgZW5jVHlwZTsKKworICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAxMCtaTV9NQVhfV0RTX1NVUFBPUlQsIDAsICh1OF90KSBlbmNUeXBlLCB3ZHNBZGRyLCB3ZHNLZXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIFdEUyBwb3J0ICovCisgICAgICAgIGFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IDA7CisgICAgICAgIGtleVswXSA9IGtleVsxXSA9IGtleVsyXSA9IGtleVszXSA9IDA7CisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwICY9ICh+KDEgPDwgd2RzUG9ydElkKSk7CisgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEwK1pNX01BWF9XRFNfU1VQUE9SVCwgMCwgWk1fTk9fV0VQLCBhZGRyLCBrZXkpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit2b2lkIHpmaVdsYW5RdWVyeUdTTih6ZGV2X3QqIGRldiwgdThfdCAqZ3NuLCB1MTZfdCB2YXBJZCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuIGZvciAzMiBiaXRzICovCisgICAgdHhpdlszXSA9IHdkLT5hcC50eGl2W3ZhcElkXVswXTsKKyAgICB0eGl2WzJdID0gd2QtPmFwLnR4aXZbdmFwSWRdWzFdOworICAgIHR4aXZbMV0gPSB3ZC0+YXAudHhpdlt2YXBJZF1bMl07CisgICAgdHhpdlswXSA9IHdkLT5hcC50eGl2W3ZhcElkXVszXTsKKworICAgIHpmTWVtb3J5Q29weShnc24sICh1OF90Kil0eGl2LCAxNik7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworLy9DV1lhbmcoKykKK3ZvaWQgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqYnVmZmVyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qQ2hhbmdlIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFZhbHVlIHRvIEh1bWFuIFNlbnNlIEhlcmUqLworCisgICAgYnVmZmVyWzBdID0gd2QtPlNpZ25hbFN0cmVuZ3RoOworICAgIGJ1ZmZlclsxXSA9IHdkLT5TaWduYWxRdWFsaXR5OworfQorCisvKiBPUy1YUCAqLwordTE2X3QgemZpU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQoreworICAgIHJldHVybiAgemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOworfQorCisvKiB6ZmlEZWJ1Z0NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgY21kICAgICAgIHZhbHVlLWRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAwICAgICAgIHNjaGVkdWxlIHRpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAxICAgICAgIGNhbmNlbCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDIgICAgICAgY2xlYXIgdGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDMgICAgICAgdGVzdCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNiAgICAgICBjaGVja3N1bSB0ZXN0ICAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNyAgICAgICBlbmFibGVQcm90ZWN0aW9uTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDggICAgICAgcnggcGFja2V0IGNvbnRlbnQgZHVtcCAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordTMyX3QgemZpRGVidWdDbWQoemRldl90KiBkZXYsIHUzMl90IGNtZCwgdTMyX3QgdmFsdWUpCit7CisgICAgdTE2X3QgZXZlbnQ7CisgICAgdTMyX3QgdGljazsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCBjbWQgPT0gMCApCisgICAgeyAgIC8qIHNjaGVkdWxlIHRpbWVyICovCisgICAgICAgIGV2ZW50ID0gKHUxNl90KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgIHRpY2sgPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgZXZlbnQsIHRpY2spOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDEgKQorICAgIHsgICAvKiBjYW5jZWwgdGltZXIgKi8KKyAgICAgICAgZXZlbnQgPSAodTE2X3QpICh2YWx1ZSAmIDB4ZmZmZik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBldmVudCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gMiApCisgICAgeyAgIC8qIGNsZWFyIHRpbWVyICovCisgICAgICAgIHpmVGltZXJDbGVhcihkZXYpOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDMgKQorICAgIHsgICAvKiB0ZXN0IHRpbWVyICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNCkKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCAxKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIDMpOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgNik7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNSApCisgICAgeworICAgICAgICB3ZC0+c3RhLmtleUlkID0gKHU4X3QpIHZhbHVlOworICAgIH0KKwllbHNlIGlmICggY21kID09IDYgKQorCXsKKwkgICAgLyogMDogbm9ybWFsICAgIDE6IGFsd2F5cyBzZXQgVENQL1VEUCBjaGVja3N1bSB6ZXJvICovCisgICAgICAgIHdkLT5jaGVja3N1bVRlc3QgPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA3ICkKKwl7CisgICAgICAgIHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSA9IHZhbHVlOworICAgCSAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJ3ZC0+ZW5hYmxlUHJvdGVjdGlvbk1vZGU9Iiwgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlKTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA4ICkKKwl7CisgICAgICAgIC8qIHJ4IHBhY2tldCBjb250ZW50IGR1bXAgKi8KKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cnhQYWNrZXREdW1wID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOworICAgICAgICB9CisJfQorCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQwordThfdCB6ZmlXbGFuU2V0Q2VuY1BhaXJ3aXNlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqdHhpdiwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX1BLOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1hY0FkZHJbaV0gPSB3ZC0+c3RhLmJzc2lkW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgLy93ZC0+c3RhLnR4aXZbMF0gPSB0eGl2WzBdOworICAgIC8vd2QtPnN0YS50eGl2WzFdID0gdHhpdlsxXTsKKyAgICAvL3dkLT5zdGEudHhpdlsyXSA9IHR4aXZbMl07CisgICAgLy93ZC0+c3RhLnR4aXZbM10gPSB0eGl2WzNdOworICAgIC8vCisgICAgLy93ZC0+c3RhLnJ4aXZbMF0gPSByeGl2WzBdOworICAgIC8vd2QtPnN0YS5yeGl2WzFdID0gcnhpdlsxXTsKKyAgICAvL3dkLT5zdGEucnhpdlsyXSA9IHJ4aXZbMl07CisgICAgLy93ZC0+c3RhLnJ4aXZbM10gPSByeGl2WzNdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldENlbmNHcm91cEtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzZdID0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX0dLOworICAgIGtleUluZm8udmFwSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGtleUluZm8udmFwQWRkcltpXSA9IHdkLT5tYWNBZGRyW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAoKHJ4aXZbM10gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlszXSAmIDB4RkYpIDw8IDI0KTsKKyAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9ICgocnhpdlsyXSA+PiAyNCkgJiAweEZGKQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiAxNikgJiAweEZGKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiA4KSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICsgKChyeGl2WzJdICYgMHhGRikgPDwgMjQpOworICAgIHdkLT5zdGEucnhpdkdLWzJdID0gKChyeGl2WzFdID4+IDI0KSAmIDB4RkYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDE2KSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDgpICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKHJ4aXZbMV0gJiAweEZGKSA8PCAyNCk7CisgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAoKHJ4aXZbMF0gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlswXSAmIDB4RkYpIDw8IDI0KTsKKworICAgIHdkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfQ0VOQzsKKyAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9DRU5DOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCit1OF90IHpmaVdsYW5TZXREb3QxMURNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdThfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iODAyXzExRCA9IG1vZGU7CisgICAgaWYgKG1vZGUpIC8vRW5hYmxlIDgwMi4xMWQKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5PX0VOVU1SRDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworICAgIH0KKyAgICBlbHNlIC8vRGlzYWJsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZmlXbGFuU2V0RG90MTFIREZTTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWggREZTIik7CisKKyAgICAvLyBUT0RPIDogREZTIEVuYWJsZSBpbiA1MjUwIHRvIDUzNTAgTUh6IGFuZCA1NDcwIHRvIDU3MjUgTUh6IC4KKyAgICAvL2lmICggQWRhcHRlci0+WkQ4MDIxMUhTdXBwb3J0ICYmCisgICAgLy8gICBBZGFwdGVyLT5DYXJkU2V0dGluZy5OZXR3b3JrVHlwZUluVXNlID09IE5kaXM4MDJfMTFPRkRNNSAmJgorICAgIC8vICAgKChDaGFubmVsTm8gPj01MiAmJiBDaGFubmVsTm8gPD0gNjQpCXx8CQkJCS8vNTI1MH41MzUwIE1IWgorICAgIC8vICAgIChDaGFubmVsTm8gPj0xMDAgJiYgQ2hhbm5lbE5vIDw9IDE0MCkpKSAJCQkvLzU0NzB+NTcyNSBNSFoKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9VFJVRTsKKyAgICAvL30KKyAgICAvL2Vsc2UKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9RkFMU0U7CisgICAgLy99CisKKyAgICB3ZC0+c3RhLkRGU0VuYWJsZSA9IG1vZGU7CisgICAgaWYgKG1vZGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKyAgICBlbHNlCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSAoflpNX0JJVF8wKTsKKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaVdsYW5TZXREb3QxMUhUUENNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy8gVE9ETyA6IFRQQyBFbmFibGUgaW4gNTE1MH41MzUwIE1IeiBhbmQgNTQ3MH41NzI1TUh6LgorICAgIC8vaWYgKCBBZGFwdGVyLT5aRDgwMjExSFN1cHBvcnQgJiYKKyAgICAvLyAgIEFkYXB0ZXItPkNhcmRTZXR0aW5nLk5ldHdvcmtUeXBlSW5Vc2UgPT0gTmRpczgwMl8xMU9GRE01ICYmCisgICAgLy8gICAoKENoYW5uZWxObyA9PSAzNiB8fCBDaGFubmVsTm8gPT0gNDAgfHwgQ2hhbm5lbE5vID09IDQ0IHx8IENoYW5uZWxObyA9PSA0OCkgfHwJLy81MTUwfjUyNTAgTUhaICwgTm90IEphcGFuCisgICAgLy8gICAgKENoYW5uZWxObyA+PTUyICYmIENoYW5uZWxObyA8PSA2NCkgfHwJCQkJLy81MjUwfjUzNTAgTUhaCisgICAgLy8gICAgKENoYW5uZWxObyA+PTEwMCAmJiBDaGFubmVsTm8gPD0gMTQwKSkpIAkJCS8vNTQ3MH41NzI1IE1IWgorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1UUlVFOworICAgIC8vfQorICAgIC8vZWxzZQorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1GQUxTRTsKKyAgICAvL30KKworICAgIHdkLT5zdGEuVFBDRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdIHw9IFpNX0JJVF8wOworICAgIGVsc2UKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdICY9ICh+Wk1fQklUXzApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldEFuaU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+YW5pRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgemZIcEFuaUF0dGFjaChkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9PU19MSU5VWF9GVU5DCit2b2lkIHpmaVdsYW5TaG93VGFsbHkoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVW5kZXJydW5DbnQgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1VuZGVycnVuQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19Ub3RhbFJ4RnJtICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVG90YWxSeEZybSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfQ1JDMzJDbnQgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19DUkMxNkNudCAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9VTkkgID0gIiwgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhGSUZPT3ZlcnJ1bik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX011bCAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1JldHJ5Q250ICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVG90YWxUeEZybSAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0pOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFRpbWVPdXQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlR4X01QRFUgICAgICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5UeF9NUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJCQV9GYWlsICAgICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuQkFfRmFpbCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVHhfQU1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19UeF9NUERVICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVSk7CisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeE1QRFUgICAgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeERlbE1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeU1pc2NFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5T0ZETUVycm9yICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlPRkRNRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5Q0NLRXJyb3IgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlDQ0tFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5VG90YWxDb3VudCA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlUb3RhbENvdW50KTsKKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5LlR4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSkpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2dfcCgiQkEgRmFpbCBSYXRpbyglKSAgPSAiLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwgKiAxMDAsCisgICAgICAgICAgICAgICAgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCArIHdkLT5jb21tVGFsbHkuVHhfTVBEVSkpOworICAgIH0KKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgPT0gMCkpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnX3AoIkF2ZyBBZ2cgTnVtYmVyICAgID0gIiwKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUsIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIHpmaVdsYW5TZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90IHBvd2VyMiwgdThfdCBwb3dlcjUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPm1heFR4UG93ZXIyID0gcG93ZXIyOworICAgIHdkLT5tYXhUeFBvd2VyNSA9IHBvd2VyNTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgKnBvd2VyMiwgdThfdCAqcG93ZXI1KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICpwb3dlcjIgPSB3ZC0+bWF4VHhQb3dlcjI7CisgICAgKnBvd2VyNSA9IHdkLT5tYXhUeFBvd2VyNTsKK30KKwordm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+Y29ubmVjdE1vZGUgPSBtb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFN1cHBvcnRNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5hZGhvY01vZGUgPSBtb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlBZGhvY01vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdTMyX3QgYWRob2NNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d3MuYWRob2NNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d2ZjLmJJYnNzR01vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGFkaG9jTW9kZTsKK30KKworCit1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKQoreworICAgIHU4X3QgYnVmWzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChsZW5ndGggPT0gNCkKKyAgICB7CisgICAgICAgIGJ1ZlsyXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGNvdW50cnlJc29OYW1lWzJdOworICAgICAgICBidWZbM10gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gPSBjb3VudHJ5SXNvTmFtZVsxXTsKKyAgICAgICAgYnVmWzRdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzJdID0gY291bnRyeUlzb05hbWVbMF07CisgICAgfQorICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAzKQorICAgIHsKKyAgICAgICAgYnVmWzJdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzBdID0gY291bnRyeUlzb05hbWVbMV07CisgICAgICAgIGJ1ZlszXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVsxXSA9IGNvdW50cnlJc29OYW1lWzBdOworICAgICAgICBidWZbNF0gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21JU08oZGV2LCBidWYsIGxlbmd0aCk7Cit9CisKKworY29uc3QgY2hhciogemZpV2xhblF1ZXJ5Q291bnRyeUlzb05hbWUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5jb3VudHJ5SXNvTmFtZTsKK30KKworCisKK3ZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChDQ1MpCisgICAgeworICAgICAgICAvKiBSZXNldCBSZWd1bGF0aW9uIFRhYmxlIGJ5IENvdW50cnkgQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgUmVndWxhdGlvbiBUYWJsZSBieSBSZWdpb24gQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb2RlKTsKKyAgICB9CisKKyAgICBpZiAoYmZpcnN0Q2hhbm5lbCkgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsIE5VTEwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3koZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKyAgICB9Cit9CisKKworY29uc3QgY2hhciogemZpSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgcmV0dXJuIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoZGV2LCByZWdpb25Db2RlKTsKK30KKwordTE2X3QgemZpV2xhbkNoYW5uZWxUb0ZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdThfdCBjaGFubmVsKQoreworICAgIHJldHVybiB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7Cit9CisKK3U4X3QgemZpV2xhbkZyZXF1ZW5jeVRvQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGlzNUdCYW5kID0gMDsKKworICAgIHJldHVybiB6ZkNoRnJlcVRvTnVtKGZyZXEsICZpczVHQmFuZCk7Cit9CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKQoreworICAgIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbChkZXYsIGRpc2FibGVGbGFnKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZpV2xhblNldExFREN0cmxQYXJhbSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlLCB1OF90IGZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsVHlwZSA9IHR5cGU7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgID0gZmxhZzsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5FbmFibGVMZWFwQ29uZmlnKHpkZXZfdCogZGV2LCB1OF90IGxlYXBFbmFibGVkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubGVhcEVuYWJsZWQgPSBsZWFwRW5hYmxlZDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5SHdDYXBhYmlsaXR5KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZkhwQ2FwYWJpbGl0eShkZXYpOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlSZWNlaXZlZFBhY2tldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5SZWNlaXZlZFBrdFJhdGVQZXJTZWNvbmQ7Cit9CisKK3ZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgemZIcFNXRGVjcnlwdChkZXYsIDEpOworICAgIH0KK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWxsb3dDaGFubmVscyh6ZGV2X3QqIGRldiwgdTE2X3QgKmNoYW5uZWxzKQoreworICAgIHUxNl90IGlpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHNbaWldID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaWldLmNoYW5uZWw7CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OworfQorCit2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSB2YWw7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJ3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSAiLCB3ZC0+ZHluYW1pY1NJRlNFbmFibGUpCit9CisKK3UxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOworfQorCit2b2lkIHpmaVdsYW5HZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90KiBwTUNMaXN0KQoreworICAgIHN0cnVjdCB6c011bHRpY2FzdEFkZHIqIHBNYWNMaXN0ID0gKHN0cnVjdCB6c011bHRpY2FzdEFkZHIqKSBwTUNMaXN0OworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoIGk9MDsgaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weShwTWFjTGlzdFtpXS5hZGRyLCB3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLCA2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKQoreworICAgIHU4X3QgIGJBbGxNdWx0aWNhc3QgPSAwOworICAgIHUzMl90IG9sZEZpbHRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9sZEZpbHRlciA9IHdkLT5zdGEub3NSeEZpbHRlcjsKKworICAgIHdkLT5zdGEub3NSeEZpbHRlciA9IFBhY2tldEZpbHRlcjsKKworICAgIGlmICgob2xkRmlsdGVyICYgWk1fUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkgIT0KKyAgICAgICAgKHdkLT5zdGEub3NSeEZpbHRlciAmIFpNX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgICAgIGJBbGxNdWx0aWNhc3QgPSAxOworICAgICAgICB6ZkhwU2V0TXVsdGljYXN0TGlzdChkZXYsIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHIsIGJBbGxNdWx0aWNhc3QpOworICAgIH0KK30KKwordThfdCB6ZmlDb21wYXJlV2l0aE11bHRpY2FzdExpc3RBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0TWFjQWRkcikKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBiSXNJbk1DTGlzdEFkZHIgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yICggaT0wOyBpPHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOyBpKysgKQorICAgIHsKKyAgICAJaWYgKCB6ZndNZW1vcnlJc0VxdWFsKCh1OF90Kilkc3RNYWNBZGRyLCAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHJbaV0uYWRkciwgNikgKQorICAgIAl7CisgICAgICAgICAgICBiSXNJbk1DTGlzdEFkZHIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgCX0KKyAgICB9CisKKyAgICByZXR1cm4gYklzSW5NQ0xpc3RBZGRyOworfQorCit2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iU2FmZU1vZGUgPSBzYWZlTW9kZTsKKworICAgIGlmICggc2FmZU1vZGUgKQorICAgIAl6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbihkZXYsIDEpOworICAgIGVsc2UKKyAgICAgICAgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCB1OF90KiBpYnNzQWRkaXRpb25hbElFKQoreworCXptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCWlmICggaWJzc0FkZGl0aW9uYWxJRVNpemUgKQorICAgIHsKKwkgICAgd2QtPnN0YS5pYnNzQWRkaXRpb25hbElFU2l6ZSA9IGlic3NBZGRpdGlvbmFsSUVTaXplOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5pYnNzQWRkaXRpb25hbElFLCBpYnNzQWRkaXRpb25hbElFLCAodTE2X3QpaWJzc0FkZGl0aW9uYWxJRVNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgCXdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVNpemUgPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3ByZWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0NQUkVDT01QX0gKKyNkZWZpbmUgX0NQUkVDT01QX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorI2luY2x1ZGUgIi4uL29hbF9tYXJjLmgiCisjaW5jbHVkZSAicHViX3pmaS5oIgorI2luY2x1ZGUgInB1Yl96ZncuaCIKKyNpbmNsdWRlICJwdWJfdXNiLmgiCisjaW5jbHVkZSAid2xhbi5oIgorI2luY2x1ZGUgInN0cnVjdC5oIgorI2luY2x1ZGUgImNmdW5jLmgiCisjaW5jbHVkZSAiY2FnZy5oIgorI2luY2x1ZGUgImN3bS5oIgorI2luY2x1ZGUgInBlcmZvcm1hbmNlLmgiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3BzbWdyLmMKQEAgLTAsMCArMSw3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKiAgVGhlIHBvd2VyIHNhdmluZyBtYW5hZ2VyIGlzIHRvIHNhdmUgdGhlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICogIEdlbmVyYWxseSBzcGVha2luZywgaXQgY29udHJvbHM6CisgICoKKyAgKiAgICAgICAgIC0gd2hlbiB0byBzbGVlcAorICAqICAgICAgICAgLQorICAqCisgICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPSBaTV9TVEFfUFNfTk9ORTsKKyAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICB3ZC0+c3RhLnBzTWdyLmlzU2xlZXBBbGxvd2VkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLm1heFNsZWVwUGVyaW9kcyA9IDE7CisgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgd2QtPnN0YS5wc01nci5zbGVlcEFsbG93ZWR0aWNrID0gMDsKK30KKworc3RhdGljIHUxNl90IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoemRldl90KiBkZXYsIHU4X3QgKmlzV2FrZVVwUmVxdWlyZWQpCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICppc1dha2VVcFJlcXVpcmVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqaXNXYWtlVXBSZXF1aXJlZCA9IDE7Cit6bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHNOb25lOiBXYWtlIHVwIG5vd1xuIik7CisgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEgc2VuZCBOdWxsIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIC8vemZTZW5kTnVsbERhdGEoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQczogUHJlcGFyZSB0byBzbGVlcC4uLlxuIik7CisgICAgICAgICAgICAvL3dkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1NMRUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc2VuZE51bGwgPSAwOworICAgIHU4X3QgaXNXYWtlVXBSZXF1aXJlZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzEoIm1vZGUgPSAiLCBtb2RlKTsKKworICAgIGlmIChtb2RlID4gWk1fU1RBX1BTX0xJR0hUKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIC0gd3JvbmcgcG93ZXIgc2F2ZSBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgI2lmIDEKKyAgICBzd2l0Y2gobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBzZW5kTnVsbCA9IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoZGV2LCAmaXNXYWtlVXBSZXF1aXJlZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzID0gMTsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgd2QtPnN0YS5wc01nci5tYXhTbGVlcFBlcmlvZHMgPSBaTV9QU19NQVhfU0xFRVBfUEVSSU9EUzsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICNlbHNlCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBpZiAoIG1vZGUgIT0gWk1fU1RBX1BTX05PTkUgKQorICAgICAgICAgICAgeworem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNldE1vZGU6IHN3aXRjaCBmcm9tIFpNX1BTX01TR19TVEFURV9BQ1RJVkUgdG8gWk1fUFNfTVNHX1NUQVRFX1QxXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFsbCB0aGUgVFggJiBzdGFydCB0byB3YWl0IHRoZSBwZW5kaW5nIFRYIHRvIGJlIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggaXNXYWtlVXBSZXF1aXJlZCApCisgICAgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAwKTsKKyAgICAgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB9CisKKyAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KQorICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgeworICAgICAgICBzd2l0Y2gobW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTk9ORToKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDEsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbmROdWxsID09IDEpCisgICAgeworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggKHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCAhPSAxKSYmCisgICAgICAgICAod2QtPnN0YS5wc01nci5sYXN0VHhVbmljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtIHx8CisgICAgICAgICAgd2QtPnN0YS5wc01nci5sYXN0VHhCcm9hZGNhc3RGcm0gIT0gd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdEZybSB8fAorICAgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RGcm0pICkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4VW5pY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtOworICAgICAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtID0gd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgdHggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSXNWdHhxRW1wdHkoZGV2KSA9PSBGQUxTRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJWdHhRIGlzIGVtcHR5IG5vdy4uLkNoZWNrIGlmIEhBTCBUWFEgaXMgZW1wdHlcbiIpOworCisgICAgLy8gVGhlIHRoZSBIQUwgVFggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSAhPSB6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJIQUwgVFhRIGlzIGVtcHR5IG5vdy4uLkNvdWxkIGdvIHRvIHNsZWVwLi4uXG4iKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2spIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2stLTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDI7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy8gU2VuZCB0aGUgTnVsbCBwa3QgdG8gQVAgdG8gbm90aWZ5IHRoYXQgSSdtIGdvaW5nIHRvIHNsZWVwCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxIHNlbmQgTnVsbCBkYXRhXG4iKTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUChkZXYpOworICAgIH0KKworICAgIC8vIFN0YWxsIHRoZSBUWCBub3cKKyAgICAvLyB6ZlR4RW5naW5lU3RvcChkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIE51bGwgcGt0IGlzIHRyYW5zbWl0dGVkCisgICAgaWYgKCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgIT0gemZIcEdldE1heFR4ZENvdW50KGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnN0YS5wc01nci5zdGF0ZSA9IFpNX1BTX01TR19TVEFURV9TTEVFUDsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeFVuaWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybTsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgd2QtPnN0YS5wc01nci5sYXN0VHhNdWx0aWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvLyBMZXQgQ0hJUCBzbGVlcCBub3cKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyIHp6enouLi4uXG4iKTsKKyAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAxKTsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworfQorCit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNTbGVlcGluZyA9IEZBTFNFOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPT0gWk1fUFNfTVNHX1NUQVRFX1NMRUVQIHx8CisgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID09IFpNX1BTX01TR19TVEFURV9UMikKKyAgICB7CisgICAgICAgIGlzU2xlZXBpbmcgPSBUUlVFOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiBpc1NsZWVwaW5nOworfQorCitzdGF0aWMgdThfdCB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICYmIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGluZyhkZXYpICkKKyAgICB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljaykgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljay0tOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlzSWRsZSA9IDE7CisKK2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZJc1Z0eHFFbXB0eShkZXYpID09IEZBTFNFICkKKyAgICB7CisgICAgICAgIGlzSWRsZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGlzSWRsZTsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpc0lkbGUgPSB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKGRldik7CisKKyAgICBpZiAoIGlzSWRsZSA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucG93ZXJTYXZlTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0xJR0hUOgorICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlOiBJRExFIHNvIHNsZXAgbm93Li4uXG4iKTsKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyRGlzY29ubmVjdE1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0RJU0NPTk5FQ1RfUFMKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5mcmFNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QyOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDIoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMxXG4iKTsKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMyXG4iKTsKKyAgICAvLyBpZiB3ZSByZWNlaXZlZCBhbnkgQVRJTSB3aW5kb3cgZnJvbSB0aGUgb3RoZXJzIHRvIGluZGljYXRlIHdlIGhhdmUgYnVmZmVyZWQgZGF0YQorICAgIC8vIGF0IHRoZSBvdGhlciBzdGF0aW9uLCB3ZSBjYW4ndCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5yZWN2QXRpbSApCisgICAgeworICAgICAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIHJlY2V2aW5nIEFUSU0gd2luZG93ISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHggYmVhY29uIGR1cmluZyBsYXN0IGJlYWNvbiBpbnRlcnZhbC4gd2UgY2FuJ3QgZ28gdG8gc2xlZXAKKyAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFsaXZlIHRvIHJlc3BvbmQgdGhlIHByb2JlIHJlcXVlc3QhCisgICAgaWYgKCB3ZC0+c3RhLnR4QmVhY29uSW5kICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkNhbid0IHNsZWVwIGR1ZSB0byBqdXN0IHRyYW5zbWl0IGEgYmVhY29uISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgYnVmZmVyIGFueSBkYXRhIGZvciB0aGUgb3RoZXIgc3RhdGlvbnMuIHdlIGNvdWxkIG5vdCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ICE9IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIGJ1ZmZlcmluZyBkYXRhIGZvciB0aGUgb3RoZXJzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYmVmb3JlIHNsZWVwaW5nLCB3ZSBzdGlsbCBuZWVkIHRvIG5vdGlmeSB0aGUgb3RoZXJzIGJ5IHRyYW5zbWl0dGluZyBudWxsCisgICAgLy8gcGt0IHdpdGggcG93ZXIgbWdtdCBiaXQgdHVybmVkIG9uLgorICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICAvLyB3YWl0IGZvciB0aGUgZW5kIG9mCisgICAgLy8gaWYgbmVlZCB0byB3YWl0IHRvIGtub3cgaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHJhbnNtaXQgdGhlIGJlYWNvbgorICAgIC8vIGR1cmluZyB0aGUgYmVhY29uIGludGVydmFsLiBJZiBpdCdzIG1lLCB3ZSBjYW4ndCBnbyB0byBzbGVlcC4KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKyNpZiAxCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAod2QtPnN0YS5hZGFwdGVyU3RhdGUpCisgICAgeworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1Q6CisgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JEaXNjb25uZWN0TWFpbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJbmZyYU1haW4oZGV2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgemZQb3dlclNhdmluZ01nck1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBnb3RvIGNoZWNrX3NsZWVwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBnb3RvIHNsZWVwaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworCitzbGVlcGluZzoKKyAgICByZXR1cm47CisKK2NoZWNrX3NsZWVwOgorICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy96bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwIik7CisKKyAgICAvL2lmICggd2QtPnN0YS5wc01nci5zdGF0ZSAhPSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICYmICggemZQb3dlclNhdmluZ01ncklzSWRsZShkZXYpID09IDAgKSkKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgIT0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKworICAgICAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDE7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvLyBXYWtlIHVwIHRoZSBDSElQIG5vdyEhCisgICAgICAgIHpmSHBQb3dlclNhdmVTZXRTdGF0ZShkZXYsIDApOworICAgIH0KK30KKyNlbHNlCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoemRldl90KiBkZXYpCit7Cit9CisjZW5kaWYKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGxlbmd0aCwgYml0bWFwOworICAgIHUxNl90ICBvZmZzZXQsIG4xLCBuMiwgcSwgcjsKKyAgICB6YnVmX3QqIHBzQnVmOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSAgKQorICAgIC8vaWYgKCB3ZC0+c3RhLnBzTWdyLnN0YXRlICE9IFpNX1BTX01TR19TVEFURV9TTEVFUCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2QtPnN0YS5wc01nci5pc1NsZWVwQWxsb3dlZCA9IDE7CisKKyAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVElNKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICBpZiAoIGxlbmd0aCA+IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBuMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSAmICh+Wk1fQklUXzApOworICAgICAgICAgICAgbjIgPSBsZW5ndGggKyBuMSAtIDQ7CisgICAgICAgICAgICBxID0gd2QtPnN0YS5haWQgPj4gMzsKKyAgICAgICAgICAgIHIgPSB3ZC0+c3RhLmFpZCAmIDc7CisKKyAgICAgICAgICAgIGlmICgocSA+PSBuMSkgJiYgKHEgPD0gbjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1K3EtbjEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoYml0bWFwID4+IHIpICYgIFpNX0JJVF8wICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPT0gWk1fU1RBX1BTX0ZBU1QgKQorICAgICAgICAgICAgICAgICAgICBpZiAoIDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX1MxOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZlNlbmRQU1BvbGwoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEucW9zSW5mbyYweGYpICE9IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIHBzLXBvbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiemZTZW5kUFNQb2xsICMxXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX01BWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIndha2UgdXAgYW5kIHNlbmQgUFMtUG9sbFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgid2FrZSB1cCBhbmQgc2VuZCBudWxsIGRhdGFcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljayA9IDQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+c3RhLnVhcHNkUSkpICE9IE5VTEwpCisgICAgeworICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgIH0KKworICAgIC8vcHJpbnRrKCJ6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbiAjMVxuIik7CisgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQ29ubmVjdE5vdGlmeSh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHN3aXRjaCh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTElHSFQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAxLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHpmSHBQb3dlclNhdmVTZXRNb2RlKGRldiwgMCwgMCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGRpc2FibGUgVEJUVCBpbnRlcnJ1cHQgd2hlbiBjaGFuZ2UgZnJvbSBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QgKi8KKyAgICBpZiAoemZTdGFJc0Rpc2Nvbm5lY3QoZGV2KSkgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIDApOworICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEucHNNZ3IudGlja3MrKzsKKworICAgIGlmICggd2QtPnN0YS5wc01nci50aWNrcyA8IHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3NjYW5tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI4MzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlNjYW5NZ3JJbml0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1swXSA9IDA7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzWzFdID0gMDsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPSBaTV9TQ0FOX01HUl9TQ0FOX05PTkU7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7Cit9CisKK3U4X3QgemZTY2FuTWdyU2NhblN0YXJ0KHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKQoreworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzEoInNjYW5UeXBlID0gIiwgc2NhblR5cGUpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAmJgorICAgICAgICAgc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ1bmtub3duIHNjYW5UeXBlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVqZWN0IHNjYW4gcmVxdWVzdCBkdWUgdG8gY29ubmVjdGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpID0gc2NhblR5cGUgLSAxOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID09IDEgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiByZXNjaGVkdWxlZCIsIHNjYW5UeXBlKTsKKyAgICAgICAgZ290byBzY2FuX2RvbmU7CisgICAgfQorCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID0gMTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIHNjaGVkdWxlZDogIiwgc2NhblR5cGUpOworCisgICAgLy8gSWYgdGhlcmUncyBubyBzY2FuIHBlbmRpbmcsIHdlIGRvIHRoZSBzY2FuIHJpZ2h0IGF3YXkuCisgICAgLy8gSWYgdGhlcmUncyBhbiBpbnRlcm5hbCBzY2FuIGFuZCB0aGUgbmV3IHNjYW4gcmVxdWVzdCBpcyBleHRlcm5hbCBvbmUsCisgICAgLy8gd2Ugd2lsbCByZXN0YXJ0IHRoZSBzY2FuLgorICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBzY2hlZHVsZV9zY2FuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICYmCisgICAgICAgICAgICAgIHNjYW5UeXBlID09IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgKQorICAgIHsKKyAgICAgICAgLy8gU3RvcCB0aGUgaW50ZXJuYWwgc2NhbiAmIHNjaGVkdWxlIGV4dGVybmFsIHNjYW4gZmlyc3QKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1NDQU4pOworCisgICAgICAgIC8qIEZpeCBmb3IgV0hRTCBzZW5kcmVjdiA9PiB3ZSBkbyBub3QgYXBwbHkgZGVsYXkgdGltZSBpbiB3aGljaCB0aGUgZGV2aWNlCisgICAgICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgICAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBGQUxTRTsKKworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgIGdvdG8gc2NoZWR1bGVfc2NhbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBpcyBidXN5Li4ud2FpdGluZyBsYXRlciB0byBzdGFydFxuIik7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gMDsKKworc2Nhbl9kb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIDE7CisKK3NjaGVkdWxlX3NjYW46CisKKyAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBUUlVFOworCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0NBTiwgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5KTsKKyAgICB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblN0YXJ0RGVsYXkgPSAzOworICAgIC8vd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMDsKKyAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gc2NhblR5cGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSAmJiAoIXpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpKQorICAgIHsKKyAgICAgICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZTY2FuTWdyU2NhblN0b3AoemRldl90KiBkZXYsIHU4X3Qgc2NhblR5cGUpCit7CisgICAgdThfdCBzY2FuTm90aWZ5UmVxdWlyZWQgPSAwOworICAgIHU4X3QgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPT0gWk1fU0NBTl9NR1JfU0NBTl9OT05FICkKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMF0gPT0gMCk7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMV0gPT0gMCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2goc2NhblR5cGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw6CisgICAgICAgICAgICBzY2FuTm90aWZ5UmVxdWlyZWQgPSAxOworICAgICAgICAgICAgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDoKKyAgICAgICAgICAgIHRoZU90aGVyU2NhbiA9IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSAhPSBzY2FuVHlwZSApCisgICAgeworICAgICAgICBnb3RvIHN0b3BfZG9uZTsKKyAgICB9CisKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfU0NBTik7CisKKyAgICAvKiBGaXggZm9yIFdIUUwgc2VuZHJlY3YgPT4gd2UgZG8gbm90IGFwcGx5IGRlbGF5IHRpbWUgaW4gd2hpY2ggdGhlIGRldmljZQorICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgIHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9IEZBTFNFOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSAwOworCisgICAgaWYgKCB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbdGhlT3RoZXJTY2FuIC0gMV0gKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9IHRoZU90aGVyU2NhbjsKKworICAgICAgICAvLyBTY2hlZHVsZSB0aGUgb3RoZXIgc2NhbiBhZnRlciAxIHNlY29uZCBsYXRlcgorICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCAxMDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgIH0KKworc3RvcF9kb25lOgorICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1tzY2FuVHlwZSAtIDFdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorCisgICAgaWYgKCBzY2FuTm90aWZ5UmVxdWlyZWQgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBub3RpZnkgYWZ0ZXIgcmVzZXQiKTsKKyAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlNjYW5Ob3RpZnkoZGV2LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKKworZG9uZToKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuQWNrKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpOworCitzdGF0aWMgdm9pZCB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgazsKKyAgICB1MTZfdCAgZHN0WzNdID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBJbmNyZWFzZSByeEJlYWNvbkNvdW50IHRvIHByZXZlbnQgYmVhY29uIGxvc3QgKi8KKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGVuYWJsZSA4MDIubDExaCBhbmQgaW4gREZTIEJhbmQgLCBkaXNhYmxlIHNlbmRpbmcgcHJvYmUgcmVxdWVzdCAqLworICAgIGlmICh3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSwgZHN0LCAwLCAwLCAwKTsKKworICAgIGlmICggd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGs9MTsgazw9Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGsrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPndzLnByb2JpbmdTc2lkTGlzdFtrLTFdLnNzaWRMZW4gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEsIGRzdCwgaywgMCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy9wcmludGsoInpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IgIzFcbiIpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOLCBaTV9USUNLX0lOX1NDQU4pOworICAgIGlmICh3ZC0+c3RhLmJQYXNzaXZlU2NhbikKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiwgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOLCB3ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7Cit9CisKKworc3RhdGljIHZvaWQgemZTY2FuTWdyRXZlbnRTY2FuQ29tcGxldGVDYih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICF3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0lOX1NDQU4sIFpNX1RJQ0tfSU5fU0NBTik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgbmV4dFNjYW5GcmVxdWVuY3kgPSAwOworICAgIHU4X3QgICAgdGVtcDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICggd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IDAgKQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG5leHRTY2FuRnJlcXVlbmN5ID0gemZDaEdldE5leHRDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisKKyAgICBpZiAoIChuZXh0U2NhbkZyZXF1ZW5jeSA9PSAweGZmZmYpCisgICAgICAgICB8fCAod2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IHpmQ2hHZXRMYXN0Q2hhbm5lbChkZXYsICZ0ZW1wKSkgKQorICAgIHsKKyAgICAgICAgdThfdCBjdXJyU2NhblR5cGU7CisgICAgICAgIHU4X3QgaXNFeHRlcm5hbFNjYW4gPSAwOworICAgICAgICB1OF90IGlzSW50ZXJuYWxTY2FuID0gMDsKKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImVuZCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiAxIHR5cGU6ICIsIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIGNoYW5uZWwgY291bnQgPSAiLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCk7CisKKyAgICAgICAgLy96ZkJzc0luZm9SZWZyZXNoKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJXT1chISBzY2FuIGlzIGNhbmNlbGxlZFxuIik7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgZ290byByZXBvcnRfc2Nhbl9yZXN1bHQ7CisgICAgICAgIH0KKworCisgICAgICAgIGN1cnJTY2FuVHlwZSA9IHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGU7CisgICAgICAgIHN3aXRjaChjdXJyU2NhblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBpc0V4dGVybmFsU2NhbiA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1taTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMIC0gMV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMOgorICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgLSAxXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBleHRlcm5hbCBzY2FuIHNob3VsZCBwcmUtZW1wdHMgaW50ZXJuYWwgc2Nhbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gU28gdGhpcyBzaGFsbCBub3QgYmUgaGFwcGVuZWQhIQorICAgICAgICAgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2N1cnJTY2FuVHlwZSAtIDFdID0gMDsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMTAwOworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0LCB6ZlNjYW5NZ3JFdmVudFNjYW5Db21wbGV0ZUNiKTsKKworICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworCisgICAgICAgICNpZiAxCisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgIHsgLy8gRmluaXNoIHNpdGUgc3VydmV5LCByZXNldCB0aGUgdmFyaWFibGUgdG8gZGV0ZWN0IHVzaW5nIHdyb25nIGZyZXF1ZW5jeSAhCisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDEpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAyOworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogIzUgUmUtZW5hYmxlIFJJRlMgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNpdGUgc3VydmV5ICEgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSBzd2l0Y2ggYmFuZCB3aWxsIHJlc2V0IHRoZSBCQiByZWdpc3RlciB0byBpbml0aWFsIHZhbHVlICovCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDApOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworcmVwb3J0X3NjYW5fcmVzdWx0OgorICAgICAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICAgICAgLy9pZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmICggaXNFeHRlcm5hbFNjYW4gKS8vUXVpY2tseSByZWJvb3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2Nhbk5vdGlmeShkZXYsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpc0ludGVybmFsU2NhbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5JbnRlcm5hbFNjYW5SZXEgPSAwOworICAgICAgICAgICAgemZTdGFSZWNvbm5lY3QoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSBuZXh0U2NhbkZyZXF1ZW5jeTsKKworICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzY2FuIDIiKTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBub19zY2FuOworICAgIH0KKworICAgIC8vemZCc3NJbmZvUmVmcmVzaChkZXYpOworICAgIHpmQnNzSW5mb1JlZnJlc2goZGV2LCAwKTsKKyAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IFRSVUU7CisgICAgd2QtPnN0YS5iU2NoZWR1bGVTY2FuID0gRkFMU0U7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJzdGFydCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIGF2b2lkIGxvc2UgcmVjZWl2ZSBwYWNrZXQgd2hlbiBzaXRlIHN1cnZleSAqLworICAgIC8vaWYgKCh6ZlN0YUlzQ29ubmVjdGVkKGRldikpICYmICghemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkpCisgICAgLy97CisgICAgLy8gICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICAvL30KKy8vICAgIHptX2RlYnVnX21zZzAoInNjYW4gMCIpOworLy8gICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgI2lmIDEKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsvLyBJZiBkb2luZyBzaXRlIHN1cnZleSAhCisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAxKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAwKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgICNlbmRpZgorCisgICAgem1fZGVidWdfbXNnMCgic2NhbiAwIik7CisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgcmV0dXJuOworCitub19zY2FuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN0a2lwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVHggYW5kIFJ4IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCit1MTZfdCB6Z1RraXBTYm94TG93ZXJbMjU2XSA9CisgICAgeworICAgICAgICAweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisgICAgICAgIDB4NTAsMHgwMywweEE5LDB4N0QsMHgxOSwweDYyLDB4RTYsMHg5QSwKKyAgICAgICAgMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorICAgICAgICAweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisgICAgICAgIDB4QzIsMHgxQywweEFFLDB4NkEsMHg1QSwweDQxLDB4MDIsMHg0RiwKKyAgICAgICAgMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorICAgICAgICAweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisgICAgICAgIDB4MDksMHgzNiwweDlCLDB4M0QsMHgyNiwweDY5LDB4Q0QsMHg5RiwKKyAgICAgICAgMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorICAgICAgICAweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisgICAgICAgIDB4RjUsMHg2OCwweDAwLDB4MkMsMHg2MCwweDFGLDB4QzgsMHhFRCwKKyAgICAgICAgMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorICAgICAgICAweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisgICAgICAgIDB4Q0YsMHgxMCwweDA2LDB4ODEsMHhGMCwweDQ0LDB4QkEsMHhFMywKKyAgICAgICAgMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorICAgICAgICAweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisgICAgICAgIDB4NEMsMHgxNCwweDM1LDB4MkYsMHhFMSwweEEyLDB4Q0MsMHgzOSwKKyAgICAgICAgMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorICAgICAgICAweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisgICAgICAgIDB4Q0EsMHgyOSwweEQzLDB4M0MsMHg3OSwweEUyLDB4MUQsMHg3NiwKKyAgICAgICAgMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorICAgICAgICAweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisgICAgICAgIDB4MzIsMHg0MywweDU5LDB4QjcsMHg4QywweDY0LDB4RDIsMHhFMCwKKyAgICAgICAgMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorICAgICAgICAweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisgICAgICAgIDB4MjMsMHg3QywweDlDLDB4MjEsMHhERCwweERDLDB4ODYsMHg4NSwKKyAgICAgICAgMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorICAgICAgICAweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisgICAgICAgIDB4MzgsMHgxMywweEIzLDB4MzMsMHhCQiwweDcwLDB4ODksMHhBNywKKyAgICAgICAgMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorICAgICAgICAweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisgICAgICAgIDB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQorICAgIH07CisKKwordTE2X3QgemdUa2lwU2JveFVwcGVyWzI1Nl0gPQorICAgIHsKKyAgICAgICAgMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAorICAgICAgICAweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisgICAgICAgIDB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKyAgICAgICAgMHg0MSwweEIzLDB4NUYsMHg0NSwweDIzLDB4NTMsMHhFNCwweDlCLAorICAgICAgICAweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisgICAgICAgIDB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKyAgICAgICAgMHgwOCwweDk1LDB4NDYsMHg5RCwweDMwLDB4MzcsMHgwQSwweDJGLAorICAgICAgICAweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisgICAgICAgIDB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKyAgICAgICAgMHhBNCwweDc2LDB4QjcsMHg3RCwweDUyLDB4REQsMHg1RSwweDEzLAorICAgICAgICAweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisgICAgICAgIDB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKyAgICAgICAgMHhCQiwweEM1LDB4NEYsMHhFRCwweDg2LDB4OUEsMHg2NiwweDExLAorICAgICAgICAweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisgICAgICAgIDB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKyAgICAgICAgMHg2MywweDc3LDB4QUYsMHg0MiwweDIwLDB4RTUsMHhGRCwweEJGLAorICAgICAgICAweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisgICAgICAgIDB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKyAgICAgICAgMHhDMCwweDE5LDB4OUUsMHhBMywweDQ0LDB4NTQsMHgzQiwweDBCLAorICAgICAgICAweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisgICAgICAgIDB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKyAgICAgICAgMHg5RiwweEJELDB4NDMsMHhDNCwweDM5LDB4MzEsMHhEMywweEYyLAorICAgICAgICAweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisgICAgICAgIDB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKyAgICAgICAgMHg2RiwweEYwLDB4NEEsMHg1QywweDM4LDB4NTcsMHg3MywweDk3LAorICAgICAgICAweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisgICAgICAgIDB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKyAgICAgICAgMHhDMiwweDZBLDB4QUUsMHg2OSwweDE3LDB4OTksMHgzQSwweDI3LAorICAgICAgICAweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisgICAgICAgIDB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKyAgICAgICAgMHgwMywweDU5LDB4MDksMHgxQSwweDY1LDB4RDcsMHg4NCwweEQwLAorICAgICAgICAweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKKyAgICB9OworCit1MTZfdCB6ZnJvdHIxKHUxNl90IGEpCisvLyByb3RhdGUgcmlnaHQgYnkgMSBiaXQuCit7CisgICAgdTE2X3QgYjsKKworICAgIGlmIChhICYgMHgwMSkKKyAgICB7CisgICAgICAgIGIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYiA9IChhID4+IDEpICYgMHg3ZmZmOworICAgIH0KKyAgICByZXR1cm4gYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB6ZlRraXBTYm94KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVGtpcFNib3godTE2X3QgaW5kZXgpCit7CisgICAgdTE2X3QgICBsb3c7CisgICAgdTE2X3QgICBoaWdoOworICAgIHUxNl90ICAgbGVmdCwgcmlnaHQ7CisKKyAgICBsb3cgPSAoaW5kZXggJiAweEZGKTsKKyAgICBoaWdoID0gKChpbmRleCA+PiA4KSAmIDB4RkYpOworCisgICAgbGVmdCA9IHpnVGtpcFNib3hMb3dlcltsb3ddICsgKHpnVGtpcFNib3hVcHBlcltsb3ddIDw8IDggKTsKKyAgICByaWdodCA9IHpnVGtpcFNib3hVcHBlcltoaWdoXSArICh6Z1RraXBTYm94TG93ZXJbaGlnaF0gPDwgOCApOworCisgICAgcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgICB0c2MwOworICAgIHUxNl90ICAgdHNjMTsKKyAgICB1MTZfdCAgIGksIGo7CisjaWYgMAorICAgIC8qIE5lZWQgbm90IHByb2NlZWQgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGl2MzIgKi8KKyAgICBpZiAoIGl2MzIgPT0gcFNlZWQtPml2MzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgdHNjMCA9ICh1MTZfdCkgKChpdjMyID4+IDE2KSAmIDB4ZmZmZik7IC8qIG1zYiAqLworICAgIHRzYzEgPSAodTE2X3QpIChpdjMyICYgMHhmZmZmKTsKKworICAgIC8qIFBoYXNlIDEsIHN0ZXAgMSAqLworICAgIHBTZWVkLT50dGFrWzBdID0gdHNjMTsKKyAgICBwU2VlZC0+dHRha1sxXSA9IHRzYzA7CisgICAgcFNlZWQtPnR0YWtbMl0gPSAodTE2X3QpIChwU2VlZC0+dGFbMF0gKyAocFNlZWQtPnRhWzFdIDw8OCkpOworICAgIHBTZWVkLT50dGFrWzNdID0gKHUxNl90KSAocFNlZWQtPnRhWzJdICsgKHBTZWVkLT50YVszXSA8PDgpKTsKKyAgICBwU2VlZC0+dHRha1s0XSA9ICh1MTZfdCkgKHBTZWVkLT50YVs0XSArIChwU2VlZC0+dGFbNV0gPDw4KSk7CisKKyAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgeworICAgICAgICBqID0gMiooaSAmIDEpOworICAgICAgICBwU2VlZC0+dHRha1swXSA9KHBTZWVkLT50dGFrWzBdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1s0XQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxK2pdLCBwU2VlZC0+dGtbal0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1sxXSA9KHBTZWVkLT50dGFrWzFdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1swXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s1K2pdLCBwU2VlZC0+dGtbNCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1syXSA9KHBTZWVkLT50dGFrWzJdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s5K2pdLCBwU2VlZC0+dGtbOCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1szXSA9KHBTZWVkLT50dGFrWzNdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1syXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxMytqXSwgcFNlZWQtPnRrWzEyK2pdKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZjsKKyAgICAgICAgcFNlZWQtPnR0YWtbNF0gPShwU2VlZC0+dHRha1s0XSArIHpmVGtpcFNib3gocFNlZWQtPnR0YWtbM10KKyAgICAgICAgICAgICAgICAgICAgICAgICBeIFpNX0JZVEVfVE9fV09SRChwU2VlZC0+dGtbMStqXSwgcFNlZWQtPnRrW2pdICApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1s0XSA9KHBTZWVkLT50dGFrWzRdICsgaSkgJiAweGZmZmY7CisgICAgfQorCisgICAgaWYgKCBpdjMyID09IChwU2VlZC0+aXYzMisxKSApCisgICAgeworICAgICAgICBwU2VlZC0+aXYzMnRtcCA9IGl2MzI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmVGtpcFBoYXNlMktleU1peCh1MTZfdCBpdjE2LCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgdHNjMjsKKworICAgIHRzYzIgPSBpdjE2OworCisgICAgLyogUGhhc2UgMiwgU3RlcCAxICovCisgICAgcFNlZWQtPnBwa1swXSA9IHBTZWVkLT50dGFrWzBdOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+dHRha1sxXTsKKyAgICBwU2VlZC0+cHBrWzJdID0gcFNlZWQtPnR0YWtbMl07CisgICAgcFNlZWQtPnBwa1szXSA9IHBTZWVkLT50dGFrWzNdOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+dHRha1s0XTsKKyAgICBwU2VlZC0+cHBrWzVdID0gKHBTZWVkLT50dGFrWzRdICsgdHNjMikgJiAweGZmZmY7CisKKyAgICAvKiBQaGFzZTIsIFN0ZXAgMiAqLworICAgIHBTZWVkLT5wcGtbMF0gPSBwU2VlZC0+cHBrWzBdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzFdLHBTZWVkLT50a1swXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzNdLHBTZWVkLT50a1syXSkpOworICAgIHBTZWVkLT5wcGtbMl0gPSBwU2VlZC0+cHBrWzJdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzVdLHBTZWVkLT50a1s0XSkpOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMl0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzddLHBTZWVkLT50a1s2XSkpOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+cHBrWzRdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbM10gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzldLHBTZWVkLT50a1s4XSkpOworICAgIHBTZWVkLT5wcGtbNV0gPSBwU2VlZC0+cHBrWzVdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzExXSxwU2VlZC0+dGtbMTBdKSk7CisKKyAgICBwU2VlZC0+cHBrWzBdID0gcFNlZWQtPnBwa1swXQorICAgICAgICAgICAgICAgICsgemZyb3RyMShwU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxM10scFNlZWQtPnRrWzEyXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzE1XSxwU2VlZC0+dGtbMTRdKSk7CisgICAgcFNlZWQtPnBwa1syXSA9IHBTZWVkLT5wcGtbMl0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMV0pOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdICsgemZyb3RyMShwU2VlZC0+cHBrWzJdKTsKKyAgICBwU2VlZC0+cHBrWzRdID0gcFNlZWQtPnBwa1s0XSArIHpmcm90cjEocFNlZWQtPnBwa1szXSk7CisgICAgcFNlZWQtPnBwa1s1XSA9IHBTZWVkLT5wcGtbNV0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbNF0pOworCisgICAgaWYgKGl2MTYgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChwU2VlZC0+aXYxNiA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZWVkLT5pdjE2dG1wPTA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoaXYxNiA9PSAocFNlZWQtPml2MTYrMSkpCisgICAgeworICAgICAgICBwU2VlZC0+aXYxNnRtcCA9IGl2MTY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpCit7CisgICAgdTE2X3QgIGl2MTY7CisgICAgdTMyX3QgIGl2MzI7CisgICAgdTE2X3QgIGk7CisKKyAgICAvKiBjbGVhciBtZW1vcnkgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSBwU2VlZCwgc2l6ZW9mKHN0cnVjdCB6c1RraXBTZWVkKSk7CisgICAgLyogc2V0IGtleSB0byBzZWVkICovCisgICAgemZNZW1vcnlDb3B5KHBTZWVkLT50YSwgdGEsIDYpOworICAgIHpmTWVtb3J5Q29weShwU2VlZC0+dGssIGtleSwgMTYpOworCisgICAgaXYxNiA9ICppbml0SXYrKzsKKyAgICBpdjE2ICs9ICppbml0SXY8PDg7CisgICAgaW5pdEl2Kys7CisKKyAgICBpdjMyPTA7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykgICAgICAvLyBpbml0aXYgaXMgbGl0dGxlIGVuZGlhbgorICAgIHsKKyAgICAgICAgaXYzMiArPSAqaW5pdEl2PDwoaSo4KTsKKyAgICAgICAgKmluaXRJdisrOworICAgIH0KKworICAgIHBTZWVkLT5pdjMyID0gaXYzMisxOyAvLyBGb3JjZSBSZWNhbGN1bGF0aW5nIG9uIFRraXAgUGhhc2UxCisgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHBTZWVkKTsKKworICAgIHBTZWVkLT5pdjE2ID0gaXYxNjsKKyAgICBwU2VlZC0+aXYzMiA9IGl2MzI7Cit9CisKK3UzMl90IHpmR2V0VTMydCh1OF90KiBwKQoreworICAgIHUzMl90IHJlcz0wOworICAgIHUxNl90IGk7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgcmVzIHw9ICgqcCsrKSA8PCAoOCppKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworCit9CisKK3ZvaWQgemZQdXRVMzJ0KHU4X3QqIHAsIHUzMl90IHZhbHVlKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgICpwKysgPSAodThfdCkgKHZhbHVlICYgMHhmZik7CisgICAgICAgIHZhbHVlID4+PSA4OworICAgIH0KK30KKwordm9pZCB6Zk1pY0NsZWFyKHN0cnVjdCB6c01pY1ZhciogcE1pYykKK3sKKyAgICBwTWljLT5sZWZ0ID0gcE1pYy0+azA7CisgICAgcE1pYy0+cmlnaHQgPSBwTWljLT5rMTsKKyAgICBwTWljLT5uQnl0ZXMgPSAwOworICAgIHBNaWMtPm0gPSAwOworfQorCit2b2lkIHpmTWljU2V0S2V5KHU4X3QqIGtleSwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIHBNaWMtPmswID0gemZHZXRVMzJ0KGtleSk7CisgICAgcE1pYy0+azEgPSB6ZkdldFUzMnQoa2V5KzQpOworICAgIHpmTWljQ2xlYXIocE1pYyk7Cit9CisKK3ZvaWQgemZNaWNBcHBlbmRCeXRlKHU4X3QgYiwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKyAgICBwTWljLT5tIHw9IGIgPDwgKDgqIHBNaWMtPm5CeXRlcyk7CisgICAgcE1pYy0+bkJ5dGVzKys7CisKKyAgICAvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCisgICAgaWYgKCBwTWljLT5uQnl0ZXMgPj0gNCApCisgICAgeworICAgICAgICBwTWljLT5sZWZ0IF49IHBNaWMtPm07CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKHBNaWMtPmxlZnQsIDE3ICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49ICgocE1pYy0+bGVmdCAmIDB4ZmYwMGZmMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChwTWljLT5sZWZ0ICYgMHgwMGZmMDBmZikgPDwgOCk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKCBwTWljLT5sZWZ0LCAzICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPUjMyKCBwTWljLT5sZWZ0LCAyICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIC8vIENsZWFyIHRoZSBidWZmZXIKKyAgICAgICAgcE1pYy0+bSA9IDA7CisgICAgICAgIHBNaWMtPm5CeXRlcyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmTWljR2V0TWljKHU4X3QqIGRzdCwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisgICAgemZNaWNBcHBlbmRCeXRlKDB4NWEsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKworICAgIC8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorICAgIHdoaWxlKCBwTWljLT5uQnl0ZXMgIT0gMCApCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgfQorCisgICAgLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKyAgICB6ZlB1dFUzMnQoZHN0LCBwTWljLT5sZWZ0KTsKKyAgICB6ZlB1dFUzMnQoZHN0KzQsIHBNaWMtPnJpZ2h0KTsKKworICAgIC8vIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLgorICAgIHpmTWljQ2xlYXIocE1pYyk7CisKK30KKwordThfdCB6Zk1pY1J4VmVyaWZ5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICBNeU1pY0tleTsKKyAgICB1OF90ICAgbWljWzhdOworICAgIHU4X3QgICBkYVs2XTsKKyAgICB1OF90ICAgc2FbNl07CisgICAgdThfdCAgIGJWYWx1ZTsKKyAgICB1MTZfdCAgaSwgcGF5bG9hZE9mZnNldCwgdGFpbE9mZnNldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIG5lZWQgbm90IGNoZWNrIE1JQyBpZiBwTWljS0V5IGlzIGVxdWFsIHRvIE5VTEwgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZkFwR2V0UnhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBzYSwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KTsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZGEsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFJ4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgc2EsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIGRhLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX01JQ19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBNeU1pY0tleS5rMD1wTWljS2V5LT5rMDsKKyAgICBNeU1pY0tleS5rMT1wTWljS2V5LT5rMTsKKyAgICBwTWljS2V5ID0gJk15TWljS2V5OworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKyAgICB0YWlsT2Zmc2V0ID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgdGFpbE9mZnNldCAtPSA4OworCisgICAgLyogYXBwZW5kIERBICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoZGFbaV0sIHBNaWNLZXkpOworICAgIH0KKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShzYVtpXSwgcE1pY0tleSk7CisgICAgfQorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsMjQpJjB4NywgcE1pY0tleSk7CisgICAgZWxzZQorICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisKKyAgICAvKiBhcHBlbmQgcGF5bG9hZCAqLworICAgIHBheWxvYWRPZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgKworICAgICAgICAgICAgICAgICAgICBaTV9TSVpFX09GX0lWICsKKyAgICAgICAgICAgICAgICAgICAgWk1fU0laRV9PRl9FWFRfSVY7CisKKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFFvcyBQYWNrZXQsIFBsY3BoZWFkZXIgKyAyICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IFJ4IFFvcyBlbGVtZW50IG9mZnNldCBpbiBzb2Z0d2FyZSBNSUMgY2hlY2sgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZE9mZnNldCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTx0YWlsT2Zmc2V0OyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKKworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBtaWMsIHRhaWxPZmZzZXQsIDgpICkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCkKK3sKKyAgICBSQzRLZXlbMF0gID0gWk1fSEk4KGl2MTYpOworICAgIFJDNEtleVsxXSAgPSAoWk1fSEk4KGl2MTYpIHwgMHgyMCkgJiAweDdmOworICAgIFJDNEtleVsyXSAgPSBaTV9MTzgoaXYxNik7CisgICAgUkM0S2V5WzNdICA9ICgoU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKFNlZWQtPnRrWzFdLFNlZWQtPnRrWzBdKSk+PjEpICYgMHhmZjsKKyAgICBSQzRLZXlbNF0gID0gU2VlZC0+cHBrWzBdICYgMHhmZjsKKyAgICBSQzRLZXlbNV0gID0gU2VlZC0+cHBrWzBdID4+IDg7CisgICAgUkM0S2V5WzZdICA9IFNlZWQtPnBwa1sxXSAmIDB4ZmY7CisgICAgUkM0S2V5WzddICA9IFNlZWQtPnBwa1sxXSA+PiA4OworICAgIFJDNEtleVs4XSAgPSBTZWVkLT5wcGtbMl0gJiAweGZmOworICAgIFJDNEtleVs5XSAgPSBTZWVkLT5wcGtbMl0gPj4gODsKKyAgICBSQzRLZXlbMTBdID0gU2VlZC0+cHBrWzNdICYgMHhmZjsKKyAgICBSQzRLZXlbMTFdID0gU2VlZC0+cHBrWzNdID4+IDg7CisgICAgUkM0S2V5WzEyXSA9IFNlZWQtPnBwa1s0XSAmIDB4ZmY7CisgICAgUkM0S2V5WzEzXSA9IFNlZWQtPnBwa1s0XSA+PiA4OworICAgIFJDNEtleVsxNF0gPSBTZWVkLT5wcGtbNV0gJiAweGZmOworICAgIFJDNEtleVsxNV0gPSBTZWVkLT5wcGtbNV0gPj4gODsKK30KKwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c01pY1ZhciogIHBNaWNLZXk7CisgICAgdTE2X3QgIGk7CisgICAgdTE2X3QgbGVuOworICAgIHU4X3QgYlZhbHVlOworICAgIHU4X3QgcW9zVHlwZTsKKyAgICB1OF90ICpwRGEgPSAodThfdCAqKWRhOworICAgIHU4X3QgKnBTYSA9ICh1OF90ICopc2E7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBuZWVkIG5vdCBjaGVjayBNSUMgaWYgcE1pY0tFeSBpcyBlcXVhbCB0byBOVUxMICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBwTWljS2V5ID0gemZBcEdldFR4TWljS2V5KGRldiwgYnVmLCAmcW9zVHlwZSk7CisKKyAgICAgICAgaWYgKCBwTWljS2V5ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmU3RhR2V0VHhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgicE1pY0tleSBpcyBOVUxMIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmTWljQ2xlYXIocE1pY0tleSk7CisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBhcHBlbmQgREEgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocERhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocFNhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICBpZiAodXAgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKCh1cCYweDcpLCBwTWljS2V5KTsKKyAgICBlbHNlCisgICAgICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgLyogRm9yIFNuYXAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHNuYXBbaV0sIHBNaWNLZXkpOworICAgIH0KKworICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKK30KKwordm9pZCB6ZlRLSVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5LCB1MzJfdCogaWN2KQoreworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgemZXRVBFbmNyeXB0KGRldiwgYnVmLCBzbmFwLCBzbmFwTGVuLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworfQorCit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KQoreworICAgIHUxNl90IHJldCA9IFpNX0lDVl9TVUNDRVNTOworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgcmV0ID0gemZXRVBEZWNyeXB0KGRldiwgYnVmLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCkBAIC0wLDAgKzEsNDA5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaHRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBUeCBhbmQgUnggZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3UxNl90IHpmV2xhblJ4VmFsaWRhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90IHpmV2xhblJ4RmlsdGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisKKworCitjb25zdCB1OF90IHpnU25hcEJyaWRnZVR1bm5lbFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGOCB9OworY29uc3QgdThfdCB6Z1NuYXA4MDIxaFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogVGFibGUgZm9yIGNvbnZlcnRpbmcgSVAgRFNDUCBQMi1QMCBiaXRzIHRvIDgwMi4xMWUgQWNjZXNzIENhdGVnb3J5ICovCitjb25zdCB1OF90IHpjVXBUb0FjWzhdID0gezAsIDEsIDEsIDAsIDIsIDIsIDMsIDN9OyAvL1dNTSBkZWZhdWx0CisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIDIgVHhRCisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIHNpbmdsZSBUeFEKK2NvbnN0IHU4X3QgemNNYXhzcFRvUGt0TnVtWzRdID0gezgsIDIsIDQsIDZ9OworCit1OF90IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IHNlY3VyaXR5Qnl0ZTsKKyAgICB1OF90IGVuY3J5TW9kZTsKKworICAgIHNlY3VyaXR5Qnl0ZSA9IChhZGRJbmZvLT5UYWlsLkRhdGEuU0FJbmRleCAmIDB4YzApID4+IDQ7ICAvKiBieXRlNCAqLworICAgIHNlY3VyaXR5Qnl0ZSB8PSAoYWRkSW5mby0+VGFpbC5EYXRhLkRBSW5kZXggJiAweGMwKSA+PiA2OyAvKiBieXRlNSAqLworCisgICAgc3dpdGNoKCBzZWN1cml0eUJ5dGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9OT19XRVA6CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgIGNhc2UgWk1fQUVTOgorCisgICAgICAgICAgICBlbmNyeU1vZGUgPSBzZWN1cml0eUJ5dGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICBpZiAoIChzZWN1cml0eUJ5dGUgJiAweGY4KSA9PSAweDA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWNyeXB0ZWQgYnkgc29mdHdhcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVuY3J5TW9kZTsKK30KKwordm9pZCB6ZkdldFJ4SXZJY3ZMZW5ndGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHZhcCwgdTE2X3QqIHBJdkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBwSWN2TGVuLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3Qgd2RzUG9ydDsKKyAgICB1OF90ICBlbmNyeU1vZGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAqcEl2TGVuID0gMDsKKyAgICAqcEljdkxlbiA9IDA7CisKKyAgICBlbmNyeU1vZGUgPSB6ZkdldEVuY3J5TW9kZUZyb21SeFN0YXR1cyhhZGRJbmZvKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQgKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAxMjggKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAyNTYgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaWQ7CisgICAgICAgICAgICAgICAgdTE2X3QgYWRkclszXTsKKworICAgICAgICAgICAgICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICAgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX1RLSVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDg7IC8vIEFFUyBNSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKnBJY3ZMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW49IDE2OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdEUyBwb3J0IGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAoKHdkc1BvcnQgPSB2YXAgLSAweDIwKSA+PSBaTV9NQVhfV0RTX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2RzUG9ydCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2QtPmFwLndkcy5lbmNyeU1vZGVbd2RzUG9ydF0pCisJCQl7CisJCQljYXNlIFpNX1dFUDY0OgorCQkJY2FzZSBaTV9XRVAxMjg6CisJCQljYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFpNX1RLSVA6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSAwOworCQkJCWJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICpwSWN2TGVuID0gMTY7CisJCQkJYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCQkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgICAgfQorICAgIH0KKwllbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogdGVzdDogNjUxOCBmb3IgUUEgYXV0byB0ZXN0ICovCisgICAgICAgIHN3aXRjaCAoZW5jcnlNb2RlKQorCQl7CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICpwSXZMZW4gPSA0OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fVEtJUDoKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fQUVTOgorICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAqcEl2TGVuID0gMTg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDE2OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCAoZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgKGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAoZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gODsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA4OyAvLyBBRVMgTUlDCisgICAgICAgIH0KKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0NFTkMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSAxODsKKyAgICAgICAgICAgICpwSWN2TGVuPSAxNjsKKyAgICAgICAgfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdpbmdEZWZyYWdMaXN0ICAgICAgICAgICAqLworLyogICAgICBGb3JjZSBmbHVzaGluZyB3aG9sZSBkZWZyYWcgbGlzdCBvciBhZ2luZyB0aGUgYnVmZmVyICAgICAgICAgICAgKi8KKy8qICAgICAgaW4gdGhlIGRlZnJhZyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IDE9PmZsdXNoaW5nLCAwPT5BZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQWdpbmdEZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKHdkLT50aWNrIC0gd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2spID4KKyAgICAgICAgICAgICAgICAgICAgICAgIChaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgKiBaTV9USUNLX1BFUl9TRUNPTkQpKQorICAgICAgICAgICAgICAgfHwgKGZsdXNoRmxhZyAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJBZ2luZyBkZWZyYWcgbGlzdCA6IiwgaSk7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgYnVmZmVycyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2pdLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QgICovCisvKiAgICAgIEFkZCBmaXJzdCBmcmFnbWVudCB0byBkZWZyYWdtZW50IGxpc3QsIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSAgICAqLworLyogICAgICB3aWxsIGJlIHNlbGVjdGVkLiBJZiB0aGUgbGlzdCBpcyBmdWxsLCBzZXF1ZW50aWFsbHkgc2VsZWN0ICAgICAgKi8KKy8qICAgICAgb25lIGVudHJ5IGZvciByZXBsYWNlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmaXJzdCBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2Ugb2YgZmlyc3QgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyLCB1MTZfdCBzZXFOdW0pCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBGaW5kIGFuIGVtcHR5IG9uZSBpbiBkZWZyYWcgbGlzdCAqLworICAgIGZvcihpPTA7IGk8Wk1fTUFYX0RFRlJBR19FTlRSSUVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgZnVsbCwgc2VxdWVudGlhbGx5IHJlcGxhY2UgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKGkgPT0gWk1fTUFYX0RFRlJBR19FTlRSSUVTKQorICAgIHsKKyAgICAgICAgaSA9IHdkLT5kZWZyYWdUYWJsZS5yZXBsYWNlTnVtKysgJiAoWk1fTUFYX0RFRlJBR19FTlRSSUVTLTEpOworICAgICAgICAvKiBGcmVlIHRoZSBidWZmZXJzIGluIHRoZSBkZWZyYWcgbGlzdCB0byBiZSByZXBsYWNlZCAqLworICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbal0sIDApOworICAgICAgICB9CisgICAgfQorCisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDE7CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50WzBdID0gYnVmOworICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5zZXFOdW0gPSBzZXFOdW07CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2sgPSB3ZC0+dGljazsKKworICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICB7CisgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5hZGRyW2pdID0gYWRkcltqXTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFkZEZyYWdUb0RlZnJhZ0xpc3QgICAgICAgKi8KKy8qICAgICAgQWRkIG1pZGRsZSBvciBsYXN0IGZyYWdtZW50IHRvIGRlZnJhZ21lbnQgbGlzdC4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2UgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZyYWdOdW0gOiBmcmFnbWVudCBudW1iZXIgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlRnJhZyA6IG1vcmUgZnJhZyBiaXQgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkSW5mbyA6IGFkZGl0aW9uIGluZm8gb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZGRGcmFnVG9EZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkciwKKyAgICAgICAgdTE2X3Qgc2VxTnVtLCB1OF90IGZyYWdOdW0sIHU4X3QgbW9yZUZyYWcsCisgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHpidWZfdCogcmV0dXJuQnVmID0gTlVMTDsKKyAgICB1MTZfdCBkZWZyYWdEb25lID0gMDsKKyAgICB1MTZfdCBsZW5FcnIgPSAwOworICAgIHUxNl90IHN0YXJ0QWRkciwgZnJhZ0hlYWQsIGZyYW1lTGVuLCBpdkxlbiwgaWN2TGVuOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIEZpbmQgZnJhZyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21wYXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcltqXSAhPSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uYWRkcltqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ29tcGFyZSBzZXF1ZW5jZSBhbmQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSA9PSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uc2VxTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmcmFnTnVtID09IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmcmFnTnVtIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmcmFnIGZyYW1lIHRvIGRlZnJhZyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbZnJhZ051bV0gPSBidWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZyYWdEb25lID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVGcmFnID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgYWxsIGZyYWdtZW50IGlmIG1vcmUgZGF0YSBiaXQgaXMgY2xlYXJlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkJ1ZiA9IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFkZHIgPSB6ZndCdWZHZXRTaXplKGRldiwgcmV0dXJuQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIFdMQU4gaGVhZGVyIDI0KERhdGEpIG9yIDI2KFFvUyBEYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkID0gMjQgKyAoKHptd19yeF9idWZfcmVhZGgoZGV2LCByZXR1cm5CdWYsIDApICYgMHg4MCkgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZHZXRSeEl2SWN2TGVuZ3RoKGRldiwgcmV0dXJuQnVmLCAwLCAmaXZMZW4sICZpY3ZMZW4sIGFkZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkICs9IGl2TGVuOyAvKiBza2lwIElWICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MTsgazx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydEFkZHIrZnJhbWVMZW4tZnJhZ0hlYWQpIDwgMTU2MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCByZXR1cm5CdWYsIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyLCBmcmFnSGVhZCwgZnJhbWVMZW4tZnJhZ0hlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyICs9IChmcmFtZUxlbi1mcmFnSGVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5FcnIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRba10sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZXR1cm5CdWYsIHN0YXJ0QWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobGVuRXJyID09IDEpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgcmV0dXJuQnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWZyYWdEb25lID09IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldHVybkJ1ZjsKK30KKworCisvKiByZXR1cm4gdmFsdWUgPSBOVUxMID0+IHNhdmUgb3IgZnJlZSB0aGlzIGZyYW1lICAgICAgICAgKi8KK3pidWZfdCogemZEZWZyYWdtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogcGJJc0RlZnJhZywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IGZyYWdOdW07CisgICAgdTE2X3Qgc2VxTnVtOworICAgIHU4X3QgbW9yZUZyYWdCaXQ7CisgICAgdThfdCBhZGRyWzZdOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgKnBiSXNEZWZyYWcgPSBGQUxTRTsKKyAgICBzZXFOdW0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMik7CisgICAgZnJhZ051bSA9ICh1OF90KShzZXFOdW0gJiAweGYpOworICAgIG1vcmVGcmFnQml0ID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgWk1fQklUXzIpID4+IDI7CisKKyAgICBpZiAoKGZyYWdOdW0gPT0gMCkgJiYgKG1vcmVGcmFnQml0ID09IDApKQorICAgIHsKKyAgICAgICAgLyogTm90IHBhcnQgb2YgYSBmcmFnbWVudGF0aW9uICovCisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4RnJhZ21lbnRDb3VudCsrOworICAgICAgICBzZXFOdW0gPSBzZXFOdW0gPj4gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdOdW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbW9yZSBmcmFnID0gMSAqLworICAgICAgICAgICAgLyogRmlyc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZpcnN0IEZyYWcsIHNlcT0iLCBzZXFOdW0pOworICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoZGV2LCBidWYsIGFkZHIsIHNlcU51bSk7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWlkZGxlIG9yIGxhc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZyYWcgc2VxPSIsIHNlcU51bSk7CisgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJGcmFnIG1vcmVGcmFnQml0PSIsIG1vcmVGcmFnQml0KTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmQWRkRnJhZ1RvRGVmcmFnTGlzdChkZXYsIGJ1ZiwgYWRkciwgc2VxTnVtLCBmcmFnTnVtLCBtb3JlRnJhZ0JpdCwgYWRkSW5mbyk7CisgICAgICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBiSXNEZWZyYWcgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisjaWYgWk1fUFJPVE9DT0xfUkVTUE9OU0VfU0lNVUxBVElPTgordTE2X3QgemZTd2FwKHUxNl90IG51bSkKK3sKKyAgICByZXR1cm4gKChudW0gPj4gOCkgKyAoKG51bSAmIDB4ZmYpIDw8IDgpKTsKK30KKworCit2b2lkIHpmUHJvdFJzcFNpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZXRoVHlwZTsKKyAgICB1MTZfdCBhcnBPcDsKKyAgICB1MTZfdCBwcm90OworICAgIHUxNl90IHRlbXA7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBkaXBbMl07CisgICAgdTE2X3QgZHN0UG9ydDsKKyAgICB1MTZfdCBzcmNQb3J0OworCisgICAgZXRoVHlwZSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJldGhUeXBlPSIsIGV0aFR5cGUpOworCisgICAgLyogQVJQICovCisgICAgaWYgKGV0aFR5cGUgPT0gMHgwNjA4KQorICAgIHsKKyAgICAgICAgYXJwT3AgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIGRpcFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM4KTsKKyAgICAgICAgZGlwWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJhcnBPcD0iLCBhcnBPcCk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMD0iLCBkaXBbMF0pOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJpcDE9IiwgZGlwWzFdKTsKKworICAgICAgICAvL0FSUCByZXF1ZXN0IHRvIDE5Mi4xNjguMS4xNQorICAgICAgICBpZiAoKGFycE9wID09IDB4MDEwMCkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIkFSUCIpOworICAgICAgICAgICAgLyogQVJQIHJlc3BvbnNlICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjAsIDB4MDIwMCk7CisKKyAgICAgICAgICAgIC8qIGRzdCBoYXJkd2FyZSBhZGRyZXNzICovCisKKyAgICAgICAgICAgIC8qIHNyYyBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgICAgICAgICAvL3ptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgLy96bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIC8vem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDEwLCAweDAwMDApOworCisgICAgICAgICAgICAvKiBkc3QgaXAgYWRkcmVzcyAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMisoaSoyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3JjIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMiwgMHhhMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNiwgMHgwMDAwKTsKKworICAgICAgICAgICAgLyogc3JjIGlwIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHhhOGMwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAzMCwgMHgwZjAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJQ01QICovCisgICAgZWxzZSBpZiAoZXRoVHlwZSA9PSAweDAwMDgpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJUCIpOworICAgICAgICBwcm90ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjMpOworICAgICAgICBkaXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzMCk7CisgICAgICAgIGRpcFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAicHJvdD0iLCBwcm90KTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiaXAwPSIsIGRpcFswXSk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMT0iLCBkaXBbMV0pOworCisgICAgICAgIC8qIFBJTkcgcmVxdWVzdCB0byAxOTIuMTY4LjEuMTUgKi8KKyAgICAgICAgaWYgKChwcm90ID09IDB4MSkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSUNNUCIpOworICAgICAgICAgICAgLyogY2hhbmdlIGRzdCAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNoYW5nZSBzcmMgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDgsIDB4MDAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBjaGFuZ2UgaWNtcCB0eXBlIHRvIGVjaG8gcmVwbHkgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCAzNCwgMHgwKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIGljbXAgY2hlY2tzdW0gKi8KKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNik7CisgICAgICAgICAgICB0ZW1wICs9IDg7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIHRlbXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHByb3QgPT0gMHg2KQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJUQ1AiKTsKKyAgICAgICAgICAgIHNyY1BvcnQgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNCk7CisgICAgICAgICAgICBkc3RQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzYpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiU3JjIFBvcnQ9Iiwgc3JjUG9ydCk7CisgICAgICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJEc3QgUG9ydD0iLCBkc3RQb3J0KTsKKyAgICAgICAgICAgIGlmICgoZHN0UG9ydCA9PSAweDE1MDApIHx8IChzcmNQb3J0ID09IDB4MTUwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiRlRQIik7CisKKyAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMwKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHgwZjAxKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgLyogUGF0Y2ggc3JjIHBvcnQgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0LCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzgpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM4LCB0ZW1wKTsKKworICAgICAgICAgICAgICAgIC8qIFBhdGNoIGNoZWNrc3VtICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDUwKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gemZTd2FwKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSB+dGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcCA9IH50ZW1wOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAodGVtcCk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDUwLCB0ZW1wKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHJvdCA9PSAweDExKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiVURQIik7CisgICAgICAgICAgICBzcmNQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgZHN0UG9ydCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM2KTsKKyAgICAgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlNyYyBQb3J0PSIsIHNyY1BvcnQpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiRHN0IFBvcnQ9IiwgZHN0UG9ydCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBleGNoYW5nZSBwb3J0ICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzQsIHNyY1BvcnQrMSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIGRzdFBvcnQpOworCisgICAgICAgICAgICAvKiBjaGVja3N1bSA9IDAgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA0MCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmIChldGhUeXBlID09IDB4MDA2MCkgLyogPT4weDAwNjAgaXMgcG9ydCAqLworICAgIHsKKyAgICAgICAgLyogY2hhbmdlIHNyYyBmb3IgRXZsIHRvb2wgbG9vcCBiYWNrIHJlY2VpdmUgKi8KKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisgICAgfQorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVR4U2VuZEV0aCAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gbmF0aXZlIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHBvcnQgOiBXTEFOIHBvcnQsIDA9PnN0YW5kYXJkLCAweDEtMHg3PT5WQVAsIDB4MjAtMHgyNT0+V0RTICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJheSAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaVR4U2VuZDgwMjExTWdtdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit7CisgICAgdTE2X3QgZXJyOworICAgIC8vdTE2X3QgYWRkclRibFNpemUgPSAwOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGhsZW47CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7aTwxMjtpKyspCisgICAgeworICAgICAgICBoZWFkZXJbaV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICB9CisgICAgaGxlbiA9IDI0OworCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQpOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaUlzVHhRdWV1ZUZ1bGwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICgoKCh3ZC0+dnR4cUhlYWRbMF0gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKSAhPSB3ZC0+dnR4cVRhaWxbMF0pICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlUeFNlbmRFdGggICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IEV0aGVybmV0IGZyYW1lIGZyb20gdXBwZXIgbGF5ZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogV0xBTiBwb3J0LCAwPT5zdGFuZGFyZCwgMHgxLTB4Nz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS41ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBlcnIsIHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZpVHhTZW5kRXRoKCksIHBvcnQ9IiwgcG9ydCk7CisgICAgLyogUmV0dXJuIGVycm9yIGlmIHBvcnQgaXMgZGlzYWJsZWQgKi8KKyAgICBpZiAoKGVyciA9IHpmVHhQb3J0Q29udHJvbChkZXYsIGJ1ZiwgcG9ydCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgeworICAgICAgICBlcnIgPSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRDsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworI2lmIDEKKyAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAmJiAocG9ydCA8IDB4MjApKQorICAgIHsKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIGJ1ZiwgcG9ydCkpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qY2hlY2sgWk1fRU5BQkxFX1BPV0VSX1NBVkUgZmxhZyovCisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfUFMKKyAgICAvKiBJQlNTIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlic3NQU1F1ZXVlRGF0YShkZXYsIGJ1ZikgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgMQorICAgIC8vaWYgKCB3ZC0+YlFvU0VuYWJsZSApCisgICAgaWYgKDEpCisgICAgeworICAgICAgICAvKiBQdXQgdG8gVlRYUVthY10gKi8KKyAgICAgICAgcmV0ID0gemZQdXRWdHhxKGRldiwgYnVmKTsKKworICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gemZUeFNlbmRFdGgoZGV2LCBidWYsIHBvcnQsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgcmV0dXJuIHpmVHhTZW5kRXRoKGRldiwgYnVmLCBwb3J0LCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworI2VuZGlmCisKK3psRXJyb3I6CisgICAgem1fbXNnMl90eChaTV9MVl8xLCAiVHggQ29tcCBlcnI9IiwgZXJyKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGggICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdTE2X3QgZmxhZykKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGosIGlkOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBkYVszXTsKKyAgICB1MTZfdCBzYVszXTsKKyAgICB1OF90IHVwOworICAgIHU4X3QgcW9zVHlwZSwga2V5SWR4ID0gMDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHUxNl90IG5ld0ZsYWc7CisgICAgc3RydWN0IHpzTWljVmFyKiAgcE1pY0tleTsKKyAgICB1OF90IHRraXBGcmFtZU9mZnNldCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3RmxhZyA9IGZsYWcgJiAweGZmMDA7CisgICAgZmxhZyA9IGZsYWcgJiAweGZmOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworICAgIC8vRU9TUCBiaXQKKyAgICBpZiAobmV3RmxhZyAmIDB4MTAwKQorICAgIHsKKyAgICAgICAgdXAgfD0gMHgxMDsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgICAgICAvKiBTQSAqLworICAgICAgICBzYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE2KTsKKyAgICAgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLworICAgIH0KKyNlbHNlCisgICAgLyogREEgKi8KKyAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAvKiBTQSAqLworICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyNlbmRpZgorICAgIC8vRGVjaWRlIEtleSBJbmRleCBpbiBBVE9NLCBObyBtZWFuaW5nIGluIE9UVVMtLUNXWWFuZyhtKQorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGtleUlkeCA9IHdkLT5hcC5iY0hhbEtleUlkeFtwb3J0XTsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRhKTsKKyAgICAgICAgaWYgKGlkICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGtleUlkeCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAod2QtPnN0YS5lbmNyeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgY2FzZSBaTV9XRVAxMjg6CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5rZXlJZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJZHggPSA0OworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9DRU5DOgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5jZW5jS2V5SWQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU05BUCAqLworICAgIHJlbW92ZUxlbiA9IHpmVHhHZW5XbGFuU25hcChkZXYsIGJ1Ziwgc25hcCwgJnNuYXBMZW4pOworICAgIC8vem1fbXNnMV90eChaTV9MVl8wLCAiZnJhZ09mZj0iLCBmcmFnT2ZmKTsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBBZGQgMjAwNzEwMjUgTXh6ZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRXRoZXJuZXQgOiBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS02LS0rLS02LS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgICB8ICBEQSB8ICBTQSB8IFR5cGV8ICBJUCBIZWFkZXIgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgTVNEVSA9IDYgKyA2ICsgMiArICggTmV0d29yayBMYXllciBoZWFkZXIgKSArICggVHJhbnNwb3J0IExheWVyIGhlYWRlciApICsgTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTVNEVSAtIERBIC0gU0EgOiBmcmFtZUxlbiAtPSByZW1vdmVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICB8IFR5cGV8IElQIEhlYWRlciAgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkJCQkJCQkJCQkJCSAgKi8KKy8qICBNUERVIDogZnJhbWVMZW4gKyBtcGR1TGVuZ3RoT2Zmc2V0IDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0rLS0tMi0tLSstLS0tMi0tLSstNi0rLTYtKy0tNi0tKy0tLTItLS0tKy0tMS0tKy0tMS0rLS0tMS0tLSstLS0tLS0tMy0tLS0tLSstZnJhbWVMZW4tKy0tLTQtLSstICovCisvKiAgfCBmcmFtZSB8ZHVyYXRpb258IERBfFNBIHxCU1NJRHxzZXF1ZW5jZXxTTkFQIHxTTkFQfENvbnRyb2x8ICAgIFJGQyAxMDQyICB8ICAgICAgICAgIHwgIEZDUyB8ICAqLworLyogIHxDb250cm9sfCAgICAgICAgfCAgIHwgICB8ICAgICB8IG51bWJlciB8RFNBUCB8U1NBUHwgICAgICAgfCBlbmNhcHN1bGF0aW9ufCAgICAgICAgICB8ICAgICAgfCAgKi8KKy8qIC0rLS0tLS0tLSstLS0tLS0tLSstLS0rLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGZyYWdMZW4gPSB3ZC0+ZnJhZ1RocmVzaG9sZCArIHRraXBGcmFtZU9mZnNldDsgICAvLyBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCBmb3IgTVBEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsgICAgLy8gTVNEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gLT0gcmVtb3ZlTGVuOyAgICAgICAgICAgICAgICAgLy8gTVNEVSBMZW5ndGhzIC0gREEgLSBTQQorCisgICAgLyogIzFzdCBjcmVhdGUgTUlDIExlbmd0aCBtYW51YWxseSAqLworICAgIG1pY0xlbiA9IDA7CisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogIzJuZCBBc3NpZ24gc2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmcmFnLnNlcVswXSA9ICgod2QtPnNlcVt6Y1VwVG9BY1t1cCYweDddXSsrKSA8PCA0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogIzNyZCBQYXNzIHRoZSB0b3RhbCBwYXlsb2FkIHRvIGdlbmVyYXRlIE1QRFUgbGVuZ3RoICEgKi8KKyAgICBmcmFnLmJ1ZlswXSA9IGJ1ZjsKKyAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgIGZyYWcuZmxhZ1swXSA9ICh1OF90KWZsYWc7CisgICAgZnJhZ051bSA9IDE7CisKKyAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmWzBdLCBoZWFkZXIsIGZyYWcuc2VxWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1swXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwgcG9ydCwgZGEsIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLCAmbWljTGVuLCBzbmFwLCBzbmFwTGVuLCBOVUxMKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiIzEgaGVhZGVyTGVuID0gIiwgaGVhZGVyTGVuKTsKKworICAgIC8qICM0dGggQ2hlY2sgdGhlIEhlYWRlckxlbiBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIE1QRFUgTGVuZ3RocyBiaWdnZXIgdGhhbiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAgKi8KKyAgICAvKiBJZiBNUERVIExlbmd0aHMgbGFyZ2UgdGhhbiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAtLT4gaGVhZGVyTGVuID0gMCAqLworICAgIGlmKCBoZWFkZXJMZW4gIT0gMCApCisgICAgeworICAgICAgICB6ZjgwMjExRnJhbWVTZW5kKGRldiwgZnJhZy5idWZbMF0sIGhlYWRlciwgc25hcExlbiwgZGEsIHNhLCB1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6Y1VwVG9BY1t1cCYweDddLCBrZXlJZHgpOworICAgIH0KKyAgICBlbHNlIC8vaWYoIGhlYWRlckxlbiA9PSAwICkgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkCisgICAgeworICAgICAgICB1MTZfdCBtcGR1TGVuZ3RoT2Zmc2V0OworICAgICAgICB1MTZfdCBwc2V1ZFNuYXBMZW4gPSAwOworCisgICAgICAgIG1wZHVMZW5ndGhPZmZzZXQgPSBoZWFkZXJbMF0gLSBmcmFtZUxlbjsgLy8gRm9yIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICEKKworICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7IC8vIEdldCBzbmFwIGFuZCBtaWMgaW5mb3JtYXRpb24KKworICAgICAgICBmcmFnTGVuID0gZnJhZ0xlbiAtIG1wZHVMZW5ndGhPZmZzZXQ7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMiBmcmFtZUxlbiA9ICIsIGZyYW1lTGVuKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMyBmcmFnVGhyZXNob2xkID0gIiwgZnJhZ0xlbik7CisKKyAgICAgICAgLyogZnJhZ21lbnRhdGlvbiAqLworICAgICAgICBpZiAoZnJhbWVMZW4gPj0gZnJhZ0xlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9jb3B5IGZyYWdMZW4gdG8gZnJhZworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSggZnJhbWVMZW4gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyYWcuYnVmW2ldID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBmcmFnTGVuKzMyKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSA9IFpNX0lOVEVSTkFMX0FMTE9DX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgZnJhZy5zZXFbaV0gPSBmcmFnLnNlcVswXSArIGk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbW92ZUxlbiArIGkqZnJhZ0xlbjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb25zaWRlciB0aGUgb2Zmc2V0IGlmIHdlIGNvbnNpZGVyIHNuYXAgbGVuZ3RoIHRvIHRoZSBvdGhlciBmcmFnbWVudGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmICggaSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIHBzZXVkU25hcExlbiooaS0xKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPiBmcmFnTGVuICsgcHNldWRTbmFwTGVuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSBmbGFnIHwgMHg0OyAvKiBNb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGZyYWdtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBTTkFQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8c25hcExlbjsgais9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgZnJhZy5idWZbaV0sIGosIHNuYXBbKGo+PjEpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1Ziwgc25hcExlbiwgb2Zmc2V0LCBmcmFnTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIHNuYXBMZW4rZnJhZ0xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcHNldWQgc25hcCBsZW5ndGggdG8gdGhlIG90aGVyIGZyYWdtZW50ZWQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZFNuYXBMZW4gPSBzbmFwTGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybWVkaWF0ZSBGcmFnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZUeEJ1ZmZlckNvcHkoZGV2LCBmcmFnLmJ1ZltpXSwgYnVmLCAwLCBvZmZzZXQsIGZyYWdMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGZyYWcuYnVmW2ldLCBmcmFnTGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1ZiwgMCwgb2Zmc2V0LCBmcmFnTGVuK3BzZXVkU25hcExlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSwgZnJhZ0xlbitwc2V1ZFNuYXBMZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gKGZyYWdMZW4rcHNldWRTbmFwTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgZnJhZ21lbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4QnVmZmVyQ29weShkZXYsIGZyYWcuYnVmW2ldLCBidWYsIDAsIG9mZnNldCwgZnJhbWVMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIE1JQyBpZiBuZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pY0xlbiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9SeEJ1ZmZlcihkZXYsIGZyYWcuYnVmW2ldLCAodThfdCopIG1pYywgZnJhbWVMZW4sIG1pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIGZyYW1lTGVuK21pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSAodThfdClmbGFnOyAvKiBObyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBpbmRleCBvZiB0aGUgYnVmICEhIQorICAgICAgICAgICAgICAgIC8vIElmIHdyaXRlIHRvIG51bGwgYnVmICwgdGhlIE9TIHdpbGwgY3Jhc2ggISEhCisgICAgICAgICAgICAgICAgemZ3Q29weUJ1ZkNvbnRleHQoZGV2LCBidWYsIGZyYWcuYnVmW2ktMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ051bSA9IGk7CisgICAgICAgICAgICBzbmFwTGVuID0gbWljTGVuID0gcmVtb3ZlTGVuID0gMDsKKworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgICAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmW2ldLCBoZWFkZXIsIGZyYWcuc2VxW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy5mbGFnW2ldLCBzbmFwTGVuK21pY0xlbiwgcmVtb3ZlTGVuLCBwb3J0LCBkYSwgc2EsIHVwLCAmbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCwgc25hcExlbiwgTlVMTCk7CisKKyAgICAgICAgICAgIHpmODAyMTFGcmFtZVNlbmQoZGV2LCBmcmFnLmJ1ZltpXSwgaGVhZGVyLCBzbmFwTGVuLCBkYSwgc2EsIHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KTsKKworICAgICAgICB9IC8qIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykgKi8KKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFBvcnRDb250cm9sICAgICAgICAgICAgICovCisvKiAgICAgIENoZWNrIHBvcnQgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogcG9ydCBudW1iZXIsIDA9PnN0YW5kYXJkLCAxMC0xNz0+VmlydHVhbCBBUCwgMjAtMjU9PldEUyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9QT1JUX0VOQUJMRUQgb3IgWk1fUE9SVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaWduYXR1cmUgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS40ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZUeFBvcnRDb250cm9sKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzMsICJQYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGRpc2Nvbm5lY3Qgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBaTV9QT1JUX0RJU0FCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1BPUlRfRU5BQkxFRDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZklkbFJlY3YgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRG8gZnJhbWUgdmFsaWRhdGlvbiBhbmQgZmlsdGVyaW5nIHRoZW4gcGFzcyB0byB6ZndSZWN2ODAyMTEoKS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB1MTZfdCBic3NpZFszXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIC8qIHRhbGx5ICovCisgICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCsrOworCisgICAgYnNzaWRbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgYnNzaWRbMV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgYnNzaWRbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisKKyAgICAvKiBWYWxpZGF0ZSBSeCBmcmFtZSAqLworICAgIGlmICgocmV0ID0gemZXbGFuUnhWYWxpZGF0ZShkZXYsIGJ1ZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzEsICJSeCBpbnZhbGlkOiIsIHJldCk7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvLyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgLyoKKyAgICAgKiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICB0aWRfcnggPSB6ZkFnZ1J4RW5hYmxlZChkZXYsIGJ1Zik7CisgICAgaWYgKHRpZF9yeCAmJiB3ZC0+cmVvcmRlcikKKyAgICB7CisgICAgICAgIHpmQWdnUngoZGV2LCBidWYsIGFkZEluZm8sIHRpZF9yeCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICAvLyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBGaWx0ZXIgUnggZnJhbWUgKi8KKyAgICBpZiAoKHJldCA9IHpmV2xhblJ4RmlsdGVyKGRldiwgYnVmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIlJ4IGR1cGxpY2F0ZWQ6IiwgcmV0KTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIC8qIERpc2NhcmQgZXJyb3IgZnJhbWUgZXhjZXB0IG1pYyBmYWlsdXJlICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICYgMHgzZikgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICggd2QtPlhMaW5rTW9kZSAmJiAoKGFkZEluZm8tPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiAweDNmKT09MHgxMCkgJiYKKyAgICAgICAgICAgICB6ZkNvbXBhcmVXaXRoQnNzaWQoZGV2LCBic3NpZCkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCeXBhc3MgZnJhbWVzICEhIQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBPVFVTIGNvbW1hbmQtODIxMiBkdW1wIHJ4IHBhY2tldCAqLworICAgIGlmICh3ZC0+cnhQYWNrZXREdW1wKQorICAgIHsKKyAgICAgICAgemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisgICAgfQorCisgICAgLyogQ2FsbCB6ZndSZWN2ODAyMTEoKSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGRlbGl2ZXIgUnggcGFja2V0ICovCisgICAgLyogdG8gZHJpdmVyIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsgLy9DV1lhbmcobSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuOworCit6bEVycm9yOgorICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgcGFja2V0LCBlcnJvciBjb2RlOiIsIHJldCk7CisKKyAgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSsrOworCisgICAgLyogRnJlZSBSeCBidWZmZXIgKi8KKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2hvd1J4RUFQT0woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCAgIHBhY2tldFR5cGUsIGtleVR5cGUsIGNvZGUsIGlkZW50aWZpZXIsIHR5cGUsIGZsYWdzOworICAgIHUxNl90ICBwYWNrZXRMZW4sIGtleUluZm8sIGtleUxlbiwga2V5RGF0YUxlbiwgbGVuZ3RoLCBPcF9Db2RlOworICAgIHUzMl90ICByZXBsYXlDb3VudGVySCwgcmVwbGF5Q291bnRlckwsIHZlbmRvcklkLCBWZW5kb3JUeXBlOworCisgICAgLyogRUFQT0wgcGFja2V0IHR5cGUgKi8KKyAgICBwYWNrZXRUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOyAvLyAwOiBFQVAtUGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRUFQT0wtU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiBFQVBPTC1Mb2dvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzOiBFQVBPTC1LZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBFQVBPTC1FbmNhcHN1bGF0ZWQtQVNGLUFsZXJ0CisKKyAgICAvKiBFQVBPTCBmcmFtZSBmb3JtYXQgKi8KKyAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgIC8qICAgICAgICAgICAgUEFFIEV0aGVybmV0IFR5cGUgKDB4ODg4ZSkgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAyICovCisgICAgLyogICAgIFByb3RvY29sIFZlcnNpb24gICAgfCAgICAgICAgIFR5cGUgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gNiAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICBQYWNrZXQgQm9keSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOICovCisKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKworICAgICAgICAvKiBFQVAtUGFja2V0IENvZGUgKi8KKyAgICAgICAgY29kZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsgLy8gMSA6IFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiA6IFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgOiBTdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgOiBGYWlsdXJlCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1OF90ICAgcGFja2V0VHlwZSwga2V5VHlwZSwgY29kZSwgaWRlbnRpZmllciwgdHlwZSwgZmxhZ3M7CisgICAgdTE2X3QgIHBhY2tldExlbiwga2V5SW5mbywga2V5TGVuLCBrZXlEYXRhTGVuLCBsZW5ndGgsIE9wX0NvZGU7CisgICAgdTMyX3QgIHJlcGxheUNvdW50ZXJILCByZXBsYXlDb3VudGVyTCwgdmVuZG9ySWQsIFZlbmRvclR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJFQVBPTCBQYWNrZXQgc2l6ZSA9ICIsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpKTsKKworICAgIC8qIEVBUE9MIHBhY2tldCB0eXBlICovCisgICAgLy8gMDogRUFQLVBhY2tldAorICAgIC8vIDE6IEVBUE9MLVN0YXJ0CisgICAgLy8gMjogRUFQT0wtTG9nb2ZmCisgICAgLy8gMzogRUFQT0wtS2V5CisgICAgLy8gNDogRUFQT0wtRW5jYXBzdWxhdGVkLUFTRi1BbGVydAorCisgICAgLyogRUFQT0wgZnJhbWUgZm9ybWF0ICovCisgICAgLyogIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KKyAgICAvKiAgICAgICAgICAgIFBBRSBFdGhlcm5ldCBUeXBlICgweDg4OGUpICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gMiAqLworICAgIC8qICAgICBQcm90b2NvbCBWZXJzaW9uICAgIHwgICAgICAgICBUeXBlICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDYgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgUGFja2V0IEJvZHkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgcGFja2V0VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKyAgICAgICAgLyogRUFQLVBhY2tldCBDb2RlICovCisgICAgICAgIGNvZGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCk7IC8vIDEgOiBSZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgOiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIDogU3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IDogRmFpbHVyZQorCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVJlY3Y4MDIxMSAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gcmVjZWl2ZSA4MDIuMTEgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcmVjZWl2ZWQgODAyLjExIGZyYW1lIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHU4X3Qgc25hcENhc2U9MCwgZW5jcnlNb2RlOworICAgIHUxNl90IGZyYW1lVHlwZSwgdHlwZUxlbmd0aEZpZWxkOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGxlbjsKKyAgICB1OF90IGJJc0RlZnJhZyA9IDA7CisgICAgdTE2X3Qgb2Zmc2V0LCB0YWlsTGVuOworICAgIHU4X3QgdmFwID0gMDsKKyAgICB1MTZfdCBkYVszXSwgc2FbM107CisgICAgdTE2X3QgaWk7CisgICAgdThfdCB1YXBzZFRyaWcgPSAwOworICAgIHpidWZfdCogcHNCdWY7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgdThfdCBpOworI2VuZGlmCisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMiwgInpmaVJlY3Y4MDIxMSgpLCBidWY9IiwgYnVmKTsKKworICAgIC8vem1fbXNnMl9yeChaTV9MVl8wLCAiaFswXT0iLCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKSk7CisgICAgLy96bV9tc2cyX3J4KFpNX0xWXzAsICJoWzJdPSIsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpKTsKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMCwgImhbNF09Iiwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyNpZiAwICAgLy8gTW92ZSB0byBQcm9jZXNzQmVhY29uIHRvIGp1ZGdlIGlmIHRoZXJlJ3MgYSBuZXcgcGVlciBzdGF0aW9uCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykmJgorICAgICAgICAgKHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgIT0gWk1fSUJTU19QQVJUTkVSX0FMSVZFKSApCisgICAgeworICAgICAgICB6ZlN0YUlic3NNb25pdG9yaW5nKGRldiwgYnVmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzKys7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJSZWNlaXZlIHBhY2tldHMgICAgID0gIiwgd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHMpOworCisgICAgICAgIC8vem1fbXNnMF9yeChaTV9MVl8wLCAiUnggZGF0YSIpOworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gemZBcFVwZGF0ZVBzQml0KGRldiwgYnVmLCAmdmFwLCAmdWFwc2RUcmlnKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHVhcHNkVHJpZyYweGYpICE9IDApICYmICgoZnJhbWVTdWJ0eXBlICYgMHg4MCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBhYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgIHU4X3QgcGt0TnVtOworICAgICAgICAgICAgICAgIHU4X3QgbWI7CisgICAgICAgICAgICAgICAgdTE2X3QgZmxhZzsKKyAgICAgICAgICAgICAgICB1OF90IHNyY1s2XTsKKworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJRb1MgY3RybD0lZFxuIiwgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjQpKTsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiVUFQU0QgdHJpZ2dlciwgYWM9JWRcbiIsIGFjKTsKKworICAgICAgICAgICAgICAgIGlmICgoKDB4OD4+YWMpICYgdWFwc2RUcmlnKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0TnVtID0gemNNYXhzcFRvUGt0TnVtWyh1YXBzZFRyaWc+PjQpICYgMHgzXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpPTA7IGlpPDY7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaT0wOyBpaTxwa3ROdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+YXAudWFwc2RRKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPSB6ZlF1ZXVlR2V0V2l0aE1hYyhkZXYsIHdkLT5hcC51YXBzZFEsIHNyYywgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlpKzEpID09IHBrdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRU9TUCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwIHwgKG1iPDw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbW9yZSBkYXRhLCBub3QgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vIG1vcmUgZGF0YSwgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPT0gTlVMTCkgfHwgKG1iID09IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWkgPT0gMCkgJiYgKHBzQnVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgKHUxNl90KilzcmMsIDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IGZyYW1lQ3RybE1TQjsKKyAgICAJCXU4X3QgICBic3NpZFs2XTsKKworICAgICAgICAgICAgLyogQ2hlY2sgSXMgUklGUyBmcmFtZSBhbmQgZGVjaWRlIHRvIGVuYWJsZSBSSUZTIG9yIG5vdCAqLworICAgICAgICAgICAgaWYoIHdkLT5zdGEuRW5hYmxlSFQgKQorICAgICAgICAgICAgICAgIHpmQ2hlY2tJc1JJRlNGcmFtZShkZXYsIGJ1ZiwgZnJhbWVTdWJ0eXBlKTsKKworICAgICAgICAgICAgaWYgKCB6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpIHx8IHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lQ3RybE1TQiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgaWYgKCBmcmFtZUN0cmxNU0IgJiBaTV9CSVRfNSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHJ4IGZyYW1lJ3MgQUMgaXMgbm90IGRlbGl2ZXJ5LWVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLnFvc0luZm8mMHhmKSAhPSAweGYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgcnhBYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZyYW1lU3VidHlwZSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhBYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgweDg+PnJ4QWMpICYgd2QtPnN0YS5xb3NJbmZvKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkvKmluY3JlYXNlIGJlYWNvbiBjb3VudCB3aGVuIHJlY2VpdmUgdmFpbGQgZGF0YSBmcmFtZSBmcm9tIEFQKi8KKyAgICAgICAgCVpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisJCQlpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpJiYKKwkJCQl6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgYnNzaWQsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNikpCisJCQl7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJSeCBWQVA9IiwgdmFwKTsKKworICAgICAgICAvKiBoYW5kbGUgSVYsIEVYVC1JViwgSUNWLCBhbmQgRVhULUlDViAqLworICAgICAgICB6ZkdldFJ4SXZJY3ZMZW5ndGgoZGV2LCBidWYsIHZhcCwgJm9mZnNldCwgJnRhaWxMZW4sIGFkZEluZm8pOworCisgICAgICAgIHpmU3RhSWJzc1BTQ2hlY2tTdGF0ZShkZXYsIGJ1Zik7CisgICAgICAgIC8vUW9TIGRhdGEgZnJhbWUKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICAvKiByZW1vdmUgSUNWICovCisgICAgICAgIGlmICh0YWlsTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbiA+IHRhaWxMZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuIC09IHRhaWxMZW47CisgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbHRlciBOVUxMIGRhdGEgKi8KKyAgICAgICAgaWYgKCgoZnJhbWVTdWJ0eXBlJjB4NDApICE9IDApIHx8ICgobGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikpPD0yNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgUnggTlVMTCBkYXRhLCBsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgYW5kIGhhbmRsZSBkZWZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmJTYWZlTW9kZSAmJiAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMpICYmIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQnlwYXNzIGRlZnJhZ21lbnRhdGlvbiBwYWNrZXRzIGluIHNhZmUgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYnVmID0gemZEZWZyYWdtZW50KGRldiwgYnVmLCAmYklzRGVmcmFnLCBhZGRJbmZvKSkgPT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkIGluIHpmRGVmcmFnbWVudCAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFpNX01JQ19TVUNDRVNTOworCisgICAgICAgIC8qIElmIFNXIFdFUC9US0lQIGFyZSBub3QgdHVybmVkIG9uICovCisgICAgICAgIGlmICgod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19US0lQX0RFQ1JZX0VOKSA9PSAwICYmCisgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfREVDUllfRU4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKGFkZEluZm8pOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBUS0lQICovCisgICAgICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJJc0RlZnJhZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgTUlDIGZhaWx1cmUgYml0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKGFkZEluZm8pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gWk1fTUlDX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHJldCA9PSBaTV9NSUNfRkFJTFVSRSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IFVuaWNhc3RfUGt0ID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSAmIDB4MSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVW5pY2FzdF9Qa3QgPSAweDE7CisgICAgICAgICAgICAgICAgICAgIH0vKgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeE11bHRpY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB1OF90IGFkZHJbNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyW2lkeF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkoZGV2LCBhZGRyLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVW5pY2FzdF9Qa3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBVbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IE5vbi1VbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MCkgfHwgKFVuaWNhc3RfUGt0ID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBEbyBNSUMgQ2hlY2sgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoZGV2LCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogU0tJUCBNSUMgQ2hlY2sgZHVlIHRvIEdyb3VwIEtleWNoYW5naW5nICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgSXNFbmNyeUZyYW1lOworCisgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB3aGV0aGVyIFdFUCBiaXQgaXMgdHVybmVkIG9uIGluIE1BQyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKworICAgICAgICAgICAgSXNFbmNyeUZyYW1lID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHg0MCk7CisKKyAgICAgICAgICAgIGlmIChJc0VuY3J5RnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdHdhcmUgZGVjcnlwdGlvbiBmb3IgVEtJUCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfREVDUllfRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjMyOworICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisgICAgICAgICAgICAgICAgICAgIHUxNl90IEl2T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgenNUa2lwU2VlZCAqcnhTZWVkOworCisgICAgICAgICAgICAgICAgICAgIEl2T2Zmc2V0ID0gb2Zmc2V0ICsgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSOworCisgICAgICAgICAgICAgICAgICAgIHJ4U2VlZCA9IHpmU3RhR2V0UnhTZWVkKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnhTZWVkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInJ4U2VlZCBpcyBOVUxMIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpdjE2ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KSA8PCA4KSArIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzIpOworICAgICAgICAgICAgICAgICAgICBpdjMyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgSXZPZmZzZXQrNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzUpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCs2KSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzcpIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBUS0lQIEtleSBNaXhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHJ4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peChpdjE2LCByeFNlZWQpOworICAgICAgICAgICAgICAgICAgICB6ZlRraXBHZXRzZWVkcyhpdjE2LCBSQzRLZXksIHJ4U2VlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVjcnlwdCBEYXRhICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmVEtJUERlY3J5cHQoZGV2LCBidWYsIEl2T2Zmc2V0K1pNX1NJWkVfT0ZfSVYrWk1fU0laRV9PRl9FWFRfSVYsIDE2LCBSQzRLZXkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWk1fSUNWX0ZBSUxVUkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAgSUNWIGZhaWwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCBJQ1YgZmFpbGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBJQ1YgZnJvbSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuLTQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIE1JQyAqLworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IFpNX01JQ19GQUlMVVJFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBhZGRyWzZdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcltpZHhdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFwTWljRmFpbHVyZU5vdGlmeShkZXYsIGFkZHIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU3RhTWljRmFpbHVyZUhhbmRsaW5nKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiTUlDIGZhaWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfV0VQX0RFQ1JZX0VOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgSXZPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCAqd2VwS2V5OworICAgICAgICAgICAgICAgICAgICB1OF90IGtleUlkeDsKKworICAgICAgICAgICAgICAgICAgICBJdk9mZnNldCA9IG9mZnNldCArIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUjsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgICAgICAgICAgICAgICAgICBpdlswXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsxKTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMl0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsyKTsKKworICAgICAgICAgICAgICAgICAgICBrZXlJZHggPSAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzMpID4+IDYpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgICAgICAgSXZPZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJZHhdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAxMjgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAyNTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDI5OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZXRVBEZWNyeXB0KGRldiwgYnVmLCBJdk9mZnNldCwga2V5TGVuLCB3ZC0+c3RhLndlcEtleVtrZXlJZHhdLCBpdik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9JQ1ZfRkFJTFVSRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIElDViBmYWlsIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgSUNWIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSB3ZC0+c3RhLlNXRW5jcnlNb2RlW2tleUlkeF07CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIElDViBmcm9tIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBsZW4tNCk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IFpNX1NJWkVfT0ZfSVY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAvL2Vsc2UgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApIC8qIGNoZWNrIGlmIENFTkMgKi8KKyAgICAgICAgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMl90IHJ4SVZbNF07CisKKyAgICAgICAgICAgIHJ4SVZbMF0gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjgpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgICAgICByeElWWzFdID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICsgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzApOworICAgICAgICAgICAgcnhJVlsyXSA9ICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICArIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM0KTsKKyAgICAgICAgICAgIHJ4SVZbM10gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzOCk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlswXSA9IDB4IiwgcnhJVlswXSk7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoInJ4SVZbMV0gPSAweCIsIHJ4SVZbMV0pOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJyeElWWzJdID0gMHgiLCByeElWWzJdKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlszXSA9IDB4IiwgcnhJVlszXSk7CisKKyAgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MqLworICAgICAgICAgICAgZGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICAgICAgZGFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMik7CisgICAgICAgICAgICBkYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KTsKKworICAgICAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAgeyAvL211bHRpY2FzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAvKiBBY2N1bWxhdGUgdGhlIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzBdICsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1swXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdkdLWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzBdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1swXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2R0tbMV0gPSAweCIsIHdkLT5zdGEucnhpdkdLWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZHS1syXSA9IDB4Iiwgd2QtPnN0YS5yeGl2R0tbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzNdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1szXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhKCh3ZC0+c3RhLnJ4aXZHS1swXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdkdLWzFdID09IHJ4SVZbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gcnhJVlsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgUGFja2V0RGlzY2FyZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIFBOIENvZGUgRXJyb3IgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeElWWzBdIDwgd2QtPnN0YS5yeGl2R0tbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0RGlzY2FyZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMF0gPiAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAvL2JvdW5kYXJ5IGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gPCAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKCgweGZmZmZmZmZmIC0gd2QtPnN0YS5yeGl2R0tbMF0pICsgcnhJVlswXSkgPiAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXREaXNjYXJkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7IC8vbm9ybWFsIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gLSB3ZC0+c3RhLnJ4aXZHS1swXSkgPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldERpc2NhcmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmMgc3RhIHBuIGNvZGUgd2l0aCBhcCBiZWNhdXNlIG9mIGxvc3Rpbmcgc29tZSBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IHJ4SVZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IHJ4SVZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1szXSA9IHJ4SVZbM107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFja2V0RGlzY2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbG9zdCB0b28gbXVjaCBtdWx0aWNhc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgLy91bmljYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtbGF0ZSB0aGUgUE4gc2VxdWVuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlswXSA9PSAwIHx8IHdkLT5zdGEucnhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZbMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2WzJdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlszXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlswXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZbMV0gPSAweCIsIHdkLT5zdGEucnhpdlsxXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2WzJdID0gMHgiLCB3ZC0+c3RhLnJ4aXZbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlszXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzNdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICEoKHdkLT5zdGEucnhpdlswXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsxXSA9PSByeElWWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsyXSA9PSByeElWWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlszXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlBOIENvZGUgbWlzbWF0Y2gsIGxvc3QgdW5pY2FzdCBmcmFtZSwgc3luYyBwbiBjb2RlIHRvIHJlY3YgcGFja2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jIHN0YSBwbiBjb2RlIHdpdGggYXAgYmVjYXVzZSBvZiBsb3N0aW5nIHNvbWUgcGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gcnhJVlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMl0gPSByeElWWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gcnhJVlszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgUE4gQ29kZSBFcnJvciBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbWlzbWF0Y2ggdW5pY2FzdCBmcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisgICAgICAgIC8qIGZvciB0YWxseSAqLworICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvciBBQ1UgdG8gZGlzcGxheSBSeFJhdGUgKi8KKyAgICAgICAgICAgIHpmV2xhblVwZGF0ZVJ4UmF0ZShkZXYsIGFkZEluZm8pOworCisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzICs9IChsZW4tMjQpOworICAgICAgICB9CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljKys7CisKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBRb1MgY29udHJvbCBiaXQtNyBpcyAxID0+IEEtTVNEVSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNCkgJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVBbXNkdShkZXYsIGJ1ZiwgdmFwLCBlbmNyeU1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBNSUMgb2YgVEtJUAorICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgLSA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgODAyLjExIGFuZCBTTkFQIGhlYWRlciB0byBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpfHwKKyAgICAgICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzKi8KKyAgICAgICAgICAgIGRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAgICAgICAgIGRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKzIpOworICAgICAgICAgICAgZGFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrNCk7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGJyb2FkY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCAoZGFbMF0gPT0gMHhmZmZmKSAmJiAoZGFbMV0gPT0gMHhmZmZmKSAmJiAoZGFbMl0gPT0gMHhmZmZmKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXAgc2VuZCBicm9hZGNhc3QgZnJhbWUgdG8gdGhlIERVVCAhCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjaGVjayBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIC8qIFRPRE8gOiBSZW1vdmUgdGhlc2UgY29kZSwgaGFyZHdhcmUgc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBtdWx0aWNhc3QgZnJhbWUgb24gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBvciBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgYnkgZmxhZyBiQWxsTXVsdGljYXN0ICovCisgICAgICAgICAgICBlbHNlIGlmICgoZGFbMF0gJiAweDAxKSAmJiAod2QtPnN0YS5iQWxsTXVsdGljYXN0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpaT0wOyBpaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaWkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKHdkLT5zdGEubXVsdGljYXN0TGlzdC5tYWNBZGRyW2lpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopIGRhLCA2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGlpID09IHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplICkKKyAgICAgICAgICAgICAgICB7ICAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImRpc2NhcmQgdW5rbm93biBtdWx0aWNhc3QgZnJhbWUiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgLy9UbyByZW1vdmUgSVYKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0xMjsgaT4wOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAoaS0xKSoyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisjZWxzZQorCisgICAgICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIHpnU25hcEJyaWRnZVR1bm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCtvZmZzZXQsIDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNuYXBDYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgemdTbmFwODAyMWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQrb2Zmc2V0LCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZUxlbmd0aEZpZWxkID0KKyAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMwK29mZnNldCkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzErb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigidHB5ZUxlbmd0aEZpZWxkID0gIiwgdHlwZUxlbmd0aEZpZWxkKTsKKworICAgICAgICAgICAgICAgIC8vODEzNyA6IElQWCwgODBGMyA6IEFwcGxldGFsaworICAgICAgICAgICAgICAgIGlmICggKHR5cGVMZW5ndGhGaWVsZCAhPSAweDgxMzcpJiYKKyAgICAgICAgICAgICAgICAgICAgICh0eXBlTGVuZ3RoRmllbGQgIT0gMHg4MEYzKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbmFwQ2FzZSA9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlTGVuZ3RoRmllbGQgPT0gMHg4ODhFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2hvd1J4RUFQT0woZGV2LCBidWYsIDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndEdW1wQnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAzICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHNuYXBDYXNlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTQSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHNhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCBzYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4K29mZnNldCwgc2FbMl0pOworCisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTgrb2Zmc2V0LCBkYVswXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIwK29mZnNldCwgZGFbMV0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIGRhWzJdKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBICovCisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE2K29mZnNldCwgc2FbMF0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHNhWzFdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjArb2Zmc2V0LCBzYVsyXSk7CisKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCtvZmZzZXQsIGRhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTIrb2Zmc2V0LCBkYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE0K29mZnNldCwgZGFbMl0pOworICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIDEwK29mZnNldCk7CisgICAgICAgICAgICAgICAgLyogRXRoZXJuZXQgcGF5bG9hZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB0eXBlTGVuZ3RoRmllbGQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSAtIDE0OworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMiwgKHR5cGVMZW5ndGhGaWVsZDw8OCkrKHR5cGVMZW5ndGhGaWVsZD4+OCkpOworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgzKSAhPSAzKQorICAgICAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgICAgIC8vVG8gcmVtb3ZlIElWCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTI7IGk+MDsgaS0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgKGktMSkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBTQSA9IEFkZHJlc3MgMiAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMyAqLworICAgICAgICAgICAgICAgIC8qIFNlcSA6IFJlYWQgMjAgd3JpdGUgMjIsIHJlYWQgMTggd3JpdGUgMjAsIHJlYWQgMTYgd3JpdGUgMTggKi8KKyAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBtdXN0IG5vdCBiZSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCkpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gemZJbnRyYWJzc0ZvcndhcmQoZGV2LCBidWYsIHZhcCkpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciBpZiBpbnRyYS1CU1MgdW5pY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJGcmVlIGludHJhLUJTUyB1bmljYXN0IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogV0RTIG1vZGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJSeCBXRFMgZGF0YSIpOworCisgICAgICAgICAgICAgICAgLyogU0EgPSBBZGRyZXNzIDQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTRfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCsyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0K29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCs0KSk7CisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDMgKi8KKyAgICAgICAgICAgICAgICAvKiBTZXEgOiBSZWFkIDIwIHdyaXRlIDIyLCByZWFkIDE4IHdyaXRlIDIwLCByZWFkIDE2IHdyaXRlIDE4ICovCisgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQrb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgICAgIHsKKwkJCS8qIFdEUyB0ZXN0OiByZW1vdmUgYWRkNCAqLworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVXRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrNCkpOworICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMikpOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KSk7CisgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCB6ZndSZWN2RXRoKCkgdG8gbm90aWZ5IHVwcGVyIGxheWVyICovCisgICAgICAgIC8vem1fbXNnMl9yeChaTV9MVl8yLCAiQ2FsbCB6ZndSZWN2RXRoKCksIGJ1Zj0iLCBidWYpOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgICNpZiBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OID09IDEKKyAgICAgICAgemZQcm90UnNwU2ltKGRldiwgYnVmKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIC8vemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogdGFsbHkgKi8KKyAgICAJd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKworICAgIAlpZiAod2QtPnpmY2JSZWN2RXRoICE9IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdkV0aChkZXYsIGJ1ZiwgdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljaykKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgZWxzZSBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fTUFOQUdFTUVOVF9GUkFNRSkKKyAgICB7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlJ4IG1hbmFnZW1lbnQsRkM9IiwgZnJhbWVDdHJsKTsKKyAgICAgICAgLyogQ2FsbCB6ZlByb2Nlc3NNYW5hZ2VtZW50KCkgdG8gaGFuZGxlIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgemZQcm9jZXNzTWFuYWdlbWVudChkZXYsIGJ1ZiwgYWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICAvKiBQc1BvbGwgKi8KKyAgICBlbHNlIGlmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApICYmIChmcmFtZUN0cmwgPT0gMHhhNCkpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzAsICJSeCBQc1BvbGwiKTsKKyAgICAgICAgemZBcFByb2Nlc3NQc1BvbGwoZGV2LCBidWYpOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZGlzY2FyZCEhIik7CisgICAgICAgIHdkLT5jb21tVGFsbHkuRHJpdmVyRGlzY2FyZGVkRnJtKys7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZXbGFuUnhWYWxpZGF0ZSAgICAgICAgICAgICovCisvKiAgICAgIFZhbGlkYXRlIFJ4IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiByZWNlaXZlZCA4MDIuMTEgZnJhbWUgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZXbGFuUnhWYWxpZGF0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZUxlbjsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCAgZnJhbWVTdWJUeXBlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhDOworICAgIGZyYW1lU3ViVHlwZSA9IChmcmFtZUN0cmwgJiAweEYwKSA+PiA0OworCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIEFjY2VwdCBEYXRhL01hbmFnZW1lbnQgZnJhbWUgd2l0aCBwcm90b2NvbCB2ZXJzaW9uID0gMCAqLworICAgIGlmICgoZnJhbWVUeXBlID09IDB4OCkgfHwgKGZyYW1lVHlwZSA9PSAweDApKQorICAgIHsKKworICAgICAgICAvKiBUT0RPIDogY2hlY2sgcnggc3RhdHVzID0+IGVycm8gYml0ICovCisKKyAgICAgICAgLyogQ2hlY2sgTWluaW11bSBMZW5ndGggd2l0aCBXZXAgKi8KKyAgICAgICAgaWYgKChmcmFtZUN0cmwgJiAweDQwMDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgIFBMQ1AoNSkrSGVhZGVyKDI0KStJVig0KStJQ1YoNCkrQ1JDKDQpK1J4U3RhdHVzKDgpICovCisgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVTdWJUeXBlID09IDB4NSB8fCBmcmFtZVN1YlR5cGUgPT0gMHg4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWluaW11bSBMZW5ndGggPSBQTENQKDUpK01BQ0hlYWRlcigyNCkrVGltZXN0YW1wKDgpK0JlYWNvbkludGVydmFsKDIpK0NhcCgyKStDUkMoNCkrUnhTdGF0dXMoOCkgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZUxlbiA8IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gUExDUCg1KStNQUNIZWFkZXIoMjQpK0NSQyg0KStSeFN0YXR1cyg4KSAqLworICAgICAgICAgICAgaWYgKGZyYW1lTGVuIDwgMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NSU5fUlhfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgZnJhbWUgTGVuZ3RoID4gWk1fV0xBTl9NQVhfUlhfU0laRS4gKi8KKyAgICAgICAgaWYgKGZyYW1lTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NQVhfUlhfRlJBTUVfTEVOR1RIOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFtZUN0cmwmMHhmZikgPT0gMHhhNCkKKyAgICB7CisgICAgICAgIC8qIFBzUG9sbCAqLworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInJ4IHBzcG9sbCIpOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJhbWVDdHJsJjB4ZmYpID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIpCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFnZ1JlY3ZCQVIoZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9SWF9CQVJfRlJBTUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfUlhfRlJBTUVfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9QU0VVRE8gKQorICAgIHsKKyAgICAgICAgaWYgKCAocmV0PXpmU3RhUnhWYWxpZGF0ZUZyYW1lKGRldiwgYnVmKSkhPVpNX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzEoImRpc2NhcmQgZnJhbWUsIGNvZGUgPSAiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZldsYW5SeEZpbHRlciAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmlsdGVyIGR1cGxpY2F0ZWQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZldsYW5SeEZpbHRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdDA7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHNlcTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgaW5kZXg7CisgICAgdTE2X3QgY29sOworICAgIHUxNl90IGk7CisgICAgdThfdCB1cCA9IDA7IC8qIFVzZXIgcHJpb3JpdHkgKi8KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvKiBSWCBQUkVGSVggKi8KKyAgICBvZmZzZXQgPSAwOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8vIERvbid0IGRpdmlkZSAyXjQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmcmFnZW1lbnRhdGlvbiBwa3QgdG8gYmUgdHJlYXRlZCBhcworICAgIC8vIGR1cGxpY2F0ZWQgZnJhbWVzCisgICAgc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworCisgICAgLyogUW9TIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoKGZyYW1lVHlwZSAmIDB4ODgpID09IDB4ODgpCisgICAgeworICAgICAgICB1cCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyNCk7CisgICAgICAgIHVwICY9IDB4NzsKKyAgICB9CisKKyAgICBpbmRleCA9IChzcmNbMl0rdXApICYgKFpNX0ZJTFRFUl9UQUJMRV9ST1ctMSk7CisKKyAgICAvKiBUQkQgOiBmaWx0ZXIgZnJhbWUgd2l0aCBzb3VyY2UgYWRkcmVzcyA9PSBvd24gTUFDIGFkcmVzcyAqLworICAgIGlmICgod2QtPm1hY0FkZHJbMF0gPT0gc3JjWzBdKSAmJiAod2QtPm1hY0FkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgJiYgKHdkLT5tYWNBZGRyWzJdID09IHNyY1syXSkpCisgICAgeworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgIlJ4IGZpbHRlcj0+c3JjIGlzIG93biBNQUMiKTsKKyAgICAgICAgd2QtPnRyYWZUYWxseS5yeFNyY0lzT3duTWFjKys7CisjaWYgMAorICAgICAgICByZXR1cm4gWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUM7CisjZW5kaWYKKyAgICB9CisKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJSeCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHkgKi8KKyAgICBpZiAoKGRzdDAgJiAweDEpID09IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0uYWRkclswXSA9PSBzcmNbMF0pCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+cnhGaWx0ZXJUYmxbaV1baW5kZXhdLmFkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5hZGRyWzJdID09IHNyY1syXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0udXAgPT0gdXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyYW1lVHlwZSYweDgwMCk9PTB4ODAwKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXE9PXNlcSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvKiBoaXQgOiBkdXBsaWNhdGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMSwgIlJ4IGZpbHRlciBoaXQ9PmR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnRyYWZUYWxseS5yeER1cGxpY2F0ZSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1JYX0RVUExJQ0FURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGl0IDogbm90IGR1cGxpY2F0ZWQgZnJhbWUsIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIlJ4IGZpbHRlciBoaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKSAqLworCisgICAgICAgIC8qIG1pc3MgOiBhZGQgdG8gdGFibGUgKi8KKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZmlsdGVyIG1pc3MiKTsKKyAgICAgICAgLyogVE9ETyA6IFJhbmRvbSBzZWxlY3QgYSBjb2x1bW4gKi8KKyAgICAgICAgY29sID0gKHUxNl90KSh3ZC0+dGljayAmIChaTV9GSUxURVJfVEFCTEVfQ09MLTEpKTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLmFkZHJbMF0gPSBzcmNbMF07CisgICAgICAgIHdkLT5yeEZpbHRlclRibFtjb2xdW2luZGV4XS5hZGRyWzFdID0gc3JjWzFdOworICAgICAgICB3ZC0+cnhGaWx0ZXJUYmxbY29sXVtpbmRleF0uYWRkclsyXSA9IHNyY1syXTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnNlcSA9IHNlcTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnVwID0gdXA7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9IC8qIGlmICgoZHN0MCAmIDB4MSkgPT0gMCkgKi8KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYykKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHUxNl90ICBpLCBsZW5ndGgsIHBheWxvYWRPZmZzZXQ7CisgICAgdThfdCAgIGJWYWx1ZSwgcW9zVHlwZSA9IDA7CisgICAgdThfdCAgIHNuYXBCeXRlWzEyXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmQXBHZXRUeE1pY0tleShkZXYsIGJ1ZiwgJnFvc1R5cGUpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFR4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKworICAgIC8qIGFwcGVuZCBEQSBhbmQgU0EgKi8KKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBmb3IoaT0xNjsgaTwyMjsgaSsrKQorICAgIHsgLy8gVklTVEEgREEKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyAgICBmb3IoaT0xMDsgaTwxNjsgaSsrKQorICAgIHsgLy8gVklTVEEgU0EKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbHNlCisgICAgZm9yKGk9MDsgaTwxMjsgaSsrKQorICAgIHsKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAocW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBRb3MgU29mdHdhcmUgTUlDIGluIElCU1MgTW9kZSAqLworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgaWYgKCBzbmFwbGVuID09IDAgKQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUOworCisgICAgICAgIGZvcihpPTA7IGk8KHNuYXBsZW4+PjEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMl0gPSAodThfdCkgKHNuYXBbaV0gJiAweGZmKTsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMisxXSA9ICh1OF90KSAoKHNuYXBbaV0gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8c25hcGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoc25hcEJ5dGVbaV0sIHBNaWNLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGJWYWx1ZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkpOworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoYlZhbHVlLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICB6Zk1pY0dldE1pYyggKHU4X3QqKSBtaWMsIHBNaWNLZXkpOworCisgICAgcmV0dXJuIFpNX1NJWkVfT0ZfTUlDOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnICAgICAgICAgKi8KKy8qICAgICAgR2V0IElQIFRPUyBhbmQgZnJhZyBvZmZzZXQgZnJvbSBUeCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB1cCA6IHBvaW50ZXIgZm9yIHJldHVybmluZyB1c2VyIHByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJhZ09mZiA6IHBvaW50ZXIgZm9yIHJldHVybmluZyBpcCBmcmFnIG9mZnNldCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZUeEdldElwVG9zQW5kRnJhZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHVwLCB1MTZfdCogZnJhZ09mZikKK3sKKyAgICB1OF90IGlwdjsKKyAgICB1MTZfdCBsZW47CisJdTE2X3QgZXRoZXJUeXBlOworICAgIHU4X3QgdG9zOworCisgICAgKnVwID0gMDsKKyAgICAqZnJhZ09mZiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGlmIChsZW4gPj0gMzQpIC8vTWluaW11bSBJUHY0IHBhY2tldCBzaXplLCAxNChFdGhlciBoZWFkZXIpKzIwKElQdjQgaGVhZGVyKQorICAgIHsKKyAgICAgICAgZXRoZXJUeXBlID0gKCgodTE2X3Qpem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQpKTw8OCkKKyAgICAgICAgICAgICAgICAgICAgKyB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCArIDEpOworCisgICAgICAgIC8qIHByb3RvY29sIHR5cGUgPSBJUCAqLworICAgICAgICBpZiAoZXRoZXJUeXBlID09IDB4MDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXB2ID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUKSA+PiA0OworICAgICAgICAgICAgaWYgKGlwdiA9PSAweDQpIC8vSVB2NAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvcyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpOworICAgICAgICAgICAgICAgICp1cCA9ICh0b3MgPj4gNSk7CisgICAgICAgICAgICAgICAgKmZyYWdPZmYgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgKyA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgVkxBTiB0YWcgYW5kIElQdjYgcGFja2V0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgc25hcFswXSA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAwKTsKKyAgICBzbmFwWzFdID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIDIpOworICAgIHNuYXBbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgNCk7CisgICAgKnNuYXBsZW4gPSA2OworCisgICAgcmV0dXJuIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAqc25hcGxlbjsKK30KKyNlbHNlCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgdTE2X3QgcmVtb3ZlZDsKKwkgICB1MTZfdCBldGhlclR5cGU7CisgICAJdTE2X3QgbGVuOworCisJICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaWYgKGxlbiA8IDE0KSAvL01pbmltdW0gRXRoZXJuZXQgcGFja2V0IHNpemUsIDE0KEV0aGVyIGhlYWRlcikKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBBc3NlcnQ/ICovCisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgUkZDMTA0MiBoZWFkZXIgKi8KKyAgICBldGhlclR5cGUgPSAoKCh1MTZfdCl6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCAxMikpPDw4KQorICAgICAgICAgICAgICAgICsgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTMpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJldGhlcm5ldCB0eXBlIG9yIGxlbmd0aCA9ICIsIGV0aGVyVHlwZSk7CisKKyAgICBpZiAoZXRoZXJUeXBlID4gMTUwMCkKKyAgICB7CisgICAgICAgIC8qIEVUSEVSTkVUIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTI7CisgICAgICAgIHNuYXBbMF0gPSAweGFhYWE7CisgICAgICAgIHNuYXBbMV0gPSAweDAwMDM7CisgICAgICAgIGlmICgoZXRoZXJUeXBlID09MHg4MTM3KSB8fCAoZXRoZXJUeXBlID09IDB4ODBmMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJyaWRnZSBUdW5uZWwgKi8KKyAgICAgICAgICAgIHNuYXBbMl0gPSAweEY4MDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSRkMgMTA0MiAqLworICAgICAgICAgICAgc25hcFsyXSA9IDB4MDAwMDsKKyAgICAgICAgfQorICAgICAgICAqc25hcGxlbiA9IDY7CisKKyAgICAgICAgaWYgKCBldGhlclR5cGUgPT0gMHg4ODhFICkKKyAgICAgICAgeworICAgICAgICAgICAgemZTaG93VHhFQVBPTChkZXYsIGJ1ZiwgMTQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDgwMi4zIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTQ7CisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVtb3ZlZDsKK30KKyNlbmRpZgorCit1OF90IHpmSXNWdHhxRW1wdHkoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpc0VtcHR5ID0gVFJVRTsKKyAgICB1OF90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+dm1tcUhlYWQgIT0gd2QtPnZtbXFUYWlsKQorICAgIHsKKyAgICAgICAgaXNFbXB0eSA9IEZBTFNFOworICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgfQorCisgICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+dnR4cUhlYWRbaV0gIT0gd2QtPnZ0eHFUYWlsW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpc0VtcHR5ID0gRkFMU0U7CisgICAgICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgICAgIH0KKyAgICB9CisKK2NoZWNrX2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gaXNFbXB0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHV0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQdXQgVHggYnVmZmVyIHRvIHZpcnR1YWwgVHhRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBhYzsKKyAgICB1OF90IHVwOworICAgIHUxNl90IGZyYWdPZmY7CisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgc3RydWN0IGFnZ1RhbGx5ICphZ2dfdGFsOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisJdTE2X3QgcmV0OworICAgIHUxNl90IHRpZDsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworCisgICAgaWYgKCB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgIT0gTlVMTCApCisgICAgeworICAgICAgICBhYyA9IHdkLT56ZmNiQ2xhc3NpZnlUeFBhY2tldChkZXYsIGJ1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFjID0gemNVcFRvQWNbdXAmMHg3XSAmIDB4MzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIG1haW4gQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uCisgICAgICovCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0rKzsKKworI2VuZGlmCisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICB0aWQgPSB1cCYweDc7CisgICAgaWYod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wKQorICAgIHsKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgICAgICAvLyAoaW5mcmFzdHJ1Y3R1cmVfbW9kZSAmJiBjb25uZWN0X3RvXzExbl9hcCkgfHwgKGFwX21vZGUgJiYgaXNfMTFuX2FwKQorICAgICAgICAgICAgLy9yZXQgPSB6ZkFnZ1B1dFZ0eHEoZGV2LCBidWYpOworCisKKyAgICAgICAgICAgIHJldCA9IHpmQWdnVHgoZGV2LCBidWYsIHRpZCk7CisgICAgICAgICAgICBpZiAoWk1fU1VDQ0VTUyA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEID09IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4UW9zRHJvcENvdW50W2FjXSsrOworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAqIGNvbnRpbnVlIGZvbGxvd2luZyBwcm9jZXNzaW9uLCBwdXQgaW50byBWVFhRCisgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorI2VuZGlmCisgICAgLyoKKyAgICAgKiBlbmQgb2YgYWRkIGJ5IGhvbmRhCisgICAgICovCisKKyAgICAvKiBGaXJzdCBJcCBmcmFnICovCisgICAgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAweDAwMjApCisgICAgeworICAgICAgICAvKiBEb24ndCBsZXQgaXAgZnJhZyBpbiBpZiBWVFhRIHVuYWJsZSB0byBob2xkICovCisgICAgICAgIC8qIHdob2xlIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWcpICAgICAgICAgKi8KKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSAtIHdkLT52dHhxVGFpbFthY10pJiBaTV9WVFhRX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA+IChaTV9WVFhRX1NJWkUtMjApKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cW9zRHJvcElwRnJhZ1thY10gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh3ZC0+cW9zRHJvcElwRnJhZ1thY10gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ2dFEgZnVsbCwgZHJvcCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgZmlyc3QgaXAgZnJhZywgYWM9IiwgYWMpOworICAgICAgICAgICAgLy9WVFhRW10gY2FuIG5vdCBob2xkIHdob2xkIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWdzKQorICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICB9CisKKyAgICBpZiAoKChmcmFnT2ZmICY9IDB4ZmYxZikgIT0gMCkgJiYgKHdkLT5xb3NEcm9wSXBGcmFnW2FjXSA9PSAxKSkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBpcCBmcmFnLCBhYz0iLCBhYyk7CisgICAgICAgIC8vRGlzY2FyZCBmb2xsb3dpbmcgaXAgZnJhZ3MKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spICE9IHdkLT52dHhxVGFpbFthY10pCisgICAgeworICAgICAgICB3ZC0+dnR4cVthY11bd2QtPnZ0eHFIZWFkW2FjXV0gPSBidWY7CisgICAgICAgIHdkLT52dHhxSGVhZFthY10gPSAoKHdkLT52dHhxSGVhZFthY10gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMSwgIlBhY2tldCBkaXNjYXJkZWQsIFZUWFEgZnVsbCwgYWM9IiwgYWMpOworICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7IC8vVlRYUVtdIEZ1bGwKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHZXQgVHggYnVmZmVyIGZyb20gdmlydHVhbCBUeFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkdldFZ0eHEoemRldl90KiBkZXYsIHU4X3QgYWMpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWMgJj0gMHgzOworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT52dHhxSGVhZFthY10gIT0gd2QtPnZ0eHFUYWlsW2FjXSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52dHhxW2FjXVt3ZC0+dnR4cVRhaWxbYWNdXTsKKyAgICAgICAgd2QtPnZ0eHFUYWlsW2FjXSA9ICgod2QtPnZ0eHFUYWlsW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsgLy9WVFhRW10gZW1wdHkKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlB1dFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUHV0IFR4IGJ1ZmZlciB0byB2aXJ0dWFsIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlB1dFZtbXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKCh3ZC0+dm1tcUhlYWQgKyAxKSAmIFpNX1ZNTVFfU0laRV9NQVNLKSAhPSB3ZC0+dm1tcVRhaWwpCisgICAgeworICAgICAgICB3ZC0+dm1tcVt3ZC0+dm1tcUhlYWRdID0gYnVmOworICAgICAgICB3ZC0+dm1tcUhlYWQgPSAoKHdkLT52bW1xSGVhZCArIDEpICYgWk1fVk1NUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiUGFja2V0IGRpc2NhcmRlZCwgVk1tUSBmdWxsIik7CisgICAgICAgIHJldHVybiBaTV9FUlJfVk1NUV9GVUxMOyAvL1ZUWFFbXSBGdWxsCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkdldFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmcm9tIHZpcnR1YWwgTW1RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRWbW1xKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPnZtbXFIZWFkICE9IHdkLT52bW1xVGFpbCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52bW1xW3dkLT52bW1xVGFpbF07CisgICAgICAgIHdkLT52bW1xVGFpbCA9ICgod2QtPnZtbXFUYWlsICsgMSkgJiBaTV9WTU1RX1NJWkVfTUFTSyk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOyAvL1ZUWFFbXSBlbXB0eQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHVzaFZ0eHEgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTZXJ2aWNlIFZpcnR1YWwgVHhRICh3ZWlnaHRlZCByb3VuZCByb2JpbikgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmb3JtIHZpcnR1YWwgVHhRIGFuZCBwdXQgdG8gaGFyZHdhcmUgVHhEIHF1ZXVlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHR4ZWQ7CisgICAgdTMyX3QgZnJlZVR4ZDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3Qgc2tpcEZsYWcgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZIcEdldEZyZWVUeGRDb3VudCA9ICIsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSk7CisKKyAgICBpZiAod2QtPmhhbFN0YXRlID09IFpNX0hBTF9TVEFURV9JTklUKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSEFMIGlzIG5vdCByZWFkeSBmb3IgVHgiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4KQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIGJlY2F1c2UgODAyLjExaCBERlMgRGlzYWJsZSBUeCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwKQorICAgIHsKKyAgICAgICAgLy9Ib2xkIHVudGlsIFJGIGZyZXF1ZW5jeSBjaGFuZ2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoKCB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyApICYmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKKyAgICBlbHNlIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlBhY2tldHMgcXVldWVkIHNpbmNlIHRoZSBNQUMgaXMgaW4gcG93ZXItc2F2aW5nIG1vZGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+dnR4cVB1c2hpbmcgIT0gMCkKKyAgICB7CisgICAgICAgIHNraXBGbGFnID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnZ0eHFQdXNoaW5nID0gMTsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChza2lwRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgdHhlZCA9IDA7CisKKyAgICAgICAgLyogMjAwNi4xMi4yMCwgU2VydmUgTWFuYWdlbWVudCBxdWV1ZSAqLworICAgICAgICB3aGlsZSggemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJzZW5kIGJ1ZiA9ICIsIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4pIHx8ICgod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gVFJVRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0hvbGQgdW50aWwgU2NhbiBTdG9wCisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisKKyAgICAgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKworICAgICAgICAgICAgaWYgKHR4ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHdkLT52dHhxUHVzaGluZyA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgICAgIC8qIFNlcnZpY2UgVlR4UVszXSAqLworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZnJlZVR4ZCA9IHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIDMpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigic2VuZCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMl0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoxLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMikpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAwKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMF0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMCkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMV0gKi8KKyAgICAgICAgaWYgKChmcmVlVHhkID0gemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+PSAoemZIcEdldE1heFR4ZENvdW50KGRldikqMy80KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAxKSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9UWF9NUERVKGRldiwgd2QtPnRpY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWxsIFZUeFFzIGFyZSBlaXRoZXIgZW1wdHkgb3IgZXhjZWVkIHRoZWlyIHRocmVzaG9sZCAqLworICAgICAgICBpZiAodHhlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSAvL3doaWxlICgxKQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoVnR4cSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEgYW5kIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZGbHVzaFZ0eHEoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdThfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEZsdXNoIE1tUSAqLworICAgIHdoaWxlICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZGbHVzaFZ0eHE6IFtWbW1xXSIpOworICAgICAgICB3ZC0+cXVldWVGbHVzaGVkICB8PSAweDEwOworICAgIH0KKworICAgIC8qIEZsdXNoIFZUeFEgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICB3aGlsZSAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoInpmRmx1c2hWdHhxOiBbemZHZXRWdHhxXS0gIiwgaSk7CisgICAgICAgICAgICB3ZC0+cXVldWVGbHVzaGVkIHw9ICgxPDxpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KQoreworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBmcmFnTGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgfQorICAgIGVsc2UgaWYgKGRhWzBdID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgIH0KKyAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGVhZGVyTGVuLCBzbmFwLCBzbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZUeXBlLCBhYywga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmIChidWZUeXBlID09IFpNX0VYVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChidWZUeXBlID09IFpNX0lOVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJ0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworICAgIGlmIChmcmFtZVN1YnR5cGUgJiAweDgwKQorICAgIHsgICAvL1FvUyBkYXRhIGZyYW1lCisgICAgICAgIHUxNl90IHNlcXVlbmNlTnVtOworICAgICAgICB1MTZfdCBxb3NDb250cm9sRmllbGQ7CisKKyAgICAgICAgc2VxdWVuY2VOdW0gPSAoIHptd19idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0ICk7IC8vIERpc2NhcmQgZnJhZ21lbnQgbnVtYmVyICEKKyAgICAgICAgcW9zQ29udHJvbEZpZWxkID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOyAvLyBEb24ndCBjb25zaWRlciBXRFMgKFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0pCisgICAgICAgIC8vRGJnUHJpbnQoIlRoZSBRb1MgQ29udHJvbCBGaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWQiLCBxb3NDb250cm9sRmllbGQpOworICAgICAgICAvL0RiZ1ByaW50KCJUaGUgUklGUyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkIiwgd2QtPnN0YS5yaWZzQ291bnQpOworCisgICAgICAgIGlmKCBxb3NDb250cm9sRmllbGQgJiBaTV9CSVRfNSApCisgICAgICAgIHsvLyBBQ0sgcG9saWN5IGlzICJObyBBQ0siCisgICAgICAgICAgICAvKiBSSUZTLUxpa2UgZnJhbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlW3dkLT5zdGEucmlmc0xpa2VGcmFtZUNudF0gICA9IHNlcXVlbmNlTnVtOworCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSAhPSAwICkKKyAgICAgICAgICAgICAgICB7Ly8gUklGUy1saWtlIFBhdHRlcm4gY29sbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPT0gMiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPT0gMiApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUklGUyBwYXR0ZXJuIG1hdGNoZWQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogIzMgRW5hYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgcGF0dGVybiBtYXRjaGVkICAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBSSUZTIHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNDb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc3RhdGUgdG8gYmUgRGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvLyBzdGF0ZSA9IERldGVjdGVkCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgUklGUyB0aW1lcgorICAgICAgICAgICAgICAgIGlmKCAod2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lcikgPCBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJTTjEgPSAlZCwgU04yID0gJWQsIFNOMyA9ICVkXG4iLCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0pOworCisgICAgICAgICAgICAvLyBVcGRhdGUgUklGUy1saWtlIHNlcXVlbmNlIG51bWJlcgorICAgICAgICAgICAgaWYoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzBdID0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV07CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgcmVjb3JkIHRocmVlIGFkamFjZW50IGZyYW1lCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250IDwgMiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAjNCBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIHRpbWVyIFRJTUVPVVQgICovCisgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgIHsKKyAgICAgICAgaWYoICggd2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lciApID4gWk1fUklGU19USU1FUl9USU1FT1VUICkKKyAgICAgICAgey8vIFRJTUVPVVQKKyAgICAgICAgICAgIC8vIERpc2FibGUgUklGUworICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IFJJRlMtbGlrZSBzZXF1ZW5jZSBudW1iZXIgRklGTworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKworICAgICAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGJlIERldGVjdGluZworICAgICAgICAgICAgd2QtPnN0YS5yaWZzU3RhdGUgPSBaTV9SSUZTX1NUQVRFX0RFVEVDVElORzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzFiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjd2VwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFR4IGFuZCBSeCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordTMyX3QgY3JjMzJfdGFiW10gPQoreworICAgICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgICAgICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLAorICAgICAgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgICAgICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgICAgICAgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwgMHgxNDAxNWM0ZkwsIDB4NjMwNjZjZDlMLAorICAgICAgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgICAgICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgICAgICAgMHgzNWI1YThmYUwsIDB4NDJiMjk4NmNMLCAweGRiYmJjOWQ2TCwgMHhhY2JjZjk0MEwsIDB4MzJkODZjZTNMLAorICAgICAgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgICAgICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgICAgICAgMHhiOGJkYTUwZkwsIDB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorICAgICAgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgICAgICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgICAgICAgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLCAweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLAorICAgICAgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgICAgICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgICAgICAgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwgMHg2NWIwZDljNkwsIDB4MTJiN2U5NTBMLAorICAgICAgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgICAgICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgICAgICAgMHg0YWRmYTU0MUwsIDB4M2RkODk1ZDdMLCAweGE0ZDFjNDZkTCwgMHhkM2Q2ZjRmYkwsIDB4NDM2OWU5NmFMLAorICAgICAgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgICAgICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgICAgICAgMHhjOTBjMjA4NkwsIDB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorICAgICAgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgICAgICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgICAgICAgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLCAweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLAorICAgICAgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgICAgICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgICAgICAgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwgMHhmNzYyNTc1ZEwsIDB4ODA2NTY3Y2JMLAorICAgICAgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgICAgICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgICAgICAgMHhkNmQ2YTNlOEwsIDB4YTFkMTkzN2VMLCAweDM4ZDhjMmM0TCwgMHg0ZmRmZjI1MkwsIDB4ZDFiYjY3ZjFMLAorICAgICAgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgICAgICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgICAgICAgMHg0NjY5YmU3OUwsIDB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorICAgICAgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgICAgICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgICAgICAgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLCAweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLAorICAgICAgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgICAgICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgICAgICAgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwgMHg4NmQzZDJkNEwsIDB4ZjFkNGUyNDJMLAorICAgICAgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgICAgICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgICAgICAgMHg4ZjY1OWVmZkwsIDB4Zjg2MmFlNjlMLCAweDYxNmJmZmQzTCwgMHgxNjZjY2Y0NUwsIDB4YTAwYWUyNzhMLAorICAgICAgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgICAgICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgICAgICAgMHgzN2Q4M2JmMEwsIDB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorICAgICAgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgICAgICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgICAgICAgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLCAweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLAorICAgICAgIDB4MmQwMmVmOGRMCit9OworCit2b2lkIHpmV0VQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIFdlcEtleSwgdThfdCAqaXYpCit7CisgICAgdThfdCAgICBTWzI1Nl0sUzJbMjU2XTsKKyAgICB1MTZfdCAgIHVpOworICAgIHUxNl90ICAgaTsKKyAgICB1MTZfdCAgIGo7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MzJfdCAgIGx0ZW1wOworICAgIHUxNl90ICAgbGVuOworICAgIHUzMl90ICAgaWN2OworICAgIHU4X3QgICAga2V5WzMyXTsKKworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKSA7CisgICAgICAgIGomPTI1NSA7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgfQorCisgICAgaSA9IGogPSAwOworICAgIGljdiA9IC0xOworCisgICAgLyogRm9yIFNuYXAgSGVhZGVyICovCisgICAgZm9yICh1aSA9IDA7IHVpIDwgc25hcExlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gc25hcFt1aV07CisgICAgICAgIGljdiA9ICAoaWN2Pj44KSBeIGNyYzMyX3RhYlsoaWN2XkluKSYweGZmXTsKKworICAgICAgICBzbmFwW3VpXSA9IEluIF4gSzsKKyAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgdWksIEluIF4gSyk7CisgICAgfQorCisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICBmb3IgKHVpID0gb2Zmc2V0OyB1aSA8IGxlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgdWkpOworICAgICAgICBpY3YgPSAgKGljdj4+OCkgXiBjcmMzMl90YWJbKGljdl5JbikmMHhmZl07CisKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gfihpY3YpOworICAgIGx0ZW1wID0gKHUzMl90KSBpY3Y7CisKKyAgICBmb3IgKHVpID0gMDsgdWkgPCA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgaSArKzsKKyAgICAgICAgaSAmPSAyNTU7CisgICAgICAgIGogKz0gU1tpXTsKKyAgICAgICAgaiAmPSAyNTU7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPSAyNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIC8vKk91dCsrID0gKHU4X3QpKGx0ZW1wIF4gSykmMHhmZjsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIGxlbit1aSwgKHU4X3QpKGx0ZW1wIF4gSykmMHhmZik7CisgICAgICAgIGx0ZW1wID4+PSA4OworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIGxlbis0KTsKK30KKwordTE2X3QgemZXRVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdikKK3sKKyAgICB1OF90ICAgIFNbMjU2XTsKKyAgICB1OF90ICAgIFMyWzI1Nl07CisgICAgdTE2X3QgICB1aTsKKyAgICB1MTZfdCAgIGk7CisgICAgdTE2X3QgICBqOworICAgIHUzMl90ICAgaWN2X3RtcDsKKyAgICB1MzJfdCAgICppY3Y7CisgICAgdTMyX3QgICByeGJ1Zl9pY3Y7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1OF90ICAgIGtleVszMl07CisKKyAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKTsKKyAgICAgICAgaiY9MjU1IDsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKyAgICB9CisKKyAgICBpID0gaiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGZvciAodWkgPSBvZmZzZXQ7IHVpIDwgbGVuOyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBpKys7CisgICAgICAgIGkgJj0gMjU1OworICAgICAgICBqICs9IFNbaV07CisgICAgICAgIGogJj0gMjU1OworCisgICAgICAgIC8vIFN3YXAgU1tpXSBhbmQgU1tqXQorICAgICAgICB0ZW1wID0gU1tpXTsKKyAgICAgICAgU1tpXSA9IFNbal07CisgICAgICAgIFNbal0gPSB0ZW1wOworLy8gICAgICAgICAgdGVtcCA9IChTW2ldICsgdGVtcCkgJiAyNTU7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPTI1NTsKKyAgICAgICAgSyA9IFNbdGVtcF07ICAgICAgICAvLyBLZXkgdXNlZCB0byBYb3Igd2l0aCBpbnB1dCBkYXRhCisKKyAgICAgICAgSW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB1aSk7CisKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gJmljdl90bXA7CisgICAgKmljdiA9IC0xOworCisgICAgZm9yICh1aSA9IG9mZnNldDsgdWkgPCBsZW4gLSA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBJbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHVpKTsKKyAgICAgICAgKmljdiA9ICAoKmljdj4+OCkgXiBjcmMzMl90YWJbKCppY3ZeSW4pJjB4ZmZdOworICAgIH0KKworICAgICppY3YgPSB+KmljdjsKKworICAgIHJ4YnVmX2ljdiA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tNCkgfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTMpIDw8IDggfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTIpIDw8IDE2IHwKKyAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKSA8PCAyNCk7CisKKyAgICBpZiAoKmljdiAhPSByeGJ1Zl9pY3YpCisgICAgeworICAgICAgICByZXR1cm4gWk1fSUNWX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0lDVl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjExNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworCit2b2lkIHpmQ3dtSW5pdCh6ZGV2X3QqIGRldikgeworICAgIC8vdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT53bGFuTW9kZSkgeworICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgIGNhc2UgWk1fTU9ERV9QU0VVRE86CisgICAgY2FzZSBaTV9NT0RFX0lCU1M6CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkN3bUJ1c3k9IiwgYnVzeSk7CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREUyMCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREU0MCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVzeSkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGlmKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSB8fCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8gfHwKKyAgICAgICAgd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykpIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYmIEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldCAhPSAwICYmCisgICAgICAgICAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyAmJiBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgIT0gMCAmJgorICAgICAgICAgICAgKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYmIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRBYm92ZSkgPT0gMSkgeworCisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgd2QtPmN3bS5jd193aWR0aCA9IENXTV9XSURUSDQwOworICAgIH0KKworfQorCisKKworCit1MTZfdCB6ZkN3bUlzRXh0Q2hhbkJ1c3kodTMyX3QgY3RsQnVzeSwgdTMyX3QgZXh0QnVzeSkKK3sKKyAgICB1MzJfdCBidXN5OyAvKiBwZXJjZW50YWdlICovCisgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgIGN5Y2xlVGltZSA9IDEyODAwMDA7IC8vMS4yOCBzZWNvbmRzCisKKyAgICBpZiAoY3ljbGVUaW1lID4gY3RsQnVzeSkgeworICAgICAgICBjdGxDbGVhciA9IGN5Y2xlVGltZSAtIGN0bEJ1c3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHJhdGlvIG9mIGV4dGVuc2lvbiBjaGFubmVsIGJ1c3kgdG8gY29udHJvbCBjaGFubmVsIGNsZWFyCisgICAgICogYXMgYW4gYXBwcm94aW1hdGlvbiB0byBleHRlbnNpb24gY2hhbm5lbCBjbGVhbmxpbmVzcy4KKyAgICAgKgorICAgICAqIEFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgZm9sa3MsIGV4dCByeGNsZWFyIGlzIHVuZGVmaW5lZAorICAgICAqIGlmIHRoZSBjdHJsIHJ4Y2xlYXIgaXMgZGUtYXNzZXJ0ZWQgKGkuZS4gYnVzeSkKKyAgICAgKi8KKyAgICBpZiAoY3RsQ2xlYXIpIHsKKyAgICAgICAgYnVzeSA9IChleHRCdXN5ICogMTAwKSAvIGN0bENsZWFyOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgIH0KKyAgICBpZiAoYnVzeSA+IEFUSF9DV01fRVhUQ0hfQlVTWV9USFJFU0hPTEQpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGl2ZWQgZnVuY3Rpb25zLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSG9uZGEgICAgICAgMy0xOS0wNyAgICAgY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DV01fSAorI2RlZmluZSBfQ1dNX0gKKworI2RlZmluZSBBVEhfQ1dNX0VYVENIX0JVU1lfVEhSRVNIT0xEICAzMCAgLyogRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKDAtMTAwJSkgKi8KKwordm9pZCB6ZkN3bUluaXQoemRldl90KiBkZXYpOwordm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKKworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DV01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvZnJlcWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIwZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworLyogemZBZGRGcmVxQ2hhbmdlUmVxIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCitzdGF0aWMgdm9pZCB6ZkFkZEZyZXFDaGFuZ2VSZXEoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZBZGRGcmVxQ2hhbmdlUmVxICBmcmVxUmVxUXVldWVUYWlsJWRcbiIsIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsKTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsXSA9IGZyZXF1ZW5jeTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gYnc0MDsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUV4dE9mZnNldFt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbF0gPSBleHRPZmZzZXQ7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFDaGFuZ2VDb21wQ2Jbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gY2I7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWwrKzsKKyAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgeworICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCA9IDA7CisgICAgfQorfQorCit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeVYyKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxdWVuY3ksIHpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiIGNiKQoreworICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4KGRldiwgZnJlcXVlbmN5LCAwLCAwLCBjYik7Cit9CisKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5RXhWMih6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiwgdThfdCBmb3JjZVNldEZyZXEpCit7CisgICAgdThfdCBzZXRGcmVxSW1tZWQgPSAwOworICAgIHU4X3QgaW5pdFJGID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLCBmcmVxdWVuY3kpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA9PSBmcmVxdWVuY3kpCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRCdzQwID09IGJ3NDApCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICB7CisgICAgICAgIGlmICggZm9yY2VTZXRGcmVxID09IDAgJiYgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRkI1MAorICAgIC8qaWYoZnJlcXVlbmN5IT0yNDM3KSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9Ki8KKyNlbmRpZgorCisgICAgemZBZGRGcmVxQ2hhbmdlUmVxKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiKTsKKworLy8gICAgem1fYXNzZXJ0KCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPT0gMCApOworICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICgod2QtPnN0YS5jdXJyZW50Qnc0MCAhPSBidzQwKSB8fCAod2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ICE9IGV4dE9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworICAgICAgICBzZXRGcmVxSW1tZWQgPSAxOworICAgIH0KKyAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcrKzsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHNldEZyZXFJbW1lZCApCisgICAgeworICAgICAgICAvL3pmSHBTZXRGcmVxdWVuY3koZGV2LCBmcmVxdWVuY3ksIDApOworICAgICAgICBpZiAoIGZvcmNlU2V0RnJlcSApCisgICAgICAgIHsgLy8gQ29sZCByZXNldCB0byByZXNldCB0aGUgZnJlcXVlbmN5IGFmdGVyIHNjYW5uaW5nICEKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIiM2XzEgMjAwNzA5MTciKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5Qb3dlckluSGFsZkRibSA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCitkb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYikKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiLCAwKTsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSkKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lWMihkZXYsIGZyZXF1ZW5jeSwgTlVMTCk7Cit9CisKKy8qIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSBTSE9VTEQgTk9UIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiA9IE5VTEw7CisgICAgdTE2X3QgZnJlcXVlbmN5OworICAgIHU4X3QgYnc0MDsKKyAgICB1OF90IGV4dE9mZnNldDsKKyAgICB1MTZfdCBjb21wRnJlcSA9IDA7CisgICAgdThfdCBjb21wQnc0MCA9IDA7CisgICAgdThfdCBjb21wRXh0T2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCAhPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCkKKyAgICB7CisgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLAorICAgICAgICAgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdKTsKKyAgICAgICAgY29tcEZyZXEgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXTsKKyAgICAgICAgY29tcEJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBjb21wRXh0T2Zmc2V0ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworCisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdID0gMDsKKyAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkKys7CisgICAgICAgIGlmICggd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPj0gWk1fTUFYX0ZSRVFfUkVRX1FVRVVFICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdoaWxlICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSAhPSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIGJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBleHRPZmZzZXQ9d2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBpZiAoKGNvbXBGcmVxID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICYmIChjb21wQnc0MCA9PSBidzQwKQorICAgICAgICAgICAgJiYgKGNvbXBFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRHVwbGljYXRlZCBmcmVxdWVuY3kgY29tbWFuZCAqLworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJEdXBsaWNhdGVkIEZyZXE9IiwgZnJlcXVlbmN5KTsKKworICAgICAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSA9IDA7CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCsrOworCisgICAgICAgICAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICggY2IgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2IoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICAgIGluaXRSRiA9IDA7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuY3VycmVudEJ3NDAgIT0gYnc0MCkgfHwgKHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCAhPSBleHRPZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCA9IGV4dE9mZnNldDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uUG93ZXJJbkhhbGZEYm0gPSB6ZkhwR2V0VHJhbnNtaXRQb3dlcihkZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiZmxhZ0ZyZXFDaGFuZ2luZz0iLCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAvL3dkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9IDA7CisgICAgaWYgKCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgIT0gMCApCisgICAgeworICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZSZW1vdmVGcmVxQ2hhbmdlUmVxKGRldik7CisKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUmVTZXRDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgMCwgMCwgTlVMTCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMDRhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9sZWRtZ3IuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEgICAgICAgICAgICAgICovCisvKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCisvLyAgICAgMTEtOCA6IFRvbiBmb3IgU2NhbiBzdGF0ZQorLy8gICAgIDcgOiBSZXNlcnZlZAorLy8gICAgIDYgOiBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgYml0IDYgPSAwCisvLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQorLy8gICAgICAgICAgIDAwID0+IGFsd2F5cyBvZmYKKy8vICAgICAgICAgICAwMSA9PiBhbHdheXMgb24KKy8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCisvLyAgICAgICAgICAgMTEgPT4gSWRsZSBvbiwgYWN0aXZlIG9mZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgIGJpdCA2ID0gMQorLy8gICAgIDUtNCA6IGZyZXEKKy8vICAgICAgICAgICAwMCA9PiAxSHoKKy8vICAgICAgICAgICAwMSA9PiAwLjVIegorLy8gICAgICAgICAgIDEwID0+IDAuMjVIegorLy8gICAgICAgICAgIDExID0+IDAuMTI1SHoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAzIDogUG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAwID0+IGFsd2F5cyBvZmYgaW4gcG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKKy8vICAgICAyIDogRGlzYWJsZSBzdGF0ZQorLy8gICAgIDEgOiBSZXNlcnZlZAorLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQordm9pZCB6ZkxlZEN0cmxUeXBlMSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wLCBwZXJpb2Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0xFRF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TY2FuIHN0YXRlCisgICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CisgICAgICAgICAgICB0b2ZmID0gKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweGYwMDApID4+IDEyKSAqIDU7CisKKyAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAodG9uK3RvZmYpOworICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wIDwgdG9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpICYmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg4KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQorICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDIwKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vLyBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gNSAqICgxIDw8ICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgzMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAocGVyaW9kKjIpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPCBwZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy9lbHNlLCBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICB9IC8vZWxzZSwgaWYgKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpCisgICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIH0gLy9mb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBEdWFsLUxFRCBzdGF0ZSAoKGJ1ZyMzMTI5MikpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCisvKiAgICAgICAgICAgICAgICAgIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlciB0aGVuIEJsdWUgcGVyIDUwMG1zICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDMuIFN0YXR1czoJQ29ubmVjdGlvbiBhdCA1RyBpbiBzaXRlIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA0LiBTdGF0dXM6CVdoZW4gdHJhbnNmZXIgdGhlIHBhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBCbGluayBwZXIgcGFja2V0LCBpbmNsdWRpbmcgVFggYW5kIFJYICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogQWx3YXlzIG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDYuIFN0YXR1czoJV2hlbiBsaW5raW5nIGlzIGRyb3BwZWQgYnV0IG5vIHJlLWNvbm5lY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA3LiBTdGF0dXM6CUZyb20gb25lIGNvbm5lY3Rpb24oMi40RyBvciA1RykgdG8gY2hhbmdlIHRvIGFub3RoZXIgYmFuZCAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBBbWJlci9CbHVlID0+U2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjExICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxlZEN0cmxUeXBlMl9zY2FuKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMih6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCB0b24sIHRvZmYsIHRtcCwgcGVyaW9kOworICAgIHUxNl90IE9wZXJhdGVMRUQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQorICAgICAgICBpZih3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJSA0ICE9IDApCisgICAgCXsKKyAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDQwMG1zKDQqMTAwKQorICAgICAgCSAgICAvLyBQcmV2ZW50IHRoaXMgc2l0dWF0aW9uCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgIF9fXworICAgICAgICAgICAgLy8gTEVEWzBdIE9OICAgfCAgICAgICB8ICAgICAgIHwgeCB8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAgICAgICAgIC8vIExFRFsxXSBPTgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMl9zY2FuKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgNCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyX3NjYW4oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMDsgICAgIC8vIExFRFswXTogd29yayBvbiAyLjRHIChiL2cgYmFuZCkKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMTsgICAgIC8vIExFRFsxXTogd29yayBvbiA1RyAoYSBiYW5kKQorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbT3BlcmF0ZUxFRF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0Nvbm5lY3Qgc3RhdGUKKyAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkgICAvLyBldmVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm8gdHJhZmZpYywgYWx3YXlzIE9OCisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvLyBXaGVuIGRvaW5nIHNjYW4sIGJsaW5rKEFtYmVyL0JsdWUpIGFuZCBvZmYgcGVyIDUwMG1zIChhYm91dCA0MDBtcyBpbiBvdXIgZHJpdmVyKQorICAgIC8vICAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgfCAgICAgICA4ICAgICAgIDEyICAgICAgfCAgICAgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgIC8vIExFRFsxXSBPTiAgICAwICAgICAgIDQgICAgICAgfF9fX19fX198ICAgICAgIDAgICAgICAgMworICAgIC8vCisKKyAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMTYpCisgICAgeworICAgICAgICBjYXNlIDA6ICAgLy8gY2FzZSAwfjMsIExFRFswXSBvbgorICAgICAgICAgICAgaWYod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OiAgIC8vIGNhc2UgOH4xMSwgTEVEWzFdIG9uCisgICAgICAgICAgICBpZih3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6ICAvLyBvdGhlcnMsIGFsbCBvZmYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBTaW5nbGUtTEVEIHN0YXRlICgoYnVnIzMyMjQzKSkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIKFFT2ZmOiB3aGVuIHRoZSBhZGFwdGVyIGlzIGRpc2FibGVkIG9yIGhhc24ndCBzdGFydGVkIHRvIGFzc29jaWF0ZSB3aXRoIEFQICAgICovCisvKiAgICAgICAgIHlldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVPbjogT25jZSBhZHBhdGVyIGFzc29jaWF0ZSB3aXRoIEFQIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICChRVNsb3cgYmxpbmtpbmc6IHdoZW5ldmVyIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yIHRyeSB0byBhc3NvY2lhdGUgd2l0aCBBUCAqLworLyogICAgLSBJZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gYWxyZWFkeSwgYW5kIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yICAgICAgICAgICovCisvKiAgICAgIHJlLWFzc29jaWF0ZSBhY3Rpb24sIHRoZSBMRUQgc2hvdWxkIGtlZXAgTEVEIGJhY2tncmFvdWQgYXMgT04sIHRodXMgICAgICAgKi8KKy8qICAgICAgdGhlIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPRkYgKDIwMG1zKSAtIE9OICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMqLworLyogICAgICBjeWNsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIElmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24geWV0LCBhbmQgYWRhcHRlcnMgc3RhcnQgdG8gZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgKi8KKy8qICAgICAgYXNzb2NpYXRlIGFjdGlvbiwgdGhlIExFRCBzaG91bGQga2VlcCBMRUQgYmFja2dyb3VuZCBhcyBPRkYsIHRodXMgdGhlICAgICAqLworLyogICAgICBibGlua2luZyBiZWhhdmlvciBTSE9VTEQgYmUgT04gKDIwMG1zKSAtIE9GRiAoODAwbXMpIGFuZCBjb250aW51ZSB0aGlzICAgICovCisvKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gRm9yIHRoZSBjYXNlIHRoYXQgYXNzb2NpYXRlIGZhaWwsIGFkcGF0ZXIgc2hvdWxkIGtlZXAgYXNzb2NpYXRpbmcsIGFuZCB0aGUqLworLyogICAgICBMRUQgc2hvdWxkIGFsc28ga2VlcCBzbG93IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVRdWljayBibGlua2luZzogdG8gYmxpbmsgT0ZGLU9OIGN5Y2xlIGZvciBlYWNoIHRpbWUgdGhhdCB0cmFmZmljIHBhY2tldCBpcyAgKi8KKy8qICAgIHJlY2VpdmVkIG9yIGlzIHRyYW5zbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwOC4wMSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCisgICAgeworICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCisgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKKyAgICAJeworICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggMjAwbXMoMioxMDApCisgICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICBfX18gICAgIF8KKyAgICAgICAgICAgIC8vIExFRFswXSBPTiAgIHwgICB8ICAgfHh8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzX3NjYW4oZGV2LCAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCisgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIHRyYWZmaWMsIGFsd2F5cyBPTgorICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KQoreworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vIERvaW5nIHNjYW4gd2hlbiA6CisgICAgLy8gMS4gRGlzY29ubmVjdGVkOiBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgKDIwMG1zLTYwMG1zIGluIG91ciBkcml2ZXIpCisgICAgLy8gICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fICAgICAgICAgICAgIF9fXworICAgIC8vIExFRFswXSBPTiAgICB8ICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAvLyAgICAgICAgICAgICAgMCAgIDIgICA0ICAgNiAgIDggIDEwICAxMiAgMTQgIDE2CisgICAgLy8gMi4gQ29ubmVjdGVkOiAgIE9OICg4MDBtcykgLSBPRkYgKDIwMG1zKSAoNjAwbXMtMjAwbXMgaW4gb3VyIGRyaXZlcikKKyAgICAvLyAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICBfX19fX19fX19fXyAgICAgX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAorICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCisgICAgLy8gICAgICAgICAgICAgIDAgICAyICAgNCAgIDYgICA4ICAxMCAgMTIgIDE0ICAxNgorCisgICAgLy9TY2FuIHN0YXRlCisgICAgaWYoIWlzQ29ubmVjdCkKKyAgICAgICAgdG9uID0gMiwgdG9mZiA9IDY7CisgICAgZWxzZQorICAgICAgICB0b24gPSA2LCB0b2ZmID0gMjsKKworICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlICh0b24rdG9mZik7CisgICAgICAgaWYgKHRtcCA8IHRvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybF9CbGlua1doZW5TY2FuX0FscGhhICAgICAqLworLyogICAgICBDdXN0b21pemUgZm9yIEFscGhhL0RMaW5rIExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBCbGluayBMRUQgMTIgdGltZXMgd2l0aGluIDMgc2Vjb25kcyB3aGVuIGRvaW5nIEFjdGl2ZSBTY2FuICAgICAgICAgICovCisvKgkgICAgICAgICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fICAgX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICBMRURbMF0gT04gICAgICB8ICAgfCB8ICAgfCB8ICAgfCB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICAtLS0tLS0tT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0tKy0tPj4+Li4uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoemRldl90KiBkZXYpCit7CisgICAgc3RhdGljIHUzMl90IGNvdW50ZXIgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKGNvdW50ZXIgPiAzNCkgICAgICAgIC8vIGNvdW50ZXIgZm9yIDMgc2VjCisgICAgeworICAgICAgICB3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnICY9IH4odThfdClaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOworICAgICAgICBjb3VudGVyID0gMDsKKyAgICB9CisKKyAgICBpZiggKGNvdW50ZXIgJSAzKSA8IDIpCisgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgZWxzZQorICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworCisgICAgY291bnRlcisrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZDEwMG1zQ3RybCAgICAgICAgICAgICAgKi8KKy8qICAgICAgTEVEIDEwMCBtaWxsaXNlY29uZHMgdGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPmxlZFN0cnVjdC5jb3VudGVyKys7CisKKyAgICBpZih3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcpIHsKKyAgICAgICAgY2FzZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOgorICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgkJCS8vIFRyYWRpdGlvbmFsIDEgTEVECisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CQkJLy8gRHVhbC1MRURzIGZvciBOZXRnZWFyCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMihkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CQkJLy8gU2luZ2xlLUxFRCBmb3IgTmV0Z2VhciAoV04xMTF2MikKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzKGRldik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI0MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHBlcmZvcm1hbmNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisKKyNkZWZpbmUgWk1fVFBfU0laRSA1MAorc3RydWN0IHpzU3VtbWFyeSB6bV9zdW1tYXJ5Oworc3RydWN0IHpzVmFyaWF0aW9uIHptX3ZhcjsKK3N0cnVjdCB6c1Rocm91Z2hwdXQgem1fdHA7CisKK3ZvaWQgemZpUGVyZm9ybWFuY2VJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mbHVzaCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9yZW9yZGVyID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKKworICAgIHptX3RwLnNpemUgPSBaTV9UUF9TSVpFOworICAgIHptX3RwLmhlYWQgPSB6bV90cC5zaXplIC0gMTsKKyAgICB6bV90cC50YWlsID0gMDsKKyAgICBmb3IgKGk9MDsgaTx6bV90cC5zaXplOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXT0wOworICAgICAgICB6bV90cC5yeFtpXT0wOworICAgIH0KK30KKwordm9pZCB6ZmlQZXJmb3JtYW5jZUdyYXBoKHpkZXZfdCogZGV2KQoreworICAgIHMxNl90ICAgaSxqOworICAgIHU4X3QgICAgc1taTV9UUF9TSVpFKzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPCh6bV90cC5zaXplLTEpOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXSA9IHptX3RwLnR4W2krMV07CisgICAgICAgIHptX3RwLnJ4W2ldID0gem1fdHAucnhbaSsxXTsKKyAgICB9CisgICAgem1fdHAudHhbem1fdHAuc2l6ZS0xXSA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCoxNTAwKjgvMTAwMDAwMDsKKyAgICB6bV90cC5yeFt6bV90cC5zaXplLTFdID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50KjE1MDAqOC8xMDAwMDAwOworCisgICAgZm9yIChpPTE1OyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIHNbMF0gPSAoaS8xMCkgKyAnMCc7CisgICAgICAgIHNbMV0gPSAoaSUxMCkgKyAnMCc7CisgICAgICAgIHNbMl0gPSAnMCc7CisgICAgICAgIHNbM10gPSAnfCc7CisgICAgICAgIGZvciAoaj0wOyBqPHptX3RwLnNpemU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh6bV90cC50eFtqXS8xMCA9PSBpKSAmJiAoem1fdHAucnhbal0vMTAgPT0gaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc1s0K2pdID0gJ1gnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoem1fdHAudHhbal0vMTAgPT0gaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnVCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh6bV90cC5yeFtqXS8xMCA9PSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNbNCtqXSA9ICdSJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc1t6bV90cC5zaXplKzRdID0gJ1wwJzsKKyAgICAgICAgRGJnUHJpbnQoIiVzIixzKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIjAwMHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyIpOworCit9CisKKwordm9pZCB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZpRGJnUmVhZFJlZyhkZXYsIDB4MTE3NzJjKTsKKworICAgIHptX3Zhci50eF9tc2R1X21lYW4gPSB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgLyAxMDA7CisgICAgem1fdmFyLnR4X21wZHVfbWVhbiA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCAvIDEwMDsKKyAgICB6bV92YXIucnhfbXNkdV9tZWFuID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50IC8gMTAwOworICAgIHptX3Zhci5yeF9tcGR1X21lYW4gPSB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgLyAxMDA7CisKKyAgICB6bV92YXIudHhfbXNkdV9zdW0gPSB6bV92YXIudHhfbXBkdV9zdW0gPSAwOworICAgIHptX3Zhci5yeF9tc2R1X3N1bSA9IHptX3Zhci5yeF9tcGR1X3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50ID0gem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKyAgICB7CisgICAgICAgIHptX3Zhci50eF9tc2R1X3N1bSArPSAoem1fdmFyLnR4X21zZHVfdGlja1tpXSAqIHptX3Zhci50eF9tc2R1X3RpY2tbaV0pOworICAgICAgICB6bV92YXIudHhfbXBkdV9zdW0gKz0gKHptX3Zhci50eF9tcGR1X3RpY2tbaV0gKiB6bV92YXIudHhfbXBkdV90aWNrW2ldKTsKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfc3VtICs9ICh6bV92YXIucnhfbXNkdV90aWNrW2ldICogem1fdmFyLnJ4X21zZHVfdGlja1tpXSk7CisgICAgICAgIHptX3Zhci5yeF9tcGR1X3N1bSArPSAoem1fdmFyLnJ4X21wZHVfdGlja1tpXSAqIHptX3Zhci5yeF9tcGR1X3RpY2tbaV0pOworCisgICAgICAgIGlmICghem1fdmFyLnR4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50Kys7CisgICAgICAgIGlmICghem1fdmFyLnJ4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50Kys7CisgICAgfQorICAgIHptX3Zhci50eF9tc2R1X3ZhciA9ICh6bV92YXIudHhfbXNkdV9zdW0gLyAxMDApIC0gKHptX3Zhci50eF9tc2R1X21lYW4gKiB6bV92YXIudHhfbXNkdV9tZWFuKTsKKyAgICB6bV92YXIudHhfbXBkdV92YXIgPSAoem1fdmFyLnR4X21wZHVfc3VtIC8gMTAwKSAtICh6bV92YXIudHhfbXBkdV9tZWFuICogem1fdmFyLnR4X21wZHVfbWVhbik7CisgICAgem1fdmFyLnJ4X21zZHVfdmFyID0gKHptX3Zhci5yeF9tc2R1X3N1bSAvIDEwMCkgLSAoem1fdmFyLnJ4X21zZHVfbWVhbiAqIHptX3Zhci5yeF9tc2R1X21lYW4pOworICAgIHptX3Zhci5yeF9tcGR1X3ZhciA9ICh6bV92YXIucnhfbXBkdV9zdW0gLyAxMDApIC0gKHptX3Zhci5yeF9tcGR1X21lYW4gKiB6bV92YXIucnhfbXBkdV9tZWFuKTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc3VtICs9IHptX3N1bW1hcnkucnhfYnJva2VuX3NlcTsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtICs9ICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpOworCisgICAgemZpUGVyZm9ybWFuY2VHcmFwaChkZXYpOworCisgICAgRGJnUHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgRGJnUHJpbnQoIiogVFg6IE1TRFU9JTVkLCBWQVI9JTVkOyBNUERVPSU1ZCwgVkFSPSU1ZFxuIiwgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50LAorICAgICAgICB6bV92YXIudHhfbXNkdV92YXIsIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCwgem1fdmFyLnR4X21wZHVfdmFyKTsKKyAgICBEYmdQcmludCgiKiBUWDogaWRsZT0lNWQsVHhSYXRlPSUzZCwgIFBFUj0lNWRcbiIsIHptX3N1bW1hcnkudHhfaWRsZV9jb3VudCwKKyAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzLzEwMDAsCisgICAgICAgICh1MTZfdCl3ZC0+UEVSW3dkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZV0pOworICAgIERiZ1ByaW50KCIqIFJYOiBNU0RVPSU1ZCwgVkFSPSU1ZDsgTVBEVT0lNWQsIFZBUj0lNWRcbiIsIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCwKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfdmFyLCB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQsIHptX3Zhci5yeF9tcGR1X3Zhcik7CisgICAgRGJnUHJpbnQoIiogUlg6IGlkbGU9JTVkLFJ4UmF0ZT0lM2QsQU1TRFU9JTVkXG4iLCB6bV9zdW1tYXJ5LnJ4X2lkbGVfY291bnQsCisgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2Jwcy8xMDAwLCB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbik7CisgICAgRGJnUHJpbnQoIiogUlggYnJva2VuIHNlcT0lNGQsIGRpc3RhbmNlcz0lNGQsIGR1cGxpY2F0ZXM9JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEsCisgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMsIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSk7CisgICAgRGJnUHJpbnQoIiogUlggICAgb2xkIHNlcT0lNGQsICAgICAgbG9zdD0lNGQsIGJyb2tlbiBzdW09JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEsCisgICAgICAgICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zdW0pOworICAgIERiZ1ByaW50KCIqIFJ4ICAgbG9zdCBzdW09JTRkLGR1cC4gZXJyb3I9JTRkLCBmcmVlIGNvdW50PSU0ZFxuIiwgem1fc3VtbWFyeS5yeF9sb3N0X3N1bSwKKyAgICAgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfZXJyb3IsIHptX3N1bW1hcnkucnhfZnJlZSk7CisgICAgRGJnUHJpbnQoIiogUnggIGZsdXNoIHN1bT0lNGQsIGNsZWFyIHN1bT0lNGQsIHJlb3JkZXI9JTdkXG4iLCB6bV9zdW1tYXJ5LnJ4X2ZsdXNoLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2NsZWFyLCB6bV9zdW1tYXJ5LnJ4X3Jlb3JkZXIpOworICAgIERiZ1ByaW50KCIqIEZpcm13YXJlIHJlc2V0PSUzZCwgcmVzZXQgc3VtPSU0ZFxuIiwgem1fc3VtbWFyeS5yZXNldF9jb3VudCwKKyAgICAgICAgem1fc3VtbWFyeS5yZXNldF9zdW0pOworICAgIERiZ1ByaW50KCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisgICAgLy9yZXNldCBjb3VudCAxMTc3MmMKKyAgICB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKK30KKwordm9pZCB6ZmlUeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljaykKK3sKKyAgICB1MzJfdCAgIGluZGV4OworICAgIHptX3N1bW1hcnkudHhfbXNkdV9jb3VudCsrOworCisgICAgaW5kZXggPSB0aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIudHhfbXNkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHRpY2sgLSB6bV9zdW1tYXJ5LnRpY2tfYmFzZTsKKworICAgIGlmIChpbmRleCA8IDEwMCkKKyAgICB7CisgICAgICAgIHptX3Zhci5yeF9tc2R1X3RpY2tbaW5kZXhdKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIndkLT50aWNrIGV4Y2VlZGVkIHRpY2tfYmFzZSsxMDAhXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spCit7CisgICAgdTMyX3QgICBpbmRleDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQrKzsKKworICAgIGluZGV4ID0gdGljayAtIHptX3N1bW1hcnkudGlja19iYXNlOworCisgICAgaWYgKGluZGV4IDwgMTAwKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21wZHVfdGlja1tpbmRleF0rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgid2QtPnRpY2sgZXhjZWVkZWQgdGlja19iYXNlKzEwMCFcbiIpOworICAgIH0KK30KKworI2lmbmRlZiBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisjZW5kaWYKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBmcmFtZVR5cGU7CisgICAgdTE2X3QgICBmcmFtZUN0cmw7CisgICAgdThfdCAgICBtcGR1SW5kOworICAgIHUxNl90ICAgcGxjcEhkckxlbjsKKyAgICB1MTZfdCAgIGxlbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIC8vaWYgKChtcGR1SW5kICYgMHgxMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsgICAgICAgIC8vIFBMQ1AgaGVhZGVyIGxlbmd0aAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KSA9PSB3ZC0+bWFjQWRkclsyXSkgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0peworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDEyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBwbGNwSGRyTGVuICsgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHdkLT50aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIucnhfbXBkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VTZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCAgIG9sZF9kaXMgPSB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIC8vc3lzX3RpbWUgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZmcmVxKTsKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKworICAgIFpNX1NFUV9ERUJVRygiT3V0ICAgJTVkXG4iLCBzZXFfbm8pOworCisgICAgaWYgKHNlcV9ubyA8IHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpCisgICAgeworICAgICAgICBpZiAoc2VxX25vID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICE9IDQwOTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc2VxX25vIDwgMzAwKSAmJiAoem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA+IDM4MDApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXErKzsKKyAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgc2VxX25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzKz0oem1fc3VtbWFyeS5yeF9zZXFfYmFzZSAtIHNlcV9ubyk7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXErKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoc2VxX25vICE9ICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2VxX25vID4gMzgwMCkgJiYgKHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPCAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMrPSg0MDk2IC0gc2VxX25vICsgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSk7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9vbGRfc2VxKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KHNlcV9ubyAtIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzZXFfbm8gPT0gem1fc3VtbWFyeS5yeF9zZXFfYmFzZSkKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSsrOworICAgIH0KKworICAgIGlmICgoem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyAtIG9sZF9kaXMpID4gMTAwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiogc2VxX25vPSU0ZCwgYmFzZV9zZXE9JTRkLCBkaXNfZGlmZj0lNGQiLCBzZXFfbm8sCisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzIC0gb2xkX2Rpcyk7CisgICAgfQorICAgIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPSBzZXFfbm87Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgcmVnLCB1MzJfdCByc3ApCit7CisgICAgem1fc3VtbWFyeS5yZXNldF9jb3VudCA9ICh1MTZfdClyc3AgLSB6bV9zdW1tYXJ5LnJlc2V0X3N1bTsKKyAgICB6bV9zdW1tYXJ5LnJlc2V0X3N1bSA9ICh1MTZfdClyc3A7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUR1cCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYxLCB6YnVmX3QqIGJ1ZjIpCit7CisgICAgdTE2X3QgICBzZXFfbm8xLCBzZXFfbm8yOworCisgICAgc2VxX25vMSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYxLCAyMikgPj4gNDsKKyAgICBzZXFfbm8yID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZjIsIDIyKSA+PiA0OworICAgIGlmIChzZXFfbm8xICE9IHNlcV9ubzIpCisgICAgeworICAgICAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvcisrOworICAgIH0KK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlKys7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIGlmICh6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA8IGxlbikKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gbGVuOworICAgIH0KK30KK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfZmx1c2grKzsKK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhcisrOworICAgIFpNX1NFUV9ERUJVRygiUnhDbGVhciIpOworfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZW9yZGVyKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfcmVvcmRlcisrOworfQorI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY2NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9QRVJGT1JNQU5DRV9ICisjZGVmaW5lIF9QRVJGT1JNQU5DRV9ICisKKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorCitzdHJ1Y3QgenNTdW1tYXJ5Cit7CisgICAgdTMyX3QgdHhfbXNkdV9jb3VudDsKKyAgICB1MzJfdCB0eF9tcGR1X2NvdW50OworICAgIHUzMl90IHJ4X21zZHVfY291bnQ7CisgICAgdTMyX3QgcnhfbXBkdV9jb3VudDsKKyAgICB1MzJfdCB0aWNrX2Jhc2U7CisgICAgdTE2X3Qgcnhfc2VxX2Jhc2U7CisgICAgdTE2X3QgcnhfYnJva2VuX3NlcTsKKyAgICB1MTZfdCByeF9icm9rZW5fc3VtOworICAgIHUxNl90IHJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIHUxNl90IHJ4X2R1cGxpY2F0ZV9zZXE7CisgICAgdTE2X3QgcnhfZHVwbGljYXRlX2Vycm9yOworICAgIHUxNl90IHJ4X29sZF9zZXE7CisgICAgdTE2X3QgcnhfbG9zdF9zdW07CisgICAgdTE2X3QgdHhfaWRsZV9jb3VudDsKKyAgICB1MTZfdCByeF9pZGxlX2NvdW50OworICAgIHUxNl90IHJlc2V0X2NvdW50OworICAgIHUxNl90IHJlc2V0X3N1bTsKKyAgICB1MTZfdCByeF9mcmVlOworICAgIHUxNl90IHJ4X2Ftc2R1X2xlbjsKKyAgICB1MTZfdCByeF9mbHVzaDsKKyAgICB1MTZfdCByeF9jbGVhcjsKKyAgICB1MzJfdCByeF9yZW9yZGVyOworfTsKKworc3RydWN0IHpzVmFyaWF0aW9uCit7CisgICAgdTMyX3QgdHhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgdHhfbXBkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXBkdV90aWNrWzEwMF07CisKKyAgICB1MzJfdCB0eF9tc2R1X21lYW47CisgICAgdTMyX3QgdHhfbXBkdV9tZWFuOworICAgIHUzMl90IHJ4X21zZHVfbWVhbjsKKyAgICB1MzJfdCByeF9tcGR1X21lYW47CisKKyAgICB1MzJfdCB0eF9tc2R1X3N1bTsKKyAgICB1MzJfdCB0eF9tcGR1X3N1bTsKKyAgICB1MzJfdCByeF9tc2R1X3N1bTsKKyAgICB1MzJfdCByeF9tcGR1X3N1bTsKKworICAgIHUzMl90IHR4X21zZHVfdmFyOworICAgIHUzMl90IHR4X21wZHVfdmFyOworICAgIHUzMl90IHJ4X21zZHVfdmFyOworICAgIHUzMl90IHJ4X21wZHVfdmFyOworfTsKKworc3RydWN0IHpzVGhyb3VnaHB1dAoreworICAgIHUzMl90IHR4WzUwXTsKKyAgICB1MzJfdCByeFs1MF07CisgICAgdTE2X3QgaGVhZDsKKyAgICB1MTZfdCB0YWlsOworICAgIHUxNl90IHNpemU7CisgICAgTEFSR0VfSU5URUdFUiBzeXNfdGltZTsKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7Cit9OworCit2b2lkIHpmaVBlcmZvcm1hbmNlSW5pdCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmaVBlcmZvcm1hbmNlUmVmcmVzaCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljayk7Cit2b2lkIHpmaVR4UGVyZm9ybWFuY2VNUERVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVNlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCByZWcsIHUzMl90IHJzcCk7Cit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VEdXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmMSwgemJ1Zl90KiBidWYyKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUNsZWFyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlb3JkZXIoemRldl90KiBkZXYpOworI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLworI2VuZGlmIC8qIGVuZCBvZiBfUEVSRk9STUFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNGJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfVVNCX0gKKyNkZWZpbmUgX1BVQl9VU0JfSAorCisjaW5jbHVkZSAiLi4vb2FsX2R0LmgiCisKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfQVAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfU1RBICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMICAgIDIKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICAgIDMKKworLyogVVNCIG1vZHVsZSBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFF1ZXVlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgcmVxdWlyZXMgT0FMIHRvIGltcGxlbWVudCBhIHRyYW5zbWlzc2lvbiBxdWV1ZSBpbiBPQUwncyAgICAqLworLyogVVNCIG1vZHVsZS4gQmVjYXVzZSB0aGVyZSBpcyBvbmx5IGxpbWl0ZWQgb24tY2hpcCBtZW1vcnksIHNvIFVTQiAgICAgKi8KKy8qIGRhdGEgdHJhbnNmZXIgbWF5IGJlIHBlbmRpbmcgdW50aWwgb24tY2hpcCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgICAgICovCisvKiA4MDIxMWNvcmUgYWxzbyByZXF1aXJlcyBPQUwncyBVU0IgbW9kdWxlIHRvIHByb3ZpZGUgdHdvIGZ1bmN0aW9ucyAgICAqLworLyogemZ3VXNiR2V0RnJlZVR4UVNpemUoKSBhbmQgemZ3VXNiR2V0TWF4VHhRU2l6ZSgpIGZvciA4MDIxMWNvcmUgdG8gICAgKi8KKy8qIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhpcyB0cmFuc21pc3Npb24gcXVldWUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgICAgICovCisvKiB0aGlzIHF1ZXVlIGlzIGZvciBRb1MvV01NLiBUaG91Z2ggdGhlcmUgYXJlIGhhcmR3YXJlIHByaW9yaXR5ICAgICAgICAqLworLyogcXVldWVzIG9uIHRoZSBjaGlwLCBhbmQgYWxzbyBzb2Z0d2FyZSBwcmlvcml0eSBxdWV1ZXMgaW4gdGhlICAgICAgICAgKi8KKy8qIDgwMjExY29yZS4gVGhlcmUgaXMgc3RpbGwgb25lIGFuZCBvbmx5IG9uZSBVU0IgY2hhbm5lbC4gU28gICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHRoYXQgemZ3VXNiR2V0RnJlZVR4UVNpemUoKSAgICAgICAqLworLyogcmV0dXJuZWQgdG8gc2NoZWR1bGUgdGhlIHRyYWZmaWMgZnJvbSB0aGUgc29mdHdhcmUgcHJpb3JpdHkgICAgICAgICAgKi8KKy8qIHF1ZXVlcyB0byB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgcXVldWVzLiBGb3IgZXhhbXBsZSwgaWYgODAyMTFjb3JlICAgICovCisvKiBmb3VuZCB0aGF0IFVTQiB0cmFuc21pc3Npb24gcXVldWUgaXMgZ29pbmcgdG8gYmUgZnVsbCwgaXQgd2lsbCAgICAgICAqLworLyogbm90IGFsbG93IHBhY2tldHMgd2l0aCBsb3dlciBwcmlvcml0eSB0byBlbnRlciB0aGUgVVNCIGNoYW5uZWwuICAgICAgKi8KKworCisvKiBTdHJ1Y3R1cmUgZm9yIFVTQiBjYWxsIGJhY2sgZnVuY3Rpb25zICovCitzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgeworICAgIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsKKyAgICB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKKyAgICB2b2lkICgqemZjYlVzYk91dENvbXBsZXRlKSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworICAgIHZvaWQgKCp6ZmNiVXNiUmVnT3V0Q29tcGxldGUpKHpkZXZfdCogZGV2KTsKK307CisKKy8qIENhbGwgYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWxvdyBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE9BTCAgICAgICAgICAgICAqLworCisvKiBXaGVuIGRhdGEgaXMgYXZhaWxhYmxlIGluIGVuZHBvaW50IDMsIE9BTCBzaGFsbCBlbWJlZCB0aGUgZGF0YSBpbiAqLworLyogemJ1Zl90IGFuZCBzdXBwbHkgdG8gODAyMTFjb3JlIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsgKi8KKworLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBlbmRwb2ludCAyLCBPQUwgc2hhbGwgY2FsbCB0aGlzIGZ1bmN0aW9uICovCisvKiB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsgKi8KKworLyogV2hlbiBVU0IgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZWQgaW4gZW5kcG9pbnQgMSwgT0FMIHNoYWxsIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworLyogdm9pZCAoKnpmY2JVc2JPdXRDb21wbGV0ZSkoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKTsgKi8KKworCisvKiBDYWxsIG91dCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmVsb3cgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBzdXBwbHkgYnkgdGhlIE9BTCBmb3IgODAyMTFjb3JlIHRvICAgICAgKi8KKy8qIG1hbmlwdWxhdGUgdGhlIFVTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFJldHVybiBPQUwncyBVU0IgVHhRIHNpemUgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmV0dXJuIE9BTCdzIFR4USBhdmFpbGFibGUgc2l6ZSAqLworZXh0ZXJuIHUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmVnaXN0ZXIgY2FsbCBiYWNrIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYyk7CisKKy8qIEVuYWJsZSBVU0IgaW50ZXJydXB0IGVuZHBvaW50ICovCitleHRlcm4gdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KTsKKworLyogRW5hYmxlIFVTQiBSeCBlbmRwb2ludCAqLworZXh0ZXJuIGludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCk7CisKKy8qIDgwMjExY29yZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCBhIFVTQiByZXF1ZXN0IG92ZXIgZW5kcG9pbnQgMCAqLworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90KiBkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwKKyAgICAgICAgdTE2X3QgaW5kZXgsIHZvaWQgKmRhdGEsIHUzMl90IHNpemUpOworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2xJbyh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHU4X3QgcmVxdHlwZSwKKyAgICAgICAgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDEgKi8KK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDQgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgVVNCIGNvbmZpZ3VyYXRpb24gKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZXRDb25maWd1cmF0aW9uKHpkZXZfdCAqZGV2LCB1MTZfdCB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfREVGU19ICisjZGVmaW5lIF9QVUJfREVGU19ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworLyoqKioqIFNlY3Rpb24gMSA6IFR1bmFibGUgUGFyYW1ldGVycyAqKioqKi8KKy8qIFRoZSBkZWZpbnRpb25zIGluIHRoaXMgc2VjdGlvbiBhcmUgdHVuYWJlbCBwYXJhbWV0ZXJzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEJTUyB0aGF0IGNvdWxkIGJlIHNjYW5lZCAqLworI2RlZmluZSBaTV9NQVhfQlNTICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKworLyogTWF4aW11bSBudW1iZXIgb2YgV1BBMiBQTUtJRCB0aGF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBaTV9QTUtJRF9NQVhfQlNTX0NOVCAgICAgICAgICAgICAgIDgKKworLyogRW5hYmxlIGFnZ3JlZ2F0aW9uIGFuZCBkZWFnZ3JlZ2F0aW9uICovCisjZGVmaW5lIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogRW5hYmxlIEJBIGZhaWxlZCByZXRyYW5zbWlzc2lvbiBpbiBmaXJtd2FyZSAqLworICAgICNkZWZpbmUgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgI2RlZmluZSBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgLy8jZGVmaW5lIFpNX0FHR1JfQklUX09OCisjZW5kaWYKKworCisjaWZuZGVmIFpNX0ZCNTAKKy8vI2RlZmluZSBaTV9GQjUwCisjZW5kaWYKKworI2lmbmRlZiBaTV9BUF9ERUJVRworLy8jZGVmaW5lIFpNX0FQX0RFQlVHCisjZW5kaWYKKworLy8jZGVmaW5lIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorCisvKioqKiogRW5kIG9mIHNlY3Rpb24gMSAqKioqKi8KKworCisvKioqKiogU2VjdGlvbiAyIDogUHVibGljIERlZmluaXRpb25zLCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKioqKiovCisvKiBmdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCisjZGVmaW5lIFpNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgMQorCisvLyBtZWRpYSBjb25uZWN0IHN0YXR1cworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EICAgIDB4MDIKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEICAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCAweDA0CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUICAgIDB4MDUKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX1JFU0VUICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEggICAweDA3CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MgIDB4MDgKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCAgMHgwOQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCAgMHgwYQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCAgMHgwYgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCAgIDB4MGMKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVU5SRUFDSEFCTEUgMHgwZAorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9CRUFDT05fTUlTUyAgMHgwZQorCisvLyBQYWNrZXQgRmlsdGVyCisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBCU1MgbW9kZSBkZWZpbml0aW9uICovCisvKiBUT0RPIDogVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGNvdXBsZWQgd2l0aCBYUCdzIE5ESVMgT0lELiAqLworLyogICAgICAgIFdlIGNhbid0IGJlIGNoYW5nZWQgdGhlbSBmcmVlbHksIG5lZWQgdG8gZGlzYXJtIHRoaXMgbWluZSAqLworI2RlZmluZSBaTV9NT0RFX0lCU1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFX01BWCAgICAgICAgICAzCisjZGVmaW5lIFpNX01PREVfQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTU9ERV9QU0VVRE8gICAgICAgICAgICAgICAgICAgICAgNQorCisKKy8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgKi8KKyNkZWZpbmUgWk1fQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FVVEhfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0FVVEhfTU9ERV9XUEFfTk9ORSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQTIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBMlBTSyAgICAgICAgICAgICAgICA3CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX0NFTkMgICAgICAgICAgICAgICAgICAgOAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQV9BVVRPICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLX0FVVE8gICAgICAgICAgICAxMAorCisvLyBFbmNyeXB0aW9uIG1vZGUKKyNkZWZpbmUgWk1fTk9fV0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX0FFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9US0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fV0VQNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dFUDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBaTV9XRVAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9DRU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gdHlwZSBmb3Igd2VwIHN0YXR1cyAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCAgICAgICAgICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9XRVBfS0VZX0FCU0VOVCAgICAgICAgMgorI2RlZmluZSBaTV9FTkNSWVBUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAzCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fVEtJUCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9US0lQX0tFWV9BQlNFTlQgICAgICAgNQorI2RlZmluZSBaTV9FTkNSWVBUSU9OX0FFUyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQUVTX0tFWV9BQlNFTlQgICAgICAgIDcKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQ0VOQyAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIHNlY3VyaXR5IHR5cGUgKi8KKyNkZWZpbmUgWk1fU0VDVVJJVFlfVFlQRV9OT05FICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TRUNVUklUWV9UWVBFX1dFUCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfV1BBICAgICAgICAgICAgICAgIDIKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfQ0VOQyAgICAgICAgICAgICAgIDMKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gRXhlbXB0aW9uIEFjdGlvbiBUeXBlICAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fRVhFTVBUX0FMV0FZUyAgICAgICAgIDEKKworLyogTUlDIGZhaWx1cmUgKi8KKyNkZWZpbmUgWk1fTUlDX1BBSVJXSVNFX0VSUk9SICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9NSUNfR1JPVVBfRVJST1IgICAgICAgICAgICAgICAgICAweDBFCisKKworLyogcG93ZXIgc2F2ZSBtb2RlICovCisjZGVmaW5lIFpNX1NUQV9QU19OT05FICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9QU19NQVggICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9QU19GQVNUICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQV9QU19MSUdIVCAgICAgICAgICAgICAgICAgICAzCisKKy8qIFdNRSBBQyBUeXBlICovCisjZGVmaW5lIFpNX1dNRV9BQ19CSyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogQmFja2dyb3VuZCBBQyAqLworI2RlZmluZSBaTV9XTUVfQUNfQkUgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIEJlc3QtZWZmb3J0IEFDICovCisjZGVmaW5lIFpNX1dNRV9BQ19WSURFTyAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgLyogVmlkZW8gQUMgKi8KKyNkZWZpbmUgWk1fV01FX0FDX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvKiBWb2ljZSBBQyAqLworCisvKiBQcmVhbWJsZSB0eXBlICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfQVVUTyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9MT05HICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUICAgICAgICAgICAgICAyCisKKy8qIHdpcmVsZXNzIG1vZGVzIGNvbnN0YW50cyAqLworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfNTQgICAgICAgIDB4MDEgICAvLy88IDUgR0h6IDU0IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81XzEwOCAgICAgICAweDAyICAgLy8vPCA1IEdIeiAxMDggTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzExICAgICAgIDB4MDQgICAvLy88IDIuNCBHSHogMTEgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzU0ICAgICAgIDB4MDggICAvLy88IDIuNCBHSHogNTQgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzEwOCAgICAgIDB4MTAgICAvLy88IDIuNCBHSHogMTA4IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV80OV8xMyAgICAgIDB4MTAwICAgLy8vPCA0LjkgR0h6IDEzLjUgTWJwcywgcXVhcnRlciByYXRlIGNobi1iYW5kd2lkdGggPSA1CisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfMjcgICAgICAweDIwMCAgIC8vLzwgNC45IEdIeiAyNyBNYnBzLCBoYWxmIHJhdGUgY2huLWJhbmR3aWR0aCA9IDEwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfNTQgICAgICAweDQwMCAgIC8vLzwgNC45IEdIeiA1NCBNYnBzLCBmdWxsIHJhdGUgY2huLWJhbmR3aWR0aCA9IDIwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8zMDAgICAgIDB4MTAwMCAgIC8vLzwgNSBHSHogMzAwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8zMDAgICAgMHgyMDAwICAgLy8vPCAyLjQgR0h6IDMwMCBNYnBzCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8xMzAgICAgIDB4NDAwMCAgIC8vLzwgNSBHSHogMTMwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8xMzAgICAgMHg4MDAwICAgLy8vPCAyLjQgR0h6IDEzMCBNYnBzCisKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF9OICAgICAgKFpNX1dJUkVMRVNTX01PREVfMjRfMTMwfFpNX1dJUkVMRVNTX01PREVfMjRfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfTiAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV81XzEzMHxaTV9XSVJFTEVTU19NT0RFXzVfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0ICAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV8yNF8xMXxaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81ICAgICAgICAgKFpNX1dJUkVMRVNTX01PREVfNV81NHxaTV9XSVJFTEVTU19NT0RFXzVfTikKKworLyogQWRIb2MgTW9kZSB3aXRoIGRpZmZlcmVudCBiYW5kICovCisjZGVmaW5lIFpNX0FESE9DQkFORF9BICAgICAgICAgMQorI2RlZmluZSBaTV9BREhPQ0JBTkRfQiAgICAgICAgIDIKKyNkZWZpbmUgWk1fQURIT0NCQU5EX0cgICAgICAgICAzCisjZGVmaW5lIFpNX0FESE9DQkFORF9CRyAgICAgICAgNAorI2RlZmluZSBaTV9BREhPQ0JBTkRfQUJHICAgICAgIDUKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGluIHRoZSBmaWVsZCBhbGdObyBvZiBhdXRoZW50aWNhdGlvbiBmcmFtZXMgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX09QRU5fU1lTVEVNICAgICAgMHgxMDAwMCAgICAvKiBPcGVuIHN5c3RlbSAqLworI2RlZmluZSBaTV9BVVRIX0FMR09fU0hBUkVEX0tFWSAgICAgICAweDEwMDAxICAgIC8qIFNoYXJlZCBLZXkgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX0xFQVAgICAgICAgICAgICAgMHgxMDA4MCAgICAvKiBMZWFwICovCisKK3N0cnVjdCB6c1NjYW5SZXN1bHQKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKworc3RydWN0IHpzU3Rhc3RpY3MKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKyNkZWZpbmUgWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSAgICAgICAxMgorI2RlZmluZSBaTV9NQVhfSUVfU0laRSAgICAgICAgICAgICAgICAgIDUwIC8vMTAwCisjZGVmaW5lIFpNX01BWF9XUFNfSUVfU0laRSAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX01BWF9QUk9CRV9GUkFNRV9CT0RZX1NJWkUgICAgNTEyLy8zMDAKKyNkZWZpbmUJWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFCQkyMAorCisjZGVmaW5lIFpNX01BWF9TU0lEX0xFTkdUSCAgICAgICAgICAzMgorc3RydWN0IHpzQnNzSW5mbworeworICAgIHU4X3QgICBtYWNhZGRyWzZdOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICB1OF90ICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgIGNhcGFiaWxpdHlbMl07CisgICAgdThfdCAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgc3NpZFtaTV9NQVhfU1NJRF9MRU5HVEggKyAyXTsgICAvLyBFSUQoMSkgKyBMZW5ndGgoMSkgKyBTU0lEKDMyKQorICAgIHU4X3QgICBzdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIGNoYW5uZWw7CisgICAgdTE2X3QgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgZXJwOworICAgIHU4X3QgICBleHRTdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIHdwYUllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgIHdzY0llW1pNX01BWF9XUFNfSUVfU0laRSArIDJdOworICAgIHU4X3QgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdThfdCAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOyAvKiBDRU5DICovIC8qIGhhbGYgc2l6ZSBiZWNhdXNlIG9mIG1lbW9yeSBleGNlZWQgNjRrIGJvdW5kYXJ5ICovCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICBzZWN1cml0eVR5cGU7CisgICAgdThfdCAgIHNpZ25hbFN0cmVuZ3RoOworICAgIHU4X3QgICBzaWduYWxRdWFsaXR5OworICAgIHUxNl90ICBzb3J0VmFsdWU7CisgICAgdThfdCAgIHdtZVN1cHBvcnQ7CisgICAgdThfdCAgIGZsYWc7CisgICAgdThfdCAgIEVuYWJsZUhUOworICAgIHU4X3QgICBlbmFibGVIVDQwOworICAgIHU4X3QgICBTRzQwOworICAgIHU4X3QgICBleHRDaE9mZnNldDsKKyAgICB1OF90ICAgYXBDYXA7IC8vIGJpdDA6MTFOIEFQCisgICAgdTE2X3QgIGZyYW1lQm9keXNpemU7CisgICAgdThfdCAgIGZyYW1lQm9keVtaTV9NQVhfUFJPQkVfRlJBTUVfQk9EWV9TSVpFXTsKKyAgICB1OF90ICAgY291bnRyeUluZm9bWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFICsgMl07CisgICAgdTE2X3QgIGF0aE93bEFwOworICAgIHUxNl90ICBtYXJ2ZWxBcDsKKyAgICB1MTZfdCAgYnJvYWRjb21IVEFwOworICAgIHUzMl90ICB0aWNrOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIG5leHQ7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0Cit7CisgICAgdThfdCBic3NDb3VudDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBoZWFkOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHRhaWw7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0VjEKK3sKKyAgICB1OF90IGJzc0NvdW50OworICAgIHN0cnVjdCB6c0Jzc0luZm8gYnNzSW5mb1taTV9NQVhfQlNTXTsKK307CisKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfR0sgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9LRVlfRkxBR19QSyAgICAgICAgICAgICAgICAgMFgwMDAyCisjZGVmaW5lIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfSU5JVF9JViAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSAgICAgICAgMHgwMDEwCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9LRVlfRkxBR19DRU5DICAgICAgICAgICAgICAgMHgwMDIwCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisvLyBDb21tZW50OiBGb3IgVEtJUCwga2V5WzBdfmtleVsxNV0gID0+IFRLSVAga2V5CisvLyAgICAgICAgICAgICAgICAgICAga2V5WzE2XX5rZXlbMjNdID0+IFR4IE1JQyBrZXkKKy8vICAgICAgICAgICAgICAgICAgICBrZXlbMjRdfmtleVszMV0gPT4gUnggTUlDIGtleQorc3RydWN0IHpzS2V5SW5mbworeworICAgIHU4X3QqICAga2V5OworICAgIHU4X3QgICAga2V5TGVuZ3RoOworICAgIHU4X3QgICAga2V5SW5kZXg7CisgICAgdThfdCogICBpbml0SXY7CisgICAgdTE2X3QgICBmbGFnOworICAgIHU4X3QgICAgdmFwSWQ7CisgICAgdTE2X3QgICAgdmFwQWRkclszXTsKKyAgICB1MTZfdCogICBtYWNBZGRyOworfTsKKworCisKKy8qCisgKiBDaGFubmVscyBhcmUgc3BlY2lmaWVkIGJ5IGZyZXF1ZW5jeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNl90CWNoYW5uZWw7CS8qIHNldHRpbmcgaW4gTWh6ICovCisJdTMyX3QJY2hhbm5lbEZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKwl1OF90CXByaXZGbGFnczsKKwlzOF90CW1heFJlZ1R4UG93ZXI7CS8qIG1heCByZWd1bGF0b3J5IHR4IHBvd2VyIGluIGRCbSAqLworCXM4X3QJbWF4VHhQb3dlcjsJLyogbWF4IHRydWUgdHggcG93ZXIgaW4gMC4yNSBkQm0gKi8KKwlzOF90CW1pblR4UG93ZXI7CS8qIG1pbiB0cnVlIHR4IHBvd2VyIGluIDAuMjUgZEJtICovCit9IFpNX0hBTF9DSEFOTkVMOworCitzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUKK3sKKyAgICB1MTZfdCAgIHJlZ2lvbkNvZGU7CisgICAgdTE2X3QgICBDdXJDaEluZGV4OworICAgIHUxNl90ICAgYWxsb3dDaGFubmVsQ250OworICAgIFpNX0hBTF9DSEFOTkVMICAgYWxsb3dDaGFubmVsWzYwXTsgICAvKiAyLjRHSHo6IDE0IGNoYW5uZWxzLCA1IEdIejogMzEgY2hhbm5lbHMgKi8KK307CisKK3N0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudAoreworICAgIHU4X3QgYnNzaWRbNl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCU1NJRCBvZiBJQlNTCisgICAgdThfdCBwZWVyTWFjQWRkcls2XTsgICAgICAgICAgICAgICAgLy8gVGhlIE1BQyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbgorfTsKKworI2RlZmluZSBaTV9SQ19UUkFJTkVEX0JJVCAgIDB4MQorc3RydWN0IHpzUmNDZWxsCit7CisgICAgdTMyX3QgdHhDb3VudDsKKyAgICB1MzJfdCBmYWlsQ291bnQ7CisgICAgdThfdCBjdXJyZW50UmF0ZTsKKyAgICB1OF90IGN1cnJlbnRSYXRlSW5kZXg7CisgICAgdTMyX3QgcHJvYmluZ1RpbWU7CisgICAgdThfdCBvcGVyYXRpb25SYXRlU2V0WzI0XTsKKyAgICB1OF90IG9wZXJhdGlvblJhdGVDb3VudDsKKyAgICB1MTZfdCByeFJzc2k7CisgICAgdThfdCBmbGFnOworICAgIHUzMl90ICBsYXN0dHhDb3VudDsKKyAgICB1MzJfdCAgbGFzdFRpbWU7Cit9OworCitzdHJ1Y3QgenNPcHBvc2l0ZUluZm8KK3sKKyAgICB1OF90ICAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICBzdHJ1Y3QgenNSY0NlbGwgcmNDZWxsOworICAgIHU4X3QgICAgICAgICAgICB2YWxpZDsgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGUgaWYgdGhpcyBvcHBvc2l0ZSBpcyBzdGlsbCB2YWxpZAorICAgIHU4X3QgICAgICAgICAgICBhbGl2ZUNvdW50ZXI7CisgICAgdThfdCAgICAgICAgICAgIHBrSW5zdGFsbGVkOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIC8qIEZvciBXUEEyUFNLICEgKi8KKyAgICB1OF90IAkJCXdwYVN0YXRlOworICAgIHU4X3QgICAgICAgICAgICBjYW1JZHg7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1MTZfdCAgICAgICAgICAgaXYxNjsKKyAgICB1MzJfdCAgICAgICAgICAgaXYzMjsKKyNlbmRpZgorfTsKKwordHlwZWRlZiB2b2lkICgqemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiKSgKKyAgICB6ZGV2X3QqIGRldiwgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICpwZWVySW5mbywgdm9pZCAqY3R4LCB1OF90IGluZGV4KTsKKwordHlwZWRlZiB1MTZfdCAoKnpmcFN0YVJ4U2VjdXJpdHlDaGVja0NiKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisKKy8qIENvbW11bmljYXRpb24gVGFsbHkgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c0NvbW1UYWxseQoreworICAgIHUzMl90IHR4VW5pY2FzdEZybTsJCSAgICAvLyAgMCB0eFVuaWNhc3RGcmFtZXMKKyAgICB1MzJfdCB0eE11bHRpY2FzdEZybTsJCS8vICAxIHR4TXVsdGljYXN0RnJhbWVzCisgICAgdTMyX3QgdHhVbmljYXN0T2N0ZXRzOwkgICAgLy8gIDIgdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorICAgIHUzMl90IHR4TXVsdGljYXN0T2N0ZXRzOwkvLyAgMyB0eE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCB0eEZybVVwcGVyTkRJUzsgICAgICAgLy8gIDQKKyAgICB1MzJfdCB0eEZybURydk1ndDsgICAgICAgICAgLy8gIDUKKyAgICB1MzJfdCBSZXRyeUZhaWxDbnQ7CQkgICAgLy8gIDYKKyAgICB1MzJfdCBId19Ub3RhbFR4RnJtOwkJLy8gIDcgSGFyZHdhcmUgdG90YWwgVHggRnJhbWUKKyAgICB1MzJfdCBId19SZXRyeUNudDsJCSAgICAvLyAgOCB0eE11bHRpcGxlUmV0cmllc0ZyYW1lcworICAgIHUzMl90IEh3X1VuZGVycnVuQ250OyAgICAgICAvLyAgOQorCisgICAgdTMyX3QgRHJpdmVyUnhGcm1DbnQ7ICAgICAgIC8vIDEwCisgICAgdTMyX3QgcnhVbmljYXN0RnJtOwkJICAgIC8vIDExIHJ4VW5pY2FzdEZyYW1lcworICAgIHUzMl90IHJ4TXVsdGljYXN0RnJtOwkgICAgLy8gMTJyeE11bHRpY2FzdEZyYW1lcworCisgICAgdTMyX3QgTm90aWZ5TkRJU1J4RnJtQ250OyAgIC8vIDE0CisgICAgdTMyX3QgcnhVbmljYXN0T2N0ZXRzOwkvLyAxNSByeFVuaU9jdGV0cyAgYnl0ZSBzaXplCisgICAgdTMyX3QgcnhNdWx0aWNhc3RPY3RldHM7CSAgICAvLyAxNiByeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCBEcml2ZXJEaXNjYXJkZWRGcm07ICAgICAgIC8vIDE3IERpc2NhcmQgYnkgVmFsaWRhdGVGcmFtZQorICAgIHUzMl90IExlc3NUaGFuRGF0YU1pbkxlbjsgICAgICAgLy8gMTgKKyAgICB1MzJfdCBHcmVhdGVyVGhhbk1heExlbjsgICAgICAgIC8vIDE5CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeU11bHRpY2FzdExpc3Q7CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeUZybUN0cmw7CisgICAgdTMyX3QgcnhOZWVkRnJnRnJtOwkJICAgIC8vIDIyIG5lZWQgbW9yZSBmcmcgZnJtCisgICAgdTMyX3QgRHJpdmVyUnhNZ3RGcm1DbnQ7CisgICAgdTMyX3QgcnhCcm9hZGNhc3RGcm07CSAgICAvLyAyNCBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBjb3VudAorICAgIHUzMl90IHJ4QnJvYWRjYXN0T2N0ZXRzOwkvLyAyNSBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBieXRlIHNpemUKKyAgICB1MzJfdCByeDExYkRhdGFGcmFtZTsJCS8vIDI2IE1lYXN1cmVkIHF1YWxpdHkgMTFiIGRhdGEgZnJhbWUgY291bnQKKyAgICB1MzJfdCByeE9GRE1EYXRhRnJhbWU7CSAgICAvLyAyNyBNZWFzdXJlZCBxdWFsaXR5IDExZyBkYXRhIGZyYW1lIGNvdW50CisKKworICAgIHUzMl90IEh3X1RvdGFsUnhGcm07ICAgICAgICAvLyAyOAorICAgIHUzMl90IEh3X0NSQzE2Q250OwkJICAgIC8vIDI5IHJ4UExDUENSQ0VyckNudAorICAgIHUzMl90IEh3X0NSQzMyQ250OwkJICAgIC8vIDMwIHJ4Q1JDMzJFcnJDbnQKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfVU5JOyAgICAgLy8gMzEKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfTXVsOyAgICAgLy8gMzIKKworICAgIHUzMl90IEh3X1J4RklGT092ZXJydW47ICAgICAvLyAzNAorICAgIHUzMl90IEh3X1J4VGltZU91dDsgICAgICAgICAvLyAzNQorICAgIHUzMl90IExvc3NBUDsgICAgICAgICAgICAgICAvLyAzNgorCisgICAgdTMyX3QgVHhfTVBEVTsgICAgICAgICAgICAgIC8vIDM3CisgICAgdTMyX3QgQkFfRmFpbDsgICAgICAgICAgICAgIC8vIDM4CisgICAgdTMyX3QgSHdfVHhfQU1QRFU7ICAgICAgICAgIC8vIDM5CisgICAgdTMyX3QgSHdfVHhfTVBEVTsgICAgICAgICAgIC8vIDQwCisKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVTsKKyAgICB1MzJfdCBSYXRlQ3RybEJBRmFpbDsKKworICAgIHUzMl90IHR4UW9zRHJvcENvdW50WzVdOyAgICAvLzQxIDQyIDQzIDQ0IDQ1CisKKwl1MzJfdCBId19SeE1QRFU7ICAgICAgICAgICAgLy8gNDYKKwl1MzJfdCBId19SeERyb3BNUERVOyAgICAgICAgLy8gNDcKKwl1MzJfdCBId19SeERlbE1QRFU7ICAgICAgICAgLy8gNDgKKworCXUzMl90IEh3X1J4UGh5TWlzY0Vycm9yOyAgICAvLyA0OQorCXUzMl90IEh3X1J4UGh5WFJFcnJvcjsgICAgICAvLyA1MAorICAgIHUzMl90IEh3X1J4UGh5T0ZETUVycm9yOyAgICAvLyA1MQorICAgIHUzMl90IEh3X1J4UGh5Q0NLRXJyb3I7ICAgICAvLyA1MgorICAgIHUzMl90IEh3X1J4UGh5SFRFcnJvcjsgICAgICAvLyA1MworICAgIHUzMl90IEh3X1J4UGh5VG90YWxDb3VudDsgICAvLyA1NAorCisgICAgdTMyX3Qgc3dSeEZyYWdtZW50Q291bnQ7ICAgICAgICAgLy8gNTUKKyAgICB1MzJfdCBzd1J4VW5pY2FzdE1pY0ZhaWxDb3VudDsgICAvLyA1NgorICAgIHUzMl90IHN3UnhNdWx0aWNhc3RNaWNGYWlsQ291bnQ7IC8vIDU3CisgICAgdTMyX3Qgc3dSeERyb3BVbmVuY3J5cHRlZENvdW50OyAgLy8gNTgKKworICAgIHUzMl90IHR4QnJvYWRjYXN0RnJtOworICAgIHUzMl90IHR4QnJvYWRjYXN0T2N0ZXRzOworfTsKKworLyogVHJhZmZpYyBNb25pdG9yIFRhbGx5IGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgenNUcmFmVGFsbHkKK3sKKyAgICB1MzJfdCByeER1cGxpY2F0ZTsKKyAgICB1MzJfdCByeFNyY0lzT3duTWFjOworICAgIC8vdTMyX3QgcnhEYXRhRnJhbWVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVzSW4xMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFUbXBGb3IxMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFCeXRlc0luMjAwMG1zOworICAgIC8vdTMyX3QgcnhEYXRhVG1wRm9yMjAwMG1zOworCisgICAgLy91MzJfdCB0eERhdGFGcmFtZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZXNJbjEwMDBtczsKKyAgICAvL3UzMl90IHR4RGF0YVRtcEZvcjEwMDBtczsKKyAgICB1MzJfdCB0eERhdGFCeXRlc0luMjAwMG1zOworICAgIHUzMl90IHR4RGF0YVRtcEZvcjIwMDBtczsKK307CisKKy8qIEhhbCByeCBwYWNrZXQgbW9uaXRlciBpbmZvcm1hdGlvbiAqLworc3RydWN0IHpzTW9uSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107CisgICAgdTMyX3QgY3VycmVudFJ4RVZNWzE0XTsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTVQ7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1DUzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhQlc7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YVNHOworfTsKKworc3RydWN0IHpzVGFpbAoreworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgxOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgyOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgzOworICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsKKyAgICB1OF90IFNBSW5kZXg7CisgICAgdThfdCBEQUluZGV4OworICAgIHU4X3QgRXJyb3JJbmRpY2F0aW9uOworICAgIHU4X3QgUnhNYWNTdGF0dXM7Cit9OworCit1bmlvbiB6dVRhaWwKK3sKKyAgICBzdHJ1Y3QgenNUYWlsIERhdGE7CisgICAgdThfdCBCeXRlWzhdOworfTsKKworc3RydWN0IHpzQWRkaXRpb25JbmZvCit7CisgICAgdThfdCBQbGNwSGVhZGVyWzEyXTsKKyAgICB1bmlvbiB6dVRhaWwgICBUYWlsOworfTsKKworCitzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbworeworICAgIHUxNl90ICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICBwbWtpZFsxNl07Cit9OworCitzdHJ1Y3QgenNQbWtpZEluZm8KK3sKKwkgICB1MzJfdAkJYnNzaWRDb3VudDsKKwkgICBzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbwlic3NpZEluZm9bWk1fUE1LSURfTUFYX0JTU19DTlRdOworfTsKKworCitzdHJ1Y3QgenNDYkZ1bmNUYmwKK3sKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JEaXNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiQXBDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpOworICAgIHZvaWQgKCp6ZmNiU2Nhbk5vdGlmeSkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCk7CisgICAgdm9pZCAoKnpmY2JNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cyk7CisgICAgdm9pZCAoKnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JJYnNzUGFydG5lck5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywKKyAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisgICAgdm9pZCAoKnpmY2JId1dhdGNoRG9nTm90aWZ5KSh6ZGV2X3QqIGRldik7Cit9OworCitleHRlcm4gdm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CisjZGVmaW5lIFpNX0lOSVRfQ0JfRlVOQ19UQUJMRShwKSAgICAgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworCisvL2V4dGVybiBzdHJ1Y3QgenNXbGFuRGV2IHpnV2xhbkRldjsKKworLyogSW5pdGlhbGl6ZSBXTEFOIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSwgcmVzb3VyY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgKi8KKy8qIGZvciBXTEFOIG9wZXJhdGlvbiwgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIG90aGVyIGZ1bmN0aW9uLiAgICovCitleHRlcm4gdTE2X3QgemZpV2xhbk9wZW4oemRldl90KiBkZXYsIHN0cnVjdCB6c0NiRnVuY1RibCogY2JGdW5jVGJsKTsKKworLyogV0xBTiBoYXJkd2FyZSB3aWxsIGJlIHNodXRkb3duIGFuZCBhbGwgcmVzb3VyY2Ugd2lsbCBiZSByZWxlYXNlICovCitleHRlcm4gdTE2X3QgemZpV2xhbkNsb3NlKHpkZXZfdCogZGV2KTsKKworLyogRW5hYmxlL2Rpc2FibGUgV2xhbiBvcGVyYXRpb24gKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGlzYWJsZSh6ZGV2X3QqIGRldiwgdThfdCBSZXNldEtleUNhY2hlKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUmVzdW1lKHpkZXZfdCogZGV2LCB1OF90IGRvUmVjb25uKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuU3VzcGVuZCh6ZGV2X3QqIGRldik7CisKKy8qIEVuYWJsZS9kaXNhYmxlIElTUiBpbnRlcnJ1cHQgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RGlzYWJsZSh6ZGV2X3QqIGRldik7CisKKy8qIERvIFdMQU4gc2l0ZSBzdXJ2ZXkgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuU2Nhbih6ZGV2X3QqIGRldik7CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCitleHRlcm4gdTE2X3QgemZpV2xhbkdldFN0YXRpc3RpY3MoemRldl90KiBkZXYpOworCisvKiBSZXNldCBXTEFOICovCitleHRlcm4gdTE2X3QgemZpV2xhblJlc2V0KHpkZXZfdCogZGV2KTsKKworLyogRGVhdXRoZW50aWNhdGUgYSBTVEEgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGVhdXRoKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgcmVhc29uKTsKKworZXh0ZXJuIHUxNl90IHpmaVR4U2VuZEV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworZXh0ZXJuIHU4X3QgemZpSXNUeFF1ZXVlRnVsbCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZpVHhTZW5kODAyMTFNZ210KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisKK2V4dGVybiB2b2lkIHpmaUlzclBjaSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1OF90IHpmaVdsYW5JQlNTR2V0UGVlclN0YXRpb25zQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldik7CisKKy8qIGNvaWQuYyAqLworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKK2V4dGVybiB1MTZfdCB6ZmlHbG9iYWxEYXRhU2l6ZSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXbGFuTW9kZSh6ZGV2X3QqIGRldiwgdThfdCB3bGFuTW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3Qgd2VwU3RhdHVzKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90IHNzaWRMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYsIHUxNl90IGZyYWdUaHJlc2hvbGQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldiwgdTE2X3QgcnRzVGhyZXNob2xkKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LCB1MTZfdCBiZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYkltbWVkaWF0ZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0RHRpbUNvdW50KHpkZXZfdCogZGV2LCB1OF90ICBkdGltKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luZG93LCB1OF90IGJJbW1lZGlhdGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEVuY3J5TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBlbmNyeU1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKTsKK2V4dGVybiB1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0UG93ZXJTYXZlTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3RWMSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdFYxKiBic3NMaXN0VjEpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5QnNzTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdCogcEJzc0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQnNzTGlzdCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKTsKKworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5DaGFubmVsVG9GcmVxdWVuY3koemRldl90KiBkZXYsIHU4X3QgY2hhbm5lbCk7CitleHRlcm4gdThfdCB6ZmlXbGFuRnJlcXVlbmN5VG9DaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKKworI2RlZmluZSBaTV9XTEFOX1NUQVRFX09QRU5FRCAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEICAgICAgMworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5QWRhcHRlclN0YXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUF1dGhlbnRpY2F0aW9uTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U1NJRCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCogcFNzaWRMZW5ndGgpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lIVCh6ZGV2X3QqIGRldiwgdTMyX3QgKmJhbmRXaWR0aCwgdTMyX3QgKmV4dE9mZnNldCk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUNXRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCk7CitleHRlcm4gdTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVJ4QmVhY29uVG90YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlDYXBhYmlsaXR5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBaWQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVJzbkllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeU11bHRpY2FzdENpcGhlckFsZ28oemRldl90ICpkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJlZ2lvbkNvZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYUllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCBMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYVN1cHBvcnQoemRldl90KiBkZXYsIHU4X3QgV3BhU3VwcG9ydCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuQ2hlY2tTdGFXcGFJZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QmFzaWNSYXRlKHpkZXZfdCogZGV2LCB1OF90IGJSYXRlU2V0LCB1OF90IGdSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IG5SYXRlU2V0KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCR01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVR4UmF0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZldsYW5VcGRhdGVSeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UnhSYXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRQbWtpZEluZm8oemRldl90KiBkZXYsIHUxNl90KiBic3NpZCwgdThfdCogcG1raWQpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlIVEN0cmwoemRldl90KiBkZXYsIHUzMl90ICpzZXR0aW5nLCB1MzJfdCAqZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuRGJnKHpkZXZfdCogZGV2LCB1OF90IHNldHRpbmcpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuUmVzZXRUYWxseSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQ29tbVRhbGx5ICp0YWxseSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUcmFmVGFsbHkoemRldl90KiBkZXYsIHN0cnVjdCB6c1RyYWZUYWxseSAqdGFsbHkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNNb25IYWxSeEluZm8gKmhhbFJ4SW5mbyk7CisKK2V4dGVybiB1MzJfdCB6ZmlGV0NvbmZpZyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0TXVsdGljYXN0TGlzdCh6ZGV2X3QqIGRldiwgdThfdCBzaXplLCB1OF90KiBwTGlzdCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UGFja2V0VHlwZVByb21pc2N1b3VzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQYWNrZXRUeXBlUHJvbWlzY3VvdXMoemRldl90KiBkZXYsIHUzMl90IHNldFZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldENoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1MzJfdCBzZXR0aW5nKTsKK2V4dGVybiB2b2lkIHpmaVNldFJpZnMoemRldl90KiBkZXYsIHUxNl90IHNldHRpbmcpOworZXh0ZXJuIHZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVNldFJlb3JkZXIoemRldl90KiBkZXYsIHUxNl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldFNlcURlYnVnKHpkZXZfdCogZGV2LCB1MTZfdCB2YWx1ZSk7CisKK2V4dGVybiB1MTZfdCB6ZmlDb25maWdXZHNQb3J0KHpkZXZfdCogZGV2LCB1OF90IHdkc1BvcnRJZCwgdTE2X3QgZmxhZywgdTE2X3QqIHdkc0FkZHIsCisgICAgICAgIHUxNl90IGVuY1R5cGUsIHUzMl90KiB3ZHNLZXkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U2NhblRpbWVyUGVyQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgdGltZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0b1JlY29ubmVjdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOworZXh0ZXJuIHUzMl90IHpmaURlYnVnQ21kKHpkZXZfdCogZGV2LCB1MzJfdCBjbWQsIHUzMl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREcm9wVW5lbmNyeXB0ZWRQYWNrZXRzKHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SUJTU0pvaW5Pbmx5KHpkZXZfdCogZGV2LCB1OF90IGpvaW5Pbmx5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREZWZhdWx0S2V5SWQoemRldl90KiBkZXYsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldERpc2FibGVQcm9iaW5nV2l0aFNzaWQoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlHU04oemRldl90KiBkZXYsIHU4X3QgKmdzbiwgdTE2X3QgdmFwSWQpOworZXh0ZXJuIHUxNl90IHpmaVN0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0RG90MTFETW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXREb3QxMUhERlNNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldERvdDExSFRQQ01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0QW5pTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTdGFXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlLCB1OF90IHVhcHNkSW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXBXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeXdtZUVuYWJsZSh6ZGV2X3QqIGRldik7CisjaWZkZWYgWk1fT1NfTElOVVhfRlVOQworZXh0ZXJuIHZvaWQgemZpV2xhblNob3dUYWxseSh6ZGV2X3QqIGRldik7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworLyogQ0VOQyAqLworZXh0ZXJuIHU4X3QgemZpV2xhblNldENlbmNQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnR4aXYsIHUzMl90ICpyeGl2LAorICAgICAgICB1OF90ICprZXksIHU4X3QgKm1pYyk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0Q2VuY0dyb3VwS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqcnhpdiwKKyAgICAgICAgdThfdCAqa2V5LCB1OF90ICptaWMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oemRldl90KiBkZXYsIHU4X3QgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbyk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5U3VwcG9ydE1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVRyYW5zbWl0UG93ZXIoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkVuYWJsZUxlYXBDb25maWcoemRldl90KiBkZXYsIHU4X3QgbGVhcEVuYWJsZWQpOworCisvKiByZXR1cm5lZCBidWZmZXIgYWxsb2NhdGVkIGJ5IGRyaXZlciBjb3JlICovCitleHRlcm4gdm9pZCB6ZmlSZWN2RXRoQ29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgcG93ZXIyLCB1OF90IHBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90ICpwb3dlcjIsIHU4X3QgKnBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U3VwcG9ydE1vZGUoemRldl90KiBkZXYsIHUzMl90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFkaG9jTW9kZSh6ZGV2X3QqIGRldiwgdTMyX3QgbW9kZSk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1OF90IGJXcmFwcGVyKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKTsKK2V4dGVybiBjb25zdCBjaGFyKiB6ZmlXbGFuUXVlcnlDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlyZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUNDUyh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q0NTKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHpmaUhwR2V0aXNvTmFtZWZyb21yZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKTsKK2V4dGVybiB2b2lkICB6ZmlXbGFuU2V0TEVEQ3RybFBhcmFtKHpkZXZfdCogZGV2LCB1OF90IHR5cGUsIHU4X3QgZmxhZyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UmVjZWl2ZWRQYWNrZXQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKHpkZXZfdCAqZGV2LCB1MTZfdCAqY2hhbm5lbHMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkdldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3QqIHBNQ0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKTsKK2V4dGVybiB1OF90IHpmaUNvbXBhcmVXaXRoTXVsdGljYXN0TGlzdEFkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBkc3RNYWNBZGRyKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCAgdThfdCogaWJzc0FkZGl0aW9uYWxJRSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSk7CisKKy8qIGhwcncuYyAqLworZXh0ZXJuIHUzMl90IHpmaURiZ1dyaXRlRmxhc2goemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkcik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tX3YyKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCB3cmxlbik7CisKK2V4dGVybiB1MTZfdCB6ZmlEYmdDaGlwRXJhc2VGbGFzaCh6ZGV2X3QgKmRldik7CitleHRlcm4gdTE2X3QgemZpRGJnUHJvZ3JhbUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBvZmZzZXQsIHUzMl90IGxlbiwgdTMyX3QgKmRhdGEpOworZXh0ZXJuIHUzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbik7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pOworZXh0ZXJuIHUzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnU2V0SUZTeW50aGVzaXplcih6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpOworZXh0ZXJuIHUzMl90IHpmaURiZ1JlYWRUYWxseSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdRdWVyeUh3VHhCdXN5KHpkZXZfdCogZGV2KTsKKworZXh0ZXJuIHU4X3QgemZpV2xhbkdldERlc3RBZGRyRnJvbUJ1Zih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90ICptYWNBZGRyKTsKKworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUh3Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCk7CisKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLworCisvKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOworZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZWcoemRldl90KiBkZXYsIHUzMl90IHJlZywgdTMyX3QgcnNwKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpICAgICAgICAgICAgICAgIHpmaVBlcmZvcm1hbmNlSW5pdChkZXYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9UWF9NU0RVKGRldiwgdGljaykgICAgICAgemZpVHhQZXJmb3JtYW5jZU1TRFUoZGV2LCB0aWNrKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfTVNEVShkZXYsIHRpY2spICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKGRldiwgdGljayk7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB0aWNrKSAgICAgICB6ZmlUeFBlcmZvcm1hbmNlTVBEVShkZXYsIHRpY2spOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKSAgICAgICAgemZpUnhQZXJmb3JtYW5jZU1QRFUoZGV2LCBidWYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9TRVEoZGV2LCBidWYpICAgICAgICAgemZpUnhQZXJmb3JtYW5jZVNlcShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JFRyhkZXYsIHJlZywgcnNwKSAgICB7aWYoY21kWzFdID09IHJlZykgemZpUnhQZXJmb3JtYW5jZVJlZyhkZXYsIHJlZywgcnNwKTt9CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpICAgICB6ZmlSeFBlcmZvcm1hbmNlRHVwKGRldiwgYnVmMSwgYnVmMik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRnJlZShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pICB6ZmlSeFBlcmZvcm1hbmNlQU1TRFUoZGV2LCBidWYsIGxlbik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikgICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRmx1c2goZGV2KTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KSAgICAgICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VDbGVhcihkZXYpOworI2RlZmluZSBaTV9TRVFfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zZXFfZGVidWcpIERiZ1ByaW50CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1JFT1JERVIoZGV2KSAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlUmVvcmRlcihkZXYpOworI2Vsc2UKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB0aWNrKQorI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgdGljaykKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHRpY2spCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX01QRFUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1ZikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgcmVnLCByc3ApCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KQorI2RlZmluZSBaTV9TRVFfREVCVUcKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpCisjZW5kaWYKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAzICoqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmdy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWEyMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUFVCX1pGV19ICisjZGVmaW5lIF9QVUJfWkZXX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9ERUJVRworZXh0ZXJuIHpidWZfdCogemZ3QnVmQWxsb2NhdGVXaXRoQ29udGV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuLCB1OF90ICpmdW5jdGlvbk5hbWUsIFVMT05HIGxpbmUpOworI2RlZmluZSB6ZndCdWZBbGxvY2F0ZShkZXYsIGxlbikgIHpmd0J1ZkFsbG9jYXRlV2l0aENvbnRleHQoZGV2LCBsZW4sICh1OF90ICopX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNlbHNlCitleHRlcm4gemJ1Zl90KiB6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgemZ3QnVmRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGVyckNvZGUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCogZGV2LCB6YnVmX3QqKiBoZWFkLCB6YnVmX3QqIHRhaWwpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkNvcHkoemRldl90KiBkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYyk7CitleHRlcm4gdTE2X3QgemZ3QnVmU2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZlJlbW92ZUhlYWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzaXplKTsKK2V4dGVybiB1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitleHRlcm4gdm9pZCAgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRlc3QpOworCisvKiBNZW1vcnkgbWFuYWdlbWVudCAqLworZXh0ZXJuIHZvaWQqIHpmd01lbUFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MzJfdCBzaXplKTsKK2V4dGVybiB2b2lkIHpmd01lbUZyZWUoemRldl90KiBkZXYsIHZvaWQqIG1lbSwgdTMyX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgemZ3TWVtb3J5TW92ZSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmd1plcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CitleHRlcm4gdThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKKworLyogT3RoZXJzICovCitleHRlcm4gdm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpOworZXh0ZXJuIHUxNl90IHpmd0dldFZhcElkKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpOworZXh0ZXJuIHUzMl90IHpmd1dhaXRGb3JFdmVudCh6ZGV2X3QgKmRldiwgdTMyX3QgZXZlbnQsIHUzMl90IHRpbWVvdXQpOworZXh0ZXJuIHZvaWQgemZ3U2VuZEV2ZW50KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd0dldEFjdGl2ZVNjYW5EdXIoemRldl90KiBkZXYsIHU4X3QqIER1ciApOworZXh0ZXJuIHZvaWQgemZ3R2V0U2hvd1plcm9MZW5ndGhTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBEdXIgKTsKKy8qIEZvciBkZWJ1Z2dpbmcgKi8KK2V4dGVybiB2b2lkIHpmd0R1bXBCdWYoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmd0RiZ1JlYWRSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworLyogRm9yIEV2bCAqLworZXh0ZXJuIHZvaWQgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiByc3BkYXRhLCB1MzJfdCBkYXRhbGVuKTsKK2V4dGVybiB2b2lkIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcGRhdGEpOworZXh0ZXJuIHZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaERvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnV3JpdGVSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3RGJnV3JpdGVFZXByb21Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZFRhbGx5RG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndXbGFuUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndXbGFuV3JpdGVSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHZvaWQgemZ3V2xhblJlYWRUYWxseURvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90KiBkZXYsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZ3UmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3Qgb2Zmc2V0KTsKK2V4dGVybiB1MzJfdCB6ZndSZWFkRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyKTsKKworLyogUmVzZXJ2ZWQgZm9yIFZpc3RhLCBwbGVhc2UgcmV0dXJuIDAgKi8KK2V4dGVybiB1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBSZXNlcnZlZCBmb3IgQ0VOQywgcGxlYXNlIHJldHVybiAwICovCitleHRlcm4gdThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QqIGRldiwgdThfdCAqcFdJRWMsCisgICAgICAgIHU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKworI2lmZGVmIFpNX0hBTFBMVVNfTE9DSworZXh0ZXJuIGFzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldik7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgemZ3TGVhdmVDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpOworZXh0ZXJuIGFzbWxpbmthZ2UgdThfdCB6ZndCdWZSZWFkQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CitleHRlcm4gYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgdmFsdWUpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YWx1ZSk7CitleHRlcm4gYXNtbGlua2FnZSB1OF90ICp6ZndHZXRCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNlbmRpZgorCisjZW5kaWYgLy9fUFVCX1pGV19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogcXVldWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBxdWV1ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicXVldWUuaCIKKworCitzdHJ1Y3QgenNRdWV1ZSogemZRdWV1ZUNyZWF0ZSh6ZGV2X3QqIGRldiwgdTE2X3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgenNRdWV1ZSogcTsKKworICAgIGlmICgocSA9IChzdHJ1Y3QgenNRdWV1ZSopemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHpzUXVldWUpCisgICAgICAgICAgICArIChzaXplb2Yoc3RydWN0IHpzUXVldWVDZWxsKSooc2l6ZS0xKSkpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcS0+c2l6ZSA9IHNpemU7CisgICAgICAgIHEtPnNpemVNYXNrID0gc2l6ZS0xOworICAgICAgICBxLT5oZWFkID0gMDsKKyAgICAgICAgcS0+dGFpbCA9IDA7CisgICAgfQorICAgIHJldHVybiBxOworfQorCit2b2lkIHpmUXVldWVEZXN0cm95KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB1MTZfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCB6c1F1ZXVlKSArIChzaXplb2Yoc3RydWN0IHpzUXVldWVDZWxsKSoocS0+c2l6ZS0xKSk7CisKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCBxKTsKKyAgICB6ZndNZW1GcmVlKGRldiwgcSwgc2l6ZSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmUXVldWVQdXROY3MoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljaykKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9FUlJfUVVFVUVfRlVMTDsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgInpmUXVldWVQdXROY3MoKSIpOworCisgICAgaWYgKCgocS0+dGFpbCsxKSZxLT5zaXplTWFzaykgIT0gcS0+aGVhZCkKKyAgICB7CisgICAgICAgIHEtPmNlbGxbcS0+dGFpbF0uYnVmID0gYnVmOworICAgICAgICBxLT5jZWxsW3EtPnRhaWxdLnRpY2sgPSB0aWNrOworICAgICAgICBxLT50YWlsID0gKHEtPnRhaWwrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgcmV0ID0gWk1fU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit1MTZfdCB6ZlF1ZXVlUHV0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgemJ1Zl90KiBidWYsIHUzMl90IHRpY2spCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0ID0gemZRdWV1ZVB1dE5jcyhkZXYsIHEsIGJ1ZiwgdGljayk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworemJ1Zl90KiB6ZlF1ZXVlR2V0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB6YnVmX3QqIGJ1ZiA9IE5VTEw7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocS0+aGVhZCAhPSBxLT50YWlsKQorICAgIHsKKyAgICAgICAgYnVmID0gcS0+Y2VsbFtxLT5oZWFkXS5idWY7CisgICAgICAgIHEtPmhlYWQgPSAocS0+aGVhZCsxKSAmIHEtPnNpemVNYXNrOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gYnVmOworfQorCit1MTZfdCB6ZkNvbXBhcmVEc3R3aXRoQnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZHN0WzZdOworCisgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIGlmIChkc3RbaV0gIT0gYWRkcltpXSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDEraTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB6YnVmX3QqIHJldEJ1ZiA9IE5VTEw7CisgICAgdTE2X3QgaW5kZXgsIG5leHQ7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgICptYiA9IDA7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaW5kZXggPSBxLT5oZWFkOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpZiAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmID0gcS0+Y2VsbFtpbmRleF0uYnVmOworCisgICAgICAgICAgICAvL2lmIGJ1ZidzIGRldGluYXRpb24gYWRkcmVzcyA9PSBpbnB1dCBhZGRyCisgICAgICAgICAgICBpZiAoemZDb21wYXJlRHN0d2l0aEJ1ZihkZXYsIGJ1ZiwgYWRkcikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXRCdWYgPSBidWY7CisgICAgICAgICAgICAgICAgLy9HZXQgaXQsIGFuZCB0cmFjZSB0aGUgd2hvbGUgcXVldWUgdG8gY2FsY3VsYXRlIG1vcmUgYml0CisgICAgICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0oKGluZGV4KzEpJnEtPnNpemVNYXNrKSkgIT0gcS0+dGFpbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbaW5kZXhdLmJ1ZiA9IHEtPmNlbGxbbmV4dF0uYnVmOworICAgICAgICAgICAgICAgICAgICBxLT5jZWxsW2luZGV4XS50aWNrID0gcS0+Y2VsbFtuZXh0XS50aWNrOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoKm1iID09IDApICYmICh6ZkNvbXBhcmVEc3R3aXRoQnVmKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5jZWxsW25leHRdLmJ1ZiwgYWRkcikgPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEtPnRhaWwgPSAocS0+dGFpbC0xKSAmIHEtPnNpemVNYXNrOworCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0QnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAmIHEtPnNpemVNYXNrOworICAgICAgICB9IC8vaWYgKGluZGV4ICE9IHEtPnRhaWwpCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldEJ1ZjsKKworfQorCit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB3aGlsZSAoKGJ1ZiA9IHpmUXVldWVHZXQoZGV2LCBxKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdTMyX3QgICBidWZ0aWNrOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKHEtPmhlYWQgIT0gcS0+dGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmdGljayA9IHEtPmNlbGxbcS0+aGVhZF0udGljazsKKyAgICAgICAgICAgIGlmICgoKHRpY2sgLSBidWZ0aWNrKSpaTV9NU19QRVJfVElDSykgPiBtc0FnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYgPSBxLT5jZWxsW3EtPmhlYWRdLmJ1ZjsKKyAgICAgICAgICAgICAgICBxLT5oZWFkID0gKHEtPmhlYWQrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBZ2UgZnJhbWUgaW4gcXVldWUhIik7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworCit1OF90IHpmUXVldWVSZW1vdmV3aXRoSW5kZXgoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1MTZfdCBpbmRleCwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBuZXh0OworICAgIHU4X3QgbWIgPSAwOworCisgICAgLy90cmFjZSB0aGUgd2hvbGUgcXVldWUgdG8gY2FsY3VsYXRlIG1vcmUgYml0CisgICAgd2hpbGUgKChuZXh0ID0oKGluZGV4KzEpJnEtPnNpemVNYXNrKSkgIT0gcS0+dGFpbCkKKyAgICB7CisgICAgICAgIHEtPmNlbGxbaW5kZXhdLmJ1ZiA9IHEtPmNlbGxbbmV4dF0uYnVmOworICAgICAgICBxLT5jZWxsW2luZGV4XS50aWNrID0gcS0+Y2VsbFtuZXh0XS50aWNrOworCisgICAgICAgIGlmICgobWIgPT0gMCkgJiYgKHpmQ29tcGFyZURzdHdpdGhCdWYoZGV2LAorICAgICAgICAgICAgICAgIHEtPmNlbGxbbmV4dF0uYnVmLCBhZGRyKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWIgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBuZXh0OworICAgIH0KKyAgICBxLT50YWlsID0gKHEtPnRhaWwtMSkgJiBxLT5zaXplTWFzazsKKworICAgIHJldHVybiBtYjsKKworfQorCit2b2lkIHpmUXVldWVHZW5lcmF0ZVVhcHNkVGltKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwKKyAgICAgICAgdThfdCogdW5pQml0TWFwLCB1MTZfdCogaGlnaGVzdEJ5dGUpCit7CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB1OF90IGRzdFs2XTsKKyAgICB1MTZfdCBpZCwgYWlkLCBpbmRleCwgaTsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaW5kZXggPSBxLT5oZWFkOworCisgICAgd2hpbGUgKGluZGV4ICE9IHEtPnRhaWwpCisgICAgeworICAgICAgICBwc0J1ZiA9IHEtPmNlbGxbaW5kZXhdLmJ1ZjsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgcHNCdWYsIGkpOworICAgICAgICB9CisgICAgICAgIC8qIFRPRE8gOiB1c2UgdThfdCogZm90IE1BQyBhZGRyZXNzICovCisgICAgICAgIGlmICgoKGlkID0gemZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKWRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBQVkIgb25seSB3aGVuIGFsbCBBQyBhcmUgZGVsaXZlcnktZW5hYmxlZCAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc0luZm8gJiAweGYpID09IDB4ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhaWQgPSBpZCArIDE7CisgICAgICAgICAgICAgICAgYml0UG9zaXRpb24gPSAoMSA8PCAoYWlkICYgMHg3KSk7CisgICAgICAgICAgICAgICAgYnl0ZVBvc2l0aW9uID0gKGFpZCA+PiAzKTsKKyAgICAgICAgICAgICAgICB1bmlCaXRNYXBbYnl0ZVBvc2l0aW9uXSB8PSBiaXRQb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIGlmIChieXRlUG9zaXRpb24+KmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmhpZ2hlc3RCeXRlID0gYnl0ZVBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gKGluZGV4KzEpICYgcS0+c2l6ZU1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGcmVlIGdhcmJhZ2UgVUFQU0QgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmUXVldWVSZW1vdmV3aXRoSW5kZXgoZGV2LCBxLCBpbmRleCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNmI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9RVUVVRV9ICisjZGVmaW5lIF9RVUVVRV9ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworc3RydWN0IHpzUXVldWVDZWxsCit7CisgICAgdTMyX3QgICB0aWNrOworICAgIHpidWZfdCogYnVmOworfTsKKworc3RydWN0IHpzUXVldWUKK3sKKyAgICB1MTZfdCAgIHNpemU7CisgICAgdTE2X3QgICBzaXplTWFzazsKKyAgICB1MTZfdCAgIGhlYWQ7CisgICAgdTE2X3QgICB0YWlsOworICAgIHN0cnVjdCB6c1F1ZXVlQ2VsbCBjZWxsWzFdOworfTsKKworI2VuZGlmIC8vI2lmbmRlZiBfUVVFVUVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxMDRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJyYXRlY3RybC5oIgorCitjb25zdCB1MzJfdCB6Y1JhdGVUb1BoeUN0cmxbXSA9CisgICAgeworICAgICAgICAvKiAxTSwgICAgICAgIDJNLCAgICAgICAgIDVNLCAgICAgICAgMTFNICwgIDAgIDEgIDIgIDMqLworICAgICAgICAweDAwMDAwLCAgICAweDEwMDAwLCAgICAweDIwMDAwLCAgICAweDMwMDAwLAorICAgICAgICAvKiA2TSAgICAgICAgIDlNICAgICAgICAgIDEyTSAgICAgICAgMThNICwgIDQgIDUgIDYgIDcqLworICAgICAgICAweGIwMDAxLCAgICAweGYwMDAxLCAgICAweGEwMDAxLCAgICAweGUwMDAxLAorICAgICAgICAvKiAyNE0gICAgICAgICAzNk0gICAgICAgIDQ4TSAgICAgICAgNTRNICwgIDggIDkgIDEwIDExKi8KKyAgICAgICAgMHg5MDAwMSwgICAgMHhkMDAwMSwgICAgMHg4MDAwMSwgICAgMHhjMDAwMSwKKyAgICAgICAgLyogTUNTMCAgICAgIE1DUzEgICAgICAgIE1DUzIgICAgICAgIE1DUzMsICAxMiAxMyAxNCAxNSovCisgICAgICAgIDB4MDAwMDIsICAgIDB4MTAwMDIsICAgIDB4MjAwMDIsICAgIDB4MzAwMDIsCisgICAgICAgIC8qIE1DUzQgICAgICBNQ1M1ICAgICAgICBNQ1M2ICAgICAgICBNQ1M3LCAgMTYgMTcgMTggMTkqLworICAgICAgICAweDQwMDAyLCAgICAweDUwMDAyLCAgICAweDYwMDAyLCAgICAweDcwMDAyLAorICAgICAgICAvKiBNQ1M4ICAgICAgTUNTOSAgICAgICAgTUNTMTAgICAgICAgTUNTMTEsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMHg4MDAwMiwgICAgMHg5MDAwMiwgICAgMHhhMDAwMiwgICAgMHhiMDAwMiwKKyAgICAgICAgLyogTUNTMTIgICAgIE1DUzEzICAgICAgIE1DUzE0ICAgICAgIE1DUzE1LCAyNCAyNSAyNiAyNyovCisgICAgICAgIDB4YzAwMDIsICAgIDB4ZDAwMDIsICAgIDB4ZTAwMDIsICAgIDB4ZjAwMDIsCisgICAgICAgIC8qIE1DUzE0U0csICBNQ1MxNVNHICAgICBNQ1M3U0cgICAgICAgICAgICwgMjggMjksIDMwKi8KKyAgICAgICAgMHg4MDBlMDAwMiwgMHg4MDBmMDAwMiwgMHg4MDA3MDAwMgorICAgIH07CisKKworY29uc3QgdThfdCB6Y0h0UmF0ZVRhYmxlWzE1XVs0XSA9CisgICAgeyAvKls1RyAyME1Iel0gIFs1RyA0ME1Iel0gWzIuNEcgMjBNSHpdICBbMi40RyA0ME1Iel0qLworICAgICAgICB7ICA0LCAgICAgICAgICA0LCAgICAgICAgICAwLCAgICAgICAgICAwfSwgICAvKk9GRE02TSBPRkRNNk0gIENDSzFNICBDQ0sxTSAgKi8KKyAgICAgICAgeyAgNSwgICAgICAgICAgNSwgICAgICAgICAgMSwgICAgICAgICAgMX0sICAgLypPRkRNOU0gT0ZETTlNICBDQ0syTSAgQ0NLMk0gICovCisgICAgICAgIHsgIDEzLCAgICAgICAgIDEyLCAgICAgICAgIDIsICAgICAgICAgIDJ9LCAgIC8qTUNTMSAgIE1DUzAgICAgQ0NLNU0gIENDSzVNICAqLworICAgICAgICB7ICAxNCwgICAgICAgICAxMywgICAgICAgICAzLCAgICAgICAgICAzfSwgICAvKk1DUzIgICBNQ1MxICAgIENDSzExTSBDQ0sxMU0gKi8KKyAgICAgICAgeyAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTMsICAgICAgICAgMTJ9LCAgLypNQ1MzICAgTUNTMiAgICBNQ1MxICAgTUNTMCAgICovCisgICAgICAgIHsgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0LCAgICAgICAgIDEzfSwgIC8qTUNTNCAgIE1DUzMgICAgTUNTMiAgIE1DUzEgICAqLworICAgICAgICB7ICAyMywgICAgICAgICAxNiwgICAgICAgICAxNSwgICAgICAgICAxNH0sICAvKk1DUzExICBNQ1M0ICAgIE1DUzMgICBNQ1MyICAgKi8KKyAgICAgICAgeyAgMjQsICAgICAgICAgMjMsICAgICAgICAgMTYsICAgICAgICAgMTV9LCAgLypNQ1MxMiAgTUNTMTEgICBNQ1M0ICAgTUNTMyAgICovCisgICAgICAgIHsgIDI1LCAgICAgICAgIDI0LCAgICAgICAgIDIzLCAgICAgICAgIDE2fSwgIC8qTUNTMTMgIE1DUzEyICAgTUNTMTEgIE1DUzQgICAqLworICAgICAgICB7ICAyNiwgICAgICAgICAyNSwgICAgICAgICAyNCwgICAgICAgICAyM30sICAvKk1DUzE0ICBNQ1MxMyAgIE1DUzEyICBNQ1MxMSAgKi8KKyAgICAgICAgeyAgMjcsICAgICAgICAgMjYsICAgICAgICAgMjUsICAgICAgICAgMjR9LCAgLypNQ1MxNSAgTUNTMTQgICBNQ1MxMyAgTUNTMTIgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDI3LCAgICAgICAgIDI2LCAgICAgICAgIDI1fSwgIC8qMCAgICAgIE1DUzE1ICAgTUNTMTQgIE1DUzEzICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAyOSwgICAgICAgICAyNywgICAgICAgICAyNn0sICAvKjAgICAgICBNQ1MxNVNHIE1DUzE1ICBNQ1MxNCAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMjh9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTMTRTRyovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDI5fSAgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzE1U0cqLworICAgIH07CisKK2NvbnN0IHU4X3QgemNIdE9uZVR4U3RyZWFtUmF0ZVRhYmxlWzE1XVs0XSA9CisgICAgeyAvKls1RyAyME1Iel0gIFs1RyA0ME1Iel0gWzIuNEcgMjBNSHpdICBbMi40RyA0ME1Iel0qLworICAgICAgICB7ICA0LCAgICAgICAgICA0LCAgICAgICAgICAwLCAgICAgICAgICAwfSwgICAvKk9GRE02TSBPRkRNNk0gIENDSzFNICBDQ0sxTSAgKi8KKyAgICAgICAgeyAgNSwgICAgICAgICAgNSwgICAgICAgICAgMSwgICAgICAgICAgMX0sICAgLypPRkRNOU0gT0ZETTlNICBDQ0syTSAgQ0NLMk0gICovCisgICAgICAgIHsgIDEzLCAgICAgICAgIDEyLCAgICAgICAgIDIsICAgICAgICAgIDJ9LCAgIC8qTUNTMSAgIE1DUzAgICAgQ0NLNU0gIENDSzVNICAqLworICAgICAgICB7ICAxNCwgICAgICAgICAxMywgICAgICAgICAzLCAgICAgICAgICAzfSwgICAvKk1DUzIgICBNQ1MxICAgIENDSzExTSBDQ0sxMU0gKi8KKyAgICAgICAgeyAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTMsICAgICAgICAgMTJ9LCAgLypNQ1MzICAgTUNTMiAgICBNQ1MxICAgTUNTMCAgICovCisgICAgICAgIHsgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0LCAgICAgICAgIDEzfSwgIC8qTUNTNCAgIE1DUzMgICAgTUNTMiAgIE1DUzEgICAqLworICAgICAgICB7ICAxNywgICAgICAgICAxNiwgICAgICAgICAxNSwgICAgICAgICAxNH0sICAvKk1DUzUgICBNQ1M0ICAgIE1DUzMgICBNQ1MyICAgKi8KKyAgICAgICAgeyAgMTgsICAgICAgICAgMTcsICAgICAgICAgMTYsICAgICAgICAgMTV9LCAgLypNQ1M2ICAgTUNTNSAgICBNQ1M0ICAgTUNTMyAgICovCisgICAgICAgIHsgIDE5LCAgICAgICAgIDE4LCAgICAgICAgIDE3LCAgICAgICAgIDE2fSwgIC8qTUNTNyAgIE1DUzYgICAgTUNTNSAgIE1DUzQgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAxOSwgICAgICAgICAxOCwgICAgICAgICAxN30sICAvKjAgICAgICBNQ1M3ICAgIE1DUzYgICBNQ1M1ICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMzAsICAgICAgICAgMTksICAgICAgICAgMTh9LCAgLyowICAgICAgTUNTN1NHICBNQ1M3ICAgTUNTNiAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDE5fSwgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzcgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAzMH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICBNQ1M3U0cgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCB9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgMCAgICAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAgfSAgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIDAgICAgICAqLworICAgIH07CisKK2NvbnN0IHUxNl90IHpjUmF0ZVtdID0KKyAgICB7CisgICAgICAgIDEsIDIsIDUsIDExLCAgICAgICAgICAgICAgICAgIC8qIDFNLCAyTSwgNU0sIDExTSAgICAgICAgICAsICAwICAxICAyICAzKi8KKyAgICAgICAgNiwgOSwgMTIsIDE4LCAgICAgICAgICAgICAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAyNCwgMzYsIDQ4LCA1NCwgICAgICAgICAgICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDEzLCAyNywgNDAsIDU0LCAgICAgICAgICAgICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgODEsIDEwOCwgMTIxLCAxMzUsICAgICAgICAgICAgLyogTUNTNCBNQ1M1IE1DUzYgTUNTNyAgICAgICwgMTYgMTcgMTggMTkqLworICAgICAgICAyNywgNTQsIDgxLCAxMDgsICAgICAgICAgICAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDE2MiwgMjE2LCAyNDMsIDI3MCwgICAgICAgICAgIC8qIE1DUzEyIE1DUzEzIE1DUzE0IE1DUzE1ICAsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMjcwLCAzMDAsIDE1MCAgICAgICAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRywgTUNTN1NHICwgMjggMjkgMzAqLworICAgIH07CisKK2NvbnN0IHUxNl90IFBFUlRocmVzaG9sZFtdID0KKyAgICB7CisgICAgICAgIDEwMCwgNTAsIDUwLCA1MCwgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA1MCwgNTAsIDMwLCAzMCwgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjUsIDI1LCAyNSwgMjAsICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDUwLCA1MCwgNTAsIDQwLCAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDMwLCAzMCwgMzAsIDMwLCAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDMwLCAzMCwgMjUsIDI1LCAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDI1LCAyNSwgMTUsIDE1LCAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAxNSwgMTUsIDEwICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0cgICAgICAgICAsIDI4IDI5Ki8KKyAgICB9OworCitjb25zdCB1MTZfdCBGYWlsRGlmZltdID0KKyAgICB7CisgICAgICAgIDQwLCA0NiwgNDAsIDAsICAgICAgICAgIC8qIDFNLCAyTSwgNU0sIDExTSAgICAgICAgICAsICAwICAxICAyICAzKi8KKyAgICAgICAgMjQsIDE3LCAyMiwgMTYsICAgICAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAxOSwgMTMsIDUsIDAsICAgICAgICAgICAvKiAyNE0gIDM2TSAgNDhNICA1NE0gICAgICAgLCAgOCAgOSAxMCAxMSovCisgICAgICAgIDM2LCAyMiwgMTUsIDE5LCAgICAgICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMTIsIDUsIDQsIDcsICAgICAgICAgICAgLyogTUNTNCBNQ1M1IE1DUzYgTUNTNyAgICAgICwgMTYgMTcgMTggMTkqLworICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiBNQ1M4IE1DUzkgTUNTMTAgTUNTMTEgICAgLCAyMCAyMSAyMiAyMyovCisgICAgICAgIDksIDQsIDMsIDMsICAgICAgICAgICAgIC8qIE1DUzEyIE1DUzEzIE1DUzE0IE1DUzE1ICAsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMywgMCwgMCAgICAgICAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRyAgICAgICAgICwgMjggMjkqLworICAgIH07CisKKworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAordTMyX3QgVHhNUERVWzI5XTsKK3UzMl90IEJBRmFpbFsyOV07Cit1MzJfdCBCQVBFUlsyOV07Citjb25zdCB1MTZfdCBCQURpZmZbXSA9CisgICAgeworICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAzNjEsIDIyMCwgMTUxLCAxODcsCisgICAgICAgIDEyMiwgNDgsIDQxLCA2NSwKKyAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgODgsIDMzLCAyNywgMjUsCisgICAgICAgIDAKKyAgICB9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwgICAgICAgICAgKi8KKy8qICAgICAgSW5pdGlhbGl6ZSByYXRlIGNvbnRyb2wgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExYS9nLCAyPT4xMW4sIDM9PjExbiBvbmUgVHggc3RyZWFtICAgICAgICAgICAqLworLyogICAgICBnQmFuZCA6IDE9PjIuNEcsIDA9PjVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsSW5pdENlbGwoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHR5cGUsCisgICAgICAgIHU4X3QgZ0JhbmQsIHU4X3QgU0c0MCkKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBtYXhyYXRlOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChTRzQwKSBTRzQwID0gMTsKKworICAgIGlmIChnQmFuZCAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gMSkgLy8xMWcKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSAvLzFNIDJNIDVNIDExTQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9ICh1OF90KWk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9NDsgaTwxMDsgaSsrKSAvLzEyTSAxOE0gMjRNIDM2TSA0OE0gNTRNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gMitpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxMDsKKyAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDU7IC8vMThNCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAyKSAvLzExbmcKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAvL0FQIDExbmcgNDBNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCFTRzQwKSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbMTNdID0gMjc7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxNCtTRzQwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL1NUQQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuZyA0ME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDE1OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIVNHNDApIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFsxM10gPSAyNzsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxNCtTRzQwOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMzsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTM7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMykgLy8xMW5nIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuZyA0ME0gb25lIFR4IHN0cmVhbQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoU0c0MCAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWF4cmF0ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvL2lmICh0eXBlID09IDApIC8vMTFiCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSAodThfdClpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSA0OworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSAyKSAvLzExbmEKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAvL0FQIDExbmEgNDBNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KDEyK1NHNDApOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEyK1NHNDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9TVEEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKSAvLzExbmEgNDBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwoMTIrU0c0MCk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEyK1NHNDA7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLy8xMW5hIDIwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDExOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDMpIC8vMTFuYSBvbmUgVHggc3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKSAvLzExbmEgNDBNIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKFNHNDAgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4cmF0ZSA9IDExOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4cmF0ZSA9IDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG1heHJhdGU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdE9uZVR4U3RyZWFtUmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gKChpKzEpKjMpLzQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLy8xMW5nIDIwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8OTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvL2lmICh0eXBlID09IDEpIC8vMTFhCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykgLy82TSA5TSAxMk0gMThNIDI0TSAzNk0gNDhNIDU0TQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IGkrNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gODsKKyAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDQ7ICAvLzI0TQorICAgICAgICB9CisgICAgfQorCisgICAgcmNDZWxsLT5mbGFnID0gMDsKKyAgICByY0NlbGwtPnR4Q291bnQgPSAwOworICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gMDsKKyAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W3JjQ2VsbC0+Y3VycmVudFJhdGVJbmRleF07CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0VGltZSAgICA9IHdkLT50aWNrOworICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICBmb3IgKGk9MDsgaTxaTV9SQVRFX1RBQkxFX1NJWkU7IGkrKykgeworICAgICAgICB3ZC0+UEVSW2ldID0gMDsKKyAgICAgICAgd2QtPnR4TVBEVVtpXSA9IHdkLT50eEZhaWxbaV0gPSAwOworICAgIH0KKyAgICB3ZC0+cHJvYmVDb3VudCA9IDA7CisgICAgd2QtPnByb2JlSW50ZXJ2YWwgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgIGZvciAoaT0wOyBpPDI5OyBpKyspIHsKKyAgICAgICAgVHhNUERVW2ldPTA7CisgICAgICAgIEJBRmFpbFtpXT0wOworICAgICAgICBCQVBFUltpXT0wOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEdldEhpZ2hlclJhdGUgICAgICovCisvKiAgICAgIEdldCBhIGhpZ2hlciByYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKQoreworICAgIHU4X3QgcmF0ZUluZGV4OworCisgICAgcmF0ZUluZGV4ID0gcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4CisgICAgICAgICAgICArICgoKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCsxKSA8IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50KT8xOjApOworICAgIHJldHVybiByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbcmF0ZUluZGV4XTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybE5leHRMb3dlclJhdGUgICAgICovCisvKiAgICAgIEdldCBhIGxvd2VyIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxOZXh0TG93ZXJSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA+IDApCisgICAgeworICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgtLTsKKyAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZSA9IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtyY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXhdOworICAgIH0KKyAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJMb3dlciBUeCBSYXRlPSIsIHJjQ2VsbC0+Y3VycmVudFJhdGUpOworICAgIC8vRGJnUHJpbnQoIkxvd2VyIFR4IFJhdGU9JWQiLCByY0NlbGwtPmN1cnJlbnRSYXRlKTsKKyAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5sYXN0VGltZSAgPSB3ZC0+dGljazsKKyAgICByZXR1cm4gcmNDZWxsLT5jdXJyZW50UmF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFJhdGVEaWZmICAgICAgICAgICovCisvKiAgICAgIFJhdGUgZGlmZmVyZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByZXRyeVJhdGUgOiByZXRyeSByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByYXRlIGRpZmZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZlJhdGVDdHJsUmF0ZURpZmYoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgcmV0cnlSYXRlKQoreworICAgIHUxNl90IGk7CisKKyAgICAvKiBGaW5kIHJldHJ5UmF0ZSBpbiBvcGVyYXRpb25SYXRlU2V0W10gKi8KKyAgICBmb3IgKGk9MDsgaTxyY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHJldHJ5UmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpIDwgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCAtIGkpKzEpPj4xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUT0RPIDogcmV0cnkgcmF0ZSBub3QgaW4gb3BlcmF0aW9uIHJhdGUgc2V0ICovCisgICAgem1fbXNnMV90eChaTV9MVl8wLCAiTm90IGluIG9wZXJhdGlvbiByYXRlIHNldDoiLCByZXRyeVJhdGUpOworICAgIHJldHVybiAxOworCit9CisKK3UzMl90IHpmUmF0ZUN0cmxVRFBUUCh6ZGV2X3QqIGRldiwgdTE2X3QgUmF0ZSwgdTMyX3QgUEVSKSB7CisgICAgaWYgKChQRVIgPCAxMDApICYmIChSYXRlID4gMCkgJiYgUEVSKQorICAgICAgICByZXR1cm4gMTE2ODAwMC8oKCgxMjMwNC9SYXRlKSsxOTcpKigxMDArMTAwKlBFUi8oMTAwLVBFUikpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit1OF90IHpmUmF0ZUN0cmxGaW5kTWF4VURQVFAoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKSB7CisgICAgdThfdCBpLCBtYXhJbmRleD0wLCByYXRlSW5kZXg7CisgICAgdTMyX3QgbWF4PTAsIFVEUFRocm91Z2hwdXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYXRlSW5kZXggPSB6bV9hZ2dfbWluKHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCszLCByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudC0xKTsKKyAgICBmb3IgKGk9cmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4OyBpIDwgcmF0ZUluZGV4OyBpKyspIHsKKyAgICAgICAgVURQVGhyb3VnaHB1dCA9IHpmUmF0ZUN0cmxVRFBUUChkZXYsIHpjUmF0ZVtyY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV1dLAorICAgICAgICAgICAgd2QtPlBFUltyY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV1dKTsKKyAgICAgICAgaWYgKG1heCA8IFVEUFRocm91Z2hwdXQpIHsKKyAgICAgICAgICAgIG1heCA9IFVEUFRocm91Z2hwdXQ7CisgICAgICAgICAgICBtYXhJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W21heEluZGV4XTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsR2V0VHhSYXRlICAgICAgICAgKi8KKy8qICAgICAgR2V0IHRyYW5zbWlzc2lvbiByYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwcm9iaW5nIDogcmF0ZSBwcm9iaW5nIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZSYXRlQ3RybEdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHUxNl90KiBwcm9iaW5nKQoreworICAgIHU4X3QgbmV3UmF0ZSwgaGlnaFJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV90eChaTV9MVl8zLCAidHhDb3VudD0iLCByY0NlbGwtPnR4Q291bnQpOworICAgIHptX21zZzFfdHgoWk1fTFZfMywgInByb2JpbmdUaW1lPSIsIHJjQ2VsbC0+cHJvYmluZ1RpbWUpOworICAgIHptX21zZzFfdHgoWk1fTFZfMywgInRpY2s9Iiwgd2QtPnRpY2spOworICAgICpwcm9iaW5nID0gMDsKKyAgICBuZXdSYXRlID0gcmNDZWxsLT5jdXJyZW50UmF0ZTsKKworICAgIGlmICh3ZC0+cHJvYmVDb3VudCAmJiAod2QtPnByb2JlQ291bnQgPCB3ZC0+c3VjY2Vzc19wcm9iaW5nKSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cHJvYmVJbnRlcnZhbCA8IDUwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByb2JlSW50ZXJ2YWwrKzsKKyAgICAgICAgICAgIGlmICh3ZC0+cHJvYmVJbnRlcnZhbCA+IDUyKSAvL3Byb2JlIDUxLCA1MiwgNTMgdGhyZWUgcGFja2V0cyBldmVyeSA1MCBwYWNrZXRzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlSW50ZXJ2YWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3UmF0ZT16ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZShyY0NlbGwpOworICAgICAgICAgICAgKnByb2JpbmcgPSAxOworICAgICAgICAgICAgd2QtPnByb2JlQ291bnQrKzsKKyAgICAgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBBY2N1bXVsYXRlIGF0IGxlYXN0IDEwMDBtcyBhbmQgOCBwYWNrZXRzIG9yIEFjY3VtdWxhdGUgb3ZlciAxSyBwYWNrZXRzICovCisgICAgZWxzZSBpZiAoKCgod2QtPnRpY2sgLSByY0NlbGwtPnByb2JpbmdUaW1lKSA+IChaTV9SQVRFX0NUUkxfUFJPQklOR19JTlRFUlZBTF9NUy9aTV9NU19QRVJfVElDSykpCisgICAgICAgICAgICAgICAgJiYgKHJjQ2VsbC0+dHhDb3VudCA+PSBaTV9SQVRFX0NUUkxfTUlOX1BST0JJTkdfUEFDS0VUKSkKKyAgICAgICAgfHwgKHJjQ2VsbC0+dHhDb3VudCA+PSAxMDAwKSkKKyAgICB7CisjaWZuZGVmIFpNX0RJU0FCTEVfUkFURV9DVFJMCisgICAgICAgIC8qIFBFUiA9IGZhaWwvdG90YWwgKi8KKyAgICAgICAgd2QtPnByb2JlQ291bnQgPSAwOworICAgICAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSAwOworICAgICAgICBpZiAod2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSAhPSAwKSB7CisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gem1fYWdnX21pbigxMDAsCisgICAgICAgICAgICAgICAgKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0qMTAwKS93ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKTsKKyAgICAgICAgICAgIGlmICghd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSArKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIFBFUiA8IHRocmVzaG9sZCwgZG8gcmF0ZSBwcm9iaW5nLCByZXR1cm4gcHJvYmluZyByYXRlICovCisgICAgICAgIGlmICgod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA8PSAoWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCsxNSkpIHx8CisgICAgICAgICAgICAoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTYpICYmCisgICAgICAgICAgICAoKHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0vMikgPD0gWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG5ld1JhdGU9emZSYXRlQ3RybEdldEhpZ2hlclJhdGUocmNDZWxsKSkgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcHJvYmluZyA9IDE7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlQ291bnQrKzsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN1Y2Nlc3NfcHJvYmluZyA9CisgICAgICAgICAgICAgICAgICAgIChyY0NlbGwtPmN1cnJlbnRSYXRlIDw9IDE2KT8gKFpNX1JBVEVfU1VDQ0VTU19QUk9CSU5HLzIpIDogWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiU3RhcnQgUHJvYmluZyIpOworICAgICAgICAgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIlByb2JpbmcgUmF0ZT0iLCBuZXdSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgem1fbXNnMF90eChaTV9MVl8xLCAiRGltaW5pc2ggY291bnRlciIpOworICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+ZmFpbENvdW50Pj4xOworICAgICAgICByY0NlbGwtPnR4Q291bnQgPSByY0NlbGwtPnR4Q291bnQ+PjE7CisgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKworICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA+IDE1KSB7CisgICAgICAgICAgICBoaWdoUmF0ZSA9IHpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHJjQ2VsbCk7CisgICAgICAgICAgICBpZiAoKGhpZ2hSYXRlICE9IHJjQ2VsbC0+Y3VycmVudFJhdGUpICYmIHdkLT5QRVJbaGlnaFJhdGVdICYmCisgICAgICAgICAgICAgICAgKCh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdICsgRmFpbERpZmZbcmNDZWxsLT5jdXJyZW50UmF0ZV0pID4KKyAgICAgICAgICAgICAgICB3ZC0+UEVSW2hpZ2hSYXRlXSkpIHsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJQRVIgY29tcGFyZSBmb3JjZSByYWlzZSByYXRlIHRvICVkIiwgaGlnaFJhdGUpOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IHdkLT5wcm9iZUNvdW50ID0gWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KGRldiwgcmNDZWxsLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoaWdoUmF0ZSA9IHpmUmF0ZUN0cmxGaW5kTWF4VURQVFAoZGV2LCByY0NlbGwpOworICAgICAgICAgICAgaWYgKHJjQ2VsbC0+Y3VycmVudFJhdGUgPCBoaWdoUmF0ZSkgeworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlVEUCBUaHJvdWdocHV0IGNvbXBhcmUgZm9yY2UgcmFpc2UgcmF0ZSB0byAlZCIsIGhpZ2hSYXRlKTsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSB3ZC0+cHJvYmVDb3VudCA9IFpNX1JBVEVfU1VDQ0VTU19QUk9CSU5HOworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsIHJjQ2VsbCwgaGlnaFJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgPSB3ZC0+dGljazsKKyAgICB9CisKKyAgICBpZiggKHdkLT50aWNrID4gMTAwMCkKKyAgICAgICAgJiYgKCh3ZC0+dGljayAtIHJjQ2VsbC0+bGFzdFRpbWUpID4gMzg0MCkgKQorICAgIHsKKyAgICAgICAgaWYgKHJjQ2VsbC0+bGFzdHR4Q291bnQgPCA3MCkKKyAgICAgICAgeworICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgPSByY0NlbGwtPmZhaWxDb3VudD4+MTsKKyAgICAgICAgICAgIHJjQ2VsbC0+dHhDb3VudCA9IHJjQ2VsbC0+dHhDb3VudD4+MTsKKyAgICAgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworCisgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IChyY0NlbGwtPmZhaWxDb3VudCA8IHJjQ2VsbC0+dHhDb3VudCk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50IDogcmNDZWxsLT50eENvdW50OworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9ICh3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDwgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA6IHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV07CisgICAgICAgIH0KKworICAgICAgICByY0NlbGwtPmxhc3RUaW1lICAgID0gd2QtPnRpY2s7CisgICAgICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQgPSAwOworICAgIH0KKworICAgIHJjQ2VsbC0+dHhDb3VudCsrOworICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQrKzsKKyAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKys7CisgICAgem1fbXNnMV90eChaTV9MVl8xLCAiR2V0IFR4IFJhdGU9IiwgbmV3UmF0ZSk7CisgICAgcmV0dXJuIG5ld1JhdGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeEZhaWxFdmVudCAgICAgICAqLworLyogICAgICBUeCBmYWlsIGV2ZW50LiBDYWxjdWxhdGUgUEVSIGFuZCBsb3dlciBUeCByYXRlIGlmIHVuZGVyICAgICAgICAgKi8KKy8qICAgICAgUEVSIHVuZGVyIHRocmVzaG9sZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHJ5UmF0ZSA6IHJldHJ5IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxUeEZhaWxFdmVudCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgYWdnUmF0ZSwgdTMyX3QgcmV0cnlSYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyNpZm5kZWYgWk1fRElTQUJMRV9SQVRFX0NUUkwKKyAgICAvL0RiZ1ByaW50KCJhZ2dSYXRlPSVkLCByZXRyeVJhdGU9JWQiLCBhZ2dSYXRlLCByZXRyeVJhdGUpOworICAgIGlmIChhZ2dSYXRlICYmIChhZ2dSYXRlICE9IHJjQ2VsbC0+Y3VycmVudFJhdGUpKSB7CisgICAgICAgIHdkLT50eEZhaWxbYWdnUmF0ZV0gKz0gcmV0cnlSYXRlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFhZ2dSYXRlKSB7CisgICAgICAgIHJldHJ5UmF0ZSA9ICh6ZlJhdGVDdHJsUmF0ZURpZmYocmNDZWxsLCAodThfdClyZXRyeVJhdGUpKzEpPj4xOworICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA8MTIpIC8vbGVnYWN5IHJhdGUKKyAgICAgICAgeworICAgICAgICAgICAgcmV0cnlSYXRlKj0yOworICAgICAgICB9CisgICAgfQorICAgIHJjQ2VsbC0+ZmFpbENvdW50ICs9IHJldHJ5UmF0ZTsKKyAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdICs9IHJldHJ5UmF0ZTsKKworICAgIC8vRGJnUHJpbnQoImZhaWxDb3VudD0lZCIsIHJjQ2VsbC0+ZmFpbENvdW50KTsKKyAgICBpZiAocmNDZWxsLT5mYWlsQ291bnQgPiBaTV9NSU5fUkFURV9GQUlMX0NPVU5UKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gIT0gMCkgeworICAgICAgICAgICAgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHptX2FnZ19taW4oMTAwLAorICAgICAgICAgICAgICAgICh3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdKjEwMCkvd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk7CisgICAgICAgICAgICBpZiAoIXdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0pIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKys7CisgICAgICAgIH0KKyAgICAgICAgLy96bV9tc2cxX3R4KFpNX0xWXzEsICJQRVI9IiwgcGVyKTsKKyAgICAgICAgLy9EYmdQcmludCgiUEVSPSVkLCB0eEZhaWw9JWQsIHR4TVBEVT0lZCIsIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0sIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0sIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0pOworICAgICAgICBpZiAod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSA+IFBFUlRocmVzaG9sZFtyY0NlbGwtPmN1cnJlbnRSYXRlXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTG93ZXIgVHggUmF0ZSBpZiBQRVIgPCBUSFJFU0hPTEQgKi8KKyAgICAgICAgICAgIHpmUmF0ZUN0cmxOZXh0TG93ZXJSYXRlKGRldiwgcmNDZWxsKTsKKyAgICAgICAgICAgIHJjQ2VsbC0+ZmxhZyB8PSBaTV9SQ19UUkFJTkVEX0JJVDsKKworICAgICAgICAgICAgLy8gUmVzb2x2ZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBNYXJ2ZWxsCisgICAgICAgICAgICBpZihyY0NlbGwtPmN1cnJlbnRSYXRlID09IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgemZIcFNldEFnZ1BrdE51bShkZXYsIDgpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworCisgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCA9IHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50ICAgICovCisvKiAgICAgIFR4IHN1Y2Nlc3MgZXZlbnQuIFJhaXNlIFR4IHJhdGUgYmVjYXVzZSByYXRlIHByb2Jpbmcgc3VjY2Vzcy4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWNjZXNzUmF0ZSA6IHN1Y2Nlc3MgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHN1Y2Nlc3NSYXRlKQoreworICAgIC8qIFJhaXNlIFR4IFJhdGUgKi8KKyAgICB1MTZfdCBpLCBQRVJQcm9iZTsKKyAgICB1MTZfdCBwY291bnQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vRGJnUHJpbnQoIlByb2Jpbmcgc3VjY2Vzc1JhdGU9JWQiLCBzdWNjZXNzUmF0ZSk7CisgICAgLyogRmluZCBzdWNjZXNzUmF0ZSBpbiBvcGVyYXRpb25SYXRlU2V0W10gKi8KKyAgICB3ZC0+cHJvYmVTdWNjZXNzQ291bnQrKzsKKyAgICBpZiAod2QtPnByb2JlQ291bnQgPCB3ZC0+c3VjY2Vzc19wcm9iaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBjb3VudCA9IHdkLT5wcm9iZUNvdW50OworICAgIGlmIChwY291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIFBFUlByb2JlID0gd2QtPnByb2JlU3VjY2Vzc0NvdW50ICogMTAwIC8gcGNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQRVJQcm9iZSA9IDE7CisgICAgfQorCisgICAgaWYgKFBFUlByb2JlIDwgKChyY0NlbGwtPmN1cnJlbnRSYXRlIDwgMTYpPyA4MDoxMDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvL0RiZ1ByaW50KCJ3ZC0+cHJvYmVDb3VudD0lZCwgd2QtPnByb2JlU3VjY2Vzc0NvdW50PSVkIiwgd2QtPnByb2JlQ291bnQsIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCk7CisgICAgd2QtPnByb2JlQ291bnQgPSB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgPSAwOworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoc3VjY2Vzc1JhdGUgPT0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBSYWlzZSBjdXJyZW50IFR4IHJhdGUgKi8KKyAgICAgICAgICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJSYWlzZSBUeCBSYXRlPSIsIHN1Y2Nlc3NSYXRlKTsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYWlzZSBUeCBSYXRlPSVkIiwgc3VjY2Vzc1JhdGUpOworCisgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBNYXJ2ZWxsCisgICAgICAgICAgICAgICAgaWYoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTUpICYmIChzdWNjZXNzUmF0ZSA+IDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBZ2dQa3ROdW0oZGV2LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZSA9IHN1Y2Nlc3NSYXRlOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICh1OF90KWk7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgPSByY0NlbGwtPnR4Q291bnQgPSAwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+bGFzdHR4Q291bnQgPSAwOworICAgICAgICAgICAgICAgIHJjQ2VsbC0+bGFzdFRpbWUgID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgICAgICB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsUnhSc3NpRXZlbnQgICAgICAgKi8KKy8qICAgICAgUnggUlNTSSBldmVudC4gQ2FsY3VsYXRlIFJTU0kgbW92aW5nIGF2ZXJhZ2UsIGFjY2VsYXJhdGUgICAgICAgICovCisvKiAgICAgIHJhdGUgcHJvYmluZyBpZiBSU1NJIHZhcmlhdGlvbiBvdmVyIHRocmVzaG9sZC4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJjQ2VsbCA6IHJhdGUgY29udHJvbCBjZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWNjZXNzUmF0ZSA6IHN1Y2Nlc3MgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4yICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlJhdGVDdHJsUnhSc3NpRXZlbnQoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHUxNl90IHJ4UnNzaSkKK3sKKyAgICAvKiBpZiBkZWx0YShyY0NlbGwtPnJ4UnNzaSwgcnhSc3NpKSA+IFpNX1JBVEVfQ1RSTF9SU1NJX1ZBUklBVElPTiAqLworICAgIGlmICgocmNDZWxsLT5yeFJzc2kgLSByeFJzc2kpID4gWk1fUkFURV9DVFJMX1JTU0lfVkFSSUFUSU9OKQorICAgIHsKKyAgICAgICAgLyogQWNjZWxlcmF0ZSByYXRlIHByb2JpbmcgdmlhIGRlY3JlYWluZyByY0NlbGwtPnByb2JpbmdUaW1lICovCisgICAgICAgIHJjQ2VsbC0+cHJvYmluZ1RpbWUgLT0gWk1fUkFURV9DVFJMX1BST0JJTkdfSU5URVJWQUxfTVMvWk1fTVNfUEVSX1RJQ0s7CisgICAgfQorCisgICAgLyogVXBkYXRlIFJTU0kgbW92aW5nIGF2ZXJhZ2UgKi8KKyAgICByY0NlbGwtPnJ4UnNzaSA9ICgoKHJjQ2VsbC0+cnhSc3NpKjcpICsgcnhSc3NpKSs0KSA+PiAzOworICAgIHJldHVybjsKK30KKworCisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCit1OF90IEhpZ2hlclJhdGUodThfdCBSYXRlKSB7CisgICAgaWYgKFJhdGUgPCAyOCkgUmF0ZSsrOyAvLzI4PU1DUzE1U0csIDI3PU1DUzE1LCAyNj1NQ1MxNCwgMjU9TUNTMTMKKyAgICBpZiAoUmF0ZSA+IDI4KSBSYXRlID0gMjg7CisgICAgd2hpbGUgKChSYXRlID49IDIwKSAmJiAoUmF0ZSA8PSAyMykpIHsKKyAgICAgICAgUmF0ZSArKzsKKyAgICB9CisgICAgcmV0dXJuIFJhdGU7Cit9CisKK3U4X3QgTG93ZXJSYXRlKHU4X3QgUmF0ZSkgeworICAgIGlmIChSYXRlID4gMSkgUmF0ZS0tOworICAgIHdoaWxlICgoUmF0ZSA+PSAyMCkgJiYgKFJhdGUgPD0gMjMpKSB7CisgICAgICAgIFJhdGUgLS07CisgICAgfQorICAgIHJldHVybiBSYXRlOworfQorCit1OF90IFJhdGVNYXBUb1JhdGVJbmRleCh1OF90IFJhdGUsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKSB7CisgICAgdThfdCBpOworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKFJhdGUgPT0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlJhdGVDdHJsQWdnclN0YSh6ZGV2X3QqIGRldikgeworICAgIHU4X3QgUmF0ZUluZGV4LCBSYXRlOworICAgIHU4X3QgSFJhdGU7CisgICAgdThfdCBMUmF0ZTsKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVSwgUmF0ZUN0cmxCQUZhaWw7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgUmF0ZUluZGV4ID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLmN1cnJlbnRSYXRlSW5kZXg7CisgICAgUmF0ZSA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5vcGVyYXRpb25SYXRlU2V0W1JhdGVJbmRleF07CisKKyAgICBUeE1QRFVbUmF0ZV0gPSAoVHhNUERVW1JhdGVdIC8gNSkgKyAod2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVSAqIDQgLyA1KTsKKyAgICBCQUZhaWxbUmF0ZV0gPSAoQkFGYWlsW1JhdGVdIC8gNSkgKyAod2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCAqIDQgLyA1KTsKKyAgICBSYXRlQ3RybFR4TVBEVSA9IHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFU7CisgICAgUmF0ZUN0cmxCQUZhaWwgPSB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsOworICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgPSAwOworICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxCQUZhaWwgPSAwOworICAgIGlmIChUeE1QRFVbUmF0ZV0gPiAwKSB7CisgICAgICAgIEJBUEVSW1JhdGVdID0gQkFGYWlsW1JhdGVdICogMTAwMCAvIFR4TVBEVVtSYXRlXTsgLy9QRVIqMTAwMAorICAgICAgICBCQVBFUltSYXRlXSA9IChCQVBFUltSYXRlXT4wKT8gQkFQRVJbUmF0ZV06MTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIUmF0ZSA9IEhpZ2hlclJhdGUoUmF0ZSk7CisgICAgTFJhdGUgPSBMb3dlclJhdGUoUmF0ZSk7CisgICAgaWYgKEJBUEVSW1JhdGVdPjIwMCkgeworICAgICAgICBpZiAoKFJhdGVDdHJsVHhNUERVID4gMTAwKSAmJiAoQkFQRVJbUmF0ZV08MzAwKSAmJiAoSFJhdGUgIT0gUmF0ZSkgJiYgQkFQRVJbSFJhdGVdICYmCisgICAgICAgICAgICAoQkFQRVJbSFJhdGVdIDwgQkFQRVJbUmF0ZV0gKyBCQURpZmZbUmF0ZV0pKSB7CisgICAgICAgICAgICBSYXRlID0gSFJhdGU7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYXRlIGltcHJvdmVkIHRvICVkIiwgUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBSYXRlID0gTFJhdGU7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJSYXRlIGRlY3JlYXNlZCB0byAlZCIsIFJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEJBUEVSW1JhdGVdICYmIEJBUEVSW1JhdGVdPDEwMCkgeworICAgICAgICBpZiAoUmF0ZUN0cmxUeE1QRFUgPiAxMDApIHsKKyAgICAgICAgICAgIFJhdGUgPSBIUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgaW1wcm92ZWQgdG8gJWQiLCBSYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGUgPSBSYXRlOworICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZUluZGV4ID0gUmF0ZU1hcFRvUmF0ZUluZGV4KFJhdGUsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDExZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUkFURUNUUkxfSAorI2RlZmluZSBfUkFURUNUUkxfSAorCisjZGVmaW5lIFpNX1JBVEVfQ1RSTF9QUk9CSU5HX0lOVEVSVkFMX01TICAgIDEwMDAgLy8xMDAwbXMKKyNkZWZpbmUgWk1fUkFURV9DVFJMX01JTl9QUk9CSU5HX1BBQ0tFVCAgICAgOAorCisjZGVmaW5lIFpNX01JTl9SQVRFX0ZBSUxfQ09VTlQgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgWk1fUkFURV9QUk9CSU5HX1RIUkVTSE9MRCAgICAgICAgICAgMTUgIC8vNiUKKyNkZWZpbmUgWk1fUkFURV9TVUNDRVNTX1BST0JJTkcgICAgICAgICAgICAgMTAKKworI2RlZmluZSBaTV9SQVRFX0NUUkxfUlNTSV9WQVJJQVRJT04gICAgICAgICA1ICAvL1RCRAorCitleHRlcm4gY29uc3QgdTMyX3QgemNSYXRlVG9QaHlDdHJsW107CisKK2V4dGVybiB2b2lkIHpmUmF0ZUN0cmxJbml0Q2VsbCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgdHlwZSwgdThfdCBnQmFuZCwgdThfdCBTRzQwKTsKK2V4dGVybiB1MTZfdCB6ZlJhdGVDdHJsR2V0VHhSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QqIHByb2JpbmcpOworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybFR4RmFpbEV2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBhZ2dSYXRlLCB1MzJfdCByZXRyeVJhdGUpOworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBzdWNjZXNzUmF0ZSk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsQWdnclN0YSh6ZGV2X3QqIGRldik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzYzMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oCkBAIC0wLDAgKzEsMTMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1NUUlVDVF9ICisjZGVmaW5lIF9TVFJVQ1RfSAorCisjaW5jbHVkZSAiLi4vb2FsX21hcmMuaCIKKworI2RlZmluZSBaTV9TV19MT09QX0JBQ0sgICAgICAgICAgICAgICAgICAgICAwIC8qIDE9PmVuYWJsZSwgMD0+ZGlzYWJsZSAqLworI2RlZmluZSBaTV9QQ0lfTE9PUF9CQUNLICAgICAgICAgICAgICAgICAgICAwIC8qIDE9PmVuYWJsZSwgMD0+ZGlzYWJsZSAqLworI2RlZmluZSBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OICAgICAwCisKKyNkZWZpbmUgWk1fUlhfRlJBTUVfU0laRSAgICAgICAgICAgICAgIDE2MDAKKworZXh0ZXJuIGNvbnN0IHU4X3QgemcxMWJSYXRlVGJsWzRdOworZXh0ZXJuIGNvbnN0IHU4X3QgemcxMWdSYXRlVGJsWzhdOworCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX01BSk9SX1ZFUlNJT04gICAgICAgIDEKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfTUlOT1JfVkVSU0lPTiAgICAgICAgMQorI2RlZmluZSBaTV9EUklWRVJfQ09SRV9CUkFOQ0hfTUFKT1JfVkVSU0lPTiAzCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX0JSQU5DSF9NSU5PUl9WRVJTSU9OIDM5CisKKyNpZm5kZWYgWk1fVlRYUV9TSVpFCisjZGVmaW5lIFpNX1ZUWFFfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgLy8yXk4KKyNlbmRpZgorCisjZGVmaW5lIFpNX1ZUWFFfU0laRV9NQVNLICAgICAgICAgICAgICAgICAgIChaTV9WVFhRX1NJWkUtMSkKKyNkZWZpbmUgWk1fVk1NUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOCAvLzJeTgorI2RlZmluZSBaTV9WTU1RX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAgICAoWk1fVk1NUV9TSVpFLTEpCisKKyNpbmNsdWRlICJjYWdnLmgiCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fUkFURV9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAgMzIKKworI2RlZmluZSBaTV9NQVhfQlVGX0RJU0NSRVRFX05VTUJFUiAgICAgICAgICA1CisKKworCisKKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElCU1MgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICAgICA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQklUIG1hcHBpbmcgcmVsYXRlZCBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBaTV9CSVRfMCAgICAgICAweDEKKyNkZWZpbmUgWk1fQklUXzEgICAgICAgMHgyCisjZGVmaW5lIFpNX0JJVF8yICAgICAgIDB4NAorI2RlZmluZSBaTV9CSVRfMyAgICAgICAweDgKKyNkZWZpbmUgWk1fQklUXzQgICAgICAgMHgxMAorI2RlZmluZSBaTV9CSVRfNSAgICAgICAweDIwCisjZGVmaW5lIFpNX0JJVF82ICAgICAgIDB4NDAKKyNkZWZpbmUgWk1fQklUXzcgICAgICAgMHg4MAorI2RlZmluZSBaTV9CSVRfOCAgICAgICAweDEwMAorI2RlZmluZSBaTV9CSVRfOSAgICAgICAweDIwMAorI2RlZmluZSBaTV9CSVRfMTAgICAgICAweDQwMAorI2RlZmluZSBaTV9CSVRfMTEgICAgICAweDgwMAorI2RlZmluZSBaTV9CSVRfMTIgICAgICAweDEwMDAKKyNkZWZpbmUgWk1fQklUXzEzICAgICAgMHgyMDAwCisjZGVmaW5lIFpNX0JJVF8xNCAgICAgIDB4NDAwMAorI2RlZmluZSBaTV9CSVRfMTUgICAgICAweDgwMDAKKyNkZWZpbmUgWk1fQklUXzE2ICAgICAgMHgxMDAwMAorI2RlZmluZSBaTV9CSVRfMTcgICAgICAweDIwMDAwCisjZGVmaW5lIFpNX0JJVF8xOCAgICAgIDB4NDAwMDAKKyNkZWZpbmUgWk1fQklUXzE5ICAgICAgMHg4MDAwMAorI2RlZmluZSBaTV9CSVRfMjAgICAgICAweDEwMDAwMAorI2RlZmluZSBaTV9CSVRfMjEgICAgICAweDIwMDAwMAorI2RlZmluZSBaTV9CSVRfMjIgICAgICAweDQwMDAwMAorI2RlZmluZSBaTV9CSVRfMjMgICAgICAweDgwMDAwMAorI2RlZmluZSBaTV9CSVRfMjQgICAgICAweDEwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI1ICAgICAgMHgyMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNiAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjcgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI4ICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjkgICAgICAweDIwMDAwMDAwICAgLy9XUEEgc3VwcG9ydAorI2RlZmluZSBaTV9CSVRfMzAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8zMSAgICAgIDB4ODAwMDAwMDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1BQyBhZGRyZXNzIHJlbGF0ZWQgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX01BQ19CWVRFX1RPX1dPUkQobWFjYiwgbWFjdykgICBtYWN3WzBdID0gbWFjYlswXSArIChtYWNiWzFdIDw8IDgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWN3WzFdID0gbWFjYlsyXSArIChtYWNiWzNdIDw8IDgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWN3WzJdID0gbWFjYls0XSArIChtYWNiWzVdIDw8IDgpOworCisjZGVmaW5lIFpNX01BQ19XT1JEX1RPX0JZVEUobWFjdywgbWFjYikgICBtYWNiWzBdID0gKHU4X3QpIChtYWN3WzBdICYgMHhmZik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbMV0gPSAodThfdCkgKG1hY3dbMF0gPj4gOCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYlsyXSA9ICh1OF90KSAobWFjd1sxXSAmIDB4ZmYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzNdID0gKHU4X3QpIChtYWN3WzFdID4+IDgpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbNF0gPSAodThfdCkgKG1hY3dbMl0gJiAweGZmKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYls1XSA9ICh1OF90KSAobWFjd1syXSA+PiA4KTsKKworI2RlZmluZSBaTV9NQUNfMChtYWN3KSAgICgodThfdCkobWFjd1swXSAmIDB4ZmYpKQorI2RlZmluZSBaTV9NQUNfMShtYWN3KSAgICgodThfdCkobWFjd1swXSA+PiA4KSkKKyNkZWZpbmUgWk1fTUFDXzIobWFjdykgICAoKHU4X3QpKG1hY3dbMV0gJiAweGZmKSkKKyNkZWZpbmUgWk1fTUFDXzMobWFjdykgICAoKHU4X3QpKG1hY3dbMV0gPj4gOCkpCisjZGVmaW5lIFpNX01BQ180KG1hY3cpICAgKCh1OF90KShtYWN3WzJdICYgMHhmZikpCisjZGVmaW5lIFpNX01BQ181KG1hY3cpICAgKCh1OF90KShtYWN3WzJdID4+IDgpKQorCisjZGVmaW5lIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QobWFjKSAobWFjWzBdICYgMHgwMSkKKyNkZWZpbmUgWk1fSVNfTVVMVElDQVNUKG1hYykgKChtYWNbMF0gJiAweDAxKSAmJiAoKCh1OF90KW1hY1swXSkgIT0gMHhGRikpCisKKyNkZWZpbmUgWk1fTUFDX0VRVUFMKG1hYzEsIG1hYzIpICAgKChtYWMxWzBdPT1tYWMyWzBdKSYmKG1hYzFbMV09PW1hYzJbMV0pJiYobWFjMVsyXT09bWFjMlsyXSkpCisjZGVmaW5lIFpNX01BQ19OT1RfRVFVQUwobWFjMSwgbWFjMikgICAoKG1hYzFbMF0hPW1hYzJbMF0pfHwobWFjMVsxXSE9bWFjMlsxXSl8fChtYWMxWzJdIT1tYWMyWzJdKSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUFDIGFkZHJlc3MgcmVsYXRlZCBtYWMncm9zIChlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpNX0JZVEVfVE9fV09SRChBLCBCKSAgICgoQTw8OCkrQikKKyNkZWZpbmUgWk1fUk9MMzIoIEEsIG4gKSBcCisgICAgICAgICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCisjZGVmaW5lIFpNX1JPUjMyKCBBLCBuICkgWk1fUk9MMzIoIChBKSwgMzItKG4pICkKKyNkZWZpbmUgWk1fTE84KHYxNikgICgodThfdCkoKHYxNikgJiAweEZGKSkKKyNkZWZpbmUgWk1fSEk4KHYxNikgICgodThfdCkoKCh2MTYpPj44KSYweEZGKSkKKworI2lmZGVmIFpNX0VOQUJMRV9CVUZGRVJfVFJBQ0UKK2V4dGVybiB2b2lkIHpmd0J1ZlRyYWNlKHpkZXZfdCogZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqZnVuY3Rpb25OYW1lKTsKKyNkZWZpbmUgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKSAgICAgICB6ZndCdWZUcmFjZShkZXYsIGJ1ZiwgX19GVU5DVElPTl9fKTsKKyNlbHNlCisjZGVmaW5lIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKyNlbmRpZgorCisvKiBub3RpZmljYXRpb24gZXZlbnRzIHRvIGhlYXJ0IGJlYXQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgWk1fQlNTSURfTElTVF9TQ0FOICAgICAgICAgMHgwMQorCisvKiBDQU0gbW9kZSAqLworI2RlZmluZSBaTV9DQU1fQVAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBaTV9DQU1fU1RBICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBaTV9DQU1fSE9TVCAgICAgICAgICAgICAgICAgICAgIDB4NAorCisvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmb3IgYWRhcHRlciAqLworI2RlZmluZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCAgICAgICAgICAgMQorI2RlZmluZSBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyAgICAgICAgICAgMgorI2RlZmluZSBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEICAgICAgICAgICAgMworCisvKiBFdmVudCBkZWZpbml0aW9ucyBmb3IgIGZpbml0ZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9CR19TQ0FOICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTl9FVkVOVF9USU1FT1VUX1JFQ09OTkVDVCAgICAgICAgMHgwMDAyCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfSU5JVF9TQ0FOICAgICAgICAweDAwMDMKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BVVRIICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0FTU08gICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQVVUT19TQ0FOICAgICAgICAweDAwMDYKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9NSUNfRkFJTCAgICAgICAgIDB4MDAwNworI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0NIRUNLX0FQICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFpNX0VWRU5UX0NPTk5FQ1QgICAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgWk1fRVZFTlRfSU5JVF9TQ0FOICAgICAgICAgICAgICAgIDB4MDAwYQorI2RlZmluZSBaTV9FVkVOVF9TQ0FOICAgICAgICAgICAgICAgICAgICAgMHgwMDBiCisjZGVmaW5lIFpNX0VWRU5UX0JHX1NDQU4gICAgICAgICAgICAgICAgICAweDAwMGMKKyNkZWZpbmUgWk1fRVZFTlRfRElTQ09OTkVDVCAgICAgICAgICAgICAgIDB4MDAwZAorI2RlZmluZSBaTV9FVkVOVF9XUEFfTUlDX0ZBSUwgICAgICAgICAgICAgMHgwMDBlCisjZGVmaW5lIFpNX0VWRU5UX0FQX0FMSVZFICAgICAgICAgICAgICAgICAweDAwMGYKKyNkZWZpbmUgWk1fRVZFTlRfQ0hBTkdFX1RPX0FQICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBaTV9FVkVOVF9DSEFOR0VfVE9fU1RBICAgICAgICAgICAgMHgwMDExCisjZGVmaW5lIFpNX0VWRU5UX0lETEUgICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgWk1fRVZFTlRfQVVUSCAgICAgICAgICAgICAgICAgICAgIDB4MDAxMworI2RlZmluZSBaTV9FVkVOVF9BU1NPX1JTUCAgICAgICAgICAgICAgICAgMHgwMDE0CisjZGVmaW5lIFpNX0VWRU5UX1dQQV9QS19PSyAgICAgICAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgWk1fRVZFTlRfV1BBX0dLX09LICAgICAgICAgICAgICAgIDB4MDAxNgorI2RlZmluZSBaTV9FVkVOVF9SQ1ZfQkVBQ09OICAgICAgICAgICAgICAgMHgwMDE3CisjZGVmaW5lIFpNX0VWRU5UX1JDVl9QUk9CRV9SU1AgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgWk1fRVZFTlRfU0VORF9EQVRBICAgICAgICAgICAgICAgIDB4MDAxOQorI2RlZmluZSBaTV9FVkVOVF9BVVRPX1NDQU4gICAgICAgICAgICAgICAgMHgwMDFhCisjZGVmaW5lIFpNX0VWRU5UX01JQ19GQUlMMSAgICAgICAgICAgICAgICAweDAwMWQKKyNkZWZpbmUgWk1fRVZFTlRfTUlDX0ZBSUwyICAgICAgICAgICAgICAgIDB4MDAxZQorI2RlZmluZSBaTV9FVkVOVF9JQlNTX01PTklUT1IgICAgICAgICAgICAgMHgwMDFmCisjZGVmaW5lIFpNX0VWRU5UX0lOX1NDQU4gICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgWk1fRVZFTlRfQ01fVElNRVIgICAgICAgICAgICAgICAgIDB4MDAyMQorI2RlZmluZSBaTV9FVkVOVF9DTV9ESVNDT05ORUNUICAgICAgICAgICAgMHgwMDIyCisjZGVmaW5lIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSICAgICAgICAgICAweDAwMjMKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BRERCQSAgICAgICAgICAgIDB4MDAyNAorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX1BFUkZPUk1BTkNFICAgICAgMHgwMDI1CisjZGVmaW5lIFpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUJICAweDAwMjYKKyNkZWZpbmUgWk1fRVZFTlRfTk9ORSAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisvKiBBY3Rpb25zIGFmdGVyIGNhbGwgZmluaXRlIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgWk1fQUNUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBaTV9BQ1RJT05fUVVFVUVfREFUQSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFpNX0FDVElPTl9EUk9QX0RBVEEgICAgICAgICAgICAgICAweDAwMDIKKworLyogVGltZXJzIGZvciBmaW5pdGUgc3RhdGUgbWFjaGluZSAqLworI2RlZmluZSBaTV9USUNLX1pFUk8gICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9USUNLX0lOSVRfU0NBTl9FTkQgICAgICAgICAgICAgOAorI2RlZmluZSBaTV9USUNLX05FWFRfQkdfU0NBTiAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fVElDS19CR19TQ0FOX0VORCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fVElDS19BVVRIX1RJTUVPVVQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVElDS19BU1NPX1RJTUVPVVQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVElDS19BVVRPX1NDQU4gICAgICAgICAgICAgICAgIDMwMAorI2RlZmluZSBaTV9USUNLX01JQ19GQUlMX1RJTUVPVVQgICAgICAgICAgNjAwMAorI2RlZmluZSBaTV9USUNLX0NIRUNLX0FQMSAgICAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX1RJQ0tfQ0hFQ0tfQVAyICAgICAgICAgICAgICAgICAzNTAKKyNkZWZpbmUgWk1fVElDS19DSEVDS19BUDMgICAgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBaTV9USUNLX0lCU1NfTU9OSVRPUiAgICAgICAgICAgICAgMTYwCisjZGVmaW5lIFpNX1RJQ0tfSU5fU0NBTiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQ01fVElNRU9VVCAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgWk1fVElDS19DTV9CTE9DS19USU1FT1VUICAgICAgICAgIDYwMDAKKworLyogRml4IGJ1ZyMzMzMzOCBDb3VudGVyIE1lYXN1cmUgSXNzdXIgKi8KKyNpZmRlZiBORElTX0NNX0ZPUl9YUAorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUICAgICAgICAyMTYwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQgICAgIDcyCisjZGVmaW5lIFpNX1RJQ0tfQ01fQkxPQ0tfVElNRU9VVF9PRkZTRVQgIDIxNjAKKyNlbHNlCisjZGVmaW5lIFpNX1RJQ0tfQ01fVElNRU9VVF9PRkZTRVQgICAgICAgIDAKKyNkZWZpbmUgWk1fVElDS19DTV9ESVNDT05ORUNUX09GRlNFVCAgICAgMAorI2RlZmluZSBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVRfT0ZGU0VUICAwCisjZW5kaWYKKworI2RlZmluZSBaTV9USU1FX0FDVElWRV9TQ0FOICAgICAgICAgICAgICAgMzAgLy9tcworI2RlZmluZSBaTV9USU1FX1BBU1NJVkVfU0NBTiAgICAgICAgICAgICAgMTEwIC8vbXMKKworLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgZm9yIEJTUyBjb25uZWN0ICovCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX05PTkUgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSAgICAyCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMiAgICAzCisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSAgICAgICA0CisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX1NTSURfTk9UX0ZPVU5EICA1CisjZGVmaW5lIFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEICA2CisKKy8qIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZvciBXUEEgaGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9JTklUICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9QS19PSyAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fU1RBX1dQQV9TVEFURV9HS19PSyAgICAgICAgICAgIDIKKworLyogdmFyaW91cyB0aW1lcnMgKi8KKyNkZWZpbmUgWk1fSU5URVJWQUxfQ09OTkVDVF9USU1FT1VUICAgICAgICAgIDIwICAgLyogMjAwIG1pbGlzZWNvbmQgKi8KKworLyogSUJTUyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfTE9TVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfQUxJVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9JQlNTX1BBUlRORVJfQ0hFQ0sgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFpNX0JDTUNfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgIDE2IC8qIE11c3QgYmUgMl5OICovCisjZGVmaW5lIFpNX1VOSV9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgIDE2IC8qIE11c3QgYmUgMl5OICovCisKKyNkZWZpbmUgWk1fTUFYX0RFRlJBR19FTlRSSUVTICAgICAgICAgICAgICAgNCAgLyogMl5OICovCisjZGVmaW5lIFpNX0RFRlJBR19BR0lOR19USU1FX1NFQyAgICAgICAgICAgIDUgIC8qIDUgc2Vjb25kcyAqLworCisjZGVmaW5lIFpNX01BWF9XUEFJRV9TSVpFICAgICAgICAgICAgICAgICAgIDEyOAorLyogV0VQIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWk1fVVNFUl9LRVlfREVGQVVMVCAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fVVNFUl9LRVlfUEsgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBLZXkgKi8KKyNkZWZpbmUgWk1fVVNFUl9LRVlfR0sgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAvKiBHcm91cCBLZXkgKi8KKy8qIEFQIFdMQU4gVHlwZSAqLworI2RlZmluZSBaTV9XTEFOX1RZUEVfUFVSRV9CICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fVFlQRV9QVVJFX0cgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fV0xBTl9UWVBFX01JWEVEICAgICAgICAgICAgICAgICAgMAorCisvKiBIQUwgU3RhdGUgKi8KKyNkZWZpbmUgWk1fSEFMX1NUQVRFX0lOSVQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9IQUxfU1RBVEVfUlVOTklORyAgICAgICAgICAgICAgICAxCisKKy8qIEFQIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgWk1fQWxsMTFOX0FQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9YUl9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX1N1cGVyR19BUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKworLyogTVBEVSBEZW5zaXR5ICovCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV9OT05FICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFfOFVTICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMV80VVMgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xXzJVUyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFVUyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMlVTICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV80VVMgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzhVUyAgICAgICAgICAgICAgICAgNworCisvKiBTb2Z0d2FyZSBFbmNyeXB0aW9uICovCisjZGVmaW5lIFpNX1NXX1RLSVBfRU5DUllfRU4gICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9TV19US0lQX0RFQ1JZX0VOICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fU1dfV0VQX0VOQ1JZX0VOICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFpNX1NXX1dFUF9ERUNSWV9FTiAgICAgICAgICAgICAgICAgMHgwOAorCisvKiBEZWZhdWx0IFN1cHBvcnQgUmF0ZSAqLworI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPICAgICAgIDB4MAorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9ESVNDT05ORUNUIDB4MQorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgIDB4MgorI2RlZmluZSBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0FHICAgIDB4MworCisvKiBzZWN1cml0eSByZWxhdGVkIGRlZmluaXRpb25zICovCitzdHJ1Y3QgenNUa2lwU2VlZAoreworICAgIHU4X3QgICB0a1szMl07ICAgICAvKiBrZXkgKi8KKyAgICB1OF90ICAgdGFbNl07CisgICAgdTE2X3QgIHR0YWtbNV07CisgICAgdTE2X3QgIHBwa1s2XTsKKyAgICB1MTZfdCAgaXYxNixpdjE2dG1wOworICAgIHUzMl90ICBpdjMyLGl2MzJ0bXA7Cit9OworCitzdHJ1Y3QgenNNaWNWYXIKK3sKKyAgICB1MzJfdCAgazAsIGsxOyAgICAgICAgLy8gS2V5CisgICAgdTMyX3QgIGxlZnQsIHJpZ2h0OyAgIC8vIEN1cnJlbnQgc3RhdGUKKyAgICB1MzJfdCAgbTsgICAgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciAoc2luZ2xlIHdvcmQpCisgICAgdTE2X3QgIG5CeXRlczsgICAgICAgIC8vICMgYnl0ZXMgaW4gTQorfTsKKworc3RydWN0IHpzRGVmcmFnRW50cnkKK3sKKyAgICB1OF90ICAgIGZyYWdDb3VudDsKKyAgICB1OF90ICAgIGFkZHJbNl07CisgICAgdTE2X3QgICBzZXFOdW07CisgICAgemJ1Zl90KiBmcmFnbWVudFs4XTsKKyAgICB1MzJfdCAgIHRpY2s7Cit9OworCitzdHJ1Y3QgenNEZWZyYWdMaXN0Cit7CisgICAgc3RydWN0IHpzRGVmcmFnRW50cnkgICBkZWZyYWdFbnRyeVtaTV9NQVhfREVGUkFHX0VOVFJJRVNdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgcmVwbGFjZU51bTsKK307CisKKyNkZWZpbmUgWk1fTUFYX09QUE9TSVRFX0NPVU5UICAgICAgMTYKKyNkZWZpbmUgWk1fTUFYX1RYX1NBTVBMRVMgICAgICAgICAgMTUKKyNkZWZpbmUgWk1fVFhfUkFURV9ET1dOX0NSSVRFUklBICAgODAKKyNkZWZpbmUgWk1fVFhfUkFURV9VUF9DUklURVJJQSAgICAyMDAKKworCisjZGVmaW5lIFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFIDIKK3N0cnVjdCB6c1NzaWRMaXN0Cit7CisgICAgdThfdCAgICAgICAgICAgIHNzaWRbMzJdOworICAgIHU4X3QgICAgICAgICAgICBzc2lkTGVuOworfTsKKworc3RydWN0IHpzV3JhcHBlclNldHRpbmcKK3sKKyAgICB1OF90ICAgICAgICAgICAgYkRlc2lyZWRCc3NpZDsKKyAgICB1OF90ICAgICAgICAgICAgZGVzaXJlZEJzc2lkWzZdOworICAgIHUxNl90ICAgICAgICAgICBic3NpZFszXTsKKyAgICB1OF90ICAgICAgICAgICAgc3NpZFszMl07CisgICAgdThfdCAgICAgICAgICAgIHNzaWRMZW47CisgICAgdThfdCAgICAgICAgICAgIGF1dGhNb2RlOworICAgIHU4X3QgICAgICAgICAgICB3ZXBTdGF0dXM7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgd2xhbk1vZGU7CisgICAgdTE2X3QgICAgICAgICAgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgICAgICAgICAgYmVhY29uSW50ZXJ2YWw7CisgICAgdThfdCAgICAgICAgICAgIGR0aW07CisgICAgdThfdCAgICAgICAgICAgIHByZWFtYmxlVHlwZTsKKyAgICB1MTZfdCAgICAgICAgICAgYXRpbVdpbmRvdzsKKworICAgIHN0cnVjdCB6c1NzaWRMaXN0IHByb2JpbmdTc2lkTGlzdFtaTV9NQVhfUFJPQkVfSElEREVOX1NTSURfU0laRV07CisKKyAgICB1OF90ICAgICAgICAgICAgZHJvcFVuZW5jcnlwdGVkUGt0czsKKyAgICB1OF90ICAgICAgICAgICAgaWJzc0pvaW5Pbmx5OworICAgIHUzMl90ICAgICAgICAgICBhZGhvY01vZGU7CisgICAgdThfdCAgICAgICAgICAgIGNvdW50cnlJc29OYW1lWzRdOworICAgIHUxNl90ICAgICAgICAgICBhdXRvU2V0RnJlcXVlbmN5OworCisgICAgLyogQVAgKi8KKyAgICB1OF90ICAgICAgICAgICAgYlJhdGVCYXNpYzsKKyAgICB1OF90ICAgICAgICAgICAgZ1JhdGVCYXNpYzsKKyAgICB1MzJfdCAgICAgICAgICAgblJhdGVCYXNpYzsKKyAgICB1OF90ICAgICAgICAgICAgYmdNb2RlOworCisgICAgLyogQ29tbW9uICovCisgICAgdThfdCAgICAgICAgICAgIHN0YVdtZUVuYWJsZWQ7CisgICAgdThfdCAgICAgICAgICAgIHN0YVdtZVFvc0luZm87CisgICAgdThfdCAgICAgICAgICAgIGFwV21lRW5hYmxlZDsKKworCisgICAgLyogcmF0ZSBpbmZvcm1hdGlvbjogYWRkZWQgaW4gdGhlIGZ1dHVyZSAqLworfTsKKworc3RydWN0IHpzV3JhcHBlckZlYXR1cmVDdHJsCit7CisgICAgdThfdCAgICAgICAgICAgYklic3NHTW9kZTsKK307CisKKyNkZWZpbmUgIFpNX01BWF9QU19TVEEgICAgICAgICAgICAxNgorI2RlZmluZSAgWk1fUFNfUVVFVUVfU0laRSAgICAgICAgIDMyCisKK3N0cnVjdCB6c1N0YVBTRW50aXR5Cit7CisgICAgdThfdCAgICAgICAgICAgYlVzZWQ7CisgICAgdThfdCAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICB1OF90ICAgICAgICAgICBiRGF0YVF1ZXVlZDsKK307CisKK3N0cnVjdCB6c1N0YVBTTGlzdAoreworICAgIHU4X3QgICAgICAgICAgIGNvdW50OworICAgIHN0cnVjdCB6c1N0YVBTRW50aXR5ICAgIGVudGl0eVtaTV9NQVhfUFNfU1RBXTsKK307CisKKyNkZWZpbmUgWk1fTUFYX1RJTUVSX0NPVU5UICAgMzIKKworLyogZG91YmxlIGxpbmtlZCBsaXN0ICovCitzdHJ1Y3QgenNUaW1lckVudHJ5Cit7CisgICAgdTE2X3QgICBldmVudDsKKyAgICB1MzJfdCAgIHRpbWVyOworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnByZTsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpuZXh0OworfTsKKworc3RydWN0IHpzVGltZXJMaXN0Cit7CisgICAgdThfdCAgIGZyZWVDb3VudDsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5IGxpc3RbWk1fTUFYX1RJTUVSX0NPVU5UXTsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpoZWFkOworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnRhaWw7Cit9OworCisvKiBNdWx0aWNhc3QgbGlzdCAqLworI2RlZmluZSBaTV9NQVhfTVVMVElDQVNUX0xJU1RfU0laRSAgICAgNjQKKworc3RydWN0IHpzTXVsdGljYXN0QWRkcgoreworICAgIHU4X3QgYWRkcls2XTsKK307CisKK3N0cnVjdCB6c011bHRpY2FzdExpc3QKK3sKKyAgICB1OF90ICAgc2l6ZTsKKyAgICBzdHJ1Y3QgenNNdWx0aWNhc3RBZGRyIG1hY0FkZHJbWk1fTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkVdOworfTsKKworZW51bSBpZWVlODAyMTFfY3dtX21vZGUgeworICAgIENXTV9NT0RFMjAsCisgICAgQ1dNX01PREUyMDQwLAorICAgIENXTV9NT0RFNDAsCisgICAgQ1dNX01PREVNQVgKKworfTsKKworZW51bSBpZWVlODAyMTFfY3dtX2V4dHByb3RzcGFjaW5nIHsKKyAgICBDV01fRVhUUFJPVFNQQUNJTkcyMCwKKyAgICBDV01fRVhUUFJPVFNQQUNJTkcyNSwKKyAgICBDV01fRVhUUFJPVFNQQUNJTkdNQVgKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV93aWR0aCB7CisgICAgQ1dNX1dJRFRIMjAsCisgICAgQ1dNX1dJRFRINDAKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9leHRwcm90bW9kZSB7CisgICAgQ1dNX0VYVFBST1ROT05FLCAgLyogbm8gcHJvdGVjdGlvbiAqLworICAgIENXTV9FWFRQUk9UQ1RTT05MWSwgICAvKiBDVFMgdG8gc2VsZiAqLworICAgIENXTV9FWFRQUk9UUlRTQ1RTLCAgICAvKiBSVFMtQ1RTICovCisgICAgQ1dNX0VYVFBST1RNQVgKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3dtIHsKKworICAgIC8qIENvbmZpZ3VyYXRpb24gKi8KKyAgICBlbnVtIGllZWU4MDIxMV9jd21fbW9kZSAgICAgICAgIGN3X21vZGU7ICAgICAgICAgICAgLyogQ1dNIG1vZGUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2V4dG9mZnNldDsgICAgICAgLyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV9leHRwcm90bW9kZSAgY3dfZXh0cHJvdG1vZGU7ICAgICAvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgUHJvdGVjdGlvbiBNb2RlICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX2V4dHByb3RzcGFjaW5nIGN3X2V4dHByb3RzcGFjaW5nOy8qIENXTSBFeHRlbnNpb24gQ2hhbm5lbCBQcm90ZWN0aW9uIFNwYWNpbmcgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2VuYWJsZTsgICAgICAgICAgLyogQ1dNIFN0YXRlIE1hY2hpbmUgRW5hYmxlZCAqLworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dfZXh0YnVzeXRocmVzaG9sZDsvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKi8KKworICAgIC8qIFN0YXRlICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX3dpZHRoICAgICAgICBjd193aWR0aDsgICAgICAgICAgIC8qIENXTSBjaGFubmVsIHdpZHRoICovCit9OworCisKKy8qIEFQIDogU1RBIGRhdGFiYXNlIHN0cnVjdHVyZSAqLworc3RydWN0IHpzU3RhVGFibGUKK3sKKyAgICB1MzJfdCB0aW1lOyAgICAgLyogdGljayB0aW1lICovCisgICAgLy91MzJfdCBwaHlDdHJsOyAgIC8qIFR4IFBIWSBDVFJMICovCisgICAgdTE2X3QgYWRkclszXTsgIC8qIFNUQSBNQUMgYWRkcmVzcyAqLworICAgIHUxNl90IHN0YXRlOyAgICAvKiBhdXQvYXNvYyAqLworICAgIC8vdTE2X3QgcmV0cnk7ICAgIC8qIFJldHJ5IGNvdW50ICovCisgICAgc3RydWN0IHpzUmNDZWxsIHJjQ2VsbDsKKworICAgIHU4X3QgdmFsaWQ7ICAgICAvKiBWYWxpZCBmbGFnIDogMT0+dmFsaWQgKi8KKyAgICB1OF90IHBzTW9kZTsgICAgLyogU1RBIHBvd2VyIHNhdmluZyBtb2RlICovCisgICAgdThfdCBzdGFUeXBlOyAgIC8qIDA9PjExYiwgMT0+MTFnLCAyPT4xMW4gKi8KKyAgICB1OF90IHFvc1R5cGU7ICAgLyogMD0+TGVnYWN5LCAxPT5XTUUgKi8KKyAgICB1OF90IHFvc0luZm87ICAgLyogV01FIFFvUyBpbmZvICovCisgICAgdThfdCB2YXA7ICAgICAgIC8qIFZpcnR1YWwgQVAgSUQgKi8KKyAgICB1OF90IGVuY3J5TW9kZTsgLyogRW5jcnlwdGlvbiB0eXBlIGZvciB0aGlzIFNUQSAqLworICAgIHU4X3Qga2V5SWR4OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgdHhNaWNLZXk7CisgICAgc3RydWN0IHpzTWljVmFyICAgICByeE1pY0tleTsKKyAgICB1MTZfdCBpdjE2OworICAgIHUzMl90IGl2MzI7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBDRU5DICovCisgICAgdThfdCBjZW5jS2V5SWR4OworICAgIHUzMl90IHR4aXZbNF07CisgICAgdTMyX3Qgcnhpdls0XTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCit9OworCitzdHJ1Y3QgemRTdHJ1Y3RXZHMKK3sKKyAgICB1OF90ICAgIHdkc0JpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGJpdC1OIHRvIDEgdG8gZW5hYmxlIFdEUyAqLworICAgIHU4X3QgICAgZW5jcnlNb2RlW1pNX01BWF9XRFNfU1VQUE9SVF07ICAvKiBXRFMgZW5jcnlwdGlvbiBtb2RlICovCisgICAgdTE2X3QgICBtYWNBZGRyW1pNX01BWF9XRFNfU1VQUE9SVF1bM107IC8qIFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAqLworfTsKKworICAgIC8vIGh0Y2FwaW5mbyAxNmJpdHMKKyNkZWZpbmUgSFRDQVBfQWR2Q29kaW5nQ2FwICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQgICAgMHgwMDAyCisjZGVmaW5lIEhUQ0FQX0R5bmFtaWNTTVBTICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSFRDQVBfU01FbmFibGVkICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBIVENBUF9HcmVlbkZpZWxkICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhUQ0FQX1Nob3J0R0lmb3IyME1IeiAgICAgICAweDAwMjAKKyNkZWZpbmUgSFRDQVBfU2hvcnRHSWZvcjQwTUh6ICAgICAgIDB4MDA0MAorI2RlZmluZSBIVENBUF9UeFNUQkMgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEhUQ0FQX1J4T25lU3RyZWFtICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSFRDQVBfUnhUd29TdHJlYW0gICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBIVENBUF9SeFRocmVlU3RyZWFtICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEhUQ0FQX0RlbGF5ZWRCbG9ja0FDSyAgICAgICAweDA0MDAKKyNkZWZpbmUgSFRDQVBfTWF4QU1TRFVMZW5ndGggICAgICAgIDB4MDgwMAorI2RlZmluZSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IeiAgICAgMHgxMDAwCisjZGVmaW5lIEhUQ0FQX1BTTVBTdXAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSFRDQVBfU1RCQ0NvbnRyb2xGcmFtZVN1cCAgIDB4NDAwMAorI2RlZmluZSBIVENBUF9MU0lHVFhPUFByb3RlY3Rpb25TVVAgMHg4MDAwCisgICAgLy8gQW1wZHUgSFQgUGFyYW1ldGVyIEluZm8gOGJpdHMKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTEgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTIgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSFRDQVBfTWF4UnhBTVBEVTMgICAgICAgICAgIDB4MDMKKyAgICAvLyBQQ08gOGJpdHMKKyNkZWZpbmUgSFRDQVBfUENPICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTEgICAgIDB4MDIKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTIgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfVHJhbnNtaXNzaW9uVGltZTMgICAgIDB4MDYKKyAgICAvLyBNQ1MgRmVlZEJhY2sgOGJpdHMKKyNkZWZpbmUgSFRDQVBfUGx1c0hUQ1N1cHBvcnQgICAgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfUkRSZXNwb25kZXIgICAgICAgICAgIDB4MDgKKyAgICAvLyBUWCBCZWFtZm9ybWluZyAwIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1R4QkZDYXBhYmxlICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX1J4U3RhZ2dlcmVkU291bmRDYXAgICAweDAyCisjZGVmaW5lIEhUQ0FQX1R4U3RhZ2dlcmVkU291bmRDYXAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1J4WkxGQ2FwYWJsZSAgICAgICAgICAweDA4CisjZGVmaW5lIEhUQ0FQX1R4WkxGQ2FwYWJsZSAgICAgICAgICAweDEwCisjZGVmaW5lIEhUQ0FQX0ltcGxpY2l0VHhCRkNhcGFibGUgICAweDIwCisgICAgLy8gVHggQmVhbWZvcm1pbmcgMSA4Yml0cworI2RlZmluZSBIVENBUF9FeHBsaWNpdENTSVR4QkZDYXAgICAgMHgwMQorI2RlZmluZSBIVENBUF9FeHBVbmNvbXBTdGVlck1hdHJDYXAgMHgwMgorICAgIC8vIEFudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcyA4Yml0cworI2RlZmluZSBIVENBUF9BbnRlbm5hU2VsZWN0aW9uQ2FwICAgICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lUeEFTQ2FwICAgICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX0FudGVubmFJbmRGZWVUeEFTQ2FwICAgICAgMHgwNAorI2RlZmluZSBIVENBUF9FeHBsaWNpdENTSUZlZWRiYWNrQ2FwICAgIDB4MDgKKyNkZWZpbmUgSFRDQVBfQW50ZW5uYUluZEZlZWRiYWNrQ2FwICAgICAweDEwCisjZGVmaW5lIEhUQ0FQX1J4QVNDYXAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBIVENBUF9UeFNvdW5kUFBEVXNDYXAgICAgICAgICAgIDB4NDAKKworCisKK3N0cnVjdCB6c0hUQ2FwYWJpbGl0eQoreworICAgIHU4X3QgRWxlbWVudElEOworICAgIHU4X3QgTGVuZ3RoOworICAgIC8vIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHUxNl90IEh0Q2FwSW5mbzsKKyAgICB1OF90IEFNUERVUGFyYW07CisgICAgdThfdCBNQ1NTZXRbMTZdOyAgICAvLzE2IGJ5dGVzCisgICAgLy8gRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisgICAgdThfdCBQQ087CisgICAgdThfdCBNQ1NGZWVkQmFjazsKKworICAgIHU4X3QgVHhCRkNhcFs0XTsKKyAgICB1OF90IEFzZWxDYXA7Cit9OworCit1bmlvbiB6dUhUQ2FwYWJpbGl0eQoreworICAgIHN0cnVjdCB6c0hUQ2FwYWJpbGl0eSBEYXRhOworICAgIHU4X3QgQnl0ZVsyOF07Cit9OworCisgICAgLy9jaGFubmVsaW5mbyA4Yml0cworI2RlZmluZSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QWJvdmUgIDB4MDEKKyNkZWZpbmUgRXh0SHRDYXBfRXh0Q2hhbm5lbE9mZnNldEJlbG93ICAweDAzCisjZGVmaW5lIEV4dEh0Q2FwX1JlY29tVHhXaWR0aFNldCAgICAgICAgMHgwNAorI2RlZmluZSBFeHRIdENhcF9SSUZTTW9kZSAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRXh0SHRDYXBfQ29udHJvbEFjY2Vzc09ubHkgICAgICAweDEwCisgICAgLy9vcGVyYXRpbmdpbmZvIDE2Yml0cworI2RlZmluZSBFeHRIdENhcF9Ob25HRkRldmljZVByZXNlbnQgICAgIDB4MDAwNAorICAgIC8vYmVhY29uaW5mbyAxNmJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfRHVhbEJlYWNvbiAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgRXh0SHRDYXBfRHVhbFNUQkNQcm90ZWN0aW9uICAgICAweDAwODAKKyNkZWZpbmUgRXh0SHRDYXBfU2Vjb25kYXJ5QmVhY29uICAgICAgICAweDAxMDAKKyNkZWZpbmUgRXh0SHRDYXBfTFNJR1RYT1BQcm90ZWN0RnVsbFN1cCAweDAyMDAKKyNkZWZpbmUgRXh0SHRDYXBfUENPQWN0aXZlICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRXh0SHRDYXBfUENPUGhhc2UgICAgICAgICAgICAgICAweDA4MDAKKworCitzdHJ1Y3QgenNFeHRIVENhcGFiaWxpdHkKK3sKKyAgICB1OF90ICAgIEVsZW1lbnRJRDsKKyAgICB1OF90ICAgIExlbmd0aDsKKyAgICB1OF90ICAgIENvbnRyb2xDaGFubmVsOworICAgIHU4X3QgICAgQ2hhbm5lbEluZm87CisgICAgdTE2X3QgICBPcGVyYXRpbmdJbmZvOworICAgIHUxNl90ICAgQmVhY29uSW5mbzsKKyAgICAvLyBTdXBwb3J0ZWQgTUNTIFNldAorICAgIHU4X3QgICAgTUNTU2V0WzE2XTsKK307CisKK3VuaW9uIHp1RXh0SFRDYXBhYmlsaXR5Cit7CisgICAgc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5IERhdGE7CisgICAgdThfdCBCeXRlWzI0XTsKK307CisKK3N0cnVjdCBJbmZvcm1hdGlvbkVsZW1lbnRTdGEgeworICAgIHN0cnVjdCB6c0hUQ2FwYWJpbGl0eSAgICAgICBIdENhcDsKKyAgICBzdHJ1Y3QgenNFeHRIVENhcGFiaWxpdHkgICAgSHRJbmZvOworfTsKKworc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudEFwIHsKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgICAgICAgSHRDYXA7Cit9OworCisjZGVmaW5lIFpNX01BWF9GUkVRX1JFUV9RVUVVRSAgMzIKK3R5cGVkZWYgdm9pZCAoKnpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiKSh6ZGV2X3QqIGRldik7CisKK3N0cnVjdCB6c1dsYW5EZXZGcmVxQ29udHJvbAoreworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgICAgZnJlcVJlcVF1ZXVlW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFCdzQwW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFFeHRPZmZzZXRbWk1fTUFYX0ZSRVFfUkVRX1FVRVVFXTsKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiAgIGZyZXFDaGFuZ2VDb21wQ2JbWk1fTUFYX0ZSRVFfUkVRX1FVRVVFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFRdWV1ZUhlYWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxUXVldWVUYWlsOworfTsKKworc3RydWN0IHpzV2xhbkRldkFwCit7CisgICAgdTE2X3QgICBwcm90ZWN0ZWRPYnNzOyAgICAvKiBwcm90ZWN0ZWQgb3ZlcmxhcCBCU1MgKi8KKyAgICB1MTZfdCAgIHN0YUFnaW5nVGltZVNlYzsgIC8qIGluIHNlY29uZCwgU1RBIHdpbGwgYmUgZGVhdGhlZCBpZiBpdCBkb2VzIG5vdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWN0aXZlIGZvciB0aGlzIGxvbmcgdGltZSAgICAgICAgICAgICAgICAgICAgICovCisgICAgdTE2X3QgICBzdGFQcm9iaW5nVGltZVNlYzsvKiBpbiBzZWNvbmQsIFNUQSB3aWxsIGJlIHByb2JlZCBpZiBpdCBkb2VzIG5vdCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZSBmb3IgdGhpcyBsb25nIHRpbWUgICAgICAgICAgICAgICAgICAgICAqLworICAgIHU4X3QgICAgYXV0aFNoYXJpbmc7ICAgICAgLyogYXV0aGVudGljYXRpb24gb24gZ29pbmcqLworICAgIHU4X3QgICAgYlN0YUFzc29jaWF0ZWQ7ICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkICovCisgICAgdThfdCAgICBnU3RhQXNzb2NpYXRlZDsgICAvKiAxMWcgU1RBIGFzc29jaWF0ZWQgKi8KKyAgICB1OF90ICAgIG5TdGFBc3NvY2lhdGVkOyAgIC8qIDExbiBTVEEgYXNzb2NpYXRlZCAqLworICAgIHUxNl90ICAgcHJvdGVjdGlvbk1vZGU7ICAgLyogQVAgcHJvdGVjdGlvbiBtb2RlIGZsYWcgKi8KKyAgICB1MTZfdCAgIHN0YVBvd2VyU2F2aW5nOyAgIC8qIFNldCBhc3NvY2lhdGVkIHBvd2VyIHNhdmluZyBTVEEgY291bnQgKi8KKworCisKKyAgICB6YnVmX3QqICB1bmlBcnJheVtaTV9VTklfQVJSQVlfU0laRV07IC8qIGFycmF5IHRvIHN0b3JlIHVuaWNhc3QgZnJhbWVzICovCisgICAgdTE2X3QgICB1bmlIZWFkOworICAgIHUxNl90ICAgdW5pVGFpbDsKKworICAgIC8qIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1SFRDYXBhYmlsaXR5IEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgdW5pb24genVFeHRIVENhcGFiaWxpdHkgRXh0SFRDYXA7IC8vQ1dZYW5nKCspCisKKyAgICAvKiBTVEEgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNTdGFUYWJsZSBzdGFUYWJsZVtaTV9NQVhfU1RBX1NVUFBPUlRdOworCisgICAgLyogV0RTICovCisgICAgc3RydWN0IHpkU3RydWN0V2RzIHdkczsKKyAgICAvKiBXUEEgKi8KKyAgICB1OF90IHdwYUllW1pNX01BWF9BUF9TVVBQT1JUXVtaTV9NQVhfV1BBSUVfU0laRV07CisgICAgdThfdCB3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3Qgc3Rhd3BhSWVbWk1fTUFYX0FQX1NVUFBPUlRdW1pNX01BWF9XUEFJRV9TSVpFXTsKKyAgICB1OF90IHN0YXdwYUxlbltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCB3cGFTdXBwb3J0W1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIC8vc3RydWN0IHpzVGtpcFNlZWQgICBiY1NlZWQ7CisgICAgdThfdCBiY0tleUluZGV4W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90IGJjSGFsS2V5SWR4W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgIGJjTWljS2V5W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MTZfdCBpdjE2W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MzJfdCBpdjMyW1pNX01BWF9BUF9TVVBQT1JUXTsKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHUzMl90IHR4aXZbWk1fTUFYX0FQX1NVUFBPUlRdWzRdOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKworICAgIC8qIFZpcnR1YWwgQVAgKi8KKyAgICB1OF90ICAgIGJlYWNvbkNvdW50ZXI7CisgICAgdThfdCAgICB2YXBOdW1iZXI7CisgICAgdThfdCAgICBhcEJpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGJpdC1OIHRvIDEgdG8gZW5hYmxlIFZBUCAqLworICAgIHU4X3QgICAgaGlkZVNzaWRbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3QgICAgYXV0aEFsZ29bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3QgICAgc3NpZFtaTV9NQVhfQVBfU1VQUE9SVF1bMzJdOyAgICAgIC8qIFNTSUQgKi8KKyAgICB1OF90ICAgIHNzaWRMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAgICAvKiBTU0lEIGxlbmd0aCAqLworICAgIHU4X3QgICAgZW5jcnlNb2RlW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIHdlcFN0YXR1c1taTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTE2X3QgICBjYXBhYltaTV9NQVhfQVBfU1VQUE9SVF07ICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHU4X3QgICAgdGltQmNtY0JpdFtaTV9NQVhfQVBfU1VQUE9SVF07ICAgIC8qIEJNQ00gYml0IG9mIFRJTSAqLworICAgIHU4X3QgICAgd2xhblR5cGVbWk1fTUFYX0FQX1NVUFBPUlRdOworCisgICAgLyogQXJyYXkgdG8gc3RvcmUgQkMgb3IgTUMgZnJhbWVzICovCisgICAgemJ1Zl90KiAgYmNtY0FycmF5W1pNX01BWF9BUF9TVVBQT1JUXVtaTV9CQ01DX0FSUkFZX1NJWkVdOworICAgIHUxNl90ICAgYmNtY0hlYWRbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHUxNl90ICAgYmNtY1RhaWxbWk1fTUFYX0FQX1NVUFBPUlRdOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcW9zTW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE9PldNRSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHVhcHNkRW5hYmxlZDsKKyAgICBzdHJ1Y3QgenNRdWV1ZSogICAgICAgICB1YXBzZFE7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VUZXh0WzEyOF07CisKKyAgICBzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50QXAgaWVbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKworCit9OworCisjZGVmaW5lIFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUgICAgNCAvKiAyXk4gKi8KK3N0cnVjdCB6c0Jsb2NraW5nQXAKK3sKKyAgICB1OF90IGFkZHJbNl07CisgICAgdThfdCB3ZWlnaHQ7Cit9OworCisjZGVmaW5lIFpNX1NDQU5fTUdSX1NDQU5fTk9ORSAgICAgICAgICAgMAorI2RlZmluZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICAgICAgIDEKKyNkZWZpbmUgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCAgICAgICAyCisKK3N0cnVjdCB6c1dsYW5EZXZTdGFTY2FuTWdyCit7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc2NhblJlcXNbMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY3VyclNjYW5UeXBlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5TdGFydERlbGF5OworfTsKKworI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1NMRUVQICAgICAgICAgICAxCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9UMSAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfVDIgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1MxICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fUFNfTUFYX1NMRUVQX1BFUklPRFMgICAgICAgICAzICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYmVhY29uIHBlcmlvZHMKKworc3RydWN0IHpzV2xhbkRldlN0YVBTTWdyCit7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaXNTbGVlcEFsbG93ZWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgbWF4U2xlZXBQZXJpb2RzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHRpY2tzOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeFVuaWNhc3RGcm07CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgbGFzdFR4TXVsdGljYXN0RnJtOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeEJyb2FkY2FzdEZybTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB0ZW1wV2FrZVVwOyAvKmVuYWJsZSB3aGVuIHdha2UgdXAgYnV0IHN0aWxsIGluIHBzIG1vZGUgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBzbGVlcEFsbG93ZWR0aWNrOworfTsKKworc3RydWN0IHpzV2xhbkRldlN0YQoreworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGJlYWNvblR4Q250OyAgLyogVHJhbnNtaXR0ZWQgYmVhY29uIGNvdW50ZXIgKGluIElCU1MpICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdHhCZWFjb25JbmQ7ICAvKiBJbiBJQlNTIG1vZGUsIHRydWUgbWVhbnMgdGhhdCB3ZSBqdXN0IHRyYW5zbWl0IGEgYmVhY29uIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBiZWFjb24gcGVyaW9kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYmVhY29uQ250OyAgICAvKiByZWNlaXZlIGJlYWNvbiBjb3VudCwgd2lsbCBiZSBwZXJvZGljYWxseSByZXNldCAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGJzc2lkWzNdOyAgICAgLyogQlNTSUQgb2YgY29ubmVjdGVkIEFQICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3NpZFszMl07ICAgICAvKiBTU0lEICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgc3NpZExlbjsgICAgICAvKiBTU0lEIGxlbmd0aCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1UeFJhdGU7ICAgICAgLyogVHggcmF0ZSBmb3IgbXVsdGljYXN0ICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdVR4UmF0ZTsgICAgICAvKiBUeCByYXRlIGZvciB1bmljYXN0ICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgbW1UeFJhdGU7ICAgICAvKiBUeCByYXRlIGZvciBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkNoYW5uZWxTY2FuOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJTY2hlZHVsZVNjYW47CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbFNjYW5SZXE7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHBhc3NpdmVTY2FuVGlja1BlckNoYW5uZWw7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgc2NhbkZyZXF1ZW5jeTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBjb25uUG93ZXJJbkhhbGZEYm07CisKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50RnJlcXVlbmN5OworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdzQwOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFeHRPZmZzZXQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiUGFzc2l2ZVNjYW47CisKKyAgICBzdHJ1Y3QgenNCbG9ja2luZ0FwICAgICBibG9ja2luZ0FwTGlzdFtaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFXTsKKworICAgIC8vc3RydWN0IHpzQnNzSW5mbyAgICAgICAgYnNzSW5mb1Bvb2xbWk1fTUFYX0JTU107CisgICAgc3RydWN0IHpzQnNzSW5mbyogICAgICAgYnNzSW5mb0FycmF5W1pNX01BWF9CU1NdOworICAgIHN0cnVjdCB6c0Jzc0xpc3QgICAgICAgIGJzc0xpc3Q7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYnNzSW5mb0FycmF5SGVhZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NJbmZvQXJyYXlUYWlsOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc0luZm9GcmVlQ291bnQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhdXRoTW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXV0aE1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd2VwU3RhdHVzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBrZXlJZDsKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1dwYTJQc2s7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNlbmNLZXlJZDsgLy9DRU5DCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRyb3BVbmVuY3J5cHRlZFBrdHM7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc0pvaW5Pbmx5OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBvbGRBZGFwdGVyU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY29ubmVjdFN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RSZXRyeTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFJZVtaTV9NQVhfSUVfU0laRSArIDJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHJzbkllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlVGV4dFsyNTUrMl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eVsyXTsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmdIaWRkZW5BUDsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5XaXRoU1NJRDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhaWQ7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgbWd0RnJhbWVDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiUHJvdGVjdGlvbk1vZGU7CisJdTMyX3QJCQkJCU5vbk5BUGNvdW50OworCXU4X3QJCQkJCVJUU0luQUdHTW9kZTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBjb25uZWN0VGltZXI7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQnNzaWRbNl07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkRlc2lyZWRCc3NpZDsKKyAgICBzdHJ1Y3QgenNUa2lwU2VlZCAgICAgICB0eFNlZWQ7CisgICAgc3RydWN0IHpzVGtpcFNlZWQgICAgICAgcnhTZWVkWzRdOworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgICAgIHR4TWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgICAgIHJ4TWljS2V5WzRdOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGl2MTY7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgaXYzMjsKKyAgICBzdHJ1Y3QgenNPcHBvc2l0ZUluZm8gICBvcHBvc2l0ZUluZm9bWk1fTUFYX09QUE9TSVRFX0NPVU5UXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc05vdEZvdW5kQ291bnQ7ICAgICAvKiBzaXRlc3VydmV5IGZvciBzZWFyY2ggZGVzaXJlZCBJU0JCIHRocmVzaG9sZCAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHJ4QmVhY29uQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYmVhY29uTWlzc1N0YXRlOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIHJ4QmVhY29uVG90YWw7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYklzU2hhcmVkS2V5OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0Q291bnQ7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByZWN2QXRpbTsKKworICAgIC8qIFNjYW5NZ3IgQ29udHJvbCBibG9jayAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGFTY2FuTWdyIHNjYW5NZ3I7CisgICAgc3RydWN0IHpzV2xhbkRldlN0YVBTTWdyICAgcHNNZ3I7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgd291bGQgYmUgY2FsbGVkIGlmIHJlY2VpdmluZyBhbiB1bmVuY3J5cHRlZCBwYWNrZXRzIGJ1dAorICAgIC8vIHRoZSBzdGF0aW9uIGlzIGluIGVuY3J5cHRlZCBtb2RlLiBUaGUgd3JhcHBlciBjb3VsZCBkZWNpZGUgd2hldGhlcgorICAgIC8vIHRvIGRyb3AgdGhlIHBhY2tldCBieSBpdHMgT1Mgc2V0dGluZy4KKyAgICB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7CisKKyAgICAvKiBXTUUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhcFdtZUNhcGFiaWxpdHk7IC8vYml0LTAgPT4gYSBXTUUgQVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYml0LTcgPT4gYSBVQVBTRCBBUAorICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lRW5hYmxlZDsKKyAgICAjZGVmaW5lIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCAgICAgICAweDEKKyAgICAjZGVmaW5lIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUICAgICAweDIKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3bWVRb3NJbmZvOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lQ29ubmVjdGVkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHFvc0luZm87CisgICAgc3RydWN0IHpzUXVldWUqICAgICAgICAgdWFwc2RROworCisgICAgLyogY291bnRlcm1lYXN1cmVzICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21NaWNGYWlsdXJlQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21EaXNhbGxvd1NzaWRMZW5ndGg7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY21EaXNhbGxvd1NzaWRbMzJdOworCisgICAgLyogcG93ZXItc2F2aW5nIG1vZGUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBwb3dlclNhdmVNb2RlOworICAgIHpidWZfdCogICAgICAgICAgICAgICAgIHN0YVBTRGF0YVF1ZXVlW1pNX1BTX1FVRVVFX1NJWkVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHN0YVBTRGF0YUNvdW50OworCisgICAgLyogSUJTUyBwb3dlci1zYXZpbmcgbW9kZSAqLworICAgIC8qIHJlY29yZCB0aGUgU1RBIHdoaWNoIGhhcyBlbnRlcmVkIHRoZSBQUyBtb2RlICovCisgICAgc3RydWN0IHpzU3RhUFNMaXN0ICAgICAgc3RhUFNMaXN0OworICAgIC8qIHF1ZXVlIHRoZSBkYXRhIG9mIHRoZSBQUyBTVEFzICovCisgICAgemJ1Zl90KiAgICAgICAgICAgICAgICAgIGlic3NQU0RhdGFRdWV1ZVtaTV9QU19RVUVVRV9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzUFNEYXRhQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1ByZXZQU0RhdGFDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiSWJzc1BTRW5hYmxlOworICAgIC8qIEJJVF8xNTogT04vT0ZGLCBCSVRfMH4xNDogQXRpbSBUaW1lciAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGlic3NBdGltVGltZXI7CisKKyAgICAvKiBXUEEyICovCisgICAgc3RydWN0IHpzUG1raWRJbmZvICAgICAgcG1raWRJbmZvOworCisgICAgLyogTXVsdGljYXN0IGxpc3QgcmVsYXRlZCBvYmplY3RzICovCisgICAgc3RydWN0IHpzTXVsdGljYXN0TGlzdCAgbXVsdGljYXN0TGlzdDsKKworICAgIC8qIFhQIHBhY2tldCBmaWx0ZXIgZmVhdHVyZSA6ICovCisgICAgLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKyAgICAvKiAwPT5kaXNhYmxlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkFsbE11bHRpY2FzdDsKKworICAgIC8qIHJlYXNzb2NpYXRpb24gZmxhZyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RCeVJlYXNzbzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBmYWlsQ250T2ZSZWFzc287CisKKwkvKiBmb3IgSFQgY29uZmlndXJlIGNvbnRyb2wgc2V0dGluZyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlVHlwZUhUOyAgLyogSFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJdThfdCAgICAgICAgICAgICAgICAgICAgaHRDdHJsQmFuZHdpZHRoOworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybFNUQkM7CisJdThfdCAgICAgICAgICAgICAgICAgICAgaHRDdHJsU0c7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRBOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl8xMWI7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBFbmFibGVIVDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBTRzQwOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIEhUMjA0MDsKKyAgICAvKiBmb3IgV1BBIHNldHRpbmcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdXBwb3J0OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdwYUxlbjsKKworICAgIC8qIElCU1MgcmVsYXRlZCBvYmplY3RzICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc0RlbGF5ZWRJbmQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGlic3NEZWxheWVkSW5kRXZlbnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1BhcnRuZXJTdGF0dXM7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiQXV0b1JlY29ubmVjdDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGZsYWdGcmVxQ2hhbmdpbmc7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZmxhZ0tleUNoYW5naW5nOworICAgIHN0cnVjdCB6c0Jzc0luZm8gICAgICAgIGlic3NCc3NEZXNjOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NCc3NJc0NyZWF0b3I7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgaWJzc1JlY2VpdmVCZWFjb25Db3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzU2l0ZVN1cnZleVN0YXR1czsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRpc2FibGVQcm9iaW5nV2l0aFNzaWQ7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBDRU5DICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2VuY0llW1pNX01BWF9JRV9TSVpFICsgMl07CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHUzMl90IHR4aXZbNF07ICAvL1R4IFBOIFNlcXVlbmNlCisgICAgdTMyX3Qgcnhpdls0XTsgIC8vUnggUE4gU2VxdWVuY2UKKyAgICB1MzJfdCByeGl2R0tbNF07Ly9Ccm9hZGNhc3QgUnggUE4gU2VxdWVuY2UKKyAgICB1OF90ICB3ZXBLZXlbNF1bMzJdOyAgICAvLyBGb3IgU29mdHdhcmUgV0VQCisJdThfdCAgU1dFbmNyeU1vZGVbNF07CisKKyAgICAvKiA4MDIuMTFkICovCisgICAgdThfdCBiODAyXzExRDsKKworICAgIC8qIDgwMi4xMWggKi8KKyAgICB1OF90IFRQQ0VuYWJsZTsKKyAgICB1OF90IERGU0VuYWJsZTsKKyAgICB1OF90IERGU0Rpc2FibGVUeDsKKworICAgIC8qIE93bCBBUCAqLworICAgIHU4X3QgYXRoT3dsQXA7CisKKyAgICAvKiBFbmFibGUgQkEgcmVzcG9uc2UgaW4gZHJpdmVyICovCisgICAgdThfdCBlbmFibGVEcnZCQTsKKworICAgIC8qIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1SFRDYXBhYmlsaXR5IEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgdW5pb24genVFeHRIVENhcGFiaWxpdHkgRXh0SFRDYXA7IC8vQ1dZYW5nKCspCisKKyAgICBzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50U3RhICAgaWU7CisKKyNkZWZpbmUgWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFICAgMjAwCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXNvY1JlcUZyYW1lQm9keVtaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkVdOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFzb2NSZXFGcmFtZUJvZHlTaXplOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFzb2NSc3BGcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhc29jUnNwRnJhbWVCb2R5U2l6ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiZWFjb25GcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBiZWFjb25GcmFtZUJvZHlTaXplOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIFNXRW5jcnlwdEVuYWJsZTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGxlYXBFbmFibGVkOworCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0czsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlczsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHM7CisKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlcjsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZWRQa3RSYXRlUGVyU2Vjb25kOworCisgICAgLyogIzIgUmVjb3JkIHRoZSBzZXF1ZW5jZSBudW1iZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHVuaWNhc3QgZnJhbWUgaXMgc2VwYXJhdGVkIGJ5IFJJRlMgb3Igbm90ICovCisjZGVmaW5lICAgIFpNX1JJRlNfU1RBVEVfREVURUNUSU5HICAgIDAKKyNkZWZpbmUgICAgWk1fUklGU19TVEFURV9ERVRFQ1RFRCAgICAgMQorI2RlZmluZSAgICBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgICAgICA0NDgwICAgICAgICAgIC8vIDxEcml2ZXIgdGltZT40NDgwbXMgPFJlYWwgdGltZT43cworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHJpZnNTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByaWZzTGlrZUZyYW1lQ250OworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHJpZnNMaWtlRnJhbWVTZXF1ZW5jZVszXTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICByaWZzVGltZXI7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgcmlmc0NvdW50OworCisgICAgLyogUlggZmlsdGVyIGRlc2lyZWQgYnkgdXBwZXIgbGF5ZXJzLiAgTm90ZSB0aGlzIGNvbnRhaW5zIHNvbWUgYml0cyB3aGljaCBtdXN0IGJlIGZpbHRlcmVkCisgICAgICAgYnkgc3cgc2luY2UgdGhlIGh3IHN1cHBvcnRzIG9ubHkgYSBzdWJzZXQgb2YgcG9zc2libGUgZmlsdGVyIGFjdGlvbnMuPSAqLworICAgIHUzMl90ICBvc1J4RmlsdGVyOworCisgICAgdThfdCAgIGJTYWZlTW9kZTsKKworICAgIHUzMl90ICBpYnNzQWRkaXRpb25hbElFU2l6ZTsKKyAgICB1OF90ICAgaWJzc0FkZGl0aW9uYWxJRVsyNTZdOworfTsgLy9zdHJ1Y3QgenNXbGFuRGV2U3RhCisKKyNkZWZpbmUgWk1fQ01EX1FVRVVFX1NJWkUgICAgICAgICAgICAgICAgICAgMjU2ICAvL1JvZ2VyIENoZWNrLCB0ZXN0IDY0IHdoZW4gcmVhZHkKKworI2RlZmluZSBaTV9PSURfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX09JRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fT0lEX0lOVEVSTkFMX1dSSVRFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9DTURfU0VUX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0NNRF9TRVRfS0VZICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQ1dNX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9NQUNfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFpNX0FOSV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fRUVQUk9NX1JFQUQgICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9FRVBST01fV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDBBCisjZGVmaW5lIFpNX09JRF9DSEFOCQkJCQkJCTB4MzAKKyNkZWZpbmUgWk1fT0lEX1NZTlRICQkJCQkJMHgzMgorI2RlZmluZSBaTV9PSURfVEFMTFkJCQkJCQkweDgxCisjZGVmaW5lIFpNX09JRF9UQUxMWV9BUEQJCQkJCTB4ODIKKworI2RlZmluZSBaTV9PSURfREtUWF9TVEFUVVMgICAgICAgICAgICAgICAgICAweDkyCisjZGVmaW5lIFpNX09JRF9GTEFTSF9DSEtTVU0gICAgICAgICAgICAgICAgIDB4RDAKKyNkZWZpbmUgWk1fT0lEX0ZMQVNIX1JFQUQgICAgICAgICAgICAgICAgICAgMHhEMQorI2RlZmluZSBaTV9PSURfRkxBU0hfUFJPR1JBTSAgICAgICAgICAgICAgICAweEQyCisjZGVmaW5lIFpNX09JRF9GV19ETF9JTklUICAgICAgICAgICAgICAgICAgIDB4RDMKKworLyogRHJpdmVyIHRvIEZpcm13YXJlIE9JRCAqLworI2RlZmluZSBaTV9DTURfRUNITyAgICAgICAgIDB4ODAKKyNkZWZpbmUgWk1fQ01EX1RBTExZICAgICAgICAweDgxCisjZGVmaW5lIFpNX0NNRF9UQUxMWV9BUEQgICAgMHg4MgorI2RlZmluZSBaTV9DTURfQ09ORklHICAgICAgIDB4ODMKKyNkZWZpbmUgWk1fQ01EX1JSRUcgICAgICAgICAweDAwCisjZGVmaW5lIFpNX0NNRF9XUkVHICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9DTURfUk1FTSAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fQ01EX1dNRU0gICAgICAgICAweDAzCisjZGVmaW5lIFpNX0NNRF9CSVRBTkQgICAgICAgMHgwNAorI2RlZmluZSBaTV9DTURfQklUT1IgICAgICAgIDB4MDUKKyNkZWZpbmUgWk1fQ01EX0VLRVkgICAgICAgICAweDI4CisjZGVmaW5lIFpNX0NNRF9ES0VZICAgICAgICAgMHgyOQorI2RlZmluZSBaTV9DTURfRlJFUVVFTkNZICAgIDB4MzAKKyNkZWZpbmUgWk1fQ01EX1JGX0lOSVQgICAgICAweDMxCisjZGVmaW5lIFpNX0NNRF9TWU5USCAgICAgICAgMHgzMgorI2RlZmluZSBaTV9DTURfRlJFUV9TVFJBVCAgIDB4MzMKKyNkZWZpbmUgWk1fQ01EX1JFU0VUICAgICAgICAweDkwCisjZGVmaW5lIFpNX0NNRF9ES1JFU0VUICAgICAgMHg5MQorI2RlZmluZSBaTV9DTURfREtUWF9TVEFUVVMgIDB4OTIKKyNkZWZpbmUgWk1fQ01EX0ZEQyAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX0NNRF9XUkVFUFJPTSAgICAgMHhCMAorI2RlZmluZSBaTV9DTURfV0ZMQVNIICAgICAgIDB4QjAKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX0VSQVNFICAweEIxCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9QUk9HICAgMHhCMgorI2RlZmluZSBaTV9DTURfRkxBU0hfQ0hLU1VNIDB4QjMKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX1JFQUQgICAweEI0CisjZGVmaW5lIFpNX0NNRF9GV19ETF9JTklUICAgMHhCNQorI2RlZmluZSBaTV9DTURfTUVNX1dSRUVQUk9NIDB4QkIKKworCisvKiBkdXBsaWNhdGUgZmlsdGVyIHRhYmxlIGNvbHVtbiAqLworI2RlZmluZSBaTV9GSUxURVJfVEFCTEVfQ09MICAgICAgICAgICAgICAgICAyIC8qIDJebiAqLworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBSb3cgKi8KKyNkZWZpbmUgWk1fRklMVEVSX1RBQkxFX1JPVyAgICAgICAgICAgICAgICAgOCAvKiAyXm4gKi8KKworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c1J4RmlsdGVyCit7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCBzZXE7CisgICAgdThfdCB1cDsKK307CisKK3N0cnVjdCB6c1dsYW5EZXYKK3sKKyAgICAvKiBBUCBnbG9iYWwgdmFyaWFibGVzICovCisgICAgc3RydWN0IHpzV2xhbkRldkFwIGFwOworICAgIC8qIFNUQSBnbG9iYWwgdmFyaWFibGVzICovCisgICAgc3RydWN0IHpzV2xhbkRldlN0YSBzdGE7CisgICAgLyogc2F2ZSB3cmFwcGVyIHNldHRpbmcgKi8KKyAgICBzdHJ1Y3QgenNXcmFwcGVyU2V0dGluZyB3czsKKyAgICAvKiBmZWF0dXJlcyBkZXRlcm1pbmVkIGJ5IHdyYXBwZXIgKHZlbmRvcikgKi8KKyAgICBzdHJ1Y3QgenNXcmFwcGVyRmVhdHVyZUN0cmwgd2ZjOworICAgIC8qIFRyYWZmaWMgTW9uaXRvciB0YWxseSAqLworICAgIHN0cnVjdCB6c1RyYWZUYWxseSB0cmFmVGFsbHk7CisgICAgLyogQ29tbXVuaWNhdGlvbiB0YWxseSAqLworICAgIHN0cnVjdCB6c0NvbW1UYWxseSBjb21tVGFsbHk7CisgICAgLyogRHVwbGljYXRlIGZyYW1lIGZpbHRlciB0YWJsZSAqLworICAgIHN0cnVjdCB6c1J4RmlsdGVyIHJ4RmlsdGVyVGJsW1pNX0ZJTFRFUl9UQUJMRV9DT0xdW1pNX0ZJTFRFUl9UQUJMRV9ST1ddOworICAgIC8qIFJlZ3VsYXRvcnkgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUgIHJlZ3VsYXRpb25UYWJsZTsKKworICAgIC8qICovCisgICAgc3RydWN0IHpzV2xhbkRldkZyZXFDb250cm9sIGZyZXFDdHJsOworCisgICAgZW51bSBkZXZTdGF0ZSBzdGF0ZTsKKworICAgIHU4X3QgIGhhbFN0YXRlOworICAgIHU4X3QgIHdsYW5Nb2RlOyAgICAgICAgIC8qIEFQL0lORlJBU1RSVUNUVVJFL0lCU1MvUFNFVURPICovCisgICAgdTE2X3QgbWFjQWRkclszXTsgICAgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB1MTZfdCBiZWFjb25JbnRlcnZhbDsgICAvKiBiZWFjb24gSW50ZXJ2YWwgKi8KKyAgICB1OF90IGR0aW07ICAgICAgICAgICAgICAvKiBEVElNIHBlcmlvZCAqLworICAgIHU4X3QgICAgICAgICAgICBDdXJyZW50RHRpbUNvdW50OworICAgIHU4X3QgIHByZWFtYmxlVHlwZTsKKyAgICB1OF90ICBwcmVhbWJsZVR5cGVJblVzZWQ7CisgICAgdThfdCAgbWF4VHhQb3dlcjI7CSAgICAvKiAyLjQgR0h6IE1heCBUeCBwb3dlciAoVW5pdDogMC41IGRCbSkgKi8KKyAgICB1OF90ICBtYXhUeFBvd2VyNTsJICAgIC8qIDUgR0h6IE1heCBUeCBwb3dlciAoVW5pdDogMC41IGRCbSkgKi8KKyAgICB1OF90ICBjb25uZWN0TW9kZTsKKyAgICB1MzJfdCBzdXBwb3J0TW9kZTsKKworICAgIHU4X3QgYlJhdGU7ICAgICAgICAgICAgIC8qIDExYiBTdXBwb3J0IFJhdGUgYml0IG1hcCAqLworICAgIHU4X3QgYlJhdGVCYXNpYzsgICAgICAgIC8qIDExYiBCYXNpYyBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGdSYXRlOyAgICAgICAgICAgICAvKiAxMWcgU3VwcG9ydCBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGdSYXRlQmFzaWM7ICAgICAgICAvKiAxMWcgQmFzaWMgUmF0ZSBiaXQgbWFwICovCisgICAgLyogY2hhbm5lbCBpbmRleCBwb2ludCB0byB0aGUgaXRlbSBpbiByZWd1bGF0aW9uIHRhYmxlICovCisgICAgdThfdCBjaGFubmVsSW5kZXg7CisKKyAgICAvKiBjaGFubmVsIG1hbmFnZW1lbnQgKi8KKyAgICB1OF90ICAgIEJhbmRXaWR0aDQwOworICAgIHU4X3QgICAgRXh0T2Zmc2V0OyAgICAgIC8vMSBhYm92ZSwgMyBiZWxvdywgMCBub3QgcHJlc2VudAorICAgIHUxNl90ICAgZnJlcXVlbmN5OyAgICAgIC8qIG9wZXJhdGlvbiBmcmVxdWVuY3kgKi8KKworICAgIHU4X3QgZXJwRWxlbWVudDsgICAgICAgIC8qIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50IGRhdGEgKi8KKworICAgIHU4X3QgZGlzYWJsZVNlbGZDdHM7ICAgIC8qIHNldCB0byAxIHRvIGRpc2FibGUgU2VsZi1DVFMgKi8KKyAgICB1OF90IGJnTW9kZTsKKworCS8qIHByaXZhdGUgdGVzdCBmbGFnICovCisgICAgdTMyX3QgZW5hYmxlUHJvdGVjdGlvbk1vZGU7ICAgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgc2VsZiBjdHMgKi8KKwl1MzJfdCBjaGVja3N1bVRlc3Q7ICAgICAvKiBPVFVTIGNoZWNrc3VtIHRlc3QgMT0+emVybyBjaGVja3N1bSAwPT5ub3JtYWwgKi8KKwl1MzJfdCByeFBhY2tldER1bXA7ICAgICAvKiByeCBwYWNrZXQgZHVtcCAqLworCisgICAgdThfdCBlbmFibGVBZ2dyZWdhdGlvbjsgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgQS1NU1BVICovCisgICAgdThfdCBlbmFibGVXRFM7ICAgICAgICAgLyogZm9yY2UgZW5hYmxlL2Rpc2FibGUgV0RTIHRlc3RpbmcgKi8KKwl1OF90IGVuYWJsZVR4UGF0aE1vZGU7ICAvKiBPVFVTIHNwZWNpYWwgdGVzdGluZyBtb2RlIDE9PmRpYWJsZSwgMD0+ZW5hYmxlOiBaTV9TWVNURU1fVEVTVF9NT0RFICovCisgICAgdThfdCBlbmFibGVIQUxEYmdJbmZvOyAgLyogICovCisKKyAgICB1MzJfdCBmb3JjZVR4VFBDOyAgICAgICAvKiBmb3JjZSB0eCBwYWNrZXQgc2VuZCBUUEMgKi8KKworICAgIHUxNl90IHNlcVs0XTsKKyAgICB1MTZfdCBtbXNlcTsKKworICAgIC8qIGRyaXZlciBjb3JlIHRpbWUgdGljayAqLworICAgIHUzMl90IHRpY2s7CisgICAgdTE2X3QgdGlja0lic3NTZW5kQmVhY29uOworICAgIHUxNl90IHRpY2tJYnNzUmVjZWl2ZUJlYWNvbjsKKworICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICB1MTZfdCBydHNUaHJlc2hvbGQ7CisKKyAgICAvKiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCwgIDI1NiA8PSB2YWx1ZSA8PSAyMzQ2LCAwPWRpc2FibGVkICovCisgICAgdTE2X3QgZnJhZ1RocmVzaG9sZDsKKworICAgIC8qIFR4IFJhdGUgKi8KKyAgICB1MTZfdCB0eE1DUzsKKyAgICB1MTZfdCB0eE1UOworICAgIHUzMl90IEN1cnJlbnRUeFJhdGVLYnBzOyAvL0NXWWFuZygrKQorICAgIC8qIFJ4IFJhdGUgKi8KKyAgICB1MzJfdCBDdXJyZW50UnhSYXRlS2JwczsgLy9KYW5ldCgrKQorICAgIHU4X3QgQ3VycmVudFJ4UmF0ZVVwZGF0ZWQ7CisgICAgdThfdCBtb2R1bGF0aW9uVHlwZTsKKyAgICB1OF90IHJ4SW5mbzsKKyAgICB1MTZfdCByYXRlRmllbGQ7CisKKyAgICAvKiB0aW1lciByZWxhdGVkIG9iamVjdHMgKi8KKyAgICBzdHJ1Y3QgenNUaW1lckxpc3QgIHRpbWVyTGlzdDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGJUaW1lclJlYWR5OworCisgICAgLyogZm9yIGRlZnJhZ21lbnRhdGlvbiAqLworICAgIHN0cnVjdCB6c0RlZnJhZ0xpc3QgZGVmcmFnVGFibGU7CisKKyAgICAvKiBEYXRhIHN0cnVjdCBmb3IgSW50ZXJmYWNlIERlcGVuZGVudCBMYXllciAqLworICAgIC8vc3RydWN0IHpzSWRsU3RydWN0IGlkbFN0cnVjdDsKKworICAgIC8qIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFJlbGF0ZWQgUGFyYW1ldGVycyAqLworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGg7IC8vQ1dZYW5nKCspCisgICAgdThfdCBTaWduYWxRdWFsaXR5OyAgLy9DV1lhbmcoKykKKworCisKKyAgICAvKiBRb1MgKi8KKyAgICB6YnVmX3QqIHZ0eHFbNF1bWk1fVlRYUV9TSVpFXTsKKyAgICB1MTZfdCB2dHhxSGVhZFs0XTsKKyAgICB1MTZfdCB2dHhxVGFpbFs0XTsKKyAgICB1MTZfdCBxb3NEcm9wSXBGcmFnWzRdOworCisgICAgLyogTWFuYWdlbWVudCBUeCBxdWV1ZSAqLworICAgIHpidWZfdCogdm1tcVtaTV9WTU1RX1NJWkVdOworICAgIHUxNl90IHZtbXFIZWFkOworICAgIHUxNl90IHZtbXFUYWlsOworCisgICAgdThfdCAgICAgICAgICAgICAgICB2dHhxUHVzaGluZzsKKworICAgIC8qCisgICAgICogYWRkIGJ5IGhvbmRhCisgICAgICogMS4gQWdncmVnYXRlIHF1ZXVlcworICAgICAqIDIuIFNUQSdzIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIHF1ZXVlIG51bWJlcgorICAgICAqIDMuIHJ4IGFnZ3JlZ2F0aW9uIHJlLW9yZGVyaW5nIHF1ZXVlCisgICAgICovCisgICAgc3RydWN0IGFnZ1F1ZXVlICAgICphZ2dRUG9vbFtaTV9BR0dfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFnZ0luaXRpYXRlZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFkZGJhQ29tcGxldGU7CisgICAgdThfdCAgICAgICAgICAgICAgICBhZGRiYUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgYWdnU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICBkZXN0TG9jazsKKyAgICBzdHJ1Y3QgYWdnU3RhICAgICAgIGFnZ1N0YVtaTV9NQVhfU1RBX1NVUFBPUlRdOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICAqdGlkX3J4W1pNX0FHR19QT09MX1NJWkVdOworICAgIHN0cnVjdCBhZ2dUYWxseSAgICAgYWdnX3RhbDsKKyAgICBzdHJ1Y3QgZGVzdFEgICAgICAgIGRlc3RROworICAgIHN0cnVjdCBiYXdfZW5hYmxlciAqYmF3X2VuYWJsZXI7CisgICAgc3RydWN0IGllZWU4MDIxMV9jd20gICAgY3dtOworICAgIHUxNl90ICAgICAgICAgICAgICAgcmVvcmRlcjsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIHNlcV9kZWJ1ZzsKKyAgICAvKiByYXRlIGNvbnRyb2wgKi8KKyAgICB1MzJfdCB0eE1QRFVbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MzJfdCB0eEZhaWxbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MzJfdCBQRVJbWk1fUkFURV9UQUJMRV9TSVpFXTsKKyAgICB1MTZfdCBwcm9iZUNvdW50OworICAgIHUxNl90IHByb2JlU3VjY2Vzc0NvdW50OworICAgIHUxNl90IHByb2JlSW50ZXJ2YWw7CisgICAgdTE2X3Qgc3VjY2Vzc19wcm9iaW5nOworICAgIC8qCisgICAgICogZW5kIG9mIGFkZCBieSBob25kYQorICAgICAqLworCisgICAgLyogYWlyb3BlZWsgc25pZmZlciBtb2RlIGZvciB1cHBlciBzdyAqLworICAgIHUzMl90ICAgICAgICAgICAgICAgc3dTbmlmZmVyOyAgIC8qIHdpbmRvdzogYWlyb1BlZWsgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIFhMaW5rTW9kZTsKKworICAgIC8qIE1ESyBtb2RlICovCisgICAgLyogaW5pdCBieSAwPT5ub3JtYWwgZHJpdmVyIDE9Pk1ESyBkcml2ZXIgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIG1vZGVNREtFbmFibGU7CisKKyAgICB1MzJfdCAgICAgICAgICAgICAgIGhlYXJ0QmVhdE5vdGlmaWNhdGlvbjsKKworICAgIC8qIHBvaW50ZXIgZm9yIEhBTCBQbHVzIHByaXZhdGUgbWVtb3J5ICovCisgICAgdm9pZCogaHBQcml2YXRlOworCisgICAgLyogZm9yIFdQQSBzZXR0aW5nICovCisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFTdXBwb3J0W1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICAvL3U4X3QgICAgICAgICAgICAgICAgICAgIHdwYUxlbltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFJZVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fTUFYX0lFX1NJWkVdOworCisgICAgc3RydWN0IHpzTGVkU3RydWN0ICAgICAgbGVkU3RydWN0OworCisgICAgLyogYW5pIGZsYWcgKi8KKyAgICB1OF90IGFuaUVuYWJsZTsKKyAgICB1MTZfdCB0eHFfdGhyZXNob2xkOworCisJLy9Ta2lwIE1pYyBFcnJvciBDaGVjaworCXU4X3QJVEtJUF9Hcm91cF9LZXlDaGFuZ2luZzsKKworCXU4X3QgICAgZHluYW1pY1NJRlNFbmFibGU7CisKKwl1OF90ICAgIHF1ZXVlRmx1c2hlZDsKKworICAgIHUxNl90ICgqemZjYkF1dGhOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkcik7CisgICAgdTE2X3QgKCp6ZmNiQXNvY05vdGlmeSkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiRGlzQXNvY05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworICAgIHUxNl90ICgqemZjYkFwQ29ubmVjdE5vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworICAgIHZvaWQgKCp6ZmNiQ29ubmVjdE5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKTsKKyAgICB2b2lkICgqemZjYlNjYW5Ob3RpZnkpKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTY2FuUmVzdWx0KiByZXN1bHQpOworICAgIHZvaWQgKCp6ZmNiTWljRmFpbHVyZU5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpOworICAgIHZvaWQgKCp6ZmNiQXBNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogYWRkciwgemJ1Zl90KiBidWYpOworICAgIHZvaWQgKCp6ZmNiSWJzc1BhcnRuZXJOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworICAgIHZvaWQgKCp6ZmNiSHdXYXRjaERvZ05vdGlmeSkoemRldl90KiBkZXYpOworfTsKKworCitzdHJ1Y3QgenNXbGFuS2V5Cit7CisgICAgdThfdCBrZXk7Cit9OworCisKKy8qIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisvKiBQbGVhc2UgbGVhdmUgdGhlbSBhbG9uZSAqLworLyogRm9yIFR4IHBhY2tldCBhbGxvY2F0ZWQgaW4gdXBwZXIgbGF5ZXIgbGF5ZXIgKi8KKyNkZWZpbmUgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKworLyogRm9yIFJ4IHBhY2tldCBhbGxvY2F0ZWQgaW4gZHJpdmVyICovCisjZGVmaW5lIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9TVFJVQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3dsYW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMThiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmgKQEAgLTAsMCArMSw1OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdsYW5fZGVmcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgV0xBTiBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfV0xBTl9ICisjZGVmaW5lIF9XTEFOX0gKKworCisjZGVmaW5lIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSU5URVJOQUxfQUxMT0NfQlVGICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFpNX1NJWkVfT0ZfQ1RSTF9TRVQgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9JViAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9TSVpFX09GX0VYVF9JViAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1NJWkVfT0ZfTUlDICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9DQ1hfTUlDICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgICAgICAgICAyNAorI2RlZmluZSBaTV9TSVpFX09GX1FPU19DVFJMICAgICAgICAgICAgICAgICAyCisKKy8qIEhlYWRlciBkZWZpbml0aW9uICovCisjZGVmaW5lIFpNX1NJWkVfT0ZfV0xBTl9XRFNfSEVBREVSICAgICAgICAgIDMyCisjZGVmaW5lIFpNX1NJWkVfT0ZfU05BUF9IRUFERVIgICAgICAgICAgICAgIDgKKworI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCAgICAgICAgICAgIDEwCisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCAgICAgICAgICAgIDE2CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCAgICAgICAgICAgIDI0CisjZGVmaW5lIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCAgICAgICAgICAgIDI0CisjZGVmaW5lIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUiAgICAgICAgIDI0CisKKy8qIFBvcnQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBaTV9QT1JUX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1BPUlRfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgIDEKKworLyogRnJhbWUgVHlwZSAqLworI2RlZmluZSBaTV9XTEFOX01BTkFHRU1FTlRfRlJBTUUgICAgICAgICAgICAweDAKKyNkZWZpbmUgWk1fV0xBTl9DT05UUk9MX0ZSQU1FICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFpNX1dMQU5fREFUQV9GUkFNRSAgICAgICAgICAgICAgICAgIDB4OAorCisvKiBGcmFtZSBTdWJ0eXBlICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUkVRICAgICAgICAgIDB4MDAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUkVRICAgICAgICAweDIwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgICAgICAgIDB4MzAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICAgICAgICAgMHg0MAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgICAgICAgICAweDUwCisvKiAweDYwLCAweDcwID0+IFJlc2VydmVkICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9CRUFDT04gICAgICAgICAgIDB4ODAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0gICAgICAgICAgICAgMHg5MAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIICAgICAgICAgICAgIDB4QjAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCAgICAgICAgICAgMHhDMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OCQkJMHhEMAorCisvKiBGcmFtZSB0eXBlIGFuZCBzdWJ0eXBlICovCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9OVUxMICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0JBUiAgICAgICAgICAgICAgMHg4NAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkEgICAgICAgICAgICAgICAweDk0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9QU1BPTEwgICAgICAgICAgIDB4QTQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1JUUyAgICAgICAgICAgICAgMHhCNAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQ1RTICAgICAgICAgICAgICAweEM0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCAgICAgICAgIDB4QzgKKworLyogYWN0aW9uIGZyYW1lICovCisjZGVmaW5lIFpNX1dMQU5fU1BFQ1RSVU1fTUFOQUdFTUVOVF9BQ1RJT05fRlJBTUUgICAgMAorI2RlZmluZSBaTV9XTEFOX1FPU19BQ1RJT05fRlJBTUUgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fRExTX0FDVElPTl9GUkFNRSAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FICAgICAgMworLyogYmxvY2sgYWNrIGFjdGlvbiBmcmFtZSovCisjZGVmaW5lIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRSAgICAgICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0RFTEJBX0ZSQU1FICAgICAgICAgICAgICAgICAyCisKKy8qIEVsZW1lbnQgSUQgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfU1NJRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fRUlEX0ZIICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fV0xBTl9FSURfRFMgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9XTEFOX0VJRF9DRlMgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1dMQU5fRUlEX1RJTSAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fV0xBTl9FSURfSUJTUyAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9XTEFOX0VJRF9DT1VOVFJZICAgICAgICAgICAgICAgICA3CisvKiByZXNlcnZlZCA4LTE1ICovCisjZGVmaW5lIFpNX1dMQU5fRUlEX0NIQUxMRU5HRSAgICAgICAgICAgICAgIDE2CisvKiByZXNlcnZlZCAxNy0zMSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9QT1dFUl9DT05TVFJBSU5UICAgICAgICAzMgorI2RlZmluZSBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZICAgICAgICAzMworI2RlZmluZSBaTV9XTEFOX0VJRF9UUENfUkVRVUVTVCAgICAgICAgICAgICAzNAorI2RlZmluZSBaTV9XTEFOX0VJRF9UUENfUkVQT1JUICAgICAgICAgICAgICAzNQorI2RlZmluZSBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgICAgICAzNgorI2RlZmluZSBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSAzNworI2RlZmluZSBaTV9XTEFOX0VJRF9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAzOAorI2RlZmluZSBaTV9XTEFOX0VJRF9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAzOQorI2RlZmluZSBaTV9XTEFOX0VJRF9RVUlFVCAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBaTV9XTEFOX0VJRF9JQlNTX0RGUyAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBaTV9XTEFOX0VJRF9FUlAgICAgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkgICAgICA0NQorI2RlZmluZSBaTV9XTEFOX0VJRF9SU05fSUUgICAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFICAgICAgICAgICA1MAorI2RlZmluZSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZICAgICAgICAgICA1MQorI2RlZmluZSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZICA1MgorI2RlZmluZSBaTV9XTEFOX0VJRF9ORVdfRVhUX0NIQU5ORUxfT0ZGU0VUICA1MworI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OICAgICA2MQorI2RlZmluZSBaTV9XTEFOX1BSRU4yX0VJRF9TRUNPTkRDSE9GRlNFVCAgICA2MgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1dMQU5fRUlEX0NFTkNfSUUgICAgICAgICAgICAgICAgIDY4CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSAgICAgICAgICAyMjEgICAgIC8qIFZlbmRvciBwcml2YXRlIHNwYWNlOyBtdXN0IGRlbXV4IE9VSSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9XUEFfSUUgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgWk1fV0xBTl9FSURfV1BTX0lFICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFpNX1dMQU5fRUlEX1dJRklfSUUgICAgICAgICAgICAgICAgIDIyMQorCisvKiBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCAqLworI2RlZmluZSBaTV9XTEFOX05PTl9FUlBfUFJFU0VOVF9CSVQgICAgICAgICAweDEKKyNkZWZpbmUgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQgICAgICAgICAgMHgyCisjZGVmaW5lIFpNX1dMQU5fQkFSS0VSX1BSRUFNQkxFX01PREVfQklUICAgIDB4NAorCisvKiBDaGFubmVsIGZyZXF1ZW5jeSwgaW4gTUh6ICovCisjZGVmaW5lIFpNX0NIX0dfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxMgorI2RlZmluZSBaTV9DSF9HXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MTcKKyNkZWZpbmUgWk1fQ0hfR18zICAgICAgICAgICAgICAgICAgICAgICAgICAyNDIyCisjZGVmaW5lIFpNX0NIX0dfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyNworI2RlZmluZSBaTV9DSF9HXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MzIKKyNkZWZpbmUgWk1fQ0hfR182ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDM3CisjZGVmaW5lIFpNX0NIX0dfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0MgorI2RlZmluZSBaTV9DSF9HXzggICAgICAgICAgICAgICAgICAgICAgICAgIDI0NDcKKyNkZWZpbmUgWk1fQ0hfR185ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDUyCisjZGVmaW5lIFpNX0NIX0dfMTAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1NworI2RlZmluZSBaTV9DSF9HXzExICAgICAgICAgICAgICAgICAgICAgICAgIDI0NjIKKyNkZWZpbmUgWk1fQ0hfR18xMiAgICAgICAgICAgICAgICAgICAgICAgICAyNDY3CisjZGVmaW5lIFpNX0NIX0dfMTMgICAgICAgICAgICAgICAgICAgICAgICAgMjQ3MgorI2RlZmluZSBaTV9DSF9HXzE0ICAgICAgICAgICAgICAgICAgICAgICAgIDI0ODQKKyNkZWZpbmUgWk1fQ0hfQV8xODQgICAgICAgICAgICAgICAgICAgICAgICA0OTIwCisjZGVmaW5lIFpNX0NIX0FfMTg4ICAgICAgICAgICAgICAgICAgICAgICAgNDk0MAorI2RlZmluZSBaTV9DSF9BXzE5MiAgICAgICAgICAgICAgICAgICAgICAgIDQ5NjAKKyNkZWZpbmUgWk1fQ0hfQV8xOTYgICAgICAgICAgICAgICAgICAgICAgICA0OTgwCisjZGVmaW5lIFpNX0NIX0FfOCAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0MAorI2RlZmluZSBaTV9DSF9BXzEyICAgICAgICAgICAgICAgICAgICAgICAgIDUwNjAKKyNkZWZpbmUgWk1fQ0hfQV8xNiAgICAgICAgICAgICAgICAgICAgICAgICA1MDgwCisjZGVmaW5lIFpNX0NIX0FfMzYgICAgICAgICAgICAgICAgICAgICAgICAgNTE4MAorI2RlZmluZSBaTV9DSF9BXzQwICAgICAgICAgICAgICAgICAgICAgICAgIDUyMDAKKyNkZWZpbmUgWk1fQ0hfQV80NCAgICAgICAgICAgICAgICAgICAgICAgICA1MjIwCisjZGVmaW5lIFpNX0NIX0FfNDggICAgICAgICAgICAgICAgICAgICAgICAgNTI0MAorI2RlZmluZSBaTV9DSF9BXzUyICAgICAgICAgICAgICAgICAgICAgICAgIDUyNjAKKyNkZWZpbmUgWk1fQ0hfQV81NiAgICAgICAgICAgICAgICAgICAgICAgICA1MjgwCisjZGVmaW5lIFpNX0NIX0FfNjAgICAgICAgICAgICAgICAgICAgICAgICAgNTMwMAorI2RlZmluZSBaTV9DSF9BXzY0ICAgICAgICAgICAgICAgICAgICAgICAgIDUzMjAKKyNkZWZpbmUgWk1fQ0hfQV8xMDAgICAgICAgICAgICAgICAgICAgICAgICA1NTAwCisjZGVmaW5lIFpNX0NIX0FfMTA0ICAgICAgICAgICAgICAgICAgICAgICAgNTUyMAorI2RlZmluZSBaTV9DSF9BXzEwOCAgICAgICAgICAgICAgICAgICAgICAgIDU1NDAKKyNkZWZpbmUgWk1fQ0hfQV8xMTIgICAgICAgICAgICAgICAgICAgICAgICA1NTYwCisjZGVmaW5lIFpNX0NIX0FfMTE2ICAgICAgICAgICAgICAgICAgICAgICAgNTU4MAorI2RlZmluZSBaTV9DSF9BXzEyMCAgICAgICAgICAgICAgICAgICAgICAgIDU2MDAKKyNkZWZpbmUgWk1fQ0hfQV8xMjQgICAgICAgICAgICAgICAgICAgICAgICA1NjIwCisjZGVmaW5lIFpNX0NIX0FfMTI4ICAgICAgICAgICAgICAgICAgICAgICAgNTY0MAorI2RlZmluZSBaTV9DSF9BXzEzMiAgICAgICAgICAgICAgICAgICAgICAgIDU2NjAKKyNkZWZpbmUgWk1fQ0hfQV8xMzYgICAgICAgICAgICAgICAgICAgICAgICA1NjgwCisjZGVmaW5lIFpNX0NIX0FfMTQwICAgICAgICAgICAgICAgICAgICAgICAgNTcwMAorI2RlZmluZSBaTV9DSF9BXzE0OSAgICAgICAgICAgICAgICAgICAgICAgIDU3NDUKKyNkZWZpbmUgWk1fQ0hfQV8xNTMgICAgICAgICAgICAgICAgICAgICAgICA1NzY1CisjZGVmaW5lIFpNX0NIX0FfMTU3ICAgICAgICAgICAgICAgICAgICAgICAgNTc4NQorI2RlZmluZSBaTV9DSF9BXzE2MSAgICAgICAgICAgICAgICAgICAgICAgIDU4MDUKKyNkZWZpbmUgWk1fQ0hfQV8xNjUgICAgICAgICAgICAgICAgICAgICAgICA1ODI1CisKKworLyogQVAgOiBTVEEgdGFibGUgPT4gU1RBIFR5cGUgKi8KKyNkZWZpbmUgWk1fMTFCX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNXzExR19TVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBaTV8xMU5fU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKworLyogQVAgOiB0aW1lb3V0ICovCisjZGVmaW5lIFpNX01TX1BFUl9USUNLICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFpNX1RJQ0tfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICgxMDAwL1pNX01TX1BFUl9USUNLKQorI2RlZmluZSBaTV9USUNLX1BFUl9NSU5VVEUgICAgICAgICAgICAgICAgICAoNjAqMTAwMC9aTV9NU19QRVJfVElDSykKKyNkZWZpbmUgWk1fUFJFQVVUSF9USU1FT1VUX01TICAgICAgICAgICAgICAgMTAwMCAvKiAxIHNlYyAqLworI2RlZmluZSBaTV9BVVRIX1RJTUVPVVRfTVMgICAgICAgICAgICAgICAgICAxMDAwIC8qIDEgc2VjICovCisKKy8qIEVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0VSUl9CVUZGRVJfRE1BX0FERFIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fRVJSX0ZSRUVfVFhEX0VYSEFVU1RFRCAgICAgICAgICAgMworI2RlZmluZSBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFICAgICAgICA0CisjZGVmaW5lIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSAgIDUKKyNkZWZpbmUgWk1fRVJSX1VOSV9QU19CVUZGRVJfVU5BVkFJTEFCTEUgICAgNgorI2RlZmluZSBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRCAgICA3CisjZGVmaW5lIFpNX0VSUl9WTU1RX0ZVTEwgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9FUlJfQ01EX0lOVF9NSVNTRUQgICAgICAgICAgICAgICAxNSAvKiBQb2xsaW5nIGNtZCBpbnQgdGltZW91dCovCisvKiBSeCAqLworI2RlZmluZSBaTV9FUlJfUlhfRlJBTUVfVFlQRSAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBaTV9FUlJfTUlOX1JYX0VOQ1JZUFRfRlJBTUVfTEVOR1RIICAyMQorI2RlZmluZSBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSCAgICAgICAgICAyMgorI2RlZmluZSBaTV9FUlJfTUFYX1JYX0ZSQU1FX0xFTkdUSCAgICAgICAgICAyMworI2RlZmluZSBaTV9FUlJfUlhfRFVQTElDQVRFICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9FUlJfUlhfU1JDX0FERFJfSVNfT1dOX01BQyAgICAgICAyNQorI2RlZmluZSBaTV9FUlJfTUlOX1JYX1BST1RPQ09MX1ZFUlNJT04gICAgICAyNgorI2RlZmluZSBaTV9FUlJfV1BBX0dLX05PVF9JTlNUQUxMRUQgICAgICAgICAyNworI2RlZmluZSBaTV9FUlJfU1RBX05PVF9BU1NPQ0lBVEVEICAgICAgICAgICAyOAorI2RlZmluZSBaTV9FUlJfREFUQV9CRUZPUkVfQ09OTkVDVEVEICAgICAgICAyOQorI2RlZmluZSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEICAgICAgICAgICAzMAorI2RlZmluZSBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRCAgICAgICAzMQorI2RlZmluZSBaTV9FUlJfUlhfQkFSX0ZSQU1FICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBaTV9FUlJfT1VUX09GX09SREVSX05VTExfREFUQSAgICAgICAzMworCisvKiBaRkkgKi8KKyNkZWZpbmUgWk1fRVJSX0lOVkFMSURfVFhfUkFURSAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgWk1fRVJSX1dEU19QT1JUX0lEICAgICAgICAgICAgICAgICAgNDEKKworLyogUVVFVUUgKi8KKyNkZWZpbmUgWk1fRVJSX1FVRVVFX0ZVTEwgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fRVJSX1NUQV9VQVBTRF9RVUVVRV9GVUxMICAgICAgICAgNTEKKyNkZWZpbmUgWk1fRVJSX0FQX1VBUFNEX1FVRVVFX0ZVTEwgICAgICAgICAgNTIKKworLyogTWF4aW11bSBSeCBmcmFtZSBsZW5ndGggKi8KKyNpZiBaTV9MQVJHRVBBWUxPQURfVEVTVCA9PSAxCisjZGVmaW5lIFpNX1dMQU5fTUFYX1JYX1NJWkUgICAgICAgICAgICAgICAgIDE2Mzg0CisjZWxzZQorI2RlZmluZSBaTV9XTEFOX01BWF9SWF9TSVpFICAgICAgICAgICAgICAgICA4MTkyCisjZW5kaWYKKworLyogUENJIERNQSB0ZXN0IGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX0lOVEVSUlVQVF9NSVNTRUQgICAgICAgICAgICAgMTAwCisjZGVmaW5lIFpNX0VSUl9PV05fQklUX05PVF9DTEVBUkVEICAgICAgICAgIDEwMQorI2RlZmluZSBaTV9FUlJfUlhfU0VRX05VTUJFUiAgICAgICAgICAgICAgICAxMDIKKyNkZWZpbmUgWk1fRVJSX1JYX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIFpNX0VSUl9SWF9EQVRBICAgICAgICAgICAgICAgICAgICAgIDEwNAorI2RlZmluZSBaTV9FUlJfUlhfREVTQ1JJUFRPUl9OVU0gICAgICAgICAgICAxMDUKKy8qIENvbW1vbiByZWdpc3RlciB0ZXN0IGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX1JFR0lTVEVSX0FDQ0VTUyAgICAgICAgICAgICAgMTEwIC8qIFJlZ2lzdGVyIFIvVyB0ZXN0IGZhaWwqLworI2RlZmluZSBaTV9FUlJfQ0xFQVJfSU5URVJSVVBUX0ZMQUcgICAgICAgICAxMTEKKyNkZWZpbmUgWk1fRVJSX0NPTU1BTkRfUkVTUE9OU0UgICAgICAgICAgICAgMTEyCisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfR0VORVJBVEUgICAgICAgICAgIDExMworI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX0FDSyAgICAgICAgICAgICAgICAxMTQKKyNkZWZpbmUgWk1fRVJSX1NDUkFUQ0hfQUNDRVNTICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfTUFTS19BQ0NFU1MgICAgICAgIDExNgorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX1BDSV9BQ0NFU1MgICAgICAxMTcKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9GV19BQ0NFU1MgICAgICAgMTE4CisjZGVmaW5lIFpNX0VSUl9TSEFSRV9NRU1PUllfRElTQUJMRSAgICAgICAgIDExOQorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX1RFU1RfUkVTUE9OU0UgICAxMjAKKworLyogRmlybXdhcmUgRG93bmxvYWQgZXJyb3IgY29kZSAqLworI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfRE9XTkxPQURfVElNRU9VVCAgICAxNTAKKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX0RPV05MT0FEX0lOVF9GTEFHICAgMTUxCisjZGVmaW5lIFpNX0VSUl9GSVJNV0FSRV9SRUFEWV9USU1FT1VUICAgICAgIDE1MgorI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfV1JPTkdfVFlQRSAgICAgICAgICAxNTMKKworLyogRGVidWcgKi8KKyNkZWZpbmUgWk1fTFZfMCAgICAgMC8vRGVidWcgbGV2ZWwgMCwgRGlzYWJsZSBkZWJ1ZyBtZXNzYWdlCisjZGVmaW5lIFpNX0xWXzEgICAgIDEvL0RlYnVnIGxldmVsIDEsIFNob3cgbWluaW11bSBpbmZvcm1hdGlvbgorI2RlZmluZSBaTV9MVl8yICAgICAyLy9EZWJ1ZyBsZXZlbCAyLCBTaG93IG1lZGl1bSBtZXNzYWdlCisjZGVmaW5lIFpNX0xWXzMgICAgIDMvL0RlYnVnIGxldmVsIDMsIFNob3cgYWxsCisKKyNkZWZpbmUgWk1fU0NBTk1TR19MRVYgIFpNX0xWXzEKKyNkZWZpbmUgWk1fVFhNU0dfTEVWICAgIFpNX0xWXzAvL1pNX0xWXzAKKyNkZWZpbmUgWk1fUlhNU0dfTEVWICAgIFpNX0xWXzAKKyNkZWZpbmUgWk1fTU1NU0dfTEVWICAgIFpNX0xWXzAKKyNkZWZpbmUgWk1fREVTTVNHX0xFViAgIFpNX0xWXzAvL1pNX0xWXzAKKyNkZWZpbmUgWk1fQlVGTVNHX0xFViAgIFpNX0xWXzAvL1pNX0xWXzEKKyNkZWZpbmUgWk1fSU5JVE1TR19MRVYgIFpNX0xWXzAKKworI2RlZmluZSB6bV9tc2cwX3NjYW4obHYsIG1zZykgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX3NjYW4obHYsIG1zZywgdmFsKSBpZiAoWk1fU0NBTk1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9zY2FuKGx2LCBtc2csIHZhbCkgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF90eChsdiwgbXNnKSBpZiAoWk1fVFhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX3R4KGx2LCBtc2csIHZhbCkgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX3R4KGx2LCBtc2csIHZhbCkgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfcngobHYsIG1zZykgaWYgKFpNX1JYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9yeChsdiwgbXNnLCB2YWwpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9yeChsdiwgbXNnLCB2YWwpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX21tKGx2LCBtc2cpIGlmIChaTV9NTU1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfbW0obHYsIG1zZywgdmFsKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfbW0obHYsIG1zZywgdmFsKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9kZXMobHYsIG1zZykgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfZGVzKGx2LCBtc2csIHZhbCkgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9kZXMobHYsIG1zZywgdmFsKSBpZiAoWk1fREVTTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfYnVmKGx2LCBtc2cpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2J1ZihsdiwgbXNnLCB2YWwpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfYnVmKGx2LCBtc2csIHZhbCkgaWYgKFpNX0JVRk1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX2luaXQobHYsIG1zZykgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2luaXQobHYsIG1zZywgdmFsKSBpZiAoWk1fSU5JVE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9pbml0KGx2LCBtc2csIHZhbCkgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgWk1fTUFYX0FQX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgMiAgLyogTXVzdCA8PSA4ICovCisjZGVmaW5lIFpNX01BWF9XRFNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDYgIC8qIE11c3QgPD0gNiAqLworI2RlZmluZSBaTV9NQVhfU1RBX1NVUFBPUlQgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IDw9IDY0ICovCisKKy8qIFNUQSB0YWJsZSBzdGF0ZSAqLworI2RlZmluZSBaTV9TVEFURV9BVVRIICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQVRFX1BSRUFVVEggICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fU1RBVEVfQVNPQyAgICAgICAgICAgICAgICAgICAgICAgMworCisvKiBSYXRlIHNldCAqLworI2RlZmluZSBaTV9SQVRFX1NFVF9DQ0sgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1JBVEVfU0VUX09GRE0gICAgICAgICAgICAgICAgICAgIDEKKworLyogSFQgUFQgKi8KKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9NSVhFRF9NT0RFICAgICAgICAgMAorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX0dSRUVOX0ZJRUxEICAgICAgICAxCisKKy8qIEhUIGJhbmR3aWR0aCAqLworI2RlZmluZSBaTV9CQU5EV0lEVEhfMjBNSFogICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0JBTkRXSURUSF80ME1IWiAgICAgICAgICAgICAgICAgIDEKKworLyogTUlDIHN0YXR1cyAqLworI2RlZmluZSBaTV9NSUNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01JQ19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogSUNWIHN0YXR1cyAqLworI2RlZmluZSBaTV9JQ1ZfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0lDVl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogZGVmaW5pdGlvbiBjaGVjayAqLworI2lmIChaTV9NQVhfQVBfU1VQUE9SVCA+IDgpCitkZWZpbml0aW9uIGVycm9yLCBaTV9NQVhfQVBfU1VQUE9SVCA+IDgKKyNlbmRpZgorI2lmIChaTV9NQVhfQVBfU1VQUE9SVCA+IDY0KQorZGVmaW5pdGlvbiBlcnJvciwgWk1fTUFYX1NUQV9TVVBQT1JUID4gNjQKKyNlbmRpZgorCisvKiAgVHJhbnNtaXNzaW9uIFJhdGUgaW5mb3JtYXRpb24gKi8KKworLyogV0xBTiBmcmFtZSBmb3JtYXQgKi8KKyNkZWZpbmUgWk1fUExDUF9IRUFERVJfU0laRSAgICAgICAgICA1CisjZGVmaW5lIFpNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIICAgNgorI2RlZmluZSBaTV9USU1FU1RBTVBfT0ZGU0VUICAgICAgICAgIDAKKyNkZWZpbmUgWk1fQkVBQ09OX0lOVEVSVkFMX09GRlNFVCAgICA4CisjZGVmaW5lIFpNX0NBUEFCSUxJVFlfT0ZGU0VUICAgICAgICAxMAorCisvKiBSZWFzb24gQ29kZSAqLworLyogQW4gdW5zb2xpY2l0ZWQgbm90aWZpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgb2YgICAgICAgKi8KKy8qIHR5cGUgRGlzYXNzb2NhdGlvbiBvciBEZWF1dGhlbnRpY2F0aW9uIHdhcyBnZW5lcmF0ZWQuICovCisjaWZkZWYgWk1fUkVBU09OX0NPREUKKyNkZWZpbmUgWk1fV0xBTl9SRUFTT05fQ09ERV9VTlNQRUNJRklFRCAgIDEKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9ESVNBU09DX0RFQVVUSF9SRUFTT05fQ09ERSAgMjQKKyNlbmRpZgorCitzdHJ1Y3QgenNXbGFuTWFuYWdlbWVudEZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltaTV9QTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgZGFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBic3NpZFtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBib2R5WzFdOworfTsKKworc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1pNX1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBkYVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2FbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGJzc2lkW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHU4X3QgICAgICAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgICAgICBiZWFjb25JbnRlcnZhbFsyXTsKKyAgICB1OF90ICAgICAgICBjYXBhYmlsaXR5WzJdOworICAgIHU4X3QgICAgICAgIHNzaWRbWk1fTUFYX1NTSURfTEVOR1RIICsgMl07ICAgLy8gRUlEKDEpICsgTGVuZ3RoKDEpICsgU1NJRCgzMikKK30gOworCisjZGVmaW5lIHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyIHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIKKworc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcgoreworICAgIC8vdThfdCAgICAgIHBsY3BIZHJbWk1fUExDUF9IRUFERVJfU0laRV07CisgICAgdThfdCAgICAgICAgZnJhbWVDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGR1cmF0aW9uWzJdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MxW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMltaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczNbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNlcUN0cmxbMl07CisgICAgdTE2X3QgICAgICAgYWxnbzsKKyAgICB1MTZfdCAgICAgICBzZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzOworICAgIHU4X3QgICAgICAgIGNoYWxsZW5nZVRleHRbMjU1XTsgLy8gdGhlIGZpcnN0IDIgYnl0ZXMgYXJlIGluZm9ybWF0aW9uIElELCBsZW5ndGgKK307CisKK3N0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczJbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MzW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGNhcGFiaWxpdHlbMl07CisgICAgdTE2X3QgICAgICAgc3RhdHVzOworICAgIHUxNl90ICAgICAgIGFpZDsKKyAgICAvL3U4X3QgICAgICAgIHN1cHBvcnRlZFJhdGVzWzEwXTsKK307CisKK3N0cnVjdCB6c0ZyYWcKK3sKKyAgICB6YnVmX3QqIGJ1ZlsxNl07CisgICAgdTE2X3QgYnVmVHlwZVsxNl07CisgICAgdTE2X3Qgc2VxWzE2XTsKKyAgICB1OF90IGZsYWdbMTZdOworCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIYXJkd2FyZSByZWxhdGVkIGRlZmluaXRpb25zCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIFpNX01BQ19SRUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAweDFjMzAwMAorCisjZGVmaW5lIFpNX01BQ19SRUdfQVRJTV9XSU5ET1cgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MUMpCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX1BFUklPRCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MjApCisjZGVmaW5lIFpNX01BQ19SRUdfUFJFVEJUVCAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg1MjQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19NQUNfQUREUl9MICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYxMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19NQUNfQUREUl9IICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYxNCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0wgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjI0KQorI2RlZmluZSBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0ggICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjI4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkFTSUNfUkFURSAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzApCisjZGVmaW5lIFpNX01BQ19SRUdfTUFOREFUT1JZX1JBVEUgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzQpCisjZGVmaW5lIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MzgpCisjZGVmaW5lIFpNX01BQ19SRUdfQkFDS09GRl9QUk9URUNUICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2M2MpCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NDApCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfUEVfREVMQVkgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NEMpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY1OCkKKyNkZWZpbmUgWk1fTUFDX1JFR19TTklGRkVSICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY3NCkKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9VTkRFUlJVTgkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4Njg4KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1RPVEFMCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkEwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0NSQzMyCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkE0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0NSQzE2CQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkE4KQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0VSUl9VTkkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBQykKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9PVkVSUlVOCQkgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2QjApCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfRVJSX01VTAkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkJDKQorI2RlZmluZSBaTV9NQUNfUkVHX1RYX1JFVFJZCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkNDKQorI2RlZmluZSBaTV9NQUNfUkVHX1RYX1RPVEFMCQkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkY0KQorCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQ0tfRVhURU5TSU9OICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY5MCkKKyNkZWZpbmUgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY5OCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1NMT1RfVElNRSAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkYwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9MICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg3MDQpCisjZGVmaW5lIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9IICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg3MDgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzBfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzJfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwOCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIwQykKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzRfQ1cgICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQUMwX0FJRlMgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQUMyX0FJRlMgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIxOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1JFVFJZX01BWCAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QjI4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfVFhPUF9OT1RfRU5PVUdIX0lORElDQVRJT04gICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMzApCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEI0NCkKKyNkZWZpbmUgWk1fTUFDX1JFR19BQzNfQUMyX1RYT1AgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEI0OCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0FDS19UQUJMRSAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QzAwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0FERFIgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEODQpCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0xFTkdUSCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEODgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fUExDUCAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEQ5MCkKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fQ1RSTCAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEQ5NCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9IVDEgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4REEwKQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9IVDIgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4REE0KQorCisKKyNkZWZpbmUgWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKHJ4U3RhdHVzKSByeFN0YXR1cy0+VGFpbC5EYXRhLkVycm9ySW5kaWNhdGlvbiAmIFpNX0JJVF82CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICAgICAgICAgICAyNAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCAgICAgICAgICAzMCAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgICAgICAgICAgICAzMiAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUCArIFRZUEUKKyNlbHNlCisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gICAgICAgICAgIDE0CisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUICAgICAgICAgIDEyICAgIC8vIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyBTTkFQCisjZGVmaW5lIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCAgICAgICAgICAgIDE0ICAgIC8vIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyBTTkFQICsgVFlQRQorI2VuZGlmCisKKyNkZWZpbmUgWk1fQlNTX0lORk9fVkFMSURfQklUICAgICAgMHgwMQorI2RlZmluZSBaTV9CU1NfSU5GT19VUERBVEVEX0JJVCAgICAweDAyCisKKworCisKKworI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX1JYX1RJTUVPVVQgICAgICAweDAxCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fT1ZFUlJVTiAgICAgICAgIDB4MDIKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9ERUNSWVBUX0VSUk9SICAgMHgwNAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX0NSQzMyX0VSUk9SICAgICAweDA4CisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fQUREUl9OT1RfTUFUQ0ggIDB4MTAKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9DUkMxNl9FUlJPUiAgICAgMHgyMAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX01JQ19FUlJPUiAgICAgICAweDQwCisKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX0NDSyAgICAgICAgMHgwMAorI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfTU9EX1RZUEVfT0ZETSAgICAgICAweDAxCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9IVF9PRkRNICAgIDB4MDIKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX0RMX09GRE0gICAgMHgwMworI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfVE9UQUxfRVJST1IgICAgICAgICAweDgwCisKKworCisKKworI2RlZmluZSBaTV9NQVhfTEVEX05VTUJFUiAgICAgICAyCisKKyNkZWZpbmUgWk1fTEVEX0RJU0FCTEVfTU9ERSAgICAgMHgwCisjZGVmaW5lIFpNX0xFRF9MSU5LX01PREUgICAgICAgIDB4MQorI2RlZmluZSBaTV9MRURfTElOS19UUl9NT0RFICAgICAweDIKKyNkZWZpbmUgWk1fTEVEX1RSX09OX01PREUgICAgICAgMHgzCisjZGVmaW5lIFpNX0xFRF9UUl9PRkZfTU9ERSAgICAgIDB4NAorCisjZGVmaW5lIFpNX0xFRF9DVFJMX0ZMQUdfQUxQSEEgICAgICAweDEKKworc3RydWN0IHpzTGVkU3RydWN0Cit7CisgICAgdTMyX3QgICBjb3VudGVyOworICAgIHUzMl90ICAgY291bnRlcjEwMG1zOworICAgIHUxNl90ICAgbGVkTGlua1N0YXRlOworICAgIHUxNl90ICAgbGVkTW9kZVtaTV9NQVhfTEVEX05VTUJFUl07CisgICAgdTMyX3QgICB0eFRyYWZmaWM7CisgICAgdTMyX3QgICByeFRyYWZmaWM7CisgICAgdThfdCAgICBMRURDdHJsVHlwZTsKKyAgICB1OF90ICAgIExFREN0cmxGbGFnOyAgICAgICAgIC8vIENvbnRyb2wgRmxhZyBmb3IgdmVuZG9ycworICAgIHU4X3QgICAgTEVEQ3RybEZsYWdGcm9tUmVnOyAgLy8gQ29udHJvbCBGbGFnIGZvciB2ZW5kb3JzIGluIHJlZ2lzdHJ5Cit9OworCisKKy8vSEFMKyBjYXBhYmlsaXR5IGJpdHMgZGVmaW5pdGlvbgorI2RlZmluZSBaTV9IUF9DQVBfMTFOICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0gICAgIDB4MgorI2RlZmluZSBaTV9IUF9DQVBfMkcgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9IUF9DQVBfNUcgICAgICAgICAgICAgICAgICAgIDB4OAorCisjZW5kaWYgLyogI2lmbmRlZiBfV0xBTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ5ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZwpAQCAtMCwwICsxLDMyIEBACitjb25maWcgT1RVUworCXRyaXN0YXRlICJBdGhlcm9zIE9UVVMgODAyLjExbiBVU0Igd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBXTEFOXzgwMjExICYmIE1BQzgwMjExCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEF0aGVyb3MgODAyLjExbiBVU0IgaGFyZHdhcmU6CisJICAgICogVUI4MSAtIDJ4MiAyLjQgR0h6CisJICAgICogVUI4MiAtIDJ4MiAyLjQgR0h6IGFuZCA1IEdIegorCSAgICAqIFVCODMgLSAxeDIgMi40IEdIegorCisJICBUaGlzIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBjdXJyZW50bHkgb24gdGhlIG1hcmtldDoKKwkgIERsaW5rIERXQS0xNjBBMSwgTmV0Z2VhciBXTkRBMzEwMCBhbmQgV04xMTF2MiwgVFAtTGluaworCSAgVEwtV044MjFOLCBhbmQgQVZNIEZSSVRaIVdMQU4gTiBVU0IgU3RpY2suCisKKwkgIFRoaXMgZHJpdmVyIHJlcXVpcmVzIGl0cyBvd24gc3VwcGxpY2FudCBkcml2ZXIgZm9yCisJICB3cGFfc3VwcGxpY2FudCAwLjQuOC4gRm9yIHlvdXIgY29udmVuaWVuY2UgeW91IGNhbiBmaW5kIHRoZQorCSAgdGFyYmFsbCBoZXJlOgorCisJICBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvbWNncm9mL290dXMvd3BhX3N1cHBsaWNhbnQtMC40Ljhfb3R1cy50YXIuYnoyCisKKwkgIEJlZm9yZSBjb21waWxpbmcgd3BhX3N1cHBsaWNhbnQsIGVuc3VyZSB5b3VyIC5jb25maWcgaGFzIGF0CisJICBsZWFzdCB0aGUgZm9sbG93aW5nOgorCQlDT05GSUdfV0lSRUxFU1NfRVhURU5TSU9OPXkKKwkJQ09ORklHX0VBUF9XU0M9eQorCQlDT05GSUdfV1NDX0lFPXkKKwkJQ09ORklHX0RSSVZFUl9XRVhUPXkKKwkJQ09ORklHX0RSSVZFUl9PVFVTPXkKKworCSAgQWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbXBpbGUsIHlvdSBjYW4gdXNlIHRoZSBBdGhlcm9zIGRldmljZSBhcworCSAgc2hvd24gaW4gdGhlIGV4YW1wbGU6CisJICAkIHdwYV9zdXBwbGljYW50IC1Eb3R1cyAtaSA8YXRoZXJvcyBkZXZpY2UgZnJvbSBpZmNvbmZpZz4gLWMgL3BhdGgvdG8vd3BhX3N1cHBsaWNhbnQuY29uZiAtZAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmNjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDY3IEBACitvYmotJChDT05GSUdfT1RVUykJKz0gYXJ1c2JfbG54Lm8KKworRVhUUkFfQ0ZMQUdTICs9IC1EQU1BQworRVhUUkFfQ0ZMQUdTICs9IC1ER0NDSworRVhUUkFfQ0ZMQUdTICs9IC1ET0ZETQorRVhUUkFfQ0ZMQUdTICs9IC1EVFhRX0lOX0lTUgorRVhUUkFfQ0ZMQUdTICs9IC1EV0xBTl9IT1NUSUY9MCAjMDpVU0IsIDE6UENJCisKKyNUZXN0IE1vZGUKK0VYVFJBX0NGTEFHUyArPSAtRFpNX1VTQl9TVFJFQU1fTU9ERT0xCitFWFRSQV9DRkxBR1MgKz0gLURaTV9VU0JfVFhfU1RSRUFNX01PREU9MAorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fUENJX0RNQV9URVNUPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0xBUkdFUEFZTE9BRF9URVNUPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0ZXX0xPT1BfQkFDSz0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9MSU5VWF9UUEM9MQorI0VYVFJBX0NGTEFHUyArPSAtRFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKKworRVhUUkFfQ0ZMQUdTICs9IC1EWk1fSE9TVEFQRF9TVVBQT1JUCisjRVhUUkFfQ0ZMQUdTICs9IC1EZlRYX0dBSU5fT0ZETT0wCisjRVhUUkFfQ0ZMQUdTICs9IC1EWk1fQ09ORklHX0JJR19FTkRJQU4gLURCSUdfRU5ESUFOCitFWFRSQV9DRkxBR1MgKz0gLURaTV9IQUxQTFVTX0xPQ0sKK0VYVFJBX0NGTEFHUyArPSAtRFpNX09UVVNfTElOVVhfUEhBU0VfMgorCithcnVzYl9sbngtb2JqcyA6PSBcCisJdXNiZHJ2Lm8gXAorCXpkdXNiLm8gXAorCWlvY3RsLm8gXAorCXdyYXBfYnVmLm8gXAorCXdyYXBfbWVtLm8gXAorCXdyYXBfZXYubyBcCisJd3JhcF91c2IubyBcCisJd3JhcF9wa3QubyBcCisJd3JhcF9kYmcubyBcCisJd3JhcF9taXMubyBcCisJd3JhcF9zZWMubyBcCisJd3dyYXAubyBcCisJODAyMTFjb3JlL2NjbWQubyBcCisJODAyMTFjb3JlL2NoYi5vIFwKKwk4MDIxMWNvcmUvY2luaXQubyBcCisJODAyMTFjb3JlL2NtbS5vIFwKKwk4MDIxMWNvcmUvY21tYXAubyBcCisJODAyMTFjb3JlL2NtbXN0YS5vIFwKKwk4MDIxMWNvcmUvY2Z1bmMubyBcCisJODAyMTFjb3JlL2NvaWQubyBcCisJODAyMTFjb3JlL2N0a2lwLm8gXAorCTgwMjExY29yZS9jdHhyeC5vIFwKKwk4MDIxMWNvcmUvY2ljLm8gXAorCTgwMjExY29yZS9jcHNtZ3IubyBcCisJODAyMTFjb3JlL2NzY2FubWdyLm8gXAorCTgwMjExY29yZS9yYXRlY3RybC5vIFwKKwk4MDIxMWNvcmUvbGVkbWdyLm8gXAorCTgwMjExY29yZS9hbXNkdS5vIFwKKwk4MDIxMWNvcmUvY3dtLm8gXAorCTgwMjExY29yZS9jYWdnLm8gXAorCTgwMjExY29yZS9xdWV1ZS5vIFwKKwk4MDIxMWNvcmUvZnJlcWN0cmwubyBcCisJODAyMTFjb3JlL2N3ZXAubyBcCisJaGFsL2hwcncubyBcCisJaGFsL2hwbWFpbi5vIFwKKwloYWwvaHB1c2IubyBcCisJaGFsL2hwcmVnLm8gXAorCWhhbC9ocGZ3dWluaXQubyBcCisJaGFsL2hwZndidS5vIFwKKwloYWwvaHBmdzIubyBcCisJaGFsL2hwREtmd3UubyBcCisJaGFsL2hwZndzcGl1Lm8gXAorCWhhbC9ocGFuaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyMjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgY2xlYW51cHMKKwktIHBvcnQgdG8gaW4ta2VybmVsIDgwMjExIHN0YWNrCisJLSBwcm9wZXIgbmV0d29yayBkZXZlbG9wZXIgbWFpbnRhaW5lcgorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQKK0x1aXMgUm9kcmlndWV6IDxMdWlzLlJvZHJpZ3VlekBBdGhlcm9zLmNvbT4gYW5kIHRoZQorb3R1cy1kZXZlbEBsaXN0cy5tYWR3aWZpLXByb2plY3Qub3JnIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTJmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBhcGRiZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIERlYnVnIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19SRUFEICAgICAgICAgICAweDAxCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19XUklURSAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9EVU1QICAgICAgICAgICAweDAzCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19EVU1QICAgICAgICAgICAweDA1CisjZGVmaW5lIFpNX0lPQ1RMX1RYRF9EVU1QICAgICAgICAgICAweDA2CisjZGVmaW5lIFpNX0lPQ1RMX1JYRF9EVU1QICAgICAgICAgICAweDA3CisjZGVmaW5lIFpNX0lPQ1RMX01FTV9SRUFEICAgICAgICAgICAweDBCCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9XUklURSAgICAgICAgICAweDBDCisjZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUICAgICAgICAgICAweDEwCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUICAgICAgICAgICAweDExCisjZGVmaW5lIFpNX0lPQ1RMX1RFU1QgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFpNX0lPQ1RMX1RBTExZICAgICAgICAgICAgICAweDgxIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1JUUyAgICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFICAgICAgICAgICAweEExCisjZGVmaW5lIFpNX0lPQ1RMX0ZSQUcgICAgICAgICAgICAgICAweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4gICAgICAgICAgICAgICAweEEzCisjZGVmaW5lIFpNX0lPQ1RMX0tFWSAgICAgICAgICAgICAgICAweEE0CisjZGVmaW5lIFpNX0lPQ1RMX1JBVEUgICAgICAgICAgICAgICAweEE1CisjZGVmaW5lIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSAgICAweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVCAgICAgICAgICAweEE3CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQgICAgICAweEE4CisjZGVmaW5lIFpNX0lPQ1RMX0RVUkFUSU9OX01PREUgICAgICAweEE5CisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfS0VZICAgICAgICAweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERSAgICAgICAweEFCCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9TVFJFTkdUSCAgICAweEFDIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZICAgICAweEFEIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFICAgICAweEFFCisjZGVmaW5lCVpEQVBJT0NUTCAgICAgICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgemRhcF9pb2N0bCB7CisJdW5zaWduZWQgc2hvcnQgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXVuc2lnbmVkIGludCAgIGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgICB2YWx1ZTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVsweDEwMF07Cit9OworCisvKiBEZWNsYXJhdGlvbiBvZiBtYWNybyBhbmQgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIFdFUCBLZXlzICovCisKKyNpZiAwCisKKyNkZWZpbmUgU0tJUF9FTEVNIHsgXAorICAgIHdoaWxlKGlzeGRpZ2l0KCpwKSkgXAorICAgICAgICBwKys7IFwKK30KKworI2RlZmluZSBTS0lQX0RFTElNRVRFUiB7IFwKKyAgICBpZigqcCA9PSAnOicgfHwgKnAgPT0gJyAnKSBcCisgICAgICAgIHArKzsgXAorfQorCisjZW5kaWYKKworY2hhciBoZXgoY2hhcik7Cit1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cik7CisKK2NoYXIgKnByZ25hbWU7CisKK2ludCBzZXRfaW9jdGwoaW50IHNvY2ssIHN0cnVjdCBpZnJlcSAqcmVxKQoreworICAgIGlmIChpb2N0bChzb2NrLCBaREFQSU9DVEwsIHJlcSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGlvY3RsKFNJT0NHSUZNQVApOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBwcmduYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IHJlYWRfcmVnKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOworCisgICAgaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy96ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7CisgICAgLy9wcmludGYoICJyZWcgPSAlNHgsIHZhbHVlID0gJTR4XG4iLCB6ZHJlcS0+YWRkciwgemRyZXEtPnZhbHVlKTsKKworICAgIHJldHVybiAwOworfQorCisKK2ludCByZWFkX21lbShpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCit7CisgICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworICAgIHByaW50ZiggImR1bXAgbWVtIGZyb20gJXgsIGxlbmd0aCA9ICV4XG4iLCB6ZHJlcS0+YWRkciwgemRyZXEtPnZhbHVlKTsKKworICAgIGZvciAoaT0wOyBpPHpkcmVxLT52YWx1ZTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJTAyeCIsIHpkcmVxLT5kYXRhW2ldKTsKKyAgICAgICAgcHJpbnRmKCIgIik7CisKKyAgICAgICAgaWYgKChpPjApICYmICgoaSsxKSUxNiA9PSAwKSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Ki8KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgc29jazsKKyAgICBpbnQgYWRkciwgdmFsdWU7CisgICAgc3RydWN0IGlmcmVxIHJlcTsKKyAgICBjaGFyICphY3Rpb24gPSBOVUxMOworICAgIHN0cnVjdCB6ZGFwX2lvY3RsIHpkcmVxOworCisgICAgcHJnbmFtZSA9IGFyZ3ZbMF07CisKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiB1c2FnZSBpcyBcIiVzIDxpZm5hbWU+IDxvcGVyYXRpb24+IFs8YWRkcmVzcz5dIFs8dmFsdWU+XVwiXG4iLAorICAgICAgICAgICAgICAgIHByZ25hbWUsIHByZ25hbWUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwidmFsaWQgb3BlcmF0aW9uOiByZWFkLCB3cml0ZSwgbWVtLCByZWcsXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogdHhkLCByeGQsIHJtZW0sIHdtZW1cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICAgOiBkbWF0LCByZWd0LCB0ZXN0XG4iKTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHNjYW4sIENoYW5uZWwgU2NhblxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcnRzIDxkZWNpbWFsPiwgU2V0IFJUUyBUaHJlc2hvbGRcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGZyYWcgPGRlY2ltYWw+LCBTZXQgRnJhZ21lbnQgVGhyZXNob2xkXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICByYXRlIDwwLTI4PiwgMDpBVVRPLCAxLTQ6Q0NLLCA1LTEyOk9GRE0sIDEzLTI4OkhUXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBUQkQgbWl4IDwwIG9yIDE+LCBTZXQgMSB0byBlbmFibGUgbWl4ZWQgbW9kZVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZW5jLCA8MC0zPiwgMD0+T1BFTiwgMT0+V0VQNjQsIDI9PldFUDEyOCwgMz0+V0VQMjU2XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBza2V5IDxrZXk+LCBTZXQgV0VQIGtleVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdHhjbnQsIEdldCBUeFEgQ250XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkYWdjbnQsIEdldCBEZWFnZ3JlZ2F0ZSBDbnRcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGR1cm1vZGUgPG1vZGU+LCBTZXQgRHVyYXRpb24gTW9kZSAwPT5IVywgMT0+U1dcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc2tleSA8dXNlcj4gPGtleT5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGFlc21vZGUgPG1vZGU+XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB3bGFubW9kZSA8MCwxPiAwOlN0YXRpb24gbW9kZSwgMTpQSUJTUyBtb2RlXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICB0YWwgPDAsMT4sIEdldCBDdXJyZW50IFRhbGx5IEluZm8sIDA9PnJlYWQsIDE9PnJlYWQgYW5kIHJlc2V0XG4iKTsKKworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHN0cmNweShyZXEuaWZyX25hbWUsIGFyZ3ZbMV0pOworICAgIHpkcmVxLmFkZHIgPSAwOworICAgIHpkcmVxLnZhbHVlID0gMDsKKworICAgIC8qIGEgc2lsbHkgcmF3IHNvY2tldCBqdXN0IGZvciBpb2N0bCgpbGluZyBpdCAqLworICAgIHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKKyAgICBpZiAoc29jayA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ja2V0KCk6ICVzXG4iLCBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmIChhcmdjID49IDQpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiV4IiwgJmFkZHIpOworICAgIH0KKworICAgIGlmIChhcmdjID49IDUpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndls0XSwgIiV4IiwgJnZhbHVlKTsKKyAgICB9CisKKyAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICB6ZHJlcS52YWx1ZSA9IHZhbHVlOworCisgICAgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19SRUFEOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3cml0ZSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1dSSVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyeGQiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JYRF9EVU1QOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fUkVBRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid21lbSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkbWF0IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9ETUFfVEVTVDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRlc3QiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRhbCIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJydHMiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SVFM7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUlYX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImZyYWciKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJzY2FuIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TQ0FOOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9LRVk7CisKKyAgICAgICAgaWYgKGFyZ2MgPj0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzI5XTsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50IGtleUxlbjsKKyAgICAgICAgICAgIGludCBlbmNUeXBlOworCisgICAgICAgICAgICBrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CisKKyAgICAgICAgICAgIGlmIChrZXlMZW4gPT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsICZ0ZW1wWzBdLCAmdGVtcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDI2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlMZW4gPT0gNTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxMF0sICZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sICZ0ZW1wWzE0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzE1XSwgJnRlbXBbMTZdLCAmdGVtcFsxN10sICZ0ZW1wWzE4XSwgJnRlbXBbMTldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjBdLCAmdGVtcFsyMV0sICZ0ZW1wWzIyXSwgJnRlbXBbMjNdLCAmdGVtcFsyNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyNV0sICZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgbGVuZ3RoXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgemRyZXEuYWRkciA9IGtleUxlbi8yOworCisgICAgICAgICAgICBmb3IoaT0wOyBpPHpkcmVxLmFkZHI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZHJlcS5kYXRhW2ldID0gdGVtcFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgOiBLZXkgcmVxdWlyZWQhXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyYXRlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIGlmIChhZGRyID4gMjgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByYXRlLCByYW5nZTowfjI4XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JBVEU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImVuYyIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciA+IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBlbmNyeXB0aW9uIG1vZGUsIHJhbmdlOjB+M1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZHIgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgYWRkciA9IDU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWRkciA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyID0gNjsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInR4Y250IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfVFhDTlQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRhZ2NudCIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgdmFsdWUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImR1cm1vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIER1cmF0aW9uIG1vZGUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0RVUkFUSU9OX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc2tleSIpKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0ZW1wWzE2XTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBzc2NhbmYoYXJndls0XSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sICZ0ZW1wWzE1XSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CisgICAgICAgIH0KKworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19LRVk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc21vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfTU9ERTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid2xhbm1vZGUiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGFjdGlvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcmVxLmlmcl9kYXRhID0gKGNoYXIgKikmemRyZXE7CisgICAgc2V0X2lvY3RsKHNvY2ssICZyZXEpOworCitmYWlsOgorICAgIGV4aXQoMCk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgYXNjdG9oZXgoY2hhciAqc3RyKQoreworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisKKyAgICB2YWx1ZSA9IGhleCgqc3RyKSAmIDB4MGY7CisgICAgdmFsdWUgPSB2YWx1ZSA8PCA0OworICAgIHN0cisrOworICAgIHZhbHVlIHw9IGhleCgqc3RyKSAmIDB4MGY7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2NoYXIgaGV4KGNoYXIgdikKK3sKKyAgICBpZihpc2RpZ2l0KHYpKQorICAgICAgICByZXR1cm4gdiAtICcwJzsKKyAgICBlbHNlIGlmKGlzeGRpZ2l0KHYpKQorICAgICAgICByZXR1cm4gKHRvbG93ZXIodikgLSAnYScgKyAxMCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvYXRocl9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZjc4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogYXRocl9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBXUEEgcmVsYXRlZCBmdW5jdGlvbiBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9BVEhSX0NPTU1PTl9ICisjZGVmaW5lIF9BVEhSX0NPTU1PTl9ICisKKyNkZWZpbmUgWkRfSU9DVExfV1BBCQkJKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgWkRfSU9DVExfUEFSQU0JCQkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBaRF9JT0NUTF9HRVRXUEFJRQkJKFNJT0NERVZQUklWQVRFICsgMykKKyNkZWZpbmUgWkRfUEFSQU1fUk9BTUlORwkJMHgwMDAxCisjZGVmaW5lIFpEX1BBUkFNX1BSSVZBQ1kJCTB4MDAwMgorI2RlZmluZSBaRF9QQVJBTV9XUEEJCQkweDAwMDMKKyNkZWZpbmUgWkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTCTB4MDAwNAorI2RlZmluZSBaRF9QQVJBTV9EUk9QVU5FTkNSWVBURUQJMHgwMDA1CisjZGVmaW5lIFpEX1BBUkFNX0FVVEhfQUxHUwkJMHgwMDA2CisKKyNkZWZpbmUgWkRfQ01EX1NFVF9FTkNSWVBUX0tFWQkJMHgwMDAxCisjZGVmaW5lIFpEX0NNRF9TRVRfTUxNRQkJCTB4MDAwMgorI2RlZmluZSBaRF9DTURfU0NBTl9SRVEJCQkweDAwMDMKKyNkZWZpbmUgWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlQJMHgwMDA0CisjZGVmaW5lIFpEX0NNRF9HRVRfVFNDCQkJMHgwMDA1CisKKyNkZWZpbmUgWkRfRkxBR19TRVRfVFhfS0VZICAgICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBaRF9HRU5FUklDX0VMRU1FTlRfSERSX0xFTiBcCisoKGludCkgKCYoKHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gKikgMCktPnUuZ2VuZXJpY19lbGVtLmRhdGEpKQorCisjZGVmaW5lIFpEX0NSWVBUX0FMR19OQU1FX0xFTgkJMTYKKyNkZWZpbmUgWkRfTUFYX0tFWV9TSVpFCQkJMzIKKyNkZWZpbmUgWkRfTUFYX0dFTkVSSUNfU0laRQkJNjQKKworI2RlZmluZSBJRUVFODAyMTFfQUREUl9MRU4JCTYKKyNkZWZpbmUgSUVFRTgwMjExX01BWF9JRV9TSVpFCQkyNTYKKworI2lmZGVmIFpNX0VOQUxCRV9XQVBJCisjZGVmaW5lIFpNX0NNRF9XQVBJX1NFVFdBUEkgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFpNX0NNRF9XQVBJX0dFVFdBUEkgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFpNX0NNRF9XQVBJX1NFVEtFWSAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFpNX0NNRF9XQVBJX0dFVEtFWSAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFpNX0NNRF9XQVBJX1JFS0VZICAgICAgICAgICAgICAgMHgwMDA1CisKKyNkZWZpbmUgWk1fV0FQSV9XQUlfUkVRVUVTVCAgICAgICAgICAgICAweDAwZjEKKyNkZWZpbmUgWk1fV0FQSV9VTklDQVNUX1JFS0VZICAgICAgICAgICAweDAwZjIKKyNkZWZpbmUgWk1fV0FQSV9TVEFfQUdJTkcgICAgICAgICAgICAgICAweDAwZjMKKyNkZWZpbmUgWk1fV0FQSV9NVUxUSV9SRUtFWSAgICAgICAgICAgICAweDAwZjQKKworI2RlZmluZSBaTV9XQVBJX0tFWV9TSVpFICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFpNX1dBUElfSVZfTEVOICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisvKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLworCitzdHJ1Y3QgYXRocl93bGFuX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbWkRfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXUzMiBmbGFnczsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVtaRF9NQVhfS0VZX1NJWkVdOworCQl9IGNyeXB0OworCQlzdHJ1Y3QgeworCQkJdTMyIGZsYWdzX2FuZDsKKwkJCXUzMiBmbGFnc19vcjsKKwkJfSBzZXRfZmxhZ3Nfc3RhOworCQlzdHJ1Y3QgeworCQkJdTggbGVuOworCQkJdTggZGF0YVtaRF9NQVhfR0VORVJJQ19TSVpFXTsKKwkJfSBnZW5lcmljX2VsZW07CisJCXN0cnVjdCB7CisjZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCisjZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKKwkJCXUxNiBjbWQ7CisJCQl1MTYgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IHNzaWRfbGVuOworCQkJdTggc3NpZFszMl07CisJCX0gc2Nhbl9yZXE7CisJfSB1OworfTsKKworc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSB7CisJdTggd3BhX21hY2FkZHJbSUVFRTgwMjExX0FERFJfTEVOXTsKKwl1OCB3cGFfaWVbSUVFRTgwMjExX01BWF9JRV9TSVpFXTsKK307CisKKyNpZmRlZiBaTV9FTkFMQkVfV0FQSQorc3RydWN0IGF0aHJfd2FwaV9wYXJhbSB7CisJdTE2IGNtZDsKKwl1MTYgbGVuOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworCQkJdTggcmVzZXJ2ZWQ7CisJCQl1OCBrZXlpZDsKKwkJCXU4IGtleVtaTV9XQVBJX0tFWV9TSVpFXTsKKwkJfSBjcnlwdDsKKwkJc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4IHdhcGlfcG9saWN5OworCQl9IGluZm87CisJfSB1OworfTsKKworc3RydWN0IGF0aHJfd2FwaV9zdGFfaW5mbworeworCXUxNgltc2dfdHlwZTsKKwl1MTYJZGF0YWxlbjsKKyAgICAJdTgJc3RhX21hY1tFVEhfQUxFTl07CisJdTgJcmVzZXJ2ZV9kYXRhWzJdOworICAgIAl1OAlnc25bWk1fV0FQSV9JVl9MRU5dOworCXU4CXdpZVsyNTZdOworfTsKKyNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocERLZnd1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGM2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jCkBAIC0wLDAgKzEsODMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REUzRTdGRkMsIDB4RTExNEQ3M0UsCisweDFFMTNENDNFLCAweDFFNEM0NzBCLCAweDAwMDlCMDE3LCAweDk1NkVFNjAwLAorMHhDODQwNjBFMiwgMHgyRjAyOEYwMywgMHg4RkY5MzY1MiwgMHhENDM4NzYwMSwKKzB4NEUwQkRFMzgsIDB4RDQzODAwMDksIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MzcsCisweDdGMDQwMDA5LCAweEEwMzY0RjI2LCAweDRGMjI2RUY2LCAweDQxMEJEMTM0LAorMHhENDM0MDAwOSwgMHgwMDA5NDQwQiwgMHg0NTBCRDUzMywgMHhENzMzMDAwOSwKKzB4RDIzM0UxRkYsIDB4MjcxMjYxMUQsIDB4RDQzMjUwMjksIDB4RTFGRkNCMDEsCisweDEyMDlFNTAxLCAweDEyMTEyMjEyLCAweEQ1MkYyNDUyLCAweEQyMkY5NzQwLAorMHhFNzAwMjU3MiwgMHhENDJGRDEyRSwgMHgyMjcwRDYyRiwgMHgyMTcyRTIwMSwKKzB4MjYyMDI0MjAsIDB4RTRGRkQ2MkQsIDB4RTYwMDI2NDEsIDB4RTEwNEQ1MkMsCisweDYwNjM2NjZELCAweDYyNkQ3NjAxLCAweDMyMTI0MDAwLCAweDA1NDU4RkY4LAorMHgwMDBCNEYyNiwgMHhFQUM4MDAwOSwgMHhEQjI2NkFBQywgMHhERDI3REMyNiwKKzB4RDgyOERFMjcsIDB4NEMwQkU5MDEsIDB4NEQwQjAwMDksIDB4NEUwQjAwMDksCisweDYwQjIwMDA5LCAweDg5MDc4ODAxLCAweDYyNDJENDIzLCAweDg5MDMzMkE2LAorMHg2MDUwRDUyMiwgMHg4QkVFODgwMSwgMHgyQjkyRDQxRiwgMHgyNjY4NjY0MiwKKzB4NDgwQjg5RTksIDB4RDUxRDAwMDksIDB4QUZFNEUyMDAsIDB4MjcxMDI1MjAsCisweDAwMDAwRkEwLCAweDAwMUMwMDFDLCAweDAwMjAwRUQ0LCAweDAwMDBCMzhFLAorMHgwMDIwMkY5MCwgMHgwMDIwMTM1NiwgMHgwMDIwMkY5QywgMHgwMDIwMkZCNCwKKzB4MDAyMDEzMTQsIDB4MDAyMDE0MTIsIDB4MDAyMDBFRjgsIDB4MDAxQzM1MTAsCisweDAwMUMzNjI0LCAweDAwMUUyMTJDLCAweDAwMjAyRjAwLCAweDAwMjAyQTlDLAorMHgwMDIwMkYwOCwgMHgwMDIwMkYxNCwgMHgwMDIwMkYyMCwgMHgwMDIwMkYyMiwKKzB4MDAyMDJGMjYsIDB4MDAxQzEwMjgsIDB4MDAyMDEyMjAsIDB4MDAyMDI5NEMsCisweDAwMjAxRDEwLCAweDAwMjAxRUM4LCAweDAwMjAzMjIwLCAweDAwMjAyRjI0LAorMHgyRkI2MkY5NiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERTk0N0Y4MCwKKzB4NjFFMEUwMjQsIDB4MEYxNEQ0OTMsIDB4NzEwMTYxRTMsIDB4RDc5MjYyMTAsCisweDQ3MEJFMDI4LCAweEQ1OTEwRjI0LCAweDAwMDk0NTBCLCAweDZEMDMyMDA4LAorMHgxRjBCOEYxMSwgMHhENDhGREM4RSwgMHhERDhGNjdDMCwgMHg2NTdDNEQwQiwKKzB4REQ4RkQxOEUsIDB4NkI5QzY5MTAsIDB4NDIwODYyQjMsIDB4MzJCODQyMDgsCisweDNEMkM0MjA4LCAweEUwMjgxRkRCLCAweEU1ODAwNEZDLCAweDYwNEM2NkUyLAorMHgzMDUwNjU1QywgMHgyRDYyOEYxMywgMHgwMUZDRTAyNCwgMHg2NDFDRTUwMCwKKzB4NjI1RERFODQsIDB4OEIwMTMyNDMsIDB4MDAwOUEzOUUsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweEFGRjI3NTAxLCAweDIwMDg4MDk0LAorMHhFMDI0OEIxMywgMHhFNTAwMDFGQywgMHhBMDA5REU3QSwgMHg2NTVENjQxQywKKzB4MzJFQzYyNTMsIDB4NkM1MzZCMjIsIDB4M0NEQzY3QjIsIDB4NzUwNDFDNzEsCisweDMyNDM2MjVELCAweEEzN0Y4QkYzLCAweDg4MDEyRDEwLCAweEUwMjQ4QjE2LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2RSwgMHg4QjAxMzI3MywKKzB4MDAwOUEzNzIsIDB4NkNFMzY0NEQsIDB4N0MwNDY5NDMsIDB4MzlFQzZCNDMsCisweDY1OTIzQkNDLCAweDc0MDg2REIyLCAweDI1RDJBRkVGLCAweDhCMTk4ODA0LAorMHgwMUZDRTAyNCwgMHgyRDcwRTcwMCwgMHgxRkQ4NkQxQywgMHg2MjdEREU2MSwKKzB4OEIwMTMyRDMsIDB4MDAwOUEzNTgsIDB4NkI3MzY3N0QsIDB4M0JFQzYxRTMsCisweDcxMDQ2NEIyLCAweDNDMUM2QzczLCAweDY5NDI2NUMyLCAweDI5NTk3NzA4LAorMHgyNDkyQUZFRCwgMHg4QjE4ODgwNSwgMHgwMUZDRTAyNCwgMHgyRDQwRTQwMCwKKzB4REU1NDY3MUMsIDB4MzI3MzYyNEQsIDB4QTMzRDhCMDEsIDB4NjQ0RDAwMDksCisweDZCRTM2RDQzLCAweDY1RDIzREVDLCAweDYxNDM3QjA0LCAweDZDMTIzMUJDLAorMHg3NDA4Njk1MiwgMHhBRkVEMjlDQiwgMHg4ODMxMjU5MiwgMHhERTRBOEIyMCwKKzB4NjVFNkRCNEEsIDB4NjFFNkRDNEEsIDB4NjdFMkQ5NEEsIDB4NjJFMjdFMDQsCisweDFGRUM3RUU4LCAweDdFMDQ2NEUyLCAweDZFRTIxRkVELCAweDVCRkQyQkUwLAorMHg2MEIyN0IwNCwgMHhDOTAxMUZCRSwgMHg2QkIyMkMwMCwgMHgyOUIwNEIwOSwKKzB4REM0MTJGMjYsIDB4NjYxMzRDMEIsIDB4RTIwMDdGMDQsIDB4MkQyMEEzMEMsCisweDhCMjE4ODMwLCAweEQ5MzlERTM4LCAweEUwNjQ2NUU2LCAweDcyMDQ2MkUzLAorMHg2NzI2NjZFMiwgMHg2RTIzREMzNiwgMHg2MjIyN0VFOCwgMHg2QkUyNjFFNiwKKzB4MjlCMDFGRUYsIDB4N0UwNDBGMTYsIDB4QzkwMTYwRTIsIDB4NkVFMjJDMDAsCisweDRFMDlEQzMwLCAweDJGMjYyQ0UwLCAweEQxMzBFMDY4LCAweDA0RkU0MTBCLAorMHhFMjAwN0YwNCwgMHgyRDIwQTJFOCwgMHg4QjA1ODgzMywgMHg0RTBCREUyQywKKzB4RTEwMDAwMDksIDB4MkQxMEEyRTAsIDB4ODkwMTg4MjgsIDB4MDAwOUExMDYsCisweEUxNDNERTIwLCAweEUwNDA2MkUxLCAweDMyMTc2MjJELCAweDBGRTY4RjA0LAorMHg2MDIzRTI0MCwgMHgyNjIxMDZGRSwgMHg4QjAxMzIxNywgMHgwMDA5QTBFRiwKKzB4MDJGRUUwNDAsIDB4ODUyMUU0MDEsIDB4OEIwMTMwNDYsIDB4MDAwOUEwRTcsCisweEU1MDFFMDQwLCAweDJENTAwN0ZFLCAweDY0NzFCMkM3LCAweDA5RkVFMDQwLAorMHg2MjkxRTE0MywgMHg2NTJERTA2OCwgMHg4RDZCMzUxNywgMHhFNjQwMEY1NiwKKzB4OEIyNzM1NjMsIDB4RTA0OEU2MDAsIDB4RTExQTBGNjUsIDB4NzJDMEEwMzEsCisweDAwMTE3ODAwLCAweDAwMjAyRkI4LCAweDAwMjAxMzU2LCAweDAwMjAyNDgwLAorMHgwMDIwMkYxQSwgMHgwMDIwMkZCQywgMHgwMDIwMTNBMiwgMHgwMDIwMkYxOSwKKzB4MDAyMDJCNDAsIDB4MDAxMTc4MDQsIDB4MDAxMTc4MTAsIDB4MDAyMDJGMTUsCisweDAwMjAyRjE2LCAweDAwMjAyRjE3LCAweDAwMjAwQjg0LCAweDAwMjAwQkQ4LAorMHgwMDIwMEJENCwgMHg0MTIxNjE1MywgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwKKzB4NDUyMTQ1MjEsIDB4NjA1MzQ1MjEsIDB4NjYwM0M5MDMsIDB4MEY2NUUwNDgsCisweEUwMDc3MTE4LCAweEUwNDQyMjA5LCAweDY0MUQwRjI1LCAweDY1RjNFMDRDLAorMHgwRjQ2QjMxNCwgMHgwNEZERTA0OCwgMHgwQkZERTA0NCwgMHg2MUJENjc0RCwKKzB4NDEwODQ3MDgsIDB4MEYxNkUwNTAsIDB4RDI5MzYwNzMsIDB4NDIwQjA5RkUsCisweDZDMDdFMDBGLCAweDYwNzMyOUM5LCAweEUwNDAwRjk2LCAweDY1RjMwRUZFLAorMHg2RDBEODVFMiwgMHgwMUZFRTA1MCwgMHg2MEQzNDIwQiwgMHg2MDczMjkwQiwKKzB4RTA0QzBGOTYsIDB4MDRGRUIyRDksIDB4MDZGRUUwNDAsIDB4NjI2MUUwNjgsCisweDBGNTY2NTJELCAweDM1NjNFNjQwLCAweEUwMDA4OTRFLCAweDYwMjM4MUY4LAorMHg0MDA4QzkwMywgMHg2QjAzNDAwMCwgMHhFMDU0NjEwMywgMHhFMDU4MEZCNiwKKzB4RUNGRkREN0QsIDB4NkNDQzBGRjYsIDB4MEZENkUwNkMsIDB4NEQwQjYwQzMsCisweDQyMjE2MjUzLCAweDQyMjE0MjIxLCAweDY0MjM0MjIxLCAweDMyNEM0MjAwLAorMHhFMDVDNkUwNywgMHg0NTIxNDIwMCwgMHhFMDQwMEZFNiwgMHgwQkZFNDUyMSwKKzB4QzkwMzYwNTMsIDB4MzBGQzQwMDgsIDB4NkQwMzdCMDYsIDB4ODVGODFGMDUsCisweDZDMkQxRkI3LCAweDFGQzY2RTAzLCAweDBGQzZFMDYwLCAweDA1RkVFMDU4LAorMHg2NEMzQjJCNCwgMHgzM0ZDRTM1NCwgMHg1NjMyNjJEMiwgMHgyMjY5NjEzMiwKKzB4NjdCNDJEMjIsIDB4NDkwQjU5MzYsIDB4MjIwQjYwN0MsIDB4MDVGRUUwNTgsCisweDY0QzMyRDIyLCAweDdFMDFCMjg5LCAweEU3MDY2MkVELCAweDhGRTMzMjczLAorMHhFMDQwN0MwMSwgMHg2MjYxMDZGRSwgMHgwNkZFRTA0MCwgMHg4NTYxNDIwMCwKKzB4MzAyQzc2MEMsIDB4NjEwMzcwMUIsIDB4NjRGM0U1MDAsIDB4NzUwMUU3MDQsCisweDZCNUQ2OTY2LCAweDI0OTIzQjczLCAweDc0MDQ4RkY5LCAweEIyNkM2NUYzLAorMHhFMDQwNjQxRCwgMHhCMjA1MDZGRSwgMHhBMURENjQ2MSwgMHhENDRGMDAwOSwKKzB4RTIwMUQ3NEYsIDB4MkQyMDQ3MEIsIDB4MDAwOUExRDYsIDB4OEIwNzg4MjksCisweEVDMDBERTRDLCAweDYxRTIyREMwLCAweDY0MURCMUQ3LCAweDAwMDlBMUNDLAorMHg2MjJDRTI4MSwgMHg4QjAxMzAyMCwgMHgwMDA5QTExOCwgMHgwNkZDRTAyOCwKKzB4RTY4MjYyNkMsIDB4MzI2MDY2NkMsIDB4QTBFRThCMDEsIDB4RTY4MzAwMDksCisweDMyNjA2NjZDLCAweEEwREM4QjAxLCAweEU2OTAwMDA5LCAweDMyNjA2NjZDLAorMHhBMEQwOEIwMSwgMHhFNjkxMDAwOSwgMHgzMjYwNjY2QywgMHhBMEI5OEIwMSwKKzB4RTZCMDAwMDksIDB4MzI2MDY2NkMsIDB4QTA3RjhCMDEsIDB4RTZCQjAwMDksCisweDMyNjA2NjZDLCAweEU2OTI4OTIwLCAweDMyNjA2NjZDLCAweEU0MDA4QjE0LAorMHhFQjA0RDUzMSwgMHg1MjUxNjY1MiwgMHg4QjA3MzYyMCwgMHg2MjRENzQwMSwKKzB4OEZGNzMyQjcsIDB4RTYwMDc1MDgsIDB4NTJGQkEwMDIsIDB4RTYwMTUyRkIsCisweEU2MDQxMjYxLCAweDIyNjBBMTg4LCAweEQyMjlENDI4LCAweEQ0Mjk2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTE4MCwgMHhFMTAwRTY3MCwgMHg2MDEzMzZGQywKKzB4RTAyNDgxNjIsIDB4MEJGQ0QyMUYsIDB4NkJCQzY3MjIsIDB4MjY3MjdCRkMsCisweEVCMDQxNkIyLCAweDA2RkVFMDc4LCAweDMyNjM2MjFELCAweEExNkI4QjAxLAorMHhERTFEMDAwOSwgMHgzMUVDNjExRCwgMHhENDFDNkUxMiwgMHg0MTBCRDExNCwKKzB4RTA3MDAwMDksIDB4NDUwQkQ1MUEsIDB4RDQxQTA0RkUsIDB4NDIwQkQyMTAsCisweEQyMTcwMDA5LCAweDY0RTM0MjBCLCAweEQ2MERENDE3LCAweDAwMDk0NjBCLAorMHgwNUZFRTA3MCwgMHgwMUZERTA3NCwgMHg2MTFERTYwMCwgMHg2MjUzMzUxQywKKzB4MzI2QzY2NkQsIDB4MjJFMDc2MDEsIDB4MzJCMzYyNkQsIDB4NEUxOThGRjcsCisweEUwNzQ3MTA0LCAweDBGMTVBRkNFLCAweDAwMjAyOUY4LCAweDAwMjAyRkRDLAorMHgwMDIwMTM1NiwgMHgwMDExNzgwNCwgMHgwMDIwMkIxMCwgMHgwMDExNzgwMCwKKzB4MDAyMDEzQTIsIDB4MDAyMDMwMTQsIDB4MDAxMTc4MDgsIDB4MDAyMDJGRjQsCisweDAwMjAxMzlBLCAweDAwMjAzMDA4LCAweDAwMjAzMDEwLCAweDAyRkNFMDI0LAorMHg2NzJDRTA3QywgMHhFQzAwMEY3NiwgMHhFMDdDRUIwNCwgMHg2MkNEMDdGRSwKKzB4OEIwMTMyNzMsIDB4MDAwOUExMTgsIDB4NkNDREQ3QjksIDB4MzU3QzY1QzMsCisweDYyQzM3NzA0LCAweEQ0QjczMjdDLCAweDZENTJEN0I3LCAweDZFMjI0NzBCLAorMHg0NzBCRDdCNiwgMHhENEI2NjREMywgMHg0MjBCRDJCMywgMHhEMkIzMDAwOSwKKzB4NjRFMzQyMEIsIDB4RDZCMEQ0QjMsIDB4MDAwOTQ2MEIsIDB4NjdEM0U2MDAsCisweDM3NkM2NjZELCAweDYyNkQ3NjAxLCAweDI3RTAzMkIzLCAweDRFMTk4RkY3LAorMHg3QzA4QUZEMywgMHg2MjEyRDFBNiwgMHgyMjI4NjIyQywgMHhEMkFBOEIwNCwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyQTgsIDB4NTZGQjAwMDksCisweEEwRTFFMjAwLCAweEIxQTYyNjIwLCAweDU2RkIwMDA5LCAweEEwREJFMjAwLAorMHg1MkZCMjYyMCwgMHhFNTAwRDY5QSwgMHg2NTYyMjI1MCwgMHg3NjA0RDJBMCwKKzB4NjI2MjIyNTIsIDB4QTBDRkQ2OUYsIDB4NTZGQjI2MjAsIDB4MjYxMEUxMjQsCisweDUyMTdEMTlELCAweDUyMTgxNjIxLCAweDUyMTkxNjIyLCAweDUyMUExNjIzLAorMHg1NTFCMTYyNCwgMHgxNjU1RTIwMCwgMHgxNjU2NTUxQywgMHgxNjU3NTUxRCwKKzB4MTY1ODU1MUUsIDB4MTY1OTU1MUYsIDB4MTEyODExMjcsIDB4MTEyQTExMjksCisweDExMkMxMTJCLCAweDExMkUxMTJELCAweDExMkZBMEFFLCAweEQ2OEZEMThFLAorMHg2MjYyRTA0MCwgMHg3NjA0NjUxMiwgMHgyMTUyMzUyQywgMHg1NTExNjI2NiwKKzB4MTE1MTM1MkMsIDB4NjI2MjY1NjMsIDB4NzUwODU2MTIsIDB4MTE2MjM2MkMsCisweDU2MTM2MjUyLCAweDM2MkM3NUVDLCAweDYyNTIxMTYzLCAweDc1MTA1NjE0LAorMHgxMTY0MzYyQywgMHg2MjUyNjY1MywgMHg3NjEwNTUxNSwgMHgxMTU1MzUyQywKKzB4NTYxNjYyNjIsIDB4MzYyQ0Q1N0UsIDB4NjI1NjExNjYsIDB4MzYyQzU2MTcsCisweDY2NTMxMTY3LCAweDU1MTg2MjUyLCAweDM1MkM3NjA0LCAweDYyNjYxMTU4LAorMHgzNTJDNTUxOSwgMHg2NTYzMTE1OSwgMHg1NjFBNjI2MiwgMHgzNjJDNzUwNCwKKzB4NjI1MjExNkEsIDB4NzUwNDU2MUIsIDB4MTE2QjM2MkMsIDB4NTYxQzYyNTYsCisweDExNkMzNjJDLCAweDU2MUQ2MjU2LCAweDExNkQzNjJDLCAweDYyNTI2NjUzLAorMHg3NjA0NTUxRSwgMHgxMTVFMzUyQywgMHg1NjFGNjI2MiwgMHgzNjJDRDU2OSwKKzB4NjI1MjExNkYsIDB4NzU5NDA2MUUsIDB4MDE2NjM2MkMsIDB4NjY1M0UwNDQsCisweDA1MUU2MjUyLCAweDM1MkM3NjQ0LCAweEUwNDgwMTU2LCAweDA2MUU2MjYyLAorMHgwMTY2MzYyQywgMHhFMDU0RDY2MCwgMHgwNTFFNjI2MiwgMHgzNTJDNDIyOSwKKzB4NzYwNDAxNTYsIDB4RTA1ODYyNjIsIDB4NDIyOTA2MUUsIDB4MDE2NjM2MkMsCisweEUyMzg1NkZCLCAweEUwNDQyNjIwLCAweEUwNDgwMjFFLCAweDYyMTIxNjIxLAorMHg1NTExMTYyMiwgMHgxNjUzRTIwMCwgMHgxNjU0NTUxMiwgMHgxNjU1NTUxNSwKKzB4MTY1NjU1MTMsIDB4MTY1NzU1MTYsIDB4RTA0MDA1MUUsIDB4MDUxRTE2NTgsCisweDE2NTlFMDUwLCAweDE2NUE1NTE0LCAweEUwNEMwNTFFLCAweDA1MUUxNjVCLAorMHgxNjVDRTA1NCwgMHhFMDU4MDUxRSwgMHgwNTFFMTY1RCwgMHgxNjVFRTA0NCwKKzB4RTA0ODAxMjYsIDB4MTEyMTIxMjIsIDB4MTEyNTExMjIsIDB4MTEyNjExMjMsCisweEUwNDAwMTI2LCAweEUwNTAwMTI2LCAweDAxMjYxMTI0LCAweDAxMjZFMDRDLAorMHgwMTI2RTA1NCwgMHgwMTI2RTA1OCwgMHgzRjNDOTM1OCwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4NEYyMjY5RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzM0LCAweEQ0MzQ2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0MkYsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzI2MzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIyNSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMjEsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUxQywgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUxODQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDAwMDAwMDgwLAorMHgwMDExNzgwNCwgMHgwMDIwMkZGNCwgMHgwMDIwMTM1NiwgMHgwMDIwMTM5QSwKKzB4MDAyMDMwMDgsIDB4MDAyMDMwMTAsIDB4MDAyMDBDMzgsIDB4MDAyMDBDMTIsCisweDAwMjAyRjAwLCAweDAwMjAyRjE0LCAweDAwMjAyQUE0LCAweDAwMUMzNkEwLAorMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwgMHgwMDFDMzcwNCwKKzB4MDAyMDI5RjgsIDB4MDAxQzM3M0MsIDB4NDYxOEU2ODAsIDB4RDUyRjQ2MjgsCisweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LCAweDdGRkM0RjIyLAorMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyOSwgMHg1NEUxMTYxNSwKKzB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsIDB4MTY3ODZFRjIsCisweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2QzUzREQxRSwgMHg2RTQzQkZENiwgMHgyREUyQkY5NSwKKzB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsCisweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDYxNjM2Q0Y2LAorMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwKKzB4MDAwQjhCRjksIDB4NEYyMjAwMDksIDB4RDEwRkQ0MEUsIDB4MDAwOTQxMEIsCisweEQ0MEZEMjBFLCAweEU1MDU2MDIyLCAweDIyMDJDQjIwLCAweEQ1MEQyNDUyLAorMHg0NTBCRTcwMCwgMHhENzBDMjQ3MiwgMHgwMDA5NDcwQiwgMHhFNjAxRDEwQiwKKzB4MjE2MkQyMEIsIDB4NEYyNjQ2MTgsIDB4MjI2MjAwMEIsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDAwMjAzMDI4LCAweDAwMjAxMzU2LCAweDAwMUMzNTAwLAorMHgwMDFENDAwNCwgMHgwMDIwMTNDQywgMHgwMDIwMEVGOCwgMHgwMDFFMjEyQywKKzB4MDAxQzNEMzAsIDB4MDAwOUExQTksIDB4MkZFNjJGRDYsIDB4REQ4RjRGMjIsCisweEEwMDQ5RUE3LCAweEQ0OEUwMDA5LCAweDQyMEJEMjhFLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhBRDQ4QiwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4ODAwMDksIDB4NDIwQkQyODUsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODFENDg0LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDgxMDAwOSwKKzB4NDIwQkQyN0MsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2RDczLAorMHg2QzUzQjAxOCwgMHg2NEMzNTdGNCwgMHhCMDU0NjVFMywgMHhCMDZBNjZEMywKKzB4QjA5QTAwMDksIDB4QjA5RTAwMDksIDB4QjBBMjAwMDksIDB4QjBCRTAwMDksCisweEIwQzEwMDA5LCAweEIxMjQwMDA5LCAweDRGMjYwMDA5LCAweDZERjY2RUY2LAorMHg2Q0Y2QTAyMywgMHgzNDEyRDE2QywgMHhENjZDMDUyOSwgMHgyNjUwRDc2QywKKzB4Mjc0MjAwMEIsIDB4MDAwOUEwMTQsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2RDczLCAweDZDNTNCRkVFLCAweDY0QzM1N0Y0LCAweEIwMkE2NUUzLAorMHhCMTA2NjZEMywgMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2Q0Y2QTAwNSwKKzB4RTYwM0QyNjAsIDB4MDAwQjQ2MTgsIDB4RDI1RTIyNjIsIDB4MDAwQkU2MDAsCisweDRGMjIyMjYyLCAweEU0MEFCRjdFLCAweDAwMDlCRjdFLCAweEUxMDREMjVBLAorMHhFNTAwNDExOCwgMHgyMjEyRTQwQSwgMHgyMjUyQkY3NCwgMHg2MDcyRDc1NywKKzB4NEYyNkNCMjAsIDB4MjcwMjAwMEIsIDB4RDE1NTRGMjIsIDB4RTQwMDQxMEIsCisweDQ1MkJENTU0LCAweDJGRTY0RjI2LCAweDZFNjNEMTUzLCAweDQ0MTg2NjEyLAorMHg0NTI4OTIxMCwgMHgyNjI5NDQwOCwgMHg0NDA4NDUwMCwgMHg0NDAwMjY1QiwKKzB4NDcwODI2NEIsIDB4NDcwODIxNjIsIDB4MjdFQkQxNEMsIDB4MDAwQjIxNzIsCisweDAzRjA2RUY2LCAweDJGRTYxRkZGLCAweERFNDk0RjIyLCAweEU0MEFFMTAxLAorMHgyRTEyQkY0OCwgMHg3MjZDNjJFMywgMHhFNDAxRTEwMCwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4RTczMDIyNDIsIDB4RTQwQUU1MDMsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjUyMjI3MiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MTIxQUJGMjIsCisweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzI2RUY2LCAweEU0NDFFMTAxLAorMHgwMDBCMjIxMiwgMHhEMTMwMjI0MiwgMHhFNjA1RDQzMCwgMHgwMDBCMjE2MiwKKzB4RDUyRjI0NjIsIDB4NjA1MEQyMkYsIDB4OEIwRTg4MDEsIDB4NjA0MEQ0MkUsCisweDhCMDc4ODAxLCAweDk2MjZENTJELCAweDg4MDE2MDUwLCAweDk2MjM4QjBDLAorMHgwMDA5QTAwQSwgMHhBMDA3OTYyMSwgMHhFNjAwMDAwOSwgMHgyMjYyRDQyNiwKKzB4ODgwMTYwNDAsIDB4RTYwNDhCMDAsIDB4QUVGM0U0MEEsIDB4RDIyNDIyNjIsCisweEU0MEFFNjAxLCAweDIyNjJBRUVFLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhEQzIwNEYyMiwgMHg2MEMyRUQwMCwgMHhDQjAxRUI2NCwgMHg2MEMyMkMwMiwKKzB4QTA0MUM5MDEsIDB4MDNDNDZFMDMsIDB4MDM0MDAzRDQsIDB4MDAxQzNCODgsCisweDAwMjAzMDJDLCAweDAwMjAxM0EyLCAweDAwMjAzMDM0LCAweDAwMjAzMDNDLAorMHgwMDIwMzA0NCwgMHgwMDIwMzA0QywgMHgwMDI1RTcyMCwgMHgwMDIwMzIxQywKKzB4MDAyMDJGMDQsIDB4MDAxQzU5NjgsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsCisweDAwMjAxMTU0LCAweDAwMjAxMTgwLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLAorMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywKKzB4MDAyMDJGMTYsIDB4MDAxQzU4MDQsIDB4MDAyMDJGMTUsIDB4MDAyMDJGMTcsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDg5MDczREIyLCAweEU0MEE2MEMyLAorMHhCRTlGQzkwMSwgMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4QjAzM0RCMiwKKzB4RDIzRUQ0M0QsIDB4MDAwOTQyMEIsIDB4NEYyNkU0MEEsIDB4NkRGNjZFRjYsCisweEFFOEY2Q0Y2LCAweDQ0MTE2QkY2LCAweDYwNEI4RjAxLCAweDAwMEI2MDQzLAorMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhEQzM0N0ZGQywKKzB4NjBDMkVEMDAsIDB4Q0IwMkVCNjQsIDB4NjBDMjJDMDIsIDB4QzkwMjJGMDIsCisweDZFMDNBMDA5LCAweDg5MDgzREIzLCAweEU0MEE2MEMyLCAweEM5MDIyRjAyLAorMHg2RTAzQkU3MCwgMHgyRUU4N0QwMSwgMHgzREIzOEJGNCwgMHhENDI5OEIwOCwKKzB4N0YwNEQyMjYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweEQ1MjI2QkY2LAorMHg2MDUyNTY1MSwgMHgwMDBCNDYyOCwgMHgyRkI2MzA2QywgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsIDB4NkU0M0JGRjEsIDB4REMxQjZCMDMsCisweEJGRUNERDFCLCAweDMwQjgwMDA5LCAweDA2MEEzQzA1LCAweDQ2MDk0NjA5LAorMHgzRDY1NDYwMSwgMHg0MjA5MDIwQSwgMHg0MjA5NDIwOSwgMHg4QkYwMzJFMiwKKzB4NEYxNjRGMDYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBGLCAweEU0MDNFNTAwLCAweEJGRDQyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQ0IsIDB4MDAwOTAwMEIsIDB4MDAyMDMwNTQsIDB4MDAyMDEzNTYsCisweDAwMUM1ODYwLCAweDAwMjAzMDZDLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGREMsIDB4NjQ1M0UxMTAsCisweDZDNTM0MTI4LCAweEVEMDk2RTUzLCAweDY2NTM2NTVELCAweDM2NUM0NjA4LAorMHg3NTAxNDYwOCwgMHg2MDQzMzYxQywgMHgwRjY2Njc1RCwgMHhFQjAwNjBDMywKKzB4MjZDMTM3RDMsIDB4ODE2MjgxNjEsIDB4MTZCMjgxNjMsIDB4MTZCNDE2RTMsCisweDc0MDQ4RkVBLCAweEQ5QTY2OEYyLCAweDE5ODFEQUE2LCAweDU5RjEyOTgyLAorMHgxQTkxRDFBNSwgMHg1QUYyMkE5MiwgMHg1REY0NUJGMywgMHg1NEY2NUVGNSwKKzB4MjFBMjExQTEsIDB4MTFCMjExQjMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweDU1RjdFRTAwLCAweDU3RjhERDlDLCAweDY0RTNEMjlDLAorMHhEQjlERDk5QywgMHhFODQ1RUFCOCwgMHgyRDUyMUQ1MSwgMHg2QUFDMjI3MiwKKzB4NkVFRDQ4MDgsIDB4NEQwODZERTMsIDB4M0RFQzY1RTMsIDB4NEQwODQ1MDgsCisweDNEOUMzNUVDLCAweDQ1MDg2MEMzLCAweDgxRDEyREMxLCAweDQ1MDhFMDUwLAorMHg0NTA4NDAwOCwgMHg2MEMzODFEMiwgMHhFNjAwMzVCQywgMHg4MUQzMzRBMiwKKzB4MUQ1MzFERDIsIDB4OEQwMUQ0ODksIDB4RDQ4NjFENjQsIDB4QjA1QzY1RDMsCisweDY0RUQ3RTAxLCAweDhCREMzNDgyLCAweERCODhEMTgyLCAweEQyODA2ODEyLAorMHgxQjgxNDgyOSwgMHgyRkQyNjQxMiwgMHgyQjkyNjk0RCwgMHhEOTdGNjcyMiwKKzB4MUI3MzQ3MjksIDB4RDc3QzY4MjIsIDB4MUJBMjZBOEQsIDB4RDI4MDZCNzIsCisweDIyQjJENTdCLCAweEUwMDM1RDcyLCAweDVFNzQxMkQyLCAweDEyRTQ0MDE4LAorMHhENjdDNTE3NiwgMHg1NDc4MTIxNiwgMHgxMjQ4RTEwMywgMHhENDc5Njc5MiwKKzB4Njg1MjEyN0EsIDB4MjhDMUU3RkYsIDB4ODE5MTY5NTIsIDB4NkE1MkUwNTAsCisweDgxQTI0MDA4LCAweDYwQzM2QjUyLCAweDZDNTI4MUIzLCAweDZFNTIxQ0MyLAorMHg2MjUyMUU2MywgMHgxMjY0RTYwMCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2NzIsIDB4OEJGODM2MTMsIDB4NEYyNjdGMjQsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDYwNjE2NjQyLAorMHg4RDA0QzgwMywgMHg2MDYxRTUwMCwgMHg4ODAyQzkwMywgMHg1MjYyOEIwMywKKzB4NTEyNDY1NjMsIDB4MDAwQjI0MTIsIDB4MkZENjYwNTMsIDB4NEYyMjJGRTYsCisweDZFNTM3RkVDLCAweEU1NTA2MjUzLCAweEU0MDA2RDQzLCAweEEwMDE0NTA4LAorMHg1MjI0RTEwMSwgMHgyMjExNjA0MywgMHg4MTIzODEyMSwgMHg4MTIyNjA1MywKKzB4MzYyMDU2RTIsIDB4RDI1NDhCRjUsIDB4NjRGMzE2RTQsIDB4NDIwQkU2MTQsCisweDY1RTE2NUUzLCAweDI1NDlFNEZDLCAweDYxRjEyRTUxLCAweDIxNDk2NUYzLAorMHg1NEQxMkYxMSwgMHg0MTBCRDE0QywgMHg1N0QxRTYxNCwgMHhDQjAxNjA3MSwKKzB4MURFMTI3MDEsIDB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweDZFNTM3RkVDLCAweEU1RkM2NjUzLCAweDYwNjE2RDQzLAorMHhDQjAxMjA1OSwgMHg1MkUyMjYwMSwgMHg4QjA2MzI2MCwgMHg1MUUyMTJFNCwKKzB4OEIwNDMxRTAsIDB4QTAwMjUyRDEsIDB4QUZGMDFFMjIsIDB4RDIzQTU2NjQsCisweEU2MTQ2NEYzLCAweDY1RTM0MjBCLCAweEUxRkM2N0UxLCAweDJFNzEyNzE5LAorMHg1NEQxNjdGMSwgMHhEMTM0MjcxOSwgMHhFNjE0NjVGMywgMHgyRjcxNDEwQiwKKzB4NjAyMTUyRDEsIDB4MjIwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDRGMjIyRkU2LCAweERFMjM2MjRDLCAweDQyMDA0MjA4LAorMHgzRTJDQTAwNSwgMHhENDFGNTI1MiwgMHhCRjhFNTYyNCwgMHg2NUUyMkU2MiwKKzB4MzUyMDUyRTEsIDB4RDYyMjhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDMTg0RjIyLCAweDUyQzFEQjFGLAorMHgzNjIwNjZDMiwgMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTEzODkxOCwKKzB4QkY2M0REMUIsIDB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsCisweEQ0MEI4OTA3LCAweDAwMDlCRjlCLCAweDREMEJENDE2LCAweEFGRTYwMDA5LAorMHhCRjYyMDAwOSwgMHhENDE0NjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwKKzB4MjI2MkQyMTIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMjAyQjAwLCAweDAwMjAyQjA4LCAweDAwMjAyQjEwLCAweDAwMjAyQjM4LAorMHgwMDIwMkYxQywgMHgwMDEwMDBCNCwgMHgwMDEwMTY4MCwgMHgwMDFFMjEwOCwKKzB4MDAxQzNEMDAsIDB4MDAxMTc4ODAsIDB4MDAyMDBBOUUsIDB4MDAyMDJGMDAsCisweDAwMjAxMzU2LCAweDAwMjAzMDg4LCAweDAwMjAzMDhDLCAweDAwMUMzRDI4LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDIyRDIyQiwKKzB4OEQ0MUM4MDMsIDB4REUyQTJGMDEsIDB4REIyQkRDMkEsIDB4RUQwMUEwMTcsCisweEM5MDM2MDUxLCAweDg5MTY4ODAxLCAweEQxMjhENDI2LCAweDAwMDk0MTBCLAorMHg2MTAzNTUwMywgMHhDODIwODU1MSwgMHhFMDUwODkwMywgMHg3MjAxMDJCRSwKKzB4RDIyMzBCMjYsIDB4NDIwQjY0RTMsIDB4RDYyMjY1MTMsIDB4NTJDMTI2RDIsCisweDM1MjA2NUMyLCAweERFMjA4QkU0LCAweERCMjFERDIwLCAweDUyRDFEQzIxLAorMHgzNTIwNjVEMiwgMHg2MDUxODkxOCwgMHg4ODAxQzkwMywgMHhENDFCODkxNCwKKzB4NDYwQkQ2MTYsIDB4NTcwMzAwMDksIDB4OEYwNDM3RTAsIDB4RTIwMTY1MDMsCisweEFGRUMyQjIwLCAweEQ0MTgyQzUyLCAweDQyMEJEMjE4LCAweEQ2MTEwMDA5LAorMHg0MTE4RTEwMSwgMHgyNjEyQUZFMywgMHhDODA0NjBGMSwgMHhEMjE0ODkwNywKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDAwMUUyMTAwLAorMHgwMDIwMkIxMCwgMHgwMDIwMkIwOCwgMHgwMDIwMkFBNCwgMHgwMDIwMTA2QywKKzB4MDAyMDEwRUUsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDJCMDAsCisweDAwMjAyRjIwLCAweDAwMjAyRjFDLCAweDAwMjAyQjM4LCAweDAwMjAxMDhBLAorMHgwMDIwMDE3MCwgMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwKKzB4MDAwMDEyNjYsIDB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LAorMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsCisweDIyMjg2MjYwLCAweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLAorMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwKKzB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsCisweEUwMDA3N0ZGLCAweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLAorMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywKKzB4QkZEMDY0MjMsIDB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsCisweDRGMjY3RjE0LCAweDZFRjYwMDBCLCAweDAwMjAzMDkwLCAweEU0RkRENTlBLAorMHhENjlBNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwKKzB4RDE5NzY3NTIsIDB4MjU3MjI3NDksIDB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsCisweDI2MDJDQjA0LCAweEU1MDE2MDYyLCAweDI2MDJDQjA4LCAweEU0MDI2MDYyLAorMHgyNjAyQzlDRiwgMHg0NTE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY0MiwKKzB4RDU4QzE2NTMsIDB4RDI4REQ3OEMsIDB4RTEwMEQ0OEQsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkQyLCAweEQyOEE2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg2NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODIsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdFLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjc5NjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NTY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkQsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njg2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2MywgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNUYsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVELCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEEsIDB4OEIwMzg4MDEsCisweDAwMDlCMjQ2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ3LCAweEQ2NDcyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQyNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI4RjhCMDEsIDB4RDY0MTAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0RENTNDLCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0EyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNBRDQzOSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1MzksIDB4RDIzOTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ0MzY0RjIyLCAweDQxMEJEMTMyLCAweEQ1MzIwMDA5LAorMHg2NjUwRTdGQiwgMHg0RjI2MjY3OSwgMHgyNTYwMDAwQiwgMHhENDMxNEYyMiwKKzB4NDEwQkQxMkMsIDB4RDUyQzAwMDksIDB4NjY1MEU3RjcsIDB4NEYyNjI2NzksCisweDI1NjAwMDBCLCAweDk0MkRENTI4LCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLAorMHhFNEJGRDUyNSwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI2NEYyMiwKKzB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsIDB4ODkxMzg4MDEsIDB4ODkxNTg4MDMsCisweDg5NDM4ODA1LCAweDg5NDk4ODA2LCAweDg5NEY4ODA4LCAweDg5NTU4ODA5LAorMHg4OTVCODgwQSwgMHg4OTYxODgwQiwgMHgwMDA5QTA2OCwgMHgwMDA5QjA2QSwKKzB4NjAwQ0EwNjUsIDB4MDAwOUIwNzgsIDB4NjAwQ0EwNjEsIDB4MDAwOUIwODEsCisweDYwMENBMDVELCAweDAwMDBGRjdGLCAweDAwMUUyMTQ4LCAweDAwMUUxMTA4LAorMHgwMDFFMTAwMCwgMHgwMDIwMkY2MCwgMHgwMDIwMkY2MiwgMHgwMDIwMkY4MSwKKzB4MDAyMDJGNDQsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsCisweDAwMUUxMDkwLCAweDAwMjAyRjY4LCAweDAwMUUxMDBCLCAweDAwMjAyRjY0LAorMHgwMDIwMzA5NCwgMHgwMDIwMTM1NiwgMHgwMDFFMTAyOCwgMHgwMDIwMkY4MCwKKzB4MDAyMDMwQTAsIDB4MDAyMDMwQjAsIDB4MDAyMDJGMzgsIDB4NjI2MEQ2ODQsCisweDhCMkIyMjI4LCAweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLAorMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywKKzB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsCisweDhCMTMyMjI4LCAweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LAorMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwKKzB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsCisweDAwMDkwMDBCLCAweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLAorMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwKKzB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsCisweEUwMDA4RDA1LCAweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLAorMHhEMjVDMDAwOSwgMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwKKzB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsCisweDAwMEIyNjEyLCAweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLAorMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywKKzB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksCisweDY0NTM2NTBELCAweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLAorMHg4ODAyODkwOSwgMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwKKzB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsCisweDYyMkM2MjYxLCAweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLAorMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywKKzB4MjAwODYwNUMsIDB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksCisweEEwMkM4OTBBLCAweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LAorMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwKKzB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsCisweDYyMkNENDJELCAweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LAorMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwKKzB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsCisweDAwMEI0RjI2LCAweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLAorMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwKKzB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsCisweEQ1MTFENjFELCAweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LAorMHhERTBEODA1MSwgMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywKKzB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsCisweDAwMjAyRjgxLCAweDAwMjAyRjM4LCAweDAwMjAyRjQ0LCAweDAwMUUxMTAwLAorMHgwMDFFMTAwQywgMHgwMDIwMkY2NCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDJGNkMsIDB4MDAyMDJGNEMsIDB4MDAyMDJGNTAsIDB4MDAyMDJGNTQsCisweDAwMjAyRjcwLCAweDAwMjAyRjc0LCAweDAwMjAyRjc4LCAweDAwMjAyRjdDLAorMHgwMDIwMzI4MCwgMHgwMDIwMzI4QSwgMHgwMDIwMkY1RSwgMHgwMDIwMjI1QSwKKzB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsCisweDgwRTFCMEY1LCAweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLAorMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwKKzB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsCisweEQyODk4QjE1LCAweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LAorMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwKKzB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsCisweDJGRTZFMDAwLCAweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLAorMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwKKzB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsCisweDI2NTE2NDRDLCAweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LAorMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwKKzB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsCisweDI0MDBDOTNGLCAweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwKKzB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLAorMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwKKzB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLAorMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwKKzB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLAorMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwKKzB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLAorMHg2MjYzODkwMCwgMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwKKzB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsCisweDc0MDEyNDUwLCAweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLAorMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwKKzB4NDIwMDYxRDEsIDB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsCisweEU1MDFFNDAwLCAweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwgMHg2NEUzQkM5NiwgMHhCQzlCNjRFMywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4QkM5RUVFMDEsIDB4NjRFMzY0RTMsCisweDdFMDFCQ0EzLCAweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LAorMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywKKzB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsCisweDEzN0EyMTIyLCAweDAwMjAyRjVFLCAweDAwMjAyMzY2LCAweDAwMUUxMDE1LAorMHgwMDIwMkY2NCwgMHgwMDFFMTAwMSwgMHgwMDIwMkYzOCwgMHgwMDFFMTEwMCwKKzB4MDAyMDJGNjIsIDB4MDAyMDJGNTAsIDB4MDAxRTEwMDAsIDB4MDAyMDJGNTQsCisweDAwMjAyRjYwLCAweDAwMjAyMjVBLCAweDAwMUUxMDBDLCAweDAwMjAyRjRDLAorMHgwMDIwMkY2OCwgMHgwMDIwMkY2QywgMHgwMDIwMkY3MCwgMHgwMDIwMkY3NCwKKzB4MDAyMDJGNzgsIDB4MDAyMDJGN0MsIDB4NEYyMjJGRTYsIDB4RDY1MDdGRkMsCisweDg4MDE2MDYwLCAweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NEVEMTRELAorMHhERTRFNjAxMCwgMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE0QywKKzB4RDI0Qzc1MDIsIDB4RTYwMUQ3NEMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NDM3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NDIsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweEEwMjA3MTAyLCAweEQyM0UwMDA5LCAweEU2MDFENzNCLCAweEU3MDQyNzIyLAorMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDMyNzQwMiwKKzB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsCisweDgxRTQ2MDdDLCAweEU0MTdENTMzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLAorMHg4RkY5MjE3MSwgMHg5MjRBNzEwMiwgMHhEMjI2MkUyMSwgMHg1RTIzRDcyRSwKKzB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsCisweDgwNzE2MTAzLCAweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLAorMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywKKzB4ODE3MzMwNEMsIDB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsCisweDYwMkM0MjE5LCAweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLAorMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywKKzB4MDAwOUJDOUMsIDB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksCisweDhCMDM4ODQwLCAweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjBGLAorMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgwNjBBMDAwOSwKKzB4MDAyMDJGODAsIDB4MDAxRTEwMDAsIDB4MDAyMDJGNkMsIDB4MDAyMDMyODAsCisweDAwMjAzMjhDLCAweDAwMjAzMjI0LCAweDAwMjAyRjU0LCAweDAwMjAzMjU0LAorMHgwMDIwMzI1MiwgMHgwMDIwMzIyNiwgMHgwMDIwMkYzOCwgMHgwMDIwMkY2NCwKKzB4NEYyMjJGRTYsIDB4REU5MzdGRkMsIDB4MjAwODg0RTksIDB4MkYwMDhEMDYsCisweEQ2OTJENDkxLCAweDAwMDk0NjBCLCAweDY0RjBCMTk0LCAweDY2MjBEMjkwLAorMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4QTRGMjIsIDB4NjBFMEQ2OEEsCisweENCQzBENDhBLCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LAorMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjg0NjE2RCwKKzB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsCisweEQyODA4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLAorMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY3QSwKKzB4ODk0NDIyMjgsIDB4RDU2RkUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NzcsCisweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLAorMHgyRjExQTAwNiwgMHhENDcyRDY2QSwgMHhERDcyNjc2MCwgMHg2NTdDNEQwQiwKKzB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2NEQ0NkYsIDB4MDAwOTQyMEIsCisweDREMjE0RDIxLCAweEEwMDVENzZELCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LAorMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzY5OEJGNywgMHg2MTcyRTAwMywKKzB4ODExMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ2NTYxNzIsCisweERENjU4MTEzLCAweDREMEJERTY1LCAweEUyMDE2NTcyLCAweEQ0NjQyRTIyLAorMHg0MjBCRDI1MiwgMHhENjUzMDAwOSwgMHhDOTNGNjA2MCwgMHg3RjA0MjYwMCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweEQyNUM0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLCAweDIwMDg2RDYzLAorMHg2MTAzOEYwOCwgMHhEMjQ1RDQ1OCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsIDB4NjBEMzgwMTEsIDB4RTUwMDgxMTEsCisweDY0QkNBMDA3LCAweDYwNTM2NTVELCAweDY2NTMwMEVDLCAweDc1MDEzNjFDLAorMHg2MjVEODA2NCwgMHg4QkY1MzI0MywgMHg2MDYwRDYzNiwgMHgyNjAwQzlCRiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsCisweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLAorMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywgMHhFNDA4QkZCQywKKzB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLAorMHg2QjEzNkNDRCwgMHhERTM2RDczNSwgMHhFREZGNjRGMywgMHhEODM1RUEwNCwKKzB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsCisweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLCAweDY5ODIwMkVELAorMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywKKzB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsCisweDY3RjNFNUM1LCAweEJGN0Y2NjZDLCAweDdGM0M2NTVDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwKKzB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsCisweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzMEJDLCAweDAwMjAxMzU2LAorMHgwMDIwMkYxQSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDAxNzAsIDB4MDAyMDJGMjAsIDB4MDAyMDI0QkUsCisweDAwMjAzMEMwLCAweDAwMjAxM0EyLCAweDAwMjAzMERDLCAweDAwMTE3ODhDLAorMHgwMDIwMkYxQywgMHgwMDIwMkIwMCwgMHgwMDIwMTBFRSwgMHgwMDFFMjEzMCwKKzB4MDAyMDMwRTQsIDB4MDAyMDI0ODAsIDB4MDAyMDMwRTgsIDB4MDAyMDJGMjYsCisweDAwMjAyRjJFLCAweDAwMjAzMjIwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NjAxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU2RCwgMHhDODEwNjBFMywgMHhCRTZBODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFOEMsIDB4QzgwMTYwRTMsCisweEREM0U4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNDLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzQSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzU4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkYsIDB4RDUyRjAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRThCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkI4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhENjI4ODkyRSwgMHg2MEUzNkU2MCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjI0LCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIyLAorMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwgMHg0MTBCRDEyMCwgMHhCRjBFMDAwOSwKKzB4QkY0RDAwMDksIDB4RDUxRTAwMDksIDB4NjA1MEQ0MUUsIDB4QzkwOEQ3MUUsCisweEJGODQyNTAwLCAweDYwRTMyNDcyLCAweDg5MDVDODA4LCAweDdGMDREMjFCLAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsCisweDAwMUQ0MDAwLCAweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLAorMHgwMDIwMTUzNiwgMHgwMDIwMTU1OCwgMHgwMDIwMUI5OCwgMHgwMDIwMTU3MCwKKzB4MDAyMDE1N0UsIDB4MDAyMDJGNjQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsCisweDAwMjAxNUQ0LCAweDAwMjAxNUUwLCAweDAwMjAxNTg2LCAweDAwMjAxNUE0LAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgxMjM0NTY3OCwgMHgwMDIwMTVCQywKKzB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsCisweDI0NTAwMDBCLCAweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLAorMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywKKzB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsCisweDQyMDg2MjVDLCAweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LAorMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywKKzB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksCisweDY3MkU2NTczLCAweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLAorMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywKKzB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsCisweDg4MDE2MDIxLCAweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LAorMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsCisweEU2MDJFNTA2LCAweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLAorMHhFNDAxODVGMiwgMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwKKzB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsCisweEJGODJFNDAyLCAweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLAorMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwKKzB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsCisweEU1RkVFNTAwLCAweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LAorMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwKKzB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzhFNDAzLCAweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LAorMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwKKzB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwKKzB4RDI0MThCNzEsIDB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsCisweEU1MEY4QjY5LCAweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwKKzB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsCisweEJGMzA2NTQzLCAweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLAorMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwKKzB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsCisweEU2NDBFNTAwLCAweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLAorMHhCRUU1RTQwMywgMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwKKzB4QkVFNzcwODUsIDB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsCisweEJFRjVFNjQwLCAweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLAorMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwKKzB4RTQwRjg0RkMsIDB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsCisweEU1MDFFNDA0LCAweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDNFLCAweDAwMjAyRjVFLCAweDAwMjAyRjYwLCAweDAwMjAyRjYyLAorMHhEMjFERDExQywgMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwKKzB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsCisweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLAorMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywKKzB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsCisweDQ3MDg2NzUzLCAweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLAorMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwKKzB4MDAwMDYwNjMsIDB4MDAyMDJGMTksIDB4MDAyMDJGMTgsIDB4MDAyMDJGMUEsCisweDAwMjAyQjQwLCAweDdGRkM0RjIyLCAweEU2ODBEMUE4LCAweDY2NkM2MjEyLAorMHhEMkE3MkYyMiwgMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwKKzB4MDAwQjRGMjYsIDB4RTY4MDAwMDksIDB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsCisweDQyMkI3NTQwLCAweEU2ODA2NDczLCAweEQyOUQ2NjZDLCAweEU3MDA2NTYzLAorMHg0MjJCNzU0MywgMHgyRkI2NjQ3MywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NEQxOEVEMDEsIDB4REI5OERDOTcsIDB4NjVDMjUyQzEsIDB4ODkyMDM1MjAsCisweEM5MDM2MDUxLCAweDg5MUM4ODAxLCAweEQxOTRERTkyLCAweDY0RTM0MTBCLAorMHg4NTAzNjUwMywgMHg2NzBENjZCMiwgMHg4OTA3Mzc2MiwgMHhEMjkxRDQ5MCwKKzB4MDAwOTQyMEIsIDB4RTcwMUQxOTAsIDB4MjE3MkFGRTYsIDB4REU4RjY0RTMsCisweDAwMDk0RTBCLCAweEQ0OEZENjhFLCAweDQxMEJEMThGLCAweEFGREIyNkQyLAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHg0RjIyNkJGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjdCLCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MkY4NjAwMDksIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweEUwMDBEMTc2LCAweEQ0NzgyRjEyLCAweDgxRjI2MTAzLAorMHhEQzc3MUY0MiwgMHhENjc3NkIxMywgMHhFMDAxNEIwOCwgMHg0NjBCREU3NiwKKzB4M0JFQzRCMDAsIDB4NjZDMjFGMDMsIDB4MzYyMDUyQzEsIDB4QTE4MThCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEExN0I4QjAxLCAweDg1NjEwMDA5LAorMHg4QjAxQzgwMSwgMHgwMDA5QTA4MCwgMHg4NUQyNUQ2MywgMHhDOTAzNjYwMywKKzB4ODVEMzY0MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsIDB4NDUwMEM5M0YsCisweDMyMkE2MTAzLCAweDYwNTMyNTJELCAweEM5MDFFNTEwLCAweEQ5NUUzMTUzLAorMHg2RTAzOEQyMSwgMHg0NDA4RDc2MSwgMHg0NDA4Njg3MCwgMHg0NDAwNjIxMywKKzB4Mjg4ODQyMDAsIDB4MzQyQzhGMEUsIDB4NjA0M0QyNUQsIDB4NjBFMzA3MkQsCisweDRBMTk2QTdELCAweDY1OEU2OEE5LCAweDI4NUQ4ODAxLCAweDZBN0M4RjBCLAorMHg2QTEzQTAwOSwgMHg2MDQzRDI1NywgMHg2MUVEMEUyRCwgMHg2ODE5NDExOSwKKzB4Mjg3RDY3OEUsIDB4RDE1NDZBRUMsIDB4MjIyODYyMTAsIDB4RUFGRjg5MDEsCisweEVFRkY2QUFDLCAweDZFRUM2NUFELCAweDhCMEYzNUUwLCAweDREMEJERDNGLAorMHg1NDAzNjRDMywgMHhCRjcyRTUwMiwgMHhENDRDNkQwMywgMHg0MTBCRDEzRiwKKzB4RDc0QjY1RDMsIDB4RDQ0QkVFMDEsIDB4MjdFMkEwMjUsIDB4MjY3OUU3RkMsCisweDgxRDI2MDYzLCAweDk0NjA4NUQzLCAweDYxMDMyMDQ5LCAweDQ1MDgyNjhCLAorMHgyNTFCNjA2MywgMHg2MDUzODFEMiwgMHg4NUQ0ODFEMywgMHg0MTE4RTEwOCwKKzB4ODFENDIwMUIsIDB4RUUwMjYyQzIsIDB4MjA3OTg1MjEsIDB4NjRDMjgxMjEsCisweDYwNDE2NzhELCAweENCMDEzN0UzLCAweDI0MDE4RDA0LCAweEVFRTc4NUQyLAorMHg4MUQyMjBFOSwgMHg0OTBCRDQzOCwgMHg2MEMyMDAwOSwgMHg1MkYzNjZGMiwKKzB4MkIwMkNCMDEsIDB4MjYyMkFGNkYsIDB4RDIyMDg1NjEsIDB4OEYwMkM4MDIsCisweEEwRDI2NEMzLCAweDQyMEIwMDA5LCAweEQ5MzAwMDA5LCAweDVFMDM2NTAzLAorMHgwNzlFRTA0QywgMHg3NzAxREQyRSwgMHg2OUQyMDk3NiwgMHg3OTAxRDYyNiwKKzB4NkQ2MDJEOTIsIDB4ODkwNjJERDgsIDB4RDIxOEQ0MjQsIDB4RUQwMTQyMEIsCisweEEwQjNENzIzLCAweDYyNTEyN0QyLCAweDQxMThFMTBGLCAweDIyMTlFNDAyLAorMHgzMjQwNDQxOCwgMHg4NTUxOEI0NiwgMHgyMEQ5RURGQywgMHg2MDUxODE1MSwKKzB4Q0IwMTdERTMsIDB4ODVFMTI1MDEsIDB4MjBEOUQ2MEEsIDB4NDYwQjgxRTEsCisweDY5RjI2NEMzLCAweEEwOTk1N0YzLCAweDdFMDMyOTcyLCAweDAwMUMzRDlDLAorMHgwMDIwMUUzOCwgMHgwMDIwMkIzOCwgMHgwMDIwMkYwMCwgMHgwMDIwMTA2QywKKzB4MDAyMDJCMDAsIDB4MDAyMDEwRUUsIDB4MDAxRTIxMzAsIDB4MDAyMDEwOEEsCisweDAwMUMzRDMwLCAweDAwMjAzMjAwLCAweDAwMjAxMzU2LCAweDAwMjAzMjBDLAorMHgwMDIwMkIxMCwgMHgwMDIwMjlGOCwgMHgwMDFDM0QwMCwgMHgwMDIwMzIxQywKKzB4MDAyMDMxMDAsIDB4MDAyMDMxODAsIDB4MDAyMDJGMTQsIDB4MDAyMDJCMDgsCisweDAwMUUyMTJDLCAweDAwMjAzMjA0LCAweDAwMjAzMjA4LCAweDAwMjAyQUE0LAorMHgwMDIwMzIyMCwgMHg2RERENkQ1MSwgMHg2REQ5NEQxOSwgMHgyRDZENjZERSwKKzB4NjBEQzdEMDEsIDB4NDExODYxMDMsIDB4OEY0NTg4MDEsIDB4RDY1QjI1MTEsCisweDc0MDE2NDYyLCAweDg1RTMyNjQyLCAweDYwNjM2NjBELCAweDQwMjE0MDIxLAorMHg0NjAwQzkzRiwgMHgzMjJBNkQwMywgMHg2MDYzMjYyRCwgMHhEMTU0QzgwMSwKKzB4ODkwMUQ5NTQsIDB4MkQ2Qjk2QTEsIDB4RTAxMEU2MDAsIDB4NjRERDBGNjQsCisweDA3RkNFMDEwLCAweDQwMDA2MDdDLCAweDYyMkQwMjFELCAweDhEMTIzMjQwLAorMHg2MDYzNjYwMywgMHhFN0ZGMDIxRCwgMHg4QjAxMzI3MCwgMHgwMUQ1QTAwQiwKKzB4MDJGQ0UwMTAsIDB4NzIwMUU2MDQsIDB4NjIyQzBGMjQsIDB4OEJFNzMyNjIsCisweDY2NkMwNkZDLCAweDYwNjM0NjAwLCAweDcxMDEwMTlELCAweEQxNDIwOTE1LAorMHg2OTdENjcxMSwgMHg4OTA3Mzk0MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwKKzB4REQzRTIxRDEsIDB4MkQyMEUyMDEsIDB4RURGQzg1NTEsIDB4ODE1MTIwRDksCisweEQyM0I2MDUxLCAweDY0QzNDQjAxLCAweDI1MDE0MjBCLCAweDAyRkNFMDEwLAorMHg2MTJDRDQzOCwgMHg0NDBCRTAwMSwgMHgyNzAyNjdGMiwgMHhEMjM2ODVFRiwKKzB4NDIwQjU0RjIsIDB4QUU5NjY1MEQsIDB4NDIwQjAwMDksIDB4NTQwMzAwMDksCisweDg1NDQ2RTAzLCAweDREMThFRDA4LCAweDMwRDAyMEQ5LCAweEJFNTY4QjAzLAorMHhBMDA3RTUwMSwgMHg4NTQxMDAwOSwgMHg2MjBEREQyQywgMHg4OTAxMjJEOCwKKzB4RTUwMEJFNEQsIDB4RDIyQkQ0MkEsIDB4NjVFMzQyMEIsIDB4RUQwMUQ3MkEsCisweDI3RDJBRTc5LCAweEVFMDQ4NUYyLCAweDYxMEQ3MDAxLCAweDgxRjIzMUU3LAorMHg3QzA4OEQwMiwgMHgwMDA5QUU2NiwgMHg0RjI2N0YxNCwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4NEYyMjJGRTYsCisweDZFMjJEMjFFLCAweEM4NDA2MEUzLCAweDIyRTI4RDAyLCAweDAwMDlCREQyLAorMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwgMHgwMDA5QkRERCwgMHhDODEwNjBFMywKKzB4RDQxNzg5MDUsIDB4NDIwQkQyMTcsIDB4QkREQzAwMDksIDB4NjBFMzAwMDksCisweDg5MDFDODA1LCAweDAwMDlCRTJELCAweEM4MDI2MEUzLCAweDRGMjY4OTAyLAorMHg2RUY2QUREOSwgMHgwMDBCNEYyNiwgMHg4MDAwNkVGNiwgMHgwMDIwMzIyMCwKKzB4MDAyMDJGMjYsIDB4MDAyMDJGMkUsIDB4MDAyMDJGMjIsIDB4MDAyMDJGMjQsCisweDAwMjAxMEVFLCAweDAwMjAyOUY4LCAweDAwMjAxM0EyLCAweDAwMDA4MDAwLAorMHgwMDIwMkIwOCwgMHgwMDIwMTA4QSwgMHgwMDFFMjEyQywgMHgwMDFDMzUxMCwKKzB4MDAyMDMyMTQsIDB4MDAyMDEzNTYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsCisweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLAorMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwKKzB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsCisweDAwMDkwMDA5LCAweDAwMjAyQTIyLCAweDAwMjAyOUQ4LCAweDAwMEJFMDAwLAorMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwKKzB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDYzNjU0NCwKKzB4MzIyMDMyMzEsIDB4MjAzNzMwMzAsIDB4MzMzQTMxMzIsIDB4MzQzMjNBMzYsCisweDAwMDAwMDAwLCAweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDQyNzA3MzcyLAorMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwKKzB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwKKzB4NjQ2MTIwMkMsIDB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsCisweDAwMDAwQTBELCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgwMDBBMEQ1MiwgMHgyMDNBMzA1MSwKKzB4MDAwMDAwMjAsIDB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsCisweDAwMDAwMDIwLCAweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLAorMHgwMDAwMDAyMCwgMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjYyMDIwNkUsIDB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHgyMTIxNkM2OSwgMHgwMDAwMEQwQSwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsCisweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0MiwKKzB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsIDB4NDk2NzdBMjAsCisweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELCAweDY1NEM3MjQ1LAorMHgwMDAwMDA2RSwgMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwKKzB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMDcsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAyMDAwMEZGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMjA0MDUsCisweDAyMDkwMDAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0RLRndJbWFnZVNpemU9MTI5ODg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOTViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYwpAQCAtMCwwICsxLDczMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorCisKK2V4dGVybiB1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldik7CisKKy8qCisgKiBBbnRpIG5vaXNlIGltbXVuaXR5IHN1cHBvcnQuICBXZSB0cmFjayBwaHkgZXJyb3JzIGFuZCByZWFjdAorICogdG8gZXhjZXNzaXZlIGVycm9ycyBieSBhZGp1c3RpbmcgdGhlIG5vaXNlIGltbXVuaXR5IHBhcmFtZXRlcnMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5ldyBBbmkgQWxnb3JpdGhtIGZvciBTdGF0aW9uIHNpZGUgb25seQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBaTV9IQUxfTk9JU0VfSU1NVU5FX01BWCAgICAgNCAgIC8qIE1heCBub2lzZSBpbW11bml0eSBsZXZlbCAqLworI2RlZmluZSBaTV9IQUxfU1BVUl9JTU1VTkVfTUFYICAgICAgNyAgIC8qIE1heCBzcHVyIGltbXVuaXR5IGxldmVsICovCisjZGVmaW5lIFpNX0hBTF9GSVJTVF9TVEVQX01BWCAgICAgICAyICAgLyogTWF4IGZpcnN0IHN0ZXAgbGV2ZWwgKi8KKworI2RlZmluZSBaTV9IQUxfQU5JX09GRE1fVFJJR19ISUdIICAgICAgIDUwMAorI2RlZmluZSBaTV9IQUxfQU5JX09GRE1fVFJJR19MT1cgICAgICAgIDIwMAorI2RlZmluZSBaTV9IQUxfQU5JX0NDS19UUklHX0hJR0ggICAgICAgIDIwMAorI2RlZmluZSBaTV9IQUxfQU5JX0NDS19UUklHX0xPVyAgICAgICAgIDEwMAorI2RlZmluZSBaTV9IQUxfQU5JX05PSVNFX0lNTVVORV9MVkwgICAgIDQKKyNkZWZpbmUgWk1fSEFMX0FOSV9VU0VfT0ZETV9XRUFLX1NJRyAgICBUUlVFCisjZGVmaW5lIFpNX0hBTF9BTklfQ0NLX1dFQUtfU0lHX1RIUiAgICAgRkFMU0UKKyNkZWZpbmUgWk1fSEFMX0FOSV9TUFVSX0lNTVVORV9MVkwgICAgICA3CisjZGVmaW5lIFpNX0hBTF9BTklfRklSU1RFUF9MVkwgICAgICAgICAgMAorI2RlZmluZSBaTV9IQUxfQU5JX1JTU0lfVEhSX0hJR0ggICAgICAgIDQwCisjZGVmaW5lIFpNX0hBTF9BTklfUlNTSV9USFJfTE9XICAgICAgICAgNworI2RlZmluZSBaTV9IQUxfQU5JX1BFUklPRCAgICAgICAgICAgICAgIDEwMAorCisjZGVmaW5lIFpNX0hBTF9FUF9STkQoeCwgbXVsKSBcCisgICAgKCgoKHgpJShtdWwpKSA+PSAoKG11bCkvMikpID8gKCh4KSArICgobXVsKSAtIDEpKSAvIChtdWwpIDogKHgpLyhtdWwpKQorCitzMzJfdCBCRUFDT05fUlNTSSh6ZGV2X3QqIGRldikKK3sKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgcnNzaSA9IFpNX0hBTF9FUF9STkQoSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z2Jyc3NpLCBaTV9IQUxfUlNTSV9FUF9NVUxUSVBMSUVSKTsKKworICAgIHJldHVybiByc3NpOworfQorCisvKgorICogU2V0dXAgQU5JIGhhbmRsaW5nLiAgU2V0cyBhbGwgdGhyZXNob2xkcyBhbmQgbGV2ZWxzIHRvIGRlZmF1bHQgbGV2ZWwgQU5ECisgKiByZXNldHMgdGhlIGNoYW5uZWwgc3RhdGlzdGljcworICovCisKK3ZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QqIGRldikKK3sKKyNkZWZpbmUgTihhKSAgICAgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyAgICB1MzJfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgY29uc3QgaW50IHRvdGFsU2l6ZURlc2lyZWRbXSA9IHsgLTU1LCAtNTUsIC01NSwgLTU1LCAtNjIgfTsKKyAgICBjb25zdCBpbnQgY29hcnNlSGlnaFtdICAgICAgID0geyAtMTQsIC0xNCwgLTE0LCAtMTQsIC0xMiB9OworICAgIGNvbnN0IGludCBjb2Fyc2VMb3dbXSAgICAgICAgPSB7IC02NCwgLTY0LCAtNjQsIC02NCwgLTcwIH07CisgICAgY29uc3QgaW50IGZpcnB3cltdICAgICAgICAgICA9IHsgLTc4LCAtNzgsIC03OCwgLTc4LCAtODAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgeworICAgICAgICBIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWRbaV0gPSB0b3RhbFNpemVEZXNpcmVkW2ldOworICAgICAgICBIcFByaXYtPmNvYXJzZUhpZ2hbaV0gPSBjb2Fyc2VIaWdoW2ldOworICAgICAgICBIcFByaXYtPmNvYXJzZUxvd1tpXSA9IGNvYXJzZUxvd1tpXTsKKyAgICAgICAgSHBQcml2LT5maXJwd3JbaV0gPSBmaXJwd3JbaV07CisgICAgfQorCisgICAgLyogb3dsIGhhcyBwaHkgY291bnRlcnMgKi8KKyAgICBIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMgPSAxOworCisgICAgbWVtc2V0KChjaGFyICopJkhwUHJpdi0+YW5pLCAwLCBzaXplb2YoSHBQcml2LT5hbmkpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTih3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbCk7IGkrKykKKyAgICB7CisgICAgICAgIC8qIE5ldyBBTkkgc3R1ZmYgKi8KKyAgICAgICAgSHBQcml2LT5hbmlbaV0ub2ZkbVRyaWdIaWdoID0gWk1fSEFMX0FOSV9PRkRNX1RSSUdfSElHSDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0ub2ZkbVRyaWdMb3cgPSBaTV9IQUxfQU5JX09GRE1fVFJJR19MT1c7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLmNja1RyaWdIaWdoID0gWk1fSEFMX0FOSV9DQ0tfVFJJR19ISUdIOworICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tUcmlnTG93ID0gWk1fSEFMX0FOSV9DQ0tfVFJJR19MT1c7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLnJzc2lUaHJIaWdoID0gWk1fSEFMX0FOSV9SU1NJX1RIUl9ISUdIOworICAgICAgICBIcFByaXYtPmFuaVtpXS5yc3NpVGhyTG93ID0gWk1fSEFMX0FOSV9SU1NJX1RIUl9MT1c7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID0gIVpNX0hBTF9BTklfVVNFX09GRE1fV0VBS19TSUc7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLmNja1dlYWtTaWdUaHJlc2hvbGQgPSBaTV9IQUxfQU5JX0NDS19XRUFLX1NJR19USFI7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLnNwdXJJbW11bml0eUxldmVsID0gWk1fSEFMX0FOSV9TUFVSX0lNTVVORV9MVkw7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLmZpcnN0ZXBMZXZlbCA9IFpNX0hBTF9BTklfRklSU1RFUF9MVkw7CisgICAgICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1QaHlFcnJCYXNlID0gMDsvL0FSX1BIWV9DT1VOVE1BWCAtIFpNX0hBTF9BTklfT0ZETV9UUklHX0hJR0g7CisgICAgICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tQaHlFcnJCYXNlID0gMDsvL0FSX1BIWV9DT1VOVE1BWCAtIFpNX0hBTF9BTklfQ0NLX1RSSUdfSElHSDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgIHsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJTZXR0aW5nIE9mZG1FcnJCYXNlID0gMHgiLCBIcFByaXYtPmFuaVswXS5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiU2V0dGluZyBjY2tFcnJCYXNlID0gMHgiLCBIcFByaXYtPmFuaVswXS5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMSwgSHBQcml2LT5hbmlbMF0ub2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8yLCBIcFByaXYtPmFuaVswXS5jY2tQaHlFcnJCYXNlKTsKKyAgICB9CisgICAgSHBQcml2LT5hbmlQZXJpb2QgPSBaTV9IQUxfQU5JX1BFUklPRDsKKyAgICAvL2lmIChhdGhfaGFsX2VuYWJsZUFOSSkKKyAgICBIcFByaXYtPnByb2NQaHlFcnIgfD0gWk1fSEFMX1BST0NFU1NfQU5JOworCisgICAgSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z2Jyc3NpID0gWk1fUlNTSV9EVU1NWV9NQVJLRVI7CisgICAgSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z3Jzc2kgPSBaTV9SU1NJX0RVTU1ZX01BUktFUjsKKyAgICBIcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZndHhyc3NpID0gWk1fUlNTSV9EVU1NWV9NQVJLRVI7CisjdW5kZWYgTgorfQorCisvKgorICogQ29udHJvbCBBZGFwdGl2ZSBOb2lzZSBJbW11bml0eSBQYXJhbWV0ZXJzCisgKi8KK3U4X3QgemZIcEFuaUNvbnRyb2woemRldl90KiBkZXYsIFpNX0hBTF9BTklfQ01EIGNtZCwgaW50IHBhcmFtKQoreworI2RlZmluZSBOKGEpIChzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKQorICAgIHR5cGVkZWYgczMyX3QgVEFCTEVbXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTDoKKyAgICB7CisgICAgICAgIHUzMl90IGxldmVsID0gcGFyYW07CisKKyAgICAgICAgaWYgKGxldmVsID49IE4oSHBQcml2LT50b3RhbFNpemVEZXNpcmVkKSkKKyAgICAgICAgeworICAgICAgICAgIHptX2RlYnVnX21zZzEoImxldmVsIG91dCBvZiByYW5nZSwgZGVzaXJlZCBsZXZlbCA6ICIsIGxldmVsKTsKKyAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBOKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZCkpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0RFU0lSRURfU1osCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZRGVzaXJlZFNaICYgfkFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVMpCisgICAgICAgICAgICAgICAgfCAoKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZFtsZXZlbF0gPDwgQVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFU19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFUykpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9BR0NfQ1RMMSwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlBZ2NDdGwxICYgfkFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XKQorICAgICAgICAgICAgICAgIHwgKChIcFByaXYtPmNvYXJzZUxvd1tsZXZlbF0gPDwgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1dfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0FHQ19DVEwxLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWUFnY0N0bDEgJiB+QVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9ISUdIKQorICAgICAgICAgICAgICAgIHwgKChIcFByaXYtPmNvYXJzZUhpZ2hbbGV2ZWxdIDw8IEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9ISUdIKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0ZJTkRfU0lHLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWUZpbmRTaWcgJiB+QVJfUEhZX0ZJTkRfU0lHX0ZJUlBXUikKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT5maXJwd3JbbGV2ZWxdIDw8IEFSX1BIWV9GSU5EX1NJR19GSVJQV1JfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9GSU5EX1NJR19GSVJQV1IpKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgICAgICBpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX25pdXArKzsKKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX25pZG93bisrOworICAgICAgICBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsID0gKHU4X3QpbGV2ZWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT046CisgICAgeworICAgICAgICBjb25zdCBUQUJMRSBtMVRocmVzaExvdyAgID0geyAxMjcsICAgNTAgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTJUaHJlc2hMb3cgICA9IHsgMTI3LCAgIDQwIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0xVGhyZXNoICAgICAgPSB7IDEyNywgMHg0ZCB9OworICAgICAgICBjb25zdCBUQUJMRSBtMlRocmVzaCAgICAgID0geyAxMjcsIDB4NDAgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTJDb3VudFRociAgICA9IHsgIDMxLCAgIDE2IH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yQ291bnRUaHJMb3cgPSB7ICA2MywgICA0OCB9OworICAgICAgICB1MzJfdCBvbiA9IHBhcmFtID8gMSA6IDA7CisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgJiB+QVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPVykKKyAgICAgICAgICAgICAgICB8ICgobTFUaHJlc2hMb3dbb25dIDw8IEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1dfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1cpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgJiB+QVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVykKKyAgICAgICAgICAgICAgICB8ICgobTJUaHJlc2hMb3dbb25dIDw8IEFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1dfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1cpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yciAmIH5BUl9QSFlfU0ZDT1JSX00xX1RIUkVTSCkKKyAgICAgICAgICAgICAgICB8ICgobTFUaHJlc2hbb25dIDw8IEFSX1BIWV9TRkNPUlJfTTFfVEhSRVNIX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSCkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlIsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyICYgfkFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIKQorICAgICAgICAgICAgICAgIHwgKChtMlRocmVzaFtvbl0gPDwgQVJfUEhZX1NGQ09SUl9NMl9USFJFU0hfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUiwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnIgJiB+QVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUikKKyAgICAgICAgICAgICAgICB8ICgobTJDb3VudFRocltvbl0gPDwgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUl9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUikpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yckxvdyAmIH5BUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1cpCisgICAgICAgICAgICAgICAgfCAoKG0yQ291bnRUaHJMb3dbb25dIDw8IEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPV19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XKSk7CisKKyAgICAgICAgaWYgKG9uKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgICAgICBIcFByaXYtPnJlZ1BIWVNmY29yckxvdyB8IEFSX1BIWV9TRkNPUlJfTE9XX1VTRV9TRUxGX0NPUlJfTE9XKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgICAgIEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX1VTRV9TRUxGX0NPUlJfTE9XKTsKKyAgICAgICAgfQorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICBpZiAoIW9uICE9IGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9uKQorICAgICAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9vZmRtb24rKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbW9mZisrOworICAgICAgICAgICAgYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID0gIW9uOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFpNX0hBTF9BTklfQ0NLX1dFQUtfU0lHTkFMX1RIUjoKKyAgICB7CisgICAgICAgIGNvbnN0IFRBQkxFIHdlYWtTaWdUaHJDY2sgPSB7IDgsIDYgfTsKKyAgICAgICAgdTMyX3QgaGlnaCA9IHBhcmFtID8gMSA6IDA7CisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfQ0NLX0RFVEVDVCwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlDY2tEZXRlY3QgJiB+QVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDSykKKyAgICAgICAgICAgICAgICB8ICgod2Vha1NpZ1RockNja1toaWdoXSA8PCBBUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIGlmIChoaWdoICE9IGFuaVN0YXRlLT5jY2tXZWFrU2lnVGhyZXNob2xkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGlnaCkKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NraGlnaCsrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tsb3crKzsKKyAgICAgICAgICAgIGFuaVN0YXRlLT5jY2tXZWFrU2lnVGhyZXNob2xkID0gKHU4X3QpaGlnaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUw6CisgICAgeworICAgICAgICBjb25zdCBUQUJMRSBmaXJzdGVwID0geyAwLCA0LCA4IH07CisgICAgICAgIHUzMl90IGxldmVsID0gcGFyYW07CisKKyAgICAgICAgaWYgKGxldmVsID49IE4oZmlyc3RlcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImxldmVsIG91dCBvZiByYW5nZSwgZGVzaXJlZCBsZXZlbCA6ICIsIGxldmVsKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm1heCBsZXZlbCA6ICIsIE4oZmlyc3RlcCkpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0ZJTkRfU0lHLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWUZpbmRTaWcgJiB+QVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVApCisgICAgICAgICAgICAgICAgfCAoKGZpcnN0ZXBbbGV2ZWxdIDw8IEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfRklORF9TSUdfRklSU1RFUCkpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICBpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3N0ZXB1cCsrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfc3RlcGRvd24rKzsKKyAgICAgICAgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA9ICh1OF90KWxldmVsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUw6CisgICAgeworICAgICAgICBjb25zdCBUQUJMRSBjeWNwd3JUaHIxID0geyAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiB9OworICAgICAgICB1MzJfdCBsZXZlbCA9IHBhcmFtOworCisgICAgICAgIGlmIChsZXZlbCA+PSBOKGN5Y3B3clRocjEpKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBOKGN5Y3B3clRocjEpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9USU1JTkc1LAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVRpbWluZzUgJiB+QVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjEpCisgICAgICAgICAgICAgICAgfCAoKGN5Y3B3clRocjFbbGV2ZWxdIDw8IEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMSkpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICBpZiAobGV2ZWwgPiBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwpCisgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfc3B1cnVwKys7CisgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3NwdXJkb3duKys7CisgICAgICAgIGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA9ICh1OF90KWxldmVsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX1BSRVNFTlQ6CisgICAgICAgIGJyZWFrOworI2lmZGVmIEFIX1BSSVZBVEVfRElBRworICAgIGNhc2UgWk1fSEFMX0FOSV9NT0RFOgorICAgICAgICBpZiAocGFyYW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgSHBQcml2LT5wcm9jUGh5RXJyICY9IH5aTV9IQUxfUFJPQ0VTU19BTkk7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBIVyBjb3VudGVycyBpZiB3ZSBoYXZlIHRoZW0gKi8KKyAgICAgICAgICAgIHpmSHBBbmlEZXRhY2goZGV2KTsKKyAgICAgICAgICAgIC8vemZIcFNldFJ4RmlsdGVyKGRldiwgemZIcEdldFJ4RmlsdGVyKGRldikgJn4gSEFMX1JYX0ZJTFRFUl9QSFlFUlIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAgLyogbm9ybWFsL2F1dG8gbW9kZSAqLworICAgICAgICAgICAgSHBQcml2LT5wcm9jUGh5RXJyIHw9IFpNX0hBTF9QUk9DRVNTX0FOSTsKKyAgICAgICAgICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZkhwU2V0UnhGaWx0ZXIoZGV2LCB6ZkhwR2V0UnhGaWx0ZXIoZGV2KSAmfiBIQUxfUlhfRklMVEVSX1BIWUVSUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZkhwU2V0UnhGaWx0ZXIoZGV2LCB6ZkhwR2V0UnhGaWx0ZXIoZGV2KSB8IEhBTF9SWF9GSUxURVJfUEhZRVJSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0hBTF9BTklfUEhZRVJSX1JFU0VUOgorICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbWVycnMgPSAwOworICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NrZXJycyA9IDA7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEFIX1BSSVZBVEVfRElBRyAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIHptX2RlYnVnX21zZzEoImludmFsaWQgY21kICIsIGNtZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisjdW5kZWYgIE4KK30KKwordm9pZCB6ZkhwQW5pUmVzdGFydCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworCisgICAgYW5pU3RhdGUtPmxpc3RlblRpbWUgPSAwOworICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgeworICAgICAgICAvL2lmIChhbmlTdGF0ZS0+b2ZkbVRyaWdIaWdoID4gQVJfUEhZX0NPVU5UTUFYKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlID0gMDsKKyAgICAgICAgLy8gICAgem1fZGVidWdfbXNnMCgiT0ZETSBUcmlnZ2VyIGlzIHRvbyBoaWdoIGZvciBodyBjb3VudGVycyIpOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSA9IEFSX1BIWV9DT1VOVE1BWCAtIGFuaVN0YXRlLT5vZmRtVHJpZ0hpZ2g7CisgICAgICAgIC8vaWYgKGFuaVN0YXRlLT5jY2tUcmlnSGlnaCA+IEFSX1BIWV9DT1VOVE1BWCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlID0gMDsKKyAgICAgICAgLy8gICAgem1fZGVidWdfbXNnMCgiQ0NLIFRyaWdnZXIgaXMgdG9vIGhpZ2ggZm9yIGh3IGNvdW50ZXJzIik7CisgICAgICAgIC8vfQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgLy8gICAgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UgPSBBUl9QSFlfQ09VTlRNQVggLSBhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2g7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiV3JpdGluZyBvZmRtYmFzZSA9IDB4IiwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJXcml0aW5nIGNja2Jhc2UgPSAweCIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMSwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl9NQVNLXzEsIEFSX1BIWV9FUlJfT0ZETV9USU1JTkcpOworICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl9NQVNLXzIsIEFSX1BIWV9FUlJfQ0NLX1RJTUlORyk7CisgICAgICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSA9IDA7CisgICAgICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlID0gMDsKKyAgICB9CisgICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA9IDA7CisgICAgYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ID0gMDsKK30KKwordm9pZCB6ZkhwQW5pT2ZkbUVyclRyaWdnZXIoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHMzMl90IHJzc2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICAvL0hBTEFTU0VSVChjaGFuICE9IE5VTEwpOworCisgICAgaWYgKChIcFByaXYtPnByb2NQaHlFcnIgJiBaTV9IQUxfUFJPQ0VTU19BTkkpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisgICAgLyogRmlyc3QsIHJhaXNlIG5vaXNlIGltbXVuaXR5IGxldmVsLCB1cCB0byBtYXggKi8KKyAgICBpZiAoYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCA8IFpNX0hBTF9OT0lTRV9JTU1VTkVfTUFYKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX05PSVNFX0lNTVVOSVRZX0xFVkVMLCBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsICsgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogdGhlbiwgcmFpc2Ugc3B1ciBpbW11bml0eSBsZXZlbCwgdXAgdG8gbWF4ICovCisgICAgaWYgKGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA8IFpNX0hBTF9TUFVSX0lNTVVORV9NQVgpCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsICsgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcnNzaSA9IEJFQUNPTl9SU1NJKGRldik7CisgICAgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockhpZ2gpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBoaWdoLCBjYW4gdHVybiBvZmYgb2ZkbSB3ZWFrIHNpZyBkZXRlY3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoIWFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLCBGQUxTRSk7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgd2VhayBzaWcgZGV0ZWN0IGlzIGFscmVhZHkgb2ZmLCBhcyBsYXN0IHJlc29ydCwgcmFpc2UKKyAgICAgICAgICogZmlyc3Qgc3RlcCBsZXZlbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPCBaTV9IQUxfRklSU1RfU1RFUF9NQVgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsICsgMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnNzaSA+IGFuaVN0YXRlLT5yc3NpVGhyTG93KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaW4gbWlkIHJhbmdlLCBuZWVkIG9mZG0gd2VhayBzaWduYWwgZGV0ZWN0LAorICAgICAgICAgKiBidXQgd2UgY2FuIHJhaXNlIGZpcnN0c3RlcExldmVsCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLCBUUlVFKTsKKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPCBaTV9IQUxfRklSU1RfU1RFUF9NQVgpCisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGlzIGxvdywgaWYgaW4gMTFiL2cgbW9kZSwgdHVybiBvZmYgb2ZkbQorICAgICAgICAgKiB3ZWFrIHNpZ24gZGV0Y3Rpb24gYW5kIHplcm8gZmlyc3RlcExldmVsIHRvIG1heGltaXplCisgICAgICAgICAqIENDSyBzZW5zaXRpdml0eQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sIEZBTFNFKTsKKyAgICAgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZIcEFuaUNja0VyclRyaWdnZXIoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHMzMl90IHJzc2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICAvL0hBTEFTU0VSVChjaGFuICE9IE5VTEwpOworCisgICAgaWYgKChIcFByaXYtPnByb2NQaHlFcnIgJiBaTV9IQUxfUFJPQ0VTU19BTkkpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGZpcnN0LCByYWlzZSBub2lzZSBpbW11bml0eSBsZXZlbCwgdXAgdG8gbWF4ICovCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKyAgICBpZiAoYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCA8IFpNX0hBTF9OT0lTRV9JTU1VTkVfTUFYKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX05PSVNFX0lNTVVOSVRZX0xFVkVMLAorICAgICAgICAgICAgICAgICBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsICsgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcnNzaSA9IEJFQUNPTl9SU1NJKGRldik7CisgICAgaWYgKHJzc2kgPiAgYW5pU3RhdGUtPnJzc2lUaHJMb3cpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gc2lnbmFsIGluIG1pZCBhbmQgaGlnaCByYW5nZSwgcmFpc2UgZmlyc3RlcGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPCBaTV9IQUxfRklSU1RfU1RFUF9NQVgpCisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBsb3csIHplcm8gZmlyc3RlcExldmVsIHRvIG1heGltaXplCisgICAgICAgICAqIENDSyBzZW5zaXRpdml0eS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPiAwKQorICAgICAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZkhwQW5pTG93ZXJJbW11bml0eSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisgICAgczMyX3QgcnNzaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisKKyAgICByc3NpID0gQkVBQ09OX1JTU0koZGV2KTsKKyAgICBpZiAocnNzaSA+IGFuaVN0YXRlLT5yc3NpVGhySGlnaCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiBzaWduYWwgaXMgaGlnaCwgbGVhdmUgb2ZkbSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gb2ZmCisgICAgICAgICAqIG9yIGl0IG1heSBvc2NpbGxhdGUuIExldCBpdCBmYWxsIHRocm91Z2guCisgICAgICAgICAqLworICAgIH0KKyAgICBlbHNlIGlmIChyc3NpID4gYW5pU3RhdGUtPnJzc2lUaHJMb3cpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpbiBtaWQgcmFuZ2UsIHR1cm4gb24gb2ZkbSB3ZWFrIHNpZ25hbAorICAgICAgICAgKiBkZXRlY3Rpb24gb3IgbG93ZXIgZmlyc3Qgc3RlcCBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgVFJVRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCAtIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGlzIGxvdywgcmVkdWNlIGZpcnN0IHN0ZXAgbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIC0gMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogdGhlbiBsb3dlciBzcHVyIGltbXVuaXR5IGxldmVsLCBkb3duIHRvIHplcm8gKi8KKyAgICBpZiAoYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsID4gMCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMLCBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgLSAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqIGlmIGFsbCBlbHNlIGZhaWxzLCBsb3dlciBub2lzZSBpbW11bml0eSBsZXZlbCBkb3duIHRvIGEgbWluIHZhbHVlCisgICAgICogemVybyBmb3Igbm93CisgICAgICovCisgICAgaWYgKGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPiAwKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX05PSVNFX0lNTVVOSVRZX0xFVkVMLCBhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsIC0gMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ0xPQ0tfUkFURSA0NDAwMCAgICAvKiBYWFggdXNlIG1hY191c2VjIG9yIHNpbWlsYXIgKi8KKy8qIGNvbnZlcnQgSFcgY291bnRlciB2YWx1ZXMgdG8gbXMgdXNpbmcgMTFnIGNsb2NrIHJhdGUsIGdvbzlkIGVub3VnaAorICAgZm9yIDExYSBhbmQgVHVyYm8gKi8KKworLyoKKyAqIFJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIHNwZW50IGBgbGlzdGVuaW5nJycgYnkKKyAqIGRlZHVjdGluZyB0aGUgY3ljbGVzIHNwZW50IHR4J2luZyBhbmQgcngnaW5nIGZyb20gdGhlIHRvdGFsCisgKiBjeWNsZSBjb3VudCBzaW5jZSBvdXIgbGFzdCBjYWxsLiAgQSByZXR1cm4gdmFsdWUgPDAgaW5kaWNhdGVzCisgKiBhbiBpbnZhbGlkL2luY29uc2lzdGVudCB0aW1lLgorICovCitzMzJfdCB6ZkhwQW5pR2V0TGlzdGVuVGltZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGU7CisgICAgdTMyX3QgdHhGcmFtZUNvdW50LCByeEZyYW1lQ291bnQsIGN5Y2xlQ291bnQ7CisgICAgczMyX3QgbGlzdGVuVGltZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIHR4RnJhbWVDb3VudCA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfVEZDTlQpOworICAgIHJ4RnJhbWVDb3VudCA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfUkZDTlQpOworICAgIGN5Y2xlQ291bnQgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX0NDQ05UKTsKKworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisgICAgaWYgKGFuaVN0YXRlLT5jeWNsZUNvdW50ID09IDAgfHwgYW5pU3RhdGUtPmN5Y2xlQ291bnQgPiBjeWNsZUNvdW50KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3ljbGUgY291bnRlciB3cmFwIChvciBpbml0aWFsIGNhbGwpOyBpdCdzIG5vdCBwb3NzaWJsZQorICAgICAgICAgKiB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhIHZhbHVlIGJlY2F1c2UgdGhlIHJlZ2lzdGVycworICAgICAgICAgKiByaWdodCBzaGlmdCByYXRoZXIgdGhhbiB3cmFwLS1zbyBwdW50IGFuZCByZXR1cm4gMC4KKyAgICAgICAgICovCisgICAgICAgIGxpc3RlblRpbWUgPSAwOworICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfbHplcm8rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgczMyX3QgY2NkZWx0YSA9IGN5Y2xlQ291bnQgLSBhbmlTdGF0ZS0+Y3ljbGVDb3VudDsKKyAgICAgICAgczMyX3QgcmZkZWx0YSA9IHJ4RnJhbWVDb3VudCAtIGFuaVN0YXRlLT5yeEZyYW1lQ291bnQ7CisgICAgICAgIHMzMl90IHRmZGVsdGEgPSB0eEZyYW1lQ291bnQgLSBhbmlTdGF0ZS0+dHhGcmFtZUNvdW50OworICAgICAgICBsaXN0ZW5UaW1lID0gKGNjZGVsdGEgLSByZmRlbHRhIC0gdGZkZWx0YSkgLyBDTE9DS19SQVRFOworICAgIH0KKyAgICBhbmlTdGF0ZS0+Y3ljbGVDb3VudCA9IGN5Y2xlQ291bnQ7CisgICAgYW5pU3RhdGUtPnR4RnJhbWVDb3VudCA9IHR4RnJhbWVDb3VudDsKKyAgICBhbmlTdGF0ZS0+cnhGcmFtZUNvdW50ID0gcnhGcmFtZUNvdW50OworICAgIHJldHVybiBsaXN0ZW5UaW1lOworfQorCisvKgorICogRG8gcGVyaW9kaWMgcHJvY2Vzc2luZy4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUKKyAqIGRyaXZlcidzIHJ4IGludGVycnVwdCBoYW5kbGVyIGFmdGVyIHByb2Nlc3NpbmcgZnJhbWVzLgorICovCit2b2lkIHpmSHBBbmlBclBvbGwoemRldl90KiBkZXYsIHUzMl90IGxpc3RlblRpbWUsIHUzMl90IHBoeUNudDEsIHUzMl90IHBoeUNudDIpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIC8vczMyX3QgbGlzdGVuVGltZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIC8qCisgICAgICogU2luY2Ugd2UncmUgY2FsbGVkIGZyb20gZW5kIG9mIHJ4IHRhc2tsZXQsIHdlIGFsc28gY2hlY2sgZm9yCisgICAgICogQVIgcHJvY2Vzc2luZyBub3cKKyAgICAgKi8KKworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisgICAgLy9IcFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMgPSAqc3RhdHM7ICAgICAgIC8qIFhYWCBvcHRpbWl6ZT8gKi8KKworICAgIC8vbGlzdGVuVGltZSA9IHpmSHBBbmlHZXRMaXN0ZW5UaW1lKGRldik7CisgICAgLy9pZiAobGlzdGVuVGltZSA8IDApCisgICAgLy97CisgICAgLy8gICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2xuZWcrKzsKKyAgICAvLyAgICAvKiByZXN0YXJ0IEFOSSBwZXJpb2QgaWYgbGlzdGVuVGltZSBpcyBpbnZhbGlkICovCisgICAgLy8gICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICAvLyAgICByZXR1cm47CisgICAgLy99CisgICAgLyogWFhYIGJld2FyZSBvZiBvdmVyZmxvdz8gKi8KKyAgICBhbmlTdGF0ZS0+bGlzdGVuVGltZSArPSBsaXN0ZW5UaW1lOworCisgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICB7CisgICAgICAgIC8vdTMyX3QgcGh5Q250MSwgcGh5Q250MjsKKyAgICAgICAgdTMyX3Qgb2ZkbVBoeUVyckNudCwgY2NrUGh5RXJyQ250OworCisgICAgICAgIC8qIE5COiB0aGVzZSBhcmUgbm90IHJlc2V0LW9uLXJlYWQgKi8KKyAgICAgICAgLy9waHlDbnQxID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzEpOworICAgICAgICAvL3BoeUNudDIgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1BIWV9FUlJfMik7CisgICAgICAgIC8qIFhYWCBzb21ldGltZXMgemVybywgd2h5PyAqLworICAgICAgICAvL2lmIChwaHlDbnQxIDwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlIHx8CisgICAgICAgIC8vICAgIHBoeUNudDIgPCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGlmIChwaHlDbnQxIDwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJwaHlDbnQxID0gMHgiLCBwaHlDbnQxKTsKKyAgICAgICAgLy8gICAgICAgIHptX2RlYnVnX21zZzIoInJlc2V0dGluZyBjb3VudGVyIHZhbHVlIHRvIDB4IiwgYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy8gICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl9NQVNLXzEsIEFSX1BIWV9FUlJfT0ZETV9USU1JTkcpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGlmIChwaHlDbnQyIDwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIHptX2RlYnVnX21zZzIoInBoeUNudDIgPSAweCIsIHBoeUNudDIpOworICAgICAgICAvLyAgICAgICAgem1fZGVidWdfbXNnMigicmVzZXR0aW5nIGNvdW50ZXIgdmFsdWUgdG8gMHgiLCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8yLCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl9NQVNLXzIsIEFSX1BIWV9FUlJfQ0NLX1RJTUlORyk7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgcmV0dXJuOyAgICAgLyogWFhYICovCisgICAgICAgIC8vfQorICAgICAgICAvKiBOQjogb25seSB1c2UgYXN0X2FuaV8qZXJycyB3aXRoIEFIX1BSSVZBVEVfRElBRyAqLworICAgICAgICAvL29mZG1QaHlFcnJDbnQgPSBwaHlDbnQxIC0gYW5pU3RhdGUtPm9mZG1QaHlFcnJCYXNlOworICAgICAgICAvL0hwUHJpdi0+c3RhdHMuYXN0X2FuaV9vZmRtZXJycyArPSBvZmRtUGh5RXJyQ250IC0gYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudDsKKyAgICAgICAgLy9hbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID0gb2ZkbVBoeUVyckNudDsKKyAgICAgICAgb2ZkbVBoeUVyckNudCA9IHBoeUNudDE7CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9vZmRtZXJycyArPSBvZmRtUGh5RXJyQ250OworICAgICAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ICs9IG9mZG1QaHlFcnJDbnQ7CisKKyAgICAgICAgLy9jY2tQaHlFcnJDbnQgPSBwaHlDbnQyIC0gYW5pU3RhdGUtPmNja1BoeUVyckJhc2U7CisgICAgICAgIC8vSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2VycnMgKz0gY2NrUGh5RXJyQ250IC0gYW5pU3RhdGUtPmNja1BoeUVyckNvdW50OworICAgICAgICAvL2FuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA9IGNja1BoeUVyckNudDsKKyAgICAgICAgY2NrUGh5RXJyQ250ID0gcGh5Q250MjsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2VycnMgKz0gY2NrUGh5RXJyQ250OworICAgICAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgKz0gY2NrUGh5RXJyQ250OworICAgIH0KKyAgICAvKgorICAgICAqIElmIGFuaSBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGFmdGVyIHdlJ3ZlIGNvbGxlY3RlZAorICAgICAqIHN0YXRpc3RpY3MKKyAgICAgKi8KKyAgICBpZiAoKEhwUHJpdi0+cHJvY1BoeUVyciAmIFpNX0hBTF9QUk9DRVNTX0FOSSkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChhbmlTdGF0ZS0+bGlzdGVuVGltZSA+IDUgKiBIcFByaXYtPmFuaVBlcmlvZCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIGxvd2VyIGltbXVuaXR5IGlmCisgICAgICAgICAqIDUgYW5pUGVyaW9kcyBoYXZlIHBhc3NlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPD0gYW5pU3RhdGUtPmxpc3RlblRpbWUgKgorICAgICAgICAgICAgIGFuaVN0YXRlLT5vZmRtVHJpZ0xvdy8xMDAwICYmCisgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPD0gYW5pU3RhdGUtPmxpc3RlblRpbWUgKgorICAgICAgICAgICAgIGFuaVN0YXRlLT5jY2tUcmlnTG93LzEwMDApCisgICAgICAgICAgICB6ZkhwQW5pTG93ZXJJbW11bml0eShkZXYpOworICAgICAgICB6ZkhwQW5pUmVzdGFydChkZXYpOworICAgIH0KKyAgICBlbHNlIGlmIChhbmlTdGF0ZS0+bGlzdGVuVGltZSA+IEhwUHJpdi0+YW5pUGVyaW9kKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIG5lZWQgdG8gcmFpc2UgaW1tdW5pdHkgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPiBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCisgICAgICAgICAgICBhbmlTdGF0ZS0+b2ZkbVRyaWdIaWdoIC8gMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaU9mZG1FcnJUcmlnZ2VyKGRldik7CisgICAgICAgICAgICB6ZkhwQW5pUmVzdGFydChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA+IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgICAgIGFuaVN0YXRlLT5jY2tUcmlnSGlnaCAvIDEwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDY2tFcnJUcmlnZ2VyKGRldik7CisgICAgICAgICAgICB6ZkhwQW5pUmVzdGFydChkZXYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU2OWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmgKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyX3QJYWNrcmN2X2JhZDsKKwl1MzJfdAlydHNfYmFkOworCXUzMl90CXJ0c19nb29kOworCXUzMl90CWZjc19iYWQ7CisJdTMyX3QJYmVhY29uczsKK30gWk1fSEFMX01JQl9TVEFUUzsKKworLyoKKyAqIFBlci1ub2RlIHN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyIGZvciB1c2UgaW4KKyAqIG9wdGltaXppbmcgc2lnbmFsIHF1YWxpdHkgYW5kIG90aGVyIG9wZXJhdGlvbmFsIGFzcGVjdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzJfdAluc19hdmdicnNzaTsJLyogYXZlcmFnZSBiZWFjb24gcnNzaSAqLworCXUzMl90CW5zX2F2Z3Jzc2k7CSAgICAvKiBhdmVyYWdlIGRhdGEgcnNzaSAqLworCXUzMl90CW5zX2F2Z3R4cnNzaTsJLyogYXZlcmFnZSB0eCByc3NpICovCit9IFpNX0hBTF9OT0RFX1NUQVRTOworCisjZGVmaW5lCVpNX0hBTF9SU1NJX0VQX01VTFRJUExJRVIJKDE8PDcpCS8qIHBvdzIgdG8gb3B0aW1pemUgb3V0ICogYW5kIC8gKi8KKworc3RydWN0IHpzQW5pU3RhdHMgeworICAgIHUzMl90ICAgYXN0X2FuaV9uaXVwOyAgIC8qIEFOSSBpbmNyZWFzZWQgbm9pc2UgaW1tdW5pdHkgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfbmlkb3duOyAvKiBBTkkgZGVjcmVhc2VkIG5vaXNlIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX3NwdXJ1cDsgLyogQU5JIGluY3JlYXNlZCBzcHVyIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX3NwdXJkb3duOy8qIEFOSSBkZXNjcmVhc2VkIHNwdXIgaW1tdW5pdHkgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfb2ZkbW9uOyAvKiBBTkkgT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Qgb24gKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfb2ZkbW9mZjsvKiBBTkkgT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Qgb2ZmICovCisgICAgdTMyX3QgICBhc3RfYW5pX2Nja2hpZ2g7LyogQU5JIENDSyB3ZWFrIHNpZ25hbCB0aHJlc2hvbGQgaGlnaCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9jY2tsb3c7IC8qIEFOSSBDQ0sgd2VhayBzaWduYWwgdGhyZXNob2xkIGxvdyAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zdGVwdXA7IC8qIEFOSSBpbmNyZWFzZWQgZmlyc3Qgc3RlcCBsZXZlbCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zdGVwZG93bjsvKiBBTkkgZGVjcmVhc2VkIGZpcnN0IHN0ZXAgbGV2ZWwgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfb2ZkbWVycnM7LyogQU5JIGN1bXVsYXRpdmUgb2ZkbSBwaHkgZXJyIGNvdW50ICovCisgICAgdTMyX3QgICBhc3RfYW5pX2Nja2VycnM7LyogQU5JIGN1bXVsYXRpdmUgY2NrIHBoeSBlcnIgY291bnQgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfcmVzZXQ7ICAvKiBBTkkgcGFyYW1ldGVycyB6ZXJvJ2QgZm9yIG5vbi1TVEEgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfbHplcm87ICAvKiBBTkkgbGlzdGVuIHRpbWUgZm9yY2VkIHRvIHplcm8gKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfbG5lZzsgICAvKiBBTkkgbGlzdGVuIHRpbWUgY2FsY3VsYXRlZCA8IDAgKi8KKyAgICBaTV9IQUxfTUlCX1NUQVRTICAgYXN0X21pYnN0YXRzOyAgIC8qIE1JQiBjb3VudGVyIHN0YXRzICovCisgICAgWk1fSEFMX05PREVfU1RBVFMgIGFzdF9ub2Rlc3RhdHM7ICAvKiBMYXRlc3QgcnNzaSBzdGF0cyBmcm9tIGRyaXZlciAqLworfTsKKworLyoKKyAqIFBlci1jaGFubmVsIEFOSSBzdGF0ZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIuCisgKi8KK3N0cnVjdCB6c0FuaVN0YXRlIHsKKyAgICBaTV9IQUxfQ0hBTk5FTCBjOworICAgIHU4X3QgICAgbm9pc2VJbW11bml0eUxldmVsOworICAgIHU4X3QgICAgc3B1ckltbXVuaXR5TGV2ZWw7CisgICAgdThfdCAgICBmaXJzdGVwTGV2ZWw7CisgICAgdThfdCAgICBvZmRtV2Vha1NpZ0RldGVjdE9mZjsKKyAgICB1OF90ICAgIGNja1dlYWtTaWdUaHJlc2hvbGQ7CisKKyAgICAvKiBUaHJlc2hvbGRzICovCisgICAgdTMyX3QgICBsaXN0ZW5UaW1lOworICAgIHUzMl90ICAgb2ZkbVRyaWdIaWdoOworICAgIHUzMl90ICAgb2ZkbVRyaWdMb3c7CisgICAgczMyX3QgICBjY2tUcmlnSGlnaDsKKyAgICBzMzJfdCAgIGNja1RyaWdMb3c7CisgICAgczMyX3QgICByc3NpVGhyTG93OworICAgIHMzMl90ICAgcnNzaVRockhpZ2g7CisKKyAgICB1MzJfdCAgIG5vaXNlRmxvb3I7IC8qIFRoZSBjdXJyZW50IG5vaXNlIGZsb29yICovCisgICAgdTMyX3QgICB0eEZyYW1lQ291bnQ7ICAgLyogTGFzdCB0eEZyYW1lQ291bnQgKi8KKyAgICB1MzJfdCAgIHJ4RnJhbWVDb3VudDsgICAvKiBMYXN0IHJ4IEZyYW1lIGNvdW50ICovCisgICAgdTMyX3QgICBjeWNsZUNvdW50OyAvKiBMYXN0IGN5Y2xlQ291bnQgKGNhbiBkZXRlY3Qgd3JhcC1hcm91bmQpICovCisgICAgdTMyX3QgICBvZmRtUGh5RXJyQ291bnQ7LyogT0ZETSBlcnIgY291bnQgc2luY2UgbGFzdCByZXNldCAqLworICAgIHUzMl90ICAgY2NrUGh5RXJyQ291bnQ7IC8qIENDSyBlcnIgY291bnQgc2luY2UgbGFzdCByZXNldCAqLworICAgIHUzMl90ICAgb2ZkbVBoeUVyckJhc2U7IC8qIEJhc2UgdmFsdWUgZm9yIG9mZG0gZXJyIGNvdW50ZXIgKi8KKyAgICB1MzJfdCAgIGNja1BoeUVyckJhc2U7ICAvKiBCYXNlIHZhbHVlIGZvciBjY2sgZXJyIGNvdW50ZXJzICovCisgICAgczE2X3QgICBwa3RSc3NpWzJdOyAvKiBBdmVyYWdlIHJzc2kgb2YgcGt0cyBmb3IgMiBhbnRlbm5hcyAqLworICAgIHMxNl90ICAgb2ZkbUVyclJzc2lbMl07IC8qIEF2ZXJhZ2UgcnNzaSBvZiBvZmRtIHBoeSBlcnJzIGZvciAyIGFudCAqLworICAgIHMxNl90ICAgY2NrRXJyUnNzaVsyXTsgIC8qIEF2ZXJhZ2UgcnNzaSBvZiBjY2sgcGh5IGVycnMgZm9yIDIgYW50ICovCit9OworCit0eXBlZGVmIGVudW0geworCVpNX0hBTF9BTklfUFJFU0VOVCwJCQkvKiBpcyBBTkkgc3VwcG9ydCBwcmVzZW50ICovCisJWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwJCS8qIHNldCBsZXZlbCAqLworCVpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sCS8qIGVuYWJsZS9kaXNhYmxlICovCisJWk1fSEFMX0FOSV9DQ0tfV0VBS19TSUdOQUxfVEhSLAkJLyogZW5hYmxlL2Rpc2FibGUgKi8KKwlaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsCQkJLyogc2V0IGxldmVsICovCisJWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMLAkJLyogc2V0IGxldmVsICovCisJWk1fSEFMX0FOSV9NT0RFLAkJCQkvKiAwID0+IG1hbnVhbCwgMSA9PiBhdXRvICovCisJWk1fSEFMX0FOSV9QSFlFUlJfUkVTRVQsCQkJLyogcmVzZXQgcGh5IGVycm9yIHN0YXRzICovCit9IFpNX0hBTF9BTklfQ01EOworCisjZGVmaW5lIEFSX1BIWV9DT1VOVE1BWCAgICAgICAgKDMgPDwgMjIpICAgICAgICAgLy8gTWF4IGNvdW50ZWQgYmVmb3JlIGludHIKKyNkZWZpbmUgWk1fSEFMX1BST0NFU1NfQU5JICAgICAweDAwMDAwMDAxICAvKiBBTkkgc3RhdGUgc2V0dXAgKi8KKyNkZWZpbmUgWk1fUlNTSV9EVU1NWV9NQVJLRVIJMHgxMjcKKworLyogUEhZIHJlZ2lzdGVycyBpbiBhcjU0MTYsIHJlbGF0ZWQgYmFzZSBhbmQgcmVnaXN0ZXIgb2Zmc2V0cworICAgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZCBpbiBvdHVzIEJCICovCisjZGVmaW5lIEFSX1BIWV9CQVNFICAgICAweDFDNTgwMCAgICAgIC8qIGJhc2UgYWRkcmVzcyBvZiBwaHkgcmVncyAqLworI2RlZmluZSBBUl9QSFkoX24pICAgICAgKEFSX1BIWV9CQVNFICsgKChfbik8PDIpKQorCisjZGVmaW5lIEFSX1BIWV9URVNUICAgICAgICAgICAgIDB4MUM1ODAwICAgICAgICAgIC8qIFBIWSB0ZXN0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEhZX0FHQ19DTFIgICAgICAgICAgICAgMHgxMDAwMDAwMCAgICAgIC8qIGRpc2FibGUgQUdDIHRvIEEyICovCisjZGVmaW5lIFJGU0lMRU5UX0JCICAgICAgICAgICAgIDB4MDAwMDIwMDAgICAgICAvKiBzaHVzaCBiYiAqLworCisjZGVmaW5lIEFSX1BIWV9UVVJCTyAgICAgICAgMHgxQzU4MDQgICAgICAvKiBmcmFtZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFSX1BIWV9GQ19UVVJCT19NT0RFICAgICAgICAweDAwMDAwMDAxICAvKiBTZXQgdHVyYm8gbW9kZSBiaXRzICovCisjZGVmaW5lIEFSX1BIWV9GQ19UVVJCT19TSE9SVCAgICAgICAweDAwMDAwMDAyICAvKiBTZXQgc2hvcnQgc3ltYm9scyB0byB0dXJibyBtb2RlIHNldHRpbmcgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0RZTjIwNDBfRU4gICAgICAgIDB4MDAwMDAwMDQgICAgICAvKiBFbmFibGUgZHluIDIwLzQwIG1vZGUgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0RZTjIwNDBfUFJJX09OTFkgICAgICAweDAwMDAwMDA4ICAgICAgLyogZHluIDIwLzQwIC0gcHJpbWFyeSBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX1BSSV9DSCAgICAweDAwMDAwMDEwICAgICAgLyogZHluIDIwLzQwIC0gcHJpbWFyeSBjaCBvZmZzZXQgKDA9KzEwTUh6LCAxPS0xME1IeikqLworI2RlZmluZSBBUl9QSFlfRkNfRFlOMjA0MF9FWFRfQ0ggICAgICAgIDB4MDAwMDAwMjAgICAgICAvKiBkeW4gMjAvNDAgLSBleHQgY2ggc3BhY2luZyAoMD0yME1Iei8gMT0yNU1IeikgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0hUX0VOICAgICAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvKiBodCBlbmFibGUgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX1NIT1JUX0dJXzQwICAgICAgIDB4MDAwMDAwODAgICAgICAvKiBhbGxvdyBzaG9ydCBHSSBmb3IgSFQgNDAgKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX1dBTFNIICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgICAvKiB3YWxzaCBzcGF0aWFsIHNwcmVhZGluZyBmb3IgMiBjaGFpbnMsMiBzdHJlYW1zIFRYICovCisjZGVmaW5lIEFSX1BIWV9GQ19TSU5HTEVfSFRfTFRGMSAgICAgICAgMHgwMDAwMDIwMCAgICAgIC8qIHNpbmdsZSBsZW5ndGggKDR1cykgMXN0IEhUIGxvbmcgdHJhaW5pbmcgc3ltYm9sICovCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzIgICAgICAweDFDNTgxMCAgICAgIC8qIFRpbWluZyBDb250cm9sIDIgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlORzJfVVNFX0ZPUkNFICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzJfRk9SQ0VfVkFMICAgIDB4MDAwMDBmZmYKKworI2RlZmluZSBBUl9QSFlfVElNSU5HMyAgICAgIDB4MUM1ODE0ICAgICAgLyogVGltaW5nIGNvbnRyb2wgMyAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfTUFOICAweEZGRkUwMDAwCisjZGVmaW5lIEFSX1BIWV9USU1JTkczX0RTQ19NQU5fUyAgICAxNworI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfRVhQICAweDAwMDFFMDAwCisjZGVmaW5lIEFSX1BIWV9USU1JTkczX0RTQ19FWFBfUyAgICAxMworCisjZGVmaW5lIEFSX1BIWV9DSElQX0lEICAgICAgICAgIDB4MUM1ODE4ICAgICAgLyogUEhZIGNoaXAgcmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgQVJfUEhZX0NISVBfSURfUkVWXzAgICAgMHg4MCAgICAgICAgLyogNTQxNiBSZXYgMCAob3dsIDEuMCkgQkIgKi8KKyNkZWZpbmUgQVJfUEhZX0NISVBfSURfUkVWXzEgICAgMHg4MSAgICAgICAgLyogNTQxNiBSZXYgMSAob3dsIDIuMCkgQkIgKi8KKworI2RlZmluZSBBUl9QSFlfQUNUSVZFICAgICAgIDB4MUM1ODFDICAgICAgLyogYWN0aXZhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBBUl9QSFlfQUNUSVZFX0VOICAgIDB4MDAwMDAwMDEgIC8qIEFjdGl2YXRlIFBIWSBjaGlwcyAqLworI2RlZmluZSBBUl9QSFlfQUNUSVZFX0RJUyAgIDB4MDAwMDAwMDAgIC8qIERlYWN0aXZhdGUgUEhZIGNoaXBzICovCisKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgxQzU4MjQKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9EQVRBX1NUQVJUICAweDAwMDAwMEZGCisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfREFUQV9TVEFSVF9TICAwCisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfUEFfT04gICAgICAgMHgwMDAwRkYwMAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX1BBX09OX1MgICAgICAgOAorCisKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDMgICAgICAgICAgICAgICAgICAweDFDNTgyOAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX1RPX0EyX1JYX09OICAgICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9UT19BMl9SWF9PTl9TICAgICAxNgorCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMICAgICAgMHgxQzU4MkMKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX0lOQlVGR0FJTiAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9JTkJVRkdBSU5fUyAgMAorI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfUFdEREFDICAgMHgwMDAwMjAwMAorI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfUFdEQkFOREdBUCAgIDB4MDAwMDQwMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfUFdEQURDICAgMHgwMDAwODAwMCAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09OX0lOQlVGR0FJTiAweDAwMDMwMDAwCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09OX0lOQlVGR0FJTl9TICAgMTYKKworI2RlZmluZSBBUl9QSFlfQURDX1NFUklBTF9DVEwgICAgICAgMHgxQzU4MzAKKyNkZWZpbmUgQVJfUEhZX1NFTF9JTlRFUk5BTF9BRERBQyAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1NFTF9FWFRFUk5BTF9SQURJTyAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBBUl9QSFlfUkZfQ1RMNCAgICAgICAgICAgICAgICAgICAgMHgxQzU4MzQKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfVFhfRU5EX1hQQUJfT0ZGICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfVFhfRU5EX1hQQUJfT0ZGX1MgIDI0CisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFBX09GRiAgICAweDAwRkYwMDAwCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFBX09GRl9TICAxNgorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFCX09OICAgICAgMHgwMDAwRkYwMAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFCX09OX1MgICAgOAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFBX09OICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFBX09OX1MgICAgMAorCisjZGVmaW5lIEFSX1BIWV9TRVRUTElORyAgICAgMHgxQzU4NDQKKyNkZWZpbmUgQVJfUEhZX1NFVFRMSU5HX1NXSVRDSCAgMHgwMDAwM0Y4MAorI2RlZmluZSBBUl9QSFlfU0VUVExJTkdfU1dJVENIX1MgICAgNworCisjZGVmaW5lIEFSX1BIWV9SWEdBSU4gICAgICAgMHgxQzU4NDgKKyNkZWZpbmUgQVJfUEhZX1JYR0FJTl9UWFJYX0FUVEVOICAgIDB4MDAwM0YwMDAKKyNkZWZpbmUgQVJfUEhZX1JYR0FJTl9UWFJYX0FUVEVOX1MgIDEyCisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9SRl9NQVggICAweDAwN0MwMDAwCisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9SRl9NQVhfUyAxOAorCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaICAgMHgxQzU4NTAKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfQURDICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfQURDX1MgICAgIDAKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfUEdBICAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfUEdBX1MgICAgIDgKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFUyAgIDB4MEZGMDAwMDAKKyNkZWZpbmUgQVJfUEhZX0RFU0lSRURfU1pfVE9UX0RFU19TIDIwCisKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHICAgICAgMHgxQzU4NTgKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVAgIDB4MDAwM0YwMDAKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVBfUyAgICAgICAgMTIKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHX0ZJUlBXUiAgIDB4MDNGQzAwMDAKKyNkZWZpbmUgQVJfUEhZX0ZJTkRfU0lHX0ZJUlBXUl9TICAgICAgICAgMTgKKworI2RlZmluZSBBUl9QSFlfQUdDX0NUTDEgICAgICAweDFDNTg1QworI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPVyAgICAgICAweDAwMDA3RjgwCisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XX1MgICAgICAgICA3CisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSCAgICAgIDB4MDAzRjgwMDAKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9ISUdIX1MgICAgICAgIDE1CisKKyNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MICAweDFDNTg2MCAgICAgIC8qIGNoaXAgY2FsaWJyYXRpb24gYW5kIG5vaXNlIGZsb29yIHNldHRpbmcgKi8KKyNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MX0NBTCAgMHgwMDAwMDAwMSAgLyogZG8gaW50ZXJuYWwgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MX05GICAgMHgwMDAwMDAwMiAgLyogZG8gbm9pc2UtZmxvb3IgY2FsY3VsYXRpb24gKi8KKworI2RlZmluZSBBUl9QSFlfQ0NBICAgICAgICAgICAgICAweDFDNTg2NAorI2RlZmluZSBBUl9QSFlfTUlOQ0NBX1BXUiAgICAgICAweDFGRjAwMDAwCisjZGVmaW5lIEFSX1BIWV9NSU5DQ0FfUFdSX1MgICAgIDE5CisjZGVmaW5lIEFSX1BIWV9DQ0FfVEhSRVNINjIgICAgIDB4MDAwN0YwMDAKKyNkZWZpbmUgQVJfUEhZX0NDQV9USFJFU0g2Ml9TICAgMTIKKworI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPVyAgICAweDFDNTg2QworI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1cgICAgMHgwMDAwM0YwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1dfUyAgOAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XICAweDAwMUZDMDAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1dfUyAgICAxNAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XICAweDBGRTAwMDAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1dfUyAgICAyMQorCisjZGVmaW5lIEFSX1BIWV9TRkNPUlIgICAgICAgMHgxQzU4NjgKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMkNPVU5UX1RIUiAgICAweDAwMDAwMDFGCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFJfUyAgMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSCAgMHgwMEZFMDAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSF9TICAgIDE3CisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIICAweDdGMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIX1MgICAgMjQKKworI2RlZmluZSBBUl9QSFlfU0xFRVBfQ1RSX0NPTlRST0wgICAgMHgxQzU4NzAKKyNkZWZpbmUgQVJfUEhZX1NMRUVQX0NUUl9MSU1JVCAgICAgIDB4MUM1ODc0CisjZGVmaW5lIEFSX1BIWV9TTEVFUF9TQ0FMICAgICAgIDB4MUM1ODc4CisKKyNkZWZpbmUgQVJfUEhZX1BMTF9DVEwgICAgICAgICAgMHgxQzU4N2MgICAgICAvKiBQTEwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBUl9QSFlfUExMX0NUTF80MCAgICAgICAweGFhICAgICAgICAvKiA0MCBNSHogKi8KKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDBfNTQxMyAgMHgwNAorI2RlZmluZSBBUl9QSFlfUExMX0NUTF80NCAgICAgICAweGFiICAgICAgICAvKiA0NCBNSHogZm9yIDExYiwgMTFnICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQ0XzIxMzMgIDB4ZWIgICAgICAgIC8qIDQ0IE1IeiBmb3IgMTFiLCAxMWcgKi8KKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDBfMjEzMyAgMHhlYSAgICAgICAgLyogNDAgTUh6IGZvciAxMWEsIHR1cmJvcyAqLworCisjZGVmaW5lIEFSX1BIWV9SWF9ERUxBWSAgICAgMHgxQzU5MTQgICAgICAvKiBhbmFsb2cgcG93LW9uIHRpbWUgKDEwMG5zKSAqLworI2RlZmluZSBBUl9QSFlfUlhfREVMQVlfREVMQVkgICAweDAwMDAzRkZGICAvKiBkZWxheSBmcm9tIHdha2V1cCB0byByeCBlbmEgKi8KKworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0ICAgICAweDFDNTkyMCAgICAgIC8qIHRpbWluZyBjb250cm9sICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfUV9DT0ZGIDB4MDFGICAgLyogTWFzayBmb3Iga2Nvc190aGV0YS0xIGZvciBxIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9RX0NPRkZfUyAgIDAgICAvKiBzaGlmdCBmb3IgUV9DT0ZGICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfSV9DT0ZGIDB4N0UwICAgLyogTWFzayBmb3Igc2luX3RoZXRhIGZvciBpIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9JX0NPRkZfUyAgIDUgICAvKiBTaGlmdCBmb3Igc2luX3RoZXRhIGZvciBpIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfRU5BQkxFICAgMHg4MDAgICAvKiBlbmFibGUgSVEgY29ycmVjdGlvbiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ0FMX0xPR19DT1VOVF9NQVggMHhGMDAwICAvKiBNYXNrIGZvciBtYXggbnVtYmVyIG9mIHNhbXBsZXMgKGxvZ2FyaXRobWljKSAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ0FMX0xPR19DT1VOVF9NQVhfUyAgIDEyICAvKiBTaGlmdCBmb3IgbWF4IG51bWJlciBvZiBzYW1wbGVzICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfRE9fSVFDQUwgICAgMHgxMDAwMCAgICAgLyogcGVyZm9ybSBJUSBjYWxpYnJhdGlvbiAqLworCisjZGVmaW5lIEFSX1BIWV9USU1JTkc1ICAgICAgMHgxQzU5MjQKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjEgIDB4MDAwMDAwRkUKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjFfUyAgICAxCisKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEUxICAgMHgxQzU5MzQKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEUyICAgMHgxQzU5MzgKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEVfTUFYICAgIDB4MUM1OTNjCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFX01BWF9UUENfRU5BQkxFIDB4MDAwMDAwNDAKKworI2RlZmluZSBBUl9QSFlfRlJBTUVfQ1RMICAgIDB4MUM1OTQ0CisjZGVmaW5lIEFSX1BIWV9GUkFNRV9DVExfVFhfQ0xJUCAgICAweDAwMDAwMDM4CisjZGVmaW5lIEFSX1BIWV9GUkFNRV9DVExfVFhfQ0xJUF9TICAzCisKKyNkZWZpbmUgQVJfUEhZX1RYUFdSQURKICAgICAweDFDNTk0QyAgICAgIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX1RYUFdSQURKX0NDS19HQUlOX0RFTFRBICAweDAwMDAwRkMwCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfR0FJTl9ERUxUQV9TICAgIDYKKyNkZWZpbmUgQVJfUEhZX1RYUFdSQURKX0NDS19QQ0RBQ19JTkRFWCAweDAwRkMwMDAwCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfUENEQUNfSU5ERVhfUyAgIDE4CisKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzAgICAgICAweDFDNTk1NCAgICAgIC8qIHJhZGFyIGRldGVjdGlvbiBzZXR0aW5ncyAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9FTkEgIDB4MDAwMDAwMDEgIC8qIEVuYWJsZSByYWRhciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSU5CQU5EICAgMHgwMDAwMDAzZSAgLyogSW5iYW5kIHB1bHNlIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9JTkJBTkRfUyAxCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX1BSU1NJICAgIDB4MDAwMDBGQzAgIC8qIFB1bHNlIHJzc2kgdGhyZXNob2xkICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX1BSU1NJX1MgIDYKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSEVJR0hUICAgMHgwMDAzRjAwMCAgLyogUHVsc2UgaGVpZ2h0IHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9IRUlHSFRfUyAxMgorI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9SUlNTSSAgICAweDAwRkMwMDAwICAvKiBSYWRhciByc3NpIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9SUlNTSV9TICAxOAorI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9GSVJQV1IgICAweDdGMDAwMDAwICAvKiBSYWRhciBmaXJwd3IgdGhyZXNob2xkICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0ZJUlBXUl9TIDI0CisKKyNkZWZpbmUgQVJfUEhZX1NXSVRDSF9DSEFJTl8wICAgICAweDFDNTk2MAorI2RlZmluZSBBUl9QSFlfU1dJVENIX0NPTSAgICAgICAgIDB4MUM1OTY0CisKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBICAweDFDNTk2QyAgICAgIC8qIEFSNTMxMiBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9BRENfU0VMICAweDAwMDAwMDAzCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQV9BRENfU0VMX1MgICAgMAorI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfRklMVDIgICAgMHgwMDAwMDBGOAorI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfRklMVDJfUyAgMworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfRklMVDEgICAgMHgwMDAwMUYwMAorI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfRklMVDFfUyAgOAorI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX0NMSVAgMHgwMUZGRTAwMAorI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX0NMSVBfUyAgIDEzCisKKyNkZWZpbmUgQVJfUEhZX1JFU1RBUlQgICAgICAweDFDNTk3MCAgICAgIC8qIHJlc3RhcnQgKi8KKyNkZWZpbmUgQVJfUEhZX1JFU1RBUlRfRElWX0dDICAgMHgwMDFDMDAwMCAgLyogYmJfYW50X2Zhc3RfZGl2X2djX2xpbWl0ICovCisjZGVmaW5lIEFSX1BIWV9SRVNUQVJUX0RJVl9HQ19TIDE4CisKKyNkZWZpbmUgQVJfUEhZX1JGQlVTX1JFUSAgICAgICAgMHgxQzU5N0MKKyNkZWZpbmUgQVJfUEhZX1JGQlVTX1JFUV9FTiAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIEFSX1BIWV9SWF9DSEFJTk1BU0sgICAgIDB4MUM1OWE0CisKKyNkZWZpbmUgQVJfUEhZX0VYVF9DQ0EgICAgICAgICAgMHgxQzU5YmMKKyNkZWZpbmUgQVJfUEhZX0VYVF9NSU5DQ0FfUFdSICAgMHhGRjgwMDAwMAorI2RlZmluZSBBUl9QSFlfRVhUX01JTkNDQV9QV1JfUyAyMworCisjZGVmaW5lIEFSX1BIWV9IQUxGR0kgICAgICAgICAgIDB4MUM1OUQwICAgICAgLyogVGltaW5nIGNvbnRyb2wgMyAqLworI2RlZmluZSBBUl9QSFlfSEFMRkdJX0RTQ19NQU4gICAweDAwMDdGRkYwCisjZGVmaW5lIEFSX1BIWV9IQUxGR0lfRFNDX01BTl9TIDQKKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfRVhQICAgMHgwMDAwMDAwRgorI2RlZmluZSBBUl9QSFlfSEFMRkdJX0RTQ19FWFBfUyAwCisKKyNkZWZpbmUgQVJfUEhZX0hFQVZZX0NMSVBfRU5BQkxFICAgIDB4MUM1OUUwCisKKyNkZWZpbmUgQVJfUEhZX01fU0xFRVAgICAgICAweDFDNTlmMCAgICAgIC8qIHNsZWVwIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFSX1BIWV9SRUZDTEtETFkgICAgMHgxQzU5ZjQKKyNkZWZpbmUgQVJfUEhZX1JFRkNMS1BEICAgICAweDFDNTlmOAorCisvKiBQSFkgSVEgY2FsaWJyYXRpb24gcmVzdWx0cyAqLworI2RlZmluZSBBUl9QSFlfSVFDQUxfUkVTX1BXUl9NRUFTX0kgMHgxQzVDMTAgIC8qIHBvd2VyIG1lYXN1cmVtZW50IGZvciBJICovCisjZGVmaW5lIEFSX1BIWV9JUUNBTF9SRVNfUFdSX01FQVNfUSAweDFDNUMxNCAgLyogcG93ZXIgbWVhc3VyZW1lbnQgZm9yIFEgKi8KKyNkZWZpbmUgQVJfUEhZX0lRQ0FMX1JFU19JUV9DT1JSX01FQVMgICAweDFDNUMxOCAgLyogSVEgY29ycmVsYXRpb24gbWVhc3VyZW1lbnQgKi8KKworI2RlZmluZSBBUl9QSFlfQ1VSUkVOVF9SU1NJIDB4MUM1QzFjICAgICAgLyogcnNzaSBvZiBjdXJyZW50IGZyYW1lIHJ4J2QgKi8KKworI2RlZmluZSBBUl9QSFlfUkZCVVNfR1JBTlQgICAgICAgMHgxQzVDMjAKKyNkZWZpbmUgQVJfUEhZX1JGQlVTX0dSQU5UX0VOICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBBUl9QSFlfTU9ERSAgICAgMHgxQzYyMDAgIC8qIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQVIyMTMzICAweDA4ICAgIC8qIEFSMjEzMyAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9BUjUxMTEgIDB4MDAgICAgLyogQVI1MTExL0FSMjExMSAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9BUjUxMTIgIDB4MDggICAgLyogQVI1MTEyKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfRFlOQU1JQyAweDA0ICAgIC8qIGR5bmFtaWMgQ0NLL09GRE0gbW9kZSAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9SRjJHSFogIDB4MDIgICAgLyogMi40IEdIeiAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9SRjVHSFogIDB4MDAgICAgLyogNSBHSHogKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQ0NLICAgICAweDAxICAgIC8qIENDSyAqLworI2RlZmluZSBBUl9QSFlfTU9ERV9PRkRNICAgIDB4MDAgICAgLyogT0ZETSAqLworCisjZGVmaW5lIEFSX1BIWV9DQ0tfVFhfQ1RSTCAgMHgxQzYyMDQKKyNkZWZpbmUgQVJfUEhZX0NDS19UWF9DVFJMX0pBUEFOICAgIDB4MDAwMDAwMTAKKworI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM2MjA4CisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0sgICAgICAgICAgMHgwMDAwMDAzRgorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLX1MgICAgICAgIDAKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfQU5UX1NXSVRDSF9USU1FICAgICAgICAgICAweDAwMDAxRkMwIC8vIFsxMjo2XSBzZXR0bGluZyB0aW1lIGZvciBhbnRlbm5hIHN3aXRjaAorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9BTlRfU1dJVENIX1RJTUVfUyAgICAgICAgIDYKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfQkJfRU5BQkxFX0FOVF9GQVNUX0RJViAgICAweDIwMDAKKworI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haICAgIDB4MUM2MjBDCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfUlhUWF9NQVJHSU4gICAgMHgwMEZDMDAwMAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX1JYVFhfTUFSR0lOX1MgIDE4CisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfQlNXX01BUkdJTiAgICAgMHgwMDAwM0MwMAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19NQVJHSU5fUyAgIDEwCisjZGVmaW5lIEFSX1BIWV9HQUlOXzJHSFpfQlNXX0FUVEVOICAgICAgMHgwMDAwMDAxRgorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19BVFRFTl9TICAgIDAKKworI2RlZmluZSBBUl9QSFlfQ0NLX1JYQ1RSTDQgIDB4MUM2MjFDCisjZGVmaW5lIEFSX1BIWV9DQ0tfUlhDVFJMNF9GUkVRX0VTVF9TSE9SVCAgIDB4MDFGODAwMDAKKyNkZWZpbmUgQVJfUEhZX0NDS19SWENUUkw0X0ZSRVFfRVNUX1NIT1JUX1MgMTkKKworI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0sgIDB4MUM2MjI4CisjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19FTl9SU1NJX1RIUiAgMHgwMDAwMDIwMCAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19SU1NJX1RIUiAweDAwMDFGQzAwIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0RBR19DVFJMQ0NLX1JTU0lfVEhSX1MgICAxMCAgICAgLyogQkIgUmV2IDQuMisgb25seSAqLworCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFMyAgIDB4MUM2MjM0CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNCAgIDB4MUM2MjM4CisKKyNkZWZpbmUgQVJfUEhZX1NDUk1fU0VRX1hSICAweDFDNjIzQworI2RlZmluZSBBUl9QSFlfSEVBREVSX0RFVEVDVF9YUiAweDFDNjI0MAorI2RlZmluZSBBUl9QSFlfQ0hJUlBfREVURUNURURfWFIgICAgMHgxQzYyNDQKKyNkZWZpbmUgQVJfUEhZX0JMVUVUT09USCAgICAweDFDNjI1NAorCisjZGVmaW5lIEFSX1BIWV9UUENSRzEgICAweDFDNjI1OCAgLyogYXIyNDEzIHBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9OVU1fUERfR0FJTiAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9OVU1fUERfR0FJTl9TIDE0CisKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzEgICAgMHgwMDAzMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMV9TICAxNgorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMiAgICAweDAwMEMwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8yX1MgIDE4CisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8zICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzNfUyAgMjAKKy8vCisKKyNkZWZpbmUgQVJfUEhZX0FOQUxPR19TV0FQICAgICAgMHhhMjY4CisjZGVmaW5lIEFSX1BIWV9TV0FQX0FMVF9DSEFJTiAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBBUl9QSFlfVFBDUkc1ICAgMHgxQzYyNkMgLyogYXIyNDEzIHBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX09WRVJMQVAgICAweDAwMDAwMDBGCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9PVkVSTEFQX1MgICAgIDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzEgICAgMHgwMDAwMDNGMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMV9TICA0CisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8yICAgIDB4MDAwMEZDMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzJfUyAgMTAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzMgICAgMHgwMDNGMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfM19TICAxNgorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfNCAgICAweDBGQzAwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV80X1MgIDIyCisKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU1ICAgMHgxQzYzOEMKKyNkZWZpbmUgQVJfUEhZX1BPV0VSX1RYX1JBVEU2ICAgMHgxQzYzOTAKKworI2RlZmluZSBBUl9QSFlfQ0FMX0NIQUlOTUFTSyAgICAweDFDNjM5QworCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9TVUIgICAgIDB4MUM2M0M4CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNyAgIDB4MUM2M0NDCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFOCAgIDB4MUM2M0QwCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFOSAgIDB4MUM2M0Q0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmdzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2ViMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmdzIuYwpAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y1AyRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMEQsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweDdGMDQ3NjAxLCAweEEwNUE0RjI2LCAweDRGMjI2RUY2LAorMHg0MTBCRDE4NSwgMHhENDg1MDAwOSwgMHgwMDA5NDQwQiwgMHg0NTBCRDU4NCwKKzB4RDc4NDAwMDksIDB4RDI4NEUxRkYsIDB4MjcxMjYxMUQsIDB4RDQ4MzUwMjksCisweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLCAweEU3MjAyNDUyLAorMHg0NzE4RDU3RiwgMHgyNTcyRDI3RiwgMHhEMTdGRTcwMCwgMHhENjgwRDQ3RiwKKzB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RTI2MjAsIDB4MjY0MUU0RkYsCisweEQ1N0RFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLCAweDQwMDA2MjZELAorMHg4RkY4MzIxMiwgMHhENTc5MDU0NSwgMHgyNTIwRTIwMSwgMHhEMjc5RDc3OCwKKzB4MjcxMEUxMDAsIDB4RTU4MDIyMTIsIDB4NjU1QzY2MTMsIDB4NjY2REQ0NzYsCisweDc2MDQ2NzYzLCAweDM3NEM2MjZELCAweDhGRjgzMjUzLCAweEQ0NzMyNzEyLAorMHhENTczRTEwMSwgMHhENjczMjQxMCwgMHgyNTQyRTQwMCwgMHhFMDNBRTUwMSwKKzB4RDI3MkQ3NzEsIDB4RTAzOTA2NTQsIDB4MjcxMTA2NTQsIDB4MDAwQjRGMjYsCisweDdGQzgyMjExLCAweEQ3NkZEMTZFLCAweERDNzBEQjZGLCAweEQyNzFERTcwLAorMHhENTcyRDQ3MSwgMHgxRjEyRDY3MiwgMHgxRjc2NzEwQywgMHgxRkI4NzdGQywKKzB4MUZFQTFGQzksIDB4NzIwNDFGMkIsIDB4REU2RkRDNkUsIDB4MUYxM0VCMTAsCisweDFGNTExRjQ0LCAweDFGNzcxRjY1LCAweEQ4NkMxRjJDLCAweERENkREOTZDLAorMHhEMjZERUEwMCwgMHg4OTAwM0EyMiwgMHhEMTU4N0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGOThCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTRDLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0QiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGQUQxNDcsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNzY3OTIsIDB4MjE3MjUyRjYsIDB4RDY1NTUxOTEsIDB4NTVGQjIyMTIsCisweDUyRkM2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwMkRFMjY1MiwgMHhDOTAzNjAyMSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDcyNkQ1NDEsIDB4NjU1MkQ0NDEsIDB4NTE0MzY2NzIsCisweDMxNkMzNjVDLCAweDI3NjIyNjY4LCAweDE0MTM4RDA1LCAweDYyNjJENjNELAorMHhCMUE1NzIwMSwgMHhENjFFMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3OCwgMHgwMDIwMThBMCwgMHgwMDIwMTkyMiwKKzB4MDAyMDEyOEMsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOTdDLCAweDAwMjAzNTE0LCAweDAwMjAzOTg0LCAweDAwMjAzOTkwLAorMHgwMDIwMzk5QywgMHgwMDIwMzlGOCwgMHgwMDIwMzlGQywgMHgwMDIwMzlBNCwKKzB4MDAyMDM5QTUsIDB4MDAyMDM5QTgsIDB4MDAxMTc3MDAsIDB4MDAyMDNBMTIsCisweDAwMjAzNTc4LCAweDAwMTE0MkQ4LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LAorMHgwMDFDM0QzMCwgMHgwMDExNzcxOCwgMHgwMDFDM0QwMCwgMHgwMDFDMTAwMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxMTc3MTAsCisweDAwMUMzNTIwLCAweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDAwMUMxMDI4LAorMHgwMDIwMzU4QywgMHgwMDIwMzlBQywgMHg3RkZGRkZGRiwgMHgwMDIwMTczNCwKKzB4MDAyMDMyQkUsIDB4MDAyMDIyRTgsIDB4MDAyMDNEQzAsIDB4MDAyMDM5RkEsCisweDAwMjAzNTg0LCAweDAwMjAzOUVDLCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzUxQywgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE3QzAwMDksIDB4MzYyMDYyMTIsIDB4RDQ3Qjg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTc5LCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc3NSwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI3MjU1RjIsIDB4NjIyMjYwNTIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJELCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4NTFGMjU1RjgsIDB4RTcwMUNCMDEsIDB4MjUwMkQyNjMsIDB4RTEwMDIxNzIsCisweDIyMTFENTY0LCAweDc0MDE2NDUyLCAweDI1NDJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTVGRkQ0NUQsIDB4NjU1RDY3NDIsIDB4OEIxMDI3NTgsIDB4NjI3MkQ3NUIsCisweDhCMEMzMjYwLCAweDU1RjI1N0Y4LCAweDI3NjJFMTAxLCAweEQ1NTIyNTEyLAorMHhENzU3RTQwMCwgMHg2MjcyMjU0MSwgMHhBMDc3NzIwMSwgMHg1MkYzMjcyMiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQ1NTA4QjZDLCAweDYxNTI1N0Y0LCAweDcxMDFFMjQwLCAweDY0NzIyNTEyLAorMHgxRjRERDE0RCwgMHg0MjE4MjQxOSwgMHg4QjAzMzQyMCwgMHg2MjYyRDY0QiwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NDAsIDB4MjYyMUIwQUEsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhENzQxOEIxNiwgMHg2NDcyNTFGNCwKKzB4NzQwMUQyM0QsIDB4NjUxMjI3NDIsIDB4MUY1REU2NDAsIDB4NDYxODI1MjksCisweDhCMDMzNTYwLCAweDYyNjJENjNCLCAweDI2MjI3MjAxLCAweEUyMDBENjJFLAorMHgyNjIxQjA4NiwgMHgwMDA5QTAxMCwgMHhENzM4RDEzNywgMHhEMjJBNjQxMiwKKzB4RTUwMDc0MDEsIDB4MjE0MjNBNzYsIDB4MjI1MThGMDYsIDB4RUEwMEQ2MzQsCisweDcyMDE2MjYyLCAweDI2MjJCMDc0LCAweDJGQjJENTMyLCAweDk1NDA2NjUyLAorMHhENDMwNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYxNSwgMHhEMTE1MjYyMSwgMHgyMTIxRTIwMCwgMHhFMjAyNTZGNSwKKzB4NDIxODY2NjIsIDB4MjYyODQyMjgsIDB4MUY2RDhEMEMsIDB4RDYxRkQxMUUsCisweDQ2MEI2NTExLCAweDIwMDg2NDVELCAweDU3RjU4OTA0LCAweDYyNzJEMTFDLAorMHgyNzIyMjIxOSwgMHhEMTFCRTIwMSwgMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwKKzB4MDAwOUFFMTcsIDB4NDUwQkQ1MTgsIDB4RDExODAwMDksIDB4QUUxMEU2MDAsCisweDA3RDEyMTYwLCAweDAwMjAzQTBDLCAweDAwMjAzQTEwLCAweDAwMjAzQTE4LAorMHgwMDFDM0RDMCwgMHgwMDExNzcyQywgMHgwMDFDM0I4OCwgMHgwMDIwMzlGNCwKKzB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsIDB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsCisweDAwMTE3NzQ4LCAweDAwMTE3NzY4LCAweDAwMTE3NzZDLCAweDAxRkZGRkZGLAorMHgwMDExNzc0QywgMHgwMDIwMzU4NCwgMHgwMDExNDJEOCwgMHgwMDExNDc3NCwKKzB4RkRGRkZGRkYsIDB4MDAyMDNEQzAsIDB4MDAyMDI0NkMsIDB4MDAyMDM5RkEsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEMTFGN0ZGNCwgMHg2MjEyREUxRiwgMHg2N0UyNTQxMSwgMHhENDFFMUY0MSwKKzB4MUY3MjJGMjIsIDB4Njc0M0Q1MUQsIDB4Nzc5NEQyMUQsIDB4NUE0MjU4NDEsCisweDZDNzI2OTQyLCAweDZEMjI1QjE2LCAweEU2MDA2MDUyLCAweDI1MDJDQjIwLAorMHg3NjAxRTU0MCwgMHgzMjUzNjI2RCwgMHg2MkYyOEJGQiwgMHgyMTIyNTVGMSwKKzB4NTVGMjExNTEsIDB4MkU1MkQ2MTMsIDB4MTRBMjE0ODEsIDB4RDQxMjI0OTIsCisweDExQjYyN0MyLCAweDY3NDIyNkQyLCAweEQ5MTFEQTEwLCAweDJBNzJFODAxLAorMHgxQThDNDkwQiwgMHg0MjE4RTIwMSwgMHg3RjBDMUEyQywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4MDAwMDY4RjYsCisweDAwMUMzQjlDLCAweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLAorMHgwMDFDNTk2MCwgMHgwMDFDODk2MCwgMHgwMDIwMzU4QywgMHgwMDFDM0QwMCwKKzB4MDAyMDE2MTAsIDB4MkY5NjJGODYsIDB4MkZDNjJGQTYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweDdGODg0RjAyLCAweEUwMThERUIyLCAweEQ0QjI2MUUwLAorMHg2MUUzMEYxNCwgMHg2MjEwNzEwMSwgMHg0NDBCRTAxQywgMHgyMDA4MEYyNCwKKzB4OEYxMjZEMDMsIDB4RDRBRDFGMDgsIDB4Njc0MEREQUQsIDB4NjU3Q0Q0QUQsCisweDQ3MEJEN0FELCAweEQyQUQwMDA5LCAweDYyMUM2MTIwLCAweDQ2MDg2NjIzLAorMHgzNjI4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDFDMUZEOCwgMHhFNTgwMDRGQywKKzB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTcsIDB4MDFGQ0UwMTgsCisweERFQTNFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELCAweDYwNzAzN0VDLAorMHgzMURDNjE1MywgMHg4MDE0NzUwMSwgMHgzMjQzNjI1RCwgMHhENDlEOEJGNCwKKzB4RTIwMEQ1OUQsIDB4QTI3RjI0MjEsIDB4MjAwODI1MjEsIDB4RTAxODhCMTMsCisweEU1MDAwMUZDLCAweEEwMDlERTk2LCAweDY1NUQ2NDFDLCAweDMyRUM2MjUzLAorMHg2MjUzNjcyMiwgMHgzMkRDNjY3MiwgMHg3NTA0MTI2MSwgMHgzMjQzNjI1RCwKKzB4QTI2OThCRjMsIDB4ODgwMTJEMTAsIDB4RTAxODhCMTYsIDB4RTQwMDAxRkMsCisweDY3MUMyRDQwLCAweDYyNERERThBLCAweDhCMDEzMjczLCAweDAwMDlBMjVDLAorMHg2REUzNjQ0RCwgMHg3RDA0NjI0MywgMHgzMkVDNjY0MywgMHg2NTIyMzZEQywKKzB4NzQwODYxNjIsIDB4MjUxMkFGRUYsIDB4OEIxOTg4MDQsIDB4MDFGQ0UwMTgsCisweDJENzBFNzAwLCAweDFGRDU2RDFDLCAweDYyN0RERTdELCAweDhCMDEzMkQzLAorMHgwMDA5QTI0MiwgMHg2MTczNjc3RCwgMHgzMUVDNjVFMywgMHg3NTA0NjQxMiwKKzB4MzY1QzY2NzMsIDB4NjE0MjYyNjIsIDB4MjEyOTc3MDgsIDB4MjQxMkFGRUQsCisweDhCMTk4ODA1LCAweDAxRkNFMDE4LCAweDJENzBFNzAwLCAweDFGRDQ2RDFDLAorMHg2MjdEREU2RiwgMHg4QjAxMzJEMywgMHgwMDA5QTIyNiwgMHg2MTczNjc3RCwKKzB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsIDB4MzY1QzY2NzMsIDB4NjE0MjYyNjIsCisweDIxMkI3NzA4LCAweDI0MTJBRkVELCAweDhCNTk4ODMxLCAweDYxRTZERTY3LAorMHg2MUUzMUYxOSwgMHg2NEUyNzEwNCwgMHgxRjRBNjIxNiwgMHgxRjJCNjQxNiwKKzB4NzVFNDY1MTMsIDB4NjY1MzY3MTIsIDB4MUY0Qzc2MDQsIDB4NjQ1MjFGN0QsCisweEQ3NUY2RTY2LCAweDI3RTBEMjVGLCAweERFNUY2MDYyLCAweEM5MDEzMjQ1LAorMHg2NTYyMkUwMCwgMHg0NjA5MDYwQSwgMHg0NjA5RDE1QywgMHg0NjA5NDUwOSwKKzB4MjE1MDFGNEUsIDB4QjJCMDY0NkQsIDB4NjIwRDFGNkYsIDB4OEIwMTIyMjgsCisweDAwMDlBMUVBLCAweEQ3NTZERTU1LCAweDY2MUM2MUUwLCAweDY0MTBEMTUwLAorMHg0NzBCNjU0QywgMHg3RkZDNTRGRiwgMHgyRkUyNUVGRSwgMHg1MUZFN0ZGQywKKzB4MkYxMkUwNDAsIDB4NTVGQkQxNEYsIDB4NTdGRDU2RkMsIDB4MDRGRTQxMEIsCisweEQyNEQ3RjA4LCAweEUxMUM2NDBELCAweDFENDEyRDEwLCAweEQ0NEI2NTIyLAorMHg2NzQyMUQ1MiwgMHgxRDczREU0QSwgMHhEMjRBNjVFMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyNDksIDB4RDI0OTZFMjIsIDB4NjYyMjFERTYsIDB4MUQ2N0ExQkMsCisweDg5MDE4ODMwLCAweDAwMDlBMDhFLCAweEUzNDBENTM4LCAweDMzRkM2MTU2LAorMHgyMzEyNjQ1NiwgMHg3MTA0NjE1MywgMHg2NzUyMTM0MSwgMHgxMzcyNjQxNiwKKzB4N0VFNDZFMTMsIDB4NjVFNjYyMTIsIDB4NjZFM0Q3MzEsIDB4MTMyNDZFRTIsCisweDc2MDQyN0UwLCAweDYwNjJEMjJGLCAweDMyNTVERTJGLCAweDJFMDBDOTAxLAorMHgwNjBBNkU2MiwgMHhEMTJENDYwOSwgMHg0RTA5NDYwOSwgMHgxMzQzNDYwOSwKKzB4NjQ2RDIxRTAsIDB4QjI1MDFGNUUsIDB4NjIwRDFGNkYsIDB4OEIwMTIyMjgsCisweDAwMDlBMThBLCAweERFMjVENTIyLCAweDYxRTA2NDUwLCAweEQ3MjQ2NTRDLAorMHg0NzBCNTRGRiwgMHg3RkZDNjYxQywgMHgwNkZFRTA1NCwgMHg3RkZDMkY2MiwKKzB4RUU0MDAxRkUsIDB4MkYxMjNFRkMsIDB4NTVFMkQxMjUsIDB4NTdFNDU2RTMsCisweDY0RTI0MTBCLCAweEQyMUM3RjA4LCAweEUxMUM2NDBELCAweDFENDEyRDEwLAorMHhENjFBNjUyMiwgMHg2NzYyMUQ1MiwgMHgxRDczREUxOSwgMHhEMjE5NkVFMiwKKzB4NjIyMjFERTQsIDB4RDIxODFEMjUsIDB4MUQyNjYyMjIsIDB4NjIyMkQyMTcsCisweDFEMjdBMTVBLCAweDAwMTE3ODAwLCAweDAwMjAyQTE4LCAweDAwMjAzOTk2LAorMHgwMDIwMzVCQywgMHgwMDIwM0E3QywgMHgwMDIwMThEMCwgMHgwMDIwMzk5NSwKKzB4MDAxMTc4MDQsIDB4MDAyMDNBMTQsIDB4MDAyMDNBMTYsIDB4MDAxMTc4MTAsCisweDAwMjAzOTkxLCAweDEwNjI0REQzLCAweDAwMjAzOTkyLCAweDAwMjAzOTkzLAorMHgwMDExNEFBNCwgMHgwMDIwMEY2OCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkMwLCAweDhCMDQ4ODMzLCAweDQ3MEJEN0EyLCAweEExMjNFRTAwLAorMHg4ODI4MkRFMCwgMHhBMEQzODkwMSwgMHhERTlGMDAwOSwgMHg2MkUxRTE0MywKKzB4MzIxNkUwNTQsIDB4MEZFNjhGMDIsIDB4MkUyMUUyNDAsIDB4NjIyRDYyRTEsCisweDhCMDEzMjE3LCAweDAwMDlBMEJDLCAweEU1MDE4NUUxLCAweDhCMDEzMDU2LAorMHgwMDA5QTBCNiwgMHgyRDEwRTEwMSwgMHg2NEUxQjExMSwgMHgwNkZFRTA1NCwKKzB4NjI2MUUxNDMsIDB4MzUxNzY1MkQsIDB4RTY0MDg5NDUsIDB4OEIwQzM1NjMsCisweEUwNThFNDFBLCAweEU1MDAwRjQ1LCAweDcyQzBFMDVDLCAweDYwMjMwRjU1LAorMHg2NzAzQzkwNywgMHhBMDE0RTA2MCwgMHg2NjUzMEY3NSwgMHg0NjIxNDYyMSwKKzB4NDYyMTQ2MjEsIDB4NDUyMTQ2MjEsIDB4RTA1ODc2MTgsIDB4MEY2NTQ1MjEsCisweEUwMDM0NTIxLCAweEUwNUMyNTA5LCAweEUwMDcwRjU1LCAweEUwNjAyMjA5LAorMHhFODU0MEYyNSwgMHg4NTgyMzhGQywgMHg2NDBENjVGMywgMHgxODQ0QjE3MCwKKzB4REQ3QTg1ODQsIDB4ODU4NjZDMEQsIDB4NjEwRDRDMDgsIDB4NDEwODYwQzMsCisweEUwMEYwRUZFLCAweDE4MTU0RDBCLCAweDJFMjk2MjA3LCAweDY2ODI2MEMzLAorMHg4NTYyMEZFNiwgMHg0RDBCNTE4NSwgMHgyRTBCNjAwRCwgMHg1NDg0NjBDMywKKzB4QjEzQzBGRTYsIDB4RTA1NDY1RjMsIDB4RTU0MDBFRkUsIDB4RTA2QzYyRTEsCisweDM2NTM2NjJELCAweDBGNjY4RDQxLCAweEM5MDM2MDIzLCAweDQwMDA0MDA4LAorMHg2MTAzNjQwMywgMHhEOTY1RTA3MCwgMHgwRjQ2RTVGRiwgMHhFMDc0NjU1QywKKzB4NjA1MzBGOTYsIDB4NjI2MzQ5MEIsIDB4NDIyMTQyMjEsIDB4NDIyMTQyMjEsCisweDQyMDA2NzIzLCAweDQyMDAzMjdDLCAweDZDMDc0NjIxLCAweDQ2MjFFMDU0LAorMHg2MDYzMDlGRSwgMHg0MDA4QzkwMywgMHg3OTA2MzBGQywgMHg2QTAzNkQyRCwKKzB4NjVGM0U4MDAsIDB4NjREM0IxMjQsIDB4RTA3MDZFQTIsIDB4MkFFMjJFQzksCisweDAxRkU2Njk0LCAweDY2NkNFMDc0LCAweDQ3MEIwN0ZFLCAweDJFMEI2MDYzLAorMHg2NUYzMkFFMiwgMHhCMEZBNjREMywgMHg2MjhENzgwMSwgMHgzMkUzRUUwNiwKKzB4N0QwMThGRTcsIDB4MEVGRUUwNTQsIDB4RTA1NDYyRTEsIDB4NDIwMDA2RkUsCisweDc2MEM4NTYxLCAweDcwMUIzMDJDLCAweEU0MDA2MTAzLCAweEU3MDQ2NUYzLAorMHg2ODY2NzQwMSwgMHgzOTczNjk0RCwgMHg4RkY5MjU4MiwgMHg2NUYzNzUwNCwKKzB4NjQxREIwREQsIDB4MEVGRUUwNTQsIDB4NjRFMUIwOUMsIDB4MDAwOUEwNTQsCisweEQ0M0I1NkY4LCAweEVBMDFEMjNCLCAweDI2QTA0MjBCLCAweDAwMDlBMDRDLAorMHgwNkZDRTAxQywgMHg4ODI5NjA2QywgMHg1Q0Y4OEIwOCwgMHhFMjAwRDYzNiwKKzB4NTI2MTJDMjAsIDB4NjQyREIwNEIsIDB4MDAwOUEwM0UsIDB4NjY2Q0U2ODEsCisweDhCMDQzMDYwLCAweDQyMEJEMjMxLCAweEEwMzU1NEY4LCAweEU2ODIwMDA5LAorMHgzMDYwNjY2QywgMHhEMjJFOEIwNCwgMHg1NEY4NDIwQiwgMHgwMDA5QTAyQywKKzB4NjY2Q0U2ODMsIDB4OEIwQTMwNjAsIDB4REEyNzU1RjgsIDB4MjU5MEU5MDAsCisweEQ4Mjg1NUExLCAweDI4NTJENjI4LCAweEEwMUQ1MkEyLCAweEU2OTIyNjIwLAorMHgzMDYwNjY2QywgMHhEMjIwOEIwOCwgMHg1QzIxRDgyNCwgMHg2Q0NDNTJGOCwKKzB4MjhDMUU2MDAsIDB4MjI2MEEwMTAsIDB4NjY2Q0U2OTMsIDB4OEIwNjMwNjAsCisweEQ2MUY1OUY4LCAweEUyMDFFQTAwLCAweEEwMDUyOUEwLCAweEQ2MTYyNjIxLAorMHhEMjFERDQxQywgMHg2NTYyNDIwQiwgMHg0RjA2N0Y3OCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4NkFGNjZDRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweEUyNDA2MTRELCAweDg5MzIzMTIzLCAweDMxMjdFMjFGLCAweDhCMjdENzEzLAorMHhENDA2NjE0RCwgMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywKKzB4MTc2MUEwMjUsIDB4MDAyMDBGQkMsIDB4MDAxMTc4MDQsIDB4MDAyMDM0NzAsCisweDAwMjAzQTlDLCAweDAwMjAxOEMwLCAweDAwMTE3ODAwLCAweDAwMTE1RjAwLAorMHgwMDExNjA1OCwgMHgwMDIwMzk3QywgMHgwMDIwMzk5MCwgMHgwMDIwM0ExQSwKKzB4MDAyMDNBMTYsIDB4MDAyMDNBQjQsIDB4MDAyMDE4RDAsIDB4MDAxQzM3MDQsCisweEUwMDFENDkwLCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDc4OTMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyODYsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjgyLCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1N0UsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1N0E0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDU3MzQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjZELAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDYyLCAweDZFNDNCRkQ2LAorMHgyREUyQkZCQiwgMHgwMDA5QkZEMiwgMHgyQzEyNTFENSwgMHgxQzQxNTRENiwKKzB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LCAweDI0MjI3NjAxLAorMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHhENjUzMDAwOSwgMHg4NTYyRTUwMCwKKzB4QTAwQjY3NEQsIDB4NjU1RDYxMEQsIDB4NDAwMDYwNTMsIDB4MzA1Q0Q0NEYsCisweDAyNEQ0MDA4LCAweDMyNzA2MjJELCAweDc1MDE4OTA1LCAweDMyMTM2MjVELAorMHgwMDBCOEJGMSwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMSwgMHg1NDQxNjc0MywKKzB4NEUwOEVFN0YsIDB4NEUyOEQyNDYsIDB4MjVFOTY1NDMsIDB4NjA0MzZFMjEsCisweDlFNzU2MkVELCAweDQ1MjlDOTAzLCAweEU2MDAzMkUzLCAweDhENDU2MTAzLAorMHgyMTE4NDUwOSwgMHhEMjNGOEIwNSwgMHgwMDJDNjA1MywgMHhBMDhBQzkzRiwKKzB4NjAxMzY2MDMsIDB4OEIyNjg4MDEsIDB4ODgwQzYwNTMsIDB4RDUzQThCMDQsCisweEM5M0Y4NDUzLCAweDY2MDNBMDdGLCAweDhCMDQ4ODA4LCAweDg0RTJERTM2LAorMHhBMDc4QzkzRiwgMHg4ODBENjYwMywgMHg4QjAzRDYzMywgMHhDOTNGODQ2MSwKKzB4NjYwM0EwNzEsIDB4ODgwOTYyNjAsIDB4NjIyQzhGMDksIDB4RTAxNERFMkMsCisweDY1NUMwNUVDLCAweDYwMjMzMjU4LCAweEEwNjRDOTNGLCAweDYwMjM2NjAzLAorMHhBMDYwQzkzRiwgMHg4ODAyNjYwMywgMHhFMDA3OEI1RCwgMHg2MDQzMjUwOSwKKzB4ODkwNUM4MTAsIDB4NjA1M0QyMjUsIDB4QzkzRjAwMkMsIDB4NjYwM0EwNTMsCisweDYwNTNERTIzLCAweEM5M0YwMEVDLCAweDY2MDNBMDRELCAweDg4MDE2MDEzLAorMHg2MDUzOEIxOSwgMHg4QjA0ODgwQywgMHg4NDIzRDIxRSwgMHhBMDQyQzkzRiwKKzB4ODgwODY2MDMsIDB4RDUxQjhCMDQsIDB4QzkzRjg0NTIsIDB4NjYwM0EwM0IsCisweEQ2MTg4ODBELCAweDg0NjE4QjAzLCAweEEwMzRDOTNGLCAweDYwNjA2NjAzLAorMHhBMDMwQzkzRiwgMHg4ODAyNjYwMywgMHhFMDA3OEIyRCwgMHg2MDQzMjUwOSwKKzB4ODkyM0M4MTAsIDB4NjA1M0RFMTAsIDB4QzkzRjAwRUMsIDB4NjYwM0EwMjMsCisweDAwMDAwQkI4LCAweDAwMjAzNDcwLCAweDAwMUMzNzA0LCAweDAwMUMzNzNDLAorMHgwMDFDMzcwMCwgMHgwMDFDMzcwQywgMHgwMDExNDAwMCwgMHgwMDExNDAwOCwKKzB4MDAxMTQyRDgsIDB4MDAxMTQyRTQsIDB4MDAxMTQyRTgsIDB4MDAxMTQyRjUsCisweDAwMTE0MkVELCAweDAwMTE0MkZELCAweDAwMTE0MzA5LCAweDYwNTNEMjA5LAorMHhDOTNGMDAyQywgMHg2MDEzNjYwMywgMHg4QjAzODgwMiwgMHhDODEwNjA0MywKKzB4NzYwMjg5MDAsIDB4QzkzRjYwNjMsIDB4NDAwMDQwMTgsIDB4MTc0MTI0MEIsCisweDZFRjYwMDBCLCAweDAwMTE0MzAxLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LAorMHhERDk0NEYyMiwgMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywKKzB4NjJEMjY1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsCisweDU1RDE0MjBCLCAweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LAorMHg0MjBCRDI4QSwgMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwKKzB4RDI4NkQ0ODksIDB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsCisweEQ0ODYwMDA5LCAweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkU2MzZDNzMsIDB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsCisweEIwNzU2NkMzLCAweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFDMDAwOSwgMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsCisweEQ2NzAwNTI5LCAweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwKKzB4NjREMzU3RjQsIDB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsCisweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHhFNTAzRDE2MiwgMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwKKzB4RDQ1RkQxNUUsIDB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsCisweEJGNzNFNDBBLCAweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLAorMHhCRjY5MjIxMiwgMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwKKzB4NEYyMjI3MDIsIDB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsCisweEQxNTUyRkU2LCAweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LAorMHg0NTAwMjYyOSwgMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwKKzB4RDE0RTQ3MDgsIDB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsCisweDRGMjIyRkU2LCAweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLAorMHhFNTAwNzc2QywgMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzIyMjcxMiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsCisweEQyMzQ2RUY2LCAweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLAorMHhFNjA1RDQzMiwgMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwKKzB4RTQwQUU2MDEsIDB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLAorMHhDOTAzNjBCMiwgMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwKKzB4QjA3Q0M5MDMsIDB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsCisweEQ0MjEyRkUxLCAweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELAorMHg4OUZGQzgwMSwgMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4MDAxQzNCODgsIDB4MDAyMDNBQzgsIDB4MDAyMDE4RDAsCisweDAwMjAzQUQwLCAweDAwMjAzQUQ4LCAweDAwMjAzQUUwLCAweDAwMjAzQUU4LAorMHgwMDI1RTcyMCwgMHgwMDIwM0RCQywgMHgwMDIwMzk4MCwgMHgwMDFDNTk2OCwKKzB4MDAxQzNCNDAsIDB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsCisweDAwMjAxNUU0LCAweDAwMjAxNjEwLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLAorMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywKKzB4MDAxQzU4MUMsIDB4MDAxQzU4NjAsIDB4MDAyMDNBRjAsIDB4MDAyMDE4QzAsCisweDhGMDE0NDExLCAweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLAorMHg0NjI4NjA1MiwgMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsCisweDAwMDlCRkVDLCAweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LAorMHgwMjBBM0Q2NSwgMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwKKzB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsCisweDJGRTYyRkQ2LCAweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLAorMHhCRkNCREQxMywgMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwKKzB4MzZFMjQ2MDEsIDB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsCisweDZDRjYwMDBCLCAweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLAorMHhCRkI5MkUxMiwgMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywKKzB4NEYyNjJFNzIsIDB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsCisweENDQ0NDQ0NELCAweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwKKzB4NjQ1M0U3MTAsIDB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsCisweDMxNUM0MTA4LCAweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELAorMHhFRDAwNjBCMywgMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywKKzB4MTFENDExRDMsIDB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsCisweDU4RjEyODcyLCAweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLAorMHg1NEY2NUVGNSwgMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwKKzB4MTFFNjExRTcsIDB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsCisweDUyRjlEREE3LCAweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LAorMHgyRDcyRUFFRiwgMHg2QUFDMjYyMiwgMHg2REUzNkVFRCwgMHg2MUUzNEQwOCwKKzB4NDEwODNERUMsIDB4MzFFQzREMDgsIDB4NjBCMzNEOUMsIDB4MkRCMTQxMDgsCisweEUwNTA4MUQxLCAweEU3OUY0MTA4LCAweDQxMDg0MDA4LCAweDgxRDI2NzdDLAorMHgzMThDNjBCMywgMHgzNDcyRTIwMCwgMHgxREQyODFEMywgMHhENDkzMUQxMywKKzB4MUQyNDhEMDEsIDB4NjVEM0Q0OEYsIDB4N0UwMUIwQjIsIDB4MzRBMjY0RUQsCisweERBOEM4QkRBLCAweDY4QTIyRkQyLCAweDQ4MjlERDkxLCAweDY0QTIyRDgyLAorMHg2OTREN0RGQywgMHgyRDkyRDI4NiwgMHg0RTI5NkUyMiwgMHgyREUyN0QwQywKKzB4NkFEMzY4MjIsIDB4RDc4NDYxOEQsIDB4NkQ3MjJBMTYsIDB4RDU4M0Q0ODksCisweDVFNzIyNEQyLCAweDE0RTJENjg4LCAweEVFMDA1MTc0LCAweDU4NzYxNDE0LAorMHgxNDg2RDE4NiwgMHhFNzEwNTk3OCwgMHg2MjUyMTQ5OCwgMHgxNDJBNjVFMywKKzB4NjRFMzI2RTIsIDB4NjQ0REU2MDAsIDB4NDgwODY4NDMsIDB4NDgwODM4NEMsCisweDYwNTMzODFDLCAweDI4QjEwQzg2LCAweDYwQjMwOUNFLCAweDYwNTM4MTkxLAorMHg2MDQzMEFDRSwgMHg2MDUzODFBMiwgMHg2MEIzMERDRSwgMHg2MDUzODFEMywKKzB4NzQwMTA4Q0UsIDB4MDlDRTE4ODIsIDB4MTlFMzYyNEQsIDB4MzI3MzBBQ0UsCisweDhGRTAxQTY0LCAweEQ5NkE3NTA0LCAweDZDOTJFMDAzLCAweDJDQjE0MDE4LAorMHhEQTZGNkQ5MiwgMHhFMDUwODFEMSwgMHg0MDA4NkU5MiwgMHg2MTkyODFFMiwKKzB4ODExMzYwQjMsIDB4RTYwMDY0OTIsIDB4Njc5MjE0NDIsIDB4MTdBM0Q0NjgsCisweEUxRkY2ODkyLCAweEU3MDMxODY0LCAweDQ2MDg2NTYzLCAweDc1MDEzNjRDLAorMHg2NjVEMjYxMiwgMHg4QkY4MzY3MywgMHhFMDAzREM1QSwgMHg0MDE4NkRDMiwKKzB4NkVDMjJEQjEsIDB4ODFFMUQyNUYsIDB4RUUwMDYxQzIsIDB4NjRDMjExMTIsCisweDE0MjNFMDI0LCAweEQ0NUI2NUMyLCAweDY3QzIxNUU0LCAweDgxNzJFNTgwLAorMHg2NkUzNjhDMiwgMHg2NTVDODE4MywgMHg2OTYzNjY2RCwgMHg2QTZENzYwNCwKKzB4M0E1MzM5NEMsIDB4MjlFMjhGRjgsIDB4REM1NERCNTMsIDB4NzQwNDI0QjIsCisweDdGNjgyNEMyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHg2MTQyNjhGNiwgMHhDODAzNjAxMSwgMHhFNTAwOEYwMywKKzB4MzQyMEQyM0MsIDB4NjAxMThCMDYsIDB4ODgwMkM5MDMsIDB4RDIzOThCMDYsCisweDhCMDMzNDIwLCAweDY1MTM1NjEyLCAweDI0MjI1MjY0LCAweDYwNTMwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwKKzB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsCisweDYwNTM4MTIzLCAweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwKKzB4NjVGMzYxRjEsIDB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsCisweDYwNzE1N0QxLCAweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywKKzB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsCisweDEyRTQ4QjA2LCAweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLAorMHg1NjY0QUZGMCwgMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywKKzB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsCisweDQxMEJFNjE0LCAweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLAorMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzlBQywKKzB4MDAyMDM1N0MsIDB4MDAyMDM1ODQsIDB4MDAyMDM1OEMsIDB4MDAyMDM1QjQsCisweDAwMjAzOTk4LCAweDAwMjAzOUEwLCAweDAwMTAwMjA4LCAweDAwMTAxNEMwLAorMHgwMDFFMjEwQywgMHgwMDFDM0QwMCwgMHgwMDIwMzlFQywgMHgwMDEwMDBDOCwKKzB4MDAxMTc4ODAsIDB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsCisweDAwMjAwRDQyLCAweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LAorMHgzRTJDQTAwNSwgMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwKKzB4MzUyMDUyRTEsIDB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LAorMHgzNjIwNjZDMiwgMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwKKzB4QkYzOEREMzUsIDB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsCisweEQ0MzI4OTA3LCAweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LAorMHhCRjNEMDAwOSwgMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwKKzB4MjI2MkQyMkQsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLAorMHgwNERFNDAwOCwgMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwKKzB4NTVFMjI3RTIsIDB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsCisweDEyMjIwMkRFLCAweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLAorMHhDOTBGNjA1MywgMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4ODU0MzZDRjYsIDB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsCisweEUxMDA4RjBDLCAweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLAorMHhENjEzMTYyMSwgMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwKKzB4MDAwMDAxRkYsIDB4MDAyMDM1OEMsIDB4MDAyMDM1ODQsIDB4MDAxQzNEMDAsCisweDAwMjAzNUI0LCAweDAwMjAzOTdDLCAweDAwMjAxOEMwLCAweDAwMjAzNTdDLAorMHgwMDIwM0IxOCwgMHgwMDIwM0IxQywgMHgwMDFDM0QyOCwgMHgwMDIwMzlFQywKKzB4MDAyMDM5QUMsIDB4MDAyMDBENDIsIDB4MDAyMDM5RjAsIDB4MDAyMDM5RjQsCisweDAwMTE3NzU0LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkY4NEYyMiwgMHg2QzIyRDI0MSwgMHhDODAzNjBDMywgMHhERTQwODk2RSwKKzB4REE0MURCNDAsIDB4NTJCMUQ5NDEsIDB4MzYyMDY2QjIsIDB4NjA2MTg5NDUsCisweDg4MDFDOTAzLCAweEREM0I4OTQxLCAweDQyMEJEMjNELCAweDY1MDM2NEQzLAorMHg2MEExMkYwMiwgMHg4OTMyODgwMSwgMHg4NTE0NTE1MywgMHg4ODQwNjAwQywKKzB4MUYxMThGMEMsIDB4RDUzNzYxOTEsIDB4NjQxRDQ1MEIsIDB4OEIyNjIwMDgsCisweEQ3MzU2NjkxLCAweDY0NkQ0NzBCLCAweDhCMjAyMDA4LCAweDQyMEJEMjMzLAorMHg1MUYxNTRGMSwgMHhDODIwODUxMSwgMHhEMTMxODkwNCwgMHgwMjFFRTA1MCwKKzB4MDEyNjcyMDEsIDB4NDIwQkQyMkYsIDB4MjAwODY0RjIsIDB4NjREMzg5MDcsCisweDREMEJERDJELCAweEQxMkQ2NUYyLCAweEFGQzRFNjAxLCAweEQyMkMyMTYyLAorMHg0MjBCNjVGMiwgMHhENzJCNjRFMywgMHhBRkJDRTYwMSwgMHhEMjI2Mjc2MiwKKzB4NDIwQjY1RjIsIDB4QUZCNjY0RDMsIDB4REUyNzAwMDksIDB4REEyOEREMjcsCisweDUyRDFEQjI4LCAweDM2MjA2NkQyLCAweDYwNjE4OTE4LCAweDg4MDFDOTAzLAorMHhENDIyODkxNCwgMHg0NTBCRDUxNiwgMHg1NjAzMDAwOSwgMHg4RjA0MzZFMCwKKzB4RTIwMTY1MDMsIDB4QUZFQzJBMjAsIDB4RDQxRjJCNTIsIDB4NDIwQkQyMTYsCisweEQ3MTgwMDA5LCAweDQxMThFMTAxLCAweDI3MTJBRkUzLCAweEM4MDQ2MEMzLAorMHhEMjFBODkwMiwgMHgwMDA5NDIwQiwgMHg0RjI2N0YwOCwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4MDAwQjZBRjYsIDB4MDAwMDY5RjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMjAzQTE0LCAweDAwMTE0MkQ4LAorMHgwMDIwMTRBNiwgMHgwMDExNUVBMiwgMHgwMDExNDc3NCwgMHgwMDIwMEQ4QSwKKzB4MDAyMDM1MUMsIDB4MDAyMDE2QzIsIDB4MDAyMDE0RDAsIDB4MDAxRTIxMkMsCisweDAwMjAxNTM0LCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNTdDLAorMHgwMDIwMzk5QywgMHgwMDIwMzk5OCwgMHgwMDIwMzVCNCwgMHgwMDIwMDY0NCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDAwMDkwMDBCLAorMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwgMHhFMDAwMDAwQiwgMHhFMDAwMDAwQiwKKzB4MDAwOTAwMEIsIDB4RTRGREQ1OUQsIDB4RDY5RDYxNTIsIDB4MjUxMjIxNDksCisweDc0MDE2MDUyLCAweDI1MDJDQjAxLCAweEQxOUE2NzUyLCAweDI1NzIyNzQ5LAorMHhDODQwNjAxMCwgMHg2MDYyODkwMiwgMHgyNjAyQ0IwNCwgMHhFMUY3NjQ2MiwKKzB4MjY0MjI0MTksIDB4RTcwMTYwNjIsIDB4MjYwMkM5Q0YsIDB4RTUwMjYwNjIsCisweDI2MDJDQjEwLCAweDQ3MTg2MDYyLCAweDI2MDJDQjAzLCAweDAwMEIxNjUyLAorMHhENThEMTY3MywgMHhEMjhFRDc4RCwgMHhFMTAwRDQ4RSwgMHgyNTExRTYwMCwKKzB4MjIxMDI3MTEsIDB4MjQ2MUFGQ0UsIDB4RDI4QjY2NEMsIDB4MzYyQzQ2MDAsCisweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyODc2NTRDLCAweDM1MkM0NTAwLAorMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI4MywKKzB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsIDB4NDUwMEQyN0YsCisweDY2NTAzNTJDLCAweDI2MTlFMUVGLCAweDI1NjAwMDBCLCAweEQyN0E2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjc2NjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsCisweDQ2MDBEMjcyLCAweDYwNjAzNjJDLCAweDAwMEJDQjA4LCAweDY1NEMyNjAwLAorMHg0NTAwRDI2RSwgMHg2NjUwMzUyQywgMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwKKzB4RDY2OTYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweDYyNEM2MDBDLCAweDQyMDBENjY0LCAweDYwMjAzMjZDLAorMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwgMHg2NDRDRDE2MCwKKzB4NjI0MDM0MUMsIDB4NjAyQzAwMEIsIDB4NjQ0Q0QxNUUsIDB4NjI0MDM0MUMsCisweDYwMkMwMDBCLCAweDRGMjIyRkU2LCAweDY0NUM2RTQzLCAweDM0NjdFNjBBLAorMHhCRkVCODkxNCwgMHg2NDBDMDAwOSwgMHg4ODAxNjBFQywgMHhFMDBGOEIwMiwKKzB4MjQwOUEwMDIsIDB4NDQwOTQ0MDksIDB4RTYwQTYyNEMsIDB4ODkwNTMyNjMsCisweDY0NENCRkUyLCAweDYwMjM2MjBDLCAweDhCMDBDODgwLCAweDYwMjNFMjAwLAorMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg2MDYyRDY0QiwgMHg4QjAzODgwMSwKKzB4MDAwOUIyNTYsIDB4MDAwOUEwMDMsIDB4RTY0MEQyNDgsIDB4RDY0ODIyNjAsCisweDRGMjZFMjAwLCAweDI2MjIwMDBCLCAweEQ2NDM0RjIyLCAweDg4MDI2MDYyLAorMHhCMjlGOEIwMSwgMHhENjQyMDAwOSwgMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwKKzB4RDQzRUQ1M0QsIDB4RTcwMUUxMDAsIDB4MDAwQjI1MTIsIDB4RDIzQjI0NzAsCisweDAwMEJFNjA0LCAweDRGMjIyMjYwLCAweEQxM0JENDNBLCAweDAwMDk0MTBCLAorMHhFMUZERDUzQSwgMHhEMjNBNjY1MCwgMHhFNzAwMjYxOSwgMHg0RjI2MjU2MCwKKzB4MjI3MDAwMEIsIDB4RDUzNzRGMjIsIDB4NjE1MkQyMzcsIDB4NjExREQ3MzcsCisweDY0NTIyNTEyLCAweDI0MkJFNkZGLCAweEQ0MzUyNTQyLCAweDY2NkREMjJFLAorMHgyNzYyNDIwQiwgMHhFMUZCRDUyRCwgMHgyNzE5Njc1MCwgMHgwMDBCNEYyNiwKKzB4NEYyMjI1NzAsIDB4RDEyOEQ0MkYsIDB4MDAwOTQxMEIsIDB4RTdGN0Q1MjcsCisweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweEQ1MjQyNTYwLCAweDYyNTA5NDI1LAorMHgwMDBCMjI0OSwgMHhENTIxMjUyMCwgMHg2MjUwRTRCRiwgMHgwMDBCMjI0OSwKKzB4NEYyMjI1MjAsIDB4ODUyMkQyMjQsIDB4MjAwODYwMEQsIDB4ODgwMTg5MTEsCisweDg4MDM4OTQ0LCAweDg4MDU4OTQ2LCAweDg4MDY4OTQ4LCAweDg4MDg4OTRFLAorMHg4ODA5ODk1NCwgMHg4ODBBODk1QSwgMHg4ODBCODk2MCwgMHhBMDZEODk2NiwKKzB4QjA2RjAwMDksIDB4QTA2QTAwMDksIDB4RkY3RjYwMEMsIDB4MDAxRTIxNDgsCisweDAwMUUxMTA4LCAweDAwMUUxMDAwLCAweDAwMjAzQTRDLCAweDAwMjAzQTRFLAorMHgwMDIwM0E2RCwgMHgwMDIwM0EzMCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwOTAsIDB4MDAyMDNBNTQsIDB4MDAxRTEwMEIsCisweDAwMjAzQTUwLCAweDAwMjAzQjIwLCAweDAwMjAxOEMwLCAweDAwMUUxMDI4LAorMHgwMDIwM0E2QywgMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwgMHgwMDFDMTAwMCwKKzB4MDAyMDNCMkMsIDB4MDAyMDNCM0MsIDB4MDAyMDNBMjQsIDB4MDAwOUIwNEMsCisweDYwMENBMDM1LCAweDAwMDlCMDU1LCAweDYwMENBMDMxLCAweDYyNjBENjg0LAorMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwKKzB4OEIyMzIyMjgsIDB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsCisweDhCMUIyMjI4LCAweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LAorMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwKKzB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsCisweDhCMDMyMjI4LCAweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLAorMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwKKzB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsCisweDI1MjAyNzEyLCAweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLAorMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwKKzB4RDI1QzAwMDksIDB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsCisweDYwNjBENjVELCAweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLAorMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwKKzB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsCisweDIyNjBFMDAxLCAweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LAorMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywKKzB4ODgwMjg5MDksIDB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsCisweEEwNEM4OTNCLCAweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LAorMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwKKzB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsCisweDIwMDg2MDVDLCAweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LAorMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwKKzB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsCisweDY2MjEyNTIyLCAweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELAorMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwKKzB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsCisweDY1MDM4RjAxLCAweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLAorMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwKKzB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsCisweDJGRTYyMTAyLCAweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LAorMHhENTExRDYxRCwgMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwKKzB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsCisweEQyMTZENjE1LCAweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLAorMHgwMDIwM0E2RCwgMHgwMDIwM0EyNCwgMHgwMDIwM0EzMCwgMHgwMDFFMTEwMCwKKzB4MDAxRTEwMEMsIDB4MDAyMDNBNTAsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsCisweDAwMjAzQTU4LCAweDAwMjAzQTM4LCAweDAwMjAzQTNDLCAweDAwMjAzQTQwLAorMHgwMDIwM0E1QywgMHgwMDIwM0E2MCwgMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwKKzB4MDAyMDNFMjAsIDB4MDAyMDNFMkEsIDB4MDAyMDNBNEEsIDB4MDAyMDI3RjIsCisweDg5MTIzNDI3LCAweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLAorMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwKKzB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsCisweEQ2OEM2RUY2LCAweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLAorMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywKKzB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsCisweDIxNDBFNzAyLCAweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLAorMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywKKzB4MjAwODg1NTQsIDB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsCisweDg1NjY2NTBDLCAweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LAorMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwKKzB4QTAwMzAwMDksIDB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsCisweEUyMDFEMTY3LCAweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLAorMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsCisweDM2MjJEQzVFLCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LAorMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwKKzB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsCisweDY1MUQ2NjZELCAweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLAorMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwKKzB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsCisweDMyNUNFMTA3LCAweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLAorMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwKKzB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsCisweEVCMDFFQTAwLCAweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwKKzB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsCisweDY0RTJENjM1LCAweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLAorMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwKKzB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsCisweDQyMDA2MUQxLCAweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LAorMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsIDB4NjRFM0JDODYsIDB4QkM4QjY0RTMsCisweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEJDOEVFRTAxLCAweDY0RTM2NEUzLAorMHg3RTAxQkM5MywgMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwKKzB4RDExODZERjYsIDB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsCisweEQ3MTc3MjA0LCAweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLAorMHgxMzdBMjEyMiwgMHgwMDIwM0E0QSwgMHgwMDIwMjhGRSwgMHgwMDFFMTAxNSwKKzB4MDAyMDNBNTAsIDB4MDAxRTEwMDEsIDB4MDAyMDNBMjQsIDB4MDAxRTExMDAsCisweDAwMjAzQTRFLCAweDAwMjAzQTNDLCAweDAwMUUxMDAwLCAweDAwMjAzQTQwLAorMHgwMDIwM0E0QywgMHgwMDIwMjdGMiwgMHgwMDFFMTAwQywgMHgwMDIwM0EzOCwKKzB4MDAyMDNBNTQsIDB4MDAyMDNBNTgsIDB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsCisweDAwMjAzQTY0LCAweDAwMjAzQTY4LCAweDRGMjIyRkU2LCAweEQ2NzA3RkZDLAorMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTZFRDE2RCwKKzB4REU2RTYwMTAsIDB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNkMsCisweEQyNkM3NTAyLCAweEU2MDFENzZDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDYzNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTYyLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHhBMDIwNzEwMiwgMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ1Mjc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsIDB4NUUyM0Q3NEUsCisweDY0RjIyRkUyLCAweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLAorMHg4MDcxNjEwMywgMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywKKzB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsCisweDgxNzMzMDRDLCAweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLAorMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywKKzB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsCisweDAwMDlCQzk3LCAweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LAorMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYyRiwKKzB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4ODU1MkQ1MkEsCisweDg4MzA2MDBELCAweDg4MzE4OTAzLCAweEEwMzQ4OTIzLCAweDg1NTUwMDA5LAorMHhENDI4RDcyNywgMHg4NTUzMjcwMSwgMHg2MTBERDYyNywgMHgyNDEyNDExOCwKKzB4NDYwQkQ0MjYsIDB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsIDB4NjU3MjQyMEIsCisweEUyMzBEMTIwLCAweDQyMjg2NzEyLCAweDI3MjlFNjIwLCAweDM3NjA0NjI4LAorMHhENjIxOEIwMywgMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwgMHhBMDEyRTIwMiwKKzB4RDExODI2MjIsIDB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsIDB4NDYyODIyNTksCisweDg5MDgzMjYwLCAweEQ0MUFEMTE5LCAweEU2MDFENTEzLCAweDIxNjA0NTBCLAorMHg0NzJCRDcxOCwgMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwKKzB4MDAyMDNBNkMsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNTgsIDB4MDAyMDNFMjAsCisweDAwMjAzRTJDLCAweDAwMjAzREM0LCAweDAwMjAzQTQwLCAweDAwMjAzREY0LAorMHgwMDIwM0RGMiwgMHgwMDIwM0RDNiwgMHgwMDIwM0EyNCwgMHgwMDIwM0E1MCwKKzB4MDAyMDNBM0MsIDB4MDAyMDNBMzgsIDB4MDAyMDE4QzAsIDB4MDAyMDNCNDgsCisweDAwMjAzQjRDLCAweDAwMjAxOEQwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0I2MCwgMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwgMHg4NEU5REU4NiwKKzB4MjQ0ODY0MEMsIDB4QjE3Qjg5MDEsIDB4RDI4NDAwMDksIDB4MjY2ODY2MjAsCisweDYwRTA4OTAyLCAweDJFMDBDOUJGLCAweDAwMEI0RjI2LCAweDAwMEI2RUY2LAorMHgyRkU2MDAwOSwgMHhERTdFNEYyMiwgMHg2MEUwRDY3RSwgMHhDQkMwRDQ3RSwKKzB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsCisweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2Nzg2MTZELCAweEU1MDBBMDA0LAorMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMjc0OEJGOCwKKzB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYyNjBENjZFLCAweDg5NDAyMjI4LAorMHhENTY1RTEwMCwgMHg2MDUwMjYxMCwgMHhDQjQwRDQ2QiwgMHgyNTAwNDQwQiwKKzB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsIDB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsCisweEQ0NjZENjVFLCAweERENjY2NzYwLCAweDY1N0M0RDBCLCAweEUyM0M2RDFELAorMHg4QjAzM0QyNywgMHhEMjY0RDQ2MywgMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwKKzB4QTAwNUQ3NjIsIDB4NjZFNkU0MDAsIDB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsCisweDM1RDM2NTRELCAweEQ3NUU4QkY3LCAweDZFNzJFMDAzLCAweDgxRTE0MDE4LAorMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywgMHhENDVBNjE3MiwgMHhERDVBODExMywKKzB4NjU3MjREMEIsIDB4RDY0QUQyNTksIDB4MjIxMkUxMDEsIDB4QzkzRjYwNjAsCisweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjUyNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywKKzB4MjAwODZENjMsIDB4NjQwMzhEMUMsIDB4RTUwRUQxM0MsIDB4MzI1MjYyMTAsCisweDYwQzM4OTE2LCAweDgwNDEyNEIwLCAweDgxNDE2MEQzLCAweEEwMDdFNTAwLAorMHg2NTVENjFCQywgMHgwMEVDNjA1MywgMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwKKzB4MzIxMzYyNUQsIDB4RDYzMDhCRjUsIDB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsCisweEQyMzlENDQwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTEwMDdGQzQsCisweDY1MTNFQ0ZGLCAweDZCMTM2Q0NELCAweERFMzRENzMzLCAweEVERkY2NEYzLAorMHhEODMzRUEwNCwgMHg2MDUzNjU1QywgMHgwMjdENDAwMCwgMHgzMkMwNjIyRCwKKzB4NjYwMzhEMEQsIDB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsIDB4MjQyMTc0MDIsCisweDY5ODIwMkVELCAweDM5Mjg2MjJELCAweDc0MDIyODkyLCAweDc1MDE3MTA0LAorMHg2MDYzNjI1QywgMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwgMHgyNDQ4NjQxQywKKzB4RTY4MDg5MDUsIDB4NjdGM0U1QzUsIDB4QkY4RjY2NkMsIDB4N0YzQzY1NUMsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHhEMTFDNjhGNiwgMHg2MDEyRDIxQywgMHhDQjIwRTQwNSwgMHgyMTAyRTUwMCwKKzB4MDAwQjIyNDIsIDB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsIDB4MDAyMDM5OTYsCisweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3ODAwLCAweDAwMUUxMEZDLAorMHgwMDIwMDY0NCwgMHgwMDIwMzk5QywgMHgwMDIwMkE1NiwgMHgwMDIwM0I2NCwKKzB4MDAyMDE4RDAsIDB4MDAyMDNCODAsIDB4MDAyMDE4QzAsIDB4MDAxMTc4OEMsCisweDAwMjAzOTk4LCAweDAwMjAzNTdDLCAweDAwMjAxNTM0LCAweDAwMUUyMTMwLAorMHgwMDIwMkExOCwgMHgwMDIwM0I4OCwgMHgwMDIwMzlGQywgMHgwMDIwM0EwNCwKKzB4MDAyMDNEQzAsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4RDU2NEQxNjMsCisweEU0MDBENzY0LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LCAweEQ1NjIyNzIyLAorMHg5NjY5RDc2MiwgMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwgMHhFNjAxMTU2NSwKKzB4RDU1RjExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LCAweDY3NjMyNTcyLAorMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwgMHhFMjE5MjUyMiwKKzB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjUyMjI1NDIsCisweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwgMHgwMDA5NDIyQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsCisweDAwMDlCRTg1LCAweEM4MTA2MEUzLCAweEJFODI4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAxQzg0MCwgMHgwMDA5QkVBNCwgMHhDODAxNjBFMywgMHhERDNEODkzOCwKKzB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsIDB4NjBGMDAwMDksCisweDg5MDJDODA0LCAweDQ2MEJENjM5LCAweDYyRjAwMDA5LCAweEM4ODA2MDIzLAorMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwgMHhDODAxNjAyMywgMHhENjM0ODkwNiwKKzB4MDAwOTQ2MEIsIDB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsIDB4ODkwMkM4MDgsCisweDQ2MEJENjMwLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLCAweDQyMEJEMjJFLAorMHhENTJFMDAwOSwgMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywgMHhBMDA1RTYwNCwKKzB4ODgwMTIyNjAsIDB4RDIyQThCMDIsIDB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsCisweEM4ODA2MEUzLCAweEQyMjc4OTJELCAweDYwRTM2RTIwLCAweDg5MDJDODgwLAorMHg0MjBCRDIyNSwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwgMHg0MjBCRDIyMywKKzB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsIDB4NjBFMzAwMDksCisweDg5MERDODA0LCAweEREMjBEMTFGLCAweDAwMDk0MTBCLCAweDAwMDlCRjExLAorMHgwMDA5QkY0QywgMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwgMHgyNUQyQkY4NSwKKzB4QzgwODYwRTMsIDB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsIDB4NDIyQjZFRjYsCisweDdGMDQ2REY2LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMUM1ODFDLAorMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwKKzB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsIDB4MDAyMDFBNDYsIDB4MDAyMDFBNjgsCisweDAwMjAyMEM4LCAweDAwMjAxQTgwLCAweDAwMjAxQThFLCAweDAwMjAzQTUwLAorMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMUFGQSwgMHgwMDIwMUIwNiwKKzB4MDAyMDFBOTYsIDB4MDAyMDFBQjQsIDB4MTIzNDU2NzgsIDB4MDAxRTEwMDAsCisweDAwMTBGMTAwLCAweDAwMjAxQUUyLCAweDY0NENENkE3LCAweDAwMEIzNDZDLAorMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwKKzB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsIDB4NDIwODYxNkQsIDB4NDIwODQxMTksCisweDQyMDA2MDE5LCAweDY3MEU2MTRDLCAweEQ0OUUzMjFDLCAweDQyMDAyMDdELAorMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwKKzB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsCisweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweEUyOUY2NjZELAorMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwKKzB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsCisweDY0NEM0NjAwLCAweDA3MUEwNDY3LCAweDIxNTAyNTdCLCAweDAwMEI0RjE2LAorMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwKKzB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsCisweEU0MDFCRkEyLCAweEJGQTRFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwKKzB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsCisweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLAorMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwKKzB4NzA5MEU0MDIsIDB4NjUwM0JGODIsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsCisweEJGODBFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhDLAorMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywKKzB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsCisweEJGNjNFNDBFLCAweEU1MDA3NTg1LCAweEJGNjRFNDAzLCAweEU1MDBFNjQwLAorMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwKKzB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDksCisweDA1RkNFMDE0LCAweEJGNDlFNDBGLCAweEU1MDE3NTg0LCAweEJGNEFFNjQwLAorMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksCisweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLAorMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywKKzB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsCisweEJGMUJFNDAxLCAweEU0MDFFNTA2LCAweEJGMUM2NTQzLCAweEU0MDFFNjQwLAorMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwKKzB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsCisweEU0MDI4NEY0LCAweEJGMDE3MDkwLCAweEU2NDA2NTAzLCAweEJGMDJFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwKKzB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsCisweEU0MEVCRUU3LCAweEU0MEU4NEY4LCAweEJFRTc3MDg1LCAweEU1MDA2NTAzLAorMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsCisweEU0MEY4MEZDLCAweEU1MDRCRUNELCAweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLAorMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsCisweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDJGLCAweDAwMUUxMDgwLAorMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwM0E0QSwKKzB4MDAyMDNBNEMsIDB4MDAyMDNBNEUsIDB4RDIxREQxMUMsIDB4NjYyMDYwMTAsCisweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLCAweDY3MTA2MjEwLAorMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwKKzB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsCisweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLCAweEU2MDA4RDEzLAorMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwKKzB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsCisweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLCAweDAwMjAzOTk1LAorMHgwMDIwMzk5NCwgMHgwMDIwMzk5NiwgMHgwMDIwMzVCQywgMHg3RkZDNEYyMiwKKzB4RTY4MEQxQTgsIDB4NjY2QzYyMTIsIDB4RDJBNzJGMjIsIDB4NjdGMzY1NjMsCisweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LCAweEU2ODAwMDA5LAorMHhEMkExNjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywKKzB4RDI5RDY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsIDB4MkY4NjY0NzMsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGQzA0RjIyLAorMHhEQjk3RDI5NiwgMHg3MjAxMkYyMiwgMHhEMTk2MUYyMSwgMHg2NjEyNTIxMSwKKzB4OEIwMTM2MjAsIDB4MDAwOUEwRjksIDB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsCisweDAwMDlBMEYzLCAweEQyOTBEQzhGLCAweDY0QzM0MjBCLCAweDY1MDNEMThGLAorMHg2MDExMUYwMiwgMHg4QjA0ODgwMSwgMHg0MjBCRDI4RCwgMHhBRkU0NjRDMywKKzB4NTQ1MzAwMDksIDB4ODQ0Q0VFODQsIDB4ODkwMTMwRTAsIDB4MDAwOUEwQzMsCisweDY2MTBEMTg4LCAweDYwMjM2MjZDLCAweDhCNzE4ODAxLCAweDYyMTBEMTg2LAorMHg4OTY2MjIyOCwgMHhEQTg2RDI4NSwgMHhFMDAzNjEyMiwgMHg2NDIyMTExMiwKKzB4NDAxOEQ4ODEsIDB4REQ4M0U1MDAsIDB4ODE0MTY3QTMsIDB4NzcwNDI4NTAsCisweDY0NzI2NkEyLCAweDZFRDNENTgwLCAweDFGNDU3RTA0LCAweDY1NTIxRjU2LAorMHg2NEUzNjhEMiwgMHgxRjg4NzRGOCwgMHg2ODQzNjlFMiwgMHgxRjYzNzg5NCwKKzB4MUY5OTFGNzQsIDB4NjI4MjYxNDIsIDB4RDc3OUQ5NzgsIDB4MUYyQkQ2NzksCisweDY3NzI2MjkyLCAweDFGMUE2MDYyLCAweDI2MDJDQjIwLCAweEQxNzZFNjAwLAorMHhFNTQwMUY1NywgMHgxRjdEMUYyQywgMHg3NjAxMUYxRSwgMHgzMjUzNjI2RCwKKzB4NTFGMzhCRkIsIDB4NTJGNTU1RjQsIDB4MjUyMjJBMTIsIDB4NTVGNzU3RjYsCisweDI3NTI1QUY4LCAweDVERjkyREEyLCAweDJFRDI1MUZCLCAweEQ1NkI1RUZBLAorMHg1NEZDMjRFMiwgMHgyODEyNTdGRCwgMHhEMTYwRDg2OSwgMHgyNTcyMjk0MiwKKzB4NjkxMjY3ODIsIDB4MTk3NEQ4NjYsIDB4REQ2NjZBMTIsIDB4NTZGRTYwQTEsCisweDJBMDFDQjAxLCAweERBNjQ2NDEyLCAweEU5MDEyODQyLCAweDRBMEIyRDQyLAorMHg1MkZFMjY5MiwgMHhENjYxRUUwMSwgMHgyMkUyNEUxOCwgMHg3MjAxNjI2MiwKKzB4NjBCMjI2MjIsIDB4Q0IwMUQxNEYsIDB4MkIwMkUyMDIsIDB4MjEyMEEwM0YsCisweDhCM0MyMjI4LCAweEU2MDFENTVBLCAweDIxNjBFNzAwLCAweEUwMUMyNTcyLAorMHhDODAxMDA0QywgMHhEODU3OEIwQywgMHgxRjhGRDI1NywgMHhFNjAwMjgyMiwKKzB4NzYwMUU1N0QsIDB4MzI1MzYyNkMsIDB4NTZGRjhCRkIsIDB4MjYyMkQyNTMsCisweEUyRkU2OUIyLCAweDJCOTIyOTI5LCAweDBBNENFMDFFLCAweEUwMUY2NUYyLAorMHgwMTRDMjVBMCwgMHg3NDEwNTdGMSwgMHhFQTA2MjcxMCwgMHhERDRDRTYwMCwKKzB4ODQ0NkRFNEMsIDB4MkQwMDc2MDEsIDB4Njk2QzY4NDQsIDB4MkU4MDM5QTMsCisweDhGRjY3RTAxLCAweERFNDg3RDAxLCAweDJFQTBFQTk0LCAweEUxMDA3RTAxLAorMHg3RTBGMkUxMCwgMHhEMTJGRTIwNSwgMHg2NDEwMkUyMCwgMHg2MDIzNjI0QywKKzB4ODkwODg4MDEsIDB4NTVGMkQyMkEsIDB4NjRDMzQyMEIsIDB4RUUwMUQxMzIsCisweEFGMUE0RTE4LCAweDU1RjIyMUUyLCAweDg1NTNEMTNDLCAweDYyMEQ2NjEyLAorMHg4OTA2MzI2MiwgMHhENjNCRDQzQSwgMHhFODAxNDYwQiwgMHhBRjBDRDczQSwKKzB4RDkxRjI3ODIsIDB4NjRDMzQ5MEIsIDB4RUUwMUQxMjcsIDB4REEzOEQ0MzcsCisweDRBMEI0RTE4LCAweEFGMDAyMUUyLCAweDdGNDAwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjA5LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxQzNEOUMsIDB4MDAyMDIzRkMsIDB4MDAxMTc3OUEsCisweDAwMUMzNkY4LCAweDAwMjAzNUI0LCAweDAwMjAxNEE2LCAweDAwMjAzQTE2LAorMHgwMDIwMTREMCwgMHgwMDIwMzlBNSwgMHgwMDIwMzlBNCwgMHgwMDIwMzlBMCwKKzB4MDAxQzNCOUMsIDB4MDAxQzM3MDQsIDB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsCisweDAwMUM1OTYwLCAweDAwMUMzNTAwLCAweDAwMUMzRDMwLCAweDAwMUM4OTYwLAorMHgwMDIwMzU4QywgMHgwMDFDM0QwMCwgMHgwMDIwMTYxMCwgMHgwMDExNzczMCwKKzB4MDAyMDM5QTgsIDB4MDAxQzU4MkMsIDB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAzOTdDLAorMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwgMHgwMDIwM0RBMCwKKzB4MDAyMDE4QzAsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEQxOUI3RkVDLCAweDJGMTJFMDAwLCAweDYxMDNENDlBLAorMHgxRjQyODFGMiwgMHhERDlBREE5OSwgMHhENjlBNjgxMywgMHhFMDAxNDgwOCwKKzB4NDYwQkRFOTksIDB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsIDB4MzUyMDUyQTEsCisweEEyM0U4QjAxLCAweDYwNTEwMDA5LCAweDg4MDFDOTAzLCAweEEyMzg4QjAxLAorMHg1MjUzMDAwOSwgMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwgMHg2NEEzNDkwQiwKKzB4NEIwQkRCOTAsIDB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsIDB4RUMwMUQ1OTEsCisweDJFMDJFMTAwLCAweDI3MTAyNkMwLCAweDI1MDJBRkRGLCAweEM4MDE4NTUxLAorMHhBMTU3OEIwMSwgMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwgMHg1RTUzMzY2QSwKKzB4ODVFMjIyNkQsIDB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsIDB4NjA1MzY1MEQsCisweDQwMjE0MDIxLCAweDQ1MDBDOTNGLCAweDMyMkE2NzAzLCAweDYwNTMyNTJELAorMHhDOTAxRDE3RiwgMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwgMHhEQjdGOEIwNSwKKzB4MjEyMEUyMDAsIDB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsIDB4ODgwMTYwMTEsCisweDY1QTI4QjBBLCAweDhEMDQyNDQ4LCAweDlCOUU2MjUxLCAweEEwMDMyMkI5LAorMHg5MTlCMjUyMSwgMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwgMHgyNDQ4ODk1RSwKKzB4RDQ3MzhCMDcsIDB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsIDB4QTA1NzgxRjgsCisweEQ1NzA2NDczLCAweDQ2MDg0NjA4LCAweDg1RTI2MjczLCAweDQ2MDA2QjUwLAorMHgzNjJDNDIwMCwgMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywgMHgyNjY4NjYwMywKKzB4RDI2OTg5MTEsIDB4MDYyRDYwNDMsIDB4NDExOTYxNkQsIDB4NkIwRTYwMTksCisweDgxRjgyMEJELCAweDg4MDE2MEMzLCAweDY0NkM4RjJDLCAweDg4MEY2MDczLAorMHhBMDI3OEIxQiwgMHhEMjYxMDAwOSwgMHgwNTJENjA0MywgMHg0MTE5NjE1RCwKKzB4NjcwRTYwMTksIDB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsIDB4ODkwRjI2NjgsCisweDYwNDNEMjVCLCAweDZCNUQwNTJELCAweDYwQjk0QjE5LCAweDIwMUQ2MTBFLAorMHg2MEMzODFGOCwgMHg4RjBEODgwMSwgMHg2NDczNjQ1QywgMHhFQzAwQTAwQSwKKzB4NjA0M0QyNTQsIDB4NjI1RDA1MkQsIDB4NjAyOTQyMTksIDB4MjA3RDY3MEUsCisweDgxRjg2NDVDLCAweDg4MDI4NUY4LCAweDg1RTE4OTBBLCAweDhEMDdDODIwLAorMHhFNkRDNjIwMywgMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwgMHg2NDRDRTRGRiwKKzB4NjIxMEQxNDksIDB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsIDB4NjU0REVCRkYsCisweDM1QjA2QkJDLCAweERCMzY4QjJCLCAweDY0QTM0QjBCLCAweDQxMEJEMTM1LAorMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwgMHhEQzQwODgwOCwKKzB4QkVBQzhCMDEsIDB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsIDB4REIzREVDMDEsCisweEQxM0QyREMyLCAweDYyMTI2MEIyLCAweDcyMDE3MDAxLCAweDIxMjI4ODA1LAorMHgyQjAyOEYwOCwgMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwgMHg3NTQ5RTcwMCwKKzB4NjQ3MzQyMEIsIDB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksIDB4ODVFMjgwMDAsCisweDIwQjlFQkZDLCAweDYxMDM4MUUyLCAweDk0MkE4NUUzLCAweDYyMDMyMDQ5LAorMHg0NTA4ODVGOCwgMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywgMHg0MDA4NDAxOCwKKzB4NDAwODQwMDgsIDB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsIDB4ODVFNDgxRTMsCisweDQxMThFMTA4LCAweDgxRTQyMDFCLCAweEU0MDI2MkEyLCAweDIwQjk4NTIxLAorMHg2N0EyODEyMSwgMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwgMHg4OTAzMzA0MiwKKzB4RUNFNzg1RTIsIDB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsIDB4QTAzQjAwMDksCisweDdFMDMwMDA5LCAweDAwMUMzRDMwLCAweDAwMjAzREFDLCAweDAwMjAzNThDLAorMHgwMDFFMjEyQywgMHgwMDIwMzQ3MCwgMHgwMDFDM0QwMCwgMHgwMDExNzc4MCwKKzB4MDAyMDE0QTYsIDB4MDAyMDE2NzAsIDB4MDAxMTc3MEMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUEwLCAweDAwMjAxOEMwLCAweDAwMUMzNkY4LAorMHgwMDIwM0ExQSwgMHgwMDIwM0RCQywgMHgwMDIwM0JBMCwgMHgwMDIwM0MyMCwKKzB4MDAyMDNDQTAsIDB4MDAyMDNEMjAsIDB4MDAyMDM5OTAsIDB4MDAyMDM1ODQsCisweDAwMjAxNEQwLCAweDAwMjAzQTFDLCAweDAwMjAzQTIwLCAweDAwMjAyM0ZDLAorMHgwMDIwM0RBNCwgMHgwMDIwM0RBOCwgMHg2MDIyNjJGMiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMDM4ODA4LCAweENCMDE2MEEyLCAweDI4MDJBMDA2LAorMHg2NUUyREU4NywgMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwgMHg1MkYzNjZGMiwKKzB4MjYyMkFFODMsIDB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsIDB4QTA5NThCMDEsCisweDQyMEIwMDA5LCAweDRFMEI2NEEzLCAweDVFMDM2NDAzLCAweDg1RTQ2NTAzLAorMHg0OTE4RTkwOCwgMHhENzdEMjA5QiwgMHhFMDRDODFFNCwgMHhEQzdDMEI3RSwKKzB4N0IwMUQ5N0MsIDB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsIDB4OEQwNjI2NjgsCisweEQ0NzkyQzEyLCAweDQyMEJEMjc5LCAweEEwNzBFQjAxLCAweDYyNTEyREIyLAorMHg0QjE4RUIwRiwgMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwgMHg4NTUxOEIwRiwKKzB4MjAyOUUyRkMsIDB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsIDB4ODVFMTI1MDEsCisweDIwMjk5NEEzLCAweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LCAweDY3NTE4MUU0LAorMHg0NzE5Njc3RCwgMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwgMHg2OTAzNjA3QywKKzB4ODgwMTQ5MTgsIDB4MjU5MThGM0UsIDB4NkIxMkQxNjEsIDB4MjFCMjdCMDEsCisweDY2MEQ4NUUzLCAweDQwMjE2MDYzLCAweEM5M0Y0MDIxLCAweDZDMDM0NjAwLAorMHgyNjJEMzIyQSwgMHhDODAxNjA2MywgMHhEQjVFRDE1RCwgMHg5NjdEODkwMSwKKzB4RTYwMDJDNkIsIDB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsIDB4NjIyRDAyMUQsCisweDhEMEUzMjcwLCAweDYwNDM2NDAzLCAweEU5RkYwMjFELCAweDhCMDEzMjkwLAorMHgwMUM1QTAwNywgMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwgMHg2NDZDOEJFQiwKKzB4NjA0MzQ0MDAsIDB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsIDB4NjY5RDY5MTEsCisweDg5MDczNjcwLCAweDYwMkQ2MjExLCAweDg5MDM4OEZGLCAweEUyMDFEQjRCLAorMHgyQjIwMjFDMSwgMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwgMHhDQjAxNjA1MSwKKzB4REM0NzI1MDEsIDB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsIDB4ODVFRjI2MTIsCisweDU0RjJEMjQ0LCAweDY1MEQ0MjBCLCAweDAwMDlBREU3LCAweEU1MDBEQzQyLAorMHg0MjBCMkM1MiwgMHg0RTBCNjRBMywgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywKKzB4NjcwM0U5MDgsIDB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsIDB4REIzMjM3OTAsCisweDhGMEJEOTMyLCAweDYwMTM2MTBELCAweDhCMDdDODIwLCAweEM5NDg2MDUzLAorMHg4QjAzODgwOCwgMHhFNTAxQkQ0QiwgMHgwMDA5QTAwNSwgMHgyMTI4RDIzMywKKzB4QkQ0NDg5MDEsIDB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsIDB4QURCQ0VDMDEsCisweDg1RjIyREMyLCAweDcwMDFFRTA0LCAweDMxRTc2MTBELCAweDhEMDI4MUYyLAorMHhBREE5N0EwOCwgMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsIDB4MkZFNjgwMDAsCisweEQyMjM0RjIyLCAweDYwRTM2RTIyLCAweDhEMDJDODQwLCAweEJCRTUyMkUyLAorMHhFMjQwMDAwOSwgMHgyRTI4NDIxOCwgMHhCQkYwODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwNUM4MTAsIDB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsIDB4MDAwOUJCRUYsCisweEM4MDU2MEUzLCAweEJENkQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLAorMHhBQkVDNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwgMHgwMDFDM0QzQywKKzB4MDAxMTc3NjAsIDB4MDAyMDE0QTYsIDB4MDAyMDE2NzAsIDB4MDAyMDM1MUMsCisweDAwMjAzREMwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LCAweDAwMjAxNEQwLAorMHgwMDIwMzlGQywgMHgwMDIwM0EwNCwgMHgwMDIwMzlGOCwgMHgwMDIwMzlGQSwKKzB4MDAyMDE1MzQsIDB4MDAyMDE4RDAsIDB4MDAyMDNBMUMsIDB4MDAwMDgwMDAsCisweDAwMUMzNTEwLCAweDAwMjAzREI0LCAweDAwMjAxOEMwLCAweDg5MDE0RjIyLAorMHg2MTFCNjAwQiwgMHg2MTFCQjAwQSwgMHgwMDBCNEYyNiwgMHg2MDBCNjAwQiwKKzB4NjExQkEwMDQsIDB4OERGMTIxMDcsIDB4OEJGODQwMTEsIDB4NjIwRDJGMjYsCisweDhGM0UzMDIwLCAweDQwMTgwMDE5LCAweDhCMEIzMDE2LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHg0MTI0NjJGNiwKKzB4NjAxQzAwMEIsIDB4NDEyOTYyMTksIDB4MjAwODQwMTgsIDB4MzEwNDg5MjYsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHg2MTE5MzEwNCwKKzB4MzIwNDIyMUQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgyMTJEMzIwNCwgMHg2MDE5NjJGNiwgMHg0MDI0MDAwQiwgMHgwMDBCRTAwMCwKKzB4NjIxMzYyRjYsIDB4NDEyOTQyMjgsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDYwMkQ0MjI0LCAweDYyRjYwMDBCLAorMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwKKzB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsCisweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LAorMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMzQ5QSwKKzB4MDAyMDM0NTAsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LAorMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsCisweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyNzA3MzcyLAorMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwKKzB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwKKzB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDZGMjA2QzY5LCAweDY5NzQyMDZFLAorMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwgMHg0NDM4NzU3MCwKKzB4NzI2MzczNjUsIDB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDQ3LCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsCisweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMDAzMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAyMDAwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDEwRjAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LCAweDczMjA0MTQyLAorMHgwMDNENzE2NSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsCisweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLCAweDgyMDUwNzAwLAorMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwKKzB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsCisweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLCAweDQwMDI4MjA1LAorMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMDAwNDAwMiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjUDJGd0ltYWdlU2l6ZT0xNTk2NDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3YnUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3YnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBmNTdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndidS5jCkBAIC0wLDAgKzEsNTI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndCdWZJbWFnZVtdID0geworMHgzQTRCQ0YxOCwgMHhGNDRDMDc2RSwgMHhGNTk0NTJFQSwgMHg0NTFCQTc1NSwKKzB4MTQwQUM4N0EsIDB4QzA3RUU5NDIsIDB4M0VGOTc4QUIsIDB4RjVCMDNEQzYsCisweEI3MDA4MEYwLCAweEE4OTA2NEVBLCAweDU0RTJDMUQ2LCAweEVCMDQ3REY0LAorMHgxNzk4MzkwQywgMHgwMDM1MDYyNCwgMHgzNUIzRUNGMCwgMHg1OUYyRkFCRiwKKzB4QUY5RDI0OEUsIDB4RjlCREI5RjAsIDB4RDA1QzhCNDcsIDB4QzA4QjVBMTYsCisweDk5MDA5M0M3LCAweEQzMzVBMTYwLCAweDFDMDQ5NDJDLCAweEJGNkU3QTg4LAorMHhGRDIzMkIwRiwgMHg1QzIyNDM4NywgMHhCRjFFMTU2QywgMHhGMjRGMkEyNywKKzB4RkY1NjQyMUQsIDB4QjIxMzAzN0MsIDB4MkJBNjdCQTAsIDB4NDk1MENGOEEsCisweDA1RjAwRjI1LCAweEE1RTgyMDg1LCAweDc0MTY4QTBDLCAweDJGMkFCMzBCLAorMHhDODBDNTdFRSwgMHhCNkJERjU3MCwgMHg4OUJDNUE5OSwgMHg3RjNCNUE2NywKKzB4RjZDOTQzQjgsIDB4MEM5QzkyMDEsIDB4RTgzODM3NDcsIDB4MEM5QTcyRDYsCisweEUwNTIwNzA0LCAweEE2NkQ3RjMwLCAweEU0NDRBNDM0LCAweEUwQzk0QUI3LAorMHg4REQ3NzUxQywgMHgxQTY1OTQ2NCwgMHg2QzlBQkE0RiwgMHg3OTJGMkQyRCwKKzB4NTkzNkY2NkIsIDB4MDYxRTU4MEUsIDB4NTk5MDNGNkMsIDB4MUZCRkI4QTAsCisweENDODIyRUZFLCAweDRCMDMwQ0FGLCAweEI2MjQ1N0M5LCAweDI3RTlCRjE1LAorMHhCMTEzQTQ4NywgMHhGQTBGQzkxNSwgMHg0NDdCMTg0QSwgMHg1MzMwQ0Q1MSwKKzB4MDBCQ0M2MjIsIDB4RjMwREUxNDksIDB4RkY3MThFMUMsIDB4N0I1RDI4NjEsCisweERCQ0E1NzNFLCAweEZCMEQ3QkY5LCAweEUxQ0ZCQUFDLCAweEY5OUQ0NTgzLAorMHg0QkE3NDk4QSwgMHg3Q0FFQTdFQiwgMHhCQTk1OEUzMiwgMHgzNkM1MzBGRiwKKzB4OEY4OENBOTksIDB4RjkzQ0FCQzIsIDB4OEU0N0VGMTEsIDB4RkIwRUVENkYsCisweDVCMzY2OEExLCAweDlENjNBRERFLCAweEEwRUVBQjhDLCAweDA4NDkxNUYxLAorMHhGQUNBQUEyNywgMHgyMDk2MzhGRSwgMHgxQ0VEOUVGRiwgMHhFRUJEMjMzNSwKKzB4MzhDNkY0MjQsIDB4MkQxRjNEN0UsIDB4OTc2RTgxMDYsIDB4QkUwODdBRDIsCisweDMyMTk0ODQ1LCAweDc1NjA2NkRCLCAweEM3MEUzMTY1LCAweEM1NjhEQ0IxLAorMHgzMjEyRTRFMSwgMHhCNUQ5OTFBRCwgMHgwN0MzQ0VGOCwgMHhEQjRBQkIzOCwKKzB4MTU3NEMyMzIsIDB4RjhDNzkyQkMsIDB4MTRFNjJEQkUsIDB4NUE0OEU3REMsCisweEVGREM1NDA3LCAweEM0NUI0MDE3LCAweDNCODE0RTg5LCAweEYwOTM2NDY2LAorMHg4OTQ5MUIyQiwgMHg5QTM1OUE0MSwgMHg4MjI4NzY3NSwgMHhBMEYzMzhEMywKKzB4NTIzRkREM0MsIDB4NEU0MEI3OTUsIDB4NDU4QURBQTQsIDB4RUQ4MTI5NTcsCisweDdBREM3M0JDLCAweDZGRDdEQjc4LCAweDI3NDBGQzA0LCAweDYzOTJBRUEzLAorMHgxODVBQkNFQSwgMHg2QjUwQUJDMywgMHgzNjgxRjA3RiwgMHhDODQwRjhDRSwKKzB4NTczM0U3RUMsIDB4MDgwNUZBNzEsIDB4MEIzNDUzMEEsIDB4OENCM0QwMzMsCisweDgxNDUxNTUxLCAweDUzQjBCNEVDLCAweDkwODY0NkQwLCAweDEwQTNFNjQyLAorMHhGMzU4REMzNCwgMHhDMUZBNTcwQywgMHgyQjEyODRCMCwgMHg1OTIzMjJCQiwKKzB4OUQ1ODc3ODMsIDB4RTdENzc5ODgsIDB4RTFCRTVEN0IsIDB4NDRCOTNFMjMsCisweEY4QkU5NEEyLCAweDUwNkRDNzIzLCAweDZFMEE3RDA5LCAweDNGQjEwNDZGLAorMHhEQjNBMTY2RiwgMHg5Q0I3RDZBMCwgMHhFMjc4REU2RCwgMHg4ODQ1OTMzNCwKKzB4QjUyQkEzQzksIDB4Mjg0NzQwQTIsIDB4MDREMzA3OTIsIDB4OTQ0RDc5Q0EsCisweDFEMDUwRUE5LCAweEE0MDREQjFCLCAweDk5NTI2MDIzLCAweEJBQ0UyNEU3LAorMHhCOUYyMDcwNCwgMHgyODRFNjQzMiwgMHg0N0E1OTNEMSwgMHg5NUY4REZDQiwKKzB4MjIwQzkxNjcsIDB4OEZBQUJCQkMsIDB4OTNEMzRFOEMsIDB4Q0UwNzcxMzgsCisweDRGQzE4MDgxLCAweEU3NkREN0U1LCAweDY3NDY1RjZDLCAweDdBNDc5RDc3LAorMHg3NEQ2MUY4MiwgMHgwMDU1OTIxNCwgMHgyRjY2RTQyRSwgMHg4NzQyQTk2QiwKKzB4NjIwNjM5NTAsIDB4QTJEQkZBRTUsIDB4MzY4Qjk2NkYsIDB4QUI1RkNDRTEsCisweENCNDAyM0IxLCAweDFFN0FGNTQyLCAweDA1OTUzRTMwLCAweDhDQTUxQ0ZDLAorMHgyMjE2NTQ3RCwgMHgyOUQ1NjJENCwgMHhFOUM5RjhFRSwgMHhBOTA1MDVDOSwKKzB4MDg4RDBFRUIsIDB4RDdBMjkwRkEsIDB4OTVFNUI1NjcsIDB4NTNGQUQzQzAsCisweEI4OUZDNjI1LCAweDY5QTc1MTlCLCAweDM2ODdDN0VGLCAweDcxODhDQjU1LAorMHhDRTVEQjk3RSwgMHhBMjYwNTc0QSwgMHhENDUzRDE3MywgMHgxNDVEOTcwQiwKKzB4MTIxMTJDQzYsIDB4Mzk5ODM5RTAsIDB4MjlDNTVCRUIsIDB4RTQ2N0M3MUYsCisweDEwQjNDOUQ0LCAweDhGMUM5NjYyLCAweEYyMDdBODI2LCAweEUwMjQ1NjAwLAorMHg2ODhCMTgxMiwgMHg1QTQ4MzAzMSwgMHg3MDQ4MzgwQSwgMHg3OEUzRDVCQiwKKzB4MTk1MTUzM0QsIDB4OEZBNUQ4RTMsIDB4QzVCRTUwMEQsIDB4NzFEQjVCMkIsCisweEExN0FBMDAwLCAweDQwOEM5QkU4LCAweDE2MUUxMkY1LCAweEIxQzM4QzQ1LAorMHgyMkE4OEYwNSwgMHhERTNGNDQwNSwgMHg1MDc4QURCQiwgMHhDRTFCRjFBNiwKKzB4QjdBNzVCMDQsIDB4NkI4MzY0RTgsIDB4MENFMzJFM0UsIDB4OUJGNjU1MDQsCisweDI4QzE4MTU3LCAweDc4MzU5QUM2LCAweDYxN0JGMjAyLCAweDFFNzZGQTA5LAorMHgwRjhFNjFBOCwgMHg2RDAyRjBENSwgMHg4MDM1NjQ1OSwgMHg3OUNFRkFFNywKKzB4N0QwMEYxNTUsIDB4NUMxQzAxMjgsIDB4Qzc1Q0EwNzMsIDB4MzI4MTYwOTAsCisweDlGRjc4REZDLCAweDg0OEQyNjlDLCAweEY4MTFCMzE0LCAweEE4NjkyMEZDLAorMHg2Rjg4NUQwMSwgMHhBQ0ZFNjUyNSwgMHhDNzI2MDc0RCwgMHhGRUQ2ODU5OSwKKzB4RjFENUM3NkEsIDB4ODc5OUU1RjUsIDB4Rjg1RjUxNzEsIDB4RDhERTJEM0IsCisweEU3REQ4RTc1LCAweDQzRjg2MTRBLCAweDA2ODRGQzhELCAweDk2ODNCOEM4LAorMHg3NEJFNzg2QiwgMHgyNTE0NzYyRCwgMHg3RDg2NjY4MiwgMHhFNzExRkUxRiwKKzB4MERFOUUyNzMsIDB4MTJGNTMxNjcsIDB4NEZBM0E3RkUsIDB4MkEwMEVCNjEsCisweEIzOTg0QTI4LCAweDQzMTlGMkIwLCAweDQyQkEwQ0EyLCAweDg0ODc3MUI2LAorMHg5OTVFOTQ1RSwgMHhENDExMTVGNSwgMHg0M0Q5ODM0QiwgMHg1NEVFREMzNiwKKzB4NUMzQzU0MDcsIDB4NjcxQjU0MEUsIDB4RENGMTg5NDgsIDB4MTUwRUQ5NzMsCisweDJENDkyMkRFLCAweEY5M0NBMTdELCAweEIyNEE3NkU1LCAweEQxQzAxQzIyLAorMHhGMjk2M0RENiwgMHgzQjg2MDA2NiwgMHgwOEVGMEVBNCwgMHg2MDlCNjBDQywKKzB4RTJFOTAxRkEsIDB4MjVCRTlCOTMsIDB4REY5NkQ5QkMsIDB4ODZENDE1REYsCisweDc1Q0NGNkJCLCAweDg4MkQ1NEIyLCAweDc5NzZFOUFGLCAweDg4QTBCMTc4LAorMHg1QURFNUE1NSwgMHg4QThDMDExMiwgMHhEODk2NzU1QSwgMHhDQjY3ODlCMywKKzB4OEI2M0FFMkYsIDB4MjU0NTAzNkMsIDB4RTQ2NTVCOTQsIDB4MjA5NTk5NzcsCisweDI5REZCNEQxLCAweENEQUFFQkY0LCAweDFDMDdFQzA1LCAweDVBNkY2MDdELAorMHg4OEE5QjMxRCwgMHgxMThDNzREMiwgMHgwMDBCQjA2NSwgMHg3NUM0NjcxMiwKKzB4RUYxQTU4QkQsIDB4NTBFQ0EyNjIsIDB4Q0NFMzkzQjksIDB4NkVEQjkyRTgsCisweDcwMEVGNTE3LCAweEJGNkNGNEFELCAweDU3NDU2REMwLCAweEY2Mjk1MTdDLAorMHg0MDMzMUY4QiwgMHhDMTBBNDU0RCwgMHg2Q0NCMDJDRiwgMHg5QkYxMUIxQywKKzB4RTA4NzE0MzcsIDB4MjM2MjM1ODUsIDB4RjUxOUYwOUMsIDB4NERCMkFGQzgsCisweDg4RkNCRDdCLCAweEI1MTJGRThELCAweERFNDQ1ODk0LCAweDA3OEFEMDNDLAorMHg0NDM3NUZCMCwgMHgwQkFCRURCMSwgMHg0MEQ1RThFMSwgMHgxM0YyMEE4NiwKKzB4RjE0MDYzMDMsIDB4NzIwNUMzMjIsIDB4M0ZDNDM3NzksIDB4N0E2MEQ1MTAsCisweDE0NDY5RTA0LCAweEY0RTc3ODczLCAweDJFQUQ3RUNFLCAweEExMzVENkVBLAorMHgzRjRDNEIzMCwgMHgyMTQ4ODA3NywgMHg2OUY2NEYxQywgMHhFRUY0ODc2RSwKKzB4NjM2MTBDMEIsIDB4QjdCMjRDNUMsIDB4MzI0QTc2RkUsIDB4MENGNjUxRDMsCisweDk0NjBGMEIxLCAweDgxQTgzMjMwLCAweDA4MzlDRkY5LCAweDcwNzIyRjA0LAorMHhDMjc4RkIzQiwgMHg1REQxQkRBNCwgMHgxRTRCM0RCQSwgMHhBRTE2MUE5MywKKzB4OUUxMDMzQzMsIDB4RDkzOEZDRUMsIDB4REEyQjJGOTMsIDB4MjhDRDgyRUEsCisweDE0QUQxRkFGLCAweEU0RUM5Q0I4LCAweEU3NzBBRkRGLCAweEVGQjEyODk4LAorMHg1MDBCRTE4MSwgMHg2MDI2MjVDNSwgMHhGMTYwNjMxQiwgMHg3OEQzNjQzRiwKKzB4NEUxM0VEMzcsIDB4NjQ3QkIyMjMsIDB4Q0YxOEQ3NUMsIDB4RjQ3N0Y5NEMsCisweDc4NkVDQjg5LCAweEIzRUQyMUY4LCAweDFCRUYzOTE2LCAweDI0MEZCMzVBLAorMHg1QzY5QjdEOSwgMHg4RTk2MjkwQSwgMHhENDBEQzk4QywgMHhEMTM3MDI5MSwKKzB4NTg3MDAyMUUsIDB4M0Y3Q0YyM0YsIDB4RkQ0QTZBREEsIDB4MzY0ODI0NTcsCisweDkyNjYwMEFGLCAweERDODYxOEJDLCAweDY3RDM3NzlGLCAweDM0MjI4MzBDLAorMHg4N0E0MUZCQSwgMHhDQTBBRkY1MywgMHg2M0JDNDVGMywgMHg1MjBCQkJBRSwKKzB4RURFMkUwMzEsIDB4QjZGQTk0NTAsIDB4MjU4Q0E3MTIsIDB4RDcwOUM0RTQsCisweDYxNzcwOUIyLCAweEFBQ0UwQjQxLCAweDM2M0RCRjU1LCAweDcwMUQ2NTgzLAorMHgzOUYzQzg4NSwgMHg3Q0Q2Mjk3QiwgMHgwNzhGRTEzQiwgMHhBMzk4REFCRiwKKzB4REI5N0M1MTQsIDB4MDM5MTAyRTMsIDB4NUNBNTQ1QUYsIDB4OTI5OEJBMTgsCisweEQxOERBRjg2LCAweDNENzBFRUEyLCAweDUyNjZBRDY4LCAweEIwNDk0NUI1LAorMHg0MDJEREE1QiwgMHgwMURDNkNEMSwgMHg5M0FDNTA1MywgMHgwOERGOUVBOSwKKzB4NDg1RUJFOTcsIDB4QTVEMDU4NTMsIDB4NkNCRUU5MTAsIDB4RDQ4NUY0RTIsCisweDhGMjAxRDA3LCAweEVGQzM4NEEzLCAweDcyNzJBRkJFLCAweEMwQjQxRkQ3LAorMHg4RTU0QTk3MSwgMHhBN0Y5RTBGNywgMHhDMjE3MDBCNCwgMHhDMjRBNEVEMCwKKzB4NTQxOUVBQ0YsIDB4QkMyRDhGQjEsIDB4MkM1QjVBRkYsIDB4MDM0NTI3NEMsCisweEM0MURGNDdBLCAweDM3NjU4QUZGLCAweDI0Q0YzQkU3LCAweEEzMDg2MjQ4LAorMHhGODJCNTkyOCwgMHhCNDlBOUIwNCwgMHhENDEwNUFFRiwgMHg0NDRFQkU4RCwKKzB4MzQ4MzY4REYsIDB4REM3N0E3QTAsIDB4NjhEMzdFMEQsIDB4RDJFQjU0RUUsCisweEREQUM4QzMzLCAweEU1QzkzQzc5LCAweEU0NzA2QUJGLCAweDE3NTM2RUZELAorMHg2QzJCMkIxNiwgMHgwMzhBQTgwNiwgMHhEQUQ0MjQ1OCwgMHhBRTFENzZBMSwKKzB4Q0M4REU5NUMsIDB4MUJBMjA2NDcsIDB4MDUyMTA2OEMsIDB4MzA2RkJFNDQsCisweDRFMjlEODgxLCAweEQyQTE0RDUzLCAweEExNTU4NTNFLCAweDQ0NTAwQ0M0LAorMHhGQzQ0NjZCNywgMHg1QUFDRDUxRCwgMHg1MDZEM0E3MywgMHgzRjYxRTBGRSwKKzB4NThGMTFGOUQsIDB4QzkyQTJDQUQsIDB4RDlBNEY4NkIsIDB4MUZBNzQ3QjEsCisweDc3REVDNUQyLCAweERGQUIzNjlBLCAweEQ0NzFFQTAxLCAweDcyNDUwMkRBLAorMHg2MThDRTIxQSwgMHg1MjM4OEJFQiwgMHgyRThBNENDNSwgMHg1ODMzMjIxMSwKKzB4M0ZDQzQ2RTEsIDB4NTAxMjEwRTIsIDB4RTlENTFEMUEsIDB4MzcyMzdCNTUsCisweDhDRTNFMkYxLCAweDZCMkU5OENDLCAweEI1NkExMUU1LCAweDg4MTkwMzZCLAorMHhBNkFBMkYyNywgMHhCMDEyNEEwRSwgMHg5MkYxNzM2NCwgMHhENEE4OTIzOCwKKzB4MDUwN0UzMzcsIDB4OEVEOTVERUMsIDB4OUMwMTRCQTgsIDB4QkE1QjExQzYsCisweDlDMTVEMzhDLCAweDUyNTk2Qzk4LCAweDkzMzBERDNELCAweEQ2MTQ3NTcwLAorMHgyMTcwMUYxQiwgMHg1QTIzODVGMSwgMHhFMkYzOEM2QywgMHhCM0U5NDY5OCwKKzB4MkY5QzYzRkEsIDB4N0UwMjM0RDgsIDB4NENERDMyODgsIDB4RTE5NjlCNUYsCisweDg1M0IzQzFELCAweEY2MTQ2NUE3LCAweEYyODFDNDE5LCAweDQ2QzVGMDcyLAorMHg5RjE3MjJERCwgMHg2NEYyQTk5NCwgMHg4NkFFRThBOCwgMHg1NTg5NUUxNywKKzB4NjA0N0QxQUMsIDB4MzM3NUE5MzQsIDB4MzM2QkVBQ0EsIDB4OTA3OTExNzQsCisweDREQUNDNEQyLCAweDI0MjUzODYwLCAweDJBNzg3NkZCLCAweDlEQkRGOThELAorMHhENUJDRTE4MiwgMHg2N0VCNUY3MCwgMHhDQzA2QkEzOCwgMHhFOEY3ODcxNSwKKzB4RkVCMEVCNDQsIDB4RTk3NzZFMDMsIDB4ODkyQTA4OTgsIDB4N0EwNzA2NTAsCisweDZEMDREREM0LCAweDk5QTVCN0VBLCAweDNCNDE2QkI2LCAweERBRENFODM0LAorMHhCM0IwMzI3OCwgMHhEQjczQjcwRSwgMHhCMEYwMjI0RSwgMHg1MzhBNEFGOSwKKzB4RDI1RDZBMzcsIDB4OEY2MjdGQjAsIDB4MTFFRDkzODcsIDB4QjhDODg0NTcsCisweDBDRjMyMENBLCAweEEyMEU2MkEyLCAweDFEQUNERDRBLCAweEFCODQ1NzVELAorMHg3NDBEQUY3NSwgMHhBQjlEQjk1NSwgMHhGRjc4NzMxNCwgMHhBNjgwQjhFMywKKzB4Qzk3NkQzOEUsIDB4MUZEMzhGNEQsIDB4MEFFQjY2MzMsIDB4QjY5QTAzREYsCisweEI2Q0E4NjEwLCAweDEwNjM1NEMyLCAweEMzN0Q0OEM4LCAweDNFNUVFRDU0LAorMHg1MzRDQzlCQSwgMHhFMzdERkZBRCwgMHg5RjY5RUIwNSwgMHhGNjcyMTdFRSwKKzB4NTAxODBCM0QsIDB4Q0M2MUMxMjcsIDB4QzM1OThENzMsIDB4RTVDMDBGMDEsCisweEZGRTlCMTExLCAweDVFMjNFQTJGLCAweEY2QzQ1RENFLCAweDQ0NTg1RTM5LAorMHhCMDJDNjAwNCwgMHgzNzIzMzkwMiwgMHg0RjM3NEMwRCwgMHgzNDI4ODg5OCwKKzB4RTI3NDkzN0QsIDB4QzgxRDQ3MkMsIDB4MTdBNDMxNTEsIDB4MjYzOEY3RDMsCisweDUzMDRFNUI1LCAweEQ1Q0U1RURFLCAweDM1N0ZBN0IzLCAweEZCRTI3OTg2LAorMHg2NEU2NUQxRiwgMHhDMjhEMTIzNywgMHhBNzNEOUFCMywgMHgxMjRDQTZDOCwKKzB4NzcwRDc0MTUsIDB4NTc4OEMzMkMsIDB4MThERUZDMDAsIDB4QjNCMkIwNkEsCisweDU1Q0M4NkEwLCAweDhEOTI5MzA5LCAweDg0QUIzODFBLCAweDlERUZFOERELAorMHgyNkM3NDJDOCwgMHg5NTJCQUMzNCwgMHgwQTNCMTQwRiwgMHg4MkE5MzA0QiwKKzB4NTJDRUM5RjQsIDB4NDdERjREMDgsIDB4MTVBMTE2RDgsIDB4N0I4OTBCMTgsCisweEM4N0JFRjFBLCAweEI1OTYwMUI2LCAweEQzN0JGQjI4LCAweDVEOUY1NjRELAorMHhGQjAwMkY4RCwgMHhFNzYwMkU1NywgMHhFNDI5Qzg1MiwgMHg5QzBBOEM3NSwKKzB4RTAyNjExREMsIDB4OEExQzk4NjEsIDB4NzQ5NUQ2REUsIDB4Q0EwNTk3MTAsCisweEFFNTk2OUI4LCAweEU1QjJDQkRDLCAweEE0OUY2RUMxLCAweDg1RDJBNTUzLAorMHhFNDcxOUIwRiwgMHg0MEY2OEJCQywgMHgwOTJFMjRCNSwgMHg3QjEzMjY3OCwKKzB4RDcwQzE3RTEsIDB4MzA5RTZBQTEsIDB4RTAwOTY1N0YsIDB4QTcyMzhDN0EsCisweEUwNTc1RDc4LCAweDFENjk4MEU3LCAweEVGQ0REMzY4LCAweDE5RjA4RDkzLAorMHhGQUMwM0I4NSwgMHg1MUJBREE4RiwgMHgwMzdERjgzOSwgMHg4RjREMjlGNCwKKzB4MURDOEE5MTMsIDB4NTBDNTU0MDIsIDB4REVFNTc4RjAsIDB4MkJBMUMwOTEsCisweDlBQ0E1NjdFLCAweEE4RkZFQ0ZBLCAweEEzQzA1RDEyLCAweEYxOEM2MjgzLAorMHhFQUFFNjY2MiwgMHhCNERDNkE3OSwgMHhDRUM1RTc4MiwgMHg5M0EyRTM4NCwKKzB4OEY4QTVFNkYsIDB4Q0E4Mzc5RDUsIDB4ODFCQ0Q0OUUsIDB4NUZDRTE3NEIsCisweEQxNTQzQTVCLCAweDg0NUQ2MzVGLCAweEQ1MzEyNUI5LCAweDNCMjEyMUFFLAorMHhGOEVDREQwMSwgMHhGODREMkQxMSwgMHg2NTc5QkMyMSwgMHg1QzJEQzIyMCwKKzB4OUVDMUE2ODgsIDB4MTE0OEQ4MzEsIDB4NkMwODc3OTksIDB4NTg5NDQzNTcsCisweDU2Rjc5RkM2LCAweDZCNjg5QjU1LCAweDc0MEI1RkQxLCAweDlGN0JGQjVGLAorMHg2QjJGM0UyRCwgMHgxMEUwOTI3MywgMHgyRTlFMzIxMywgMHhGMzQzNkFBMCwKKzB4MTRBOUY2ODEsIDB4OTA4N0QzQ0UsIDB4NjhEMDQzMEIsIDB4OUZBRkUzRUYsCisweEQ0NUI4QzYxLCAweEI5ODI3MjRBLCAweDA0NDQ4RDdGLCAweDg3MTJFNDdBLAorMHgyQzE4OEQxNSwgMHg5QzNGMDZDQywgMHg2MzQzQjEzMCwgMHg1NkM2NzY1QywKKzB4RjY1N0JDOUEsIDB4MTVGMUU5NzMsIDB4NDdFNzExODEsIDB4ODYzOUY1RDcsCisweEMxRjNGREQ1LCAweERDNTIyNDQxLCAweDU2QkIyOTA4LCAweEFBNDhBRUM2LAorMHhFQzA0MDg3QSwgMHg4RDM3NTg3NSwgMHhFMjk0MUY4OCwgMHhFRDMxQ0M3MiwKKzB4MDlCRDg3OTQsIDB4NEM4MUQ1QzEsIDB4MUNDOTZEOUMsIDB4OThBODkwMjIsCisweEFBMzYyQzU3LCAweDkyNEQ1ODNELCAweDI3MDQzMEU2LCAweDBGRDQwNDBBLAorMHhBRjU2MTE1NSwgMHgzOERDRDFDRiwgMHhFODYxRDJBQywgMHgyNEEyRUYzQywKKzB4MkI3RTM4NjgsIDB4MTNEQTZDMTIsIDB4NjkyMDJFQjYsIDB4NEE1RkVDNjYsCisweDE4NTQxN0E5LCAweDNDOTJFRkY0LCAweDk0OTg0MkU2LCAweDAyMTE1RDkzLAorMHhBRDE3MjZGRiwgMHg0RTA5M0Q3RCwgMHhDM0U0MUI5QywgMHgyN0JCQzFDMSwKKzB4NEZGQTQ5QzcsIDB4NkM2M0QyNEMsIDB4ODQyNTU0NDQsIDB4MjgyQzNCQTIsCisweDNENjc5RDg2LCAweDAzQjQxMEIxLCAweDY0REI0NTRDLCAweDUzNTQ5OUQ0LAorMHgyNUI0MjFBMSwgMHg3RTY4QzhGRSwgMHgwNDc3RTNCOSwgMHhDRUZCMDg3RCwKKzB4OUU1OUI4OUMsIDB4QkI3ODc1NTksIDB4MUE1NTBFRTQsIDB4MDc4QjQ4QUIsCisweDczQTg2NUZFLCAweEQ3MjI3NDcxLCAweDNBODY0MDQ5LCAweEU1RUUzQTFELAorMHgyMDFCQzE5RCwgMHhFQjhEQUUyQywgMHgwRTJBQjMxRCwgMHhDREFDMkQ3OSwKKzB4REFBQjA4QjEsIDB4NjNFQ0Q0RjIsIDB4QzAwRjk3MTYsIDB4RDQxNUM2QkIsCisweDhDMjBDMzlGLCAweERFRDhGNUEyLCAweDFENkE0MTkwLCAweDNEMzE5MTY3LAorMHg1NkIzQTI2QiwgMHgwNTQ3QkY1MiwgMHhBMDU2OTI0RiwgMHg0REFBNTM5QSwKKzB4NTU3MjQxRDEsIDB4NDJDOTEyNEUsIDB4MTg3MjMzMjMsIDB4NkFENkU3RUMsCisweDhFMDM5MzM3LCAweEY2RkRERDY1LCAweDVGMzUyNUY5LCAweEMwQUQ5NzA0LAorMHg4MTBFRjA0OSwgMHhDRTAyMkVFMCwgMHg0MUNFN0U1MiwgMHg4RTE3MkE0NCwKKzB4NjQ4ODA4RTIsIDB4QzdGRjY4OTYsIDB4MkFEMDk4NUMsIDB4MzA0Qjk2MzEsCisweEQyMUVBMzlCLCAweDI3OUY1MDg5LCAweENEQjVDMzkwLCAweDIxNzE2QTQwLAorMHg1RTM0QjI3OCwgMHgzOTQ3NUQ3MiwgMHhCQTRGNERCMSwgMHg4QjI1ODE4RiwKKzB4RTZFNDY2RjQsIDB4QzRBMDlERjgsIDB4NTlGMThBQzcsIDB4ODg3QUI1RkUsCisweEVFQTRCQTQyLCAweDE3MzcxREE4LCAweEE4MjE5M0QxLCAweDZEQzMwRUY3LAorMHhERUI5RDM0OSwgMHgyQjMyNzFENCwgMHgxRkU4MzgzNiwgMHhFQzc1NUEyOSwKKzB4MDVGMDdGQ0QsIDB4QzMzMUQzQUUsIDB4QzYyMDhCNzYsIDB4NDk3RkYyODAsCisweDRDNTc5QzVBLCAweDIyQjcxRjk0LCAweDMwRkQ2MjBCLCAweDMxQjcxQUUzLAorMHhERjdEMUE0MSwgMHhGMDQxQUNBNSwgMHg5NTMzMjYxQiwgMHgzMjYyRDI5MSwKKzB4MDYwRTk2NzIsIDB4N0QxOTFBNTUsIDB4NkQwRjA5NDUsIDB4RjhDNzc3N0MsCisweDFDMTczODA4LCAweDc4MzA4RTc3LCAweEMxRUVBRDNCLCAweDA1OUNDRDlELAorMHhBOEZEQkUxOSwgMHhFNDc2MzBGQSwgMHg4OEE0OURFNSwgMHgwMzM0N0RBQiwKKzB4NEYzMUY5NjksIDB4RjlDNjJCMTIsIDB4OTNBQjEyNkYsIDB4OEE3QTNCRkIsCisweDgyNTkxNTQ1LCAweDJBMUEyMTMxLCAweDFERUJCMTM0LCAweDQ0OUUyOERELAorMHhGQTdFMDI0OCwgMHhDMUUzQTVCQywgMHgxNzQ3RTA5NywgMHg0QzY5QUE1QywKKzB4MUZENzFCNEIsIDB4QUM2NENBNkMsIDB4NTU0NUY5RjksIDB4NUU1ODg2RjIsCisweDI0M0RCQTZDLCAweDQ5NUJFMTYzLCAweDRFQ0Y1QTZDLCAweDQzMEM5MDE5LAorMHg4OUE5ODBGQSwgMHg1Mjg5NDVBRSwgMHgwMENFNjkzNiwgMHg5RjlBNzNCMiwKKzB4OUU1OURDNkIsIDB4RDU3NzQwQ0QsIDB4MEUwQ0I3MzUsIDB4QjEyMDJCRTMsCisweEFBMjZDMkE5LCAweDI2N0E3N0E2LCAweDNGQTEyQ0YwLCAweDQ1ODdDMEFGLAorMHgzNTRFRDgzMSwgMHhGRkQ4QkQ4RSwgMHg1NkNDMEYyNiwgMHg3NTcxN0FFMywKKzB4NTFCMTA2NzQsIDB4M0UzM0VDMjYsIDB4MjZDRTgwREIsIDB4NUM0QTkxNDAsCisweDAxN0Y2QzJGLCAweEY5MDM4RDlBLCAweDBBMjJDMjlGLCAweEJBMUY3QzhELAorMHgxMjVDQzkzNCwgMHg2Q0Y2NkJGRiwgMHg0OEMxM0RDRCwgMHg2M0ZDM0Q4MSwKKzB4MjU4QzE4MUQsIDB4MUE0QzNEREQsIDB4MkUyNEJFQ0MsIDB4N0M4NkE5RUQsCisweDVCRDE5ODlDLCAweDU3Q0U1OTVDLCAweERGMjkxQUZFLCAweEVBRjAwODg3LAorMHhEOERENDI1OSwgMHhERjY3MzMxRSwgMHg1MEQwQ0U4OCwgMHgxRkQwOTBBRSwKKzB4NjMyREE1RjAsIDB4OTUyNzJBNUIsIDB4MzExNzJGMjUsIDB4NTQ3RkQ3REYsCisweEFGQkUxMUQ5LCAweDk3MTg5REZDLCAweEM0ODgxMTkxLCAweDFDOTIzNjVELAorMHg4NDNERUZERSwgMHhDRjBBMzk5QiwgMHhDRjMyN0NBRiwgMHhEREFGMEJDRSwKKzB4MDNBQTdBMkUsIDB4NDExQTg2NjQsIDB4NkNDRjdDRDksIDB4NjEwOTdFRjUsCisweDA3RjM5NDFFLCAweDVCQzNFQjc1LCAweDI3OTE5NDVGLCAweEJFQkI1MjZFLAorMHgxODYzMUEzNCwgMHgyNUZFQkYxMCwgMHg0MTk4MzRDRiwgMHhGNjQyRDE3NiwKKzB4MzcyRkZGMTAsIDB4MkExQkVBMUIsIDB4NDAwRkYzNDUsIDB4MjU3QTIzNEEsCisweDlGMTVFOTlELCAweEUwNkFBMURCLCAweDNBMERCMzE1LCAweDJCQTMwRDk5LAorMHgwRTlFODMxRSwgMHgxQjI1RUU0MSwgMHg4REIzMEU3MCwgMHg5RkJBNkQ2NCwKKzB4QUI4QUE1RTMsIDB4NUE5NjE3N0EsIDB4NkJFMDM1MzUsIDB4OTdFMzdEQ0UsCisweEFDQTI0RjI2LCAweDVGMDA5NkY3LCAweDVEMDI3MjJGLCAweEFGOEYzRUM3LAorMHhBNjgyNDE1MSwgMHg3MEZBRDQwNiwgMHhERUJBODUxMywgMHg5OUM2M0UzNCwKKzB4MUNDNEEzREYsIDB4N0Y3NTY1MDgsIDB4QjczODY1MjcsIDB4NjQ3QzdGQjgsCisweDQzRjFGNERGLCAweEM3RTRFQzE4LCAweDMwMkJBMTA5LCAweEQ1RTkxNzVCLAorMHg4Mjg1NkY3NywgMHgwRjZENDVEOSwgMHg5NUFFMjhCOSwgMHhFNjMzODVDMywKKzB4OEZCMjY2MTksIDB4QkQ5OUYyOTgsIDB4Qzg4NEI5NDgsIDB4MEI1OTZGRjEsCisweEUwNjFDM0Y5LCAweEJDMkY5QTgxLCAweEM0ODhDRDkxLCAweDM3MkVGNTkwLAorMHgzREExQkZFNSwgMHgxMERFMDM3QiwgMHg3MjEwQjREQywgMHg3NEU0RUZGOCwKKzB4NjM2NUFGRDIsIDB4OENFQUJDODUsIDB4MUQ4RkZENDMsIDB4NERFMjQzRjgsCisweEVDOTc2RkQ5LCAweEFEODI3NzY1LCAweEM2NzlGMTVELCAweEMxMjVFQzMxLAorMHg5NUQzNDgxQywgMHhDNEVBNkVBQywgMHhDOEZDMDE0RiwgMHgxMzUyRUI2NiwKKzB4OUM0MDBFQjUsIDB4MjI3QkZBQjksIDB4QjEyQkY5NTgsIDB4ODVCNkQ3ODIsCisweDc4QjZFNDRELCAweEUyMjMyRUVFLCAweDRGMTAxNzExLCAweDlBQkVCRjY5LAorMHg2NkFDQzY4MiwgMHgwNEFENUY1NSwgMHhFNEZDNjIzOCwgMHhCQTNEMjI2NiwKKzB4QTJCQTMxNzAsIDB4MDgzRjM5QUIsIDB4RkYyMDc1QzQsIDB4OTQ1QzRCMDUsCisweDQxRThDMTEzLCAweEVDN0NBRDY3LCAweDM2NTM3MzNFLCAweDAzNTEwQzNCLAorMHgxRTk3MzE1OCwgMHhGQkU1MDdGMywgMHgyQ0NEOEQ5QSwgMHg2RUE5NDQyRiwKKzB4MEQ0OERFOTUsIDB4QzUxN0JGQUUsIDB4MDRFQkI1QzksIDB4RUZBQjE4MjMsCisweEQ1RkJGQzBBLCAweDY4OTBGMjEyLCAweEExQzAwQ0NELCAweDZERDU2MUU2LAorMHgyMEQzOUIxQywgMHg1NjExM0ZCQSwgMHhDRjNBN0ZENywgMHgzQUI1QTBEQiwKKzB4MzY1NjU3MkUsIDB4N0JDNDhDRDMsIDB4ODkwMkFFMzYsIDB4RDNFOTRBRkYsCisweEMwNkVCNDQ3LCAweENDNTEzQzBDLCAweDI1NDRCN0RELCAweDZGMTY4ODc3LAorMHg1MzE2MjYwNywgMHg0NjFEQ0VGMCwgMHhGNDdBRjJCQiwgMHg4QUY5RjNDQywKKzB4MUVFRkY5RTYsIDB4NTdDRkI2QjYsIDB4N0Y3MTI0MzksIDB4QUIyMEM5M0QsCisweDA0M0Y5MDAzLCAweDYwQzgwOEJDLCAweDg2QzIxMzdDLCAweDQ2QURCNDc0LAorMHg4NDhCNjVGMiwgMHg1NTQ0Nzg5QiwgMHgxOEU5QUVDNywgMHhDODg5OTEzRSwKKzB4RkVCNzlCMkYsIDB4QTNGQkU1MTgsIDB4Njc5MjI0NjMsIDB4OTM3NDYzOTgsCisweDk2OEUxNjBGLCAweDhDQTg1NkE0LCAweEEwNDAyMDJFLCAweDY2MEMwMEM2LAorMHg4RjBBOEU2MiwgMHhFMkJBNTRERSwgMHg0QkQwQzExNywgMHgxQTFBMzA5MiwKKzB4MDg2Q0FBM0EsIDB4MkJCQTU2NzYsIDB4ODk2MTAxNzYsIDB4MDBFRDJGOTcsCisweEM3MjEzMEM3LCAweDVBMDUzODgwLCAweDcyOThFNTUzLCAweEQ2Nzk3MUVBLAorMHgwRDQxRTQ3NywgMHgyRkE4Mjg1RiwgMHhCODU2QTE5MCwgMHgxMzJEQjkxNiwKKzB4Q0RGRkREMTEsIDB4QjU1MTlBODEsIDB4MUJDNzAwMUIsIDB4OTdDODI0REMsCisweEJCNEM3MDdGLCAweDkwMTY2REMyLCAweDQyREZBQjdBLCAweDkwRTMzMTg0LAorMHg2QzZCOTQwQywgMHhEQzU1MzgxNCwgMHhDNEY1RTdBQSwgMHg5OTQzNEFFOSwKKzB4ODJCQjA5RDQsIDB4Q0IwQTdEQTMsIDB4M0E4MDMzQUUsIDB4MDU0RDM0ODEsCisweEUyMEFGNzYxLCAweDI1RjVGMjU0LCAweDdBRDNBRjNBLCAweDIzQTM0QzI5LAorMHhBMTlDNTdCQywgMHgzOUI1N0FEOSwgMHg1NUUxRUM1OSwgMHg1RUNBNDE5OCwKKzB4REI5MDhCQ0QsIDB4NDg3MUMzRjQsIDB4RTcwOTEzMjgsIDB4NjRBOUI2RUMsCisweDFDQ0FCMkYzLCAweEVEQjIyNDIzLCAweEZGQjZBNzE3LCAweDZGQTEzNTQ4LAorMHgzNjFGRjcxMSwgMHgyNDY2NDAxNywgMHhDQkJGOTk3MCwgMHg4M0E3QjdERSwKKzB4OUI3MDQ2OTAsIDB4MDFBMEI4NzcsIDB4OTUwNDFCNjAsIDB4QzA0OEYzRTEsCisweEEzMTYyNUYyLCAweEUzREZCRTI3LCAweEY2NTcyOTVCLCAweDFGNUMzQUY1LAorMHg2MEVFMTYzNywgMHg1NzVFREZBQywgMHg3MjU4NDRGQiwgMHgyNDI3MjNEMCwKKzB4MDRGQTQ2RkMsIDB4MUE4QzNGNDQsIDB4MEUwM0E1RkUsIDB4ODc3ODA3OUYsCisweDYwNkU0RTFBLCAweDdDMEFGM0Q1LCAweDk1NzhCMjY2LCAweDYzQkNFNzY1LAorMHhBOEVENjZEOSwgMHg5MjQyMzc3QSwgMHg4MTdBNUQ1RSwgMHhEMDk4MUE5OCwKKzB4QzA3RjJFN0YsIDB4MEU2NkY4NEEsIDB4MzYzNUY4NTQsIDB4RDdBRDgzNTksCisweERDRjIzMjMwLCAweEMxQjkwODRDLCAweEE3OTg3RkU1LCAweEMzQjI3RUI0LAorMHgxRjc0NzA2MSwgMHhGRDI3ODYwMSwgMHhCNkVEM0I1QSwgMHg5Q0VGOEFBMCwKKzB4QTUwMjNDNDYsIDB4QjQ5ODMyQUYsIDB4QjEyMDU1RkQsIDB4RDg1MzEwRTEsCisweDJDMTlBREU2LCAweEVGQkIxN0E4LCAweEMyNDZBNEM3LCAweEJFNEIyNjY2LAorMHgxM0MyRDdGOSwgMHg1MDA2M0JBMSwgMHg5QjAwRTAyRCwgMHgzMzVCOURGOCwKKzB4RDQyNEFGMjUsIDB4QkFFNDBDOTIsIDB4RTg3QkQ2QjcsIDB4Mzg0RDFFQjEsCisweDhCOTFFOEY0LCAweDlFM0ZDNkQ1LCAweDZCQjFBNTFFLCAweDIxQUU1NTMzLAorMHhGQ0I4RTcxMywgMHgxODhCNjZCMSwgMHg2NTcyRTlFRCwgMHg5ODgyOTE3OCwKKzB4N0JBRThDQkYsIDB4RTAwQzMyQjQsIDB4REFGQzE0RDUsIDB4RUE4RkM3NDYsCisweDJDOEQ3MTJFLCAweDg5QTA1RkM5LCAweDlBMjc0NjQxLCAweEFDMjQ1MEFELAorMHgyNDM3Nzg0RiwgMHgzQjFCODBGMCwgMHgwQjRBMzFGRCwgMHgyNzdDMDIzMiwKKzB4RkREQzY4MjksIDB4M0YzQzYwNkMsIDB4MEVGNjIzNTIsIDB4M0QwN0QwNEEsCisweDRFMDkzOUU4LCAweEQ1OUJGMTE1LCAweEEwMjc1MkU3LCAweDQyQkY3MTMzLAorMHg5RkEwOTM5RSwgMHg2NDc2NDEwOSwgMHhENUQwM0VCQSwgMHgzRDQ0MzNBMywKKzB4MTc0OUI0MzcsIDB4MTM3Mjk4QjEsIDB4Njc3QkUzNDQsIDB4QTgzQ0VGN0UsCisweDE3ODEzQTM5LCAweEJDNzE4MjNGLCAweDIwNzBFOUE3LCAweDM4NzNBRUY4LAorMHg1QUYxRTIxQiwgMHgxRjBDQzY5MiwgMHhCOEVGQjA0RCwgMHgxQTFDQzUxNCwKKzB4QURFRDZDM0QsIDB4REYzNUE4RDcsIDB4NkQ5MzI3NUUsIDB4OUMzNjI1NDUsCisweDYyQkY3NTgzLCAweEZDNTZEOTkwLCAweDBDRDZBMzI0LCAweEYxMkE3OTM5LAorMHg1MjU4NzAyOSwgMHhEMDBENUYxNiwgMHg1MTYyMjU1NSwgMHgxMTc4RTg4NywKKzB4ODFFN0JDQzgsIDB4OTJCQjFDMTEsIDB4MDk3MzMwRTQsIDB4Q0Y4QzVDQUYsCisweEQwNzZENkJDLCAweEJBMjkyOTE4LCAweEY4MzVBODI5LCAweDQyODBBNTFFLAorMHgwOUNENzgyNywgMHgxMTU4MzQ4NywgMHhCOEJBMkNFRiwgMHhENTk4QUU5MywKKzB4OTlGNEZENzcsIDB4RUIxNTExMTAsIDB4MTU3MUIwNzYsIDB4NjNGMjEwM0EsCisweDU2QzZCRjQ0LCAweDlFNjNCNTU2LCAweEZCOTgxMjM4LCAweDVEOEM5NzhCLAorMHg5NTAxRDkzNiwgMHg4MkExRTk3MSwgMHhFNUE0RjdFMiwgMHhDNkUzNzI3QSwKKzB4MDMzMjlGMDcsIDB4MjQ4QUNERDYsIDB4NDM3RTkxN0IsIDB4MjNCMDJCMjAsCisweDczRjc2QUEwLCAweDc1RUEwNkM1LCAweEQ3QzY2MkIzLCAweDI2Nzc3N0Y4LAorMHhEQzk2QkYwNiwgMHg1NDAyMDM0NiwgMHhDQkRGMDY5QiwgMHgwMzAxMzNFQywKKzB4QTdFRjFDMkUsIDB4NTY4OTU5QUIsIDB4NEZDMzFERTAsIDB4M0EyMjg5MEUsCisweDI4MEY4NjUyLCAweDFCRDhDQjI0LCAweDlBOEQ5MkM5LCAweDUyNzE4REUxLAorMHgxMjAzM0ZDNywgMHhENDg0OTBDQywgMHg2ODFBREVFMiwgMHhGOTFCRjdCOCwKKzB4Qjg2MDlCMzgsIDB4MzRDRjRCQ0EsIDB4OEYxMjMyOTAsIDB4MEQwRjRGQ0QsCisweEM0RjQzMzIzLCAweDJGQzA0RjFDLCAweDQ2NjlCODkwLCAweDFFOEQyQTdGLAorMHgwNjU4Q0FFNiwgMHg1NDg5RjNBMywgMHg5Q0QzNjJGRSwgMHhCQTUxOTBCMSwKKzB4MDZBNTg4MjAsIDB4N0E5QUY3NTksIDB4REM5NEU2NzIsIDB4RUIyODRCODUsCisweEY4RUZBMDIyLCAweDM4MzdDMzc5LCAweDdDOUU5QTJBLCAweEQyRUQ5NkJDLAorMHg1RDFFNEM3RSwgMHg5N0YyMTY5RiwgMHhGQzNDMzdDMiwgMHhFMDM5RURGMSwKKzB4REJFOTM5MDksIDB4ODFGRUFDNkIsIDB4RkNEMzgzRkMsIDB4MTcwQjkxRkIsCisweDA1QkEzMjQzLCAweDhGQjJBREUxLCAweDUyQUZCOTg0LCAweEU4MjYyRTlBLAorMHgxRTcwNDYzOCwgMHg4OUI4REZEOCwgMHgxOEMwQzY0MSwgMHgyNzYwQzdFNiwKKzB4RDNBRkYzQzksIDB4QzRFMzU0M0IsIDB4MEMwQjc5MTAsIDB4MURFRjc3OTIsCisweDQ4M0Q3MTk0LCAweDlBQUY1ODY0LCAweDA4NjA3OTQ3LCAweDYyNkYwQ0YzLAorMHhDMEY2QTQ4NiwgMHhFQjQ1MjVDRSwgMHhBOEJCQThGOCwgMHhFNDUwREExNCwKKzB4MkRDNEQxMTQsIDB4QkNBNTI3QzksIDB4NjY4MkFBNEQsIDB4Q0JCNDhBNUYsCisweDFCNDc0Qzk5LCAweDdGNUI1MjZDLCAweEVDNDM1QzBDLCAweDlFOEQzRTFBLAorMHg2N0QyRUEyOSwgMHhBM0I3QURDRCwgMHg4MzI4NTkwRSwgMHg3MzQ1NjA3QiwKKzB4QjYwNTc1ODgsIDB4MUE4QjAzNEMsIDB4NUM4Q0E1MzQsIDB4ODExNURDNUYsCisweDE4OUMyQUJFLCAweEYxQjkyOTI3LCAweDc4QTNCNjJGLCAweDRCNjIxRDQ5LAorMHhEQzE3NkE2OCwgMHhDQkQzQzFEQywgMHhEODIzNDhCQiwgMHhFRUYwNUZBNywKKzB4QzBERDNEODMsIDB4QzFGMkE3QkYsIDB4QjIwNzlEMDAsIDB4MTRCNTczMEUsCisweDczMjAzQ0Q3LCAweEE4NjcyNDMzLCAweEExNzFGRkVELCAweDlGMTgxMjAwLAorMHg0RTE2QTVDOCwgMHg1NkQ4QUMzMSwgMHg3MzgwM0Q4NiwgMHhENDY4NUNBNCwKKzB4RThERTlGRTIsIDB4QTM1RDJDRTgsIDB4ODA4Q0YzRTIsIDB4MTk4NzAwQUUsCisweDAwMzQxNjNGLCAweDU3QkM3NkZFLCAweDI3MUFDRjkzLCAweEFBM0FGNkQwLAorMHgzNzAwM0E3RSwgMHg0NTBCNzRGNCwgMHgxNTc0MDFDQiwgMHhCNzlERERBOCwKKzB4RDYwQUI3QTQsIDB4M0E0Qzg3NzksIDB4QjY5OTBGQzgsIDB4QTE2NjhENUEsCisweDA1Qjc5NjVGLCAweDc4MTQzNzZELCAweEZBMEQyRDhBLCAweEQ5N0ExMTQyLAorMHhFODA0REUzRCwgMHg0OTM5MDg5RSwgMHg3OEQ0MENBQywgMHgwMURFRjVFQSwKKzB4M0REMUNBREEsIDB4OTY0NjU5NTYsIDB4NjM1OENGQjYsIDB4QUNFMDJERTUsCisweEI0QzlGNkNFLCAweEU5Qzk1QUZGLCAweDcwRUFEMjhFLCAweDU4ODAzNjkzLAorMHg4OUVGOTk3MiwgMHg1OEYwMjczRiwgMHhEQjE3QTI3NywgMHgwQjA4MkI5OCwKKzB4QUFCMTNBQkQsIDB4RTg2MzgxRUMsIDB4QzE4OTI0RDQsIDB4RTI4RDQzNDgsCisweEMyMTg5NUFCLCAweEUxNzA3M0FELCAweDk0MTc1MzlCLCAweEEwNDNFNUY1LAorMHg4OEZGRDAyNiwgMHhEOTcyRjAxNywgMHhEMEM4QjhEMywgMHhCMzRGM0Q2NywKKzB4QzUyNUU0QjUsIDB4MDE4OUE1QTEsIDB4NTkyMjRBMzUsIDB4QUExOEYyRDUsCisweEZDOUUxNzBDLCAweDE2RDM3OTVBLCAweDM1REIwOUZBLCAweDE2MjREQjFELAorMHg0QTZFMDU5RiwgMHhDNUM4OEE5MywgMHg5MDUxRDM3MywgMHg0QjEyQjA5QywKKzB4NDA4OEFGMzksIDB4NzA1Mzk0RjYsIDB4MzYwRjJCQUMsIDB4OEExRjI0MjAsCisweDY0MUQ0RkE1LCAweEE3OEI3OEY5LCAweEE1QTUzMDJFLCAweDY5MUQyMTA4LAorMHg3Q0ZCNTdGRCwgMHgxODEyRkU2OCwgMHg4QTJCQjVFMCwgMHhGMTgxQ0ExNCwKKzB4MTg0Njg0OEUsIDB4REMwNDRGNjcsIDB4MTdGQ0NBMjgsIDB4MjFEN0M1QUMsCisweDRDNDM0MzJGLCAweEM0NTdFMjZFLCAweEIwQzlBREQyLCAweDc5MUVFMkI0LAorMHg2MjBGMjdCRSwgMHgyMjlFMEIxRSwgMHg3NDZCNEZGQywgMHgwMjAzODczOCwKKzB4MUM3Qjk3MUIsIDB4MDUxOTM0MzAsIDB4ODY0NURCRDcsIDB4NTg2NzhGOTgsCisweDE0MUU5MTJELCAweEQ4OUM1ODdFLCAweDlGRDdCNDNGLCAweDIxODUxRDU2LAorMHg3MjUzMTFBNywgMHgwNjA1QjFCMiwgMHhDMThCRjJCNywgMHhDNkY3OUVBOSwKKzB4QkQ4NEEwMUIsIDB4QzlCN0YyREEsIDB4MDRFNDdFRTgsIDB4MUMxQTE0RjUsCisweEJENUI0RkYxLCAweEUxNUZCQzJFLCAweEM0RDQzRjAxLCAweDVEMzlBRDRBLAorMHhCRDNCRDk4MywgMHhCMjMxNEE0QiwgMHg4REFCQTY3RSwgMHhCNTI2M0I1QSwKKzB4OTkxMkYyNjIsIDB4ODI2NTlDODAsIDB4QzM2MTAxODEsIDB4M0YyMjkwMTQsCisweDI2ODU1MzJGLCAweENFNEVDMjEwLCAweEY0NkFCMDlBLCAweEZBRkE2OUM4LAorMHhEMTI5Mjk0NCwgMHgyRUY4ODBEOSwgMHhEMDNBQUVBQiwgMHgwRTgzQzQzNSwKKzB4ODQyQzQ4MkMsIDB4QTcwOTUxQTEsIDB4MEU0RUEwN0QsIDB4RTAzMzJEMEMsCisweDNFQTI3RTU1LCAweDA0NzIxNDI1LCAweDdDOEI1NkRDLCAweDk2MzkxMzEyLAorMHhGNjAwRDc4QywgMHhDODUwNTE3QywgMHhCM0Y5RjJBRSwgMHg1OUE5OTM1MSwKKzB4OEQ2QUE4MzgsIDB4RjU4NjY3MkUsIDB4RDgxRkU1MjUsIDB4M0NFRjMxREYsCisweEFCREM3MDc5LCAweDZFMUJCOEY2LCAweDZCNDVCODdCLCAweDlGRDJDQUM0LAorMHg2NDhFMzU3QSwgMHg2QzU3RDMwQiwgMHgyMzc2NkI2NCwgMHg4QzhCRDlDMSwKKzB4OUEyOTAwMUEsIDB4MjA2RjQ3RTMsIDB4NUY0MjNENzUsIDB4MjkzQTMyQzQsCisweERDQzY0MzJCLCAweEE0MjgwOTU0LCAweDQ1Nzc5MEI4LCAweDExRTg0Q0VGLAorMHhBQjExRDBCRiwgMHhEMDQyNThFMywgMHhGQjQ0QzBDRSwgMHhFRDgyMzFCMiwKKzB4MDI3N0E2QjIsIDB4RDhFNUM1MTcsIDB4Q0VERjRDOEIsIDB4MTlEOTAxNzAsCisweDIwNTU1NTMyLCAweEZDQjYxMEI5LCAweDg4RDVGNUE5LCAweEQzNURDNzdFLAorMHhFRjVFQTY4NiwgMHhEODY2OTU5QywgMHhGMDg4NkI1NiwgMHgwMDVDRkI5MCwKKzB4NTgyQUQyNTUsIDB4NzM4MTI4OUYsIDB4QzE4Q0VENEQsIDB4NDQ0RjBBNkIsCisweDk5MTdBRTU2LCAweDUwNUE3QkNELCAweENCREM5MDNCLCAweDUxRUYwRjNDLAorMHhDNEU2QUY1QSwgMHhCMTQ4QUQyRiwgMHg2MDlBMTI0QSwgMHhCNURBODlFNCwKKzB4M0E2OEM3RDQsIDB4OTg2OTRGMDIsIDB4RTg1QjE3NjYsIDB4NzU0QkE1RkYsCisweDEyOTZBNThFLCAweDI3NzM2ODQzLCAweDlCNjI4MEJELCAweDI2ODYwMzJELAorMHhCNDI4QUMwNCwgMHhCMDZEQkE1QywgMHg2MjVGRTAzNCwgMHhENEJDQjI1RSwKKzB4QzkxQzVCM0MsIDB4NzNCQjcwRTUsIDB4QTI2QTQ3OUEsIDB4NzMxNzMyMjksCisweDNBQTEyMzVDLCAweEUxNjE3MUQxLCAweDQyRDBENDJGLCAweEZDNjI0NzUyLAorMHhGMUY1RENDMiwgMHgxQjZGMjBBOSwgMHhGRjlENjI2RCwgMHhEQkYwNTJDMCwKKzB4OTBFMzhEMjMsIDB4RkI3MkNDNUUsIDB4OTE4NjUxOUMsIDB4RjIzMzAwOTMsCisweEU1MjUxMzg1LCAweEEwMDk0OTc3LCAweEU4M0ZBMDY2LCAweDJFMzg5Q0UyLAorMHhEM0E2MkU3MiwgMHhBOTQyMkE4QiwgMHhDNjFDRkQ1QiwgMHgxQjNBNTE2QSwKKzB4NTgwODc4MDAsIDB4M0E0NzQ2MkMsIDB4NTU3REREOEIsIDB4OTRGRDIxRDQsCisweEUxQUVBOTQyLCAweDRCMkNDNTMyLCAweEIyMTg1QjM2LCAweERDQTE1MjU5LAorMHgxRDA0NEQ3RCwgMHg3ODEzMTdCOCwgMHg0OUNCMTNFNywgMHhEQUFGRkJDNiwKKzB4MzBBMDU2NDQsIDB4NzdCMDVGMzcsIDB4MDY1QTU2N0MsIDB4OTQ3MjFDNzksCisweDQ3MzE2QzYwLCAweDU4QUFDN0M5LCAweDQxMDA4MUFCLCAweDdENEEzNkZBLAorMHhDREYyMzQ1NSwgMHgxODczRUY4NywgMHgxODY5ODJCNSwgMHg3Qzc4RDlEQSwKKzB4MzU2N0Q5NjYsIDB4MTBGRjVFOEUsIDB4REI4OEU1QjMsIDB4RkYxRDM5QTEsCisweEI4QTM0NUEzLCAweDdBNzI1OEYzLCAweDk3MDZCM0NFLCAweEI1QURDQzI2LAorMHg0NTYxRUY1QiwgMHhCMDAyRkJGNiwgMHhGM0Y0QzZGQSwgMHg1N0VDNzVBRCwKKzB4QkNGMzc5MjQsIDB4QkMwNUIwQUQsIDB4MkFCMTlEQUEsIDB4MEVCRDI1RUEsCisweEYzMzVEMDhDLCAweERGRjc5RTE5LCAweEREODZENDE4LCAweEVDRTExOTUxLAorMHhDMDZGNEQ1MCwgMHhGRDY5OERGOCwgMHhCQTYxOTJFRiwgMHgzNjVBMjhDRSwKKzB4NzRERUMwQjcsIDB4RTk3MUY2N0IsIDB4QkY4OURENDIsIDB4MUU2ODMzOTksCisweDE2NEE3MTU4LCAweEExRTQ4NDc1LCAweEJFMTM5RThFLCAweEJERUJBN0ZFLAorMHg3NEUwM0FFQywgMHg4OEVBOTYxOCwgMHg5QjAwNDhDMiwgMHg2OEMxREQyMCwKKzB4OERDOUZDODUsIDB4MjRCNTVFM0IsIDB4NTFDMzhCREEsIDB4MkVDRDdCMTMsCisweDU0RDY2Qzg5LCAweDY5QTNFQkMxLCAweDRCNEU0RjEzLCAweEFEMzdCN0RGLAorMHgwMzBBMUQ4QiwgMHg4NUExMTREOSwgMHg0MDNCRTQ5NSwgMHhCNUU0MDMzMSwKKzB4MzE2RTczMTAsIDB4QjM2QUE0OTQsIDB4REJGRkNCOUEsIDB4NUMwRTVEQTUsCisweDA5OUJBOUU4LCAweDY2ODI2RTlELCAweDBCQzU4NDlCLCAweDFBMjBDQkFCLAorMHgwNzQ0RkJFNiwgMHgyQ0I1MjA0MCwgMHg4Qjg4NTMzRiwgMHhBOEE0NEJGMSwKKzB4NjJGRUI0QTgsIDB4REIyQUJDNEQsIDB4NDZGMEI2NzYsIDB4Q0JEMDY0NzAsCisweERCNkQ3MUVGLCAweDVEQzM1NTFBLCAweDcxQjMxQTVCLCAweDA0NkQ0QzdGLAorMHhDMDUxQTk5OCwgMHgxRUMxOUZGOSwgMHhBOUUyMUY5RiwgMHg3OTUxRTA4MSwKKzB4NzhCQ0JBNjIsIDB4OTFCNjIzRjIsIDB4OEVGNkE4MUQsIDB4MTAyMzc1NUUsCisweENFNDdGNUFBLCAweDBFRjI3NTI3LCAweEU5RTQ4OEQ1LCAweEQ1M0U0QTI5LAorMHg3OEEyNzZFMSwgMHhCMjEwMDU4NSwgMHgwMTIwOEUzQywgMHhBMzhCQ0FGRiwKKzB4MzYyMjFGQjcsIDB4QjNDOTE5NEUsIDB4NTFCRDc1RDQsIDB4OUM4QzczQUMsCisweDdBQ0E5OTY0LCAweDE3ODkwQzk0LCAweDlGREE1MUY0LCAweEM0RkRGNjg4LAorMHgyQzgyNDRCMiwgMHgwRDgzNEM3NCwgMHgyOTA5NzNEMywgMHg3RjEzNDU1MywKKzB4Mjk2RDJGQzIsIDB4NEUwOEVEMjcsIDB4MUM1MUU1M0QsIDB4M0Q4OTJGNDksCisweDk0NUY3NkNDLCAweDJFNTMxRTYzLCAweDcxRUUzN0UwLCAweDlDNDdGMzQ2LAorMHgyRDhEOTIwQywgMHhDM0U0NjVCQSwgMHgzQTcyRDE0MiwgMHg1QjZBQjgwRCwKKzB4MzY0QzJBRTcsIDB4M0IxODM4OUIsIDB4Qjk0NDI0ODQsIDB4NUQ2ODdCQjUsCisweDk3QzY1QTRGLCAweEM3REJFOEJFLCAweDBGODQwMDYxLCAweDVBNzNFQTg5LAorMHhDQkJERDk1NCwgMHhBRkU5Q0FCRCwgMHgwNkFCREY5NSwgMHhGMTM5MzAyRCwKKzB4MzgwNEZFQTgsIDB4N0NFNjU0MkYsIDB4REU0N0I4RUQsIDB4RDM0QkU1MDksCisweDVFQjlDOUUxLCAweERDNTgyNTM0LCAweEU3N0Q3RkM4LCAweDJCRUZFRDdFLAorMHg0RUEyNkRGRCwgMHg1NDY3MEI4MSwgMHg2NjVDNDUzMSwgMHg1QjdBNzAyMywKKzB4QTA1RDlBMkUsIDB4NzFCRERCMkUsIDB4OUQ1MUQ4QzIsIDB4RDhBNjY1Q0MsCisweEE5Qjg3QTIyLCAweDU4MUQyOEJGLCAweEY5RDQwMzczLCAweEUwNEQ4RjYzLAorMHgxMTdCOTg0MiwgMHg4ODY4QjlCRSwgMHg4Mzk3RkFCOSwgMHhFRjVDRUQ3NSwKKzB4RjcwRjkwRDgsIDB4RDNERkQzQTYsIDB4MTc3OUY1NzYsIDB4MzA1OTUyMEQsCisweEMzOEY0QUE5LCAweDZCN0E2RDBBLCAweDRFNzMxMTJBLCAweDRGRjlEQ0VELAorMHhBRUExMzgzQSwgMHhCQUIwQUE5MywgMHg0MURCQ0JFRCwgMHgyNjY3NzVBNiwKKzB4OEVFMEQ1RDUsIDB4QjUyMkNCOUUsIDB4QzZFNUQwRDMsIDB4ODZFNEM4RkQsCisweEE4OTQ2NDJGLCAweEY2OTgyMUE5LCAweDg4QjQxNzk4LCAweDQ1ODVBMTg4LAorMHg5RDIxMzBGQywgMHhDNUIxOEUwRCwgMHg2QjkyQzlFRSwgMHgzQzkyODlGQiwKKzB4MUYwMkNCQjYsIDB4MzFGQTg2REUsIDB4MUIyMjk1Q0QsIDB4NUI0REExOUMsCisweDMxMzREOEZDLCAweEU1RUFCQzQ0LCAweERGOEM1MDk1LCAweEY2NTcxODgxLAorMHgxRjJGQkQ2MiwgMHhFNTg1RkU2MSwgMHgwMjBDRURGNiwgMHhENzBBQkM4MywKKzB4NUYzNzc0NkEsIDB4NkZEQTNCRjcsIDB4NTQzNEU1MDMsIDB4NDRDRjY5MTUsCisweDU2MUIyMzkzLCAweEVBNEEyMjUxLCAweEE5ODhDMDgwLCAweEU0N0IxNzkxLAorMHhEMzM1Q0ZCRSwgMHhFREE5REVFMiwgMHg0RjcwRkIyMiwgMHg4M0EyQzI5RiwKKzB4RjQ0RkEwMDIsIDB4MDY5RDI1RUMsIDB4NEQ1MDQzRjUsIDB4ODg3NDY0Q0EsCisweDY2MUQxRTlGLCAweDk4Qjg1NkFELCAweDgxQTIzRkIwLCAweDM2OTNCRDQyLAorMHhDRTBBRUIwQiwgMHgxRjZFODMyMiwgMHhDQkRGNTcxQiwgMHg5MzY4ODkwOSwKKzB4RkExNkE3NzQsIDB4MjU4MzQ0MzcsIDB4RUU3N0ZBOTgsIDB4OERDNjhDNjAsCisweDE1NUE4NzYwLCAweDIyQjhGQ0EzLCAweDFCMUJCMDU0LCAweENBM0FGRkNBLAorMHhDOEVBQ0VBNCwgMHhDODZCQUREOSwgMHg0NzM3NzBBQiwgMHg0MUQ2RTM5OCwKKzB4NTY4QjM5N0QsIDB4MDY1QzBCRTUsIDB4NTFEMzhBMEQsIDB4M0JCM0EwRTEsCisweEJDMzg2RENCLCAweDdEQ0JBNkIwLCAweDE5MDA3MjU0LCAweDNGNEZDNzI2LAorMHhGMjdEQUU4NSwgMHhGN0ZEQTcyQSwgMHg2RDBCNUMwNywgMHg2NEEwRUQxMiwKKzB4RTI2RDg4NzgsIDB4MjEwRTRGNkIsIDB4NjVGOTJDMEQsIDB4NEU0RTJDQTYsCisweDVFNDc5RDQ5LCAweDdCMjg3MDUwLCAweEU5QTQ4MzZDLCAweEMzQTExMUEyLAorMHg5QjkwRDZGRCwgMHhBNUYzNjJFMCwgMHhBREM5NTI2QiwgMHg3OUI3MzZFOSwKKzB4NzJBOUE1N0IsIDB4MTgxQjRFNzAsIDB4NTIzNkYzMkEsIDB4NTU2N0UzQzksCisweDIzRUZEMDYzLCAweDg3MTEzMTYzLCAweENERjZENEY0LCAweEY1M0E4NzIyLAorMHhCNzBDRjk0MSwgMHg3NTdGNDBDOCwgMHg2QTY1MkJFNywgMHhENzFEQTVBQSwKKzB4Rjg3RDUxQzIsIDB4QjRBNjhFMTYsIDB4NzYzRDhGRUIsIDB4QjZERTU0MzYsCisweDEyMTg0RENELCAweDM4RDFERTkwLCAweEIzOUU1MjA5LCAweDE2MDA0OTJBLAorMHgwNzNBRThGNSwgMHgwMzY2QUMwRSwgMHgxQUQ1MDE0RiwgMHgzOThFMDg3MywKKzB4RDY1MzkyOEUsIDB4MzBCNUI0REUsIDB4QUM2OEEwNkUsIDB4OERBRUY0RDMsCisweDc2QTg4MEQ4LCAweEYzQjNCQ0M1LCAweDJCNjMxRjU4LCAweDM0MDkxNERCLAorMHhCNDc3MURDQywgMHg3QzlENEE0MywgMHhBRkRCMTEzOCwgMHgwMTRCNUE4MywKKzB4MEQ0NDE4NUQsIDB4MjBDODk1NzYsIDB4OTk0QjQzNjcsIDB4QTg0QkQ3OTIsCisweEIyRTE3Q0IxLCAweDAwQ0U1MjE0LCAweEZCOTNFNTRGLCAweDAzQ0NBN0YxLAorMHg5NTZBODJFNiwgMHgyMjMyOUE3MSwgMHgyQTYzNDM3NCwgMHhGMThCN0FEOSwKKzB4MUYxNjhCQzQsIDB4QzJDQjFFREMsIDB4OEUwQUY2Q0QsIDB4MjExQUYyMkEsCisweEFCNURBMzc0LCAweDYzRjFGMjVFLCAweEVDNThENENDLCAweDQ4QzY1QzQ2LAorMHg1QTdGNzU3NCwgMHg3QkE2MDA0NywgMHgyNzlFRjI5OSwgMHhFMEI3N0Y0OCwKKzB4NjQ3QTAzQzMsIDB4QUU3QzREOEYsIDB4RjY1MTQ5RDAsIDB4QUM5RUYyMjgsCisweENEOTBCMUNELCAweENFRURBNTRDLCAweEQ4RkQwQTZBLCAweDhEN0MyMjkxLAorMHhCMzhFRjZDMSwgMHg3RjM4RTY3NiwgMHhEQUREMEE4RiwgMHgxMTI1NzEzQywKKzB4QUE3OEEyOTksIDB4NTQwMzNGMjAsIDB4MTk5Qzc2QzUsIDB4Q0FGODJBMTcsCisweDE2RjJFRThCLCAweDIwMDcxRDBGLCAweDJDQTAwMEY4LCAweDAxNzhBMjRCLAorMHgwMDI5RUU0NiwgMHhBOUQ4QzczOCwgMHgxMjNEMkJCRCwgMHhFRjdDQUM1MiwKKzB4QkQyNDE4NjksIDB4NDM1RjhGRjcsIDB4QjU3M0ExOTAsIDB4NDAyQkZCMkYsCisweEZEQTMwOTdDLCAweEYzNzY1ODg5LCAweDY4RTJDN0Q1LCAweDRDMjZGODU4LAorMHhENjgxNEQxRiwgMHg2QjA0M0M3QiwgMHgxNzNEQjA5MSwgMHg5NTEyNkM3QywKKzB4MEZFOEUxQkUsIDB4RkRFQjIzM0MsIDB4Qjk3OUIwQ0IsIDB4MDBFMDA2NTksCisweDE5OTUyRTUyLCAweEEwOTc2RjdFLCAweDAyRkI0NjJDLCAweDc5ODgxNUM4LAorMHhBMjUwNEVGRSwgMHgwRjQ4MTFBRCwgMHhCQThGMTIyRSwgMHg1RUU1ODY0RiwKKzB4RDM5QjY3OTksIDB4NTMxOUY2QTMsIDB4RjZBNjY2ODUsIDB4OTg4RDEwNkYsCisweDdBQkE1MjIwLCAweDAzMjAzODRCLCAweDRERTQ4Qzc5LCAweEY1Q0IzNkU2LAorMHgyQjMzMjcwRiwgMHhGRjRFNjk2NSwgMHhENEQ4NDNENSwgMHg3RUVFODYxQywKKzB4QTk2QUU1RUUsIDB4MzEwRTUyMTUsIDB4NkQyMDA2OEUsIDB4QjE0OUFFOEIsCisweDA5OTdEOUVGLCAweDUwNDNGRkZBLCAweDA1MTZFMkI2LCAweDNGQ0NEQTMyLAorMHg4RTYwNEEwNCwgMHgyMzAxMjc3OCwgMHg5NDQ0QTQ3NCwgMHhCN0Y1REMyNCwKKzB4M0E1OEU2RkIsIDB4MTdCNzU5RkIsIDB4RjI5QzFFRTcsIDB4ODg5M0QyRDEsCisweEM2Q0QyMzVCLCAweEFBQjBDQkNFLCAweDJEODQ0NzRDLCAweDhBMEJFMDI3LAorMHhGREI4N0ZCNSwgMHhFNkI1MDdCRCwgMHgxOUI0MTkyNywgMHg3ODNGRjREQSwKKzB4NDg1QTFENUQsIDB4OEVEMjg1QzIsIDB4MjVBRkM0QzUsIDB4QkYwRDY2MkIsCisweEM0MjM4NTMyLCAweDQzMzlGQ0NGLCAweDE0QTc4NEI2LCAweDcxNjY1ODE5LAorMHhFRDc2RTQ3MywgMHg1RjFCQUU5RSwgMHhEMEFFQzE3QiwgMHg0Q0U3ODgxNCwKKzB4RDM2MDlGNjEsIDB4RDRFNDlFQjAsIDB4RTRFM0VGREEsIDB4OUI3Q0FEMUQsCisweEVGMDFBQkI3LCAweEQxMzdCRUU5LCAweEVFODdBODFELCAweEQ0QjIwNEZGLAorMHgwMEIyNTczNywgMHgyNzcwRkJEMSwgMHgxNzRBRkY3RiwgMHgwQTc3QTIxQywKKzB4RjFCMzcwRTcsIDB4OUMwOTNDQjAsIDB4MDgwQzFGRkEsIDB4ODNDRTkyRDksCisweDE3MDc0NzBDLCAweDMzMDM0NzlGLCAweDI1RjFCNkFGLCAweEY0MEVFQjdGLAorMHhCOThBMTY3NywgMHhBNTRBMUJBMiwgMHg0M0I0MTQ0QSwgMHgyRjA5MkEzNSwKKzB4MzMyODZBNzcsIDB4QTBBQjlDOTMsIDB4NEY4RDcwREMsIDB4M0E0N0JGNkYsCisweEI2MjA5QUI1LCAweEE0Qzk0NTU3LCAweDVFNzU3MDU1LCAweDcwNkVBRDlGLAorMHg0NjdCQzAyQSwgMHg2NDcyQTg1NywgMHg0MjA1NUM1NywgMHg2NkYyQkE2MCwKKzB4MzNDMDUzNkYsIDB4MzI0MEJGQkQsIDB4M0RENzRFNkIsIDB4MUY1OEE1NTIsCisweDgyMkU5NTc3LCAweEY0OUJGRTc3LCAweDU0OTBEQzZELCAweDFEMzJCQkEwLAorMHgxQzMwQjA3MiwgMHg3OEE0QTVDMCwgMHgxRUU4OEE1NywgMHg5N0NBQzNDOCwKKzB4OTkxMjg2MUYsIDB4QzkxNkJCQUYsIDB4RkMzQTdGMEUsIDB4Q0E1RTFGM0EsCisweDYzMEYwOUNELCAweEY2QzhDMjEwLCAweEYwQTEyQTcyLCAweEYzMTQ4NjE5LAorMHhERjE2NzJFMSwgMHhGQ0U1QzM5MCwgMHgyOUNBRTU1NCwgMHhFOTg0QTQ1QywKKzB4OEExRjBBM0EsIDB4NkEwMkM3MDcsIDB4OENGQjNFRDYsIDB4QzBBNzQxQkQsCisweDdBODcxRkU1LCAweDkxMDIxQTY5LCAweDUwNUZCMDVBLCAweDhGODUyMjdCLAorMHhDMzAwQUNGMSwgMHgwQTFCMjAxQiwgMHgyMjQ2MTRCMiwgMHg1NEEyMzU3NiwKKzB4NTM2MEE1QkEsIDB4RENEMjNBMzEsIDB4Rjk4REY2MzgsIDB4NzlGRjc5RDcsCisweEVBQzhFQUMzLCAweDREMjJDNjVELCAweERGRkJGMUQ5LCAweDU1RkQ4ODQ4LAorMHg0QkZEMjM0NywgMHhFMkEwODI4NywgMHhFNkE0ODgyNCwgMHg4MDYyNUVBOSwKKzB4NzFBQjNGN0UsIDB4OTlCODRERTUsIDB4NjUxMkFEQkUsIDB4RkJGMjRDNDcsCisweDNFRUYyNTY0LCAweDIzREY5RjFCLCAweDI0QkU1MTk5LCAweERFREQ3MkQ1LAorMHhBMkZFMDYzQiwgMHg0RkU1MjBCMSwgMHg5RTRFN0JCRSwgMHhENjE1QkRCRSwKKzB4QzE0RTgxODQsIDB4NDBGODZGQjEsIDB4RDQwM0E2NUEsIDB4QzVBRjYzODYsCisweDQxMkY4NDM0LCAweDZENjAxMkIwLCAweDRFQzU3MTA3LCAweDNGNzZBRjE5LAorMHg1NEEzMDVCRCwgMHhFQTlDNEVCMiwgMHg1ODRFMDE3NiwgMHgyMDc1OTgwNSwKKzB4MUExNkM4NEEsIDB4NTBCQjEwREIsIDB4RTYxMEFGNDUsIDB4OThDRjFFQTAsCisweDNGOEM3NzU2LCAweEY5MDU2QkUwLCAweEJBQTY2QjdELCAweEY3MDc2RENGLAorMHg2N0YxOTk0RCwgMHg5MkJGRUI2MiwgMHg4NkZCREUxNywgMHgzODlEQjMxMSwKKzB4MkExNzFGNUEsIDB4RTE0ODk4QjEsIDB4NEQxMTcyM0YsIDB4Mjk4ODkwNjIsCisweENCRjNERDc5LCAweDJCNzQ2OEZDLCAweDRGQjkzNzcwLCAweEM1RkNFRkU4LAorMHg4RkVFNjY3OCwgMHg5RjRBQkE5QywgMHg2QTZCMjNFMSwgMHhGRUE3MDc3RiwKKzB4QzgzNUY3MzQsIDB4Q0E2NzgwN0MsIDB4MUJGQkVCNDksIDB4QjhCMUU4NDIsCisweDZBODUwNjIzLCAweDAwMUMxRThELCAweDc4MkFDMDFFLCAweEEyOEE3MkQ4LAorMHg2Q0Q2NkZDMSwgMHg3N0VGNkYxMywgMHhGRjQwRDdDRiwgMHg0QTE2M0RGQiwKKzB4REIyMUFBODksIDB4MjlEMDNBOUUsIDB4M0E0RDFENTcsIDB4N0E4OUNEQzksCisweEM1NjIzRTEwLCAweDhBNDQ0Nzk5LCAweDFGNjIwREY0LCAweEZGODc2NzU4LAorMHhDOURFRUYyRSwgMHg3Rjg2OTExRSwgMHhFMzE5NjA5MywgMHhBMDBFQjQyMiwKKzB4Q0RCMTc0M0YsIDB4NEFBRDE5ODgsIDB4NzAxNjc3MDAsIDB4NzA1OTVDNUYsCisweDhFNjQ4MDEzLCAweDQwMUQ4NzcwLCAweEM3NjJGMEU3LCAweERCNzc2OTI2LAorMHgyQkRDNTVCMywgMHg4RjRBRDJDMSwgMHgxQTJFRUI1MCwgMHhCRDRCRjJBNCwKKzB4QTQzRkZFOTAsIDB4NzUyOTM1RTcsIDB4QjAyQzc4MDEsIDB4REQ0Q0QzREIsCisweDM4MTVDMzk0LCAweEFGNDI3Njk1LCAweDc0NTVBOEY5LCAweEM0NDRDN0VDLAorMHg5QkM5QjJDNSwgMHgwODQyM0JBNywgMHg1RDkxQUREOCwgMHg1OUQ4NjZEQiwKKzB4MEFEMzIyNTgsIDB4N0JDMzk3RjYsIDB4MEVGN0RCNTksIDB4QzEwMzQzMjAsCisweDc5MDczNDA2LCAweDk5MUExMkI5LCAweDlENjc3NkEwLCAweDYzNDhBNUVCLAorMHhCRDk4Q0RDNCwgMHg4MUE2QzVDNSwgMHg3NkEzQUJBNiwgMHhGQTlDREY3NywKKzB4OTc3NzJCNTksIDB4RDk4N0U0MkIsIDB4QTRCODkzRDQsIDB4NjFGNzhFMzgsCisweDgyNTY3NjkxLCAweENCOTFDRDU4LCAweEVFRkE2OUFFLCAweEY3RDUxMTc4LAorMHhBNDM2QzU3OCwgMHg5OUU4NkUwOCwgMHhBOEMzQjE2QiwgMHhENjA5MDU0RiwKKzB4MUUwQURDRTgsIDB4NURGNkVGMjAsIDB4RUIzQ0M0NUIsIDB4OUZBRUEyNEYsCisweDk3RjU3RjE5LCAweDY2RTI3MTNGLCAweDQyQTQyM0MzLCAweDJBMjFCMTdDLAorMHg2QTRDNkI0MCwgMHhGQTBGNEYyQiwgMHhEMUYzRjY0QSwgMHhEMEFBRkE1MCwKKzB4NzY3RDNBQzIsIDB4ODM3RTYyNkQsIDB4M0IyMTI3OUMsIDB4Q0FFMTg4NTUsCisweEZBOENBMzg1LCAweEE5MUJERTQ1LCAweDFBOTUzMzI3LCAweDczMzk0OENDLAorMHgxNThCOENEMiwgMHg5MDRBQzQzRCwgMHhBNkJDOEY4MiwgMHg1NUYwMjdEQSwKKzB4OTVCNkJCMzIsIDB4OTI2NUZGODAsIDB4OEVFRjBEMjQsIDB4MjhGNjc5NkUsCisweDFENzM2NzAwLCAweEI2MjFENEQ2LCAweEFCMkYxQTRBLCAweEVDRDdEQjgzLAorMHgzNUNBRDQxOSwgMHg2MDYwNDkxNywgMHg1REU1MTMzNSwgMHhBM0Q3RTEyMiwKKzB4Njg1RDA0RDQsIDB4NDk0NzM5RDQsIDB4MDA2MDcyMkMsIDB4NTkxNDk3MTgsCisweDAzQzlGMTQ0LCAweDQzMzI4ODE4LCAweEJCMUFFMTg5LCAweENBN0I5MjUwLAorMHhDODM1NjY2RCwgMHg4Mzk1MDIyMCwgMHhENzc0NDA1RiwgMHhGNkY0RkNDRSwKKzB4MEUzODc5NEQsIDB4QUYxODRBN0UsIDB4RUY2NkUxNUIsIDB4QTBDMkE3NEYsCisweDg3NjExMkQ1LCAweDdENjhDOUNGLCAweDg5MDIwMTFDLCAweDZBQjBFMTI4LAorMHgyQTUxNTUyMCwgMHhBOTlEMURBMCwgMHg5RUFDRUI0RCwgMHhCNjY5QUE4RiwKKzB4NkY5NkRDRTIsIDB4Q0ZFQjVDREYsIDB4NDZFQjM2QkQsIDB4RURERjgzMTcsCisweDRGQTMwQzNFLCAweDk1NDFBOEExLCAweEE1Rjc1NTMzLCAweEVGRTFGRUY2LAorMHg3RjIxQjQ4MSwgMHhEQTExRDVFQSwgMHg2NDY0MjA2OSwgMHgwODNEMjEzNywKKzB4REY1MDg3MjYsIDB4OEY2Q0NDNEIsIDB4QzU0MTJEMEEsIDB4NkE5RjZCRUEsCisweDNFM0NDNTRGLCAweDA3OEJCQjFFLCAweEE2MDQ3NDY4LCAweEYxRkEzOUMyLAorMHgyNjE0MzQzNSwgMHg5MDEzMkVCMywgMHg0MjE2NTgwQywgMHhGNjc3M0I4QywKKzB4QTZCMTg4QkYsIDB4RTNCNDk1MjMsIDB4ODlFNDU2M0YsIDB4RDBCMTY1MzgsCisweDJEOTA3OUZELCAweDY5QUJERTM2LCAweDY2OUFDNUVCLCAweEQwNjE4REQ5LAorMHg1MDgwQkZFRiwgMHhBREMwNTZENiwgMHg3MjQwMkM5QywgMHgwQUU3OUUwNywKKzB4OEQ2REY0OEUsIDB4MDUwMjgzN0UsIDB4NzlCQTE3QUQsIDB4RTQ4NzFDODksCisweEM0NTU0Q0Q1LCAweDIzRkNCMkE0LCAweDY0NkZBOTk5LCAweDIxMkE5REI4LAorMHhCRDIzREYwQSwgMHg4OTBCNUZFNiwgMHhCNUQwMzI5MiwgMHg5RkEzRkQ1OSwKKzB4RDYxMkY4QjEsIDB4NjExMzY1RkIsIDB4N0U3QzlGQUIsIDB4MDI0MTk0RDIsCisweDQ2QzJDNjE3LCAweEFFQjBGQUQ5LCAweEFFNUQzQTdFLCAweEVBOEIwQUJCLAorMHg3NjA3MzBBNCwgMHg1MDQ0M0U3NiwgMHhFQ0E2NDM0MSwgMHg1MzhFNTI1NiwKKzB4OEE4NTA1RjUsIDB4RTBFNERDMjksIDB4MTA1REM1NjQsIDB4QzczRDkzRDksCisweEUzRjI3QzkwLCAweDhDQzAxRkM4LCAweDQwMEQwRjc2LCAweERDRDAxMTMwLAorMHgxRTM0MTZENCwgMHg0QzYxMkUwMywgMHgwQkZFN0E1QywgMHhGREIxNTMzNCwKKzB4NTMyNkE3N0YsIDB4OTk1NDlCREEsIDB4RERFOTBCQUIsIDB4OTIwQkQ4NzIsCisweEM0QjRGNURGLCAweDdCMzlCQUMyLCAweDc3N0M2Njk0LCAweEI0OTcxMTAzLAorMHg5RTc4MDZBMSwgMHhEMzE0MUYyRCwgMHgyQjQwQkFEMCwgMHg3NEFGMjQ4RiwKKzB4RDFBRUVENDMsIDB4MkY0NTM3MzYsIDB4MTg4MDEwNEUsIDB4RjlDRDUwMkYsCisweDc2OTFGRTU5LCAweDM5QzNGRUM3LCAweDcyRUE3QkYyLCAweDBDOTRCQUI1LAorMHgzNUQ2RjUwOSwgMHhBRTg2QUM5NiwgMHgwNjI0QzE4MSwgMHhBNjlERjY5OSwKKzB4NTk5MUZDRTMsIDB4QUIyMEQ0RjEsIDB4RjMwRjFCQzksIDB4QjA5NENGNjIsCisweEEzQjVBNzMyLCAweDNCQzhDMzJGLCAweEU3NzEwMzcwLCAweDQyOUE4RDk2LAorMHhEODkxM0E0MiwgMHhDRkJEMEU0RiwgMHg3MTBCNzA3OCwgMHhDNjUwMUU5MywKKzB4MjQxMjI0QUYsIDB4OTc4RDIzMjAsIDB4OEVGMTA2NEIsIDB4MjczRkFFMDcsCisweDMxNkVDMDJDLCAweEIzQzE2QzBCLCAweDgyNDlDMjQ1LCAweDIxQUQxMUNCLAorMHg2MjY1RkU1NywgMHhBOUYxRDVGQywgMHgwQjUyRjFDRCwgMHgwMzgxRDk4MywKKzB4MjkzMUQ2QjEsIDB4RDEyNkNEOTQsIDB4NjlEOTUxOTcsIDB4N0NGQjZBRDAsCisweDQ2RTZENTBELCAweEU2MEJDQkQyLCAweDcyRkJCNDM2LCAweEM5NzFBNENBLAorMHhBNTgwQjlCOSwgMHhCQzgyMzUxNCwgMHg1RDE1QTg0MCwgMHg4N0E5MTYyMiwKKzB4NjM0OTBEMTMsIDB4Mjc3MTg5QTgsIDB4MjJDQTJFREMsIDB4MUM1NjQ1NkQsCisweDFCNUVCODM2LCAweEQ4QkJGMkVCLCAweDIwRjU2REZCLCAweDk5MzIxRTRCLAorMHg5MjM4Qjc4MywgMHhFNUU1RDA4NSwgMHhDODFEQUExMSwgMHhFRjhERDAzMiwKKzB4Q0VDMjg2NDUsIDB4RkM0MEFBQTUsIDB4QkZBNUZDNjgsIDB4MUMyQ0Y3QzcsCisweEMwREZEMTk0LCAweDVBQjczMERBLCAweEUzRkI1NkE5LCAweEEwQUQwMEU5LAorMHhCN0JBMkUyRSwgMHg1NzlDODcyMiwgMHgwNEFBMDdGRCwgMHhGNTVDNkM1QywKKzB4RTU2Q0Q2REQsIDB4QTdEQTUxMDAsIDB4MkE2QkExRTUsIDB4OUI3RTUxMDQsCisweDgxNDEwNDIwLCAweERDNjEzMEE4LCAweDNFQzg5MzVCLCAweENDMkVDNzgyLAorMHgxNDIzNDRFRiwgMHhGMDE2RTBDQSwgMHhBM0FDRkE4RSwgMHgwMTlBNzAwOSwKKzB4QTBEQUVDNUQsIDB4RkE1MDM1NjUsIDB4QzkwNzc5NEUsIDB4NzdBQTRFNjksCisweEI0NUI3RTU0LCAweDkyOUEwNTZBLCAweDQ2QUE0QUUxLCAweDU1RTU2RURGLAorMHhGREQ5RDcyNiwgMHgzNTc0NEQ1QywgMHhENjg1NDcwMCwgMHg5QTZFMUVFRSwKKzB4MEIwMEY2RkIsIDB4NkJFNjVCRkIsIDB4OUNGOThERTAsIDB4RDgwQUNFNjYsCisweDFFNTMwMEU0LCAweDc0NTMzOERELCAweDRDQjkyNURFLCAweEIzNjlCMEQ0LAorMHg3QTUzQTYwNiwgMHhEMkI5NkU1NCwgMHg4OEY5NkIzMCwgMHhCNzJDM0UxOSwKKzB4QzJBNDExNzcsIDB4NjIwNkY4NzksIDB4QzFGNkNENzgsIDB4ODc5REE3NEYsCisweDc2M0Y5NDE3LCAweEQxMDlCNzc5LCAweDZBNThCMzRDLCAweERDRDdDMjFBLAorMHgxQjBBMDE1NCwgMHg0NUVFM0E5QywgMHg2MkM2MDE2MSwgMHg3OUU0NzAyMCwKKzB4NDIyNTBBMzksIDB4OUUyQzJDNTksIDB4Q0U0RjYyMDYsIDB4QzI5NzAzODYsCisweDk4M0NDMkMzLCAweDBEQUYwQTg1LCAweDM4ODYyNkRBLCAweDA2QTU2RDI3LAorMHg5MjIzMjAzQSwgMHg5NkUwMTQ4QywgMHgyMkYwRDA1MiwgMHhENUYxQUE4OCwKKzB4Mzk0QkM4QjksIDB4MDNDRjU4RkEsIDB4QzBCMTA3M0MsIDB4QzE2QjM1QzcsCisweDdCN0NGOUY4LCAweDJFM0EyNEE1LCAweEExOTA4OUM5LCAweDQyMjNGQUU5LAorMHg3NzUxRDk3NywgMHg4MDJFNzA2MiwgMHg2RDM2NTFFRiwgMHgzOUU5QjUyRSwKKzB4OTQ2RDA3RjgsIDB4OEUyRUFFQjcsIDB4RjkyNzlBNjUsIDB4MTRERUU5MTEsCisweDhCOTJBMTQ5LCAweDk2MTE3NTZFLCAweDA2N0REMjJELCAweDU5OTA3OTY3LAorMHhCMzQxN0UzQywgMHgzQjcyQUI3QSwgMHg4MjVEODdDNywgMHhDRTVGQTg1MiwKKzB4NUQ4OEM1RjgsIDB4RTc5MkJGNjYsIDB4MjhEQjNBNEEsIDB4MTE4Q0EzQTIsCisweENDODYyODRFLCAweEEwQUM0QUU4LCAweDMzMzk0QjcwLCAweDk3NEY5NkMyLAorMHg4NkFERDNCNSwgMHhDODcyOTVCOSwgMHgxNDQ3RDI2RiwgMHhDOUVDQUU4MCwKKzB4MTBDQTAxRDcsIDB4RTA0RUNDNjgsIDB4QUU1NjU5N0UsIDB4QUFBMTI0OEMsCisweDgxQzM1NDYwLCAweDAwODdDQTkzLCAweDk0M0FBQkEyLCAweDBBRkNCRkFBLAorMHhFQTc3RDVBQiwgMHgwMjBEMzZENiwgMHhGMUNDQkJCNiwgMHg4REYxNDI2RiwKKzB4QUU3MjZEOTYsIDB4QTZFNEM5MTUsIDB4NThGMTVGOTEsIDB4NUI2OTZENkYsCisweDAwMDQyQjMwLCAweEM2QUM5MEMzLCAweEJEOEUwMTg3LCAweEU3M0VEMkUyLAorMHhDRUU2NENGNiwgMHg0OEI1NjQzNiwgMHhBMzM5OTRDQSwgMHhCM0UzQjdBQiwKKzB4MDYwRDVFMTQsIDB4QzFCMTc2QzYsIDB4NEE3NkMzOTEsIDB4RDdDOERCMUQsCisweDMzM0U0OTk4LCAweEMyMEJBQzRGLCAweDUyM0JFM0UwLCAweDIzN0U4N0JDLAorMHhFNkNEQkVDMCwgMHhDNTA2RjE5QywgMHgyNjJDMDAzOSwgMHg3Rjg1QTRBQywKKzB4NDYxNjA2OTMsIDB4MkVBMUJDMzYsIDB4NENBQzBERjIsIDB4MDA2NkI4M0YsCisweEJDQkM3NzhELCAweDdGNEFCNTA3LCAweDk5Q0FEQjJGLCAweEM5NTUyMEQwLAorMHhDNUNCRjA2NywgMHg5MDNFQ0Q2OCwgMHhGNUQ3QjBGQywgMHgwODE5OEM4RiwKKzB4QTE3ODc5RUMsIDB4MThDMjcyM0QsIDB4NUE0RDZEMzcsIDB4MDgwMTk4QjYsCisweDM1MjUxODZDLCAweEVGOEJFMTQ0LCAweDQ0QjA1ODUxLCAweDI4QjUwMjVBLAorMHgwRkRGMDg1RCwgMHhERUIxRjI0OSwgMHhBN0MwMEY0MiwgMHg3NjE0QTczNSwKKzB4M0JFQkY0NjcsIDB4Nzg3MUQzMDUsIDB4RDRGNjM4MDksIDB4OUQwNDQwNzksCisweEU1ODVEM0Q2LCAweEE4OTk1MkYzLCAweEY0MkMyQjhFLCAweDA0MTc5REE0LAorMHgwMEE2Q0U4NywgMHg5NkNBOTJCOCwgMHg5REYyQjE1NiwgMHgzRUNGMThCQywKKzB4REUyNTA5Q0YsIDB4NUNEODVGQ0EsIDB4RjhBN0NFRUYsIDB4Q0I3REMyNUUsCisweEYyODQ3NDc0LCAweDM1QjUwMUQxLCAweDEzN0JCQjNFLCAweDQ1MUUxQkI5LAorMHhEMzYwRDgxMSwgMHg3OTJCMzQ2NCwgMHg0QkY4OUE4MSwgMHhBN0U5QzQ1MCwKKzB4NjI4QkNCMEMsIDB4MkFGNzAzN0QsIDB4QTQ1RjYyOEUsIDB4RjBFQzg3NUQsCisweDlDRTM2NzdELCAweDJDRDBFQTU5LCAweEE1MEEwMjE3LCAweDhCQTQ1REQ3LAorMHgxNzM1QUNGMSwgMHg1ODA0QzREOSwgMHhFNjE5QjM1MiwgMHg5NDhGNDRBOCwKKzB4QTlCRjVDN0YsIDB4NjE0RDRGNkMsIDB4NkQ5RkNBNzksIDB4Mjk3MTdCMEMsCisweDUwQkYyRDVDLCAweEQ1ODQ3QjUyLCAweDBENEZBQUE1LCAweDFBQUJDQTVELAorMHg3NzkzOTlFMCwgMHg1OEE5MENENiwgMHgzN0VDMjYxNSwgMHg2MUI2OEMwNywKKzB4QzQ5RjRBRUUsIDB4RkFDNEQ4OTcsIDB4OUM2OENDNkQsIDB4QkIzMzUyRjYsCisweEY5MzM0MzZELCAweEQzMTAwNzhFLCAweDJGQkZBMTdBLCAweDNEODM5QzRDLAorMHgxODZFNjlFRiwgMHhDQkU3Q0M2QSwgMHg3NDM0MjMxQSwgMHg4MEY4MTMwQiwKKzB4NThDRDdFQTIsIDB4MkU0NkQ3MTQsIDB4MzY3Mjg2RTIsIDB4QTZFMjA0NEQsCisweEMyQUJDNTBBLCAweDZGRURDOUM0LCAweEUyRjI2RjAzLCAweDNCMDMwRDUyLAorMHgzNjc0RDhFNywgMHg5MDk2REY3OCwgMHg5MDkwMjg5MiwgMHg0NEEzMjE5MCwKKzB4RDA4RDI2NDksIDB4RUZFMEVEMEEsIDB4Q0UxQkY0RTksIDB4NjJDMTk3NTMsCisweEZCRjNEMUE4LCAweEQ0QUE1MzkwLCAweDRCMzJFNzdGLCAweDk4OTRGMDVFLAorMHg0MUI5REJCRSwgMHhFOUIwOTU2MSwgMHg0NkM4ODNBMCwgMHhBREQ1RDYwRiwKKzB4NjlDRTVCQkUsIDB4RkQyOUNDRjEsIDB4MkYyMDkzNzEsIDB4NEM2NzE2RTksCisweDMxRTlBMDlGLCAweDA0MDg5Nzk1LCAweEI5RUY5MDI1LCAweDk3QzYyNjdELAorMHg2MzgyMzE1MCwgMHgzQUIzNDZCQSwgMHhFRDNFMDU3OSwgMHg4NUZDNzA2MiwKKzB4MzdCMzU3NjEsIDB4NEEzMkI2Q0QsIDB4QzM4RUI0NzksIDB4MjAzNjQyQ0MsCisweDU2OEZDQUQ3LCAweDY3RDkyQjVELCAweEU1MUI4QzNFLCAweDAyMTA0MDc4LAorMHgwMjZCQzYwNywgMHg1QTA2Q0RBNywgMHhFMjc0MzVEMCwgMHhDN0MyMENFNywKKzB4RkVBNzQwMjIsIDB4NzczMTAwNzYsIDB4MzVDNkY5NTMsIDB4RTFCMTk5QzUsCisweDI2MkYxMzlCLCAweEZEMkZFMkM3LCAweDNFRUUwMkVCLCAweDkxNUE4NzNGLAorMHgyREU0QUI4RSwgMHgyNDIxREMxNSwgMHhEMUREMEQ5RSwgMHhERTAyQjVBRCwKKzB4MTUxQzc2Q0YsIDB4Nzk4QjkwQjcsIDB4ODJFRERGNEMsIDB4Nzk1RTE4Q0YsCisweEYwOUNFQzVBLCAweDA3MEFERjhGLCAweENEQ0Y1MjMyLCAweEQ0OThENDNDLAorMHhCNEZDMjY2MiwgMHgyNTY3OEU1NCwgMHg1RDIwMDQ4MiwgMHhDMzFGMjFDOSwKKzB4MzVFNUFGMjksIDB4OENDMEU2MDMsIDB4OTk1MzUxQUQsIDB4RDhFQjU0RjYsCisweDU2NEUzNUQ5LCAweDBDMTNFMzIxLCAweDM0Q0ZBMzNELCAweDMzRDFFNUY5LAorMHgyRUFDOTc0OCwgMHhGRkI5NTBENiwgMHgyMDMyMjA2RiwgMHg0Rjg3MUFFMywKKzB4QkQ0NjRDNjEsIDB4MDYzNTZFQTAsIDB4QTE1QTI5MEQsIDB4QTc4NDU2RDAsCisweEQyRjRFRTg4LCAweDREODM1OTA4LCAweDE1REM4N0IzLCAweDc5RURCNkMzLAorMHhBRUFGMEY5RSwgMHg1QzNFN0VGOSwgMHg2MzlBMDk5RSwgMHhEMzc1RDhEQSwKKzB4QjcxODUxMEIsIDB4MDkwREY5NjUsIDB4OUM4QTM2MkUsIDB4MjVBRDEwQkIsCisweEY5QTQyQkU5LCAweDhBREUzREYwLCAweDU1Mjc0MjRFLCAweDMwMUYwRDBGLAorMHgyRjY5MUM5QSwgMHg1MzRGRTFGQywgMHg3RDQwNjAxNiwgMHhGOTg4MjBBMiwKKzB4NEQyMDQ4NzEsIDB4RUQxNDUxNzMsIDB4RDY3RUNFOUEsIDB4MzVGOUY5OTAsCisweDhFRDRENzg3LCAweDFGM0Y0NkUxLCAweDVBNjhGMTcxLCAweDlBOUQyOEIwLAorMHhFNzI2QkQ1QywgMHg4MTE5MjI4RCwgMHgwQURCQTREMiwgMHhFQTI0MzIwNCwKKzB4RTUyM0MwRDYsIDB4MjYxRTM2NjQsIDB4QjJEMTIxMUMsIDB4QjREOTI5M0EsCisweDlDODlEOTI0LCAweDE1QTZBM0E5LCAweDBEOEM2QzY2LCAweEVDMDRBRDM2LAorMHgwQ0RGMEY5OCwgMHg5MjYyQzdERiwgMHg4RUUwRTA5QiwgMHg2QjkyOUVFOSwKKzB4RENDNzEzQkMsIDB4NzVGRDM0RkYsIDB4Mjc4NEU2OTQsIDB4MjNDMjMwNDQsCisweEI3QjA0RjA5LCAweEYxMEI3NTNFLCAweDJFQzc3NERBLCAweDQ3MEJFNzJFLAorMHgwNTQ1MTBFOSwgMHg5QzdEREYxMCwgMHgxNDY2QzI3NywgMHg5RjUyRjQ5MywKKzB4N0YyOTg2MDgsIDB4RjFCQTEwRDMsIDB4ODg0N0EzMTksIDB4RUU4QTYzQ0EsCisweDhFNjRCMzRFLCAweEVCQjY2OTMzLCAweDU3NUFEQjI0LCAweDA0MUJGRDc2LAorMHg3MjdFRDM2NCwgMHgwMEY0QTAwOCwgMHg4RjVFREE5MiwgMHgyMTQ3NzYzNywKKzB4MEIzNjA2MTcsIDB4NTZEQzg5NzgsIDB4MjdGODg5NDQsIDB4NjlCNzk5RUYsCisweEVBMUU5NDNCLCAweDZGREQ2MEIwLCAweENFMkFEODlGLCAweEI5OENDRjQzLAorMHgyQTM3OTZCRiwgMHg0REQwMjUzNSwgMHhDNkI1MjRFQSwgMHg2QjE3MzM0MSwKKzB4RENFMEE0NTcsIDB4OTE3NzA2NDYsIDB4NTdBOEQxMzgsIDB4RkMyMTgzMzEsCisweERDNkI3MTJELCAweDE0QzBCM0I5LCAweDMwQ0EwOUFELCAweDc1OUVCOTQyLAorMHhCQzk2MzRBQiwgMHg4RjkyQTdFNSwgMHhGN0Y4NUI1MywgMHg2QzgzMUIzQiwKKzB4NTZBNzVCMTgsIDB4NDNEQjlGMUMsIDB4RjgxRkMyMTIsIDB4QjhFQjkwMjYsCisweDc4QTc0QjUxLCAweDg3MDY1NUUzLCAweEExN0I1MzZELCAweEJERTg2NkNGLAorMHhGQzYwOUYxMSwgMHhGMzRBNzAxNiwgMHg3QzRGRDRERCwgMHgyMzYzMTJGNiwKKzB4QjUwNTIwQTgsIDB4NEJFRUEyQzMsIDB4MkI2OTBCQTMsIDB4MTg3MDE2NjcsCisweEJENzkxRkE5LCAweDIzNkQzNkNGLCAweDQ5RTU3NkNDLCAweDMxNkE3N0UxLAorMHg5M0U5QjBCRiwgMHg1MjcxNTYwMywgMHg4M0I5QUFGMiwgMHgwRjhGMkE4MCwKKzB4QTg3Rjc2NEEsIDB4RDIwNzlCRUIsIDB4NDhBMjRBQjYsIDB4QUMzNzA5NTAsCisweDMwNzdGQjJGLCAweDRCQUZGM0Y1LCAweDFBNzk5MjZELCAweDhCMzY5OTU2LAorMHhBRDc4RjczOSwgMHhFRDg4Q0U0MiwgMHhCOTZBN0MxNSwgMHhBN0JCQTJFRSwKKzB4NDdDQzMyMzMsIDB4ODA0REU5NjIsIDB4RTBCNDMxQTMsIDB4NEE4MjU3QjgsCisweEE0QjBFOEUyLCAweDJGRkM0OUI4LCAweEYwQ0RGNUU1LCAweEYwODlDMzJBLAorMHg0NjMyODI4OCwgMHhFQUNCQzA1NCwgMHhBNDhDQjVDQywgMHg3Nzk5NjUzMCwKKzB4ODNBNEUxODQsIDB4M0MyRjQ3RDksIDB4NTEwNjE3N0MsIDB4MzNGMUE3ODcsCisweEEyMjY2RTdBLCAweEVCQzQyNkM4LCAweEQ3RThBREQzLCAweDJERjQwNDc3LAorMHhGOUU4RDdCRCwgMHg4MEJEOEVBQiwgMHhFNjFDRTU1RiwgMHhGNkE3RUY2RiwKKzB4NUM2N0UxQzAsIDB4RkJEMDA4OEEsIDB4N0VEMzdCMjQsIDB4RjVCRkQ1OEUsCisweEMyOUNGQjBGLCAweDYxRUNFMDhCLCAweEE3NzZDRkQ4LCAweDlFMEYzQTA1LAorMHg4RkM4QjAyRiwgMHhGREY4MjcwMiwgMHgwMjhDMkYyQywgMHgxNjlEMzA5NCwKKzB4RTRBQTMyMjgsIDB4RjJDRDE0MkQsIDB4OUM3MDU3NEUsIDB4MDU3QkZFNzgsCisweDc4MkI5MDM5LCAweDBEMDEzMTFGLCAweDk3NTUyMDUwLCAweDZBMDk3RjJGLAorMHgxQjMyNDJCOCwgMHhGNDNGMzJGQiwgMHg5NjAwNDI4NywgMHhDM0RDMDkzOSwKKzB4NDIxNUEwRTEsIDB4QUNEMUEyOEEsIDB4MTg5OTMyRUMsIDB4OUJCQTA0NzUsCisweEZBMTU0RTVCLCAweDRCNEU4RDAxLCAweDRENkIxOEIxLCAweDMxNTQ1QjNDLAorMHhDODQ5QzUyRCwgMHg2MDk1OEI5QiwgMHhFOTJDRjA5MCwgMHhBQzNFMUI1OCwKKzB4MjUxRDAyQTMsIDB4RkFFRTRGOEIsIDB4QjFDRjZDQ0MsIDB4QzJBMEQ4QjAsCisweDA1MDFERjQ2LCAweEQwMzY5RDk0LCAweEYzRTExNDc5LCAweDM5NzU5OUY4LAorMHhCOTAwNjREMiwgMHgzNDFGNkQ1NywgMHgzMUYwMTQxQSwgMHgyRjg5OTAyOSwKKzB4QkM5RUY2RTgsIDB4MTNCNDczNDcsIDB4QjkzRDU5QkIsIDB4NTU2RTk5MEYsCisweDU3MjdCREZDLCAweEJBOUY1MTIxLCAweEQ2N0JFN0NBLCAweEIxNjdFODRELAorMHgyQzBFRDBGRiwgMHgyNTFGRkQ0QSwgMHhDOTg3MTlGMiwgMHhEMzc5RDk3NiwKKzB4OEIzQTBBOUIsIDB4NDBCQTVGNjYsIDB4RTQwQTkzRTgsIDB4MkY4OUZDMDQsCisweEZDQkFGREQ0LCAweEYyNDI0MjcwLCAweDFCREJERDE1LCAweDdGMTQ1OUIwLAorMHg1QUNCNkM2QSwgMHhGQTIwNzE5RiwgMHgyRjE2RkZCNCwgMHg4MjBEREU1MCwKKzB4NDY4QUFDMTUsIDB4NzgxNjEzNEMsIDB4OTc4RDk1NzAsIDB4Njc0NUNENkQsCisweEMxRTc2OEMxLCAweDE1RTI0M0I1LCAweEJBMzBBRDYxLCAweDQ4M0ZCNkZFLAorMHhDQUExN0QwRiwgMHgyRjhGMDk3NCwgMHgzNEFCNjhCNCwgMHhCM0U4NjRCMCwKKzB4QzFEQTM4MjgsIDB4NURBRDQzQjAsIDB4NzJEMTNCODEsIDB4MDFGMjc0QUIsCisweDlDMDY1MUFELCAweDBGQzMwQzEwLCAweDBFN0FBM0NCLCAweERCRTZCOUQ5LAorMHhGNDIzQjlBNywgMHg0NTdCNEUzMiwgMHg0MEU4RTI2OSwgMHg5MURBMDQyQSwKKzB4OURCRjQxRTksIDB4MzA4QzBGMkUsIDB4Q0FCRkFDMEQsIDB4MEUyQzg2QjIsCisweDExN0JDM0M2LCAweEVFQTUzOEY4LCAweEYzMTU4NURGLCAweDBERjUwMjgxLAorMHhFQUE5NjAxRSwgMHg4RjQwOEFGQSwgMHhGMTE0NEY5QSwgMHhBMkFCMkVDRCwKKzB4QUNCODg2ODUsIDB4NkY0RUZGQkQsIDB4ODFFRUY4ODYsIDB4NDZCMDIyNDAsCisweDNDMDlEOTE2LCAweDRGMERBRjY4LCAweDgzMzdCM0UzLCAweDlBMDExQkE2LAorMHg0QzYzQUM2NiwgMHgyRkNDNjY5RSwgMHgwQzdEMTVCQiwgMHg1MTI3OUQ5RiwKKzB4QzEzNTQ3NzksIDB4RUZGOTQwQUYsIDB4QTk1NkNCMzcsIDB4MERCNzk3RTIsCisweEU2NjVFRTU1LCAweDc5QUY4NzlELCAweDIxQkJDOTAyLCAweDMwQjI2NEJGLAorMHg0MTFDREM5OCwgMHhFNDUzMzg5RiwgMHg0N0MyQzE5NywgMHgzRTYwMTVGOCwKKzB4RjlFN0FBMkIsIDB4QTkzMDI0NzQsIDB4MDRDNjg4OEYsIDB4NEQxMThCRjksCisweDBEQjdBQUMwLCAweDUyQTM4RURCLCAweDREQUIyMkYyLCAweDdEQkI2RUFCLAorMHhENEQxNzg1MSwgMHhGRDk0NDMxNCwgMHg0MEM1ODM4QywgMHhCQTZFQjBFRiwKKzB4OUFBMjg3QTUsIDB4RjZEMjM2RjAsIDB4NDFEOUUyQkEsIDB4Njk2OEQ3NzYsCisweDMxQjFEMTI5LCAweDQyQzNGOTYzLCAweDI3Q0NBRDMwLCAweENENjFCRjRFLAorMHgyQzdEQUJBQiwgMHhBNzhBOUNDMywgMHg3Rjg1NkI2RiwgMHhCNkQ0NDRBNSwKKzB4OTBDQkIzMTIsIDB4OTU2MTE3ODEsIDB4NDkxNkQ1MzEsIDB4QzQ5NkMzMEUsCisweDcwNkQwQ0I3LCAweDM1RDAwNjRCLCAweEZFMjZDMzZBLCAweDYyMTFGMTRCLAorMHgyQzIzNDBCQSwgMHg1ODYzMzU2NywgMHgwNkI2QkE4RSwgMHhBN0VDM0Q4RCwKKzB4MTA3MUIwQ0QsIDB4Mzg4RUVGQTgsIDB4NjBEOEZCMUMsIDB4NUY5OUQxNDcsCisweDUyQ0E2RUJGLCAweEZBNzM2MDJFLCAweDAzNzZDMTVDLCAweDNDOTFCNTdELAorMHg5Mzg2QUYxNywgMHgxNEEzNUExQSwgMHhCREI0MkEzOSwgMHgwRTgzQzI1NywKKzB4RDRDNUM3NzUsIDB4QTYwN0ZBNDYsIDB4OTFCOUFENDAsIDB4NzYyM0M1RDYsCisweEUzRDUzRTZBLCAweEEzQzY2M0U3LCAweDVBRDM5QkNFLCAweDAzQjU4Mzk0LAorMHgzODg2MkM3QSwgMHgwMUQ1MEI5RiwgMHhFQUFCMzhFQywgMHhBQjNERkI4QiwKKzB4MDY3OTUzODUsIDB4QjE3RjQ4NUUsIDB4RTJGNTc5MTQsIDB4Qjc5QTNCQUEsCisweDEzREE3ODg2LCAweDcxMzZDN0VCLCAweDVFNzQ4QUY3LCAweEQzNEYxNkZDLAorMHg5NjhGNjcwMSwgMHg5OUM1RDdCRSwgMHg1MzBGN0ZBQywgMHhDREY1RDU2NywKKzB4RTMxREUwRDMsIDB4Q0Y5M0JDNjgsIDB4MzRDNTc4QUEsIDB4QTIwMUY3NjEsCisweDVDQjhEQzAwLCAweENBMjREQjk4LCAweEY4QUQ3RTRGLCAweDgwOEVDNDc2LAorMHg2MDNCQTc1MSwgMHg0ODk1NTVDNiwgMHhGMkEwM0ZGMCwgMHhEMjQ2MUU5QSwKKzB4MTAyQzMzQkUsIDB4NzY3MzkzM0MsIDB4QzExQTI0MjQsIDB4NkEyM0M4QzYsCisweDY5NDk5ODEyLCAweDE5QUE4NTEwLCAweEM4Q0RBNzVGLCAweDM0QjUyMTZBLAorMHhEODdGNzQyMCwgMHhDOENFREI1MywgMHg4REYxMUJBMiwgMHhCMTA5MTFDNiwKKzB4M0YxRTU5NTUsIDB4RjA3NUY0RUIsIDB4MTc4NzRGQzUsIDB4MEQ1NTY4NUIsCisweDVFRTUyMUU1LCAweDQ2QzcyOTI0LCAweEY4NTQwMjEwLCAweDVENUU0QzVDLAorMHhFODdBMTMzQywgMHg5MTYzM0RDOSwgMHgzNkI1NEQ1RCwgMHhBOEI1RDQ0MCwKKzB4N0RCN0Q2QzQsIDB4NUZBODJDMTcsIDB4QUQ2NzkwMzksIDB4ODZCM0I4MzksCisweERGNTEyMUI3LCAweEMwOEI3NjhBLCAweDMzOEE1MTJGLCAweENGOUE0RjlBLAorMHg1REVGQkI1QiwgMHg0QzkzMDFCMiwgMHgwODAyMzcwMiwgMHg1QjFEN0UyOCwKKzB4RUM4MDA1MDUsIDB4M0E4NjlFODAsIDB4NEM1MEM4QUUsIDB4QjFBRTkwNjQsCisweEFGRkEzNEVCLCAweEYyRjAwNkI5LCAweEQ4QTlBM0QxLCAweDJDNkMyMTM0LAorMHg2NzdFRTY0OCwgMHhCQjZCNkQ1QywgMHhBMjg1MTM2QywgMHg2QzQ3QkY0QywKKzB4QUYxNThEQzEsIDB4MEVGNzVFMkIsIDB4NUI5Qzc0RDUsIDB4OUI4RDRCRTMsCisweEU0OTVCRTE5LCAweDU5NDBCMjI4LCAweDU1RTYyNjU2LCAweDMyNDdFMDYwLAorMHhCRjcwOTRDRCwgMHgxQzFBQjM4MCwgMHhFQ0VBMjI3NSwgMHhCNkREODI1MSwKKzB4Q0NBMzlERDIsIDB4QUI4NUQ5OTIsIDB4Mjc4MTk3RDIsIDB4RkI2QzlGRDAsCisweEJENTNCNDU4LCAweDg5RUZFMEVDLCAweDUyQTNERkZELCAweEE2QjdGRjdCLAorMHhGQjA0MzY0OSwgMHg5M0M5M0Y3OSwgMHhBRUI0Q0Q2RCwgMHg3MURCNUM5MCwKKzB4OUU4REZFOTIsIDB4MEYxQTVCOTEsIDB4NTVDNUNGNUQsIDB4MUExODQ3QUMsCisweDhEMjVDRjZDLCAweDkxNEZEMzE2LCAweDM5RkNGRTIwLCAweEQ4RjY2QTA3LAorMHgyQ0REM0RDNiwgMHhFNDE1QUM3MiwgMHgzRDFCRDA5QiwgMHhBODMyMkM1OSwKKzB4QkQzQTgyNkEsIDB4MkE5ODhBNDAsIDB4RUJEOEIxREQsIDB4OUY1M0VFRUYsCisweERGNTcxODE2LCAweEQ0RkNDREFFLCAweEI4NUExRTUwLCAweEJFMUE1NzFGLAorMHgwRUQwNzUzNCwgMHg0QzFFNDcxQSwgMHg4QjREMzZGNiwgMHgwRTM4OEZDNiwKKzB4OUVEMkJDNEQsIDB4M0UyRDdGNzIsIDB4NzUyQUNBMTUsIDB4ODk2MEI0OEUsCisweDU4OTJCM0Q3LCAweDcwRjZGM0NELCAweDI2QzQ4NUVGLCAweEM4MzgzOUI5LAorMHhGRTZDMjI0QiwgMHgzNTQ3MjAzRiwgMHhGNzNBQ0E4NCwgMHgwNjVEQ0RCQywKKzB4ODk4NkVCREMsIDB4Q0Q1OUVBMTQsIDB4QzBFRjU4QTgsIDB4QzU1ODcyMjksCisweDQ4NEZCQ0VGLCAweDlCOEJGMjRELCAweDM1MUNGOTQ2LCAweEUxMEFBOTczLAorMHgxNzkxOTY0MCwgMHg5NUZGN0IxQywgMHg4MkFCNjVFNSwgMHgwNzBCQ0M5OCwKKzB4MEU3Q0RCOEQsIDB4MzhEQjI3REUsIDB4Q0E1NDNDMkIsIDB4MDEzMUVCNDEsCisweDgzMDA5OTZCLCAweDg4QjYzRDY2LCAweDAzQURBQzFELCAweEIyMDVBODdCLAorMHhEOEJEQzBDNiwgMHg0NDNGNjA3MSwgMHgyQ0U2OUQyQSwgMHg2RTFFNUE1MywKKzB4NEVGRjkzQUMsIDB4NzAzMjI2NTcsIDB4NUNDREQxNDYsIDB4MDRDNDM1QjYsCisweDVCRjNDRDY5LCAweDUxRTA5MTE1LCAweDI1NDVERkIyLCAweEE1MkVGNDQ4LAorMHg4RDM4NzA0NiwgMHg3QzRGMUYyNSwgMHgyRUZGRDhBQSwgMHhGRDY0MjJCMCwKKzB4QjgyRTI2QTcsIDB4Q0YwMUNDNDUsIDB4ODg4OTlFQkUsIDB4REI2MjE5NjYsCisweEJCQTE4MjJGLCAweEIyNjRBQUVCLCAweDEwNzZFQUE1LCAweEMyNEIwQ0Q1LAorMHg1NEQ1NTRCMCwgMHg0RUNBN0MwNSwgMHhDOEM5QjA1MywgMHg3MEE4NkQ5NywKKzB4NEUzMjY1Q0EsIDB4RUEyNEY4MTAsIDB4ODczQjE3MkQsIDB4NzlBNzREMTgsCisweEVDM0Y0OUQ1LCAweEQxNzk5NjAyLCAweEEyMUEyOEI2LCAweDNGQjk5QUQxLAorMHhDMkRCMzVCMywgMHg2M0VDMkU1MSwgMHgxN0U0NDg5RiwgMHhFOEUxOTE2NCwKKzB4NzlBREQ4MTksIDB4MTBENjYxNTcsIDB4NUY2MjFBNzMsIDB4MUNEMDYzQkEsCisweDY2NjU4MTVGLCAweEZBMEI3MDgxLCAweDZFMEZBNDczLCAweDBDRTM1NzFFLAorMHhCNUVBRUY0NiwgMHhBQTA0Q0Y1NCwgMHgzMzY2ODBDQSwgMHhEQUJCRkYxMSwKKzB4MjI1OUU3OTcsIDB4QjU3QjQ0NzAsIDB4MTExRUI0QkYsIDB4QzE3MUQ0MkIsCisweDU4ODlBN0E0LCAweDQxOUNDQjNFLCAweEJFQTFGMzY2LCAweDQxRkU0MTRCLAorMHhBNjVDQjg5OCwgMHg2QzI4MzYzQSwgMHg4RjgyRkM4NCwgMHhEQkVENUE5QywKKzB4NERCRjM1MjYsIDB4RjJGMzRFNjYsIDB4OUQyQzlCMTEsIDB4MEMwRDRERkIsCisweDREQkY3OUQ0LCAweEEyNTZFODZELCAweDY0MDczNzZDLCAweDNGM0U4QUZGLAorMHg0NzRCMzU5MywgMHhFNTU5NjVDOCwgMHhDQjIwRDM1OCwgMHgwQzY3MUE5QiwKKzB4MTY5RjgzNDIsIDB4RDJFMUM5RTcsIDB4QkREQkFBRUIsIDB4OTNERjBDNzUsCisweEYyNzcwN0Y3LCAweDUxMDgzMDVCLCAweDRGRjJDMDYwLCAweEVCOUMwOERFLAorMHhERjExMDIwRSwgMHhEMjI3MTA0NiwgMHg2RDFCRkQyNywgMHhFRDAyMENEQywKKzB4MkMyMjY1OUIsIDB4NjkyMDUwRDksIDB4RDE0QkUyOTEsIDB4M0VCRjhFODYsCisweDgzNDRCNjI1LCAweDc4NDBCOTFDLCAweEI3MDJCRDVGLCAweDQ5MzVEMzE4LAorMHgwMUEyMjAxMywgMHhGMkEyMEIwOCwgMHg2NTFBMUMzOCwgMHgwMDRGRTYzMywKKzB4RTUxRENDMDYsIDB4RjVCODYxMzgsIDB4OUZCRkYxMTgsIDB4NkY3QjNDRDQsCisweDAyODkzOEI0LCAweDA3MUU5NkFFLCAweERGMzNEQzlFLCAweDc5MDAxQUM3LAorMHg3QjVEMjBGQywgMHgzRjEzNzc5NCwgMHg4MTE2NUIwNCwgMHg5NzNGOEZENCwKKzB4MEFFNENCRjUsIDB4N0M0ODE4MEIsIDB4NEE5NkJDODksIDB4NTgwNjZFNzQsCisweDg2NjY5REM2LCAweERDNTVBMjE4LCAweDg1OEMzMTMwLCAweDk5QUVBQzkxLAorMHgyNjk4M0ZDNCwgMHhFRTRENEYwNiwgMHhEOEQ2RDY1NywgMHgxOEVGMjYyQiwKKzB4Mzc0QTYyMEYsIDB4ODU5OTVGOUMsIDB4Q0M4MTRBQzEsIDB4MzlGNDg3RTAsCisweEM2MjgxNzdCLCAweDJGQUUyQzM5LCAweDY0MjUyNUEyLCAweEMxNDc0RjJELAorMHhCQzdDRDQ5RSwgMHhFODFFMTNGNywgMHg4M0Y0MkJEQiwgMHg4QUI3RDk5QSwKKzB4QTgwNDBCMTEsIDB4RDhBQTY4RUMsIDB4OTgzQjM3MzksIDB4RUU0MkVDREIsCisweEM5NTEzNDk4LCAweENBQTA2QTE0LCAweEU0Nzg0MDk0LCAweEU2QkVCQjlFLAorMHgxM0JFODAxOCwgMHg1OUUzRDVENCwgMHgwQ0YxNzI4RiwgMHg5NjM0MTNCRSwKKzB4MzE5NTMzQjcsIDB4MTQ2NjJBQkUsIDB4MzM2M0I0NUQsIDB4NTlBOTk2ODcsCisweEJCQjBGREE0LCAweENEQkI4QjIxLCAweDAyNDBGM0IxLCAweDIyNkRBQzNCLAorMHgzMEUxQzQ5RSwgMHg3NkUwNzZENywgMHg0QjkxQzU5OCwgMHhCM0M0NkUyRiwKKzB4NEE2NTdDQzcsIDB4NjZDMzg3NUEsIDB4Q0JDNkZDNTQsIDB4RjgzMkVCRTgsCisweEREMUVBRDNELCAweEZFRkRBRjg1LCAweDhERTUxQjg4LCAweEFFQUZENUQzLAorMHgzRTRDRUE4MiwgMHg1NUY0NzkzNCwgMHg5RjgzMTRDQSwgMHhEMDIyMEJDMCwKKzB4NUFDRUY4MUYsIDB4NzFGREQ4RTksIDB4MTNBMTRFRDgsIDB4NkYxRkMxRTQsCisweDc1MDQ2QTA0LCAweEM2QzRGREFGLCAweDRGRkZGNzI0LCAweEY0NEZFREQ2LAorMHg3RTFDNUNCQywgMHg3ODRDNkI0QywgMHg4RDg1RjIyMCwgMHgzOEI2NUMzRSwKKzB4OEM5OTIwNTAsIDB4MkRFMzRDMTMsIDB4OUYyQTQ1NDcsIDB4NDhFNThGNjUsCisweEEyODBCNjg5LCAweDZGNTQwRDhBLCAweDEwQjYxQjM5LCAweDFDOEEyODQ5LAorMHhBNzMxNjM1OCwgMHhEQkZCNzg2MiwgMHgxODJDNTUzRCwgMHg5MkYwNDM4OSwKKzB4MUZFN0JBREQsIDB4NkE3MjRDQkEsIDB4OTcwQkUwMjAsIDB4OTM3NjAwNTgsCisweDJERjlFMEFELCAweENGRjFGOEIxLCAweDE3MEQ4MTBBLCAweDQ1RjRFNkEyLAorMHgzN0EwRThGRCwgMHg4NkQxMUM2RCwgMHg0RjNDNkEzQSwgMHg0QjE0NDQ1MiwKKzB4Q0U5Qjg3QTEsIDB4N0MwOEMzMEQsIDB4OUNCOUIwQUIsIDB4RDU1RjJDQzUsCisweEZGOTUxODBGLCAweEYzNTUwNUJELCAweEVENUJEQjk2LCAweDg1Q0EyRTQxLAorMHg4NzA4QjI2NCwgMHhENjA3OTczNCwgMHhDQTc2QUIzRCwgMHhGRDZDREY0RiwKKzB4OUFBQjg0MEIsIDB4OTJEM0E1RjcsIDB4OTNBOTJDMzgsIDB4MDQxOUFBN0EsCisweDFENTAwMDZFLCAweDEyNkY0OEZGLCAweEFDREE0MTJDLCAweDAxMTM5NDU0LAorMHg4RTIzQzQ4NiwgMHgwMUQ0NEY1MSwgMHg3QTVGNkYxMCwgMHgzNzdENEQ1RSwKKzB4Qjc4NEU3MkYsIDB4QTlBQzkyNUYsIDB4QjlDNjZDNzksIDB4MDU3MzMxRTYsCisweENGRjA0MEU0LCAweDc3RThBOTYwLCAweDM1RTMxRUVDLCAweEVCODA3QTQ0LAorMHg4NTk0RkZGQywgMHhEMjc2MjlCNywgMHg1RERGNTI2RSwgMHhCQ0YyRjQ4NCwKKzB4ODg4MDUwMTMsIDB4NDEwNDc4NTAsIDB4Qjg1NzRFQ0QsIDB4M0UxNTA4MkYsCisweDMwOUMxNkRDLCAweDI5N0I2OTA0LCAweDMwQzM5RUNCLCAweEQyMEI2MUFGLAorMHg1MUE1NzhBRiwgMHg0RTBEMjRBOSwgMHhDNjFGQkU1RiwgMHg3QTg5RjRDNiwKKzB4OTQzMjI5OUQsIDB4RkUyNjFCOTUsIDB4REQxRkM0Q0EsIDB4MDQ0QkZCOTIsCisweDQxQkU1NkNBLCAweDBBMkI2ODMxLCAweEUxMzVENzVELCAweEFCMkQwMEEwLAorMHhCNDM3NDA4MCwgMHhGQUE2REJEMCwgMHhBNzA0QzRBOSwgMHhEODEzODVBNCwKKzB4NTE1MzMzMTIsIDB4RUQ1RURBRjcsIDB4RTRFREZBRUIsIDB4NzRCN0RBRkUsCisweDlEODEwQUE3LCAweDQwQjkxODI3LCAweDY1MjE5QkNCLCAweDc1NDMxQzE2LAorMHg5NEQ5MjNEMywgMHgwMEI3QUE0RSwgMHhCOEE4OEZEQSwgMHg5MjcyNzhENywKKzB4N0EyMzc2OTcsIDB4NDVCMTQwOTcsIDB4MkUzQTU2MkYsIDB4OTMwMDMzMjIsCisweDBCODhBNUZGLCAweEQxM0Q0QURELCAweDZEN0I3NTc5LCAweDcyRDgzNEM0LAorMHgwQkNBQTM2MSwgMHhDMDJFMDBCOCwgMHgxNTAyMzU1MSwgMHg0ODFDNUU5MywKKzB4MDJFODFBMTYsIDB4OEE4NDZBMzMsIDB4MTIzOUE5NzEsIDB4OTk0ODE4QjQsCisweEZDM0RCQjZELCAweDQzQzhEMkYyLCAweEUzQUU1NDhDLCAweDQwODAzMkYxLAorMHgwMkIwNTYzNiwgMHhFMzYxQTYwQywgMHhGRTJDQTI5MiwgMHgwNjFEMjM3NCwKKzB4REIyODU1NTYsIDB4NzA2MjdFQTQsIDB4N0ZDNjRBRjAsIDB4RkUxMDBCNkQsCisweDcxQUVCM0YyLCAweEE1NjVBNDEyLCAweEE2OTg3MzFGLCAweDQ5REQ5NzY3LAorMHhDMzYyN0VCQywgMHg3NUZCMkRCRiwgMHhGREMwRTk3MSwgMHhGNkVEMTJBNiwKKzB4QTIzREMwMEYsIDB4ODk3RTkxN0IsIDB4N0YyMDMxRTAsIDB4MTdEQ0U1NjgsCisweERGNjlDQUQzLCAweEM2RkI1QjZELCAweDA5NzI2OEIwLCAweEUxMTAyNDQ0LAorMHg4NkRGOTM4MywgMHhCRDdCOUNDMiwgMHhCQUFGN0RDRiwgMHg5ODVCNDVEMSwKKzB4NDIxOEU5NUEsIDB4QjI0NTVFRjQsIDB4REIwMTVGOUIsIDB4NTRDQ0NFNzYsCisweDU2RURGNTYxLCAweDZGNjZGOTVFLCAweEY4QjFFQkQwLCAweEY3QTM5QUUwLAorMHhGNjZEODM0NiwgMHhBNDY3NzAwNywgMHgwMkM0QjNFQiwgMHg4Mjk5ODdCMCwKKzB4N0MwRTE5MTksIDB4NTFGNzA2MEIsIDB4NEIzMEYxRDYsIDB4ODVBNEUwQ0EsCisweEVDMDQ5RkEwLCAweDE3Q0JGMUU0LCAweDdBMUFBRDk1LCAweEVCQTRDNTEzLAorMHhFODQ2MkU3OCwgMHg1NENEREEwQywgMHhFRTdCODM3OCwgMHg5ODU4QzhDMSwKKzB4QkEzMzU4N0MsIDB4NEQ2RjFCMTQsIDB4N0EyQzA1MjUsIDB4N0U2RUU0RDIsCisweEFDQTE4NjkyLCAweEREMTg2ODIwLCAweDQxMTk4QjAzLCAweDhBQzg1QUI3LAorMHhCRDg2OTAwQiwgMHgzNkUyQzM1NCwgMHhFNjVGOTExNSwgMHhCMTA2NDVEQSwKKzB4Nzk3MUQyMzAsIDB4QzgzRDM1ODMsIDB4OEM2MEM4MUQsIDB4OTREQjU3NDEsCisweDRGQ0I4OTM0LCAweDlBNTIwRkUyLCAweENFNDk0NDZELCAweDg4NjRFNjQxLAorMHhGNUVGMjVBNSwgMHhDMURFRUQwQSwgMHhDODA1N0YzNywgMHhGQjMwNUM3MywKKzB4MzkyRTY3MEQsIDB4QTREMDBEMkEsIDB4MzU2QTQ2RjAsIDB4MkY2NzU1NjcsCisweEI3OTk3Q0YwLCAweDg4QUYzQTRFLCAweDU2QzlENTFFLCAweERENzQ2RUNELAorMHg0MENGQTQ1MywgMHg1RUE3NDBDRCwgMHhFNERENkJCMSwgMHhDQ0IzMTQyOSwKKzB4QTIyMjdGM0YsIDB4MThBMUVBRjAsIDB4QzE1NTQxN0IsIDB4NDFGRTczNUYsCisweDE2RDQwQjAwLCAweEM5RjcyQUZDLCAweDg2QjFENjJELCAweDZBOTlBODJBLAorMHgwOUQzMzI0OCwgMHhFQzQ0NjM5QywgMHg5QjBBQjJCMiwgMHg2OTY5MTY0QywKKzB4RUY2MDJCQjEsIDB4MDIwOEZDNkYsIDB4QzExMDk1NzgsIDB4Mjk5N0FCODcsCisweEU1NjI2QjE0LCAweENEQUY0OEUxLCAweDIwNzgxNjMzLCAweDJFQkUwQTQxLAorMHg3Mzc5MjYxRSwgMHhGMjE2RjdBMSwgMHg3MTREODI1OCwgMHg5MzZGRTY4RiwKKzB4MTYwODU2RjksIDB4MkE0RDE0MTYsIDB4QjU1OEU0MTIsIDB4N0RCMTk2REYsCisweERDODhDQ0IyLCAweEYzN0FCNjEyLCAweDc0MjNGMjE0LCAweEQzQjA2QTQzLAorMHgyNUE4MDEyRCwgMHhDMUM2OUZGQSwgMHg5MzZGMkMxOCwgMHg1NkQ3N0MxOSwKKzB4Nzc0QkZDNjksIDB4RjVFODVFMjQsIDB4RDc5MTU4QzksIDB4QTY3QzNFMTUsCisweEI5NTg4MTlFLCAweDY5RjgxMjc4LCAweEYyQjM1MTA3LCAweEJGMkY0MDg1LAorMHgxQzk5N0EwNiwgMHg2QzIzOEMzQiwgMHhDNzU2RDU2RSwgMHhEMTVDMTE0OSwKKzB4MzUxRTZFQzQsIDB4MjMxMTMwM0YsIDB4MDYyMTYwMkMsIDB4QjExQjZERDEsCisweEJFOEU1MEI1LCAweDM0QTVGNTg5LCAweEU0RDMwOEFFLCAweDQzNDRCMjk3LAorMHhBMzNBRTk4RCwgMHgwQTMwM0NEQiwgMHgzODhFQTE3QiwgMHgwMTA3QjVBNSwKKzB4MzhCMzkwNDIsIDB4RkU2Nzg5OTUsIDB4QjQyNkZFNjksIDB4MjIxRkNGMDYsCisweEM0NTkyNkFCLCAweDIxQTQzMEY5LCAweDZEMTkyRDJFLCAweDQxNjhDMTBCLAorMHg1QkE2QjEzMiwgMHgwNTE5RUNBNywgMHgyMTEyNzU4MiwgMHhGNkM0NDdFMCwKKzB4MEM3MkZDMzEsIDB4MDk0MUIzRjAsIDB4NzZGMjM4NzcsIDB4ODZDRjA2NzcsCisweEU3Nzg1MTA1LCAweEE0NjM3ODY0LCAweDk0QzgyQjQ1LCAweEY2MEZENkEwLAorMHg0Njk0MUMyNywgMHg3QTMzQTY5OCwgMHhFMURGOEJGQiwgMHg1MjQ5OTcwQiwKKzB4REZFNjVFMUMsIDB4RjRBNEZCMjIsIDB4NTk5NjM5RjQsIDB4RkUwRTk3MjIsCisweDdCQjQ4RjU4LCAweDUzMzQ2NUUzLCAweDlFODg0QjM1LCAweDI2MjA0MjlDLAorMHgyODc1RkZDMSwgMHhGMTFFQzBDQSwgMHg2NjNBRjVGMCwgMHhCMkM1OUMzOCwKKzB4MDM1NTZFRDksIDB4MjcxRTlFMzksIDB4ODU1NkUwNjIsIDB4MDgyMDc2ODIsCisweEU1Nzk3RjAwLCAweDY2QTM2MkI1LCAweDdFRDgzOTRELCAweDI5MjJDMzc0LAorMHgyNzE2NTdCRSwgMHhBQzE1MDcxQiwgMHhFMjk2NjkxRSwgMHgwRkUyQzc0MCwKKzB4MTkxMjBGQjUsIDB4OUFCRDg4OEEsIDB4QTIwMDc2MkMsIDB4NzgzN0Y0MUMsCisweEM2RjRFQTE5LCAweEYyODZBQkY0LCAweEZDQTg5OThGLCAweDk3QjBFN0Q1LAorMHgxMzM5Qzc5RiwgMHhGRUQwNUQ0MywgMHhCMzM5MkU3MSwgMHhGQzJBMDFFQiwKKzB4QjcyMENCRUQsIDB4NEZBNzEzNTgsIDB4MDRBNTdGNjIsIDB4M0Q1NThCMEEsCisweDFERUI0RDQwLCAweEM5QzgyM0YxLCAweDQ3MEY2MzBBLCAweDA4RjIyOTc1LAorMHgyQkQ4NTEwNywgMHgzMjg4QTYyOCwgMHhCMEM4OTY3NSwgMHgzMkQ5NTdDMSwKKzB4ODBCNzg0MjYsIDB4OThBNDY5NTMsIDB4QTQ5M0FGNjAsIDB4QzJCODRBQzQsCisweDQ4NkQ2NThGLCAweEZFMTE5RkY5LCAweEIyRkU1NjVGLCAweEVBREI1OENELAorMHgxRjQ1RjlCNCwgMHhDRUFFNjJCNiwgMHg2OEVDNzAyRCwgMHhGNTJBRERGNywKKzB4MEZGQzA3MTUsIDB4NDEyOUU0MkMsIDB4OTU2QUM0RDksIDB4MDAzNUNEOUMsCisweEY4RkVCQUExLCAweDI5QzU4Mzk3LCAweDdDMkUyRTQxLCAweDdCRTc0REFGLAorMHgyNzkxRDM0RCwgMHhCNkQ2N0IwRCwgMHg4RjU1NzUyOCwgMHg5RERFRUQ1QiwKKzB4QjNBQTRCQjcsIDB4MDVFMjJFNDMsIDB4NENEQTYwMEQsIDB4NDMyRTJEMzIsCisweDQwNURBNUJELCAweEFGMjM4MThDLCAweDJGNzNGRTA5LCAweEQ0NjI0NjI2LAorMHg2NTNFRkNCMywgMHg3N0Q2NUQzRiwgMHg1MUEzRENCMywgMHg3NjdGNDA3QywKKzB4QzY2NDUyRTMsIDB4MTBCNjg0MkUsIDB4OTNBMDg0MEUsIDB4RTQ1M0FEMTAsCisweERFNThGQzNELCAweDZDMjI3MjE1LCAweDFFRTEzMEVBLCAweEIwQkY2NEJFLAorMHhBMTFFNUQzOCwgMHgwMTMxQjc1NSwgMHgxOTFGNzBEMCwgMHhEQjQ4Mzk1OSwKKzB4QUE4RDJGOUUsIDB4NUEwMDJBQTAsIDB4RjVBMjk5NkQsIDB4RkQwRjk1RjksCisweEQ2QTEyODY0LCAweDNBQTQ4Qjc0LCAweDUwRjY2NzlGLCAweDBBREY1QzQ5LAorMHhFMkY4Q0U2OCwgMHhCRjIxM0U2NywgMHg1RTlBQ0VFQSwgMHhDQUNEMEVCRSwKKzB4NkRGNzY2QTUsIDB4MzNDMEExNTYsIDB4NzIwODY4RUEsIDB4MzExMkEwREMsCisweEIzODIzNTBBLCAweDM2OUQ5QzUwLCAweEU4Rjg5MEQwLCAweDBBMTIxMzk5LAorMHgyQUI0NThFQSwgMHg1MUM4MjMzRCwgMHhCRjQ2NDAzQywgMHgwNzI4Q0Q1NSwKKzB4MjNGNjc3NEIsIDB4MkZCNTlEQjAsIDB4RkEyQ0Y3MjQsIDB4QjQ5RkE4NDgsCisweDVGRkZBMTI1LCAweERFMkMwRDE1LCAweDc2Qjc4QzQxLCAweDE5MkJBNjJDLAorMHg0Qzk1NjNFMiwgMHg4Rjc0MjUwNywgMHg4ODIxMDRFMCwgMHgzNTdBRDA3OCwKKzB4Nzk5RTI1QTIsIDB4RUYzRUQwMjEsIDB4NjlENTRCNDYsIDB4NUVDNTc4NzAsCisweDBGRjQxOEUwLCAweDA3QzVBQzdGLCAweEMxQUNCRjlBLCAweDgwQTgzMEQ5LAorMHg4MzdDN0M1QSwgMHgwNEMxMUQ4NiwgMHhDMTRDOEJDNywgMHg5MkJBNjUwQiwKKzB4OTREMzRGQTgsIDB4REJERDVFREMsIDB4OUVEMkEwOEYsIDB4QTFGQUU0ODUsCisweDVGRDY2QzNELCAweDRDQ0I2RjlGLCAweEI3QUE1NkIwLCAweDBGQjNDNzNBLAorMHgwM0FGOTZFNiwgMHhEQjJEMzhGOSwgMHg3QUYyMEQ2MCwgMHhCNTdDQkU5MCwKKzB4MjBFQjJENkUsIDB4Q0Y5MzQ0NTIsIDB4ODJFQzI2RjYsIDB4ODRCMzczN0EsCisweDA5NzJGMUI3LCAweDM5QjZEQjRELCAweDEzRTUzQ0MwLCAweDY3QzQxRDcyLAorMHg5NEJBQUM3OCwgMHg2NjNBOUM2QywgMHgzNjkyNzQ0OCwgMHhDRkJDMjYxMCwKKzB4OTgwRjUzQkEsIDB4N0U1NkM5NkEsIDB4MDRDNjJERkIsIDB4QTQ3MUQ1NzksCisweERGOUIyRUUxLCAweEUxMkRFQkI3LCAweDJEQjlCMDQyLCAweEYwQzc0Qjk2LAorMHg2QTM3NjJFOSwgMHhGNERDMzlEOSwgMHg3NjFBNTg4NCwgMHhGQTM2M0QzQiwKKzB4OTI3NjY3NTksIDB4RjNFQUQ0NDEsIDB4ODc4MjY5RUQsIDB4MUFGRkFGRTUsCisweENCNDMyNzY0LCAweEZFMTk0NzVDLCAweENGODc3NkRBLCAweDFGMEFEOTA2LAorMHg3RDk5QUMyMCwgMHhDMjczMTdGQiwgMHg0Mzk5NDRBNCwgMHg2NUQxNEMyRCwKKzB4NDNFNDUyNjIsIDB4Q0RFNkIzQkQsIDB4RTI1QzY3Q0QsIDB4MzIxQUEyRTYsCisweDM1MkEyNzY0LCAweDU1NjlFRjQyLCAweDAwNUMzNzBELCAweDI5MDgwMUUwLAorMHg2MTg4MzAzNSwgMHgyQTJEQkM0OCwgMHhFMkQ1NTlGRiwgMHgwMUY1REYxMywKKzB4NjlCNjE1NTgsIDB4RTk0QkYzNjQsIDB4M0NBNzZGQ0EsIDB4MkUwMTY0ODMsCisweERCNjc1RjlDLCAweDRGQTVCNkRDLCAweDU5QTZDM0VDLCAweDU2QzZFNkNGLAorMHgyNENENTlGNSwgMHg0NjkxMTgzNCwgMHg2ODNCOUUzOSwgMHhCNUFGNjE3NCwKKzB4NUMzMUUyNjksIDB4Njc5QzlBMTIsIDB4Mzc4N0QzRTYsIDB4RjE3MjdFRTYsCisweEIwNzA4ODJGLCAweEZDMzdFQUNBLCAweEJFRTA3ODNGLCAweEY2MjE4MzY5LAorMHgxOTM3Mjk0MCwgMHgzRkY3RDg5MCwgMHg2OTczNjkxOSwgMHhERDk2MUNCOSwKKzB4ODgzMDEwRjEsIDB4NkU0NzJENUIsIDB4MjQ0N0UwMEQsIDB4RjM5RTFGMEUsCisweDFEQkQ0NDJGLCAweEJFMTk3N0UwLCAweEM4NjU1RjQyLCAweDM3Qzg0MjUzLAorMHgzNDgwREFDNCwgMHg0Q0ZFMURDOCwgMHhGMTUyMUFENSwgMHhBNDVDNEY4QywKKzB4ODdGQkFFRTAsIDB4M0U0MUU5RTIsIDB4RjQ3NzcxRTUsIDB4MTZDNzRDREYsCisweEEzM0Q0MDM1LCAweDM4NTEzQTEwLCAweEFCRjMyNjRELCAweEI4RDgwREY2LAorMHhEOUFENzI1NiwgMHhGNzgzNzVCOCwgMHhENzY2MUNGNywgMHgxQzM2M0FGOSwKKzB4RDQyNUZBMzIsIDB4MDAxRDdCOTgsIDB4REI5NkExQ0MsIDB4QTA5MkU2ODMsCisweDY1Q0Y1MzE2LCAweDVGMjgyNjg5LCAweDlGNTJGOTEyLCAweDg5NThBMUI3LAorMHg2NDU3QTNGNywgMHhBQjQzRkFERCwgMHgwNjEzMjhDNywgMHg5RDMxQjVFMywKKzB4NzVBNzdGNkQsIDB4NEE3NjRENEEsIDB4NDg4Q0U4M0UsIDB4Mjk4ODcyMTgsCisweDlBMDRCREQwLCAweEVGMzMxMDcwLCAweEJDRDJGODg0LCAweDZCRjY2QTZGLAorMHhCODUxNDNDQiwgMHhGQTUyOTI3OCwgMHg5RUEzQTM1NCwgMHg0QTczQkRBRiwKKzB4MENCQjc1NjMsIDB4RDAxQUUzNUYsIDB4RDJBQzNEQUEsIDB4RkM4MjQzQjcsCisweEQ4MDVEOTdCLCAweEMxNjJBNzVGLCAweDFENDlBQzY3LCAweDlFMUJDMzhDLAorMHgxRDA2QUFFOCwgMHhFQUY4MENEOCwgMHhDRTgyNURENCwgMHhBQ0EzRjA2QSwKKzB4ODNEMDkyRUUsIDB4M0YyQkFBQkMsIDB4MjQ4MkQxMjAsIDB4RjMwMTY4MEMsCisweDdEQUMzNzNGLCAweEY1RDYxNzhELCAweEI3RTkyMTdGLCAweENDRkU4QzEzLAorMHg5NzYwMjRFMCwgMHhBMkYzOUY4QywgMHhCNkM2NTczNCwgMHgxMEFFNTE0QSwKKzB4Njk2NTg0Q0YsIDB4MjU0MjExM0MsIDB4NDc5Q0IyMEYsIDB4OEQzQTIyRTMsCisweEY3QzRCODhDLCAweEY0RjdGQkUyLCAweDJGNTUzMzA4LCAweDlFQTcxRTNBLAorMHg3Qjk1OEY0OCwgMHgwOTI3REFBQiwgMHhGMDg5NDlCNywgMHg3Q0Q0NkMwRSwKKzB4N0E4OTJCQkMsIDB4ODgyRjMyQ0UsIDB4MzRDNDkwQzgsIDB4ODQ4M0VEMDQsCisweDA3RUI0RUZDLCAweDRCRUJDRDgyLCAweDgzQjE1RUU4LCAweDhGM0I3OEFDLAorMHhGOTVFRkRBOSwgMHg4MTZCRUJGOSwgMHgyNjlCREE1OCwgMHhFRTM3MzM0MiwKKzB4RTA5RkRBOUYsIDB4Qzc2NTFBQUIsIDB4QjhEMzk4QjIsIDB4QzdGNDQ5QjIsCisweDAzMTMxMEY1LCAweEM4Njk3MDZGLCAweERBMjJGMTI3LCAweDhDNjhERjkxLAorMHhFNjc2MDY4QSwgMHhCODVBQUFDNywgMHhEMzJGMzVCQywgMHhFMjJERjAzMSwKKzB4RkUxNDJCRDksIDB4RDRGQjI3MDAsIDB4MkQxOTc3MDcsIDB4QTNBNDNBNjQsCisweDBDMDJCMDUwLCAweEU5NDVBRDU2LCAweDdERUUwQTVELCAweDEwNzVERTNFLAorMHhEOTlBRDkxQywgMHg2QTdCQjcxRCwgMHgxNzc0QjNCOCwgMHgyMjI4QjExMiwKKzB4MERFRUU4NDQsIDB4MzgwNzRFQkUsIDB4NkRBQ0Y1N0IsIDB4N0UwMDk0QjcsCisweENFNDZGOEVDLCAweDREQUYzNEY0LCAweDVCOTYxOTA3LCAweEM4MjM2RkY3LAorMHhGRDM4MEFBNywgMHg2MUVCQTg0QSwgMHhBRTQ4OTJFQiwgMHgwRjFCNjM2NSwKKzB4QjBDNEM5QTAsIDB4MDRFNjAxMkQsIDB4QTVGOTBEMDEsIDB4RDZDODg4MkUsCisweEJDQjlDMUVCLCAweDBFNUUwRkVDLCAweDUzQTQ2ODg5LCAweEEyQzBGQTUxLAorMHg1MjBEQTQ1OSwgMHgzRkQ5NUZBMiwgMHg2RTFENkZFOCwgMHhCQzA5MzIyMCwKKzB4QUIxNjM5MEEsIDB4MTYzRTNENkQsIDB4MEE2MzUxN0MsIDB4M0JGMzhGM0QsCisweDg4QTFGNjZELCAweDk2MjYzNTM2LCAweDQxMkRGMDA4LCAweDEyRkIxMjZELAorMHg0NDQ0MUQ3QSwgMHgzMUM5RjcyNiwgMHhGNjZGNjBDRiwgMHhBRTE0NTNENCwKKzB4REFFQUQ3MUIsIDB4NTRFQUVFMEYsIDB4OTQ4QjczQkIsIDB4MzFFQTNFNzQsCisweDM1NUQ0RkRDLCAweDJBMUYzQTlFLCAweDU4NkQwOERGLCAweDEyM0FDMkU4LAorMHhGNUFDMDA2NSwgMHg4ODc0QUNBQiwgMHgwNUIwM0Q2MywgMHgwMUJENkE0QywKKzB4N0E2QTk4ODAsIDB4MkJDMTZGOTMsIDB4QzQxMTJGMEMsIDB4ODI4N0I0MEQsCisweDQ4RUFCRjA4LCAweDI5RTU2ODYwLCAweDBGNTA1Qzg0LCAweDQ0N0RDMDhCLAorMHgxNjY1MTE5QywgMHgwMDM0N0UzNywgMHg0ODJFRjAzRSwgMHgwMUIxNUQ0NCwKKzB4RTZDMUI5RkYsIDB4QjE2NUU0MzYsIDB4MENGNjkwRjcsIDB4N0ZDNUJEMDEsCisweEI3ODRDN0Y0LCAweDlCRTA0RUJCLCAweDlGNjE0NDMxLCAweDZDMzdBNUE5LAorMHgyRDBEQjg3RCwgMHhGNjUxMTM2OSwgMHhFMTE1MDczQSwgMHhGOTZDNkFCNiwKKzB4MDRBMTNDM0MsIDB4QkYzMEIyREEsIDB4OTNEMThGQzYsIDB4RjY3RDJFNDcsCisweENBMDg5MTUxLCAweDUxQTZCQzM5LCAweDhDMUZDQTkzLCAweEZCRjJGMkJCLAorMHhBRDBBM0YzMywgMHg4MkFBMjc2NywgMHg4MUJGMjMxMywgMHg3NThBODJCOCwKKzB4RTEwMzc4OEUsIDB4QzAwQzRCNUMsIDB4NUY1MkZGNTgsIDB4QUJBRDM4RjcsCisweERBNjhFRTlBLCAweDlCNkQ0MDVELCAweDgwMzQ0OUQ5LCAweDYxNzhCMzQ1LAorMHgzQzc4NUZCNCwgMHhGRUJBQkU1NSwgMHgwRTI0NThBQiwgMHgwMjFGMEQ3MSwKKzB4MzkyMDFFRDEsIDB4NzQxQjFBN0QsIDB4RTBCMEFGRjQsIDB4NDU2NTJDRkYsCisweDkwN0RBNjc4LCAweDMxM0E5M0I0LCAweDBCMEQ2QjBELCAweDQyQzk2RTQzLAorMHhFRUUzRTdFMSwgMHhFODNDODNFOSwgMHg5MDUyQjg2NywgMHhGOTUxNDI0MywKKzB4NjFGMjBDQjIsIDB4NTdFMUFDNjQsIDB4QzI0NDMxMjMsIDB4NDMyQzk2RDQsCisweDYxNkE4MjRGLCAweDNDOEQxRTA2LCAweDhFNjQyMjJBLCAweDY1QzFBMjFELAorMHg4Njg2MzA4QSwgMHgyQTU3NkEyRiwgMHgxQ0EwRkYyMCwgMHgyQzhGOUQzQSwKKzB4Qzk4QzlDNjksIDB4MzUzMjJBMjksIDB4REZEMzNDOTMsIDB4OTYzNEY0MTEsCisweDBCNEY4RkZDLCAweDNBRUQ0QjAxLCAweEVCQkM3MDEyLCAweEVEMjM4N0VBLAorMHg0OEJGNDJBRiwgMHhENjAzOTlENiwgMHg3QTlCOENBOSwgMHg1Mzg4NjMzNywKKzB4MkRCQjk0MjksIDB4MEE2QUY3NjQsIDB4REU0RDhGNzgsIDB4MUVERUNFRTQsCisweDRGOEVFOTlFLCAweEFGMjNFQUZELCAweDkyOTU1MEIxLCAweDJDQkQ4NjIxLAorMHgyMkE4RkFBMiwgMHhCRTJBMEE4RCwgMHgwNkY3RTc5NCwgMHgxNkUxRjNFQywKKzB4MDkzQUFFQUEsIDB4OTJENDI5RjgsIDB4QkI3OUE3RTcsIDB4NDNFRjg5QkIsCisweDBFMDk3NTExLCAweDc0OEU2OEIwLCAweDMyMkMwMEFDLCAweEE2MkVGNDJBLAorMHhEMDNCQjhCQywgMHg5RkY2NzgxMCwgMHhERTI0QkYwMywgMHgxNDBDQTZGRCwKKzB4NjhGMTZCNDEsIDB4MUI3QzY4QzcsIDB4MzI2NDYzNDIsIDB4QzVFNzE0RjgsCisweEVGRkZEMkI4LCAweDI3ODQzNjI4LCAweEY4NDQ1RjUxLCAweEI5RTg1MTlCLAorMHg4RUIwMUQwNCwgMHgzNTZGQkYyRiwgMHgzMkU5NkJBRCwgMHg2QTYyOUJERSwKKzB4NTIwNjMzMTMsIDB4MjAwMDY5QjAsIDB4RTE2MUNGNzEsIDB4ODRGQjdBMTIsCisweDE4MDVBREMwLCAweDgwRjc1MDEyLCAweEZFOUU2MjlFLCAweDkzMzk1QzMzLAorMHhGRjA3NUE5MSwgMHhCNjFFNDZCOCwgMHhDQTlGRTdDOCwgMHg5N0RDQ0JDQSwKKzB4Q0VGRkI2RjgsIDB4MzBFRTc5ODUsIDB4MUZBQkM4MjksIDB4MjBCM0Y1N0IsCisweDI3MDQyQjA3LCAweEUxMkM1MTUxLCAweDIzNDgyQjhBLCAweDdCOUI4RUIyLAorMHhDOTk3RkVCMywgMHg3NkFCMjQ5NywgMHhENUNEQTU5MCwgMHg5RUJFOTBGRCwKKzB4RTM3MzJCMTgsIDB4RkYyOENFQzksIDB4QzY1ODIzMjAsIDB4NkVGMTA2RkEsCisweDhFRDc0MDIzLCAweDFBMEI2OUU1LCAweDRBOTVERDkxLCAweEI0MUFGODJDLAorMHg4M0RGNjlEMywgMHhDNTQ4ODYxQywgMHgyRjYwQkE5MywgMHhGQzgxNTk4NCwKKzB4MUE4NDhCNjcsIDB4MUVBRTg3QzQsIDB4Rjc0NzkxMDMsIDB4OEUxNkRCNTEsCisweDA0MEI5NUI5LCAweDJBOURCODEyLCAweDk4N0FGQ0QxLCAweDg2NkRGNDEzLAorMHhCRjk1NThFRCwgMHhBQ0YxQUYyRiwgMHhBNjUzMDVDQywgMHgxNjgzMzZGMywKKzB4MUU1OUI5N0YsIDB4M0Y5RjQ0N0MsIDB4M0Q1NEIzMEQsIDB4RTkzOUQ1OTgsCisweDM2QTQwODg1LCAweDAyMzk2Nzk0LCAweEVCMEYwQTY3LCAweENFQUVBMTJGLAorMHhDNThCNEFDOCwgMHhFNkQ0OTc2MCwgMHgwRjhGMjc3NiwgMHg2NkE4RjQzNiwKKzB4MzFCQUNEN0QsIDB4Mzc2OTkzREUsIDB4MzJCRDA0MzEsIDB4NjhCREM3MjgsCisweDYzRUE2NzQ4LCAweEU2QjAwRTI5LCAweDc0NDhDQUJDLCAweDQyQTY1MTdELAorMHhCQjEzMTNDNCwgMHhBMDREQzhGRiwgMHgzRDQwMjIzNywgMHhBMzgyNjQ1RiwKKzB4NTJFRDU1RDYsIDB4OTJEN0Q3QjcsIDB4NTQxMjMwRkYsIDB4N0FGQzA0MjAsCisweDNEQzQ2MjRGLCAweEQ5QjIxOTNELCAweEE3M0I5NzA0LCAweEJCREUwRkYxLAorMHg5RUI1NjYxNSwgMHg4QUIwODBCNiwgMHgzQzREOEUxNCwgMHg1MDAxQjQzRCwKKzB4MUVCRkFBMjMsIDB4RDRBQUNEMjcsIDB4Q0ZBQUI0QkIsIDB4NkZGRUU2MUYsCisweEFFNUE3NDI2LCAweERCOTQyOTQ5LCAweDQ1MkMwQjE2LCAweDczOEUwNjM3LAorMHgzNkE1MTIyRCwgMHhGRjFGN0E0RSwgMHg3NDNEMzVDRiwgMHg4NDdENTRBOSwKKzB4NDJDM0VBQkEsIDB4RDQ2NzI4QzUsIDB4MzBCMjcwOEQsIDB4NEY2QkUwQkMsCisweDNDMjY3OTBELCAweEIwQjY3QzhBLCAweEVFMDdFRkRDLCAweDlFMzgwNjExLAorMHhFQUQ2ODA0QywgMHg0RUY2NjAyNCwgMHg4NDU5QUUzOCwgMHgxREVBQUZGQiwKKzB4Rjc2NTczQUUsIDB4NkNCMUM4RjAsIDB4RkZDQzI2N0UsIDB4MjZBMjE1RjcsCisweDBCMUEwNTdDLCAweDdEQUI5Q0I3LCAweEQ0MEJDQkE5LCAweEU1NjFGOUZFLAorMHhBNDQwMTNBNiwgMHg3QjIyQzBCOSwgMHg5OThBOTIxRiwgMHhCRDI1MjQ0QiwKKzB4MTVFMDdGRUQsIDB4RjE1QjJFMzEsIDB4NTRFODAwMTYsIDB4QTEyQkNFN0YsCisweDY1OEEyMDkzLCAweEI2NDJDNDdCLCAweEQ3MzFGQzAwLCAweEMwMEUzMDJELAorMHg1NUIyNTFEQywgMHgzNDI5MzlFQiwgMHg2RUFEQjJGNywgMHgwQ0Y5MzMxOCwKKzB4NjFFQkQ4NUEsIDB4OTlCNzE1RUYsIDB4Njc5QzhEM0EsIDB4OUNDMUI4MDMsCisweEFCRUY5NTVFLCAweEI4Q0ZGOUQ0LCAweDcwN0E4MzlGLCAweEY1RDAyQTdFLAorMHg1OUUwRDkwMywgMHg1QTQyNUUzQiwgMHhCQjYxMTYzQywgMHg5NkVDRTlBQSwKKzB4Nzk3QjgyQUEsIDB4QTlGQTZCQjYsIDB4Nzk3QzAwREMsIDB4QzFDMUZDNEMsCisweDhGN0ZEQTY2LCAweDc3OTAyNTE0LCAweDZEMUI4NDNELCAweDRGODgxRkE0LAorMHhDMjRBRDYyNSwgMHhCQzIzN0E0NSwgMHg5QTJFMEY0NCwgMHg4MkZBQTNGMywKKzB4RDcwRTM0ODksIDB4NEYyQjM0MTcsIDB4NjVDRjY1RTQsIDB4RUFBRTZBOTMsCisweDRCRUFFQzJDLCAweDQ5MTg3MjNELCAweDdEOEYzMEI0LCAweDc3MDZGNTlBLAorMHhDQjJBNzQ1MiwgMHg1MDgzRDJENiwgMHg0NzI0QjQyNiwgMHg4NEVCMTVEQywKKzB4QkFBMkM2Q0YsIDB4NzFGQTk4NEEsIDB4RERGN0EzREYsIDB4QjExNUJGMUEsCisweDI1OEFGMEUzLCAweEExNjM3RDg3LCAweDAzNTg1REY4LCAweDVFQTRCODBELAorMHg4NjQxRjMxOCwgMHg2NkVFMkYyNCwgMHhDODFFNTA1RSwgMHg1RTY0MDYzOSwKKzB4REI3NzM5QjgsIDB4MUEzQjg2MUYsIDB4MEY1RUNDNTEsIDB4QjIxQzAwREQsCisweDY4MEZGMzBCLCAweERFNjk3NDY4LCAweDU3QTQzQjMzLCAweEQ3RUY2QjNCLAorMHg0QkZDN0QyNSwgMHg3MTBGMDc1MiwgMHhBQkFBOTc1MiwgMHhDRkNGRDg0RCwKKzB4M0JDQzFDREMsIDB4MjM4MUM1MjQsIDB4QjYwQ0FEOTIsIDB4RTA1QkMxQUEsCisweDJCODg3RDg4LCAweENENDU2NkM1LCAweDBEMjk3NkU3LCAweENCMDAwQTJDLAorMHg2NjdCRUNGNiwgMHhFRkM3RjIyMSwgMHg3QTc1ODREMSwgMHhDNDFEOEIyRSwKKzB4RDlCQjdEM0YsIDB4N0NFQjU2MjYsIDB4N0Q4MTY1QTAsIDB4RUUxNzhGOTksCisweDNFOEE4Q0I3LCAweDY5M0Q0NTAxLCAweEIwRTIyOEE1LCAweEQ1NUI3M0MxLAorMHhBRjkwNDNCRiwgMHg2QzYyN0EyQywgMHg3QjlGNDkwQywgMHg3RUE2MTg5OSwKKzB4OTJCOTgwQUYsIDB4NkQxM0M3NTgsIDB4MkMwMDdDNzMsIDB4NzQzMzZFMEQsCisweEEzOUYxM0FDLCAweDUzM0YwNUQ3LCAweDc1NTM2Q0ZCLCAweDk3MDhERTI3LAorMHhFMkExNEU4NywgMHgzNjY3M0ZFRiwgMHg3MUJBNjU0RiwgMHhCOThDRDJGQywKKzB4MjdGMjlBNkUsIDB4ODI0NzgxNzEsIDB4MUMyODE1RjAsIDB4OEE4RjQ1NDksCisweDA0OEE4RDlCLCAweDdDRUU1MUYyLCAweEExNjQ4QUMzLCAweDAwNEY4QjhGLAorMHhCNkZFOEVGMCwgMHg2RDEwQTBBMSwgMHhBRDdBMjREOCwgMHg3NTAzOTcxNywKKzB4OTc4NDc3ODYsIDB4Mjc5MUNDMDUsIDB4NjkzN0ZENkYsIDB4NjBGOTgxMTUsCisweDVGQUI2RDM1LCAweEMwNTUwQTcwLCAweEMwRjREODE3LCAweDdCNUJGRERCLAorMHhFRjYzQjREMiwgMHg2Qzg3QzZDNSwgMHg5NTZENkI4NywgMHg2OTE3OTI1NywKKzB4MTA5NzNDOTAsIDB4OENEQkU4NjAsIDB4QzdDNzYxRUUsIDB4RjgyM0UzNEUsCisweDZGQTJDRjNCLCAweEE5MDNBQkNCLCAweEM4MkM5QjAxLCAweDYwRkU5NkU2LAorMHhFNUVDMzNDMCwgMHg3M0EzMDExQywgMHgyQTFCOTA1NCwgMHhDRjE2RjkyRCwKKzB4NEZBRjZDQzgsIDB4RDlERDc0RkUsIDB4QjNDNjM5RUQsIDB4M0Y0N0FGNjMsCisweEM4RTk5RDEyLCAweDkyRDk1OTg2LCAweDgzNUFDQTZGLCAweEQ1MjkzMEEyLAorMHhDN0RENTRBNSwgMHg2MTdGREQxNSwgMHhFOUE2RDI5NSwgMHhGNTZDNjA4NywKKzB4NzgxM0I2NjIsIDB4MUY4RUEyNDQsIDB4MUNERTNCQUQsIDB4NThGQzBGN0IsCisweDAyRTMxQTVBLCAweEE3OEVBQzc0LCAweDEwQzA2MTA3LCAweDIyQkEzQzYzLAorMHhGODRBRDIyNCwgMHg2QThCRjY2QywgMHgyQTVDQUFDNSwgMHg4QURDM0ZCNSwKKzB4OTY4MzQ1MUEsIDB4MUI1MkZDQjQsIDB4OTU0OTFCQTUsIDB4RkU2QzM3MTMsCisweEU5MDk4Q0VGLCAweDczQzAxRUY5LCAweDZFODVFRjFBLCAweEVFMTg5NzQzLAorMHgyRTlFNTI4NiwgMHhDMUZBQTY2NSwgMHhEODYxRTM4NCwgMHg3MDFDODM0RCwKKzB4REM1Q0E1Q0MsIDB4NTJBM0E2QzQsIDB4RjJBRjJDNDMsIDB4QzM3QzY0NjUsCisweDZFOTRBRDY5LCAweDk4ODA4QUY0LCAweEVEOEE5OUYyLCAweDM3NzI1N0QzLAorMHhFNjBGMjA5NiwgMHg2MTVFRkNCOCwgMHg2N0EyQkIzQSwgMHhCNERERDQwRiwKKzB4MUQ0N0Y5MTgsIDB4ODZGNzdENkUsIDB4RkQwNUQyQjgsIDB4RTE4QzMzMEMsCisweEE0ODI2MEE0LCAweDU2MTVCODNCLCAweEJDRDdEODU1LCAweEY4MDczMjE5LAorMHg4NjIyQkI4OSwgMHhEMzVDRTA1QiwgMHgxNzE2MjQ4MywgMHgxMzdCREI2OSwKKzB4RUNEMEYyMjYsIDB4NjFGODk4MkEsIDB4M0MxMEFCRDQsIDB4MkYzM0FCRjQsCisweDkzNThCNTQ3LCAweDU4QjI3N0E3LCAweDkyNDU2QTdDLCAweDQzODRCNDlBLAorMHg1RjFGRjBFQywgMHhBMTUzRUE0RCwgMHhBOEU0OTEwMCwgMHhEM0E3NTcyMywKKzB4RDFBREM2MDYsIDB4NzZDMzE0QjcsIDB4QkM2QUIyMjcsIDB4MjU3MzEyQUYsCisweDhCNkFBMUUzLCAweEQ4N0ZGNUU4LCAweDJCQUVEMzczLCAweEM4NDhBQjYzLAorMHhCNzJCMUU1RSwgMHg3MzBBNzNEOCwgMHg0OTE1RTVCNiwgMHhERjdENzdBRCwKKzB4RUFFMjQ3RDcsIDB4OTU1NkREQTgsIDB4REUwQzlDNDcsIDB4QTRFMzI5NkUsCisweDMxRjVCQzk0LCAweDA1MjU4QjI0LCAweDI4MzczNzRGLCAweEM3RTRDODFCLAorMHg1QTFBQzgxOSwgMHgwNjgwNzRBRSwgMHhERjg3NjczMiwgMHhDMDE5MkVGOSwKKzB4N0ZGRDg0RDgsIDB4RkYxQ0UxNDgsIDB4ODIxQjRBQTMsIDB4NTY2NzQ4MzgsCisweEY5QTE0N0Y0LCAweDE4MkVGNThCLCAweDE2RTE3MTc0LCAweERFMjcwMjlFLAorMHg4QkVDNTVBRCwgMHg0MDY0NkY4OSwgMHhEQkZGOTJGQywgMHg5RjI0QzAxNywKKzB4NzExRUFEMTgsIDB4QTY2M0UxRUYsIDB4RUY5MkY2ODQsIDB4NEJEMDVFNjcsCisweDdFMDg5QjEzLCAweENCRjYxOUJFLCAweENFQkVGMjMxLCAweEM5NDc1ODZDLAorMHgwRjUyNkM0NywgMHg2NjcyNjAwRiwgMHhEQUFCNjNERCwgMHg5NTBENEZEMCwKKzB4MTk5QzNFQzIsIDB4MEYyMDFDOUQsIDB4MDZCQ0M4RDMsIDB4QTc2NzJDNkQsCisweEIzOUM3RDBDLCAweEM3NEIwODA1LCAweEM5QkJEMjQ5LCAweEFDREQ1Mzk2LAorMHhBQjdCREY4RSwgMHgxMjAxMkI4RSwgMHg2NzIzNjA0NywgMHgwQUUwNzQxQiwKKzB4MUQ3NDdFNTYsIDB4N0VDNkMwMEMsIDB4RDA4RTgzNDEsIDB4QjBBQkRBRDYsCisweDRGQTRCREY2LCAweDkwQ0U4RDBFLCAweDZFNzM0MTE3LCAweDNFRjkxOTJFLAorMHhBQ0EzMkRBMiwgMHhGREI5QzU4RSwgMHgyNTY2MjZCNSwgMHg1RUE5NjFCMywKKzB4RkJDMTU3NzYsIDB4MzY2MDJCNUYsIDB4RjhEMDg2NDQsIDB4NUI2OTNDMjMsCisweEM2MkVBM0IxLCAweEM2NjRDN0MzLCAweDczQkU4ODU5LCAweDE3RjQ0RThGLAorMHhGOUI4RDkyMywgMHhEMTY4QTNBNSwgMHg2Q0NEMTEwQywgMHhEMzUzMTgxRiwKKzB4QzBFNzc0RUMsIDB4NUY5RTEyN0MsIDB4NkM4MjQ1MTEsIDB4RkRBMTM0OTQsCisweENCNTg4QkE2LCAweDQ3MTQ4Njk0LCAweEFCODc3RTg3LCAweEU5N0Y3NTdCLAorMHhGNTREMEEyQSwgMHgwRkUxMTg5MSwgMHg1RDg3NDdGQiwgMHhFNzgwMEM3RSwKKzB4RUY5NjI5OEYsIDB4NDAwRjQ1OEEsIDB4RTJEMDQ1MTgsIDB4NEI0RTZFRkMsCisweDlCMTUwMDJDLCAweDNDRTFCNTM3LCAweEY1QUNCOUI4LCAweDY3MDMwNjQ3LAorMHg0NzVGRDE0OCwgMHgxRTAzQTQwQSwgMHg4OTZDN0MwNSwgMHg4NUY3MEI2OCwKKzB4QzU5MENBODQsIDB4NTNCNTQ0MEUsIDB4MTQwMEY3OEYsIDB4M0FCRTdGOEEsCisweDE5Q0E2N0ZGLCAweDY4QjU0QTM0LCAweDU1NTk4OEFDLCAweDRBQjE2QjRBLAorMHg3NTExRkE2MywgMHgyNDhFQzlFQywgMHhDMjVBRkU0RiwgMHgxOUY1NzhFMSwKKzB4RTkyQUYwM0QsIDB4QUY5REUxOEYsIDB4Mjc5OEM3QTcsIDB4NkI0Njk5MEYsCisweDQxRDQ1ODk0LCAweDc0Njk2QTBBLCAweEM2QUFGNUY4LCAweDcyQ0MxMEUwLAorMHhEQjlDQTI4MywgMHhENkJCRDBGMywgMHg1OEVBNEMwNiwgMHhERUE1RThCOSwKKzB4MTkwOEVCREIsIDB4OTVEMzNERDUsIDB4MjBENzAxM0MsIDB4RTcyNUMyODIsCisweEZENDhDOTJGLCAweERCQkE3RDE5LCAweEM3QkVCRUE5LCAweEIxODZCNzk5LAorMHhERDBERDE3QiwgMHhEODA5MEE0MSwgMHhGOThCQzIwQiwgMHhERDdFNEI5RCwKKzB4RUJBRTQyNDcsIDB4NDM3NkZEQzQsIDB4N0YzRUZBQzYsIDB4QTlCOUE5NTEsCisweDRBRTM5MEM0LCAweDY1MTg2M0FGLCAweDJDRDQyREJDLCAweEMyQTEzOTYyLAorMHhFRjBGQzQ0MywgMHhBRUU2MzI0NiwgMHgwOUI4M0UxOSwgMHhDM0M5NDBBQiwKKzB4MDBCMTI4MjYsIDB4QzBBMzA0MTIsIDB4RkNGNkFCQ0MsIDB4M0NGRTcyMUEsCisweDYyQzFGNEM2LCAweEU5NjNBMzU5LCAweEFFMTFGM0Q2LCAweEU0OTBEMTJBLAorMHhDNDVDOTI4QiwgMHgwNUNDQTc4QSwgMHgxOTgyRTkzRiwgMHg1NzdGODFDQSwKKzB4NjZENTBENkUsIDB4QjRDNzAzMEYsIDB4OTMwOTJDM0UsIDB4MTE4QjA4RkYsCisweDE3ODU0NUI3LCAweEVFRDc0ODM4LCAweEY3RDJDRTQ4LCAweDIzODk2OUJDLAorMHhCOEVGQUVBRSwgMHg3NTcyNkEzQiwgMHhCMUUwMjIwRiwgMHhDNEQ2MEVCNiwKKzB4MEVCQzAyNDMsIDB4NUZFMEQ2Q0EsIDB4MzU0NTZCNDUsIDB4MUY2NEFDMkEsCisweDU4NDg0QTFGLCAweDJBMTE0NTVELCAweDMzQkM0NDAzLCAweDU2RTRFNjJELAorMHg2MEI0MUUyQiwgMHhEQjY1RDNGOCwgMHg3RUMxOEQzNCwgMHhGNTc1REM4NSwKKzB4NkUwQjk5OTUsIDB4MUMxNEM5MUUsIDB4QjJBOTQ3MTgsIDB4QUVDNEE4MjMsCisweDk5M0QzNzRFLCAweEYxRTQyMTBCLCAweDhDRkNDMDNBLCAweDk5QkQxQzI4LAorMHhBOTI4RTNGOSwgMHhCQjk1N0QwRSwgMHg3N0M4NjVFRiwgMHg3RkY1MEE0NSwKKzB4NDI3OUE2MzgsIDB4RTYyOEZGQTEsIDB4QkNDQTE3MUUsIDB4Mjg0QzlDRUMsCisweEE0NzZFMzQ2LCAweDdFMkY5QzA4LCAweEJGNjUwNDRGLCAweDVCN0MzRDVCLAorMHg2RTYwRUU1RCwgMHhGNUM5OTUwOSwgMHhGQTM1MkI3RSwgMHg2RkRFOEU4QSwKKzB4RjIzNDBGRTEsIDB4REY1NDJCNkMsIDB4NTEwQ0IzMEIsIDB4MzY3RTcwMTYsCisweDE5OEEwQTk1LCAweEE0REY1MDhFLCAweDU5M0MyMzM4LCAweEIxMkJDREUxLAorMHg1NTRBRDNDMCwgMHg0RERBQjFDMSwgMHhEMkJEMTg1MCwgMHhGNkUxMjZDQSwKKzB4Rjg3Mjg5QzcsIDB4ODZFQzkyQTUsIDB4NEUwMzM5MDYsIDB4NTJEQzVGM0YsCisweENDNkUyRTU5LCAweEZGNzUxNzUzLCAweERGOEI4QkEyLCAweERCRjU5NTRBLAorMHhCRDM2NzQ4OCwgMHg2QTBDREYxRiwgMHg0MTAzMTM5QywgMHhERTQ5REJCMCwKKzB4NUE4NDI4RjQsIDB4QTI2ODcyQjEsIDB4OTZCRjcyMDMsIDB4OTlENUU3OEUsCisweDI0Mzg1MEE2LCAweDM4OURBRDgwLCAweDYzMzVEMzNGLCAweEVDNjdCMEE1LAorMHgwMjlDMENBOSwgMHhGNUY2RjZDOSwgMHhERjU3NEMxNSwgMHhFNkQzRUMyOSwKKzB4MUFBMzQ5QkEsIDB4NDUzRTcyNTgsIDB4N0RCNzlCRTMsIDB4NTFGQ0E3RjYsCisweDJCNDJGQ0E1LCAweEJGMEU0ODcxLCAweDU4MDYzQzQwLCAweDE5MzU4MEUyLAorMHgyNTYwNTMyMiwgMHhCQzQ5QzQ3OSwgMHgwRUQ3MEZDNCwgMHhBNzhCNTlBMCwKKzB4RTZDRTNFOEMsIDB4OTJFRTY1N0EsIDB4NjNEMTI1MjksIDB4Rjk1REFGNDUsCisweEY5MkMzQkYzLCAweDdENTE0MjAwLCAweDY5NERGODRBLCAweEVGMTc3RTJELAorMHg0RTExOUNDRiwgMHhBMDI1QzU1RCwgMHhGOTY5NzRENiwgMHgyNkQxM0U3RiwKKzB4Nzk5QURDMjcsIDB4RDc5MjVFQzEsIDB4OEFFNjBCRjcsIDB4RjlFRjFBMkUsCisweDg5RUFERDNBLCAweDlDMjhDQUNGLCAweDYzMzc3RUI3LCAweDZEMUVGN0U1LAorMHg2NTg1QjE2QywgMHg5OTcyRDExNSwgMHg2NUY4RjVFNiwgMHhGOTNERUNCNCwKKzB4NkQ3MTYwNUQsIDB4QzZGREJDQjgsIDB4RDkzN0JBMzEsIDB4Q0VENzI3RUUsCisweEMzNEM1NjA1LCAweDI1RkE3MEI2LCAweDVDMEI3RkIwLCAweDhGOTM0MEY1LAorMHhBMzM3NjY5MywgMHg0NDk4QjY2QSwgMHgyRDIxRjM3NywgMHhDMEE0QzZFQSwKKzB4MDc4MDczNkIsIDB4RjQyRDdGMDcsIDB4RTU2RDQ3RTUsIDB4QjQ4QzI1RDYsCisweEE0OERBMERBLCAweEZFNjk2OTNGLCAweEYwMUUxOUNBLCAweDhBMEM1QzhGLAorMHhERjcwMkMyMywgMHhFMThBOTNGMCwgMHhENEQ1QzkxRSwgMHhEMkE3MDZGNywKKzB4Njc0RjlFMjgsIDB4QUYwRjgwQzcsIDB4NjQ4RDQ5RTgsIDB4NkJFODY0MEYsCisweEY1RkNGRkQ1LCAweDhFREMzOTFFLCAweEU1ODNEOEJDLCAweDg0MjZDMDkwLAorMHhGNDU2QTI3RCwgMHgwNzI0OUJGNCwgMHgwNTRBMkY0NSwgMHhBQzQ2QjczQiwKKzB4Qjg5RUVERkIsIDB4NDhFQUY4NjcsIDB4NjlCMkQ3Q0MsIDB4Q0EwQ0EwRjEsCisweDM4Q0QwNDI4LCAweDAyOTgwOENGLCAweDg2RUU3NURDLCAweEY0RkVFOUYwLAorMHg2OTg3RDVFOSwgMHg1NkFCNTUzNywgMHgzREREMDk0MCwgMHg0NzQyRkY4OSwKKzB4MkMzQjE3OUUsIDB4RDA1QjVDQjEsIDB4M0M0RTkwMzMsIDB4NkJDRjAxNDEsCisweEYyRjZEM0UyLCAweEFEMjk3QjFGLCAweEIxQ0MyM0Q0LCAweDU0NTIwMzhCLAorMHgxNzUxRkNCRSwgMHgyNEFBNDY1RiwgMHg5NEM2MkQxOCwgMHhGNDlCMkVDOCwKKzB4OTdBQzQ3REYsIDB4RDY2QzE5QjUsIDB4MDlBQUIyOTcsIDB4ODk5MzYxNDQsCisweEQxNUMwMjZCLCAweDRDRUM4Nzc4LCAweDk0MDUwRDYxLCAweEQ4MTJFOTZGLAorMHhCNkJEN0IxMiwgMHhBNUY5QkU3NywgMHg1MzFBNUM3QSwgMHgzNjA1QkE3MSwKKzB4RDUwMENFNTQsIDB4RTMyNTk2NEMsIDB4MzIzNDMyRkUsIDB4NTgwQTlEQzgsCisweEQyNUEzMTM1LCAweDA4OUQ2QzlDLCAweDU4ODU2RjczLCAweDdERkNFRTMwLAorMHg3REUyNTgwRiwgMHhGNEU0NDg4QiwgMHg3MTgyMURERiwgMHhEMTk0RjVEQywKKzB4N0QwNzAzOTQsIDB4QkEyOEJGNzYsIDB4QUFGMEEzOEUsIDB4RDRGNjI3NUUsCisweDFCNzQyRTY2LCAweEQ5RTY4RUE5LCAweDY4QjBGOTM5LCAweDUyQUY5RDdCLAorMHg1NEEzOTcwNSwgMHgyMEY4NDRDMSwgMHhFNjk4MUREQywgMHg4MDMyMkU2MiwKKzB4NTM2MjM1QjksIDB4N0E1N0Y0RkMsIDB4MTRFQkYzNzYsIDB4NjRCRTJFNUEsCisweDcwQTE4OTEwLCAweDBGRTA5NTg3LCAweDEwRTlDQTc4LCAweDhGOTBEM0QyLAorMHhBRTc0NzE3RCwgMHhBNTQ0RUFFRCwgMHg2NzQ2QUYzRSwgMHg0MzBDQjNGQywKKzB4QkMxODU1NzYsIDB4RUFBMzVEQzMsIDB4REE2MzA5RDIsIDB4NDA2NDNGODcsCisweDY4ODU5MTE3LCAweEExN0FDODRELCAweEQ3OTIyQ0E4LCAweEVGN0MwQkVGLAorMHg4MzMzNzM0OCwgMHg5QjRCMTc5MCwgMHg4ODc2QTc3RSwgMHhGMjkzQzlDNywKKzB4MjBEMzk5Q0QsIDB4QTc4MjI0QkEsIDB4RkQxMjc5QzgsIDB4OEI3ODM3QzEsCisweDBGMURENDE1LCAweEFFM0ZCRDJFLCAweEM0Rjc3QjUyLCAweDUxRTc5RkIzLAorMHg3QTg1NkQ5RCwgMHgxNEJGREFENywgMHg5OTNGQjYyNSwgMHg2NjdDNjVFRiwKKzB4MzJGODMzMzgsIDB4QUEwNkVEQ0UsIDB4QUNFN0EwOTksIDB4RDI2REFFODksCisweERDNjg5MUNFLCAweENEMkY2RjA0LCAweDI3NDI1RkI4LCAweDdDMzAxRDhELAorMHgxRURFQkUxQSwgMHhCRTU0MEFGOCwgMHgxRDM1NkM2QSwgMHg5NjNFODYzOSwKKzB4OTkyMENBNTUsIDB4REVGRTVGNDQsIDB4MTA3RDU1NDUsIDB4M0QwNzlCRTQsCisweEVGNjczRjY2LCAweERCM0MyOTU0LCAweERENzZENjY2LCAweDFERkJFRjU5LAorMHg4RjM4NEIzNCwgMHhCRTZGNzczQywgMHgwNzlERDE4NywgMHgyMzE0QUM4QiwKKzB4NUZFQjAxMTQsIDB4NTlFODVDRjMsIDB4OUJGRTkxOTAsIDB4QjM2MEEzMUIsCisweDRGN0VGOTY3LCAweEZFQjBENTYxLCAweEJGRTc3OUYyLCAweEYzMzcwMkIzLAorMHhCQjI2MzQxNywgMHgwOTYwN0M2NSwgMHhBODc3RjEwOSwgMHhCQjQzQ0ZGMSwKKzB4NEExOTBEQjIsIDB4OUI3QkQzOEYsIDB4QUVCN0M0NDksIDB4M0RCM0E0NjAsCisweDdEOTI4NTIyLCAweEQxOEFDOTY2LCAweDE4N0ZFNzY2LCAweDk3NjI5NzkyLAorMHhGNTlENTA2RSwgMHg2RkJBMjAyQywgMHg3NzAzNUZGMywgMHhEQTA2OENERSwKKzB4RTE5NTc3OUEsIDB4QUVCOTIyOTgsIDB4RDJBNDRFREQsIDB4MTI1NzdEODUsCisweEEzQjQ3QjlFLCAweDVCRDA3Q0I3LCAweDRCNkFFM0ZDLCAweEJFMzVCNkUyLAorMHg5RDdGN0FGMiwgMHg5QTM4RUE3NSwgMHhEODdGQjA1NSwgMHgzMzM5RjJBMywKKzB4RDdDQjgyQjQsIDB4MzU3NzIxRTQsIDB4QkVGNDY1NTMsIDB4OURFMjhDQTMsCisweDFCMUVDMkRGLCAweEUyOUI5Q0MwLCAweEVGQUUzNDdFLCAweEU1ODY0OTE3LAorMHhBMDk3QjcxMiwgMHg2QjY3MDQxRSwgMHg1QjI5NTQyRiwgMHgwMUQ5NkVFRCwKKzB4RjlBNkRDMDcsIDB4QzBCNUUzRjAsIDB4MjFFMTg5OUMsIDB4RTkzNzNBODYsCisweEYzMTc2NTA5LCAweDk1MDg0NEEyLCAweDdEMjRGRkVCLCAweDVEQzBCQ0EwLAorMHhDNDQyQjdDMSwgMHgzN0RDNkVDMSwgMHhDNjVDOEJBNSwgMHgxOEYwRkE4NSwKKzB4MkFEODBEMkQsIDB4QzY4Q0RDQkIsIDB4NkFFNUVDOTMsIDB4RTM5NTVEQkQsCisweDNFODBDNEIzLCAweDUwRkVEMTI3LCAweDc0M0NBQkMwLCAweEQwRTkxNzA3LAorMHg5QkY3RUI0QiwgMHg3QTYzMjc1NSwgMHg5QTE5MjQ4MiwgMHg4RjkyM0U5RSwKKzB4RTJFNzBGRTUsIDB4NUY1MEFBMTYsIDB4MEVDNDk2RDEsIDB4QzZFQzQ4NjIsCisweDA0MEEwMjc0LCAweDJGQzk1MUMyLCAweEY2NUQzQTgwLCAweDhENTg1MTYzLAorMHhDNkI1MjlEMSwgMHhEMkNBRUU2RSwgMHhFM0UxMTJCNywgMHgzMjQ0MzEyRiwKKzB4MUIzOTNFNTgsIDB4MjQ0NEQ1MzgsIDB4QkU2OUFDMjEsIDB4QzkyQTA1MDYsCisweEQxQTc0NDM0LCAweDQ5QzNFQTA1LCAweDBFNTNCMzE5LCAweDM4NDNDRTAzLAorMHg4REI4NDE1RSwgMHg3NjZCNkZDNywgMHg1MTVCOUU3QSwgMHgzQkEwNUIzMiwKKzB4QkZBRkM0NDksIDB4MzEzMDJBNTcsIDB4MTk2MEEyMTEsIDB4NjZBMDk3RTAsCisweEJDNjVBOUI0LCAweDg5RTgzMDY1LCAweDM2RkRCRjJDLCAweERDRDQ2NjRBLAorMHgwRUQ2Q0ZCRiwgMHhERDREQzZEQywgMHhENzZEMkYwMCwgMHhCNkRBNjU0MCwKKzB4OUEzOTY0NDQsIDB4MjhGMTg1REUsIDB4QTBGRUZBMUQsIDB4RjQ3NkUwRUQsCisweEVGMTU1MDVBLCAweDE4MzM2NUJGLCAweDQ4MUZGRDkwLCAweDI5QUJFRTc1LAorMHgxRUM5MEIwNywgMHhDMTBCMjY1NywgMHgwREJGNkREQiwgMHg1MkFEMDJCNywKKzB4RTg3RERCNTQsIDB4RDM3MDQxMDYsIDB4RDRFMkM1OTIsIDB4MENCMkREMDUsCisweDRCQUEyRkZCLCAweDAyNjExMzY4LCAweEQ1MEY4RjFDLCAweDQxNkZGMjVDLAorMHg5QTY5NzgyRCwgMHgyNjhDNjQ3NCwgMHgyRUNENEQ2NCwgMHgxOTZERTJGNSwKKzB4NDdBODU2MUMsIDB4OEM3Q0U2QzksIDB4RDJCMUUyRDIsIDB4QTAzOEMxNjUsCisweDNBQjg4NDRCLCAweDRBNjk5ODMwLCAweDBGRkMwQjE3LCAweDg5QjY4NUFBLAorMHhEQTI3NkQ4NSwgMHhFOTM0QzRDRCwgMHhGNTExMjI2RiwgMHg5Q0REMkIxRiwKKzB4OTRGNzU0OTIsIDB4NTVFQ0VCNDIsIDB4NDJGMEEzRDMsIDB4RDdFQjQ4MkMsCisweEE3OEQwMzczLCAweDYyRjA4OEE2LCAweDdFQ0Y0NjAyLCAweDdBMzQwNEI2LAorMHg0MEIzNjQ5NSwgMHg2MDQ0MURGNCwgMHg2NzIyRjUzOSwgMHhDRkU3NkM0OCwKKzB4QjZCOTRDOUYsIDB4OUFEQjRCNkEsIDB4MUVCQkE2NUYsIDB4NUI1MDgxQUYsCisweEI3NjQ0MjNDLCAweEI2RjkxMEUzLCAweDE0QUM0QjZGLCAweDVDODExRTgyLAorMHhBQTM2RTVGMSwgMHgyNEVDODJBRiwgMHhBMkYxQzA1MCwgMHgwNTA0MzI0QywKKzB4MzA0Q0VEMEYsIDB4MDFFMzFERDksIDB4QzgyRUM3RTYsIDB4RDU1QUZGRjksCisweEZGQjMwNDdCLCAweDMwMDZGMkU5LCAweEM3MjVCQ0QxLCAweDdEQ0MxMDgyLAorMHhBOUEyMkNGOCwgMHg2NEQ1QUY5RCwgMHgzODlDMzRBRCwgMHg3REZGMzdDNiwKKzB4NDFGMTUwOUQsIDB4MTg0NUIzRkUsIDB4MDU1QzIzRjAsIDB4QzYyOTFGNUYsCisweENERDNDN0RELCAweDVGMDM1NkI0LCAweDdGRDJDMzg3LCAweDQ5NEEwOTFFLAorMHg1MEM2OUQzRSwgMHhGRTc2OUE1QSwgMHg2MzkwNDcwMSwgMHg4OTYwQUJGMiwKKzB4RTY4RURGM0EsIDB4MEFCNTdDOEUsIDB4MEI5RDBBNkMsIDB4NTE4ODgxNDgsCisweDUwQzVENTMzLCAweEM2OTAzOEZBLCAweDNBQ0JFNjYxLCAweDBDQUVCNjAxLAorMHg4QzE0QUI2QywgMHhCQTg2RDk0RiwgMHgwNzI0MDU2QiwgMHgwRkVGRkNCQSwKKzB4MTI0NDlEREIsIDB4QUJGRkVDQ0UsIDB4QjEyQTJCRDcsIDB4NzI2MEEwRTgsCisweEJFMTg0QTQ4LCAweENGRDNDQTNGLCAweERGMDg4NjYwLCAweDc4RUU5QjY3LAorMHhBOUVEQjExMywgMHg0RkQ1RDM1MywgMHg4RTM0OENDNiwgMHhENTc4QzMzNywKKzB4RjA0OTNCRTksIDB4Q0NGQjU0RUMsIDB4OUNFRUY4NUMsIDB4MENBQUUxNUUsCisweDM3MUFEMTJGLCAweDlDNUI5MjcwLCAweDI0OTVGMERFLCAweDA2REUyREJCLAorMHg5MTFBRTdFQywgMHhFRURFMzM2MywgMHg2REQzOEQ2QywgMHgyQUY3RjNEOSwKKzB4NTFDOEQxMTgsIDB4RjIzODE4QTcsIDB4OTU0MzhBRUEsIDB4M0E4QTc5OEYsCisweDIzMEQyQkVGLCAweDNEMTYyNzNDLCAweDlDMzZGRjgzLCAweDc4NUM5NTM3LAorMHgzRTQyQUYyRiwgMHgxMkExNjc0MSwgMHhFNThEMERDNCwgMHgzM0VCRUZGOSwKKzB4NkYxOTcyREEsIDB4MTI4QzlCQUEsIDB4ODU4RDYwMzIsIDB4REFGMTg1RTEsCisweEFFMzU1MDY1LCAweERFMDA4NkYzLCAweDBGNjYxQTY1LCAweEY0MzM0MTY5LAorMHhCMTU1OUJBNiwgMHgzODkyMTA5QSwgMHhFOTAzQkEwMCwgMHhBRTBDQkQ1OCwKKzB4MDczQzIxQTAsIDB4RkNBREIyOTksIDB4QjRFMzlBRjEsIDB4Nzg0NzU0NTksCisweEI0NkRDODQ3LCAweERCQTk3NjYxLCAweDE1RDExOEY1LCAweDAxRUQ0OEQwLAorMHg5OUY2NThCQywgMHgzOTlGREM4RSwgMHg0NEQ0QTkxOSwgMHg3QzJDRTRCOSwKKzB4Q0EwMzY3Q0MsIDB4Q0MyQjk4MjgsIDB4MTZBQUNBQTYsIDB4N0FBNUI2QkEsCisweEZFQzc3QzY2LCAweDIzMUIyMkY5LCAweEM4QkUwRDA0LCAweDZGRjI3ODhDLAorMHg1RjlDRUJCNSwgMHg5MDFFQUE1RCwgMHhERTY4MkJCRiwgMHg5OThFNzBENCwKKzB4QkQ5Q0NDREEsIDB4Njk5NTQ0MUUsIDB4NTcwMkYzNjAsIDB4QkMwMzVFRUQsCisweDIwRjYwQjUxLCAweEQ1NzM2MUQ4LCAweEMwNzExMTNCLCAweDczQ0U2Q0U0LAorMHhDNjU2OURDOSwgMHhEMjRCODlFRCwgMHhBNjA1MjI3NiwgMHg4Q0VFMjAyNiwKKzB4RkJGNUI1OEUsIDB4RjY5MkRGODEsIDB4NkI3Q0REN0MsIDB4RjVCNkMwNEMsCisweEVDMUJCQTI5LCAweEQ2QUM4Q0RELCAweDMyMDQ5MUY4LCAweDFEODEyQUM3LAorMHg2MzFCMDA1MSwgMHhEMDhBNEQyQSwgMHg1Njk3NDZERCwgMHhBQTY1M0ZDRiwKKzB4QTkyRThFNzAsIDB4QzU5QTY3MDUsIDB4Mjc4RUExRkYsIDB4NjNFNUZBMTcsCisweDFDMjBFODJELCAweDU1MEY3Q0UzLCAweDU1Q0VENDE1LCAweDVGOUM0QzRBLAorMHg3RDc0NjMxMSwgMHg1QjA3OTc2QSwgMHgxMjQ3N0UzMSwgMHhBQjgxMTNBQSwKKzB4Nzk2RURDRUEsIDB4NEE5MEU0QjQsIDB4QjM2RTYxODgsIDB4RUU3RDVFMEYsCisweDE1Q0VBMDYwLCAweEI4MUFCMkNBLCAweDI5NkQyMkIwLCAweEZBMDc1M0UyLAorMHgwRDBEMTVCQiwgMHhENEFGOEJENywgMHg5NTFGQTU3NSwgMHhDQkVCRDU4QSwKKzB4MEFGNUMzNjIsIDB4OUVGNDNGQjAsIDB4RDk3RTUxODQsIDB4QTE0NDY5QkMsCisweENBRTVENTVFLCAweDkzRDRDREY5LCAweDk1QjAxM0E4LCAweDY5OThGMzVDLAorMHhGMUREQzBCMSwgMHg0NzZGOUZDNywgMHhCNjQ3MkI3MCwgMHgxRDU1QUM1QywKKzB4RjBFMEMwQzgsIDB4OTUzNzJCRjUsIDB4NzVDQ0NEQkUsIDB4OUY5RDIwMDMsCisweENBQUQwRDUxLCAweEVFNTRDQzJFLCAweEU1RUJEQkYwLCAweDlCMjQ4QkIzLAorMHg0QkYwN0QxOSwgMHg1NDI5OTdFOSwgMHgxNzQ0N0M0QiwgMHhDRjJCMjc2OCwKKzB4ODYxMThBNUIsIDB4NTc1NzlGMTIsIDB4QzVDRDlFNzQsIDB4OTdFRDU3MjQsCisweDAxQkQyRUU0LCAweDJBMDQwM0E2LCAweDAxODMzNzQxLCAweEExRThEMzY0LAorMHg0RDFBMkVFQSwgMHg2Mjc2MDM3NywgMHhBMTBENjg2MSwgMHgwOUM2OEUyRiwKKzB4QUI0ODI4NTAsIDB4QUNEMjRCNzQsIDB4NTAzOEM4Q0EsIDB4NzFERTNBOTMsCisweDY3MUQyNUU0LCAweDlFQTdBQzFBLCAweDNFNzI4N0Y1LCAweDlGQzk2M0NGLAorMHg3M0Y5MEFCNiwgMHhDNzc1RDg0MCwgMHgwMEI4NjhEOSwgMHhGNkE5QkUzRCwKKzB4MTdGRkI0NzIsIDB4NUQyMzg5RTMsIDB4MEQ0MkExNDksIDB4MkZBQjEyMzUsCisweDkwQTc5OThFLCAweEQ4OTVGNkVFLCAweDE5OTIxMDEzLCAweEVFNDJFQTQ4LAorMHhDNUQxOUExNywgMHg1NTA3ODkwQSwgMHg5Rjg5M0IyOSwgMHg0RkYzOUYxOSwKKzB4RDZFRjg1QUQsIDB4M0ZGQjE1OTksIDB4RjE3NjEwMTcsIDB4RkM1MUI5MEQsCisweDhGNkM1NjZCLCAweDQ0QkFDN0E0LCAweDJCMkUzNzU1LCAweEFCRUNCOERCLAorMHg1QzRBMTYyOSwgMHg4MzdDQzRGNywgMHgzRTczMkIwQSwgMHg4MDNDRTMwMywKKzB4NzE4NjVEOEQsIDB4MzQ2NjY1QUIsIDB4NThCRjgwOUIsIDB4MTAwNjI2QUEsCisweDk0NDZBQjEzLCAweEQ1M0FEQ0RBLCAweDc1QzBCRkNELCAweDk1ODUzMzA0LAorMHhGNDc1OEU4NywgMHhENkI2NDUxNywgMHgxMzI5M0QwRCwgMHhFQzkzNjhGQiwKKzB4RDQ0OUEyQ0MsIDB4QUExN0IwQkUsIDB4OUQwQjg1QzAsIDB4NzdCRUVEMTYsCisweDc2OTlDQUU3LCAweEM3NzZEMTBELCAweDk2MkQ0OENFLCAweDgzOEQwMEJFLAorMHgyNzlBRUJGOSwgMHgyMkVGODM3QiwgMHg1OEU0NkRBRCwgMHhCNTZCNjMwNSwKKzB4MzIzMkQ1OEIsIDB4MTY3OTY5REIsIDB4NUI2M0Y1QjUsIDB4N0U4MkIxNzUsCisweDA1RERCNDAyLCAweDVBQjI5QkJBLCAweEYzQjYyN0Q1LCAweDk3MTY4Qzg1LAorMHhBRDlFRTAyMiwgMHg0OEYwQ0VFQSwgMHg4NDEwNEMyMiwgMHg2OTBGQ0MxOSwKKzB4Q0EyRjI0NzQsIDB4NzZGOTU1MzksIDB4OUZEMkI5ODcsIDB4NzlFRkM1NTcsCisweENFRTVEQTRELCAweDI3RUI5OEY2LCAweEEwNjI4OTE2LCAweDhFMDU2MTRGLAorMHg4QUM4OTAyNiwgMHg3NzA1MTM1RSwgMHgzRjdFNDJCOCwgMHg3QkNENzczQiwKKzB4Rjk4Qjk3NDEsIDB4Q0I4QTUxNEUsIDB4OTI5ODIyMEQsIDB4NTY2NUZBM0EsCisweEU2NkExRkY3LCAweEFDNEVDQjcxLCAweEE3RTU2RkVGLCAweDlEMUVGN0Y4LAorMHgyMzU2NkI2NCwgMHhCNEZFODIyRSwgMHgxQUE1MzIwOCwgMHhGNDU0NUU1RCwKKzB4RUE4NkM4NzksIDB4MThGNkI3QzIsIDB4RTEwQTE3QUMsIDB4QkQzNzAxMUYsCisweEZCREY4MUI4LCAweEE5NzhBNEVCLCAweEQ0MjQzN0E3LCAweDQ3NEU2QTQxLAorMHhGODg4NTI0OCwgMHhGNzUwQkFBOSwgMHhEMjM4RUE2MiwgMHhENjlCQTc0RCwKKzB4MjY2RUM2QkYsIDB4RTdFREUwNzcsIDB4RThGMEEzMDMsIDB4OEI1NkE5NkQsCisweDQxMzgwOTgwLCAweERERjBCMTZDLCAweDAwRTgzNTk0LCAweEE1MDNFQkY1LAorMHg5NjBBMjU4RSwgMHg0OTk4MjdCRCwgMHg2QzhFNkY3QiwgMHgxNjZDODQ1RCwKKzB4Qzg0MkM5MzQsIDB4QkFFRkM2OTksIDB4RDk4NDYyMTMsIDB4ODMyRUMxOUIsCisweDFFQUQ3NTk5LCAweDIyMUU3RUU5LCAweDgxNzZBMzEzLCAweEIyOEQ4RTM5LAorMHhCQUMyOUE5NiwgMHhCOTY0RjkxRiwgMHgzRjI2ODE1MCwgMHhENEJCNzAxMSwKKzB4MzQ3RUM0NDUsIDB4N0ZEQzlFODIsIDB4RUI3MEY0QzksIDB4QTZGMzhFQkYsCisweDM5OENGMTM3LCAweEQ3Rjg4Q0Y1LCAweENCRERDQjNGLCAweEEwREFGQTc0LAorMHhEMjlEMzBBRCwgMHg4MjJCNjkxOSwgMHhDRTA1OTk0OSwgMHgzQTk0NjE4MywKKzB4REU0QzU3MkQsIDB4RDFFNkQ4NDQsIDB4QzQzQzdEQUMsIDB4REJCRUVERDAsCisweEE2NTZERjZELCAweDQ1NEMyMkE5LCAweDlGQTQ4NzkwLCAweDY5QjA0NTMxLAorMHg5OUJCMzA1RiwgMHg4MDUwMEY3MSwgMHhGRTIzNjNDMiwgMHhCNjdGNTM4RiwKKzB4MzAyRUMwQzMsIDB4NEE2RTM0NTgsIDB4NTdFNENGRDQsIDB4RTY1Q0RBRUIsCisweEYzMUFCQjMxLCAweDYyREY5OEFDLCAweDg5NEFFNzgxLCAweEIxNTg4QUIxLAorMHg0NUQ1Q0MzRSwgMHgzNTIwRjVCMCwgMHhDNzJEMENCNywgMHhBMUQ2Q0JGOSwKKzB4NzQyRkZBNjMsIDB4QTBBNTIyNEYsIDB4NUVBMUM4NUEsIDB4QjgxRTlGNzcsCisweDMxRDc2QzRGLCAweDUyNTI1N0Y1LCAweEJGRjg1MDA5LCAweDIxMjVCMjcwLAorMHgxNkU0N0U2RSwgMHg5MTI4Qjk4MSwgMHgwRDVGQkUzOSwgMHhGNjdBNDE4QywKKzB4Q0YzQzcxQ0IsIDB4QUMwNEFCRTEsIDB4OUI1NTBBQUYsIDB4QjUwNzdGMTgsCisweEZCN0M1RUMwLCAweDY0Nzg0REI0LCAweDFFNjY4QjQ4LCAweDg0NjU5ODM2LAorMHg2MDQ0NTdCRiwgMHhGNkY2OUM4RCwgMHgzOTQzMDFEQywgMHhFRDAyMTFCRCwKKzB4OEJBQzFBM0EsIDB4QkI3NTJGRDIsIDB4NzhCOEMwMzYsIDB4QkNCOThFOEEsCisweDMzQzU5NURFLCAweEIzRjNDNUY4LCAweDY5ODY2NkFDLCAweEExRjQyRDdBLAorMHg1NzUxQUNDOCwgMHhDMDY5NTc1QiwgMHgzNUQ1MEY5OSwgMHhCMjk0QkYzOCwKKzB4ODJBNEEzMzEsIDB4MDUxNDc3NTEsIDB4Q0FFMThDMTIsIDB4OUU4OUFBRjEsCisweDM1MzFDMzcyLCAweEIyMTE0QTg4LCAweDQxNzk3MjAxLCAweERERERFQzEwLAorMHgwMTE4NUYyQSwgMHhERUQ1MENEQywgMHg3MjE1NkJBRCwgMHg4OEYzREI5NCwKKzB4NTA0NTBEREYsIDB4NkIxRTdBQkYsIDB4M0QzMTc3MDgsIDB4RkRGRjVBMTUsCisweERDOEIxNjk3LCAweENDMjI0OEZELCAweEQ5MTk2MjcyLCAweDQ0NDUxOTVELAorMHg1NEQ5MDI4MSwgMHg3QTg5MUM5RCwgMHg2OUZGOThENSwgMHhBREU2RDc0QiwKKzB4MjZEMjc5NzMsIDB4MEYxNDczNEYsIDB4M0Y5NTdGQzgsIDB4ODEyQUM4NzQsCisweEVEQzBGOUI0LCAweEQzMUQ2RDc1LCAweDdBMjYwOEMzLCAweEQ4OTk4NEIxLAorMHhGNTgxMDgxQSwgMHhFREI5REY2RiwgMHgxNkVDQzE5MSwgMHg2Qjk0NTcyNCwKKzB4MUJDRTgyNjksIDB4MDJFNkRCNjgsIDB4NTYzNjI1NDEsIDB4OUQyNDdDRjQsCisweEE1MjY1RTcyLCAweDJDOEI5NDEzLCAweDExNTdEQjRCLCAweDMxNDVDRkIyLAorMHhGQkRFQkNGNSwgMHgxMDQyQjExNywgMHgyODREQUUxOCwgMHgxMDU3NUMyMSwKKzB4MURERTU3OEUsIDB4ODBGNTlFREUsIDB4Q0FCNTFDMDQsIDB4QjU5NEJEQTgsCisweDA4QUNFRjg1LCAweDA4QzhENEM3LCAweDczMDRENDMzLCAweEU4N0QzQTg4LAorMHgzMUNDRkVEOCwgMHgxRDhFNzFFNSwgMHhDNUEyRjAyQywgMHhBQ0JGM0I1RSwKKzB4QUExNjFCQ0EsIDB4QTEwQkU1NzcsIDB4RjlDRTQxRDIsIDB4MkI4NkYwMzEsCisweDNENEE4RDIzLCAweEVEOTI2REU0LCAweDM4NDRFMjFGLCAweEZFNTdCQ0QwLAorMHgzNkRDMzA5RCwgMHgxNzEzNzQwOSwgMHg5RjZBODUwNywgMHgxNENGMTJFQiwKKzB4QTc3MEFGQjUsIDB4N0M2REEyRTQsIDB4ODU2QjQ4QjgsIDB4MkVBMjM1REYsCisweDU1QkQxMTY0LCAweDVCRDlGRjBDLCAweDUyMjhDNTUyLCAweDlFNzE5QUZBLAorMHgzRUMzNzAzQiwgMHhFMDZBOTRGMywgMHgyOTZGRjBEOSwgMHhFNDY4RDlDOSwKKzB4RDJBMTVDREMsIDB4NkM0RUFBQTIsIDB4MkFGM0I4QkYsIDB4NkI2RURDNzgsCisweDQyQjc4OTcyLCAweDRDOTdBNjZDLCAweDE2MUMzMEJGLCAweENEMjgxNkRDLAorMHg0MzFCREExNywgMHhEOTY1MzAyMiwgMHg2N0Q5NUUzOSwgMHhCQ0IxODM0MiwKKzB4MjI3OTgyRTcsIDB4MjNDNUIxMUIsIDB4NTE0NDIwQUIsIDB4MDg5RjNBNUMsCisweDJCMkY4MjQ0LCAweDJGMkE4MEM4LCAweEIwQTkwNTU4LCAweDc1QkFBMjQzLAorMHhFMkZDNEY2MiwgMHhFQjBBNjEwNCwgMHhCN0YyMjFCMiwgMHg0RUNENzlERiwKKzB4QjNFMDhCOEIsIDB4QkEyNUUxQ0IsIDB4RDM5RjM0MzEsIDB4QjUwMjAyRkUsCisweDc4RjE1RUNFLCAweEVGRjYxRUNGLCAweEIzQ0RERDUwLCAweDNGRDA2NEE4LAorMHg5NkIwMjhCQywgMHhCMjlERDRFMSwgMHg3RTlFQzYyOSwgMHhDNDA3RjREMSwKKzB4OEMyMTc4NUIsIDB4RTExNzY3QkEsIDB4Q0ZFNkRFMjYsIDB4MERBOThFMjIsCisweDMzQUM1NjcwLCAweDBGREJDMTc1LCAweEYxMUY4RUY1LCAweDYwNjM4ODQzLAorMHg4QjY3RTU1QSwgMHgzRjI3Rjc1QiwgMHg2NjkxRkI5OCwgMHg2MzVBMzVBOSwKKzB4QjMxNzQ1OUMsIDB4RTc0MTlDMDEsIDB4OEJBQjI4RDcsIDB4RTM0N0Q3OTEsCisweEVGQzAxOUEwLCAweDQ1MDA5MDQxLCAweEE2REVCM0U4LCAweDZGNzM3OUZGLAorMHgwRkY1MDM5MCwgMHg4MTBCRUU3OCwgMHhBRDEzNzE2QiwgMHhBN0RCRDdBQiwKKzB4RUY0MzlENEIsIDB4RERBNzQ0QTUsIDB4MzFFRERFOEQsIDB4QTg1QjcxRjIsCisweERGNDM5QzcwLCAweEE3RTNEQTk0LCAweDUyNUVENDUzLCAweDNEOTEzQzMyLAorMHhEMTA0Q0U2MSwgMHg0MkY1RkZFRCwgMHgxNEM3NjI1QSwgMHg0RTVCMzE0QiwKKzB4QTdFQUQxRUQsIDB4RkEwMUQ1OTUsIDB4RTY3QkNGMDYsIDB4RTYzNjg1RTIsCisweDNBMzJFOUQzLCAweDM3NEMyNUYwLCAweEE4RThBNDFELCAweEE0MDNBRUY1LAorMHg5MDFBMTk0QywgMHgxNzYwNUJDOSwgMHg4NTIyREQxMiwgMHgyNzA5NkJBQSwKKzB4MDE3NDM0QjcsIDB4OTlDOEQyREEsIDB4N0Y5NkIwNjgsIDB4ODUyMUNEMDksCisweDUyOUI0NkQ2LCAweDQ3ODUyODEwLCAweDAyMUJDOEJGLCAweDkzQzk4MzI5LAorMHg2RkU3M0E3OCwgMHg0NERCNjlBOSwgMHhDODM5RDQ5MCwgMHhDQUM0MkFGRSwKKzB4Q0YxRUNDRjQsIDB4NkYyRTVGNDQsIDB4Nzk1QzgyMTksIDB4QTA2QzY2N0IsCisweDgwNDExRjMxLCAweEIwOTkyNkUxLCAweEM2MkI2QzE4LCAweDc3QzZFNkRELAorMHg3NjIyRkMwNywgMHgwMjE2MkRCMiwgMHgzRUEzMTMzNCwgMHg2Q0MwMkI0QSwKKzB4QUE2QjgxQzMsIDB4NDQyNEE5QTUsIDB4MjZCRDJFRjMsIDB4MzM0ODk2RDYsCisweEFEREQyNzExLCAweDc2MDM1NzU3LCAweDgwQUEzMjhFLCAweDJGMzlDMDZFLAorMHgzNTc1MjBDQiwgMHhGNjJCREY0NiwgMHhDNTkzNDNDNCwgMHg3Q0E0Q0FFMiwKKzB4ODlCMDNFRjMsIDB4MjUxQTc4NUIsIDB4QTQ3NTVCQjksIDB4MjYyRDQ3OEQsCisweDQ2MkU2MjUyLCAweDZCNUY2QkVELCAweENBNDZFNzdCLCAweEEyQ0YwOEFELAorMHg1NjFFMTlFQSwgMHhCRjMxQUExNSwgMHhEMzc2RjQ0QywgMHhDQzMzMjE1MCwKKzB4OEMwQUVFNDIsIDB4QzA2RDVGOTEsIDB4REFERjg2MTMsIDB4QkUwRkEyMkMsCisweEY1MEFFNDgyLCAweEUzNjE1NTAxLCAweEVDQzhENUFBLCAweDU4QTdGRDNFLAorMHhENTlCOENDOSwgMHgwOURCMDk4NywgMHhGMUQ5NzUzRCwgMHg5Qzc5RTIwRSwKKzB4OUEyMjJBRUEsIDB4QzRFNTg5MTQsIDB4NjcxMkUwQTIsIDB4OENENUM4MEUsCisweEVBQjhBQTU2LCAweERCRkE4RDlDLCAweDM1MTVCRDIxLCAweEI2NUI5RTBDLAorMHhGMEQyN0ZFRSwgMHhFMzM4NzFDMSwgMHhFRThGRTUyRiwgMHgwMkFDQ0IzRiwKKzB4RTkxOTcyNzcsIDB4QjdCNzA3NzAsIDB4QTI2RTM1ODEsIDB4ODI0ODFFN0YsCisweDAwNUFGOTlGLCAweDhCOTcwQjRCLCAweEVDNzRCNjYyLCAweDJGMjFDNUEzLAorMHgwNDlEQkE4MywgMHg0OTVCM0UxQiwgMHgxMTIyMzRCOCwgMHg5NUI0MkE1RiwKKzB4MkM4RkE4MzMsIDB4NkQ3MDZFMzAsIDB4MkFBQUVDMDksIDB4REU3QzMzNzcsCisweDA2Q0U5RDQ2LCAweDc1NzRFQUFCLCAweEZDQjFBMDhELCAweDQ2MkFGQjZDLAorMHgxOTI4NDdCMiwgMHhDQzE0OUFDMywgMHg0Mjc4MzRDRSwgMHhFOTAxODBBMCwKKzB4OTQ2RTUyNkUsIDB4NjAxOEJFNEUsIDB4MjA0NDJGNTIsIDB4MUQzOUZBMDUsCisweDM1RjY5MEFELCAweDI5REIzQTUzLCAweDYzNjAxNThDLCAweDNFQzgxNUY4LAorMHhERUQ2NTBBRiwgMHhGQTE2OEIzNywgMHgyMzNGOEEzRCwgMHgyNDUwMDlDRiwKKzB4NzFCQjIyMzcsIDB4NDk4OUEwMUMsIDB4RDU4QUU0RjEsIDB4NjJDOTlFQTAsCisweDQ4RTkwNTZFLCAweDdFMUE3ODZELCAweEJGNkNCQUFCLCAweDIyNjY5QTZCLAorMHg1Nzg1NzU5MCwgMHhFNDU1OENFMywgMHhCQzZDNjNFQywgMHg2QUUwMkE2MSwKKzB4QTJBQkZCQkIsIDB4RDJCMkZFOTAsIDB4REY4QkRCNDMsIDB4RUMyRDU5QUMsCisweDdCNkFGREMzLCAweDZCMDAxRDVGLCAweDNERkVFMDhGLCAweEI5QTU5N0Q2LAorMHgwOURFQUM2OCwgMHhFNDJEOUU3MywgMHgyRTMzNTA3QywgMHg2NTI1RjA1MSwKKzB4MEQ3MTQzQzYsIDB4MDFERDExNUIsIDB4OTQxODAyNzksIDB4MjhGQzYwRDcsCisweEMwOTAwNjAzLCAweEVENEZCRTUzLCAweEZDMDY3N0JELCAweDdEQTJBODc4LAorMHhBOEQwRUM3MywgMHhGNkEwOUIyQSwgMHgyNEExMjlFRSwgMHgxNjlCQ0EyRiwKKzB4RTBCQUU1MjYsIDB4NUM4RTJGQ0IsIDB4QTIxOEVGRkEsIDB4ODQyQjYxRkIsCisweDg3Qjg2MENELCAweDEwNkU5Qjg2LCAweDkzMDY4NUYwLCAweEM1QTcyMTA5LAorMHhGQjk3N0JENSwgMHg5RDNCNEFDNiwgMHhEQTM3OEZFMCwgMHgwQUFGNzQ3QiwKKzB4MDQwOEQ1MEQsIDB4NDg4Nzg1QjksIDB4ODFBRTk3MUQsIDB4MTJBREZFRjMsCisweEYwQjY0MTI4LCAweDNENEM5MEJCLCAweEM5OTRBQUExLCAweEI4NTQ0MDBFLAorMHg5MDFBRTNERCwgMHg3QTRBMERFNywgMHgxOEUwNzQ1NiwgMHgyMEMzOEJDRCwKKzB4OTQ0NDE5NzYsIDB4RTJFNDE5QzIsIDB4REJEM0M5MkYsIDB4NERENjM4NDEsCisweEUyOTk0OTU5LCAweEY0MUYxOTZELCAweDA4MzU0MzFBLCAweDkzQTJFOUNGLAorMHhCMDFGQUJFRCwgMHhEMDEzNTUzNSwgMHhFQkNFQTE4RCwgMHhDNEY4M0ExQiwKKzB4NUQ3Mjg0NUMsIDB4MDQzMzVFM0EsIDB4NjhDNEM5ODcsIDB4NzcxNzg3MTAsCisweEM1MjkzQTlBLCAweDQ0RTQwQUUxLCAweENFNDU0RkRFLCAweDcxREU4OUI3LAorMHhBMzczRDlEMywgMHg2RDE5RTQ4MywgMHg4MTI4OTZENiwgMHhDMzIzMUMxNCwKKzB4RTk2MEFCQTQsIDB4QjdGQjZGODMsIDB4MUY3QzRFQjgsIDB4RDEwREJFNjksCisweDg1NzVDRjZFLCAweEMwM0IxNUQ1LCAweDREN0Y0RUYzLCAweEYwNjE1RjMxLAorMHgzNEUyMTc2MiwgMHgyMkQ1QTdBMSwgMHg3MjlGQTNGOCwgMHgyRTEwNTBGQiwKKzB4OEE5RjQ2REMsIDB4NTM1RUI1QTcsIDB4RDE0MzU2MEUsIDB4RjhFQzNBNEIsCisweDIyNDlGRDA2LCAweEU4RTJBQjA4LCAweDFFNzM0MTI3LCAweEJBNUI2MzVBLAorMHhEOEY0MTlEQiwgMHgwQjUyMDBEMCwgMHg4MTEwMzA0RiwgMHgzNDk3REE4MCwKKzB4MzVDQTcxQ0QsIDB4MEZEODIyN0UsIDB4MDg2Qzc0RTIsIDB4QUI2OEExQUYsCisweEUzQkQ1N0VDLCAweDgzQjQyRDI5LCAweDNDMkQ2NzJELCAweDA1RDg1Q0VELAorMHg2NEYwNDkyNiwgMHg5MTM2NEExMiwgMHg3RkM3MzM0OSwgMHhFQkExRkM3NywKKzB4RUNFMEQyMEQsIDB4QjFERERCOUIsIDB4RUI2QjQ5MkIsIDB4MEZDMDJCQjYsCisweDU2MjAxRDc2LCAweEVEMjBGNzlFLCAweEZDNjAzNEZCLCAweDZBNTM5RjFELAorMHg1MjBGRUNCRiwgMHg0RTNBRUNGNiwgMHg3NkIwMUM3NCwgMHhFRkM0MjFENCwKKzB4ODJBQzk4OUEsIDB4NDA3QTc3Q0QsIDB4NkQyODdCRkUsIDB4MjY2MTc0MjUsCisweEVBMjMxNkMzLCAweDg2MTY1NTRFLCAweDlGNEM0NTM1LCAweDg4QzBDNkMxLAorMHhFQUM0RjBGNywgMHgzMkM3REQ5MywgMHg0MUQ5QzM3RSwgMHgyQTlDQkIyRSwKKzB4MDU5MUJBRUYsIDB4MkJFNDNGMjEsIDB4NUUwNkVFNEQsIDB4RERERjU1MjUsCisweEVDMTM3REJFLCAweEYwQUEyOTVDLCAweEYyQzlGREUyLCAweDVERjlENjkzLAorMHgxMEE2Q0FDMCwgMHhDNjg0NkQwOSwgMHhGMUREQUJGMywgMHhENTZGOEJCQywKKzB4QUE1RENFOUQsIDB4NkY1OTAwNEYsIDB4QjhBMDM1QkMsIDB4NjFGNDcyODIsCisweEM4OURBQzlFLCAweEZDN0U1QjNELCAweDRDNTQwNkRELCAweDU0Q0ZEMTQ3LAorMHhCQjQ0QUIyQSwgMHg3OTEyNjlDMCwgMHg4Q0Y2NkI0RCwgMHhEMDFBMzE5MCwKKzB4NjM2RjQ1Q0EsIDB4QjMyRkMyMDksIDB4Q0I4QjlGNDksIDB4RjQ2RDc0QjksCisweDVBRkM5QkQwLCAweEM0QzcxNkMxLCAweEY5OEM1NEYzLCAweDM2QUZGMDEzLAorMHhCNEQ2RDkwQiwgMHg1RjEyOTlCNiwgMHhBM0JGQ0ZBNCwgMHhFQTMzNkFBRCwKKzB4Q0NENDQzREEsIDB4NzRDQTQwQjQsIDB4MzFFRjE2MTQsIDB4MzZEM0ZGRUUsCisweDg3NkFFMjUyLCAweEM4RDYyRTlGLCAweDY0MjRGMzk3LCAweDFGNzMwRjJELAorMHhCMjBGREE1MywgMHhGQ0ZFRTYwRiwgMHg2NzZBNjFDMywgMHgyNkM1RTE0MywKKzB4QzIwMTU3M0UsIDB4NEE4QzQ2QkUsIDB4RUY4N0QwQTksIDB4RTA3RTgwQjQsCisweDM0RjIwMTA5LCAweDhCOTM2QTcwLCAweDlGOEUwMzA1LCAweEYzMjk3Q0EwLAorMHg0RTdCRjBFOSwgMHgwRjM3NEJCOSwgMHhDRTc4QTAxRSwgMHg1RkUyNkREOCwKKzB4QTM4MjZBQ0YsIDB4MzIxRjY5QUIsIDB4NDQxQUYxNEUsIDB4OEFDMTlDRjcsCisweDRCRkQxQUQ2LCAweDU5NTFBQkQxLCAweDA5OEMxN0YwLCAweEE5Qjc1Rjc2LAorMHhBNDYyNTUxQiwgMHg2QjcwM0ExMiwgMHhFRENCNTdCMiwgMHg4Q0Q0QzkzMywKKzB4RDMzOEQzRDgsIDB4RTM0M0ZDMjQsIDB4OUNERDUyRUIsIDB4MTdBNDE5NDIsCisweDYzQThFRjUwLCAweDIxNUJCMTFBLCAweEUxRTI1Q0I2LCAweEI2MkMwQTg4LAorMHhFNThDREVDMywgMHhDMEU2Mzg5QSwgMHgyQjdCRUU1NSwgMHhBM0ZDQkQwNywKKzB4N0NENDUxRkUsIDB4QjA2RjY3MjQsIDB4NTY3NUE3RUEsIDB4MTQxRDUyRkMsCisweDA1RTg2RTlCLCAweDUzRDc1QzNBLCAweEU3OTlBQTJBLCAweEU0NzQzODRDLAorMHg4Qzg1RTZFNiwgMHhBNDc3QThENywgMHhBMUU2QUIwQywgMHg5MDMzRTdDRCwKKzB4MkY1NUQ1MDQsIDB4NERBRTgxRkIsIDB4QkQyMjlBNjQsIDB4ODYyNzY1QzksCisweDVCNkE4NUYwLCAweDk1QTM5MzI4LCAweDM4ODI2Q0ZCLCAweEJGN0RFQkE0LAorMHg0MkVGQUI2MiwgMHgyRDBCQkE2MCwgMHhCMDY3MzFBRiwgMHgxNkQ0QzRCMCwKKzB4Q0E0QjkyNjQsIDB4M0RGMjRBRTIsIDB4RkVEOTM4NDgsIDB4N0NCMzNCMDgsCisweEFDOUNBRTlGLCAweEEwRjgwQjYxLCAweEE2NkNGNzEzLCAweDkzNjQ4NjVGLAorMHhERkExRTBCMywgMHhGRTZERjMzRiwgMHg4MDM5QTYxMiwgMHgxMTlGNjBCRiwKKzB4Q0VFREUzMDksIDB4RDI4MzE2QTgsIDB4Q0Q2MUQyRjUsIDB4M0NCRUIwMTUsCisweDg1QzBCRjUxLCAweDZFREJCQzE1LCAweDc5RjNEMjA3LCAweDQ4NUVFNEZBLAorMHhDRUMzMDJFQSwgMHg1OUQ4QjkyRCwgMHg1MUMxRkIzNiwgMHhGNEZFOEI3MSwKKzB4MkRCRDU3MTgsIDB4ODQwMjQwNDAsIDB4RkRENjU5MEYsIDB4QTFDRTlDQzksCisweEM0QUVBQjcyLCAweDBBMkZFOEJGLCAweDI4QzMzNjE4LCAweEJBNEUxNUZCLAorMHhBOUM3MjgxOSwgMHhBM0VFNDVENywgMHhEMkRDNTJGMSwgMHgzRkM4NEEyRSwKKzB4MUM5REY3M0UsIDB4NjMyRjlCREUsIDB4N0U5RkJEMjAsIDB4MEQ2ODlCNzksCisweDkxRThENUMwLCAweDZFRTc5NTJDLCAweDkwNUYxOTJFLCAweDJENzlFNzEyLAorMHg4NjcwQTdBMiwgMHgxREJGQzREOSwgMHg2NDYzNDQyOSwgMHhFNjM2MDQzQiwKKzB4NjQzQzZCMEYsIDB4NTBBRjMyN0IsIDB4MEU3MzRENjEsIDB4MkQ3RDZFNDYsCisweEI4NzdEQ0Q2LCAweDdDQ0Y0RjFBLCAweERGNEQ4Q0Y4LCAweDBFN0ZBNzhFLAorMHgwQ0JDNEVDMiwgMHhBRTlCNEEyMiwgMHg0RjAyRDQ5QywgMHg0OEYwOUM0MywKKzB4NTAzMUIxQTAsIDB4RENCOEExRkMsIDB4OTFDNzM1OTksIDB4Q0YwMEE2NEQsCisweERGQ0U1NjFFLCAweDhCMTgxNTdELCAweEUxRUQ2QTgxLCAweENGOTRFRjM2LAorMHhCNDEyQ0UxQSwgMHg2MDJFMjA3NiwgMHg3MTZCMEYzRiwgMHhBREVCMzJDMCwKKzB4RDRFMTYwOTQsIDB4RUM5NUQ0MUYsIDB4NzU4NTg3NjcsIDB4NDM4QUQxQTEsCisweEU2MUM1NTI3LCAweDBENzFGQkIyLCAweDJBOTlEMDcwLCAweDVDMDE4ODI2LAorMHhDQ0NDMjdGRCwgMHgwNTM4ODNEOSwgMHhGMUQzMEVGNSwgMHg2NzZBRDM4QSwKKzB4REY4MUFCMjgsIDB4MjI1N0ZCOUQsIDB4MzczMzEzQUUsIDB4NjdFMUZFOEEsCisweEY0RjY2QjAyLCAweEFGRjhDN0ZBLCAweDNCNjBEOTRELCAweEQ0NEQwRkUyLAorMHg1RkNERkU0QiwgMHhDNjMwMTBCNiwgMHgwNkNGQ0NGNCwgMHgwOUQ4REQ4NSwKKzB4QUI3OUYyQkUsIDB4RDVDMEM0OTgsIDB4NzM2NEU0RkQsIDB4QjI5NUNFREYsCisweERCODlBMDY4LCAweDU5QTZBMEM3LCAweDBDODIzMjA3LCAweDczODBGQ0ZFLAorMHg2RTMzQzRCOSwgMHgwNzQ0RTRGMiwgMHhGNjYzQkIzMywgMHg5RUU1MTJDRSwKKzB4ODcwRUQzNUIsIDB4QjQ1MDI2NTQsIDB4MzY3Q0Q0RkQsIDB4NUQ0MjM4RDksCisweEVBQjJCODZFLCAweDZFOEFEREFBLCAweEYwODBFREQ2LCAweDFEQzkwRjQ2LAorMHhCMUZDOTEyNywgMHg2Mzc3MTM5MiwgMHg5NjcyOUJGNiwgMHhEMThFMTQxMywKKzB4NUQ4NTkzOEQsIDB4QjhDRUQzNDksIDB4RjlCODg2QzEsIDB4Q0E0ODY1NjIsCisweEJBQTlFRDdBLCAweDA0OTcxOEQ4LCAweDdDRjhFNjdBLCAweDE3MDI4NDNDLAorMHg2RENEQzM0RSwgMHg5M0M1MUY4MywgMHgyNDE1QTRGMywgMHhBOEQ3N0IzQSwKKzB4MEZCODIzRTgsIDB4NDI0RjAzQzMsIDB4OUNBQTUwM0MsIDB4N0FBNTQzM0YsCisweDNCREQ3NEZFLCAweDk5RDMzMzJFLCAweDFFNjIyMzFCLCAweDkwQTRFNTk1LAorMHg3RURBOTc0RCwgMHg0M0UyQ0QxNCwgMHgyN0RCOUQ5RiwgMHg1NjFGNUNDNiwKKzB4QTc3RUFCQTYsIDB4OTc4NjdCNDgsIDB4QUQ2NTMzQ0UsIDB4RUI3MjZDRjQsCisweDU4NTdCMjE3LCAweDJEN0RBMTBCLCAweEQ5MzlDMjBFLCAweDgxRjFGMDczLAorMHhGNDJERUFGMiwgMHgzQUQ3NzgwRSwgMHg4OEM3NzY2MSwgMHhEMkU4MTlCMiwKKzB4Rjg3MkY1ODEsIDB4OTk5RjBDNUEsIDB4Mzg4N0FCQTQsIDB4MjdGOTVCNkQsCisweDk5MUQ5NDU4LCAweDlEMUJCMTMxLCAweDZFQ0M1Mjk4LCAweDlFOUE3QjI2LAorMHg2RTY1RjI3MSwgMHhFOTBGQTA0QywgMHg3QjY5MkFBMCwgMHg4Nzg5NDNENSwKKzB4OTI0ODk1RTUsIDB4MDQxQkM3M0EsIDB4NDQ4RTI4QjIsIDB4NjFEMjJEMUYsCisweEU3OTY5NzczLCAweEJDOEU1OTgwLCAweDlBMTk4ODUyLCAweEI5NDQxNUM5LAorMHhBMDIzNzRCQSwgMHgzNDBCRDVGMywgMHgyN0YyQTBGRiwgMHgzOUJEQjMzRiwKKzB4Q0MwNDJCQ0YsIDB4ODNENkMxMzUsIDB4OUM3QThEOEUsIDB4MDU4MjNDMjMsCisweDJEN0EzRjkxLCAweEU3OTJCQ0NBLCAweEEyRDgyMTc3LCAweDczQzgyRTdFLAorMHhCRUJDOTYxMywgMHg5RjU5NkNCMCwgMHg2RTc4NEFBNywgMHgxQjdCREE5RiwKKzB4ODQ2MzkxRjcsIDB4ODUyQUQwNzAsIDB4RjgzMUU4Q0EsIDB4MTZBNzgyMjMsCisweEY2OEY1MjUwLCAweEUyNTU0NDkzLCAweEQzOEYyQUZCLCAweDc2NEJBN0E4LAorMHgzQ0FFRkM1NSwgMHg2RTlCOTAzNywgMHhEODdENDg2RSwgMHg3MzUyQUVBOSwKKzB4MTE5ODdFRTAsIDB4REY3RTg0REEsIDB4MjgzOEU3MzYsIDB4QThDN0JBQzIsCisweEY0OUUyMUVFLCAweEZBRDEwNkU5LCAweDczNjNBQzZGLCAweDVFOTk3NENCLAorMHhCQTAwOEJCMCwgMHhBRjVEQjNGQywgMHg3QUMzQ0ZENywgMHgyRDU1RURDNiwKKzB4MkMxQzlBRDcsIDB4NkEzQUE0OTQsIDB4NUYwRTBBM0EsIDB4Mzc0MjJCRkEsCisweDgzQjRENTk0LCAweEI3RUNDRjY2LCAweDgyRkNDREQwLCAweDhFQ0JGRDc5LAorMHg2NjRCOTM0MSwgMHgwMkYxNzhBMiwgMHgyMDk1QzhFMCwgMHhGQzVGMTdCNywKKzB4MTgxMEJBOUIsIDB4OTY0RTRDRDEsIDB4RkJBRUQ4MDgsIDB4REVFODc3OTYsCisweDYzREU0RjY5LCAweEM5OTI3NURELCAweDY1MjQyMzA0LCAweDdBQjVDMjhCLAorMHgwMUJCN0EzQiwgMHhDODVENzcxNiwgMHgzMkFGQjlBMywgMHgyRUQyQ0JCMSwKKzB4QjE5NDIxOEYsIDB4MjFGRTU2MEQsIDB4Q0I0NTAzQTUsIDB4NUNFMDQ2NEQsCisweEM0QUU5QTNDLCAweDA2MTUzMENCLCAweEVEQTM4RTZCLCAweDQwMjlEM0U2LAorMHhCMEMyMDMzNiwgMHhBMzc4MjVDMCwgMHhDNjhGOEIzNywgMHg5NDA1QUQzQiwKKzB4OEIxQThGOTksIDB4QTc2MURFOEIsIDB4NjgzQjMyNTksIDB4QTE1NEM1NTQsCisweDZCRDgzNUM5LCAweDZERUFFMzVBLCAweEJFQUU2RDQ5LCAweDIxRDhCMDc0LAorMHg0NkMwMUIzMSwgMHhCRTlCM0ExNiwgMHgxRDYxMUVBQSwgMHg0MjNBQjc0QywKKzB4OTMxRjVBRjUsIDB4QkI5RTI4OUEsIDB4QTQxMDExMzIsIDB4NEE4QkUwRDcsCisweDMzMDdFNEIyLCAweERFNzhEQjVFLCAweDM0N0VCNUNFLCAweDEzRUVFOTk5LAorMHgyQzJENzk1NSwgMHhCQTg5M0VCQSwgMHg1REZDMkVDMSwgMHhFN0REN0E1RiwKKzB4NUUxQzY0RDgsIDB4NDU1MkU0NDcsIDB4MTgzN0Q4RTQsIDB4OTcxMTgzNkIsCisweDMyMTlGODkzLCAweDA0MzkyQzg0LCAweDNFOTQ4NDhDLCAweDE1RTVGNDgxLAorMHgwRUM1ODgxOSwgMHg3MzQxRDQ1OCwgMHg0QUU2MzcxMSwgMHg4NUMxRkQxRiwKKzB4OTdCNThCRDcsIDB4QjA1NTBFQkUsIDB4QjkxMDg3NDMsIDB4NkY1M0IzODYsCisweDdBNzNGMzFCLCAweEUwN0NGOEI5LCAweDYxRkYyN0M4LCAweDA2QTlBOEI0LAorMHhFQjBGMkJCOSwgMHg0NkQyNzVGQiwgMHhDRjM5QjQ3NCwgMHhDMzRGM0I2RCwKKzB4NTJGMkYxMTksIDB4RDg3OTYzQkYsIDB4QzYwQkYxNkMsIDB4Nzc5N0QwQUQsCisweDdFQTREQkYwLCAweEQyMTQwOUM3LCAweEY2NzhBOTI3LCAweDYzOEU2N0NELAorMHg5MzI2MUFFRCwgMHhFQTlCMjVGRSwgMHgxRUJDQUZEQywgMHg1ODBDQzgyOSwKKzB4NThEMURBMUEsIDB4NjU4ODgxRjgsIDB4QzQ4REI2ODIsIDB4RDQyRThDQjQsCisweDFERjMzRDc0LCAweDMxQzA0RjY4LCAweDdEODcxRTI5LCAweEFFMTFGRDcyLAorMHhEN0U4RjhGNiwgMHg1MzBEOUQ5QywgMHg1ODBBMDcxNSwgMHgwRjE3QjFBMywKKzB4Qjg2M0Y0MkYsIDB4QTZBNERDMDgsIDB4ODI3NzNFNzYsIDB4OTM1NEIzMDksCisweEUxN0QwNzcwLCAweDA0RTRERTVCLCAweDcxMkVBMzk2LCAweDQ5RDM3QjU1LAorMHhBRTQxMDlCQSwgMHgwMzg2MkRDOSwgMHg3QkNGNjFEMiwgMHg0M0NBMjAxNywKKzB4MjNCREQ1MEYsIDB4NzQ1Nzc0NTksIDB4NEU4RjRFMjMsIDB4QkY5MjRDMUEsCisweEU0RUM3MENFLCAweDM3RkJFQzY2LCAweEE2REE4OTM1LCAweEUxMUY0MDkwLAorMHg1QzhGOUVFMywgMHgxOUQxNjdFQywgMHg5RUU0RjJDNSwgMHg2NEE4MUU2QywKKzB4QjM1NjQyQkIsIDB4ODIwODNBMDEsIDB4MDAxQ0ExRjYsIDB4QUE2OUM3RTgsCisweDY4NUYyNEQ5LCAweEU2ODY4RTMxLCAweDM4QUREOEYwLCAweEEyRkRENDRFLAorMHhFRTBDNDkxRCwgMHhDNjBCMUU5QSwgMHhGN0E4OTI2OCwgMHhGRDc4NEYzNSwKKzB4QzZCNzMzNUMsIDB4NzVFRkNFQzEsIDB4RTJEOUY3Q0YsIDB4RTFDMzY0RjgsCisweDdDQzYzQjJDLCAweEMxNzlFMkFELCAweDU2QzE5M0E1LCAweDUxMzRGQjY5LAorMHgzNTA1OEJCNSwgMHgzNkY0QkNENSwgMHhERjRBMDhDMiwgMHgxNEFBMjMzMCwKKzB4NzYwQzhDRDgsIDB4MkM1NjIzOTQsIDB4MEJFQjY2OUIsIDB4MjMwMTk3M0EsCisweEFGNUM0RkYyLCAweDFDNzcwQUFCLCAweDI1REQyMDg3LCAweDczMkFBREM0LAorMHg1OTA1NDk1OCwgMHg1OUREQ0JFNCwgMHg3NENGQzhBOCwgMHg3QzAxNTAxNiwKKzB4MzJBMDI3NkUsIDB4OEYxQzJFOTMsIDB4MENFOTFGNzEsIDB4MDU1QzMwN0EsCisweDQzNUQ5NjdFLCAweEY0QzMzNzA0LCAweDVCREYyQUQ3LCAweDg4NTUwOTlDLAorMHgzMDdCMjczNiwgMHhCQjZCMTlDQiwgMHg2MjYzNDlEMywgMHg4RjUyQUJGQSwKKzB4MjUxQTFFRDYsIDB4RTA1ODdCQzAsIDB4MTI4MzE0MDgsIDB4REE4M0NBQkYsCisweEFCMkM3REZELCAweDZCQ0YwMjcxLCAweDcyMDU4REYwLCAweDE3QUZDMURELAorMHhGRkM1MkMzMCwgMHg1NTE0MDFFMCwgMHg5RUVENTRERiwgMHgxNEU5NTFFNCwKKzB4MTQ2MjRCM0YsIDB4NEMyNDY1MEIsIDB4NUE2NUY4NkIsIDB4RTk0RjYxNDMsCisweERDN0NFOUNGLCAweDk0RDVEOEYzLCAweDA5M0IwQTA0LCAweDIyMDk4RDAxLAorMHhFREYwOUU3QywgMHgxNjVFREIwRiwgMHhEMDlDQTc3NCwgMHhCOTZBQTE0MSwKKzB4QjU3NDU5NzgsIDB4OUQ4MjA0MzQsIDB4NDJCMEUwMjYsIDB4OTY5MzhBMjUsCisweDcyRTg2MzRCLCAweEJFMzZFQzAyLCAweDQyRjNGNzRCLCAweDM1OEZBNjIxLAorMHhCRDQ1MTQ4NCwgMHhCNDNBNzVEMSwgMHhCMEE1N0Y5MSwgMHg3MDFBN0M4MiwKKzB4NDg0QjNGNDYsIDB4MDQ3Rjc4QUQsIDB4NjVGNzM3MUMsIDB4RUFDOEE5NTQsCisweEU1OUY2MzU0LCAweDNFRUVGQjRFLCAweEYxMzE5NTRCLCAweDFDMDBCQUMyLAorMHhFMzg5NzYzNywgMHg1RkVDODNBQiwgMHg1OENGQTJDNCwgMHgxRjRDMEE2QSwKKzB4OTc5NTZCQzYsIDB4NjNEMTFEN0QsIDB4QjQ2MTc5RDAsIDB4MTEwMzlBNzUsCisweDFCNTBFMDg4LCAweDY4RTk0NzZCLCAweEFBNjhEQjU1LCAweDhBNEEwNTFFLAorMHhFRkEwRERGNSwgMHgwNUEyQTY3NCwgMHhGRkUwM0U3MiwgMHhDNUEwMjk1QywKKzB4NkZENEQ4MzQsIDB4OEU0MkJCOTQsIDB4RjNERkQ4OEUsIDB4QkE2OTFBRDIsCisweDM0NTg0NzNFLCAweDYyNjlBMzQ4LCAweDcyOTYyRkI2LCAweDg2RDUwNjRCLAorMHg4QTE1Mzc0MCwgMHg1NEFDOTdEOCwgMHhFRDJDRTA1NywgMHg2ODIwMDQ3NCwKKzB4QkJBOEUxOUQsIDB4QkZERDA4RjMsIDB4QjBERjc2RDEsIDB4NjJGMjk2NDksCisweDVBQjc3MDMwLCAweDFFRTlBMDBFLCAweDdEQUIxQzkwLCAweEFCNjA4RkZELAorMHg4NTA2QTg1MywgMHg3NUI5MzM5QiwgMHgxQUUwQ0NCQSwgMHhGQjYwQkI3OSwKKzB4ODY1MEY5MkYsIDB4NDgxOUUxRjcsIDB4MEE3MDQ1QTgsIDB4QjVCQ0U1RjEsCisweDc3QTk4QjI3LCAweDAzREUyMUU0LCAweDNGRTNGMTMyLCAweDEwNjgyN0VDLAorMHhENERDMTQ2OSwgMHhBQUM4MkY5QiwgMHgxRDU5NTNBMSwgMHg4MDM0QjM2OSwKKzB4RDQ0MTJCNkYsIDB4OTBGQjlGMjUsIDB4MTQyNzkwNzAsIDB4NkQ5OEFGMUMsCisweDNEMjg2RjM3LCAweDgzMjRBNzMyLCAweDU4MTIzRTRFLCAweEVCMDUxMDMyLAorMHhDMTVDRDU1NywgMHhFQjgyREU5OSwgMHg2MjEzNDM0RSwgMHgzOUYwRkM5QywKKzB4NUVCRkUxQzUsIDB4OENFQkY0NzAsIDB4RkY3RDhEOEEsIDB4NzQwQTZBM0UsCisweDcyMEQwODBDLCAweEI3M0I3NEZBLCAweDUxNzNGOTZFLCAweDlGQzAxNzk0LAorMHhEQUJGMUM4MSwgMHhDQTgxMzI5NSwgMHhCRUEyREI4RCwgMHg0QzdFMENFNCwKKzB4ODA1MUJBNjcsIDB4RTYzMzk5RTIsIDB4ODNBMTVFRTQsIDB4NDdGNEE3MTgsCisweEQ4MjQ2RTZBLCAweDBCNEY4N0JFLCAweDAzMTY0OEI4LCAweDk5RTNFM0U2LAorMHg0QUJDQzY0RiwgMHg1Mjc2ODE4MSwgMHhFNzA4MzcyQiwgMHgyRDBCMUQyQywKKzB4NERGNTI0MDIsIDB4Mzg5QkU5RjYsIDB4REUyRjMyMzIsIDB4NUQ0M0Q3NEUsCisweEQzN0JCODk4LCAweEU3MjcyNjQ1LCAweDlCNTQzMkRBLCAweDlEN0E5NDczLAorMHhBNjk2MjhBNSwgMHg1ODM1NTVBNywgMHgyNTVCMDhCRCwgMHhBRDY4RUFFMywKKzB4MUE3OTk4MkQsIDB4QUNFMDk3MjYsIDB4MTVFNTc2QUQsIDB4MjYwRUI0MDYsCisweEE3NDQwQjQ2LCAweDY2QjZEMzE3LCAweEJFNkVDQTNCLCAweDNBREVBMUMxLAorMHhEODAzOTlDMywgMHgwRUYxOThEMCwgMHhGQUVFMjAxMCwgMHhFRjJFOEU1NiwKKzB4NUI2Q0M0MDIsIDB4M0ZEMjdCRTIsIDB4OTcwQUFCNUYsIDB4NjE4QzE3QzYsCisweDdGNTAyMkZCLCAweDU1MkZDMUZBLCAweDVERDgyOTg0LCAweDA5NzY5NTM5LAorMHg5ODgxMkQxRiwgMHhCRDhCMjUzOSwgMHhENzhBRDlBNiwgMHgxQ0U0MUQwNywKKzB4MjcyQTBBQjcsIDB4NUNCN0UxMDEsIDB4NkY0MkQ1NkEsIDB4MDAxRDkzMEUsCisweDNDMTdDMzA1LCAweDMwQUFFMzU0LCAweDJBNEFBQkUwLCAweDkyMkJDQjk0LAorMHg3M0YzNEMxQywgMHhFMDdFMTUwMSwgMHhDQjU1QTNFMSwgMHgwQ0RDMzY2OSwKKzB4RDlDMDdERTcsIDB4MkRBQjgyQkYsIDB4OTYzRUFDQUEsIDB4OUIwNUUwRjEsCisweEUyREEwRUZBLCAweDA2MTNCRkU1LCAweERGQjYwNUU5LCAweDVEQ0NBOEZELAorMHg2RDQzMzg3MywgMHg4MUE5QjRDNSwgMHhEMUQxQ0IxNCwgMHg5QjZBOTkwNiwKKzB4QzEwNDc2N0MsIDB4MzAxMDFEMzcsIDB4MTg2RkJCNzksIDB4OEY5NUQ0ODgsCisweEEzMDk0RjQzLCAweDdGMTdDOTgxLCAweEZEOTJCM0ZFLCAweEFEQUIzQUI1LAorMHgyMEQxNDA2QywgMHg5NDYyQzhFNywgMHg1RDY0ODE5RCwgMHhCM0U4NTE5NiwKKzB4NjdCODU0RkUsIDB4N0QwMzlGQzYsIDB4QUQ5OEE4NUUsIDB4RjY3MkUwNDEsCisweDMwRkExOUE5LCAweDRBMjc2RUI4LCAweEI3MDQxRDJFLCAweDU3QkIyMUUyLAorMHg0RTI1MTY2NywgMHgxNUM1NDAxRSwgMHhEQUI1OTQzMSwgMHhENkM2RkQxRiwKKzB4MTcyNkVCNzAsIDB4OTAwRjRFODQsIDB4RDMyN0RFMzMsIDB4N0EwQUUwNEIsCisweDc2QjExNzRFLCAweEZENTQ3Qjk0LCAweDM3MDgzMkRDLCAweERERTY1Q0RELAorMHg3NDY3MkMwMiwgMHgxNjQ3MDNGRSwgMHgzNENBRDMxRiwgMHgzRTY5MkRFRCwKKzB4NEJDMzhGQTUsIDB4MTQzRjk5RTUsIDB4NjFCQjY0MEUsIDB4Qjk1N0JDOEQsCisweEM5REQ5RTM1LCAweDJCNUNCMzEwLCAweEFERDZFQUQwLCAweDkxOTgxRDQ2LAorMHhFRDgwM0Q1NywgMHg2MUQ3NzM3QywgMHg5MkQzQUMzRSwgMHgzNkEwMzRDQiwKKzB4RTEzOTVEQzUsIDB4NUYyMDcwRjgsIDB4QzVFRTlGOEEsIDB4NzA1NDZCODgsCisweEM5RUEyMzBDLCAweDU4REMzMDczLCAweDU3Q0JCRUI3LCAweEEwQjc4Q0ZFLAorMHgwQjNGRTc1QiwgMHgwN0FEQUNDRCwgMHhDMjkyQzMzOCwgMHhENzBDRDdFNSwKKzB4NzI5RDhGNEUsIDB4MjE4RkEwNDEsIDB4MTBFQzExOTksIDB4QUMxRUM1MUQsCisweDVERUNDOEQxLCAweEJBMzYyMzBBLCAweEJDNDFGNUE1LCAweDc1ODY0ODk2LAorMHhCNDQwM0Q0QSwgMHhGRUVFOEY0NCwgMHg4RDk0QTI1NiwgMHg2MkJBMDExNSwKKzB4M0E1NzBDNjEsIDB4OTIyMUM1ODMsIDB4RDI5ODFBNkIsIDB4RkQ4QUFGNUEsCisweDJBMTAyRDU5LCAweDY0MDgzQkRELCAweEJEMUFBREU2LCAweDdFNkQxRTk5LAorMHgyMDU2OEE2RCwgMHg4REZBNzA0QiwgMHg4N0QyNzEyMiwgMHgyRUZEQUI3RCwKKzB4RjNBRjlEMzksIDB4RDhERUQwQjIsIDB4MkQ0QjM0QjksIDB4MTJGM0UzMkMsCisweEE2QkNCRTY1LCAweDY4MDAyOUExLCAweDA5NEIwN0IzLCAweERBNTkxOEVELAorMHhGN0QwQTg2RCwgMHgxQTdFMThDOCwgMHg5Mjg1QTk3RiwgMHgyMDQwMjgyQywKKzB4NUIxMzM1MzEsIDB4QTQ4MjM3QUMsIDB4MzU1N0JDMUIsIDB4N0U2RUQ3N0IsCisweDQzNjIzNEM3LCAweDlCMjA5NERFLCAweDVEOTY3NTkzLCAweDg4NjdEMUM0LAorMHg4OEVDMzk0OCwgMHhFN0Y4NEFENCwgMHgxODcxQjNFNiwgMHhFOEU5OTJDNiwKKzB4QTE2REMyRjgsIDB4MERGREY1OTAsIDB4OUI1NjIzOEQsIDB4MzI5MDE3RjUsCisweEJGOUJENDA5LCAweDY4QkQ5QjFDLCAweDQwMzZDNEZGLCAweDNCRjZEOTNDLAorMHhBRTEwMDYwMiwgMHg5MEI0MzUwOCwgMHhBODVCNDAxMywgMHgyQzY2RUE1NCwKKzB4MjI3RDMyRDcsIDB4MEJBNTI2RDEsIDB4MDc1MjEzQjgsIDB4MUEzREVEMDcsCisweEQ0NThERkZELCAweERDOEFDRDQzLCAweEFDNzgwOUFCLCAweDJEMjU0MDhBLAorMHhEOEYwQzg4NywgMHhBRDhDRDMwRCwgMHg0MDU0RjYxRSwgMHhBOUYwQ0NBMywKKzB4QkZFQkQzMUQsIDB4NkQyQkFCMUUsIDB4RjhFNDJEOEIsIDB4NkM5NEE0RTQsCisweDExNThEMkEzLCAweDkzRjQ0RUZFLCAweDhBRDA1QTI1LCAweDhDMjI5RDMyLAorMHhCMjEzRDc2RSwgMHhERkU2MzgyMiwgMHg1NjE5ODZFQywgMHg4MDZDQTA4MiwKKzB4NkRCM0JGOEQsIDB4MUU4NTBEMzAsIDB4OEY3QTQ0QzAsIDB4NzVCQjMzMjgsCisweDg2QzdCRTEyLCAweERFNUM0NEJELCAweERGNEQwNDhFLCAweDk2ODcxMkMzLAorMHhCMUI0MUNGOCwgMHhDQzE5NEZFOSwgMHhEQTJFMUE4RCwgMHg3MkEwODY2MiwKKzB4NUFCQTI1MzYsIDB4MjIzRTIwMTMsIDB4QTVBOTIzQTUsIDB4NzU2NUI1REQsCisweEJDQTBBMkIwLCAweDBDMjk4NjRCLCAweEFBRDhDQjg3LCAweEU0QzdFNTU5LAorMHg3N0UxOUU1MSwgMHgxOTRFNTRFRCwgMHg1NEREMUI1NCwgMHgwRkFEMzdBNywKKzB4MEVGNkIwRTMsIDB4MEUzQTJGQzgsIDB4QTAwNjM5OTUsIDB4RTE3QUUyMEUsCisweERDMTFCN0Y4LCAweDg1RjFBNzZELCAweEQ5Nzg1OEQ0LCAweEI3NjNFNDlDLAorMHhCNUJFN0VDNCwgMHgzQ0U5MjRDNCwgMHg0MjQ2MDE5RCwgMHhEMzNEQkIyNywKKzB4NzM3ODYzQTcsIDB4MzJDMjZCREQsIDB4NzE0ODk3QTMsIDB4MzYwOTEwMTgsCisweEYyNkJDOTkwLCAweEREQjY0MEIwLCAweDQ0OEY1QjEyLCAweEQ3QTVFQjRCLAorMHg1NjE0RUVBNCwgMHhDQTQ5MTJGQiwgMHgwMTFGOUQ2QywgMHhBNEZDOTBBQiwKKzB4OUZCNDk4MkQsIDB4MjBBRDE0NkYsIDB4NEI3QUI3NEUsIDB4MTA3QTk0MTEsCisweDcxREJBOTBBLCAweEQ1MTBFM0QyLCAweDI0OEQwRDM1LCAweEI2NjYyMjlFLAorMHg2MUVFMUVFQSwgMHg3MDIwMzFCNSwgMHgzNjk5MkE3QiwgMHhDOTBDMDhDQiwKKzB4NjQ3ODk5NUEsIDB4RTZDMkJBN0EsIDB4OEE5MTc5QUMsIDB4QzhFRTI5NTYsCisweDI3QjA0MkM4LCAweDQ4REI4MUQ5LCAweEFBMzlGMkNCLCAweDVFNEQ1RjNDLAorMHgyNEZGRDZCOSwgMHg1QjU2MkMyRiwgMHgwMEZEMzNCNiwgMHg0MzVGNUY1MiwKKzB4RjM5MkZGQzEsIDB4MEU5MjdDNDAsIDB4NTUwOENCQUIsIDB4OTc2QUE1NjcsCisweEExM0U3QzUyLCAweDUzMjEwOUU5LCAweDE2QjkwMjFGLCAweDYwQzYxNUExLAorMHgxRDIzQzI1OCwgMHhGRDc4MzE0NywgMHg2MzYwMEZCMSwgMHhBQUEyNDVGMCwKKzB4OUIzREMxRTEsIDB4N0IyNzBEMEQsIDB4NUIxNjMyQ0UsIDB4OEI4NzFGN0YsCisweEM1MzVFRkY4LCAweDczMTA5QzZBLCAweEVCODNEMDJELCAweEY3QUU3NkZCLAorMHgyRTM5RTUwMiwgMHhBNDEyODIxNiwgMHhGOTBENTdFNSwgMHhGRjBDNDY1RSwKKzB4MDIwMDgwMjksIDB4RTVDQkJBMUYsIDB4NDI4MEZBM0MsIDB4Q0RCRDc1QzgsCisweENCNEFGMzQyLCAweDE3Njk1QTRFLCAweEFBNjE2MkI1LCAweDg2NjBBNjc5LAorMHhEMUE4NzAxQywgMHg0NzY5NENBNywgMHhEQThENDNGRCwgMHg0NEE0QkMxQiwKKzB4QUIzNEI5QUEsIDB4RTU1NTYzREQsIDB4MDhENDE0MkIsIDB4ODExOTdBQzgsCisweDk5N0IxREMyLCAweDJFN0NDNTBBLCAweDdBMzI2QTIxLCAweEE3NjQxOURCLAorMHhFQThCNTQyOCwgMHg2NTcyOTE0MCwgMHgwNTFEQUY2NiwgMHg4ODcxQkNBOSwKKzB4QTE3NUU1QkYsIDB4NjAzMTBDOTgsIDB4QjdERTg5MjksIDB4MzVFMjQ1OUUsCisweDA4RUI0NTQ3LCAweDkwNEQ3QjJCLCAweDI5MzgyQ0M0LCAweENFQzg2NjRFLAorMHgxRThDOUMyQywgMHgzQjk0MjEzNCwgMHg5Q0VDNUQ1NSwgMHhEQTU0ODM3NiwKKzB4MkU0RUZENjEsIDB4MjZGNjVGMDksIDB4NUEzREQ3Q0EsIDB4MkZENEU1OEQsCisweDZCNzFCOEMyLCAweDEzMTg5MTE1LCAweDJCNTU0MkJBLCAweDFDRTg1QzJDLAorMHg1QjlGRTA5RCwgMHg2ODcwNEJGRSwgMHhCMTUzMTNCOSwgMHgzRUYyNzI5RSwKKzB4NTgzRUNDMzEsIDB4QTNERUQ4Q0EsIDB4RkNEMjdDM0QsIDB4OTA0REFCMzksCisweEZFMTA2OUE0LCAweEU5OUE1N0JBLCAweDExMkVCODBDLCAweEUxNDgzQzc0LAorMHg4QTI3QjBENywgMHhBNThGNzMyNSwgMHg3Q0QwNTBBMSwgMHg2MjZENEYzRSwKKzB4NTE2NDM2NTcsIDB4QTk2N0ZDNTksIDB4NUJBQ0JDMEIsIDB4MkNGM0U0NTksCisweDdEODk4OEQ5LCAweDUzOTEzREY4LCAweDIzODFBNkZDLCAweDY0RDZENDQxLAorMHg0OEFFOTEwMSwgMHgxODVEOTUzOSwgMHgxQjA0NEFFQywgMHhCNUFCQ0VERCwKKzB4RkE4RUNBNTIsIDB4OENDREQxNDIsIDB4OTZGRDQ0NDIsIDB4RDg2NUZFREYsCisweENFNEVFMkZBLCAweEE1MTYwQUU5LCAweEM5MUIyQjNBLCAweEY5OTNGNDVGLAorMHgxNTA5MTMyQywgMHg5MjBFQ0M1RiwgMHhEODEzRERDMSwgMHg4MzRCNjhFNCwKKzB4RDVFODc2QTAsIDB4NjFERTBFNDEsIDB4NEMxNDM5MTMsIDB4QzcyOTM5ODUsCisweDE3RTIyNkU3LCAweDM4ODMwOTI3LCAweERDNjA0REYyLCAweDc5OUQxNDMwLAorMHg4NDY1ODVBQiwgMHhFNUQyMUUzOCwgMHg2MzgxRDEzNiwgMHgxQjYwNjMzQiwKKzB4MjNCN0FFMTQsIDB4NTU0RTUzQ0MsIDB4NTgwN0EyMTAsIDB4MzA1NjA4NjYsCisweDEyRjc5RTYyLCAweEUyN0I1RDQ1LCAweDM4ODlDMUU1LCAweDQ3Rjg0NUZGLAorMHhGRkQ5REU5OCwgMHhCMTBFMDlEMiwgMHg0QTE4NEE3MiwgMHgwODNEMjk3MSwKKzB4OEFCNzQ3OEQsIDB4OTIzODAzNzcsIDB4NTdBNzI0RUMsIDB4QkJCRDVDQTYsCisweEUyRkI5RDMyLCAweEFCNkFERkM2LCAweDM5MTZERUQ0LCAweDRFMTk0MzhGLAorMHhFMjFFMTVDRiwgMHg2QUY0QkNDOSwgMHg4RDA4OTI0QSwgMHgxNjYyQkFBOSwKKzB4MzA2NEFEMjcsIDB4Qjg2RDdFRTQsIDB4ODg2MjRDNjIsIDB4MUEwQkYzRTcsCisweEYzRTRBMjg3LCAweDY3ODdGMDA2LCAweDAxMzc1RDRCLCAweDk5OEJCMzhGLAorMHg2RDY2OUEyOSwgMHhENzYwQjA5MywgMHhDNDc2ODg1MywgMHhGMDQxMTAwRiwKKzB4MzVERTEwREQsIDB4RTA2QzhCQjgsIDB4MkM3OUE5MDIsIDB4NjA2MDBEQUQsCisweDZFMTFDRjVDLCAweDE4Nzc4Nzc3LCAweDdDQ0U0MDZDLCAweEU1NEFGMkVBLAorMHg3NDcyQzQ3NSwgMHg3M0RCRUU3RSwgMHhFNTMzREM0MCwgMHhCMDc0MDdERCwKKzB4RjZBQ0E4RDMsIDB4RTcxQkQ3RDEsIDB4NEJEMzUxNEQsIDB4QzVDMzYyQ0EsCisweDA2OTBFNUExLCAweDBGRkRDOEQ4LCAweDU4MTg4NjQ1LCAweDg2MzY0MTNDLAorMHgzNDEyQTAzMywgMHhBRjRGQzM0MCwgMHhBNURGRUFCOCwgMHhCODcyNzJFMywKKzB4QTRBOTIxOUYsIDB4Mjk2OTZFOTAsIDB4MzVEMkY2MjcsIDB4ODc5NERCRDcsCisweDVEMkQ4N0Y4LCAweEZBNzM1NTlELCAweDdEMjJGNDQwLCAweEY1MDE5N0U5LAorMHhFQjc0QjgyOSwgMHg4Rjk2NDlDRiwgMHgxNkY0N0QzMCwgMHg1QzdEOTg3MCwKKzB4MzZGRjZDMEIsIDB4MzEzQTkyRUQsIDB4MzAzQjM2NTQsIDB4RTNFMzNDQ0EsCisweDAyQzI2RUNDLCAweDI2OTQ5OTIwLCAweDQ0NDVERjIwLCAweDAxRkRCQzk4LAorMHg0OTEzOEM2RiwgMHgxQjU1NTVFMiwgMHgxMjJCNDVEMiwgMHg0QjJFMDIwMiwKKzB4N0I2MDE0RDQsIDB4RkFFMENEMDksIDB4NzdFMTY1QTAsIDB4RkJFNzY5ODAsCisweEY1ODA4QkQzLCAweEZEMTEwRTVFLCAweDk3NDUwRTExLCAweDI5N0Y5QjFGLAorMHg2MDdBMkM0MSwgMHhFMzg0REZDOSwgMHgyNUQ5QThEQywgMHhGOTE5RDk1NSwKKzB4NUUwMjU5OTMsIDB4Q0MzMTg4NDcsIDB4OTcxN0QyRDUsIDB4NDhGMEREMUYsCisweDZDQzRBOEVCLCAweDlCRDBGNEUxLCAweDUwNkYyQTkzLCAweDE4Qjg3NDhFLAorMHgxNkZGQkE0OCwgMHg1NTJFNDk1NSwgMHhCOTYzRjY0RiwgMHhBMUEzNEFDOCwKKzB4NjJFOTVDQzcsIDB4NEQ4N0VBODksIDB4MjFFOEMwMzEsIDB4QzFGMEVEMDcsCisweDI4QjdCQjIyLCAweDBCODM4RDA0LCAweDYzNjFCNDQwLCAweEE2NTM1MjFDLAorMHg5MkRBM0Y3OCwgMHg0MjQxQ0ZFRCwgMHhGQUZDQkQ0MSwgMHgzRUZBQjZCQywKKzB4MjVGMzA2MDcsIDB4NDFCQjcwREEsIDB4OUZGMzQ0MEEsIDB4MjUwMjAzOUUsCisweDM4MTNFQzgyLCAweEM2QTRGRDZCLCAweEY4NTM3QzhDLCAweDA5OEVENDlGLAorMHhFMEEwQkQ2RSwgMHg2QkEyRjJCMywgMHhDMzVDOUQ5RCwgMHgxMjU2RTY2QSwKKzB4NzkwQjI0OTAsIDB4RDVDNjk4ODksIDB4MzlFNzEyRkUsIDB4Q0Y3M0RFMEIsCisweDQxQjNCNjE0LCAweDc0NUFCRDczLCAweDY1NEM3OUQ4LCAweDVCMTU5MjNELAorMHg4QzE1RjIxOCwgMHg1ODVDQ0NGMCwgMHg2MjRGN0I0NCwgMHg3NkJEREZEQiwKKzB4OTZGMjZCNTIsIDB4RTEzMDU4QTEsIDB4MDg2Qzk1MEUsIDB4Mjk1MTlERUEsCisweEE0MkNGRTA0LCAweDBEN0ExOTBCLCAweEQwNjc4QzZBLCAweEFCQjc4Njc5LAorMHhCQTQ4QTJFNCwgMHg1RjNEQTEwQSwgMHgxMUYwNDE4MywgMHhBQzcyMEEzRiwKKzB4NkE4MDc3ODEsIDB4NkYxNDZCRkIsIDB4RThBNjc5MzQsIDB4NTQ1Nzg4MzQsCisweEFBNjBDOEYwLCAweDIwNjFBMUU2LCAweDlFODc3OTlCLCAweDY4RDkxRjg2LAorMHg4OTc0RjU0MCwgMHhCMUMzRjEwMSwgMHg5OUMyMUU1NiwgMHhCNTdCQTczRiwKKzB4OEIyREFBM0UsIDB4RjFFMkQyNEUsIDB4NDhGN0Q0RUUsIDB4NzAzOUZEQjMsCisweEM2NjZFRURDLCAweDI1MUY5NzJFLCAweDRENTNGNkJGLCAweDZDQzczRUU3LAorMHhDQjA3RjdCOSwgMHg2OUVDQjhDQSwgMHgzNjNGRDgwQywgMHgzQjU4N0FCMywKKzB4NzM4QzFFNUMsIDB4NUM5QzFEOTIsIDB4RTdCNTIzOTYsIDB4RURFNjMyNEIsCisweEZFNUI1MDQ1LCAweEM5MEQ4QjNFLCAweDM3MUEwMTI4LCAweEYyQzhEQ0Y4LAorMHg1QjY0OENCNSwgMHgxMkY4RThGRiwgMHg1RkU0QkE3MSwgMHhCOTI1Q0ZCRSwKKzB4NzQxNkUxNEYsIDB4NzY0ODlGRkUsIDB4MUY0REUzNjcsIDB4QTQwMEYwMzksCisweDY2MzkwRTgzLCAweDFBRTc5Q0VDLCAweERCNTczRTk4LCAweEI2MDIxRjI5LAorMHhEMDE2MTVFNSwgMHgwMkEyMjgxRiwgMHhFODUwMTlDMSwgMHgwMjdCQjQxRiwKKzB4OEQ5MTc3QzMsIDB4NzkwMjZFNzgsIDB4RjE1OEI2MjMsIDB4QkVGRjU4NTgsCisweDdCNjM1MThFLCAweDhGNDJDMDhDLCAweEIzODgyMjdELCAweDk0MEQ2MDdBLAorMHhBNEM3OTU0MSwgMHg5ODAwQ0M5MSwgMHhBMzU2QjUzNSwgMHgyODVCQUJCOSwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweEU0MTFFNTIwLCAweEEwMDI0NTI4LCAweDQ0MkI0NDI4LCAweDk2MDcwMDA5LAorMHg0NjEwNjI0NiwgMHg4RkZCMjUyMiwgMHhENDAyNzUwNCwgMHgwMDA5QUZGNSwKKzB4MDAwMDBGQjMsIDB4MDAyMDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDE2RDQ5MzU3LAorMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMEQsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweDdGMDQ3NjAxLCAweEEwNUE0RjI2LCAweDRGMjI2RUY2LAorMHg0MTBCRDE4NSwgMHhENDg1MDAwOSwgMHgwMDA5NDQwQiwgMHg0NTBCRDU4NCwKKzB4RDc4NDAwMDksIDB4RDI4NEUxRkYsIDB4MjcxMjYxMUQsIDB4RDQ4MzUwMjksCisweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLCAweEU3MjAyNDUyLAorMHg0NzE4RDU3RiwgMHgyNTcyRDI3RiwgMHhEMTdGRTcwMCwgMHhENjgwRDQ3RiwKKzB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RTI2MjAsIDB4MjY0MUU0RkYsCisweEQ1N0RFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLCAweDQwMDA2MjZELAorMHg4RkY4MzIxMiwgMHhENTc5MDU0NSwgMHgyNTIwRTIwMSwgMHhEMjc5RDc3OCwKKzB4MjcxMEUxMDAsIDB4RTU4MDIyMTIsIDB4NjU1QzY2MTMsIDB4NjY2REQ0NzYsCisweDc2MDQ2NzYzLCAweDM3NEM2MjZELCAweDhGRjgzMjUzLCAweEQ0NzMyNzEyLAorMHhENTczRTEwMSwgMHhENjczMjQxMCwgMHgyNTQyRTQwMCwgMHhFMDNBRTUwMSwKKzB4RDI3MkQ3NzEsIDB4RTAzOTA2NTQsIDB4MjcxMTA2NTQsIDB4MDAwQjRGMjYsCisweDdGQzgyMjExLCAweEQ3NkZEMTZFLCAweERDNzBEQjZGLCAweEQyNzFERTcwLAorMHhENTcyRDQ3MSwgMHgxRjEyRDY3MiwgMHgxRjc2NzEwQywgMHgxRkI4NzdGQywKKzB4MUZFQTFGQzksIDB4NzIwNDFGMkIsIDB4REU2RkRDNkUsIDB4MUYxM0VCMTAsCisweDFGNTExRjQ0LCAweDFGNzcxRjY1LCAweEQ4NkMxRjJDLCAweERENkREOTZDLAorMHhEMjZERUEwMCwgMHg4OTAwM0EyMiwgMHhEMTU4N0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGOThCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTRDLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0QiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGQUQxNDcsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNzY3OTIsIDB4MjE3MjUyRjYsIDB4RDY1NTUxOTEsIDB4NTVGQjIyMTIsCisweDUyRkM2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwMkRFMjY1MiwgMHhDOTAzNjAyMSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDcyNkQ1NDEsIDB4NjU1MkQ0NDEsIDB4NTE0MzY2NzIsCisweDMxNkMzNjVDLCAweDI3NjIyNjY4LCAweDE0MTM4RDA1LCAweDYyNjJENjNELAorMHhCMUE1NzIwMSwgMHhENjFFMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3OCwgMHgwMDIwMThBMCwgMHgwMDIwMTkyMiwKKzB4MDAyMDEyOEMsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOTdDLCAweDAwMjAzNTE0LCAweDAwMjAzOTg0LCAweDAwMjAzOTkwLAorMHgwMDIwMzk5QywgMHgwMDIwMzlGOCwgMHgwMDIwMzlGQywgMHgwMDIwMzlBNCwKKzB4MDAyMDM5QTUsIDB4MDAyMDM5QTgsIDB4MDAxMTc3MDAsIDB4MDAyMDNBMTIsCisweDAwMjAzNTc4LCAweDAwMTE0MkQ4LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LAorMHgwMDFDM0QzMCwgMHgwMDExNzcxOCwgMHgwMDFDM0QwMCwgMHgwMDFDMTAwMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxMTc3MTAsCisweDAwMUMzNTIwLCAweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDAwMUMxMDI4LAorMHgwMDIwMzU4QywgMHgwMDIwMzlBQywgMHg3RkZGRkZGRiwgMHgwMDIwMTczNCwKKzB4MDAyMDMyQkUsIDB4MDAyMDIyRTgsIDB4MDAyMDNEQzAsIDB4MDAyMDM5RkEsCisweDAwMjAzNTg0LCAweDAwMjAzOUVDLCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzUxQywgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE3QzAwMDksIDB4MzYyMDYyMTIsIDB4RDQ3Qjg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTc5LCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc3NSwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI3MjU1RjIsIDB4NjIyMjYwNTIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJELCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4NTFGMjU1RjgsIDB4RTcwMUNCMDEsIDB4MjUwMkQyNjMsIDB4RTEwMDIxNzIsCisweDIyMTFENTY0LCAweDc0MDE2NDUyLCAweDI1NDJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTVGRkQ0NUQsIDB4NjU1RDY3NDIsIDB4OEIxMDI3NTgsIDB4NjI3MkQ3NUIsCisweDhCMEMzMjYwLCAweDU1RjI1N0Y4LCAweDI3NjJFMTAxLCAweEQ1NTIyNTEyLAorMHhENzU3RTQwMCwgMHg2MjcyMjU0MSwgMHhBMDc3NzIwMSwgMHg1MkYzMjcyMiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQ1NTA4QjZDLCAweDYxNTI1N0Y0LCAweDcxMDFFMjQwLCAweDY0NzIyNTEyLAorMHgxRjRERDE0RCwgMHg0MjE4MjQxOSwgMHg4QjAzMzQyMCwgMHg2MjYyRDY0QiwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NDAsIDB4MjYyMUIwQUEsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhENzQxOEIxNiwgMHg2NDcyNTFGNCwKKzB4NzQwMUQyM0QsIDB4NjUxMjI3NDIsIDB4MUY1REU2NDAsIDB4NDYxODI1MjksCisweDhCMDMzNTYwLCAweDYyNjJENjNCLCAweDI2MjI3MjAxLCAweEUyMDBENjJFLAorMHgyNjIxQjA4NiwgMHgwMDA5QTAxMCwgMHhENzM4RDEzNywgMHhEMjJBNjQxMiwKKzB4RTUwMDc0MDEsIDB4MjE0MjNBNzYsIDB4MjI1MThGMDYsIDB4RUEwMEQ2MzQsCisweDcyMDE2MjYyLCAweDI2MjJCMDc0LCAweDJGQjJENTMyLCAweDk1NDA2NjUyLAorMHhENDMwNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYxNSwgMHhEMTE1MjYyMSwgMHgyMTIxRTIwMCwgMHhFMjAyNTZGNSwKKzB4NDIxODY2NjIsIDB4MjYyODQyMjgsIDB4MUY2RDhEMEMsIDB4RDYxRkQxMUUsCisweDQ2MEI2NTExLCAweDIwMDg2NDVELCAweDU3RjU4OTA0LCAweDYyNzJEMTFDLAorMHgyNzIyMjIxOSwgMHhEMTFCRTIwMSwgMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwKKzB4MDAwOUFFMTcsIDB4NDUwQkQ1MTgsIDB4RDExODAwMDksIDB4QUUxMEU2MDAsCisweDA3RDEyMTYwLCAweDAwMjAzQTBDLCAweDAwMjAzQTEwLCAweDAwMjAzQTE4LAorMHgwMDFDM0RDMCwgMHgwMDExNzcyQywgMHgwMDFDM0I4OCwgMHgwMDIwMzlGNCwKKzB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsIDB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsCisweDAwMTE3NzQ4LCAweDAwMTE3NzY4LCAweDAwMTE3NzZDLCAweDAxRkZGRkZGLAorMHgwMDExNzc0QywgMHgwMDIwMzU4NCwgMHgwMDExNDJEOCwgMHgwMDExNDc3NCwKKzB4RkRGRkZGRkYsIDB4MDAyMDNEQzAsIDB4MDAyMDI0NkMsIDB4MDAyMDM5RkEsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEMTFGN0ZGNCwgMHg2MjEyREUxRiwgMHg2N0UyNTQxMSwgMHhENDFFMUY0MSwKKzB4MUY3MjJGMjIsIDB4Njc0M0Q1MUQsIDB4Nzc5NEQyMUQsIDB4NUE0MjU4NDEsCisweDZDNzI2OTQyLCAweDZEMjI1QjE2LCAweEU2MDA2MDUyLCAweDI1MDJDQjIwLAorMHg3NjAxRTU0MCwgMHgzMjUzNjI2RCwgMHg2MkYyOEJGQiwgMHgyMTIyNTVGMSwKKzB4NTVGMjExNTEsIDB4MkU1MkQ2MTMsIDB4MTRBMjE0ODEsIDB4RDQxMjI0OTIsCisweDExQjYyN0MyLCAweDY3NDIyNkQyLCAweEQ5MTFEQTEwLCAweDJBNzJFODAxLAorMHgxQThDNDkwQiwgMHg0MjE4RTIwMSwgMHg3RjBDMUEyQywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4MDAwMDY4RjYsCisweDAwMUMzQjlDLCAweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLAorMHgwMDFDNTk2MCwgMHgwMDFDODk2MCwgMHgwMDIwMzU4QywgMHgwMDFDM0QwMCwKKzB4MDAyMDE2MTAsIDB4MkY5NjJGODYsIDB4MkZDNjJGQTYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweDdGODg0RjAyLCAweEUwMThERUIyLCAweEQ0QjI2MUUwLAorMHg2MUUzMEYxNCwgMHg2MjEwNzEwMSwgMHg0NDBCRTAxQywgMHgyMDA4MEYyNCwKKzB4OEYxMjZEMDMsIDB4RDRBRDFGMDgsIDB4Njc0MEREQUQsIDB4NjU3Q0Q0QUQsCisweDQ3MEJEN0FELCAweEQyQUQwMDA5LCAweDYyMUM2MTIwLCAweDQ2MDg2NjIzLAorMHgzNjI4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDFDMUZEOCwgMHhFNTgwMDRGQywKKzB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTcsIDB4MDFGQ0UwMTgsCisweERFQTNFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELCAweDYwNzAzN0VDLAorMHgzMURDNjE1MywgMHg4MDE0NzUwMSwgMHgzMjQzNjI1RCwgMHhENDlEOEJGNCwKKzB4RTIwMEQ1OUQsIDB4QTI3RjI0MjEsIDB4MjAwODI1MjEsIDB4RTAxODhCMTMsCisweEU1MDAwMUZDLCAweEEwMDlERTk2LCAweDY1NUQ2NDFDLCAweDMyRUM2MjUzLAorMHg2MjUzNjcyMiwgMHgzMkRDNjY3MiwgMHg3NTA0MTI2MSwgMHgzMjQzNjI1RCwKKzB4QTI2OThCRjMsIDB4ODgwMTJEMTAsIDB4RTAxODhCMTYsIDB4RTQwMDAxRkMsCisweDY3MUMyRDQwLCAweDYyNERERThBLCAweDhCMDEzMjczLCAweDAwMDlBMjVDLAorMHg2REUzNjQ0RCwgMHg3RDA0NjI0MywgMHgzMkVDNjY0MywgMHg2NTIyMzZEQywKKzB4NzQwODYxNjIsIDB4MjUxMkFGRUYsIDB4OEIxOTg4MDQsIDB4MDFGQ0UwMTgsCisweDJENzBFNzAwLCAweDFGRDU2RDFDLCAweDYyN0RERTdELCAweDhCMDEzMkQzLAorMHgwMDA5QTI0MiwgMHg2MTczNjc3RCwgMHgzMUVDNjVFMywgMHg3NTA0NjQxMiwKKzB4MzY1QzY2NzMsIDB4NjE0MjYyNjIsIDB4MjEyOTc3MDgsIDB4MjQxMkFGRUQsCisweDhCMTk4ODA1LCAweDAxRkNFMDE4LCAweDJENzBFNzAwLCAweDFGRDQ2RDFDLAorMHg2MjdEREU2RiwgMHg4QjAxMzJEMywgMHgwMDA5QTIyNiwgMHg2MTczNjc3RCwKKzB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsIDB4MzY1QzY2NzMsIDB4NjE0MjYyNjIsCisweDIxMkI3NzA4LCAweDI0MTJBRkVELCAweDhCNTk4ODMxLCAweDYxRTZERTY3LAorMHg2MUUzMUYxOSwgMHg2NEUyNzEwNCwgMHgxRjRBNjIxNiwgMHgxRjJCNjQxNiwKKzB4NzVFNDY1MTMsIDB4NjY1MzY3MTIsIDB4MUY0Qzc2MDQsIDB4NjQ1MjFGN0QsCisweEQ3NUY2RTY2LCAweDI3RTBEMjVGLCAweERFNUY2MDYyLCAweEM5MDEzMjQ1LAorMHg2NTYyMkUwMCwgMHg0NjA5MDYwQSwgMHg0NjA5RDE1QywgMHg0NjA5NDUwOSwKKzB4MjE1MDFGNEUsIDB4QjJCMDY0NkQsIDB4NjIwRDFGNkYsIDB4OEIwMTIyMjgsCisweDAwMDlBMUVBLCAweEQ3NTZERTU1LCAweDY2MUM2MUUwLCAweDY0MTBEMTUwLAorMHg0NzBCNjU0QywgMHg3RkZDNTRGRiwgMHgyRkUyNUVGRSwgMHg1MUZFN0ZGQywKKzB4MkYxMkUwNDAsIDB4NTVGQkQxNEYsIDB4NTdGRDU2RkMsIDB4MDRGRTQxMEIsCisweEQyNEQ3RjA4LCAweEUxMUM2NDBELCAweDFENDEyRDEwLCAweEQ0NEI2NTIyLAorMHg2NzQyMUQ1MiwgMHgxRDczREU0QSwgMHhEMjRBNjVFMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyNDksIDB4RDI0OTZFMjIsIDB4NjYyMjFERTYsIDB4MUQ2N0ExQkMsCisweDg5MDE4ODMwLCAweDAwMDlBMDhFLCAweEUzNDBENTM4LCAweDMzRkM2MTU2LAorMHgyMzEyNjQ1NiwgMHg3MTA0NjE1MywgMHg2NzUyMTM0MSwgMHgxMzcyNjQxNiwKKzB4N0VFNDZFMTMsIDB4NjVFNjYyMTIsIDB4NjZFM0Q3MzEsIDB4MTMyNDZFRTIsCisweDc2MDQyN0UwLCAweDYwNjJEMjJGLCAweDMyNTVERTJGLCAweDJFMDBDOTAxLAorMHgwNjBBNkU2MiwgMHhEMTJENDYwOSwgMHg0RTA5NDYwOSwgMHgxMzQzNDYwOSwKKzB4NjQ2RDIxRTAsIDB4QjI1MDFGNUUsIDB4NjIwRDFGNkYsIDB4OEIwMTIyMjgsCisweDAwMDlBMThBLCAweERFMjVENTIyLCAweDYxRTA2NDUwLCAweEQ3MjQ2NTRDLAorMHg0NzBCNTRGRiwgMHg3RkZDNjYxQywgMHgwNkZFRTA1NCwgMHg3RkZDMkY2MiwKKzB4RUU0MDAxRkUsIDB4MkYxMjNFRkMsIDB4NTVFMkQxMjUsIDB4NTdFNDU2RTMsCisweDY0RTI0MTBCLCAweEQyMUM3RjA4LCAweEUxMUM2NDBELCAweDFENDEyRDEwLAorMHhENjFBNjUyMiwgMHg2NzYyMUQ1MiwgMHgxRDczREUxOSwgMHhEMjE5NkVFMiwKKzB4NjIyMjFERTQsIDB4RDIxODFEMjUsIDB4MUQyNjYyMjIsIDB4NjIyMkQyMTcsCisweDFEMjdBMTVBLCAweDAwMTE3ODAwLCAweDAwMjAyQTE4LCAweDAwMjAzOTk2LAorMHgwMDIwMzVCQywgMHgwMDIwM0E3QywgMHgwMDIwMThEMCwgMHgwMDIwMzk5NSwKKzB4MDAxMTc4MDQsIDB4MDAyMDNBMTQsIDB4MDAyMDNBMTYsIDB4MDAxMTc4MTAsCisweDAwMjAzOTkxLCAweDEwNjI0REQzLCAweDAwMjAzOTkyLCAweDAwMjAzOTkzLAorMHgwMDExNEFBNCwgMHgwMDIwMEY2OCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkMwLCAweDhCMDQ4ODMzLCAweDQ3MEJEN0EyLCAweEExMjNFRTAwLAorMHg4ODI4MkRFMCwgMHhBMEQzODkwMSwgMHhERTlGMDAwOSwgMHg2MkUxRTE0MywKKzB4MzIxNkUwNTQsIDB4MEZFNjhGMDIsIDB4MkUyMUUyNDAsIDB4NjIyRDYyRTEsCisweDhCMDEzMjE3LCAweDAwMDlBMEJDLCAweEU1MDE4NUUxLCAweDhCMDEzMDU2LAorMHgwMDA5QTBCNiwgMHgyRDEwRTEwMSwgMHg2NEUxQjExMSwgMHgwNkZFRTA1NCwKKzB4NjI2MUUxNDMsIDB4MzUxNzY1MkQsIDB4RTY0MDg5NDUsIDB4OEIwQzM1NjMsCisweEUwNThFNDFBLCAweEU1MDAwRjQ1LCAweDcyQzBFMDVDLCAweDYwMjMwRjU1LAorMHg2NzAzQzkwNywgMHhBMDE0RTA2MCwgMHg2NjUzMEY3NSwgMHg0NjIxNDYyMSwKKzB4NDYyMTQ2MjEsIDB4NDUyMTQ2MjEsIDB4RTA1ODc2MTgsIDB4MEY2NTQ1MjEsCisweEUwMDM0NTIxLCAweEUwNUMyNTA5LCAweEUwMDcwRjU1LCAweEUwNjAyMjA5LAorMHhFODU0MEYyNSwgMHg4NTgyMzhGQywgMHg2NDBENjVGMywgMHgxODQ0QjE3MCwKKzB4REQ3QTg1ODQsIDB4ODU4NjZDMEQsIDB4NjEwRDRDMDgsIDB4NDEwODYwQzMsCisweEUwMEYwRUZFLCAweDE4MTU0RDBCLCAweDJFMjk2MjA3LCAweDY2ODI2MEMzLAorMHg4NTYyMEZFNiwgMHg0RDBCNTE4NSwgMHgyRTBCNjAwRCwgMHg1NDg0NjBDMywKKzB4QjEzQzBGRTYsIDB4RTA1NDY1RjMsIDB4RTU0MDBFRkUsIDB4RTA2QzYyRTEsCisweDM2NTM2NjJELCAweDBGNjY4RDQxLCAweEM5MDM2MDIzLCAweDQwMDA0MDA4LAorMHg2MTAzNjQwMywgMHhEOTY1RTA3MCwgMHgwRjQ2RTVGRiwgMHhFMDc0NjU1QywKKzB4NjA1MzBGOTYsIDB4NjI2MzQ5MEIsIDB4NDIyMTQyMjEsIDB4NDIyMTQyMjEsCisweDQyMDA2NzIzLCAweDQyMDAzMjdDLCAweDZDMDc0NjIxLCAweDQ2MjFFMDU0LAorMHg2MDYzMDlGRSwgMHg0MDA4QzkwMywgMHg3OTA2MzBGQywgMHg2QTAzNkQyRCwKKzB4NjVGM0U4MDAsIDB4NjREM0IxMjQsIDB4RTA3MDZFQTIsIDB4MkFFMjJFQzksCisweDAxRkU2Njk0LCAweDY2NkNFMDc0LCAweDQ3MEIwN0ZFLCAweDJFMEI2MDYzLAorMHg2NUYzMkFFMiwgMHhCMEZBNjREMywgMHg2MjhENzgwMSwgMHgzMkUzRUUwNiwKKzB4N0QwMThGRTcsIDB4MEVGRUUwNTQsIDB4RTA1NDYyRTEsIDB4NDIwMDA2RkUsCisweDc2MEM4NTYxLCAweDcwMUIzMDJDLCAweEU0MDA2MTAzLCAweEU3MDQ2NUYzLAorMHg2ODY2NzQwMSwgMHgzOTczNjk0RCwgMHg4RkY5MjU4MiwgMHg2NUYzNzUwNCwKKzB4NjQxREIwREQsIDB4MEVGRUUwNTQsIDB4NjRFMUIwOUMsIDB4MDAwOUEwNTQsCisweEQ0M0I1NkY4LCAweEVBMDFEMjNCLCAweDI2QTA0MjBCLCAweDAwMDlBMDRDLAorMHgwNkZDRTAxQywgMHg4ODI5NjA2QywgMHg1Q0Y4OEIwOCwgMHhFMjAwRDYzNiwKKzB4NTI2MTJDMjAsIDB4NjQyREIwNEIsIDB4MDAwOUEwM0UsIDB4NjY2Q0U2ODEsCisweDhCMDQzMDYwLCAweDQyMEJEMjMxLCAweEEwMzU1NEY4LCAweEU2ODIwMDA5LAorMHgzMDYwNjY2QywgMHhEMjJFOEIwNCwgMHg1NEY4NDIwQiwgMHgwMDA5QTAyQywKKzB4NjY2Q0U2ODMsIDB4OEIwQTMwNjAsIDB4REEyNzU1RjgsIDB4MjU5MEU5MDAsCisweEQ4Mjg1NUExLCAweDI4NTJENjI4LCAweEEwMUQ1MkEyLCAweEU2OTIyNjIwLAorMHgzMDYwNjY2QywgMHhEMjIwOEIwOCwgMHg1QzIxRDgyNCwgMHg2Q0NDNTJGOCwKKzB4MjhDMUU2MDAsIDB4MjI2MEEwMTAsIDB4NjY2Q0U2OTMsIDB4OEIwNjMwNjAsCisweEQ2MUY1OUY4LCAweEUyMDFFQTAwLCAweEEwMDUyOUEwLCAweEQ2MTYyNjIxLAorMHhEMjFERDQxQywgMHg2NTYyNDIwQiwgMHg0RjA2N0Y3OCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4NkFGNjZDRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweEUyNDA2MTRELCAweDg5MzIzMTIzLCAweDMxMjdFMjFGLCAweDhCMjdENzEzLAorMHhENDA2NjE0RCwgMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywKKzB4MTc2MUEwMjUsIDB4MDAyMDBGQkMsIDB4MDAxMTc4MDQsIDB4MDAyMDM0NzAsCisweDAwMjAzQTlDLCAweDAwMjAxOEMwLCAweDAwMTE3ODAwLCAweDAwMTE1RjAwLAorMHgwMDExNjA1OCwgMHgwMDIwMzk3QywgMHgwMDIwMzk5MCwgMHgwMDIwM0ExQSwKKzB4MDAyMDNBMTYsIDB4MDAyMDNBQjQsIDB4MDAyMDE4RDAsIDB4MDAxQzM3MDQsCisweEUwMDFENDkwLCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDc4OTMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyODYsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjgyLCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1N0UsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1N0E0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDU3MzQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjZELAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDYyLCAweDZFNDNCRkQ2LAorMHgyREUyQkZCQiwgMHgwMDA5QkZEMiwgMHgyQzEyNTFENSwgMHgxQzQxNTRENiwKKzB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LCAweDI0MjI3NjAxLAorMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHhENjUzMDAwOSwgMHg4NTYyRTUwMCwKKzB4QTAwQjY3NEQsIDB4NjU1RDYxMEQsIDB4NDAwMDYwNTMsIDB4MzA1Q0Q0NEYsCisweDAyNEQ0MDA4LCAweDMyNzA2MjJELCAweDc1MDE4OTA1LCAweDMyMTM2MjVELAorMHgwMDBCOEJGMSwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMSwgMHg1NDQxNjc0MywKKzB4NEUwOEVFN0YsIDB4NEUyOEQyNDYsIDB4MjVFOTY1NDMsIDB4NjA0MzZFMjEsCisweDlFNzU2MkVELCAweDQ1MjlDOTAzLCAweEU2MDAzMkUzLCAweDhENDU2MTAzLAorMHgyMTE4NDUwOSwgMHhEMjNGOEIwNSwgMHgwMDJDNjA1MywgMHhBMDhBQzkzRiwKKzB4NjAxMzY2MDMsIDB4OEIyNjg4MDEsIDB4ODgwQzYwNTMsIDB4RDUzQThCMDQsCisweEM5M0Y4NDUzLCAweDY2MDNBMDdGLCAweDhCMDQ4ODA4LCAweDg0RTJERTM2LAorMHhBMDc4QzkzRiwgMHg4ODBENjYwMywgMHg4QjAzRDYzMywgMHhDOTNGODQ2MSwKKzB4NjYwM0EwNzEsIDB4ODgwOTYyNjAsIDB4NjIyQzhGMDksIDB4RTAxNERFMkMsCisweDY1NUMwNUVDLCAweDYwMjMzMjU4LCAweEEwNjRDOTNGLCAweDYwMjM2NjAzLAorMHhBMDYwQzkzRiwgMHg4ODAyNjYwMywgMHhFMDA3OEI1RCwgMHg2MDQzMjUwOSwKKzB4ODkwNUM4MTAsIDB4NjA1M0QyMjUsIDB4QzkzRjAwMkMsIDB4NjYwM0EwNTMsCisweDYwNTNERTIzLCAweEM5M0YwMEVDLCAweDY2MDNBMDRELCAweDg4MDE2MDEzLAorMHg2MDUzOEIxOSwgMHg4QjA0ODgwQywgMHg4NDIzRDIxRSwgMHhBMDQyQzkzRiwKKzB4ODgwODY2MDMsIDB4RDUxQjhCMDQsIDB4QzkzRjg0NTIsIDB4NjYwM0EwM0IsCisweEQ2MTg4ODBELCAweDg0NjE4QjAzLCAweEEwMzRDOTNGLCAweDYwNjA2NjAzLAorMHhBMDMwQzkzRiwgMHg4ODAyNjYwMywgMHhFMDA3OEIyRCwgMHg2MDQzMjUwOSwKKzB4ODkyM0M4MTAsIDB4NjA1M0RFMTAsIDB4QzkzRjAwRUMsIDB4NjYwM0EwMjMsCisweDAwMDAwQkI4LCAweDAwMjAzNDcwLCAweDAwMUMzNzA0LCAweDAwMUMzNzNDLAorMHgwMDFDMzcwMCwgMHgwMDFDMzcwQywgMHgwMDExNDAwMCwgMHgwMDExNDAwOCwKKzB4MDAxMTQyRDgsIDB4MDAxMTQyRTQsIDB4MDAxMTQyRTgsIDB4MDAxMTQyRjUsCisweDAwMTE0MkVELCAweDAwMTE0MkZELCAweDAwMTE0MzA5LCAweDYwNTNEMjA5LAorMHhDOTNGMDAyQywgMHg2MDEzNjYwMywgMHg4QjAzODgwMiwgMHhDODEwNjA0MywKKzB4NzYwMjg5MDAsIDB4QzkzRjYwNjMsIDB4NDAwMDQwMTgsIDB4MTc0MTI0MEIsCisweDZFRjYwMDBCLCAweDAwMTE0MzAxLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LAorMHhERDk0NEYyMiwgMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywKKzB4NjJEMjY1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsCisweDU1RDE0MjBCLCAweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LAorMHg0MjBCRDI4QSwgMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwKKzB4RDI4NkQ0ODksIDB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsCisweEQ0ODYwMDA5LCAweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkU2MzZDNzMsIDB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsCisweEIwNzU2NkMzLCAweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFDMDAwOSwgMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsCisweEQ2NzAwNTI5LCAweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwKKzB4NjREMzU3RjQsIDB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsCisweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHhFNTAzRDE2MiwgMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwKKzB4RDQ1RkQxNUUsIDB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsCisweEJGNzNFNDBBLCAweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLAorMHhCRjY5MjIxMiwgMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwKKzB4NEYyMjI3MDIsIDB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsCisweEQxNTUyRkU2LCAweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LAorMHg0NTAwMjYyOSwgMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwKKzB4RDE0RTQ3MDgsIDB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsCisweDRGMjIyRkU2LCAweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLAorMHhFNTAwNzc2QywgMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzIyMjcxMiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsCisweEQyMzQ2RUY2LCAweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLAorMHhFNjA1RDQzMiwgMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwKKzB4RTQwQUU2MDEsIDB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLAorMHhDOTAzNjBCMiwgMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwKKzB4QjA3Q0M5MDMsIDB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsCisweEQ0MjEyRkUxLCAweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELAorMHg4OUZGQzgwMSwgMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4MDAxQzNCODgsIDB4MDAyMDNBQzgsIDB4MDAyMDE4RDAsCisweDAwMjAzQUQwLCAweDAwMjAzQUQ4LCAweDAwMjAzQUUwLCAweDAwMjAzQUU4LAorMHgwMDI1RTcyMCwgMHgwMDIwM0RCQywgMHgwMDIwMzk4MCwgMHgwMDFDNTk2OCwKKzB4MDAxQzNCNDAsIDB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsCisweDAwMjAxNUU0LCAweDAwMjAxNjEwLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLAorMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywKKzB4MDAxQzU4MUMsIDB4MDAxQzU4NjAsIDB4MDAyMDNBRjAsIDB4MDAyMDE4QzAsCisweDhGMDE0NDExLCAweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLAorMHg0NjI4NjA1MiwgMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsCisweDAwMDlCRkVDLCAweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LAorMHgwMjBBM0Q2NSwgMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwKKzB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsCisweDJGRTYyRkQ2LCAweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLAorMHhCRkNCREQxMywgMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwKKzB4MzZFMjQ2MDEsIDB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsCisweDZDRjYwMDBCLCAweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLAorMHhCRkI5MkUxMiwgMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywKKzB4NEYyNjJFNzIsIDB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsCisweENDQ0NDQ0NELCAweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwKKzB4NjQ1M0U3MTAsIDB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsCisweDMxNUM0MTA4LCAweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELAorMHhFRDAwNjBCMywgMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywKKzB4MTFENDExRDMsIDB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsCisweDU4RjEyODcyLCAweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLAorMHg1NEY2NUVGNSwgMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwKKzB4MTFFNjExRTcsIDB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsCisweDUyRjlEREE3LCAweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LAorMHgyRDcyRUFFRiwgMHg2QUFDMjYyMiwgMHg2REUzNkVFRCwgMHg2MUUzNEQwOCwKKzB4NDEwODNERUMsIDB4MzFFQzREMDgsIDB4NjBCMzNEOUMsIDB4MkRCMTQxMDgsCisweEUwNTA4MUQxLCAweEU3OUY0MTA4LCAweDQxMDg0MDA4LCAweDgxRDI2NzdDLAorMHgzMThDNjBCMywgMHgzNDcyRTIwMCwgMHgxREQyODFEMywgMHhENDkzMUQxMywKKzB4MUQyNDhEMDEsIDB4NjVEM0Q0OEYsIDB4N0UwMUIwQjIsIDB4MzRBMjY0RUQsCisweERBOEM4QkRBLCAweDY4QTIyRkQyLCAweDQ4MjlERDkxLCAweDY0QTIyRDgyLAorMHg2OTREN0RGQywgMHgyRDkyRDI4NiwgMHg0RTI5NkUyMiwgMHgyREUyN0QwQywKKzB4NkFEMzY4MjIsIDB4RDc4NDYxOEQsIDB4NkQ3MjJBMTYsIDB4RDU4M0Q0ODksCisweDVFNzIyNEQyLCAweDE0RTJENjg4LCAweEVFMDA1MTc0LCAweDU4NzYxNDE0LAorMHgxNDg2RDE4NiwgMHhFNzEwNTk3OCwgMHg2MjUyMTQ5OCwgMHgxNDJBNjVFMywKKzB4NjRFMzI2RTIsIDB4NjQ0REU2MDAsIDB4NDgwODY4NDMsIDB4NDgwODM4NEMsCisweDYwNTMzODFDLCAweDI4QjEwQzg2LCAweDYwQjMwOUNFLCAweDYwNTM4MTkxLAorMHg2MDQzMEFDRSwgMHg2MDUzODFBMiwgMHg2MEIzMERDRSwgMHg2MDUzODFEMywKKzB4NzQwMTA4Q0UsIDB4MDlDRTE4ODIsIDB4MTlFMzYyNEQsIDB4MzI3MzBBQ0UsCisweDhGRTAxQTY0LCAweEQ5NkE3NTA0LCAweDZDOTJFMDAzLCAweDJDQjE0MDE4LAorMHhEQTZGNkQ5MiwgMHhFMDUwODFEMSwgMHg0MDA4NkU5MiwgMHg2MTkyODFFMiwKKzB4ODExMzYwQjMsIDB4RTYwMDY0OTIsIDB4Njc5MjE0NDIsIDB4MTdBM0Q0NjgsCisweEUxRkY2ODkyLCAweEU3MDMxODY0LCAweDQ2MDg2NTYzLCAweDc1MDEzNjRDLAorMHg2NjVEMjYxMiwgMHg4QkY4MzY3MywgMHhFMDAzREM1QSwgMHg0MDE4NkRDMiwKKzB4NkVDMjJEQjEsIDB4ODFFMUQyNUYsIDB4RUUwMDYxQzIsIDB4NjRDMjExMTIsCisweDE0MjNFMDI0LCAweEQ0NUI2NUMyLCAweDY3QzIxNUU0LCAweDgxNzJFNTgwLAorMHg2NkUzNjhDMiwgMHg2NTVDODE4MywgMHg2OTYzNjY2RCwgMHg2QTZENzYwNCwKKzB4M0E1MzM5NEMsIDB4MjlFMjhGRjgsIDB4REM1NERCNTMsIDB4NzQwNDI0QjIsCisweDdGNjgyNEMyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHg2MTQyNjhGNiwgMHhDODAzNjAxMSwgMHhFNTAwOEYwMywKKzB4MzQyMEQyM0MsIDB4NjAxMThCMDYsIDB4ODgwMkM5MDMsIDB4RDIzOThCMDYsCisweDhCMDMzNDIwLCAweDY1MTM1NjEyLCAweDI0MjI1MjY0LCAweDYwNTMwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwKKzB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsCisweDYwNTM4MTIzLCAweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwKKzB4NjVGMzYxRjEsIDB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsCisweDYwNzE1N0QxLCAweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywKKzB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsCisweDEyRTQ4QjA2LCAweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLAorMHg1NjY0QUZGMCwgMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywKKzB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsCisweDQxMEJFNjE0LCAweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLAorMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzlBQywKKzB4MDAyMDM1N0MsIDB4MDAyMDM1ODQsIDB4MDAyMDM1OEMsIDB4MDAyMDM1QjQsCisweDAwMjAzOTk4LCAweDAwMjAzOUEwLCAweDAwMTAwMjA4LCAweDAwMTAxNEMwLAorMHgwMDFFMjEwQywgMHgwMDFDM0QwMCwgMHgwMDIwMzlFQywgMHgwMDEwMDBDOCwKKzB4MDAxMTc4ODAsIDB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsCisweDAwMjAwRDQyLCAweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LAorMHgzRTJDQTAwNSwgMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwKKzB4MzUyMDUyRTEsIDB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LAorMHgzNjIwNjZDMiwgMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwKKzB4QkYzOEREMzUsIDB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsCisweEQ0MzI4OTA3LCAweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LAorMHhCRjNEMDAwOSwgMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwKKzB4MjI2MkQyMkQsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLAorMHgwNERFNDAwOCwgMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwKKzB4NTVFMjI3RTIsIDB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsCisweDEyMjIwMkRFLCAweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLAorMHhDOTBGNjA1MywgMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4ODU0MzZDRjYsIDB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsCisweEUxMDA4RjBDLCAweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLAorMHhENjEzMTYyMSwgMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwKKzB4MDAwMDAxRkYsIDB4MDAyMDM1OEMsIDB4MDAyMDM1ODQsIDB4MDAxQzNEMDAsCisweDAwMjAzNUI0LCAweDAwMjAzOTdDLCAweDAwMjAxOEMwLCAweDAwMjAzNTdDLAorMHgwMDIwM0IxOCwgMHgwMDIwM0IxQywgMHgwMDFDM0QyOCwgMHgwMDIwMzlFQywKKzB4MDAyMDM5QUMsIDB4MDAyMDBENDIsIDB4MDAyMDM5RjAsIDB4MDAyMDM5RjQsCisweDAwMTE3NzU0LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkY4NEYyMiwgMHg2QzIyRDI0MSwgMHhDODAzNjBDMywgMHhERTQwODk2RSwKKzB4REE0MURCNDAsIDB4NTJCMUQ5NDEsIDB4MzYyMDY2QjIsIDB4NjA2MTg5NDUsCisweDg4MDFDOTAzLCAweEREM0I4OTQxLCAweDQyMEJEMjNELCAweDY1MDM2NEQzLAorMHg2MEExMkYwMiwgMHg4OTMyODgwMSwgMHg4NTE0NTE1MywgMHg4ODQwNjAwQywKKzB4MUYxMThGMEMsIDB4RDUzNzYxOTEsIDB4NjQxRDQ1MEIsIDB4OEIyNjIwMDgsCisweEQ3MzU2NjkxLCAweDY0NkQ0NzBCLCAweDhCMjAyMDA4LCAweDQyMEJEMjMzLAorMHg1MUYxNTRGMSwgMHhDODIwODUxMSwgMHhEMTMxODkwNCwgMHgwMjFFRTA1MCwKKzB4MDEyNjcyMDEsIDB4NDIwQkQyMkYsIDB4MjAwODY0RjIsIDB4NjREMzg5MDcsCisweDREMEJERDJELCAweEQxMkQ2NUYyLCAweEFGQzRFNjAxLCAweEQyMkMyMTYyLAorMHg0MjBCNjVGMiwgMHhENzJCNjRFMywgMHhBRkJDRTYwMSwgMHhEMjI2Mjc2MiwKKzB4NDIwQjY1RjIsIDB4QUZCNjY0RDMsIDB4REUyNzAwMDksIDB4REEyOEREMjcsCisweDUyRDFEQjI4LCAweDM2MjA2NkQyLCAweDYwNjE4OTE4LCAweDg4MDFDOTAzLAorMHhENDIyODkxNCwgMHg0NTBCRDUxNiwgMHg1NjAzMDAwOSwgMHg4RjA0MzZFMCwKKzB4RTIwMTY1MDMsIDB4QUZFQzJBMjAsIDB4RDQxRjJCNTIsIDB4NDIwQkQyMTYsCisweEQ3MTgwMDA5LCAweDQxMThFMTAxLCAweDI3MTJBRkUzLCAweEM4MDQ2MEMzLAorMHhEMjFBODkwMiwgMHgwMDA5NDIwQiwgMHg0RjI2N0YwOCwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4MDAwQjZBRjYsIDB4MDAwMDY5RjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMjAzQTE0LCAweDAwMTE0MkQ4LAorMHgwMDIwMTRBNiwgMHgwMDExNUVBMiwgMHgwMDExNDc3NCwgMHgwMDIwMEQ4QSwKKzB4MDAyMDM1MUMsIDB4MDAyMDE2QzIsIDB4MDAyMDE0RDAsIDB4MDAxRTIxMkMsCisweDAwMjAxNTM0LCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNTdDLAorMHgwMDIwMzk5QywgMHgwMDIwMzk5OCwgMHgwMDIwMzVCNCwgMHgwMDIwMDY0NCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDAwMDkwMDBCLAorMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwgMHhFMDAwMDAwQiwgMHhFMDAwMDAwQiwKKzB4MDAwOTAwMEIsIDB4RTRGREQ1OUQsIDB4RDY5RDYxNTIsIDB4MjUxMjIxNDksCisweDc0MDE2MDUyLCAweDI1MDJDQjAxLCAweEQxOUE2NzUyLCAweDI1NzIyNzQ5LAorMHhDODQwNjAxMCwgMHg2MDYyODkwMiwgMHgyNjAyQ0IwNCwgMHhFMUY3NjQ2MiwKKzB4MjY0MjI0MTksIDB4RTcwMTYwNjIsIDB4MjYwMkM5Q0YsIDB4RTUwMjYwNjIsCisweDI2MDJDQjEwLCAweDQ3MTg2MDYyLCAweDI2MDJDQjAzLCAweDAwMEIxNjUyLAorMHhENThEMTY3MywgMHhEMjhFRDc4RCwgMHhFMTAwRDQ4RSwgMHgyNTExRTYwMCwKKzB4MjIxMDI3MTEsIDB4MjQ2MUFGQ0UsIDB4RDI4QjY2NEMsIDB4MzYyQzQ2MDAsCisweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyODc2NTRDLCAweDM1MkM0NTAwLAorMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI4MywKKzB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsIDB4NDUwMEQyN0YsCisweDY2NTAzNTJDLCAweDI2MTlFMUVGLCAweDI1NjAwMDBCLCAweEQyN0E2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjc2NjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsCisweDQ2MDBEMjcyLCAweDYwNjAzNjJDLCAweDAwMEJDQjA4LCAweDY1NEMyNjAwLAorMHg0NTAwRDI2RSwgMHg2NjUwMzUyQywgMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwKKzB4RDY2OTYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweDYyNEM2MDBDLCAweDQyMDBENjY0LCAweDYwMjAzMjZDLAorMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwgMHg2NDRDRDE2MCwKKzB4NjI0MDM0MUMsIDB4NjAyQzAwMEIsIDB4NjQ0Q0QxNUUsIDB4NjI0MDM0MUMsCisweDYwMkMwMDBCLCAweDRGMjIyRkU2LCAweDY0NUM2RTQzLCAweDM0NjdFNjBBLAorMHhCRkVCODkxNCwgMHg2NDBDMDAwOSwgMHg4ODAxNjBFQywgMHhFMDBGOEIwMiwKKzB4MjQwOUEwMDIsIDB4NDQwOTQ0MDksIDB4RTYwQTYyNEMsIDB4ODkwNTMyNjMsCisweDY0NENCRkUyLCAweDYwMjM2MjBDLCAweDhCMDBDODgwLCAweDYwMjNFMjAwLAorMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg2MDYyRDY0QiwgMHg4QjAzODgwMSwKKzB4MDAwOUIyNTYsIDB4MDAwOUEwMDMsIDB4RTY0MEQyNDgsIDB4RDY0ODIyNjAsCisweDRGMjZFMjAwLCAweDI2MjIwMDBCLCAweEQ2NDM0RjIyLCAweDg4MDI2MDYyLAorMHhCMjlGOEIwMSwgMHhENjQyMDAwOSwgMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwKKzB4RDQzRUQ1M0QsIDB4RTcwMUUxMDAsIDB4MDAwQjI1MTIsIDB4RDIzQjI0NzAsCisweDAwMEJFNjA0LCAweDRGMjIyMjYwLCAweEQxM0JENDNBLCAweDAwMDk0MTBCLAorMHhFMUZERDUzQSwgMHhEMjNBNjY1MCwgMHhFNzAwMjYxOSwgMHg0RjI2MjU2MCwKKzB4MjI3MDAwMEIsIDB4RDUzNzRGMjIsIDB4NjE1MkQyMzcsIDB4NjExREQ3MzcsCisweDY0NTIyNTEyLCAweDI0MkJFNkZGLCAweEQ0MzUyNTQyLCAweDY2NkREMjJFLAorMHgyNzYyNDIwQiwgMHhFMUZCRDUyRCwgMHgyNzE5Njc1MCwgMHgwMDBCNEYyNiwKKzB4NEYyMjI1NzAsIDB4RDEyOEQ0MkYsIDB4MDAwOTQxMEIsIDB4RTdGN0Q1MjcsCisweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweEQ1MjQyNTYwLCAweDYyNTA5NDI1LAorMHgwMDBCMjI0OSwgMHhENTIxMjUyMCwgMHg2MjUwRTRCRiwgMHgwMDBCMjI0OSwKKzB4NEYyMjI1MjAsIDB4ODUyMkQyMjQsIDB4MjAwODYwMEQsIDB4ODgwMTg5MTEsCisweDg4MDM4OTQ0LCAweDg4MDU4OTQ2LCAweDg4MDY4OTQ4LCAweDg4MDg4OTRFLAorMHg4ODA5ODk1NCwgMHg4ODBBODk1QSwgMHg4ODBCODk2MCwgMHhBMDZEODk2NiwKKzB4QjA2RjAwMDksIDB4QTA2QTAwMDksIDB4RkY3RjYwMEMsIDB4MDAxRTIxNDgsCisweDAwMUUxMTA4LCAweDAwMUUxMDAwLCAweDAwMjAzQTRDLCAweDAwMjAzQTRFLAorMHgwMDIwM0E2RCwgMHgwMDIwM0EzMCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwOTAsIDB4MDAyMDNBNTQsIDB4MDAxRTEwMEIsCisweDAwMjAzQTUwLCAweDAwMjAzQjIwLCAweDAwMjAxOEMwLCAweDAwMUUxMDI4LAorMHgwMDIwM0E2QywgMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwgMHgwMDFDMTAwMCwKKzB4MDAyMDNCMkMsIDB4MDAyMDNCM0MsIDB4MDAyMDNBMjQsIDB4MDAwOUIwNEMsCisweDYwMENBMDM1LCAweDAwMDlCMDU1LCAweDYwMENBMDMxLCAweDYyNjBENjg0LAorMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwKKzB4OEIyMzIyMjgsIDB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsCisweDhCMUIyMjI4LCAweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LAorMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwKKzB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsCisweDhCMDMyMjI4LCAweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLAorMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwKKzB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsCisweDI1MjAyNzEyLCAweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLAorMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwKKzB4RDI1QzAwMDksIDB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsCisweDYwNjBENjVELCAweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLAorMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwKKzB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsCisweDIyNjBFMDAxLCAweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LAorMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywKKzB4ODgwMjg5MDksIDB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsCisweEEwNEM4OTNCLCAweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LAorMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwKKzB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsCisweDIwMDg2MDVDLCAweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LAorMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwKKzB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsCisweDY2MjEyNTIyLCAweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELAorMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwKKzB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsCisweDY1MDM4RjAxLCAweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLAorMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwKKzB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsCisweDJGRTYyMTAyLCAweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LAorMHhENTExRDYxRCwgMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwKKzB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsCisweEQyMTZENjE1LCAweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLAorMHgwMDIwM0E2RCwgMHgwMDIwM0EyNCwgMHgwMDIwM0EzMCwgMHgwMDFFMTEwMCwKKzB4MDAxRTEwMEMsIDB4MDAyMDNBNTAsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsCisweDAwMjAzQTU4LCAweDAwMjAzQTM4LCAweDAwMjAzQTNDLCAweDAwMjAzQTQwLAorMHgwMDIwM0E1QywgMHgwMDIwM0E2MCwgMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwKKzB4MDAyMDNFMjAsIDB4MDAyMDNFMkEsIDB4MDAyMDNBNEEsIDB4MDAyMDI3RjIsCisweDg5MTIzNDI3LCAweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLAorMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwKKzB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsCisweEQ2OEM2RUY2LCAweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLAorMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywKKzB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsCisweDIxNDBFNzAyLCAweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLAorMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywKKzB4MjAwODg1NTQsIDB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsCisweDg1NjY2NTBDLCAweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LAorMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwKKzB4QTAwMzAwMDksIDB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsCisweEUyMDFEMTY3LCAweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLAorMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsCisweDM2MjJEQzVFLCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LAorMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwKKzB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsCisweDY1MUQ2NjZELCAweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLAorMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwKKzB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsCisweDMyNUNFMTA3LCAweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLAorMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwKKzB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsCisweEVCMDFFQTAwLCAweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwKKzB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsCisweDY0RTJENjM1LCAweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLAorMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwKKzB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsCisweDQyMDA2MUQxLCAweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LAorMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsIDB4NjRFM0JDODYsIDB4QkM4QjY0RTMsCisweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEJDOEVFRTAxLCAweDY0RTM2NEUzLAorMHg3RTAxQkM5MywgMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwKKzB4RDExODZERjYsIDB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsCisweEQ3MTc3MjA0LCAweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLAorMHgxMzdBMjEyMiwgMHgwMDIwM0E0QSwgMHgwMDIwMjhGRSwgMHgwMDFFMTAxNSwKKzB4MDAyMDNBNTAsIDB4MDAxRTEwMDEsIDB4MDAyMDNBMjQsIDB4MDAxRTExMDAsCisweDAwMjAzQTRFLCAweDAwMjAzQTNDLCAweDAwMUUxMDAwLCAweDAwMjAzQTQwLAorMHgwMDIwM0E0QywgMHgwMDIwMjdGMiwgMHgwMDFFMTAwQywgMHgwMDIwM0EzOCwKKzB4MDAyMDNBNTQsIDB4MDAyMDNBNTgsIDB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsCisweDAwMjAzQTY0LCAweDAwMjAzQTY4LCAweDRGMjIyRkU2LCAweEQ2NzA3RkZDLAorMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTZFRDE2RCwKKzB4REU2RTYwMTAsIDB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNkMsCisweEQyNkM3NTAyLCAweEU2MDFENzZDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDYzNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTYyLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHhBMDIwNzEwMiwgMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ1Mjc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsIDB4NUUyM0Q3NEUsCisweDY0RjIyRkUyLCAweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLAorMHg4MDcxNjEwMywgMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywKKzB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsCisweDgxNzMzMDRDLCAweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLAorMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywKKzB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsCisweDAwMDlCQzk3LCAweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LAorMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYyRiwKKzB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4ODU1MkQ1MkEsCisweDg4MzA2MDBELCAweDg4MzE4OTAzLCAweEEwMzQ4OTIzLCAweDg1NTUwMDA5LAorMHhENDI4RDcyNywgMHg4NTUzMjcwMSwgMHg2MTBERDYyNywgMHgyNDEyNDExOCwKKzB4NDYwQkQ0MjYsIDB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsIDB4NjU3MjQyMEIsCisweEUyMzBEMTIwLCAweDQyMjg2NzEyLCAweDI3MjlFNjIwLCAweDM3NjA0NjI4LAorMHhENjIxOEIwMywgMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwgMHhBMDEyRTIwMiwKKzB4RDExODI2MjIsIDB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsIDB4NDYyODIyNTksCisweDg5MDgzMjYwLCAweEQ0MUFEMTE5LCAweEU2MDFENTEzLCAweDIxNjA0NTBCLAorMHg0NzJCRDcxOCwgMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwKKzB4MDAyMDNBNkMsIDB4MDAxRTEwMDAsIDB4MDAyMDNBNTgsIDB4MDAyMDNFMjAsCisweDAwMjAzRTJDLCAweDAwMjAzREM0LCAweDAwMjAzQTQwLCAweDAwMjAzREY0LAorMHgwMDIwM0RGMiwgMHgwMDIwM0RDNiwgMHgwMDIwM0EyNCwgMHgwMDIwM0E1MCwKKzB4MDAyMDNBM0MsIDB4MDAyMDNBMzgsIDB4MDAyMDE4QzAsIDB4MDAyMDNCNDgsCisweDAwMjAzQjRDLCAweDAwMjAxOEQwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0I2MCwgMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwgMHg4NEU5REU4NiwKKzB4MjQ0ODY0MEMsIDB4QjE3Qjg5MDEsIDB4RDI4NDAwMDksIDB4MjY2ODY2MjAsCisweDYwRTA4OTAyLCAweDJFMDBDOUJGLCAweDAwMEI0RjI2LCAweDAwMEI2RUY2LAorMHgyRkU2MDAwOSwgMHhERTdFNEYyMiwgMHg2MEUwRDY3RSwgMHhDQkMwRDQ3RSwKKzB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsCisweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2Nzg2MTZELCAweEU1MDBBMDA0LAorMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMjc0OEJGOCwKKzB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYyNjBENjZFLCAweDg5NDAyMjI4LAorMHhENTY1RTEwMCwgMHg2MDUwMjYxMCwgMHhDQjQwRDQ2QiwgMHgyNTAwNDQwQiwKKzB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsIDB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsCisweEQ0NjZENjVFLCAweERENjY2NzYwLCAweDY1N0M0RDBCLCAweEUyM0M2RDFELAorMHg4QjAzM0QyNywgMHhEMjY0RDQ2MywgMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwKKzB4QTAwNUQ3NjIsIDB4NjZFNkU0MDAsIDB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsCisweDM1RDM2NTRELCAweEQ3NUU4QkY3LCAweDZFNzJFMDAzLCAweDgxRTE0MDE4LAorMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywgMHhENDVBNjE3MiwgMHhERDVBODExMywKKzB4NjU3MjREMEIsIDB4RDY0QUQyNTksIDB4MjIxMkUxMDEsIDB4QzkzRjYwNjAsCisweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjUyNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywKKzB4MjAwODZENjMsIDB4NjQwMzhEMUMsIDB4RTUwRUQxM0MsIDB4MzI1MjYyMTAsCisweDYwQzM4OTE2LCAweDgwNDEyNEIwLCAweDgxNDE2MEQzLCAweEEwMDdFNTAwLAorMHg2NTVENjFCQywgMHgwMEVDNjA1MywgMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwKKzB4MzIxMzYyNUQsIDB4RDYzMDhCRjUsIDB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsCisweEQyMzlENDQwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTEwMDdGQzQsCisweDY1MTNFQ0ZGLCAweDZCMTM2Q0NELCAweERFMzRENzMzLCAweEVERkY2NEYzLAorMHhEODMzRUEwNCwgMHg2MDUzNjU1QywgMHgwMjdENDAwMCwgMHgzMkMwNjIyRCwKKzB4NjYwMzhEMEQsIDB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsIDB4MjQyMTc0MDIsCisweDY5ODIwMkVELCAweDM5Mjg2MjJELCAweDc0MDIyODkyLCAweDc1MDE3MTA0LAorMHg2MDYzNjI1QywgMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwgMHgyNDQ4NjQxQywKKzB4RTY4MDg5MDUsIDB4NjdGM0U1QzUsIDB4QkY4RjY2NkMsIDB4N0YzQzY1NUMsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHhEMTFDNjhGNiwgMHg2MDEyRDIxQywgMHhDQjIwRTQwNSwgMHgyMTAyRTUwMCwKKzB4MDAwQjIyNDIsIDB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsIDB4MDAyMDM5OTYsCisweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3ODAwLCAweDAwMUUxMEZDLAorMHgwMDIwMDY0NCwgMHgwMDIwMzk5QywgMHgwMDIwMkE1NiwgMHgwMDIwM0I2NCwKKzB4MDAyMDE4RDAsIDB4MDAyMDNCODAsIDB4MDAyMDE4QzAsIDB4MDAxMTc4OEMsCisweDAwMjAzOTk4LCAweDAwMjAzNTdDLCAweDAwMjAxNTM0LCAweDAwMUUyMTMwLAorMHgwMDIwMkExOCwgMHgwMDIwM0I4OCwgMHgwMDIwMzlGQywgMHgwMDIwM0EwNCwKKzB4MDAyMDNEQzAsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4RDU2NEQxNjMsCisweEU0MDBENzY0LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LCAweEQ1NjIyNzIyLAorMHg5NjY5RDc2MiwgMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwgMHhFNjAxMTU2NSwKKzB4RDU1RjExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LCAweDY3NjMyNTcyLAorMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwgMHhFMjE5MjUyMiwKKzB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjUyMjI1NDIsCisweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwgMHgwMDA5NDIyQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsCisweDAwMDlCRTg1LCAweEM4MTA2MEUzLCAweEJFODI4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAxQzg0MCwgMHgwMDA5QkVBNCwgMHhDODAxNjBFMywgMHhERDNEODkzOCwKKzB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsIDB4NjBGMDAwMDksCisweDg5MDJDODA0LCAweDQ2MEJENjM5LCAweDYyRjAwMDA5LCAweEM4ODA2MDIzLAorMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwgMHhDODAxNjAyMywgMHhENjM0ODkwNiwKKzB4MDAwOTQ2MEIsIDB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsIDB4ODkwMkM4MDgsCisweDQ2MEJENjMwLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLCAweDQyMEJEMjJFLAorMHhENTJFMDAwOSwgMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywgMHhBMDA1RTYwNCwKKzB4ODgwMTIyNjAsIDB4RDIyQThCMDIsIDB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsCisweEM4ODA2MEUzLCAweEQyMjc4OTJELCAweDYwRTM2RTIwLCAweDg5MDJDODgwLAorMHg0MjBCRDIyNSwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwgMHg0MjBCRDIyMywKKzB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsIDB4NjBFMzAwMDksCisweDg5MERDODA0LCAweEREMjBEMTFGLCAweDAwMDk0MTBCLCAweDAwMDlCRjExLAorMHgwMDA5QkY0QywgMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwgMHgyNUQyQkY4NSwKKzB4QzgwODYwRTMsIDB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsIDB4NDIyQjZFRjYsCisweDdGMDQ2REY2LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMUM1ODFDLAorMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwKKzB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsIDB4MDAyMDFBNDYsIDB4MDAyMDFBNjgsCisweDAwMjAyMEM4LCAweDAwMjAxQTgwLCAweDAwMjAxQThFLCAweDAwMjAzQTUwLAorMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMUFGQSwgMHgwMDIwMUIwNiwKKzB4MDAyMDFBOTYsIDB4MDAyMDFBQjQsIDB4MTIzNDU2NzgsIDB4MDAxRTEwMDAsCisweDAwMTBGMTAwLCAweDAwMjAxQUUyLCAweDY0NENENkE3LCAweDAwMEIzNDZDLAorMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwKKzB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsIDB4NDIwODYxNkQsIDB4NDIwODQxMTksCisweDQyMDA2MDE5LCAweDY3MEU2MTRDLCAweEQ0OUUzMjFDLCAweDQyMDAyMDdELAorMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwKKzB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsCisweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweEUyOUY2NjZELAorMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwKKzB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsCisweDY0NEM0NjAwLCAweDA3MUEwNDY3LCAweDIxNTAyNTdCLCAweDAwMEI0RjE2LAorMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwKKzB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsCisweEU0MDFCRkEyLCAweEJGQTRFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwKKzB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsCisweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLAorMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwKKzB4NzA5MEU0MDIsIDB4NjUwM0JGODIsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsCisweEJGODBFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhDLAorMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywKKzB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsCisweEJGNjNFNDBFLCAweEU1MDA3NTg1LCAweEJGNjRFNDAzLCAweEU1MDBFNjQwLAorMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwKKzB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDksCisweDA1RkNFMDE0LCAweEJGNDlFNDBGLCAweEU1MDE3NTg0LCAweEJGNEFFNjQwLAorMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksCisweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLAorMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywKKzB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsCisweEJGMUJFNDAxLCAweEU0MDFFNTA2LCAweEJGMUM2NTQzLCAweEU0MDFFNjQwLAorMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwKKzB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsCisweEU0MDI4NEY0LCAweEJGMDE3MDkwLCAweEU2NDA2NTAzLCAweEJGMDJFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwKKzB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsCisweEU0MEVCRUU3LCAweEU0MEU4NEY4LCAweEJFRTc3MDg1LCAweEU1MDA2NTAzLAorMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsCisweEU0MEY4MEZDLCAweEU1MDRCRUNELCAweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLAorMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsCisweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDJGLCAweDAwMUUxMDgwLAorMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwM0E0QSwKKzB4MDAyMDNBNEMsIDB4MDAyMDNBNEUsIDB4RDIxREQxMUMsIDB4NjYyMDYwMTAsCisweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLCAweDY3MTA2MjEwLAorMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwKKzB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsCisweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLCAweEU2MDA4RDEzLAorMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwKKzB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsCisweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLCAweDAwMjAzOTk1LAorMHgwMDIwMzk5NCwgMHgwMDIwMzk5NiwgMHgwMDIwMzVCQywgMHg3RkZDNEYyMiwKKzB4RTY4MEQxQTgsIDB4NjY2QzYyMTIsIDB4RDJBNzJGMjIsIDB4NjdGMzY1NjMsCisweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LCAweEU2ODAwMDA5LAorMHhEMkExNjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywKKzB4RDI5RDY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsIDB4MkY4NjY0NzMsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGQzA0RjIyLAorMHhEQjk3RDI5NiwgMHg3MjAxMkYyMiwgMHhEMTk2MUYyMSwgMHg2NjEyNTIxMSwKKzB4OEIwMTM2MjAsIDB4MDAwOUEwRjksIDB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsCisweDAwMDlBMEYzLCAweEQyOTBEQzhGLCAweDY0QzM0MjBCLCAweDY1MDNEMThGLAorMHg2MDExMUYwMiwgMHg4QjA0ODgwMSwgMHg0MjBCRDI4RCwgMHhBRkU0NjRDMywKKzB4NTQ1MzAwMDksIDB4ODQ0Q0VFODQsIDB4ODkwMTMwRTAsIDB4MDAwOUEwQzMsCisweDY2MTBEMTg4LCAweDYwMjM2MjZDLCAweDhCNzE4ODAxLCAweDYyMTBEMTg2LAorMHg4OTY2MjIyOCwgMHhEQTg2RDI4NSwgMHhFMDAzNjEyMiwgMHg2NDIyMTExMiwKKzB4NDAxOEQ4ODEsIDB4REQ4M0U1MDAsIDB4ODE0MTY3QTMsIDB4NzcwNDI4NTAsCisweDY0NzI2NkEyLCAweDZFRDNENTgwLCAweDFGNDU3RTA0LCAweDY1NTIxRjU2LAorMHg2NEUzNjhEMiwgMHgxRjg4NzRGOCwgMHg2ODQzNjlFMiwgMHgxRjYzNzg5NCwKKzB4MUY5OTFGNzQsIDB4NjI4MjYxNDIsIDB4RDc3OUQ5NzgsIDB4MUYyQkQ2NzksCisweDY3NzI2MjkyLCAweDFGMUE2MDYyLCAweDI2MDJDQjIwLCAweEQxNzZFNjAwLAorMHhFNTQwMUY1NywgMHgxRjdEMUYyQywgMHg3NjAxMUYxRSwgMHgzMjUzNjI2RCwKKzB4NTFGMzhCRkIsIDB4NTJGNTU1RjQsIDB4MjUyMjJBMTIsIDB4NTVGNzU3RjYsCisweDI3NTI1QUY4LCAweDVERjkyREEyLCAweDJFRDI1MUZCLCAweEQ1NkI1RUZBLAorMHg1NEZDMjRFMiwgMHgyODEyNTdGRCwgMHhEMTYwRDg2OSwgMHgyNTcyMjk0MiwKKzB4NjkxMjY3ODIsIDB4MTk3NEQ4NjYsIDB4REQ2NjZBMTIsIDB4NTZGRTYwQTEsCisweDJBMDFDQjAxLCAweERBNjQ2NDEyLCAweEU5MDEyODQyLCAweDRBMEIyRDQyLAorMHg1MkZFMjY5MiwgMHhENjYxRUUwMSwgMHgyMkUyNEUxOCwgMHg3MjAxNjI2MiwKKzB4NjBCMjI2MjIsIDB4Q0IwMUQxNEYsIDB4MkIwMkUyMDIsIDB4MjEyMEEwM0YsCisweDhCM0MyMjI4LCAweEU2MDFENTVBLCAweDIxNjBFNzAwLCAweEUwMUMyNTcyLAorMHhDODAxMDA0QywgMHhEODU3OEIwQywgMHgxRjhGRDI1NywgMHhFNjAwMjgyMiwKKzB4NzYwMUU1N0QsIDB4MzI1MzYyNkMsIDB4NTZGRjhCRkIsIDB4MjYyMkQyNTMsCisweEUyRkU2OUIyLCAweDJCOTIyOTI5LCAweDBBNENFMDFFLCAweEUwMUY2NUYyLAorMHgwMTRDMjVBMCwgMHg3NDEwNTdGMSwgMHhFQTA2MjcxMCwgMHhERDRDRTYwMCwKKzB4ODQ0NkRFNEMsIDB4MkQwMDc2MDEsIDB4Njk2QzY4NDQsIDB4MkU4MDM5QTMsCisweDhGRjY3RTAxLCAweERFNDg3RDAxLCAweDJFQTBFQTk0LCAweEUxMDA3RTAxLAorMHg3RTBGMkUxMCwgMHhEMTJGRTIwNSwgMHg2NDEwMkUyMCwgMHg2MDIzNjI0QywKKzB4ODkwODg4MDEsIDB4NTVGMkQyMkEsIDB4NjRDMzQyMEIsIDB4RUUwMUQxMzIsCisweEFGMUE0RTE4LCAweDU1RjIyMUUyLCAweDg1NTNEMTNDLCAweDYyMEQ2NjEyLAorMHg4OTA2MzI2MiwgMHhENjNCRDQzQSwgMHhFODAxNDYwQiwgMHhBRjBDRDczQSwKKzB4RDkxRjI3ODIsIDB4NjRDMzQ5MEIsIDB4RUUwMUQxMjcsIDB4REEzOEQ0MzcsCisweDRBMEI0RTE4LCAweEFGMDAyMUUyLCAweDdGNDAwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjA5LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxQzNEOUMsIDB4MDAyMDIzRkMsIDB4MDAxMTc3OUEsCisweDAwMUMzNkY4LCAweDAwMjAzNUI0LCAweDAwMjAxNEE2LCAweDAwMjAzQTE2LAorMHgwMDIwMTREMCwgMHgwMDIwMzlBNSwgMHgwMDIwMzlBNCwgMHgwMDIwMzlBMCwKKzB4MDAxQzNCOUMsIDB4MDAxQzM3MDQsIDB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsCisweDAwMUM1OTYwLCAweDAwMUMzNTAwLCAweDAwMUMzRDMwLCAweDAwMUM4OTYwLAorMHgwMDIwMzU4QywgMHgwMDFDM0QwMCwgMHgwMDIwMTYxMCwgMHgwMDExNzczMCwKKzB4MDAyMDM5QTgsIDB4MDAxQzU4MkMsIDB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAzOTdDLAorMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwgMHgwMDIwM0RBMCwKKzB4MDAyMDE4QzAsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEQxOUI3RkVDLCAweDJGMTJFMDAwLCAweDYxMDNENDlBLAorMHgxRjQyODFGMiwgMHhERDlBREE5OSwgMHhENjlBNjgxMywgMHhFMDAxNDgwOCwKKzB4NDYwQkRFOTksIDB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsIDB4MzUyMDUyQTEsCisweEEyM0U4QjAxLCAweDYwNTEwMDA5LCAweDg4MDFDOTAzLCAweEEyMzg4QjAxLAorMHg1MjUzMDAwOSwgMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwgMHg2NEEzNDkwQiwKKzB4NEIwQkRCOTAsIDB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsIDB4RUMwMUQ1OTEsCisweDJFMDJFMTAwLCAweDI3MTAyNkMwLCAweDI1MDJBRkRGLCAweEM4MDE4NTUxLAorMHhBMTU3OEIwMSwgMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwgMHg1RTUzMzY2QSwKKzB4ODVFMjIyNkQsIDB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsIDB4NjA1MzY1MEQsCisweDQwMjE0MDIxLCAweDQ1MDBDOTNGLCAweDMyMkE2NzAzLCAweDYwNTMyNTJELAorMHhDOTAxRDE3RiwgMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwgMHhEQjdGOEIwNSwKKzB4MjEyMEUyMDAsIDB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsIDB4ODgwMTYwMTEsCisweDY1QTI4QjBBLCAweDhEMDQyNDQ4LCAweDlCOUU2MjUxLCAweEEwMDMyMkI5LAorMHg5MTlCMjUyMSwgMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwgMHgyNDQ4ODk1RSwKKzB4RDQ3MzhCMDcsIDB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsIDB4QTA1NzgxRjgsCisweEQ1NzA2NDczLCAweDQ2MDg0NjA4LCAweDg1RTI2MjczLCAweDQ2MDA2QjUwLAorMHgzNjJDNDIwMCwgMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywgMHgyNjY4NjYwMywKKzB4RDI2OTg5MTEsIDB4MDYyRDYwNDMsIDB4NDExOTYxNkQsIDB4NkIwRTYwMTksCisweDgxRjgyMEJELCAweDg4MDE2MEMzLCAweDY0NkM4RjJDLCAweDg4MEY2MDczLAorMHhBMDI3OEIxQiwgMHhEMjYxMDAwOSwgMHgwNTJENjA0MywgMHg0MTE5NjE1RCwKKzB4NjcwRTYwMTksIDB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsIDB4ODkwRjI2NjgsCisweDYwNDNEMjVCLCAweDZCNUQwNTJELCAweDYwQjk0QjE5LCAweDIwMUQ2MTBFLAorMHg2MEMzODFGOCwgMHg4RjBEODgwMSwgMHg2NDczNjQ1QywgMHhFQzAwQTAwQSwKKzB4NjA0M0QyNTQsIDB4NjI1RDA1MkQsIDB4NjAyOTQyMTksIDB4MjA3RDY3MEUsCisweDgxRjg2NDVDLCAweDg4MDI4NUY4LCAweDg1RTE4OTBBLCAweDhEMDdDODIwLAorMHhFNkRDNjIwMywgMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwgMHg2NDRDRTRGRiwKKzB4NjIxMEQxNDksIDB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsIDB4NjU0REVCRkYsCisweDM1QjA2QkJDLCAweERCMzY4QjJCLCAweDY0QTM0QjBCLCAweDQxMEJEMTM1LAorMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwgMHhEQzQwODgwOCwKKzB4QkVBQzhCMDEsIDB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsIDB4REIzREVDMDEsCisweEQxM0QyREMyLCAweDYyMTI2MEIyLCAweDcyMDE3MDAxLCAweDIxMjI4ODA1LAorMHgyQjAyOEYwOCwgMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwgMHg3NTQ5RTcwMCwKKzB4NjQ3MzQyMEIsIDB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksIDB4ODVFMjgwMDAsCisweDIwQjlFQkZDLCAweDYxMDM4MUUyLCAweDk0MkE4NUUzLCAweDYyMDMyMDQ5LAorMHg0NTA4ODVGOCwgMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywgMHg0MDA4NDAxOCwKKzB4NDAwODQwMDgsIDB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsIDB4ODVFNDgxRTMsCisweDQxMThFMTA4LCAweDgxRTQyMDFCLCAweEU0MDI2MkEyLCAweDIwQjk4NTIxLAorMHg2N0EyODEyMSwgMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwgMHg4OTAzMzA0MiwKKzB4RUNFNzg1RTIsIDB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsIDB4QTAzQjAwMDksCisweDdFMDMwMDA5LCAweDAwMUMzRDMwLCAweDAwMjAzREFDLCAweDAwMjAzNThDLAorMHgwMDFFMjEyQywgMHgwMDIwMzQ3MCwgMHgwMDFDM0QwMCwgMHgwMDExNzc4MCwKKzB4MDAyMDE0QTYsIDB4MDAyMDE2NzAsIDB4MDAxMTc3MEMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUEwLCAweDAwMjAxOEMwLCAweDAwMUMzNkY4LAorMHgwMDIwM0ExQSwgMHgwMDIwM0RCQywgMHgwMDIwM0JBMCwgMHgwMDIwM0MyMCwKKzB4MDAyMDNDQTAsIDB4MDAyMDNEMjAsIDB4MDAyMDM5OTAsIDB4MDAyMDM1ODQsCisweDAwMjAxNEQwLCAweDAwMjAzQTFDLCAweDAwMjAzQTIwLCAweDAwMjAyM0ZDLAorMHgwMDIwM0RBNCwgMHgwMDIwM0RBOCwgMHg2MDIyNjJGMiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMDM4ODA4LCAweENCMDE2MEEyLCAweDI4MDJBMDA2LAorMHg2NUUyREU4NywgMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwgMHg1MkYzNjZGMiwKKzB4MjYyMkFFODMsIDB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsIDB4QTA5NThCMDEsCisweDQyMEIwMDA5LCAweDRFMEI2NEEzLCAweDVFMDM2NDAzLCAweDg1RTQ2NTAzLAorMHg0OTE4RTkwOCwgMHhENzdEMjA5QiwgMHhFMDRDODFFNCwgMHhEQzdDMEI3RSwKKzB4N0IwMUQ5N0MsIDB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsIDB4OEQwNjI2NjgsCisweEQ0NzkyQzEyLCAweDQyMEJEMjc5LCAweEEwNzBFQjAxLCAweDYyNTEyREIyLAorMHg0QjE4RUIwRiwgMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwgMHg4NTUxOEIwRiwKKzB4MjAyOUUyRkMsIDB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsIDB4ODVFMTI1MDEsCisweDIwMjk5NEEzLCAweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LCAweDY3NTE4MUU0LAorMHg0NzE5Njc3RCwgMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwgMHg2OTAzNjA3QywKKzB4ODgwMTQ5MTgsIDB4MjU5MThGM0UsIDB4NkIxMkQxNjEsIDB4MjFCMjdCMDEsCisweDY2MEQ4NUUzLCAweDQwMjE2MDYzLCAweEM5M0Y0MDIxLCAweDZDMDM0NjAwLAorMHgyNjJEMzIyQSwgMHhDODAxNjA2MywgMHhEQjVFRDE1RCwgMHg5NjdEODkwMSwKKzB4RTYwMDJDNkIsIDB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsIDB4NjIyRDAyMUQsCisweDhEMEUzMjcwLCAweDYwNDM2NDAzLCAweEU5RkYwMjFELCAweDhCMDEzMjkwLAorMHgwMUM1QTAwNywgMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwgMHg2NDZDOEJFQiwKKzB4NjA0MzQ0MDAsIDB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsIDB4NjY5RDY5MTEsCisweDg5MDczNjcwLCAweDYwMkQ2MjExLCAweDg5MDM4OEZGLCAweEUyMDFEQjRCLAorMHgyQjIwMjFDMSwgMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwgMHhDQjAxNjA1MSwKKzB4REM0NzI1MDEsIDB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsIDB4ODVFRjI2MTIsCisweDU0RjJEMjQ0LCAweDY1MEQ0MjBCLCAweDAwMDlBREU3LCAweEU1MDBEQzQyLAorMHg0MjBCMkM1MiwgMHg0RTBCNjRBMywgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywKKzB4NjcwM0U5MDgsIDB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsIDB4REIzMjM3OTAsCisweDhGMEJEOTMyLCAweDYwMTM2MTBELCAweDhCMDdDODIwLCAweEM5NDg2MDUzLAorMHg4QjAzODgwOCwgMHhFNTAxQkQ0QiwgMHgwMDA5QTAwNSwgMHgyMTI4RDIzMywKKzB4QkQ0NDg5MDEsIDB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsIDB4QURCQ0VDMDEsCisweDg1RjIyREMyLCAweDcwMDFFRTA0LCAweDMxRTc2MTBELCAweDhEMDI4MUYyLAorMHhBREE5N0EwOCwgMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsIDB4MkZFNjgwMDAsCisweEQyMjM0RjIyLCAweDYwRTM2RTIyLCAweDhEMDJDODQwLCAweEJCRTUyMkUyLAorMHhFMjQwMDAwOSwgMHgyRTI4NDIxOCwgMHhCQkYwODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwNUM4MTAsIDB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsIDB4MDAwOUJCRUYsCisweEM4MDU2MEUzLCAweEJENkQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLAorMHhBQkVDNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwgMHgwMDFDM0QzQywKKzB4MDAxMTc3NjAsIDB4MDAyMDE0QTYsIDB4MDAyMDE2NzAsIDB4MDAyMDM1MUMsCisweDAwMjAzREMwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LCAweDAwMjAxNEQwLAorMHgwMDIwMzlGQywgMHgwMDIwM0EwNCwgMHgwMDIwMzlGOCwgMHgwMDIwMzlGQSwKKzB4MDAyMDE1MzQsIDB4MDAyMDE4RDAsIDB4MDAyMDNBMUMsIDB4MDAwMDgwMDAsCisweDAwMUMzNTEwLCAweDAwMjAzREI0LCAweDAwMjAxOEMwLCAweDg5MDE0RjIyLAorMHg2MTFCNjAwQiwgMHg2MTFCQjAwQSwgMHgwMDBCNEYyNiwgMHg2MDBCNjAwQiwKKzB4NjExQkEwMDQsIDB4OERGMTIxMDcsIDB4OEJGODQwMTEsIDB4NjIwRDJGMjYsCisweDhGM0UzMDIwLCAweDQwMTgwMDE5LCAweDhCMEIzMDE2LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHg0MTI0NjJGNiwKKzB4NjAxQzAwMEIsIDB4NDEyOTYyMTksIDB4MjAwODQwMTgsIDB4MzEwNDg5MjYsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHg2MTE5MzEwNCwKKzB4MzIwNDIyMUQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgyMTJEMzIwNCwgMHg2MDE5NjJGNiwgMHg0MDI0MDAwQiwgMHgwMDBCRTAwMCwKKzB4NjIxMzYyRjYsIDB4NDEyOTQyMjgsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDYwMkQ0MjI0LCAweDYyRjYwMDBCLAorMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwKKzB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsCisweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LAorMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMzQ5QSwKKzB4MDAyMDM0NTAsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LAorMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsCisweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyNzA3MzcyLAorMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwKKzB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwKKzB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDZGMjA2QzY5LCAweDY5NzQyMDZFLAorMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwgMHg0NDM4NzU3MCwKKzB4NzI2MzczNjUsIDB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDQ3LCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsCisweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLAorMHgwMDAzMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAyMDAwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDEwRjAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LCAweDczMjA0MTQyLAorMHgwMDNENzE2NSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsCisweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLCAweDgyMDUwNzAwLAorMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwKKzB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsCisweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLCAweDQwMDI4MjA1LAorMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMDAwNDAwMiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDY2MjFEMkE4LCAweDIwMDg2MDZELCAweEExQjE4QjAxLCAweDg4MTAwMDA5LAorMHg4ODExODkyMiwgMHg4ODEyODkyMCwgMHg4ODEzODkxRSwgMHg4ODIxODkxQywKKzB4ODgyMjg5MUEsIDB4ODgzQTg5MTgsIDB4ODgzQjg5MTYsIDB4RTY0NDg5MTQsCisweDMwNjA0NjA4LCAweEU2NDg4OTEwLCAweDMwNjA0NjA4LCAweEU2NTg4OTBDLAorMHgzMDYwNDYwOCwgMHg5NjNEODkwOCwgMHg4OTA1MzA2MCwgMHgzMDYwOTYzQiwKKzB4OTYzOTg5MDIsIDB4OEIwMTMwNjAsIDB4RTAxMDAwMEIsIDB4OEIwMTg4MjAsCisweEUwMjAwMDBCLCAweDg5MkI4ODM3LCAweDg5Mjk4ODMyLCAweDg5Mjc4ODM1LAorMHg4OTI1ODgzNiwgMHg4OTIzODgzMCwgMHg4OTIxODgzOCwgMHg4OTFGODgzOSwKKzB4ODkxRDg4MzQsIDB4ODkxQjg4MzMsIDB4NDYwOEU2NEMsIDB4ODkxNzMwNjAsCisweDMwNjA5NjFCLCAweDk2MTk4OTE0LCAweDg5MTEzMDYwLCAweDMwNjA5NjE3LAorMHg5NjE1ODkwRSwgMHg4OTBCMzA2MCwgMHgzMDYwOTYxMywgMHg5NjExODkwOCwKKzB4ODkwNTMwNjAsIDB4MzA2MDk2MEYsIDB4OTYwRDg5MDIsIDB4OEIwQzMwNjAsCisweEUwMzAwMDBCLCAweDA1MTAwMTY1LCAweDAyMzAwQTEwLCAweDA0MzAwMzMwLAorMHgwNjMwMDUzMCwgMHgwQjMwMEEzMCwgMHg4ODQwMEMzMCwgMHhBMTQyOEIwMSwKKzB4ODg0MTAwMDksIDB4QTEzRThCMDEsIDB4ODg0MzAwMDksIDB4QTEzQThCMDEsCisweDg4NDgwMDA5LCAweEExMzY4QjAxLCAweDg4NEEwMDA5LCAweEExMzI4QjAxLAorMHg4ODRCMDAwOSwgMHhBMTJFOEIwMSwgMHg4ODRDMDAwOSwgMHhBMTJBOEIwMSwKKzB4RTY4MDAwMDksIDB4MzA2MDY2NkMsIDB4QTEyNDhCMDEsIDB4RTY4MTAwMDksCisweDMwNjA2NjZDLCAweEExMUU4QjAxLCAweEU2ODIwMDA5LCAweDMwNjA2NjZDLAorMHhBMTE4OEIwMSwgMHhFNjgzMDAwOSwgMHgzMDYwNjY2QywgMHhBMTEyOEIwMSwKKzB4RTY4NDAwMDksIDB4MzA2MDY2NkMsIDB4QTEwQzhCMDEsIDB4RTY4NTAwMDksCisweDMwNjA2NjZDLCAweEExMDY4QjAxLCAweEU2ODYwMDA5LCAweDMwNjA2NjZDLAorMHhBMTAwOEIwMSwgMHhFNjg3MDAwOSwgMHgzMDYwNjY2QywgMHhBMEZBOEIwMSwKKzB4RTY4ODAwMDksIDB4MzA2MDY2NkMsIDB4QTBGNDhCMDEsIDB4RTY4OTAwMDksCisweDMwNjA2NjZDLCAweEEwRUU4QjAxLCAweEU2OEEwMDA5LCAweDMwNjA2NjZDLAorMHhBMEU4OEIwMSwgMHhFNjhCMDAwOSwgMHgzMDYwNjY2QywgMHhBMEUyOEIwMSwKKzB4RTY4QzAwMDksIDB4MzA2MDY2NkMsIDB4QTBEQzhCMDEsIDB4RTY4RDAwMDksCisweDMwNjA2NjZDLCAweEEwRDY4QjAxLCAweEU2OEUwMDA5LCAweDMwNjA2NjZDLAorMHhBMEQwOEIwMSwgMHhFNjhGMDAwOSwgMHgzMDYwNjY2QywgMHhBMENBOEIwMSwKKzB4RTY5MDAwMDksIDB4MzA2MDY2NkMsIDB4QTBDNDhCMDEsIDB4RTY5MTAwMDksCisweDMwNjA2NjZDLCAweEEwQkU4QjAxLCAweEU2RjgwMDA5LCAweDMwNjA2NjZDLAorMHhBMEI4OEIwMSwgMHhFNkY5MDAwOSwgMHgzMDYwNjY2QywgMHhBMEIyOEIwMSwKKzB4RTZGQTAwMDksIDB4MzA2MDY2NkMsIDB4QTBBQzhCMDEsIDB4RTZGQjAwMDksCisweDMwNjA2NjZDLCAweEEwQTY4QjAxLCAweEU2RkMwMDA5LCAweDMwNjA2NjZDLAorMHhBMEEwOEIwMSwgMHhFNkZEMDAwOSwgMHgzMDYwNjY2QywgMHhBMDlBOEIwMSwKKzB4RTZGRTAwMDksIDB4MzA2MDY2NkMsIDB4QTA5NDhCMDEsIDB4RTZGRjAwMDksCisweDMwNjA2NjZDLCAweEEwOEU4QjAxLCAweEU2RDAwMDA5LCAweDMwNjA2NjZDLAorMHhBMDg4OEIwMSwgMHhFNkQxMDAwOSwgMHgzMDYwNjY2QywgMHhBMDgyOEIwMSwKKzB4RTZEMjAwMDksIDB4MzA2MDY2NkMsIDB4QTA3QzhCMDEsIDB4RTZEMzAwMDksCisweDMwNjA2NjZDLCAweEU2RDQ4OTc3LCAweDMwNjA2NjZDLCAweEU2RDU4OTczLAorMHgzMDYwNjY2QywgMHhFNkQ2ODk2RiwgMHgzMDYwNjY2QywgMHhFNkQ3ODk2QiwKKzB4MzA2MDY2NkMsIDB4RTZEODg5NjcsIDB4MzA2MDY2NkMsIDB4QTAwMzg5NjMsCisweDAwMDAwMDA5LCAweDAwMTE0MDAwLCAweDY2NkNFNkQ5LCAweDg5NUEzMDYwLAorMHg2NjZDRTZEQSwgMHg4OTU2MzA2MCwgMHg2NjZDRTZEQiwgMHg4OTUyMzA2MCwKKzB4NjY2Q0U2REMsIDB4ODk0RTMwNjAsIDB4NjY2Q0U2REQsIDB4ODk0QTMwNjAsCisweDY2NkNFNkYwLCAweDg5NDYzMDYwLCAweDY2NkNFNkYxLCAweDg5NDIzMDYwLAorMHg2NjZDRTZGMiwgMHg4OTNFMzA2MCwgMHg2NjZDRTZGMywgMHg4OTNBMzA2MCwKKzB4NjY2Q0U2RjQsIDB4ODkzNjMwNjAsIDB4NjY2Q0U2RjUsIDB4ODkzMjMwNjAsCisweDY2NkNFNkY2LCAweDg5MkUzMDYwLCAweDY2NkNFNkY3LCAweDg5MkEzMDYwLAorMHg0NjA4RTY1MCwgMHg4OTI2MzA2MCwgMHgzMDYwOTY5QSwgMHg5Njk4ODkyMywKKzB4ODkyMDMwNjAsIDB4MzA2MDk2OTYsIDB4OTY5NDg5MUQsIDB4ODkxQTMwNjAsCisweDMwNjA5NjkyLCAweDk2OTA4OTE3LCAweDg5MTQzMDYwLCAweDMwNjA5NjhFLAorMHg5NjhDODkxMSwgMHg4OTBFMzA2MCwgMHgzMDYwOTY4QSwgMHg5Njg4ODkwQiwKKzB4ODkwODMwNjAsIDB4MzA2MDk2ODYsIDB4OTY4NDg5MDUsIDB4ODkwMjMwNjAsCisweDMwNjA5NjgyLCAweDAwMEI4QjAxLCAweEUwRkZFMDQwLCAweDYwMEMwMDBCLAorMHhFMDAwMDAwQiwgMHg2MjQzRDE1NywgMHhFNDAyODUxMiwgMHg2NjJENjcwRCwKKzB4RTUwMEEwMEUsIDB4NjA1MzY1NUQsIDB4MzA1QzQwMDAsIDB4NDAwOEQxNTIsCisweDYyMkQwMjFELCAweDhCMDIzMjYwLCAweEEwMDQ3MTA4LCAweDc1MDEwNDFDLAorMHgzMjczNjI1RCwgMHg2MDQzOEJFRSwgMHhDOTBBMDAwQiwgMHg2NzRDNzZGRSwKKzB4MDI1QzYwNkMsIDB4MzcyMzYyMkMsIDB4MjAwODg5MDYsIDB4NzBGRjg5MDIsCisweDY2MDNBRkY2LCAweEUwMDAwMDBCLCAweDAwMDkwMDBCLCAweDRGMTI0RjIyLAorMHgzMjYwNTJGMiwgMHgzNDUwODkxMCwgMHgzNDcwODkwRSwgMHgzNzUwODkwRCwKKzB4MzI2ODg5MEEsIDB4MDQyNzM0NTgsIDB4NjA3MzM3NTgsIDB4NDQwQkQ0M0IsCisweDMwNkMwMTFBLCAweDYyMDNBMDAxLCAweDRGMTY2MjYzLCAweDAwMEI0RjI2LAorMHgyRkU2NjAyMywgMHg0RjEyNEYyMiwgMHg2RTQzNEYwMiwgMHg2MTRDNTRGNCwKKzB4MkYxNjQxMTgsIDB4NjY2QzY3N0MsIDB4NjRFQzY1NUMsIDB4NDYxODQ3MTgsCisweEJGRDM0NTE4LCAweDY1MDM0NDE4LCAweDYwNTM3RjA0LCAweEM5ODBFNzAyLAorMHg2RTAzNDcxOCwgMHgzN0VENDcyOCwgMHg2MjU5NDUxOSwgMHgwMTBBNjUyRSwKKzB4MzEyQzIyNUQsIDB4NEYwNjYwMUMsIDB4NEYyNjRGMTYsIDB4NkVGNjAwMEIsCisweDAzNDAwMjQwLCAweDA1NDAwNDQwLCAweDA3NDAwNjQwLCAweDA5NDAwODQwLAorMHgxMTQwMEI0MCwgMHgwQTQwMTI0MCwgMHg0RjIyMEE1MCwgMHg2MTRDODQ1MSwKKzB4MzEyNzYyMEMsIDB4QTAwQzg5MDEsIDB4ODQ1MkU0MDAsIDB4MzEyNzYyMEMsCisweEEwMDY4OTAxLCAweDg0NTNFNDAxLCAweDMxMjc2MjBDLCAweEU0MDM4RDAxLAorMHg2MjYzRTQwMiwgMHg2MDQzNzIwMSwgMHg2NzdDMDcyQywgMHg2MjUzMkY3NiwKKzB4MDcyQzcyMDEsIDB4MDU1QzA2NkMsIDB4NjY2QzY3N0MsIDB4QkZBODY1NUMsCisweDdGMDQ2NDEzLCAweDAwMEI0RjI2LCAweDYwNUM2MDBDLCAweDhGMDY4ODAxLAorMHg2MDZDNjI0MywgMHg4QjAxODgwMSwgMHg3MjBBQTAwMSwgMHgwMDBCNzJGNiwKKzB4MDAwMDYwMjMsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsIDB4MDAyMDMzNzQsCisweEUwNDBENjkwLCAweDA1NkU2MTRDLCAweDkyNzRENzhGLCAweDM1MkMzNTdDLAorMHhFNDAwRTcxOCwgMHg2MjZDNjY1MCwgMHg4OTA0MzEyMCwgMHg2MjRDNzQwMSwKKzB4OEZGNzMyNzMsIDB4MDAwQjc1MDEsIDB4RTJGRjYwNDMsIDB4NjIyQzY0NEMsCisweDg5MEQzNDIwLCAweDg4MDE2MDVDLCAweDk2NUQ4QjAzLCAweEEwMDUzNDZDLAorMHg2MjQzNjI0MywgMHgzMjRDNDIwOCwgMHgzMjZDOTY1NywgMHg2MDIzMDAwQiwKKzB4NjA0MzAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDkyNDk3RkY0LCAweDZCNTMzNTI2LCAweDAwMjk2OTQzLAorMHhFMTNGQ0EwMSwgMHg2RTAzRUFGRiwgMHg2QUFDMkYxMCwgMHg2RDQzRUMwMCwKKzB4NjJEMEU4MDgsIDB4MzRBMDY0MkMsIDB4QkZDRTg5MzksIDB4M0IwMDY1RTMsCisweDZDQ0M4RjBBLCAweDQyMDA2MkMzLCAweDM2MkM2NjkzLCAweDFGQzE4NDYxLAorMHg0MTA5NjEwQywgMHgyRjEwQTAyRCwgMHg4OTFDMkNDOCwgMHg2NUUzNjREMCwKKzB4NjQ0Q0JGQkIsIDB4ODkxNjNCMDIsIDB4NzBGRjYwQzMsIDB4MDQ5QzQwMDAsCisweDY0NEM2NUUzLCAweDFGMDJCRkIxLCAweDhEMUEzMEIyLCAweDU2RjIxRkMxLAorMHgzNTZDNjU5MywgMHhDOTAzODQ1MSwgMHg4OTEyMjAwOCwgMHg2NjBDODQ1MSwKKzB4QTAwRTQ2MDksIDB4N0MwMTJGNjAsIDB4MzI4MzYyQ0MsIDB4OEZDODdEMDIsCisweEEwMDYxRjIxLCAweDA2MjUwMDA5LCAweDEyQzAwOEZDLCAweDYyQ0MwOUI0LAorMHg1MEYxMUYyMSwgMHg4QjEyODgwOCwgMHg3Q0ZGNkNDQywgMHg2MEMzNEMwMCwKKzB4NjVFMzA0OUMsIDB4NjQ0Q0JGODksIDB4OEIwODNCMDYsIDB4ODQ5MTM5Q0MsCisweDIwMDhDOTAzLCAweDg0OTE4OTAzLCAweDQyMDk2MjBDLCAweDYwRjAyRjIwLAorMHg0RjI2N0YwQywgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwKKzB4NjhGNjAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDkyNzI3RkZDLCAweDM0MjZFMTAwLCAweDZCNDM2OTUzLAorMHgyRjEyNjY2QywgMHhDQTAxMDAyOSwgMHg4RDAzMjY2OCwgMHhFMkYwNkUwMywKKzB4MkYyMjYyMkMsIDB4NkFBQ0VBRkYsIDB4NkM5M0VEMDAsIDB4NjZDMEU4MDgsCisweDM0QTA2NDZDLCAweEJGNTA4OTEzLCAweDNCMDA2NUUzLCAweDZEREM4QjBBLAorMHgzOURDNEQwMCwgMHhDOTAzODQ5MSwgMHg4QjA4MjAwOCwgMHhDQjBGNjBGMiwKKzB4MkYwMkEwMDUsIDB4NjJEQzdEMDEsIDB4OEZFODMyODMsIDB4NjBGMjdDMDIsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LAorMHg2OEY2MDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsIDB4M0YzQzkzMzIsIDB4NDMwOEUzNUIsCisweDYwNTMzM0ZDLCAweDgwMzQxMzUxLCAweEU3NjA2MDYzLCAweDgwMzgxMzYyLAorMHg0NzA4RTAxMiwgMHhFMDNGODEzNiwgMHhEMTEyMzdGQywgMHgyNzAwODEzOCwKKzB4ODA3ODgwNzQsIDB4RTkxNjYwNTMsIDB4NjA2MzgwMTIsIDB4MjE0MTQ5MTgsCisweDZCOTM4MDEzLCAweEVERkY2QUI0LCAweDZBQUM2MUIwLCAweDZDMUM0QTE4LAorMHg2OEM4MkNBQiwgMHg2RERENjg4RCwgMHgyMzQyMzhEMCwgMHg4QjEzMTM5OCwKKzB4RDIwN0Q0MDYsIDB4MDAwOTQyMEIsIDB4NDMyQkQzMDYsIDB4MDlCNDAwMDksCisweDAwMDBGRTEwLCAweDAwMTE0MkQ4LCAweDAwMERERDAwLCAweDAwMTE2MEIwLAorMHgwMDIwMThDMCwgMHgwMDExNUU4OCwgMHgzNDIyOTJFMywgMHg4RjAyRTEwMCwKKzB4QTE2MTY1OTMsIDB4OTJERDAwMDksIDB4MzUyQ0U3RkYsIDB4RUUwNDY3N0MsCisweDYyMkM2MjUwLCAweDg5MDQzMjcwLCAweDYyMUM3MTAxLCAweDhGRjczMkUzLAorMHhFOEZDNzUwMSwgMHgzNDg4Njg4QywgMHg5QUNCRTA2NCwgMHg0MDA4Njg5MywKKzB4MEY0NDM4QUMsIDB4NjYxQzY1ODMsIDB4NjQ0Q0JFMTgsIDB4NjRFMzZFMEMsCisweDY1RTM3NDAxLCAweDQ1MDg2NjQzLCAweDM1RUM0NjA4LCAweDQ1MDgzNjRDLAorMHg0NTAwNDYwOCwgMHgzNjlDNDYwMCwgMHg2MUEzOUFCNSwgMHhFMDY1Njc2MywKKzB4NDAwODM3QUMsIDB4NjI2MzcxMTQsIDB4MzIxQzBGNzYsIDB4OTRBQjcwMDQsCisweDYxNDMwRjI2LCAweDM1OUM2MjYzLCAweDcwMDQzMjRDLCAweDBGMjY3MTE0LAorMHg3MDA0MzYxQywgMHgwRjY2Njc1MywgMHg3MDA0MzdBQywgMHg3QTE0MEY3NiwKKzB4MzdBQzY3NTMsIDB4NjY1MzcwMDQsIDB4MzY0QzBGNzYsIDB4NzQxNDcwMDQsCisweDM1NEMwRjY2LCAweDBGNTY3MDA0LCAweDM5NUM5NThGLCAweEVEMDA2QTkzLAorMHg2QkQzRTk1NiwgMHhFQzA1NDkwOCwgMHg0MDA4RTA2NSwgMHg2MEIzMDJGRSwKKzB4NjQ0QzA0MkMsIDB4NjBFMzJGNDYsIDB4RTA2QTA3QUMsIDB4MDFGRTQwMDgsCisweDA2MUM2MEIzLCAweDA1OEM2MEUzLCAweDQwMDhFMDY1LCAweDY3N0MwMUZDLAorMHg2NTVDNjY2QywgMHg2NDFDQkRFRCwgMHg3RjA0NjQwMywgMHg2MEQzNkREQywKKzB4RTA2NjBGNDQsIDB4MDRGRTQwMDgsIDB4MDU0QzYwQjMsIDB4MkY1NjY1NUMsCisweDA3QUM2MEUzLCAweDQwMDhFMDZCLCAweDYwQjMwMUZFLCAweDYwRTMwNjFDLAorMHhFMDY1MDU4QywgMHgwMUZDNDAwOCwgMHg2NjZDNjc3QywgMHhCREQwNjU1QywKKzB4NjQwMzY0MUMsIDB4NjVGMzdGMDQsIDB4NjBEMzc1MTAsIDB4RTA2NTA1NDQsCisweDA3RkU0MDA4LCAweDA1N0M2MEMzLCAweDJGNTY2NTVDLCAweDA3QUM2MEUzLAorMHg0MDA4RTA2QSwgMHg2MEMzMDFGRSwgMHg2MEUzMDYxQywgMHhFMDY1MDU4QywKKzB4MDFGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkRCMjY1NUMsIDB4NjQwMzY0MUMsCisweDYxRjM3RjA0LCAweDYwRDM3MTIwLCAweEUwNjYwMTQ0LCAweDAyRkU0MDA4LAorMHgwNTJDNjBDMywgMHgyRjU2NjU1QywgMHgwN0FDNjBFMywgMHg0MDA4RTA2QiwKKzB4NjBDMzAxRkUsIDB4NjBFMzA2MUMsIDB4RTA2NTA1OEMsIDB4MDFGQzQwMDgsCisweDY2NkM2NzdDLCAweEJEOTQ2NTVDLCAweDY1MDM2NDFDLCAweDY0RjM3RjA0LAorMHg2MEQzMzQ5QywgMHhFMDY3MDQ1NCwgMHgwN0ZFNDAwOCwgMHgwNTdDNjBCMywKKzB4MkY1NjY1NUMsIDB4MDdBQzYwRTMsIDB4NDAwOEUwNkMsIDB4QTAwNTAxRkUsCisweDBCQjg2MEIzLCAweDAzQzIwMTNFLCAweDAxM0YwNDYyLCAweDYwRTMwNjFDLAorMHhFMDY1MDU4QywgMHgwMUZDNDAwOCwgMHg2NjZDNjc3QywgMHhCRDcwNjU1QywKKzB4NjIwMzY0MUMsIDB4RTFCODdGMDQsIDB4NjRGMzYxMUMsIDB4NjBEMzM0MUMsCisweEUwNjgwNDI0LCAweDA1RkU0MDA4LCAweDA3NUM2MEIzLCAweDJGNzY2NzdDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2RCwgMHg2MEIzMDFGRSwgMHg2MEUzMDYxQywKKzB4RTA2NTA1OEMsIDB4MDJGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQ1MDY1NUMsCisweDY3MDM2NDJDLCAweEUyQzA3RjA0LCAweDY2RjM2MjJDLCAweDYwRDMzNjJDLAorMHhFMDY3MDY3NCwgMHgwN0ZFNDAwOCwgMHgwMjdDNjBDMywgMHgyRjI2NjIyQywKKzB4MDdBQzYwRTMsIDB4NDAwOEUwNkMsIDB4NjBDMzAyRkUsIDB4NjBFMzA2MkMsCisweEUwNjUwNThDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLCAweEJEMzA2NTVDLAorMHg2MjAzNjQyQywgMHhFN0M4N0YwNCwgMHg2NkYzNjc3QywgMHg2MEQzMzY3QywKKzB4RTA2ODA2MjQsIDB4MDZGRTQwMDgsIDB4MDI2QzYwQzMsIDB4MkYyNjYyMkMsCisweDA3QUM2MEUzLCAweDQwMDhFMDZELCAweDYwQzMwMkZFLCAweDYwRTMwNjJDLAorMHhFMDY1MDU4QywgMHgwMkZDNDAwOCwgMHg2NjZDNjc3QywgMHhCRDEwNjU1QywKKzB4NjEwMzY0MkMsIDB4NjY5MzdGMDQsIDB4NjJGMzc2MDgsIDB4NjBEMzMyNkMsCisweDAyMTQ3RDAxLCAweEU2MDU2MkRDLCAweDdDMDEzMjYzLCAweDdCMDE4RDAyLAorMHgwMDA5QUVGQSwgMHgwMDA5QTE3QiwgMHhFN0ZGOUJENSwgMHg2NzdDMzVCQywKKzB4NjI1MEVFMDgsIDB4MzI3MDYyMkMsIDB4NzEwMTg5MDQsIDB4MzJFMzYyMUMsCisweDc1MDE4RkY3LCAweERERDg5Q0M4LCAweDNENDUzNEM4LCAweDQwMDhFMDY0LAorMHg0RTA5MEUwQSwgMHgwRkU0NjU5MywgMHg3MDI0MzVCQywgMHg2NEVDNjYxQywKKzB4MEY1NkJDQjQsIDB4NjRFMzZFMEMsIDB4NjVFMzc0MDEsIDB4NDUwODYyNDMsCisweDM1RUM0MjA4LCAweDQ1MDgzMjRDLCAweDQ1MDA0MjA4LCAweDMyOUM0MjAwLAorMHg2MUIzN0IwQywgMHgzOEJDNjgyMywgMHg3MTE0RTA2RSwgMHg0MDA4NkIyMywKKzB4OTFBMjNCMUMsIDB4NzAwNDBGODYsIDB4NjgyMzY0MTMsIDB4MEZCNjM1OUMsCisweDcwMDQzODFDLCAweDBGODY3NDE0LCAweDcwMDQzNDJDLCAweDY3NTM5ODk2LAorMHgwRjQ2NjI1MywgMHg3MDA0Mzc4QywgMHg2QjUzNzgxNCwgMHg3MTE0MzIxQywKKzB4M0I4QzBGNzYsIDB4MzUxQzcwMDQsIDB4MEZCNjk3ODksIDB4Mzk3QzcwMDQsCisweDcwMDQwRjI2LCAweEVEMDA2ODkzLCAweDBGNTZFQzA1LCAweDZBRDNFOTU2LAorMHhFMDZFNDkwOCwgMHgwMkZFNDAwOCwgMHgwMTJDNjBBMywgMHgyRjE2NjExQywKKzB4MDc4QzYwRTMsIDB4NDAwOEUwNzMsIDB4NjBBMzA0RkUsIDB4RTA2RTA2NEMsCisweDBCRkU0MDA4LCAweDA1QkM2MEUzLCAweDQwMDhFMDY1LCAweDY3N0MwMUZDLAorMHg2NTVDNjY2QywgMHg2NDFDQkM4NSwgMHg3RjA0NjQwMywgMHg2MEQzNkREQywKKzB4RTA2RjBGNDQsIDB4MDRGRTQwMDgsIDB4MDU0QzYwQTMsIDB4MkY1NjY1NUMsCisweDA3OEM2MEUzLCAweDQwMDhFMDc0LCAweDYwQTMwQkZFLCAweEUwNkUwNkJDLAorMHgwQkZFNDAwOCwgMHgwNUJDNjBFMywgMHg0MDA4RTA2NSwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JDNjUsIDB4N0YwNDY0MDMsIDB4NzUxMDY1RjMsCisweDA1NDQ2MEQzLCAweDQwMDhFMDZFLCAweDYwQzMwN0ZFLCAweDY1NUMwNTdDLAorMHg2MEUzMkY1NiwgMHhFMDczMDc4QywgMHgwQkZFNDAwOCwgMHgwNkJDNjBDMywKKzB4NDAwOEUwNkUsIDB4NjBFMzAxRkUsIDB4RTA2NTA1MUMsIDB4MEJGQzQwMDgsCisweDY2NkM2NzdDLCAweEJDNDQ2NTVDLCAweDYxMDM2NEJDLCAweDZCRjM3RjA0LAorMHg2MEQzN0IyMCwgMHhFMDZGMEIxNCwgMHgwMUZFNDAwOCwgMHgwNDFDNjBDMywKKzB4MkY0NjY0NEMsIDB4MDc4QzYwRTMsIDB4NDAwOEUwNzQsIDB4NjBDMzAxRkUsCisweEUwNkUwNjFDLCAweDBCRkU0MDA4LCAweDA1QkM2MEUzLCAweDQwMDhFMDY1LAorMHhBMDA1MDFGQywgMHgwMTM2Njc3QywgMHgwMjgyMTJDMCwgMHgwMTM3MDE0MiwKKzB4NjU1QzY2NkMsIDB4NjQxQ0JDMUQsIDB4N0YwNDYyMDMsIDB4MzQ5QzY0RjMsCisweDA0MjQ2MEQzLCAweDQwMDhFMDcwLCAweDYwQTMwNEZFLCAweDY1NUMwNTRDLAorMHg2MEUzMkY1NiwgMHhFMDc1MDc4QywgMHgwQkZFNDAwOCwgMHgwNkJDNjBBMywKKzB4NDAwOEUwNkUsIDB4NjBFMzAxRkUsIDB4RTA2NTA1MUMsIDB4MEJGQzQwMDgsCisweDY2NkM2NzdDLCAweEJCRkM2NTVDLCAweDYxMDM2NEJDLCAweEVCQjg3RjA0LAorMHg2NUYzNkJCQywgMHg2MEQzMzVCQywgMHhFMDcxMDUxNCwgMHgwN0ZFNDAwOCwKKzB4MDQ3QzYwQTMsIDB4MkY0NjY0NEMsIDB4MDc4QzYwRTMsIDB4NDAwOEUwNzYsCisweDYwQTMwQkZFLCAweEUwNkUwNkJDLCAweDAxRkU0MDA4LCAweDA1MUM2MEUzLAorMHg0MDA4RTA2NSwgMHg2NzdDMEJGQywgMHg2NTVDNjY2QywgMHg2NEJDQkJEOSwKKzB4N0YwNDYxMDMsIDB4NjIyQ0UyQzAsIDB4M0IyQzZCRjMsIDB4MEIxNDYwRDMsCisweDQwMDhFMDcwLCAweDYwQzMwMkZFLCAweDY3N0MwNzJDLCAweDYwRTMyRjc2LAorMHhFMDc1MDc4QywgMHgwMkZFNDAwOCwgMHgwNjJDNjBDMywgMHg0MDA4RTA2RSwKKzB4NjBFMzAyRkUsIDB4RTA2NTA1MkMsIDB4MDJGQzQwMDgsIDB4NjY2QzY3N0MsCisweEJCQjY2NTVDLCAweDY3MDM2NDJDLCAweEVCQzg3RjA0LCAweDY2RjM2QkJDLAorMHg2MEQzMzZCQywgMHhFMDcxMDY3NCwgMHgwNkZFNDAwOCwgMHgwMjZDNjBDMywKKzB4MkYyNjYyMkMsIDB4MDc4QzYwRTMsIDB4NDAwOEUwNzYsIDB4NjBDMzAyRkUsCisweEUwNkUwNjJDLCAweDAyRkU0MDA4LCAweDA1MkM2MEUzLCAweDQwMDhFMDY1LAorMHg2NzdDMDJGQywgMHg2NTVDNjY2QywgMHg2NDJDQkI5MywgMHg3RjA0NjEwMywKKzB4NzIwODYyOTMsIDB4MzYyQzY2RjMsIDB4N0QwMTYwRDMsIDB4NjJEQzA2MTQsCisweDMyNjNFNjA1LCAweDhEMDI3QzAxLCAweEFFRTI3QTAxLCAweDZFRjMwMDA5LAorMHhFMkIwNjhGMywgMHg2QUYzRTA1QSwgMHgzODlDN0UxOCwgMHg2OUYzNjIyQywKKzB4N0EwODQwMDgsIDB4NjdGMzZERjMsIDB4MzkyQzYxRjMsIDB4NkNBMzBGRTYsCisweDc3MjA3RDEwLCAweEU0MDA3MTI4LCAweEVCMDU2NUYzLCAweDYwNEM2NjU0LAorMHg2NkQ0NjI2QywgMHgyRTYwNDIyMSwgMHgwNDhDNjY3NCwgMHg2MjZDMkMyMCwKKzB4MDk0NDQyMjEsIDB4MjEyMDcwMDEsIDB4MzJCMzYyMEMsIDB4NzEwMTY0MDMsCisweDhGRUI3RTAxLCAweEUwNUE3QzAxLCAweDZFRjM0MDA4LCAweDdFMzAwQkZFLAorMHhFQzE5RUQwMCwgMHg2NkIzNjVBMywgMHhCQjdFNjREQywgMHg2MkRDN0QwMSwKKzB4MkUwMDMyQzMsIDB4N0UwMThGRjYsIDB4NjY2Q0U2QjAsIDB4NkJGMzZFRjMsCisweDdCMjgzRTZDLCAweEVDNENBMDEwLCAweENDQ0NDQ0NELCAweDY0RDM2RERDLAorMHg2NDRDNzRGNCwgMHhCQjY4NjVCMywgMHg2N0YzNjZFMywgMHg3NzMwNjUwMywKKzB4MDc1NDYwRDMsIDB4NjJEQzdEMDEsIDB4OEJFRjMyQzMsIDB4N0IzMDZCRjMsCisweDYxQjM2N0IzLCAweEVEODA2NEIzLCAweDcxMDI3NzAxLCAweDZEREM3NDAzLAorMHhEQzM3RTUwMCwgMHg2MDVDREUzNywgMHgwOTFDMDg0QywgMHgwQTdDNjY4QywKKzB4Njk5QzQ2MjgsIDB4NDkyODQ2MTgsIDB4MDVCQzZBQUMsIDB4NEExODI2OUIsCisweDcwMDQ2ODAzLCAweDY1NUMyNkFCLCAweDYyMEMzOENDLCAweDM4RUMyNjVCLAorMHgyODYyMzJEMywgMHg2NTAzOEZFNywgMHg2NDRDRTRCOCwgMHgzQzRDNkNGMywKKzB4NkVGMzc0MDgsIDB4RTJCMEU2NTgsIDB4M0U0QzZBRjMsIDB4NzQwODZCRjMsCisweDQ2MDg2MUYzLCAweDYyMkM2OEYzLCAweDdBMDg2OUYzLCAweDMxNEM3QjE4LAorMHgzODZDNjRGMywgMHg2REEzMzkyQywgMHg3NDI4NjdCMywgMHg2NkM0RTUwMCwKKzB4NjI2QzYwNUMsIDB4NDIyMTY2RTQsIDB4NjYxNDI3NjAsIDB4MkQyMDA1OEMsCisweDQyMjE2MjZDLCAweDcwMDEwOTU0LCAweDYyMEMyNDIwLCAweDMyNjNFNjA1LAorMHg3NDAxNjUwMywgMHg4RkVBNzcwMSwgMHhFMDVFN0QwMSwgMHgwMkZENDAwOCwKKzB4NkQyREU5RDAsIDB4Njk5QzdEMDcsIDB4RUUwMEEwMEIsIDB4NjZCMzY1QTMsCisweDY0RUNCQUZCLCAweDYyMDM2N0YzLCAweDYwRUMzNzlDLCAweDcwMDEwNzI0LAorMHg2MkVDNkUwMywgMHg4QkYxMzJEMywgMHg0MDA4RTA1RiwgMHhFQUIwMDhGRCwKKzB4NkRGMzZBQUMsIDB4NkJGMzZDOEQsIDB4N0MwRDNEQUMsIDB4N0IyOEEwMTIsCisweDAwMDBBMjgwLCAweDAwMUJDMDAwLCAweDY0RTM2RUVDLCAweDY0NEM3NEY0LAorMHhCQURBNjVCMywgMHg2MkYzNjZEMywgMHgzMjlDNjEwMywgMHg3RTAxNjBFMywKKzB4NjJFQzAyMTQsIDB4OEJFRjMyQzMsIDB4M0Q5QzZERjMsIDB4NjdEMzZFRDMsCisweEVDODA2MUQzLCAweDc3MDI3RTAxLCAweDZDQ0M3MTAzLCAweERCQjlFNDAwLAorMHg2MDRDREFCOSwgMHgwNjdDMDQxQywgMHgwOEVDNjU0QywgMHg2NjZDNDUyOCwKKzB4NDYyODQ1MTgsIDB4MDlEQzY4OEMsIDB4NDgxODI1NkIsIDB4NzAwNDY2MDMsCisweDY5OUMyNThCLCAweDYyMEMzNkJDLCAweDM2QUMyNTlCLCAweDI2NTIzMkMzLAorMHg2NDAzOEZFNywgMHg0MDA4RTA2NCwgMHg3MEUwMDdGQywgMHg3MDZDMENGQywKKzB4MEY4NjY4Q0MsIDB4MERGQzcwOTgsIDB4NkFEQzcwNkMsIDB4NzA4QzBGQTYsCisweDlCQkYwRUZFLCAweEUyNTQzRUIyLCAweDY5N0NFMTAwLCAweDQyMDg4RjAyLAorMHgwMDA5QTE2MywgMHg0MDA4RTA2MywgMHg2RUYzMDVGRSwgMHgzRTJDOTZCMywKKzB4NjRFMzM1NkMsIDB4RURGRkU3MDMsIDB4MzJEMDYyNTAsIDB4NjIyQzhEMDcsCisweDY4MUM3MTAxLCAweDI0MjAzODczLCAweDhGRjU3NTA1LCAweEUwNjQ3NDAxLAorMHgwQUZDNDAwOCwgMHg2NEFDNjVFMywgMHg2NjFDQkExOCwgMHhFMDYzNjcwQywKKzB4NjI3MzQwMDgsIDB4NDIwODBCRkUsIDB4NzcwMTMyN0MsIDB4M0EyQzZBQjMsCisweDQ4MDg2ODczLCAweDk0OEY2RUEzLCAweDNFNEMzODdDLCAweDNCOEM3NEZGLAorMHgzODI4M0E0QywgMHhFQzAwM0I0QywgMHg2MDgzREQ4OCwgMHg2NTVDMDVFQywKKzB4RTA2NTJGNTYsIDB4NjdCMDQwMDgsIDB4NjVBMDY2RTQsIDB4Njc3QzAxRkMsCisweDY1NUM2NjZDLCAweDY0MUNCQTFELCAweDdDMDE3RjA0LCAweEU0MDQ2MkNDLAorMHgyRDAwMzI0MywgMHg3RDAxOEZFOSwgMHhFMDYzRTU1NCwgMHg2N0YzNDUwOCwKKzB4Mzc1QzQwMDgsIDB4OTY2ODA1RkUsIDB4MzU2Q0VERkYsIDB4NkREQzY0NzMsCisweEVFMDRFMTAwLCAweDY2NkM2NjUwLCAweDg5MDYzNkQwLCAweDYyMUM3MTAxLAorMHgyNDYwMzJFMywgMHg4RkY1NzUwNSwgMHhFMDY0NzQwMSwgMHgwMkZDNDAwOCwKKzB4NjQyQzY1NzMsIDB4NjYxQ0I5Q0EsIDB4NkUyMzYyMEMsIDB4RTA2MzRFMDgsCisweDcyMDEzRTJDLCAweDBCRkU0MDA4LCAweDQ3MDg2NzIzLCAweDZBQjMzNzJDLAorMHg2ODczM0FFQywgMHg2RUEzMzhFOCwgMHgzRTFDOTE0MCwgMHgzQjdDNzFGRiwKKzB4M0IxQzNBMUMsIDB4MEY5NjcwNEMsIDB4RUMwMEU5MDQsIDB4NjA4M0RENjAsCisweDY0NEMwNEVDLCAweEUwNjUyRjQ2LCAweDY3QjA0MDA4LCAweDY1QTA2NkU0LAorMHg2NzdDMDFGQywgMHg2NTVDNjY2QywgMHg2NDFDQjlDQiwgMHg3QzAxN0YwNCwKKzB4MzI5MzYyQ0MsIDB4OEZFQTJEMDAsIDB4RTA3NjdEMDEsIDB4MDlGRTQwMDgsCisweDcwQjRFNDU0LCAweDY3RjM0NDA4LCAweDM3NEMwNUZFLCAweEVERkY5NjE3LAorMHgzNTZDNjQ3MywgMHhFMTAwNkREQywgMHg2NjUwRUUwNCwgMHgzNkQwNjY2QywKKzB4NzEwMTg5MDYsIDB4MzJFMzYyMUMsIDB4NzUwOTI0NjAsIDB4NzQwMThGRjUsCisweEUwNjRBMDA2LCAweDA1QkEwQkI4LCAweDA1QzkwNUJCLCAweDA1REQwNUNBLAorMHg2NTczNDAwOCwgMHg2NjFDMDdGQywgMHg2NDdDQjk3MCwgMHg2NjIzNjIwQywKKzB4NDYwOEUwNjMsIDB4NDYwMDQwMDgsIDB4MzYyQzBCRkUsIDB4NjgyMzcyMDEsCisweDNBNkM2QUIzLCAweDQ4MDA0ODA4LCAweDkxNjc2RUEzLCAweDNFMUMzODJDLAorMHgzQjhDNzFGRiwgMHgzODY4M0ExQywgMHhFQzAwM0IxQywgMHg2MDgzREQzNSwKKzB4NjQ0QzA0RUMsIDB4RTA2NTJGNDYsIDB4NjdCMDQwMDgsIDB4NjVBMDY2RTQsCisweDY3N0MwMUZDLCAweDY1NUM2NjZDLCAweDY0MUNCOTczLCAweDdDMDE3RjA0LAorMHhFNTA4NjJDQywgMHgyRDAwMzI1MywgMHg3RDAxOEZFOSwgMHg0MDA4RTA2MywKKzB4MDVGRUU2NTQsIDB4NjRGMzQ2MDgsIDB4RUNGRjk3NDEsIDB4MzU3QzM0NkMsCisweEVFMDA2Q0NDLCAweDYyNTBFRDA0LCAweDMyQzA2MjJDLCAweDdFMDE4OTA2LAorMHgzOEQzNjhFQywgMHg3NTA5MjQyMCwgMHg3NDAxOEZGNSwgMHg0MDA4RTA3NywKKzB4NzAwNDA1RkUsIDB4NjQ5MzA2RkUsIDB4RUE1NEI5QTcsIDB4NjVGMzRBMDgsCisweDY0MEMzNUFDLCAweDY2RUNCOTFBLCAweDY2MTM2MTBDLCAweDQ2MDhFMDYzLAorMHg0NjAwNDAwOCwgMHgzNjFDMEJGRSwgMHg2ODEzNzEwMSwgMHgzQTZDNkFCMywKKzB4NDgwMDQ4MDgsIDB4OTIxMzZFQTMsIDB4M0UyQzM4MUMsIDB4M0I4QzcyRkYsCisweDM4NjgzQTJDLCAweEVDMDAzQjJDLCAweEUwNzdERDBCLCAweDA1RkU0MDA4LAorMHgwNkZFNzAwNCwgMHg2NDkzQjk4MSwgMHgwMDA5QTAxMCwgMHgwNjAxMDVERSwKKzB4MDAwMDA2MDIsIDB4MDAwMEIyODAsIDB4MDAxQkMwMDAsIDB4MDAxMTQyRTQsCisweDAwMTE0MkU4LCAweDAwMTE0MkVELCAweDAwMTE0MkY1LCAweDYwODM2NDAzLAorMHg2NzdDMDdFQywgMHg2N0IwMkY3NiwgMHg2NUEwNjZFNCwgMHg2NjZDNjc3QywKKzB4QjkwNjY1NUMsIDB4N0YwNDY0NEMsIDB4NjFDQzdDMDEsIDB4MzEyM0UyMDgsCisweDhGRDIyRDAwLCAweEEwRkM3RDAxLCAweEUwNjMwMDA5LCAweDA1RkU0MDA4LAorMHg5NkQwNjdGMywgMHgzNTZDMzcyQywgMHhFRUZGNjQ3MywgMHgzMkUwNjI1MCwKKzB4NjIyQzhEMDgsIDB4NjgxQzcxMDEsIDB4Mzg2M0U2MDgsIDB4NzUwNTI0MjAsCisweDc0MDE4RkY0LCAweDQwMDhFMDY0LCAweDY1NzMwMkZDLCAweEI4QjU2NDJDLAorMHg2NTBDNjYxQywgMHg0MDA4RTA2MywgMHgwQkZFNjI1MywgMHgzMjVDNDIwOCwKKzB4NkFCMzc1MDEsIDB4Njg1MzNBMkMsIDB4NkVBMzQ4MDgsIDB4Mzg1Qzk0QUMsCisweDc0RkYzRTRDLCAweDNBNEMzQjhDLCAweDNCNEMzODI4LCAweEREOTZFQzAwLAorMHgwNkVDNjA4MywgMHgyRjY2NjY2QywgMHg0MDA4RTA2NSwgMHg2NkU0NjdCMCwKKzB4MDFGQzY1QTAsIDB4NjY2QzY3N0MsIDB4QjhCQTY1NUMsIDB4N0YwNDY0MUMsCisweDYyQ0M3QzAxLCAweDMyNDNFNDA0LCAweDhGRTkyRDAwLCAweEU1NTQ3RDAxLAorMHg0NTA4RTA2MywgMHg0MDA4NjdGMywgMHgwNUZFMzc1QywgMHhFRUZGOTY4NSwKKzB4NjQ3MzM1NkMsIDB4RTEwMDZFRUMsIDB4NjY2QzY2NTAsIDB4ODkwNzM2RTAsCisweDYyMUM3MTAxLCAweDMyODNFODA4LCAweDc1MDkyNDYwLCAweDc0MDE4RkY0LAorMHg0MDA4RTA2NCwgMHg2NTczMEFGQywgMHhCODY3NjRBQywgMHg2MjBDNjYxQywKKzB4RTA2MzY2MjMsIDB4NDAwODQ2MDgsIDB4MEJGRTQ2MDAsIDB4NzIwMTM2MkMsCisweDZBQjM2ODIzLCAweDQ4MDgzQTZDLCAweDZFQTM0ODAwLCAweDM4MkM5MTVFLAorMHg3MUZGM0UxQywgMHgzQTFDM0I4QywgMHgzQjFDMzg2OCwgMHhERDZGRUMwMCwKKzB4MDRFQzYwODMsIDB4MkY0NjY0NEMsIDB4NDAwOEUwNjUsIDB4NjZFNDY3QjAsCisweDAxRkM2NUEwLCAweDY2NkM2NzdDLCAweEI4NkE2NTVDLCAweDdGMDQ2NDFDLAorMHg2MkNDN0MwMSwgMHgzMjUzRTUwOCwgMHg4RkU5MkQwMCwgMHhFMDYzN0QwMSwKKzB4RTY1NDQwMDgsIDB4NDYwODA1RkUsIDB4OTczODY0RjMsIDB4MzQ2Q0VDRkYsCisweDZDQ0MzNTdDLCAweEVEMDhFRTAwLCAweDY2NkM2NjUwLCAweDg5MDYzNkMwLAorMHg2MkVDN0UwMSwgMHgyNDYwMzJEMywgMHg4RkY1NzUwOSwgMHhFMDc3NzQwMSwKKzB4MDVGRTQwMDgsIDB4MDZGRTcwMDQsIDB4Qjg5RTY0OTMsIDB4NDgwOEU4NTQsCisweDM1OEM2NUYzLCAweEI4MTE2NDBDLCAweDYxMEM2NkVDLCAweEUwNjM2NjEzLAorMHg0MDA4NDYwOCwgMHgwQkZFNDYwMCwgMHg3MTAxMzYxQywgMHg2QUIzNjgxMywKKzB4NDgwODNBNkMsIDB4NkVBMzQ4MDAsIDB4MzgxQzkyMEEsIDB4NzJGRjNFMkMsCisweEEwMDYzQjhDLCAweDA1MDIzQTJDLCAweDA1MkEwNTAzLCAweDA1NzIwNTJCLAorMHgzODY4MDU3MywgMHhFQzAwM0IyQywgMHhFMDc3REQ0MSwgMHgwNUZFNDAwOCwKKzB4MDZGRTcwMDQsIDB4NjQ5M0I4NzEsIDB4NjA4MzY0MDMsIDB4Njc3QzA3RUMsCisweDY3QjAyRjc2LCAweDY1QTA2NkU0LCAweDY2NkM2NzdDLCAweEI4MDg2NTVDLAorMHg3RjA0NjQ0QywgMHg2MUNDN0MwMSwgMHgzMTIzRTIwOCwgMHg4RkU0MkQwMCwKKzB4RDMzNDdEMDEsIDB4MDAwOTQzMEIsIDB4RTA3OTYyMEMsIDB4MEYyNDQwMDgsCisweDg4MzA2MDIzLCAweEEyNEQ4QjAxLCAweDg4NDAwMDA5LCAweEEyNDk4QjAxLAorMHgyMjI4MDAwOSwgMHhBMjQ1OEIwMSwgMHhFNUZGMDAwOSwgMHg2NTVDRDQyQSwKKzB4RTAzQUU2MDEsIDB4OEYwNDMyNTAsIDB4RTA3OTA0NjQsIDB4NDAwOEUyMTAsCisweEUwNUIwRjI0LCAweDA1RkU0MDA4LCAweDM1NjY5NjNCLCAweEExNDk4QjAxLAorMHg2MDIzMDAwOSwgMHg2NDBDQ0IwMSwgMHg2RTIzQjg0MiwgMHhFMTE4NjYwQywKKzB4ODkwRjM2MTMsIDB4NDAwOEUwNjMsIDB4MDRGRTQ2MDgsIDB4OTcyOTQ2MDgsCisweDQ2MDA3MEUwLCAweDA1RkUzNDdDLCAweDM0NkNCODVDLCAweEUwNjA2MjAzLAorMHgwRjI0NDAwOCwgMHhDQjAyNjBFMywgMHg2NDBDQjgyQSwgMHhFMTE4NjYwQywKKzB4ODkwRjM2MTMsIDB4NDAwOEUwNjMsIDB4MDRGRTQ2MDgsIDB4OTExMTQ2MDgsCisweDQ2MDA3MEUwLCAweDA1RkUzNDFDLCAweDM0NkNCODQ0LCAweEUwNjE2MjAzLAorMHgwRjI0NDAwOCwgMHhDQjA1NjBFMywgMHg2NDBDQjgxMiwgMHhBMDBENjYwQywKKzB4MDlCNEUwN0EsIDB4MDAwMDA2NEQsIDB4MDAxMTQyRkQsIDB4MDAxMTQzMDEsCisweDAwMTE0MzA5LCAweDAwMTE0NDAwLCAweDAwMTE0MkQ4LCAweDQwMDhFMTE4LAorMHg4RjA0MzYxMywgMHhFMDYxMEY2NCwgMHhBMDEwNDAwOCwgMHhFMDdBMERGQywKKzB4MDZGQzQwMDgsIDB4NjI2QzcwQTQsIDB4MDRGRTQyMDgsIDB4OTdCNDQyMDgsCisweDQyMDA3MEUwLCAweDA1RkUzNDdDLCAweDM0MkNCODE0LCAweEUwNzk2RDAzLAorMHgwMEZDNDAwOCwgMHhDQjA3REI4RSwgMHg0MzBCRDM4RSwgMHg2MTBDNjQwQywKKzB4NDAwOEUwN0EsIDB4NzA5QzBGMTQsIDB4RTYxODAyRkMsIDB4OEQxQzMxNjMsCisweEUwNUQ2ODJDLCAweDAxRkM0MDA4LCAweDA5RkM3MEZDLCAweDA0RkU3MEZDLAorMHhEMzg1NjYxQywgMHg2NTlDNDMwQiwgMHhFMDdBNjUwMywgMHgwMUZDNDAwOCwKKzB4NjExQzcwQTQsIDB4MDRGRTQxMDgsIDB4OTc4NjQxMDgsIDB4MzQ3QzQxMDAsCisweDQzMEJEMzdFLCAweEEwMDMzNDFDLCAweEUwNjE2QzAzLCAweDBDRkM0MDA4LAorMHhFNTAwRDY3QiwgMHg2NDBEODU2MiwgMHg0MDA4RTA1QiwgMHgwQUZFQTAzNiwKKzB4NjA1MzY1NUMsIDB4MzA1QzQwMDAsIDB4NDAwOEQ2NzYsIDB4NjIyRDAyNkQsCisweDhGMkEzMkEwLCAweEQzNzQ2RTAzLCAweDY0QUQ0MzBCLCAweDIyMjg2MjBELAorMHhENjcyODkyNywgMHgwNjZDNjBFMywgMHg0MDA4RTA2MCwgMHg0NjAwMDJGQywKKzB4M0U2NzZFMkMsIDB4NjI2MzhCMDAsIDB4NDAwOEUwNjAsIDB4MEYyNDM4NjcsCisweDYyNjM4RDAzLCAweDQwMDhFMDYxLCAweEUwNjEwMkZDLCAweDQwMDg2MURDLAorMHgwRjI0MzE2NywgMHg4RjAxNjgyQywgMHg2MjYzNjJEMywgMHgzNDY3NjRDQywKKzB4NkQyMzhEMDEsIDB4QTAwNDY2QzMsIDB4NzUwMTZDNjMsIDB4MzI0MzYyNUMsCisweEUwNjA4QkM2LCAweDA3RkM0MDA4LCAweDYxN0NFNDAwLCAweEU5MDRENTVDLAorMHg2NjZDNjY1MCwgMHg4QjAxMzYxNywgMHg2NjczNjc3QywgMHg2MjRDNzQwMSwKKzB4MjU2MDMyOTMsIDB4NzUwMThGRjQsIDB4RTAzQUQ2NTYsIDB4RTQwMDA1NkMsCisweDhEMDEyNTU4LCAweEUyMDI2MjQzLCAweDQwMDhFMDYxLCAweDY3ODMwRUZDLAorMHgzRTI4MzgyOCwgMHg5MTE5RTUwMCwgMHg2MDUzNjU1QywgMHgzQTEwMDJCQywKKzB4NjIyQzhEMEIsIDB4M0E2MDk2MTMsIDB4MzI3Nzg5MDcsIDB4RTA2MThCMDIsCisweDAyRkM0MDA4LCAweEEwMUQ2MDUzLCAweDI1NTgwQjI0LCAweDMyODc4OTA4LAorMHg2MjgzOEIwMCwgMHhBMDE1NjA1MywgMHgwNjREMEIyNCwgMHgwOTlFMDk2QywKKzB4OEYwODMyNzcsIDB4RTA3QjY2MjMsIDB4MEYxNjQwMDgsIDB4MDJGQzcwOTgsCisweDAxRkU3MDY4LCAweDYyNkM2NjJDLCAweDMyODc2MDUzLCAweDBCNjQ4RjAyLAorMHg2NDYzMzZFOCwgMHg2MjVDNzUwMSwgMHg4QkNEMzI5MywgMHhFMDE0RDYzNSwKKzB4RTQwMDA2NDQsIDB4RDUzNDYxREMsIDB4NjI1MEU3MDgsIDB4MzIxNzYyMkMsCisweDZEREM4QjAxLCAweDc0MDE2MkQzLCAweDM2NzM2NjRDLCAweDhGRjQyNTIwLAorMHhFNDAwNzUwMSwgMHhENTJENjFDQywgMHg2MjJDNjI1MCwgMHg4QjAxMzIxNywKKzB4NjJDMzZDQ0MsIDB4NjY0Qzc0MDEsIDB4MjUyMDM2NzMsIDB4NzUwMThGRjQsCisweDAwMDlBMEVDLCAweDQwMDhFMDc5LCAweDY0MkMwMkZDLCAweDQzMEJEMzE5LAorMHg2NjBDNkU0MywgMHgzNjUzRTUxOCwgMHhFMDYzODkxMCwgMHg0NjA4NDAwOCwKKzB4NDYwODA0RkUsIDB4NzBFMDk3MjIsIDB4MzQ3QzQ2MDAsIDB4RDMxMzA1RkUsCisweDM0NkM0MzBCLCAweEUwNjI2MjAzLCAweDBGMjQ0MDA4LCAweENCMDY2MEUzLAorMHg0MzBCRDMwQywgMHg2NjBDNjQwMywgMHgzNjUzRTUxOCwgMHhFMDYzODkyOCwKKzB4NDYwODQwMDgsIDB4NDYwODA0RkUsIDB4NzBFMDk3MDgsIDB4MzQ3QzQ2MDAsCisweEQzMDYwNUZFLCAweDM0NkM0MzBCLCAweDZDMDNBMDFELCAweDAwMDAwNjRELAorMHgwMDExNDJFOCwgMHgwMDExNDhFMCwgMHgwMDExNDhCQSwgMHgwMDExNDkzNCwKKzB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsIDB4MDAxMTQ3NzQsIDB4MDAxMTQwMTEsCisweDAwMTE0MkU0LCAweDAwMTE0MkQ4LCAweDAwMTE0MkVELCAweDAwMTE0MkY1LAorMHg0MDA4RTA2MiwgMHg2MEUzMENGQywgMHhEMzlDQ0IwOCwgMHg2NDAzNDMwQiwKKzB4RTA3QTYxMEMsIDB4NDAwOEU2MTgsIDB4OEQxQzMxNjMsIDB4RTA1RDBGMTQsCisweDA3RkM0MDA4LCAweDA5RkM3MEZDLCAweDA0RkU3MEZDLCAweEQzOTQ2NjdDLAorMHg2NTlDNDMwQiwgMHhFMDdBNjUwMywgMHgwMUZDNDAwOCwgMHg2MTFDNzBBNCwKKzB4MDRGRTQxMDgsIDB4OUQ3NDQxMDgsIDB4MzREQzQxMDAsIDB4NDMwQkQzOEQsCisweEEwMDMzNDFDLCAweEUwNjI2RDAzLCAweDBERkM0MDA4LCAweEU1MDBENjhBLAorMHg2NDBEODU2MiwgMHg0MDA4RTA1QiwgMHgwMUZFQTAyQywgMHg2MDUzNjU1QywKKzB4MzA1QzQwMDAsIDB4NDAwOEQ2ODUsIDB4NjIyRDAyNkQsIDB4OEYyMDMyMTAsCisweEQzODM2RTAzLCAweDY0MUQ0MzBCLCAweDIyMjg2MjBELCAweEQ2ODE4OTFELAorMHgwNjZDNjBFMywgMHg0MDA4RTA2MiwgMHg0NjAwMDJGQywgMHgzMTY3NjEyQywKKzB4NjI2MzhCMDAsIDB4NjRDQ0UwNjIsIDB4MzQ2NzQwMDgsIDB4OEYwMTBGMjQsCisweDYyNjM2MkMzLCAweDM1Njc2NURDLCAweDZDMjM4RDAxLCAweEEwMDQ2NkQzLAorMHg3NTAxNkQ2MywgMHgzMjQzNjI1QywgMHhFMDYyOEJEMCwgMHgwN0ZDNDAwOCwKKzB4NjE3Q0U0MDAsIDB4RTkwNEQ1NzAsIDB4NjIyQzYyNTAsIDB4OEIwMTMyMTcsCisweDYyNzM2NzdDLCAweDY2NEM3NDAxLCAweDI1MjAzNjkzLCAweDc1MDE4RkY0LAorMHg2MUNDRTQwMCwgMHhFNzA4RDU2OSwgMHg2NjZDNjY1MCwgMHg4QjAxMzYxNywKKzB4NjZDMzZDQ0MsIDB4NjI0Qzc0MDEsIDB4MjU2MDMyNzMsIDB4NzUwMThGRjQsCisweDYxRENFNDAwLCAweDY2NTBENTYyLCAweDM2MTc2NjZDLCAweDZEREM4QjAxLAorMHg3NDAxNjZEMywgMHgzMjczNjI0QywgMHg4RkY0MjU2MCwgMHhBMDA1NzUwMSwKKzB4MDY0RDAwMDksIDB4RTIwMEQ2NUIsIDB4MDYyNEUwM0EsIDB4RTAzQUQ2NTksCisweDIyMjgwMjZDLCAweEUwMzk4OTRCLCAweDIyMjgwMjZDLCAweEUwNUI4OTQ3LAorMHgwRUZFNDAwOCwgMHgzRTY2OTY5MCwgMHhFMDc5ODk0MSwgMHgwMEZDNDAwOCwKKzB4OEQwMjNFNjYsIDB4Q0IwMjY0MEMsIDB4RDM0NDY0MEMsIDB4MDAwOTQzMEIsCisweEUwNUM2NjBDLCAweDA3RkM0MDA4LCAweDQ2MDg3MDFDLCAweDYxN0MwNUZFLAorMHg5NzdBNDYwOCwgMHgzNTdDNDYwMCwgMHg2NjEzMzU2QywgMHg0MzBCRDM0NiwKKzB4RDU0NDY0RTMsIDB4NjIwMzIwMDgsIDB4MDAyOTE1MEYsIDB4NjYwM0NBMDEsCisweDI2NjhFMDNCLCAweDA1NjQ4RDIwLCAweEM4RjA2MDIzLCAweEQ1M0Y4OTA5LAorMHg3NkZGNjY1MCwgMHg4NDUxMjU2MCwgMHg4MDUxNzBGRiwgMHg3MEZGODQ1MiwKKzB4NjAyMzgwNTIsIDB4ODkwRkM4MEYsIDB4NjI2MEQ2MzksIDB4MjYyMDcyMDEsCisweDcwMDE4NDYxLCAweDg0NjI4MDYxLCAweEEwMDU3MDAxLCAweEQ2MzE4MDYyLAorMHhFMDNCRTIwMCwgMHgxNjJGMDYyNCwgMHg0MDA4RTA1QiwgMHg5NjQzMDJGRSwKKzB4OEI2NTMyNjYsIDB4RDcyQkQ0MjgsIDB4RDUyRTYwNDAsIDB4NDAyOEM5M0YsCisweDQwMDg0MDA4LCAweDUwNzI2MjAzLCAweEM4MDJEMTJCLCAweEU2MDQ4OTFBLAorMHg0NjI4NDYxOCwgMHgyNTIyMjI2QiwgMHhFMjA4NjA0MCwgMHg2NTAzQzkzRiwKKzB4NjYwMzQ1MDgsIDB4NDUwMDQ1MDgsIDB4NDYyODQyMTgsIDB4NjI2MzI1MkIsCisweDQyMDg0MjA4LCAweDI1MkI0MjAwLCAweDQyMThFMjA4LCAweDI1MkI0MjI4LAorMHgyMTUyQTA2MiwgMHg0NjE4RTYxNCwgMHgyMjZCNDYyOCwgMHg2MDQwMjUyMiwKKzB4QzkzRkU0MjgsIDB4NDUwODY1MDMsIDB4NDUwODQwMjgsIDB4NDUwMDQwMDgsCisweDQwMDg0NDE4LCAweDI1NEJFNzI4LCAweDQ3MTg0MDAwLCAweDQ3MjgyNTBCLAorMHhENDEyMjU3QiwgMHgyMTUyQTA0NCwgMHgwNjREMDlCNCwgMHgwMDExNDhFMCwKKzB4MDAxMTQ4QkEsIDB4MDAxMTQ5MzQsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweDAwMTE0Nzc0LCAweDAwMTE0MDExLCAweDAwMTE0MkZELCAweDAwMTE0MzAxLAorMHgwMDExNDMwOSwgMHgwMDExNDJEOCwgMHgwMDExNEEyNCwgMHgwMDExNDJGNSwKKzB4MDAxMTQyRUQsIDB4MDAxQzM2OTQsIDB4MDAxQzNCQjQsIDB4MDAxMTQyRTgsCisweEUyMTRENDI5LCAweDQyMTg2MDQwLCAweDQwMjhDOTNGLCAweDQwMDg0MDA4LAorMHhENjI2NDIyOCwgMHgyNjAyMjAyQiwgMHhFNzI4NjA0MCwgMHg2NTAzQzkzRiwKKzB4NDUwODQ1MDgsIDB4NDUwMDQwMjgsIDB4NDAwODQ3MTgsIDB4NDAwODI1N0IsCisweDQwMDBFNzI4LCAweDI1MEI0NzE4LCAweEQyMUQ0NzI4LCAweDIyNTIyNTdCLAorMHhENzFDNjI0MCwgMHgwNzI0RTA0NCwgMHgzRjNDOTMyQywgMHg0RjE2NEYwNiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDJGRTY2OEY2LCAweDYyNDNEMTE0LCAweEU0MDI4NTEyLCAweDZFMkQ2NzBELAorMHhFNTAwQTAwRiwgMHg2MDUzNjU1RCwgMHgzMDVDNDAwMCwgMHg0MDA4RDEwRiwKKzB4NjIyRDAyMUQsIDB4OEIwMzMyRTAsIDB4MDQxQzcxMDgsIDB4NjQ0Q0EwMDQsCisweDYyNUQ3NTAxLCAweDhCRUQzMjczLCAweDQ2MThFNjAyLCAweDYwNEQyNDY5LAorMHg2RUY2MDAwQiwgMHgwMDAwMDFGMCwgMHgwMDExNDJFOCwgMHgwMDFDMzY5NCwKKzB4MDAxQzNCQjQsIDB4MDAxMTQyRDgsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweEQ3NjZENTY1LCAweDYyNzI1MTUxLCAweDMyMUNFMzQwLCAweDUxNTIyNzIyLAorMHgzMzdDNTI3MSwgMHgxNzIxMzIxQywgMHg1MjcyNTE1MywgMHgzMjFDNjQ0QywKKzB4MTcyMkQxNUYsIDB4NjYxMjUyNTUsIDB4MjE2MjM2MkMsIDB4MzE2QzUxNzMsCisweDYxNTIxNzEzLCAweEQ2NUI1Mjc0LCAweDE3MjQzMjFDLCAweDUyNzU1MTU0LAorMHgxNzI1MzIxQywgMHg1Mjc2NTE1OCwgMHgxNzI2MzIxQywgMHg1MTc3NjI2MiwKKzB4MTcxNzMxMkMsIDB4NTE3ODUyNjEsIDB4MTcxODMxMkMsIDB4NTE3OTUyNjIsCisweDE3MTkzMTJDLCAweDUxN0E1MjYzLCAweDE3MUEzMTJDLCAweDUxN0I1MjY0LAorMHgxNzFCMzEyQywgMHg1MTdDNTI2NSwgMHgxNzFDMzEyQywgMHg1MTdENTI2NiwKKzB4MTcxRDMxMkMsIDB4NTE3RTUyNjcsIDB4MTcxRTMxMkMsIDB4NTI3RjUxNjgsCisweDMyMUNENjQ1LCAweDYyNjIxNzJGLCAweDc2OTQ2MTMyLCAweDIzMTIzMTJDLAorMHg1MjMxNjE2MiwgMHgzMjFDRDY0MSwgMHg1MTVDMTMyMSwgMHgzNTFDNTUzMiwKKzB4NjE2MjEzNTIsIDB4NDEyOTUyMzUsIDB4MTMyNTMyMUMsIDB4NTYzNjU1NjEsCisweDM2NUM0NTI5LCAweDEzNjZFNTM4LCAweDU1MzEyNDUwLCAweDcxMDQ2MTQzLAorMHg2NjcyMjE1MiwgMHg3NTA4NjU0MywgMHg1NjcxMjU2MiwgMHg3NTBDNjU0MywKKzB4NTY3MjI1NjIsIDB4NzUxMDY1NDMsIDB4NTY3NTI1NjIsIDB4NzUxNDY1NDMsCisweDU2NzMyNTYyLCAweDc1MTg2NTQzLCAweDU2NzYyNTYyLCAweDc1MUM2NTQzLAorMHg1NjMyMjU2MiwgMHg3NTIwNjU0MywgMHg2NjMyMjU2MiwgMHg3NTI0NjU0MywKKzB4NTY3NDI1NjIsIDB4NzUyODY1NDMsIDB4NTYzNDI1NjIsIDB4NzUyQzY1NDMsCisweDU1MzMyNTYyLCAweDcyMzA2MjQzLCAweDU1MzUyMjUyLCAweDcyMzQ2MjQzLAorMHg1NjM2MjI1MiwgMHgyNDYyNzQzOCwgMHgxMzQxRTQwMCwgMHgxNzQxMjc0MiwKKzB4MTc0NTE3NDIsIDB4MTc0NjE3NDMsIDB4MjM0MjEzNDIsIDB4MTM0NDE3NDQsCisweDEzNDUxMzQzLCAweDEzNDYwMDBCLCAweEQ1MTBFMTI0LCAweDUxNTcyNDEwLAorMHg1MjU4MTQxMSwgMHg1NzU5MTQyMiwgMHg1MTVBMTQ3MywgMHg1MjVCMTQxNCwKKzB4NTc1QzE0MjUsIDB4NTI1RDE0NzYsIDB4MTQyN0U3MDAsIDB4MTQ2ODU2NUUsCisweDE0Njk1NjVGLCAweDE1NzgxNTc3LCAweDE1N0ExNTc5LCAweDE1N0MxNTdCLAorMHgxNTdFMTU3RCwgMHgxNTdGMDAwQiwgMHgwMDFDMzY5QywgMHgwMDIwMzUxQywKKzB4MDAyMDM1NzgsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDZFNzI2MTU3LCAweDIxNjc2RTY5LCAweDY5Njg1NDIwLCAweDZGNjQyMDczLAorMHg2NTZDNjc2RSwgMHg3NDZGNkUyMCwgMHg2NTY1NjIyMCwgMHg2MTYzMjA2RSwKKzB4NzI2MjY5NkMsIDB4NjQ2NTc0NjEsIDB4MDAwMDAwMEEsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMl90IHpjRndCdWZJbWFnZVNpemU9ODM5Njg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3NwaXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3c3BpdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3NwaXUuYwpAQCAtMCwwICsxLDY1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNQSVtdPXsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4QjAxODdGRkMsIDB4RTYwMDAwMDksCisweDk0M0RENTIwLCAweEM4NDA2MDUyLCAweDJGMDI4RjAzLCAweDhGRjkzNjQyLAorMHhENDFENzYwMSwgMHg0RTBCREUxRCwgMHhENDFEMDAwOSwgMHgwMDA5NEUwQiwKKzB4NEUwQkQ0MUMsIDB4N0YwNDAwMDksIDB4QTAyMTRGMjYsIDB4NEYyMjZFRjYsCisweEUyMDVEMTE5LCAweDIxMjJFNDAwLCAweDkyMjIyMTQyLCAweDhCRkQ0MjEwLAorMHg0NTBCRDUxNiwgMHhENjE2MDAwOSwgMHgwMDA5NDYwQiwgMHhFNUZGRDcxNSwKKzB4Mjc1MjY1NUQsIDB4RTFGRkQ3MTQsIDB4RDQxNDUwNzksIDB4MTcwOUNCMDEsCisweDE3MTEyNzEyLCAweDI0MTJFMTAxLCAweDRGMjZENDExLCAweDI0MTAwMDBCLAorMHhERTExREQxMCwgMHgwMDA5NEQwQiwgMHgwMDA5NEUwQiwgMHgwMDA5QUZGQSwKKzB4MDNFODI3MTAsIDB4MDAxQzAwMUMsIDB4MDAxMTY1OTQsIDB4MDAxMTRFQkUsCisweDAwMTE2NUE0LCAweDAwMTE2NUJDLCAweDAwMUQ0MDA0LCAweDAwMTE0RkEwLAorMHgwMDExNDM3OCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAxMTY0RkMsIDB4MDAxMTQ3MDAsIDB4MDAxMTU4OUMsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGQzg0RjIyLCAweEQyOERERDhDLAorMHg2MUQzNjBEMCwgMHg4MEY0NzEwMSwgMHg0MjBCNjAxMCwgMHgyMDA4ODBGOCwKKzB4NkUwMzhGMTAsIDB4REI4OUQ0ODgsIDB4RDQ4OTZBNDAsIDB4NEIwQkRDODksCisweDY3QzA2NUFDLCAweDY5N0NERTg4LCAweDQxMDg2MTkzLCAweDMxOTg0MTA4LAorMHgzRTFDNDEwOCwgMHg2NkQyODRGOCwgMHgyMDA4NjAwQywgMHgyRTYyOEYxMywKKzB4RTQwMDg0RjQsIDB4REE4MTY3MEMsIDB4MzI3MzYyNEQsIDB4QTBEMzhCMDEsCisweDY0NEQwMDA5LCAweDM1QUM2NTQzLCAweDY5NDM2NjUyLCAweDM5RUM2QjYyLAorMHhBRkYxMTlCMSwgMHg4ODAxNzQwNCwgMHg4NEY0OEIxNSwgMHgyRTcwRTcwMCwKKzB4REE3NjZFMEMsIDB4MzJFMzYyN0QsIDB4QTBDNDhCMDEsIDB4Njc3RDAwMDksCisweDZDNzM2NkEzLCAweDY1NzM3NjA0LCAweDM1NkMzQ0FDLCAweDZENTI2NEMyLAorMHhBRkVGNzcwOCwgMHhFMkIwMjREMiwgMHgzMDIwNjIyQywgMHg4NEY0OEIzMCwKKzB4NjUwQ0VDMDAsIDB4REE2OTFGNTMsIDB4NTVGM0U5MDQsIDB4MzI1MzYyQ0QsCisweEEwQTg4QjAxLCAweDZDQ0QwMDA5LCAweDY3QzM2RUEzLCAweDZCQzM3RTA0LAorMHgzQkVDMzdBQywgMHg2RUIyNkQ3MiwgMHhEQjYyRDQ2MSwgMHgwMDA5NEIwQiwKKzB4NDEwQkQxNjEsIDB4RDQ2MTY0RDMsIDB4MDAwOTRCMEIsIDB4NDUwQkQ1NUUsCisweEQ0NUY2NEUzLCAweDAwMDk0QjBCLCAweDYxRDNFNjAwLCAweDMxNkM2NjZELAorMHg2NDZENzYwMSwgMHgyMUUwMzQ5MywgMHg0RTE5OEZGNywgMHg3QzA4QUZENSwKKzB4NjIyQ0UyQjEsIDB4OEIxMTMwMjAsIDB4RDU1MkQ0NTYsIDB4REE1NkRDNEYsCisweDAwMDk0NTBCLCAweDRBMEJFNDAwLCAweEQ3NTQ2N0MyLCAweDQ3MEJEQjUyLAorMHg0QjBCMDAwOSwgMHhFOTAwRTQwMywgMHgyRTkwQTA2RCwgMHg2MjJDRTJCMiwKKzB4ODk2ODMwMjAsIDB4NjIyQ0UyQjMsIDB4OEIxRDMwMjAsIDB4REE0NUQ0NEMsCisweDRBMEJEOTQyLCAweDY1OTYwMDA5LCAweDY3OTJENDRBLCAweDFGNzRERDNCLAorMHgxRjVENEQwQiwgMHhENjM5RDQ0OCwgMHg0NjBCREI0OCwgMHg1NUY0NTVGNCwKKzB4NEIwQkQ5MzYsIDB4RDQ0NjU0RkQsIDB4NDkwQjY1MDMsIDB4NURGNTFGMDUsCisweDFFRDFFQzA0LCAweDJFQzBBMDQ3LCAweDYyMkNFMkI0LCAweDhCM0UzMDIwLAorMHhEQTM0RDQ0MCwgMHg0QTBCREQzMSwgMHg4NEY0MDAwOSwgMHg2MDBDNkNEMiwKKzB4MUYwNzJGMDIsIDB4MUZDNkM5MDMsIDB4RTYwMDFGMDgsIDB4RDczQUUwMzAsCisweDZDRjJEQjNBLCAweDFGNzkwRjY1LCAweEEwMjExRkJBLCAweDUxRjZFOTA0LAorMHg2RDYzNjY2RCwgMHg0QzE1MzZFQywgMHhEMjM1M0QxQywgMHgxRjZCOEYwNSwKKzB4ODkwMjNDOTMsIDB4QTAwMjY0RDMsIDB4RTUwNDU1RjgsIDB4NDIwQjY0RDMsCisweDVCRkIwMDA5LCAweEQ2MTk1NEZBLCAweDQ2MEI2NUQzLCAweDU0RjkxQjAxLAorMHhEQTE2NTVCMSwgMHg3Q0ZDNEEwQiwgMHgwNkZERTAzMCwgMHgwRjY1NzYwNCwKKzB4NjI2RDU1RjcsIDB4OEJEQTMyNTMsIDB4QTAwNDg0RjQsIDB4RDQyNTJFMDAsCisweDQyMEJEMjBFLCAweDdGMzg2NUQyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHg2OUY2MDAwQiwgMHhFNjAwNjE2MywgMHg0MTA5QTAwNCwKKzB4NzYwMTYyNTYsIDB4NzQwNDI0MjIsIDB4OEJGOTM2MTIsIDB4MDAwOTAwMEIsCisweDAwMTE3ODAwLCAweDAwMTE1RkYwLCAweDAwMTE2NEY2LCAweDAwMTE0RjJDLAorMHgwMDExNjVDMCwgMHgwMDExNjRGNSwgMHgwMDExNjExQywgMHgwMDExNzgwNCwKKzB4MDAxMTY1RTAsIDB4MDAxMTRFQkUsIDB4MDAxMTRGMDIsIDB4MDAxMTY1RjQsCisweDAwMTE2NUZDLCAweDAwMTE2NjAwLCAweDAwMTE0QkYwLCAweDAwMTE0OEZDLAorMHgwMDExNjYxOCwgMHgwMDExNjYzNCwgMHgwMDExNjY0MCwgMHgwMDExNEU1NiwKKzB4MDAxMTY2NEMsIDB4MDAxMTY2NTgsIDB4MDAxMTY2N0MsIDB4MDAxMTY2NzAsCisweDAwMTE0QkM0LCAweDAwMTE2Njg4LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0ZEOCwgMHg2NDUzRTExMCwKKzB4NkM1MzQxMjgsIDB4NjU1REVFMEEsIDB4NDYwODY2NTMsIDB4NDYwODM2NUMsCisweDM2MUM3NTAxLCAweDY3NUQ2MDQzLCAweDYwQzMwRjY2LCAweDM3RTNFRDAwLAorMHg4MTYxMjZDMSwgMHg4MTYzODE2MiwgMHgxNkQzMTZEMiwgMHg4RkVBMTZENCwKKzB4NjhGMjc0MDQsIDB4REFCM0Q5QjIsIDB4Mjk4MjE5ODEsIDB4RDFCMjU5RjEsCisweDJBOTIxQTkxLCAweDVCRjM1QUYyLCAweDVFRjU1REY0LCAweDExQTE1NEY2LAorMHgxMUIzMjFBMiwgMHgxMUQ1MTFCMiwgMHgxMUU3MTFENCwgMHgxMTQ5MTFFNiwKKzB4NTVGNzExNDgsIDB4RUUwMERCQTksIDB4RERBOTU3RjgsIDB4RDZBOTUyRjksCisweDFCNTE2NEUzLCAweERCQTgyQjUyLCAweEVBQjhEOEE4LCAweDJENzJFOTQ1LAorMHg2QUFDMjYyMiwgMHg2RUVENDkwOCwgMHg0RDA4NkRFMywgMHgzREVDNjFFMywKKzB4NEQwODQxMDgsIDB4M0RCQzMxRUMsIDB4NDEwODYwQzMsIDB4ODFEMTJEQzEsCisweDQxMDhFMDUwLCAweDQxMDg0MDA4LCAweDYwQzM4MUQyLCAweEU1MDAzMThDLAorMHg4MUQzMzRBMiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ5NCwgMHhENDkxMUQ1NCwKKzB4QjA4MTY1RDMsIDB4NjRFRDdFMDEsIDB4OEJEQzM0OTIsIDB4REI5NEQxOEQsCisweEQyOEI2ODEyLCAweDFCODE0ODI5LCAweDJGRDI2NDEyLCAweDJCOTI2OTRELAorMHhEOThBNjcyMiwgMHgxQjczNDcyOSwgMHhENzg3NjgyMiwgMHgxQkEyNkE4RCwKKzB4RDI4QzZCNzIsIDB4MjJCMkQ1ODYsIDB4RTAwMzVENzIsIDB4NUU3NDEyRDIsCisweDEyRTQ0MDE4LCAweEQ2ODg1MTc2LCAweDU0NzgxMjE2LCAweDEyNDhFMUZGLAorMHhENDg1Njc5MiwgMHg2ODUyMTI3QSwgMHgyOEMxRTcwMywgMHg4MTkxNjk1MiwKKzB4NkE1MkUwNTAsIDB4ODFBMjQwMDgsIDB4NjBDMzZCNTIsIDB4NkQ1MjgxQjMsCisweDZFNTIxREQyLCAweDYyNTIxRTYzLCAweDEyNjRFNjAwLCAweDQ2MDg2NTYzLAorMHg3NTAxMzY0QywgMHg2NjVEMjYxMiwgMHg4QkY4MzY3MywgMHhFMDAzRDQ3MSwKKzB4NDAxODY1NDIsIDB4Njc0MjI1QzEsIDB4ODE3MUQyNzQsIDB4RUUwMDY4NDIsCisweDY5NDIxODgyLCAweDE5MjNFMDI0LCAweEU1ODA2QTQyLCAweDZCNDIxQUU0LAorMHg4MUIyNjZFMywgMHhENDZENkM0MiwgMHg2NTVDODFDMywgMHg2RDYzNjY2RCwKKzB4NjE2RDc2MDQsIDB4MzE1MzNENEMsIDB4MkRFMjhGRjgsIDB4RDU2OUQyNjgsCisweDc0MDQyNDIyLCAweDdGMjgyNDUyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg2NjQyNjhGNiwgMHhDODAzNjA2MSwKKzB4RTUwMDhEMDQsIDB4QzkwMzYwNjEsIDB4OEIwMzg4MDIsIDB4NjU2MzUyNjIsCisweDI0MTI1MTI0LCAweDYwNTMwMDBCLCAweDJGRTYyRkQ2LCAweDdGRUM0RjIyLAorMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwgMHg0NTA4RTQwMCwgMHhFMTAxQTAwMSwKKzB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsIDB4NjA1MzgxMjMsIDB4NTZFMjgxMjIsCisweDhCRjUzNjIwLCAweDE2RTREMjUwLCAweEU2MTQ2NEYzLCAweDY1RTM0MjBCLAorMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwgMHg2NUYzNjFGMSwgMHgyRjExMjE0OSwKKzB4RDE0OTU0RDEsIDB4RTYxNDQxMEIsIDB4NjA3MTU3RDEsIDB4MjcwMUNCMDEsCisweDdGMTQxREUxLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywgMHg2RDQzRTVGQywgMHgyMDU5NjA2MSwKKzB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsIDB4MTJFNDhCMDYsIDB4MzFFMDUxRTIsCisweDUyRDE4QjA0LCAweDFFMjJBMDAyLCAweDU2NjRBRkYwLCAweDY0RjNEMjM2LAorMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywgMHgyNzE5RTFGQywgMHg2N0YxMkU3MSwKKzB4MjcxOTU0RDEsIDB4NjVGM0QxMzAsIDB4NDEwQkU2MTQsIDB4NTJEMTJGNzEsCisweENCMDE2MDIxLCAweDFERTEyMjAxLCAweDRGMjY3RjE0LCAweDAwMEI2RUY2LAorMHgyRkU2NkRGNiwgMHg2MjRDNEYyMiwgMHg0MjA4REUxQiwgMHhBMDA1NDIwMCwKKzB4NTI1MjNFMkMsIDB4NTYyNEQ0MTcsIDB4MkU2MkJGOEUsIDB4NTJFMTY1RTIsCisweDhCRjYzNTIwLCAweDI2MjJENjFCLCAweDAwMEI0RjI2LCAweDJGQjY2RUY2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhEQjFDREMxMCwgMHg2NkMyNTJDMSwKKzB4ODk0MDM2MjAsIDB4QzkwMzYwNjEsIDB4ODkzQzg4MDEsIDB4REQxOERFMEIsCisweDY0RTNCRjYzLCAweDg1MDM2NTAzLCAweDYyMEQ2NkIyLCAweDg5MkIzMjYyLAorMHhCRjlCRDQwMywgMHhENDEzMDAwOSwgMHgwMDA5NEQwQiwgMHgwMDA5QUZFNiwKKzB4MDAxMTYwREMsIDB4MDAxMTYwRTQsIDB4MDAxMTYwRUMsIDB4MDAxMTYxMTQsCisweDAwMTE2NEY4LCAweDAwMTE2NTAwLCAweDAwMTAwMEM4LCAweDAwMTAxNjgwLAorMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwgMHgwMDExNzg4MCwgMHgwMDExNzc4MCwKKzB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsIDB4MDAxMTQyRjgsIDB4MDAxMTY0REMsCisweDAwMTE0RUJFLCAweDAwMTE2NjlDLCAweDY0RTNCRjNFLCAweDREMEJENDA2LAorMHhBRkJCMDAwOSwgMHhEMjA1MDAwOSwgMHg0RjI2MjI2MiwgMHg2REY2NkVGNiwKKzB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsIDB4MDAxMTY2QTAsIDB4MDAxQzNEMjgsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEMjNDN0ZGQywgMHhDODAzNjAyMiwgMHgyRjAxOEYzRCwgMHgwMDA5QTA2MSwKKzB4QzkwMzYwNjEsIDB4ODkzQjg4MDEsIDB4RDIzOEQ4MzcsIDB4NDIwQkQ5MzgsCisweEU0MDA2NDgzLCAweDZBMDM2RDAzLCAweDVDMDI0OTBCLCAweEQyMzZEQjM1LAorMHg1NkQzODVEMiwgMHg2NTBENjQyMiwgMHg0QjBCRTc0MCwgMHhEMTMyNkUwMywKKzB4NjQxMjZFRUQsIDB4MjE0MjM0RUMsIDB4M0RDMDVERDQsIDB4ODVEMjhCRUYsCisweDcwRkY1NkQzLCAweEU3NDA2NTBELCAweDZDMDM0QjBCLCAweDQ5MEJEQjJBLAorMHg2NkIyRTQwMywgMHgzNkNDNkNDRCwgMHhFNzAwRDkyOCwgMHgyQjYyRTVDOCwKKzB4NjQ3M0U2NTAsIDB4NDkwQkRDMjYsIDB4NjQ4MzY1NUMsIDB4NjVBMzRDMEIsCisweEVFMDFEMTI0LCAweEQxMUMyMUUyLCAweDY2MTI1MjExLCAweDhCQkYzNjIwLAorMHhERDIyREUyMSwgMHhEQzIzREIyMiwgMHg2NUQyNTJEMSwgMHg4OTE4MzUyMCwKKzB4QzkwMzYwNTEsIDB4ODkxNDg4MDEsIDB4RDExNEQ0MUMsIDB4MDAwOTQxMEIsCisweDM2RTA1NjAzLCAweDY1MDM4RjA0LCAweDJCMjBFMjAxLCAweDJDNTJBRkVDLAorMHhEMjEzRDQxOSwgMHgwMDA5NDIwQiwgMHhFMTAxRDYxOCwgMHhBRkUzNDExOCwKKzB4NjBGMTI2MTIsIDB4ODkwMkM4MDQsIDB4NDIwQkQyMTUsIDB4N0YwNDAwMDksCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHgwMDAwNjhGNiwgMHgwMDFFMjEwMCwgMHgwMDExNjBFNCwgMHgwMDExNDUzQSwKKzB4MDAxMTRCRjAsIDB4MDAxMTRFMEMsIDB4MDAxMTY3MTQsIDB4MDAxMTU5QjAsCisweDAwMTE0NTU4LCAweDAwMUUyMTJDLCAweDAwMTE3ODgwLCAweDAwMTE2MERDLAorMHgwMDExNjRGQywgMHgwMDExNjRGOCwgMHgwMDExNjExNCwgMHgwMDFDM0QzMCwKKzB4MDAxMTQwQ0MsIDB4RDZDMkQ1QzEsIDB4MjYyMjYyNTIsIDB4QzgwMTYwNjAsCisweDAwMEI4QkZBLCAweDJGRTYwMDA5LCAweEJGRjM0RjIyLCAweEQyQkQwMDA5LAorMHhFNDA1RTEwMCwgMHgyMjQwMjIxMiwgMHg2NDIyREVCOCwgMHhFNzAwRDVCOCwKKzB4MjU3MjFFNDIsIDB4Qzk4Rjg0NTEsIDB4QzlGMENCMTAsIDB4ODA1MUNCMDIsCisweENCMDI2MDUwLCAweDYyNTIyNTAwLCAweDJFMjJCRkRDLCAweEQ2QjI1MEU0LAorMHg0RjI2MjYwMiwgMHg2RUY2MDAwQiwgMHg0RjIyMkZENiwgMHgwMDA5QkZEQiwKKzB4NjIwQ0REQUUsIDB4NjBEMDJEMjIsIDB4ODkwNkM4MDEsIDB4MDAwOUJGRDMsCisweDJEMjI2MjBDLCAweEM4MDE2MEQwLCAweDRGMjY4QkY4LCAweDZERjYwMDBCLAorMHg0RjIyMkZFNiwgMHg2RTQzQkZFOCwgMHhFMTAwRDJBMiwgMHgyMkUwMjIxMiwKKzB4NjQyMkQ1OUUsIDB4RTYwMERFOUUsIDB4MkU2MjE1NDIsIDB4QzlGMDg0RTEsCisweDgwRTFDQjAxLCAweENCMDI2MEUwLCAweDY3RTIyRTAwLCAweDRGMjYyNTcyLAorMHg2RUY2QUZBOCwgMHhFNDA2QUZFNCwgMHhFNDA0QUZFMiwgMHhCRkY5NEYyMiwKKzB4RTRDNzAwMDksIDB4NjQ0Q0JGREMsIDB4NEYyNkFGRjYsIDB4RTQwNkFGRDgsCisweEU0MDRBRkQ2LCAweDRGMjIyRkU2LCAweDZFNDNCRkY4LCAweEQ1OEREMjhELAorMHhFNDAxRTEwMCwgMHgyMjEyNjBFMywgMHg4MDUxMjI0MCwgMHg2NjIyRDE4NywKKzB4RTcwMERFODcsIDB4MkU3MjExNjIsIDB4QzlGMDg0RTEsIDB4ODBFMUNCMDIsCisweENCMDI2MEUwLCAweDYyRTIyRTAwLCAweDIxMjJCRjdDLCAweEFGREY0RjI2LAorMHgyRkQ2NkVGNiwgMHg0RjIyMkZFNiwgMHhCRkNCNkQ1MywgMHhCRjlCNkU0MywKKzB4RDI3QzAwMDksIDB4MjJFMDYxRDMsIDB4NjAyMkRFN0QsIDB4NDExODIxRTksCisweDIwMUJDOUZGLCAweDIyMDJENTc3LCAweEQ2NzY4NDUzLCAweDYwRDM4MDUxLAorMHhENDcyODA1MywgMHhEMTcyNjc2MiwgMHgxNDcyRUQwMCwgMHg4NDExMjFEMiwKKzB4Q0IwNEM5RjAsIDB4NjAxMDgwMTEsIDB4MjEwMENCMDIsIDB4QkY1MTYyMTIsCisweDRGMjYyNDIyLCAweEFGQTc2RUY2LCAweDY1NDM2REY2LCAweEFGRDBFNEQ4LAorMHg2NTQzNjQ0QywgMHhBRkNDRTREOCwgMHgyRkM2NjQ0QywgMHgyRkU2MkZENiwKKzB4NkU1MzRGMjIsIDB4QkY2NzZENDMsIDB4RDc2MjZDNjMsIDB4MjdEMEQyNjQsCisweDYxRTM2MDcyLCAweDQxMTgyMTI5LCAweDIwMUJDOUZGLCAweDI3MDJENDVELAorMHhEMTVCODQ0MywgMHg2MEUzODA0MSwgMHhERTU4ODA0MywgMHhFNjAwNjQ3MiwKKzB4MjE2MjFFNDIsIDB4NjVEQzg0MTEsIDB4NjBDMzYyMDMsIDB4NDAwOEM5MDcsCisweDY3MDM0MDA4LCAweEUyOUY2MDIzLCAweDYyMkNDOThGLCAweDM1MjAyMDdCLAorMHg4MDExOEQxOCwgMHg3QzA0ODQxMSwgMHg2MEMzNjYwMywgMHg2MjAzQzkwRiwKKzB4QzlGMDYwNjMsIDB4ODAxMTIwMkIsIDB4ODgwQjYwNTMsIDB4ODQxMThCMTQsCisweEM5MEY2NjAzLCAweEM5MEY3MDAxLCAweDYwNjM2MjAzLCAweDIwMkJDOUYwLAorMHg4MDExQTAwQSwgMHg3QzAxODQxMSwgMHg2MEMzNjYwMywgMHg2MjAzQzkwRiwKKzB4QzlGMDYwNjMsIDB4ODAxMTIwMkIsIDB4Q0IwMjYwMTAsIDB4NjIxMjIxMDAsCisweDJFMjJCRUYwLCAweEQ2M0M1MEU0LCAweDRGMjYyNjAyLCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg2QzYzNEYyMiwKKzB4NkU0MzZENTMsIDB4NkI3M0JGMzYsIDB4MDAwOUJGMDYsIDB4NjFEM0QyMzEsCisweERFMzMyMkUwLCAweDIxRTk2MDIyLCAweEM5RkY0MTE4LCAweEQ0MkQyMDFCLAorMHg4NDQzMjIwMiwgMHg4MDQxRDcyRiwgMHg4MDQzNjBEMywgMHg2NjIyRDQyNywKKzB4MTQ2MkQxMjcsIDB4MTRDMzI3QzIsIDB4MjFDMkVDMDAsIDB4N0IwNDg0MTEsCisweDYwQjM2RDAzLCAweDY1MDNDOTBGLCAweEM5RjA2MEQzLCAweDgwMTEyMDVCLAorMHhDQjAyNjAxMCwgMHg2MjEyMjEwMCwgMHg0RjI2MjQyMiwgMHg2REY2NkVGNiwKKzB4QUVBRjZDRjYsIDB4MkZCNjZCRjYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZDNTM2RDYzLCAweEJFRkQ2RTQzLCAweEJFQ0Q2QjczLCAweEQyMTUwMDA5LAorMHgyMkUwNjFDMywgMHg2MDIyREUxNiwgMHg0MTE4MjFFOSwgMHgyMDFCQzlGRiwKKzB4MjIwMkQxMTAsIDB4RDYwRjg0MTMsIDB4NjBDMzgwMTEsIDB4REUwQjgwMTMsCisweEQ0MEI2NzYyLCAweEVDMDA2QkJELCAweDFFQjUxRTcyLCAweDg0NDEyNEMyLAorMHhDOUYwNEIyMSwgMHg4MDQxQ0IwNCwgMHhFMTQwNjA0MCwgMHgyNDAwQ0IwNiwKKzB4RTUwMDYyNDIsIDB4NEIyMTJFMjIsIDB4NDEyOEEwMTQsIDB4MDAxRDEyMDAsCisweDAwMTE2NTI4LCAweDAwMTE2NTMwLCAweDAwMTE2NTM4LCAweDAwMTE2NTQ0LAorMHgwMEZGRkZGRiwgMHgwMDExNjUzNCwgMHg2MDUzNjU1RCwgMHgwNkRFNDAwOCwKKzB4MjE2Mjc1MDEsIDB4MzJCMzYyNUQsIDB4NEYyNjhCRjYsIDB4NkRGNjZFRjYsCisweEFFNUY2Q0Y2LCAweDRGMjI2QkY2LCAweEJGNzM2NzdDLCAweEFFQjM2NDRDLAorMHg0RjIyNEYyNiwgMHhCRkE2Njc3RCwgMHhBRUFENjQ0QywgMHg0RjIyNEYyNiwKKzB4RTUwMEU0OUYsIDB4QkYwOEU2MDMsIDB4NEYyNjY0NEMsIDB4NjAwQzAwMEIsCisweEU0OUY0RjIyLCAweEU2MDNFNTAwLCAweDY0NENCRUZGLCAweDRGMjY0MDE5LAorMHg2MDBEMDAwQiwgMHg2NTQzNjY1QywgMHhFNDAzQUVGNywgMHg2NTQzNjY1QywKKzB4RTQwQkFFRjMsIDB4RDE3NUQ2NzQsIDB4NjA0MzYyNjIsIDB4QzgwMTIxMjIsCisweDhGMDE2MDEwLCAweEM5RUZDQjEwLCAweDYyMTIyMTAwLCAweDI2MjIwMDBCLAorMHg0RjIyMkZFNiwgMHhFMDAwNEYxMywgMHhCRTJDNDAxRSwgMHhENTZDNkU0MywKKzB4MjUyMjYyMEMsIDB4RTQwMUJGRTYsIDB4NjA2M0Q2NjksIDB4NjBFQ0NGODAsCisweDg5MDcyMDA4LCAweDg5MDk4ODAxLCAweDg5MEQ4ODAyLCAweDg5MTE4ODAzLAorMHgwMDA5QTAxMywgMHhDOUUzNjA2MCwgMHgyNjAwQTAwRiwgMHhDQjEwNjA2MCwKKzB4Q0IwNEM5RjcsIDB4MjYwMEEwMDksIDB4Q0IxMDYwNjAsIDB4Q0IwOEM5RkIsCisweDI2MDBBMDAzLCAweENCMUM2MDYwLCAweEQ1NTkyNjAwLCAweEJFNjE2MjUyLAorMHhFNDAwNjQyQywgMHg0RjI2NEYxNywgMHg2RUY2QUZCQywgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NjBDMzZDN0MsCisweDZBNjM4ODAyLCAweDY5NTM4RjA5LCAweDY1NDM2MjkwLCAweDY2MkNFNEFGLAorMHhCRUY3RTcwMSwgMHhBMDBBNjQ0QywgMHgyQ0M4MDAwOSwgMHg4ODAxODkwMSwKKzB4NjU0MzhCMDUsIDB4RTYwMEU0QUYsIDB4QkVFQkU3MDEsIDB4QkREMTY0NEMsCisweEVEMDEwMDA5LCAweERFNDNFQkFGLCAweEU4MDBBMDJDLCAweDAwMDlCREY0LAorMHg2MEMzRDE0MSwgMHg4ODAyRTIwMCwgMHhENTQwMjEyMiwgMHgyMUIwOEQwNiwKKzB4ODkwODJDQzgsIDB4ODkwQTg4MDEsIDB4MDAwOUEwMEMsIDB4MDA5QzYwRDMsCisweEEwMDdENjM5LCAweEQyMzg4MDYxLCAweEEwMDM2MDgzLCAweEQyMzY4MDIxLAorMHg4MDIxNjBEMywgMHhEMTM1NjQxMiwgMHgxRTQyRTYwMCwgMHg4NDUxMjE2MiwKKzB4QzlGMDdEMDEsIDB4ODA1MUNCMDIsIDB4Q0IwMjYwNTAsIDB4NjcxMjI1MDAsCisweDJFNzJCREEwLCAweDhCRDEzREEyLCAweDAwMDlCREY2LCAweDAwMDlCREEzLAorMHg2MjBDRDYyNywgMHg0RjI2MjYyMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4RTcwMkFGOTgsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDNGM0M5MzMxLAorMHgwRjU2OTAzMCwgMHhFOEZGNzBGQywgMHg2ODhDMEY0NiwgMHhFOTAwQTA0OSwKKzB4NDAxOEUwMTAsIDB4RTUwNDA0RkUsIDB4QkYzMzM0OUMsIDB4ODhGRjZBNDMsCisweDkwMUY4OTNFLCAweEUxMTAwQ0ZFLCAweDQxMTgzQzk4LCAweDhCMDMzQzE2LAorMHg2NEEzQkUxQiwgMHgwMDA5QTAzMSwgMHg0MDE4RTAxMCwgMHhFRDAwMEJGRSwKKzB4QTAwNzNCQ0MsIDB4NjREMzZFRjMsIDB4QkYxRjM0QkMsIDB4MkUwMEU1MDEsCisweDdFMDE3RDAxLCAweDhCRjYzREMyLCAweDY0QTNCRTA3LCAweEEwMUFFRDAwLAorMHhFRkY4NkVGMywgMHgwMDAwMTAwNCwgMHgwMDFEMTIwNCwgMHgwMDExNjUyQywKKzB4MDAxMTY1NDQsIDB4MDAxRDEyMDAsIDB4MDAxMTY1MzAsIDB4MDAxMTY1MjgsCisweDY2NkM2NkUwLCAweDg5MDQzNjgwLCAweDM1QkM2NUQzLCAweEJFNTFFNzAxLAorMHg3RDAxRTQwMiwgMHgzREMyN0UwMSwgMHhFMTEwOEJGMiwgMHgzOTFDNDExOCwKKzB4OTA1NDc5MDQsIDB4MzkxMjAxRkUsIDB4OTM1MThCQjIsIDB4NEYyNjNGM0MsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2NzZENjI1MywgMHg2NjIzNjU0MywgMHhFNDAyQUVDMywgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4Njk3RDRGMjIsIDB4NEEyMTZBOTMsCisweDRBMDg0QTIxLCAweDZDNDM2RDYzLCAweEEwMDg2QjczLCAweDY0QzM2RTUzLAorMHg2NjkzNjVEMywgMHg2QkJEQkZFNCwgMHgzREFDM0NCQywgMHg2RUVGM0VCOCwKKzB4OEJGNDJFRTgsIDB4NEYyNkUwMDAsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDAwMEI2QUY2LCAweDJGQTY2OUY2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhFQzAwNEYyMiwgMHg2QjUzNkVDMywgMHhBMDA2NkQ0MywgMHg2NEQzRUEwMSwKKzB4NjVBM0JFQTgsIDB4N0QwMTNDMEMsIDB4M0VCMjdFMDEsIDB4NjBDMzhCRjcsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDEwMDQ2QUY2LAorMHgwMDAwMTAwOCwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsIDB4NjQ0Q0JGRjIsCisweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweEU1MDA2Q0Y2LAorMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwgMHhBRkUzOEJGQSwKKzB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsIDB4NjA0M0VFMEEsCisweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LCAweEU2MzBFNjM3LAorMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwgMHgwMDBCODAyOCwKKzB4NEYyMjZFRjYsIDB4QkZFNDdGRUMsIDB4QkZEODY1RjMsIDB4N0YxNDY0RjMsCisweDAwMEI0RjI2LCAweDRGMjJFMDAwLCAweEJGREE3RkVDLCAweDY0RjM2NUYzLAorMHg3NDA2QkZDRCwgMHg0RjI2N0YxNCwgMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwKKzB4NjI1MzdGRUMsIDB4NjVGMzZFNDMsIDB4NjQyM0JGQ0IsIDB4NjRFM0JGQkYsCisweDY0RjNCRkJELCAweEJGQkFENDAzLCAweDdGMTQwMDA5LCAweDAwMEI0RjI2LAorMHgwMDAwNkVGNiwgMHgwMDExNjZBNCwgMHhFNEZERDI5QSwgMHhENzlBNjEyMiwKKzB4MjIxMjIxNDksIDB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5NzY2MjIsCisweDIyNjIyNjQ5LCAweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LAorMHhFMUY3NjQ1MiwgMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQzlDRiwKKzB4RTYwMjYwNTIsIDB4MjUwMkNCMDMsIDB4MTU2MjQ3MTgsIDB4MTU3MzAwMEIsCisweEQ3OENENThCLCAweEQ0OEREMjhDLCAweEU2MDBFMTAwLCAweDI3MTEyNTExLAorMHhBRkQxMjIxMCwgMHg2NjRDMjQ2MSwgMHg0NjAwRDI4OSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMTAsIDB4NjU0QzI2MDAsIDB4NDUwMEQyODUsIDB4NjY1MDM1MkMsCisweDI2MTlFMUVGLCAweDI1NjAwMDBCLCAweEQyODI2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjdFNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyNzgsCisweDYwNjAzNjJDLCAweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjc0LAorMHg2NjUwMzUyQywgMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjcxNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2RDY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLAorMHg0MjAwRDY2NywgMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwKKzB4NjAwQzAwMEIsIDB4RDY2MzYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsCisweDQwMjE0MDIxLCAweDAwMEI0MDIxLCAweEQxNUY2MDBDLCAweDM0MUM2NDRDLAorMHgwMDBCNjI0MCwgMHhEMTVENjAyQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwKKzB4MkZFNjYwMkMsIDB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsIDB4ODkxNDM0NjcsCisweDAwMDlCRkVCLCAweDYwRUM2NDBDLCAweDhCMDI4ODAxLCAweEEwMDJFMDBGLAorMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwKKzB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsCisweDZFRjYwMDBCLCAweEQ2NEE0RjIyLCAweDg4MDE2MDYyLCAweEIyNDU4QjAzLAorMHhBMDAzMDAwOSwgMHhEMjQ3MDAwOSwgMHgyMjYwRTY0MCwgMHhFMjAwRDY0NiwKKzB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsIDB4NjA2MkQ2NDEsIDB4OEIwMTg4MDIsCisweDAwMDlCMjhFLCAweEUyMDBENjQwLCAweDAwMEI0RjI2LCAweEQ1M0MyNjIyLAorMHhFMTAwRDQzQywgMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwgMHhFNjA0RDIzOSwKKzB4MjI2MDAwMEIsIDB4RDQzOTRGMjIsIDB4NDEwQkQxMzksIDB4RDUzOTAwMDksCisweDY2NTBFMUZELCAweDI2MTlEMjM4LCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LAorMHg0RjIyMjI3MCwgMHhEMTMyRDQzNSwgMHgwMDA5NDEwQiwgMHhFN0ZCRDUzMSwKKzB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsIDB4NEYyMjI1NjAsIDB4RDEyQ0Q0MzAsCisweDAwMDk0MTBCLCAweEU3RjdENTJCLCAweDI2Nzk2NjUwLCAweDAwMEI0RjI2LAorMHhENTI4MjU2MCwgMHg2MjUwOTQyRCwgMHgwMDBCMjI0OSwgMHhENTI1MjUyMCwKKzB4NjI1MEU0QkYsIDB4MDAwQjIyNDksIDB4NEYyMjI1MjAsIDB4ODUyMkQyMjUsCisweDIwMDg2MDBELCAweDg4MDE4OTExLCAweDg4MDM4OTEzLCAweDg4MDU4OTE1LAorMHg4ODA2ODk0MiwgMHg4ODA4ODk0OCwgMHg4ODA5ODk0RSwgMHg4ODBBODk1NCwKKzB4ODgwQjg5NUEsIDB4QTA2Nzg5NjAsIDB4QjA2OTAwMDksIDB4QTA2NDAwMDksCisweEIwNzc2MDBDLCAweEEwNjAwMDA5LCAweEIwODA2MDBDLCAweEEwNUMwMDA5LAorMHhGRjdGNjAwQywgMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwgMHgwMDFFMTEwOCwKKzB4MDAxMTY1NzAsIDB4MDAxMTY1NzIsIDB4MDAxMTY1OTEsIDB4MDAxMTY1NTQsCisweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDJGLCAweDAwMUUxMDkwLAorMHgwMDExNjU3OCwgMHgwMDFFMTAwQiwgMHgwMDExNjU3NCwgMHgwMDExNjZBOCwKKzB4MDAxMTRFQkUsIDB4MDAxRTEwMjgsIDB4MDAxMTY1OTAsIDB4MDAxMTY2QjQsCisweDAwMTE2NkM0LCAweDAwMTE2NTQ4LCAweDYyNjBENjg0LCAweDhCMkIyMjI4LAorMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwKKzB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsCisweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LAorMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwKKzB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsCisweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLAorMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwKKzB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsCisweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LAorMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwKKzB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsCisweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLAorMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwKKzB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsCisweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELAorMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwKKzB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsCisweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLAorMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwKKzB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsCisweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLAorMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwKKzB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsCisweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELAorMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwKKzB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsCisweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LAorMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywKKzB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsCisweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELAorMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwKKzB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsCisweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMTE2NTkxLAorMHgwMDExNjU0OCwgMHgwMDExNjU1NCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywKKzB4MDAxMTY1NzQsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAxMTY1N0MsCisweDAwMTE2NTVDLCAweDAwMTE2NTYwLCAweDAwMTE2NTY0LCAweDAwMTE2NTgwLAorMHgwMDExNjU4NCwgMHgwMDExNjU4OCwgMHgwMDExNjU4QywgMHgwMDExNjc3NCwKKzB4MDAxMTY3N0UsIDB4MDAxMTY1NkUsIDB4MDAxMTVEQ0EsIDB4ODkxMjM0MjcsCisweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LAorMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwKKzB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsCisweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LAorMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywKKzB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsCisweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLAorMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwKKzB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsCisweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLAorMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwKKzB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsCisweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLAorMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsCisweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLAorMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywKKzB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsCisweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLAorMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywKKzB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsCisweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLAorMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwKKzB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsCisweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwKKzB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsCisweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLAorMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwKKzB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsCisweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLAorMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwKKzB4RUQwQUVFMDEsIDB4NjRFM0JDOTcsIDB4QkM5QzY0RTMsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweEJDOUZFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQ0E0LAorMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwKKzB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsCisweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLAorMHgwMDExNjU2RSwgMHgwMDExNUVENiwgMHgwMDFFMTAxNSwgMHgwMDExNjU3NCwKKzB4MDAxRTEwMDEsIDB4MDAxMTY1NDgsIDB4MDAxRTExMDAsIDB4MDAxMTY1NzIsCisweDAwMTE2NTYwLCAweDAwMUUxMDAwLCAweDAwMTE2NTY0LCAweDAwMTE2NTcwLAorMHgwMDExNURDQSwgMHgwMDFFMTAwQywgMHgwMDExNjU1QywgMHgwMDExNjU3OCwKKzB4MDAxMTY1N0MsIDB4MDAxMTY1ODAsIDB4MDAxMTY1ODQsIDB4MDAxMTY1ODgsCisweDAwMTE2NThDLCAweDRGMjIyRkU2LCAweEQ2NTA3RkZDLCAweDg4MDE2MDYwLAorMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTRFRDE0RCwgMHhERTRFNjAxMCwKKzB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNEMsIDB4RDI0Qzc1MDIsCisweEU2MDFENzRDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLAorMHg4RkY5MzI3MywgMHhENDQzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwKKzB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NDIsCisweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLAorMHhEMjNFMDAwOSwgMHhFNjAxRDczQiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQzMjc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDUzMywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4OTI0QTcxMDIsIDB4RDIyNjJFMjEsIDB4NUUyM0Q3MkUsIDB4NjRGMjJGRTIsCisweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLAorMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwKKzB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsCisweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LAorMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwKKzB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOUQsCisweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLAorMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYwRiwgMHg3RjA0MjYyMiwKKzB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MDYwQTAwMDksIDB4MDAxMTY1OTAsCisweDAwMUUxMDAwLCAweDAwMTE2NTdDLCAweDAwMTE2Nzc0LCAweDAwMTE2NzgwLAorMHgwMDExNjcxOCwgMHgwMDExNjU2NCwgMHgwMDExNjc0OCwgMHgwMDExNjc0NiwKKzB4MDAxMTY3MUEsIDB4MDAxMTY1NDgsIDB4MDAxMTY1NzQsIDB4NEYyMjJGRTYsCisweDg0RTlERThFLCAweDI0NDg2NDBDLCAweEIxOEI4OTAxLCAweEQyOEMwMDA5LAorMHgyNjY4NjYyMCwgMHg2MEUwODkwMiwgMHgyRTAwQzlCRiwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4NjRGMjIsIDB4NjBFMEQ2ODYsCisweENCQzBENDg2LCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LAorMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjgwNjE2RCwKKzB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsCisweEQyN0M4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLAorMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY3NiwKKzB4ODk0MDIyMjgsIDB4RDU2REUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NzMsCisweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLAorMHgyRjExQTAwNiwgMHhENDZFRDY2NiwgMHhERDZFNjc2MCwgMHg2NTdDNEQwQiwKKzB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2Q0Q0NkIsIDB4MDAwOTQyMEIsCisweDREMjE0RDIxLCAweEEwMDVENzZBLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LAorMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzY2OEJGNywgMHg2RTcyRTAwMywKKzB4ODFFMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ2MjYxNzIsCisweERENjI4MTEzLCAweDY1NzI0RDBCLCAweEQ2NTJEMjYxLCAweDIyMTJFMTAxLAorMHhDOTNGNjA2MCwgMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4RDI1QTRGMjIsIDB4NkI0MzZFNzMsCisweDQyMEI2QzUzLCAweDIwMDg2RDYzLCAweDYxMDM4RjA4LCAweEQyNEZENDU2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHgyMUIwNjBDMywKKzB4NjBEMzgwMTEsIDB4RTUwMDgxMTEsIDB4NjRCQ0EwMDcsIDB4NjA1MzY1NUQsCisweDY2NTMwMEVDLCAweDc1MDEzNjFDLCAweDYyNUQ4MDY0LCAweDhCRjUzMjQzLAorMHg2MDYwRDYzNiwgMHgyNjAwQzlCRiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsIDB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsCisweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLCAweEU1QzRFNjgyLCAweDY3RjM4MTIxLAorMHg2NTVDNjY2QywgMHhFNDA4QkZCQywgMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLCAweDZCMTM2Q0NELCAweERFMzRENzMzLAorMHhFREZGNjRGMywgMHhEODMzRUEwNCwgMHg2MDUzNjU1QywgMHgwMjdENDAwMCwKKzB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsIDB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsCisweDI0MjE3NDAyLCAweDY5ODIwMkVELCAweDM5Mjg2MjJELCAweDc0MDIyODkyLAorMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywgMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwKKzB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsIDB4NjdGM0U1QzUsIDB4QkY3RjY2NkMsCisweDdGM0M2NTVDLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhEMTFDNjhGNiwgMHg2MDEyRDIxQywgMHhDQjIwRTQwNSwKKzB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsIDB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsCisweDAwMTE2NEY2LCAweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3ODAwLAorMHgwMDFFMTBGQywgMHgwMDExNDBDQywgMHgwMDExNjRGQywgMHgwMDExNjAyRSwKKzB4MDAxMTY2RDAsIDB4MDAxMTRGMkMsIDB4MDAxMTY2RUMsIDB4MDAxMTRFQkUsCisweDAwMTE3ODhDLCAweDAwMTE2NEY4LCAweDAwMTE2MERDLCAweDAwMTE0NUJDLAorMHgwMDFFMjEzMCwgMHgwMDExNUZGMCwgMHgwMDExNjZGNCwgMHgwMDExNjUxMCwKKzB4MDAxMTY1MTgsIDB4MDAxMTY3MTAsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsCisweEQ1NjVEMTY0LCAweEU0MDBENzY1LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LAorMHhENTYzMjcyMiwgMHg5NjY5RDc2MywgMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwKKzB4RTYwMTE1NjUsIDB4RDU2MDExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LAorMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwKKzB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1MjIyNTQyLCAweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwKKzB4MDAwOTQyMkIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsCisweDZFNDM4RDAyLCAweDAwMDlCRTc1LCAweEM4MTA2MEUzLCAweEJFNzI4OTAxLAorMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwgMHgwMDA5QkU5NCwgMHhDODAxNjBFMywKKzB4REQzRTg5MzgsIDB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsIDB4NDYwQkQ2M0MsCisweDYwRjAwMDA5LCAweDg5MDJDODA0LCAweDQ2MEJENjNBLCAweDYyRjAwMDA5LAorMHhDODgwNjAyMywgMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwgMHhDODAxNjAyMywKKzB4RDYzNTg5MDYsIDB4MDAwOTQ2MEIsIDB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsCisweDg5MDJDODA4LCAweDQ2MEJENjMxLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLAorMHg0MjBCRDIyRiwgMHhENTJGMDAwOSwgMHg4ODAyNjA1MiwgMHhEMjJFOEIwMywKKzB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyQjhCMDIsIDB4MjI2MEU2MDEsCisweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQ2Mjg4OTJFLCAweDYwRTM2RTYwLAorMHg4OTAyQzg4MCwgMHg0MjBCRDIyNiwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwKKzB4NDIwQkQyMjQsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjIsCisweDYwRTMwMDA5LCAweDg5MEVDODA0LCAweDQxMEJEMTIwLCAweEJGMTIwMDA5LAorMHhCRjREMDAwOSwgMHhENTFFMDAwOSwgMHg2MDUwRDQxRSwgMHhDOTA4RDcxRSwKKzB4QkY4NDI1MDAsIDB4NjBFMzI0NzIsIDB4ODkwNUM4MDgsIDB4N0YwNEQyMUIsCisweDZFRjY0RjI2LCAweDZERjY0MjJCLCAweDRGMjY3RjA0LCAweDAwMEI2RUY2LAorMHgwMDAwNkRGNiwgMHgwMDFDNTgxQywgMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwKKzB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsIDB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsCisweDAwMTE1MEM0LCAweDAwMTE1MEU2LCAweDAwMTE1NzI0LCAweDAwMTE1MEZFLAorMHgwMDExNTEwQywgMHgwMDExNjU3NCwgMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwKKzB4MDAxMTUxNjIsIDB4MDAxMTUxNkUsIDB4MDAxMTUxMTQsIDB4MDAxMTUxMzIsCisweDAwMUUxMDAwLCAweDAwMTBGMTAwLCAweDEyMzQ1Njc4LCAweDAwMTE1MTRBLAorMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywgMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywKKzB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsIDB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsCisweDQyMDg2MTZELCAweDQyMDg0MTE5LCAweDQyMDA2MDE5LCAweDY3MEU2MTRDLAorMHhENDlFMzIxQywgMHg0MjAwMjA3RCwgMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwKKzB4NDIwODYyNUMsIDB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsCisweDAwMEIzMjRDLCAweDJGRTYyMjYwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLAorMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwgMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwKKzB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsCisweEU0MDE0NjA4LCAweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDA3MUEwNDY3LAorMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwKKzB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsCisweDI2Njg2NjIxLCAweEU1MEY4QjczLCAweEU0MDFCRkEyLCAweEJGQTRFNTAxLAorMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwKKzB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsCisweEU0MDE4NUYyLCAweEJGQUI2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLAorMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwKKzB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODIsCisweDQ2MThFNjAyLCAweDgxRjY2MDYzLCAweEJGODBFNDAyLCAweDg1RjZFNTAwLAorMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywKKzB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsIDB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsCisweEU0MEVCRjYzLCAweDA1RkNFMDEwLCAweEJGNjNFNDBFLCAweEU1MDA3NTg1LAorMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwgMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsCisweEU0MEYwRjU0LCAweEU1MDRCRjQ5LCAweDA1RkNFMDE0LCAweEJGNDlFNDBGLAorMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsCisweDAwMEI0RjI2LCAweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLAorMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNjksIDB4RTQwMUJGMUMsIDB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRjFFLCAweEJGMUJFNDAxLCAweEU0MDFFNTA2LAorMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwgMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwKKzB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsCisweEU0MDI4MEY0LCAweEU1MTJCRjAxLCAweEU0MDI4NEY0LCAweEJGMDE3MDkwLAorMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsCisweEJFRTVFNDAzLCAweEU1MTM4MEY4LCAweEU0MEVCRUU3LCAweEU0MEU4NEY4LAorMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywgMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsCisweDYwNTM2NTVDLCAweEJFQ0JFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNELAorMHhFNDBGODRGQywgMHhCRUNENzA4MywgMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFFRTA3RjEwLCAweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LAorMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwKKzB4MDAxRTEwM0UsIDB4MDAxMTY1NkUsIDB4MDAxMTY1NzAsIDB4MDAxMTY1NzIsCisweEQyMUREMTFDLCAweDY2MjA2MDEwLCAweDY3NkM3MDAxLCAweDM3MDBDOTBGLAorMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwgMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwKKzB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsIDB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsCisweDcyMDFENTEzLCAweDQ0MDgyNjIwLCAweDAwMEIzNTRDLCAweEQxMEY2MDUzLAorMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywgMHhENjBERDQwQiwgMHg2NTVDNjU0MCwKKzB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsIDB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsCisweDM2N0M2MDQwLCAweDI0MDBDOTBGLCAweDcyRkY2MjEwLCAweDAwMEIyMTIwLAorMHgwMDAwNjA2MywgMHgwMDExNjRGNSwgMHgwMDExNjRGNCwgMHgwMDExNjRGNiwKKzB4MDAxMTYxMUMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDUzMjA1MzU1LCAweDQ2MjA0OTUwLAorMHgwMDAwM0E1NywgMHgyMDc0NjM0RiwgMHgzMjIwMzIyMCwgMHgyMDM3MzAzMCwKKzB4MzMzQTM4MzEsIDB4MzYzNDNBMzIsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsCisweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLAorMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwKKzB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsIDB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsCisweDAwM0Q3MjY0LCAweDZDNjE3NjIwLCAweDAwMDAwMDNELCAweDAwMDAwQTBELAorMHg1QTIwNTc0NiwgMHg0RDQzNUY0RCwgMHg0QzQ2NUY0NCwgMHg1RjQ4NTM0MSwKKzB4NTM0MTUyNDUsIDB4MDAwQTBENDUsIDB4NUEyMDU3NDYsIDB4NEQ0MzVGNEQsCisweDRDNDY1RjQ0LCAweDVGNDg1MzQxLCAweDUzNEI0ODQzLCAweDBBMEQ0RDU1LAorMHgwMDAwMDAwMCwgMHgyRDQ5NTA1MywgMHg3MjY0NjQ2MSwgMHgwMDAwMDAzRCwKKzB4MkQ0OTUwNTMsIDB4Njc2RTY1NkMsIDB4MDAzRDY4NzQsIDB4MkQ0OTUwNTMsCisweDczNkI2ODYzLCAweDAwM0Q2RDc1LCAweDVBMjA1NzQ2LCAweDRENDM1RjRELAorMHg0QzQ2NUY0NCwgMHg1RjQ4NTM0MSwgMHg0NDQxNDU1MiwgMHgwMDAwMEEwRCwKKzB4NjEyMDIwNzIsIDB4M0Q3MjY0NjQsIDB4MDAwMDAwMDAsIDB4NzIyMDIwMjAsCisweDc1NDI3MDczLCAweDAwMDAzRDY2LCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLAorMHg2RDZENkY2MywgMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MiwKKzB4MDAyMDUyMjAsIDB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsCisweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLAorMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwKKzB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsIDB4NDk2NzdBMjAsCisweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELCAweDY1NEM3MjQ1LAorMHgwMDAwMDA2RSwgMHgyMDc0NkY0RSwgMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywKKzB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLAorMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwKKzB4ODIwNTA3MDAsIDB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsCisweDQwMDIwNDA1LCAweDAyMDkwMDAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLAorMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwKKzB4NDAwMjgyMDUsIDB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsCisweDAwMDA0MDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTUElTaXplPTEwMTU2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc3Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMKQEAgLTAsMCArMSwxMDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDE3LCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHhENDg4NzYwMSwgMHg0RTBCREU4OCwgMHhENDg4MDAwOSwKKzB4MDAwOTRFMEIsIDB4NEUwQkQ0ODcsIDB4N0YwNDAwMDksIDB4QTA1MjRGMjYsCisweDRGMjI2RUY2LCAweDQxMEJEMTg0LCAweEQ0ODQwMDA5LCAweDAwMDk0NDBCLAorMHg0NTBCRDU4MywgMHhENzgzMDAwOSwgMHhEMjgzRTFGRiwgMHgyNzEyNjExRCwKKzB4RDQ4MjUwMjksIDB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsCisweEU3MjAyNDUyLCAweDQ3MThENTdFLCAweDI1NzJEMjdFLCAweEQxN0VFNzAwLAorMHhENjdGRDQ3RSwgMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdEMjYyMCwKKzB4MjY0MUU0RkYsIDB4RDU3Q0U2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsCisweDQwMDA2MjZELCAweDhGRjgzMjEyLCAweEQ1NzgwNTQ1LCAweDI1MjBFMjAxLAorMHhEMjc4RDc3NywgMHhFNDgwRTEwMCwgMHgyMjEyMjcxMCwgMHg2NjEzRDU3NiwKKzB4NjY2RDY0NEMsIDB4NzYwNDY3NjMsIDB4Mzc1QzYyNkQsIDB4OEZGODMyNDMsCisweEQ1NzIyNzEyLCAweEQyNzNENzcyLCAweEU0MDBFMTAxLCAweDI3MTAyNTExLAorMHgwMDBCNEYyNiwgMHg3RkNDMjI0MiwgMHhEMTcwRDU2RiwgMHhEMjcxREI3MCwKKzB4MUY1MUQ0NzEsIDB4RDY3MTc1MDgsIDB4MUYxMkQ3NzEsIDB4MUY1NTcxMEMsCisweDFGQjk3NUZDLCAweDcyMDQxRjJBLCAweDFGMTNFQjEwLCAweDFGNTYxRjQ0LAorMHgxRjc4MUY2NywgMHhEODZCMUYyQiwgMHhERDZDRDk2QiwgMHhEQzZDRUEwMCwKKzB4RDI2RERFNkMsIDB4ODkwMDNBMjIsIDB4RDE1RDdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjg4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE1MCwKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEYsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RjlEMTRCLCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjY2NzkyLCAweDIxNzI1MkY1LCAweEQ2NTU1MTkxLCAweDU1RkEyMjEyLAorMHg1MkZCNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDdERTI2NTIsIDB4QzkwMzYwNzEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ0MkJENzQxLCAweDY3NzJENTQxLCAweDUxNTM2MjQyLAorMHgzMTJDMzI3QywgMHgyNDIyMjIyOCwgMHgxNTEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjE2MjcyMDEsIDB4RDYyMzI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzQsIDB4MDAyMDM5RjQsIDB4MDAyMDE4QTIsCisweDAwMjAzQTAwLCAweDAwMjAzQTE4LCAweDAwMjAxODYwLCAweDAwMjAxOTZDLAorMHgwMDIwMTI4OCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDM0OEMsIDB4MDAyMDM4RkMsIDB4MDAyMDM5MDgsCisweDAwMjAzOTE0LCAweDAwMjAzOTcwLCAweDAwMjAzOTc0LCAweDAwMjAzOTFDLAorMHgwMDIwMzkxRCwgMHgwMDIwMzkyMCwgMHgwMDExNzcwMCwgMHgwMDIwMzk4QywKKzB4MDAyMDM5OEEsIDB4MDAyMDM0RjAsIDB4MDAxMTc3MTAsIDB4MDAxQzNEMzAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMUMzRDAwLAorMHgwMDFDMTAwMCwgMHgwMDFDMTAyOCwgMHgwMDIwMzUwNCwgMHgwMDIwMzkyNCwKKzB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzAsCisweDAwMjAzMzJBLCAweDAwMjAyMzM0LCAweDAwMjAzREE0LCAweDAwMjAzOTcyLAorMHgwMDIwMzRGQywgMHgwMDIwMzk2NCwgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM0OTQsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxOTYwMDA5LCAweDM2MjA2MjEyLCAweEQ0OTU4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE5MywgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3OEYsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyOEM1N0YyLCAweDYyMjI2MDcyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyQywgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweENCMDE1NEY3LCAweEQyN0U1NUYyLCAweEU3MDEyNDAyLCAweEQ0N0ZFMTAwLAorMHgyMjExMjU3MiwgMHg3MjAxNjI0MiwgMHgyNDIyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU0RkZENTc3LCAweDY0NEQ2NzUyLCAweDhCMTAyNzQ4LCAweDYyNzJENzc1LAorMHg4QjBDMzI2MCwgMHg1MUYyNTVGNywgMHhEMjZERTcwMSwgMHgyMTcyMjU2MiwKKzB4RDU3MUUxMDAsIDB4NjQ1MjIyMTEsIDB4QTA3Nzc0MDEsIDB4NTJGMzI1NDIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhEMjZBOEI2QywgMHg2NzIyNTRGNCwgMHg3NzAxRDU2OSwgMHg2MTQyMjI3MiwKKzB4MUYxQ0U2NDAsIDB4NDYxODIxNTksIDB4OEIwMzMxNjAsIDB4NjI2MkQ2NjUsCisweDI2MjI3MjAxLCAweEUyMDBENjVBLCAweDI2MjFCMDY3LCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDI1QjhCMTYsIDB4NjcyMjU0RjQsCisweDc3MDFENTU3LCAweDYxNDIyMjcyLCAweDFGMUNFNjQwLCAweDQ2MTgyMTU5LAorMHg4QjAzMzE2MCwgMHg2MjYyRDY1NSwgMHgyNjIyNzIwMSwgMHhFMjAwRDY0OCwKKzB4MjYyMUIwNDMsIDB4MDAwOUEwMTAsIDB4RDQ1MkQ1NTEsIDB4RDI0NDY3NTIsCisweEUxMDA3NzAxLCAweDI1NzIzQTQ2LCAweDIyMTE4RjA2LCAweEVBMDBENjRFLAorMHg3MjAxNjI2MiwgMHgyNjIyQjAzMSwgMHgyRkIyRDU0QywgMHg5NTczNjY1MiwKKzB4RDQ0QTVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MkYsIDB4RDEyRjI2MjEsIDB4MjEyMUUyMDAsIDB4RDEzQ0UyMDEsCisweDY2MTIyODIyLCAweDhCMDEyNjY4LCAweDAwMDlBRTJCLCAweDQ1MEJENTM5LAorMHhEMTM5MDAwOSwgMHhBRTI0RTYwMCwgMHgyRjg2MjE2MCwgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsIDB4REUzNEQxMzMsCisweDU0MTE2MjEyLCAweDFGNDE2N0UyLCAweDJGMjJENDMyLCAweEQ1MzIxRjcyLAorMHhEMjMyNjc0MywgMHg1ODQxNzc5NCwgMHg2OTQyNUE0MiwgMHg1QjE2NkM3MiwKKzB4NjA1MjZEMjIsIDB4Q0IyMEU2MDAsIDB4RTU0MDI1MDIsIDB4NjI2RDc2MDEsCisweDhCRkIzMjUzLCAweDU1RjE2MkYyLCAweDExNTEyMTIyLCAweEQ2Mjg1NUYyLAorMHgxNDgxMkU1MiwgMHgyNDkyMTRBMiwgMHgyN0MyRDQyNiwgMHgyNkQyMTFCNiwKKzB4REEyNTY3NDIsIDB4RTgwMUQ5MjUsIDB4NDkwQjJBNzIsIDB4RTIwMTFBOEMsCisweDFBMkM0MjE4LCAweDRGMjY3RjBDLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHgwMDAwMDdEMSwgMHgwMDIwMzk4NCwKKzB4MDAyMDM5ODgsIDB4MDAyMDM5OEUsIDB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsCisweDAwMUMzQjg4LCAweDAwMjAzOTZDLCAweDAwMTE3NzNDLCAweDAwMTE3NzQ0LAorMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwgMHgwMDExNzc0OCwgMHgwMDExNzc2OCwKKzB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsIDB4MDAxMTc3NEMsIDB4MDAyMDM0RkMsCisweDAwMjAzREE0LCAweDAwMjAyNEY4LCAweDAwMjAzOTcyLCAweDAwMUMzQjlDLAorMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwgMHgwMDFDNTk2MCwKKzB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MEMsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERTk1N0ZBQywgMHg2MUUwRTAxNCwgMHgwRjE0RDQ5NCwgMHg3MTAxNjFFMywKKzB4RTAxODYyMTAsIDB4RDI5MjBGMjQsIDB4MDAwOTQyMEIsIDB4NDUwQkQ1OTEsCisweDIwMDgwMDA5LCAweDhGMTI2RDAzLCAweEQyOEYxRjA3LCAweDY3MjBENDhGLAorMHg2NTdDREQ4RiwgMHg0NzBCRDc4RiwgMHhEMThGMDAwOSwgMHg2MTlDNjkxMCwKKzB4NDYwODY2MTMsIDB4MzYxODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxODFGRDcsCisweEU1ODAwNEZDLCAweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE1LAorMHgwMUZDRTAxNCwgMHhERTg1RTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwKKzB4NjA3MDM3RUMsIDB4MzlEQzY5NTMsIDB4ODA5NDc1MDEsIDB4MzI0MzYyNUQsCisweEQ2N0Y4QkY0LCAweEEzNEVFMjAwLCAweDIwMDgyNjIxLCAweEUwMTQ4QjEzLAorMHhFNDAwMDFGQywgMHhBMDA5REU3OSwgMHg2NDRENjcxQywgMHgzNUVDNjU0MywKKzB4Njk0MzY2NTIsIDB4MzlEQzYyNjIsIDB4NzQwNDE5MjEsIDB4MzI3MzYyNEQsCisweEEzMzg4QkYzLCAweDg4MDEyRDEwLCAweEUwMTQ4QjE3LCAweEU3MDAwMUZDLAorMHg2RDFDMkQ3MCwgMHhERTZEMUZENCwgMHgzMkQzNjI3RCwgMHhBMzJBOEIwMSwKKzB4Njc3RDAwMDksIDB4NjY3MzY1RTMsIDB4NjE3Mzc1MDQsIDB4MzE1QzM2RUMsCisweDY5MTI2NDYyLCAweEFGRUY3NzA4LCAweDg4MDQyNDkyLCAweEUwMTQ4QjE4LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2MCwgMHg4QjAxMzI3MywKKzB4MDAwOUEzMTEsIDB4Njk0MzY0NEQsIDB4MzlFQzYyRTMsIDB4NzIwNDY1OTIsCisweDNEMkM2RDQzLCAweDYxNTI2NkQyLCAweDIxNjk3NDA4LCAweDI1MTJBRkVELAorMHg4QjE4ODgwNSwgMHgwMUZDRTAxNCwgMHgyRDQwRTQwMCwgMHhERTUzNjcxQywKKzB4MzI3MzYyNEQsIDB4QTJGNjhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzY5NDMsCisweDY1OTIzOUVDLCAweDZENDM3MjA0LCAweDY2RDIzRDJDLCAweDc0MDg2MTUyLAorMHhBRkVEMjE2QiwgMHg4ODMxMjUxMiwgMHhENDRBOEIzQSwgMHg2MTQ2RDk0QSwKKzB4NzUwNDY1NDMsIDB4Njc1NjY0NDIsIDB4NkU1MzFGNDgsIDB4NjU1MjdFMDQsCisweDdFRTQ2MkUyLCAweDdFMDQ2NEUyLCAweDZFRTIxRkU5LCAweDVFRjkyOUUwLAorMHg3RTA0RDk0MiwgMHgxRkVBNjBFMiwgMHgyOTAwQzkwMSwgMHhEOTQwNkVFMiwKKzB4MjlFMDRFMDksIDB4MkY1NjJGMjYsIDB4NTZGQUQ5M0UsIDB4NjUxMzQ5MEIsCisweEQxM0Q3RjA4LCAweEU3MUM2RTBELCAweDFERTEyRDcwLCAweERFM0I2OTEyLAorMHg2NEUyMUQ5MiwgMHgxRDQzRDEzQSwgMHhEMjNBNjUxMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyMzksIDB4MUQ2NjY2MjIsIDB4NjI2MkQ2MzgsIDB4MUQyN0EyQUIsCisweDhCMzk4ODMwLCAweDY1OTZEOTJCLCAweDY3OTI2Njk2LCAweDYxOTY3OTA0LAorMHg3NEU0NjQ5MywgMHg2RTQzNjk5MiwgMHgxRjlCN0UwNCwgMHgxRkVDNjQ0MiwKKzB4RDkyNTZFRTIsIDB4NUVGQzI5RTAsIDB4N0UwNEQ5MjQsIDB4MUZFRDYwRTIsCisweDI5MDBDOTAxLCAweEQ5MjI2RUUyLCAweDI5RTA0RTA5LCAweDU5RkM3RkZDLAorMHhERTI3MkY5MiwgMHgyRjE2NEUwQiwgMHhENDFGN0YwOCwgMHhFMjFDNjEwRCwKKzB4MUQxMTJEMjAsIDB4RDIyMDY0NDIsIDB4RDQxQzFENDIsIDB4MUQ1MzY1NDIsCisweDY3NTJENTFCLCAweEQ3MUIxRDc0LCAweDFEMTU2MTcyLCAweDFENjY2NjIyLAorMHg2MjYyRDYxQSwgMHgxRDI3QTI2RiwgMHg4QjM1ODgzMywgMHg0OTBCRDkxOSwKKzB4QTI2OEVFMDAsIDB4MDAwMDJERTAsIDB4MDAxMTc4MDAsIDB4MDAyMDNBMUMsCisweDAwMjAxOEEyLCAweDAwMjAyQUFDLCAweDAwMjAzOTBFLCAweDAwMjAzQTIwLAorMHgwMDIwMzUzNCwgMHgwMDIwMThFRSwgMHgwMDIwMzkwRCwgMHgwMDExNzgwNCwKKzB4MDAyMDM5OEMsIDB4MDAxMTc4MTAsIDB4MDAyMDM5MDksIDB4MDAyMDM5MEEsCisweDAwMjAzOTBCLCAweDAwMjAwRjY0LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQkMsIDB4MDAyMDBGQjgsIDB4ODkwMTg4MjgsIDB4MDAwOUEwQzAsCisweEU2NDNERUI1LCAweDMyNjY2MkUxLCAweDFGRUU4RjAyLCAweDJFMjFFMjQwLAorMHg2MjJENjJFMSwgMHg4QjAxMzI2NywgMHgwMDA5QTBBQSwgMHhFNTAxODVFMSwKKzB4OEIwMTMwNTYsIDB4MDAwOUEwQTQsIDB4MkQxMEUxMDEsIDB4NjRFMUIyMjUsCisweEU2NDM1N0ZFLCAweDY1MkQ2MjcxLCAweDg5NDQzNTY3LCAweDM1NjNFNjQwLAorMHhFNjAwOEIwNSwgMHgwRjY1RTA0MCwgMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsCisweEM5MDM2MDUzLCAweEUwNDA2NjAzLCAweDcxMTgwRjY1LCAweDIyMDlFMDA3LAorMHgwRjI1RTAzQywgMHhFMDQ0NjQxRCwgMHhCMkEzNjVGMywgMHhFMzNDMEY0NiwKKzB4ODUzMjMzRkMsIDB4NjIwRERFOTUsIDB4NDIwODYwMzEsIDB4NjAyMzYxMEQsCisweDEzMjNFOTQ0LCAweDA2RkU0MTA4LCAweEUwMEYzOUZDLCAweDEzMTQ0RTBCLAorMHg2NzA3NUQ5MSwgMHg2MEQzMjY3OSwgMHgwRjY2NTRGRSwgMHg1MTkyODU0MiwKKzB4NjAwRDRFMEIsIDB4NjBEMzI2MEIsIDB4MEY2NjY0OTIsIDB4NjVGM0IyMzcsCisweDY5NjE1NkZFLCAweEU2NDA2NTlELCAweDg5MzgzNTYzLCAweEQ3ODM1OUZFLAorMHg3OTA2NjU5MSwgMHhDOTAzNjA1MywgMHg0MDAwNDAwOCwgMHg2MTAzNjIwMywKKzB4MEYyNkUwNTAsIDB4NDcwQkUwRkYsIDB4NkMwNzYwMEMsIDB4NjYwMzYwNUQsCisweDQ2MjE0NjIxLCAweDQ2MjE0NjIxLCAweDQyMDA2MjYzLCAweDQyMDAzMjZDLAorMHg0MDIxNDAyMSwgMHg0MDA4QzkwMywgMHg2RDJEMzBGQywgMHhFODAwNkEwMywKKzB4QjI1NzY1RjMsIDB4NkVBMjY0RDMsIDB4MkVDOUUwNTAsIDB4NjY5NDJBRTIsCisweEQ3NkUwMUZFLCAweDYwNkM0NzBCLCAweDJBRTIyRTBCLCAweDY0RDM2NUYzLAorMHg3ODAxQjFGRCwgMHhFRTA2NjI4RCwgMHg4RkU5MzJFMywgMHg1RUZFN0QwMSwKKzB4NjFFMUU0MDAsIDB4NDEwMDg1RTEsIDB4NjZFMzMxMEMsIDB4NzYwQzcxMUIsCisweEU3MDQ2NUYzLCAweDY4NjY3NDAxLCAweDNBNzM2QTRELCAweDhGRjkyNTgyLAorMHg2NUYzNzUwNCwgMHg2NDFEQjFFMywgMHg2NEUxQjFBNCwgMHgwMDA5QTE3QiwKKzB4RDQ1QjU2RjcsIDB4RUMwMUQyNUIsIDB4MjZDMDQyMEIsIDB4MDAwOUExNzMsCisweDA2RkNFMDE4LCAweDg4Mjk2MDZDLCAweDU4Rjc4QjA4LCAweEU0MDBEMjUyLAorMHg2NjIyMjg0MCwgMHg2NDZEQjE3MSwgMHgwMDA5QTE2NSwgMHg2NjZDRTY4MSwKKzB4ODkwMTMwNjAsIDB4MDAwOUEwQUMsIDB4RDU1MEQxNEYsIDB4NjIxMjZBNTYsCisweDIxMjIzMkFDLCAweDU0MTE2QzU2LCAweDM0Q0M2MjUzLCAweDY0NTIxMTQxLAorMHg3MjA4NTgxMiwgMHhENDRBMzg0QywgMHg2ODIyMTE4MiwgMHg1QTEzNkM0MiwKKzB4M0FDQzNDOEMsIDB4MTFBMzI0QzIsIDB4NkMyMjcyRUMsIDB4NzIxMDU4MTQsCisweDExODQzOENDLCAweDVBMTU2ODIyLCAweDExQTUzQThDLCAweDZBMjI3MjEwLAorMHhENjQwNTgxNiwgMHgxMTg2MzhBQywgMHg1MjE3NkM2MiwgMHgxMTI3MzJDQywKKzB4NUExODU4NjEsIDB4MTFBODNBOEMsIDB4NUMxOTVBNjIsIDB4MTFDOTNDQUMsCisweDUyMUE1QzYzLCAweDExMkEzMkNDLCAweDVBMUI1ODY0LCAweDExQUIzQThDLAorMHg1QzFDNUE2NSwgMHgxMUNDM0NBQywgMHg1MjFENUM2NiwgMHgxMTJEMzJDQywKKzB4NUExRTU4NjcsIDB4MTFBRTNBOEMsIDB4NTYxRjVBNjgsIDB4MzZBQ0U4NDAsCisweDExNkZEQTJELCAweDZDQTIzODFDLCAweDdBOTQ2NjgyLCAweDI4NjIzNkNDLAorMHg1QzgxNjJBMiwgMHgxOEMxM0MyQywgMHg2MkEyN0E0NCwgMHgzNjJDNTY4MiwKKzB4RDYyNjE4NjIsIDB4NUE4NTYyNjIsIDB4M0EyQzQyMjksIDB4NzYwNDE4QTUsCisweDU2ODY2MjYyLCAweDM2MkM0MjI5LCAweDU2RjcxODY2LCAweDI2MjBFMjM4LAorMHgxNkMxNUM4MSwgMHgxNjIyNjIxMiwgMHhFMjAwNUMxMSwgMHg1NTEyMTZDMywKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4NTU4MjE2NTcsCisweDY1ODIxNjU4LCAweDU1MTQxNjU5LCAweDU1ODQxNjVBLCAweDU1ODMxNjVCLAorMHg1NTg1MTY1QywgMHg1NTg2MTY1RCwgMHgxODIxMTY1RSwgMHgxMTIxMjEyMiwKKzB4MTEyNTExMjIsIDB4MTEyNjExMjMsIDB4MjgyMjE4MjIsIDB4MTgyNDExMjQsCisweDE4MjUxODIzLCAweDE4MjZBMEM3LCAweDAwMTE3ODA0LCAweDAwMjAzM0U4LAorMHgwMDIwM0E0MCwgMHgwMDIwMThBMiwgMHgwMDIwMzQ5NCwgMHgwMDFDMzZBMCwKKzB4MDAyMDM0RjAsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDY2NkNFNjgyLCAweDhCMjAzMDYwLCAweEVBMjQ1NkY3LCAweDI2QTBEMTk0LAorMHgxNkMxNUMxNywgMHgxNjIyNTIxOCwgMHgxNjgzNTgxOSwgMHgxNkE0NUExQSwKKzB4MTZDNTVDMUIsIDB4MTYyNjUyMUMsIDB4RTIwMDU4MUQsIDB4NTUxRTE2ODcsCisweDU1MUYxNjU4LCAweDExMjcxNjU5LCAweDExMjkxMTI4LCAweDExMkIxMTJBLAorMHgxMTJEMTEyQywgMHhBMDhFMTEyRSwgMHhFNjgzMTEyRiwgMHgzMDYwNjY2QywKKzB4NTJGNzhCMEIsIDB4RUEwMEQ4ODMsIDB4NjU4MjIyQTAsIDB4NzgwNERDODIsCisweDYyODIyQzUyLCAweEEwN0VENjgxLCAweEU2OTAyNjIwLCAweDMwNjA2NjZDLAorMHhEQTdGOEIwNiwgMHgwMDA5NEEwQiwgMHhFMjAwNTZGNywgMHgyNjIwQTA3MywKKzB4NjY2Q0U2OTEsIDB4OEIxMDMwNjAsIDB4NjIyMkQyNzYsIDB4MjIyODYyMkMsCisweEQyNzg4OTA0LCAweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMjc2LAorMHg1NkY3MDAwOSwgMHhBMDVFRTIwMCwgMHhFNjkyMjYyMCwgMHgzMDYwNjY2QywKKzB4RTAxODg5NTEsIDB4RTZCMDBCRkMsIDB4NjY2QzYyQkMsIDB4OEIyQTMyNjAsCisweDAyRkNFMDE0LCAweDY4MkNFQTAwLCAweDYyQURFOTA0LCAweDg5NEEzMjgzLAorMHg2QUFEREQ2NCwgMHgzQ0RDNkNBMywgMHg3RDA0NkVDMiwgMHhEQjY4RDQ2NywKKzB4MzJEQzYyQTMsIDB4NEIwQkRDNjcsIDB4NEMwQjZEMjIsIDB4RDQ2NjY0RTMsCisweDAwMDk0QjBCLCAweDY0RDM0QzBCLCAweDRCMEJENDY0LCAweEU2MDAwMDA5LAorMHg2NjZENkJFMywgMHg3NjAxM0I2QywgMHgzMjkzNjI2RCwgMHg4RkY3MkJEMCwKKzB4QUZEQTREMTksIDB4RTZCNTdBMDgsIDB4MzI2MDY2NkMsIDB4RDQ1QzhCMTMsCisweDRCMEJEQjU3LCAweEQyNUIwMDA5LCAweDYwMjJEQjVCLCAweENCMjBFNkZGLAorMHgyMjAyNjY2RCwgMHhEQjU5MkI2MiwgMHhFMDE0RTIwMCwgMHg1NkY3MkIyMCwKKzB4QTAxMDAyRkMsIDB4RDQ1NjI2MjAsIDB4NjU0MkQyNTYsIDB4NDIwQkQ0NTYsCisweEEwMDgwMDA5LCAweERCNTIwMDA5LCAweDUyQjFFNjAwLCAweDYyMkNEQjUzLAorMHg1MkY3MkIyMSwgMHg3RjU0MjI2MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzQ5LCAweEQ0NDk2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0NDQsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzNCMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIzQSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMzYsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUzMSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyRDQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTI2NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjAsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MDAyMDM0OTQsIDB4MDAxMTc4MDQsIDB4MDAyMDM4RjQsIDB4MDAyMDM5MDgsCisweDAwMjAwNTBBLCAweDAwMjAxMDA4LCAweDAwMjAxMDJFLCAweDAwMjAzQTU4LAorMHgwMDIwMThBMiwgMHgwMDIwMThFNiwgMHgwMDIwM0E2QywgMHgwMDIwM0E3NCwKKzB4MDAyMDNBNzgsIDB4MDAxQzM1MDAsIDB4MDAxQzEwMDAsIDB4MDAyMDM5OEEsCisweDAwMTE3ODAwLCAweDAwMjAxOEVFLCAweDAwMjAzQThDLCAweDAwMjAzOTkwLAorMHgwMDFDMzcwNCwgMHgwMDIwMzNFOCwgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMTAsCisweDZFNDNCRkE0LCAweDJERTJCRjg5LCAweDAwMDlCRkEwLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDAwMDAwMDA5LAorMHgwMDFDMzcwQywgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwgMHhERDk0NEYyMiwKKzB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsIDB4NjJEMjY1RDIsCisweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLCAweDU1RDE0MjBCLAorMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwgMHg0MjBCRDI4QSwKKzB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4NkQ0ODksCisweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LCAweEQ0ODYwMDA5LAorMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsCisweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLCAweEIwNzU2NkMzLAorMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLCAweEQ2NzAwNTI5LAorMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsIDB4NjREMzU3RjQsCisweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHhFNTAzRDE2MiwKKzB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsIDB4RDQ1RkQxNUUsCisweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLCAweEJGNzNFNDBBLAorMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwgMHhCRjY5MjIxMiwKKzB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsIDB4NEYyMjI3MDIsCisweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLCAweEQxNTUyRkU2LAorMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwKKzB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsIDB4RDE0RTQ3MDgsCisweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLCAweDRGMjIyRkU2LAorMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwgMHhFNTAwNzc2QywKKzB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzIyMjcxMiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzQ2RUY2LAorMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwgMHhFNjA1RDQzMiwKKzB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksIDB4RTQwQUU2MDEsCisweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywgMHhDOTAzNjBCMiwKKzB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsIDB4QjA3Q0M5MDMsCisweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLCAweEQ0MjEyRkUxLAorMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwgMHg4OUZGQzgwMSwKKzB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMUMzQjg4LCAweDAwMjAzQUEwLCAweDAwMjAxOEVFLCAweDAwMjAzQUE4LAorMHgwMDIwM0FCMCwgMHgwMDIwM0FCOCwgMHgwMDIwM0FDMCwgMHgwMDI1RTcyMCwKKzB4MDAyMDNEQTAsIDB4MDAyMDM4RjgsIDB4MDAxQzU5NjgsIDB4MDAxQzNCNDAsCisweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxNUUwLAorMHgwMDIwMTYwQywgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAxQzU4MUMsCisweDAwMUM1ODYwLCAweDAwMjAzQUM4LCAweDAwMjAxOEEyLCAweDhGMDE0NDExLAorMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsCisweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LCAweDAwMDlCRkVDLAorMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwKKzB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywgMHhCRkNCREQxMywKKzB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksIDB4MzZFMjQ2MDEsCisweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwgMHhCRkI5MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsIDB4NjQ1M0U3MTAsCisweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELCAweDMxNUM0MTA4LAorMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwgMHhFRDAwNjBCMywKKzB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsIDB4MTFENDExRDMsCisweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLCAweDU4RjEyODcyLAorMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywgMHg1NEY2NUVGNSwKKzB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLCAweDUyRjlEREE3LAorMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwgMHgyRDcyOUFENSwKKzB4NkVFRDI2MjIsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsIDB4NEQwODQxMDgsCisweDNEOUMzMUVDLCAweDQxMDg2MEIzLCAweDgxRDEyREIxLCAweDQxMDhFMDUwLAorMHg0MDA4RTdCNywgMHg2NzdDNDEwOCwgMHg2MEIzODFEMiwgMHhFMjAwMzE4QywKKzB4ODFEMzM0NzIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTMsIDB4RDQ5MDFEMjQsCisweEIwQjM2NUQzLCAweDY0RUQ3RTAxLCAweDhCREEzNEEyLCAweDJGRDJEQThDLAorMHhERDkyNjhBMiwgMHgyRDgyNDgyOSwgMHg3REZDNjRBMiwgMHhEMjg3Njk0RCwKKzB4NkUyMjJEOTIsIDB4N0QwQzRFMjksIDB4NjgyMjJERTIsIDB4NjE4RDZBRDMsCisweDJBMTZENzg0LCAweEQ0OEE2RDcyLCAweDI0RDJENTgzLCAweEQ2ODk1RTcyLAorMHg1MTc0MTRFMiwgMHgxNDE0RUUwMCwgMHhEMTg3NTg3NiwgMHg1OTc4MTQ4NiwKKzB4MTQ5OEU3MTAsIDB4NjVFMzYyNTIsIDB4MjZFMjE0MkEsIDB4RTYwMDY0RTMsCisweDY4NDM2NDRELCAweDM4NEM0ODA4LCAweDM4MUM0ODA4LCAweDBDODY2MDUzLAorMHgwOUNFMjhCMSwgMHg4MTkxNjBCMywgMHgwQUNFNjA1MywgMHg4MUEyNjA0MywKKzB4MERDRTYwNTMsIDB4ODFEMzYwQjMsIDB4MDhDRTYwNTMsIDB4MTg4Mjc0MDEsCisweDYyNEQwOUNFLCAweDBBQ0UxOUUzLCAweDFBNjQzMjczLCAweDc1MDQ4RkUwLAorMHhFMDAzRDk2QSwgMHg0MDE4NkM5MiwgMHg2RDkyMkNCMSwgMHg4MUQxREE2RiwKKzB4NkU5MkUwNTAsIDB4ODFFMjQwMDgsIDB4NjBCMzYxOTIsIDB4NjQ5MjgxMTMsCisweDE0NDJFNjAwLCAweEQ0Njk2NzkyLCAweDY4OTIxN0EzLCAweDE4NjRFMUZGLAorMHg2NTYzRTcwMywgMHgzNjRDNDYwOCwgMHgyNjEyNzUwMSwgMHgzNjczNjY1RCwKKzB4REM1QjhCRjgsIDB4NkRDMkUwMDMsIDB4MkRCMTQwMTgsIDB4RDI2MDZFQzIsCisweDYxQzI4MUUxLCAweDExMTJFRTAwLCAweEUwMjQ2NEMyLCAweDY1QzIxNDIzLAorMHgxNUU0RDQ1QiwgMHhFNTgwNjdDMiwgMHg2OEMyODE3MiwgMHg4MTgzNjZFMywKKzB4NjY2RDY1NUMsIDB4NzYwNDY5NjMsIDB4Mzk0QzZBNkQsIDB4OEZGODNBNTMsCisweERCNTQyOUUyLCAweDI0QjJEQzU0LCAweDI0QzI3NDA0LCAweDRGMjY3RjY4LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4NjAxMTYxNDIsIDB4OEYwM0M4MDMsIDB4RDIzREU1MDAsIDB4OEIwNjM0MjAsCisweEM5MDM2MDExLCAweDhCMDY4ODAyLCAweDM0MjBEMjM5LCAweDU2MTI4QjAzLAorMHg1MjY0NjUxMywgMHgwMDBCMjQyMiwgMHgwMTEzNjA1MywgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsCisweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLAorMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwgMHhFNjE0NjRGMywKKzB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsCisweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLAorMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsCisweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LAorMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwKKzB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsCisweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LCAweDQxMEJFNjE0LAorMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwKKzB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5MjQsIDB4MDAyMDM0RjQsCisweDAwMjAzNEZDLCAweDAwMjAzNTA0LCAweDAwMjAzNTJDLCAweDAwMjAzOTEwLAorMHgwMDIwMzkxOCwgMHgwMDEwMDIwOCwgMHgwMDEwMTdDMCwgMHgwMDFFMjEwQywKKzB4MDAxQzNEMDAsIDB4MDAyMDM5NjQsIDB4MDAxMDAwQzgsIDB4MDAxMTc4ODAsCisweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMjAwRUQ2LAorMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwgMHgzRTJDQTAwNSwKKzB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsIDB4MzUyMDUyRTEsCisweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwgMHgzNjIwNjZDMiwKKzB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsIDB4QkYzN0REMzUsCisweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELCAweEQ0MzI4OTA3LAorMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwgMHhCRjNEMDAwOSwKKzB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsIDB4MjI2MkQyMkQsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwgMHgwNERFNDAwOCwKKzB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsIDB4NTVFMjI3RTIsCisweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLCAweDEyMjIwMkRFLAorMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwgMHhDOTBGNjA1MywKKzB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4ODU0MzZDRjYsCisweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LCAweEUxMDA4RjBDLAorMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwgMHhENjEzMTYyMSwKKzB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsIDB4MDAwMDAxRkYsCisweDAwMjAzNTA0LCAweDAwMjAzNEZDLCAweDAwMUMzRDAwLCAweDAwMjAzNTJDLAorMHgwMDIwMzhGNCwgMHgwMDIwMThBMiwgMHgwMDIwMzRGNCwgMHgwMDIwM0FGMCwKKzB4MDAyMDNBRjQsIDB4MDAxQzNEMjgsIDB4MDAyMDM5NjQsIDB4MDAyMDM5MjQsCisweDAwMjAwRUQ2LCAweDAwMjAzOTY4LCAweDAwMjAzOTZDLCAweDAwMTE3NzU0LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY4NEYyMiwgMHg2MDIyRDIzNywKKzB4OEQ1OEM4MDMsIDB4REUzNjJGMDEsIDB4REIzN0RDMzYsIDB4NjZDMjUyQzEsCisweDg5MkYzNjIwLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMzNERDMxLAorMHg2NEQzNDIwQiwgMHgxRjAxNjUwMywgMHg4ODAxNjBCMSwgMHhEMjMwOEIwNCwKKzB4NjREMzQyMEIsIDB4MDAwOUFGRUEsIDB4ODU2MTU2NTMsIDB4ODkwNEM4MjAsCisweEUwNTBENzJDLCAweDcyMDEwMjdFLCAweEQyMkIwNzI2LCAweDY0NTM0MjBCLAorMHg4OTA3MjAwOCwgMHg1NUYxRDEyNiwgMHg2NEQzNDEwQiwgMHhFNjAxRDcyNywKKzB4Mjc2MkFGRDQsIDB4NTVGMUQyMjYsIDB4NjRFMzQyMEIsIDB4RTYwMUQxMjUsCisweDIxNjJBRkNDLCAweEREMjVERTI0LCAweERDMjZEQjI1LCAweDY2RDI1MkQxLAorMHg4OTE4MzYyMCwgMHhDOTAzNjA2MSwgMHg4OTE0ODgwMSwgMHhEMTE3RDQxRiwKKzB4MDAwOTQxMEIsIDB4MzZFMDU2MDMsIDB4NjUwMzhGMDQsIDB4MkIyMEUyMDEsCisweDJDNTJBRkVDLCAweEQ3MTJENDFDLCAweDAwMDk0NzBCLCAweEU2MDFEMTE1LAorMHhBRkUzNDYxOCwgMHg2MEYxMjE2MiwgMHg4OTA3QzgwNCwgMHg3RjA4RDIxNywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NEYyNjdGMDgsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDIwMzk4QywgMHgwMDIwMTRBMCwKKzB4MDAyMDE0Q0MsIDB4MDAyMDM0OTQsIDB4MDAyMDE2QkUsIDB4MDAxRTIxMkMsCisweDAwMjAxNTMwLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNEY0LAorMHgwMDIwMzkxNCwgMHgwMDIwMzkxMCwgMHgwMDIwMzUyQywgMHgwMDIwMDYxMCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwKKzB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLAorMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywKKzB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksCisweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLAorMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwKKzB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsCisweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LAorMHg2RUY2MDAwQiwgMHgwMDIwM0FGOCwgMHhFNEZERDI5RiwgMHhENzlGNjEyMiwKKzB4MjIxMjIxNDksIDB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5QzY2MjIsCisweDIyNjIyNjQ5LCAweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LAorMHhFMUY3NjQ1MiwgMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQ0I0MCwKKzB4RTYwMjYwNTIsIDB4MjUwMkM5Q0YsIDB4NDcxODYwNTIsIDB4MjUwMkNCMTAsCisweENCMDM2MDUyLCAweDE1NjIyNTAyLCAweDE1NzMwMDBCLCAweEQ3OEVENThELAorMHhENDhGRDI4RSwgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwgMHhBRkNCMjIxMCwKKzB4NjY0QzI0NjEsIDB4NDYwMEQyOEIsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsCisweDY1NEMyNjAwLCAweDQ1MDBEMjg3LCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLAorMHgyNTYwMDAwQiwgMHhEMjg0NjY0QywgMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwKKzB4MjYwMDAwMEIsIDB4RDI4MDY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsCisweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjdBLCAweDYwNjAzNjJDLAorMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NiwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MzY2NEMsIDB4MzYyQzQ2MDAsCisweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkY2NTRDLCAweDM1MkM0NTAwLAorMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwgMHg0MjAwRDY2OSwKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQ2NjU2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHhEMTYxNjAwQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwKKzB4RDE1RjYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsCisweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LCAweDAwMDlCRkVCLAorMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwKKzB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsCisweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLAorMHhENjRDNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjU3OEIwMywgMHhBMDAzMDAwOSwKKzB4RDI0OTAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDgsIDB4MDAwQjRGMjYsCisweDRGMjIyNjIyLCAweDYwNjJENjQzLCAweDhCMDE4ODAyLCAweDAwMDlCMkEwLAorMHhFMjAwRDY0MiwgMHgwMDBCNEYyNiwgMHhENTNFMjYyMiwgMHhFMTAwRDQzRSwKKzB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyM0IsIDB4MjI2MDAwMEIsCisweEQ0M0I0RjIyLCAweDQxMEJEMTNCLCAweEQ1M0IwMDA5LCAweDY2NTBFMUZELAorMHgyNjE5RDIzQSwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwgMHg0RjIyMjI3MCwKKzB4RDIzOEQ1MzcsIDB4RDczODYxNTIsIDB4MjUxMjYxMUQsIDB4RTZGRjY0NTIsCisweDI1NDIyNDJCLCAweEQyMkZENDM1LCAweDQyMEI2NjZELCAweEQ1MkUyNzYyLAorMHg2NzUwRTFGQiwgMHg0RjI2MjcxOSwgMHgyNTcwMDAwQiwgMHhENDMwNEYyMiwKKzB4NDEwQkQxMjgsIDB4RDUyODAwMDksIDB4NjY1MEU3RjcsIDB4NEYyNjI2NzksCisweDI1NjAwMDBCLCAweDk0MjVENTI0LCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLAorMHhFNEJGRDUyMSwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI1NEYyMiwKKzB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsIDB4ODk0NTg4MDEsIDB4ODk0Nzg4MDMsCisweDg5NDk4ODA1LCAweDg5NEY4ODA2LCAweDg5NTU4ODA4LCAweDg5NUI4ODA5LAorMHg4OTYxODgwQSwgMHg4OTY3ODgwQiwgMHgwMDA5QTA2RSwgMHgwMDA5QjA3MCwKKzB4NjAwQ0EwNkIsIDB4MDAwMEZGN0YsIDB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsCisweDAwMUUxMTA4LCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweDAwMjAzOUU1LAorMHgwMDIwMzlBOCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwOTAsIDB4MDAyMDM5Q0MsIDB4MDAxRTEwMEIsIDB4MDAyMDM5QzgsCisweDAwMjAzQUZDLCAweDAwMjAxOEEyLCAweDAwMUUxMDI4LCAweDAwMjAzOUU0LAorMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwgMHgwMDFDMTAwMCwgMHgwMDIwM0IwOCwKKzB4MDAyMDNCMTgsIDB4MDAyMDM5OUMsIDB4MDAwOUIwNEMsIDB4NjAwQ0EwMzUsCisweDAwMDlCMDU1LCAweDYwMENBMDMxLCAweDYyNjBENjg0LCAweDhCMkIyMjI4LAorMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwKKzB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsCisweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LAorMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwKKzB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsCisweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLAorMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwKKzB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsCisweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LAorMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwKKzB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsCisweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLAorMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwKKzB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsCisweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELAorMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwKKzB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsCisweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLAorMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwKKzB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsCisweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLAorMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwKKzB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsCisweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELAorMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwKKzB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsCisweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LAorMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywKKzB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsCisweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELAorMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwKKzB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsCisweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMjAzOUU1LAorMHgwMDIwMzk5QywgMHgwMDIwMzlBOCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDM5RDAsCisweDAwMjAzOUIwLCAweDAwMjAzOUI0LCAweDAwMjAzOUI4LCAweDAwMjAzOUQ0LAorMHgwMDIwMzlEOCwgMHgwMDIwMzlEQywgMHgwMDIwMzlFMCwgMHgwMDIwM0UwNCwKKzB4MDAyMDNFMEUsIDB4MDAyMDM5QzIsIDB4MDAyMDI4ODYsIDB4ODkxMjM0MjcsCisweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LAorMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwKKzB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsCisweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LAorMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywKKzB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsCisweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLAorMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwKKzB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsCisweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLAorMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwKKzB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsCisweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLAorMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsCisweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLAorMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywKKzB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsCisweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLAorMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywKKzB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsCisweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLAorMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwKKzB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsCisweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwKKzB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsCisweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLAorMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwKKzB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsCisweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLAorMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwKKzB4RUQwQUVFMDEsIDB4NjRFM0JDODUsIDB4QkM4QTY0RTMsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweEJDOERFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQzkyLAorMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwKKzB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsCisweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLAorMHgwMDIwMzlDMiwgMHgwMDIwMjk5MiwgMHgwMDFFMTAxNSwgMHgwMDIwMzlDOCwKKzB4MDAxRTEwMDEsIDB4MDAyMDM5OUMsIDB4MDAxRTExMDAsIDB4MDAyMDM5QzYsCisweDAwMjAzOUI0LCAweDAwMUUxMDAwLCAweDAwMjAzOUI4LCAweDAwMjAzOUM0LAorMHgwMDIwMjg4NiwgMHgwMDFFMTAwQywgMHgwMDIwMzlCMCwgMHgwMDIwMzlDQywKKzB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsIDB4MDAyMDM5RDgsIDB4MDAyMDM5REMsCisweDAwMjAzOUUwLCAweDRGMjIyRkU2LCAweEQ2NzA3RkZDLCAweDg4MDE2MDYwLAorMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTZFRDE2RCwgMHhERTZFNjAxMCwKKzB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNkMsIDB4RDI2Qzc1MDIsCisweEU2MDFENzZDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLAorMHg4RkY5MzI3MywgMHhENDYzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwKKzB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NjIsCisweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLAorMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ1Mjc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsIDB4NUUyM0Q3NEUsIDB4NjRGMjJGRTIsCisweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLAorMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwKKzB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsCisweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LAorMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwKKzB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOTYsCisweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLAorMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYyRiwgMHg3RjA0MjYyMiwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4ODU1MkQ1MkEsIDB4ODgzMDYwMEQsCisweDg4MzE4OTAzLCAweEEwMzQ4OTIzLCAweDg1NTUwMDA5LCAweEQ0MjhENzI3LAorMHg4NTUzMjcwMSwgMHg2MTBERDYyNywgMHgyNDEyNDExOCwgMHg0NjBCRDQyNiwKKzB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsIDB4NjU3MjQyMEIsIDB4RTIzMEQxMjAsCisweDQyMjg2NzEyLCAweDI3MjlFNjIwLCAweDM3NjA0NjI4LCAweEQ2MjE4QjAzLAorMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwgMHhBMDEyRTIwMiwgMHhEMTE4MjYyMiwKKzB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsIDB4NDYyODIyNTksIDB4ODkwODMyNjAsCisweEQ0MUFEMTE5LCAweEU2MDFENTEzLCAweDIxNjA0NTBCLCAweDQ3MkJENzE4LAorMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwgMHgwMDIwMzlFNCwKKzB4MDAxRTEwMDAsIDB4MDAyMDM5RDAsIDB4MDAyMDNFMDQsIDB4MDAyMDNFMTAsCisweDAwMjAzREE4LCAweDAwMjAzOUI4LCAweDAwMjAzREQ4LCAweDAwMjAzREQ2LAorMHgwMDIwM0RBQSwgMHgwMDIwMzk5QywgMHgwMDIwMzlDOCwgMHgwMDIwMzlCNCwKKzB4MDAyMDM5QjAsIDB4MDAyMDE4QTIsIDB4MDAyMDNCMjQsIDB4MDAyMDNCMjgsCisweDAwMjAxOEVFLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzQjNDLAorMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwgMHhERTk2N0ZGQywgMHgyMDA4ODRFOSwKKzB4MkYwMDhEMDYsIDB4RDY5NUQ0OTQsIDB4MDAwOTQ2MEIsIDB4NjRGMEIxOUEsCisweDY2MjBEMjkzLCAweDg5MDIyNjY4LCAweEM5QkY2MEUwLCAweDdGMDQyRTAwLAorMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERThENEYyMiwKKzB4NjBFMEQ2OEQsIDB4Q0JDMEQ0OEQsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsCisweDQwMjE4OTA0LCAweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LAorMHhENjg3NjE2RCwgMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwKKzB4MzIxMzYyNUQsIDB4RDI4MzhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsCisweDRGMjY4MEUyLCAweDZFRjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2MjYwRDY3RCwgMHg4OTQ0MjIyOCwgMHhENTcyRTEwMCwgMHg2MDUwMjYxMCwKKzB4Q0I0MEQ0N0EsIDB4MjUwMDQ0MEIsIDB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsCisweDcxMDQ2MTJDLCAweDJGMTFBMDA2LCAweEQ0NzVENjZELCAweERENzU2NzYwLAorMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwgMHg4QjAzM0QyNywgMHhEMjY3RDQ3MiwKKzB4MDAwOTQyMEIsIDB4NEQyMTREMjEsIDB4QTAwNUQ3NzAsIDB4NjZFNkU0MDAsCisweDM1N0M0NTA4LCAweDc0MDEyNTYyLCAweDM1RDM2NTRELCAweEQ3NkM4QkY3LAorMHg2MTcyRTAwMywgMHg4MTExNDAxOCwgMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywKKzB4RDQ2ODYxNzIsIDB4REQ2ODgxMTMsIDB4NEQwQkRFNjgsIDB4RTIwMTY1NzIsCisweEQ0NjcyRTIyLCAweDQyMEJEMjU1LCAweEQ2NTYwMDA5LCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1RjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTQ5LCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2M0I4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjNBRDQ0RCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsCisweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLAorMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywgMHhFNDA4QkZCNiwKKzB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLAorMHg2QjEzNkNDRCwgMHhERTM2RDczNSwgMHhFREZGNjRGMywgMHhEODM1RUEwNCwKKzB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsCisweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLCAweDY5ODIwMkVELAorMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywKKzB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsCisweDY3RjNFNUM1LCAweEJGNzk2NjZDLCAweDdGM0M2NTVDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwKKzB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsCisweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzQjQwLCAweDAwMjAxOEEyLAorMHgwMDIwMzkwRSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDA2MTAsIDB4MDAyMDM5MTQsIDB4MDAyMDJBRUEsCisweDAwMjAzQjQ0LCAweDAwMjAxOEVFLCAweDAwMjAzQjYwLCAweDAwMTE3ODhDLAorMHgwMDIwMzkxMCwgMHgwMDIwMzRGNCwgMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwKKzB4MDAyMDNCNjgsIDB4MDAyMDJBQUMsIDB4MDAyMDNCNkMsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzREE0LCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY0RDE2MywgMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MjI3MjIsIDB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU2NywgMHhDODEwNjBFMywgMHhCRTY0ODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFODYsIDB4QzgwMTYwRTMsCisweEREM0Q4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzQ4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkUsIDB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjIzLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLAorMHg2MEUzMDAwOSwgMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwKKzB4MDAwOUJGMEQsIDB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsCisweDI1RDJCRjg1LCAweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LAorMHg0MjJCNkVGNiwgMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsCisweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTkwLAorMHgwMDIwMUFCMiwgMHgwMDIwMjExNCwgMHgwMDIwMUFDQSwgMHgwMDIwMUFEOCwKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFCNDQsCisweDAwMjAxQjUwLCAweDAwMjAxQUUwLCAweDAwMjAxQUZFLCAweDEyMzQ1Njc4LAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgwMDIwMUIyQywgMHg2NDRDRDZBNywKKzB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsCisweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELAorMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywKKzB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLAorMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLAorMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLAorMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywKKzB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsCisweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAzOUMyLCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweEQyMUREMTFDLAorMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywKKzB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsCisweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLAorMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwKKzB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsCisweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLAorMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywKKzB4MDAyMDM5MEQsIDB4MDAyMDM5MEMsIDB4MDAyMDM5MEUsIDB4MDAyMDM1MzQsCisweDdGRkM0RjIyLCAweEU2ODBEMTlGLCAweDY2NkM2MjEyLCAweEQyOUUyRjIyLAorMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwKKzB4RTY4MDAwMDksIDB4RDI5ODY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsCisweEU2ODA2NDczLCAweEQyOTQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLAorMHgyRjg2NjQ3MywgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZDQzRGMjIsIDB4REM4RUQyOEQsIDB4NzIwMTFGMjEsIDB4REI4RDFGMjIsCisweEQxOEVERThELCAweDY2MTI1MjExLCAweDhCMDEzNjIwLCAweDAwMDlBMEU1LAorMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwgMHgwMDA5QTBERiwgMHhEMjg4RDQ4NywKKzB4RUQ4NDQyMEIsIDB4MkYwMjU1MDMsIDB4MzBEMDg0NUMsIDB4QTBCODg5MDEsCisweEQxODQwMDA5LCAweDYyNkM2NjEwLCAweDg4MDE2MDIzLCAweEQxODI4QjY4LAorMHg2MjEwMUZDMywgMHg4OTVCMjIyOCwgMHhFMDAzRDQ4MCwgMHg0MDE4Njc0MiwKKzB4Njg0MjE3NzIsIDB4RDU3RUU5MDAsIDB4ODE4MTZEQjMsIDB4N0QwNDIxOTAsCisweDY3RDI2QUIyLCAweDY0RTI2ODUyLCAweDFGNDkxRjU3LCAweDc0MDQ2NEUzLAorMHgxRkE0NjU0MiwgMHg2NTQzMUY1QSwgMHg2MjUyNzVGOCwgMHgxRjc2MUZENSwKKzB4NkQ1MzFGMkIsIDB4REE3NEQ3NzMsIDB4N0Q5NEQyNzQsIDB4NjhEMjFGODgsCisweDZBQTI2OTcyLCAweEQxNzI2MDIyLCAweDIyMDJDQjIwLCAweEUxNDAxRjFDLAorMHg3NjAxRTYwMCwgMHgzMjEzNjI2RCwgMHg1NkY0OEJGQiwgMHg1MkY2NTFGNSwKKzB4MjEyMjJCNjIsIDB4NTJGODUxRjcsIDB4MjEyMjU2RjksIDB4MkU2MjUxRkEsCisweDUxRkIyNDEyLCAweDJEODIyNTEyLCAweEQ5NjYyNzkyLCAweDI5QTJERDVGLAorMHg2QUQyRDk2NSwgMHhEOTY0Njg5MiwgMHg2OEQyMUE4NCwgMHg2MDgxREE2MywKKzB4MjgwMUNCMDEsIDB4RDg2MjY2RDIsIDB4MkE2MjI5NjIsIDB4RUQwMTVBRkMsCisweDJBRDI0ODBCLCAweDJBRDI0RDE4LCAweDYyRDJERDVFLCAweDJEMjI3MjAxLAorMHhEMTUwNTZGMywgMHhFMjAyNjA2MiwgMHgyNjAyQ0IwMSwgMHgyMTIwQTAzRCwKKzB4OEIzQTIyMjgsIDB4RTQwMURENTgsIDB4MjE0MEU2MDAsIDB4RTAxQzJENjIsCisweEM4MDEwMDVDLCAweEQ0NTU4QjBBLCAweEU2MDBENzU1LCAweEVEN0QyNDcyLAorMHg2MjZDNzYwMSwgMHg4QkZCMzJEMywgMHgyNEQyREQ1MiwgMHhFMkZFNjhDMiwKKzB4MkM4MjI4MjksIDB4MDk1Q0UwMUUsIDB4RTAxRjVERjEsIDB4MEE1QzJEOTAsCisweDc1MTA1MUYyLCAweEVEMDYyMUEwLCAweEQ3NEJFNjAwLCAweDg0NTZENDRCLAorMHgyNzAwNzYwMSwgMHg2OTZDNjg1NCwgMHgyNDgwMzlEMywgMHg4RkY2NzQwMSwKKzB4REE0Nzc3MDEsIDB4MkExMEUxOTQsIDB4RTIwMDdBMDEsIDB4N0EwRjJBMjAsCisweEQxMzBFODA1LCAweDY2MTAyQTgwLCAweDYwMjM2MjZDLCAweDg5MDg4ODAxLAorMHhEMjQwRDQyQSwgMHg0MjBCNjVGMiwgMHhEMTMxRUQwMSwgMHhBRjMwNEQxOCwKKzB4NjVGMjIxRDIsIDB4ODU1M0Q0M0MsIDB4NjIwRDY2NDIsIDB4ODkwNzMyNjIsCisweEQxM0JENDNBLCAweDAwMDk0MTBCLCAweEU2MDFENzNBLCAweDI3NjJBRjFBLAorMHhEMTM0RDQxRSwgMHg0MTBCNjVGMiwgMHhEMTI1RUQwMSwgMHhENjM3RDQzNiwKKzB4NDYwQjREMTgsIDB4QUYwRDIxRDIsIDB4N0YzNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwKKzB4ODFGMkQyMDksIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsCisweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywgMHgwMDIwMjQ1QywgMHgwMDExNzc5QSwKKzB4MDAxQzM2RjgsIDB4MDAxQzNCOUMsIDB4MDAxQzM3MDQsIDB4MDAyMDM1MkMsCisweDAwMjAxNEEwLCAweDAwMjAzOTFELCAweDAwMjAzOTFDLCAweDAwMjAzOTE4LAorMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwgMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwKKzB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsCisweDAwMjAxNjBDLCAweDAwMTE3NzMwLCAweDAwMjAzOTIwLCAweDAwMUM1ODJDLAorMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwgMHgwMDExNzc4QywgMHgwMDExNzc5MiwKKzB4MDAxMTc3ODgsIDB4MDAyMDE0Q0MsIDB4MDAyMDM4RjQsIDB4MDAyMDM0RjQsCisweDAwMjAxNTMwLCAweDAwMUUyMTMwLCAweDAwMjAzRDg0LCAweDAwMjAxOEEyLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsIDB4NjEwM0Q0OUEsIDB4MUY0MjgxRjIsCisweEREOUFEQTk5LCAweEQ2OUE2ODEzLCAweEUwMDE0ODA4LCAweDQ2MEJERTk5LAorMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywgMHgzNTIwNTJBMSwgMHhBMjNFOEIwMSwKKzB4NjA1MTAwMDksIDB4ODgwMUM5MDMsIDB4QTIzODhCMDEsIDB4NTI1MzAwMDksCisweDMyRTBERTkxLCAweEQ5OTE4QjEwLCAweDY0QTM0OTBCLCAweDRCMEJEQjkwLAorMHhERTkwNjQwMywgMHhENzkxRDY5MCwgMHhFQzAxRDU5MSwgMHgyRTAyRTEwMCwKKzB4MjcxMDI2QzAsIDB4MjUwMkFGREYsIDB4QzgwMTg1NTEsIDB4QTE1NzhCMDEsCisweDYyNTEwMDA5LCAweDQyMDA2MjJELCAweDVFNTMzNjZBLCAweDg1RTIyMjZELAorMHhDOTAzNjQyQywgMHg4NUUzNjYwMywgMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwKKzB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsIDB4NjA1MzI1MkQsIDB4QzkwMUQxN0YsCisweDYwMTA2QzAzLCAweDg4MDFEOTdGLCAweERCN0Y4QjA1LCAweDIxMjBFMjAwLAorMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwgMHg4ODAxNjAxMSwgMHg2NUEyOEIwQSwKKzB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsIDB4QTAwMzIyQjksIDB4OTE5QjI1MjEsCisweDI1MjEyMjFCLCAweDM3QjNFQjEwLCAweDI0NDg4OTVFLCAweEQ0NzM4QjA3LAorMHgyMjI4NjI0MSwgMHg2MDYzODkwMywgMHhBMDU3ODFGOCwgMHhENTcwNjQ3MywKKzB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsIDB4NDYwMDZCNTAsIDB4MzYyQzQyMDAsCisweDJCQjhDOTEwLCAweDhGMUY2NDYzLCAweDI2Njg2NjAzLCAweEQyNjk4OTExLAorMHgwNjJENjA0MywgMHg0MTE5NjE2RCwgMHg2QjBFNjAxOSwgMHg4MUY4MjBCRCwKKzB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsIDB4ODgwRjYwNzMsIDB4QTAyNzhCMUIsCisweEQyNjEwMDA5LCAweDA1MkQ2MDQzLCAweDQxMTk2MTVELCAweDY3MEU2MDE5LAorMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywgMHg4OTBGMjY2OCwgMHg2MDQzRDI1QiwKKzB4NkI1RDA1MkQsIDB4NjBCOTRCMTksIDB4MjAxRDYxMEUsIDB4NjBDMzgxRjgsCisweDhGMEQ4ODAxLCAweDY0NzM2NDVDLCAweEVDMDBBMDBBLCAweDYwNDNEMjU0LAorMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwgMHgyMDdENjcwRSwgMHg4MUY4NjQ1QywKKzB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsIDB4OEQwN0M4MjAsIDB4RTZEQzYyMDMsCisweDYwMjMyMjY5LCAweDgxRTFBMDAyLCAweDY0NENFNEZGLCAweDYyMTBEMTQ5LAorMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwgMHg2NTRERUJGRiwgMHgzNUIwNkJCQywKKzB4REIzNjhCMkIsIDB4NjRBMzRCMEIsIDB4NDEwQkQxMzUsIDB4NTQwMzY0MDMsCisweDg1NDQ2RTAzLCAweEM5NDhEQjQwLCAweERDNDA4ODA4LCAweEJFQUU4QjAxLAorMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwgMHhEQjNERUMwMSwgMHhEMTNEMkRDMiwKKzB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsIDB4MjEyMjg4MDUsIDB4MkIwMjhGMDgsCisweDY2NkNFNjgwLCAweDY1NjNEMjM4LCAweDc1NDlFNzAwLCAweDY0NzM0MjBCLAorMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwgMHg4NUUyODAwMCwgMHgyMEI5RUJGQywKKzB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsIDB4NjIwMzIwNDksIDB4NDUwODg1RjgsCisweDgxRTIyMDFCLCAweEM5MDE2MEMzLCAweDQwMDg0MDE4LCAweDQwMDg0MDA4LAorMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwgMHg4NUU0ODFFMywgMHg0MTE4RTEwOCwKKzB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsIDB4MjBCOTg1MjEsIDB4NjdBMjgxMjEsCisweENCMDE2MDcxLCAweDg1RjgyNzAxLCAweDg5MDMzMDQyLCAweEVDRTc4NUUyLAorMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwgMHhBMDNCMDAwOSwgMHg3RTAzMDAwOSwKKzB4MDAxQzNEMzAsIDB4MDAyMDNEOTAsIDB4MDAyMDM1MDQsIDB4MDAxRTIxMkMsCisweDAwMjAzM0U4LCAweDAwMUMzRDAwLCAweDAwMTE3NzgwLCAweDAwMjAxNEEwLAorMHgwMDIwMTY2QywgMHgwMDExNzcwQywgMHgwMDIwMzkxQywgMHgwMDIwMzkxRCwKKzB4MDAyMDM5MTgsIDB4MDAyMDE4QTIsIDB4MDAxQzM2RjgsIDB4MDAyMDM5OTAsCisweDAwMjAzREEwLCAweDAwMjAzQjg0LCAweDAwMjAzQzA0LCAweDAwMjAzQzg0LAorMHgwMDIwM0QwNCwgMHgwMDIwMzkwOCwgMHgwMDIwMzRGQywgMHgwMDIwMTRDQywKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTgsIDB4MDAyMDI0NUMsIDB4MDAyMDNEODgsCisweDAwMjAzRDhDLCAweDYwMjI2MkYyLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LAorMHg4QjBCODgwQSwgMHg2MEUyREU4QywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsIDB4MjgwMkEwMDYsIDB4NjVFMkRFODcsCisweDJFNTI3NTAxLCAweDI4NjI2NkEyLCAweDUyRjM2NkYyLCAweDI2MjJBRTgzLAorMHhEMjgzODU1MSwgMHhERTgzQzgwMiwgMHhBMDk1OEIwMSwgMHg0MjBCMDAwOSwKKzB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsIDB4ODVFNDY1MDMsIDB4NDkxOEU5MDgsCisweEQ3N0QyMDlCLCAweEUwNEM4MUU0LCAweERDN0MwQjdFLCAweDdCMDFEOTdDLAorMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwgMHg4RDA2MjY2OCwgMHhENDc5MkMxMiwKKzB4NDIwQkQyNzksIDB4QTA3MEVCMDEsIDB4NjI1MTJEQjIsIDB4NEIxOEVCMEYsCisweDIyQjlFMTAyLCAweDMyMTA0MTE4LCAweDg1NTE4QjBGLCAweDIwMjlFMkZDLAorMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwgMHg4NUUxMjUwMSwgMHgyMDI5OTRBMywKKzB4ODVFNDgxRTEsIDB4QTA1MjIwNDksIDB4Njc1MTgxRTQsIDB4NDcxOTY3N0QsCisweDY2N0U2Nzc5LCAweDc3MDEyNzZELCAweDY5MDM2MDdDLCAweDg4MDE0OTE4LAorMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwgMHgyMUIyN0IwMSwgMHg2NjBEODVFMywKKzB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsIDB4NkMwMzQ2MDAsIDB4MjYyRDMyMkEsCisweEM4MDE2MDYzLCAweERCNUVEMTVELCAweDk2N0Q4OTAxLCAweEU2MDAyQzZCLAorMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywgMHg2MjJEMDIxRCwgMHg4RDBFMzI3MCwKKzB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsIDB4OEIwMTMyOTAsIDB4MDFDNUEwMDcsCisweDYyNkM3NjAxLCAweDMyOTJFOTA0LCAweDY0NkM4QkVCLCAweDYwNDM0NDAwLAorMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwgMHg2NjlENjkxMSwgMHg4OTA3MzY3MCwKKzB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsIDB4RTIwMURCNEIsIDB4MkIyMDIxQzEsCisweEVDRkM4NTUxLCAweDgxNTEyMEM5LCAweENCMDE2MDUxLCAweERDNDcyNTAxLAorMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwgMHg4NUVGMjYxMiwgMHg1NEYyRDI0NCwKKzB4NjUwRDQyMEIsIDB4MDAwOUFERTcsIDB4RTUwMERDNDIsIDB4NDIwQjJDNTIsCisweDRFMEI2NEEzLCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweDY3MDNFOTA4LAorMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwgMHhEQjMyMzc5MCwgMHg4RjBCRDkzMiwKKzB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsIDB4Qzk0ODYwNTMsIDB4OEIwMzg4MDgsCisweEU1MDFCRDRELCAweDAwMDlBMDA1LCAweDIxMjhEMjMzLCAweEJENDY4OTAxLAorMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywgMHhBREJDRUMwMSwgMHg4NUYyMkRDMiwKKzB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsIDB4OEQwMjgxRjIsIDB4QURBOTdBMDgsCisweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwgMHgyRkU2ODAwMCwgMHhEMjIzNEYyMiwKKzB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsIDB4QkJGOTIyRTIsIDB4RTI0MDAwMDksCisweDJFMjg0MjE4LCAweEJDMDQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDVDODEwLAorMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwgMHgwMDA5QkMwMywgMHhDODA1NjBFMywKKzB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4QUMwMDRGMjYsCisweDRGMjY2RUY2LCAweDZFRjYwMDBCLCAweDAwMUMzRDNDLCAweDAwMTE3NzYwLAorMHgwMDIwMTRBMCwgMHgwMDIwMTY2QywgMHgwMDIwMzQ5NCwgMHgwMDIwM0RBNCwKKzB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzOTcwLCAweDAwMjAzOTcyLCAweDAwMjAxNTMwLAorMHgwMDIwMThFRSwgMHgwMDIwMzk5NCwgMHgwMDAwODAwMCwgMHgwMDFDMzUxMCwKKzB4MDAyMDNEOTgsIDB4MDAyMDE4QTIsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsCisweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLAorMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwKKzB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsCisweDAwMDkwMDA5LCAweDAwMjAzNDEyLCAweDAwMjAzM0M4LCAweDAwMEJFMDAwLAorMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwKKzB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsCisweDIwNkM3NTRBLCAweDMyMjAzMTIwLCAweDIwMzgzMDMwLCAweDMyM0EzMTMyLAorMHgzNDMzM0EzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywKKzB4NDI3MDczNzIsIDB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsCisweDZFNDk2NzdBLCAweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELAorMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwKKzB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsCisweDY1NzQ2OTcyLCAweDY0NjEyMDJDLCAweDAwM0Q3MjY0LCAweDZDNjE3NjIwLAorMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwgMHg0MzVGNEQ1QSwgMHg0NjVGNDQ0RCwKKzB4NEM0NDVGNTcsIDB4NDk0RTQ5NUYsIDB4MDAwMDAwNTQsIDB4NkU2QjZFNTUsCisweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLAorMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzNDUxLCAweDAwMDAwMDIwLCAweDJCNDM0NzQxLCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4NkYyMDZDNjksIDB4Njk3NDIwNkUsIDB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LAorMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwKKzB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsCisweDAwMEEwRDZELCAweDAwMDAwMDQ0LCAweDQ0Mzg3NTcwLCAweDcyNjM3MzY1LAorMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwgMHgwMDAwMDAwMCwgMHgwMDAwMDA0NywKKzB4MDAwMDAwNDIsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwgMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwKKzB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsCisweDAwMDAwMDAwLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAwMDMwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDIwMDAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMTBGMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksCisweDczMjA0MTQyLCAweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwKKzB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsCisweDgyMDUwNzAwLCAweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLAorMHg0MDAzMDQwNSwgMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsCisweDQwMDI4MjA1LCAweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTU5MzY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3UuYy5kcnZfYmFfcmVzZW5kIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMuZHJ2X2JhX3Jlc2VuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjViY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMuZHJ2X2JhX3Jlc2VuZApAQCAtMCwwICsxLDc0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFMjk3RkZDLCAweEUxMTRENzI5LAorMHgxRTEzRDQyOSwgMHgxRTRDNDcwQiwgMHgwMDA5QjAxOCwgMHhBMDAzOTU0NSwKKzB4MzY1MkU2MDAsIDB4NzYwMThEMDQsIDB4Qzg0MDYwRTIsIDB4MkYwMjhERjksCisweERFMjNENDIyLCAweDAwMDk0RTBCLCAweDRFMEJENDIyLCAweEQ0MjIwMDA5LAorMHgwMDA5NEUwQiwgMHg0RjI2N0YwNCwgMHg2RUY2QTAyNCwgMHhEMTFGNEYyMiwKKzB4MDAwOTQxMEIsIDB4NDQwQkQ0MUUsIDB4RDUxRTAwMDksIDB4MDAwOTQ1MEIsCisweEUxRkZENzFELCAweEQyMUQ2MTFELCAweDUwMjkyNzEyLCAweENCMDFENDFDLAorMHhFNTAxRTFGRiwgMHgyMjEyMTIwOSwgMHgyNDUyMTIxMSwgMHhENjFBRDUxOSwKKzB4RTIwMDk3MTQsIDB4RDQxOTI1NzIsIDB4RDYxOTI2MjAsIDB4NEYyNjI0MjIsCisweDI2MjIwMDBCLCAweEREMThEQzE3LCAweDRDMEJERTE4LCAweDREMEIwMDA5LAorMHg0RTBCMDAwOSwgMHhBRkY4MDAwOSwgMHgyNzEwMDAwOSwgMHgwMDAwMDY0MCwKKzB4MDAxQzAwMUMsIDB4MDAyMDBCQzQsIDB4MDAwMEIzOEUsIDB4MDAyMDI5RjgsCisweDAwMjAwRjcyLCAweDAwMjAyQTA0LCAweDAwMjAyQTFDLCAweDAwMjAwRjIwLAorMHgwMDIwMTA1NiwgMHgwMDIwMEMxQywgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwKKzB4MDAxRTIxMkMsIDB4MDAyMDI5OTQsIDB4MDAyMDI1MzAsIDB4MDAyMDI5OUMsCisweDAwMjAyOUE4LCAweDAwMjAwRTUwLCAweDAwMjAyM0U2LCAweDAwMjAxOTIwLAorMHgyRkM2MkY5NiwgMHgyRkU2MkZENiwgMHg3RjkwNEYyMiwgMHhFMDIwREU4RCwKKzB4RDQ4RDYxRTAsIDB4NjFFMzBGMTQsIDB4NjIxMDcxMDEsIDB4RTAyNEQ3OEIsCisweDBGMjQ0NzBCLCAweDQ1MEJENThBLCAweDIwMDgwMDA5LCAweDhGMTE2RDAzLAorMHhERDg4MUYwQSwgMHg2N0QwRDQ4OCwgMHg0MTBCRDE4OCwgMHhEMjg4NjU3QywKKzB4NjkyMEREODgsIDB4NjZDMzZDOUMsIDB4NDYwODQ2MDgsIDB4NDYwODM2QzgsCisweDFGREEzRDZDLCAweDA0RkNFMDI0LCAweDY2RTJFNTgwLCAweDY1NUM2MDRDLAorMHg4RjE2MzA1MCwgMHhFMDIwMkQ2MiwgMHhFNTAwMDFGQywgMHhERTdFNjQxQywKKzB4MzI0MzYyNUQsIDB4QTMyQzhCMDEsIDB4NjU1RDAwMDksIDB4MzZFQzY2NTMsCisweEUwMkM2NzYwLCAweDY5NTMwRjc0LCAweDM5REM2MDdFLCAweEFGRUY4MDk0LAorMHgyMDA4NzUwMSwgMHhFMDIwOEIxNCwgMHhFNTAwMDFGQywgMHhBMDBBREU3MiwKKzB4NjU1RDY0MUMsIDB4MzlFQzY5NTMsIDB4Njc1MzZDOTIsIDB4MzdEQzYyQzIsCisweDc1MDQxNzIxLCAweDYyNUQxRjJDLCAweDhCRjIzMjQzLCAweDJEMTBBMzA5LAorMHg4QjE3ODgwMSwgMHgwMUZDRTAyMCwgMHgyRDcwRTcwMCwgMHgxRkQ3NkQxQywKKzB4NjI3RERFNjUsIDB4OEIwMTMyRDMsIDB4MDAwOUEyRkIsIDB4NjVFMzY3N0QsCisweDc1MDQ2NjczLCAweDM2RUM2QzczLCAweDY0NjIzQzVDLCAweDc3MDg2OUMyLAorMHgyNDkyQUZFRiwgMHg4QjE4ODgwNCwgMHgwMUZDRTAyMCwgMHgyRDQwRTQwMCwKKzB4REU1OTY3MUMsIDB4MzI3MzYyNEQsIDB4QTJFMjhCMDEsIDB4NjQ0RDAwMDksCisweDZDRTM2RDQzLCAweDY1RDIzREVDLCAweDYxNDM3QzA0LCAweDYyMTIzMUNDLAorMHg3NDA4Njk1MiwgMHhBRkVEMjkyOSwgMHg4ODA1MjU5MiwgMHhFMDIwOEIxOCwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNEIsIDB4OEIwMTMyNzMsCisweDAwMDlBMkM3LCAweDY5NDM2NDRELCAweDM5RUM2MUUzLCAweDcxMDQ2NTkyLAorMHgzQzFDNkM0MywgMHg2RDUyNjJDMiwgMHgyRDJCNzQwOCwgMHgyNUQyQUZFRCwKKzB4OEIxQjg4MzEsIDB4RDk0MkQyNDEsIDB4NzIwNDY0MjIsIDB4NzIwNDY2MjIsCisweDcyMDQ2NzIyLCAweDcyRTg2QzIyLCAweDFGMkUxRjRELCAweDcyMDQ2NDIyLAorMHg3MjA0NkUyMiwgMHg2NTIyMjlFMCwgMHgyOTUwRDkzQSwgMHhERTNBMkZDNiwKKzB4NTVGRTRFMEIsIDB4RTIwMDdGMDQsIDB4MkQyMEEyOUIsIDB4OEIxRDg4MzAsCisweERFMzNEMjMyLCAweDcyMDQ2NTIyLCAweDcyMDQ2MTIyLCAweDcyMDQ2NzIyLAorMHg3MkU4NjkyMiwgMHg3MjA0NjQyMiwgMHg3MjA0NkMyMiwgMHg2RTIyMkVDMCwKKzB4MUY5RkQ2MkMsIDB4N0ZGQzI2RTAsIDB4MDlGRUUwNDAsIDB4MkY5MkRDMkIsCisweDY2MTM0QzBCLCAweEUyMDA3RjA0LCAweDJEMjBBMjdCLCAweDg5MDE4ODI4LAorMHgwMDA5QTEwOSwgMHhFMTQzREUyMCwgMHhFMDQwNjJFMSwgMHgzNjE3NjYyRCwKKzB4MEZFNjhGMDMsIDB4NjYwMzAyRkUsIDB4MzYxNzIyMDEsIDB4QTBGMzhCMDEsCisweEUwNDAwMDA5LCAweEU1MDEwNEZFLCAweDMwNTY4NTQxLCAweEEwRUI4QjAxLAorMHhFMDQwMDAwOSwgMHgwOUZFRTcwMSwgMHhCMjYxMkQ3MCwgMHhFMDQwNjQ5MSwKKzB4RTE0MzBDRkUsIDB4RTA2ODYyQzEsIDB4MzUxNzY1MkQsIDB4MEY1NjhENjgsCisweDM1NjNFNjQwLCAweEU2MDA4QjI0LCAweDBGNjVFMDQ4LCAweEEwMkVFMTFBLAorMHgwMDAwNzJDMCwgMHgwMDExNzgwMCwgMHgwMDIwMkEyMCwgMHgwMDIwMEY3MiwKKzB4MDAyMDFGREMsIDB4MDAyMDI5QjAsIDB4MDAyMDJBMjQsIDB4MDAyMDBGQkMsCisweDAwMjAyOUFGLCAweDAwMjAyNUQ0LCAweDAwMTE3ODA0LCAweDAwMTE3ODEwLAorMHgwMDIwMjlBQywgMHgwMDIwMjlBRCwgMHgwMDIwMDk0OCwgMHgwMDIwMDk5NCwKKzB4NDEyMTYxNTMsIDB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQ1MjEsCisweDYwNTM0NTIxLCAweDY2MDNDOTAzLCAweDBGNjVFMDQ4LCAweEUwMDc3MTE4LAorMHhFMDQ0MjIwOSwgMHg2NDFEMEYyNSwgMHg2NUYzRTA0QywgMHgwRjQ2QjI5MSwKKzB4MEVGREUwNDgsIDB4MERGREUwNDQsIDB4NjFERDY3RUQsIDB4NDEwODQ3MDgsCisweDBGMTZFMDUwLCAweEREOTQ2MDczLCAweDREMEIwNkZFLCAweDZFMDdFMDBGLAorMHg2MDczMjZFOSwgMHhFMDQwMEY2NiwgMHg2NUYzMENGRSwgMHg2OTBEODVDMiwKKzB4MDFGRUUwNTAsIDB4NjA5MzREMEIsIDB4NjA3MzI2MEIsIDB4RTA0QzBGNjYsCisweDA0RkVCMjU2LCAweDA3RkVFMDQwLCAweDYyNzFFMDY4LCAweDBGNTY2NTJELAorMHgzNTYzRTY0MCwgMHhFRDAwODk1NCwgMHgwRkQ1RTA2NCwgMHhDOTAzNjAyMywKKzB4NDAwMDQwMDgsIDB4NjEwMzY5MDMsIDB4MEY5NkUwNTQsIDB4REU3RUUwNTgsCisweDBGRjZFQ0ZGLCAweEUwNkM2Q0NDLCAweDYwQzMwRkU2LCAweDYyNTM0RTBCLAorMHg0MjIxNDIyMSwgMHg0MjIxNDIyMSwgMHg0MjAwNjcyMywgMHg2MTA3MzI3QywKKzB4NDIwMEUwNUMsIDB4MEYxNjQ1MjEsIDB4NDUyMUUwNDAsIDB4NjA1MzBDRkUsCisweDQwMDhDOTAzLCAweDdDMDYzMEZDLCAweDZFMDMxRkM2LCAweDFGRDU2RDJELAorMHgxRjA0QTAxRSwgMHgwRkQ2RTA2MCwgMHgwNUZFRTA1OCwgMHg2NEQzQjIzMSwKKzB4NjJFMkUwNUMsIDB4RTA1NDA5RkUsIDB4MkUyMjIyOTksIDB4NjREMzYxQzQsCisweDAxRkU2NjFDLCAweDA3RkVFMDZDLCAweDYwNjM0NzBCLCAweEUwNTgyMjBCLAorMHhCMjA1MDVGRSwgMHhFMDY0MkUyMiwgMHg3RDAxMDJGRCwgMHgwRjI1NzIwMSwKKzB4MDJGREUwNjQsIDB4MzI2MkU2MDYsIDB4RTA0MDhCREMsIDB4NjI2MTA2RkUsCisweDA1RkVFMDQwLCAweDg1NTE0MjAwLCAweDMwMkM3NTBDLCAweDYxMDM3MDFCLAorMHg2NEYzRTYwMCwgMHhFNzA0QTAwNCwgMHg3NjAxNjI1NiwgMHg3NDA0MjQyMiwKKzB4MzI3MzYyNkQsIDB4NjVGMzhCRjgsIDB4NjQxREIxRTIsIDB4MDZGRUUwNDAsCisweDY0NjFCMTlFLCAweDAwMDlBMTc1LCAweEQ3NERENDRDLCAweDQ3MEJFMjAxLAorMHhBMTZFMkQyMCwgMHg4ODI5MDAwOSwgMHhERTRBOEIwNywgMHgyRDIwRTIwMCwKKzB4QjE2RDY2RTIsIDB4QTE2NDY0NkQsIDB4RTI4MTAwMDksIDB4MzAyMDYyMkMsCisweEEwQTc4QjAxLCAweEUwMjQwMDA5LCAweDYyNkMwNkZDLCAweDY2NkNFNjgyLAorMHg4QjIxMzI2MCwgMHhFNDI0NTJGQSwgMHhENDNGMjI0MCwgMHgxMjYxNTY0NywKKzB4MTI2MjU2NDgsIDB4MTI2MzU2NDksIDB4MTI2NDU2NEEsIDB4MTI2NTU2NEIsCisweDEyNjY1NjRDLCAweDEyNjc1NjRELCAweDEyNjg1NjRFLCAweDEyNjk1NjRGLAorMHgxNDI3RTIwMCwgMHgxNDI5MTQyOCwgMHgxNDJCMTQyQSwgMHgxNDJEMTQyQywKKzB4MTQyRjE0MkUsIDB4MUY2Q0ExMzUsIDB4NjY2Q0U2ODMsIDB4OEIwNzMyNjAsCisweEU2MDA1MkZBLCAweEQyMkIyMjYwLCAweDYyMjJENjJDLCAweDI2MjJBMTI5LAorMHg2NjZDRTY5MCwgMHg4QjE4MzI2MCwgMHhFNjAwNTJGQSwgMHhEMjI4MjI2MCwKKzB4NjAyMkU2MDUsIDB4MjIwMkNCMjAsIDB4MjI2MkQyMjYsIDB4MjI2MkU2MDAsCisweDQ2MEJENjI1LCAweEQyMjUwMDA5LCAweDAwMDk0MjBCLCAweEU2MDFEMjI0LAorMHhEMjI0MjI2MiwgMHhBMTBDNDYxOCwgMHhFNkIwMjI2MiwgMHgzMjYwNjY2QywKKzB4RDUxODhCMjIsIDB4RDIxNkQ0MjAsIDB4NzUwNDZENTIsIDB4NkU1MjQyMEIsCisweDQyMEJEMjFFLCAweEQ0MUU2NEQzLCAweDQ1MEJENTExLCAweEQyMUIwMDA5LAorMHg2NEUzNDIwQiwgMHhENjBFRDQxQiwgMHgwMDA5NDYwQiwgMHhFNjAwRTUwNCwKKzB4MzI1MzYyNkQsIDB4QTBFQzhCMDEsIDB4NjY2RDAwMDksIDB4MzI2QzYyRDMsCisweDIyRTA3NjAxLCAweDRFMTlBRkY0LCAweEQyMTRENDEzLCAweEQ0MTQ2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTBERCwgMHgwMDIwMjQ4QywgMHgwMDIwMkE0NCwKKzB4MDAyMDBGNzIsIDB4MDAxMTc4MDQsIDB4MDAyMDI1MzgsIDB4MDAyMDI5OTQsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweDAwMjAxMDU2LCAweDAwMjAwQzFDLAorMHgwMDFFMjEyQywgMHgwMDFDM0QzMCwgMHgwMDIwMkE1QywgMHgwMDIwMEZCNCwKKzB4MDAyMDJBNzAsIDB4MDAyMDJBNzgsIDB4MDAxMTc4MDAsIDB4MDAyMDBGQkMsCisweDAwMjAyQTdDLCAweEQ2QUVENEFELCAweDYyNjJFMDQwLCAweDc2MDQ2NTQyLAorMHgyNDUyMzUyQywgMHg2MjYyNjU2MywgMHg3NTA0NTY0MSwgMHgxNDYxMzYyQywKKzB4NjI1MjY2NTMsIDB4NzYwODU1NDIsIDB4MTQ1MjM1MkMsIDB4NTU0MzYyNjIsCisweDM1MkM3NkVDLCAweDY1NjMxNDUzLCAweDU2NDQ2MjYyLCAweDM2MkM3NTEwLAorMHg2NjUzMTQ2NCwgMHg1NTQ1NjI1MiwgMHgzNTJDNzYxMCwgMHg2NTYyMTQ1NSwKKzB4RDY5QzUyNDYsIDB4MTQyNjMyNUMsIDB4NTU0NzYyNjIsIDB4MzUyQzc2MDQsCisweDYyNjIxNDU3LCAweDc2MDQ1NTQ4LCAweDE0NTgzNTJDLCAweDYyNjI2NTYzLAorMHg3NTA0NTY0OSwgMHgxNDY5MzYyQywgMHg1NjRBNjI1MiwgMHgzNjJDNzUwNCwKKzB4NjY1MzE0NkEsIDB4NTU0QjYyNTIsIDB4MzUyQzc2MDQsIDB4NjI2MjE0NUIsCisweDc2MDQ1NTRDLCAweDE0NUMzNTJDLCAweDYyNjI2NTYzLCAweDc1MDQ1NjRELAorMHgxNDZEMzYyQywgMHg2MjUyNjY1MywgMHg3NjA0NTU0RSwgMHgxNDVFMzUyQywKKzB4NTI0RjY1NjIsIDB4MzI1Q0Q2ODQsIDB4NjI2MjE0MkYsIDB4NzY5NDA1NEUsCisweDA0NTYzNTJDLCAweDYyNjNFMDQ0LCAweDA1NEU2NjYyLCAweDM1NkM3MjQ0LAorMHhFMDQ4MDQ1NiwgMHgwNTRFNjYyMiwgMHhENjdDMzU2QywgMHg2MjYyMDQ1NiwKKzB4MDU0RUUwNTQsIDB4MzUyQzQyMjksIDB4NzYwNDA0NTYsIDB4RTA1ODYyNjIsCisweDQyMjkwNjRFLCAweDUyRkEzNjJDLCAweEU2MzgwNDY2LCAweEUwNDQyMjYwLAorMHhFMDQ4MDY0RSwgMHg2NjQyMTI2MSwgMHg1NjQxMTI2MiwgMHg1NjQyMTI2MywKKzB4NTY0NTEyNjQsIDB4NTY0MzEyNjUsIDB4NTY0NjEyNjYsIDB4MDY0RTEyNjcsCisweDEyNjhFMDQwLCAweEUwNTAwNjRFLCAweDU2NDQxMjY5LCAweDA2NEUxMjZBLAorMHgxMjZCRTA0QywgMHhFMDU0MDY0RSwgMHgwNjRFMTI2QywgMHgxMjZERTA1OCwKKzB4RTA0NDA2NEUsIDB4RTIwMDEyNkUsIDB4RTA0ODA0MjYsIDB4MTQyMTI0MjIsCisweDE0MjUxNDIyLCAweDE0MjYxNDIzLCAweEUwNDAwNDI2LCAweEUwNTAwNDI2LAorMHgwNDI2MTQyNCwgMHgwNDI2RTA0QywgMHgwNDI2RTA1NCwgMHgwNDI2RTA1OCwKKzB4N0Y3MDFGNkMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NjlGNjAwMEIsCisweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTE3LCAweDg5MDgzMTI3LAorMHhENTUwRDQ0RiwgMHg0NTBCRTAwMSwgMHg2NzA3NjY0MiwgMHhBMDBDMjY3OSwKKzB4RTIzRjI0NjIsIDB4ODkwODMxMjcsIDB4RDY0QUQ3NDksIDB4RTAwMTcxRTAsCisweDU1NzE0NjBCLCAweDI1Mjk2MjA3LCAweDRGMjYxNzUxLCAweDAwMDkwMDBCLAorMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxNSwgMHg4OTA3MzEyNywKKzB4RDI0MEQ0M0YsIDB4NDIwQjY2NDIsIDB4MjYwQkUwMDEsIDB4MjQ2MkEwMEIsCisweDMxMjdFMjNGLCAweEQ3M0E4OTA3LCAweDU1NzFENjNBLCAweDQ2MEI3MUUwLAorMHgyNTBCRTAwMSwgMHg0RjI2MTc1MSwgMHgwMDA5MDAwQiwgMHg0NjE4RTY0MCwKKzB4RDUzNTQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4RTY4MDAwMDksCisweDQ2Mjg0NjE4LCAweDYyNTJENTMwLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLAorMHhFMjAwQTAwMSwgMHgzMjQyNzIwMSwgMHgwMDBCOEJGQywgMHhFNjgwMDAwOSwKKzB4NDYyODQ2MTgsIDB4NjI1MkQ1MjksIDB4OEJGQzIyNjgsIDB4MDAwOTAwMEIsCisweDRGMjIyRkU2LCAweDZFNTM3RkZDLCAweDJGNDJCRkYxLCAweEQ2MjQ2MUUyLAorMHgxNjE1RTI4MCwgMHg0MjE4NTRFMSwgMHg1NUUyMTY0NiwgMHgxNjU3NDIyOCwKKzB4NkVGMjU3RTMsIDB4MkUyQjE2NzgsIDB4N0YwNDI2RTIsIDB4QUZDRTRGMjYsCisweDJGQzY2RUY2LCAweDJGRTYyRkQ2LCAweEREMTk0RjIyLCAweEJGRDY2QzUzLAorMHhCRkJCNkU0MywgMHhCRkQyMkRFMiwgMHg1MUQ1MDAwOSwgMHg1NEQ2MkMxMiwKKzB4NTVENzFDNDEsIDB4NTZEODFDNTIsIDB4NEYyNjFDNjMsIDB4NkRGNjZFRjYsCisweDZDRjYwMDBCLCAweEU2MDA2MTYzLCAweDQxMDlBMDA0LCAweDc2MDE2MjU2LAorMHg3NDA0MjQyMiwgMHg4QkY5MzYxMiwgMHgwMDA5MDAwQiwgMHgwMDIwMjUzOCwKKzB4MDAxQzM2QTAsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDAwMUMzNzA0LCAweDAwMjAyNDhDLCAweDAwMUMzNzNDLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgwMDA5QTEwOSwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4NkU2MzZENzMsIDB4NkM1M0IwMTYsIDB4NjRDMzU3RjQsIDB4QjAyOTY1RTMsCisweEIwM0Q2NkQzLCAweEIwNkQwMDA5LCAweEIwNzEwMDA5LCAweEIwNzUwMDA5LAorMHhCMDhBMDAwOSwgMHhCMDhEMDAwOSwgMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwKKzB4NkNGNkEwQjQsIDB4MzQxMkQxOTAsIDB4RDY5MDA1MjksIDB4MjY1MEQ3OTAsCisweDI3NDIwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2RDczLAorMHg2QzUzQkZGMCwgMHg2NEMzNTdGNCwgMHg2NkQzNjVFMywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4RDE4NzJGRTYsIDB4NjYxMjZFNjMsIDB4OTJCQzQ0MTgsCisweDQ0MDg0NTI4LCAweDQ1MDAyNjI5LCAweDI2NUI0NDA4LCAweDI2NEI0NDAwLAorMHgyMTYyNDcwOCwgMHhEMTgwNDcwOCwgMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMURFN0QsIDB4QkZBQkU0MEEsIDB4NjJFMzJFMTIsCisweEUxMDA3MjZDLCAweDIyMTJFNDAxLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjQyMjIxMiwgMHhFNTAzRTczMCwgMHgyMjEyRTQwQSwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyNzIyMjEyLCAweDIyMTIyMjUyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHhCRjg1MjIxMiwgMHhFNjAwMTIxQSwgMHg0RjI2MkU2MiwKKzB4NkVGNjAwMEIsIDB4RTEwMUQyNjYsIDB4MjIxMkU0NDEsIDB4MjI0MjAwMEIsCisweEQ0NjVEMTY0LCAweDIxNjJFNjA1LCAweDI0NjIwMDBCLCAweEQyNjRENTYzLAorMHg4ODAxNjA1MCwgMHhENDYzOEIwNywgMHg2MDQwOTY2OCwgMHg4QjA5ODgwMSwKKzB4QTAwNzk2NjUsIDB4RTYwMDAwMDksIDB4MjI2MkQ0NUUsIDB4ODgwMTYwNDAsCisweEU2MDQ4QjAwLCAweEFGNURFNDBBLCAweEQyNUIyMjYyLCAweEU0MEFFNjAxLAorMHgyMjYyQUY1OCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzU3NEYyMiwKKzB4NjBDMkVEMDAsIDB4Q0IwMUVCNjQsIDB4NjBDMjJDMDIsIDB4QTAwOEM5MDEsCisweDNEQjI2RTAzLCAweDYwQzI4OTA3LCAweEM5MDFFNDBBLCAweDZFMDNCRjQyLAorMHgyRUU4N0QwMSwgMHgzREIyOEJGNSwgMHhENDREOEIwMywgMHg0MjBCRDI0RCwKKzB4RTQwQTAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNkFGMzIsCisweDhGMDE0NDExLCAweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhFRDAwREM0MCwgMHhFQjY0NjBDMiwKKzB4MkMwMkNCMDIsIDB4MkYwMjYwQzIsIDB4QTAwOUM5MDIsIDB4M0RCMzZFMDMsCisweDYwQzI4OTA4LCAweDJGMDJFNDBBLCAweEJGMTNDOTAyLCAweDdEMDE2RTAzLAorMHg4QkY0MkVFOCwgMHg4QjBCM0RCMywgMHhEMjM2RDQzNywgMHg0RjI2N0YwNCwKKzB4NkRGNjZFRjYsIDB4NDIyQjZDRjYsIDB4MUZGRjZCRjYsIDB4MDNDNDAzNDAsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweEQ1MkY2QkY2LAorMHg2MDUyNTY1MSwgMHgwMDBCNDYyOCwgMHgyRkI2MzA2QywgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsIDB4NkU0M0JGRjEsIDB4REMyODZCMDMsCisweEJGRUNERDI4LCAweDMwQjgwMDA5LCAweDA2MEEzQzA1LCAweDQ2MDk0NjA5LAorMHgzRDY1NDYwMSwgMHg0MjA5MDIwQSwgMHg0MjA5NDIwOSwgMHg4QkYwMzJFMiwKKzB4NEYxNjRGMDYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTFDLCAweEU0MDNFNTAwLCAweEJGRDQyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQ0IsIDB4MDAwOTAwMEIsIDB4MDAyNUU3MjAsIDB4MDAyMDJDM0MsCisweDAwMjAyOTk4LCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLAorMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDIwMjlBRCwKKzB4MDAxQzU4MDQsIDB4MDAyMDI5QUMsIDB4MDAxQzU4MUMsIDB4MDAxQzU4NjAsCisweDAwMjAyQTkwLCAweDAwMjAwRjcyLCAweDAwMjAyQUE4LCAweDAwMUMxMDQwLAorMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTQwMDdGRTAsCisweDQ1MjhFNTEwLCAweDY3NDM2QzQzLCAweEUxMDhBMDBGLCAweDYwNDM2NDRELAorMHgwRjU2NDAwOCwgMHhFRTAwNjBDMywgMHg4MTUxMjVDMSwgMHg4MTUzODE1MiwKKzB4MTU3MzE1RTIsIDB4NzUxNDE1RTQsIDB4NjI0RDc0MDEsIDB4OEJFRDMyMTMsCisweERBNzI1MUYxLCAweDFBMTE1NEYyLCAweEQxNzEyQTEyLCAweDU2RjQ1NUYzLAorMHg1OEY2NTdGNSwgMHgyMTQyMTE0MSwgMHgxMTUyMTE1MywgMHgxMTY0MTE2NSwKKzB4MTE3NjExNzcsIDB4MTE4ODExODksIDB4RDk2QTZERjIsIDB4REI2QTUyRjcsCisweDI5RDIxOUQxLCAweDJCMjIxQjIxLCAweEQ4NjhFQjQ1LCAweEU5QjhFQTUwLAorMHg0QTA4NEIwOCwgMHhBMDIwNjk5QywgMHg2RUVERUUwMCwgMHg2MUUzNkRFMywKKzB4NDEwODREMDgsIDB4MzFFQzNERUMsIDB4NDEwODREMDgsIDB4NjBDMzNEOEMsCisweEQ3NUY0MTA4LCAweDgxRDEyREMxLCAweDQxMDg2MEEzLCAweDYwQzM4MUQyLAorMHhFMjAwMzE3QywgMHg4MUQzMzQ5MiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ1NiwKKzB4RDQ1MjFEMjQsIDB4NjVEM0IwM0MsIDB4NjRFRDdFMDEsIDB4OEJEQzM0QjIsCisweERCNTREMTRFLCAweEQyNEY2NTEyLCAweDFCNTE0NTI5LCAweEQxNEM2NDEyLAorMHgyQjcyNjc0RCwgMHhENjUwNjcyMiwgMHgxQjczNDcyOSwgMHgyRkQyNjkyMiwKKzB4MUI4MjY4OUQsIDB4MjY5MjY5MTIsIDB4MTZBMjVBMTIsIDB4REE0NjVCMTQsCisweDVDMTYxNkI0LCAweDVEMTgxNkM2LCAweDZFQTIxNkQ4LCAweDdGMjAxNkVBLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4NjY0MjY4RjYsIDB4QzgwMzYwNjEsIDB4RTUwMDhEMDQsIDB4QzkwMzYwNjEsCisweDhCMDM4ODAyLCAweDY1NjM1MjYyLCAweDI0MTI1MTI0LCAweDYwNTMwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwKKzB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsCisweDYwNTM4MTIzLCAweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjJGLAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwKKzB4NjVGMzYxRjEsIDB4MkYxMTIxNDksIDB4RDEyODU0RDEsIDB4RTYxNDQxMEIsCisweDYwNzE1N0QxLCAweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywKKzB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsCisweDEyRTQ4QjA2LCAweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLAorMHg1NjY0QUZGMCwgMHg2NEYzRDIxNSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywKKzB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMEYsCisweDQxMEJFNjE0LCAweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLAorMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMjU5QywKKzB4MDAyMDI1QTQsIDB4MDAyMDI1OTQsIDB4MDAyMDI1Q0MsIDB4MDAxMDAwQTAsCisweDAwMTAxNjQwLCAweDAwMUUyMTA4LCAweDAwMUMzRDAwLCAweDAwMjAwOTA0LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDIyRDIyNSwKKzB4OEQzNUM4MDMsIDB4REUyNDJGMDEsIDB4REIyNURDMjQsIDB4RUQwMUEwMTYsCisweEM5MDM2MDYxLCAweDg5MTU4ODAxLCAweEQxMjJENDIwLCAweDAwMDk0MTBCLAorMHg2NTAzNTYwMywgMHhDODIwODU2MSwgMHhFMDUwODkwMywgMHg3MjAxMDJCRSwKKzB4RDIxRDBCMjYsIDB4NjRFMzQyMEIsIDB4MjFEMkQxMUMsIDB4NjZDMjUyQzEsCisweDhCRTUzNjIwLCAweEREMUFFRTAxLCAweDRFMThBMDBFLCAweEM5MDM2MDYxLAorMHg4OTBEODgwMSwgMHhENzEzRDQxNiwgMHg0NzBCREIxNiwgMHhENDE2MDAwOSwKKzB4NjUwMzRCMEIsIDB4MjFFMkQxMTEsIDB4NjZEMjUyRDEsIDB4OEJFRDM2MjAsCisweEM4MDQ2MEYxLCAweEQyMTE4OTA3LCAweDRGMjY3RjA0LCAweDZERjY2RUY2LAorMHg0MjJCNkNGNiwgMHg3RjA0NkJGNiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsIDB4MDAyMDI1QTQsIDB4MDAyMDI1OUMsCisweDAwMjAyNTM4LCAweDAwMjAwRDQyLCAweDAwMjAwREM0LCAweDAwMUMzRDMwLAorMHgwMDIwMjU5NCwgMHgwMDIwMEQ2MCwgMHgwMDIwMjVDQywgMHgwMDIwMDEwMCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweEQ2MkE3RkZDLCAweDI2NDI2NDRDLAorMHhDODIwNTA2NiwgMHgyRjAyOERGQywgMHg3RjA0MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsCisweDY0NENCRkVBLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHhBMDAxNkNGNiwgMHg3NjAxNjY0MywgMHgyMjI4NjI2MCwgMHgzNjQ4OEJGQiwKKzB4NjU2M0FGRTQsIDB4NjI1MzJGRTYsIDB4Njc1Mzc1MDcsIDB4RUUwQUUxMDgsCisweEM5MEY2MDQzLCAweDMwRTI0NDA5LCAweDQ0MDk2NTAzLCAweEU2Mzc4RDAxLAorMHgzNjVDRTYzMCwgMHgyNzYwNDExMCwgMHg3N0ZGOEZGMiwgMHg4MDI4RTAwMCwKKzB4NkVGNjAwMEIsIDB4RTAwMDAwMEIsIDB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsCisweDYyNTM3RkVDLCAweDY1RjM2RTQzLCAweDY0MjNCRkRDLCAweDY0RTNCRkQxLAorMHg2NEYzQkZDRiwgMHhCRkNDRDQwNCwgMHg3RjE0MDAwOSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAxQzAwMDQsIDB4MDAyMDJBQzQsIDB4RTExMEQ1QTEsCisweEU2NDA2MDUwLCAweDI1MDBDOUZELCAweEUwRkY3NUU5LCAweDgwNTE2NDUzLAorMHg4MDUzODA1MiwgMHg4MDU2ODA1NSwgMHgyNTEwNzVFRiwgMHhFMUVGNjI1MCwKKzB4MjIxOUUwMDEsIDB4RTcyMDI1MjAsIDB4MjQ2MDgwNTIsIDB4MjU3MDAwMEIsCisweEU0RkRENTk1LCAweEU3MDI2MTUyLCAweDI1MTIyMTQ5LCAweDc0MDE2MDUyLAorMHgyNTAyQ0IwMSwgMHhEMTkxNjY1MiwgMHgyNTYyMjY0OSwgMHg5MkM0NjAxMiwKKzB4MjEwMkNCMDgsIDB4QzlDRjYwMTIsIDB4NjAxMjIxMDIsIDB4MjEwMkNCMDMsCisweDAwMEIxMTcyLCAweDRGMjIxMTIzLCAweEQ3OEFENTg5LCAweEQ0OEJEMjhBLAorMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwgMHhCRkJGMjIxMCwgMHhBRkQ3MjQ2MSwKKzB4NjY0QzRGMjYsIDB4NDYwMEQyODYsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsCisweDY1NEMyNjAwLCAweDQ1MDBEMjgyLCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLAorMHgyNTYwMDAwQiwgMHhEMjdGNjY0QywgMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwKKzB4MjYwMDAwMEIsIDB4RDI3QjY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsCisweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc1LCAweDYwNjAzNjJDLAorMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3MSwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI2RTY2NEMsIDB4MzYyQzQ2MDAsCisweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkE2NTRDLCAweDM1MkM0NTAwLAorMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwgMHg0MjAwRDY2NCwKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQ2NjA2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2NDRDNjAwQywgMHg3NEZGRDE1QiwgMHg2MjQwMzQxQywKKzB4NjAyQzAwMEIsIDB4NjQ0Q0QxNTksIDB4NjI0MDM0MUMsIDB4NjAyQzAwMEIsCisweDRGMjIyRkU2LCAweEU2MEE2NTVDLCAweDhEMTUzNTY3LCAweEJGRUE2RTQzLAorMHg2NDBDNjQ1MywgMHg4ODAxNjBFQywgMHhFMDBGOEIwMiwgMHgyNDA5QTAwMiwKKzB4NDQwOTQ0MDksIDB4RTYwQTYyNEMsIDB4ODkwNTMyNjMsIDB4NjQ0Q0JGRTIsCisweDYwMjM2MjBDLCAweDhCMDBDODgwLCAweDYwMjNFMjAwLCAweDAwMEI0RjI2LAorMHg0RjIyNkVGNiwgMHg2MDYyRDY0NiwgMHg4QjAzODgwMSwgMHgwMDA5QjI0MSwKKzB4MDAwOUEwMDMsIDB4RTY0MEQyNDMsIDB4RDY0MzIyNjAsIDB4NEYyNkUyMDAsCisweDI2MjIwMDBCLCAweEQ2M0U0RjIyLCAweDg4MDI2MDYyLCAweEIyOEI4QjAxLAorMHhENjNEMDAwOSwgMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENDM5RDUzOCwKKzB4RTcwMUUxMDAsIDB4MDAwQjI1MTIsIDB4MEZGRjI0NzAsIDB4RTYwNEQyMzUsCisweDIyNjAwMDBCLCAweEQ0MzU0RjIyLCAweDQxMEJEMTM1LCAweEQ1MjUwMDA5LAorMHg2NjUwRTFGRCwgMHgyNjE5RDIzMywgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwKKzB4NEYyMjIyNzAsIDB4RDEyRUQ0MzAsIDB4MDAwOTQxMEIsIDB4RTdGQkQ1MUQsCisweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweDRGMjIyNTYwLCAweEQxMjhENDJCLAorMHgwMDA5NDEwQiwgMHhFN0Y3RDUxNywgMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwKKzB4RDUxNDI1NjAsIDB4NjI1MDk0MjUsIDB4MDAwQjIyNDksIDB4RDUxMTI1MjAsCisweDYyNTBFNEJGLCAweDAwMEIyMjQ5LCAweDRGMjIyNTIwLCAweDg1MjJEMjIwLAorMHgyMDA4NjAwRCwgMHg4ODAxODkxMSwgMHg4ODAzODkzQywgMHg4ODA1ODkzRSwKKzB4ODgwNjg5NDAsIDB4ODgwODg5NDYsIDB4ODgwOTg5NEMsIDB4ODgwQTg5NTIsCisweDg4MEI4OTU4LCAweEEwNjU4OTVFLCAweEIwNjcwMDA5LCAweEEwNjIwMDA5LAorMHhGRjdGNjAwQywgMHgwMDFFMTAyOCwgMHgwMDFFMjE0OCwgMHgwMDFFMTEwOCwKKzB4MDAyMDI5REMsIDB4MDAyMDI5REUsIDB4MDAyMDI5RTksIDB4MDAyMDI5QzAsCisweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDMwLCAweDAwMUUxMDkwLAorMHgwMDIwMjlFNCwgMHgwMDFFMTAwQiwgMHgwMDIwMjlFMCwgMHgwMDIwMkFDOCwKKzB4MDAyMDBGNzIsIDB4MDAyMDI5RTgsIDB4MDAyMDJBRDQsIDB4MDAyMDJBRTQsCisweDAwMjAyOUI0LCAweDAwMDlCMDRDLCAweDYwMENBMDM1LCAweDAwMDlCMDU2LAorMHg2MDBDQTAzMSwgMHg2MjYwRDY3QywgMHg4QjJCMjIyOCwgMHgwMDA5QjA2MiwKKzB4NjAwQ0EwMjksIDB4NjI2MEQ2NzgsIDB4OEIyMzIyMjgsIDB4MDAwOUIwNkEsCisweDYwMENBMDIxLCAweDYyNjBENjc0LCAweDhCMUIyMjI4LCAweDAwMDlCMEI0LAorMHg2MDBDQTAxOSwgMHg2MjYwRDY3MCwgMHg4QjEzMjIyOCwgMHgwMDA5QjBCQSwKKzB4NjAwQ0EwMTEsIDB4NjI2MEQ2NkMsIDB4OEIwQjIyMjgsIDB4MDAwOUIxMUEsCisweDYwMENBMDA5LCAweDYyNjBENjY4LCAweDhCMDMyMjI4LCAweDAwMDlCMTMyLAorMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhEMjY0RDE2MywKKzB4RDU2NDg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2MzAxMkQsIDB4NjExQ0U0MDMsCisweEQ2NjJFMjBGLCAweDI3MTIyNTQwLCAweEUwMDEyNTIwLCAweDI2MDIwMDBCLAorMHhFNjAxRDI1QSwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNiwgMHhFMDAwRDI1OCwKKzB4ODEyMkQ2NUEsIDB4MjYwMkUwMDEsIDB4MDAwOTAwMEIsIDB4ODUyM0QyNTMsCisweDIwMDg2MDBELCAweDg4MDE4OTA1LCAweEQ2NTU4QjBBLCAweENCMDE2MDYwLAorMHhENjUyMjYwMCwgMHhFMTAxRDQ0RSwgMHgyNjEyRTAwMSwgMHg4MTQyMDAwQiwKKzB4RTAwMDAwMEIsIDB4RTUwMUQxNDksIDB4NDUxODg1MTMsIDB4MzQ1MzY0MEQsCisweDhEMDU2NjAzLCAweEQyNEJFMDAwLCAweEUwMDFENTQ4LCAweDI1MDIyMjYwLAorMHgwMDA5MDAwQiwgMHhEMTQxNEYyMiwgMHg2NTBEODUxMywgMHg0NDE5NjQ1MywKKzB4NjcyRTYyNDksIDB4NjAyQzIyN0QsIDB4ODkwOTg4MDEsIDB4ODkwQzg4MDIsCisweDg5MTA4ODAzLCAweDg5MjY4ODA2LCAweDg5Mjk4ODA3LCAweDAwMDlBMDM4LAorMHhENjNFRDUzRCwgMHhBMDI3RTIxMiwgMHg2MjVDMjY1MiwgMHg4QjJGMjIyOCwKKzB4QTAxRUQ2M0IsIDB4NjA1QzYyNjIsIDB4ODkwNTIwMDgsIDB4ODkwODg4MTAsCisweDg5MEI4ODIwLCAweDAwMDlBMDI0LCAweEQ2MzRENDM2LCAweEEwMTNFMjA0LAorMHhENzM1MjY0MiwgMHhFMjBDRDYzMSwgMHgyNjcyQTAwRSwgMHhENjJGRDUzMywKKzB4QTAwOUUyMTgsIDB4RDQzMjI2NTIsIDB4RTIwQUQ2MkMsIDB4MjY0MkEwMDQsCisweEQ2MkFEMjMwLCAweEUyMkUyNjIyLCAweEQ0MkY4NTE1LCAweDMyNzc2NzBELAorMHg4RjAxMjQyMSwgMHgyNDUxNjUwMywgMHgwMDA5QjBEQiwgMHhFMDAxQTAwMSwKKzB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RTEwMUQ2MUEsIDB4MjYxMEQ0MjcsCisweEQ3MTk2NTQxLCAweDY1NUREMTE5LCAweEUwMDFFMjBGLCAweDI2MjAyNzUyLAorMHgyMTAyMDAwQiwgMHg0RjIyMkZFNiwgMHg4NTIzRDIxMCwgMHgyNDQ4NjQwQywKKzB4RDYxRThCMDgsIDB4RTIwMEQ1MTIsIDB4ODQ1MTI2MjEsIDB4MjA0OTk0MTIsCisweDgwNTFBMDUwLCAweDYwRTBERTBFLCAweDhEMzVDODQwLCAweDM0MjdFMjAxLAorMHhEMTE2ODk0QywgMHg0MjBCRDIxNiwgMHhENTE2MjE0MSwgMHhDQjA0NjA1MiwKKzB4MjUwMkEwMzUsIDB4MDAwMEZGN0YsIDB4MDAyMDI5RTksIDB4MDAyMDI5QjQsCisweDAwMjAyOUMwLCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAyOUUwLAorMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDIwMkM0MCwgMHgwMDIwMjlDOCwKKzB4MDAyMDI5RDAsIDB4MDAyMDJDQUUsIDB4MDAyMDJDQjIsIDB4MDAyMDJDQkUsCisweDAwMjAyQ0Q2LCAweDAwMjAyQ0UwLCAweDAwMjAyOUNDLCAweDAwMjAyOURBLAorMHgwMDIwMURCNiwgMHgwMDFFMTEwOCwgMHg4OTE3MzQyNywgMHhENzk0RDI5MywKKzB4MjI0MTQ3MEIsIDB4RTVGQkQ2OTMsIDB4MjE1OTYxNjIsIDB4ODRFMTI2MTIsCisweEIwRkZDQjgwLCAweDYwRTA4MEUxLCAweENCMDRENjhGLCAweDYwNjAyRTAwLAorMHgyNjAwQzkzRiwgMHhFMDAxRDY4RCwgMHgyNjAyQTAwMSwgMHg0RjI2RTAwMCwKKzB4NkVGNjAwMEIsIDB4NjA2MEQ2OEEsIDB4ODkxOUM4ODAsIDB4NjAyMUQyODMsCisweDhCMTU4ODAxLCAweEU1MDFEMjg3LCAweDMwNTY4NTI0LCAweEQxODY4OTEwLAorMHhENDg2RTIwMywgMHg2NTQxMjEyMCwgMHg2NTVERTAwQiwgMHhENTg0MDY1NiwKKzB4RTcwMkU0MEYsIDB4MjU3MTIxNDAsIDB4RTAwMUQ3N0MsIDB4MjcwMjAwMEIsCisweEUwMDAwMDBCLCAweDRGMjIyRkU2LCAweDg0RTFERTdFLCAweDg5MzRDODgwLAorMHg4NTU0RDU3OCwgMHg4RjMwMjAwOCwgMHhENzdCNjEwMywgMHg2NjcyODU1MywKKzB4NjUwQzY0MDMsIDB4NjIwQzg1NjYsIDB4OEIyNjM1MjAsIDB4RDc3M0Q2NzcsCisweDY0NEM2NTFDLCAweDI3NDEyNjUxLCAweEM4NDA2MEUwLCAweEQyNzQ4OTA3LAorMHgwMDA5NDIwQiwgMHg2MDYyRDY2NywgMHhBMDA4Q0IwNCwgMHhEMTY0MjYwMiwKKzB4MDAwOTQxMEIsIDB4RTVGQkQ2NjMsIDB4MjQ1OTY0NjIsIDB4QjBBMTI2NDIsCisweEQ1NjIwMDA5LCAweDI1MjJFMjAxLCAweEQ3NUY2MEUwLCAweDJFMDBDQjA0LAorMHhDOTNGNjA3MCwgMHhBMDAxMjcwMCwgMHhFMDAwNjAyMywgMHgwMDBCNEYyNiwKKzB4MkZBNjZFRjYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4RTI0MERBNUMsCisweERDNTk2NkExLCAweDMxMjM2MTZELCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLAorMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwgMHhEQjVCRDQ1QSwgMHhFNzAwQTAwRiwKKzB4NzcwMTY2QjIsIDB4NzEwMjYxNjMsIDB4NjU2MTJCMTIsIDB4NzEwMjY2MTMsCisweDYyNjEyQjEyLCAweDYyMkQ2NTVELCAweDMyNUM0MjI4LCAweDYyN0MyNDIyLAorMHg4QkVEMzJFMywgMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHhFRDA3NkVCMiwKKzB4NzEwMjYxRTMsIDB4NjcxMzJCMTIsIDB4NjJFMTcxMDIsIDB4NjU3MTJCMTIsCisweDY1NUQ2MjJELCAweDM1MkM0NTI4LCAweEEwMEMyQ0QwLCAweDg4MDIyNDUyLAorMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwKKzB4Njc3RDY3NjEsIDB4RUIwRjI0NzIsIDB4NkRBMTJDQjAsIDB4OEIwNTJERDgsCisweEQ0MzJEMjNFLCAweEUxMDFFRTAwLCAweDI0MTIyMkUyLCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzMCwKKzB4NjE2RDY2RDEsIDB4ODkwMDMxMjMsIDB4NjcyQzYyNjMsIDB4REUzMjM2NzgsCisweDJENjE3NzAzLCAweEQ2MkY0NzIxLCAweDQ3MjE2NEUyLCAweEUxMDBBMDBFLAorMHg3MTAxNjU2MiwgMHgyNDUwNjI1MywgMHg0MjE5NzQwMSwgMHg3NDAxMjQyMCwKKzB4MjQ1MDQ1MjksIDB4NDUxOTc0MDEsIDB4NzQwMTI0NTAsIDB4MzI3MzYyMUMsCisweDQyMDA4QkVFLCAweDY0RDE2NkUyLCAweDM2MkM0MjAwLCAweDhGMDYyNDQ4LAorMHhERDIyMkU2MiwgMHhFNTAwREUxNSwgMHgyRDUyRTcwMSwgMHg2RUY2MkU3MiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RUUwMTRGMjIsIDB4RUQwQUEwMDUsCisweDY0RTNCQzk3LCAweDY0RTNCQzlELCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LAorMHhFRTAxQTAwNSwgMHg2NEUzQkM5RSwgMHg2NEUzQkNBNCwgMHg2MkVDN0UwMSwKKzB4OEJGNzMyRDcsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAyMDI5REEsCisweDAwMjAxRUMyLCAweDAwMUUxMTA4LCAweDAwMUUxMDE1LCAweDAwMjAyOUUwLAorMHgwMDFFMTAwMSwgMHgwMDIwMjlCNCwgMHgwMDFFMTEwMCwgMHgwMDIwMjlERSwKKzB4MDAyMDI5Q0MsIDB4MDAxRTEwMDAsIDB4MDAyMDI5RDAsIDB4MDAyMDI5REMsCisweDAwMjAxREI2LCAweDAwMUUxMDBDLCAweDAwMjAyOUM4LCAweDAwMjAyOUU0LAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDYwRDY0QywgMHg4OTQ4ODgwMSwKKzB4RTEwMUQ0NEIsIDB4RDc0Qjg1NDgsIDB4NjUwRDI2MTAsIDB4NDUxOTYwNzAsCisweDY2NTlERDQ5LCAweDYxRDM2MjZFLCAweEM4NDAyNjJELCAweDc0MDI3MTAyLAorMHg4RDFBRDc0NiwgMHhEMjQ2NjY2QywgMHhFNTAxREU0NiwgMHhBMDA0MkUyMiwKKzB4NjI0NUVFMDQsIDB4MjEyMTc1MDEsIDB4NjI1QzcxMDIsIDB4OEJGODMyRTMsCisweDgxRDQ2MDYzLCAweEQ1NDBFNjAxLCAweDYyNkNFNDE3LCAweDg5MUUzMjQzLAorMHg3NjAxNjI1NSwgMHhBRkY4MjcyMSwgMHhEMjNDNzcwMiwgMHhFNTAxREUzOSwKKzB4QTAwNDJFMjIsIDB4NjI0NUVFMDQsIDB4MjEyMTc1MDEsIDB4NjI1QzcxMDIsCisweDhCRjgzMkUzLCAweDgxRDQ2MDYzLCAweEQ1MzVFNjAxLCAweEU0MTdBMDA0LAorMHg3NjAxNjI1NSwgMHg3NzAyMjcyMSwgMHgzMjQzNjI2QywgMHg5MjRCOEJGOCwKKzB4RDQzMDJEMjEsIDB4NjE0MkQ3MzAsIDB4NjVGMjJGMTIsIDB4NjA1MzZERjIsCisweDI3MDBDOTgwLCAweEM5NjA2MDUzLCAweDgwNzE2MTAzLCAweDZFRjI2MDUzLAorMHhDOTAzNjVGMiwgMHg0NTI5NEQxOSwgMHg2MERDODA3MiwgMHg4MTcyNDUxOSwKKzB4NjA1QzRFMjksIDB4NDAxODYyRUMsIDB4ODE3MzMwMkMsIDB4MjExODZENDIsCisweDZFRjIyRkQyLCAweDY2RjI2MkYyLCAweDQ2Mjk0MjE5LCAweDY2RjI2NTZDLAorMHg2NEVDNjAyQywgMHg0NjI5NDAxOCwgMHg0NjE5MzA0QywgMHg2MDZDODE3NCwKKzB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDQkYsIDB4MjIyODYyMEMsCisweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLCAweDAwMDlCMDBBLAorMHgwMDA5QTAwMywgMHhFMjAyRDYxMSwgMHg3RjA0MjYyMiwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsIDB4MDAyMDI5RTgsCisweDAwMjAyQzQwLCAweDAwMUUxMDAwLCAweDAwMjAyQ0Q2LCAweDAwMjAyQ0UyLAorMHgwMDIwMkM1MiwgMHgwMDIwMjlEMCwgMHgwMDIwMkM4MiwgMHgwMDIwMkM4MCwKKzB4MDAyMDJDNTQsIDB4MDAxRTEwMEMsIDB4MDAyMDI5QjQsIDB4MDAyMDI5RTAsCisweDRGMjIyRkU2LCAweERFOTA3RkZDLCAweDIwMDg4NEU5LCAweDJGMDA4RDA2LAorMHhENjhGRDQ4RSwgMHgwMDA5NDYwQiwgMHg2NEYwQjE0NiwgMHg2NjIwRDI4RCwKKzB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFODc0RjIyLCAweDYwRTBENjg3LAorMHhDQkMwRDQ4NywgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwKKzB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4MTYxNkQsCisweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELAorMHhEMjdEOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwKKzB4NkVGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REM3MjdGRkMsCisweDg0QzJEMjc2LCAweENCNDBERDc2LCAweDgwQzI0MjBCLCAweDhEMDQyMDA4LAorMHg2MkUwNkUwMywgMHhBMDA2NjQyQywgMHhENjZBNzQwNCwgMHg2MTYwRDQ3MSwKKzB4NDcwQkQ3NzEsIDB4NjQ0RDY1MUMsIDB4NDUyMTY1NDMsIDB4QTAwNDQ1MjEsCisweDYyRTZFNjAwLCAweDJGMjI3NjAxLCAweDYyNkQyRDIyLCAweDhCRjgzMjUzLAorMHhDOTAzNjA0MywgMHg4OTEyMjAwOCwgMHg4OTA1ODgwMywgMHg4OTA2ODgwMiwKKzB4ODkwNzg4MDEsIDB4MDAwOUEwMDgsIDB4QTAwNUUwMDcsIDB4RTAwMzgwRDgsCisweDgwRDhBMDAyLCAweDgwRDhFMDAxLCAweDJGMjI2MkUyLCAweEUwMEYyRDIyLAorMHg4MEQ4RDY1RSwgMHhDQjA4NjA2MCwgMHg2MEMwMjYwMCwgMHgyQzAwQzkzRiwKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNTY0RjIyLCAweDZFNDM2RDczLCAweDQyMEI2QjUzLAorMHgyMDA4NkM2MywgMHg2NDAzOEYwOCwgMHhEMjQ1RDQ1MiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4MjRFMDYwQjMsIDB4NjBDMzgwNDEsCisweEEwMDc4MTQxLCAweDY1NURFNTAwLCAweDAwREM2MDUzLCAweDMyNEM2MjUzLAorMHg4MDI0NzUwMSwgMHg2RUVDNjI1RCwgMHg4QkY0MzJFMywgMHg2MDYwRDYzNiwKKzB4MjYwMEM5QkYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLAorMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywKKzB4RTQwOEJGQkMsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4RDIzN0QxMzYsCisweEU0MDU2MDEyLCAweEU1MDBDQjIwLCAweDIyNDIyMTAyLCAweDIyNTIwMDBCLAorMHhENTM0RDEzMywgMHhFNDAwRDczNCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDUzMjI3MjIsIDB4OTYzNUQ3MzIsIDB4MTU0MTI1NzIsIDB4OTYzMjE1NjIsCisweEU2MDExNTY1LCAweEQ1MkYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDUxNjMwNjAxLCAweDAwMUUxMDE3LCAweDAwMjAyQUYwLAorMHgwMDIwMEY3MiwgMHgwMDIwMjlCMCwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwKKzB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsIDB4MDAyMDAxMDAsIDB4MDAyMDIwMUEsCisweDAwMUUxMEY4LCAweDAwMjAyQUY0LCAweDAwMjAwRkJDLCAweDAwMUUxMEFFLAorMHgwMDIwMUZEQywgMHgwMDIwMkIxMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsCisweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHhDODIwNjA0MywgMHg2RTQzOEQwMiwgMHgwMDA5QkVCQiwgMHhDODEwNjBFMywKKzB4QkVCODg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFREEsCisweEM4MDE2MEUzLCAweEREMzc4OTM2LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLAorMHg0NjBCRDYzNSwgMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzMywKKzB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsCisweEM4MDE2MDIzLCAweEQ2MkU4OTA0LCAweDAwMDk0NjBCLCAweDAwMDlBMDA1LAorMHg4OTAyQzgwOCwgMHg0NjBCRDYyQiwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMjksIDB4RDUyOTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyODhCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMjU4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhENjIyODkyRSwgMHg2MEUzNkU2MCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjAsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjFFLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjFDLAorMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwgMHg0MTBCRDExQSwgMHhCRjE1MDAwOSwKKzB4QkYxRDAwMDksIDB4RDUxODAwMDksIDB4NjA1MEQ0MTgsIDB4QzkwOEQ3MTgsCisweEJGNTQyNTAwLCAweDYwRTMyNDcyLCAweDg5MDVDODA4LCAweDdGMDREMjE1LAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxRTEwMjEsIDB4MDAyMDExODIsIDB4MDAyMDExQTQsCisweDAwMjAxN0IwLCAweDAwMjAxMUJDLCAweDAwMjAxMUNDLCAweDAwMjAyOUUwLAorMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMTIyMiwgMHgwMDIwMTIyRSwKKzB4MDAyMDExRDQsIDB4MDAyMDExRjIsIDB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsCisweDEyMzQ1Njc4LCAweDAwMjAxMjBBLCAweEQ2QTg2NDRDLCAweDM0NkM3NEZGLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNiwgMHgwMDBCMzQ2QywgMHhENkE1MjQ1MCwKKzB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjE2RDYyNUMsIDB4NDExOTQyMDgsCisweDYwMTk0MjA4LCAweDY0NEM0MjAwLCAweDMyNEM2NzBFLCAweDIwN0REMTlFLAorMHhDOTBGNDIwMCwgMHgwMDBCMzIxQywgMHg2NzYzMjIwMCwgMHg0MjA4NjI1QywKKzB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQxOTgsIDB4MDAwQjMyMUMsCisweDJGRTYyMjcwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLAorMHgyNzI5RTI5RiwgMHg2NTczNkU1MywgMHg0NzE5Njc2RCwgMHg2NzJFNjI3OSwKKzB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsCisweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDBFMUEwNDY3LCAweDIxNTAyNUVCLAorMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwKKzB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsCisweEU1MEY4QjczLCAweEU0MDFCRkEwLCAweEJGQTNFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkZBMywgMHhCRkEwRTQwMSwgMHhFNjAyRTUwNiwKKzB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUUsIDB4RTQwMTg1RjIsCisweEJGQUE2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLAorMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY3RSwgMHhCRjgxRTQwMiwKKzB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODEsIDB4NDYxOEU2MDIsCisweDgxRjY2MDYzLCAweEJGN0ZFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLAorMHhFNTAwQkY4QiwgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwKKzB4RTAxMDY1NUMsIDB4QkY1RkU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjIsCisweDA1RkNFMDEwLCAweEJGNjJFNDBFLCAweEU1MDA3NTg1LCAweEJGNjNFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjcwRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywKKzB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0NUU0MDQsIDB4RTQwRjBGNTQsCisweEU1MDRCRjQ4LCAweDA1RkNFMDE0LCAweEJGNDhFNDBGLCAweEU1MDE3NTg0LAorMHhCRjQ5RTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU2RTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsCisweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLAorMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwKKzB4RTQwMUJGMUEsIDB4QkYxREU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRjFELCAweEJGMUFFNDAxLCAweEU0MDFFNTA2LCAweEJGMUI2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjI4NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywKKzB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRDYwNTMsIDB4RTQwMjgwRjQsCisweEU1MTJCRjAwLCAweEU0MDI4NEY0LCAweEJGMDA3MDkwLCAweEU2NDA2NTAzLAorMHhCRjAxRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBFRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFM0U0MDMsCisweEU1MTM4MEY4LCAweEU0MEVCRUU2LCAweEU0MEU4NEY4LCAweEJFRTY3MDg1LAorMHhFNTAwNjUwMywgMHhCRUU3RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY0RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsCisweEJFQzlFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNDLCAweEU0MEY4NEZDLAorMHhCRUNDNzA4MywgMHhFNTAxNjUwMywgMHhCRUNERTY0MCwgMHhFNTAxRTQwNCwKKzB4QkVEQUU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsCisweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDMwLAorMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwKKzB4MDAyMDI5REEsIDB4MDAyMDI5REMsIDB4MDAyMDI5REUsIDB4RDIxREQxMUMsCisweDY2MjA2MDEwLCAweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLAorMHg2NzEwNjIxMCwgMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwKKzB4NDQwODQ0MDgsIDB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsCisweDQ0MDgyNjIwLCAweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLAorMHhFNjAwOEQxMywgMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywKKzB4Mzc1ODQ3MDgsIDB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsCisweDI0MDBDOTBGLCAweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLAorMHgwMDIwMjlBRiwgMHgwMDIwMjlBRSwgMHgwMDIwMjlCMCwgMHgwMDIwMjVENCwKKzB4N0ZGQzRGMjIsIDB4RTY4MEQxOUQsIDB4NjY2QzYyMTIsIDB4RDI5QzJGMjIsCisweDY3RjM2NTYzLCAweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LAorMHhFNjgwMDAwOSwgMHhEMjk2NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwKKzB4RTY4MDY0NzMsIDB4RDI5MjY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsCisweDJGQjY2NDczLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDREMThFRDAxLAorMHhEQjhEREM4QywgMHg2NUMyNTJDMSwgMHg4OTIwMzUyMCwgMHhDOTAzNjA1MSwKKzB4ODkxQzg4MDEsIDB4RDE4OURFODcsIDB4NjRFMzQxMEIsIDB4ODUwMzY1MDMsCisweDY3MEQ2NkIyLCAweDg5MDczNzYyLCAweEQyODZENDg1LCAweDAwMDk0MjBCLAorMHhFNzAxRDE4NSwgMHgyMTcyQUZFNiwgMHhERTg0NjRFMywgMHgwMDA5NEUwQiwKKzB4RDQ4NEQ2ODMsIDB4NDEwQkQxODQsIDB4QUZEQjI2RDIsIDB4NEYyNjAwMDksCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDRGMjI2QkY2LCAweDg1NDY3RkY0LAorMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwgMHg4MUYyRDI3MCwKKzB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsIDB4NjU2MzYwNTMsCisweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LCAweDJGODYwMDA5LAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwKKzB4REM2RUUyMDAsIDB4MkYyMUExMzYsIDB4REQ2RDZBMTMsIDB4RTAwMTRBMDgsCisweDREMEJEOTZDLCAweDNBOUM0QTAwLCAweDFGOTE3OTMwLCAweDY2QzIxRjAyLAorMHgzNjIwNTJDMSwgMHhBMTIxOEIwMSwgMHg2MDYxMDAwOSwgMHg4ODAxQzkwMywKKzB4QTExQjhCMDEsIDB4ODU2MTAwMDksIDB4ODk3N0M4MDEsIDB4ODVEMjVENjMsCisweEM5MDM2NjAzLCAweDg1RDM2NDAzLCAweDYwNTM2NTBELCAweDQwMjE0MDIxLAorMHg0NTAwQzkzRiwgMHgzMjJBNjEwMywgMHg2MDUzMjUyRCwgMHhDOTAxRTIxMCwKKzB4RDk1NTMxMjMsIDB4NkUwMzhEMjEsIDB4NDQwOEQ3NTcsIDB4NDQwODY1NzAsCisweDQ0MDA2MjEzLCAweDI1NTg0MjAwLCAweDM0MkM4RjBFLCAweDYwNDNEMjUzLAorMHg2MEUzMDcyRCwgMHg0QjE5NkI3RCwgMHg2NThFNjhCOSwgMHgyODVEODgwMSwKKzB4NkI3QzhGMEIsIDB4NkIxM0EwMDksIDB4NjA0M0QyNEQsIDB4NjFFRDBFMkQsCisweDY4MTk0MTE5LCAweDI4N0Q2NzhFLCAweEQxNEE2QkVDLCAweDIyMjg2MjEyLAorMHhFQkZGODkwMSwgMHhFRUZGNkJCQywgMHg2RUVDNjVCRCwgMHg4QjBGMzVFMCwKKzB4NEQwQkREMzYsIDB4NTQwMzY0QzMsIDB4QkY3NkU1MDIsIDB4RDQ0MjZEMDMsCisweDQxMEJEMTM2LCAweEQ3NDE2NUQzLCAweEQ0NDFFRTAxLCAweDI3RTJBMDFELAorMHgyNkU5RUVGQywgMHg4MUQyNjA2MywgMHg5MTRFODVEMywgMHg4MUQzMjAxOSwKKzB4NDUwODg1RDIsIDB4ODFEMjIwOEIsIDB4RTIwODg1RDMsIDB4ODFEMzIwNUIsCisweDQyMTg4NUQ0LCAweDgxRDQyMDJCLCAweDg1NDE2NEMyLCAweDgxNDEyMEU5LAorMHhENDM0NjVDMiwgMHhDQjAxNjA1MSwgMHg0OTBCMjUwMSwgMHg2MEMyMDAwOSwKKzB4NTJGMjU2RjEsIDB4MkEwMkNCMDEsIDB4MjYyMkFGNzksIDB4NDIwQkQyMUIsCisweDVFMDM2NEMzLCAweDg1RTE2RDAzLCAweDYwNTM2NTBELCAweDg5N0JDODIwLAorMHg2MjEwRDEyOSwgMHg4QjExMjIyOCwgMHhENzI3ODVFRiwgMHg0MjIxNjIwRCwKKzB4NDIyMTQyMjEsIDB4RTUwMUQ2MjUsIDB4Mjc1MDQyMjEsIDB4RDcyNUQ5MjQsCisweDI2MjFENDI1LCAweDI5NjBFNjAwLCAweDI0NjEyNzYyLCAweDg1MjE2MkMyLAorMHg4QjQzQzgwMiwgMHhEOTEyRDcxRSwgMHhFMDAxNjI3MCwgMHg2MTJDNDkwQiwKKzB4NjY5MkQ5MUMsIDB4QTAzRTI2MEIsIDB4N0UwMzI5NjIsIDB4MDAxQzNEOUMsCisweDAwMjAxQTNDLCAweDAwMjAyNUNDLCAweDAwMjAyOTk0LCAweDAwMjAwRDQyLAorMHgwMDIwMjU5NCwgMHgwMDIwMERDNCwgMHgwMDFFMjEzMCwgMHgwMDIwMEQ2MCwKKzB4MDAxQzNEMzAsIDB4MDAyMDJDMjgsIDB4MDAyMDBGNzIsIDB4MDAyMDI1QTQsCisweDAwMjAyNDhDLCAweDAwMUMzRDAwLCAweDAwMjAyQzNDLCAweDAwMjAyQjI4LAorMHgwMDIwMkJBOCwgMHgwMDIwMjlBOCwgMHgwMDIwMjU5QywgMHgwMDFFMjEyQywKKzB4MDAyMDJDMkMsIDB4MDAyMDJDMzAsIDB4MDAyMDJEMTAsIDB4MDAyMDI5RUUsCisweDAwMjAyOUVDLCAweDAwMjAyOUYwLCAweDAwMjAyOUY0LCAweEUwNENEMTM5LAorMHg3MjAxMDIxRSwgMHhEOTM4MDEyNiwgMHg2MjkwRDQzOCwgMHg3MjAxNjU0MSwKKzB4MjkyMDc1MDEsIDB4ODVFMTI0NTEsIDB4NDYxOEU2NDAsIDB4ODkxRDIwNjgsCisweEQ5MzRENzMzLCAweDY2NUQ2MTcxLCAweDY1OTJENzMzLCAweDY0MUQ0NzBCLAorMHhFMjAwREUzMiwgMHgyRTIwQTAxMiwgMHhFOTA4ODVFNCwgMHg0OTE4NjIwMywKKzB4MzI5MDIyOTksIDB4RTUwMThCMDQsIDB4NjRFM0JFQjcsIDB4MDAwOUEwMDYsCisweDI1OThEOTJCLCAweEU1MDA4OTAyLCAweDY0RTNCRUFGLCAweEQyMkFENDI5LAorMHg2NUQzNDIwQiwgMHhFRTAxRDcyOSwgMHgyN0UyQUVEOSwgMHg3QzA4NjJGMSwKKzB4MkYyMTcyMDEsIDB4RUUwNDYyRjEsIDB4MzFFNzYxMkQsIDB4QUVDMzg5MDEsCisweDdGMEMwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHgyRkU2NjhGNiwgMHhEMjFENEYyMiwgMHg2MEUzNkUyMiwKKzB4OEQwMkM4NDAsIDB4QkUzMzIyRTIsIDB4RTI0MDAwMDksIDB4MkUyODQyMTgsCisweEJFM0U4OTAxLCAweDYwRTMwMDA5LCAweDg5MDVDODEwLCAweEQyMTZENDE1LAorMHgwMDA5NDIwQiwgMHgwMDA5QkUzRCwgMHhDODA1NjBFMywgMHhCRThFODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4QUUzQTRGMjYsIDB4NEYyNjZFRjYsCisweDZFRjYwMDBCLCAweDAwMjAyNTM4LCAweDAwMjAyOUVDLCAweDAwMjAyOUY0LAorMHgwMDIwMjlFRSwgMHgwMDIwMjlGMCwgMHgwMDIwMUFBMCwgMHgwMDIwMkQxMCwKKzB4MDAwMDgwMDAsIDB4MDAyMDI1OUMsIDB4MDAyMDBENjAsIDB4MDAxRTIxMkMsCisweDAwMUMzNTEwLCAweDAwMjAyQzM0LCAweDAwMjAwRjcyLCAweDA4MEEwQzBFLAorMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwKKzB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsCisweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLAorMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMjRCNiwgMHgwMDIwMjQ2QywKKzB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LAorMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywKKzB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsCisweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsCisweDAwMDAzQTU3LCAweDIwNzk2MTRELCAweDMyMjAzMDMzLCAweDIwMzczMDMwLAorMHgzMzNBMzIzMSwgMHgzODMxM0EzNywgMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwKKzB4MDAwMDAwNDMsIDB4NDI3MDczNzIsIDB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsCisweDIwMkM0QzRDLCAweDZFNDk2NzdBLCAweDRFNDk3Mjc0LCAweDZENzU0RTUxLAorMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwKKzB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsCisweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLCAweDAwM0Q3MjY0LAorMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwgMHg2RTZCNkU1NSwKKzB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsCisweDYxNDM3NzQ4LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDY2MjAyMDZFLAorMHgwQTZDNjk2MSwgMHgwMDAwMDAwRCwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwKKzB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4MjEyMTZDNjksCisweDAwMDAwRDBBLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLAorMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsCisweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsCisweDBBMEQ2Njc1LCAweDAwMDAwMDAwLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLAorMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwKKzB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksCisweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsCisweDAxMDkwMTA4LCAweDAxMEIwMTBBLCAweDAwMDMwMDAyLCAweDAyMDIwMjAxLAorMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwKKzB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwKKzB4MDAwMDAwNTksIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAyMDAwMTEyLCAweDQwRkZGRkZGLCAweDkxNzAwQ0YzLCAweDIwMTA0ODkwLAorMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAyMDAsIDB4MDAwMjgyMDUsCisweDA1MDcwMDAyLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAxMDA0MDAzLAorMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwKKzB4MDUwNzAwMDAsIDB4MDA0MDAyMDEsIDB4ODIwNTA3MDAsIDB4MDAwMDQwMDIsCisweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LCAweDAzMDQwMTAwLAorMHgwMzBDMDQwOSwgMHgwMDc5MDA1QSwgMHgwMDQxMDA0NCwgMHgwMzE4MDA1MywKKzB4MDA1MzAwNTUsIDB4MDAzMjAwNDIsIDB4MDAzMDAwMkUsIDB4MDA1NzAwMjAsCisweDAwNDEwMDRDLCAweDAwMDAwMDRFLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDcwOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xMTU0MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV8yay5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1XzJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlMmNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV8yay5jCkBAIC0wLDAgKzEsMTAxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAxNywgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4RDQ4ODc2MDEsIDB4NEUwQkRFODgsIDB4RDQ4ODAwMDksCisweDAwMDk0RTBCLCAweDRFMEJENDg3LCAweDdGMDQwMDA5LCAweEEwNTI0RjI2LAorMHg0RjIyNkVGNiwgMHg0MTBCRDE4NCwgMHhENDg0MDAwOSwgMHgwMDA5NDQwQiwKKzB4NDUwQkQ1ODMsIDB4RDc4MzAwMDksIDB4RDI4M0UxRkYsIDB4MjcxMjYxMUQsCisweEQ0ODI1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLAorMHhFNzIwMjQ1MiwgMHg0NzE4RDU3RSwgMHgyNTcyRDI3RSwgMHhEMTdFRTcwMCwKKzB4RDY3RkQ0N0UsIDB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RDI2MjAsCisweDI2NDFFNEZGLCAweEQ1N0NFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLAorMHg0MDAwNjI2RCwgMHg4RkY4MzIxMiwgMHhENTc4MDU0NSwgMHgyNTIwRTIwMSwKKzB4RDI3OEQ3NzcsIDB4RTQ4MEUxMDAsIDB4MjIxMjI3MTAsIDB4NjYxM0Q1NzYsCisweDY2NkQ2NDRDLCAweDc2MDQ2NzYzLCAweDM3NUM2MjZELCAweDhGRjgzMjQzLAorMHhENTcyMjcxMiwgMHhEMjczRDc3MiwgMHhFNDAwRTEwMSwgMHgyNzEwMjUxMSwKKzB4MDAwQjRGMjYsIDB4N0ZDQzIyNDIsIDB4RDE3MEQ1NkYsIDB4RDI3MURCNzAsCisweDFGNTFENDcxLCAweEQ2NzE3NTA4LCAweDFGMTJENzcxLCAweDFGNTU3MTBDLAorMHgxRkI5NzVGQywgMHg3MjA0MUYyQSwgMHgxRjEzRUIxMCwgMHgxRjU2MUY0NCwKKzB4MUY3ODFGNjcsIDB4RDg2QjFGMkIsIDB4REQ2Q0Q5NkIsIDB4REM2Q0VBMDAsCisweEQyNkRERTZDLCAweDg5MDAzQTIyLCAweEQxNUQ3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY4OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNTAsCisweDhCMTA4ODAxLCAweEU2NTBEMTRGLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkY5RDE0QiwgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY2Njc5MiwgMHgyMTcyNTJGNSwgMHhENjU1NTE5MSwgMHg1NUZBMjIxMiwKKzB4NTJGQjY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDA3REUyNjUyLCAweEM5MDM2MDcxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENDJCRDc0MSwgMHg2NzcyRDU0MSwgMHg1MTUzNjI0MiwKKzB4MzEyQzMyN0MsIDB4MjQyMjIyMjgsIDB4MTUxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxNjI3MjAxLCAweEQ2MjMyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc0LCAweDAwMjAzOUVDLCAweDAwMjAxOEEyLAorMHgwMDIwMzlGOCwgMHgwMDIwM0ExMCwgMHgwMDIwMTg2MCwgMHgwMDIwMTk2NCwKKzB4MDAyMDEyODgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOEVDLCAweDAwMjAzNDg0LCAweDAwMjAzOEY0LCAweDAwMjAzOTAwLAorMHgwMDIwMzkwQywgMHgwMDIwMzk2OCwgMHgwMDIwMzk2QywgMHgwMDIwMzkxNCwKKzB4MDAyMDM5MTUsIDB4MDAyMDM5MTgsIDB4MDAxMTc3MDAsIDB4MDAyMDM5ODQsCisweDAwMjAzOTgyLCAweDAwMjAzNEU4LCAweDAwMTE3NzEwLCAweDAwMUMzRDMwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDFDM0QwMCwKKzB4MDAxQzEwMDAsIDB4MDAxQzEwMjgsIDB4MDAyMDM0RkMsIDB4MDAyMDM5MUMsCisweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDdGRkZGRkZGLCAweDAwMjAxNzMwLAorMHgwMDIwMzMyMiwgMHgwMDIwMjMyQywgMHgwMDIwM0Q5QywgMHgwMDIwMzk2QSwKKzB4MDAyMDM0RjQsIDB4MDAyMDM5NUMsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNDhDLCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTk2MDAwOSwgMHgzNjIwNjIxMiwgMHhENDk1ODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxOTMsIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzhGLCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjhDNTdGMiwgMHg2MjIyNjA3MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkMsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHhDQjAxNTRGNywgMHhEMjdFNTVGMiwgMHhFNzAxMjQwMiwgMHhENDdGRTEwMCwKKzB4MjIxMTI1NzIsIDB4NzIwMTYyNDIsIDB4MjQyMkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNEZGRDU3NywgMHg2NDRENjc1MiwgMHg4QjEwMjc0OCwgMHg2MjcyRDc3NSwKKzB4OEIwQzMyNjAsIDB4NTFGMjU1RjcsIDB4RDI2REU3MDEsIDB4MjE3MjI1NjIsCisweEQ1NzFFMTAwLCAweDY0NTIyMjExLCAweEEwNzc3NDAxLCAweDUyRjMyNTQyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDI2QThCNkMsIDB4NjcyMjU0RjQsIDB4NzcwMUQ1NjksIDB4NjE0MjIyNzIsCisweDFGMUNFNjQwLCAweDQ2MTgyMTU5LCAweDhCMDMzMTYwLCAweDYyNjJENjY1LAorMHgyNjIyNzIwMSwgMHhFMjAwRDY1QSwgMHgyNjIxQjA2NywgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQyNUI4QjE2LCAweDY3MjI1NEY0LAorMHg3NzAxRDU1NywgMHg2MTQyMjI3MiwgMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwKKzB4OEIwMzMxNjAsIDB4NjI2MkQ2NTUsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2NDgsCisweDI2MjFCMDQzLCAweDAwMDlBMDEwLCAweEQ0NTJENTUxLCAweEQyNDQ2NzUyLAorMHhFMTAwNzcwMSwgMHgyNTcyM0E0NiwgMHgyMjExOEYwNiwgMHhFQTAwRDY0RSwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwMzEsIDB4MkZCMkQ1NEMsIDB4OTU3MzY2NTIsCisweEQ0NEE1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjJGLCAweEQxMkYyNjIxLCAweDIxMjFFMjAwLCAweEQxM0NFMjAxLAorMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwgMHgwMDA5QUUyQiwgMHg0NTBCRDUzOSwKKzB4RDEzOTAwMDksIDB4QUUyNEU2MDAsIDB4MkY4NjIxNjAsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLCAweERFMzREMTMzLAorMHg1NDExNjIxMiwgMHgxRjQxNjdFMiwgMHgyRjIyRDQzMiwgMHhENTMyMUY3MiwKKzB4RDIzMjY3NDMsIDB4NTg0MTc3OTQsIDB4Njk0MjVBNDIsIDB4NUIxNjZDNzIsCisweDYwNTI2RDIyLCAweENCMjBFNjAwLCAweEU1NDAyNTAyLCAweDYyNkQ3NjAxLAorMHg4QkZCMzI1MywgMHg1NUYxNjJGMiwgMHgxMTUxMjEyMiwgMHhENjI4NTVGMiwKKzB4MTQ4MTJFNTIsIDB4MjQ5MjE0QTIsIDB4MjdDMkQ0MjYsIDB4MjZEMjExQjYsCisweERBMjU2NzQyLCAweEU4MDFEOTI1LCAweDQ5MEIyQTcyLCAweEUyMDExQThDLAorMHgxQTJDNDIxOCwgMHg0RjI2N0YwQywgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4MDAwMDA3RDEsIDB4MDAyMDM5N0MsCisweDAwMjAzOTgwLCAweDAwMjAzOTg2LCAweDAwMUMzREMwLCAweDAwMTE3NzJDLAorMHgwMDFDM0I4OCwgMHgwMDIwMzk2NCwgMHgwMDExNzczQywgMHgwMDExNzc0NCwKKzB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsIDB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsCisweDAwMTE3NzZDLCAweDAxRkZGRkZGLCAweDAwMTE3NzRDLCAweDAwMjAzNEY0LAorMHgwMDIwM0Q5QywgMHgwMDIwMjRGMCwgMHgwMDIwMzk2QSwgMHgwMDFDM0I5QywKKzB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsIDB4MDAxQzU5NjAsCisweDAwMUM4OTYwLCAweDAwMjAzNEZDLCAweDAwMUMzRDAwLCAweDAwMjAxNjBDLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REU5NTdGQUMsIDB4NjFFMEUwMTQsIDB4MEYxNEQ0OTQsIDB4NzEwMTYxRTMsCisweEUwMTg2MjEwLCAweEQyOTIwRjI0LCAweDAwMDk0MjBCLCAweDQ1MEJENTkxLAorMHgyMDA4MDAwOSwgMHg4RjEyNkQwMywgMHhEMjhGMUYwNywgMHg2NzIwRDQ4RiwKKzB4NjU3Q0REOEYsIDB4NDcwQkQ3OEYsIDB4RDE4RjAwMDksIDB4NjE5QzY5MTAsCisweDQ2MDg2NjEzLCAweDM2MTg0NjA4LCAweDNENkM0NjA4LCAweEUwMTgxRkQ3LAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNSwKKzB4MDFGQ0UwMTQsIDB4REU4NUU1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweDgwOTQ3NTAxLCAweDMyNDM2MjVELAorMHhENjdGOEJGNCwgMHhBMzRFRTIwMCwgMHgyMDA4MjYyMSwgMHhFMDE0OEIxMywKKzB4RTQwMDAxRkMsIDB4QTAwOURFNzksIDB4NjQ0RDY3MUMsIDB4MzVFQzY1NDMsCisweDY5NDM2NjUyLCAweDM5REM2MjYyLCAweDc0MDQxOTIxLCAweDMyNzM2MjRELAorMHhBMzM4OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE0OEIxNywgMHhFNzAwMDFGQywKKzB4NkQxQzJENzAsIDB4REU2RDFGRDQsIDB4MzJEMzYyN0QsIDB4QTMyQThCMDEsCisweDY3N0QwMDA5LCAweDY2NzM2NUUzLCAweDYxNzM3NTA0LCAweDMxNUMzNkVDLAorMHg2OTEyNjQ2MiwgMHhBRkVGNzcwOCwgMHg4ODA0MjQ5MiwgMHhFMDE0OEIxOCwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNjAsIDB4OEIwMTMyNzMsCisweDAwMDlBMzExLCAweDY5NDM2NDRELCAweDM5RUM2MkUzLCAweDcyMDQ2NTkyLAorMHgzRDJDNkQ0MywgMHg2MTUyNjZEMiwgMHgyMTY5NzQwOCwgMHgyNTEyQUZFRCwKKzB4OEIxODg4MDUsIDB4MDFGQ0UwMTQsIDB4MkQ0MEU0MDAsIDB4REU1MzY3MUMsCisweDMyNzM2MjRELCAweEEyRjY4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2OTQzLAorMHg2NTkyMzlFQywgMHg2RDQzNzIwNCwgMHg2NkQyM0QyQywgMHg3NDA4NjE1MiwKKzB4QUZFRDIxNkIsIDB4ODgzMTI1MTIsIDB4RDQ0QThCM0EsIDB4NjE0NkQ5NEEsCisweDc1MDQ2NTQzLCAweDY3NTY2NDQyLCAweDZFNTMxRjQ4LCAweDY1NTI3RTA0LAorMHg3RUU0NjJFMiwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFOSwgMHg1RUY5MjlFMCwKKzB4N0UwNEQ5NDIsIDB4MUZFQTYwRTIsIDB4MjkwMEM5MDEsIDB4RDk0MDZFRTIsCisweDI5RTA0RTA5LCAweDJGNTYyRjI2LCAweDU2RkFEOTNFLCAweDY1MTM0OTBCLAorMHhEMTNEN0YwOCwgMHhFNzFDNkUwRCwgMHgxREUxMkQ3MCwgMHhERTNCNjkxMiwKKzB4NjRFMjFEOTIsIDB4MUQ0M0QxM0EsIDB4RDIzQTY1MTIsIDB4NjcyMjFENTQsCisweDFENzVEMjM5LCAweDFENjY2NjIyLCAweDYyNjJENjM4LCAweDFEMjdBMkFCLAorMHg4QjM5ODgzMCwgMHg2NTk2RDkyQiwgMHg2NzkyNjY5NiwgMHg2MTk2NzkwNCwKKzB4NzRFNDY0OTMsIDB4NkU0MzY5OTIsIDB4MUY5QjdFMDQsIDB4MUZFQzY0NDIsCisweEQ5MjU2RUUyLCAweDVFRkMyOUUwLCAweDdFMDREOTI0LCAweDFGRUQ2MEUyLAorMHgyOTAwQzkwMSwgMHhEOTIyNkVFMiwgMHgyOUUwNEUwOSwgMHg1OUZDN0ZGQywKKzB4REUyNzJGOTIsIDB4MkYxNjRFMEIsIDB4RDQxRjdGMDgsIDB4RTIxQzYxMEQsCisweDFEMTEyRDIwLCAweEQyMjA2NDQyLCAweEQ0MUMxRDQyLCAweDFENTM2NTQyLAorMHg2NzUyRDUxQiwgMHhENzFCMUQ3NCwgMHgxRDE1NjE3MiwgMHgxRDY2NjYyMiwKKzB4NjI2MkQ2MUEsIDB4MUQyN0EyNkYsIDB4OEIzNTg4MzMsIDB4NDkwQkQ5MTksCisweEEyNjhFRTAwLCAweDAwMDAyREUwLCAweDAwMTE3ODAwLCAweDAwMjAzQTE0LAorMHgwMDIwMThBMiwgMHgwMDIwMkFBNCwgMHgwMDIwMzkwNiwgMHgwMDIwM0ExOCwKKzB4MDAyMDM1MkMsIDB4MDAyMDE4RUUsIDB4MDAyMDM5MDUsIDB4MDAxMTc4MDQsCisweDAwMjAzOTg0LCAweDAwMTE3ODEwLCAweDAwMjAzOTAxLCAweDAwMjAzOTAyLAorMHgwMDIwMzkwMywgMHgwMDIwMEY2NCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkJDLCAweDAwMjAwRkI4LCAweDg5MDE4ODI4LCAweDAwMDlBMEMwLAorMHhFNjQzREVCNSwgMHgzMjY2NjJFMSwgMHgxRkVFOEYwMiwgMHgyRTIxRTI0MCwKKzB4NjIyRDYyRTEsIDB4OEIwMTMyNjcsIDB4MDAwOUEwQUEsIDB4RTUwMTg1RTEsCisweDhCMDEzMDU2LCAweDAwMDlBMEE0LCAweDJEMTBFMTAxLCAweDY0RTFCMjI1LAorMHhFNjQzNTdGRSwgMHg2NTJENjI3MSwgMHg4OTQ0MzU2NywgMHgzNTYzRTY0MCwKKzB4RTYwMDhCMDUsIDB4MEY2NUUwNDAsIDB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsCisweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLAorMHhDOTAzNjA1MywgMHhFMDQwNjYwMywgMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywKKzB4MEYyNUUwM0MsIDB4RTA0NDY0MUQsIDB4QjJBMzY1RjMsIDB4RTMzQzBGNDYsCisweDg1MzIzM0ZDLCAweDYyMERERTk1LCAweDQyMDg2MDMxLCAweDYwMjM2MTBELAorMHgxMzIzRTk0NCwgMHgwNkZFNDEwOCwgMHhFMDBGMzlGQywgMHgxMzE0NEUwQiwKKzB4NjcwNzVEOTEsIDB4NjBEMzI2NzksIDB4MEY2NjU0RkUsIDB4NTE5Mjg1NDIsCisweDYwMEQ0RTBCLCAweDYwRDMyNjBCLCAweDBGNjY2NDkyLCAweDY1RjNCMjM3LAorMHg2OTYxNTZGRSwgMHhFNjQwNjU5RCwgMHg4OTM4MzU2MywgMHhENzgzNTlGRSwKKzB4NzkwNjY1OTEsIDB4QzkwMzYwNTMsIDB4NDAwMDQwMDgsIDB4NjEwMzYyMDMsCisweDBGMjZFMDUwLCAweDQ3MEJFMEZGLCAweDZDMDc2MDBDLCAweDY2MDM2MDVELAorMHg0NjIxNDYyMSwgMHg0NjIxNDYyMSwgMHg0MjAwNjI2MywgMHg0MjAwMzI2QywKKzB4NDAyMTQwMjEsIDB4NDAwOEM5MDMsIDB4NkQyRDMwRkMsIDB4RTgwMDZBMDMsCisweEIyNTc2NUYzLCAweDZFQTI2NEQzLCAweDJFQzlFMDUwLCAweDY2OTQyQUUyLAorMHhENzZFMDFGRSwgMHg2MDZDNDcwQiwgMHgyQUUyMkUwQiwgMHg2NEQzNjVGMywKKzB4NzgwMUIxRkQsIDB4RUUwNjYyOEQsIDB4OEZFOTMyRTMsIDB4NUVGRTdEMDEsCisweDYxRTFFNDAwLCAweDQxMDA4NUUxLCAweDY2RTMzMTBDLCAweDc2MEM3MTFCLAorMHhFNzA0NjVGMywgMHg2ODY2NzQwMSwgMHgzQTczNkE0RCwgMHg4RkY5MjU4MiwKKzB4NjVGMzc1MDQsIDB4NjQxREIxRTMsIDB4NjRFMUIxQTQsIDB4MDAwOUExN0IsCisweEQ0NUI1NkY3LCAweEVDMDFEMjVCLCAweDI2QzA0MjBCLCAweDAwMDlBMTczLAorMHgwNkZDRTAxOCwgMHg4ODI5NjA2QywgMHg1OEY3OEIwOCwgMHhFNDAwRDI1MiwKKzB4NjYyMjI4NDAsIDB4NjQ2REIxNzEsIDB4MDAwOUExNjUsIDB4NjY2Q0U2ODEsCisweDg5MDEzMDYwLCAweDAwMDlBMEFDLCAweEQ1NTBEMTRGLCAweDYyMTI2QTU2LAorMHgyMTIyMzJBQywgMHg1NDExNkM1NiwgMHgzNENDNjI1MywgMHg2NDUyMTE0MSwKKzB4NzIwODU4MTIsIDB4RDQ0QTM4NEMsIDB4NjgyMjExODIsIDB4NUExMzZDNDIsCisweDNBQ0MzQzhDLCAweDExQTMyNEMyLCAweDZDMjI3MkVDLCAweDcyMTA1ODE0LAorMHgxMTg0MzhDQywgMHg1QTE1NjgyMiwgMHgxMUE1M0E4QywgMHg2QTIyNzIxMCwKKzB4RDY0MDU4MTYsIDB4MTE4NjM4QUMsIDB4NTIxNzZDNjIsIDB4MTEyNzMyQ0MsCisweDVBMTg1ODYxLCAweDExQTgzQThDLCAweDVDMTk1QTYyLCAweDExQzkzQ0FDLAorMHg1MjFBNUM2MywgMHgxMTJBMzJDQywgMHg1QTFCNTg2NCwgMHgxMUFCM0E4QywKKzB4NUMxQzVBNjUsIDB4MTFDQzNDQUMsIDB4NTIxRDVDNjYsIDB4MTEyRDMyQ0MsCisweDVBMUU1ODY3LCAweDExQUUzQThDLCAweDU2MUY1QTY4LCAweDM2QUNFODQwLAorMHgxMTZGREEyRCwgMHg2Q0EyMzgxQywgMHg3QTk0NjY4MiwgMHgyODYyMzZDQywKKzB4NUM4MTYyQTIsIDB4MThDMTNDMkMsIDB4NjJBMjdBNDQsIDB4MzYyQzU2ODIsCisweEQ2MjYxODYyLCAweDVBODU2MjYyLCAweDNBMkM0MjI5LCAweDc2MDQxOEE1LAorMHg1Njg2NjI2MiwgMHgzNjJDNDIyOSwgMHg1NkY3MTg2NiwgMHgyNjIwRTIzOCwKKzB4MTZDMTVDODEsIDB4MTYyMjYyMTIsIDB4RTIwMDVDMTEsIDB4NTUxMjE2QzMsCisweDU1MTUxNjU0LCAweDU1MTMxNjU1LCAweDU1MTYxNjU2LCAweDU1ODIxNjU3LAorMHg2NTgyMTY1OCwgMHg1NTE0MTY1OSwgMHg1NTg0MTY1QSwgMHg1NTgzMTY1QiwKKzB4NTU4NTE2NUMsIDB4NTU4NjE2NUQsIDB4MTgyMTE2NUUsIDB4MTEyMTIxMjIsCisweDExMjUxMTIyLCAweDExMjYxMTIzLCAweDI4MjIxODIyLCAweDE4MjQxMTI0LAorMHgxODI1MTgyMywgMHgxODI2QTBDNywgMHgwMDExNzgwNCwgMHgwMDIwMzNFMCwKKzB4MDAyMDNBMzgsIDB4MDAyMDE4QTIsIDB4MDAyMDM0OEMsIDB4MDAxQzM2QTAsCisweDAwMjAzNEU4LCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2NjZDRTY4MiwgMHg4QjIwMzA2MCwgMHhFQTI0NTZGNywgMHgyNkEwRDE5NCwKKzB4MTZDMTVDMTcsIDB4MTYyMjUyMTgsIDB4MTY4MzU4MTksIDB4MTZBNDVBMUEsCisweDE2QzU1QzFCLCAweDE2MjY1MjFDLCAweEUyMDA1ODFELCAweDU1MUUxNjg3LAorMHg1NTFGMTY1OCwgMHgxMTI3MTY1OSwgMHgxMTI5MTEyOCwgMHgxMTJCMTEyQSwKKzB4MTEyRDExMkMsIDB4QTA4RTExMkUsIDB4RTY4MzExMkYsIDB4MzA2MDY2NkMsCisweDUyRjc4QjBCLCAweEVBMDBEODgzLCAweDY1ODIyMkEwLCAweDc4MDREQzgyLAorMHg2MjgyMkM1MiwgMHhBMDdFRDY4MSwgMHhFNjkwMjYyMCwgMHgzMDYwNjY2QywKKzB4REE3RjhCMDYsIDB4MDAwOTRBMEIsIDB4RTIwMDU2RjcsIDB4MjYyMEEwNzMsCisweDY2NkNFNjkxLCAweDhCMTAzMDYwLCAweDYyMjJEMjc2LCAweDIyMjg2MjJDLAorMHhEMjc4ODkwNCwgMHgwMDA5NDIwQiwgMHgwMDA5QTAwMywgMHg0MjBCRDI3NiwKKzB4NTZGNzAwMDksIDB4QTA1RUUyMDAsIDB4RTY5MjI2MjAsIDB4MzA2MDY2NkMsCisweEUwMTg4OTUxLCAweEU2QjAwQkZDLCAweDY2NkM2MkJDLCAweDhCMkEzMjYwLAorMHgwMkZDRTAxNCwgMHg2ODJDRUEwMCwgMHg2MkFERTkwNCwgMHg4OTRBMzI4MywKKzB4NkFBRERENjQsIDB4M0NEQzZDQTMsIDB4N0QwNDZFQzIsIDB4REI2OEQ0NjcsCisweDMyREM2MkEzLCAweDRCMEJEQzY3LCAweDRDMEI2RDIyLCAweEQ0NjY2NEUzLAorMHgwMDA5NEIwQiwgMHg2NEQzNEMwQiwgMHg0QjBCRDQ2NCwgMHhFNjAwMDAwOSwKKzB4NjY2RDZCRTMsIDB4NzYwMTNCNkMsIDB4MzI5MzYyNkQsIDB4OEZGNzJCRDAsCisweEFGREE0RDE5LCAweEU2QjU3QTA4LCAweDMyNjA2NjZDLCAweEQ0NUM4QjEzLAorMHg0QjBCREI1NywgMHhEMjVCMDAwOSwgMHg2MDIyREI1QiwgMHhDQjIwRTZGRiwKKzB4MjIwMjY2NkQsIDB4REI1OTJCNjIsIDB4RTAxNEUyMDAsIDB4NTZGNzJCMjAsCisweEEwMTAwMkZDLCAweEQ0NTYyNjIwLCAweDY1NDJEMjU2LCAweDQyMEJENDU2LAorMHhBMDA4MDAwOSwgMHhEQjUyMDAwOSwgMHg1MkIxRTYwMCwgMHg2MjJDREI1MywKKzB4NTJGNzJCMjEsIDB4N0Y1NDIyNjAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDc0OSwgMHhENDQ5NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDQ0LCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDczQjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyM0EsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjM2LCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MzEsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MkQ0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyNjQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjIwLAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDAwMjAzNDhDLCAweDAwMTE3ODA0LCAweDAwMjAzOEVDLCAweDAwMjAzOTAwLAorMHgwMDIwMDUwQSwgMHgwMDIwMTAwOCwgMHgwMDIwMTAyRSwgMHgwMDIwM0E1MCwKKzB4MDAyMDE4QTIsIDB4MDAyMDE4RTYsIDB4MDAyMDNBNjQsIDB4MDAyMDNBNkMsCisweDAwMjAzQTcwLCAweDAwMUMzNTAwLCAweDAwMUMxMDAwLCAweDAwMjAzOTgyLAorMHgwMDExNzgwMCwgMHgwMDIwMThFRSwgMHgwMDIwM0E4NCwgMHgwMDIwMzk4OCwKKzB4MDAxQzM3MDQsIDB4MDAyMDMzRTAsIDB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDEwLAorMHg2RTQzQkZBNCwgMHgyREUyQkY4OSwgMHgwMDA5QkZBMCwgMHgyQzEyNTFENSwKKzB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LAorMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHgwMDAwMDAwOSwKKzB4MDAxQzM3MEMsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsIDB4REQ5NDRGMjIsCisweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksIDB4NDIwQkQyOEEsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODZENDg5LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDg2MDAwOSwKKzB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLAorMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywgMHhCMDc1NjZDMywKKzB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksIDB4QjBBQzAwMDksCisweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwgMHhENjcwMDUyOSwKKzB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLCAweDY0RDM1N0Y0LAorMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4RTUwM0QxNjIsCisweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLCAweEQ0NUZEMTVFLAorMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwgMHhCRjczRTQwQSwKKzB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsIDB4QkY2OTIyMTIsCisweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LCAweDRGMjIyNzAyLAorMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwgMHhEMTU1MkZFNiwKKzB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsIDB4NDUwMDI2MjksCisweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LCAweEQxNEU0NzA4LAorMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwgMHg0RjIyMkZFNiwKKzB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsIDB4RTUwMDc3NkMsCisweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4MjcyMjI3MTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjM0NkVGNiwKKzB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsIDB4RTYwNUQ0MzIsCisweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LCAweEU0MEFFNjAxLAorMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsIDB4QzkwMzYwQjIsCisweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLCAweEIwN0NDOTAzLAorMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwgMHhENDIxMkZFMSwKKzB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsIDB4ODlGRkM4MDEsCisweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDFDM0I4OCwgMHgwMDIwM0E5OCwgMHgwMDIwMThFRSwgMHgwMDIwM0FBMCwKKzB4MDAyMDNBQTgsIDB4MDAyMDNBQjAsIDB4MDAyMDNBQjgsIDB4MDAyNUU3MjAsCisweDAwMjAzRDk4LCAweDAwMjAzOEYwLCAweDAwMUM1OTY4LCAweDAwMUMzQjQwLAorMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwgMHgwMDIwMTVFMCwKKzB4MDAyMDE2MEMsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsCisweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMUM1ODFDLAorMHgwMDFDNTg2MCwgMHgwMDIwM0FDMCwgMHgwMDIwMThBMiwgMHg4RjAxNDQxMSwKKzB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsIDB4NDYyODYwNTIsCisweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLAorMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwgMHgwMDA5QkZFQywKKzB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsCisweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsIDB4QkZDQkREMTMsCisweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LCAweDM2RTI0NjAxLAorMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsIDB4QkZCOTJFMTIsCisweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLCAweDRGMjYyRTcyLAorMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LCAweDY0NTNFNzEwLAorMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwgMHgzMTVDNDEwOCwKKzB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsIDB4RUQwMDYwQjMsCisweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLCAweDExRDQxMUQzLAorMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwgMHg1OEYxMjg3MiwKKzB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsIDB4NTRGNjVFRjUsCisweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwgMHg1MkY5RERBNywKKzB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsIDB4MkQ3MjlBRDUsCisweDZFRUQyNjIyLCAweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LAorMHgzRDlDMzFFQywgMHg0MTA4NjBCMywgMHg4MUQxMkRCMSwgMHg0MTA4RTA1MCwKKzB4NDAwOEU3QjcsIDB4Njc3QzQxMDgsIDB4NjBCMzgxRDIsIDB4RTIwMDMxOEMsCisweDgxRDMzNDcyLCAweDFEMTMxREQyLCAweDhEMDFENDkzLCAweEQ0OTAxRDI0LAorMHhCMEIzNjVEMywgMHg2NEVEN0UwMSwgMHg4QkRBMzRBMiwgMHgyRkQyREE4QywKKzB4REQ5MjY4QTIsIDB4MkQ4MjQ4MjksIDB4N0RGQzY0QTIsIDB4RDI4NzY5NEQsCisweDZFMjIyRDkyLCAweDdEMEM0RTI5LCAweDY4MjIyREUyLCAweDYxOEQ2QUQzLAorMHgyQTE2RDc4NCwgMHhENDhBNkQ3MiwgMHgyNEQyRDU4MywgMHhENjg5NUU3MiwKKzB4NTE3NDE0RTIsIDB4MTQxNEVFMDAsIDB4RDE4NzU4NzYsIDB4NTk3ODE0ODYsCisweDE0OThFNzEwLCAweDY1RTM2MjUyLCAweDI2RTIxNDJBLCAweEU2MDA2NEUzLAorMHg2ODQzNjQ0RCwgMHgzODRDNDgwOCwgMHgzODFDNDgwOCwgMHgwQzg2NjA1MywKKzB4MDlDRTI4QjEsIDB4ODE5MTYwQjMsIDB4MEFDRTYwNTMsIDB4ODFBMjYwNDMsCisweDBEQ0U2MDUzLCAweDgxRDM2MEIzLCAweDA4Q0U2MDUzLCAweDE4ODI3NDAxLAorMHg2MjREMDlDRSwgMHgwQUNFMTlFMywgMHgxQTY0MzI3MywgMHg3NTA0OEZFMCwKKzB4RTAwM0Q5NkEsIDB4NDAxODZDOTIsIDB4NkQ5MjJDQjEsIDB4ODFEMURBNkYsCisweDZFOTJFMDUwLCAweDgxRTI0MDA4LCAweDYwQjM2MTkyLCAweDY0OTI4MTEzLAorMHgxNDQyRTYwMCwgMHhENDY5Njc5MiwgMHg2ODkyMTdBMywgMHgxODY0RTFGRiwKKzB4NjU2M0U3MDMsIDB4MzY0QzQ2MDgsIDB4MjYxMjc1MDEsIDB4MzY3MzY2NUQsCisweERDNUI4QkY4LCAweDZEQzJFMDAzLCAweDJEQjE0MDE4LCAweEQyNjA2RUMyLAorMHg2MUMyODFFMSwgMHgxMTEyRUUwMCwgMHhFMDI0NjRDMiwgMHg2NUMyMTQyMywKKzB4MTVFNEQ0NUIsIDB4RTU4MDY3QzIsIDB4NjhDMjgxNzIsIDB4ODE4MzY2RTMsCisweDY2NkQ2NTVDLCAweDc2MDQ2OTYzLCAweDM5NEM2QTZELCAweDhGRjgzQTUzLAorMHhEQjU0MjlFMiwgMHgyNEIyREM1NCwgMHgyNEMyNzQwNCwgMHg0RjI2N0Y2OCwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwMTE2MTQyLCAweDhGMDNDODAzLCAweEQyM0RFNTAwLCAweDhCMDYzNDIwLAorMHhDOTAzNjAxMSwgMHg4QjA2ODgwMiwgMHgzNDIwRDIzOSwgMHg1NjEyOEIwMywKKzB4NTI2NDY1MTMsIDB4MDAwQjI0MjIsIDB4MDExMzYwNTMsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLCAweDQ1MDhFNDAwLAorMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwgMHg2MDUzODEyMywKKzB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsIDB4RTYxNDY0RjMsCisweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LCAweDY1RjM2MUYxLAorMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwgMHg2MDcxNTdEMSwKKzB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLCAweDZENDNFNUZDLAorMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwgMHgxMkU0OEIwNiwKKzB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsIDB4NTY2NEFGRjAsCisweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLCAweDI3MTlFMUZDLAorMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwgMHg0MTBCRTYxNCwKKzB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsIDB4NEYyNjdGMTQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOTFDLCAweDAwMjAzNEVDLAorMHgwMDIwMzRGNCwgMHgwMDIwMzRGQywgMHgwMDIwMzUyNCwgMHgwMDIwMzkwOCwKKzB4MDAyMDM5MTAsIDB4MDAxMDAyMDgsIDB4MDAxMDE3QzAsIDB4MDAxRTIxMEMsCisweDAwMUMzRDAwLCAweDAwMjAzOTVDLCAweDAwMTAwMEM4LCAweDAwMTE3ODgwLAorMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwgMHgwMDIwMEVENiwKKzB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsIDB4M0UyQ0EwMDUsCisweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLCAweDM1MjA1MkUxLAorMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksIDB4MzYyMDY2QzIsCisweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LCAweEJGMzdERDM1LAorMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwgMHhENDMyODkwNywKKzB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksIDB4QkYzRDAwMDksCisweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLCAweDIyNjJEMjJELAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsIDB4MDRERTQwMDgsCisweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LCAweDU1RTIyN0UyLAorMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwgMHgxMjIyMDJERSwKKzB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsIDB4QzkwRjYwNTMsCisweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDg1NDM2Q0Y2LAorMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwgMHhFMTAwOEYwQywKKzB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsIDB4RDYxMzE2MjEsCisweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLCAweDAwMDAwMUZGLAorMHgwMDIwMzRGQywgMHgwMDIwMzRGNCwgMHgwMDFDM0QwMCwgMHgwMDIwMzUyNCwKKzB4MDAyMDM4RUMsIDB4MDAyMDE4QTIsIDB4MDAyMDM0RUMsIDB4MDAyMDNBRTgsCisweDAwMjAzQUVDLCAweDAwMUMzRDI4LCAweDAwMjAzOTVDLCAweDAwMjAzOTFDLAorMHgwMDIwMEVENiwgMHgwMDIwMzk2MCwgMHgwMDIwMzk2NCwgMHgwMDExNzc1NCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGODRGMjIsIDB4NjAyMkQyMzcsCisweDhENThDODAzLCAweERFMzYyRjAxLCAweERCMzdEQzM2LCAweDY2QzI1MkMxLAorMHg4OTJGMzYyMCwgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwgMHhEMjMzREQzMSwKKzB4NjREMzQyMEIsIDB4MUYwMTY1MDMsIDB4ODgwMTYwQjEsIDB4RDIzMDhCMDQsCisweDY0RDM0MjBCLCAweDAwMDlBRkVBLCAweDg1NjE1NjUzLCAweDg5MDRDODIwLAorMHhFMDUwRDcyQywgMHg3MjAxMDI3RSwgMHhEMjJCMDcyNiwgMHg2NDUzNDIwQiwKKzB4ODkwNzIwMDgsIDB4NTVGMUQxMjYsIDB4NjREMzQxMEIsIDB4RTYwMUQ3MjcsCisweDI3NjJBRkQ0LCAweDU1RjFEMjI2LCAweDY0RTM0MjBCLCAweEU2MDFEMTI1LAorMHgyMTYyQUZDQywgMHhERDI1REUyNCwgMHhEQzI2REIyNSwgMHg2NkQyNTJEMSwKKzB4ODkxODM2MjAsIDB4QzkwMzYwNjEsIDB4ODkxNDg4MDEsIDB4RDExN0Q0MUYsCisweDAwMDk0MTBCLCAweDM2RTA1NjAzLCAweDY1MDM4RjA0LCAweDJCMjBFMjAxLAorMHgyQzUyQUZFQywgMHhENzEyRDQxQywgMHgwMDA5NDcwQiwgMHhFNjAxRDExNSwKKzB4QUZFMzQ2MTgsIDB4NjBGMTIxNjIsIDB4ODkwN0M4MDQsIDB4N0YwOEQyMTcsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA4LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM0RkMsIDB4MDAyMDM0RjQsIDB4MDAyMDM5ODQsIDB4MDAyMDE0QTAsCisweDAwMjAxNENDLCAweDAwMjAzNDhDLCAweDAwMjAxNkJFLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzMCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzRFQywKKzB4MDAyMDM5MEMsIDB4MDAyMDM5MDgsIDB4MDAyMDM1MjQsIDB4MDAyMDA2MTAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsCisweDY0NENCRkYyLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHhFNTAwNkNGNiwgMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwKKzB4QUZFMzhCRkEsIDB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsCisweDYwNDNFRTBBLCAweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LAorMHhFNjMwRTYzNywgMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwKKzB4MDAwQjgwMjgsIDB4MDAwQjZFRjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsCisweDdGRUM0RjIyLCAweDZFNDM2MjUzLCAweEJGREM2NUYzLCAweEJGRDA2NDIzLAorMHhCRkNFNjRFMywgMHhENDAzNjRGMywgMHgwMDA5QkZDQiwgMHg0RjI2N0YxNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDNBRjAsIDB4RTRGREQyOUQsIDB4RDc5RDYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OUE2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTYwMTYwNTIsIDB4MjUwMkNCMDgsIDB4RTQwMjYwNTIsIDB4MjUwMkM5Q0YsCisweDQ2MTg2MDUyLCAweDI1MDJDQjEwLCAweENCMDM2MDUyLCAweDE1NDIyNTAyLAorMHgxNTYzMDAwQiwgMHhENzhFRDU4RCwgMHhENDhGRDI4RSwgMHhFNjAwRTEwMCwKKzB4MjcxMTI1MTEsIDB4QUZDRjIyMTAsIDB4NjY0QzI0NjEsIDB4NDYwMEQyOEIsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjg3LAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjg0NjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI4MDY1NEMsCisweDM1MkM0NTAwLCAweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3QSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNzYsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQyNzM2NjRDLCAweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLAorMHhEMjZGNjU0QywgMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwKKzB4NjI0QzI1NjAsIDB4NDIwMEQ2NjksIDB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsCisweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweEQ2NjU2MjRDLCAweDMyNkM0MjAwLAorMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwgMHgwMDBCNDAyMSwgMHhEMTYxNjAwQywKKzB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4RDE1RjYwMkMsIDB4MzQxQzY0NEMsCisweDAwMEI2MjQwLCAweDJGRTY2MDJDLCAweDZFNDM0RjIyLCAweEU2MEE2NDVDLAorMHg4OTE0MzQ2NywgMHgwMDA5QkZFQiwgMHg2MEVDNjQwQywgMHg4QjAyODgwMSwKKzB4QTAwMkUwMEYsIDB4NDQwOTI0MDksIDB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsCisweEJGRTI4OTA1LCAweDYyMEM2NDRDLCAweEM4ODA2MDIzLCAweEUyMDA4QjAwLAorMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwgMHhENjRDNEYyMiwgMHg4ODAxNjA2MiwKKzB4QjI1NzhCMDMsIDB4QTAwMzAwMDksIDB4RDI0OTAwMDksIDB4MjI2MEU2NDAsCisweEUyMDBENjQ4LCAweDAwMEI0RjI2LCAweDRGMjIyNjIyLCAweDYwNjJENjQzLAorMHg4QjAxODgwMiwgMHgwMDA5QjJBMCwgMHhFMjAwRDY0MiwgMHgwMDBCNEYyNiwKKzB4RDUzRTI2MjIsIDB4RTEwMEQ0M0UsIDB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsCisweEU2MDREMjNCLCAweDIyNjAwMDBCLCAweEQ0M0I0RjIyLCAweDQxMEJEMTNCLAorMHhENTNCMDAwOSwgMHg2NjUwRTFGRCwgMHgyNjE5RDIzQSwgMHgyNTYwRTcwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjIyNzAsIDB4RDIzOEQ1MzcsIDB4RDczODYxNTIsCisweDI1MTI2MTFELCAweEU2RkY2NDUyLCAweDI1NDIyNDJCLCAweEQyMkZENDM1LAorMHg0MjBCNjY2RCwgMHhENTJFMjc2MiwgMHg2NzUwRTFGQiwgMHg0RjI2MjcxOSwKKzB4MjU3MDAwMEIsIDB4RDQzMDRGMjIsIDB4NDEwQkQxMjgsIDB4RDUyODAwMDksCisweDY2NTBFN0Y3LCAweDRGMjYyNjc5LCAweDI1NjAwMDBCLCAweDk0MjVENTI0LAorMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhFNEJGRDUyMSwgMHgyMjQ5NjI1MCwKKzB4MjUyMDAwMEIsIDB4RDIyNTRGMjIsIDB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsCisweDg5NDU4ODAxLCAweDg5NDc4ODAzLCAweDg5NDk4ODA1LCAweDg5NEY4ODA2LAorMHg4OTU1ODgwOCwgMHg4OTVCODgwOSwgMHg4OTYxODgwQSwgMHg4OTY3ODgwQiwKKzB4MDAwOUEwNkUsIDB4MDAwOUIwNzAsIDB4NjAwQ0EwNkIsIDB4MDAwMEZGN0YsCisweDAwMUUyMTQ4LCAweDAwMUUxMDAwLCAweDAwMUUxMTA4LCAweDAwMjAzOUJDLAorMHgwMDIwMzlCRSwgMHgwMDIwMzlERCwgMHgwMDIwMzlBMCwgMHgwMDFFMTAzRiwKKzB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsIDB4MDAxRTEwOTAsIDB4MDAyMDM5QzQsCisweDAwMUUxMDBCLCAweDAwMjAzOUMwLCAweDAwMjAzQUY0LCAweDAwMjAxOEEyLAorMHgwMDFFMTAyOCwgMHgwMDIwMzlEQywgMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwKKzB4MDAxQzEwMDAsIDB4MDAyMDNCMDAsIDB4MDAyMDNCMTAsIDB4MDAyMDM5OTQsCisweDAwMDlCMDRDLCAweDYwMENBMDM1LCAweDAwMDlCMDU1LCAweDYwMENBMDMxLAorMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwKKzB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsIDB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsCisweDYyNjBENjdDLCAweDhCMUIyMjI4LCAweDAwMDlCMEM3LCAweDYwMENBMDE5LAorMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwKKzB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksCisweDYyNjBENjcwLCAweDhCMDMyMjI4LCAweDAwMDlCMTNELCAweDYwMENBMDAxLAorMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwgMHhENTZDODQxMiwKKzB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsCisweDI1NDBFMDAxLCAweDI1MjAyNzEyLCAweDI2MDIwMDBCLCAweEU2MDFEMjYyLAorMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwgMHhFMDAxODEyMiwKKzB4MDAwQjI2MDIsIDB4RDI1QzAwMDksIDB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsCisweDhCMEE4ODAxLCAweDYwNjBENjVELCAweDI2MDBDQjAxLCAweEQ0NTdENjVBLAorMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwKKzB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsCisweEQ1NTFEMjUzLCAweDIyNjBFMDAxLCAweDAwMEIyNTAyLCAweDRGMjIwMDA5LAorMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwKKzB4ODgwMTYwMkMsIDB4ODgwMjg5MDksIDB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsCisweDg4MDc4OTM1LCAweEEwNEM4OTNCLCAweEQ1NDYwMDA5LCAweDY2NTJENzQ2LAorMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywKKzB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsCisweDYyMDNBMDJDLCAweDIwMDg2MDVDLCAweDg4MTA4OTA3LCAweDg4MjA4OTA4LAorMHg4ODMwODkwOSwgMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwKKzB4QTAwNUQyMzksIDB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsCisweEQ0MzJENTMxLCAweDY2MjEyNTIyLCAweEEwMEY2MjZDLCAweEQ2MzUyNDIxLAorMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwKKzB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsCisweDM2MTc2MTBELCAweDY1MDM4RjAxLCAweEIwQ0IyNDUxLCAweEEwMDEwMDA5LAorMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwgMHhENDI3RTEwMSwKKzB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsCisweDAwMEIyNjIwLCAweDJGRTYyMTAyLCAweEQyMEY0RjIyLCAweDY0MEM4NTIzLAorMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwgMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwKKzB4QTA0ODIwNDksIDB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsCisweDg5NDQzNDI3LCAweEQyMTZENjE1LCAweDI2NDE0MjBCLCAweDAwMDlBMDMwLAorMHgwMDAwRkY3RiwgMHgwMDIwMzlERCwgMHgwMDIwMzk5NCwgMHgwMDIwMzlBMCwKKzB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDM5QzAsIDB4MDAxRTEwMDAsCisweDAwMUUxMDAxLCAweDAwMjAzOUM4LCAweDAwMjAzOUE4LCAweDAwMjAzOUFDLAorMHgwMDIwMzlCMCwgMHgwMDIwMzlDQywgMHgwMDIwMzlEMCwgMHgwMDIwMzlENCwKKzB4MDAyMDM5RDgsIDB4MDAyMDNERkMsIDB4MDAyMDNFMDYsIDB4MDAyMDM5QkEsCisweDAwMjAyODdFLCAweDg5MTIzNDI3LCAweEQyOTRENjkzLCAweDI2NDE0MjBCLAorMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwKKzB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsCisweDAwMEI0RjI2LCAweEQ2OEM2RUY2LCAweEM4ODA2MDYwLCAweEQyODY4OTE5LAorMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwKKzB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsCisweEU0MEZENTg1LCAweDIxNDBFNzAyLCAweEQ3N0UyNTcxLCAweDAwMEJFMDAxLAorMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwgMHhDODgwODRFMSwKKzB4RDU3QTg5MkMsIDB4MjAwODg1NTQsIDB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsCisweDY0MDM2NjcyLCAweDg1NjY2NTBDLCAweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLAorMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwKKzB4NDIwQkQyNzUsIDB4QTAwMzAwMDksIDB4RDI2ODAwMDksIDB4MDAwOTQyMEIsCisweDAwMDlCMDlGLCAweEUyMDFEMTY3LCAweDYwRTAyMTIyLCAweENCMDRENDY0LAorMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwKKzB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4REE2MjJGRTYsCisweDY2QTFFMjQwLCAweDM2MjJEQzVFLCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLAorMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwKKzB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsCisweDYxMjEyQjEyLCAweDY1MUQ2NjZELCAweDM1NkM0NTI4LCAweDYyN0MyNDUyLAorMHg4QkVEMzJFMywgMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHg2MTczNjdCMiwKKzB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsIDB4NjU1RDZERTEsCisweDQyMjg2MkRELCAweDMyNUNFMTA3LCAweEEwMEMyQzEwLCAweDg4MDIyNDIyLAorMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwKKzB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsCisweEREMzhEQzQ0LCAweEVCMDFFQTAwLCAweDJEQjIyQ0EyLCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzNiwKKzB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsCisweDQ3MjEyRDYxLCAweDY0RTJENjM1LCAweEEwMEU0NzIxLCAweDY1NjJFMTAwLAorMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwKKzB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsCisweDY2RTI0MjAwLCAweDQyMDA2MUQxLCAweDIxMTgzNjJDLCAweDJFNjI4RjA2LAorMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwKKzB4MkZENjZERjYsIDB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsIDB4NjRFM0JDODUsCisweEJDOEE2NEUzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEJDOERFRTAxLAorMHg2NEUzNjRFMywgMHg3RTAxQkM5MiwgMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywKKzB4MDAwQjZFRjYsIDB4RDExODZERjYsIDB4RDQxODkyMEQsIDB4NzIxMjIxMjIsCisweDI0MjJENjE3LCAweEQ3MTc3MjA0LCAweDcyMjAyNjIyLCAweDI3MjJEMTE2LAorMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwgMHgwMDIwMzlCQSwgMHgwMDIwMjk4QSwKKzB4MDAxRTEwMTUsIDB4MDAyMDM5QzAsIDB4MDAxRTEwMDEsIDB4MDAyMDM5OTQsCisweDAwMUUxMTAwLCAweDAwMjAzOUJFLCAweDAwMjAzOUFDLCAweDAwMUUxMDAwLAorMHgwMDIwMzlCMCwgMHgwMDIwMzlCQywgMHgwMDIwMjg3RSwgMHgwMDFFMTAwQywKKzB4MDAyMDM5QTgsIDB4MDAyMDM5QzQsIDB4MDAyMDM5QzgsIDB4MDAyMDM5Q0MsCisweDAwMjAzOUQwLCAweDAwMjAzOUQ0LCAweDAwMjAzOUQ4LCAweDRGMjIyRkU2LAorMHhENjcwN0ZGQywgMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwKKzB4RDU2RUQxNkQsIDB4REU2RTYwMTAsIDB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsCisweDhEMjJEMTZDLCAweEQyNkM3NTAyLCAweEU2MDFENzZDLCAweEU3MDQyNzIyLAorMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDYzNzQwMiwKKzB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsCisweDgxRTQ2MDdDLCAweEU0MTdENTYyLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLAorMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwgMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwKKzB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsCisweEQ0NTI3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LAorMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwKKzB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsCisweDVFMjNENzRFLCAweDY0RjIyRkUyLCAweDYwNDM2NUYyLCAweDI3MDBDOTgwLAorMHhDOTYwNjA0MywgMHg4MDcxNjEwMywgMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwKKzB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksCisweDQwMTg2NDVDLCAweDgxNzMzMDRDLCAweDIxMTg1RTIzLCAweDY0RjIyRkUyLAorMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwKKzB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsCisweDgxNzU4RjA3LCAweDAwMDlCQzk2LCAweDIyMjg2MjBDLCAweEEwMEE4OTA4LAorMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywKKzB4RTIwMkQ2MkYsIDB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsCisweDg1NTJENTJBLCAweDg4MzA2MDBELCAweDg4MzE4OTAzLCAweEEwMzQ4OTIzLAorMHg4NTU1MDAwOSwgMHhENDI4RDcyNywgMHg4NTUzMjcwMSwgMHg2MTBERDYyNywKKzB4MjQxMjQxMTgsIDB4NDYwQkQ0MjYsIDB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsCisweDY1NzI0MjBCLCAweEUyMzBEMTIwLCAweDQyMjg2NzEyLCAweDI3MjlFNjIwLAorMHgzNzYwNDYyOCwgMHhENjIxOEIwMywgMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwKKzB4QTAxMkUyMDIsIDB4RDExODI2MjIsIDB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsCisweDQ2MjgyMjU5LCAweDg5MDgzMjYwLCAweEQ0MUFEMTE5LCAweEU2MDFENTEzLAorMHgyMTYwNDUwQiwgMHg0NzJCRDcxOCwgMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwKKzB4MDAwMDA2MEEsIDB4MDAyMDM5REMsIDB4MDAxRTEwMDAsIDB4MDAyMDM5QzgsCisweDAwMjAzREZDLCAweDAwMjAzRTA4LCAweDAwMjAzREEwLCAweDAwMjAzOUIwLAorMHgwMDIwM0REMCwgMHgwMDIwM0RDRSwgMHgwMDIwM0RBMiwgMHgwMDIwMzk5NCwKKzB4MDAyMDM5QzAsIDB4MDAyMDM5QUMsIDB4MDAyMDM5QTgsIDB4MDAyMDE4QTIsCisweDAwMjAzQjFDLCAweDAwMjAzQjIwLCAweDAwMjAxOEVFLCAweDAwMjAzOUM0LAorMHgwMDFFMTAwQiwgMHgwMDIwM0IzNCwgMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwKKzB4REU5NjdGRkMsIDB4MjAwODg0RTksIDB4MkYwMDhEMDYsIDB4RDY5NUQ0OTQsCisweDAwMDk0NjBCLCAweDY0RjBCMTlBLCAweDY2MjBEMjkzLCAweDg5MDIyNjY4LAorMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwKKzB4MkZFNjAwMDksIDB4REU4RDRGMjIsIDB4NjBFMEQ2OEQsIDB4Q0JDMEQ0OEQsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjg3NjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI4MzhCRjgsCisweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY3RCwgMHg4OTQ0MjIyOCwKKzB4RDU3MkUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0N0EsIDB4MjUwMDQ0MEIsCisweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LAorMHhENDc1RDY2RCwgMHhERDc1Njc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwKKzB4OEIwMzNEMjcsIDB4RDI2N0Q0NzIsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsCisweEEwMDVENzcwLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLAorMHgzNUQzNjU0RCwgMHhENzZDOEJGNywgMHg2MTcyRTAwMywgMHg4MTExNDAxOCwKKzB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ2ODYxNzIsIDB4REQ2ODgxMTMsCisweDREMEJERTY4LCAweEUyMDE2NTcyLCAweEQ0NjcyRTIyLCAweDQyMEJEMjU1LAorMHhENjU2MDAwOSwgMHhDOTNGNjA2MCwgMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4RDI1RjRGMjIsCisweDZCNDM2RTczLCAweDQyMEI2QzUzLCAweDIwMDg2RDYzLCAweDY0MDM4RDFDLAorMHhFNTBFRDE0OSwgMHgzMjUyNjIxMCwgMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwKKzB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsIDB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsCisweDM2NEM2NjUzLCAweDgwNjQ3NTAxLCAweDMyMTM2MjVELCAweEQ2M0I4QkY1LAorMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwgMHhEMjNBRDQ0RCwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLAorMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwKKzB4NjU1QzY2NkMsIDB4RTQwOEJGQjYsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM2RDczNSwKKzB4RURGRjY0RjMsIDB4RDgzNUVBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsCisweDMyQzA2MjJELCAweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELAorMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwKKzB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsCisweDI0NDg2NDFDLCAweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGNzk2NjZDLAorMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RDExRTY4RjYsIDB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsCisweDIxMDJFNTAwLCAweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LAorMHgwMDIwM0IzOCwgMHgwMDIwMThBMiwgMHgwMDIwMzkwNiwgMHgwMDFFMTAxNSwKKzB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsIDB4MDAyMDA2MTAsCisweDAwMjAzOTBDLCAweDAwMjAyQUUyLCAweDAwMjAzQjNDLCAweDAwMjAxOEVFLAorMHgwMDIwM0I1OCwgMHgwMDExNzg4QywgMHgwMDIwMzkwOCwgMHgwMDIwMzRFQywKKzB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsIDB4MDAyMDNCNjAsIDB4MDAyMDJBQTQsCisweDAwMjAzQjY0LCAweDAwMjAzOTZDLCAweDAwMjAzOTc0LCAweDAwMjAzRDlDLAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHhENTY0RDE2MywgMHhFNDAwRDc2NCwKKzB4MjE0MkUyMEYsIDB4MTc0MTExNTQsIDB4RDU2MjI3MjIsIDB4OTY2OUQ3NjIsCisweDE1NDEyNTcyLCAweDk2NjYxNTYyLCAweEU2MDExNTY1LCAweEQ1NUYxMTY1LAorMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsIDB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsCisweEU3MDQyNTcyLCAweDI1NzJFMjQ4LCAweEUyMTkyNTIyLCAweEUyNzAyNTIyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDAwMEIxNTRBLCAweEUyMDgxMTQ1LCAweDAwMDk0MjJCLCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHhDODIwNjA0MywgMHg2RTQzOEQwMiwgMHgwMDA5QkU2NywKKzB4QzgxMDYwRTMsIDB4QkU2NDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMUM4NDAsCisweDAwMDlCRTg2LCAweEM4MDE2MEUzLCAweEREM0Q4OTM4LCAweEM4MDI2MEQwLAorMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwgMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwKKzB4NDYwQkQ2MzksIDB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsCisweDJEMDBDOTdGLCAweEM4MDE2MDIzLCAweEQ2MzQ4OTA2LCAweDAwMDk0NjBCLAorMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwgMHg4OTAyQzgwOCwgMHg0NjBCRDYzMCwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MTAsIDB4NDIwQkQyMkUsIDB4RDUyRTAwMDksCisweDg4MDI2MDUyLCAweEQyMkQ4QjAzLCAweEEwMDVFNjA0LCAweDg4MDEyMjYwLAorMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwgMHhDODgwNjBFMywKKzB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsIDB4ODkwMkM4ODAsIDB4NDIwQkQyMjUsCisweDYwRTMwMDA5LCAweDg5MDJDODQwLCAweDQyMEJEMjIzLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwgMHg2MEUzMDAwOSwgMHg4OTBEQzgwNCwKKzB4REQyMEQxMUYsIDB4MDAwOTQxMEIsIDB4MDAwOUJGMEQsIDB4MDAwOUJGNEMsCisweEQ1MUVENDFELCAweDI0NzBFNzA4LCAweDI1RDJCRjg1LCAweEM4MDg2MEUzLAorMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwgMHg0MjJCNkVGNiwgMHg3RjA0NkRGNiwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsCisweDAwMUQwMTAwLCAweDAwMUQ0MDAwLCAweDAwMDQwMDIxLCAweDAwMUM1ODlDLAorMHgwMDFFMTAyMSwgMHgwMDIwMUE4OCwgMHgwMDIwMUFBQSwgMHgwMDIwMjEwQywKKzB4MDAyMDFBQzIsIDB4MDAyMDFBRDAsIDB4MDAyMDM5QzAsIDB4MDAxRTEwMEIsCisweDAwMUUxMDI4LCAweDAwMjAxQjNDLCAweDAwMjAxQjQ4LCAweDAwMjAxQUQ4LAorMHgwMDIwMUFGNiwgMHgxMjM0NTY3OCwgMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwKKzB4MDAyMDFCMjQsIDB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsCisweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDY0NENENkE0LCAweDAwMEIzNDZDLAorMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwKKzB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsCisweDIyMDAwMDBCLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LCAweDMyNEM2NDRDLAorMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwKKzB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksCisweDZFNTM2MjY5LCAweDY3MkU2NTczLCAweDQyMjEyMjdELCAweDQyMjE0MjIxLAorMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwKKzB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsCisweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLCAweDI2Njg2NjIxLAorMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwKKzB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsCisweEJGQTFFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LCAweDgxRjJFNDAxLAorMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwgMHhCRkFCNjU0MywgMHg4NUYyNjYwMywKKzB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsCisweDgwRjhCRjgwLCAweEJGODJFNDAyLCAweDg0RjhFNTEyLCAweDcwOTBFNDAyLAorMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwKKzB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsCisweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLCAweEJGNjFFNDAzLAorMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwKKzB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsCisweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLCAweEUwMTQ2NTVDLAorMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwKKzB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsCisweEJGNTdFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFGNUM3RjE4LAorMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwKKzB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsCisweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFDLCAweEJGMUVFNTAxLAorMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwKKzB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsCisweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLCAweDc1NkNFNDAyLAorMHhCRUZGNjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwKKzB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsCisweEJGMEZFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLCAweEU1RkVFNTAwLAorMHg2MDUzNjU1QywgMHhCRUU1RTQwMywgMHhFNTEzODBGOCwgMHhFNDBFQkVFNywKKzB4RTQwRTg0RjgsIDB4QkVFNzcwODUsIDB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsCisweEU1MDBFNDAzLCAweEJFRjVFNjQwLCAweEU1MDBFNDAzLCAweEJFRkNFNjQwLAorMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwgMHhFNDBGODBGQywKKzB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsIDB4QkVDRDcwODMsIDB4RTUwMTY1MDMsCisweEJFQ0VFNjQwLCAweEU1MDFFNDA0LCAweEJFREJFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxRTEwMkYsIDB4MDAxRTEwODAsIDB4MDAxRTEwOTAsCisweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAzOUJBLCAweDAwMjAzOUJDLAorMHgwMDIwMzlCRSwgMHhEMjFERDExQywgMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwKKzB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsCisweDY0MjMyMTcwLCAweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LCAweDM0MjhDOTBGLAorMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywKKzB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsCisweDY1NUM2NTQwLCAweDQ3MDg2NzUzLCAweDM3NTg0NzA4LCAweDQ3MDg2NTQwLAorMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwKKzB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsIDB4MDAyMDM5MDUsIDB4MDAyMDM5MDQsCisweDAwMjAzOTA2LCAweDAwMjAzNTJDLCAweDdGRkM0RjIyLCAweEU2ODBEMTlGLAorMHg2NjZDNjIxMiwgMHhEMjlFMkYyMiwgMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwKKzB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsIDB4RTY4MDAwMDksIDB4RDI5ODY2NkMsCisweEU3MDA2NTYzLCAweDQyMkI3NTQwLCAweEU2ODA2NDczLCAweEQyOTQ2NjZDLAorMHhFNzAwNjU2MywgMHg0MjJCNzU0MywgMHgyRjg2NjQ3MywgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZDQzRGMjIsIDB4REM4RUQyOEQsCisweDcyMDExRjIxLCAweERCOEQxRjIyLCAweEQxOEVERThELCAweDY2MTI1MjExLAorMHg4QjAxMzYyMCwgMHgwMDA5QTBFNSwgMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwKKzB4MDAwOUEwREYsIDB4RDI4OEQ0ODcsIDB4RUQ4NDQyMEIsIDB4MkYwMjU1MDMsCisweDMwRDA4NDVDLCAweEEwQjg4OTAxLCAweEQxODQwMDA5LCAweDYyNkM2NjEwLAorMHg4ODAxNjAyMywgMHhEMTgyOEI2OCwgMHg2MjEwMUZDMywgMHg4OTVCMjIyOCwKKzB4RTAwM0Q0ODAsIDB4NDAxODY3NDIsIDB4Njg0MjE3NzIsIDB4RDU3RUU5MDAsCisweDgxODE2REIzLCAweDdEMDQyMTkwLCAweDY3RDI2QUIyLCAweDY0RTI2ODUyLAorMHgxRjQ5MUY1NywgMHg3NDA0NjRFMywgMHgxRkE0NjU0MiwgMHg2NTQzMUY1QSwKKzB4NjI1Mjc1RjgsIDB4MUY3NjFGRDUsIDB4NkQ1MzFGMkIsIDB4REE3NEQ3NzMsCisweDdEOTREMjc0LCAweDY4RDIxRjg4LCAweDZBQTI2OTcyLCAweEQxNzI2MDIyLAorMHgyMjAyQ0IyMCwgMHhFMTQwMUYxQywgMHg3NjAxRTYwMCwgMHgzMjEzNjI2RCwKKzB4NTZGNDhCRkIsIDB4NTJGNjUxRjUsIDB4MjEyMjJCNjIsIDB4NTJGODUxRjcsCisweDIxMjI1NkY5LCAweDJFNjI1MUZBLCAweDUxRkIyNDEyLCAweDJEODIyNTEyLAorMHhEOTY2Mjc5MiwgMHgyOUEyREQ1RiwgMHg2QUQyRDk2NSwgMHhEOTY0Njg5MiwKKzB4NjhEMjFBODQsIDB4NjA4MURBNjMsIDB4MjgwMUNCMDEsIDB4RDg2MjY2RDIsCisweDJBNjIyOTYyLCAweEVEMDE1QUZDLCAweDJBRDI0ODBCLCAweDJBRDI0RDE4LAorMHg2MkQyREQ1RSwgMHgyRDIyNzIwMSwgMHhEMTUwNTZGMywgMHhFMjAyNjA2MiwKKzB4MjYwMkNCMDEsIDB4MjEyMEEwM0QsIDB4OEIzQTIyMjgsIDB4RTQwMURENTgsCisweDIxNDBFNjAwLCAweEUwMUMyRDYyLCAweEM4MDEwMDVDLCAweEQ0NTU4QjBBLAorMHhFNjAwRDc1NSwgMHhFRDdEMjQ3MiwgMHg2MjZDNzYwMSwgMHg4QkZCMzJEMywKKzB4MjREMkRENTIsIDB4RTJGRTY4QzIsIDB4MkM4MjI4MjksIDB4MDk1Q0UwMUUsCisweEUwMUY1REYxLCAweDBBNUMyRDkwLCAweDc1MTA1MUYyLCAweEVEMDYyMUEwLAorMHhENzRCRTYwMCwgMHg4NDU2RDQ0QiwgMHgyNzAwNzYwMSwgMHg2OTZDNjg1NCwKKzB4MjQ4MDM5RDMsIDB4OEZGNjc0MDEsIDB4REE0Nzc3MDEsIDB4MkExMEUxOTQsCisweEUyMDA3QTAxLCAweDdBMEYyQTIwLCAweEQxMzBFODA1LCAweDY2MTAyQTgwLAorMHg2MDIzNjI2QywgMHg4OTA4ODgwMSwgMHhEMjQwRDQyQSwgMHg0MjBCNjVGMiwKKzB4RDEzMUVEMDEsIDB4QUYzMDREMTgsIDB4NjVGMjIxRDIsIDB4ODU1M0Q0M0MsCisweDYyMEQ2NjQyLCAweDg5MDczMjYyLCAweEQxM0JENDNBLCAweDAwMDk0MTBCLAorMHhFNjAxRDczQSwgMHgyNzYyQUYxQSwgMHhEMTM0RDQxRSwgMHg0MTBCNjVGMiwKKzB4RDEyNUVEMDEsIDB4RDYzN0Q0MzYsIDB4NDYwQjREMTgsIDB4QUYwRDIxRDIsCisweDdGMzQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwgMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwKKzB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsIDB4ODFGMkQyMDksIDB4NjdGMzg1NDIsCisweDg1NDM4MUYzLCAweDgxRjRFNDBDLCAweDY1NjM2MDUzLCAweDQyMEI4MUY1LAorMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywKKzB4MDAyMDI0NTQsIDB4MDAxMTc3OUEsIDB4MDAxQzM2RjgsIDB4MDAxQzNCOUMsCisweDAwMUMzNzA0LCAweDAwMjAzNTI0LCAweDAwMjAxNEEwLCAweDAwMjAzOTE1LAorMHgwMDIwMzkxNCwgMHgwMDIwMzkxMCwgMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwKKzB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsIDB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsCisweDAwMjAzNEZDLCAweDAwMUMzRDAwLCAweDAwMjAxNjBDLCAweDAwMTE3NzMwLAorMHgwMDIwMzkxOCwgMHgwMDFDNTgyQywgMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwKKzB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsIDB4MDAxMTc3ODgsIDB4MDAyMDE0Q0MsCisweDAwMjAzOEVDLCAweDAwMjAzNEVDLCAweDAwMjAxNTMwLCAweDAwMUUyMTMwLAorMHgwMDIwM0Q3QywgMHgwMDIwMThBMiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsCisweDYxMDNENDlBLCAweDFGNDI4MUYyLCAweEREOUFEQTk5LCAweEQ2OUE2ODEzLAorMHhFMDAxNDgwOCwgMHg0NjBCREU5OSwgMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywKKzB4MzUyMDUyQTEsIDB4QTIzRThCMDEsIDB4NjA1MTAwMDksIDB4ODgwMUM5MDMsCisweEEyMzg4QjAxLCAweDUyNTMwMDA5LCAweDMyRTBERTkxLCAweEQ5OTE4QjEwLAorMHg2NEEzNDkwQiwgMHg0QjBCREI5MCwgMHhERTkwNjQwMywgMHhENzkxRDY5MCwKKzB4RUMwMUQ1OTEsIDB4MkUwMkUxMDAsIDB4MjcxMDI2QzAsIDB4MjUwMkFGREYsCisweEM4MDE4NTUxLCAweEExNTc4QjAxLCAweDYyNTEwMDA5LCAweDQyMDA2MjJELAorMHg1RTUzMzY2QSwgMHg4NUUyMjI2RCwgMHhDOTAzNjQyQywgMHg4NUUzNjYwMywKKzB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsIDB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsCisweDYwNTMyNTJELCAweEM5MDFEMTdGLCAweDYwMTA2QzAzLCAweDg4MDFEOTdGLAorMHhEQjdGOEIwNSwgMHgyMTIwRTIwMCwgMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwKKzB4ODgwMTYwMTEsIDB4NjVBMjhCMEEsIDB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsCisweEEwMDMyMkI5LCAweDkxOUIyNTIxLCAweDI1MjEyMjFCLCAweDM3QjNFQjEwLAorMHgyNDQ4ODk1RSwgMHhENDczOEIwNywgMHgyMjI4NjI0MSwgMHg2MDYzODkwMywKKzB4QTA1NzgxRjgsIDB4RDU3MDY0NzMsIDB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsCisweDQ2MDA2QjUwLCAweDM2MkM0MjAwLCAweDJCQjhDOTEwLCAweDhGMUY2NDYzLAorMHgyNjY4NjYwMywgMHhEMjY5ODkxMSwgMHgwNjJENjA0MywgMHg0MTE5NjE2RCwKKzB4NkIwRTYwMTksIDB4ODFGODIwQkQsIDB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsCisweDg4MEY2MDczLCAweEEwMjc4QjFCLCAweEQyNjEwMDA5LCAweDA1MkQ2MDQzLAorMHg0MTE5NjE1RCwgMHg2NzBFNjAxOSwgMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywKKzB4ODkwRjI2NjgsIDB4NjA0M0QyNUIsIDB4NkI1RDA1MkQsIDB4NjBCOTRCMTksCisweDIwMUQ2MTBFLCAweDYwQzM4MUY4LCAweDhGMEQ4ODAxLCAweDY0NzM2NDVDLAorMHhFQzAwQTAwQSwgMHg2MDQzRDI1NCwgMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwKKzB4MjA3RDY3MEUsIDB4ODFGODY0NUMsIDB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsCisweDhEMDdDODIwLCAweEU2REM2MjAzLCAweDYwMjMyMjY5LCAweDgxRTFBMDAyLAorMHg2NDRDRTRGRiwgMHg2MjEwRDE0OSwgMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwKKzB4NjU0REVCRkYsIDB4MzVCMDZCQkMsIDB4REIzNjhCMkIsIDB4NjRBMzRCMEIsCisweDQxMEJEMTM1LCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweEM5NDhEQjQwLAorMHhEQzQwODgwOCwgMHhCRUFFOEIwMSwgMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwKKzB4REIzREVDMDEsIDB4RDEzRDJEQzIsIDB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsCisweDIxMjI4ODA1LCAweDJCMDI4RjA4LCAweDY2NkNFNjgwLCAweDY1NjNEMjM4LAorMHg3NTQ5RTcwMCwgMHg2NDczNDIwQiwgMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwKKzB4ODVFMjgwMDAsIDB4MjBCOUVCRkMsIDB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsCisweDYyMDMyMDQ5LCAweDQ1MDg4NUY4LCAweDgxRTIyMDFCLCAweEM5MDE2MEMzLAorMHg0MDA4NDAxOCwgMHg0MDA4NDAwOCwgMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwKKzB4ODVFNDgxRTMsIDB4NDExOEUxMDgsIDB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsCisweDIwQjk4NTIxLCAweDY3QTI4MTIxLCAweENCMDE2MDcxLCAweDg1RjgyNzAxLAorMHg4OTAzMzA0MiwgMHhFQ0U3ODVFMiwgMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwKKzB4QTAzQjAwMDksIDB4N0UwMzAwMDksIDB4MDAxQzNEMzAsIDB4MDAyMDNEODgsCisweDAwMjAzNEZDLCAweDAwMUUyMTJDLCAweDAwMjAzM0UwLCAweDAwMUMzRDAwLAorMHgwMDExNzc4MCwgMHgwMDIwMTRBMCwgMHgwMDIwMTY2QywgMHgwMDExNzcwQywKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTUsIDB4MDAyMDM5MTAsIDB4MDAyMDE4QTIsCisweDAwMUMzNkY4LCAweDAwMjAzOTg4LCAweDAwMjAzRDk4LCAweDAwMjAzQjdDLAorMHgwMDIwM0JGQywgMHgwMDIwM0M3QywgMHgwMDIwM0NGQywgMHgwMDIwMzkwMCwKKzB4MDAyMDM0RjQsIDB4MDAyMDE0Q0MsIDB4MDAyMDM5OEMsIDB4MDAyMDM5OTAsCisweDAwMjAyNDU0LCAweDAwMjAzRDgwLCAweDAwMjAzRDg0LCAweDYwMjI2MkYyLAorMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjBCODgwQSwgMHg2MEUyREU4QywKKzB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsCisweDI4MDJBMDA2LCAweDY1RTJERTg3LCAweDJFNTI3NTAxLCAweDI4NjI2NkEyLAorMHg1MkYzNjZGMiwgMHgyNjIyQUU4MywgMHhEMjgzODU1MSwgMHhERTgzQzgwMiwKKzB4QTA5NThCMDEsIDB4NDIwQjAwMDksIDB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsCisweDg1RTQ2NTAzLCAweDQ5MThFOTA4LCAweEQ3N0QyMDlCLCAweEUwNEM4MUU0LAorMHhEQzdDMEI3RSwgMHg3QjAxRDk3QywgMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwKKzB4OEQwNjI2NjgsIDB4RDQ3OTJDMTIsIDB4NDIwQkQyNzksIDB4QTA3MEVCMDEsCisweDYyNTEyREIyLCAweDRCMThFQjBGLCAweDIyQjlFMTAyLCAweDMyMTA0MTE4LAorMHg4NTUxOEIwRiwgMHgyMDI5RTJGQywgMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwKKzB4ODVFMTI1MDEsIDB4MjAyOTk0QTMsIDB4ODVFNDgxRTEsIDB4QTA1MjIwNDksCisweDY3NTE4MUU0LCAweDQ3MTk2NzdELCAweDY2N0U2Nzc5LCAweDc3MDEyNzZELAorMHg2OTAzNjA3QywgMHg4ODAxNDkxOCwgMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwKKzB4MjFCMjdCMDEsIDB4NjYwRDg1RTMsIDB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsCisweDZDMDM0NjAwLCAweDI2MkQzMjJBLCAweEM4MDE2MDYzLCAweERCNUVEMTVELAorMHg5NjdEODkwMSwgMHhFNjAwMkM2QiwgMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywKKzB4NjIyRDAyMUQsIDB4OEQwRTMyNzAsIDB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsCisweDhCMDEzMjkwLCAweDAxQzVBMDA3LCAweDYyNkM3NjAxLCAweDMyOTJFOTA0LAorMHg2NDZDOEJFQiwgMHg2MDQzNDQwMCwgMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwKKzB4NjY5RDY5MTEsIDB4ODkwNzM2NzAsIDB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsCisweEUyMDFEQjRCLCAweDJCMjAyMUMxLCAweEVDRkM4NTUxLCAweDgxNTEyMEM5LAorMHhDQjAxNjA1MSwgMHhEQzQ3MjUwMSwgMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwKKzB4ODVFRjI2MTIsIDB4NTRGMkQyNDQsIDB4NjUwRDQyMEIsIDB4MDAwOUFERTcsCisweEU1MDBEQzQyLCAweDQyMEIyQzUyLCAweDRFMEI2NEEzLCAweDU0MDM2NDAzLAorMHg4NTQ0NkUwMywgMHg2NzAzRTkwOCwgMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwKKzB4REIzMjM3OTAsIDB4OEYwQkQ5MzIsIDB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsCisweEM5NDg2MDUzLCAweDhCMDM4ODA4LCAweEU1MDFCRDRELCAweDAwMDlBMDA1LAorMHgyMTI4RDIzMywgMHhCRDQ2ODkwMSwgMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywKKzB4QURCQ0VDMDEsIDB4ODVGMjJEQzIsIDB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsCisweDhEMDI4MUYyLCAweEFEQTk3QTA4LCAweDdGMTQwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwKKzB4MkZFNjgwMDAsIDB4RDIyMzRGMjIsIDB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsCisweEJCRjkyMkUyLCAweEUyNDAwMDA5LCAweDJFMjg0MjE4LCAweEJDMDQ4OTAxLAorMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwgMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwKKzB4MDAwOUJDMDMsIDB4QzgwNTYwRTMsIDB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksCisweDg5MDJDODAyLCAweEFDMDA0RjI2LCAweDRGMjY2RUY2LCAweDZFRjYwMDBCLAorMHgwMDFDM0QzQywgMHgwMDExNzc2MCwgMHgwMDIwMTRBMCwgMHgwMDIwMTY2QywKKzB4MDAyMDM0OEMsIDB4MDAyMDNEOUMsIDB4MDAyMDM5MDAsIDB4MDAyMDM0RjQsCisweDAwMjAxNENDLCAweDAwMjAzOTZDLCAweDAwMjAzOTc0LCAweDAwMjAzOTY4LAorMHgwMDIwMzk2QSwgMHgwMDIwMTUzMCwgMHgwMDIwMThFRSwgMHgwMDIwMzk4QywKKzB4MDAwMDgwMDAsIDB4MDAxQzM1MTAsIDB4MDAyMDNEOTAsIDB4MDAyMDE4QTIsCisweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LAorMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwKKzB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsCisweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAzNDBBLAorMHgwMDIwMzNDMCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsCisweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywKKzB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsCisweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNkM3NTRBLCAweDMyMjAzMTIwLAorMHgyMDM4MzAzMCwgMHgzMjNBMzEzMiwgMHgzMjMxM0EzNywgMHgwMDAwMDAwMCwKKzB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NDI3MDczNzIsIDB4M0QyMDY2NzUsCisweDU1NEUyMDNELCAweDIwMkM0QzRDLCAweDZFNDk2NzdBLCAweDRFNDk3Mjc0LAorMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywKKzB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksCisweDUyNTA0NTQ1LCAweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLAorMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwKKzB4NDM1RjRENUEsIDB4NDY1RjQ0NEQsIDB4NEM0NDVGNTcsIDB4NDk0RTQ5NUYsCisweDAwMDAwMDU0LCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMzUxLCAweDAwMDAwMDIwLCAweDIwM0EzNDUxLCAweDAwMDAwMDIwLAorMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywKKzB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4NkYyMDZDNjksIDB4Njk3NDIwNkUsCisweDBEMEE2NTZELCAweDAwMDAwMDAwLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLAorMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwgMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwKKzB4NjI3MzU1NzYsIDB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsCisweDYyNzM1NTc2LCAweDczNjU3MjVGLCAweDAwMEEwRDZELCAweDAwMDAwMDQ0LAorMHg0NDM4NzU3MCwgMHg3MjYzNzM2NSwgMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwNDcsIDB4MDAwMDAwNDIsIDB4NzI3NDZFNDksCisweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLAorMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwKKzB4MDAwMDAwNDksIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsCisweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLCAweDAwMDAwMEZGLAorMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwgMHgwMjAwMDAwMywKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAwMDAwRkYsCisweDAwMDIwMDAxLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwMDIwMDAzLCAweDAxMDkwMTA4LCAweDAwMDIwMTBBLCAweDAwMDMwMDAzLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsIDB4MDIwMDAxMEYsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMTBGMDEwRiwKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsCisweDAwMDAwMDQ2LCAweDAwMDAwMDU5LCAweDczMjA0MTQyLCAweDAwM0Q3MTY1LAorMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAyMDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDIwMDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwgMHgwMjA5MDEwMCwKKzB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsCisweDAyMDEwNTA3LCAweDA3MDAwMDQwLCAweDQwMDI4MjA1LCAweDA1MDcwMDAwLAorMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTU5Mjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfQkEuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9CQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzQxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfQkEuYwpAQCAtMCwwICsxLDg3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTE3RkZDLCAweEUxMTRENzkxLAorMHgxRTEzRDQ5MSwgMHgxRTRDNDcwQiwgMHgwMDA5QjAxNywgMHg5NUMyRTYwMCwKKzB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsIDB4OEZGOTM2NTIsIDB4RDQ4Qjc2MDEsCisweDRFMEJERThCLCAweEQ0OEIwMDA5LCAweDAwMDk0RTBCLCAweDRFMEJENDhBLAorMHg3RjA0MDAwOSwgMHhBMDQ3NEYyNiwgMHg0RjIyNkVGNiwgMHg0MTBCRDE4NywKKzB4RDQ4NzAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1ODYsIDB4RDc4NjAwMDksCisweDYxMURFMUZGLCAweEQxODUyNzEyLCAweDYwMTJFMkZGLCAweENCMDFENDg0LAorMHg3MURDMjEwMiwgMHg3MTA0MjEyMiwgMHgyMTIyRTUwMSwgMHhENTgxMjQ1MiwKKzB4RDI4MTk3OTIsIDB4RTcwMDI1NzIsIDB4RDQ4MUQxODAsIDB4MjI3MEQ2ODEsCisweDIxNzJFMjAxLCAweDI2MjAyNDcwLCAweEU0RkZENjdGLCAweEU2MDAyNjQxLAorMHhFMTA0RDU3RSwgMHg2MDYzNjY2RCwgMHg2MjZENzYwMSwgMHgzMjEyNDAwMCwKKzB4MDU0NThGRjgsIDB4RTUwMUQyN0EsIDB4RDE3QTIyNTAsIDB4RDU3QkQ0N0EsCisweEU3MDBFNjAwLCAweDI1NzIyNDcwLCAweDExNjIyMTYyLCAweDExNjkxMTY2LAorMHg0RjI2MTE2QSwgMHgxMTZFMDAwQiwgMHhEMTc1N0ZDNCwgMHgyRjEyRDg3NSwKKzB4RDQ3NkQxNzUsIDB4RDU3N0Q2NzYsIDB4MUY4N0Q3NzcsIDB4RDk3Nzc4RkMsCisweDFGMUJEMjc3LCAweDFGNDE3MTA0LCAweDFGNjQ3NDA0LCAweDFGODg3NjA0LAorMHg3MUY0MUYxQywgMHgxRjQyRThDOCwgMHgxRjY1MUY1MywgMHgxRjk5MUY3NiwKKzB4MUYxRDFGMkEsIDB4REQ2RjY4OEMsIDB4REE3MERFNkYsIDB4REM3MURCNzAsCisweDAwMDk0QTBCLCAweDAwMDk0QjBCLCAweDAwMDk0QzBCLCAweDYwMTBEMTVFLAorMHg4QjBGODgwMSwgMHhFOTUwRDE1RCwgMHg0OTE4NjIxMiwgMHg4QjA3MzI5NiwKKzB4NTZGQUQxNTksIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDIsCisweDIxMjI3MjAxLCAweDg4MDE2MEQyLCAweEQxNjM4OTA3LCAweDMyODY2MjEyLAorMHhEMTYyODkwMywgMHg4ODAxNjAxMCwgMHg2NEUyOEJEQSwgMHg1MkY3NTFGOCwKKzB4NTVFMTIxNDIsIDB4MjI1MkQxNUUsIDB4NjYxMjU0RkIsIDB4MjQ2MjU5RkMsCisweDI5NzI1NzExLCAweDg4MDE2MEQyLCAweDY2RTI4QjUzLCAweDM2MjA1MkUxLAorMHg2MDYxODk0QywgMHg4ODAxQzkwRiwgMHhEMTU2OEI0OCwgMHgzNjIwNjIxMiwKKzB4QTA0Mzg5MDMsIDB4MjcxMDIxNjIsIDB4RDU1MzBGQTAsIDB4NjY1MUU3MTAsCisweDYyNkQ3NjAxLCAweDhGM0MzMjczLCAweDY1RjIyNTYxLCAweDY5NTI1MUYyLAorMHg1NEYzNTlGMSwgMHg2NzkyNTJGNCwgMHg2MTQyNjUxMiwgMHg1NkY2NjkyMiwKKzB4NjQyMjUyRjUsIDB4Q0IyMDYwNjIsIDB4RTYwMDI2MDIsIDB4NzYwMTFGMUUsCisweDYyNkRFMTEwLCAweDMyMTM0MTE4LCAweDUxRkU4RkY4LCAweDI2NzI1NkYxLAorMHg1NkY0NTdGMiwgMHg1NUYzMjc1MiwgMHgyNTEyNTdGNSwgMHgyNzQyMjY5MiwKKzB4NTFGOTY5RTIsIDB4MjE5MkQ0M0QsIDB4RTkwMTYxRjIsIDB4MjE5MjQ0MEIsCisweDQ5MTg2NUYyLCAweEQ5MzgyNTkyLCAweEUyMDBENTM5LCAweDYyNTEyOTIxLAorMHg3MjAxNTRGRCwgMHg2MjJEMjUyMSwgMHgyNDIyQTAwMywgMHhFMjAwRDkzMiwKKzB4RTkwMTI5MjEsIDB4MkQ5MkQxMkMsIDB4MjY2ODY2MTIsIDB4QUY2RjhCMDEsCisweEQ2MzAwMDA5LCAweDAwMDk0NjBCLCAweEU3MDBEMTI4LCAweDIxNzBBRjY4LAorMHgwMDFDMDAxQywgMHgwMDIwMEY3QywgMHgwMDAwQjM4RSwgMHgwMDIwMzIyQywKKzB4MDAyMDE0NUUsIDB4MDAyMDMyMzgsIDB4MDAyMDMyNTAsIDB4MDAyMDE0MUMsCisweDAwMjAxNTFDLCAweDAwMjAwRkEwLCAweDAwMUMzNTEwLCAweDAwMUMzNjQ4LAorMHgwMDFFMjEyQywgMHgwMDIwMzE4OCwgMHgwMDIwMkQyNCwgMHgwMDIwMzE5MCwKKzB4MDAyMDMxOUMsIDB4MDAyMDMxQTgsIDB4MDAyMDMxQjgsIDB4MDAyMDMxQkMsCisweDAwMjAzMUIwLCAweDAwMTE3NzA4LCAweDAwMjAzMUIxLCAweDAwMjAzMUI0LAorMHgwMDFDM0QzMCwgMHgwMDExNzcxOCwgMHgwMDExNzczNCwgMHgwMDFDM0I5QywKKzB4MDAxQzM3MDQsIDB4MDAxQzNEOTgsIDB4MDAxQzM1MDAsIDB4MDAxQzNEMDAsCisweDAwMUMzNkY4LCAweDAwMUMxMDI4LCAweDAwMjAyRDk4LCAweDAwMjAxMzI4LAorMHgwMDIwMkMwNCwgMHgwMDIwMUUxOCwgMHgwMDIwMzRCQywgMHgwMDIwMzFCQSwKKzB4MDAyMDJEOTAsIDB4MDAyMDMxQ0MsIDB4MDAyMDMxRDAsIDB4MDAyMDEyNzYsCisweDAwMjAzMUQyLCAweDAwMjAxRkQwLCAweDJGQjYyRjk2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhERTk0N0Y4QywgMHg2MUUwRTAyNCwgMHgwRjE0RDQ5MywKKzB4NzEwMTYxRTMsIDB4RDc5MjYyMTAsIDB4NDcwQkUwMjgsIDB4RDU5MTBGMjQsCisweDAwMDk0NTBCLCAweDZEMDMyMDA4LCAweDFGMEI4RjExLCAweEQ0OEZEQzhFLAorMHhERDhGNjdDMCwgMHg2NTdDNEQwQiwgMHhERDhGRDE4RSwgMHg2QjlDNjkxMCwKKzB4NDIwODYyQjMsIDB4MzJCODQyMDgsIDB4M0QyQzQyMDgsIDB4RTAyODFGREIsCisweEU1ODAwNEZDLCAweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjEzLAorMHgwMUZDRTAyNCwgMHg2NDFDRTUwMCwgMHg2MjVEREU4NCwgMHg4QjAxMzI0MywKKzB4MDAwOUEzM0QsIDB4Njc1MzY1NUQsIDB4NjA3MDM3RUMsIDB4MzlEQzY5NTMsCisweEFGRjI3NTAxLCAweDIwMDg4MDk0LCAweEUwMjQ4QjEzLCAweEU1MDAwMUZDLAorMHhBMDA5REU3QSwgMHg2NTVENjQxQywgMHgzMkVDNjI1MywgMHg2QzUzNkIyMiwKKzB4M0NEQzY3QjIsIDB4NzUwNDFDNzEsIDB4MzI0MzYyNUQsIDB4QTMxRThCRjMsCisweDg4MDEyRDEwLCAweEUwMjQ4QjE2LCAweEU0MDAwMUZDLCAweDY3MUMyRDQwLAorMHg2MjREREU2RSwgMHg4QjAxMzI3MywgMHgwMDA5QTMxMSwgMHg2Q0UzNjQ0RCwKKzB4N0MwNDY5NDMsIDB4MzlFQzZCNDMsIDB4NjU5MjNCQ0MsIDB4NzQwODZEQjIsCisweDI1RDJBRkVGLCAweDhCMTk4ODA0LCAweDAxRkNFMDI0LCAweDJENzBFNzAwLAorMHgxRkQ4NkQxQywgMHg2MjdEREU2MSwgMHg4QjAxMzJEMywgMHgwMDA5QTJGNywKKzB4NkI3MzY3N0QsIDB4M0JFQzYxRTMsIDB4NzEwNDY0QjIsIDB4M0MxQzZDNzMsCisweDY5NDI2NUMyLCAweDI5NTk3NzA4LCAweDI0OTJBRkVELCAweDhCMTg4ODA1LAorMHgwMUZDRTAyNCwgMHgyRDQwRTQwMCwgMHhERTU0NjcxQywgMHgzMjczNjI0RCwKKzB4QTJEQzhCMDEsIDB4NjQ0RDAwMDksIDB4NkJFMzZENDMsIDB4NjVEMjNERUMsCisweDYxNDM3QjA0LCAweDZDMTIzMUJDLCAweDc0MDg2OTUyLCAweEFGRUQyOUNCLAorMHg4ODMxMjU5MiwgMHhERTRBOEIyMCwgMHg2NUU2REI0QSwgMHg2MUU2REM0QSwKKzB4NjdFMkQ5NEEsIDB4NjJFMjdFMDQsIDB4MUZFQzdFRTgsIDB4N0UwNDY0RTIsCisweDZFRTIxRkVELCAweDVCRkQyQkUwLCAweDYwQjI3QjA0LCAweEM5MDExRkJFLAorMHg2QkIyMkMwMCwgMHgyOUIwNEIwOSwgMHhEQzQxMkYyNiwgMHg2NjEzNEMwQiwKKzB4RTIwMDdGMDQsIDB4MkQyMEEyQUIsIDB4OEIyMTg4MzAsIDB4RDkzOURFMzgsCisweEUwNjQ2NUU2LCAweDcyMDQ2MkUzLCAweDY3MjY2NkUyLCAweDZFMjNEQzM2LAorMHg2MjIyN0VFOCwgMHg2QkUyNjFFNiwgMHgyOUIwMUZFRiwgMHg3RTA0MEYxNiwKKzB4QzkwMTYwRTIsIDB4NkVFMjJDMDAsIDB4NEUwOURDMzAsIDB4MkYyNjJDRTAsCisweEQxMzBFMDY4LCAweDA0RkU0MTBCLCAweEUyMDA3RjA0LCAweDJEMjBBMjg3LAorMHg4QjA1ODgzMywgMHg0RTBCREUyQywgMHhFMTAwMDAwOSwgMHgyRDEwQTI3RiwKKzB4ODkwMTg4MjgsIDB4MDAwOUExMDYsIDB4RTE0M0RFMjAsIDB4RTA0MDYyRTEsCisweDMyMTc2MjJELCAweDBGRTY4RjA0LCAweDYwMjNFMjQwLCAweDI2MjEwNkZFLAorMHg4QjAxMzIxNywgMHgwMDA5QTBFRiwgMHgwMkZFRTA0MCwgMHg4NTIxRTQwMSwKKzB4OEIwMTMwNDYsIDB4MDAwOUEwRTcsIDB4RTUwMUUwNDAsIDB4MkQ1MDA3RkUsCisweDY0NzFCMjY1LCAweDA5RkVFMDQwLCAweDYyOTFFMTQzLCAweDY1MkRFMDY4LAorMHg4RDZCMzUxNywgMHhFNjQwMEY1NiwgMHg4QjI3MzU2MywgMHhFMDQ4RTYwMCwKKzB4RTExQTBGNjUsIDB4NzJDMEEwMzEsIDB4MDAxMTc4MDAsIDB4MDAyMDMyNTQsCisweDAwMjAxNDVFLCAweDAwMjAyNTg4LCAweDAwMjAzMUEyLCAweDAwMjAzMjU4LAorMHgwMDIwMTRBQSwgMHgwMDIwMzFBMSwgMHgwMDIwMkRDOCwgMHgwMDExNzgwNCwKKzB4MDAxMTc4MTAsIDB4MDAyMDMxOUQsIDB4MDAyMDMxOUUsIDB4MDAyMDMxOUYsCisweDAwMjAwQzJDLCAweDAwMjAwQzgwLCAweDAwMjAwQzdDLCAweDQxMjE2MTUzLAorMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDUyMSwgMHg2MDUzNDUyMSwKKzB4NjYwM0M5MDMsIDB4MEY2NUUwNDgsIDB4RTAwNzcxMTgsIDB4RTA0NDIyMDksCisweDY0MUQwRjI1LCAweDY1RjNFMDRDLCAweDBGNDZCMjhDLCAweDA0RkRFMDQ4LAorMHgwQkZERTA0NCwgMHg2MUJENjc0RCwgMHg0MTA4NDcwOCwgMHgwRjE2RTA1MCwKKzB4RDI5QjYwNzMsIDB4NDIwQjA5RkUsIDB4NkMwN0UwMEYsIDB4NjA3MzI5QzksCisweEUwNDAwRjk2LCAweDY1RjMwRUZFLCAweDZEMEQ4NUUyLCAweDAxRkVFMDUwLAorMHg2MEQzNDIwQiwgMHg2MDczMjkwQiwgMHhFMDRDMEY5NiwgMHgwNEZFQjI1MSwKKzB4MDZGRUUwNDAsIDB4NjI2MUUwNjgsIDB4MEY1NjY1MkQsIDB4MzU2M0U2NDAsCisweEUwMDA4OTRFLCAweDYwMjM4MUY4LCAweDQwMDhDOTAzLCAweDZCMDM0MDAwLAorMHhFMDU0NjEwMywgMHhFMDU4MEZCNiwgMHhFQ0ZGREQ4NSwgMHg2Q0NDMEZGNiwKKzB4MEZENkUwNkMsIDB4NEQwQjYwQzMsIDB4NDIyMTYyNTMsIDB4NDIyMTQyMjEsCisweDY0MjM0MjIxLCAweDMyNEM0MjAwLCAweEUwNUM2RTA3LCAweDQ1MjE0MjAwLAorMHhFMDQwMEZFNiwgMHgwQkZFNDUyMSwgMHhDOTAzNjA1MywgMHgzMEZDNDAwOCwKKzB4NkQwMzdCMDYsIDB4ODVGODFGMDUsIDB4NkMyRDFGQjcsIDB4MUZDNjZFMDMsCisweDBGQzZFMDYwLCAweDA1RkVFMDU4LCAweDY0QzNCMjJDLCAweDMzRkNFMzU0LAorMHg1NjMyNjJEMiwgMHgyMjY5NjEzMiwgMHg2N0I0MkQyMiwgMHg0OTBCNTkzNiwKKzB4MjIwQjYwN0MsIDB4MDVGRUUwNTgsIDB4NjRDMzJEMjIsIDB4N0UwMUIyMDEsCisweEU3MDY2MkVELCAweDhGRTMzMjczLCAweEUwNDA3QzAxLCAweDYyNjEwNkZFLAorMHgwNkZFRTA0MCwgMHg4NTYxNDIwMCwgMHgzMDJDNzYwQywgMHg2MTAzNzAxQiwKKzB4NjRGM0U1MDAsIDB4NzUwMUU3MDQsIDB4NkI1RDY5NjYsIDB4MjQ5MjNCNzMsCisweDc0MDQ4RkY5LCAweEIxRTQ2NUYzLCAweEUwNDA2NDFELCAweEIxQTMwNkZFLAorMHhBMTdDNjQ2MSwgMHhENDU3MDAwOSwgMHhFMjAxRDc1NywgMHgyRDIwNDcwQiwKKzB4MDAwOUExNzUsIDB4OEIwNzg4MjksIDB4RUMwMERFNTQsIDB4NjFFMjJEQzAsCisweDY0MURCMTc1LCAweDAwMDlBMTZCLCAweDYyMkNFMjgxLCAweDhCMDEzMDIwLAorMHgwMDA5QTBCNiwgMHgwNkZDRTAyOCwgMHhFNjgyNjI2QywgMHgzMjYwNjY2QywKKzB4NTZGQjhCMjAsIDB4MjYxMEUxMjQsIDB4NTIxN0QxNDksIDB4NTIxODE2MjEsCisweDUyMTkxNjIyLCAweDUyMUExNjIzLCAweDU1MUIxNjI0LCAweDE2NTVFMjAwLAorMHgxNjU2NTUxQywgMHgxNjU3NTUxRCwgMHgxNjU4NTUxRSwgMHgxNjU5NTUxRiwKKzB4MTEyODExMjcsIDB4MTEyQTExMjksIDB4MTEyQzExMkIsIDB4MTEyRTExMkQsCisweDExMkZBMTNELCAweDY2NkNFNjgzLCAweDhCMEIzMjYwLCAweEQ2Mzc1MkZCLAorMHgyMjUwRTUwMCwgMHhEMjM3NjU2MiwgMHgyMjUyNzYwNCwgMHhENjM2NjI2MiwKKzB4MjYyMEExMkQsIDB4NjY2Q0U2OTAsIDB4OEIwMzMyNjAsIDB4MDAwOUIxQzcsCisweDAwMDlBMDExLCAweDY2NkNFNjkxLCAweDhCMTAzMjYwLCAweDYyNTJENTJCLAorMHgyMjI4NjIyQywgMHhEMjJEODkwNCwgMHgwMDA5NDIwQiwgMHgwMDA5QTAwMywKKzB4NDIwQkQyMkIsIDB4NTZGQjAwMDksIDB4QTExMEUyMDAsIDB4RTZCMDI2MjAsCisweDMyNjA2NjZDLCAweEUwMjQ4QjM0LCAweEUwNzAwMkZDLCAweDBGMTY2MTJDLAorMHhFQjA0RUMwMCwgMHgwMUZFRTA3MCwgMHgzMjEzNjJDRCwgMHhBMEZFOEIwMSwKKzB4RDIxQTAwMDksIDB4NkRDMzZDQ0QsIDB4NzIwNDNEMkMsIDB4MzEyQzYxQzMsCisweDZEMTI2RUQyLCAweEQxMTRENDFCLCAweDAwMDk0MTBCLCAweDQxMEJEMTFBLAorMHhENDFBNjRFMywgMHg0MjBCRDIxMCwgMHhEMjE3MDAwOSwgMHg2NEQzNDIwQiwKKzB4RDYwREQ0MTcsIDB4MDAwOTQ2MEIsIDB4NjFFM0U2MDAsIDB4MzE2QzY2NkQsCisweDYyNkQ3NjAxLCAweDIxRDAzMkIzLCAweDREMTk4RkY3LCAweDdDMDhBRkQyLAorMHhEMjExRDQxMCwgMHhENDExNjU0MiwgMHgwMDA5NDIwQiwgMHgwMDA5QTBDRiwKKzB4MDAyMDJDODAsIDB4MDAyMDMyNzgsIDB4MDAyMDE0NUUsIDB4MDAxMTc4MDQsCisweDAwMjAyRDJDLCAweDAwMjAzMTg4LCAweDAwMjAzMTlDLCAweDAwMjAwQ0JBLAorMHgwMDIwMENFMCwgMHgwMDIwMzI5MCwgMHgwMDIwMTRBMiwgMHgwMDIwMzJBNCwKKzB4MDAyMDMyQUMsIDB4MDAxMTc4MDAsIDB4MDAyMDE0QUEsIDB4MDAyMDMyQjAsCisweEQ1QjVEMUI0LCAweDYyNTJFMDQwLCAweDc1MDQ2NjEyLCAweDIxNjIzNjJDLAorMHg1NjExNjI1NiwgMHgxMTYxMzYyQywgMHg2MjUyNjY1MywgMHg3NjA4NTUxMiwKKzB4MTE1MjM1MkMsIDB4NTUxMzYyNjIsIDB4MzUyQzc2RUMsIDB4NjU2MzExNTMsCisweDU2MTQ2MjYyLCAweDM2MkM3NTEwLCAweDY2NTMxMTY0LCAweDU1MTU2MjUyLAorMHgzNTJDNzYxMCwgMHg2MjYyMTE1NSwgMHgzNjJDNTYxNiwgMHhENkEzMTE2NiwKKzB4NTUxNzYyNjIsIDB4MzUyQzc2MDQsIDB4NjI2NjExNTcsIDB4MzUyQzU1MTgsCisweDY1NjMxMTU4LCAweDU2MTk2MjYyLCAweDM2MkM3NTA0LCAweDYyNTYxMTY5LAorMHgzNjJDNTYxQSwgMHg2MjU2MTE2QSwgMHgzNjJDNTYxQiwgMHg2NjUzMTE2QiwKKzB4NTUxQzYyNTIsIDB4MzUyQzc2MDQsIDB4NjI2NjExNUMsIDB4MzUyQzU1MUQsCisweDYyNjMxMTVELCAweDU1MUU2NjYyLCAweDM1NkM3MjA0LCAweDY2MjIxMTVFLAorMHhENThGNTIxRiwgMHgxMTJGMzI2QywgMHgwNjFFNjI1MiwgMHgzNjJDNzU5NCwKKzB4RTA0NDAxNjYsIDB4NjI1MjY2NTMsIDB4NzY0NDA1MUUsIDB4MDE1NjM1MkMsCisweDYyNjJFMDQ4LCAweDM2MkMwNjFFLCAweEQ2ODYwMTY2LCAweDYyNjJFMDU0LAorMHg0MjI5MDUxRSwgMHgwMTU2MzUyQywgMHg2MjYyNzYwNCwgMHgwNjFFRTA1OCwKKzB4MzYyQzQyMjksIDB4NTZGQjAxNjYsIDB4MjYyMEUyMzgsIDB4MDIxRUUwNDQsCisweDE2MjFFMDQ4LCAweDE2MjI2MjEyLCAweDE2MjM1MjExLCAweEUyMDA1NTEyLAorMHg1NTE1MTY1NCwgMHg1NTEzMTY1NSwgMHg1NTE2MTY1NiwgMHgwNTFFMTY1NywKKzB4MTY1OEUwNDAsIDB4RTA1MDA1MUUsIDB4NTUxNDE2NTksIDB4MDUxRTE2NUEsCisweDE2NUJFMDRDLCAweEUwNTQwNTFFLCAweDA1MUUxNjVDLCAweDE2NURFMDU4LAorMHhFMDQ0MDUxRSwgMHgwMTI2MTY1RSwgMHgyMTIyRTA0OCwgMHgxMTIyMTEyMSwKKzB4MTEyMzExMjUsIDB4MDEyNjExMjYsIDB4MDEyNkUwNDAsIDB4MTEyNEUwNTAsCisweEUwNEMwMTI2LCAweEUwNTQwMTI2LCAweEUwNTgwMTI2LCAweDdGNzQwMTI2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHgwMDBCNkJGNiwgMHg0RjIyNjlGNiwKKzB4RTI0MDYxNEQsIDB4ODkxNDMxMjMsIDB4MzEyN0UyMUYsIDB4OEIwOUQ3NUEsCisweEQ0NUE2MTRELCAweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LAorMHgxNzYxQTAwNywgMHhFMDAxRDQ1NSwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywKKzB4NEYyNjI3NjIsIDB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsCisweEUyMUY4OTEyLCAweEQ3NEMzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjRCLAorMHg0MjBCNzFFMCwgMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDI0NywKKzB4RTAwMTQyMEIsIDB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksCisweDQ2Mjg0NjE4LCAweDYyNTJENTQyLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLAorMHg0NjE4RTY4MCwgMHhENTNFNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywKKzB4QTAwMTAwMDksIDB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsCisweDQ2MThFNjgwLCAweEQ1Mzc0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLAorMHgyRkU2MDAwOSwgMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwKKzB4RTI4MEQ2MzEsIDB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsCisweDU3RTMxNjU3LCAweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LAorMHg2RUY2QUZDRSwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQyNiwKKzB4NkU0M0JGRDYsIDB4MkRFMkJGQkIsIDB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsCisweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwKKzB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4NEYyMjAwMDksCisweEQxMTdENDE2LCAweDAwMDk0MTBCLCAweEQ0MTdEMjE2LCAweEU1MDU2MDIyLAorMHgyMjAyQ0IyMCwgMHhENTE1MjQ1MiwgMHg0NTBCRTcwMCwgMHhENzE0MjQ3MiwKKzB4MDAwOTQ3MEIsIDB4RTYwMUQxMTMsIDB4MjE2MkQyMTMsIDB4NEYyNjQ2MTgsCisweDIyNjIwMDBCLCAweDAwMjAyRDJDLCAweDAwMUMzNkEwLCAweDAwMUMzQ0EwLAorMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwgMHgwMDFDMzcwNCwgMHgwMDIwMkM4MCwKKzB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsIDB4MDAxQzM3MEMsIDB4MDAyMDMyQzQsCisweDAwMjAxNDVFLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweDAwMjAxNEQ0LAorMHgwMDIwMEZBMCwgMHgwMDFFMjEyQywgMHgwMDFDM0QzMCwgMHgwMDA5QTFBOSwKKzB4MkZFNjJGRDYsIDB4REQ4RjRGMjIsIDB4QTAwNDlFQTcsIDB4RDQ4RTAwMDksCisweDQyMEJEMjhFLCAweDYyRDI2NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LAorMHhEMjhBRDQ4QiwgMHg1NUQxNDIwQiwgMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwKKzB4RDQ4ODAwMDksIDB4NDIwQkQyODUsIDB4NTJEMjU1RDIsIDB4OEJGODIyRTgsCisweDAwMDlBMDA0LCAweEQyODFENDg0LCAweDU1RDM0MjBCLCAweDIyRTg1MkQzLAorMHhBMDA0OEJGOCwgMHhENDgxMDAwOSwgMHg0MjBCRDI3QywgMHg1MkQ0NTVENCwKKzB4OEJGODIyRTgsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZFNjM2RDczLCAweDZDNTNCMDE4LCAweDY0QzM1N0Y0LAorMHhCMDU0NjVFMywgMHhCMDZBNjZEMywgMHhCMDlBMDAwOSwgMHhCMDlFMDAwOSwKKzB4QjBBMjAwMDksIDB4QjBCRTAwMDksIDB4QjBDMTAwMDksIDB4QjEyNDAwMDksCisweDRGMjYwMDA5LCAweDZERjY2RUY2LCAweDZDRjZBMDIzLCAweDM0MTJEMTZDLAorMHhENjZDMDUyOSwgMHgyNjUwRDc2QywgMHgyNzQyMDAwQiwgMHgwMDA5QTAxNCwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZENzMsIDB4NkM1M0JGRUUsCisweDY0QzM1N0Y0LCAweEIwMkE2NUUzLCAweEIxMDY2NkQzLCAweDRGMjYwMDA5LAorMHg2REY2NkVGNiwgMHg2Q0Y2QTAwNSwgMHhFNjAzRDI2MCwgMHgwMDBCNDYxOCwKKzB4RDI1RTIyNjIsIDB4MDAwQkU2MDAsIDB4NEYyMjIyNjIsIDB4RTQwQUJGN0UsCisweDAwMDlCRjdFLCAweEUxMDREMjVBLCAweEU1MDA0MTE4LCAweDIyMTJFNDBBLAorMHgyMjUyQkY3NCwgMHg2MDcyRDc1NywgMHg0RjI2Q0IyMCwgMHgyNzAyMDAwQiwKKzB4RDE1NTRGMjIsIDB4RTQwMDQxMEIsIDB4NDUyQkQ1NTQsIDB4MkZFNjRGMjYsCisweDZFNjNEMTUzLCAweDQ0MTg2NjEyLCAweDQ1Mjg5MjEwLCAweDI2Mjk0NDA4LAorMHg0NDA4NDUwMCwgMHg0NDAwMjY1QiwgMHg0NzA4MjY0QiwgMHg0NzA4MjE2MiwKKzB4MjdFQkQxNEMsIDB4MDAwQjIxNzIsIDB4MDNGMDZFRjYsIDB4MkZFNjFGRkYsCisweERFNDk0RjIyLCAweEU0MEFFMTAxLCAweDJFMTJCRjQ4LCAweDcyNkM2MkUzLAorMHhFNDAxRTEwMCwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4RTczMDIyNDIsIDB4RTQwQUU1MDMsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjUyMjI3MiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MTIxQUJGMjIsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsCisweEQyMzI2RUY2LCAweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzAyMjQyLAorMHhFNjA1RDQzMCwgMHgwMDBCMjE2MiwgMHhENTJGMjQ2MiwgMHg2MDUwRDIyRiwKKzB4OEIwRTg4MDEsIDB4NjA0MEQ0MkUsIDB4OEIwNzg4MDEsIDB4OTYyNkQ1MkQsCisweDg4MDE2MDUwLCAweDk2MjM4QjBDLCAweDAwMDlBMDBBLCAweEEwMDc5NjIxLAorMHhFNjAwMDAwOSwgMHgyMjYyRDQyNiwgMHg4ODAxNjA0MCwgMHhFNjA0OEIwMCwKKzB4QUVGM0U0MEEsIDB4RDIyNDIyNjIsIDB4RTQwQUU2MDEsIDB4MjI2MkFFRUUsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDMjA0RjIyLCAweDYwQzJFRDAwLAorMHhDQjAxRUI2NCwgMHg2MEMyMkMwMiwgMHhBMDQxQzkwMSwgMHgwM0M0NkUwMywKKzB4MDM0MDAzRDQsIDB4MDAxQzNCODgsIDB4MDAyMDMyQzgsIDB4MDAyMDE0QUEsCisweDAwMjAzMkQwLCAweDAwMjAzMkQ4LCAweDAwMjAzMkUwLCAweDAwMjAzMkU4LAorMHgwMDI1RTcyMCwgMHgwMDIwMzRCOCwgMHgwMDIwMzE4QywgMHgwMDFDNTk2OCwKKzB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsIDB4MDAyMDEyNEEsIDB4MDAyMDEyNzYsCisweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLCAweDAwMUM2MjY4LAorMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDIwMzE5RSwgMHgwMDFDNTgwNCwKKzB4MDAyMDMxOUQsIDB4MDAyMDMxOUYsIDB4MDAxQzU4MUMsIDB4MDAxQzU4NjAsCisweDg5MDczREIyLCAweEU0MEE2MEMyLCAweEJFOUZDOTAxLCAweDdEMDE2RTAzLAorMHg4QkY1MkVFOCwgMHg4QjAzM0RCMiwgMHhEMjNFRDQzRCwgMHgwMDA5NDIwQiwKKzB4NEYyNkU0MEEsIDB4NkRGNjZFRjYsIDB4QUU4RjZDRjYsIDB4NDQxMTZCRjYsCisweDYwNEI4RjAxLCAweDAwMEI2MDQzLCAweDJGQjYwMDA5LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhEQzM0N0ZGQywgMHg2MEMyRUQwMCwgMHhDQjAyRUI2NCwKKzB4NjBDMjJDMDIsIDB4QzkwMjJGMDIsIDB4NkUwM0EwMDksIDB4ODkwODNEQjMsCisweEU0MEE2MEMyLCAweEM5MDIyRjAyLCAweDZFMDNCRTcwLCAweDJFRTg3RDAxLAorMHgzREIzOEJGNCwgMHhENDI5OEIwOCwgMHg3RjA0RDIyNiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweEQ1MjI2QkY2LCAweDYwNTI1NjUxLCAweDAwMEI0NjI4LAorMHgyRkI2MzA2QywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0RjAyNEYxMiwKKzB4NkU0M0JGRjEsIDB4REMxQjZCMDMsIDB4QkZFQ0REMUIsIDB4MzBCODAwMDksCisweDA2MEEzQzA1LCAweDQ2MDk0NjA5LCAweDNENjU0NjAxLCAweDQyMDkwMjBBLAorMHg0MjA5NDIwOSwgMHg4QkYwMzJFMiwgMHg0RjE2NEYwNiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4NEYyMjJGRTYsIDB4RTEwMkRFMEYsCisweEU0MDNFNTAwLCAweEJGRDQyRTEyLCAweEU2MDYyRTUyLCAweEU3MDA0NjE4LAorMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwgMHg2RUY2QUZDQiwgMHgwMDA5MDAwQiwKKzB4MDAyMDMyRjAsIDB4MDAyMDE0NUUsIDB4MDAxQzU4NjAsIDB4MDAyMDMzMDgsCisweDAwMUMxMDQwLCAweENDQ0NDQ0NELCAweDEwNjI0REQzLCAweDAwMUQ0MDA0LAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTUwMDdGRDgsIDB4NjQ1M0UxMTAsIDB4NkM1MzQxMjgsIDB4NjU1REVFMEEsCisweDQ2MDg2NjUzLCAweDQ2MDgzNjVDLCAweDM2MUM3NTAxLCAweDY3NUQ2MDQzLAorMHg2MEMzMEY2NiwgMHgzN0UzRUQwMCwgMHg4MTYxMjZDMSwgMHg4MTYzODE2MiwKKzB4MTZEMzE2RDIsIDB4OEZFQTE2RDQsIDB4NjhGMjc0MDQsIDB4REFCM0Q5QjIsCisweDI5ODIxOTgxLCAweEQxQjI1OUYxLCAweDJBOTIxQTkxLCAweDVCRjM1QUYyLAorMHg1RUY1NURGNCwgMHgxMUExNTRGNiwgMHgxMUIzMjFBMiwgMHgxMUQ1MTFCMiwKKzB4MTFFNzExRDQsIDB4MTE0OTExRTYsIDB4NTVGNzExNDgsIDB4RUUwMERCQTksCisweEREQTk1N0Y4LCAweEQ2QTk1MkY5LCAweDFCNTE2NEUzLCAweERCQTgyQjUyLAorMHhFQUI4RDhBOCwgMHgyRDcyRTk0NSwgMHg2QUFDMjYyMiwgMHg2RUVENDkwOCwKKzB4NEQwODZERTMsIDB4M0RFQzYxRTMsIDB4NEQwODQxMDgsIDB4M0RCQzMxRUMsCisweDQxMDg2MEMzLCAweDgxRDEyREMxLCAweDQxMDhFMDUwLCAweDQxMDg0MDA4LAorMHg2MEMzODFEMiwgMHhFNTAwMzE4QywgMHg4MUQzMzRBMiwgMHgxRDEzMUREMiwKKzB4OEQwMUQ0OTQsIDB4RDQ5MTFENTQsIDB4QjA4MTY1RDMsIDB4NjRFRDdFMDEsCisweDhCREMzNDkyLCAweERCOTREMThELCAweEQyOEI2ODEyLCAweDFCODE0ODI5LAorMHgyRkQyNjQxMiwgMHgyQjkyNjk0RCwgMHhEOThBNjcyMiwgMHgxQjczNDcyOSwKKzB4RDc4NzY4MjIsIDB4MUJBMjZBOEQsIDB4RDI4QzZCNzIsIDB4MjJCMkQ1ODYsCisweEUwMDM1RDcyLCAweDVFNzQxMkQyLCAweDEyRTQ0MDE4LCAweEQ2ODg1MTc2LAorMHg1NDc4MTIxNiwgMHgxMjQ4RTFGRiwgMHhENDg1Njc5MiwgMHg2ODUyMTI3QSwKKzB4MjhDMUU3MDMsIDB4ODE5MTY5NTIsIDB4NkE1MkUwNTAsIDB4ODFBMjQwMDgsCisweDYwQzM2QjUyLCAweDZENTI4MUIzLCAweDZFNTIxREQyLCAweDYyNTIxRTYzLAorMHgxMjY0RTYwMCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywgMHg2NjVEMjYxMiwKKzB4OEJGODM2NzMsIDB4RTAwM0Q0NzEsIDB4NDAxODY1NDIsIDB4Njc0MjI1QzEsCisweDgxNzFEMjc0LCAweEVFMDA2ODQyLCAweDY5NDIxODgyLCAweDE5MjNFMDI0LAorMHhFNTgwNkE0MiwgMHg2QjQyMUFFNCwgMHg4MUIyNjZFMywgMHhENDZENkM0MiwKKzB4NjU1QzgxQzMsIDB4NkQ2MzY2NkQsIDB4NjE2RDc2MDQsIDB4MzE1MzNENEMsCisweDJERTI4RkY4LCAweEQ1NjlEMjY4LCAweDc0MDQyNDIyLCAweDdGMjgyNDUyLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4NjY0MjY4RjYsIDB4QzgwMzYwNjEsIDB4RTUwMDhEMDQsIDB4QzkwMzYwNjEsCisweDhCMDM4ODAyLCAweDY1NjM1MjYyLCAweDI0MTI1MTI0LCAweDYwNTMwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwKKzB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsCisweDYwNTM4MTIzLCAweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjUwLAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwKKzB4NjVGMzYxRjEsIDB4MkYxMTIxNDksIDB4RDE0OTU0RDEsIDB4RTYxNDQxMEIsCisweDYwNzE1N0QxLCAweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywKKzB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsCisweDEyRTQ4QjA2LCAweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLAorMHg1NjY0QUZGMCwgMHg2NEYzRDIzNiwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywKKzB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMzAsCisweDQxMEJFNjE0LCAweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLAorMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgyRkU2NkRGNiwgMHg2MjRDNEYyMiwKKzB4NDIwOERFMUIsIDB4QTAwNTQyMDAsIDB4NTI1MjNFMkMsIDB4NTYyNEQ0MTcsCisweDJFNjJCRjhFLCAweDUyRTE2NUUyLCAweDhCRjYzNTIwLCAweDI2MjJENjFCLAorMHgwMDBCNEYyNiwgMHgyRkI2NkVGNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REIxQ0RDMTAsIDB4NjZDMjUyQzEsIDB4ODk0MDM2MjAsIDB4QzkwMzYwNjEsCisweDg5M0M4ODAxLCAweEREMThERTBCLCAweDY0RTNCRjYzLCAweDg1MDM2NTAzLAorMHg2MjBENjZCMiwgMHg4OTJCMzI2MiwgMHhCRjlCRDQwMywgMHhENDEzMDAwOSwKKzB4MDAwOTREMEIsIDB4MDAwOUFGRTYsIDB4MDAyMDJEODgsIDB4MDAyMDJEOTAsCisweDAwMjAyRDk4LCAweDAwMjAyREMwLCAweDAwMjAzMUE0LCAweDAwMjAzMUFDLAorMHgwMDEwMDBDOCwgMHgwMDEwMTY4MCwgMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwKKzB4MDAxMTc4ODAsIDB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsCisweDAwMjAwQjI2LCAweDAwMjAzMTg4LCAweDAwMjAxNDVFLCAweDAwMjAzMzI0LAorMHg2NEUzQkYzRSwgMHg0RDBCRDQwNiwgMHhBRkJCMDAwOSwgMHhEMjA1MDAwOSwKKzB4NEYyNjIyNjIsIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsCisweDAwMjAzMzI4LCAweDAwMUMzRDI4LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2MDIyRDIyQiwgMHg4RDQxQzgwMywgMHhERTJBMkYwMSwKKzB4REIyQkRDMkEsIDB4RUQwMUEwMTcsIDB4QzkwMzYwNTEsIDB4ODkxNjg4MDEsCisweEQxMjhENDI2LCAweDAwMDk0MTBCLCAweDYxMDM1NTAzLCAweEM4MjA4NTUxLAorMHhFMDUwODkwMywgMHg3MjAxMDJCRSwgMHhEMjIzMEIyNiwgMHg0MjBCNjRFMywKKzB4RDYyMjY1MTMsIDB4NTJDMTI2RDIsIDB4MzUyMDY1QzIsIDB4REUyMDhCRTQsCisweERCMjFERDIwLCAweDUyRDFEQzIxLCAweDM1MjA2NUQyLCAweDYwNTE4OTE4LAorMHg4ODAxQzkwMywgMHhENDFCODkxNCwgMHg0NjBCRDYxNiwgMHg1NzAzMDAwOSwKKzB4OEYwNDM3RTAsIDB4RTIwMTY1MDMsIDB4QUZFQzJCMjAsIDB4RDQxODJDNTIsCisweDQyMEJEMjE4LCAweEQ2MTEwMDA5LCAweDQxMThFMTAxLCAweDI2MTJBRkUzLAorMHhDODA0NjBGMSwgMHhEMjE0ODkwNywgMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwKKzB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUUyMTAwLCAweDAwMjAyRDk4LCAweDAwMjAyRDkwLAorMHgwMDIwMkQyQywgMHgwMDIwMTE2MiwgMHgwMDIwMTFFNCwgMHgwMDFDM0QzMCwKKzB4MDAxMTc4ODAsIDB4MDAyMDJEODgsIDB4MDAyMDMxQTgsIDB4MDAyMDMxQTQsCisweDAwMjAyREMwLCAweDAwMjAxMTgwLCAweDAwMjAwMzA4LCAweEU2MDFEMjAzLAorMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwgMHgwMDFDMTAxMCwKKzB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkYyLAorMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhFNTAwNkNGNiwKKzB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsIDB4QUZFMzhCRkEsCisweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLCAweDYwNDNFRTBBLAorMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwgMHhFNjMwRTYzNywKKzB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsIDB4MDAwQjgwMjgsCisweDAwMEI2RUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLCAweDdGRUM0RjIyLAorMHg2RTQzNjI1MywgMHhCRkRDNjVGMywgMHhCRkQwNjQyMywgMHhCRkNFNjRFMywKKzB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsIDB4NEYyNjdGMTQsIDB4NkVGNjAwMEIsCisweDAwMjAzMzJDLCAweEU0RkREMjlBLCAweEQ3OUE2MTIyLCAweDIyMTIyMTQ5LAorMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTk3NjYyMiwgMHgyMjYyMjY0OSwKKzB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsIDB4RTFGNzY0NTIsCisweDI1NDIyNDE5LCAweEU3MDE2MDUyLCAweDI1MDJDOUNGLCAweEU2MDI2MDUyLAorMHgyNTAyQ0IwMywgMHgxNTYyNDcxOCwgMHgxNTczMDAwQiwgMHhENzhDRDU4QiwKKzB4RDQ4REQyOEMsIDB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QUZEMTIyMTAsCisweDY2NEMyNDYxLCAweDQ2MDBEMjg5LCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4NSwgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI4MjY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyN0U2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3OCwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzQsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNzE2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZENjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjcsCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjYzNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4RDE1RjYwMEMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweEQxNUQ2MDJDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweDJGRTY2MDJDLAorMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywgMHg4OTE0MzQ2NywgMHgwMDA5QkZFQiwKKzB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsIDB4NDQwOTI0MDksCisweDYyNEM0NDA5LCAweDMyNjNFNjBBLCAweEJGRTI4OTA1LCAweDYyMEM2NDRDLAorMHhDODgwNjAyMywgMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwKKzB4RDY0QTRGMjIsIDB4ODgwMTYwNjIsIDB4QjI0NThCMDMsIDB4QTAwMzAwMDksCisweEQyNDcwMDA5LCAweDIyNjBFNjQwLCAweEUyMDBENjQ2LCAweDAwMEI0RjI2LAorMHg0RjIyMjYyMiwgMHg2MDYyRDY0MSwgMHg4QjAxODgwMiwgMHgwMDA5QjI4RSwKKzB4RTIwMEQ2NDAsIDB4MDAwQjRGMjYsIDB4RDUzQzI2MjIsIDB4RTEwMEQ0M0MsCisweDI1MTJFNzAxLCAweDI0NzAwMDBCLCAweEU2MDREMjM5LCAweDIyNjAwMDBCLAorMHhENDM5NEYyMiwgMHg0MTBCRDEzOSwgMHhENTM5MDAwOSwgMHg2NjUwRTFGRCwKKzB4MjYxOUQyMzgsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsIDB4NEYyMjIyNzAsCisweEQxMzJENDM1LCAweDAwMDk0MTBCLCAweEU3RkJENTMxLCAweDI2Nzk2NjUwLAorMHgwMDBCNEYyNiwgMHg0RjIyMjU2MCwgMHhEMTJDRDQzMCwgMHgwMDA5NDEwQiwKKzB4RTdGN0Q1MkIsIDB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsIDB4RDUyODI1NjAsCisweDYyNTA5NDJELCAweDAwMEIyMjQ5LCAweEQ1MjUyNTIwLCAweDYyNTBFNEJGLAorMHgwMDBCMjI0OSwgMHg0RjIyMjUyMCwgMHg4NTIyRDIyNSwgMHgyMDA4NjAwRCwKKzB4ODgwMTg5MTEsIDB4ODgwMzg5MTMsIDB4ODgwNTg5MTUsIDB4ODgwNjg5NDIsCisweDg4MDg4OTQ4LCAweDg4MDk4OTRFLCAweDg4MEE4OTU0LCAweDg4MEI4OTVBLAorMHhBMDY3ODk2MCwgMHhCMDY5MDAwOSwgMHhBMDY0MDAwOSwgMHhCMDc3NjAwQywKKzB4QTA2MDAwMDksIDB4QjA4MDYwMEMsIDB4QTA1QzAwMDksIDB4RkY3RjYwMEMsCisweDAwMUUyMTQ4LCAweDAwMUUxMDAwLCAweDAwMUUxMTA4LCAweDAwMjAzMUZDLAorMHgwMDIwMzFGRSwgMHgwMDIwMzIxRCwgMHgwMDIwMzFFMCwgMHgwMDFFMTAzRiwKKzB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsIDB4MDAxRTEwOTAsIDB4MDAyMDMyMDQsCisweDAwMUUxMDBCLCAweDAwMjAzMjAwLCAweDAwMjAzMzMwLCAweDAwMjAxNDVFLAorMHgwMDFFMTAyOCwgMHgwMDIwMzIxQywgMHgwMDIwMzMzQywgMHgwMDIwMzM0QywKKzB4MDAyMDMxRDQsIDB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsCisweDYwMENBMDI5LCAweDYyNjBENjgwLCAweDhCMjMyMjI4LCAweDAwMDlCMDY5LAorMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywKKzB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsCisweDYwMENBMDExLCAweDYyNjBENjc0LCAweDhCMEIyMjI4LCAweDAwMDlCMTI1LAorMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwKKzB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsCisweEQ1NkM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NkIwMTJELCAweEU0MDNENjZCLAorMHhFMjBGNjExQywgMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwKKzB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsCisweEUwMDE4MTIyLCAweDAwMEIyNjAyLCAweEQyNUMwMDA5LCAweDYwMEQ4NTIzLAorMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwKKzB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsCisweEQxNTJFMDAwLCAweDg1MTNFNTAxLCAweDY0MEQ0NTE4LCAweDY2MDMzNDUzLAorMHhFMDAwOEQwNSwgMHhENTUxRDI1MywgMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwKKzB4NEYyMjAwMDksIDB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksCisweDIyN0Q2NzJFLCAweDg4MDE2MDJDLCAweDg4MDI4OTA5LCAweDg4MDM4OTEwLAorMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwKKzB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsCisweDIyMjg2MjVDLCAweEQ0NDM4QjNGLCAweDY2NDJENTQwLCAweDI1NjJENDQwLAorMHgyNDAxODU2MSwgMHg2MjAzQTAyQywgMHgyMDA4NjA1QywgMHg4ODEwODkwNywKKzB4ODgyMDg5MDgsIDB4ODgzMDg5MDksIDB4QTAyQzg5MEEsIDB4RDIzQTAwMDksCisweDYyMjJBMDA4LCAweEEwMDVEMjM5LCAweEQyMzk2MjIyLCAweDYyMjJBMDAyLAorMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywKKzB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsCisweEQ2MzIyNDIxLCAweDg1NjFENTI5LCAweDI1NjJENDI5LCAweDYyMDMyNDAxLAorMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwKKzB4QTAwMTAwMDksIDB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsIDB4RDYxOTAwMDksCisweEQ0MjdFMTAxLCAweDY1NDEyNjEwLCAweEQxMThENzE3LCAweEUyMEY2NTVELAorMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwKKzB4NjQwQzg1MjMsIDB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsCisweDk0MEY4NDUxLCAweEEwNDgyMDQ5LCAweERFMEQ4MDUxLCAweEM4NDA2MEUwLAorMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwKKzB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsIDB4MDAyMDMyMUQsIDB4MDAyMDMxRDQsCisweDAwMjAzMUUwLCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAzMjAwLAorMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDIwMzIwOCwgMHgwMDIwMzFFOCwKKzB4MDAyMDMxRUMsIDB4MDAyMDMxRjAsIDB4MDAyMDMyMEMsIDB4MDAyMDMyMTAsCisweDAwMjAzMjE0LCAweDAwMjAzMjE4LCAweDAwMjAzNTFDLCAweDAwMjAzNTI2LAorMHgwMDIwMzFGQSwgMHgwMDIwMjM2MiwgMHg4OTEyMzQyNywgMHhEMjk0RDY5MywKKzB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsCisweDJFMDBDQjA0LCAweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLCAweEEwMDFFMDAxLAorMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwgMHhDODgwNjA2MCwKKzB4RDI4Njg5MTksIDB4ODgwMTYwMjEsIDB4RDI4OThCMTUsIDB4ODUyNEU1MDEsCisweDg5MTAzMDU2LCAweEUyMDNEMTg3LCAweDIxMjBENDg3LCAweEUwMEI2NTQxLAorMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwKKzB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsIDB4REU4MDRGMjIsCisweEM4ODA4NEUxLCAweEQ1N0E4OTJDLCAweDIwMDg4NTU0LCAweDYxMDM4RjI4LAorMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywgMHgzNTIwNjIwQywKKzB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsCisweDg5MDRDODQwLCAweDQyMEJEMjc1LCAweEEwMDMwMDA5LCAweEQyNjgwMDA5LAorMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwKKzB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsCisweDRGMjZFMDAwLCAweDZFRjYwMDBCLCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwgMHgzNjIyREM1RSwgMHg2MjYzODkwMCwKKzB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsCisweEU3MDBBMDBGLCAweDc3MDE2MkIyLCAweDcxMDI2MTIzLCAweDY2MjEyQjEyLAorMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwKKzB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsCisweDYxNzM2N0IyLCAweDJCMTI3MTAyLCAweDcxMDI2RTEzLCAweDJCMTI2NTcxLAorMHg2NTVENkRFMSwgMHg0MjI4NjJERCwgMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwKKzB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsIDB4RTIwMThCMDUsCisweDY2QjIyQzIwLCAweDY1NUQ2NTYxLCAweEU2MEYyNDUyLCAweDY3QTEyQzYwLAorMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwgMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsCisweEUyNDBERDM2LCAweDM2MjI2NkQxLCAweDYyNjM4OTAwLCAweDM2Nzg2NzJDLAorMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwKKzB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsIDB4MjQyMDQyMTksCisweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLCAweDI0NTA0NTE5LCAweDYyMUM3NDAxLAorMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywKKzB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsCisweDAwMEI2RUY2LCAweDJGRDY2REY2LCAweDRGMjIyRkU2LCAweEVEMEFFRTAxLAorMHg2NEUzQkM5NywgMHhCQzlDNjRFMywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywKKzB4QkM5RkVFMDEsIDB4NjRFMzY0RTMsIDB4N0UwMUJDQTQsIDB4MzJENzYyRUMsCisweDRGMjY4QkY3LCAweDAwMEI2RUY2LCAweEQxMTg2REY2LCAweEQ0MTg5MjBELAorMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywgMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwKKzB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsIDB4MDAyMDMxRkEsCisweDAwMjAyNDZFLCAweDAwMUUxMDE1LCAweDAwMjAzMjAwLCAweDAwMUUxMDAxLAorMHgwMDIwMzFENCwgMHgwMDFFMTEwMCwgMHgwMDIwMzFGRSwgMHgwMDIwMzFFQywKKzB4MDAxRTEwMDAsIDB4MDAyMDMxRjAsIDB4MDAyMDMxRkMsIDB4MDAyMDIzNjIsCisweDAwMUUxMDBDLCAweDAwMjAzMUU4LCAweDAwMjAzMjA0LCAweDAwMjAzMjA4LAorMHgwMDIwMzIwQywgMHgwMDIwMzIxMCwgMHgwMDIwMzIxNCwgMHgwMDIwMzIxOCwKKzB4NEYyMjJGRTYsIDB4RDY1MDdGRkMsIDB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsCisweDI2MjBCRkJCLCAweEQ1NEVEMTRELCAweERFNEU2MDEwLCAweDY0RTM2NTUyLAorMHg3NDAyQzg0MCwgMHg4RDIyRDE0QywgMHhEMjRDNzUwMiwgMHhFNjAxRDc0QywKKzB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsCisweEQ0NDM3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LAorMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDU0MiwgMHg2NzU1NzYwMSwKKzB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsIDB4RDIzRTAwMDksCisweEU2MDFENzNCLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLAorMHg4RkY5MzI3MywgMHhENDMyNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwKKzB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1MzMsCisweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweDkyNEE3MTAyLAorMHhEMjI2MkUyMSwgMHg1RTIzRDcyRSwgMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwKKzB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsCisweDgwNzI0NTE5LCAweDY1RjI2MDVDLCAweDgxNzI2NkYyLCAweDQ2MTk0NjI5LAorMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywgMHg4MTczMzA0QywgMHgyMTE4NUUyMywKKzB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsIDB4NjAyQzQyMTksIDB4NjZGMjYyRjIsCisweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLCAweDQyMjk4MTc0LCAweDY1MkM2MDZDLAorMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywgMHgwMDA5QkM5RCwgMHgyMjI4NjIwQywKKzB4QTAwQTg5MDgsIDB4NjAxMzAwMDksIDB4OEIwMzg4NDAsIDB4MDAwOUIwMDksCisweDAwMDlBMDAzLCAweEUyMDJENjBGLCAweDdGMDQyNjIyLCAweDAwMEI0RjI2LAorMHgwMDBCNkVGNiwgMHgwNjBBMDAwOSwgMHgwMDIwMzIxQywgMHgwMDFFMTAwMCwKKzB4MDAyMDMyMDgsIDB4MDAyMDM1MUMsIDB4MDAyMDM1MjgsIDB4MDAyMDM0QzAsCisweDAwMjAzMUYwLCAweDAwMjAzNEYwLCAweDAwMjAzNEVFLCAweDAwMjAzNEMyLAorMHgwMDIwMzFENCwgMHgwMDIwMzIwMCwgMHg0RjIyMkZFNiwgMHhERTkzN0ZGQywKKzB4MjAwODg0RTksIDB4MkYwMDhEMDYsIDB4RDY5MkQ0OTEsIDB4MDAwOTQ2MEIsCisweDY0RjBCMTk0LCAweDY2MjBEMjkwLCAweDg5MDIyNjY4LCAweEM5QkY2MEUwLAorMHg3RjA0MkUwMCwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwKKzB4REU4QTRGMjIsIDB4NjBFMEQ2OEEsIDB4Q0JDMEQ0OEEsIDB4NjI2MDJFMDAsCisweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLCAweDY2MDNBMDAyLAorMHg2NjAzNDAwOSwgMHhENjg0NjE2RCwgMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwKKzB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI4MDhCRjgsIDB4MDAwOTQyMEIsCisweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2MjYwRDY3QSwgMHg4OTQ0MjIyOCwgMHhENTZGRTEwMCwKKzB4NjA1MDI2MTAsIDB4Q0I0MEQ0NzcsIDB4MjUwMDQ0MEIsIDB4OEQwNTIwMDgsCisweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LCAweEQ0NzJENjZBLAorMHhERDcyNjc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwgMHg4QjAzM0QyNywKKzB4RDI2NEQ0NkYsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsIDB4QTAwNUQ3NkQsCisweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLCAweDM1RDM2NTRELAorMHhENzY5OEJGNywgMHg2MTcyRTAwMywgMHg4MTExNDAxOCwgMHg2RTcyNjBGMSwKKzB4ODFFMjcwMEMsIDB4RDQ2NTYxNzIsIDB4REQ2NTgxMTMsIDB4NEQwQkRFNjUsCisweEUyMDE2NTcyLCAweEQ0NjQyRTIyLCAweDQyMEJEMjUyLCAweEQ2NTMwMDA5LAorMHhDOTNGNjA2MCwgMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4RDI1QzRGMjIsIDB4NkI0MzZFNzMsCisweDQyMEI2QzUzLCAweDIwMDg2RDYzLCAweDYxMDM4RjA4LCAweEQyNDVENDU4LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHgyMUIwNjBDMywKKzB4NjBEMzgwMTEsIDB4RTUwMDgxMTEsIDB4NjRCQ0EwMDcsIDB4NjA1MzY1NUQsCisweDY2NTMwMEVDLCAweDc1MDEzNjFDLCAweDYyNUQ4MDY0LCAweDhCRjUzMjQzLAorMHg2MDYwRDYzNiwgMHgyNjAwQzlCRiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsIDB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsCisweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLCAweEU1QzRFNjgyLCAweDY3RjM4MTIxLAorMHg2NTVDNjY2QywgMHhFNDA4QkZCQywgMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLCAweDZCMTM2Q0NELCAweERFMzZENzM1LAorMHhFREZGNjRGMywgMHhEODM1RUEwNCwgMHg2MDUzNjU1QywgMHgwMjdENDAwMCwKKzB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsIDB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsCisweDI0MjE3NDAyLCAweDY5ODIwMkVELCAweDM5Mjg2MjJELCAweDc0MDIyODkyLAorMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywgMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwKKzB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsIDB4NjdGM0U1QzUsIDB4QkY3RjY2NkMsCisweDdGM0M2NTVDLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwgMHg2MDEyRDIxRSwgMHhDQjIwRTQwNSwKKzB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsIDB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsCisweDAwMjAzMzU4LCAweDAwMjAxNDVFLCAweDAwMjAzMUEyLCAweDAwMUUxMDE1LAorMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywgMHgwMDIwMDMwOCwKKzB4MDAyMDMxQTgsIDB4MDAyMDI1QzYsIDB4MDAyMDMzNUMsIDB4MDAyMDE0QUEsCisweDAwMjAzMzc4LCAweDAwMTE3ODhDLCAweDAwMjAzMUE0LCAweDAwMjAyRDg4LAorMHgwMDIwMTFFNCwgMHgwMDFFMjEzMCwgMHgwMDIwMzM4MCwgMHgwMDIwMjU4OCwKKzB4MDAyMDMzODQsIDB4MDAyMDMxQkMsIDB4MDAyMDMxQzQsIDB4MDAyMDM0QkMsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjVEMTY0LCAweEU0MDBENzY1LAorMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYzMjcyMiwgMHg5NjY5RDc2MywKKzB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsIDB4RDU2MDExNjUsCisweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywKKzB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLCAweDI1MjJFMjBDLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsIDB4MkZFNjJGRDYsCisweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLCAweDAwMDlCRTZELAorMHhDODEwNjBFMywgMHhCRTZBODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwKKzB4MDAwOUJFOEMsIDB4QzgwMTYwRTMsIDB4REQzRTg5MzgsIDB4QzgwMjYwRDAsCisweDJGMDA4RDAzLCAweDQ2MEJENjNDLCAweDYwRjAwMDA5LCAweDg5MDJDODA0LAorMHg0NjBCRDYzQSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywgMHg2MEQwODkwMiwKKzB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNTg5MDYsIDB4MDAwOTQ2MEIsCisweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LCAweDQ2MEJENjMxLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRiwgMHhENTJGMDAwOSwKKzB4ODgwMjYwNTIsIDB4RDIyRThCMDMsIDB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsCisweEQyMkI4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLCAweEM4ODA2MEUzLAorMHhENjI4ODkyRSwgMHg2MEUzNkU2MCwgMHg4OTAyQzg4MCwgMHg0MjBCRDIyNiwKKzB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjQsIDB4NjBFMzAwMDksCisweDg5MDJDODAyLCAweDQyMEJEMjIyLCAweDYwRTMwMDA5LCAweDg5MEVDODA0LAorMHg0MTBCRDEyMCwgMHhCRjBFMDAwOSwgMHhCRjREMDAwOSwgMHhENTFFMDAwOSwKKzB4NjA1MEQ0MUUsIDB4QzkwOEQ3MUUsIDB4QkY4NDI1MDAsIDB4NjBFMzI0NzIsCisweDg5MDVDODA4LCAweDdGMDREMjFCLCAweDZFRjY0RjI2LCAweDZERjY0MjJCLAorMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDFDNTgxQywKKzB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsCisweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxNjQwLCAweDAwMjAxNjYyLAorMHgwMDIwMUNBMCwgMHgwMDIwMTY3QSwgMHgwMDIwMTY4OCwgMHgwMDIwMzIwMCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDE2REUsIDB4MDAyMDE2RUEsCisweDAwMjAxNjkwLCAweDAwMjAxNkFFLCAweDAwMUUxMDAwLCAweDAwMTBGMTAwLAorMHgxMjM0NTY3OCwgMHgwMDIwMTZDNiwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywKKzB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsCisweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LAorMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwKKzB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwKKzB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLAorMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LAorMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsCisweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLAorMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLAorMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDMxRkEsCisweDAwMjAzMUZDLCAweDAwMjAzMUZFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLAorMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwKKzB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsCisweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLAorMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywKKzB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsCisweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLAorMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzFBMSwKKzB4MDAyMDMxQTAsIDB4MDAyMDMxQTIsIDB4MDAyMDJEQzgsIDB4N0ZGQzRGMjIsCisweEU2ODBEMTlELCAweDY2NkM2MjEyLCAweEQyOUMyRjIyLCAweDY3RjM2NTYzLAorMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwKKzB4RDI5NjY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsCisweEQyOTI2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwKKzB4REQ4Q0QyOEIsIDB4NzIwMTFGMjEsIDB4REI4QjFGMjIsIDB4NkFGMkU4NDAsCisweDUyMTFEMThBLCAweDM2MjA2NjEyLCAweEEwQTc4QjAxLCAweDYwNjEwMDA5LAorMHg4ODAxQzkwMywgMHhBMEExOEIwMSwgMHhEOTg0MDAwOSwgMHg0MjBCRDI4NCwKKzB4NTUwMzY0OTMsIDB4ODQ1QzZBMDMsIDB4MzBFMEVFODQsIDB4RDE4MThCNzksCisweDYwNkM2NjEwLCAweDhCM0Q4ODAxLCAweDYyMTBEMTdGLCAweDg5MkYyMjI4LAorMHhENTdFRTcwMSwgMHg2NDUyMkI3MiwgMHgxNDQyRTAwMywgMHhENTdDNjI1MiwKKzB4RTYwMDQwMTgsIDB4MjE2MDgxMjEsIDB4RDE3QTY0NTMsIDB4NkU1Mjc0MDQsCisweDYwMTI2NzQyLCAweENCMjBEQzc4LCAweDc2MDEyMTAyLCAweDMyODM2MjZELAorMHgyNUUyOEJGQiwgMHgyNDcyREU3MSwgMHg2MkUyNjdDMiwgMHgxMjc0RDE3MywKKzB4NjA0MTY0RTIsIDB4MjQwMUNCMDEsIDB4RUUwMDY2RTIsIDB4REM3MDJDNjIsCisweEVDMDEyQzYyLCAweDJEQzI0MTBCLCAweDRDMThFQzAxLCAweDJCRTIyREMyLAorMHhENzY0REU2QywgMHhEMTZDNjBFMiwgMHhDQjAxRTIwMiwgMHgyNzIwMkUwMiwKKzB4MjEyMkEwMkYsIDB4OEIyQzIwMDgsIDB4RTcwMURFNjgsIDB4RDQ2NkVDMDAsCisweDIxNzBEMjY0LCAweEVFMDEyRUMyLCAweDYxMjIyNEUyLCAweDIxNjlFNkZFLAorMHhFMDFFMjIxMiwgMHg1NEYxMEM1QywgMHgyNEMwRTAxRiwgMHg1NkYyMDI1QywKKzB4MjYyMDc1MTAsIDB4RDc1RUU2MDAsIDB4RUUwNkQ0NUUsIDB4NzYwMTg0NTYsCisweDZDNTQyNzAwLCAweDMxRTM2MTZDLCAweDc0MDEyNEMwLCAweDc3MDE4RkY2LAorMHhFNDk0RDI1OSwgMHg3MjAxMjI0MCwgMHgyMjUwRTUwMCwgMHhFNjA1NzIwRiwKKzB4RDI1NjIyNjAsIDB4NjVBMzY0OTMsIDB4RUUwMTQyMEIsIDB4QUY2RjRFMTgsCisweDJGQTIyREUyLCAweEQ0NTI2NUYyLCAweDY2NDI4NTUzLCAweDMyNjI2MjBELAorMHhENDUwODkwNywgMHg0MTBCRDE1MCwgMHhENzUwMDAwOSwgMHhBRjU3RTYwMSwKKzB4RDQzQTI3NjIsIDB4REQzN0QxNDksIDB4NjVGMjQxMEIsIDB4RDQ0Q0VFMDEsCisweDRFMThENjRDLCAweDJERTI0NjBCLCAweDAwMDlBRjRBLCAweDdGMEMyRkEyLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4NEYyMjY4RjYsIDB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsCisweDg1NDg4MUYxLCAweDgxRjJEMjI1LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLAorMHg4MUY0RTQwQywgMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwKKzB4MDAwQjRGMjYsIDB4MkY4NjAwMDksIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweEU4MDBEMTFBLCAweEQ0MzIyRjEyLAorMHgxRjQxNjE4MywgMHg2QTEzREIyMCwgMHg0QTA4RDYzMCwgMHhERTIwRTAwMSwKKzB4NEEwMDQ2MEIsIDB4MUYwMjNBRUMsIDB4NTJCMTY2QjIsIDB4OEIwMTM2MjAsCisweDAwMDlBMTlCLCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLCAweDAwMDlBMTk1LAorMHhERTI3NTI2MywgMHg4QjRGMzJFMCwgMHg0MjBCRDIwRCwgMHhERTI1NjRCMywKKzB4RDcwREQ1MEUsIDB4RUQwMURDMEIsIDB4MkUwMkUxMDAsIDB4MjdEMDI1MDIsCisweEFGRTEyQzEwLCAweDAwMDAyRTE2LCAweDAwMUMzRDlDLCAweDAwMjAxRjQwLAorMHgwMDExNzc5QSwgMHgwMDFDM0QzMCwgMHgwMDFEMDEwNCwgMHgwMDIwMkRDMCwKKzB4MDAyMDExNjIsIDB4MDAyMDMxQjEsIDB4MDAyMDMxQjAsIDB4MDAyMDMxQUMsCisweDAwMUMzQjlDLCAweDAwMUMzNTAwLCAweDAwMjAyRDk4LCAweDAwMjAxMjc2LAorMHgwMDFDM0QwMCwgMHgwMDFDMzZGOCwgMHgwMDExNzcwOCwgMHgwMDIwMzFCNCwKKzB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsIDB4MDAxMTc3ODgsIDB4MDAyMDExODAsCisweDAwMjAzMTg4LCAweDAwMjAyRDg4LCAweDAwMjAxMUU0LCAweDAwMUUyMTMwLAorMHgwMDIwMzQ5QywgMHgwMDIwMTQ1RSwgMHgwMDIwMzRBOCwgMHgwMDIwMkM4MCwKKzB4MDAxMTc3ODAsIDB4MDAxMTc3MEMsIDB4QzgwMTg1NjEsIDB4NUM2Mzg5N0EsCisweDY2MDM4NUMyLCAweDY0MDNDOTAzLCAweDY1MEQ4NUMzLCAweDQwMjE2MDUzLAorMHhDOTNGNDAyMSwgMHg2RTAzNDUwMCwgMHgyNTJEMzIyQSwgMHhFMjEwNjA1MywKKzB4M0UyM0M5MDEsIDB4NkQwMzhEMjMsIDB4NDQwOEQ3OUQsIDB4NDQwODY1NzAsCisweDQ0MDA2MkUzLCAweDI1NTg0MjAwLCAweDM0MkM4RjBGLCAweDYwNDNEMjk5LAorMHg2OTdEMDcyRCwgMHg2MDk5NDkxOSwgMHgyMDFENjEwRSwgMHg2MEQzODFGNiwKKzB4OEYwQzg4MDEsIDB4QTAwQTY5N0MsIDB4RDI5MzY5RTMsIDB4MDUyRDYwNDMsCisweDQyMTk2MjVELCAweDY3MEU2MDI5LCAweDgxRjYyMDdELCAweEQxOEY2OTVDLAorMHgyMjI4NjIxMCwgMHhFOUZGODkwMSwgMHhFRUZGNjk5QywgMHg2RUVDNjU5RCwKKzB4OEIwRjM1RTAsIDB4NEMwQkRDOEEsIDB4NTQwMzY0QjMsIDB4QkYyMEU1MDIsCisweEQ0ODg2RTAzLCAweDQxMEJEMTg4LCAweEQ3ODg2NUUzLCAweEQ0ODhFRDAxLAorMHgyN0QyQTAxRSwgMHgyNkU5RUVGQywgMHg4MUMyNjA2MywgMHg5N0M1ODVDMywKKzB4NjIwMzIwNzksIDB4NDUwODg1RjYsIDB4NjA2MzI2MEIsIDB4ODFDMjI1MkIsCisweDgxQzM2MDUzLCAweEUxMDg4NUM0LCAweDIwMUI0MTE4LCAweDYyQjI4MUM0LAorMHgyMEU5ODUyMSwgMHg2NEIyODEyMSwgMHhDQjAxNjA0MSwgMHhENDc5MjQwMSwKKzB4NDUwQkQ1NzksIDB4NjBCMjAwMDksIDB4NTdGMjY2RjIsIDB4MkEwMkNCMDEsCisweDI2NzJBRjIyLCAweEQyNkU4NTYxLCAweDhGMDJDODAyLCAweEEwOUY2NEIzLAorMHg0MjBCMDAwOSwgMHhEQzcxMDAwOSwgMHg1RTAzNjUwMywgMHgwN0NFRTA0QywKKzB4NzcwMURENkYsIDB4NkNEMjBDNzYsIDB4N0MwMUQ2NjQsIDB4NkQ2MDJEQzIsCisweDg5MDYyREQ4LCAweEQyNjRENDYzLCAweEVEMDE0MjBCLCAweEEwN0VENzYzLAorMHg2MjUxMjdEMiwgMHg0MTE4RTEwRiwgMHgyMjE5RTQwMiwgMHgzMjQwNDQxOCwKKzB4ODU1MThCMTEsIDB4MjBEOUVERkMsIDB4NjA1MTgxNTEsIDB4Q0IwMTdERTMsCisweDg1RTEyNTAxLCAweDIwRDlENjVGLCAweDQ2MEI4MUUxLCAweDZDRjI2NEIzLAorMHhBMDY0NTdGMiwgMHg2RDUxMkM3MiwgMHg0RDE5NkRERCwgMHg2NkRFNkREOSwKKzB4N0QwMTJENkQsIDB4NjEwMzYwREMsIDB4ODgwMTQxMTgsIDB4MjUxMThGNDUsCisweDY0NjJENjUzLCAweDI2NDI3NDAxLCAweDY2MEQ4NUUzLCAweDQwMjE2MDYzLAorMHhDOTNGNDAyMSwgMHg2RDAzNDYwMCwgMHgyNjJEMzIyQSwgMHhDODAxNjA2MywKKzB4REM0RUQxNEQsIDB4OTY0QTg5MDEsIDB4RTYwMDJENkIsIDB4MEY2NEUwMTAsCisweEUwMTA2NERELCAweDYwN0MwN0ZDLCAweDAyMUQ0MDAwLCAweDMyNDA2MjJELAorMHg2NjAzOEQxMiwgMHgwMjFENjA2MywgMHgzMjcwRTdGRiwgMHhBMDBCOEIwMSwKKzB4RTAxMDAxRDUsIDB4RTYwNDAyRkMsIDB4MEYyNDcyMDEsIDB4MzI2MjYyMkMsCisweDA2RkM4QkU3LCAweDQ2MDA2NjZDLCAweDAxQ0Q2MDYzLCAweDBDMTU3MTAxLAorMHg2NzExRDEzQiwgMHgzQzQwNkM3RCwgMHg2MjExODkwNywgMHg4OEZGNjAyRCwKKzB4MjFEMTg5MDMsIDB4RTIwMUREMzcsIDB4ODU1MTJEMjAsIDB4MjBEOUVERkMsCisweDYwNTE4MTUxLCAweENCMDFEMjJGLCAweDQyMEI2NEIzLCAweEUwMTAyNTAxLAorMHhENDMxMDJGQywgMHhFMDAxNjEyQywgMHg2N0YyNDQwQiwgMHg4NUVGMjcwMiwKKzB4NTRGMUQyMkUsIDB4NjUwRDQyMEIsIDB4MDAwOUFFN0UsIDB4ODAwMDdFMDMsCisweDAwMDk0MjBCLCAweDZFMDM1NDAzLCAweEVEMDg4NTQ0LCAweDIwRDk0RDE4LAorMHg4QjAzMzBEMCwgMHhFNTAxQkUzRCwgMHgwMDA5QTAwNywgMHhERDI0ODU0MSwKKzB4MjJEODYyMEQsIDB4QkUzNDg5MDEsIDB4RDQxMkU1MDAsIDB4NDIwQkQyMTIsCisweEQ3MTI2NUUzLCAweEFFNUZFRDAxLCAweDc4MDEyN0QyLCAweEVFMDQ2MThELAorMHg4RDAyMzFFNywgMHhBRTRFN0IwOCwgMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4MDAwMDY4RjYsCisweDAwMjAzNEI4LCAweDAwMjAzMzlDLCAweDAwMjAzNDFDLCAweDAwMjAzMTlDLAorMHgwMDIwMTE2MiwgMHgwMDIwMkQ5MCwgMHgwMDIwMTE4MCwgMHgwMDFFMjEyQywKKzB4MDAyMDM0QTAsIDB4MDAyMDM0QTQsIDB4MDAyMDE0NUUsIDB4MDAyMDJEMkMsCisweDAwMjAzNEJDLCAweDAwMjAxMUU0LCAweDAwMjAzMUJDLCAweDAwMjAzMUM0LAorMHgwMDIwMzFCOCwgMHgwMDIwMzFCQSwgMHgwMDIwMkM4MCwgMHgwMDIwMTRBQSwKKzB4MDAwMDgwMDAsIDB4NEYyMjJGRTYsIDB4NkUyMkQyMTIsIDB4Qzg0MDYwRTMsCisweDIyRTI4RDAyLCAweDAwMDlCQ0ZBLCAweDQyMThFMjQwLCAweDg5MDEyRTI4LAorMHgwMDA5QkQwNSwgMHhDODEwNjBFMywgMHhENDBCODkwNSwgMHg0MjBCRDIwQiwKKzB4QkQwNDAwMDksIDB4NjBFMzAwMDksIDB4ODkwMUM4MDUsIDB4MDAwOUJERUIsCisweEM4MDI2MEUzLCAweDRGMjY4OTAyLCAweDZFRjZBRDAxLCAweDAwMEI0RjI2LAorMHgwMDAwNkVGNiwgMHgwMDFDMzUxMCwgMHgwMDIwMzRCMCwgMHgwMDIwMTQ1RSwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDJDQUEsCisweDAwMjAyQzYwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwKKzB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA2Qzc1NEEsIDB4MzIyMDM1MzIsCisweDIwMzczMDMwLCAweDMxM0EzMTMyLCAweDM3MzIzQTMyLCAweDAwMDAwMDAwLAorMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwKKzB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsCisweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLAorMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwKKzB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsIDB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsCisweDAwM0Q3MjY0LCAweDZDNjE3NjIwLCAweDAwMDAwMDNELCAweDAwMDAwQTBELAorMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwKKzB4MDAwMDAwMDAsIDB4MDAwQTBENTIsIDB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwKKzB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjYyMDIwNkUsCisweDBBNkM2OTYxLCAweDAwMDAwMDBELCAweDczNjk2RjRFLCAweDYxNDMyMDY1LAorMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHgyMTIxNkM2OSwKKzB4MDAwMDBEMEEsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsIDB4MDAwMDBEMEEsCisweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDIsIDB4NzI3NDZFNDksCisweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLAorMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwKKzB4MDAwMDAwNDksIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsCisweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLCAweDAwMDAwMEZGLAorMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwgMHgwMjAwMDAwMywKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjA3LCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLCAweDAyMDAwMEZGLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMDIwNTIyMCwKKzB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsCisweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwKKzB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsIDB4MDAwMjAwMDIsCisweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDIwNDA1LCAweDAyMDkwMDAwLAorMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwKKzB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsIDB4MDUwNzAwMDAsCisweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xMzY1NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9GQjUwX21kay5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0ZCNTBfbWRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxNzM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9GQjUwX21kay5jCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4RDIyODdGRkMsIDB4MDAwOTQyMEIsCisweDAwMDlCMDE5LCAweDk0NDZENTI2LCAweEU2MDBBMDAzLCAweDhEMDQzNjQyLAorMHg2MDUyNzYwMSwgMHg4REY5Qzg0MCwgMHhENDIyMkYwMiwgMHg0RTBCREUyMiwKKzB4RDQyMjAwMDksIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MjEsIDB4N0YwNDAwMDksCisweEEwMjU0RjI2LCAweDRGMjI2RUY2LCAweDQxMEJEMTFFLCAweEQ0MUUwMDA5LAorMHgwMDA5NDQwQiwgMHg0NTBCRDUxRCwgMHhENzFEMDAwOSwgMHg2MTFERTFGRiwKKzB4MjcxMkQyMUMsIDB4RDQxQzUwMjksIDB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsCisweDEyMTEyMjEyLCAweEQ1MTkyNDUyLCAweEQ2MTk5NzE2LCAweEU3MDAyNTcyLAorMHgyNjcwRDIxOCwgMHgyMjcyRDYxOCwgMHg0RjI2RTIwMSwgMHgyNjIyMDAwQiwKKzB4REQxN0RDMTYsIDB4NEMwQkRFMTcsIDB4NEQwQjAwMDksIDB4NEUwQjAwMDksCisweEFGRjgwMDA5LCAweDI3MTAwMDA5LCAweDAwMDAwNjQwLCAweDAwMjAwOTVBLAorMHgwMDFDMDAxQywgMHgwMDIwMjk0MCwgMHgwMDIwMEUyQSwgMHgwMDIwMjk0QywKKzB4MDAyMDI5NjQsIDB4MDAyMDBDRjAsIDB4MDAyMDBGMjYsIDB4MDAyMDA5QzQsCisweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLCAweDAwMjAyOEVDLAorMHgwMDIwMjg1MCwgMHgwMDIwMjhGNCwgMHgwMDIwMjkwMCwgMHgwMDIwMEJFQywKKzB4MDAyMDFGRDQsIDB4MDAyMDE3QjgsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFQTE3RkE0LCAweDYxRTBFMDFDLCAweDdEMDE2REUzLCAweDYxRDAwRjE0LAorMHhENTlGRDQ5RSwgMHg0NTBCRTAyMCwgMHhFMDIwMEYxNCwgMHhFNzgwMDRGQywKKzB4NjA0QzY2RTIsIDB4N0Q3RjY3N0MsIDB4MUY2OTMwNzAsIDB4MkQ2MjhGMTcsCisweDAxRkNFMDFDLCAweDY0MUNFNTAwLCAweEQ3OTdERTk2LCAweDMyNDM2MjVELAorMHhBMjFBOEIwMSwgMHg2NTVEMDAwOSwgMHgzMUVDNjE1MywgMHhFMDI4NkMxMCwKKzB4NkQ1MzBGQzQsIDB4M0Q3QzYyQ0UsIDB4QUZFRjJEMjAsIDB4MjAwODc1MDEsCisweEUwMUM4QjE1LCAweEU1MDAwMUZDLCAweEQ3OEJERThBLCAweDY0MUNBMDBBLAorMHg2QzUzNjU1RCwgMHg2NkMyM0NFQywgMHg2NjYyNjI1MywgMHgyMjYyMzI3QywKKzB4MUY2OTc1MDQsIDB4MzI0MzYyNUQsIDB4QTFGNjhCRjIsIDB4ODgwMTJEMTAsCisweEUwMUM4QjE2LCAweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTdELAorMHg4QjAxMzI3MywgMHgwMDA5QTFFOSwgMHg2MkUzNjQ0RCwgMHg3MjA0NkQ0MywKKzB4M0RFQzYxNDMsIDB4NjVEMjMxMkMsIDB4NzQwODZDMTIsIDB4MjVDMkFGRUYsCisweDhCMTg4ODA0LCAweDAxRkNFMDFDLCAweDJENDBFNDAwLCAweERFNzE2NzFDLAorMHgzMjczNjI0RCwgMHhBMUQwOEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNkQ0MywKKzB4NjVEMjNERUMsIDB4NjE0MzcyMDQsIDB4NjYxMjMxMkMsIDB4NzQwODZDNTIsCisweEFGRUQyQzY5LCAweDg4MDUyNUMyLCAweEUwMUM4QjE4LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU2MywgMHg4QjAxMzI3MywgMHgwMDA5QTFCNSwKKzB4NkM0MzY0NEQsIDB4M0NFQzYyRTMsIDB4NzIwNDY1QzIsIDB4M0QyQzZENDMsCisweDYxNTI2NkQyLCAweDIxNkI3NDA4LCAweDI1MTJBRkVELCAweDhCMTM4ODMwLAorMHhFMjAwREU1OCwgMHg2NEUyMkQyMCwgMHg4QjA0MjQ0OCwgMHg0MjBCRDI1NywKKzB4QTE5QTAwMDksIDB4NTVFMTAwMDksIDB4NTdFMzU2RTIsIDB4REQ1NDVDRTQsCisweDJGQzY0RDBCLCAweDdGMDRBMTkxLCAweDg5MDE4ODI4LCAweDAwMDlBMEVBLAorMHhFMTQzREU0QywgMHg2MjJENjJFMSwgMHg4RjAzMzIxNywgMHg1NkZCMUZFQiwKKzB4MjYyMUUyNDAsIDB4OEIwMTMyMTcsIDB4MDAwOUEwRDUsIDB4RTEwMTVFRkIsCisweDMwMTY4NUUxLCAweEEwQ0U4QjAxLCAweEU0MDEwMDA5LCAweDJENDA1NUZCLAorMHg2NDUxQjE3OSwgMHhFMTQzNTdGQiwgMHhFMDU0NjI3MSwgMHgzNTE3NjUyRCwKKzB4MEY1NjhENDEsIDB4MzU2M0U2NDAsIDB4RTYwMDhCMDUsIDB4MEY2NUUwMzQsCisweEEwMEZFMTFBLCAweDYxNTM3MkMwLCAweDQxMjE0MTIxLCAweDQxMjE0MTIxLAorMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwgMHhDOTAzNjA1MywgMHhFMDM0NjYwMywKKzB4NzExODBGNjUsIDB4MjIwOUUwMDcsIDB4NjQxREUwMzAsIDB4MEYyNTY1RjMsCisweDFGNEVCMUYxLCAweDA0RkRFMDM0LCAweDY3NERFMDMwLCAweDQ3MDgwQ0ZELAorMHg2MDczNjFDRCwgMHg0MTA4RDIyQiwgMHhFMDBGMENGRSwgMHgxRjFGNDIwQiwKKzB4MkNEOTZEMDcsIDB4NUVGQjYwNzMsIDB4ODVFMjBGQzYsIDB4NDIwQjUxRkYsCisweDJDMEI2MDBELCAweDU0RkU2MDczLCAweEIxQkIwRkM2LCAweEUwNTQ2NUYzLAorMHg2NTJENjJFMSwgMHhFNjQwMEY1NiwgMHg4OTYyMzU2MywgMHhFMDUwRTEwMCwKKzB4NjAyMzBGMTUsIDB4NDAwOEM5MDMsIDB4NkQwMzQwMDAsIDB4RTA0MDYxMDMsCisweEUwNDQwRkQ2LCAweEQyMTdFRUZGLCAweDZFRUMwRkY2LCAweDBGMjZFMDU4LAorMHg2MEUzNDIwQiwgMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwgMHg2NjIzNDIyMSwKKzB4MzI2QzQyMDAsIDB4NDUyMTQyMDAsIDB4RTA0ODY3MDcsIDB4MEY3NjQ1MjEsCisweEM5MDM2MDUzLCAweDQwMDg1Q0ZCLCAweDdDMDYzMEZDLCAweDZFMDM2RDJELAorMHgxRkQ1MUZDNiwgMHgxRjA0QTAyRSwgMHgwMDExN0QwMCwgMHgwMDIwMjk2OCwKKzB4MDAyMDBFMkEsIDB4MDAxMTdEMDQsIDB4MDAxMTdEODQsIDB4MDAyMDA3MDAsCisweDAwMjAwNzRDLCAweDAwMjAyMDM0LCAweDBGRDZFMDRDLCAweDA1RkVFMDQ0LAorMHg2NEQzQjE4OSwgMHg2NEUyRTA0OCwgMHhFMDQwMDZGRSwgMHgyRTQyMjQ2OSwKKzB4MDFGRTY3QzQsIDB4NjY3Q0UwNTgsIDB4NDIwQjAyRkUsIDB4MjQwQjYwNjMsCisweDA1RkVFMDQ0LCAweEIxNUQyRTQyLCAweEUwNTA2NEQzLCAweDdEMDEwMUZELAorMHgwRjE1NzEwMSwgMHgwMkZERTA1MCwgMHgzMjYyRTYwNiwgMHg1NkZCOEJEQywKKzB4NTVGQjYyNjEsIDB4ODU1MTQyMDAsIDB4MzAyQzc1MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNjAwLCAweEU3MDRBMDA0LCAweDc2MDE2MjU2LCAweDc0MDQyNDIyLAorMHgzMjczNjI2RCwgMHg2NUYzOEJGOCwgMHg2NDFEQjEzQywgMHhCMEQyNTZGQiwKKzB4QTBBQTY0NjEsIDB4RDQ4ODAwMDksIDB4RTIwMUQ1ODgsIDB4MkQyMDQ1MEIsCisweDAwMDlBMEEzLCAweDhCMDc4ODI5LCAweEUyMDBERTg1LCAweDY2RTIyRDIwLAorMHg2NDZEQjBBMSwgMHgwMDA5QTA5OSwgMHg2MjJDRTI4MSwgMHg4QjNEMzAyMCwKKzB4RDY4MEU3MzgsIDB4RTA0NDJENzAsIDB4RTA0ODBDNkUsIDB4NkU2MjFEQzEsCisweDUxNjExREUyLCAweDU0NjIxRDEzLCAweDU1NjUxRDQ0LCAweDU3NjMxRDU1LAorMHg1QzY2MUQ3NiwgMHgwRTZFMURDNywgMHgxREU4RTA0MCwgMHhFMDUwMDE2RSwKKzB4NTQ2NDFEMTksIDB4MDU2RTFENEEsIDB4MUQ1QkUwNEMsIDB4RTA1NDA3NkUsCisweDBDNkUxRDdDLCAweDFEQ0RFMDU4LCAweEUwNDQwMjZFLCAweEVEMDAxRDJFLAorMHhFMDQ4MDZENiwgMHgxNkQxMjZEMiwgMHgxNkQ1MTZEMiwgMHgxNkQ2MTZEMywKKzB4RTA0MDA2RDYsIDB4RTA1MDA2RDYsIDB4MDZENjE2RDQsIDB4MDZENkUwNEMsCisweDA2RDZFMDU0LCAweDA2RDZFMDU4LCAweDFGMjlBMDU3LCAweDYyMkNFMjgyLAorMHg4OTMxMzAyMCwgMHgwNUZDRTAyMCwgMHg2MjVDRTY4MywgMHgzMjYwNjY2QywKKzB4RDY1RDhCMDcsIDB4MjY1MEU1MDAsIDB4NTI2MTc2ODAsIDB4QTA0NEQ2NUIsCisweEU2OTAyNjIyLCAweDMyNjA2NjZDLCAweEQyNTc4QjE2LCAweEU1MDBENjU4LAorMHg2MDYyMjI1MCwgMHhDQjIwRDI1NywgMHhFNjA1MjYwMiwgMHhENjU2MjI2MiwKKzB4MjI1MjQ2MEIsIDB4NDIwQkQyNTUsIDB4RDI1NTAwMDksIDB4MjI2MkU2MDEsCisweDQ2MThEMjU0LCAweDIyNjJBMDI5LCAweEQyNTRENDUzLCAweEQ0NTQ2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTAyMSwgMHhFNTI0RDY0NywgMHhENTQ1MjY1MCwKKzB4MTYyMTUyNTcsIDB4MTYyMjUyNTgsIDB4MTYyMzUyNTksIDB4MTYyNDUyNUEsCisweDE2MjU1MjVCLCAweDE2MjY1MjVDLCAweDE2Mjc1MjVELCAweDE2Mjg1MjVFLAorMHgxRjI5NTI1RiwgMHhFMjAwMTYyOSwgMHgxNTI4MTUyNywgMHgxNTJBMTUyOSwKKzB4MTUyQzE1MkIsIDB4MTUyRTE1MkQsIDB4N0Y1QzE1MkYsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDRGMjI2Q0Y2LCAweEUyNDA2MTRELCAweDg5MTczMTIzLAorMHgzMTI3RTIxRiwgMHhENDNCODkwOCwgMHhFMDAxRDUzQiwgMHg2NjQyNDUwQiwKKzB4MjY3OTY3MDcsIDB4MjQ2MkEwMEMsIDB4MzEyN0UyM0YsIDB4RDczNTg5MDgsCisweDcxRTBENjM1LCAweDQ2MEJFMDAxLCAweDYyMDc1NTcxLCAweDE3NTEyNTI5LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhFMjQwNjE0RCwgMHg4OTE1MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQyQjg5MDcsIDB4NjY0MkQyMkIsIDB4RTAwMTQyMEIsCisweEEwMEIyNjBCLCAweEUyM0YyNDYyLCAweDg5MDczMTI3LCAweEQ2MjZENzI1LAorMHg3MUUwNTU3MSwgMHhFMDAxNDYwQiwgMHgxNzUxMjUwQiwgMHgwMDBCNEYyNiwKKzB4RTY0MDAwMDksIDB4NDYyODQ2MTgsIDB4NjI1MkQ1MjAsIDB4ODlGQzIyNjgsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MUM0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCODlGQywgMHhBMDAxMDAwOSwgMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwKKzB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsIDB4RDUxNTQ2MjgsIDB4MjI2ODYyNTIsCisweDAwMEI4QkZDLCAweDAwMDAwMDA5LCAweDAwMjAyOTZDLCAweDAwMjAwRTJBLAorMHgwMDExN0QwNCwgMHgwMDIwMjg1OCwgMHgwMDExN0Q4MCwgMHgwMDIwMjhFQywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4MDAyMDBGMjYsIDB4MDAyMDA5QzQsCisweDAwMUUyMTJDLCAweDAwMUMzRDI4LCAweDAwMTE3RDAwLCAweDAwMjAwRThBLAorMHgwMDIwMjk4NCwgMHgwMDFDMzcwNCwgMHgwMDIwMjAzNCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4NEYyMjJGRTYsIDB4NkU1MzdGRkMsIDB4MkY0MkJGQ0EsCisweEQ2MTU2MUUyLCAweDE2MTVFMjgwLCAweDQyMTg1NEUxLCAweDU1RTIxNjQ2LAorMHgxNjU3NDIyOCwgMHg2RUYyNTdFMywgMHgyRTJCMTY3OCwgMHg3RjA0MjZFMiwKKzB4QUZBNzRGMjYsIDB4MkZDNjZFRjYsIDB4MkZFNjJGRDYsIDB4REQwQTRGMjIsCisweEJGQUY2QzUzLCAweEJGOTQ2RTQzLCAweEJGQUIyREUyLCAweDUxRDUwMDA5LAorMHg1NEQ2MkMxMiwgMHg1NUQ3MUM0MSwgMHg1NkQ4MUM1MiwgMHg0RjI2MUM2MywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MDAxQzM3MEMsIDB4MDAwOUEwRjgsCisweEQxOUI0RjIyLCAweEQ0OUI5Mjk5LCAweDIxMjJCMDBELCAweDk3OTVFNjA1LAorMHhCMDIyOTU5NSwgMHhCMDM2NjQ2MywgMHhCMDNBMDAwOSwgMHhCMDNEMDAwOSwKKzB4QTA2QzAwMDksIDB4NEYxMjRGMjYsIDB4RDE5MzRGMDIsIDB4OTQ4NzMxNDUsCisweDQ2MDkwNjBBLCAweDQ2MDk0NjA5LCAweDAwMjkzNjQ2LCAweEQ3OENENThGLAorMHgyNTAwQ0EwMSwgMHg0RjA2Mjc2MiwgMHg0RjE2MDAwQiwgMHhCRkVBNEYyMiwKKzB4QjAyMzAwMDksIDB4QTA1MjAwMDksIDB4MkZFNjRGMjYsIDB4NkU2M0QxODgsCisweDQ0MTg2NjEyLCAweDQ1Mjg5MjZELCAweDI2Mjk0NDA4LCAweDQ0MDg0NTAwLAorMHg0NDAwMjY1QiwgMHg0NzA4MjY0QiwgMHg0NzA4MjE2MiwgMHgyN0VCRDE4MSwKKzB4MDAwQjIxNzIsIDB4RDE4MDZFRjYsIDB4RTYwM0Q0ODAsIDB4MDAwQjIxNjIsCisweEQyN0YyNDYyLCAweEU0MEE5NjU2LCAweDIyNjJBRkIwLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEQzdCNEYyMiwgMHgyQzIyRTIwMSwgMHhCRkE1RTQwQSwKKzB4NjBDMjdDNDQsIDB4Q0IwMUVEMDAsIDB4NjBDMjJDMDIsIDB4QzkwMUVCNjQsCisweDZFMDNBMDA4LCAweDg5MDczREIyLCAweEU0MDE2MEMyLCAweEJGOTVDOTAxLAorMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4QjAzM0RCMiwgMHhEMjZGRDQ2RSwKKzB4MDAwOTQyMEIsIDB4NEYyNkU0MEEsIDB4NkRGNjZFRjYsIDB4QUY4NTZDRjYsCisweDQ0MTE2QkY2LCAweDYwNEI4RjAxLCAweDAwMEI2MDQzLCAweDJGODYwMDA5LAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NkRBM0VBMDAsIDB4REM2MjZCQTMsIDB4OTkxNEU4NjQsIDB4OEI0RTJCQjgsCisweDNBRTNFRTBBLCAweDYwQzI4OTRCLCAweENCMDJFRDAwLCAweDYyQzIyQzAyLAorMHgyRjAyNjBDMiwgMHhBMDEwQzkwMiwgMHgwOTZDNkUwMywgMHg1QkI0NTI4OCwKKzB4MUZGRjA5QjQsIDB4MDFGRjAzQzQsIDB4ODkwODNEODMsIDB4RTQ2NDYwQzIsCisweEM5MDIyRjAyLCAweDZFMDNCRjUyLCAweDJFRTg3RDAxLCAweEQxNTE4QkY0LAorMHg1NEMxRDU1MSwgMHg2NjUyNjQxMiwgMHg2MjY5RUUwMSwgMHg0MjIwNjIyRiwKKzB4NjIyRjQyMTksIDB4NEUxODIyOTksIDB4OEQwMzIyRTgsIDB4RTRGRjY0MjMsCisweDM0MjgyMjlBLCAweDY1NzJENzQ5LCAweDYyMkY2MjU5LCAweDQyMTk0MjIwLAorMHgyMjk5NjIyRiwgMHg4RDAzMjJFOCwgMHhFNkZGNjYyMywgMHgzNjI4MjI5QSwKKzB4MzQ2OEJGQTcsIDB4MzBFMkVFMDIsIDB4QUZCNzg5MDEsIDB4RDI0MEVCMDEsCisweDZFRUNFRUU2LCAweEJGMjFFNDBBLCAweEFGQUYyMkUyLCAweEVFMEE3QTAxLAorMHg4OTAxM0FFMywgMHg4QjAzM0Q4MywgMHhEMjM0RDQzQSwgMHgwMDA5NDIwQiwKKzB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsCisweDY4RjYwMDBCLCAweDU2NTFENTM0LCAweDQ2Mjg2MDUyLCAweDMwNkMwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkYxNEYwMiwKKzB4NkIwMzZFNDMsIDB4REQxQ0RDMkQsIDB4MDAwOUJGRUMsIDB4M0MwNTMwQjgsCisweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LCAweDQyMDk0MjA5LAorMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwKKzB4MDAwQjZDRjYsIDB4MkZFNjZCRjYsIDB4REUyMTRGMjIsIDB4RTUwMEUxMDIsCisweDJFMTJFNDAzLCAweDJFNTJCRkQ0LCAweDQ2MThFNjA2LCAweEU0MDNFNzAwLAorMHgyRTcyMkU2MiwgMHhBRkNCNEYyNiwgMHg0RjIyNkVGNiwgMHgwMDA5QkZFQiwKKzB4RTZFNkQyMTMsIDB4RTQwQTY2NkMsIDB4MjI2MkJGQzIsIDB4NEYyNkFGRTMsCisweDAwMjAyOEYwLCAweDAwMjRDREUwLCAweDEwNjI0REQzLCAweDAwMjAyQUYwLAorMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywKKzB4MDAxQzU4MDQsIDB4MDAxQzU4MUMsIDB4MDAyMDI5OTgsIDB4MDAyMDBFMkEsCisweDAwMUM1ODYwLCAweDAwMUM2ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLAorMHgwMDFDOTQ3QywgMHgwMDIwMjlCMCwgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEU0MDA3RkU0LCAweDQ1MjhFNTEwLCAweDY3NDM2QzQzLAorMHhFMTA3QTAwRiwgMHg2MDQzNjQ0RCwgMHgwRjU2NDAwOCwgMHhFRTAwNjBDMywKKzB4ODE1MTI1QzEsIDB4ODE1MzgxNTIsIDB4MTU3MzE1RTIsIDB4NzUxNDE1RTQsCisweDYyNEQ3NDAxLCAweDhCRUQzMjEzLCAweERBNkY1MUYxLCAweDFBMTE1NEYyLAorMHhEMTZFMkExMiwgMHg1N0Y0NTVGMywgMHg2REYyNThGNSwgMHgxMTQxRDk2QywKKzB4MTE1MzIxNDIsIDB4MTE3NTExNTIsIDB4MTE4NzExNzQsIDB4NTJGNjExODYsCisweDE5RDFENjY4LCAweEQ4NjgyOUQyLCAweERBNjhFOTUwLCAweDE2MjFFQkI0LAorMHg2QkJDMjYyMiwgMHhBMDIxNDkwOCwgMHg2RUVERUUwMCwgMHg2MUUzNkRFMywKKzB4NDEwODREMDgsIDB4MzFFQzNERUMsIDB4NDEwODREMDgsIDB4NjBDMzNEOEMsCisweEU3OTA0MTA4LCAweDgxRDEyREMxLCAweDQxMDg2MDkzLCAweDgxRDI2NzdDLAorMHgzMUFDNjBDMywgMHgzNDcyRTIwMCwgMHgxREQyODFEMywgMHhENDU1MUQxMywKKzB4MUQyNDhEMDEsIDB4QjAzQUQ0NTAsIDB4N0UwMTY1RDMsIDB4MzRCMjY0RUQsCisweEQxNEQ4QkRCLCAweDY1MTJEQjUyLCAweDQ1MjlEMjRELCAweDY0MTIxQjUxLAorMHg2NzRERDE0QSwgMHg2NzIyMkI3MiwgMHg0NzI5RDY0RSwgMHg2OTIyMUI3MywKKzB4Njg5RDJGRDIsIDB4NjkxMjFCODIsIDB4NUExMjI2OTIsIDB4NUIxNDE2QTIsCisweDE2QjREQTQ0LCAweDE2QzY1QzE2LCAweDE2RUE2RUEyLCAweDRGMjY3RjFDLAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4NjA2MTY2NDIsIDB4OEQwNEM4MDMsIDB4NjA2MUU1MDAsIDB4ODgwMkM5MDMsCisweDUyNjI4QjAzLCAweDUxMjQ2NTYzLCAweDAwMEIyNDEyLCAweDJGRDY2MDUzLAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZFQywgMHhFNTUwNjI1MywgMHhFNDAwNkQ0MywKKzB4QTAwMTQ1MDgsIDB4NTIyNEUxMDEsIDB4MjIxMTYwNDMsIDB4ODEyMzgxMjEsCisweDgxMjI2MDUzLCAweDM2MjA1NkUyLCAweEQyMkY4QkY1LCAweDY0RjMxNkU0LAorMHg0MjBCRTYxNCwgMHg2NUUxNjVFMywgMHgyNTQ5RTRGQywgMHg2MUYxMkU1MSwKKzB4MjE0OTY1RjMsIDB4NTREMTJGMTEsIDB4NDEwQkQxMjcsIDB4NTdEMUU2MTQsCisweENCMDE2MDcxLCAweDFERTEyNzAxLCAweDRGMjY3RjE0LCAweDAwMEI2RUY2LAorMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwgMHg2RTUzN0ZFQywgMHhFNUZDNjY1MywKKzB4NjA2MTZENDMsIDB4Q0IwMTIwNTksIDB4NTJFMjI2MDEsIDB4OEIwNjMyNjAsCisweDUxRTIxMkU0LCAweDhCMDQzMUUwLCAweEEwMDI1MkQxLCAweEFGRjAxRTIyLAorMHhEMjE1NTY2NCwgMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFMUZDNjdFMSwKKzB4MkU3MTI3MTksIDB4NTREMTY3RjEsIDB4RDEwRjI3MTksIDB4RTYxNDY1RjMsCisweDJGNzE0MTBCLCAweDYwMjE1MkQxLCAweDIyMDFDQjAxLCAweDdGMTQxREUxLAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDIwMjhCQywgMHgwMDIwMjhDNCwKKzB4MDAyMDI4QjQsIDB4MDAyMDI4RTQsIDB4MDAxMDAwOEMsIDB4MDAxMDBFQzAsCisweDAwMUUyMTA4LCAweDAwMUMzRDAwLCAweDAwMjAyMTk0LCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhENjMxNEYyMiwgMHg2MEQzNkQ2MiwgMHg4OTREQzgwMywKKzB4REIzMERDMkYsIDB4MDAwOUEwMkMsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsCisweEQyMkRENDJCLCAweDAwMDk0MjBCLCAweDY1MDM1NjAzLCAweEM4MjA4NTYxLAorMHhFMDUwODkwMywgMHg3MjAxMDJCRSwgMHg4NTYyMEIyNiwgMHg0MDAwNjAwRCwKKzB4NDAwMDM2NkEsIDB4NDAwMDQ2MjQsIDB4MjA2RDQ2MjQsIDB4RDQyM0M5MDMsCisweDQwMDg2RTAzLCAweEQxMjI0MDAwLCAweDM0MEM0MTBCLCAweDYxRTNENTIxLAorMHhENzIxRTAwMSwgMHg0NTBCRDIyMSwgMHg2NEUzN0UzMCwgMHgyNzAyNDIwQiwKKzB4NjZDMjUyQzEsIDB4OEJDRjM2MjAsIDB4NEUxOEVFMDEsIDB4QTAxMURCMUMsCisweDYwNjFFQzc1LCAweDg4MDFDOTAzLCAweEQ0MTk4OTEwLCAweDQ2MEJENjEyLAorMHhENDE4MDAwOSwgMHg0NzBCRDcxOCwgMHhEMjEzNjUwMywgMHg2NEMzRDExMywKKzB4MjJFMjQxMEIsIDB4NjZCMjUyQjEsIDB4OEJFQTM2MjAsIDB4QzgwNDYwRDMsCisweEQyMTI4OTA2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwKKzB4MDAyMDI4QkMsIDB4MDAyMDI4NTgsIDB4MDAyMDBBRTAsIDB4MDAyMDI4QzQsCisweDAwMjAwQjYyLCAweDAwMjAyMDM0LCAweDAwMUMzRDMwLCAweDAwMjAwREYwLAorMHgwMDIwMjhCNCwgMHgwMDIwMjhFNCwgMHgwMDIwMEFGRSwgMHgwMDIwMDBGOCwKKzB4RTYwMUQyMzcsIDB4MTI2NUQ1MzcsIDB4MDAwQjIyNTIsIDB4RDYzNjEyNjYsCisweDg4MDE2MDYyLCAweEUxMDE4QjYyLCAweEQ1MzQyNjEyLCAweDU0NTFEMTM0LAorMHhFMDQwNjIxMiwgMHgyMTIyMzI0QywgMHg1NDExNTc1MiwgMHgxMTQxMzQ3QywKKzB4NTcxMjU0NTMsIDB4MTE3MjM3NEMsIDB4NTIxMzU3NTUsIDB4MTEyMzMyN0MsCisweDU2MTQ2NDUyLCAweDExNjQzNjRDLCAweDU0MTU1NzU0LCAweDExNDUzNDdDLAorMHg1NjE2NTQ1OCwgMHgxMTY2MzY0QywgMHg2NzYyRDYyNiwgMHgzMjdDNTIxNywKKzB4NTc2MTExMjcsIDB4MzI3QzUyMTgsIDB4NTc2MjExMjgsIDB4MzI3QzUyMTksCisweDU3NjMxMTI5LCAweDM0N0M1NDFBLCAweDU3NjQxMTRBLCAweDM0N0M1NDFCLAorMHg1NzY1MTE0QiwgMHgzNDdDNTQxQywgMHg1MjY2MTE0QywgMHgzNzJDNTcxRCwKKzB4NTI2NzExN0QsIDB4MzQyQzU0MUUsIDB4NTI2ODExNEUsIDB4MzYyQzU2MUYsCisweEQ2MTUxMTZGLCAweDA0MUU2MjYyLCAweDM0MkM3Njk0LCAweEUwNDQwMTQ2LAorMHgwNjFFNjI2MiwgMHgwMTY2MzYyQywgMHg1MjVDRTA0OCwgMHhENjBGMDUxRSwKKzB4MDE1NjM1MkMsIDB4RTA1NDYyNjIsIDB4NDIyOTA1MUUsIDB4MDE1NjM1MkMsCisweEUwNTg1NTYxLCAweDQ1MjkwNjFFLCAweDAxNjYzNjVDLCAweDAwMDkwMDBCLAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDFDMTAyOCwgMHgwMDFDMzY5QywKKzB4MDAyMDI4NTgsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweEQ2MkY3RkZDLCAweDI2NDI2NDRDLCAweEM4MjA1MDY2LCAweDJGMDI4REZDLAorMHg3RjA0MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywKKzB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsIDB4NjQ0Q0JGRUEsIDB4OEJGOTNFQzIsCisweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweEEwMDE2Q0Y2LCAweDc2MDE2NjQzLAorMHgyMjI4NjI2MCwgMHgzNjQ4OEJGQiwgMHg2NTYzQUZFNCwgMHgyRkI2MkY5NiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RUMxQ0VEMDgsIDB4REIxOTZFNTMsCisweDYxQzNFOTBBLCAweDYwNDM0QjBCLCAweDMwOTJDOTBGLCAweDY2MDM4RDAyLAorMHg3NjMwQTAwMSwgMHg0RDEwNzYzNywgMHg3RTAxMkU2MCwgMHg3Q0ZDOEZGMSwKKzB4ODA1OEUwMDAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4MDAwQjZCRjYsCisweDAwMEI2OUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLCAweDdGRUM0RjIyLAorMHg2RTQzNjI1MywgMHhCRkQxNjVGMywgMHhCRkM2NjQyMywgMHhCRkM0NjRFMywKKzB4RDQwNTY0RjMsIDB4MDAwOUJGQzEsIDB4NEYyNjdGMTQsIDB4NkVGNjAwMEIsCisweDAwMUMwMDA0LCAweDAwMjAyMEY0LCAweDAwMjAyOUNDLCAweEUxMTBENTlDLAorMHhFNjQwNjA1MCwgMHgyNTAwQzlGRCwgMHhFMEZGNzVFOSwgMHg4MDUxNjQ1MywKKzB4ODA1MzgwNTIsIDB4ODA1NjgwNTUsIDB4MjUxMDc1RUYsIDB4RTFFRjYyNTAsCisweDIyMTlFMDAxLCAweEU3MjAyNTIwLCAweDI0NjA4MDUyLCAweDI1NzAwMDBCLAorMHhFNEZERDU5MCwgMHhFNzAyNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwKKzB4MjUwMkNCMDEsIDB4RDE4QzY2NTIsIDB4MjU2MjI2NDksIDB4OTJDMjYwMTIsCisweDIxMDJDQjA4LCAweEM5Q0Y2MDEyLCAweDYwMTIyMTAyLCAweDIxMDJDQjAzLAorMHgwMDBCMTE3MiwgMHg0RjIyMTEyMywgMHhFMTAwRDQ4NCwgMHhEMjg1RDc4NCwKKzB4RDU4NTI0MTAsIDB4MjcxMUQ0ODUsIDB4MjIxMUU3MDAsIDB4QkZCRDI1MTEsCisweEQ1ODMyNDcxLCAweDI1NjBFNjAwLCAweDRGMjZBRkQyLCAweEQyODE2NjRDLAorMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjdENjU0QywKKzB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsCisweDQ2MDBEMjc5LCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLAorMHg0NTAwRDI3NSwgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwKKzB4RDI3MDY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsCisweEQyNkM2NTRDLCAweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LAorMHg2NjRDMjU2MCwgMHg0NjAwRDI2OCwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyNjQsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsCisweDI1NjAwMDBCLCAweEQ2NUY2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLAorMHg0MDIxNDAyMSwgMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY1QSwKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQxNTY2NDRDLCAweDM0MUM3NEZGLCAweDAwMEI2MjQwLCAweEQxNTQ2MDJDLAorMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywgMHg2NTVDNEYyMiwKKzB4MzU2N0U2MEEsIDB4NkU0MzhEMTUsIDB4NjQ1M0JGRUEsIDB4NjBFQzY0MEMsCisweDhCMDI4ODAxLCAweEEwMDJFMDBGLCAweDQ0MDkyNDA5LCAweDYyNEM0NDA5LAorMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywgMHhDODgwNjAyMywKKzB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsIDB4RDY0MTRGMjIsCisweDg4MDE2MDYyLCAweEIyMjI4QjAzLCAweEEwMDMwMDA5LCAweEQyM0UwMDA5LAorMHgyMjYwRTY0MCwgMHhFMjAwRDYzRCwgMHgwMDBCNEYyNiwgMHg0RjIyMjYyMiwKKzB4NjA2MkQ2MzgsIDB4OEIwMTg4MDIsIDB4MDAwOUIyNkMsIDB4RTIwMEQ2MzcsCisweDAwMEI0RjI2LCAweDBGRkYyNjIyLCAweEQ0MzNENTMyLCAweEU3MDFFMTAwLAorMHgwMDBCMjUxMiwgMHhEMjMwMjQ3MCwgMHgwMDBCRTYwNCwgMHhENTIwMjI2MCwKKzB4NjE1MEU0RkQsIDB4MjE0OUQ2MkUsIDB4MjUxMEU3MDAsIDB4MjY3MDAwMEIsCisweEU0RkJENTFCLCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEU0RjdENTE4LAorMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI2NEYyMiwgMHg2MDBEODUyMiwKKzB4ODkxMTIwMDgsIDB4ODkxMzg4MDEsIDB4ODkxNTg4MDMsIDB4ODkxNzg4MDUsCisweDg5NDE4ODA2LCAweDg5NDc4ODA4LCAweDg5NEQ4ODA5LCAweDg5NTM4ODBBLAorMHg4OTU5ODgwQiwgMHgwMDA5QTA2MCwgMHgwMDA5QjA2MiwgMHg2MDBDQTA1RCwKKzB4MDAwOUIwNzAsIDB4NjAwQ0EwNTksIDB4MDAwOUIwN0EsIDB4NjAwQ0EwNTUsCisweDYyNjBENjA2LCAweDhCNEYyMjI4LCAweDAwMDlCMDg2LCAweDYwMENBMDRELAorMHgwMDFFMTAyOCwgMHgwMDFFMjE0OCwgMHgwMDFFMTEwOCwgMHgwMDIwMjkzRCwKKzB4MDAyMDI5MkMsIDB4MDAyMDI5MkUsIDB4MDAyMDI5MzAsIDB4MDAyMDI5MTAsCisweDAwMUUxMDA4LCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDMwLAorMHgwMDFFMTA5MCwgMHgwMDIwMjkzOCwgMHgwMDFFMTAwQiwgMHgwMDIwMjkzNCwKKzB4MDAyMDI5M0MsIDB4MDAyMDI5MDQsIDB4NjI2MEQ2ODcsIDB4OEIyMzIyMjgsCisweDAwMDlCMDZBLCAweDYwMENBMDIxLCAweDYyNjBENjgzLCAweDhCMUIyMjI4LAorMHgwMDA5QjBCNCwgMHg2MDBDQTAxOSwgMHg2MjYwRDY3RiwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQkEsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2N0IsIDB4OEIwQjIyMjgsCisweDAwMDlCMTFFLCAweDYwMENBMDA5LCAweDYyNjBENjc3LCAweDhCMDMyMjI4LAorMHgwMDA5QjEzNiwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI3M0QxNzIsIDB4RDU3Mzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc3MjAxMkQsCisweDYxMUNFNDAzLCAweEQ2NzFFMjBGLCAweDI3MTIyNTQwLCAweEUwMDEyNTIwLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2OSwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNiwKKzB4RTAwMEQyNjcsIDB4ODEyMkQ2NjksIDB4MjYwMkUwMDEsIDB4MDAwOTAwMEIsCisweDg1MjNEMjYyLCAweDIwMDg2MDBELCAweDg4MDE4OTA1LCAweEQ2NjQ4QjBBLAorMHhDQjAxNjA2MCwgMHhENjYxMjYwMCwgMHhFMTAxRDQ1RCwgMHgyNjEyRTAwMSwKKzB4ODE0MjAwMEIsIDB4RTAwMDAwMEIsIDB4RTUwMUQxNTgsIDB4NDUxODg1MTMsCisweDM0NTM2NDBELCAweDhEMDU2NjAzLCAweEQyNUFFMDAwLCAweEUwMDFENTU3LAorMHgyNTAyMjI2MCwgMHgwMDA5MDAwQiwgMHhEMTUwNEYyMiwgMHg2NTBEODUxMywKKzB4NDQxOTY0NTMsIDB4NjcyRTYyNDksIDB4NjAyQzIyN0QsIDB4ODkwOTg4MDEsCisweDg5MEM4ODAyLCAweDg5MTA4ODAzLCAweDg5MjY4ODA2LCAweDg5Mjk4ODA3LAorMHgwMDA5QTAzOCwgMHhENjRERDU0QywgMHhBMDI3RTIxMiwgMHg2MjVDMjY1MiwKKzB4OEIyRjIyMjgsIDB4QTAxRUQ2NEEsIDB4NjA1QzYyNjIsIDB4ODkwNTIwMDgsCisweDg5MDg4ODEwLCAweDg5MEI4ODIwLCAweDAwMDlBMDI0LCAweEQ2NDNENDQ1LAorMHhBMDEzRTIwNCwgMHhENzQ0MjY0MiwgMHhFMjBDRDY0MCwgMHgyNjcyQTAwRSwKKzB4RDYzRUQ1NDIsIDB4QTAwOUUyMTgsIDB4RDQ0MTI2NTIsIDB4RTIwQUQ2M0IsCisweDI2NDJBMDA0LCAweEQ2MzlEMjNGLCAweEUyMkUyNjIyLCAweEQ0M0U4NTE1LAorMHgzMjc3NjcwRCwgMHg4RjAxMjQyMSwgMHgyNDUxNjUwMywgMHgwMDA5QjBERiwKKzB4RTAwMUEwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RTEwMUQ2MjksCisweDI2MTBENDM2LCAweEQ3Mjg2NTQxLCAweDY1NUREMTI4LCAweEUwMDFFMjBGLAorMHgyNjIwMjc1MiwgMHgyMTAyMDAwQiwgMHg0RjIyMkZFNiwgMHg4NTIzRDIxRiwKKzB4MjQ0ODY0MEMsIDB4RDYyRDhCMDgsIDB4RTIwMEQ1MjEsIDB4ODQ1MTI2MjEsCisweDIwNDk5NDMwLCAweDgwNTFBMDI2LCAweDYwRTBERTFELCAweDhEMEJDODQwLAorMHgzNDI3RTIwMSwgMHhEMTI1ODkyMiwgMHg0MjBCRDIyNSwgMHhENTI1MjE0MSwKKzB4Q0IwNDYwNTIsIDB4MjUwMkEwMEIsIDB4ODkxNzM0MjcsIDB4RDcyMkQyMUYsCisweDIyNDE0NzBCLCAweEU1RkJENjFGLCAweDIxNTk2MTYyLCAweDg0RTEyNjEyLAorMHhCMTJEQ0I4MCwgMHg2MEUwODBFMSwgMHhDQjA0RDYxQywgMHg2MDYwMkUwMCwKKzB4MjYwMEM5M0YsIDB4RTAwMUQ2MDksIDB4MjYwMkEwMDEsIDB4NEYyNkUwMDAsCisweDZFRjYwMDBCLCAweDAwMDBGRjdGLCAweDAwMjAyOTNELCAweDAwMjAyOTA0LAorMHgwMDIwMjkxMCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMjkzNCwKKzB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDJBRjQsIDB4MDAyMDI5MTgsCisweDAwMjAyOTIwLCAweDAwMjAyQjYyLCAweDAwMjAyQjY2LCAweDAwMjAyQjcyLAorMHgwMDIwMkI4QSwgMHgwMDIwMkI5NCwgMHgwMDIwMjkxQywgMHgwMDIwMjkyQSwKKzB4MDAyMDFBQjYsIDB4MDAxRTExMDgsIDB4MDAyMDFCQzIsIDB4MDAxRTEwMTUsCisweDYwNjBENjk2LCAweDg5MTlDODgwLCAweDYwMjFEMjk1LCAweDhCMTU4ODAxLAorMHhFNTAxRDI5NCwgMHgzMDU2ODUyNCwgMHhEMTkzODkxMCwgMHhENDkzRTIwMywKKzB4NjU0MTIxMjAsIDB4NjU1REUwMEIsIDB4RDU5MTA2NTYsIDB4RTcwMkU0MEYsCisweDI1NzEyMTQwLCAweEUwMDFENzhGLCAweDI3MDIwMDBCLCAweEUwMDAwMDBCLAorMHg0RjIyMkZFNiwgMHg4NEUxREU4QywgMHg4OTM0Qzg4MCwgMHg4NTU0RDU4NSwKKzB4OEYzMDIwMDgsIDB4RDc4OTYxMDMsIDB4NjY3Mjg1NTMsIDB4NjUwQzY0MDMsCisweDYyMEM4NTY2LCAweDhCMjYzNTIwLCAweEQ3ODBENjg1LCAweDY0NEM2NTFDLAorMHgyNzQxMjY1MSwgMHhDODQwNjBFMCwgMHhEMjgyODkwNywgMHgwMDA5NDIwQiwKKzB4NjA2MkQ2ODEsIDB4QTAwOENCMDQsIDB4RDE4MDI2MDIsIDB4MDAwOTQxMEIsCisweEU1RkJENjdELCAweDI0NTk2NDYyLCAweEIwQTEyNjQyLCAweEQ1NzUwMDA5LAorMHgyNTIyRTIwMSwgMHhENzdBNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA3MCwKKzB4QTAwMTI3MDAsIDB4RTAwMDYwMjMsIDB4MDAwQjRGMjYsIDB4MkZBNjZFRjYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEUyNDBEQTY5LCAweERDNjY2NkExLAorMHgzMTIzNjE2RCwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwKKzB4NEUyMTJBNjEsIDB4REI2Q0Q0NkIsIDB4RTcwMEEwMEYsIDB4NzcwMTY2QjIsCisweDcxMDI2MTYzLCAweDY1NjEyQjEyLCAweDcxMDI2NjEzLCAweDYyNjEyQjEyLAorMHg2MjJENjU1RCwgMHgzMjVDNDIyOCwgMHg2MjdDMjQyMiwgMHg4QkVEMzJFMywKKzB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4RUQwNzZFQjIsIDB4NzEwMjYxRTMsCisweDY3MTMyQjEyLCAweDYyRTE3MTAyLCAweDY1NzEyQjEyLCAweDY1NUQ2MjJELAorMHgzNTJDNDUyOCwgMHhBMDBDMkNEMCwgMHg4ODAyMjQ1MiwgMHhBMDAzOEIwMSwKKzB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4Njc3RDY3NjEsCisweEVCMEYyNDcyLCAweDZEQTEyQ0IwLCAweDhCMDUyREQ4LCAweEQ0NDVEMjRGLAorMHhFMTAxRUUwMCwgMHgyNDEyMjJFMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREM0QsIDB4NjE2RDY2RDEsCisweDg5MDAzMTIzLCAweDY3MkM2MjYzLCAweERFNDMzNjc4LCAweDJENjE3NzAzLAorMHhENjQwNDcyMSwgMHg0NzIxNjRFMiwgMHhFMTAwQTAwRSwgMHg3MTAxNjU2MiwKKzB4MjQ1MDYyNTMsIDB4NDIxOTc0MDEsIDB4NzQwMTI0MjAsIDB4MjQ1MDQ1MjksCisweDQ1MTk3NDAxLCAweDc0MDEyNDUwLCAweDMyNzM2MjFDLCAweDQyMDA4QkVFLAorMHg2NEQxNjZFMiwgMHgzNjJDNDIwMCwgMHg4RjA2MjQ0OCwgMHhERDMzMkU2MiwKKzB4RTUwMERFMjgsIDB4MkQ1MkU3MDEsIDB4NkVGNjJFNzIsIDB4NkRGNjAwMEIsCisweDJGRTYyRkQ2LCAweEVFMDE0RjIyLCAweEVEMEFBMDA1LCAweDY0RTNCQ0I2LAorMHg2NEUzQkNCQywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhFRTAxQTAwNSwKKzB4NjRFM0JDQkQsIDB4NjRFM0JDQzMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2MDYwRDYxRiwgMHg4OTc1ODgwMSwgMHhFMTAxRDQxRSwgMHhENzEyODU0OCwKKzB4NjUwRDI2MTAsIDB4NDUxOTYwNzAsIDB4NjY1OUREMUIsIDB4NjFEMzYyNkUsCisweEM4NDAyNjJELCAweDc0MDI3MTAyLCAweDhENDdENzE4LCAweEQyMTg2NjZDLAorMHhFNTAxREUwQSwgMHhBMDMxMkUyMiwgMHgwMDAwRUUwNCwgMHgwMDFFMTAwMSwKKzB4MDAyMDI5MkEsIDB4MDAyMDI5MDQsIDB4MDAxRTExMDAsIDB4MDAyMDI5MkUsCisweDAwMjAyOTFDLCAweDAwMjAyOTM0LCAweDAwMUUxMDAwLCAweDAwMjAyOTIwLAorMHgwMDIwMjkyQywgMHgwMDIwMUFCNiwgMHgwMDFFMTEwOCwgMHgwMDIwMUJDMiwKKzB4MDAxRTEwMTUsIDB4MDAxRTEwMEMsIDB4MDAyMDI5MTgsIDB4MDAyMDI5MzgsCisweDAwMjAyOTNDLCAweDAwMjAyQUY0LCAweDAwMjAyQjhBLCAweDAwMjAyQjk2LAorMHgwMDIwMkIwNiwgMHg3NTAxNjI0NSwgMHg3MTAyMjEyMSwgMHgzMkUzNjI1QywKKzB4NjA2MzhCRjgsIDB4RTYwMTgxRDQsIDB4RTQxN0Q1MzgsIDB4MzI0MzYyNkMsCisweDYyNTU4OTFFLCAweDI3MjE3NjAxLCAweDc3MDJBRkY4LCAweERFMzVEMjM0LAorMHgyRTIyRTUwMSwgMHhFRTA0QTAwNCwgMHg3NTAxNjI0NSwgMHg3MTAyMjEyMSwKKzB4MzJFMzYyNUMsIDB4NjA2MzhCRjgsIDB4RTYwMTgxRDQsIDB4QTAwNEQ1MkUsCisweDYyNTVFNDE3LCAweDI3MjE3NjAxLCAweDYyNkM3NzAyLCAweDhCRjgzMjQzLAorMHgyRDIxOTI0QiwgMHhENzJBRDQyOSwgMHgyRjEyNjE0MiwgMHg2REYyNjVGMiwKKzB4Qzk4MDYwNTMsIDB4NjA1MzI3MDAsIDB4NjEwM0M5NjAsIDB4NjA1MzgwNzEsCisweDY1RjI2RUYyLCAweDREMTlDOTAzLCAweDgwNzI0NTI5LCAweDQ1MTk2MERDLAorMHg0RTI5ODE3MiwgMHg2MkVDNjA1QywgMHgzMDJDNDAxOCwgMHg2RDQyODE3MywKKzB4MkZEMjIxMTgsIDB4NjJGMjZFRjIsIDB4NDIxOTY2RjIsIDB4NjU2QzQ2MjksCisweDYwMkM2NkYyLCAweDQwMTg2NEVDLCAweDMwNEM0NjI5LCAweDgxNzQ0NjE5LAorMHg0MDE4NjA2QywgMHg4RjA3MzA1QywgMHhCQ0I1ODE3NSwgMHg2MjBDMDAwOSwKKzB4ODkwODIyMjgsIDB4MDAwOUEwMEEsIDB4ODg0MDYwMTMsIDB4QjAwQThCMDMsCisweEEwMDMwMDA5LCAweEQ2MEIwMDA5LCAweDI2MjJFMjAyLCAweDRGMjY3RjA0LAorMHgwMDBCNkVGNiwgMHgwMDBCNkRGNiwgMHgwNjBBMDAwOSwgMHgwMDIwMkIzNiwKKzB4MDAyMDJCMzQsIDB4MDAyMDI5MjAsIDB4MDAyMDJCMDgsIDB4MDAxRTEwMEMsCisweDAwMjAyOTA0LCAweDAwMjAyOTM0LCAweDdGRkM0RjIyLCAweDY2MjBEMjdFLAorMHg4RDA4MjY2OCwgMHhENDdEMkY2MCwgMHg0MjBCRDI3RCwgMHg2NEYwMDAwOSwKKzB4QTA5MDdGMDQsIDB4N0YwNDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwQjAwMDksCisweDJGRTYwMDA5LCAweERFNzc0RjIyLCAweDYwRTBENjc3LCAweENCQzBENDc3LAorMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwKKzB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY3MTYxNkQsIDB4RTUwMEEwMDQsCisweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQxNkQ4QkY4LAorMHgwMDA5NDEwQiwgMHhFNDAxRDY2QywgMHg4NEUyMjY0MSwgMHg4MEUyQzlCRiwKKzB4MDAwQjRGMjYsIDB4MkZFNjZFRjYsIDB4RDU2ODdGRkMsIDB4NjI1MERFNjEsCisweDY0MkM4NEUyLCAweENCNDA3NDA0LCAweDgwRTI2MTRELCAweDQ0MjE2NDEzLAorMHhENzYzNDQyMSwgMHhFNjAwQTAwNCwgMHg3NjAxNjI1NiwgMHgyNzIyMkYyMiwKKzB4MzI0MzYyNkQsIDB4NjAxMzhCRjgsIDB4MjAwOEM5MDMsIDB4ODgwMzg5MTIsCisweDg4MDI4OTA1LCAweDg4MDE4OTA2LCAweEEwMDg4OTA3LCAweEUwMDcwMDA5LAorMHg4MDc4QTAwNSwgMHhBMDAyRTAwMywgMHhFMDAxODA3OCwgMHg2MjUyODA3OCwKKzB4MjcyMjJGMjIsIDB4RDY1MEUwMEYsIDB4NjA2MTgwNzgsIDB4OEIwMTg4MDEsCisweDI2MjFFMjAwLCAweDYwNjBENjRGLCAweDI2MDBDQjA4LCAweEM5M0Y2MEUwLAorMHg3RjA0MkUwMCwgMHg2RUY2MDAwQiwgMHg2MDIxRDI0NywgMHg4RDE4ODgwMSwKKzB4RDI0NjYxNDMsIDB4MjIxMDYwNTMsIDB4NjA2MzgwMjEsIDB4RDQ0NjgxMjEsCisweEU1MDBBMDA3LCAweDAyN0M2MDVELCAweDM2NEM2NjAzLCAweDI2MjA3MDAxLAorMHg2MjVENjUwMywgMHgzMjEzNjExQywgMHhENjQwOEJGNCwgMHhDOUJGNjA2MCwKKzB4MDAwQjI2MDAsIDB4MkZENjAwMDksIDB4NEYyMjJGRTYsIDB4NjA0MzdGRkMsCisweDhEMDJDODIwLCAweEJGNkE2RTQzLCAweDYwRTMwMDA5LCAweDg5MDFDODEwLAorMHgwMDA5QkY2NywgMHhDODQwNjBFMywgMHhCRjhDODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkyOUM4MDEsIDB4NjBEMEREMzIsIDB4OEQwM0M4MDIsIDB4RDYzMTJGMDAsCisweDAwMDk0NjBCLCAweEM4MDQ2MEYwLCAweEQ2MkY4OTAyLCAweDAwMDk0NjBCLAorMHg2MDIzNjJGMCwgMHg4OTAyQzg4MCwgMHhDOTdGNjBEMCwgMHg2MDIzMkQwMCwKKzB4ODkwMkM4MDEsIDB4NDIwQkQyMjksIDB4RDUyOTAwMDksIDB4ODgwMjYwNTIsCisweEQyMjg4QjAzLCAweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMjU4QjAyLAorMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhEMjIyODkxNiwKKzB4NjBFMzZFMjAsIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjAsIDB4NjBFMzAwMDksCisweDg5MDJDODA0LCAweDQyMEJEMjFFLCAweDYwRTMwMDA5LCAweDg5MDVDODA4LAorMHg3RjA0RDIxQywgMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwKKzB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAxRTEwMjAsIDB4MDAyMDI5RDAsCisweDAwMjAwRTJBLCAweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3RDAwLAorMHgwMDFFMTBGQywgMHgwMDIwMDBGOCwgMHgwMDIwMjkzMCwgMHgwMDExN0Q4MCwKKzB4MDAxRTEwRjgsIDB4MDAxRTEwQUUsIDB4MDAxMTdEODQsIDB4MDAxRTEwMTcsCisweDAwMUUxMDIxLCAweDAwMjAxMDVDLCAweDAwMjAxMDdFLCAweDAwMjAxNjA4LAorMHgwMDIwMjkzNCwgMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMTBBRSwKKzB4MDAyMDEwQzAsIDB4MDAyMDEwQ0MsIDB4RDZBODY0NEMsIDB4MzQ2Qzc0RkYsCisweDI0NTAwMDBCLCAweDY0NENENkE2LCAweDAwMEIzNDZDLCAweEQ2QTUyNDUwLAorMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2MTZENjI1QywgMHg0MTE5NDIwOCwKKzB4NjAxOTQyMDgsIDB4NjQ0QzQyMDAsIDB4MzI0QzY3MEUsIDB4MjA3REQxOUUsCisweEM5MEY0MjAwLCAweDAwMEIzMjFDLCAweDY3NjMyMjAwLCAweDQyMDg2MjVDLAorMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDE5OCwgMHgwMDBCMzIxQywKKzB4MkZFNjIyNzAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsCisweDI3MjlFMjlGLCAweDY1NzM2RTUzLCAweDQ3MTk2NzZELCAweDY3MkU2Mjc5LAorMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwKKzB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MEUxQTA0NjcsIDB4MjE1MDI1RUIsCisweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLAorMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNzMsIDB4RTQwMUJGQTAsIDB4QkZBM0U1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRkEzLCAweEJGQTBFNDAxLCAweEU2MDJFNTA2LAorMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RSwgMHhFNDAxODVGMiwKKzB4QkZBQTY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsCisweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjdFLCAweEJGODFFNDAyLAorMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MSwgMHg0NjE4RTYwMiwKKzB4ODFGNjYwNjMsIDB4QkY3RkU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsCisweEU1MDBCRjhCLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLAorMHhFMDEwNjU1QywgMHhCRjVGRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MiwKKzB4MDVGQ0UwMTAsIDB4QkY2MkU0MEUsIDB4RTUwMDc1ODUsIDB4QkY2M0U0MDMsCisweEU1MDBFNjQwLCAweEJGNzBFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLAorMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ1RTQwNCwgMHhFNDBGMEY1NCwKKzB4RTUwNEJGNDgsIDB4MDVGQ0UwMTQsIDB4QkY0OEU0MEYsIDB4RTUwMTc1ODQsCisweEJGNDlFNjQwLCAweEU1MDFFNDA0LCAweEJGNTZFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwKKzB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsCisweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LAorMHhFNDAxQkYxQSwgMHhCRjFERTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGMUQsIDB4QkYxQUU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQjY1NDMsCisweEU0MDFFNjQwLCAweEJGMjg2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLAorMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZENjA1MywgMHhFNDAyODBGNCwKKzB4RTUxMkJGMDAsIDB4RTQwMjg0RjQsIDB4QkYwMDcwOTAsIDB4RTY0MDY1MDMsCisweEJGMDFFNDAyLCAweEU2NDBFNTAwLCAweEJGMEVFNDAyLCAweEU2NDBFNTAwLAorMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUUzRTQwMywKKzB4RTUxMzgwRjgsIDB4RTQwRUJFRTYsIDB4RTQwRTg0RjgsIDB4QkVFNjcwODUsCisweEU1MDA2NTAzLCAweEJFRTdFNjQwLCAweEU1MDBFNDAzLCAweEJFRjRFNjQwLAorMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywKKzB4QkVDOUU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0MsIDB4RTQwRjg0RkMsCisweEJFQ0M3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0RFNjQwLCAweEU1MDFFNDA0LAorMHhCRURBRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwKKzB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMzAsCisweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLAorMHgwMDIwMjkyQSwgMHgwMDIwMjkyQywgMHgwMDIwMjkyRSwgMHgwMDA5MDAwQiwKKzB4NjY2Q0U2ODAsIDB4NjU2M0QyQTAsIDB4NzU0MEU3MDAsIDB4NjQ3MzQyMkIsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDRDMThFQzAxLAorMHhEQTlCREI5QSwgMHg2NUIyNTJCMSwgMHg4OTIyMzUyMCwgMHhDOTAzNjA1MSwKKzB4ODkxRTg4MDEsIDB4RDE5N0RFOTUsIDB4NjRFMzQxMEIsIDB4ODUwMzY1MDMsCisweDY3MEQ2NkEyLCAweEREOTQzNzYyLCAweEQ0OTQ4OTBBLCAweDQyMEJEMjk0LAorMHhEMTk0MDAwOSwgMHhFNzAxRDQ5NCwgMHgyMTcyNEQwQiwgMHgwMDA5QUZFMiwKKzB4NDIwQkQyOTIsIDB4RDY5MjY0RTMsIDB4NEQwQkQ0OTIsIDB4QUZEOTI2QzIsCisweDRGMjYwMDA5LCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHg3RkY0NEYyMiwgMHhFNjgxODU0NiwgMHg4NTQ3MkYwMSwgMHg4MUYxNjY2QywKKzB4RDI3RDg1NDgsIDB4ODU0MjgxRjIsIDB4ODFGMzY3RjMsIDB4RTQwQzg1NDMsCisweDYwNTM4MUY0LCAweDgxRjU2NTYzLCAweDc1NDA0MjBCLCAweDRGMjY3RjBDLAorMHgwMDA5MDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4RTIwMDdGRUMsIDB4QTBDQkRCN0IsIDB4NkExMzJGMjEsCisweDRBMDhEMjdBLCAweERFN0FFMDAxLCAweDRBMDA0MjBCLCAweDdFMzAzQUVDLAorMHgxRjAyMUZFMSwgMHg2NkIyREQ3NywgMHgzNjIwNTJCMSwgMHhBMEI1OEIwMSwKKzB4NjA2MTAwMDksIDB4ODgwMUM5MDMsIDB4QTBBRjhCMDEsIDB4ODU2MTAwMDksCisweDg5NzRDODAxLCAweEVFMTA1MTYzLCAweERDNjM4NTEyLCAweEM5MDM2NjAzLAorMHg4NTEzNjQwMywgMHg0MDIxNjAwRCwgMHhDOTNGNDAyMSwgMHg4RDIwMzBFMywKKzB4RDc2OTY1MDMsIDB4NjI3MDQ0MDgsIDB4NDQwMDQ0MDgsIDB4MjIyODQ1MDAsCisweDM0NUM4RjBDLCAweDYwNDNEMjY1LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LAorMHgyMDdENjcwRSwgMHg2MDVDODFGNiwgMHg4MUY4QTAwQiwgMHg2MDQzRDI2MCwKKzB4Njg1RDA1MkQsIDB4NjA4OTQ4MTksIDB4MjA5RDY5MEUsIDB4NjA1QzgxRjYsCisweEQ3NUM4MUY4LCAweDIyMjg2MjcyLCAweEUwRkY4OTAyLCAweDgxRjg2MDBDLAorMHhFRUZGODVGOCwgMHg2RUVDNjUwRCwgMHg4QjBGMzVFMCwgMHg0RTBCREU0NSwKKzB4NTQwMzY0QjMsIDB4QkY3QkU1MDIsIDB4RDQ1MzY4MDMsIDB4NDEwQkQxNDcsCisweEQ3NTI2NTgzLCAweEQ0NTJFOTAxLCAweDI3OTJBMDIwLCAweDI2RTlFRUZDLAorMHg4MTEyNjA2MywgMHg5NDZFODUxMywgMHg4MTEzMjA0OSwgMHg0NTA4ODUxMiwKKzB4NjIwMzY5NTMsIDB4RTUwODg1RjYsIDB4ODExMjIwMkIsIDB4NDUxODg1MTMsCisweDgxMTMyMDlCLCAweEQ0NDc4NTE0LCAweDgxMTQyMDVCLCAweDg1MTE2MUIyLAorMHg4MTExMjBFOSwgMHg2MDIxNjJCMiwgMHgyMjAxQ0IwMSwgMHgwMDA5NEMwQiwKKzB4NTZGMTYwQjIsIDB4Q0IwMTUyRjIsIDB4QUY3QzJBMDIsIDB4ODU2MTI2MjIsCisweEM4MDJEQzNBLCAweEQ5MzhEMjI3LCAweDhEMEZEODJDLCAweDQyMEI2NEIzLAorMHg2NTAzMDAwOSwgMHg0ODBCNjQ5MywgMHhFODAxNUUwMywgMHg4NUVGMkM4MiwKKzB4NjUwREQ2MzUsIDB4NjREMzQ2MEIsIDB4MDAwOUFGNjUsIDB4MDAwOTQyMEIsCisweDZFMDM1NDAzLCAweEU1MDg4NTQ0LCAweDQ1MTg2MTAzLCAweDMxNTAyMTU5LAorMHhCRjI1OEIwMywgMHhBMDA3RTUwMSwgMHg4NTQxMDAwOSwgMHg2MjBERDUyQiwKKzB4ODkwMTIyNTgsIDB4RTUwMEJGMUMsIDB4NDgwQjY0OTMsIDB4RDQyODY1RTMsCisweEU4MDFENjExLCAweDJDODI0NjBCLCAweDAwMDlBRjQ1LCAweDdCMDg2MkYxLAorMHgyRjIxNzIwMSwgMHhFRTAzNjJGMSwgMHgzMUU3NjEyRCwgMHhBRjJFODkwMSwKKzB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEZFMDM2OEY2LCAweDAwMjAxOEI4LCAweDAwMjAyOEU0LAorMHgwMDIwMjhFQywgMHgwMDIwMEFFMCwgMHgwMDIwMEUyQSwgMHgwMDIwMjhCNCwKKzB4MDAyMDBCNjIsIDB4MDAxRTIxMzAsIDB4MDAyMDJBRDQsIDB4MDAyMDBBRkUsCisweDAwMUMzRDMwLCAweDAwMjAyQUQ4LCAweDAwMjAyOEM0LCAweDAwMjAyMDM0LAorMHgwMDFDM0QwMCwgMHgwMDIwMkFFNCwgMHgwMDIwMkFGMCwgMHgwMDIwMjlENCwKKzB4MDAyMDJBNTQsIDB4MDAyMDI5MDAsIDB4MDAyMDI4QkMsIDB4MDAxRTIxMkMsCisweDAwMjAyQURDLCAweDAwMjAyQUUwLCAweDAwMjAwRThBLCAweDAwMDA4MDAwLAorMHgwMDIwMkFFQywgMHg0RjIyMkZFNiwgMHg2RTIyRDIwRCwgMHhDODQwNjBFMywKKzB4MjJFMjhEMDIsIDB4MDAwOUJFN0EsIDB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsCisweDAwMDlCRTc2LCAweEM4MDU2MEUzLCAweEJFQ0I4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHhBRTczNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwKKzB4MDAxQzM1MTAsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAyMDVFLCAweDAwMjAyMDE0LCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwKKzB4MDAwMDYyRjYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAyMTFFLCAweDAwMjAyMEQ0LCAweDAwMEJFMDAwLCAweDQwMDE2MkY2LAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg2MkY2MDAwQiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLAorMHg0MDI5NDAwMSwgMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4MDAwQjQwMjksIDB4NDAwNDYyRjYsIDB4NDAwNDQwMDQsIDB4QzkwRjQwMDQsCisweDYyRjYwMDBCLCAweDQwMDQ0MDA0LCAweEM5MDc0MDA0LCAweDYyRjYwMDBCLAorMHg0MDA0NDAwNCwgMHgwMDBCQzkwMywgMHg0MDA0NjJGNiwgMHgwMDBCQzkwMSwKKzB4MDAwMDYyRjYsIDB4MzYyMkUyMTgsIDB4Njc0MzhGMTIsIDB4MDAwOUEwMDQsCisweDc2RkY2MjU0LCAweDc0MDEyNDIwLCAweEM4MDM2MDUzLCAweDYwNDM4QkY4LAorMHg4OTAyQzgwMywgMHg0MjJCRDIyQiwgMHhEMjJCMDAwOSwgMHgwMDA5NDIyQiwKKzB4MkZFNjY0NzMsIDB4OEQ0QTM0NTAsIDB4Mjc3ODY3NjMsIDB4NjI0Mzg5NDcsCisweDIyN0IyMjVCLCAweEM5MDE2MDIzLCAweDhEMjAzNDUyLCAweDJFRTg2RTAzLAorMHg2MDIzOEIxNSwgMHg4QjA4QzgwMywgMHg0NzA5NjY0MywgMHg0NzEwNjI1NiwKKzB4OEZGQjI2MjIsIDB4QTAzMjc2MDQsIDB4NDcwMTAwMDksIDB4NjE0MzY2NzMsCisweDQ2MTA2MjU1LCAweDhGRkIyMTIxLCAweEEwMjg3MTAyLCAweDY2NDMwMDA5LAorMHg0NzEwNjI1NCwgMHg4RkZCMjYyMCwgMHhBMDIwNzYwMSwgMHg2MTQzMDAwOSwKKzB4MkVFODM1N0MsIDB4OEYxNTMxN0MsIDB4NjAyMzY2NTMsIDB4OEIwN0M4MDMsCisweDc2RkM0NzA5LCAweDQ3MTA2MjYyLCAweDIxMjY4RkZCLCAweDAwMDlBMDBGLAorMHg2NTYzNDcwMSwgMHg3NUZFNjY3MywgMHg0NjEwNjI1MSwgMHgyMTI1OEZGQiwKKzB4MDAwOUEwMDUsIDB4NjI2MDc2RkYsIDB4OEZGQjQ3MTAsIDB4NjA0MzIxMjQsCisweDZFRjYwMDBCLCAweDAwMjAyMzA2LCAweDAwMjAyN0IyLCAweEUyMUUyRkU2LAorMHg2NzYzMzYyNiwgMHg4RDFCNjE1MywgMHgzRTEwNkU0MywgMHgzRTEyODkxNiwKKzB4NjVFMzg5MDgsIDB4MzY3MkU2MDAsIDB4NjIxNDg5MTAsIDB4MjUyMDc2MDEsCisweDc1MDFBRkY5LCAweDMxN0M2NEUzLCAweDY1MTMzNDdDLCAweEU2MDBBMDA0LAorMHg2MjUwNzVGRiwgMHgyNDI0NzYwMSwgMHg4QkY5MzY3MiwgMHg2MEUzQTAxMSwKKzB4ODkwODMxRTIsIDB4MzI3QzYyMTMsIDB4OEIwNDMyRTYsIDB4NjUxMzY0RTMsCisweEEwMDg2NjczLCAweEQyOEY2RUY2LCAweDY1MTM2NEUzLCAweDQyMkI2NjczLAorMHgwMDBCNkVGNiwgMHhFMjA0NkVGNiwgMHg2NzQzMzYyMiwgMHg4RjEwMzU2QywKKzB4QTAwNDM0NkMsIDB4NzVGRjAwMDksIDB4NzZGRjYyNTAsIDB4NjA1MzI0MjQsCisweDhCRjhDODAzLCAweEM4MDM2MDQzLCAweEExMDU4OTAxLCAweEEyNzcwMDA5LAorMHhBMjk5MDAwOSwgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg3RkU0MkZFNiwKKzB4NkM2MzYwNDMsIDB4NjY1MjFGNjIsIDB4QzkwMzc1MDQsIDB4MUY1MTZFNTMsCisweDQ1MDg2NTAzLCAweEUxRkM2RDQzLCAweDJEMTk0NTAwLCAweDFGNzMyNTU4LAorMHgxRjY1MUY0NCwgMHgyRkQyOEQwQiwgMHg4ODA4NjA1MywgMHg4ODEwODkyMywKKzB4ODgxODg5NUIsIDB4QTA4OThCMDEsIDB4QTBCRDAwMDksIDB4NjI2MzAwMDksCisweDJEMjJFNjAwLCAweDdDRkM3RDA0LCAweEVCMTBBMDBELCAweEU2MDA2NEU2LAorMHg3Q0YwNjVFNiwgMHg2MkUyNjFFNiwgMHgxRDUxMkQ0MiwgMHgxRDIzMUQxMiwKKzB4N0UwNDdEMTAsIDB4M0NCMjFGRTEsIDB4MUY2NTg5RjAsIDB4MkZEMjFGQzIsCisweEEwQTExRkU2LCAweDY0RDIxRkQ0LCAweDQ0Mjg2MjYzLCAweDQ0Mjk0NDE4LAorMHg0MjE4NDQxOSwgMHg0NjI5MjQyQiwgMHgyRDQyNDYxOSwgMHg2NTYzN0QwNCwKKzB4QTAyMTdDRkQsIDB4NjdFNkVCMTAsIDB4NjJFNjdDRjAsIDB4NjRFNjY2NzMsCisweDI1NkI0NjE4LCAweDJENTI2MUUyLCAweDY1MjM0NzI5LCAweDQ1MTg0NzE5LAorMHg0MjI5Mjc1QiwgMHg0MjE5MUQ3MSwgMHg0NzE4Njc0MywgMHg0NDI5MjI3QiwKKzB4NDQxOTY3MTMsIDB4MjQ3QjQ3MTgsIDB4MUQ0MzFEMjIsIDB4NDExOTQxMjksCisweDY1MTM3RDEwLCAweDFGRTE3RTA0LCAweDg5REMzQ0IyLCAweDFGRTY3RUZGLAorMHgxRkMyMUY1NSwgMHhBMDY3MkZEMiwgMHg2Q0YyMUZENCwgMHg2NkMyNTdGNSwKKzB4NDYyODYyNzMsIDB4NDIyODQ2MjksIDB4MkM2MjI2MkIsIDB4N0MwNDVERjIsCisweDdERkU0NzI5LCAweEEwMUNFQjEwLCAweDY1RTY1RUYxLCAweDY2RTY2MjczLAorMHg0NzI4Njc1MywgMHg2NzYzMjI3QiwgMHg0NTI5NjFFNiwgMHgyNTdCNDcyOCwKKzB4MkMyMjY0RTYsIDB4NjUxMzFDNTEsIDB4NDUyODQ2MjksIDB4MUM2MjI2NUIsCisweDQxMjk2NjQzLCAweDIxNkI0NjI4LCAweDQ0MjkxQzEzLCAweDY3NDM3QzEwLAorMHgzREIyN0RGMCwgMHgxRkQyODlFMSwgMHg3RUZFQTAzNCwgMHg1MUY1NkNGMiwKKzB4NjIxMzY2QzIsIDB4NDIyODQ2MTgsIDB4NDIxODQ2MTksIDB4MkM2MjI2MkIsCisweDdDMDQ1REYyLCAweDdERkY0MTE5LCAweEEwMUZFQjEwLCAweDY1RTY1RUYxLAorMHg2NEU2N0RGMCwgMHg0MjI4NjI1MywgMHg0MjE4NjdFNiwgMHg2NkU2MjEyQiwKKzB4NjE0MzJDMTIsIDB4NDUxOTQxMjgsIDB4MjUxQjQxMTgsIDB4NjU3MzFDNTEsCisweDQ0MTk0NTI4LCAweDI0NUI0NTE4LCAweDY0NjMxQzQyLCAweDQ3MTk0NDI4LAorMHgyNzRCNDQxOCwgMHg0NjE5MUM3MywgMHg2MTYzN0MxMCwgMHg4OURFM0RCMiwKKzB4N0VGRDFGRDIsIDB4MUZDNDFGRTYsIDB4NURGMkU3MDQsIDB4QTAwRDVFRjYsCisweDYyRTQ1MUY0LCAweDY2RTQ3REZDLCAweDY1RTQ2NEU0LCAweDcxMDEyMTIwLAorMHg3MTAxMjE2MCwgMHg3MTAxMjE0MCwgMHg3MTAxMjE1MCwgMHg4OUYwM0Q3MiwKKzB4NjZEMzU3RjMsIDB4NjQxMzY1RTMsIDB4NkVGNjdGMUMsIDB4NkNGNjZERjYsCisweDZCRjZBMTkwLCAweDAwMjAyMTk0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2MDQzN0ZFNCwgMHg2QzYzQzkwMywgMHg2NjAzMUY2MiwgMHg0NjA4NzVGQywKKzB4NjE1MjZFNDMsIDB4NDYwMEUyRkMsIDB4MjY2ODJFMjksIDB4MUY0NDFGNzMsCisweDFGNTE2RDUzLCAweDhEMEIxRjE1LCAweDYwNjMyRkUyLCAweDg5MUY4ODA4LAorMHg4OTUzODgxMCwgMHg4QjAxODgxOCwgMHgwMDA5QTA4MSwgMHgwMDA5QTBCOSwKKzB4RUIxMEEwMEQsIDB4NTJEMzdERjAsIDB4NTREMTU2RDIsIDB4MkUxNjY1RDIsCisweDJFNjYyRTI2LCAweDJFNDI3RUZDLCAweDFGRDE2MTUzLCAweDNDQjI3Q0YwLAorMHg3RDA0ODlGMCwgMHgxRjE1MUZENiwgMHgyRkUyMUZDMiwgMHgxRkU0QTBBMSwKKzB4NjIxMzY2RTIsIDB4NDIyOTQ2MTksIDB4NDIxOTQ2MTgsIDB4MkU2MjI2MkIsCisweDdDRkY0MTE4LCAweEVCMTBBMDIxLCAweDU0RDM3REYwLCAweDYyNDM1N0QyLAorMHg0MjE5NDIyOSwgMHg1NUQxMjEyQiwgMHgyRTE2NjZEMiwgMHg0MTI5NjE3MywKKzB4NDExOTQ0MTgsIDB4MkU0NjI0MUIsIDB4NDQyOTY0NTMsIDB4NDQxOTQ3MTgsCisweDJFNzYyNzRCLCAweDQ3Mjk2NzYzLCAweDQ3MTk0NTE4LCAweDI1N0I3RUZDLAorMHg0NjE4MkU1MiwgMHgxRkQxNjE2MywgMHgzQ0IyN0NGMCwgMHg3RDAzODlEQywKKzB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwNkIsIDB4NTdGNTZFRjIsCisweDYyNzM2NkUyLCAweDQ2Mjg0NjI5LCAweDI2MkI0MjI5LCAweDJFNjI1Q0YyLAorMHg3Q0ZFNDcyOCwgMHhBMDFCRUIxMCwgMHg3REYwNURGMSwgMHg1NUQyNTFEMywKKzB4NDYyOTY2MTMsIDB4NTREMTI3NkIsIDB4MkU3NjYyRDIsIDB4NDEyODY3NTMsCisweDIxN0I0NzI5LCAweDYxNDMyRTE2LCAweDQxMjk0NTI4LCAweDJFNTYyNTFCLAorMHg0NDI4NjUyMywgMHgyNDVCNDUyOSwgMHg0MjI4MkU0NiwgMHg3Q0YwNjcyMywKKzB4ODlFMjNDQjIsIDB4MUZENjdEMDIsIDB4QTAzQTFGQzIsIDB4NjdGMjFGRTQsCisweDY1NzI1MUY1LCAweDQ1Mjk2MjEzLCAweDQ1Mjg0NTE5LCAweDQyMTk0NTE4LAorMHg1Q0YyMjUyQiwgMHg0MTI4Mjc1MiwgMHg3Q0ZENDExOCwgMHhBMDIyRUIxMCwKKzB4N0RGMDVERjEsIDB4NTREMjU2RDMsIDB4NDUxOTY1NjMsIDB4NTJEMTQ2MjgsCisweDQ2MTgyMTVCLCAweDZFRDI2NTQzLCAweDQ1MTkyNzE2LCAweDI2NUI0NDI4LAorMHg2NTQzNjE2MywgMHg0NTE4NjQyMywgMHg0MjI4NDQxOSwgMHg0MjE4MjU0QiwKKzB4MjcxNjY0RTMsIDB4NDQxOTY2MjMsIDB4MjY0QjI3NTYsIDB4NEUyODI3NjYsCisweDYxRTM0RTE4LCAweDNDQjI3Q0YwLCAweDdEMDE4OURCLCAweDFGQzIxRkQ2LAorMHhFNzA0MUY3NCwgMHg1MUY0NURGMiwgMHg1RUY2QTAwRCwgMHg4NEUyN0VGQywKKzB4NjIwMzY0RTAsIDB4N0RGQzg0RTEsIDB4ODRFMzY1MDMsIDB4MjE2NDY2MDMsCisweDIxNTQyMTI0LCAweDNENzIyMTQ0LCAweDU3RjM4OUYwLCAweDY0MTM2NkQzLAorMHg3RjFDNjVFMywgMHg2REY2NkVGNiwgMHhBMDlENkNGNiwgMHgyRjg2NkJGNiwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NjE0Mzc0RTAsCisweDZBNjM2ODczLCAweDZCNTZFOTIwLCAweDZDNTY3QUUwLCAweDZENTY3MTIwLAorMHg2RTU2M0E5MiwgMHg2NDU2Njc1NiwgMHg2MjU2NjY1NiwgMHgxMUMxMjFCMiwKKzB4MTFFMzExRDIsIDB4MTE0NTExNzQsIDB4OERFQzExNjYsIDB4NzEyMDExMjcsCisweDY2MTNBMDA0LCAweDdBRkY2MjU0LCAweDc2MDEyNjIwLCAweDhCRjkyQUE4LAorMHg2RUY2NjA4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MkY4NjY4RjYsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDZBNjM2ODczLCAweDc1RTBFOTIwLCAweDU2NTY1MjU3LCAweDU3NTQ1MTU1LAorMHg1RDUyNUU1MywgMHg2QjUyNUM1MSwgMHgyNDY2MjQyNiwgMHgyNDc2MjQxNiwKKzB4N0FFMDI0RTYsIDB4MjRDNjI0RDYsIDB4OERFQzNBOTIsIDB4NjZBMzI0QjYsCisweDZFRjY2NzgzLCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweEEwNDM2OUY2LAorMHgyRkU2NjhGNiwgMHhDODA0NjA2MywgMHg4RDA0NkU2MywgMHg2MjE2NjE1MywKKzB4MjQyMjdFRkMsIDB4NjBFMzc0MDQsIDB4ODkwOEM4MTgsIDB4NzEwNDY1MTMsCisweDYyNTI2NjE2LCAweDI0MjI3RUY4LCAweEFGRjQxNDYxLCAweEUyMDQ3NDA4LAorMHg2NTEzM0UyMiwgMHg2NkUzOEQwMiwgMHg2RUY2QTAxQywgMHg2RUY2QUY4NywKKzB4QzgwNDYwNjMsIDB4NjE2MzhEMDQsIDB4NjI1Mjc1RkMsIDB4MjQyNjcxRkMsCisweEM4MTg2MDEzLCAweDc1Rjg4OTA2LCAweDY2NTI1MjUxLCAweDI0NjYyNDI2LAorMHg3MUY4QUZGNiwgMHgzMTIyRTIwNCwgMHg2NjEzOEYwMiwgMHgwMDA5QUZBMSwKKzB4MDAwOUEwMEEsIDB4MDAwOUEwMDQsIDB4NzZGRjYyNTQsIDB4NzQwMTI0MjAsCisweDhCRjkyNjY4LCAweDYwNzMwMDBCLCAweDAwMDlBMDA0LCAweDYyNTA3NUZGLAorMHgyNDI0NzZGRiwgMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA3MjYxNEQsCisweDMyMjAzMjMyLCAweDIwMzczMDMwLCAweDM1M0EzNzMxLCAweDM3MzMzQTMyLAorMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg2MTc2NkU0OSwKKzB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsCisweDAwMjE0NDQ5LCAweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLAorMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwgMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywKKzB4NkY2OTc0NjEsIDB4NjYyMDIwNkUsIDB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsCisweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLAorMHg2MTY2MjA2RSwgMHgyMTIxNkM2OSwgMHgwMDAwMEQwQSwgMHgwMDAwMEQwQSwKKzB4MDAwMDAwNDIsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDgwMjA3LCAweDAyMEEwMjA5LCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LAorMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHgwMDAwMDA3NCwKKzB4MDAwMDAwMDAsIDB4MDIwMDAxMTIsIDB4NDBGRkZGRkYsIDB4MTIyMTBBQ0UsCisweDIwMTA0ODkwLCAweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLAorMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDIwMCwKKzB4MDAwMjgyMDUsIDB4MDUwNzAwMDIsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsCisweDAxMDA0MDAzLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMDQwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMDQwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsCisweDAzMDQwMTAwLCAweDAzMEMwNDA5LCAweDAwNzkwMDVBLCAweDAwNDEwMDQ0LAorMHgwMzE4MDA1MywgMHgwMDUzMDA1NSwgMHgwMDMyMDA0MiwgMHgwMDMwMDAyRSwKKzB4MDA1NzAwMjAsIDB4MDA0MTAwNEMsIDB4MDAwMDAwNEUsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwNzA5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTExMjA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X09UVVNfUkMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9PVFVTX1JDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5ZDNlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9PVFVTX1JDLmMKQEAgLTAsMCArMSw3MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTI4N0ZGQywgMHhFMTE0RDcyOCwKKzB4MUUxM0Q0MjgsIDB4MUU0QzQ3MEIsIDB4MDAwOUIwMTgsIDB4QTAwMzk1NDMsCisweDM2NTJFNjAwLCAweDc2MDE4RDA0LCAweEM4NDA2MEUyLCAweDJGMDI4REY5LAorMHhERTIyRDQyMSwgMHgwMDA5NEUwQiwgMHg0RTBCRDQyMSwgMHhENDIxMDAwOSwKKzB4MDAwOTRFMEIsIDB4NEYyNjdGMDQsIDB4NkVGNkEwMjIsIDB4RDExRTRGMjIsCisweDAwMDk0MTBCLCAweDQ0MEJENDFELCAweEQ1MUQwMDA5LCAweDAwMDk0NTBCLAorMHhFMUZGRDcxQywgMHhEMjFDNjExRCwgMHg1MDI5MjcxMiwgMHhDQjAxRTFGRiwKKzB4RDYxQkQ0MUEsIDB4MjIxMjEyMDksIDB4RTUwMTEyMTEsIDB4MjQ1MkUyMDAsCisweEQ1MTgyNjIyLCAweDk3MEZENjE4LCAweDRGMjYyNTcyLCAweDI2MjAwMDBCLAorMHhERDE3REMxNiwgMHg0QzBCREUxNywgMHg0RDBCMDAwOSwgMHg0RTBCMDAwOSwKKzB4QUZGODAwMDksIDB4MjcxMDAwMDksIDB4MDAwMDA2NDAsIDB4MDAxQzAwMUMsCisweDAwMjAwOEVBLCAweDAwMDBCMzhFLCAweDAwMjAyOERDLCAweDAwMjAwREE2LAorMHgwMDIwMjhFOCwgMHgwMDIwMjkwMCwgMHgwMDIwMEM2QywgMHgwMDIwMEVBMiwKKzB4MDAyMDA5NDAsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAyODk0LCAweDAwMjAyODhDLCAweDAwMjAyN0YwLCAweDAwMjAwQjY4LAorMHgwMDIwMUY3NCwgMHgwMDIwMTczNCwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REVBMTdGQTQsIDB4NjFFMEUwMUMsIDB4N0QwMTZERTMsIDB4NjFEMDBGMTQsCisweEQ1OUZENDlFLCAweDQ1MEJFMDIwLCAweEUwMjAwRjE0LCAweEU3ODAwNEZDLAorMHg2MDRDNjZFMiwgMHg3RDdGNjc3QywgMHgxRjY5MzA3MCwgMHgyRDYyOEYxNywKKzB4MDFGQ0UwMUMsIDB4NjQxQ0U1MDAsIDB4RDc5N0RFOTYsIDB4MzI0MzYyNUQsCisweEEyMUE4QjAxLCAweDY1NUQwMDA5LCAweDMxRUM2MTUzLCAweEUwMjg2QzEwLAorMHg2RDUzMEZDNCwgMHgzRDdDNjJDRSwgMHhBRkVGMkQyMCwgMHgyMDA4NzUwMSwKKzB4RTAxQzhCMTUsIDB4RTUwMDAxRkMsIDB4RDc4QkRFOEEsIDB4NjQxQ0EwMEEsCisweDZDNTM2NTVELCAweDY2QzIzQ0VDLCAweDY2NjI2MjUzLCAweDIyNjIzMjdDLAorMHgxRjY5NzUwNCwgMHgzMjQzNjI1RCwgMHhBMUY2OEJGMiwgMHg4ODAxMkQxMCwKKzB4RTAxQzhCMTYsIDB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFN0QsCisweDhCMDEzMjczLCAweDAwMDlBMUU5LCAweDYyRTM2NDRELCAweDcyMDQ2RDQzLAorMHgzREVDNjE0MywgMHg2NUQyMzEyQywgMHg3NDA4NkMxMiwgMHgyNUMyQUZFRiwKKzB4OEIxODg4MDQsIDB4MDFGQ0UwMUMsIDB4MkQ0MEU0MDAsIDB4REU3MTY3MUMsCisweDMyNzM2MjRELCAweEExRDA4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2RDQzLAorMHg2NUQyM0RFQywgMHg2MTQzNzIwNCwgMHg2NjEyMzEyQywgMHg3NDA4NkM1MiwKKzB4QUZFRDJDNjksIDB4ODgwNTI1QzIsIDB4RTAxQzhCMTgsIDB4RTQwMDAxRkMsCisweDY3MUMyRDQwLCAweDYyNERERTYzLCAweDhCMDEzMjczLCAweDAwMDlBMUI1LAorMHg2QzQzNjQ0RCwgMHgzQ0VDNjJFMywgMHg3MjA0NjVDMiwgMHgzRDJDNkQ0MywKKzB4NjE1MjY2RDIsIDB4MjE2Qjc0MDgsIDB4MjUxMkFGRUQsIDB4OEIxMzg4MzAsCisweEUyMDBERTU4LCAweDY0RTIyRDIwLCAweDhCMDQyNDQ4LCAweDQyMEJEMjU3LAorMHhBMTlBMDAwOSwgMHg1NUUxMDAwOSwgMHg1N0UzNTZFMiwgMHhERDU0NUNFNCwKKzB4MkZDNjREMEIsIDB4N0YwNEExOTEsIDB4ODkwMTg4MjgsIDB4MDAwOUEwRUEsCisweEUxNDNERTRDLCAweDYyMkQ2MkUxLCAweDhGMDMzMjE3LCAweDU2RkIxRkVCLAorMHgyNjIxRTI0MCwgMHg4QjAxMzIxNywgMHgwMDA5QTBENSwgMHhFMTAxNUVGQiwKKzB4MzAxNjg1RTEsIDB4QTBDRThCMDEsIDB4RTQwMTAwMDksIDB4MkQ0MDU1RkIsCisweDY0NTFCMTc5LCAweEUxNDM1N0ZCLCAweEUwNTQ2MjcxLCAweDM1MTc2NTJELAorMHgwRjU2OEQ0MSwgMHgzNTYzRTY0MCwgMHhFNjAwOEIwNSwgMHgwRjY1RTAzNCwKKzB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsIDB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsCisweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLCAweEM5MDM2MDUzLCAweEUwMzQ2NjAzLAorMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywgMHg2NDFERTAzMCwgMHgwRjI1NjVGMywKKzB4MUY0RUIxRjEsIDB4MDRGREUwMzQsIDB4Njc0REUwMzAsIDB4NDcwODBDRkQsCisweDYwNzM2MUNELCAweDQxMDhEMjJCLCAweEUwMEYwQ0ZFLCAweDFGMUY0MjBCLAorMHgyQ0Q5NkQwNywgMHg1RUZCNjA3MywgMHg4NUUyMEZDNiwgMHg0MjBCNTFGRiwKKzB4MkMwQjYwMEQsIDB4NTRGRTYwNzMsIDB4QjFCQjBGQzYsIDB4RTA1NDY1RjMsCisweDY1MkQ2MkUxLCAweEU2NDAwRjU2LCAweDg5NjIzNTYzLCAweEUwNTBFMTAwLAorMHg2MDIzMEYxNSwgMHg0MDA4QzkwMywgMHg2RDAzNDAwMCwgMHhFMDQwNjEwMywKKzB4RTA0NDBGRDYsIDB4RDIxN0VFRkYsIDB4NkVFQzBGRjYsIDB4MEYyNkUwNTgsCisweDYwRTM0MjBCLCAweDQyMjE2MjUzLCAweDQyMjE0MjIxLCAweDY2MjM0MjIxLAorMHgzMjZDNDIwMCwgMHg0NTIxNDIwMCwgMHhFMDQ4NjcwNywgMHgwRjc2NDUyMSwKKzB4QzkwMzYwNTMsIDB4NDAwODVDRkIsIDB4N0MwNjMwRkMsIDB4NkUwMzZEMkQsCisweDFGRDUxRkM2LCAweDFGMDRBMDJFLCAweDAwMTE3RDAwLCAweDAwMjAyOTA0LAorMHgwMDIwMERBNiwgMHgwMDExN0QwNCwgMHgwMDExN0Q4NCwgMHgwMDIwMDcwMCwKKzB4MDAyMDA3NEMsIDB4MDAyMDFGRDQsIDB4MEZENkUwNEMsIDB4MDVGRUUwNDQsCisweDY0RDNCMTg5LCAweDY0RTJFMDQ4LCAweEUwNDAwNkZFLCAweDJFNDIyNDY5LAorMHgwMUZFNjdDNCwgMHg2NjdDRTA1OCwgMHg0MjBCMDJGRSwgMHgyNDBCNjA2MywKKzB4MDVGRUUwNDQsIDB4QjE1RDJFNDIsIDB4RTA1MDY0RDMsIDB4N0QwMTAxRkQsCisweDBGMTU3MTAxLCAweDAyRkRFMDUwLCAweDMyNjJFNjA2LCAweDU2RkI4QkRDLAorMHg1NUZCNjI2MSwgMHg4NTUxNDIwMCwgMHgzMDJDNzUwQywgMHg2MTAzNzAxQiwKKzB4NjRGM0U2MDAsIDB4RTcwNEEwMDQsIDB4NzYwMTYyNTYsIDB4NzQwNDI0MjIsCisweDMyNzM2MjZELCAweDY1RjM4QkY4LCAweDY0MURCMTNDLCAweEIwRDI1NkZCLAorMHhBMEFBNjQ2MSwgMHhENDg4MDAwOSwgMHhFMjAxRDU4OCwgMHgyRDIwNDUwQiwKKzB4MDAwOUEwQTMsIDB4OEIwNzg4MjksIDB4RTIwMERFODUsIDB4NjZFMjJEMjAsCisweDY0NkRCMEExLCAweDAwMDlBMDk5LCAweDYyMkNFMjgxLCAweDhCM0QzMDIwLAorMHhENjgwRTczOCwgMHhFMDQ0MkQ3MCwgMHhFMDQ4MEM2RSwgMHg2RTYyMURDMSwKKzB4NTE2MTFERTIsIDB4NTQ2MjFEMTMsIDB4NTU2NTFENDQsIDB4NTc2MzFENTUsCisweDVDNjYxRDc2LCAweDBFNkUxREM3LCAweDFERThFMDQwLCAweEUwNTAwMTZFLAorMHg1NDY0MUQxOSwgMHgwNTZFMUQ0QSwgMHgxRDVCRTA0QywgMHhFMDU0MDc2RSwKKzB4MEM2RTFEN0MsIDB4MURDREUwNTgsIDB4RTA0NDAyNkUsIDB4RUQwMDFEMkUsCisweEUwNDgwNkQ2LCAweDE2RDEyNkQyLCAweDE2RDUxNkQyLCAweDE2RDYxNkQzLAorMHhFMDQwMDZENiwgMHhFMDUwMDZENiwgMHgwNkQ2MTZENCwgMHgwNkQ2RTA0QywKKzB4MDZENkUwNTQsIDB4MDZENkUwNTgsIDB4MUYyOUEwNTcsIDB4NjIyQ0UyODIsCisweDg5MzEzMDIwLCAweDA1RkNFMDIwLCAweDYyNUNFNjgzLCAweDMyNjA2NjZDLAorMHhENjVEOEIwNywgMHgyNjUwRTUwMCwgMHg1MjYxNzY4MCwgMHhBMDQ0RDY1QiwKKzB4RTY5MDI2MjIsIDB4MzI2MDY2NkMsIDB4RDI1NzhCMTYsIDB4RTUwMEQ2NTgsCisweDYwNjIyMjUwLCAweENCMjBEMjU3LCAweEU2MDUyNjAyLCAweEQ2NTYyMjYyLAorMHgyMjUyNDYwQiwgMHg0MjBCRDI1NSwgMHhEMjU1MDAwOSwgMHgyMjYyRTYwMSwKKzB4NDYxOEQyNTQsIDB4MjI2MkEwMjksIDB4RDI1NEQ0NTMsIDB4RDQ1NDY1NDIsCisweDAwMDk0MjBCLCAweDAwMDlBMDIxLCAweEU1MjRENjQ3LCAweEQ1NDUyNjUwLAorMHgxNjIxNTI1NywgMHgxNjIyNTI1OCwgMHgxNjIzNTI1OSwgMHgxNjI0NTI1QSwKKzB4MTYyNTUyNUIsIDB4MTYyNjUyNUMsIDB4MTYyNzUyNUQsIDB4MTYyODUyNUUsCisweDFGMjk1MjVGLCAweEUyMDAxNjI5LCAweDE1MjgxNTI3LCAweDE1MkExNTI5LAorMHgxNTJDMTUyQiwgMHgxNTJFMTUyRCwgMHg3RjVDMTUyRiwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NEYyMjZDRjYsIDB4RTI0MDYxNEQsIDB4ODkxNzMxMjMsCisweDMxMjdFMjFGLCAweEQ0M0I4OTA4LCAweEUwMDFENTNCLCAweDY2NDI0NTBCLAorMHgyNjc5NjcwNywgMHgyNDYyQTAwQywgMHgzMTI3RTIzRiwgMHhENzM1ODkwOCwKKzB4NzFFMEQ2MzUsIDB4NDYwQkUwMDEsIDB4NjIwNzU1NzEsIDB4MTc1MTI1MjksCisweDAwMEI0RjI2LCAweDRGMjIwMDA5LCAweEUyNDA2MTRELCAweDg5MTUzMTIzLAorMHgzMTI3RTIxRiwgMHhENDJCODkwNywgMHg2NjQyRDIyQiwgMHhFMDAxNDIwQiwKKzB4QTAwQjI2MEIsIDB4RTIzRjI0NjIsIDB4ODkwNzMxMjcsIDB4RDYyNkQ3MjUsCisweDcxRTA1NTcxLCAweEUwMDE0NjBCLCAweDE3NTEyNTBCLCAweDAwMEI0RjI2LAorMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwgMHg2MjUyRDUyMCwgMHg4OUZDMjI2OCwKKzB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsIDB4RDUxQzQ2MjgsIDB4MjI2ODYyNTIsCisweDAwMEI4OUZDLCAweEEwMDEwMDA5LCAweDcyMDFFMjAwLCAweDhCRkMzMjQyLAorMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwgMHhENTE1NDYyOCwgMHgyMjY4NjI1MiwKKzB4MDAwQjhCRkMsIDB4MDAwMDAwMDksIDB4MDAyMDI5MDgsIDB4MDAyMDBEQTYsCisweDAwMTE3RDA0LCAweDAwMjAyN0Y4LCAweDAwMTE3RDgwLCAweDAwMjAyODhDLAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMEVBMiwgMHgwMDIwMDk0MCwKKzB4MDAxRTIxMkMsIDB4MDAxQzNEMjgsIDB4MDAxMTdEMDAsIDB4MDAyMDBFMDYsCisweDAwMjAyOTIwLCAweDAwMUMzNzA0LCAweDAwMjAxRkQ0LCAweDAwMUMzNzNDLAorMHgwMDFDMzcwMCwgMHg0RjIyMkZFNiwgMHg2RTUzN0ZGQywgMHgyRjQyQkZDQSwKKzB4RDYxNTYxRTIsIDB4MTYxNUUyODAsIDB4NDIxODU0RTEsIDB4NTVFMjE2NDYsCisweDE2NTc0MjI4LCAweDZFRjI1N0UzLCAweDJFMkIxNjc4LCAweDdGMDQyNkUyLAorMHhBRkE3NEYyNiwgMHgyRkM2NkVGNiwgMHgyRkU2MkZENiwgMHhERDBBNEYyMiwKKzB4QkZBRjZDNTMsIDB4QkY5NDZFNDMsIDB4QkZBQjJERTIsIDB4NTFENTAwMDksCisweDU0RDYyQzEyLCAweDU1RDcxQzQxLCAweDU2RDgxQzUyLCAweDRGMjYxQzYzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgwMDFDMzcwQywgMHgwMDA5QTBDMCwKKzB4RDE3QjRGMjIsIDB4RDQ3QjkyQjYsIDB4MjEyMkIwMEQsIDB4OTdCMkU2MDUsCisweEIwMjI5NUIyLCAweEIwMzY2NDYzLCAweEIwMzYwMDA5LCAweEIwMzkwMDA5LAorMHhBMDY4MDAwOSwgMHg0RjEyNEYyNiwgMHhEMTczNEYwMiwgMHg5NEE0MzE0NSwKKzB4NDYwOTA2MEEsIDB4NDYwOTQ2MDksIDB4MDAyOTM2NDYsIDB4RDc2Q0Q1NkYsCisweDI1MDBDQTAxLCAweDRGMDYyNzYyLCAweDRGMTYwMDBCLCAweEJGRUE0RjIyLAorMHhCMDFGMDAwOSwgMHhBMDRFMDAwOSwgMHgyRkU2NEYyNiwgMHg2RTYzRDE2OCwKKzB4NDQxODY2MTIsIDB4NDUyODkyOEEsIDB4MjYyOTQ0MDgsIDB4NDQwODQ1MDAsCisweDQ0MDAyNjVCLCAweDQ3MDgyNjRCLCAweDQ3MDgyMTYyLCAweDI3RUJEMTYxLAorMHgwMDBCMjE3MiwgMHgwMDBCNkVGNiwgMHhEMjVGMDAwOSwgMHhFNDBBOTY3NywKKzB4MjI2MkFGQjQsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REM1QjRGMjIsCisweDJDMjJFMjAxLCAweEJGQTlFNDBBLCAweDYwQzI3QzQ0LCAweENCMDFFRDAwLAorMHg2MEMyMkMwMiwgMHhDOTAxRUI2NCwgMHg2RTAzQTAwOCwgMHg4OTA3M0RCMiwKKzB4RTQwMTYwQzIsIDB4QkY5OUM5MDEsIDB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsCisweDhCMDMzREIyLCAweEQyNEZENDRFLCAweDAwMDk0MjBCLCAweDRGMjZFNDBBLAorMHg2REY2NkVGNiwgMHhBRjg5NkNGNiwgMHg0NDExNkJGNiwgMHg2MDRCOEYwMSwKKzB4MDAwQjYwNDMsIDB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERDNDU3RkZDLCAweDYwQzJFRDAwLCAweENCMDJFQjY0LCAweDYwQzIyQzAyLAorMHhDOTAyMkYwMiwgMHg2RTAzQTAwOSwgMHg4OTA4M0RCMywgMHhFNDY0NjBDMiwKKzB4QzkwMjJGMDIsIDB4NkUwM0JGNkEsIDB4MkVFODdEMDEsIDB4RDczQjhCRjQsCisweDYxNzI1MUMxLCAweERFM0JEQzNBLCAweEQyM0NEMTNCLCAweDY0QzIzREIzLAorMHg2NTEyNjRFMiwgMHg2NTIyOEYwOSwgMHhEMjMyRDQzOSwgMHg0RjI2N0YwNCwKKzB4NkRGNjZFRjYsIDB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDU2NTFENTMyLCAweDQ2Mjg2MDUyLAorMHgzMDZDMDAwQiwgMHg1Mjg4MDk2QywgMHgwOUI0NUJCNCwgMHgwM0M0MUZGRiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsIDB4QkZFQjRGMDIsCisweDZCMDM2RTQzLCAweEREMThEQzI4LCAweDAwMDlCRkU2LCAweDNDMDUzMEI4LAorMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwgMHg0MjA5NDIwOSwKKzB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweDJGRTY2QkY2LCAweERFMUM0RjIyLCAweEU1MDBFMTAyLAorMHgyRTEyRTQwMywgMHgyRTUyQkZENCwgMHg0NjE4RTYwNiwgMHhFNDAzRTcwMCwKKzB4MkU3MjJFNjIsIDB4QUZDQjRGMjYsIDB4MDAwQjZFRjYsIDB4MDAwMDAwMDksCisweDAwMjAyODkwLCAweDAwMjRDREUwLCAweDEwNjI0REQzLCAweDAwMjAyQThDLAorMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgwNCwgMHgwMDFDNTgxQywKKzB4MDAyMDI5MzQsIDB4MDAyMDBEQTYsIDB4MDAxQzU4NjAsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMjk0QywgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwgMHgwMDFENDAwNCwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEU0MDA3RkU0LCAweDQ1MjhFNTEwLCAweDY3NDM2QzQzLCAweEUxMDdBMDBGLAorMHg2MDQzNjQ0RCwgMHgwRjU2NDAwOCwgMHhFRTAwNjBDMywgMHg4MTUxMjVDMSwKKzB4ODE1MzgxNTIsIDB4MTU3MzE1RTIsIDB4NzUxNDE1RTQsIDB4NjI0RDc0MDEsCisweDhCRUQzMjEzLCAweERBNkY1MUYxLCAweDFBMTE1NEYyLCAweEQxNkUyQTEyLAorMHg1N0Y0NTVGMywgMHg2REYyNThGNSwgMHgxMTQxRDk2QywgMHgxMTUzMjE0MiwKKzB4MTE3NTExNTIsIDB4MTE4NzExNzQsIDB4NTJGNjExODYsIDB4MTlEMUQ2NjgsCisweEQ4NjgyOUQyLCAweERBNjhFOTUwLCAweDE2MjFFQkI0LCAweDZCQkMyNjIyLAorMHhBMDIxNDkwOCwgMHg2RUVERUUwMCwgMHg2MUUzNkRFMywgMHg0MTA4NEQwOCwKKzB4MzFFQzNERUMsIDB4NDEwODREMDgsIDB4NjBDMzNEOEMsIDB4RTc5MDQxMDgsCisweDgxRDEyREMxLCAweDQxMDg2MDkzLCAweDgxRDI2NzdDLCAweDMxQUM2MEMzLAorMHgzNDcyRTIwMCwgMHgxREQyODFEMywgMHhENDU1MUQxMywgMHgxRDI0OEQwMSwKKzB4QjAzQUQ0NTAsIDB4N0UwMTY1RDMsIDB4MzRCMjY0RUQsIDB4RDE0RDhCREIsCisweDY1MTJEQjUyLCAweDQ1MjlEMjRELCAweDY0MTIxQjUxLCAweDY3NEREMTRBLAorMHg2NzIyMkI3MiwgMHg0NzI5RDY0RSwgMHg2OTIyMUI3MywgMHg2ODlEMkZEMiwKKzB4NjkxMjFCODIsIDB4NUExMjI2OTIsIDB4NUIxNDE2QTIsIDB4MTZCNERBNDQsCisweDE2QzY1QzE2LCAweDE2RUE2RUEyLCAweDRGMjY3RjFDLCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHg2MDYxNjY0MiwKKzB4OEQwNEM4MDMsIDB4NjA2MUU1MDAsIDB4ODgwMkM5MDMsIDB4NTI2MjhCMDMsCisweDUxMjQ2NTYzLCAweDAwMEIyNDEyLCAweDJGRDY2MDUzLCAweDRGMjIyRkU2LAorMHg2RTUzN0ZFQywgMHhFNTUwNjI1MywgMHhFNDAwNkQ0MywgMHhBMDAxNDUwOCwKKzB4NTIyNEUxMDEsIDB4MjIxMTYwNDMsIDB4ODEyMzgxMjEsIDB4ODEyMjYwNTMsCisweDM2MjA1NkUyLCAweEQyMkY4QkY1LCAweDY0RjMxNkU0LCAweDQyMEJFNjE0LAorMHg2NUUxNjVFMywgMHgyNTQ5RTRGQywgMHg2MUYxMkU1MSwgMHgyMTQ5NjVGMywKKzB4NTREMTJGMTEsIDB4NDEwQkQxMjcsIDB4NTdEMUU2MTQsIDB4Q0IwMTYwNzEsCisweDFERTEyNzAxLCAweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZFQywgMHhFNUZDNjY1MywgMHg2MDYxNkQ0MywKKzB4Q0IwMTIwNTksIDB4NTJFMjI2MDEsIDB4OEIwNjMyNjAsIDB4NTFFMjEyRTQsCisweDhCMDQzMUUwLCAweEEwMDI1MkQxLCAweEFGRjAxRTIyLCAweEQyMTU1NjY0LAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFMUZDNjdFMSwgMHgyRTcxMjcxOSwKKzB4NTREMTY3RjEsIDB4RDEwRjI3MTksIDB4RTYxNDY1RjMsIDB4MkY3MTQxMEIsCisweDYwMjE1MkQxLCAweDIyMDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgwMDIwMjg1QywgMHgwMDIwMjg2NCwgMHgwMDIwMjg1NCwKKzB4MDAyMDI4ODQsIDB4MDAxMDAwOEMsIDB4MDAxMDBFQzAsIDB4MDAxRTIxMDgsCisweDAwMUMzRDAwLCAweDAwMjAyMTM0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhENjMxNEYyMiwgMHg2MEQzNkQ2MiwgMHg4OTREQzgwMywgMHhEQjMwREMyRiwKKzB4MDAwOUEwMkMsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsIDB4RDIyREQ0MkIsCisweDAwMDk0MjBCLCAweDY1MDM1NjAzLCAweEM4MjA4NTYxLCAweEUwNTA4OTAzLAorMHg3MjAxMDJCRSwgMHg4NTYyMEIyNiwgMHg0MDAwNjAwRCwgMHg0MDAwMzY2QSwKKzB4NDAwMDQ2MjQsIDB4MjA2RDQ2MjQsIDB4RDQyM0M5MDMsIDB4NDAwODZFMDMsCisweEQxMjI0MDAwLCAweDM0MEM0MTBCLCAweDYxRTNENTIxLCAweEQ3MjFFMDAxLAorMHg0NTBCRDIyMSwgMHg2NEUzN0UzMCwgMHgyNzAyNDIwQiwgMHg2NkMyNTJDMSwKKzB4OEJDRjM2MjAsIDB4NEUxOEVFMDEsIDB4QTAxMURCMUMsIDB4NjA2MUVDNzUsCisweDg4MDFDOTAzLCAweEQ0MTk4OTEwLCAweDQ2MEJENjEyLCAweEQ0MTgwMDA5LAorMHg0NzBCRDcxOCwgMHhEMjEzNjUwMywgMHg2NEMzRDExMywgMHgyMkUyNDEwQiwKKzB4NjZCMjUyQjEsIDB4OEJFQTM2MjAsIDB4QzgwNDYwRDMsIDB4RDIxMjg5MDYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwgMHgwMDIwMjg1QywKKzB4MDAyMDI3RjgsIDB4MDAyMDBBNUMsIDB4MDAyMDI4NjQsIDB4MDAyMDBBREUsCisweDAwMjAxRkQ0LCAweDAwMUMzRDMwLCAweDAwMjAwRDZDLCAweDAwMjAyODU0LAorMHgwMDIwMjg4NCwgMHgwMDIwMEE3QSwgMHgwMDIwMDBGOCwgMHhFNjAxRDIzNywKKzB4MTI2NUQ1MzcsIDB4MDAwQjIyNTIsIDB4RDYzNjEyNjYsIDB4ODgwMTYwNjIsCisweEUxMDE4QjYyLCAweEQ1MzQyNjEyLCAweDU0NTFEMTM0LCAweEUwNDA2MjEyLAorMHgyMTIyMzI0QywgMHg1NDExNTc1MiwgMHgxMTQxMzQ3QywgMHg1NzEyNTQ1MywKKzB4MTE3MjM3NEMsIDB4NTIxMzU3NTUsIDB4MTEyMzMyN0MsIDB4NTYxNDY0NTIsCisweDExNjQzNjRDLCAweDU0MTU1NzU0LCAweDExNDUzNDdDLCAweDU2MTY1NDU4LAorMHgxMTY2MzY0QywgMHg2NzYyRDYyNiwgMHgzMjdDNTIxNywgMHg1NzYxMTEyNywKKzB4MzI3QzUyMTgsIDB4NTc2MjExMjgsIDB4MzI3QzUyMTksIDB4NTc2MzExMjksCisweDM0N0M1NDFBLCAweDU3NjQxMTRBLCAweDM0N0M1NDFCLCAweDU3NjUxMTRCLAorMHgzNDdDNTQxQywgMHg1MjY2MTE0QywgMHgzNzJDNTcxRCwgMHg1MjY3MTE3RCwKKzB4MzQyQzU0MUUsIDB4NTI2ODExNEUsIDB4MzYyQzU2MUYsIDB4RDYxNTExNkYsCisweDA0MUU2MjYyLCAweDM0MkM3Njk0LCAweEUwNDQwMTQ2LCAweDA2MUU2MjYyLAorMHgwMTY2MzYyQywgMHg1MjVDRTA0OCwgMHhENjBGMDUxRSwgMHgwMTU2MzUyQywKKzB4RTA1NDYyNjIsIDB4NDIyOTA1MUUsIDB4MDE1NjM1MkMsIDB4RTA1ODU1NjEsCisweDQ1MjkwNjFFLCAweDAxNjYzNjVDLCAweDAwMDkwMDBCLCAweDAwMUMxMDEwLAorMHgwMDAwQzM0RiwgMHgwMDFDMTAyOCwgMHgwMDFDMzY5QywgMHgwMDIwMjdGOCwKKzB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsIDB4RDYyRjdGRkMsCisweDI2NDI2NDRDLCAweEM4MjA1MDY2LCAweDJGMDI4REZDLCAweDdGMDQwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwKKzB4N0UwMTY0RDQsIDB4NjQ0Q0JGRUEsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweEEwMDE2Q0Y2LCAweDc2MDE2NjQzLCAweDIyMjg2MjYwLAorMHgzNjQ4OEJGQiwgMHg2NTYzQUZFNCwgMHgyRkI2MkY5NiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4RUMxQ0VEMDgsIDB4REIxOTZFNTMsIDB4NjFDM0U5MEEsCisweDYwNDM0QjBCLCAweDMwOTJDOTBGLCAweDY2MDM4RDAyLCAweDc2MzBBMDAxLAorMHg0RDEwNzYzNywgMHg3RTAxMkU2MCwgMHg3Q0ZDOEZGMSwgMHg4MDU4RTAwMCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4MDAwQjY5RjYsCisweDAwMEJFMDAwLCAweDJGRTZFMDAwLCAweDdGRUM0RjIyLCAweDZFNDM2MjUzLAorMHhCRkQxNjVGMywgMHhCRkM2NjQyMywgMHhCRkM0NjRFMywgMHhENDA1NjRGMywKKzB4MDAwOUJGQzEsIDB4NEYyNjdGMTQsIDB4NkVGNjAwMEIsIDB4MDAxQzAwMDQsCisweDAwMjAyMDk0LCAweDAwMjAyOTY4LCAweEUxMTBENTlDLCAweEU2NDA2MDUwLAorMHgyNTAwQzlGRCwgMHhFMEZGNzVFOSwgMHg4MDUxNjQ1MywgMHg4MDUzODA1MiwKKzB4ODA1NjgwNTUsIDB4MjUxMDc1RUYsIDB4RTFFRjYyNTAsIDB4MjIxOUUwMDEsCisweEU3MjAyNTIwLCAweDI0NjA4MDUyLCAweDI1NzAwMDBCLCAweEU0RkRENTkwLAorMHhFNzAyNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwKKzB4RDE4QzY2NTIsIDB4MjU2MjI2NDksIDB4OTJDMjYwMTIsIDB4MjEwMkNCMDgsCisweEM5Q0Y2MDEyLCAweDYwMTIyMTAyLCAweDIxMDJDQjAzLCAweDAwMEIxMTcyLAorMHg0RjIyMTEyMywgMHhFMTAwRDQ4NCwgMHhEMjg1RDc4NCwgMHhENTg1MjQxMCwKKzB4MjcxMUQ0ODUsIDB4MjIxMUU3MDAsIDB4QkZCRDI1MTEsIDB4RDU4MzI0NzEsCisweDI1NjBFNjAwLCAweDRGMjZBRkQyLCAweEQyODE2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjdENjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyNzksCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjc1LAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjcwNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2QzY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI2OCwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNjQsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2NUY2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY1QSwgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4RDE1NjY0NEMsCisweDM0MUM3NEZGLCAweDAwMEI2MjQwLCAweEQxNTQ2MDJDLCAweDM0MUM2NDRDLAorMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywgMHg2NTVDNEYyMiwgMHgzNTY3RTYwQSwKKzB4NkU0MzhEMTUsIDB4NjQ1M0JGRUEsIDB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsCisweEEwMDJFMDBGLCAweDQ0MDkyNDA5LCAweDYyNEM0NDA5LCAweDMyNjNFNjBBLAorMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywgMHhDODgwNjAyMywgMHhFMjAwOEIwMCwKKzB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsIDB4RDY0MTRGMjIsIDB4ODgwMTYwNjIsCisweEIyMjI4QjAzLCAweEEwMDMwMDA5LCAweEQyM0UwMDA5LCAweDIyNjBFNjQwLAorMHhFMjAwRDYzRCwgMHgwMDBCNEYyNiwgMHg0RjIyMjYyMiwgMHg2MDYyRDYzOCwKKzB4OEIwMTg4MDIsIDB4MDAwOUIyNkMsIDB4RTIwMEQ2MzcsIDB4MDAwQjRGMjYsCisweDBGRkYyNjIyLCAweEQ0MzNENTMyLCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLAorMHhEMjMwMjQ3MCwgMHgwMDBCRTYwNCwgMHhENTIwMjI2MCwgMHg2MTUwRTRGRCwKKzB4MjE0OUQ2MkUsIDB4MjUxMEU3MDAsIDB4MjY3MDAwMEIsIDB4RTRGQkQ1MUIsCisweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEU0RjdENTE4LCAweDIyNDk2MjUwLAorMHgyNTIwMDAwQiwgMHhEMjI2NEYyMiwgMHg2MDBEODUyMiwgMHg4OTExMjAwOCwKKzB4ODkxMzg4MDEsIDB4ODkxNTg4MDMsIDB4ODkxNzg4MDUsIDB4ODk0MTg4MDYsCisweDg5NDc4ODA4LCAweDg5NEQ4ODA5LCAweDg5NTM4ODBBLCAweDg5NTk4ODBCLAorMHgwMDA5QTA2MCwgMHgwMDA5QjA2MiwgMHg2MDBDQTA1RCwgMHgwMDA5QjA3MCwKKzB4NjAwQ0EwNTksIDB4MDAwOUIwN0EsIDB4NjAwQ0EwNTUsIDB4NjI2MEQ2MDYsCisweDhCNEYyMjI4LCAweDAwMDlCMDg2LCAweDYwMENBMDRELCAweDAwMUUxMDI4LAorMHgwMDFFMjE0OCwgMHgwMDFFMTEwOCwgMHgwMDIwMjhEOSwgMHgwMDIwMjhDOCwKKzB4MDAyMDI4Q0EsIDB4MDAyMDI4Q0MsIDB4MDAyMDI4QUMsIDB4MDAxRTEwMDgsCisweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDMwLCAweDAwMUUxMDkwLAorMHgwMDIwMjhENCwgMHgwMDFFMTAwQiwgMHgwMDIwMjhEMCwgMHgwMDIwMjhEOCwKKzB4MDAyMDI4QTAsIDB4NjI2MEQ2ODcsIDB4OEIyMzIyMjgsIDB4MDAwOUIwNkEsCisweDYwMENBMDIxLCAweDYyNjBENjgzLCAweDhCMUIyMjI4LCAweDAwMDlCMEI0LAorMHg2MDBDQTAxOSwgMHg2MjYwRDY3RiwgMHg4QjEzMjIyOCwgMHgwMDA5QjBCQSwKKzB4NjAwQ0EwMTEsIDB4NjI2MEQ2N0IsIDB4OEIwQjIyMjgsIDB4MDAwOUIxMUUsCisweDYwMENBMDA5LCAweDYyNjBENjc3LCAweDhCMDMyMjI4LCAweDAwMDlCMTM2LAorMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwgMHhEMjczRDE3MiwKKzB4RDU3Mzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc3MjAxMkQsIDB4NjExQ0U0MDMsCisweEQ2NzFFMjBGLCAweDI3MTIyNTQwLCAweEUwMDEyNTIwLCAweDI2MDIwMDBCLAorMHhFNjAxRDI2OSwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNiwgMHhFMDAwRDI2NywKKzB4ODEyMkQ2NjksIDB4MjYwMkUwMDEsIDB4MDAwOTAwMEIsIDB4ODUyM0QyNjIsCisweDIwMDg2MDBELCAweDg4MDE4OTA1LCAweEQ2NjQ4QjBBLCAweENCMDE2MDYwLAorMHhENjYxMjYwMCwgMHhFMTAxRDQ1RCwgMHgyNjEyRTAwMSwgMHg4MTQyMDAwQiwKKzB4RTAwMDAwMEIsIDB4RTUwMUQxNTgsIDB4NDUxODg1MTMsIDB4MzQ1MzY0MEQsCisweDhEMDU2NjAzLCAweEQyNUFFMDAwLCAweEUwMDFENTU3LCAweDI1MDIyMjYwLAorMHgwMDA5MDAwQiwgMHhEMTUwNEYyMiwgMHg2NTBEODUxMywgMHg0NDE5NjQ1MywKKzB4NjcyRTYyNDksIDB4NjAyQzIyN0QsIDB4ODkwOTg4MDEsIDB4ODkwQzg4MDIsCisweDg5MTA4ODAzLCAweDg5MjY4ODA2LCAweDg5Mjk4ODA3LCAweDAwMDlBMDM4LAorMHhENjRERDU0QywgMHhBMDI3RTIxMiwgMHg2MjVDMjY1MiwgMHg4QjJGMjIyOCwKKzB4QTAxRUQ2NEEsIDB4NjA1QzYyNjIsIDB4ODkwNTIwMDgsIDB4ODkwODg4MTAsCisweDg5MEI4ODIwLCAweDAwMDlBMDI0LCAweEQ2NDNENDQ1LCAweEEwMTNFMjA0LAorMHhENzQ0MjY0MiwgMHhFMjBDRDY0MCwgMHgyNjcyQTAwRSwgMHhENjNFRDU0MiwKKzB4QTAwOUUyMTgsIDB4RDQ0MTI2NTIsIDB4RTIwQUQ2M0IsIDB4MjY0MkEwMDQsCisweEQ2MzlEMjNGLCAweEUyMkUyNjIyLCAweEQ0M0U4NTE1LCAweDMyNzc2NzBELAorMHg4RjAxMjQyMSwgMHgyNDUxNjUwMywgMHgwMDA5QjBERiwgMHhFMDAxQTAwMSwKKzB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RTEwMUQ2MjksIDB4MjYxMEQ0MzYsCisweEQ3Mjg2NTQxLCAweDY1NUREMTI4LCAweEUwMDFFMjBGLCAweDI2MjAyNzUyLAorMHgyMTAyMDAwQiwgMHg0RjIyMkZFNiwgMHg4NTIzRDIxRiwgMHgyNDQ4NjQwQywKKzB4RDYyRDhCMDgsIDB4RTIwMEQ1MjEsIDB4ODQ1MTI2MjEsIDB4MjA0OTk0MzAsCisweDgwNTFBMDI2LCAweDYwRTBERTFELCAweDhEMEJDODQwLCAweDM0MjdFMjAxLAorMHhEMTI1ODkyMiwgMHg0MjBCRDIyNSwgMHhENTI1MjE0MSwgMHhDQjA0NjA1MiwKKzB4MjUwMkEwMEIsIDB4ODkxNzM0MjcsIDB4RDcyMkQyMUYsIDB4MjI0MTQ3MEIsCisweEU1RkJENjFGLCAweDIxNTk2MTYyLCAweDg0RTEyNjEyLCAweEIxMkRDQjgwLAorMHg2MEUwODBFMSwgMHhDQjA0RDYxQywgMHg2MDYwMkUwMCwgMHgyNjAwQzkzRiwKKzB4RTAwMUQ2MDksIDB4MjYwMkEwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsCisweDAwMDBGRjdGLCAweDAwMjAyOEQ5LCAweDAwMjAyOEEwLCAweDAwMjAyOEFDLAorMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMjhEMCwgMHgwMDFFMTAwMCwKKzB4MDAxRTEwMDEsIDB4MDAyMDJBOTAsIDB4MDAyMDI4QjQsIDB4MDAyMDI4QkMsCisweDAwMjAyQUZFLCAweDAwMjAyQjAyLCAweDAwMjAyQjBFLCAweDAwMjAyQjI2LAorMHgwMDIwMkIzMCwgMHgwMDIwMjhCOCwgMHgwMDIwMjhDNiwgMHgwMDIwMUEzMiwKKzB4MDAxRTExMDgsIDB4MDAyMDFCM0UsIDB4MDAxRTEwMTUsIDB4NjA2MEQ2OTYsCisweDg5MTlDODgwLCAweDYwMjFEMjk1LCAweDhCMTU4ODAxLCAweEU1MDFEMjk0LAorMHgzMDU2ODUyNCwgMHhEMTkzODkxMCwgMHhENDkzRTIwMywgMHg2NTQxMjEyMCwKKzB4NjU1REUwMEIsIDB4RDU5MTA2NTYsIDB4RTcwMkU0MEYsIDB4MjU3MTIxNDAsCisweEUwMDFENzhGLCAweDI3MDIwMDBCLCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg4NEUxREU4QywgMHg4OTM0Qzg4MCwgMHg4NTU0RDU4NSwgMHg4RjMwMjAwOCwKKzB4RDc4OTYxMDMsIDB4NjY3Mjg1NTMsIDB4NjUwQzY0MDMsIDB4NjIwQzg1NjYsCisweDhCMjYzNTIwLCAweEQ3ODBENjg1LCAweDY0NEM2NTFDLCAweDI3NDEyNjUxLAorMHhDODQwNjBFMCwgMHhEMjgyODkwNywgMHgwMDA5NDIwQiwgMHg2MDYyRDY4MSwKKzB4QTAwOENCMDQsIDB4RDE4MDI2MDIsIDB4MDAwOTQxMEIsIDB4RTVGQkQ2N0QsCisweDI0NTk2NDYyLCAweEIwQTEyNjQyLCAweEQ1NzUwMDA5LCAweDI1MjJFMjAxLAorMHhENzdBNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA3MCwgMHhBMDAxMjcwMCwKKzB4RTAwMDYwMjMsIDB4MDAwQjRGMjYsIDB4MkZBNjZFRjYsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEUyNDBEQTY5LCAweERDNjY2NkExLCAweDMxMjM2MTZELAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2Q0Q0NkIsIDB4RTcwMEEwMEYsIDB4NzcwMTY2QjIsIDB4NzEwMjYxNjMsCisweDY1NjEyQjEyLCAweDcxMDI2NjEzLCAweDYyNjEyQjEyLCAweDYyMkQ2NTVELAorMHgzMjVDNDIyOCwgMHg2MjdDMjQyMiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4RUQwNzZFQjIsIDB4NzEwMjYxRTMsIDB4NjcxMzJCMTIsCisweDYyRTE3MTAyLCAweDY1NzEyQjEyLCAweDY1NUQ2MjJELCAweDM1MkM0NTI4LAorMHhBMDBDMkNEMCwgMHg4ODAyMjQ1MiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4Njc3RDY3NjEsIDB4RUIwRjI0NzIsCisweDZEQTEyQ0IwLCAweDhCMDUyREQ4LCAweEQ0NDVEMjRGLCAweEUxMDFFRTAwLAorMHgyNDEyMjJFMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREM0QsIDB4NjE2RDY2RDEsIDB4ODkwMDMxMjMsCisweDY3MkM2MjYzLCAweERFNDMzNjc4LCAweDJENjE3NzAzLCAweEQ2NDA0NzIxLAorMHg0NzIxNjRFMiwgMHhFMTAwQTAwRSwgMHg3MTAxNjU2MiwgMHgyNDUwNjI1MywKKzB4NDIxOTc0MDEsIDB4NzQwMTI0MjAsIDB4MjQ1MDQ1MjksIDB4NDUxOTc0MDEsCisweDc0MDEyNDUwLCAweDMyNzM2MjFDLCAweDQyMDA4QkVFLCAweDY0RDE2NkUyLAorMHgzNjJDNDIwMCwgMHg4RjA2MjQ0OCwgMHhERDMzMkU2MiwgMHhFNTAwREUyOCwKKzB4MkQ1MkU3MDEsIDB4NkVGNjJFNzIsIDB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsCisweEVFMDE0RjIyLCAweEVEMEFBMDA1LCAweDY0RTNCQ0I2LCAweDY0RTNCQ0JDLAorMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhFRTAxQTAwNSwgMHg2NEUzQkNCRCwKKzB4NjRFM0JDQzMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweDYwNjBENjFGLAorMHg4OTc1ODgwMSwgMHhFMTAxRDQxRSwgMHhENzEyODU0OCwgMHg2NTBEMjYxMCwKKzB4NDUxOTYwNzAsIDB4NjY1OUREMUIsIDB4NjFEMzYyNkUsIDB4Qzg0MDI2MkQsCisweDc0MDI3MTAyLCAweDhENDdENzE4LCAweEQyMTg2NjZDLCAweEU1MDFERTBBLAorMHhBMDMxMkUyMiwgMHgwMDAwRUUwNCwgMHgwMDFFMTAwMSwgMHgwMDIwMjhDNiwKKzB4MDAyMDI4QTAsIDB4MDAxRTExMDAsIDB4MDAyMDI4Q0EsIDB4MDAyMDI4QjgsCisweDAwMjAyOEQwLCAweDAwMUUxMDAwLCAweDAwMjAyOEJDLCAweDAwMjAyOEM4LAorMHgwMDIwMUEzMiwgMHgwMDFFMTEwOCwgMHgwMDIwMUIzRSwgMHgwMDFFMTAxNSwKKzB4MDAxRTEwMEMsIDB4MDAyMDI4QjQsIDB4MDAyMDI4RDQsIDB4MDAyMDI4RDgsCisweDAwMjAyQTkwLCAweDAwMjAyQjI2LCAweDAwMjAyQjMyLCAweDAwMjAyQUEyLAorMHg3NTAxNjI0NSwgMHg3MTAyMjEyMSwgMHgzMkUzNjI1QywgMHg2MDYzOEJGOCwKKzB4RTYwMTgxRDQsIDB4RTQxN0Q1MzgsIDB4MzI0MzYyNkMsIDB4NjI1NTg5MUUsCisweDI3MjE3NjAxLCAweDc3MDJBRkY4LCAweERFMzVEMjM0LCAweDJFMjJFNTAxLAorMHhFRTA0QTAwNCwgMHg3NTAxNjI0NSwgMHg3MTAyMjEyMSwgMHgzMkUzNjI1QywKKzB4NjA2MzhCRjgsIDB4RTYwMTgxRDQsIDB4QTAwNEQ1MkUsIDB4NjI1NUU0MTcsCisweDI3MjE3NjAxLCAweDYyNkM3NzAyLCAweDhCRjgzMjQzLCAweDJEMjE5MjRCLAorMHhENzJBRDQyOSwgMHgyRjEyNjE0MiwgMHg2REYyNjVGMiwgMHhDOTgwNjA1MywKKzB4NjA1MzI3MDAsIDB4NjEwM0M5NjAsIDB4NjA1MzgwNzEsIDB4NjVGMjZFRjIsCisweDREMTlDOTAzLCAweDgwNzI0NTI5LCAweDQ1MTk2MERDLCAweDRFMjk4MTcyLAorMHg2MkVDNjA1QywgMHgzMDJDNDAxOCwgMHg2RDQyODE3MywgMHgyRkQyMjExOCwKKzB4NjJGMjZFRjIsIDB4NDIxOTY2RjIsIDB4NjU2QzQ2MjksIDB4NjAyQzY2RjIsCisweDQwMTg2NEVDLCAweDMwNEM0NjI5LCAweDgxNzQ0NjE5LCAweDQwMTg2MDZDLAorMHg4RjA3MzA1QywgMHhCQ0I1ODE3NSwgMHg2MjBDMDAwOSwgMHg4OTA4MjIyOCwKKzB4MDAwOUEwMEEsIDB4ODg0MDYwMTMsIDB4QjAwQThCMDMsIDB4QTAwMzAwMDksCisweEQ2MEIwMDA5LCAweDI2MjJFMjAyLCAweDRGMjY3RjA0LCAweDAwMEI2RUY2LAorMHgwMDBCNkRGNiwgMHgwNjBBMDAwOSwgMHgwMDIwMkFEMiwgMHgwMDIwMkFEMCwKKzB4MDAyMDI4QkMsIDB4MDAyMDJBQTQsIDB4MDAxRTEwMEMsIDB4MDAyMDI4QTAsCisweDAwMjAyOEQwLCAweDdGRkM0RjIyLCAweDY2MjBEMjdFLCAweDhEMDgyNjY4LAorMHhENDdEMkY2MCwgMHg0MjBCRDI3RCwgMHg2NEYwMDAwOSwgMHhBMDkwN0YwNCwKKzB4N0YwNDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwQjAwMDksIDB4MkZFNjAwMDksCisweERFNzc0RjIyLCAweDYwRTBENjc3LCAweENCQzBENDc3LCAweDYyNjAyRTAwLAorMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwKKzB4NjYwMzQwMDksIDB4RDY3MTYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsCisweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQxNkQ4QkY4LCAweDAwMDk0MTBCLAorMHhFNDAxRDY2QywgMHg4NEUyMjY0MSwgMHg4MEUyQzlCRiwgMHgwMDBCNEYyNiwKKzB4MkZFNjZFRjYsIDB4RDU2ODdGRkMsIDB4NjI1MERFNjEsIDB4NjQyQzg0RTIsCisweENCNDA3NDA0LCAweDgwRTI2MTRELCAweDQ0MjE2NDEzLCAweEQ3NjM0NDIxLAorMHhFNjAwQTAwNCwgMHg3NjAxNjI1NiwgMHgyNzIyMkYyMiwgMHgzMjQzNjI2RCwKKzB4NjAxMzhCRjgsIDB4MjAwOEM5MDMsIDB4ODgwMzg5MTIsIDB4ODgwMjg5MDUsCisweDg4MDE4OTA2LCAweEEwMDg4OTA3LCAweEUwMDcwMDA5LCAweDgwNzhBMDA1LAorMHhBMDAyRTAwMywgMHhFMDAxODA3OCwgMHg2MjUyODA3OCwgMHgyNzIyMkYyMiwKKzB4RDY1MEUwMEYsIDB4NjA2MTgwNzgsIDB4OEIwMTg4MDEsIDB4MjYyMUUyMDAsCisweDYwNjBENjRGLCAweDI2MDBDQjA4LCAweEM5M0Y2MEUwLCAweDdGMDQyRTAwLAorMHg2RUY2MDAwQiwgMHg2MDIxRDI0NywgMHg4RDE4ODgwMSwgMHhEMjQ2NjE0MywKKzB4MjIxMDYwNTMsIDB4NjA2MzgwMjEsIDB4RDQ0NjgxMjEsIDB4RTUwMEEwMDcsCisweDAyN0M2MDVELCAweDM2NEM2NjAzLCAweDI2MjA3MDAxLCAweDYyNUQ2NTAzLAorMHgzMjEzNjExQywgMHhENjQwOEJGNCwgMHhDOUJGNjA2MCwgMHgwMDBCMjYwMCwKKzB4MkZENjAwMDksIDB4NEYyMjJGRTYsIDB4NjA0MzdGRkMsIDB4OEQwMkM4MjAsCisweEJGNkE2RTQzLCAweDYwRTMwMDA5LCAweDg5MDFDODEwLCAweDAwMDlCRjY3LAorMHhDODQwNjBFMywgMHhCRjhDODkwMSwgMHg2MEUzMDAwOSwgMHg4OTI5QzgwMSwKKzB4NjBEMEREMzIsIDB4OEQwM0M4MDIsIDB4RDYzMTJGMDAsIDB4MDAwOTQ2MEIsCisweEM4MDQ2MEYwLCAweEQ2MkY4OTAyLCAweDAwMDk0NjBCLCAweDYwMjM2MkYwLAorMHg4OTAyQzg4MCwgMHhDOTdGNjBEMCwgMHg2MDIzMkQwMCwgMHg4OTAyQzgwMSwKKzB4NDIwQkQyMjksIDB4RDUyOTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyODhCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMjU4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhEMjIyODkxNiwgMHg2MEUzNkUyMCwKKzB4ODkwMkM4MDIsIDB4NDIwQkQyMjAsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDQsCisweDQyMEJEMjFFLCAweDYwRTMwMDA5LCAweDg5MDVDODA4LCAweDdGMDREMjFDLAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxRTEwMjAsIDB4MDAyMDI5NkMsIDB4MDAyMDBEQTYsCisweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3RDAwLCAweDAwMUUxMEZDLAorMHgwMDIwMDBGOCwgMHgwMDIwMjhDQywgMHgwMDExN0Q4MCwgMHgwMDFFMTBGOCwKKzB4MDAxRTEwQUUsIDB4MDAxMTdEODQsIDB4MDAxRTEwMTcsIDB4MDAxRTEwMjEsCisweDAwMjAwRkQ4LCAweDAwMjAwRkZBLCAweDAwMjAxNTg0LCAweDAwMjAyOEQwLAorMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMTAyQSwgMHgwMDIwMTAzQywKKzB4MDAyMDEwNDgsIDB4RDZBODY0NEMsIDB4MzQ2Qzc0RkYsIDB4MjQ1MDAwMEIsCisweDY0NENENkE2LCAweDAwMEIzNDZDLCAweEQ2QTUyNDUwLCAweDM0NkM2NDRDLAorMHgyNDUwMDAwQiwgMHg2MTZENjI1QywgMHg0MTE5NDIwOCwgMHg2MDE5NDIwOCwKKzB4NjQ0QzQyMDAsIDB4MzI0QzY3MEUsIDB4MjA3REQxOUUsIDB4QzkwRjQyMDAsCisweDAwMEIzMjFDLCAweDY3NjMyMjAwLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LAorMHgzMjRDNjQ0QywgMHg0MjAwRDE5OCwgMHgwMDBCMzIxQywgMHgyRkU2MjI3MCwKKzB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4MjcyOUUyOUYsCisweDY1NzM2RTUzLCAweDQ3MTk2NzZELCAweDY3MkU2Mjc5LCAweDQyMjEyMjdELAorMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwKKzB4NjQ0QzQ2MDAsIDB4MEUxQTA0NjcsIDB4MjE1MDI1RUIsIDB4MDAwQjRGMTYsCisweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLAorMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywKKzB4RTQwMUJGQTAsIDB4QkZBM0U1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRkEzLCAweEJGQTBFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LAorMHg4MUYyRTQwMSwgMHg2NTQzQkY5RSwgMHhFNDAxODVGMiwgMHhCRkFBNjU0MywKKzB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsCisweDYwNTM3NTZDLCAweDgwRjhCRjdFLCAweEJGODFFNDAyLCAweDg0RjhFNTEyLAorMHg3MDkwRTQwMiwgMHg2NTAzQkY4MSwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywKKzB4QkY3RkU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEIsCisweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLAorMHhCRjVGRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MiwgMHgwNUZDRTAxMCwKKzB4QkY2MkU0MEUsIDB4RTUwMDc1ODUsIDB4QkY2M0U0MDMsIDB4RTUwMEU2NDAsCisweEJGNzBFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLAorMHhFMDE0NjU1QywgMHhCRjQ1RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OCwKKzB4MDVGQ0UwMTQsIDB4QkY0OEU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0OUU2NDAsCisweEU1MDFFNDA0LCAweEJGNTZFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwKKzB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsCisweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFBLAorMHhCRjFERTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRCwKKzB4QkYxQUU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQjY1NDMsIDB4RTQwMUU2NDAsCisweEJGMjg2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLAorMHg3NTZDRTQwMiwgMHhCRUZENjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMCwKKzB4RTQwMjg0RjQsIDB4QkYwMDcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMUU0MDIsCisweEU2NDBFNTAwLCAweEJGMEVFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLAorMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUUzRTQwMywgMHhFNTEzODBGOCwKKzB4RTQwRUJFRTYsIDB4RTQwRTg0RjgsIDB4QkVFNjcwODUsIDB4RTUwMDY1MDMsCisweEJFRTdFNjQwLCAweEU1MDBFNDAzLCAweEJFRjRFNjQwLCAweEU1MDBFNDAzLAorMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUM5RTQwNCwKKzB4RTQwRjgwRkMsIDB4RTUwNEJFQ0MsIDB4RTQwRjg0RkMsIDB4QkVDQzcwODMsCisweEU1MDE2NTAzLCAweEJFQ0RFNjQwLCAweEU1MDFFNDA0LCAweEJFREFFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwKKzB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMzAsIDB4MDAxRTEwODAsCisweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAyOEM2LAorMHgwMDIwMjhDOCwgMHgwMDIwMjhDQSwgMHgwMDA5MDAwQiwgMHg2NjZDRTY4MCwKKzB4NjU2M0QyQTgsIDB4NzU0MEU3MDAsIDB4NjQ3MzQyMkIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDRDMThFQzAxLCAweERBQTNEQkEyLAorMHg2NUIyNTJCMSwgMHg4OTIyMzUyMCwgMHhDOTAzNjA1MSwgMHg4OTFFODgwMSwKKzB4RDE5RkRFOUQsIDB4NjRFMzQxMEIsIDB4ODUwMzY1MDMsIDB4NjcwRDY2QTIsCisweEREOUMzNzYyLCAweEQ0OUM4OTBBLCAweDQyMEJEMjlDLCAweEQxOUMwMDA5LAorMHhFNzAxRDQ5QywgMHgyMTcyNEQwQiwgMHgwMDA5QUZFMiwgMHg0MjBCRDI5QSwKKzB4RDY5QTY0RTMsIDB4NEQwQkQ0OUEsIDB4QUZEOTI2QzIsIDB4NEYyNjAwMDksCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLCAweDdGRjQ0RjIyLAorMHhFNjgxODU0NiwgMHg4NTQ3MkYwMSwgMHg4MUYxNjY2QywgMHhEMjg1ODU0OCwKKzB4ODU0MjgxRjIsIDB4ODFGMzY3RjMsIDB4RTQwQzg1NDMsIDB4NjA1MzgxRjQsCisweDgxRjU2NTYzLCAweDc1NDA0MjBCLCAweDRGMjY3RjBDLCAweDAwMDkwMDBCLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REM4NDdGRjAsIDB4RTgwMEEwREQsIDB4RDI4MzZCMTMsIDB4RTAwMTRCMDgsCisweDRCMDA0MjBCLCAweDFGMDNERTgxLCAweDNCRUM4NUYyLCAweDJGODI3RTMwLAorMHgxRkUyNjgwMywgMHg2NkMyREQ3RSwgMHgzNjIwNTJDMSwgMHhBMEMzOEIwMSwKKzB4NjA2MTAwMDksIDB4ODgwMUM5MDMsIDB4QTBCRDhCMDEsIDB4ODU2MTAwMDksCisweDg5NjVDODAxLCAweEVFMTA1MTYzLCAweERBNkE4NTEyLCAweEM5MDM2NjAzLAorMHg4NTEzNjQwMywgMHg0MDIxNjAwRCwgMHhDOTNGNDAyMSwgMHg4RDFDMzBFMywKKzB4RDc3MDY1MDMsIDB4NjI3MDQ0MDgsIDB4NDQwMDQ0MDgsIDB4MjIyODQ1MDAsCisweDM0NUM4RjBBLCAweDYwNDNEMjZDLCAweDY5N0QwNzJELCAweDY4OTk0OTE5LAorMHg2OTdDNkU4RSwgMHgyOEVEQTAwOSwgMHg2MDQzRDI2OCwgMHg2OTdEMDcyRCwKKzB4Njg5OTQ5MTksIDB4Njk3QzZFOEUsIDB4RUVGRjI4RUQsIDB4NkVFQzYyOUQsCisweDhCMEYzMkUwLCAweDQxMEJEMTUyLCAweDU0MDM2NEMzLCAweEJGODVFNTAyLAorMHhENDVGNkUwMywgMHg0NjBCRDY1NCwgMHhENzVFNjVFMywgMHhENDVFRUUwMSwKKzB4MjdFMkEwMUQsIDB4MjZFOUVFRkMsIDB4ODExMjYwNjMsIDB4OTc4ODg1MTMsCisweDIwNzk0MjA4LCAweDg1MTI4MTEzLCAweDgxMTIyMDhCLCAweDIwMkI4NTEzLAorMHg4NTE0ODExMywgMHg0MjE4RTIwOCwgMHg4MTE0MjAyQiwgMHg4NTQxNjRDMiwKKzB4ODE0MTIwRTksIDB4RDQ1MTY1QzIsIDB4Q0IwMTYwNTEsIDB4NEEwQjI1MDEsCisweDYwQzIwMDA5LCAweDUyRjM1NkYyLCAweDJCMDJDQjAxLCAweDI2MjJBRjhCLAorMHhEMjM3ODU2MSwgMHg4RDJFQzgwMiwgMHg0MjBCNjRDMywgMHhENjQ4MDAwOSwKKzB4NUUwMzY1MDMsIDB4MDc2RUUwNEMsIDB4NzcwMUQxNDYsIDB4NjAxMjA2NzYsCisweDhCMDU4ODAxLCAweEVBMEM4NUUxLCAweDIwQUI0QTE4LCAweDgxRTFBMDA3LAorMHg4ODAyNjAxMiwgMHg4NUUxOEIwMywgMHgyMEE5RUFERiwgMHg4NTUxODFFMSwKKzB4MjBBOUVBRkMsIDB4NjA1MTgxNTEsIDB4Q0IwMURBMjgsIDB4NEEwQjY0QzMsCisweDU2RjIyNTAxLCAweEQ3Mzg1MUYzLCAweDg1RUYyNjEyLCAweDQ3MEI2NEQzLAorMHhBRjU4NjUwRCwgMHg0MjBCMDAwOSwgMHg1NDAzMDAwOSwgMHg4NTQ0NkUwMywKKzB4NEExOEVBMDgsIDB4MzBBMDIwQTksIDB4OEIwM0RBMUEsIDB4RTUwMUJGMTYsCisweDAwMDlBMDA3LCAweEQ2MkQ4NTQxLCAweDIyNjg2MjBELCAweEJGMEQ4OTAxLAorMHhENDIzRTUwMCwgMHg0MjBCRDIxOCwgMHhENzIyNjVFMywgMHhFRTAxRDQyOCwKKzB4MjdFMjRBMEIsIDB4MDAwOUFGMzcsIDB4NjhGMjYwODMsIDB4NzgwMTgxRjIsCisweDYxOEQ3QzA4LCAweDMxRTdFRTAzLCAweEFGMUQ4OTAxLCAweDdGMTAwMDA5LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4RkUwMzY4RjYsIDB4MDAyMDE4MzQsIDB4MDAyMDI4ODQsIDB4MDAyMDI4OEMsCisweDAwMjAwQTVDLCAweDAwMjAwREE2LCAweDAwMjAyODU0LCAweDAwMjAwQURFLAorMHgwMDFFMjEzMCwgMHgwMDIwMkE3MCwgMHgwMDIwMEE3QSwgMHgwMDFDM0QzMCwKKzB4MDAyMDJBNzQsIDB4MDAyMDI4NjQsIDB4MDAyMDFGRDQsIDB4MDAxQzNEMDAsCisweDAwMjAyQTgwLCAweDAwMjAyQThDLCAweDAwMjAyOTcwLCAweDAwMjAyOUYwLAorMHgwMDIwMjg1QywgMHgwMDFFMjEyQywgMHgwMDIwMkE3OCwgMHgwMDIwMkE3QywKKzB4MDAyMDI3RjgsIDB4MDAyMDI3RjQsIDB4MDAyMDBFMDYsIDB4MDAwMDgwMDAsCisweDAwMjAyQTg4LCAweDRGMjIyRkU2LCAweDZFMjJEMjBELCAweEM4NDA2MEUzLAorMHgyMkUyOEQwMiwgMHgwMDA5QkU2OCwgMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwKKzB4MDAwOUJFNjQsIDB4QzgwNTYwRTMsIDB4QkVCOTg5MDEsIDB4NjBFMzAwMDksCisweDg5MDJDODAyLCAweEFFNjE0RjI2LCAweDRGMjY2RUY2LCAweDZFRjYwMDBCLAorMHgwMDFDMzUxMCwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDFGRkUsIDB4MDAyMDFGQjQsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMjg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTAzLCAweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LAorMHgwMDAwNjJGNiwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwKKzB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsCisweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLAorMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwKKzB4MDAyMDIwQkUsIDB4MDAyMDIwNzQsIDB4MDAwQkUwMDAsIDB4NDAwMTYyRjYsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDYyRjYwMDBCLAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsCisweDQwMjk0MDAxLCAweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHgwMDBCNDAyOSwgMHg0MDA0NjJGNiwgMHg0MDA0NDAwNCwgMHhDOTBGNDAwNCwKKzB4NjJGNjAwMEIsIDB4NDAwNDQwMDQsIDB4QzkwNzQwMDQsIDB4NjJGNjAwMEIsCisweDQwMDQ0MDA0LCAweDAwMEJDOTAzLCAweDQwMDQ2MkY2LCAweDAwMEJDOTAxLAorMHgwMDAwNjJGNiwgMHgzNjIyRTIxOCwgMHg2NzQzOEYxMiwgMHgwMDA5QTAwNCwKKzB4NzZGRjYyNTQsIDB4NzQwMTI0MjAsIDB4QzgwMzYwNTMsIDB4NjA0MzhCRjgsCisweDg5MDJDODAzLCAweDQyMkJEMjJCLCAweEQyMkIwMDA5LCAweDAwMDk0MjJCLAorMHgyRkU2NjQ3MywgMHg4RDRBMzQ1MCwgMHgyNzc4Njc2MywgMHg2MjQzODk0NywKKzB4MjI3QjIyNUIsIDB4QzkwMTYwMjMsIDB4OEQyMDM0NTIsIDB4MkVFODZFMDMsCisweDYwMjM4QjE1LCAweDhCMDhDODAzLCAweDQ3MDk2NjQzLCAweDQ3MTA2MjU2LAorMHg4RkZCMjYyMiwgMHhBMDMyNzYwNCwgMHg0NzAxMDAwOSwgMHg2MTQzNjY3MywKKzB4NDYxMDYyNTUsIDB4OEZGQjIxMjEsIDB4QTAyODcxMDIsIDB4NjY0MzAwMDksCisweDQ3MTA2MjU0LCAweDhGRkIyNjIwLCAweEEwMjA3NjAxLCAweDYxNDMwMDA5LAorMHgyRUU4MzU3QywgMHg4RjE1MzE3QywgMHg2MDIzNjY1MywgMHg4QjA3QzgwMywKKzB4NzZGQzQ3MDksIDB4NDcxMDYyNjIsIDB4MjEyNjhGRkIsIDB4MDAwOUEwMEYsCisweDY1NjM0NzAxLCAweDc1RkU2NjczLCAweDQ2MTA2MjUxLCAweDIxMjU4RkZCLAorMHgwMDA5QTAwNSwgMHg2MjYwNzZGRiwgMHg4RkZCNDcxMCwgMHg2MDQzMjEyNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDIyQTYsIDB4MDAyMDI3NTIsIDB4RTIxRTJGRTYsCisweDY3NjMzNjI2LCAweDhEMUI2MTUzLCAweDNFMTA2RTQzLCAweDNFMTI4OTE2LAorMHg2NUUzODkwOCwgMHgzNjcyRTYwMCwgMHg2MjE0ODkxMCwgMHgyNTIwNzYwMSwKKzB4NzUwMUFGRjksIDB4MzE3QzY0RTMsIDB4NjUxMzM0N0MsIDB4RTYwMEEwMDQsCisweDYyNTA3NUZGLCAweDI0MjQ3NjAxLCAweDhCRjkzNjcyLCAweDYwRTNBMDExLAorMHg4OTA4MzFFMiwgMHgzMjdDNjIxMywgMHg4QjA0MzJFNiwgMHg2NTEzNjRFMywKKzB4QTAwODY2NzMsIDB4RDI4RjZFRjYsIDB4NjUxMzY0RTMsIDB4NDIyQjY2NzMsCisweDAwMEI2RUY2LCAweEUyMDQ2RUY2LCAweDY3NDMzNjIyLCAweDhGMTAzNTZDLAorMHhBMDA0MzQ2QywgMHg3NUZGMDAwOSwgMHg3NkZGNjI1MCwgMHg2MDUzMjQyNCwKKzB4OEJGOEM4MDMsIDB4QzgwMzYwNDMsIDB4QTEwNTg5MDEsIDB4QTI3NzAwMDksCisweEEyOTkwMDA5LCAweDJGQjYwMDA5LCAweDJGRDYyRkM2LCAweDdGRTQyRkU2LAorMHg2QzYzNjA0MywgMHg2NjUyMUY2MiwgMHhDOTAzNzUwNCwgMHgxRjUxNkU1MywKKzB4NDUwODY1MDMsIDB4RTFGQzZENDMsIDB4MkQxOTQ1MDAsIDB4MUY3MzI1NTgsCisweDFGNjUxRjQ0LCAweDJGRDI4RDBCLCAweDg4MDg2MDUzLCAweDg4MTA4OTIzLAorMHg4ODE4ODk1QiwgMHhBMDg5OEIwMSwgMHhBMEJEMDAwOSwgMHg2MjYzMDAwOSwKKzB4MkQyMkU2MDAsIDB4N0NGQzdEMDQsIDB4RUIxMEEwMEQsIDB4RTYwMDY0RTYsCisweDdDRjA2NUU2LCAweDYyRTI2MUU2LCAweDFENTEyRDQyLCAweDFEMjMxRDEyLAorMHg3RTA0N0QxMCwgMHgzQ0IyMUZFMSwgMHgxRjY1ODlGMCwgMHgyRkQyMUZDMiwKKzB4QTBBMTFGRTYsIDB4NjREMjFGRDQsIDB4NDQyODYyNjMsIDB4NDQyOTQ0MTgsCisweDQyMTg0NDE5LCAweDQ2MjkyNDJCLCAweDJENDI0NjE5LCAweDY1NjM3RDA0LAorMHhBMDIxN0NGRCwgMHg2N0U2RUIxMCwgMHg2MkU2N0NGMCwgMHg2NEU2NjY3MywKKzB4MjU2QjQ2MTgsIDB4MkQ1MjYxRTIsIDB4NjUyMzQ3MjksIDB4NDUxODQ3MTksCisweDQyMjkyNzVCLCAweDQyMTkxRDcxLCAweDQ3MTg2NzQzLCAweDQ0MjkyMjdCLAorMHg0NDE5NjcxMywgMHgyNDdCNDcxOCwgMHgxRDQzMUQyMiwgMHg0MTE5NDEyOSwKKzB4NjUxMzdEMTAsIDB4MUZFMTdFMDQsIDB4ODlEQzNDQjIsIDB4MUZFNjdFRkYsCisweDFGQzIxRjU1LCAweEEwNjcyRkQyLCAweDZDRjIxRkQ0LCAweDY2QzI1N0Y1LAorMHg0NjI4NjI3MywgMHg0MjI4NDYyOSwgMHgyQzYyMjYyQiwgMHg3QzA0NURGMiwKKzB4N0RGRTQ3MjksIDB4QTAxQ0VCMTAsIDB4NjVFNjVFRjEsIDB4NjZFNjYyNzMsCisweDQ3Mjg2NzUzLCAweDY3NjMyMjdCLCAweDQ1Mjk2MUU2LCAweDI1N0I0NzI4LAorMHgyQzIyNjRFNiwgMHg2NTEzMUM1MSwgMHg0NTI4NDYyOSwgMHgxQzYyMjY1QiwKKzB4NDEyOTY2NDMsIDB4MjE2QjQ2MjgsIDB4NDQyOTFDMTMsIDB4Njc0MzdDMTAsCisweDNEQjI3REYwLCAweDFGRDI4OUUxLCAweDdFRkVBMDM0LCAweDUxRjU2Q0YyLAorMHg2MjEzNjZDMiwgMHg0MjI4NDYxOCwgMHg0MjE4NDYxOSwgMHgyQzYyMjYyQiwKKzB4N0MwNDVERjIsIDB4N0RGRjQxMTksIDB4QTAxRkVCMTAsIDB4NjVFNjVFRjEsCisweDY0RTY3REYwLCAweDQyMjg2MjUzLCAweDQyMTg2N0U2LCAweDY2RTYyMTJCLAorMHg2MTQzMkMxMiwgMHg0NTE5NDEyOCwgMHgyNTFCNDExOCwgMHg2NTczMUM1MSwKKzB4NDQxOTQ1MjgsIDB4MjQ1QjQ1MTgsIDB4NjQ2MzFDNDIsIDB4NDcxOTQ0MjgsCisweDI3NEI0NDE4LCAweDQ2MTkxQzczLCAweDYxNjM3QzEwLCAweDg5REUzREIyLAorMHg3RUZEMUZEMiwgMHgxRkM0MUZFNiwgMHg1REYyRTcwNCwgMHhBMDBENUVGNiwKKzB4NjJFNDUxRjQsIDB4NjZFNDdERkMsIDB4NjVFNDY0RTQsIDB4NzEwMTIxMjAsCisweDcxMDEyMTYwLCAweDcxMDEyMTQwLCAweDcxMDEyMTUwLCAweDg5RjAzRDcyLAorMHg2NkQzNTdGMywgMHg2NDEzNjVFMywgMHg2RUY2N0YxQywgMHg2Q0Y2NkRGNiwKKzB4NkJGNkExOTAsIDB4MDAyMDIxMzQsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDYwNDM3RkU0LCAweDZDNjNDOTAzLCAweDY2MDMxRjYyLCAweDQ2MDg3NUZDLAorMHg2MTUyNkU0MywgMHg0NjAwRTJGQywgMHgyNjY4MkUyOSwgMHgxRjQ0MUY3MywKKzB4MUY1MTZENTMsIDB4OEQwQjFGMTUsIDB4NjA2MzJGRTIsIDB4ODkxRjg4MDgsCisweDg5NTM4ODEwLCAweDhCMDE4ODE4LCAweDAwMDlBMDgxLCAweDAwMDlBMEI5LAorMHhFQjEwQTAwRCwgMHg1MkQzN0RGMCwgMHg1NEQxNTZEMiwgMHgyRTE2NjVEMiwKKzB4MkU2NjJFMjYsIDB4MkU0MjdFRkMsIDB4MUZEMTYxNTMsIDB4M0NCMjdDRjAsCisweDdEMDQ4OUYwLCAweDFGMTUxRkQ2LCAweDJGRTIxRkMyLCAweDFGRTRBMEExLAorMHg2MjEzNjZFMiwgMHg0MjI5NDYxOSwgMHg0MjE5NDYxOCwgMHgyRTYyMjYyQiwKKzB4N0NGRjQxMTgsIDB4RUIxMEEwMjEsIDB4NTREMzdERjAsIDB4NjI0MzU3RDIsCisweDQyMTk0MjI5LCAweDU1RDEyMTJCLCAweDJFMTY2NkQyLCAweDQxMjk2MTczLAorMHg0MTE5NDQxOCwgMHgyRTQ2MjQxQiwgMHg0NDI5NjQ1MywgMHg0NDE5NDcxOCwKKzB4MkU3NjI3NEIsIDB4NDcyOTY3NjMsIDB4NDcxOTQ1MTgsIDB4MjU3QjdFRkMsCisweDQ2MTgyRTUyLCAweDFGRDE2MTYzLCAweDNDQjI3Q0YwLCAweDdEMDM4OURDLAorMHgxRjE1MUZENiwgMHgyRkUyMUZDMiwgMHgxRkU0QTA2QiwgMHg1N0Y1NkVGMiwKKzB4NjI3MzY2RTIsIDB4NDYyODQ2MjksIDB4MjYyQjQyMjksIDB4MkU2MjVDRjIsCisweDdDRkU0NzI4LCAweEEwMUJFQjEwLCAweDdERjA1REYxLCAweDU1RDI1MUQzLAorMHg0NjI5NjYxMywgMHg1NEQxMjc2QiwgMHgyRTc2NjJEMiwgMHg0MTI4Njc1MywKKzB4MjE3QjQ3MjksIDB4NjE0MzJFMTYsIDB4NDEyOTQ1MjgsIDB4MkU1NjI1MUIsCisweDQ0Mjg2NTIzLCAweDI0NUI0NTI5LCAweDQyMjgyRTQ2LCAweDdDRjA2NzIzLAorMHg4OUUyM0NCMiwgMHgxRkQ2N0QwMiwgMHhBMDNBMUZDMiwgMHg2N0YyMUZFNCwKKzB4NjU3MjUxRjUsIDB4NDUyOTYyMTMsIDB4NDUyODQ1MTksIDB4NDIxOTQ1MTgsCisweDVDRjIyNTJCLCAweDQxMjgyNzUyLCAweDdDRkQ0MTE4LCAweEEwMjJFQjEwLAorMHg3REYwNURGMSwgMHg1NEQyNTZEMywgMHg0NTE5NjU2MywgMHg1MkQxNDYyOCwKKzB4NDYxODIxNUIsIDB4NkVEMjY1NDMsIDB4NDUxOTI3MTYsIDB4MjY1QjQ0MjgsCisweDY1NDM2MTYzLCAweDQ1MTg2NDIzLCAweDQyMjg0NDE5LCAweDQyMTgyNTRCLAorMHgyNzE2NjRFMywgMHg0NDE5NjYyMywgMHgyNjRCMjc1NiwgMHg0RTI4Mjc2NiwKKzB4NjFFMzRFMTgsIDB4M0NCMjdDRjAsIDB4N0QwMTg5REIsIDB4MUZDMjFGRDYsCisweEU3MDQxRjc0LCAweDUxRjQ1REYyLCAweDVFRjZBMDBELCAweDg0RTI3RUZDLAorMHg2MjAzNjRFMCwgMHg3REZDODRFMSwgMHg4NEUzNjUwMywgMHgyMTY0NjYwMywKKzB4MjE1NDIxMjQsIDB4M0Q3MjIxNDQsIDB4NTdGMzg5RjAsIDB4NjQxMzY2RDMsCisweDdGMUM2NUUzLCAweDZERjY2RUY2LCAweEEwOUQ2Q0Y2LCAweDJGODY2QkY2LAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg2MTQzNzRFMCwKKzB4NkE2MzY4NzMsIDB4NkI1NkU5MjAsIDB4NkM1NjdBRTAsIDB4NkQ1NjcxMjAsCisweDZFNTYzQTkyLCAweDY0NTY2NzU2LCAweDYyNTY2NjU2LCAweDExQzEyMUIyLAorMHgxMUUzMTFEMiwgMHgxMTQ1MTE3NCwgMHg4REVDMTE2NiwgMHg3MTIwMTEyNywKKzB4NjYxM0EwMDQsIDB4N0FGRjYyNTQsIDB4NzYwMTI2MjAsIDB4OEJGOTJBQTgsCisweDZFRjY2MDgzLCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHgyRjg2NjhGNiwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NkE2MzY4NzMsIDB4NzVFMEU5MjAsIDB4NTY1NjUyNTcsIDB4NTc1NDUxNTUsCisweDVENTI1RTUzLCAweDZCNTI1QzUxLCAweDI0NjYyNDI2LCAweDI0NzYyNDE2LAorMHg3QUUwMjRFNiwgMHgyNEM2MjRENiwgMHg4REVDM0E5MiwgMHg2NkEzMjRCNiwKKzB4NkVGNjY3ODMsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4QTA0MzY5RjYsCisweDJGRTY2OEY2LCAweEM4MDQ2MDYzLCAweDhEMDQ2RTYzLCAweDYyMTY2MTUzLAorMHgyNDIyN0VGQywgMHg2MEUzNzQwNCwgMHg4OTA4QzgxOCwgMHg3MTA0NjUxMywKKzB4NjI1MjY2MTYsIDB4MjQyMjdFRjgsIDB4QUZGNDE0NjEsIDB4RTIwNDc0MDgsCisweDY1MTMzRTIyLCAweDY2RTM4RDAyLCAweDZFRjZBMDFDLCAweDZFRjZBRjg3LAorMHhDODA0NjA2MywgMHg2MTYzOEQwNCwgMHg2MjUyNzVGQywgMHgyNDI2NzFGQywKKzB4QzgxODYwMTMsIDB4NzVGODg5MDYsIDB4NjY1MjUyNTEsIDB4MjQ2NjI0MjYsCisweDcxRjhBRkY2LCAweDMxMjJFMjA0LCAweDY2MTM4RjAyLCAweDAwMDlBRkExLAorMHgwMDA5QTAwQSwgMHgwMDA5QTAwNCwgMHg3NkZGNjI1NCwgMHg3NDAxMjQyMCwKKzB4OEJGOTI2NjgsIDB4NjA3MzAwMEIsIDB4MDAwOUEwMDQsIDB4NjI1MDc1RkYsCisweDI0MjQ3NkZGLCAweDhCRjkyNjY4LCAweDYwNzMwMDBCLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLAorMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDcyNjE0RCwgMHgzMjIwMzIzMiwKKzB4MjAzNzMwMzAsIDB4MzUzQTM0MzEsIDB4MzMzNTNBMzQsIDB4MDAwMDAwMDAsCisweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLAorMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwKKzB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsCisweDAwMDAwMDAwLCAweDYxNDM3NzQ4LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLAorMHg2NjIwMjA2RSwgMHgwQTZDNjk2MSwgMHgwMDAwMDAwRCwgMHg3MzY5NkY0RSwKKzB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsCisweDIxMjE2QzY5LCAweDAwMDAwRDBBLCAweDAwMDAwRDBBLCAweDAwMDAwMDQyLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDgwMjA3LCAweDAyMEEwMjA5LCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwODAyMDcsIDB4MDIwQTAyMDksIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksCisweDczMjA0MTQyLCAweDAwM0Q3MTY1LCAweDAwMDAwMDc0LCAweDAwMDAwMDAwLAorMHgwMjAwMDExMiwgMHg0MEZGRkZGRiwgMHgxMjIxMEFDRSwgMHgyMDEwNDg5MCwKKzB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsCisweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMjAwLCAweDAwMDI4MjA1LAorMHgwNTA3MDAwMiwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMTAwNDAwMywKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAwNDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDA0MDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwgMHgwMzA0MDEwMCwKKzB4MDMwQzA0MDksIDB4MDA3OTAwNUEsIDB4MDA0MTAwNDQsIDB4MDMxODAwNTMsCisweDAwNTMwMDU1LCAweDAwMzIwMDQyLCAweDAwMzAwMDJFLCAweDAwNTcwMDIwLAorMHgwMDQxMDA0QywgMHgwMDAwMDA0RSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDA3MDksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTExMDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfdHhzdHJlYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV90eHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzdjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfdHhzdHJlYW0uYwpAQCAtMCwwICsxLDEwMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMTcsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweEQ0ODg3NjAxLCAweDRFMEJERTg4LCAweEQ0ODgwMDA5LAorMHgwMDA5NEUwQiwgMHg0RTBCRDQ4NywgMHg3RjA0MDAwOSwgMHhBMDUyNEYyNiwKKzB4NEYyMjZFRjYsIDB4NDEwQkQxODQsIDB4RDQ4NDAwMDksIDB4MDAwOTQ0MEIsCisweDQ1MEJENTgzLCAweEQ3ODMwMDA5LCAweEQyODNFMUZGLCAweDI3MTI2MTFELAorMHhENDgyNTAyOSwgMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwKKzB4RTcyMDI0NTIsIDB4NDcxOEQ1N0UsIDB4MjU3MkQyN0UsIDB4RDE3RUU3MDAsCisweEQ2N0ZENDdFLCAweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0QyNjIwLAorMHgyNjQxRTRGRiwgMHhENTdDRTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywKKzB4NDAwMDYyNkQsIDB4OEZGODMyMTIsIDB4RDU3ODA1NDUsIDB4MjUyMEUyMDEsCisweEQyNzhENzc3LCAweEU0ODBFMTAwLCAweDIyMTIyNzEwLCAweDY2MTNENTc2LAorMHg2NjZENjQ0QywgMHg3NjA0Njc2MywgMHgzNzVDNjI2RCwgMHg4RkY4MzI0MywKKzB4RDU3MjI3MTIsIDB4RDI3M0Q3NzIsIDB4RTQwMEUxMDEsIDB4MjcxMDI1MTEsCisweDAwMEI0RjI2LCAweDdGQ0MyMjQyLCAweEQxNzBENTZGLCAweEQyNzFEQjcwLAorMHgxRjUxRDQ3MSwgMHhENjcxNzUwOCwgMHgxRjEyRDc3MSwgMHgxRjU1NzEwQywKKzB4MUZCOTc1RkMsIDB4NzIwNDFGMkEsIDB4MUYxM0VCMTAsIDB4MUY1NjFGNDQsCisweDFGNzgxRjY3LCAweEQ4NkIxRjJCLCAweERENkNEOTZCLCAweERDNkNFQTAwLAorMHhEMjZEREU2QywgMHg4OTAwM0EyMiwgMHhEMTVEN0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGODhCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTUwLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0RiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGOUQxNEIsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNjY3OTIsIDB4MjE3MjUyRjUsIDB4RDY1NTUxOTEsIDB4NTVGQTIyMTIsCisweDUyRkI2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwN0RFMjY1MiwgMHhDOTAzNjA3MSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDQyQkQ3NDEsIDB4Njc3MkQ1NDEsIDB4NTE1MzYyNDIsCisweDMxMkMzMjdDLCAweDI0MjIyMjI4LCAweDE1MTM4RDA1LCAweDYyNjJENjNELAorMHhCMTYyNzIwMSwgMHhENjIzMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3NCwgMHgwMDIwMzlGNCwgMHgwMDIwMThBMiwKKzB4MDAyMDNBMDAsIDB4MDAyMDNBMTgsIDB4MDAyMDE4NjAsIDB4MDAyMDE5NkMsCisweDAwMjAxMjg4LCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzhGNCwgMHgwMDIwMzQ4QywgMHgwMDIwMzhGQywgMHgwMDIwMzkwOCwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5NzAsIDB4MDAyMDM5NzQsIDB4MDAyMDM5MUMsCisweDAwMjAzOTFELCAweDAwMjAzOTIwLCAweDAwMTE3NzAwLCAweDAwMjAzOThDLAorMHgwMDIwMzk4QSwgMHgwMDIwMzRGMCwgMHgwMDExNzcxMCwgMHgwMDFDM0QzMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxQzNEMDAsCisweDAwMUMxMDAwLCAweDAwMUMxMDI4LCAweDAwMjAzNTA0LCAweDAwMjAzOTI0LAorMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHg3RkZGRkZGRiwgMHgwMDIwMTczMCwKKzB4MDAyMDMzMkEsIDB4MDAyMDIzMzQsIDB4MDAyMDNEQTQsIDB4MDAyMDM5NzIsCisweDAwMjAzNEZDLCAweDAwMjAzOTY0LCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzQ5NCwgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE5NjAwMDksIDB4MzYyMDYyMTIsIDB4RDQ5NTg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTkzLCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc4RiwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI4QzU3RjIsIDB4NjIyMjYwNzIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJDLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4Q0IwMTU0RjcsIDB4RDI3RTU1RjIsIDB4RTcwMTI0MDIsIDB4RDQ3RkUxMDAsCisweDIyMTEyNTcyLCAweDcyMDE2MjQyLCAweDI0MjJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTRGRkQ1NzcsIDB4NjQ0RDY3NTIsIDB4OEIxMDI3NDgsIDB4NjI3MkQ3NzUsCisweDhCMEMzMjYwLCAweDUxRjI1NUY3LCAweEQyNkRFNzAxLCAweDIxNzIyNTYyLAorMHhENTcxRTEwMCwgMHg2NDUyMjIxMSwgMHhBMDc3NzQwMSwgMHg1MkYzMjU0MiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQyNkE4QjZDLCAweDY3MjI1NEY0LCAweDc3MDFENTY5LCAweDYxNDIyMjcyLAorMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwgMHg4QjAzMzE2MCwgMHg2MjYyRDY2NSwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NUEsIDB4MjYyMUIwNjcsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhEMjVCOEIxNiwgMHg2NzIyNTRGNCwKKzB4NzcwMUQ1NTcsIDB4NjE0MjIyNzIsIDB4MUYxQ0U2NDAsIDB4NDYxODIxNTksCisweDhCMDMzMTYwLCAweDYyNjJENjU1LCAweDI2MjI3MjAxLCAweEUyMDBENjQ4LAorMHgyNjIxQjA0MywgMHgwMDA5QTAxMCwgMHhENDUyRDU1MSwgMHhEMjQ0Njc1MiwKKzB4RTEwMDc3MDEsIDB4MjU3MjNBNDYsIDB4MjIxMThGMDYsIDB4RUEwMEQ2NEUsCisweDcyMDE2MjYyLCAweDI2MjJCMDMxLCAweDJGQjJENTRDLCAweDk1NzM2NjUyLAorMHhENDRBNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYyRiwgMHhEMTJGMjYyMSwgMHgyMTIxRTIwMCwgMHhEMTNDRTIwMSwKKzB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsIDB4MDAwOUFFMkIsIDB4NDUwQkQ1MzksCisweEQxMzkwMDA5LCAweEFFMjRFNjAwLCAweDJGODYyMTYwLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwgMHhERTM0RDEzMywKKzB4NTQxMTYyMTIsIDB4MUY0MTY3RTIsIDB4MkYyMkQ0MzIsIDB4RDUzMjFGNzIsCisweEQyMzI2NzQzLCAweDU4NDE3Nzk0LCAweDY5NDI1QTQyLCAweDVCMTY2QzcyLAorMHg2MDUyNkQyMiwgMHhDQjIwRTYwMCwgMHhFNTQwMjUwMiwgMHg2MjZENzYwMSwKKzB4OEJGQjMyNTMsIDB4NTVGMTYyRjIsIDB4MTE1MTIxMjIsIDB4RDYyODU1RjIsCisweDE0ODEyRTUyLCAweDI0OTIxNEEyLCAweDI3QzJENDI2LCAweDI2RDIxMUI2LAorMHhEQTI1Njc0MiwgMHhFODAxRDkyNSwgMHg0OTBCMkE3MiwgMHhFMjAxMUE4QywKKzB4MUEyQzQyMTgsIDB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDAwMDAwN0QxLCAweDAwMjAzOTg0LAorMHgwMDIwMzk4OCwgMHgwMDIwMzk4RSwgMHgwMDFDM0RDMCwgMHgwMDExNzcyQywKKzB4MDAxQzNCODgsIDB4MDAyMDM5NkMsIDB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsCisweDAwMDBGMDAwLCAweDAwMTE3NzY0LCAweDAwMTE3NzQ4LCAweDAwMTE3NzY4LAorMHgwMDExNzc2QywgMHgwMUZGRkZGRiwgMHgwMDExNzc0QywgMHgwMDIwMzRGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDI0RjgsIDB4MDAyMDM5NzIsIDB4MDAxQzNCOUMsCisweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLCAweDAwMUM1OTYwLAorMHgwMDFDODk2MCwgMHgwMDIwMzUwNCwgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFOTU3RkFDLCAweDYxRTBFMDE0LCAweDBGMTRENDk0LCAweDcxMDE2MUUzLAorMHhFMDE4NjIxMCwgMHhEMjkyMEYyNCwgMHgwMDA5NDIwQiwgMHg0NTBCRDU5MSwKKzB4MjAwODAwMDksIDB4OEYxMjZEMDMsIDB4RDI4RjFGMDcsIDB4NjcyMEQ0OEYsCisweDY1N0NERDhGLCAweDQ3MEJENzhGLCAweEQxOEYwMDA5LCAweDYxOUM2OTEwLAorMHg0NjA4NjYxMywgMHgzNjE4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDE4MUZENywKKzB4RTU4MDA0RkMsIDB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTUsCisweDAxRkNFMDE0LCAweERFODVFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHg4MDk0NzUwMSwgMHgzMjQzNjI1RCwKKzB4RDY3RjhCRjQsIDB4QTM0RUUyMDAsIDB4MjAwODI2MjEsIDB4RTAxNDhCMTMsCisweEU0MDAwMUZDLCAweEEwMDlERTc5LCAweDY0NEQ2NzFDLCAweDM1RUM2NTQzLAorMHg2OTQzNjY1MiwgMHgzOURDNjI2MiwgMHg3NDA0MTkyMSwgMHgzMjczNjI0RCwKKzB4QTMzODhCRjMsIDB4ODgwMTJEMTAsIDB4RTAxNDhCMTcsIDB4RTcwMDAxRkMsCisweDZEMUMyRDcwLCAweERFNkQxRkQ0LCAweDMyRDM2MjdELCAweEEzMkE4QjAxLAorMHg2NzdEMDAwOSwgMHg2NjczNjVFMywgMHg2MTczNzUwNCwgMHgzMTVDMzZFQywKKzB4NjkxMjY0NjIsIDB4QUZFRjc3MDgsIDB4ODgwNDI0OTIsIDB4RTAxNDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTYwLCAweDhCMDEzMjczLAorMHgwMDA5QTMxMSwgMHg2OTQzNjQ0RCwgMHgzOUVDNjJFMywgMHg3MjA0NjU5MiwKKzB4M0QyQzZENDMsIDB4NjE1MjY2RDIsIDB4MjE2OTc0MDgsIDB4MjUxMkFGRUQsCisweDhCMTg4ODA1LCAweDAxRkNFMDE0LCAweDJENDBFNDAwLCAweERFNTM2NzFDLAorMHgzMjczNjI0RCwgMHhBMkY2OEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNjk0MywKKzB4NjU5MjM5RUMsIDB4NkQ0MzcyMDQsIDB4NjZEMjNEMkMsIDB4NzQwODYxNTIsCisweEFGRUQyMTZCLCAweDg4MzEyNTEyLCAweEQ0NEE4QjNBLCAweDYxNDZEOTRBLAorMHg3NTA0NjU0MywgMHg2NzU2NjQ0MiwgMHg2RTUzMUY0OCwgMHg2NTUyN0UwNCwKKzB4N0VFNDYyRTIsIDB4N0UwNDY0RTIsIDB4NkVFMjFGRTksIDB4NUVGOTI5RTAsCisweDdFMDREOTQyLCAweDFGRUE2MEUyLCAweDI5MDBDOTAxLCAweEQ5NDA2RUUyLAorMHgyOUUwNEUwOSwgMHgyRjU2MkYyNiwgMHg1NkZBRDkzRSwgMHg2NTEzNDkwQiwKKzB4RDEzRDdGMDgsIDB4RTcxQzZFMEQsIDB4MURFMTJENzAsIDB4REUzQjY5MTIsCisweDY0RTIxRDkyLCAweDFENDNEMTNBLCAweEQyM0E2NTEyLCAweDY3MjIxRDU0LAorMHgxRDc1RDIzOSwgMHgxRDY2NjYyMiwgMHg2MjYyRDYzOCwgMHgxRDI3QTJBQiwKKzB4OEIzOTg4MzAsIDB4NjU5NkQ5MkIsIDB4Njc5MjY2OTYsIDB4NjE5Njc5MDQsCisweDc0RTQ2NDkzLCAweDZFNDM2OTkyLCAweDFGOUI3RTA0LCAweDFGRUM2NDQyLAorMHhEOTI1NkVFMiwgMHg1RUZDMjlFMCwgMHg3RTA0RDkyNCwgMHgxRkVENjBFMiwKKzB4MjkwMEM5MDEsIDB4RDkyMjZFRTIsIDB4MjlFMDRFMDksIDB4NTlGQzdGRkMsCisweERFMjcyRjkyLCAweDJGMTY0RTBCLCAweEQ0MUY3RjA4LCAweEUyMUM2MTBELAorMHgxRDExMkQyMCwgMHhEMjIwNjQ0MiwgMHhENDFDMUQ0MiwgMHgxRDUzNjU0MiwKKzB4Njc1MkQ1MUIsIDB4RDcxQjFENzQsIDB4MUQxNTYxNzIsIDB4MUQ2NjY2MjIsCisweDYyNjJENjFBLCAweDFEMjdBMjZGLCAweDhCMzU4ODMzLCAweDQ5MEJEOTE5LAorMHhBMjY4RUUwMCwgMHgwMDAwMkRFMCwgMHgwMDExNzgwMCwgMHgwMDIwM0ExQywKKzB4MDAyMDE4QTIsIDB4MDAyMDJBQUMsIDB4MDAyMDM5MEUsIDB4MDAyMDNBMjAsCisweDAwMjAzNTM0LCAweDAwMjAxOEVFLCAweDAwMjAzOTBELCAweDAwMTE3ODA0LAorMHgwMDIwMzk4QywgMHgwMDExNzgxMCwgMHgwMDIwMzkwOSwgMHgwMDIwMzkwQSwKKzB4MDAyMDM5MEIsIDB4MDAyMDBGNjQsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZCQywgMHgwMDIwMEZCOCwgMHg4OTAxODgyOCwgMHgwMDA5QTBDMCwKKzB4RTY0M0RFQjUsIDB4MzI2NjYyRTEsIDB4MUZFRThGMDIsIDB4MkUyMUUyNDAsCisweDYyMkQ2MkUxLCAweDhCMDEzMjY3LCAweDAwMDlBMEFBLCAweEU1MDE4NUUxLAorMHg4QjAxMzA1NiwgMHgwMDA5QTBBNCwgMHgyRDEwRTEwMSwgMHg2NEUxQjIyNSwKKzB4RTY0MzU3RkUsIDB4NjUyRDYyNzEsIDB4ODk0NDM1NjcsIDB4MzU2M0U2NDAsCisweEU2MDA4QjA1LCAweDBGNjVFMDQwLCAweEEwMEZFMTFBLCAweDYxNTM3MkMwLAorMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwKKzB4QzkwMzYwNTMsIDB4RTA0MDY2MDMsIDB4NzExODBGNjUsIDB4MjIwOUUwMDcsCisweDBGMjVFMDNDLCAweEUwNDQ2NDFELCAweEIyQTM2NUYzLCAweEUzM0MwRjQ2LAorMHg4NTMyMzNGQywgMHg2MjBEREU5NSwgMHg0MjA4NjAzMSwgMHg2MDIzNjEwRCwKKzB4MTMyM0U5NDQsIDB4MDZGRTQxMDgsIDB4RTAwRjM5RkMsIDB4MTMxNDRFMEIsCisweDY3MDc1RDkxLCAweDYwRDMyNjc5LCAweDBGNjY1NEZFLCAweDUxOTI4NTQyLAorMHg2MDBENEUwQiwgMHg2MEQzMjYwQiwgMHgwRjY2NjQ5MiwgMHg2NUYzQjIzNywKKzB4Njk2MTU2RkUsIDB4RTY0MDY1OUQsIDB4ODkzODM1NjMsIDB4RDc4MzU5RkUsCisweDc5MDY2NTkxLCAweEM5MDM2MDUzLCAweDQwMDA0MDA4LCAweDYxMDM2MjAzLAorMHgwRjI2RTA1MCwgMHg0NzBCRTBGRiwgMHg2QzA3NjAwQywgMHg2NjAzNjA1RCwKKzB4NDYyMTQ2MjEsIDB4NDYyMTQ2MjEsIDB4NDIwMDYyNjMsIDB4NDIwMDMyNkMsCisweDQwMjE0MDIxLCAweDQwMDhDOTAzLCAweDZEMkQzMEZDLCAweEU4MDA2QTAzLAorMHhCMjU3NjVGMywgMHg2RUEyNjREMywgMHgyRUM5RTA1MCwgMHg2Njk0MkFFMiwKKzB4RDc2RTAxRkUsIDB4NjA2QzQ3MEIsIDB4MkFFMjJFMEIsIDB4NjREMzY1RjMsCisweDc4MDFCMUZELCAweEVFMDY2MjhELCAweDhGRTkzMkUzLCAweDVFRkU3RDAxLAorMHg2MUUxRTQwMCwgMHg0MTAwODVFMSwgMHg2NkUzMzEwQywgMHg3NjBDNzExQiwKKzB4RTcwNDY1RjMsIDB4Njg2Njc0MDEsIDB4M0E3MzZBNEQsIDB4OEZGOTI1ODIsCisweDY1RjM3NTA0LCAweDY0MURCMUUzLCAweDY0RTFCMUE0LCAweDAwMDlBMTdCLAorMHhENDVCNTZGNywgMHhFQzAxRDI1QiwgMHgyNkMwNDIwQiwgMHgwMDA5QTE3MywKKzB4MDZGQ0UwMTgsIDB4ODgyOTYwNkMsIDB4NThGNzhCMDgsIDB4RTQwMEQyNTIsCisweDY2MjIyODQwLCAweDY0NkRCMTcxLCAweDAwMDlBMTY1LCAweDY2NkNFNjgxLAorMHg4OTAxMzA2MCwgMHgwMDA5QTBBQywgMHhENTUwRDE0RiwgMHg2MjEyNkE1NiwKKzB4MjEyMjMyQUMsIDB4NTQxMTZDNTYsIDB4MzRDQzYyNTMsIDB4NjQ1MjExNDEsCisweDcyMDg1ODEyLCAweEQ0NEEzODRDLCAweDY4MjIxMTgyLCAweDVBMTM2QzQyLAorMHgzQUNDM0M4QywgMHgxMUEzMjRDMiwgMHg2QzIyNzJFQywgMHg3MjEwNTgxNCwKKzB4MTE4NDM4Q0MsIDB4NUExNTY4MjIsIDB4MTFBNTNBOEMsIDB4NkEyMjcyMTAsCisweEQ2NDA1ODE2LCAweDExODYzOEFDLCAweDUyMTc2QzYyLCAweDExMjczMkNDLAorMHg1QTE4NTg2MSwgMHgxMUE4M0E4QywgMHg1QzE5NUE2MiwgMHgxMUM5M0NBQywKKzB4NTIxQTVDNjMsIDB4MTEyQTMyQ0MsIDB4NUExQjU4NjQsIDB4MTFBQjNBOEMsCisweDVDMUM1QTY1LCAweDExQ0MzQ0FDLCAweDUyMUQ1QzY2LCAweDExMkQzMkNDLAorMHg1QTFFNTg2NywgMHgxMUFFM0E4QywgMHg1NjFGNUE2OCwgMHgzNkFDRTg0MCwKKzB4MTE2RkRBMkQsIDB4NkNBMjM4MUMsIDB4N0E5NDY2ODIsIDB4Mjg2MjM2Q0MsCisweDVDODE2MkEyLCAweDE4QzEzQzJDLCAweDYyQTI3QTQ0LCAweDM2MkM1NjgyLAorMHhENjI2MTg2MiwgMHg1QTg1NjI2MiwgMHgzQTJDNDIyOSwgMHg3NjA0MThBNSwKKzB4NTY4NjYyNjIsIDB4MzYyQzQyMjksIDB4NTZGNzE4NjYsIDB4MjYyMEUyMzgsCisweDE2QzE1QzgxLCAweDE2MjI2MjEyLCAweEUyMDA1QzExLCAweDU1MTIxNkMzLAorMHg1NTE1MTY1NCwgMHg1NTEzMTY1NSwgMHg1NTE2MTY1NiwgMHg1NTgyMTY1NywKKzB4NjU4MjE2NTgsIDB4NTUxNDE2NTksIDB4NTU4NDE2NUEsIDB4NTU4MzE2NUIsCisweDU1ODUxNjVDLCAweDU1ODYxNjVELCAweDE4MjExNjVFLCAweDExMjEyMTIyLAorMHgxMTI1MTEyMiwgMHgxMTI2MTEyMywgMHgyODIyMTgyMiwgMHgxODI0MTEyNCwKKzB4MTgyNTE4MjMsIDB4MTgyNkEwQzcsIDB4MDAxMTc4MDQsIDB4MDAyMDMzRTgsCisweDAwMjAzQTQwLCAweDAwMjAxOEEyLCAweDAwMjAzNDk0LCAweDAwMUMzNkEwLAorMHgwMDIwMzRGMCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4NjY2Q0U2ODIsIDB4OEIyMDMwNjAsIDB4RUEyNDU2RjcsIDB4MjZBMEQxOTQsCisweDE2QzE1QzE3LCAweDE2MjI1MjE4LCAweDE2ODM1ODE5LCAweDE2QTQ1QTFBLAorMHgxNkM1NUMxQiwgMHgxNjI2NTIxQywgMHhFMjAwNTgxRCwgMHg1NTFFMTY4NywKKzB4NTUxRjE2NTgsIDB4MTEyNzE2NTksIDB4MTEyOTExMjgsIDB4MTEyQjExMkEsCisweDExMkQxMTJDLCAweEEwOEUxMTJFLCAweEU2ODMxMTJGLCAweDMwNjA2NjZDLAorMHg1MkY3OEIwQiwgMHhFQTAwRDg4MywgMHg2NTgyMjJBMCwgMHg3ODA0REM4MiwKKzB4NjI4MjJDNTIsIDB4QTA3RUQ2ODEsIDB4RTY5MDI2MjAsIDB4MzA2MDY2NkMsCisweERBN0Y4QjA2LCAweDAwMDk0QTBCLCAweEUyMDA1NkY3LCAweDI2MjBBMDczLAorMHg2NjZDRTY5MSwgMHg4QjEwMzA2MCwgMHg2MjIyRDI3NiwgMHgyMjI4NjIyQywKKzB4RDI3ODg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyNzYsCisweDU2RjcwMDA5LCAweEEwNUVFMjAwLCAweEU2OTIyNjIwLCAweDMwNjA2NjZDLAorMHhFMDE4ODk1MSwgMHhFNkIwMEJGQywgMHg2NjZDNjJCQywgMHg4QjJBMzI2MCwKKzB4MDJGQ0UwMTQsIDB4NjgyQ0VBMDAsIDB4NjJBREU5MDQsIDB4ODk0QTMyODMsCisweDZBQURERDY0LCAweDNDREM2Q0EzLCAweDdEMDQ2RUMyLCAweERCNjhENDY3LAorMHgzMkRDNjJBMywgMHg0QjBCREM2NywgMHg0QzBCNkQyMiwgMHhENDY2NjRFMywKKzB4MDAwOTRCMEIsIDB4NjREMzRDMEIsIDB4NEIwQkQ0NjQsIDB4RTYwMDAwMDksCisweDY2NkQ2QkUzLCAweDc2MDEzQjZDLCAweDMyOTM2MjZELCAweDhGRjcyQkQwLAorMHhBRkRBNEQxOSwgMHhFNkI1N0EwOCwgMHgzMjYwNjY2QywgMHhENDVDOEIxMywKKzB4NEIwQkRCNTcsIDB4RDI1QjAwMDksIDB4NjAyMkRCNUIsIDB4Q0IyMEU2RkYsCisweDIyMDI2NjZELCAweERCNTkyQjYyLCAweEUwMTRFMjAwLCAweDU2RjcyQjIwLAorMHhBMDEwMDJGQywgMHhENDU2MjYyMCwgMHg2NTQyRDI1NiwgMHg0MjBCRDQ1NiwKKzB4QTAwODAwMDksIDB4REI1MjAwMDksIDB4NTJCMUU2MDAsIDB4NjIyQ0RCNTMsCisweDUyRjcyQjIxLCAweDdGNTQyMjYwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwgMHhFMjQwNjE0RCwKKzB4ODkxNDMxMjMsIDB4MzEyN0UyMUYsIDB4OEIwOUQ3NDksIDB4RDQ0OTYxNEQsCisweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LCAweDE3NjFBMDA3LAorMHhFMDAxRDQ0NCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3M0IzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjNBLCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDIzNiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTMxLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTJENDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MjY0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyMCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgwMDIwMzQ5NCwgMHgwMDExNzgwNCwgMHgwMDIwMzhGNCwgMHgwMDIwMzkwOCwKKzB4MDAyMDA1MEEsIDB4MDAyMDEwMDgsIDB4MDAyMDEwMkUsIDB4MDAyMDNBNTgsCisweDAwMjAxOEEyLCAweDAwMjAxOEU2LCAweDAwMjAzQTZDLCAweDAwMjAzQTc0LAorMHgwMDIwM0E3OCwgMHgwMDFDMzUwMCwgMHgwMDFDMTAwMCwgMHgwMDIwMzk4QSwKKzB4MDAxMTc4MDAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBOEMsIDB4MDAyMDM5OTAsCisweDAwMUMzNzA0LCAweDAwMjAzM0U4LCAweDAwMUMzNzNDLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQxMCwKKzB4NkU0M0JGQTQsIDB4MkRFMkJGODksIDB4MDAwOUJGQTAsIDB4MkMxMjUxRDUsCisweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwKKzB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4MDAwMDAwMDksCisweDAwMUMzNzBDLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LCAweEREOTQ0RjIyLAorMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LCAweDQyMEJEMjhBLAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjg2RDQ4OSwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4NjAwMDksCisweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywKKzB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsIDB4QjA3NTY2QzMsCisweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywgMHg0RjI2NjBDMywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsIDB4RDY3MDA1MjksCisweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwgMHg2NEQzNTdGNCwKKzB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweEU1MDNEMTYyLAorMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwgMHhENDVGRDE1RSwKKzB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsIDB4QkY3M0U0MEEsCisweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLCAweEJGNjkyMjEyLAorMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwgMHg0RjIyMjcwMiwKKzB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsIDB4RDE1NTJGRTYsCisweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LCAweDQ1MDAyNjI5LAorMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwgMHhEMTRFNDcwOCwKKzB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsIDB4NEYyMjJGRTYsCisweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLCAweEU1MDA3NzZDLAorMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3MjIyNzEyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsIDB4RDIzNDZFRjYsCisweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLCAweEU2MDVENDMyLAorMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLCAweEM5MDM2MEIyLAorMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwgMHhCMDdDQzkwMywKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsIDB4RDQyMTJGRTEsCisweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELCAweDg5RkZDODAxLAorMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MDAxQzNCODgsIDB4MDAyMDNBQTAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBQTgsCisweDAwMjAzQUIwLCAweDAwMjAzQUI4LCAweDAwMjAzQUMwLCAweDAwMjVFNzIwLAorMHgwMDIwM0RBMCwgMHgwMDIwMzhGOCwgMHgwMDFDNTk2OCwgMHgwMDFDM0I0MCwKKzB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsIDB4MDAyMDE1RTAsCisweDAwMjAxNjBDLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLAorMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDFDNTgxQywKKzB4MDAxQzU4NjAsIDB4MDAyMDNBQzgsIDB4MDAyMDE4QTIsIDB4OEYwMTQ0MTEsCisweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLCAweDQ2Mjg2MDUyLAorMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwKKzB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsIDB4MDAwOUJGRUMsCisweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LAorMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLCAweEJGQ0JERDEzLAorMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwgMHgzNkUyNDYwMSwKKzB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLCAweEJGQjkyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwgMHg2NDUzRTcxMCwKKzB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsIDB4MzE1QzQxMDgsCisweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELCAweEVEMDA2MEIzLAorMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywgMHgxMUQ0MTFEMywKKzB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsIDB4NThGMTI4NzIsCisweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLCAweDU0RjY1RUY1LAorMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwgMHgxMUU2MTFFNywKKzB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsIDB4NTJGOUREQTcsCisweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LCAweDJENzI5QUQ1LAorMHg2RUVEMjYyMiwgMHg0RDA4NkRFMywgMHgzREVDNjFFMywgMHg0RDA4NDEwOCwKKzB4M0Q5QzMxRUMsIDB4NDEwODYwQjMsIDB4ODFEMTJEQjEsIDB4NDEwOEUwNTAsCisweDQwMDhFN0I3LCAweDY3N0M0MTA4LCAweDYwQjM4MUQyLCAweEUyMDAzMThDLAorMHg4MUQzMzQ3MiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ5MywgMHhENDkwMUQyNCwKKzB4QjBCMzY1RDMsIDB4NjRFRDdFMDEsIDB4OEJEQTM0QTIsIDB4MkZEMkRBOEMsCisweEREOTI2OEEyLCAweDJEODI0ODI5LCAweDdERkM2NEEyLCAweEQyODc2OTRELAorMHg2RTIyMkQ5MiwgMHg3RDBDNEUyOSwgMHg2ODIyMkRFMiwgMHg2MThENkFEMywKKzB4MkExNkQ3ODQsIDB4RDQ4QTZENzIsIDB4MjREMkQ1ODMsIDB4RDY4OTVFNzIsCisweDUxNzQxNEUyLCAweDE0MTRFRTAwLCAweEQxODc1ODc2LCAweDU5NzgxNDg2LAorMHgxNDk4RTcxMCwgMHg2NUUzNjI1MiwgMHgyNkUyMTQyQSwgMHhFNjAwNjRFMywKKzB4Njg0MzY0NEQsIDB4Mzg0QzQ4MDgsIDB4MzgxQzQ4MDgsIDB4MEM4NjYwNTMsCisweDA5Q0UyOEIxLCAweDgxOTE2MEIzLCAweDBBQ0U2MDUzLCAweDgxQTI2MDQzLAorMHgwRENFNjA1MywgMHg4MUQzNjBCMywgMHgwOENFNjA1MywgMHgxODgyNzQwMSwKKzB4NjI0RDA5Q0UsIDB4MEFDRTE5RTMsIDB4MUE2NDMyNzMsIDB4NzUwNDhGRTAsCisweEUwMDNEOTZBLCAweDQwMTg2QzkyLCAweDZEOTIyQ0IxLCAweDgxRDFEQTZGLAorMHg2RTkyRTA1MCwgMHg4MUUyNDAwOCwgMHg2MEIzNjE5MiwgMHg2NDkyODExMywKKzB4MTQ0MkU2MDAsIDB4RDQ2OTY3OTIsIDB4Njg5MjE3QTMsIDB4MTg2NEUxRkYsCisweDY1NjNFNzAzLCAweDM2NEM0NjA4LCAweDI2MTI3NTAxLCAweDM2NzM2NjVELAorMHhEQzVCOEJGOCwgMHg2REMyRTAwMywgMHgyREIxNDAxOCwgMHhEMjYwNkVDMiwKKzB4NjFDMjgxRTEsIDB4MTExMkVFMDAsIDB4RTAyNDY0QzIsIDB4NjVDMjE0MjMsCisweDE1RTRENDVCLCAweEU1ODA2N0MyLCAweDY4QzI4MTcyLCAweDgxODM2NkUzLAorMHg2NjZENjU1QywgMHg3NjA0Njk2MywgMHgzOTRDNkE2RCwgMHg4RkY4M0E1MywKKzB4REI1NDI5RTIsIDB4MjRCMkRDNTQsIDB4MjRDMjc0MDQsIDB4NEYyNjdGNjgsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2MDExNjE0MiwgMHg4RjAzQzgwMywgMHhEMjNERTUwMCwgMHg4QjA2MzQyMCwKKzB4QzkwMzYwMTEsIDB4OEIwNjg4MDIsIDB4MzQyMEQyMzksIDB4NTYxMjhCMDMsCisweDUyNjQ2NTEzLCAweDAwMEIyNDIyLCAweDAxMTM2MDUzLCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwgMHg0NTA4RTQwMCwKKzB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsIDB4NjA1MzgxMjMsCisweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LCAweEU2MTQ2NEYzLAorMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwgMHg2NUYzNjFGMSwKKzB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsIDB4NjA3MTU3RDEsCisweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywgMHg2RDQzRTVGQywKKzB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsIDB4MTJFNDhCMDYsCisweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLCAweDU2NjRBRkYwLAorMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywgMHgyNzE5RTFGQywKKzB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsIDB4NDEwQkU2MTQsCisweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLCAweDRGMjY3RjE0LAorMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzkyNCwgMHgwMDIwMzRGNCwKKzB4MDAyMDM0RkMsIDB4MDAyMDM1MDQsIDB4MDAyMDM1MkMsIDB4MDAyMDM5MTAsCisweDAwMjAzOTE4LCAweDAwMTAwMjA4LCAweDAwMTAxN0MwLCAweDAwMUUyMTBDLAorMHgwMDFDM0QwMCwgMHgwMDIwMzk2NCwgMHgwMDEwMDBDOCwgMHgwMDExNzg4MCwKKzB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsIDB4MDAyMDBFRDYsCisweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LCAweDNFMkNBMDA1LAorMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwgMHgzNTIwNTJFMSwKKzB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LCAweDM2MjA2NkMyLAorMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwgMHhCRjM3REQzNSwKKzB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsIDB4RDQzMjg5MDcsCisweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LCAweEJGM0QwMDA5LAorMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwgMHgyMjYyRDIyRCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLCAweDA0REU0MDA4LAorMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwgMHg1NUUyMjdFMiwKKzB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsIDB4MTIyMjAyREUsCisweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLCAweEM5MEY2MDUzLAorMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg4NTQzNkNGNiwKKzB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsIDB4RTEwMDhGMEMsCisweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLCAweEQ2MTMxNjIxLAorMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwgMHgwMDAwMDFGRiwKKzB4MDAyMDM1MDQsIDB4MDAyMDM0RkMsIDB4MDAxQzNEMDAsIDB4MDAyMDM1MkMsCisweDAwMjAzOEY0LCAweDAwMjAxOEEyLCAweDAwMjAzNEY0LCAweDAwMjAzQUYwLAorMHgwMDIwM0FGNCwgMHgwMDFDM0QyOCwgMHgwMDIwMzk2NCwgMHgwMDIwMzkyNCwKKzB4MDAyMDBFRDYsIDB4MDAyMDM5NjgsIDB4MDAyMDM5NkMsIDB4MDAxMTc3NTQsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjg0RjIyLCAweDYwMjJEMjM3LAorMHg4RDU4QzgwMywgMHhERTM2MkYwMSwgMHhEQjM3REMzNiwgMHg2NkMyNTJDMSwKKzB4ODkyRjM2MjAsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsIDB4RDIzM0REMzEsCisweDY0RDM0MjBCLCAweDFGMDE2NTAzLCAweDg4MDE2MEIxLCAweEQyMzA4QjA0LAorMHg2NEQzNDIwQiwgMHgwMDA5QUZFQSwgMHg4NTYxNTY1MywgMHg4OTA0QzgyMCwKKzB4RTA1MEQ3MkMsIDB4NzIwMTAyN0UsIDB4RDIyQjA3MjYsIDB4NjQ1MzQyMEIsCisweDg5MDcyMDA4LCAweDU1RjFEMTI2LCAweDY0RDM0MTBCLCAweEU2MDFENzI3LAorMHgyNzYyQUZENCwgMHg1NUYxRDIyNiwgMHg2NEUzNDIwQiwgMHhFNjAxRDEyNSwKKzB4MjE2MkFGQ0MsIDB4REQyNURFMjQsIDB4REMyNkRCMjUsIDB4NjZEMjUyRDEsCisweDg5MTgzNjIwLCAweEM5MDM2MDYxLCAweDg5MTQ4ODAxLCAweEQxMTdENDFGLAorMHgwMDA5NDEwQiwgMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwKKzB4MkM1MkFGRUMsIDB4RDcxMkQ0MUMsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMTUsCisweEFGRTM0NjE4LCAweDYwRjEyMTYyLCAweDg5MDdDODA0LCAweDdGMDhEMjE3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg0RjI2N0YwOCwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNTA0LCAweDAwMjAzNEZDLCAweDAwMjAzOThDLCAweDAwMjAxNEEwLAorMHgwMDIwMTRDQywgMHgwMDIwMzQ5NCwgMHgwMDIwMTZCRSwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzAsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM0RjQsCisweDAwMjAzOTE0LCAweDAwMjAzOTEwLCAweDAwMjAzNTJDLCAweDAwMjAwNjEwLAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsCisweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLAorMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwKKzB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsCisweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLAorMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywgMHhCRkQwNjQyMywKKzB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsIDB4NEYyNjdGMTQsCisweDZFRjYwMDBCLCAweDAwMjAzQUY4LCAweEU0RkREMjlGLCAweEQ3OUY2MTIyLAorMHgyMjEyMjE0OSwgMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTlDNjYyMiwKKzB4MjI2MjI2NDksIDB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsCisweEUxRjc2NDUyLCAweDI1NDIyNDE5LCAweEU3MDE2MDUyLCAweDI1MDJDQjQwLAorMHhFNjAyNjA1MiwgMHgyNTAyQzlDRiwgMHg0NzE4NjA1MiwgMHgyNTAyQ0IxMCwKKzB4Q0IwMzYwNTIsIDB4MTU2MjI1MDIsIDB4MTU3MzAwMEIsIDB4RDc4RUQ1OEQsCisweEQ0OEZEMjhFLCAweEU2MDBFMTAwLCAweDI3MTEyNTExLCAweEFGQ0IyMjEwLAorMHg2NjRDMjQ2MSwgMHg0NjAwRDI4QiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyODcsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsCisweDI1NjAwMDBCLCAweEQyODQ2NjRDLCAweDM2MkM0NjAwLCAweENCMTA2MDYwLAorMHgyNjAwMDAwQiwgMHhEMjgwNjU0QywgMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwKKzB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyN0EsIDB4NjA2MDM2MkMsCisweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjc2LCAweDY2NTAzNTJDLAorMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjczNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2RjY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLCAweDQyMDBENjY5LAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDY2NTYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweEQxNjE2MDBDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLAorMHhEMTVGNjAyQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywKKzB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsIDB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsCisweDYwRUM2NDBDLCAweDhCMDI4ODAxLCAweEEwMDJFMDBGLCAweDQ0MDkyNDA5LAorMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywKKzB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsCisweEQ2NEM0RjIyLCAweDg4MDE2MDYyLCAweEIyNTc4QjAzLCAweEEwMDMwMDA5LAorMHhEMjQ5MDAwOSwgMHgyMjYwRTY0MCwgMHhFMjAwRDY0OCwgMHgwMDBCNEYyNiwKKzB4NEYyMjI2MjIsIDB4NjA2MkQ2NDMsIDB4OEIwMTg4MDIsIDB4MDAwOUIyQTAsCisweEUyMDBENjQyLCAweDAwMEI0RjI2LCAweEQ1M0UyNjIyLCAweEUxMDBENDNFLAorMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwgMHhFNjA0RDIzQiwgMHgyMjYwMDAwQiwKKzB4RDQzQjRGMjIsIDB4NDEwQkQxM0IsIDB4RDUzQjAwMDksIDB4NjY1MEUxRkQsCisweDI2MTlEMjNBLCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LCAweDRGMjIyMjcwLAorMHhEMjM4RDUzNywgMHhENzM4NjE1MiwgMHgyNTEyNjExRCwgMHhFNkZGNjQ1MiwKKzB4MjU0MjI0MkIsIDB4RDIyRkQ0MzUsIDB4NDIwQjY2NkQsIDB4RDUyRTI3NjIsCisweDY3NTBFMUZCLCAweDRGMjYyNzE5LCAweDI1NzAwMDBCLCAweEQ0MzA0RjIyLAorMHg0MTBCRDEyOCwgMHhENTI4MDAwOSwgMHg2NjUwRTdGNywgMHg0RjI2MjY3OSwKKzB4MjU2MDAwMEIsIDB4OTQyNUQ1MjQsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsCisweEU0QkZENTIxLCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLCAweEQyMjU0RjIyLAorMHg2MDBEODUyMiwgMHg4OTExMjAwOCwgMHg4OTQ1ODgwMSwgMHg4OTQ3ODgwMywKKzB4ODk0OTg4MDUsIDB4ODk0Rjg4MDYsIDB4ODk1NTg4MDgsIDB4ODk1Qjg4MDksCisweDg5NjE4ODBBLCAweDg5Njc4ODBCLCAweDAwMDlBMDZFLCAweDAwMDlCMDcwLAorMHg2MDBDQTA2QiwgMHgwMDAwRkY3RiwgMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwKKzB4MDAxRTExMDgsIDB4MDAyMDM5QzQsIDB4MDAyMDM5QzYsIDB4MDAyMDM5RTUsCisweDAwMjAzOUE4LCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDJGLAorMHgwMDFFMTA5MCwgMHgwMDIwMzlDQywgMHgwMDFFMTAwQiwgMHgwMDIwMzlDOCwKKzB4MDAyMDNBRkMsIDB4MDAyMDE4QTIsIDB4MDAxRTEwMjgsIDB4MDAyMDM5RTQsCisweDAwMUQ0MDIwLCAweDk4NzYwMDAwLCAweDAwMUMxMDAwLCAweDAwMjAzQjA4LAorMHgwMDIwM0IxOCwgMHgwMDIwMzk5QywgMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwKKzB4MDAwOUIwNTUsIDB4NjAwQ0EwMzEsIDB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsCisweDAwMDlCMDYxLCAweDYwMENBMDI5LCAweDYyNjBENjgwLCAweDhCMjMyMjI4LAorMHgwMDA5QjA2OSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwKKzB4MDAwOUIwQzcsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsCisweDAwMDlCMENELCAweDYwMENBMDExLCAweDYyNjBENjc0LCAweDhCMEIyMjI4LAorMHgwMDA5QjEyNSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwKKzB4MDAwOUIxM0QsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsCisweEQyNkNEMTZCLCAweEQ1NkM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NkIwMTJELAorMHhFNDAzRDY2QiwgMHhFMjBGNjExQywgMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwKKzB4MjYwMjAwMEIsIDB4RTYwMUQyNjIsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsCisweEQ2NjNEMjYwLCAweEUwMDE4MTIyLCAweDAwMEIyNjAyLCAweEQyNUMwMDA5LAorMHg2MDBEODUyMywgMHg4OTA1MjAwOCwgMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwKKzB4MjYwMENCMDEsIDB4RDQ1N0Q2NUEsIDB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsCisweDAwMEI4MTQyLCAweEQxNTJFMDAwLCAweDg1MTNFNTAxLCAweDY0MEQ0NTE4LAorMHg2NjAzMzQ1MywgMHhFMDAwOEQwNSwgMHhENTUxRDI1MywgMHgyMjYwRTAwMSwKKzB4MDAwQjI1MDIsIDB4NEYyMjAwMDksIDB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsCisweDYyNDk0NDE5LCAweDIyN0Q2NzJFLCAweDg4MDE2MDJDLCAweDg4MDI4OTA5LAorMHg4ODAzODkxMCwgMHg4ODA2ODkxQSwgMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwKKzB4RDU0NjAwMDksIDB4NjY1MkQ3NDYsIDB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsCisweDI0MjFBMDM4LCAweDIyMjg2MjVDLCAweEQ0NDM4QjNGLCAweDY2NDJENTQwLAorMHgyNTYyRDQ0MCwgMHgyNDAxODU2MSwgMHg2MjAzQTAyQywgMHgyMDA4NjA1QywKKzB4ODgxMDg5MDcsIDB4ODgyMDg5MDgsIDB4ODgzMDg5MDksIDB4QTAyQzg5MEEsCisweEQyM0EwMDA5LCAweDYyMjJBMDA4LCAweEEwMDVEMjM5LCAweEQyMzk2MjIyLAorMHg2MjIyQTAwMiwgMHg2MjYyRDYzOCwgMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwKKzB4QTAwRjYyNkMsIDB4RDYzNTI0MjEsIDB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsCisweEEwMDcyNTYyLCAweEQ2MzIyNDIxLCAweDg1NjFENTI5LCAweDI1NjJENDI5LAorMHg2MjAzMjQwMSwgMHg2NjJEODUxNSwgMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwKKzB4QjBDQjI0NTEsIDB4QTAwMTAwMDksIDB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsCisweEQ2MTkwMDA5LCAweEQ0MjdFMTAxLCAweDY1NDEyNjEwLCAweEQxMThENzE3LAorMHhFMjBGNjU1RCwgMHgyNzUyRTAwMSwgMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwKKzB4RDIwRjRGMjIsIDB4NjQwQzg1MjMsIDB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsCisweDI2MjFFMjAwLCAweDk0MEY4NDUxLCAweEEwNDgyMDQ5LCAweERFMEQ4MDUxLAorMHhDODQwNjBFMCwgMHhFMjAxOEQzMiwgMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwKKzB4MjY0MTQyMEIsIDB4MDAwOUEwMzAsIDB4MDAwMEZGN0YsIDB4MDAyMDM5RTUsCisweDAwMjAzOTlDLCAweDAwMjAzOUE4LCAweDAwMUUxMTAwLCAweDAwMUUxMDBDLAorMHgwMDIwMzlDOCwgMHgwMDFFMTAwMCwgMHgwMDFFMTAwMSwgMHgwMDIwMzlEMCwKKzB4MDAyMDM5QjAsIDB4MDAyMDM5QjQsIDB4MDAyMDM5QjgsIDB4MDAyMDM5RDQsCisweDAwMjAzOUQ4LCAweDAwMjAzOURDLCAweDAwMjAzOUUwLCAweDAwMjAzRTA0LAorMHgwMDIwM0UwRSwgMHgwMDIwMzlDMiwgMHgwMDIwMjg4NiwgMHg4OTEyMzQyNywKKzB4RDI5NEQ2OTMsIDB4MjY0MTQyMEIsIDB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsCisweEQ2OTE2MEUwLCAweDJFMDBDQjA0LCAweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLAorMHhBMDAxRTAwMSwgMHhFMDAwMjYwMiwgMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwKKzB4Qzg4MDYwNjAsIDB4RDI4Njg5MTksIDB4ODgwMTYwMjEsIDB4RDI4OThCMTUsCisweDg1MjRFNTAxLCAweDg5MTAzMDU2LCAweEUyMDNEMTg3LCAweDIxMjBENDg3LAorMHhFMDBCNjU0MSwgMHgwNjU2NjU1RCwgMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwKKzB4RDc3RTI1NzEsIDB4MDAwQkUwMDEsIDB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsCisweERFODA0RjIyLCAweEM4ODA4NEUxLCAweEQ1N0E4OTJDLCAweDIwMDg4NTU0LAorMHg2MTAzOEYyOCwgMHg4NTUzRDc3QywgMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywKKzB4MzUyMDYyMEMsIDB4RDY3OThCMUUsIDB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsCisweDYwRTAyNzQxLCAweDg5MDRDODQwLCAweDQyMEJEMjc1LCAweEEwMDMwMDA5LAorMHhEMjY4MDAwOSwgMHgwMDA5NDIwQiwgMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywKKzB4NjBFMDIxMjIsIDB4Q0IwNEQ0NjQsIDB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsCisweDYwMjNBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHhEQTYyMkZFNiwgMHg2NkExRTI0MCwgMHgzNjIyREM1RSwKKzB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsCisweERCNjFENDYwLCAweEU3MDBBMDBGLCAweDc3MDE2MkIyLCAweDcxMDI2MTIzLAorMHg2NjIxMkIxMiwgMHg3MTAyNjIxMywgMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwKKzB4MzU2QzQ1MjgsIDB4NjI3QzI0NTIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsCisweDhCMTA4ODAzLCAweDYxNzM2N0IyLCAweDJCMTI3MTAyLCAweDcxMDI2RTEzLAorMHgyQjEyNjU3MSwgMHg2NTVENkRFMSwgMHg0MjI4NjJERCwgMHgzMjVDRTEwNywKKzB4QTAwQzJDMTAsIDB4ODgwMjI0MjIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsCisweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY1NUQ2NTYxLCAweEU2MEYyNDUyLAorMHg2N0ExMkM2MCwgMHg4QjA1Mjc3OCwgMHhERDM4REM0NCwgMHhFQjAxRUEwMCwKKzB4MkRCMjJDQTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDJGRTYyRkQ2LCAweEUyNDBERDM2LCAweDM2MjI2NkQxLCAweDYyNjM4OTAwLAorMHgzNjc4NjcyQywgMHg3NzAzREUzOCwgMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwKKzB4QTAwRTQ3MjEsIDB4NjU2MkUxMDAsIDB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsCisweDI0MjA0MjE5LCAweDQ1Mjk3NDAxLCAweDc0MDEyNDUwLCAweDI0NTA0NTE5LAorMHg2MjFDNzQwMSwgMHg4QkVFMzI3MywgMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwKKzB4MjExODM2MkMsIDB4MkU2MjhGMDYsIDB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsCisweDJENTIyNzQyLCAweDAwMEI2RUY2LCAweDJGRDY2REY2LCAweDRGMjIyRkU2LAorMHhFRDBBRUUwMSwgMHg2NEUzQkM4NSwgMHhCQzhBNjRFMywgMHg2MkVDN0UwMSwKKzB4OEJGNzMyRDcsIDB4QkM4REVFMDEsIDB4NjRFMzY0RTMsIDB4N0UwMUJDOTIsCisweDMyRDc2MkVDLCAweDRGMjY4QkY3LCAweDAwMEI2RUY2LCAweEQxMTg2REY2LAorMHhENDE4OTIwRCwgMHg3MjEyMjEyMiwgMHgyNDIyRDYxNywgMHhENzE3NzIwNCwKKzB4NzIyMDI2MjIsIDB4MjcyMkQxMTYsIDB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsCisweDAwMjAzOUMyLCAweDAwMjAyOTkyLCAweDAwMUUxMDE1LCAweDAwMjAzOUM4LAorMHgwMDFFMTAwMSwgMHgwMDIwMzk5QywgMHgwMDFFMTEwMCwgMHgwMDIwMzlDNiwKKzB4MDAyMDM5QjQsIDB4MDAxRTEwMDAsIDB4MDAyMDM5QjgsIDB4MDAyMDM5QzQsCisweDAwMjAyODg2LCAweDAwMUUxMDBDLCAweDAwMjAzOUIwLCAweDAwMjAzOUNDLAorMHgwMDIwMzlEMCwgMHgwMDIwMzlENCwgMHgwMDIwMzlEOCwgMHgwMDIwMzlEQywKKzB4MDAyMDM5RTAsIDB4NEYyMjJGRTYsIDB4RDY3MDdGRkMsIDB4ODgwMTYwNjAsCisweEUyMDE4OTUxLCAweDI2MjBCRkJCLCAweEQ1NkVEMTZELCAweERFNkU2MDEwLAorMHg2NEUzNjU1MiwgMHg3NDAyQzg0MCwgMHg4RDIyRDE2QywgMHhEMjZDNzUwMiwKKzB4RTYwMUQ3NkMsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsCisweDhGRjkzMjczLCAweEQ0NjM3NDAyLCAweDYyNDJFNjAxLCAweDY0MEQ4NTI4LAorMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywgMHhFNDE3RDU2MiwKKzB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsCisweEQyNUUwMDA5LCAweEU2MDFENzVCLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDUyNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTUzLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHg5Mjg5NzEwMiwgMHhEMjQ2MkUyMSwgMHg1RTIzRDc0RSwgMHg2NEYyMkZFMiwKKzB4NjA0MzY1RjIsIDB4MjcwMEM5ODAsIDB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsCisweEM5MDM2MDQzLCAweDgwNzI0NTE5LCAweDY1RjI2MDVDLCAweDgxNzI2NkYyLAorMHg0NjE5NDYyOSwgMHg2MDZDNDUyOSwgMHg0MDE4NjQ1QywgMHg4MTczMzA0QywKKzB4MjExODVFMjMsIDB4NjRGMjJGRTIsIDB4NkU0QzYyRjIsIDB4NjAyQzQyMTksCisweDY2RjI2MkYyLCAweDQ2Mjk0MDE4LCAweDQ2MTkzMEVDLCAweDQyMjk4MTc0LAorMHg2NTJDNjA2QywgMHgzMDVDNDAxOCwgMHg4MTc1OEYwNywgMHgwMDA5QkM5NiwKKzB4MjIyODYyMEMsIDB4QTAwQTg5MDgsIDB4NjAxMzAwMDksIDB4OEIwMzg4NDAsCisweDAwMDlCMDA5LCAweDAwMDlBMDAzLCAweEUyMDJENjJGLCAweDdGMDQyNjIyLAorMHgwMDBCNEYyNiwgMHg0RjIyNkVGNiwgMHg4NTUyRDUyQSwgMHg4ODMwNjAwRCwKKzB4ODgzMTg5MDMsIDB4QTAzNDg5MjMsIDB4ODU1NTAwMDksIDB4RDQyOEQ3MjcsCisweDg1NTMyNzAxLCAweDYxMERENjI3LCAweDI0MTI0MTE4LCAweDQ2MEJENDI2LAorMHhENzIzMDAwOSwgMHhEMjI2RDQyNSwgMHg2NTcyNDIwQiwgMHhFMjMwRDEyMCwKKzB4NDIyODY3MTIsIDB4MjcyOUU2MjAsIDB4Mzc2MDQ2MjgsIDB4RDYyMThCMDMsCisweEEwMTZFMjAwLCAweEQ2MUYyNjIyLCAweEEwMTJFMjAyLCAweEQxMTgyNjIyLAorMHg2MjEyRTUzMCwgMHhFNjIwNDUyOCwgMHg0NjI4MjI1OSwgMHg4OTA4MzI2MCwKKzB4RDQxQUQxMTksIDB4RTYwMUQ1MTMsIDB4MjE2MDQ1MEIsIDB4NDcyQkQ3MTgsCisweDRGMjY0RjI2LCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLCAweDAwMjAzOUU0LAorMHgwMDFFMTAwMCwgMHgwMDIwMzlEMCwgMHgwMDIwM0UwNCwgMHgwMDIwM0UxMCwKKzB4MDAyMDNEQTgsIDB4MDAyMDM5QjgsIDB4MDAyMDNERDgsIDB4MDAyMDNERDYsCisweDAwMjAzREFBLCAweDAwMjAzOTlDLCAweDAwMjAzOUM4LCAweDAwMjAzOUI0LAorMHgwMDIwMzlCMCwgMHgwMDIwMThBMiwgMHgwMDIwM0IyNCwgMHgwMDIwM0IyOCwKKzB4MDAyMDE4RUUsIDB4MDAyMDM5Q0MsIDB4MDAxRTEwMEIsIDB4MDAyMDNCM0MsCisweDAwMTE0MDA0LCAweDRGMjIyRkU2LCAweERFOTY3RkZDLCAweDIwMDg4NEU5LAorMHgyRjAwOEQwNiwgMHhENjk1RDQ5NCwgMHgwMDA5NDYwQiwgMHg2NEYwQjE5QSwKKzB4NjYyMEQyOTMsIDB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsCisweDAwMEI0RjI2LCAweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFOEQ0RjIyLAorMHg2MEUwRDY4RCwgMHhDQkMwRDQ4RCwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywKKzB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksCisweEQ2ODc2MTZELCAweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLAorMHgzMjEzNjI1RCwgMHhEMjgzOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwKKzB4NEYyNjgwRTIsIDB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDYyNjBENjdELCAweDg5NDQyMjI4LCAweEQ1NzJFMTAwLCAweDYwNTAyNjEwLAorMHhDQjQwRDQ3QSwgMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywKKzB4NzEwNDYxMkMsIDB4MkYxMUEwMDYsIDB4RDQ3NUQ2NkQsIDB4REQ3NTY3NjAsCisweDY1N0M0RDBCLCAweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNjdENDcyLAorMHgwMDA5NDIwQiwgMHg0RDIxNEQyMSwgMHhBMDA1RDc3MCwgMHg2NkU2RTQwMCwKKzB4MzU3QzQ1MDgsIDB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2QzhCRjcsCisweDYxNzJFMDAzLCAweDgxMTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLAorMHhENDY4NjE3MiwgMHhERDY4ODExMywgMHg0RDBCREU2OCwgMHhFMjAxNjU3MiwKKzB4RDQ2NzJFMjIsIDB4NDIwQkQyNTUsIDB4RDY1NjAwMDksIDB4QzkzRjYwNjAsCisweDdGMDQyNjAwLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjVGNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywKKzB4MjAwODZENjMsIDB4NjQwMzhEMUMsIDB4RTUwRUQxNDksIDB4MzI1MjYyMTAsCisweDYwQzM4OTE2LCAweDgwNDEyNEIwLCAweDgxNDE2MEQzLCAweEEwMDdFNTAwLAorMHg2NTVENjFCQywgMHgwMEVDNjA1MywgMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwKKzB4MzIxMzYyNUQsIDB4RDYzQjhCRjUsIDB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsCisweEQyM0FENDRELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwKKzB4NzIwMjYyRjMsIDB4MjI1MTJGNDEsIDB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsCisweEU1QzRFNjgyLCAweDY3RjM4MTIxLCAweDY1NUM2NjZDLCAweEU0MDhCRkI2LAorMHg0RjI2N0YzQywgMHgwMDA5MDAwQiwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsCisweDZCMTM2Q0NELCAweERFMzZENzM1LCAweEVERkY2NEYzLCAweEQ4MzVFQTA0LAorMHg2MDUzNjU1QywgMHgwMjdENDAwMCwgMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwKKzB4MDlFRDYwNjMsIDB4MjQ5MTAyN0QsIDB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsCisweDM5Mjg2MjJELCAweDc0MDIyODkyLCAweDc1MDE3MTA0LCAweDYwNjM2MjVDLAorMHgwN0Q1MzJBMiwgMHgwRUI1OEZFNCwgMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwKKzB4NjdGM0U1QzUsIDB4QkY3OTY2NkMsIDB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEQxMUU2OEY2LAorMHg2MDEyRDIxRSwgMHhDQjIwRTQwNSwgMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwKKzB4MDAwMDIyNTIsIDB4MDAxRTEwMTcsIDB4MDAyMDNCNDAsIDB4MDAyMDE4QTIsCisweDAwMjAzOTBFLCAweDAwMUUxMDE1LCAweDAwMUUxMEJGLCAweDAwMTE3ODAwLAorMHgwMDFFMTBGQywgMHgwMDIwMDYxMCwgMHgwMDIwMzkxNCwgMHgwMDIwMkFFQSwKKzB4MDAyMDNCNDQsIDB4MDAyMDE4RUUsIDB4MDAyMDNCNjAsIDB4MDAxMTc4OEMsCisweDAwMjAzOTEwLCAweDAwMjAzNEY0LCAweDAwMjAxNTMwLCAweDAwMUUyMTMwLAorMHgwMDIwM0I2OCwgMHgwMDIwMkFBQywgMHgwMDIwM0I2QywgMHgwMDIwMzk3NCwKKzB4MDAyMDM5N0MsIDB4MDAyMDNEQTQsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsCisweEQ1NjREMTYzLCAweEU0MDBENzY0LCAweDIxNDJFMjBGLCAweDE3NDExMTU0LAorMHhENTYyMjcyMiwgMHg5NjY5RDc2MiwgMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwKKzB4RTYwMTE1NjUsIDB4RDU1RjExNjUsIDB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NjIyNTQyLCAweDc2MDFFNzI3LAorMHg2NzYzMjU3MiwgMHgyNTYyNzc5NywgMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwKKzB4RTIxOTI1MjIsIDB4RTI3MDI1MjIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1MjIyNTQyLCAweDI1MjJFMjBDLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwKKzB4MDAwOTQyMkIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsCisweDZFNDM4RDAyLCAweDAwMDlCRTY3LCAweEM4MTA2MEUzLCAweEJFNjQ4OTAxLAorMHg2MEUzMDAwOSwgMHg4OTAxQzg0MCwgMHgwMDA5QkU4NiwgMHhDODAxNjBFMywKKzB4REQzRDg5MzgsIDB4QzgwMjYwRDAsIDB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsCisweDYwRjAwMDA5LCAweDg5MDJDODA0LCAweDQ2MEJENjM5LCAweDYyRjAwMDA5LAorMHhDODgwNjAyMywgMHg2MEQwODkwMiwgMHgyRDAwQzk3RiwgMHhDODAxNjAyMywKKzB4RDYzNDg5MDYsIDB4MDAwOTQ2MEIsIDB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsCisweDg5MDJDODA4LCAweDQ2MEJENjMwLCAweDYwRjAwMDA5LCAweDg5MDJDODEwLAorMHg0MjBCRDIyRSwgMHhENTJFMDAwOSwgMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywKKzB4QTAwNUU2MDQsIDB4ODgwMTIyNjAsIDB4RDIyQThCMDIsIDB4MjI2MEU2MDEsCisweDI1MjJFMjAwLCAweEM4ODA2MEUzLCAweEQyMjc4OTJELCAweDYwRTM2RTIwLAorMHg4OTAyQzg4MCwgMHg0MjBCRDIyNSwgMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwKKzB4NDIwQkQyMjMsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsCisweDYwRTMwMDA5LCAweDg5MERDODA0LCAweEREMjBEMTFGLCAweDAwMDk0MTBCLAorMHgwMDA5QkYwRCwgMHgwMDA5QkY0QywgMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwKKzB4MjVEMkJGODUsIDB4QzgwODYwRTMsIDB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsCisweDQyMkI2RUY2LCAweDdGMDQ2REY2LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgwMDFDNTgxQywgMHhBMDAwQTAwMCwgMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwKKzB4MDAwNDAwMjEsIDB4MDAxQzU4OUMsIDB4MDAxRTEwMjEsIDB4MDAyMDFBOTAsCisweDAwMjAxQUIyLCAweDAwMjAyMTE0LCAweDAwMjAxQUNBLCAweDAwMjAxQUQ4LAorMHgwMDIwMzlDOCwgMHgwMDFFMTAwQiwgMHgwMDFFMTAyOCwgMHgwMDIwMUI0NCwKKzB4MDAyMDFCNTAsIDB4MDAyMDFBRTAsIDB4MDAyMDFBRkUsIDB4MTIzNDU2NzgsCisweDAwMUUxMDAwLCAweDAwMTBGMTAwLCAweDAwMjAxQjJDLCAweDY0NENENkE3LAorMHgwMDBCMzQ2QywgMHhENkE2MjQ1MCwgMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwKKzB4NjQ0Q0Q2QTQsIDB4MDAwQjM0NkMsIDB4NjI1QzI0NTAsIDB4NDIwODYxNkQsCisweDQyMDg0MTE5LCAweDQyMDA2MDE5LCAweDY3MEU2MTRDLCAweEQ0OUUzMjFDLAorMHg0MjAwMjA3RCwgMHgzMjRDQzkwRiwgMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywKKzB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsCisweDJGRTYyMjYwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLAorMHhFMjlGNjY2RCwgMHgyNzI5NDYxOSwgMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywKKzB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsCisweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDA3MUEwNDY3LCAweDIxNTAyNTdCLAorMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwKKzB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsCisweEU1MEY4QjczLCAweEU0MDFCRkEyLCAweEJGQTRFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkZBNCwgMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwKKzB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsCisweEJGQUI2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLAorMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwKKzB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODIsIDB4NDYxOEU2MDIsCisweDgxRjY2MDYzLCAweEJGODBFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLAorMHhFNTAwQkY4QywgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwKKzB4RTAxMDY1NUMsIDB4QkY2MUU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsCisweDA1RkNFMDEwLCAweEJGNjNFNDBFLCAweEU1MDA3NTg1LCAweEJGNjRFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjcxRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywKKzB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsCisweEU1MDRCRjQ5LCAweDA1RkNFMDE0LCAweEJGNDlFNDBGLCAweEU1MDE3NTg0LAorMHhCRjRBRTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsCisweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLAorMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwKKzB4RTQwMUJGMUMsIDB4QkYxRUU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRjFFLCAweEJGMUJFNDAxLCAweEU0MDFFNTA2LCAweEJGMUM2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjI5NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywKKzB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsCisweEU1MTJCRjAxLCAweEU0MDI4NEY0LCAweEJGMDE3MDkwLCAweEU2NDA2NTAzLAorMHhCRjAyRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsCisweEU1MTM4MEY4LCAweEU0MEVCRUU3LCAweEU0MEU4NEY4LCAweEJFRTc3MDg1LAorMHhFNTAwNjUwMywgMHhCRUU4RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsCisweEJFQ0JFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNELCAweEU0MEY4NEZDLAorMHhCRUNENzA4MywgMHhFNTAxNjUwMywgMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwKKzB4QkVEQkU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsCisweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDJGLAorMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwKKzB4MDAyMDM5QzIsIDB4MDAyMDM5QzQsIDB4MDAyMDM5QzYsIDB4RDIxREQxMUMsCisweDY2MjA2MDEwLCAweDY3NkM3MDAxLCAweDM3MDBDOTBGLCAweEU1MDA4RDEzLAorMHg2NzEwNjIxMCwgMHg3NzAxNjIyQywgMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwKKzB4NDQwODQ0MDgsIDB4MzQyOEM5MEYsIDB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsCisweDQ0MDgyNjIwLCAweDAwMEIzNTRDLCAweEQxMEY2MDUzLCAweDI1NTg2NTEwLAorMHhFNjAwOEQxMywgMHhENjBERDQwQiwgMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywKKzB4Mzc1ODQ3MDgsIDB4NDcwODY1NDAsIDB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsCisweDI0MDBDOTBGLCAweDcyRkY2MjEwLCAweDAwMEIyMTIwLCAweDAwMDA2MDYzLAorMHgwMDIwMzkwRCwgMHgwMDIwMzkwQywgMHgwMDIwMzkwRSwgMHgwMDIwMzUzNCwKKzB4N0ZGQzRGMjIsIDB4RTY4MEQxOUYsIDB4NjY2QzYyMTIsIDB4RDI5RTJGMjIsCisweDY3RjM2NTYzLCAweDQyMEI3NTQyLCAweDdGMDRFNDA0LCAweDAwMEI0RjI2LAorMHhFNjgwMDAwOSwgMHhEMjk4NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwKKzB4RTY4MDY0NzMsIDB4RDI5NDY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsCisweDJGODY2NDczLCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkNDNEYyMiwgMHhEQzhFRDI4RCwgMHg3MjAxMUYyMSwgMHhEQjhEMUYyMiwKKzB4RDE4RURFOEQsIDB4NjYxMjUyMTEsIDB4OEIwMTM2MjAsIDB4MDAwOUEwRTUsCisweEM5MDM2MDYxLCAweDhCMDE4ODAxLCAweDAwMDlBMERGLCAweEQyODhENDg3LAorMHhFRDg0NDIwQiwgMHgyRjAyNTUwMywgMHgzMEQwODQ1QywgMHhBMEI4ODkwMSwKKzB4RDE4NDAwMDksIDB4NjI2QzY2MTAsIDB4ODgwMTYwMjMsIDB4RDE4MjhCNjgsCisweDYyMTAxRkMzLCAweDg5NUIyMjI4LCAweEUwMDNENDgwLCAweDQwMTg2NzQyLAorMHg2ODQyMTc3MiwgMHhENTdFRTkwMCwgMHg4MTgxNkRCMywgMHg3RDA0MjE5MCwKKzB4NjdEMjZBQjIsIDB4NjRFMjY4NTIsIDB4MUY0OTFGNTcsIDB4NzQwNDY0RTMsCisweDFGQTQ2NTQyLCAweDY1NDMxRjVBLCAweDYyNTI3NUY4LCAweDFGNzYxRkQ1LAorMHg2RDUzMUYyQiwgMHhEQTc0RDc3MywgMHg3RDk0RDI3NCwgMHg2OEQyMUY4OCwKKzB4NkFBMjY5NzIsIDB4RDE3MjYwMjIsIDB4MjIwMkNCMjAsIDB4RTE0MDFGMUMsCisweDc2MDFFNjAwLCAweDMyMTM2MjZELCAweDU2RjQ4QkZCLCAweDUyRjY1MUY1LAorMHgyMTIyMkI2MiwgMHg1MkY4NTFGNywgMHgyMTIyNTZGOSwgMHgyRTYyNTFGQSwKKzB4NTFGQjI0MTIsIDB4MkQ4MjI1MTIsIDB4RDk2NjI3OTIsIDB4MjlBMkRENUYsCisweDZBRDJEOTY1LCAweEQ5NjQ2ODkyLCAweDY4RDIxQTg0LCAweDYwODFEQTYzLAorMHgyODAxQ0IwMSwgMHhEODYyNjZEMiwgMHgyQTYyMjk2MiwgMHhFRDAxNUFGQywKKzB4MkFEMjQ4MEIsIDB4MkFEMjREMTgsIDB4NjJEMkRENUUsIDB4MkQyMjcyMDEsCisweEQxNTA1NkYzLCAweEUyMDI2MDYyLCAweDI2MDJDQjAxLCAweDIxMjBBMDNELAorMHg4QjNBMjIyOCwgMHhFNDAxREQ1OCwgMHgyMTQwRTYwMCwgMHhFMDFDMkQ2MiwKKzB4QzgwMTAwNUMsIDB4RDQ1NThCMEEsIDB4RTYwMEQ3NTUsIDB4RUQ3RDI0NzIsCisweDYyNkM3NjAxLCAweDhCRkIzMkQzLCAweDI0RDJERDUyLCAweEUyRkU2OEMyLAorMHgyQzgyMjgyOSwgMHgwOTVDRTAxRSwgMHhFMDFGNURGMSwgMHgwQTVDMkQ5MCwKKzB4NzUxMDUxRjIsIDB4RUQwNjIxQTAsIDB4RDc0QkU2MDAsIDB4ODQ1NkQ0NEIsCisweDI3MDA3NjAxLCAweDY5NkM2ODU0LCAweDI0ODAzOUQzLCAweDhGRjY3NDAxLAorMHhEQTQ3NzcwMSwgMHgyQTEwRTE5NCwgMHhFMjAwN0EwMSwgMHg3QTBGMkEyMCwKKzB4RDEzMEU4MDUsIDB4NjYxMDJBODAsIDB4NjAyMzYyNkMsIDB4ODkwODg4MDEsCisweEQyNDBENDJBLCAweDQyMEI2NUYyLCAweEQxMzFFRDAxLCAweEFGMzA0RDE4LAorMHg2NUYyMjFEMiwgMHg4NTUzRDQzQywgMHg2MjBENjY0MiwgMHg4OTA3MzI2MiwKKzB4RDEzQkQ0M0EsIDB4MDAwOTQxMEIsIDB4RTYwMUQ3M0EsIDB4Mjc2MkFGMUEsCisweEQxMzRENDFFLCAweDQxMEI2NUYyLCAweEQxMjVFRDAxLCAweEQ2MzdENDM2LAorMHg0NjBCNEQxOCwgMHhBRjBEMjFEMiwgMHg3RjM0MDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyNDVDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDFDM0I5QywgMHgwMDFDMzcwNCwgMHgwMDIwMzUyQywKKzB4MDAyMDE0QTAsIDB4MDAyMDM5MUQsIDB4MDAyMDM5MUMsIDB4MDAyMDM5MTgsCisweDAwMUMzRDk4LCAweDAwMUMzQkI0LCAweDAwMUM1OTYwLCAweDAwMUMzNTAwLAorMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwgMHgwMDIwMzUwNCwgMHgwMDFDM0QwMCwKKzB4MDAyMDE2MEMsIDB4MDAxMTc3MzAsIDB4MDAyMDM5MjAsIDB4MDAxQzU4MkMsCisweDIwMDBBMDAwLCAweDAwMDBBMDAwLCAweDAwMTE3NzhDLCAweDAwMTE3NzkyLAorMHgwMDExNzc4OCwgMHgwMDIwMTRDQywgMHgwMDIwMzhGNCwgMHgwMDIwMzRGNCwKKzB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsIDB4MDAyMDNEODQsIDB4MDAyMDE4QTIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwgMHgxRjQyODFGMiwKKzB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsIDB4NDYwQkRFOTksCisweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLCAweEEyM0U4QjAxLAorMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwgMHg1MjUzMDAwOSwKKzB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsIDB4NEIwQkRCOTAsCisweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLCAweDJFMDJFMTAwLAorMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwgMHhBMTU3OEIwMSwKKzB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsIDB4ODVFMjIyNkQsCisweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELCAweDQwMjE0MDIxLAorMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwgMHhDOTAxRDE3RiwKKzB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsIDB4MjEyMEUyMDAsCisweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLCAweDY1QTI4QjBBLAorMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwgMHg5MTlCMjUyMSwKKzB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsIDB4RDQ3MzhCMDcsCisweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LCAweEQ1NzA2NDczLAorMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwgMHgzNjJDNDIwMCwKKzB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsIDB4RDI2OTg5MTEsCisweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LCAweDgxRjgyMEJELAorMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywgMHhBMDI3OEIxQiwKKzB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsIDB4NjcwRTYwMTksCisweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LCAweDYwNDNEMjVCLAorMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwgMHg2MEMzODFGOCwKKzB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsIDB4NjA0M0QyNTQsCisweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLCAweDgxRjg2NDVDLAorMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwgMHhFNkRDNjIwMywKKzB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsIDB4NjIxMEQxNDksCisweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLCAweDM1QjA2QkJDLAorMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwgMHg1NDAzNjQwMywKKzB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsIDB4QkVBRThCMDEsCisweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLCAweEQxM0QyREMyLAorMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwgMHgyQjAyOEYwOCwKKzB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsIDB4NjQ3MzQyMEIsCisweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLCAweDIwQjlFQkZDLAorMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwgMHg0NTA4ODVGOCwKKzB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsIDB4NDAwODQwMDgsCisweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLCAweDQxMThFMTA4LAorMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwgMHg2N0EyODEyMSwKKzB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsIDB4RUNFNzg1RTIsCisweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LCAweDdFMDMwMDA5LAorMHgwMDFDM0QzMCwgMHgwMDIwM0Q5MCwgMHgwMDIwMzUwNCwgMHgwMDFFMjEyQywKKzB4MDAyMDMzRTgsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsIDB4MDAyMDE0QTAsCisweDAwMjAxNjZDLCAweDAwMTE3NzBDLCAweDAwMjAzOTFDLCAweDAwMjAzOTFELAorMHgwMDIwMzkxOCwgMHgwMDIwMThBMiwgMHgwMDFDMzZGOCwgMHgwMDIwMzk5MCwKKzB4MDAyMDNEQTAsIDB4MDAyMDNCODQsIDB4MDAyMDNDMDQsIDB4MDAyMDNDODQsCisweDAwMjAzRDA0LCAweDAwMjAzOTA4LCAweDAwMjAzNEZDLCAweDAwMjAxNENDLAorMHgwMDIwMzk5NCwgMHgwMDIwMzk5OCwgMHgwMDIwMjQ1QywgMHgwMDIwM0Q4OCwKKzB4MDAyMDNEOEMsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksCisweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LAorMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwgMHg2NUUyREU4NywKKzB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsIDB4MjYyMkFFODMsCisweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLCAweDQyMEIwMDA5LAorMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywgMHg0OTE4RTkwOCwKKzB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsIDB4N0IwMUQ5N0MsCisweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LCAweEQ0NzkyQzEyLAorMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwgMHg0QjE4RUIwRiwKKzB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsIDB4MjAyOUUyRkMsCisweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLCAweDIwMjk5NEEzLAorMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwgMHg0NzE5Njc3RCwKKzB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsIDB4ODgwMTQ5MTgsCisweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLCAweDY2MEQ4NUUzLAorMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwgMHgyNjJEMzIyQSwKKzB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsIDB4RTYwMDJDNkIsCisweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELCAweDhEMEUzMjcwLAorMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwgMHgwMUM1QTAwNywKKzB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsIDB4NjA0MzQ0MDAsCisweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLCAweDg5MDczNjcwLAorMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwgMHgyQjIwMjFDMSwKKzB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsIDB4REM0NzI1MDEsCisweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLCAweDU0RjJEMjQ0LAorMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwgMHg0MjBCMkM1MiwKKzB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4NjcwM0U5MDgsCisweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLCAweDhGMEJEOTMyLAorMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywgMHg4QjAzODgwOCwKKzB4RTUwMUJENEQsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsIDB4QkQ0Njg5MDEsCisweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLCAweDg1RjIyREMyLAorMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwgMHhBREE5N0EwOCwKKzB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLCAweEQyMjM0RjIyLAorMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkY5MjJFMiwgMHhFMjQwMDAwOSwKKzB4MkUyODQyMTgsIDB4QkMwNDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwNUM4MTAsCisweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQzAzLCAweEM4MDU2MEUzLAorMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHhBQzAwNEYyNiwKKzB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsIDB4MDAxMTc3NjAsCisweDAwMjAxNEEwLCAweDAwMjAxNjZDLCAweDAwMjAzNDk0LCAweDAwMjAzREE0LAorMHgwMDIwMzkwOCwgMHgwMDIwMzRGQywgMHgwMDIwMTRDQywgMHgwMDIwMzk3NCwKKzB4MDAyMDM5N0MsIDB4MDAyMDM5NzAsIDB4MDAyMDM5NzIsIDB4MDAyMDE1MzAsCisweDAwMjAxOEVFLCAweDAwMjAzOTk0LCAweDAwMDA4MDAwLCAweDAwMUMzNTEwLAorMHgwMDIwM0Q5OCwgMHgwMDIwMThBMiwgMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwKKzB4MUExQzFFMjAsIDB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsIDB4MjYyODJBMkMsCisweDNBM0MzRTQwLCAweDZDNjI1NjQ4LCAweDQxMTEyRjI2LCAweEUyMjA4RjE4LAorMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywKKzB4MDAwOTAwMDksIDB4MDAyMDM0MTIsIDB4MDAyMDMzQzgsIDB4MDAwQkUwMDAsCisweDQwMDA2MkY2LCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMjg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwKKzB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTAzLCAweDAwMEI0MDA1LCAweEM5MDE2MkY2LAorMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwgMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywKKzB4MjA2Qzc1NEEsIDB4MzIyMDMxMjAsIDB4MjAzODMwMzAsIDB4MzIzQTMxMzIsCisweDM0MzMzQTM4LCAweDAwMDAwMDAwLCAweDAwMDAwRDBBLCAweDAwMDAwMDQzLAorMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywKKzB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsCisweDYxNzY2RTQ5LCAweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLAorMHgyMDc5NjU2QiwgMHgwMDIxNDQ0OSwgMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwKKzB4NjU3NDY5NzIsIDB4NjQ2MTIwMkMsIDB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsCisweDAwMDAwMDNELCAweDAwMDAwQTBELCAweDQzNUY0RDVBLCAweDQ2NUY0NDRELAorMHg0QzQ0NUY1NywgMHg0OTRFNDk1RiwgMHgwMDAwMDA1NCwgMHg2RTZCNkU1NSwKKzB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsCisweDIwM0EzMDUxLCAweDAwMDAwMDIwLCAweDIwM0EzMTUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsIDB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwgMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsIDB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsCisweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNzU3MzVGLAorMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwKKzB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsIDB4NzI2MzczNjUsCisweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLCAweDAwMDAwMDQ3LAorMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLAorMHg3NTZGNkU2NSwgMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwKKzB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLAorMHgwMDA0MDlGQSwgMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwKKzB4ODIwNTA3MDAsIDB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsCisweDQwMDMwNDA1LCAweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLAorMHgwNDAwMDAwNCwgMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwKKzB4NDAwMjgyMDUsIDB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsCisweDAwMDA0MDAyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xNTkzNjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dWluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgwZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1aW5pdC5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDdGRkM0RjIyLCAweEQ2OTVENDk0LCAweDAwMDk0NjBCLAorMHhENDk0RTU3MCwgMHg0NTE4QjAxRSwgMHg4OTA0MjAwOCwgMHhENjkwRDQ5MiwKKzB4NDYyQjdGMDQsIDB4QjAxMjRGMjYsIDB4RDI5MDAwMDksIDB4NDIwQkQ0OTAsCisweEU2MDAwMDA5LCAweDk0OUFENThGLCAweEM4NDA2MDUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY0MiwgMHg3RjA0NzYwMSwgMHgwMDBCNEYyNiwgMHhEMjhBMDAwOSwKKzB4MDAwOTQyMkIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RDY4NzdGRUMsCisweDYyNjA2MUYzLCAweDJGMjA4NDYxLCAweDg0NjI4MEYxLCAweDgwRjI3MTEwLAorMHg2RDQzODQ2MywgMHg4NDY0ODBGMywgMHg4MEY0NjQxMywgMHg2QzUzODQ2NSwKKzB4ODQ2NjgwRjUsIDB4ODBGNkU1MDAsIDB4RDc3RDg0NjcsIDB4ODQ2ODgwRjcsCisweDgwRjhFRTA0LCAweDgwRjk4NDY5LCAweDgwRkE4NDZBLCAweDgwRkI4NDZCLAorMHg4MEZDODQ2QywgMHg4MEZEODQ2RCwgMHg4MEZFODQ2RSwgMHg4MEZGODQ2RiwKKzB4NjY1MzY1NUMsIDB4NzUwMTM2N0MsIDB4NjY1QzYyNjAsIDB4MjQyMDM2RTMsCisweDc0MDE4RkY2LCAweDY2RjMyRjE2LCAweEU3MTA3NjA0LCAweEIwMEQ2NUMzLAorMHg2RTAzNjREMywgMHhENDZCN0YwNCwgMHg0MjBCRDI2QiwgMHg2MEUzNjUwMywKKzB4NEYyNjdGMTQsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDNGM0M5MzNBLCAweDQxMDhFMTQxLAorMHgzMUZDRTIwMCwgMHgxMTczMzUyNiwgMHgyMTUyMTE2MiwgMHgxMTQxOEQwMiwKKzB4RTBGRkEwOTgsIDB4NEExOEVBMDEsIDB4MjYyMDY2RjMsIDB4MzJBMjcyMDEsCisweDc2MDE4RkZCLCAweDZCRTNFRTAwLCAweEUwNDQ2Q0YzLCAweDAwRkU0MDA4LAorMHg0NTBCRDU1NiwgMHg2NjAzNjFCMywgMHg0MDA4RTA0MywgMHg2REMwMDRGRSwKKzB4MDE0QzYwNjMsIDB4MzFFQzNFREMsIDB4NjBFMzZFMUMsIDB4N0IwMTA3RkMsCisweDJDNzAzQkEyLCAweDhGRTgwRkQ0LCAweEUwNDI3QzAxLCAweEVCMDA0MDA4LAorMHg3MEZDMDdGRSwgMHg2RUIzNkNCMywgMHhBMDIwMEFGRSwgMHgyNzEwRURGRiwKKzB4N0MwMUZFRTAsIDB4NjBDMzZDQ0MsIDB4NjU3MDAyRkMsIDB4NkJCQzNCMkMsCisweDAxRkM2MEIzLCAweDBGMTQ2MEMzLCAweDBGMjQ2MEIzLCAweDA0RkM2MEMzLAorMHgzNDJDN0UwMSwgMHgwMUZDNjA0QywgMHgyNTFBNjJEMywgMHhENDNDMjI1QSwKKzB4Mjc1MDYwMkMsIDB4MDY0RTQwMDgsIDB4MkQ2QTREMTksIDB4M0VBMjc3MDEsCisweDY2RDc4QkRGLCAweDQwMThFMDAxLCAweDBGNjQ2NTYzLCAweDcwMDE0NTE5LAorMHgwRjU0NDYyOSwgMHgwRjY0NzAwMSwgMHg3MDAxNDYxOSwgMHg5MDQyMEY2NCwKKzB4RTA0NTBFRkUsIDB4RUEwMTQwMDgsIDB4RTA0NjBGRjYsIDB4NEExODQwMDgsCisweEVEMDA2N0YzLCAweDBGRjYzN0FDLCAweDBGRjY3MDA0LCAweEUzNDVFMTA0LAorMHg3QzAxNDMwOCwgMHg2Q0NDMzNGQywgMHg2MEMzNjQzMiwgMHg1NTMxMDI0QywKKzB4NkJCQzNCMkMsIDB4MDQ1QzYwQjMsIDB4NjBDMzVBMzIsIDB4NjBCMzBBNDQsCisweDYwQzMwRjI0LCAweDZBNzAwNkZDLCAweDYwNkMzNjJDLCAweDY2RTAwNUZDLAorMHg2QTVDNjRBQywgMHg2MjZDMjRBQSwgMHg4OTA1MzQyMCwgMHg0RDA4NEQwOCwKKzB4Q0IwNDYwRDMsIDB4NjAwQkEwMDYsIDB4N0QwMTQxMTAsIDB4OEZENjc3MDEsCisweEUwMDA3RTAxLCAweDNGM0M5MzA4LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHgwMDBCNkJGNiwgMHgwMTM4NkFGNiwgMHgwMDAwMDEyMCwgMHgwMDIwMEQ1NCwKKzB4MDAyMDAyQkUsIDB4MDAxMDI4MDAsIDB4MDAyMDBENjQsIDB4MDAxMEYwMEEsCisweDAwMTBGMDAwLCAweDAwMUMwMDFDLCAweDAwMTAzMjUyLCAweDAwMjAwREEwLAorMHgwMDEwRkZGQywgMHgwMDIwMEQ3QywgMHgwMDIwMDMyQywgMHgwMDIwMDM3MCwKKzB4MDAyMDA5NTQsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkYyLAorMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhFNTAwNkNGNiwKKzB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsIDB4QUZFMzhCRkEsCisweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLCAweDYwNDNFRTBBLAorMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwgMHhFNjMwRTYzNywKKzB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsIDB4MDAwQjgwMjgsCisweDRGMjI2RUY2LCAweEJGRTQ3RkVDLCAweEJGRDg2NUYzLCAweDdGMTQ2NEYzLAorMHgwMDBCNEYyNiwgMHg0RjIyRTAwMCwgMHhCRkRBN0ZFQywgMHg2NEYzNjVGMywKKzB4NzQwNkJGQ0QsIDB4NEYyNjdGMTQsIDB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsCisweDYyNTM3RkVDLCAweDY1RjM2RTQzLCAweDY0MjNCRkNCLCAweDY0RTNCRkJGLAorMHg2NEYzQkZCRCwgMHhCRkJBRDQwMywgMHg3RjE0MDAwOSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAyMDBEQjAsIDB4ODkwMDQwMTEsIDB4NDExMTYwMEIsCisweDRGMjI4OTA2LCAweDYxMUJCMDA0LCAweDAwMEI0RjI2LCAweDAwMDk2MDBCLAorMHg2MjBEMkYyNiwgMHg4RjQxMzAyMCwgMHg0MDE4MDAxOSwgMHg4QjBEMzAxNiwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDg5MDA2MkY2LCAweDQxMTkzMTBDLCAweDYwMTMwMDBCLCAweDQxMjk2MjE5LAorMHgyMDA4NDAxOCwgMHgzMTA0ODkyNywgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDYxMTkzMTA0LCAweDMyMDQyMjFELCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4ODkwMDMyMDQsIDB4NDIyOTMyMEMsCisweDAwMEI2MDIzLCAweEUwMDA2MkY2LCAweDYyRjYwMDBCLCAweDQyMjg2MjEzLAorMHg0MjI0NDEyOSwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwKKzB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LAorMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwKKzB4ODkwMDMxMDQsIDB4NjAxMzMxMEMsIDB4NjJGNjAwMEIsIDB4MkYyNjJGMTYsCisweDUxRjU1MkYzLCAweDUyRjIyMTI5LCAweDUyRjQxMjEwLCAweDIxMjk1MUY2LAorMHgxMjExNTJGMiwgMHgwMDBCNjJGNiwgMHgwMDAwNjFGNiwgMHg1MUYzMkYxNiwKKzB4MzEwMDUwRjEsIDB4NTFGNDhCMDIsIDB4MzEwMDUwRjIsIDB4MDAwQjAwMjksCisweDAwMDA2MUY2LCAweDUxRjMyRjE2LCAweDMxMDA1MEYxLCAweDUxRjQ4QjA2LAorMHgzMTAwNTBGMiwgMHhDQTAxMDAyOSwgMHg2MUY2MDAwQiwgMHgwMDBCRTAwMSwKKzB4MDAwMDYxRjYsIDB4NTBGMDAwMEIsIDB4MkYyNjJGMTYsIDB4RTEwMDUyRjIsCisweDEyMDAxMjExLCAweDAwMEI2MkY2LCAweDAwMDA2MUY2LCAweDJGMTYyRjA2LAorMHg4QjI2NDExNSwgMHgzMTAzRTA0MCwgMHgyRjI2ODkyQiwgMHg1MkY2MkYzNiwKKzB4RTAyMDUzRjUsIDB4OEIwNTMxMDMsIDB4RTMwMDYyMzMsIDB4ODkwOTMxMDAsCisweDMxMDhBMDAyLCAweDhCMEYyMzM4LCAweEQwMDY0RjIyLCAweDYwMjM0MDBCLAorMHg0RjI2NjIwMywgMHgxMTIxNTFGNCwgMHg2M0Y2MTEzMCwgMHg2MUY2NjJGNiwKKzB4NjBGNjAwMEIsIDB4MDAyMDA3RjQsIDB4NDEwMEM3MDksIDB4MDEyMzAxMUQsCisweDUxRjIwMDA5LCAweDExMDE1MEY0LCAweDExMDA1MEYzLCAweDAwMEI2MUY2LAorMHg1MUYyNjBGNiwgMHgxMTAxRTAwMCwgMHg2MUY2MTEwMCwgMHg2MEY2MDAwQiwKKzB4MDEzMDAwMDAsIDB4MDEyODAxMkMsIDB4MDEyMDAxMjQsIDB4MDExODAxMUMsCisweDAxMDYwMTBBLCAweDAwRkUwMTAyLCAweDAwRTIwMEU2LCAweDAwREEwMERFLAorMHgwMENDMDBEMCwgMHgwMEM0MDBDOCwgMHgwMEE4MDBBQywgMHgwMEEwMDBBNCwKKzB4MDA4QzAwOTAsIDB4MDA4NDAwODgsIDB4MDA2NjAwNkEsIDB4MDA1RTAwNjIsCisweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQzMjg2MTMzLAorMHg0MzA4NDMxOCwgMHg0MjI4NDMwOCwgMHg0MjA4NDIxOCwgMHg0MTA5NDIwOCwKKzB4QUZBRjQxMDksIDB4NDMwMDIyMUIsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsCisweDYxMzM0MjI0LCAweDQzMTg0MzI4LCAweDQyMTg0MjI4LCAweEFGQTE0MTE5LAorMHg0MzAwMjIxQiwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwgMHg2MTMzNDIyNCwKKzB4NDMwODQzMjgsIDB4NDIyODQzMDgsIDB4NDIwODQyMDgsIDB4NDEwOTQxMTksCisweEFGOEY0MTA5LCAweDQzMDAyMjFCLCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LAorMHg2MTMzNDIyNCwgMHgyMTJENDMyOCwgMHg2MjEzQUY4NCwgMHg0MjI0NDMwMCwKKzB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDMxODYxMzMsIDB4NDMwODQzMDgsCisweDQyMDg0MjE4LCAweDQxMjk0MjA4LCAweDQxMDk0MTA5LCAweDIyMUJBRjcyLAorMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MzE4NjEzMywKKzB4NDEyOTQyMTgsIDB4QUY2NTQxMTksIDB4NDMwMDIyMUIsIDB4NDMwMDQyMjQsCisweDQzMDA0MjI0LCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LAorMHg0MzAwNDIyNCwgMHg0MjI0QUY1NiwgMHgyRjE2MkYwNiwgMHg4QjI2NDExNSwKKzB4MzEwM0UwNDAsIDB4MkYyNjg5MkIsIDB4NTJGNjJGMzYsIDB4RTAyMDUzRjUsCisweDhCMDUzMTAzLCAweEUyMDA2MzIzLCAweDg5MDkzMTAwLCAweDMxMDhBMDAyLAorMHg4QjBGMjIyOCwgMHhEMDA2NEYyMiwgMHg2MDMzNDAwQiwgMHg0RjI2NjMwMywKKzB4MTEyMTUxRjQsIDB4NjNGNjExMzAsIDB4NjFGNjYyRjYsIDB4NjBGNjAwMEIsCisweDAwMjAwOEI0LCAweDQxMDBDNzA5LCAweDAxMjMwMTFELCAweDUxRjIwMDA5LAorMHgxMTAxNTBGNCwgMHgxMTAwNTBGMywgMHgwMDBCNjFGNiwgMHg1MUYyNjBGNiwKKzB4MTEwMUUwMDAsIDB4NjFGNjExMDAsIDB4NjBGNjAwMEIsIDB4MDEyRTAwMDAsCisweDAxMjYwMTJBLCAweDAxMUUwMTIyLCAweDAxMTYwMTFBLCAweDAxMDQwMTA4LAorMHgwMEZDMDEwMCwgMHgwMEUwMDBFNCwgMHgwMEQ4MDBEQywgMHgwMENDMDBEMCwKKzB4MDBDNDAwQzgsIDB4MDBBODAwQUMsIDB4MDBBMDAwQTQsIDB4MDA4QzAwOTAsCisweDAwODQwMDg4LCAweDAwNjYwMDZBLCAweDAwNUUwMDYyLCAweDQzMjU0MjAxLAorMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwgMHg0MjI5NjEyMywgMHg0MjA5NDIxOSwKKzB4NDMyOTQyMDksIDB4NDMwOTQzMTksIDB4NDEwODQzMDksIDB4QUZBRjQxMDgsCisweDQyMDEyMzFCLCAweDQyMDE0MzI1LCAweDQyMDE0MzI1LCAweDYxMjM0MzI1LAorMHg0MjE5NDIyOSwgMHg0MzE5NDMyOSwgMHhBRkExNDExOCwgMHg0MjAxMjMxQiwKKzB4NDIwMTQzMjUsIDB4NDIwMTQzMjUsIDB4NjEyMzQzMjUsIDB4NDIwOTQyMjksCisweDQzMjk0MjA5LCAweDQzMDk0MzA5LCAweDQxMDg0MTE4LCAweEFGOEY0MTA4LAorMHg0MjAxMjMxQiwgMHg0MjAxNDMyNSwgMHg0MjAxNDMyNSwgMHg2MTIzNDMyNSwKKzB4QUY4NTQyMjksIDB4NDIwMTIzMUQsIDB4NDIwMTQzMjUsIDB4NDIwMTQzMjUsCisweDYxMjM0MzI1LCAweDQyMDk0MjE5LCAweDQzMTk0MjA5LCAweDQzMDk0MzA5LAorMHg0MTA4NDEyOCwgMHhBRjczNDEwOCwgMHg0MjAxMjMxQiwgMHg0MjAxNDMyNSwKKzB4NDIwMTQzMjUsIDB4NjEyMzQzMjUsIDB4NDMxOTQyMTksIDB4NDExODQxMjgsCisweDIzMUJBRjY2LCAweDQzMjU0MjAxLCAweDQzMjU0MjAxLCAweDQzMjU0MjAxLAorMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwgMHhBRjU3NDIwMSwKKzB4MDAwMDQzMjUsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAwODFFLCAweDAwMjAwN0Q0LCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwKKzB4MDAwMDYyRjYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAwOERFLCAweDAwMjAwODk0LCAweDAwMEJFMDAwLCAweDQwMDE2MkY2LAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg2MkY2MDAwQiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLAorMHg0MDI5NDAwMSwgMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4MDAwQjQwMjksIDB4NDAwNDYyRjYsIDB4NDAwNDQwMDQsIDB4QzkwRjQwMDQsCisweDYyRjYwMDBCLCAweDQwMDQ0MDA0LCAweEM5MDc0MDA0LCAweDYyRjYwMDBCLAorMHg0MDA0NDAwNCwgMHgwMDBCQzkwMywgMHg0MDA0NjJGNiwgMHgwMDBCQzkwMSwKKzB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4RUUwRTYxMkMsCisweDk5MDk1MUJBLCAweDA3NkRDNDE5LCAweDcwNkFGNDhGLCAweEU5NjNBNTM1LAorMHg5RTY0OTVBMywgMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwKKzB4OTdEMkQ5ODgsIDB4MDlCNjRDMkIsIDB4N0VCMTdDQkQsIDB4RTdCODJEMDcsCisweDkwQkYxRDkxLCAweDFEQjcxMDY0LCAweDZBQjAyMEYyLCAweEYzQjk3MTQ4LAorMHg4NEJFNDFERSwgMHgxQURBRDQ3RCwgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwKKzB4ODNEMzg1QzcsIDB4MTM2Qzk4NTYsIDB4NjQ2QkE4QzAsIDB4RkQ2MkY5N0EsCisweDhBNjVDOUVDLCAweDE0MDE1QzRGLCAweDYzMDY2Q0Q5LCAweEZBMEYzRDYzLAorMHg4RDA4MERGNSwgMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwKKzB4QTI2NzcxNzIsIDB4M0MwM0U0RDEsIDB4NEIwNEQ0NDcsIDB4RDIwRDg1RkQsCisweEE1MEFCNTZCLCAweDM1QjVBOEZBLCAweDQyQjI5ODZDLCAweERCQkJDOUQ2LAorMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwKKzB4QUJEMTNENTksIDB4MjZEOTMwQUMsIDB4NTFERTAwM0EsIDB4QzhENzUxODAsCisweEJGRDA2MTE2LCAweDIxQjRGNEI1LCAweDU2QjNDNDIzLCAweENGQkE5NTk5LAorMHhCOEJEQTUwRiwgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwKKzB4QjEwQkU5MjQsIDB4MkY2RjdDODcsIDB4NTg2ODRDMTEsIDB4QzE2MTFEQUIsCisweEI2NjYyRDNELCAweDc2REM0MTkwLCAweDAxREI3MTA2LCAweDk4RDIyMEJDLAorMHhFRkQ1MTAyQSwgMHg3MUIxODU4OSwgMHgwNkI2QjUxRiwgMHg5RkJGRTRBNSwKKzB4RThCOEQ0MzMsIDB4NzgwN0M5QTIsIDB4MEYwMEY5MzQsIDB4OTYwOUE4OEUsCisweEUxMEU5ODE4LCAweDdGNkEwREJCLCAweDA4NkQzRDJELCAweDkxNjQ2Qzk3LAorMHhFNjYzNUMwMSwgMHg2QjZCNTFGNCwgMHgxQzZDNjE2MiwgMHg4NTY1MzBEOCwKKzB4RjI2MjAwNEUsIDB4NkMwNjk1RUQsIDB4MUIwMUE1N0IsIDB4ODIwOEY0QzEsCisweEY1MEZDNDU3LCAweDY1QjBEOUM2LCAweDEyQjdFOTUwLCAweDhCQkVCOEVBLAorMHhGQ0I5ODg3QywgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywKKzB4RkJENDRDNjUsIDB4NERCMjYxNTgsIDB4M0FCNTUxQ0UsIDB4QTNCQzAwNzQsCisweEQ0QkIzMEUyLCAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELAorMHhEM0Q2RjRGQiwgMHg0MzY5RTk2QSwgMHgzNDZFRDlGQywgMHhBRDY3ODg0NiwKKzB4REE2MEI4RDAsIDB4NDQwNDJENzMsIDB4MzMwMzFERTUsIDB4QUEwQTRDNUYsCisweEREMEQ3Q0M5LCAweDUwMDU3MTNDLCAweDI3MDI0MUFBLCAweEJFMEIxMDEwLAorMHhDOTBDMjA4NiwgMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwKKzB4Q0U2MUU0OUYsIDB4NUVERUY5MEUsIDB4MjlEOUM5OTgsIDB4QjBEMDk4MjIsCisweEM3RDdBOEI0LCAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLAorMHhDMEJBNkNBRCwgMHhFREI4ODMyMCwgMHg5QUJGQjNCNiwgMHgwM0I2RTIwQywKKzB4NzRCMUQyOUEsIDB4RUFENTQ3MzksIDB4OUREMjc3QUYsIDB4MDREQjI2MTUsCisweDczREMxNjgzLCAweEUzNjMwQjEyLCAweDk0NjQzQjg0LCAweDBENkQ2QTNFLAorMHg3QTZBNUFBOCwgMHhFNDBFQ0YwQiwgMHg5MzA5RkY5RCwgMHgwQTAwQUUyNywKKzB4N0QwNzlFQjEsIDB4RjAwRjkzNDQsIDB4ODcwOEEzRDIsIDB4MUUwMUYyNjgsCisweDY5MDZDMkZFLCAweEY3NjI1NzVELCAweDgwNjU2N0NCLCAweDE5NkMzNjcxLAorMHg2RTZCMDZFNywgMHhGRUQ0MUI3NiwgMHg4OUQzMkJFMCwgMHgxMERBN0E1QSwKKzB4NjdERDRBQ0MsIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsCisweDYwQjA4RUQ1LCAweEQ2RDZBM0U4LCAweEExRDE5MzdFLCAweDM4RDhDMkM0LAorMHg0RkRGRjI1MiwgMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwKKzB4NDhCMjM2NEIsIDB4RDgwRDJCREEsIDB4QUYwQTFCNEMsIDB4MzYwMzRBRjYsCisweDQxMDQ3QTYwLCAweERGNjBFRkMzLCAweEE4NjdERjU1LCAweDMxNkU4RUVGLAorMHg0NjY5QkU3OSwgMHhDQjYxQjM4QywgMHhCQzY2ODMxQSwgMHgyNTZGRDJBMCwKKzB4NTI2OEUyMzYsIDB4Q0MwQzc3OTUsIDB4QkIwQjQ3MDMsIDB4MjIwMjE2QjksCisweDU1MDUyNjJGLCAweEM1QkEzQkJFLCAweEIyQkQwQjI4LCAweDJCQjQ1QTkyLAorMHg1Q0IzNkEwNCwgMHhDMkQ3RkZBNywgMHhCNUQwQ0YzMSwgMHgyQ0Q5OUU4QiwKKzB4NUJERUFFMUQsIDB4OUI2NEMyQjAsIDB4RUM2M0YyMjYsIDB4NzU2QUEzOUMsCisweDAyNkQ5MzBBLCAweDlDMDkwNkE5LCAweEVCMEUzNjNGLCAweDcyMDc2Nzg1LAorMHgwNTAwNTcxMywgMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwKKzB4MENCNjFCMzgsIDB4OTJEMjhFOUIsIDB4RTVENUJFMEQsIDB4N0NEQ0VGQjcsCisweDBCREJERjIxLCAweDg2RDNEMkQ0LCAweEYxRDRFMjQyLCAweDY4RERCM0Y4LAorMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwKKzB4MThCNzQ3NzcsIDB4ODgwODVBRTYsIDB4RkYwRjZBNzAsIDB4NjYwNjNCQ0EsCisweDExMDEwQjVDLCAweDhGNjU5RUZGLCAweEY4NjJBRTY5LCAweDYxNkJGRkQzLAorMHgxNjZDQ0Y0NSwgMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwKKzB4MzkwM0IzQzIsIDB4QTc2NzI2NjEsIDB4RDA2MDE2RjcsIDB4NDk2OTQ3NEQsCisweDNFNkU3N0RCLCAweEFFRDE2QTRBLCAweEQ5RDY1QURDLCAweDQwREYwQjY2LAorMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwKKzB4MzBCNUZGRTksIDB4QkRCREYyMUMsIDB4Q0FCQUMyOEEsIDB4NTNCMzkzMzAsCisweDI0QjRBM0E2LCAweEJBRDAzNjA1LCAweENERDcwNjkzLCAweDU0REU1NzI5LAorMHgyM0Q5NjdCRiwgMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwKKzB4MkE2RjJCOTQsIDB4QjQwQkJFMzcsIDB4QzMwQzhFQTEsIDB4NUEwNURGMUIsCisweDJEMDJFRjhELCAweDU0NEYwRDBBLCAweDUwMjA1MzU1LCAweDIwMzEyRDQ4LAorMHgwMDNBNTc0NiwgMHg3MjYzNjU2NCwgMHg2OTc0NzA3OSwgMHg2NTIwNkU2RiwKKzB4NzI2RjcyNzIsIDB4MEEwRDIxMjEsIDB4MDAwMDAwMDAsIDB4NjU2NDY2N0EsCisweDcwNzk3MjYzLCAweDY1NzI1Rjc0LCAweDYxNkM3NTY3LCAweDc5NzI2Rjc0LAorMHg2MjYxNzQ1RiwgMHg3MjIwNjU2QywgMHgyMDNENzQ2NSwgMHgwMDAwMDAwMCwKKzB4NDU0ODU0NDEsIDB4Mzg3MzE2NTIsIDB4ODlBQ0ZGOTEsIDB4RUU1NUQxNzgsCisweEVFMDAwRDBBLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTM1MDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2NWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocG1haW4uYwpAQCAtMCwwICsxLDQ2NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKyNpbmNsdWRlICJvdHVzLmluaSIKKworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVNpemU7CitleHRlcm4gY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0RLRndJbWFnZVNpemU7CitleHRlcm4gY29uc3QgdTMyX3QgemNGd0ltYWdlU1BJW107CitleHRlcm4gY29uc3QgdTMyX3QgemNGd0ltYWdlU1BJU2l6ZTsKKworI2lmZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndCdWZJbWFnZVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndCdWZJbWFnZVNpemU7CitleHRlcm4gY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y1AyRndJbWFnZVNpemU7CisjZW5kaWYKK2V4dGVybiB2b2lkIHpmSW5pdENtZFF1ZXVlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6Zklzc3VlQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4sCisgICAgICAgIHUxNl90IHNyYywgdThfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOworZXh0ZXJuIHUxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOworZXh0ZXJuIHUxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmVXNiSW5pdCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZGaXJtd2FyZURvd25sb2FkKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KTsKK2V4dGVybiB1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWROb3RKdW1wKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIHpmVXNiRnJlZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZDd21Jc0V4dENoYW5CdXN5KHUzMl90IGN0bEJ1c3ksIHUzMl90IGV4dEJ1c3kpOworZXh0ZXJuIHZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSk7CisKKy8qIFByb3RvdHlwZXMgKi8KK3ZvaWQgemZJbml0UmYoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7Cit2b2lkIHpmSW5pdFBoeSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDApOwordm9pZCB6ZkluaXRNYWMoemRldl90KiBkZXYpOworCit2b2lkIHpmU2V0UG93ZXJDYWxUYWJsZSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0KTsKK3ZvaWQgemZJbml0UG93ZXJDYWwoemRldl90KiBkZXYpOworCisjaWZkZWYgWk1fRFJWX0lOSVRfVVNCX01PREUKK3ZvaWQgemZJbml0VXNiTW9kZSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkhwVXNiUmVzZXQoemRldl90KiBkZXYpOworI2VuZGlmCisKKy8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLwordm9pZCB6ZlNldFJmUmVncyh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KTsKKy8qIEJhbmsgNCAqLwordm9pZCB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0KTsKKy8qIEdldCBwYXJhbSBmb3IgdHVybm9mZmR5biAqLwordm9pZCB6ZkdldEh3VHVybk9mZmR5blBhcmFtKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kpOworCit2b2lkIHpmU2VsQWRjQ2xrKHpkZXZfdCogZGV2LCB1OF90IGJ3NDAsIHUzMl90IGZyZXF1ZW5jeSk7Cit1MzJfdCB6ZkhwRWNob0NvbW1hbmQoemRldl90KiBkZXYsIHUzMl90IHZhbHVlKTsKKworCisKKyNkZWZpbmUgem1faHBfcHJpdih4KSAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT54KQorc3RydWN0IHpzSHBQcml2IHpnSHBQcml2OworCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1dMQU5fQUREUiAgICAgICAgICAgMHgyMDAwMDAKKyNkZWZpbmUgWk1fRklSTVdBUkVfU1BJX0FERFIgICAgICAweDExNDAwMAorLyogMDogcmVhbCBjaGlwICAgICAxOiBGUEdBIHRlc3QgKi8KKyNkZWZpbmUgWk1fRlBHQV9QSFkgIDAKKworI2RlZmluZSByZWdfd3JpdGUoYWRkciwgdmFsKSB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIGFkZHIrMHgxYmMwMDAsIHZhbCkKKyNkZWZpbmUgem1fbWluKEEsIEIpICgoQT5CKT8gQjpBKQorCisKKy8qKioqKioqKioqKioqKioqKioqKiBJbnRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcEluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogSW5pdGlhbGl6YSBIQUwgUGx1cyBwcml2YXRlIHZhcmlhYmxlcyAqLworICAgIHdkLT5ocFByaXZhdGUgPSAmemdIcFByaXY7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbENhcGFiaWxpdHkgPSBaTV9IUF9DQVBfMTFOOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0J3NDAgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdFeHRPZmZzZXQgPSAwOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5kaXNhYmxlRGZzQ2ggPSAwOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlWzBdID0gMTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbMV0gPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c3Ryb25nUlNTSSA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yeFN0cm9uZ1JTU0kgPSAwOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5zbG90VHlwZSA9IDE7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5hZ2dQa3ROdW0gPSAweDEwMDAwYTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZWVwcm9tSW1hZ2VJbmRleCA9IDA7CisKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZWVwcm9tSW1hZ2VSZFJlcSAgICAgPSAwOworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJlbWFpbkJ1ZiA9IE5VTEw7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFJlbWFpbkxlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFBrdExlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFBhZExlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFRyYW5zZmVyTGVuID0gMDsKKyNlbmRpZgorCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5lbmFibGVCQkhlYXZ5Q2xpcCA9IDE7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0JCSGVhdnlDbGlwICAgICA9IDE7IC8vIGZvcmNlIGVuYWJsZSA4MTA3CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5kb0JCSGVhdnlDbGlwICAgICA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5zZXRWYWx1ZUhlYXZ5Q2xpcCA9IDA7CisKKworICAgIC8qIEluaXRpYWxpemUgZHJpdmVyIGNvcmUgKi8KKyAgICB6ZkluaXRDbWRRdWV1ZShkZXYpOworCisgICAgLyogSW5pdGlhbGl6ZSBVU0IgKi8KKyAgICB6ZlVzYkluaXQoZGV2KTsKKworI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCisKKyAgICAvKiBUT0RPIDogW0Rvd25sb2FkIEZXXSAqLworICAgIGlmICh3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICB7CisgICAgICAgIC8qIGRvd25sb2FkIHRoZSBNREsgZmlybXdhcmUgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjREtGd0ltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0RLRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRPRE8gOiBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyAgICAgICAgICAgIC8vcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICAvKiBkb253bG9hZCB0aGUgbm9ybWFsIGZyaW13YXJlICovCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRPRE8gOiBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyAgICAgICAgICAgIC8vcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAjZWxzZQorCisgICAgICAgIC8vIDEtUEggZnc6IFJlYWRNYWMoKSBzdG9yZSBzb21lIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZE5vdEp1bXAoZGV2LCAodTMyX3QqKXpjRndCdWZJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0J1ZkltYWdlU2l6ZSwgMHgxMDI4MDApKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEYmdQcmludCgiRGwgemNGd0J1ZkltYWdlIGZhaWxlZCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmd1NsZWVwKGRldiwgMTAwMCk7CisKKyAgICAgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgRGJnUHJpbnQoIkRsIHpjRndCdWZJbWFnZSBmYWlsZWQhIik7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCisgICAgLyogSW5pdCBVU0IgTW9kZSAqLworICAgIHpmSW5pdFVzYk1vZGUoZGV2KTsKKworICAgIC8qIERvIHRoZSBVU0IgUmVzZXQgKi8KKyAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyNlbmRpZgorCisvKiBSZWdpc3RlciBzZXR0aW5nICovCisvKiBaTV9EUklWRVJfTU9ERUxfVFlQRV9NREsKKyAqICAxPT5mb3IgTURLLCBkaXNhYmxlIGluaXQgUkYsIFBIWSwgYW5kIE1BQywKKyAqICAwPT5ub3JtYWwgaW5pdAorICovCisvLyNpZiAoKFpNX1NXX0xPT1BfQkFDSyAhPSAxKSAmJiAoWk1fRFJJVkVSX01PREVMX1RZUEVfTURLICE9MSkpCisjaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKKyAgICBpZighd2QtPm1vZGVNREtFbmFibGUpCisgICAgeworICAgICAgICAvKiBJbml0IE1BQyAqLworICAgICAgICB6ZkluaXRNYWMoZGV2KTsKKworICAgICNpZiBaTV9GV19MT09QX0JBQ0sgIT0gMQorICAgICAgICAvKiBJbml0IFBIWSAqLworICAgICAgICB6ZkluaXRQaHkoZGV2LCBmcmVxdWVuY3ksIDApOworCisgICAgICAgIC8qIEluaXQgUkYgKi8KKyAgICAgICAgemZJbml0UmYoZGV2LCBmcmVxdWVuY3kpOworCisgICAgICAgICNpZiBaTV9GUEdBX1BIWSA9PSAwCisgICAgICAgIC8qIEJyaW5nVXAgaXNzdWUgKi8KKyAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4OTgwMCsweDFiYzAwMCwgMHgxMDAwMDAwNyk7CisgICAgICAgIC8vemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAjZW5kaWYgLyogZW5kIG9mIFpNX0ZXX0xPT1BfQkFDSyAhPSAxICovCisgICAgfQorI2VuZGlmIC8qIGVuZCBvZiAoKFpNX1NXX0xPT1BfQkFDSyAhPSAxKSAmJiAoWk1fRFJJVkVSX01PREVMX1RZUEVfTURLICE9MSkpICovCisKKyAgICB6ZkhwRWNob0NvbW1hbmQoZGV2LCAweEFBQkJDQ0REKTsKKworICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBSZWluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSZUluaXQgPSAxOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5zdHJvbmdSU1NJID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJ4U3Ryb25nUlNTSSA9IDA7CisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cmVtYWluQnVmICE9IE5VTEwpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYsIDApOworICAgIH0KKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJlbWFpbkJ1ZiA9IE5VTEw7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFJlbWFpbkxlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFBrdExlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFBhZExlbiA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT51c2JSeFRyYW5zZmVyTGVuID0gMDsKKyNlbmRpZgorCisgICAgemZJbml0Q21kUXVldWUoZGV2KTsKKyAgICB6ZkNvcmVSZWluaXQoZGV2KTsKKworICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgLyogRG93bmxvYWQgZmlybXdhcmUgKi8KKyAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlLAorICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgIC8vcmV0dXJuIDE7CisgICAgfQorICAgICNlbHNlCisgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjUDJGd0ltYWdlLAorICAgICAgICAgICAgKHUzMl90KXpjUDJGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyAgICAgICAgLy9yZXR1cm4gMTsKKyAgICB9CisgICAgI2VuZGlmCisKKyNpZmRlZiBaTV9EUlZfSU5JVF9VU0JfTU9ERQorICAgIC8qIEluaXQgVVNCIE1vZGUgKi8KKyAgICB6ZkluaXRVc2JNb2RlKGRldik7CisKKyAgICAvKiBEbyB0aGUgVVNCIFJlc2V0ICovCisgICAgemZIcFVzYlJlc2V0KGRldik7CisjZW5kaWYKKworICAgIC8qIEluaXQgTUFDICovCisgICAgemZJbml0TWFjKGRldik7CisKKyAgICAvKiBJbml0IFBIWSAqLworICAgIHpmSW5pdFBoeShkZXYsIGZyZXF1ZW5jeSwgMCk7CisgICAgLyogSW5pdCBSRiAqLworICAgIHpmSW5pdFJmKGRldiwgZnJlcXVlbmN5KTsKKworICAgICNpZiBaTV9GUEdBX1BIWSA9PSAwCisgICAgLyogQnJpbmdVcCBpc3N1ZSAqLworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDk4MDArMHgxYmMwMDAsIDB4MTAwMDAwMDcpOworICAgIC8vemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAjZW5kaWYKKworICAgIHpmSHBFY2hvQ29tbWFuZChkZXYsIDB4QUFCQkNDREQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordTE2X3QgemZIcFJlbGVhc2UoemRldl90KiBkZXYpCit7CisgICAgLyogRnJlZSBVU0IgcmVzb3VyY2UgKi8KKyAgICB6ZlVzYkZyZWUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCisvKiBNREsgbW9kZSBzZXR0aW5nIGZvciBkb250UmV0cmFuc21pdCAqLwordm9pZCB6ZkhwQ29uZmlnRk0oemRldl90KiBkZXYsIHUzMl90IFJ4TWF4U2l6ZSwgdTMyX3QgRG9udFJldHJhbnNtaXQpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDggfCAoWk1fQ01EX0NPTkZJRyA8PCA4KTsKKyAgICBjbWRbMV0gPSBSeE1heFNpemU7ICAgICAgICAgIC8qIHpnUnhNYXhTaXplICovCisgICAgY21kWzJdID0gRG9udFJldHJhbnNtaXQ7ICAgICAvKiB6Z0RvbnRSZXRyYW5zbWl0ICovCisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCAwKTsKK30KKworY29uc3QgdThfdCB6Y1hwZFRvUGRbMTZdID0KK3sKKyAvKiAweDAsIDB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweDYsIDB4NywgMHg4LCAweDksIDB4QSwgMHhCLCAweEMsIDB4RCwgMHhFLCAweEYgKi8KKyAgICAweDIsIDB4MiwgMHgyLCAweDEsIDB4MiwgMHgyLCAweDYsIDB4MiwgMHgyLCAweDMsIDB4NywgMHgyLCAweEIsIDB4MiwgMHgyLCAweDIKK307CisKKy8qKioqKioqKioqKioqKioqKioqKiBSRiBhbmQgUEhZICoqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHpmSW5pdFBoeSh6ZGV2X3QqIGRldiwgIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwKQoreworICAgIHUxNl90IGksIGosIGs7CisgICAgdTE2X3QgZW50cmllczsKKyAgICB1MTZfdCBtb2Rlc0luZGV4ID0gMDsKKyAgICB1MTZfdCBmcmVxSW5kZXggPSAwOworICAgIHUzMl90IHRtcCwgdG1wMTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKyAgICB1MzJfdCBlZXByb21Cb2FyZERhdGFbMTVdWzZdID0geworICAgIC8qIFJlZ2lzdGVyICAgQS0yMCAgICAgICAgQS0yMC80MCAgICAgRy0yMC80MCAgICAgRy0yMCAgICAgICAgRy1UdXJibyAgICAqLworICAgICAgICB7MHg5OTY0LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5OTYwLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhiOTYwLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5ODQ0LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5ODUwLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5ODM0LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5ODI4LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhjODY0LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5ODQ4LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhiODQ4LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhhMjBjLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhjMjBjLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHg5OTIwLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhiOTIwLCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgICAgICB7MHhhMjU4LCAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDB9LAorICAgIH07CisKKyAgICAvKiAjMSBTYXZlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSByZWxhdGVkIFJJRlMgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKyAgICAvLygoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aXNJbml0aWFsUGh5Kys7CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBpbmRpY2VzIGZvciB0aGUgbmV4dCBzZXQgb2YgcmVnaXN0ZXIgYXJyYXkgd3JpdGVzCisgICAgICogUEhZIG1vZGUgaXMgc3RhdGljMjAgLyAyMDQwCisgICAgICogRnJlcXVlbmN5IGlzIDIuNEdIeiAoQikgLyA1R0h6IChBKQorICAgICAqLworICAgIGlmICggZnJlcXVlbmN5ID4gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICAvKiA1R0h6ICovCisgICAgICAgIGZyZXFJbmRleCAgPSAxOworICAgICAgICBpZiAoYnc0MCkKKyAgICAgICAgeworICAgICAgICAgICAgbW9kZXNJbmRleCA9IDI7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJpbml0IGFyNTQxNk1vZGVzIGluIDI6IEEtMjAvNDAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSAxOworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiAxOiBBLTIwIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogMi40R0h6ICovCisgICAgICAgIGZyZXFJbmRleCAgPSAyOworICAgICAgICBpZiAoYnc0MCkKKyAgICAgICAgeworICAgICAgICAgICAgbW9kZXNJbmRleCA9IDM7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJpbml0IGFyNTQxNk1vZGVzIGluIDM6IEctMjAvNDAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSA0OworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiA0OiBHLTIwIik7CisgICAgICAgIH0KKyAgICB9CisKKworI2lmIFpNX0ZQR0FfUEhZID09IDEKKyAgICAvKiBTdGFydGluZyBFeHRlcm5hbCBIYWluYW4gUmVnaXN0ZXIgSW5pdGlhbGl6YXRpb24gKi8KKyAgICAvKiBUT0RPOiAqLworCisgICAgemZ3U2xlZXAoZGV2LCAxMCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICpTZXQgY29ycmVjdCBCYXNlYmFuZCB0byBhbmFsb2cgc2hpZnQgc2V0dGluZyB0byBhY2Nlc3MgYW5hbG9nIGNoaXBzLgorICAgICAqLworICAgIC8vcmVnX3dyaXRlKFBIWV9CQVNFLCAweDAwMDAwMDA3KTsKKy8vICAgIHJlZ193cml0ZSgweDk4MDAsIDB4MDAwMDAwMDcpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBhZGRhYyBzaGlmdHMKKyAgICAgKi8KKyAgICAgLy8gZG8gdGhpcyBpbiBmaXJtd2FyZQorCisKKworICAgIC8qIFplcm9pemUgYm9hcmQgZGF0YSAqLworICAgIGZvciAoaj0wOyBqPDE1OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGs9MTsgazw9NDsgaysrKQorICAgICAgICB7CisgICAgICAgICAgICBlZXByb21Cb2FyZERhdGFbal1ba10gPSAwOworICAgICAgICB9CisgICAgfQorICAgICAvKgorICAgICAqIFJlZ2lzdGVyIHNldHRpbmcgYnkgbW9kZQorICAgICAqLworCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZNb2RlcykgLyBzaXplb2YoKmFyNTQxNk1vZGVzKTsKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMiwgIk1vZGVzIHJlZ2lzdGVyIHNldHRpbmcgZW50cmllcz0iLCBlbnRyaWVzKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworI2lmIDAKKyAgICAgICAgaWYgKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Tm90Rmlyc3RJbml0ICYmIChhcjU0MTZNb2Rlc1tpXVswXSA9PSAweGEyN2MpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yY2UgZGlzYWJsZSBDUjY3MSBiaXQyMCAvIDc4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBUaGUgYnVnIGhhcyB0byBkbyB3aXRoIHRoZSBwb2xhcml0eSBvZiB0aGUgcGRhZGMgb2Zmc2V0IGNhbGlicmF0aW9uLiAgVGhlcmUgKi8KKyAgICAgICAgICAgIC8qIGlzIGFuIGluaXRpYWwgY2FsaWJyYXRpb24gdGhhdCBpcyBPSywgYW5kIHRoZXJlIGlzIGEgY29udGludW91cyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogY2FsaWJyYXRpb24gdGhhdCB1cGRhdGVzIHRoZSBwZGRhYyB3aXRoIHRoZSB3cm9uZyBwb2xhcml0eS4gIEZvcnR1bmF0ZWx5ICAgICovCisgICAgICAgICAgICAvKiB0aGUgc2Vjb25kIGxvb3AgY2FuIGJlIGRpc2FibGVkIHdpdGggYSBiaXQgY2FsbGVkIGVuX3BkX2RjX29mZnNldF90aHIuICAgICAgKi8KKworICAgICAgICAgICAgcmVnX3dyaXRlKGFyNTQxNk1vZGVzW2ldWzBdLCAoYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF0mIDB4ZmZlZmZmZmYpICk7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Tm90Rmlyc3RJbml0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNlbmRpZgorICAgICAgICAgICAgLyogRmlyc3RUaW1lIEluaXQgb3Igbm90IDB4YTI3YyhDUjY3MSkgKi8KKyAgICAgICAgICAgIHJlZ193cml0ZShhcjU0MTZNb2Rlc1tpXVswXSwgYXI1NDE2TW9kZXNbaV1bbW9kZXNJbmRleF0pOworLy8gICAgICAgIH0KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBib2FyZCBkYXRhICovCisgICAgICAgIGZvciAoaj0wOyBqPDE1OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcjU0MTZNb2Rlc1tpXVswXSA9PSBlZXByb21Cb2FyZERhdGFbal1bMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChrPTE7IGs8PTQ7IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUJvYXJkRGF0YVtqXVtrXSA9IGFyNTQxNk1vZGVzW2ldW2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiAjMSBTYXZlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSByZWxhdGVkIFJJRlMgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKyAgICAgICAgLy9pZiggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pc0luaXRpYWxQaHkgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChhcjU0MTZNb2Rlc1tpXVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTg1MCA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdERlc2lyZWRTaWdTaXplICAgICAgICAgICA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTg1YyA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFHQyAgICAgICAgICAgICAgICAgICAgICA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTg2MCA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFnY0NvbnRyb2wgICAgICAgICAgICAgICA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTkxOCA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFNlYXJjaFN0YXJ0RGVsYXkgICAgICAgICA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4OTllYyA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFJJRlNTZWFyY2hQYXJhbXMgICAgICAgICA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4YTM4OCA6CisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbCA9IGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZiAwCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qCisgICAgICogQ29tbW9uIFJlZ2lzdGVyIHNldHRpbmcKKyAgICAgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkNvbW1vbikgLyBzaXplb2YoKmFyNTQxNkNvbW1vbik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkNvbW1vbltpXVswXSwgYXI1NDE2Q29tbW9uW2ldWzFdKTsKKyAgICB9CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qCisgICAgICogUkYgR2FpbiBzZXR0aW5nIGJ5IGZyZXFJbmRleAorICAgICAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QkJfUmZHYWluKSAvIHNpemVvZigqYXI1NDE2QkJfUmZHYWluKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QkJfUmZHYWluW2ldWzBdLCBhcjU0MTZCQl9SZkdhaW5baV1bZnJlcUluZGV4XSk7CisgICAgfQorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKgorICAgICAqIE1vdmVkIGFyNTQxNkluaXRDaGFpbk1hc2soKSBoZXJlIHRvIGVuc3VyZSB0aGUgc3dhcCBiaXQgaXMgc2V0IGJlZm9yZQorICAgICAqIHRoZSBwZGFkYyB0YWJsZSBpcyB3cml0dGVuLiAgU3dhcCBtdXN0IG9jY3VyIGJlZm9yZSBhbnkgcmFkaW8gZGVwZW5kZW50CisgICAgICogcmVwbGljYXRlZCByZWdpc3RlciBhY2Nlc3MuICBUaGUgcGRhZGMgY3VydmUgYWRkcmVzc2luZyBpbiBwYXJ0aWN1bGFyCisgICAgICogZGVwZW5kcyBvbiB0aGUgY29uc2lzdGVudCBzZXR0aW5nIG9mIHRoZSBzd2FwIGJpdC4KKyAgICAgKi8KKyAgICAvL2FyNTQxNkluaXRDaGFpbk1hc2socERldik7CisKKyAgICAvKiBTZXR1cCB0aGUgdHJhbnNtaXQgcG93ZXIgdmFsdWVzLiAqLworICAgIC8vIFRPRE8KKyNlbmRpZgorCisgICAgLyogVXBkYXRlIDVHIGJvYXJkIGRhdGEgKi8KKyAgICAvL0FudCBjb250cm9sIGNvbW1vbgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDQqMi80XTsKKyAgICBlZXByb21Cb2FyZERhdGFbMF1bMV0gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzBdWzJdID0gdG1wOworICAgIC8vQW50IGNvbnRyb2wgY2hhaW4gMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDAqMi80XTsKKyAgICBlZXByb21Cb2FyZERhdGFbMV1bMV0gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzFdWzJdID0gdG1wOworICAgIC8vQW50IGNvbnRyb2wgY2hhaW4gMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDIqMi80XTsKKyAgICBlZXByb21Cb2FyZERhdGFbMl1bMV0gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzJdWzJdID0gdG1wOworICAgIC8vU3dTZXR0bGUKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVsxXSAmPSAofigodTMyX3QpMHgzZjgwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzFdIHw9ICh0bXAgPDwgNyk7CisjaWYgMAorICAgIC8vc3dTZXR0bGVIdDQwCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1OCoyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMl0gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVsyXSB8PSAodG1wIDw8IDcpOworI2VuZGlmCisgICAgLy9hZGNEZXNpcmVkLCBwZGFEZXNpcmVkCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRhKjIvNF07CisgICAgdG1wMSA9IHRtcDEgJiAweGZmOworICAgIHRtcCA9IHRtcCArICh0bXAxPDw4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bMV0gJj0gKH4oKHUzMl90KTB4ZmZmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVsxXSB8PSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzJdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bMl0gfD0gdG1wOworICAgIC8vVHhFbmRUb1hwYU9mZiwgVHhGcmFtZVRvWHBhT24KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRhKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweGZmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRjKjIvNF07CisgICAgdG1wMSA9ICh0bXAxID4+IDgpICYgMHhmZjsKKyAgICB0bXAgPSAodG1wPDwyNCkgKyAodG1wPDwxNikgKyAodG1wMTw8OCkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVs1XVsxXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bMl0gPSB0bXA7CisgICAgLy9UeEVuYVRvUnhPbQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGMqMi80XSAmIDB4ZmY7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzFdICY9ICh+KCh1MzJfdCkweGZmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsxXSB8PSAodG1wPDwxNik7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzJdICY9ICh+KCh1MzJfdCkweGZmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsyXSB8PSAodG1wPDwxNik7CisgICAgLy9UaHJlc2g2MgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGMqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzFdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzFdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bMl0gJj0gKH4oKHUzMl90KTB4N2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bMl0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeEF0dGVuIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAyNCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsxXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsxXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzJdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzJdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0OCoyLzRdICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMV0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMV0gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVsyXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVsyXSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4TWFyZ2luIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ4KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gfD0gKHRtcDw8MTgpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gfD0gKHRtcDw8MTgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSB8PSAodG1wPDwxOCk7CisgICAgLy9pcUNhbGwgY2hhaW5fMCwgaXFDYWxsUSBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0ZSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHgzZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1MCoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiA4KSAmIDB4MWY7CisgICAgdG1wICA9ICh0bXA8PDUpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzFdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bMV0gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsyXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzJdIHw9ICh0bXApOworICAgIC8vaXFDYWxsIGNoYWluXzIsIGlxQ2FsbFEgY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTAqMi80XTsKKyAgICB0bXAgPSB0bXAgJiAweDNmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTUwKjIvNF07CisgICAgdG1wMSA9ICh0bXAxID4+IDE2KSAmIDB4MWY7CisgICAgdG1wICA9ICh0bXA8PDUpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzFdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bMV0gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsyXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzJdIHw9ICh0bXApOworICAgIC8vYnN3X01hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gfD0gKHRtcCA8PCAxMCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSB8PSAodG1wIDw8IDEwKTsKKyAgICAvL3hwZCBnYWluIG1hc2sKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRlKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzFdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsxXSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bMl0gJj0gKH4oKHUzMl90KTB4ZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzJdIHw9ICh6Y1hwZFRvUGRbdG1wXSA8PCAxNik7CisjaWYgMAorICAgIC8vYnN3X0F0dGVuIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTU2KjIvNF07CisgICAgdG1wID0gKHRtcCkgJiAweDFmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdIHw9ICh0bXApOworICAgIC8vYnN3X01hcmdpbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gfD0gKHRtcCA8PCAxMCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSB8PSAodG1wIDw8IDEwKTsKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDFmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMV0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdIHw9ICh0bXApOworI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgMi40RyBib2FyZCBkYXRhICovCisgICAgLy9BbnQgY29udHJvbCBjb21tb24KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTcwKjIvNF07CisgICAgdG1wID0gdG1wID4+IDI0OworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTcyKjIvNF07CisgICAgdG1wID0gdG1wICsgKHRtcDEgPDwgOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzBdWzNdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVs0XSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTZjKjIvNF07CisgICAgdG1wID0gdG1wID4+IDI0OworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTZlKjIvNF07CisgICAgdG1wID0gdG1wICsgKHRtcDEgPDwgOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzFdWzNdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVs0XSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTZlKjIvNF07CisgICAgdG1wID0gdG1wID4+IDI0OworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTcwKjIvNF07CisgICAgdG1wID0gdG1wICsgKHRtcDEgPDwgOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzJdWzNdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVs0XSA9IHRtcDsKKyAgICAvL1N3U2V0dGxlCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVs0XSAmPSAofigodTMyX3QpMHgzZjgwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzRdIHw9ICh0bXAgPDwgNyk7CisjaWYgMAorICAgIC8vc3dTZXR0bGVIdDQwCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bM10gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVszXSB8PSAodG1wIDw8IDcpOworI2VuZGlmCisgICAgLy9hZGNEZXNpcmVkLCBwZGFEZXNpcmVkCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHhmZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NioyLzRdOworICAgIHRtcDEgPSB0bXAxID4+IDI0OworICAgIHRtcCA9IHRtcCArICh0bXAxPDw4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bM10gJj0gKH4oKHUzMl90KTB4ZmZmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVszXSB8PSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzRdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bNF0gfD0gdG1wOworICAgIC8vVHhFbmRUb1hwYU9mZiwgVHhGcmFtZVRvWHBhT24KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc4KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweGZmOworICAgIHRtcDEgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdhKjIvNF07CisgICAgdG1wMSA9IHRtcDEgJiAweGZmOworICAgIHRtcCA9ICh0bXAgPDwgMjQpICsgKHRtcCA8PCAxNikgKyAodG1wMSA8PCA4KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzVdWzNdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs1XVs0XSA9IHRtcDsKKyAgICAvL1R4RW5hVG9SeE9tCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVszXSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bM10gfD0gKHRtcDw8MTYpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVs0XSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bNF0gfD0gKHRtcDw8MTYpOworICAgIC8vVGhyZXNoNjIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdhKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzNdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzNdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bNF0gJj0gKH4oKHUzMl90KTB4N2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbN11bNF0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeEF0dGVuIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVszXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVszXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzRdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzhdWzRdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bM10gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bM10gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVs0XSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs5XVs0XSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4TWFyZ2luIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc2KjIvNF07CisgICAgdG1wID0gKHRtcCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSB8PSAodG1wPDwxOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdIHw9ICh0bXA8PDE4KTsKKyAgICAvL1R4UnhNYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gfD0gKHRtcDw8MTgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSB8PSAodG1wPDwxOCk7CisgICAgLy9pcUNhbGwgY2hhaW5fMCwgaXFDYWxsUSBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YyoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHgzZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3ZSoyLzRdOworICAgIHRtcDEgPSAodG1wMSkgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVszXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bNF0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVs0XSB8PSAodG1wKTsKKyAgICAvL2lxQ2FsbCBjaGFpbl8yLCBpcUNhbGxRIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdjKjIvNF07CisgICAgdG1wID0gKHRtcD4+MjQpICYgMHgzZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3ZSoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiA4KSAmIDB4MWY7CisgICAgdG1wICA9ICh0bXA8PDUpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzNdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bM10gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVs0XSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzRdIHw9ICh0bXApOworICAgIC8veHBkIGdhaW4gbWFzaworICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2MqMi80XTsKKyAgICB0bXAgPSB0bXAgJiAweGY7CisgICAgRGJnUHJpbnQoInhwZD0weCV4LCBwZD0weCV4XG4iLCB0bXAsIHpjWHBkVG9QZFt0bXBdKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzNdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVszXSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bNF0gJj0gKH4oKHUzMl90KTB4ZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzRdIHw9ICh6Y1hwZFRvUGRbdG1wXSA8PCAxNik7CisjaWYgMAorICAgIC8vYnN3X01hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSB8PSAodG1wIDw8IDEwKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdIHw9ICh0bXAgPDwgMTApOworICAgIC8vYnN3X0F0dGVuIGNoYWluXzAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTgyKjIvNF07CisgICAgdG1wID0gKHRtcD4+MjQpICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzRdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSB8PSAodG1wKTsKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy9ic3dfQXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wKSAmIDB4MWY7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVs0XSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gfD0gKHRtcCk7CisjZW5kaWYKKworI2lmIDAKKyAgICBmb3IgKGo9MDsgajwxNDsgaisrKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiUwNHgsICUwOHgsICUwOHgsICUwOHgsICUwOHhcbiIsIGVlcHJvbUJvYXJkRGF0YVtqXVswXSwgZWVwcm9tQm9hcmREYXRhW2pdWzFdLCBlZXByb21Cb2FyZERhdGFbal1bMl0sIGVlcHJvbUJvYXJkRGF0YVtqXVszXSwgZWVwcm9tQm9hcmREYXRhW2pdWzRdKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBib2FyZCBkYXRhIHRvIHJlZ2lzdGVycyAqLworICAgICAgICBmb3IgKGo9MDsgajwxNTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoZWVwcm9tQm9hcmREYXRhW2pdWzBdLCBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF0pOworCisgICAgICAgICAgICAvKiAjMSBTYXZlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSByZWxhdGVkIFJJRlMgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIC8vaWYoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aXNJbml0aWFsUGh5ID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChlZXByb21Cb2FyZERhdGFbal1bMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTg1MCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXREZXNpcmVkU2lnU2l6ZSAgICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk4NWMgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QUdDICAgICAgICAgICAgICAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5ODYwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFnY0NvbnRyb2wgICAgICAgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTkxOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRTZWFyY2hTdGFydERlbGF5ICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk5ZWMgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0UklGU1NlYXJjaFBhcmFtcyAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHhhMzg4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbCA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8qIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUgKi8KKworCisgICAgLyogQnJpbmd1cCBpc3N1ZSA6IGZvcmNlIHR4IGdhaW4gKi8KKyAgICAvL3JlZ193cml0ZSgweGEyNTgsIDB4MGNjNjUzODEpOworICAgIC8vcmVnX3dyaXRlKDB4YTI3NCwgMHgwYTFhN2MxNSk7CisgICAgemZJbml0UG93ZXJDYWwoZGV2KTsKKworICAgIGlmKGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQpCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDE0LCAweDUxNDMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDE0LCAweDUxNjMpOworICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKwordm9pZCB6ZkluaXRSZih6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIHUzMl90IGNtZFs4XTsKKyAgICB1MTZfdCByZXQ7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cDsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfbWFuOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCIgaW5pdFJmIGZyZXF1ZW5jeSA9ICIsIGZyZXF1ZW5jeSk7CisKKyAgICBpZiAoZnJlcXVlbmN5ID09IDApCisgICAgeworICAgICAgICBmcmVxdWVuY3kgPSAyNDEyOworICAgIH0KKworICAgIC8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLworICAgIHpmU2V0UmZSZWdzKGRldiwgZnJlcXVlbmN5KTsKKyAgICAvKiBCYW5rIDQgKi8KKyAgICB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZShkZXYsIGZyZXF1ZW5jeSwgMCwgMCk7CisKKyAgICAvKiBzdHJvZSBmcmVxdWVuY3kgKi8KKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID0gKHUxNl90KWZyZXF1ZW5jeTsKKworICAgIHpmR2V0SHdUdXJuT2ZmZHluUGFyYW0oZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kpOworCisgICAgLyogcmVsYXRlZCBmdW5jdGlvbnMgKi8KKyAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3kqMTAwMDsKKyAgICBjbWRbMF0gPSAyOCB8IChaTV9DTURfUkZfSU5JVCA8PCA4KTsKKyAgICBjbWRbMV0gPSBmcmVxdWVuY3k7CisgICAgY21kWzJdID0gMDsvLygoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfRFlOQU1JQ19IVDIwNDBfRU47CisgICAgY21kWzNdID0gMTsvLygod2QtPkV4dE9mZnNldCA8PCAyKSB8ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfSFRfRU5BQkxFKTsKKyAgICBjbWRbNF0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgY21kWzVdID0gZGVsdGFfc2xvcGVfY29lZmZfbWFuOworICAgIGNtZFs2XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpOworICAgIGNtZFs3XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMzIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7CisKKyAgICAvLyBkZWxheSB0ZW1wb3JhcmlseSwgd2FpdCBmb3IgbmV3IFBIWSBhbmQgUkYKKyAgICB6ZndTbGVlcChkZXYsIDEwMDApOworfQorCitpbnQgdG4oaW50IGV4cCkKK3sKKyAgICBpbnQgaTsKKwlpbnQgdG1wID0gMTsKKyAgICBmb3IoaT0wOyBpPGV4cDsgaSsrKQorICAgICAgICB0bXAgPSB0bXAqMjsKKworICAgIHJldHVybiB0bXA7Cit9CisKKy8qaW50IHpmRmxvb3IoZG91YmxlIGluZGF0YSkKK3sKKyAgIGlmKGluZGF0YTwwKQorCSAgIHJldHVybiAoaW50KWluZGF0YS0xOworICAgZWxzZQorCSAgIHJldHVybiAoaW50KWluZGF0YTsKK30KKyovCit1MzJfdCByZXZlcnNlX2JpdHModTMyX3QgY2hhbl9zZWwpCit7CisJLyogcmV2ZXJzZV9iaXRzICovCisgICAgdTMyX3QgY2hhbnNlbCA9IDA7CisJdThfdCBpOworCisJZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICBjaGFuc2VsIHw9ICgoY2hhbl9zZWw+Pig3LWkpICYgMHgxKSA8PCBpKTsKKwlyZXR1cm4gY2hhbnNlbDsKK30KKworLyogQmFuayAwIDEgMiAzIDUgNiA3ICovCit2b2lkIHpmU2V0UmZSZWdzKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTE2X3QgZW50cmllczsKKyAgICB1MTZfdCBmcmVxSW5kZXggPSAwOworICAgIHUxNl90IGk7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggZnJlcXVlbmN5ID4gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICAvKiA1RyAqLworICAgICAgICBmcmVxSW5kZXggPSAxOworICAgICAgICB6bV9tc2cwX3NjYW4oWk1fTFZfMiwgIlNldCB0byA1R0h6Iik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogMi40RyAqLworICAgICAgICBmcmVxSW5kZXggPSAyOworICAgICAgICB6bV9tc2cwX3NjYW4oWk1fTFZfMiwgIlNldCB0byAyLjRHSHoiKTsKKyAgICB9CisKKyNpZiAxCisgICAgZW50cmllcyA9IHNpemVvZihvdHVzQmFuaykgLyBzaXplb2YoKm90dXNCYW5rKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUob3R1c0JhbmtbaV1bMF0sIG90dXNCYW5rW2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyNlbHNlCisgICAgLyogQmFuazAgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmswKSAvIHNpemVvZigqYXI1NDE2QmFuazApOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rMFtpXVswXSwgYXI1NDE2QmFuazBbaV1bMV0pOworICAgIH0KKyAgICAvKiBCYW5rMSAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazEpIC8gc2l6ZW9mKCphcjU0MTZCYW5rMSk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmsxW2ldWzBdLCBhcjU0MTZCYW5rMVtpXVsxXSk7CisgICAgfQorICAgIC8qIEJhbmsyICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMikgLyBzaXplb2YoKmFyNTQxNkJhbmsyKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazJbaV1bMF0sIGFyNTQxNkJhbmsyW2ldWzFdKTsKKyAgICB9CisgICAgLyogQmFuazMgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmszKSAvIHNpemVvZigqYXI1NDE2QmFuazMpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rM1tpXVswXSwgYXI1NDE2QmFuazNbaV1bZnJlcUluZGV4XSk7CisgICAgfQorICAgIC8qIEJhbms1ICovCisgICAgcmVnX3dyaXRlICgweDk4YjAsICAweDAwMDAwMDEzKTsKKyAgICByZWdfd3JpdGUgKDB4OThlNCwgIDB4MDAwMDAwMDIpOworICAgIC8qIEJhbms2ICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rNikgLyBzaXplb2YoKmFyNTQxNkJhbms2KTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazZbaV1bMF0sIGFyNTQxNkJhbms2W2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyAgICAvKiBCYW5rNyAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazcpIC8gc2l6ZW9mKCphcjU0MTZCYW5rNyk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbms3W2ldWzBdLCBhcjU0MTZCYW5rN1tpXVsxXSk7CisgICAgfQorI2VuZGlmCisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisvKiBCYW5rIDQgKi8KK3ZvaWQgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCkKK3sKKyAgICB1MzJfdCBjaHVwID0gMTsKKwl1MzJfdCBibW9kZV9MRl9zeW50aF9mcmVxID0gMDsKKwl1MzJfdCBhbW9kZV9yZWZzZWxfMSA9IDA7CisJdTMyX3QgYW1vZGVfcmVmc2VsXzAgPSAxOworCXUzMl90IGFkZHIyID0gMTsKKwl1MzJfdCBhZGRyMSA9IDA7CisJdTMyX3QgYWRkcjAgPSAwOworCisJdTMyX3QgZDE7CisJdTMyX3QgZDA7CisJdTMyX3QgdG1wXzA7CisJdTMyX3QgdG1wXzE7CisJdTMyX3QgZGF0YTA7CisJdTMyX3QgZGF0YTE7CisKKwl1OF90IGNoYW5zZWw7CisJdThfdCBjaGFuX3NlbDsKKwl1MzJfdCB0ZW1wX2NoYW5fc2VsOworCisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCisgICAgLyogaWYgZW5hYmxlIDgwMi4xMWgsIG5lZWQgdG8gcmVjb3JkIGN1cmVudCBjaGFubmVsIGluZGV4IGluIGNoYW5uZWwgYXJyYXkgKi8KKyAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleCA9IGk7CisgICAgfQorCisJaWYgKGJ3NDAgPT0gMSkKKwl7CisgICAgICAgIGlmIChleHRPZmZzZXQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5ICs9IDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcXVlbmN5IC09IDEwOworICAgICAgICB9CisKKwl9CisKKworCWlmICggZnJlcXVlbmN5ID4gMzAwMCApCisJeworCSAgICBpZiAoIGZyZXF1ZW5jeSAlIDEwICkKKwkgICAgeworCSAgICAgICAgLyogNU0gKi8KKyAgICAgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKChmcmVxdWVuY3kgLSA0ODAwKS81KTsKKyAgICAgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKGNoYW5fc2VsICYgMHhmZik7CisgICAgICAgICAgICBjaGFuc2VsICA9ICh1OF90KXJldmVyc2VfYml0cyhjaGFuX3NlbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxME0gOiBpbXByb3ZlIFR4IEVWTSAqLworICAgICAgICAgICAgY2hhbl9zZWwgPSAodThfdCkoKGZyZXF1ZW5jeSAtIDQ4MDApLzEwKTsKKyAgICAgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKGNoYW5fc2VsICYgMHhmZik8PDE7CisgICAgICAgICAgICBjaGFuc2VsICA9ICh1OF90KXJldmVyc2VfYml0cyhjaGFuX3NlbCk7CisKKwkgICAgICAgIGFtb2RlX3JlZnNlbF8xID0gMTsKKwkgICAgICAgIGFtb2RlX3JlZnNlbF8wID0gMDsKKyAgICAgICAgfQorCX0KKwllbHNlCisJeworICAgICAgICAvL3RlbXBfY2hhbl9zZWwgPSAoKChmcmVxdWVuY3kgLSA2NzIpKjIpIC0gMzA0MCkvMTA7CisgICAgICAgIGlmIChmcmVxdWVuY3kgPT0gMjQ4NCkKKyAgICAgICAgeworICAgCSAgICAgICAgdGVtcF9jaGFuX3NlbCA9IDEwICsgKGZyZXF1ZW5jeSAtIDIyNzQpLzUgOworICAgCSAgICAgICAgYm1vZGVfTEZfc3ludGhfZnJlcSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wX2NoYW5fc2VsID0gMTYgKyAoZnJlcXVlbmN5IC0gMjI3MikvNSA7CisgICAgICAgICAgICBibW9kZV9MRl9zeW50aF9mcmVxID0gMDsKKyAgICAgICAgfQorICAgICAgICBjaGFuX3NlbCA9ICh1OF90KSh0ZW1wX2NoYW5fc2VsIDw8IDIpICYgMHhmZjsKKyAgICAgICAgY2hhbnNlbCAgPSAodThfdClyZXZlcnNlX2JpdHMoY2hhbl9zZWwpOworCX0KKworCWQxICAgPSBjaGFuc2VsOyAgIC8vIyA4IGJpdHMgb2YgY2hhbgorCWQwICAgPSBhZGRyMDw8NyB8IGFkZHIxPDw2IHwgYWRkcjI8PDUKKwkJCXwgYW1vZGVfcmVmc2VsXzA8PDMgfCBhbW9kZV9yZWZzZWxfMTw8MgorCQkJfCBibW9kZV9MRl9zeW50aF9mcmVxPDwxIHwgY2h1cDsKKworICAgIHRtcF8wID0gZDAgJiAweDFmOyAgLy8jIDUtMQorICAgIHRtcF8xID0gZDEgJiAweDFmOyAgLy8jIDUtMQorICAgIGRhdGEwID0gdG1wXzE8PDUgfCB0bXBfMDsKKworICAgIHRtcF8wID0gZDA+PjUgJiAweDc7ICAvLyMgOC02CisgICAgdG1wXzEgPSBkMT4+NSAmIDB4NzsgIC8vIyA4LTYKKyAgICBkYXRhMSA9IHRtcF8xPDw1IHwgdG1wXzA7CisKKyAgICAvKiBCYW5rNCAqLworCXJlZ193cml0ZSAoMHg5ODAwKygweDJjPDwyKSwgZGF0YTApOworCXJlZ193cml0ZSAoMHg5ODAwKygweDNhPDwyKSwgZGF0YTEpOworCS8vem1fZGVidWdfbXNnMSgiMHg5ODAwKygweDJjPDwyID0gICIsIGRhdGEwKTsKKwkvL3ptX2RlYnVnX21zZzEoIjB4OTgwMCsoMHgzYTw8MiA9ICAiLCBkYXRhMSk7CisKKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICB6ZndTbGVlcChkZXYsIDEwKTsKKworICAgIHJldHVybjsKK30KKworCitzdHJ1Y3QgenNQaHlGcmVxUGFyYQoreworICAgIHUzMl90IGNvZWZmX2V4cDsKKyAgICB1MzJfdCBjb2VmZl9tYW47CisgICAgdTMyX3QgY29lZmZfZXhwX3NoZ2k7CisgICAgdTMyX3QgY29lZmZfbWFuX3NoZ2k7Cit9OworCitzdHJ1Y3QgenNQaHlGcmVxVGFibGUKK3sKKyAgICB1MzJfdCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgRnBnYUR5bmFtaWNIVDsKKyAgICBzdHJ1Y3QgenNQaHlGcmVxUGFyYSBGcGdhU3RhdGljSFQ7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgQ2hpcFNUMjBNaHo7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgQ2hpcDIwNDBNaHo7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgQ2hpcDIwNDBFeHRBYm92ZTsKK307CisKK2NvbnN0IHN0cnVjdCB6c1BoeUZyZXFUYWJsZSB6Z1BoeUZyZXFDb2VmZltdID0KK3sKKy8qSW5kZXggICBmcmVxICBGUEdBIERZTkFNSUNfSFQyMDQwX0VOICBGUEdBIFNUQVRJQ19IVDIwICAgIFJlYWwgQ2hpcCBzdGF0aWMyME1IeiAgICAgUmVhbCBDaGlwIDIwNDBNSHogICBSZWFsIENoaXAgMjA0ME1oeiAgKi8KKyAgICAgICAvKiBmY2xrID0gICAgICAgICAxMC44ICAgICAgICAgICAgICAgIDIxLjYgICAgICAgICAgICAgICAgICA0MCAgICAgICAgICAgICAgICAgIGV4dCBiZWxvdyA0MCAgICAgICBleHQgYWJvdmUgNDAgICAgICAgKi8KKy8qICAwICovIHsyNDEyLCB7NSwgMjM0NzYsIDUsIDIxMTI4fSwgezQsIDIzNDc2LCA0LCAyMTEyOH0sIHszLCAyMTczNywgMywgMTk1NjN9LCB7MywgMjE4MjcsIDMsIDE5NjQ0fSwgezMsIDIxNjQ3LCAzLCAxOTQ4Mn19LAorLyogIDEgKi8gezI0MTcsIHs1LCAyMzQyNywgNSwgMjEwODR9LCB7NCwgMjM0MjcsIDQsIDIxMDg0fSwgezMsIDIxNjkyLCAzLCAxOTUyM30sIHszLCAyMTc4MiwgMywgMTk2MDR9LCB7MywgMjE2MDIsIDMsIDE5NDQyfX0sCisvKiAgMiAqLyB7MjQyMiwgezUsIDIzMzc5LCA1LCAyMTA0MX0sIHs0LCAyMzM3OSwgNCwgMjEwNDF9LCB7MywgMjE2NDcsIDMsIDE5NDgyfSwgezMsIDIxNzM3LCAzLCAxOTU2M30sIHszLCAyMTU1OCwgMywgMTk0MDJ9fSwKKy8qICAzICovIHsyNDI3LCB7NSwgMjMzMzAsIDUsIDIwOTk3fSwgezQsIDIzMzMwLCA0LCAyMDk5N30sIHszLCAyMTYwMiwgMywgMTk0NDJ9LCB7MywgMjE2OTIsIDMsIDE5NTIzfSwgezMsIDIxNTE0LCAzLCAxOTM2Mn19LAorLyogIDQgKi8gezI0MzIsIHs1LCAyMzI4MywgNSwgMjA5NTR9LCB7NCwgMjMyODMsIDQsIDIwOTU0fSwgezMsIDIxNTU4LCAzLCAxOTQwMn0sIHszLCAyMTY0NywgMywgMTk0ODJ9LCB7MywgMjE0NzAsIDMsIDE5MzIzfX0sCisvKiAgNSAqLyB7MjQzNywgezUsIDIzMjM1LCA1LCAyMDkxMX0sIHs0LCAyMzIzNSwgNCwgMjA5MTF9LCB7MywgMjE1MTQsIDMsIDE5MzYyfSwgezMsIDIxNjAyLCAzLCAxOTQ0Mn0sIHszLCAyMTQyNiwgMywgMTkyODN9fSwKKy8qICA2ICovIHsyNDQyLCB7NSwgMjMxODcsIDUsIDIwODY4fSwgezQsIDIzMTg3LCA0LCAyMDg2OH0sIHszLCAyMTQ3MCwgMywgMTkzMjN9LCB7MywgMjE1NTgsIDMsIDE5NDAyfSwgezMsIDIxMzgyLCAzLCAxOTI0NH19LAorLyogIDcgKi8gezI0NDcsIHs1LCAyMzE0MCwgNSwgMjA4MjZ9LCB7NCwgMjMxNDAsIDQsIDIwODI2fSwgezMsIDIxNDI2LCAzLCAxOTI4M30sIHszLCAyMTUxNCwgMywgMTkzNjJ9LCB7MywgMjEzMzksIDMsIDE5MjA1fX0sCisvKiAgOCAqLyB7MjQ1MiwgezUsIDIzMDkzLCA1LCAyMDc4M30sIHs0LCAyMzA5MywgNCwgMjA3ODN9LCB7MywgMjEzODIsIDMsIDE5MjQ0fSwgezMsIDIxNDcwLCAzLCAxOTMyM30sIHszLCAyMTI5NSwgMywgMTkxNjZ9fSwKKy8qICA5ICovIHsyNDU3LCB7NSwgMjMwNDYsIDUsIDIwNzQxfSwgezQsIDIzMDQ2LCA0LCAyMDc0MX0sIHszLCAyMTMzOSwgMywgMTkyMDV9LCB7MywgMjE0MjYsIDMsIDE5MjgzfSwgezMsIDIxMjUyLCAzLCAxOTEyN319LAorLyogMTAgKi8gezI0NjIsIHs1LCAyMjk5OSwgNSwgMjA2OTl9LCB7NCwgMjI5OTksIDQsIDIwNjk5fSwgezMsIDIxMjk1LCAzLCAxOTE2Nn0sIHszLCAyMTM4MiwgMywgMTkyNDR9LCB7MywgMjEyMDksIDMsIDE5MDg4fX0sCisvKiAxMSAqLyB7MjQ2NywgezUsIDIyOTUyLCA1LCAyMDY1N30sIHs0LCAyMjk1MiwgNCwgMjA2NTd9LCB7MywgMjEyNTIsIDMsIDE5MTI3fSwgezMsIDIxMzM5LCAzLCAxOTIwNX0sIHszLCAyMTE2NiwgMywgMTkwNTB9fSwKKy8qIDEyICovIHsyNDcyLCB7NSwgMjI5MDYsIDUsIDIwNjE1fSwgezQsIDIyOTA2LCA0LCAyMDYxNX0sIHszLCAyMTIwOSwgMywgMTkwODh9LCB7MywgMjEyOTUsIDMsIDE5MTY2fSwgezMsIDIxMTI0LCAzLCAxOTAxMX19LAorLyogMTMgKi8gezI0ODQsIHs1LCAyMjc5NSwgNSwgMjA1MTZ9LCB7NCwgMjI3OTUsIDQsIDIwNTE2fSwgezMsIDIxMTA3LCAzLCAxODk5Nn0sIHszLCAyMTE5MiwgMywgMTkwNzN9LCB7MywgMjEwMjIsIDMsIDE4OTIwfX0sCisvKiAxNCAqLyB7NDkyMCwgezYsIDIzMDE4LCA2LCAyMDcxNn0sIHs1LCAyMzAxOCwgNSwgMjA3MTZ9LCB7NCwgMjEzMTMsIDQsIDE5MTgxfSwgezQsIDIxMzU2LCA0LCAxOTIyMH0sIHs0LCAyMTI2OSwgNCwgMTkxNDJ9fSwKKy8qIDE1ICovIHs0OTQwLCB7NiwgMjI5MjQsIDYsIDIwNjMyfSwgezUsIDIyOTI0LCA1LCAyMDYzMn0sIHs0LCAyMTIyNiwgNCwgMTkxMDR9LCB7NCwgMjEyNjksIDQsIDE5MTQyfSwgezQsIDIxMTgzLCA0LCAxOTA2NX19LAorLyogMTYgKi8gezQ5NjAsIHs2LCAyMjgzMiwgNiwgMjA1NDl9LCB7NSwgMjI4MzIsIDUsIDIwNTQ5fSwgezQsIDIxMTQxLCA0LCAxOTAyN30sIHs0LCAyMTE4MywgNCwgMTkwNjV9LCB7NCwgMjEwOTgsIDQsIDE4OTg4fX0sCisvKiAxNyAqLyB7NDk4MCwgezYsIDIyNzQwLCA2LCAyMDQ2Nn0sIHs1LCAyMjc0MCwgNSwgMjA0NjZ9LCB7NCwgMjEwNTYsIDQsIDE4OTUwfSwgezQsIDIxMDk4LCA0LCAxODk4OH0sIHs0LCAyMTAxNCwgNCwgMTg5MTJ9fSwKKy8qIDE4ICovIHs1MDQwLCB7NiwgMjI0NjksIDYsIDIwMjIzfSwgezUsIDIyNDY5LCA1LCAyMDIyM30sIHs0LCAyMDgwNSwgNCwgMTg3MjV9LCB7NCwgMjA4NDYsIDQsIDE4NzYyfSwgezQsIDIwNzY0LCA0LCAxODY4N319LAorLyogMTkgKi8gezUwNjAsIHs2LCAyMjM4MSwgNiwgMjAxNDN9LCB7NSwgMjIzODEsIDUsIDIwMTQzfSwgezQsIDIwNzIzLCA0LCAxODY1MX0sIHs0LCAyMDc2NCwgNCwgMTg2ODd9LCB7NCwgMjA2ODIsIDQsIDE4NjE0fX0sCisvKiAyMCAqLyB7NTA4MCwgezYsIDIyMjkzLCA2LCAyMDA2M30sIHs1LCAyMjI5MywgNSwgMjAwNjN9LCB7NCwgMjA2NDEsIDQsIDE4NTc3fSwgezQsIDIwNjgyLCA0LCAxODYxNH0sIHs0LCAyMDYwMSwgNCwgMTg1NDF9fSwKKy8qIDIxICovIHs1MTgwLCB7NiwgMjE4NjIsIDYsIDE5Njc2fSwgezUsIDIxODYyLCA1LCAxOTY3Nn0sIHs0LCAyMDI0MywgNCwgMTgyMTl9LCB7NCwgMjAyODIsIDQsIDE4MjU0fSwgezQsIDIwMjA0LCA0LCAxODE4M319LAorLyogMjIgKi8gezUyMDAsIHs2LCAyMTc3OCwgNiwgMTk2MDB9LCB7NSwgMjE3NzgsIDUsIDE5NjAwfSwgezQsIDIwMTY1LCA0LCAxODE0OH0sIHs0LCAyMDIwNCwgNCwgMTgxODN9LCB7NCwgMjAxMjYsIDQsIDE4MTE0fX0sCisvKiAyMyAqLyB7NTIyMCwgezYsIDIxNjk1LCA2LCAxOTUyNX0sIHs1LCAyMTY5NSwgNSwgMTk1MjV9LCB7NCwgMjAwODgsIDQsIDE4MDc5fSwgezQsIDIwMTI2LCA0LCAxODExNH0sIHs0LCAyMDA0OSwgNCwgMTgwNDR9fSwKKy8qIDI0ICovIHs1MjQwLCB7NiwgMjE2MTIsIDYsIDE5NDUxfSwgezUsIDIxNjEyLCA1LCAxOTQ1MX0sIHs0LCAyMDAxMSwgNCwgMTgwMTB9LCB7NCwgMjAwNDksIDQsIDE4MDQ0fSwgezQsIDE5OTczLCA0LCAxNzk3Nn19LAorLyogMjUgKi8gezUyNjAsIHs2LCAyMTUzMCwgNiwgMTkzNzd9LCB7NSwgMjE1MzAsIDUsIDE5Mzc3fSwgezQsIDE5OTM1LCA0LCAxNzk0MX0sIHs0LCAxOTk3MywgNCwgMTc5NzZ9LCB7NCwgMTk4OTcsIDQsIDE3OTA3fX0sCisvKiAyNiAqLyB7NTI4MCwgezYsIDIxNDQ4LCA2LCAxOTMwM30sIHs1LCAyMTQ0OCwgNSwgMTkzMDN9LCB7NCwgMTk4NTksIDQsIDE3ODczfSwgezQsIDE5ODk3LCA0LCAxNzkwN30sIHs0LCAxOTgyMiwgNCwgMTc4NDB9fSwKKy8qIDI3ICovIHs1MzAwLCB7NiwgMjEzNjcsIDYsIDE5MjMwfSwgezUsIDIxMzY3LCA1LCAxOTIzMH0sIHs0LCAxOTc4NCwgNCwgMTc4MDZ9LCB7NCwgMTk4MjIsIDQsIDE3ODQwfSwgezQsIDE5NzQ3LCA0LCAxNzc3Mn19LAorLyogMjggKi8gezUzMjAsIHs2LCAyMTI4NywgNiwgMTkxNTh9LCB7NSwgMjEyODcsIDUsIDE5MTU4fSwgezQsIDE5NzEwLCA0LCAxNzczOX0sIHs0LCAxOTc0NywgNCwgMTc3NzJ9LCB7NCwgMTk2NzMsIDQsIDE3NzA2fX0sCisvKiAyOSAqLyB7NTUwMCwgezYsIDIwNTkwLCA2LCAxODUzMX0sIHs1LCAyMDU5MCwgNSwgMTg1MzF9LCB7NCwgMTkwNjUsIDQsIDE3MTU5fSwgezQsIDE5MTAwLCA0LCAxNzE5MH0sIHs0LCAxOTAzMCwgNCwgMTcxMjd9fSwKKy8qIDMwICovIHs1NTIwLCB7NiwgMjA1MTYsIDYsIDE4NDY0fSwgezUsIDIwNTE2LCA1LCAxODQ2NH0sIHs0LCAxODk5NiwgNCwgMTcwOTZ9LCB7NCwgMTkwMzAsIDQsIDE3MTI3fSwgezQsIDE4OTYyLCA0LCAxNzA2NX19LAorLyogMzEgKi8gezU1NDAsIHs2LCAyMDQ0MiwgNiwgMTgzOTd9LCB7NSwgMjA0NDIsIDUsIDE4Mzk3fSwgezQsIDE4OTI3LCA0LCAxNzAzNX0sIHs0LCAxODk2MiwgNCwgMTcwNjV9LCB7NCwgMTg4OTMsIDQsIDE3MDA0fX0sCisvKiAzMiAqLyB7NTU2MCwgezYsIDIwMzY4LCA2LCAxODMzMX0sIHs1LCAyMDM2OCwgNSwgMTgzMzF9LCB7NCwgMTg4NTksIDQsIDE2OTczfSwgezQsIDE4ODkzLCA0LCAxNzAwNH0sIHs0LCAxODgyNSwgNCwgMTY5NDN9fSwKKy8qIDMzICovIHs1NTgwLCB7NiwgMjAyOTUsIDYsIDE4MjY2fSwgezUsIDIwMjk1LCA1LCAxODI2Nn0sIHs0LCAxODc5MiwgNCwgMTY5MTN9LCB7NCwgMTg4MjUsIDQsIDE2OTQzfSwgezQsIDE4NzU4LCA0LCAxNjg4Mn19LAorLyogMzQgKi8gezU2MDAsIHs2LCAyMDIyMywgNiwgMTgyMDB9LCB7NSwgMjAyMjMsIDUsIDE4MjAwfSwgezQsIDE4NzI1LCA0LCAxNjg1Mn0sIHs0LCAxODc1OCwgNCwgMTY4ODJ9LCB7NCwgMTg2OTEsIDQsIDE2ODIyfX0sCisvKiAzNSAqLyB7NTYyMCwgezYsIDIwMTUxLCA2LCAxODEzNn0sIHs1LCAyMDE1MSwgNSwgMTgxMzZ9LCB7NCwgMTg2NTgsIDQsIDE2NzkyfSwgezQsIDE4NjkxLCA0LCAxNjgyMn0sIHs0LCAxODYyNSwgNCwgMTY3NjJ9fSwKKy8qIDM2ICovIHs1NjQwLCB7NiwgMjAwNzksIDYsIDE4MDcxfSwgezUsIDIwMDc5LCA1LCAxODA3MX0sIHs0LCAxODU5MiwgNCwgMTY3MzN9LCB7NCwgMTg2MjUsIDQsIDE2NzYyfSwgezQsIDE4NTU5LCA0LCAxNjcwM319LAorLyogMzcgKi8gezU2NjAsIHs2LCAyMDAwOCwgNiwgMTgwMDd9LCB7NSwgMjAwMDgsIDUsIDE4MDA3fSwgezQsIDE4NTI2LCA0LCAxNjY3M30sIHs0LCAxODU1OSwgNCwgMTY3MDN9LCB7NCwgMTg0OTMsIDQsIDE2NjQ0fX0sCisvKiAzOCAqLyB7NTY4MCwgezYsIDE5OTM4LCA2LCAxNzk0NH0sIHs1LCAxOTkzOCwgNSwgMTc5NDR9LCB7NCwgMTg0NjEsIDQsIDE2NjE1fSwgezQsIDE4NDkzLCA0LCAxNjY0NH0sIHs0LCAxODQyOCwgNCwgMTY1ODZ9fSwKKy8qIDM5ICovIHs1NzAwLCB7NiwgMTk4NjgsIDYsIDE3ODgxfSwgezUsIDE5ODY4LCA1LCAxNzg4MX0sIHs0LCAxODM5NiwgNCwgMTY1NTZ9LCB7NCwgMTg0MjgsIDQsIDE2NTg2fSwgezQsIDE4MzY0LCA0LCAxNjUyN319LAorLyogNDAgKi8gezU3NDUsIHs2LCAxOTcxMiwgNiwgMTc3NDF9LCB7NSwgMTk3MTIsIDUsIDE3NzQxfSwgezQsIDE4MjUyLCA0LCAxNjQyN30sIHs0LCAxODI4NCwgNCwgMTY0NTV9LCB7NCwgMTgyMjAsIDQsIDE2Mzk4fX0sCisvKiA0MSAqLyB7NTc2NSwgezYsIDE5NjQ0LCA2LCAxNzY3OX0sIHs1LCAxOTY0NCwgNSwgMTc2Nzl9LCB7NCwgMTgxODksIDUsIDMyNzQwfSwgezQsIDE4MjIwLCA0LCAxNjM5OH0sIHs0LCAxODE1NywgNSwgMzI2ODN9fSwKKy8qIDQyICovIHs1Nzg1LCB7NiwgMTk1NzYsIDYsIDE3NjE4fSwgezUsIDE5NTc2LCA1LCAxNzYxOH0sIHs0LCAxODEyNiwgNSwgMzI2MjZ9LCB7NCwgMTgxNTcsIDUsIDMyNjgzfSwgezQsIDE4MDk0LCA1LCAzMjU3MH19LAorLyogNDMgKi8gezU4MDUsIHs2LCAxOTUwOCwgNiwgMTc1NTh9LCB7NSwgMTk1MDgsIDUsIDE3NTU4fSwgezQsIDE4MDYzLCA1LCAzMjUxNH0sIHs0LCAxODA5NCwgNSwgMzI1NzB9LCB7NCwgMTgwMzIsIDUsIDMyNDU4fX0sCisvKiA0NCAqLyB7NTgyNSwgezYsIDE5NDQxLCA2LCAxNzQ5N30sIHs1LCAxOTQ0MSwgNSwgMTc0OTd9LCB7NCwgMTgwMDEsIDUsIDMyNDAyfSwgezQsIDE4MDMyLCA1LCAzMjQ1OH0sIHs0LCAxNzk3MCwgNSwgMzIzNDd9fSwKKy8qIDQ1ICovIHs1MTcwLCB7NiwgMjE5MDQsIDYsIDE5NzE0fSwgezUsIDIxOTA0LCA1LCAxOTcxNH0sIHs0LCAyMDI4MiwgNCwgMTgyNTR9LCB7NCwgMjAzMjEsIDQsIDE4Mjg5fSwgezQsIDIwMjQzLCA0LCAxODIxOX19LAorLyogNDYgKi8gezUxOTAsIHs2LCAyMTgyMCwgNiwgMTk2Mzh9LCB7NSwgMjE4MjAsIDUsIDE5NjM4fSwgezQsIDIwMjA0LCA0LCAxODE4M30sIHs0LCAyMDI0MywgNCwgMTgyMTl9LCB7NCwgMjAxNjUsIDQsIDE4MTQ4fX0sCisvKiA0NyAqLyB7NTIxMCwgezYsIDIxNzM2LCA2LCAxOTU2M30sIHs1LCAyMTczNiwgNSwgMTk1NjN9LCB7NCwgMjAxMjYsIDQsIDE4MTE0fSwgezQsIDIwMTY1LCA0LCAxODE0OH0sIHs0LCAyMDA4OCwgNCwgMTgwNzl9fSwKKy8qIDQ4ICovIHs1MjMwLCB7NiwgMjE2NTMsIDYsIDE5NDg4fSwgezUsIDIxNjUzLCA1LCAxOTQ4OH0sIHs0LCAyMDA0OSwgNCwgMTgwNDR9LCB7NCwgMjAwODgsIDQsIDE4MDc5fSwgezQsIDIwMDExLCA0LCAxODAxMH19Cit9OworLyogdG8gcmVkdWNlIHNlYXJjaCB0aW1lLCBwbGVhc2UgbW9kaWZ5IHRoaXMgZGVmaW5lIGlmIHlvdSBhZGQgb3IgZGVsZXRlIGNoYW5uZWwgaW4gdGFibGUgKi8KKyNkZWZpbmUgRmlyc3Q1R0NoYW5uZWxJbmRleCAxNAorCit2b2lkIHpmR2V0SHdUdXJuT2ZmZHluUGFyYW0oemRldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSkKK3sKKyAgICAvKiBHZXQgcGFyYW0gZm9yIHR1cm5vZmZkeW4gKi8KKyAgICB1MTZfdCBpLCBhcnJheVNpemU7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGFycmF5U2l6ZSA9IHNpemVvZih6Z1BoeUZyZXFDb2VmZikvc2l6ZW9mKHN0cnVjdCB6c1BoeUZyZXFUYWJsZSk7CisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICAvKiAyLjRHSHogQ2hhbm5lbCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRmlyc3Q1R0NoYW5uZWxJbmRleDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZnJlcXVlbmN5ID09IHpnUGh5RnJlcUNvZWZmW2ldLmZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgRmlyc3Q1R0NoYW5uZWxJbmRleCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzAsICJVbnN1cHBvcnRlZCAyLjRHIGZyZXF1ZW5jeSA9ICIsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogNUdIeiBDaGFubmVsICovCisgICAgICAgIGZvciAoaSA9IEZpcnN0NUdDaGFubmVsSW5kZXg7IGkgPCBhcnJheVNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeSA9PSB6Z1BoeUZyZXFDb2VmZltpXS5mcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IGFycmF5U2l6ZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzAsICJVbnN1cHBvcnRlZCA1RyBmcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRlBHQSBEWU5BTUlDX0hUMjA0MF9FTiAgICAgICAgZmNsayA9IDEwLjggICovCisgICAgLyogRlBHQSBTVEFUSUNfSFQyMF8gICAgICAgICAgICAgZmNsayA9IDIxLjYgICovCisgICAgLyogUmVhbCBDaGlwICAgICAgICAgICAgICAgICAgICAgZmNsayA9IDQwICAgICovCisgICAgI2lmIFpNX0ZQR0FfUEhZID09IDEKKyAgICAvL2ZjbGsgPSAxMC44OworICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHAgPSB6Z1BoeUZyZXFDb2VmZltpXS5GcGdhRHluYW1pY0hULmNvZWZmX2V4cDsKKyAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9tYW47CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9leHBfc2hnaTsKKyAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5GcGdhRHluYW1pY0hULmNvZWZmX21hbl9zaGdpOworICAgICNlbHNlCisgICAgLy9mY2xrID0gNDA7CisgICAgaWYgKGJ3NDApCisgICAgeworICAgICAgICAvKiBodDIwNDAgKi8KKyAgICAgICAgaWYgKGV4dE9mZnNldCA9PSAxKSB7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBFeHRBYm92ZS5jb2VmZl9leHA7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBFeHRBYm92ZS5jb2VmZl9tYW47CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0MEV4dEFib3ZlLmNvZWZmX2V4cF9zaGdpOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBFeHRBYm92ZS5jb2VmZl9tYW5fc2hnaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHAgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0ME1oei5jb2VmZl9leHA7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfbWFuOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfZXhwX3NoZ2k7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwMjA0ME1oei5jb2VmZl9tYW5fc2hnaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzdGF0aWMgMjAgKi8KKyAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXBTVDIwTWh6LmNvZWZmX2V4cDsKKyAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXBTVDIwTWh6LmNvZWZmX21hbjsKKyAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcFNUMjBNaHouY29lZmZfZXhwX3NoZ2k7CisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXBTVDIwTWh6LmNvZWZmX21hbl9zaGdpOworICAgIH0KKyAgICAjZW5kaWYKK30KKworLyogTWFpbiByb3V0aW4gZnJlcXVlbmN5IHNldHRpbmcgZnVuY3Rpb24gKi8KKy8qIElmIDIuNEcvNUcgc3dpdGNoLCBQSFkgbmVlZCByZXNldHRpbmcgQkIgYW5kIFJGIGZvciBiYW5kIHN3aXRjaCAqLworLyogRG8gdGhlIHNldHRpbmcgc3dpdGNoIGluIHpmU2VuZEZyZXF1ZW5jeUNtZCgpICovCit2b2lkIHpmSHBTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB1OF90IGluaXRSRikKK3sKKyAgICB1MzJfdCBjbWRbOV07CisgICAgdTMyX3QgY21kQlszXTsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCBvbGRfYmFuZDsKKyAgICB1OF90IG5ld19iYW5kOworICAgIHUzMl90IGNoZWNrTG9vcENvdW50OworICAgIHUzMl90IHRtcFZhbHVlOworCisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cDsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfbWFuOworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJGcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiYnc0MCA9ICIsIGJ3NDApOworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiZXh0T2Zmc2V0ID0gIiwgZXh0T2Zmc2V0KTsKKworICAgIGlmICggaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSApCisgICAgeworICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgaW5pdFJGID0gMjsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZIcFNldEZyZXF1ZW5jeUV4OiBEbyBDb2xkUmVzZXQgIik7CisgICAgfQorICAgIGlmICggaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPT0gMiApCisgICAgeworICAgICAgICAvKiB3YWl0IHRpbWUgZm9yIEFHQyBhbmQgbm9pc2UgY2FsaWJyYXRpb24gOiBub3QgaW4gc2l0ZXN1cnZleSBhbmQgY29ubmVjdGVkICovCisgICAgICAgIGNoZWNrTG9vcENvdW50ID0gMjAwMDsgLyogMjAwMCoxMDAgPSAyMDBtcyAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiB3YWl0IHRpbWUgZm9yIEFHQyBhbmQgbm9pc2UgY2FsaWJyYXRpb24gOiBpbiBzaXRlc3VydmV5ICovCisgICAgICAgIGNoZWNrTG9vcENvdW50ID0gMTAwMDsgLyogMTAwMCoxMDAgPSAxMDBtcyAqLworICAgIH0KKworICAgIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCA9IGJ3NDA7CisgICAgaHBQcml2LT5sYXRlc3RFeHRPZmZzZXQgPSBleHRPZmZzZXQ7CisKKyAgICBpZiAoKGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTCkgfHwKKyAgICAgICAgKGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfV1BBMlBTSykpCisgICAgeworICAgICAgICBpZiAoIGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3IgMTFnIEFkIEhvYyBiZWFjb24gZGlzdHJpYnV0aW9uICovCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCAweDdmMDAwNyk7CisgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX0FJRlMsIDB4MWMwNDkwMWMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQUhCLCBEQUMsIEFEQyBjbG9jayBzZWxlY3Rpb24gYnkgc3RhdGljMjAvaHQyMDQwICovCisgICAgemZTZWxBZGNDbGsoZGV2LCBidzQwLCBmcmVxdWVuY3kpOworCisgICAgLyogY2xlYXIgYmJfaGVhdnlfY2xpcF9lbmFibGUgKi8KKyAgICByZWdfd3JpdGUoMHg5OWUwLCAweDIwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIC8qIFNldCBDVFMvUlRTIHJhdGUgKi8KKyAgICBpZiAoIGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQgKQorICAgIHsKKyAgICAgICAgLy96ZkhwU2V0UlRTQ1RTUmF0ZShkZXYsIDB4MTBiMDEwYik7ICAvKiBPRkRNIDZNICovCisJICAgIG5ld19iYW5kID0gMTsKKwl9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy96ZkhwU2V0UlRTQ1RTUmF0ZShkZXYsIDB4MzAwMDMpOyAgLyogQ0NLIDExTSAqLworICAgICAgICBuZXdfYmFuZCA9IDA7CisgICAgfQorCisgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPiBaTV9DSF9HXzE0KQorICAgICAgICBvbGRfYmFuZCA9IDE7CisgICAgZWxzZQorICAgICAgICBvbGRfYmFuZCA9IDA7CisKKyAgICAvL1dvcmthcm91bmQgZm9yIDIuNEdIeiBvbmx5IGRldmljZQorICAgIGlmICgoaHBQcml2LT5PcEZsYWdzICYgMHgxKSA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKCgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID09IFpNX0NIX0dfMSkgJiYgKGZyZXF1ZW5jeSA9PSBaTV9DSF9HXzIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3JjZSB0byBkbyBiYW5kIHN3aXRjaGluZyAqLworICAgICAgICAgICAgb2xkX2JhbmQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm90aWZ5IGNoYW5uZWwgc3dpdGNoIHRvIGZpcm13YXJlICovCisgICAgLyogVFgvUlggbXVzdCBiZSBzdG9wcGVkIGJ5IG5vdyAqLworICAgIGNtZFswXSA9IDAgfCAoWk1fQ01EX0ZSRVFfU1RSQVQgPDwgOCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCAwKTsKKworICAgIGlmICgoaW5pdFJGICE9IDApIHx8IChuZXdfYmFuZCAhPSBvbGRfYmFuZCkKKyAgICAgICAgICAgIHx8ICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCAhPSBidzQwKSkKKyAgICB7CisgICAgICAgIC8qIGJhbmQgc3dpdGNoICovCisgICAgICAgIHptX21zZzBfc2NhbihaTV9MVl8xLCAiPT09PT1iYW5kIHN3aXRjaD09PT09Iik7CisKKyAgICAgICAgaWYgKGluaXRSRiA9PSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db2xkIHJlc2V0IEJCL0FEREEKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDQwMDQsIDB4ODAwKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICAgICB6bV9tc2cwX3NjYW4oWk1fTFZfMSwgIkRvIGNvbGQgcmVzZXQgQkIvQUREQSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9XYXJtIHJlc2V0IEJCL0FEREEKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDQwMDQsIDB4NDAwKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXNldCB3b3JrYXJvdW5kIHN0YXRlIHRvIGRlZmF1bHQgKi8KKyAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAwOworICAgICAgICBocFByaXYtPnN0cm9uZ1JTU0kgPSAwOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDQwMDQsIDB4MCk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgemZJbml0UGh5KGRldiwgZnJlcXVlbmN5LCBidzQwKTsKKworLy8gICAgICAgIHpmaUNoZWNrUmlmcyhkZXYpOworCisgICAgICAgIC8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLworICAgICAgICB6ZlNldFJmUmVncyhkZXYsIGZyZXF1ZW5jeSk7CisgICAgICAgIC8qIEJhbmsgNCAqLworICAgICAgICB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZShkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KTsKKworICAgICAgICBjbWRbMF0gPSAzMiB8IChaTV9DTURfUkZfSU5JVCA8PCA4KTsKKyAgICB9CisgICAgZWxzZSAvLygobmV3X2JhbmQgPT0gb2xkX2JhbmQpICYmICFpbml0UkYpCisgICAgeworICAgICAgIC8qIHNhbWUgYmFuZCAqLworCisgICAgICAgLyogRm9yY2UgZGlzYWJsZSBDUjY3MSBiaXQyMCAvIDc4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgLyogVGhlIGJ1ZyBoYXMgdG8gZG8gd2l0aCB0aGUgcG9sYXJpdHkgb2YgdGhlIHBkYWRjIG9mZnNldCBjYWxpYnJhdGlvbi4gIFRoZXJlICovCisgICAgICAgLyogaXMgYW4gaW5pdGlhbCBjYWxpYnJhdGlvbiB0aGF0IGlzIE9LLCBhbmQgdGhlcmUgaXMgYSBjb250aW51b3VzICAgICAgICAgICAgICovCisgICAgICAgLyogY2FsaWJyYXRpb24gdGhhdCB1cGRhdGVzIHRoZSBwZGRhYyB3aXRoIHRoZSB3cm9uZyBwb2xhcml0eS4gIEZvcnR1bmF0ZWx5ICAgICovCisgICAgICAgLyogdGhlIHNlY29uZCBsb29wIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGEgYml0IGNhbGxlZCBlbl9wZF9kY19vZmZzZXRfdGhyLiAgICAgICovCisjaWYgMAorICAgICAgICBjbWRCWzBdID0gOCB8IChaTV9DTURfQklUQU5EIDw8IDgpOzsKKyAgICAgICAgY21kQlsxXSA9ICgweGEyN2MgKyAweDFiYzAwMCk7CisgICAgICAgIGNtZEJbMl0gPSAweGZmZWZmZmZmOworICAgICAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kQiwgMTIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7CisjZW5kaWYKKworICAgICAgIC8qIEJhbmsgNCAqLworICAgICAgIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpOworCisKKyAgICAgICAgY21kWzBdID0gMzIgfCAoWk1fQ01EX0ZSRVFVRU5DWSA8PCA4KTsKKyAgICB9CisKKyAgICAvKiBDb21wYXRpYmlsaXR5IGZvciBuZXcgbGF5b3V0IFVCODMgKi8KKyAgICAvKiBTZXR0aW5nIGNvZGUgYXQgQ1IxIGhlcmUgbW92ZSBmcm9tIHRoZSBmdW5jOnpmSHdIVEVuYWJsZSgpIGluIGZpcm13YXJlICovCisgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKyAgICB7CisgICAgICAgIC8qIFVCODMgOiBvbmUgc3RyZWFtICovCisgICAgICAgIHRtcFZhbHVlID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVUI4MSwgVUI4MiA6IHR3byBzdHJlYW0gKi8KKyAgICAgICAgdG1wVmFsdWUgPSAweDEwMDsKKyAgICB9CisKKyAgICBpZiAoMSkgLy9pZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19IVF9FTkFCTEUgPT0gMSkKKwl7CisgICAgICAgIGlmIChidzQwID09IDEpCisJCXsKKwkJCWlmIChleHRPZmZzZXQgPT0gMSkgeworICAgICAgICAgICAgCXJlZ193cml0ZSgweDk4MDQsIHRtcFZhbHVlIHwgMHgyZDQpOyAvLzNkNCBmb3IgcmVhbAorCQkJfQorCQkJZWxzZSB7CisJCQkJcmVnX3dyaXRlKDB4OTgwNCwgdG1wVmFsdWUgfCAweDJjNCk7ICAgLy8zYzQgZm9yIHJlYWwKKwkJCX0KKwkJCS8vIyBEeW4gSFQyMDQwLlJlZmVyIHRvIFJlZyAxLgorICAgICAgICAgICAgLy8jWzNdOnNpbmdsZSBsZW5ndGggKDR1cykgMXN0IEhUIGxvbmcgdHJhaW5pbmcgc3ltYm9sOyB1c2UgV2Fsc2ggc3BhdGlhbCBzcHJlYWRpbmcgZm9yIDIgY2hhaW5zIDIgc3RyZWFtcyBUWAorICAgICAgICAgICAgLy8jW2NdOmFsbG93IHNob3J0IEdJIGZvciBIVDQwIHBhY2tldHM7IGVuYWJsZSBIVCBkZXRlY3Rpb24uCisgICAgICAgICAgICAvLyNbNF06ZW5hYmxlIDIwLzQwIE1IeiBjaGFubmVsIGRldGVjdGlvbi4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisJICAgIHsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDQsIHRtcFZhbHVlIHwgMHgyNDApOworCQkgICAgLy8jIFN0YXRpYyBIVDIwCisgICAgICAgICAgICAvLyNbM106c2luZ2xlIGxlbmd0aCAoNHVzKSAxc3QgSFQgbG9uZyB0cmFpbmluZyBzeW1ib2w7IHVzZSBXYWxzaCBzcGF0aWFsIHNwcmVhZGluZyBmb3IgMiBjaGFpbnMgMiBzdHJlYW1zIFRYCisgICAgICAgICAgICAvLyNbNF06T3R1cyBkb24ndCBhbGxvdyBzaG9ydCBHSSBmb3IgSFQyMCBwYWNrZXRzIHlldDsgZW5hYmxlIEhUIGRldGVjdGlvbi4KKyAgICAgICAgICAgIC8vI1swXTpkaXNhYmxlIDIwLzQwIE1IeiBjaGFubmVsIGRldGVjdGlvbi4KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisJeworICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCAweDApOworCQkvLyMgTGVnYWN5OyMgRGlyZWN0IE1hcHBpbmcgZm9yIGVhY2ggY2hhaW4uCisgICAgICAgIC8vI0JlIG1vZGlmaWVkIGJ5IE9saWdvIHRvIGFkZCBkeW5hbmljIGZvciBsZWdhY3kuCisgICAgICAgIGlmIChidzQwID09IDEpCisJCXsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDQsIDB4NCk7ICAgICAvLyMgRHluIExlZ2FjeSAuUmVmZXIgdG8gcmVnIDEuCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQl7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCAweDApOyAgICAvLyMgU3RhdGljIExlZ2FjeQorICAgICAgICB9CisJfQorCXpmRmx1c2hEZWxheVdyaXRlKGRldik7CisJLyogZW5kIG9mIHViODMgY29tcGF0aWJpbGl0eSAqLworCisgICAgLyogU2V0IFBvd2VyLCBUUEMsIEdhaW4gdGFibGUuLi4gKi8KKwl6ZlNldFBvd2VyQ2FsVGFibGUoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCk7CisKKworICAgIC8qIHN0b3JlIGZyZXF1ZW5jeSAqLworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPSAodTE2X3QpZnJlcXVlbmN5OworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwID0gYnc0MDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworCisgICAgemZHZXRId1R1cm5PZmZkeW5QYXJhbShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKTsKKworICAgIC8qIHJlbGF0ZWQgZnVuY3Rpb25zICovCisgICAgZnJlcXVlbmN5ID0gZnJlcXVlbmN5KjEwMDA7CisgICAgLyogbGVuWzM2XSA6IHR5cGVbMHgzMF0gOiBzZXFbP10gKi8KKy8vICAgIGNtZFswXSA9IDI4IHwgKFpNX0NNRF9GUkVRVUVOQ1kgPDwgOCk7CisgICAgY21kWzFdID0gZnJlcXVlbmN5OworICAgIGNtZFsyXSA9IGJ3NDA7Ly8oKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0RZTkFNSUNfSFQyMDQwX0VOOworICAgIGNtZFszXSA9IChleHRPZmZzZXQ8PDIpfDB4MTsvLygod2QtPkV4dE9mZnNldCA8PCAyKSB8ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfSFRfRU5BQkxFKTsKKyAgICBjbWRbNF0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgY21kWzVdID0gZGVsdGFfc2xvcGVfY29lZmZfbWFuOworICAgIGNtZFs2XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpOworICAgIGNtZFs3XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworICAgIGNtZFs4XSA9IGNoZWNrTG9vcENvdW50OworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMzYsIFpNX0NNRF9TRVRfRlJFUVVFTkNZLCAwKTsKKworICAgIC8vIGRlbGF5IHRlbXBvcmFyaWx5LCB3YWl0IGZvciBuZXcgUEhZIGFuZCBSRgorICAgIC8vemZ3U2xlZXAoZGV2LCAxMDAwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKiogS2V5ICoqKioqKioqKioqKioqKioqKioqLworCit1MTZfdCB6ZkhwUmVzZXRLZXlDYWNoZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1OF90IGk7CisgICAgdTMyX3Qga2V5WzRdID0gezAsIDAsIDAsIDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBmb3IoaT0wO2k8NDtpKyspCisgICAgeworICAgICAgICB6ZkhwU2V0RGVmYXVsdEtleShkZXYsIGksIFpNX1dFUDY0LCBrZXksIE5VTEwpOworICAgIH0KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9MLCAweDAwKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9ILCAweDAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlID0gKHU2NF90KSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU2V0S2V5ICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTZXQga2V5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICEgcGxlYXNlIHVzZSB6ZkNvcmVTZXRLZXkoKSBpbiA4MDIxMUNvcmUgZm9yIFNldEtleSAqLwordTMyX3QgemZIcFNldEtleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90IHR5cGUsCisgICAgICAgIHUxNl90KiBtYWMsIHUzMl90KiBrZXkpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyNpZiAwICAgLyogcmVtb3ZlIHRvIHpmQ29yZVNldEtleSgpICovCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcrKzsKKyAgICB6bV9kZWJ1Z19tc2cxKCIgICB6ZkhwU2V0S2V5KysrKyAiLCB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbmRpZgorCisgICAgY21kWzBdID0gMHgwMDAwMjgxQzsKKyAgICBjbWRbMV0gPSAoKHUzMl90KWtleUlkPDwxNikgKyAodTMyX3QpdXNlcjsKKyAgICBjbWRbMl0gPSAoKHUzMl90KW1hY1swXTw8MTYpICsgKHUzMl90KXR5cGU7CisgICAgY21kWzNdID0gKCh1MzJfdCltYWNbMl08PDE2KSArICgodTMyX3QpbWFjWzFdKTsKKworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgIGNtZFs0K2ldID0ga2V5W2ldOworICAgIH0KKworICAgIGlmICh1c2VyIDwgNjQpCisgICAgeworICAgICAgICBocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgfD0gKCh1NjRfdCkgMSkgPDwgdXNlcjsKKyAgICB9CisKKyAgICAvL3JldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDMyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDMyLCBaTV9DTURfU0VUX0tFWSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCit1MzJfdCB6ZkhwU2V0QXBQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIHN0YU1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3Qgc3RhQWlkKQoreworICAgIGlmICgoc3RhQWlkIT0wKSAmJiAoc3RhQWlkPDY0KSkKKyAgICB7CisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCAoc3RhQWlkLTEpLCAwLCB0eXBlLCBzdGFNYWNBZGRyLCBrZXkpOworICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBaTV9US0lQKQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICB8fCAodHlwZSA9PSBaTV9DRU5DKQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgKQorICAgICAgICAgICAgemZIcFNldEtleShkZXYsIChzdGFBaWQtMSksIDEsIHR5cGUsIHN0YU1hY0FkZHIsIG1pY0tleSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKwordTMyX3QgemZIcFNldEFwR3JvdXBLZXkoemRldl90KiBkZXYsIHUxNl90KiBhcE1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3QgdmFwSWQpCit7CisgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQgLSAxIC0gdmFwSWQsIDAsIHR5cGUsIGFwTWFjQWRkciwga2V5KTsJLy8gNkQxOCBtb2RpZnkgZnJvbSAwIHRvIDEgPz8KKyAgICAgICAgICAgIGlmICgodHlwZSA9PSBaTV9US0lQKQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICB8fCAodHlwZSA9PSBaTV9DRU5DKQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgKQorICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCAtIDEgLSB2YXBJZCwgMSwgdHlwZSwgYXBNYWNBZGRyLCBtaWNLZXkpOworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkhwU2V0RGVmYXVsdEtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlJZCwgdThfdCB0eXBlLCB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KQoreworICAgIHUxNl90IG1hY0FkZHJbM10gPSB7MCwgMCwgMH07CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoIGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfV1BBMlBTSyApCisgICAgeyAvKiBJZiBub3Qgd3BhMnBzayAsIHVzZSB0cmFkaXRpb25hbCAqLworICAgICAgLyogQmVjYXVzZSB0aGUgYnVnIG9mIGNoaXAgLCBkZWZhdWx0a2V5IHNob3VsZCBmb2xsb3cgdGhlIGtleSBtYXAgcnVsZSBpbiByZWdpc3RlciA3MDAgKi8KKyAgICAgICAgaWYgKCBrZXlJZCA9PSAwICkKKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUlkLCAwLCB0eXBlLCBtYWNBZGRyLCBrZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMSwgdHlwZSwgbWFjQWRkciwga2V5KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwgdHlwZSwgbWFjQWRkciwga2V5KTsKKyAgICAjZWxzZQorICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwgdHlwZSwgbWFjQWRkciwga2V5KTsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgIGlmICgodHlwZSA9PSBaTV9US0lQKQorCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgIHx8ICh0eXBlID09IFpNX0NFTkMpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICApCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMSwgdHlwZSwgbWFjQWRkciwgbWljS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZIcFNldFBlclVzZXJLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCogbWFjLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpCit7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoIGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfV1BBMlBTSyApCisgICAgeyAvKiBJZiBub3Qgd3BhMnBzayAsIHVzZSB0cmFkaXRpb25hbCAqLworICAgICAgICBpZihrZXlJZCkKKyAgICAgICAgeyAgLyogU2V0IEdyb3VwIEtleSAqLworICAgICAgICAgICAgemZIcFNldEtleShkZXYsIHVzZXIsIDEsIHR5cGUsICh1MTZfdCAqKW1hYywga2V5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGtleUlkID09IDApCisgICAgICAgIHsgIC8qIFNldCBQYWlyd2lzZSBLZXkgKi8KKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCAwLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZIcFNldEtleShkZXYsIHVzZXIsIGtleUlkLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisgICAgfQorI2Vsc2UKKyAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsICh1MTZfdCAqKW1hYywga2V5KTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCBrZXlJZCArIDEsIHR5cGUsICh1MTZfdCAqKW1hYywgbWljS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkhwUmVtb3ZlS2V5ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUmVtb3ZlIGtleS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1MTZfdCB1c2VyKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQgPSAwOworCisgICAgY21kWzBdID0gMHgwMDAwMjkwNDsKKyAgICBjbWRbMV0gPSAodTMyX3QpdXNlcjsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKiBETUEgKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwU3RhcnRSZWN2KHpkZXZfdCogZGV2KQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNkMzAsIDB4MTAwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBTdG9wUmVjdih6ZGV2X3QqIGRldikKK3sKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKiogTUFDICoqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkluaXRNYWMoemRldl90KiBkZXYpCit7CisgICAgLyogQUNLIGV4dGVuc2lvbiByZWdpc3RlciAqLworICAgIC8vIGpobGVlIHRlbXAgOiBjaGFuZ2UgdmFsdWUgMHgyYyAtPiAweDQwCisgICAgLy8gaG9uZGEgcmVzb2x2ZSBzaG9ydCBwcmVhbWJsZSBwcm9ibGVtIDogMHg0MCAtPiAweDc1CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDS19FWFRFTlNJT04sIDB4NDApOyAvLyAweDI4IC0+IDB4MmMgNjUyMjp5ZmxlZQorCisgICAgLyogVHhRMC8xLzIvMyBSZXRyeSBNQVg9MiA9PiB0cmFuc21pdCAzIHRpbWVzIGFuZCBkZWdyYWRlIHJhdGUgZm9yIHJldHJ5ICovCisgICAgLyogUEI0MiBBUCBjcmFzaCBpc3N1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogV29ya2Fyb3VuZCB0aGUgY3Jhc2ggaXNzdWUgYnkgQ1RTL1JUUywgc2V0IHJldHJ5IG1heCB0byB6ZXJvIGZvciAgICAgICovCisgICAgLyogICB3b3JrYXJvdW5kIHR4IHVuZGVycnVuIHdoaWNoIGVuYWJsZSBDVFMvUlRTICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JFVFJZX01BWCwgMCk7IC8vIDB4MTExMTEgPT4gMAorCisgICAgLyogdXNlIGhhcmR3YXJlIE1JQyBjaGVjayAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTklGRkVSLCAweDIwMDAwMDApOworCisgICAgLyogU2V0IFJ4IHRocmVzaG9sZCB0byAxNjAwICovCisjaWYgWk1fTEFSR0VQQVlMT0FEX1RFU1QgPT0gMQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SWF9USFJFU0hPTEQsIDB4YzQwMDApOworI2Vsc2UKKyAgICAjaWZuZGVmIFpNX0RJU0FCTEVfQU1TRFU4S19TVVBQT1JUCisgICAgLyogVGhlIG1heGltdW0gQS1NU0RVIGxlbmd0aCBpcyAzODM5Lzc5MzUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xELCAweGMxZjgwKTsKKyAgICAjZWxzZQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SWF9USFJFU0hPTEQsIDB4YzBmODApOworICAgICNlbmRpZgorI2VuZGlmCisKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLLCAweDEwQSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JYX1BFX0RFTEFZLCAweDcwKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhhMTQ0MDAwKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU0xPVF9USU1FLCA5PDwxMCk7CisKKyAgICAvKiBDRi1FTkQgbW9kZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMmMsIDB4MTkwMDAwMDApOworCisgICAgLy9OQVYgcHJvdGVjdHMgQUNLIG9ubHkgKGluIFRYT1ApCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2IzOCwgMHgyMDEpOworCisKKyAgICAvKiBTZXQgQmVhY29uIFBIWSBDVFJMJ3MgVFBDIHRvIDB4NywgVEExPTEgKi8KKyAgICAvKiBPVFVTIHNldCBBTSB0byAweDEgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0hUMSwgMHg4MDAwMTcwKTsKKworICAgIC8qIFRPRE8gOiB3ZXAgYmFja29mZiBwcm90ZWN0aW9uIDB4NjNjICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JBQ0tPRkZfUFJPVEVDVCwgMHgxMDUpOworCisgICAgLyogQUdHIHRlc3QgY29kZSovCisgICAgLyogQWdncmVnYXRpb24gTUFYIG51bWJlciBhbmQgdGltZW91dCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiOWMsIDB4MTAwMDBhKTsKKyAgICAvKiBGaWx0ZXIgYW55IGNvbnRyb2wgZnJhbWVzLCBCQVIgaXMgYml0IDI0ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY4YywgMHgwNTAwZmZmZik7CisgICAgLyogRW5hYmxlIGRlYWdncmVnYXRvciAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4MSk7CisKKyAgICAvKiBCYXNpYyByYXRlICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JBU0lDX1JBVEUsIDB4MTUwZik7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BTkRBVE9SWV9SQVRFLCAweDE1MGYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SVFNfQ1RTX1JBVEUsIDB4MTBiMDFiYik7CisKKyAgICAvKiBNSU1PIHJlc3Bvc25lIGNvbnRyb2wgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAweDQwMDNDMUUpOy8qIGJpdCAyNn4yOCAgb3R1cy1BTSAqLworCisgICAgLyogRW5hYmxlIExFRDAgYW5kIExFRDEgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQwMTAwLCAweDMpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxZDAxMDQsIDB4Myk7CisKKyAgICAvKiBzd2l0Y2ggTUFDIHRvIE9UVVMgaW50ZXJmYWNlICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzYwMCwgMHgzKTsKKworICAgIC8qIFJYTUFDIEEtTVBEVSBsZW5ndGggdGhyZXNob2xkICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M1MCwgMHhmZmZmKTsKKworCS8qIFBoeSByZWdpc3RlciByZWFkIHRpbWVvdXQgKi8KKwl6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjgwLCAweGYwMDAwOCk7CisKKwkvKiBEaXNhYmxlIFJ4IFRpbWVPdXQgOiB3b3JrYXJvdW5kIGZvciBCQi4KKwkgKiAgT1RVUyB3b3VsZCBpbnRlcnJ1cHQgdGhlIHJ4IGZyYW1lIHRoYXQgc2VudCBieSBPV0wgVHhVbmRlclJ1bgorCSAqICBiZWNhdXNlIE9UVVMgcnggdGltZW91dCBiZWhhdmlvciwgdGhlbiBPVFVTIHdvdWxkIG5vdCBhY2sgdGhlIEJBIGZvcgorCSAqICB0aGlzIEFNUERVIGZyb20gT1dMLgorCSAqICBGaXggYnkgUGVycnkgSHdhbmcuICAyMDA3LzA1LzEwLgorCSAqICAweDFjMzYyYyA6IFJ4IHRpbWVvdXQgdmFsdWUgOiBiaXQgMjd+MTYKKwkgKi8KKwl6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjJjLCAweDApOworCisgICAgLy9TZXQgVVNCIFJ4IHN0cmVhbSBtb2RlIE1BWCBwYWNrZXQgbnVtYmVyIHRvIDIKKyAgICAvLyAgICBNYXggcGFja2V0IG51bWJlciA9ICoweDFlMTExMCArIDEKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWUxMTEwLCAweDQpOworICAgIC8vU2V0IFVTQiBSeCBzdHJlYW0gbW9kZSB0aW1lb3V0IHRvIDEwdXMKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWUxMTE0LCAweDgwKTsKKworICAgIC8vU2V0IENQVSBjbG9jayBmcmVxdWVuY3kgdG8gODgvODBNSHoKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQ0MDA4LCAweDczKTsKKworICAgIC8vU2V0IFdMQU4gRE1BIGludGVycnVwdCBtb2RlIDogZ2VuZXJhdGUgaW50IHBlciBwYWNrZXQKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzZDdjLCAweDExMDAxMSk7CisKKyAgICAvKiA3ODA3ICovCisgICAgLyogZW5hYmxlIGZ1bmMgOiBSZXNldCBGSUZPMSBhbmQgRklGTzIgd2hlbiBxdWV1ZS1nbnQgaXMgbG93ICovCisgICAgLyogMHgxYzNiYjAgQml0MiAqLworICAgIC8qIERpc2FibGUgU3dSZXNldCBpbiBmaXJtd2FyZSBmb3IgVHhIYW5nLCBlbmFibGUgcmVzZXQgRklGTyBmdW5jLiAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjAsIDB4NCk7CisKKyAgICAvKiBEaXNhYmxlcyB0aGUgQ0ZfRU5EIGZyYW1lICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1RYT1BfTk9UX0VOT1VHSF9JTkRJQ0FUSU9OLCAweDE0MUUwRjQ4KTsKKworCS8qIERpc2FibGUgdGhlIFNXIERlY3J5cHQqLworCXpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2NzgsIDB4NzApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qIFNldCBUeFFzIENXTUlOLCBDV01BWCwgQUlGUyBhbmQgVFhPIHRvIFdNRSBTVEEgZGVmYXVsdC4gKi8KKyAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoZGV2LCAwKTsKKworICAgIC8vemZTZWxBZGNDbGsoZGV2LCAwKTsKKworICAgIHJldHVybjsKK30KKworCit1MTZfdCB6ZkhwU2V0U25pZmZlck1vZGUoemRldl90KiBkZXYsIHUxNl90IG9uKQoreworICAgIGlmIChvbiAhPSAwKQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NOSUZGRVIsIDB4MjAwMDAwMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTklGRkVSLCAweDIwMDAwMDApOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBTZXRBcFN0YU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisgICAgaHBQcml2LT5kb3QxMU1vZGUgPSBtb2RlOworCisgICAgc3dpdGNoKG1vZGUpCisgICAgeworICAgICAgICBjYXNlIFpNX0hBTF84MDIxMV9NT0RFX0FQOgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzcwMCwgMHgwZjAwMDBhMSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9TVEE6CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNzAwLCAweDBmMDAwMDAyKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4MSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTDoKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwMDApOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHgxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLOgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzcwMCwgMHgwZjAwMDBlMCk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDQxKTsgICAgICAgLy8gZm9yIG11bHRpcGxlICggPiAyICkgc3RhdGlvbnMgSUJTUyBuZXR3b3JrCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBza2lwOworICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKK3NraXA6CisgICAgcmV0dXJuIDA7Cit9CisKKwordTE2X3QgemZIcFNldEJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZFNyYykKK3sKKyAgICB1MzJfdCAgYWRkcmVzczsKKyAgICB1MTZfdCAqYnNzaWQgPSAodTE2X3QgKilic3NpZFNyYzsKKworICAgIGFkZHJlc3MgPSBic3NpZFswXSArICgoKHUzMl90KWJzc2lkWzFdKSA8PCAxNik7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzYxOCwgYWRkcmVzcyk7CisKKyAgICBhZGRyZXNzID0gKHUzMl90KWJzc2lkWzJdOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MUMsIGFkZHJlc3MpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIgICAgICAqLworLyogICAgICBVcGRhdGUgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYT1AuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgY3dtaW5UYmwgOiBDV01JTiBwYXJhbWV0ZXIgZm9yIFR4UXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGN3bWF4VGJsIDogQ1dNQVggcGFyYW1ldGVyIGZvciBUeFFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhaWZzVGJsOiBBSUZTIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHhvcFRibCA6IFRYT1AgcGFyYW1ldGVyIGZvciBUeFFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZIcFVwZGF0ZVFvc1BhcmFtZXRlcih6ZGV2X3QqIGRldiwgdTE2X3QqIGN3bWluVGJsLCB1MTZfdCogY3dtYXhUYmwsCisgICAgICAgIHUxNl90KiBhaWZzVGJsLCB1MTZfdCogdHhvcFRibCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiemZIYWxVcGRhdGVRb3NQYXJhbWV0ZXIoKSIpOworCisgICAgLyogTm90ZSA6IERvIG5vdCBjaGFuZ2UgY3dtaW4gZm9yIFEwIGluIEFkIEhvYyBtb2RlICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICBvdGhlcndpc2UgZHJpdmVyIHdpbGwgZmFpbCBpbiBXaWZpIGJlYWNvbiBkaXN0cmlidXRpb24gKi8KKyAgICBpZiAoaHBQcml2LT5kb3QxMU1vZGUgPT0gWk1fSEFMXzgwMjExX01PREVfU1RBKQorICAgIHsKKyNpZiAwIC8vUmVzdG9yZSBDV21pbiB0byBpbXByb3ZlIGRvd24gbGluayB0aHJvdWdocHV0CisgICAgICAgIC8vY2hlYXRpbmcgaW4gQkUgdHJhZmZpYworICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvL2NoZWF0aW5nIGluIEJFIHRyYWZmaWMKKyAgICAgICAgICAgIGN3bWluVGJsWzBdID0gNzsvLzE1OworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgY3dtYXhUYmxbMF0gPSAxMjc7Ly8xMDIzOworICAgICAgICBhaWZzVGJsWzBdID0gMio5KzEwOy8vMyAqIDkgKyAxMDsKKyAgICB9CisKKyAgICAvKiBDV01JTiBhbmQgQ1dNQVggKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCBjd21pblRibFswXQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzBdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQ1csIGN3bWluVGJsWzFdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbMV08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMl9DVywgY3dtaW5UYmxbMl0KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFsyXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMzX0NXLCBjd21pblRibFszXQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzNdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzRfQ1csIGN3bWluVGJsWzRdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbNF08PDE2KSk7CisKKyAgICAvKiBBSUZTICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfQUlGUywgYWlmc1RibFswXQorICAgICAgICAgICAgKygodTMyX3QpYWlmc1RibFswXTw8MTIpKygodTMyX3QpYWlmc1RibFswXTw8MjQpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMzX0FDMl9BSUZTLCAoYWlmc1RibFswXT4+OCkKKyAgICAgICAgICAgICsoKHUzMl90KWFpZnNUYmxbMF08PDQpKygodTMyX3QpYWlmc1RibFswXTw8MTYpKTsKKworICAgIC8qIFRYT1AgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCB0eG9wVGJsWzBdCisgICAgICAgICAgICArICgodTMyX3QpdHhvcFRibFsxXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMzX0FDMl9UWE9QLCB0eG9wVGJsWzJdCisgICAgICAgICAgICArICgodTMyX3QpdHhvcFRibFszXTw8MTYpKTsKKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICBocFByaXYtPnR4b3BbMF0gPSB0eG9wVGJsWzBdOworICAgIGhwUHJpdi0+dHhvcFsxXSA9IHR4b3BUYmxbMV07CisgICAgaHBQcml2LT50eG9wWzJdID0gdHhvcFRibFsyXTsKKyAgICBocFByaXYtPnR4b3BbM10gPSB0eG9wVGJsWzNdOworICAgIGhwUHJpdi0+Y3dtaW5bMF0gPSBjd21pblRibFswXTsKKyAgICBocFByaXYtPmN3bWF4WzBdID0gY3dtYXhUYmxbMF07CisgICAgaHBQcml2LT5jd21pblsxXSA9IGN3bWluVGJsWzFdOworICAgIGhwUHJpdi0+Y3dtYXhbMV0gPSBjd21heFRibFsxXTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgemZIcFNldEF0aW1XaW5kb3coemRldl90KiBkZXYsIHUxNl90IGF0aW1XaW4pCit7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiU2V0IEFUSU0gd2luZG93IHRvICIsIGF0aW1XaW4pOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BVElNX1dJTkRPVywgYXRpbVdpbik7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworCit2b2lkIHpmSHBTZXRCYXNpY1JhdGVTZXQoemRldl90KiBkZXYsIHUxNl90IGJSYXRlQmFzaWMsIHUxNl90IGdSYXRlQmFzaWMpCit7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JBU0lDX1JBVEUsIGJSYXRlQmFzaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodTE2X3QpZ1JhdGVCYXNpYzw8OCkpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKworLyogSFQ0MCBzZW5kIGJ5IE9GRE0gNk0gICAgKi8KKy8qIG90aGVyd2lzZSB1c2UgcmVnIDB4NjM4ICovCit2b2lkIHpmSHBTZXRSVFNDVFNSYXRlKHpkZXZfdCogZGV2LCB1MzJfdCByYXRlKQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SVFNfQ1RTX1JBVEUsIHJhdGUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcFNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1MTZfdCBtYWNBZGRySWQpCit7CisgICAgaWYgKG1hY0FkZHJJZCA9PSAwKQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0wsCisgICAgICAgICAgICAgICAgKCgodTMyX3QpbWFjQWRkclsxXSk8PDE2KSB8IG1hY0FkZHJbMF0pOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfSCwgbWFjQWRkclsyXSk7CisgICAgfQorICAgIGVsc2UgaWYgKG1hY0FkZHJJZCA8PSA3KQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDS19UQUJMRSsoKG1hY0FkZHJJZC0xKSo4KSwKKyAgICAgICAgICAgICAgICBtYWNBZGRyWzBdICsgKCh1MzJfdCltYWNBZGRyWzFdPDwxNikpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUNLX1RBQkxFKygobWFjQWRkcklkLTEpKjgpKzQsCisgICAgICAgICAgICAgICAgbWFjQWRkclsyXSk7CisgICAgfQorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcFNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QsIHU4X3QgYkFsbE11bHRpY2FzdCkKK3sKKyAgICBzdHJ1Y3QgenNNdWx0aWNhc3RBZGRyKiBwTWFjTGlzdCA9IChzdHJ1Y3QgenNNdWx0aWNhc3RBZGRyKikgcExpc3Q7CisgICAgdThfdCAgIGk7CisgICAgdTMyX3QgIHZhbHVlOworICAgIHUzMl90ICBzd1JlZ011bEhhc2hWYWx1ZUgsIHN3UmVnTXVsSGFzaFZhbHVlTDsKKworICAgIHN3UmVnTXVsSGFzaFZhbHVlSCA9IDB4ODAwMDAwMDA7CisgICAgc3dSZWdNdWxIYXNoVmFsdWVMID0gMDsKKworICAgIGlmICggYkFsbE11bHRpY2FzdCApCisgICAgeworICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUggPSBzd1JlZ011bEhhc2hWYWx1ZUwgPSB+MDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKGk9MDsgaTxzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gcE1hY0xpc3RbaV0uYWRkcls1XSA+PiAyOworCisgICAgICAgICAgICBpZiAoIHZhbHVlIDwgMzIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlTCB8PSAoMSA8PCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVIIHw9ICgxIDw8ICh2YWx1ZS0zMikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVMKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfR1JPVVBfSEFTSF9UQkxfSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUgpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKiogQmVhY29uICoqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkhwRW5hYmxlQmVhY29uKHpkZXZfdCogZGV2LCB1MTZfdCBtb2RlLCB1MTZfdCBiY25JbnRlcnZhbCwgdTE2X3QgZHRpbSwgdThfdCBlbmFibGVBdGltKQoreworICAgIHUzMl90ICB2YWx1ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEJlYWNvbiBSZWFkeSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fQ1RSTCwgMCk7CisgICAgLyogQmVhY29uIERNQSBidWZmZXIgYWRkcmVzcyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fQUREUiwgWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTKTsKKworICAgIHZhbHVlID0gYmNuSW50ZXJ2YWw7CisKKyAgICB2YWx1ZSB8PSAoKCh1MzJfdCkgZHRpbSkgPDwgMTYpOworCisgICAgaWYgKG1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisKKyAgICAgICAgdmFsdWUgfD0gMHgxMDAwMDAwOworICAgIH0KKyAgICBlbHNlIGlmIChtb2RlID09IFpNX01PREVfSUJTUykKKyAgICB7CisgICAgICAgIHZhbHVlIHw9IDB4MjAwMDAwMDsKKworCQlpZiAoIGVuYWJsZUF0aW0gKQorCQl7CisJCQl2YWx1ZSB8PSAweDQwMDAwMDA7CisJCX0KKwkJKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pYnNzQmNuRW5hYmxlZCA9IDE7CisgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aWJzc0JjbkludGVydmFsID0gdmFsdWU7CisgICAgfQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19QUkVUQlRULCAoYmNuSW50ZXJ2YWwtNik8PDE2KTsKKworICAgIC8qIEJlYWNvbiBwZXJpb2QgYW5kIGJlYWNvbiBlbmFibGUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcERpc2FibGVCZWFjb24oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pYnNzQmNuRW5hYmxlZCA9IDA7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKwordm9pZCB6ZkhwTGVkQ3RybCh6ZGV2X3QqIGRldiwgdTE2X3QgbGVkSWQsIHU4X3QgbW9kZSkKK3sKKyAgICB1MTZfdCBzdGF0ZTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptX2RlYnVnX21zZzEoIkxFRCBJRD0iLCBsZWRJZCk7CisgICAgLy96bV9kZWJ1Z19tc2cxKCJMRUQgbW9kZT0iLCBtb2RlKTsKKyAgICBpZiAobGVkSWQgPCAyKQorICAgIHsKKyAgICAgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVtsZWRJZF0gIT0gbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlW2xlZElkXSA9IG1vZGU7CisKKyAgICAgICAgICAgIHN0YXRlID0gKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlWzBdCisgICAgICAgICAgICAgICAgICAgIHwgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVsxXTw8MSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQwMTA0LCBzdGF0ZSk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJVcGRhdGUgTEVEIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkhwUmVzZXRUeFJ4ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUmVzZXQgVHggYW5kIFJ4IERlc2MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwVXNiUmVzZXQoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldCA9IDA7CisKKyAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIFJlc2V0IFR4IGFuZCBSeCIpOworCisgICAgY21kWzBdID0gIDAgfCAoWk1fQ01EX1JFU0VUIDw8IDgpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MTZfdCB6ZkhwREtSZXNldCh6ZGV2X3QqIGRldiwgdThfdCBmbGFnKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQgPSAwOworCisgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBSZXNldCBUeCBhbmQgUngiKTsKKworICAgIGNtZFswXSA9ICA0IHwgKFpNX0NNRF9ES1JFU0VUIDw8IDgpOworICAgIGNtZFsxXSA9IGZsYWc7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmSHBDd21VcGRhdGUoemRldl90KiBkZXYpCit7CisgICAgLy91MzJfdCBjbWRbM107CisgICAgLy91MTZfdCByZXQ7CisgICAgLy8KKyAgICAvL2NtZFswXSA9IDB4MDAwMDAwMDg7CisgICAgLy9jbWRbMV0gPSAweDFjMzZlODsKKyAgICAvL2NtZFsyXSA9IDB4MWMzNmVjOworICAgIC8vCisgICAgLy9yZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fQ1dNX1JFQUQsIDApOworICAgIC8vcmV0dXJuIHJldDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgemZDb3JlQ3dtQnVzeShkZXYsIHpmQ3dtSXNFeHRDaGFuQnVzeShocFByaXYtPmN0bEJ1c3ksIGhwUHJpdi0+ZXh0QnVzeSkpOworCisgICAgaHBQcml2LT5jdGxCdXN5ID0gMDsKKyAgICBocFByaXYtPmV4dEJ1c3kgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmSHBBbmlVcGRhdGUoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWzVdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMTA7CisgICAgY21kWzFdID0gMHgxYzM2ZTg7CisgICAgY21kWzJdID0gMHgxYzM2ZWM7CisgICAgY21kWzNdID0gMHgxYzNjYjQ7CisgICAgY21kWzRdID0gMHgxYzNjYjg7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAyMCwgWk1fQU5JX1JFQUQsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBVcGRhdGUgQmVhY29uIFJTU0kgaW4gQU5JCisgKi8KK3UzMl90IHpmSHBBbmlVcGRhdGVSc3NpKHpkZXZfdCogZGV2LCB1OF90IHJzc2kpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIGhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdicnNzaSA9IHJzc2k7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBaTV9TRUVQUk9NX01BQ19BRERSRVNTX09GRlNFVCAgICgweDE0MDAgKyAoMHgxMDY8PDEpKQorI2RlZmluZSBaTV9TRUVQUk9NX1JFR0RPTUFJTl9PRkZTRVQgICAoMHgxNDAwICsgKDB4MTA0PDwxKSkKKyNkZWZpbmUgWk1fU0VFUFJPTV9WRVJJU09OX09GRlNFVCAgICgweDE0MDAgKyAoMHgxMDI8PDEpKQorI2RlZmluZSBaTV9TRUVQUk9NX0hBUkRXQVJFX1RZUEVfT0ZGU0VUICAgKDB4MTM3NCkKKyNkZWZpbmUgWk1fU0VFUFJPTV9IV19IRUFWWV9DTElQICAgICAgICAgICgweDE2MWMpCisKK3UzMl90IHpmSHBHZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFs3XTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDAwIHwgMjQ7CisgICAgY21kWzFdID0gWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQ7CisgICAgY21kWzJdID0gWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQrNDsKKyAgICBjbWRbM10gPSBaTV9TRUVQUk9NX1JFR0RPTUFJTl9PRkZTRVQ7CisgICAgY21kWzRdID0gWk1fU0VFUFJPTV9WRVJJU09OX09GRlNFVDsKKyAgICBjbWRbNV0gPSBaTV9TRUVQUk9NX0hBUkRXQVJFX1RZUEVfT0ZGU0VUOworICAgIGNtZFs2XSA9IFpNX1NFRVBST01fSFdfSEVBVllfQ0xJUDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDI4LCBaTV9NQUNfUkVBRCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZIcEdldFRyYW5zbWl0UG93ZXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiAgICBocFByaXYgID0gd2QtPmhwUHJpdmF0ZTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIHRwYyAgICAgPSAwOworCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKSB7CisgICAgICAgIHRwYyA9IGhwUHJpdi0+dFBvdzJ4MmdbMF0gJiAweDNmOworICAgICAgICB3ZC0+bWF4VHhQb3dlcjIgJj0gMHgzZjsKKyAgICAgICAgdHBjID0gKHRwYyA+IHdkLT5tYXhUeFBvd2VyMik/IHdkLT5tYXhUeFBvd2VyMiA6IHRwYzsKKyAgICB9IGVsc2UgeworICAgICAgICB0cGMgPSBocFByaXYtPnRQb3cyeDVnWzBdICYgMHgzZjsKKyAgICAgICAgd2QtPm1heFR4UG93ZXI1ICY9IDB4M2Y7CisgICAgICAgIHRwYyA9ICh0cGMgPiB3ZC0+bWF4VHhQb3dlcjUpPyB3ZC0+bWF4VHhQb3dlcjUgOiB0cGM7CisgICAgfQorCisgICAgcmV0dXJuIHRwYzsKK30KKwordThfdCB6ZkhwR2V0TWluVHhQb3dlcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqICAgIGhwUHJpdiAgPSB3ZC0+aHBQcml2YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICB0cGMgICAgID0gMDsKKworICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgICAgIGlmKHdkLT5CYW5kV2lkdGg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgLy80ME0KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnSHQ0MFs3XSYweDNmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vMjBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ0h0MjBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYod2QtPkJhbmRXaWR0aDQwKQorICAgICAgICB7CisgICAgICAgICAgICAvLzQwTQorICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdIdDQwWzddJjB4M2YpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8yME0KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQyMFs3XSYweDNmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cGM7Cit9CisKK3U4X3QgemZIcEdldE1heFR4UG93ZXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiAgICBocFByaXYgID0gd2QtPmhwUHJpdmF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgdHBjICAgICA9IDA7CisKKyAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MnhDY2tbMF0mMHgzZik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRwYyA9KGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZik7CisgICAgfQorCisgICAgcmV0dXJuIHRwYzsKK30KKwordTMyX3QgemZIcExvYWRFRVBST01Gcm9tRlcoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWzE2XTsKKyAgICB1MzJfdCByZXQ9MCwgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpID0gKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5lZXByb21JbWFnZVJkUmVxOworCisgICAgY21kWzBdID0gWk1fSEFMX01BWF9FRVBST01fUFJRKjQ7CisKKyAgICBmb3IgKGo9MDsgajxaTV9IQUxfTUFYX0VFUFJPTV9QUlE7IGorKykKKyAgICB7CisgICAgICAgIGNtZFtqKzFdID0gMHgxMDAwICsgKCgoaSpaTV9IQUxfTUFYX0VFUFJPTV9QUlEpICsgaikqNCk7CisgICAgfQorCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgKFpNX0hBTF9NQVhfRUVQUk9NX1BSUSsxKSo0LCBaTV9FRVBST01fUkVBRCwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmSHBIZWFydEJlYXQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisgICAgdThfdCBwb2xsdXRlZCA9IDA7CisgICAgdThfdCBhY2tUcGM7CisKKyAgICAvKiBXb3JrYXJvdW5kIDogTWFrZSBPVFVTIGZpcmUgbW9yZSBiZWFjb24gaW4gYWQgaG9jIG1vZGUgaW4gMi40R0h6ICovCisgICAgaWYgKGhwUHJpdi0+aWJzc0JjbkVuYWJsZWQgIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPnRpY2sgJSAxMCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT50aWNrICUgNDApID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgaHBQcml2LT5pYnNzQmNuSW50ZXJ2YWwtMSk7CisgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIGhwUHJpdi0+aWJzc0JjbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgod2QtPnRpY2sgJiAweDNmKSA9PSAweDI1KQorICAgIHsKKyAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgYmVhY29uIHN0dWNrIGFmdGVyIFNXIHJlc2V0ICovCisgICAgICAgIGlmIChocFByaXYtPmlic3NCY25FbmFibGVkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fQUREUiwgWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vRGJnUHJpbnQoImhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRT0lZCIsIGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSk7CisgICAgICAgIC8vRGJnUHJpbnQoIndkLT5zdGEuYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHM9JWQiLCB3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzKTsKKyAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICYmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpIC8vMTFuIG1vZGUKKyAgICAgICAgICAgICYmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgLy80ME1IeiBtb2RlCisgICAgICAgICAgICAmJiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PTApIC8vTWFydmVsIEFQCisgICAgICAgICAgICAmJiAoaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFID4gMjAwMCkgLy9CRSBUWE9QID4gMm1zCisgICAgICAgICAgICAmJiAod2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyA+IDE0MjApKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCAweDgwMDBhKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiOWMsIGhwUHJpdi0+YWdnUGt0TnVtKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgLy8xMW4gbW9kZQorICAgICAgICAgICAgICAgICYmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMCkgLy8yME1IeiBtb2RlCisgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuZW5hYmxlRHJ2QkEgPT0wKSkgLy9NYXJ2ZWwgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk4LCAweDUxNDQwMDApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk4LCAweEExNDQwMDApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpIC8vMTFuIG1vZGUKKyAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5hdGhPd2xBcCA9PSAxKSkgLy9BdGhlcm9zIEFQCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChocFByaXYtPmxhdGVzdFNJRlMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweDgxNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhhMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YzE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGExNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIiMjIyMjIENvcnJlY3QgVHggcmV0cmFuc21pc3Npb24gaXNzdWUgIyMjIyMsICIsIGhwUHJpdi0+bGF0ZXN0U0lGUyk7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDA7CisgICAgICAgICAgICAgICAgaHBQcml2LT5yZXRyYW5zbWlzc2lvbkV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk4LCAweEExNDQwMDApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgod2QtPnN0YS5iU2NoZWR1bGVTY2FuID09IEZBTFNFKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UpKQorICAgICAgICB7CisjZGVmaW5lIFpNX1NJR05BTF9USFJFU0hPTEQgIDY2CisgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAmJiAod2QtPlNpZ25hbFN0cmVuZ3RoID4gWk1fU0lHTkFMX1RIUkVTSE9MRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgc3RhdGUgaGFuZGxlLCBhbHdheXMgcmV3cml0ZSByZWdpc3RlciBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgLy9pZiAoaHBQcml2LT5zdHJvbmdSU1NJID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMTsKKyAgICAgICAgICAgICAgICAvKiBTdHJvbmcgUlNTSSwgc2V0IEFDSyB0byBvbmUgVHggc3RyZWFtIGFuZCBsb3dlciBUeCBwb3dlciA3ZGJtICovCisgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyA+ICgxNCsxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhY2tUcGMgPSBocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgLSAxNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWNrVHBjID0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoYWNrVHBjKSA8PCAyMCkgfCAoMHgxPDwyNikpOworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoYWNrVHBjKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYWNrVHBjKSA8PCAyMSkgfCAoMHgxPDwyNykgICk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBzdGF0ZSBoYW5kbGUsIGFsd2F5cyByZXdyaXRlIHJlZ2lzdGVyIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAvL2lmIChocFByaXYtPnN0cm9uZ1JTU0kgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnN0cm9uZ1JTU0kgPSAwOworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMCkgfCAoMHgxPDwyNikpOworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjApIHwgKDB4NTw8MjYpKTsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgNSApIHwgKDB4NTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMSkgfCAoMHg1PDwyNykgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI3VuZGVmIFpNX1NJR05BTF9USFJFU0hPTEQKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9PSBGQUxTRSkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuID09IEZBTFNFKSkKKyAgICAgICAgICAgIHsKKyAgICAjZGVmaW5lIFpNX1JYX1NJR05BTF9USFJFU0hPTERfSCAgNzEKKyAgICAjZGVmaW5lIFpNX1JYX1NJR05BTF9USFJFU0hPTERfTCAgNjYKKyAgICAgICAgICAgICAgICB1OF90IHJ4U2lnbmFsVGhyZXNob2xkSCA9IFpNX1JYX1NJR05BTF9USFJFU0hPTERfSDsKKyAgICAgICAgICAgICAgICB1OF90IHJ4U2lnbmFsVGhyZXNob2xkTCA9IFpNX1JYX1NJR05BTF9USFJFU0hPTERfTDsKKyAgICAjdW5kZWYgWk1fUlhfU0lHTkFMX1RIUkVTSE9MRF9ICisgICAgI3VuZGVmIFpNX1JYX1NJR05BTF9USFJFU0hPTERfTAorCisgICAgICAgICAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPlNpZ25hbFN0cmVuZ3RoID4gcnhTaWduYWxUaHJlc2hvbGRIKQorICAgICAgICAgICAgICAgICAgICApLy8mJiAoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJ4U3Ryb25nUlNTSSA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTk2NCwgMHgxMjIwKTsKKyAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNjk2MCwgMHg5MDApOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzc5NjAsIDB4OTAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTEwKjIvNF0mMHhmZikgPT0gMHg4MCkgLy9GRU0gVFlQRQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDliNDkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHgwOTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPlNpZ25hbFN0cmVuZ3RoID4gcnhTaWduYWxUaHJlc2hvbGRMKQorICAgICAgICAgICAgICAgICAgICApLy8mJiAoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcgdG8gcHJldmVudCBmcmVxdWVudGx5IFJ4IHN3aXRjaGluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgc3RhdGUgaGFuZGxlLCBhbHdheXMgcmV3cml0ZSByZWdpc3RlciBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgIC8vaWYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cnhTdHJvbmdSU1NJID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTk2NCwgMHgxMTIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTk2MCwgMHg5YjQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNjk2MCwgMHg5YjQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNzk2MCwgMHg5YjQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHgwOTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbM10gPiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1swXSoyKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgaHBQcml2LT50eG9wWzNdKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzJdID4gKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMF0qMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIGhwUHJpdi0+dHhvcFsyXSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1sxXSA+IChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdKjIpKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCBocFByaXYtPmN3bWluWzFdKygodTMyX3QpaHBQcml2LT5jd21heFsxXTw8MTYpKTsKKyAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPnNsb3RUeXBlID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmVuYWJsZURydkJBID09MCkgLy9NYXJ2ZWwgQVAKKyAgICAgICAgICAgICAgICAgICAmJiAoaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFID4gMjAwMCkpIC8vQkUgVFhPUCA+IDJtcworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgKGhwUHJpdi0+Y3dtaW5bMF0vMikrKCh1MzJfdClocFByaXYtPmN3bWF4WzBdPDwxNikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCBocFByaXYtPmN3bWluWzBdKygodTMyX3QpaHBQcml2LT5jd21heFswXTw8MTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENvbXBlbnNhdGlvbiBmb3IgMjB1cyBzbG90IHRpbWUgKi8KKyAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIDU4KygodTMyX3QpaHBQcml2LT5jd21heFswXTw8MTYpKTsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCBocFByaXYtPmN3bWluWzBdKygodTMyX3QpaHBQcml2LT5jd21heFswXTw8MTYpKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiAoWk1fU1dfVEtJUF9FTkNSWV9FTnxaTV9TV19XRVBfRU5DUllfRU4pKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIGhwUHJpdi0+dHhvcFswXSk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIDB4MzApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbM10gPSAwOworICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzJdID0gMDsKKyAgICAgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1sxXSA9IDA7CisgICAgICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMF0gPSAwOworICAgIH0KKworICAgIGlmIChwb2xsdXRlZCA9PSAxKQorICAgIHsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisgKiAgMHgxZDQwMDggOiBBSEIsIERBQywgQURDIGNsb2NrIHNlbGVjdGlvbgorICogICAgICAgICAgICAgYml0MX4wICBBSEJfQ0xLIDogQUhCIGNsb2NrIHNlbGVjdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIDogT1NDIDQwTUh6OworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEgOiAyME1IeiBpbiBBIG1vZGUsIDIyTUh6IGluIEcgbW9kZTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIDogNDBNSHogaW4gQSBtb2RlLCA0NE1IeiBpbiBHIG1vZGU7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSA6IDgwTUh6IGluIEEgbW9kZSwgODhNSHogaW4gRyBtb2RlLgorICogICAgICAgICAgICAgYml0M34yICBDTEtfU0VMIDogU2VsZWN0IHRoZSBjbG9jayBzb3VyY2Ugb2YgY2xrMTYwIGluIEFEREFDLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgOiBQTEwgZGl2aWRlcidzIG91dHB1dDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIDogUExMIGRpdmlkZXIncyBvdXRwdXQgZGl2aWRlZCBieSAyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgOiBQTEwgZGl2aWRlcidzIG91dHB1dCBkaXZpZGVkIGJ5IDQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSA6IFJFRkNMSyBmcm9tIFhUQUxPU0NQQUQuCisgKi8KK3ZvaWQgemZTZWxBZGNDbGsoemRldl90KiBkZXYsIHU4X3QgYnc0MCwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIGlmKGJ3NDAgPT0gMSkKKyAgICB7CisgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFENDAwOCwgMHg3Myk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLLCAweDEwQSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFENDAwOCwgMHg3MCk7CisgICAgICAgIGlmICggZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMDUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0RZTkFNSUNfU0lGU19BQ0ssIDB4MTA0KTsKKyAgICAgICAgfQorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KK30KKwordTMyX3QgemZIcEVjaG9Db21tYW5kKHpkZXZfdCogZGV2LCB1MzJfdCB2YWx1ZSkKK3sKKyAgICB1MzJfdCBjbWRbMl07CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwODAwNDsKKyAgICBjbWRbMV0gPSB2YWx1ZTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX0NNRF9FQ0hPLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgWk1fRFJWX0lOSVRfVVNCX01PREUKKworI2RlZmluZSBaTV9VU0JfVVNfU1RSRUFNX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFpNX1VTQl9VU19QQUNLRVRfTU9ERSAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgWk1fVVNCX0RTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBaTV9VU0JfVVNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgWk1fVVNCX1JYX1NUUkVBTV80SyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBaTV9VU0JfUlhfU1RSRUFNXzhLICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fMTZLICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgWk1fVVNCX1JYX1NUUkVBTV8zMksgICAgICAgICAgICAgICAgMHgwMDAwMDAzMAorCisjZGVmaW5lIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBaTV9VU0JfTU9ERV9DVFJMX1JFRyAgICAgICAgICAgICAgICAweDAwMUUxMTA4CisKK3ZvaWQgemZJbml0VXNiTW9kZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBtb2RlOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFRPRE86IFNldCBVU0IgbW9kZSBieSByZWFkaW5nIHJlZ2lzdGVyeSAqLworICAgIG1vZGUgPSBaTV9VU0JfRFNfRU5BQkxFIHwgWk1fVVNCX1VTX0VOQUJMRSB8IFpNX1VTQl9VU19QQUNLRVRfTU9ERTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fVVNCX01PREVfQ1RSTF9SRUcsIG1vZGUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisjZW5kaWYKKwordm9pZCB6ZkR1bXBFZXBCYW5kRWRnZXMoc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2UpOwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXIyRyh1OF90KiB0UG93MnhDY2ssIHU4X3QqIHRQb3cyeDJnLCB1OF90KiB0UG93MngyZ0h0MjAsIHU4X3QqIHRQb3cyeDJnSHQ0MCk7Cit2b2lkIHpmUHJpbnRUYXJnZXRQb3dlcjVHKHU4X3QqIHRQb3cyeDVnLCB1OF90KiB0UG93Mng1Z0h0MjAsIHU4X3QqIHRQb3cyeDVnSHQ0MCk7CisKKworczMyX3QgemZJbnRlcnBvbGF0ZUZ1bmMoczMyX3QgeCwgczMyX3QgeDEsIHMzMl90IHkxLCBzMzJfdCB4MiwgczMyX3QgeTIpCit7CisgICAgczMyX3QgeTsKKworICAgIGlmICh5MiA9PSB5MSkKKyAgICB7CisgICAgICAgIHkgPSB5MTsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA9PSB4MSkKKyAgICB7CisgICAgICAgIHkgPSB5MTsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA9PSB4MikKKyAgICB7CisgICAgICAgIHkgPSB5MjsKKyAgICB9CisgICAgZWxzZSBpZiAoeDIgIT0geDEpCisgICAgeworICAgICAgICB5ID0geTEgKyAoKCh5Mi15MSkgKiAoeC14MSkpLyh4Mi14MSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB5ID0geTE7CisgICAgfQorCisgICAgcmV0dXJuIHk7Cit9CisKKy8vI2RlZmluZSBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKy8vI2RlZmluZSBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKworLyogdGhlIHR4IHBvd2VyIG9mZnNldCB3b3JrYXJvdW5kIGZvciBBUlQgdnMgTkRJUy9NREsgKi8KKyNkZWZpbmUgSEFMVFhfUE9XRVJfT0ZGU0VUICAgICAgMAorCit1OF90IHpmSW50ZXJwb2xhdGVGdW5jWCh1OF90IHgsIHU4X3QgeDEsIHU4X3QgeTEsIHU4X3QgeDIsIHU4X3QgeTIpCit7CisgICAgczMyX3QgeTsKKyAgICBzMzJfdCBpbmM7CisKKyAgICAjZGVmaW5lIFpNX01VTFRJUExJRVIgICA4CisgICAgeSA9IHpmSW50ZXJwb2xhdGVGdW5jKChzMzJfdCl4PDxaTV9NVUxUSVBMSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoczMyX3QpeDE8PFpNX01VTFRJUExJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzMzJfdCl5MTw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXgyPDxaTV9NVUxUSVBMSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoczMyX3QpeTI8PFpNX01VTFRJUExJRVIpOworCisgICAgaW5jID0gKHkgJiAoMTw8KFpNX01VTFRJUExJRVItMSkpKSA+PiAoWk1fTVVMVElQTElFUi0xKTsKKyAgICB5ID0gKHkgPj4gWk1fTVVMVElQTElFUikgKyBpbmM7CisgICAgI3VuZGVmIFpNX01VTFRJUExJRVIKKworICAgIHJldHVybiAodThfdCl5OworfQorCit1OF90IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUodThfdCB4LCB1OF90KiB4X2FycmF5LCB1OF90KiB5X2FycmF5KQoreworICAgIHMzMl90IHk7CisgICAgdTE2X3QgeEluZGV4OworCisgICAgaWYgKHggPD0geF9hcnJheVsxXSkKKyAgICB7CisgICAgICAgIHhJbmRleCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHggPD0geF9hcnJheVsyXSkKKyAgICB7CisgICAgICAgIHhJbmRleCA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPD0geF9hcnJheVszXSkKKyAgICB7CisgICAgICAgIHhJbmRleCA9IDI7CisgICAgfQorICAgIGVsc2UgLy8oeCA+IHhfYXJyYXlbM10pCisgICAgeworICAgICAgICB4SW5kZXggPSAzOworICAgIH0KKworICAgIHkgPSB6ZkludGVycG9sYXRlRnVuY1goeCwKKyAgICAgICAgICAgIHhfYXJyYXlbeEluZGV4XSwKKyAgICAgICAgICAgIHlfYXJyYXlbeEluZGV4XSwKKyAgICAgICAgICAgIHhfYXJyYXlbeEluZGV4KzFdLAorICAgICAgICAgICAgeV9hcnJheVt4SW5kZXgrMV0pOworCisgICAgcmV0dXJuICh1OF90KXk7Cit9CisKK3U4X3QgemZGaW5kRnJlcUluZGV4KHU4X3QgZiwgdThfdCogZkFycmF5LCB1OF90IGZBcnJheVNpemUpCit7CisgICAgdThfdCBpOworI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJmPSVkICIsIGYpOworICAgIGZvciAoaT0wOyBpPGZBcnJheVNpemU7IGkrKykKKyAgICB7CisgICAgICAgIERiZ1ByaW50KCIlZCAiLCBmQXJyYXlbaV0pOworICAgIH0KKyAgICBEYmdQcmludCgiXG4iKTsKKyNlbmRpZgorICAgIGk9ZkFycmF5U2l6ZS0yOworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBpZiAoZiA+PSBmQXJyYXlbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIGlmIChpIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisKKwordm9pZCB6ZkluaXRQb3dlckNhbCh6ZGV2X3QqIGRldikKK3sKKyAgICAvL1Byb2dyYW0gUEhZIFR4IHBvd2VyIHJlbGF0aXZlcyByZWdpc3RlcnMKKyNkZWZpbmUgem1fd3JpdGVfcGh5X3JlZyhjciwgdmFsKSByZWdfd3JpdGUoKGNyKjQpKzB4OTgwMCwgdmFsKQorCisgICAgem1fd3JpdGVfcGh5X3JlZyg3OSwgMHg3Zik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NywgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3OCwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg2NTMsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNjU0LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDczOSwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NDAsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzU1LCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc1NiwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NTcsIDB4M2YzZjNmM2YpOworCisjdW5kZWYgem1fd3JpdGVfcGh5X3JlZworfQorCisKKwordm9pZCB6ZlByaW50VHAodThfdCogcHdyMCwgdThfdCogdnBkMCwgdThfdCogcHdyMSwgdThfdCogdnBkMSkKK3sKKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInB3cjAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjBbMF0sIHB3cjBbMV0sIHB3cjBbMl0sIHB3cjBbM10sIHB3cjBbNF0pOworICAgIERiZ1ByaW50KCJ2cGQwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQwWzBdLCB2cGQwWzFdLCB2cGQwWzJdLCB2cGQwWzNdLCB2cGQwWzRdKTsKKyAgICBEYmdQcmludCgicHdyMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMVswXSwgcHdyMVsxXSwgcHdyMVsyXSwgcHdyMVszXSwgcHdyMVs0XSk7CisgICAgRGJnUHJpbnQoInZwZDEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDFbMF0sIHZwZDFbMV0sIHZwZDFbMl0sIHZwZDFbM10sIHZwZDFbNF0pOworICAgICNlbmRpZgorfQorCisKKy8qCisgKiBUbyBmaW5kIENUTCBpbmRleCgwfjIzKQorICogcmV0dXJuIDI0KEFSNTQxNl9OVU1fQ1RMUyk9Pm5vIGRlc2lyZWQgaW5kZXggZm91bmQKKyAqLwordThfdCB6ZkZpbmRDdGxFZGdlc0luZGV4KHpkZXZfdCogZGV2LCB1OF90IGRlc2lyZWRfQ3RsSW5kZXgpCit7CisgICAgdThfdCBpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2OworICAgIHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGVlcHJvbUltYWdlID0gKHN0cnVjdCBhcjU0MTZFZXByb20qKSYoaHBQcml2LT5lZXByb21JbWFnZVsoMTAyNCs1MTIpLzRdKTsKKworICAgIC8vZm9yIChpID0gMDsgKGkgPCBBUjU0MTZfTlVNX0NUTFMpICYmIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpXTsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmKGRlc2lyZWRfQ3RsSW5kZXggPT0gZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZiaW4yZnJlcQorICoKKyAqIEdldCBjaGFubmVsIHZhbHVlIGZyb20gYmluYXJ5IHJlcHJlc2VudGF0aW9uIGhlbGQgaW4gZWVwcm9tCisgKiBSRVRVUk5TOiB0aGUgZnJlcXVlbmN5IGluIE1IegorICovCit1MzJfdAorZmJpbjJmcmVxKHU4X3QgZmJpbiwgdThfdCBpczJHSHopCit7CisgICAgLyoKKyAgICAgKiBSZXNlcnZlZCB2YWx1ZSAweEZGIHByb3ZpZGVzIGFuIGVtcHR5IGRlZmluaXRpb24gYm90aCBhcworICAgICAqIGFuIGZiaW4gYW5kIGFzIGEgZnJlcXVlbmN5IC0gZG8gbm90IGNvbnZlcnQKKyAgICAgKi8KKyAgICBpZiAoZmJpbiA9PSBBUjU0MTZfQkNIQU5fVU5VU0VEKSB7CisgICAgICAgIHJldHVybiBmYmluOworICAgIH0KKworICAgIHJldHVybiAodTMyX3QpKChpczJHSHo9PTEpID8gKDIzMDAgKyBmYmluKSA6ICg0ODAwICsgNSAqIGZiaW4pKTsKK30KKworCit1OF90IHpmR2V0TWF4RWRnZVBvd2VyKHpkZXZfdCogZGV2LCBDQUxfQ1RMX0VER0VTICpwQ3RsRWRnZXMsIHUzMl90IGZyZXEpCit7CisgICAgdThfdCBpOworICAgIHU4X3QgbWF4RWRnZVBvd2VyOworICAgIHU4X3QgaXMyR0h6OworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2OworICAgIHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGVlcHJvbUltYWdlID0gKHN0cnVjdCBhcjU0MTZFZXByb20qKSYoaHBQcml2LT5lZXByb21JbWFnZVsoMTAyNCs1MTIpLzRdKTsKKworICAgIGlmKGZyZXEgPiBaTV9DSF9HXzE0KQorICAgICAgICBpczJHSHogPSAwOworICAgIGVsc2UKKyAgICAgICAgaXMyR0h6ID0gMTsKKworICAgIG1heEVkZ2VQb3dlciA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKworICAgIC8qIEdldCB0aGUgZWRnZSBwb3dlciAqLworICAgIGZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9CQU5EX0VER0VTKSAmJiAocEN0bEVkZ2VzW2ldLmJDaGFubmVsICE9IEFSNTQxNl9CQ0hBTl9VTlVTRUQpIDsgaSsrKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlcmUncyBhbiBleGFjdCBjaGFubmVsIG1hdGNoIG9yIGFuIGluYmFuZCBmbGFnIHNldAorICAgICAgICAgKiBvbiB0aGUgbG93ZXIgY2hhbm5lbCB1c2UgdGhlIGdpdmVuIHJkRWRnZVBvd2VyCisgICAgICAgICAqLworICAgICAgICBpZiAoZnJlcSA9PSBmYmluMmZyZXEocEN0bEVkZ2VzW2ldLmJDaGFubmVsLCBpczJHSHopKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhFZGdlUG93ZXIgPSBwQ3RsRWRnZXNbaV0udFBvd2VyOworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgaW5kZXggaSA9ICVkIFxuIiwgaSkpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaSA+IDApICYmIChmcmVxIDwgZmJpbjJmcmVxKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCwgaXMyR0h6KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmYmluMmZyZXEocEN0bEVkZ2VzW2kgLSAxXS5iQ2hhbm5lbCwgaXMyR0h6KSA8IGZyZXEgJiYgcEN0bEVkZ2VzW2kgLSAxXS5mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heEVkZ2VQb3dlciA9IHBDdGxFZGdlc1tpIC0gMV0udFBvd2VyOworICAgICAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgICAgICB6bV9kYmcoKCJ6ZkdldE1heEVkZ2VQb3dlciBpbmRleCBpLTEgPSAlZCBcbiIsIGktMSkpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTGVhdmUgbG9vcCAtIG5vIG1vcmUgYWZmZWN0aW5nIGVkZ2VzIHBvc3NpYmxlIGluIHRoaXMgbW9ub3RvbmljIGluY3JlYXNpbmcgbGlzdCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGlmKCBpID09IEFSNTQxNl9OVU1fQkFORF9FREdFUyApCisgICAgeworICAgICAgICBpZiAoZnJlcSA+IGZiaW4yZnJlcShwQ3RsRWRnZXNbaSAtIDFdLmJDaGFubmVsLCBpczJHSHopICYmIHBDdGxFZGdlc1tpIC0gMV0uZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgbWF4RWRnZVBvd2VyID0gcEN0bEVkZ2VzW2kgLSAxXS50UG93ZXI7CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJ6ZkdldE1heEVkZ2VQb3dlciBpbmRleD0+aS0xID0gJWQgXG4iLCBpLTEpKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgem1fYXNzZXJ0KG1heEVkZ2VQb3dlciA+IDApOworCisgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICBpZiAoIG1heEVkZ2VQb3dlciA9PSBBUjU0MTZfTUFYX1JBVEVfUE9XRVIgKQorICAgIHsKKyAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgPSAlZCAhISFcbiIsIEFSNTQxNl9NQVhfUkFURV9QT1dFUikpOworICAgIH0KKyAgI2VuZGlmCisgICAgcmV0dXJuIG1heEVkZ2VQb3dlcjsKK30KKwordTMyX3QgemZBZGp1c3RIVDQwRnJlcU9mZnNldCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0KQoreworICAgIHUzMl90IG5ld0ZyZXEgPSBmcmVxdWVuY3k7CisKKwlpZiAoYnc0MCA9PSAxKQorCXsKKyAgICAgICAgaWYgKGV4dE9mZnNldCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdGcmVxICs9IDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmV3RnJlcSAtPSAxMDsKKyAgICAgICAgfQorCX0KKwlyZXR1cm4gbmV3RnJlcTsKK30KKwordTMyX3QgemZIcENoZWNrRG9IZWF2eUNsaXAoemRldl90KiBkZXYsIHUzMl90IGZyZXEsIENBTF9DVExfRURHRVMgKnBDdGxFZGdlcywgdThfdCBidzQwKQoreworICAgIHUzMl90IHJldCA9IDA7CisgICAgdThfdCBpOworICAgIHU4X3QgaXMyR0h6OworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGlmKGZyZXEgPiBaTV9DSF9HXzE0KQorICAgICAgICBpczJHSHogPSAwOworICAgIGVsc2UKKyAgICAgICAgaXMyR0h6ID0gMTsKKworICAgIC8qIEhUNDAgZm9yY2UgZW5hYmxlIGhlYXZ5IGNsaXAgKi8KKyAgICBpZiAoYnc0MCkKKyAgICB7CisgICAgICAgIHJldCB8PSAweGYwOworICAgIH0KKyNpZiAxCisgICAgLyogSFQyMCA6IGZyZXF1ZW5jeSBiYW5kZWRnZSAqLworICAgIGZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9CQU5EX0VER0VTKSAmJiAocEN0bEVkZ2VzW2ldLmJDaGFubmVsICE9IEFSNTQxNl9CQ0hBTl9VTlVTRUQpIDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGZyZXEgPT0gZmJpbjJmcmVxKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCwgaXMyR0h6KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBDdGxFZGdlc1tpXS5mbGFnID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0IHw9IDB4ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3ZvaWQgemZTZXRQb3dlckNhbFRhYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQpCit7CisgICAgc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2U7CisgICAgdThfdCBwd3IwWzVdOworICAgIHU4X3QgcHdyMVs1XTsKKyAgICB1OF90IHZwZDBbNV07CisgICAgdThfdCB2cGQxWzVdOworICAgIHU4X3QgdnBkX2NoYWluMVsxMjhdOworICAgIHU4X3QgdnBkX2NoYWluM1sxMjhdOworICAgIHUxNl90IGJvdW5kYXJ5MSA9IDE4OyAvL0NSIDY2NworICAgIHUxNl90IHBvd2VyVHhNYXggPSA2MzsgLy9DUiA3OQorICAgIHU4X3QgaTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKyAgICB1OF90IGZiaW47CisgICAgdThfdCBpbmRleCwgbWF4MmdJbmRleCwgbWF4NWdJbmRleDsKKyAgICB1OF90IGNoYWluMHB3clBkZzBbNV07CisgICAgdThfdCBjaGFpbjB2cGRQZGcwWzVdOworICAgIHU4X3QgY2hhaW4wcHdyUGRnMVs1XTsKKyAgICB1OF90IGNoYWluMHZwZFBkZzFbNV07CisgICAgdThfdCBjaGFpbjJwd3JQZGcwWzVdOworICAgIHU4X3QgY2hhaW4ydnBkUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMnB3clBkZzFbNV07CisgICAgdThfdCBjaGFpbjJ2cGRQZGcxWzVdOworICAgIHU4X3QgZmJpbkFycmF5WzhdOworCisgICAgLyogNCBDVEwgKi8KKyAgICB1OF90IGN0bF9pOworICAgIHU4X3QgZGVzaXJlZF9DdGxJbmRleDsKKworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlckNDSyA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXIyRyA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyMkdIVDQwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjVHID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisKKyAgICB1OF90IGN0bE9mZnNldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBlZXByb21JbWFnZSA9IChzdHJ1Y3QgYXI1NDE2RWVwcm9tKikmKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbKDEwMjQrNTEyKS80XSk7CisKKyAgICAvLyBDaGVjayB0aGUgdG90YWwgYnl0ZXMgb2YgdGhlIEVFUFJPTSBzdHJ1Y3R1cmUgdG8gc2VlIHRoZSBkb25nbGUgaGF2ZSBiZWVuIGNhbGlicmF0ZWQgb3Igbm90LgorICAgIGlmIChlZXByb21JbWFnZS0+YmFzZUVlcEhlYWRlci5sZW5ndGggPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICB6bV9kYmcoKCJXYXJuaW5nISBUaGlzIGRvbmdsZSBub3QgYmVlbiBjYWxpYnJhdGVkXG4iKSk7CisgICAgICAgICNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCItLS0tLXpmU2V0UG93ZXJDYWxUYWJsZSA6IGZyZXF1ZW5jeT0lZC0tLS0tXG4iLCBmcmVxdWVuY3kpOworICAgICNlbmRpZgorICAgIC8qIFRPRE8gOiAxLiBib3VuZGFyeTEgYW5kIHBvd2VyVHhNYXggc2hvdWxkIGJlIHJlZmVyZWQgdG8gQ1I2NjcgYW5kIENSNzkgKi8KKyAgICAvKiAgICAgICAgICAgaW4gb3R1cy5pbmkgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgLyogMi4gSW50ZXJwb2xhdGUgcHdyIGFuZCB2cGQgdGVzdCBwb2ludHMgZnJvbSBmcmVxdWVuY3kgKi8KKyAgICBEYmdQcmludCgiY2FsRnJlcVBpZXI1RyA6ICVkLCAlZCwgJWQsICVkICwlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbMF0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1sxXSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzJdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbM10qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1s0XSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzVdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbNl0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1s3XSo1KzQ4MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgiY2FsRnJlcVBpZXIyRyA6ICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1swXSsyMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1sxXSsyMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1syXSsyMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1szXSsyMzAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgI2VuZGlmCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpXSA9PSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1heDJnSW5kZXggPSBpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCJtYXgyZ0luZGV4IDogJWRcbiIsIG1heDJnSW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZmJpbiA9ICh1OF90KShmcmVxdWVuY3kgLSAyMzAwKTsKKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkcsIG1heDJnSW5kZXgpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCIyRyBpbmRleCA6ICVkXG4iLCBpbmRleCk7CisgICAgICAgIERiZ1ByaW50KCJjaGFpbiAwIGluZGV4XG4iKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHpmUHJpbnRUcCgmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnB3clBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0udnBkUGRnWzBdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMV1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1sxXVswXQorICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiY2hhaW4gMCBpbmRleCsxXG4iKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHpmUHJpbnRUcCgmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzBdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS5wd3JQZGdbMV1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0udnBkUGRnWzFdWzBdCisgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhaW4wcHdyUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS5wd3JQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHZwZFBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0udnBkUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0udnBkUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjBwd3JQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnB3clBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnB3clBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wdnBkUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS52cGRQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS52cGRQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgY2hhaW4ycHdyUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4XS5wd3JQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleCsxXS5wd3JQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnZwZFBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0udnBkUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0udnBkUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJwd3JQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXhdLnB3clBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4KzFdLnB3clBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ydnBkUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4XS52cGRQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleCsxXS52cGRQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpXSA9PSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1heDVnSW5kZXggPSBpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCJtYXg1Z0luZGV4IDogJWRcbiIsIG1heDVnSW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZmJpbiA9ICh1OF90KSgoZnJlcXVlbmN5IC0gNDgwMCkvNSk7CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHLCBtYXg1Z0luZGV4KTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiNUcgaW5kZXggOiAlZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKworICAgICAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wcHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ycHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyogQ2hhaW4gMSAqLworICAgIC8qIEdldCBwd3IgYW5kIHZwZCB0ZXN0IHBvaW50cyBmcm9tIGZyZXF1ZW5jeSAqLworICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICB7CisgICAgICAgIHB3cjBbaV0gPSBjaGFpbjBwd3JQZGcwW2ldPj4xOworICAgICAgICB2cGQwW2ldID0gY2hhaW4wdnBkUGRnMFtpXTsKKyAgICAgICAgcHdyMVtpXSA9IGNoYWluMHB3clBkZzFbaV0+PjE7CisgICAgICAgIHZwZDFbaV0gPSBjaGFpbjB2cGRQZGcxW2ldOworICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoIlRlc3QgUG9pbnRzXG4iKTsKKyAgICBEYmdQcmludCgicHdyMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMFswXSwgcHdyMFsxXSwgcHdyMFsyXSwgcHdyMFszXSwgcHdyMFs0XSk7CisgICAgRGJnUHJpbnQoInZwZDAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDBbMF0sIHZwZDBbMV0sIHZwZDBbMl0sIHZwZDBbM10sIHZwZDBbNF0pOworICAgIERiZ1ByaW50KCJwd3IxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IxWzBdLCBwd3IxWzFdLCBwd3IxWzJdLCBwd3IxWzNdLCBwd3IxWzRdKTsKKyAgICBEYmdQcmludCgidnBkMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMVswXSwgdnBkMVsxXSwgdnBkMVsyXSwgdnBkMVszXSwgdnBkMVs0XSk7CisgICAgI2VuZGlmCisgICAgLyogR2VuZXJhdGUgdGhlIHZwZCBhcnJheXMgKi8KKyAgICBmb3IgKGk9MDsgaTxib3VuZGFyeTErMSs2OyBpKyspCisgICAgeworICAgICAgICB2cGRfY2hhaW4xW2ldID0gemZHZXRJbnRlcnBvbGF0ZWRWYWx1ZShpLCAmcHdyMFswXSwgJnZwZDBbMF0pOworICAgIH0KKyAgICBmb3IgKDsgaTxwb3dlclR4TWF4KzErNis2OyBpKyspCisgICAgeworICAgICAgICB2cGRfY2hhaW4xW2ldID0gemZHZXRJbnRlcnBvbGF0ZWRWYWx1ZShpLTYtNiwgJnB3cjFbMF0sICZ2cGQxWzBdKTsKKyAgICB9CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJ2cGRfY2hhaW4xXG4iKTsKKyAgICBmb3IgKGk9MDsgaTxwb3dlclR4TWF4KzErNis2OyBpKz0xMCkKKyAgICB7CisgICAgICAgIERiZ1ByaW50KCIlZCwgJWQsICVkLCAlZCAsJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICB2cGRfY2hhaW4xW2krMF0sIHZwZF9jaGFpbjFbaSsxXSwgdnBkX2NoYWluMVtpKzJdLCB2cGRfY2hhaW4xW2krM10sIHZwZF9jaGFpbjFbaSs0XSwKKyAgICAgICAgICAgICAgICB2cGRfY2hhaW4xW2krNV0sIHZwZF9jaGFpbjFbaSs2XSwgdnBkX2NoYWluMVtpKzddLCB2cGRfY2hhaW4xW2krOF0sIHZwZF9jaGFpbjFbaSs5XSk7CisgICAgfQorICAgICNlbmRpZgorICAgIC8qIFdyaXRlIFBIWSByZWdzIDY3Mi03MDMgKi8KKyAgICBmb3IgKGk9MDsgaTwxMjg7IGkrPTQpCisgICAgeworICAgICAgICB1MzJfdCByZWdBZGRyID0gMHg5ODAwICsgKDY3MiAqIDQpOworICAgICAgICB1MzJfdCB2YWw7CisKKyAgICAgICAgdmFsID0gKCh1MzJfdCl2cGRfY2hhaW4xW2krM108PDI0KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4xW2krMl08PDE2KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4xW2krMV08PDgpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjFbaV0pOworCisgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgIHJlZ193cml0ZShyZWdBZGRyICsgaSwgdmFsKTsgIC8qIENSNjcyICovCisgICAgICAgICNlbmRpZgorICAgIH0KKworICAgIC8qIENoYWluIDIgKi8KKyAgICAvKiBHZXQgcHdyIGFuZCB2cGQgdGVzdCBwb2ludHMgZnJvbSBmcmVxdWVuY3kgKi8KKyAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgeworICAgICAgICBwd3IwW2ldID0gY2hhaW4ycHdyUGRnMFtpXT4+MTsKKyAgICAgICAgdnBkMFtpXSA9IGNoYWluMnZwZFBkZzBbaV07CisgICAgICAgIHB3cjFbaV0gPSBjaGFpbjJwd3JQZGcxW2ldPj4xOworICAgICAgICB2cGQxW2ldID0gY2hhaW4ydnBkUGRnMVtpXTsKKyAgICB9CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJUZXN0IFBvaW50c1xuIik7CisgICAgRGJnUHJpbnQoInB3cjAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjBbMF0sIHB3cjBbMV0sIHB3cjBbMl0sIHB3cjBbM10sIHB3cjBbNF0pOworICAgIERiZ1ByaW50KCJ2cGQwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQwWzBdLCB2cGQwWzFdLCB2cGQwWzJdLCB2cGQwWzNdLCB2cGQwWzRdKTsKKyAgICBEYmdQcmludCgicHdyMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMVswXSwgcHdyMVsxXSwgcHdyMVsyXSwgcHdyMVszXSwgcHdyMVs0XSk7CisgICAgRGJnUHJpbnQoInZwZDEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDFbMF0sIHZwZDFbMV0sIHZwZDFbMl0sIHZwZDFbM10sIHZwZDFbNF0pOworICAgICNlbmRpZgorICAgIC8qIEdlbmVyYXRlIHRoZSB2cGQgYXJyYXlzICovCisgICAgZm9yIChpPTA7IGk8Ym91bmRhcnkxKzErNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluM1tpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaSwgJnB3cjBbMF0sICZ2cGQwWzBdKTsKKyAgICB9CisgICAgZm9yICg7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluM1tpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaS02LTYsICZwd3IxWzBdLCAmdnBkMVswXSk7CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidnBkX2NoYWluM1xuIik7CisgICAgZm9yIChpPTA7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSs9MTApCisgICAgeworICAgICAgICBEYmdQcmludCgiJWQsICVkLCAlZCwgJWQgLCVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgdnBkX2NoYWluM1tpKzBdLCB2cGRfY2hhaW4zW2krMV0sIHZwZF9jaGFpbjNbaSsyXSwgdnBkX2NoYWluM1tpKzNdLCB2cGRfY2hhaW4zW2krNF0sCisgICAgICAgICAgICAgICAgdnBkX2NoYWluM1tpKzVdLCB2cGRfY2hhaW4zW2krNl0sIHZwZF9jaGFpbjNbaSs3XSwgdnBkX2NoYWluM1tpKzhdLCB2cGRfY2hhaW4zW2krOV0pOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIC8qIFdyaXRlIFBIWSByZWdzIDY3Mi03MDMgKyAweDEwMDAgKi8KKyAgICBmb3IgKGk9MDsgaTwxMjg7IGkrPTQpCisgICAgeworICAgICAgICB1MzJfdCByZWdBZGRyID0gMHg5ODAwICsgKDY3MiAqIDQpICsgMHgxMDAwOworICAgICAgICB1MzJfdCB2YWw7CisKKyAgICAgICAgdmFsID0gKCh1MzJfdCl2cGRfY2hhaW4zW2krM108PDI0KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4zW2krMl08PDE2KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4zW2krMV08PDgpIHwKKyAgICAgICAgICAgICAgICAoKHUzMl90KXZwZF9jaGFpbjNbaV0pOworCisgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgIHJlZ193cml0ZShyZWdBZGRyICsgaSwgdmFsKTsgIC8qIENSNjcyICovCisgICAgICAgICNlbmRpZgorICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKiAzLiBHZW5lcmF0ZSB0YXJnZXQgcG93ZXIgdGFibGUgKi8KKyAgICBpZiAoZnJlcXVlbmN5IDwgMzAwMCkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIkNDSyBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeENja1tpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjJHIEhUMjAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDIwW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoICh1OF90KXpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmYmluLCBidzQwLCBleHRPZmZzZXQpLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCIyRyBIVDQwIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKAorICAgICAgICAgICAgICAgICAgICAodThfdCl6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZmJpbiwgYnc0MCwgZXh0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdIVDQwW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgemZQcmludFRhcmdldFBvd2VyMkcoaHBQcml2LT50UG93MnhDY2ssCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMCwKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDVHICovCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCI1RyBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiNUcgSFQyMCBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQyMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUMjBbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleCgodThfdCl6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZmJpbiwgYnc0MCwgZXh0T2Zmc2V0KSwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiNUcgSFQ0MCBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQ0MFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWCgKKyAgICAgICAgICAgICAgICAgICAgKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQ0MFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjVHKAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDApOworICAgIH0KKworCisKKyAgICAvKiA0LiBDVEwgKi8KKyAgICAvKgorICAgICAqIDQuMSBHZXQgdGhlIGJhbmRlZGdlcyB0eCBwb3dlciBieSBmcmVxdWVuY3kKKyAgICAgKiAgICAgIDIuNEcgd2UgZ2V0IGN0bEVkZ2VzTWF4UG93ZXJDQ0sKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyRworICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMAorICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MAorICAgICAqICAgICAgNUcgd2UgZ2V0ICAgY3RsRWRnZXNNYXhQb3dlcjVHCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDQwCisgICAgICogNC4yIFVwZGF0ZSAoMy4pIHRhcmdldCBwb3dlciB0YWJsZSBieSA0LjEKKyAgICAgKiA0LjMgVHggcG93ZXIgb2Zmc2V0IGZvciBBUlQgLSBORElTL01ESworICAgICAqIDQuNCBXcml0ZSBNQUMgcmVnIDB4Njk0IGZvciBBQ0sncyBUUEMKKyAgICAgKgorICAgICAqLworCisgICAgLy96ZkR1bXBFZXBCYW5kRWRnZXMoZWVwcm9tSW1hZ2UpOworCisgICAgLyogZ2V0IHRoZSBjZmcgZnJvbSBFZXByb206IHJlZ2lvbkNvZGUgPT4gUmVndWxhdG9yeURvbWFpbiA6IDB4MTAtRkZDICAweDMwLWV1IDB4NDAtamFwICovCisgICAgZGVzaXJlZF9DdGxJbmRleCA9IHpmSHBHZXRSZWd1bGF0b3J5RG9tYWluKGRldik7CisgICAgaWYgKChkZXNpcmVkX0N0bEluZGV4ID09IDB4MzApIHx8IChkZXNpcmVkX0N0bEluZGV4ID09IDB4NDApIHx8IChkZXNpcmVkX0N0bEluZGV4ID09IDB4MCkpCisgICAgeworICAgICAgICAvKiBza2lwIENUTCBhbmQgaGVhdnkgY2xpcCAqLworICAgICAgICBocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwID0gMDsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICB6bV9kYmcoKCJSZWd1bGF0b3J5RG9tYWluID0gMCwgc2tpcCBDVEwgYW5kIGhlYXZ5IGNsaXBcbiIpKTsKKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXAgPSAxOworCisgICAgICAgIGlmIChkZXNpcmVkX0N0bEluZGV4ID09IDB4ZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRlc2lyZWQgaW5kZXggbm90IGZvdW5kICovCisgICAgICAgICAgICBkZXNpcmVkX0N0bEluZGV4ID0gMHgxMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpcnN0IHBhcnQgOiAyLjRHICovCisgICAgICAgIGlmIChmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMi40RyAtIENUTF8xMUIgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExQik7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlckNDSyA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzExQiBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDIuNEcgLSBDVExfMTFHICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUcpOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyRyA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzExRyBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDIuNEcgLSBDVExfMkdIVDIwICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8yR0hUMjApOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciBubyBkYXRhIGluIEVlcHJvbSwgcmVwbGFjZSBieSBub3JtYWwgMkcgKi8KKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gY3RsRWRnZXNNYXhQb3dlcjJHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzJHSFQyMCBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDIuNEcgLSBDVExfMkdIVDQwICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8yR0hUNDApOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciBubyBkYXRhIGluIEVlcHJvbSwgcmVwbGFjZSBieSBub3JtYWwgMkcgKi8KKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwID0gY3RsRWRnZXNNYXhQb3dlcjJHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzJHSFQ0MCBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKworICAgICAgICAgICAgLyogN2ExNyA6ICAqLworICAgICAgICAgICAgLyogTWF4IHBvd2VyIChkQm0pIGZvciBjaGFubmVsIHJhbmdlIHdoZW4gdXNpbmcgREZTIGRlZmluZSBieSBtYWR3aWZpKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCAodTE2X3QpZnJlcXVlbmN5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiZnJlcXVlbmN5IHVzZSBERlMgIC0tICIsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyQ0NLICAgICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyQ0NLLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHICAgICAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjJHLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBcHBseSBjdGwgbW9kZSB0byBjb3JyZWN0IHRhcmdldCBwb3dlciBzZXQgKi8KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXJDQ0sgICAgPSAiLCBjdGxFZGdlc01heFBvd2VyQ0NLKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXIyRyAgICAgPSAiLCBjdGxFZGdlc01heFBvd2VyMkcpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCA9ICIsIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjApOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9ICIsIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MnhDY2tbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MnhDY2tbaV0sIGN0bEVkZ2VzTWF4UG93ZXJDQ0spICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHBQcml2LT50UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGlmIChocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bE9mZnNldCA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChmcmVxdWVuY3kgPT0gMjQxMikgfHwgKGZyZXF1ZW5jeSA9PSAyNDYyKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyRy1jdGxPZmZzZXQpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnW2ldLCBjdGxFZGdlc01heFBvd2VyMkcpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+dFBvdzJ4MmdbaV0gPiAoY3RsRWRnZXNNYXhQb3dlcjJHLWN0bE9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0ID0gaHBQcml2LT50UG93MngyZ1tpXSAtIChjdGxFZGdlc01heFBvd2VyMkctY3RsT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyRykgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyZXF1ZW5jeSA9PSAyNDEyKSB8fCAoZnJlcXVlbmN5ID09IDI0NjIpKSAmJiAoaT49MykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQyMFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMC1jdGxPZmZzZXQpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQyMFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoZnJlcXVlbmN5ID09IDI0MTIpICYmIChpPj0zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwLWN0bE9mZnNldCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmcmVxdWVuY3kgPT0gMjQ2MikgJiYgKGk+PTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0NDBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAtKGN0bE9mZnNldCoyKSkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1RyAtIENUTF8xMUEgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExQSk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfMTFBIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogNUcgLSBDVExfNUdIVDIwICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF81R0hUMjApOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3b3JrYXJvdW5kIGZvciBubyBkYXRhIGluIEVlcHJvbSwgcmVwbGFjZSBieSBub3JtYWwgNUcgKi8KKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwID0gY3RsRWRnZXNNYXhQb3dlcjVHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzVHSFQyMCBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDVHIC0gQ1RMXzVHSFQ0MCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfNUdIVDQwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDQwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDVHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCA9IGN0bEVkZ2VzTWF4UG93ZXI1RzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF81R0hUNDAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiA3YTE3IDogICovCisgICAgICAgICAgICAvKiBNYXggcG93ZXIgKGRCbSkgZm9yIGNoYW5uZWwgcmFuZ2Ugd2hlbiB1c2luZyBERlMgZGVmaW5lIGJ5IG1hZHdpZmkqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbChkZXYsICh1MTZfdClmcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJmcmVxdWVuY3kgdXNlIERGUyAgLS0gIiwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1RyAgICAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXI1Rywgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDQwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyNUdIVDQwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBBcHBseSBjdGwgbW9kZSB0byBjb3JyZWN0IHRhcmdldCBwb3dlciBzZXQgKi8KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXI1RyAgICAgPSAiLCBjdGxFZGdlc01heFBvd2VyNUcpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCA9ICIsIGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjApOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCA9ICIsIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDVnW2ldLCBjdGxFZGdlc01heFBvd2VyNUcpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDIwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4NWdIdDIwW2ldLCBjdGxFZGdlc01heFBvd2VyNUdIVDIwKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDVnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfS8qIGVuZCBvZiBiYW5kZWRnZXMgb2YgNUcgKi8KKyAgICB9LyogZW5kIG9mICBpZiAoKGRlc2lyZWRfQ3RsSW5kZXggPSB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbihkZXYpKSA9PSAwKSAqLworCisgICAgLyogd29ya2Fyb3VuZCAqLworICAgIC8qIDUuIEJCIGhlYXZ5IGNsaXAgKi8KKyAgICAvKiAgICBvbmx5IDIuNEcgZG8gaGVhdnkgY2xpcCAqLworICAgIGlmIChocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwICYmIGhwUHJpdi0+aHdCQkhlYXZ5Q2xpcCAmJiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpKQorICAgIHsKKyAgICAgICAgaWYgKGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFBKTsKKyAgICAgICAgfQorCisgICAgICAgIGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAgPSB6ZkhwQ2hlY2tEb0hlYXZ5Q2xpcChkZXYsIGZyZXF1ZW5jeSwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBidzQwKTsKKworICAgICAgICBpZiAoaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCkKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5kb0JCSGVhdnlDbGlwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICB6bV9kYmcoKCJ6ZkhwQ2hlY2tEb0hlYXZ5Q2xpcCByZXQgPSAlMDJ4LCBkb0JCSGVhdnlDbGlwID0gJWRcbiIsCisgICAgICAgICAgICAgICAgIGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAsIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCkpOworICAgICAgICAjZW5kaWYKKworICAgICAgICBpZiAoaHBQcml2LT5kb0JCSGVhdnlDbGlwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCAmIDB4ZjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbMF0gLT0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFsxXSAtPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwWzJdIC09IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwICYgMHhmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzBdICs9IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbMV0gKz0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFsyXSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCA9IDA7CisgICAgICAgIGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAgPSAwOworICAgIH0KKworICAgIC8qIEZpbmFsIDogd3JpdGUgTUFDIHJlZ2lzdGVyIGZvciBzb21lIGN0cmwgZnJhbWUgVHggcG93ZXIgKi8KKyAgICAvKiBmaXJzdCBwYXJ0IDogMi40RyAqLworICAgIGlmIChmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICB7CisgICAgICAgIC8qIFdyaXRlIE1BQyByZWcgMHg2OTQgZm9yIEFDSydzIFRQQyAqLworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4YmI0IFJUUyBhbmQgU0YtQ1RTIGZyYW1lIHBvd2VyIGNvbnRyb2wgKi8KKyAgICAgICAgLyogQWx3YXlzIHVzZSB0d28gc3RyZWFtIGZvciBsb3cgbGVnYWN5IHJhdGUgKi8KKyAgICAgICAgI2lmIDAKKyAgICAgICAgLy9pZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCAyMCkgfCAoMHgxPDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDE8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjEpIHwgKDB4MTw8MjcpICApOworICAgICAgICAvL30KKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZiAxCisgICAgICAgIC8vZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgNSApIHwgKDB4NTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCAyMSkgfCAoMHg1PDwyNykgICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyA9IGhwUHJpdi0+dFBvdzJ4MmdbMF07CisgICAgCX0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgemZQcmludFRhcmdldFBvd2VyMkcoaHBQcml2LT50UG93MnhDY2ssCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMCwKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFdyaXRlIE1BQyByZWcgMHg2OTQgZm9yIEFDSydzIFRQQyAqLworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4YmI0IFJUUyBhbmQgU0YtQ1RTIGZyYW1lIHBvd2VyIGNvbnRyb2wgKi8KKyAgICAgICAgLyogQWx3YXlzIHVzZSB0d28gc3RyZWFtIGZvciBsb3cgbGVnYWN5IHJhdGUgKi8KKyAgICAgICAgaWYgKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCAyMCkgfCAoMHgxPDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDE8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjEpIHwgKDB4MTw8MjcpICApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgNSApIHwgKDB4NTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCAyMSkgfCAoMHg1PDwyNykgICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyA9IGhwUHJpdi0+dFBvdzJ4MmdbMF07CisgICAgICAgIH0KKworCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgemZQcmludFRhcmdldFBvd2VyNUcoCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1ZywKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQyMCwKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQ0MCk7CisgICAgfS8qIGVuZCBvZiBiYW5kZWRnZXMgb2YgNUcgKi8KKworfQorCit2b2lkIHpmRHVtcEVlcEJhbmRFZGdlcyhzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZSkKK3sKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgdThfdCBpLCBqLCBrOworCisjaWYgMAorICAgIHptX2RiZygoIlxuID09PSBCYW5kRWRnZXMgaW5kZXggZHVtcCA9PT09IFxuIikpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSNTQxNl9OVU1fQ1RMUzsgaSsrKQorICAgIHsKKyAgICAgICAgem1fZGJnKCgiJTAyeCAiLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaV0pKTsKKyAgICB9CisKKyAgICB6bV9kYmcoKCJcbiA9PT0gQmFuZEVkZ2VzIGRhdGEgZHVtcCA9PT09IFxuIikpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSNTQxNl9OVU1fQ1RMUzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgQVI1NDE2X05VTV9CQU5EX0VER0VTOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCAqcGRhdGEgPSAodThfdCopJihlZXByb21JbWFnZS0+Y3RsRGF0YVtpXS5jdGxFZGdlc1tqXVtrXSk7CisgICAgICAgICAgICAgICAgem1fZGJnKCgiKCUwMnggJTAyeCkiLCBwZGF0YVswXSwgcGRhdGFbMV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptX2RiZygoIlxuIikpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICB6bV9kYmcoKCJcbiA9PT0gQmFuZEVkZ2VzIGluZGV4IGR1bXAgPT09PSBcbiIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrPTgpCisgICAgeworICAgICAgICB6bV9kYmcoKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngiLAorICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krMF0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzFdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSsyXSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krM10sCisgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSs0XSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krNV0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzZdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSs3XQorICAgICAgICAgICAgICAgKSk7CisgICAgfQorCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBkYXRhIGR1bXAgPT09PSBcbiIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgKnBkYXRhID0gKHU4X3QqKSYoZWVwcm9tSW1hZ2UtPmN0bERhdGFbaV0uY3RsRWRnZXNbal0pOworICAgICAgICAgICAgem1fZGJnKCgiKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgXG4iLAorICAgICAgICAgICAgICAgICAgIHBkYXRhWzBdLCBwZGF0YVsxXSwgcGRhdGFbMl0sIHBkYXRhWzNdLAorICAgICAgICAgICAgICAgICAgIHBkYXRhWzRdLCBwZGF0YVs1XSwgcGRhdGFbNl0sIHBkYXRhWzddCisgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICB6bV9kYmcoKCIoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSAoJTAzZCAlMDJ4KSBcbiIsCisgICAgICAgICAgICAgICAgICAgcGRhdGFbOF0sIHBkYXRhWzldLCBwZGF0YVsxMF0sIHBkYXRhWzExXSwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVsxMl0sIHBkYXRhWzEzXSwgcGRhdGFbMTRdLCBwZGF0YVsxNV0KKyAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgICNlbmRpZgorfQorCit2b2lkIHpmUHJpbnRUYXJnZXRQb3dlcjJHKHU4X3QqIHRQb3cyeENjaywgdThfdCogdFBvdzJ4MmcsIHU4X3QqIHRQb3cyeDJnSHQyMCwgdThfdCogdFBvdzJ4MmdIdDQwKQoreworICAgIC8vI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIENDSyA6ICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4Q2NrWzBdLAorICAgICAgICAgICAgdFBvdzJ4Q2NrWzFdLAorICAgICAgICAgICAgdFBvdzJ4Q2NrWzJdLAorICAgICAgICAgICAgdFBvdzJ4Q2NrWzNdCisgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgMkcgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDJnWzBdLAorICAgICAgICAgICAgdFBvdzJ4MmdbMV0sCisgICAgICAgICAgICB0UG93MngyZ1syXSwKKyAgICAgICAgICAgIHRQb3cyeDJnWzNdCisgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgMkdIVDIwIDogJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzBdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzFdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzJdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzNdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzRdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzVdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzZdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDIwWzddCisgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgMkdIVDQwIDogJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzBdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzFdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzJdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzNdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzRdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzVdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzZdLAorICAgICAgICAgICAgdFBvdzJ4MmdIdDQwWzddCisgICAgICAgICAgICApOworICAgICNlbmRpZgorICAgIHJldHVybjsKK30KKwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXI1Ryh1OF90KiB0UG93Mng1ZywgdThfdCogdFBvdzJ4NWdIdDIwLCB1OF90KiB0UG93Mng1Z0h0NDApCit7CisgICAgLy8jaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgNUcgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDVnWzBdLAorICAgICAgICAgICAgdFBvdzJ4NWdbMV0sCisgICAgICAgICAgICB0UG93Mng1Z1syXSwKKyAgICAgICAgICAgIHRQb3cyeDVnWzNdCisgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgNUdIVDIwIDogJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzBdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzFdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzJdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzNdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzRdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzVdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzZdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDIwWzddCisgICAgICAgICAgICApOworICAgIERiZ1ByaW50KCJ0YXJnZXRQd3IgNUdIVDQwIDogJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzBdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzFdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzJdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzNdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzRdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzVdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzZdLAorICAgICAgICAgICAgdFBvdzJ4NWdIdDQwWzddCisgICAgICAgICAgICApOworICAgICNlbmRpZgorICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBzdGFNb2RlLCB1OF90IHBzTW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwpCit7CisgICAgaWYgKCBzdGFNb2RlID09IDAgKQorICAgIHsKKyAgICAgICAgaWYgKCBwc01vZGUgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHByZS1UQlRUIGludGVycnVwdAorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1BSRVRCVFQsIDApOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIDApOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFR1cm4gb24gcHJlLVRCVFQgaW50ZXJydXB0CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUFJFVEJUVCwgKGJjbkludGVydmFsLTYpPDwxNik7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BFUklPRCwgYmNuSW50ZXJ2YWwpOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoemRldl90KiBkZXYsIHU4X3QgcHNTdGF0ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisJLy9EYmdQcmludCgiSU5UTyB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUiKTsKKworICAgIGlmICggcHNTdGF0ZSA9PSAwICkgLy9wb3dlciB1cAorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgiemZIcFBvd2VyU2F2ZVNldFN0YXRlIFdha2UgdXAgZnJvbSBQU1xuIik7CisgICAgICAgIHJlZ193cml0ZSgweDk4MkMsIDB4MDAwMGEwMDApOyAvL3dha2UgdXAgQUREQUMKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgwOCwgMHgwKTsgICAgICAgIC8vZW5hYmxlIGFsbCBhZ2MgZ2FpbiBhbmQgb2Zmc2V0IHVwZGF0ZXMgdG8gYTIKKyAgICAgICAgLy8jIGJhbmsgMworICAgICAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWcgKi8KKyAgICAgICAgICAgIC8vcmVnX3dyaXRlICgweDk4ZjAsICAweDAxYzAwMDE4KTsKKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMWMyMDA5OCk7Ly9zeW5fb24rUlhfT04KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDExYSAqLworICAgICAgICAgICAgLy9yZWdfd3JpdGUgKDB4OThmMCwgIDB4MDE0MDAwMTgpOworICAgICAgICAgICAgcmVnX3dyaXRlICgweDk4ZjAsICAweDAxNDIwMDk4KTsvL3N5bl9vbitSWF9PTgorICAgICAgICB9CisKKyAgICAgICAgLy8vLyNiYW5rIDUKKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5OGIwLCAgMHgwMDAwMDAxMyk7CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThlNCwgIDB4MDAwMDAwMDIpOworCisKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9CisgICAgZWxzZSAvL3Bvd2VyIGRvd24KKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoInpmSHBQb3dlclNhdmVTZXRTdGF0ZSBHbyB0byBQU1xuIik7CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OTgyQywgMHhhMDAwYTAwMCk7CisgICAgICAgIHJlZ193cml0ZSgweDk4MDgsIDB4ODAwMDAwMCk7ICAgIC8vZGlzYWJsZSBhbGwgYWdjIGdhaW4gYW5kIG9mZnNldCB1cGRhdGVzIHRvIGEyCisgICAgICAgIHJlZ193cml0ZSgweDk4MkMsIDB4YTAwMGEwMDApOyAgIC8vcG93ZXIgZG93biBBRERBQworICAgICAgICAvLyMgYmFuayAzCisgICAgICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDExZyAqLworICAgICAgICAgICAgcmVnX3dyaXRlICgweDk4ZjAsICAweDAwYzAwMDE4KTsvL3N5bl9vZmYrUlhfb2ZmCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWEgKi8KKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMDQwMDAxOCk7Ly9zeW5fb2ZmK1JYX29mZgorICAgICAgICB9CisKKyAgICAgICAgLy8vLyNiYW5rIDUKKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5OGIwLCAgMHgwMDBlMDAxMyk7CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThlNCwgIDB4MDAwMTgwMDIpOworCisKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZIcFNldEFnZ1BrdE51bSh6ZGV2X3QqIGRldiwgdTMyX3QgbnVtKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBudW0gPSAobnVtIDw8IDE2KSB8ICgweGEpOworCisgICAgaHBQcml2LT5hZ2dQa3ROdW0gPSBudW07CisKKyAgICAvL2FnZ3JlZ2F0aW9uIG51bWJlciB3aWxsIGJlIHVwZGF0ZSBpbiBIQUwgaGVhcnQgYmVhdAorICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2I5YywgbnVtKTsKKyAgICAvL3pmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcFNldE1QRFVEZW5zaXR5KHpkZXZfdCogZGV2LCB1OF90IGRlbnNpdHkpCit7CisgICAgdTMyX3QgdmFsdWU7CisKKyAgICBpZiAoZGVuc2l0eSA+IFpNX01QRFVfREVOU0lUWV84VVMpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogRGVmYXVsdCB2YWx1ZSBpbiB0aGlzIHJlZ2lzdGVyICovCisgICAgdmFsdWUgPSAweDE0MEEwMCB8IGRlbnNpdHk7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmEwLCB2YWx1ZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcFNldFNsb3RUaW1lKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIGlmICh0eXBlID09IDApCisgICAgeworICAgICAgICAvL25vcm1hbCBzbG90ID0gMjB1cworICAgICAgICBocFByaXYtPnNsb3RUeXBlID0gMDsKKyAgICB9CisgICAgZWxzZSAvL2lmICh0eXBlID09IDEpCisgICAgeworICAgICAgICAvL3Nob3J0IHNsb3QgPSA5dXMKKyAgICAgICAgaHBQcml2LT5zbG90VHlwZSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgaWYodHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLy9ub3JtYWwgc2xvdCA9IDIwdXMKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NMT1RfVElNRSwgMjA8PDEwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9zaG9ydCBzbG90ID0gOXVzCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTE9UX1RJTUUsIDk8PDEwKTsKKyAgICB9Cit9CisKK3ZvaWQgemZIcFNldFJpZnMoemRldl90KiBkZXYsIHU4X3QgaHRfZW5hYmxlLCB1OF90IGh0MjA0MCwgdThfdCBnX21vZGUpCit7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNjM4OCwgMHgwYzAwMDAwMCk7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OWVjLCAweDBjYzgwY2FhKTsKKworICAgIGlmIChodF9lbmFibGUpCisgICAgeworICAgICAgICBpZiAoaHQyMDQwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTE4LCA0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1OTE4LCAyMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ19tb2RlKQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTg1MCwgMHhlYzA4YjRlMik7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NWMsIDB4MzEzYTVkNWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1ODUwLCAweGVkZThiNGUwKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTg1YywgMHgzMTM5NjA1ZSk7CisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcEJlZ2luU2l0ZVN1cnZleSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoIHN0YXR1cyA9PSAxICkKKyAgICB7IC8vIENvbm5lY3RlZAorICAgICAgICBocFByaXYtPmlzU2l0ZVN1cnZleSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8vIE5vdCBjb25uZWN0ZWQKKyAgICAgICAgaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPSAwOworICAgIH0KKworICAgIC8qIHJlc2V0IHdvcmthcm91bmQgc3RhdGUgdG8gZGVmYXVsdCAqLworLy8gICAgaWYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDEpCisgICAgeworICAgICAgICBocFByaXYtPnJ4U3Ryb25nUlNTSSA9IDA7CisgICAgICAgIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDliNDkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4MDkwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDliNDApOworICAgICAgICB9CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorLy8gICAgaWYgKGhwUHJpdi0+c3Ryb25nUlNTSSA9PSAxKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMDsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjApIHwgKDB4NTw8MjYpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgNSApIHwgKDB4NTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KK30KKwordm9pZCB6ZkhwRmluaXNoU2l0ZVN1cnZleSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoIHN0YXR1cyA9PSAxICkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPSAwOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZkZ3UmV0cnkoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQgPSAwOworCisgICAgY21kWzBdID0gNCB8ICgweDkyIDw8IDgpOworICAgIGNtZFsxXSA9IChlbmFibGUgPT0gMSkgPyAweDAxIDogMHgwMDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTE2X3QgemZIcEVuYWJsZUh3UmV0cnkoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0OworCisgICAgcmV0ID0gemZGd1JldHJ5KGRldiwgMCk7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjI4LCAweDMzMzMzKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordTE2X3QgemZIcERpc2FibGVId1JldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHJldCA9IHpmRndSZXRyeShkZXYsIDEpOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2IyOCwgMHgwMDAwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIERvd25sb2FkIFNQSSBGdyAqLworI2RlZmluZSBaTV9GSVJNV0FSRV9XTEFOICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fRklSTVdBUkVfU1BJX0ZMQVNIICAgICAgICAgICAxCisKKwordTE2X3QgemZIcEZpcm13YXJlRG93bmxvYWQoemRldl90KiBkZXYsIHU4X3QgZndUeXBlKQoreworICAgIHUxNl90IHJldCA9IFpNX1NVQ0NFU1M7CisKKyAgICBpZiAoZndUeXBlID09IFpNX0ZJUk1XQVJFX1dMQU4pCisgICAgeworICAgICAgICByZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU2l6ZSwgWk1fRklSTVdBUkVfV0xBTl9BRERSKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZndUeXBlID09IFpNX0ZJUk1XQVJFX1NQSV9GTEFTSCkKKyAgICB7CisgICAgICAgIHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlU1BJLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTUElTaXplLCBaTV9GSVJNV0FSRV9TUElfQUREUik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzEoIlVua25vd24gZmlybXdhcmUgdHlwZSA9ICIsIGZ3VHlwZSk7CisgICAgICAgIHJldCA9IFpNX0VSUl9GSVJNV0FSRV9XUk9OR19UWVBFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIEVuYWJsZSBzb2Z0d2FyZSBkZWNyeXB0aW9uICovCit2b2lkIHpmSHBTV0RlY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKQoreworICAgIHUzMl90IHZhbHVlID0gMHg3MDsKKworICAgIC8qIEJpdCA0IGZvciBlbmFibGUgc29mdHdhcmUgZGVjcnlwdGlvbiAqLworICAgIGlmIChlbmFibGUgPT0gMSkKKyAgICB7CisgICAgICAgIHZhbHVlID0gMHg3ODsKKyAgICB9CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjc4LCB2YWx1ZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyogRW5hYmxlIHNvZnR3YXJlIGVuY3J5cHRpb24gKi8KK3ZvaWQgemZIcFNXRW5jcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgLyogQmVjYXVzZSBlbmNyeXB0aW9uIGJ5IHNvZnR3YXJlIG9yIGhhcmR3YXJlIGlzIGp1ZGdlZCBieSBkcml2ZXIgaW4gT3R1cywKKyAgICAgICB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIHRoZSBIQUwgbGF5ZXIuCisgICAgICovCit9CisKK3UzMl90IHpmSHBDYXBhYmlsaXR5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgcmV0dXJuIGhwUHJpdi0+aGFsQ2FwYWJpbGl0eTsKK30KKwordm9pZCB6ZkhwU2V0Um9sbENhbGxUYWJsZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIGlmIChocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgIT0gKHU2NF90KSAwKQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfTCwgKHUzMl90KShocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgJiAweGZmZmZmZmZmKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19ST0xMX0NBTExfVEJMX0gsICh1MzJfdCkoKGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSA+PiAzMikgJiAweGZmZmZmZmZmKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorfQorCit2b2lkIHpmSHBTZXRUVFNJRlNUaW1lKHpkZXZfdCogZGV2LCB1OF90IHNpZnNfdGltZSkKK3sKKyAgICB1MzJfdCByZWdfdmFsdWUgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHNpZnNfdGltZSAmPSAweDNmOworICAgIHJlZ192YWx1ZSA9IDB4MTQ0MDBiIHwgKCgodTMyX3Qpc2lmc190aW1lKTw8MjQpOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIHJlZ192YWx1ZSk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyogIzMgRW5hYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgcGF0dGVybiBtYXRjaGVkICEgKi8KK3ZvaWQgemZIcEVuYWJsZVJpZnMoemRldl90KiBkZXYsIHU4X3QgbW9kZTI0ZywgdThfdCBtb2RlSHQsIHU4X3QgbW9kZUh0MjA0MCkKK3sKKworICAgIC8qICMgRW5hYmxlIFJlc2V0IFRET01BSU4KKyAgICAgKiAkcmRkYXRhID0gJiRwaHlyZWdfcmVhZCgweDk4MDArKDczODw8MikpOworICAgICAqICR3cmRhdGEgPSAkcmRkYXRhIHwgKDB4MSA8PCAyNikgfCAoMHgxIDw8IDI3KTsKKyAgICAgKiAmJHBoeXJlZ193cml0ZSgweDk4MDArKDczODw8MiksICR3cmRhdGEpOworICAgICAqLworICAgIHJlZ193cml0ZSAoMHg5ODAwKyg3Mzg8PDIpLCAweDA4MDAwMDAwIHwgKDB4MSA8PCAyNikgfCAoMHgxIDw8IDI3KSk7CisgICAgLy9yZWdfd3JpdGUgKDB4OTgwMCsoNzM4PDwyKSwgMHgwODAwMDAwMCB8ICgweDEgPDwgMjYpKTsKKworICAgIC8qICMgcmVnIDEyMzogaGVhdnkgY2xpcCBmYWN0b3IsIHhyIC8gUklGUyBzZWFyY2ggcGFyYW1ldGVycyAqLworICAgIHJlZ193cml0ZSAoMHg5OWVjLCAweDBjYzgwY2FhKTsKKworICAgIC8qICMgUmVkdWNlIFNlYXJjaCBTdGFydCBEZWxheSBmb3IgUklGUyAgICAqLworICAgIGlmIChtb2RlSHQgPT0gMSkgLyogKCRIVF9FTkFCTEUgPT0gMSkgKi8KKyAgICB7CisgICAgICAgIGlmIChtb2RlSHQyMDQwID09IDB4MSkgLyogKCREWU5BTUlDX0hUMjA0MF9FTiA9PSAweDEpICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDArKDcwPDwyKSwgNDApOy8qNDAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwMCsoNzA8PDIpLCAyMCk7CisgICAgICAgICAgICBpZihtb2RlMjRnID09IDB4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAkcmRkYXRhID0gJiRwaHlyZWdfcmVhZCgweDk4MDArKDI0PDwyKSk7IzB4OTg2MDsweDFjNTg2MAorICAgICAgICAgICAgICAgICAqJHdyZGF0YSA9ICgkcmRkYXRhICYgMHhmZmZmZmZjNykgfCAoMHg0IDw8IDMpOworICAgICAgICAgICAgICAgICAqICYkcGh5cmVnX3dyaXRlKDB4OTgwMCsoMjQ8PDIpLCAkd3JkYXRhKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODAwKygyNDw8MiksICgweDAwMDRkZDEwICYgMHhmZmZmZmZjNykgfCAoMHg0IDw8IDMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtb2RlMjRnID09IDB4MSkKKyAgICB7CisgICAgICAgIHJlZ193cml0ZSgweDk4NTAsIDB4ZWNlOGI0ZTQpOy8qb3JnKi8KKyAgICAgICAgLy9yZWdfd3JpdGUoMHg5ODUwLCAweGVjZThiNGUyKTsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTg1YywgMHgzMTNhNWQ1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlZ193cml0ZSgweDk4NTAsIDB4ZWRlOGI0ZTQpOworICAgICAgICByZWdfd3JpdGUoMHg5ODVjLCAweDMxMzk2MDVlKTsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuOworfQorCisvKiAjNCBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgdGltZXIgaXMgdGltZW91dCAhICovCit2b2lkIHpmSHBEaXNhYmxlUmlmcyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaXMgdG8gc3RvcmUgdGhlc2UgSFcgcmVnaXN0ZXIgaW5pdGlhbCB2YWx1ZSB3aGlsZSB0aGUgZGV2aWNlIHBsdWctaW4gYW5kCisgICAgICAgcmUtd3JpdGUgdG8gdGhlc2UgcmVnaXN0ZXIgaWYgdGhlIFJJRlMgZnVuY3Rpb24gaXMgZGlzYWJsZWQgICovCisKKyAgICAvLyByZWcgOiA5ODUwCisgICAgcmVnX3dyaXRlKDB4OTg1MCwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RGVzaXJlZFNpZ1NpemUpOworCisgICAgLy8gcmVnIDogOTg1YworICAgIHJlZ193cml0ZSgweDk4NWMsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFHQyk7CisKKyAgICAvLyByZWcgOiA5ODYwCisgICAgcmVnX3dyaXRlKDB4OTgwMCsoMjQ8PDIpLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBZ2NDb250cm9sKTsKKworICAgIC8vIHJlZyA6IDk5MTgKKyAgICByZWdfd3JpdGUoMHg5ODAwKyg3MDw8MiksICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFNlYXJjaFN0YXJ0RGVsYXkpOworCisgICAgLy8gcmVnIDogOTkxYworICAgIHJlZ193cml0ZSAoMHg5OWVjLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRSSUZTU2VhcmNoUGFyYW1zKTsKKworICAgIC8vIHJlZyA6IGEzODgKKyAgICByZWdfd3JpdGUgKDB4OTgwMCsoNzM4PDwyKSwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RmFzdENoYW5uZWxDaGFuZ2VDb250cm9sKTsKKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmViYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuYwpAQCAtMCwwICsxLDI0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhwcmVnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgUmVndWxhdG9yeSBUYWJsZSBhbmQgcmVsYXRlZCBmdW5jdGlvbi4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwcmVnLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKworLyogdXNlZCB0aHJvdWdob3V0IHRoaXMgZmlsZS4uLiAqLworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKworI2RlZmluZSBIQUxfTU9ERV8xMUFfVFVSQk8JSEFMX01PREVfMTA4QQorI2RlZmluZSBIQUxfTU9ERV8xMUdfVFVSQk8JSEFMX01PREVfMTA4RworCisjaWYgMAorZW51bSB7CisgICAgLyogdGVzdCBncm91cHMgKi8KKwlGQ0MJICAgICAgID0gMHgxMCwKKwlNS0sJICAgICAgID0gMHg0MCwKKwlFVFNJCSAgID0gMHgzMCwKKyAgICBTRF9OT19DVEwgID0gMHhlMCwKKwlOT19DVEwJICAgPSAweGZmLAorICAgIC8qIHRlc3QgbW9kZXMgKi8KKyAgICBDVExfTU9ERV9NID0gMHgwZiwKKyAgICBDVExfMTFBICAgID0gMCwKKwlDVExfMTFCCSAgID0gMSwKKwlDVExfMTFHCSAgID0gMiwKKwlDVExfVFVSQk8gID0gMywKKwlDVExfMTA4RyAgID0gNCwKKyAgICBDVExfMkdIVDIwID0gNSwKKyAgICBDVExfNUdIVDIwID0gNiwKKyAgICBDVExfMkdIVDQwID0gNywKKyAgICBDVExfNUdIVDQwID0gOAorfTsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgZmxhZ3MgZm9yIGRpZmZlcmVudCByZXF1aXJlbWVudHMgcGVyIHJlZyBkb21haW4uCisgKiBUaGVzZSByZXF1aXJlbWVudHMgYXJlIGVpdGhlciBpbmhlcmV0ZWQgZnJvbSB0aGUgcmVnIGRvbWFpbiBwYWlyIG9yCisgKiBmcm9tIHRoZSB1bml0YXJ5IHJlZyBkb21haW4gaWYgdGhlIHJlZyBkb21haW4gcGFpciBmbGFncyB2YWx1ZSBpcworICogMAorICovCisKK2VudW0geworCU5PX1JFUQkJCT0gMHgwMDAwMDAwMCwKKwlESVNBTExPV19BREhPQ18xMUEJPSAweDAwMDAwMDAxLAorCURJU0FMTE9XX0FESE9DXzExQV9UVVJCCT0gMHgwMDAwMDAwMiwKKwlORUVEX05GQwkJPSAweDAwMDAwMDA0LAorCisJQURIT0NfUEVSXzExRAkJPSAweDAwMDAwMDA4LCAgLyogU3RhcnQgQWQtSG9jIG1vZGUgKi8KKwlBREhPQ19OT18xMUEJCT0gMHgwMDAwMDAxMCwKKworCVBVQkxJQ19TQUZFVFlfRE9NQUlOCT0gMHgwMDAwMDAyMCwgCS8qIHB1YmxpYyBzYWZldHkgZG9tYWluICovCisJTElNSVRfRlJBTUVfNE1TIAk9IDB4MDAwMDAwNDAsIAkvKiA0bXNlYyBsaW1pdCBvbiB0aGUgZnJhbWUgbGVuZ3RoICovCit9OworCisjZGVmaW5lIE1LSzVHSFpfRkxBRzEgKERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkMgfCBMSU1JVF9GUkFNRV80TVMpCisjZGVmaW5lIE1LSzVHSFpfRkxBRzIgKERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCIHwgTkVFRF9ORkN8IExJTUlUX0ZSQU1FXzRNUykKKwordHlwZWRlZiBlbnVtIHsKKwlERlNfVU5JTklUX0RPTUFJTgk9IDAsCS8qIFVuaW5pdGlhbGl6ZWQgZGZzIGRvbWFpbiAqLworCURGU19GQ0NfRE9NQUlOCQk9IDEsCS8qIEZDQzMgZGZzIGRvbWFpbiAqLworCURGU19FVFNJX0RPTUFJTgkJPSAyLAkvKiBFVFNJIGRmcyBkb21haW4gKi8KK30gSEFMX0RGU19ET01BSU47CisKKy8qCisgKiBVc2VkIHRvIHNldCB0aGUgUmVnRG9tYWluIGJpdG1hc2sgd2hpY2ggY2hvb3NlcyB3aGljaCBmcmVxdWVuY3kKKyAqIGJhbmQgc3BlY3MgYXJlIHVzZWQuCisgKi8KKworI2RlZmluZSBCTUxFTiAyCQkvKiBVc2UgMiA2NCBiaXQgdWludCBmb3IgY2hhbm5lbCBiaXRtYXNrCisJCQkgICBOQjogTXVzdCBhZ3JlZSB3aXRoIG1hY3JvIGJlbG93IChCTSkgKi8KKyNkZWZpbmUgQk1aRVJPIHsodTY0X3QpIDAsICh1NjRfdCkgMH0JLyogQk1MRU4gemVyb3MgKi8KKworI2lmIDAKKworI2RlZmluZSBCTShfZmEsIF9mYiwgX2ZjLCBfZmQsIF9mZSwgX2ZmLCBfZmcsIF9maCwgX2ZpLCBfZmosIF9maywgX2ZsKSBcCisgICAgICB7KCgoKF9mYSA+PSAwKSAmJiAoX2ZhIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmEpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmIgPj0gMCkgJiYgKF9mYiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZiKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZjID49IDApICYmIChfZmMgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mYykgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZCA+PSAwKSAmJiAoX2ZkIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmQpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmUgPj0gMCkgJiYgKF9mZSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZlKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZmID49IDApICYmIChfZmYgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mZikgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZyA+PSAwKSAmJiAoX2ZnIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmcpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmggPj0gMCkgJiYgKF9maCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZoKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZpID49IDApICYmIChfZmkgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maiA+PSAwKSAmJiAoX2ZqIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmopIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmsgPj0gMCkgJiYgKF9mayA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZrKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZsID49IDApICYmIChfZmwgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mbCkgOiAodTY0X3QpIDApIHwgXAorCSAgICAgICAoKCgoX2ZhID4gNjMpICYmIChfZmEgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZhIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mYiA+IDYzKSAmJiAoX2ZiIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYiAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmMgPiA2MykgJiYgKF9mYyA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmMgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZkID4gNjMpICYmIChfZmQgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZkIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZSA+IDYzKSAmJiAoX2ZlIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZSAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmYgPiA2MykgJiYgKF9mZiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmYgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZnID4gNjMpICYmIChfZmcgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZnIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maCA+IDYzKSAmJiAoX2ZoIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maCAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmkgPiA2MykgJiYgKF9maSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmkgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZqID4gNjMpICYmIChfZmogPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZqIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mayA+IDYzKSAmJiAoX2ZrIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mayAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmwgPiA2MykgJiYgKF9mbCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmwgLSA2NCkpIDogKHU2NF90KSAwKSkpfQorCisjZWxzZQorCisjZGVmaW5lIEJNKF9mYSwgX2ZiLCBfZmMsIF9mZCwgX2ZlLCBfZmYsIF9mZywgX2ZoLCBfZmksIF9maiwgX2ZrLCBfZmwpIFwKKyAgICAgIHsoKCgoX2ZhID49IDApICYmIChfZmEgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmEmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmIgPj0gMCkgJiYgKF9mYiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYiYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mYyA+PSAwKSAmJiAoX2ZjIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZjJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZkID49IDApICYmIChfZmQgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmQmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmUgPj0gMCkgJiYgKF9mZSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZiA+PSAwKSAmJiAoX2ZmIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZmJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZnID49IDApICYmIChfZmcgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmcmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmggPj0gMCkgJiYgKF9maCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maCYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maSA+PSAwKSAmJiAoX2ZpIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZqID49IDApICYmIChfZmogPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmomMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmsgPj0gMCkgJiYgKF9mayA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mayYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mbCA+PSAwKSAmJiAoX2ZsIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZsJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJICAgICAgICgoKChfZmEgPiA2MykgJiYgKF9mYSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZhIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mYiA+IDYzKSAmJiAoX2ZiIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmIgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZjID4gNjMpICYmIChfZmMgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mYyAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmQgPiA2MykgJiYgKF9mZCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZkIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZSA+IDYzKSAmJiAoX2ZlIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmUgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZmID4gNjMpICYmIChfZmYgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZiAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmcgPiA2MykgJiYgKF9mZyA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZnIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maCA+IDYzKSAmJiAoX2ZoIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmggLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZpID4gNjMpICYmIChfZmkgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9maSAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmogPiA2MykgJiYgKF9maiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZqIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mayA+IDYzKSAmJiAoX2ZrIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmsgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZsID4gNjMpICYmIChfZmwgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mbCAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApKSl9CisKKyNlbmRpZgorCisvKiBNYXNrIHRvIGNoZWNrIHdoZXRoZXIgYSBkb21haW4gaXMgYSBtdWx0aWRvbWFpbiBvciBhIHNpbmdsZQorICAgZG9tYWluICovCisKKyNkZWZpbmUgTVVMVElfRE9NQUlOX01BU0sgMHhGRjAwCisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmUgdGhlIGJpdCBtYXNrcyBmb3IgZGlmZmVyZW50IHBhc3NpdmUgc2NhbgorICogY2FwYWJpbGl0eS9yZXF1aXJlbWVudHMgcGVyIHJlZ2RvbWFpbi4KKyAqLworI2RlZmluZQlOT19QU0NBTgkweDBVTEwKKyNkZWZpbmUJUFNDQU5fRkNDCTB4MDAwMDAwMDAwMDAwMDAwMVVMTAorI2RlZmluZQlQU0NBTl9GQ0NfVAkweDAwMDAwMDAwMDAwMDAwMDJVTEwKKyNkZWZpbmUJUFNDQU5fRVRTSQkweDAwMDAwMDAwMDAwMDAwMDRVTEwKKyNkZWZpbmUJUFNDQU5fTUtLMQkweDAwMDAwMDAwMDAwMDAwMDhVTEwKKyNkZWZpbmUJUFNDQU5fTUtLMgkweDAwMDAwMDAwMDAwMDAwMTBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQQkweDAwMDAwMDAwMDAwMDAwMjBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQV9HCTB4MDAwMDAwMDAwMDAwMDA0MFVMTAorI2RlZmluZQlQU0NBTl9FVFNJQQkweDAwMDAwMDAwMDAwMDAwODBVTEwKKyNkZWZpbmUJUFNDQU5fRVRTSUIJMHgwMDAwMDAwMDAwMDAwMTAwVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0lDCTB4MDAwMDAwMDAwMDAwMDIwMFVMTAorI2RlZmluZQlQU0NBTl9XV1IJMHgwMDAwMDAwMDAwMDAwNDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0ExCTB4MDAwMDAwMDAwMDAwMDgwMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBMV9HCTB4MDAwMDAwMDAwMDAwMTAwMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBMgkweDAwMDAwMDAwMDAwMDIwMDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTJfRwkweDAwMDAwMDAwMDAwMDQwMDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLMwkweDAwMDAwMDAwMDAwMDgwMDBVTEwKKyNkZWZpbmUJUFNDQU5fREVGRVIJMHg3RkZGRkZGRkZGRkZGRkZGVUxMCisjZGVmaW5lCUlTX0VDTV9DSEFOCTB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCisvKgorICogVEhFIGZvbGxvd2luZyB0YWJsZSBpcyB0aGUgbWFwcGluZyBvZiByZWdkb21haW4gcGFpcnMgc3BlY2lmaWVkIGJ5CisgKiBhbiA4IGJpdCByZWdkb21haW4gdmFsdWUgdG8gdGhlIGluZGl2aWR1YWwgdW5pdGFyeSByZWcgZG9tYWlucworICovCisKK3R5cGVkZWYgc3RydWN0IHJlZ19kbW5fcGFpcl9tYXBwaW5nIHsKKwl1MTZfdCByZWdEbW5FbnVtOwkvKiAxNiBiaXQgcmVnIGRvbWFpbiBwYWlyICovCisJdTE2X3QgcmVnRG1uNUdIejsJLyogNUdIeiByZWcgZG9tYWluICovCisJdTE2X3QgcmVnRG1uMkdIejsJLyogMkdIeiByZWcgZG9tYWluICovCisJdTMyX3QgZmxhZ3M1R0h6OwkJLyogUmVxdWlyZW1lbnRzIGZsYWdzIChBZEhvYworCQkJCQkgICBkaXNhbGxvdywgbm9pc2UgZmxvb3IgY2FsIG5lZWRlZCwKKwkJCQkJICAgZXRjKSAqLworCXUzMl90IGZsYWdzMkdIejsJCS8qIFJlcXVpcmVtZW50cyBmbGFncyAoQWRIb2MKKwkJCQkJICAgZGlzYWxsb3csIG5vaXNlIGZsb29yIGNhbCBuZWVkZWQsCisJCQkJCSAgIGV0YykgKi8KKwl1NjRfdCBwc2Nhbk1hc2s7CQkvKiBQYXNzaXZlIFNjYW4gZmxhZ3Mgd2hpY2gKKwkJCQkJICAgY2FuIG92ZXJyaWRlIHVuaXRhcnkgZG9tYWluCisJCQkJCSAgIHBhc3NpdmUgc2NhbiBmbGFncy4gIFRoaXMKKwkJCQkJICAgdmFsdWUgaXMgdXNlZCBhcyBhIG1hc2sgb24KKwkJCQkJICAgdGhlIHVuaXRhcnkgZmxhZ3MqLworCXUxNl90IHNpbmdsZUNDOwkJLyogQ291bnRyeSBjb2RlIG9mIHNpbmdsZSBjb3VudHJ5IGlmCisJCQkJCSAgIGEgb25lLW9uLW9uZSBtYXBwaW5nIGV4aXN0cyAqLworfSAgUkVHX0RNTl9QQUlSX01BUFBJTkc7CisKK3N0YXRpYyBSRUdfRE1OX1BBSVJfTUFQUElORyByZWdEb21haW5QYWlyc1tdID0geworCXtOT19FTlVNUkQsCSAgICBGQ0MyLAlERUJVR19SRUdfRE1OLCAgTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe05VTEwxX1dPUkxELAlOVUxMMSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe05VTEwxX0VUU0lCLAlOVUxMMSwJCUVUU0lCLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe05VTEwxX0VUU0lDLAlOVUxMMSwJCUVUU0lDLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7RkNDMl9GQ0NBLCAgICAgRkNDMiwJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDMl9XT1JMRCwgICAgRkNDMiwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzJfRVRTSUMsCUZDQzIsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MzX0ZDQ0EsICAgICBGQ0MzLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MzX1dPUkxELCAgICBGQ0MzLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDNF9GQ0NBLCAgICAgRkNDNCwJCUZDQ0EsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M1X0ZDQ0EsICAgICBGQ0M1LAkJRkNDQSwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzZfRkNDQSwgICAgIEZDQzYsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzZfV09STEQsICAgIEZDQzYsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0VUU0kxX1dPUkxELAlFVFNJMSwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTJfV09STEQsCUVUU0kyLAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJM19XT1JMRCwJRVRTSTMsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0k0X1dPUkxELAlFVFNJNCwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTVfV09STEQsCUVUU0k1LAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJNl9XT1JMRCwJRVRTSTYsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7RVRTSTNfRVRTSUEsCUVUU0kzLAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGUkFOQ0VfUkVTLAlFVFNJMywJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7RkNDMV9XT1JMRCwJRkNDMSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzFfRkNDQSwgICAgIEZDQzEsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDFfV09STEQsCUFQTDEsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX1dPUkxELAlBUEwyLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMM19XT1JMRCwJQVBMMywJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDRfV09STEQsCUFQTDQsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw1X1dPUkxELAlBUEw1LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMNl9XT1JMRCwJQVBMNiwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDhfV09STEQsCUFQTDgsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw5X1dPUkxELAlBUEw5LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtBUEwzX0ZDQ0EsICAgICBBUEwzLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwxX0VUU0lDLAlBUEwxLAkJRVRTSUMsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMl9FVFNJQywJQVBMMiwJCUVUU0lDLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDJfRkNDQSwJCUFQTDIsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDJfQVBMRCwgICAgIEFQTDIsCQlBUExELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwfSwKKwl7QVBMN19GQ0NBLAkJQVBMNywJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtNS0sxX01LS0EsICAgICBNS0sxLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQSwgQ1RSWV9KQVBBTiB9LAorCXtNS0sxX01LS0IsICAgICBNS0sxLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjEgfSwKKwl7TUtLMV9GQ0NBLCAgICAgTUtLMSwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjIgfSwKKwl7TUtLMV9NS0tBMSwgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjQgfSwKKwl7TUtLMV9NS0tBMiwgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjUgfSwKKwl7TUtLMV9NS0tDLCAgICAgTUtLMSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjYgfSwKKworCS8qIE1LSzIgKi8KKwl7TUtLMl9NS0tBLCAgICAgTUtLMiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMiB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4zIH0sCisKKwkvKiBNS0szICovCisJe01LSzNfTUtLQSwgICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMjUgfSwKKwl7TUtLM19NS0tCLCAgICAgTUtLMywJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjcgfSwKKwl7TUtLM19NS0tBMSwgICAgTUtLMywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMjYgfSwKKwl7TUtLM19NS0tBMiwgICAgTUtLMywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOOCB9LAorCXtNS0szX01LS0MsICAgICBNS0szLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjkgfSwKKwl7TUtLM19GQ0NBLCAgICAgTUtLMywJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4yNyB9LAorCisJLyogTUtLNCAqLworCXtNS0s0X01LS0IsICAgICBNS0s0LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjEwIH0sCisJe01LSzRfTUtLQTEsICAgIE1LSzQsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4yOCB9LAorCXtNS0s0X01LS0EyLCAgICBNS0s0LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szIHxQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4xMSB9LAorCXtNS0s0X01LS0MsICAgICBNS0s0LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szLCBDVFJZX0pBUEFOMTIgfSwKKwl7TUtLNF9GQ0NBLCAgICAgTUtLNCwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4yOSB9LAorCXtNS0s0X01LS0EsICAgICBNS0s0LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSwgQ1RSWV9KQVBBTjM2IH0sCisKKwkvKiBNS0s1ICovCisJe01LSzVfTUtLQiwgICAgIE1LSzUsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTMgfSwKKwl7TUtLNV9NS0tBMiwgICAgTUtLNSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjE0IH0sCisJe01LSzVfTUtLQywgICAgIE1LSzUsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMsIENUUllfSkFQQU4xNSB9LAorCisJLyogTUtLNiAqLworCXtNS0s2X01LS0IsICAgICBNS0s2LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjE2IH0sCisJe01LSzZfTUtLQTIsICAgIE1LSzYsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4xNyB9LAorCXtNS0s2X01LS0MsICAgICBNS0s2LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxLCBDVFJZX0pBUEFOMTggfSwKKwl7TUtLNl9NS0tBMSwgICAgTUtLNiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMzAgfSwKKwl7TUtLNl9GQ0NBLCAgICAgTUtLNiwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zMSB9LAorCisJLyogTUtLNyAqLworCXtNS0s3X01LS0IsICAgICBNS0s3LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xOSB9LAorCXtNS0s3X01LS0EsICAgICBNS0s3LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjIwIH0sCisJe01LSzdfTUtLQywgICAgIE1LSzcsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szLCBDVFJZX0pBUEFOMjEgfSwKKwl7TUtLN19NS0tBMSwgICAgTUtLNywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMzIgfSwKKwl7TUtLN19GQ0NBLCAgICAgTUtLNywJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zMyB9LAorCisJLyogTUtLOCAqLworCXtNS0s4X01LS0IsICAgICBNS0s4LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4yMiB9LAorCXtNS0s4X01LS0EyLCAgICBNS0s4LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjIzIH0sCisJe01LSzhfTUtLQywgICAgIE1LSzgsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szICwgQ1RSWV9KQVBBTjI0IH0sCisKKyAgIAkvKiBNS0s5ICovCisJe01LSzlfTUtLQSwgICAgIE1LSzksCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzQgfSwKKwl7TUtLOV9GQ0NBLCAgICAgTUtLOSwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zNyB9LAorCXtNS0s5X01LS0ExLCAgICBNS0s5LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU4zOCB9LAorCXtNS0s5X01LS0MsICAgICBNS0s5LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjM5IH0sCisJe01LSzlfTUtLQTIsCU1LSzksCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONDAgfSwKKworCS8qIE1LSzEwICovCisJe01LSzEwX01LS0EsCU1LSzEwLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjM1IH0sCisJe01LSzEwX0ZDQ0EsCU1LSzEwLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQxIH0sCisJe01LSzEwX01LS0ExLAlNS0sxMCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONDIgfSwKKwl7TUtLMTBfTUtLQywJTUtLMTAsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDMgfSwKKwl7TUtLMTBfTUtLQTIsCU1LSzEwLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjQ0IH0sCisKKwkvKiBNS0sxMSAqLworCXtNS0sxMV9NS0tBLAlNS0sxMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40NSB9LAorCXtNS0sxMV9GQ0NBLAlNS0sxMSwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40NiB9LAorCXtNS0sxMV9NS0tBMSwJTUtLMTEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjQ3IH0sCisJe01LSzExX01LS0MsCU1LSzExLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQ4IH0sCisJe01LSzExX01LS0EyLAlNS0sxMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40OSB9LAorCisJLyogTUtLMTIgKi8KKwl7TUtLMTJfTUtLQSwJTUtLMTIsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONTAgfSwKKwl7TUtLMTJfRkNDQSwJTUtLMTIsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONTEgfSwKKwl7TUtLMTJfTUtLQTEsCU1LSzEyLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU41MiB9LAorCXtNS0sxMl9NS0tDLAlNS0sxMiwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU41MyB9LAorCXtNS0sxMl9NS0tBMiwJTUtLMTIsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONTQgfSwKKworCisJLyogVGhlc2UgYXJlIHN1cGVyIGRvbWFpbnMgKi8KKwl7V09SMF9XT1JMRCwJV09SMF9XT1JMRCwJV09SMF9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjFfV09STEQsCVdPUjFfV09STEQsCVdPUjFfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjJfV09STEQsCVdPUjJfV09STEQsCVdPUjJfV09STEQsCURJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjNfV09STEQsCVdPUjNfV09STEQsCVdPUjNfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1I0X1dPUkxELAlXT1I0X1dPUkxELAlXT1I0X1dPUkxELAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1I1X0VUU0lDLAlXT1I1X0VUU0lDLAlXT1I1X0VUU0lDLAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IwMV9XT1JMRCwJV09SMDFfV09STEQsCVdPUjAxX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SMDJfV09STEQsCVdPUjAyX1dPUkxELAlXT1IwMl9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VVMV9XT1JMRCwJICAgIEVVMV9XT1JMRCwJRVUxX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SOV9XT1JMRCwJV09SOV9XT1JMRCwJV09SOV9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SQV9XT1JMRCwJV09SQV9XT1JMRCwJV09SQV9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBtYXN0ZXIgbGlzdCBmb3IgYWxsIGRpZmZlcmVudCBmcmVxZXVuY3kKKyAqIGJhbmRzIHdpdGggdGhlIGNvbXBsZXRlIG1hdHJpeCBvZiBhbGwgcG9zc2libGUgZmxhZ3MgYW5kIHNldHRpbmdzCisgKiBmb3IgZWFjaCBiYW5kIGlmIGl0IGlzIHVzZWQgaW4gQU5ZIHJlZyBkb21haW4uCisgKi8KKworI2RlZmluZSBERUZfUkVHRE1OCQlGQ0MxX0ZDQ0EKKyNkZWZpbmUJREVGX0RNTl81CQlGQ0MxCisjZGVmaW5lCURFRl9ETU5fMgkJRkNDQQorI2RlZmluZQlDT1VOVFJZX0VSRF9GTEFHICAgICAgICAweDgwMDAKKyNkZWZpbmUgV09STERXSURFX1JPQU1JTkdfRkxBRyAgMHg0MDAwCisjZGVmaW5lCVNVUEVSX0RPTUFJTl9NQVNLCTB4MGZmZgorI2RlZmluZQlDT1VOVFJZX0NPREVfTUFTSwkweDAzZmYKKyNkZWZpbmUgQ0ZfSU5URVJGRVJFTkNFCQkoQ0hBTk5FTF9DV19JTlQgfCBDSEFOTkVMX1JBREFSX0lOVCkKKyNkZWZpbmUgQ0hBTk5FTF8xNAkJKDI0ODQpCS8qIDgwMi4xMWcgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgb24gY2hhbm5lbCAxNCAqLworI2RlZmluZSBJU18xMUdfQ0gxNChfY2gsX2NmKSBcCisJKCgoX2NoKSA9PSBDSEFOTkVMXzE0KSAmJiAoKF9jZikgPT0gQ0hBTk5FTF9HKSkKKworI2RlZmluZQlZRVMJVFJVRQorI2RlZmluZQlOTwlGQUxTRQorCitlbnVtIHsKKwlDVFJZX0RFQlVHCT0gMHgxZmYsCQkvKiBkZWJ1ZyBjb3VudHJ5IGNvZGUgKi8KKwlDVFJZX0RFRkFVTFQJPSAwCQkJLyogZGVmYXVsdCBjb3VudHJ5IGNvZGUgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlIQUxfQ1RSWV9DT0RFCWNvdW50cnlDb2RlOworCUhBTF9SRUdfRE9NQUlOCXJlZ0RtbkVudW07CisJY29uc3QgY2hhcioJCWlzb05hbWU7CisJY29uc3QgY2hhcioJCW5hbWU7CisJSEFMX0JPT0wJCWFsbG93MTFnOworCUhBTF9CT09MCQlhbGxvdzExYVR1cmJvOworCUhBTF9CT09MCQlhbGxvdzExZ1R1cmJvOworICAgIEhBTF9CT09MICAgICAgICBhbGxvdzExbmE7ICAgICAgLyogSFQtNDAgYWxsb3dlZCBpbiA1R0h6PyAqLworICAgIEhBTF9CT09MICAgICAgICBhbGxvdzExbmc7ICAgICAgLyogSFQtNDAgYWxsb3dlZCBpbiAyR0h6PyAqLworCXUxNl90CQlvdXRkb29yQ2hhblN0YXJ0OworfSBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRDsKKworc3RhdGljIENPVU5UUllfQ09ERV9UT19FTlVNX1JEIGFsbENvdW50cmllc1tdID0geworICAgIHtDVFJZX0RFQlVHLCAgICAgICBOT19FTlVNUkQsICAgICAiREIiLCAiREVCVUciLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0RFRkFVTFQsICAgICBERUZfUkVHRE1OLCAgICAiTkEiLCAiTk9fQ09VTlRSWV9TRVQiLCBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FMQkFOSUEsICAgICBOVUxMMV9XT1JMRCwgICAiQUwiLCAiQUxCQU5JQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FMR0VSSUEsICAgICBOVUxMMV9XT1JMRCwgICAiRFoiLCAiQUxHRVJJQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FSR0VOVElOQSwgICBBUEwzX1dPUkxELCAgICAiQVIiLCAiQVJHRU5USU5BIiwgICAgICBZRVMsIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0FSTUVOSUEsICAgICBFVFNJNF9XT1JMRCwgICAiQU0iLCAiQVJNRU5JQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FVU1RSQUxJQSwgICBGQ0M2X1dPUkxELCAgICAiQVUiLCAiQVVTVFJBTElBIiwgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FVU1RSSUEsICAgICBFVFNJMl9XT1JMRCwgICAiQVQiLCAiQVVTVFJJQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0FaRVJCQUlKQU4sICBFVFNJNF9XT1JMRCwgICAiQVoiLCAiQVpFUkJBSUpBTiIsICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JBSFJBSU4sICAgICBBUEw2X1dPUkxELCAgICAiQkgiLCAiQkFIUkFJTiIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JFTEFSVVMsICAgICBFVFNJMV9XT1JMRCwgICAiQlkiLCAiQkVMQVJVUyIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JFTEdJVU0sICAgICBFVFNJMV9XT1JMRCwgICAiQkUiLCAiQkVMR0lVTSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JFTElaRSwgICAgICBBUEwxX0VUU0lDLCAgICAiQloiLCAiQkVMSVpFIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JPTElWSUEsICAgICBBUEwxX0VUU0lDLCAgICAiQk8iLCAiQk9MVklBIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JSQVpJTCwgICAgICBGQ0MzX1dPUkxELCAgICAiQlIiLCAiQlJBWklMIiwgICAgICAgICBOTywgIE5PLCAgTk8sICBOTywgIE5PLCAgNzAwMCB9LAorICAgIHtDVFJZX0JSVU5FSV9EQVJVU1NBTEFNLEFQTDFfV09STEQsIkJOIiwgIkJSVU5FSSBEQVJVU1NBTEFNIiwgWUVTLCBZRVMsIFlFUywgIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQlVMR0FSSUEsICAgIEVUU0k2X1dPUkxELCAgICJCRyIsICJCVUxHQVJJQSIsICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ0FOQURBLCAgICAgIEZDQzZfRkNDQSwgICAgICJDQSIsICJDQU5BREEiLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ0hJTEUsICAgICAgIEFQTDZfV09STEQsICAgICJDTCIsICJDSElMRSIsICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ0hJTkEsICAgICAgIEFQTDFfV09STEQsICAgICJDTiIsICJDSElOQSIsICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ09MT01CSUEsICAgIEZDQzFfRkNDQSwgICAgICJDTyIsICJDT0xPTUJJQSIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ09TVEFfUklDQSwgIEZDQzFfV09STEQsICAgICJDUiIsICJDT1NUQSBSSUNBIiwgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ1JPQVRJQSwgICAgIEVUU0kzX1dPUkxELCAgICJIUiIsICJDUk9BVElBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ1lQUlVTLCAgICAgIEVUU0kzX1dPUkxELCAgICJDWSIsICJDWVBSVVMiLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfQ1pFQ0gsICAgICAgIEVUU0kzX1dPUkxELCAgICJDWiIsICJDWkVDSCBSRVBVQkxJQyIsIFlFUywgTk8sIFlFUywgIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfREVOTUFSSywgICAgIEVUU0kxX1dPUkxELCAgICJESyIsICJERU5NQVJLIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRE9NSU5JQ0FOX1JFUFVCTElDLEZDQzFfRkNDQSwiRE8iLCAiRE9NSU5JQ0FOIFJFUFVCTElDIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9FQ1VBRE9SLCAgICAgRkNDMV9XT1JMRCwgICAgIkVDIiwgIkVDVUFET1IiLCAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9FR1lQVCwgICAgICAgRVRTSTNfV09STEQsICAgIkVHIiwgIkVHWVBUIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9FTF9TQUxWQURPUiwgRkNDMV9XT1JMRCwgICAgIlNWIiwgIkVMIFNBTFZBRE9SIiwgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9FU1RPTklBLCAgICAgRVRTSTFfV09STEQsICAgIkVFIiwgIkVTVE9OSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9GSU5MQU5ELCAgICAgRVRTSTFfV09STEQsICAgIkZJIiwgIkZJTkxBTkQiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9GUkFOQ0UsICAgICAgRVRTSTFfV09STEQsICAgIkZSIiwgIkZSQU5DRSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9GUkFOQ0UyLCAgICAgRVRTSTNfV09STEQsICAgIkYyIiwgIkZSQU5DRV9SRVMiLCAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9HRU9SR0lBLCAgICAgRVRTSTRfV09STEQsICAgIkdFIiwgIkdFT1JHSUEiLCAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9HRVJNQU5ZLCAgICAgRVRTSTFfV09STEQsICAgIkRFIiwgIkdFUk1BTlkiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9HUkVFQ0UsICAgICAgRVRTSTFfV09STEQsICAgIkdSIiwgIkdSRUVDRSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9HVUFURU1BTEEsICAgRkNDMV9GQ0NBLCAgICAgIkdUIiwgIkdVQVRFTUFMQSIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9IT05EVVJBUywgICAgTlVMTDFfV09STEQsICAgIkhOIiwgIkhPTkRVUkFTIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9IT05HX0tPTkcsICAgRkNDMl9XT1JMRCwgICAgIkhLIiwgIkhPTkcgS09ORyIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9IVU5HQVJZLCAgICAgRVRTSTRfV09STEQsICAgIkhVIiwgIkhVTkdBUlkiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JQ0VMQU5ELCAgICAgRVRTSTFfV09STEQsICAgIklTIiwgIklDRUxBTkQiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JTkRJQSwgICAgICAgQVBMNl9XT1JMRCwgICAgIklOIiwgIklORElBIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JTkRPTkVTSUEsICAgQVBMMV9XT1JMRCwgICAgIklEIiwgIklORE9ORVNJQSIsICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JUkFOLCAgICAgICAgQVBMMV9XT1JMRCwgICAgIklSIiwgIklSQU4iLCAgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JUkVMQU5ELCAgICAgRVRTSTFfV09STEQsICAgIklFIiwgIklSRUxBTkQiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JU1JBRUwsICAgICAgRVRTSTNfV09STEQsICAgIklMIiwgIklTUkFFTCIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JU1JBRUwyLCAgICAgTlVMTDFfRVRTSUIsICAgIklTUiIsIklTUkFFTF9SRVMiLCAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9JVEFMWSwgICAgICAgRVRTSTFfV09STEQsICAgIklUIiwgIklUQUxZIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9KQU1BSUNBLCAgICAgRVRTSTFfV09STEQsICAgIkpNIiwgIkpBTUFJQ0EiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTiwgICAgICAgTUtLMV9NS0tBLCAgICAgIkpQIiwgIkpBUEFOIiwgICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjEsICAgICAgTUtLMV9NS0tCLCAgICAgIkoxIiwgIkpBUEFOMSIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjIsICAgICAgTUtLMV9GQ0NBLCAgICAgIkoyIiwgIkpBUEFOMiIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjMsICAgICAgTUtLMl9NS0tBLCAgICAgIkozIiwgIkpBUEFOMyIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQsICAgICAgTUtLMV9NS0tBMSwgICAgIko0IiwgIkpBUEFONCIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjUsICAgICAgTUtLMV9NS0tBMiwgICAgIko1IiwgIkpBUEFONSIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjYsICAgICAgTUtLMV9NS0tDLCAgICAgIko2IiwgIkpBUEFONiIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjcsICAgICAgTUtLM19NS0tCLCAgICAgIko3IiwgIkpBUEFONyIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjgsICAgICAgTUtLM19NS0tBMiwgICAgIko4IiwgIkpBUEFOOCIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjksICAgICAgTUtLM19NS0tDLCAgICAgIko5IiwgIkpBUEFOOSIsICAgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjEwLCAgICAgTUtLNF9NS0tCLCAgICAgIkoxMCIsICJKQVBBTjEwIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjExLCAgICAgTUtLNF9NS0tBMiwgICAgIkoxMSIsICJKQVBBTjExIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjEyLCAgICAgTUtLNF9NS0tDLCAgICAgIkoxMiIsICJKQVBBTjEyIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjEzLCAgICAgTUtLNV9NS0tCLCAgICAgIkoxMyIsICJKQVBBTjEzIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE0LCAgICAgTUtLNV9NS0tBMiwgICAgIkoxNCIsICJKQVBBTjE0IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE1LCAgICAgTUtLNV9NS0tDLCAgICAgIkoxNSIsICJKQVBBTjE1IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE2LCAgICAgTUtLNl9NS0tCLCAgICAgIkoxNiIsICJKQVBBTjE2IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE3LCAgICAgTUtLNl9NS0tBMiwgICAgIkoxNyIsICJKQVBBTjE3IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE4LCAgICAgTUtLNl9NS0tDLCAgICAgIkoxOCIsICJKQVBBTjE4IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjE5LCAgICAgTUtLN19NS0tCLCAgICAgIkoxOSIsICJKQVBBTjE5IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjIwLCAgICAgTUtLN19NS0tBLCAgICAgIkoyMCIsICJKQVBBTjIwIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjIxLCAgICAgTUtLN19NS0tDLCAgICAgIkoyMSIsICJKQVBBTjIxIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjIyLCAgICAgTUtLOF9NS0tCLCAgICAgIkoyMiIsICJKQVBBTjIyIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjIzLCAgICAgTUtLOF9NS0tBMiwgICAgIkoyMyIsICJKQVBBTjIzIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI0LCAgICAgTUtLOF9NS0tDLCAgICAgIkoyNCIsICJKQVBBTjI0IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI1LCAgICAgTUtLM19NS0tBLCAgICAgIkoyNSIsICJKQVBBTjI1IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI2LCAgICAgTUtLM19NS0tBMSwgICAgIkoyNiIsICJKQVBBTjI2IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI3LCAgICAgTUtLM19GQ0NBLCAgICAgIkoyNyIsICJKQVBBTjI3IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI4LCAgICAgTUtLNF9NS0tBMSwgICAgIkoyOCIsICJKQVBBTjI4IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjI5LCAgICAgTUtLNF9GQ0NBLCAgICAgIkoyOSIsICJKQVBBTjI5IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjMwLCAgICAgTUtLNl9NS0tBMSwgICAgIkozMCIsICJKQVBBTjMwIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjMxLCAgICAgTUtLNl9GQ0NBLCAgICAgIkozMSIsICJKQVBBTjMxIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjMyLCAgICAgTUtLN19NS0tBMSwgICAgIkozMiIsICJKQVBBTjMyIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjMzLCAgICAgTUtLN19GQ0NBLCAgICAgIkozMyIsICJKQVBBTjMzIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM0LCAgICAgTUtLOV9NS0tBLCAgICAgIkozNCIsICJKQVBBTjM0IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM1LCAgICAgTUtLMTBfTUtLQSwgICAgIkozNSIsICJKQVBBTjM1IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM2LCAgICAgTUtLNF9NS0tBLCAgICAgIkozNiIsICJKQVBBTjM2IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM3LCAgICAgTUtLOV9GQ0NBLCAgICAgIkozNyIsICJKQVBBTjM3IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM4LCAgICAgTUtLOV9NS0tBMSwgICAgIkozOCIsICJKQVBBTjM4IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjM5LCAgICAgTUtLOV9NS0tDLCAgICAgIkozOSIsICJKQVBBTjM5IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQwLCAgICAgTUtLMTBfTUtLQTIsICAgIko0MCIsICJKQVBBTjQwIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQxLCAgICAgTUtLMTBfRkNDQSwgICAgIko0MSIsICJKQVBBTjQxIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQyLCAgICAgTUtLMTBfTUtLQTEsICAgIko0MiIsICJKQVBBTjQyIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQzLCAgICAgTUtLMTBfTUtLQywgICAgIko0MyIsICJKQVBBTjQzIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ0LCAgICAgTUtLMTBfTUtLQTIsICAgIko0NCIsICJKQVBBTjQ0IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ1LCAgICAgTUtLMTFfTUtLQSwgICAgIko0NSIsICJKQVBBTjQ1IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ2LCAgICAgTUtLMTFfRkNDQSwgICAgIko0NiIsICJKQVBBTjQ2IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ3LCAgICAgTUtLMTFfTUtLQTEsICAgIko0NyIsICJKQVBBTjQ3IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ4LCAgICAgTUtLMTFfTUtLQywgICAgIko0OCIsICJKQVBBTjQ4IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjQ5LCAgICAgTUtLMTFfTUtLQTIsICAgIko0OSIsICJKQVBBTjQ5IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjUwLCAgICAgTUtLMTJfTUtLQSwgICAgIko1MCIsICJKQVBBTjUwIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjUxLCAgICAgTUtLMTJfRkNDQSwgICAgIko1MSIsICJKQVBBTjUxIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjUyLCAgICAgTUtLMTJfTUtLQTEsICAgIko1MiIsICJKQVBBTjUyIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjUzLCAgICAgTUtLMTJfTUtLQywgICAgIko1MyIsICJKQVBBTjUzIiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KQVBBTjU0LCAgICAgTUtLMTJfTUtLQTIsICAgIko1NCIsICJKQVBBTjU0IiwgICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9KT1JEQU4sICAgICAgRVRTSTJfV09STEQsICAgIkpPIiwgIkpPUkRBTiIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9LQVpBS0hTVEFOLCAgTlVMTDFfV09STEQsICAgIktaIiwgIktBWkFLSFNUQU4iLCAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9LT1JFQV9OT1JUSCwgQVBMOV9XT1JMRCwgICAgIktQIiwgIk5PUlRIIEtPUkVBIiwgICAgWUVTLCBOTywgIE5PLCAgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9LT1JFQV9ST0MsICAgQVBMOV9XT1JMRCwgICAgIktSIiwgIktPUkVBIFJFUFVCTElDIiwgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9LT1JFQV9ST0MyLCAgQVBMMl9BUExELCAgICAgIksyIiwgIktPUkVBIFJFUFVCTElDMiIsWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9LT1JFQV9ST0MzLCAgQVBMOV9XT1JMRCwgICAgIkszIiwgIktPUkVBIFJFUFVCTElDMyIsWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9LVVdBSVQsICAgICAgTlVMTDFfV09STEQsICAgIktXIiwgIktVV0FJVCIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9MQVRWSUEsICAgICAgRVRTSTFfV09STEQsICAgIkxWIiwgIkxBVFZJQSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9MRUJBTk9OLCAgICAgTlVMTDFfV09STEQsICAgIkxCIiwgIkxFQkFOT04iLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9MSUVDSFRFTlNURUlOLEVUU0kxX1dPUkxELCAgIkxJIiwgIkxJRUNIVEVOU1RFSU4iLCAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9MSVRIVUFOSUEsICAgRVRTSTFfV09STEQsICAgIkxUIiwgIkxJVEhVQU5JQSIsICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9MVVhFTUJPVVJHLCAgRVRTSTFfV09STEQsICAgIkxVIiwgIkxVWEVNQk9VUkciLCAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NQUNBVSwgICAgICAgRkNDMl9XT1JMRCwgICAgIk1PIiwgIk1BQ0FVIiwgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NQUNFRE9OSUEsICAgTlVMTDFfV09STEQsICAgIk1LIiwgIk1BQ0VET05JQSIsICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NQUxBWVNJQSwgICAgQVBMOF9XT1JMRCwgICAgIk1ZIiwgIk1BTEFZU0lBIiwgICAgICAgTk8sICBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9NQUxUQSwgICAgICAgRVRTSTFfV09STEQsICAgIk1UIiwgIk1BTFRBIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NRVhJQ08sICAgICAgRkNDMV9GQ0NBLCAgICAgIk1YIiwgIk1FWElDTyIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NT05BQ08sICAgICAgRVRTSTRfV09STEQsICAgIk1DIiwgIk1PTkFDTyIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9NT1JPQ0NPLCAgICAgTlVMTDFfV09STEQsICAgIk1BIiwgIk1PUk9DQ08iLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ORVRIRVJMQU5EUywgRVRTSTFfV09STEQsICAgIk5MIiwgIk5FVEhFUkxBTkRTIiwgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ORVRIRVJMQU5EU19BTlQsIEVUU0kxX1dPUkxELCAiQU4iLCAiTkVUSEVSTEFORFMtQU5USUxMRVMiLCBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX05FV19aRUFMQU5ELCBGQ0MyX0VUU0lDLCAgICAiTloiLCAiTkVXIFpFQUxBTkQiLCAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX05PUldBWSwgICAgICBFVFNJMV9XT1JMRCwgICAiTk8iLCAiTk9SV0FZIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX09NQU4sICAgICAgICBBUEw2X1dPUkxELCAgICAiT00iLCAiT01BTiIsICAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BBS0lTVEFOLCAgICBOVUxMMV9XT1JMRCwgICAiUEsiLCAiUEFLSVNUQU4iLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BBTkFNQSwgICAgICBGQ0MxX0ZDQ0EsICAgICAiUEEiLCAiUEFOQU1BIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BFUlUsICAgICAgICBBUEwxX1dPUkxELCAgICAiUEUiLCAiUEVSVSIsICAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BISUxJUFBJTkVTLCBBUEwxX1dPUkxELCAgICAiUEgiLCAiUEhJTElQUElORVMiLCAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BPTEFORCwgICAgICBFVFNJMV9XT1JMRCwgICAiUEwiLCAiUE9MQU5EIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BPUlRVR0FMLCAgICBFVFNJMV9XT1JMRCwgICAiUFQiLCAiUE9SVFVHQUwiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1BVRVJUT19SSUNPLCBGQ0MxX0ZDQ0EsICAgICAiUFIiLCAiUFVFUlRPIFJJQ08iLCAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1FBVEFSLCAgICAgICBOVUxMMV9XT1JMRCwgICAiUUEiLCAiUUFUQVIiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1JPTUFOSUEsICAgICBOVUxMMV9XT1JMRCwgICAiUk8iLCAiUk9NQU5JQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1JVU1NJQSwgICAgICBOVUxMMV9XT1JMRCwgICAiUlUiLCAiUlVTU0lBIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NBVURJX0FSQUJJQSxOVUxMMV9XT1JMRCwgICAiU0EiLCAiU0FVREkgQVJBQklBIiwgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NFUkJJQV9NT05ULCBFVFNJMV9XT1JMRCwgICAiQ1MiLCAiU0VSQklBICYgTU9OVEVORUdSTyIsIFlFUywgTk8sICBZRVMsIFlFUywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NJTkdBUE9SRSwgICBBUEw2X1dPUkxELCAgICAiU0ciLCAiU0lOR0FQT1JFIiwgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NMT1ZBS0lBLCAgICBFVFNJMV9XT1JMRCwgICAiU0siLCAiU0xPVkFLIFJFUFVCTElDIixZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NMT1ZFTklBLCAgICBFVFNJMV9XT1JMRCwgICAiU0kiLCAiU0xPVkVOSUEiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NPVVRIX0FGUklDQSxGQ0MzX1dPUkxELCAgICAiWkEiLCAiU09VVEggQUZSSUNBIiwgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NQQUlOLCAgICAgICBFVFNJMV9XT1JMRCwgICAiRVMiLCAiU1BBSU4iLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NSSUxBTktBLCAgICBGQ0MzX1dPUkxELCAgICAiTEsiLCAiU1JJIExBTktBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NXRURFTiwgICAgICBFVFNJMV9XT1JMRCwgICAiU0UiLCAiU1dFREVOIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NXSVRaRVJMQU5ELCBFVFNJMV9XT1JMRCwgICAiQ0giLCAiU1dJVFpFUkxBTkQiLCAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1NZUklBLCAgICAgICBOVUxMMV9XT1JMRCwgICAiU1kiLCAiU1lSSUEiLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1RBSVdBTiwgICAgICBBUEwzX0ZDQ0EsICAgICAiVFciLCAiVEFJV0FOIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1RIQUlMQU5ELCAgICBOVUxMMV9XT1JMRCwgICAiVEgiLCAiVEhBSUxBTkQiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1RSSU5JREFEX1lfVE9CQUdPLEVUU0k0X1dPUkxELCJUVCIsICJUUklOSURBRCAmIFRPQkFHTyIsIFlFUywgTk8sIFlFUywgTk8sIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1RVTklTSUEsICAgICBFVFNJM19XT1JMRCwgICAiVE4iLCAiVFVOSVNJQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1RVUktFWSwgICAgICBFVFNJM19XT1JMRCwgICAiVFIiLCAiVFVSS0VZIiwgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VLUkFJTkUsICAgICBOVUxMMV9XT1JMRCwgICAiVUEiLCAiVUtSQUlORSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VBRSwgICAgICAgICBOVUxMMV9XT1JMRCwgICAiQUUiLCAiVU5JVEVEIEFSQUIgRU1JUkFURVMiLCBZRVMsIE5PLCBZRVMsIE5PLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VTklURURfS0lOR0RPTSwgRVRTSTFfV09STEQsIkdCIiwgIlVOSVRFRCBLSU5HRE9NIiwgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VTklURURfU1RBVEVTLCBGQ0MzX0ZDQ0EsICAgIlVTIiwgIlVOSVRFRCBTVEFURVMiLCAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDU4MjUgfSwKKyAgICB7Q1RSWV9VTklURURfU1RBVEVTX0ZDQzQ5LCBGQ0M0X0ZDQ0EsICAgIlBTIiwgIlVOSVRFRCBTVEFURVMgKFBVQkxJQyBTQUZFVFkpIiwgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVVJVR1VBWSwgICAgIEZDQzFfV09STEQsICAgICJVWSIsICJVUlVHVUFZIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVVpCRUtJU1RBTiwgIEZDQzNfRkNDQSwgICAgICJVWiIsICJVWkJFS0lTVEFOIiwgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVkVORVpVRUxBLCAgIEFQTDJfRVRTSUMsICAgICJWRSIsICJWRU5FWlVFTEEiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVklFVF9OQU0sICAgIE5VTEwxX1dPUkxELCAgICJWTiIsICJWSUVUIE5BTSIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfWUVNRU4sICAgICAgIE5VTEwxX1dPUkxELCAgICJZRSIsICJZRU1FTiIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfWklNQkFCV0UsICAgIE5VTEwxX1dPUkxELCAgICJaVyIsICJaSU1CQUJXRSIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0KK307CisKK3R5cGVkZWYgc3RydWN0IFJlZ0RtbkZyZXFCYW5kIHsKKwl1MTZfdAlsb3dDaGFubmVsOwkvKiBMb3cgY2hhbm5lbCBjZW50ZXIgaW4gTUh6ICovCisJdTE2X3QJaGlnaENoYW5uZWw7CS8qIEhpZ2ggQ2hhbm5lbCBjZW50ZXIgaW4gTUh6ICovCisJdThfdAlwb3dlckRmczsJLyogTWF4IHBvd2VyIChkQm0pIGZvciBjaGFubmVsCisJCQkJCSAgIHJhbmdlIHdoZW4gdXNpbmcgREZTICovCisJdThfdAlhbnRlbm5hTWF4OwkvKiBNYXggYWxsb3dlZCBhbnRlbm5hIGdhaW4gKi8KKwl1OF90CWNoYW5uZWxCVzsJLyogQmFuZHdpZHRoIG9mIHRoZSBjaGFubmVsICovCisJdThfdAljaGFubmVsU2VwOwkvKiBDaGFubmVsIHNlcGFyYXRpb24gd2l0aGluCisJCQkJCSAgIHRoZSBiYW5kICovCisJdTY0X3QJdXNlRGZzOwkJLyogVXNlIERGUyBpbiB0aGUgUmVnRG9tYWluCisJCQkJCSAgIGlmIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldCAqLworCXU2NF90CXVzZVBhc3NTY2FuOwkvKiBVc2UgUGFzc2l2ZSBTY2FuIGluIHRoZSBSZWdEb21haW4KKwkJCQkJICAgaWYgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0ICovCisJdThfdAlyZWdDbGFzc0lkOwkvKiBSZWd1bGF0b3J5IGNsYXNzIGlkICovCisJdThfdAl1c2VFeHRDaGFuRGZzOwkvKiBSZWd1bGF0b3J5IGNsYXNzIGlkICovCit9IFJFR19ETU5fRlJFUV9CQU5EOworCisvKiBCaXQgbWFza3MgZm9yIERGUyBwZXIgcmVnZG9tYWluICovCisKK2VudW0geworCU5PX0RGUyAgID0gMHgwMDAwMDAwMDAwMDAwMDAwVUxMLAorCURGU19GQ0MzID0gMHgwMDAwMDAwMDAwMDAwMDAxVUxMLAorCURGU19FVFNJID0gMHgwMDAwMDAwMDAwMDAwMDAyVUxMLAorCURGU19NS0s0ID0gMHgwMDAwMDAwMDAwMDAwMDA0VUxMLAorfTsKKworLyogVGhlIHRhYmxlIG9mIGZyZXF1ZW5jeSBiYW5kcyBpcyBpbmRleGVkIGJ5IGEgYml0bWFzay4gIFRoZSBvcmRlcmluZworICogbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGVudW0gYmVsb3cuICBXaGVuIGFkZGluZyBhIG5ldworICogZnJlcXVlbmN5IGJhbmQsIGJlIHN1cmUgdG8gbWF0Y2ggdGhlIGxvY2F0aW9uIGluIHRoZSBlbnVtIHdpdGggdGhlCisgKiBjb21tZW50cworICovCisKKy8qCisgKiA1R0h6IDExQSBjaGFubmVsIHRhZ3MKKyAqLworCitlbnVtIHsKKwlGMV80OTE1XzQ5MjUsCisJRjFfNDkzNV80OTQ1LAorCUYxXzQ5MjBfNDk4MCwKKwlGMV80OTQyXzQ5ODcsCisJRjFfNDk0NV80OTg1LAorCUYxXzQ5NTBfNDk4MCwKKwlGMV81MDM1XzUwNDAsCisJRjFfNTA0MF81MDgwLAorCUYxXzUwNTVfNTA1NSwKKworCUYxXzUxMjBfNTI0MCwKKworCUYxXzUxNzBfNTIzMCwKKwlGMl81MTcwXzUyMzAsCisKKwlGMV81MTgwXzUyNDAsCisJRjJfNTE4MF81MjQwLAorCUYzXzUxODBfNTI0MCwKKwlGNF81MTgwXzUyNDAsCisJRjVfNTE4MF81MjQwLAorCUY2XzUxODBfNTI0MCwKKwlGN181MTgwXzUyNDAsCisKKwlGMV81MTgwXzUzMjAsCisKKwlGMV81MjQwXzUyODAsCisKKwlGMV81MjYwXzUyODAsCisKKwlGMV81MjYwXzUzMjAsCisJRjJfNTI2MF81MzIwLAorCUYzXzUyNjBfNTMyMCwKKwlGNF81MjYwXzUzMjAsCisJRjVfNTI2MF81MzIwLAorCUY2XzUyNjBfNTMyMCwKKwlGN181MjYwXzUzMjAsCisKKwlGMV81MjYwXzU3MDAsCisKKwlGMV81MjgwXzUzMjAsCisKKyAgICBGMV81NTAwXzU1ODAsCisKKwlGMV81NTAwXzU2MjAsCisKKwlGMV81NTAwXzU3MDAsCisJRjJfNTUwMF81NzAwLAorCUYzXzU1MDBfNTcwMCwKKwlGNF81NTAwXzU3MDAsCisKKyAgICBGMV81NjYwXzU3MDAsCisKKwlGMV81NzQ1XzU4MDUsCisJRjJfNTc0NV81ODA1LAorCUYzXzU3NDVfNTgwNSwKKworCUYxXzU3NDVfNTgyNSwKKwlGMl81NzQ1XzU4MjUsCisJRjNfNTc0NV81ODI1LAorCUY0XzU3NDVfNTgyNSwKKwlGNV81NzQ1XzU4MjUsCisJRjZfNTc0NV81ODI1LAorCisJVzFfNDkyMF80OTgwLAorCVcxXzUwNDBfNTA4MCwKKwlXMV81MTcwXzUyMzAsCisJVzFfNTE4MF81MjQwLAorCVcxXzUyNjBfNTMyMCwKKwlXMV81NzQ1XzU4MjUsCisJVzFfNTUwMF81NzAwLAorCVcyXzUyNjBfNTMyMCwKKyAgICAgICAgVzJfNTE4MF81MjQwLAorCVcyXzU4MjVfNTgyNSwKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW41R2h6RnJlcVtdID0geworCXsgNDkxNSwgNDkyNSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDE2LCAwIH0sCQkvKiBGMV80OTE1XzQ5MjUgKi8KKwl7IDQ5MzUsIDQ5NDUsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxNiwgMCB9LAkJLyogRjFfNDkzNV80OTQ1ICovCisJeyA0OTIwLCA0OTgwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzIsIDcsIDAgfSwJCS8qIEYxXzQ5MjBfNDk4MCAqLworCXsgNDk0MiwgNDk4NywgMjcsIDYsIDUsICA1LCBERlNfRkNDMywgUFNDQU5fRkNDLCAwLCAwIH0sCQkvKiBGMV80OTQyXzQ5ODcgKi8KKwl7IDQ5NDUsIDQ5ODUsIDMwLCA2LCAxMCwgNSwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJLyogRjFfNDk0NV80OTg1ICovCisJeyA0OTUwLCA0OTgwLCAzMywgNiwgMjAsIDUsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDAsIDAgfSwJCS8qIEYxXzQ5NTBfNDk4MCAqLworCXsgNTAzNSwgNTA0MCwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDEyLCAwIH0sCQkvKiBGMV81MDM1XzUwNDAgKi8KKwl7IDUwNDAsIDUwODAsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fTUtLMiwgMiwgMCB9LAkJLyogRjFfNTA0MF81MDgwICovCisJeyA1MDU1LCA1MDU1LCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTIsIDAgfSwJCS8qIEYxXzUwNTVfNTA1NSAqLworCisJeyA1MTIwLCA1MjQwLCA1LCAgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJLyogRjFfNTEyMF81MjQwICovCisKKwl7IDUxNzAsIDUyMzAsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzIsIDEsIDAgfSwJLyogRjFfNTE3MF81MjMwICovCisJeyA1MTcwLCA1MjMwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0syLCAxLCAwIH0sCS8qIEYyXzUxNzBfNTIzMCAqLworCisJeyA1MTgwLCA1MjQwLCAxNSwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAxNywgNiwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQywgMSwgMCB9LAkJCQkvKiBGMl81MTgwXzUyNDAgKi8KKwl7IDUxODAsIDUyNDAsIDE4LCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGM181MTgwXzUyNDAgKi8KKwl7IDUxODAsIDUyNDAsIDIwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGNF81MTgwXzUyNDAgKi8KKwl7IDUxODAsIDUyNDAsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGNV81MTgwXzUyNDAgKi8KKwl7IDUxODAsIDUyNDAsIDIzLCA2LCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fRkNDLCAwLCAwIH0sCQkJCS8qIEY2XzUxODBfNTI0MCAqLworICB7IDUxODAsIDUyNDAsIDIzLCA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAgfSwgICAgICAgICAgIC8qIEY3XzUxODBfNTI0MCAqLworCisJeyA1MTgwLCA1MzIwLCAyMCwgNiwgMjAsIDIwLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgMCwgMCB9LAkJCS8qIEYxXzUxODBfNTMyMCAqLworCisJeyA1MjQwLCA1MjgwLCAyMywgMCwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGMV81MjQwXzUyODAgKi8KKworCXsgNTI2MCwgNTI4MCwgMjMsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGMV81MjYwXzUyODAgKi8KKworCXsgNTI2MCwgNTMyMCwgMTgsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGMV81MjYwXzUzMjAgKi8KKworCXsgNTI2MCwgNTMyMCwgMjAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSB8IERGU19NS0s0LCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJIHwgUFNDQU5fTUtLMyAsIDAsIDAgfSwKKwkJCQkJCQkJCQkJLyogRjJfNTI2MF81MzIwICovCisKKwl7IDUyNjAsIDUzMjAsIDIwLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgMiwgMCB9LAkvKiBGM181MjYwXzUzMjAgKi8KKwl7IDUyNjAsIDUzMjAsIDIzLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgMiwgMCB9LAkvKiBGNF81MjYwXzUzMjAgKi8KKwl7IDUyNjAsIDUzMjAsIDIzLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgMCwgMCB9LAkvKiBGNV81MjYwXzUzMjAgKi8KKwl7IDUyNjAsIDUzMjAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjZfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAxNywgNiwgMjAsIDIwLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgMCwgMCB9LAkJCQkvKiBGN181MjYwXzUzMjAgKi8KKworCXsgNTI2MCwgNTcwMCwgNSwgIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDAgfSwJCS8qIEYxXzUyNjBfNTcwMCAqLworCisJeyA1MjgwLCA1MzIwLCAxNywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDAsIDAgfSwJLyogRjFfNTI4MF81MzIwICovCisKKyAgICB7IDU1MDAsIDU1ODAsIDIzLCA2LCAyMCwgMjAsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEYxXzU1MDBfNTU4MCAqLworCisJeyA1NTAwLCA1NjIwLCAzMCwgNiwgMjAsIDIwLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgMCwgMCB9LAkJCQkvKiBGMV81NTAwXzU2MjAgKi8KKworCXsgNTUwMCwgNTcwMCwgMjAsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCA0LCAwIH0sCQkvKiBGMV81NTAwXzU3MDAgKi8KKwl7IDU1MDAsIDU3MDAsIDI3LCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjJfNTUwMF81NzAwICovCisJeyA1NTAwLCA1NzAwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYzXzU1MDBfNTcwMCAqLworCXsgNTUwMCwgNTcwMCwgMjAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSB8IERGU19NS0s0LCBQU0NBTl9NS0szIHwgUFNDQU5fRkNDLCAwLCAwIH0sCisJCQkJCQkJCQkJCS8qIEY0XzU1MDBfNTcwMCAqLworCisgICAgeyA1NjYwLCA1NzAwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDLCAwfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGMV81NjYwXzU3MDAgKi8KKworCXsgNTc0NSwgNTgwNSwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGMV81NzQ1XzU4MDUgKi8KKwl7IDU3NDUsIDU4MDUsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjJfNTc0NV81ODA1ICovCisJeyA1NzQ1LCA1ODA1LCAzMCwgNiwgMjAsIDIwLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgMCwgMCB9LAkJCQkvKiBGM181NzQ1XzU4MDUgKi8KKwl7IDU3NDUsIDU4MjUsIDUsICA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjFfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAxNywgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYyXzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMjAsIDAsIDIwLCAyMCwgREZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYzXzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGNF81NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDMsIDAgfSwJCQkvKiBGNV81NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDMwLCA2LCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjZfNTc0NV81ODI1ICovCisKKwkvKgorCSAqIEJlbG93IGFyZSB0aGUgd29ybGQgcm9hbWluZyBjaGFubmVscworCSAqIEFsbCBXV1IgZG9tYWlucyBoYXZlIG5vIHBvd2VyIGxpbWl0LCBpbnN0ZWFkIHVzZSB0aGUgY2FyZCdzIENUTAorCSAqIG9yIG1heCBwb3dlciBzZXR0aW5ncy4KKwkgKi8KKwl7IDQ5MjAsIDQ5ODAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwIH0sCQkJCS8qIFcxXzQ5MjBfNDk4MCAqLworCXsgNTA0MCwgNTA4MCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDAgfSwJCQkJLyogVzFfNTA0MF81MDgwICovCisJeyA1MTcwLCA1MjMwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzUxNzBfNTIzMCAqLworCXsgNTE4MCwgNTI0MCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwIH0sCQkvKiBXMV81MTgwXzUyNDAgKi8KKwl7IDUyNjAsIDUzMjAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMCB9LAkJLyogVzFfNTI2MF81MzIwICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMCB9LAkJCQkvKiBXMV81NzQ1XzU4MjUgKi8KKwl7IDU1MDAsIDU3MDAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMCB9LAkJLyogVzFfNTUwMF81NzAwICovCisJeyA1MjYwLCA1MzIwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAgMCwgMCB9LAkJCQkvKiBXMl81MjYwXzUzMjAgKi8KKwl7IDUxODAsIDUyNDAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sICAwLCAwIH0sCQkJCS8qIFcyXzUxODBfNTI0MCAqLworCXsgNTgyNSwgNTgyNSwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDAgfSwJCQkJLyogVzJfNTgyNV81ODI1ICovCit9OworLyoKKyAqIDVHSHogVHVyYm8gKGR5bmFtaWMgJiBzdGF0aWMpIHRhZ3MKKyAqLworCitlbnVtIHsKKwlUMV81MTMwXzUyMTAsCisJVDFfNTI1MF81MzMwLAorCVQxXzUzNzBfNTQ5MCwKKwlUMV81NTMwXzU2NTAsCisKKwlUMV81MTUwXzUxOTAsCisJVDFfNTIzMF81MzEwLAorCVQxXzUzNTBfNTQ3MCwKKwlUMV81NTEwXzU2NzAsCisKKwlUMV81MjAwXzUyNDAsCisJVDJfNTIwMF81MjQwLAorCVQxXzUyMTBfNTIxMCwKKwlUMl81MjEwXzUyMTAsCisKKwlUMV81MjgwXzUyODAsCisJVDJfNTI4MF81MjgwLAorCVQxXzUyNTBfNTI1MCwKKwlUMV81MjkwXzUyOTAsCisJVDFfNTI1MF81MjkwLAorCVQyXzUyNTBfNTI5MCwKKworCVQxXzU1NDBfNTY2MCwKKwlUMV81NzYwXzU4MDAsCisJVDJfNTc2MF81ODAwLAorCisJVDFfNTc2NV81ODA1LAorCisJV1QxXzUyMTBfNTI1MCwKKwlXVDFfNTI5MF81MjkwLAorCVdUMV81NTQwXzU2NjAsCisJV1QxXzU3NjBfNTgwMCwKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW41R2h6VHVyYm9GcmVxW10gPSB7CisJeyA1MTMwLCA1MjEwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTEzMF81MjEwICovCisJeyA1MjUwLCA1MzMwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MjUwXzUzMzAgKi8KKwl7IDUzNzAsIDU0OTAsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MzcwXzU0OTAgKi8KKwl7IDU1MzAsIDU2NTAsIDUsICA2LCA0MCwgNDAsIERGU19GQ0MzLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzU1MzBfNTY1MCAqLworCisJeyA1MTUwLCA1MTkwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTE1MF81MTkwICovCisJeyA1MjMwLCA1MzEwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MjMwXzUzMTAgKi8KKwl7IDUzNTAsIDU0NzAsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81MzUwXzU0NzAgKi8KKwl7IDU1MTAsIDU2NzAsIDUsICA2LCA0MCwgNDAsIERGU19GQ0MzLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzU1MTBfNTY3MCAqLworCisJeyA1MjAwLCA1MjQwLCAxNywgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTIwMF81MjQwICovCisJeyA1MjAwLCA1MjQwLCAyMywgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDJfNTIwMF81MjQwICovCisJeyA1MjEwLCA1MjEwLCAxNywgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTIxMF81MjEwICovCisJeyA1MjEwLCA1MjEwLCAyMywgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDJfNTIxMF81MjEwICovCisKKwl7IDUyODAsIDUyODAsIDIzLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzUyODBfNTI4MCAqLworCXsgNTI4MCwgNTI4MCwgMjAsIDYsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDJfNTI4MF81MjgwICovCisJeyA1MjUwLCA1MjUwLCAxNywgMCwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjUwXzUyNTAgKi8KKwl7IDUyOTAsIDUyOTAsIDIwLCAwLCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzUyOTBfNTI5MCAqLworCXsgNTI1MCwgNTI5MCwgMjAsIDAsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTI1MF81MjkwICovCisJeyA1MjUwLCA1MjkwLCAyMywgNiwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMl81MjUwXzUyOTAgKi8KKworCXsgNTU0MCwgNTY2MCwgMjAsIDYsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTU0MF81NjYwICovCisJeyA1NzYwLCA1ODAwLCAyMCwgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTc2MF81ODAwICovCisJeyA1NzYwLCA1ODAwLCAzMCwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDJfNTc2MF81ODAwICovCisKKwl7IDU3NjUsIDU4MDUsIDMwLCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NzY1XzU4MDUgKi8KKworCS8qCisJICogQmVsb3cgYXJlIHRoZSBXV1IgZnJlcXVlbmNpZXMKKwkgKi8KKworCXsgNTIxMCwgNTI1MCwgMTUsIDAsIDQwLCA0MCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwfSwgLyogV1QxXzUyMTBfNTI1MCAqLworCXsgNTI5MCwgNTI5MCwgMTgsIDAsIDQwLCA0MCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwfSwgLyogV1QxXzUyOTBfNTI5MCAqLworCXsgNTU0MCwgNTY2MCwgMjAsIDAsIDQwLCA0MCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwfSwgLyogV1QxXzU1NDBfNTY2MCAqLworCXsgNTc2MCwgNTgwMCwgMjAsIDAsIDQwLCA0MCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDB9LAkvKiBXVDFfNTc2MF81ODAwICovCit9OworCisvKgorICogMkdIeiAxMWIgY2hhbm5lbCB0YWdzCisgKi8KK2VudW0geworCUYxXzIzMTJfMjM3MiwKKwlGMl8yMzEyXzIzNzIsCisKKwlGMV8yNDEyXzI0NzIsCisJRjJfMjQxMl8yNDcyLAorCUYzXzI0MTJfMjQ3MiwKKworCUYxXzI0MTJfMjQ2MiwKKwlGMl8yNDEyXzI0NjIsCisKKwlGMV8yNDMyXzI0NDIsCisKKwlGMV8yNDU3XzI0NzIsCisKKwlGMV8yNDY3XzI0NzIsCisKKwlGMV8yNDg0XzI0ODQsCisJRjJfMjQ4NF8yNDg0LAorCisJRjFfMjUxMl8yNzMyLAorCisJVzFfMjMxMl8yMzcyLAorCVcxXzI0MTJfMjQxMiwKKwlXMV8yNDE3XzI0MzIsCisJVzFfMjQzN18yNDQyLAorCVcxXzI0NDdfMjQ1NywKKwlXMV8yNDYyXzI0NjIsCisJVzFfMjQ2N18yNDY3LAorCVcyXzI0NjdfMjQ2NywKKwlXMV8yNDcyXzI0NzIsCisJVzJfMjQ3Ml8yNDcyLAorCVcxXzI0ODRfMjQ4NCwKKwlXMl8yNDg0XzI0ODQsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoekZyZXFbXSA9IHsKKwl7IDIzMTIsIDIzNzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzIzMTJfMjM3MiAqLworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjJfMjMxMl8yMzcyICovCisKKwl7IDI0MTIsIDI0NzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0MTJfMjQ3MiAqLworCXsgMjQxMiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EsIDAsIDB9LAkvKiBGMl8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDMwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYzXzI0MTJfMjQ3MiAqLworCisJeyAyNDEyLCAyNDYyLCAyNywgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDEyXzI0NjIgKi8KKwl7IDI0MTIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBLCAwLCAwfSwJLyogRjJfMjQxMl8yNDYyICovCisJeyAyNDMyLCAyNDQyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDMyXzI0NDIgKi8KKworCXsgMjQ1NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQ1N18yNDcyICovCisKKwl7IDI0NjcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EsIDAsIDB9LCAvKiBGMV8yNDY3XzI0NzIgKi8KKworCXsgMjQ4NCwgMjQ4NCwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQ4NF8yNDg0ICovCisJeyAyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTIsIDAsIDB9LAkvKiBGMl8yNDg0XzI0ODQgKi8KKworCXsgMjUxMiwgMjczMiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjUxMl8yNzMyICovCisKKwkvKgorCSAqIFdXUiBoYXZlIHBvd2VycyBvcGVuZWQgdXAgdG8gMjBkQm0uICBMaW1pdHMgc2hvdWxkIG9mdGVuIGNvbWUgZnJvbSBDVEwvTWF4IHBvd2VycworCSAqLworCisJeyAyMzEyLCAyMzcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yMzEyXzIzNzIgKi8KKwl7IDI0MTIsIDI0MTIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0MTJfMjQxMiAqLworCXsgMjQxNywgMjQzMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQxN18yNDMyICovCisJeyAyNDM3LCAyNDQyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDM3XzI0NDIgKi8KKwl7IDI0NDcsIDI0NTcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0NDdfMjQ1NyAqLworCXsgMjQ2MiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQ2Ml8yNDYyICovCisJeyAyNDY3LCAyNDY3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXMV8yNDY3XzI0NjcgKi8KKwl7IDI0NjcsIDI0NjcsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwLCAwfSwJLyogVzJfMjQ2N18yNDY3ICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXMV8yNDcyXzI0NzIgKi8KKwl7IDI0NzIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwLCAwfSwJLyogVzJfMjQ3Ml8yNDcyICovCisJeyAyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXMV8yNDg0XzI0ODQgKi8KKwl7IDI0ODQsIDI0ODQsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwLCAwfSwJLyogVzJfMjQ4NF8yNDg0ICovCit9OworCisKKy8qCisgKiAyR0h6IDExZyBjaGFubmVsIHRhZ3MKKyAqLworCitlbnVtIHsKKwlHMV8yMzEyXzIzNzIsCisJRzJfMjMxMl8yMzcyLAorCisJRzFfMjQxMl8yNDcyLAorCUcyXzI0MTJfMjQ3MiwKKwlHM18yNDEyXzI0NzIsCisKKwlHMV8yNDEyXzI0NjIsCisJRzJfMjQxMl8yNDYyLAorCisJRzFfMjQzMl8yNDQyLAorCisJRzFfMjQ1N18yNDcyLAorCisJRzFfMjUxMl8yNzMyLAorCisJRzFfMjQ2N18yNDcyICwKKworCVdHMV8yMzEyXzIzNzIsCisJV0cxXzI0MTJfMjQxMiwKKwlXRzFfMjQxN18yNDMyLAorCVdHMV8yNDM3XzI0NDIsCisJV0cxXzI0NDdfMjQ1NywKKwlXRzFfMjQ2Ml8yNDYyLAorCVdHMV8yNDY3XzI0NjcsCisJV0cyXzI0NjdfMjQ2NywKKwlXRzFfMjQ3Ml8yNDcyLAorCVdHMl8yNDcyXzI0NzIsCisKK307CitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoejExZ0ZyZXFbXSA9IHsKKwl7IDIzMTIsIDIzNzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzIzMTJfMjM3MiAqLworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzJfMjMxMl8yMzcyICovCisKKwl7IDI0MTIsIDI0NzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI0MTJfMjQ3MiAqLworCXsgMjQxMiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCAgTk9fREZTLCBQU0NBTl9NS0tBX0csIDAsIDB9LAkvKiBHMl8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDMwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEczXzI0MTJfMjQ3MiAqLworCisJeyAyNDEyLCAyNDYyLCAyNywgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDEyXzI0NjIgKi8KKwl7IDI0MTIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBX0csIDAsIDB9LAkvKiBHMl8yNDEyXzI0NjIgKi8KKwl7IDI0MzIsIDI0NDIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI0MzJfMjQ0MiAqLworCisJeyAyNDU3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDU3XzI0NzIgKi8KKworCXsgMjUxMiwgMjczMiwgNSwgIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjUxMl8yNzMyICovCisKKwl7IDI0NjcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EsIDAsIDAgfSwgLyogRzFfMjQ2N18yNDcyICovCisKKwkvKgorCSAqIFdXUiBvcGVuIHVwIHRoZSBwb3dlciB0byAyMGRCbQorCSAqLworCisJeyAyMzEyLCAyMzcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjMxMl8yMzcyICovCisJeyAyNDEyLCAyNDEyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjQxMl8yNDEyICovCisJeyAyNDE3LCAyNDMyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjQxN18yNDMyICovCisJeyAyNDM3LCAyNDQyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjQzN18yNDQyICovCisJeyAyNDQ3LCAyNDU3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjQ0N18yNDU3ICovCisJeyAyNDYyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXRzFfMjQ2Ml8yNDYyICovCisJeyAyNDY3LCAyNDY3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXRzFfMjQ2N18yNDY3ICovCisJeyAyNDY3LCAyNDY3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFdHMl8yNDY3XzI0NjcgKi8KKwl7IDI0NzIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9XV1IgfCBJU19FQ01fQ0hBTiwgMCwgMH0sIC8qIFdHMV8yNDcyXzI0NzIgKi8KKwl7IDI0NzIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiB8IElTX0VDTV9DSEFOLCAwLCAwfSwJLyogV0cyXzI0NzJfMjQ3MiAqLworfTsKKy8qCisgKiAyR0h6IER5bmFtaWMgdHVyYm8gdGFncworICovCisKK2VudW0geworCVQxXzIzMTJfMjM3MiwKKwlUMV8yNDM3XzI0MzcsCisJVDJfMjQzN18yNDM3LAorCVQzXzI0MzdfMjQzNywKKwlUMV8yNTEyXzI3MzIKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW4yR2h6MTFnVHVyYm9GcmVxW10gPSB7CisJeyAyMzEyLCAyMzcyLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgIC8qIFQxXzIzMTJfMjM3MiAqLworCXsgMjQzNywgMjQzNywgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAvKiBUMV8yNDM3XzI0MzcgKi8KKwl7IDI0MzcsIDI0MzcsIDIwLCA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDJfMjQzN18yNDM3ICovCisJeyAyNDM3LCAyNDM3LCAxOCwgNiwgNDAsIDQwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFQzXzI0MzdfMjQzNyAqLworCXsgMjUxMiwgMjczMiwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAvKiBUMV8yNTEyXzI3MzIgKi8KK307CisKKworCisvKgorICogMkdIeiAxMW4gZnJlcXVlbmN5IHRhZ3MKKyAqLworZW51bSB7CisgICAgTkcxXzI0MjJfMjQ1MiwKKyAgICBORzJfMjQyMl8yNDUyLAorICAgIE5HM18yNDIyXzI0NTIsCisKKyAgICBOR19ERU1PX0FMTF9DSEFOTkVMUywKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW4yR2h6MTFuZ0ZyZXFbXSA9IHsKKyAgICB7IDI0MjIsIDI0NTIsIDIwLCAwLCA0MCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAgIC8qIE5HMV8yNDIyXzI0NTIgKi8KKyAgICB7IDI0MjIsIDI0NTIsIDI3LCAwLCA0MCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAgIC8qIE5HMl8yNDIyXzI0NTIgKi8KKyAgICB7IDI0MjIsIDI0NTIsIDMwLCAwLCA0MCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAgIC8qIE5HM18yNDIyXzI0NTIgKi8KKworCXsgMjMxMiwgMjczMiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgICAgLyogTkdfREVNT19BTExfQ0hBTk5FTFMgKi8KK307CisKKworLyoKKyAqIDVHSHogMTFuIGZyZXF1ZW5jeSB0YWdzCisgKi8KK2VudW0geworICAgIE5BMV81MTkwXzUyMzAsCisgICAgTkEyXzUxOTBfNTIzMCwKKyAgICBOQTNfNTE5MF81MjMwLAorICAgIE5BNF81MTkwXzUyMzAsCisgICAgTkE1XzUxOTBfNTIzMCwKKworICAgIE5BMV81MjcwXzUyNzAsCisKKyAgICBOQTFfNTI3MF81MzEwLAorICAgIE5BMl81MjcwXzUzMTAsCisgICAgTkEzXzUyNzBfNTMxMCwKKyAgICBOQTRfNTI3MF81MzEwLAorCisgICAgTkExXzUzMTBfNTMxMCwKKworICAgIE5BMV81NTEwXzU2MzAsCisKKyAgICBOQTFfNTUxMF81NjcwLAorICAgIE5BMl81NTEwXzU2NzAsCisgICAgTkEzXzU1MTBfNTY3MCwKKworICAgIE5BMV81NzU1XzU3OTUsCisgICAgTkEyXzU3NTVfNTc5NSwKKyAgICBOQTNfNTc1NV81Nzk1LAorICAgIE5BNF81NzU1XzU3OTUsCisgICAgTkE1XzU3NTVfNTc5NSwKKworICAgIE5BMV81Nzk1XzU3OTUsCisKKyAgICBOQV9ERU1PX0FMTF9DSEFOTkVMUywKK307CisKK3N0YXRpYyBSRUdfRE1OX0ZSRVFfQkFORCByZWdEbW41R2h6MTFuYUZyZXFbXSA9IHsKKyAgICAvKgorICAgICAqIFRvRG86IFRoaXMgdGFibGUgbmVlZHMgdG8gYmUgY29tcGxldGVseSBwb3B1bGF0ZWQgd2l0aCA1R0h6IDExbiBwcm9wZXJ0aWVzCisgICAgICovCisJeyA1MTkwLCA1MjMwLCAxNSwgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTFfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAxNywgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIE5BMl81MTkwXzUyMzAgKi8KKwl7IDUxOTAsIDUyMzAsIDE4LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BM181MTkwXzUyMzAgKi8KKwl7IDUxOTAsIDUyMzAsIDIwLCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogTkE0XzUxOTBfNTIzMCAqLworCXsgNTE5MCwgNTIzMCwgMjMsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkE1XzUxOTBfNTIzMCAqLworCisJeyA1MjcwLCA1MjcwLCAyMywgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81MjcwXzUyNzAgKi8KKworCXsgNTI3MCwgNTMxMCwgMTgsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTI3MF81MzEwICovCisJeyA1MjcwLCA1MzEwLCAyMCwgIDAsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0l8REZTX01LSzQsIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMl81MjcwXzUzMTAgKi8KKwl7IDUyNzAsIDUzMTAsIDIzLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkEzXzUyNzBfNTMxMCAqLworCXsgNTI3MCwgNTMxMCwgMzAsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTRfNTI3MF81MzEwICovCisKKwl7IDUzMTAsIDUzMTAsIDE3LCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzUzMTBfNTMxMCAqLworCisJeyA1NTEwLCA1NjMwLCAzMCwgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81NTEwXzU2MzAgKi8KKworCXsgNTUxMCwgNTY3MCwgMjAsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJfERGU19NS0s0LCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTUxMF81NjcwICovCisJeyA1NTEwLCA1NjcwLCAyNywgIDAsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMl81NTEwXzU2NzAgKi8KKwl7IDU1MTAsIDU2NzAsIDMwLCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDF9LCAgIC8qIE5BM181NTEwXzU2NzAgKi8KKworCXsgNTc1NSwgNTc5NSwgMTcsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkExXzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMjAsICA2LCA0MCwgNDAsIERGU19FVFNJLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTJfNTc1NV81Nzk1ICovCisJeyA1NzU1LCA1Nzk1LCAyMywgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTNfNTc1NV81Nzk1ICovCisJeyA1NzU1LCA1Nzk1LCAzMCwgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIE5BNF81NzU1XzU3OTUgKi8KKwl7IDU3NTUsIDU3OTUsIDMwLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BNV81NzU1XzU3OTUgKi8KKworCXsgNTc5NSwgNTc5NSwgMzAsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkExXzU3OTVfNTc5NSAqLworCisgICAgeyA0OTIwLCA2MTAwLCAzMCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIE5BX0RFTU9fQUxMX0NIQU5ORUxTICovCit9OworCit0eXBlZGVmIHN0cnVjdCByZWdEb21haW4geworCXUxNl90IHJlZ0RtbkVudW07CS8qIHZhbHVlIGZyb20gRW51bVJkIHRhYmxlICovCisJdThfdCBjb25mb3JtYW5jZVRlc3RMaW1pdDsKKwl1NjRfdCBkZnNNYXNrOwkvKiBERlMgYml0bWFzayBmb3IgNUdoeiB0YWJsZXMgKi8KKwl1NjRfdCBwc2NhbjsJLyogQml0bWFzayBmb3IgcGFzc2l2ZSBzY2FuICovCisJdTMyX3QgZmxhZ3M7CS8qIFJlcXVpcmVtZW50IGZsYWdzIChBZEhvYyBkaXNhbGxvdywgbm9pc2UKKwkJCQkgICBmbG9vciBjYWwgbmVlZGVkLCBldGMpICovCisJdTY0X3QgY2hhbjExYVtCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFhX3R1cmJvW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCSAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWFfZHluX3R1cmJvW0JNTEVOXTsgLyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkJICAgICAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWJbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExZ1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFnX3R1cmJvW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCQkgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMW5nW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIDExbiBpbiAyR0h6ICovCisJdTY0X3QgY2hhbjExbmFbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgMTFuIGluIDVHSHogKi8KK30gUkVHX0RPTUFJTjsKKworc3RhdGljIFJFR19ET01BSU4gcmVnRG9tYWluc1tdID0geworCisJe0RFQlVHX1JFR19ETU4sIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMV81MTIwXzUyNDAsIEYxXzUyNjBfNTcwMCwgRjFfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTEzMF81MjEwLCBUMV81MjUwXzUzMzAsIFQxXzUzNzBfNTQ5MCwgVDFfNTUzMF81NjUwLCBUMV81MTUwXzUxOTAsIFQxXzUyMzBfNTMxMCwgVDFfNTM1MF81NDcwLCBUMV81NTEwXzU2NzAsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjQwLCBUMV81MjgwXzUyODAsIFQxXzU1NDBfNTY2MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShGMV8yMzEyXzIzNzIsIEYxXzI0MTJfMjQ3MiwgRjFfMjQ4NF8yNDg0LCBGMV8yNTEyXzI3MzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcxXzIzMTJfMjM3MiwgRzFfMjQxMl8yNDcyLCBHMV8yNTEyXzI3MzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV8yMzEyXzIzNzIsIFQxXzI0MzdfMjQzNywgVDFfMjUxMl8yNzMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkdfREVNT19BTExfQ0hBTk5FTFMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5BX0RFTU9fQUxMX0NIQU5ORUxTLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEwxLCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY0XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMMiwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMV81NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BM181NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDMsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMV81MjgwXzUzMjAsIEYyXzU3NDVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTMxMF81MzEwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDQsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjRfNTE4MF81MjQwLCAgRjNfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMNSwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMV81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDYsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9GQ0NfVCB8IFBTQ0FOX0ZDQyAsIE5PX1JFUSwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEYzXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzUyMTBfNTIxMCwgVDFfNTI1MF81MjkwLCBUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkEyXzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDcsIEZDQywgTk9fREZTLCBQU0NBTl9GQ0NfVCB8IFBTQ0FOX0ZDQyAsIE5PX1JFUSwKKwkgQk0oRjdfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIEYzXzU3NDVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMV81MzEwXzUzMTAsIE5BMl81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisJe0FQTDgsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIERJU0FMTE9XX0FESE9DXzExQXxESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjZfNTI2MF81MzIwLCBGNF81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUyNzBfNTMxMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw5LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBfERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV81MTgwXzUzMjAsIEYxXzU1MDBfNTYyMCwgRjNfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkExXzU1MTBfNTYzMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTEsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oVzJfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEYyXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMl81NTEwXzU2NzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJMiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGM181MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BM181MTkwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0kzLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKFcyXzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTQsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjNfNTE4MF81MjQwLCBGMV81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEzXzUxOTBfNTIzMCwgTkExXzUyNzBfNTMxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJNSwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV81MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMV81MTkwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0k2LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY1XzUxODBfNTI0MCwgRjFfNTI2MF81MjgwLCBGM181NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTVfNTE5MF81MjMwLCBOQTFfNTI3MF81MjcwLCBOQTNfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RkNDMSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYyXzUxODBfNTI0MCwgRjRfNTI2MF81MzIwLCBGNV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjEwXzUyMTAsIFQyXzUyNTBfNTI5MCwgVDJfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjQwLCBUMV81MjgwXzUyODAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEyXzUxOTBfNTIzMCwgTkEzXzUyNzBfNTMxMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzIsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGNl81MTgwXzUyNDAsIEY1XzUyNjBfNTMyMCwgRjZfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNV81MTkwXzUyMzAsIE5BM181MjcwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtGQ0MzLCBGQ0MsIERGU19GQ0MzLCBQU0NBTl9GQ0MgfCBQU0NBTl9GQ0NfVCwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEYzXzUyNjBfNTMyMCwgRjFfNTUwMF81NzAwLCBGNV81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMTBfNTIxMCwgVDFfNTI1MF81MjUwLCBUMV81MjkwXzUyOTAsIFQyXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIwMF81MjQwLCBUMl81MjgwXzUyODAsIFQxXzU1NDBfNTY2MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkEyXzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkEzXzU1MTBfNTY3MCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RkNDNCwgRkNDLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRkNDX1QsIE5PX1JFUSwKKwkgQk0oRjFfNDk0Ml80OTg3LCBGMV80OTQ1XzQ5ODUsIEYxXzQ5NTBfNDk4MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RkNDNSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEYyXzUxODBfNTI0MCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMl81MTkwXzUyMzAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKyAgICB7RkNDNiwgRkNDLCBERlNfRkNDMywgUFNDQU5fRkNDLCBOT19SRVEsCisJIEJNKEY3XzUxODBfNTI0MCwgRjVfNTI2MF81MzIwLCBGMV81NTAwXzU1ODAsIEYxXzU2NjBfNTcwMCwgRjZfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjAwXzUyNDAsIFQxXzUyODBfNTI4MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisgICAgIEJNWkVSTywKKyAgICAgQk1aRVJPLAorCSBCTShOQTVfNTE5MF81MjMwLCBOQTVfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe01LSzEsIE1LSywgTk9fREZTLCBQU0NBTl9NS0sxLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE3MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe01LSzIsIE1LSywgTk9fREZTLCBQU0NBTl9NS0syLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjFfNTE3MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJLyogVU5JLTEgZXZlbiAqLworCXtNS0szLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY0XzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTIgKi8KKwl7TUtLNCwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCAqLworCXtNS0s1LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMV81NTEwXzU2NzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIG9kZCArIGV2ZW4gKi8KKwl7TUtLNiwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgb2RkICsgVU5JLTEgZXZlbiArIFVOSS0yICovCisJe01LSzcsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szICwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgb2RkICsgVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKi8KKwl7TUtLOCwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjJfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTFfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKyAgICAvKiBVTkktMSBldmVuICsgNC45IEdIWiAqLworICAgIHtNS0s5LCBNS0ssIE5PX0RGUywgTk9fUFNDQU4sIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorICAgICBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKyAgICAvKiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjkgR0haICovCisJe01LSzEwLCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOSBHSFogKyBtaWQtYmFuZCAqLworCXtNS0sxMSwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgNC45IEdIWiArIG1pZC1iYW5kICovCisJe01LSzEyLCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0szLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjFfNTE3MF81MjMwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJLyogRGVmaW5lZCBoZXJlIHRvIHVzZSB3aGVuIDJHIGNoYW5uZWxzIGFyZSBhdXRob3Jpc2VkIGZvciBjb3VudHJ5IEsyICovCisJe0FQTEQsIE5PX0NUTCwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yMzEyXzIzNzIsRjJfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzIzMTJfMjM3MixHMl8yNDEyXzI0NzIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSUEsIE5PX0NUTCwgTk9fREZTLCBQU0NBTl9FVFNJQSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYxXzI0NTdfMjQ3MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yNDU3XzI0NzIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtFVFNJQiwgRVRTSSwgTk9fREZTLCBQU0NBTl9FVFNJQiwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYxXzI0MzJfMjQ0MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yNDMyXzI0NDIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtFVFNJQywgRVRTSSwgTk9fREZTLCBQU0NBTl9FVFNJQywgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYzXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHM18yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtGQ0NBLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjFfMjQxMl8yNDYyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcxXzI0MTJfMjQ2MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkcyXzI0MjJfMjQ1MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk99LAorCisJe01LS0EsIE1LSywgTk9fREZTLCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjJfMjQxMl8yNDYyLCBGMV8yNDY3XzI0NzIsIEYyXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKEcyXzI0MTJfMjQ2MiwgRzFfMjQ2N18yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzFfMjQyMl8yNDUyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVST30sCisKKwl7TUtLQywgTUtLLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYyXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HMV8yNDIyXzI0NTIsLTEsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk99LAorCisJe1dPUkxELCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYyXzI0MTJfMjQ3MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HMV8yNDIyXzI0NTIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtXT1IwX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIFcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MixXRzFfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsV0cxXzI0NDdfMjQ1NyxXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1IwMV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SMDJfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCxXMV81MTcwXzUyMzAsVzFfNTc0NV81ODI1LFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MiwgVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0VVMV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLFcxXzUxNzBfNTIzMCxXMV81NzQ1XzU4MjUsVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLCBXMl8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcyXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsIFdHMl8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgV0cyXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SMV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCBXMV8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SMl9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIFcxXzI0ODRfMjQ4NCwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MixXRzFfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsV0cxXzI0NDdfMjQ1NyxXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1IzX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzUxNzBfNTIzMCwgVzFfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MixXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1I0X1dPUkxELCBOT19DVEwsIERGU19GQ0MzLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzJfNTI2MF81MzIwLCBXMl81MTgwXzUyNDAsIEYyXzU3NDVfNTgwNSwgVzJfNTgyNV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLFcxXzI0NDdfMjQ1NywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1I1X0VUU0lDLCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcyXzUxODBfNTI0MCwgRjZfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcyXzI0NzJfMjQ3MiwgVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcyXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMiwgV0cxXzI0MzdfMjQ0MiwgV0cxXzI0NjJfMjQ2MiwgV0cxXzI0NzJfMjQ3MiwgV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SOV9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLCBXRzFfMjQzN18yNDQyLCBXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUkFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMiwgVzFfMjQzN18yNDQyLCBXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MiwgVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMiwgV0cxXzI0MzdfMjQ0MiwgV0cxXzI0NjJfMjQ2MiwgV0cxXzI0NzJfMjQ3MiwgV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7TlVMTDEsIE5PX0NUTCwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCit9OworCitzdHJ1Y3QgY21vZGUgeworCXUxNl90CW1vZGU7CisJdTMyX3QJZmxhZ3M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtb2RlIG1vZGVzW10gPSB7CisJeyBIQUxfTU9ERV9UVVJCTywJQ0hBTk5FTF9TVH0sCS8qIFRVUkJPIG1lYW5zIDExYSBTdGF0aWMgVHVyYm8gKi8KKwl7IEhBTF9NT0RFXzExQSwJCUNIQU5ORUxfQX0sCisJeyBIQUxfTU9ERV8xMUIsCQlDSEFOTkVMX0J9LAorCXsgSEFMX01PREVfMTFHLAkJQ0hBTk5FTF9HfSwKKwl7IEhBTF9NT0RFXzExR19UVVJCTywJQ0hBTk5FTF8xMDhHfSwKKwl7IEhBTF9NT0RFXzExQV9UVVJCTywJQ0hBTk5FTF8xMDhBfSwKKwl7IEhBTF9NT0RFXzExTkEsCUNIQU5ORUxfQV9IVDQwfSwKKwl7IEhBTF9NT0RFXzExTkEsCUNIQU5ORUxfQV9IVDIwfSwKKwl7IEhBTF9NT0RFXzExTkcsCUNIQU5ORUxfR19IVDQwfSwKKwl7IEhBTF9NT0RFXzExTkcsCUNIQU5ORUxfR19IVDIwfSwKK307CisKKy8qCisgKiBSZXR1cm4gdGhlIFdpcmVsZXNzIE1vZGUgUmVndWxhdG9yeSBEb21haW4gYmFzZWQKKyAqIG9uIHRoZSBjb3VudHJ5IGNvZGUgYW5kIHRoZSB3aXJlbGVzcyBtb2RlLgorICovCit1OF90IEdldFdtUkQodTE2X3QgcmVnaW9uQ29kZSwgdTE2X3QgY2hhbm5lbEZsYWcsIFJFR19ET01BSU4gKnJkKQoreworCXMxNl90IGksIGZvdW5kLCByZWdEbW47CisJdTY0X3QgZmxhZ3M9Tk9fUkVROworCVJFR19ETU5fUEFJUl9NQVBQSU5HICpyZWdQYWlyPU5VTEw7CisKKwlmb3IgKGk9MCwgZm91bmQ9MDsgKGk8TihyZWdEb21haW5QYWlycykpJiYoIWZvdW5kKTsgaSsrKQorCXsKKwkJaWYgKHJlZ0RvbWFpblBhaXJzW2ldLnJlZ0RtbkVudW0gPT0gcmVnaW9uQ29kZSkKKwkJeworCQkJcmVnUGFpciA9ICZyZWdEb21haW5QYWlyc1tpXTsKKwkJCWZvdW5kID0gMTsKKwkJfQorCX0KKwlpZiAoIWZvdW5kKQorCXsKKwkJem1fZGVidWdfbXNnMSgiRmFpbGVkIHRvIGZpbmQgcmVnIGRvbWFpbiBwYWlyICIsIHJlZ2lvbkNvZGUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKGNoYW5uZWxGbGFnICYgWk1fUkVHX0ZMQUdfQ0hBTk5FTF8yR0haKQorCXsKKwkJcmVnRG1uID0gcmVnUGFpci0+cmVnRG1uMkdIejsKKwkJZmxhZ3MgPSByZWdQYWlyLT5mbGFnczJHSHo7CisJfQorICAgIGVsc2UKKwl7CisJCXJlZ0RtbiA9IHJlZ1BhaXItPnJlZ0RtbjVHSHo7CisJCWZsYWdzID0gcmVnUGFpci0+ZmxhZ3M1R0h6OworCX0KKworCS8qCisJICogV2UgZWl0aGVyIHN0YXJ0ZWQgd2l0aCBhIHVuaXRhcnkgcmVnIGRvbWFpbiBvciB3ZSd2ZSBmb3VuZCB0aGUKKwkgKiB1bml0YXJ5IHJlZyBkb21haW4gb2YgdGhlIHBhaXIKKwkgKi8KKworCWZvciAoaT0wO2k8TihyZWdEb21haW5zKTsgaSsrKQorCXsKKwkJaWYgKHJlZ0RvbWFpbnNbaV0ucmVnRG1uRW51bSA9PSByZWdEbW4pCisJCXsKKwkJCWlmIChyZCAhPSBOVUxMKQorCQkJeworCQkJCXpmTWVtb3J5Q29weSgodThfdCAqKXJkLCAodThfdCAqKSZyZWdEb21haW5zW2ldLAorCQkJCQkgIHNpemVvZihSRUdfRE9NQUlOKSk7CisJCQl9CisJCX0KKwl9CisJcmQtPnBzY2FuICY9IHJlZ1BhaXItPnBzY2FuTWFzazsKKyAgICByZC0+ZmxhZ3MgPSAodTMyX3QpZmxhZ3M7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBUZXN0IHRvIHNlZSBpZiB0aGUgYml0bWFzayBhcnJheSBpcyBhbGwgemVyb3MKKyAqLwordThfdCBpc0NoYW5CaXRNYXNrWmVybyh1NjRfdCAqYml0bWFzaykKK3sKKwl1MTZfdCBpOworCisJZm9yIChpPTA7IGk8Qk1MRU47IGkrKykgeworCQlpZiAoYml0bWFza1tpXSAhPSAwKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKwordThfdCBJU19CSVRfU0VUKHUzMl90IGJpdCwgdTY0X3QgKmJpdG1hc2spCit7CisJdTMyX3QgYnl0ZU9mZnNldCwgYml0bnVtOworCXU2NF90IHZhbDsKKworCWJ5dGVPZmZzZXQgPSBiaXQvNjQ7CisJYml0bnVtID0gYml0IC0gYnl0ZU9mZnNldCo2NDsKKwl2YWwgPSAoKHU2NF90KSAxKSA8PCBiaXRudW07CisJaWYgKGJpdG1hc2tbYnl0ZU9mZnNldF0gJiB2YWwpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKK3ZvaWQgemZIcEdldFJlZ3VsYXRpb25UYWJsZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSwgdTE2X3QgY19sbywgdTE2X3QgY19oaSkKK3sKKwlSRUdfRE9NQUlOIHJkNUdIeiwgcmQyR0h6OworCWNvbnN0IHN0cnVjdCBjbW9kZSAqY207CisJczE2X3QgbmV4dD0wLGI7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisJaWYgKCFHZXRXbVJEKHJlZ2lvbkNvZGUsIH5aTV9SRUdfRkxBR19DSEFOTkVMXzJHSFosICZyZDVHSHopKQorCXsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY291bGRuJ3QgZmluZCB1bml0YXJ5IDVHSHogcmVnIGRvbWFpbiBmb3IgUmVnaW9uIENvZGUgIiwgcmVnaW9uQ29kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFHZXRXbVJEKHJlZ2lvbkNvZGUsIFpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWiwgJnJkMkdIeikpCisJeworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjb3VsZG4ndCBmaW5kIHVuaXRhcnkgMkdIeiByZWcgZG9tYWluIGZvciBSZWdpb24gQ29kZSAiLCByZWdpb25Db2RlKTsKKwkJcmV0dXJuOworCX0KKyAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID09IHJlZ2lvbkNvZGUpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdXJyZW50IHJlZ2lvbiBjb2RlIGlzIHRoZSBzYW1lIHdpdGggUmVnaW9uIENvZGUgIiwgcmVnaW9uQ29kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID0gcmVnaW9uQ29kZTsKKyAgICB9CisKKyAgICBuZXh0ID0gMDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKwlmb3IgKGNtID0gbW9kZXM7IGNtIDwgJm1vZGVzW04obW9kZXMpXTsgY20rKykKKwl7CisJCXUxNl90IGM7CisJCXU2NF90ICpjaGFubmVsQk09TlVMTDsKKwkJUkVHX0RPTUFJTiAqcmQ9TlVMTDsKKwkJUkVHX0RNTl9GUkVRX0JBTkQgKmZiYW5kPU5VTEwsKmZyZXFzPU5VTEw7CisKKwkJc3dpdGNoIChjbS0+bW9kZSkKKwkJeworCQljYXNlIEhBTF9NT0RFX1RVUkJPOgorCQkgICAgLy93ZSBkb24ndCBoYXZlIHR1cmJvIG1vZGUgc28gd2UgZGlzYWJsZSBpdAorICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBIQUxfTU9ERV9UVVJCTyIpOworICAgICAgICAgICAgY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQ1R0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExYV90dXJibzsKKwkJCS8vZnJlcXMgPSAmcmVnRG1uNUdoelR1cmJvRnJlcVswXTsKKwkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMX1RVUkJPOworCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFBOgorCQkgICAgaWYgKChocFByaXYtPk9wRmxhZ3MgJiAweDEpICE9IDApCisJCSAgICB7CisgICAgCQkJcmQgPSAmcmQ1R0h6OworICAgIAkJCWNoYW5uZWxCTSA9IHJkLT5jaGFuMTFhOworICAgIAkJCWZyZXFzID0gJnJlZ0RtbjVHaHpGcmVxWzBdOworICAgIAkJCWNfbG8gPSA0OTIwOyAvL2Zyb20gY2hhbm5lbCAxODQKKyAgICAJCQljX2hpID0gNTgyNTsgLy90byAgIGNoYW5uZWwgMTY1CisgICAgCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQ7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJDV1kgLSBIQUxfTU9ERV8xMUEsIGNoYW5uZWxCTSA9IDB4IiwgKmNoYW5uZWxCTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2NoYW5uZWxCTSA9IE5VTEw7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUI6CisJCSAgICAvL0Rpc2FibGUgMTFCIG1vZGUgYmVjYXVzZSBpdCBvbmx5IGhhcyBkaWZmZXJlbmNlIHdpdGggMTFHIGluIFBvd2VyREZTIERhdGEsCisJCSAgICAvL2FuZCB3ZSBkb24ndCB1c2UgdGhpcyBub3cuCisJCQkvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFXzExQiIpOworCQkJY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQyR0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExYjsKKwkJCS8vZnJlcXMgPSAmcmVnRG1uMkdoekZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMUI7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIkNXWSAtIEhBTF9NT0RFXzExQiwgY2hhbm5lbEJNID0gMHgiLCAqY2hhbm5lbEJNKTsKKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExRzoKKwkJICAgIGlmICgoaHBQcml2LT5PcEZsYWdzICYgMHgyKSAhPSAwKQorCQkgICAgeworICAgIAkJCXJkID0gJnJkMkdIejsKKyAgICAJCQljaGFubmVsQk0gPSByZC0+Y2hhbjExZzsKKyAgICAJCQlmcmVxcyA9ICZyZWdEbW4yR2h6MTFnRnJlcVswXTsKKyAgICAJCQljX2xvID0gMjQxMjsgLy9mcm9tIGNoYW5uZWwgIDEKKyAgICAJCQkvL2NfaGkgPSAyNDYyOyAvL3RvICAgY2hhbm5lbCAxMQorICAgICAgICAgICAgICAgIGNfaGkgPSAyNDcyOyAvL3RvICAgY2hhbm5lbCAxMworICAgIAkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMXzExRzsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIkNXWSAtIEhBTF9NT0RFXzExRywgY2hhbm5lbEJNID0gMHgiLCAqY2hhbm5lbEJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vY2hhbm5lbEJNID0gTlVMTDsKKyAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExR19UVVJCTzoKKwkJICAgIC8vd2UgZG9uJ3QgaGF2ZSB0dXJibyBtb2RlIHNvIHdlIGRpc2FibGUgaXQKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gSEFMX01PREVfMTFHX1RVUkJPIik7CisgICAgICAgICAgICBjaGFubmVsQk0gPSBOVUxMOworCQkJLy9yZCA9ICZyZDJHSHo7CisJCQkvL2NoYW5uZWxCTSA9IHJkLT5jaGFuMTFnX3R1cmJvOworCQkJLy9mcmVxcyA9ICZyZWdEbW4yR2h6MTFnVHVyYm9GcmVxWzBdOworCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfMTA4RzsKKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExQV9UVVJCTzoKKwkJICAgIC8vd2UgZG9uJ3QgaGF2ZSB0dXJibyBtb2RlIHNvIHdlIGRpc2FibGUgaXQKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gSEFMX01PREVfMTFBX1RVUkJPIik7CisgICAgICAgICAgICBjaGFubmVsQk0gPSBOVUxMOworCQkJLy9yZCA9ICZyZDVHSHo7CisJCQkvL2NoYW5uZWxCTSA9IHJkLT5jaGFuMTFhX2R5bl90dXJibzsKKwkJCS8vZnJlcXMgPSAmcmVnRG1uNUdoelR1cmJvRnJlcVswXTsKKwkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMXzEwOEc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIlVua29ud24gSEFMIG1vZGUgIiwgY20tPm1vZGUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoYW5uZWxCTSA9PSBOVUxMKQorCQl7CisJCSAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIGNoYW5uZWxCTSBpcyBOVUxMIik7CisJCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNDaGFuQml0TWFza1plcm8oY2hhbm5lbEJNKSkKKyAgICAgICAgeworCSAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBCaXRNYXNrIGlzIFplcm8iKTsKKwkgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUkFZOklzIGl0IG9rPz8KKyAgICAgICAgaWYgKGZyZXFzID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisJCWZvciAoYj0wO2I8NjQqQk1MRU47IGIrKykKKwkJeworCQkJaWYgKElTX0JJVF9TRVQoYixjaGFubmVsQk0pKQorCQkJeworCQkJCWZiYW5kID0gJmZyZXFzW2JdOworCisJCQkJLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBsb3dDaGFubmVsID0gIiwgZmJhbmQtPmxvd0NoYW5uZWwpOworCQkJCS8vem1fZGVidWdfbXNnMSgiQ1dZIC0gaGlnaENoYW5uZWwgPSAiLCBmYmFuZC0+aGlnaENoYW5uZWwpOworCQkJCS8vem1fZGVidWdfbXNnMSgiQ1dZIC0gY2hhbm5lbFNlcCA9ICIsIGZiYW5kLT5jaGFubmVsU2VwKTsKKwkJCQlmb3IgKGM9ZmJhbmQtPmxvd0NoYW5uZWw7IGMgPD0gZmJhbmQtPmhpZ2hDaGFubmVsOworCQkJCSAgICAgYyArPSBmYmFuZC0+Y2hhbm5lbFNlcCkKKwkJCQl7CisJCQkJCVpNX0hBTF9DSEFOTkVMIGljdjsKKworICAgICAgICAgICAgICAgICAgICAvL0Rpc2FibGUgYWxsIERGUyBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgIGlmICgoaHBQcml2LT5kaXNhYmxlRGZzQ2g9PTApIHx8ICghKGZiYW5kLT51c2VEZnMgJiByZC0+ZGZzTWFzaykpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmJhbmQtPmNoYW5uZWxCVyA8IDIwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgVGVtcG9yYXJ5IGRpc2NhcmQgY2hhbm5lbCB0aGF0IEJXIDwgMjBNSHogKDUgb3IgMTBNSHopICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIE91ciBhcmNoaXRlY3R1cmUgZG9lcyBub3QgaW1wbGVtbnQgaXQgISEhICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJaWYgKChjID49IGNfbG8pICYmIChjIDw9IGNfaGkpKQorCQkJCQl7CisJCQkJCSAgICBpY3YuY2hhbm5lbCA9IGM7CisJCQkJCSAgICBpY3YuY2hhbm5lbEZsYWdzID0gY20tPmZsYWdzOworCQkJCQkgICAgaWN2Lm1heFJlZ1R4UG93ZXIgPSBmYmFuZC0+cG93ZXJEZnM7CisJCQkJCSAgICBpZiAoZmJhbmQtPnVzZVBhc3NTY2FuICYgcmQtPnBzY2FuKQorCQkJCQkgICAgCWljdi5jaGFubmVsRmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworCQkJCQkgICAgZWxzZQorCQkJCQkgICAgCWljdi5jaGFubmVsRmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKwkJCQkJICAgIGlmIChmYmFuZC0+dXNlRGZzICYgcmQtPmRmc01hc2spCisJCQkJCSAgICAJaWN2LnByaXZGbGFncyA9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTOworCQkJCQkgICAgZWxzZQorCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgPSAwOworCisJCQkJCSAgICAvKiBGb3Igbm93IGRpc2FibGUgcmFkYXIgZm9yIEZDQzMgKi8KKwkJCQkJICAgIGlmIChmYmFuZC0+dXNlRGZzICYgcmQtPmRmc01hc2sgJiBERlNfRkNDMykKKwkJCQkJICAgIHsKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzICY9IH5aTV9SRUdfRkxBR19DSEFOTkVMX0RGUzsKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzIHw9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTX0NMRUFSOworCQkJCQkgICAgfQorCisJCQkJCSAgICBpZihyZC0+ZmxhZ3MgJiBMSU1JVF9GUkFNRV80TVMpCisJCQkJCSAgICAJaWN2LnByaXZGbGFncyB8PSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUjsKKworCQkJCQkgICAgaWN2Lm1pblR4UG93ZXIgPSAwOworCQkJCQkgICAgaWN2Lm1heFR4UG93ZXIgPSAwOworCisgICAgICAgIAkJCSAgICB6bV9hc3NlcnQobmV4dCA8IDYwKTsKKworCQkJCQkgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbbmV4dCsrXSA9IGljdjsKKwkJCQkgICAgfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwl9CisJd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQgPSBuZXh0OworCisgICAgI2lmIDAKKyAgICB7CisgICAgICAgIC8qIGRlYnVnIHByaW50ICovCisgICAgICAgIHUzMl90IGk7CisgICAgICAgIERiZ1ByaW50KCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICBEYmdQcmludCgiemZIcEdldFJlZ3VsYXRpb25UYWJsZSBwcmludCBhbGwgY2hhbm5lbCBpbmZvIHJlZ2luY29kZSA9IDB4JXhcbiIsIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSk7CisgICAgICAgIERiZ1ByaW50KCJpbmRleCAgY2hhbm5lbCAgY2hhbm5lbEZsYWdzICAgbWF4UmVnVHhQb3dlciAgcHJpdkZsYWdzICB1c2VERlNcbiIpOworCisgICAgICAgIGZvciAoaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIERiZ1ByaW50KCIlMDJkICAgICAgICVkICAgICAgICAgJTA0eCAgICAgICAgICAgJTAyZCAgICAgICAgJXggICAgICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzICYgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlMpOworICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgdTE2X3QgY19sbyA9IDIwMDAsIGNfaGkgPSA2MDAwOyAvL2RlZmF1bHQgY2hhbm5lbCBpcyBhbGwgZW5hYmxlCisgICAgdThfdCBpc29OYW1lWzNdID0geydOJywgJ0EnLCAwfTsKKworICAgIHpmQ29yZVNldElzb05hbWUoZGV2LCBpc29OYW1lKTsKKworICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoZGV2LCByZWdpb25Db2RlLCBjX2xvLCBjX2hpKTsKK30KKwordm9pZCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoemRldl90KiBkZXYsIHUxNl90IENvdW50cnlDb2RlKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgY19sbyA9IDIwMDAsIGNfaGkgPSA2MDAwOyAvL2RlZmF1bHQgY2hhbm5lbCBpcyBhbGwgZW5hYmxlCisgICAgdTE2X3QgUmVnRG9tYWluOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChDb3VudHJ5Q29kZSA9PSBhbGxDb3VudHJpZXNbaV0uY291bnRyeUNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlZ0RvbWFpbiA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOworCisgICAgICAgICAgICAvLyByZWFkIHRoZSBBQ1UgY291bnRyeSBjb2RlIGZyb20gRUVQUk9NCisgICAgICAgICAgICB6ZkNvcmVTZXRJc29OYW1lKGRldiwgKHU4X3QqKWFsbENvdW50cmllc1tpXS5pc29OYW1lKTsKKworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2dfcygiQ1dZIC0gQ291bnRyeSBOYW1lID0gIiwgYWxsQ291bnRyaWVzW2ldLm5hbWUpOworCisgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlICE9IFJlZ0RvbWFpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIENoYW5nZSByZWd1bGF0b3J5IHRhYmxlIik7CisKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgUmVnRG9tYWluLCBjX2xvLCBjX2hpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bV9kZWJ1Z19tc2cxKCJJbnZhbGlkIENvdW50cnlDb2RlID0gIiwgQ291bnRyeUNvZGUpOworfQorCit1OF90IHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tSVNPKHpkZXZfdCogZGV2LCB1OF90ICpjb3VudHJ5SW5mbywgdThfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBSZWdEb21haW47CisgICAgdTE2X3QgY19sbyA9IDIwMDAsIGNfaGkgPSA2MDAwOyAvL2RlZmF1bHQgY2hhbm5lbCBpcyBhbGwgZW5hYmxlCisgICAgLy91OF90IHN0ckxlbiA9IDI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKGNvdW50cnlJbmZvWzRdICE9IDB4MjApCisgICAgeyAvLyB3aXRoIChJKW5kb29yLyhPKXV0ZG9vciBpbmZvCisgICAgICAgIC8vc3RyTGVuID0gMzsKKyAgICB9CisgICAgLy96bV9kZWJ1Z19tc2dfcygiRGVzaXJlZCBpc28gbmFtZSA9ICIsIGlzb05hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykKKyAgICB7CisgICAgICAgIC8vem1fZGVidWdfbXNnX3MoIkN1cnJlbnQgaXNvIG5hbWUgPSAiLCBhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSk7CisgICAgICAgIGlmICh6Zk1lbW9yeUlzRXF1YWwoKHU4X3QgKilhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSwgKHU4X3QgKikmY291bnRyeUluZm9bMl0sIGxlbmd0aC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9EYmdQcmludCgiU2V0IGN1cnJlbnQgaXNvIG5hbWUgPSAlc1xuIiwgYWxsQ291bnRyaWVzW2ldLmlzb05hbWUpOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJpc28gbmFtZSBoaXQhISIpOworCisgICAgICAgICAgICBSZWdEb21haW4gPSBhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bTsKKworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSAhPSBSZWdEb21haW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZShkZXYsIFJlZ0RvbWFpbiwgY19sbywgY19oaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vd2hpbGUgKGluZGV4IDwgKGNvdW50cnlJbmZvWzFdKzIpKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgaWYgKGNvdW50cnlJbmZvW2luZGV4XSA8PSAxNCkKKyAgICAgICAgICAgIC8vICB7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDIuNEdIeiBsb3cgYm91bmRhcnkgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIC8vICAgICAgICBjaCA9IGNvdW50cnlJbmZvW2luZGV4XTsKKyAgICAgICAgICAgIC8vICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19sbyA9IFpNX0NIX0dfMTQ7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gWk1fQ0hfR18xICsgKGNoIC0gMSkgKiA1OworICAgICAgICAgICAgLy8gICAgICAgIC8qIGNhbGN1bGF0ZSAyLjRHSHogaGlnaCBib3VuZGFyeSBjaGFubmVsIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgLy8gICAgICAgIGNoID0gY291bnRyeUluZm9baW5kZXhdICsgY291bnRyeUluZm9baW5kZXggKyAxXSAtIDE7CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCBjaCA9PSAxNCApCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfaGkgPSBaTV9DSF9HXzE0OworICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19oaSA9IFpNX0NIX0dfMSArIChjaCAtIDEpICogNTsKKyAgICAgICAgICAgIC8vICB9CisgICAgICAgICAgICAvLyAgZWxzZQorICAgICAgICAgICAgLy8gIHsKKyAgICAgICAgICAgIC8vICAgICAgICAvKiBjYWxjdWxhdGUgNUdIeiBsb3cgYm91bmRhcnkgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIC8vICAgICAgICBjaCA9IGNvdW50cnlJbmZvW2luZGV4XTsKKyAgICAgICAgICAgIC8vICAgICAgICBpZiAoIChjaCA+PSAxODQpJiYoY2ggPD0gMTk2KSApCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfbG8gPSA0MDAwICsgY2gqNTsKKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfbG8gPSA1MDAwICsgY2gqNTsKKyAgICAgICAgICAgIC8vICAgICAgICAvKiBjYWxjdWxhdGUgNUdIeiBoaWdoIGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF0gKyBjb3VudHJ5SW5mb1tpbmRleCArIDFdIC0gMTsKKyAgICAgICAgICAgIC8vICAgICAgICBpZiAoIChjaCA+PSAxODQpJiYoY2ggPD0gMTk2KSApCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfaGkgPSA0MDAwICsgY2gqNTsKKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfaGkgPSA1MDAwICsgY2gqNTsKKyAgICAgICAgICAgIC8vICB9CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoZGV2LCBSZWdEb21haW4sIGNfbG8sIGNfaGkpOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICBpbmRleCs9MzsKKyAgICAgICAgICAgIC8vfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL3ptX2RlYnVnX21zZ19zKCJJbnZhbGlkIGlzbyBuYW1lID0gIiwgJmNvdW50cnlJbmZvWzJdKTsKKyAgICByZXR1cm4gMTsKK30KKworY29uc3QgY2hhciogemZIcEdldGlzb05hbWVmcm9tcmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE4oYWxsQ291bnRyaWVzKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtID09IHJlZ2lvbkNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhbGxDb3VudHJpZXNbaV0uaXNvTmFtZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBubyBtYXRjaGluZyBpdGVtLCByZXR1cm4gZGVmYXVsdCAqLworICAgIHJldHVybiBhbGxDb3VudHJpZXNbMF0uaXNvTmFtZTsKK30KKwordTE2X3QgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUpCit7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCByZWdpb25Db2RlOworCisgICAgLyogaWYgbm8gbWF0Y2hpbmcgaXRlbSwgcmV0dXJuIGRlZmF1bHQgKi8KKyAgICByZWdpb25Db2RlID0gREVGX1JFR0RNTjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6Zk1lbW9yeUlzRXF1YWwoKHU4X3QgKilhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSwgY291bnRyeUlzb05hbWUsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25Db2RlID0gYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZWdpb25Db2RlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCAgICAgICovCisvKiAgICAgIERlbGV0ZSBBbGxvdyBDaGFubmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiAgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmcmVxIDogZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2hhby1XZW4gWWFuZyAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4zICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBEZWxldGVBbGxvd0NoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdTE2X3QgaSwgYmFuZEluZGV4ID0gMDsKKyAgICB1MTZfdCBkZnM1R0JhbmRbXVsyXSA9IHt7NTE1MCwgNTI0MH0sIHs1MjYwLCA1MzUwfSwgezU0NTAsIDU3MDB9LCB7NTcyNSwgNTgyNX19OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8qIEZpbmQgd2hpY2ggYmFuZCBkb2VzIHRoaXMgZnJlcXVlbmN5IGJlbG9uZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBpZiAoKGZyZXEgPj0gZGZzNUdCYW5kW2ldWzBdKSAmJiAoZnJlcSA8PSBkZnM1R0JhbmRbaV1bMV0pKQorICAgICAgICAgICAgYmFuZEluZGV4ID0gaSArIDE7CisgICAgfQorCisgICAgaWYgKGJhbmRJbmRleCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogMi40RywgZG9uJ3QgY2FyZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmFuZEluZGV4LS07CisgICAgfQorICAgIC8qIFNldCBhbGwgY2hhbm5lbHMgaW4gdGhpcyBiYW5kIHRvIHBhc3NpdmUgc2NhbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID49IGRmczVHQmFuZFtiYW5kSW5kZXhdWzBdKSAmJgorICAgICAgICAgICAgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPD0gZGZzNUdCYW5kW2JhbmRJbmRleF1bMV0pKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBjaGFubmVsIGlzIG5vdCBwYXNzaXZlLCBzZXQgaXQgdG8gYmUgcGFzc2l2ZSBhbmQgbWFyayBpdCAqLworICAgICAgICAgICAgaWYgKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbEZsYWdzIHw9CisgICAgICAgICAgICAgICAgICAgICAgICAoWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFIHwgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBBZGRBbGxvd0NoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdTE2X3QgaSwgaiwgYXJyYXlJbmRleDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICggaSA9PSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbal0uY2hhbm5lbCA+IGZyZXEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGFkZCBmcmVxdWVuY3kgPSAiLCBmcmVxKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBjaGFubmVsIGFycmF5IGluZGV4ID0gIiwgaik7CisKKyAgICAgICAgYXJyYXlJbmRleCA9IGo7CisKKyAgICAgICAgaWYgKGFycmF5SW5kZXggPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGogPiBhcnJheUluZGV4OyBqLS0pCisgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbal0gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtqIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbYXJyYXlJbmRleF0uY2hhbm5lbCA9IGZyZXE7CisKKyAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZIcElzRGZzQ2hhbm5lbE5DUyh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGZsYWcgPSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUzsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgiREZTOmZyZXE9JWQsIGNoYW49JWQiLCBmcmVxLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsKTsKKyAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxhZyA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFnczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChmbGFnICYgKFpNX1JFR19GTEFHX0NIQU5ORUxfREZTfFpNX1JFR19GTEFHX0NIQU5ORUxfREZTX0NMRUFSKSk7Cit9CisKK3UxNl90IHpmSHBJc0Rmc0NoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdThfdCBmbGFnID0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgiREZTOmZyZXE9JWQsIGNoYW49JWQiLCBmcmVxLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsKTsKKyAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxhZyA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFnczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiAoZmxhZyAmIChaTV9SRUdfRkxBR19DSEFOTkVMX0RGU3xaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUikpOworfQorCit1MTZfdCB6ZkhwSXNBbGxvd2VkQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZIcEZpbmRGaXJzdE5vbkRmc0NoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGFCYW5kKQoreworICAgIHUxNl90IGNoYW4gPSAyNDEyOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzICYgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhQmFuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFuID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW4gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGNoYW47Cit9CisKKworLyogcG9ydGluZyBmcm9tIEFDVSAqLworLyogc2F2ZSBSZWd1bGF0b3J5RG9tYWluIGluIGhwcml2ICovCit1OF90IHpmSHBHZXRSZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAod2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBOT19FTlVNUkQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZDQzFfRkNDQToKKyAgICAgICAgY2FzZSBGQ0MxX1dPUkxEOgorICAgICAgICBjYXNlIEZDQzRfRkNDQToKKyAgICAgICAgY2FzZSBGQ0M1X0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDMl9XT1JMRDoKKyAgICAgICAgY2FzZSBGQ0MyX0VUU0lDOgorICAgICAgICBjYXNlIEZDQzNfRkNDQToKKyAgICAgICAgY2FzZSBGQ0MzX1dPUkxEOgorICAgICAgICBjYXNlIEZDQzE6CisgICAgICAgIGNhc2UgRkNDMjoKKyAgICAgICAgY2FzZSBGQ0MzOgorICAgICAgICBjYXNlIEZDQzQ6CisgICAgICAgIGNhc2UgRkNDNToKKyAgICAgICAgY2FzZSBGQ0NBOgorICAgICAgICAgICAgcmV0dXJuIDB4MTA7Ly9XR19BTUVSSUNBUyBET1QxMV9SRUdfRE9NQUlOX0ZDQyAgVW5pdGVkIFN0YXRlcworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGQ0MyX0ZDQ0E6CisgICAgICAgICAgICByZXR1cm4gMHgyMDsvL0RPVDExX1JFR19ET01BSU5fRE9DICBDYW5hZGEKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVRTSTFfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSTNfRVRTSUE6CisgICAgICAgIGNhc2UgRVRTSTJfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSTNfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSTRfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSTRfRVRTSUM6CisgICAgICAgIGNhc2UgRVRTSTVfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSTZfV09STEQ6CisgICAgICAgIGNhc2UgRVRTSV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVFNJMToKKyAgICAgICAgY2FzZSBFVFNJMjoKKyAgICAgICAgY2FzZSBFVFNJMzoKKyAgICAgICAgY2FzZSBFVFNJNDoKKyAgICAgICAgY2FzZSBFVFNJNToKKyAgICAgICAgY2FzZSBFVFNJNjoKKyAgICAgICAgY2FzZSBFVFNJQToKKyAgICAgICAgY2FzZSBFVFNJQjoKKyAgICAgICAgY2FzZSBFVFNJQzoKKyAgICAgICAgICAgIHJldHVybiAweDMwOy8vV0dfRU1FQSBET1QxMV9SRUdfRE9NQUlOX0VUU0kgIE1vc3Qgb2YgRXVyb3BlCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1LSzFfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxX01LS0I6CisgICAgICAgIGNhc2UgTUtLMl9NS0tBOgorICAgICAgICBjYXNlIE1LSzFfRkNDQToKKyAgICAgICAgY2FzZSBNS0sxX01LS0ExOgorICAgICAgICBjYXNlIE1LSzFfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLMV9NS0tDOgorICAgICAgICBjYXNlIE1LSzNfTUtLQjoKKyAgICAgICAgY2FzZSBNS0szX01LS0EyOgorICAgICAgICBjYXNlIE1LSzNfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s0X01LS0I6CisgICAgICAgIGNhc2UgTUtLNF9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0s0X01LS0M6CisgICAgICAgIGNhc2UgTUtLNV9NS0tCOgorICAgICAgICBjYXNlIE1LSzVfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLNV9NS0tDOgorICAgICAgICBjYXNlIE1LSzZfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s2X01LS0EyOgorICAgICAgICBjYXNlIE1LSzZfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s3X01LS0I6CisgICAgICAgIGNhc2UgTUtLN19NS0tBOgorICAgICAgICBjYXNlIE1LSzdfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s4X01LS0I6CisgICAgICAgIGNhc2UgTUtLOF9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0s4X01LS0M6CisgICAgICAgIGNhc2UgTUtLNl9NS0tBMToKKyAgICAgICAgY2FzZSBNS0s2X0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLN19NS0tBMToKKyAgICAgICAgY2FzZSBNS0s3X0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLOV9GQ0NBOgorICAgICAgICBjYXNlIE1LSzlfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLOV9NS0tDOgorICAgICAgICBjYXNlIE1LSzlfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLMTBfRkNDQToKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tBMToKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tDOgorICAgICAgICBjYXNlIE1LSzEwX01LS0EyOgorICAgICAgICBjYXNlIE1LSzExX01LS0E6CisgICAgICAgIGNhc2UgTUtLMTFfRkNDQToKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tBMToKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tDOgorICAgICAgICBjYXNlIE1LSzExX01LS0EyOgorICAgICAgICBjYXNlIE1LSzEyX01LS0E6CisgICAgICAgIGNhc2UgTUtLMTJfRkNDQToKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tBMToKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tDOgorICAgICAgICBjYXNlIE1LSzEyX01LS0EyOgorICAgICAgICBjYXNlIE1LSzNfTUtLQToKKyAgICAgICAgY2FzZSBNS0szX01LS0ExOgorICAgICAgICBjYXNlIE1LSzNfRkNDQToKKyAgICAgICAgY2FzZSBNS0s0X01LS0E6CisgICAgICAgIGNhc2UgTUtLNF9NS0tBMToKKyAgICAgICAgY2FzZSBNS0s0X0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLOV9NS0tBOgorICAgICAgICBjYXNlIE1LSzEwX01LS0E6CisgICAgICAgIGNhc2UgTUtLMToKKyAgICAgICAgY2FzZSBNS0syOgorICAgICAgICBjYXNlIE1LSzM6CisgICAgICAgIGNhc2UgTUtLNDoKKyAgICAgICAgY2FzZSBNS0s1OgorICAgICAgICBjYXNlIE1LSzY6CisgICAgICAgIGNhc2UgTUtLNzoKKyAgICAgICAgY2FzZSBNS0s4OgorICAgICAgICBjYXNlIE1LSzk6CisgICAgICAgIGNhc2UgTUtLMTA6CisgICAgICAgIGNhc2UgTUtLMTE6CisgICAgICAgIGNhc2UgTUtLMTI6CisgICAgICAgIGNhc2UgTUtLQToKKyAgICAgICAgY2FzZSBNS0tDOgorICAgICAgICAgICAgcmV0dXJuIDB4NDA7Ly9XR19KQVBBTiBET1QxMV9SRUdfRE9NQUlOX01LSyAgSmFwYW4KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDB4RkY7Ly8gRGlkbid0IGlucHV0IFJlZ0RtbiBieSBtZWFuIHRvIGRpc3Rpbmd1aXNoIGJ5IGN1c3RvbWVyCisKK30KKworCit2b2lkIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdThfdCBkaXNhYmxlRmxhZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworICAgIGhwUHJpdi0+ZGlzYWJsZURmc0NoID0gZGlzYWJsZUZsYWc7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhjNzNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmgKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogaHByZWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBSZWd1bGF0b3J5IFRhYmxlIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9IUFJFR19ICisjZGVmaW5lIF9IUFJFR19ICisKK3R5cGVkZWYgdTE2X3QgSEFMX0NUUllfQ09ERTsJCS8qIGNvdW50cnkgY29kZSAqLwordHlwZWRlZiB1MTZfdCBIQUxfUkVHX0RPTUFJTjsJCS8qIHJlZ3VsYXRvcnkgZG9tYWluIGNvZGUgKi8KK3R5cGVkZWYgZW51bSB7CisJQUhfRkFMU0UgPSAwLAkJLyogTkI6IGxvdHMgb2YgY29kZSBhc3N1bWVzIGZhbHNlIGlzIHplcm8gKi8KKwlBSF9UUlVFICA9IDEsCit9IEhBTF9CT09MOworCisKKy8qCisgKiBDb3VudHJ5L1JlZ2lvbiBDb2RlcyBmcm9tIE1TIFdJTk5MUy5ICisgKiBOdW1iZXJpbmcgZnJvbSBJU08gMzE2NgorICovCitlbnVtIENvdW50cnlDb2RlIHsKKyAgICBDVFJZX0FMQkFOSUEgICAgICAgICAgICAgID0gOCwgICAgICAgLyogQWxiYW5pYSAqLworICAgIENUUllfQUxHRVJJQSAgICAgICAgICAgICAgPSAxMiwgICAgICAvKiBBbGdlcmlhICovCisgICAgQ1RSWV9BUkdFTlRJTkEgICAgICAgICAgICA9IDMyLCAgICAgIC8qIEFyZ2VudGluYSAqLworICAgIENUUllfQVJNRU5JQSAgICAgICAgICAgICAgPSA1MSwgICAgICAvKiBBcm1lbmlhICovCisgICAgQ1RSWV9BVVNUUkFMSUEgICAgICAgICAgICA9IDM2LCAgICAgIC8qIEF1c3RyYWxpYSAqLworICAgIENUUllfQVVTVFJJQSAgICAgICAgICAgICAgPSA0MCwgICAgICAvKiBBdXN0cmlhICovCisgICAgQ1RSWV9BWkVSQkFJSkFOICAgICAgICAgICA9IDMxLCAgICAgIC8qIEF6ZXJiYWlqYW4gKi8KKyAgICBDVFJZX0JBSFJBSU4gICAgICAgICAgICAgID0gNDgsICAgICAgLyogQmFocmFpbiAqLworICAgIENUUllfQkVMQVJVUyAgICAgICAgICAgICAgPSAxMTIsICAgICAvKiBCZWxhcnVzICovCisgICAgQ1RSWV9CRUxHSVVNICAgICAgICAgICAgICA9IDU2LCAgICAgIC8qIEJlbGdpdW0gKi8KKyAgICBDVFJZX0JFTElaRSAgICAgICAgICAgICAgID0gODQsICAgICAgLyogQmVsaXplICovCisgICAgQ1RSWV9CT0xJVklBICAgICAgICAgICAgICA9IDY4LCAgICAgIC8qIEJvbGl2aWEgKi8KKyAgICBDVFJZX0JPU05JQSAgICAgICAgICAgICAgID0gNzAsICAgICAgLyogQm9zbmlhICovCisgICAgQ1RSWV9CUkFaSUwgICAgICAgICAgICAgICA9IDc2LCAgICAgIC8qIEJyYXppbCAqLworICAgIENUUllfQlJVTkVJX0RBUlVTU0FMQU0gICAgPSA5NiwgICAgICAvKiBCcnVuZWkgRGFydXNzYWxhbSAqLworICAgIENUUllfQlVMR0FSSUEgICAgICAgICAgICAgPSAxMDAsICAgICAvKiBCdWxnYXJpYSAqLworICAgIENUUllfQ0FOQURBICAgICAgICAgICAgICAgPSAxMjQsICAgICAvKiBDYW5hZGEgKi8KKyAgICBDVFJZX0NISUxFICAgICAgICAgICAgICAgID0gMTUyLCAgICAgLyogQ2hpbGUgKi8KKyAgICBDVFJZX0NISU5BICAgICAgICAgICAgICAgID0gMTU2LCAgICAgLyogUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEgKi8KKyAgICBDVFJZX0NPTE9NQklBICAgICAgICAgICAgID0gMTcwLCAgICAgLyogQ29sb21iaWEgKi8KKyAgICBDVFJZX0NPU1RBX1JJQ0EgICAgICAgICAgID0gMTg4LCAgICAgLyogQ29zdGEgUmljYSAqLworICAgIENUUllfQ1JPQVRJQSAgICAgICAgICAgICAgPSAxOTEsICAgICAvKiBDcm9hdGlhICovCisgICAgQ1RSWV9DWVBSVVMgICAgICAgICAgICAgICA9IDE5NiwgICAgIC8qIEN5cHJ1cyAqLworICAgIENUUllfQ1pFQ0ggICAgICAgICAgICAgICAgPSAyMDMsICAgICAvKiBDemVjaCBSZXB1YmxpYyAqLworICAgIENUUllfREVOTUFSSyAgICAgICAgICAgICAgPSAyMDgsICAgICAvKiBEZW5tYXJrICovCisgICAgQ1RSWV9ET01JTklDQU5fUkVQVUJMSUMgICA9IDIxNCwgICAgIC8qIERvbWluaWNhbiBSZXB1YmxpYyAqLworICAgIENUUllfRUNVQURPUiAgICAgICAgICAgICAgPSAyMTgsICAgICAvKiBFY3VhZG9yICovCisgICAgQ1RSWV9FR1lQVCAgICAgICAgICAgICAgICA9IDgxOCwgICAgIC8qIEVneXB0ICovCisgICAgQ1RSWV9FTF9TQUxWQURPUiAgICAgICAgICA9IDIyMiwgICAgIC8qIEVsIFNhbHZhZG9yICovCisgICAgQ1RSWV9FU1RPTklBICAgICAgICAgICAgICA9IDIzMywgICAgIC8qIEVzdG9uaWEgKi8KKyAgICBDVFJZX0ZBRVJPRV9JU0xBTkRTICAgICAgID0gMjM0LCAgICAgLyogRmFlcm9lIElzbGFuZHMgKi8KKyAgICBDVFJZX0ZJTkxBTkQgICAgICAgICAgICAgID0gMjQ2LCAgICAgLyogRmlubGFuZCAqLworICAgIENUUllfRlJBTkNFICAgICAgICAgICAgICAgPSAyNTAsICAgICAvKiBGcmFuY2UgKi8KKyAgICBDVFJZX0ZSQU5DRTIgICAgICAgICAgICAgID0gMjU1LCAgICAgLyogRnJhbmNlMiAqLworICAgIENUUllfR0VPUkdJQSAgICAgICAgICAgICAgPSAyNjgsICAgICAvKiBHZW9yZ2lhICovCisgICAgQ1RSWV9HRVJNQU5ZICAgICAgICAgICAgICA9IDI3NiwgICAgIC8qIEdlcm1hbnkgKi8KKyAgICBDVFJZX0dSRUVDRSAgICAgICAgICAgICAgID0gMzAwLCAgICAgLyogR3JlZWNlICovCisgICAgQ1RSWV9HVUFURU1BTEEgICAgICAgICAgICA9IDMyMCwgICAgIC8qIEd1YXRlbWFsYSAqLworICAgIENUUllfSE9ORFVSQVMgICAgICAgICAgICAgPSAzNDAsICAgICAvKiBIb25kdXJhcyAqLworICAgIENUUllfSE9OR19LT05HICAgICAgICAgICAgPSAzNDQsICAgICAvKiBIb25nIEtvbmcgUy5BLlIuLCBQLlIuQy4gKi8KKyAgICBDVFJZX0hVTkdBUlkgICAgICAgICAgICAgID0gMzQ4LCAgICAgLyogSHVuZ2FyeSAqLworICAgIENUUllfSUNFTEFORCAgICAgICAgICAgICAgPSAzNTIsICAgICAvKiBJY2VsYW5kICovCisgICAgQ1RSWV9JTkRJQSAgICAgICAgICAgICAgICA9IDM1NiwgICAgIC8qIEluZGlhICovCisgICAgQ1RSWV9JTkRPTkVTSUEgICAgICAgICAgICA9IDM2MCwgICAgIC8qIEluZG9uZXNpYSAqLworICAgIENUUllfSVJBTiAgICAgICAgICAgICAgICAgPSAzNjQsICAgICAvKiBJcmFuICovCisgICAgQ1RSWV9JUkFRICAgICAgICAgICAgICAgICA9IDM2OCwgICAgIC8qIElyYXEgKi8KKyAgICBDVFJZX0lSRUxBTkQgICAgICAgICAgICAgID0gMzcyLCAgICAgLyogSXJlbGFuZCAqLworICAgIENUUllfSVNSQUVMICAgICAgICAgICAgICAgPSAzNzYsICAgICAvKiBJc3JhZWwgKi8KKyAgICBDVFJZX0lTUkFFTDIgICAgICAgICAgICAgID0gMzc3LCAgICAgLyogSXNyYWVsMiAqLworICAgIENUUllfSVRBTFkgICAgICAgICAgICAgICAgPSAzODAsICAgICAvKiBJdGFseSAqLworICAgIENUUllfSkFNQUlDQSAgICAgICAgICAgICAgPSAzODgsICAgICAvKiBKYW1haWNhICovCisgICAgQ1RSWV9KQVBBTiAgICAgICAgICAgICAgICA9IDM5MiwgICAgIC8qIEphcGFuICovCisgICAgQ1RSWV9KQVBBTjEgICAgICAgICAgICAgICA9IDM5MywgICAgIC8qIEphcGFuIChKUDEpICovCisgICAgQ1RSWV9KQVBBTjIgICAgICAgICAgICAgICA9IDM5NCwgICAgIC8qIEphcGFuIChKUDApICovCisgICAgQ1RSWV9KQVBBTjMgICAgICAgICAgICAgICA9IDM5NSwgICAgIC8qIEphcGFuIChKUDEtMSkgKi8KKyAgICBDVFJZX0pBUEFONCAgICAgICAgICAgICAgID0gMzk2LCAgICAgLyogSmFwYW4gKEpFMSkgKi8KKyAgICBDVFJZX0pBUEFONSAgICAgICAgICAgICAgID0gMzk3LCAgICAgLyogSmFwYW4gKEpFMikgKi8KKyAgICBDVFJZX0pBUEFONiAgICAgICAgICAgICAgID0gMzk5LCAgICAgLyogSmFwYW4gKEpQNikgKi8KKworICAgIENUUllfSkFQQU43CSAgICAgICAgICAgICAgPSA0MDA3LCAgICAvKiBKYXBhbiAoSjcpICovCisgICAgQ1RSWV9KQVBBTjgJICAgICAgICAgICAgICA9IDQwMDgsICAgIC8qIEphcGFuIChKOCkgKi8KKyAgICBDVFJZX0pBUEFOOSAgICAgICAgICAgICAgID0gNDAwOSwgICAgLyogSmFwYW4gKEo5KSAqLworCisgICAgQ1RSWV9KQVBBTjEwICAgICAgICAgICAgICA9IDQwMTAsICAgIC8qIEphcGFuIChKMTApICovCisgICAgQ1RSWV9KQVBBTjExICAgICAgICAgICAgICA9IDQwMTEsICAgIC8qIEphcGFuIChKMTEpICovCisgICAgQ1RSWV9KQVBBTjEyICAgICAgICAgICAgICA9IDQwMTIsICAgIC8qIEphcGFuIChKMTIpICovCisKKyAgICBDVFJZX0pBUEFOMTMgICAgICAgICAgICAgID0gNDAxMywgICAgLyogSmFwYW4gKEoxMykgKi8KKyAgICBDVFJZX0pBUEFOMTQgICAgICAgICAgICAgID0gNDAxNCwgICAgLyogSmFwYW4gKEoxNCkgKi8KKyAgICBDVFJZX0pBUEFOMTUgICAgICAgICAgICAgID0gNDAxNSwgICAgLyogSmFwYW4gKEoxNSkgKi8KKworICAgIENUUllfSkFQQU4xNiAgICAgICAgICAgICAgPSA0MDE2LCAgICAvKiBKYXBhbiAoSjE2KSAqLworICAgIENUUllfSkFQQU4xNyAgICAgICAgICAgICAgPSA0MDE3LCAgICAvKiBKYXBhbiAoSjE3KSAqLworICAgIENUUllfSkFQQU4xOCAgICAgICAgICAgICAgPSA0MDE4LCAgICAvKiBKYXBhbiAoSjE4KSAqLworCisgICAgQ1RSWV9KQVBBTjE5ICAgICAgICAgICAgICA9IDQwMTksICAgIC8qIEphcGFuIChKMTkpICovCisgICAgQ1RSWV9KQVBBTjIwICAgICAgICAgICAgICA9IDQwMjAsICAgIC8qIEphcGFuIChKMjApICovCisgICAgQ1RSWV9KQVBBTjIxICAgICAgICAgICAgICA9IDQwMjEsICAgIC8qIEphcGFuIChKMjEpICovCisKKyAgICBDVFJZX0pBUEFOMjIgICAgICAgICAgICAgID0gNDAyMiwgICAgLyogSmFwYW4gKEoyMikgKi8KKyAgICBDVFJZX0pBUEFOMjMgICAgICAgICAgICAgID0gNDAyMywgICAgLyogSmFwYW4gKEoyMykgKi8KKyAgICBDVFJZX0pBUEFOMjQgICAgICAgICAgICAgID0gNDAyNCwgICAgLyogSmFwYW4gKEoyNCkgKi8KKworICAgIENUUllfSkFQQU4yNSAgICAgICAgICAgICAgPSA0MDI1LCAgICAvKiBKYXBhbiAoSjI1KSAqLworICAgIENUUllfSkFQQU4yNiAgICAgICAgICAgICAgPSA0MDI2LCAgICAvKiBKYXBhbiAoSjI2KSAqLworICAgIENUUllfSkFQQU4yNyAgICAgICAgICAgICAgPSA0MDI3LCAgICAvKiBKYXBhbiAoSjI3KSAqLworCisgICAgQ1RSWV9KQVBBTjI4ICAgICAgICAgICAgICA9IDQwMjgsICAgIC8qIEphcGFuIChKMjgpICovCisgICAgQ1RSWV9KQVBBTjI5ICAgICAgICAgICAgICA9IDQwMjksICAgIC8qIEphcGFuIChKMjkpICovCisgICAgQ1RSWV9KQVBBTjMwICAgICAgICAgICAgICA9IDQwMzAsICAgIC8qIEphcGFuIChKMzApICovCisKKyAgICBDVFJZX0pBUEFOMzEgICAgICAgICAgICAgID0gNDAzMSwgICAgLyogSmFwYW4gKEozMSkgKi8KKyAgICBDVFJZX0pBUEFOMzIgICAgICAgICAgICAgID0gNDAzMiwgICAgLyogSmFwYW4gKEozMikgKi8KKyAgICBDVFJZX0pBUEFOMzMgICAgICAgICAgICAgID0gNDAzMywgICAgLyogSmFwYW4gKEozMykgKi8KKworICAgIENUUllfSkFQQU4zNCAgICAgICAgICAgICAgPSA0MDM0LCAgICAvKiBKYXBhbiAoSjM0KSAqLworICAgIENUUllfSkFQQU4zNSAgICAgICAgICAgICAgPSA0MDM1LCAgICAvKiBKYXBhbiAoSjM1KSAqLworICAgIENUUllfSkFQQU4zNiAgICAgICAgICAgICAgPSA0MDM2LCAgICAvKiBKYXBhbiAoSjM2KSAqLworCisgICAgQ1RSWV9KQVBBTjM3ICAgICAgICAgICAgICA9IDQwMzcsICAgIC8qIEphcGFuIChKMzcpICovCisgICAgQ1RSWV9KQVBBTjM4ICAgICAgICAgICAgICA9IDQwMzgsICAgIC8qIEphcGFuIChKMzgpICovCisgICAgQ1RSWV9KQVBBTjM5ICAgICAgICAgICAgICA9IDQwMzksICAgIC8qIEphcGFuIChKMzkpICovCisKKyAgICBDVFJZX0pBUEFONDAgICAgICAgICAgICAgID0gNDA0MCwgICAgLyogSmFwYW4gKEo0MCkgKi8KKyAgICBDVFJZX0pBUEFONDEgICAgICAgICAgICAgID0gNDA0MSwgICAgLyogSmFwYW4gKEo0MSkgKi8KKyAgICBDVFJZX0pBUEFONDIgICAgICAgICAgICAgID0gNDA0MiwgICAgLyogSmFwYW4gKEo0MikgKi8KKyAgICBDVFJZX0pBUEFONDMgICAgICAgICAgICAgID0gNDA0MywgICAgLyogSmFwYW4gKEo0MykgKi8KKyAgICBDVFJZX0pBUEFONDQgICAgICAgICAgICAgID0gNDA0NCwgICAgLyogSmFwYW4gKEo0NCkgKi8KKyAgICBDVFJZX0pBUEFONDUgICAgICAgICAgICAgID0gNDA0NSwgICAgLyogSmFwYW4gKEo0NSkgKi8KKyAgICBDVFJZX0pBUEFONDYgICAgICAgICAgICAgID0gNDA0NiwgICAgLyogSmFwYW4gKEo0NikgKi8KKyAgICBDVFJZX0pBUEFONDcgICAgICAgICAgICAgID0gNDA0NywgICAgLyogSmFwYW4gKEo0NykgKi8KKyAgICBDVFJZX0pBUEFONDggICAgICAgICAgICAgID0gNDA0OCwgICAgLyogSmFwYW4gKEo0OCkgKi8KKyAgICBDVFJZX0pBUEFONDkgICAgICAgICAgICAgID0gNDA0OSwgICAgLyogSmFwYW4gKEo0OSkgKi8KKworICAgIENUUllfSkFQQU41MCAgICAgICAgICAgICAgPSA0MDUwLCAgICAvKiBKYXBhbiAoSjUwKSAqLworICAgIENUUllfSkFQQU41MSAgICAgICAgICAgICAgPSA0MDUxLCAgICAvKiBKYXBhbiAoSjUxKSAqLworICAgIENUUllfSkFQQU41MiAgICAgICAgICAgICAgPSA0MDUyLCAgICAvKiBKYXBhbiAoSjUyKSAqLworICAgIENUUllfSkFQQU41MyAgICAgICAgICAgICAgPSA0MDUzLCAgICAvKiBKYXBhbiAoSjUzKSAqLworICAgIENUUllfSkFQQU41NCAgICAgICAgICAgICAgPSA0MDU0LCAgICAvKiBKYXBhbiAoSjU0KSAqLworCisgICAgQ1RSWV9KT1JEQU4gICAgICAgICAgICAgICA9IDQwMCwgICAgIC8qIEpvcmRhbiAqLworICAgIENUUllfS0FaQUtIU1RBTiAgICAgICAgICAgPSAzOTgsICAgICAvKiBLYXpha2hzdGFuICovCisgICAgQ1RSWV9LRU5ZQSAgICAgICAgICAgICAgICA9IDQwNCwgICAgIC8qIEtlbnlhICovCisgICAgQ1RSWV9LT1JFQV9OT1JUSCAgICAgICAgICA9IDQwOCwgICAgIC8qIE5vcnRoIEtvcmVhICovCisgICAgQ1RSWV9LT1JFQV9ST0MgICAgICAgICAgICA9IDQxMCwgICAgIC8qIFNvdXRoIEtvcmVhICovCisgICAgQ1RSWV9LT1JFQV9ST0MyICAgICAgICAgICA9IDQxMSwgICAgIC8qIFNvdXRoIEtvcmVhICovCisgICAgQ1RSWV9LT1JFQV9ST0MzICAgICAgICAgICA9IDQxMiwgICAgIC8qIFNvdXRoIEtvcmVhICovCisgICAgQ1RSWV9LVVdBSVQgICAgICAgICAgICAgICA9IDQxNCwgICAgIC8qIEt1d2FpdCAqLworICAgIENUUllfTEFUVklBICAgICAgICAgICAgICAgPSA0MjgsICAgICAvKiBMYXR2aWEgKi8KKyAgICBDVFJZX0xFQkFOT04gICAgICAgICAgICAgID0gNDIyLCAgICAgLyogTGViYW5vbiAqLworICAgIENUUllfTElCWUEgICAgICAgICAgICAgICAgPSA0MzQsICAgICAvKiBMaWJ5YSAqLworICAgIENUUllfTElFQ0hURU5TVEVJTiAgICAgICAgPSA0MzgsICAgICAvKiBMaWVjaHRlbnN0ZWluICovCisgICAgQ1RSWV9MSVRIVUFOSUEgICAgICAgICAgICA9IDQ0MCwgICAgIC8qIExpdGh1YW5pYSAqLworICAgIENUUllfTFVYRU1CT1VSRyAgICAgICAgICAgPSA0NDIsICAgICAvKiBMdXhlbWJvdXJnICovCisgICAgQ1RSWV9NQUNBVSAgICAgICAgICAgICAgICA9IDQ0NiwgICAgIC8qIE1hY2F1ICovCisgICAgQ1RSWV9NQUNFRE9OSUEgICAgICAgICAgICA9IDgwNywgICAgIC8qIHRoZSBGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhICovCisgICAgQ1RSWV9NQUxBWVNJQSAgICAgICAgICAgICA9IDQ1OCwgICAgIC8qIE1hbGF5c2lhICovCisgICAgQ1RSWV9NQUxUQQkgICAgICAgICAgICAgID0gNDcwLCAgICAgLyogTWFsdGEgKi8KKyAgICBDVFJZX01FWElDTyAgICAgICAgICAgICAgID0gNDg0LCAgICAgLyogTWV4aWNvICovCisgICAgQ1RSWV9NT05BQ08gICAgICAgICAgICAgICA9IDQ5MiwgICAgIC8qIFByaW5jaXBhbGl0eSBvZiBNb25hY28gKi8KKyAgICBDVFJZX01PUk9DQ08gICAgICAgICAgICAgID0gNTA0LCAgICAgLyogTW9yb2NjbyAqLworICAgIENUUllfTkVUSEVSTEFORFMgICAgICAgICAgPSA1MjgsICAgICAvKiBOZXRoZXJsYW5kcyAqLworICAgIENUUllfTkVUSEVSTEFORFNfQU5UICAgICAgPSA1MzAsICAgICAvKiBOZXRoZXJsYW5kcy1BbnRlbGxpcyAqLworICAgIENUUllfTkVXX1pFQUxBTkQgICAgICAgICAgPSA1NTQsICAgICAvKiBOZXcgWmVhbGFuZCAqLworICAgIENUUllfTklDQVJBR1VBICAgICAgICAgICAgPSA1NTgsICAgICAvKiBOaWNhcmFndWEgKi8KKyAgICBDVFJZX05PUldBWSAgICAgICAgICAgICAgID0gNTc4LCAgICAgLyogTm9yd2F5ICovCisgICAgQ1RSWV9PTUFOICAgICAgICAgICAgICAgICA9IDUxMiwgICAgIC8qIE9tYW4gKi8KKyAgICBDVFJZX1BBS0lTVEFOICAgICAgICAgICAgID0gNTg2LCAgICAgLyogSXNsYW1pYyBSZXB1YmxpYyBvZiBQYWtpc3RhbiAqLworICAgIENUUllfUEFOQU1BICAgICAgICAgICAgICAgPSA1OTEsICAgICAvKiBQYW5hbWEgKi8KKyAgICBDVFJZX1BBUkFHVUFZICAgICAgICAgICAgID0gNjAwLCAgICAgLyogUGFyYWd1YXkgKi8KKyAgICBDVFJZX1BFUlUgICAgICAgICAgICAgICAgID0gNjA0LCAgICAgLyogUGVydSAqLworICAgIENUUllfUEhJTElQUElORVMgICAgICAgICAgPSA2MDgsICAgICAvKiBSZXB1YmxpYyBvZiB0aGUgUGhpbGlwcGluZXMgKi8KKyAgICBDVFJZX1BPTEFORCAgICAgICAgICAgICAgID0gNjE2LCAgICAgLyogUG9sYW5kICovCisgICAgQ1RSWV9QT1JUVUdBTCAgICAgICAgICAgICA9IDYyMCwgICAgIC8qIFBvcnR1Z2FsICovCisgICAgQ1RSWV9QVUVSVE9fUklDTyAgICAgICAgICA9IDYzMCwgICAgIC8qIFB1ZXJ0byBSaWNvICovCisgICAgQ1RSWV9RQVRBUiAgICAgICAgICAgICAgICA9IDYzNCwgICAgIC8qIFFhdGFyICovCisgICAgQ1RSWV9ST01BTklBICAgICAgICAgICAgICA9IDY0MiwgICAgIC8qIFJvbWFuaWEgKi8KKyAgICBDVFJZX1JVU1NJQSAgICAgICAgICAgICAgID0gNjQzLCAgICAgLyogUnVzc2lhICovCisgICAgQ1RSWV9TQVVESV9BUkFCSUEgICAgICAgICA9IDY4MiwgICAgIC8qIFNhdWRpIEFyYWJpYSAqLworICAgIENUUllfU0VSQklBX01PTlQgICAgICAgICAgPSA4OTEsICAgICAvKiBTZXJiaWEgYW5kIE1vbnRlbmVncm8gKi8KKyAgICBDVFJZX1NJTkdBUE9SRSAgICAgICAgICAgID0gNzAyLCAgICAgLyogU2luZ2Fwb3JlICovCisgICAgQ1RSWV9TTE9WQUtJQSAgICAgICAgICAgICA9IDcwMywgICAgIC8qIFNsb3ZhayBSZXB1YmxpYyAqLworICAgIENUUllfU0xPVkVOSUEgICAgICAgICAgICAgPSA3MDUsICAgICAvKiBTbG92ZW5pYSAqLworICAgIENUUllfU09VVEhfQUZSSUNBICAgICAgICAgPSA3MTAsICAgICAvKiBTb3V0aCBBZnJpY2EgKi8KKyAgICBDVFJZX1NQQUlOICAgICAgICAgICAgICAgID0gNzI0LCAgICAgLyogU3BhaW4gKi8KKyAgICBDVFJZX1NSSUxBTktBICAgICAgICAgICAgID0gMTQ0LCAgICAgLyogU3JpbGFua2EgKi8KKyAgICBDVFJZX1NXRURFTiAgICAgICAgICAgICAgID0gNzUyLCAgICAgLyogU3dlZGVuICovCisgICAgQ1RSWV9TV0lUWkVSTEFORCAgICAgICAgICA9IDc1NiwgICAgIC8qIFN3aXR6ZXJsYW5kICovCisgICAgQ1RSWV9TWVJJQSAgICAgICAgICAgICAgICA9IDc2MCwgICAgIC8qIFN5cmlhICovCisgICAgQ1RSWV9UQUlXQU4gICAgICAgICAgICAgICA9IDE1OCwgICAgIC8qIFRhaXdhbiAqLworICAgIENUUllfVEhBSUxBTkQgICAgICAgICAgICAgPSA3NjQsICAgICAvKiBUaGFpbGFuZCAqLworICAgIENUUllfVFJJTklEQURfWV9UT0JBR08gICAgPSA3ODAsICAgICAvKiBUcmluaWRhZCB5IFRvYmFnbyAqLworICAgIENUUllfVFVOSVNJQSAgICAgICAgICAgICAgPSA3ODgsICAgICAvKiBUdW5pc2lhICovCisgICAgQ1RSWV9UVVJLRVkgICAgICAgICAgICAgICA9IDc5MiwgICAgIC8qIFR1cmtleSAqLworICAgIENUUllfVUFFICAgICAgICAgICAgICAgICAgPSA3ODQsICAgICAvKiBVLkEuRS4gKi8KKyAgICBDVFJZX1VLUkFJTkUgICAgICAgICAgICAgID0gODA0LCAgICAgLyogVWtyYWluZSAqLworICAgIENUUllfVU5JVEVEX0tJTkdET00gICAgICAgPSA4MjYsICAgICAvKiBVbml0ZWQgS2luZ2RvbSAqLworICAgIENUUllfVU5JVEVEX1NUQVRFUyAgICAgICAgPSA4NDAsICAgICAvKiBVbml0ZWQgU3RhdGVzICovCisgICAgQ1RSWV9VTklURURfU1RBVEVTX0ZDQzQ5ICA9IDg0MiwgICAgIC8qIFVuaXRlZCBTdGF0ZXMgKFB1YmxpYyBTYWZldHkpKi8KKyAgICBDVFJZX1VSVUdVQVkgICAgICAgICAgICAgID0gODU4LCAgICAgLyogVXJ1Z3VheSAqLworICAgIENUUllfVVpCRUtJU1RBTiAgICAgICAgICAgPSA4NjAsICAgICAvKiBVemJla2lzdGFuICovCisgICAgQ1RSWV9WRU5FWlVFTEEgICAgICAgICAgICA9IDg2MiwgICAgIC8qIFZlbmV6dWVsYSAqLworICAgIENUUllfVklFVF9OQU0gICAgICAgICAgICAgPSA3MDQsICAgICAvKiBWaWV0IE5hbSAqLworICAgIENUUllfWUVNRU4gICAgICAgICAgICAgICAgPSA4ODcsICAgICAvKiBZZW1lbiAqLworICAgIENUUllfWklNQkFCV0UgICAgICAgICAgICAgPSA3MTYgICAgICAvKiBaaW1iYWJ3ZSAqLworfTsKKworLyogRW51bWVyYXRlZCBSZWd1bGF0b3J5IERvbWFpbiBJbmZvcm1hdGlvbiA4IGJpdCB2YWx1ZXMgaW5kaWNhdGUgdGhhdAorICogdGhlIHJlZ2RvbWFpbiBpcyByZWFsbHkgYSBwYWlyIG9mIHVuaXRhcnkgcmVnZG9tYWlucy4gIDEyIGJpdCB2YWx1ZXMKKyAqIGFyZSB0aGUgcmVhbCB1bml0YXJ5IHJlZ2RvbWFpbnMgYW5kIGFyZSB0aGUgb25seSBvbmVzIHdoaWNoIGhhdmUgdGhlCisgKiBmcmVxdWVuY3kgYml0bWFza3MgYW5kIGZsYWdzIHNldC4KKyAqLworZW51bSBFbnVtUmQgeworCS8qCisJICogVGhlIGZvbGxvd2luZyByZWd1bGF0b3J5IGRvbWFpbiBkZWZpbml0aW9ucyBhcmUKKwkgKiBmb3VuZCBpbiB0aGUgRUVQUk9NLiBFYWNoIHJlZ3VsYXRvcnkgZG9tYWluCisJICogY2FuIG9wZXJhdGUgaW4gZWl0aGVyIGEgNUdIeiBvciAyLjRHSHogd2lyZWxlc3MgbW9kZSBvcgorCSAqIGJvdGggNUdIeiBhbmQgMi40R0h6IHdpcmVsZXNzIG1vZGVzLgorCSAqIEluIGdlbmVyYWwsIHRoZSB2YWx1ZSBob2xkcyBubyBzcGVjaWFsCisJICogbWVhbmluZyBhbmQgaXMgdXNlZCB0byBkZWNvZGUgaW50byBlaXRoZXIgc3BlY2lmaWMKKwkgKiAyLjRHSHogb3IgNUdIeiB3aXJlbGVzcyBtb2RlIGZvciB0aGF0IHBhcnRpY3VsYXIKKwkgKiByZWd1bGF0b3J5IGRvbWFpbi4KKwkgKi8KKwlOT19FTlVNUkQJPSAweDAwLAorCU5VTEwxX1dPUkxECT0gMHgwMywJCS8qIEZvciAxMWItb25seSBjb3VudHJpZXMgKG5vIDExYSBhbGxvd2VkKSAqLworCU5VTEwxX0VUU0lCCT0gMHgwNywJCS8qIElzcmFlbCAqLworCU5VTEwxX0VUU0lDCT0gMHgwOCwKKwlGQ0MxX0ZDQ0EJPSAweDEwLAkJLyogVVNBICovCisJRkNDMV9XT1JMRAk9IDB4MTEsCQkvKiBIb25nIEtvbmcgKi8KKwlGQ0M0X0ZDQ0EJPSAweDEyLAkJLyogVVNBIC0gUHVibGljIFNhZmV0eSAqLworCUZDQzVfRkNDQQk9IDB4MTMsCQkvKiBVU0EgLSB3aXRoIG5vIERGUyAoVU5JSS0xICsgVU5JSS0zIG9ubHkpICovCisgIEZDQzZfRkNDQSAgICAgICA9IDB4MTQsICAgICAgICAgLyogQ2FuYWRhICovCisKKwlGQ0MyX0ZDQ0EJPSAweDIwLAkJLyogQ2FuYWRhICovCisJRkNDMl9XT1JMRAk9IDB4MjEsCQkvKiBBdXN0cmFsaWEgJiBISyAqLworCUZDQzJfRVRTSUMJPSAweDIyLAorICBGQ0M2X1dPUkxEICAgICAgPSAweDIzLCAgICAgICAgIC8qIEF1c3RyYWxpYSAqLworCisJRlJBTkNFX1JFUwk9IDB4MzEsCQkvKiBMZWdhY3kgRnJhbmNlIGZvciBPRU0gKi8KKwlGQ0MzX0ZDQ0EJPSAweDNBLAkJLyogVVNBICYgQ2FuYWRhIHcvNTQ3MCBiYW5kLCAxMWgsIERGUyBlbmFibGVkICovCisJRkNDM19XT1JMRAk9IDB4M0IsCQkvKiBVU0EgJiBDYW5hZGEgdy81NDcwIGJhbmQsIDExaCwgREZTIGVuYWJsZWQgKi8KKworCUVUU0kxX1dPUkxECT0gMHgzNywKKwlFVFNJM19FVFNJQQk9IDB4MzIsCQkvKiBGcmFuY2UgKG9wdGlvbmFsKSAqLworCUVUU0kyX1dPUkxECT0gMHgzNSwJCS8qIEh1bmdhcnkgJiBvdGhlcnMgKi8KKwlFVFNJM19XT1JMRAk9IDB4MzYsCQkvKiBGcmFuY2UgJiBvdGhlcnMgKi8KKwlFVFNJNF9XT1JMRAk9IDB4MzAsCisJRVRTSTRfRVRTSUMJPSAweDM4LAorCUVUU0k1X1dPUkxECT0gMHgzOSwKKwlFVFNJNl9XT1JMRAk9IDB4MzQsCQkvKiBCdWxnYXJpYSAqLworCUVUU0lfUkVTRVJWRUQJPSAweDMzLAkJLyogUmVzZXJ2ZWQgKERvIG5vdCB1c2VkKSAqLworCisJTUtLMV9NS0tBCT0gMHg0MCwJCS8qIEphcGFuIChKUDEpICovCisJTUtLMV9NS0tCCT0gMHg0MSwJCS8qIEphcGFuIChKUDApICovCisJQVBMNF9XT1JMRAk9IDB4NDIsCQkvKiBTaW5nYXBvcmUgKi8KKwlNS0syX01LS0EJPSAweDQzLAkJLyogSmFwYW4gd2l0aCA0LjlHIGNoYW5uZWxzICovCisJQVBMX1JFU0VSVkVECT0gMHg0NCwJCS8qIFJlc2VydmVkIChEbyBub3QgdXNlZCkgICovCisJQVBMMl9XT1JMRAk9IDB4NDUsCQkvKiBLb3JlYSAqLworCUFQTDJfQVBMQwk9IDB4NDYsCisJQVBMM19XT1JMRAk9IDB4NDcsCisJTUtLMV9GQ0NBCT0gMHg0OCwJCS8qIEphcGFuIChKUDEtMSkgKi8KKwlBUEwyX0FQTEQJPSAweDQ5LAkJLyogS29yZWEgd2l0aCAyLjNHIGNoYW5uZWxzICovCisJTUtLMV9NS0tBMQk9IDB4NEEsCQkvKiBKYXBhbiAoSkUxKSAqLworCU1LSzFfTUtLQTIJPSAweDRCLAkJLyogSmFwYW4gKEpFMikgKi8KKwlNS0sxX01LS0MJPSAweDRDLAkJLyogSmFwYW4gKE1LSzFfTUtLQSxleGNlcHQgQ2gxNCkgKi8KKworCUFQTDNfRkNDQSAgID0gMHg1MCwKKwlBUEwxX1dPUkxECT0gMHg1MiwJCS8qIExhdGluIEFtZXJpY2EgKi8KKwlBUEwxX0ZDQ0EJPSAweDUzLAorCUFQTDFfQVBMQQk9IDB4NTQsCisJQVBMMV9FVFNJQwk9IDB4NTUsCisJQVBMMl9FVFNJQwk9IDB4NTYsCQkvKiBWZW5lenVlbGEgKi8KKwlBUEwyX0ZDQ0EgICA9IDB4NTcsIAkvKiBuZXcgTGF0aW4gQW1lcmljYSAqLworCUFQTDVfV09STEQJPSAweDU4LAkJLyogQ2hpbGUgKi8KKwlBUEw2X1dPUkxECT0gMHg1QiwJCS8qIFNpbmdhcG9yZSAqLworCUFQTDdfRkNDQSAgID0gMHg1QywgICAgIC8qIFRhaXdhbiA1LjQ3IEJhbmQgKi8KKwlBUEw4X1dPUkxEICA9IDB4NUQsICAgICAvKiBNYWxheXNpYSA1R0h6ICovCisJQVBMOV9XT1JMRCAgPSAweDVFLCAgICAgLyogS29yZWEgNUdIeiAqLworCisJLyoKKwkgKiBXb3JsZCBtb2RlIFNLVXMKKwkgKi8KKwlXT1IwX1dPUkxECT0gMHg2MCwJCS8qIFdvcmxkMCAoV08wIFNLVSkgKi8KKwlXT1IxX1dPUkxECT0gMHg2MSwJCS8qIFdvcmxkMSAoV08xIFNLVSkgKi8KKwlXT1IyX1dPUkxECT0gMHg2MiwJCS8qIFdvcmxkMiAoV08yIFNLVSkgKi8KKwlXT1IzX1dPUkxECT0gMHg2MywJCS8qIFdvcmxkMyAoV08zIFNLVSkgKi8KKwlXT1I0X1dPUkxECT0gMHg2NCwJCS8qIFdvcmxkNCAoV080IFNLVSkgKi8KKwlXT1I1X0VUU0lDCT0gMHg2NSwJCS8qIFdvcmxkNSAoV081IFNLVSkgKi8KKworCVdPUjAxX1dPUkxECT0gMHg2NiwJCS8qIFdvcmxkMC0xIChXVzAtMSBTS1UpICovCisJV09SMDJfV09STEQJPSAweDY3LAkJLyogV29ybGQwLTIgKFdXMC0yIFNLVSkgKi8KKwlFVTFfV09STEQJPSAweDY4LAkJLyogU2FtZSBhcyBXb3JsZDAtMiAoV1cwLTIgU0tVKSwgZXhjZXB0IGFjdGl2ZSBzY2FuIGNoMS0xMy4gTm8gY2gxNCAqLworCisJV09SOV9XT1JMRAk9IDB4NjksCQkvKiBXb3JsZDkgKFdPOSBTS1UpICovCisJV09SQV9XT1JMRAk9IDB4NkEsCQkvKiBXb3JsZEEgKFdPQSBTS1UpICovCisKKwlNS0szX01LS0IJPSAweDgwLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0IgKi8KKwlNS0szX01LS0EyCT0gMHg4MSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tBMiAqLworCU1LSzNfTUtLQwk9IDB4ODIsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQyAqLworCisJTUtLNF9NS0tCCT0gMHg4MywJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0IgKi8KKwlNS0s0X01LS0EyCT0gMHg4NCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0EyICovCisJTUtLNF9NS0tDCT0gMHg4NSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1LS0MgKi8KKworCU1LSzVfTUtLQgk9IDB4ODYsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0IgKi8KKwlNS0s1X01LS0EyCT0gMHg4NywJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQTIgKi8KKwlNS0s1X01LS0MJPSAweDg4LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tDICovCisKKwlNS0s2X01LS0IJPSAweDg5LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCBNS0tCICovCisJTUtLNl9NS0tBMgk9IDB4OEEsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgTUtLQTIgKi8KKwlNS0s2X01LS0MJPSAweDhCLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIE1LS0MgKi8KKworCU1LSzdfTUtLQgk9IDB4OEMsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tCICovCisJTUtLN19NS0tBCT0gMHg4RCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1LS0EyICovCisJTUtLN19NS0tDCT0gMHg4RSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1LS0MgKi8KKworCU1LSzhfTUtLQgk9IDB4OEYsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0IgKi8KKwlNS0s4X01LS0EyCT0gMHg5MCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQTIgKi8KKwlNS0s4X01LS0MJPSAweDkxLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tDICovCisKKwlNS0s2X01LS0ExICAgICAgPSAweEY4LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tBMSAqLworCU1LSzZfRkNDQSAgICAgICA9IDB4RjksICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIEZDQ0EgKi8KKwlNS0s3X01LS0ExICAgICAgPSAweEZBLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1LS0ExICovCisJTUtLN19GQ0NBICAgICAgID0gMHhGQiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBGQ0NBICovCisJTUtLOV9GQ0NBICAgICAgID0gMHhGQywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgRkNDQSAqLworCU1LSzlfTUtLQTEgICAgICA9IDB4RkQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0ExICovCisJTUtLOV9NS0tDICAgICAgID0gMHhGRSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzlfTUtLQTIgICAgICA9IDB4RkYsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0EyICovCisKKwlNS0sxMF9GQ0NBICAgICAgPSAweEQwLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0sxMF9NS0tBMSAgICAgPSAweEQxLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0ExICovCisJTUtLMTBfTUtLQyAgICAgID0gMHhEMiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTBfTUtLQTIgICAgID0gMHhEMywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBNS0tBMiAqLworCisJTUtLMTFfTUtLQSAgICAgID0gMHhENCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQSAqLworCU1LSzExX0ZDQ0EgICAgICA9IDB4RDUsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0sxMV9NS0tBMSAgICAgPSAweEQ2LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzExX01LS0MgICAgICA9IDB4RDcsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0MgKi8KKwlNS0sxMV9NS0tBMiAgICAgPSAweEQ4LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBMiAqLworCisJTUtLMTJfTUtLQSAgICAgID0gMHhEOSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQSAqLworCU1LSzEyX0ZDQ0EgICAgICA9IDB4REEsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0sxMl9NS0tBMSAgICAgPSAweERCLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzEyX01LS0MgICAgICA9IDB4REMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0MgKi8KKwlNS0sxMl9NS0tBMiAgICAgPSAweERELCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tBMiAqLworCisJLyogRm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSB1c2VkIG9ubHkgYnkgcy93IHRvIG1hcCBvbGQKKyAJICogSmFwYW4gU0tVcy4KKwkgKi8KKwlNS0szX01LS0EgICAgICAgPSAweEYwLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tBICovCisJTUtLM19NS0tBMSAgICAgID0gMHhGMSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQTEgKi8KKwlNS0szX0ZDQ0EgICAgICAgPSAweEYyLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBGQ0NBICovCisJTUtLNF9NS0tBICAgICAgID0gMHhGMywgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tBICovCisJTUtLNF9NS0tBMSAgICAgID0gMHhGNCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tBMSAqLworCU1LSzRfRkNDQSAgICAgICA9IDB4RjUsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgRkNDQSAqLworCU1LSzlfTUtLQSAgICAgICA9IDB4RjYsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0EqLworCU1LSzEwX01LS0EgICAgICA9IDB4RjcsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQSAqLworCisJLyoKKwkgKiBSZWd1bGF0b3IgZG9tYWlucyBlbmRpbmcgaW4gYSBudW1iZXIgKGUuZy4gQVBMMSwKKwkgKiBNSzEsIEVUU0k0LCBldGMpIGFwcGx5IHRvIDVHSHogY2hhbm5lbCBhbmQgcG93ZXIKKwkgKiBpbmZvcm1hdGlvbi4gIFJlZ3VsYXRvciBkb21haW5zIGVuZGluZyBpbiBhIGxldHRlcgorCSAqIChlLmcuIEFQTEEsIEZDQ0EsIGV0YykgYXBwbHkgdG8gMi40R0h6IGNoYW5uZWwgYW5kCisJICogcG93ZXIgaW5mb3JtYXRpb24uCisJICovCisJQVBMMQkJPSAweDAxNTAsCS8qIExBVCAmIEFzaWEgKi8KKwlBUEwyCQk9IDB4MDI1MCwJLyogTEFUICYgQXNpYSAqLworCUFQTDMJCT0gMHgwMzUwLAkvKiBUYWl3YW4gKi8KKwlBUEw0CQk9IDB4MDQ1MCwJLyogSm9yZGFuICovCisJQVBMNQkJPSAweDA1NTAsCS8qIENoaWxlICovCisJQVBMNgkJPSAweDA2NTAsCS8qIFNpbmdhcG9yZSAqLworCUFQTDcJCT0gMHgwNzUwLAkvKiBUYWl3YW4gTWlkZGxlICovCisJQVBMOAkJPSAweDA4NTAsCS8qIE1hbGF5c2lhICovCisJQVBMOQkJPSAweDA5NTAsCS8qIEtvcmVhIChTb3V0aCkgUk9DIDMgKi8KKworCUVUU0kxCQk9IDB4MDEzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTIJCT0gMHgwMjMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJMwkJPSAweDAzMzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0k0CQk9IDB4MDQzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTUJCT0gMHgwNTMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNgkJPSAweDA2MzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0lBCQk9IDB4MEEzMCwJLyogRnJhbmNlICovCisJRVRTSUIJCT0gMHgwQjMwLAkvKiBJc3JhZWwgKi8KKwlFVFNJQwkJPSAweDBDMzAsCS8qIExhdGluIEFtZXJpY2EgKi8KKworCUZDQzEJCT0gMHgwMTEwLAkvKiBVUyAmIG90aGVycyAqLworCUZDQzIJCT0gMHgwMTIwLAkvKiBDYW5hZGEsIEF1c3RyYWxpYSAmIE5ldyBaZWFsYW5kICovCisJRkNDMwkJPSAweDAxNjAsCS8qIFVTIHcvbmV3IG1pZGRsZSBiYW5kICYgREZTICovCisJRkNDNAkJPSAweDAxNjUsCS8qIFVTIFB1YmxpYyBTYWZldHkgKi8KKwlGQ0M1CQk9IDB4MDUxMCwJLyogVVMgbm8gREZTICovCisgICAgRkNDNiAgICA9IDB4MDYxMCwgLyogQ2FuYWRhICYgQXVzdHJhbGlhICovCisKKwlGQ0NBCQk9IDB4MEExMCwKKworCUFQTEQJCT0gMHgwRDUwLAkvKiBTb3V0aCBLb3JlYSAqLworCisJTUtLMQkJPSAweDAxNDAsCS8qIEphcGFuIChVTkktMSBvZGQpKi8KKwlNS0syCQk9IDB4MDI0MCwJLyogSmFwYW4gKDQuOSBHSHogKyBVTkktMSBvZGQpICovCisJTUtLMwkJPSAweDAzNDAsCS8qIEphcGFuIChVTkktMSBldmVuKSAqLworCU1LSzQJCT0gMHgwNDQwLAkvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yKSAqLworCU1LSzUJCT0gMHgwNTQwLAkvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQpICovCisJTUtLNgkJPSAweDA2NDAsCS8qIEphcGFuIChVTkktMSBvZGQgKyBVTkktMSBldmVuKSAqLworCU1LSzcJCT0gMHgwNzQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkICsgVU5JLTEgZXZlbiArIFVOSS0yICovCisJTUtLOAkJPSAweDA4NDAsCS8qIEphcGFuIChVTkktMSBvZGQgKyBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCkgKi8KKwlNS0s5CQk9IDB4MDk0MCwgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIDQuOSBHSFopICovCisJTUtLMTAJCT0gMHgwQjQwLCAgIC8qIEphcGFuIChVTkktMSBldmVuICsgVU5JLTIgKyA0LjkgR0haKSAqLworCU1LSzExCQk9IDB4MTE0MCwgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjkgR0haKSAqLworCU1LSzEyCQk9IDB4MTI0MCwgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyA0LjkgR0haKSAqLworCU1LS0EJCT0gMHgwQTQwLAkvKiBKYXBhbiAqLworCU1LS0MJCT0gMHgwQTUwLAorCisJTlVMTDEJCT0gMHgwMTk4LAorCVdPUkxECQk9IDB4MDE5OSwKKwlERUJVR19SRUdfRE1OCT0gMHgwMWZmLAorfTsKKworLyogY2hhbm5lbEZsYWdzICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfQ1dfSU5UCTB4MDAwMgkvKiBDVyBpbnRlcmZlcmVuY2UgZGV0ZWN0ZWQgb24gY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX1RVUkJPCTB4MDAxMAkvKiBUdXJibyBDaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfQ0NLCSAgICAweDAwMjAJLyogQ0NLIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9PRkRNCTB4MDA0MAkvKiBPRkRNIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF8yR0haCTB4MDA4MAkvKiAyIEdIeiBzcGVjdHJ1bSBjaGFubmVsLiAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMXzVHSFoJMHgwMTAwCS8qIDUgR0h6IHNwZWN0cnVtIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFCTB4MDIwMAkvKiBPbmx5IHBhc3NpdmUgc2NhbiBhbGxvd2VkIGluIHRoZSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfRFlOCSAgICAweDA0MDAJLyogZHluYW1pYyBDQ0stT0ZETSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfWFIJICAgIDB4MDgwMAkvKiBYUiBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBIAkweDEwMDAJLyogQ2hhbm5lbCBieSBDU0EoQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50KSAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX1NUVVJCTwkweDIwMDAJLyogU3RhdGljIHR1cmJvLCBubyAxMWEtb25seSB1c2FnZSAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX0hBTEYgICAgMHg0MDAwIAkvKiBIYWxmIHJhdGUgY2hhbm5lbCAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX1FVQVJURVIgMHg4MDAwIAkvKiBRdWFydGVyIHJhdGUgY2hhbm5lbCAqLworCisvKiBjaGFubmVsRmxhZ3MgKi8KKyNkZWZpbmUgQ0hBTk5FTF9DV19JTlQgIDB4MDAwMiAgLyogQ1cgaW50ZXJmZXJlbmNlIGRldGVjdGVkIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9UVVJCTyAgIDB4MDAxMCAgLyogVHVyYm8gQ2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0NDSyAweDAwMjAgIC8qIENDSyBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfT0ZETSAgICAweDAwNDAgIC8qIE9GRE0gY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMXzJHSFogICAgMHgwMDgwICAvKiAyIEdIeiBzcGVjdHJ1bSBjaGFubmVsLiAqLworI2RlZmluZSBDSEFOTkVMXzVHSFogICAgMHgwMTAwICAvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfUEFTU0lWRSAweDAyMDAgIC8qIE9ubHkgcGFzc2l2ZSBzY2FuIGFsbG93ZWQgaW4gdGhlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9EWU4gMHgwNDAwICAvKiBkeW5hbWljIENDSy1PRkRNIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9YUiAgMHgwODAwICAvKiBYUiBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfU1RVUkJPICAweDIwMDAgIC8qIFN0YXRpYyB0dXJibywgbm8gMTFhLW9ubHkgdXNhZ2UgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IQUxGICAgIDB4NDAwMCAgLyogSGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9RVUFSVEVSIDB4ODAwMCAgLyogUXVhcnRlciByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDIwICAgIDB4MTAwMDAgLyogSFQyMCBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfSFQ0MCAgICAweDIwMDAwIC8qIEhUNDAgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0hUNDBVIAkweDQwMDAwIC8qIGNvbnRyb2wgY2hhbm5lbCBjYW4gYmUgdXBwZXIgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0hUNDBMIAkweDgwMDAwIC8qIGNvbnRyb2wgY2hhbm5lbCBjYW4gYmUgbG93ZXIgY2hhbm5lbCAqLworCisvKiBwcml2RmxhZ3MgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9JTlRFUkZFUkVOQ0UgICAJMHgwMSAvKiBTb2Z0d2FyZSB1c2U6IGNoYW5uZWwgaW50ZXJmZXJlbmNlCisJCQkJICAgICAgICB1c2VkIGZvciBhcyBBUiBhcyB3ZWxsIGFzIFJBREFSCisJCQkJICAgICAgICBpbnRlcmZlcmVuY2UgZGV0ZWN0aW9uICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTCQkweDAyIC8qIERGUyByZXF1aXJlZCBvbiBjaGFubmVsICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfNE1TX0xJTUlUCTB4MDQgLyogNG1zZWMgcGFja2V0IGxpbWl0IG9uIHRoaXMgY2hhbm5lbCAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUiAgICAgICAweDA4IC8qIGlmIGNoYW5uZWwgaGFzIGJlZW4gY2hlY2tlZCBmb3IgREZTICovCisKKyNkZWZpbmUgQ0hBTk5FTF9BICAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX09GRE0pCisjZGVmaW5lIENIQU5ORUxfQiAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9DQ0spCisjZGVmaW5lIENIQU5ORUxfUFVSRUcgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfT0ZETSkKKyNpZmRlZiBub3RkZWYKKyNkZWZpbmUgQ0hBTk5FTF9HICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX0RZTikKKyNlbHNlCisjZGVmaW5lIENIQU5ORUxfRyAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9PRkRNKQorI2VuZGlmCisjZGVmaW5lIENIQU5ORUxfVCAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNfENIQU5ORUxfVFVSQk8pCisjZGVmaW5lIENIQU5ORUxfU1QgIChDSEFOTkVMX1R8Q0hBTk5FTF9TVFVSQk8pCisjZGVmaW5lIENIQU5ORUxfMTA4RyAgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfT0ZETXxDSEFOTkVMX1RVUkJPKQorI2RlZmluZSBDSEFOTkVMXzEwOEEgICAgQ0hBTk5FTF9UCisjZGVmaW5lIENIQU5ORUxfWCAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNfENIQU5ORUxfWFIpCisjZGVmaW5lIENIQU5ORUxfR19IVCAgICAgIChDSEFOTkVMXzJHSFogfCBDSEFOTkVMX09GRE0gfCBDSEFOTkVMX0hUMjApCisjZGVmaW5lIENIQU5ORUxfQV9IVCAgICAgIChDSEFOTkVMXzVHSFogfCBDSEFOTkVMX09GRE0gfCBDSEFOTkVMX0hUMjApCisKKyNkZWZpbmUgQ0hBTk5FTF9HX0hUMjAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9IVDIwKQorI2RlZmluZSBDSEFOTkVMX0FfSFQyMCAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX0hUMjApCisjZGVmaW5lIENIQU5ORUxfR19IVDQwICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfSFQyMHxDSEFOTkVMX0hUNDApCisjZGVmaW5lIENIQU5ORUxfQV9IVDQwICAoQ0hBTk5FTF81R0hafENIQU5ORUxfSFQyMHxDSEFOTkVMX0hUNDApCisjZGVmaW5lIENIQU5ORUxfQUxMIFwKKyAgICAoQ0hBTk5FTF9PRkRNfENIQU5ORUxfQ0NLfCBDSEFOTkVMXzJHSFogfCBDSEFOTkVMXzVHSFogfCBDSEFOTkVMX1RVUkJPIHwgQ0hBTk5FTF9IVDIwIHwgQ0hBTk5FTF9IVDQwKQorI2RlZmluZSBDSEFOTkVMX0FMTF9OT1RVUkJPICAgICAoQ0hBTk5FTF9BTEwgJn4gQ0hBTk5FTF9UVVJCTykKKworZW51bSB7CisgICAgSEFMX01PREVfMTFBICAgID0gMHgwMDEsICAgICAgICAvKiAxMWEgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV9UVVJCTyAgPSAweDAwMiwgICAgICAgIC8qIDExYSB0dXJiby1vbmx5IGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFCICAgID0gMHgwMDQsICAgICAgICAvKiAxMWIgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV9QVVJFRyAgPSAweDAwOCwgICAgICAgIC8qIDExZyBjaGFubmVscyAoT0ZETSBvbmx5KSAqLworI2lmZGVmIG5vdGRlZgorICAgIEhBTF9NT0RFXzExRyAgICA9IDB4MDEwLCAgICAgICAgLyogMTFnIGNoYW5uZWxzIChPRkRNL0NDSykgKi8KKyNlbHNlCisgICAgSEFMX01PREVfMTFHICAgID0gMHgwMDgsICAgICAgICAvKiBYWFggaGlzdG9yaWNhbCAqLworI2VuZGlmCisgICAgSEFMX01PREVfMTA4RyAgID0gMHgwMjAsICAgICAgICAvKiAxMWErVHVyYm8gY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMDhBICAgPSAweDA0MCwgICAgICAgIC8qIDExZytUdXJibyBjaGFubmVscyAqLworICAgIEhBTF9NT0RFX1hSICAgICA9IDB4MTAwLCAgICAgICAgLyogWFIgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMUFfSEFMRl9SQVRFID0gMHgyMDAsICAgICAvKiAxMUEgaGFsZiByYXRlIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFBX1FVQVJURVJfUkFURSA9IDB4NDAwLCAgLyogMTFBIHF1YXJ0ZXIgcmF0ZSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExTkcgICA9IDB4NDAwMCwgICAgICAgICAgIC8qIDExbmcgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMU5BICAgPSAweDgwMDAsICAgICAgICAgICAvKiAxMW5hIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfQUxMICAgID0gMHhmZmZmCit9OworCisjZW5kaWYgLyogI2lmbmRlZiBfSFBSRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcncuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3ZDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJ3LmMKQEAgLTAsMCArMSwxNTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisjaW5jbHVkZSAiaHByZWcuaCIKKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvcmF0ZWN0cmwuaCIKKworZXh0ZXJuIHZvaWQgemZJZGxDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbik7CisKK2V4dGVybiB2b2lkIHpmQ29yZUN3bUJ1c3koemRldl90KiBkZXYsIHUxNl90IGJ1c3kpOwordTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7Cit1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldik7CisKKy8vI2RlZmluZSB6bV9ocF9wcml2KHgpIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXpnV2xhbkRldi5ocFByaXZhdGU7CisKK3ZvaWQgemZJbml0Q21kUXVldWUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopKHdkLT5ocFByaXZhdGUpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICBocFByaXYtPmNtZFRhaWwgPSBocFByaXYtPmNtZEhlYWQgPSBocFByaXYtPmNtZFNlbmQgPSAwOworI2Vsc2UKKyAgICBocFByaXYtPmNtZFRhaWwgPSBocFByaXYtPmNtZEhlYWQgPSAwOworI2VuZGlmCisgICAgaHBQcml2LT5jbWRQZW5kaW5nID0gMDsKKyAgICBocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordTE2X3QgemZQdXRDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgLyogTWFrZSBzdXJlIGNvbW1hbmQgbGVuZ3RoIDwgWk1fTUFYX0NNRF9TSVpFICovCisgICAgem1fYXNzZXJ0KGNtZExlbiA8PSBaTV9NQVhfQ01EX1NJWkUpOworICAgIC8qIE1ha2Ugc3VyZSBjb21tYW5kIHF1ZXVlIG5vdCBmdWxsICovCisgICAgLy96bV9hc3NlcnQoKChocFByaXYtPmNtZFRhaWwrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSkpICE9IGhwUHJpdi0+Y21kSGVhZCk7CisgICAgaWYgKCgoaHBQcml2LT5jbWRUYWlsKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpKSA9PSBocFByaXYtPmNtZEhlYWQgKSB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkNNRCBxdWV1ZSBmdWxsISEiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kVGFpbF0uY21kTGVuID0gY21kTGVuOworICAgIGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFRhaWxdLnNyYyA9IHNyYzsKKyAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5idWYgPSBidWY7CisgICAgZm9yIChpPTA7IGk8KGNtZExlbj4+Mik7IGkrKykKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFRhaWxdLmNtZFtpXSA9IGNtZFtpXTsKKyAgICB9CisKKyAgICBocFByaXYtPmNtZFRhaWwgPSAoaHBQcml2LT5jbWRUYWlsKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmR2V0Q21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCogY21kTGVuLCB1MTZfdCogc3JjLCB1OF90KiogYnVmKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIGlmIChocFByaXYtPmNtZFRhaWwgPT0gaHBQcml2LT5jbWRIZWFkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgfQorCisgICAgKmNtZExlbiA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmNtZExlbjsKKyAgICAqc3JjID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uc3JjOworICAgICpidWYgPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5idWY7CisgICAgZm9yIChpPTA7IGk8KCgqY21kTGVuKT4+Mik7IGkrKykKKyAgICB7CisgICAgICAgIGNtZFtpXSA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmNtZFtpXTsKKyAgICB9CisKKyAgICBocFByaXYtPmNtZEhlYWQgPSAoaHBQcml2LT5jbWRIZWFkKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9YUF9VU0JfTVVMVENNRAordm9pZCB6ZlNlbmRDbWRFeCh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBuY21kW1pNX01BWF9DTURfU0laRS80XTsKKyAgICB1MTZfdCBuY21kTGVuID0gMDsKKyAgICB1MTZfdCBjbWRGbGFnID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChocFByaXYtPmNtZFBlbmRpbmcgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChocFByaXYtPmNtZFRhaWwgIT0gaHBQcml2LT5jbWRTZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBjbWRGbGFnID0gMTsKKyAgICAgICAgICAgIC8qIEdldCBxdWV1ZWluZyBjb21tYW5kICovCisgICAgICAgICAgICBuY21kTGVuPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRTZW5kXS5jbWRMZW47CisgICAgICAgICAgICBmb3IgKGk9MDsgaTwobmNtZExlbj4+Mik7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuY21kW2ldID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kU2VuZF0uY21kW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHBQcml2LT5jbWRTZW5kID0gKGhwUHJpdi0+Y21kU2VuZCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKTsKKworICAgICAgICAgICAgaHBQcml2LT5jbWRQZW5kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGNtZEZsYWcgPT0gMSkpCisgICAgeworICAgICAgICB6ZklkbENtZChkZXYsIG5jbWQsIG5jbWRMZW4pOworICAgIH0KK30KKwordm9pZCB6ZmlTZW5kQ21kQ29tcCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2VuZENtZEV4KGRldik7Cit9CisjZW5kaWYKKwordTE2X3QgemZJc3N1ZUNtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuLCB1MTZfdCBzcmMsIHU4X3QqIGJ1ZikKK3sKKyAgICB1MTZfdCBjbWRGbGFnID0gMDsKKyAgICB1MTZfdCByZXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzEsICJjbWRMZW49IiwgY21kTGVuKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyNpZmRlZiBaTV9YUF9VU0JfTVVMVENNRAorICAgIHJldCA9IHpmUHV0Q21kKGRldiwgY21kLCBjbWRMZW4sIHNyYywgYnVmKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgemZTZW5kQ21kRXgoZGV2KTsKKyNlbHNlCisgICAgaWYgKGhwUHJpdi0+Y21kUGVuZGluZyA9PSAwKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jbWRQZW5kaW5nID0gMTsKKyAgICAgICAgY21kRmxhZyA9IDE7CisgICAgfQorICAgIHJldCA9IHpmUHV0Q21kKGRldiwgY21kLCBjbWRMZW4sIHNyYywgYnVmKTsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoY21kRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgemZJZGxDbWQoZGV2LCBjbWQsIGNtZExlbik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbikKK3sKKyAgICB1MzJfdCBjbWRbWk1fTUFYX0NNRF9TSVpFLzRdOworICAgIHUxNl90IGNtZExlbjsKKyAgICB1MTZfdCBzcmM7CisgICAgdThfdCogYnVmOworICAgIHUzMl90IG5jbWRbWk1fTUFYX0NNRF9TSVpFLzRdOworICAgIHUxNl90IG5jbWRMZW4gPSAwOworICAgIHUxNl90IHJldDsKKyAgICB1MTZfdCBjbWRGbGFnID0gMDsKKyAgICB1MTZfdCBpOworICAgIHMzMl90IG5mOworICAgIHMzMl90IG5vaXNlZmxvb3JbNF07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZkdldENtZChkZXYsIGNtZCwgJmNtZExlbiwgJnNyYywgJmJ1Zik7CisgICAgI2lmIDAKKyAgICB6bV9hc3NlcnQocmV0ID09IDApOworICAgICNlbHNlCisgICAgaWYgKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRXJyb3IgSWRsUnNwIGJlY2F1c2Ugbm9uZSBjbWQhIVxuIik7CisgICAgICAgICNpZm5kZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgI2VuZGlmCisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2Vsc2UKKyAgICBpZiAoaHBQcml2LT5jbWRUYWlsICE9IGhwUHJpdi0+Y21kSGVhZCkKKyAgICB7CisgICAgICAgIGNtZEZsYWcgPSAxOworICAgICAgICAvKiBHZXQgcXVldWVpbmcgY29tbWFuZCAqLworICAgICAgICBuY21kTGVuPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRMZW47CisgICAgICAgIGZvciAoaT0wOyBpPChuY21kTGVuPj4yKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuY21kW2ldID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uY21kW2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChjbWRGbGFnID09IDEpCisgICAgeworICAgICAgICB6ZklkbENtZChkZXYsIG5jbWQsIG5jbWRMZW4pOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzcmMgPT0gWk1fT0lEX1JFQUQpCisgICAgeworICAgICAgICBaTV9QRVJGT1JNQU5DRV9SRUcoZGV2LCAweDExNzcyYywgcnNwWzFdKTsKKyAgICAgICAgemZ3RGJnUmVhZFJlZ0RvbmUoZGV2LCBjbWRbMV0sIHJzcFsxXSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfRkxBU0hfQ0hLU1VNKQorICAgIHsKKyAgICAgICAgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKGRldiwgcnNwKzEpOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0ZMQVNIX1JFQUQpCisgICAgeworICAgICAgICB1MzJfdCAgZGF0YWxlbjsKKyAgICAgICAgdTE2X3QgaTsKKworICAgICAgICBkYXRhbGVuID0gKHJzcFswXSAmIDI1NSk7CisKKyAgICAgICAgemZ3RGJnUmVhZEZsYXNoRG9uZShkZXYsIGNtZFsxXSwgcnNwKzEsIGRhdGFsZW4pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0ZMQVNIX1BST0dSQU0pCisgICAgeworICAgICAgICAvKiBOb24gZG8gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9XUklURSkKKyAgICB7CisgICAgICAgIHpmd0RiZ1dyaXRlUmVnRG9uZShkZXYsIGNtZFsxXSwgY21kWzJdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9UQUxMWSkKKyAgICB7CisJCXpmQ29sbGVjdEhXVGFsbHkoZGV2LCByc3AsIDApOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX1RBTExZX0FQRCkKKyAgICB7CisJCXpmQ29sbGVjdEhXVGFsbHkoZGV2LCByc3AsIDEpOworICAgICAgICB6ZndEYmdSZWFkVGFsbHlEb25lKGRldik7CisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCisgICAgICAgIHpmUmF0ZUN0cmxBZ2dyU3RhKGRldik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9ES1RYX1NUQVRVUykKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoInNyYyA9IHptX09JRF9ES1RYX1NUQVRVUyIpOworICAgICAgICB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZShkZXYsIHJzcFsxXSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DTURfU0VUX0ZSRVFVRU5DWSkKKyAgICB7CisKKy8vI2lmZGVmIFpNX09UVVNfRU5BQkxFX1JFVFJZX0ZSRVFfQ0hBTkdFCisjaWYgMAorICAgIHptX2RlYnVnX21zZzEoIlJldHJ5IFNldCBGcmVxdWVuY3kgPSAiLCByc3BbMV0pOworCisgICAgI2lmIDEKKyAgICAvLyBSZWFkIHRoZSBOb2lzZSBGbG9vciB2YWx1ZSAhCisgICAgbmYgPSAoKHJzcFsyXT4+MTkpICYgMHgxZmYpOworICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgIHsKKyAgICAgICAgbm9pc2VmbG9vclswXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMF0gPSBuZjsKKyAgICB9CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsxXSA9ICIsIG5vaXNlZmxvb3JbMF0pOworCisgICAgbmYgPSAoKHJzcFszXT4+MTkpICYgMHgxZmYpOworICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgIHsKKyAgICAgICAgbm9pc2VmbG9vclsxXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMV0gPSBuZjsKKyAgICB9CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsyXSA9ICIsIG5vaXNlZmxvb3JbMV0pOworICAgIHptX2RlYnVnX21zZzEoIklzIFNpdGUgU3VydmV5ID0gIiwgaHBQcml2LT5pc1NpdGVTdXJ2ZXkpOworICAgICNlbmRpZgorCisgICAgICAgIGlmICggKHJzcFsxXSAmJiBocFByaXYtPmZyZXFSZXRyeUNvdW50ZXIgPT0gMCkgfHwKKyAgICAgICAgICAgICAoKChub2lzZWZsb29yWzBdPi02MCl8fChub2lzZWZsb29yWzFdPi02MCkpICYmIGhwUHJpdi0+ZnJlcVJldHJ5Q291bnRlcj09MCkgfHwKKyAgICAgICAgICAgICAoKGFicyhub2lzZWZsb29yWzBdLW5vaXNlZmxvb3JbMV0pPj05KSAmJiBocFByaXYtPmZyZXFSZXRyeUNvdW50ZXI9PTApICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiUmV0cnkgdG8gaXNzdWUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UgY29tbWFuZCIpOworCisgICAgICAgICAgICBpZiAoIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDb2xkIFJlc2V0Iik7CisKKyAgICAgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RFeHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ICE9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldEZyZXF1ZW5jeUV4KGRldiwgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RCdzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisKKy8qIHJldDogQml0MDogQUdDIGNhbGlicmF0aW9uICAgMD0+ZmluaXNoICAxPT51bmZpbmlzaCAgICAgICAgICAgICAgICovCisvKiAgICAgIEJpdDE6IE5vaXNlIGNhbGlicmF0aW9uIDA9PmZpbmlzaCAgMT0+dW5maW5pc2ggICAgICAgICAgICAgICAqLworLyogICAgICBCaXQyOiBOb2lzZSBjYWxpYnJhdGlvbiBmaW5pc2gsIGJ1dCBORiB2YWx1ZSB1bmV4Y2VwdGVkID0+IDEgKi8KKyAgICAgICAgaWYgKCAocnNwWzFdICYgMHgxKSB8fCAocnNwWzFdICYgMHg0KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIlNldCBGcmVxdWVuY3kgZmFpbCA6IHJldCA9ICIsIHJzcFsxXSk7CisKKyAgICAgICAgICAgIC8qIDEuIEFHQyBDYWxpYnJhdGlvbiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAyLiBOb2lzZSBDYWxpYnJhdGlvbiBmaW5pc2ggYnV0IGVycm9yIE5vaXNlRmxvb3IgdmFsdWUgICAqLworICAgICAgICAgICAgLyogICAgICBhbmQgbm90IGluIHNpdGVzdXJ2ZXksIHRyeSBtb3JlIHR3aWNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPCAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvbGQgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEZyZXF1ZW5jeUV4KGRldiwgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RFeHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiUmV0cnkgdG8gaXNzdWUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UgY29tbWFuZChjb2xkIHJlc2V0KSBjb3VudGVyID0gIiwgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFpbCA6IHdlIHdvdWxkIG5vdCBhY2NlcHQgdGhpcyByZXN1bHQhICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG5cblxuICBGYWlsIHR3aWNlIGNvbGQgcmVzZXQgXG5cblxuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGluIHNpdGVzdXJ2ZXksIGNvbGRyZXNldCBpbiBuZXh0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocnNwWzFdICYgMHgyKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXQgRnJlcXVlbmN5IGZhaWwgMiA6IHJldCA9ICIsIHJzcFsxXSk7CisKKyAgICAgICAgICAgIC8qIE5vaXNlIENhbGlicmF0aW9uIHVuLWZpbmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgYW5kIG5vdCBpbiBzaXRlc3VydmV5LCB0cnkgbW9yZSBvbmNlICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPCAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvbGQgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEZyZXF1ZW5jeUV4KGRldiwgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RFeHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiMiBSZXRyeSB0byBpc3N1ZSB0aGUgZnJlcXVlbmN5IGNoYW5nZSBjb21tYW5kKGNvbGQgcmVzZXQpIGNvdW50ZXIgPSAiLCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIDogd2Ugd291bGQgbm90IGFjY2VwdCB0aGlzIHJlc3VsdCEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiXG5cblxuXG4gIDIgRmFpbCB0d2ljZSBjb2xkIHJlc2V0IFxuXG5cblxuIik7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpbiBzaXRlc3VydmV5LCBza2lwIHRoaXMgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vZWxzZSBpZiAocnNwWzFdICYgMHg0KQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgem1fZGVidWdfbXNnMSgiU2V0IEZyZXF1ZW5jeSBmYWlsIDMgOiByZXQgPSAiLCByc3BbMV0pOworICAgICAgICAvLyAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgLy8gICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgLy8gICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgLy99CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9ocFByaXYtPmZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiIHJldHVybiBjb21wbGV0ZSwgcmV0ID0gIiwgcnNwWzFdKTsKKworICAgICAgICAgICAgLyogc2V0IGJiX2hlYXZ5X2NsaXBfZW5hYmxlICovCisgICAgICAgICAgICBpZiAoaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCAmJiBocFByaXYtPmh3QkJIZWF2eUNsaXAgJiYKKyAgICAgICAgICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTMyX3Qgc2V0VmFsdWUgPSAweDIwMDsKKworICAgICAgICAgICAgICAgIHNldFZhbHVlIHw9IGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXA7CisKKyAgICAgICAgICAgICAgICAvL3ptX2RiZygoIkRvIGhlYXZ5IGNsaXAgc2V0VmFsdWUgPSAlZFxuIiwgc2V0VmFsdWUpKTsKKworICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHg5OWUwKzB4MWJjMDAwLCBzZXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgIAkgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAJfQorCisgICAgICAgICNpZiAxCisgICAgICAgIC8vIFJlYWQgdGhlIE5vaXNlIEZsb29yIHZhbHVlICEKKyAgICAgICAgbmYgPSAoKHJzcFsyXT4+MTkpICYgMHgxZmYpOworICAgICAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclswXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzBdID0gbmY7CisgICAgICAgIH0KKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yWzFdID0gIiwgbm9pc2VmbG9vclswXSk7CisKKyAgICAgICAgbmYgPSAoKHJzcFszXT4+MTkpICYgMHgxZmYpOworICAgICAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsxXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzFdID0gbmY7CisgICAgICAgIH0KKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yWzJdID0gIiwgbm9pc2VmbG9vclsxXSk7CisKKyAgICAgICAgbmYgPSAoKHJzcFs1XT4+MjMpICYgMHgxZmYpOworICAgICAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsyXSA9IDAgLSAoKG5mIF4gMHgxZmYpICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzJdID0gbmY7CisgICAgICAgIH0KKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIk5vaXNlIEZsb29yIGV4dFsxXSA9ICIsIG5vaXNlZmxvb3JbMl0pOworCisgICAgICAgIG5mID0gKChyc3BbNl0+PjIzKSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbM10gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclszXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vciBleHRbMl0gPSAiLCBub2lzZWZsb29yWzNdKTsKKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIklzIFNpdGUgU3VydmV5ID0gIiwgaHBQcml2LT5pc1NpdGVTdXJ2ZXkpOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0NNRF9TRVRfS0VZKQorICAgIHsKKyAgICAgICAgemZDb3JlU2V0S2V5Q29tcGxldGUoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0NXTV9SRUFEKQorICAgIHsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQ1dNIHJzcFsxXT0iLCByc3BbMV0pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJDV00gcnNwWzJdPSIsIHJzcFsyXSk7CisgICAgICAgIHpmQ29yZUN3bUJ1c3koZGV2LCB6ZkN3bUlzRXh0Q2hhbkJ1c3kocnNwWzFdLCByc3BbMl0pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX01BQ19SRUFEKQorICAgIHsKKyAgICAgICAgLyogcnNwWzFdID0gWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQ7ICAgKi8KKyAgICAgICAgLyogcnNwWzJdID0gWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQrNDsgKi8KKyAgICAgICAgLyogcnNwWzNdID0gWk1fU0VFUFJPTV9SRUdET01BSU5fT0ZGU0VUOyAgICAgKi8KKyAgICAgICAgLyogcnNwWzRdID0gWk1fU0VFUFJPTV9WRVJJU09OX09GRlNFVDsgICAgICAgKi8KKyAgICAgICAgLyogcnNwWzVdID0gWk1fU0VFUFJPTV9IQVJEV0FSRV9UWVBFX09GRlNFVDsgKi8KKyAgICAgICAgLyogcnNwWzZdID0gWk1fU0VFUFJPTV9IV19IRUFWWV9DTElQOyAgICAgICAgKi8KKworICAgICAgICB1OF90IGFkZHJbNl0sIENDUywgV1dSOworICAgICAgICB1MTZfdCBDb3VudHJ5RG9tYWluQ29kZTsKKworICAgICAgICAvKiBCQiBoZWF2eSBjbGlwICovCisgICAgICAgIC8vaHBQcml2LT5lZXByb21IZWF2eUNsaXBGbGFnID0gKHU4X3QpKChyc3BbNl0+PjI0KSAmIDB4ZmYpOyAvLyBmb3JjZSBlbmFibGUgODEwNworICAgICAgICAvL3ptX21zZzJfbW0oWk1fTFZfMCwgImVlcHJvbUhlYXZ5Q2xpcEZsYWciLCBocFByaXYtPmVlcHJvbUhlYXZ5Q2xpcEZsYWcpOworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoaHBQcml2LT5od0JCSGVhdnlDbGlwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJlbmFibGUgQkIgSGVhdnkgQ2xpcCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiTm90IGVuYWJsZSBCQiBIZWF2eSBDbGlwIik7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyByc3BbMV09IiwgcnNwWzFdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiTUFDIHJzcFsyXT0iLCByc3BbMl0pOworCisgICAgICAgIGFkZHJbMF0gPSAodThfdCkocnNwWzFdICYgMHhmZik7CisgICAgICAgIGFkZHJbMV0gPSAodThfdCkoKHJzcFsxXT4+OCkgJiAweGZmKTsKKyAgICAgICAgYWRkclsyXSA9ICh1OF90KSgocnNwWzFdPj4xNikgJiAweGZmKTsKKyAgICAgICAgYWRkclszXSA9ICh1OF90KSgocnNwWzFdPj4yNCkgJiAweGZmKTsKKyAgICAgICAgYWRkcls0XSA9ICh1OF90KShyc3BbMl0gJiAweGZmKTsKKyAgICAgICAgYWRkcls1XSA9ICh1OF90KSgocnNwWzJdPj44KSAmIDB4ZmYpOworLyojaWZkZWYgWk1fRkI1MAorICAgICAgICBhZGRyWzBdID0gKHU4X3QpKDAgJiAweGZmKTsKKyAgICAgICAgYWRkclsxXSA9ICh1OF90KSgzICYgMHhmZik7CisgICAgICAgIGFkZHJbMl0gPSAodThfdCkoMTI3ICYgMHhmZik7CisgICAgICAgIGFkZHJbM10gPSAodThfdCkoMCAmIDB4ZmYpOworICAgICAgICBhZGRyWzRdID0gKHU4X3QpKDkgJiAweGZmKTsKKyAgICAgICAgYWRkcls1XSA9ICh1OF90KSgxMSAmIDB4ZmYpOworI2VuZGlmKi8KKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfTCwKKyAgICAgICAgICAgICAgICAoKCgodTMyX3QpYWRkclszXSk8PDI0KSB8ICgoKHUzMl90KWFkZHJbMl0pPDwxNikgfCAoKCh1MzJfdClhZGRyWzFdKTw8OCkgfCBhZGRyWzBdKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9ILAorICAgICAgICAgICAgICAgICgoKCh1MzJfdClhZGRyWzVdKTw8OCkgfCBhZGRyWzRdKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdID0gKHUxNl90KShyc3BbNV0mMHhmZmZmKTsKKyAgICAgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzFdID0gKHUxNl90KShyc3BbNV0+PjE2KTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAibGVkTW9kZVswXT0iLCB3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJsZWRNb2RlWzFdPSIsIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSk7CisKKyAgICAgICAgLyogUmVndWxhdG9yeSBSZWxhdGVkIFNldHRpbmcgKi8KKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiUmVnRG9tYWluIHJzcD0iLCByc3BbM10pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJPcEZsYWdzK0VlcE1pc2M9IiwgcnNwWzRdKTsKKyAgICAgICAgaHBQcml2LT5PcEZsYWdzID0gKHU4X3QpKChyc3BbNF0+PjE2KSAmIDB4ZmYpOworICAgICAgICBpZiAoKHJzcFsyXSA+PiAyNCkgPT0gMHgxKSAvL1R4IG1hc2sgPT0gMHgxCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIk9UVVMgMXgyIik7CisgICAgICAgICAgICBocFByaXYtPmhhbENhcGFiaWxpdHkgfD0gWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiT1RVUyAyeDIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHBQcml2LT5PcEZsYWdzICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmhhbENhcGFiaWxpdHkgfD0gWk1fSFBfQ0FQXzVHOworICAgICAgICB9CisgICAgICAgIGlmIChocFByaXYtPk9wRmxhZ3MgJiAweDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSB8PSBaTV9IUF9DQVBfMkc7CisgICAgICAgIH0KKworCisgICAgICAgIENDUyA9ICh1OF90KSgocnNwWzNdICYgMHg4MDAwKSA+PiAxNSk7CisgICAgICAgIFdXUiA9ICh1OF90KSgocnNwWzNdICYgMHg0MDAwKSA+PiAxNCk7CisgICAgICAgIENvdW50cnlEb21haW5Db2RlID0gKHUxNl90KShyc3BbM10gJiAweDNGRkYpOworCisgICAgICAgIGlmIChyc3BbM10gIT0gMHhmZmZmZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKENDUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEdldCBSZWd1bGF0aW9uIFRhYmxlIGZyb20gQ291bnRyeSBDb2RlIik7CisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21Db3VudHJ5KGRldiwgQ291bnRyeURvbWFpbkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gR2V0IFJlZ3VsYXRpb24gVGFibGUgZnJvbSBSZWcgRG9tYWluIik7CisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKGRldiwgQ291bnRyeURvbWFpbkNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFdXUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEVuYWJsZSA4MDIuMTFkIik7CisgICAgICAgICAgICAgICAgLyogYmVsb3cgbGluZSBzaGFsbCBiZSB1bm1hcmtlZCBhZnRlciBBIGJhbmQgaXMgcmVhZHkgKi8KKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5TZXREb3QxMURNb2RlKGRldiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBOT19FTlVNUkQpOworICAgICAgICB9CisKKyAgICAgICAgemZDb3JlTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9FRVBST01fUkVBRCkKKyAgICB7CisjaWYgMAorICAgICAgICB1OF90IGFkZHJbNl0sIENDUywgV1dSOworICAgICAgICB1MTZfdCBDb3VudHJ5RG9tYWluQ29kZTsKKyNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTxaTV9IQUxfTUFYX0VFUFJPTV9QUlE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhwUHJpdi0+ZWVwcm9tSW1hZ2VJbmRleCA8IDEwMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5lZXByb21JbWFnZVtocFByaXYtPmVlcHJvbUltYWdlSW5kZXgrK10gPSByc3BbaSsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChocFByaXYtPmVlcHJvbUltYWdlSW5kZXggPT0gKFpNX0hBTF9NQVhfRUVQUk9NX1JFUSpaTV9IQUxfTUFYX0VFUFJPTV9QUlEpKQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgZm9yIChpPTA7IGk8MTAyNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgImluZGV4PSIsIGkpOworICAgICAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgImVlcHJvbUltYWdlPSIsIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJNQUMgWzFdPSIsIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMGMvNF0pOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiTUFDIFsyXT0iLCBocFByaXYtPmVlcHJvbUltYWdlWzB4MjEwLzRdKTsKKyNpZiAwCisgICAgICAgICAgICBhZGRyWzBdID0gKHU4X3QpKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMGMvNF0gJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbMV0gPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMGMvNF0+PjgpICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzJdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdPj4xNikgJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbM10gPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMGMvNF0+PjI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkcls0XSA9ICh1OF90KShocFByaXYtPmVlcHJvbUltYWdlWzB4MjEwLzRdICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzVdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjEwLzRdPj44KSAmIDB4ZmYpOworCisgICAgICAgICAgICB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KGRldiwgYWRkcik7CisKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9MLAorICAgICAgICAgICAgICAgICAgICAoKCgodTMyX3QpYWRkclszXSk8PDI0KSB8ICgoKHUzMl90KWFkZHJbMl0pPDwxNikgfCAoKCh1MzJfdClhZGRyWzFdKTw8OCkgfCBhZGRyWzBdKSk7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfSCwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbNV0pPDw4KSB8IGFkZHJbNF0pKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgICAgIC8qIFJlZ3VsYXRvcnkgUmVsYXRlZCBTZXR0aW5nICovCisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSZWdEb21haW4gPSIsIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMDgvNF0pOworICAgICAgICAgICAgQ0NTID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdICYgMHg4MDAwKSA+PiAxNSk7CisgICAgICAgICAgICBXV1IgPSAodThfdCkoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgyMDgvNF0gJiAweDQwMDApID4+IDE0KTsKKyAgICAgICAgICAgIC8qIGJlbG93IGxpbmUgc2hhbGwgYmUgdW5tYXJrZWQgYWZ0ZXIgQSBiYW5kIGlzIHJlYWR5ICovCisgICAgICAgICAgICAvL0NvdW50cnlEb21haW5Db2RlID0gKHUxNl90KShocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdICYgMHgzRkZGKTsKKyAgICAgICAgICAgIENvdW50cnlEb21haW5Db2RlID0gODsKKyAgICAgICAgICAgIGlmIChDQ1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIENvdW50cnkgQ29kZSIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEdldCBSZWd1bGF0aW9uIFRhYmxlIGZyb20gUmVnIERvbWFpbiIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChXV1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBFbmFibGUgODAyLjExZCIpOworICAgICAgICAgICAgICAgIC8qIGJlbG93IGxpbmUgc2hhbGwgYmUgdW5tYXJrZWQgYWZ0ZXIgQSBiYW5kIGlzIHJlYWR5ICovCisgICAgICAgICAgICAgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYsIDEpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB6ZkNvcmVIYWxJbml0Q29tcGxldGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+ZWVwcm9tSW1hZ2VSZFJlcSsrOworICAgICAgICAgICAgemZIcExvYWRFRVBST01Gcm9tRlcoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fRUVQUk9NX1dSSVRFKQorICAgIHsKKyAgICAgICAgemZ3RGJnV3JpdGVFZXByb21Eb25lKGRldiwgY21kWzFdLCBjbWRbMl0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQU5JX1JFQUQpCisgICAgeworICAgICAgICB1MzJfdCBjeWNsZVRpbWUsIGN0bENsZWFyOworCisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkFOSSByc3BbMV09IiwgcnNwWzFdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQU5JIHJzcFsyXT0iLCByc3BbMl0pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzNdPSIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkFOSSByc3BbNF09IiwgcnNwWzRdKTsKKworICAgICAgICBocFByaXYtPmN0bEJ1c3kgKz0gcnNwWzFdOworICAgICAgICBocFByaXYtPmV4dEJ1c3kgKz0gcnNwWzJdOworCisgICAgICAgIGN5Y2xlVGltZSA9IDEwMDAwMDsgLy8xMDAgbWluaXNlY29uZHMKKworICAgICAgICBpZiAoY3ljbGVUaW1lID4gcnNwWzFdKQorICAgICAgICB7CisgICAgICAgICAgICBjdGxDbGVhciA9IChjeWNsZVRpbWUgLSByc3BbMV0pIC8gMTAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3RsQ2xlYXIgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICh3ZC0+YW5pRW5hYmxlKQorICAgICAgICAgICAgemZIcEFuaUFyUG9sbChkZXYsIGN0bENsZWFyLCByc3BbM10sIHJzcFs0XSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DTURfRUNITykKKyAgICB7CisgICAgICAgIGlmICggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSZUluaXQgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcmVIYWxJbml0Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBMb2FkRUVQUk9NRnJvbUZXKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GV19ETF9JTklUKQorICAgIHsKKyAgICAgICAgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKGRldik7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZXcml0ZVJlZ0ludGVybmFsUmVnICAgICAgICovCisvKiAgICAgIFdyaXRlIG9uIGNoaXAgaW50ZXJuYWwgcmVnaXN0ZXIgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZldyaXRlUmVnSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDEwODsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnICAgICAqLworLyogICAgICBXcml0ZSBvbiBjaGlwIGludGVybmFsIHJlZ2lzdGVyLCB3cml0ZSBvcGVyYXRpb24gbWF5IGJlICAgICAgICAgKi8KKy8qICAgICAgcG9zdHBvbmVkIHRvIGZvcm0gYSBtdWx0aXBsZSB3cml0ZSBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogY29tbWFuZCBiZWVuIHBvc3Rwb25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMSA6IGNvbW1hbmRzIGJlZW4gZXhlY3V0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogZW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBTdG9yZSBjb21tYW5kIHRvIGdsb2JhbCBidWZmZXIgKi8KKyAgICBocFByaXYtPmNtZC5kZWxheVdjbWRBZGRyW2hwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50XSA9IGFkZHI7CisgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kVmFsW2hwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50KytdID0gdmFsOworCisgICAgLyogSWYgcGVuZGluZyBjb21tYW5kIHJlYWNoIHNpemUgbGltaXQgKi8KKyAgICBpZiAoKGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50KSA+PSAoKFpNX01BWF9DTURfU0laRSAtIDQpID4+IDMpKQorICAgIHsKKyAgICAgICAgY21kWzBdID0gMHgwMDAwMDEwMCArIChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudDw8Myk7CisKKyAgICAgICAgLyogY29weSBjb21tYW5kIHRvIGNtZCBidWZmZXIgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8aHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY21kWzErKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZEFkZHJbaV07CisgICAgICAgICAgICBjbWRbMisoaTw8MSldID0gaHBQcml2LT5jbWQuZGVsYXlXY21kVmFsW2ldOworICAgICAgICB9CisgICAgICAgIC8qIHJlc2V0IHBlbmRpbmcgY29tbWFuZCAqLworICAgICAgICBocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCA9IDA7CisKKyAgICAgICAgLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8qIGlzc3VlIHdyaXRlIGNvbW1hbmQgKi8KKyAgICAgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCsoaTw8MyksIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlICAgICAgICAgICAqLworLyogICAgICBGbHVzaCBwZW5kaW5nIHdyaXRlIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogbm8gcGVuZGluZyBjb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMSA6IGNvbW1hbmRzIGJlZW4gZXhlY3V0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJldDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIElmIHRoZXJlIGlzIHBlbmRpbmcgY29tbWFuZCAqLworICAgIGlmIChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCA+IDApCisgICAgeworICAgICAgICBjbWRbMF0gPSAweDAwMDAwMTAwICsgKGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50PDwzKTsKKworICAgICAgICAvKiBjb3B5IGNvbW1hbmQgdG8gY21kIGJ1ZmZlciAqLworICAgICAgICBmb3IgKGk9MDsgaTxocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjbWRbMSsoaTw8MSldID0gaHBQcml2LT5jbWQuZGVsYXlXY21kQWRkcltpXTsKKyAgICAgICAgICAgIGNtZFsyKyhpPDwxKV0gPSBocFByaXYtPmNtZC5kZWxheVdjbWRWYWxbaV07CisgICAgICAgIH0KKyAgICAgICAgLyogcmVzZXQgcGVuZGluZyBjb21tYW5kICovCisgICAgICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50ID0gMDsKKworICAgICAgICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgLyogaXNzdWUgd3JpdGUgY29tbWFuZCAqLworICAgICAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0KyhpPDwzKSwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCit1MzJfdCB6ZmlEYmdEZWxheVdyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBhZGRyLCB2YWwpOworCXJldHVybiAwOworfQorCit1MzJfdCB6ZmlEYmdGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpCit7CisJemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1dyaXRlUmVnICAgICAgICAgICAgICAqLworLyogICAgICBXcml0ZSByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDEwODsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfV1JJVEUsIDApOworICAgIHJldHVybiByZXQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnV3JpdGVGbGFzaCAgICAgICAgICAgICovCisvKiAgICAgIFdyaXRlIGZsYXNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFlqc3VuZyAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjAyICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdXcml0ZUZsYXNoKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIC8vY21kWzBdID0gMHgwMDAwQjAwODsKKwkvKiBsZW5bMF0gOiB0eXBlWzB4QjBdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gOCB8IChaTV9DTURfV0ZMQVNIIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gdmFsOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9XUklURSwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1dyaXRlRWVwcm9tICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgRUVQUk9NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICAvL2NtZFswXSA9IDB4MDAwMEIwMDg7CisJLyogbGVuWzBdIDogdHlwZVsweEIwXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDggfCAoWk1fQ01EX1dSRUVQUk9NIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gdmFsOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX0VFUFJPTV9XUklURSwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0Jsb2NrV3JpdGVFZXByb20gICAgICAqLworLyogICAgICBCbG9jayBXcml0ZSBFZXByb20uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHAuczogbm93LGl0IHdpbGwgd3JpdGUgMTYgYnl0ZXMgcmVnaXN0ZXIgZGF0YSBwZXIgYmxvY2sgKE49NCkgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogaW5wdXQgZGF0YSBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyNkZWZpbmUgTiAgICAgICBidWZsZW4vNAorLy8jZGVmaW5lIFNJWkUgICAgKDIqTisxKQorCit1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmKQoreworICAgIHUzMl90IGNtZFs5XTsgIC8vMk4rMQorICAgIHUxNl90IHJldCxpOworCisgICAgLy9jbWRbMF0gPSAweDAwMDBCMDA4OworCSAgLyogbGVuWzBdIDogdHlwZVsweEIwXSA6IHNlcVs/XSAqLworCisgICAgLy9jbWRbMF0gPSAoOCpOKSB8IChaTV9DTURfV0ZMQVNIIDw8IDgpOworICAgIGNtZFswXSA9IDMyIHwgKFpNX0NNRF9XUkVFUFJPTSA8PCA4KTsgICAgLy84TgorCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSAgIC8vIGk8TgorICAgIHsKKyAgICAgICAgY21kWygyKmkpKzFdID0gYWRkcisoNCppKTsKKyAgICAgICAgY21kWygyKmkpKzJdID0gKihidWYraSk7CisgICAgfQorCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMzYsIFpNX0VFUFJPTV9XUklURSwgMCk7ICAgIC8vOE4rNAorCisgICAgLy8gYWRkZWQgZm9yIEVFUFJPTVVwZGF0ZSwgd2FpdCBhIG1vbWVudCBmb3IgcHJldmVudCBjbWQgcXVldWUgZnVsbCEKKyAgICAvL3pmd1NsZWVwKGRldiwgMSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qIHdyaXRlIEVFUFJPTSB3aXRoIHdybGVuIDogd3JsZW4gbXVzdCBiZSA0Km4gKi8KKy8qIGNvbW1hbmQgZm9ybWF0IDogY21kX2luZm8oNCkgKyBhZGRyKDQpICsgZWVwcm9tKHdybGVuKSAqLwordTMyX3QgemZpRGJnQmxvY2tXcml0ZUVlcHJvbV92Mih6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZiwgdTMyX3Qgd3JsZW4pCit7CisgICAgdTMyX3QgY21kWzE2XTsKKyAgICB1MTZfdCByZXQsaTsKKworCSAgLyogbGVuWzBdIDogdHlwZVsweEIwXSA6IHNlcVs/XSAqLworCSAgLyogbGVuID0gYWRkcig0KSArIGVlcHJvbV9ibG9jayh3cmxlbikgKi8KKyAgICBjbWRbMF0gPSAod3JsZW4rNCkgfCAoWk1fQ01EX01FTV9XUkVFUFJPTSA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworCisgICAgZm9yIChpPTA7IGk8KHdybGVuLzQpOyBpKyspICAgLy8gaTx3cmxlbi80CisgICAgeworICAgICAgICBjbWRbMitpXSA9ICooYnVmK2kpOworICAgIH0KKyAgICAvKiBjbWRfaW5mbyg0KSArIGFkZHIoNCkgKyBlZXByb20od3JsZW4pICovCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgKHUxNl90KSh3cmxlbis4KSwgWk1fRUVQUk9NX1dSSVRFLCAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkRiZ09wZW5FZXByb20gICAgICAgICAgICAqLworLyogICAgICBPcGVuIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmRGJnT3BlbkVlcHJvbSh6ZGV2X3QqIGRldikKK3sKKyAgICAvLyB1bmxvY2sgRUVQUk9NCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwMCwgMHgxMjM0NTY3OCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwNCwgMHg1NWFhMDBmZik7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwOCwgMHgxMzU3OWFjZSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQxNCwgMHgwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEYmdDbG9zZUVlcHJvbSAgICAgICAgICAgICovCisvKiAgICAgIENsb3NlIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA1ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmRGJnQ2xvc2VFZXByb20oemRldl90KiBkZXYpCit7CisgICAgLy8gbG9jayBFRVBST00KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDAwLCAweDg3NjU0MzIxKTsKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDQsIDB4ZmZmZmZmZmYpOworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwOCwgMHhmZmZmZmZmZik7CisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDE0LCAweDEwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpU2VyaWFsbHlXcml0ZUVlcHJvbSAgICAgICovCisvKiAgICAgIFdyaXRlIEVFUFJPTSBTZXJpYWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogc3RhcnQgYWRkcmVzcyBvZiB3cml0aW5nIEVFUFJPTSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogaW5wdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmxlbiA6IHNpemUgb2YgaW5wdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAobGVuZ3RoIG9mIGRhdGEgd3JpdGUgaW50byBFRVBST00pICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaVNlcmlhbGx5V3JpdGVFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiBidWYsIHUzMl90IGJ1ZmxlbikKK3sKKyAgICB1MzJfdCBjb3VudDsKKyAgICB1MTZfdCBpLHJldCxibG9ja3NpemU7CisgICAgdThfdCAgdGVtcFsyXTsKKworICAgIC8vIHBlciA0IGJ5dGVzID0gMSBjb3VudAorICAgIGNvdW50ID0gYnVmbGVuLzQ7CisKKyAgICAvLyBPcGVuIEVFUFJPTQorICAgIHpmRGJnT3BlbkVlcHJvbShkZXYpOworCisgICAgLy8gV3JpdGUgRUVQUk9NCisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6ZndXcml0ZUVlcHJvbShkZXYsIChhZGRyKyg0KmkpKSwgKihidWYraSksIDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBmYWlsZWQsIENsb3NlIEVFUFJPTQorICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZ3V3JpdGVFZXByb20gZmFpbGVkIFxuIik7CisgICAgICAgICAgICB6ZkRiZ0Nsb3NlRWVwcm9tKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENsb3NlIEVFUFJPTQorICAgIHpmRGJnQ2xvc2VFZXByb20oZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlTZXJpYWxseUJsb2NrV3JpdGVFZXByb20gKi8KKy8qICAgICAgIEJsb2NrIFdyaXRlIEVFUFJPTSBTZXJpYWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIChCbG9ja1dyaXRlOiBwZXIgMTZieXRlcyB3cml0ZSBFRVBST00gb25jZSkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogaW5wdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmxlbiA6IGFjY2VzcyBkYXRhIHNpemUgb2YgYnVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpU2VyaWFsbHlCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCBidWZsZW4pCit7CisgICAgdTMyX3QgY291bnQ7CisgICAgdTE2X3QgaSxyZXQsYmxvY2tzaXplOworICAgIHU4X3QgIHRlbXBbMl07CisKKyAgICAvLyBwZXIgNCBieXRlcyA9IDEgY291bnQKKyAgICBjb3VudCA9IGJ1Zmxlbi80OworCisgICAgLy8gT3BlbiBFRVBST00KKyAgICB6ZkRiZ09wZW5FZXByb20oZGV2KTsKKworICAgIC8vIFdyaXRlIEVFUFJPTQorICAgIC8vIEVFUFJPTSBXcml0ZSBzdGFydCBhZGRyZXNzIGZyb206IDB4MTAwMCE/CisgICAgLy8gcGVyIDE2Ynl0ZXMoTj00KSBibG9jayB3cml0ZSBFRVBST00gb25jZQorICAgIGZvciAoaT0wOyBpPChjb3VudC80KTsgaSsrKSAgIC8vIGNvdW50L04KKyAgICB7CisgICAgICAgIC8vemZpRGJnQmxvY2tXcml0ZUVlcHJvbShkZXYsIChhZGRyKyg0Kk4qaSkpLCBidWYrKE4qaSkpOworICAgICAgICAvL3pmaURiZ0Jsb2NrV3JpdGVFZXByb20oZGV2LCAoYWRkcisoMTYqaSkpLCBidWYrKDQqaSkpOworICAgICAgICBpZiAoemZ3QmxvY2tXcml0ZUVlcHJvbShkZXYsIChhZGRyKygxNippKSksIGJ1ZisoNCppKSwgMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZpRGJnQmxvY2tXcml0ZUVlcHJvbSBmYWlsZWQgXG4iKTsKKyAgICAgICAgICAgIC8vIENsb3NlIEVFUFJPTQorICAgICAgICAgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDbG9zZSBFRVBST00KKyAgICB6ZkRiZ0Nsb3NlRWVwcm9tKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnRHVtcEVlcHJvbSAgICAgICAgICAgICovCisvKiAgICAgIER1bXAgRUVQUk9NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogc3RhcnQgYWRkcmVzcyBvZiBkdW1waW5nIEVFUFJPTSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGF0YWxlbiA6ICBsZW5ndGggb2YgYWNjZXNzIEVFUFJPTSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogIHBvaW50IG9mIGJ1ZmZlciwgdGhlIGJ1ZmZlciBzYXZlZCBkdW1wIGRhdGEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdEdW1wRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBkYXRhbGVuLCB1MzJfdCogYnVmKQoreworICAgIHUzMl90IGNvdW50OworICAgIHUxNl90IGkscmV0OworCisgICAgY291bnQgPSBkYXRhbGVuLzQ7CisKKyAgICAvLyBvdmVyIEVFUFJPTSBsZW5ndGgKKyAgICBpZihkYXRhbGVuID4gMHgyMDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgYnVmW2ldID0gemZ3UmVhZEVlcHJvbShkZXYsIGFkZHIrKDQqaSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnUmVhZFJlZyAgICAgICAgICAgICAgICovCisvKiAgICAgIFJlYWQgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1JlYWRSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIpCit7CisgICAgdTMyX3QgY21kWzJdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDQ7CisgICAgY21kWzFdID0gYWRkcjsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9SRUFELCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdSZWFkVGFsbHkgICAgICAgICAgICAgKi8KKy8qICAgICAgUmVhZCByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdSZWFkVGFsbHkoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgY21kWzFdOworICAgIHUxNl90IHJldDsKKwl6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKwlpZiAoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ICkKKwl7CisJICAgIHJldHVybiAxOworCX0KKworCS8qIGxlblswXSA6IHR5cGVbMHg4MV0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSAwIHwgKFpNX0NNRF9UQUxMWSA8PCA4KTsKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0LCBaTV9PSURfVEFMTFksIDApOworCisJLyogbGVuWzBdIDogdHlwZVsweDgyXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDAgfCAoWk1fQ01EX1RBTExZX0FQRCA8PCA4KTsKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0LCBaTV9PSURfVEFMTFlfQVBELCAwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKwordTMyX3QgemZpRGJnU2V0SUZTeW50aGVzaXplcih6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpCit7CisgICAgdTMyX3QgY21kWzJdOworICAgIHUxNl90IHJldDsKKworCS8qIGxlbls0XSA6IHR5cGVbMHgzMl0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSAweDQgfCAoWk1fT0lEX1NZTlRIIDw8IDgpOworICAgIGNtZFsxXSA9IHZhbHVlOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX1NZTlRILCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZmlEYmdRdWVyeUh3VHhCdXN5KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsxXTsKKyAgICB1MTZfdCByZXQ7CisKKwkvKiBsZW5bNF0gOiB0eXBlWzB4QzBdIDogc2VxWz9dICovCisJY21kWzBdID0gMCB8IChaTV9DTURfREtUWF9TVEFUVVMgPDwgOCk7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA0LCBaTV9PSURfREtUWF9TVEFUVVMsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vUGF1bCsrCisjaWYgMAordTE2X3QgemZIcEJsb2NrRXJhc2VGbGFzaCh6ZGV2X3QgKmRldiwgdTMyX3QgYWRkcikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwNCB8IChaTV9DTURfRkxBU0hfRVJBU0UgPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWYgMAordTE2X3QgemZpRGJnUHJvZ3JhbUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBvZmZzZXQsIHUzMl90IGxlbiwgdTMyX3QgKmRhdGEpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldDsKKyAgICB1MTZfdCBpOworCisKKyAgICBjbWRbMF0gPSAoWk1fQ01EX0ZMQVNIX1BST0cgPDwgOCkgfCAoKGxlbis4KSAmIDB4ZmYpOworICAgIGNtZFsxXSA9IG9mZnNldDsKKyAgICBjbWRbMl0gPSBsZW47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbiA+PiAyKTsgaSsrKQorICAgIHsKKyAgICAgICAgIGNtZFszK2ldID0gZGF0YVtpXTsKKyAgICB9CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0ZMQVNIX1BST0dSQU0sIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnQ2hpcEVyYXNlRmxhc2ggICAgICAgICovCisvKiAgICAgIENoaXAgRXJhc2UgRmxhc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIEF0aGVyb3MgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA5ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpRGJnQ2hpcEVyYXNlRmxhc2goemRldl90ICpkZXYpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDAgfCAoWk1fQ01EX0ZMQVNIX0VSQVNFIDw8IDgpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0gICAgICAqLworLyogICAgICBHZXQgRmxhc2hDaGVja1N1bS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IFN0YXJ0IGFkZHJlc3Mgb2YgZ2V0Y2hrc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGxlbiA6IHRvdGFsIGxlbnRoIG9mIGNhbGN1bGF0ZSBnZXRjaGtzdW0gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIEF0aGVyb3MgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA4ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnR2V0Rmxhc2hDaGVja1N1bSh6ZGV2X3QgKmRldiwgdTMyX3QgYWRkciwgdTMyX3QgbGVuKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MzJfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDA4IHwgKFpNX0NNRF9GTEFTSF9DSEtTVU0gPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSBsZW47CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0ZMQVNIX0NIS1NVTSwgTlVMTCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnUmVhZEZsYXNoICAgICAgICAgICAgICovCisvKiAgICAgIFJlYWQgRmxhc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogU3RhcnQgYWRkcmVzcyBvZiByZWFkIGZsYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuIDogdG90YWwgbGVudGggb2YgcmVhZCBmbGFzaCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgQXRoZXJvcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDkgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdSZWFkRmxhc2goemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTMyX3QgcmV0OworCisgICAgY21kWzBdID0gbGVuIHwgKFpNX0NNRF9GTEFTSF9SRUFEIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfRkxBU0hfUkVBRCwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURvd25sb2FkRndTZXQgICAgICAgICAgICAqLworLyogICAgICBCZWZvcmUgRG93bmxvYWQgRlcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ29tbWFuZCBGVyB0byBTb2Z0d2FyZSByZXNldCBhbmQgY2xvc2Ugd2F0Y2ggZG9nIGNvbnRyb2wuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIEF0aGVyb3MgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA5ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRG93bmxvYWRGd1NldCh6ZGV2X3QgKmRldikKK3sKKy8vc29mdHdhcmVyZXNldAorLy9jbG9zZSB3YXRjaCBkb2cKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTMyX3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwOCB8IChaTV9DTURfRldfRExfSU5JVCA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfRldfRExfSU5JVCwgTlVMTCk7CisKKyAgICByZXR1cm4gcmV0OworfQorLy9QYXVsLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NmRlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5jCkBAIC0wLDAgKzEsMTU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogdWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBVU0IgZGVzY3JpcHRvciBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKworZXh0ZXJuIHZvaWQgemZ3VXNiQ21kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOworCitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKK2V4dGVybiB1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldik7CisKKworI2RlZmluZSBVU0JfRU5EUE9JTlRfVFhfSU5ERVggICAxCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9SWF9JTkRFWCAgIDIKKyNkZWZpbmUgVVNCX0VORFBPSU5UX0lOVF9JTkRFWCAgMworI2RlZmluZSBVU0JfRU5EUE9JTlRfQ01EX0lOREVYICA0CisKK3ZvaWQgemZJZGxDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKK3sKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorICAgIHpmd1VzYkNtZChkZXYsIFVTQl9FTkRQT0lOVF9DTURfSU5ERVgsIGNtZCwgY21kTGVuKTsKKyNlbmRpZgorCisgICAgcmV0dXJuOworfQorCisKKy8qIHpmQWRqdXN0Q3RybFNldHRpbmc6IGZpdCBPVVRTIGZvcm1hdCAqLworLyogICAgIGNvbnZlcnQgTUlNTzIgdG8gT1VUUyAgICAgICAgICAgICAqLwordm9pZCB6ZkFkanVzdEN0cmxTZXR0aW5nKHpkZXZfdCogZGV2LCB1MTZfdCogaGVhZGVyLCB6YnVmX3QqIGJ1ZikKK3sKKyAgICAvKiBNSU1PMiA9PiBPVVRTIEZCLTUwICovCisgICAgLyogbGVuZ3RoIG5vdCBjaGFuZ2UsIG9ubHkgbW9kaWZ5IGZvcm1hdCAqLworCisgICAgdTMyX3Qgb2xkTVQ7CisJdTMyX3Qgb2xkTUNTOworCisgICAgdTMyX3QgcGh5Q3RybDsKKyAgICB1MzJfdCBvbGRQaHlDdHJsOworCisgICAgdTE2X3QgdHBjID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAvKiBtbSAqLworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIG9sZFBoeUN0cmwgPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCA0KSB8ICgodTMyX3Qpem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNikgPDwgMTYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvbGRQaHlDdHJsID0gaGVhZGVyWzJdIHwgKCh1MzJfdCloZWFkZXJbM10gPDwxNik7CisgICAgfQorCisJcGh5Q3RybCA9IDA7CisKKworCS8qIE1UIDogQml0WzF+MF0gKi8KKwlvbGRNVCA9IG9sZFBoeUN0cmwmMHgzOworCXBoeUN0cmwgfD0gb2xkTVQ7CisgICAgaWYgKCBvbGRNVCA9PSAweDMgKSAgIC8qIERMLU9GRE0gKER1cGxpY2F0ZSBMZWdhY3kgT0ZETSkgKi8KKwkJcGh5Q3RybCB8PSAweDE7CisKKworCS8qIFBUIDogQml0WzJdICAgIEhUIFBUOiAwIE1peGVkIG1vZGUgICAgMSBHcmVlbiBmaWVsZCAqLworCXBoeUN0cmwgfD0gKG9sZFBoeUN0cmwmMHg0KTsKKworCS8qIEJhbmR3aWR0aCBjb250cm9sIDogQml0WzR+M10gKi8KKwlpZiAoIG9sZFBoeUN0cmwmMHg4MDAwMDAgKSAgICAvKiBCaXQyMyA6IDQwTSAqLworCXsKKwkJI2lmIDAKKwkJaWYgKG9sZE1UID09IDB4MykgICAgICAgICAgICAgLyogREwtT0ZETSAqLworICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHgzPDwzKTsgICAvKiA0ME0gZHVwbGljYXRlICovCisJCWVsc2UKKwkJCXBoeUN0cmwgfD0gKDB4Mjw8Myk7ICAgLyogNDBNIHNoYXJlZCAqLworCQkjZWxzZQorCQlpZiAob2xkTVQgPT0gMHgyICYmICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwKQorCQl7CisJCQlwaHlDdHJsIHw9ICgweDI8PDMpOyAgIC8qIDQwTSBzaGFyZWQgKi8KKwkJfQorCQkjZW5kaWYKKwl9CisJZWxzZSB7CisgICAgICAgIG9sZFBoeUN0cmwgJj0gfjB4ODAwMDAwMDA7CisgICAgfQorCisJLyogTUNTIDogQml0WzI0fjE4XSAqLworCW9sZE1DUyA9IChvbGRQaHlDdHJsJjB4N2YwMDAwKT4+MTY7ICAvKiBCaXRbMjJ+MTZdICovCisJcGh5Q3RybCB8PSAob2xkTUNTPDwxOCk7CisKKwkvKiBTaG9ydCBHSSA6IEJpdFszMV0qLworICAgIHBoeUN0cmwgfD0gKG9sZFBoeUN0cmwmMHg4MDAwMDAwMCk7CisKKwkvKiBBTSA6IEFudGVubmEgbWFzayAqLworCS8vaWYgKChvbGRNVCA9PSAyKSAmJiAob2xkTUNTID4gNykpCisJaWYgKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKwl7CisJICAgIHBoeUN0cmwgfD0gKDB4MTw8MTUpOworCX0KKwllbHNlCisJeworCSAgICAvKiBIVCAgICAgICAgICAgICAgICAgICAgIFR4IDIgY2hhaW4gKi8KKwkgICAgLyogT0ZETSA2TS85TS8xMk0vMThNLzI0TSBUeCAyIGNoYWluICovCisJICAgIC8qIE9GRE0gMzZNLzQ4TS81NE0vICAgICAgVHggMSBjaGFpbiAqLworCSAgICAvKiBDQ0sgICAgICAgICAgICAgICAgICAgIFR4IDIgY2hhaW4gKi8KKwkgICAgaWYgKChvbGRNVCA9PSAyKSB8fCAob2xkTVQgPT0gMykpCisJICAgIHsKKwkgICAgICAgIHBoeUN0cmwgfD0gKDB4NTw8MTUpOworCSAgICB9CisJICAgIGVsc2UgaWYgKG9sZE1UID09IDEpCisJICAgIHsKKwkgICAgICAgIGlmICgob2xkTUNTID09IDB4YikgfHwgKG9sZE1DUyA9PSAweGYpIHx8CisJICAgICAgICAgICAgKG9sZE1DUyA9PSAweGEpIHx8IChvbGRNQ1MgPT0gMHhlKSB8fAorCSAgICAgICAgICAgIChvbGRNQ1MgPT0gMHg5KSkgICAgICAgICAgICAgICAgICAgICAgIC8vNk0vOU0vMTJNLzE4TS8yNE0KKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKKwkgICAgICAgIH0KKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDE8PDE1KTsKKwkgICAgICAgIH0KKwkgICAgfQorCSAgICBlbHNlIC8vKG9sZE1UPT0wKQorCSAgICB7CisJICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKKwkgICAgfQorCX0KKwkvL2Vsc2UKKwkvLyAgICBwaHlDdHJsIHw9ICgweDE8PDE1KTsKKworCS8qIFRQQyAqLworCS8qIFRPRE8gOiBhY2NlbGVyYXRpbmcgdGhlc2UgY29kZSAqLworCWlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkKKwl7CisgICAgICAgIGlmIChvbGRNVCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgKi8KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeENja1tvbGRNQ1NdJjB4M2YpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9sZE1UID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9GRE0gKi8KKyAgICAgICAgICAgIGlmIChvbGRNQ1MgPT0gMHhjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzNdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1syXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdbMV0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHg5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9ICgoaHBQcml2LT50UG93MngyZ1swXS1ocFByaXYtPnRQb3cyeDJnMjRIZWF2eUNsaXBPZmZzZXQpJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9sZE1UID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggb2xkUGh5Q3RybCYweDgwMDAwMCApICAgIC8qIEJpdDIzIDogNDBNICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSFQgNDAgKi8KKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ0h0NDBbb2xkTUNTJjB4N10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSFQgMjAgKi8KKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ0h0MjBbb2xkTUNTJjB4N10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLy81R0h6CisgICAgeworICAgICAgICBpZiAob2xkTVQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT0ZETSAqLworICAgICAgICAgICAgaWYgKG9sZE1DUyA9PSAweGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbM10mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnWzJdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4ZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1sxXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG9sZFBoeUN0cmwmMHg4MDAwMDAgKSAgICAvKiBCaXQyMyA6IDQwTSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDQwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdIdDQwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDIwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdIdDIwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogVHggcG93ZXIgYWRqdXN0IGZvciBIVDQwICovCisJLyogSFQ0MCAgICsxZEJtICovCisJaWYgKChvbGRNVD09MikgJiYgKG9sZFBoeUN0cmwmMHg4MDAwMDApICkKKwl7CisJICAgIHRwYyArPSAyOworCX0KKwl0cGMgJj0gMHgzZjsKKworICAgIC8qIEV2bCBmb3JjZSB0eCBUUEMgKi8KKyAgICBpZih3ZC0+Zm9yY2VUeFRQQykKKyAgICB7CisgICAgICAgIHRwYyA9ICh1MTZfdCkod2QtPmZvcmNlVHhUUEMgJiAweDNmKTsKKyAgICB9CisKKyAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgd2QtPm1heFR4UG93ZXIyICY9IDB4M2Y7CisgICAgICAgIHRwYyA9ICh0cGMgPiB3ZC0+bWF4VHhQb3dlcjIpPyB3ZC0+bWF4VHhQb3dlcjIgOiB0cGM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2QtPm1heFR4UG93ZXI1ICY9IDB4M2Y7CisgICAgICAgIHRwYyA9ICh0cGMgPiB3ZC0+bWF4VHhQb3dlcjUpPyB3ZC0+bWF4VHhQb3dlcjUgOiB0cGM7CisgICAgfQorCisKKyNkZWZpbmUgWk1fTUlOX1RQQyAgICAgNQorI2RlZmluZSBaTV9UUENfT0ZGU0VUICA1CisjZGVmaW5lIFpNX1NJR05BTF9USFJFU0hPTEQgIDU2CisgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPT0gRkFMU0UpICYmICh3ZC0+c3RhLmJDaGFubmVsU2NhbiA9PSBGQUxTRSkpCisgICAgeworICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAmJiAod2QtPlNpZ25hbFN0cmVuZ3RoID4gWk1fU0lHTkFMX1RIUkVTSE9MRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cGMgPiAoKFpNX01JTl9UUEMrWk1fVFBDX09GRlNFVCkqMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjIC09IChaTV9UUENfT0ZGU0VUKjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHBjID4gKFpNX01JTl9UUEMqMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKFpNX01JTl9UUEMqMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjdW5kZWYgWk1fTUlOX1RQQworI3VuZGVmIFpNX1RQQ19PRkZTRVQKKyN1bmRlZiBaTV9TSUdOQUxfVEhSRVNIT0xECisKKyAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgIHBoeUN0cmwgfD0gKHRwYyAmIDB4M2YpIDw8IDk7CisgICAgI2VuZGlmCisKKyAgICAvKiBTZXQgYml0c1s4OjZdQkYtTUNTIGZvciBoZWF2eSBjbGlwICovCisgICAgaWYgKChwaHlDdHJsJjB4MykgPT0gMikKKwl7CisJICAgIHBoeUN0cmwgfD0gKChwaHlDdHJsID4+IDEyKSAmIDB4MWMwKTsKKyAgICB9CisKKwkvKiBQSFkgY29udHJvbCAqLworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCA0LCAodTE2X3QpIChwaHlDdHJsJjB4ZmZmZikpOworICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgNiwgKHUxNl90KSAocGh5Q3RybD4+MTYpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgIGhlYWRlclsyXSA9ICh1MTZfdCkgKHBoeUN0cmwmMHhmZmZmKTsKKyAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIGhlYWRlclszXSA9ICh1MTZfdCkgKHBoeUN0cmw+PjE2KTsKKyAgICB9CisKKwl6bV9tc2cyX3R4KFpNX0xWXzIsICJvbGQgcGh5IGN0cmwgPSAiLCBvbGRQaHlDdHJsKTsKKyAgICB6bV9tc2cyX3R4KFpNX0xWXzIsICJuZXcgcGh5IGN0cmwgPSAiLCBwaHlDdHJsKTsKKwkvL0RiZ1ByaW50KCJvbGQgcGh5IGN0cmwgPSUwOHggXG4iLCBvbGRQaHlDdHJsKTsKKyAgICAvL0RiZ1ByaW50KCJuZXcgcGh5IGN0cmwgPSUwOHggXG4iLCBwaHlDdHJsKTsKK30KKworCisjZGVmaW5lIEVYVFJBX0lORk9fTEVOICAgICAgMjQgICAgLy9SU1NJKDcpICsgRVZNKDEyKSArIFBIWSgxKSArIE1BQ1N0YXR1cyg0KQordTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICB1MTZfdCogc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1MTZfdCogdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCkKK3sKKyNpZiBaTV9TV19MT09QX0JBQ0sgPT0gMQorICAgIHpidWZfdCAqcnhidWY7CisgICAgdThfdCAqcHVSeEJ1ZjsKKyAgICB1OF90ICpwSGRyOworCSAgIHU4X3QgKnBzbmFwOworCSAgIHUxNl90IHBsY3BsZW4gPSAxMjsKKyAgICB1MTZfdCBpOworICAgCXUxNl90IHN3bHBPZmZzZXQ7CisjZW5kaWYgLyogI2lmIFpNX1NXX0xPT1BfQkFDSyA9PSAxICovCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJ6ZkhwU2VuZCgpLCBsZW4gPSAiLCAxMiArIGhlYWRlckxlbi04ICsgc25hcExlbiArIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpICsgNCArIDgpOworCisJLyogQWRqdXN0IGN0cmwgc2V0dGluZyA6IDZOMTQgeWpzdW5nICovCisgICAgemZBZGp1c3RDdHJsU2V0dGluZyhkZXYsIGhlYWRlciwgYnVmKTsKKworI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCisgICAgaHBQcml2LT51c2JTZW5kQnl0ZXMgKz0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1thYyYweDNdICs9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU3VibWl0IFVTQiBPdXQgVXJiICovCisgICAgemZ3VXNiU2VuZChkZXYsIFVTQl9FTkRQT0lOVF9UWF9JTkRFWCwgKHU4X3QgKiloZWFkZXIsIGhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICAgICh1OF90ICopc25hcCwgc25hcExlbiwgKHU4X3QgKil0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCk7CisjZW5kaWYKKworI2lmIFpNX1NXX0xPT1BfQkFDSyA9PSAxCisKKyAgICByeGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgcGxjcGxlbiArIGhlYWRlckxlbi04ICsgc25hcExlbiArICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpICsgNCArIEVYVFJBX0lORk9fTEVOKTsKKyAgICBwSGRyID0gKHU4X3QgKikgaGVhZGVyKzg7CisgICAJcHNuYXAgPSAodThfdCAqKSBzbmFwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAvKiBzb2Z0d2FyZSBsb29wIGJhY2sgKi8KKyAgICAvKiBDb3B5IFdMQU4gaGVhZGVyIGFuZCBwYWNrZXQgYnVmZmVyICovCisgICAJc3dscE9mZnNldCA9IHBsY3BsZW47CisKKyAgICBmb3IoaSA9IDA7IGkgPCBoZWFkZXJMZW4tODsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCtpLCBwSGRyW2ldKTsKKyAgICB9CisKKyAgIAlzd2xwT2Zmc2V0ICs9IGhlYWRlckxlbi04OworCisgICAgLyogQ29weSBTTkFQIGhlYWRlciAqLworICAgIGZvcihpID0gMDsgaSA8IHNuYXBMZW47IGkrKykKKyAgICB7CisJCSAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgcnhidWYsIHN3bHBPZmZzZXQraSwgcHNuYXBbaV0pOworICAgIH0KKworCSAgIHN3bHBPZmZzZXQgKz0gc25hcExlbjsKKworICAgIC8qIENvcHkgYm9keSBmcm9tIHR4IGJ1ZiB0byByeGJ1ZiAqLworICAgIGZvcihpID0gMDsgaSA8ICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpOyBpKyspCisgICAgeworICAgICAgICB1OF90IHZhbHVlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaStvZmZzZXQpOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHZhbHVlKTsKKyAgICB9CisKKwkgICAvKiB0b3RhbCBsZW5ndGggPSBQTENQICsgICAgICAgICBNYWNIZWFkZXIgICAgICAgKyBQYXlsb2FkICAgKyBGQ1MgKyBSWHN0YXR1cyAqLworCSAgIC8qICAgICAgICAgICAgICAgICAxMiAgKyAgaGVhZGVyTGVuLTggICsgc25hcExlbiArIGJ1ZiBsZW5ndGggKyA0ICArIDggICAgICAgICovCisgICAJemZ3U2V0QnVmU2V0U2l6ZShkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0ICsgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldCkgKyA0ICsgRVhUUkFfSU5GT19MRU4gKTsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworCSAgIC8vemZ3RHVtcEJ1ZihkZXYsIHJ4YnVmKTsKKwkgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vemZDb3JlUmVjdihkZXYsIHJ4YnVmKTsKKworI2VuZGlmIC8qICNpZiBaTV9TV19MT09QX0JBQ0sgKi8KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisvKiBSZXBvcnQgbW9uaXRlciBIYWwgcnggaW5mb3JtYXRpb24gYWJvdXQgcnNzaSwgZXZtLCBiYW5kd2lkdGgsIFNHIGV0YyAqLwordm9pZCB6ZkhwUXVlcnlNb25IYWxSeEluZm8oemRldl90KiBkZXYsIHU4X3QgKm1vbkhhbFJ4SW5mbykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgemZNZW1vcnlDb3B5KG1vbkhhbFJ4SW5mbywKKyAgICAgICAgICAgICAgICAodThfdCopJigoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mbyksCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0hhbFJ4SW5mbykpOworfQorCisKK3U4X3QgemZJc0RhdGFGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBmcmFtZVR5cGU7CisgICAgdThfdCBtcGR1SW5kOworCisgICAgbXBkdUluZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLTEpOworCisgICAgLyogc2lubGdlIG9yIEZpcnN0ICovCisgICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MjApCisgICAgeworICAgICAgICBmcmFtZVR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOworICAgIH0KKworICAgIGlmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZjQ29udmVydFJhdGVPRkRNKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICAvLyBXaGF0J3MgdGhlIGRlZmF1bHQgdmFsdWU/PworICAgIHUzMl90IE1DUyA9IDA7CisKKyAgICBzd2l0Y2goem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkmIDB4ZikKKyAgICB7CisgICAgICAgIGNhc2UgMHhiOgorICAgICAgICAgICAgTUNTID0gMHg0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmOgorICAgICAgICAgICAgTUNTID0gMHg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhhOgorICAgICAgICAgICAgTUNTID0gMHg2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhlOgorICAgICAgICAgICAgTUNTID0gMHg3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg5OgorICAgICAgICAgICAgTUNTID0gMHg4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhkOgorICAgICAgICAgICAgTUNTID0gMHg5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg4OgorICAgICAgICAgICAgTUNTID0gMHhhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhjOgorICAgICAgICAgICAgTUNTID0gMHhiOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBNQ1M7Cit9CisKK3UxNl90IHpmSHBHZXRQYXlsb2FkTGVuKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwbGNwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCisgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgdThfdCBtb2R1bGF0aW9uLG1wZHVJbmQ7CisgICAgdTE2X3QgbG93LCBoaWdoLCBtc2I7CisgICAgczE2X3QgcGF5bG9hZExlbiA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBtcGR1SW5kID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTEpOworICAgIG1vZHVsYXRpb24gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpKSAmIDB4MzsKKyAgICAqcnhNVCA9IG1vZHVsYXRpb247CisKKyAgICAvL3ptX2RlYnVnX21zZzEoIiBtb2R1bGF0aW9uPSAiLCBtb2R1bGF0aW9uKTsKKyAgICBzd2l0Y2ggKG1vZHVsYXRpb24pIHsKKyAgICBjYXNlIDA6IC8qIENDSyBNb2RlICovCisgICAgICAgIGxvdyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIpOworICAgICAgICBoaWdoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMyk7CisgICAgICAgIHBheWxvYWRMZW4gPSAobG93IHwgaGlnaCA8PCA4KSAtIDQ7CisgICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgKnJ4TUNTID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAqcnhCVyAgPSAwOworICAgICAgICAgICAgKnJ4U0cgID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIExlZ2FjeS1PRkRNIG1vZGUgKi8KKyAgICAgICAgbG93ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNTsKKyAgICAgICAgaGlnaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworICAgICAgICBtc2IgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyKSAmIDB4MTsKKyAgICAgICAgcGF5bG9hZExlbiA9IChsb3cgfCAoaGlnaCA8PCAzKSB8IChtc2IgPDwgMTEpKSAtIDQ7CisgICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgKnJ4TUNTID0gemZjQ29udmVydFJhdGVPRkRNKGRldiwgYnVmKTsKKyAgICAgICAgICAgICpyeEJXICA9IDA7CisgICAgICAgICAgICAqcnhTRyAgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogSFQgT0ZETSBtb2RlICovCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiYWdncmVnYXRpb249ICIsICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCA2KSA+PiAzKSAmMHgxICk7CisgICAgICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKSAgICAvL3NpbmdsZSBvciBsYXN0IG1wZHUKKyAgICAgICAgICAgIHBheWxvYWRMZW4gPSBsZW4gLSAyNCAtIDQgLSBwbGNwSGRyTGVuOyAgLy8gLSByeFN0YXR1cyAtIGZjcworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBheWxvYWRMZW4gPSBsZW4gLSA0IC0gNCAtIHBsY3BIZHJMZW47ICAvLyAtIHJ4U3RhdHVzIC0gZmNzCisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzEoImZpcnN0IG9yIG1pZGRsZSBtcGR1LCBwbGNwSGRyTGVuPSAiLCBwbGNwSGRyTGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyeE1DUyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpICYgMHg3ZjsKKyAgICAgICAgICAgICpyeEJXICA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzKSA+PiA3KSAmIDB4MTsKKyAgICAgICAgICAgICpyeFNHICA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCA2KSA+PiA3KSAmIDB4MTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKworICAgIH0KKyAgICAvKiByZXR1cm4gdGhlIHBheWxvYWQgbGVuZ3RoIC0gRkNTICovCisgICAgaWYgKHBheWxvYWRMZW4gPCAwKSBwYXlsb2FkTGVuID0gMDsKKyAgICByZXR1cm4gcGF5bG9hZExlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVVzYlJlY3YgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3IgVVNCIElOIFRyYW5zZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXY6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBaTV9JTlRfVVNFX0VQMiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFICAgMTIKKworI2lmIFpNX0lOVF9VU0VfRVAyID09IDEKK3ZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CisjZW5kaWYKKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKK3ZvaWQgemZpVXNiUmVjdlBlclBrdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCisjZWxzZQordm9pZCB6ZmlVc2JSZWN2KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKKyNlbmRpZgoreworCisKKyNpZiBaTV9GV19MT09QX0JBQ0sgIT0gMQorICAgIHU4X3QgbXBkdUluZDsKKyAgICB1MTZfdCBwbGNwSGRyTGVuOworICAgIHUxNl90IGNyY1BsdXNSeFN0YXR1c0xlbjsKKyAgICB1MTZfdCBsZW4sIHBheWxvYWRMZW49MDsKKyAgICB1MTZfdCBpOyAvL0NXWWFuZygrKQorICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIHUzMl90ICAgICAgICAgICAgICAgcnhNVDsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4TUNTOworICAgIHUzMl90ICAgICAgICAgICAgICAgcnhCVzsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4U0c7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInpmaVVzYlJlY3YoKSIpOworCisjaWYgWk1fSU5UX1VTRV9FUDIgPT0gMQorCisgICAgZm9yIChpPTA7IGk8KFpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFPj4xKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIGkqMikgIT0gMHhmZmZmKQorICAgICAgICAJYnJlYWs7CisgICAgfQorCisgICAgaWYgKGk9PShaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRT4+MSkpCisgICAgeworICAgICAgICB1MzJfdCAgICAgICAgICAgICAgIHJzcFtaTV9VU0JfTUFYX0VQSU5UX0JVRkZFUi80XTsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICByc3BMZW47CisgICAgICAgIHUzMl90ICAgICAgICAgICAgICAgcnNwaTsKKyAgICAgICAgdThfdCogICAgICAgICAgICAgICBwZHN0ID0gKHU4X3QqKXJzcDsKKworICAgICAgICAvKiBJbnRlcnJ1cHQgUnNwICovCisgICAgICAgIHJzcExlbiA9ICh1MTZfdCkgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU7CisKKyAgICAgICAgaWYgKHJzcExlbiA+IDYwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJHZXQgZXJyb3IgbGVuIGJ5IEVQMiA9IFxuIiwgcnNwTGVuKTsKKyAgICAgICAgICAgIC8qIGZyZWUgVVNCIGJ1ZiAqLworCSAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKwkgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChyc3BpPTA7IHJzcGk8cnNwTGVuOyByc3BpKyspCisgICAgICAgIHsKKyAgICAgICAgCSpwZHN0ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgcnNwaStaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSk7CisgICAgICAgIAlwZHN0Kys7CisgICAgICAgIH0KKworICAgICAgICAvL2lmIChhZGFwdGVyLT56ZmNiVXNiUmVnSW4pCisgICAgICAgIC8vICAgIGFkYXB0ZXItPnpmY2JVc2JSZWdJbihhZGFwdGVyLCByc3AsIHJzcExlbik7CisgICAgICAgIHpmaVVzYlJlZ0luKGRldiwgcnNwLCByc3BMZW4pOworCisJICAgICAgLyogZnJlZSBVU0IgYnVmICovCisJICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisJICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIFpNX0lOVF9VU0VfRVAyID09IDEgKi8KKworICAgIFpNX1BFUkZPUk1BTkNFX1JYX01QRFUoZGV2LCBidWYpOworCisgICAgaWYgKHdkLT5zd1NuaWZmZXIpCisgICAgeworICAgICAgICAvKiBhaXJvcGVlazogUmVwb3J0IGV2ZXJ5dGhpbmcgdXAgKi8KKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlYWQgdGhlIGxhc3QgYnl0ZSAqLworICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisKKyAgICAvKiBGaXJzdCBNUERVICovCisgICAgaWYoKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKQorICAgIHsKKyAgICAgICAgdTE2X3QgZHVyYXRpb247CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzNikgPT0gMCkgLy9BQyA9IEJFCisgICAgICAgIHsKKyAgICAgICAgICAgIGR1cmF0aW9uID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA9IGR1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPiAxMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vRGJnUHJpbnQoImFnZ01heER1cmF0aW9uQkU9JWQiLCBocFByaXYtPmFnZ01heER1cmF0aW9uQkUpOworICAgICAgICB9CisgICAgfQorCisjaWYgMQorICAgIC8qIEZpcnN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KKyAgICBpZigoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwKSB8fCAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKSkKKyAgICAvL2lmICgobXBkdUluZCAmIDB4MTApID09IDB4MDApCisgICAgeworICAgICAgICBwbGNwSGRyTGVuID0gMTI7ICAgICAgICAvLyBQTENQIGhlYWRlciBsZW5ndGgKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCkgPT0gd2QtPm1hY0FkZHJbMl0pIHsKKyAgICAgICAgICAgIHBsY3BIZHJMZW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE2KSA9PSB3ZC0+bWFjQWRkclswXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCkgPT0gd2QtPm1hY0FkZHJbMV0gJiYKKyAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjApID09IHdkLT5tYWNBZGRyWzJdKXsKKyAgICAgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHBsY3BIZHJMZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTGFzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCisgICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MTApCisgICAgeworICAgICAgICBjcmNQbHVzUnhTdGF0dXNMZW4gPSBFWFRSQV9JTkZPX0xFTiArIDQ7ICAgICAvLyBFeHRyYSBieXRlcyArIEZDUworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjcmNQbHVzUnhTdGF0dXNMZW4gPSA0ICsgNDsgICAgIC8vIEV4dHJhIDQgYnl0ZXMgKyBGQ1MKKyAgICB9CisjZWxzZQorICAgIHBsY3BIZHJMZW4gPSAxMjsKKyAgICBjcmNQbHVzUnhTdGF0dXNMZW4gPSBFWFRSQV9JTkZPX0xFTiArIDQ7ICAgICAvLyBFeHRyYSBieXRlcyArIEZDUworI2VuZGlmCisKKyAgICBpZiAobGVuIDwgKHBsY3BIZHJMZW4rMTArY3JjUGx1c1J4U3RhdHVzTGVuKSkKKyAgICB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMCwgIkludmFsaWQgUnggbGVuZ3RoPSIsIGxlbik7CisgICAgICAgIC8vemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkaXNwbGF5IFJTU0kgY29tYmluZWQgKi8KKyAgICAvKgorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgKiCieCBQTENQIEhlYWRlciCieCAgTVBEVSAgonggUlNTSSCieCAgRVZNIKJ4IFBIWSBFcnIgonggIE1BQyBTdGF0dXMgongKKyAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggICAgIDEyICAgICAgonggICAgbiAgIKJ4ICA3ICAgonggIDEyICCieCAgICAxICAgIKJ4ICAgICAgNCAgICAgIKJ4CisgICAgICogonyid6J3oneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3oneifQorICAgICAqCVJTU0kgZmlsZWQgKEZyb20gQkIgYW5kIE1BQyBqdXN0IHBhc3MgdGhlbSB0byBob3N0KQorICAgICAqICAgQnl0ZTE6IFJTU0kgZm9yIGFudGVubmEgMC4KKyAgICAgKiAgIEJ5dGUyOiBSU1NJIGZvciBhbnRlbm5hIDEuCisgICAgICogICBCeXRlMzogUlNTSSBmb3IgYW50ZW5uYSAyLgorICAgICAqICAgQnl0ZTQ6IFJTU0kgZm9yIGFudGVubmEgMCBleHRlbnNpb24uCisgICAgICogICBCeXRlNTogUlNTSSBmb3IgYW50ZW5uYSAxIGV4dGVuc2lvbi4KKyAgICAgKiAgIEJ5dGU2OiBSU1NJIGZvciBhbnRlbm5hIDIgZXh0ZW5zaW9uLgorICAgICAqICAgQnl0ZTc6IFJTU0kgZm9yIGFudGVubmEgY29tYmluZWQuCisgICAgICovCisKKyAgICAvL3ptX2RlYnVnX21zZzEoIiByZWN2IFJTU0kgPSAiLCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpLTE3KSk7CisKKyAgICBwYXlsb2FkTGVuID0gemZIcEdldFBheWxvYWRMZW4oZGV2LCBidWYsIGxlbiwgcGxjcEhkckxlbiwgJnJ4TVQsICZyeE1DUywgJnJ4QlcsICZyeFNHKTsKKworICAgIC8qIEhhbCBSeCBpbmZvICovCisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvICYmIHpmSXNEYXRhRnJhbWUoZGV2LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhTVQgICA9IHJ4TVQ7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhEYXRhTUNTICA9IHJ4TUNTOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YUJXICAgPSByeEJXOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YVNHICAgPSByeFNHOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwbGNwSGRyTGVuICsgcGF5bG9hZExlbikgPiBsZW4pIHsKKyAgICAgICAgem1fbXNnMV9yeChaTV9MVl8wLCAiSW52YWxpZCBwYXlsb2FkIGxlbmd0aD0iLCBwYXlsb2FkTGVuKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1N0b3JlIFJ4IFRhaWwgSW5mb21hdGlvbiBiZWZvcmUgUmVtb3ZlLS1DV1lhbmcoKykKKworI2lmIDAKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3JjUGx1c1J4U3RhdHVzTGVuLTQ7IGkrKykKKyAgICB7CisgICAgICAgYWRkSW5mby5UYWlsLkJ5dGVbaV0gPQorICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gY3JjUGx1c1J4U3RhdHVzTGVuICsgNCArIGkpOworICAgIH0KKyNlbHNlCisvKgorKiBCcmllZiBmb3JtYXQgb2YgT1VUUyBjaGlwCisqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyogonggUExDUCBIZWFkZXIgonggIE1QRFUgIKJ4IFJTU0kgonggIEVWTSCieCBQSFkgRXJyIKJ4ICBNQUMgU3RhdHVzIKJ4CisqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3onQKKyogonggICAgIDEyICAgICAgonggICAgbiAgIKJ4ICA3ICAgonggIDEyICCieCAgICAxICAgIKJ4ICAgICAgNCAgICAgIKJ4CisqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyogUlNTSToKKyogICAgICAgQnl0ZSAxICBhbnRlbm5hIDAKKyogICAgICAgQnl0ZSAyICBhbnRlbm5hIDEKKyogICAgICAgQnl0ZSAzICBhbnRlbm5hIDIKKyogICAgICAgQnl0ZSA0ICBhbnRlbm5hIDAgZXh0ZW5zaW9uCisqICAgICAgIEJ5dGUgNSAgYW50ZW5uYSAxIGV4dGVuc2lvbgorKiAgICAgICBCeXRlIDYgIGFudGVubmEgMiBleHRlbnNpb24KKyogICAgICAgQnl0ZSA3ICBhbnRlbm5hIGNvbWJpbmVkCisqIEVWTToKKyogICAgICAgQnl0ZSAxICBTdHJlYW0gMCBwaWxvdCAwCisqICAgICAgIEJ5dGUgMiAgU3RyZWFtIDAgcGlsb3QgMQorKiAgICAgICBCeXRlIDMgIFN0cmVhbSAwIHBpbG90IDIKKyogICAgICAgQnl0ZSA0ICBTdHJlYW0gMCBwaWxvdCAzCisqICAgICAgIEJ5dGUgNSAgU3RyZWFtIDAgcGlsb3QgNAorKiAgICAgICBCeXRlIDYgIFN0cmVhbSAwIHBpbG90IDUKKyogICAgICAgQnl0ZSA3ICBTdHJlYW0gMSBwaWxvdCAwCisqICAgICAgIEJ5dGUgOCAgU3RyZWFtIDEgcGlsb3QgMQorKiAgICAgICBCeXRlIDkgIFN0cmVhbSAxIHBpbG90IDIKKyogICAgICAgQnl0ZSAxMCBTdHJlYW0gMSBwaWxvdCAzCisqICAgICAgIEJ5dGUgMTEgU3RyZWFtIDEgcGlsb3QgNAorKiAgICAgICBCeXRlIDEyIFN0cmVhbSAxIHBpbG90IDUKKyovCisKKyAgICAvKiBGaWxsIHRoZSBUYWlsIGluZm9ybWF0aW9uICovCisgICAgLyogTGFzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCisgICAgaWYgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCB8fCAobXBkdUluZCAmIDB4MzApID09IDB4MTApCisgICAgeworI2RlZmluZSBaTV9SWF9SU1NJX0NPTVBFTlNBVElPTiAgICAgMjcKKyAgICAgICAgdThfdCB6bV9yeF9yc3NpX2NvbXBlbnNhdGlvbiA9IFpNX1JYX1JTU0lfQ09NUEVOU0FUSU9OOworCisgICAgCS8qIFJTU0kgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAobGVuLTEpIC0gMTcpICsgKChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKT96bV9yeF9yc3NpX2NvbXBlbnNhdGlvbjowKTsKKyN1bmRlZiBaTV9SWF9SU1NJX0NPTVBFTlNBVElPTgorCisgICAgICAvKiBFVk0gKi8KKworICAgICAgLyogVE9ETzogZm9yIFJEL0JCIGRlYnVnIG1lc3NhZ2UgKi8KKyAgICAgIC8qIHNhdmUgY3VycmVudCByeCBodyBpbmZvbXJhdGlvbiwgcmVwb3J0IHRvIERydkNvcmUvQXBwbGljYXRpb24gKi8KKyAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbyAmJiB6ZklzRGF0YUZyYW1lKGRldiwgYnVmKSkKKyAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgdHJzc2k7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw3OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJzc2kgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMjMgKyBpKTsKKwkgICAgICAgICAgICBpZiAodHJzc2kmMHg4MCkKKwkgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyc3NpID0gKCh+KCh1OF90KXRyc3NpKSAmIDB4N2YpICsgMSkgJiAweDdmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVtpXSA9IHRyc3NpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJ4TVQ9PTIpCisgICAgICAgICAgeworICAgICAgICAgICAgLy9pZiAocnhCVykKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgCSAgZm9yIChpPTA7IGk8MTI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkgLSAxNiArIGkpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8JICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAvLyAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNW2ldID0KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSAtIDE2ICsgaSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICB9CisKKyAgICAgICAgICAjaWYgMAorICAgICAgICAgIC8qIHByaW50ICovCisgICAgICAgICAgICB6bV9kYmcoKCJNVCglZCkgTUNTKCVkKSBCVyglZCkgU0coJWQpIFJTU0k6JWQsJWQsJWQsJWQsJWQsJWQsJWQgRVZNOiglZCwlZCwlZCwlZCwlZCwlZCkoJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICByeE1ULAorICAgICAgICAgICAgICAgICAgICAgICByeE1DUywKKyAgICAgICAgICAgICAgICAgICAgICAgcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgcnhTRywKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbM10sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbNl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bNV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzddLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzEwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzExXQorICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAjZW5kaWYKKyAgICAgIH0gLyogaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvICYmIHpmSXNEYXRhRnJhbWUoZGV2LCBidWYpKSAqLworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE1pZCBvciBGaXJzdCBhZ2dyZWdhdGUgZnJhbWUgd2l0aG91dCBwaHkgcnggaW5mb3JtYXRpb24gKi8KKyAgICAgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxID0gMDsKKyAgICB9CisKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDIgPSAwOworICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMyA9IDA7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsUXVhbGl0eSAgID0gMDsKKworICAgIGFkZEluZm8uVGFpbC5EYXRhLlNBSW5kZXggICAgICAgICAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gNCk7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuREFJbmRleCAgICAgICAgICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSAzKTsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDIpOworICAgIGFkZEluZm8uVGFpbC5EYXRhLlJ4TWFjU3RhdHVzICAgICAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gMSk7CisKKyNlbmRpZgorICAgIC8qIFJlbW92ZSBDUkMgYW5kIFJ4IFN0YXR1cyAqLworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIChsZW4tY3JjUGx1c1J4U3RhdHVzTGVuKSk7CisgICAgLy96ZndCdWZTZXRTaXplKGRldiwgYnVmLCBwYXlsb2FkTGVuICsgcGxjcEhkckxlbik7ICAgIC8qIHBheWxvYWRMZW4gKyBQTENQIDEyIC0gRkNTIDQqLworCisgICAgLy9TdG9yZSBQTENQIEhlYWRlciBJbmZvbWF0aW9uIGJlZm9yZSBSZW1vdmUtLUNXWWFuZygrKQorICAgIGlmIChwbGNwSGRyTGVuICE9IDApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxjcEhkckxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRJbmZvLlBsY3BIZWFkZXJbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhZGRJbmZvLlBsY3BIZWFkZXJbMF0gPSAwOworICAgIH0KKyAgICAvKiBSZW1vdmUgUExDUCBoZWFkZXIgKi8KKyAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCBwbGNwSGRyTGVuKTsKKworICAgIC8qIGhhbmRsZSA4MDIuMTEgZnJhbWUgKi8KKyAgICB6ZkNvcmVSZWN2KGRldiwgYnVmLCAmYWRkSW5mbyk7CisKKyNlbHNlCisgICAgLyogRmlybXdhcmUgbG9vcGJhY2s6IFJ4IGZyYW1lID0gVHggZnJhbWUgICAgICAgKi8KKyAgICAvKiBjb252ZXJ0IFJ4IGZyYW1lIHRvIGZpdCByZWNlaXZlIGZyYW1lIGZvcm1hdCAqLworICAgIHpidWZfdCAqbmV3X2J1ZjsKKyAgICB1OF90ICAgIGN0cmxfb2Zmc2V0ID0gODsKKyAgICB1OF90ICAgIFBMQ1BfTGVuID0gMTI7CisgICAgdThfdCAgICBkYXRhOworICAgIHU4X3QgICAgaTsKKworCisgICAgLyogVHg6ICB8IGN0cmxfc2V0dGluZyB8IE1hYyBoZHIgfCBkYXRhIHwgKi8KKyAgICAvKiAgICAgICAgICAgIDggICAgICAgICAgICAyNCAgICAgICB4ICAgICAqLworCisgICAgLyogUng6ICAgICAgICAgIHwgUExDUCB8IE1hYyBoZHIgfCBkYXRhIHwgRkNTIHwgUnhzdGF0dXMgfCAqLworICAgIC8qICAgICAgICAgICAgICAgICAxMiAgICAgIDI0ICAgICAgICB4ICAgICA0ICAgICAgIDggICAgICAgKi8KKworICAgIC8qIG5ldyBhbGxvY2F0ZSBhIHJ4IGZvcm1hdCBzaXplIGJ1ZiAqLworICAgIG5ld19idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLTgrMTIrNCtFWFRSQV9JTkZPX0xFTik7CisKKyAgICBmb3IgKGk9MDsgaTx6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1jdHJsX29mZnNldDsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGN0cmxfb2Zmc2V0K2kpOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIG5ld19idWYsIFBMQ1BfTGVuK2ksIGRhdGEpOworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdfYnVmLCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS04KzEyKzQrRVhUUkFfSU5GT19MRU4pOworCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICAvKiByZWNlaXZlIHRoZSBuZXdfYnVmICovCisgICAgLy96ZkNvcmVSZWN2KGRldiwgbmV3X2J1Zik7CisKKyNlbmRpZgorCit9CisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCit2b2lkIHpmaVVzYlJlY3YoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQoreworICAgIHUxNl90IGluZGV4ID0gMDsKKyAgICB1MTZfdCBjaGtJZHg7CisgICAgdTMyX3Qgc3RhdHVzID0gMDsKKyAgICB1MTZfdCBpaTsKKyAgICB6YnVmX3QgKm5ld0J1ZjsKKyAgICB6YnVmX3QgKnJ4QnVmUG9vbFs4XTsKKyAgICB1MTZfdCByeEJ1ZlBvb2xJbmRleCA9IDA7CisgICAgc3RydWN0IHpzSHBQcml2ICpoYWxQcml2OworICAgIHU4X3QgKnNyY0J1ZlB0cjsKKyAgICB1MzJfdCBidWZmZXJMZW5ndGg7CisgICAgdTE2X3QgdXNiUnhSZW1haW5MZW47CisgICAgdTE2X3QgdXNiUnhQa3RMZW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBoYWxQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKyAgICBzcmNCdWZQdHIgPSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpOworCisgICAgYnVmZmVyTGVuZ3RoID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBaZXJvIExlbmd0aCBUcmFuc2ZlciAqLworICAgIGlmICghYnVmZmVyTGVuZ3RoKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1c2JSeFJlbWFpbkxlbiA9IGhhbFByaXYtPnVzYlJ4UmVtYWluTGVuOworICAgIHVzYlJ4UGt0TGVuID0gaGFsUHJpdi0+dXNiUnhUcmFuc2ZlckxlbjsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW55IGRhdGEgaW4gdGhlIGxhc3QgdHJhbnNmZXIgKi8KKyAgICBpZiAodXNiUnhSZW1haW5MZW4gIT0gMCApCisgICAgeworICAgICAgICB6YnVmX3QgKnJlbWFpbkJ1ZlB0ciA9IGhhbFByaXYtPnJlbWFpbkJ1ZjsKKyAgICAgICAgdThfdCogQnVmUHRyID0gTlVMTDsKKworICAgICAgICBpZiAoIHJlbWFpbkJ1ZlB0ciAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgcmVtYWluQnVmUHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4ID0gdXNiUnhSZW1haW5MZW47CisgICAgICAgIHVzYlJ4UmVtYWluTGVuIC09IGhhbFByaXYtPnVzYlJ4UGFkTGVuOworCisgICAgICAgIC8qICBDb3B5IGRhdGEgKi8KKyAgICAgICAgaWYgKCBCdWZQdHIgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoJihCdWZQdHJbdXNiUnhQa3RMZW5dKSwgc3JjQnVmUHRyLCB1c2JSeFJlbWFpbkxlbik7CisgICAgICAgIH0KKworICAgICAgICB1c2JSeFBrdExlbiArPSB1c2JSeFJlbWFpbkxlbjsKKyAgICAgICAgaGFsUHJpdi0+dXNiUnhSZW1haW5MZW4gPSAwOworCisgICAgICAgIGlmICggcmVtYWluQnVmUHRyICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgcmVtYWluQnVmUHRyLCB1c2JSeFBrdExlbik7CisgICAgICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSByZW1haW5CdWZQdHI7CisgICAgICAgIH0KKyAgICAgICAgaGFsUHJpdi0+cmVtYWluQnVmID0gTlVMTDsKKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzEoImxlbmd0aDogJWRcbiIsIChpbnQpcFVzYlJ4VHJhbnNmZXItPnBSeFVyYi0+VXJiQnVsa09ySW50ZXJydXB0VHJhbnNmZXIuVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCisgICAgYnVmZmVyTGVuZ3RoID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisvL3ByaW50aygiYnVmZmVyTGVuZ3RoICVkXG4iLCBidWZmZXJMZW5ndGgpOworICAgIHdoaWxlKGluZGV4IDwgYnVmZmVyTGVuZ3RoKQorICAgIHsKKyAgICAgICAgdTE2X3QgcGt0TGVuOworICAgICAgICB1MTZfdCBwa3RUYWc7CisgICAgICAgIC8vdThfdCAqcHRyID0gKHU4X3QqKSgoc3RydWN0IHpzQnVmZmVyKilwVXNiUnhUcmFuc2Zlci0+YnVmKS0+ZGF0YTsKKyAgICAgICAgdThfdCAqcHRyID0gc3JjQnVmUHRyOworCisgICAgICAgIC8qIFJldHJpZXZlIHBhY2tldCBsZW5ndGggYW5kIHRhZyAqLworICAgICAgICBwa3RMZW4gPSBwdHJbaW5kZXhdICsgKHB0cltpbmRleCsxXSA8PCA4KTsKKyAgICAgICAgcGt0VGFnID0gcHRyW2luZGV4KzJdICsgKHB0cltpbmRleCszXSA8PCA4KTsKKworICAgICAgICBpZiAocGt0VGFnID09IFpNX1VTQl9TVFJFQU1fTU9ERV9UQUcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IHBhZExlbjsKKworICAgICAgICAgICAgem1fYXNzZXJ0KHBrdExlbiA8IFpNX1dMQU5fTUFYX1JYX1NJWkUpOworCisgICAgICAgICAgICAvL3ByaW50aygiR2V0IGEgcGFja2V0LCBwa3RMZW46IDB4JTA0eFxuIiwgcGt0TGVuKTsKKyAgICAgICAgICAgICNpZiAwCisgICAgICAgICAgICAvKiBEdW1wIGRhdGEgKi8KKyAgICAgICAgICAgIGZvciAoaWkgPSBpbmRleDsgaWkgPCBwa3RfbGVuKzQ7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweCUwMnggIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh6bXdfcnhfYnVmX3JlYWRiKGFkYXB0ZXIsIHBVc2JSeFRyYW5zZmVyLT5idWYsIGlpKSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgIGlmICgoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGJnUHJpbnQoIlxuIik7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogQ2FsY3VhdGUgdGhlIHBhZGRpbmcgbGVuZ3RoLCBpbiB0aGUgY3VycmVudCBkZXNpZ24sCisgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIHNob3VsZCBiZSBwYWRkZWQgdG8gNCBieXRlIGJvdW5kcmF5LiAqLworICAgICAgICAgICAgcGFkTGVuID0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU4gLSAocGt0TGVuICYgMHgzKTsKKworICAgICAgICAgICAgaWYocGFkTGVuID09IFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOKQorICAgICAgICAgICAgICAgIHBhZExlbiA9IDA7CisKKyAgICAgICAgICAgIGNoa0lkeCA9IGluZGV4OworICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOICsgcGt0TGVuICsgcGFkTGVuOworCisgICAgICAgICAgICBpZiAoY2hrSWR4ID4gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNoa0lkeCBpcyB0b28gbGFyZ2UsIGNoa0lkeDogJWRcbiIsIGNoa0lkeCk7CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbmRleCA+IFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N0cnVjdCB6c0J1ZmZlciogQnVmUHRyOworICAgICAgICAgICAgICAgIC8vc3RydWN0IHpzQnVmZmVyKiBVc2JCdWZQdHI7CisgICAgICAgICAgICAgICAgdThfdCAqQnVmUHRyOworICAgICAgICAgICAgICAgIHU4X3QgKlVzYkJ1ZlB0cjsKKworICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4UmVtYWluTGVuID0gaW5kZXggLSBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkU7IC8vIC0gcGFkTGVuOworICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4gPSBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUgLQorICAgICAgICAgICAgICAgICAgICAgICAgY2hrSWR4IC0gWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU47CisgICAgICAgICAgICAgICAgaGFsUHJpdi0+dXNiUnhQYWRMZW4gPSBwYWRMZW47CisgICAgICAgICAgICAgICAgLy9jaGVja19pbmRleCA9IGluZGV4OworCisgICAgICAgICAgICAgICAgaWYgKGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4gPiBaTV9XTEFOX01BWF9SWF9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiY2hlY2tfbGVuIGlzIHRvbyBsYXJnZSwgY2hrX2xlbjogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsUHJpdi0+dXNiUnhUcmFuc2Zlckxlbik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG5ld0J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fV0xBTl9NQVhfUlhfU0laRSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIG5ld0J1ZiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIG5ld0J1Zik7CisgICAgICAgICAgICAgICAgICAgIFVzYkJ1ZlB0ciA9IHNyY0J1ZlB0cjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3TWVtb3J5Q29weShCdWZQdHIsICYoVXNiQnVmUHRyW2Noa0lkeCtaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTl0pLCBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgIGhhbFByaXYtPnJlbWFpbkJ1ZiA9IG5ld0J1ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCogQnVmUHRyOworICAgICAgICAgICAgICAgIHU4X3QqIFVzYkJ1ZlB0cjsKKworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG5ld0J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fV0xBTl9NQVhfUlhfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKCBuZXdCdWYgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWZQdHIgPSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBuZXdCdWYpOworICAgICAgICAgICAgICAgICAgICBVc2JCdWZQdHIgPSBzcmNCdWZQdHI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoQnVmUHRyLCAmKFVzYkJ1ZlB0cltjaGtJZHgrWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU5dKSwgcGt0TGVuKTsKKworICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgbmV3QnVmLCBwa3RMZW4pOworICAgICAgICAgICAgICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSBuZXdCdWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGk7CisKKyAgICAgICAgICAgICAgICBEYmdQcmludCgiQ2FuJ3QgZmluZCB0YWcsIHBrdF9sZW46IDB4JTA0eCwgdGFnOiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwa3RMZW4sIHBrdFRhZyk7CisKKyAgICAgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgiJTAyeCAiLCBidWYtPmRhdGFbaW5kZXgtMTYraV0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoaSAmIDB4ZikgPT0gMHhmKQorICAgICAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgIC8vemZ3QnVmRnJlZShhZGFwdGVyLCBwVXNiUnhUcmFuc2Zlci0+YnVmLCAwKTsKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIGZvcihpaSA9IDA7IGlpIDwgcnhCdWZQb29sSW5kZXg7IGlpKyspCisgICAgeworICAgICAgICB6ZmlVc2JSZWN2UGVyUGt0KGRldiwgcnhCdWZQb29sW2lpXSk7CisgICAgfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVzYkluaXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW5pdGlhbGl6ZSBVU0IgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZVc2JJbml0KHpkZXZfdCogZGV2KQoreworICAgIC8qIEluaXRpYWxpemUgUnggJiBJTlQgZW5kcG9pbnQgZm9yIHJlY2VpdmluZyBkYXRhICYgaW50ZXJydXB0ICovCisgICAgemZ3VXNiRW5hYmxlUnhFcHQoZGV2LCBVU0JfRU5EUE9JTlRfUlhfSU5ERVgpOworICAgIHpmd1VzYkVuYWJsZUludEVwdChkZXYsIFVTQl9FTkRQT0lOVF9JTlRfSU5ERVgpOworCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVzYkZyZWUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnJlZSBQQ0kgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZVc2JGcmVlKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0hwUHJpdiAqaGFsUHJpdjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhhbFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQorICAgIGlmICggaGFsUHJpdi0+cmVtYWluQnVmICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGhhbFByaXYtPnJlbWFpbkJ1ZiwgMCk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcFNlbmRCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBsZW4pCit7CisgICAgdTMyX3QgaHcsIGx3OworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogV3JpdGUgdG8gYmVhY29uIGJ1ZmZlciAoWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTKSAqLworICAgIGZvciAoaSA9IDA7IGk8bGVuOyBpKz00KQorICAgIHsKKyAgICAgICAgbHcgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICAgICAgaHcgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKzIpOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTK2ksIChodzw8MTYpK2x3KTsKKyAgICB9CisKKyAgICAvKiBCZWFjb24gUENMUCBoZWFkZXIgKi8KKyAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUExDUCwgKChsZW4rNCk8PCgzKzE2KSkrMHgwNDAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QTENQLCAoKGxlbis0KTw8KDE2KSkrMHgwMDFiKTsKKyAgICB9CisKKyAgICAvKiBCZWFjb24gbGVuZ3RoIChpbmNsdWRlIENSQzMyKSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fTEVOR1RILCBsZW4rNCk7CisKKyAgICAvKiBCZWFjb24gUmVhZHkgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0NUUkwsIDEpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKiBGcmVlIGJlYWNvbiBidWYgKi8KKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIHJldHVybjsKK30KKworCisjZGVmaW5lIFpNX1NUQVRVU19UWF9DT01QICAgICAgIDB4MDAKKyNkZWZpbmUgWk1fU1RBVFVTX1JFVFJZX0NPTVAgICAgMHgwMQorI2RlZmluZSBaTV9TVEFUVVNfVFhfRkFJTEVEICAgICAweDAyCit2b2lkIHpmaVVzYlJlZ0luKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pCit7CisgICAgLy91OF90IGxlbiwgdHlwZSwgaTsKKyAgICB1OF90IHR5cGU7CisgICAgdThfdCAqdThyc3A7CisgICAgdTE2X3Qgc3RhdHVzOworICAgIHUzMl90IGJpdG1hcDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJ6ZmlVc2JSZWdJbigpIik7CisKKyAgICB1OHJzcCA9ICh1OF90ICopcnNwOworCisgICAgLy9sZW4gPSAqdThyc3A7CisgICAgdHlwZSA9ICoodThyc3ArMSk7CisgICAgdThyc3AgPSB1OHJzcCs0OworCisKKyAgICAvKiBJbnRlcnJ1cHQgZXZlbnQgKi8KKyAgICBpZiAoKHR5cGUgJiAweEMwKSA9PSAweEMwKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gMHhDMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAwLCB1OHJzcCk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzEpCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaTsKKyAgICAgICAgICAgICAgICBEYmdQcmludCgicnNwTGVuPSVkXG4iLCByc3BMZW4pOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCJyc3BbJWRdPTB4JWx4XG4iLCBpLCByc3BbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgc3RhdHVzID0gKHUxNl90KShyc3BbM10gPj4gMTYpOworCisgICAgICAgICAgICAvLy8vNjc4OQorICAgICAgICAgICAgcnNwWzhdID0gcnNwWzhdID4+IDIgfCAocnNwWzldICYgMHgxKSA8PCA2OworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFpNX1NUQVRVU19SRVRSWV9DT01QIDoKKyAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDEsIHU4cnNwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBVFVTX1RYX0ZBSUxFRCA6CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAyLCB1OHJzcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFpNX1NUQVRVU19UWF9DT01QIDoKKyAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDMsIHU4cnNwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQmVhY29uQ2ZnSW50ZXJydXB0KGRldiwgdThyc3ApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDMykKKyAgICAgICAgeworICAgICAgICAgICAgemZFbmRPZkF0aW1XaW5kb3dJbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzQpCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaTsKKyAgICAgICAgICAgICAgICBEYmdQcmludCgiMHhDMjpyc3BMZW49JWRcbiIsIHJzcExlbik7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KHJzcExlbi80KTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzI6cnNwWyVkXT0weCVseFxuIiwgaSwgcnNwW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGJpdG1hcCA9IChyc3BbMV0gPj4gMTYpICsgKChyc3BbMl0gJiAweEZGRkYpIDw8IDE2ICk7CisgICAgICAgICAgICAvL3pmQmF3Q29yZShkZXYsICh1MTZfdClyc3BbMV0gJiAweEZGRkYsIGJpdG1hcCwgKHUxNl90KShyc3BbMl0gPj4gMTYpICYgMHhGRik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM1KQorICAgICAgICB7CisgICAgICAgICAgICB1MTZfdCBpOworI2lmIDAKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8KHJzcExlbi80KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzU6cnNwWyVkXT0weCVseFxuIiwgaSwgcnNwW2ldKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZm9yIChpPTE7IGk8KHJzcExlbi80KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdThyc3AgPSAodThfdCAqKShyc3AraSk7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiMHhDNTpyc3BbJWRdPTB4JWx4XG4iLCBpLCAoKHUzMl90Kil1OHJzcClbMF0pOworICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgNCwgdThyc3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDNikKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiXG5cbiBXYXRjaERvZyBpbnRlcnJ1cHQhISEgOiAweEM2IFxuXG4iKTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vUFpTV19BREFQVEVSIGFkYXB0ZXI7CisKKyAgICAgICAgICAgIC8vIGZvciBTUEkgZmxhc2ggcHJvZ3JhbSBjaGsgRmxhZworICAgICAgICAgICAgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIiMjIyMjIFR4IHJldHJhbnNtaXNzaW9uIDUgdGltZXMgZXZlbnQgIyMjIyMiKTsKKworICAgICAgICAgICAgLyogY29ycmVjdCB0eCByZXRyYW5zbWlzc2lvbiBpc3N1ZSAqLworICAgICAgICAgICAgaHBQcml2LT5yZXRyYW5zbWlzc2lvbkV2ZW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZklkbFJzcChkZXYsIHJzcCwgcnNwTGVuKTsKKyAgICB9Cit9CisKKworI2RlZmluZSBaTV9QUk9HUkFNX1JBTV9BRERSICAgICAweDIwMDAwMCAvLzB4MTAwMCAvLzB4NzAwMDAwCisjZGVmaW5lIEZJUk1XQVJFX0RPV05MT0FEICAgICAgIDB4MzAKKyNkZWZpbmUgRklSTVdBUkVfRE9XTkxPQURfQ09NUCAgMHgzMQorI2RlZmluZSBGSVJNV0FSRV9DT05GSVJNICAgICAgICAweDMyCisKK3UxNl90IHpmRmlybXdhcmVEb3dubG9hZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOworICAgIHUzMl90IHVDb2RlT2ZzdCA9IG9mZnNldDsKKyAgICB1OF90ICppbWFnZSwgKnB0cjsKKyAgICB1MzJfdCByZXN1bHQ7CisKKyAgICBpbWFnZSA9ICh1OF90KikgZnc7CisgICAgcHRyID0gaW1hZ2U7CisKKyAgICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICAgIHUzMl90IHRyYW5zbGVuID0gKGxlbiA+IDQwOTYpID8gNDA5NiA6IGxlbjsKKworICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90KSAodUNvZGVPZnN0ID4+IDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGltYWdlLCB0cmFuc2xlbik7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiAtPSB0cmFuc2xlbjsKKyAgICAgICAgaW1hZ2UgKz0gdHJhbnNsZW47CisgICAgICAgIHVDb2RlT2ZzdCArPSB0cmFuc2xlbjsgLy8gaW4gV29yZCAoMTYgYml0KQorCisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorCisgICAgLyogSWYgZG93bmxvYWQgZmlybXdhcmUgc3VjY2VzcywgaXNzdWUgYSBjb21tYW5kIHRvIGZpcm13YXJlICovCisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0RPV05MT0FEX0NPTVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCwgMCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEX0NPTVAgZmFpbGVkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorCisjaWYgMAorICAgIC8qIFBDSSBjb2RlICovCisgICAgLyogV2FpdCBmb3IgZmlybXdhcmUgcmVhZHkgKi8KKyAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfQ09ORklSTSwgVVNCX0RJUl9JTiB8IDB4NDAsCisgICAgICAgICAgICAgICAgICAgICAwLCAwLCAmcmV0X3ZhbHVlLCBzaXplb2YocmV0X3ZhbHVlKSwgSFopOworCisgICAgaWYgKHJlc3VsdCAhPSAwKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJDYW4ndCByZWNlaXZlIGZpcm13YXJlIHJlYWR5OiAiLCByZXN1bHQpOworICAgICAgICByZXQgPSAxOworICAgIH0KKyNlbmRpZgorCitleGl0OgorCisgICAgcmV0dXJuIHJldDsKKworfQorCit1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWROb3RKdW1wKHpkZXZfdCogZGV2LCB1MzJfdCogZncsIHUzMl90IGxlbiwgdTMyX3Qgb2Zmc2V0KQoreworICAgIHUxNl90IHJldCA9IFpNX1NVQ0NFU1M7CisgICAgdTMyX3QgdUNvZGVPZnN0ID0gb2Zmc2V0OworICAgIHU4X3QgKmltYWdlLCAqcHRyOworICAgIHUzMl90IHJlc3VsdDsKKworICAgIGltYWdlID0gKHU4X3QqKSBmdzsKKyAgICBwdHIgPSBpbWFnZTsKKworICAgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgdTMyX3QgdHJhbnNsZW4gPSAobGVuID4gNDA5NikgPyA0MDk2IDogbGVuOworCisgICAgICAgIHJlc3VsdCA9IHpmd1VzYlN1Ym1pdENvbnRyb2woZGV2LCBGSVJNV0FSRV9ET1dOTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QpICh1Q29kZU9mc3QgPj4gOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW1hZ2UsIHRyYW5zbGVuKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfaW5pdChaTV9MVl8wLCAiRklSTVdBUkVfRE9XTkxPQUQgZmFpbGVkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgbGVuIC09IHRyYW5zbGVuOworICAgICAgICBpbWFnZSArPSB0cmFuc2xlbjsKKyAgICAgICAgdUNvZGVPZnN0ICs9IHRyYW5zbGVuOyAvLyBpbiBXb3JkICgxNiBiaXQpCisKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisKK2V4aXQ6CisKKyAgICByZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZklkbEdldEZyZWVUeGRDb3VudCAgICAgICAgKi8KKy8qICAgICAgR2V0IGZyZWUgUENJIFBDSSBUeEQgY291bnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmSHBHZXRGcmVlVHhkQ291bnQoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIHpmd1VzYkdldEZyZWVUeFFTaXplKGRldik7Cit9CisKK3UzMl90IHpmSHBHZXRNYXhUeGRDb3VudCh6ZGV2X3QqIGRldikKK3sKKyAgICAvL3JldHVybiA4OworICAgIHJldHVybiB6ZndVc2JHZXRNYXhUeFFTaXplKGRldik7Cit9CisKK3ZvaWQgemZpVXNiUmVnT3V0Q29tcGxldGUoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuOworfQorCitleHRlcm4gdm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZmlVc2JPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpIHsKKyNpZm5kZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgaWYgKGJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisjZWxzZQorICAgICNpZmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgLy9TaW1wbHkgZnJlZSB0aGUgYnVmIHNpbmNlIEJBIHJldHJhbnNtaXNzaW9uIGlzIGRvbmUgaW4gdGhlIGZpcm13YXJlCisgICAgaWYgKGJ1ZikKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2Vsc2UKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgLy9TaW1wbHkgZnJlZSB0aGUgYnVmIHNpbmNlIEJBIHJldHJhbnNtaXNzaW9uIGlzIGRvbmUgaW4gdGhlIGZpcm13YXJlCisgICAgaWYgKGJ1ZikKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICAjZWxzZQorICAgIHU4X3QgYWdnOworICAgIHUxNl90IGZyYW1lVHlwZTsKKworICAgIGlmKCFoZHIgJiYgYnVmKSB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAvL3ptX2RlYnVnX21zZzAoImJ1ZiBGcmVlIGR1ZSB0byBoZHIgPT0gTlVMTCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoaGRyICYmIGJ1ZikgeworICAgICAgICBmcmFtZVR5cGUgPSBoZHJbOF0gJiAweGY7CisgICAgICAgIGFnZyA9ICh1OF90KShoZHJbMl0gPj4gNSApICYgMHgxOworICAgICAgICAvL3ptX2RlYnVnX21zZzEoIkFHRz0iLCBhZ2cpOworCisgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoYWdnKSB7CisgICAgICAgICAgICAgICAgLy9kZWxldGUgYnVmIGluIGJhIGZhaWwgcXVldWU/PworICAgICAgICAgICAgICAgIC8vbm90IGdhbm5hIGhhcHBlbj8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGFnZykgeworICAgICAgICAgICAgICAgIC8vZG9uJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgICAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBpZiAod2QtPnN0YXRlICE9IFpNX1dMQU5fU1RBVEVfRU5BQkxFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICYmIHdkLT5zdGEuRW5hYmxlSFQpIHx8CisgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pICkgeworICAgICAgICB6ZkFnZ1R4U2NoZWR1bGVyKGRldiwgMCk7CisgICAgfQorICAgICNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm47CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWEwYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogdWRfZGVmcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBVU0IgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9IUFVTQl9ICisjZGVmaW5lIF9IUFVTQl9ICisKKyNkZWZpbmUgWk1fT1RVU19FTkFCTEVfUkVUUllfRlJFUV9DSEFOR0UKKyNkZWZpbmUgWk1fQkVBQ09OX0JVRkZFUl9BRERSRVNTICAgICAgICAgICAgMHgxMTc5MDAKKworI2RlZmluZSBaTV9NQVhfQ01EX1NJWkUgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBaTV9IQUxfTUFYX0VFUFJPTV9SRVEgICAgICAgICAgICAgICA1MTAKKyNkZWZpbmUgWk1fSEFMX01BWF9FRVBST01fUFJRICAgICAgICAgICAgICAgMgorCisvKiBGb3IgVVNCIFNUUkVBTSBtb2RlICovCisjaWZkZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyNkZWZpbmUgWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFICAgICAgICAgNDA5NgorI2Vsc2UKKyNkZWZpbmUgWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFICAgICAgICAgODE5MgorI2VuZGlmCisjZGVmaW5lIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVVNCX1NUUkVBTV9NT0RFX1RBRyAgICAgICAgICAgICAgMHg0ZTAwCisjZGVmaW5lIFpNX1VTQl9NQVhfRVBJTlRfQlVGRkVSICAgICAgICAgICAgIDY0CisKK3N0cnVjdCB6c0NtZFEKK3sKKyAgICB1MTZfdCBzcmM7CisgICAgdTE2X3QgY21kTGVuOworICAgIHU4X3QqIGJ1ZjsKKyAgICB1MzJfdCBjbWRbWk1fTUFYX0NNRF9TSVpFLzRdOworfTsKKworc3RydWN0IHpzQ29tbWFuZAoreworICAgIHUxNl90IGRlbGF5V2NtZENvdW50OworICAgIHUzMl90IGRlbGF5V2NtZEFkZHJbKFpNX0NNRF9RVUVVRV9TSVpFLTQpLzRdOworICAgIHUzMl90IGRlbGF5V2NtZFZhbFsoWk1fQ01EX1FVRVVFX1NJWkUtNCkvNF07Cit9OworCitzdHJ1Y3QgenNIYWxSeEluZm8KK3sKKyAgICB1MzJfdCBjdXJyZW50UlNTSVs3XTsgICAgICAgLyogUlNTSSBjb21iaW5lZCAqLworICAgIHUzMl90IGN1cnJlbnRSeEVWTVsxNF07CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1UOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFNQ1M7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YUJXOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFTRzsKK307CisKK3N0cnVjdCB6c0hwUHJpdgoreworICAgIHUxNl90IGh3RnJlcXVlbmN5OworICAgIHU4X3QgIGh3Qnc0MDsKKyAgICB1OF90ICBod0V4dE9mZnNldDsKKworICAgIHU4X3QgIGRpc2FibGVEZnNDaDsKKworICAgIHUzMl90IGhhbENhcGFiaWxpdHk7CisKKyAgICAvKiBGb3J0dW5hdGVseSB0aGUgc2Vjb25kIGxvb3AgY2FuIGJlIGRpc2FibGVkIHdpdGggYSBiaXQgKi8KKyAgICAvKiBjYWxsZWQgZW5fcGRfZGNfb2Zmc2V0X3RociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1OF90IGh3Tm90Rmlyc3RJbml0OworCisgICAgLyogY29tbWFuZCBxdWV1ZSAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgY21kSGVhZDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIGNtZFRhaWw7CisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICB1MTZfdCAgICAgICAgICAgICAgIGNtZFNlbmQ7ICAvLyBVc2VkIGZvciBNdWx0IHNlbmQgVVNCIGNtZAorI2VuZGlmCisgICAgc3RydWN0IHpzQ21kUSAgICAgICBjbWRRW1pNX0NNRF9RVUVVRV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIGNtZFBlbmRpbmc7CisgICAgc3RydWN0IHpzQ29tbWFuZCAgICBjbWQ7IC8qIGJ1ZmZlciBmb3IgZGVsYXllZCBjb21tYW5kcyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgbGVkTW9kZVsyXTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIGN0bEJ1c3k7CisgICAgdTMyX3QgICAgICAgICAgICAgICBleHRCdXN5OworCisgICAgLyoKKyAgICAgKiBBTkkgJiBSYWRhciBzdXBwb3J0LgorICAgICAqLworICAgIHUzMl90ICAgcHJvY1BoeUVycjsgICAgICAgICAvKiBQcm9jZXNzIFBoeSBlcnJzICovCisgICAgdThfdCBoYXNId1BoeUNvdW50ZXJzOyAgIC8qIEhhcmR3YXJlIGhhcyBwaHkgY291bnRlcnMgKi8KKyAgICB1MzJfdCAgIGFuaVBlcmlvZDsgICAgICAgICAgLyogYW5pIHVwZGF0ZSBsaXN0IHBlcmlvZCAqLworICAgIHN0cnVjdCB6c0FuaVN0YXRzICAgc3RhdHM7ICAgICAgLyogdmFyaW91cyBzdGF0aXN0aWNzICovCisgICAgc3RydWN0IHpzQW5pU3RhdGUgICAqY3VyYW5pOyAgICAvKiBjYWNoZWQgbGFzdCByZWZlcmVuY2UgKi8KKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAgIGFuaVs1MF07ICAgLyogcGVyLWNoYW5uZWwgc3RhdGUgKi8KKworICAgIC8qCisgICAgICogQW5pIHRhYmxlcyB0aGF0IGNoYW5nZSBiZXR3ZWVuIHRoZSA1NDE2IGFuZCA1MzEyLgorICAgICAqIFRoZXNlIGdldCBzZXQgYXQgYXR0YWNoIHRpbWUuCisgICAgICogWFhYIGRvbid0IGJlbG9uZyBoZXJlCisgICAgICogWFhYIG5lZWQgYmV0dGVyIGV4cGxhbmF0aW9uCisgICAgICovCisgICAgczMyX3QgICAgIHRvdGFsU2l6ZURlc2lyZWRbNV07CisgICAgczMyX3QgICAgIGNvYXJzZUhpZ2hbNV07CisgICAgczMyX3QgICAgIGNvYXJzZUxvd1s1XTsKKyAgICBzMzJfdCAgICAgZmlycHdyWzVdOworCisgICAgLyoKKyAgICAgKiBBTkkgcmVsYXRlZCBQSFkgcmVnaXN0ZXIgdmFsdWUuCisgICAgICovCisgICAgdTMyX3QgcmVnUEhZRGVzaXJlZFNaOworICAgIHUzMl90IHJlZ1BIWUZpbmRTaWc7CisgICAgdTMyX3QgcmVnUEhZQWdjQ3RsMTsKKyAgICB1MzJfdCByZWdQSFlTZmNvcnI7CisgICAgdTMyX3QgcmVnUEhZU2Zjb3JyTG93OworICAgIHUzMl90IHJlZ1BIWVRpbWluZzU7CisgICAgdTMyX3QgcmVnUEhZQ2NrRGV0ZWN0OworCisgICAgdTMyX3QgZWVwcm9tSW1hZ2VbMTAyNF07CisgICAgdTMyX3QgZWVwcm9tSW1hZ2VJbmRleDsKKyAgICB1MzJfdCBlZXByb21JbWFnZVJkUmVxOworCisgICAgdThfdCAgaGFsUmVJbml0OworCisgICAgdThfdCAgT3BGbGFnczsKKworICAgIHU4X3QgdFBvdzJ4Q2NrWzRdOworICAgIHU4X3QgdFBvdzJ4MmdbNF07CisgICAgdThfdCB0UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0OworICAgIHU4X3QgdFBvdzJ4MmdIdDIwWzhdOworICAgIHU4X3QgdFBvdzJ4MmdIdDQwWzhdOworICAgIHU4X3QgdFBvdzJ4NWdbNF07CisgICAgdThfdCB0UG93Mng1Z0h0MjBbOF07CisgICAgdThfdCB0UG93Mng1Z0h0NDBbOF07CisKKyAgICAvKiBod0JCSGVhdnlDbGlwIDogdXNlZCBjb21wYXRpYmlsaXR5ICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgIDAgOiBkb25nbGUgbm90IHN1cHBvcnQuICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgITA6IHN1cHBvcnQgaGVhdnkgY2xpcC4gICAgICAgICAgKi8KKyAgICB1OF90IGh3QkJIZWF2eUNsaXA7CisgICAgdThfdCBlbmFibGVCQkhlYXZ5Q2xpcDsgLyogMD0+Zm9yY2UgZGlzYWJsZSAxPT5lbmFibGUgKi8KKyAgICB1OF90IGRvQkJIZWF2eUNsaXA7ICAgICAvKiBzZXQgMSBpZiBoZWF2eSBjbGlwIG5lZWQgYnkgZWFjaCBmcmVxdWVuY3kgc3dpdGNoICovCisgICAgdTMyX3Qgc2V0VmFsdWVIZWF2eUNsaXA7IC8qIHNhdmUgc2V0dGluZyB2YWx1ZSBmb3IgaGVhdnkgY2xpcCB3aGVuIGNvbXBsZXRlZCByb3V0aW5lICovCisKKyAgICAvKgorICAgICAqIFJ4ZGF0YSBSU1NJLCBFVk0sIFJhdGUgZXRjLi4uCisgICAgICovCisgICAgc3RydWN0IHpzSGFsUnhJbmZvIGhhbFJ4SW5mbzsKKworICAgIHUzMl90IHVzYlNlbmRCeXRlczsKKyAgICB1MzJfdCB1c2JBY1NlbmRCeXRlc1s0XTsKKworICAgIHUxNl90IGFnZ01heER1cmF0aW9uQkU7CisgICAgdTMyX3QgYWdnUGt0TnVtOworCisgICAgdTE2X3QgdHhvcFs0XTsKKyAgICB1MTZfdCBjd21pbls0XTsKKyAgICB1MTZfdCBjd21heFs0XTsKKyAgICB1OF90ICBzdHJvbmdSU1NJOworICAgIHU4X3QgIHJ4U3Ryb25nUlNTSTsKKworICAgIHU4X3QgIHNsb3RUeXBlOyAgLy8wLT4yMHVzLCAxPT45dXMKKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKKyAgICB1MTZfdCB1c2JSeFJlbWFpbkxlbjsKKyAgICB1MTZfdCB1c2JSeFBrdExlbjsKKyAgICB1MTZfdCB1c2JSeFBhZExlbjsKKyAgICB1MTZfdCB1c2JSeFRyYW5zZmVyTGVuOworICAgIHpidWZfdCAgKnJlbWFpbkJ1ZjsKKyNlbmRpZgorCisgICAgdThfdCAgICBkb3QxMU1vZGU7CisKKyAgICB1OF90ICAgIGlic3NCY25FbmFibGVkOworICAgIHUzMl90ICAgaWJzc0JjbkludGVydmFsOworCisgICAgLy8gRm9yIHJlLWlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQKKyAgICB1MzJfdCAgIGxhdGVzdEZyZXF1ZW5jeTsKKyAgICB1OF90ICAgIGxhdGVzdEJ3NDA7CisgICAgdThfdCAgICBsYXRlc3RFeHRPZmZzZXQ7CisgICAgdThfdCAgICBmcmVxUmV0cnlDb3VudGVyOworCisgICAgdThfdCAgICByZWNvcmRGcmVxUmV0cnlDb3VudGVyOworICAgIHU4X3QgICAgaXNTaXRlU3VydmV5OworICAgIHU4X3QgICAgY29sZFJlc2V0TmVlZEZyZXE7CisKKyAgICB1NjRfdCAgIGNhbVJvbGxDYWxsVGFibGU7CisgICAgdThfdCAgICBjdXJyZW50QWNrUnRzVHBjOworCisgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgLy91MzJfdCAgIGlzSW5pdGlhbFBoeTsKKyAgICB1MzJfdCAgIGluaXREZXNpcmVkU2lnU2l6ZTsKKyAgICB1MzJfdCAgIGluaXRBR0M7CisgICAgdTMyX3QgICBpbml0QWdjQ29udHJvbDsKKyAgICB1MzJfdCAgIGluaXRTZWFyY2hTdGFydERlbGF5OworICAgIHUzMl90ICAgaW5pdFJJRlNTZWFyY2hQYXJhbXM7CisgICAgdTMyX3QgICBpbml0RmFzdENoYW5uZWxDaGFuZ2VDb250cm9sOworCisgICAgLyogRHluYW1pYyBTSUZTIGZvciByZXRyYW5zbWlzc2lvbiBldmVudCAqLworICAgIHU4X3QgICAgcmV0cmFuc21pc3Npb25FdmVudDsKKyAgICB1OF90ICAgIGxhdGVzdFNJRlM7Cit9OworCitleHRlcm4gdTMyX3QgemZIcExvYWRFRVBST01Gcm9tRlcoemRldl90KiBkZXYpOworCisKK3R5cGVkZWYgdThfdCBBX1VJTlQ4OwordHlwZWRlZiBzOF90IEFfSU5UODsKK3R5cGVkZWYgdTE2X3QgQV9VSU5UMTY7Cit0eXBlZGVmIHUzMl90IEFfVUlOVDMyOworI2RlZmluZSBfX0FUVFJJQl9QQUNLCisKKyNwcmFnbWEgcGFjayAocHVzaCwgMSkKKworI2RlZmluZSBBUjU0MTZfRUVQX1ZFUiAgICAgICAgICAgICAgIDB4RQorI2RlZmluZSBBUjU0MTZfRUVQX1ZFUl9NSU5PUl9NQVNLICAgIDB4RkZGCisjZGVmaW5lIEFSNTQxNl9FRVBfTk9fQkFDS19WRVIgICAgICAgMHgxCisjZGVmaW5lIEFSNTQxNl9FRVBfTUlOT1JfVkVSXzIgICAgICAgMHgyICAvLyBBZGRzIG1vZGFsIHBhcmFtcyB0eEZyYW1lVG9QYU9uLCB0eEZyYW1ldG9EYXRhU3RhcnQsIGh0NDBQb3dlckluYworI2RlZmluZSBBUjU0MTZfRUVQX01JTk9SX1ZFUl8zICAgICAgIDB4MyAgLy8gQWRkcyBtb2RhbCBwYXJhbXMgYnN3QXR0ZW4sIGJzd01hcmdpbiwgc3dTZXR0bGUgYW5kIGJhc2UgT3BGbGFncyBmb3IgSFQyMC80MCBEaXNhYmxlCisKKy8vIDE2LWJpdCBvZmZzZXQgbG9jYXRpb24gc3RhcnQgb2YgY2FsaWJyYXRpb24gc3RydWN0CisjZGVmaW5lIEFSNTQxNl9FRVBfU1RBUlRfTE9DICAgICAgICAgMjU2CisjZGVmaW5lIEFSNTQxNl9OVU1fNUdfQ0FMX1BJRVJTICAgICAgOAorI2RlZmluZSBBUjU0MTZfTlVNXzJHX0NBTF9QSUVSUyAgICAgIDQKKyNkZWZpbmUgQVI1NDE2X05VTV81R18yMF9UQVJHRVRfUE9XRVJTICA4CisjZGVmaW5lIEFSNTQxNl9OVU1fNUdfNDBfVEFSR0VUX1BPV0VSUyAgOAorI2RlZmluZSBBUjU0MTZfTlVNXzJHX0NDS19UQVJHRVRfUE9XRVJTIDMKKyNkZWZpbmUgQVI1NDE2X05VTV8yR18yMF9UQVJHRVRfUE9XRVJTICA0CisjZGVmaW5lIEFSNTQxNl9OVU1fMkdfNDBfVEFSR0VUX1BPV0VSUyAgNAorI2RlZmluZSBBUjU0MTZfTlVNX0NUTFMgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEFSNTQxNl9OVU1fQkFORF9FREdFUyAgICAgICAgOAorI2RlZmluZSBBUjU0MTZfTlVNX1BEX0dBSU5TICAgICAgICAgIDQKKyNkZWZpbmUgQVI1NDE2X1BEX0dBSU5TX0lOX01BU0sgICAgICA0CisjZGVmaW5lIEFSNTQxNl9QRF9HQUlOX0lDRVBUUyAgICAgICAgNQorI2RlZmluZSBBUjU0MTZfRUVQUk9NX01PREFMX1NQVVJTICAgIDUKKyNkZWZpbmUgQVI1NDE2X01BWF9SQVRFX1BPV0VSICAgICAgICA2MworI2RlZmluZSBBUjU0MTZfTlVNX1BEQURDX1ZBTFVFUyAgICAgIDEyOAorI2RlZmluZSBBUjU0MTZfTlVNX1JBVEVTICAgICAgICAgICAgIDE2CisjZGVmaW5lIEFSNTQxNl9CQ0hBTl9VTlVTRUQgICAgICAgICAgMHhGRgorI2RlZmluZSBBUjU0MTZfTUFYX1BXUl9SQU5HRV9JTl9IQUxGX0RCIDY0CisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzExQSAgICAgICAgICAgMHgwMQorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18xMUcgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfNUdfSFQ0MCAgICAgICAweDA0CisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzJHX0hUNDAgICAgICAgMHgwOAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU181R19IVDIwICAgICAgIDB4MTAKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfMkdfSFQyMCAgICAgICAweDIwCisjZGVmaW5lIEFSNTQxNl9FRVBNSVNDX0JJR19FTkRJQU4gICAgMHgwMQorI2RlZmluZSBGUkVRMkZCSU4oeCx5KSAoKHkpID8gKCh4KSAtIDIzMDApIDogKCgoeCkgLSA0ODAwKSAvIDUpKQorI2RlZmluZSBBUjU0MTZfTUFYX0NIQUlOUyAgICAgICAgICAgIDIKKyNkZWZpbmUgQVI1NDE2X0FOVF8xNlMgICAgICAgICAgICAgICAyNQorCisjZGVmaW5lIEFSNTQxNl9OVU1fQU5UX0NIQUlOX0ZJRUxEUyAgICAgNworI2RlZmluZSBBUjU0MTZfTlVNX0FOVF9DT01NT05fRklFTERTICAgIDQKKyNkZWZpbmUgQVI1NDE2X1NJWkVfQU5UX0NIQUlOX0ZJRUxEICAgICAzCisjZGVmaW5lIEFSNTQxNl9TSVpFX0FOVF9DT01NT05fRklFTEQgICAgNAorI2RlZmluZSBBUjU0MTZfQU5UX0NIQUlOX01BU0sgICAgICAgICAgIDB4NworI2RlZmluZSBBUjU0MTZfQU5UX0NPTU1PTl9NQVNLICAgICAgICAgIDB4ZgorI2RlZmluZSBBUjU0MTZfQ0hBSU5fMF9JRFggICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVI1NDE2X0NIQUlOXzFfSURYICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSNTQxNl9DSEFJTl8yX0lEWCAgICAgICAgICAgICAgMgorCisKKy8qIENhcGFiaWxpdGllcyBFbnVtICovCit0eXBlZGVmIGVudW0geworICAgIEVFUENBUF9DT01QUkVTU19ESVMgID0gMHgwMDAxLAorICAgIEVFUENBUF9BRVNfRElTICAgICAgID0gMHgwMDAyLAorICAgIEVFUENBUF9GQVNURlJBTUVfRElTID0gMHgwMDA0LAorICAgIEVFUENBUF9CVVJTVF9ESVMgICAgID0gMHgwMDA4LAorICAgIEVFUENBUF9NQVhRQ1VfTSAgICAgID0gMHgwMUYwLAorICAgIEVFUENBUF9NQVhRQ1VfUyAgICAgID0gNCwKKyAgICBFRVBDQVBfSEVBVllfQ0xJUF9FTiA9IDB4MDIwMCwKKyAgICBFRVBDQVBfS0NfRU5UUklFU19NICA9IDB4RjAwMCwKKyAgICBFRVBDQVBfS0NfRU5UUklFU19TICA9IDEyLAorfSBFRVBST01fQ0FQQUJJTElUSUVTOworCit0eXBlZGVmIGVudW0gQXI1NDE2X1JhdGVzIHsKKyAgICByYXRlNm1iLCAgcmF0ZTltYiwgIHJhdGUxMm1iLCByYXRlMThtYiwKKyAgICByYXRlMjRtYiwgcmF0ZTM2bWIsIHJhdGU0OG1iLCByYXRlNTRtYiwKKyAgICByYXRlMWwsICAgcmF0ZTJsLCAgIHJhdGUycywgICByYXRlNV81bCwKKyAgICByYXRlNV81cywgcmF0ZTExbCwgIHJhdGUxMXMsICByYXRlWHIsCisgICAgcmF0ZUh0MjBfMCwgcmF0ZUh0MjBfMSwgcmF0ZUh0MjBfMiwgcmF0ZUh0MjBfMywKKyAgICByYXRlSHQyMF80LCByYXRlSHQyMF81LCByYXRlSHQyMF82LCByYXRlSHQyMF83LAorICAgIHJhdGVIdDQwXzAsIHJhdGVIdDQwXzEsIHJhdGVIdDQwXzIsIHJhdGVIdDQwXzMsCisgICAgcmF0ZUh0NDBfNCwgcmF0ZUh0NDBfNSwgcmF0ZUh0NDBfNiwgcmF0ZUh0NDBfNywKKyAgICByYXRlRHVwQ2NrLCByYXRlRHVwT2ZkbSwgcmF0ZUV4dENjaywgcmF0ZUV4dE9mZG0sCisgICAgQXI1NDE2UmF0ZVNpemUKK30gQVI1NDE2X1JBVEVTOworCit0eXBlZGVmIHN0cnVjdCBlZXBGbGFncyB7CisgICAgQV9VSU5UOCAgb3BGbGFnczsKKyAgICBBX1VJTlQ4ICBlZXBNaXNjOworfSBfX0FUVFJJQl9QQUNLIEVFUF9GTEFHUzsKKworI2RlZmluZSBBUjU0MTZfQ0hFQ0tTVU1fTE9DQVRJT04gKEFSNTQxNl9FRVBfU1RBUlRfTE9DICsgMSkKK3R5cGVkZWYgc3RydWN0IEJhc2VFZXBIZWFkZXIgeworICAgIEFfVUlOVDE2ICBsZW5ndGg7CisgICAgQV9VSU5UMTYgIGNoZWNrc3VtOworICAgIEFfVUlOVDE2ICB2ZXJzaW9uOworICAgIEVFUF9GTEFHUyBvcENhcEZsYWdzOworICAgIEFfVUlOVDE2ICByZWdEbW5bMl07CisgICAgQV9VSU5UOCAgIG1hY0FkZHJbNl07CisgICAgQV9VSU5UOCAgIHJ4TWFzazsKKyAgICBBX1VJTlQ4ICAgdHhNYXNrOworICAgIEFfVUlOVDE2ICByZlNpbGVudDsKKyAgICBBX1VJTlQxNiAgYmx1ZVRvb3RoT3B0aW9uczsKKyAgICBBX1VJTlQxNiAgZGV2aWNlQ2FwOworICAgIEFfVUlOVDMyICBiaW5CdWlsZE51bWJlcjsKKyAgICBBX1VJTlQ4ICAgZGV2aWNlVHlwZTsKKyAgICBBX1VJTlQ4ICAgZnV0dXJlQmFzZVszM107Cit9IF9fQVRUUklCX1BBQ0sgQkFTRV9FRVBfSEVBREVSOyAvLyA2NCBCCisKK3R5cGVkZWYgc3RydWN0IHNwdXJDaGFuU3RydWN0IHsKKyAgICBBX1VJTlQxNiBzcHVyQ2hhbjsKKyAgICBBX1VJTlQ4ICBzcHVyUmFuZ2VMb3c7CisgICAgQV9VSU5UOCAgc3B1clJhbmdlSGlnaDsKK30gX19BVFRSSUJfUEFDSyBTUFVSX0NIQU47CisKK3R5cGVkZWYgc3RydWN0IE1vZGFsRWVwSGVhZGVyIHsKKyAgICBBX1VJTlQzMiAgYW50Q3RybENoYWluW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgLy8gMTIKKyAgICBBX1VJTlQzMiAgYW50Q3RybENvbW1vbjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNAorICAgIEFfSU5UOCAgICBhbnRlbm5hR2FpbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAvLyAzCisgICAgQV9VSU5UOCAgIHN3aXRjaFNldHRsaW5nOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhSeEF0dGVuQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgLy8gMworICAgIEFfVUlOVDggICByeFR4TWFyZ2luQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAvLyAzCisgICAgQV9JTlQ4ICAgIGFkY0Rlc2lyZWRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX0lOVDggICAgcGdhRGVzaXJlZFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB4bG5hR2FpbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAvLyAzCisgICAgQV9VSU5UOCAgIHR4RW5kVG9YcGFPZmY7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhFbmRUb1J4T247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0eEZyYW1lVG9YcGFPbjsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHRocmVzaDYyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX0lOVDggICAgbm9pc2VGbG9vclRocmVzaENoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgLy8gMworICAgIEFfVUlOVDggICB4cGRHYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHhwZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX0lOVDggICAgaXFDYWxJQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgICAgLy8gMQorICAgIEFfSU5UOCAgICBpcUNhbFFDaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHBkR2Fpbk92ZXJsYXA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgb2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBkYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHhwYUJpYXNMdmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgcHdyRGVjcmVhc2VGb3IyQ2hhaW47ICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBwd3JEZWNyZWFzZUZvcjNDaGFpbjsgICAgICAgICAgICAgICAgICAvLyAxIC0+IDQ4IEIKKyAgICBBX1VJTlQ4ICAgdHhGcmFtZVRvRGF0YVN0YXJ0OyAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0eEZyYW1lVG9QYU9uOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGh0NDBQb3dlckluY0ZvclBkYWRjOyAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgYnN3QXR0ZW5bQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgICAgLy8gMworICAgIEFfVUlOVDggICBic3dNYXJnaW5bQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgICAvLyAzCisgICAgQV9VSU5UOCAgIHN3U2V0dGxlSHQ0MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgZnV0dXJlTW9kYWxbMjJdOyAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICBTUFVSX0NIQU4gc3B1ckNoYW5zW0FSNTQxNl9FRVBST01fTU9EQUxfU1BVUlNdOyAgLy8gMjAgQgorfSBfX0FUVFJJQl9QQUNLIE1PREFMX0VFUF9IRUFERVI7ICAgICAgICAgICAgICAgICAgICAvLyA9PSAxMDAgQgorCit0eXBlZGVmIHN0cnVjdCBjYWxEYXRhUGVyRnJlcSB7CisgICAgQV9VSU5UOCBwd3JQZGdbQVI1NDE2X05VTV9QRF9HQUlOU11bQVI1NDE2X1BEX0dBSU5fSUNFUFRTXTsKKyAgICBBX1VJTlQ4IHZwZFBkZ1tBUjU0MTZfTlVNX1BEX0dBSU5TXVtBUjU0MTZfUERfR0FJTl9JQ0VQVFNdOworfSBfX0FUVFJJQl9QQUNLIENBTF9EQVRBX1BFUl9GUkVROworCit0eXBlZGVmIHN0cnVjdCBDYWxUYXJnZXRQb3dlckxlZ2FjeSB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgdFBvdzJ4WzRdOworfSBfX0FUVFJJQl9QQUNLIENBTF9UQVJHRVRfUE9XRVJfTEVHOworCit0eXBlZGVmIHN0cnVjdCBDYWxUYXJnZXRQb3dlckh0IHsKKyAgICBBX1VJTlQ4ICBiQ2hhbm5lbDsKKyAgICBBX1VJTlQ4ICB0UG93MnhbOF07Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX1RBUkdFVF9QT1dFUl9IVDsKKworI2lmIGRlZmluZWQoQVJDSF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKEJJR19FTkRJQU4pCit0eXBlZGVmIHN0cnVjdCBDYWxDdGxFZGdlcyB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgZmxhZyAgIDoyLAorICAgICAgICAgICAgIHRQb3dlciA6NjsKK30gX19BVFRSSUJfUEFDSyBDQUxfQ1RMX0VER0VTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IENhbEN0bEVkZ2VzIHsKKyAgICBBX1VJTlQ4ICBiQ2hhbm5lbDsKKyAgICBBX1VJTlQ4ICB0UG93ZXIgOjYsCisgICAgICAgICAgICAgZmxhZyAgIDoyOworfSBfX0FUVFJJQl9QQUNLIENBTF9DVExfRURHRVM7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsQ3RsRGF0YSB7CisgICAgQ0FMX0NUTF9FREdFUyAgY3RsRWRnZXNbQVI1NDE2X01BWF9DSEFJTlNdW0FSNTQxNl9OVU1fQkFORF9FREdFU107Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX0NUTF9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBhcjU0MTZFZXByb20geworICAgIEJBU0VfRUVQX0hFQURFUiAgICBiYXNlRWVwSGVhZGVyOyAgICAgICAgIC8vIDY0IEIKKyAgICBBX1VJTlQ4ICAgY3VzdERhdGFbNjRdOyAgICAgICAgICAgICAgICAgICAvLyA2NCBCCisgICAgTU9EQUxfRUVQX0hFQURFUiAgIG1vZGFsSGVhZGVyWzJdOyAgICAgICAgLy8gMjAwIEIKKyAgICBBX1VJTlQ4ICAgICAgICAgICAgY2FsRnJlcVBpZXI1R1tBUjU0MTZfTlVNXzVHX0NBTF9QSUVSU107CisgICAgQV9VSU5UOCAgICAgICAgICAgIGNhbEZyZXFQaWVyMkdbQVI1NDE2X05VTV8yR19DQUxfUElFUlNdOworICAgIENBTF9EQVRBX1BFUl9GUkVRICBjYWxQaWVyRGF0YTVHW0FSNTQxNl9NQVhfQ0hBSU5TXVtBUjU0MTZfTlVNXzVHX0NBTF9QSUVSU107CisgICAgQ0FMX0RBVEFfUEVSX0ZSRVEgIGNhbFBpZXJEYXRhMkdbQVI1NDE2X01BWF9DSEFJTlNdW0FSNTQxNl9OVU1fMkdfQ0FMX1BJRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0xFRyBjYWxUYXJnZXRQb3dlcjVHW0FSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXI1R0hUMjBbQVI1NDE2X05VTV81R18yMF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0hUICBjYWxUYXJnZXRQb3dlcjVHSFQ0MFtBUjU0MTZfTlVNXzVHXzQwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfTEVHIGNhbFRhcmdldFBvd2VyQ2NrW0FSNTQxNl9OVU1fMkdfQ0NLX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfTEVHIGNhbFRhcmdldFBvd2VyMkdbQVI1NDE2X05VTV8yR18yMF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0hUICBjYWxUYXJnZXRQb3dlcjJHSFQyMFtBUjU0MTZfTlVNXzJHXzIwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfSFQgIGNhbFRhcmdldFBvd2VyMkdIVDQwW0FSNTQxNl9OVU1fMkdfNDBfVEFSR0VUX1BPV0VSU107CisgICAgQV9VSU5UOCAgICAgICAgICAgIGN0bEluZGV4W0FSNTQxNl9OVU1fQ1RMU107CisgICAgQ0FMX0NUTF9EQVRBICAgICAgIGN0bERhdGFbQVI1NDE2X05VTV9DVExTXTsKKyAgICBBX1VJTlQ4ICAgICAgICAgICAgcGFkZGluZzsKK30gX19BVFRSSUJfUEFDSyBBUjU0MTZfRUVQUk9NOworCisjcHJhZ21hIHBhY2sgKHBvcCkKKwordHlwZWRlZiBlbnVtIENvbmZvcm1hbmNlVGVzdExpbWl0cyB7CisgICAgRkNDICAgICAgICA9IDB4MTAsCisgICAgTUtLICAgICAgICA9IDB4NDAsCisgICAgRVRTSSAgICAgICA9IDB4MzAsCisgICAgU0RfTk9fQ1RMICA9IDB4RTAsCisgICAgTk9fQ1RMICAgICA9IDB4RkYsCisgICAgQ1RMX01PREVfTSA9IDB4RiwKKyAgICBDVExfMTFBICAgID0gMCwKKyAgICBDVExfMTFCICAgID0gMSwKKyAgICBDVExfMTFHICAgID0gMiwKKyAgICBDVExfVFVSQk8gID0gMywKKyAgICBDVExfMTA4RyAgID0gNCwKKyAgICBDVExfMkdIVDIwID0gNSwKKyAgICBDVExfNUdIVDIwID0gNiwKKyAgICBDVExfMkdIVDQwID0gNywKKyAgICBDVExfNUdIVDQwID0gOCwKK30gQVRIX0NUTFM7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9IUFVTQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvb3R1cy5pbmkgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvb3R1cy5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlZmViNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9vdHVzLmluaQpAQCAtMCwwICsxLDQxNCBAQAorLyogODYwMiA6IHVwZGF0ZSBtaXNtYXRjaCByZWdpc3RlciBiZXR3ZWVuIE5ESVMgYW5kIEFSVCAqLworc3RhdGljIGNvbnN0IHUzMl90IGFyNTQxNk1vZGVzW11bNl0gPSB7CisvKiBSZWdpc3RlciAgIEEtMjAgICAgICAgIEEtMjAvNDAgICAgIEctMjAvNDAgICAgIEctMjAgICAgICAgIEctVHVyYm8gICAgKi8KKyAgICAgezB4OTgwMCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMH0sCisgICAgIHsweDk4MDQsIDB4MDAwMDAzMDAsIDB4MDAwMDAzYzQsIDB4MDAwMDAzYzQsIDB4MDAwMDAzMDAsIDB9LAorICAgICB7MHg5ODA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTgwYywgMHhhZDg0OGUxOSwgMHhhZDg0OGUxOSwgMHhhZDg0OGUxOSwgMHhhZDg0OGUxOSwgMH0sCisgICAgIHsweDk4MTAsIDB4N2QxNGUwMDAsIDB4N2QxNGUwMDAsIDB4N2QxNGUwMDAsIDB4N2QxNGUwMDAsIDB9LAorICAgICB7MHg5ODE0LCAweDljMGE5ZjZiLCAweDljMGE5ZjZiLCAweDljMGE5ZjZiLCAweDljMGE5ZjZiLCAwfSwKKyAgICAgezB4OTgxOCwgMHgwMDAwMDA5MCwgMHgwMDAwMDA5MCwgMHgwMDAwMDA5MCwgMHgwMDAwMDA5MCwgMH0sCisgICAgIHsweDk4MWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5ODIwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAweDAyMDIwMjAwLCAwfSwKKyAgICAgezB4OTgyNCwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMHgwMDAwMGUwZSwgMH0sCisgICAgIHsweDk4MjgsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB4MGEwMjAwMDEsIDB9LAorICAgICB7MHg5ODJjLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAweDAwMDBhMDAwLCAwfSwKKyAgICAgezB4OTgzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk4MzQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB9LAorICAgICB7MHg5ODM4LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAwfSwKKyAgICAgezB4OTgzYywgMHgwMDIwMDQwMCwgMHgwMDIwMDQwMCwgMHgwMDIwMDQwMCwgMHgwMDIwMDQwMCwgMH0sCisgICAgIHsweDk4NDAsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB4MjA2YTAwMmUsIDB9LAorICAgICB7MHg5ODQ0LCAweDEzNzIxNjFlLCAweDEzNzIxYzFlLCAweDEzNzIxYzI0LCAweDEzNzIxNmE0LCAwfSwKKyAgICAgezB4OTg0OCwgMHgwMDFhNmE2NSwgMHgwMDFhNmE2NSwgMHgwMDE5N2E2OCwgMHgwMDE5N2E2OCwgMH0sCisgICAgIHsweDk4NGMsIDB4MTI4NDIzM2MsIDB4MTI4NDIzM2MsIDB4MTI4NDIzM2MsIDB4MTI4NDIzM2MsIDB9LAorICAgICB7MHg5ODUwLCAweDZjNDhiNGU0LCAweDZjNDhiNGU0LCAweDZjNDhiMGU0LCAweDZjNDhiMGU0LCAwfSwKKyAgICAgezB4OTg1NCwgMHgwMDAwMDg1OSwgMHgwMDAwMDg1OSwgMHgwMDAwMDg1OSwgMHgwMDAwMDg1OSwgMH0sCisgICAgIHsweDk4NTgsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB4N2VjODBkMmUsIDB9LAorICAgICB7MHg5ODVjLCAweDMxMzk1YzVlLCAweDMxMzk1YzVlLCAweDMxMzk1YzVlLCAweDMxMzk1YzVlLCAwfSwKKyAgICAgezB4OTg2MCwgMHgwMDA0ZGQxMCwgMHgwMDA0ZGQxMCwgMHgwMDA0ZGQyMCwgMHgwMDA0ZGQyMCwgMH0sCisgICAgIHsweDk4NjgsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB4NDA5YTQxOTAsIDB9LAorICAgICB7MHg5ODZjLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAweDA1MGNiMDgxLCAwfSwKKyAgICAgezB4OTkwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5MDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTA4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTkwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5MTQsIDB4MDAwMDA3ZDAsIDB4MDAwMDA3ZDAsIDB4MDAwMDA4OTgsIDB4MDAwMDA4OTgsIDB9LAorICAgICB7MHg5OTE4LCAweDAwMDAwMTE4LCAweDAwMDAwMjMwLCAweDAwMDAwMjY4LCAweDAwMDAwMTM0LCAwfSwKKyAgICAgezB4OTkxYywgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMHgxMDAwMGZmZiwgMH0sCisgICAgIHsweDk5MjAsIDB4MDUxMDA4MWMsIDB4MDUxMDA4MWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB9LAorICAgICB7MHg5OTI0LCAweGQwMDU4YTE1LCAweGQwMDU4YTE1LCAweGQwMDU4YTE1LCAweGQwMDU4YTE1LCAwfSwKKyAgICAgezB4OTkyOCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDk5MmMsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB9LAorICAgICB7MHg5OTM0LCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4OTkzOCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweDk5M2MsIDB4MDAwMDAwN2YsIDB4MDAwMDAwN2YsIDB4MDAwMDAwN2YsIDB4MDAwMDAwN2YsIDB9LAorICAgICB7MHg5OTQ0LCAweGRmYjgxMDIwLCAweGRmYjgxMDIwLCAweGRmYjgxMDIwLCAweGRmYjgxMDIwLCAwfSwKKyAgICAgezB4OTk0OCwgMHg5MjgwYjIxMiwgMHg5MjgwYjIxMiwgMHg5MjgwYjIxMiwgMHg5MjgwYjIxMiwgMH0sCisgICAgIHsweDk5NGMsIDB4MDAwMjAwMjgsIDB4MDAwMjAwMjgsIDB4MDAwMjAwMjgsIDB4MDAwMjAwMjgsIDB9LAorICAgICB7MHg5OTU0LCAweDVkNTBlMTg4LCAweDVkNTBlMTg4LCAweDVkNTBlMTg4LCAweDVkNTBlMTg4LCAwfSwKKyAgICAgezB4OTk1OCwgMHgwMDA4MWZmZiwgMHgwMDA4MWZmZiwgMHgwMDA4MWZmZiwgMHgwMDA4MWZmZiwgMH0sCisgICAgIHsweDk5NjAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB9LAorICAgICB7MHg5OTY0LCAweDAwMDAxMTIwLCAweDAwMDAxMTIwLCAweDAwMDAxMTIwLCAweDAwMDAxMTIwLCAwfSwKKyAgICAgezB4OTk3MCwgMHgxOTBmYjUxNSwgMHgxOTBmYjUxNSwgMHgxOTBmYjUxNSwgMHgxOTBmYjUxNSwgMH0sCisgICAgIHsweDk5NzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTc4LCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4OTk3YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ODAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk4OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTkwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTljLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTlhMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5YTQsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHg5OWE4LCAweDAwMWZmZjAwLCAweDAwMWZmZjAwLCAweDAwMWZmZjAwLCAweDAwMWZmZjAwLCAwfSwKKyAgICAgezB4OTlhYywgMHgwMDZmMDBjNCwgMHgwMDZmMDBjNCwgMHgwMDZmMDBjNCwgMHgwMDZmMDBjNCwgMH0sCisgICAgIHsweDk5YjAsIDB4MDMwNTEwMDAsIDB4MDMwNTEwMDAsIDB4MDMwNTEwMDAsIDB4MDMwNTEwMDAsIDB9LAorICAgICB7MHg5OWI0LCAweDAwMDAwODIwLCAweDAwMDAwODIwLCAweDAwMDAwODIwLCAweDAwMDAwODIwLCAwfSwKKyAgICAgezB4OTljMCwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMHgwMzg5MTliZSwgMH0sCisgICAgIHsweDk5YzQsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB4MDYzMzZmNzcsIDB9LAorICAgICB7MHg5OWM4LCAweDYwZjY1MzJjLCAweDYwZjY1MzJjLCAweDYwZjY1MzJjLCAweDYwZjY1MzJjLCAwfSwKKyAgICAgezB4OTljYywgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMHgwOGYxODZjOCwgMH0sCisgICAgIHsweDk5ZDAsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB4MDAwNDYzODQsIDB9LAorICAgICB7MHg5OWQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTlkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ZGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWUwLCAweDAwMDAwMjAwLCAweDAwMDAwMjAwLCAweDAwMDAwMjAwLCAweDAwMDAwMjAwLCAwfSwKKyAgICAgezB4OTllNCwgMHg2NDY0NjQ2NCwgMHg2NDY0NjQ2NCwgMHg2NDY0NjQ2NCwgMHg2NDY0NjQ2NCwgMH0sCisgICAgIHsweDk5ZTgsIDB4M2M3ODc4NzgsIDB4M2M3ODc4NzgsIDB4M2M3ODc4NzgsIDB4M2M3ODc4NzgsIDB9LAorICAgICB7MHg5OWVjLCAweDAwMDAwMGFhLCAweDAwMDAwMGFhLCAweDAwMDAwMGFhLCAweDAwMDAwMGFhLCAwfSwKKyAgICAgezB4OTlmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ZmMsIDB4MDAwMDEwNDIsIDB4MDAwMDEwNDIsIDB4MDAwMDEwNDIsIDB4MDAwMDEwNDIsIDB9LAorICAgICB7MHg5YTAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWEwNCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MCwgMH0sCisgICAgIHsweDlhMDgsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB4MDAwMDAwODAsIDB9LAorICAgICB7MHg5YTBjLCAweDAwMDAwMWExLCAweDAwMDAwMWExLCAweDAwMDAwMTQxLCAweDAwMDAwMTQxLCAwfSwKKyAgICAgezB4OWExMCwgMHgwMDAwMDFlMSwgMHgwMDAwMDFlMSwgMHgwMDAwMDE4MSwgMHgwMDAwMDE4MSwgMH0sCisgICAgIHsweDlhMTQsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjEsIDB4MDAwMDAxYzEsIDB4MDAwMDAxYzEsIDB9LAorICAgICB7MHg5YTE4LCAweDAwMDAwMDYxLCAweDAwMDAwMDYxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4OWExYywgMHgwMDAwMDE2OCwgMHgwMDAwMDE2OCwgMHgwMDAwMDA0MSwgMHgwMDAwMDA0MSwgMH0sCisgICAgIHsweDlhMjAsIDB4MDAwMDAxYTgsIDB4MDAwMDAxYTgsIDB4MDAwMDAxYTgsIDB4MDAwMDAxYTgsIDB9LAorICAgICB7MHg5YTI0LCAweDAwMDAwMWU4LCAweDAwMDAwMWU4LCAweDAwMDAwMWU4LCAweDAwMDAwMWU4LCAwfSwKKyAgICAgezB4OWEyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMH0sCisgICAgIHsweDlhMmMsIDB4MDAwMDAwNjgsIDB4MDAwMDAwNjgsIDB4MDAwMDAwNjgsIDB4MDAwMDAwNjgsIDB9LAorICAgICB7MHg5YTMwLCAweDAwMDAwMTg5LCAweDAwMDAwMTg5LCAweDAwMDAwMGE4LCAweDAwMDAwMGE4LCAwfSwKKyAgICAgezB4OWEzNCwgMHgwMDAwMDFjOSwgMHgwMDAwMDFjOSwgMHgwMDAwMDE2OSwgMHgwMDAwMDE2OSwgMH0sCisgICAgIHsweDlhMzgsIDB4MDAwMDAwMDksIDB4MDAwMDAwMDksIDB4MDAwMDAxYTksIDB4MDAwMDAxYTksIDB9LAorICAgICB7MHg5YTNjLCAweDAwMDAwMDQ5LCAweDAwMDAwMDQ5LCAweDAwMDAwMWU5LCAweDAwMDAwMWU5LCAwfSwKKyAgICAgezB4OWE0MCwgMHgwMDAwMDA4OSwgMHgwMDAwMDA4OSwgMHgwMDAwMDAyOSwgMHgwMDAwMDAyOSwgMH0sCisgICAgIHsweDlhNDQsIDB4MDAwMDAxNzAsIDB4MDAwMDAxNzAsIDB4MDAwMDAwNjksIDB4MDAwMDAwNjksIDB9LAorICAgICB7MHg5YTQ4LCAweDAwMDAwMWIwLCAweDAwMDAwMWIwLCAweDAwMDAwMTkwLCAweDAwMDAwMTkwLCAwfSwKKyAgICAgezB4OWE0YywgMHgwMDAwMDFmMCwgMHgwMDAwMDFmMCwgMHgwMDAwMDFkMCwgMHgwMDAwMDFkMCwgMH0sCisgICAgIHsweDlhNTAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB9LAorICAgICB7MHg5YTU0LCAweDAwMDAwMDcwLCAweDAwMDAwMDcwLCAweDAwMDAwMDUwLCAweDAwMDAwMDUwLCAwfSwKKyAgICAgezB4OWE1OCwgMHgwMDAwMDE5MSwgMHgwMDAwMDE5MSwgMHgwMDAwMDA5MCwgMHgwMDAwMDA5MCwgMH0sCisgICAgIHsweDlhNWMsIDB4MDAwMDAxZDEsIDB4MDAwMDAxZDEsIDB4MDAwMDAxNTEsIDB4MDAwMDAxNTEsIDB9LAorICAgICB7MHg5YTYwLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAweDAwMDAwMTkxLCAweDAwMDAwMTkxLCAwfSwKKyAgICAgezB4OWE2NCwgMHgwMDAwMDA1MSwgMHgwMDAwMDA1MSwgMHgwMDAwMDFkMSwgMHgwMDAwMDFkMSwgMH0sCisgICAgIHsweDlhNjgsIDB4MDAwMDAwOTEsIDB4MDAwMDAwOTEsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTEsIDB9LAorICAgICB7MHg5YTZjLCAweDAwMDAwMWI4LCAweDAwMDAwMWI4LCAweDAwMDAwMDUxLCAweDAwMDAwMDUxLCAwfSwKKyAgICAgezB4OWE3MCwgMHgwMDAwMDFmOCwgMHgwMDAwMDFmOCwgMHgwMDAwMDE5OCwgMHgwMDAwMDE5OCwgMH0sCisgICAgIHsweDlhNzQsIDB4MDAwMDAwMzgsIDB4MDAwMDAwMzgsIDB4MDAwMDAxZDgsIDB4MDAwMDAxZDgsIDB9LAorICAgICB7MHg5YTc4LCAweDAwMDAwMDc4LCAweDAwMDAwMDc4LCAweDAwMDAwMDE4LCAweDAwMDAwMDE4LCAwfSwKKyAgICAgezB4OWE3YywgMHgwMDAwMDE5OSwgMHgwMDAwMDE5OSwgMHgwMDAwMDA1OCwgMHgwMDAwMDA1OCwgMH0sCisgICAgIHsweDlhODAsIDB4MDAwMDAxZDksIDB4MDAwMDAxZDksIDB4MDAwMDAwOTgsIDB4MDAwMDAwOTgsIDB9LAorICAgICB7MHg5YTg0LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAweDAwMDAwMTU5LCAweDAwMDAwMTU5LCAwfSwKKyAgICAgezB4OWE4OCwgMHgwMDAwMDA1OSwgMHgwMDAwMDA1OSwgMHgwMDAwMDE5OSwgMHgwMDAwMDE5OSwgMH0sCisgICAgIHsweDlhOGMsIDB4MDAwMDAwOTksIDB4MDAwMDAwOTksIDB4MDAwMDAxZDksIDB4MDAwMDAxZDksIDB9LAorICAgICB7MHg5YTkwLCAweDAwMDAwMGQ5LCAweDAwMDAwMGQ5LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAwfSwKKyAgICAgezB4OWE5NCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDA1OSwgMHgwMDAwMDA1OSwgMH0sCisgICAgIHsweDlhOTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwOTksIDB4MDAwMDAwOTksIDB9LAorICAgICB7MHg5YTljLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGQ5LCAweDAwMDAwMGQ5LCAwfSwKKyAgICAgezB4OWFhMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWE4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFhYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYjAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWI0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFiOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYmMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWMwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYzgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWNjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFkMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZDQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWQ4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFkYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWU0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFlOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWYwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWZjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDliMDQsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHg5YjA4LCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAweDAwMDAwMDAyLCAwfSwKKyAgICAgezB4OWIwYywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMHgwMDAwMDAwMywgMH0sCisgICAgIHsweDliMTAsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDQsIDB9LAorICAgICB7MHg5YjE0LCAweDAwMDAwMDA1LCAweDAwMDAwMDA1LCAweDAwMDAwMDA1LCAweDAwMDAwMDA1LCAwfSwKKyAgICAgezB4OWIxOCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOCwgMHgwMDAwMDAwOCwgMH0sCisgICAgIHsweDliMWMsIDB4MDAwMDAwMDksIDB4MDAwMDAwMDksIDB4MDAwMDAwMDksIDB4MDAwMDAwMDksIDB9LAorICAgICB7MHg5YjIwLCAweDAwMDAwMDBhLCAweDAwMDAwMDBhLCAweDAwMDAwMDBhLCAweDAwMDAwMDBhLCAwfSwKKyAgICAgezB4OWIyNCwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYiwgMHgwMDAwMDAwYiwgMH0sCisgICAgIHsweDliMjgsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMGMsIDB4MDAwMDAwMGMsIDB9LAorICAgICB7MHg5YjJjLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAweDAwMDAwMDBkLCAwfSwKKyAgICAgezB4OWIzMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMH0sCisgICAgIHsweDliMzQsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTEsIDB4MDAwMDAwMTEsIDB9LAorICAgICB7MHg5YjM4LCAweDAwMDAwMDEyLCAweDAwMDAwMDEyLCAweDAwMDAwMDEyLCAweDAwMDAwMDEyLCAwfSwKKyAgICAgezB4OWIzYywgMHgwMDAwMDAxMywgMHgwMDAwMDAxMywgMHgwMDAwMDAxMywgMHgwMDAwMDAxMywgMH0sCisgICAgIHsweDliNDAsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB4MDAwMDAwMTQsIDB9LAorICAgICB7MHg5YjQ0LCAweDAwMDAwMDE1LCAweDAwMDAwMDE1LCAweDAwMDAwMDE1LCAweDAwMDAwMDE1LCAwfSwKKyAgICAgezB4OWI0OCwgMHgwMDAwMDAxOCwgMHgwMDAwMDAxOCwgMHgwMDAwMDAxOCwgMHgwMDAwMDAxOCwgMH0sCisgICAgIHsweDliNGMsIDB4MDAwMDAwMTksIDB4MDAwMDAwMTksIDB4MDAwMDAwMTksIDB4MDAwMDAwMTksIDB9LAorICAgICB7MHg5YjUwLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAweDAwMDAwMDFhLCAwfSwKKyAgICAgezB4OWI1NCwgMHgwMDAwMDAxYiwgMHgwMDAwMDAxYiwgMHgwMDAwMDAxYiwgMHgwMDAwMDAxYiwgMH0sCisgICAgIHsweDliNTgsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB9LAorICAgICB7MHg5YjVjLCAweDAwMDAwMDFkLCAweDAwMDAwMDFkLCAweDAwMDAwMDFkLCAweDAwMDAwMDFkLCAwfSwKKyAgICAgezB4OWI2MCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDAyMCwgMH0sCisgICAgIHsweDliNjQsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjEsIDB9LAorICAgICB7MHg5YjY4LCAweDAwMDAwMDIyLCAweDAwMDAwMDIyLCAweDAwMDAwMDIyLCAweDAwMDAwMDIyLCAwfSwKKyAgICAgezB4OWI2YywgMHgwMDAwMDAyMywgMHgwMDAwMDAyMywgMHgwMDAwMDAyMywgMHgwMDAwMDAyMywgMH0sCisgICAgIHsweDliNzAsIDB4MDAwMDAwMjQsIDB4MDAwMDAwMjQsIDB4MDAwMDAwMjQsIDB4MDAwMDAwMjQsIDB9LAorICAgICB7MHg5Yjc0LCAweDAwMDAwMDI1LCAweDAwMDAwMDI1LCAweDAwMDAwMDI1LCAweDAwMDAwMDI1LCAwfSwKKyAgICAgezB4OWI3OCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDAyOCwgMH0sCisgICAgIHsweDliN2MsIDB4MDAwMDAwMjksIDB4MDAwMDAwMjksIDB4MDAwMDAwMjksIDB4MDAwMDAwMjksIDB9LAorICAgICB7MHg5YjgwLCAweDAwMDAwMDJhLCAweDAwMDAwMDJhLCAweDAwMDAwMDJhLCAweDAwMDAwMDJhLCAwfSwKKyAgICAgezB4OWI4NCwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMHgwMDAwMDAyYiwgMH0sCisgICAgIHsweDliODgsIDB4MDAwMDAwMmMsIDB4MDAwMDAwMmMsIDB4MDAwMDAwMmMsIDB4MDAwMDAwMmMsIDB9LAorICAgICB7MHg5YjhjLCAweDAwMDAwMDJkLCAweDAwMDAwMDJkLCAweDAwMDAwMDJkLCAweDAwMDAwMDJkLCAwfSwKKyAgICAgezB4OWI5MCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAzMCwgMH0sCisgICAgIHsweDliOTQsIDB4MDAwMDAwMzEsIDB4MDAwMDAwMzEsIDB4MDAwMDAwMzEsIDB4MDAwMDAwMzEsIDB9LAorICAgICB7MHg5Yjk4LCAweDAwMDAwMDMyLCAweDAwMDAwMDMyLCAweDAwMDAwMDMyLCAweDAwMDAwMDMyLCAwfSwKKyAgICAgezB4OWI5YywgMHgwMDAwMDAzMywgMHgwMDAwMDAzMywgMHgwMDAwMDAzMywgMHgwMDAwMDAzMywgMH0sCisgICAgIHsweDliYTAsIDB4MDAwMDAwMzQsIDB4MDAwMDAwMzQsIDB4MDAwMDAwMzQsIDB4MDAwMDAwMzQsIDB9LAorICAgICB7MHg5YmE0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJhOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYWMsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmIwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYjgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmJjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJjMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYzQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmM4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJjYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZDAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmQ0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJkOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZGMsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmUwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZTgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmVjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJmMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZjQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmY4LCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAwfSwKKyAgICAgezB4OWJmYywgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMH0sCisgICAgIHsweDljMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzBjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMyOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWNmMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5Y2Y4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWNmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEyMDAsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMGUsIDB4MDAwMDAwMGUsIDB9LAorICAgICB7MHhhMjA0LCAweDAwMDAwNDQwLCAweDAwMDAwNDQwLCAweDAwMDAwNDQwLCAweDAwMDAwNDQwLCAwfSwKKyAgICAgezB4YTIwOCwgMHhkNmJlNDc4OCwgMHhkNmJlNDc4OCwgMHhkMDNlNDc4OCwgMHhkMDNlNDc4OCwgMH0sCisgICAgIHsweGEyMGMsIDB4MDEyZTgxNjAsIDB4MDEyZTgxNjAsIDB4MDEyYTgxNjAsIDB4MDEyYTgxNjAsIDB9LAorICAgICB7MHhhMjEwLCAweDQwODA2MzMzLCAweDQwODA2MzMzLCAweDQwODA2MzMzLCAweDQwODA2MzMzLCAwfSwKKyAgICAgezB4YTIxNCwgMHgwMDEwNmMxMCwgMHgwMDEwNmMxMCwgMHgwMDEwNmMxMCwgMHgwMDEwNmMxMCwgMH0sCisgICAgIHsweGEyMTgsIDB4MDA5YzQwNjAsIDB4MDA5YzQwNjAsIDB4MDA5YzQwNjAsIDB4MDA5YzQwNjAsIDB9LAorICAgICB7MHhhMjFjLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAweDE4ODM4MDBhLCAwfSwKKyAgICAgezB4YTIyMCwgMHgwMTg4MzBjNiwgMHgwMTg4MzBjNiwgMHgwMTg4MzBjNiwgMHgwMTg4MzBjNiwgMH0sCisgICAgIHsweGEyMjQsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MDAsIDB9LAorICAgICB7MHhhMjI4LCAweDAwMDAwOWI1LCAweDAwMDAwOWI1LCAweDAwMDAwOWI1LCAweDAwMDAwOWI1LCAwfSwKKyAgICAgezB4YTIyYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEyMzAsIDB4MDAwMDAxMDgsIDB4MDAwMDAyMTAsIDB4MDAwMDAyMTAsIDB4MDAwMDAxMDgsIDB9LAorICAgICB7MHhhMjM0LCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTIzOCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEyM2MsIDB4MTNjODg5YWYsIDB4MTNjODg5YWYsIDB4MTNjODg5YWYsIDB4MTNjODg5YWYsIDB9LAorICAgICB7MHhhMjQwLCAweDM4NDkwYTIwLCAweDM4NDkwYTIwLCAweDM4NDkwYTIwLCAweDM4NDkwYTIwLCAwfSwKKyAgICAgezB4YTI0NCwgMHgwMDAwN2JiNiwgMHgwMDAwN2JiNiwgMHgwMDAwN2JiNiwgMHgwMDAwN2JiNiwgMH0sCisgICAgIHsweGEyNDgsIDB4MGZmZjNmZmMsIDB4MGZmZjNmZmMsIDB4MGZmZjNmZmMsIDB4MGZmZjNmZmMsIDB9LAorICAgICB7MHhhMjRjLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4YTI1MCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMH0sCisgICAgIHsweGEyNTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjU4LCAweDBjYzc1MzgwLCAweDBjYzc1MzgwLCAweDBjYzc1MzgwLCAweDBjYzc1MzgwLCAwfSwKKyAgICAgezB4YTI1YywgMHgwZjBmMGYwMSwgMHgwZjBmMGYwMSwgMHgwZjBmMGYwMSwgMHgwZjBmMGYwMSwgMH0sCisgICAgIHsweGEyNjAsIDB4ZGZhOTFmMDEsIDB4ZGZhOTFmMDEsIDB4ZGZhOTFmMDEsIDB4ZGZhOTFmMDEsIDB9LAorICAgICB7MHhhMjY0LCAweDAwNDE4YTExLCAweDAwNDE4YTExLCAweDAwNDE4YTExLCAweDAwNDE4YTExLCAwfSwKKyAgICAgezB4YTI2OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEyNmMsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB9LAorICAgICB7MHhhMjc0LCAweDBhMWE5Y2FhLCAweDBhMWE5Y2FhLCAweDBhMWE3Y2FhLCAweDBhMWE3Y2FhLCAwfSwKKyAgICAgezB4YTI3OCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMH0sCisgICAgIHsweGEyN2MsIDB4MDUxNzAxY2UsIDB4MDUxNzAxY2UsIDB4MDUxNzAxY2UsIDB4MDUxNzAxY2UsIDB9LAorICAgICB7MHhhMzAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAweDE4MDEwMDAwLCAwfSwKKyAgICAgezB4YTMwNCwgMHgzMDAzMjYwMiwgMHgzMDAzMjYwMiwgMHgyZTAzMjQwMiwgMHgyZTAzMjQwMiwgMH0sCisgICAgIHsweGEzMDgsIDB4NDgwNzNlMDYsIDB4NDgwNzNlMDYsIDB4NGEwYTNjMDYsIDB4NGEwYTNjMDYsIDB9LAorICAgICB7MHhhMzBjLCAweDU2MGI0YzBhLCAweDU2MGI0YzBhLCAweDYyMWE1NDBiLCAweDYyMWE1NDBiLCAwfSwKKyAgICAgezB4YTMxMCwgMHg2NDFhNjAwZiwgMHg2NDFhNjAwZiwgMHg3NjRmNmMxYiwgMHg3NjRmNmMxYiwgMH0sCisgICAgIHsweGEzMTQsIDB4N2E0ZjZlMWIsIDB4N2E0ZjZlMWIsIDB4ODQ1YjdhNWEsIDB4ODQ1YjdhNWEsIDB9LAorICAgICB7MHhhMzE4LCAweDhjNWI3ZTVhLCAweDhjNWI3ZTVhLCAweDk1MGY4Y2NmLCAweDk1MGY4Y2NmLCAwfSwKKyAgICAgezB4YTMxYywgMHg5ZDBmOTZjZiwgMHg5ZDBmOTZjZiwgMHhhNWNmOWI0ZiwgMHhhNWNmOWI0ZiwgMH0sCisgICAgIHsweGEzMjAsIDB4YjUxZmE2OWYsIDB4YjUxZmE2OWYsIDB4YmRkZmFmMWYsIDB4YmRkZmFmMWYsIDB9LAorICAgICB7MHhhMzI0LCAweGNiM2ZiZDA3LCAweGNiM2ZiY2JmLCAweGQxZmZjOTNmLCAweGQxZmZjOTNmLCAwfSwKKyAgICAgezB4YTMyOCwgMHgwMDAwZDdiZiwgMHgwMDAwZDdiZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzNjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTM0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzNDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzQ4LCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAwfSwKKyAgICAgezB4YTM0YywgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMH0sCisgICAgIHsweGEzNTAsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB9LAorICAgICB7MHhhMzU0LCAweDAwMDNmZmZmLCAweDAwMDNmZmZmLCAweDAwMDNmZmZmLCAweDAwMDNmZmZmLCAwfSwKKyAgICAgezB4YTM1OCwgMHg3OWE4YWExZiwgMHg3OWE4YWExZiwgMHg3OWE4YWExZiwgMHg3OWE4YWExZiwgMH0sCisgICAgIHsweGEzODgsIDB4MDgwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MDgwMDAwMDAsIDB4MDgwMDAwMDAsIDB9LAorICAgICB7MHhhMzhjLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTM5MCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzOTQsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB9LAorICAgICB7MHhhMzk4LCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAwfSwKKyAgICAgezB4YTM5YywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMH0sCisgICAgIHsweGEzYTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2E0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNhOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2IwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2JjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNjMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2M4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNjYywgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzZDAsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhM2Q0LCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTNkOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzZGMsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB9LAorICAgICB7MHhhM2UwLCAweDAwMDAwMGMwLCAweDAwMDAwMGMwLCAweDAwMDAwMGMwLCAweDAwMDAwMGMwLCAwfSwKKyAgICAgezB4YTg0OCwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2OCwgMHgwMDE4MGE2OCwgMH0sCisgICAgIHsweGE5MjAsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB9LAorICAgICB7MHhhOTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAwfSwKKyAgICAgezB4YjIwYywgMHgwMTJlODE2MCwgMHgwMTJlODE2MCwgMHgwMTJhODE2MCwgMHgwMTJhODE2MCwgMH0sCisgICAgIHsweGIyNmMsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB9LAorICAgICB7MHhiODQ4LCAweDAwMTgwYTY1LCAweDAwMTgwYTY1LCAweDAwMTgwYTY4LCAweDAwMTgwYTY4LCAwfSwKKyAgICAgezB4YjkyMCwgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMHgwNTEwMDAxYywgMH0sCisgICAgIHsweGI5NjAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB4MDAwMDliNDAsIDB9LAorICAgICB7MHhjMjBjLCAweDAxMmU4MTYwLCAweDAxMmU4MTYwLCAweDAxMmE4MTYwLCAweDAxMmE4MTYwLCAwfSwKKyAgICAgezB4YzI2YywgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMHgwOTI0OTEyNiwgMH0sCisgICAgIC8vezB4Yzg2NCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMHgwMDAxY2UwMCwgMH0sCisgICAgIHsweGM4NjQsIDB4MDAwMWM2MDAsIDB4MDAwMWM2MDAsIDB4MDAwMWM2MDAsIDB4MDAwMWM2MDAsIDB9LAorICAgICB7MHhjOTVjLCAweDAwNGI2YThlLCAweDAwNGI2YThlLCAweDAwNGI2YThlLCAweDAwNGI2YThlLCAwfSwKKyAgICAgezB4Yzk2OCwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZSwgMH0sCisgICAgIHsweGM5YmMsIDB4MDAxODE0MDAsIDB4MDAxODE0MDAsIDB4MDAxODE0MDAsIDB4MDAxODE0MDAsIDB9LAorICAgICB7MHhkMjcwLCAweDAwODIwODIwLCAweDAwODIwODIwLCAweDAwODIwODIwLCAweDAwODIwODIwLCAwfSwKKyAgICAgezB4ZDM1YywgMHgwNjZjNDIwZiwgMHgwNjZjNDIwZiwgMHgwNjZjNDIwZiwgMHgwNjZjNDIwZiwgMH0sCisgICAgIHsweGQzNjAsIDB4MGYyODIyMDcsIDB4MGYyODIyMDcsIDB4MGYyODIyMDcsIDB4MGYyODIyMDcsIDB9LAorICAgICB7MHhkMzY0LCAweDE3NjAxNjg1LCAweDE3NjAxNjg1LCAweDE3NjAxNjg1LCAweDE3NjAxNjg1LCAwfSwKKyAgICAgezB4ZDM2OCwgMHgxZjgwMTEwNCwgMHgxZjgwMTEwNCwgMHgxZjgwMTEwNCwgMHgxZjgwMTEwNCwgMH0sCisgICAgIHsweGQzNmMsIDB4MzdhMDBjMDMsIDB4MzdhMDBjMDMsIDB4MzdhMDBjMDMsIDB4MzdhMDBjMDMsIDB9LAorICAgICB7MHhkMzcwLCAweDNmYzQwODgzLCAweDNmYzQwODgzLCAweDNmYzQwODgzLCAweDNmYzQwODgzLCAwfSwKKyAgICAgezB4ZDM3NCwgMHg1N2MwMDgwMywgMHg1N2MwMDgwMywgMHg1N2MwMDgwMywgMHg1N2MwMDgwMywgMH0sCisgICAgIHsweGQzNzgsIDB4NWZkODA2ODIsIDB4NWZkODA2ODIsIDB4NWZkODA2ODIsIDB4NWZkODA2ODIsIDB9LAorICAgICB7MHhkMzdjLCAweDdmZTAwNDgyLCAweDdmZTAwNDgyLCAweDdmZTAwNDgyLCAweDdmZTAwNDgyLCAwfSwKKyAgICAgezB4ZDM4MCwgMHg3ZjNjN2JiYSwgMHg3ZjNjN2JiYSwgMHg3ZjNjN2JiYSwgMHg3ZjNjN2JiYSwgMH0sCisgICAgIHsweGQzODQsIDB4ZjMzMDdmZjAsIDB4ZjMzMDdmZjAsIDB4ZjMzMDdmZjAsIDB4ZjMzMDdmZjAsIDB9Cit9OworCisKK3N0YXRpYyBjb25zdCB1MzJfdCBvdHVzQmFua1tdWzNdID0geworICAgICAvLyMgYmFuayAwCisgICAgIHsweDk4YjAsICAweDFlNTc5NWU1LCAgMHgxZTU3OTVlNX0sCisgICAgIHsweDk4ZTAsICAweDAyMDA4MDIwLCAgMHgwMjAwODAyMH0sCisgICAgIC8vIyBiYW5rIDEKKyAgICAgezB4OThiMCwgIDB4MDIxMDg0MjEsICAweDAyMTA4NDIxfSwKKyAgICAgezB4OThlYywgIDB4MDAwMDAwMDgsICAweDAwMDAwMDA4fSwKKyAgICAgLy8jIGJhbmsgMgorICAgICB7MHg5OGIwLCAgMHgwZTczZmYxNywgIDB4MGU3M2ZmMTd9LAorICAgICB7MHg5OGUwLCAgMHgwMDAwMDQyMCwgIDB4MDAwMDA0MjB9LAorICAgICAvLyMgYmFuayAzCisgICAgIHsweDk4ZjAsICAweDAxNDAwMDE4LCAgMHgwMWMwMDAxOH0sCisgICAgIC8vIyBiYW5rIDQKKyAgICAgezB4OThiMCwgIDB4MDAwMDAxYTEsICAweDAwMDAwMWExfSwKKyAgICAgezB4OThlOCwgIDB4MDAwMDAwMDEsICAweDAwMDAwMDAxfSwKKyAgICAgLy8jIGJhbmsgNQorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxMywgIDB4MDAwMDAwMTN9LAorICAgICB7MHg5OGU0LCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDJ9LAorICAgICAvLyMgYmFuayA2CisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0MDAwLCAgMHgwMDAwNDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA2YzAwLCAgMHgwMDAwNmMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAyYzAwLCAgMHgwMDAwMmMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0ODAwLCAgMHgwMDAwNDgwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0MDAwLCAgMHgwMDAwNDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA2MDAwLCAgMHgwMDAwNjAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAxMDAwLCAgMHgwMDAwMTAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0MDAwLCAgMHgwMDAwNDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDg3YzAwLCAgMHgwMDA4N2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA1NDAwLCAgMHgwMDAwNTQwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwYzAwLCAgMHgwMDAwMGMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAxODAwLCAgMHgwMDAwMTgwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA2YzAwLCAgMHgwMDAwNmMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA2YzAwLCAgMHgwMDAwNmMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA3YzAwLCAgMHgwMDAwN2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAyYzAwLCAgMHgwMDAwMmMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAzYzAwLCAgMHgwMDAwM2MwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAzODAwLCAgMHgwMDAwMzgwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAxYzAwLCAgMHgwMDAwMWMwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwODAwLCAgMHgwMDAwMDgwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwNDA4LCAgMHgwMDAwMDQwOH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0YzE1LCAgMHgwMDAwNGMxNX0sCisgICAgIHsweDk4YjAsICAweDAwMDA0MTg4LCAgMHgwMDAwNDE4OH0sCisgICAgIHsweDk4YjAsICAweDAwMDAyMDFlLCAgMHgwMDAwMjAxZX0sCisgICAgIHsweDk4YjAsICAweDAwMDEwNDA4LCAgMHgwMDAxMDQwOH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwODAxLCAgMHgwMDAwMDgwMX0sCisgICAgIHsweDk4YjAsICAweDAwMDAwYzA4LCAgMHgwMDAwMGMwOH0sCisgICAgIHsweDk4YjAsICAweDAwMDAxODFlLCAgMHgwMDAwMTgxZX0sCisgICAgIHsweDk4YjAsICAweDAwMDAxMDE2LCAgMHgwMDAwMTAxNn0sCisgICAgIHsweDk4YjAsICAweDAwMDAyODAwLCAgMHgwMDAwMjgwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDA0MDEwLCAgMHgwMDAwNDAxMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwODFjLCAgMHgwMDAwMDgxY30sCisgICAgIHsweDk4YjAsICAweDAwMDAwMTE1LCAgMHgwMDAwMDExNX0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDE1LCAgMHgwMDAwMDAxNX0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDY2LCAgMHgwMDAwMDA2Nn0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAxY30sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDA0LCAgMHgwMDAwMDAwNH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDE1LCAgMHgwMDAwMDAxNX0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDFmLCAgMHgwMDAwMDAxZn0sCisgICAgIHsweDk4ZTAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDQwMH0sCisgICAgIC8vIyBiYW5rIDcKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwYTAsICAweDAwMDAwMGEwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMDAsICAweDAwMDAwMDAwfSwKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwNDAsICAweDAwMDAwMDQwfSwKKyAgICAgezB4OThmMCwgIDB4MDAwMDAwMWMsICAweDAwMDAwMDFjfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWMxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9pb2N0bC5jCkBAIC0wLDAgKzEsMjkxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW9jdGwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBMaW51eCB3aXJlbGVzcyBleHRlbnNpb24gcmVsYXRlZCBmdW5jdG9ucy4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2RlZmluZSBaRF9JT0NUTF9XUEEJCQkgICAgKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgWkRfSU9DVExfUEFSQU0JCQkgICAgKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgWkRfSU9DVExfR0VUV1BBSUUJCSAgICAoU0lPQ0RFVlBSSVZBVEUgKyAzKQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX0lPQ1RMX0NFTkMgICAgICAgICAgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyA0KQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWkRfUEFSQU1fUk9BTUlORwkJICAgIDB4MDAwMQorI2RlZmluZSBaRF9QQVJBTV9QUklWQUNZCQkgICAgMHgwMDAyCisjZGVmaW5lIFpEX1BBUkFNX1dQQQkJCSAgICAweDAwMDMKKyNkZWZpbmUgWkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTCTB4MDAwNAorI2RlZmluZSBaRF9QQVJBTV9EUk9QVU5FTkNSWVBURUQJMHgwMDA1CisjZGVmaW5lIFpEX1BBUkFNX0FVVEhfQUxHUwkJICAgIDB4MDAwNgorI2RlZmluZSBaRF9QQVJBTV9XUFNfRklMVEVSCQkgICAgMHgwMDA3CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBQODAyMTFfUEFDS0VUX0NFTkNGTEFHCQkweDAwMDEKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFA4MDIxMV9QQUNLRVRfU0VUS0VZICAgICAJMHgwMDAzCisKKyNkZWZpbmUgWkRfQ01EX1NFVF9FTkNSWVBUX0tFWQkJMHgwMDAxCisjZGVmaW5lIFpEX0NNRF9TRVRfTUxNRQkJCSAgICAweDAwMDIKKyNkZWZpbmUgWkRfQ01EX1NDQU5fUkVRCQkJICAgIDB4MDAwMworI2RlZmluZSBaRF9DTURfU0VUX0dFTkVSSUNfRUxFTUVOVAkweDAwMDQKKyNkZWZpbmUgWkRfQ01EX0dFVF9UU0MJCQkgICAgMHgwMDA1CisKKyNkZWZpbmUgWkRfQ1JZUFRfQUxHX05BTUVfTEVOCQkxNgorI2RlZmluZSBaRF9NQVhfS0VZX1NJWkUJCQkgICAgMzIKKyNkZWZpbmUgWkRfTUFYX0dFTkVSSUNfU0laRQkJICAgIDY0CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworZXh0ZXJuIHUxNl90IHpmTG54R2V0VmFwSWQoemRldl90KiBkZXYpOworCitzdGF0aWMgY29uc3QgdTMyX3QgY2hhbm5lbF9mcmVxdWVuY3lfMTFBW10gPQoreworLy9FdmVuIGVsZW1lbnQgZm9yIENoYW5uZWwgTnVtYmVyLCBPZGQgZm9yIEZyZXF1ZW5jeQorICAgIDM2LDUxODAsCisgICAgNDAsNTIwMCwKKyAgICA0NCw1MjIwLAorICAgIDQ4LDUyNDAsCisgICAgNTIsNTI2MCwKKyAgICA1Niw1MjgwLAorICAgIDYwLDUzMDAsCisgICAgNjQsNTMyMCwKKyAgICAxMDAsNTUwMCwKKyAgICAxMDQsNTUyMCwKKyAgICAxMDgsNTU0MCwKKyAgICAxMTIsNTU2MCwKKyAgICAxMTYsNTU4MCwKKyAgICAxMjAsNTYwMCwKKyAgICAxMjQsNTYyMCwKKyAgICAxMjgsNTY0MCwKKyAgICAxMzIsNTY2MCwKKyAgICAxMzYsNTY4MCwKKyAgICAxNDAsNTcwMCwKKy8vCisgICAgMTg0LDQ5MjAsCisgICAgMTg4LDQ5NDAsCisgICAgMTkyLDQ5NjAsCisgICAgMTk2LDQ5ODAsCisgICAgOCw1MDQwLAorICAgIDEyLDUwNjAsCisgICAgMTYsNTA4MCwKKyAgICAzNCw1MTcwLAorICAgIDM4LDUxOTAsCisgICAgNDIsNTIxMCwKKyAgICA0Niw1MjMwLAorLy8KKyAgICAxNDksNTc0NSwKKyAgICAxNTMsNTc2NSwKKyAgICAxNTcsNTc4NSwKKyAgICAxNjEsNTgwNSwKKyAgICAxNjUsNTgyNQorLy8KK307CisKK2ludCB1c2JkcnZfZnJlcTJjaGFuKHUzMl90IGZyZXEpCit7CisgICAgLyogMi40RyBIeiAqLworICAgIGlmIChmcmVxID4gMjQwMCAmJiBmcmVxIDwgMzAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKGZyZXEtMjQxMikvNSkgKyAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgdTE2X3QgbnVtX2NoYW4gPSBzaXplb2YoY2hhbm5lbF9mcmVxdWVuY3lfMTFBKS9zaXplb2YodTMyX3QpOworCisgICAgICAgIGZvcihpaSA9IDE7IGlpIDwgbnVtX2NoYW47IGlpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWldID09IGZyZXEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfZnJlcXVlbmN5XzExQVtpaS0xXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2X2NoYW4yZnJlcShpbnQgY2hhbikKK3sKKyAgICBpbnQgZnJlcTsKKworICAgIC8qIElmIGNoYW5uZWwgbnVtYmVyIGlzIG91dCBvZiByYW5nZSAqLworICAgIGlmIChjaGFuID4gMTY1IHx8IGNoYW4gPD0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogMi40RyBiYW5kICovCisgICAgaWYgKGNoYW4gPj0gMSAmJiBjaGFuIDw9IDEzKQorICAgIHsKKyAgICAgICAgZnJlcSA9ICgyNDEyICsgKGNoYW4gLSAxKSAqIDUpOworICAgICAgICByZXR1cm4gZnJlcTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2hhbiA+PSAzNiAmJiBjaGFuIDw9IDE2NSkKKyAgICB7CisgICAgICAgIHUxNl90IGlpOworICAgICAgICB1MTZfdCBudW1fY2hhbiA9IHNpemVvZihjaGFubmVsX2ZyZXF1ZW5jeV8xMUEpL3NpemVvZih1MzJfdCk7CisKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBudW1fY2hhbjsgaWkgKz0gMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoYW5uZWxfZnJlcXVlbmN5XzExQVtpaV0gPT0gY2hhbikKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbF9mcmVxdWVuY3lfMTFBW2lpKzFdOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FuJ3QgZmluZCBkZXNpcmVkIGZyZXF1ZW5jeSAqLworICAgICAgICBpZiAoaWkgPT0gbnVtX2NoYW4pCisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBDYW4ndCBmaW5kIGRlaXNyZWQgZnJlcXVlbmN5ICovCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgdXNiZHJ2X2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgIC8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIGNoYXIgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisgICAgaW50IGk7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIG1lbXNldChlc3NpZGJ1ZiwgMCwgc2l6ZW9mKGVzc2lkYnVmKSk7CisKKyAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl9pb2N0bF9zZXRlc3NpZFxuIik7CisKKyAgICAvL3ByaW50aygic3NpZGxlbj0lZFxuIiwgZXJxLT5sZW5ndGgpOyAvL2ZvciBhbnksIGl0IGlzIDEuCisgICAgaWYgKGVycS0+ZmxhZ3MpIHsKKyAgICAgICAgaWYgKGVycS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFKzEpKQorICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoZXNzaWRidWYsIGVycS0+cG9pbnRlciwgZXJxLT5sZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgLy96ZF9EaXNhc29jQWxsKDIpOworICAgIC8vd2FpdF9tcygxMDApOworCisgICAgcHJpbnRrKEtFUk5fRVJSICJlc3NpZGJ1ZjogIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBlcnEtPmxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlMDJ4ICIsIGVzc2lkYnVmW2ldKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICBlc3NpZGJ1ZltlcnEtPmxlbmd0aF0gPSAnXDAnOworICAgIC8vbWVtY3B5KG1hY3AtPndkLndzLnNzaWQsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCk7CisgICAgLy9tYWNwLT53ZC53cy5zc2lkTGVuID0gc3RybGVuKGVzc2lkYnVmKSsyOworICAgIC8vbWFjcC0+d2Qud3Muc3NpZFsxXSA9IHN0cmxlbihlc3NpZGJ1Zik7IC8vIFVwZGF0ZSBzc2lkIGxlbmd0aAorCisgICAgemZpV2xhblNldFNTSUQoZGV2LCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpOworI2lmIDAKKyAgICBwcmludGsoS0VSTl9FUlIgIm1hY3AtPndkLndzLnNzaWQ6ICIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgbWFjcC0+d2Qud3Muc3NpZExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlMDJ4ICIsIG1hY3AtPndkLndzLnNzaWRbaV0pOworICAgIH0KKworICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKyNlbmRpZgorICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgemZpV2xhbkVuYWJsZShkZXYpOworCisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2X2lvY3RsX2dldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworICAgICAvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAgdThfdCBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICAgdThfdCBsZW47CisgICAgIHU4X3QgaTsKKworCisgICAgIC8vbGVuID0gbWFjcC0+d2Qud3Muc3NpZExlbjsKKyAgICAgLy9tZW1jcHkoZXNzaWRidWYsIG1hY3AtPndkLndzLnNzaWQsIG1hY3AtPndkLndzLnNzaWRMZW4pOworICAgICB6ZmlXbGFuUXVlcnlTU0lEKGRldiwgZXNzaWRidWYsICZsZW4pOworCisgICAgIGVzc2lkYnVmW2xlbl0gPSAwOworCisgICAgIHByaW50ayhLRVJOX0VSUiAiRVNTSUQ6ICIpOworCisgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICB7CisgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVjIiwgZXNzaWRidWZbaV0pOworICAgICB9CisKKyAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgIGVycS0+ZmxhZ3M9IDE7CisgICAgIGVycS0+bGVuZ3RoID0gc3RybGVuKGVzc2lkYnVmKSArIDE7CisKKyAgICAgaWYgKGVycS0+cG9pbnRlcikKKyAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpKQorICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgIHJldHVybiAwOworfQorCisKK2ludCB1c2JkcnZfaW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorLyoKKyAqIEVuY29kZSBhIFdQQSBvciBSU04gaW5mb3JtYXRpb24gZWxlbWVudCBhcyBhIGN1c3RvbQorICogZWxlbWVudCB1c2luZyB0aGUgaG9zdGFwIGZvcm1hdC4KKyAqLwordTMyIGVuY29kZV9pZSh2b2lkICpidWYsIHUzMiBidWZzaXplLCBjb25zdCB1OCAqaWUsIHUzMiBpZWxlbiwgY29uc3QgdTggKmxlYWRlciwgdTMyIGxlYWRlcl9sZW4pCit7CisgICAgdTggKnA7CisgICAgdTMyIGk7CisKKyAgICBpZiAoYnVmc2l6ZSA8IGxlYWRlcl9sZW4pCisgICAgICAgIHJldHVybiAwOworICAgIHAgPSBidWY7CisgICAgbWVtY3B5KHAsIGxlYWRlciwgbGVhZGVyX2xlbik7CisgICAgYnVmc2l6ZSAtPSBsZWFkZXJfbGVuOworICAgIHAgKz0gbGVhZGVyX2xlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWVsZW4gJiYgYnVmc2l6ZSA+IDI7IGkrKykKKyAgICAgICAgcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgaWVbaV0pOworICAgIHJldHVybiAoaSA9PSBpZWxlbiA/IHAgLSAodTggKilidWYgOiAwKTsKK30KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRyYW5zbGF0ZSBzY2FuIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgY2FyZCB0byBhIGNhcmQgaW5kZXBlbmRlbnQKKyAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQKKyAqLworY2hhciAqdXNiZHJ2X3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqY3VycmVudF9ldiwKKyAgICAgICAgY2hhciAqZW5kX2J1Ziwgc3RydWN0IHpzQnNzSW5mbyAqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgaXdfZXZlbnQgaXdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworICAgIHUxNl90IGNhcGFiaWxpdGllczsKKyAgICBjaGFyICpjdXJyZW50X3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHJhdGVzICovCisgICAgY2hhciAqbGFzdF9ldjsKKyAgICBpbnQgaTsKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorICAgIGNoYXIgICAgYnVmWzY0KjIgKyAzMF07CisjZW5kaWYKKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisgICAgaXdlLmNtZCA9IFNJT0NHSVdBUDsKKyAgICBpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBtZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBsaXN0LT5ic3NpZCwgRVRIX0FMRU4pOworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwlpbmZvLAorCWN1cnJlbnRfZXYsCisJZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIE90aGVyIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIGdpdmUgdGhlbSAqLworCisvKiBBZGQgdGhlIEVTU0lEICovCisgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBsaXN0LT5zc2lkWzFdOworICAgIGlmKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCisgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisgICAgaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKyAgICBpd2UudS5kYXRhLmZsYWdzID0gMTsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJaW5mbywKKwljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAmbGlzdC0+c3NpZFsyXSk7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogQWRkIG1vZGUgKi8KKyAgICBpd2UuY21kID0gU0lPQ0dJV01PREU7CisgICAgY2FwYWJpbGl0aWVzID0gKGxpc3QtPmNhcGFiaWxpdHlbMV0gPDwgOCkgKyBsaXN0LT5jYXBhYmlsaXR5WzBdOworICAgIGlmKGNhcGFiaWxpdGllcyAmICgweDAxIHwgMHgwMikpCisgICAgeworICAgICAgICBpZihjYXBhYmlsaXRpZXMgJiAweDAxKQorICAgICAgICAgICAgaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisgICAgfQorCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBmcmVxdWVuY3kgKi8KKyAgICBpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisgICAgaXdlLnUuZnJlcS5tID0gbGlzdC0+Y2hhbm5lbDsKKy8qIENoYW5uZWwgZnJlcXVlbmN5IGluIEtIeiAqLworICAgIGlmIChpd2UudS5mcmVxLm0gPiAxNCkKKyAgICB7CisgICAgICAgIGlmICgoMTg0IDw9IGl3ZS51LmZyZXEubSkgJiYgKGl3ZS51LmZyZXEubTw9MTk2KSkKKyAgICAgICAgICAgICAgaXdlLnUuZnJlcS5tID0gNDAwMCArIGl3ZS51LmZyZXEubSAqIDU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaXdlLnUuZnJlcS5tID0gNTAwMCArIGl3ZS51LmZyZXEubSAqIDU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChpd2UudS5mcmVxLm0gPT0gMTQpCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDI0ODQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaXdlLnUuZnJlcS5tID0gMjQxMiArIChpd2UudS5mcmVxLm0gLSAxKSAqIDU7CisgICAgfQorICAgIGl3ZS51LmZyZXEuZSA9IDY7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCWluZm8sCisgICAgCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisgICAgaXdlLmNtZCA9IElXRVZRVUFMOworI2lmIFdJUkVMRVNTX0VYVCA+IDE4CisgICAgaXdlLnUucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX1VQREFURUQgfCBJV19RVUFMX0xFVkVMX1VQREFURUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHxJV19RVUFMX05PSVNFX1VQREFURUQ7CisjZW5kaWYKKyAgICBpd2UudS5xdWFsLmxldmVsID0gbGlzdC0+c2lnbmFsU3RyZW5ndGg7CisgICAgaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgaXdlLnUucXVhbC5xdWFsID0gbGlzdC0+c2lnbmFsUXVhbGl0eTsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoCisJaW5mbywKKwljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCisgICAgaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisgICAgaWYoY2FwYWJpbGl0aWVzICYgMHgxMCkKKyAgICAgICAgaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworICAgIGVsc2UKKyAgICAgICAgaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJaW5mbywKKwljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBsaXN0LT5zc2lkKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBSYXRlIDogc3R1ZmZpbmcgbXVsdGlwbGUgdmFsdWVzIGluIGEgc2luZ2xlIGV2ZW50IHJlcXVpcmUgYSBiaXQKKyAqIG1vcmUgb2YgbWFnaWMgKi8KKyAgICBjdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworCisgICAgaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworLyogVGhvc2UgdHdvIGZsYWdzIGFyZSBpZ25vcmVkLi4uICovCisgICAgaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgZm9yKGkgPSAwIDsgaSA8IGxpc3QtPnN1cHBvcnRlZFJhdGVzWzFdIDsgaSsrKQorICAgIHsKKy8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCisgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKGxpc3QtPnN1cHBvcnRlZFJhdGVzW2krMl0gJiAweDdmKSAqIDUwMDAwMCk7CisvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisgICAgICAgIGN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfdmFsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IGxpc3QtPmV4dFN1cHBvcnRlZFJhdGVzWzFdIDsgaSsrKQorICAgIHsKKy8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCisgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKGxpc3QtPmV4dFN1cHBvcnRlZFJhdGVzW2krMl0gJiAweDdmKSAqIDUwMDAwMCk7CisvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisgICAgICAgIGN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfdmFsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworICAgIH0KKworLyogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50ICovCisgICAgaWYoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorICAgICAgICBjdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKyNkZWZpbmUgSUVFRTgwMjExX0VMRU1JRF9SU04gMHgzMAorICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImJjbl9pbnQ9JWQiLCAobGlzdC0+YmVhY29uSW50ZXJ2YWxbMV0gPDwgOCkgKyBsaXN0LT5iZWFjb25JbnRlcnZhbFswXSk7CisgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGJ1Zik7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworICAgIGlmIChsaXN0LT53cGFJZVsxXSAhPSAwKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcnNuX2xlYWRlcltdID0gInJzbl9pZT0iOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB3cGFfbGVhZGVyW10gPSAid3BhX2llPSI7CisKKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAgICAgaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgIGlmIChsaXN0LT53cGFJZVswXSA9PSBJRUVFODAyMTFfRUxFTUlEX1JTTikKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gZW5jb2RlX2llKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgbGlzdC0+d3BhSWUsIGxpc3QtPndwYUllWzFdKzIsCisgICAgICAgICAgICAgICAgcnNuX2xlYWRlciwgc2l6ZW9mKHJzbl9sZWFkZXIpLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IGVuY29kZV9pZShidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgIGxpc3QtPndwYUllLCBsaXN0LT53cGFJZVsxXSsyLAorICAgICAgICAgICAgICAgIHdwYV9sZWFkZXIsIHNpemVvZih3cGFfbGVhZGVyKS0xKTsKKworICAgICAgICBpZiAoaXdlLnUuZGF0YS5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYnVmKTsKKworICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworICAgIH0KKyAgICBpZiAobGlzdC0+cnNuSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJzbl9sZWFkZXJbXSA9ICJyc25faWU9IjsKKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAgICAgaXdlLmNtZCA9IElXRVZDVVNUT007CisKKyAgICAgICAgaWYgKGxpc3QtPnJzbkllWzBdID09IElFRUU4MDIxMV9FTEVNSURfUlNOKQorICAgICAgICB7CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IGVuY29kZV9pZShidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgIGxpc3QtPnJzbkllLCBsaXN0LT5yc25JZVsxXSsyLAorICAgICAgICAgICAgICAgIHJzbl9sZWFkZXIsIHNpemVvZihyc25fbGVhZGVyKS0xKTsKKyAgICAgICAgICAgIGlmIChpd2UudS5kYXRhLmxlbmd0aCAhPSAwKQorICAgICAgICAgICAgICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludCgKKwkJCWluZm8sCisJCQljdXJyZW50X2V2LCBlbmRfYnVmLCAgJml3ZSwgYnVmKTsKKworICAgICAgICAgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisvKiBUaGUgb3RoZXIgZGF0YSBpbiB0aGUgc2NhbiByZXN1bHQgYXJlIG5vdCByZWFsbHkKKyAqIGludGVyZXN0aW5nLCBzbyBmb3Igbm93IGRyb3AgaXQgKi8KKyAgICByZXR1cm4gY3VycmVudF9ldjsKK30KKworaW50IHVzYmRydndleHRfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBzdHJjcHkod3JxLT5uYW1lLCAiSUVFRSA4MDIuMTEtTUlNTyIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgdTMyX3QgRnJlcUtIejsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChmcmVxLT5lID4gMSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZnJlcS0+ZSA9PSAxKQorICAgIHsKKyAgICAgICAgRnJlcUtIeiA9IChmcmVxLT5tIC8gMTAwMDAwKTsKKworICAgICAgICBpZiAoRnJlcUtIeiA+IDQwMDAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChGcmVxS0h6ID4gNTgyNTAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gNTgyNTAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKEZyZXFLSHogPCA0OTIwMDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSA0OTIwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAoRnJlcUtIeiA8IDUwMDAwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9ICgoKEZyZXFLSHogLSA0MDAwMDAwKSAvIDUwMDApICogNTAwMCkgKyA0MDAwMDAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAoKChGcmVxS0h6IC0gNTAwMDAwMCkgLyA1MDAwKSAqIDUwMDApICsgNTAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChGcmVxS0h6ID4gMjQ4NDAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gMjQ4NDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKEZyZXFLSHogPCAyNDEyMDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAyNDEyMDAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAoKChGcmVxS0h6IC0gMjQxMjAwMCkgLyA1MDAwKSAqIDUwMDApICsgMjQxMjAwMDsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEZyZXFLSHogPSB1c2JkcnZfY2hhbjJmcmVxKGZyZXEtPm0pOworCisgICAgICAgIGlmIChGcmVxS0h6ICE9IC0xKQorICAgICAgICAgICAgRnJlcUtIeiAqPSAxMDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBGcmVxS0h6ID0gMjQxMjAwMDsKKyAgICB9CisKKyAgICAvL3ByaW50aygiZnJlcS0+bTogJWQsIGZyZXEtPmU6ICVkXG4iLCBmcmVxLT5tLCBmcmVxLT5lKTsKKyAgICAvL3ByaW50aygiRnJlcUtIejogJWRcbiIsIEZyZXFLSHopOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgIHsKKyAgICAgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIEZyZXFLSHosIDApOyAvLyBJbW1lZGlhdGUKKyAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzUwXTsKKyAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsIHdwYWllLCAmd3BhaWVMZW4pOworICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgIC8vaWYgKHdwYWllTGVuID4gMikKKyAgICAgICAgLy8gICAgemZpV2xhblNldFdwYUllKGRldiwgd3BhaWUsIHdwYWllTGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgZnJlcS0+bSA9IHpmaVdsYW5RdWVyeUZyZXF1ZW5jeShkZXYpOworICAgIGZyZXEtPmUgPSAzOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90IFdsYW5Nb2RlOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHdycS0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgSVdfTU9ERV9NQVNURVI6CisgICAgICAgICAgICBXbGFuTW9kZSA9IFpNX01PREVfQVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19NT0RFX0lORlJBOgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfTU9ERV9BREhPQzoKKyAgICAgICAgICAgIFdsYW5Nb2RlID0gWk1fTU9ERV9JQlNTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBXbGFuTW9kZSA9IFpNX01PREVfSUJTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsV2xhbk1vZGUpOworICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMSk7CisgICAgemZpV2xhbkVuYWJsZShkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHN3aXRjaCh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9NT0RFX0FQOgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX01PREVfSU5GUkFTVFJVQ1RVUkU6CisgICAgICAgICAgICAqbW9kZSA9IElXX01PREVfSU5GUkE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9NT0RFX0lCU1M6CisgICAgICAgICAgICAqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlzZW5zLT52YWx1ZSA9IDA7CisJc2Vucy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKyAgICBpbnQgaSwgdmFsOworICAgIC8vaW50IG51bV9iYW5kX2E7CisgICAgdTE2X3QgY2hhbm5lbHNbNjBdOworICAgIHUxNl90IGNoYW5uZWxfbnVtOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBXSVJFTEVTU19FWFQgPiA5CisgICAgcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKy8vIFhYWCB3aGF0IGFib3V0IG1pbi9tYXhfcG1wLCBtaW4vbWF4X3BtdCwgZXRjLgorI2VuZGlmCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMAorICAgIHJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworICAgIHJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDEzOworCisgICAgcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKyAgICByYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKyAgICByYW5nZS0+bWluX3JldHJ5ID0gMDsKKyAgICByYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCisKKyAgICBjaGFubmVsX251bSA9IHpmaVdsYW5RdWVyeUFsbG93Q2hhbm5lbHMoZGV2LCBjaGFubmVscyk7CisKKyAgICAvKiBHdXJhbnRlZSByZXBvcnRlZCBjaGFubmVsIG51bWJlcnMgaXMgbGVzcyBvciBlcXVhbCB0byBJV19NQVhfRlJFUVVFTkNJRVMgKi8KKyAgICBpZiAoY2hhbm5lbF9udW0gPiBJV19NQVhfRlJFUVVFTkNJRVMpCisgICAgICAgIGNoYW5uZWxfbnVtID0gSVdfTUFYX0ZSRVFVRU5DSUVTOworCisgICAgdmFsID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsX251bTsgaSsrKQorICAgIHsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gdXNiZHJ2X2ZyZXEyY2hhbihjaGFubmVsc1tpXSk7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0ubSA9IGNoYW5uZWxzW2ldOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmUgPSA2OworICAgICAgICB2YWwrKzsKKyAgICB9CisKKyAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gY2hhbm5lbF9udW07CisgICAgcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBjaGFubmVsX251bTsKKworI2lmIDAKKyAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gMTQ7IC8vIE9ubHkgMi40RworCisvKiBYWFggbmVlZCB0byBmaWx0ZXIgYWdhaW5zdCB0aGUgcmVndWxhdG9yeSBkb21haW4gJnwgYWN0aXZlIHNldCAqLworICAgIHZhbCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNDsgaSsrKSAvLyBCLEcgQmFuZHMKKyAgICB7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IGk7CisgICAgICAgIGlmIChpID09IDE0KQorICAgICAgICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSAyNDg0MDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0ubSA9ICgyNDEyKyhpLTEpKjUpKjEwMDA7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uZSA9IDM7CisgICAgICAgIHZhbCsrOworICAgIH0KKworICAgIG51bV9iYW5kX2EgPSAoSVdfTUFYX0ZSRVFVRU5DSUVTIC0gdmFsKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmFuZF9hOyBpKyspIC8vIEEgQmFuZHMKKyAgICB7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IGNoYW5uZWxfZnJlcXVlbmN5XzExQVsyICogaV07CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0ubSA9IGNoYW5uZWxfZnJlcXVlbmN5XzExQVsyICogaSArIDFdICogMTAwMDsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5lID0gMzsKKyAgICAgICAgdmFsKys7CisgICAgfQorICAgIC8vIE1JTU8gUmF0ZSBOb3QgRGVmaW5lZCBOb3cKKyAgICAvL0ZvciA4MDIuMTFhLCB0aGVyZSBhcmUgdG9vIG1vcmUgZnJlcXVlbmN5LiBXZSBjYW4ndCByZXR1cm4gdGhlbSBhbGwKKyAgICByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKyNlbmRpZgorCisvKiBNYXggb2YgL3Byb2MvbmV0L3dpcmVsZXNzICovCisgICAgcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8vPz8gICAgICAgICAgICAgICAgICAvLzkyOworICAgIHJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDE1NDsgLy8/PworICAgIHJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDE1NDsgLy8/PworICAgIHJhbmdlLT5zZW5zaXRpdml0eSA9IDM7IC8vPz8KKworLy8gWFhYIHRoZXNlIG5lZWQgdG8gYmUgbnNkLXNwZWNpZmljIQorICAgIHJhbmdlLT5taW5fcnRzID0gMDsKKyAgICByYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisgICAgcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworICAgIHJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisgICAgcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0LypOVU1fV0VQS0VZUyovOyAvLz8/CisgICAgcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7IC8vPz8KKworICAgIHJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsgLy8/PyAgICAgICAgICAgICAgIC8vV0VQIEtleSBFbmNvZGluZyBTaXplCisgICAgcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsvLz8/CisKKy8vIFhYWCB3aGF0IGFib3V0IG51bV9iaXRyYXRlcy90aHJvdWdocHV0PworICAgIHJhbmdlLT5udW1fYml0cmF0ZXMgPSAwOyAvLz8/CisKKy8qIGVzdGltYXRlZCBtYXggdGhyb3VnaHB1dCAqLworLy8gWFhYIG5lZWQgdG8gY2FwIGl0IGlmIHdlJ3JlIHJ1bm5pbmcgYXQgfjJNYnBzLi4KKworICAgIHJhbmdlLT50aHJvdWdocHV0ID0gMzAwMDAwMDAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSAvLyBBUCBNb2RlCisgICAgICAgIHpmaVdsYW5TZXRNYWNBZGRyZXNzKGRldiwodTE2X3QgKikmTWFjQWRkci0+c2FfZGF0YVswXSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU1RBIE1vZGUKKyAgICAgICAgemZpV2xhblNldEJzc2lkKGRldiwmTWFjQWRkci0+c2FfZGF0YVswXSk7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgeworICAgICAgICAvL3U4X3Qgd3BhaWVMZW4sd3BhaWVbODBdOworICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgd3BhaWUsICZ3cGFpZUxlbik7CisgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgLy9pZiAod3BhaWVMZW4gPiAyKQorICAgICAgICAvLyAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB3cGFpZSwgd3BhaWVMZW4pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICAgICAgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyhkZXYsICZNYWNBZGRyLT5zYV9kYXRhWzBdKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TVEEgTW9kZQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPmFkYXB0ZXJTdGF0ZSA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkKKyAgICAgICAgeworICAgICAgICAgICAgemZpV2xhblF1ZXJ5QnNzaWQoZGV2LCAmTWFjQWRkci0+c2FfZGF0YVswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OF90IHplcm9fYWRkcls2XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworICAgICAgICAgICAgbWVtY3B5KCZNYWNBZGRyLT5zYV9kYXRhWzBdLCB6ZXJvX2FkZHIsIHNpemVvZih6ZXJvX2FkZHIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9Eb24ndCBrbm93IGhvdyB0byBkbyB5ZXQtLUNXWWFuZygrKQorICAgIHJldHVybiAwOworCit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgcHJpbnRrKCJDV1kgLSB1c2JkcnZ3ZXh0X3Npd3NjYW5cbiIpOworCisgICAgemZpV2xhblNjYW4oZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworICAgIGNoYXIgKmVuZF9idWY7CisgICAgaW50IGk7CisgICAgLy9zdHJ1Y3QgenNCc3NMaXN0IEJzc0xpc3Q7CisgICAgc3RydWN0IHpzQnNzTGlzdFYxICpwQnNzTGlzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6c0Jzc0xpc3RWMSksIEdGUF9LRVJORUwpOworICAgIC8vQnNzTGlzdCA9IHdkLT5zdGEucEJzc0xpc3Q7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGRhdGEtPmxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgfQorCisgICAgcHJpbnRrKCJnaXdzY2FuIC0gUmVwb3J0IFNjYW4gUmVzdWx0c1xuIik7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBCc3NMaXN0IFNyZXVjdHVyZSBMZW4gOiAlZFxuIiwgc2l6ZW9mKEJzc0xpc3QpKTsKKyAgICAvL3ByaW50aygiZ2l3c2NhbiAtIEJzc0xpc3QgQ291bnQgOiAlZFxuIiwgd2QtPnN0YS5wQnNzTGlzdC0+YnNzQ291bnQpOworICAgIC8vcHJpbnRrKCJnaXdzY2FuIC0gVXBkYXRlQnNzTGlzdCBDb3VudCA6ICVkXG4iLCB3ZC0+c3RhLnBVcGRhdGVCc3NMaXN0LT5ic3NDb3VudCk7CisgICAgemZpV2xhblF1ZXJ5QnNzTGlzdFYxKGRldiwgcEJzc0xpc3QpOworICAgIC8vemZpV2xhblF1ZXJ5QnNzTGlzdChkZXYsICZCc3NMaXN0KTsKKworLyogUmVhZCBhbmQgcGFyc2UgYWxsIGVudHJpZXMgKi8KKyAgICBwcmludGsoImdpd3NjYW4gLSBwQnNzTGlzdC0+YnNzQ291bnQgOiAlZFxuIiwgcEJzc0xpc3QtPmJzc0NvdW50KTsKKyAgICAvL3ByaW50aygiZ2l3c2NhbiAtIEJzc0xpc3QuYnNzQ291bnQgOiAlZFxuIiwgQnNzTGlzdC5ic3NDb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcEJzc0xpc3QtPmJzc0NvdW50OyBpKyspCisgICAgeworLyogVHJhbnNsYXRlIHRvIFdFIGZvcm1hdCB0aGlzIGVudHJ5ICovCisgICAgICAgIC8vY3VycmVudF9ldiA9IHVzYmRydl90cmFuc2xhdGVfc2NhbihkZXYsIGluZm8sIGN1cnJlbnRfZXYsCisgICAgICAgIC8vICAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJnBCc3NMaXN0LT5ic3NJbmZvW2ldKTsKKyAgICAgICAgY3VycmVudF9ldiA9IHVzYmRydl90cmFuc2xhdGVfc2NhbihkZXYsIGluZm8sIGN1cnJlbnRfZXYsCisgICAgICAgICAgICBlbmRfYnVmLCAmcEJzc0xpc3QtPmJzc0luZm9baV0pOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gZW5kX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAga2ZyZWUocEJzc0xpc3QpOworICAgICAgICAgICAgZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisvKiBMZW5ndGggb2YgZGF0YSAqLworICAgIGRhdGEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworICAgIGRhdGEtPmZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b2RvICovCisKKyAgICBrZnJlZShwQnNzTGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkLCBjaGFyICpleHRyYSkKK3sKKyAgICBjaGFyIEVzc2lkQnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGVzc2lkLT5mbGFncyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKGVzc2lkLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUrMSkpCisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmRXNzaWRCdWYsIGVzc2lkLT5wb2ludGVyLCBlc3NpZC0+bGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgIEVzc2lkQnVmW2Vzc2lkLT5sZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgLy9wcmludGsoInNpd2Vzc2lkIC0gU2V0IEVzc2lkIDogJXNcbiIsRXNzaWRCdWYpOworICAgICAgICAvL3ByaW50aygic2l3ZXNzaWQgLSBFc3NpZCBMZW4gOiAlZFxuIixlc3NpZC0+bGVuZ3RoKTsKKyAgICAgICAgLy9wcmludGsoInNpd2Vzc2lkIC0gRXNzaWQgRmxhZyA6ICV4XG4iLGVzc2lkLT5mbGFncyk7CisgICAgICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgemZpV2xhblNldFNTSUQoZGV2LCBFc3NpZEJ1Ziwgc3RybGVuKEVzc2lkQnVmKSk7CisgICAgICAgICAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KGRldiksIEZBTFNFKTsKKyAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoZGV2KSk7CisgICAgICAgICAgICAvL3U4X3Qgd3BhaWVMZW4sd3BhaWVbNTBdOworICAgICAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsIHdwYWllLCAmd3BhaWVMZW4pOworICAgICAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgICAgIC8vaWYgKHdwYWllTGVuID4gMikKKyAgICAgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBFc3NpZExlbjsKKyAgICBjaGFyIEVzc2lkQnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworICAgIGludCBzc2lkX2xlbjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHpmaVdsYW5RdWVyeVNTSUQoZGV2LCAmRXNzaWRCdWZbMF0sICZFc3NpZExlbik7CisKKyAgICAvKiBDb252ZXJ0IHR5cGUgZnJvbSB1bnNpZ25lZCBjaGFyIHRvIGNoYXIgKi8KKyAgICBzc2lkX2xlbiA9IChpbnQpRXNzaWRMZW47CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIGVzc2lkIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIElXX0VTU0lEX01BWF9TSVpFICovCisgICAgaWYgKHNzaWRfbGVuID4gSVdfRVNTSURfTUFYX1NJWkUpCisgICAgICAgIHNzaWRfbGVuID0gSVdfRVNTSURfTUFYX1NJWkU7CisKKyAgICBFc3NpZEJ1Zltzc2lkX2xlbl0gPSAnXDAnOworCisgICAgZXNzaWQtPmZsYWdzID0gMTsKKyAgICBlc3NpZC0+bGVuZ3RoID0gc3RybGVuKEVzc2lkQnVmKTsKKworICAgIG1lbWNweShleHRyYSwgRXNzaWRCdWYsIGVzc2lkLT5sZW5ndGgpOworICAgIC8vIHdpcmVsZXNzLmMgaW4gS2VybmVsIHdvdWxkIGhhbmRsZSBjb3B5X3RvX3VzZXIgLS0gbGluZSA2NzkKKyAgICAvKmlmIChlc3NpZC0+cG9pbnRlcikKKyAgICB7CisgICAgICAgIGlmICggY29weV90b191c2VyKGVzc2lkLT5wb2ludGVyLCBFc3NpZEJ1ZiwgZXNzaWQtPmxlbmd0aCkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoImdpd2Vzc2lkIC0gY29weV90b191c2VyIEZhaWxcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIH0KKyAgICB9Ki8KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisgICAgLy9FeGlzdCBidXQganVuay0tQ1dZYW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBFc3NpZExlbjsKKyAgICBjaGFyIEVzc2lkQnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHpmaVdsYW5RdWVyeVNTSUQoZGV2LCAmRXNzaWRCdWZbMF0sICZFc3NpZExlbik7CisgICAgRXNzaWRCdWZbRXNzaWRMZW5dID0gMDsKKworICAgIGRhdGEtPmZsYWdzID0gMTsKKyAgICBkYXRhLT5sZW5ndGggPSBzdHJsZW4oRXNzaWRCdWYpOworCisgICAgbWVtY3B5KG5pY2tuYW1lLCBFc3NpZEJ1ZiwgZGF0YS0+bGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAvL0FycmF5IHRvIERlZmluZSBSYXRlIE51bWJlciB0aGF0IFNlbmQgdG8gRHJpdmVyCisgICAgdTE2X3QgemNJbmRleHRvUmF0ZUJHWzE2XSA9IHsxMDAwLCAyMDAwLCA1NTAwLCAxMTAwMCwgMCwgMCwgMCwgMCwgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsIDEyMDAwLCA2MDAwLCA1NDAwMCwgMzYwMDAsIDE4MDAwLCA5MDAwfTsKKyAgICB1MTZfdCB6Y1JhdGVUb01DU1tdID0gezB4ZmYsIDAsIDEsIDIsIDMsIDB4YiwgMHhmLCAweGEsIDB4ZSwgMHg5LCAweGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgsIDB4Y307CisgICAgdThfdCBpLFJhdGVJbmRleCA9IDQ7CisgICAgdTE2X3QgUmF0ZUticHM7CisKKyAgICAvL3ByaW50aygiZnJxLT5kaXNhYmxlZCA6IDB4JXhcbiIsZnJxLT5kaXNhYmxlZCk7CisgICAgLy9wcmludGsoImZycS0+dmFsdWUgOiAweCV4XG4iLGZycS0+dmFsdWUpOworCisgICAgUmF0ZUticHMgPSBmcnEtPnZhbHVlIC8gMTAwMDsKKyAgICAvL3ByaW50aygiUmF0ZUticHMgOiAlZFxuIiwgUmF0ZUticHMpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKFJhdGVLYnBzID09IHpjSW5kZXh0b1JhdGVCR1tpXSkKKyAgICAgICAgICAgIFJhdGVJbmRleCA9IGk7CisgICAgfQorICAgIGlmICh6Y0luZGV4dG9SYXRlQkdbUmF0ZUluZGV4XSA9PSAwKQorICAgICAgICBSYXRlSW5kZXggPSAweGZmOworICAgIC8vcHJpbnRrKCJSYXRlSW5kZXggOiAleFxuIiwgUmF0ZUluZGV4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKyAgICAgICAgaWYgKFJhdGVJbmRleCA9PSB6Y1JhdGVUb01DU1tpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIC8vcHJpbnRrKCJJbmRleCA6ICV4XG4iLCBpKTsKKyAgICBpZiAoUmF0ZUticHMgPT0gNjUwMDApCisgICAgeworICAgICAgICBSYXRlSW5kZXggPSAyMDsKKyAgICAgICAgcHJpbnRrKCJSYXRlSW5kZXggOiAlZFxuIiwgUmF0ZUluZGV4KTsKKyAgICB9CisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgIHsKKyAgICAgICAgemZpV2xhblNldFR4UmF0ZShkZXYsIGkpOworICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgIC8vemZpV2xhbkVuYWJsZShkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZycS0+Zml4ZWQgPSAwOworICAgIGZycS0+ZGlzYWJsZWQgPSAwOworICAgIGZycS0+dmFsdWUgPSB6ZmlXbGFuUXVlcnlSeFJhdGUoZGV2KSAqIDEwMDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICBpbnQgdmFsID0gcnRzLT52YWx1ZTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocnRzLT5kaXNhYmxlZCkKKyAgICAgICAgdmFsID0gMjM0NzsKKworICAgIGlmICgodmFsIDwgMCkgfHwgKHZhbCA+IDIzNDcpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHpmaVdsYW5TZXRSdHNUaHJlc2hvbGQoZGV2LHZhbCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJ0cy0+dmFsdWUgPSB6ZmlXbGFuUXVlcnlSdHNUaHJlc2hvbGQoZGV2KTsKKyAgICBydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPj0gMjM0Nyk7CisgICAgcnRzLT5maXhlZCA9IDE7CisKKyAgICByZXR1cm4gMDsKKworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgZnJhZ1RocmVzaG9sZDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZnJhZy0+ZGlzYWJsZWQpCisgICAgICAgIGZyYWdUaHJlc2hvbGQgPSAwOworICAgIGVsc2UKKyAgICAgICAgZnJhZ1RocmVzaG9sZCA9IGZyYWctPnZhbHVlOworCisgICAgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoZGV2LGZyYWdUaHJlc2hvbGQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTYgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHZhbCA9IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoZGV2KTsKKworICAgIGZyYWctPnZhbHVlID0gdmFsOworCisgICAgZnJhZy0+ZGlzYWJsZWQgPSAodmFsID49IDIzNDYpOworICAgIGZyYWctPmZpeGVkID0gMTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vTm90IHN1cHBvcnQgeWV0LS1DV1luZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL05vdCBzdXBwb3J0IHlldC0tQ1dZbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9EbyBub3RoaW5nLS1DV1lhbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9EbyBub3RoaW5nLS1DV1lhbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKyAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisgICAgaW50IGksIFdlcFN0YXRlID0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpID09IDApCisgICAgeworICAgICAgICBrZXlJbmZvLmtleSA9IGtleTsKKyAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSBlcnEtPmxlbmd0aDsKKyAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIGlmIChrZXlJbmZvLmtleUluZGV4ID49IDQpCisgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gMDsKKyAgICAgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfREVGQVVMVF9LRVk7CisKKyAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworICAgICAgICBXZXBTdGF0ZSA9IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB6ZmlXbGFuUmVtb3ZlS2V5KGRldiwgMCwgaSk7CisgICAgICAgIFdlcFN0YXRlID0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQ7CisgICAgICAgIC8vemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX05PX1dFUCk7CisgICAgfQorCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgIHsKKyAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFdlcFN0YXRlKTsKKyAgICAgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIHpmaVdsYW5RdWVyeUZyZXF1ZW5jeShkZXYpLCBGQUxTRSk7CisgICAgICAgIC8vemZpV2xhblNldEVuY3J5TW9kZShkZXYsIHpmaVdsYW5RdWVyeUVuY3J5TW9kZShkZXYpKTsKKyAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzUwXTsKKyAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsIHdwYWllLCAmd3BhaWVMZW4pOworICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgIC8vaWYgKHdwYWllTGVuID4gMikKKyAgICAgICAgLy8gICAgemZpV2xhblNldFdwYUllKGRldiwgd3BhaWUsIHdwYWllTGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBFbmNyeXB0aW9uTW9kZTsKKyAgICB1OF90IGtleUxlbiA9IDA7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgRW5jcnlwdGlvbk1vZGUgPSB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoZGV2KTsKKworICAgIGlmIChFbmNyeXB0aW9uTW9kZSkKKyAgICB7CisgICAgICAgIGVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKyAgICB9CisKKy8qIFdlIGNhbid0IHJldHVybiB0aGUga2V5LCBzbyBzZXQgdGhlIHByb3BlciBmbGFnIGFuZCByZXR1cm4gemVybyAqLworICAgIGVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworICAgIG1lbXNldChrZXksIDAsIDE2KTsKKworLyogQ29weSB0aGUga2V5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworICAgIHN3aXRjaChFbmNyeXB0aW9uTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICAgICAga2V5TGVuID0gMTM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICBrZXlMZW4gPSAyOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgICAgIGtleUxlbiA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fVEtJUDoKKyAgICAgICAgICAgIGtleUxlbiA9IDMyOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9DRU5DOgorICAgICAgICAgICAga2V5TGVuID0gMzI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fTk9fV0VQOgorICAgICAgICAgICAga2V5TGVuID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGtleUxlbiA9IDA7CisgICAgICAgICAgICBwcmludGsoIlVua25vd24gRW5jcnlNb2RlXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorICAgIGVycS0+bGVuZ3RoID0ga2V5TGVuOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90IFBTTW9kZTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZnJxLT5kaXNhYmxlZCkKKyAgICAgICAgUFNNb2RlID0gWk1fU1RBX1BTX05PTkU7CisgICAgZWxzZQorICAgICAgICBQU01vZGUgPSBaTV9TVEFfUFNfTUFYOworCisgICAgemZpV2xhblNldFBvd2VyU2F2ZU1vZGUoZGV2LFBTTW9kZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpCit7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZiAoemZpV2xhblF1ZXJ5UG93ZXJTYXZlTW9kZShkZXYpID09IFpNX1NUQV9QU19OT05FKQorICAgICAgICBmcnEtPmRpc2FibGVkID0gMTsKKyAgICBlbHNlCisgICAgICAgIGZycS0+ZGlzYWJsZWQgPSAwOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLy9pbnQgdXNiZHJ2d2V4dF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorLy8JCSAgIAkgdm9pZCAqdywgY2hhciAqZXh0cmEpCisvL3sKKy8vCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGRldi0+bWxfcHJpdjsKKy8vCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0gdmFwLT5pdl9pYzsKKy8vCXN0cnVjdCBpZWVlODAyMTFfcnNucGFybXMgKnJzbiA9ICZ2YXAtPml2X2Jzcy0+bmlfcnNuOworLy8JaW50ICppID0gKGludCAqKSBleHRyYTsKKy8vCWludCBwYXJhbSA9IGlbMF07CQkvKiBwYXJhbWV0ZXIgaWQgaXMgMXN0ICovCisvLwlpbnQgdmFsdWUgPSBpWzFdOwkJLyogTkI6IG1vc3QgdmFsdWVzIGFyZSBUWVBFX0lOVCAqLworLy8JaW50IHJldHYgPSAwOworLy8JaW50IGosIGNhcHM7CisvLwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0b3IgKmF1dGg7CisvLwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2FjbGF0b3IgKmFjbDsKKy8vCisvLwlzd2l0Y2ggKHBhcmFtKSB7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9BVVRITU9ERToKKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9XUEE6CS8qIFdQQSAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfODAyMVg6CS8qIDgwMi4xeCAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfT1BFTjoJLyogb3BlbiAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfU0hBUkVEOgkvKiBzaGFyZWQta2V5ICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9BVVRPOgkvKiBhdXRvICovCisvLwkJCWF1dGggPSBpZWVlODAyMTFfYXV0aGVudGljYXRvcl9nZXQodmFsdWUpOworLy8JCQlpZiAoYXV0aCA9PSBOVUxMKQorLy8JCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCWJyZWFrOworLy8JCWRlZmF1bHQ6CisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCX0KKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9XUEE6CS8qIFdQQSB3LyA4MDIuMXggKi8KKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QUklWQUNZOworLy8JCQl2YWx1ZSA9IElFRUU4MDIxMV9BVVRIXzgwMjFYOworLy8JCQlicmVhazsKKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX09QRU46CS8qIG9wZW4gKi8KKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+KElFRUU4MDIxMV9GX1dQQXxJRUVFODAyMTFfRl9QUklWQUNZKTsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9TSEFSRUQ6CS8qIHNoYXJlZC1rZXkgKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX0FVVE86CS8qIGF1dG8gKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIXzgwMjFYOgkvKiA4MDIuMXggKi8KKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfV1BBOworLy8JCQkvKiBib3RoIHJlcXVpcmUgYSBrZXkgc28gbWFyayB0aGUgUFJJVkFDWSBjYXBhYmlsaXR5ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfUFJJVkFDWTsKKy8vCQkJYnJlYWs7CisvLwkJfQorLy8JCS8qIE5COiBhdXRoZW50aWNhdG9yIGF0dGFjaC9kZXRhY2ggaGFwcGVucyBvbiBzdGF0ZSBjaGFuZ2UgKi8KKy8vCQl2YXAtPml2X2Jzcy0+bmlfYXV0aG1vZGUgPSB2YWx1ZTsKKy8vCQkvKiBYWFggbWl4ZWQvbW9kZS91c2FnZT8gKi8KKy8vCQl2YXAtPml2X2F1dGggPSBhdXRoOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QUk9UTU9ERToKKy8vCQlpZiAodmFsdWUgPiBJRUVFODAyMTFfUFJPVF9SVFNDVFMpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWljLT5pY19wcm90bW9kZSA9IHZhbHVlOworLy8JCS8qIE5COiBpZiBub3Qgb3BlcmF0aW5nIGluIDExZyB0aGlzIGNhbiB3YWl0ICovCisvLwkJaWYgKGljLT5pY19ic3NjaGFuICE9IElFRUU4MDIxMV9DSEFOX0FOWUMgJiYKKy8vCQkgICAgSUVFRTgwMjExX0lTX0NIQU5fQU5ZRyhpYy0+aWNfYnNzY2hhbikpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQ0FTVENJUEhFUjoKKy8vCQlpZiAoKHZhcC0+aXZfY2FwcyAmIGNpcGhlcjJjYXAodmFsdWUpKSA9PSAwICYmCisvLwkJICAgICFpZWVlODAyMTFfY3J5cHRvX2F2YWlsYWJsZSh2YWx1ZSkpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCXJzbi0+cnNuX21jYXN0Y2lwaGVyID0gdmFsdWU7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQ0FTVEtFWUxFTjoKKy8vCQlpZiAoISgwIDwgdmFsdWUgJiYgdmFsdWUgPCBJRUVFODAyMTFfS0VZQlVGX1NJWkUpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkvKiBYWFggbm8gd2F5IHRvIHZlcmlmeSBkcml2ZXIgY2FwYWJpbGl0eSAqLworLy8JCXJzbi0+cnNuX21jYXN0a2V5bGVuID0gdmFsdWU7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQ0FTVENJUEhFUlM6CisvLwkJLyoKKy8vCQkgKiBDb252ZXJ0IGNpcGhlciBzZXQgdG8gZXF1aXZhbGVudCBjYXBhYmlsaXRpZXMuCisvLwkJICogTkI6IHRoaXMgbG9naWMgaW50ZW50aW9uYWxseSBpZ25vcmVzIHVua25vd24gYW5kCisvLwkJICogdW5zdXBwb3J0ZWQgY2lwaGVycyBzbyBmb2xrcyBjYW4gc3BlY2lmeSAweGZmIG9yCisvLwkJICogc2ltaWxhciBhbmQgZ2V0IGFsbCBhdmFpbGFibGUgY2lwaGVycy4KKy8vCQkgKi8KKy8vCQljYXBzID0gMDsKKy8vCQlmb3IgKGogPSAxOyBqIDwgMzI7IGorKykJLyogTkI6IHNraXAgV0VQICovCisvLwkJCWlmICgodmFsdWUgJiAoMTw8aikpICYmCisvLwkJCSAgICAoKHZhcC0+aXZfY2FwcyAmIGNpcGhlcjJjYXAoaikpIHx8CisvLwkJCSAgICAgaWVlZTgwMjExX2NyeXB0b19hdmFpbGFibGUoaikpKQorLy8JCQkJY2FwcyB8PSAxPDxqOworLy8JCWlmIChjYXBzID09IDApCQkJLyogbm90aGluZyBhdmFpbGFibGUgKi8KKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJLyogWFhYIHZlcmlmeSBjaXBoZXJzIG9rIGZvciB1bmljYXN0IHVzZT8gKi8KKy8vCQkvKiBYWFggZGlzYWxsb3cgaWYgcnVubmluZyBhcyBpdCdsbCBoYXZlIG5vIGVmZmVjdCAqLworLy8JCXJzbi0+cnNuX3VjYXN0Y2lwaGVyc2V0ID0gY2FwczsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1VDQVNUQ0lQSEVSOgorLy8JCWlmICgocnNuLT5yc25fdWNhc3RjaXBoZXJzZXQgJiBjaXBoZXIyY2FwKHZhbHVlKSkgPT0gMCkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJcnNuLT5yc25fdWNhc3RjaXBoZXIgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1VDQVNUS0VZTEVOOgorLy8JCWlmICghKDAgPCB2YWx1ZSAmJiB2YWx1ZSA8IElFRUU4MDIxMV9LRVlCVUZfU0laRSkpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCBubyB3YXkgdG8gdmVyaWZ5IGRyaXZlciBjYXBhYmlsaXR5ICovCisvLwkJcnNuLT5yc25fdWNhc3RrZXlsZW4gPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0tFWU1HVEFMR1M6CisvLwkJLyogWFhYIGNoZWNrICovCisvLwkJcnNuLT5yc25fa2V5bWdtdHNldCA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUlNOQ0FQUzoKKy8vCQkvKiBYWFggY2hlY2sgKi8KKy8vCQlyc24tPnJzbl9jYXBzID0gdmFsdWU7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9XUEE6CisvLwkJaWYgKHZhbHVlID4gMykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJLyogWFhYIHZlcmlmeSBjaXBoZXJzIGF2YWlsYWJsZSAqLworLy8JCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1dQQTsKKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJY2FzZSAxOgorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dQQTE7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgMjoKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9XUEEyOworLy8JCQlicmVhazsKKy8vCQljYXNlIDM6CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV1BBMSB8IElFRUU4MDIxMV9GX1dQQTI7CisvLwkJCWJyZWFrOworLy8JCX0KKy8vCQlyZXR2ID0gRU5FVFJFU0VUOwkJLyogWFhYPyAqLworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTUlORzoKKy8vCQlpZiAoIShJRUVFODAyMTFfUk9BTUlOR19ERVZJQ0UgPD0gdmFsdWUgJiYKKy8vCQkgICAgdmFsdWUgPD0gSUVFRTgwMjExX1JPQU1JTkdfTUFOVUFMKSkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWMtPmljX3JvYW1pbmcgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BSSVZBQ1k6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCS8qIFhYWCBjaGVjayBmb3Iga2V5IHN0YXRlPyAqLworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1BSSVZBQ1k7CisvLwkJfSBlbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1BSSVZBQ1k7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9EUk9QVU5FTkNSWVBURUQ6CisvLwkJaWYgKHZhbHVlKQorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX0RST1BVTkVOQzsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0RST1BVTkVOQzsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NPVU5URVJNRUFTVVJFUzoKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWYgKCh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKSA9PSAwKQorLy8JCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfQ09VTlRFUk07CisvLwkJfSBlbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0NPVU5URVJNOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRFJJVkVSX0NBUFM6CisvLwkJdmFwLT5pdl9jYXBzID0gdmFsdWU7CQkvKiBOQjogZm9yIHRlc3RpbmcgKi8KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX01BQ0NNRDoKKy8vCQlhY2wgPSB2YXAtPml2X2FjbDsKKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9PUEVOOgorLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9QT0xJQ1lfQUxMT1c6CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX1BPTElDWV9ERU5ZOgorLy8JCQlpZiAoYWNsID09IE5VTEwpIHsKKy8vCQkJCWFjbCA9IGllZWU4MDIxMV9hY2xhdG9yX2dldCgibWFjIik7CisvLwkJCQlpZiAoYWNsID09IE5VTEwgfHwgIWFjbC0+aWFjX2F0dGFjaCh2YXApKQorLy8JCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQkJdmFwLT5pdl9hY2wgPSBhY2w7CisvLwkJCX0KKy8vCQkJYWNsLT5pYWNfc2V0cG9saWN5KHZhcCwgdmFsdWUpOworLy8JCQlicmVhazsKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfRkxVU0g6CisvLwkJCWlmIChhY2wgIT0gTlVMTCkKKy8vCQkJCWFjbC0+aWFjX2ZsdXNoKHZhcCk7CisvLwkJCS8qIE5COiBzaWxlbnRseSBpZ25vcmUgd2hlbiBub3QgaW4gdXNlICovCisvLwkJCWJyZWFrOworLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9ERVRBQ0g6CisvLwkJCWlmIChhY2wgIT0gTlVMTCkgeworLy8JCQkJdmFwLT5pdl9hY2wgPSBOVUxMOworLy8JCQkJYWNsLT5pYWNfZGV0YWNoKHZhcCk7CisvLwkJCX0KKy8vCQkJYnJlYWs7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fV01NOgorLy8JCWlmIChpYy0+aWNfY2FwcyAmIElFRUU4MDIxMV9DX1dNRSl7CisvLwkJCWlmICh2YWx1ZSkgeworLy8JCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9XTUU7CisvLwkJCQl2YXAtPml2X2ljLT5pY19mbGFncyB8PSBJRUVFODAyMTFfRl9XTUU7IC8qIFhYWCBuZWVkZWQgYnkgaWNfcmVzZXQgKi8KKy8vCQkJfQorLy8JCQllbHNlIHsKKy8vCQkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1dNRTsKKy8vCQkJCXZhcC0+aXZfaWMtPmljX2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XTUU7IC8qIFhYWCBuZWVkZWQgYnkgaWNfcmVzZXQgKi8KKy8vCQkJfQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOwkvKiBSZW5lZ290aWF0ZSBmb3IgY2FwYWJpbGl0aWVzICovCisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSElERVNTSUQ6CisvLwkJaWYgKHZhbHVlKQorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX0hJREVTU0lEOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfSElERVNTSUQ7CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0FQQlJJREdFOgorLy8JCWlmICh2YWx1ZSA9PSAwKQorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX05PQlJJREdFOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfTk9CUklER0U7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9JTkFDVDoKKy8vCQl2YXAtPml2X2luYWN0X3J1biA9IHZhbHVlIC8gSUVFRTgwMjExX0lOQUNUX1dBSVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9JTkFDVF9BVVRIOgorLy8JCXZhcC0+aXZfaW5hY3RfYXV0aCA9IHZhbHVlIC8gSUVFRTgwMjExX0lOQUNUX1dBSVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9JTkFDVF9JTklUOgorLy8JCXZhcC0+aXZfaW5hY3RfaW5pdCA9IHZhbHVlIC8gSUVFRTgwMjExX0lOQUNUX1dBSVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9BQk9MVDoKKy8vCQljYXBzID0gMDsKKy8vCQkvKgorLy8JCSAqIE1hcCBhYm9sdCBzZXR0aW5ncyB0byBjYXBhYmlsaXR5IGJpdHM7CisvLwkJICogdGhpcyBhbHNvIHN0cmlwcyB1bmtub3duL3Vud2FudGVkIGJpdHMuCisvLwkJICovCisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX1RVUkJPX1BSSU1FKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX1RVUkJPUDsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfQ09NUFJFU1NJT04pCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfQ09NUDsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfRkFTVF9GUkFNRSkKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19GRjsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfWFIpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfWFI7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0FSKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX0FSOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9CVVJTVCkKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19CVVJTVDsKKy8vICAgICAgICBpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfV01FX0VMRSkKKy8vICAgICAgICAgICAgY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19XTUU7CisvLwkJLyogdmVyaWZ5IHJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgYXJlIHN1cHBvcnRlZCAqLworLy8JCWlmICgoY2FwcyAmIGljLT5pY19hdGhfY2FwKSAhPSBjYXBzKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpZiAodmFwLT5pdl9hdGhfY2FwICE9IGNhcHMpIHsKKy8vCQkJaWYgKCh2YXAtPml2X2F0aF9jYXAgXiBjYXBzKSAmIElFRUU4MDIxMV9BVEhDX1RVUkJPUCkgeworLy8JCQkJaWYgKGllZWU4MDIxMV9zZXRfdHVyYm8oZGV2LCAgY2FwcyAmIElFRUU4MDIxMV9BVEhDX1RVUkJPUCkpCisvLwkJCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJCQlpZWVlODAyMTFfc2Nhbl9mbHVzaChpYyk7CisvLwkJCX0KKy8vCQkJdmFwLT5pdl9hdGhfY2FwID0gY2FwczsKKy8vCQkJaWMtPmljX2F0aGNhcHNldHVwKHZhcC0+aXZfaWMsIHZhcC0+aXZfYXRoX2NhcCk7CisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRFRJTV9QRVJJT0Q6CisvLwkJaWYgKHZhcC0+aXZfb3Btb2RlICE9IElFRUU4MDIxMV9NX0hPU1RBUCAmJgorLy8JCSAgICB2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9JQlNTKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpZiAoSUVFRTgwMjExX0RUSU1fTUlOIDw9IHZhbHVlICYmCisvLwkJICAgIHZhbHVlIDw9IElFRUU4MDIxMV9EVElNX01BWCkgeworLy8JCQl2YXAtPml2X2R0aW1fcGVyaW9kID0gdmFsdWU7CisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CQkvKiByZXF1aXJlcyByZXN0YXJ0ICovCisvLwkJfSBlbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9CRUFDT05fSU5URVJWQUw6CisvLwkJaWYgKHZhcC0+aXZfb3Btb2RlICE9IElFRUU4MDIxMV9NX0hPU1RBUCAmJgorLy8JCSAgICB2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9JQlNTKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpZiAoSUVFRTgwMjExX0JJTlRWQUxfTUlOIDw9IHZhbHVlICYmCisvLwkJICAgIHZhbHVlIDw9IElFRUU4MDIxMV9CSU5UVkFMX01BWCkgeworLy8JCQlpYy0+aWNfbGludHZhbCA9IHZhbHVlOwkJLyogWFhYIG11bHRpLWJzcyAqLworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOwkJLyogcmVxdWlyZXMgcmVzdGFydCAqLworLy8JCX0gZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRE9USDoKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWMtPmljX2ZsYWdzIHw9IElFRUU4MDIxMV9GX0RPVEg7CisvLwkJfQorLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzICY9IH5JRUVFODAyMTFfRl9ET1RIOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CS8qIFhYWDogbmVlZCBzb21ldGhpbmcgdGhpcyBkcmFzdGljPyAqLworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFdSVEFSR0VUOgorLy8JCWljLT5pY19jdXJjaGFubWF4cHdyID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9HRU5SRUFTU09DOgorLy8JCUlFRUU4MDIxMV9TRU5EX01HTVQodmFwLT5pdl9ic3MsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9SRUFTU09DX1JFUSwgMCk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DT01QUkVTU0lPTjoKKy8vCQlyZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX0NPTVAsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vICAgIGNhc2UgSUVFRTgwMjExX1BBUkFNX1dNTV9BR0dSTU9ERToKKy8vICAgICAgICByZXR2ID0gaWVlZTgwMjExX3NldGF0aGNhcCh2YXAsIElFRUU4MDIxMV9BVEhDX1dNRSwgdmFsdWUpOworLy8gICAgICAgIGJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRkY6CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19GRiwgdmFsdWUpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVFVSQk86CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19UVVJCT1AsIHZhbHVlKTsKKy8vCQlpZiAocmV0diA9PSBFTkVUUkVTRVQpIHsKKy8vCQkJaWYoaWVlZTgwMjExX3NldF90dXJibyhkZXYsdmFsdWUpKQorLy8JCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQlpZWVlODAyMTFfc2Nhbl9mbHVzaChpYyk7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fWFI6CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19YUiwgdmFsdWUpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQlVSU1Q6CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19CVVJTVCwgdmFsdWUpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQVI6CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19BUiwgdmFsdWUpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFVSRUc6CisvLwkJaWYgKHZhbHVlKQorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1BVUkVHOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFncyAmPSB+SUVFRTgwMjExX0ZfUFVSRUc7CisvLwkJLyogTkI6IHJlc2V0IG9ubHkgaWYgd2UncmUgb3BlcmF0aW5nIG9uIGFuIDExZyBjaGFubmVsICovCisvLwkJaWYgKGljLT5pY19ic3NjaGFuICE9IElFRUU4MDIxMV9DSEFOX0FOWUMgJiYKKy8vCQkgICAgSUVFRTgwMjExX0lTX0NIQU5fQU5ZRyhpYy0+aWNfYnNzY2hhbikpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9XRFM6CisvLwkJaWYgKHZhbHVlKQorLy8JCQl2YXAtPml2X2ZsYWdzX2V4dCB8PSBJRUVFODAyMTFfRkVYVF9XRFM7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfV0RTOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkdTQ0FOOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQlpZiAoKHZhcC0+aXZfY2FwcyAmIElFRUU4MDIxMV9DX0JHU0NBTikgPT0gMCkKKy8vCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX0JHU0NBTjsKKy8vCQl9IGVsc2UgeworLy8JCQkvKiBYWFggcmFjZXk/ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0JHU0NBTjsKKy8vCQkJaWVlZTgwMjExX2NhbmNlbF9zY2FuKHZhcCk7CS8qIGFueXRoaW5nIGN1cnJlbnQgKi8KKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9CR1NDQU5fSURMRToKKy8vCQlpZiAodmFsdWUgPj0gSUVFRTgwMjExX0JHU0NBTl9JRExFX01JTikKKy8vCQkJdmFwLT5pdl9iZ3NjYW5pZGxlID0gdmFsdWUqSFovMTAwMDsKKy8vCQllbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9CR1NDQU5fSU5URVJWQUw6CisvLwkJaWYgKHZhbHVlID49IElFRUU4MDIxMV9CR1NDQU5fSU5UVkFMX01JTikKKy8vCQkJdmFwLT5pdl9iZ3NjYW5pbnR2bCA9IHZhbHVlKkhaOworLy8JCWVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX01DQVNUX1JBVEU6CisvLwkJLyogdW5pdHMgYXJlIGluIEtJTE9iaXRzIHBlciBzZWNvbmQgKi8KKy8vCQlpZiAodmFsdWUgPj0gMjU2ICYmIHZhbHVlIDw9IDU0MDAwKQorLy8JCQl2YXAtPml2X21jYXN0X3JhdGUgPSB2YWx1ZTsKKy8vCQllbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DT1ZFUkFHRV9DTEFTUzoKKy8vCQlpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBJRUVFODAyMTFfQ09WRVJBR0VfQ0xBU1NfTUFYKSB7CisvLwkJCWljLT5pY19jb3ZlcmFnZWNsYXNzID0gdmFsdWU7CisvLwkJCWlmIChJU19VUF9BVVRPKHZhcCkpCisvLwkJCQlpZWVlODAyMTFfbmV3X3N0YXRlKHZhcCwgSUVFRTgwMjExX1NfU0NBTiwgMCk7CisvLwkJCXJldHYgPSAwOworLy8JCX0KKy8vCQllbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DT1VOVFJZX0lFOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCB8PSBJRUVFODAyMTFfRkVYVF9DT1VOVFJZSUU7CisvLwkJZWxzZQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9DT1VOVFJZSUU7CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JFR0NMQVNTOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCB8PSBJRUVFODAyMTFfRkVYVF9SRUdDTEFTUzsKKy8vCQllbHNlCisvLwkJCWljLT5pY19mbGFnc19leHQgJj0gfklFRUU4MDIxMV9GRVhUX1JFR0NMQVNTOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9TQ0FOVkFMSUQ6CisvLwkJdmFwLT5pdl9zY2FudmFsaWQgPSB2YWx1ZSpIWjsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUlNTSV8xMUE6CisvLwkJdmFwLT5pdl9yb2FtLnJzc2kxMWEgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUlNTSV8xMUI6CisvLwkJdmFwLT5pdl9yb2FtLnJzc2kxMWJPbmx5ID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JTU0lfMTFHOgorLy8JCXZhcC0+aXZfcm9hbS5yc3NpMTFiID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JBVEVfMTFBOgorLy8JCXZhcC0+aXZfcm9hbS5yYXRlMTFhID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JBVEVfMTFCOgorLy8JCXZhcC0+aXZfcm9hbS5yYXRlMTFiT25seSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SQVRFXzExRzoKKy8vCQl2YXAtPml2X3JvYW0ucmF0ZTExYiA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVUFQU0RJTkZPOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSA9PSBJRUVFODAyMTFfTV9IT1NUQVApIHsKKy8vCQkJaWYgKGljLT5pY19jYXBzICYgSUVFRTgwMjExX0NfVUFQU0QpIHsKKy8vCQkJCWlmICh2YWx1ZSkKKy8vCQkJCQlJRUVFODAyMTFfVkFQX1VBUFNEX0VOQUJMRSh2YXApOworLy8JCQkJZWxzZQorLy8JCQkJCUlFRUU4MDIxMV9WQVBfVUFQU0RfRElTQUJMRSh2YXApOworLy8JCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQkJfQorLy8JCX0KKy8vCQllbHNlIGlmICh2YXAtPml2X29wbW9kZSA9PSBJRUVFODAyMTFfTV9TVEEpIHsKKy8vCQkJdmFwLT5pdl91YXBzZGluZm8gPSB2YWx1ZTsKKy8vCQkJSUVFRTgwMjExX1ZBUF9VQVBTRF9FTkFCTEUodmFwKTsKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9TTEVFUDoKKy8vCQkvKiBYWFg6IEZvcmNlZCBzbGVlcCBmb3IgdGVzdGluZy4gRG9lcyBub3QgYWN0dWFsbHkgcGxhY2UgdGhlCisvLwkJICogICAgICBIVyBpbiBzbGVlcCBtb2RlIHlldC4gdGhpcyBvbmx5IG1ha2VzIHNlbnNlIGZvciBTVEFzLgorLy8JCSAqLworLy8JCWlmICh2YWx1ZSkgeworLy8JCQkvKiBnb3RvIHNsZWVwICovCisvLwkJCUlFRUU4MDIxMV9WQVBfR09UT1NMRUVQKHZhcCk7CisvLwkJfQorLy8JCWVsc2UgeworLy8JCQkvKiB3YWtldXAgKi8KKy8vCQkJSUVFRTgwMjExX1ZBUF9XQUtFVVAodmFwKTsKKy8vCQl9CisvLwkJaWVlZTgwMjExX3NlbmRfbnVsbGRhdGEoaWVlZTgwMjExX3JlZl9ub2RlKHZhcC0+aXZfYnNzKSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9RT1NOVUxMOgorLy8JCS8qIEZvcmNlIGEgUW9TIE51bGwgZm9yIHRlc3RpbmcuICovCisvLwkJaWVlZTgwMjExX3NlbmRfcW9zbnVsbGRhdGEodmFwLT5pdl9ic3MsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BTUE9MTDoKKy8vCQkvKiBGb3JjZSBhIFBTLVBPTEwgZm9yIHRlc3RpbmcuICovCisvLwkJaWVlZTgwMjExX3NlbmRfcHNwb2xsKHZhcC0+aXZfYnNzKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0VPU1BEUk9QOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSA9PSBJRUVFODAyMTFfTV9IT1NUQVApIHsKKy8vCQkJaWYgKHZhbHVlKSBJRUVFODAyMTFfVkFQX0VPU1BEUk9QX0VOQUJMRSh2YXApOworLy8JCQllbHNlIElFRUU4MDIxMV9WQVBfRU9TUERST1BfRElTQUJMRSh2YXApOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX01BUktERlM6CisvLwkJaWYgKHZhbHVlKQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0IHw9IElFRUU4MDIxMV9GRVhUX01BUktERlM7CisvLwkJZWxzZQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9NQVJLREZTOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ0hBTkJXOgorLy8JCXN3aXRjaCAodmFsdWUpIHsKKy8vCQkJY2FzZSAwOgorLy8JCQkJaWMtPmljX2NoYW5id2ZsYWcgPSAwOworLy8JCQkJYnJlYWs7CisvLwkJCWNhc2UgMToKKy8vCQkJCWljLT5pY19jaGFuYndmbGFnID0gSUVFRTgwMjExX0NIQU5fSEFMRjsKKy8vCQkJCWJyZWFrOworLy8JCQljYXNlIDI6CisvLwkJCQlpYy0+aWNfY2hhbmJ3ZmxhZyA9IElFRUU4MDIxMV9DSEFOX1FVQVJURVI7CisvLwkJCQlicmVhazsKKy8vCQkJZGVmYXVsdDoKKy8vCQkJCXJldHYgPSBFSU5WQUw7CisvLwkJCQlicmVhazsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9TSE9SVFBSRUFNQkxFOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQlpYy0+aWNfY2FwcyB8PSBJRUVFODAyMTFfQ19TSFBSRUFNQkxFOworLy8JCX0gZWxzZSB7CisvLwkJCWljLT5pY19jYXBzICY9IH5JRUVFODAyMTFfQ19TSFBSRUFNQkxFOworLy8JCX0KKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JZGVmYXVsdDoKKy8vCQlyZXR2ID0gRU9QTk9UU1VQUDsKKy8vCQlicmVhazsKKy8vCX0KKy8vCS8qIFhYWCBzaG91bGQgYW55IG9mIHRoZXNlIGNhdXNlIGEgcmVzY2FuPyAqLworLy8JaWYgKHJldHYgPT0gRU5FVFJFU0VUKQorLy8JCXJldHYgPSBJU19VUF9BVVRPKHZhcCkgPyBpZWVlODAyMTFfb3Blbih2YXAtPml2X2RldikgOiAwOworLy8JcmV0dXJuIC1yZXR2OworLy99CisKK2ludCB1c2JkcnZ3ZXh0X3NldG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2V0bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisJLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICp3cmkgPSAoc3RydWN0IGl3X3BvaW50ICopZXh0cmE7CisJY2hhciBtb2RlWzhdOworCisgICAgc3RyY3B5KG1vZGUsIjExZyIpOworCXJldHVybiAoY29weV90b191c2VyKHdyaS0+cG9pbnRlciwgbW9kZSwgNikgPyAtRUZBVUxUIDogMCk7Cit9CisKK2ludCB6ZkxueFByaXZhdGVJb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgemRhcF9pb2N0bCogemRyZXEpCit7CisJLy92b2lkKiByZWdwID0gbWFjcC0+cmVncDsKKwl1MTZfdCBjbWQ7CisJLy91MzJfdCB0ZW1wOworCXUzMl90KiBwOworCXUzMl90IGk7CisKKwljbWQgPSB6ZHJlcS0+Y21kOworCXN3aXRjaChjbWQpCisJeworCWNhc2UgWk1fSU9DVExfUkVHX1JFQUQ6CisJCXpmaURiZ1JlYWRSZWcoZGV2LCB6ZHJlcS0+YWRkcik7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9SRUdfV1JJVEU6CisJCXpmaURiZ1dyaXRlUmVnKGRldiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9NRU1fUkVBRDoKKwkJcCA9ICh1MzJfdCAqKSBidXNfdG9fdmlydCh6ZHJlcS0+YWRkcik7CisJCXByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnY6IHJlYWQgbWVtb3J5IGFkZHI6IDB4JTA4eCB2YWx1ZTogMHglMDh4XG4iLCB6ZHJlcS0+YWRkciwgKnApOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfTUVNX1dSSVRFOgorCQlwID0gKHUzMl90ICopIGJ1c190b192aXJ0KHpkcmVxLT5hZGRyKTsKKwkJKnAgPSB6ZHJlcS0+dmFsdWU7CisJCXByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnY6IHdyaXRlIHZhbHVlOiAweCUwOHggdG8gbWVtb3J5IGFkZHI6IDB4JTA4eFxuIiwgemRyZXEtPnZhbHVlLCB6ZHJlcS0+YWRkcik7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9UQUxMWSA6CisJCXpmaVdsYW5TaG93VGFsbHkoZGV2KTsKKwkJaWYgKHpkcmVxLT5hZGRyKQorCQkJemZpV2xhblJlc2V0VGFsbHkoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX1RFU1QgOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlpNX0lPQ1RMX1RFU1Q6bGVuPSVkXG4iLCB6ZHJlcS0+YWRkcik7CisgICAgICAgICAgICAvL3pmaVdsYW5SZWFkUmVnKGRldiwgMHgxMGY0MDApOworICAgICAgICAgICAgLy96ZmlXbGFuUmVhZFJlZyhkZXYsIDB4MTBmNDA0KTsKKyAgICAgICAgICAgIHByaW50aygiSU9DVEwgVEVTVFxuIik7CisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgLy9wcmludCBwYWNrZXQKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHpkcmVxLT5hZGRyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChpJjB4NykgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlMDJYICIsICh1bnNpZ25lZCBjaGFyKXpkcmVxLT5kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorCisKKyAgICAgICAgICAgICNpZiAwIC8vRm9yIFRlc3Q/PyAxIHRvIDAgYnkgQ1dZYW5nKC0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiogczsKKworICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgKi8KKyAgICAgICAgICAgIHMgPSBhbGxvY19za2IoMjAwMCwgR0ZQX0FUT01JQyk7CisKKyAgICAgICAgICAgIC8qIENvcHkgZGF0YSB0byBza2IgKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHpkcmVxLT5hZGRyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+ZGF0YVtpXSA9IHpkcmVxLT5kYXRhW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bGVuID0gemRyZXEtPmFkZHI7CisKKyAgICAgICAgICAgIC8qIENhbGwgemZJZGxSZWN2KCkgKi8KKyAgICAgICAgICAgIHpmaVJlY3Y4MDIxMShkZXYsIHMsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGJyZWFrOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogWkRDT05GSUcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjYXNlIFpNX0lPQ1RMX0ZSQUcgOgorICAgICAgICAgICAgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoZGV2LCB6ZHJlcS0+YWRkcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX1JUUyA6CisgICAgICAgICAgICB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKGRldiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9TQ0FOIDoKKyAgICAgICAgICAgIHpmaVdsYW5TY2FuKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX0tFWSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBrZXlbMjldOworICAgICAgICAgICAgICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICAgICAgICAgICAgICB1MzJfdCBpOworCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8Mjk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8emRyZXEtPmFkZHI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleVtpXSA9IHpkcmVxLT5kYXRhW2ldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaW50aygia2V5IGxlbj0lZCwga2V5PSUwMnglMDJ4JTAyeCUwMnglMDJ4Li4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgemRyZXEtPmFkZHIsIGtleVswXSwga2V5WzFdLCBrZXlbMl0sIGtleVszXSwga2V5WzRdKTsKKworICAgICAgICAgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gemRyZXEtPmFkZHI7CisgICAgICAgICAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IDA7CisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnID0gMDsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleSA9IGtleTsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX1JBVEUgOgorICAgICAgICAgICAgemZpV2xhblNldFR4UmF0ZShkZXYsIHpkcmVxLT5hZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCB6ZHJlcS0+YWRkcik7CisKKyAgICAgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QgYnVmZmVyWzJdOworICAgICAgICAgICAgICAgIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oZGV2LCAmYnVmZmVyWzBdKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIkN1cnJlbnQgU2lnbmFsIFN0cmVuZ3RoIDogJTAyZFxuIiwgYnVmZmVyWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICBjYXNlIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGJ1ZmZlclsyXTsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlTaWduYWxJbmZvKGRldiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJDdXJyZW50IFNpZ25hbCBRdWFsaXR5IDogJTAyZFxuIiwgYnVmZmVyWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERToKKwkJaWYgKHpkcmVxLT5hZGRyID09IDEpCisJCQl6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX1BTRVVETyk7CisJCWVsc2UKKwkJCXpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpOworCisJCXpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisJCXpmaVdsYW5FbmFibGUoZGV2KTsKKworCQlicmVhazsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogWkRDT05GSUcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGVmYXVsdCA6CisJCXByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBlcnJvciBjb21tYW5kID0gJXhcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2X3dwYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICp6ZHBhcm0pCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdThfdCBiY19hZGRyWzZdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisgICAgdThfdCBtYWNfYWRkcls4MF07CisgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh6ZHBhcm0tPmNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgWkRfQ01EX1NFVF9FTkNSWVBUX0tFWToKKworICAgICAgICAgICAgLyogU2V0IHVwIGtleSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSB6ZHBhcm0tPnUuY3J5cHQua2V5X2xlbjsKKyAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSB6ZHBhcm0tPnUuY3J5cHQuaWR4OworICAgICAgICAgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnID0gMDsKKyAgICAgICAgICAgIGtleUluZm8ua2V5ID0gemRwYXJtLT51LmNyeXB0LmtleTsKKyAgICAgICAgICAgIGtleUluZm8uaW5pdEl2ID0gemRwYXJtLT51LmNyeXB0LnNlcTsKKyAgICAgICAgICAgIGtleUluZm8ubWFjQWRkciA9ICh1MTZfdCAqKXpkcGFybS0+c3RhX2FkZHI7CisKKyAgICAgICAgICAgIC8qIElkZW50aWZ5IHRoZSBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKG1lbWNtcCh6ZHBhcm0tPnN0YV9hZGRyLCBiY19hZGRyLCBzaXplb2YoYmNfYWRkcikpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnIHw9IFpNX0tFWV9GTEFHX0dLOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19QSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzdHJjbXAoemRwYXJtLT51LmNyeXB0LmFsZywgIk5PTkUiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3U4X3QgemVyb19tYWNbXT17MCwwLDAsMCwwLDB9OworCisgICAgICAgICAgICAgICAgLyogU2V0IGtleSBsZW5ndGggdG8gemVybyAqLworICAgICAgICAgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gMDsKKworICAgICAgICAgICAgICAgIGlmICh6ZHBhcm0tPnN0YV9hZGRyWzBdICYgMSkvL2RlbCBncm91cCBrZXkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1hY3AtPmNhcmRTZXR0aW5nLldQQUllTGVuPT0wKQorICAgICAgICAgICAgICAgICAgICAvL3svLzgwMi4xeCBkeW5hbWljIFdFUAorICAgICAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtUHJpdmFjeUludm9rZWRbMF09RkFMU0U7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1DYXBbMF0gJj0gfkNBUF9QUklWQUNZOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdPTA7CisgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAvL21XcGFCY0tleUxlbiA9IG1Ha0luc3RhbGxlZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKG1lbWNtcCh6ZXJvX21hYyx6ZHBhcm0tPnN0YV9hZGRyLCA2KT09MCkKKyAgICAgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF09MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgcFNldHRpbmctPkR5bktleU1vZGU9MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgcFNldHRpbmctPkVuY3J5TW9kZVswXT0wOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZT0wOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlNldCBFbmNyeXB0aW9uIFR5cGUgTk9ORVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoemRwYXJtLT51LmNyeXB0LmFsZywgIlRLSVAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fVEtJUCk7CisgICAgICAgICAgICAgICAgLy9MaW51eCBTdXBwbGljYW50IHdpbGwgaW52ZXJzZSBUeC9SeCBrZXkKKyAgICAgICAgICAgICAgICAvL1NvIHdlIGludmVyc2UgaXQgYmFjayAvL0NXWWFuZygrKQorICAgICAgICAgICAgICAgIC8vemZNZW1vcnlDb3B5KCZ0ZW1wWzBdLCAma2V5SW5mby5rZXlbMTZdLCA4KTsKKyAgICAgICAgICAgICAgICAvL3pmTWVtb3J5Q29weSgma2V5SW5mby5rZXlbMTZdLCBrZXlJbmZvLmtleVsyNF0sIDgpOworICAgICAgICAgICAgICAgIC8vemZNZW1vcnlDb3B5KCZrZXlJbmZvLmtleVsyNF0sICZ0ZW1wWzBdLCA4KTsKKyAgICAgICAgICAgICAgICAvL3U4X3QgdGVtcDsKKyAgICAgICAgICAgICAgICAvL2ludCBrOworICAgICAgICAgICAgICAgIC8vZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICB0ZW1wID0ga2V5SW5mby5rZXlbMTYgKyBrXTsKKyAgICAgICAgICAgICAgICAvLyAgICBrZXlJbmZvLmtleVsxNiArIGtdID0ga2V5SW5mby5rZXlbMjQgKyBrXTsKKyAgICAgICAgICAgICAgICAvLyAgICBrZXlJbmZvLmtleVsyNCArIGtdID0gdGVtcDsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAvL0NhbUVuY3J5VHlwZSA9IFpNX1RLSVA7CisgICAgICAgICAgICAgICAgLy8vL2lmIChpZHggPT0gMCkKKyAgICAgICAgICAgICAgICAvL3svLyBQYWlyd2lzZSBrZXkKKyAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdID0gQ2FtRW5jcnlUeXBlOworICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlID0gcFNldHRpbmctPkR5bktleU1vZGUgPSBEWU5fS0VZX1RLSVA7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJDQ01QIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX0FFUyk7CisgICAgICAgICAgICAgICAgLy9DYW1FbmNyeVR5cGUgPSBaTV9BRVM7CisgICAgICAgICAgICAgICAgLy8vL2lmIChpZHggPT0gMCkKKyAgICAgICAgICAgICAgICAvL3svLyBQYWlyd2lzZSBrZXkKKyAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdID0gQ2FtRW5jcnlUeXBlOworICAgICAgICAgICAgICAgIC8vICAgIG1EeW5LZXlNb2RlID0gcFNldHRpbmctPkR5bktleU1vZGUgPSBEWU5fS0VZX0FFUzsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoemRwYXJtLT51LmNyeXB0LmFsZywgIldFUCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSA1KQorICAgICAgICAgICAgICAgIHsgLy8gV0VQIDY0CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9XRVA2NCk7CisgICAgICAgICAgICAgICAgLy8gICAgQ2FtRW5jcnlUeXBlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAgICAgLy8gICAgdG1wRHluS2V5TW9kZT1EWU5fS0VZX1dFUDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAxMykKKyAgICAgICAgICAgICAgICB7Ly9rZXlsZW49MTMsIFdFUCAxMjgKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1dFUDEyOCk7CisgICAgICAgICAgICAgICAgLy8gICAgQ2FtRW5jcnlUeXBlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIC8vICAgIHRtcER5bktleU1vZGU9RFlOX0tFWV9XRVAxMjg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9XRVAyNTYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZvciBEeW5hbWljIFdFUCBrZXkgKE5vbi1XUEEgUmFkaXVzKSwgdGhlIGtleSBJRCByYW5nZTogMC0zCisgICAgICAgICAgICAgICAgLy8gSW4gV1BBL1JTTiBtb2RlLCB0aGUga2V5IElEIHJhbmdlOiAxLTMsIHVzdWFsbHksIGEgYnJvYWRjYXN0IGtleS4KKyAgICAgICAgICAgICAgICAvLyBGb3IgV0VQIGtleSBzZXR0aW5nOiB3ZSBzZXQgbUR5bktleU1vZGUgYW5kIG1LZXlGb3JtYXQgaW4gZm9sbG93aW5nIGNhc2U6CisgICAgICAgICAgICAgICAgLy8gICAxLiBGb3IgODAyLjF4IGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBXRVAga2V5IG1ldGhvZC4KKyAgICAgICAgICAgICAgICAvLyAgIDIuIEZvciBXUEEvUlNOIG1vZGUsIGJ1dCBrZXkgaWQgPT0gMC4gKEJ1dCB0aGlzIGlzIGFuIGltcG9zc2libGUgY2FzZSkKKyAgICAgICAgICAgICAgICAvLyBTbywgb25seSBjaGVjayBjYXNlIDEuCisgICAgICAgICAgICAgICAgLy9pZiAobWFjcC0+Y2FyZFNldHRpbmcuV1BBSWVMZW49PTApCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IENhbUVuY3J5VHlwZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IHBTZXR0aW5nLT5EeW5LZXlNb2RlID0gdG1wRHluS2V5TW9kZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtUHJpdmFjeUludm9rZWRbMF09VFJVRTsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdIHw9IENBUF9QUklWQUNZOworICAgICAgICAgICAgICAgIC8vICAgIG1hY3AtPmNhcmRTZXR0aW5nLkVuY3J5T25PZmZbMF09MTsKKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRFVNUCBrZXkgY29udGV4dCAqLworLy8jaWZkZWYgV1BBX0RFQlVHCisgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaTsKKyAgICAgICAgICAgICAgICBwcmludGsoIk90dXM6IEtleSBDb250ZXh0OlxuIik7CisgICAgICAgICAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBrZXlJbmZvLmtleUxlbmd0aDspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIjB4JTAyeCAiLCBrZXlJbmZvLmtleVtpaV0pOworICAgICAgICAgICAgICAgICAgICBpZigoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICB9CisvLyNlbmRpZgorCisgICAgICAgICAgICAvKiBTZXQgZW5jcnlwdCBtb2RlICovCisgICAgICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBDYW1FbmNyeVR5cGUpOworICAgICAgICAgICAgdmFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisgICAgICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgICAgIGtleUluZm8udmFwSWQgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGtleUluZm8udmFwSWQgPSB2YXBJZCArIDE7CisgICAgICAgICAgICBrZXlJbmZvLnZhcEFkZHJbMF0gPSBrZXlJbmZvLm1hY0FkZHJbMF07CisgICAgICAgICAgICBrZXlJbmZvLnZhcEFkZHJbMV0gPSBrZXlJbmZvLm1hY0FkZHJbMV07CisgICAgICAgICAgICBrZXlJbmZvLnZhcEFkZHJbMl0gPSBrZXlJbmZvLm1hY0FkZHJbMl07CisKKyAgICAgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKworICAgICAgICAgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYpOworICAgICAgICAgICAgLy96ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0NNRF9TRVRfTUxNRToKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bDogWkRfQ01EX1NFVF9NTE1FXG4iKTsKKworICAgICAgICAgICAgLyogVHJhbnNsYXRlIFNUQSdzIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHNwcmludGYobWFjX2FkZHIsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIHpkcGFybS0+c3RhX2FkZHJbMF0sIHpkcGFybS0+c3RhX2FkZHJbMV0sCisgICAgICAgICAgICAgICAgemRwYXJtLT5zdGFfYWRkclsyXSwgemRwYXJtLT5zdGFfYWRkclszXSwgemRwYXJtLT5zdGFfYWRkcls0XSwgemRwYXJtLT5zdGFfYWRkcls1XSk7CisKKyAgICAgICAgICAgIHN3aXRjaCh6ZHBhcm0tPnUubWxtZS5jbWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBNTE1FX1NUQV9ERUFVVEg6CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiIC0tLS0tLS1DYWxsIHpmaVdsYW5EZWF1dGgsIHJlYXNvbjolZFxuIix6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHpmaVdsYW5EZWF1dGgoZGV2LCAodTE2X3QqKSB6ZHBhcm0tPnN0YV9hZGRyLCB6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZGVhdXRoZW5jYXRlIFNUQTogJXNcbiIsIG1hY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJEZWF1dGhlbnRpY2F0ZSBTVEE6ICVzIHdpdGggcmVhc29uIGNvZGU6ICVkXG4iLCBtYWNfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTUxNRV9TVEFfRElTQVNTT0M6CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiIC0tLS0tLS1DYWxsIHpmaVdsYW5EZWF1dGgsIHJlYXNvbjolZFxuIix6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHpmaVdsYW5EZWF1dGgoZGV2LCAodTE2X3QqKSB6ZHBhcm0tPnN0YV9hZGRyLCB6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZGlzYXNzb2NpYXRlIFNUQTogJXNcbiIsIG1hY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJEaXNhc3NvY2lhdGUgU1RBOiAlcyB3aXRoIHJlYXNvbiBjb2RlOiAlZFxuIiwgbWFjX2FkZHIsIHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk1MTUUgY29tbWFuZDogMHglMDR4IG5vdCBzdXBwb3J0XG4iLCB6ZHBhcm0tPnUubWxtZS5jbWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9DTURfU0NBTl9SRVE6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGw6IFpEX0NNRF9TQ0FOX1JFUVxuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0NNRF9TRVRfR0VORVJJQ19FTEVNRU5UOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfU0VUX0dFTkVSSUNfRUxFTUVOVFxuIik7CisKKyAgICAgICAgICAgIC8qIENvcHkgdGhlIFdQQSBJRSAqLworICAgICAgICAgICAgLy96bV9tc2cxX21tKFpNX0xWXzAsICJDV1kgLSB3cGFpZSBMZW5ndGggOiAiLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndwYWllIExlbmd0aCA6ICVkXG4iLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSAvLyBBUCBNb2RlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZpV2xhblNldFdwYUllKGRldiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFjcC0+c3VwTGVuID0gemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW47CisgICAgICAgICAgICAgICAgbWVtY3B5KG1hY3AtPnN1cEllLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFTdXBwb3J0KGRldiwgMSk7CisgICAgICAgICAgICAvL3pmaVdsYW5TZXRXcGFJZShkZXYsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpaTsKKyAgICAgICAgICAgICAgICB1OF90IGxlbiA9IHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuOworICAgICAgICAgICAgICAgIHU4X3QgKndwYWllID0gKHU4X3QgKil6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmRhdGE7CisKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5hcC53cGFMZW46ICVkXG4iLCBsZW4pOworCisgICAgICAgICAgICAgICAgLyogRFVNUCBXUEEgSUUgKi8KKyAgICAgICAgICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IGxlbjspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB3cGFpZVtpaV0pOworCisgICAgICAgICAgICAgICAgICAgIGlmKCgrK2lpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKyAgICAgICAgICAgIH0KKworLy8gICAgICAgICAgICAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgICAgICAgICAvL2lmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgICAgIC8vey8vIFVwZGF0ZSBCZWFjb24gRklGTyBpbiB0aGUgbmV4dCBUQlRULgorICAgICAgICAgICAgLy8gICAgbWVtY3B5KCZtV1BBSWUsIHBTZXR0aW5nLT5XUEFJZSwgcFNldHRpbmctPldQQUllTGVuKTsKKyAgICAgICAgICAgIC8vICAgIHByaW50ayhLRVJOX0VSUiAiQ29weSBXUEEgSUUgaW50byBtV1BBSWVcbiIpOworICAgICAgICAgICAgLy99CisvLyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisKKy8vICAgICAgICAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgICAgIGNhc2UgWkRfQ01EX0dFVF9UU0M6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGw6IFpEX0NNRF9HRVRfVFNDXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworLy8gICAgICAgICNlbmRpZgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGwgZGVmYXVsdDogMHglMDR4XG4iLCB6ZHBhcm0tPmNtZCk7CisgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitpbnQgdXNiZHJ2X2NlbmNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHp5ZGFzX2NlbmNfcGFyYW0gKnpkcGFybSkKK3sKKyAgICAvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisgICAgdTE2X3QgYXBJZDsKKyAgICB1OF90IGJjX2FkZHJbNl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgaWk7CisKKyAgICAvKiBHZXQgdGhlIEFQIElkICovCisgICAgYXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKworICAgIGlmIChhcElkID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGFwSWQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcElkID0gYXBJZCsxOworICAgIH0KKworICAgIHN3aXRjaCAoemRwYXJtLT5jbWQpCisgICAgeworICAgICAgICBjYXNlIFpNX0NNRF9DRU5DX1NFVENFTkM6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpNX0NNRF9DRU5DX1NFVENFTkNcbiIpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJsZW5ndGg6ICVkXG4iLCB6ZHBhcm0tPmxlbik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInBvbGljeTogJWRcbiIsIHpkcGFybS0+dS5pbmZvLmNlbmNfcG9saWN5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0NNRF9DRU5DX1NFVEtFWToKKyAgICAgICAgICAgIC8vcmV0ID0gd2FpX2lvY3RsX3NldGtleSh2YXAsIGlvY3RsX21zZyk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpNX0NNRF9DRU5DX1NFVEtFWVxuIik7CisKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTUFDIGFkZHJlc3M9ICIpOworICAgICAgICAgICAgZm9yKGlpID0gMDsgaWkgPCA2OyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHpkcGFybS0+dS5jcnlwdC5zdGFfYWRkcltpaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIktleSBJbmRleDogJWRcbiIsIHpkcGFybS0+dS5jcnlwdC5rZXlpZCk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVuY3J5cHRpb24ga2V5PSAiKTsKKyAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgMTY7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgemRwYXJtLT51LmNyeXB0LmtleVtpaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk1JQyBrZXk9ICIpOworICAgICAgICAgICAgZm9yKGlpID0gMTY7IGlpIDwgWk1fQ0VOQ19LRVlfU0laRTsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQua2V5W2lpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisKKyAgICAgICAgICAgIC8qIFNldCB1cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gWk1fQ0VOQ19LRVlfU0laRTsKKyAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSB6ZHBhcm0tPnUuY3J5cHQua2V5aWQ7CisgICAgICAgICAgICBrZXlJbmZvLmZsYWcgPSBaTV9LRVlfRkxBR19BVVRIRU5USUNBVE9SIHwgWk1fS0VZX0ZMQUdfQ0VOQzsKKyAgICAgICAgICAgIGtleUluZm8ua2V5ID0gemRwYXJtLT51LmNyeXB0LmtleTsKKyAgICAgICAgICAgIGtleUluZm8ubWFjQWRkciA9ICh1MTZfdCAqKXpkcGFybS0+dS5jcnlwdC5zdGFfYWRkcjsKKworICAgICAgICAgICAgLyogSWRlbnRpZnkgdGhlIE1BQyBhZGRyZXNzIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBpZiAobWVtY21wKHpkcGFybS0+dS5jcnlwdC5zdGFfYWRkciwgYmNfYWRkciwgc2l6ZW9mKGJjX2FkZHIpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19HSzsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLnZhcElkID0gYXBJZDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoa2V5SW5mby52YXBBZGRyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5SW5mby5mbGFnIHw9IFpNX0tFWV9GTEFHX1BLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0NNRF9DRU5DX1JFS0VZOgorICAgICAgICAgICAgLy9yZXQgPSB3YWlfaW9jdGxfcmVrZXkodmFwLCBpb2N0bF9tc2cpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaTV9DTURfQ0VOQ19SRUtFWVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICAvL2lmIChyZXR2ID09IEVORVRSRVNFVCkKKyAgICAvLyAgICByZXR2ID0gSVNfVVBfQVVUTyh2YXApID8gaWVlZTgwMjExX29wZW4odmFwLT5pdl9kZXYpIDogMDsKKworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCB1c2JkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisvLyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3A7CisvLyAgICB2b2lkICpyZWdwOworICAgIHN0cnVjdCB6ZGFwX2lvY3RsIHpkcmVxOworICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKWlmcjsKKyAgICBzdHJ1Y3QgYXRocl93bGFuX3BhcmFtIHpkcGFybTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpbnQgY2hhbmdlZCA9IDA7CisKKy8vICAgIHJlZ3AgPSBtYWNwLT5yZWdwOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgICAgICAgICBjYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICAgICAgc3RyY3B5KHdycS0+dS5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0lPQ0dJV0FQOgorICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9naXdhcChkZXYsIE5VTEwsICZ3cnEtPnUuYXBfYWRkciwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0lPQ1NJV0FQOgorICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9zaXdhcChkZXYsIE5VTEwsICZ3cnEtPnUuYXBfYWRkciwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0lPQ0dJV01PREU6CisgICAgICAgICAgICBlcnIgPSB1c2JkcnZ3ZXh0X2dpd21vZGUoZGV2LCBOVUxMLCAmd3JxLT51Lm1vZGUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NTSVdFU1NJRDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ1dZIC0gdXNiZHJ2d2V4dF9zaXdlc3NpZFxuIik7CisgICAgICAgICAgICAvL2VyciA9IHVzYmRydl9pb2N0bF9zZXRlc3NpZChkZXYsICZ3cnEtPnUuZXNzaWQpOworICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9zaXdlc3NpZChkZXYsIE5VTEwsICZ3cnEtPnUuZXNzaWQsIE5VTEwpOworCisgICAgICAgICAgICBpZiAoISBlcnIpCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0lPQ0dJV0VTU0lEOgorICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9naXdlc3NpZChkZXYsIE5VTEwsICZ3cnEtPnUuZXNzaWQsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NTSVdSVFM6CisKKyAgICAgICAgICAgIGVyciA9IHVzYmRydl9pb2N0bF9zZXRydHMoZGV2LCAmd3JxLT51LnJ0cyk7CisgICAgICAgICAgICBpZiAoISBlcnIpCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworCisJCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgyOiAvKiBzZXRfYXV0aCAqLworCQl7CisJCQkvL3ByaW50aygiQ1dZIC0gU0lPQ0lXRklSU1RQUklWICsgMHgyIChzZXRfYXV0aClcbiIpOworCQkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXsKKwkJCQllcnIgPSAtRVBFUk07CisJCQkJYnJlYWs7CisJCQl9CisJCQl7CisJCQkJaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKwkJCQlpZiAoKHZhbCA8IDApIHx8ICh2YWwgPiAyKSkKKwkJCQl7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgdmFsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgICAgICAgICAgICAgIH0KKworCQkJCQllcnIgPSAwOworCQkJCQljaGFuZ2VkID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgzOiAvKiBnZXRfYXV0aCAqLworCQl7CisJCSAgICBpbnQgQXV0aE1vZGUgPSBaTV9BVVRIX01PREVfT1BFTjsKKworCQkJLy9wcmludGsoIkNXWSAtIFNJT0NJV0ZJUlNUUFJJViArIDB4MyAoZ2V0X2F1dGgpXG4iKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJd3JxLT51LmRhdGEuZmxhZ3MgPSAxOworCisJCQkJQXV0aE1vZGUgPSB6ZmlXbGFuUXVlcnlBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCAwKTsKKwkJCQlpZiAoQXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX09QRU4pCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKworCQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJvcGVuIHN5c3RlbSIsIDEyKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoQXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1NIQVJFRF9LRVkpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxMTsKKworCQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJzaGFyZWQga2V5IiwgMTEpKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTykKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDEwOworCisJCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgImF1dG8gbW9kZSIsIDEwKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQl9CisJCQlicmVhazsKKworCisgICAgICAgIGNhc2UgWkRBUElPQ1RMOiAgICAvL2RlYnVnIGNvbW1hbmQKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmemRyZXEsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoemRyZXEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydjogY29weV9mcm9tX3VzZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnY6IGNtZD0lMngsIHJlZz0weCUwNGx4LCB2YWx1ZT0weCUwOGx4XG4iLAorICAgICAgICAgICAgLy8gICAgICAgIHpkcmVxLmNtZCwgemRyZXEuYWRkciwgemRyZXEudmFsdWUpOworCisJCQl6ZkxueFByaXZhdGVJb2N0bChkZXYsICZ6ZHJlcSk7CisKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0lPQ1RMX1dQQToKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmemRwYXJtLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGF0aHJfd2xhbl9wYXJhbSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBjb3B5X2Zyb21fdXNlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzYmRydl93cGFfaW9jdGwoZGV2LCAmemRwYXJtKTsKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0lPQ1RMX1BBUkFNOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgKnA7CisgICAgICAgICAgICBpbnQgb3A7CisgICAgICAgICAgICBpbnQgYXJnOworCisgICAgICAgICAgICAvKiBQb2ludCB0byB0aGUgbmFtZSBmaWVsZCBhbmQgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgKiBvcCBhbmQgYXJnIGVsZW1lbnRzLiAgICAgICAgICAqLworICAgICAgICAgICAgcCA9IChpbnQgKil3cnEtPnUubmFtZTsKKyAgICAgICAgICAgIG9wID0gKnArKzsKKyAgICAgICAgICAgIGFyZyA9ICpwOworCisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9ST0FNSU5HKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiKioqKioqKioqKioqKiBaRF9QQVJBTV9ST0FNSU5HOiAlZFxuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICAvL21hY3AtPmNhcmRTZXR0aW5nLmFwX3NjYW49KFU4KWFyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX1BSSVZBQ1kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9JT0NUTF9QUklWQUNZOiAiKTsKKworICAgICAgICAgICAgICAgIC8qIFR1cm4gb24gdGhlIHByaXZhY3kgaW52b2tlIGZsYWcgKi8KKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1DYXBbMF0gfD0gQ0FQX1BSSVZBQ1k7CisgICAgICAgICAgICAgICAgLy8gICAgbWFjcC0+Y2FyZFNldHRpbmcuRW5jcnlPbk9mZlswXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1DYXBbMF0gJj0gfkNBUF9QUklWQUNZOworICAgICAgICAgICAgICAgIC8vICAgIG1hY3AtPmNhcmRTZXR0aW5nLkVuY3J5T25PZmZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGFuZ2VkPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9XUEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9QQVJBTV9XUEE6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpICE9IFpNX01PREVfQVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiU3RhdGlvbiBNb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCAodThfdCAqKSZ3cGFJZSwgJndwYWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygid3BhSWUgOiAlMngsJTJ4LCUyeFxuIiwgd3BhSWVbMjFdLCB3cGFJZVsyMl0sIHdwYUllWzIzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygicnNuSWUgOiAlMngsJTJ4LCUyeFxuIiwgd3BhSWVbMTddLCB3cGFJZVsxOF0sIHdwYUllWzE5XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hY3AtPnN1cEllWzIxXSA9PSAweDUwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyMl0gPT0gMHhmMikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMjNdID09IDB4MikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQVBTS1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQVBTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9XUEFQU0spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1hY3AtPnN1cEllWzIxXSA9PSAweDUwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzIyXSA9PSAweGYyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzIzXSA9PSAweDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfV1BBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtYWNwLT5zdXBJZVsxN10gPT0gMHhmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzE4XSA9PSAweGFjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzE5XSA9PSAweDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyUFNLXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyUFNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfV1BBMlBTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobWFjcC0+c3VwSWVbMTddID09IDB4ZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOF0gPT0gMHhhYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOV0gPT0gMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYWNwLT5zdXBJZVsyMV0gPT0gMHg1MCkgfHwgKG1hY3AtPnN1cEllWzIyXSA9PSAweGYyKSkvL1dQQSBvciBXUEFQU0sKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFjcC0+c3VwSWVbMTFdID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX1RLSVApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9BRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWFjcC0+c3VwSWVbMTddID09IDB4ZikgfHwgKG1hY3AtPnN1cEllWzE4XSA9PSAweGFjKSkgLy9XUEEyIG9yIFdQQTJQU0sKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFjcC0+c3VwSWVbMTNdID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX1RLSVApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9BRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9BRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgV1BBIHJlbGF0ZWQgdmFyaWFibGVzICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdwYVN1cHBvcnQoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9PUEVOKTsKKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBOb3cgd2Ugb25seSBzZXQgdGhlIGxlbmd0aCBpbiB0aGUgV1BBIElFCisgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIHRvIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8vbWFjcC0+Y2FyZFNldHRpbmcuV1BBSWVbMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIj09PT09PT09PT09PT09PT1aRF9QQVJBTV9DT1VOVEVSTUVBU1VSRVM6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ291bnRlck1lYXN1cmVTdGF0ZT0xOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9EUk9QVU5FTkNSWVBURUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9QQVJBTV9EUk9QVU5FTkNSWVBURUQ6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX0FVVEhfQUxHUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlpEX1BBUkFNX0FVVEhfQUxHUzogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiT1BFTl9TWVNURU1cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlNIQVJFRF9LRVlcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG9wID09IFpEX1BBUkFNX1dQU19GSUxURVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9QQVJBTV9XUFNfRklMVEVSOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MTsKKyAgICAgICAgICAgICAgICAgICAgbWFjcC0+Zm9yd2FyZE1nbXQgPSAxOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MDsKKyAgICAgICAgICAgICAgICAgICAgbWFjcC0+Zm9yd2FyZE1nbXQgPSAwOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfSU9DVExfR0VUV1BBSUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUgcmVxX3dwYWllOworICAgICAgICAgICAgdTE2X3QgYXBJZCwgaSwgajsKKworICAgICAgICAgICAgLyogR2V0IHRoZSBBUCBJZCAqLworICAgICAgICAgICAgYXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKworICAgICAgICAgICAgaWYgKGFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwSWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwSWQgPSBhcElkKzE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmcmVxX3dwYWllLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSkpKXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydjogY29weV9mcm9tX3VzZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgSUVFRTgwMjExX0FERFJfTEVOOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHJbal0gIT0gcmVxX3dwYWllLndwYV9tYWNhZGRyW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJaRF9JT0NUTF9HRVRXUEFJRSAtIHN0YSBpbmRleCA9ICVkXG4iLCBpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVxX3dwYWllLndwYV9pZSwgbWFjcC0+c3Rhd3BhaWVbaV0ud3BhX2llLCBJRUVFODAyMTFfTUFYX0lFX1NJWkUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZyZXFfd3BhaWUsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0lPQ1RMX0NFTkM6CisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJm1hY3AtPnpkX3dwYV9yZXEsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgYXRocl93bGFuX3BhcmFtKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNiZHJ2X2NlbmNfaW9jdGwoZGV2LCAoc3RydWN0IHp5ZGFzX2NlbmNfcGFyYW0gKikmbWFjcC0+emRfd3BhX3JlcSk7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9kdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmI5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IG9hbF9kdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZGF0YSB0eXBlIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT0FMX0RUX0gKKyNkZWZpbmUgX09BTF9EVF9ICisKKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgYnVmZmVyIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgZGV2aWNlIHR5cGUgaGVyZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCit0eXBlZGVmICAgICB1bnNpZ25lZCBsb25nIGxvbmcgIHU2NF90OwordHlwZWRlZiAgICAgdW5zaWduZWQgaW50ICAgICAgICB1MzJfdDsKK3R5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgdTE2X3Q7Cit0eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIHU4X3Q7Cit0eXBlZGVmICAgICBsb25nIGxvbmcgICAgICAgICAgIHM2NF90OwordHlwZWRlZiAgICAgbG9uZyAgICAgICAgICAgICAgICBzMzJfdDsKK3R5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgczE2X3Q7Cit0eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIHM4X3Q7CisKKyNpZm5kZWYgICAgIFRSVUUKKyNkZWZpbmUgICAgIFRSVUUgICAgICAgICAgICAgICAgKDE9PTEpCisjZW5kaWYKKworI2lmbmRlZiAgICAgRkFMU0UKKyNkZWZpbmUgICAgIEZBTFNFICAgICAgICAgICAgICAgKDE9PTApCisjZW5kaWYKKworI2lmbmRlZiAgICAgTlVMTAorI2RlZmluZSAgICAgTlVMTCAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyogUGxlYXNlIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZvciBidWZmZXIgdHlwZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSAqLwordHlwZWRlZiAgICAgc3RydWN0IHNrX2J1ZmYgICAgICB6YnVmX3Q7CisKKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgZGV2aWNlIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KK3R5cGVkZWYgICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgemRldl90OworCisjZW5kaWYgLyogI2lmbmRlZiBfT0FMX0RUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGU0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IG9hbF9tYXJjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd2FycHBlciBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT0FMX01BUkNfSAorI2RlZmluZSBfT0FMX01BUkNfSAorCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNkZWZpbmUgWk1fT1NfTElOVVhfRlVOQworCisvKioqKiogQ3JpdGljYWwgc2VjdGlvbiAqKioqKi8KKy8qIERlY2xhcmUgZm9yIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNpZm5kZWYgWk1fSEFMUExVU19MT0NLCisjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSAgICBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2KikgKCgoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSopZGV2LT5wcml2KS0+d2QpKQorCisjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgXAorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CisKKy8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOworI2Vsc2UKKyNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpICAgIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gemZ3R2V0V2xhbkRldihkZXYpOworCisvKiBEZWNsYXJlIGZvciBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkKKworLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKKyAgICAgICAgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oZGV2KTsKKworLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKKyAgICAgICAgemZ3TGVhdmVDcml0aWNhbFNlY3Rpb24oZGV2KTsKKyNlbmRpZgorCisvKioqKiogQnl0ZSBvcmRlciBjb252ZXJ0aW5nICoqKioqLworI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCisjZGVmaW5lIHptd19jcHVfdG9fbGUzMih2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQorCisjZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQorCisjZGVmaW5lIHptd19jcHVfdG9fbGUxNih2KSAgICAoKCh2ICYgMHhmZjAwKSA+PiA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYpIDw8IDgpKQorCisjZGVmaW5lIHptd19sZTE2X3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwKSA+PiA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYpIDw8IDgpKQorI2Vsc2UKKyNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgICh2KQorI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKHYpCisjZGVmaW5lIHptd19jcHVfdG9fbGUxNih2KSAgICAodikKKyNkZWZpbmUgem13X2xlMTZfdG9fY3B1KHYpICAgICh2KQorI2VuZGlmCisKKy8qKioqKiBCdWZmZXIgYWNjZXNzICoqKioqLworLyogQ2FsbGVkIHRvIHJlYWQvd3JpdGUgYnVmZmVyICovCisjaWZuZGVmIFpNX0hBTFBMVVNfTE9DSworCisjZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpCisjZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgem13X2NwdV90b19sZTE2KCoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkpCisjZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZQorI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSkKKyNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSAodThfdCopKGJ1Zi0+ZGF0YSkKKworI2Vsc2UKKworI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpIHpmd0J1ZlJlYWRCeXRlKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgemZ3QnVmUmVhZEhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUJ5dGUoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisjZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpIHpmd0dldEJ1ZmZlcihkZXYsIGJ1ZikKKworI2VuZGlmCisKKy8qKioqKiBEZWJ1ZyBtZXNzYWdlICoqKioqLworI2lmIDAKKyNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpIHByaW50aygiJXM6JXNcbiIsIF9fRlVOQ1RJT05fXywgbXNnKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgIG1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZzIobXNnLCB2YWwpIHByaW50aygiJXM6JXMlbHhoXG4iLCBfX0ZVTkNUSU9OX18sIFwKKyAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpIHByaW50aygiJXM6JXMlc1xuIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgIG1zZywgdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fRlVOQ1RJT05fXywgXAorICAgICAgICBtc2csICh2YWwxL3ZhbDIpLCAoKCh2YWwxKjEwMCkvdmFsMiklMTAwKSk7CisjZGVmaW5lIHptX2RiZyhTKSBwcmludGsgUworI2Vsc2UKKyNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpCisjZGVmaW5lIHptX2RlYnVnX21zZzEobXNnLCB2YWwpCisjZGVmaW5lIHptX2RlYnVnX21zZzIobXNnLCB2YWwpCisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKQorI2RlZmluZSB6bV9kZWJ1Z19tc2dfcChtc2csIHZhbDEsIHZhbDIpCisjZGVmaW5lIHptX2RiZyhTKQorI2VuZGlmCisKKyNkZWZpbmUgem1fYXNzZXJ0KGV4cHIpIGlmKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ayggIkF0aGVvcnMgQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwgICBcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyNkZWZpbmUgRGJnUHJpbnQgcHJpbnRrCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9PQUxfTUFSQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTA3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwpAQCAtMCwwICsxLDExNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogdXNiZHJ2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG5ldHdvcmsgaW50ZXJmYWNlIHVwL2Rvd24gcmVsYXRlZCBmdW5jdGlvbnMuKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzcmMvdXNiZHJ2LmMgKi8KKworI2RlZmluZSBaTV9QSUJTU19NT0RFICAgMAorI2RlZmluZSBaTV9BUF9NT0RFICAgICAgMAorI2RlZmluZSBaTV9DSEFOTkVMICAgICAgMTEKKyNkZWZpbmUgWk1fV0VQX01PTUUgICAgIDAKKyNkZWZpbmUgWk1fU0hBUkVfQVVUSCAgIDAKKyNkZWZpbmUgWk1fRElTQUJMRV9YTUlUIDAKKworI2luY2x1ZGUgInVzYmRydi5oIgorI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfemZpLmgiCisKKyNpbmNsdWRlICJsaW51eC9uZXRsaW5rLmgiCisjaW5jbHVkZSAibGludXgvcnRuZXRsaW5rLmgiCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorI2luY2x1ZGUgImF0aHJfY29tbW9uLmgiCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgemZEdW1wRGVzY3JpcHRvcih6ZGV2X3QqIGRldiwgdTE2X3QgdHlwZSk7CisvL2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworCisvLyBJU1IgaGFuZGxlcgoraXJxcmV0dXJuX3QgdXNiZHJ2X2ludHIoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCisvLyBOZXR3b3JrIERldmljZSBpbnRlcmZhY2UgcmVsYXRlZCBmdW5jdGlvbgoraW50IHVzYmRydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopOworaW50IHVzYmRydl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2ludCB1c2JkcnZfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOworaW50IHVzYmRydl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CitpbnQgdXNiZHJ2X3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHVzYmRydl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdXNiZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLy93aXJlbGVzcyBleHRlbnNpb24gaGVscGVyIGZ1bmN0aW9ucworaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CitpbnQgdXNiZHJ2X2lvY3RsX2dldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKTsKK2ludCB1c2JkcnZfaW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKTsKKy8qIFdpcmVsZXNzIEV4dGVuc2lvbiBIYW5kbGVyIGZ1bmN0aW9ucyAqLworaW50IHVzYmRydndleHRfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvKiBpbmZvLAorICAgICAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpOworaW50IHpmTG54UHJpdmF0ZUlvY3RsKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCwgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxKTsKKwordm9pZCB6ZkxueDEwbXNUaW1lcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2ludCB6ZlVucmVnaXN0ZXJXZHNEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3Qgd2RzSWQpOworaW50IHpmUmVnaXN0ZXJXZHNEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3Qgd2RzSWQpOworaW50IHpmV2RzT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6Zldkc0Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHpmTG54VmFwT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFZhcENsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHpmTG54VmFwWG1pdEZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHpmTG54UmVnaXN0ZXJWYXBEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3QgdmFwSWQpOworaW50IHVzYmRydl93cGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAqemRwYXJtKTsKK2V4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZkxueENoZWNrVHhCdWZmZXJDbnQoemRldl90ICpkZXYpOworZXh0ZXJuIFVzYlR4UV90ICp6ZkxueEdldFVzYlR4QnVmZmVyKHpkZXZfdCAqZGV2KTsKKworZXh0ZXJuIHUxNl90IHpmTG54QXV0aE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworZXh0ZXJuIHUxNl90IHpmTG54QXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB1MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpOworZXh0ZXJuIHUxNl90IHpmTG54QXBDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB2b2lkIHpmTG54Q29ubmVjdE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpOworZXh0ZXJuIHZvaWQgemZMbnhTY2FuTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTY2FuUmVzdWx0KiByZXN1bHQpOworZXh0ZXJuIHZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyogcmVzdWx0KTsKK2V4dGVybiB2b2lkIHpmTG54TWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cyk7CitleHRlcm4gdm9pZCB6ZkxueEFwTWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkciwgemJ1Zl90KiBidWYpOworZXh0ZXJuIHZvaWQgemZMbnhJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KTsKK2V4dGVybiB2b2lkIHpmTG54TWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CitleHRlcm4gdm9pZCB6ZkxueFNlbmRDb21wbGV0ZUluZGljYXRpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmTG54UmVjdkV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworZXh0ZXJuIHZvaWQgemZMbnhSZXN0b3JlQnVmRGF0YSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitleHRlcm4gdTE2X3QgemZMbnhDZW5jQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCitleHRlcm4gdm9pZCB6ZkxueFdhdGNoRG9nTm90aWZ5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmTG54UmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKK2V4dGVybiB1OF90IHpmTG54Q3JlYXRlVGhyZWFkKHpkZXZfdCAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgIFAgVSBCIEwgSSBDICAgRCBBIFQgQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogRGVmaW5pdGlvbiBvZiBXaXJlbGVzcyBFeHRlbnNpb24gKi8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorLy93aXJlbGVzcyBleHRlbnNpb24gaGVscGVyIGZ1bmN0aW9ucworZXh0ZXJuIGludCB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpOworZXh0ZXJuIGludCB1c2JkcnZfaW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKTsKKy8qIFdpcmVsZXNzIEV4dGVuc2lvbiBIYW5kbGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IHNvY2thZGRyICpNYWNBZGRyLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IHNvY2thZGRyICpNYWNBZGRyLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXNzaWQsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHVzYmRydl9wcml2YXRlX2FyZ3NbXSA9IHsKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHgwLCAwLCAwLCAibGlzdF9ic3MiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4MSwgMCwgMCwgImNhcmRfcmVzZXQiIH0sCisgICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDIsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X2F1dGgiIH0sICAvKiAwIC0gb3BlbiwgMSAtIHNoYXJlZCBrZXkgKi8KKyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4MywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwgImdldF9hdXRoIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDQsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X3ByZWFtYmxlIiB9LCAgLyogMCAtIGxvbmcsIDEgLSBzaG9ydCAqLworLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgNiwgImdldF9wcmVhbWJsZSIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg2LCAwLCAwLCAiY250IiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDcsIDAsIDAsICJyZWdzIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDgsIDAsIDAsICJwcm9iZSIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg5LCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImRiZ19mbGFnIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweEEsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiY29ubmVjdCIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHhCLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9tYWNfbW9kZSIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHhDLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEyLCAiZ2V0X21hY19tb2RlIiB9LAorfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCitzdGF0aWMgaXdfaGFuZGxlciB1c2JkcnZ3ZXh0X2hhbmRsZXJbXSA9IHsKKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3bmFtZSwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05BTUUgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3ZnJlcSwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdmcmVxLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXRlJFUSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd21vZGUsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdNT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3bW9kZSwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdzZW5zLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3NlbnMsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIG5vdCB1c2VkICovICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cmFuZ2UsICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JBTkdFICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIG5vdCB1c2VkICovICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyoga2VybmVsIGNvZGUgKi8gICAgICAgICAgICAvKiBTSU9DR0lXUFJJViAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBub3QgdXNlZCAqLyAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTVEFUUyAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBrZXJuZWwgY29kZSAqLyAgICAgICAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdhcCwgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQVAgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdhcCwgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9pd2FwbGlzdCwgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVBMSVNUICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdzY2FuLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3NjYW4sICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisjZWxzZSAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBudWxsICovICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTQ0FOICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIG51bGwgKi8gICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2Vzc2lkLCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd2Vzc2lkLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3bmlja24sICAgICAgICAgICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3bmlja24sICAgICAgICAgICAgICAgLyogU0lPQ0dJV05JQ0tOICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdyYXRlLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkFURSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3JhdGUsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cnRzLCAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JUUyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3J0cywgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdmcmFnLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXRlJBRyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd2ZyYWcsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdGUkFHICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3dHhwb3csICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3dHhwb3csICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cmV0cnksICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cmV0cnksICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3ZW5jb2RlLCAgICAgICAgICAgICAgLyogU0lPQ1NJV0VOQ09ERSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd2VuY29kZSwgICAgICAgICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdwb3dlciwgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdwb3dlciwgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgKi8KK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHVzYmRydl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRwYXJhbSwJCS8qIFNJT0NXRklSU1RQUklWKzAgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldHBhcmFtLAkJLyogU0lPQ1dGSVJTVFBSSVYrMSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0a2V5LAkJICAgIC8qIFNJT0NXRklSU1RQUklWKzIgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldHdtbXBhcmFtcywJLyogU0lPQ1dGSVJTVFBSSVYrMyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZGVsa2V5LAkJICAgIC8qIFNJT0NXRklSU1RQUklWKzQgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldHdtbXBhcmFtcywJLyogU0lPQ1dGSVJTVFBSSVYrNSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0bWxtZSwJCS8qIFNJT0NXRklSU1RQUklWKzYgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldGNoYW5pbmZvLAkvKiBTSU9DV0ZJUlNUUFJJVis3ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRvcHRpZSwJCS8qIFNJT0NXRklSU1RQUklWKzggKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldG9wdGllLAkJLyogU0lPQ1dGSVJTVFBSSVYrOSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfYWRkbWFjLAkJICAgIC8qIFNJT0NXRklSU1RQUklWKzEwICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRzY2FucmVzdWx0cywJLyogU0lPQ1dGSVJTVFBSSVYrMTEgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2RlbG1hYywJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisxMiAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0Y2hhbmxpc3QsCS8qIFNJT0NXRklSU1RQUklWKzEzICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRjaGFubGlzdCwJLyogU0lPQ1dGSVJTVFBSSVYrMTQgKi8KKwkvLyhpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NXRklSU1RQUklWKzE1ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9jaGFuc3dpdGNoLAkgICAgLyogU0lPQ1dGSVJTVFBSSVYrMTYgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldG1vZGUsCQkvKiBTSU9DV0ZJUlNUUFJJVisxNyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0bW9kZSwJCS8qIFNJT0NXRklSU1RQUklWKzE4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZiA9IHsKKyAgICAubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHVzYmRydndleHRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisgICAgLm51bV9wcml2YXRlID0gc2l6ZW9mKHVzYmRydl9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKyAgICAubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih1c2JkcnZfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisgICAgLnN0YW5kYXJkID0gdXNiZHJ2d2V4dF9oYW5kbGVyLAorICAgIC5wcml2YXRlID0gKGl3X2hhbmRsZXIgKikgdXNiZHJ2X3ByaXZhdGVfaGFuZGxlciwKKyAgICAucHJpdmF0ZV9hcmdzID0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgdXNiZHJ2X3ByaXZhdGVfYXJncworfTsKKyNlbmRpZgorCisvKiBXRFMgKi8KKy8vc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworLy92b2lkIHpmSW5pdFdkc1N0cnVjdCh2b2lkKTsKKworLyogVkFQICovCitzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07Cit2b2lkIHpmTG54SW5pdFZhcFN0cnVjdCh2b2lkKTsKKworCisvKioKKyAqIHVzYmRydl9pbnRyIC0gaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IHRoZSBJUlEgbnVtYmVyCisgKiBAZGV2X2luc3Q6IHRoZSBuZXRfZGV2aWNlIHN0cnVjdAorICogQHJlZ3M6IHJlZ2lzdGVycyAodW51c2VkKQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB0aGUgSVNSIGZvciB0aGUgdXNiZHJ2IGJvYXJkLiBJdCBzZXJ2aWNlcworICogdGhlIFJYICYgVFggcXVldWVzICYgc3RhcnRzIHRoZSBSVSBpZiBpdCBoYXMgc3RvcHBlZCBkdWUKKyAqIHRvIG5vIHJlc291cmNlcy4KKyAqLworaXJxcmV0dXJuX3QgdXNiZHJ2X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2luc3QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworCisgICAgZGV2ID0gZGV2X2luc3Q7CisgICAgbWFjcCA9IGRldi0+bWxfcHJpdjsKKworCisgICAgLyogUmVhZCByZWdpc3RlciBlcnJvciwgY2FyZCBtYXkgYmUgdW5wbHVnZWQgKi8KKyAgICBpZiAoMCkvLyhpbnRyX3N0YXR1cyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworCisgICAgLyogdGhlIGRldmljZSBpcyBjbG9zZWQsIGRvbid0IGNvbnRpbnVlIG9yIGVsc2UgYmFkIHRoaW5ncyBtYXkgaGFwcGVuLiAqLworICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisgICAgLy96ZmlJc3JQY2koZGV2KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgdXNiZHJ2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgaW50IHJjID0gMDsKKyAgICB1MTZfdCBzaXplOworICAgIHZvaWQqIG1lbTsKKyAgICAvL3Vuc2lnbmVkIGNoYXIgYWRkcls2XTsKKyAgICBzdHJ1Y3QgenNDYkZ1bmNUYmwgY2JGdW5jVGJsOworCisgICAgcHJpbnRrKCJFbnRlciBvcGVuKClcbiIpOworCisvLyNpZm5kZWYgQ09ORklHX1NNUAorLy8gICAgcmVhZF9sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisvLyNlbmRpZgorICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpIHsKKyAgICAgICAgcmMgPSAtRUJVU1k7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBzaXplID0gemZpR2xvYmFsRGF0YVNpemUoZGV2KTsKKyAgICBpZiAoKG1lbSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisgICAgeworICAgICAgICByYyA9IC1FQlVTWTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBtYWNwLT53ZCA9IG1lbTsKKworICAgIG1lbXNldCgmY2JGdW5jVGJsLCAwLCBzaXplb2Yoc3RydWN0IHpzQ2JGdW5jVGJsKSk7CisgICAgY2JGdW5jVGJsLnpmY2JBdXRoTm90aWZ5ID0gemZMbnhBdXRoTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQXV0aE5vdGlmeSA9IHpmTG54QXV0aE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkFzb2NOb3RpZnkgPSB6ZkxueEFzb2NOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JEaXNBc29jTm90aWZ5ID0gemZMbnhEaXNBc29jTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQXBDb25uZWN0Tm90aWZ5ID0gemZMbnhBcENvbm5lY3ROb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JDb25uZWN0Tm90aWZ5ID0gemZMbnhDb25uZWN0Tm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiU2Nhbk5vdGlmeSA9IHpmTG54U2Nhbk5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYk1pY0ZhaWx1cmVOb3RpZnkgPSB6ZkxueE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkgPSB6ZkxueEFwTWljRmFpbHVyZU5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYklic3NQYXJ0bmVyTm90aWZ5ID0gemZMbnhJYnNzUGFydG5lck5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYk1hY0FkZHJlc3NOb3RpZnkgPSB6ZkxueE1hY0FkZHJlc3NOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uID0gemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uOworICAgIGNiRnVuY1RibC56ZmNiUmVjdkV0aCA9IHpmTG54UmVjdkV0aDsKKyAgICBjYkZ1bmNUYmwuemZjYlJlY3Y4MDIxMSA9IHpmTG54UmVjdjgwMjExOworICAgIGNiRnVuY1RibC56ZmNiUmVzdG9yZUJ1ZkRhdGEgPSB6ZkxueFJlc3RvcmVCdWZEYXRhOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgY2JGdW5jVGJsLnpmY2JDZW5jQXNvY05vdGlmeSA9IHpmTG54Q2VuY0Fzb2NOb3RpZnk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIGNiRnVuY1RibC56ZmNiSHdXYXRjaERvZ05vdGlmeSA9IHpmTG54V2F0Y2hEb2dOb3RpZnk7CisgICAgemZpV2xhbk9wZW4oZGV2LCAmY2JGdW5jVGJsKTsKKworI2lmIDAKKyAgICB7CisgICAgICAgIC8vdTE2X3QgbWFjWzNdID0gezB4MTMwMCwgMHhiNmQ0LCAweDVhYWZ9OworICAgICAgICB1MTZfdCBtYWNbM10gPSB7MHg4MDAwLCAweDAwYWIsIDB4MDAwMH07CisgICAgICAgIC8vemZpV2xhblNldE1hY0FkZHJlc3MoZGV2LCBtYWMpOworICAgIH0KKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoZGV2LCBhZGRyKTsKKyAgICBkZXYtPmRldl9hZGRyWzBdID0gYWRkclswXTsKKyAgICBkZXYtPmRldl9hZGRyWzFdID0gYWRkclsxXTsKKyAgICBkZXYtPmRldl9hZGRyWzJdID0gYWRkclsyXTsKKyAgICBkZXYtPmRldl9hZGRyWzNdID0gYWRkclszXTsKKyAgICBkZXYtPmRldl9hZGRyWzRdID0gYWRkcls0XTsKKyAgICBkZXYtPmRldl9hZGRyWzVdID0gYWRkcls1XTsKKyNlbmRpZgorICAgIC8vemZ3TWFjQWRkcmVzc05vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGRldi0+ZGV2X2FkZHJbXQorCisgICAgemZMbnhDcmVhdGVUaHJlYWQoZGV2KTsKKworICAgIG1vZF90aW1lcigmKG1hY3AtPmhiVGltZXIxMG1zKSwgamlmZmllcyArICgxKkhaKS8xMDApOyAgIC8vMTAgbXMKKworICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyNpZiBaTV9BUF9NT0RFID09IDEKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX0FQKTsKKyAgICB6ZmlXbGFuU2V0QmFzaWNSYXRlKGRldiwgMHhmLCAwLCAwKTsKKyAgICB6ZmlXbGFuU2V0U1NJRChkZXYsICJPVFVTX0NXWSIsIDgpOworICAgIHpmaVdsYW5TZXREdGltQ291bnQoZGV2LCAzKTsKKworICAjaWYgWk1fV0VQX01PTUUgPT0gMQorICAgIHsKKyAgICAgICAgdThfdCBrZXlbMTZdID0gezB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OTB9OworICAgICAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisKKyAgICAgICAga2V5SW5mby5rZXlMZW5ndGggPSA1OworICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gMDsKKyAgICAgICAga2V5SW5mby5mbGFnID0gMDsKKyAgICAgICAga2V5SW5mby5rZXkgPSBrZXk7CisgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKworICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQNjQpOworICAgIH0KKworICAgICNpZiBaTV9TSEFSRV9BVVRIID09IDEKKyAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgMSk7CisgICAgI2VuZGlmIC8vI2lmIFpNX1NIQVJFX0FVVEggPT0gMQorICAjZW5kaWYgLy8jaWYgWk1fV0VQX01PTUUgPT0gMQorCisjZWxpZiBaTV9QSUJTU19NT0RFID09IDEKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX1BTRVVETyk7CisjZWxzZQorICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpOworI2VuZGlmCisgICAgLy96ZmlXbGFuU2V0Q2hhbm5lbChkZXYsIFpNX0NIQU5ORUwsIEZBTFNFKTsKKyAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgMjQ2MjAwMCwgRkFMU0UpOworICAgIHpmaVdsYW5TZXRSdHNUaHJlc2hvbGQoZGV2LCAzMjc2Nyk7CisgICAgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoZGV2LCAwKTsKKworICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgbWFjcC0+bmV0bGlua19zayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1VTRVJTT0NLLCAxLCBOVUxMLCBUSElTX01PRFVMRSk7CisKKyAgICBpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBjcmVhdGUgTkVUTElOSyBzb2NrZXRcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgbWFjcC0+RGV2aWNlT3BlbmVkID0gMTsKK2V4aXQ6CisvLyNpZm5kZWYgQ09ORklHX1NNUAorLy8gICAgcmVhZF91bmxvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKy8vI2VuZGlmCisgICAgLy96ZlJlZ2lzdGVyV2RzRGV2KGRldiwgMCk7CisgICAgLy96ZkxueFJlZ2lzdGVyVmFwRGV2KGRldiwgMCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworCisKKy8qKgorICogdXNiZHJ2X2dldF9zdGF0cyAtIGdldCBkcml2ZXIgc3RhdGlzdGljcworICogQGRldjogYWRhcHRlcidzIG5ldF9kZXZpY2Ugc3RydWN0CisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBPUyB3YW50cyB0aGUgYWRhcHRlcidzIHN0YXRzIHJldHVybmVkLgorICogSXQgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgbmV0X2RldmljZV9zdGF0cyBzdHVjdHVyZSBmb3IgdGhlIGRldmljZS4KKyAqIElmIHRoZSBzdGF0aXN0aWNzIGFyZSBjdXJyZW50bHkgYmVpbmcgdXBkYXRlZCwgdGhlbiB0aGV5IG1pZ2h0IGJlIGluY29ycmVjdAorICogZm9yIGEgc2hvcnQgd2hpbGUuIEhvd2V2ZXIsIHNpbmNlIHRoaXMgY2Fubm90IGFjdHVhbGx5IGNhdXNlIGRhbWFnZSwgbm8KKyAqIGxvY2tpbmcgaXMgdXNlZC4KKyAqLworCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHVzYmRydl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2Vycm9ycyA9CisgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKworICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOworCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9lcnJvcnMgPQorICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMgKworICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArCisgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKworCisgICAgcmV0dXJuICYobWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cyk7Cit9CisKKworLyoqCisgKiB1c2JkcnZfc2V0X21hYyAtIHNldCB0aGUgTUFDIGFkZHJlc3MKKyAqIEBkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdAorICogQGFkZHI6IHRoZSBuZXcgYWRkcmVzcworICoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHRoZSBldGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBib2FyZAorICogUmV0dXJuczoKKyAqIDAgIC0gaWYgc3VjY2Vzc2Z1bAorICogLTEgLSBvdGhlcndpc2UKKyAqLworCitpbnQgdXNiZHJ2X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3A7CisgICAgaW50IHJjID0gLTE7CisKKyAgICBtYWNwID0gZGV2LT5tbF9wcml2OworICAgIHJlYWRfbG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgcmMgPSAwOworCisKK2V4aXQ6CisgICAgcmVhZF91bmxvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworCit2b2lkCit1c2JkcnZfaXNvbGF0ZV9kcml2ZXIoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworI2lmbmRlZiBDT05GSUdfU01QCisgICAgd3JpdGVfbG9ja19pcnEoJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKyNlbmRpZgorICAgIG1hY3AtPmRyaXZlcl9pc29sYXRlZCA9IFRSVUU7CisjaWZuZGVmIENPTkZJR19TTVAKKyAgICB3cml0ZV91bmxvY2tfaXJxKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisjZW5kaWYKKworICAgIGlmIChuZXRpZl9ydW5uaW5nKG1hY3AtPmRldmljZSkpCisgICAgeworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihtYWNwLT5kZXZpY2UpOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKG1hY3AtPmRldmljZSk7CisgICAgfQorfQorCisjZGVmaW5lIFZMQU5fU0laRSAgIAk0CitpbnQgdXNiZHJ2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisgICAgaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gKEVUSF9EQVRBX0xFTiArIFZMQU5fU0laRSkpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGRldi0+bXR1ID0gbmV3X210dTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkxueFVubGlua0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKKworaW50IHVzYmRydl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworZXh0ZXJuIHZvaWQgemZIcExlZEN0cmwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2X3QgbGVkSWQsIHU4X3QgbW9kZSk7CisKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2X2Nsb3NlXG4iKTsKKworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKG1hY3AtPmRldmljZSk7CisKKyAgICBkZWxfdGltZXJfc3luYygmbWFjcC0+aGJUaW1lcjEwbXMpOworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydl9uZXRpZl9jYXJyaWVyX29mZlxuIik7CisKKyAgICB1c2JkcnZfaXNvbGF0ZV9kcml2ZXIobWFjcCk7CisKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2X2lzb2xhdGVfZHJpdmVyXG4iKTsKKworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKG1hY3AtPmRldmljZSk7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBDRU5DICovCisgICAgaWYgKG1hY3AtPm5ldGxpbmtfc2sgIT0gTlVMTCkKKyAgICB7CisgICAgLy8gICAgc29ja19yZWxlYXNlKG1hY3AtPm5ldGxpbmtfc2spOworICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydiBjbG9zZSBuZXRsaW5rIHNvY2tldFxuIik7CisgICAgfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisgICAgLy9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyNlbmRpZgorCisgICAgLyogVHVybiBvZmYgTEVEICovCisgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworCisgICAgLyogRGVsYXkgZm9yIGEgd2hpbGUgKi8KKyAgICBtZGVsYXkoMTApOworCisgICAgLyogY2xlYXIgV1BBL1JTTiBJRSAqLworICAgIG1hY3AtPnN1cEllWzFdID0gMDsKKworICAgIC8qIHNldCB0aGUgaXNvbGF0ZSBmbGFnIHRvIGZhbHNlLCBzbyB1c2JkcnZfb3BlbiBjYW4gYmUgY2FsbGVkICovCisgICAgbWFjcC0+ZHJpdmVyX2lzb2xhdGVkID0gRkFMU0U7CisKKyAgICB6ZmlXbGFuQ2xvc2UoZGV2KTsKKyAgICBrZnJlZShtYWNwLT53ZCk7CisKKyAgICB6ZkxueFVubGlua0FsbFVyYnMobWFjcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKworaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IG5vdGlmeV9zdG9wID0gRkFMU0U7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisjaWYgMAorICAgIC8qIFRlc3QgY29kZSAqLworICAgIHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYqIHM7CisKKyAgICAgICAgcyA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDgsIDAsIEdGUF9BVE9NSUMpOworICAgICAgICBza2JfcHVzaChzLCA4KTsKKyAgICAgICAgcy0+ZGF0YVswXSA9ICd6JzsKKyAgICAgICAgcy0+ZGF0YVsxXSA9ICd5JzsKKyAgICAgICAgcy0+ZGF0YVsyXSA9ICdkJzsKKyAgICAgICAgcy0+ZGF0YVszXSA9ICdhJzsKKyAgICAgICAgcy0+ZGF0YVs0XSA9ICdzJzsKKyAgICAgICAgcHJpbnRrKCJsZW4xPSVkLCBsZW4yPSVkIiwgc2tiLT5sZW4sIHMtPmxlbik7CisgICAgICAgIG5ldGxpbmtfYnJvYWRjYXN0KHJ0bmwsIHMsIDAsIFJUTUdSUF9MSU5LLCBHRlBfQVRPTUlDKTsKKyAgICB9CisjZW5kaWYKKworI2lmIFpNX0RJU0FCTEVfWE1JVAorICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CisjZWxzZQorICAgIHpmaVR4U2VuZEV0aChkZXYsIHNrYiwgMCk7CisjZW5kaWYKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCisgICAgLy9kZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisgICAgaWYgKG5vdGlmeV9zdG9wKSB7CisgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKwordm9pZCB1c2JkcnZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKworICAgIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmV0dXJuOworCit9CisKKworCisvKioKKyAqIHVzYmRydl9jbGVhcl9zdHJ1Y3RzIC0gZnJlZSByZXNvdXJjZXMKKworICogQGRldjogYWRhcHRlcidzIG5ldF9kZXZpY2Ugc3RydWN0CisgKgorICogRnJlZSBhbGwgZGV2aWNlIHNwZWNpZmljIHN0cnVjdHMsIHVubWFwIGkvbyBhZGRyZXNzLCBldGMuCisgKi8KK3ZvaWQgdXNiZHJ2X2NsZWFyX3N0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKyAgICBpb3VubWFwKG1hY3AtPnJlZ3ApOworCisgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhtYWNwLT5wZGV2KTsKKyAgICBwY2lfZGlzYWJsZV9kZXZpY2UobWFjcC0+cGRldik7CisgICAgcGNpX3NldF9kcnZkYXRhKG1hY3AtPnBkZXYsIE5VTEwpOworI2VuZGlmCisKKyAgICBrZnJlZShtYWNwKTsKKworICAgIGtmcmVlKGRldik7CisKK30KKwordm9pZCB1c2JkcnZfcmVtb3ZlMShzdHJ1Y3QgcGNpX2RldiAqcGNpZCkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcDsKKworICAgIGlmICghKGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwY2lfZ2V0X2RydmRhdGEocGNpZCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBtYWNwID0gZGV2LT5tbF9wcml2OworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICB1c2JkcnZfY2xlYXJfc3RydWN0cyhkZXYpOworfQorCisKK3ZvaWQgemZMbngxMG1zVGltZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvLzEwIG1zCisgICAgemZpSGVhcnRCZWF0KGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmTG54SW5pdFZhcFN0cnVjdCh2b2lkKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIHZhcFtpXS5kZXYgPSBOVUxMOworICAgICAgICB2YXBbaV0ub3BlbkZsYWcgPSAwOworICAgIH0KK30KKworaW50IHpmTG54VmFwT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHUxNl90IHZhcElkOworCisgICAgdmFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICBpZiAodmFwW3ZhcElkXS5vcGVuRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgdmFwW3ZhcElkXS5vcGVuRmxhZyA9IDE7CisgICAgCXByaW50aygiemZMbnhWYXBPcGVuIDogZGV2aWNlIG5hbWU9JXMsIHZhcCBJRD0lZFxuIiwgZGV2LT5uYW1lLCB2YXBJZCk7CisgICAgCXpmaVdsYW5TZXRTU0lEKGRldiwgInZhcDEiLCA0KTsKKyAgICAJemZpV2xhbkVuYWJsZShkZXYpOworICAgIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGsoIlZBUCBvcGVuZWQgZXJyb3IgOiB2YXAgSUQ9JWRcbiIsIHZhcElkKTsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFZhcENsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdTE2X3QgdmFwSWQ7CisKKyAgICB2YXBJZCA9IHpmTG54R2V0VmFwSWQoZGV2KTsKKworICAgIGlmICh2YXBJZCAhPSAweGZmZmYpCisgICAgeworICAgICAgICBpZiAodmFwW3ZhcElkXS5vcGVuRmxhZyA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoInpmTG54VmFwQ2xvc2U6IGRldmljZSBuYW1lPSVzLCB2YXAgSUQ9JWRcbiIsIGRldi0+bmFtZSwgdmFwSWQpOworCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICB2YXBbdmFwSWRdLm9wZW5GbGFnID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVkFQIHBvcnQgd2FzIG5vdCBvcGVuZWQgOiB2YXAgSUQ9JWRcbiIsIHZhcElkKTsKKyAgICAgICAgfQorICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHpmTG54VmFwWG1pdEZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IG5vdGlmeV9zdG9wID0gRkFMU0U7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IHZhcElkOworCisgICAgdmFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisgICAgLy9wcmludGsoInpmTG54VmFwWG1pdEZyYW1lOiB2YXAgSUQ9JWRcbiIsIHZhcElkKTsKKyAgICAvL3ByaW50aygiemZMbnhWYXBYbWl0RnJhbWUoKSwgc2tiPSVseGhcbiIsICh1MzJfdClza2IpOworCisgICAgaWYgKHZhcElkID49IFpNX1ZBUF9QT1JUX05VTUJFUikKKyAgICB7CisgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNpZiAxCisgICAgaWYgKHZhcFt2YXBJZF0ub3BlbkZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCisKKyAgICB6ZmlUeFNlbmRFdGgoZGV2LCBza2IsIDB4MSk7CisKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCisgICAgLy9kZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisgICAgaWYgKG5vdGlmeV9zdG9wKSB7CisgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmTG54UmVnaXN0ZXJWYXBEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3QgdmFwSWQpCit7CisgICAgLyogQWxsb2NhdGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICB2YXBbdmFwSWRdLmRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworICAgIHByaW50aygiUmVnaXN0ZXIgdmFwIGRldj0leFxuIiwgKHUzMl90KXZhcFt2YXBJZF0uZGV2KTsKKworICAgIGlmKHZhcFt2YXBJZF0uZGV2ID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKCJhbGxvY19ldGhlcmRldiBmYWlsXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgLyogU2V0dXAgdGhlIGRlZmF1bHQgc2V0dGluZ3MgKi8KKyAgICBldGhlcl9zZXR1cCh2YXBbdmFwSWRdLmRldik7CisKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIG1lbWNweSh2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHIsIHBhcmVudERldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworICAgIHZhcFt2YXBJZF0uZGV2LT5pcnEgPSBwYXJlbnREZXYtPmlycTsKKyAgICB2YXBbdmFwSWRdLmRldi0+YmFzZV9hZGRyID0gcGFyZW50RGV2LT5iYXNlX2FkZHI7CisgICAgdmFwW3ZhcElkXS5kZXYtPm1lbV9zdGFydCA9IHBhcmVudERldi0+bWVtX3N0YXJ0OworICAgIHZhcFt2YXBJZF0uZGV2LT5tZW1fZW5kID0gcGFyZW50RGV2LT5tZW1fZW5kOworICAgIHZhcFt2YXBJZF0uZGV2LT5tbF9wcml2ID0gcGFyZW50RGV2LT5tbF9wcml2OworCisgICAgLy9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ6ZDEyMTJfd2RzX3htaXRfZnJhbWU7CisgICAgdmFwW3ZhcElkXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ6ZkxueFZhcFhtaXRGcmFtZTsKKyAgICB2YXBbdmFwSWRdLmRldi0+b3BlbiA9ICZ6ZkxueFZhcE9wZW47CisgICAgdmFwW3ZhcElkXS5kZXYtPnN0b3AgPSAmemZMbnhWYXBDbG9zZTsKKyAgICB2YXBbdmFwSWRdLmRldi0+Z2V0X3N0YXRzID0gJnVzYmRydl9nZXRfc3RhdHM7CisgICAgdmFwW3ZhcElkXS5kZXYtPmNoYW5nZV9tdHUgPSAmdXNiZHJ2X2NoYW5nZV9tdHU7CisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgdmFwW3ZhcElkXS5kZXYtPmRvX2lvY3RsID0gdXNiZHJ2X2lvY3RsOworI2Vsc2UKKyAgICB2YXBbdmFwSWRdLmRldi0+ZG9faW9jdGwgPSBOVUxMOworI2VuZGlmCisgICAgdmFwW3ZhcElkXS5kZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworICAgIHZhcFt2YXBJZF0uZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzBdID0gcGFyZW50RGV2LT5kZXZfYWRkclswXTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbMV0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzFdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclsyXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbMl07CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzNdID0gcGFyZW50RGV2LT5kZXZfYWRkclszXTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbNF0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzRdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkcls1XSA9IHBhcmVudERldi0+ZGV2X2FkZHJbNV0gKyAodmFwSWQrMSk7CisKKyAgICAvKiBTdG9wIHRoZSBuZXR3b3JrIHF1ZXVlIGZpcnN0ICovCisgICAgbmV0aWZfc3RvcF9xdWV1ZSh2YXBbdmFwSWRdLmRldik7CisKKyAgICBzcHJpbnRmKHZhcFt2YXBJZF0uZGV2LT5uYW1lLCAidmFwJWQiLCB2YXBJZCk7CisgICAgcHJpbnRrKCJSZWdpc3RlciBWQVAgZGV2IHN1Y2Nlc3MgOiAlc1xuIiwgdmFwW3ZhcElkXS5kZXYtPm5hbWUpOworCisgICAgaWYocmVnaXN0ZXJfbmV0ZGV2aWNlKHZhcFt2YXBJZF0uZGV2KSAhPSAwKSB7CisgICAgICAgIHByaW50aygicmVnaXN0ZXIgVkFQIGRldmljZSBmYWlsXG4iKTsKKyAgICAgICAgdmFwW3ZhcElkXS5kZXYgPSBOVUxMOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmTG54VW5yZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHByaW50aygiVW5yZWdpc3RlciBWQVAgZGV2IDogJXNcbiIsIHZhcFt2YXBJZF0uZGV2LT5uYW1lKTsKKworICAgIGlmKHZhcFt2YXBJZF0uZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKCJVbnJlZ2lzdGVyIHZhcCBkZXY9JXhcbiIsICh1MzJfdCl2YXBbdmFwSWRdLmRldik7CisgICAgICAgIC8vCisgICAgICAgIC8vdW5yZWdpc3Rlcl9uZXRkZXZpY2Uod2RzW3dkc0lkXS5kZXYpOworICAgICAgICB1bnJlZ2lzdGVyX25ldGRldih2YXBbdmFwSWRdLmRldik7CisKKyAgICAgICAgcHJpbnRrKCJWQVAgdW5yZWdpc3Rlcl9uZXRkZXZpY2VcbiIpOworICAgICAgICB2YXBbdmFwSWRdLmRldiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludGsoInVucmVnaXN0ZXIgVkFQIGRldmljZTogJWQgZmFpbFxuIiwgdmFwSWQpOworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKworCisjICBkZWZpbmUgU1VCTUlUX1VSQih1LGYpICAgICAgIHVzYl9zdWJtaXRfdXJiKHUsZikKKyMgIGRlZmluZSBVU0JfQUxMT0NfVVJCKHUsZikgICAgdXNiX2FsbG9jX3VyYih1LGYpCisKKy8vZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKK2V4dGVybiBpbnQgdXNiZHJ2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitleHRlcm4gdm9pZCB1c2JkcnZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHVzYmRydl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitleHRlcm4gVXNiVHhRX3QgKnpmTG54R2V0VXNiVHhCdWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2ludCB6ZkxueEFsbG9jQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IG1hY3AtPmludGVyZmFjZTsKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1swXTsKKworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisgICAgaW50IGk7CisKKyAgICAvKiBkZXNjcmlwdG9yIG1hdGNoZXMsIGxldCdzIGZpbmQgdGhlIGVuZHBvaW50cyBuZWVkZWQgKi8KKyAgICAvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKKyAgICB7CisgICAgICAgIGVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisgICAgICAgIGlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgorICAgICAgICAgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWxrIGluOiB3TWF4UGFja2V0U2l6ZSA9ICV4XG4iLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGJ1bGsgb3V0IGVuZHBvaW50ICovCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImJ1bGsgb3V0OiB3TWF4UGFja2V0U2l6ZSA9ICV4XG4iLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgorICAgICAgICAgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIGEgaW50ZXJydXB0IGluIGVuZHBvaW50ICovCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBpbjogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBpbjogaW50X2ludGVydmFsID0gJWRcbiIsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIGEgaW50ZXJydXB0IG91dCBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgb3V0OiB3TWF4UGFja2V0U2l6ZSA9ICV4XG4iLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IG91dDogaW50X2ludGVydmFsID0gJWRcbiIsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYWxsIFR4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1RYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIG1hY3AtPldsYW5UeERhdGFVcmJbaV0gPSBVU0JfQUxMT0NfVVJCKDAsIEdGUF9LRVJORUwpOworCisgICAgICAgIGlmIChtYWNwLT5XbGFuVHhEYXRhVXJiW2ldID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICAvKiBGcmVlIGFsbCB1cmJzICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgUnggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgbWFjcC0+V2xhblJ4RGF0YVVyYltpXSA9IFVTQl9BTExPQ19VUkIoMCwgR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgaWYgKG1hY3AtPldsYW5SeERhdGFVcmJbaV0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIC8qIEZyZWUgYWxsIHVyYnMgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5SeERhdGFVcmJbal0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgWk1fTUFYX1RYX1VSQl9OVU07IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblR4RGF0YVVyYltqXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgUmVnaXN0ZXIgUmVhZC9Xcml0ZSBVU0IgKi8KKyAgICBtYWNwLT5SZWdPdXRVcmIgPSBVU0JfQUxMT0NfVVJCKDAsIEdGUF9LRVJORUwpOworICAgIG1hY3AtPlJlZ0luVXJiID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKworICAgIHJldHVybiAxOworfQorCit2b2lkIHpmTG54RnJlZUFsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIGludCBpOworCisgICAgLyogRnJlZSBhbGwgVHggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfVFhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPldsYW5UeERhdGFVcmJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5UeERhdGFVcmJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBhbGwgUnggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPldsYW5SeERhdGFVcmJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5SeERhdGFVcmJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBVU0IgUmVnaXN0ZXIgUmVhZC9Xcml0ZSBVUkIgKi8KKyAgICB1c2JfZnJlZV91cmIobWFjcC0+UmVnT3V0VXJiKTsKKyAgICB1c2JfZnJlZV91cmIobWFjcC0+UmVnSW5VcmIpOworfQorCit2b2lkIHpmTG54VW5saW5rQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisgICAgaW50IGk7CisKKyAgICAvKiBVbmxpbmsgYWxsIFR4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1RYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuVHhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl91bmxpbmtfdXJiKG1hY3AtPldsYW5UeERhdGFVcmJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVW5saW5rIGFsbCBSeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBpZiAobWFjcC0+V2xhblJ4RGF0YVVyYltpXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1c2JfdW5saW5rX3VyYihtYWNwLT5XbGFuUnhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVubGluayBVU0IgUmVnaXN0ZXIgUmVhZC9Xcml0ZSBVUkIgKi8KKyAgICB1c2JfdW5saW5rX3VyYihtYWNwLT5SZWdPdXRVcmIpOworCisgICAgdXNiX3VubGlua191cmIobWFjcC0+UmVnSW5VcmIpOworfQorCit1OF90IHpmTG54SW5pdFNldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyAgICAvL3Vuc2lnbmVkIGNoYXIgYWRkcls2XTsKKworICAgIC8vaW5pdF9NVVRFWCgmbWFjcC0+cHNfc2VtKTsKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPnJlZ19zZW0pOworICAgIC8vaW5pdF9NVVRFWCgmbWFjcC0+YmNuX3NlbSk7CisgICAgLy9pbml0X01VVEVYKCZtYWNwLT5jb25maWdfc2VtKTsKKworICAgIHNwaW5fbG9ja19pbml0KCYobWFjcC0+Y3NfbG9jaykpOworI2lmIDAKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoZGV2LCBhZGRyKTsKKyAgICBkZXYtPmRldl9hZGRyWzBdID0gYWRkclswXTsKKyAgICBkZXYtPmRldl9hZGRyWzFdID0gYWRkclsxXTsKKyAgICBkZXYtPmRldl9hZGRyWzJdID0gYWRkclsyXTsKKyAgICBkZXYtPmRldl9hZGRyWzNdID0gYWRkclszXTsKKyAgICBkZXYtPmRldl9hZGRyWzRdID0gYWRkcls0XTsKKyAgICBkZXYtPmRldl9hZGRyWzVdID0gYWRkcls1XTsKKyNlbmRpZgorI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisgICAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKKyNlbmRpZgorCisgICAgZGV2LT5vcGVuID0gdXNiZHJ2X29wZW47CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB1c2JkcnZfeG1pdF9mcmFtZTsKKyAgICBkZXYtPnN0b3AgPSB1c2JkcnZfY2xvc2U7CisgICAgZGV2LT5jaGFuZ2VfbXR1ID0gJnVzYmRydl9jaGFuZ2VfbXR1OworICAgIGRldi0+Z2V0X3N0YXRzID0gdXNiZHJ2X2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHVzYmRydl9zZXRfbXVsdGk7CisgICAgZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSB1c2JkcnZfc2V0X21hYzsKKyAgICBkZXYtPmRvX2lvY3RsID0gdXNiZHJ2X2lvY3RsOworCisgICAgZGV2LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOworCisgICAgZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IDB4MDM7CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IDB4N2Y7CisgICAgZGV2LT5kZXZfYWRkclszXSA9IDB4MTE7CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IDB4MjI7CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IDB4MzM7CisKKyAgICAvKiBJbml0aWFsaXplIEhlYXJ0IEJlYXQgdGltZXIgKi8KKyAgICBpbml0X3RpbWVyKCZtYWNwLT5oYlRpbWVyMTBtcyk7CisgICAgbWFjcC0+aGJUaW1lcjEwbXMuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKyAgICBtYWNwLT5oYlRpbWVyMTBtcy5mdW5jdGlvbiA9ICh2b2lkICopJnpmTG54MTBtc1RpbWVyOworCisgICAgLyogSW5pdGlhbGl6ZSBXRFMgYW5kIFZBUCBkYXRhIHN0cnVjdHVyZSAqLworICAgIC8vemZJbml0V2RzU3RydWN0KCk7CisgICAgemZMbnhJbml0VmFwU3RydWN0KCk7CisKKyAgICByZXR1cm4gMTsKK30KKwordThfdCB6ZkxueENsZWFyU3RydWN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHUxNl90IGlpOworICAgIHUxNl90IFR4UUNudDsKKworICAgIFR4UUNudCA9IHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpOworCisgICAgcHJpbnRrKEtFUk5fRVJSICJUeFFDbnQ6ICVkXG4iLCBUeFFDbnQpOworCisgICAgZm9yKGlpID0gMDsgaWkgPCBUeFFDbnQ7IGlpKyspCisgICAgeworICAgICAgICBVc2JUeFFfdCAqVHhRID0gemZMbnhHZXRVc2JUeEJ1ZmZlcihkZXYpOworCisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGV2X2tmcmVlX3NrYl9hbnlcbiIpOworICAgICAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShUeFEtPmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWIzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogdXNiZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG5ldHdvcmsgaW50ZXJmYWNlIHVwL2Rvd24gcmVsYXRlZCBkZWZpbml0aW9uKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9VU0JEUlZfSAorI2RlZmluZSBfVVNCRFJWX0gKKworI2RlZmluZSBXTEFOX1VTQiAgICAwCisjZGVmaW5lIFdMQU5fUENJICAgIDEKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgInpkY29tcGF0LmgiCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJvYWxfbWFyYy5oIgorI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfemZpLmgiCisvLyNpbmNsdWRlICJwdWJfemZ3LmgiCisjaW5jbHVkZSAiODAyMTFjb3JlL3B1Yl91c2IuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorLyogUGxlYXNlIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZvciBkZXZpY2UgdHlwZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZmlsZSAqLworI2RlZmluZSB1cmJfdCAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVyYgorCisjZGVmaW5lIHVzYl9jb21wbGV0ZV90ICAgICAgICAgICAgICB1c2JfY29tcGxldGVfdAorI2RlZmluZSBwaXBlX3QgICAgICAgICAgICAgICAgICAgICAgdTMyX3QKKworLyogVVNCIEVuZHBvaW50IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVVNCX1dMQU5fVFhfUElQRSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBVU0JfV0xBTl9SWF9QSVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFVTQl9SRUdfSU5fUElQRSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVVNCX1JFR19PVVRfUElQRSAgICAgICAgICAgICAgICAgICAgNAorCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2VuZGlmCisKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyNpbmNsdWRlICJhdGhyX2NvbW1vbi5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioJCURlc2NyaXB0b3IgRGF0YSBTdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBkcml2ZXJfc3RhdHMgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKK307CisKKyNkZWZpbmUgWk1fTUFYX1JYX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgODE5MgorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyNkZWZpbmUgWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0gICAgICAgICAgICAgNAorI2RlZmluZSBaTV9VU0JfVFhfQlVGX1NJWkUgICAgICAgICAgICAgICAgICA4MDk2CisjZGVmaW5lIFpNX01BWF9UWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDQKKyNlbHNlCisjZGVmaW5lIFpNX1VTQl9UWF9CVUZfU0laRSAgICAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgWk1fTUFYX1RYX1VSQl9OVU0gICAgICAgICAgICAgICAgICAgOAorI2VuZGlmCisjZGVmaW5lIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX01BWF9SWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFpNX01BWF9UWF9CVUZfTlVNICAgICAgICAgICAgICAgICAgIDEyOAorCit0eXBlZGVmIHN0cnVjdCBVc2JUeFEKK3sKKyAgICB6YnVmX3QgKmJ1ZjsKKyAgICB1OF90IGhkcls4MF07CisgICAgdTE2X3QgaGRybGVuOworICAgIHU4X3Qgc25hcFs4XTsKKyAgICB1MTZfdCBzbmFwTGVuOworICAgIHU4X3QgdGFpbFsxNl07CisgICAgdTE2X3QgdGFpbExlbjsKKyAgICB1MTZfdCBvZmZzZXQ7Cit9IFVzYlR4UV90OworCisKK3N0cnVjdCB6ZGFwX2lvY3RsIHsKKwl1MTZfdCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdTMyX3QgYWRkcjsgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLworCXUzMl90IHZhbHVlOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1OF90CWRhdGFbMHgxMDBdOworfTsKKworI2RlZmluZSBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUIDE2CisKK3N0cnVjdCB1c2JkcnZfcHJpdmF0ZQoreworCS8vbGludXggdXNlZAorCXN0cnVjdCBuZXRfZGV2aWNlIAkqZGV2aWNlOworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKKwlzdHJ1Y3QgcGNpX2RldiAJCSpwZGV2OworI2VuZGlmCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQorCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICAgICppbnRlcmZhY2U7CisjZW5kaWYKKwlzdHJ1Y3QgZHJpdmVyX3N0YXRzIGRydl9zdGF0czsKKwljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisJaW50CSAgICAgICAgICAgICAgICB1c2luZ19kYWM7CisJdThfdAkJCXJldl9pZDsJCS8qIGFkYXB0ZXIgUENJIHJldmlzaW9uIElEICovCisJcndsb2NrX3QgCQlpc29sYXRlX2xvY2s7CisgICAgc3BpbmxvY2tfdCAgICAgIGNzX2xvY2s7CisJaW50IAkJCWRyaXZlcl9pc29sYXRlZDsKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisJdm9pZAkJCSpyZWdwOworI2VuZGlmCisKKyAgICAgICAgLyogdGltZXIgZm9yIGhlYXJ0IGJlYXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBoYlRpbWVyMTBtczsKKworCS8qIEZvciBkcml2ZXIgY29yZSAqLworCXZvaWQqIHdkOworCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQorCXU4X3QgICAgICAgICAgICAgICAgICAgIHR4VXNiQnVmW1pNX01BWF9UWF9VUkJfTlVNXVtaTV9VU0JfVFhfQlVGX1NJWkVdOworCXU4X3QgICAgICAgICAgICAgICAgICAgIHJlZ1VzYlJlYWRCdWZbWk1fVVNCX1JFR19NQVhfQlVGX1NJWkVdOworCXU4X3QgICAgICAgICAgICAgICAgICAgIHJlZ1VzYldyaXRlQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKKwl1cmJfdAkJCSpXbGFuVHhEYXRhVXJiW1pNX01BWF9UWF9VUkJfTlVNXTsKKwl1cmJfdAkJCSpXbGFuUnhEYXRhVXJiW1pNX01BWF9SWF9VUkJfTlVNXTsKKwl1cmJfdAkJCSpSZWdPdXRVcmI7CisJdXJiX3QJCQkqUmVnSW5VcmI7CisJVXNiVHhRX3QgICAgICAgICAgICAgICAgVXNiVHhCdWZRW1pNX01BWF9UWF9CVUZfTlVNXTsKKwl6YnVmX3QgICAgICAgICAgICAgICAgICAqVXNiUnhCdWZRW1pNX01BWF9SWF9VUkJfTlVNXTsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZIZWFkOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZlRhaWw7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmQ250OworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYkhlYWQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiVGFpbDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJDbnQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmSGVhZDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZUYWlsOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZkNudDsKKyNlbmRpZgorCisjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKKyAgICAgICAgemJ1Zl90ICAgICAgICAgICAgICAgICAgKnJlYW1pbl9idWY7CisjZW5kaWYKKworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgICAgICBzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICBhdGhyX3dwYV9yZXE7CisjZW5kaWYKKyAgICAgICAgc3RydWN0IHNvY2sgICAgICAgICAgICAgKm5ldGxpbmtfc2s7CisgICAgICAgIHU4X3QgICAgICAgICAgICBEZXZpY2VPcGVuZWQ7IC8vQ1dZYW5nKCspCisgICAgICAgIHU4X3QgICAgICAgICAgICBzdXBJZVs1MF07CisgICAgICAgIHU4X3QgICAgICAgICAgICBzdXBMZW47CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUgc3Rhd3BhaWVbWk1fT0FMX01BWF9TVEFfU1VQUE9SVF07CisgICAgICAgIHU4X3QgICAgICAgICAgICBmb3J3YXJkTWdtdDsKKworICAgICAgICBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgdXNiQ2JGdW5jdGlvbnM7CisKKyAgICAgICAgLyogRm9yIGtldmVudGQgKi8KKyAgICAgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGtldmVudF9mbGFnczsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAga2V2ZW50X3JlYWR5OworCisgICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgIGlvY3RsX3NlbTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICAgICAga2V2ZW50OworICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0X3F1ZXVlX2V2ZW50OworI2lmZGVmIFpNX0hBTFBMVVNfTE9DSworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBoYWxfaXJxRmxhZzsKKyNlbmRpZgorICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhZGFwdGVyU3RhdGU7Cit9OworCisvKiBXRFMgKi8KKyNkZWZpbmUgWk1fV0RTX1BPUlRfTlVNQkVSICA2CisKK3N0cnVjdCB6c1dkc1N0cnVjdAoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgdTE2X3Qgb3BlbkZsYWc7Cit9OworCisvKiBWQVAgKi8KKyNkZWZpbmUgWk1fVkFQX1BPUlRfTlVNQkVSICA3CisKK3N0cnVjdCB6c1ZhcFN0cnVjdAoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgdTE2X3Qgb3BlbkZsYWc7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19SRUFECQkJMHgwMQorI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUJCQkweDAyCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9EVU1QCQkJMHgwMworI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUAkJCTB4MDUKKyNkZWZpbmUgWk1fSU9DVExfVFhEX0RVTVAgCQkJMHgwNgorI2RlZmluZSBaTV9JT0NUTF9SWERfRFVNUCAJCQkweDA3CisjZGVmaW5lIFpNX0lPQ1RMX01FTV9SRUFECQkJMHgwQgorI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUJCQkweDBDCisjZGVmaW5lIFpNX0lPQ1RMX0RNQV9URVNUICAgICAgICAgICAweDEwCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUICAgICAgICAgICAweDExCisjZGVmaW5lIFpNX0lPQ1RMX1RFU1QgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFpNX0lPQ1RMX1RBTExZICAgICAgICAgICAgICAweDgxIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1JUUyAgICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIFpNX0lPQ1RMX01JWF9NT0RFICAgICAgICAgICAweEExCisjZGVmaW5lIFpNX0lPQ1RMX0ZSQUcgICAgICAgICAgICAgICAweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4gICAgICAgICAgICAgICAweEEzCisjZGVmaW5lIFpNX0lPQ1RMX0tFWSAgICAgICAgICAgICAgICAweEE0CisjZGVmaW5lIFpNX0lPQ1RMX1JBVEUgICAgICAgICAgICAgICAweEE1CisjZGVmaW5lIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSAgICAweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVCAgICAgICAgICAweEE3CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQgICAgICAweEE4CisjZGVmaW5lIFpNX0lPQ1RMX0RVUkFUSU9OX01PREUgICAgICAweEE5CisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfS0VZICAgICAgICAweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERSAgICAgICAweEFCCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9TVFJFTkdUSCAgICAweEFDIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NJR05BTF9RVUFMSVRZICAgICAweEFEIC8vQ1dZYW5nKCspCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFICAgICAweEFFCisKKyNkZWZpbmUJWkRBUElPQ1RMCQkJCVNJT0NERVZQUklWQVRFCisKK2VudW0gZGV2U3RhdGUgeworICAgIE9wZW5lZCwKKyAgICBFbmFibGVkLAorICAgIERpc2FibGVkLAorICAgIENsb3NlZAorfTsKKworI2VuZGlmCS8qIF9VU0JEUlZfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ5NmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9idWYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBidWZmZXIgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisKKworLyogQ2FsbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciwgbXVzdCByZXR1cm4gYSBjb250aW51ZSBidWZmZXIgc3BhY2UgKi8KK3pidWZfdCogemZ3QnVmQWxsb2NhdGUoemRldl90KiBkZXYsIHUxNl90IGxlbikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKworICAgIC8qIEFsbG9jYXRlIFNLQiBmb3IgcGFja2V0Ki8KKyAgICBidWYgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKyAgICByZXR1cm4gYnVmOworfQorCisKKy8qIENhbGxlZCB0byBmcmVlIGJ1ZmZlciwgcmVwbGFjZSBiZWxvdyAzIGZ1bmN0aW9ucyAqLwordm9pZCB6ZndCdWZGcmVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc3RhdHVzKQoreworICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7Cit9CisKKy8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIGhlYWQgcG9pbnRlciAqLwordTE2X3QgemZ3QnVmUmVtb3ZlSGVhZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit7CisgICAgLy96bV9hc3NlcnQoYnVmLT5sZW4gPiBzaXplKTsKKworICAgIGJ1Zi0+ZGF0YSArPSBzaXplOworICAgIGJ1Zi0+bGVuIC09IHNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKy8qIHJldHVybiB0YWlsIGlmIGhlYWQ9PU5VTEwsIGNhbGxlZCB0byBjaGFpbiBtdWx0aXBsZSBidWZmZXIgdG9nZXRoZXIgKi8KKy8qIFVzZWQgdG8gY2hhaW4gUnggYnVmZmVyIHRvIGZvcm0gYSBmcmFtZS4gaWYgdGhlIHByZXBhcmVkIFJ4IGJ1ZmZlciAgKi8KKy8qIGlzIGdyZWF0ZXIgdGhhbiBhbiBldGhlcm5ldCBmcmFtZSgxNTE4KzMyIGJ5dGUpLCB0aGVuIHRoaXMgZnVuY3Rpb24gICAgKi8KKy8qIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCBoZWFkPU5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3UxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCogZGV2LCB6YnVmX3QqKiBoZWFkLCB6YnVmX3QqIHRhaWwpCit7CisKKyAgICAqaGVhZCA9IHRhaWw7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIHdoZW4gZG9pbmcgaW5mcmEtYnNzIGZvcndhcmRpbmcgKi8KK3UxNl90IHpmd0J1ZkNvcHkoemRldl90KiBkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYykKK3sKKyAgICBtZW1jcHkoZHN0LT5kYXRhLCBzcmMtPmRhdGEsIHNyYy0+bGVuKTsKKyAgICBkc3QtPnRhaWwgPSBkc3QtPmRhdGE7CisgICAgc2tiX3B1dChkc3QsIHNyYy0+bGVuKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBDYWxsZWQgdG8gYWRqdXN0IGJ1ZmZlciBzaXplIGFuZCB0YWlsIHBvaW50ZXIgKi8KK3UxNl90IHpmd0J1ZlNldFNpemUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzaXplKQoreworI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorICAgIGJ1Zi0+dGFpbCA9IDA7CisgICAgYnVmLT5sZW4gPSAwOworI2Vsc2UKKyAgICBidWYtPnRhaWwgPSBidWYtPmRhdGE7CisgICAgYnVmLT5sZW4gPSAwOworI2VuZGlmCisKKyAgICBza2JfcHV0KGJ1Ziwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmd0J1ZkdldFNpemUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHJldHVybiBidWYtPmxlbjsKK30KKwordm9pZCB6ZndDb3B5QnVmQ29udGV4dCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBzb3VyY2UsIHpidWZfdCogZHN0KQoreworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3NjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9kYmcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBkZWJ1ZyBmdW5jdGlvbnMgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKwordm9pZCB6ZndEdW1wQnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yIChpPTA7IGk8YnVmLT5sZW47IGkrKykKKyAgICB7CisgICAgICAgIHByaW50aygiJTAyeCAiLCAqKCgodThfdCopYnVmLT5kYXRhKStpKSk7CisgICAgICAgIGlmICgoaSYweGYpPT0weGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcmludGsoIlxuIik7Cit9CisKKwordm9pZCB6ZndEYmdSZWFkUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHByaW50aygiUmVhZCBhZGRyOiV4ID0gJXhcbiIsIGFkZHIsIHZhbCk7Cit9CisKK3ZvaWQgemZ3RGJnV3JpdGVSZWdEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgcHJpbnRrKCJXcml0ZSBhZGRyOiV4ID0gJXhcbiIsIGFkZHIsIHZhbCk7Cit9CisKK3ZvaWQgemZ3RGJnUmVhZFRhbGx5RG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICAvL3ByaW50aygiUmVhZCBUYWxsIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ1dyaXRlRWVwcm9tRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworfQorCit2b2lkIHpmd0RiZ1F1ZXJ5SHdUeEJ1c3lEb25lKHpkZXZfdCogZGV2LCB1MzJfdCB2YWwpCit7Cit9CisKKy8vRm9yIEV2bCArKwordm9pZCB6ZndEYmdSZWFkRmxhc2hEb25lKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogcnNwZGF0YSwgdTMyX3QgZGF0YWxlbikKK3sKKyAgICBwcmludGsoIlJlYWQgRmxhc2ggYWRkcjoleCBsZW5ndGg6JXhcbiIsIGFkZHIsIGRhdGFsZW4pOworfQorCit2b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hEb25lKHpkZXZfdCogZGV2KQoreworICAgIHByaW50aygiUHJvZ3JhbSBGbGFzaCBEb25lXG4iKTsKK30KKwordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7Cit9CisKK3ZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwZGF0YSkKK3sKKyAgICBwcmludGsoIkdldCBGbGFzaCBDaGtTdW0gRG9uZVxuIik7Cit9CisKK3ZvaWQgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKHpkZXZfdCogZGV2KQoreworICAgIHByaW50aygiRG93bmxvYWQgRlcgSW5pdCBEb25lXG4iKTsKK30KKy8vRm9yIEV2bCAtLQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmI3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfZXYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBldmVudHMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworCisvKioqKiogTWFuYWdlbWVudCAqKioqKi8KK3UxNl90IHpmTG54QXV0aE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmTG54QXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQoreworLy8jaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKyAgICB1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKyAgICB1MTZfdCBpLCBqOworCisgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOworICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgImpvaW5fZXZlbnQgb2YgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisgICAgZm9yKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgSUVFRTgwMjExX0FERFJfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHJbal0gIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX21hY2FkZHJbal0gIT0gYWRkcltqXSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gNikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQpCisgICAgeworICAgICAgICAvL3ByaW50aygiemZ3QXNvY05vdGlmeSAtIHN0b3JlIHdwYSBpZSBpbiBtYWNwLCBpbmRleCA9ICVkXG4iLCBpKTsKKyAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyLCBtYWNBZGRyLCBJRUVFODAyMTFfQUREUl9MRU4pOworICAgICAgICBtZW1jcHkobWFjcC0+c3Rhd3BhaWVbaV0ud3BhX2llLCBib2R5LCBib2R5U2l6ZSk7CisgICAgfQorICAgIC8vaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBJTkZSQVNUUlVDVFVSRV9CU1MpIHsKKyAgICAvLyAgICAgICAgICAgIC8vd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7CisgICAgLy8gICAgd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdBUCwgJndyZXEsIE5VTEwpOworICAgIC8vfQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorICAgIC8vZWxzZSBpZihtYWNwLT5jYXJkU2V0dGluZy5Cc3NUeXBlID09IEFQX0JTUykgeworLy8gICAgICAgIGlmIChwb3J0ID09IDApCisvLyAgICAgICAgeworICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisvLyAgICAgICAgfQorLy8gICAgICAgIGVsc2UKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIFZBUCBkZXZpY2UgaXMgdmFsaWQgKi8KKy8vICAgICAgICAgICAgaWYgKHZhcFtwb3J0XS5kZXYgIT0gTlVMTCkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudCh2YXBbcG9ydF0uZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICAgIGVsc2UKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9CisgICAgLy99CisjZW5kaWYKKy8vI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiBOb3RpZmljYXRpb24gdGhhdCBhIFNUQSBpcyBkaXNhc3NvY2lhdGVkIGZyb20gQVAgKi8KKy8qIEFQIG1vZGUgb25seSAqLwordTE2X3QgemZMbnhEaXNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKyAgICB1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndEaXNBc29jTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgU1RBIGlzIGNvbm5lY3QgdG8gQVAgKi8KKy8qIEFQIG1vZGUgb25seSAqLwordTE2X3QgemZMbnhBcENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOworICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCisgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOworICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInpmd0FwQ29ubmVjdE5vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisKKworICAgIHJldHVybiAwOworfQorCisKKwordm9pZCB6ZkxueENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKyAgICB1OF90ICphZGRyID0gKHU4X3QgKikgYnNzaWQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKGJzc2lkICE9IE5VTEwpCisgICAgeworICAgICAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCisgICAgICAgICAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIGJzc2lkLCBFVEhfQUxFTik7CisgICAgICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkKKyAgICAgICAgeworI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBhZGRyWzFdLCBhZGRyWzBdLCBhZGRyWzNdLCBhZGRyWzJdLCBhZGRyWzVdLCBhZGRyWzRdKTsKKyNlbHNlCisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKyNlbmRpZgorCisgICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpIHx8CisgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEKSB8fAorICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX0RJU0FCTEVEKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfUkVTRVQpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEgpIHx8CisJICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ESVNBU09DKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MpIHx8CisgICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJEaXNjb25uZWN0aW9uIE5vdGlmeVxuIik7CisKKyAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgfQorCisJLyogU2F2ZSB0aGUgY29ubmVjdGVkIHN0YXR1cyAqLworCW1hY3AtPmFkYXB0ZXJTdGF0ZSA9IHN0YXR1czsKKworICAgICAgICBpZih6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHsKKyAgICAgICAgLy8gICAgICAgICAgICAvL3dpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOworICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdBUCwgJndyZXEsIE5VTEwpOworICAgICAgICB9CisjaWYgV0lSRUxFU1NfRVhUID49IDE1CisgICAgICAgIGVsc2UgaWYoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgICAgICAvL2lmIChwb3J0ID09IDApCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIFZBUCBkZXZpY2UgaXMgdmFsaWQgKi8KKyAgICAgICAgICAgIC8vICAgIGlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudCh2YXBbcG9ydF0uZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy8gICAgZWxzZQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwgcG9ydDogJWRcbiIsIHBvcnQpOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICAvL3JldHVybiAwOworfQorCit2b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KQoreworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkxueFN0YXRpc3RpY3NOb3RpZnkoemRldl90KiBkZXYsIHN0cnVjdCB6c1N0YXN0aWNzKiByZXN1bHQpCit7CisgICAgcmV0dXJuOworfQorCisvL3ZvaWQgemZ3TWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWVzc2FnZSwgdTE2X3QgZXZlbnQpCit2b2lkIHpmTG54TWljRmFpbHVyZU5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqdGFnID0gIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiI7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgYnVmWzEyOF07CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIHR5cGUsIHNyYyBhZGRyZXNzICovCisJLy9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoJXNjYXN0IGFkZHI9JXMpIiwgdGFnLAorCS8vICAgIChzdGF0dXMgPT0gWk1fTUlDX0dST1VQX0VSUk9SKSA/ICAiYnJvYWQiIDogInVuaSIsCisJLy8gICAgZXRoZXJfc3ByaW50ZigodThfdCAqKWFkZHIpKTsKKworCWlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisJeworCQlzdHJjcHkoYnVmLCB0YWcpOworCX0KKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworfQorCisKK3ZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIGFkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcE1pY0ZhaWx1cmVOb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisgICAgcmV0dXJuOworfQorCisvLyBzdGF0dXMgPSAwICA9PiBwYXJ0bmVyIGxvc3QKKy8vICAgICAgICA9IDEgID0+IHBhcnRuZXIgYWxpdmUKKy8vdm9pZCB6ZndJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCit2b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCkKK3sKK30KKwordm9pZCB6ZkxueE1hY0FkZHJlc3NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpCit7CisgICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisgICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07Cit9CisKK3ZvaWQgemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKK30KKworCit2b2lkIHpmTG54UmVzdG9yZUJ1ZkRhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKSB7CisKK30KKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgxYmIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX21lbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisvKiBNZW1vcnkgbWFuYWdlbWVudCAqLworLyogQ2FsbGVkIHRvIGFsbG9jYXRlIHVuY2FjaGVkIG1lbW9yeSwgYWxsb2NhdGVkIG1lbW9yeSBtdXN0ICAgICovCisvKiBpbiA0LWJ5dGUgYm91bmRhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQqIHpmd01lbUFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MzJfdCBzaXplKQoreworICAgIHZvaWQqIG1lbSA9IE5VTEw7CisgICAgbWVtID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKyAgICByZXR1cm4gbWVtOworfQorCisKKy8qIENhbGxlZCB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KK3ZvaWQgemZ3TWVtRnJlZSh6ZGV2X3QqIGRldiwgdm9pZCogbWVtLCB1MzJfdCBzaXplKQoreworICAgIGtmcmVlKG1lbSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmd01lbW9yeUNvcHkodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCkKK3sKKyAgICAvL3UxNl90IGk7CisKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisgICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIC8veworICAgIC8vICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAvL30KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZ3WmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKQoreworICAgIC8vdTE2X3QgaTsKKyAgICBtZW1zZXQodmEsIDAsIGxlbmd0aCk7CisgICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIC8veworICAgIC8vICAgIHZhW2ldID0gMDsKKyAgICAvL30KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZ3TWVtb3J5TW92ZSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKKyAgICByZXR1cm47Cit9CisKK3U4X3QgemZ3TWVtb3J5SXNFcXVhbCh1OF90KiBtMSwgdThfdCogbTIsIHUxNl90IGxlbmd0aCkKK3sKKyAgICAvL3UxNl90IGk7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IG1lbWNtcChtMSwgbTIsIGxlbmd0aCk7CisKKyAgICByZXR1cm4gKChyZXQ9PTApP1RSVUU6RkFMU0UpOworICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAvL3sKKyAgICAvLyAgICBpZiAoIG0xW2ldICE9IG0yW2ldICkKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvLyAgICB9CisgICAgLy99CisKKyAgICAvL3JldHVybiBUUlVFOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3OTE4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfbWlzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgbWlzYyBmdW5jdGlvbnMgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKy8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKK2V4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CisKKy8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCit1MTZfdCB6ZndHZXRWYXBJZCh6ZGV2X3QqIGRldikKK3sKKyAgICByZXR1cm4gemZMbnhHZXRWYXBJZChkZXYpOworfQorCit2b2lkIHpmd1NsZWVwKHpkZXZfdCogZGV2LCB1MzJfdCBtcykKK3sKKyAgICBpZiAoaW5faW50ZXJydXB0KCkgPT0gMCkKKyAgICB7CisgICAgICAgIG1kZWxheShtcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpaTsKKyAgICAgICAgaW50IGl0ZXIgPSAxMDAwMDAgKiBtczsKKworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBpdGVyOyBpaSsrKQorICAgICAgICB7CisKKyAgICAgICAgfQorICAgIH0KK30KKworI2lmZGVmIFpNX0hBTFBMVVNfTE9DSworYXNtbGlua2FnZSBzdHJ1Y3QgenNXbGFuRGV2ICp6ZndHZXRXbGFuRGV2KHpkZXZfdCogZGV2KQoreworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlyZXR1cm4gbWFjcC0+d2Q7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIG1hY3AtPmhhbF9pcnFGbGFnKTsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKHpkZXZfdCogZGV2KQoreworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7Cit9CisKK2FzbWxpbmthZ2UgdThfdCB6ZndCdWZSZWFkQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpOworfQorCithc21saW5rYWdlIHUxNl90IHpmd0J1ZlJlYWRIYWxmV29yZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gem13X2NwdV90b19sZTE2KCoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkpOworfQorCithc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVCeXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IHZhbHVlKQoreworICAgICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHZhbHVlOworfQorCithc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVIYWxmV29yZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFsdWUpCit7CisgICAgKih1MTZfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSk7Cit9CisKK2FzbWxpbmthZ2UgdThfdCAqemZ3R2V0QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICByZXR1cm4gKHU4X3QqKShidWYtPmRhdGEpOworfQorI2VuZGlmCisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIwMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9wa3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBwYWNrZXQgaGFuZGxpbmcgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworCisKKy8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKK2V4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CisKKworLyoqKioqIFJ4ICoqKioqLwordm9pZCB6ZkxueFJlY3Y4MDIxMSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1MTZfdCBmcmFtZVR5cGU7CisgICAgdTE2X3QgZnJhbWVDdHJsOworICAgIHUxNl90IGZyYW1lU3VidHlwZTsKKyAgICB6YnVmX3QgKnNrYjE7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLy9mcmFtZUN0cmwgPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICBmcmFtZUN0cmwgPSAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhKTsKKyAgICBmcmFtZVR5cGUgPSBmcmFtZUN0cmwgJiAweGY7CisgICAgZnJhbWVTdWJ0eXBlID0gZnJhbWVDdHJsICYgMHhmMDsKKworICAgIGlmICgoZnJhbWVUeXBlID09IDB4MCkgJiYgKG1hY3AtPmZvcndhcmRNZ210KSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoZnJhbWVTdWJ0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQmVhY29uICovCisgICAgICAgICAgICBjYXNlIDB4ODAgOgorICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlc3BvbnNlICovCisgICAgICAgICAgICBjYXNlIDB4NTAgOgorICAgICAgICAgICAgICAgIHNrYjEgPSBza2JfY29weShidWYsIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgIGlmKHNrYjEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNrYjEtPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICAgICAgc2tiMS0+bWFjX2hlYWRlciA9IHNrYjEtPmRhdGE7CisJICAgICAgICAgICAgc2tiMS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkgICAgICAgICAgICBza2IxLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJICAgICAgICAgICAgc2tiMS0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKDB4MDAxOSk7ICAvKiBFVEhfUF84MDIxMV9SQVcgKi8KKyAgICAJICAgICAgICAgICAgbmV0aWZfcngoc2tiMSk7CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisgICAgcmV0dXJuOworfQorCisjZGVmaW5lIFpNX0FWT0lEX1VEUF9MQVJHRV9QQUNLRVRfRkFJTAordm9pZCB6ZkxueFJlY3ZFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyNpZmRlZiBaTV9BVk9JRF9VRFBfTEFSR0VfUEFDS0VUX0ZBSUwKKyAgICB6YnVmX3QgKm5ld19idWY7CisKKyAgICAvL25ld19idWYgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOworICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKGJ1Zi0+bGVuKTsKKworI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorICAgIG5ld19idWYtPnRhaWwgPSAwOworICAgIG5ld19idWYtPmxlbiA9IDA7CisjZWxzZQorICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOworICAgIG5ld19idWYtPmxlbiA9IDA7CisjZW5kaWYKKworICAgIHNrYl9wdXQobmV3X2J1ZiwgYnVmLT5sZW4pOworICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCBidWYtPmRhdGEsIGJ1Zi0+bGVuKTsKKworICAgIC8qIEZyZWUgYnVmZmVyICovCisgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKworICAgIGlmIChwb3J0ID09IDApCisgICAgeworICAgICAgICBuZXdfYnVmLT5kZXYgPSBkZXY7CisgICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVkFQICovCisgICAgICAgIGlmICh2YXBbMF0uZGV2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19idWYtPmRldiA9IHZhcFswXS5kZXY7CisgICAgICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIHZhcFswXS5kZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgbmV3X2J1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisgICAgc3dpdGNoKG5ldGlmX3J4KG5ld19idWYpKQorI2Vsc2UKKyAgICBpZiAocG9ydCA9PSAwKQorICAgIHsKKyAgICAgICAgYnVmLT5kZXYgPSBkZXY7CisgICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFZBUCAqLworICAgICAgICBpZiAodmFwWzBdLmRldiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBidWYtPmRldiA9IHZhcFswXS5kZXY7CisgICAgICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCB2YXBbMF0uZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisgICAgc3dpdGNoKG5ldGlmX3J4KGJ1ZikpCisjZW5kaWYKKyAgICB7CisgICAgY2FzZSBORVRfUlhfQkFEOgorICAgIGNhc2UgTkVUX1JYX0RST1A6CisgICAgY2FzZSBORVRfUlhfQ05fTU9EOgorICAgIGNhc2UgTkVUX1JYX0NOX0hJR0g6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gYnVmLT5sZW47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODhkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX3NlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIENFTkMuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKK2V4dGVybiBpbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbik7CisKK3UxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSAoc3RydWN0IHVzYmRydl9wcml2YXRlICopZGV2LT5wcml2OworICAgIHN0cnVjdCB6eWRhc19jZW5jX3N0YV9pbmZvIGNlbmNfaW5mbzsKKyAgICAvL3N0cnVjdCBzb2NrICpuZXRsaW5rX3NrOworICAgIHU4X3QgaWVfbGVuOworICAgIGludCBpaTsKKworICAgIC8qIENyZWF0ZSBORVRMSU5LIHNvY2tldCAqLworICAgIC8vbmV0bGlua19zayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1VTRVJTT0NLLCBOVUxMKTsKKworICAgIGlmIChtYWNwLT5uZXRsaW5rX3NrID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIk5FVExJTksgU29ja2V0IGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtc2V0KCZjZW5jX2luZm8sIDAsIHNpemVvZihjZW5jX2luZm8pKTsKKworICAgIC8vbWVtY3B5KGNlbmNfaW5mby5nc24sIHZhcC0+aXZfY2VuY21za19rZXlzLndrX3R4aXYsIFpNX0NFTkNfSVZfTEVOKTsKKyAgICB6ZmlXbGFuUXVlcnlHU04oZGV2LCBjZW5jX2luZm8uZ3NuLCBwb3J0KTsKKyAgICBjZW5jX2luZm8uZGF0YWxlbiArPSBaTV9DRU5DX0lWX0xFTjsKKyAgICBpZV9sZW4gPSBib2R5WzFdICsgMjsKKyAgICBtZW1jcHkoY2VuY19pbmZvLndpZSwgYm9keSwgaWVfbGVuKTsKKyAgICBjZW5jX2luZm8uZGF0YWxlbiArPSBpZV9sZW47CisKKyAgICBtZW1jcHkoY2VuY19pbmZvLnN0YV9tYWMsIG1hY0FkZHIsIDYpOworICAgIGNlbmNfaW5mby5tc2dfdHlwZSA9IFpNX0NFTkNfV0FJX1JFUVVFU1Q7CisgICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gNiArIDI7CisKKyAgICBwcmludGsoS0VSTl9FUlIgIj09PT09IHpmd0NlbmNTZW5kTXNnLCBib2R5U2l6ZTogJWQgPT09PT1cbiIsIGJvZHlTaXplKTsKKworICAgIGZvcihpaSA9IDA7IGlpIDwgYm9keVNpemU7IGlpKyspCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiUwMnggIiwgYm9keVtpaV0pOworCisgICAgICAgIGlmICgoaWkgJiAweGYpID09IDB4ZikKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgemZMbnhDZW5jU2VuZE1zZyhtYWNwLT5uZXRsaW5rX3NrLCAodThfdCAqKSZjZW5jX2luZm8sIGNlbmNfaW5mby5kYXRhbGVuKzQpOworCisgICAgLyogQ2xvc2UgTkVUTElOSyBzb2NrZXQgKi8KKyAgICAvL3NvY2tfcmVsZWFzZShuZXRsaW5rX3NrKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwordThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QqIGRldiwgdThfdCAqcFdJRWMsCisgICAgICAgIHU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgcmV0dXJuIFpNX0VOQ1JZUFRJT05fRVhFTVBUX05PX0VYRU1QVElPTjsKK30KKwordm9pZCBjb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQorICAgIHsKKyAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CisgICAgICAgICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0K2kpID0gc3JjW2ldOworICAgIH0KK30KKwordTE2X3QgemZ3U3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAvL3ptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIGFkZCB3cGFpZSBjb250ZW50IExlbmd0aCA6ICIsIG1hY3AtPnN1cEllWzFdKTsKKyAgICBpZiAobWFjcC0+c3VwSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIGNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBtYWNwLT5zdXBJZSwgb2Zmc2V0LCBtYWNwLT5zdXBJZVsxXSsyKTsKKyAgICAgICAgLy9tZW1jcHkoYnVmLT5kYXRhW29mZnNldF0sIG1hY3AtPnN1cEllLCBtYWNwLT5zdXBJZVsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChtYWNwLT5zdXBJZVsxXSsyKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3NmU1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfdXNiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgVVNCIG1hbmFnZW1lbnQgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHpmTG54SW5pdFVzYlR4USh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZkxueEluaXRVc2JSeFEoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwordTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAorICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3UzMl90IHpmTG54VXNiV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbik7CisKK3ZvaWQgemZ3VXNiUmVnaXN0ZXJDYWxsQmFjayh6ZGV2X3QqIGRldiwgc3RydWN0IHpmQ2JVc2JGdW5jVGJsICp6ZlVzYkZ1bmMpIHsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlY3Y7CisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlZ0luID0gemZVc2JGdW5jLT56ZmNiVXNiUmVnSW47CisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlID0gemZVc2JGdW5jLT56ZmNiVXNiT3V0Q29tcGxldGU7CisKKyAgICByZXR1cm47Cit9CisKK3UzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MzJfdCAgICAgICAgZnJlZVR4UVNpemU7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBmcmVlVHhRU2l6ZSA9IFpNX01BWF9UWF9CVUZfTlVNIC0gbWFjcC0+VHhCdWZDbnQ7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICByZXR1cm4gZnJlZVR4UVNpemU7Cit9CisKK3UzMl90IHpmd1VzYkdldE1heFR4UVNpemUoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIFpNX01BWF9UWF9CVUZfTlVNOworfQorCit1MzJfdCB6ZndVc2JFbmFibGVJbnRFcHQoemRldl90ICpkZXYsIHU4X3QgZW5kcHQpCit7CisgICAgLyogSW5pdGlhbGl6ZSBVU0IgVHhRICovCisgICAgemZMbnhJbml0VXNiVHhRKGRldik7CisKKyAgICAvKiBJbml0aWFsaXplIFVTQiBSeFEgKi8KKyAgICB6ZkxueEluaXRVc2JSeFEoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemUgVVNCIFJlZ2lzdGVyIEluIFVSQiAqLworICAgIC8vemZ3VXNiU3VibWl0UmVnSW4oZGV2KTsKKyAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KKyAgICB6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmd1VzYkVuYWJsZVJ4RXB0KHpkZXZfdCogZGV2LCB1OF90IGVuZHB0KQoreworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZndVc2JTdWJtaXRDb250cm9sKHpkZXZfdCogZGV2LCB1OF90IHJlcSwgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIHUzMl90IHJldCA9IDA7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QqIGJ1ZjsKKworICAgIGlmIChzaXplID4gMCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIG1lbWNweShidWYsICh1OF90KilkYXRhLCBzaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICB9CisKKyNpZiAwCisgICAgcHJpbnRrKEtFUk5fRVJSICJyZXEgPSAweCUwMnhcbiIsIHJlcSk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJ2YWx1ZSA9IDB4JTA0eFxuIiwgdmFsdWUpOworICAgIHByaW50ayhLRVJOX0VSUiAiaW5kZXggPSAweCUwNHhcbiIsIGluZGV4KTsKKyAgICBwcmludGsoS0VSTl9FUlIgImRhdGEgPSAweCVseFxuIiwgKHUzMl90KSBkYXRhKTsKKyAgICBwcmludGsoS0VSTl9FUlIgInNpemUgPSAlbGRcbiIsIHNpemUpOworI2VuZGlmCisKKyAgICByZXN1bHQgPSB1c2JfY29udHJvbF9tc2cobWFjcC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKG1hY3AtPnVkZXYsIDApLAorICAgICAgICAgICAgcmVxLCBVU0JfRElSX09VVCB8IDB4NDAsIHZhbHVlLCBpbmRleCwgYnVmLCBzaXplLCBIWik7CisKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICB7CisgICAgICAgIHByaW50aygiemZ3VXNiU3VibWl0Q29udHJvbCgpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsIHJlc3VsdCk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorICAgIGtmcmVlKGJ1Zik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MzJfdCByZXQ7CisKKyAgICAvL01QVXNiQ29tbWFuZChkZXYsIGVuZHB0LCBjbWQsIGNtZExlbik7CisgICAgcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKKworICAgIC8qIGlmIHpmTG54VXNiV3JpdGVSZWcoKSByZXR1cm4gZXJyb3IsIGZyZWUgYW5kIGFsbG9jYXRlIHVyYiwgcmVzZW5kIGFnYWluICovCisgICAgaWYgKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ091dFVyYik7CisgICAgICAgIG1hY3AtPlJlZ091dFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisgICAgICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7CisgICAgfQorfQorCit1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHUzMl90IHN0YXR1czsKKworI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCisgICAgdTMyX3QgaWkgPSAwOworICAgIHUxNl90ICpwYyA9IE5VTEw7CisKKyAgICBwYyA9ICh1MTZfdCAqKWhkcjsKKyAgICBmb3IoaWk9MDsgaWk8KGhkcmxlbj4+MSk7IGlpKyspCisgICAgeworICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOworICAgIH0KKworICAgIHBjID0gKHUxNl90ICopc25hcDsKKyAgICBmb3IoaWk9MDsgaWk8KHNuYXBMZW4+PjEpOyBpaSsrKQorICAgIHsKKyAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKKyAgICB9CisKKyAgICBwYyA9ICh1MTZfdCAqKXRhaWw7CisgICAgZm9yKGlpPTA7IGlpPCh0YWlsTGVuPj4xKTsgaWkrKykKKyAgICB7CisgICAgICAgIHBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBzdGF0dXMgPSB6ZkxueFVzYk91dChkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCk7CisgICAgaWYgKCBzdGF0dXMgPT0gMCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3dyYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3d3cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNWY1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3d3cmFwLmMKQEAgLTAsMCArMSwxMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHd3cmFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFBsZWFzZSBpbmNsdWRlIHlvdXIgaGVhZGVyIGZpbGVzIGhlcmUgKi8KKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCB6ZmlSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOworZXh0ZXJuIHZvaWQgemZDb3JlUmVjdih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdm9pZCB6ZklkbENoa1JzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKK2V4dGVybiB2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCAqcnNwLCB1MTZfdCByc3BMZW4pOworCisKKworLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKKwordTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpOwordTMyX3QgemZMbnhVc2JJbih6ZGV2X3QqIGRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpOwordTMyX3QgemZMbnhTdWJtaXRSZWdJblVyYih6ZGV2X3QgKmRldik7Cit1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKKyAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpOwordTMyX3QgemZMbnhVc2JTdWJtaXRJbnRVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKKyAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCisgICAgICAgIHUzMl90IGludGVydmFsKTsKKwordTE2X3QgemZMbnhHZXRGcmVlVHhVcmIoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICAvL2lkeCA9ICgobWFjcC0+VHhVcmJUYWlsICsgMSkgJiAoWk1fTUFYX1RYX1VSQl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhVcmJIZWFkKQorICAgIGlmIChtYWNwLT5UeFVyYkNudCAhPSAwKQorICAgIHsKKyAgICAgICAgaWR4ID0gbWFjcC0+VHhVcmJUYWlsOworICAgICAgICBtYWNwLT5UeFVyYlRhaWwgPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworICAgICAgICBtYWNwLT5UeFVyYkNudC0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibWFjcC0+VHhVcmJDbnQ6ICVkXG4iLCBtYWNwLT5UeFVyYkNudCk7CisgICAgICAgIGlkeCA9IDB4ZmZmZjsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gaWR4OworfQorCit2b2lkIHpmTG54UHV0VHhVcmIoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZHggPSAoKG1hY3AtPlR4VXJiSGVhZCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4VXJiVGFpbCkKKyAgICBpZiAobWFjcC0+VHhVcmJDbnQgPCBaTV9NQVhfVFhfVVJCX05VTSkKKyAgICB7CisgICAgICAgIG1hY3AtPlR4VXJiSGVhZCA9IGlkeDsKKyAgICAgICAgbWFjcC0+VHhVcmJDbnQrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVc2JUeFVyYlEgaW5jb25zaXN0ZW50OiBUeFVyYkhlYWQ6ICVkLCBUeFVyYlRhaWw6ICVkXG4iLAorICAgICAgICAgICAgICAgIG1hY3AtPlR4VXJiSGVhZCwgbWFjcC0+VHhVcmJUYWlsKTsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKK30KKwordTE2X3QgemZMbnhDaGVja1R4QnVmZmVyQ250KHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBUeEJ1ZkNudDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBUeEJ1ZkNudCA9IG1hY3AtPlR4QnVmQ250OworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIFR4QnVmQ250OworfQorCitVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgaWR4OworICAgIFVzYlR4UV90ICpUeFE7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhCdWZUYWlsKQorICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA+IDApCisgICAgeworICAgICAgICAvL3ByaW50aygiQ1dZIC0gemZ3R2V0VXNiVHhCdWZmZXIgLG1hY3AtPlR4QnVmQ250ID0gJWRcbiIsIG1hY3AtPlR4QnVmQ250KTsKKyAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZIZWFkXSk7CisgICAgICAgIG1hY3AtPlR4QnVmSGVhZCA9ICgobWFjcC0+VHhCdWZIZWFkKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOworICAgICAgICBtYWNwLT5UeEJ1ZkNudC0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAobWFjcC0+VHhCdWZIZWFkICE9IG1hY3AtPlR4QnVmVGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZndHZXRVc2JUeEJ1ZiBVc2JUeEJ1ZlEgaW5jb25zaXN0ZW50OiBUeEJ1ZkhlYWQ6ICVkLCBUeEJ1ZlRhaWw6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCk7CisgICAgICAgIH0KKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIFR4UTsKK30KKwordTE2X3QgemZMbnhQdXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sCisgICAgICAgIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCisgICAgICAgIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICBVc2JUeFFfdCAqVHhROworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlkeCA9ICgobWFjcC0+VHhCdWZUYWlsKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOworCisgICAgLyogRm9yIFR4IGRlYnVnICovCisgICAgLy96bV9hc3NlcnQobWFjcC0+VHhCdWZDbnQgPj0gMCk7IC8vIGRlbGV0ZWQgYmVjYXVzZSBvZiBhbHdheXMgdHJ1ZQorCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmSGVhZCkKKyAgICBpZiAobWFjcC0+VHhCdWZDbnQgPCBaTV9NQVhfVFhfQlVGX05VTSkKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOworICAgICAgICBUeFEgPSAoVXNiVHhRX3QgKikmKG1hY3AtPlVzYlR4QnVmUVttYWNwLT5UeEJ1ZlRhaWxdKTsKKyAgICAgICAgbWVtY3B5KFR4US0+aGRyLCBoZHIsIGhkcmxlbik7CisgICAgICAgIFR4US0+aGRybGVuID0gaGRybGVuOworICAgICAgICBtZW1jcHkoVHhRLT5zbmFwLCBzbmFwLCBzbmFwTGVuKTsKKyAgICAgICAgVHhRLT5zbmFwTGVuID0gc25hcExlbjsKKyAgICAgICAgbWVtY3B5KFR4US0+dGFpbCwgdGFpbCwgdGFpbExlbik7CisgICAgICAgIFR4US0+dGFpbExlbiA9IHRhaWxMZW47CisgICAgICAgIFR4US0+YnVmID0gYnVmOworICAgICAgICBUeFEtPm9mZnNldCA9IG9mZnNldDsKKworICAgICAgICBtYWNwLT5UeEJ1ZlRhaWwgPSAoKG1hY3AtPlR4QnVmVGFpbCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+VHhCdWZDbnQrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZkxueFB1dFVzYlR4QnVmZmVyIFVzYlR4QnVmUSBpbmNvbnNpc3RlbnQ6IFR4QnVmSGVhZDogJWQsIFR4QnVmVGFpbDogJWQsIFR4QnVmQ250OiAlZFxuIiwKKyAgICAgICAgICAgIG1hY3AtPlR4QnVmSGVhZCwgbWFjcC0+VHhCdWZUYWlsLCBtYWNwLT5UeEJ1ZkNudCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiAwOworfQorCit6YnVmX3QgKnpmTG54R2V0VXNiUnhCdWZmZXIoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIC8vdTE2X3QgaWR4OworICAgIHpidWZfdCAqYnVmOworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIC8vaWR4ID0gKChtYWNwLT5SeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+UnhCdWZUYWlsKQorICAgIGlmIChtYWNwLT5SeEJ1ZkNudCAhPSAwKQorICAgIHsKKyAgICAgICAgYnVmID0gbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmSGVhZF07CisgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOworICAgICAgICBtYWNwLT5SeEJ1ZkNudC0tOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmludGsoIlJ4QnVmUSBpbmNvbnNpc3RlbnQ6IFJ4QnVmSGVhZDogJWQsIFJ4QnVmVGFpbDogJWRcbiIsCisgICAgICAgICAgICAgICAgbWFjcC0+UnhCdWZIZWFkLCBtYWNwLT5SeEJ1ZlRhaWwpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKwordTMyX3QgemZMbnhQdXRVc2JSeEJ1ZmZlcih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZHggPSAoKG1hY3AtPlJ4QnVmVGFpbCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZkhlYWQpCisgICAgaWYgKG1hY3AtPlJ4QnVmQ250ICE9IFpNX01BWF9SWF9VUkJfTlVNKQorICAgIHsKKyAgICAgICAgbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmVGFpbF0gPSBidWY7CisgICAgICAgIG1hY3AtPlJ4QnVmVGFpbCA9IGlkeDsKKyAgICAgICAgbWFjcC0+UnhCdWZDbnQrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJSeEJ1ZlEgaW5jb25zaXN0ZW50OiBSeEJ1ZkhlYWQ6ICVkLCBSeEJ1ZlRhaWw6ICVkXG4iLAorICAgICAgICAgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZMbnhVc2JEYXRhT3V0X2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgLy9Vc2JUeFFfdCAqVHhEYXRhOworCisgICAgLyogR2l2ZSB0aGUgdXJiIGJhY2sgKi8KKyAgICB6ZkxueFB1dFR4VXJiKGRldik7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBwZW5kaW5nIGJ1ZmZlciBuZWVkZWQgKi8KKyAgICAvKiB0byBiZSBzZW50ICovCisgICAgaWYgKHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpICE9IDApCisgICAgeworICAgICAgICAvL1R4RGF0YSA9IHpmd0dldFVzYlR4QnVmZmVyKGRldik7CisKKyAgICAgICAgLy9pZiAoVHhEYXRhID09IE5VTEwpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBwcmludGsoIkdldCBhIE5VTEwgYnVmZmVyIGZyb20gemZ3R2V0VXNiVHhCdWZmZXJcbiIpOworICAgICAgICAvLyAgICByZXR1cm47CisgICAgICAgIC8vfQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgLy97CisgICAgICAgICAgICB6ZkxueFVzYlN1Ym1pdFR4RGF0YShkZXYpOworICAgICAgICAvL30KKyAgICB9Cit9CisKK3ZvaWQgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKK3sKKyAgICB6ZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgemJ1Zl90ICpidWY7CisgICAgemJ1Zl90ICpuZXdfYnVmOworICAgIGludCBzdGF0dXM7CisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgIHN0YXRpYyBpbnQgcmVtYWluX2xlbiA9IDAsIGNoZWNrX3BhZCA9IDAsIGNoZWNrX2xlbiA9IDA7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICBpbnQgY2hrX2lkeDsKKyAgICB1MTZfdCBwa3RfbGVuOworICAgIHUxNl90IHBrdF90YWc7CisgICAgdTE2X3QgaWk7CisgICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CisgICAgdTE2X3QgcnhCdWZQb29sSW5kZXggPSAwOworI2VuZGlmCisKKyAgICAvKiBDaGVjayBzdGF0dXMgZm9yIFVSQiAqLworICAgIGlmICh1cmItPnN0YXR1cyAhPSAwKXsKKyAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCisgICAgICAgICAgICAmJiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOworCisgICAgICAgIC8qIERlcXVldWUgc2tiIGJ1ZmZlciAqLworICAgICAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisgICAgICAgICNpZiAwCisgICAgICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLworICAgICAgICB6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgYnVmKTsKKworICAgICAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KKyAgICAgICAgemZMbnhVc2JJbihkZXYsIHVyYiwgYnVmKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkdldCBhbiBVUkIgd2hvc2UgbGVuZ3RoIGlzIHplcm8iKTsKKyAgICAgICAgc3RhdHVzID0gLTE7CisgICAgfQorCisgICAgLyogRGVxdWV1ZSBza2IgYnVmZmVyICovCisgICAgYnVmID0gemZMbnhHZXRVc2JSeEJ1ZmZlcihkZXYpOworCisgICAgLy96ZndCdWZTZXRTaXplKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorICAgIGJ1Zi0+dGFpbCA9IDA7CisgICAgYnVmLT5sZW4gPSAwOworI2Vsc2UKKyAgICBidWYtPnRhaWwgPSBidWYtPmRhdGE7CisgICAgYnVmLT5sZW4gPSAwOworI2VuZGlmCisKKyAgICBpZiAoKGJ1Zi0+dGFpbCArIHVyYi0+YWN0dWFsX2xlbmd0aCkgPiBidWYtPmVuZCkKKyAgICAgICAgQlVHKCk7CisKKyAgICBza2JfcHV0KGJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCisgICAgaWYgKHJlbWFpbl9sZW4gIT0gMCkKKyAgICB7CisgICAgICAgIHpidWZfdCAqcmVtYWluX2J1ZiA9IG1hY3AtPnJlYW1pbl9idWY7CisKKyAgICAgICAgaW5kZXggPSByZW1haW5fbGVuOworICAgICAgICByZW1haW5fbGVuIC09IGNoZWNrX3BhZDsKKworICAgICAgICAvKiAgQ29weSBkYXRhICovCisgICAgICAgIG1lbWNweSgmKHJlbWFpbl9idWYtPmRhdGFbY2hlY2tfbGVuXSksIGJ1Zi0+ZGF0YSwgcmVtYWluX2xlbik7CisgICAgICAgIGNoZWNrX2xlbiArPSByZW1haW5fbGVuOworICAgICAgICByZW1haW5fbGVuID0gMDsKKworICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSByZW1haW5fYnVmOworICAgIH0KKworICAgIHdoaWxlKGluZGV4IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcGt0X2xlbiA9IGJ1Zi0+ZGF0YVtpbmRleF0gKyAoYnVmLT5kYXRhW2luZGV4KzFdIDw8IDgpOworICAgICAgICBwa3RfdGFnID0gYnVmLT5kYXRhW2luZGV4KzJdICsgKGJ1Zi0+ZGF0YVtpbmRleCszXSA8PCA4KTsKKworICAgICAgICBpZiAocGt0X3RhZyA9PSAweDRlMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwYWRfbGVuOworCisgICAgICAgICAgICAvL3ByaW50aygiR2V0IGEgcGFja2V0LCBpbmRleDogJWQsIHBrdF9sZW46IDB4JTA0eFxuIiwgaW5kZXgsIHBrdF9sZW4pOworICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgIC8qIER1bXAgZGF0YSAqLworICAgICAgICAgICAgZm9yIChpaSA9IGluZGV4OyBpaSA8IHBrdF9sZW4rNDspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIChidWYtPmRhdGFbaWldICYgMHhmZikpOworCisgICAgICAgICAgICAgICAgaWYgKCgrK2lpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIHBhZF9sZW4gPSA0IC0gKHBrdF9sZW4gJiAweDMpOworCisgICAgICAgICAgICBpZihwYWRfbGVuID09IDQpCisgICAgICAgICAgICAgICAgcGFkX2xlbiA9IDA7CisKKyAgICAgICAgICAgIGNoa19pZHggPSBpbmRleDsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyA0ICsgcGt0X2xlbiArIHBhZF9sZW47CisKKyAgICAgICAgICAgIGlmIChpbmRleCA+IFpNX01BWF9SWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW1haW5fbGVuID0gaW5kZXggLSBaTV9NQVhfUlhfQlVGRkVSX1NJWkU7IC8vIC0gcGFkX2xlbjsKKyAgICAgICAgICAgICAgICBjaGVja19sZW4gPSBaTV9NQVhfUlhfQlVGRkVSX1NJWkUgLSBjaGtfaWR4IC0gNDsKKyAgICAgICAgICAgICAgICBjaGVja19wYWQgPSBwYWRfbGVuOworCisgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICAgICAgLy9uZXdfYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgc2tiIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgICAgICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gMDsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBza2JfcHV0KG5ld19idWYsIHBrdF9sZW4pOworCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld19idWYtPmRhdGEsICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pLCBjaGVja19sZW4pOworCisgICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgIG1hY3AtPnJlYW1pbl9idWYgPSBuZXdfYnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAjaWZkZWYgWk1fRE9OVF9DT1BZX1JYX0JVRkZFUgorICAgICAgICAgICAgICAgIGlmIChyeEJ1ZlBvb2xJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2J1ZiA9IHNrYl9jbG9uZShidWYsIEdGUF9BVE9NSUMpOworCisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmRhdGEgPSAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gcGt0X2xlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBza2IgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSAwOworICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOworICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IDA7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHNrYl9wdXQobmV3X2J1ZiwgcGt0X2xlbik7CisKKyAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgJihidWYtPmRhdGFbY2hrX2lkeCs0XSksIHBrdF9sZW4pOworCisgICAgICAgICNpZmRlZiBaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisgICAgICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSBuZXdfYnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIHRhZywgcGt0X2xlbjogMHglMDR4LCB0YWc6IDB4JTA0eFxuIiwgcGt0X2xlbiwgcGt0X3RhZyk7CisKKyAgICAgICAgICAgIC8qIEZyZWUgYnVmZmVyICovCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG5ld19idWYpOworCisgICAgICAgICAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KKyAgICAgICAgICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIG5ld19idWYpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisjZW5kaWYKKworICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisKKyAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICB6ZkxueFB1dFVzYlJ4QnVmZmVyKGRldiwgbmV3X2J1Zik7CisKKyAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KKyAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBuZXdfYnVmKTsKKworI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCisgICAgZm9yKGlpID0gMDsgaWkgPCByeEJ1ZlBvb2xJbmRleDsgaWkrKykKKyAgICB7CisgICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2KGRldiwgcnhCdWZQb29sW2lpXSk7CisgICAgfQorI2Vsc2UKKyAgICAvKiBwYXNzIGRhdGEgdG8gdXBwZXIgbGF5ZXIgKi8KKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdihkZXYsIGJ1Zik7CisjZW5kaWYKK30KKwordm9pZCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjayh1cmJfdCAqdXJiKQoreworICAgIC8vZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKworICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ6ZndVc2JSZWdPdXRfY2FsbGJhY2tcbiIpOworfQorCit2b2lkIHpmTG54VXNiUmVnSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKK3sKKyAgICB6ZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKKyAgICB1MzJfdCByc3BbNjQvNF07CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBDaGVjayBzdGF0dXMgZm9yIFVSQiAqLworICAgIGlmICh1cmItPnN0YXR1cyAhPSAwKXsKKyAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYlJlZ0luX2NhbGxiYWNrKCkgOiBzdGF0dXM9MHgleFxuIiwgdXJiLT5zdGF0dXMpOworICAgICAgICBpZiAoKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQpICYmICh1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKKyAgICAgICAgICAgICYmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8peworICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBST1RPIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJ1cmItPnN0YXR1czogMHglMDh4XG4iLCB1cmItPnN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkdldCBhbiBVUkIgd2hvc2UgbGVuZ3RoIGlzIHplcm8iKTsKKyAgICAgICAgc3RhdHVzID0gLTE7CisgICAgfQorCisgICAgLyogQ29weSBkYXRhIGludG8gcmVzcG9uZSBidWZmZXIgKi8KKyAgICBtZW1jcHkocnNwLCBtYWNwLT5yZWdVc2JSZWFkQnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisgICAgLyogTm90aWZ5IHRvIHVwcGVyIGxheWVyICovCisgICAgLy96ZklkbENoa1JzcChkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CisgICAgLy96ZmlVc2JSZWdJbihkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlZ0luKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworICAgIC8qIElzc3VlIGFub3RoZXIgVVNCIElOIFVSQiAqLworICAgIHpmTG54U3VibWl0UmVnSW5VcmIoZGV2KTsKK30KKwordTMyX3QgemZMbnhTdWJtaXRSZWdJblVyYih6ZGV2X3QgKmRldikKK3sKKyAgICB1MzJfdCByZXQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogU3VibWl0IGEgcnggdXJiICovCisgICAgLy9yZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIobWFjcC0+UmVnSW5VcmIsIG1hY3AtPnVkZXYsCisgICAgLy8gICAgICAgIFVTQl9SRUdfSU5fUElQRSwgVVNCX0RJUl9JTiwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwKKyAgICAvLyAgICAgICAgWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUsIHpmTG54VXNiUmVnSW5fY2FsbGJhY2ssIGRldik7CisgICAgLy9DV1lhbmcoLSkKKyAgICAvL2lmIChyZXQgIT0gMCkKKyAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKKworICAgIHJldCA9IHpmTG54VXNiU3VibWl0SW50VXJiKG1hY3AtPlJlZ0luVXJiLCBtYWNwLT51ZGV2LAorICAgICAgICAgICAgVVNCX1JFR19JTl9QSVBFLCBVU0JfRElSX0lOLCBtYWNwLT5yZWdVc2JSZWFkQnVmLAorICAgICAgICAgICAgWk1fVVNCX1JFR19NQVhfQlVGX1NJWkUsIHpmTG54VXNiUmVnSW5fY2FsbGJhY2ssIGRldiwgMSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkxueFVzYlN1Ym1pdFR4RGF0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBpOworICAgIHUzMl90IHJldDsKKyAgICB1MTZfdCBmcmVlVHhVcmI7CisgICAgdThfdCAqcHVUeEJ1ZiA9IE5VTEw7CisgICAgVXNiVHhRX3QgKlR4RGF0YTsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICB1OF90ICAgICAgICAgICAgICAgaWk7CisgICAgdTE2X3QgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgdTE2X3QgICAgICAgICAgICAgIHVzYlR4QWdnQ250OworICAgIHUxNl90ICAgICAgICAgICAgICAqcFVzYlR4SGRyOworICAgIFVzYlR4UV90ICAgICAgICAgICAqVHhRUG9vbFtaTV9NQVhfVFhfQUdHUkVHQVRFX05VTV07CisjZW5kaWYKKworICAgIC8qIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBmcmVlIFVSQiAqLworICAgIGZyZWVUeFVyYiA9IHpmTG54R2V0RnJlZVR4VXJiKGRldik7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBubyBhbnkgZnJlZSBUeCBVcmIgKi8KKyAgICBpZiAoZnJlZVR4VXJiID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBnZXQgZnJlZSBUeCBVcmJcbiIpOworICAgICAgICAvL3ByaW50aygiQ1dZIC0gQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIHVzYlR4QWdnQ250ID0gemZMbnhDaGVja1R4QnVmZmVyQ250KGRldik7CisKKyAgICBpZiAodXNiVHhBZ2dDbnQgPj0gWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0pCisgICAgeworICAgICAgIHVzYlR4QWdnQ250ID0gWk1fTUFYX1RYX0FHR1JFR0FURV9OVU07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgdXNiVHhBZ2dDbnQgPSAxOworICAgIH0KKworICAgIC8vcHJpbnRrKCJ1c2JUeEFnZ0NudDogJWRcbiIsIHVzYlR4QWdnQ250KTsKKyNlbmRpZgorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQorICAgIHsKKyNlbmRpZgorICAgIC8qIERlcXVldWUgdGhlIHBhY2tldCBmcm9tIFVzYlR4QnVmUSAqLworICAgIFR4RGF0YSA9IHpmTG54R2V0VXNiVHhCdWZmZXIoZGV2KTsKKyAgICBpZiAoVHhEYXRhID09IE5VTEwpCisgICAgeworICAgICAgICAvKiBHaXZlIHRoZSB1cmIgYmFjayAqLworICAgICAgICB6ZkxueFB1dFR4VXJiKGRldik7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisgICAgLyogUG9pbnQgdG8gdGhlIGZyZWVUeFVyYiBidWZmZXIgKi8KKyAgICBwdVR4QnVmID0gbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXTsKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgcHVUeEJ1ZiArPSBvZmZzZXQ7CisgICAgcFVzYlR4SGRyID0gKHUxNl90ICopcHVUeEJ1ZjsKKworICAgIC8qIEFkZCB0aGUgcGFja2V0IGxlbmd0aCBhbmQgdGFnIGluZm9ybWF0aW9uICovCisgICAgKnBVc2JUeEhkcisrID0gVHhEYXRhLT5oZHJsZW4gKyBUeERhdGEtPnNuYXBMZW4gKworICAgICAgICAgICAgIChUeERhdGEtPmJ1Zi0+bGVuIC0gVHhEYXRhLT5vZmZzZXQpICsgIFR4RGF0YS0+dGFpbExlbjsKKworICAgICpwVXNiVHhIZHIrKyA9IDB4Njk3ZTsKKworICAgIHB1VHhCdWYgKz0gNDsKKyNlbmRpZiAvLyAjaWZkZWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFCisKKyAgICAvKiBDb3B5IFdMQU4gaGVhZGVyIGFuZCBwYWNrZXQgYnVmZmVyIGludG8gVVNCIGJ1ZmZlciAqLworICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+aGRybGVuOyBpKyspCisgICAgeworICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT5oZHJbaV07CisgICAgfQorCisgICAgLyogQ29weSBTTkFQIGhlYWRlciAqLworICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+c25hcExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+c25hcFtpXTsKKyAgICB9CisKKyAgICAvKiBDb3B5IHBhY2tldCBidWZmZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPmJ1Zi0+bGVuIC0gVHhEYXRhLT5vZmZzZXQ7IGkrKykKKyAgICB7CisgICAgCS8vKnB1VHhCdWYrKyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBUeERhdGEtPmJ1ZiwgaSk7CisgICAgCSpwdVR4QnVmKysgPSAqKHU4X3QqKSgodThfdCopVHhEYXRhLT5idWYtPmRhdGEraStUeERhdGEtPm9mZnNldCk7CisgICAgfQorCisgICAgLyogQ29weSB0YWlsICovCisgICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT50YWlsTGVuOyBpKyspCisgICAgeworICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT50YWlsW2ldOworICAgIH0KKworICAgIGxlbiA9IFR4RGF0YS0+aGRybGVuK1R4RGF0YS0+c25hcExlbitUeERhdGEtPmJ1Zi0+bGVuK1R4RGF0YS0+dGFpbExlbi1UeERhdGEtPm9mZnNldDsKKworICAgICNpZiAwCisgICAgaWYgKFR4RGF0YS0+aGRybGVuICE9IDApCisgICAgeworICAgICAgICBwdVR4QnVmID0gbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIiUwMnggIiwgcHVUeEJ1ZltpXSk7CisgICAgICAgICAgICBpZiAoaSAlIDE2ID09IDE1KQorICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoIlxuIik7CisgICAgfQorICAgICNlbmRpZgorICAgICNpZiAwCisgICAgLyogRm9yIGRlYnVnIHB1cnBvc2UgKi8KKyAgICBpZihUeERhdGEtPmhkcls5XSAmIDB4NDApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgdTE2X3QgY3RybExlbiA9IFR4RGF0YS0+aGRyWzBdICsgKFR4RGF0YS0+aGRyWzFdIDw8IDgpOworCisgICAgICAgIGlmIChjdHJsTGVuICE9IGxlbiArIDQpCisgICAgICAgIHsKKyAgICAgICAgLyogRHVtcCBjb250cm9sIHNldHRpbmcgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCBUeERhdGEtPmhkcltpXSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3RyTGVuOiAlZCwgaGRyTGVuOiAlZCwgc25hcExlbjogJWRcbiIsIGN0cmxMZW4sIFR4RGF0YS0+aGRybGVuLCBUeERhdGEtPnNuYXBMZW4pOworICAgICAgICBwcmludGsoS0VSTl9FUlIgImJ1ZkxlbjogJWQsIHRhaWxMZW46ICVkLCBsZW46ICVkXG4iLCBUeERhdGEtPmJ1Zi0+bGVuLCBUeERhdGEtPnRhaWxMZW4sIGxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgI2VuZGlmCisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIC8vIEFkZCB0aGUgTGVuZ3RoIGFuZCBUYWcKKyAgICBsZW4gKz0gNDsKKworICAgIC8vcHJpbnRrKCIlZCBwYWNrZXQsIGxlbmd0aDogJWRcbiIsIGlpKzEsIGxlbik7CisKKyAgICBpZiAoaWkgPCAoWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0tMSkpCisgICAgeworICAgICAgICAvKiBQYWQgdGhlIGJ1ZmZlciB0byBmaXJtd2FyZSBkZXNjcmlwdG9yIGJvdW5kYXJ5ICovCisgICAgICAgIG9mZnNldCArPSAoKChsZW4tMSkgLyA0KSArIDEpICogNDsKKyAgICB9CisKKyAgICBpZiAoaWkgPT0gKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQorICAgIHsKKyAgICAgICAgbGVuICs9IG9mZnNldDsKKyAgICB9CisKKyAgICBUeFFQb29sW2lpXSA9IFR4RGF0YTsKKworICAgIC8vRGJnUHJpbnQoIiVkIHBhY2tldCwgb2Zmc2V0OiAlZFxuIiwgaWkrMSwgcFVzYlR4VHJhbnNmZXItPm9mZnNldCk7CisKKyAgICAvKiBmcmVlIHBhY2tldCAqLworICAgIC8vemZCdWZGcmVlKGRldiwgdHhEYXRhLT5idWYpOworICAgIH0KKyNlbmRpZgorICAgIC8vcHJpbnRrKCJDV1kgLSBjYWxsIHpmd1VzYlN1Ym1pdEJ1bGtVcmIoKSwgbGVuID0gMHglZFxuIiwgbGVuKTsKKyAgICAvKiBTdWJtaXQgYSB0eCB1cmIgKi8KKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIobWFjcC0+V2xhblR4RGF0YVVyYltmcmVlVHhVcmJdLCBtYWNwLT51ZGV2LAorICAgICAgICAgICAgVVNCX1dMQU5fVFhfUElQRSwgVVNCX0RJUl9PVVQsIG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl0sCisgICAgICAgICAgICBsZW4sIHpmTG54VXNiRGF0YU91dF9jYWxsYmFjaywgZGV2KTsKKyAgICAvL0NXWWFuZygtKQorICAgIC8vaWYgKHJldCAhPSAwKQorICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOworCisgICAgLyogZnJlZSBwYWNrZXQgKi8KKyAgICAvL2Rldl9rZnJlZV9za2JfYW55KFR4RGF0YS0+YnVmKTsKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIGZvcihpaSA9IDA7IGlpIDwgdXNiVHhBZ2dDbnQ7IGlpKyspCisgICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIFR4UVBvb2xbaWldLT5idWYsIDEsIFR4UVBvb2xbaWldLT5oZHIpOworI2Vsc2UKKyAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeERhdGEtPmJ1ZiwgMSwgVHhEYXRhLT5oZHIpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCisKKwordTMyX3QgemZMbnhVc2JJbih6ZGV2X3QqIGRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpCit7CisgICAgdTMyX3QgcmV0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIFN1Ym1pdCBhIHJ4IHVyYiAqLworICAgIHJldCA9IHpmTG54VXNiU3VibWl0QnVsa1VyYih1cmIsIG1hY3AtPnVkZXYsIFVTQl9XTEFOX1JYX1BJUEUsCisgICAgICAgICAgICBVU0JfRElSX0lOLCBidWYtPmRhdGEsIFpNX01BWF9SWF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgIHpmTG54VXNiRGF0YUluX2NhbGxiYWNrLCBkZXYpOworICAgIC8vQ1dZYW5nKC0pCisgICAgLy9pZiAocmV0ICE9IDApCisgICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUzMl90IHJldDsKKworI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCisgICAgaW50IGlpID0gMDsKKworICAgIGZvcihpaT0wOyBpaTwoY21kTGVuPj4yKTsgaWkrKykKKwljbWRbaWldID0gY3B1X3RvX2xlMzIoY21kW2lpXSk7CisjZW5kaWYKKworICAgIG1lbWNweShtYWNwLT5yZWdVc2JXcml0ZUJ1ZiwgY21kLCBjbWRMZW4pOworCisgICAgLyogSXNzdWUgYW4gVVNCIE91dCB0cmFuc2ZlciAqLworICAgIC8qIFN1Ym1pdCBhIHR4IHVyYiAqLworICAgIHJldCA9IHpmTG54VXNiU3VibWl0SW50VXJiKG1hY3AtPlJlZ091dFVyYiwgbWFjcC0+dWRldiwKKyAgICAgICAgICAgIFVTQl9SRUdfT1VUX1BJUEUsIFVTQl9ESVJfT1VULCBtYWNwLT5yZWdVc2JXcml0ZUJ1ZiwKKyAgICAgICAgICAgIGNtZExlbiwgemZMbnhVc2JSZWdPdXRfY2FsbGJhY2ssIGRldiwgMSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3UzMl90IHpmTG54VXNiT3V0KHpkZXZfdCogZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MzJfdCByZXQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogQ2hlY2sgbGVuZ3RoIG9mIHRhaWwgYnVmZmVyICovCisgICAgLy96bV9hc3NlcnQoKHRhaWxMZW4gPD0gMTYpKTsKKworICAgIC8qIEVucXVldWUgdGhlIHBhY2tldCBpbnRvIFVzYlR4QnVmUSAqLworICAgIGlmICh6ZkxueFB1dFVzYlR4QnVmZmVyKGRldiwgaGRyLCBoZHJsZW4sIHNuYXAsIHNuYXBMZW4sIHRhaWwsIHRhaWxMZW4sIGJ1Ziwgb2Zmc2V0KSA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBmcmVlIHBhY2tldCAqLworICAgICAgICAvL3ByaW50aygiQ1dZIC0gemZ3UHV0VXNiVHhCdWZmZXIgRXJyb3IsIGZyZWUgcGFja2V0XG4iKTsKKyAgICAgICAgLy9kZXZfa2ZyZWVfc2tiX2FueShidWYpOworICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBidWYsIDAsIGhkcik7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisgICAgLy9yZXR1cm4gMDsKKyAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRUeERhdGEoKVxuIik7CisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRUeERhdGEoZGV2KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmTG54SW5pdFVzYlR4USh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBwcmludGsoS0VSTl9FUlIgInpmd0luaXRVc2JUeFFcbiIpOworCisgICAgLyogWmVybyBtZW1vcnkgZm9yIFVzYlR4QnVmUSAqLworICAgIG1lbXNldChtYWNwLT5Vc2JUeEJ1ZlEsIDAsIHNpemVvZihVc2JUeFFfdCkgKiBaTV9NQVhfVFhfVVJCX05VTSk7CisKKyAgICBtYWNwLT5UeEJ1ZkhlYWQgPSAwOworICAgIG1hY3AtPlR4QnVmVGFpbCA9IDA7CisgICAgbWFjcC0+VHhVcmJIZWFkID0gMDsKKyAgICBtYWNwLT5UeFVyYlRhaWwgPSAwOworICAgIG1hY3AtPlR4VXJiQ250ID0gWk1fTUFYX1RYX1VSQl9OVU07Cit9CisKK3ZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGk7CisgICAgemJ1Zl90ICpidWY7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogWmVybyBtZW1vcnkgZm9yIFVzYlJ4QnVmUSAqLworICAgIG1lbXNldChtYWNwLT5Vc2JSeEJ1ZlEsIDAsIHNpemVvZih6YnVmX3QgKikgKiBaTV9NQVhfUlhfVVJCX05VTSk7CisKKyAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICAvL2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworICAgICAgICBtYWNwLT5Vc2JSeEJ1ZlFbaV0gPSBidWY7CisgICAgfQorCisgICAgLy9tYWNwLT5SeEJ1ZlRhaWwgPSBaTV9NQVhfUlhfVVJCX05VTSAtIDE7CisgICAgbWFjcC0+UnhCdWZUYWlsID0gMDsKKworICAgIC8qIFN1Ym1pdCBhbGwgUnggdXJicyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG1hY3AtPlVzYlJ4QnVmUVtpXSk7CisgICAgICAgIHpmTG54VXNiSW4oZGV2LCBtYWNwLT5XbGFuUnhEYXRhVXJiW2ldLCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOworICAgIH0KK30KKworCisKK3UzMl90IHpmTG54VXNiU3VibWl0QnVsa1VyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAorICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCkKK3sKKyAgICB1MzJfdCByZXQ7CisKKyAgICBpZihkaXJlY3Rpb24gPT0gVVNCX0RJUl9PVVQpCisgICAgeworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQpOworCisgICAgICAgIHVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQpOworICAgIH0KKworICAgIGlmIChlcG51bSA9PSA0KQorICAgIHsKKyAgICAgICAgaWYgKHVyYi0+aGNwcml2KQorICAgICAgICB7CisgICAgICAgICAgICAvL3ByaW50aygiQ1dZIC0gdXJiLT5oY3ByaXYgc2V0IGJ5IHVua25vd24gcmVhc29uLCByZXNldCBpdFxuIik7CisgICAgICAgICAgICAvL3VyYi0+aGNwcml2ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisgICAgaWYgKChlcG51bSA9PSA0KSAmIChyZXQgIT0gMCkpCisgICAgeworICAgICAgICAvL3ByaW50aygiQ1dZIC0gcmV0ID0gJXhcbiIsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0LAorICAgICAgICB1MzJfdCBpbnRlcnZhbCkKK3sKKyAgICB1MzJfdCByZXQ7CisKKyAgICBpZihkaXJlY3Rpb24gPT0gVVNCX0RJUl9PVVQpCisgICAgeworICAgICAgICB1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdXNiLCB1c2Jfc25kYnVsa3BpcGUodXNiLCBlcG51bSksCisgICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCwgaW50ZXJ2YWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1c2JfZmlsbF9pbnRfdXJiKHVyYiwgdXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCBlcG51bSksCisgICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCwgaW50ZXJ2YWwpOworICAgIH0KKworICAgIHJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKK2ludCB6ZkxueENlbmNTZW5kTXNnKHN0cnVjdCBzb2NrICpuZXRsaW5rX3NrLCB1X2ludDhfdCAqbXNnLCBpbnQgbGVuKQoreworI2RlZmluZSBDT01NVFlQRV9HUk9VUCAgIDgKKyNkZWZpbmUgV0FJX0tfTVNHICAgICAgICAweDExCisKKwlpbnQgcmV0ID0gLTE7CisJaW50IHNpemU7CisJdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwljaGFyICpwb3MgPSBOVUxMOworCisJc2l6ZSA9IE5MTVNHX1NQQUNFKGxlbik7CisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOworCisJaWYoc2tiID09IE5VTEwpCisJeworCQlwcmludGsoImRldl9hbGxvY19za2IgZmFpbHVyZSBcbiIpOworCQlnb3RvIG91dDsKKwl9CisJb2xkX3RhaWwgPSBza2ItPnRhaWw7CisKKwkvKszu0LTK/b7dsajP4LnY0MXPoiovCisJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgV0FJX0tfTVNHLCBzaXplLXNpemVvZigqbmxoKSk7CisJcG9zID0gTkxNU0dfREFUQShubGgpOworCW1lbXNldChwb3MsIDAsIGxlbik7CisKKwkvKrSryuS1vdPDu6e/1bzktcTK/b7dKi8KKwltZW1jcHkocG9zLCBtc2csICBsZW4pOworCS8qvMbL476tuf3X1r3attTG5LrztcTK/b7dyrW8yrOktsgqLworCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gb2xkX3RhaWw7CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IENPTU1UWVBFX0dST1VQOworCW5ldGxpbmtfYnJvYWRjYXN0KG5ldGxpbmtfc2ssIHNrYiwgMCwgQ09NTVRZUEVfR1JPVVAsIEdGUF9BVE9NSUMpOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK25sbXNnX2ZhaWx1cmU6IC8qTkxNU0dfUFVUIMqnsNyjrNTys7fP+szXvdPX1ru6tOYqLworICAJaWYoc2tiKQorICAgIAkJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7CisKKyN1bmRlZiBDT01NVFlQRV9HUk9VUAorI3VuZGVmIFdBSV9LX01TRworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKworLyogU2ltcGx5IHJldHVybiAweGZmZmYgaWYgVkFQIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KK3UxNl90IHpmTG54R2V0VmFwSWQoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaT0wOyBpPFpNX1ZBUF9QT1JUX05VTUJFUjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHZhcFtpXS5kZXYgPT0gZGV2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MzJfdCB6ZndSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgSU5JVF9XT1JLCisjZGVmaW5lIHdvcmtfc3RydWN0IHRxX3N0cnVjdAorCisjZGVmaW5lIHNjaGVkdWxlX3dvcmsoYSkgIHNjaGVkdWxlX3Rhc2soYSkKKworI2RlZmluZSBmbHVzaF9zY2hlZHVsZWRfd29yayAgZmx1c2hfc2NoZWR1bGVkX3Rhc2tzCisjZGVmaW5lIElOSVRfV09SSyhfd3EsIF9yb3V0aW5lLCBfZGF0YSkgIElOSVRfVFFVRVVFKF93cSwgX3JvdXRpbmUsIF9kYXRhKQorI2RlZmluZSBQUkVQQVJFX1dPUksoX3dxLCBfcm91dGluZSwgX2RhdGEpICBQUkVQQVJFX1RRVUVVRShfd3EsIF9yb3V0aW5lLCBfZGF0YSkKKyNlbmRpZgorCisjZGVmaW5lIEtFVkVOVF9XQVRDSERPRyAgICAgICAgMHgwMDAwMDAwMQorCit1MzJfdCBzbXBfa2V2ZW50X0xvY2sgPSAwOworCit2b2lkIGtldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0KKyAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUsIGtldmVudCk7CisgICAgemRldl90ICpkZXYgPSBtYWNwLT5kZXZpY2U7CisKKyAgICBpZiAobWFjcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJnNtcF9rZXZlbnRfTG9jaykpCisgICAgeworICAgICAgICAvL3NjaGVkdWxlX3dvcmsoJm1hY3AtPmtldmVudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3duKCZtYWNwLT5pb2N0bF9zZW0pOworCisgICAgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLRVZFTlRfV0FUQ0hET0csICZtYWNwLT5rZXZlbnRfZmxhZ3MpKQorICAgIHsKKyAgICBleHRlcm4gdTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QgKmRldik7CisgICAgICAgIC8vemZpSHdXYXRjaERvZ1JlaW5pdChkZXYpOworICAgICAgICBwcmludGsoKCJcbiAqKioqKioqKioqKiogSHcgd2F0Y2hEb2cgb2NjdXIhISAqKioqKioqKioqKioqKiBcbiIpKTsKKyAgICAgICAgemZpV2xhblN1c3BlbmQoZGV2KTsKKyAgICAgICAgemZpV2xhblJlc3VtZShkZXYsMCk7CisgICAgICAgIHpmSHBTdGFydFJlY3YoZGV2KTsKKyAgICB9CisKKyAgICBjbGVhcl9iaXQoMCwgKHZvaWQgKikmc21wX2tldmVudF9Mb2NrKTsKKyAgICB1cCgmbWFjcC0+aW9jdGxfc2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgemZMbnhDcmVhdGVUaHJlYWQgICAgICAgICAgICAqLworLyogICAgICBDcmVhdGUgYSBUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhbHdheXMgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4zICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkxueENyZWF0ZVRocmVhZCh6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBDcmVhdGUgTXV0ZXggYW5kIGtldmVudGQgKi8KKyAgICBJTklUX1dPUksoJm1hY3AtPmtldmVudCwga2V2ZW50KTsKKyAgICBpbml0X01VVEVYKCZtYWNwLT5pb2N0bF9zZW0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmTG54U2lnbmFsVGhyZWFkICAgICAgICAgICAgKi8KKy8qICAgICAgU2lnbmFsIFRocmVhZCB3aXRoIEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsYWcgOiBzaWduYWwgdGhyZWFkIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjMgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmTG54U2lnbmFsVGhyZWFkKHpkZXZfdCAqZGV2LCBpbnQgZmxhZykKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJtYWNwIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKDAgJiYgbWFjcC0+a2V2ZW50X3JlYWR5ICE9IDEpCisgICAgeworICAgICAgICBwcmludGsoIktldmVudCBub3QgcmVhZHlcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2V0X2JpdChmbGFnLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKTsKKworICAgIGlmICghc2NoZWR1bGVfd29yaygmbWFjcC0+a2V2ZW50KSkKKyAgICB7CisgICAgICAgIC8vRmFpbHMgaXMgTm9ybWFsCisgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJzY2hlZHVsZV90YXNrIGZhaWxlZCwgZmxhZyA9ICV4XG4iLCBmbGFnKTsKKyAgICB9Cit9CisKKy8qIE5vdGlmeSB3cmFwcGVyIHRvZG8gcmVkb3dubG9hZCBmaXJtd2FyZSBhbmQgcmVpbml0IHByb2NlZHVyZSB3aGVuICovCisvKiBoYXJkd2FyZSB3YXRjaGRvZyBvY2N1ciA6IHpmaUh3V2F0Y2hEb2dSZWluaXQoKSAqLwordm9pZCB6ZkxueFdhdGNoRG9nTm90aWZ5KHpkZXZfdCogZGV2KQoreworICAgIHpmTG54U2lnbmFsVGhyZWFkKGRldiwgS0VWRU5UX1dBVENIRE9HKTsKK30KKworLyogUXVlcnkgRHVyYW50aW9uIG9mIEFjdGl2ZSBTY2FuICovCit2b2lkIHpmd0dldEFjdGl2ZVNjYW5EdXIoemRldl90KiBkZXYsIHU4X3QqIER1cikKK3sKKyAgICAqRHVyID0gMzA7IC8vIGRlZmF1bHQgMzAgbXMKK30KKwordm9pZCB6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoemRldl90KiBkZXYsIHU4X3QqIER1cikKK3sKKyAgICAqRHVyID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemRjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjZjQwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkY29tcGF0LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogemRjb21wYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIGRlZmludGlvbiBmb3IgY29tcGF0aWJpbGl0eS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9aRENPTVBBVF9ICisjZGVmaW5lIF9aRENPTVBBVF9ICisKKworI2lmbmRlZiBERUNMQVJFX1RBU0tMRVQKKyNkZWZpbmUgdGFza2xldF9zY2hlZHVsZShhKSAgIHNjaGVkdWxlX3Rhc2soYSkKKyNlbmRpZgorCisjdW5kZWYgbmV0ZGV2aWNlX3QKK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UgbmV0ZGV2aWNlX3Q7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyNpZiAoV0lSRUxFU1NfRVhUIDwgMTMpCitzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCit7CisgICAgICAgIF9fdTE2ICAgICAgICAgICBjbWQ7ICAgICAgICAgICAgLyogV2lyZWxlc3MgRXh0ZW5zaW9uIGNvbW1hbmQgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiBNb3JlIHRvIGNvbWUgOy0pICovCit9OworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBJUlFfTk9ORQordHlwZWRlZiB2b2lkIGlycXJldHVybl90OworI2RlZmluZSBJUlFfTk9ORQorI2RlZmluZSBJUlFfSEFORExFRAorI2RlZmluZSBJUlFfUkVUVkFMKHgpCisjZW5kaWYKKworI2lmbmRlZiBpbl9hdG9taWMKKyNkZWZpbmUgaW5fYXRvbWljKCkgIDAKKyNlbmRpZgorCisjZGVmaW5lIFVTQl9RVUVVRV9CVUxLIDAKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjFkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB6ZHVzYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgcGx1ZyBhbmQgcGxheSBoYW5kbGluZyBmb3IgVVNCIGRldmljZSBkcml2ZXIqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBNT0RWRVJTSU9OUworI2luY2x1ZGUgPGxpbnV4L21vZHZlcnNpb25zLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAidXNiZHJ2LmgiCisjaW5jbHVkZSAiemR1c2IuaCIKKworaW50IHpmTG54QWxsb2NBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7Cit2b2lkIHpmTG54RnJlZUFsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKK3ZvaWQgemZMbnhVbmxpbmtBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7CisKK01PRFVMRV9BVVRIT1IoIkF0aGVyb3MgQ29tbXVuaWNhdGlvbnMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXRoZXJvcyA4MDIuMTFuIFdpcmVsZXNzIExBTiBhZGFwdGVyIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAiT3R1cyI7CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB6ZDEyMjFfaWRzIFtdID0geworCXsgVVNCX0RFVklDRShWRU5ET1JfQVRIUiwgUFJPRFVDVF9BUjkxNzApIH0sCisgICAgICAgIHsgVVNCX0RFVklDRShWRU5ET1JfRExJTkssIFBST0RVQ1RfRFdBMTYwQSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODQ2LCAweDkwMTApIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHpkMTIyMV9pZHMpOworCitleHRlcm4gdThfdCB6ZkxueEluaXRTZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOworZXh0ZXJuIGludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdThfdCB6ZkxueENsZWFyU3RydWN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgemZXZHNDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgemZVbnJlZ2lzdGVyV2RzRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHdkc0lkKTsKK2V4dGVybiBpbnQgemZMbnhWYXBDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgemZMbnhVbnJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKTsKKworLyogV0RTICovCitleHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworCisvKiBWQVAgKi8KK2V4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CisKK3N0YXRpYyBpbnQgemZMbnhQcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IE5VTEw7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gTlVMTDsKKyAgICBpbnQgdmVuZG9yX2lkLCBwcm9kdWN0X2lkOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgdXNiX2dldF9kZXYoZGV2KTsKKworICAgIHZlbmRvcl9pZCA9IGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcjsKKyAgICBwcm9kdWN0X2lkID0gZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKworI2lmZGVmIEhNQUNfREVCVUcKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgInZlbmRvcl9pZCA9ICUwNHhcbiIsIHZlbmRvcl9pZCk7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJwcm9kdWN0X2lkID0gJTA0eFxuIiwgcHJvZHVjdF9pZCk7CisKKyAgICBpZiAoZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJVU0IgMi4wIEhvc3RcbiIpOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJVU0IgMS4xIEhvc3RcbiIpOworI2VuZGlmCisKKyAgICBpZiAoIShtYWNwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYmRydl9wcml2YXRlKSwgR0ZQX0tFUk5FTCkpKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgZGV2aWNlIHN0cnVjdHVyZVxuIik7CisgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBaZXJvIHRoZSBtZW1vcnkgKi8KKyAgICBtZW1zZXQobWFjcCwgMCwgc2l6ZW9mKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSkpOworCisgICAgbmV0ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisKKyAgICBpZiAobmV0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmTG54UHJvYmU6IE5vdCBhYmxlIHRvIGFsbG9jIGV0aGVyZGV2IHN0cnVjdFxuIik7CisgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZmFpbDE7CisgICAgfQorCisgICAgc3RyY3B5KG5ldC0+bmFtZSwgImF0aCVkIik7CisKKyAgICBuZXQtPm1sX3ByaXYgPSBtYWNwOyAgIC8va2VybmVsIDIuNgorICAgIG1hY3AtPnVkZXYgPSBkZXY7CisgICAgbWFjcC0+ZGV2aWNlID0gbmV0OworCisgICAgLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLworICAgIC8qIGNoZWNrIG91dCB0aGUgZW5kcG9pbnRzICovCisgICAgbWFjcC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCisgICAgLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZtYWNwLT5yZWdTZXRfd2FpdCk7CisgICAgLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZtYWNwLT5pb3J3UnNwX3dhaXQpOworICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+dGVybV93YWl0KTsKKworICAgIGlmICghemZMbnhBbGxvY0FsbFVyYnMobWFjcCkpCisgICAgeworICAgICAgICByZXN1bHQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGZhaWwyOworICAgIH0KKworICAgIGlmICghemZMbnhJbml0U2V0dXAobmV0LCBtYWNwKSkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IC1FSU87CisgICAgICAgIGdvdG8gZmFpbDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBtYWNwKTsKKyAgICAgICAgU0VUX05FVERFVl9ERVYobmV0LCAmaW50ZXJmYWNlLT5kZXYpOworCisgICAgICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYobmV0KSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZhaWwzOworICAgICAgICB9CisgICAgfQorCisgICAgbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKKyAgICBnb3RvIGRvbmU7CisKK2ZhaWwzOgorICAgIHpmTG54RnJlZUFsbFVyYnMobWFjcCk7CitmYWlsMjoKKyAgICBmcmVlX25ldGRldihuZXQpOyAgLy9rZXJuZWwgMi42CitmYWlsMToKKyAgICBrZnJlZShtYWNwKTsKKworZmFpbDoKKyAgICB1c2JfcHV0X2RldihkZXYpOworICAgIG1hY3AgPSBOVUxMOworCitkb25lOgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHpmTG54RGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInpmTG54RGlzY29ubmVjdFxuIik7CisKKyAgICBpZiAoIW1hY3ApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgInVucmVnaXN0ZXJpbmcgbm9uLWV4aXN0YW50IGRldmljZVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPmRldmljZS0+ZmxhZ3MgJiBJRkZfVVApCisgICAgICAgICAgICB1c2JkcnZfY2xvc2UobWFjcC0+ZGV2aWNlKTsKKyAgICB9CisKKyNpZiAwCisgICAgLyogQ2xvc2UgV0RTICovCisgICAgLy96Zldkc0Nsb3NlKHdkc1swXS5kZXYpOworICAgIC8qIFVucmVnaXN0ZXIgV0RTICovCisgICAgLy96ZlVucmVnaXN0ZXJXZHNEZXYobWFjcC0+ZGV2aWNlLCAwKTsKKworICAgIC8qIENsb3NlIFZBUCAqLworICAgIHpmTG54VmFwQ2xvc2UodmFwWzBdLmRldik7CisgICAgLyogVW5yZWdpc3RlciBWQVAgKi8KKyAgICB6ZkxueFVucmVnaXN0ZXJWYXBEZXYobWFjcC0+ZGV2aWNlLCAwKTsKKyNlbmRpZgorCisgICAgemZMbnhDbGVhclN0cnVjdHMobWFjcC0+ZGV2aWNlKTsKKworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KG1hY3AtPmRldmljZSk7CisKKyAgICB1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCisgICAgLy9wcmludGsoS0VSTl9FUlIgIjMuIHpmTG54VW5saW5rQWxsVXJic1xuIik7CisgICAgLy96ZkxueFVubGlua0FsbFVyYnMobWFjcCk7CisKKyAgICAvKiBGcmVlIG5ldHdvcmsgaW50ZXJmYWNlICovCisgICAgZnJlZV9uZXRkZXYobWFjcC0+ZGV2aWNlKTsKKworICAgIHpmTG54RnJlZUFsbFVyYnMobWFjcCk7CisgICAgLy96ZkxueENsZWFyU3RydWN0cyhtYWNwLT5kZXZpY2UpOworICAgIGtmcmVlKG1hY3ApOworICAgIG1hY3AgPSBOVUxMOworCisgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgemQxMjIxX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgID0gZHJpdmVyX25hbWUsCisJLnByb2JlICAgICAgICA9IHpmTG54UHJvYmUsCisJLmRpc2Nvbm5lY3QgICA9IHpmTG54RGlzY29ubmVjdCwKKwkuaWRfdGFibGUgICAgID0gemQxMjIxX2lkcywKK307CisKK2ludCBfX2luaXQgemZMbnhJaW5pdCh2b2lkKQoreworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgLSB2ZXJzaW9uICVzXG4iLCAgRFJJVkVSX05BTUUsIFZFUlNJT05JRCk7CisgICAgcmV0dXJuIHVzYl9yZWdpc3RlcigmemQxMjIxX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IHpmTG54RXhpdCh2b2lkKQoreworICAgIHVzYl9kZXJlZ2lzdGVyKCZ6ZDEyMjFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoemZMbnhJaW5pdCk7Cittb2R1bGVfZXhpdCh6ZkxueEV4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZGMyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogemR1c2IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBVU0IgZGV2aWNlIGRyaXZlciAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9aRFVTQl9ICisjZGVmaW5lIF9aRFVTQl9ICisKKyNpZm5kZWYgRFJJVkVSX05BTUUKKyNkZWZpbmUgRFJJVkVSX05BTUUgICAgICAgICAgICAgImFydXNiIgorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTklEICAgICAgICAgICAgICAgIjAuMC4wLjk5OSIKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZSAqLworI2RlZmluZSBWRU5ET1JfQVRIUiAgICAgICAgICAgICAweDBDRjMgIC8vQXRoZXJvcworI2RlZmluZSBQUk9EVUNUX0FSOTE3MCAgICAgICAgICAweDkxNzAKKworI2RlZmluZSBWRU5ET1JfRExJTksgICAgICAgICAgICAweDA3RDEgIC8vRGxpbmsKKyNkZWZpbmUgUFJPRFVDVF9EV0ExNjBBICAgICAgICAgMHgzQzEwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGIzMGYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKQEAgLTAsMCArMSwyNzggQEAKK2NvbmZpZyBQQU5FTAorCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IExDRC9LZXlwYWQgUGFuZWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlBPUlQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEhENDQ3ODAgb3IgS1MtMDA3NCBMQ0QgY29ubmVjdGVkIHRvIHlvdXIKKwkgIHBhcmFsbGVsIHBvcnQuIFRoaXMgZHJpdmVyIGFsc28gZmVhdHVyZXMgNCBhbmQgNi1rZXkga2V5cGFkcy4gVGhlIExDRAorCSAgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSAvZGV2L2xjZCBjaGFyIGRldmljZSAoMTAsIDE1NiksIGFuZCB0aGUKKwkgIGtleXBhZCB0aHJvdWdoIC9kZXYva2V5cGFkICgxMCwgMTg1KS4gQm90aCByZXF1aXJlIG1pc2MgZGV2aWNlIHRvIGJlCisJICBlbmFibGVkLiBUaGlzIGNvZGUgY2FuIGVpdGhlciBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSwgb3IgbGlua2VkIGludG8KKwkgIHRoZSBrZXJuZWwgYW5kIHN0YXJ0ZWQgYXQgYm9vdC4gSWYgeW91IGRvbid0IHVuZGVyc3RhbmQgd2hhdCBhbGwgdGhpcworCSAgaXMgYWJvdXQsIHNheSBOLgorCitjb25maWcgUEFORUxfUEFSUE9SVAorCWludCAiRGVmYXVsdCBwYXJhbGxlbCBwb3J0IG51bWJlciAoMD1MUFQxKSIKKwlkZXBlbmRzIG9uIFBBTkVMCisJcmFuZ2UgMCAyNTUKKwlkZWZhdWx0ICIwIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBwYXJhbGxlbCBwb3J0IHRoZSBwYW5lbCBpcyBjb25uZWN0ZWQgdG8uIE9uZQorCSAgZHJpdmVyIGluc3RhbmNlIG9ubHkgc3VwcG9ydHMgb25lIHBhcmFsbGVsIHBvcnQsIHNvIGlmIHlvdXIga2V5cGFkCisJICBhbmQgTENEIGFyZSBjb25uZWN0ZWQgdG8gdHdvIHNlcGFyYXRlIHBvcnRzLCB5b3UgaGF2ZSB0byBzdGFydCB0d28KKwkgIG1vZHVsZXMgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzLiBOdW1iZXJpbmcgc3RhcnRzIHdpdGggJzAnIGZvciBMUFQxLAorCSAgYW5kIHNvIG9uLgorCitjb25maWcgUEFORUxfUFJPRklMRQorCWludCAiRGVmYXVsdCBwYW5lbCBwcm9maWxlICgwLTUsIDA9Y3VzdG9tKSIKKwlkZXBlbmRzIG9uIFBBTkVMCisJcmFuZ2UgMCA1CisJZGVmYXVsdCAiNSIKKwktLS1oZWxwLS0tCisJICBUbyBlYXNlIGNvbmZpZ3VyYXRpb24sIHRoZSBkcml2ZXIgc3VwcG9ydHMgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24KKwkgIHByb2ZpbGVzIGZvciBwYXN0IGFuZCByZWNlbnQgd2lyaW5ncy4gVGhlc2UgcHJvZmlsZXMgY2FuIGFsc28gYmUKKwkgIHVzZWQgdG8gZGVmaW5lIGFuIGFwcHJveGltYXRpdmUgY29uZmlndXJhdGlvbiwgY29tcGxldGVkIGJ5IGEgZmV3CisJICBvdGhlciBvcHRpb25zLiBIZXJlIGFyZSB0aGUgcHJvZmlsZXMgOgorCisJICAgIDAgPSBjdXN0b20gKHNlZSBmdXJ0aGVyKQorCSAgICAxID0gMngxNiBwYXJhbGxlbCBMQ0QsIG9sZCBrZXlwYWQKKwkgICAgMiA9IDJ4MTYgc2VyaWFsIExDRCAoS1MtMDA3NCksIG5ldyBrZXlwYWQKKwkgICAgMyA9IDJ4MTYgcGFyYWxsZWwgTENEIChIYW50cm9uaXgpLCBubyBrZXlwYWQKKwkgICAgNCA9IDJ4MTYgcGFyYWxsZWwgTENEIChOZXhjb20gTlNBMTA0NSkgd2l0aCBOZXhjb20ncyBrZXlwYWQKKwkgICAgNSA9IDJ4NDAgcGFyYWxsZWwgTENEIChvbGQgb25lKSwgd2l0aCBvbGQga2V5cGFkCisKKwkgIEN1c3RvbSBjb25maWd1cmF0aW9ucyBhbGxvdyB5b3UgdG8gZGVmaW5lIGhvdyB5b3VyIGRpc3BsYXkgaXMKKwkgIHdpcmVkIHRvIHRoZSBwYXJhbGxlbCBwb3J0LCBhbmQgaG93IGl0IHdvcmtzLiBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKKwkgIGZvciBleHBlcnRzLgorCitjb25maWcgUEFORUxfS0VZUEFECisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIgorCWludCAiS2V5cGFkIHR5cGUgKDA9bm9uZSwgMT1vbGQgNiBrZXlzLCAyPW5ldyA2IGtleXMsIDM9TmV4Y29tIDQga2V5cykiCisJcmFuZ2UgMCA0CisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgVGhpcyBlbmFibGVzIGFuZCBjb25maWd1cmVzIGEga2V5cGFkIGNvbm5lY3RlZCB0byB0aGUgcGFyYWxsZWwgcG9ydC4KKwkgIFRoZSBrZXlzIHdpbGwgYmUgcmVhZCBmcm9tIGNoYXJhY3RlciBkZXZpY2UgMTAsMTg1LiBWYWxpZCB2YWx1ZXMgYXJlIDoKKworCSAgICAwIDogZG8gbm90IGVuYWJsZSB0aGlzIGRyaXZlcgorCSAgICAxIDogb2xkIDYga2V5cyBrZXlwYWQKKwkgICAgMiA6IG5ldyA2IGtleXMga2V5cGFkLCBhcyB1c2VkIG9uIHRoZSBzZXJ2ZXIgYXQgd3d3LmFudC1jb21wdXRpbmcuY29tCisJICAgIDMgOiBOZXhjb20gTlNBMTA0NSdzIDQga2V5cyBrZXlwYWQKKworCSAgTmV3IHByb2ZpbGVzIGNhbiBiZSBkZXNjcmliZWQgaW4gdGhlIGRyaXZlciBzb3VyY2UuIFRoZSBkcml2ZXIgYWxzbworCSAgc3VwcG9ydHMgc2ltdWx0YW5lb3VzIGtleXMgcHJlc3NlZCB3aGVuIHRoZSBrZXlwYWQgc3VwcG9ydHMgdGhlbS4KKworY29uZmlnIFBBTkVMX0xDRAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIKKwlpbnQgIkxDRCB0eXBlICgwPW5vbmUsIDE9Y3VzdG9tLCAyPW9sZCAvLywgMz1rczAwNzQsIDQ9aGFudHJvbml4LCA1PU5leGNvbSkiCisJcmFuZ2UgMCA1CisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgIFRoaXMgZW5hYmxlcyBhbmQgY29uZmlndXJlcyBhbiBMQ0QgY29ubmVjdGVkIHRvIHRoZSBwYXJhbGxlbCBwb3J0LgorCSAgIFRoZSBkcml2ZXIgaW5jbHVkZXMgYW4gaW50ZXJwcmV0ZXIgZm9yIGVzY2FwZSBjb2RlcyBzdGFydGluZyB3aXRoCisJICAgJ1xlW0wnIHdoaWNoIGFyZSBzcGVjaWZpYyB0byB0aGUgTENELCBhbmQgYSBmZXcgQU5TSSBjb2Rlcy4gVGhlCisJICAgZHJpdmVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBjaGFyYWN0ZXIgZGV2aWNlIDEwLDE1NiwgdXN1YWxseQorCSAgIHVuZGVyIHRoZSBuYW1lICcvZGV2L2xjZCcuIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDYgc3VwcG9ydGVkIHR5cGVzIDoKKworCSAgICAgMCA6IGRvIG5vdCBlbmFibGUgdGhlIGRyaXZlcgorCSAgICAgMSA6IGN1c3RvbSBjb25maWd1cmF0aW9uIGFuZCB3aXJpbmcgKHNlZSBmdXJ0aGVyKQorCSAgICAgMiA6IDJ4MTYgJiAyeDQwIHBhcmFsbGVsIExDRCAob2xkIHdpcmluZykKKwkgICAgIDMgOiAyeDE2IHNlcmlhbCBMQ0QgKEtTLTAwNzQgYmFzZWQpCisJICAgICA0IDogMngxNiBwYXJhbGxlbCBMQ0QgKEhhbnRyb25peCB3aXJpbmcpCisJICAgICA1IDogMngxNiBwYXJhbGxlbCBMQ0QgKE5leGNvbSB3aXJpbmcpCisKKwkgICBXaGVuIHR5cGUgJzEnIGlzIHNwZWNpZmllZCwgb3RoZXIgb3B0aW9ucyB3aWxsIGFwcGVhciB0byBjb25maWd1cmUKKwkgICBtb3JlIHByZWNpc2UgYXNwZWN0cyAod2lyaW5nLCBkaW1lbnNpb25zLCBwcm90b2NvbCwgLi4uKS4gUGxlYXNlIG5vdGUKKwkgICB0aGF0IHRob3NlIHZhbHVlcyBjaGFuZ2VkIGZyb20gdGhlIDIuNCBkcml2ZXIgZm9yIGJldHRlciBjb25zaXN0ZW5jeS4KKworY29uZmlnIFBBTkVMX0xDRF9IRUlHSFQKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIk51bWJlciBvZiBsaW5lcyBvbiB0aGUgTENEICgxLTIpIgorCXJhbmdlIDEgMgorCWRlZmF1bHQgMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIG51bWJlciBvZiB2aXNpYmxlIGNoYXJhY3RlciBsaW5lcyBvbiB0aGUgTENEIGluIGN1c3RvbSBwcm9maWxlLgorCSAgSXQgY2FuIGVpdGhlciBiZSAxIG9yIDIuCisKK2NvbmZpZyBQQU5FTF9MQ0RfV0lEVEgKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIk51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBsaW5lIG9uIHRoZSBMQ0QgKDEtNDApIgorCXJhbmdlIDEgNDAKKwlkZWZhdWx0IDQwCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGVyIGxpbmUgb24gdGhlIExDRCBpbiBjdXN0b20gcHJvZmlsZS4KKwkgIENvbW1vbiB2YWx1ZXMgYXJlIDE2LDIwLDI0LDQwLgorCitjb25maWcgUEFORUxfTENEX0JXSURUSAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiSW50ZXJuYWwgTENEIGxpbmUgd2lkdGggKDEtNDAsIDQwIGJ5IGRlZmF1bHQpIgorCXJhbmdlIDEgNDAKKwlkZWZhdWx0IDQwCisJLS0taGVscC0tLQorCSAgTW9zdCBMQ0RzIHVzZSBhIHN0YW5kYXJkIGNvbnRyb2xsZXIgd2hpY2ggc3VwcG9ydHMgaGFyZHdhcmUgbGluZXMgb2YgNDAKKwkgIGNoYXJhY3RlcnMsIGFsdGhvdWdoIHNvbWV0aW1lcyBvbmx5IDE2LCAyMCBvciAyNCBvZiB0aGVtIGFyZSByZWFsbHkgd2lyZWQKKwkgIHRvIHRoZSB0ZXJtaW5hbC4gVGhpcyByZXN1bHRzIGluIHNvbWUgbm9uLXZpc2libGUgYnV0IGFkcmVzc2FibGUgY2hhcmFjdGVycywKKwkgIGFuZCBpcyB0aGUgY2FzZSBmb3IgbW9zdCBwYXJhbGxlbCBMQ0RzLiBPdGhlciBMQ0RzLCBhbmQgc29tZSBzZXJpYWwgb25lcywKKwkgIGhvd2V2ZXIsIHVzZSB0aGUgc2FtZSBsaW5lIHdpZHRoIGludGVybmFsbHkgYXMgd2hhdCBpcyB2aXNpYmxlLiBUaGUgS1MwMDc0CisJICBmb3IgZXhhbXBsZSwgdXNlcyAxNiBjaGFyYWN0ZXJzIHBlciBsaW5lIGZvciAxNiB2aXNpYmxlIGNoYXJhY3RlcnMgcGVyIGxpbmUuCisKKwkgIFRoaXMgb3B0aW9uIGxldHMgeW91IGNvbmZpZ3VyZSB0aGUgdmFsdWUgdXNlZCBieSB5b3VyIExDRCBpbiAnY3VzdG9tJyBwcm9maWxlLgorCSAgSWYgeW91IGRvbid0IGtub3csIHB1dCAnNDAnIGhlcmUuCisKK2NvbmZpZyBQQU5FTF9MQ0RfSFdJRFRICisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJIYXJkd2FyZSBMQ0QgbGluZSB3aWR0aCAoMS02NCwgNjQgYnkgZGVmYXVsdCkiCisJcmFuZ2UgMSA2NAorCWRlZmF1bHQgNjQKKwktLS1oZWxwLS0tCisJICBNb3N0IExDRHMgdXNlIGEgc2luZ2xlIGFkZHJlc3MgYml0IHRvIGRpZmZlcmVudGlhdGUgbGluZSAwIGFuZCBsaW5lIDEuIFNpbmNlCisJICBzb21lIG9mIHRoZW0gbmVlZCB0byBiZSBhYmxlIHRvIGFkZHJlc3MgNDAgY2hhcnMgd2l0aCB0aGUgbG93ZXIgYml0cywgdGhleQorCSAgb2Z0ZW4gdXNlIHRoZSBpbW1lZGlhdGVseSBzdXBlcmlvciBwb3dlciBvZiAyLCB3aGljaCBpcyA2NCwgdG8gYWRkcmVzcyB0aGUKKwkgIG5leHQgbGluZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB5b3VyIExDRCB1c2VzLCBpbiBkb3VidCBsZXQgMTYgaGVyZSBmb3IgYSAyeDE2LCBhbmQKKwkgIDY0IGhlcmUgZm9yIGEgMng0MC4KKworY29uZmlnIFBBTkVMX0xDRF9DSEFSU0VUCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJMQ0QgY2hhcmFjdGVyIHNldCAoMD1ub3JtYWwsIDE9S1MwMDc0KSIKKwlyYW5nZSAwIDEKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICBTb21lIGNvbnRyb2xsZXJzIHN1Y2ggYXMgdGhlIEtTMDA3NCB1c2UgYSBzb21ld2hhdCBzdHJhbmdlIGNoYXJhY3RlciBzZXQKKwkgIHdoZXJlIG1hbnkgc3ltYm9scyBhcmUgYXQgdW51c3VhbCBwbGFjZXMuIFRoZSBkcml2ZXIga25vd3MgaG93IHRvIG1hcAorCSAgJ3N0YW5kYXJkJyBBU0NJSSBjaGFyYWN0ZXJzIHRvIHRoZSBjaGFyYWN0ZXIgc2V0cyB1c2VkIGJ5IHRoZXNlIGNvbnRyb2xsZXJzLgorCSAgVmFsaWQgdmFsdWVzIGFyZSA6CisKKwkgICAgIDAgOiBub3JtYWwgKHVudHJhbnNsYXRlZCkgY2hhcmFjdGVyIHNldAorCSAgICAgMSA6IEtTMDA3NCBjaGFyYWN0ZXIgc2V0CisKKwkgIElmIHlvdSBkb24ndCBrbm93LCB1c2UgdGhlIG5vcm1hbCBvbmUgKDApLgorCitjb25maWcgUEFORUxfTENEX1BST1RPCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJMQ0QgY29tbXVuaWNhdGlvbiBtb2RlICgwPXBhcmFsbGVsIDggYml0cywgMT1zZXJpYWwpIgorCXJhbmdlIDAgMQorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIG5vdyBzdXBwb3J0cyBhbnkgc2VyaWFsIG9yIHBhcmFsbGVsIExDRCB3aXJlZCB0byBhIHBhcmFsbGVsCisJICBwb3J0LiBCdXQgYmVmb3JlIGFzc2lnbmluZyBzaWduYWxzLCB0aGUgZHJpdmVyIG5lZWRzIHRvIGtub3cgaWYgaXQgd2lsbAorCSAgYmUgZHJpdmluZyBhIHNlcmlhbCBMQ0Qgb3IgYSBwYXJhbGxlbCBvbmUuIFNlcmlhbCBMQ0RzIG9ubHkgdXNlIDIgd2lyZXMKKwkgIChTREEvU0NMKSwgd2hpbGUgcGFyYWxsZWwgb25lcyB1c2UgMiBvciAzIHdpcmVzIGZvciB0aGUgY29udHJvbCBzaWduYWxzCisJICAoRSwgUlMsIHNvbWV0aW1lcyBSVyksIGFuZCA0IG9yIDggZm9yIHRoZSBkYXRhLiBVc2UgMCBoZXJlIGZvciBhIDggYml0cworCSAgcGFyYWxsZWwgTENELCBhbmQgMSBmb3IgYSBzZXJpYWwgTENELgorCitjb25maWcgUEFORUxfTENEX1BJTl9FCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiICYmIFBBTkVMX0xDRF9QUk9UTz0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBFIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDE0CisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnRScKKwkgIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ0UnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMTQnIChBVVRPRkVFRCkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX1JTCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiICYmIFBBTkVMX0xDRF9QUk9UTz0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBSUyBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAxNworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBMQ0QgJ1JTJworCSAgc2lnbmFsIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnUlMnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMTcnIChTRUxFQ1QgSU4pLgorCitjb25maWcgUEFORUxfTENEX1BJTl9SVworCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE89IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgUlcgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMTYKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgTENEICdSVycKKwkgIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1JXJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzE2JyAoSU5JVCkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX1NDTAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE8hPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFNDTCBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAxCisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIHNlcmlhbAorCSAgTENEICdTQ0wnIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1NDTCcgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcxJyAoU1RST0JFKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fU0RBCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiICYmIFBBTkVMX0xDRF9QUk9UTyE9IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgU0RBIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgc2VyaWFsCisJICBMQ0QgJ1NEQScgc2lnbmFsIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnU0RBJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzInIChEMCkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX0JMCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgYmFja2xpZ2h0IHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgTENEICdCTCcgc2lnbmFsCisgICAgICAgICAgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdCTCcgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcwJyAodW5jb250cm9sbGVkKS4KKworY29uZmlnIFBBTkVMX0NIQU5HRV9NRVNTQUdFCisJZGVwZW5kcyBvbiBQQU5FTAorCWJvb2wgIkNoYW5nZSBMQ0QgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSA/IgorCWRlZmF1bHQgIm4iCisJLS0taGVscC0tLQorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UgdGhlIGJvb3QgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBrZXJuZWwgdmVyc2lvbgorCSAgYW5kIHRoZSBkcml2ZXIgdmVyc2lvbiB3aXRoIGEgY3VzdG9tIG1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIG9uIGFwcGxpYW5jZXMKKwkgIHdoZXJlIGEgc2ltcGxlICdTdGFydGluZyBzeXN0ZW0nIG1lc3NhZ2UgY2FuIGJlIGVub3VnaCB0byBzdG9wIGEgY3VzdG9tZXIKKwkgIGZyb20gd29ycnlpbmcuCisKKwkgIElmIHlvdSBzYXkgJ1knIGhlcmUsIHlvdSdsbCBiZSBhYmxlIHRvIGNob29zZSBhIG1lc3NhZ2UgeW91cnNlbGYuIE90aGVyd2lzZSwKKwkgIHNheSAnTicgYW5kIGtlZXAgdGhlIGRlZmF1bHQgbWVzc2FnZSB3aXRoIHRoZSB2ZXJzaW9uLgorCitjb25maWcgUEFORUxfQk9PVF9NRVNTQUdFCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9DSEFOR0VfTUVTU0FHRT0ieSIKKwlzdHJpbmcgIk5ldyBpbml0aWFsaXphdGlvbiBtZXNzYWdlIgorCWRlZmF1bHQgIiIKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyB5b3UgdG8gcmVwbGFjZSB0aGUgYm9vdCBtZXNzYWdlIGluZGljYXRpbmcgdGhlIGtlcm5lbCB2ZXJzaW9uCisJICBhbmQgdGhlIGRyaXZlciB2ZXJzaW9uIHdpdGggYSBjdXN0b20gbWVzc2FnZS4gVGhpcyBpcyB1c2VmdWwgb24gYXBwbGlhbmNlcworCSAgd2hlcmUgYSBzaW1wbGUgJ1N0YXJ0aW5nIHN5c3RlbScgbWVzc2FnZSBjYW4gYmUgZW5vdWdoIHRvIHN0b3AgYSBjdXN0b21lcgorCSAgZnJvbSB3b3JyeWluZy4KKworCSAgQW4gZW1wdHkgbWVzc2FnZSB3aWxsIG9ubHkgY2xlYXIgdGhlIGRpc3BsYXkgYXQgZHJpdmVyIGluaXQgdGltZS4gQW55IG90aGVyCisJICBwcmludGYoKS1mb3JtYXR0ZWQgbWVzc2FnZSBpcyB2YWxpZCB3aXRoIG5ld2xpbmUgYW5kIGVzY2FwZSBjb2Rlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdjMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19QQU5FTCkJCSs9IHBhbmVsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiZTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9UT0RPCkBAIC0wLDAgKzEsOSBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIExpbmRlbnQKKwktIHJldmlldyBtYWpvci9taW5vciB1c2FnZXMKKwktIHJldmlldyB1c2Vyc3BhY2UgYXBpCisJLSBzZWUgaWYgYWxsIG9mIHRoaXMgY291bGQgYmUgZWFzaWVyIGRvbmUgaW4gdXNlcnNwYWNlIGluc3RlYWQuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitXaWxseSBUYXJyZWF1IDx3aWxseUBtZXRhLXgub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL2xjZC1wYW5lbC1jZ3JhbS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvbGNkLXBhbmVsLWNncmFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNlZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL2xjZC1wYW5lbC1jZ3JhbS50eHQKQEAgLTAsMCArMSwyNCBAQAorU29tZSBMQ0RzIGFsbG93IHlvdSB0byBkZWZpbmUgdXAgdG8gOCBjaGFyYWN0ZXJzLCBtYXBwZWQgdG8gQVNDSUkKK2NoYXJhY3RlcnMgMCB0byA3LiBUaGUgZXNjYXBlIGNvZGUgdG8gZGVmaW5lIGEgbmV3IGNoYXJhY3RlciBpcworJ1xlW0xHJyBmb2xsb3dlZCBieSBvbmUgZGlnaXQgZnJvbSAwIHRvIDcsIHJlcHJlc2VudGluZyB0aGUgY2hhcmFjdGVyCitudW1iZXIsIGFuZCB1cCB0byA4IGNvdXBsZXMgb2YgaGV4IGRpZ2l0cyB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbgorKCc7JykuIEVhY2ggY291cGxlIG9mIGRpZ2l0cyByZXByZXNlbnRzIGEgbGluZSwgd2l0aCAxLWJpdHMgZm9yIGVhY2gKK2lsbHVtaW5hdGVkIHBpeGVsIHdpdGggTFNCIG9uIHRoZSByaWdodC4gTGluZXMgYXJlIG51bWJlcnJlZCBmcm9tIHRoZQordG9wIG9mIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIGJvdHRvbS4gT24gYSA1eDcgbWF0cml4LCBvbmx5IHRoZSA1IGxvd2VyCitiaXRzIG9mIHRoZSA3IGZpcnN0IGJ5dGVzIGFyZSB1c2VkIGZvciBlYWNoIGNoYXJhY3Rlci4gSWYgdGhlIHN0cmluZworaXMgaW5jb21wbGV0ZSwgb25seSBjb21wbGV0ZSBsaW5lcyB3aWxsIGJlIHJlZGVmaW5lZC4gSGVyZSBhcmUgc29tZQorZXhhbXBsZXMgOgorCisgIHByaW50ZiAiXGVbTEcwMDEwMTAxMDUwRDFGMEMwNDsiICA9PiAwID0gW2VudGVyXQorICBwcmludGYgIlxlW0xHMTA0MEUxRjAwMDAwMDAwMDA7IiAgPT4gMSA9IFt1cF0KKyAgcHJpbnRmICJcZVtMRzIwMDAwMDAwMDFGMEUwNDAwOyIgID0+IDIgPSBbZG93bl0KKyAgcHJpbnRmICJcZVtMRzMwNDBFMUYwMDFGMEUwNDAwOyIgID0+IDMgPSBbdXAtZG93bl0KKyAgcHJpbnRmICJcZVtMRzQwMDAyMDYwRTFFMEUwNjAyOyIgID0+IDQgPSBbbGVmdF0KKyAgcHJpbnRmICJcZVtMRzUwMDA4MEMwRTBGMEUwQzA4OyIgID0+IDUgPSBbcmlnaHRdCisgIHByaW50ZiAiXGVbTEc2MDAxNjA1MTUxNjE0MTQwMDsiICA9PiA2ID0gIklQIgorCisgIHByaW50ZiAiXGVbTEcwMDEwMzA3MUYxRjA3MDMwMTsiICA9PiBiaWcgc3BlYWtlcgorICBwcmludGYgIlxlW0xHMDAwMDIwNjFFMUUwNjAyMDA7IiAgPT4gc21hbGwgc3BlYWtlcgorCitXaWxseQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZmUyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpAQCAtMCwwICsxLDIxOTMgQEAKKy8qCisgKiBGcm9udCBwYW5lbCBkcml2ZXIgZm9yIExpbnV4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwOCwgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGNvZGUgZHJpdmVzIGFuIExDRCBtb2R1bGUgKC9kZXYvbGNkKSwgYW5kIGEga2V5cGFkICgvZGV2L2tleXBhZCkKKyAqIGNvbm5lY3RlZCB0byBhIHBhcmFsbGVsIHByaW50ZXIgcG9ydC4KKyAqCisgKiBUaGUgTENEIG1vZHVsZSBtYXkgZWl0aGVyIGJlIGFuIEhENDQ3ODAtbGlrZSA4LWJpdCBwYXJhbGxlbCBMQ0QsIG9yIGEgMS1iaXQKKyAqIHNlcmlhbCBtb2R1bGUgY29tcGF0aWJsZSB3aXRoIFNhbXN1bmcncyBLUzAwNzQuIFRoZSBwaW5zIG1heSBiZSBjb25uZWN0ZWQgaW4KKyAqIGFueSBjb21iaW5hdGlvbiwgZXZlcnl0aGluZyBpcyBwcm9ncmFtbWFibGUuCisgKgorICogVGhlIGtleXBhZCBjb25zaXN0cyBpbiBhIG1hdHJpeCBvZiBwdXNoIGJ1dHRvbnMgY29ubmVjdGluZyBpbnB1dCBwaW5zIHRvCisgKiBkYXRhIG91dHB1dCBwaW5zIG9yIHRvIHRoZSBncm91bmQuIFRoZSBjb21iaW5hdGlvbnMgaGF2ZSB0byBiZSBoYXJkLWNvZGVkCisgKiBpbiB0aGUgZHJpdmVyLCB0aG91Z2ggc2V2ZXJhbCBwcm9maWxlcyBleGlzdCBhbmQgYWRkaW5nIG5ldyBvbmVzIGlzIGVhc3kuCisgKgorICogU2V2ZXJhbCBwcm9maWxlcyBhcmUgcHJvdmlkZWQgZm9yIGNvbW1vbmx5IGZvdW5kIExDRCtrZXlwYWQgbW9kdWxlcyBvbiB0aGUKKyAqIG1hcmtldCwgc3VjaCBhcyB0aG9zZSBmb3VuZCBpbiBOZXhjb20ncyBhcHBsaWFuY2VzLgorICoKKyAqIEZJWE1FOgorICogICAgICAtIHRoZSBpbml0aWFsaXphdGlvbi9kZWluaXRpYWxpemF0aW9uIHByb2Nlc3MgaXMgdmVyeSBkaXJ0eSBhbmQgc2hvdWxkCisgKiAgICAgICAgYmUgcmV3cml0dGVuLiBJdCBtYXkgZXZlbiBiZSBidWdneS4KKyAqCisgKiBUT0RPOgorICoJLSBkb2N1bWVudCAyNCBrZXlzIGtleWJvYXJkICgzIHJvd3Mgb2YgOCBjb2xzLCAzMiBkaW9kZXMgKyAyIGlucHV0cykKKyAqICAgICAgLSBtYWtlIHRoZSBMQ0QgYSBwYXJ0IG9mIGEgdmlydHVhbCBzY3JlZW4gb2YgVngqVnkKKyAqCS0gbWFrZSB0aGUgaW5wdXRzIGxpc3Qgc21wLXNhZmUKKyAqICAgICAgLSBjaGFuZ2UgdGhlIGtleWJvYXJkIHRvIGEgZG91YmxlIG1hcHBpbmcgOiBzaWduYWxzIC0+IGtleV9pZCAtPiB2YWx1ZXMKKyAqICAgICAgICBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2hhbmdlIHZhbHVlcyB3aXRob3V0IGtub3dpbmcgc2lnbmFscworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNyZWxlYXNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIExDRF9NSU5PUgkJMTU2CisjZGVmaW5lIEtFWVBBRF9NSU5PUgkJMTg1CisKKyNkZWZpbmUgUEFORUxfVkVSU0lPTgkJIjAuOS41IgorCisjZGVmaW5lIExDRF9NQVhCWVRFUwkJMjU2CS8qIG1heCBidXJzdCB3cml0ZSAqLworCisjZGVmaW5lIEtFWVBBRF9CVUZGRVIJCTY0CisjZGVmaW5lIElOUFVUX1BPTExfVElNRQkJKEhaLzUwKQkvKiBwb2xsIHRoZSBrZXlib2FyZCB0aGlzIGV2ZXJ5IHNlY29uZCAqLworI2RlZmluZSBLRVlQQURfUkVQX1NUQVJUCSgxMCkJLyogYSBrZXkgc3RhcnRzIHRvIHJlcGVhdCBhZnRlciB0aGlzIHRpbWVzIElOUFVUX1BPTExfVElNRSAqLworI2RlZmluZSBLRVlQQURfUkVQX0RFTEFZCSgyKQkvKiBhIGtleSByZXBlYXRzIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FICovCisKKyNkZWZpbmUgRkxBU0hfTElHSFRfVEVNUE8JKDIwMCkJLyoga2VlcCB0aGUgbGlnaHQgb24gdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgZm9yIGVhY2ggZmxhc2ggKi8KKworLyogY29udmVydHMgYW4gcl9zdHIoKSBpbnB1dCB0byBhbiBhY3RpdmUgaGlnaCwgYml0cyBzdHJpbmcgOiAwMDBCQU9TRSAqLworI2RlZmluZSBQTkxfUElOUFVUKGEpCQkoKCgodW5zaWduZWQgY2hhcikoYSkpIF4gMHg3RikgPj4gMykKKworI2RlZmluZSBQTkxfUEJVU1kJCTB4ODAJLyogaW52ZXJ0ZWQgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BBQ0sJCTB4NDAJLyogZGlyZWN0IGlucHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QT1VUUEEJCTB4MjAJLyogZGlyZWN0IGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBQTkxfUFNFTEVDRAkJMHgxMAkvKiBkaXJlY3QgaW5wdXQsIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIFBOTF9QRVJST1JQCQkweDA4CS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGxvdyAqLworCisjZGVmaW5lIFBOTF9QQklESVIJCTB4MjAJLyogYmktZGlyZWN0aW9uYWwgcG9ydHMgKi8KKyNkZWZpbmUgUE5MX1BJTlRFTgkJMHgxMAkvKiBoaWdoIHRvIHJlYWQgZGF0YSBpbiBvci1lZCB3aXRoIGRhdGEgb3V0ICovCisjZGVmaW5lIFBOTF9QU0VMRUNQCQkweDA4CS8qIGludmVydGVkIG91dHB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUElOSVRQCQkweDA0CS8qIGRpcmVjdCBvdXRwdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BBVVRPTEYJCTB4MDIJLyogaW52ZXJ0ZWQgb3V0cHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QU1RST0JFCQkweDAxCS8qIGludmVydGVkIG91dHB1dCAqLworCisjZGVmaW5lIFBOTF9QRDAJCQkweDAxCisjZGVmaW5lIFBOTF9QRDEJCQkweDAyCisjZGVmaW5lIFBOTF9QRDIJCQkweDA0CisjZGVmaW5lIFBOTF9QRDMJCQkweDA4CisjZGVmaW5lIFBOTF9QRDQJCQkweDEwCisjZGVmaW5lIFBOTF9QRDUJCQkweDIwCisjZGVmaW5lIFBOTF9QRDYJCQkweDQwCisjZGVmaW5lIFBOTF9QRDcJCQkweDgwCisKKyNkZWZpbmUgUElOX05PTkUJCTAKKyNkZWZpbmUgUElOX1NUUk9CRQkJMQorI2RlZmluZSBQSU5fRDAJCQkyCisjZGVmaW5lIFBJTl9EMQkJCTMKKyNkZWZpbmUgUElOX0QyCQkJNAorI2RlZmluZSBQSU5fRDMJCQk1CisjZGVmaW5lIFBJTl9ENAkJCTYKKyNkZWZpbmUgUElOX0Q1CQkJNworI2RlZmluZSBQSU5fRDYJCQk4CisjZGVmaW5lIFBJTl9ENwkJCTkKKyNkZWZpbmUgUElOX0FVVE9MRgkJMTQKKyNkZWZpbmUgUElOX0lOSVRQCQkxNgorI2RlZmluZSBQSU5fU0VMRUNQCQkxNworI2RlZmluZSBQSU5fTk9UX1NFVAkJMTI3CisKKyNkZWZpbmUgTENEX0ZMQUdfUwkJMHgwMDAxCisjZGVmaW5lIExDRF9GTEFHX0lECQkweDAwMDIKKyNkZWZpbmUgTENEX0ZMQUdfQgkJMHgwMDA0CS8qIGJsaW5rIG9uICovCisjZGVmaW5lIExDRF9GTEFHX0MJCTB4MDAwOAkvKiBjdXJzb3Igb24gKi8KKyNkZWZpbmUgTENEX0ZMQUdfRAkJMHgwMDEwCS8qIGRpc3BsYXkgb24gKi8KKyNkZWZpbmUgTENEX0ZMQUdfRgkJMHgwMDIwCS8qIGxhcmdlIGZvbnQgbW9kZSAqLworI2RlZmluZSBMQ0RfRkxBR19OCQkweDAwNDAJLyogMi1yb3dzIG1vZGUgKi8KKyNkZWZpbmUgTENEX0ZMQUdfTAkJMHgwMDgwCS8qIGJhY2tsaWdodCBlbmFibGVkICovCisKKyNkZWZpbmUgTENEX0VTQ0FQRV9MRU4JCTI0CS8qIDI0IGNoYXJzIG1heCBmb3IgYW4gTENEIGVzY2FwZSBjb21tYW5kICovCisjZGVmaW5lIExDRF9FU0NBUEVfQ0hBUgkyNwkvKiB1c2UgY2hhciAyNyBmb3IgZXNjYXBlIGNvbW1hbmQgKi8KKworLyogbWFjcm9zIHRvIHNpbXBsaWZ5IHVzZSBvZiB0aGUgcGFyYWxsZWwgcG9ydCAqLworI2RlZmluZSByX2N0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9jb250cm9sKCh4KS0+cG9ydCkpCisjZGVmaW5lIHJfZHRyKHgpICAgICAgICAocGFycG9ydF9yZWFkX2RhdGEoKHgpLT5wb3J0KSkKKyNkZWZpbmUgcl9zdHIoeCkgICAgICAgIChwYXJwb3J0X3JlYWRfc3RhdHVzKCh4KS0+cG9ydCkpCisjZGVmaW5lIHdfY3RyKHgsIHkpICAgICBkbyB7IHBhcnBvcnRfd3JpdGVfY29udHJvbCgoeCktPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHdfZHRyKHgsIHkpICAgICBkbyB7IHBhcnBvcnRfd3JpdGVfZGF0YSgoeCktPnBvcnQsICh5KSk7IH0gd2hpbGUgKDApCisKKy8qIHRoaXMgZGVmaW5lcyB3aGljaCBiaXRzIGFyZSB0byBiZSB1c2VkIGFuZCB3aGljaCBvbmVzIHRvIGJlIGlnbm9yZWQgKi8KK3N0YXRpYyBfX3U4IHNjYW5fbWFza19vOwkvKiBsb2dpY2FsIG9yIG9mIHRoZSBvdXRwdXQgYml0cyBpbnZvbHZlZCBpbiB0aGUgc2NhbiBtYXRyaXggKi8KK3N0YXRpYyBfX3U4IHNjYW5fbWFza19pOwkvKiBsb2dpY2FsIG9yIG9mIHRoZSBpbnB1dCBiaXRzIGludm9sdmVkIGluIHRoZSBzY2FuIG1hdHJpeCAqLworCit0eXBlZGVmIF9fdTY0IHBtYXNrX3Q7CisKK2VudW0gaW5wdXRfdHlwZSB7CisJSU5QVVRfVFlQRV9TVEQsCisJSU5QVVRfVFlQRV9LQkQsCit9OworCitlbnVtIGlucHV0X3N0YXRlIHsKKwlJTlBVVF9TVF9MT1csCisJSU5QVVRfU1RfUklTSU5HLAorCUlOUFVUX1NUX0hJR0gsCisJSU5QVVRfU1RfRkFMTElORywKK307CisKK3N0cnVjdCBsb2dpY2FsX2lucHV0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJcG1hc2tfdCBtYXNrOworCXBtYXNrX3QgdmFsdWU7CisJZW51bSBpbnB1dF90eXBlIHR5cGU7CisJZW51bSBpbnB1dF9zdGF0ZSBzdGF0ZTsKKwlfX3U4IHJpc2VfdGltZSwgZmFsbF90aW1lOworCV9fdTggcmlzZV90aW1lciwgZmFsbF90aW1lciwgaGlnaF90aW1lcjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsJLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfU1REICovCisJCQl2b2lkICgqcHJlc3NfZmN0KSAoaW50KTsKKwkJCXZvaWQgKCpyZWxlYXNlX2ZjdCkgKGludCk7CisJCQlpbnQgcHJlc3NfZGF0YTsKKwkJCWludCByZWxlYXNlX2RhdGE7CisJCX0gc3RkOworCQlzdHJ1Y3QgewkvKiB0aGlzIHN0cnVjdHVyZSBpcyB2YWxpZCB3aGVuIHR5cGUgPT0gSU5QVVRfVFlQRV9LQkQgKi8KKwkJCS8qIHN0cmluZ3MgY2FuIGJlIGZ1bGwtbGVuZ3RoIChpZS4gbm9uIG51bGwtdGVybWluYXRlZCkgKi8KKwkJCWNoYXIgcHJlc3Nfc3RyW3NpemVvZih2b2lkICopICsgc2l6ZW9mKGludCldOworCQkJY2hhciByZXBlYXRfc3RyW3NpemVvZih2b2lkICopICsgc2l6ZW9mKGludCldOworCQkJY2hhciByZWxlYXNlX3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKKwkJfSBrYmQ7CisJfSB1OworfTsKKworTElTVF9IRUFEKGxvZ2ljYWxfaW5wdXRzKTsJLyogbGlzdCBvZiBhbGwgZGVmaW5lZCBsb2dpY2FsIGlucHV0cyAqLworCisvKiBwaHlzaWNhbCBjb250YWN0cyBoaXN0b3J5CisgKiBQaHlzaWNhbCBjb250YWN0cyBhcmUgYSA0NSBiaXRzIHN0cmluZyBvZiA5IGdyb3VwcyBvZiA1IGJpdHMgZWFjaC4KKyAqIFRoZSA4IGxvd2VyIGdyb3VwcyBjb3JyZXNwb25kIHRvIG91dHB1dCBiaXRzIDAgdG8gNywgYW5kIHRoZSA5dGggZ3JvdXAKKyAqIGNvcnJlc3BvbmRzIHRvIHRoZSBncm91bmQuCisgKiBXaXRoaW4gZWFjaCBncm91cCwgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJlYWQgb24gdGhlIHBvcnQgOgorICogQkFQU0UgKGJ1c3k9NCwgYWNrPTMsIHBhcGVyIGVtcHR5PTIsIHNlbGVjdD0xLCBlcnJvcj0wKS4KKyAqIFNvLCBlYWNoIF9fdTY0IChvciBwbWFza190KSBpcyByZXByZXNlbnRlZCBsaWtlIHRoaXMgOgorICogMDAwMDAwMDAwMDAwMDAwMDAwMEJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRQorICogPC0tLS0tdW51c2VkLS0tLS0tPjxnbmQ+PGQwNz48ZDA2PjxkMDU+PGQwND48ZDAzPjxkMDI+PGQwMT48ZDAwPgorICovCitzdGF0aWMgcG1hc2tfdCBwaHlzX3JlYWQ7CS8qIHdoYXQgaGFzIGp1c3QgYmVlbiByZWFkIGZyb20gdGhlIEkvTyBwb3J0cyAqLworc3RhdGljIHBtYXNrX3QgcGh5c19yZWFkX3ByZXY7CS8qIHByZXZpb3VzIHBoeXNfcmVhZCAqLworc3RhdGljIHBtYXNrX3QgcGh5c19jdXJyOwkvKiBzdGFiaWxpemVkIHBoeXNfcmVhZCAocGh5c19yZWFkfHBoeXNfcmVhZF9wcmV2KSAqLworc3RhdGljIHBtYXNrX3QgcGh5c19wcmV2OwkvKiBwcmV2aW91cyBwaHlzX2N1cnIgKi8KK3N0YXRpYyBjaGFyIGlucHV0c19zdGFibGU7CS8qIDAgbWVhbnMgdGhhdCBhdCBsZWFzdCBvbmUgbG9naWNhbCBzaWduYWwgbmVlZHMgYmUgY29tcHV0ZWQgKi8KKworLyogdGhlc2UgdmFyaWFibGVzIGFyZSBzcGVjaWZpYyB0byB0aGUga2V5cGFkICovCitzdGF0aWMgY2hhciBrZXlwYWRfYnVmZmVyW0tFWVBBRF9CVUZGRVJdOworc3RhdGljIGludCBrZXlwYWRfYnVmbGVuOworc3RhdGljIGludCBrZXlwYWRfc3RhcnQ7CitzdGF0aWMgY2hhciBrZXlwcmVzc2VkOworc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGtleXBhZF9yZWFkX3dhaXQ7CisKKy8qIGxjZC1zcGVjaWZpYyB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfZmxhZ3M7CS8qIGNvbnRhaW5zIHRoZSBMQ0QgY29uZmlnIHN0YXRlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2FkZHJfeDsJLyogY29udGFpbnMgdGhlIExDRCBYIG9mZnNldCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGxjZF9hZGRyX3k7CS8qIGNvbnRhaW5zIHRoZSBMQ0QgWSBvZmZzZXQgKi8KK3N0YXRpYyBjaGFyIGxjZF9lc2NhcGVbTENEX0VTQ0FQRV9MRU4gKyAxXTsJLyogY3VycmVudCBlc2NhcGUgc2VxdWVuY2UsIDAgdGVybWluYXRlZCAqLworc3RhdGljIGludCBsY2RfZXNjYXBlX2xlbiA9IC0xOwkvKiBub3QgaW4gZXNjYXBlIHN0YXRlLiA+PTAgPSBlc2NhcGUgY21kIGxlbiAqLworCisvKgorICogQml0IG1hc2tzIHRvIGNvbnZlcnQgTENEIHNpZ25hbHMgdG8gcGFyYWxsZWwgcG9ydCBvdXRwdXRzLgorICogX2RfIGFyZSB2YWx1ZXMgZm9yIGRhdGEgcG9ydCwgX2NfIGFyZSBmb3IgY29udHJvbCBwb3J0LgorICogWzBdID0gc2lnbmFsIE9GRiwgWzFdID0gc2lnbmFsIE9OLCBbMl0gPSBtYXNrCisgKi8KKyNkZWZpbmUgQklUX0NMUgkJMAorI2RlZmluZSBCSVRfU0VUCQkxCisjZGVmaW5lIEJJVF9NU0sJCTIKKyNkZWZpbmUgQklUX1NUQVRFUwkzCisvKgorICogb25lIGVudHJ5IGZvciBlYWNoIGJpdCBvbiB0aGUgTENECisgKi8KKyNkZWZpbmUgTENEX0JJVF9FCTAKKyNkZWZpbmUgTENEX0JJVF9SUwkxCisjZGVmaW5lIExDRF9CSVRfUlcJMgorI2RlZmluZSBMQ0RfQklUX0JMCTMKKyNkZWZpbmUgTENEX0JJVF9DTAk0CisjZGVmaW5lIExDRF9CSVRfREEJNQorI2RlZmluZSBMQ0RfQklUUwk2CisKKy8qCisgKiBlYWNoIGJpdCBjYW4gYmUgZWl0aGVyIGNvbm5lY3RlZCB0byBhIERBVEEgb3IgQ1RSTCBwb3J0CisgKi8KKyNkZWZpbmUgTENEX1BPUlRfQwkwCisjZGVmaW5lIExDRF9QT1JUX0QJMQorI2RlZmluZSBMQ0RfUE9SVFMJMgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBsY2RfYml0c1tMQ0RfUE9SVFNdW0xDRF9CSVRTXVtCSVRfU1RBVEVTXTsKKworLyoKKyAqIExDRCBwcm90b2NvbHMKKyAqLworI2RlZmluZSBMQ0RfUFJPVE9fUEFSQUxMRUwgICAgICAwCisjZGVmaW5lIExDRF9QUk9UT19TRVJJQUwgICAgICAgIDEKKworLyoKKyAqIExDRCBjaGFyYWN0ZXIgc2V0cworICovCisjZGVmaW5lIExDRF9DSEFSU0VUX05PUk1BTCAgICAgIDAKKyNkZWZpbmUgTENEX0NIQVJTRVRfS1MwMDc0ICAgICAgMQorCisvKgorICogTENEIHR5cGVzCisgKi8KKyNkZWZpbmUgTENEX1RZUEVfTk9ORQkJMAorI2RlZmluZSBMQ0RfVFlQRV9PTEQJCTEKKyNkZWZpbmUgTENEX1RZUEVfS1MwMDc0CQkyCisjZGVmaW5lIExDRF9UWVBFX0hBTlRST05JWAkzCisjZGVmaW5lIExDRF9UWVBFX05FWENPTQkJNAorI2RlZmluZSBMQ0RfVFlQRV9DVVNUT00JCTUKKworLyoKKyAqIGtleXBhZCB0eXBlcworICovCisjZGVmaW5lIEtFWVBBRF9UWVBFX05PTkUJMAorI2RlZmluZSBLRVlQQURfVFlQRV9PTEQJCTEKKyNkZWZpbmUgS0VZUEFEX1RZUEVfTkVXCQkyCisjZGVmaW5lIEtFWVBBRF9UWVBFX05FWENPTQkzCisKKy8qCisgKiBwYW5lbCBwcm9maWxlcworICovCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfQ1VTVE9NCTAKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9PTEQJMQorI2RlZmluZSBQQU5FTF9QUk9GSUxFX05FVwkyCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfSEFOVFJPTklYCTMKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9ORVhDT00JNAorI2RlZmluZSBQQU5FTF9QUk9GSUxFX0xBUkdFCTUKKworLyoKKyAqIENvbnN0cnVjdCBjdXN0b20gY29uZmlnIGZyb20gdGhlIGtlcm5lbCdzIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBERUZBVUxUX1BST0ZJTEUgICAgICAgICBQQU5FTF9QUk9GSUxFX0xBUkdFCisjZGVmaW5lIERFRkFVTFRfUEFSUE9SVCAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9MQ0QgICAgICAgICAgICAgTENEX1RZUEVfT0xECisjZGVmaW5lIERFRkFVTFRfS0VZUEFEICAgICAgICAgIEtFWVBBRF9UWVBFX09MRAorI2RlZmluZSBERUZBVUxUX0xDRF9XSURUSCAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX0xDRF9CV0lEVEggICAgICA0MAorI2RlZmluZSBERUZBVUxUX0xDRF9IV0lEVEggICAgICA2NAorI2RlZmluZSBERUZBVUxUX0xDRF9IRUlHSFQgICAgICAyCisjZGVmaW5lIERFRkFVTFRfTENEX1BST1RPICAgICAgIExDRF9QUk9UT19QQVJBTExFTAorCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9FICAgICAgIFBJTl9BVVRPTEYKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JTICAgICAgUElOX1NFTEVDUAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fUlcgICAgICBQSU5fSU5JVFAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NDTCAgICAgUElOX1NUUk9CRQorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fU0RBICAgICBQSU5fRDAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX0JMICAgICAgUElOX05PVF9TRVQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQ0hBUlNFVCAgICAgTENEX0NIQVJTRVRfTk9STUFMCisKKyNpZmRlZiBDT05GSUdfUEFORUxfUFJPRklMRQorI3VuZGVmIERFRkFVTFRfUFJPRklMRQorI2RlZmluZSBERUZBVUxUX1BST0ZJTEUgQ09ORklHX1BBTkVMX1BST0ZJTEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX1BBUlBPUlQKKyN1bmRlZiBERUZBVUxUX1BBUlBPUlQKKyNkZWZpbmUgREVGQVVMVF9QQVJQT1JUIENPTkZJR19QQU5FTF9QQVJQT1JUCisjZW5kaWYKKworI2lmIERFRkFVTFRfUFJPRklMRSA9PSAwCS8qIGN1c3RvbSAqLworI2lmZGVmIENPTkZJR19QQU5FTF9LRVlQQUQKKyN1bmRlZiBERUZBVUxUX0tFWVBBRAorI2RlZmluZSBERUZBVUxUX0tFWVBBRCBDT05GSUdfUEFORUxfS0VZUEFECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0QKKyN1bmRlZiBERUZBVUxUX0xDRAorI2RlZmluZSBERUZBVUxUX0xDRCBDT05GSUdfUEFORUxfTENECisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfV0lEVEgKKyN1bmRlZiBERUZBVUxUX0xDRF9XSURUSAorI2RlZmluZSBERUZBVUxUX0xDRF9XSURUSCBDT05GSUdfUEFORUxfTENEX1dJRFRICisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfQldJRFRICisjdW5kZWYgREVGQVVMVF9MQ0RfQldJRFRICisjZGVmaW5lIERFRkFVTFRfTENEX0JXSURUSCBDT05GSUdfUEFORUxfTENEX0JXSURUSAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX0hXSURUSAorI3VuZGVmIERFRkFVTFRfTENEX0hXSURUSAorI2RlZmluZSBERUZBVUxUX0xDRF9IV0lEVEggQ09ORklHX1BBTkVMX0xDRF9IV0lEVEgKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9IRUlHSFQKKyN1bmRlZiBERUZBVUxUX0xDRF9IRUlHSFQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSEVJR0hUIENPTkZJR19QQU5FTF9MQ0RfSEVJR0hUCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUFJPVE8KKyN1bmRlZiBERUZBVUxUX0xDRF9QUk9UTworI2RlZmluZSBERUZBVUxUX0xDRF9QUk9UTyBDT05GSUdfUEFORUxfTENEX1BST1RPCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX0UKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fRQorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fRSBDT05GSUdfUEFORUxfTENEX1BJTl9FCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX1JTCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX1JTCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9SUyBDT05GSUdfUEFORUxfTENEX1BJTl9SUworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9SVworI3VuZGVmIERFRkFVTFRfTENEX1BJTl9SVworI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fUlcgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlcKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fU0NMCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX1NDTAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fU0NMIENPTkZJR19QQU5FTF9MQ0RfUElOX1NDTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9TREEKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fU0RBCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9TREEgQ09ORklHX1BBTkVMX0xDRF9QSU5fU0RBCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX0JMCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX0JMCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9CTCBDT05GSUdfUEFORUxfTENEX1BJTl9CTAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX0NIQVJTRVQKKyN1bmRlZiBERUZBVUxUX0xDRF9DSEFSU0VUCisjZGVmaW5lIERFRkFVTFRfTENEX0NIQVJTRVQKKyNlbmRpZgorCisjZW5kaWYgLyogREVGQVVMVF9QUk9GSUxFID09IDAgKi8KKworLyogZ2xvYmFsIHZhcmlhYmxlcyAqLworc3RhdGljIGludCBrZXlwYWRfb3Blbl9jbnQ7CS8qICN0aW1lcyBvcGVuZWQgKi8KK3N0YXRpYyBpbnQgbGNkX29wZW5fY250OwkvKiAjdGltZXMgb3BlbmVkICovCitzdGF0aWMgc3RydWN0IHBhcmRldmljZSAqcHBydDsKKworc3RhdGljIGludCBsY2RfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IGtleXBhZF9pbml0aWFsaXplZDsKKworc3RhdGljIGludCBsaWdodF90ZW1wbzsKKworc3RhdGljIGNoYXIgbGNkX211c3RfY2xlYXI7CitzdGF0aWMgY2hhciBsY2RfbGVmdF9zaGlmdDsKK3N0YXRpYyBjaGFyIGluaXRfaW5fcHJvZ3Jlc3M7CisKK3N0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2NtZCkgKGludCk7CitzdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9kYXRhKSAoaW50KTsKK3N0YXRpYyB2b2lkICgqbGNkX2NsZWFyX2Zhc3QpICh2b2lkKTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhwcHJ0X2xvY2spOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdGltZXI7CisKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBwYXJhbGxlbCBwb3J0IExDRC9LZXlwYWQgZHJpdmVyIik7CisKK3N0YXRpYyBpbnQgcGFycG9ydCA9IC0xOworbW9kdWxlX3BhcmFtKHBhcnBvcnQsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcnBvcnQsICJQYXJhbGxlbCBwb3J0IGluZGV4ICgwPWxwdDEsIDE9bHB0MiwgLi4uKSIpOworCitzdGF0aWMgaW50IGxjZF9oZWlnaHQgPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfaGVpZ2h0LCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfaGVpZ2h0LCAiTnVtYmVyIG9mIGxpbmVzIG9uIHRoZSBMQ0QiKTsKKworc3RhdGljIGludCBsY2Rfd2lkdGggPSAtMTsKK21vZHVsZV9wYXJhbShsY2Rfd2lkdGgsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF93aWR0aCwgIk51bWJlciBvZiBjb2x1bW5zIG9uIHRoZSBMQ0QiKTsKKworc3RhdGljIGludCBsY2RfYndpZHRoID0gLTE7CS8qIGludGVybmFsIGJ1ZmZlciB3aWR0aCAodXN1YWxseSA0MCkgKi8KK21vZHVsZV9wYXJhbShsY2RfYndpZHRoLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfYndpZHRoLCAiSW50ZXJuYWwgTENEIGxpbmUgd2lkdGggKDQwKSIpOworCitzdGF0aWMgaW50IGxjZF9od2lkdGggPSAtMTsJLyogaGFyZHdhcmUgYnVmZmVyIHdpZHRoICh1c3VhbGx5IDY0KSAqLworbW9kdWxlX3BhcmFtKGxjZF9od2lkdGgsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9od2lkdGgsICJMQ0QgbGluZSBoYXJkd2FyZSBhZGRyZXNzICg2NCkiKTsKKworc3RhdGljIGludCBsY2RfZW5hYmxlZCA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9lbmFibGVkLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfZW5hYmxlZCwgIkRlcHJlY2F0ZWQgb3B0aW9uLCB1c2UgbGNkX3R5cGUgaW5zdGVhZCIpOworCitzdGF0aWMgaW50IGtleXBhZF9lbmFibGVkID0gLTE7Cittb2R1bGVfcGFyYW0oa2V5cGFkX2VuYWJsZWQsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGtleXBhZF9lbmFibGVkLCAiRGVwcmVjYXRlZCBvcHRpb24sIHVzZSBrZXlwYWRfdHlwZSBpbnN0ZWFkIik7CisKK3N0YXRpYyBpbnQgbGNkX3R5cGUgPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfdHlwZSwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3R5cGUsCisJCSAiTENEIHR5cGU6IDA9bm9uZSwgMT1vbGQgLy8sIDI9c2VyaWFsIGtzMDA3NCwgMz1oYW50cm9uaXggLy8sIDQ9bmV4Y29tIC8vLCA1PWNvbXBpbGVkLWluIik7CisKK3N0YXRpYyBpbnQgbGNkX3Byb3RvID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX3Byb3RvLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfcHJvdG8sICJMQ0QgY29tbXVuaWNhdGlvbjogMD1wYXJhbGxlbCAoLy8pLCAxPXNlcmlhbCIpOworCitzdGF0aWMgaW50IGxjZF9jaGFyc2V0ID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX2NoYXJzZXQsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9jaGFyc2V0LCAiTENEIGNoYXJhY3RlciBzZXQ6IDA9c3RhbmRhcmQsIDE9S1MwMDc0Iik7CisKK3N0YXRpYyBpbnQga2V5cGFkX3R5cGUgPSAtMTsKK21vZHVsZV9wYXJhbShrZXlwYWRfdHlwZSwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0Moa2V5cGFkX3R5cGUsCisJCSAiS2V5cGFkIHR5cGU6IDA9bm9uZSwgMT1vbGQgNiBrZXlzLCAyPW5ldyA2KzEga2V5cywgMz1uZXhjb20gNCBrZXlzIik7CisKK3N0YXRpYyBpbnQgcHJvZmlsZSA9IERFRkFVTFRfUFJPRklMRTsKK21vZHVsZV9wYXJhbShwcm9maWxlLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhwcm9maWxlLAorCQkgIjE9MTZ4MiBvbGQga3A7IDI9c2VyaWFsIDE2eDIsIG5ldyBrcDsgMz0xNngyIGhhbnRyb25peDsgND0xNngyIG5leGNvbTsgZGVmYXVsdD00MHgyLCBvbGQga3AiKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcGFyYWxsZWwgcG9ydCBwaW5zIHRoZSBMQ0QgY29udHJvbCBzaWduYWxzIGFyZSBjb25uZWN0ZWQgdG8uCisgKiBTZXQgdGhpcyB0byAwIGlmIHRoZSBzaWduYWwgaXMgbm90IHVzZWQuIFNldCBpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUKKyAqIChuZWdhdGl2ZSkgaWYgdGhlIHNpZ25hbCBpcyBuZWdhdGVkLiAtTUFYSU5UIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAqIHBpbiBoYXMgbm90IGJlZW4gZXhwbGljaXRseSBzcGVjaWZpZWQuCisgKgorICogV0FSTklORyEgbm8gY2hlY2sgd2lsbCBiZSBwZXJmb3JtZWQgYWJvdXQgY29sbGlzaW9ucyB3aXRoIGtleXBhZCAhCisgKi8KKworc3RhdGljIGludCBsY2RfZV9waW4gID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX2VfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfZV9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnRScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9yc19waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfcnNfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfcnNfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JTJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX3J3X3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9yd19waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9yd19waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCAnUlcnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfYmxfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX2JsX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2JsX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEIGJhY2tsaWdodCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfZGFfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX2RhX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2RhX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gc2VyaWFsIExDRCAnU0RBJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX2NsX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9jbF9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9jbF9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NDTCcgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqbGNkX2NoYXJfY29udjsKKworLyogZm9yIHNvbWUgTENEIGRyaXZlcnMgKGtzMDA3NCkgd2UgbmVlZCBhIGNoYXJzZXQgY29udmVyc2lvbiB0YWJsZS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxjZF9jaGFyX2NvbnZfa3MwMDc0WzI1Nl0gPSB7CisJLyogICAgICAgICAgMHw4ICAgMXw5ICAgMnxBICAgM3xCICAgNHxDICAgNXxEICAgNnxFICAgN3xGICovCisJLyogMHgwMCAqLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCS8qIDB4MDggKi8gMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwKKwkvKiAweDEwICovIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisJLyogMHgxOCAqLyAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAorCS8qIDB4MjAgKi8gMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHhhMiwgMHgyNSwgMHgyNiwgMHgyNywKKwkvKiAweDI4ICovIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCisJLyogMHgzMCAqLyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCS8qIDB4MzggKi8gMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwKKwkvKiAweDQwICovIDB4YTAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisJLyogMHg0OCAqLyAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLAorCS8qIDB4NTAgKi8gMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywKKwkvKiAweDU4ICovIDB4NTgsIDB4NTksIDB4NWEsIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4MWQsIDB4YzQsCisJLyogMHg2MCAqLyAweDk2LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAorCS8qIDB4NjggKi8gMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwKKwkvKiAweDcwICovIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisJLyogMHg3OCAqLyAweDc4LCAweDc5LCAweDdhLCAweGZkLCAweGZlLCAweGZmLCAweGNlLCAweDIwLAorCS8qIDB4ODAgKi8gMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKwkvKiAweDg4ICovIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsCisJLyogMHg5MCAqLyAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LAorCS8qIDB4OTggKi8gMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwKKwkvKiAweEEwICovIDB4MjAsIDB4NDAsIDB4YjEsIDB4YTEsIDB4MjQsIDB4YTMsIDB4ZmUsIDB4NWYsCisJLyogMHhBOCAqLyAweDIyLCAweGM4LCAweDYxLCAweDE0LCAweDk3LCAweDJkLCAweGFkLCAweDk2LAorCS8qIDB4QjAgKi8gMHg4MCwgMHg4YywgMHg4MiwgMHg4MywgMHgyNywgMHg4ZiwgMHg4NiwgMHhkZCwKKwkvKiAweEI4ICovIDB4MmMsIDB4ODEsIDB4NmYsIDB4MTUsIDB4OGIsIDB4OGEsIDB4ODQsIDB4NjAsCisJLyogMHhDMCAqLyAweGUyLCAweGUyLCAweGUyLCAweDViLCAweDViLCAweGFlLCAweGJjLCAweGE5LAorCS8qIDB4QzggKi8gMHhjNSwgMHhiZiwgMHhjNiwgMHhmMSwgMHhlMywgMHhlMywgMHhlMywgMHhlMywKKwkvKiAweEQwICovIDB4NDQsIDB4NWQsIDB4YTgsIDB4ZTQsIDB4ZWMsIDB4ZWMsIDB4NWMsIDB4NzgsCisJLyogMHhEOCAqLyAweGFiLCAweGE2LCAweGU1LCAweDVlLCAweDVlLCAweGU2LCAweGFhLCAweGJlLAorCS8qIDB4RTAgKi8gMHg3ZiwgMHhlNywgMHhhZiwgMHg3YiwgMHg3YiwgMHhhZiwgMHhiZCwgMHhjOCwKKwkvKiAweEU4ICovIDB4YTQsIDB4YTUsIDB4YzcsIDB4ZjYsIDB4YTcsIDB4ZTgsIDB4NjksIDB4NjksCisJLyogMHhGMCAqLyAweGVkLCAweDdkLCAweGE4LCAweGU0LCAweGVjLCAweDVjLCAweDVjLCAweDI1LAorCS8qIDB4RjggKi8gMHhhYywgMHhhNiwgMHhlYSwgMHhlZiwgMHg3ZSwgMHhlYiwgMHhiMiwgMHg3OSwKK307CisKK2NoYXIgb2xkX2tleXBhZF9wcm9maWxlW11bNF1bOV0gPSB7CisJeyJTMCIsICJMZWZ0XG4iLCAiTGVmdFxuIiwgIiJ9LAorCXsiUzEiLCAiRG93blxuIiwgIkRvd25cbiIsICIifSwKKwl7IlMyIiwgIlVwXG4iLCAiVXBcbiIsICIifSwKKwl7IlMzIiwgIlJpZ2h0XG4iLCAiUmlnaHRcbiIsICIifSwKKwl7IlM0IiwgIkVzY1xuIiwgIkVzY1xuIiwgIiJ9LAorCXsiUzUiLCAiUmV0XG4iLCAiUmV0XG4iLCAiIn0sCisJeyIiLCAiIiwgIiIsICIifQorfTsKKworLyogc2lnbmFscywgcHJlc3MsIHJlcGVhdCwgcmVsZWFzZSAqLworY2hhciBuZXdfa2V5cGFkX3Byb2ZpbGVbXVs0XVs5XSA9IHsKKwl7IlMwIiwgIkxlZnRcbiIsICJMZWZ0XG4iLCAiIn0sCisJeyJTMSIsICJEb3duXG4iLCAiRG93blxuIiwgIiJ9LAorCXsiUzIiLCAiVXBcbiIsICJVcFxuIiwgIiJ9LAorCXsiUzMiLCAiUmlnaHRcbiIsICJSaWdodFxuIiwgIiJ9LAorCXsiUzRzNSIsICIiLCAiRXNjXG4iLCAiRXNjXG4ifSwKKwl7InM0UzUiLCAiIiwgIlJldFxuIiwgIlJldFxuIn0sCisJeyJTNFM1IiwgIkhlbHBcbiIsICIiLCAiIn0sCisJLyogYWRkIG5ldyBzaWduYWxzIGFib3ZlIHRoaXMgbGluZSAqLworCXsiIiwgIiIsICIiLCAiIn0KK307CisKKy8qIHNpZ25hbHMsIHByZXNzLCByZXBlYXQsIHJlbGVhc2UgKi8KK2NoYXIgbmV4Y29tX2tleXBhZF9wcm9maWxlW11bNF1bOV0gPSB7CisJeyJhLXAtZS0iLCAiRG93blxuIiwgIkRvd25cbiIsICIifSwKKwl7ImEtcC1FLSIsICJSZXRcbiIsICJSZXRcbiIsICIifSwKKwl7ImEtUC1FLSIsICJFc2NcbiIsICJFc2NcbiIsICIifSwKKwl7ImEtUC1lLSIsICJVcFxuIiwgIlVwXG4iLCAiIn0sCisJLyogYWRkIG5ldyBzaWduYWxzIGFib3ZlIHRoaXMgbGluZSAqLworCXsiIiwgIiIsICIiLCAiIn0KK307CisKK3N0YXRpYyBjaGFyICgqa2V5cGFkX3Byb2ZpbGUpWzRdWzldID0gb2xkX2tleXBhZF9wcm9maWxlOworCisvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgYml0IGFycmF5IGNvbnRhaW5pbmcgc2lnbmFscyBzdGF0ZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgZTsJLyogcGFyYWxsZWwgTENEIEUgICAoZGF0YSBsYXRjaCBvbiBmYWxsaW5nIGVkZ2UpICovCisJdW5zaWduZWQgY2hhciByczsJLyogcGFyYWxsZWwgTENEIFJTICAoMCA9IGNtZCwgMSA9IGRhdGEpICovCisJdW5zaWduZWQgY2hhciBydzsJLyogcGFyYWxsZWwgTENEIFIvVyAoMCA9IFcsIDEgPSBSKSAqLworCXVuc2lnbmVkIGNoYXIgYmw7CS8qIHBhcmFsbGVsIExDRCBiYWNrbGlnaHQgKDAgPSBvZmYsIDEgPSBvbikgKi8KKwl1bnNpZ25lZCBjaGFyIGNsOwkvKiBzZXJpYWwgTENEIGNsb2NrIChsYXRjaCBvbiByaXNpbmcgZWRnZSkgKi8KKwl1bnNpZ25lZCBjaGFyIGRhOwkvKiBzZXJpYWwgTENEIGRhdGEgKi8KK30gYml0czsKKworc3RhdGljIHZvaWQgaW5pdF9zY2FuX3RpbWVyKHZvaWQpOworCisvKiBzZXRzIGRhdGEgcG9ydCBiaXRzIGFjY29yZGluZyB0byBjdXJyZW50IHNpZ25hbHMgdmFsdWVzICovCitzdGF0aWMgaW50IHNldF9kYXRhX2JpdHModm9pZCkKK3sKKwlpbnQgdmFsLCBiaXQ7CisKKwl2YWwgPSByX2R0cihwcHJ0KTsKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IExDRF9CSVRTOyBiaXQrKykKKwkJdmFsICY9IGxjZF9iaXRzW0xDRF9QT1JUX0RdW2JpdF1bQklUX01TS107CisKKwl2YWwgfD0gbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9FXVtiaXRzLmVdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9SU11bYml0cy5yc10KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX1JXXVtiaXRzLnJ3XQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQkxdW2JpdHMuYmxdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9DTF1bYml0cy5jbF0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0RBXVtiaXRzLmRhXTsKKworCXdfZHRyKHBwcnQsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworLyogc2V0cyBjdHJsIHBvcnQgYml0cyBhY2NvcmRpbmcgdG8gY3VycmVudCBzaWduYWxzIHZhbHVlcyAqLworc3RhdGljIGludCBzZXRfY3RybF9iaXRzKHZvaWQpCit7CisJaW50IHZhbCwgYml0OworCisJdmFsID0gcl9jdHIocHBydCk7CisJZm9yIChiaXQgPSAwOyBiaXQgPCBMQ0RfQklUUzsgYml0KyspCisJCXZhbCAmPSBsY2RfYml0c1tMQ0RfUE9SVF9DXVtiaXRdW0JJVF9NU0tdOworCisJdmFsIHw9IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfRV1bYml0cy5lXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfUlNdW2JpdHMucnNdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SV11bYml0cy5yd10KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0JMXVtiaXRzLmJsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfQ0xdW2JpdHMuY2xdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9EQV1bYml0cy5kYV07CisKKwl3X2N0cihwcHJ0LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKy8qIHNldHMgY3RybCAmIGRhdGEgcG9ydCBiaXRzIGFjY29yZGluZyB0byBjdXJyZW50IHNpZ25hbHMgdmFsdWVzICovCitzdGF0aWMgdm9pZCBzZXRfYml0cyh2b2lkKQoreworCXNldF9kYXRhX2JpdHMoKTsKKwlzZXRfY3RybF9iaXRzKCk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhIHBhcmFsbGVsIHBvcnQgcGluIChmcm9tIC0yNSB0byAyNSkgdG8gZGF0YSBhbmQgY29udHJvbCBwb3J0cworICogbWFza3MsIGFuZCBkYXRhIGFuZCBjb250cm9sIHBvcnQgYml0cy4gVGhlIHNpZ25hbCB3aWxsIGJlIGNvbnNpZGVyZWQKKyAqIHVuY29ubmVjdGVkIGlmIGl0J3Mgb24gcGluIDAgb3IgYW4gaW52YWxpZCBwaW4gKDwtMjUgb3IgPjI1KS4KKyAqCisgKiBSZXN1bHQgd2lsbCBiZSB1c2VkIHRoaXMgd2F5IDoKKyAqICAgb3V0KGRwb3J0LCBpbihkcG9ydCkgJiBkX3ZhbFsyXSB8IGRfdmFsW3NpZ25hbF9zdGF0ZV0pCisgKiAgIG91dChjcG9ydCwgaW4oY3BvcnQpICYgY192YWxbMl0gfCBjX3ZhbFtzaWduYWxfc3RhdGVdKQorICovCit2b2lkIHBpbl90b19iaXRzKGludCBwaW4sIHVuc2lnbmVkIGNoYXIgKmRfdmFsLCB1bnNpZ25lZCBjaGFyICpjX3ZhbCkKK3sKKwlpbnQgZF9iaXQsIGNfYml0LCBpbnY7CisKKwlkX3ZhbFswXSA9IGNfdmFsWzBdID0gZF92YWxbMV0gPSBjX3ZhbFsxXSA9IDA7CisJZF92YWxbMl0gPSBjX3ZhbFsyXSA9IDB4RkY7CisKKwlpZiAocGluID09IDApCisJCXJldHVybjsKKworCWludiA9IChwaW4gPCAwKTsKKwlpZiAoaW52KQorCQlwaW4gPSAtcGluOworCisJZF9iaXQgPSBjX2JpdCA9IDA7CisKKwlzd2l0Y2ggKHBpbikgeworCWNhc2UgUElOX1NUUk9CRToJLyogc3Ryb2JlLCBpbnZlcnRlZCAqLworCQljX2JpdCA9IFBOTF9QU1RST0JFOworCQlpbnYgPSAhaW52OworCQlicmVhazsKKwljYXNlIFBJTl9EMC4uLlBJTl9ENzoJLyogRDAgLSBENyA9IDIgLSA5ICovCisJCWRfYml0ID0gMSA8PCAocGluIC0gMik7CisJCWJyZWFrOworCWNhc2UgUElOX0FVVE9MRjoJLyogYXV0b2ZlZWQsIGludmVydGVkICovCisJCWNfYml0ID0gUE5MX1BBVVRPTEY7CisJCWludiA9ICFpbnY7CisJCWJyZWFrOworCWNhc2UgUElOX0lOSVRQOgkvKiBpbml0LCBkaXJlY3QgKi8KKwkJY19iaXQgPSBQTkxfUElOSVRQOworCQlicmVhazsKKwljYXNlIFBJTl9TRUxFQ1A6CS8qIHNlbGVjdF9pbiwgaW52ZXJ0ZWQgKi8KKwkJY19iaXQgPSBQTkxfUFNFTEVDUDsKKwkJaW52ID0gIWludjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIHVua25vd24gcGluLCBpZ25vcmUgKi8KKwkJYnJlYWs7CisJfQorCisJaWYgKGNfYml0KSB7CisJCWNfdmFsWzJdICY9IH5jX2JpdDsKKwkJY192YWxbIWludl0gPSBjX2JpdDsKKwl9IGVsc2UgaWYgKGRfYml0KSB7CisJCWRfdmFsWzJdICY9IH5kX2JpdDsKKwkJZF92YWxbIWludl0gPSBkX2JpdDsKKwl9Cit9CisKKy8qIHNsZWVwcyB0aGF0IG1hbnkgbWlsbGlzZWNvbmRzIHdpdGggYSByZXNjaGVkdWxlICovCitzdGF0aWMgdm9pZCBsb25nX3NsZWVwKGludCBtcykKK3sKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJbWRlbGF5KG1zKTsKKwllbHNlIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoKG1zICogSFogKyA5OTkpIC8gMTAwMCk7CisJfQorfQorCisvKiBzZW5kIGEgc2VyaWFsIGJ5dGUgdG8gdGhlIExDRCBwYW5lbC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbG9ja2luZyBpZiBuZWVkZWQuICovCitzdGF0aWMgdm9pZCBsY2Rfc2VuZF9zZXJpYWwoaW50IGJ5dGUpCit7CisJaW50IGJpdDsKKworCS8qIHRoZSBkYXRhIGJpdCBpcyBzZXQgb24gRDAsIGFuZCB0aGUgY2xvY2sgb24gU1RST0JFLgorCSAqIExDRCByZWFkcyBEMCBvbiBTVFJPQkUncyByaXNpbmcgZWRnZS4KKwkgKi8KKwlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCWJpdHMuY2wgPSBCSVRfQ0xSOwkvKiBDTEsgbG93ICovCisJCXNldF9iaXRzKCk7CisJCWJpdHMuZGEgPSBieXRlICYgMTsKKwkJc2V0X2JpdHMoKTsKKwkJdWRlbGF5KDIpOwkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMiB1cyBiZWZvcmUgQ0xLIHVwICovCisJCWJpdHMuY2wgPSBCSVRfU0VUOwkvKiBDTEsgaGlnaCAqLworCQlzZXRfYml0cygpOworCQl1ZGVsYXkoMSk7CS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDEgdXMgKi8KKwkJYnl0ZSA+Pj0gMTsKKwl9Cit9CisKKy8qIHR1cm4gdGhlIGJhY2tsaWdodCBvbiBvciBvZmYgKi8KK3N0YXRpYyB2b2lkIGxjZF9iYWNrbGlnaHQoaW50IG9uKQoreworCWlmIChsY2RfYmxfcGluID09IFBJTl9OT05FKQorCQlyZXR1cm47CisKKwkvKiBUaGUgYmFja2xpZ2h0IGlzIGFjdGl2YXRlZCBieSBzZXRpbmcgdGhlIEFVVE9GRUVEIGxpbmUgdG8gKzVWICAqLworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwliaXRzLmJsID0gb247CisJc2V0X2JpdHMoKTsKKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgdG8gdGhlIExDRCBwYW5lbCBpbiBzZXJpYWwgbW9kZSAqLworc3RhdGljIHZvaWQgbGNkX3dyaXRlX2NtZF9zKGludCBjbWQpCit7CisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCWxjZF9zZW5kX3NlcmlhbCgweDFGKTsJLyogUi9XPVcsIFJTPTAgKi8KKwlsY2Rfc2VuZF9zZXJpYWwoY21kICYgMHgwRik7CisJbGNkX3NlbmRfc2VyaWFsKChjbWQgPj4gNCkgJiAweDBGKTsKKwl1ZGVsYXkoNDApOwkJLyogdGhlIHNob3J0ZXN0IGNvbW1hbmQgdGFrZXMgYXQgbGVhc3QgNDAgdXMgKi8KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworLyogc2VuZCBkYXRhIHRvIHRoZSBMQ0QgcGFuZWwgaW4gc2VyaWFsIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGxjZF93cml0ZV9kYXRhX3MoaW50IGRhdGEpCit7CisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCWxjZF9zZW5kX3NlcmlhbCgweDVGKTsJLyogUi9XPVcsIFJTPTEgKi8KKwlsY2Rfc2VuZF9zZXJpYWwoZGF0YSAmIDB4MEYpOworCWxjZF9zZW5kX3NlcmlhbCgoZGF0YSA+PiA0KSAmIDB4MEYpOworCXVkZWxheSg0MCk7CQkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0MCB1cyAqLworCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworfQorCisvKiBzZW5kIGEgY29tbWFuZCB0byB0aGUgTENEIHBhbmVsIGluIDggYml0cyBwYXJhbGxlbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfY21kX3A4KGludCBjbWQpCit7CisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCS8qIHByZXNlbnQgdGhlIGRhdGEgdG8gdGhlIGRhdGEgcG9ydCAqLworCXdfZHRyKHBwcnQsIGNtZCk7CisJdWRlbGF5KDIwKTsJCS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCisJYml0cy5lID0gQklUX1NFVDsKKwliaXRzLnJzID0gQklUX0NMUjsKKwliaXRzLnJ3ID0gQklUX0NMUjsKKwlzZXRfY3RybF9iaXRzKCk7CisKKwl1ZGVsYXkoNDApOwkJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKworCWJpdHMuZSA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDEyMCk7CQkvKiB0aGUgc2hvcnRlc3QgY29tbWFuZCB0YWtlcyBhdCBsZWFzdCAxMjAgdXMgKi8KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworLyogc2VuZCBkYXRhIHRvIHRoZSBMQ0QgcGFuZWwgaW4gOCBiaXRzIHBhcmFsbGVsIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGxjZF93cml0ZV9kYXRhX3A4KGludCBkYXRhKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwkvKiBwcmVzZW50IHRoZSBkYXRhIHRvIHRoZSBkYXRhIHBvcnQgKi8KKwl3X2R0cihwcHJ0LCBkYXRhKTsKKwl1ZGVsYXkoMjApOwkJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIwIHVzIGJlZm9yZSB0aGUgc3Ryb2JlICovCisKKwliaXRzLmUgPSBCSVRfU0VUOworCWJpdHMucnMgPSBCSVRfU0VUOworCWJpdHMucncgPSBCSVRfQ0xSOworCXNldF9jdHJsX2JpdHMoKTsKKworCXVkZWxheSg0MCk7CQkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyA0MCB1cyAqLworCisJYml0cy5lID0gQklUX0NMUjsKKwlzZXRfY3RybF9iaXRzKCk7CisKKwl1ZGVsYXkoNDUpOwkJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDUgdXMgKi8KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbGNkX2dvdG94eSh2b2lkKQoreworCWxjZF93cml0ZV9jbWQoMHg4MAkvKiBzZXQgRERSQU0gYWRkcmVzcyAqLworCQkgICAgICB8IChsY2RfYWRkcl95ID8gbGNkX2h3aWR0aCA6IDApCisJCSAgICAgIC8qIHdlIGZvcmNlIHRoZSBjdXJzb3IgdG8gc3RheSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGlmIGl0IHdhbnRzIHRvIGdvIGZhcnRoZXIgKi8KKwkJICAgICAgfCAoKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKSA/IGxjZF9hZGRyX3ggJgorCQkJIChsY2RfaHdpZHRoIC0gMSkgOiBsY2RfYndpZHRoIC0gMSkpOworfQorCitzdGF0aWMgdm9pZCBsY2RfcHJpbnQoY2hhciBjKQoreworCWlmIChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkgeworCQlpZiAobGNkX2NoYXJfY29udiAhPSBOVUxMKQorCQkJYyA9IGxjZF9jaGFyX2NvbnZbKHVuc2lnbmVkIGNoYXIpY107CisJCWxjZF93cml0ZV9kYXRhKGMpOworCQlsY2RfYWRkcl94Kys7CisJfQorCS8qIHByZXZlbnRzIHRoZSBjdXJzb3IgZnJvbSB3cmFwcGluZyBvbnRvIHRoZSBuZXh0IGxpbmUgKi8KKwlpZiAobGNkX2FkZHJfeCA9PSBsY2RfYndpZHRoKQorCQlsY2RfZ290b3h5KCk7Cit9CisKKy8qIGZpbGxzIHRoZSBkaXNwbGF5IHdpdGggc3BhY2VzIGFuZCByZXNldHMgWC9ZICovCitzdGF0aWMgdm9pZCBsY2RfY2xlYXJfZmFzdF9zKHZvaWQpCit7CisJaW50IHBvczsKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX2dvdG94eSgpOworCisJc3Bpbl9sb2NrKCZwcHJ0X2xvY2spOworCWZvciAocG9zID0gMDsgcG9zIDwgbGNkX2hlaWdodCAqIGxjZF9od2lkdGg7IHBvcysrKSB7CisJCWxjZF9zZW5kX3NlcmlhbCgweDVGKTsJLyogUi9XPVcsIFJTPTEgKi8KKwkJbGNkX3NlbmRfc2VyaWFsKCcgJyAmIDB4MEYpOworCQlsY2Rfc2VuZF9zZXJpYWwoKCcgJyA+PiA0KSAmIDB4MEYpOworCQl1ZGVsYXkoNDApOwkvKiB0aGUgc2hvcnRlc3QgZGF0YSB0YWtlcyBhdCBsZWFzdCA0MCB1cyAqLworCX0KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKKworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfZ290b3h5KCk7Cit9CisKKy8qIGZpbGxzIHRoZSBkaXNwbGF5IHdpdGggc3BhY2VzIGFuZCByZXNldHMgWC9ZICovCitzdGF0aWMgdm9pZCBsY2RfY2xlYXJfZmFzdF9wOCh2b2lkKQoreworCWludCBwb3M7CisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKKworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGxjZF9oZWlnaHQgKiBsY2RfaHdpZHRoOyBwb3MrKykgeworCQkvKiBwcmVzZW50IHRoZSBkYXRhIHRvIHRoZSBkYXRhIHBvcnQgKi8KKwkJd19kdHIocHBydCwgJyAnKTsKKwkJdWRlbGF5KDIwKTsJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIwIHVzIGJlZm9yZSB0aGUgc3Ryb2JlICovCisKKwkJYml0cy5lID0gQklUX1NFVDsKKwkJYml0cy5ycyA9IEJJVF9TRVQ7CisJCWJpdHMucncgPSBCSVRfQ0xSOworCQlzZXRfY3RybF9iaXRzKCk7CisKKwkJdWRlbGF5KDQwKTsJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKworCQliaXRzLmUgPSBCSVRfQ0xSOworCQlzZXRfY3RybF9iaXRzKCk7CisKKwkJdWRlbGF5KDQ1KTsJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDUgdXMgKi8KKwl9CisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7CisKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX2dvdG94eSgpOworfQorCisvKiBjbGVhcnMgdGhlIGRpc3BsYXkgYW5kIHJlc2V0cyBYL1kgKi8KK3N0YXRpYyB2b2lkIGxjZF9jbGVhcl9kaXNwbGF5KHZvaWQpCit7CisJbGNkX3dyaXRlX2NtZCgweDAxKTsJLyogY2xlYXIgZGlzcGxheSAqLworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwkvKiB3ZSBtdXN0IHdhaXQgYSBmZXcgbWlsbGlzZWNvbmRzICgxNSkgKi8KKwlsb25nX3NsZWVwKDE1KTsKK30KKworc3RhdGljIHZvaWQgbGNkX2luaXRfZGlzcGxheSh2b2lkKQoreworCisJbGNkX2ZsYWdzID0gKChsY2RfaGVpZ2h0ID4gMSkgPyBMQ0RfRkxBR19OIDogMCkKKwkgICAgfCBMQ0RfRkxBR19EIHwgTENEX0ZMQUdfQyB8IExDRF9GTEFHX0I7CisKKwlsb25nX3NsZWVwKDIwKTsJCS8qIHdhaXQgMjAgbXMgYWZ0ZXIgcG93ZXItdXAgZm9yIHRoZSBwYXJhbm9pZCAqLworCisJbGNkX3dyaXRlX2NtZCgweDMwKTsJLyogOGJpdHMsIDEgbGluZSwgc21hbGwgZm9udHMgKi8KKwlsb25nX3NsZWVwKDEwKTsKKwlsY2Rfd3JpdGVfY21kKDB4MzApOwkvKiA4Yml0cywgMSBsaW5lLCBzbWFsbCBmb250cyAqLworCWxvbmdfc2xlZXAoMTApOworCWxjZF93cml0ZV9jbWQoMHgzMCk7CS8qIDhiaXRzLCAxIGxpbmUsIHNtYWxsIGZvbnRzICovCisJbG9uZ19zbGVlcCgxMCk7CisKKwlsY2Rfd3JpdGVfY21kKDB4MzAJLyogc2V0IGZvbnQgaGVpZ2h0IGFuZCBsaW5lcyBudW1iZXIgKi8KKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0YpID8gNCA6IDApCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19OKSA/IDggOiAwKQorCSAgICApOworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDA4KTsJLyogZGlzcGxheSBvZmYsIGN1cnNvciBvZmYsIGJsaW5rIG9mZiAqLworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDA4CS8qIHNldCBkaXNwbGF5IG1vZGUgKi8KKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0QpID8gNCA6IDApCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19DKSA/IDIgOiAwKQorCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQikgPyAxIDogMCkKKwkgICAgKTsKKworCWxjZF9iYWNrbGlnaHQoKGxjZF9mbGFncyAmIExDRF9GTEFHX0wpID8gMSA6IDApOworCisJbG9uZ19zbGVlcCgxMCk7CisKKwlsY2Rfd3JpdGVfY21kKDB4MDYpOwkvKiBlbnRyeSBtb2RlIHNldCA6IGluY3JlbWVudCwgY3Vyc29yIHNoaWZ0aW5nICovCisKKwlsY2RfY2xlYXJfZGlzcGxheSgpOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbiBmdW5jdGlvbiBmb3IgdXNlciBhY2Nlc3MgdG8gL2Rldi9sY2QKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gYmUgY2FsbGVkIGZyb20gaW5zaWRlIHRoZSBrZXJuZWwsIGJ5CisgKiBzZXR0aW5nIGZpbGUgYW5kIHBwb3MgdG8gTlVMTC4KKyAqCisgKi8KKworc3RhdGljIHNzaXplX3QgbGNkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwljb25zdCBjaGFyICp0bXAgPSBidWY7CisJY2hhciBjOworCisJZm9yICg7IGNvdW50LS0gPiAwOyAocHBvcyA/ICgqcHBvcykrKyA6IDApLCArK3RtcCkgeworCQlpZiAoIWluX2ludGVycnVwdCgpICYmICgoKGNvdW50ICsgMSkgJiAweDFmKSA9PSAwKSkKKwkJCXNjaGVkdWxlKCk7CS8qIGxldCdzIGJlIGEgbGl0dGxlIG5pY2Ugd2l0aCBvdGhlciBwcm9jZXNzZXMgdGhhdCBuZWVkIHNvbWUgQ1BVICovCisKKwkJaWYgKHBwb3MgPT0gTlVMTCAmJiBmaWxlID09IE5VTEwpCisJCQljID0gKnRtcDsJLyogbGV0J3Mgbm90IHVzZSBnZXRfdXNlcigpIGZyb20gdGhlIGtlcm5lbCAhICovCisJCWVsc2UgaWYgKGdldF91c2VyKGMsIHRtcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBmaXJzdCwgd2UnbGwgdGVzdCBpZiB3ZSdyZSBpbiBlc2NhcGUgbW9kZSAqLworCQlpZiAoKGMgIT0gJ1xuJykgJiYgbGNkX2VzY2FwZV9sZW4gPj0gMCkgewkvKiB5ZXMsIGxldCdzIGFkZCB0aGlzIGNoYXIgdG8gdGhlIGJ1ZmZlciAqLworCQkJbGNkX2VzY2FwZVtsY2RfZXNjYXBlX2xlbisrXSA9IGM7CisJCQlsY2RfZXNjYXBlW2xjZF9lc2NhcGVfbGVuXSA9IDA7CisJCX0gZWxzZSB7CisJCQlsY2RfZXNjYXBlX2xlbiA9IC0xOwkvKiBhYm9ydHMgYW55IHByZXZpb3VzIGVzY2FwZSBzZXF1ZW5jZSAqLworCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgTENEX0VTQ0FQRV9DSEFSOgkvKiBzdGFydCBvZiBhbiBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCQlsY2RfZXNjYXBlX2xlbiA9IDA7CisJCQkJbGNkX2VzY2FwZVtsY2RfZXNjYXBlX2xlbl0gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnXGInOgkvKiBnbyBiYWNrIG9uZSBjaGFyIGFuZCBjbGVhciBpdCAqLworCQkJCWlmIChsY2RfYWRkcl94ID4gMCkgeworCQkJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpCS8qIGNoZWNrIGlmIHdlJ3JlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lICovCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyICovCisJCQkJCWxjZF9hZGRyX3gtLTsKKwkJCQl9CisJCQkJbGNkX3dyaXRlX2RhdGEoJyAnKTsJLyogcmVwbGFjZSB3aXRoIGEgc3BhY2UgKi8KKwkJCQlsY2Rfd3JpdGVfY21kKDB4MTApOwkvKiBiYWNrIG9uZSBjaGFyIGFnYWluICovCisJCQkJYnJlYWs7CisJCQljYXNlICdcMDE0JzoJLyogcXVpY2tseSBjbGVhciB0aGUgZGlzcGxheSAqLworCQkJCWxjZF9jbGVhcl9mYXN0KCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdcbic6CS8qIGZsdXNoIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgbGluZSBhbmQgZ28gdG8gdGhlCisJCQkJCSAgIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lICovCisJCQkJZm9yICg7IGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoOyBsY2RfYWRkcl94KyspCisJCQkJCWxjZF93cml0ZV9kYXRhKCcgJyk7CisJCQkJbGNkX2FkZHJfeCA9IDA7CisJCQkJbGNkX2FkZHJfeSA9IChsY2RfYWRkcl95ICsgMSkgJSBsY2RfaGVpZ2h0OworCQkJCWxjZF9nb3RveHkoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xyJzoJLyogZ28gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2FtZSBsaW5lICovCisJCQkJbGNkX2FkZHJfeCA9IDA7CisJCQkJbGNkX2dvdG94eSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnXHQnOgkvKiBwcmludCBhIHNwYWNlIGluc3RlYWQgb2YgdGhlIHRhYiAqLworCQkJCWxjZF9wcmludCgnICcpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoJLyogc2ltcGx5IHByaW50IHRoaXMgY2hhciAqLworCQkJCWxjZF9wcmludChjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIG5vdyB3ZSdsbCBzZWUgaWYgd2UncmUgaW4gYW4gZXNjYXBlIG1vZGUgYW5kIGlmIHRoZSBjdXJyZW50CisJCSAgIGVzY2FwZSBzZXF1ZW5jZSBjYW4gYmUgdW5kZXJzdG9vZC4KKwkJICovCisJCWlmIChsY2RfZXNjYXBlX2xlbiA+PSAyKSB7CS8qIG1pbmltYWwgbGVuZ3RoIGZvciBhbiBlc2NhcGUgY29tbWFuZCAqLworCQkJaW50IHByb2Nlc3NlZCA9IDA7CS8qIDEgbWVhbnMgdGhlIGNvbW1hbmQgaGFzIGJlZW4gcHJvY2Vzc2VkICovCisKKwkJCWlmICghc3RyY21wKGxjZF9lc2NhcGUsICJbMkoiKSkgewkvKiBDbGVhciB0aGUgZGlzcGxheSAqLworCQkJCWxjZF9jbGVhcl9mYXN0KCk7CS8qIGNsZWFyIGRpc3BsYXkgKi8KKwkJCQlwcm9jZXNzZWQgPSAxOworCQkJfSBlbHNlIGlmICghc3RyY21wKGxjZF9lc2NhcGUsICJbSCIpKSB7CS8qIEN1cnNvciB0byBob21lICovCisJCQkJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCQkJCWxjZF9nb3RveHkoKTsKKwkJCQlwcm9jZXNzZWQgPSAxOworCQkJfQorCQkJLyogY29kZXMgc3RhcnRpbmcgd2l0aCBeW1tMICovCisJCQllbHNlIGlmICgobGNkX2VzY2FwZV9sZW4gPj0gMykgJiYKKwkJCQkgKGxjZF9lc2NhcGVbMF0gPT0gJ1snKSAmJiAobGNkX2VzY2FwZVsxXSA9PSAnTCcpKSB7CS8qIExDRCBzcGVjaWFsIGNvZGVzICovCisKKwkJCQljaGFyICplc2MgPSBsY2RfZXNjYXBlICsgMjsKKwkJCQlpbnQgb2xkZmxhZ3MgPSBsY2RfZmxhZ3M7CisKKwkJCQkvKiBjaGVjayBmb3IgZGlzcGxheSBtb2RlIGZsYWdzICovCisJCQkJc3dpdGNoICgqZXNjKSB7CisJCQkJY2FzZSAnRCc6CS8qIERpc3BsYXkgT04gKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0Q7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2QnOgkvKiBEaXNwbGF5IE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0Q7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0MnOgkvKiBDdXJzb3IgT04gKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0M7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2MnOgkvKiBDdXJzb3IgT0ZGICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfQzsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQic6CS8qIEJsaW5rIE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19COworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdiJzoJLyogQmxpbmsgT0ZGICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfQjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKyc6CS8qIEJhY2sgbGlnaHQgT04gKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0w7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJy0nOgkvKiBCYWNrIGxpZ2h0IE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0w7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyonOgkvKiBmbGFzaCBiYWNrIGxpZ2h0IHVzaW5nIHRoZSBrZXlwYWQgdGltZXIgKi8KKwkJCQkJaWYgKHNjYW5fdGltZXIuZnVuY3Rpb24gIT0gTlVMTCkgeworCQkJCQkJaWYgKGxpZ2h0X3RlbXBvID09IDAKKwkJCQkJCSAgICAmJiAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0wpCisJCQkJCQkJPT0gMCkpCisJCQkJCQkJbGNkX2JhY2tsaWdodCgxKTsKKwkJCQkJCWxpZ2h0X3RlbXBvID0gRkxBU0hfTElHSFRfVEVNUE87CisJCQkJCX0KKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnZic6CS8qIFNtYWxsIEZvbnQgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19GOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdGJzoJLyogTGFyZ2UgRm9udCAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfRjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnbic6CS8qIE9uZSBMaW5lICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfTjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnTic6CS8qIFR3byBMaW5lcyAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfTjsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdsJzoJLyogU2hpZnQgQ3Vyc29yIExlZnQgKi8KKwkJCQkJaWYgKGxjZF9hZGRyX3ggPiAwKSB7CisJCQkJCQlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpCisJCQkJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsJLyogYmFjayBvbmUgY2hhciBpZiBub3QgYXQgZW5kIG9mIGxpbmUgKi8KKwkJCQkJCWxjZF9hZGRyX3gtLTsKKwkJCQkJfQorCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ3InOgkvKiBzaGlmdCBjdXJzb3IgcmlnaHQgKi8KKwkJCQkJaWYgKGxjZF9hZGRyX3ggPCBsY2Rfd2lkdGgpIHsKKwkJCQkJCWlmIChsY2RfYWRkcl94IDwgKGxjZF9id2lkdGggLSAxKSkKKwkJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTQpOwkvKiBhbGxvdyB0aGUgY3Vyc29yIHRvIHBhc3MgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkJCQkJbGNkX2FkZHJfeCsrOworCQkJCQl9CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnTCc6CS8qIHNoaWZ0IGRpc3BsYXkgbGVmdCAqLworCQkJCQlsY2RfbGVmdF9zaGlmdCsrOworCQkJCQlsY2Rfd3JpdGVfY21kKDB4MTgpOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ1InOgkvKiBzaGlmdCBkaXNwbGF5IHJpZ2h0ICovCisJCQkJCWxjZF9sZWZ0X3NoaWZ0LS07CisJCQkJCWxjZF93cml0ZV9jbWQoMHgxQyk7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnayc6ewkvKiBraWxsIGVuZCBvZiBsaW5lICovCisJCQkJCQlpbnQgeDsKKwkJCQkJCWZvciAoeCA9IGxjZF9hZGRyX3g7IHggPCBsY2RfYndpZHRoOyB4KyspCisJCQkJCQkJbGNkX3dyaXRlX2RhdGEoJyAnKTsKKwkJCQkJCWxjZF9nb3RveHkoKTsJLyogcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWNhc2UgJ0knOgkvKiByZWluaXRpYWxpemUgZGlzcGxheSAqLworCQkJCQlsY2RfaW5pdF9kaXNwbGF5KCk7CisJCQkJCWxjZF9sZWZ0X3NoaWZ0ID0gMDsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdHJzoJLyogR2VuZXJhdG9yIDogTEdjeHh4eHguLi54eDsgKi8gIHsKKwkJCQkJCS8qIG11c3QgaGF2ZSA8Yz4gYmV0d2VlbiAnMCcgYW5kICc3JywgcmVwcmVzZW50aW5nIHRoZSBudW1lcmljYWwKKwkJCQkJCSAqIEFTQ0lJIGNvZGUgb2YgdGhlIHJlZGVmaW5lZCBjaGFyYWN0ZXIsIGFuZCA8eHguLi54eD4gYSBzZXF1ZW5jZQorCQkJCQkJICogb2YgMTYgaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgOCBieXRlcyBmb3IgZWFjaCBjaGFyYWN0ZXIuIE1vc3QKKwkJCQkJCSAqIExDRHMgd2lsbCBvbmx5IHVzZSA1IGxvd2VyIGJpdHMgb2YgdGhlIDcgZmlyc3QgYnl0ZXMuCisJCQkJCQkgKi8KKworCQkJCQkJdW5zaWduZWQgY2hhciBjZ2J5dGVzWzhdOworCQkJCQkJdW5zaWduZWQgY2hhciBjZ2FkZHI7CisJCQkJCQlpbnQgY2dvZmZzZXQ7CisJCQkJCQlpbnQgc2hpZnQ7CisJCQkJCQljaGFyIHZhbHVlOworCQkJCQkJaW50IGFkZHI7CisKKwkJCQkJCWlmIChzdHJjaHIoZXNjLCAnOycpID09IE5VTEwpCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWVzYysrOworCisJCQkJCQljZ2FkZHIgPSAqKGVzYysrKSAtICcwJzsKKwkJCQkJCWlmIChjZ2FkZHIgPiA3KSB7CisJCQkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJY2dvZmZzZXQgPSAwOworCQkJCQkJc2hpZnQgPSAwOworCQkJCQkJdmFsdWUgPSAwOworCQkJCQkJd2hpbGUgKCplc2MgJiYgY2dvZmZzZXQgPCA4KSB7CisJCQkJCQkJc2hpZnQgXj0gNDsKKwkJCQkJCQlpZiAoKmVzYyA+PSAnMCcgJiYgKmVzYyA8PSAnOScpCisJCQkJCQkJCXZhbHVlIHw9ICgqZXNjIC0gJzAnKSA8PCBzaGlmdDsKKwkJCQkJCQllbHNlIGlmICgqZXNjID49ICdBJyAmJiAqZXNjIDw9ICdaJykKKwkJCQkJCQkJdmFsdWUgfD0gKCplc2MgLSAnQScgKyAxMCkgPDwgc2hpZnQ7CisJCQkJCQkJZWxzZSBpZiAoKmVzYyA+PSAnYScgJiYgKmVzYyA8PSAneicpCisJCQkJCQkJCXZhbHVlIHw9ICgqZXNjIC0gJ2EnICsgMTApIDw8IHNoaWZ0OworCQkJCQkJCWVsc2UgeworCQkJCQkJCQllc2MrKzsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHNoaWZ0ID09IDApIHsKKwkJCQkJCQkJY2dieXRlc1tjZ29mZnNldCsrXSA9IHZhbHVlOworCQkJCQkJCQl2YWx1ZSA9IDA7CisJCQkJCQkJfQorCisJCQkJCQkJZXNjKys7CisJCQkJCQl9CisKKwkJCQkJCWxjZF93cml0ZV9jbWQoMHg0MCB8IChjZ2FkZHIgKiA4KSk7CisJCQkJCQlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY2dvZmZzZXQ7IGFkZHIrKykKKwkJCQkJCQlsY2Rfd3JpdGVfZGF0YShjZ2J5dGVzW2FkZHJdKTsKKworCQkJCQkJbGNkX2dvdG94eSgpOwkvKiBlbnN1cmVzIHRoYXQgd2Ugc3RvcCB3cml0aW5nIHRvIENHUkFNICovCisJCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQljYXNlICd4JzoJLyogZ290b3h5IDogTHhYWFhbeVlZWV07ICovCisJCQkJY2FzZSAneSc6CS8qIGdvdG94eSA6IEx5WVlZW3hYWFhdOyAqLworCQkJCQlpZiAoc3RyY2hyKGVzYywgJzsnKSA9PSBOVUxMKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJd2hpbGUgKCplc2MpIHsKKwkJCQkJCWlmICgqZXNjID09ICd4JykgeworCQkJCQkJCWVzYysrOworCQkJCQkJCWxjZF9hZGRyX3ggPSAwOworCQkJCQkJCXdoaWxlIChpc2RpZ2l0KCplc2MpKSB7CisJCQkJCQkJCWxjZF9hZGRyX3ggPQorCQkJCQkJCQkgICAgbGNkX2FkZHJfeCAqCisJCQkJCQkJCSAgICAxMCArICgqZXNjIC0KKwkJCQkJCQkJCSAgJzAnKTsKKwkJCQkJCQkJZXNjKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICgqZXNjID09ICd5JykgeworCQkJCQkJCWVzYysrOworCQkJCQkJCWxjZF9hZGRyX3kgPSAwOworCQkJCQkJCXdoaWxlIChpc2RpZ2l0KCplc2MpKSB7CisJCQkJCQkJCWxjZF9hZGRyX3kgPQorCQkJCQkJCQkgICAgbGNkX2FkZHJfeSAqCisJCQkJCQkJCSAgICAxMCArICgqZXNjIC0KKwkJCQkJCQkJCSAgJzAnKTsKKwkJCQkJCQkJZXNjKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlsY2RfZ290b3h5KCk7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0JLyogZW5kIG9mIHN3aXRjaCAqLworCisJCQkJLyogQ2hlY2sgd2V0aGVyIG9uZSBmbGFnIHdhcyBjaGFuZ2VkICovCisJCQkJaWYgKG9sZGZsYWdzICE9IGxjZF9mbGFncykgeworCQkJCQkvKiBjaGVjayB3ZXRoZXIgb25lIG9mIEIsQyxEIGZsYWdzIHdhcyBjaGFuZ2VkICovCisJCQkJCWlmICgob2xkZmxhZ3MgXiBsY2RfZmxhZ3MpICYKKwkJCQkJICAgIChMQ0RfRkxBR19CIHwgTENEX0ZMQUdfQyB8IExDRF9GTEFHX0QpKQorCQkJCQkJLyogc2V0IGRpc3BsYXkgbW9kZSAqLworCQkJCQkJbGNkX3dyaXRlX2NtZCgweDA4IHwKKwkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0QpID8gNCA6IDApIHwKKwkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0MpID8gMiA6IDApIHwKKwkJCQkJCQkgICAgICAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0IpID8gMSA6IDApKTsKKwkJCQkJLyogY2hlY2sgd2V0aGVyIG9uZSBvZiBGLE4gZmxhZ3Mgd2FzIGNoYW5nZWQgKi8KKwkJCQkJZWxzZSBpZiAoKG9sZGZsYWdzIF4gbGNkX2ZsYWdzKSAmCisJCQkJCQkgKExDRF9GTEFHX0YgfCBMQ0RfRkxBR19OKSkKKwkJCQkJCWxjZF93cml0ZV9jbWQoMHgzMCB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19GKSA/IDQgOiAwKSB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19OKSA/IDggOiAwKSk7CisJCQkJCS8qIGNoZWNrIHdldGhlciBMIGZsYWcgd2FzIGNoYW5nZWQgKi8KKwkJCQkJZWxzZSBpZiAoKG9sZGZsYWdzIF4gbGNkX2ZsYWdzKSAmCisJCQkJCQkgKExDRF9GTEFHX0wpKSB7CisJCQkJCQlpZiAobGNkX2ZsYWdzICYgKExDRF9GTEFHX0wpKQorCQkJCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQkJCQllbHNlIGlmIChsaWdodF90ZW1wbyA9PSAwKQkvKiBzd2l0Y2ggb2ZmIHRoZSBsaWdodCBvbmx5IHdoZW4gdGhlIHRlbXBvIGxpZ2h0aW5nIGlzIGdvbmUgKi8KKwkJCQkJCQlsY2RfYmFja2xpZ2h0KDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBMQ0Qgc3BlY2lhbCBlc2NhcGUgY29kZXMgKi8KKwkJCS8qIGZsdXNoIHRoZSBlc2NhcGUgc2VxdWVuY2UgaWYgaXQncyBiZWVuIHByb2Nlc3NlZCBvciBpZiBpdCBpcworCQkJICAgZ2V0dGluZyB0b28gbG9uZy4gKi8KKwkJCWlmIChwcm9jZXNzZWQgfHwgKGxjZF9lc2NhcGVfbGVuID49IExDRF9FU0NBUEVfTEVOKSkKKwkJCQlsY2RfZXNjYXBlX2xlbiA9IC0xOworCQl9CQkvKiBlc2NhcGUgY29kZXMgKi8KKwl9CisKKwlyZXR1cm4gdG1wIC0gYnVmOworfQorCitzdGF0aWMgaW50IGxjZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChsY2Rfb3Blbl9jbnQpCisJCXJldHVybiAtRUJVU1k7CS8qIG9wZW4gb25seSBvbmNlIGF0IGEgdGltZSAqLworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCS8qIGRldmljZSBpcyB3cml0ZS1vbmx5ICovCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobGNkX211c3RfY2xlYXIpIHsKKwkJbGNkX2NsZWFyX2Rpc3BsYXkoKTsKKwkJbGNkX211c3RfY2xlYXIgPSAwOworCX0KKwlsY2Rfb3Blbl9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsY2RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsY2Rfb3Blbl9jbnQtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGNkX2ZvcHMgPSB7CisJLndyaXRlICAgPSBsY2Rfd3JpdGUsCisJLm9wZW4gICAgPSBsY2Rfb3BlbiwKKwkucmVsZWFzZSA9IGxjZF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGxjZF9kZXYgPSB7CisJTENEX01JTk9SLAorCSJsY2QiLAorCSZsY2RfZm9wcworfTsKKworLyogcHVibGljIGZ1bmN0aW9uIHVzYWJsZSBmcm9tIHRoZSBrZXJuZWwgZm9yIGFueSBwdXJwb3NlICovCit2b2lkIHBhbmVsX2xjZF9wcmludChjaGFyICpzKQoreworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpCisJCWxjZF93cml0ZShOVUxMLCBzLCBzdHJsZW4ocyksIE5VTEwpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBMQ0QgZHJpdmVyICovCit2b2lkIGxjZF9pbml0KHZvaWQpCit7CisJc3dpdGNoIChsY2RfdHlwZSkgeworCWNhc2UgTENEX1RZUEVfT0xEOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fUEFSQUxMRUw7CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IExDRF9DSEFSU0VUX05PUk1BTDsKKwkJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9lX3BpbiA9IFBJTl9TVFJPQkU7CisJCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3JzX3BpbiA9IFBJTl9BVVRPTEY7CisKKwkJaWYgKGxjZF93aWR0aCA8IDApCisJCQlsY2Rfd2lkdGggPSA0MDsKKwkJaWYgKGxjZF9id2lkdGggPCAwKQorCQkJbGNkX2J3aWR0aCA9IDQwOworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gNjQ7CisJCWlmIChsY2RfaGVpZ2h0IDwgMCkKKwkJCWxjZF9oZWlnaHQgPSAyOworCQlicmVhazsKKwljYXNlIExDRF9UWVBFX0tTMDA3NDoJLyogc2VyaWFsIG1vZGUsIGtzMDA3NCAqLworCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IExDRF9QUk9UT19TRVJJQUw7CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IExDRF9DSEFSU0VUX0tTMDA3NDsKKwkJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfYmxfcGluID0gUElOX0FVVE9MRjsKKwkJaWYgKGxjZF9jbF9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfY2xfcGluID0gUElOX1NUUk9CRTsKKwkJaWYgKGxjZF9kYV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZGFfcGluID0gUElOX0QwOworCisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gMTY7CisJCWlmIChsY2RfYndpZHRoIDwgMCkKKwkJCWxjZF9id2lkdGggPSA0MDsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDE2OworCQlpZiAobGNkX2hlaWdodCA8IDApCisJCQlsY2RfaGVpZ2h0ID0gMjsKKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9ORVhDT006CS8qIHBhcmFsbGVsIG1vZGUsIDggYml0cywgZ2VuZXJpYyAqLworCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IExDRF9QUk9UT19QQVJBTExFTDsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gTENEX0NIQVJTRVRfTk9STUFMOworCQlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2VfcGluID0gUElOX0FVVE9MRjsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gUElOX1NFTEVDUDsKKwkJaWYgKGxjZF9yd19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcndfcGluID0gUElOX0lOSVRQOworCisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gMTY7CisJCWlmIChsY2RfYndpZHRoIDwgMCkKKwkJCWxjZF9id2lkdGggPSA0MDsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDY0OworCQlpZiAobGNkX2hlaWdodCA8IDApCisJCQlsY2RfaGVpZ2h0ID0gMjsKKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9DVVNUT006CS8qIGN1c3RvbWVyLWRlZmluZWQgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBERUZBVUxUX0xDRF9QUk9UTzsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gREVGQVVMVF9MQ0RfQ0hBUlNFVDsKKwkJLyogZGVmYXVsdCBnZW9tZXRyeSB3aWxsIGJlIHNldCBsYXRlciAqLworCQlicmVhazsKKwljYXNlIExDRF9UWVBFX0hBTlRST05JWDoJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzLCBoYW50cm9uaXgtbGlrZSAqLworCWRlZmF1bHQ6CisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9OT1JNQUw7CisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBQSU5fU1RST0JFOworCQlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yc19waW4gPSBQSU5fU0VMRUNQOworCisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gMTY7CisJCWlmIChsY2RfYndpZHRoIDwgMCkKKwkJCWxjZF9id2lkdGggPSA0MDsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDY0OworCQlpZiAobGNkX2hlaWdodCA8IDApCisJCQlsY2RfaGVpZ2h0ID0gMjsKKwkJYnJlYWs7CisJfQorCisJLyogdGhpcyBpcyB1c2VkIHRvIGNhdGNoIHdyb25nIGFuZCBkZWZhdWx0IHZhbHVlcyAqLworCWlmIChsY2Rfd2lkdGggPD0gMCkKKwkJbGNkX3dpZHRoID0gREVGQVVMVF9MQ0RfV0lEVEg7CisJaWYgKGxjZF9id2lkdGggPD0gMCkKKwkJbGNkX2J3aWR0aCA9IERFRkFVTFRfTENEX0JXSURUSDsKKwlpZiAobGNkX2h3aWR0aCA8PSAwKQorCQlsY2RfaHdpZHRoID0gREVGQVVMVF9MQ0RfSFdJRFRIOworCWlmIChsY2RfaGVpZ2h0IDw9IDApCisJCWxjZF9oZWlnaHQgPSBERUZBVUxUX0xDRF9IRUlHSFQ7CisKKwlpZiAobGNkX3Byb3RvID09IExDRF9QUk9UT19TRVJJQUwpIHsJLyogU0VSSUFMICovCisJCWxjZF93cml0ZV9jbWQgPSBsY2Rfd3JpdGVfY21kX3M7CisJCWxjZF93cml0ZV9kYXRhID0gbGNkX3dyaXRlX2RhdGFfczsKKwkJbGNkX2NsZWFyX2Zhc3QgPSBsY2RfY2xlYXJfZmFzdF9zOworCisJCWlmIChsY2RfY2xfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2NsX3BpbiA9IERFRkFVTFRfTENEX1BJTl9TQ0w7CisJCWlmIChsY2RfZGFfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2RhX3BpbiA9IERFRkFVTFRfTENEX1BJTl9TREE7CisKKwl9IGVsc2UgewkJLyogUEFSQUxMRUwgKi8KKwkJbGNkX3dyaXRlX2NtZCA9IGxjZF93cml0ZV9jbWRfcDg7CisJCWxjZF93cml0ZV9kYXRhID0gbGNkX3dyaXRlX2RhdGFfcDg7CisJCWxjZF9jbGVhcl9mYXN0ID0gbGNkX2NsZWFyX2Zhc3RfcDg7CisKKwkJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9lX3BpbiA9IERFRkFVTFRfTENEX1BJTl9FOworCQlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yc19waW4gPSBERUZBVUxUX0xDRF9QSU5fUlM7CisJCWlmIChsY2RfcndfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3J3X3BpbiA9IERFRkFVTFRfTENEX1BJTl9SVzsKKwl9CisKKwlpZiAobGNkX2JsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2JsX3BpbiA9IERFRkFVTFRfTENEX1BJTl9CTDsKKworCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9lX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfcnNfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9yd19waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9yd19waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX2JsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2JsX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfY2xfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfY2xfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9kYV9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9kYV9waW4gPSBQSU5fTk9ORTsKKworCWlmIChsY2RfY2hhcnNldCA8IDApCisJCWxjZF9jaGFyc2V0ID0gREVGQVVMVF9MQ0RfQ0hBUlNFVDsKKworCWlmIChsY2RfY2hhcnNldCA9PSBMQ0RfQ0hBUlNFVF9LUzAwNzQpCisJCWxjZF9jaGFyX2NvbnYgPSBsY2RfY2hhcl9jb252X2tzMDA3NDsKKwllbHNlCisJCWxjZF9jaGFyX2NvbnYgPSBOVUxMOworCisJaWYgKGxjZF9ibF9waW4gIT0gUElOX05PTkUpCisJCWluaXRfc2Nhbl90aW1lcigpOworCisJcGluX3RvX2JpdHMobGNkX2VfcGluLCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0VdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9FXSk7CisJcGluX3RvX2JpdHMobGNkX3JzX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9SU10sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX1JTXSk7CisJcGluX3RvX2JpdHMobGNkX3J3X3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9SV10sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX1JXXSk7CisJcGluX3RvX2JpdHMobGNkX2JsX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9CTF0sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0JMXSk7CisJcGluX3RvX2JpdHMobGNkX2NsX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9DTF0sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0NMXSk7CisJcGluX3RvX2JpdHMobGNkX2RhX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9EQV0sCisJCSAgICBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0RBXSk7CisKKwkvKiBiZWZvcmUgdGhpcyBsaW5lLCB3ZSBtdXN0IE5PVCBzZW5kIGFueXRoaW5nIHRvIHRoZSBkaXNwbGF5LgorCSAqIFNpbmNlIGxjZF9pbml0X2Rpc3BsYXkoKSBuZWVkcyB0byB3cml0ZSBkYXRhLCB3ZSBoYXZlIHRvCisJICogZW5hYmxlIG1hcmsgdGhlIExDRCBpbml0aWFsaXplZCBqdXN0IGJlZm9yZS4KKwkgKi8KKwlsY2RfaW5pdGlhbGl6ZWQgPSAxOworCWxjZF9pbml0X2Rpc3BsYXkoKTsKKworCS8qIGRpc3BsYXkgYSBzaG9ydCBtZXNzYWdlICovCisjaWZkZWYgQ09ORklHX1BBTkVMX0NIQU5HRV9NRVNTQUdFCisjaWZkZWYgQ09ORklHX1BBTkVMX0JPT1RfTUVTU0FHRQorCXBhbmVsX2xjZF9wcmludCgiXHgxYltMY1x4MWJbTGJceDFiW0wqIiBDT05GSUdfUEFORUxfQk9PVF9NRVNTQUdFKTsKKyNlbmRpZgorI2Vsc2UKKwlwYW5lbF9sY2RfcHJpbnQoIlx4MWJbTGNceDFiW0xiXHgxYltMKkxpbnV4LSIgVVRTX1JFTEVBU0UgIlxuUGFuZWwtIgorCQkJUEFORUxfVkVSU0lPTik7CisjZW5kaWYKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX211c3RfY2xlYXIgPSAxOwkvKiBjbGVhciB0aGUgZGlzcGxheSBvbiB0aGUgbmV4dCBkZXZpY2Ugb3BlbmluZyAqLworCWxjZF9nb3RveHkoKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYva2V5cGFkCisgKi8KKworc3RhdGljIHNzaXplX3Qga2V5cGFkX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJdW5zaWduZWQgaSA9ICpwcG9zOworCWNoYXIgKnRtcCA9IGJ1ZjsKKworCWlmIChrZXlwYWRfYnVmbGVuID09IDApIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigma2V5cGFkX3JlYWRfd2FpdCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJfQorCisJZm9yICg7IGNvdW50LS0gPiAwICYmIChrZXlwYWRfYnVmbGVuID4gMCk7ICsraSwgKyt0bXAsIC0ta2V5cGFkX2J1ZmxlbikgeworCQlwdXRfdXNlcihrZXlwYWRfYnVmZmVyW2tleXBhZF9zdGFydF0sIHRtcCk7CisJCWtleXBhZF9zdGFydCA9IChrZXlwYWRfc3RhcnQgKyAxKSAlIEtFWVBBRF9CVUZGRVI7CisJfQorCSpwcG9zID0gaTsKKworCXJldHVybiB0bXAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQga2V5cGFkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisKKwlpZiAoa2V5cGFkX29wZW5fY250KQorCQlyZXR1cm4gLUVCVVNZOwkvKiBvcGVuIG9ubHkgb25jZSBhdCBhIHRpbWUgKi8KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkJLyogZGV2aWNlIGlzIHJlYWQtb25seSAqLworCQlyZXR1cm4gLUVQRVJNOworCisJa2V5cGFkX2J1ZmxlbiA9IDA7CS8qIGZsdXNoIHRoZSBidWZmZXIgb24gb3BlbmluZyAqLworCWtleXBhZF9vcGVuX2NudCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtleXBhZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWtleXBhZF9vcGVuX2NudC0tOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrZXlwYWRfZm9wcyA9IHsKKwkucmVhZCAgICA9IGtleXBhZF9yZWFkLAkJLyogcmVhZCAqLworCS5vcGVuICAgID0ga2V5cGFkX29wZW4sCQkvKiBvcGVuICovCisJLnJlbGVhc2UgPSBrZXlwYWRfcmVsZWFzZSwJLyogY2xvc2UgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBrZXlwYWRfZGV2ID0geworCUtFWVBBRF9NSU5PUiwKKwkia2V5cGFkIiwKKwkma2V5cGFkX2ZvcHMKK307CisKK3N0YXRpYyB2b2lkIGtleXBhZF9zZW5kX2tleShjaGFyICpzdHJpbmcsIGludCBtYXhfbGVuKQoreworCWlmIChpbml0X2luX3Byb2dyZXNzKQorCQlyZXR1cm47CisKKwkvKiBzZW5kIHRoZSBrZXkgdG8gdGhlIGRldmljZSBvbmx5IGlmIGEgcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBpdC4gKi8KKwlpZiAoa2V5cGFkX29wZW5fY250ID4gMCkgeworCQl3aGlsZSAobWF4X2xlbi0tICYmIGtleXBhZF9idWZsZW4gPCBLRVlQQURfQlVGRkVSICYmICpzdHJpbmcpIHsKKwkJCWtleXBhZF9idWZmZXJbKGtleXBhZF9zdGFydCArIGtleXBhZF9idWZsZW4rKykgJQorCQkJCSAgICAgIEtFWVBBRF9CVUZGRVJdID0gKnN0cmluZysrOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma2V5cGFkX3JlYWRfd2FpdCk7CisJfQorfQorCisvKiB0aGlzIGZ1bmN0aW9uIHNjYW5zIGFsbCB0aGUgYml0cyBpbnZvbHZpbmcgYXQgbGVhc3Qgb25lIGxvZ2ljYWwgc2lnbmFsLCBhbmQgcHV0cyB0aGUKKyAqIHJlc3VsdHMgaW4gdGhlIGJpdGZpZWxkICJwaHlzX3JlYWQiIChvbmUgYml0IHBlciBlc3RhYmxpc2hlZCBjb250YWN0KSwgYW5kIHNldHMKKyAqICJwaHlzX3JlYWRfcHJldiIgdG8gInBoeXNfcmVhZCIuCisgKgorICogTm90ZTogdG8gZGVib3VuY2UgaW5wdXQgc2lnbmFscywgd2Ugd2lsbCBvbmx5IGNvbnNpZGVyIGFzIHN3aXRjaGVkIGEgc2lnbmFsIHdoaWNoIGlzCisgKiBzdGFibGUgYWNyb3NzIDIgbWVhc3VyZXMuIFNpZ25hbHMgd2hpY2ggYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHR3byByZWFkcyB3aWxsIGJlIGtlcHQKKyAqIGFzIHRoZXkgcHJldmlvdXNseSB3ZXJlIGluIHRoZWlyIGxvZ2ljYWwgZm9ybSAocGh5c19wcmV2KS4gQSBzaWduYWwgd2hpY2ggaGFzIGp1c3QKKyAqIHN3aXRjaGVkIHdpbGwgaGF2ZSBhIDEgaW4gKHBoeXNfcmVhZCBeIHBoeXNfcmVhZF9wcmV2KS4KKyAqLworc3RhdGljIHZvaWQgcGh5c19zY2FuX2NvbnRhY3RzKHZvaWQpCit7CisJaW50IGJpdCwgYml0dmFsOworCWNoYXIgb2xkdmFsOworCWNoYXIgYml0bWFzazsKKwljaGFyIGduZG1hc2s7CisKKwlwaHlzX3ByZXYgPSBwaHlzX2N1cnI7CisJcGh5c19yZWFkX3ByZXYgPSBwaHlzX3JlYWQ7CisJcGh5c19yZWFkID0gMDsJCS8qIGZsdXNoIGFsbCBzaWduYWxzICovCisKKwlvbGR2YWwgPSByX2R0cihwcHJ0KSB8IHNjYW5fbWFza19vOwkvKiBrZWVwIHRyYWNrIG9mIG9sZCB2YWx1ZSwgd2l0aCBhbGwgb3V0cHV0cyBkaXNhYmxlZCAqLworCXdfZHRyKHBwcnQsIG9sZHZhbCAmIH5zY2FuX21hc2tfbyk7CS8qIGFjdGl2YXRlIGFsbCBrZXlib2FyZCBvdXRwdXRzIChhY3RpdmUgbG93KSAqLworCWJpdG1hc2sgPSBQTkxfUElOUFVUKHJfc3RyKHBwcnQpKSAmIHNjYW5fbWFza19pOwkvKiB3aWxsIGhhdmUgYSAxIGZvciBlYWNoIGJpdCBzZXQgdG8gZ25kICovCisJd19kdHIocHBydCwgb2xkdmFsKTsJLyogZGlzYWJsZSBhbGwgbWF0cml4IHNpZ25hbHMgKi8KKworCS8qIG5vdyB0aGF0IGFsbCBvdXRwdXRzIGFyZSBjbGVhcmVkLCB0aGUgb25seSBhY3RpdmUgaW5wdXQgYml0cyBhcmUKKwkgKiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIGdyb3VuZAorCSAqLworCWduZG1hc2sgPSBQTkxfUElOUFVUKHJfc3RyKHBwcnQpKSAmIHNjYW5fbWFza19pOwkvKiAxIGZvciBlYWNoIGdyb3VuZGVkIGlucHV0ICovCisKKwlwaHlzX3JlYWQgfD0gKHBtYXNrX3QpIGduZG1hc2sgPDwgNDA7CS8qIGdyb3VuZGVkIGlucHV0cyBhcmUgc2lnbmFscyA0MC00NCAqLworCisJaWYgKGJpdG1hc2sgIT0gZ25kbWFzaykgeworCQkvKiBzaW5jZSBjbGVhcmluZyB0aGUgb3V0cHV0cyBjaGFuZ2VkIHNvbWUgaW5wdXRzLCB3ZSBrbm93IHRoYXQgc29tZQorCQkgKiBpbnB1dCBzaWduYWxzIGFyZSBjdXJyZW50bHkgdGllZCB0byBzb21lIG91dHB1dHMuIFNvIHdlJ2xsIHNjYW4gdGhlbS4KKwkJICovCisJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJCWJpdHZhbCA9IDEgPDwgYml0OworCisJCQlpZiAoIShzY2FuX21hc2tfbyAmIGJpdHZhbCkpCS8qIHNraXAgdW51c2VkIGJpdHMgKi8KKwkJCQljb250aW51ZTsKKworCQkJd19kdHIocHBydCwgb2xkdmFsICYgfmJpdHZhbCk7CS8qIGVuYWJsZSB0aGlzIG91dHB1dCAqLworCQkJYml0bWFzayA9IFBOTF9QSU5QVVQocl9zdHIocHBydCkpICYgfmduZG1hc2s7CisJCQlwaHlzX3JlYWQgfD0gKHBtYXNrX3QpIGJpdG1hc2sgPDwgKDUgKiBiaXQpOworCQl9CisJCXdfZHRyKHBwcnQsIG9sZHZhbCk7CS8qIGRpc2FibGUgYWxsIG91dHB1dHMgKi8KKwl9CisJLyogdGhpcyBpcyBlYXN5OiB1c2Ugb2xkIGJpdHMgd2hlbiB0aGV5IGFyZSBmbGFwcGluZywgdXNlIG5ldyBvbmVzIHdoZW4gc3RhYmxlICovCisJcGh5c19jdXJyID0KKwkgICAgKHBoeXNfcHJldiAmIChwaHlzX3JlYWQgXiBwaHlzX3JlYWRfcHJldikpIHwgKHBoeXNfcmVhZCAmCisJCQkJCQkJICB+KHBoeXNfcmVhZCBeCisJCQkJCQkJICAgIHBoeXNfcmVhZF9wcmV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX3Byb2Nlc3NfaW5wdXRzKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqaW5wdXQ7CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImVudGVyaW5nIHBhbmVsX3Byb2Nlc3NfaW5wdXRzIHdpdGggcHA9JTAxNkx4ICYgcGM9JTAxNkx4XG4iLAorCSAgICAgICBwaHlzX3ByZXYsIHBoeXNfY3Vycik7CisjZW5kaWYKKworCWtleXByZXNzZWQgPSAwOworCWlucHV0c19zdGFibGUgPSAxOworCWxpc3RfZm9yX2VhY2goaXRlbSwgJmxvZ2ljYWxfaW5wdXRzKSB7CisJCWlucHV0ID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgbG9naWNhbF9pbnB1dCwgbGlzdCk7CisKKwkJc3dpdGNoIChpbnB1dC0+c3RhdGUpIHsKKwkJY2FzZSBJTlBVVF9TVF9MT1c6CisJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSAhPSBpbnB1dC0+dmFsdWUpCisJCQkJYnJlYWs7CisJCQkvKiBpZiBhbGwgbmVlZGVkIG9uZXMgd2VyZSBhbHJlYWR5IHNldCBwcmV2aW91c2x5LCB0aGlzIG1lYW5zIHRoYXQKKwkJCSAqIHRoaXMgbG9naWNhbCBzaWduYWwgaGFzIGJlZW4gYWN0aXZhdGVkIGJ5IHRoZSByZWxlYXNpbmcgb2YKKwkJCSAqIGFub3RoZXIgY29tYmluZWQgc2lnbmFsLCBzbyB3ZSBkb24ndCB3YW50IHRvIG1hdGNoLgorCQkJICogZWc6IEFCIC0ocmVsZWFzZSBCKS0+IEEgLShyZWxlYXNlIEEpLT4gMCA6IGRvbid0IG1hdGNoIEEuCisJCQkgKi8KKwkJCWlmICgocGh5c19wcmV2ICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkKKwkJCQlicmVhazsKKwkJCWlucHV0LT5yaXNlX3RpbWVyID0gMDsKKwkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX1JJU0lORzsKKwkJCS8qIG5vIGJyZWFrIGhlcmUsIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOUFVUX1NUX1JJU0lORzoKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spICE9IGlucHV0LT52YWx1ZSkgeworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbnB1dC0+cmlzZV90aW1lciA8IGlucHV0LT5yaXNlX3RpbWUpIHsKKwkJCQlpbnB1dHNfc3RhYmxlID0gMDsKKwkJCQlpbnB1dC0+cmlzZV90aW1lcisrOworCQkJCWJyZWFrOworCQkJfQorCQkJaW5wdXQtPmhpZ2hfdGltZXIgPSAwOworCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfSElHSDsKKwkJCS8qIG5vIGJyZWFrIGhlcmUsIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOUFVUX1NUX0hJR0g6CisjaWYgMAorCQkJLyogRklYTUU6CisJCQkgKiB0aGlzIGlzIGFuIGludmFsaWQgdGVzdC4gSXQgdHJpZXMgdG8gY2F0Y2ggdHJhbnNpdGlvbnMgZnJvbSBzaW5nbGUta2V5CisJCQkgKiB0byBtdWx0aXBsZS1rZXksIGJ1dCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBjb250YWN0cyBwb2xhcml0eS4KKwkJCSAqIFRoZSBvbmx5IHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIGlzIHRvIHBhcnNlIGtleXMgZnJvbSB0aGUgbW9zdCBjb21wbGV4CisJCQkgKiB0byB0aGUgc2ltcGxlc3QgY29tYmluYXRpb25zLCBhbmQgbWFyayB0aGVtIGFzICdjYXVnaHQnIG9uY2UgYSBjb21iaW5hdGlvbgorCQkJICogbWF0Y2hlcywgdGhlbiB1bm1hdGNoIGl0IGZvciBhbGwgb3RoZXIgb25lcy4KKwkJCSAqLworCisJCQkvKiB0cnkgdG8gY2F0Y2ggZGFuZ2Vyb3VzIHRyYW5zaXRpb25zIGNhc2VzIDoKKwkJCSAqIHNvbWVvbmUgYWRkcyBhIGJpdCwgc28gdGhpcyBzaWduYWwgd2FzIGEgZmFsc2UKKwkJCSAqIHBvc2l0aXZlIHJlc3VsdGluZyBmcm9tIGEgdHJhbnNpdGlvbi4gV2Ugc2hvdWxkIGludmFsaWRhdGUKKwkJCSAqIHRoZSBzaWduYWwgaW1tZWRpYXRlbHkgYW5kIG5vdCBjYWxsIHRoZSByZWxlYXNlIGZ1bmN0aW9uLgorCQkJICogZWc6IDAgLShwcmVzcyBBKS0+IEEgLShwcmVzcyBCKS0+IEFCIDogZG9uJ3QgbWF0Y2ggQSdzIHJlbGVhc2UuCisJCQkgKi8KKwkJCWlmICgoKHBoeXNfcHJldiAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpCisJCQkgICAgJiYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgPiBpbnB1dC0+dmFsdWUpKSB7CisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOwkvKiBpbnZhbGlkYXRlICovCisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKSB7CisJCQkJaWYgKChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX1NURCkKKwkJCQkgICAgJiYgKGlucHV0LT5oaWdoX3RpbWVyID09IDApKSB7CisJCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7CisJCQkJCWlmIChpbnB1dC0+dS5zdGQucHJlc3NfZmN0ICE9IE5VTEwpCisJCQkJCQlpbnB1dC0+dS5zdGQucHJlc3NfZmN0KGlucHV0LT51LgorCQkJCQkJCQkgICAgICAgc3RkLgorCQkJCQkJCQkgICAgICAgcHJlc3NfZGF0YSk7CisJCQkJfSBlbHNlIGlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX0tCRCkgeworCQkJCQlrZXlwcmVzc2VkID0gMTsJLyogd2lsbCB0dXJuIG9uIHRoZSBsaWdodCAqLworCisJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA9PSAwKSB7CisJCQkJCQlpZiAoaW5wdXQtPnUua2JkLnByZXNzX3N0clswXSkKKwkJCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPgorCQkJCQkJCQkJdS5rYmQuCisJCQkJCQkJCQlwcmVzc19zdHIsCisJCQkJCQkJCQlzaXplb2YKKwkJCQkJCQkJCShpbnB1dC0+CisJCQkJCQkJCQkgdS5rYmQuCisJCQkJCQkJCQkgcHJlc3Nfc3RyKSk7CisJCQkJCX0KKworCQkJCQlpZiAoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHJbMF0pIHsKKwkJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA+PQorCQkJCQkJICAgIEtFWVBBRF9SRVBfU1RBUlQpIHsKKwkJCQkJCQlpbnB1dC0+aGlnaF90aW1lciAtPQorCQkJCQkJCSAgICBLRVlQQURfUkVQX0RFTEFZOworCQkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+CisJCQkJCQkJCQl1LmtiZC4KKwkJCQkJCQkJCXJlcGVhdF9zdHIsCisJCQkJCQkJCQlzaXplb2YKKwkJCQkJCQkJCShpbnB1dC0+CisJCQkJCQkJCQkgdS5rYmQuCisJCQkJCQkJCQkgcmVwZWF0X3N0cikpOworCQkJCQkJfQorCQkJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CS8qIHdlIHdpbGwgbmVlZCB0byBjb21lIGJhY2sgaGVyZSBzb29uICovCisJCQkJCX0KKworCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPCAyNTUpCisJCQkJCQlpbnB1dC0+aGlnaF90aW1lcisrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogZWxzZSBzaWduYWwgZmFsbGluZyBkb3duLiBMZXQncyBmYWxsIHRocm91Z2guICovCisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfRkFMTElORzsKKwkJCQlpbnB1dC0+ZmFsbF90aW1lciA9IDA7CisJCQl9CisJCQkvKiBubyBicmVhayBoZXJlLCBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlBVVF9TVF9GQUxMSU5HOgorI2lmIDAKKwkJCS8qIEZJWE1FICEhISBzYW1lIGNvbW1lbnQgYXMgYWJvdmUgKi8KKwkJCWlmICgoKHBoeXNfcHJldiAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpCisJCQkgICAgJiYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgPiBpbnB1dC0+dmFsdWUpKSB7CisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOwkvKiBpbnZhbGlkYXRlICovCisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKSB7CisJCQkJaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfS0JEKSB7CisJCQkJCWtleXByZXNzZWQgPSAxOwkvKiB3aWxsIHR1cm4gb24gdGhlIGxpZ2h0ICovCisKKwkJCQkJaWYgKGlucHV0LT51LmtiZC5yZXBlYXRfc3RyWzBdKSB7CisJCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPj0gS0VZUEFEX1JFUF9TVEFSVCkKKwkJCQkJCQlpbnB1dC0+aGlnaF90aW1lciAtPSBLRVlQQURfUkVQX0RFTEFZOworCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT51LmtiZC5yZXBlYXRfc3RyLAorCQkJCQkJCQlzaXplb2YoaW5wdXQtPnUua2JkLnJlcGVhdF9zdHIpKTsKKwkJCQkJCWlucHV0c19zdGFibGUgPSAwOwkvKiB3ZSB3aWxsIG5lZWQgdG8gY29tZSBiYWNrIGhlcmUgc29vbiAqLworCQkJCQl9CisKKwkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyIDwgMjU1KQorCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJCQl9CisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfSElHSDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoaW5wdXQtPmZhbGxfdGltZXIgPj0gaW5wdXQtPmZhbGxfdGltZSkgeworCQkJCS8qIGNhbGwgcmVsZWFzZSBldmVudCAqLworCQkJCWlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX1NURCkgeworCQkJCQlpZiAoaW5wdXQtPnUuc3RkLnJlbGVhc2VfZmN0ICE9IE5VTEwpCisJCQkJCQlpbnB1dC0+dS5zdGQucmVsZWFzZV9mY3QoaW5wdXQtPnUuc3RkLnJlbGVhc2VfZGF0YSk7CisKKwkJCQl9IGVsc2UgaWYgKGlucHV0LT50eXBlID09IElOUFVUX1RZUEVfS0JEKSB7CisJCQkJCWlmIChpbnB1dC0+dS5rYmQucmVsZWFzZV9zdHJbMF0pCisJCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPnUua2JkLnJlbGVhc2Vfc3RyLAorCQkJCQkJCQlzaXplb2YoaW5wdXQtPnUua2JkLnJlbGVhc2Vfc3RyKSk7CisJCQkJfQorCisJCQkJaW5wdXQtPnN0YXRlID0gSU5QVVRfU1RfTE9XOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpbnB1dC0+ZmFsbF90aW1lcisrOworCQkJCWlucHV0c19zdGFibGUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwYW5lbF9zY2FuX3RpbWVyKHZvaWQpCit7CisJaWYgKGtleXBhZF9lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkgeworCQlpZiAoc3Bpbl90cnlsb2NrKCZwcHJ0X2xvY2spKSB7CisJCQlwaHlzX3NjYW5fY29udGFjdHMoKTsKKwkJCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOwkvKiBubyBuZWVkIGZvciB0aGUgcGFycG9ydCBhbnltb3JlICovCisJCX0KKworCQlpZiAoIWlucHV0c19zdGFibGUgfHwgcGh5c19jdXJyICE9IHBoeXNfcHJldikKKwkJCXBhbmVsX3Byb2Nlc3NfaW5wdXRzKCk7CisJfQorCisJaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkgeworCQlpZiAoa2V5cHJlc3NlZCkgeworCQkJaWYgKGxpZ2h0X3RlbXBvID09IDAgJiYgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKSA9PSAwKSkKKwkJCQlsY2RfYmFja2xpZ2h0KDEpOworCQkJbGlnaHRfdGVtcG8gPSBGTEFTSF9MSUdIVF9URU1QTzsKKwkJfSBlbHNlIGlmIChsaWdodF90ZW1wbyA+IDApIHsKKwkJCWxpZ2h0X3RlbXBvLS07CisJCQlpZiAobGlnaHRfdGVtcG8gPT0gMCAmJiAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0wpID09IDApKQorCQkJCWxjZF9iYWNrbGlnaHQoMCk7CisJCX0KKwl9CisKKwltb2RfdGltZXIoJnNjYW5fdGltZXIsIGppZmZpZXMgKyBJTlBVVF9QT0xMX1RJTUUpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NjYW5fdGltZXIodm9pZCkKK3sKKwlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKQorCQlyZXR1cm47CQkvKiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKworCWluaXRfdGltZXIoJnNjYW5fdGltZXIpOworCXNjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJTlBVVF9QT0xMX1RJTUU7CisJc2Nhbl90aW1lci5kYXRhID0gMDsKKwlzY2FuX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikmcGFuZWxfc2Nhbl90aW1lcjsKKwlhZGRfdGltZXIoJnNjYW5fdGltZXIpOworfQorCisvKiBjb252ZXJ0cyBhIG5hbWUgb2YgdGhlIGZvcm0gIih7QmJBYVBwU3NFZX17MDEyMzQ1NjctfSkqIiB0byBhIHNlcmllcyBvZiBiaXRzLgorICogaWYgPG9tYXNrPiBvciA8aW1hc2s+IGFyZSBub24tbnVsbCwgdGhleSB3aWxsIGJlIG9yJ2VkIHdpdGggdGhlIGJpdHMgY29ycmVzcG9uZGluZworICogdG8gb3V0IGFuZCBpbiBiaXRzIHJlc3BlY3RpdmVseS4KKyAqIHJldHVybnMgMSBpZiBvaywgMCBpZiBlcnJvciAoaW4gd2hpY2ggY2FzZSwgbm90aGluZyBpcyB3cml0dGVuKS4KKyAqLworc3RhdGljIGludCBpbnB1dF9uYW1lMm1hc2soY2hhciAqbmFtZSwgcG1hc2tfdCAqbWFzaywgcG1hc2tfdCAqdmFsdWUsCisJCQkgICBjaGFyICppbWFzaywgY2hhciAqb21hc2spCit7CisJc3RhdGljIGNoYXIgc2lndGFiWzEwXSA9ICJFZVNzUHBBYUJiIjsKKwljaGFyIGltLCBvbTsKKwlwbWFza190IG0sIHY7CisKKwlvbSA9IGltID0gbSA9IHYgPSAwVUxMOworCXdoaWxlICgqbmFtZSkgeworCQlpbnQgaW4sIG91dCwgYml0LCBuZWc7CisJCWZvciAoaW4gPSAwOyAoaW4gPCBzaXplb2Yoc2lndGFiKSkgJiYgKHNpZ3RhYltpbl0gIT0gKm5hbWUpOyBpbisrKQorCQkJOworCQlpZiAoaW4gPj0gc2l6ZW9mKHNpZ3RhYikpCisJCQlyZXR1cm4gMDsJLyogaW5wdXQgbmFtZSBub3QgZm91bmQgKi8KKwkJbmVnID0gKGluICYgMSk7CS8qIG9kZCAobG93ZXIpIG5hbWVzIGFyZSBuZWdhdGVkICovCisJCWluID4+PSAxOworCQlpbSB8PSAoMSA8PCBpbik7CisKKwkJbmFtZSsrOworCQlpZiAoaXNkaWdpdCgqbmFtZSkpIHsKKwkJCW91dCA9ICpuYW1lIC0gJzAnOworCQkJb20gfD0gKDEgPDwgb3V0KTsKKwkJfSBlbHNlIGlmICgqbmFtZSA9PSAnLScpCisJCQlvdXQgPSA4OworCQllbHNlCisJCQlyZXR1cm4gMDsJLyogdW5rbm93biBiaXQgbmFtZSAqLworCisJCWJpdCA9IChvdXQgKiA1KSArIGluOworCisJCW0gfD0gMVVMTCA8PCBiaXQ7CisJCWlmICghbmVnKQorCQkJdiB8PSAxVUxMIDw8IGJpdDsKKwkJbmFtZSsrOworCX0KKwkqbWFzayA9IG07CisJKnZhbHVlID0gdjsKKwlpZiAoaW1hc2spCisJCSppbWFzayB8PSBpbTsKKwlpZiAob21hc2spCisJCSpvbWFzayB8PSBvbTsKKwlyZXR1cm4gMTsKK30KKworLyogdHJpZXMgdG8gYmluZCBhIGtleSB0byB0aGUgc2lnbmFsIG5hbWUgPG5hbWU+LiBUaGUga2V5IHdpbGwgc2VuZCB0aGUKKyAqIHN0cmluZ3MgPHByZXNzPiwgPHJlcGVhdD4sIDxyZWxlYXNlPiBmb3IgdGhlc2UgcmVzcGVjdGl2ZSBldmVudHMuCisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcga2V5IGlmIG9rLCBOVUxMIGlmIHRoZSBrZXkgY291bGQgbm90IGJlIGJvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfaW5wdXQgKnBhbmVsX2JpbmRfa2V5KGNoYXIgKm5hbWUsIGNoYXIgKnByZXNzLAorCQkJCQkgICAgY2hhciAqcmVwZWF0LCBjaGFyICpyZWxlYXNlKQoreworCXN0cnVjdCBsb2dpY2FsX2lucHV0ICprZXk7CisKKwlrZXkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9naWNhbF9pbnB1dCksIEdGUF9LRVJORUwpOworCWlmICgha2V5KSB7CisJCXByaW50ayhLRVJOX0VSUiAicGFuZWw6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChrZXksIDAsIHNpemVvZihzdHJ1Y3QgbG9naWNhbF9pbnB1dCkpOworCWlmICghaW5wdXRfbmFtZTJtYXNrKG5hbWUsICZrZXktPm1hc2ssICZrZXktPnZhbHVlLCAmc2Nhbl9tYXNrX2ksCisJCQkgICAgICZzY2FuX21hc2tfbykpCisJCXJldHVybiBOVUxMOworCisJa2V5LT50eXBlID0gSU5QVVRfVFlQRV9LQkQ7CisJa2V5LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwlrZXktPnJpc2VfdGltZSA9IDE7CisJa2V5LT5mYWxsX3RpbWUgPSAxOworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJiaW5kOiA8JXM+IDogbT0lMDE2THggdj0lMDE2THhcbiIsIG5hbWUsIGtleS0+bWFzaywKKwkgICAgICAga2V5LT52YWx1ZSk7CisjZW5kaWYKKwlzdHJuY3B5KGtleS0+dS5rYmQucHJlc3Nfc3RyLCBwcmVzcywgc2l6ZW9mKGtleS0+dS5rYmQucHJlc3Nfc3RyKSk7CisJc3RybmNweShrZXktPnUua2JkLnJlcGVhdF9zdHIsIHJlcGVhdCwgc2l6ZW9mKGtleS0+dS5rYmQucmVwZWF0X3N0cikpOworCXN0cm5jcHkoa2V5LT51LmtiZC5yZWxlYXNlX3N0ciwgcmVsZWFzZSwKKwkJc2l6ZW9mKGtleS0+dS5rYmQucmVsZWFzZV9zdHIpKTsKKwlsaXN0X2FkZCgma2V5LT5saXN0LCAmbG9naWNhbF9pbnB1dHMpOworCXJldHVybiBrZXk7Cit9CisKKyNpZiAwCisvKiB0cmllcyB0byBiaW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIHNpZ25hbCBuYW1lIDxuYW1lPi4gVGhlIGZ1bmN0aW9uCisgKiA8cHJlc3NfZmN0PiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSA8cHJlc3NfZGF0YT4gYXJnIHdoZW4gdGhlIHNpZ25hbCBpcworICogYWN0aXZhdGVkLCBhbmQgc28gb24gZm9yIDxyZWxlYXNlX2ZjdD4vPHJlbGVhc2VfZGF0YT4KKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBzaWduYWwgaWYgb2ssIE5VTEwgaWYgdGhlIHNpZ25hbCBjb3VsZCBub3QgYmUgYm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqcGFuZWxfYmluZF9jYWxsYmFjayhjaGFyICpuYW1lLAorCQkJCQkJIHZvaWQgKCpwcmVzc19mY3QpIChpbnQpLAorCQkJCQkJIGludCBwcmVzc19kYXRhLAorCQkJCQkJIHZvaWQgKCpyZWxlYXNlX2ZjdCkgKGludCksCisJCQkJCQkgaW50IHJlbGVhc2VfZGF0YSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqY2FsbGJhY2s7CisKKwljYWxsYmFjayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2dpY2FsX2lucHV0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWxsYmFjaykgeworCQlwcmludGsoS0VSTl9FUlIgInBhbmVsOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoY2FsbGJhY2ssIDAsIHNpemVvZihzdHJ1Y3QgbG9naWNhbF9pbnB1dCkpOworCWlmICghaW5wdXRfbmFtZTJtYXNrKG5hbWUsICZjYWxsYmFjay0+bWFzaywgJmNhbGxiYWNrLT52YWx1ZSwKKwkJCSAgICAgJnNjYW5fbWFza19pLCAmc2Nhbl9tYXNrX28pKQorCQlyZXR1cm4gTlVMTDsKKworCWNhbGxiYWNrLT50eXBlID0gSU5QVVRfVFlQRV9TVEQ7CisJY2FsbGJhY2stPnN0YXRlID0gSU5QVVRfU1RfTE9XOworCWNhbGxiYWNrLT5yaXNlX3RpbWUgPSAxOworCWNhbGxiYWNrLT5mYWxsX3RpbWUgPSAxOworCWNhbGxiYWNrLT51LnN0ZC5wcmVzc19mY3QgPSBwcmVzc19mY3Q7CisJY2FsbGJhY2stPnUuc3RkLnByZXNzX2RhdGEgPSBwcmVzc19kYXRhOworCWNhbGxiYWNrLT51LnN0ZC5yZWxlYXNlX2ZjdCA9IHJlbGVhc2VfZmN0OworCWNhbGxiYWNrLT51LnN0ZC5yZWxlYXNlX2RhdGEgPSByZWxlYXNlX2RhdGE7CisJbGlzdF9hZGQoJmNhbGxiYWNrLT5saXN0LCAmbG9naWNhbF9pbnB1dHMpOworCXJldHVybiBjYWxsYmFjazsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBrZXlwYWRfaW5pdCh2b2lkKQoreworCWludCBrZXludW07CisJaW5pdF93YWl0cXVldWVfaGVhZCgma2V5cGFkX3JlYWRfd2FpdCk7CisJa2V5cGFkX2J1ZmxlbiA9IDA7CS8qIGZsdXNoZXMgYW55IGV2ZW50dWFsIG5vaXN5IGtleXN0cm9rZSAqLworCisJLyogTGV0J3MgY3JlYXRlIGFsbCBrbm93biBrZXlzICovCisKKwlmb3IgKGtleW51bSA9IDA7IGtleXBhZF9wcm9maWxlW2tleW51bV1bMF1bMF07IGtleW51bSsrKSB7CisJCXBhbmVsX2JpbmRfa2V5KGtleXBhZF9wcm9maWxlW2tleW51bV1bMF0sCisJCQkgICAgICAga2V5cGFkX3Byb2ZpbGVba2V5bnVtXVsxXSwKKwkJCSAgICAgICBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzJdLAorCQkJICAgICAgIGtleXBhZF9wcm9maWxlW2tleW51bV1bM10pOworCX0KKworCWluaXRfc2Nhbl90aW1lcigpOworCWtleXBhZF9pbml0aWFsaXplZCA9IDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRldmljZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwYW5lbF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICAgIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKSB7CisJCXN3aXRjaCAoY29kZSkgeworCQljYXNlIFNZU19ET1dOOgorCQkJcGFuZWxfbGNkX3ByaW50CisJCQkgICAgKCJceDBjUmVsb2FkaW5nXG5TeXN0ZW0uLi5ceDFiW0xjXHgxYltMYlx4MWJbTCsiKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19IQUxUOgorCQkJcGFuZWxfbGNkX3ByaW50CisJCQkgICAgKCJceDBjU3lzdGVtIEhhbHRlZC5ceDFiW0xjXHgxYltMYlx4MWJbTCsiKTsKKwkJCWJyZWFrOworCQljYXNlIFNZU19QT1dFUl9PRkY6CisJCQlwYW5lbF9sY2RfcHJpbnQoIlx4MGNQb3dlciBvZmYuXHgxYltMY1x4MWJbTGJceDFiW0wrIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5lbF9ub3RpZmllciA9IHsKKwlwYW5lbF9ub3RpZnlfc3lzLAorCU5VTEwsCisJMAorfTsKKworc3RhdGljIHZvaWQgcGFuZWxfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5udW1iZXIgIT0gcGFycG9ydCkKKwkJcmV0dXJuOworCisJaWYgKHBwcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicGFuZWxfYXR0YWNoKCk6IHBvcnQtPm51bWJlcj0lZCBwYXJwb3J0PSVkLCBhbHJlYWR5IHJlZ2lzdGVyZWQgIVxuIiwKKwkJICAgICAgIHBvcnQtPm51bWJlciwgcGFycG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlwcHJ0ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgInBhbmVsIiwgTlVMTCwgTlVMTCwJLyogcGYsIGtmICovCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgIC8qUEFSUE9SVF9ERVZfRVhDTCAqLworCQkJCSAgICAgICAwLCAodm9pZCAqKSZwcHJ0KTsKKworCWlmIChwYXJwb3J0X2NsYWltKHBwcnQpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlBhbmVsOiBjb3VsZCBub3QgY2xhaW0gYWNjZXNzIHRvIHBhcnBvcnQlZC4gQWJvcnRpbmcuXG4iLAorCQkgICAgICAgcGFycG9ydCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBtdXN0IGluaXQgTENEIGZpcnN0LCBqdXN0IGluIGNhc2UgYW4gSVJRIGZyb20gdGhlIGtleXBhZCBpcyBnZW5lcmF0ZWQgYXQga2V5cGFkIGluaXQgKi8KKwlpZiAobGNkX2VuYWJsZWQpIHsKKwkJbGNkX2luaXQoKTsKKwkJbWlzY19yZWdpc3RlcigmbGNkX2Rldik7CisJfQorCisJaWYgKGtleXBhZF9lbmFibGVkKSB7CisJCWtleXBhZF9pbml0KCk7CisJCW1pc2NfcmVnaXN0ZXIoJmtleXBhZF9kZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgcGFuZWxfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5udW1iZXIgIT0gcGFycG9ydCkKKwkJcmV0dXJuOworCisJaWYgKCFwcHJ0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInBhbmVsX2RldGFjaCgpOiBwb3J0LT5udW1iZXI9JWQgcGFycG9ydD0lZCwgbm90aGluZyB0byB1bnJlZ2lzdGVyLlxuIiwKKwkJICAgICAgIHBvcnQtPm51bWJlciwgcGFycG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoa2V5cGFkX2VuYWJsZWQgJiYga2V5cGFkX2luaXRpYWxpemVkKQorCQltaXNjX2RlcmVnaXN0ZXIoJmtleXBhZF9kZXYpOworCisJaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZsY2RfZGV2KTsKKworCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOworCXBwcnQgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBhbmVsX2RyaXZlciA9IHsKKwkubmFtZSA9ICJwYW5lbCIsCisJLmF0dGFjaCA9IHBhbmVsX2F0dGFjaCwKKwkuZGV0YWNoID0gcGFuZWxfZGV0YWNoLAorfTsKKworLyogaW5pdCBmdW5jdGlvbiAqLworaW50IHBhbmVsX2luaXQodm9pZCkKK3sKKwkvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKwlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQlrZXlwYWRfdHlwZSA9IGtleXBhZF9lbmFibGVkOworCisJaWYgKGxjZF90eXBlIDwgMCkKKwkJbGNkX3R5cGUgPSBsY2RfZW5hYmxlZDsKKworCWlmIChwYXJwb3J0IDwgMCkKKwkJcGFycG9ydCA9IERFRkFVTFRfUEFSUE9SVDsKKworCS8qIHRha2UgY2FyZSBvZiBhbiBldmVudHVhbCBwcm9maWxlICovCisJc3dpdGNoIChwcm9maWxlKSB7CisJY2FzZSBQQU5FTF9QUk9GSUxFX0NVU1RPTToJLyogY3VzdG9tIHByb2ZpbGUgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gREVGQVVMVF9LRVlQQUQ7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IERFRkFVTFRfTENEOworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfT0xEOgkvKiA4IGJpdHMsIDIqMTYsIG9sZCBrZXlwYWQgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfT0xEOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9PTEQ7CisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gMTY7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX05FVzoJLyogc2VyaWFsLCAyKjE2LCBuZXcga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX05FVzsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfS1MwMDc0OworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfSEFOVFJPTklYOgkvKiA4IGJpdHMsIDIqMTYgaGFudHJvbml4LWxpa2UsIG5vIGtleXBhZCAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9OT05FOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9IQU5UUk9OSVg7CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9ORVhDT006CS8qIGdlbmVyaWMgOCBiaXRzLCAyKjE2LCBuZXhjb20ga2V5cGFkLCBlZy4gTmV4Y29tLiAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9ORVhDT007CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX05FWENPTTsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX0xBUkdFOgkvKiA4IGJpdHMsIDIqNDAsIG9sZCBrZXlwYWQgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfT0xEOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9PTEQ7CisJCWJyZWFrOworCX0KKworCWxjZF9lbmFibGVkID0gKGxjZF90eXBlID4gMCk7CisJa2V5cGFkX2VuYWJsZWQgPSAoa2V5cGFkX3R5cGUgPiAwKTsKKworCXN3aXRjaCAoa2V5cGFkX3R5cGUpIHsKKwljYXNlIEtFWVBBRF9UWVBFX09MRDoKKwkJa2V5cGFkX3Byb2ZpbGUgPSBvbGRfa2V5cGFkX3Byb2ZpbGU7CisJCWJyZWFrOworCWNhc2UgS0VZUEFEX1RZUEVfTkVXOgorCQlrZXlwYWRfcHJvZmlsZSA9IG5ld19rZXlwYWRfcHJvZmlsZTsKKwkJYnJlYWs7CisJY2FzZSBLRVlQQURfVFlQRV9ORVhDT006CisJCWtleXBhZF9wcm9maWxlID0gbmV4Y29tX2tleXBhZF9wcm9maWxlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlrZXlwYWRfcHJvZmlsZSA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCS8qIHRlbGxzIHZhcmlvdXMgc3Vic3lzdGVtcyBhYm91dCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBpbml0aWFsaXppbmcgKi8KKwlpbml0X2luX3Byb2dyZXNzID0gMTsKKworCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQYW5lbDogY291bGQgbm90IHJlZ2lzdGVyIHdpdGggcGFycG9ydC4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFsY2RfZW5hYmxlZCAmJiAha2V5cGFkX2VuYWJsZWQpIHsKKwkJLyogbm8gZGV2aWNlIGVuYWJsZWQsIGxldCdzIHJlbGVhc2UgdGhlIHBhcnBvcnQgKi8KKwkJaWYgKHBwcnQpIHsKKwkJCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKKwkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBydCk7CisJCX0KKwkJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQYW5lbCBkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04KKwkJICAgICAgICIgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYW5lbF9ub3RpZmllcik7CisKKwlpZiAocHBydCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCisJCSAgICAgICAiIHJlZ2lzdGVyZWQgb24gcGFycG9ydCVkIChpbz0weCVseCkuXG4iLCBwYXJwb3J0LAorCQkgICAgICAgcHBydC0+cG9ydC0+YmFzZSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQYW5lbCBkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04KKwkJICAgICAgICIgbm90IHlldCByZWdpc3RlcmVkXG4iKTsKKwkvKiB0ZWxscyB2YXJpb3VzIHN1YnN5c3RlbXMgYWJvdXQgdGhlIGZhY3QgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZCAqLworCWluaXRfaW5fcHJvZ3Jlc3MgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwYW5lbF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwYW5lbF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYW5lbF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYW5lbF9ub3RpZmllcik7CisKKwlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKQorCQlkZWxfdGltZXIoJnNjYW5fdGltZXIpOworCisJaWYgKGtleXBhZF9lbmFibGVkKQorCQltaXNjX2RlcmVnaXN0ZXIoJmtleXBhZF9kZXYpOworCisJaWYgKGxjZF9lbmFibGVkKSB7CisJCXBhbmVsX2xjZF9wcmludCgiXHgwY0xDRCBkcml2ZXIgIiBQQU5FTF9WRVJTSU9OCisJCQkJIlxudW5sb2FkZWQuXHgxYltMY1x4MWJbTGJceDFiW0wtIik7CisJCW1pc2NfZGVyZWdpc3RlcigmbGNkX2Rldik7CisJfQorCisJLyogVE9ETzogZnJlZSBhbGwgaW5wdXQgc2lnbmFscyAqLworCisJcGFycG9ydF9yZWxlYXNlKHBwcnQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBydCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFuZWxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGFuZWxfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0FVVEhPUigiV2lsbHkgVGFycmVhdSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQppbmRleCBmNjVlOTc5Li44NDJhZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCkBAIC0xLDUgKzEsMTIgQEAKIFRPRE86Ci0JLSBmaXggdHJhbnNtaXQgb3ZlcmZsb3dzCisJLSBSeCBibG9jayBzaXplIGlzIGxpbWl0ZWQgdG8gPCAyMDQ4LCBoYXJkd2FyZSBidWc/CisJLSBHcm91cCBzaXplIGlzIGxpbWl0ZWQgdG8gPCBwYWdlIHNpemUsIGtlcm5lbCBhbGxvYy9tbWFwIEFQSSBpc3N1ZXMKKwktIGZpeC93b3JrYXJvdW5kIGNhY2hlIGlzc3VlcyBpbiBjaXJjdWxhciBidWZmZXIgaGVhZGVyCisJLSB0ZXN0IHdoZXRoZXIgVHggaXMgdHJhbnNtaXR0aW5nIGRhdGEgZnJvbSBwcm92aWRlZCBidWZmZXJzCisJLSBoYW5kbGUgZGV2aWNlIHVucGx1ZyBjYXNlCisJLSBoYW5kbGUgdGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkCisJLSB1c2UgYnVzIGFkZHJlc3MgaW5zdGVhZCBvZiBwaHlzaWNhbCBhZGRyZXNzIGZvciBETUEKKwktIHN1cHBvcnQgZm9yIHNuYXBzaG90IG1vZGUKIAktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2VzCiAJLSBnZXQgcmVzZXJ2ZWQgbWFqb3IvbWlub3IgaWYgbmVlZGVkCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYwppbmRleCAwZTExM2Y5Li5lYzM0M2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCkBAIC0xMjYsOSArMTI2LDExIEBACiAjZGVmaW5lIEZQR0FfSU5UX1RYX0FDUV9ET05FCQkoMHgxIDw8IDEpCiAjZGVmaW5lIEZQR0FfSU5UX1JYX0FDUV9ET05FCQkoMHgxKQogCi0jZGVmaW5lIEZQR0FfUlhfQURDX0NUTF9SRUcJCTB4MjE0Ci0jZGVmaW5lIEZQR0FfUlhfQURDX0NUTF9DT05UX0NBUAkoMHgwKQotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfU05BUF9DQVAJKDB4MSkKKyNkZWZpbmUgRlBHQV9SWF9DVExfUkVHCQkJMHgyMTQKKyNkZWZpbmUgRlBHQV9SWF9DVExfRklGT19GTFVTSCAgICAgIAkoMHgxIDw8IDkpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1NZTlRIX0RBVEEJCSgweDEgPDwgOCkKKyNkZWZpbmUgRlBHQV9SWF9DVExfQ09OVF9DQVAJCSgweDAgPDwgMSkKKyNkZWZpbmUgRlBHQV9SWF9DVExfU05BUF9DQVAJCSgweDEgPDwgMSkKIAogI2RlZmluZSBGUEdBX1JYX0FSTV9SRUcJCQkweDIxQwogCkBAIC0yOTksNiArMzAxLDE0IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoZGlyLCBTX0lSVVNSfFNfSVJHUlAsIHNob3dfZGlyZWN0aW9uLCBOVUxMKTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKHVuc2lnbmVkIGxvbmcgYnl0ZXMpCit7CisJaWYgKGJ5dGVzICUgUEFHRV9TSVpFID09IDApCisJCXJldHVybiBieXRlcyAvIFBBR0VfU0laRTsKKwllbHNlCisJCXJldHVybiAoYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19tbWFwX3NpemUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTMwOSwxMCArMzE5LDggQEAKIAl1bnNpZ25lZCBsb25nIGhlYWRlcl9wYWdlczsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2dyb3VwX3BhZ2VzOwogCi0JLyogRklYTUU6IFdlIGRvIG5vdCBoYXZlIHRvIGFkZCAxLCBpZiBncm91cF9zaXplIGEgbXVsdGlwbGUgb2YKLQkgICBQQUdFX1NJWkUuICovCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJbW1hcF9zaXplID0gKGhlYWRlcl9wYWdlcyArIHRvdGFsX2dyb3VwX3BhZ2VzKSAqIFBBR0VfU0laRTsKQEAgLTM1MCw4ICszNTgsOCBAQAogCXVuc2lnbmVkIGxvbmcgZ3JvdXBfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAKLQlncm91cF9wYWdlcyA9IChjaGFubmVsLT5ncm91cF9zaXplIC8gUEFHRV9TSVpFKSArIDE7Ci0JaGVhZGVyX3BhZ2VzID0gKGNoYW5uZWwtPmhlYWRlcl9zaXplIC8gUEFHRV9TSVpFKSArIDE7CisJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5ncm91cF9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBwb2NoX2dyb3VwX2luZm8gKmdyb3VwOwpAQCAtMzg0LDE4ICszOTIsNDUgQEAKIAkJZ3JvdXAtPnVzZXJfb2Zmc2V0ID0KIAkJCShoZWFkZXJfcGFnZXMgKyAoaSAqIGdyb3VwX3BhZ2VzKSkgKiBQQUdFX1NJWkU7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVsZDogdXNlcl9vZmZzZXQ6IDB4JWx4IGRtYTogMHgleFxuIiwgaSwKLQkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCwgZ3JvdXAtPmRtYV9hZGRyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVsZDogdXNlcl9vZmZzZXQ6IDB4JWx4XG4iLCBpLAorCQkgICAgICAgZ3JvdXAtPnVzZXJfb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2hhbm5lbF9sYXRjaF9hdHRyKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCitzdGF0aWMgaW50IGNoYW5uZWxfbGF0Y2hfYXR0cihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQogewogCWNoYW5uZWwtPmdyb3VwX2NvdW50ID0gYXRvbWljX3JlYWQoJmNoYW5uZWwtPnN5c19ncm91cF9jb3VudCk7CiAJY2hhbm5lbC0+Z3JvdXBfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfZ3JvdXBfc2l6ZSk7CiAJY2hhbm5lbC0+YmxvY2tfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfYmxvY2tfc2l6ZSk7CisKKwlpZiAoY2hhbm5lbC0+Z3JvdXBfY291bnQgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIGdyb3VwIGNvdW50ICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ncm91cF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ncm91cF9zaXplID09IDAgfHwKKwkgICAgY2hhbm5lbC0+Z3JvdXBfc2l6ZSA8IGNoYW5uZWwtPmJsb2NrX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBncm91cCBzaXplICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ncm91cF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5uZWwtPmJsb2NrX3NpemUgPT0gMCB8fCAoY2hhbm5lbC0+YmxvY2tfc2l6ZSAlIDgpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBibG9jayBzaXplICVsdSIsCisJCSAgICAgICBjaGFubmVsLT5ibG9ja19zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5uZWwtPmdyb3VwX3NpemUgJSBjaGFubmVsLT5ibG9ja19zaXplICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkgICAgICAgImdyb3VwIHNpemUgc2hvdWxkIGJlIG11bHRpcGxlIG9mIGJsb2NrIHNpemUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC00MzIsNyArNDY3LDEwIEBACiAJfQogCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiYmxvY2tfc2l6ZSwgZ3JvdXBfc2l6ZSwgZ3JvdXBfY291bnRcbiIpOwotCWlvd3JpdGUzMihjaGFubmVsLT5ibG9ja19zaXplLCBmcGdhICsgYmxvY2tfc2l6ZV9yZWcpOworCS8qCisJICogQmxvY2sgc2l6ZSBpcyByZXByZXNlbnRlZCBpbiBuby4gb2YgNjQgYml0IHRyYW5zZmVycy4KKwkgKi8KKwlpb3dyaXRlMzIoY2hhbm5lbC0+YmxvY2tfc2l6ZSAvIDgsIGZwZ2EgKyBibG9ja19zaXplX3JlZyk7CiAJaW93cml0ZTMyKGNoYW5uZWwtPmdyb3VwX3NpemUgLyBjaGFubmVsLT5ibG9ja19zaXplLAogCQkgIGZwZ2EgKyBibG9ja19jb3VudF9yZWcpOwogCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cF9jb3VudCwgZnBnYSArIGdyb3VwX2NvdW50X3JlZyk7CkBAIC00NDcsMjcgKzQ4NSwzMCBAQAogCS8qIFRoZSBETUEgYWRkcmVzcyBwYWdlIHJlZ2lzdGVyIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBSWCBhbmQKIAkgKiBUWCBjaGFubmVscywgc28gYWNxdWlyZSBsb2NrLgogCSAqLwotCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlwYWdlID0gaSAvIDMyOwogCQlncm91cF9pbl9wYWdlID0gaSAlIDMyOwogCiAJCWdyb3VwX3JlZyA9IGdyb3VwX3JlZ3NfYmFzZSArIChncm91cF9pbl9wYWdlICogNCk7CiAKKwkJc3Bpbl9sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCQlpb3dyaXRlMzIocGFnZSwgZnBnYSArIEZQR0FfRE1BX0FEUl9QQUdFX1JFRyk7CiAJCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cHNbaV0uZG1hX2FkZHIsIGZwZ2EgKyBncm91cF9yZWcpOworCQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAl9CisKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlwYWdlID0gaSAvIDMyOwogCQlncm91cF9pbl9wYWdlID0gaSAlIDMyOwogCiAJCWdyb3VwX3JlZyA9IGdyb3VwX3JlZ3NfYmFzZSArIChncm91cF9pbl9wYWdlICogNCk7CiAKKwkJc3Bpbl9sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCQlpb3dyaXRlMzIocGFnZSwgZnBnYSArIEZQR0FfRE1BX0FEUl9QQUdFX1JFRyk7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHJlYWQgZG1hX2FkZHI6IDB4JXhcbiIsIGksCiAJCSAgICAgICBpb3JlYWQzMihmcGdhICsgZ3JvdXBfcmVnKSk7CisJCXNwaW5fdW5sb2NrKGNoYW5uZWwtPmlvbWVtX2xvY2spOwogCX0KLQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAogfQogCkBAIC01MzgsNyArNTc5LDkgQEAKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgImNoYW5uZWxfbGF0Y2hfYXR0clxuIik7CiAKLQljaGFubmVsX2xhdGNoX2F0dHIoY2hhbm5lbCk7CisJcmV0ID0gY2hhbm5lbF9sYXRjaF9hdHRyKGNoYW5uZWwpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXQ7CiAKIAljaGFubmVsLT50cmFuc2ZlciA9IDA7CiAKQEAgLTc4MSw2ICs4MjQsMTEgQEAKIAkJaW93cml0ZTMyKEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0gKIAkJCSAgfCBGUEdBX1RYX0NUTF9PVVRQVVRfQ0FSREJVUywKIAkJCSAgZnBnYSArIEZQR0FfVFhfQ1RMX1JFRyk7CisJfSBlbHNlIHsKKwkJLyogRmx1c2ggUlggRklGTyBhbmQgb3V0cHV0IGRhdGEgdG8gY2FyZGJ1cy4gKi8KKwkJaW93cml0ZTMyKEZQR0FfUlhfQ1RMX0NPTlRfQ0FQCisJCQkgIHwgRlBHQV9SWF9DVExfRklGT19GTFVTSCwKKwkJCSAgZnBnYSArIEZQR0FfUlhfQ1RMX1JFRyk7CiAJfQogCiAJYXRvbWljX2luYygmY2hhbm5lbC0+aW5pdGVkKTsKQEAgLTg0Nyw4ICs4OTUsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlncm91cF9wYWdlcyA9IChjaGFubmVsLT5ncm91cF9zaXplIC8gUEFHRV9TSVpFKSArIDE7Ci0JaGVhZGVyX3BhZ2VzID0gKGNoYW5uZWwtPmhlYWRlcl9zaXplIC8gUEFHRV9TSVpFKSArIDE7CisJZ3JvdXBfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJaGVhZGVyX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmhlYWRlcl9zaXplKTsKIAl0b3RhbF9ncm91cF9wYWdlcyA9IGdyb3VwX3BhZ2VzICogY2hhbm5lbC0+Z3JvdXBfY291bnQ7CiAKIAlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwpAQCAtOTAzLDE0ICs5NTEsNyBAQAogCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewotCQlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1JYCi0JCSAgICAmJiBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHNbaV0gPT0gLTEpIHsKLQkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9UWAotCQkgICAgJiYgY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldICE9IC0xKSB7CisJCWlmIChjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHNbaV0gIT0gLTEpIHsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMDU4LDEwICsxMDk5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBncm91cHNfZG9uZTsgaSsrKSB7CiAJCWogPSAocHJldl90cmFuc2ZlciArIGkpICUgY2hhbm5lbC0+Z3JvdXBfY291bnQ7Ci0JCWlmIChjaGFubmVsLT5kaXIgPT0gQ0hBTk5FTF9ESVJfUlgpCi0JCQlncm91cF9vZmZzZXRzW2pdID0gLTE7Ci0JCWVsc2UKLQkJCWdyb3VwX29mZnNldHNbal0gPSBncm91cHNbal0udXNlcl9vZmZzZXQ7CisJCWdyb3VwX29mZnNldHNbal0gPSBncm91cHNbal0udXNlcl9vZmZzZXQ7CiAJfQogCiAJc3Bpbl91bmxvY2soJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CkBAIC0xMjgzLDcgKzEzMjEsNyBAQAogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcG9jaF9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCQkgIGRldi0+YnVzX2lkLCBwb2NoX2Rldik7CisJCQkgIGRldl9uYW1lKGRldiksIHBvY2hfZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBJUlEgJXVcbiIsIHBkZXYtPmlycSk7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMzUwLDEyICsxMzg4LDEyIEBACiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IocG9jaF9kZXYtPmNkZXYuZGV2KTsKIAl1bnNpZ25lZCBpbnQgaWQgPSBtaW5vciAvIHBvY2hfZGV2LT5uY2hhbm5lbHM7CiAKLQkvKiBGSVhNRTogdW5tYXAgZnBnYV9pb21lbSBhbmQgYnJpZGdlX2lvbWVtICovCi0KIAlwb2NoX2NsYXNzX2Rldl91bnJlZ2lzdGVyKHBvY2hfZGV2LCBpZCk7CiAJY2Rldl9kZWwoJnBvY2hfZGV2LT5jZGV2KTsKIAlpZHJfcmVtb3ZlKCZwb2NoX2lkcywgaWQpOwogCWZyZWVfaXJxKHBkZXYtPmlycSwgcG9jaF9kZXYpOworCWlvdW5tYXAocG9jaF9kZXYtPmZwZ2FfaW9tZW0pOworCWlvdW5tYXAocG9jaF9kZXYtPmJyaWRnZV9pb21lbSk7CiAJdWlvX3VucmVnaXN0ZXJfZGV2aWNlKHVpbyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI1ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBVU0JfUlNQSQorCXRyaXN0YXRlICJQcmluY2V0b24gSW5zdHJ1bWVudHMgVVNCIGNhbWVyYSBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVVNCICYmIEJST0tFTgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgUHJpbmNldG9uIEluc3RydW1lbnRzIFVTQiBjYW1lcmEgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdhZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX1VTQl9SU1BJKQkJKz0gcnNwaXVzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYzMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETwpAQCAtMCwwICsxLDIyIEBACitUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFByaW5jZXRvbiBJbnN0cnVtZW50cyBVU0IgY2FtZXJhLgorCitJdCBuZWVkcyBsb3RzIG9mIHdvcmsgdG8gZ2V0IGl0IGludG8gdGhlIG1haW4gZHJpdmVycy91c2IvIHN1YmRpcmVjdG9yeToKKworQW55IHBhdGNoZXMgdG8gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyBhcmUgZ3JlYXRseSBhcHByZWNpYXRlZDoKKworCS0gbWFrZSBjaGVja3BhdGNoLnBsIGNsZWFuCisJLSBjb2Rpbmcgc3R5bGUgZml4dXBzICh0eXBlZGVmcywgZXRjLikKKwktIGdldCBpdCB0byBidWlsZCBwcm9wZXJseQorCS0gYXVkaXQgaW9jdGxzCisJLSByZW1vdmUgaW9jdGxzIGlmIHBvc3NpYmxlCisJLSBhc3NpZ24gcHJvcGVyIG1pbm9yIG51bWJlcgorCS0gcmVtb3ZlIGRiZygpIG1hY3JvCisJLSBsb3RzIG9mIGdlbmVyYWwgY2xlYW51cHMKKwktIHJldmlldyBsb2NraW5nCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG86CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KK2FuZCBDQzoKKwlKdWRkIE1vbnRnb21lcnkgPGp1ZGRAanBpbG90Lm9yZz4KKwlKZWZmIEZyb250eiA8amVmZi5mcm9udHpAZ21haWwuY29tPgorYXMgdGhleSBoYXZlIHRoaXMgZGV2aWNlIGFuZCBjYW4gdGVzdCBhbnkgbmVlZGVkIGNoYW5nZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyODFkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuYwpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqIHJzcGl1c2IuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBQcmluY2V0b24gSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlICJyc3BpdXNiLmgiCisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCitzdGF0aWMgaW50IGRlYnVnID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGRlYnVnOworI2VuZGlmCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyN1bmRlZiBkYmcKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIlYxLjAuMSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIlByaW5jZXRvbiBJbnN0cnVtZW50cyIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIlBJIFVTQjIuMCBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCIKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMgKi8KKyNkZWZpbmUgVkVORE9SX0lEICAgMHgwQkQ3CisjZGVmaW5lIFNUMTMzX1BJRCAgIDB4QTAxMAorI2RlZmluZSBQSVhJU19QSUQgICAweEEwMjYKKworLyogR2V0IGEgbWlub3IgcmFuZ2UgZm9yIHlvdXIgZGV2aWNlcyBmcm9tIHRoZSB1c2IgbWFpbnRhaW5lciAqLworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgUElVU0JfTUlOT1JfQkFTRSAgICAwCisjZWxzZQorI2RlZmluZSBQSVVTQl9NSU5PUl9CQVNFICAgIDE5MgorI2VuZGlmCisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgb2Ygb3VyIGRldmljZSBzcGVjaWZpYyBzdHVmZiAqLworc3RydWN0IGRldmljZV9leHRlbnNpb24geworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwkvKiBzYXZlIG9mZiB0aGUgdXNiIGRldmljZSBwb2ludGVyICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIG1pbm9yOwkvKiB0aGUgc3RhcnRpbmcgbWlub3IgbnVtYmVyIGZvciB0aGlzIGRldmljZSAqLworCXNpemVfdCBidWxrX2luX3NpemVfcmV0dXJuZWQ7CisJaW50IGJ1bGtfaW5fYnl0ZV90cms7CisJc3RydWN0IHVyYiAqKipQaXhlbFVyYjsKKwlpbnQgZnJhbWVJZHg7CisJaW50IHVyYklkeDsKKwl1bnNpZ25lZCBpbnQgKm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQ7CisJaW50IG9wZW47CQkvKiBpZiB0aGUgcG9ydCBpcyBvcGVuIG9yIG5vdCAqLworCWludCBwcmVzZW50OwkJLyogaWYgdGhlIGRldmljZSBpcyBub3QgZGlzY29ubmVjdGVkICovCisJaW50IHVzZXJCdWZNYXBwZWQ7CS8qIGhhcyB0aGUgdXNlciBidWZmZXIgYmVlbiBtYXBwZWQ/ICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dsOwkvKiBzY2F0dGVyLWdhdGhlciBsaXN0IGZvciB1c2VyIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAqc2dFbnRyaWVzOworCXN0cnVjdCBrcmVmIGtyZWY7CisJaW50IGdvdFBpeGVsRGF0YTsKKwlpbnQgcGVuZGluZ1dyaXRlOworCWNoYXIgKipwZW5kZWRQaXhlbFVyYnM7CisJaW50IGlhbWE7CQkvKlBJWElTIG9yIFNUMTMzICovCisJaW50IG51bV9mcmFtZXM7CQkvKiB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHdpbGwgZml0IGluIHRoZSB1c2VyIGJ1ZmZlciAqLworCWludCBhY3RpdmVfZnJhbWU7CisJdW5zaWduZWQgbG9uZyBmcmFtZVNpemU7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJLy9GWDIgc3BlY2lmaWMgZW5kcG9pbnRzCisJdW5zaWduZWQgaW50IGhFUFs4XTsKK307CisjZGVmaW5lIHRvX3BpX2RldihkKSBjb250YWluZXJfb2YoIGQsIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uLCBrcmVmICkKKworc3RhdGljIGludCBNYXBVc2VyQnVmZmVyKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKiwgc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgaW50IFVuTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKTsKK3N0YXRpYyBpbnQgcGl1c2JfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHBpdXNiX291dHB1dChzdHJ1Y3QgaW9jdGxfc3RydWN0ICosIHVuc2lnbmVkIGNoYXIgKiwgaW50LCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwaXVzYl9kcml2ZXI7CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwaV9kZXZpY2VfdGFibGVbXSA9IHsKKwl7VVNCX0RFVklDRShWRU5ET1JfSUQsIFNUMTMzX1BJRCl9LAorCXtVU0JfREVWSUNFKFZFTkRPUl9JRCwgUElYSVNfUElEKX0sCisJezAsIH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHBpX2RldmljZV90YWJsZSk7CisKK3N0YXRpYyBpbnQgbGFzdEVyciA9IDA7CitzdGF0aWMgaW50IGVyckNudCA9IDA7CisKK3N0YXRpYyB2b2lkIHBpdXNiX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gdG9fcGlfZGV2KGtyZWYpOworCisJZGV2X2RiZygmcGR4LT51ZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXVzYl9wdXRfZGV2KHBkeC0+dWRldik7CisJa2ZyZWUocGR4KTsKK30KKworc3RhdGljIGludCBwaXVzYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggPSBOVUxMOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJaW50IHN1Ym1pbm9yOworCWludCByZXR2YWwgPSAwOworCisJZGJnKCJQaXVzYl9PcGVuKCkiKTsKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZwaXVzYl9kcml2ZXIsIHN1Ym1pbm9yKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9ub19kZXZpY2U7CisJfQorCisJcGR4ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmICghcGR4KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9ub19kZXZpY2U7CisJfQorCWRiZygiQWx0ZXJuYXRlIFNldHRpbmcgPSAlZCIsIGludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOworCisJcGR4LT5mcmFtZUlkeCA9IHBkeC0+dXJiSWR4ID0gMDsKKwlwZHgtPmdvdFBpeGVsRGF0YSA9IDA7CisJcGR4LT5wZW5kaW5nV3JpdGUgPSAwOworCXBkeC0+ZnJhbWVTaXplID0gMDsKKwlwZHgtPm51bV9mcmFtZXMgPSAwOworCXBkeC0+YWN0aXZlX2ZyYW1lID0gMDsKKwlwZHgtPmJ1bGtfaW5fYnl0ZV90cmsgPSAwOworCXBkeC0+dXNlckJ1Zk1hcHBlZCA9IDA7CisJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPSBOVUxMOworCXBkeC0+c2dFbnRyaWVzID0gTlVMTDsKKwlwZHgtPnNnbCA9IE5VTEw7CisJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkID0gTlVMTDsKKwlwZHgtPlBpeGVsVXJiID0gTlVMTDsKKwlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCA9IDA7CisJLyogaW5jcmVtZW50IG91ciB1c2FnZSBjb3VudCBmb3IgdGhlIGRldmljZSAqLworCWtyZWZfZ2V0KCZwZHgtPmtyZWYpOworCS8qIHNhdmUgb3VyIG9iamVjdCBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGR4OworICAgICAgZXhpdF9ub19kZXZpY2U6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBwaXVzYl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHg7CisJaW50IHJldHZhbCA9IDA7CisKKwlkYmcoIlBpdXNiX1JlbGVhc2UoKSIpOworCXBkeCA9IChzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocGR4ID09IE5VTEwpIHsKKwkJZGJnKCIlcyAtIG9iamVjdCBpcyBOVUxMIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogZGVjcmVtZW50IHRoZSBjb3VudCBvbiBvdXIgZGV2aWNlICovCisJa3JlZl9wdXQoJnBkeC0+a3JlZiwgcGl1c2JfZGVsZXRlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXBpdXNiX2lvY3RsCisgKi8KK3N0YXRpYyBpbnQgcGl1c2JfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWNoYXIgZHVtbXlDdGxCdWZbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCXVuc2lnbmVkIGxvbmcgZGV2UkIgPSAwOworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaW9jdGxfc3RydWN0IGN0cmw7CisJdW5zaWduZWQgY2hhciAqdUJ1ZjsKKwlpbnQgbnVtYnl0ZXMgPSAwOworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xEYXRhID0gMDsKKworCXBkeCA9IChzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoIXBkeC0+cHJlc2VudCkgeworCQlkYmcoIk5vIERldmljZSBQcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGZpbGwgaW4geW91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgaGVyZSAqLworCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisJZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCisJCWVyciA9ICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGR4LT51ZGV2LT5kZXYsICJyZXR1cm4gd2l0aCBlcnJvciA9ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBJVVNCX0dFVFZORENNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCWRiZygiJXMgJXhcbiIsICJHZXQgVmVuZG9yIENvbW1hbmQgPSAiLCBjdHJsLmNtZCk7CisJCXJldHZhbCA9CisJCSAgICB1c2JfY29udHJvbF9tc2cocGR4LT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUocGR4LT51ZGV2LCAwKSwKKwkJCQkgICAgY3RybC5jbWQsIFVTQl9ESVJfSU4sIDAsIDAsICZkZXZSQiwKKwkJCQkgICAgY3RybC5udW1ieXRlcywgSFogKiAxMCk7CisJCWlmIChjdHJsLmNtZCA9PSAweEYxKSB7CisJCQlkYmcoIkZXIFZlcnNpb24gcmV0dXJuZWQgZnJvbSBIVyA9ICVsZC4lbGQiLAorCQkJICAgIChkZXZSQiA+PiA4KSwgKGRldlJCICYgMHhGRikpOworCQl9CisJCXJldHVybiBkZXZSQjsKKwljYXNlIFBJVVNCX1NFVFZORENNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisvLyAgICAgICAgICAgIGRiZyggIiVzICV4IiwgIlNldCBWZW5kb3IgQ29tbWFuZCA9ICIsY3RybC5jbWQgKTsKKwkJY29udHJvbERhdGEgPSBjdHJsLnBEYXRhWzBdOworCQljb250cm9sRGF0YSB8PSAoY3RybC5wRGF0YVsxXSA8PCA4KTsKKy8vICAgICAgICAgICAgZGJnKCAiJXMgJWQiLCAiVmVuZG9yIERhdGEgPSIsY29udHJvbERhdGEgKTsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKHBkeC0+dWRldiwgMCksIGN0cmwuY21kLCAoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IpLAkvKiB8IFVTQl9SRUNJUF9FTkRQT0lOVCksICovCisJCQkJCSBjb250cm9sRGF0YSwKKwkJCQkJIDAsCisJCQkJCSAmZHVtbXlDdGxCdWYsIGN0cmwubnVtYnl0ZXMsIEhaICogMTApOworCQlyZXR1cm4gcmV0dmFsOworCQlicmVhazsKKwljYXNlIFBJVVNCX0lTSElHSFNQRUVEOgorCQlyZXR1cm4gKChwZHgtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IDEgOiAwKTsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9XUklURVBJUEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBXUklURV9EVU1NWSBmYWlsZWRcbiIpOworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY3RybC5wRGF0YSwgY3RybC5udW1ieXRlcykpIHsKKwkJCWRiZygiY2FuJ3QgYWNjZXNzIHBEYXRhIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwaXVzYl9vdXRwdXQoJmN0cmwsIGN0cmwucERhdGEgLyp1QnVmICovICwgY3RybC5udW1ieXRlcywgcGR4KTsKKwkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCWJyZWFrOworCWNhc2UgUElVU0JfVVNFUkJVRkZFUjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCWluZm8oImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiBNYXBVc2VyQnVmZmVyKChzdHJ1Y3QgaW9jdGxfc3RydWN0ICopICYgY3RybCwgcGR4KTsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9VTk1BUF9VU0VSQlVGRkVSOgorCQlVbk1hcFVzZXJCdWZmZXIocGR4KTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgUElVU0JfUkVBRFBJUEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlzd2l0Y2ggKGN0cmwuZW5kcG9pbnQpIHsKKwkJY2FzZSAwOgkvL1NUMTMzIFBpeGVsIERhdGEgb3IgUElYSVMgSU8KKwkJCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKSB7CisJCQkJdW5zaWduZWQgaW50IG51bVRvUmVhZCA9IDA7CisJCQkJdW5zaWduZWQgaW50IHRvdGFsUmVhZCA9IDA7CisJCQkJdUJ1ZiA9IGttYWxsb2MoY3RybC5udW1ieXRlcywgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCF1QnVmKSB7CisJCQkJCWRiZygiQWxsb2MgZm9yIHVCdWYgZmFpbGVkIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQludW1ieXRlcyA9IGN0cmwubnVtYnl0ZXM7CisJCQkJbnVtVG9SZWFkID0gbnVtYnl0ZXM7CisJCQkJZGJnKCJudW1ieXRlcyB0byByZWFkID0gJWQiLCBudW1ieXRlcyk7CisJCQkJZGJnKCJlbmRwb2ludCAjICVkIiwgY3RybC5lbmRwb2ludCk7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVCdWYsIGN0cmwucERhdGEsIG51bWJ5dGVzKSkKKwkJCQkJZGJnKCJjb3B5aW5nIGN0cmwucERhdGEgdG8gZHVtbXlCdWYgZmFpbGVkIik7CisJCQkJZG8geworCQkJCQlpID0gdXNiX2J1bGtfbXNnKHBkeC0+dWRldiwgcGR4LT5oRVBbY3RybC5lbmRwb2ludF0sICh1QnVmICsgdG90YWxSZWFkKSwgKG51bVRvUmVhZCA+IDY0KSA/IDY0IDogbnVtVG9SZWFkLCAmbnVtYnl0ZXMsIEhaICogMTApOwkvL0VQMCBjYW4gb25seSBoYW5kbGUgNjQgYnl0ZXMgYXQgYSB0aW1lCisJCQkJCWlmIChpKSB7CisJCQkJCQlkYmcoIkNNRCA9ICVzLCBBZGRyZXNzID0gMHglMDJYIiwgKCh1QnVmWzNdID09IDB4MDIpID8gIldSSVRFIiA6ICJSRUFEIiksIHVCdWZbMV0pOworCQkJCQkJZGJnKCJOdW1iZXIgb2YgYnl0ZXMgQXR0ZW1wdGVkIHRvIHJlYWQgPSAlZCIsIChpbnQpY3RybC5udW1ieXRlcyk7CisJCQkJCQlkYmcoIkJsb2NraW5nIFJlYWRJL08gRmFpbGVkIHdpdGggc3RhdHVzICVkIiwgaSk7CisJCQkJCQlrZnJlZSh1QnVmKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRiZygiUGl4aXMgRVAwIFJlYWQgJWQgYnl0ZXMiLAorCQkJCQkJICAgIG51bWJ5dGVzKTsKKwkJCQkJCXRvdGFsUmVhZCArPSBudW1ieXRlczsKKwkJCQkJCW51bVRvUmVhZCAtPSBudW1ieXRlczsKKwkJCQkJfQorCQkJCX0KKwkJCQl3aGlsZSAobnVtVG9SZWFkKTsKKwkJCQltZW1jcHkoY3RybC5wRGF0YSwgdUJ1ZiwgdG90YWxSZWFkKTsKKwkJCQlkYmcoIlRvdGFsIEJ5dGVzIFJlYWQgZnJvbSBQSVhJUyBFUDAgPSAlZCIsCisJCQkJICAgIHRvdGFsUmVhZCk7CisJCQkJY3RybC5udW1ieXRlcyA9IHRvdGFsUmVhZDsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICgoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSBhcmcsICZjdHJsLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCQkJZGJnKCJjb3B5X3RvX3VzZXIgZmFpbGVkIGluIElPUkIiKTsKKwkJCQlrZnJlZSh1QnVmKTsKKwkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCX0gZWxzZQkvL1NUMTMzIFBpeGVsIERhdGEKKwkJCXsKKwkJCQlpZiAoIXBkeC0+Z290UGl4ZWxEYXRhKQorCQkJCQlyZXR1cm4gMDsKKwkJCQllbHNlIHsKKwkJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCQkJCQljdHJsLm51bWJ5dGVzID0KKwkJCQkJICAgIHBkeC0+YnVsa19pbl9zaXplX3JldHVybmVkOworCQkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCAtPQorCQkJCQkgICAgcGR4LT5mcmFtZVNpemU7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbcGR4LT5hY3RpdmVfZnJhbWVdOyBpKyspCisJCQkJCQlTZXRQYWdlRGlydHkocGR4LT5zZ2xbcGR4LT5hY3RpdmVfZnJhbWVdW2ldLnBhZ2VfbGluayk7CisJCQkJCXBkeC0+YWN0aXZlX2ZyYW1lID0KKwkJCQkJICAgICgocGR4LT5hY3RpdmVfZnJhbWUgKworCQkJCQkgICAgICAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CS8vU1QxMzNJTworCQljYXNlIDQ6CS8vUElYSVMgSU8KKwkJCXVCdWYgPSBrbWFsbG9jKGN0cmwubnVtYnl0ZXMsIEdGUF9LRVJORUwpOworCQkJaWYgKCF1QnVmKSB7CisJCQkJZGJnKCJBbGxvYyBmb3IgdUJ1ZiBmYWlsZWQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW51bWJ5dGVzID0gY3RybC5udW1ieXRlczsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmcoICJudW1ieXRlcyB0byByZWFkID0gJWQiLCBudW1ieXRlcyApOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVCdWYsIGN0cmwucERhdGEsIG51bWJ5dGVzKSkKKwkJCQlkYmcoImNvcHlpbmcgY3RybC5wRGF0YSB0byBkdW1teUJ1ZiBmYWlsZWQiKTsKKwkJCWkgPSB1c2JfYnVsa19tc2cocGR4LT51ZGV2LCBwZHgtPmhFUFtjdHJsLmVuZHBvaW50XSwKKwkJCQkJIHVCdWYsIG51bWJ5dGVzLCAmbnVtYnl0ZXMsIEhaICogMTApOworCQkJaWYgKGkpIHsKKwkJCQlkYmcoIkJsb2NraW5nIFJlYWRJL08gRmFpbGVkIHdpdGggc3RhdHVzICVkIiwKKwkJCQkgICAgaSk7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIHsKKwkJCQljdHJsLm51bWJ5dGVzID0gbnVtYnl0ZXM7CisJCQkJbWVtY3B5KGN0cmwucERhdGEsIHVCdWYsIG51bWJ5dGVzKTsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICgoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSBhcmcsICZjdHJsLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb2N0bF9zdHJ1Y3QpKSkKKwkJCQkJZGJnKCJjb3B5X3RvX3VzZXIgZmFpbGVkIGluIElPUkIiKTsKKwkJCQlrZnJlZSh1QnVmKTsKKwkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjoJLy9QSVhJUyBQaW5nCisJCWNhc2UgMzoJLy9QSVhJUyBQb25nCisJCQlpZiAoIXBkeC0+Z290UGl4ZWxEYXRhKQorCQkJCXJldHVybiAwOworCQkJZWxzZSB7CisJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCQkJCWN0cmwubnVtYnl0ZXMgPSBwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZDsKKwkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCAtPSBwZHgtPmZyYW1lU2l6ZTsKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8CisJCQkJICAgICBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbcGR4LT4KKwkJCQkJCQkJIGFjdGl2ZV9mcmFtZV07CisJCQkJICAgICBpKyspCisJCQkJCVNldFBhZ2VEaXJ0eShwZHgtPnNnbFtwZHgtPmFjdGl2ZV9mcmFtZV1baV0ucGFnZV9saW5rKTsKKwkJCQlwZHgtPmFjdGl2ZV9mcmFtZSA9CisJCQkJICAgICgocGR4LT5hY3RpdmVfZnJhbWUgKyAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFBJVVNCX1dIQVRDQU1FUkE6CisJCXJldHVybiBwZHgtPmlhbWE7CisJY2FzZSBQSVVTQl9TRVRGUkFNRVNJWkU6CisJCWRiZygiUElVU0JfU0VURlJBTUVTSVpFIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlwZHgtPmZyYW1lU2l6ZSA9IGN0cmwubnVtYnl0ZXM7CisJCXBkeC0+bnVtX2ZyYW1lcyA9IGN0cmwubnVtRnJhbWVzOworCQlpZiAoIXBkeC0+c2dsKQorCQkJcGR4LT5zZ2wgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCAqKSAqCisJCQkJICAgIHBkeC0+bnVtX2ZyYW1lcywgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5zZ0VudHJpZXMpCisJCQlwZHgtPnNnRW50cmllcyA9CisJCQkgICAga21hbGxvYyhzaXplb2YodW5zaWduZWQgaW50KSAqIHBkeC0+bnVtX2ZyYW1lcywKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5QaXhlbFVyYikKKwkJCXBkeC0+UGl4ZWxVcmIgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKiopICogcGR4LT5udW1fZnJhbWVzLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQpCisJCQlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQgPQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBwZHgtPm51bV9mcmFtZXMpOworCQlpZiAoIXBkeC0+cGVuZGVkUGl4ZWxVcmJzKQorCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBwZHgtPm51bV9mcmFtZXMsCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlkYmcoIiVzXG4iLCAiTm8gSU9DVEwgZm91bmQiKTsKKwkJYnJlYWs7CisKKwl9CisJLyogcmV0dXJuIHRoYXQgd2UgZGlkIG5vdCB1bmRlcnN0YW5kIHRoaXMgaW9jdGwgY2FsbCAqLworCWRiZygiUmV0dXJuaW5nIC1FTk9UVFkiKTsKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHZvaWQgcGl1c2Jfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fCBzdGF0dXMgPT0gLUVDT05OUkVTRVQpKQorCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAorCQkJIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisKKwlwZHgtPnBlbmRpbmdXcml0ZSA9IDA7CisJdXNiX2J1ZmZlcl9mcmVlKHVyYi0+ZGV2LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9kbWEpOworfQorCitpbnQgcGl1c2Jfb3V0cHV0KHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKiBpbywgdW5zaWduZWQgY2hhciAqdUJ1ZiwgaW50IGxlbiwKKwkJIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJc3RydWN0IHVyYiAqdXJiID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjaGFyICprYnVmID0gTlVMTDsKKworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVyYiAhPSBOVUxMKSB7CisJCWtidWYgPQorCQkgICAgdXNiX2J1ZmZlcl9hbGxvYyhwZHgtPnVkZXYsIGxlbiwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICZ1cmItPnRyYW5zZmVyX2RtYSk7CisJCWlmICgha2J1ZikgeworCQkJaW5mbygiYnVmZmVyX2FsbG9jIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1jcHkoa2J1ZiwgdUJ1ZiwgbGVuKTsKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwZHgtPnVkZXYsIHBkeC0+aEVQW2lvLT5lbmRwb2ludF0sIGtidWYsCisJCQkJICBsZW4sIHBpdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIHBkeCk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkeC0+dWRldi0+ZGV2LAorCQkJCSJXUklURSBFUlJPUjpzdWJtaXQgdXJiIGVycm9yID0gJWRcbiIsIGVycik7CisJCX0KKwkJcGR4LT5wZW5kaW5nV3JpdGUgPSAxOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwl9CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBVbk1hcFVzZXJCdWZmZXIoc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGsgPSAwOworCXVuc2lnbmVkIGludCBlcEFkZHI7CisJZm9yIChrID0gMDsgayA8IHBkeC0+bnVtX2ZyYW1lczsgaysrKSB7CisJCWRiZygiS2lsbGluZyBVcmJzIGZvciBGcmFtZSAlZCIsIGspOworCQlmb3IgKGkgPSAwOyBpIDwgcGR4LT5zZ0VudHJpZXNba107IGkrKykgeworCQkJdXNiX2tpbGxfdXJiKHBkeC0+UGl4ZWxVcmJba11baV0pOworCQkJdXNiX2ZyZWVfdXJiKHBkeC0+UGl4ZWxVcmJba11baV0pOworCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnNba11baV0gPSAwOworCQl9CisJCWRiZygiVXJiIGVycm9yIGNvdW50ID0gJWQiLCBlcnJDbnQpOworCQllcnJDbnQgPSAwOworCQlkYmcoIlVyYnMgZnJlZSdkIGFuZCBLaWxsZWQgZm9yIEZyYW1lICVkIiwgayk7CisJfQorCisJZm9yIChrID0gMDsgayA8IHBkeC0+bnVtX2ZyYW1lczsgaysrKSB7CisJCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKQkvL2lmIHNvLCB3aGljaCBFUCBzaG91bGQgd2UgbWFwIHRoaXMgZnJhbWUgdG8KKwkJeworCQkJaWYgKGsgJSAyKQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHNob3VsZCB1c2UgRVA0KFBPTkcpCisJCQl7CisJCQkJZXBBZGRyID0gcGR4LT5oRVBbM107CS8vUE9ORywgb2RkIGZyYW1lcworCQkJfSBlbHNlIHsKKwkJCQllcEFkZHIgPSBwZHgtPmhFUFsyXTsJLy9QSU5HLCBldmVuIGZyYW1lcyBhbmQgemVybworCQkJfQorCQl9IGVsc2UJCS8vU1QxMzMgb25seSBoYXMgMSBlbmRwb2ludCBmb3IgUGl4ZWwgZGF0YSB0cmFuc2ZlcgorCQl7CisJCQllcEFkZHIgPSBwZHgtPmhFUFswXTsKKwkJfQorCQl1c2JfYnVmZmVyX3VubWFwX3NnKHBkeC0+dWRldiwgZXBBZGRyLCBwZHgtPnNnbFtrXSwKKwkJCQkgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2tdKTsKKwkJZm9yIChpID0gMDsgaSA8IHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtrXTsgaSsrKSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGR4LT5zZ2xba11baV0ucGFnZV9saW5rKTsKKwkJfQorCQlrZnJlZShwZHgtPnNnbFtrXSk7CisJCWtmcmVlKHBkeC0+UGl4ZWxVcmJba10pOworCQlrZnJlZShwZHgtPnBlbmRlZFBpeGVsVXJic1trXSk7CisJCXBkeC0+c2dsW2tdID0gTlVMTDsKKwkJcGR4LT5QaXhlbFVyYltrXSA9IE5VTEw7CisJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2tdID0gTlVMTDsKKwl9CisJa2ZyZWUocGR4LT5zZ0VudHJpZXMpOworCXZmcmVlKHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCk7CisJcGR4LT5zZ0VudHJpZXMgPSBOVUxMOworCXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCA9IE5VTEw7CisJa2ZyZWUocGR4LT5zZ2wpOworCWtmcmVlKHBkeC0+cGVuZGVkUGl4ZWxVcmJzKTsKKwlrZnJlZShwZHgtPlBpeGVsVXJiKTsKKwlwZHgtPnNnbCA9IE5VTEw7CisJcGR4LT5wZW5kZWRQaXhlbFVyYnMgPSBOVUxMOworCXBkeC0+UGl4ZWxVcmIgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaXVzYl9yZWFkUElYRUxfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gdXJiLT5jb250ZXh0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKworCWlmIChzdGF0dXMgJiYgIShzdGF0dXMgPT0gLUVOT0VOVCB8fCBzdGF0dXMgPT0gLUVDT05OUkVTRVQpKSB7CisJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sCisJCSAgICBzdGF0dXMpOworCQlkYmcoIkVycm9yIGluIHJlYWQgRVAyIGNhbGxiYWNrIik7CisJCWRiZygiRnJhbWVJbmRleCA9ICVkIiwgcGR4LT5mcmFtZUlkeCk7CisJCWRiZygiQnl0ZXMgcmVjZWl2ZWQgYmVmb3JlIHByb2JsZW0gb2NjdXJyZWQgPSAlZCIsCisJCSAgICBwZHgtPmJ1bGtfaW5fYnl0ZV90cmspOworCQlkYmcoIlVyYiBJZHggPSAlZCIsIHBkeC0+dXJiSWR4KTsKKwkJcGR4LT5wZW5kZWRQaXhlbFVyYnNbcGR4LT5mcmFtZUlkeF1bcGR4LT51cmJJZHhdID0gMDsKKwl9IGVsc2UgeworCQlwZHgtPmJ1bGtfaW5fYnl0ZV90cmsgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl7CisJCQlpID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsJLy9yZXN1Ym1pdCB0aGUgVVJCCisJCQlpZiAoaSkgeworCQkJCWVyckNudCsrOworCQkJCWlmIChpICE9IGxhc3RFcnIpIHsKKwkJCQkJZGJnKCJzdWJtaXQgdXJiIGluIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBpKTsKKwkJCQkJbGFzdEVyciA9IGk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwZHgtPnVyYklkeCsrOwkvL3BvaW50IHRvIG5leHQgVVJCIHdoZW4gd2UgY2FsbGJhY2sKKwkJCQlpZiAocGR4LT5idWxrX2luX2J5dGVfdHJrID49IHBkeC0+ZnJhbWVTaXplKSB7CisJCQkJCXBkeC0+YnVsa19pbl9zaXplX3JldHVybmVkID0KKwkJCQkJICAgIHBkeC0+YnVsa19pbl9ieXRlX3RyazsKKwkJCQkJcGR4LT5idWxrX2luX2J5dGVfdHJrID0gMDsKKwkJCQkJcGR4LT5nb3RQaXhlbERhdGEgPSAxOworCQkJCQlwZHgtPmZyYW1lSWR4ID0KKwkJCQkJICAgICgocGR4LT5mcmFtZUlkeCArCisJCQkJCSAgICAgIDEpICUgcGR4LT5udW1fZnJhbWVzKTsKKwkJCQkJcGR4LT51cmJJZHggPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyogTWFwVXNlckJ1ZmZlcigKKwlpbnB1dHM6CisJc3RydWN0IGlvY3RsX3N0cnVjdCAqaW8gLSBzdHJ1Y3R1cmUgY29udGFpbmluZyB1c2VyIGFkZHJlc3MsIGZyYW1lICMsIGFuZCBzaXplCisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCAtIHRoZSBQSVVTQiBkZXZpY2UgZXh0ZW5zaW9uCisJcmV0dXJuczoKKwlpbnQgLSBzdGF0dXMgb2YgdGhlIHRhc2sKKwlOb3RlczoKKwlNYXBVc2VyQnVmZmVyIG1hcHMgYSBidWZmZXIgcGFzc2VkIGRvd24gdGhyb3VnaCBhbiBpb2N0bC4gIFRoZSB1c2VyIGJ1ZmZlciBpcyBQYWdlIEFsaWduZWQgYnkgdGhlIGFwcAorCWFuZCB0aGVuIHBhc3NlZCBkb3duLiAgVGhlIGZ1bmN0aW9uIGdldF9mcmVlX3BhZ2VzKC4uLikgZG9lcyB0aGUgYWN0dWFsIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBmcm9tIHVzZXIgc3BhY2UgdG8KKwlrZXJuZWwgc3BhY2UuICBGcm9tIHRoZXJlIGEgc2NhdHRlcmxpc3QgaXMgY3JlYXRlZCBmcm9tIGFsbCB0aGUgcGFnZXMuICBUaGUgbmV4dCBmdW5jdGlvbiBjYWxsZWQgaXMgdG8gdXNiX2J1ZmZlcl9tYXBfc2cKKwl3aGljaCBhbGxvY2F0ZWQgRE1BIGFkZHJlc3NlcyBmb3IgZWFjaCBwYWdlLCBldmVuIGNvYWxlc2NpbmcgdGhlbSBpZiBwb3NzaWJsZS4gIFRoZSBETUEgYWRkcmVzcyBpcyBwbGFjZWQgaW4gdGhlIHNjYXR0ZXJsaXN0CisJc3RydWN0dXJlLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBETUEgYWRkcmVzc2VzLiAgVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQKKwl0aGUgdXNlciBidWZmZXIgdXNlcy4gIFdlIHRoZW4gYnVpbGQgYW4gVVJCIGZvciBlYWNoIERNQSBhZGRyZXNzIGFuZCB0aGVuIHN1Ym1pdCB0aGVtLgorKi8KKy8vaW50IE1hcFVzZXJCdWZmZXIoIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGxvbmcgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgZnJhbWVJbmZvLCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ICkKK3N0YXRpYyBpbnQgTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgaW9jdGxfc3RydWN0ICppbywgc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCkKK3sKKwl1bnNpZ25lZCBsb25nIHVhZGRyOworCXVuc2lnbmVkIGxvbmcgbnVtYnl0ZXM7CisJaW50IGZyYW1lSW5mbzsJCS8vd2hpY2ggZnJhbWUgd2UncmUgbWFwcGluZworCXVuc2lnbmVkIGludCBlcEFkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCWludCBpID0gMDsKKwlpbnQgayA9IDA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHBhZ2UgKiptYXBsaXN0X3A7CisJaW50IG51bVBhZ2VzUmVxdWlyZWQ7CisJZnJhbWVJbmZvID0gaW8tPm51bUZyYW1lczsKKwl1YWRkciA9ICh1bnNpZ25lZCBsb25nKWlvLT5wRGF0YTsKKwludW1ieXRlcyA9IGlvLT5udW1ieXRlczsKKworCWlmIChwZHgtPmlhbWEgPT0gUElYSVNfUElEKQkvL2lmIHNvLCB3aGljaCBFUCBzaG91bGQgd2UgbWFwIHRoaXMgZnJhbWUgdG8KKwl7CisJCWlmIChmcmFtZUluZm8gJSAyKQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHNob3VsZCB1c2UgRVA0KFBPTkcpCisJCXsKKwkJCWVwQWRkciA9IHBkeC0+aEVQWzNdOwkvL1BPTkcsIG9kZCBmcmFtZXMKKwkJfSBlbHNlIHsKKwkJCWVwQWRkciA9IHBkeC0+aEVQWzJdOwkvL1BJTkcsIGV2ZW4gZnJhbWVzIGFuZCB6ZXJvCisJCX0KKwkJZGJnKCJQaXhpcyBGcmFtZSAjJWQ6IEVQPSVkIiwgZnJhbWVJbmZvLAorCQkgICAgKGVwQWRkciA9PSBwZHgtPmhFUFsyXSkgPyAyIDogNCk7CisJfSBlbHNlCQkJLy9TVDEzMyBvbmx5IGhhcyAxIGVuZHBvaW50IGZvciBQaXhlbCBkYXRhIHRyYW5zZmVyCisJeworCQllcEFkZHIgPSBwZHgtPmhFUFswXTsKKwkJZGJnKCJTVDEzMyBGcmFtZSAjJWQ6IEVQPTIiLCBmcmFtZUluZm8pOworCX0KKwljb3VudCA9IG51bWJ5dGVzOworCWRiZygiVXNlckFkZHJlc3MgPSAweCUwOGxYIiwgdWFkZHIpOworCWRiZygibnVtYnl0ZXMgPSAlZCIsIChpbnQpbnVtYnl0ZXMpOworCS8vbnVtYmVyIG9mIHBhZ2VzIHRvIG1hcCB0aGUgZW50aXJlIHVzZXIgc3BhY2UgRE1BIGJ1ZmZlcgorCW51bVBhZ2VzUmVxdWlyZWQgPQorCSAgICAoKHVhZGRyICYgflBBR0VfTUFTSykgKyBjb3VudCArIH5QQUdFX01BU0spID4+IFBBR0VfU0hJRlQ7CisJZGJnKCJOdW1iZXIgb2YgcGFnZXMgbmVlZGVkID0gJWQiLCBudW1QYWdlc1JlcXVpcmVkKTsKKwltYXBsaXN0X3AgPSB2bWFsbG9jKG51bVBhZ2VzUmVxdWlyZWQgKiBzaXplb2Yoc3RydWN0IHBhZ2UpKTsJLy8sIEdGUF9BVE9NSUMpOworCWlmICghbWFwbGlzdF9wKSB7CisJCWRiZygiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBtYXBsaXN0X3AiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vbWFwIHRoZSB1c2VyIGJ1ZmZlciB0byBrZXJuZWwgbWVtb3J5CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCAodWFkZHIgJiBQQUdFX01BU0spLCBudW1QYWdlc1JlcXVpcmVkLCBXUklURSwgMCwJLy9Eb24ndCBGb3JjZQorCQkJCQkJCQltYXBsaXN0X3AsCisJCQkJCQkJCU5VTEwpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWRiZygiTnVtYmVyIG9mIHBhZ2VzIG1hcHBlZCA9ICVkIiwKKwkgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pOworCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXTsgaSsrKQorCQlmbHVzaF9kY2FjaGVfcGFnZShtYXBsaXN0X3BbaV0pOworCWlmICghcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pIHsKKwkJZGJnKCJnZXRfdXNlcl9wYWdlcygpIGZhaWxlZCIpOworCQl2ZnJlZShtYXBsaXN0X3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy9uZWVkIHRvIGNyZWF0ZSBhIHNjYXR0ZXJsaXN0IHRoYXQgc3BhbnMgZWFjaCBmcmFtZSB0aGF0IGNhbiBmaXQgaW50byB0aGUgbWFwcGVkIGJ1ZmZlcgorCXBkeC0+c2dsW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKChwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSAqCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBkeC0+c2dsW2ZyYW1lSW5mb10pIHsKKwkJdmZyZWUobWFwbGlzdF9wKTsKKwkJZGJnKCJjYW4ndCBhbGxvY2F0ZSBtZW0gZm9yIHNnbCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5wYWdlX2xpbmsgPSBtYXBsaXN0X3BbMF07CisJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5vZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJaWYgKHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dID4gMSkgeworCQlwZHgtPnNnbFtmcmFtZUluZm9dWzBdLmxlbmd0aCA9CisJCSAgICBQQUdFX1NJWkUgLSBwZHgtPnNnbFtmcmFtZUluZm9dWzBdLm9mZnNldDsKKwkJY291bnQgLT0gcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGg7CisJCWZvciAoayA9IDE7IGsgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXTsgaysrKSB7CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLm9mZnNldCA9IDA7CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLnBhZ2VfbGluayA9IG1hcGxpc3RfcFtrXTsKKwkJCXBkeC0+c2dsW2ZyYW1lSW5mb11ba10ubGVuZ3RoID0KKwkJCSAgICAoY291bnQgPCBQQUdFX1NJWkUpID8gY291bnQgOiBQQUdFX1NJWkU7CisJCQljb3VudCAtPSBQQUdFX1NJWkU7CS8vZXhhbXBsZSBoYWQgUEFHRV9TSVpFIGhlcmU7CisJCX0KKwl9IGVsc2UgeworCQlwZHgtPnNnbFtmcmFtZUluZm9dWzBdLmxlbmd0aCA9IGNvdW50OworCX0KKwlwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dID0KKwkgICAgdXNiX2J1ZmZlcl9tYXBfc2cocGR4LT51ZGV2LCBlcEFkZHIsIHBkeC0+c2dsW2ZyYW1lSW5mb10sCisJCQkgICAgICBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSk7CisJZGJnKCJudW1iZXIgb2Ygc2dFbnRyaWVzID0gJWQiLCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dKTsKKwlwZHgtPnVzZXJCdWZNYXBwZWQgPSAxOworCXZmcmVlKG1hcGxpc3RfcCk7CisJLy9DcmVhdGUgYW5kIFNlbmQgdGhlIFVSQidzIGZvciBlYWNoIHMvZyBlbnRyeQorCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXSA9CisJICAgIGttYWxsb2MocGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSAqIHNpemVvZihzdHJ1Y3QgdXJiICopLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb10pIHsKKwkJZGJnKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIFVyYiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb107IGkrKykgeworCQlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwkvLzAgYmVjYXVzZSB3ZSdyZSB1c2luZyBCVUxLIHRyYW5zZmVycworCQl1c2JfZmlsbF9idWxrX3VyYihwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0sCisJCQkJICBwZHgtPnVkZXYsCisJCQkJICBlcEFkZHIsCisJCQkJICAoZG1hX2FkZHJfdCAqKSBzZ19kbWFfYWRkcmVzcygmcGR4LT4KKwkJCQkJCQkJc2dsW2ZyYW1lSW5mb10KKwkJCQkJCQkJW2ldKSwKKwkJCQkgIHNnX2RtYV9sZW4oJnBkeC0+c2dsW2ZyYW1lSW5mb11baV0pLAorCQkJCSAgcGl1c2JfcmVhZFBJWEVMX2NhbGxiYWNrLCAodm9pZCAqKXBkeCk7CisJCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVtpXS0+dHJhbnNmZXJfZG1hID0KKwkJICAgIHNnX2RtYV9hZGRyZXNzKCZwZHgtPnNnbFtmcmFtZUluZm9dW2ldKTsKKwkJcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLT50cmFuc2Zlcl9mbGFncyA9CisJCSAgICBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUCB8IFVSQl9OT19JTlRFUlJVUFQ7CisJfQorCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVstLWldLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX05PX0lOVEVSUlVQVDsJLy9vbmx5IGludGVycnVwdCB3aGVuIGxhc3QgVVJCIGNvbXBsZXRlcworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKChwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dICogc2l6ZW9mKGNoYXIpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dKQorCQlkYmcoIkNhbid0IGFsbG9jYXRlIE1lbW9yeSBmb3IgcGVuZGVkUGl4ZWxVcmJzIik7CisJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb107IGkrKykgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0sIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyKSB7CisJCQlkYmcoIiVzICVkXG4iLCAic3VibWl0IHVyYiBlcnJvciA9IiwgZXJyKTsKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2ZyYW1lSW5mb11baV0gPSAwOworCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlCisJCQlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dW2ldID0gMTs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwaXVzYl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5pb2N0bCA9IHBpdXNiX2lvY3RsLAorCS5vcGVuID0gcGl1c2Jfb3BlbiwKKwkucmVsZWFzZSA9IHBpdXNiX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgcGl1c2JfY2xhc3MgPSB7CisJLm5hbWUgPSAidXNiL3JzcGl1c2IlZCIsCisJLmZvcHMgPSAmcGl1c2JfZm9wcywKKwkubWlub3JfYmFzZSA9IFBJVVNCX01JTk9SX0JBU0UsCit9OworCisvKioKKyAqCXBpdXNiX3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgcGl1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwlkZXZfZGJnKCZpbnRlcmZhY2UtPmRldiwgIiVzIC0gTG9va2luZyBmb3IgUEkgVVNCIEhhcmR3YXJlIiwgX19mdW5jX18pOworCisJcGR4ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9leHRlbnNpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAocGR4ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJa3JlZl9pbml0KCZwZHgtPmtyZWYpOworCXBkeC0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJcGR4LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBTZWUgaWYgdGhlIGRldmljZSBvZmZlcmVkIHVzIG1hdGNoZXMgd2hhdCB3ZSBjYW4gYWNjZXB0ICovCisJaWYgKChwZHgtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgIT0gVkVORE9SX0lEKQorCSAgICB8fCAoKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gUElYSVNfUElEKQorCQkmJiAocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBTVDEzM19QSUQpKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcGR4LT5pYW1hID0gcGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKworCWlmIChkZWJ1ZykgeworCQlpZiAocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBQSVhJU19QSUQpCisJCQlkYmcoIlBJVVNCOlBpeGlzIENhbWVyYSBGb3VuZCIpOworCQllbHNlCisJCQlkYmcoIlBJVVNCOlNUMTMzIFVTQiBDb250cm9sbGVyIEZvdW5kIik7CisJCWlmIChwZHgtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJZGJnKCJIaWdoc3BlZWQoVVNCMi4wKSBEZXZpY2UgQXR0YWNoZWQiKTsKKwkJZWxzZQorCQkJZGJnKCJMb3dzcGVlZCAoVVNCMS4xKSBEZXZpY2UgQXR0YWNoZWQiKTsKKworCQlkYmcoIk51bUVuZHBvaW50cyBpbiBDb25maWd1cmF0aW9uOiAlZCIsCisJCSAgICBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKGRlYnVnKSB7CisJCQlkYmcoIkVuZHBvaW50WyVkXS0+YkRlc2NyaXB0b3JUeXBlID0gJWQiLCBpLAorCQkJICAgIGVuZHBvaW50LT5iRGVzY3JpcHRvclR5cGUpOworCQkJZGJnKCJFbmRwb2ludFslZF0tPmJFbmRwb2ludEFkZHJlc3MgPSAweCUwMlgiLCBpLAorCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5iYm1BdHRyaWJ1dGVzID0gJWQiLCBpLAorCQkJICAgIGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMpOworCQkJZGJnKCJFbmRwb2ludFslZF0tPk1heFBhY2tldFNpemUgPSAlZFxuIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9CisJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkgICAgVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCQkJaWYgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKKwkJCQlwZHgtPmhFUFtpXSA9CisJCQkJICAgIHVzYl9yY3ZidWxrcGlwZShwZHgtPnVkZXYsCisJCQkJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQkJZWxzZQorCQkJCXBkeC0+aEVQW2ldID0KKwkJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKHBkeC0+dWRldiwKKwkJCQkJCSAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJCX0KKwl9CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHBkeCk7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZwaXVzYl9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQllcnIoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKwlwZHgtPnByZXNlbnQgPSAxOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXBkeC0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkYmcoIlBJIFVTQjIuMCBkZXZpY2Ugbm93IGF0dGFjaGVkIHRvIHBpdXNiLSVkIiwgcGR4LT5taW5vcik7CisJcmV0dXJuIDA7CisKKyAgICAgIGVycm9yOgorCWlmIChwZHgpCisJCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglwaXVzYl9kaXNjb25uZWN0CisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKgorICoJVGhpcyByb3V0aW5lIGd1YXJhbnRlZXMgdGhhdCB0aGUgZHJpdmVyIHdpbGwgbm90IHN1Ym1pdCBhbnkgbW9yZSB1cmJzCisgKglieSBjbGVhcmluZyBwZHgtPnVkZXYuICBJdCBpcyBhbHNvIHN1cHBvc2VkIHRvIHRlcm1pbmF0ZSBhbnkgY3VycmVudGx5CisgKglhY3RpdmUgdXJicy4gIFVuZm9ydHVuYXRlbHksIHVzYl9idWxrX21zZygpLCB1c2VkIGluIHBpdXNiX3JlYWQoKSwgZG9lcworICoJbm90IHByb3ZpZGUgYW55IHdheSB0byBkbyB0aGlzLiAgQnV0IGF0IGxlYXN0IHdlIGNhbiBjYW5jZWwgYW4gYWN0aXZlCisgKgl3cml0ZS4KKyAqLworc3RhdGljIHZvaWQgcGl1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHg7CisJaW50IG1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKwlsb2NrX2tlcm5lbCgpOworCXBkeCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZwaXVzYl9jbGFzcyk7CisJdW5sb2NrX2tlcm5lbCgpOworCS8qIHByZXZlbnQgZGV2aWNlIHJlYWQsIHdyaXRlIGFuZCBpb2N0bCAqLworCXBkeC0+cHJlc2VudCA9IDA7CisJa3JlZl9wdXQoJnBkeC0+a3JlZiwgcGl1c2JfZGVsZXRlKTsKKwlkYmcoIlBJIFVTQjIuMCBkZXZpY2UgIyVkIG5vdyBkaXNjb25uZWN0ZWRcbiIsIG1pbm9yKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBpdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzdWIiLAorCS5wcm9iZSA9IHBpdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gcGl1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBwaV9kZXZpY2VfdGFibGUsCit9OworCisvKioKKyAqCXBpdXNiX2luaXQKKyAqLworc3RhdGljIGludCBfX2luaXQgcGl1c2JfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmcGl1c2JfZHJpdmVyKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRQorCQkgICAgICAgIjogdXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6JXM6ICVzXG4iLCBEUklWRVJfREVTQywKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04pOworCXJldHVybiAwOworfQorCisvKioKKyAqCXBpdXNiX2V4aXQKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHBpdXNiX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmcGl1c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGl1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChwaXVzYl9leGl0KTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBlbmFibGVkIG9yIG5vdCIpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjZDJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX19SU1BJVVNCX0gKKyNkZWZpbmUgX19SU1BJVVNCX0gKKworI2RlZmluZSBQSVVTQl9NQUdJQwkJJ20nCisjZGVmaW5lIFBJVVNCX0lPQ1RMX0JBU0UJMTkyCisjZGVmaW5lIFBJVVNCX0dFVFZORENNRAkJX0lPUihQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDEsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1NFVFZORENNRAkJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDIsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1dSSVRFUElQRQkJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDMsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1JFQURQSVBFCQlfSU9SKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNCwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfU0VURlJBTUVTSVpFCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyA1LCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9XSEFUQ0FNRVJBCV9JTyhQSVVTQl9NQUdJQywgIFBJVVNCX0lPQ1RMX0JBU0UgKyA2KQorI2RlZmluZSBQSVVTQl9VU0VSQlVGRkVSCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyA3LCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9JU0hJR0hTUEVFRAlfSU8oUElVU0JfTUFHSUMsICBQSVVTQl9JT0NUTF9CQVNFICsgOCkKKyNkZWZpbmUgUElVU0JfVU5NQVBfVVNFUkJVRkZFUglfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgOSwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKworc3RydWN0IGlvY3RsX3N0cnVjdCB7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJdW5zaWduZWQgbG9uZyBudW1ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGRpcjsJLy8xPW91dDswPWluCisJaW50IGVuZHBvaW50OworCWludCBudW1GcmFtZXM7CisJdW5zaWduZWQgY2hhciAqcERhdGE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzOGYyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICAyODcwX21haW5fZGV2LmMKKworICAgIEFic3RyYWN0OgorICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorZXh0ZXJuIFVJTlQ4ICBNQ19DYXJkVXNlZFtdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKK2V4dGVybiBJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKKwkJCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3ltYm9sICYgTWFjcm8gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RMWQkJCQkoMTw8MCkJCS8vIGJpdCAwCisjZGVmaW5lIFJUMjg2MF9JTlRfVFhfRExZCQkJCSgxPDwxKQkJLy8gYml0IDEKKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkJLy8gYml0IDIKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUJCQkoMTw8MykJCS8vIGJpdCAzCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FCQkJKDE8PDQpCQkvLyBiaXQgNAorI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkJLy8gYml0IDUKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUJCQkoMTw8NikJCS8vIGJpdCA2CisjZGVmaW5lIFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORQkJKDE8PDcpCQkvLyBiaXQgNworI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkJLy8gYml0IDgKKworI2RlZmluZSBJTlRfUlgJCQlSVDI4NjBfSU5UX1JYX0RPTkUKKworI2RlZmluZSBJTlRfQUMwX0RMWQkJKFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9BQzFfRExZCQkoUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX0FDMl9ETFkJCShSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfQUMzX0RMWQkJKFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9IQ0NBX0RMWSAJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7CitzdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Cit2b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKK3N0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworI2VuZGlmIC8vIENPTkZJR19QTSAvLworI2VuZGlmCisKKworLy8KKy8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKKy8vCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KK3sKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCQkvL1JUMjg2MDIuNEcKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc5MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFZFTl9BV1RfUENJX1ZFTkRPUl9JRCwgVkVOX0FXVF9QQ0llX0RFVklDRV9JRCl9LAorICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2lmZGVmIE1PRFVMRV9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOworI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8KKy8vIE91ciBQQ0kgZHJpdmVyIHN0cnVjdHVyZQorLy8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydDI4NjBfZHJpdmVyID0KK3sKKyAgICBuYW1lOiAgICAgICAicnQyODYwIiwKKyAgICBpZF90YWJsZTogICBydDI4NjBfcGNpX3RibCwKKyAgICBwcm9iZTogICAgICBydDI4NjBfaW5pdF9vbmUsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MTIKKyAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCisjZWxzZQorICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdChydDI4NjBfcmVtb3ZlX29uZSksCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KKwlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKKwlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAorI2VuZGlmCisjZW5kaWYKK307CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZmRlZiBDT05GSUdfUE0KKworVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBjbGVhciBQUyBwYWNrZXRzCisJLy8gY2xlYXIgVHhTdyBwYWNrZXRzCit9CisKK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKKwlJTlQzMiByZXR2YWw7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCisJCXsKKwkJCS8vIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24KKworCQkJLy8gc3RvcCBpbnRlcmZhY2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCQkJLy8gbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJCS8vIG1hcmsgaGFsdCBmbGFnCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCisJCQlydDI4eHhfY2xvc2UoKFBORVRfREVWKW5ldF9kZXYpOworCisJCQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCQl9CisJfQorCisJLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKKwkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKKwkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAorCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7CisJLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKKwlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCisJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworCUlOVDMyIHJldHZhbDsKKworCisJLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKKwkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCisJLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKKwkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCisJLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQorCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKKwkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCisJLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQorCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKKwkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQorCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQorCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCisJLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgorCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwl7CisJCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXJldHVybiAwOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisKKwlpZiAobmV0X2RldiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOworCX0KKwllbHNlCisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAocEFkICE9IE5VTEwpCisJeworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCisJCXsKKwkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAorCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKKworCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQorCQkJeworCQkJCS8vIG9wZW4gZmFpbAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKKwkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CisKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIENPTkZJR19QTSAvLworI2VuZGlmCisKKworc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKKyNlbHNlCisgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnQyODYwX2RyaXZlcik7CisjZW5kaWYKK30KKworCisvLworLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KKy8vCitzdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCit7CisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7CisKKworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lICgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAorICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKK3sKKyAgICBJTlQgcmM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9pbml0X29uZVxuIikpOworCisgICAgLy8gd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZQorICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAocGNpX2RldikpCisgICAgeworICAgICAgICByYyA9IC1FSU87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gcnQyODYwX3Byb2JlKHBjaV9kZXYsIGVudCk7CisgICAgfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfaW5pdF9vbmVcbiIpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKAorICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgKnBjaV9kZXYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKyAgICBSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVtb3ZlX29uZVxuIikpOworCisJaWYgKHBBZCAhPSBOVUxMKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKChwQWQtPk1DX1Jvd0lEID49IDApICYmIChwQWQtPk1DX1Jvd0lEIDw9IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQlNQ19DYXJkVXNlZFtwQWQtPk1DX1Jvd0lEXSA9IDA7IC8vIG5vdCBjbGVhciBNQUMgYWRkcmVzcworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisKKworCisJCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisKKwkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcworCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOworCisJCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCisJCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbgorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKworCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCisJCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7CisKKwkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCX0KKworCS8vIEZyZWUgcHJlLWFsbG9jYXRlZCBuZXRfZGV2aWNlIG1lbW9yeQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKyNlbHNlCisJa2ZyZWUobmV0X2Rldik7CisjZW5kaWYKK30KKworLy8KKy8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorLy8KK3N0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAorICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCisgICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KQoreworCVBSVE1QX0FEQVBURVIgcEFkOworICAgIElOVCBydiA9IDA7CisKKyAgICBydiA9IChJTlQpcnQyOHh4X3Byb2JlKCh2b2lkICopcGNpX2RldiwgKHZvaWQgKillbnQsIDAsICZwQWQpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSk7CisJcmV0dXJuIHJ2OworfQorCisKK3ZvaWQgaW5pdF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgbWdtdF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIGFjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIGFjMl9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzaywgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworfQorCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7Cit9CisKKworc3RhdGljIHZvaWQgcnQyODYwX2ludF9lbmFibGUoUFJUTVBfQURBUFRFUiBwQWQsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXUzMiByZWdWYWx1ZTsKKworCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOworCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDE6ZW5hYmxlCisKKwlpZiAocmVnVmFsdWUgIT0gMCkKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKKworc3RhdGljIHZvaWQgcnQyODYwX2ludF9kaXNhYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKKwlyZWdWYWx1ZSA9IAlwQWQtPmludF9lbmFibGVfcmVnICYgfihwQWQtPmludF9kaXNhYmxlX21hc2spOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMDogZGlzYWJsZQorCisJaWYgKHJlZ1ZhbHVlID09IDApCisJeworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLk1nbXREbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfTUdNVF9ETFk7CisKKwlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7CisKKwkvLyBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkKKwkvLyBidWcgcmVwb3J0IG91dHB1dAorCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9NR01UX0RMWSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisJQk9PTEVBTgliUmVzY2hlZHVsZSA9IDA7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBBZC0+aW50X3BlbmRpbmcgJj0gfihJTlRfUlgpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCWJSZXNjaGVkdWxlID0gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgMCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9SWCB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBBZC0+aW50X3BlbmRpbmcgJj0gfihGaWZvU3RhRnVsbEludCk7CisJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKKwkgKi8KKwlpZiAocEFkLT5pbnRfcGVuZGluZyAmIEZpZm9TdGFGdWxsSW50KQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KKworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkhjY2FEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfSENDQV9ETFk7CisKKwlSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfSENDQV9ETFkpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMwRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMF9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMF9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCisKK2ludCBwcmludF9pbnRfY291bnQ7CisKK0lSUV9IQU5ETEVfVFlQRQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQorI2Vsc2UKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCS8qIE5vdGUgMDMzMTIwMDg6IHdlIGNhbiBub3QgcmV0dXJuIGhlcmUgYmVmb3JlCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CisJCU9yIGtlcm5lbCB3aWxsIHBhbmljIGFmdGVyIGlmY29uZmlnIHJhMCBkb3duIHNvbWV0aW1lcyAqLworCisKKwkvLworCS8vIEluaXRhbCB0aGUgSW50ZXJydXB0IHNvdXJjZS4KKwkvLworCUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7CisvLwlNY3VJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOworCisJLy8KKwkvLyBHZXQgdGhlIGludGVycnVwdCBzb3VyY2VzICYgc2F2ZWQgdG8gbG9jYWwgdmFyaWFibGUKKwkvLworCS8vUlRNUF9JT19SRUFEMzIocEFkLCB3aGVyZSwgJk1jdUludFNvdXJjZS53b3JkKTsKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsICwgTWN1SW50U291cmNlLndvcmQpOworCisJLy8KKwkvLyBGbGFnIGZPUF9TVEFUVVNfRE9aRSBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsYXNlIG1lYW5zIEFTSUNLIFdha2VVcAorCS8vIEFuZCBhdCB0aGUgc2FtZSB0aW1lLCBjbG9jayBtYXliZSB0dXJuZWQgb2ZmIHRoYXQgc2F5IHRoZXJlIGlzIG5vIERNQSBzZXJ2aWNlLgorCS8vIHdoZW4gQVNJQyBnZXQgdG8gc2xlZXAuCisJLy8gVG8gcHJldmVudCBzeXN0ZW0gaGFuZyBvbiBwb3dlciBzYXZpbmcuCisJLy8gV2UgbmVlZCB0byBjaGVjayBpdCBiZWZvcmUgaGFuZGxlIHRoZSBJTlRfU09VUkNFX0NTUiwgQVNJQyBtdXN0IGJlIHdha2UgdXAuCisJLy8KKwkvLyBSVDI2NjEgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2Fubm90IGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisJLy8gUlQyODYwID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLgorCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOyAvLyB3cml0ZSAxIHRvIGNsZWFyCisJfQorCisJLy8gRG8gbm90aGluZyBpZiBSZXNldCBpbiBwcm9ncmVzcworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwl7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOworI2Vsc2UKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisJfQorCisJLy8KKwkvLyBIYW5kbGUgaW50ZXJydXB0LCB3YWxrIHRocm91Z2ggYWxsIGJpdHMKKwkvLyBTaG91bGQgc3RhcnQgZnJvbSBoaWdoZXN0IHByaW9yaXR5IGludGVycnVwdAorCS8vIFRoZSBwcmlvcml0eSBjYW4gYmUgYWRqdXN0IGJ5IGFsdGVyaW5nIHByb2Nlc3NpbmcgaWYgc3RhdGVtZW50CisJLy8KKworICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJLy8gSWYgcmVxdWlyZWQgc3BpbmxvY2ssIGVhY2ggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBoYXMgdG8gYWNxdWlyZQorCS8vIGFuZCByZWxlYXNlIGl0c2VsZi4KKwkvLworCisJLy8gRG8gbm90aGluZyBpZiBOSUMgZG9lc24ndCBleGlzdAorCWlmIChJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmKQorCXsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgICAgICByZXR1cm4gIElSUV9IQU5ETEVEOworI2Vsc2UKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVHhDb2hlcmVudCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlR4Q29oZXJlbnQ8PDxcbiIpKTsKKwkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBSeENvaGVyZW50KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KQorCXsKKyNpZiAxCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgRmlmb1N0YUZ1bGxJbnQpID09IDApCisJCXsKKwkJCS8qIG1hc2sgRmlmb1N0YUZ1bGxJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBGaWZvU3RhRnVsbEludDsKKyNlbHNlCisJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX01HTVRfRExZKQorCXsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09MCApCisJCXsKKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZIDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfUlgpCisJeworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkKKwkJeworCQkJLyogbWFzayBSeElOVCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX1JYKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfUlg7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0hDQ0FfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9IQ0NBX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0hDQ0FfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzNfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzNfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDM19ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDM19ETFk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMl9ETFkpCisJeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkKKwl7CisKKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMxX0RMWTsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzFfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMV9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCQl9CisKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMwX0RMWSkKKwl7CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMF9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMwX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzBfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisgICAgaWYgKEludFNvdXJjZS53b3JkICYgUHJlVEJUVEludCkKKwl7CisJCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkKKwl7CisJCVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoSW50U291cmNlLndvcmQgJiBBdXRvV2FrZXVwSW50KQorCQkJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbmRpZgorCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNoZWNrIG9rCisJRkFMU0UJCQkJQ2hlY2sgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCisJSU4gdm9pZCAqX2Rldl9wKQoreworCS8qIGFsd2F5cyBUUlVFICovCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorICAgICpuZXRfZGV2CQkJUG9pbnQgdG8gdGhlIG5ldCBkZXZpY2UKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJSW5pdCBvaworCUZBTFNFCQkJCUluaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7CisgICAgY29uc3QgQ0hBUgkqcHJpbnRfbmFtZTsKKyAgICBVTE9ORwljc3JfYWRkcjsKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIHByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQyODYwIjsKKyNlbHNlCisgICAgcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfZGV2LT5zbG90X25hbWUgOiAicnQyODYwIjsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCW5ldF9kZXYtPmJhc2VfYWRkciA9IDA7CisJbmV0X2Rldi0+aXJxID0gMDsKKworICAgIGlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKQorICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisKKyAgICAvLyBpbnRlcnJ1cHQgSVJRIG51bWJlcgorICAgIG5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKKworICAgIC8vIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyCisgICAgY3NyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisKKyAgICBpZiAoIWNzcl9hZGRyKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJKCJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglbFggQCAweCVsWFxuIiwKKwkJCQlwcmludF9uYW1lLCAoVUxPTkcpcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSwKKwkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7CisgICAgICAgIGdvdG8gZXJyX291dF9mcmVlX3JlczsKKyAgICB9CisKKyAgICAvLyBTYXZlIENTUiB2aXJ0dWFsIGFkZHJlc3MgYW5kIGlycSB0byBkZXZpY2Ugc3RydWN0dXJlCisgICAgbmV0X2Rldi0+YmFzZV9hZGRyID0gY3NyX2FkZHI7CisgICAgcEFkLT5DU1JCYXNlQWRkcmVzcyA9IChQVUNIQVIpbmV0X2Rldi0+YmFzZV9hZGRyOworCisgICAgLy8gU2V0IERNQSBtYXN0ZXIKKyAgICBwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworICAgIG5ldF9kZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBhdCAweCVseCwgVkEgMHglbHgsIElSUSAlZC4gXG4iLAorICAgICAgICAJbmV0X2Rldi0+bmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCShVTE9ORyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7CisJcmV0dXJuIFRSVUU7CisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlcnJfb3V0X2ZyZWVfcmVzOgorICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCS8qIGZyZWUgbmV0ZGV2IGluIGNhbGxlciwgbm90IGhlcmUgKi8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDb25maWcgb2sKKwlGQUxTRQkJCQlDb25maWcgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWFyZ2MpCit7CisJLyogbm8gdXNlICovCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBEaXNhYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOworCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCWludCBpID0gMDsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKKwlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gSU5UCQkJCWFwaWR4LAorCUlOIFVMT05HCQkJRnJhbWVMZW4sCisJSU4gVUxPTkcJCQlVcGRhdGVQb3MpCit7CisJVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7CisJVUNIQVIgIAkJCSpwdHIsICpwdHJfdXBkYXRlLCAqcHRyX2NhcGluZm87CisJVUlOVCAgCQkJaTsKKwlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOworCVVDSEFSCQkJYmNuX2lkeCA9IDA7CisKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiQmNuUmVxID09IEZBTFNFKQorCXsKKwkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KKwkJLyogY2xlYXIgYWxsIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCX0KKwllbHNlCisJeworCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOworI2VuZGlmCisJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCQl7CisJCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKKwkJCXB0cl9jYXBpbmZvICsrOworCQl9CisKKwkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQorCQl7CisJCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7CisJCQkJcHRyX3VwZGF0ZSArKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpCit7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgcnQyODYwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisJICAgIC8vIHN0b3AgaW50ZXJmYWNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCisJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJLy8gbWFyayBoYWx0IGZsYWcKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKKwkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKwkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwl9CisgICAgcmV0dXJuOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQoreworCVBSVE1QX0FEQVBURVIgcEFkOworCVBPU19DT09LSUUgcE9iajsKKworCS8qCisJCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCQk+IEZvciBUeCBBbGxvYzoKKwkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAorCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAJCVF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJIAk+IEZvciBSeCBBbGxvYzoKKwkgCQlzZF9pZHggPSAtMQorCSovCisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUiloYW5kbGU7CisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKQorCXsKKwkJUFRYX0JMSwkJcFR4QmxrOworCQlwVHhCbGsgPSAoUFRYX0JMSylwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgZGlyZWN0aW9uKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKK30KKwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcEFkPShQUlRNUF9BREFQVEVSKWhhbmRsZTsKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ0ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIFJUMjg2MAorCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjIyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKK29iai0kKENPTkZJR19SVDI4NjApCSs9IHJ0Mjg2MHN0YS5vCisKKyMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCitFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EREJHCitFWFRSQV9DRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisKK3J0Mjg2MHN0YS1vYmpzIDo9CVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCisJMjg2MF9tYWluX2Rldi5vCQlcCisJY29tbW9uL2NtbV9kYXRhXzI4NjAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzBiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KQEAgLTAsMCArMSwxNyBAQAorSSdtIGhlc2l0YW50IHRvIGFkZCBhIFRPRE8gZmlsZSBoZXJlLCBhcyB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVycyB3b3VsZAorcmVhbGx5IGhhdmUgcGVvcGxlIGhlbHAgdGhlbSBvdXQgb24gdGhlICJjbGVhbiIgcnQyODYwIGRyaXZlciB0aGF0IGNhbgorYmUgZm91bmQgYXQgdGhlIHJ0Mjg2MC5zZi5uZXQgc2l0ZS4KKworQnV0LCBpZiB5b3Ugd2lzaCB0byBjbGVhbiB1cCB0aGlzIGRyaXZlciBpbnN0ZWFkLCBoZXJlJ3MgYSBzaG9ydCBsaXN0IG9mCit0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gZ2V0IGl0IGludG8gYSBtb3JlIG1lcmdhYmxlIHNoYXBlOgorCitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgZG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcwora2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkgd2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FJUk9ORVRfSF9fCisjZGVmaW5lCV9fQUlST05FVF9IX18KKworLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCisjZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAorI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQorI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKKyNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCisjZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAorCisvLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKKworLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05CisjZGVmaW5lCVBIWV9GSAkJCQkJCQkxCisjZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgorI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMworI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKKyNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKKyNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2CisKKy8vIFJQSSB0YWJsZSBpbiBkQm0KKyNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3CisjZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgorI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKKyNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCisjZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NworI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKKyNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3CisjZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucworI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAorCVVTSE9SVAlEdXJhdGlvbjsKK30JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOworCisvLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0CisvLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCisvLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCit0eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQorCVVDSEFSCVJ4UG93ZXI7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUGFyZW50VFNGWzRdOworCVVDSEFSCVRhcmdldFRTRls4XTsKKwlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7CisJVVNIT1JUCUNhcGFiaWxpdHlJbmZvOworfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7CisKKy8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCit0eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglUQTsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglSU1NJOworCVVDSEFSCUNvdW50OworfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOworCisjcHJhZ21hIHBhY2soMSkKKy8vIENoYW5uZWwgTG9hZCBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglDQ0FCdXN5OworfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7CisjcHJhZ21hIHBhY2soKQorCisvLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCURlbnNpdHlbOF07Cit9CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOworCisvLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAordHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7CisJVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQorCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCisJVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCit9CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7CisKKy8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKKwlVQ0hBUglSc3ZkOjQ7CisJVUNIQVIJUmVwb3J0OjE7CisJVUNIQVIJTm90VXNlZDoxOworCVVDSEFSCUVuYWJsZToxOworCVVDSEFSCVBhcmFsbGVsOjE7Cit9CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7CisKKy8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7CisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7CisJVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCisJVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQorCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQorCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCisJVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcworCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQorfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCisJVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQorCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKK30JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCit9CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOworCisvLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KK3R5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7CisJTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKKwlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Cit9CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOworCisvLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAordHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKKwkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCisJCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKKwkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQorCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0CisJCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZworCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKKwkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOworCisjZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmRiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDA5LTA2LTIwMDIgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAxMi0yMi0yMDA0ICAgIG1vZGlmaWVkIGZvciBSVDI1NjEvMjY2MS4gbWVyZ2Ugd2l0aCBTVEEgZHJpdmVyCisqLworI2lmbmRlZiBfX0FQX0hfXworI2RlZmluZSBfX0FQX0hfXworCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBhcF9kYXRhLmMKKworQk9PTEVBTiBBUEJyaWRnZVRvV2lyZWxlc3NTdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOICBVTE9ORyAgICAgICAgICAgZnJvbXdkc2lkeCk7CisKK0JPT0xFQU4gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECUFQU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOworCitORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworCitORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOCVVDSEFSCQkJV2NpZCk7CisKK0JPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBBZGRyLAorCUlOCVVTSE9SVAkJCUFpZCwKKyAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOworCitWT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7CisKK1ZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKKworLy8gYXBfYXNzb2MuYworCitWT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNYnNzS2lja091dFN0YXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZUtpY2tPdXRTdGEoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBTdGFBZGRyLAorCUlOIFVDSEFSIFdjaWQsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisKK1VTSE9SVCBBUEJ1aWxkQXNzb2NpYXRpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisgICAgSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorICAgIElOIFVDSEFSICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorICAgIElOIFVDSEFSICAqUlNOLAorICAgIElOIFVDSEFSICAqcFJTTkxlbiwKKyAgICBJTiBCT09MRUFOIGJXbW1DYXBhYmxlLAorICAgIElOIFVMT05HICBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgSU4gRVhUX0NBUF9JTkZPX0VMRU1FTlQgRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCSBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVTSE9SVCAqcEFpZCk7CisKKy8vIGFwX2F1dGguYworCit2b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKy8vIGFwX2F1dGhyc3AuYworCitWT0lEIEFQQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQUGVlckF1dGhBdEF1dGhSc3BJZGxlQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckRlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gIFVTSE9SVCBBbGcsCisgICAgSU4gIFVTSE9SVCBTZXEsCisgICAgSU4gIFVTSE9SVCBTdGF0dXNDb2RlKTsKKworLy8gYXBfY29ubmVjdC5jCisKK0JPT0xFQU4gQmVhY29uVHJhbnNtaXRSZXF1aXJlZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKworLy8gYXBfc3luYy5jCisKK1ZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuQ25jbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFwU2l0ZVN1cnZleSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgU3VwcG9ydFJhdGUoCisJSU4gUFVDSEFSIFN1cFJhdGUsCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBQVUNIQVIgRXh0UmF0ZSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCU9VVCBQVUNIQVIgKlJhdGVzLAorCU9VVCBQVUNIQVIgUmF0ZXNMZW4sCisJT1VUIFBVQ0hBUiBwTWF4U3VwcG9ydFJhdGUpOworCisKK0JPT0xFQU4gQXBTY2FuUnVubmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEFQT3ZlcmxhcHBpbmdCU1NTY2FuKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGFwX3dwYS5jCisKK1ZPSUQgQVBXcGFTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCisvLyBhcF9tbG1lLmMKKworVk9JRCBBUE1sbWVQZXJpb2RpY0V4ZWMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgQVBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgQVBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gQVBNc2dUeXBlU3Vic3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisgICAgT1VUIElOVCAqTWFjaGluZSwKKyAgICBPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTgkJCWJQaWdneUJhY2spOworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLyBhcC5jCisKK1ZPSUQgQVBTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBDaGFubmVsKTsKKworTkRJU19TVEFUVVMgQVBJbml0aWFsaXplKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFNodXRkb3duKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworVk9JRCBBUFN0YXJ0VXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBDbGVhbnVwUHNRdWV1ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFFVRVVFX0hFQURFUiAgIHBRdWV1ZSk7CisKK1ZPSUQgTWFjVGFibGVSZXNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBNYWNUYWJsZU1haW50ZW5hbmNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUlOVDMyIE1hY1RhYmxlQXNzb2NTdGFOdW1HZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKkFQU3NQc0lucXVpcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKyAgICBPVVQgU1NUICAgICAgICAgICAgICpTc3QsCisgICAgT1VUIFVTSE9SVCAgICAgICAgICAqQWlkLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlBzTW9kZSwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpSYXRlKTsKKworQk9PTEVBTiBBUFBzSW5kaWNhdGUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUHNtKTsKKworVk9JRCBBcExvZ0V2ZW50KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVVNIT1JUICAgICAgICAgICBFdmVudCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQVBVcGRhdGVPcGVyYXRpb25Nb2RlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBUFVwZGF0ZUNhcGFiaWxpdHlBbmRFcnBJZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gQXBDaGVja0FjY2Vzc0NvbnRyb2xMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBVcGRhdGVBY2Nlc3NDb250cm9sTGlzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcEVucXVldWVOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIFBJRCwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4LAorICAgIElOIEJPT0xFQU4gICAgICAgYlFvc051bGwsCisgICAgSU4gQk9PTEVBTiAgICAgICBiRU9TUCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIE9sZFVQKTsKKworVk9JRCBBcFNlbmRGcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFZPSUQgICAgICAgICAgIHBCdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW5ndGgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQSUQpOworCitWT0lEIEFwRW5xdWV1ZUFja0ZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCk7CisKK1VDSEFSIEFQQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBPcHRpbWFsKTsKKworLy8gYXBfc2FuaXR5LmMKKworCitCT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGlzUmVzc29jLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgY2hhciAqU3NpZCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKlJTTiwKKyAgICBPVVQgVUNIQVIgKnBSU05MZW4sCisgICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisjaWZkZWYgV0lOX05ESVMKK05ESVNfU1RBVFVTIEFQUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKyAgICBJTiAgTkRJU19PSUQgICAgT2lkLAorICAgIElOICBQVk9JRCAgICAgICBwSW5mb3JtYXRpb25CdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNXcml0dGVuLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNOZWVkZWQpOworCitORElTX1NUQVRVUyBBUFNldEluZm9ybWF0aW9uKAorICAgIElOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorICAgIElOICBORElTX09JRCAgICBPaWQsCisgICAgSU4gIFBWT0lEICAgICAgIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKyAgICBJTiAgVUxPTkcgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc1JlYWQsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc05lZWRlZCk7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYgIC8vIF9fQVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljaGxpc3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAorKi8KKworI2lmbmRlZiBfX0NITElTVF9IX18KKyNkZWZpbmUgX19DSExJU1RfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX2RlZi5oIgorCisKKyNkZWZpbmUgT0RPUgkJCTAKKyNkZWZpbmUgSURPUgkJCTEKKyNkZWZpbmUgQk9USAkJCTIKKworI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAorI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQorI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7CisJVUNIQVIgRmlyc3RDaGFubmVsOworCVVDSEFSIE51bU9mQ2g7CisJQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KKwlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKKwlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KK30gQ0hfREVTUCwgKlBDSF9ERVNQOworCit0eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKKwlVQ0hBUiBDb3VudFJlZ1szXTsKKwlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2CisJQ0hfREVTUCBDaERlc3BbMTBdOworfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOworCitzdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQoreworCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKKwkJCSJBRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFyZ2VudGluYQorCQkJIkFSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFydWJhCisJCQkiQVciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmFsaWEKKwkJCSJBVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyaWEKKwkJCSJBVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhaGFtYXMKKwkJCSJCUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhcmJhZG9zCisJCQkiQkIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZXJtdWRhCisJCQkiQk0iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCcmF6aWwKKwkJCSJCUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZWxnaXVtCisJCQkiQkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJ1bGdhcmlhCisJCQkiQkciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2FuYWRhCisJCQkiQ0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYXltYW4gSXNMYW5kcworCQkJIktZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbGUKKwkJCSJDTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaW5hCisJCQkiQ04iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvbG9tYmlhCisJCQkiQ08iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29zdGEgUmljYQorCQkJIkNSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3lwcnVzCisJCQkiQ1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDemVjaF9SZXB1YmxpYworCQkJIkNaIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZW5tYXJrCisJCQkiREsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKKwkJCSJETyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCisJCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRXF1YWRvcgorCQkJIkVDIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVsIFNhbHZhZG9yCisJCQkiU1YiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZpbmxhbmQKKwkJCSJGSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRnJhbmNlCisJCQkiRlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR2VybWFueQorCQkJIkRFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHcmVlY2UKKwkJCSJHUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhbQorCQkJIkdVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhdGVtYWxhCisJCQkiR1QiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSGFpdGkKKwkJCSJIVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25kdXJhcworCQkJIkhOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmcgS29uZworCQkJIkhLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEh1bmdhcnkKKwkJCSJIVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJY2VsYW5kCisJCQkiSVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZGlhCisJCQkiSU4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kb25lc2lhCisJCQkiSUQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXJlbGFuZAorCQkJIklFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXNyYWVsCisJCQkiSUwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MworCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45CisJCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEl0YWx5CisJCQkiSVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKYXBhbgorCQkJIkpQIiwKKwkJCUpBUCwKKwkJCXsKKwkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAorCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKb3JkYW4KKwkJCSJKTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExhdHZpYQorCQkJIkxWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGllY2h0ZW5zdGVpbgorCQkJIkxJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpdGh1YW5pYQorCQkJIkxUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTHV4ZW1idXJnCisJCQkiTFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWxheXNpYQorCQkJIk1ZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsdGEKKwkJCSJNVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hcm9jY28KKwkJCSJNQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNZXhpY28KKwkJCSJNWCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV0aGVybGFuZHMKKwkJCSJOTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldyBaZWFsYW5kCisJCQkiTloiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5vcndheQorCQkJIk5PIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUGVydQorCQkJIlBFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvcnR1Z2FsCisJCQkiUFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvbGFuZAorCQkJIlBMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSb21hbmlhCisJCQkiUk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJ1c3NpYQorCQkJIlJVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNhdWRpIEFyYWJpYQorCQkJIlNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybworCQkJIkNTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTaW5nYXBvcmUKKwkJCSJTRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92YWtpYQorCQkJIlNLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92ZW5pYQorCQkJIlNJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEFmcmljYQorCQkJIlpBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBLb3JlYQorCQkJIktSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3BhaW4KKwkJCSJFUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dlZGVuCisJCQkiU0UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3aXR6ZXJsYW5kCisJCQkiQ0giLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUYWl3YW4KKwkJCSJUVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVHVya2V5CisJCQkiVFIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVLCisJCQkiR0IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVrcmFpbmUKKwkJCSJVQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKKwkJCSJBRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX1N0YXRlcworCQkJIlVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFZlbmV6dWVsYQorCQkJIlZFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlZmF1bHQKKwkJCSIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCit9OworCitzdGF0aWMgaW5saW5lIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCisJSU4gUFVDSEFSIENudHJ5Q29kZSkKK3sKKwlJTlQgbG9vcCA9IDA7CisJUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCisJeworCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQorCQl7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAorCUlOIFVDSEFSIFBoeU1vZGUsCisJT1VUIFBVQ0hBUiBwQ2hUeXBlKQoreworCXN3aXRjaChQaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBVQ0hBUiBGaWxsQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9ERVNQIHBDaERlc3AsCisJSU4gVUNIQVIgT2Zmc2V0LAorCUlOIFVDSEFSIGluY3JlbWVudCkKK3sKKwlJTlQgaSwgaiwgbDsKKwlVQ0hBUiBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQorCXsKKwkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKKwkJeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwkJCWNvbnRpbnVlOworCisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKKwlJTiBVQ0hBUiBHZW9ncmFwaHkpCit7CisJSU5UIGk7CisJVUNIQVIgb2Zmc2V0ID0gMDsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKwlVQ0hBUiBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCisgICAgICAgIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworICAgICAgICB9CisJfQorfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDSF9SRUdJT04gcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEJ1ZiwKKwlPVVQJUFVMT05HIHBCdWZMZW4pCit7CisJSU5UIGk7CisJVUxPTkcgVG1wTGVuOworCVBDSF9SRUdJT04gcENoUmVnaW9uOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQorCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIFVDSEFSIERpcmVjdGlvbikKK3sKKwlDSEFSIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07CisJVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQorCXsKKwkJaWYgKENoYW5uZWwgPiAxNCkKKwkJeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKKwkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKKwkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlVQ0hBUiBFeHRDaDsKKwkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfSB3aGlsZShGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCisJCQl9CisjaWYgMAorCQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCisJCQl7CisJCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQkJaWYgKENoYW5uZWwgPD0gNCkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChDaGFubmVsID49IDgpCisJCQkJCXsKKwkJCQkJCWlmICgoQ2hhbm5lbE51bSAtIENoYW5uZWwpIDwgNCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCisJCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCQlpZiAoQ2hhbm5lbCA8PSA1KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA9PSA2KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDcpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCQlpZiAoQ2hhbm5lbCA8PSA4KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSAxMCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fU2V0Q2VuQ2goCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK3N0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KKyNlbmRpZiAvLyBfX0NITElTVF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJMjg2MF9ydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOworCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKKwlQVk9JRAkJCVJpbmdCYXNlVmE7CisJSU5UCQkJCWluZGV4LCBudW07CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVBSVE1QX0RNQUJVRglwRG1hQnVmOworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisJZG8KKwl7CisJCS8vCisJCS8vIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4KKwkJLy8gQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudAorCQkvLyBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuCisJCS8vCisJCWZvciAobnVtPTA7IG51bTxOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJCXsKKwkJCVVMT05HICBCdWZCYXNlUGFIaWdoOworCQkJVUxPTkcgIEJ1ZkJhc2VQYUxvdzsKKwkJCVBWT0lEICBCdWZCYXNlVmE7CisKKwkJCS8vCisJCQkvLyBBbGxvY2F0ZSBUeCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgKDUgVFggcmluZ3MgPSA0IEFDcyArIDEgSENDQSkKKwkJCS8vCisJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcKKwkJCS8vCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlCdWZCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSAgICAgPSBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gSW5pdGlhbGl6ZSBUeCBSaW5nIERlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkJLy8KKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbbnVtXTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJCXsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCQkvLyBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLy8gU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFMb3cpOworCisJCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcworCQkJCXBUeEQtPkRNQURPTkUgPSAxOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKKworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzCisJCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQkJQnVmQmFzZVZhID0gKFBVQ0hBUikgQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLCBpbmRleCkpOworCQl9CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKKwkJLy8KKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCQkJcEFkLAorCQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8vCisJCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKKwkJLy8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUdNVF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJLy8gSW5pdCBNR01UIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAorCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwVHhELT5ETUFET05FID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZQorCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOworCisJCS8vCisJCS8vIEFsbG9jYXRlIFJYIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlcgorCQkvLworCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplID0gUlhfUklOR19TSVpFICogUlhEX1NJWkU7CisJCVJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJCQlwQWQsCisJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOworCisKKwkJcHJpbnRrKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7CisKKwkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgorCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLworCQkvLyBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkvLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCS8vIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gUlhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFJYRF9TSVpFOworCisJCQkvLyBTZXR1cCBSeCBhc3NvY2lhdGVkIEJ1ZmZlciBzaXplICYgYWxsb2NhdGUgc2hhcmUgbWVtb3J5CisJCQlwRG1hQnVmID0gJnBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1ZjsKKwkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7CisJCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCQkJCXBBZCwKKwkJCQlwRG1hQnVmLT5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJJnBEbWFCdWYtPkFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLy8gRXJyb3IgaGFuZGxpbmcKKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpCisJCQl7CisJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+U0RQMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOworCQkJcFJ4RC0+RERPTkUgPSAwOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZW5kaWYKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCX0Jd2hpbGUgKEZBTFNFKTsKKworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KKwkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKKwkJCXBBZC0+QWRhcHRlckhhbmRsZSwKKwkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAorCQkJMSwKKwkJCUVycm9yVmFsdWUpOworCX0KKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisJaW50IGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisJLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKworCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCAgICAgICA9IDA7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJpbmdDbGVhblVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmluZ1R5cGUpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVBRVUVVRV9FTlRSWQlwRW50cnk7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJaW50CQkJCWk7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBSaW5nQ2xlYW5VcChSaW5nSWR4PSVkLCBQZW5kaW5nLU5ESVM9JWxkKVxuIiwgUmluZ1R5cGUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOworCXN3aXRjaCAoUmluZ1R5cGUpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUmluZ1R5cGVdOworCisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIC8vIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZworCQkJeworCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCX0KKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAorCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQorCQkJeworCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKKwkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0CisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisKKwkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfUlg6CisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkJCXBSeEQtPkRET05FID0gMCA7CisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKwkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCkKK3sKKwlQUENJX0RFViBwY2lfZGV2OworCWRtYV9hZGRyX3QJKnBoeV9hZGRyOworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7CisKKwlwY2lfZGV2ID0gcE9iai0+cGNpX2RldjsKKwlwaHlfYWRkciA9ICZwT2JqLT5wQWRfcGE7CisKKwkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOworCisJaWYgKCpwcEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfRnJlZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCisJSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIGNvbW1vbiBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICovCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCit7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOworfQorCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJaW50IGluZGV4LCBudW0gLCBqOworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKwlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisJdW5zaWduZWQgaW50ICBJcnFGbGFnczsKKworCVBPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAorCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKwkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKKwkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCVBRVUVVRV9IRUFERVIgICBwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQorCQl7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvLyBGcmVlIFR4IFJpbmcgUGFja2V0CisJZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQorCXsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQorCQl7CisJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCX0KKwl9CisKKwlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCisJeworCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQorCQl7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBPYmotPnBjaV9kZXYsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCX0KKwlOZGlzWmVyb01lbW9yeShwQWQtPlJ4UmluZy5DZWxsLCBSWF9SSU5HX1NJWkUgKiBzaXplb2YoUlRNUF9ETUFDQikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKQorICAgIHsKKyAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworICAgIH0KKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKKworCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCXsKKwkJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJeworICAgIAlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkKKwkgICAgeworCSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCSAgICB9CisJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7CisKKyAgICAJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCisJICAgIHsKKwkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkgICAgfQorCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICogTm90ZXM6CisgKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5CisgKi8KK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBORElTX1BBQ0tFVCBwa3Q7CisKKwlwa3QgPSBSVFBLVF9UT19PU1BLVChERVZfQUxMT0NfU0tCKExlbmd0aCkpOworCisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KSB7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocGt0LCBQS1RTUkNfTkRJUyk7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgUlRQS1RfVE9fT1NQS1QocGt0KS0+ZGF0YTsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IChORElTX1BIWVNJQ0FMX0FERFJFU1MpIE5VTEw7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitWT0lEIEludmFsaWRfUmVtYWluaW5nX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkgVUxPTkcgVmlydHVhbEFkZHJlc3MpCit7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzczsKKworCVBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKHZvaWQgKikoVmlydHVhbEFkZHJlc3MrMTYwMCksIFJYX0JVRkZFUl9OT1JNU0laRS0xNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCit7CisJUFJYRF9TVFJVQwkJCQlwUnhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOworCVJYRF9TVFJVQwkJCQlSeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7CisJUFZPSUQJCQkJCUFsbG9jVmE7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7CisJQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKKwl7CisJCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCisJCXsKKwkJCS8vIG5vIG1vcmUgcnggcGFja2V0cworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8vIGdldCByeCBwZW5kaW5nIGNvdW50CisJCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQorCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKKwlSeEQgPSAqcERlc3RSeEQ7CisJcFJ4RCA9ICZSeEQ7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZWxzZQorCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCisJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkKKwl7CisJCSpwUnhQZW5kaW5nID0gMDsKKwkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQorCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCisJTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKKworCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKworCWlmIChwTmV3UGFja2V0KQorCXsKKwkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgorCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCisJCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKKworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0KKwllbHNlCisJeworCQkvL3ByaW50aygiTm8gUnggQnVmZmVyXG4iKTsKKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8vIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQKKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8vIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4RCwgVFlQRV9SWEQpOworCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0UnhELCAoUFVDSEFSKXBSeEQsIEZBTFNFLCBUWVBFX1JYRCk7CisjZW5kaWYKKwlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKKworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY1MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMKQEAgLTAsMCArMSwxMDMxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4gTGVlCQkyMDA2CSAgCWNyZWF0ZWQgZm9yIHJ0Mjg2MAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NPQ19JRExFCisgICAgICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICBtbG1lX2Rpc2Fzc29jX3JlcV9hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgIHBlZXJfZGlzYXNzb2NfYWN0aW9uCisgICAgICAgIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICBkcm9wCisgICAgICAgIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICBkcm9wCisgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9BQ1RfU1RBVEUsIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFDVF9JRExFLCBBQ1RfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRExTQWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87CisJVUNIQVIgICAgICAgICAgIEFkZHJbNl07CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCisJcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCisJaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQorCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyAxLiBmaW5kIGVudHJ5CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEluZm8tPnBBZGRyKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gQUREQkFfUkVROworCQlGcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCQlGcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwkJRnJhbWUuQmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLkJhUGFybS5CdWZTaXplID0gcEluZm8tPkJhQnVmU2l6ZTsKKwkJRnJhbWUuVG9rZW4gPSBwSW5mby0+VG9rZW47CisJCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IHBJbmZvLT5UaW1lT3V0VmFsdWU7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuRnJhZ051bSA9IDA7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsKKworCQkqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pKTsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKKwkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQorICAgIFBhcmFtZXRyczoKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlGUkFNRV9CQVIJRnJhbWVCYXI7CisKKwlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisKKwlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKworCQkvLyBTRU5EIERFTEJBIEZSQU1FCisJCUZyYW1lTGVuID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkcik7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gREVMQkE7CisJCUZyYW1lLkRlbGJhUGFybS5Jbml0aWF0b3IgPSBwSW5mby0+SW5pdGlhdG9yOworCQlGcmFtZS5EZWxiYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OyAvLyBUaW1lIE91dAorCQkqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pKTsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IGNwdTJsZTE2KEZyYW1lLlJlYXNvbkNvZGUpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpLCAgICAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisgICAgCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQorfQorCitWT0lEIFBlZXJRT1NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFEREJBX1JFUToKKwkJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERCQV9SRVNQOgorCQkJUGVlckFkZEJBUnNwQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIERFTEJBOgorCQkJUGVlckRlbEJBQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCX0KK30KKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCkKK3sKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0OworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKworCUJzc0NvZXhpc3Qud29yZCA9IEJzczIwNDBDb2V4aXN0OworCS8vIEFQIGFza3MgU3RhdGlvbiB0byByZXR1cm4gYSAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZS4gIFNvIHdlIGZpcnN0IHN0YXJ0cyBhIHNjYW4sIHRoZW4gc2VuZCBiYWNrIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lCisJaWYgKChCc3NDb2V4aXN0LmZpZWxkLkluZm9SZXEgPT0gMSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkpCisJeworCQkvLyBDbGVhciByZWNvcmQgZmlyc3QuICBBZnRlciBzY2FuICwgd2lsbCB1cGRhdGUgdGhvc2UgYml0IGFuZCBzZW5kIGJhY2sgdG8gdHJhbnNtaXRlci4KKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkludG9sZXJhbnQ0MCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAwOworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl8yMDQwX0JTU19DT0VYSVNUKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwl9Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogQnVpbGQgSW50b2xlcmFudCBDaGFubmVsIFJlcnBvdCBmcm9tIFRyaWdnZXIgZXZlbnQgdGFibGUuCityZXR1cm4gOiBob3cgbWFueSBieXRlcyBjb3BpZWQuCisqLworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KQoreworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJUmVhZE9mZnNldCA9IDA7CisJVUNIQVIJCQlpOworCVVDSEFSCQkJTGFzdFJlZ0NsYXNzID0gMHhmZjsKKwlQVUNIQVIJCQlwTGVuOworCisJZm9yICggaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzcyA9PSBMYXN0UmVnQ2xhc3MpCisJCQl7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKKwkJCQkqcExlbisrOworCQkJCVJlYWRPZmZzZXQrKzsKKwkJCQlGcmFtZUxlbisrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUOyAgLy8gSUUKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDEpID0gMjsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KKwkJCQlwTGVuID0gcERlc3QgKyBSZWFkT2Zmc2V0ICsgMTsKKwkJCQlMYXN0UmVnQ2xhc3MgPSBwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzOworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMikgPSBMYXN0UmVnQ2xhc3M7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAzKSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJRnJhbWVMZW4gKz0gNDsKKwkJCQlSZWFkT2Zmc2V0ICs9IDQ7CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCAyMC80MCBCU1MgQ29leGlzdGVuY2UgQWN0aW9uIGZyYW1lIElmIG9uZSB0cmlnZ2VyIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyovCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47CisKKwlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7CisJRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAorCQkJCSAgRU5EX09GX0FSR1MpOworCisJKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlGcmFtZUxlbisrOworCisJaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCisJCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCisJQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKKworCVBhcmFtZXRlcnM6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKKworCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOworCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7CisKKwkvLyBOZWVkIHRvIGNoZWNrICEhISEKKwkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKKwkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgorCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCisJeworCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCit7CisJVUNIQVIJCWk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgorCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlCQlBWYWx1ZSA9IDA7CisJVUxPTkcJCU1BQ1ZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOworCisJaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgorCWlmIChTZWNvbmRhcnkgPT0gMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7CisJfQorCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCisJZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisKKwkJaWYgKFNlY29uZGFyeSA9PSAxKQorCQl7CisJCQkvLyBTZWNvbmRhcnkgYWJvdmUuCisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICY9IDB4ZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MTgpOworCQkJQkJQVmFsdWV8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJTUFDVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJQkJQVmFsdWV8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOgkvLyBGb3JtYXQgZGVmaW5lZCBpbiBJRUVFIDcuNC43YS4xIGluIDExbiBEcmFmMy4wMworCQkJeworCQkJCS8vVUNIQVIJQnNzQ29leGlzdDsKKwkJCQlCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQJCSpwQ29leGlzdEluZm87CisJCQkJQlNTXzIwNDBfQ09FWElTVF9JRSAJCQkqcEJzc0NvZXhpc3RJZTsKKwkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOworCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOworCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCisJCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisJCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQorCQkJCXsKKwkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7CisJCQkJfQorCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7CisKKwkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCQkJeworCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJfQorCQkJYnJlYWs7CisJfQorCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCit9CisKKworc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSIENhdGVnb3J5OworCisJaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQorCXsKKwkJcmV0dXJuOworCX0KKworCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Cit9CisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCXJldHVybjsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW47CisJRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKKwlVQ0hBUiAgIAkJKnBBZGRyOworCisKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCBSQQorCXBGcmFtZSA9IChGUkFNRV9IVF9JTkZPICopICZFbGVtLT5Nc2dbMF07CisJcEFkZHIgPSBwRnJhbWUtPkhkci5BZGRyMjsKKworCU5kaXNaZXJvTWVtb3J5KCZIVElORk9mcmFtZSwgc2l6ZW9mKEZSQU1FX0hUX0lORk8pKTsKKwkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKKwlVTE9ORwkJCUZyYW1lTGVuOworCVBVQ0hBUgkJCXBBZGRyMTsKKworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCQlwQWRkcjEgPSAmQlJPQURDQVNUX0FERFJbMF07CisJZWxzZQorCQlwQWRkcjEgPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHI7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZGRyMSwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpOworCisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlGcmFtZS5BY3Rpb24gPSBOT1RJRllfQldfQUNUSU9OOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKwlGcmFtZUxlbisrOworCisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKE5vdGlmeUJXPSAlZCkhXG4iLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGgpKTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJaWYocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gTm90ZSwgdGhpcyBpcyB0byBwYXRjaCBESVItMTM1MyBBUC4gV2hlbiB0aGUgQVAgc2V0IHRvIFdlcCwgaXQgd2lsbCB1c2UgbGVnYWN5IG1vZGUuIEJ1dCBBUCBzdGlsbCBrZWVwcworCQkJCS8vIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uCisJCQkJLy8gSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJCQkJCUVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdICkpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlpZiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gMCkJLy8gNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguCisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCisJCQlicmVhazsKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQkJYnJlYWs7CisJCWNhc2UgSFRfSU5GT19FWENIQU5HRToKKwkJCXsKKwkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisKKwkJCQlwSFRfaW5mbyA9IChIVF9JTkZPUk1BVElPTl9PQ1RFVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisgICAgCQkJCS8vIDcuNC44LjEwCisgICAgCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisgICAgCQkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkKKyAgICAJCQkJeworICAgIAkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKKyAgICAJCQkJfQorCQkJfQorICAgIAkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OworCUlOVAkJCWksIHRvdGFsOworCVVDSEFSCQkJVElEOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CisKKwlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCisJeworCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwkJCVRJRCA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLlRJRDsKKworCQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisJCX0KKwkJdG90YWwgLS07CisJfQorfQorCisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit7CisJRlJBTUVfQkFSCQlGcmFtZUJhcjsKKwlVTE9ORwkJCUZyYW1lTGVuOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVTSE9SVAkJCVNlcXVlbmNlOworCVVDSEFSCQkJaSwgVElEOworCVVTSE9SVAkJCWlkeDsKKwlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OworCisJZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKKwkJaWYgKGlkeCA9PSAwKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOworCisJCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlUSUQgPSBwQkFFbnRyeS0+VElEOworCisJCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgorCQkJeworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKwlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKKyAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOworCisKKwlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCisJCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKQoreworCVVMT05HIFRlbXBMZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkmQWN0Q29kZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BQ1RJT05fSF9fCisjZGVmaW5lCV9fQUNUSU9OX0hfXworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19IVF9JTkZPX09DVEVUCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlc2VydmVkOjU7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisjZWxzZQorCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOworCVVDSEFSCVJlc2VydmVkOjU7CisjZW5kaWYKK30gSFRfSU5GT1JNQVRJT05fT0NURVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTworeworCUhFQURFUl84MDJfMTEgICAJCUhkcjsKKwlVQ0hBUgkJCQkJQ2F0ZWdvcnk7CisJVUNIQVIJCQkJCUFjdGlvbjsKKwlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOworfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKKworI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0N2FlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTgwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCisjZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCisKKyNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CisKKworQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitCVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOworCisjZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAorCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKKworVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAorCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKK3sKKwlVQ0hBUiBNYXhTaXplOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQl7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCQllbHNlCisJCQkJTWF4U2l6ZSA9IDEzOworCQl9CisJCWVsc2UKKwkJCU1heFNpemUgPSAzMTsKKwl9CisJZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl7CisJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQllbHNlCisJCQlNYXhTaXplID0gMTM7CisJfQorCWVsc2UKKwkJTWF4U2l6ZSA9IDc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKKwkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCQkqcFdpblNpemUgPSBNYXhTaXplOworCX0KK30KKwordm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQoreworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCisJcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7CisKKwlpZiAobXBkdS0+YkFNU0RVKQorCXsKKwkJQVNTRVJUKDApOworCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKKwkJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworLyoKKyAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCit7CisKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7CisKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQorCXsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCisJCXsKKwkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCisJCQlyZXR1cm4oRkFMU0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZmluZCBwb3NpdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltcGR1LT5uZXh0ID0gKnBwU2NhbjsKKwkqcHBTY2FuID0gbXBkdTsKKwlsaXN0LT5xbGVuKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCWxpc3QtPnFsZW4rKzsKKwltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CisJbGlzdC0+bmV4dCA9IG1wZHVfYmxrOworfQorCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKKworCUFTU0VSVChsaXN0KTsKKworCQlpZiAobGlzdC0+cWxlbikKKwkJeworCQkJbGlzdC0+cWxlbi0tOworCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQkJaWYgKG1wZHVfYmxrKQorCQkJeworCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCisJeworCUFTU0VSVChsaXN0KTsKKworCQlyZXR1cm4obGlzdC0+bmV4dCk7CisJfQorCisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkFfVEFCTEUgICAgICAgICpUYWI7CisJUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCWludCBpOworCisJVGFiID0gJnBBZC0+QkFUYWJsZTsKKworCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCisJCXsKKwkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJCXsKKwkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJCX0KKwkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKKworLyoKKyAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCit7CisJaW50ICAgICBpOworCVBVQ0hBUiAgbWVtOworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OworCisJLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCisJLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLworCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKKwlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7CisJZnJlZWxpc3QtPnFsZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOworCisJLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOworCisJcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKKworCWlmIChtZW0gPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCXsKKwkJLyogZ2V0IG1wZHVfYmxrICovCisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCQkvKiBuZXh0IG1wZHVfYmxrICovCisJCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7CisJCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCisJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwl9CisKKwlyZXR1cm4oVFJVRSk7Cit9CisKKy8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKworc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKKwlpZiAobXBkdV9ibGspCisJeworLy8JCWJsa19jb3VudCsrOworCQkvKiByZXNldCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCXJldHVybiBtcGR1X2JsazsKK30KKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJQVNTRVJUKG1wZHVfYmxrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKy8vCWJsa19jb3VudC0tOworCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCitzdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCisJCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLworCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKKwkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCXJldHVybiBMYXN0SW5kU2VxOworfQorCitzdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKKwkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAorCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwl7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCisJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCX0KKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworLy9zdGF0aWMKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKKworeworCVVTSE9SVCBTZXF1ZW5jZTsKKworLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAorLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQorCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJCSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCWVsc2UKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKKwkgICApCisJCXsKKy8vCQlwcmludGsoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4LCAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisvLwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKy8vCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpOworICAgIAkJLy8KKwkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKKyAgICAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCS8vCisgICAgCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cworICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKKyAgICAJCXsKKyAgICAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJfQorCisJCS8vcHJpbnRrKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCisJfQorI2lmIDAKKwllbHNlIGlmICgKKwkJCSAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorCQkJICAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpKQorCQkJKQorCQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXhcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQkJfQorI2VuZGlmCit9CisKKworLyoKKyAqIGdlbmVyYXRlIEFEREJBIHJlcXVlc3QgdG8KKyAqIHNldCB1cCBCQSBhZ3JlZW1lbnQKKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgSU4gVUNIQVIgICAgICAgICAgICBUSUQsCisJCQkJCSAgSU4gVVNIT1JUICAgICAgICAgICBUaW1lT3V0LAorCQkJCQkgIElOIFVMT05HICAgICAgICAgICAgRGVsYXlUaW1lLAorCQkJCQkgIElOIEJPT0xFQU4gICAgICAgICAgaXNGb3JjZWQpCisKK3sKKwkvL01MTUVfQUREQkFfUkVRX1NUUlVDVAlBZGRiYVJlcTsKKwlCQV9PUklfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkgICYmICAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCQlyZXR1cm47CisKKwkvLyBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLgorCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKKwkJcmV0dXJuOworCisJaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCXsKKwkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCQlEZWxheVRpbWUgPSAzMDAwOworLy8JCXByaW50aygiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpOworLy8JCXJldHVybjsKKwl9CisKKworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJeworCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9CisKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQorCXsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKKworCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOworCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VElEID0gVElEOworCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OworCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKworCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKKwl7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOworCX0KKwllbHNlCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Cit9CisKK1ZPSUQgQkFPcmlTZXNzaW9uQWRkKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQoreworCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIFRJRDsKKwlVU0hPUlQgICAgICAgIElkeDsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKwlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCisJeworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOworCisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7CisJCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvL3BGcmFtZS0+VGltZU91dFZhbHVlOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX0ZVTkNUSU9OX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwKKwkJCQkJCQkJIHBCQUVudHJ5LT5CQVdpblNpemUsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpKTsKKworCQkvLyBTRU5EIEJBUiA7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gQkFPcmlTZXNzaW9uQWRkKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQkFFbnRyeS0+U2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBCQUVudHJ5LT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksICAgICAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCisKKwkJaWYgKHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpCisJCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKTsgLy8gaW4gbVNlYworCX0KK30KKworQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoCisJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgIElOIFBGUkFNRV9BRERCQV9SRVEgcEZyYW1lKQoreworCUJBX1JFQ19FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgU3RhdHVzID0gVFJVRTsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OworCVVDSEFSICAgICAgICAgICAgICAgICAgIFRJRDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCQVdpblNpemU7CisJLy9VSU5UMzIgICAgICAgICAgICAgICAgICBWYWx1ZTsKKwkvL1VJTlQgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworCisJQVNTRVJUKHBFbnRyeSk7CisKKwkvLyBmaW5kIFRJRAorCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKKworCUJBV2luU2l6ZSA9IG1pbigoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisKKwkvLyBJbnRlbCBwYXRjaAorCWlmIChCQVdpblNpemUgPT0gMCkKKwl7CisJCUJBV2luU2l6ZSA9IDY0OworCX0KKworCUlkeCA9IHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXTsKKworCisJaWYgKElkeCA9PSAwKQorCXsKKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NSZWNFbnRyeShwQWQsICZJZHgpOworCX0KKwllbHNlCisJeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAorCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAocEJBRW50cnkgIT0gTlVMTCkKKwl7CisJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCisJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IEJBV2luU2l6ZTsKKwkJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwkJcEJBRW50cnktPlRJRCA9IFRJRDsKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7CisJCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisKKwkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDE8PFRJRCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+UkVDQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksIFRSVUUpOworCQl9CisKKyNpZiAwCS8vIGZvciBkZWJ1Z2dpbmcKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKTsKKyNlbmRpZgorCisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOworCisJCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KKwkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJfQorCXJldHVybihTdGF0dXMpOworfQorCisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKKwl7CisJCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwkJZ290byBkb25lOworCX0KKworCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQorCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKKwkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CisJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKKwkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKwkJCSpJZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvbmU6CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCXJldHVybiBwQkFFbnRyeTsKK30KKworCitWT0lEIEJBVGFibGVGcmVlT3JpRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOworCisJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBRW50cnktPlRva2VuID0gMDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKKwlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQorCXsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKKwkJeworCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCisJCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKyNpZiAxCisJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCX0KKwlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKKworCWlmIChiUGFzc2l2ZSkKKwl7CisJCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7CisJfQorfQorCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKK3sKKwlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOworCisKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7CisJLy8KKwkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KKwkvLworCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlCT09MRUFOIAkJCQlDYW5jZWxsZWQ7CisJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkvL1VMT05HICAgb2Zmc2V0OworCQkvL1VJTlQzMiAgVkFMVUU7CisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKKwkJLy8KKwkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKKyNpZiAxCisJCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJa2ZyZWUoRWxlbSk7CisjZWxzZQorCQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCQl9CisKKworCQkvLworCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KKwkJLy8KKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSAwOworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpKSk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7CisKKwkJUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7CisKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJfQorCisJQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7Cit9CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCisJeworCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7CisJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisKKwlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCisJeworCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7CisKKwkJTmRpc1plcm9NZW1vcnkoJkFkZGJhUmVxLCBzaXplb2YoQWRkYmFSZXEpKTsKKwkJQ09QWV9NQUNfQUREUihBZGRiYVJlcS5wQWRkciwgcEVudHJ5LT5BZGRyKTsKKwkJQWRkYmFSZXEuV2NpZCA9IChVQ0hBUikocEVudHJ5LT5BaWQpOworCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OworCQlBZGRiYVJlcS5UaW1lT3V0VmFsdWUgPSAwOworCQlBZGRiYVJlcS5Ub2tlbiA9IHBCQUVudHJ5LT5Ub2tlbjsKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkFkZGJhUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIE9yaSBTZXNzaW9uIFRpbWVvdXQoJWQpIDogU2VuZCBBREQgQkEgYWdhaW5cbiIsIHBCQUVudHJ5LT5Ub2tlbikpOworCisJCXBCQUVudHJ5LT5Ub2tlbisrOworCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBPUklfQkFfU0VTU0lPTl9USU1FT1VUKTsKKwl9CisJZWxzZQorCXsKKwkJQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0pOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gKEJBX1JFQ19FTlRSWSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSICAgcEFkOworCVVMT05HICAgICAgICAgICBOb3czMjsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCisJCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKyBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQpKSkKKwkJeworCQkJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcHJpbnRrKCIlbGQ6IFJFQyBCQSBzZXNzaW9uIFRpbWVvdXRcbiIsIE5vdzMyKTsKKwkJfQorCX0KK30KKworCitWT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvLwk3LjQuNC4xCisJLy9VTE9ORwlJZHg7CisJVUNIQVIgICBTdGF0dXMgPSAxOworCVVDSEFSICAgcEFkZHJbNl07CisJRlJBTUVfQUREQkFfUlNQIEFERGZyYW1lOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVBGUkFNRV9BRERCQV9SRVEgIHBBZGRyZXFGcmFtZSA9IE5VTEw7CisJLy9VQ0hBUgkJQnVmU2l6ZTsKKwlVTE9ORyAgICAgICBGcmFtZUxlbjsKKwlQVUxPTkcgICAgICBwdGVtcDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJBZGRCQVJlcSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCS8vQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisKKwlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKKwl7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKKwkJeworCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOworCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQkJCVN0YXR1cyA9IDA7CisJCQllbHNlCisJCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisJCX0KKwkJZWxzZQorCQl7CisJCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCX0KKwl9CisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQorCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKKworCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNEbHMpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKKwlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47CisJLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOworCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKKwlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCisJeworCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OworCX0KKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCisJKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7CisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKKwkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKK30KKworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQlJZHgsIGk7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKKwkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCisJLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOworCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKKwkJeworCQkJY2FzZSAwOgorCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgorCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KKwkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOworCQkJCWJyZWFrOworCQl9CisJCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKKwkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKKwkJfQorCX0KK30KKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy9VQ0hBUgkJCQlJZHg7CisJLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOworCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOworCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKKwkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOworCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJfQorCX0KK30KKworCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKwkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCisJCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCit7CisJUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7CisJUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKKwkvL0JPT0xFQU4gCVJlc3VsdDsKKwlVTE9ORyAgIElkeDsKKwkvL1VDSEFSCU51bVJ4UGt0OworCVVDSEFSCVRJRDsvLywgaTsKKworCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCisJCXsKKwkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQl9CisJCWVsc2UKKwkJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCisJaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCisJeworCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCX0KKwkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCBQU01QIEFjdGlvbiBmcmFtZSBJZiBQU01QIG1vZGUgc3dpdGNoZXMuCisqLworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwkJCQkgICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJCQkJICAgSU4gVUNIQVIJCQkJV2NpZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlQc21wKQoreworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwkvL1VMT05HICAgICAgICAgICBJZHg7CisJRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOworCXN3aXRjaCAoUHNtcCkKKwl7CisJCWNhc2UgTU1QU19FTkFCTEU6CisJCQlGcmFtZS5Qc21wID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfRFlOQU1JQzoKKwkJCUZyYW1lLlBzbXAgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19TVEFUSUM6CisJCQlGcmFtZS5Qc21wID0gMTsKKwkJCWJyZWFrOworCX0KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Cit9CisKKworI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUglDaGFubmVsTnVtYmVyOworCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKKwlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKKwlVQ0hBUglNZWFzdXJlbWVudE1vZGU7CisJVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOworCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKKwlVQ0hBUglUaHJlc2hvbGQ7CisJVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCit9IEJFQUNPTl9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglJRDsKKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJVG9rZW47CisJVUNIQVIJUmVxdWVzdE1vZGU7CisJVUNIQVIJVHlwZTsKK30gTUVBU1VSRU1FTlRfUkVROworCisKKworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBrdDsKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisKKwkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCisJLy8gMi4gcmVtb3ZlIExMQworCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKKwkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT50YWlsID0gUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSArIFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQorCS8vCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIExJTlVYCisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisjaWZkZWYgVUNPUworCQkJTmRpc01vdmVNZW1vcnkobmV0X3BrdF9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCisJZG8JCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWVsc2UJCQkJCQkJCQkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsKKworCisKK3N0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKworCW1wZHVfYmxrID0gYmFfbXBkdV9ibGtfYWxsb2MocEFkKTsKKwlpZiAobXBkdV9ibGsgIT0gTlVMTCkKKwl7CisJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOworCisJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisgICAgICAgIC8vCisJCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCisJCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KKwkJLy8KKwkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKKwkJeworCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0CisJCQkvLyBkb24ndCBpbmRpY2F0ZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKworCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl9CisJZWxzZQorCXsKKyNpZiAwCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkOiVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBibGtfY291bnQsIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZW5kaWYKKwkJLyoKKwkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgorCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KKwkJICovCisJCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGUgdGhpcyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgcHV0IGl0IGludG8gcmVvcmRlcmluZyBidWZmZXIKKworCVBhcmFtZXRyczoKKwkJcFJ4QmxrICAgICAgICAgOiBjYXJyeSBuZWNlc3NhcnkgcGFja2V0IGluZm8gODAyLjExIGZvcm1hdAorCQlGcm9tV2hpY2hCU1NJRCA6IHRoZSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB3aGljaCBCU1MKKworCVJldHVybgk6CisJCQkgIG5vbmUKKworCU5vdGUgICAgOgorCSAgICAgICAgICB0aGUgcGFja2V0IHF1ZXVlZCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyIG5lZWQgdG8gY292ZXIgdG8gODAyLjMgZm9ybWF0CisJCQkgIG9yIHByZV9BTVNEVSBmb3JtYXQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVU0hPUlQJCQkJSWR4OworCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCVVMT05HCQkJCU5vdzMyOworCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKworCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCisJeworI2lmIDAgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKwkJc3RhdGljIGludCBlcnJfc2l6ZTsKKworCQllcnJfc2l6ZSsrOworCQlpZiAoZXJyX3NpemUgPiAyMCkgeworCQkJIHByaW50aygiQU1QRFUgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4xMSBIZWFkZXIiLCAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIsIDI0KTsKKwkJCSBoZXhfZHVtcCgiUGF5bG9hZCIsIHBSeEJsay0+cERhdGEsIDY0KTsKKwkJCSBlcnJfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisKKyNpZiAwIC8vIHRlc3QKKwkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCX0KKwllbHNlCisJeworCQkvLyBpbXBvc3NpYmxlICEhIQorCQlBU1NFUlQoMCk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQocEJBRW50cnkpOworCisJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKKworCisJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCS8vCisJLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQorCS8vCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCisJeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCisJCS8vIHJlc2V0IHJjdiBzZXF1ZW5jZSBvZiBCQSBzZXNzaW9uCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKworCisJLy8KKwkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KKwkvLworCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCQlVU0hPUlQgIExhc3RJbmRTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisgCQlMYXN0SW5kU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChMYXN0SW5kU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gTGFzdEluZFNlcTsKKwkJfQorCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJLy8KKwkvLyBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKKwl7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCS8vCisJLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgorCS8vCisJZWxzZQorCXsKKyNpZiAwCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisjZWxzZQorCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisKKworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKKwkJaWYgKFRtcFNlcSA8IDApCisJCXsKKwkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7CisJCX0KKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CisJCX0KKyNlbmRpZgorCX0KK30KKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU0OTAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMCwwICsxLDM0NjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKKworVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OworLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0CitVQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKK1VDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKK1VDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07CitVQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCisKK1VDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OworVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OworVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLyAJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKKwkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKwkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKworVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQorCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK307CisKK1VDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7CisJMCwgIDAsCTAsICAwLAorCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CitVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCisJUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKKworY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKKworVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OworVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CisKK1VDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCisJb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlMZW5ndGgpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSAJCUZyZWVOdW07CisjaWZkZWYgUlQyODYwCisJdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUNIQVIJCQlJcnFTdGF0ZTsKKwlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJUXVlSWR4PTM7CisKKwkvLyAyODYwQyB1c2UgVHggUmluZworCisJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKyNpZmRlZiBSVDI4NjAKKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSAmJiAoIUlycVN0YXRlKSkKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODYwCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJTGVuZ3RoKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSBGcmVlTnVtOworCVRYV0lfU1RSVUMJCVRYV0k7CisJVUxPTkcJU1dfVFhfSURYOworCVBUWERfU1RSVUMJCXBUeEQ7CisKKwlRdWVJZHggPSAzOworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCQkvLyAyODYwQyB1c2UgVHggUmluZworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7CisJCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWZmZXIgCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIFJUMjg2MAorCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQorCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCit9CisKKworI2lmZGVmIFJUMjg2MAorTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCVVMT05HCQkJU3JjQnVmUEE7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlVTE9ORwkgRnJlZU51bTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7CisKKwlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJaWYgKEZyZWVOdW0gPT0gMCkKKwl7CisJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQorCXsKKwkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXBGaXJzdFR4V0kJPShQVFhXSV9TVFJVQylwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYV0lfU0laRSk7CisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfQorCWVsc2UKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisJLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworICAgIAl9CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwl7CisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQorCQlwQWQtPlNlcXVlbmNlID0gMDsKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcl84MDJfMTEsIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJLy8gT25seSBiZWFjb24gdXNlIE5zZXE9VFJVRS4gU28gaGVyZSB3ZSB1c2UgTnNlcT1GQUxTRS4KKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7CisKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKKwlwVHhELT5ETUFET05FID0gMDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisgICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgorCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7CisKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAorCQlNbG1lUmF0ZSA9IFJBVEVfNjsKKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQorCXsKKwkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkpCisJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQorCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0CisJLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCisJLy8KKwkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCWVsc2UKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7CisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKKwkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgl0eERlc2NOdW1MZXZlbCwgdHhTd1FOdW1MZXZlbDsKKworCQkJCXR4RGVzY051bUxldmVsID0gKFRYX1JJTkdfU0laRSAtIEZyZWVOdW1iZXJbUXVlSWR4XSk7IC8vIE51bWJlciBvZiBvY2N1cGllZCBodyBkZXNjLgorCQkJCXR4RGVzY051bUxldmVsID0gKCh0eERlc2NOdW1MZXZlbCA8PTE1KSA/IHR4RGVzY051bUxldmVsIDogMTUpOworCQkJCXBEaWFnU3RydWN0LT5UeERlc2NDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eERlc2NOdW1MZXZlbF0rKzsKKworCQkJCXR4U3dRTnVtTGV2ZWwgPSAoKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDw9NykgPyBwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA6IDgpOworCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bdHhTd1FOdW1MZXZlbF0rKzsKKworCQkJCWZpcnN0Um91bmQgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KQorCQkJeworCQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKKwkJCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisKKwkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCisJCQkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKQorCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKKwkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQorCQl7CisJCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKKwkJfQorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisJfQorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUmF0ZQkJCVRyYW5zbWl0IHJhdGUKKwkJU2l6ZQkJCUZyYW1lIHNpemUgaW4gdW5pdHMgb2YgYnl0ZQorCisJUmV0dXJuIFZhbHVlOgorCQlEdXJhdGlvbiBudW1iZXIgaW4gdW5pdHMgb2YgdXNlYworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJhdGUsCisJSU4JVUxPTkcJCQlTaXplKQoreworCVVMT05HCUR1cmF0aW9uID0gMDsKKworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCXsKKwkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWVsc2UKKwkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCisJCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKChTaXplIDw8IDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKys7CisJfQorCWVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkvLyBPRkRNIHJhdGVzCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gKz0gNCAqIChVU0hPUlQpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArPSA0OworCX0KKwllbHNlCS8vbWltbyByYXRlCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwl9CisKKwlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeFdJCQlQb2ludGVyIHRvIGhlYWQgb2YgZWFjaCBNUERVIHRvIEhXLgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOworCVRYV0lfU1RSVUMgCQlUeFdJOworCVBUWFdJX1NUUlVDIAlwVHhXSTsKKworCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOworCXBUeFdJID0gJlR4V0k7CisKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKworCXBUeFdJLT5DRkFDSyA9IENGQUNLOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCisJcFR4V0ktPk5TRVEgPSBOU2VxOworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKworCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWMpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwkJeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQkJeworCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQkJeworCQkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7CisJCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJCUJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBUeFdJKTsKKworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKKworCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChwTWFjRW50cnkgJiYKKwkJKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkocE1hY0VudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IEJTU0lEX1dDSUQ7CisJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOworCisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKKwl7CisJCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgorCisJCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7CisJfQorCisJcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjRW50cnkpCisJeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJCXsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwkJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwkvLworCS8vIHVwZGF0ZSBUWFdJCisJLy8KKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKworCWlmIChwTWFjRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoKQorCXsKKwkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOworCisJCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisJCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPk1JTU9wcyA9IDA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJeworCQkvLyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJeworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOIAkJYldJViwKKwlJTglVQ0hBUgkJCVF1ZXVlU0VMKQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKKwlwVHhELT5RU0VMPSAoUXVldWVTRUwpOworCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCisJCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKKwlwVHhELT5ETUFET05FID0gMDsKK30KKworCisvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCisvLyAxLiBNRUFESUFfQ09OTkVDVEVECisvLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECisvLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCisvLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIpCit7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCWlmIChwODAyM2hkclswXSAmIDB4MDEpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChJTkZSQV9PTihwQWQpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgIENoZWNrIHRoZSBNU0RVIEFnZ3JlZ2F0aW9uIHBvbGljeQorCTEuSFQgYWdncmVnYXRpb24gaXMgQS1NU0RVCisJMi5sZWdhYWN5IHJhdGUgYWdncmVnYXRpb24gaXMgc29mdHdhcmUgYWdncmVnYXRpb24gYnkgUmFsaW5rLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORwkJICAgVHhSYXRlLAorCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQoreworCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQl7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgYW5kIGZpbmUgdGhlIHBhY2tldCB3YWl0aW5nIGluIFNXIHF1ZXVlIHdpdGggaGlnaGVzdCBwcmlvcml0eQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCit7CisKKwlVTE9ORwlOdW1iZXI7CisKKwlOdW1iZXIgPSBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLk51bWJlcjsKKworCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQkU7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0hDQ0E7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7CisJfQorCisJLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKworCXJldHVybiAoTlVMTCk7Cit9CisKKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4KQoreworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKyNpZmRlZglSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworI2VuZGlmCisJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCVVDSEFSCUZSRUUgPSAwOworCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOworCS8vVUxPTkcJCUlycUZsYWdzOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCisKKwlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJCWlmICgoQVRFX09OKHBBZCkpICYmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpKQorCQl7CisJCQlpZiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOworCQkJCS8vcEFkLT5hdGUuUmVwZWF0Kys7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCisJCQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSAqLworCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7CisJCQkJcEFkLT5hdGUuVHhBYzArKzsKKworCQkJCUZSRUUrKzsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7CisJCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOworCQkgICAgICAgIHBUeEQgPSAmVHhEOworCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisKKwkJCQlwSGVhZGVyODAyMTEgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5EbWFCdWYuQWxsb2NWYSArIHNpemVvZihUWFdJX1NUUlVDKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcjgwMjExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJCQkJaWYgICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPCBwQWQtPmF0ZS5UeENvdW50KSkKKwkJCQl7CisJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOworCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOworCQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJCQlnb3RvIGtpY2tfb3V0OworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5hdGUuVHhTdGF0dXMgPT0gMSkvKiBvciAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSA/Pz8gKi8gJiYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IHBBZC0+YXRlLlR4Q291bnQpKS8vPD09PT09PT09PT09PT09PT09PT09PT09PVBFVEVSCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImFsbCBUeCBpcyBkb25lXG4iKSk7CisJCQkJCS8vIFR4IHN0YXR1cyBlbnRlcnMgaWRsZSBtb2RlLgorCQkJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKCEocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCS8qIG5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3MgdGhlIFN0b3AgVFggYm90dG9uLiAqLworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7CisgIAkJCQl9CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KKwkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKKwkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLworCQlGUkVFKys7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKwkJcE9yaVR4RCA9IHBUeEQ7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOworCQlwVHhEID0gJlR4RDsKKyNlbHNlCisgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKyAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCQlpZiAoIShBVEVfT04ocEFkKSkpCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCXsKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQorCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZWxzZQorI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpCisJCQl7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisJCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQllbHNlCisjZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQl9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSArKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAqcERlc3RUeEQgPSBUeEQ7CisjZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQora2lja19vdXQ6CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLworCQkvLyBBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCisJCS8vIEFURV9TVE9QIG11c3QgYmUgY2hhbmdlZCBub3QgdG8gYmUgMHhmZgorCQkvLyB0byBwcmV2ZW50IGl0IGZyb20gcnVubmluZyBpbnRvIHRoaXMgYmxvY2suCisJCS8vCisJCWlmICgocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkpCisJCXsKKwkJCS8vIFR4RG9uZUNvdW50KysgaGFzIGJlZW4gZG9uZSBpZiBRQSBpcyB1c2VkLgorCQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCisJCQl7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCX0KKwkJCWlmICgoKHBBZC0+YXRlLlR4Q291bnQgLSBwQWQtPmF0ZS5UeERvbmVDb3VudCArIDEpID49IFRYX1JJTkdfU0laRSkpCisJCQl7CisJCQkJLyogTm90ZSA6IFdlIGluY3JlYXNlIFR4Q3B1SWR4IGhlcmUsIG5vdCBUeFN3RnJlZUlkeCAhICovCisJCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeF0uQWxsb2NWYSk7CisJCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKwkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7CisJCSAgICAgICAgcFR4RCA9ICZUeEQ7CisJCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKyAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZgorCQkJCS8vIGtpY2sgVHgtUmluZy4KKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCX0KKworCisJcmV0dXJuICBiUmVzY2hlZHVsZTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQoreworICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisKKwkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwlyZXR1cm4gIGJSZXNjaGVkdWxlOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYRF9TVFJVQwkgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlVQ0hBUglGUkVFID0gMDsKKwlQUlRNUF9NR01UX1JJTkcgcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHghPSBwTWdtdFJpbmctPlR4RG1hSWR4KQorCXsKKwkJRlJFRSsrOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZWxzZQorCQlwVHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisjZW5kaWYKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJSU5DX1JJTkdfSU5ERVgocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICAgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgVFJVRSwgVFlQRV9UWEQpOworI2VuZGlmCisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKKwkJfQorCX0KKworCit9CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Cit9CisKKworVk9JRCBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlQVUxPTkcJcHRlbXA7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JFOgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjAsICZBYzBCYXNlKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDAsICZBYzBTd0lkeCk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwLCAmQWMwSHdJZHgpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQkUgREVTQ1JJUFRPUiAgXG4gIiAgKSk7CisJCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCQljYXNlIFFJRF9BQ19CSzoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIxLCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgxLCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX0JLIERFU0NSSVBUT1IgIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVkk6CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMiwgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMiwgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDIsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WSSBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVk86CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMywgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMywgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDMsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WTyBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfTUdNVDoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFI1LCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFg1LCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYNSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgQWxsIFFJRF9NR01UICBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCJEQkdQUklOVF9UWF9SSU5HKFJpbmcgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCUFDMGZyZWVJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUeFJpbmclZCwgVFhfRFRYX0lEWD0lZCwgVFhfQ1RYX0lEWD0lZFxuIiwgUXVlSWR4LCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVR4U3dGcmVlSWR4WyVkXSIsIEFDMGZyZWVJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7CisKKworfQorCisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlVSU5UMzIJKnB0ZW1wOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIiAgKSk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9CQVNFX1BUUiwgJkFjMEJhc2UpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfQ1JYX0lEWCwgJkFjMFN3SWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZBYzBId0lkeCk7CisJQUMwZnJlZUlkeCA9IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBSWCBEU1AgIFxuICIgICkpOworCWZvciAoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJCXB0ZW1wID0gKFVJTlQzMiAqKXBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4eDogJTA4eDogJTA4eDogJTA4eFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeFJpbmcsIFJYX0RSWF9JRFg9JWQsIFJYX0NSWF9JRFg9JWQgXG4iLCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVJ4U3dSZWFkSWR4IFslZF09IiwgQUMwZnJlZUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglwZW5kaW5nLU5ESVM9JWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwkvLworCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAorCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Cit9CisKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlVU0hPUlQgCQkJUGF5bG9hZFNpemU7CisJVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKKwlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7CisJVUlOVAkJCW5NU0RVOworICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCisJUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7CisJUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKKworCisKKwluTVNEVSA9IDA7CisKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCisJeworCisJCW5NU0RVKys7CisKKwkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7CisJCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CisKKworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlQyODYwCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKWkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQllbHNlCisjZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOworCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKKwkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOworCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7CisJCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKKworCisJCQlwQWQtPk1hY1RhYi5TaXplICsrOworCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7CisKKworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCisJaWYgKHBFbnRyeSkKKwl7CisJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJeworCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJVVNIT1JUIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorIAkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCSkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKworCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCXBQcmV2RW50cnkgPSBOVUxMOworCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJZG8KKwkJCXsKKwkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCXsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkvLyBub3QgZm91bmQgISEhCisJCQlBU1NFUlQocFByb2JlRW50cnkgIT0gTlVMTCk7CisKKwkJCVJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOworCisKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQl9CisKKworICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQlwQWQtPk1hY1RhYi5TaXplIC0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fRlVOQ1RJT05fXywgd2NpZCk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gMDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwIC8qcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKi8sIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwIC8qcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiovKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXNldCB0aGUgZW50aXJlIE1BQyB0YWJsZS4gQWxsIHBhY2tldHMgcGVuZGluZyBpbgorCQl0aGUgcG93ZXItc2F2aW5nIHF1ZXVlcyBhcmUgZnJlZWQgaGVyZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1hY1RhYmxlUmVzZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZCkKK3sKKwlpbnQgICAgICAgICBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVSZXNldFxuIikpOworCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworI2lmZGVmIFJUMjg2MAorCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJICAgeworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7CisKKworCisKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKKwlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKKwlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit7CisJQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOworCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKKwlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAorCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKKwlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIFJlYXNvbikKK3sKKwlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQorCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUGFja2V0IAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCisJCUZBTFNFCQlEbyBub3RoaW5nLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCisJCSAgMTQgQnl0ZXMJICAyMCBCeXRlcworCisJCVVEUCBIZWFkZXIKKwkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8CisJCQkJCQlTb3VyY2UgUG9ydAorCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKKwkJCQkJRGVzdGluYXRpb24gUG9ydAorCisJCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KKwkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKKwlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOworCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKKwlQVUNIQVIJCQlwU3JjOworCVVTSE9SVAkJCVByb3RvY29sOworCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKKwlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sIChQVUNIQVIgKikmcFZpcnR1YWxBZGRyZXNzLCAmTmRpc0J1ZmZlckxlbmd0aCk7CisKKwlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOworCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CisKKwkvLworCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAorCS8vCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCisJeworCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKKwkJfQorCisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCS8vRW5kIG9mIFJlYWQKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKKwkJeworCQkvLworCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKKwkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZworCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKKwkJLy8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCXJldHVybiBUUlVFOworfQorCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVVTSE9SVAlUeXBlTGVuOworCVVDSEFSCUJ5dGUwLCBCeXRlMTsKKwlQVUNIQVIJcFNyY0J1ZjsKKwlVSU5UMzIJcGt0TGVuOworCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOCXN0YXR1cyA9IFRSVUU7CisKKworCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwlBU1NFUlQocFNyY0J1Zik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7CisKKwkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107CisKKwlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkKKwl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKKwkJLyoKKwkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKworCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSovCisJCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKKwkJeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7CisJCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKKwkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCisJCX0KKwl9CisKKwkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KKwlpZiAoVHlwZUxlbiA9PSAweDgxMDApCisJeworCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCisKKwkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCisJCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKKwkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKKwkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKworCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKworCQkgICBQYWQgKDAtcCBieXRlcykgKworCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KKworCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7CisJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisKKwkJcFNyY0J1ZiArPSA0OyAvLyBTa2lwIHRoZSBWTEFOIEhlYWRlci4KKwl9CisKKwlzd2l0Y2ggKFR5cGVMZW4pCisJeworCQljYXNlIDB4MDgwMDoKKwkJCXsKKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CisJCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpCisJCQkJewkvLyB1ZHAgcGFja2V0CisJCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLy8gMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlcgorCisJCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgorCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOworCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisKKwkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQorCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0CisJCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDgwNjoKKwkJCXsKKwkJCQkvL0FSUCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDg4OGU6CisJCQl7CisJCQkJLy8gRUFQT0wgUGFja2V0LgorCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gRkFMU0U7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKKwkJeworCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOworCisJaWYgKHJzc2kwICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOworCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCX0KKworCWlmIChyc3NpMSAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKKwkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisKKwlpZiAocnNzaTIgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOworCX0KK30KKworCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKKwl7CisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkvLworCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJCXsKKwkJCS8vIGhhbmRsZSBBLU1TRFUKKwkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJVUlOVDE2CQkJTXNkdTJTaXplOworCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwlQVUNIQVIgCQkJcERhdGEyOworCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisKKworCisJTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7CisKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCisJeworCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CisJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOworCisJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICghcFBhY2tldDIpCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0CisJcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFBhY2tldDIpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCisJewkJCQkJCQkJXAorCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCisJCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCisJCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCisJCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAorCX0KKworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7CisJQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKKwlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOworCisKKwlBU1NFUlQocEhlYWRlcik7CisKKwlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0CisJeworCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKKwkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKKwkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQorCQl9CisJfQorCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl7CisJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8CisJCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCisJCXsKKwkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCisJCXsKKwkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisKKyAgICAgICAgLy8KKwkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgorCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCisJCS8vCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKKwkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisKKwkJLy8gTGFzdCBmcmFnbWVudAorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCisJCXsKKwkJCWJSZWFzc0RvbmUgPSBUUlVFOworCQl9CisJfQorCitkb25lOgorCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQorCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAorCWlmIChiUmVhc3NEb25lKQorCXsKKwkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OworCisJCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50CisJCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpCisJCXsKKwkJCS8vIHVwZGF0ZSBSeEJsaworCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OworCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKKwkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOworCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKK30KKworCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUlOVAkJCW5NU0RVOworCisJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKK30KKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisKKwlVSU5UMzIgIE9mZnNldDsKKworCisJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKKworCXBBZC0+VGJ0dFRpY2tDb3VudCsrOworCisJLy8KKwkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKKwkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCisJLy8KKwlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCisJeworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCX0KKwllbHNlCisJeworCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCisJCXsKKwkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDE0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKQEAgLTAsMCArMSwxMjQwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFBDSS1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107CitleHRlcm4gVUNIQVIJTlVNX09GXzI4NTBfQ0hOTDsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZWFkZXJMZW47CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCisJeworCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJfQorCWVsc2UKKwl7CisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisKKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworfQorCisKK1VTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGVhZGVyTGVuOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKKworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLworCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKKwkvLworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCVR4RCA9ICpwRGVzdFR4RDsKKwlwVHhEID0gJlR4RDsKKyNlbmRpZgorCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7CisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworfQorCisKK1VTSE9SVCBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJQk9PTEVBTiBiSXNMYXN0OworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGRyTGVuOworCVVJTlQzMgkJCWZpcnN0RE1BTGVuOworCisJYklzTGFzdCA9ICgoZnJhbWVOdW0gPT0gKHBUeEJsay0+VG90YWxGcmFtZU51bSAtIDEpKSA/IDEgOiAwKTsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCWlmIChmcmFtZU51bSA9PSAwKQorCXsKKwkJLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCisJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCwgNCkrTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJZWxzZQorCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwl9CisJZWxzZQorCXsKKwkJZmlyc3RETUFMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisJfQorCisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJaWYgKGZyYW1lTnVtID09IDApCisJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKworCWlmIChmcmFtZU51bSAhPSAwKQorCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOworCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8vCisJLy8gVXBkYXRlIFR4IGluZGV4CisJLy8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisKK1ZPSUQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCisJSU4JVVNIT1JUCQkJRmlyc3RUeElkeCkKK3sKKworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlwVHhXSSA9IChQVFhXSV9TVFJVQykgcFR4UmluZy0+Q2VsbFtGaXJzdFR4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCit9CisKKworVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlMYXN0VHhJZHgpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisKKwkvLworCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKKwkvLworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtMYXN0VHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKK30KKworCitVU0hPUlQJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFnTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7CisJVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OworCVBUWERfU1RSVUMJCXBUeEQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJVUlOVDMyCQkJQnVmQmFzZVBhTG93OworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKwlVU0hPUlQJCQlod0hlYWRlckxlbjsKKwlVSU5UMzIJCQlmaXJzdERNQUxlbjsKKworCS8vCisJLy8gR2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8vCisJLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCS8vCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKworCS8vCisJLy8gQnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCisJeworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwl9CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAxOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJUmV0VHhJZHggPSBUeElkeDsKKwlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7CisKK30KKworLyoKKwlNdXN0IGJlIHJ1biBpbiBJbnRlcnJ1cHQgY29udGV4dAorCVRoaXMgZnVuY3Rpb24gaGFuZGxlIFBDSSBzcGVjaWZpYyBUeERlc2MgYW5kIGNwdSBpbmRleCB1cGRhdGUgYW5kIGtpY2sgdGhlIHBhY2tldCBvdXQuCisgKi8KK2ludCBSdG1wUENJTWdtdEtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOIFVDSEFSIAkJCVF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAorCUlOIFVJTlQgCQkJU3JjQnVmTGVuKQoreworCVBUWERfU1RSVUMJCXBUeEQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworICAgIFR4RCA9ICpwRGVzdFR4RDsKKyAgICBwVHhEID0gJlR4RDsKKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbHNlCisJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX01HTVQpOworCXBUeEQtPkxhc3RTZWMwID0gMTsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisJcFR4RC0+RE1BRE9ORSA9IDA7CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuLCAwLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLyBJbmNyZWFzZSBUWF9DVFhfSURYLCBidXQgd3JpdGUgdG8gcmVnaXN0ZXIgbGF0ZXIuCisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlciB0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglQSEVBREVSXzgwMl8xMQkJcEhlYWRlciwKKwlJTglQUlhXSV9TVFJVQyAJCXBSeFdJLAorCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAJcFJ4RCkKK3sKKwlQQ0lQSEVSX0tFWSBwV3BhS2V5OworCUlOVCBkQm07CisKKwkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycworCWlmICgvKihwUnhELT5QaHlFcnIpIHx8Ki8gKHBSeEQtPkNyYykpCisJeworCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgorCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCWlmIChkQm0gPD0gLTg3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTgyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTc3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTcyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTY3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTYyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOworCQllbHNlIGlmIChkQm0gPiAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhELT5TREwwICsgMTQpOworCisJLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKKwlpZiAocEhlYWRlciAhPSBOVUxMKQorCXsKKwkJaWYgKHBIZWFkZXItPkZDLlRvRHMpCisJCXsKKwkJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQorCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KKwkvLyBpZiAocFJ4RC0+VTJNID09IDApCisJLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQorCWlmIChwUnhELT5DaXBoZXJFcnIpCisJeworCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCisJCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIG9rIGJ1dCBNSUNFcnIgIikpO30KKwkJZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpCisJCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIEVyciAiKSk7fQorCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoInBSeEQgRVJST1I6IEtleSBub3QgdmFsaWQgIikpOworCisgICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDEpID09IDEpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJWQgKGxlbj0lZCwgTWNhc3Q9JWQsIE15QnNzPSVkLCBXY2lkPSVkLCBLZXlJZD0lZClcbiIsCisJCQlwUnhELT5DaXBoZXJFcnIsCisJCQlwUnhELT5TREwwLAorCQkJcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwKKwkJCXBSeEQtPk15QnNzLAorCQkJcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisJCQlwUnhXSS0+S2V5SW5kZXgpKTsKKworCQkvLworCQkvLyBNSUMgRXJyb3IKKwkJLy8KKwkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKQorCQl7CisJCQlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeFdJLT5LZXlJbmRleF07CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKyAgICAgICAgICAgICAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUU6RkFMU0UpOworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCSAgICBSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKKworICAgICAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMikgPT0gMikgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocEhlYWRlciA9PSBOVUxMKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT2ZmIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KKwlJbnB1dDoKKwkJTGV2ZWwgPSBHVUlSQURJT19PRkYgIDogR1VJIFJhZGlvIE9mZiBtb2RlCisJCUxldmVsID0gRE9UMTFQT1dFUlNBVkUgIDogODAyLjExIHBvd2VyIHNhdmUgbW9kZQorCQlMZXZlbCA9IFJUTVBfSEFMVCAgOiBXaGVuIERpc2FibGUgZGV2aWNlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKKwlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7CisJVUNIQVIJCWksIHRlbXBCQlBfUjMgPSAwOworCUJPT0xFQU4JCWJyYyA9IEZBTFNFLCBDYW5jZWxsZWQ7CisgICAgVUlOVDMyCQlUYlRUVGltZSA9IDA7CisJVUlOVDMyCQlQc1BvbGxUaW1lID0gMCwgTUFDVmFsdWU7CisgICAgVUxPTkcJCUJlYWNvblBlcmlvZFRpbWU7CisgICAgVUlOVDMyCQlSeERtYUlkeCwgUnhDcHVJZHg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gVHhDcHVJZHggPSAlZCwgVHhEbWFJZHggPSAlZC4gUnhDcHVJZHggPSAlZCwgUnhEbWFJZHggPSAlZC5cbiIsIHBBZC0+VHhSaW5nWzBdLlR4Q3B1SWR4LCBwQWQtPlR4UmluZ1swXS5UeERtYUlkeCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgsIHBBZC0+UnhSaW5nLlJ4RG1hSWR4KSk7CisKKyAgICAvLyBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZSeERtYUlkeCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYICwgJlJ4Q3B1SWR4KTsKKwlpZiAoKFJ4RG1hSWR4ID4gUnhDcHVJZHgpICYmICgoUnhEbWFJZHggLSBSeENwdUlkeCkgPiBSWF9SSU5HX1NJWkUvMykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoKFJ4Q3B1SWR4ID49IFJ4RG1hSWR4KSAmJiAoKFJ4Q3B1SWR4IC0gUnhEbWFJZHgpIDwgUlhfUklOR19TSVpFLzMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLCBSeENwdUlkeCwgUnhEbWFJZHgpKTsKKwkJcmV0dXJuOworCX0KKworICAgIC8vIE9uY2UgZ28gaW50byB0aGlzIGZ1bmN0aW9uLCBkaXNhYmxlIHR4IGJlY2F1c2UgZG9uJ3Qgd2FudCB0b28gbWFueSBwYWNrZXRzIGluIHF1ZXVlIHRvIHByZXZlbnQgSFcgc3RvcHMuCisJcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gVFJVRTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJeworCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisKKwkgICAgaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQorCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRCVFRfVElNRVIsICZUYlRUVGltZSk7CisJCQlUYlRUVGltZSAmPSAweDFmZmZmOworCQkJLy8gMDAuIGNoZWNrIGlmIG5lZWQgdG8gZG8gc2xlZXAgaW4gdGhpcyBEVElNIHBlcmlvZC4gICBJZiBuZXh0IGJlYWNvbiB3aWxsIGFycml2ZSB3aXRoaW4gMzBtcyAsIC4uLmRvZXNuJ3QgbmVjZXNzYXJpbHkgc2xlZXAuCisJCQkvLyBUYlRUVGltZSB1aW50ID0gNjR1cywgTEVBRF9USU1FIHVuaXQgPSAxMDI0dXMsIFBzUG9sbFRpbWUgdW5pdCA9IDFtcworCSAgICAgICAgaWYgICgoKDY0KlRiVFRUaW1lKSA8KChMRUFEX1RJTUUqMTAyNCkgKyA0MDAwMCkpICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRiVFRUaW1lID0gMHgleCAsIGdpdmUgdXAgdGhpcyBzbGVlcC4gXG4iLCBUYlRUVGltZSkpOworCSAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCSAgICAgICAgICAgIHBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlQc1BvbGxUaW1lID0gKDY0KlRiVFRUaW1lLSBMRUFEX1RJTUUqMTAyNCkvMTAwMDsKKwkJCQlQc1BvbGxUaW1lIC09IDM7CisKKwkgICAgICAgICAgICBCZWFjb25QZXJpb2RUaW1lID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKjEwMi8xMDA7CisJCQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPiAwKQorCQkJCQlQc1BvbGxUaW1lICs9ICgoVGJ0dE51bVRvTmV4dFdha2VVcCAtMSkgKiBCZWFjb25QZXJpb2RUaW1lKTsKKworCSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgUHNQb2xsVGltZSk7CisJCQl9CisJCX0KKwl9CisKKyAgICAvLyAwLiBEaXNhYmxlIFR4IERNQS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisKKwkvLyAxLiBXYWl0IERNQSBub3QgYnVzeQorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmICgoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCQlSVE1QdXNlY0RlbGF5KDIwKTsKKwkJaSsrOworCX13aGlsZShpIDwgNTApOworCisJaWYgKGkgPj0gNTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETUEga2VlcHMgYnVzeS4gIHJldHVybiBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKKwkJcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCQlyZXR1cm47CisJfQorCisgICAgUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCisgICAgLy8gU2V0IHRvIDFSLgorICAgIHRlbXBCQlBfUjMgPSAocEFkLT5TdGFDZmcuQkJQUjMgJiAweEU3KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKKworCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwl7CisJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJfQorCWVsc2UKKwl7CisJCS8vIE11c3QgdXNpbmcgMjBNSHouCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwl9CisKKyAgICAvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuCisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKKworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKwkvLyBEaXNhYmxlIE1BQyBSeAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMICwgJk1BQ1ZhbHVlKTsKKwlNQUNWYWx1ZSAmPSAweGY3OworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKKworCS8vICAyLiBTZW5kIFNsZWVwIGNvbW1hbmQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCisJLy8gIDItMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkvLyBTdGF0dXMgPSAxIDogc3VjY2VzcywgU3RhdHVzID0gMiwgYWxyZWFkeSBzbGVlcCwgU3RhdHVzID0gMywgTWF5YmUgTUFDIGlzIGJ1c3kgc28gY2FuJ3QgZmluaXNoIHRoaXMgdGFzay4KKwlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisKKyAgICBpZiAoYnJjID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgLy8gdHJ5IGFnYWluCisgICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDAwKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgdW5pdDo0MHVzLgorICAgIAkvL1JUTVB1c2VjRGVsYXkoMjAwKTsKKyAgICAJYnJjID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOworICAgIH0KKworCS8vICAzLiBBZnRlciAweDMwIGNvbW1hbmQgaXMgb2ssIHNlbmQgcmFkaW8gb2ZmIGNvbW1hbmQuIGxvd2J5dGUgPSAwIGZvciBwb3dlciBzYWZlLgorCS8vIElmIDB4MzAgY29tbWFuZCBpcyBub3Qgb2sgdGhpcyB0aW1lLCB3ZSBjYW4gaWdub3JlIDB4MzUgY29tbWFuZC4gSXQgd2lsbCBtYWtlIHN1cmUgbm90IGNhdXNlIGZpcm13YXJlJ3IgcHJvYmxlbS4KKwlpZiAoKExldmVsID09IERPVDExUE9XRVJTQVZFKSAmJiAoYnJjID09IFRSVUUpKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM1LCBQb3dlclJhZGlvT2ZmQ0lELCAwLCAweDAwKTsJLy8gbG93Ynl0ZSA9IDAgbWVhbnMgdG8gZG8gcG93ZXIgc2FmZSwgTk9UIHR1cm4gb2ZmIHJhZGlvLgorCSAJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkgCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCWVsc2UgaWYgKGJyYyA9PSBUUlVFKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM1LCBQb3dlclJhZGlvT2ZmQ0lELCAxLCAweDAwKTsJLy8gbG93Ynl0ZSA9IDAgbWVhbnMgdG8gZG8gcG93ZXIgc2FmZSwgTk9UIHR1cm4gb2ZmIHJhZGlvLgorCSAJLy8gIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKKwkgCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7CisJfQorCisgICAgLy8gV2FpdCBETUEgbm90IGJ1c3kKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlpZiAoRG1hQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMjApOworCQlpKys7CisJfXdoaWxlKGkgPCA1MCk7CisKKwlpZiAoaSA+PSA1MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBSeCBrZWVwcyBidXN5LiAgb24gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICgpXG4iKSk7CisJfQorCS8vIGRpc2FibGUgRE1BIFJ4LgorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisJfQorCisJaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQorCXsKKwkJQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKwkJLy9SVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgOTApOworCisJCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KKwkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCQkvLyAxLiBTZXQgYXV0byB3YWtlIHVwIHRpbWVyLgorCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gTEVBRF9USU1FOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisJfQorCisJLy8gIDQtMS4gSWYgaXQncyB0byBkaXNhYmxlIG91ciBkZXZpY2UuIE5lZWQgdG8gcmVzdG9yZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCisJaWYgKExldmVsID09IFJUTVBfSEFMVCkKKwl7CisJCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQorCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAxKTsKKwl9CisJLy8gIDQuIFNldCBQQ0kgY29uZmlndXJhdGlvbiBTcGFjZSBMaW5rIENvbXRyb2wgZmllbGRzLiAgT25seSBSYWRpbyBPZmYgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uCisJZWxzZQorCXsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOworCX0KKworICAgIHBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gd2FrZSB1cCBtb2RlIGZyb20gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT24gYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiA6IGNhbGwgdGhpcyBmdW5jdGlvbiBpcyBmcm9tIFJhZGlvIE9mZiB0byBSYWRpbyBPbi4gIE5lZWQgdG8gcmVzdG9yZSBQQ0kgaG9zdCB2YWx1ZS4KKwkJTGV2ZWwgPSBvdGhlciB2YWx1ZSA6IG5vcm1hbCB3YWtlIHVwIGZ1bmN0aW9uLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgTGV2ZWwpCit7CisgICAgV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7CisJQk9PTEVBTgkJCQlDYW5jZWxsZWQsIGJydiA9IFRSVUU7CisgICAgVUlOVDMyCQkJICAgIE1BQ1ZhbHVlOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwl7CisJICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKwkJaWYgKChMZXZlbCA9PSBHVUlSQURJT19PRkYpIHx8IChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKKwkJCS8vIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuCisJCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKKwkJfQorCX0KKworICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOworCisJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJYnJ2ID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworICAgIGlmIChicnYpCisgICAgeworICAgIAkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgKERFTEFZSU5UTUFTS3xSeElOVCkpOworICAgIAlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworICAgIAkvLyAzLiBFbmFibGUgVHggRE1BLgorICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisgICAgCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisgICAgICAgIERtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworICAgICAgICAvLyBFYWJsZSBNQUMgUngKKyAgICAJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOworICAgIAlNQUNWYWx1ZSB8PSAweDg7CisgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCAsIE1BQ1ZhbHVlKTsKKworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKyAgICAJaWYgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpCisgICAgCXsKKyAgICAJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorICAgIAkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisgICAgCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgCQl7CisgICAgCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKyAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisgICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgIAkJfQorICAgIAkJZWxzZQorICAgIAkJeworICAgIAkJCS8vIE11c3QgdXNpbmcgMjBNSHouCisgICAgCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisgICAgCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgCQl9CisgICAgCX0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpCit7CisgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKworICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOworCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisgICAgICAgIC8vIFN1cHBvcnQgUENJZSBBZHZhbmNlIFBvd2VyIFNhdmUKKyAgICAJaWYgKGJGcm9tVHggPT0gVFJVRSkKKyAgICAJeworICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisgICAgCQlSVE1QdXNlY0RlbGF5KDMwMDApOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PUFzaWNGb3JjZVdha2V1cD09PWJGcm9tVHhcbiIpKTsKKyAgICAJfQorCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworICAgICAgICBpZiAoUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBET1QxMVBPV0VSU0FWRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgorICAgICAgICAJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisgICAgICAgIAkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgICAgIAl7CisgICAgICAgIAkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKyAgICAgICAgCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisgICAgICAgIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAJfQorICAgICAgICAJZWxzZQorICAgICAgICAJeworICAgICAgICAJCS8vIE11c3QgdXNpbmcgMjBNSHouCisgICAgICAgIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisgICAgICAgIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gUENJLCAyODYwLVBDSWUKKyAgICAgICAgQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAwKTsKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgIH0KKworICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09PT09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwXG4iKSk7Cit9CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCit7CisgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwl7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlyZXR1cm47CisJfQorICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisgICAgeworICAgIAlVTE9ORwlOb3cgPSAwOworICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJLy8gSWYgbGFzdCBzZW5kIE5VTEwgZnJhbSB0aW1lIGlzIHRvbyBjbG9zZSB0byB0aGlzIHJlY2VpdmluZyBiZWFjb24gKHdpdGhpbiA4bXMpLCBkb24ndCBnbyB0byBzbGVlcCBmb3IgdGhpcyBEVE0uCisJCS8vIEJlY2F1c2UgU29tZSBBUCBjYW4ndCBxdWV1aW5nIG91dGdvaW5nIGZyYW1lcyBpbW1lZGlhdGVseS4KKwkJaWYgKCgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyA4KSA+PSBOb3cpICYmIChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSA8PSBOb3cpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1IDogIFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1LiBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKKwkJCXJldHVybjsKKwkJfQorCQllbHNlIGlmICgocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA+IDApICYmICgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpID49IE5vdykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHU6IFJ4Q291bnRTaW5jZUxhc3ROVUxMID0gJWx1ID4gMCBcbiIsIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7CisJCQlyZXR1cm47CisJCX0KKworICAgICAgICBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBET1QxMVBPV0VSU0FWRSwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisgICAgICAgIC8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KKyAgICAgICAgaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKyAgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisgICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7CisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgQXV0b1dha2V1cENmZy5maWVsZC5OdW1vZlNsZWVwaW5nVGJ0dCA9IFRidHROdW1Ub05leHRXYWtlVXAgLSAxOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKyAgICAgICAgQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAwKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tICVzLCBUYnR0TnVtVG9OZXh0V2FrZVVwPSVkIFxuIiwgX19GVU5DVElPTl9fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7CisgICAgfQorICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKworVk9JRCBQc1BvbGxXYWtlRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKyAgICBpZiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcpCisgICAgeworCSAgICBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOworICAgIH0KKyAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitWT0lEICBSYWRpb09uRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOworCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworCQlyZXR1cm47CisJfQorICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwl7CisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworICAgICAgICBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOworCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOworCisJCS8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LgorCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworCQkvLyAzLiBFbmFibGUgVHggRE1BLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KKwkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJeworCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIE11c3QgdXNpbmcgMjBNSHouCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKwkJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCS8vIFNldCBMRUQKKwkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisKKyAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKQorICAgICAgICB7CisgICAgCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKKwl9Cit9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICBpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgCQlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19GVU5DVElPTl9fKSk7CisKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwKKyAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkpKQorICAgIHsKKyAgICAJTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKKworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisgICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKyAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworICAgIAkvLyBFbmFibGUgVHgvUngKKyAgICAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworICAgIAkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkgICAgLy8gU2V0IExFRAorCSAgICBSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKQorICAgIHsKKyAgICAgICAgQk9PTEVBTgkJQ2FuY2VsbGVkOworCisgICAgCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisKKyAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKyAgICB9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIFdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVJTlQzMglpOworCisgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgIAlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19GVU5DVElPTl9fKSk7CisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCS8vIFNldCBSYWRpbyBvZmYgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgIHsKKyAgICAJQk9PTEVBTgkJQ2FuY2VsbGVkOworICAgIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgIAl9CisKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICAgICAgeworICAgICAgICAgICAgQk9PTEVBTiBDYW5jZWxsZWQ7CisgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCisgICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKyAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwMCk7CisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIC8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKKyAgICAgICAgQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworICAgIH0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIERpc2FibGUgVHgvUnggRE1BCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkgICAvLyBkaXNhYmxlIERNQQorCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CSAgIC8vIGFib3J0IGFsbCBUWCByaW5ncworCisKKwkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7CisKKwkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOworCisJLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9d2hpbGUgKGkrKyA8IDEwMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFkZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYwpAQCAtMCwwICsxLDM0MTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitJTlQJU2hvd19TU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4QnVyc3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2hvd19IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0geworCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAorCXtOVUxMLCBOVUxMfQorfTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCisKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyByZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAorCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcJV2lyZWxlc3NNb2RlOworCUlOVAkJc3VjY2VzcyA9IFRSVUU7CisKKwlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKKwkJeworCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCisJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdWNjZXNzID0gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKKwlpZiAoc3VjY2VzcyA9PSBUUlVFKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENoYW5uZWwKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAJSU5UCQlzdWNjZXNzID0gVFJVRTsKKwlVQ0hBUglDaGFubmVsOworCisJQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAorCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJCQkJeworCQkJCQlOX1NldENlbkNoKHBBZCk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJc3VjY2VzcyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWlmIChzdWNjZXNzID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4IHBvd2VyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVHhQb3dlcjsKKwlJTlQgICBzdWNjZXNzID0gRkFMU0U7CisKKwlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChUeFBvd2VyIDw9IDEwMCkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSkKKwl7CisJCWNhc2UgMDogLy9BVVRPCisJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JHUHJvdGVjdGlvbl9Qcm9jOjooQkdQcm90ZWN0aW9uPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4UHJlYW1ibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7CisKKwlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCXN3aXRjaCAoUHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKworCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICAgICBGcmFnVGhyZXNoOworCisJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCXsKKwkJLy9JbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJfQorCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJeworCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeEJ1cnN0OworCisJVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4QnVyc3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBUeEJ1cnN0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBhZ2dyZTsKKworCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChhZ2dyZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChhZ2dyZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBJRUVFODAyMTFILgorICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVMT05HIGllZWU4MDIxMWg7CisKKwlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChpZWVlODAyMTFoID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKwllbHNlIGlmIChpZWVlODAyMTFoID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7CisKKyAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCisgICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyNpZmRlZiBSVDI4NjAKKwlJTlQgaSwgUXVlSWR4PTA7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RDsKKyAgICBQVFhEX1NUUlVDIHBUeEQ7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisJUFJUTVBfTUdNVF9SSU5HCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCVBSVE1QX1JYX1JJTkcJcFJ4UmluZyA9ICZwQWQtPlJ4UmluZzsKKworCWZvcihpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCXsKKwkgICAgcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7CisJICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7CisJICAgIGhleF9kdW1wKCJUeCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7CisJICAgIHByaW50aygicFR4RC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvcihpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJeworCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOworCSAgICBoZXhfZHVtcCgiTWdtdCBEZXNjcmlwdG9yIiwgKGNoYXIgKilwVHhELCAxNik7CisJICAgIHByaW50aygicE1nbXQtPkRNQURPTkUgPSAleFxuIiwgcFR4RC0+RE1BRE9ORSk7CisJfQorCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJICAgIHBSeEQgPSAoUFJUMjhYWF9SWERfU1RSVUMpIHBSeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKwkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKKwkgICAgaGV4X2R1bXAoIlJ4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBSeEQsIDE2KTsKKwkJcHJpbnRrKCJwUnhELT5ERE9ORSA9ICV4XG4iLCBwUnhELT5ERE9ORSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVzZXQgc3RhdGlzdGljcyBjb3VudGVyCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBhcmcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKKworCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCisgICAgSU4gIENIQVIgKnBJblB1dFN0ciwKKyAgICBJTiAgVUNIQVIgc3RyTGVuKQoreworICAgIFVDSEFSIGk9MDsKKworICAgIGZvciAoaT0wOyBpPHN0ckxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChwSW5QdXRTdHJbaV0gPCAweDIxKSB8fAorICAgICAgICAgICAgKHBJblB1dFN0cltpXSA+IDB4N0UpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIFdQQSBLZXkgcHJvY2VzcworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWYJCQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVUNDRVNTCQkJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcykKK3sKKyAgICBORElTXzgwMl8xMV9SQVRFUyBhcnlSYXRlczsKKworICAgIG1lbXNldCgmYXJ5UmF0ZXMsIDB4MDAsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIHN3aXRjaCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBQSFlfMTFBOiAvLyBBIG9ubHkKKyAgICAgICAgICAgIHN3aXRjaCAoUmF0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSA2MDAwMDAwOiAvLzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYzsgLy8gNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDkwMDAwMDA6IC8vOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTIwMDAwMDA6IC8vMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODAwMDAwMDogLy8xOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI0MDAwMDAwOiAvLzI0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MzA7IC8vIDI0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzYwMDAwMDA6IC8vMzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg0ODsgLy8gMzZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDAwMDogLy80OE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDYwOyAvLyA0OE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU182OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU0MDAwMDAwOiAvLzU0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8vQXV0bworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgzMDsgLy8gMjRNYnBzCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgyNDsgLy8gMThNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgxMjsgLy8gOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEhZXzExQkdfTUlYRUQ6IC8vIEIvRyBNaXhlZAorICAgICAgICBjYXNlIFBIWV8xMUI6IC8vIEIgb25seQorICAgICAgICBjYXNlIFBIWV8xMUFCR19NSVhFRDogLy8gQS9CL0cgTWl4ZWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN3aXRjaCAoUmF0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxMDAwMDAwOiAvLzFNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwMjsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIwMDAwMDA6IC8vMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDA0OworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTAwMDAwMDogLy81LjVNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYjsgLy8gNS41TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTEwMDAwMDA6IC8vMTFNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2MDAwMDAwOiAvLzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwYzsgLy8gNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDkwMDAwMDA6IC8vOU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTIwMDAwMDA6IC8vMTJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxODsgLy8gMTJNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODAwMDAwMDogLy8xOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI0MDAwMDAwOiAvLzI0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MzA7IC8vIDI0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzYwMDAwMDA6IC8vMzZNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg0ODsgLy8gMzZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDAwMDogLy80OE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDYwOyAvLyA0OE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU182OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU0MDAwMDAwOiAvLzU0TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8vQXV0bworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKyAgICAgICAgICAgICAgICAgICAgeyAvL0IgT25seQorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHgwYjsgLy8gNS41TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDA0OyAvLyAyTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDAyOyAvLyAxTWJwcworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyAvLyhCL0cpIE1peGVkIG9yIChBL0IvRykgTWl4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgzMDsgLy8gMjRNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgUlRNUFNldERlc2lyZWRSYXRlcyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworfQorCitORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVk9JRAkJCXBCdWYpCit7CisJUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgcEtleTsKKwlVTE9ORwkJCQkJS2V5SWR4OworCU5ESVNfU1RBVFVTIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJQk9PTEVBTiAJYlR4S2V5OyAJCS8vIFNldCB0aGUga2V5IGFzIHRyYW5zbWl0IGtleQorCUJPT0xFQU4gCWJQYWlyd2lzZTsJCS8vIEluZGljYXRlIHRoZSBrZXkgaXMgcGFpcndpc2Uga2V5CisJQk9PTEVBTiAJYktleVJTQzsJCS8vIGluZGljYXRlIHRoZSByZWNlaXZlICBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlLgorCQkJCQkJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgc2V0IGJ5IHRoZSBOSUMuCisJQk9PTEVBTiAJYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIGtleSBpcyBzZXQgYnkgYXV0aGVudGljYXRvci4KKwlJTlQgCQlpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLS0+IFJUTVBXUEFSZW1vdmVLZXlQcm9jXG4iKSk7CisKKwlwS2V5ID0gKFBORElTXzgwMl8xMV9SRU1PVkVfS0VZKSBwQnVmOworCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHhmZjsKKwkvLyBCaXQgMzEgb2YgQWRkLWtleSwgVHggS2V5CisJYlR4S2V5CQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAzMCBvZiBBZGQta2V5IFBhaXJ3aXNlS2V5CisJYlBhaXJ3aXNlCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg0MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCisJYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCisJYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKworCS8vIDEuIElmIGJUeCBpcyBUUlVFLCByZXR1cm4gZmFpbHVyZSBpbmZvcm1hdGlvbgorCWlmIChiVHhLZXkgPT0gVFJVRSkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkvLyAyLiBDaGVjayBQYWlyd2lzZSBLZXkKKwlpZiAoYlBhaXJ3aXNlKQorCXsKKwkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIHBhaXJ3aXNlIGtleXMuCisJCS8vIGIuIElmIG5vdCBicm9hZGNhc3QsIHJlbW92ZSB0aGUgcGFpcndpc2Ugc3BlY2lmaWVkIGJ5IEJTU0lECisJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5Cc3NJZCwgcEtleS0+QlNTSUQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVkKVxuIiwgaSkpOworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiA9IDA7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKWkpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gMy4gR3JvdXAgS2V5CisJZWxzZQorCXsKKwkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIGdyb3VwIGtleXMgaW5kZXhlZAorCQkvLyBiLiBJZiBCU1NJRCBtYXRjaGVkLCBkZWxldGUgdGhlIGdyb3VwIGtleSBpbmRleGVkLgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lbGQpXG4iLCBLZXlJZHgpKTsKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4KTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlbW92ZSBBbGwgV1BBIEtleXMKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBXUEFSZW1vdmVBbGxLZXlzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCisJVUNIQVIgCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVBbGxLZXlzKEF1dGhNb2RlPSVkLCBXZXBTdGF0dXM9JWQpXG4iLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKwkvLyBGb3IgV0VQL0NLSVAsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKKwkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQlyZXR1cm47CisKKwkvLyBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKKwkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXJldHVybjsKKworCS8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIEJTU0lEX1dDSUQpOworCisJLy8gc2V0IGFsbCBzaGFyZWQga2V5IG1vZGUgYXMgbm8tc2VjdXJpdHkuCisJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmVtb3ZlICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnXSwgaSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaSk7CisJfQorCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hhbmdlIE5JQyBQSFkgbW9kZS4gUmUtYXNzb2NpYXRpb24gbWF5IGJlIG5lY2Vzc2FyeS4gcG9zc2libGUgc2V0dGluZ3MKKwkJaW5jbHVkZSAtIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfMTFBLCBhbmQgUEhZXzExQUJHX01JWEVECisKKwlBcmd1bWVudHM6CisJCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcGh5bW9kZSAgLQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldFBoeU1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcgcGh5bW9kZSkKK3sKKwlJTlQgaTsKKwkvLyB0aGUgc2VsZWN0ZWQgcGh5bW9kZSBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgUkYgSUMgZW5jb2RlZCBpbiBFMlBST00KKworCS8vIGlmIG5vIGNoYW5nZSwgZG8gbm90aGluZworCS8qIGJ1ZyBmaXgKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBwaHltb2RlKQorCQlyZXR1cm47CisgICAgKi8KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKFVDSEFSKXBoeW1vZGU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBTZXRQaHlNb2RlIDogUGh5TW9kZT0lZCwgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisjZWxzZQorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU2V0UGh5TW9kZTogY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UsIHVzZSBmaXJzdCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCX0KKworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCXN3aXRjaCAocGh5bW9kZSkgeworCQljYXNlIFBIWV8xMUI6CisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQljYXNlIFBIWV8xMUc6CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXSAgPSAweDBDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMV0gID0gMHgxODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSAgPSAweDMwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzNdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gNDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzldICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTFdID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlicmVhazsKKworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4OEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg5ODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4YjA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsbGVyIGVuc3VyZXMgd2UgaGFzIDgwMi4xMW4gc3VwcG9ydC4KKwkJQ2FsbHMgYXQgc2V0dGluZyBIVCBmcm9tIEFQL1NUQVNldGluZm9ybWF0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcGh5bW9kZSAgLQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKQoreworCS8vVUxPTkcJKnBtY3M7CisJVUlOVDMyCVZhbHVlID0gMDsKKwlVQ0hBUglCQlBWYWx1ZSA9IDA7CisJVUNIQVIJQkJQM1ZhbHVlID0gMDsKKwlVQ0hBUglSeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAorCQkJCQkJCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCQkJCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCisJLy8gRG9uJ3QgemVybyBzdXBwb3J0ZWRIeVBoeSBzdHJ1Y3R1cmUuCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQpKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCBzaXplb2YocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5KSk7CisKKyAgIAlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDA7CisJfQorCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSAzOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IgPSAzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKworCS8vIE1pbW8gcG93ZXIgc2F2ZSwgQS1NU0RVIHNpemUsCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKKworCWlmKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGID0gMTsKKwl9CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAwOworCisJLy8gRGVjaWRlIFJ4IE1DU1NldAorCXN3aXRjaCAoUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4MDA7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlicmVhazsKKworCQljYXNlIDM6IC8vIDMqMworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9ICAweGZmOworCQkJYnJlYWs7CisJfQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgJiYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSApCisJeworCQlwSFRQaHlNb2RlLT5CVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50ID0gMTsKKwl9CisKKwlpZihwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7IC8vIE1DUyAzMgorCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDE7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DQ0ttb2RlaW40MCA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKT8gKEVYVENIQV9CRUxPVyk6IEVYVENIQV9BQk9WRTsKKwkJLy8gU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQM1ZhbHVlKTsKKwkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKKwkJeworCQkJVmFsdWUgfD0gMHgxOworCQkJQkJQM1ZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQorCQl7CisJCQlWYWx1ZSAmPSAweGZlOworCQkJQkJQM1ZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQl9CisKKwkJLy8gVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuCisJCS8vIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8IElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQorCQkJKQorCQl7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQM1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IEVYVENIQV9OT05FOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgorCQl7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCX0KKwl9CisKKwlpZihwSFRQaHlNb2RlLT5TVEJDID09IFNUQkNfVVNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAwOworCX0KKworCisJaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOworCX0KKworCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCisJLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJUTVBTZXRJbmRpdmlkdWFsSFQocEFkLCAwKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKKwlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOworCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKworCWRvCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCQlyZXR1cm47CisJfQorCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKKwlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU183OworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU18wOworCX0KKworCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKKworCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUworCXN3aXRjaCAoVHhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCisJCQl7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAyKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAzKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCisJeworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOworCX0KKworCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKKyAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworICAgIGVsc2UKKwkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgorCisJQXJndW1lbnRzOgorCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3sKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CisKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OworCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKKwlVU0hPUlQJCW9mZnNldDsKKwlVQ0hBUgkJSVZFSVYgPSAwOworCVVTSE9SVAkJV2NpZCA9IDA7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChCc3NJZHggPiBCU1MwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgorCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCisJCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgorCQkJaWYgKHBFbnRyeSAmJiBBREhPQ19PTihwQWQpKQorCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKKwkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQorCQkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlXY2lkID0gQlNTSURfV0NJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlXY2lkID0gTUNBU1RfV0NJRDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZQorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZWxzZSBpZiAoKHBFbnRyeSkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykgJiYKKwkJCQkJKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAorCQkJCSAJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQllbHNlCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCisJLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCS8vIFdQQSBtb2RlCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7CisJfQorCWVsc2UKKwl7CisJCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKKwl9CisKKwkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCisjaWZkZWYgUlQyODYwCisJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQrMywgSVZFSVYpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBXQ0lEICMlZCwgS2V5SW5kZXggIyVkLCBBbGc9JXNcbiIsV2NpZCwgS2V5SWR4LCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglXQ0lEQXR0cmkgPSAweCV4IFxuIiwgIFdDSURBdHRyaSkpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUGFyc2UgZW5jcnlwdGlvbiB0eXBlCitBcmd1bWVudHM6CisgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQoreworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisgICAgICAgIHJldHVybiAiTk9ORSI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorICAgIAlyZXR1cm4gIldFUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCXJldHVybiAiQUVTIjsKKwlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKKyAgICAJcmV0dXJuICJUS0lQQUVTIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworQ0hBUiAqR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQoreworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyAgICAJcmV0dXJuICJPUEVOIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKyAgICAJcmV0dXJuICJTSEFSRUQiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKyAgICAJcmV0dXJuICJBVVRPV0VQIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAJcmV0dXJuICJXUEEiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgIAlyZXR1cm4gIldQQVBTSyI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIAlyZXR1cm4gIldQQU5PTkUiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAJcmV0dXJuICJXUEEyIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgCXJldHVybiAiV1BBMlBTSyI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikKKyAgICAJcmV0dXJuICJXUEExV1BBMiI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKKyAgICAJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7CisKKyAgICAJcmV0dXJuICJVTktOT1ciOworfQorCisjaWYgMSAvLyNpZm5kZWYgVUNPUworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgc2l0ZSBzdXJ2ZXkgcmVzdWx0cworCUFyZ3VtZW50czoKKwkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAJCTEuKSBVSSBuZWVkcyB0byB3YWl0IDQgc2Vjb25kcyBhZnRlciBpc3N1ZSBhIHNpdGUgc3VydmV5IGNvbW1hbmQKKyAgICAgICAgCQkyLikgaXdwcml2IHJhMCBnZXRfc2l0ZV9zdXJ2ZXkKKyAgICAgICAgCQkzLikgVUkgbmVlZHMgdG8gcHJlcGFyZSBhdCBsZWFzdCA0MDk2Ynl0ZXMgdG8gZ2V0IHRoZSByZXN1bHRzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lCUxJTkVfTEVOCSg0KzMzKzIwKzgrMTArOSs3KzMpCS8vIENoYW5uZWwrU1NJRCtCc3NpZCtXZXBTdGF0dXMrQXV0aE1vZGUrU2lnbmFsK1dpcmVzc01vZGUrTmV0d29ya1R5cGUKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCSptc2c7CisJSU5UIAkJaT0wOworCUlOVAkJCVdhaXRDbnQ7CisJSU5UIAkJU3RhdHVzPTA7CisJQ0hBUgkJU3NpZFtNQVhfTEVOX09GX1NTSUQgKzFdOworICAgIElOVCAgICAgICAgIFJzc2kgPSAwLCBtYXhfbGVuID0gTElORV9MRU47CisJVUlOVCAgICAgICAgUnNzaV9RdWFsaXR5ID0gMDsKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgd2lyZWxlc3NfbW9kZTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJm1zZywgc2l6ZW9mKENIQVIpKigoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4pKTsKKworCWlmIChtc2cgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkgLSBtc2cgbWVtb3J5IGFsbG9jIGZhaWwuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQobXNnLCAwICwoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4gKTsKKwltZW1zZXQoU3NpZCwgMCAsKE1BWF9MRU5fT0ZfU1NJRCArMSkpOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNHMlLTMzcyUtMjBzJS04cyUtMTBzJS05cyUtN3MlLTNzXG4iLAorCSAgICAiQ2giLCAiU1NJRCIsICJCU1NJRCIsICJFbmMiLCAiQXV0aCIsICJTaWdhbmwoJSkiLCAiVy1Nb2RlIiwgIiBOVCIpOworCisJV2FpdENudCA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKKwkJT1NfV0FJVCg1MDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQorCXsKKwkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCisJCQlicmVhazsKKworCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCisJCQlicmVhazsKKworCQkvL0NoYW5uZWwKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKKwkJLy9TU0lECisJCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOworCQkvL0JTU0lECisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOworCQkvL0VuY3J5cHRpb24gVHlwZQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7CisJCS8vQXV0aGVudGljYXRpb24gTW9kZQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7CisJCS8vIFJzc2kKKwkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKKwkJaWYgKFJzc2kgPj0gLTUwKQorCQkJUnNzaV9RdWFsaXR5ID0gMTAwOworCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisJCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKKwkJZWxzZSAgICAvLyA8IC04NCBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IDA7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKKwkJLy8gV2lyZWxlc3MgTW9kZQorCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKKwkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKKwkJZWxzZQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7CisJCS8vTmV0d29yayBUeXBlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKKworICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Cit9CisKKworI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpCit7CisJSU5UIGk7CisJUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7CisJY2hhciAqbXNnOworCisJTWFjVGFiLk51bSA9IDA7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisKKwkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOworCisJCQlNYWNUYWIuTnVtICs9IDE7CisJCX0KKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwl9CisKKwltc2cgPSAoQ0hBUiAqKSBrbWFsbG9jKHNpemVvZihDSEFSKSooTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSwgTUVNX0FMTE9DX0ZMQUcpOworCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKKwkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKKwkJCQlicmVhazsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KKwkJfQorCX0KKwkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKKwkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOworCX0KKworCWtmcmVlKG1zZyk7Cit9CisjZW5kaWYgLy8gVUNPUyAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0X0JBU2V0dXBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKy8qCisJVGhlIEJBU2V0dXAgaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisJLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisKKwlpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiAxNSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4XG4iLCBtYWNbMF0sIG1hY1sxXSwKKwkJCQltYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisgICAgCWlmIChwRW50cnkpIHsKKyAgICAgICAgCXByaW50aygiXG5TZXR1cCBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkgICAgICAgIEJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCB0aWQsIDAsIDEwMCwgVFJVRSk7CisgICAgCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgYkJBRGVjbGluZTsKKworCWJCQURlY2xpbmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGJCQURlY2xpbmUgPT0gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwl9CisJZWxzZSBpZiAoYkJBRGVjbGluZSA9PSAxKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JBRGVjbGluZV9Qcm9jOjooQkFEZWNsaW5lPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworLyoKKwlUaGUgQkFPcmlUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkgICAgaWYgKHBFbnRyeSkgeworCSAgICAgICAgcHJpbnRrKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisgICAgICAgIEJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UsIFRSVUUpOworCSAgICB9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmICh0aWQgPiBOVU1fT0ZfVElEKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisJCSAgICBCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRCdzsKKworCUh0QncgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChIdEJ3ID09IEJXXzQwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7CisJZWxzZSBpZiAoSHRCdyA9PSBCV18yMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QndfUHJvYzo6KEh0Qnc9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0TWNzLCBNY3NfdG1wOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCisJCUh0TWNzID0gTWNzX3RtcDsKKwllbHNlCisJCUh0TWNzID0gTUNTX0FVVE87CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBIdE1jczsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoSHRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRTpGQUxTRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihIdE1jcz0lZCwgYkF1dG9UeFJhdGVTd2l0Y2ggPSAlZClcbiIsCisJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpKTsKKworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKSB8fAorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPCBNT0RFX0hUTUlYKSkKKwkJeworCSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSAzKSAmJgorCSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jc10gKiAxMDAwMDAwKSk7CisJCQl9CisJICAgICAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCisJCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDcpICYmCisJICAgICAgICAgICAgCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKKwkJCXsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7CisJCQl9CisJCQllbHNlCisJCQkJYkF1dG9SYXRlID0gVFJVRTsKKworCQkJaWYgKGJBdXRvUmF0ZSkKKwkJCXsKKwkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisJCQl9CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7CisJCX0KKyAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlTZXRDb21tb25IVChwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEdpOworCisJSHRHaSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoIEh0R2kgPT0gR0lfNDAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwllbHNlIGlmICggSHRHaSA9PSBHSV84MDAgKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0R2lfUHJvYzo6KFNob3J0R0k9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgU2l6ZTsKKworCVNpemUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNpemUgPD0wIHx8IFNpemUgPj02NCkKKwl7CisJCVNpemUgPSA4OworCX0KKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IFNpemUtMTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfSHRUeEJBU2l6ZSA6OihUeEJBU2l6ZT0gJWQpXG4iLCBTaXplKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKKwllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKKworCXJldHVybiBUUlVFOworCit9CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IFNUQkNfTk9ORSApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU3RiY19Qcm9jOjooSHRTdGJjPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRIdGNfUHJvYzo6KEh0SHRjPSVkKVxuIixwQWQtPkhUQ0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RXh0Y2hhX1Byb2M6OihIdEV4dGNoYT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKwlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCXsKKwkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJfQorCWVsc2UKKwl7CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCX0KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCYVdpblNpemVfUHJvYzo6KEh0QmFXaW5TaXplPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisJeworCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFJkZ19Qcm9jOjooSHRSZGc9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJSZGcpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRMaW5rQWRhcHRfUHJvYzo6KEh0TGlua0FkYXB0PSVkKVxuIixwQWQtPmJMaW5rQWRhcHQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QXV0b0JhX1Byb2M6OihIdEF1dG9CYT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgbW9kZTsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworICAgIC8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworLyoKKwlUaGUgQkFSZWNUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgbW9kZSB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgbW9kZSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisgICAJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJbW9kZSA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7CisJCWlmIChtb2RlID4gTU1QU19FTkFCTEUpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKTsKKworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKwkJaWYgKHBFbnRyeSkgeworCQkgICAgcHJpbnRrKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKTsKKwkJICAgIFNlbmRQU01QQWN0aW9uKHBBZCwgcEVudHJ5LT5BaWQsIG1vZGUpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCisKK30KKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPD0zICYmIFZhbHVlID49IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gMzsKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNSU1PUFNtb2RlX1Byb2M6OihNSU1PUFMgbW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VHRl9Qcm9jOjooRm9yY2VHRj0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWltb1BzX1Byb2M6OihIdE1pbW9Qcz0lZClcbiIscEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldENvbW1vbkhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU9JRF9TRVRfSFRfUEhZTU9ERQkJU2V0SFQ7CisKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpCisJCXJldHVybiBGQUxTRTsKKworCVNldEhULlBoeU1vZGUgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCVNldEhULlRyYW5zbWl0Tm8gPSAoKFVDSEFSKXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgpOworCVNldEhULkh0TW9kZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworCVNldEhULkV4dE9mZnNldCA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCVNldEhULk1DUyA9IE1DU19BVVRPOworCVNldEhULkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKwlTZXRIVC5TVEJDID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCVNldEhULlNIT1JUR0kgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisKKwlSVE1QU2V0SFQocEFkLCAmU2V0SFQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKwlpZiAoc3RyY21wKGFyZywgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJvZmRtIikgPT0gMCkKKwl7CisJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07CisJfQorCWVsc2UgaWYgKHN0cmNtcChhcmcsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChhcmcsICJjY2siKSA9PSAwKQorCXsKKyAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GaXhlZFR4TW9kZV9Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLCBmaXhfdHhfbW9kZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBSVDI4NjAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCit7CisJc3dpdGNoKGF1dGhNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgorCQkJcmV0dXJuICJPUEVOIjsKKyAgICAgICAgZGVmYXVsdDoKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCQlyZXR1cm4gIldQQVBTSyI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgorCQkJcmV0dXJuICJTSEFSRUQiOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJCXJldHVybiAiV1BBIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorCQkJcmV0dXJuICJXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQkJcmV0dXJuICJXUEEyUFNLIjsKKyAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlyZXR1cm4gIldQQTFXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorCQkJcmV0dXJuICJXUEFOT05FIjsKKwl9Cit9CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKK3sKKwlzd2l0Y2goZW5jcnlNb2RlKQorCXsKKwkgICAgZGVmYXVsdDoKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlyZXR1cm4gIk5PTkUiOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJcmV0dXJuICJXRVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlyZXR1cm4gIkFFUyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCXJldHVybiAiVEtJUEFFUyI7CisJfQorfQorCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKQoreworCUlOVAlTdGF0dXMgPSAwOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCisJeworCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCisJCXsKKwkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KKwkJfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7CisJCXNwcmludGYocEJ1ZiwgIlxuIik7CisJCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworSU5UCVNob3dfU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKKwkJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitJTlQJU2hvd19UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKKwkJCWJyZWFrOworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgorCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQorCXsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOworCQkJYnJlYWs7CisJCWNhc2UgMDogLy9BVVRPCisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNob3dfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOworCX0KKwllbHNlCisJeworICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCisJeworCQljYXNlIEdJXzQwMDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7CisJCQlicmVhazsKKwkJY2FzZSBHSV84MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpCisJeworCQljYXNlIEhUTU9ERV9HRjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0YiKTsKKwkJCWJyZWFrOworCQljYXNlIEhUTU9ERV9NTToKKwkJCXNwcmludGYocEJ1ZiwgIlx0TU0iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCisJeworCQljYXNlIEVYVENIQV9CRUxPVzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVENIQV9BQk9WRToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKKwl7CisJCWNhc2UgQlNTX0FESE9DOgorCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0lORlJBOgorCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0FOWToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7CisJCQlicmVhazsKKwkJY2FzZSBCU1NfTU9OSVRPUjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCisJCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1dlcEtleV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBJTlQJCQkJS2V5SWR4LAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKKwlJTlQJCWluZGV4ID0gQlNTMDsKKworCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKKwlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKKworCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKKyAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQorICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7CisgICAgfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQgCWlkeDsKKwlVQ0hBUglQTUtbMzJdID0gezB9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKKyAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjA3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc2FuaXR5LmMKQEAgLTAsMCArMSwxNjMzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMikKK3sKKyAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7CisKKyAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMikKK3sKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworCit9CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4gKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKKwlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisKKwkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKKworCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAorICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisgICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCisgICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiAqcEVycCwKKyAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKKyAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisgICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKyAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisgICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQorICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKyAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworICAgIENIQVIJCQkJKlB0cjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlDSEFSIAkJCQlUaW1MZW47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKyAgICBVQ0hBUgkJCQlTdWJUeXBlOworICAgIFVDSEFSCQkJCVNhbml0eTsKKyAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OworICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7CisgICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKKworCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAorCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgorCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCisJVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7CisKKyAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjaworICAgIFNhbml0eSA9IDA7CisKKyAgICAqcEF0aW1XaW4gPSAwOworICAgICpwRXJwID0gMDsKKyAgICAqcER0aW1Db3VudCA9IDA7CisgICAgKnBEdGltUGVyaW9kID0gMDsKKyAgICAqcEJjYXN0RmxhZyA9IDA7CisgICAgKnBNZXNzYWdlVG9NZSA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAorICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKKyAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKyAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBSYWxpbmtJZSA9IDA7CisgICAgKnBOZXdDaGFubmVsID0gMDsKKyAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKKyAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCisgICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCisgICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAorCisgICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKKyAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisKKyAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKworCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7CisJcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOworCisgICAgUHRyICs9IFRJTUVTVEFNUF9MRU47CisgICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47CisKKyAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgZWxzZQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCisgICAgICAgIC8vCisgICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisgICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKworCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCisJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOworCisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKKwkJCQkJCXsKKworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9USU06CisgICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbworICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIE9VSSB2ZXJzaW9uLCBmaWx0ZXIgb3V0IG5vbi1zdGFuZGFyZCB1c2FnZQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFJBTElOS19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLypwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPk9jdGV0WzNdICE9IDApCisgICAgICAgIAkJCQkqcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisgICAgICAgIAkJCWVsc2UKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSAweGYwMDAwMDAwOyAvLyBTZXQgdG8gbm9uLXplcm8gdmFsdWUgKGNhbid0IHNldCBiaXQwLTIpIHRvIHJlcHJlc2VudCB0aGlzIGlzIFJhbGluayBDaGlwLiBTbyBhdCBsaW5rdXAsIHdlIHdpbGwgc2V0IHJhbGlua2NoaXAgZmxhZy4KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFRoaXMgSFQgSUUgaXMgYmVmb3JlIElFRUUgZHJhZnQgc2V0IEhUIElFIHZhbHVlLjIwMDYtMDktMjggYnkgSmFuLgorCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfSU5GT19FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IEVEQ0EgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQkVdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXSA9IDM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0gQ1dfTUlOX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICA9IDk2OyAgIC8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVk9dICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSA9IENXX01JTl9JTl9CSVRTLTI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXSA9IENXX01BWF9JTl9CSVRTLTE7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dICA9IDQ4OyAgIC8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIFNjYW5UYWIuIFdlIHNob3VsZCByZXBvcnQgYXMgaXMuIEFuZCBmaWx0ZXIgb3V0IHVuc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHJhdGVzIGluIE1sbWVBdXguCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcworICAgICAgICAgICAgICAgICAgICAvLyBSVE1QQ2hlY2tSYXRlcyhwQWQsIEV4dFJhdGUsIHBFeHRSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVJQOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6CisgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4CisgICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAzNTAgdXNlZCBsZW5ndGggYXMgMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDEyWFggdXNlZCBsZW5ndGggYXMgMzAKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisgICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFdQQTIgJiA4MDIuMTFpIFJTTgorICAgICAgICAgICAgY2FzZSBJRV9SU046CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gT1VJIGZvciB2ZXJzaW9uIGFueW1vcmUsIGNoZWNrIHRoZSBncm91cCBjaXBoZXIgT1VJIGJlZm9yZSBjb3B5aW5nCisgICAgICAgICAgICAgICAgaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgorICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCWNhc2UgSUVfQ09VTlRSWToKKwkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCisJCXsKKwkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQorCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOworCQkJZWxzZQorCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOworCQkJU2FuaXR5IHw9IDB4NDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChTYW5pdHkgIT0gMHg3KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisKK30KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCisJUmV0dXJuOgorCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAJKlJlZ0NsYXNzKQoreworCUNIQVIJCQkJKlB0cjsKKwlQRlJBTUVfODAyXzExCQlwRnJhbWU7CisJUEVJRF9TVFJVQ1QJCQlwRWlkOworCVVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKwkqUmVnQ2xhc3MgPSAwOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKwkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisJLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKKworCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKwkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorCXsKKwkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKKwkJCQlpZihwRWlkLT5MZW4gPiAwKQorCQkJCXsKKwkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KKworCXJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKworCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKwkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CisKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKKwkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQorCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVUNIQVIgQ2hhbm5lbFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBjaGFubmVsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkgKyspCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBBbGcsCisgICAgT1VUIFVTSE9SVCAqcFNlcSwKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIENIQVIgKnBDaGxnVGV4dCkKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCisgICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgfHwgKCpwQWxnID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBBbGcpCit7CisgICAgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOworICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKKyAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisKKyAgICBpZiAoKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8KCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgIAkpICYmCisgICAgICAgICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUF1dGhSZXFTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCit7CisgICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKKyAgICBDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsgICAgICAgICAgICAgICAgICAgLy8gQVAgYWRkcmVzcworICAgICpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSBpbmZvCisgICAgKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2FuaXR5IGNoZWNrIE5ldHdvcmtUeXBlICgxMWIsIDExZyBvciAxMWEpCisKKwlBcmd1bWVudHM6CisJCXBCc3MgLSBQb2ludGVyIHRvIEJTUyB0YWJsZS4KKworCVJldHVybiBWYWx1ZToKKyAgICAgICAgTmRpczgwMl8xMURTIC4uLi4uLi4oMTFiKQorICAgICAgICBOZGlzODAyXzExT0ZETTI0Li4uLigxMWcpCisgICAgICAgIE5kaXM4MDJfMTFPRkRNNS4uLi4uKDExYSkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisgICAgSU4gUEJTU19FTlRSWSBwQnNzKQoreworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKKwlVQ0hBUgkJCQkJCXJhdGUsIGk7CisKKwlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKKworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQorCXsKKwkJLy8KKwkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgorCQkvLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQorCQl7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCS8vCisJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgorCQkvLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKKwkJCXsKKwkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0CisJCQkJCS8vCisJCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OworCX0KKworICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKyAgICB9CisKKwlyZXR1cm4gTmV0V29ya1R5cGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV1BBIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpCit7CisJVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7CisJQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7CisJS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKKwlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOworCisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKwlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKKwlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8vIDAuIENoZWNrIE1zZ1R5cGUKKwlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKKyAJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkJLy8gRm9yIHN1cHBsaWNhbnQKKyAgICB7CisgICAgCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgorCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKyAJfQorCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKKwl7CisJCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKKyAgICAJaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCisgICAgCXsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKyAgICAJfQorCX0KKworCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KKwlpZiAoYlJlcGxheURpZmYpCisJeworCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJfQorCisJCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgICAgIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQkvLyBUS0lQCisgICAgICAgIHsKKyAgICAgICAgICAgIGhtYWNfbWQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCS8vIEFFUworICAgICAgICB7CisgICAgICAgICAgICBITUFDX1NIQTEoKFBVQ0hBUilwTXNnLCBNc2dMZW4sIHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKyAgICAgICAgeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQkJfQorCisJCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCX0KKworCS8vIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0CisJLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIHVuLWVuY3J5cHRlZC4KKwkvLyBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLgorCWlmIChwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwKQorCXsKKwkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXsKKwkJCWlmKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlOVCAJaTsKKwkJCQlVQ0hBUiAgIEtleVszMl07CisJCQkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQkJfQorCisJCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OworCisJCX0KKwkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLy8gUGFyc2UgS2V5IERhdGEgZmllbGQgdG8KKwkJLy8gMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKQorCQkvLyAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMgorCQkvLyAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKQorCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSwgR3JvdXBLZXlJbmRleCwgTXNnVHlwZSwgYldQQTIsIHBFbnRyeSkpCisJCXsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9ETFNfUkVRX1NUUlVDVCAqKU1zZzsKKworCSpwRExTID0gcEluZm8tPnBETFM7CisJKnBSZWFzb24gPSBwSW5mby0+UmVhc29uOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKwlPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisJQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcENhcGFiaWxpdHlJbmZvCT0gMDsKKyAgICAqcERsc1RpbWVvdXQJPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKwkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCVBFSURfU1RSVUNUICBlaWRfcHRyOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwU3RhdHVzCQk9IDA7CisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisJLy8gZ2V0IHN0YXR1cyBjb2RlIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisJaWYgKHBTdGF0dXMgPT0gMCkKKwl7CisJICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwkgICAgUHRyICs9IDI7CisJfQorCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIHN0YXR1cyBjb2RlICsgREEgKyBTQSArIGNhcGFiaWxpdHkKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKKworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OworCQkJCQlSYXRlc1swXSA9IDB4ODI7CisJCQkJCVJhdGVzWzFdID0gMHg4NDsKKwkJCQkJUmF0ZXNbMl0gPSAweDhiOworCQkJCQlSYXRlc1szXSA9IDB4OTY7CisJCQkJCVJhdGVzWzRdID0gMHgxMjsKKwkJCQkJUmF0ZXNbNV0gPSAweDI0OworCQkJCQlSYXRlc1s2XSA9IDB4NDg7CisJCQkJCVJhdGVzWzddID0gMHg2YzsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0hUX0NBUDoKKwkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIENIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBSZWFzb24JPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTQxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NJWkUJMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU0laRQk0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJCQkvLyAxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NJWkUJMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCQkJLy8gMyw0LDUsNiw3LDgsOQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NJWkUJNworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJCQkvLyA1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKKworLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KK1VDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OworVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworCisvL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgorVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKKwkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCisJCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOworCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisKKwkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCisJCXsKKwkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bSAhPSAwKQorCQl7CisJCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKwkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJeworCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKKwkJCQl7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwkJCQkJfQorCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCX0KKwkJCWluZGV4ICs9IG51bTsKKwkJfQorCX0KKworCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworI2lmZGVmIERCRworCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5CisJCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAorCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKKwkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KKwlSZXR1cm46CisJCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCisJTm90ZToKKwkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQoreworCWludCBpOworCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0X2NoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCisJCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwlSZXR1cm46CisJCU5vbmUKKwlOb3RlOgorCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQorCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCisJCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQorCisJICAgV2Ugc3VwcG9ydGVkCisJCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCisJCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQorCisJCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgorCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3sKKwkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KKwkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKKwkJcmV0dXJuOworCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKK30KKworQ0hBUglDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVTSE9SVCAgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkmJiAoSU5GUkFfT04ocEFkKQorCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLworCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJCS8vCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJCXsKKwkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCisJCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCX0KKwllbHNlCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCS8vIEJCUCBhbmQgUkYgYXJlIG5vdCBhY2Nlc3NpYmxlIGluIFBTIG1vZGUsIHdlIGhhcyB0byB3YWtlIHRoZW0gdXAgZmlyc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKworCQkJLy8gbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OCisJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIFRSVUUpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCisJCQl7CisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKwkJCQl7CisJCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCQl9CisJCQl9CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQkJLy8gY2FycmllciBkZXRlY3Rpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJeworCQkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBNSU5fQ0hBTk5FTF9USU1FOworCQkJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy9HbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikKKwkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKSAmJiAoKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSA9PSBSRUdJT05fMzFfQkdfQkFORCkpCisJCXsKKwkJCVNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOworCQl9CisKKwkJLy8gV2UgbmVlZCB0byBzaG9ydGVuIGFjdGl2ZSBzY2FuIHRpbWUgaW4gb3JkZXIgZm9yIFdaQyBjb25uZWN0IGlzc3VlCisJCS8vIENobmFnZSB0aGUgY2hhbm5lbCBzY2FuIHRpbWUgZm9yIENJU0NPIHN0dWZmIGJhc2VkIG9uIGl0cyBJQVBQIGFubm91bmNlbWVudAorCQlpZiAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgRkFTVF9BQ1RJVkVfU0NBTl9USU1FKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJZWxzZSBpZiAoKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAorCQkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lIDwgMjUpCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAqIDIpOworCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWVsc2UgLy8gbXVzdCBiZSBTQ0FOX1BBU1NJVkUgb3IgU0NBTl9BQ1RJVkUKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCisJCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgU2NhblRpbWVJbjVnQ2hhbm5lbCk7CisJCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUlOX0NIQU5ORUxfVElNRSk7CisJCQl9CisJCQllbHNlCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNQVhfQ0hBTk5FTF9USU1FKTsKKwkJfQorCisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKSB8fAorCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSkKKwkJeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFNjYW5OZXh0Q2hhbm5lbCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgaWYgYWN0aXZlIHNjYW4gaXMgaW4gZWZmZWN0LgorCQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgfHwgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQkJKQorCQkJCVNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKwkJCWVsc2UKKwkJCQlTc2lkTGVuID0gMDsKKworCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZExlbiwKKwkJCQkJCQkgIFNzaWRMZW4sCQkJICAgICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLCAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJVUxPTkcJVG1wOworCQkJCVVDSEFSCUh0TGVuOworCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiArIDQ7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW47CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQkJCX0KKwkJCQlGcmFtZUxlbiArPSBUbXA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwID09IDEpCisJCQkJeworCQkJCQlVTE9ORwkJVG1wOworCQkJCQlIdExlbiA9IDE7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJICAxLAkJCQkJJkV4dEh0Q2FwSWUsCisJCQkJCQkJCQkgIDEsCQkJCQkmSHRMZW4sCisJCQkJCQkJCQkgIDEsICAgICAgICAgIAkJCSZwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkLAorCQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisKKwkJLy8gRm9yIFNDQU5fQ0lTQ09fUEFTU0lWRSwgZG8gbm90aGluZyBhbmQgc2lsZW50bHkgd2FpdCBmb3IgYmVhY29uIG9yIG90aGVyIHByb2JlIHJlcG9uc2UKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNDQU5fTElTVEVOOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJfQorfQorCitWT0lEIE1ndFByb2JSZXFNYWNIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisJSU4gVUNIQVIgU3ViVHlwZSwKKwlJTiBVQ0hBUiBUb0RzLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBCc3NpZCkKK3sKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOworCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7CisJaWYgKFN1YlR5cGUgPT0gU1VCVFlQRV9BQ0spCisJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzMzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTAsMCArMSwxNjA2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKKwlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorLy8gV1BBIE9VSQorVUNIQVIJCU9VSV9XUEFfTk9ORV9BS01bNF0JCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDB9OworVUNIQVIgICAgICAgT1VJX1dQQV9WRVJTSU9OWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBX1RLSVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OworVUNIQVIgICAgICAgT1VJX1dQQV9DQ01QWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA0fTsKK1VDSEFSICAgICAgIE9VSV9XUEFfODAyMVhfQUtNWzRdCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9QU0tfQUtNWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMn07CisvLyBXUEEyIE9VSQorVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQNDBbNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1RLSVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OworVUNIQVIgICAgICAgT1VJX1dQQTJfQ0NNUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBMl84MDIxWF9BS01bNF0gICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CisvLyBNU0EgT1VJCitVQ0hBUiAgIAlPVUlfTVNBXzgwMjFYX0FLTVs0XSAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKK1VDSEFSICAgCU9VSV9NU0FfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDA2fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoZSBwc2V1ZG8tcmFuZG9tIGZ1bmN0aW9uKFBSRikgdGhhdCBoYXNoZXMgdmFyaW91cyBpbnB1dHMgdG8KKwkJZGVyaXZlIGEgcHNldWRvLXJhbmRvbSB2YWx1ZS4gVG8gYWRkIGxpdmVuZXNzIHRvIHRoZSBwc2V1ZG8tcmFuZG9tCisJCXZhbHVlLCBhIG5vbmNlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGlucHV0cy4KKworCQlJdCBpcyB1c2VkIHRvIGdlbmVyYXRlIFBUSywgR1RLIG9yIHNvbWUgc3BlY2lmaWMgcmFuZG9tIHZhbHVlLgorCisJQXJndW1lbnRzOgorCQlVQ0hBUgkqa2V5LAkJLQl0aGUga2V5IG1hdGVyaWFsIGZvciBITUFDX1NIQTEgdXNlCisJCUlOVAkJa2V5X2xlbgkJLQl0aGUgbGVuZ3RoIG9mIGtleQorCQlVQ0hBUgkqcHJlZml4CQktCWEgcHJlZml4IGxhYmVsCisJCUlOVAkJcHJlZml4X2xlbgktCXRoZSBsZW5ndGggb2YgdGhlIGxhYmVsCisJCVVDSEFSCSpkYXRhCQktCWEgc3BlY2lmaWMgZGF0YSB3aXRoIHZhcmlhYmxlIGxlbmd0aAorCQlJTlQJCWRhdGFfbGVuCS0JdGhlIGxlbmd0aCBvZiBhIHNwZWNpZmljIGRhdGEKKwkJSU5UCQlsZW4JCQktCXRoZSBvdXRwdXQgbGVuZ2h0CisKKwlSZXR1cm4gVmFsdWU6CisJCVVDSEFSCSpvdXRwdXQJCS0JdGhlIGNhbGN1bGF0ZWQgcmVzdWx0CisKKwlOb3RlOgorCQk4MDIuMTFpLTIwMDQJQW5uZXggSC4zCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVBSRigKKwlJTglVQ0hBUgkqa2V5LAorCUlOCUlOVAkJa2V5X2xlbiwKKwlJTglVQ0hBUgkqcHJlZml4LAorCUlOCUlOVAkJcHJlZml4X2xlbiwKKwlJTglVQ0hBUgkqZGF0YSwKKwlJTglJTlQJCWRhdGFfbGVuLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCUlOVAkJbGVuKQoreworCUlOVAkJaTsKKyAgICBVQ0hBUiAgICppbnB1dDsKKwlJTlQJCWN1cnJlbnRpbmRleCA9IDA7CisJSU5UCQl0b3RhbF9sZW47CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIGlucHV0CisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmaW5wdXQsIDEwMjQpOworCisgICAgaWYgKGlucHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFQUkY6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisJLy8gR2VuZXJhdGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBwcmVmaXgsIHByZWZpeF9sZW4pOworCisJLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCisJaW5wdXRbcHJlZml4X2xlbl0gPQkwOworCisJLy8gQ29uY2F0ZW5hdGUgc3BlY2lmaWMgZGF0YQorCU5kaXNNb3ZlTWVtb3J5KCZpbnB1dFtwcmVmaXhfbGVuICsgMV0sIGRhdGEsIGRhdGFfbGVuKTsKKwl0b3RhbF9sZW4gPQlwcmVmaXhfbGVuICsgMSArIGRhdGFfbGVuOworCisJLy8gQ29uY2F0ZW5hdGUgYSBzaW5nbGUgb2N0ZXQgY29udGFpbmluZyAwCisJLy8gVGhpcyBvY3RldCBzaGFsbCBiZSB1cGRhdGUgbGF0ZXIKKwlpbnB1dFt0b3RhbF9sZW5dID0gMDsKKwl0b3RhbF9sZW4rKzsKKworCS8vIEl0ZXJhdGUgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHQgYnkgaG1hYy1zaGEtMQorCS8vIFRoZW4gY29uY2F0ZW5hdGUgdG8gbGFzdCByZXN1bHQKKwlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCisJeworCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOworCQljdXJyZW50aW5kZXggKz0JMjA7CisKKwkJLy8gdXBkYXRlIHRoZSBsYXN0IG9jdGV0CisJCWlucHV0W3RvdGFsX2xlbiAtIDFdKys7CisJfQorICAgIG9zX2ZyZWVfbWVtKE5VTEwsIGlucHV0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUl0IHV0aWxpemVzIFBSRi0zODQgb3IgUFJGLTUxMiB0byBkZXJpdmUgc2Vzc2lvbi1zcGVjaWZpYyBrZXlzIGZyb20gYSBQTUsuCisJCUl0IHNoYWxsIGJlIGNhbGxlZCBieSA0LXdheSBoYW5kc2hha2UgcHJvY2Vzc2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkIAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJUE1LCQktCXBvaW50ZXIgdG8gUE1LCisJCUFOb25jZQktCXBvaW50ZXIgdG8gQU5vbmNlCisJCUFBCQktCXBvaW50ZXIgdG8gQXV0aGVudGljYXRvciBBZGRyZXNzCisJCVNOb25jZQktCXBvaW50ZXIgdG8gU05vbmNlCisJCVNBCQktCXBvaW50ZXIgdG8gU3VwcGxpY2FudCBBZGRyZXNzCisJCWxlbgkJLQlpbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIFBUSyAob2N0ZXQpCisKKwlSZXR1cm4gVmFsdWU6CisJCU91dHB1dAkJcG9pbnRlciB0byB0aGUgUFRLCisKKwlOb3RlOgorCQlSZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCA4LjUuMS4yCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFdwYUNvdW50UFRLKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCSpQTUssCisJSU4JVUNIQVIJKkFOb25jZSwKKwlJTglVQ0hBUgkqQUEsCisJSU4JVUNIQVIJKlNOb25jZSwKKwlJTglVQ0hBUgkqU0EsCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JVUlOVAlsZW4pCit7CisJVUNIQVIJY29uY2F0ZW5hdGlvbls3Nl07CisJVUlOVAlDdXJyUG9zID0gMDsKKwlVQ0hBUgl0ZW1wWzMyXTsKKwlVQ0hBUglQcmVmaXhbXSA9IHsnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCisJCQkJCQknZScsICd4JywgJ3AnLCAnYScsICduJywgJ3MnLCAnaScsICdvJywgJ24nfTsKKworCS8vIGluaXRpYXRlIHRoZSBjb25jYXRlbmF0aW9uIGlucHV0CisJTmRpc1plcm9NZW1vcnkodGVtcCwgc2l6ZW9mKHRlbXApKTsKKwlOZGlzWmVyb01lbW9yeShjb25jYXRlbmF0aW9uLCA3Nik7CisKKwkvLyBHZXQgc21hbGxlciBhZGRyZXNzCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgQUEsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoY29uY2F0ZW5hdGlvbiwgU0EsIDYpOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBsYXJnZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTQSwgNik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQUEsIDYpOworCisJLy8gc3RvcmUgdGhlIGxhcmdlciBtYWMgYWRkcmVzcyBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBvZgorCS8vIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJTmRpc01vdmVNZW1vcnkodGVtcCwgJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIE1BQ19BRERSX0xFTik7CisJQ3VyclBvcyArPSA2OworCisJLy8gR2V0IHNtYWxsZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJLy8gR2V0IGxhcmdlciBOb25jZQorCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOworCUN1cnJQb3MgKz0gMzI7CisKKwloZXhfZHVtcCgiY29uY2F0ZW5hdGlvbj0iLCBjb25jYXRlbmF0aW9uLCA3Nik7CisKKwkvLyBVc2UgUFJGIHRvIGdlbmVyYXRlIFBUSworCVBSRihQTUssIExFTl9NQVNURVJfS0VZLCBQcmVmaXgsIDIyLCBjb25jYXRlbmF0aW9uLCA3Niwgb3V0cHV0LCBsZW4pOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlHZW5lcmF0ZSByYW5kb20gbnVtYmVyIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorCQltYWNBZGRyCS0JcG9pbnRlciB0byBsb2NhbCBNQUMgYWRkcmVzcworCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKwkJODAyLjFpaS0yMDA0ICBBbm5leCBILjUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJR2VuUmFuZG9tKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJKm1hY0FkZHIsCisJT1VUCVVDSEFSCQkJKnJhbmRvbSkKK3sKKwlJTlQJCWksIGN1cnI7CisJVUNIQVIJbG9jYWxbODBdLCBLZXlDb3VudGVyWzMyXTsKKwlVQ0hBUglyZXN1bHRbODBdOworCVVMT05HCUN1cnJlbnRUaW1lOworCVVDSEFSCXByZWZpeFtdID0geydJJywgJ24nLCAnaScsICd0JywgJyAnLCAnQycsICdvJywgJ3UnLCAnbicsICd0JywgJ2UnLCAncid9OworCisJLy8gWmVybyB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgorCU5kaXNaZXJvTWVtb3J5KHJlc3VsdCwgODApOworCU5kaXNaZXJvTWVtb3J5KGxvY2FsLCA4MCk7CisJTmRpc1plcm9NZW1vcnkoS2V5Q291bnRlciwgMzIpOworCisJZm9yCShpID0gMDsJaSA8CTMyOwlpKyspCisJeworCQkvLyBjb3B5IHRoZSBsb2NhbCBNQUMgYWRkcmVzcworCQlDT1BZX01BQ19BRERSKGxvY2FsLCBtYWNBZGRyKTsKKwkJY3VyciA9CU1BQ19BRERSX0xFTjsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJkN1cnJlbnRUaW1lKTsKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJkN1cnJlbnRUaW1lLAlzaXplb2YoQ3VycmVudFRpbWUpKTsKKwkJY3VyciArPQlzaXplb2YoQ3VycmVudFRpbWUpOworCisJCS8vIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdAorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICByZXN1bHQsIDMyKTsKKwkJY3VyciArPQkzMjsKKworCQkvLyBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZpLCAgMik7CisJCWN1cnIgKz0JMjsKKworCQkvLyBjYWxjdWxhdGUgdGhlIHJlc3VsdAorCQlQUkYoS2V5Q291bnRlciwgMzIsIHByZWZpeCwxMiwgbG9jYWwsIGN1cnIsIHJlc3VsdCwgMzIpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KHJhbmRvbSwgcmVzdWx0LAkzMik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBjaXBoZXIgc3VpdGUgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJCWJNaXhDaXBoZXIJLQlhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGNpcGhlciBhbmQgZ3JvdXAKKwkJCQkJCWNpcGhlciBhcmUgdGhlIHNhbWUgb3Igbm90CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2lwaGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlXZXBTdGF0dXMsCisJSU4JQk9PTEVBTgkJCWJNaXhDaXBoZXIsCisJSU4JVUNIQVIJCQlGbGV4aWJsZUNpcGhlciwKKwlPVVQJUFVDSEFSCQkJcFJzbkllLAorCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQoreworCVVDSEFSCVBhaXJ3aXNlQ250OworCisJKnJzbl9sZW4gPSAwOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJUlNOSUUyCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFMiopcFJzbkllOworCisJCS8vIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEKKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKyAgICAgICAgc3dpdGNoIChXZXBTdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOworCQkJCWVsc2UKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX0NDTVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBUS0lQLUFFUyBtaXggbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKworCQkJCVBhaXJ3aXNlQ250ID0gMTsKKwkJCQkvLyBJbnNlcnQgV1BBMiBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQkJeworICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJCQlQYWlyd2lzZUNudCA9IDI7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9DQ01QLCA0KTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKKwkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKKyAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKwkJc3dpdGNoIChXZXBTdGF0dXMpCisJCXsKKwkJCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBBS00gc3VpdGUgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorICAgIAlBdXRoTW9kZQktCWluZGljYXRlIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBSVE1QSW5zZXJ0UnNuSWVBS00oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlFbGVtZW50SUQsCisJSU4JVUlOVAkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05JRV9BVVRICQkqcFJzbmllX2F1dGg7CisKKwlwUnNuaWVfYXV0aCA9IChSU05JRV9BVVRIKikocFJzbkllICsgKCpyc25fbGVuKSk7CisKKwkvLyBkZWNpZGUgV1BBMiBvciBXUEExCisJaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCisJeworCQlzd2l0Y2ggKEF1dGhNb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyXzgwMjFYX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfUFNLX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6CisgICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX05PTkVfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCX0KKworCXBSc25pZV9hdXRoLT5hY291bnQgPSBjcHUybGUxNihwUnNuaWVfYXV0aC0+YWNvdW50KTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTklFX0FVVEgpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2FwYWJpbGl0eSBpbiBSU04tSUUuCisJCUl0IG9ubHkgc2hhbGwgYmUgY2FsbGVkIGJ5IFJUTVBNYWtlUlNOSUUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBSVE1QSW5zZXJ0UnNuSWVDYXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQlFbGVtZW50SUQsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlPVVQJUFVDSEFSCQkJcFJzbkllLAorCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQoreworCVJTTl9DQVBBQklMSVRJRVMgICAgKnBSU05fQ2FwOworCisJLy8gaXQgY291bGQgYmUgaWdub3JlZCBpbiBXUEExIG1vZGUKKwlpZiAoRWxlbWVudElEID09IFdwYUllKQorCQlyZXR1cm47CisKKwlwUlNOX0NhcCA9IChSU05fQ0FQQUJJTElUSUVTKikocFJzbkllICsgKCpyc25fbGVuKSk7CisKKworCXBSU05fQ2FwLT53b3JkID0gY3B1MmxlMTYocFJTTl9DYXAtPndvcmQpOworCisJKCpyc25fbGVuKSArPSBzaXplb2YoUlNOX0NBUEFCSUxJVElFUyk7CS8vIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aAorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIFJTTiBJRSBjb250ZXh0LiBJdCBpcyBub3QgaW5jbHVkZWQgZWxlbWVudC1JRCBhbmQgbGVuZ3RoLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBNYWtlUlNOSUUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKKwlJTglVQ0hBUgkJCWFwaWR4KQoreworCVBVQ0hBUgkJcFJzbkllID0gTlVMTDsJCQkvLyBwcmltYXJ5IFJTTklFCisJVUNIQVIgCQkqcnNuaWVsZW5fY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmltYXJ5IFJTTklFCisJVUNIQVIJCSpyc25pZWxlbl9leF9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZGFyeSBSU05JRQorCVVDSEFSCQlQcmltYXJ5UnNuaWU7CisJQk9PTEVBTgkJYk1peENpcGhlciA9IEZBTFNFOwkvLyBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgYW5kIGdyb3VwIGNpcGhlciBhcmUgZGlmZmVyZW50CisJVUNIQVIJCXBfb2Zmc2V0OworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCUZsZXhpYmxlQ2lwaGVyID0gTUlYX0NJUEhFUl9OT1RVU0U7CS8vIGl0IHByb3ZpZGUgdGhlIG1vcmUgZmxleGlibGUgY2lwaGVyIGNvbWJpbmF0aW9uIGluIFdQQS1XUEEyIGFuZCBUS0lQQUVTIG1vZGUKKworCXJzbmllbGVuX2N1cl9wID0gTlVMTDsKKwlyc25pZWxlbl9leF9jdXJfcCA9IE5VTEw7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisJCQl7CisJCQkJaWYgKEF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJeworCQkJCS8vIFN1cHBvcnQgV1BBUFNLIG9yIFdQQTJQU0sgaW4gU1RBLUluZnJhIG1vZGUKKwkJCQkvLyBTdXBwb3J0IFdQQU5vbmUgaW4gU1RBLUFkaG9jIG1vZGUKKwkJCQlpZiAoKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT4gUlRNUE1ha2VSU05JRShTVEEpXG4iKSk7CisKKwkJCS8vIFplcm8gUlNOSUUgY29udGV4dAorCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJCS8vIFBvaW50ZXIgdG8gUlNOSUUKKwkJCXJzbmllbGVuX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJCXBSc25JZSA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKKworCQkJYk1peENpcGhlciA9IHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXI7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBpbmRpY2F0ZSBwcmltYXJ5IFJTTklFIGFzIFdQQSBvciBXUEEyCisJaWYgKChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpIHx8CisJCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCVByaW1hcnlSc25pZSA9IFdwYUllOworCWVsc2UKKwkJUHJpbWFyeVJzbmllID0gV3BhMkllOworCisJeworCQkvLyBCdWlsZCB0aGUgcHJpbWFyeSBSU05JRQorCQkvLyAxLiBpbnNlcnQgY2lwaGVyIHN1aXRlCisJCVJUTVBJbnNlcnRSc25JZUNpcGhlcihwQWQsIFByaW1hcnlSc25pZSwgV2VwU3RhdHVzLCBiTWl4Q2lwaGVyLCBGbGV4aWJsZUNpcGhlciwgcFJzbkllLCAmcF9vZmZzZXQpOworCisJCS8vIDIuIGluc2VydCBBS00KKwkJUlRNUEluc2VydFJzbkllQUtNKHBBZCwgUHJpbWFyeVJzbmllLCBBdXRoTW9kZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAzLiBpbnNlcnQgY2FwYWJpbGl0eQorCQlSVE1QSW5zZXJ0UnNuSWVDYXAocEFkLCBQcmltYXJ5UnNuaWUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisJfQorCisJLy8gNC4gdXBkYXRlIHRoZSBSU05JRSBsZW5ndGgKKwkqcnNuaWVsZW5fY3VyX3AgPSBwX29mZnNldDsKKworCWhleF9kdW1wKCJUaGUgcHJpbWFyeSBSU05JRSIsIHBSc25JZSwgKCpyc25pZWxlbl9jdXJfcCkpOworCisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlDaGVjayB3aGV0aGVyIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAgZnJhbWUuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJcEVudHJ5CQkJLQlwb2ludGVyIHRvIGFjdGl2ZSBlbnRyeQorCQlwRGF0YQkJCS0JdGhlIHJlY2VpdmVkIGZyYW1lCisJCURhdGFCeXRlQ291bnQgCS0JdGhlIHJlY2VpdmVkIGZyYW1lJ3MgbGVuZ3RoCisJCUZyb21XaGljaEJTU0lECS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAorCisgICAgUmV0dXJuOgorICAgICAgICAgVFJVRSAJCQktCVRoaXMgZnJhbWUgaXMgRUFQIGZyYW1lCisgICAgICAgICBGQUxTRSAJCQktCW90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBEYXRhLAorICAgIElOIFVMT05HICAgICAgICAgICAgRGF0YUJ5dGVDb3VudCwKKwlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVMT05HCUJvZHlfbGVuOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCisKKyAgICBpZihEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworCS8vIFNraXAgTExDIGhlYWRlcgorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAorICAgICAgICAvLyBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTAorICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpCisgICAgeworICAgICAgICBwRGF0YSArPSA2OworICAgIH0KKwkvLyBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZQorICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkKKyAgICB7CisgICAgICAgIHBEYXRhICs9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc3dpdGNoICgqKHBEYXRhKzEpKQorICAgIHsKKyAgICAgICAgY2FzZSBFQVBQYWNrZXQ6CisJCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVBhY2tldCBmcmFtZSwgVFlQRSA9IDAsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MU3RhcnQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLVN0YXJ0IGZyYW1lLCBUWVBFID0gMSBcbiIpKTsKKwkJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9IEVBUE9MX1NUQVJUX0RJU0FCTEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FuY2VsIHRoZSBFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyBcbiIpKTsKKyAgICAgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOworICAgICAgICAgICAgICAgIHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUFQT0xMb2dvZmY6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MTG9nb2ZmIGZyYW1lLCBUWVBFID0gMiBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MS2V5OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MLUtleSBmcmFtZSwgVFlQRSA9IDMsIExlbmd0aCA9ICVsZFxuIiwgQm9keV9sZW4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MQVNGQWxlcnQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MQVNGQWxlcnQgZnJhbWUsIFRZUEUgPSA0IFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBFTkNSWVBUIEFFUyBHVEsgYmVmb3JlIHNlbmRpbmcgaW4gRUFQT0wgZnJhbWUuCisgICAgICAgIEFFUyBHVEsgbGVuZ3RoID0gMTI4IGJpdCwgIHNvIGZpeCBibG9ja3MgZm9yIGFlcy1rZXktd3JhcCBhcyAyIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byBSRkMgMzM5NCBmb3IgYWVzIGtleSB3cmFwIGFsZ29yaXRobS4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFFU19HVEtfS0VZX1dSQVAoCisgICAgSU4gVUNIQVIgICAgKmtleSwKKyAgICBJTiBVQ0hBUiAgICAqcGxhaW50ZXh0LAorICAgIElOIFVDSEFSICAgIHBfbGVuLAorICAgIE9VVCBVQ0hBUiAgICpjaXBoZXJ0ZXh0KQoreworICAgIFVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworICAgIFVDSEFSICAgICAgIFJbNTEyXTsKKyAgICBJTlQgICAgICAgICBudW1fYmxvY2tzID0gcF9sZW4vODsgICAvLyB1bml0OjY0Yml0cworICAgIElOVCAgICAgICAgIGksIGo7CisgICAgYWVzX2NvbnRleHQgYWVzY3R4OworICAgIFVDSEFSICAgICAgIHhvcjsKKworICAgIHJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisgICAgLy8gSW5pdCBJQQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIEFbaV0gPSAweGE2OworCisgICAgLy9JbnB1dCBwbGFpbnRleHQKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBSWzggKiAoaSArIDEpICsgal0gPSBwbGFpbnRleHRbOCAqIGkgKyBqXTsKKyAgICB9CisKKyAgICAvLyBLZXkgTWl4CisgICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykKKyAgICB7CisgICAgICAgIGZvcihpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vcGhhc2UgMQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWzggKiBpXSwgOCk7CisgICAgICAgICAgICBydG1wX2Flc19lbmNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEEsICZCT1VUWzBdLCA4KTsKKyAgICAgICAgICAgIHhvciA9IG51bV9ibG9ja3MgKiBqICsgaTsKKyAgICAgICAgICAgIEFbN10gPSBCT1VUWzddIF4geG9yOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJbOCAqIGldLCAmQk9VVFs4XSwgOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgY2lwaGVydGV4dAorICAgIE5kaXNNb3ZlTWVtb3J5KGNpcGhlcnRleHQsIEEsIDgpOworCisgICAgZm9yIChpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIGNpcGhlcnRleHRbOCAqIGkgKyBqXSA9IFJbOCAqIGkgKyBqXTsKKyAgICB9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCU1pc2MgZnVuY3Rpb24gdG8gZGVjcnlwdCBBRVMgYm9keQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvCVJGQwkzMzk0IGZvciBhZXMga2V5IHVud3JhcCBhbGdvcml0aG0uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFFU19HVEtfS0VZX1VOV1JBUCgKKwlJTglVQ0hBUgkqa2V5LAorCU9VVAlVQ0hBUgkqcGxhaW50ZXh0LAorCUlOCVVDSEFSICAgIGNfbGVuLAorCUlOCVVDSEFSCSpjaXBoZXJ0ZXh0KQorCit7CisJVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisJVUNIQVIgICAgICAgeG9yOworCUlOVCAgICAgICAgIGksIGo7CisJYWVzX2NvbnRleHQgYWVzY3R4OworCVVDSEFSICAgICAgICpSOworCUlOVCAgICAgICAgIG51bV9ibG9ja3MgPSBjX2xlbi84OwkvLyB1bml0OjY0Yml0cworCisKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZSLCA1MTIpOworCisJaWYgKFIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIUFFU19HVEtfS0VZX1VOV1JBUDogbm8gbWVtb3J5ISEhXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IC8qIEVuZCBvZiBpZiAqLworCisJLy8gSW5pdGlhbGl6ZQorCU5kaXNNb3ZlTWVtb3J5KEEsIGNpcGhlcnRleHQsIDgpOworCS8vSW5wdXQgcGxhaW50ZXh0CisJZm9yKGkgPSAwOyBpIDwgKGNfbGVuLTgpOyBpKyspCisJeworCQlSWyBpXSA9IGNpcGhlcnRleHRbaSArIDhdOworCX0KKworCXJ0bXBfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOworCisJZm9yKGogPSA1OyBqID49IDA7IGotLSkKKwl7CisJCWZvcihpID0gKG51bV9ibG9ja3MtMSk7IGkgPiAwOyBpLS0pCisJCXsKKwkJCXhvciA9IChudW1fYmxvY2tzIC0xICkqIGogKyBpOworCQkJTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKKwkJCUJJTls3XSA9IEFbN10gXiB4b3I7CisJCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUlsoaS0xKSo4XSwgOCk7CisJCQlydG1wX2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisJCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmUlsoaS0xKSo4XSwgJkJPVVRbOF0sIDgpOworCQl9CisJfQorCisJLy8gT1VUUFVUCisJZm9yKGkgPSAwOyBpIDwgY19sZW47IGkrKykKKwl7CisJCXBsYWludGV4dFtpXSA9IFJbaV07CisJfQorCisKKwlvc19mcmVlX21lbShOVUxMLCBSKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQlSZXBvcnQgdGhlIEVBUCBtZXNzYWdlIHR5cGUKKworCUFyZ3VtZW50czoKKwkJbXNnCQktCUVBUE9MX1BBSVJfTVNHXzEKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMgorCQkJCQlFQVBPTF9QQUlSX01TR18zCisJCQkJCUVBUE9MX1BBSVJfTVNHXzQKKwkJCQkJRUFQT0xfR1JPVVBfTVNHXzEKKwkJCQkJRUFQT0xfR1JPVVBfTVNHXzIKKworICAgIFJldHVybjoKKyAgICAgICAgIG1lc3NhZ2UgdHlwZSBzdHJpbmcKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQ0hBUiAqR2V0RWFwb2xNc2dUeXBlKENIQVIgbXNnKQoreworICAgIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18xKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMSI7CisgICAgZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMikKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDIiOworCWVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzMpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAzIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR180KQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgNCI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAxIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9HUk9VUF9NU0dfMikKKyAgICAgICAgcmV0dXJuICJHcm91cCBNZXNzYWdlIDIiOworICAgIGVsc2UKKyAgICAJcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UiOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIFNhbml0eSBSU04gSUUgb2YgRUFQb0wgbWVzc2FnZQorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKKwlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKKwlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisJQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4JID0gRGF0YUxlbjsKKwkqT2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKKwl7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCS8vIFdQQSBSU04gSUUKKwkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pKSAmJgorCQkJCShwRW50cnktPlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQkvLyBXUEEyIFJTTiBJRQorCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKKwkJeworCQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKS8qIFRvRG8tQWxiZXJ0WSBmb3IgbWVzaCovKQorCQkJeworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgorICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworICAgIE5vdGU6CisgICAgICAgIDgwMi4xMWkgRDEwCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCisJSU4JVUNIQVIJCQlNc2dUeXBlLAorCUlOCUJPT0xFQU4JCQliV1BBMiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit7CisgICAgUEtERV9FTkNBUCAgICAgICAgICBwS0RFID0gTlVMTDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgIHBNeUtleURhdGEgPSBwS2V5RGF0YTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLTEVOID0gMDsKKwlVQ0hBUgkJCQlEZWZhdWx0SWR4ID0gMDsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKworCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBwYWlyZXdpc2VfbXNnXzIgJiYgcGFpcmV3aXNlX21zZ18zIGFuZCBza2lwIGl0CisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisgICAgeworCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKKwkJaWYgKCFSVE1QQ2hlY2tSU05JRShwQWQsIHBLZXlEYXRhLCBLZXlEYXRhTGVuLCBwRW50cnksICZza2lwX29mZnNldCkpCisJCXsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgUlNOIElFIGRpZmZlcmVudAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQkJaGV4X2R1bXAoIlJlY2VpdmUgUlNOX0lFICIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkIFJTTl9JRSAiLCBwRW50cnktPlJTTl9JRSwgcEVudHJ5LT5SU05JRV9MZW4pOworCisJCQlyZXR1cm4gRkFMU0U7CisgICAgCX0KKyAgICAJZWxzZQorCQl7CisJCQlpZiAoYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCS8vIHNraXAgUlNOIElFCisJCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOworCisJLy8gUGFyc2UgRUtEIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2dfM19XUEEyICYmIGdyb3VwX21zZ18xX1dQQTIKKwlpZiAoYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisJCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCS8vIEtERSBmb3JtYXQgZXhjbHVkZSBHVEsgbGVuZ3RoCisgICAgCXsKKyAgICAgICAgCXBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKKworCisJCQlEZWZhdWx0SWR4ID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJCQkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCisJCQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKKyAgICAJCXsKKyAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworICAgIAkJfQorCisJCQkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKKwkJCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKKwkJCWlmIChHVEtMRU4gPCBMRU5fQUVTX0tFWSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKKyAgICAgICAgCQlyZXR1cm4gRkFMU0U7CisJCQl9CisKKyAgICAJfQorCQllbHNlCisgICAgCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBLREUgZm9ybWF0IGxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7CisJICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgaW4gS0RFIGZvcm1hdCAsRGVmYXVsdEtleUlEPSVkLCBLZXlMZW49JWQgXG4iLCBEZWZhdWx0SWR4LCBHVEtMRU4pKTsKKwkJLy8gc2tpcCBpdAorCQlwTXlLZXlEYXRhICs9IDg7CisJCUtleURhdGFMZW5ndGggLT0gODsKKworCX0KKwllbHNlIGlmICghYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwl7CisJCURlZmF1bHRJZHggPSBHcm91cEtleUluZGV4OworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgRGVmYXVsdEtleUlEPSVkIFxuIiwgRGVmYXVsdElkeCkpOworCX0KKworCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggbXVzdCBiZSAxIH4gMworCWlmIChEZWZhdWx0SWR4IDwgMSB8fCBEZWZhdWx0SWR4ID4gMykKKyAgICB7CisgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBpbmRleCglZCkgaXMgaW52YWxpZCBpbiAlcyAlcyBcbiIsIERlZmF1bHRJZHgsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJLy8gVG9kbworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIFRSVUU7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgZm9yIFdQQSBoYW5kc2hha2luZworCQlJdHMgZm9ybWF0IGlzIGJlbG93LAorCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBWZXJzaW9uCSB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBQcm90b2NvbCBUeXBlCQkgfAkxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBCb2R5IExlbmd0aAkJIHwgIDIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBEZXNjcmlwdG9yIFR5cGUJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IEluZm9ybWF0aW9uICAgIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBMZW5ndGgJICAgICB8ICAxIG9jdGV0CisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgUmVwYWx5IENvdW50ZXIgfAk4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IE5vbmNlCQkgICAgIHwgIDMyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElWCQkJIHwgIDE2IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJTQwkJCSB8ICA4IG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IElEIG9yIFJlc2VydmVkIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBNSUMJCQkgfAkxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhIExlbmd0aAkgfAkyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IERhdGEJCQkgfAluIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKKwlJTiAJUFJUTVBfQURBUFRFUiAgICAJcEFkLAorICAgIElOIAlVQ0hBUgkJCQlBdXRoTW9kZSwKKyAgICBJTiAJVUNIQVIJCQkJV2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlHcm91cEtleVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAorICAgIElOIAlVQ0hBUgkJCQkqUmVwbGF5Q291bnRlciwKKwlJTiAJVUNIQVIJCQkJKktleU5vbmNlLAorCUlOCVVDSEFSCQkJCSpUeFJTQywKKwlJTglVQ0hBUgkJCQkqUFRLLAorCUlOCVVDSEFSCQkJCSpHVEssCisJSU4JVUNIQVIJCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKKyAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKQoreworCUJPT0xFQU4JYldQQTIgPSBGQUxTRTsKKworCS8vIENob29zZSBXUEEyIG9yIG5vdAorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKyAgICAvLyBJbml0IFBhY2tldCBhbmQgRmlsbCBoZWFkZXIKKyAgICBwTXNnLT5Qcm9WZXIgPSBFQVBPTF9WRVI7CisgICAgcE1zZy0+UHJvVHlwZSA9IEVBUE9MS2V5OworCisJLy8gRGVmYXVsdCA5NSBieXRlcywgdGhlIEVBUG9MLUtleSBkZXNjcmlwdG9yIGV4Y2x1ZGUgS2V5LWRhdGEgZmllbGQKKwlwTXNnLT5Cb2R5X0xlblsxXSA9IExFTl9FQVBPTF9LRVlfTVNHOworCisJLy8gRmlsbCBpbiBFQVBvTCBkZXNjcmlwdG9yCisJaWYgKGJXUEEyKQorCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworCS8vIEZpbGwgaW4gS2V5IGluZm9ybWF0aW9uLCByZWZlciB0byBJRUVFIFN0ZCA4MDIuMTFpLTIwMDQgcGFnZSA3OAorCS8vIFdoZW4gZWl0aGVyIHRoZSBwYWlyd2lzZSBvciB0aGUgZ3JvdXAgY2lwaGVyIGlzIEFFUywgdGhlIERFU0NfVFlQRV9BRVMoMikgc2hhbGwgYmUgdXNlZC4KKwlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisgICAgICAgIAkoKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJLy8gU3BlY2lmeSBLZXkgVHlwZSBhcyBHcm91cCgwKSBvciBQYWlyd2lzZSgxKQorCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCWVsc2UKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIFNwZWNpZnkgS2V5IEluZGV4LCBvbmx5IGdyb3VwX21zZzFfV1BBMQorCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBEZWZhdWx0S2V5SWR4OworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgPSAxOworCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUFjayA9IDE7CisKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKKworCWlmICgoYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfUEFJUl9NU0dfMykpIHx8ICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKKyAgICB7CisgICAgICAgCXBNc2ctPktleURlc2MuS2V5SW5mby5TZWN1cmUgPSAxOworICAgIH0KKworCWlmIChiV1BBMiAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKKyAgICB7CisgICAgICAgIHBNc2ctPktleURlc2MuS2V5SW5mby5FS0RfREwgPSAxOworICAgIH0KKworCS8vIGtleSBJbmZvcm1hdGlvbiBlbGVtZW50IGhhcyBkb25lLgorCSooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBNc2ctPktleURlc2MuS2V5SW5mbykpOworCisJLy8gRmlsbCBpbiBLZXkgTGVuZ3RoCisJeworCQlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBncm91cCBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBUS0lQX0dUS19MRU5HVEggOiBMRU5fQUVTX0tFWSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB0aGUgbGVuZ3RoIG9mIHBhaXJ3aXNlIGtleSBjaXBoZXIKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7CisJCX0KKwl9CisKKyAJLy8gRmlsbCBpbiByZXBsYXkgY291bnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBGaWxsIEtleSBOb25jZSBmaWVsZAorCS8vIEFOb25jZSA6IHBhaXJ3aXNlX21zZzEgJiBwYWlyd2lzZV9tc2czCisJLy8gU05vbmNlIDogcGFpcndpc2VfbXNnMgorCS8vIEdOb25jZSA6IGdyb3VwX21zZzFfd3BhMQorCWlmICgoTXNnVHlwZSA8PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSkKKyAgICAJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlOb25jZSwgS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBGaWxsIGtleSBJViAtIFdQQTIgYXMgMCwgV1BBMSBhcyByYW5kb20KKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwl7CisJCS8vIFN1Z2dlc3QgSVYgYmUgcmFuZG9tIG51bWJlciBwbHVzIHNvbWUgbnVtYmVyLAorCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleUl2LCAmS2V5Tm9uY2VbMTZdLCBMRU5fS0VZX0RFU0NfSVYpOworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUl2WzE1XSArPSAyOworCX0KKworICAgIC8vIEZpbGwgS2V5IFJTQyBmaWVsZAorICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBSU0MgZm9yIHRoZSBHVEsgYmVpbmcgaW5zdGFsbGVkLgorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworICAgICAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleVJzYywgVHhSU0MsIDYpOworCX0KKworCS8vIENsZWFyIEtleSBNSUMgZmllbGQgZm9yIE1JQyBjYWxjdWxhdGlvbiBsYXRlcgorICAgIE5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCUNvbnN0cnVjdEVhcG9sS2V5RGF0YShwQWQsCisJCQkJCQkgIEF1dGhNb2RlLAorCQkJCQkJICBXZXBTdGF0dXMsCisJCQkJCQkgIEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJCQkJICBNc2dUeXBlLAorCQkJCQkJICBEZWZhdWx0S2V5SWR4LAorCQkJCQkJICBiV1BBMiwKKwkJCQkJCSAgUFRLLAorCQkJCQkJICBHVEssCisJCQkJCQkgIFJTTklFLAorCQkJCQkJICBSU05JRV9MZW4sCisJCQkJCQkgIHBNc2cpOworCisJLy8gQ2FsY3VsYXRlIE1JQyBhbmQgZmlsbCBpbiBLZXlNaWMgRmllbGQgZXhjZXB0IFBhaXJ3aXNlIE1zZyAxLgorCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCisJeworCQlDYWxjdWxhdGVNSUMocEFkLCBXZXBTdGF0dXMsIFBUSywgcE1zZyk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBDb25zdHJ1Y3RFYXBvbE1zZyBmb3IgJXMgJXNcbiIsICgoYldQQTIpID8gIldQQTIiIDogIldQQSIpLCBHZXRFYXBvbE1zZ1R5cGUoTXNnVHlwZSkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBCb2R5IGxlbmd0aCA9ICVkIFxuIiwgcE1zZy0+Qm9keV9MZW5bMV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBLZXkgbGVuZ3RoICA9ICVkIFxuIiwgcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0pKTsKKworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb25zdHJ1Y3QgdGhlIEtleSBEYXRhIGZpZWxkIG9mIEVBUG9MIG1lc3NhZ2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xLZXlEYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKKwlJTiAJVUNIQVIJCQlNc2dUeXBlLAorCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKKwlJTglCT09MRUFOCQkJYldQQTJDYXBhYmxlLAorCUlOCVVDSEFSCQkJKlBUSywKKwlJTglVQ0hBUgkJCSpHVEssCisJSU4JVUNIQVIJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQlSU05JRV9MRU4sCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworCVVDSEFSCQkqbXBvb2wsICpLZXlfRGF0YSwgKlJjNEdUSzsKKwlVQ0hBUiAgICAgICBla2V5WyhMRU5fS0VZX0RFU0NfSVYrTEVOX0VBUF9FSyldOworCVVDSEFSCQlkYXRhX29mZnNldDsKKworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikKKwkJcmV0dXJuOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxNTAwKTsKKworICAgIGlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBSYzRHVEsgTGVuID0gNTEyICovCisJUmM0R1RLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvKiBLZXlfRGF0YSBMZW4gPSA1MTIgKi8KKwlLZXlfRGF0YSA9IChVQ0hBUiAqKSBST1VORF9VUChSYzRHVEsgKyA1MTIsIDQpOworCisJTmRpc1plcm9NZW1vcnkoS2V5X0RhdGEsIDUxMik7CisJcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gMDsKKwlkYXRhX29mZnNldCA9IDA7CisKKwkvLyBFbmNhcHN1bGF0ZSBSU05JRSBpbiBwYWlyd2lzZV9tc2cyICYgcGFpcndpc2VfbXNnMworCWlmIChSU05JRV9MRU4gJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpKSkKKwl7CisJCWlmIChiV1BBMkNhcGFibGUpCisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gSUVfV1BBMjsKKwkJZWxzZQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTsKKworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gUlNOSUVfTEVOOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSwgUlNOSUUsIFJTTklFX0xFTik7CisJCWRhdGFfb2Zmc2V0ICs9ICgyICsgUlNOSUVfTEVOKTsKKwl9CisKKwkvLyBFbmNhcHN1bGF0ZSBLREUgZm9ybWF0IGluIHBhaXJ3aXNlX21zZzNfV1BBMiAmIGdyb3VwX21zZzFfV1BBMgorCWlmIChiV1BBMkNhcGFibGUgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisJeworCQkvLyBLZXkgRGF0YSBFbmNhcHN1bGF0aW9uIChLREUpIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzdyBhbmQgVGFibGUtMjBoCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCisJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgxNjsvLyA0KzIrMTYoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCQllbHNlCisJCXsKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDI2Oy8vIDQrMiszMihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQorCQl9CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSA9IDB4MDA7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgM10gPSAweDBGOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMHhBQzsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA1XSA9IDB4MDE7CisKKwkJLy8gR1RLIEtERSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3gKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA2XSA9IChEZWZhdWx0S2V5SWR4ICYgMHgwMyk7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgN10gPSAweDAwOwkvLyBSZXNlcnZlZCBCeXRlCisKKwkJZGF0YV9vZmZzZXQgKz0gODsKKwl9CisKKworCS8vIEVuY2Fwc3VsYXRlIEdUSyBhbmQgZW5jcnlwdCB0aGUga2V5LWRhdGEgZmllbGQgd2l0aCBLRUsuCisJLy8gT25seSBmb3IgcGFpcndpc2VfbXNnM19XUEEyIGFuZCBncm91cF9tc2cxCisJaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBGaWxsIGluIEdUSworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLCBMRU5fQUVTX0tFWSk7CisJCQlkYXRhX29mZnNldCArPSBMRU5fQUVTX0tFWTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgVEtJUF9HVEtfTEVOR1RIKTsKKwkJCWRhdGFfb2Zmc2V0ICs9IFRLSVBfR1RLX0xFTkdUSDsKKwkJfQorCisJCS8vIFN0aWxsIGRvbnQga25vdyB3aHksIGJ1dCBpZiBub3QgYXBwZW5kIHdpbGwgb2NjdXIgIkdUSyBub3QgaW5jbHVkZSBpbiBNU0czIgorCQkvLyBQYXRjaCBmb3IgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHplcm8gY29uZmlnIGFuZCBmdW5rCisJCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgYldQQTJDYXBhYmxlKQorCQl7CisJCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSAyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgM10gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAwOworCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAwOworCQkJCWRhdGFfb2Zmc2V0ICs9IDY7CisJCQl9CisJCX0KKworCQkvLyBFbmNyeXB0IHRoZSBkYXRhIG1hdGVyaWFsIGluIGtleSBkYXRhIGZpZWxkCisJCWlmIChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJQUVTX0dUS19LRVlfV1JBUCgmUFRLWzE2XSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0LCBSYzRHVEspOworICAgICAgICAgICAgLy8gQUVTIHdyYXAgZnVuY3Rpb24gd2lsbCBncm93IDggYnl0ZXMgaW4gbGVuZ3RoCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSA4OworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gUFJFUEFSRSBFbmNyeXB0ZWQgICJLZXkgREFUQSIgZmllbGQuICAoRW5jcnlwdCBHVEsgd2l0aCBSQzQsIHVzaW5mIFBUS1sxNl0tPlszMV0gYXMgS2V5LCBJVi1maWVsZCBhcyBJVikKKwkJCS8vIHB1dCBUeFRzYyBpbiBLZXkgUlNDIGZpZWxkCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOyAgIC8vSW5pdCBjcmMzMi4KKworCQkJLy8gZWtleSBpcyB0aGUgY29udGFuZXRpb24gb2YgSVYtZmllbGQsIGFuZCBQVEtbMTZdLT5QVEtbMzFdCisJCQlOZGlzTW92ZU1lbW9yeShla2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCBMRU5fS0VZX0RFU0NfSVYpOworCQkJTmRpc01vdmVNZW1vcnkoJmVrZXlbTEVOX0tFWV9ERVNDX0lWXSwgJlBUS1sxNl0sIExFTl9FQVBfRUspOworCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIGVrZXksIHNpemVvZihla2V5KSk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUlRNUF9DQUxDX0ZDUzMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJCQlXUEFBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgUmM0R1RLLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQl9CisKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBSYzRHVEssIGRhdGFfb2Zmc2V0KTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCX0KKworCS8vIHNldCBrZXkgZGF0YSBsZW5ndGggZmllbGQgYW5kIHRvdGFsIGxlbmd0aAorCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IGRhdGFfb2Zmc2V0OworICAgIHBNc2ctPkJvZHlfTGVuWzFdICs9IGRhdGFfb2Zmc2V0OworCisJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGNhdWxhdGUgTUlDLiBJdCBpcyB1c2VkIGR1cmluZyA0LXdheXMgaGFuZHNoYXJraW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDYWxjdWxhdGVNSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJKlBUSywKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpCit7CisgICAgVUNIQVIgICAqT3V0QnVmZmVyOworCVVMT05HCUZyYW1lTGVuID0gMDsKKwlVQ0hBUgltaWNbTEVOX0tFWV9ERVNDX01JQ107CisJVUNIQVIJZGlnZXN0WzgwXTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZPdXRCdWZmZXIsIDUxMik7CisKKyAgICBpZiAoT3V0QnVmZmVyID09IE5VTEwpCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFDYWxjdWxhdGVNSUM6IG5vIG1lbW9yeSEhIVxuIikpOworCQlyZXR1cm47CisgICAgfQorCisJLy8gbWFrZSBhIGZyYW1lIGZvciBjYWxjdWxhdGluZyBNSUMuCisgICAgTWFrZU91dGdvaW5nRnJhbWUoT3V0QnVmZmVyLCAgICAgICAgICAgIAkmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgcE1zZy0+Qm9keV9MZW5bMV0gKyA0LCAgCXBNc2csCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisKKwkvLyBDYWxjdWxhdGUgTUlDCisgICAgaWYgKFBlZXJXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAJeworCQlITUFDX1NIQTEoT3V0QnVmZmVyLCAgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgT3V0QnVmZmVyLCBGcmFtZUxlbiwgbWljKTsKKwl9CisKKwkvLyBzdG9yZSB0aGUgY2FsY3VsYXRlZCBNSUMKKwlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCW9zX2ZyZWVfbWVtKHBBZCwgT3V0QnVmZmVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNvbWUgcmVjZWl2ZWQgZnJhbWVzIGNhbid0IGRlY3J5cHQgYnkgQXNpYywgc28gZGVjcnlwdCB0aGVtIGJ5IHNvZnR3YXJlLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCS0JZGVjcnlwdGlvbiBzdWNjZXNzZnVsCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCS0JZGVjcnlwdGlvbiBmYWlsdXJlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKKwlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKKwlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgCUdyb3VwQ2lwaGVyLAorCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpCit7CisJUFJYV0lfU1RSVUMJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisKKworCisJLy8gaGFuZGxlIFdFUCBkZWNyeXB0aW9uCisJaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisgICAgeworCQlpZiAoUlRNUFNvZnREZWNyeXB0V0VQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy9NaW51cyBJVls0XSAmIElDVls0XQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSA4OworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBTb2Z0d2FyZSBkZWNyeXB0IFdFUCBkYXRhIGZhaWxzLlxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwkvLyBoYW5kbGUgVEtJUCBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRUS0lQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgMCwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy9NaW51cyA4IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYsIDQgYnl0ZXMgSUNWCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDIwOworCQl9CisgICAgICAgIGVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRUS0lQIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgfQorCX0KKwkvLyBoYW5kbGUgQUVTIGRlY3J5cHRpb24KKwllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdEFFUyhwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLCBwU2hhcmRfa2V5KSkKKwkJeworCisJCQkvLzggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViAoQ0NNUCBIZWFkZXIpCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDE2OworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRBRVMgRmFpbGVkXG4iKSk7CisJCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2YxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBhcF9kZnMuYworCisgICAgQWJzdHJhY3Q6CisgICAgU3VwcG9ydCBERlMgZnVuY3Rpb24uCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvbmNoaSAgICAwMy0xMi0yMDA3ICAgICAgY3JlYXRlZAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCit0eXBlZGVmIHN0cnVjdCBfUkFEQVJfRFVSQVRJT05fVEFCTEUKK3sKKwlVTE9ORyBSRER1clJlZ2lvbjsKKwlVTE9ORyBSYWRhclNpZ25hbER1cmF0aW9uOworCVVMT05HIFRvbGVyYW5jZTsKK30gUkFEQVJfRFVSQVRJT05fVEFCTEUsICpQUkFEQVJfRFVSQVRJT05fVEFCTEU7CisKKworc3RhdGljIFVDSEFSIFJkSWRsZVRpbWVUYWJsZVtNQVhfUkRfUkVHSU9OXVs0XSA9Cit7CisJezksIDI1MCwgMjUwLCAyNTB9LAkJLy8gQ0UKKwl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBGQ0MKKwl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBKQVAKKwl7MTUsIDI1MCwgMjUwLCAyNTB9LAkvLyBKQVBfVzUzCisJezQsIDI1MCwgMjUwLCAyNTB9CQkvLyBKQVBfVzU2Cit9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQ4IFJhZGFyUGVyaW9kOworCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDExNCwgMHgwMik7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMSwgMHgyMCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMiwgMHgwMCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyMywgMHgwOC8qMHg4MCovKTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTI0LCAweDI4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTI1LCAweGZmKTsKKworI2lmIDAKKwkvLyB0b2dnbGUgUnggZW5hYmxlIGJpdCBmb3IgcmFkYXIgZGV0ZWN0aW9uLgorCS8vIGl0J3MgQW5keSdzIHJlY29tbWFuZC4KKwl7CisJCVVJTlQzMiBWYWx1ZTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSB8PSAoMHgxIDw8IDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCVZhbHVlICY9IH4oMHgxIDw8IDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKyNlbmRpZgorCVJhZGFyUGVyaW9kID0gKChVSU5UKVJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyAoVUlOVClwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgPCAyNTAgPworCQkJKFJkSWRsZVRpbWVUYWJsZVtwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbl1bMF0gKyBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSkgOiAyNTA7CisKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NDApOworCisJUmFkYXJEZXRlY3Rpb25TdGFydChwQWQsIDAsIFJhZGFyUGVyaW9kKTsKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMCwgMHgxZCk7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjEsIDB4NjApOworCisJUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBDVFNQcm90ZWN0LAorCUlOIFVJTlQ4IENUU1BlcmlvZCkKK3sKKwlVSU5UOCBEZnNBY3RpdmVUaW1lID0gKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lICYgMHgxZik7CisJVUlOVDggQ3RzUHJvdGVjdCA9IChDVFNQcm90ZWN0ID09IDEpID8gMHgwMiA6IDB4MDE7IC8vIENUUyBwcm90ZWN0LgorCisJaWYgKENUU1Byb3RlY3QgIT0gMCkKKwl7CisJCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikKKwkJeworCQljYXNlIEZDQzoKKwkJY2FzZSBKQVBfVzU2OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDM7CisJCQlicmVhazsKKworCQljYXNlIENFOgorCQljYXNlIEpBUF9XNTM6CisJCWRlZmF1bHQ6CisJCQlDdHNQcm90ZWN0ID0gMHgwMjsKKwkJCWJyZWFrOworCQl9CisJfQorCWVsc2UKKwkJQ3RzUHJvdGVjdCA9IDB4MDE7CisKKworCS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQorCS8vIGhpZ2hieXRlIFs3XQkJcmVzZXJ2ZQorCS8vIGhpZ2hieXRlIFs2OjVdCTB4OiBzdG9wIENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzEwXToJU3RhcnQgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24gd2l0aG91dCBDVFMgcHJvdGVjdGlvbiwgMTE6IFN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGggQ1RTIHByb3RlY3Rpb24KKwkvLyBoaWdoYnl0ZSBbNDowXQlSYWRhci9jYXJyaWVyIGRldGVjdGlvbiBkdXJhdGlvbi4gSW4gMW1zLgorCisJLy8gbG93Ynl0ZSBbNzowXQlSYWRhci9jYXJyaWVyIGRldGVjdGlvbiBwZXJpb2QsIGluIDFtcy4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIENUU1BlcmlvZCwgRGZzQWN0aXZlVGltZSB8IChDdHNQcm90ZWN0IDw8IDUpKTsKKwkvL0FzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MywgMHhmZiwgMTAsIDApOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJRm91bmQgcmFkYXIgc2lnbmFsCisJCUZBTFNFCU5vdCBmb3VuZCByYWRhciBzaWduYWwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFkYXJEZXRlY3Rpb25TdG9wLlxuIikpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgMHgwMCwgMHgwMCk7CS8vIHNlbmQgc3RhcnQtUkQgd2l0aCBDVFMgcHJvdGVjdGlvbiBjb21tYW5kIHRvIE1DVQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmFkYXIgY2hhbm5lbCBjaGVjayByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCW5lZWQgdG8gZG8gcmFkYXIgZGV0ZWN0CisJCUZBTFNFCW5lZWQgbm90IHRvIGRvIHJhZGFyIGRldGVjdAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUNoKQoreworI2lmIDEKKwlJTlQJCWk7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKworCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChDaCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+Q2hhbm5lbExpc3RbaV0uRGZzUmVxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworI2Vsc2UKKwlJTlQJCWk7CisJVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlmb3IgKGk9MDsgaTwxNTsgaSsrKQorCXsKKwkJaWYgKENoID09IENoYW5uZWxbaV0pCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgIT0gMTUpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKK1VMT05HIEphcFJhZGFyVHlwZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORwkJaTsKKwljb25zdCBVQ0hBUglDaGFubmVsWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiAhPSBKQVApCisJeworCQlyZXR1cm4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb247CisJfQorCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IENoYW5uZWxbaV0pCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPCA0KQorCQlyZXR1cm4gSkFQX1c1MzsKKwllbHNlIGlmIChpIDwgMTUpCisJCXJldHVybiBKQVBfVzU2OworCWVsc2UKKwkJcmV0dXJuIEpBUDsgLy8gVzUyCisKK30KKworVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQ4IGJ5dGVWYWx1ZSA9IDA7CisJVUxPTkcgcmVzdWx0OworCisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE1LCAmYnl0ZVZhbHVlKTsKKworCXJlc3VsdCA9IDA7CisJc3dpdGNoIChieXRlVmFsdWUpCisJeworCWNhc2UgMTogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHB1bHNlIG1vZGUuCisJY2FzZSAyOiAvLyByYWRhciBzaWduYWwgZGV0ZWN0ZWQgYnkgd2lkdGggbW9kZS4KKwkJcmVzdWx0ID0gUlRNUFJlYWRSYWRhckR1cmF0aW9uKHBBZCk7CisJCWJyZWFrOworCisJY2FzZSAwOiAvLyBObyByYWRhciBzaWduYWwuCisJZGVmYXVsdDoKKworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitVTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcgcmVzdWx0ID0gMDsKKworI2lmZGVmIERGU19TVVBQT1JUCisJVUlOVDggZHVyYXRpb24xID0gMCwgZHVyYXRpb24yID0gMCwgZHVyYXRpb24zID0gMDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNiwgJmR1cmF0aW9uMSk7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE3LCAmZHVyYXRpb24yKTsKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTgsICZkdXJhdGlvbjMpOworCXJlc3VsdCA9IChkdXJhdGlvbjEgPDwgMTYpICsgKGR1cmF0aW9uMiA8PCA4KSArIGR1cmF0aW9uMzsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCitWT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJcmV0dXJuOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFJhZGFyIHdhdmUgZGV0ZWN0aW9uLiBUaGUgQVBJIHNob3VsZCBiZSBpbnZva2UgZWFjaCBzZWNvbmQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVAlpOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuSW5TZXJ2aWNlTW9uaXRvckNvdW50Kys7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID4gMCkKKwkJeworCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlIC0tOworCQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCU1KSA9PSAwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhZGFyRGV0ZWN0UGVyaW9kaWMgLSBjaD0lZCwgUmVtYWluaW5nVGltZUZvclVzZT0lZFxuIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UpKTsKKwkJCX0KKwkJfQorCX0KKworCS8vcmFkYXIgZGV0ZWN0CisJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCXsKKwkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCX0KKworCXJldHVybjsKK30KKworLy8gUGVyaW9kaWMgUmFkYXIgZGV0ZWN0aW9uLCBzd2l0Y2ggY2hhbm5lbCB3aWxsIG9jY3VyIGluIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KCkKKy8vIEJlZm9yZSBzd2l0Y2ggY2hhbm5lbCwgZHJpdmVyIG5lZWRzIGRvaW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudC4KK1ZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBuZWVkIHRvIGNoZWNrIGNoYW5uZWwgYXZhaWxhYmlsaXR5LCBhZnRlciBzd2l0Y2ggY2hhbm5lbAorCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfU0lMRU5DRV9NT0RFKQorCQkJcmV0dXJuOworCisJLy8gY2hhbm5lbCBhdmFpbGFiaWxpdHkgY2hlY2sgdGltZSBpcyA2MHNlYywgdXNlIDY1IGZvciBhc3N1cmFuY2UKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCsrID4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGZvdW5kIHJhZGFyIHNpZ25hbCwgc3RhcnQgc2VuZCBiZWFjb24gYW5kIHJhZGFyIGRldGVjdGlvbiBpbiBzZXJ2aWNlIG1vbml0b3JcblxuIikpOworCQkJQmJwUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCisKKwkJcmV0dXJuOworCX0KKworCXJldHVybjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisJCWNoYW5nZSBjaGFubmVsIG1vdmluZyB0aW1lIGZvciBERlMgdGVzdGluZy4KKworCUFyZ3VtZW50czoKKwkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IENoTW92VGltZT1bdmFsdWVdCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpCit7CisJVUlOVDggVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSBWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDJkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZXByb20uYwpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwllZXByb20uYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgUmFpc2VDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggfCBFRVNLOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKKyAgICBSVE1QdXNlY0RlbGF5KDEpOwkJCQkvLyBNYXggZnJlcXVlbmN5ID0gMU1IeiBpbiBTcGVjLiBkZWZpbml0aW9uCit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIExvd2VyQ2xvY2soCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVJTlQzMiAqeCkKK3sKKyAgICAqeCA9ICp4ICYgfkVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitVU0hPUlQgU2hpZnRJbkJpdHMoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyCQl4LGk7CisJVVNIT1JUICAgICAgZGF0YT0wOworCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oIEVFRE8gfCBFRURJKTsKKworICAgIGZvcihpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICAgICAgeCAmPSB+KEVFREkpOworICAgICAgICBpZih4ICYgRUVETykKKyAgICAgICAgICAgIGRhdGEgfD0gMTsKKworICAgICAgICBMb3dlckNsb2NrKHBBZCwgJngpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBTaGlmdE91dEJpdHMoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBkYXRhLAorICAgIElOICBVU0hPUlQgY291bnQpCit7CisgICAgVUlOVDMyICAgICAgIHgsbWFzazsKKworICAgIG1hc2sgPSAweDAxIDw8IChjb3VudCAtIDEpOworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFRE8gfCBFRURJKTsKKworICAgIGRvCisgICAgeworICAgICAgICB4ICY9IH5FRURJOworICAgICAgICBpZihkYXRhICYgbWFzaykJCXggfD0gRUVESTsKKworICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOworICAgICAgICBMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgICAgIG1hc2sgPSBtYXNrID4+IDE7CisgICAgfSB3aGlsZShtYXNrKTsKKworICAgIHggJj0gfkVFREk7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIEVFcHJvbUNsZWFudXAoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyIHg7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfihFRUNTIHwgRUVESSk7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKyAgICBSYWlzZUNsb2NrKHBBZCwgJngpOworICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Cit9CisKK1ZPSUQgRVdFTigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdFTl9PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCitWT0lEIEVXRFMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyCXg7CisKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRFNfT1BDT0RFLCA1KTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKKworICAgIEVFcHJvbUNsZWFudXAocEFkKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBPZmZzZXQpCit7CisgICAgVUlOVDMyCQl4OworICAgIFVTSE9SVAkJZGF0YTsKKworICAgIE9mZnNldCAvPSAyOworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKKworICAgIC8vIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZAorICAgIGRhdGEgPSBTaGlmdEluQml0cyhwQWQpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworCisgICAgcmV0dXJuIGRhdGE7Cit9CS8vUmVhZEVFcHJvbQorCitWT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVTSE9SVCBPZmZzZXQsCisgICAgSU4gIFVTSE9SVCBEYXRhKQoreworICAgIFVJTlQzMiB4OworCisJT2Zmc2V0IC89IDI7CisKKwlFV0VOKHBBZCk7CisKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgLHJlZ2lzdGVyIG51bWJlciBhbmQgZGF0YSBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCVNoaWZ0T3V0Qml0cyhwQWQsIERhdGEsIDE2KTsJCS8vIDE2LWJpdCBhY2Nlc3MKKworICAgIC8vIHJlYWQgRE8gc3RhdHVzCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwlFRXByb21DbGVhbnVwKHBBZCk7CisKKwlSVE1QdXNlY0RlbGF5KDEwMDAwKTsJLy9kZWxheSBmb3IgdHdwKE1BWCk9MTBtcworCisJRVdEUyhwQWQpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI5OTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaApAQCAtMCwwICsxLDU1OCBAQAorLyoKKyBDb3B5cmlnaHQgKGMpIDIwMDcsIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uLiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBiaW5hcnkgZm9ybSwgd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyBtZXQ6CisKKyAJKiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZQorIAlmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgCXByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAJKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgCXN1cHBsaWVycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAJc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgCSogTm8gcmV2ZXJzZSBlbmdpbmVlcmluZywgZGVjb21waWxhdGlvbiwgb3IgZGlzYXNzZW1ibHkgb2YgdGhpcyBzb2Z0d2FyZQorIAlpcyBwZXJtaXR0ZWQuCisKKyBMaW1pdGVkIHBhdGVudCBsaWNlbnNlLiBSYWxpbmsgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBncmFudHMgYSB3b3JsZC13aWRlLAorIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlIHVuZGVyIHBhdGVudHMgaXQgbm93IG9yIGhlcmVhZnRlcgorIG93bnMgb3IgY29udHJvbHMgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIGltcG9ydCwgb2ZmZXIgdG8gc2VsbCBhbmQKKyBzZWxsICgiVXRpbGl6ZSIpIHRoaXMgc29mdHdhcmUsIGJ1dCBzb2xlbHkgdG8gdGhlIGV4dGVudCB0aGF0IGFueQorIHN1Y2ggcGF0ZW50IGlzIG5lY2Vzc2FyeSB0byBVdGlsaXplIHRoZSBzb2Z0d2FyZSBhbG9uZSwgb3IgaW4KKyBjb21iaW5hdGlvbiB3aXRoIGFuIG9wZXJhdGluZyBzeXN0ZW0gbGljZW5zZWQgdW5kZXIgYW4gYXBwcm92ZWQgT3BlbgorIFNvdXJjZSBsaWNlbnNlIGFzIGxpc3RlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSBhdAorIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KKyBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhpcyBzb2Z0d2FyZS4gIE5vIGhhcmR3YXJlIHBlcgorIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworIERJU0NMQUlNRVIuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgREFNQUdFLgorKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLworCisKK1VDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7CisweDAyLCAweDAzLCAweDVlLCAweDAyLCAweDAyLCAweGIxLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDgyLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMSwgMHgzMywgMHhjMCwgMHhlMCwKKzB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCisweDEyLCAweDEwLCAweDA5LCAweDkwLCAweDA0LCAweDE2LCAweGUwLCAweDMwLCAweGUzLCAweDAzLCAweDc0LCAweDA4LCAweGYwLCAweDkwLCAweDA0LCAweDE0LAorMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwgMHgwMCwgMHhjYiwgMHg3NCwgMHg4MCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHgyZiwKKzB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjQsIDB4Y2YsIDB4NjAsIDB4MzAsIDB4MTQsIDB4NjAsIDB4NDIsIDB4MjQsIDB4ZTIsIDB4NjAsIDB4NDcsIDB4MTQsCisweDYwLCAweDU1LCAweDI0LCAweDIxLCAweDcwLCAweDYwLCAweGU1LCAweDU1LCAweDI0LCAweGZlLCAweDYwLCAweDA3LCAweDE0LCAweDYwLCAweDA4LCAweDI0LAorMHgwMiwgMHg3MCwgMHgwOCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgyOCwgMHg3ZCwgMHgwMiwgMHg4MCwgMHgyNCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwKKzB4NTAsIDB4ODUsIDB4MmYsIDB4NDAsIDB4ZDIsIDB4MDEsIDB4ODAsIDB4M2UsIDB4ZTUsIDB4NTUsIDB4NjQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4ZTUsIDB4NTUsCisweDcwLCAweDA0LCAweDdkLCAweDAyLCAweDgwLCAweDA5LCAweDg1LCAweDJmLCAweDQxLCAweGQyLCAweDAyLCAweDgwLCAweDI5LCAweGFkLCAweDU1LCAweGFmLAorMHgyZiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg4MCwgMHgyMCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHg0NywgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwKKzB4ZjUsIDB4NDQsIDB4MTIsIDB4MTAsIDB4MjUsIDB4ODAsIDB4MDYsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZjUsIDB4NDUsIDB4ZTQsIDB4ZmQsIDB4YWYsCisweDJmLCAweDEyLCAweDAyLCAweDhkLCAweGQyLCAweDA0LCAweDkwLCAweDcwLCAweDEzLCAweGU0LCAweGYwLCAweGQyLCAweGFmLCAweGQwLCAweGQwLCAweGQwLAorMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwgMHhlMCwgMHgzMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg1MywgMHhjMiwKKzB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsCisweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDMwLCAweDkwLAorMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwKKzB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsCisweDBkLCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDAyLCAweDJjLCAweDc0LCAweGZmLCAweGYwLCAweGMyLCAweDA1LAorMHhkMiwgMHhhZiwgMHgyMiwgMHhjMCwgMHhlMCwgMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHhlOCwgMHhjMCwgMHhlMCwKKzB4ZTksIDB4YzAsIDB4ZTAsIDB4ZWEsIDB4YzAsIDB4ZTAsIDB4ZWIsIDB4YzAsIDB4ZTAsIDB4ZWMsIDB4YzAsIDB4ZTAsIDB4ZWQsIDB4YzAsIDB4ZTAsIDB4ZWUsCisweGMwLCAweGUwLCAweGVmLCAweGMwLCAweGUwLCAweGMyLCAweGFmLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLCAweDEyLCAweGQyLCAweGFmLCAweGQwLAorMHhlMCwgMHhmZiwgMHhkMCwgMHhlMCwgMHhmZSwgMHhkMCwgMHhlMCwgMHhmZCwgMHhkMCwgMHhlMCwgMHhmYywgMHhkMCwgMHhlMCwgMHhmYiwgMHhkMCwgMHhlMCwKKzB4ZmEsIDB4ZDAsIDB4ZTAsIDB4ZjksIDB4ZDAsIDB4ZTAsIDB4ZjgsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ODIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ZjAsIDB4ZDAsCisweGUwLCAweDMyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweDc1LCAweGQwLCAweDEwLCAweGMyLAorMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwYywgMHgzMCwgMHg1OCwgMHgwYSwgMHhlNSwgMHg1NCwgMHg2MCwgMHgwNCwgMHgxNSwgMHg1NCwKKzB4ODAsIDB4MDIsIDB4YzIsIDB4NTgsIDB4MzAsIDB4NTksIDB4MGEsIDB4ZTUsIDB4NTAsIDB4NjAsIDB4MDQsIDB4MTUsIDB4NTAsIDB4ODAsIDB4MDIsIDB4YzIsCisweDU5LCAweGQ1LCAweDUzLCAweDA3LCAweDMwLCAweDYwLCAweDA0LCAweDE1LCAweDQ2LCAweGQyLCAweDA0LCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLAorMHgwZiwgMHhjMiwgMHg4ZCwgMHhkMiwgMHhhZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwgMHhlMCwgMHgzMiwKKzB4MTIsIDB4MDIsIDB4ZDMsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MDMsIDB4MzAsIDB4MDEsIDB4MDYsIDB4MjAsIDB4MDksIDB4MDMsIDB4MTIsCisweDEwLCAweDFjLCAweDMwLCAweDAyLCAweDA2LCAweDIwLCAweDBhLCAweDAzLCAweDEyLCAweDEwLCAweDFmLCAweDMwLCAweDAzLCAweDA2LCAweDIwLCAweDBiLAorMHgwMywgMHgxMiwgMHgxMCwgMHgxZiwgMHgzMCwgMHgwNCwgMHgwNiwgMHgyMCwgMHgwYywgMHgwMywgMHgxMiwgMHgxMCwgMHgyMiwgMHgyMCwgMHgxMywgMHgwOSwKKzB4MjAsIDB4MTEsIDB4MDYsIDB4ZTUsIDB4MmIsIDB4NDUsIDB4MmMsIDB4NjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4YTksIDB4MTIsCisweDAyLCAweGVjLCAweDgwLCAweGJmLCAweGMyLCAweDQzLCAweGQyLCAweDQ1LCAweGU0LCAweGY1LCAweDIwLCAweGY1LCAweDIxLCAweGY1LCAweDUzLCAweGY1LAorMHg0NiwgMHhmNSwgMHgyYiwgMHhmNSwgMHgyYywgMHhjMiwgMHg0MiwgMHhmNSwgMHg1MSwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHg5MCwgMHgwNCwgMHgxOCwKKzB4NzQsIDB4ODAsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MWEsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YzIsIDB4MTksIDB4YzIsIDB4MTgsIDB4YzIsIDB4MWEsIDB4MjIsCisweGM4LCAweGVmLCAweGM4LCAweGU2LCAweGZhLCAweDA4LCAweGU2LCAweDRhLCAweDYwLCAweDBjLCAweGM4LCAweGVmLCAweGM4LCAweDA4LCAweGU2LCAweDE2LAorMHgxOCwgMHg3MCwgMHgwMSwgMHgxNiwgMHhjMywgMHgyMiwgMHhlZCwgMHgyNCwgMHhmZiwgMHhmZCwgMHhlYywgMHgzNCwgMHhmZiwgMHhjOCwgMHhlZiwgMHhjOCwKKzB4ZjYsIDB4MDgsIDB4YzYsIDB4ZWQsIDB4YzYsIDB4ZDMsIDB4MjIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ODIsIDB4ZjgsIDB4ZTQsIDB4OTMsIDB4NzAsIDB4MTIsCisweDc0LCAweDAxLCAweDkzLCAweDcwLCAweDBkLCAweGEzLCAweGEzLCAweDkzLCAweGY4LCAweDc0LCAweDAxLCAweDkzLCAweGY1LCAweDgyLCAweDg4LCAweDgzLAorMHhlNCwgMHg3MywgMHg3NCwgMHgwMiwgMHg5MywgMHg2OCwgMHg2MCwgMHhlZiwgMHhhMywgMHhhMywgMHhhMywgMHg4MCwgMHhkZiwgMHhlZiwgMHhmNCwgMHg2MCwKKzB4MWYsIDB4ZTQsIDB4ZmUsIDB4MTIsIDB4MDMsIDB4NmEsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTIsIDB4MTIsIDB4MDMsIDB4NmEsIDB4ZWYsIDB4ZjAsIDB4NzQsCisweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLCAweDA0LCAweGUzLAorMHgyMiwgMHhjMCwgMHhlMCwgMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgwOCwgMHhjMiwgMHhhZiwKKzB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MDYsIDB4ZDIsIDB4YWYsIDB4ZDAsIDB4ZDAsIDB4ZDAsIDB4ODIsIDB4ZDAsIDB4ODMsIDB4ZDAsIDB4ZjAsCisweGQwLCAweGUwLCAweDMyLCAweGMyLCAweGFmLCAweDEyLCAweDAwLCAweDA2LCAweDEyLCAweDAyLCAweDE0LCAweDEyLCAweDAzLCAweDFjLCAweGU0LCAweGY1LAorMHgyMiwgMHhmNSwgMHg0NywgMHg5MCwgMHgwNCwgMHgwMCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwKKzB4MTAsIDB4MTUsIDB4ZTUsIDB4MjAsIDB4NzAsIDB4MDMsIDB4MjAsIDB4MTAsIDB4MDMsIDB4MzAsIDB4MTEsIDB4MDMsIDB4NDMsIDB4ODcsIDB4MDEsIDB4MjIsCisweGMwLCAweDJhLCAweDc0LCAweDAzLCAweGMwLCAweGUwLCAweGMwLCAweDgyLCAweGMwLCAweDgzLCAweDc1LCAweDJhLCAweDBhLCAweDIyLCAweGMwLCAweDJhLAorMHg3NCwgMHgwMywgMHhjMCwgMHhlMCwgMHhjMCwgMHg4MiwgMHhjMCwgMHg4MywgMHg3NSwgMHgyYSwgMHgxOCwgMHgyMiwgMHg3NSwgMHg4OSwgMHgwMiwgMHhlNCwKKzB4ZjUsIDB4OGMsIDB4ZjUsIDB4OGEsIDB4ZjUsIDB4ODgsIDB4ZjUsIDB4YjgsIDB4ZjUsIDB4ZTgsIDB4NzUsIDB4OTAsIDB4MTgsIDB4ZDIsIDB4OGMsIDB4NzUsCisweGE4LCAweDA1LCAweDIyLCAweGNlLCAweGVmLCAweGNlLCAweGVlLCAweDYwLCAweDA4LCAweDdmLCAweGZmLCAweDEyLCAweDAzLCAweDgwLCAweDFlLCAweDgwLAorMHhmNSwgMHgyMiwgMHhjOCwgMHhlZiwgMHhjOCwgMHhlNiwgMHg2MCwgMHgwMywgMHgxNiwgMHhjMywgMHgyMiwgMHhlZCwgMHgxNCwgMHhmNiwgMHhkMywgMHgyMiwKKzB4YzgsIDB4ZWYsIDB4YzgsIDB4ZTYsIDB4NjAsIDB4MDYsIDB4MTYsIDB4ZTYsIDB4MjQsIDB4ZmYsIDB4YjMsIDB4MjIsIDB4YzMsIDB4MjIsIDB4NzgsIDB4N2YsCisweGU0LCAweGY2LCAweGQ4LCAweGZkLCAweDc1LCAweDgxLCAweDVmLCAweDAyLCAweDAxLCAweGQwLCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHgyMiwgMHhlZiwgMHg5MCwgMHgwMywgMHg3ZSwgMHg5MywgMHg5MCwgMHgwMywgMHgwMCwgMHg3MywgMHgwYSwgMHgxOCwKKzB4ZWYsIDB4NjAsIDB4MDMsIDB4MWYsIDB4ODAsIDB4ZmEsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzYiwgMHgwMiwgMHgxMCwgMHgzYywgMHgwMiwgMHgxMiwgMHhiOCwgMHgwMiwKKzB4MTIsIDB4YjksIDB4MDIsIDB4MTMsIDB4M2UsIDB4MDIsIDB4MTMsIDB4M2YsIDB4YzMsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTYsIDB4NTYsIDB4MDIsCisweDE3LCAweDZiLCAweDAyLCAweDE0LCAweDJhLCAweDAyLCAweDEzLCAweDQwLCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDAwLAorMHhkOCwgMHgzMCwgMHgwNiwgMHgwNiwgMHgyMCwgMHgwZSwgMHgwMywgMHgxMiwgMHgxOCwgMHg1ZSwgMHgyMiwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwKKzB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsCisweDEyLCAweDAyLCAweDY3LCAweDExLCAweDRlLCAweDMwLCAweDExLCAweDI1LCAweDMxLCAweDEwLCAweDg3LCAweDMzLCAweDEwLCAweGFhLCAweDM0LCAweDEwLAorMHhjMywgMHgzNSwgMHgxMSwgMHg1NywgMHg1MCwgMHgxMSwgMHg3YiwgMHg1MSwgMHgxMSwgMHg4NCwgMHg1MiwgMHgxMSwgMHg4NCwgMHg1MywgMHgxMSwgMHg4NCwKKzB4NTQsIDB4MTEsIDB4YzUsIDB4NTUsIDB4MTEsIDB4ZGMsIDB4NzAsIDB4MTIsIDB4MDcsIDB4NzEsIDB4MTIsIDB4MzQsIDB4NzIsIDB4MTIsIDB4NWUsIDB4ODAsCisweDEyLCAweDgxLCAweDgzLCAweDAwLCAweDAwLCAweDEyLCAweGI3LCAweDc1LCAweDI0LCAweDA1LCAweDc1LCAweDI1LCAweGRjLCAweDkwLCAweDcwLCAweDlmLAorMHg3NCwgMHgxMiwgMHhmMCwgMHhkMiwgMHgxOCwgMHhkMiwgMHg2MSwgMHg3NSwgMHgzNSwgMHgwZCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4YzIsIDB4MTgsIDB4OTAsIDB4MDEsIDB4MTQsIDB4ZTAsCisweDU0LCAweGZkLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweGI3LAorMHgwMiwgMHgxMiwgMHhhYSwgMHhlNSwgMHg1NSwgMHg2NCwgMHgwMiwgMHg3MCwgMHgzNywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg2MCwgMHgwOCwgMHg5MCwKKzB4MDEsIDB4MGQsIDB4NzQsIDB4MDksIDB4ZjAsIDB4ODAsIDB4MjUsIDB4ZTUsIDB4MzQsIDB4MTQsIDB4NjAsIDB4MGEsIDB4MTQsIDB4NjAsIDB4MGYsIDB4MTQsCisweDYwLCAweDE0LCAweDI0LCAweDAzLCAweDcwLCAweDE2LCAweDkwLCAweDAxLCAweDBkLCAweDc0LCAweDA4LCAweGYwLCAweDgwLCAweDBlLCAweDkwLCAweDAxLAorMHgwZCwgMHg3NCwgMHgwYiwgMHhmMCwgMHg4MCwgMHgwNiwgMHg5MCwgMHgwMSwgMHgwZCwgMHg3NCwgMHgxYiwgMHhmMCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgwMiwKKzB4N2QsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MWIsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLAorMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwKKzB4MDIsIDB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsCisweDcwLCAweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDIyLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsCisweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDc1LCAweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LAorMHhmZiwgMHg5MiwgMHg0NywgMHgyMiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwKKzB4MTAsIDB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsCisweDc0LCAweDQ4LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwKKzB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDcsIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NTQsIDB4MDcsCisweGY1LCAweDI2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweGQyLCAweDA0LCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLAorMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmOCwgMHhlNiwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwKKzB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsCisweDAzLCAweDAyLCAweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHhmZCwgMHhlZCwgMHhmNSwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwKKzB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsCisweDEyLCAweGI3LCAweDgwLCAweDc2LCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDI2LCAweGZmLCAweGMyLCAweDE5LCAweGMyLCAweDE4LAorMHhjMiwgMHgxYSwgMHg3NSwgMHgzNCwgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwKKzB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4NWIsIDB4ODAsIDB4NGMsIDB4OTAsIDB4NzAsCisweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgzOCwgMHg4MCwKKzB4MjksIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZjUsIDB4MzQsIDB4ZDMsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDcsIDB4OTAsIDB4MDEsIDB4MGQsIDB4ZTAsCisweDU0LCAweGZiLCAweGYwLCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLAorMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwZCwgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwKKzB4ZjAsIDB4OTAsIDB4MDIsIDB4MmMsIDB4NzQsIDB4ZmYsIDB4ZjAsIDB4MjIsIDB4MjIsIDB4ZTUsIDB4NTMsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4M2QsCisweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LCAweGU1LCAweDRmLCAweDE1LCAweDRmLCAweDcwLCAweDAyLCAweDE1LCAweDRlLCAweGEyLCAweDE5LAorMHhlNCwgMHgzMywgMHg5MCwgMHg3MCwgMHg5MCwgMHhmMCwgMHhhMiwgMHgxOCwgMHhlNCwgMHgzMywgMHhhMywgMHhmMCwgMHgzMCwgMHgxOSwgMHg0ZCwgMHg5MCwKKzB4NzAsIDB4OTgsIDB4NzQsIDB4MjMsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4MjUsIDB4ZjAsIDB4ZTUsIDB4MjQsIDB4YTMsIDB4ZjAsIDB4N2YsIDB4MzUsIDB4N2QsCisweDMyLCAweDEyLCAweDAzLCAweDQyLCAweDUwLCAweDA5LCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGY3LCAweGYwLCAweGQyLCAweDA2LCAweGU1LAorMHgzNSwgMHhkMywgMHg5NCwgMHgxMCwgMHg0MCwgMHgxZSwgMHgzMCwgMHgxYSwgMHgxYiwgMHhjMiwgMHgxYSwgMHhhMiwgMHgxOCwgMHg5MiwgMHgxOSwgMHgyMCwKKzB4MTksIDB4MTIsIDB4OTAsIDB4MDQsIDB4MDksIDB4ZTAsIDB4NTQsIDB4ZGQsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDgsIDB4ZjAsCisweGMyLCAweDYxLCAweGQyLCAweDAzLCAweGU1LCAweDM1LCAweGI0LCAweDBiLCAweDE0LCAweGQyLCAweDAzLCAweDIyLCAweGU0LCAweGY1LCAweDM1LCAweGEyLAorMHgxOCwgMHg5MiwgMHgxOSwgMHgzMCwgMHgxOSwgMHgwNywgMHg5MCwgMHgwNCwgMHgwOSwgMHhlMCwgMHg0NCwgMHgyMiwgMHhmMCwgMHgyMiwgMHgyMiwgMHgyMiwKKzB4YzIsIDB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MDIsIDB4NjcsIDB4MTMsIDB4NjIsIDB4MDAsIDB4MTMsIDB4ZjUsIDB4MDQsIDB4MTMsCisweGYxLCAweDA4LCAweDEzLCAweGNjLCAweDEwLCAweDEzLCAweDc2LCAweDIwLCAweDEzLCAweDk2LCAweDYwLCAweDEzLCAweGE3LCAweGEwLCAweDAwLCAweDAwLAorMHgxMywgMHhmNywgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTMsIDB4ZjcsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHg2NiwgMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsCisweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LAorMHg3MCwgMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwKKzB4MDYsIDB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsCisweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLAorMHgwNiwgMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgzOCwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwKKzB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsCisweGU1LCAweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLAorMHhlNSwgMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwKKzB4NzAsIDB4MDMsIDB4MTIsIDB4MTYsIDB4MzYsIDB4MTIsIDB4MTQsIDB4M2YsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsCisweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDFjLCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LAorMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYywgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxZCwgMHg3NCwKKzB4MWUsIDB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MzgsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MWMsIDB4MDUsIDB4ZTUsCisweDVmLCAweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDFkLCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LAorMHgzOCwgMHg3MCwgMHgwNSwgMHg3NSwgMHgzOCwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgzOCwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwKKzB4ZTUsIDB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDM4LAorMHg3MCwgMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgzOCwgMHg3MCwgMHgwNSwgMHg3NSwgMHgzOCwgMHgwNywgMHg4MCwgMHgwMiwKKzB4MTUsIDB4MzgsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4OTAsIDB4NzAsIDB4NDYsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4MjAsIDB4NjksIDB4MDcsIDB4ZTUsCisweDVlLCAweDIwLCAweGUwLCAweDAyLCAweGIyLCAweDY4LCAweDIwLCAweDZiLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDAyLCAweGIyLCAweDZhLAorMHgyMCwgMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwMiwgMHhiMiwgMHg2YywgMHg5MCwgMHg3MCwgMHg0NywgMHhlNSwgMHgyZCwgMHhmMCwKKzB4NzUsIDB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NjgsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsCisweGUzLCAweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLAorMHg3MywgMHg5MiwgMHg3MiwgMHgyMCwgMHg2YiwgMHgwNCwgMHhhMiwgMHg2YSwgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwKKzB4ZTMsIDB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsCisweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLCAweDE1LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLAorMHhlMywgMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwKKzB4NzEsIDB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NDYsIDB4OTAsCisweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLCAweDE0LCAweDYwLCAweDE0LCAweDI0LCAweGZlLAorMHg2MCwgMHgxZiwgMHgyNCwgMHgwMywgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgzNSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHgzMCwgMHg0NywgMHgwZCwKKzB4ODAsIDB4MDcsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MjAsIDB4NDcsIDB4MDQsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4MjIsIDB4NDQsIDB4MDEsIDB4ZjAsCisweDIyLCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDA0LCAweDdmLCAweDAxLCAweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDAyLCAweDI4LCAweGUwLAorMHg1NCwgMHhmZSwgMHg0ZiwgMHhmMCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgzNSwgMHhmNSwgMHgyNywKKzB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4MjYsIDB4MTQsIDB4NjAsIDB4MjYsIDB4MTQsIDB4NjAsIDB4MmUsIDB4MTQsCisweDYwLCAweDM2LCAweDI0LCAweDAzLCAweDcwLCAweDVmLCAweGU1LCAweDQ2LCAweDEzLCAweDEzLCAweDEzLCAweDU0LCAweDFmLCAweDc1LCAweGYwLCAweDAzLAorMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwgMHgwMCwgMHhlZiwgMHg2ZSwgMHgyNCwgMHhmZiwKKzB4ODAsIDB4MDIsIDB4YTIsIDB4NDcsIDB4OTIsIDB4MzksIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4ODAsIDB4M2YsIDB4ZTUsIDB4NDYsIDB4MzAsCisweGUzLCAweDAzLCAweGQzLCAweDgwLCAweDI3LCAweGMzLCAweDgwLCAweDI0LCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDBkLCAweDU0LCAweDcwLCAweGMzLAorMHg5NCwgMHg2MCwgMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgyMCwgMHg0NywKKzB4MDQsIDB4N2QsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2QsIDB4MDAsIDB4ZWYsIDB4NmQsIDB4NGUsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YTIsIDB4NDcsCisweGIzLCAweDkyLCAweDM5LCAweDgwLCAweDA3LCAweGEyLCAweDQ3LCAweGIzLCAweDkyLCAweDM4LCAweDkyLCAweDM5LCAweDkwLCAweDAyLCAweDI4LCAweGUwLAorMHg1NCwgMHhmYywgMHg0NSwgMHgyNywgMHhmMCwgMHgyMiwgMHhlNCwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwKKzB4ODAsIDB4MDQsIDB4ZTUsIDB4NDUsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksCisweDIyLCAweDhmLCAweDU0LCAweGQyLCAweDU4LCAweDIyLCAweGU0LCAweGY1LCAweDMwLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDRhLAorMHgxNCwgMHg2MCwgMHg2YSwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNywgMHg0YywgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHgyMCwKKzB4MTksIDB4MWMsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTAsIDB4MjAsIDB4ZTEsIDB4MjMsIDB4OTAsIDB4MDQsIDB4MzQsCisweGUwLCAweGI0LCAweDAyLCAweDFjLCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDE3LCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDEyLCAweDdmLCAweDIwLAorMHgxMiwgMHgxNiwgMHg0YywgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMSwgMHgwMiwgMHgxNywgMHg0YywKKzB4ZTUsIDB4NTAsIDB4NzAsIDB4MDYsIDB4NzUsIDB4MzAsIDB4MDMsIDB4MDIsIDB4MTcsIDB4NGMsIDB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsCisweDcwLCAweDE1LCAweDdmLCAweDIwLCAweDEyLCAweDE2LCAweDRjLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDAyLCAweDA4LCAweGUwLCAweDU0LCAweGZiLAorMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHgwMiwgMHgxNywgMHg0YywgMHhlNSwgMHg1MCwgMHg3MCwgMHgwMiwgMHg4MCwgMHg3YSwgMHgyMCwgMHgxOSwgMHgwZiwKKzB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4MjAsIDB4ZTMsIDB4NmMsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4NjQsIDB4MjIsIDB4NzAsIDB4NjQsIDB4OTAsCisweDEyLCAweDA0LCAweDc0LCAweDBhLCAweGYwLCAweDMwLCAweDFiLCAweDExLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLAorMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwgMHhhMywgMHhlMCwgMHg1NCwgMHhmYSwgMHhmMCwgMHgyMCwgMHgxOSwgMHgwNywgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwKKzB4NDQsIDB4MTAsIDB4ZjAsIDB4ZTUsIDB4MzQsIDB4ZjQsIDB4OTAsIDB4MDQsIDB4MDEsIDB4NjAsIDB4MDYsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4ODAsCisweDA0LCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDEyLCAweDA0LCAweGUwLCAweDQ0LCAweDA0LCAweGYwLCAweGU1LAorMHgzNCwgMHhmNCwgMHg2MCwgMHgxNCwgMHg5MCwgMHgwMSwgMHgwZCwgMHhlMCwgMHhmNSwgMHgzMywgMHhlNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMiwgMHg0MCwKKzB4MDcsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmQsIDB4ZjAsIDB4NzUsIDB4MzAsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDIsIDB4ZTQsIDB4ZjUsCisweDUxLCAweDgwLCAweDA5LCAweGU1LCAweDUwLCAweDcwLCAweDA1LCAweDc1LCAweDMwLCAweDAzLCAweGY1LCAweDUxLCAweGU1LCAweDMwLCAweDYwLCAweDE4LAorMHhjMiwgMHgwMSwgMHhlNCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHgyMCwgMHgxOSwgMHgwZSwgMHhhZCwgMHgzMCwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxOCwKKzB4MmEsIDB4ZTUsIDB4MzAsIDB4YjQsIDB4MDMsIDB4MDIsIDB4ZDIsIDB4MDMsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsIDB4MzAsIDB4MDEsIDB4MGUsCisweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGMyLCAweDAxLCAweDdkLCAweDAyLCAweGFmLCAweDQwLCAweDEyLCAweDE4LCAweDJhLCAweGU1LCAweDUyLAorMHgxNCwgMHg2MCwgMHg1NSwgMHgxNCwgMHg2MCwgMHgyZiwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxOCwgMHgyNywgMHhlNSwgMHgzNCwgMHhmNCwKKzB4NjAsIDB4MjMsIDB4ZTUsIDB4MzQsIDB4ZDMsIDB4OTQsIDB4MDIsIDB4NDAsIDB4MTYsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDIsIDB4ZjAsCisweDkwLCAweDAxLCAweDBkLCAweGUwLCAweDIwLCAweGUzLCAweDAzLCAweDAyLCAweDE4LCAweDI3LCAweDdmLCAweDUwLCAweDEyLCAweDE2LCAweDUxLCAweDc1LAorMHg1MiwgMHgwMiwgMHg3NSwgMHg1NSwgMHgwMywgMHhlNSwgMHgzNCwgMHhmNCwgMHg2MCwgMHgwYSwgMHhlNSwgMHg1NCwgMHg3MCwgMHg2OSwgMHg5MCwgMHgwMSwKKzB4MGQsIDB4ZTUsIDB4MzMsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsIDB4NTEsCisweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDgwLCAweDRmLCAweGU1LCAweDU0LCAweDcwLCAweDRiLCAweDkwLCAweDA0LCAweDAxLCAweGUwLAorMHg0NCwgMHgwZSwgMHhmMCwgMHgyMCwgMHgxOSwgMHgwNCwgMHhlMCwgMHg1NCwgMHhlZiwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwKKzB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MGYsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsCisweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDAyLCAweDA4LCAweGUwLCAweDQ0LCAweDA1LCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDQ0LAorMHgwYywgMHhmMCwgMHhlNCwgMHhmNSwgMHg1MiwgMHhmNSwgMHg1NSwgMHgzMCwgMHgwMiwgMHgwYiwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwgMHg0MSwKKzB4MTIsIDB4MTgsIDB4MmEsIDB4ODAsIDB4MDIsIDB4YzIsIDB4MDMsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsCisweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LAorMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwgMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwKKzB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjAsIDB4MTksCisweDAzLCAweDAyLCAweDE5LCAweDBmLCAweDkwLCAweDcwLCAweDgwLCAweGUwLCAweDA0LCAweGYwLCAweDkwLCAweDA0LCAweDM3LCAweGUwLCAweDMwLCAweGU1LAorMHgwMywgMHgwMiwgMHgxOSwgMHgwYiwgMHg5MCwgMHgwNCwgMHgyOCwgMHhlMCwgMHhmNSwgMHgzMSwgMHhhMywgMHhlMCwgMHhmNSwgMHgzMCwgMHhmNSwgMHgzMiwKKzB4ZTQsIDB4ZjUsIDB4MzcsIDB4OTAsIDB4NzAsIDB4ODEsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4ODIsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4ZTUsCisweDMyLCAweDc1LCAweGYwLCAweDgwLCAweGE0LCAweDI0LCAweDAwLCAweGZmLCAweGU1LCAweGYwLCAweDM0LCAweDgwLCAweGZlLCAweGU1LCAweDMwLCAweDY1LAorMHgzMiwgMHg3MCwgMHgwNSwgMHhmYywgMHg3ZCwgMHgxOCwgMHg4MCwgMHgwNCwgMHg3YywgMHgwMCwgMHg3ZCwgMHgwMCwgMHhlZiwgMHgyZCwgMHhmZiwgMHhlZSwKKzB4M2MsIDB4ZmUsIDB4MTIsIDB4MTksIDB4MTAsIDB4NTAsIDB4MjUsIDB4OTAsIDB4NzAsIDB4ODMsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4MTQsCisweGUwLCAweDQ0LCAweDAyLCAweGYwLCAweGUwLCAweDMwLCAweGUxLCAweDA2LCAweDkwLCAweDcwLCAweDkyLCAweDc0LCAweDQ1LCAweGYwLCAweDkwLCAweDcwLAorMHg5MywgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg5MCwgMHg3MCwgMHg5NCwgMHhmMCwgMHhlNSwgMHgzMiwgMHg2NSwgMHgzMSwKKzB4NjAsIDB4MTAsIDB4ZTQsIDB4MjUsIDB4MzIsIDB4ZmYsIDB4ZTQsIDB4MzQsIDB4ODAsIDB4OGYsIDB4ODIsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4MzIsCisweDgwLCAweDk3LCAweDkwLCAweDA0LCAweDEwLCAweDc0LCAweDAxLCAweGYwLCAweDkwLCAweDA0LCAweDI4LCAweGU1LCAweDMxLCAweGYwLCAweGEzLCAweGU1LAorMHgzMCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgxMSwgMHg3NCwgMHgwMSwgMHhmMCwgMHgwMiwgMHgxOCwgMHg2YSwgMHhjMiwgMHgwNiwgMHhkMiwgMHgxYSwgMHgyMiwKKzB4OTAsIDB4NzAsIDB4ODQsIDB4ZTUsIDB4MzcsIDB4ZjAsIDB4YzMsIDB4OTQsIDB4MDYsIDB4NTAsIDB4MTksIDB4OGYsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsCisweGI0LCAweGZmLCAweDA3LCAweDA1LCAweDM3LCAweGU0LCAweGY1LCAweDM2LCAweDgwLCAweDU5LCAweGU0LCAweGY1LCAweDM3LCAweDhmLCAweDgyLCAweDhlLAorMHg4MywgMHhmMCwgMHg4MCwgMHg0ZiwgMHhlNSwgMHgzNiwgMHg3NSwgMHhmMCwgMHgwNiwgMHg4NCwgMHg3NCwgMHgwOCwgMHgyNSwgMHhmMCwgMHhmNSwgMHg4MiwKKzB4ZTQsIDB4MzQsIDB4MTAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4ZmQsIDB4OGYsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZmMsIDB4NmQsIDB4NzAsIDB4MzAsCisweDkwLCAweDcwLCAweDg4LCAweGUwLCAweDA0LCAweGYwLCAweGEzLCAweGUwLCAweGZkLCAweGQzLCAweDk1LCAweDM3LCAweDQwLCAweDAyLCAweDgwLCAweDAyLAorMHhhZCwgMHgzNywgMHg5MCwgMHg3MCwgMHg4OSwgMHhlZCwgMHhmMCwgMHgwNSwgMHgzNywgMHgwNSwgMHgzNiwgMHhlNSwgMHgzNiwgMHg3NSwgMHhmMCwgMHgwNiwKKzB4ODQsIDB4NzQsIDB4OGEsIDB4MjUsIDB4ZjAsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWMsIDB4ZjAsIDB4ODAsIDB4MDMsCisweGU0LCAweGY1LCAweDM3LCAweDBmLCAweGJmLCAweDAwLCAweDAxLCAweDBlLCAweGVmLCAweDU0LCAweDdmLCAweDYwLCAweDBhLCAweGU1LCAweDM3LCAweGMzLAorMHg5NCwgMHg0ZSwgMHg1MCwgMHgwMywgMHgwMiwgMHgxOSwgMHgxMCwgMHhlNSwgMHgzNywgMHhiNCwgMHg0ZSwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywKKzB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwgMHg5NCwgMHhlYiwgfSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDc3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYwpAQCAtMCwwICsxLDE0MjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgbWQ1LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAorCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQorCVJpdGEJCTEwLTE0LTA1CQlNb2RpZnkgU0hBLTEgaW4gYmlnLWVuZGlhbiBwbGF0Zm9ybQorICovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qKgorICogbWQ1X21hYzoKKyAqIEBrZXk6IHBvaW50ZXIgdG8JdGhlCWtleQl1c2VkIGZvciBNQUMgZ2VuZXJhdGlvbgorICogQGtleV9sZW46IGxlbmd0aAlvZiB0aGUga2V5IGluIGJ5dGVzCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSBhcmVhIGZvciB3aGljaCB0aGUgTUFDIGlzCWdlbmVyYXRlZAorICogQGRhdGFfbGVuOiBsZW5ndGggb2YJdGhlCWRhdGEgaW4JYnl0ZXMKKyAqIEBtYWM6IHBvaW50ZXIgdG8JdGhlCWJ1ZmZlciBob2xkaW5nIHNwYWNlIGZvciB0aGUgTUFDOyB0aGUgYnVmZmVyIHNob3VsZAorICogaGF2ZQlzcGFjZSBmb3IgMTI4LWJpdCAoMTYgYnl0ZXMpIE1ENSBoYXNoIHZhbHVlCisgKgorICogbWQ1X21hYygpIGRldGVybWluZXMJdGhlCW1lc3NhZ2UJYXV0aGVudGljYXRpb24gY29kZQlieSB1c2luZyBzZWN1cmUJaGFzaAorICogTUQ1KGtleSB8IGRhdGEgfAlrZXkpLgorICovCit2b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpCit7CisJTUQ1X0NUWAljb250ZXh0OworCisJTUQ1SW5pdCgmY29udGV4dCk7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENVVwZGF0ZSgmY29udGV4dCwJZGF0YSwgZGF0YV9sZW4pOworCU1ENVVwZGF0ZSgmY29udGV4dCwJa2V5LCBrZXlfbGVuKTsKKwlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsKK30KKworLyoqCisgKiBobWFjX21kNToKKyAqIEBrZXk6IHBvaW50ZXIgdG8JdGhlCWtleQl1c2VkIGZvciBNQUMgZ2VuZXJhdGlvbgorICogQGtleV9sZW46IGxlbmd0aAlvZiB0aGUga2V5IGluIGJ5dGVzCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSBhcmVhIGZvciB3aGljaCB0aGUgTUFDIGlzCWdlbmVyYXRlZAorICogQGRhdGFfbGVuOiBsZW5ndGggb2YJdGhlCWRhdGEgaW4JYnl0ZXMKKyAqIEBtYWM6IHBvaW50ZXIgdG8JdGhlCWJ1ZmZlciBob2xkaW5nIHNwYWNlIGZvciB0aGUgTUFDOyB0aGUgYnVmZmVyIHNob3VsZAorICogaGF2ZQlzcGFjZSBmb3IgMTI4LWJpdCAoMTYgYnl0ZXMpIE1ENSBoYXNoIHZhbHVlCisgKgorICogaG1hY19tZDUoKSBkZXRlcm1pbmVzIHRoZSBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uCWNvZGUgdXNpbmcgSE1BQy1NRDUuCisgKiBUaGlzCWltcGxlbWVudGF0aW9uIGlzIGJhc2VkCW9uIHRoZSBzYW1wbGUgY29kZSBwcmVzZW50ZWQgaW4JUkZDCTIxMDQuCisgKi8KK3ZvaWQgaG1hY19tZDUodTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpCit7CisJTUQ1X0NUWAljb250ZXh0OworICAgIHU4IGtfaXBhZFs2NV07IC8qIGlubmVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIGlwYWQgKi8KKyAgICB1OCBrX29wYWRbNjVdOyAvKiBvdXRlciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBvcGFkICovCisgICAgdTggdGtbMTZdOworCWludAlpOworCisJLy9hc3NlcnQoa2V5ICE9IE5VTEwgJiYgZGF0YSAhPSBOVUxMICYmIG1hYyAhPSBOVUxMKTsKKworCS8qIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXkgPQlNRDUoa2V5KSAqLworCWlmIChrZXlfbGVuCT4gNjQpIHsKKwkJTUQ1X0NUWAl0dGNvbnRleHQ7CisKKwkJTUQ1SW5pdCgmdHRjb250ZXh0KTsKKwkJTUQ1VXBkYXRlKCZ0dGNvbnRleHQsIGtleSwga2V5X2xlbik7CisJCU1ENUZpbmFsKHRrLCAmdHRjb250ZXh0KTsKKwkJLy9rZXk9KFBVQ0hBUil0dGNvbnRleHQuYnVmOworCQlrZXkJPSB0azsKKwkJa2V5X2xlbgk9IDE2OworCX0KKworCS8qIHRoZSBITUFDX01ENQl0cmFuc2Zvcm0gbG9va3MJbGlrZToKKwkgKgorCSAqIE1ENShLIFhPUiBvcGFkLCBNRDUoSyBYT1IgaXBhZCwgdGV4dCkpCisJICoKKwkgKiB3aGVyZSBLIGlzIGFuIG4gYnl0ZQlrZXkKKwkgKiBpcGFkCWlzIHRoZSBieXRlCTB4MzYgcmVwZWF0ZWQgNjQgdGltZXMKKwkgKiBvcGFkCWlzIHRoZSBieXRlCTB4NWMgcmVwZWF0ZWQgNjQgdGltZXMKKwkgKiBhbmQgdGV4dAlpcyB0aGUgZGF0YQliZWluZyBwcm90ZWN0ZWQJKi8KKworCS8qIHN0YXJ0IG91dCBieQlzdG9yaW5nCWtleQlpbiBwYWRzCSovCisJTmRpc1plcm9NZW1vcnkoa19pcGFkLCBzaXplb2Yoa19pcGFkKSk7CisJTmRpc1plcm9NZW1vcnkoa19vcGFkLAlzaXplb2Yoa19vcGFkKSk7CisJLy9hc3NlcnQoa2V5X2xlbiA8IHNpemVvZihrX2lwYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLyogWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzICovCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspIHsKKwkJa19pcGFkW2ldIF49IDB4MzY7CisJCWtfb3BhZFtpXSBePSAweDVjOworCX0KKworCS8qIHBlcmZvcm0gaW5uZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAxc3QgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19pcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIGlubmVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJZGF0YSwgZGF0YV9sZW4pOyAvKgl0aGVuIHRleHQgb2YgZGF0YWdyYW0gKi8KKwlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsJCQkgLyoJZmluaXNoIHVwIDFzdCBwYXNzICovCisKKwkvKiBwZXJmb3JtIG91dGVyIE1ENSAqLworCU1ENUluaXQoJmNvbnRleHQpOwkJCQkJIC8qCWluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkgLyoJc3RhcnQgd2l0aCBvdXRlciBwYWQgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCW1hYywgMTYpOwkJIC8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMm5kIHBhc3MgKi8KK30KKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisjZGVmaW5lIGJ5dGVSZXZlcnNlKGJ1ZiwgbGVuKSAgIC8qIE5vdGhpbmcgKi8KKyNlbHNlCit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpOwordm9pZCBieXRlUmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmdzKQoreworICAgIGRvIHsKKyAgICAgICAgKihVSU5UMzIgKilidWYgPSBTV0FQMzIoKihVSU5UMzIgKilidWYpOworICAgICAgICBidWYgKz0gNDsKKyAgICB9IHdoaWxlICgtLWxvbmdzKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09ICBNRDUgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvLyBmb3VyIGJhc2UgZnVuY3Rpb25zIGZvciBNRDUKKyNkZWZpbmUgTUQ1X0YxKHgsIHksIHopICgoKHgpICYgKHkpKSB8ICgofngpICYgKHopKSkKKyNkZWZpbmUgTUQ1X0YyKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKKyNkZWZpbmUgTUQ1X0YzKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIE1ENV9GNCh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8ICh+eikpKQorI2RlZmluZSBDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSAoKCh3KSA8PCAocykpIHwgKCh3KSA+PiAoMzItKHMpKSkpCisKKyNkZWZpbmUJTUQ1U3RlcChmLCB3LCB4LCB5LAl6LCBkYXRhLCB0LCBzKQlcCisJKCB3CSs9IGYoeCwJeSwgeikgKwlkYXRhICsgdCwgIHcgPSAoQ1lDTElDX0xFRlRfU0hJRlQodywgcykpICYgMHhmZmZmZmZmZiwgdyArPQl4ICkKKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBJbml0aWF0ZSBNRDUgQ29udGV4dCBzYXRpc2ZpZWQgaW4gUkZDIDEzMjEKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBwQ3R4ICAgICAgICBQb2ludGVyCXRvIE1ENSBjb250ZXh0CisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICovCitWT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCkKK3sKKyAgICBwQ3R4LT5CdWZbMF09MHg2NzQ1MjMwMTsKKyAgICBwQ3R4LT5CdWZbMV09MHhlZmNkYWI4OTsKKyAgICBwQ3R4LT5CdWZbMl09MHg5OGJhZGNmZTsKKyAgICBwQ3R4LT5CdWZbM109MHgxMDMyNTQ3NjsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF09MDsKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdPTA7Cit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVXBkYXRlIE1ENSBDb250ZXh0LCBhbGxvdyBvZiBhbiBhcnJhcnkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0IHBvcnRpb24KKyAqICAgICAgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBwQ3R4CQlQb2ludGVyCXRvIE1ENSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYWZ0ZXIgTUQ1SW5pdCBvciBNRDVVcGRhdGUoaXRzZWxmKQorICovCitWT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKQoreworCisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICB0ZW1wID0gcEN0eC0+TGVuSW5CaXRDb3VudFswXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKworICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdIDwgdGVtcCkKKyAgICAgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSsrOyAgIC8vY2FycnkgaW4KKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0gKz0gTGVuSW5CeXRlcyA+PiAyOTsKKworICAgIC8vIG1vZCA2NCBieXRlcworICAgIHRlbXAgPSAodGVtcCA+PiAzKSAmIDB4M2Y7CisKKyAgICAvLyBwcm9jZXNzIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQorICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgVUNIQVIgKnBBZHMgPSAoVUNIQVIgKikgcEN0eC0+SW5wdXQgKyB0ZW1wOworCisgICAgICAgIGlmICgodGVtcCtMZW5JbkJ5dGVzKSA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgNjQtdGVtcCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKyAgICAgICAgcERhdGEgKz0gNjQtdGVtcDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NC10ZW1wOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wKQorCisKKyAgICBUZlRpbWVzID0gKExlbkluQnl0ZXMgPj4gNik7CisKKyAgICBmb3IgKGk9VGZUaW1lczsgaT4wOyBpLS0pCisgICAgeworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIDY0KTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICAgICAgcERhdGEgKz0gNjQ7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQ7CisgICAgfSAvLyBlbmQgb2YgZm9yCisKKyAgICAvLyBidWZmZXJpbmcgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYoTGVuSW5CeXRlcykKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKworfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEFwcGVuZCBwYWRkaW5nIGJpdHMgYW5kIGxlbmd0aCBvZiBvcmlnaW5hbCBtZXNzYWdlIGluIHRoZSB0YWlsCisgKiAgICAgIFRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgdG8gYmUgY29tcGxldGVkIGluIHRoZSBlbmQKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBEaWdlc3QJCU91dHB1dCBvZiBEaWdlc3QtTWVzc2FnZSBmb3IgTUQ1CisgKiAgCXBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVVcGRhdGUKKyAqLworVk9JRCBNRDVGaW5hbChVQ0hBUiBEaWdlc3RbMTZdLCBNRDVfQ1RYICpwQ3R4KQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgcEFwcGVuZCA9IChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGxvdyB0byBoaWdoCisgICAgICAgCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGlmCisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIHRoZSBmaXJzdCBibG9jayA9PT0KKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsICg2NC1SZW1haW5kZXItMSkpOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC09ICg2NCAtIFJlbWFpbmRlciAtIDEpOworCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKyAgICAgICAgLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+IChpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGVsc2UKKworCisgICAgTmRpc01vdmVNZW1vcnkoKFVDSEFSICopRGlnZXN0LCAoVUlOVDMyICopcEN0eC0+QnVmLCAxNik7IC8vIG91dHB1dAorICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKURpZ2VzdCwgNCk7CisgICAgTmRpc1plcm9NZW1vcnkocEN0eCwgc2l6ZW9mKHBDdHgpKTsgLy8gbWVtb3J5IGZyZWUKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBUaGUgY2VudHJhbCBhbGdvcml0aG0gb2YgTUQ1LCBjb25zaXN0cyBvZiBmb3VyIHJvdW5kcyBhbmQgc2l4dGVlbgorICogIAlzdGVwcyBwZXIgcm91bmQKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBCdWYgICAgIEJ1ZmZlcnMgb2YgZm91ciBzdGF0ZXMgKG91dHB1dDogMTYgYnl0ZXMpCisgKiAJICAgIE1lcyAgICAgSW5wdXQgZGF0YSAoaW5wdXQ6IDY0IGJ5dGVzKQorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGJ5IE1ENVVwZGF0ZSBvciBNRDVGaW5hbAorICovCitWT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSkKK3sKKyAgICBVSU5UMzIgUmVnWzRdLCBUZW1wOworCXVuc2lnbmVkIGludCBpOworCisgICAgc3RhdGljIFVDSEFSIExTaGlmdFZhbFsxNl0gPQorICAgIHsKKyAgICAgICAgNywgMTIsIDE3LCAyMiwKKwkJNSwgOSAsIDE0LCAyMCwKKwkJNCwgMTEsIDE2LCAyMywKKyAJCTYsIDEwLCAxNSwgMjEsCisgCX07CisKKworCS8vIFtlcXVhbCB0byA0Mjk0OTY3Mjk2KmFicyhzaW4oaW5kZXgpKV0KKyAgICBzdGF0aWMgVUlOVDMyIE1ENVRhYmxlWzY0XSA9CisJeworCQkweGQ3NmFhNDc4LAkweGU4YzdiNzU2LAkweDI0MjA3MGRiLAkweGMxYmRjZWVlLAorCQkweGY1N2MwZmFmLAkweDQ3ODdjNjJhLAkweGE4MzA0NjEzLCAweGZkNDY5NTAxLAorCQkweDY5ODA5OGQ4LAkweDhiNDRmN2FmLAkweGZmZmY1YmIxLAkweDg5NWNkN2JlLAorICAgIAkweDZiOTAxMTIyLAkweGZkOTg3MTkzLAkweGE2Nzk0MzhlLAkweDQ5YjQwODIxLAorCisgICAgCTB4ZjYxZTI1NjIsCTB4YzA0MGIzNDAsCTB4MjY1ZTVhNTEsCTB4ZTliNmM3YWEsCisgICAgCTB4ZDYyZjEwNWQsCTB4MDI0NDE0NTMsCTB4ZDhhMWU2ODEsCTB4ZTdkM2ZiYzgsCisgICAgCTB4MjFlMWNkZTYsCTB4YzMzNzA3ZDYsCTB4ZjRkNTBkODcsCTB4NDU1YTE0ZWQsCisgICAgCTB4YTllM2U5MDUsCTB4ZmNlZmEzZjgsCTB4Njc2ZjAyZDksCTB4OGQyYTRjOGEsCisKKyAgICAJMHhmZmZhMzk0MiwJMHg4NzcxZjY4MSwJMHg2ZDlkNjEyMiwJMHhmZGU1MzgwYywKKyAgICAJMHhhNGJlZWE0NCwJMHg0YmRlY2ZhOSwJMHhmNmJiNGI2MCwJMHhiZWJmYmM3MCwKKyAgICAJMHgyODliN2VjNiwJMHhlYWExMjdmYSwJMHhkNGVmMzA4NSwJMHgwNDg4MWQwNSwKKyAgICAJMHhkOWQ0ZDAzOSwJMHhlNmRiOTllNSwJMHgxZmEyN2NmOCwJMHhjNGFjNTY2NSwKKworICAgIAkweGY0MjkyMjQ0LAkweDQzMmFmZjk3LAkweGFiOTQyM2E3LAkweGZjOTNhMDM5LAorICAgCQkweDY1NWI1OWMzLAkweDhmMGNjYzkyLAkweGZmZWZmNDdkLAkweDg1ODQ1ZGQxLAorICAgIAkweDZmYTg3ZTRmLAkweGZlMmNlNmUwLAkweGEzMDE0MzE0LAkweDRlMDgxMWExLAorICAgIAkweGY3NTM3ZTgyLAkweGJkM2FmMjM1LAkweDJhZDdkMmJiLAkweGViODZkMzkxCisJfTsKKworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICBSZWdbaV09QnVmW2ldOworCisKKyAgICAvLyA2NCBzdGVwcyBpbiBNRDUgYWxnb3JpdGhtCisgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YxLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1tpXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsW2kgJiAweDNdKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT0xNjsgaTwzMjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg1KihpICYgMHhmKSsxKSAmIDB4Zl0sCisgICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgxIDw8IDIpKyhpICYgMHgzKV0pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTMyOyBpPDQ4OyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMywgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDMqKGkgJiAweGYpKzUpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMykrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9NDg7IGk8NjQ7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0Y0LCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soNyooaSAmIDB4ZikpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDMgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKworCisgICAgLy8gKHRlbXBvcmFyeSlvdXRwdXQKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIEJ1ZltpXSArPSBSZWdbaV07CisKK30KKworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIFNIQS0xIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvLyBmb3VyIGJhc2UgZnVuY3Rpb25zIGZvciBTSEEtMQorI2RlZmluZSBTSEExX0YxKGIsIGMsIGQpICAgICgoKGIpICYgKGMpKSB8ICgofmIpICYgKGQpKSkKKyNkZWZpbmUgU0hBMV9GMihiLCBjLCBkKSAgICAoKGIpIF4gKGMpIF4gKGQpKQorI2RlZmluZSBTSEExX0YzKGIsIGMsIGQpICAgICgoKGIpICYgKGMpKSB8ICgoYikgJiAoZCkpIHwgKChjKSAmIChkKSkpCisKKworI2RlZmluZSBTSEExU3RlcChmLCBhLCBiLCBjLCBkLCBlLCB3LCBrKSAgICBcCisgICAgKCBlCSs9ICggZihiLCBjLCBkKSArIHcgKyBrICsgQ1lDTElDX0xFRlRfU0hJRlQoYSwgNSkpICYgMHhmZmZmZmZmZiwgXAorICAgICAgYiA9IENZQ0xJQ19MRUZUX1NISUZUKGIsIDMwKSApCisKKy8vSW5pdGlhdGUgU0hBLTEgQ29udGV4dCBzYXRpc2ZpZWQgaW4gUkZDIDMxNzQKK1ZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworICAgIHBDdHgtPkJ1Zls0XT0weGMzZDJlMWYwOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVXBkYXRlIFNIQS0xIENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQKKyAqICAgICAgcG9ydGlvbiBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gU0hBLTEgY29udGV4dAorICogCSAgICBwRGF0YSAgICAgICBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAqICAgICAgTGVuSW5CeXRlcyAgVGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhICh1bml0OiBieXRlKQorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIGVycm9yICAgICAgIGluZGljYXRlIG1vcmUgdGhhbiBwb3coMiw2NCkgYml0cyBvZiBkYXRhCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBTSEFJbml0IG9yIFNIQVVwZGF0ZShpdHNlbGYpCisgKi8KK1VDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKQoreworICAgIFVJTlQzMiBUZlRpbWVzOworICAgIFVJTlQzMiB0ZW1wMSx0ZW1wMjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlVQ0hBUiBlcnI9MTsKKworICAgIHRlbXAxID0gcEN0eC0+TGVuSW5CaXRDb3VudFswXTsKKyAgICB0ZW1wMiA9IHBDdHgtPkxlbkluQml0Q291bnRbMV07CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gKyAoTGVuSW5CeXRlcyA8PCAzKSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wMSkKKyAgICAgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSsrOyAgIC8vY2FycnkgaW4KKworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzFdICsoTGVuSW5CeXRlcyA+PiAyOSkpOworICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzFdIDwgdGVtcDIpCisgICAgICAgIHJldHVybiAoZXJyKTsgICAvL2NoZWNrIHRvdGFsIGxlbmd0aCBvZiBvcmlnaW5hbCBkYXRhCisKKworICAgIC8vIG1vZCA2NCBieXRlcworICAgIHRlbXAxID0gKHRlbXAxID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXAxKQorICAgIHsKKyAgICAgICAgVUNIQVIgKnBBZHMgPSAoVUNIQVIgKikgcEN0eC0+SW5wdXQgKyB0ZW1wMTsKKworICAgICAgICBpZiAoKHRlbXAxK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgNjQtdGVtcDEpOworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wMTsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NC10ZW1wMTsKKyAgICB9IC8vIGVuZCBvZiBpZiAodGVtcDEpCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICAgICAgcERhdGEgKz0gNjQ7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQ7CisgICAgfSAvLyBlbmQgb2YgZm9yCisKKyAgICAvLyBidWZmZXJpbmcgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYoTGVuSW5CeXRlcykKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKworCXJldHVybiAoMCk7CisKK30KKworLy8gQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKy8vIFRoZSBtZXNzYWdlIGRpZ2VzdCBoYXMgdG8gYmUgY29tcGxldGVkIGluIHRoZSBlbmQKK1ZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSkKK3sKKyAgICBVQ0hBUiBSZW1haW5kZXI7CisgICAgVUNIQVIgUGFkTGVuSW5CeXRlczsKKyAgICBVQ0hBUiAqcEFwcGVuZD0wOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgUmVtYWluZGVyID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAzKSAmIDB4M2YpOworCisgICAgcEFwcGVuZCA9IChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyOworCisgICAgUGFkTGVuSW5CeXRlcyA9IChSZW1haW5kZXIgPCA1NikgPyAoNTYtUmVtYWluZGVyKSA6ICgxMjAtUmVtYWluZGVyKTsKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRob3V0IGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgaWYgKFJlbWFpbmRlciA8IDU2KQorICAgIHsKKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsIFBhZExlbkluQnl0ZXMpOworCisJCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZCwgZnJvbSBoaWdoIHRvIGxvdworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNCk7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisKKyAgICAgICAgLy8gdGhlIHNlY29uZCBibG9jayA9PT0KKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQsIFBhZExlbkluQnl0ZXMpOworCisJCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZAorCQlmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgCX0KKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICAvL091dHB1dCwgYnl0ZXJldmVyc2UKKyAgICBmb3IgKGk9MDsgaTwyMDsgaSsrKQorICAgIHsKKyAgICAgICAgRGlnZXN0IFtpXSA9IChVQ0hBUikocEN0eC0+QnVmW2k+PjJdID4+IDgqKDMtKGkgJiAweDMpKSk7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEN0eCwgc2l6ZW9mKHBDdHgpKTsgLy8gbWVtb3J5IGZyZWUKK30KKworCisvLyBUaGUgY2VudHJhbCBhbGdvcml0aG0gb2YgU0hBLTEsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZAorLy8gdHdlbnR5IHN0ZXBzIHBlciByb3VuZAorVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pCit7CisgICAgVUlOVDMyIFJlZ1s1XSxUZW1wOworCXVuc2lnbmVkIGludCBpOworICAgIFVJTlQzMiBXWzgwXTsKKworICAgIHN0YXRpYyBVSU5UMzIgU0hBMVRhYmxlWzRdID0geyAweDVhODI3OTk5LCAweDZlZDllYmExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OGYxYmJjZGMsIDB4Y2E2MmMxZDYgfTsKKworICAgIFJlZ1swXT1CdWZbMF07CisJUmVnWzFdPUJ1ZlsxXTsKKwlSZWdbMl09QnVmWzJdOworCVJlZ1szXT1CdWZbM107CisJUmVnWzRdPUJ1Zls0XTsKKworICAgIC8vdGhlIGZpcnN0IG9jdGV0IG9mIGEgd29yZCBpcyBzdG9yZWQgaW4gdGhlIDB0aCBlbGVtZW50LCBieXRlcmV2ZXJzZQorCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgIAlXW2ldICA9IChNZXNbaV0gPj4gMjQpICYgMHhmZjsKKyAgICAgICAgV1tpXSB8PSAoTWVzW2ldID4+IDggKSAmIDB4ZmYwMDsKKyAgICAgICAgV1tpXSB8PSAoTWVzW2ldIDw8IDggKSAmIDB4ZmYwMDAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgMjQpICYgMHhmZjAwMDAwMDsKKyAgICB9CisKKworICAgIGZvcgkoaSA9IDA7IGkgPCA2NDsgaSsrKQorCSAgICBXWzE2K2ldID0gQ1lDTElDX0xFRlRfU0hJRlQoV1tpXSBeIFdbMitpXSBeIFdbOCtpXSBeIFdbMTMraV0sIDEpOworCisKKyAgICAvLyA4MCBzdGVwcyBpbiBTSEEtMSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTw4MDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGk8MjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YxLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVswXSk7CisKKyAgICAgICAgZWxzZSBpZiAoaT49MjAgJiYgaTw0MCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzFdKTsKKworCQllbHNlIGlmIChpPj00MCAmJiBpPDYwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMywgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzJdKTsKKworICAgICAgICBlbHNlCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVszXSk7CisKKworICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisJCVRlbXAgICA9IFJlZ1s0XTsKKyAgICAgICAgUmVnWzRdID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworCisgICAgfSAvLyBlbmQgb2YgZm9yLWxvb3AKKworCisgICAgLy8gKHRlbXBvcmFyeSlvdXRwdXQKKyAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgICAgIEJ1ZltpXSArPSBSZWdbaV07CisKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBBRVMgRW4vRGVjcnlwdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBmb3J3YXJkIFMtYm94ICovCitzdGF0aWMgdWludDMyIEZTYlsyNTZdID0KK3sKKwkweDYzLCAweDdDLAkweDc3LCAweDdCLAkweEYyLCAweDZCLAkweDZGLCAweEM1LAorCTB4MzAsIDB4MDEsCTB4NjcsIDB4MkIsCTB4RkUsIDB4RDcsCTB4QUIsIDB4NzYsCisJMHhDQSwgMHg4MiwJMHhDOSwgMHg3RCwJMHhGQSwgMHg1OSwJMHg0NywgMHhGMCwKKwkweEFELCAweEQ0LAkweEEyLCAweEFGLAkweDlDLCAweEE0LAkweDcyLCAweEMwLAorCTB4QjcsIDB4RkQsCTB4OTMsIDB4MjYsCTB4MzYsIDB4M0YsCTB4RjcsIDB4Q0MsCisJMHgzNCwgMHhBNSwJMHhFNSwgMHhGMSwJMHg3MSwgMHhEOCwJMHgzMSwgMHgxNSwKKwkweDA0LCAweEM3LAkweDIzLCAweEMzLAkweDE4LCAweDk2LAkweDA1LCAweDlBLAorCTB4MDcsIDB4MTIsCTB4ODAsIDB4RTIsCTB4RUIsIDB4MjcsCTB4QjIsIDB4NzUsCisJMHgwOSwgMHg4MywJMHgyQywgMHgxQSwJMHgxQiwgMHg2RSwJMHg1QSwgMHhBMCwKKwkweDUyLCAweDNCLAkweEQ2LCAweEIzLAkweDI5LCAweEUzLAkweDJGLCAweDg0LAorCTB4NTMsIDB4RDEsCTB4MDAsIDB4RUQsCTB4MjAsIDB4RkMsCTB4QjEsIDB4NUIsCisJMHg2QSwgMHhDQiwJMHhCRSwgMHgzOSwJMHg0QSwgMHg0QywJMHg1OCwgMHhDRiwKKwkweEQwLCAweEVGLAkweEFBLCAweEZCLAkweDQzLCAweDRELAkweDMzLCAweDg1LAorCTB4NDUsIDB4RjksCTB4MDIsIDB4N0YsCTB4NTAsIDB4M0MsCTB4OUYsIDB4QTgsCisJMHg1MSwgMHhBMywJMHg0MCwgMHg4RiwJMHg5MiwgMHg5RCwJMHgzOCwgMHhGNSwKKwkweEJDLCAweEI2LAkweERBLCAweDIxLAkweDEwLCAweEZGLAkweEYzLCAweEQyLAorCTB4Q0QsIDB4MEMsCTB4MTMsIDB4RUMsCTB4NUYsIDB4OTcsCTB4NDQsIDB4MTcsCisJMHhDNCwgMHhBNywJMHg3RSwgMHgzRCwJMHg2NCwgMHg1RCwJMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLAkweDRGLCAweERDLAkweDIyLCAweDJBLAkweDkwLCAweDg4LAorCTB4NDYsIDB4RUUsCTB4QjgsIDB4MTQsCTB4REUsIDB4NUUsCTB4MEIsIDB4REIsCisJMHhFMCwgMHgzMiwJMHgzQSwgMHgwQSwJMHg0OSwgMHgwNiwJMHgyNCwgMHg1QywKKwkweEMyLCAweEQzLAkweEFDLCAweDYyLAkweDkxLCAweDk1LAkweEU0LCAweDc5LAorCTB4RTcsIDB4QzgsCTB4MzcsIDB4NkQsCTB4OEQsIDB4RDUsCTB4NEUsIDB4QTksCisJMHg2QywgMHg1NiwJMHhGNCwgMHhFQSwJMHg2NSwgMHg3QSwJMHhBRSwgMHgwOCwKKwkweEJBLCAweDc4LAkweDI1LCAweDJFLAkweDFDLCAweEE2LAkweEI0LCAweEM2LAorCTB4RTgsIDB4REQsCTB4NzQsIDB4MUYsCTB4NEIsIDB4QkQsCTB4OEIsIDB4OEEsCisJMHg3MCwgMHgzRSwJMHhCNSwgMHg2NiwJMHg0OCwgMHgwMywJMHhGNiwgMHgwRSwKKwkweDYxLCAweDM1LAkweDU3LCAweEI5LAkweDg2LCAweEMxLAkweDFELCAweDlFLAorCTB4RTEsIDB4RjgsCTB4OTgsIDB4MTEsCTB4NjksIDB4RDksCTB4OEUsIDB4OTQsCisJMHg5QiwgMHgxRSwJMHg4NywgMHhFOSwJMHhDRSwgMHg1NSwJMHgyOCwgMHhERiwKKwkweDhDLCAweEExLAkweDg5LCAweDBELAkweEJGLCAweEU2LAkweDQyLCAweDY4LAorCTB4NDEsIDB4OTksCTB4MkQsIDB4MEYsCTB4QjAsIDB4NTQsCTB4QkIsIDB4MTYKK307CisKKy8qIGZvcndhcmQgdGFibGUgKi8KKyNkZWZpbmUJRlQgXAorXAorCVYoQzYsNjMsNjMsQTUpLAlWKEY4LDdDLDdDLDg0KSwJVihFRSw3Nyw3Nyw5OSksCVYoRjYsN0IsN0IsOEQpLAlcCisJVihGRixGMixGMiwwRCksCVYoRDYsNkIsNkIsQkQpLAlWKERFLDZGLDZGLEIxKSwJVig5MSxDNSxDNSw1NCksCVwKKwlWKDYwLDMwLDMwLDUwKSwJVigwMiwwMSwwMSwwMyksCVYoQ0UsNjcsNjcsQTkpLAlWKDU2LDJCLDJCLDdEKSwJXAorCVYoRTcsRkUsRkUsMTkpLAlWKEI1LEQ3LEQ3LDYyKSwJVig0RCxBQixBQixFNiksCVYoRUMsNzYsNzYsOUEpLAlcCisJVig4RixDQSxDQSw0NSksCVYoMUYsODIsODIsOUQpLAlWKDg5LEM5LEM5LDQwKSwJVihGQSw3RCw3RCw4NyksCVwKKwlWKEVGLEZBLEZBLDE1KSwJVihCMiw1OSw1OSxFQiksCVYoOEUsNDcsNDcsQzkpLAlWKEZCLEYwLEYwLDBCKSwJXAorCVYoNDEsQUQsQUQsRUMpLAlWKEIzLEQ0LEQ0LDY3KSwJVig1RixBMixBMixGRCksCVYoNDUsQUYsQUYsRUEpLAlcCisJVigyMyw5Qyw5QyxCRiksCVYoNTMsQTQsQTQsRjcpLAlWKEU0LDcyLDcyLDk2KSwJVig5QixDMCxDMCw1QiksCVwKKwlWKDc1LEI3LEI3LEMyKSwJVihFMSxGRCxGRCwxQyksCVYoM0QsOTMsOTMsQUUpLAlWKDRDLDI2LDI2LDZBKSwJXAorCVYoNkMsMzYsMzYsNUEpLAlWKDdFLDNGLDNGLDQxKSwJVihGNSxGNyxGNywwMiksCVYoODMsQ0MsQ0MsNEYpLAlcCisJVig2OCwzNCwzNCw1QyksCVYoNTEsQTUsQTUsRjQpLAlWKEQxLEU1LEU1LDM0KSwJVihGOSxGMSxGMSwwOCksCVwKKwlWKEUyLDcxLDcxLDkzKSwJVihBQixEOCxEOCw3MyksCVYoNjIsMzEsMzEsNTMpLAlWKDJBLDE1LDE1LDNGKSwJXAorCVYoMDgsMDQsMDQsMEMpLAlWKDk1LEM3LEM3LDUyKSwJVig0NiwyMywyMyw2NSksCVYoOUQsQzMsQzMsNUUpLAlcCisJVigzMCwxOCwxOCwyOCksCVYoMzcsOTYsOTYsQTEpLAlWKDBBLDA1LDA1LDBGKSwJVigyRiw5QSw5QSxCNSksCVwKKwlWKDBFLDA3LDA3LDA5KSwJVigyNCwxMiwxMiwzNiksCVYoMUIsODAsODAsOUIpLAlWKERGLEUyLEUyLDNEKSwJXAorCVYoQ0QsRUIsRUIsMjYpLAlWKDRFLDI3LDI3LDY5KSwJVig3RixCMixCMixDRCksCVYoRUEsNzUsNzUsOUYpLAlcCisJVigxMiwwOSwwOSwxQiksCVYoMUQsODMsODMsOUUpLAlWKDU4LDJDLDJDLDc0KSwJVigzNCwxQSwxQSwyRSksCVwKKwlWKDM2LDFCLDFCLDJEKSwJVihEQyw2RSw2RSxCMiksCVYoQjQsNUEsNUEsRUUpLAlWKDVCLEEwLEEwLEZCKSwJXAorCVYoQTQsNTIsNTIsRjYpLAlWKDc2LDNCLDNCLDREKSwJVihCNyxENixENiw2MSksCVYoN0QsQjMsQjMsQ0UpLAlcCisJVig1MiwyOSwyOSw3QiksCVYoREQsRTMsRTMsM0UpLAlWKDVFLDJGLDJGLDcxKSwJVigxMyw4NCw4NCw5NyksCVwKKwlWKEE2LDUzLDUzLEY1KSwJVihCOSxEMSxEMSw2OCksCVYoMDAsMDAsMDAsMDApLAlWKEMxLEVELEVELDJDKSwJXAorCVYoNDAsMjAsMjAsNjApLAlWKEUzLEZDLEZDLDFGKSwJVig3OSxCMSxCMSxDOCksCVYoQjYsNUIsNUIsRUQpLAlcCisJVihENCw2QSw2QSxCRSksCVYoOEQsQ0IsQ0IsNDYpLAlWKDY3LEJFLEJFLEQ5KSwJVig3MiwzOSwzOSw0QiksCVwKKwlWKDk0LDRBLDRBLERFKSwJVig5OCw0Qyw0QyxENCksCVYoQjAsNTgsNTgsRTgpLAlWKDg1LENGLENGLDRBKSwJXAorCVYoQkIsRDAsRDAsNkIpLAlWKEM1LEVGLEVGLDJBKSwJVig0RixBQSxBQSxFNSksCVYoRUQsRkIsRkIsMTYpLAlcCisJVig4Niw0Myw0MyxDNSksCVYoOUEsNEQsNEQsRDcpLAlWKDY2LDMzLDMzLDU1KSwJVigxMSw4NSw4NSw5NCksCVwKKwlWKDhBLDQ1LDQ1LENGKSwJVihFOSxGOSxGOSwxMCksCVYoMDQsMDIsMDIsMDYpLAlWKEZFLDdGLDdGLDgxKSwJXAorCVYoQTAsNTAsNTAsRjApLAlWKDc4LDNDLDNDLDQ0KSwJVigyNSw5Riw5RixCQSksCVYoNEIsQTgsQTgsRTMpLAlcCisJVihBMiw1MSw1MSxGMyksCVYoNUQsQTMsQTMsRkUpLAlWKDgwLDQwLDQwLEMwKSwJVigwNSw4Riw4Riw4QSksCVwKKwlWKDNGLDkyLDkyLEFEKSwJVigyMSw5RCw5RCxCQyksCVYoNzAsMzgsMzgsNDgpLAlWKEYxLEY1LEY1LDA0KSwJXAorCVYoNjMsQkMsQkMsREYpLAlWKDc3LEI2LEI2LEMxKSwJVihBRixEQSxEQSw3NSksCVYoNDIsMjEsMjEsNjMpLAlcCisJVigyMCwxMCwxMCwzMCksCVYoRTUsRkYsRkYsMUEpLAlWKEZELEYzLEYzLDBFKSwJVihCRixEMixEMiw2RCksCVwKKwlWKDgxLENELENELDRDKSwJVigxOCwwQywwQywxNCksCVYoMjYsMTMsMTMsMzUpLAlWKEMzLEVDLEVDLDJGKSwJXAorCVYoQkUsNUYsNUYsRTEpLAlWKDM1LDk3LDk3LEEyKSwJVig4OCw0NCw0NCxDQyksCVYoMkUsMTcsMTcsMzkpLAlcCisJVig5MyxDNCxDNCw1NyksCVYoNTUsQTcsQTcsRjIpLAlWKEZDLDdFLDdFLDgyKSwJVig3QSwzRCwzRCw0NyksCVwKKwlWKEM4LDY0LDY0LEFDKSwJVihCQSw1RCw1RCxFNyksCVYoMzIsMTksMTksMkIpLAlWKEU2LDczLDczLDk1KSwJXAorCVYoQzAsNjAsNjAsQTApLAlWKDE5LDgxLDgxLDk4KSwJVig5RSw0Riw0RixEMSksCVYoQTMsREMsREMsN0YpLAlcCisJVig0NCwyMiwyMiw2NiksCVYoNTQsMkEsMkEsN0UpLAlWKDNCLDkwLDkwLEFCKSwJVigwQiw4OCw4OCw4MyksCVwKKwlWKDhDLDQ2LDQ2LENBKSwJVihDNyxFRSxFRSwyOSksCVYoNkIsQjgsQjgsRDMpLAlWKDI4LDE0LDE0LDNDKSwJXAorCVYoQTcsREUsREUsNzkpLAlWKEJDLDVFLDVFLEUyKSwJVigxNiwwQiwwQiwxRCksCVYoQUQsREIsREIsNzYpLAlcCisJVihEQixFMCxFMCwzQiksCVYoNjQsMzIsMzIsNTYpLAlWKDc0LDNBLDNBLDRFKSwJVigxNCwwQSwwQSwxRSksCVwKKwlWKDkyLDQ5LDQ5LERCKSwJVigwQywwNiwwNiwwQSksCVYoNDgsMjQsMjQsNkMpLAlWKEI4LDVDLDVDLEU0KSwJXAorCVYoOUYsQzIsQzIsNUQpLAlWKEJELEQzLEQzLDZFKSwJVig0MyxBQyxBQyxFRiksCVYoQzQsNjIsNjIsQTYpLAlcCisJVigzOSw5MSw5MSxBOCksCVYoMzEsOTUsOTUsQTQpLAlWKEQzLEU0LEU0LDM3KSwJVihGMiw3OSw3OSw4QiksCVwKKwlWKEQ1LEU3LEU3LDMyKSwJVig4QixDOCxDOCw0MyksCVYoNkUsMzcsMzcsNTkpLAlWKERBLDZELDZELEI3KSwJXAorCVYoMDEsOEQsOEQsOEMpLAlWKEIxLEQ1LEQ1LDY0KSwJVig5Qyw0RSw0RSxEMiksCVYoNDksQTksQTksRTApLAlcCisJVihEOCw2Qyw2QyxCNCksCVYoQUMsNTYsNTYsRkEpLAlWKEYzLEY0LEY0LDA3KSwJVihDRixFQSxFQSwyNSksCVwKKwlWKENBLDY1LDY1LEFGKSwJVihGNCw3QSw3QSw4RSksCVYoNDcsQUUsQUUsRTkpLAlWKDEwLDA4LDA4LDE4KSwJXAorCVYoNkYsQkEsQkEsRDUpLAlWKEYwLDc4LDc4LDg4KSwJVig0QSwyNSwyNSw2RiksCVYoNUMsMkUsMkUsNzIpLAlcCisJVigzOCwxQywxQywyNCksCVYoNTcsQTYsQTYsRjEpLAlWKDczLEI0LEI0LEM3KSwJVig5NyxDNixDNiw1MSksCVwKKwlWKENCLEU4LEU4LDIzKSwJVihBMSxERCxERCw3QyksCVYoRTgsNzQsNzQsOUMpLAlWKDNFLDFGLDFGLDIxKSwJXAorCVYoOTYsNEIsNEIsREQpLAlWKDYxLEJELEJELERDKSwJVigwRCw4Qiw4Qiw4NiksCVYoMEYsOEEsOEEsODUpLAlcCisJVihFMCw3MCw3MCw5MCksCVYoN0MsM0UsM0UsNDIpLAlWKDcxLEI1LEI1LEM0KSwJVihDQyw2Niw2NixBQSksCVwKKwlWKDkwLDQ4LDQ4LEQ4KSwJVigwNiwwMywwMywwNSksCVYoRjcsRjYsRjYsMDEpLAlWKDFDLDBFLDBFLDEyKSwJXAorCVYoQzIsNjEsNjEsQTMpLAlWKDZBLDM1LDM1LDVGKSwJVihBRSw1Nyw1NyxGOSksCVYoNjksQjksQjksRDApLAlcCisJVigxNyw4Niw4Niw5MSksCVYoOTksQzEsQzEsNTgpLAlWKDNBLDFELDFELDI3KSwJVigyNyw5RSw5RSxCOSksCVwKKwlWKEQ5LEUxLEUxLDM4KSwJVihFQixGOCxGOCwxMyksCVYoMkIsOTgsOTgsQjMpLAlWKDIyLDExLDExLDMzKSwJXAorCVYoRDIsNjksNjksQkIpLAlWKEE5LEQ5LEQ5LDcwKSwJVigwNyw4RSw4RSw4OSksCVYoMzMsOTQsOTQsQTcpLAlcCisJVigyRCw5Qiw5QixCNiksCVYoM0MsMUUsMUUsMjIpLAlWKDE1LDg3LDg3LDkyKSwJVihDOSxFOSxFOSwyMCksCVwKKwlWKDg3LENFLENFLDQ5KSwJVihBQSw1NSw1NSxGRiksCVYoNTAsMjgsMjgsNzgpLAlWKEE1LERGLERGLDdBKSwJXAorCVYoMDMsOEMsOEMsOEYpLAlWKDU5LEExLEExLEY4KSwJVigwOSw4OSw4OSw4MCksCVYoMUEsMEQsMEQsMTcpLAlcCisJVig2NSxCRixCRixEQSksCVYoRDcsRTYsRTYsMzEpLAlWKDg0LDQyLDQyLEM2KSwJVihEMCw2OCw2OCxCOCksCVwKKwlWKDgyLDQxLDQxLEMzKSwJVigyOSw5OSw5OSxCMCksCVYoNUEsMkQsMkQsNzcpLAlWKDFFLDBGLDBGLDExKSwJXAorCVYoN0IsQjAsQjAsQ0IpLAlWKEE4LDU0LDU0LEZDKSwJVig2RCxCQixCQixENiksCVYoMkMsMTYsMTYsM0EpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBGVDFbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBGVAorCisvKiByZXZlcnNlIFMtYm94ICovCisKK3N0YXRpYyB1aW50MzIgUlNiWzI1Nl0gPQoreworCTB4NTIsIDB4MDksCTB4NkEsIDB4RDUsCTB4MzAsIDB4MzYsCTB4QTUsIDB4MzgsCisJMHhCRiwgMHg0MCwJMHhBMywgMHg5RSwJMHg4MSwgMHhGMywJMHhENywgMHhGQiwKKwkweDdDLCAweEUzLAkweDM5LCAweDgyLAkweDlCLCAweDJGLAkweEZGLCAweDg3LAorCTB4MzQsIDB4OEUsCTB4NDMsIDB4NDQsCTB4QzQsIDB4REUsCTB4RTksIDB4Q0IsCisJMHg1NCwgMHg3QiwJMHg5NCwgMHgzMiwJMHhBNiwgMHhDMiwJMHgyMywgMHgzRCwKKwkweEVFLCAweDRDLAkweDk1LCAweDBCLAkweDQyLCAweEZBLAkweEMzLCAweDRFLAorCTB4MDgsIDB4MkUsCTB4QTEsIDB4NjYsCTB4MjgsIDB4RDksCTB4MjQsIDB4QjIsCisJMHg3NiwgMHg1QiwJMHhBMiwgMHg0OSwJMHg2RCwgMHg4QiwJMHhEMSwgMHgyNSwKKwkweDcyLCAweEY4LAkweEY2LCAweDY0LAkweDg2LCAweDY4LAkweDk4LCAweDE2LAorCTB4RDQsIDB4QTQsCTB4NUMsIDB4Q0MsCTB4NUQsIDB4NjUsCTB4QjYsIDB4OTIsCisJMHg2QywgMHg3MCwJMHg0OCwgMHg1MCwJMHhGRCwgMHhFRCwJMHhCOSwgMHhEQSwKKwkweDVFLCAweDE1LAkweDQ2LCAweDU3LAkweEE3LCAweDhELAkweDlELCAweDg0LAorCTB4OTAsIDB4RDgsCTB4QUIsIDB4MDAsCTB4OEMsIDB4QkMsCTB4RDMsIDB4MEEsCisJMHhGNywgMHhFNCwJMHg1OCwgMHgwNSwJMHhCOCwgMHhCMywJMHg0NSwgMHgwNiwKKwkweEQwLCAweDJDLAkweDFFLCAweDhGLAkweENBLCAweDNGLAkweDBGLCAweDAyLAorCTB4QzEsIDB4QUYsCTB4QkQsIDB4MDMsCTB4MDEsIDB4MTMsCTB4OEEsIDB4NkIsCisJMHgzQSwgMHg5MSwJMHgxMSwgMHg0MSwJMHg0RiwgMHg2NywJMHhEQywgMHhFQSwKKwkweDk3LCAweEYyLAkweENGLCAweENFLAkweEYwLCAweEI0LAkweEU2LCAweDczLAorCTB4OTYsIDB4QUMsCTB4NzQsIDB4MjIsCTB4RTcsIDB4QUQsCTB4MzUsIDB4ODUsCisJMHhFMiwgMHhGOSwJMHgzNywgMHhFOCwJMHgxQywgMHg3NSwJMHhERiwgMHg2RSwKKwkweDQ3LCAweEYxLAkweDFBLCAweDcxLAkweDFELCAweDI5LAkweEM1LCAweDg5LAorCTB4NkYsIDB4QjcsCTB4NjIsIDB4MEUsCTB4QUEsIDB4MTgsCTB4QkUsIDB4MUIsCisJMHhGQywgMHg1NiwJMHgzRSwgMHg0QiwJMHhDNiwgMHhEMiwJMHg3OSwgMHgyMCwKKwkweDlBLCAweERCLAkweEMwLCAweEZFLAkweDc4LCAweENELAkweDVBLCAweEY0LAorCTB4MUYsIDB4REQsCTB4QTgsIDB4MzMsCTB4ODgsIDB4MDcsCTB4QzcsIDB4MzEsCisJMHhCMSwgMHgxMiwJMHgxMCwgMHg1OSwJMHgyNywgMHg4MCwJMHhFQywgMHg1RiwKKwkweDYwLCAweDUxLAkweDdGLCAweEE5LAkweDE5LCAweEI1LAkweDRBLCAweDBELAorCTB4MkQsIDB4RTUsCTB4N0EsIDB4OUYsCTB4OTMsIDB4QzksCTB4OUMsIDB4RUYsCisJMHhBMCwgMHhFMCwJMHgzQiwgMHg0RCwJMHhBRSwgMHgyQSwJMHhGNSwgMHhCMCwKKwkweEM4LCAweEVCLAkweEJCLCAweDNDLAkweDgzLCAweDUzLAkweDk5LCAweDYxLAorCTB4MTcsIDB4MkIsCTB4MDQsIDB4N0UsCTB4QkEsIDB4NzcsCTB4RDYsIDB4MjYsCisJMHhFMSwgMHg2OSwJMHgxNCwgMHg2MywJMHg1NSwgMHgyMSwJMHgwQywgMHg3RAorfTsKKworLyogcmV2ZXJzZSB0YWJsZSAqLworCisjZGVmaW5lCVJUIFwKK1wKKwlWKDUxLEY0LEE3LDUwKSwJVig3RSw0MSw2NSw1MyksCVYoMUEsMTcsQTQsQzMpLAlWKDNBLDI3LDVFLDk2KSwJXAorCVYoM0IsQUIsNkIsQ0IpLAlWKDFGLDlELDQ1LEYxKSwJVihBQyxGQSw1OCxBQiksCVYoNEIsRTMsMDMsOTMpLAlcCisJVigyMCwzMCxGQSw1NSksCVYoQUQsNzYsNkQsRjYpLAlWKDg4LENDLDc2LDkxKSwJVihGNSwwMiw0QywyNSksCVwKKwlWKDRGLEU1LEQ3LEZDKSwJVihDNSwyQSxDQixENyksCVYoMjYsMzUsNDQsODApLAlWKEI1LDYyLEEzLDhGKSwJXAorCVYoREUsQjEsNUEsNDkpLAlWKDI1LEJBLDFCLDY3KSwJVig0NSxFQSwwRSw5OCksCVYoNUQsRkUsQzAsRTEpLAlcCisJVihDMywyRiw3NSwwMiksCVYoODEsNEMsRjAsMTIpLAlWKDhELDQ2LDk3LEEzKSwJVig2QixEMyxGOSxDNiksCVwKKwlWKDAzLDhGLDVGLEU3KSwJVigxNSw5Miw5Qyw5NSksCVYoQkYsNkQsN0EsRUIpLAlWKDk1LDUyLDU5LERBKSwJXAorCVYoRDQsQkUsODMsMkQpLAlWKDU4LDc0LDIxLEQzKSwJVig0OSxFMCw2OSwyOSksCVYoOEUsQzksQzgsNDQpLAlcCisJVig3NSxDMiw4OSw2QSksCVYoRjQsOEUsNzksNzgpLAlWKDk5LDU4LDNFLDZCKSwJVigyNyxCOSw3MSxERCksCVwKKwlWKEJFLEUxLDRGLEI2KSwJVihGMCw4OCxBRCwxNyksCVYoQzksMjAsQUMsNjYpLAlWKDdELENFLDNBLEI0KSwJXAorCVYoNjMsREYsNEEsMTgpLAlWKEU1LDFBLDMxLDgyKSwJVig5Nyw1MSwzMyw2MCksCVYoNjIsNTMsN0YsNDUpLAlcCisJVihCMSw2NCw3NyxFMCksCVYoQkIsNkIsQUUsODQpLAlWKEZFLDgxLEEwLDFDKSwJVihGOSwwOCwyQiw5NCksCVwKKwlWKDcwLDQ4LDY4LDU4KSwJVig4Riw0NSxGRCwxOSksCVYoOTQsREUsNkMsODcpLAlWKDUyLDdCLEY4LEI3KSwJXAorCVYoQUIsNzMsRDMsMjMpLAlWKDcyLDRCLDAyLEUyKSwJVihFMywxRiw4Riw1NyksCVYoNjYsNTUsQUIsMkEpLAlcCisJVihCMixFQiwyOCwwNyksCVYoMkYsQjUsQzIsMDMpLAlWKDg2LEM1LDdCLDlBKSwJVihEMywzNywwOCxBNSksCVwKKwlWKDMwLDI4LDg3LEYyKSwJVigyMyxCRixBNSxCMiksCVYoMDIsMDMsNkEsQkEpLAlWKEVELDE2LDgyLDVDKSwJXAorCVYoOEEsQ0YsMUMsMkIpLAlWKEE3LDc5LEI0LDkyKSwJVihGMywwNyxGMixGMCksCVYoNEUsNjksRTIsQTEpLAlcCisJVig2NSxEQSxGNCxDRCksCVYoMDYsMDUsQkUsRDUpLAlWKEQxLDM0LDYyLDFGKSwJVihDNCxBNixGRSw4QSksCVwKKwlWKDM0LDJFLDUzLDlEKSwJVihBMixGMyw1NSxBMCksCVYoMDUsOEEsRTEsMzIpLAlWKEE0LEY2LEVCLDc1KSwJXAorCVYoMEIsODMsRUMsMzkpLAlWKDQwLDYwLEVGLEFBKSwJVig1RSw3MSw5RiwwNiksCVYoQkQsNkUsMTAsNTEpLAlcCisJVigzRSwyMSw4QSxGOSksCVYoOTYsREQsMDYsM0QpLAlWKERELDNFLDA1LEFFKSwJVig0RCxFNixCRCw0NiksCVwKKwlWKDkxLDU0LDhELEI1KSwJVig3MSxDNCw1RCwwNSksCVYoMDQsMDYsRDQsNkYpLAlWKDYwLDUwLDE1LEZGKSwJXAorCVYoMTksOTgsRkIsMjQpLAlWKEQ2LEJELEU5LDk3KSwJVig4OSw0MCw0MyxDQyksCVYoNjcsRDksOUUsNzcpLAlcCisJVihCMCxFOCw0MixCRCksCVYoMDcsODksOEIsODgpLAlWKEU3LDE5LDVCLDM4KSwJVig3OSxDOCxFRSxEQiksCVwKKwlWKEExLDdDLDBBLDQ3KSwJVig3Qyw0MiwwRixFOSksCVYoRjgsODQsMUUsQzkpLAlWKDAwLDAwLDAwLDAwKSwJXAorCVYoMDksODAsODYsODMpLAlWKDMyLDJCLEVELDQ4KSwJVigxRSwxMSw3MCxBQyksCVYoNkMsNUEsNzIsNEUpLAlcCisJVihGRCwwRSxGRixGQiksCVYoMEYsODUsMzgsNTYpLAlWKDNELEFFLEQ1LDFFKSwJVigzNiwyRCwzOSwyNyksCVwKKwlWKDBBLDBGLEQ5LDY0KSwJVig2OCw1QyxBNiwyMSksCVYoOUIsNUIsNTQsRDEpLAlWKDI0LDM2LDJFLDNBKSwJXAorCVYoMEMsMEEsNjcsQjEpLAlWKDkzLDU3LEU3LDBGKSwJVihCNCxFRSw5NixEMiksCVYoMUIsOUIsOTEsOUUpLAlcCisJVig4MCxDMCxDNSw0RiksCVYoNjEsREMsMjAsQTIpLAlWKDVBLDc3LDRCLDY5KSwJVigxQywxMiwxQSwxNiksCVwKKwlWKEUyLDkzLEJBLDBBKSwJVihDMCxBMCwyQSxFNSksCVYoM0MsMjIsRTAsNDMpLAlWKDEyLDFCLDE3LDFEKSwJXAorCVYoMEUsMDksMEQsMEIpLAlWKEYyLDhCLEM3LEFEKSwJVigyRCxCNixBOCxCOSksCVYoMTQsMUUsQTksQzgpLAlcCisJVig1NyxGMSwxOSw4NSksCVYoQUYsNzUsMDcsNEMpLAlWKEVFLDk5LERELEJCKSwJVihBMyw3Riw2MCxGRCksCVwKKwlWKEY3LDAxLDI2LDlGKSwJVig1Qyw3MixGNSxCQyksCVYoNDQsNjYsM0IsQzUpLAlWKDVCLEZCLDdFLDM0KSwJXAorCVYoOEIsNDMsMjksNzYpLAlWKENCLDIzLEM2LERDKSwJVihCNixFRCxGQyw2OCksCVYoQjgsRTQsRjEsNjMpLAlcCisJVihENywzMSxEQyxDQSksCVYoNDIsNjMsODUsMTApLAlWKDEzLDk3LDIyLDQwKSwJVig4NCxDNiwxMSwyMCksCVwKKwlWKDg1LDRBLDI0LDdEKSwJVihEMixCQiwzRCxGOCksCVYoQUUsRjksMzIsMTEpLAlWKEM3LDI5LEExLDZEKSwJXAorCVYoMUQsOUUsMkYsNEIpLAlWKERDLEIyLDMwLEYzKSwJVigwRCw4Niw1MixFQyksCVYoNzcsQzEsRTMsRDApLAlcCisJVigyQixCMywxNiw2QyksCVYoQTksNzAsQjksOTkpLAlWKDExLDk0LDQ4LEZBKSwJVig0NyxFOSw2NCwyMiksCVwKKwlWKEE4LEZDLDhDLEM0KSwJVihBMCxGMCwzRiwxQSksCVYoNTYsN0QsMkMsRDgpLAlWKDIyLDMzLDkwLEVGKSwJXAorCVYoODcsNDksNEUsQzcpLAlWKEQ5LDM4LEQxLEMxKSwJVig4QyxDQSxBMixGRSksCVYoOTgsRDQsMEIsMzYpLAlcCisJVihBNixGNSw4MSxDRiksCVYoQTUsN0EsREUsMjgpLAlWKERBLEI3LDhFLDI2KSwJVigzRixBRCxCRixBNCksCVwKKwlWKDJDLDNBLDlELEU0KSwJVig1MCw3OCw5MiwwRCksCVYoNkEsNUYsQ0MsOUIpLAlWKDU0LDdFLDQ2LDYyKSwJXAorCVYoRjYsOEQsMTMsQzIpLAlWKDkwLEQ4LEI4LEU4KSwJVigyRSwzOSxGNyw1RSksCVYoODIsQzMsQUYsRjUpLAlcCisJVig5Riw1RCw4MCxCRSksCVYoNjksRDAsOTMsN0MpLAlWKDZGLEQ1LDJELEE5KSwJVihDRiwyNSwxMixCMyksCVwKKwlWKEM4LEFDLDk5LDNCKSwJVigxMCwxOCw3RCxBNyksCVYoRTgsOUMsNjMsNkUpLAlWKERCLDNCLEJCLDdCKSwJXAorCVYoQ0QsMjYsNzgsMDkpLAlWKDZFLDU5LDE4LEY0KSwJVihFQyw5QSxCNywwMSksCVYoODMsNEYsOUEsQTgpLAlcCisJVihFNiw5NSw2RSw2NSksCVYoQUEsRkYsRTYsN0UpLAlWKDIxLEJDLENGLDA4KSwJVihFRiwxNSxFOCxFNiksCVwKKwlWKEJBLEU3LDlCLEQ5KSwJVig0QSw2RiwzNixDRSksCVYoRUEsOUYsMDksRDQpLAlWKDI5LEIwLDdDLEQ2KSwJXAorCVYoMzEsQTQsQjIsQUYpLAlWKDJBLDNGLDIzLDMxKSwJVihDNixBNSw5NCwzMCksCVYoMzUsQTIsNjYsQzApLAlcCisJVig3NCw0RSxCQywzNyksCVYoRkMsODIsQ0EsQTYpLAlWKEUwLDkwLEQwLEIwKSwJVigzMyxBNyxEOCwxNSksCVwKKwlWKEYxLDA0LDk4LDRBKSwJVig0MSxFQyxEQSxGNyksCVYoN0YsQ0QsNTAsMEUpLAlWKDE3LDkxLEY2LDJGKSwJXAorCVYoNzYsNEQsRDYsOEQpLAlWKDQzLEVGLEIwLDREKSwJVihDQyxBQSw0RCw1NCksCVYoRTQsOTYsMDQsREYpLAlcCisJVig5RSxEMSxCNSxFMyksCVYoNEMsNkEsODgsMUIpLAlWKEMxLDJDLDFGLEI4KSwJVig0Niw2NSw1MSw3RiksCVwKKwlWKDlELDVFLEVBLDA0KSwJVigwMSw4QywzNSw1RCksCVYoRkEsODcsNzQsNzMpLAlWKEZCLDBCLDQxLDJFKSwJXAorCVYoQjMsNjcsMUQsNUEpLAlWKDkyLERCLEQyLDUyKSwJVihFOSwxMCw1NiwzMyksCVYoNkQsRDYsNDcsMTMpLAlcCisJVig5QSxENyw2MSw4QyksCVYoMzcsQTEsMEMsN0EpLAlWKDU5LEY4LDE0LDhFKSwJVihFQiwxMywzQyw4OSksCVwKKwlWKENFLEE5LDI3LEVFKSwJVihCNyw2MSxDOSwzNSksCVYoRTEsMUMsRTUsRUQpLAlWKDdBLDQ3LEIxLDNDKSwJXAorCVYoOUMsRDIsREYsNTkpLAlWKDU1LEYyLDczLDNGKSwJVigxOCwxNCxDRSw3OSksCVYoNzMsQzcsMzcsQkYpLAlcCisJVig1MyxGNyxDRCxFQSksCVYoNUYsRkQsQUEsNUIpLAlWKERGLDNELDZGLDE0KSwJVig3OCw0NCxEQiw4NiksCVwKKwlWKENBLEFGLEYzLDgxKSwJVihCOSw2OCxDNCwzRSksCVYoMzgsMjQsMzQsMkMpLAlWKEMyLEEzLDQwLDVGKSwJXAorCVYoMTYsMUQsQzMsNzIpLAlWKEJDLEUyLDI1LDBDKSwJVigyOCwzQyw0OSw4QiksCVYoRkYsMEQsOTUsNDEpLAlcCisJVigzOSxBOCwwMSw3MSksCVYoMDgsMEMsQjMsREUpLAlWKEQ4LEI0LEU0LDlDKSwJVig2NCw1NixDMSw5MCksCVwKKwlWKDdCLENCLDg0LDYxKSwJVihENSwzMixCNiw3MCksCVYoNDgsNkMsNUMsNzQpLAlWKEQwLEI4LDU3LDQyKQorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyB1aW50MzIgUlQyWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKK3N0YXRpYyB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjdW5kZWYgUlQKKworLyogcm91bmQgY29uc3RhbnRzICovCisKK3N0YXRpYyB1aW50MzIgUkNPTlsxMF0gPQoreworCTB4MDEwMDAwMDAsCTB4MDIwMDAwMDAsCTB4MDQwMDAwMDAsCTB4MDgwMDAwMDAsCisJMHgxMDAwMDAwMCwJMHgyMDAwMDAwMCwJMHg0MDAwMDAwMCwJMHg4MDAwMDAwMCwKKwkweDFCMDAwMDAwLAkweDM2MDAwMDAwCit9OworCisvKiBrZXkgc2NoZWR1bGUJdGFibGVzICovCisKK3N0YXRpYyBpbnQgS1RfaW5pdCA9IDE7CisKK3N0YXRpYyB1aW50MzIgS1QwWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMVsyNTZdOworc3RhdGljIHVpbnQzMiBLVDJbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QzWzI1Nl07CisKKy8qIHBsYXRmb3JtLWluZGVwZW5kYW50CTMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbgltYWNyb3MgKi8KKworI2RlZmluZQlHRVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKG4pCT0gKAkodWludDMyKSAoYilbKGkpCV0gPDwgMjQJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDFdIDw8IDE2CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAyXSA8PCAgOAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgM10JCSk7CQlcCit9CisKKyNkZWZpbmUJUFVUX1VJTlQzMihuLGIsaSkJCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCShiKVsoaSkJICAgXSA9ICh1aW50OCkgKCAobikgPj4JMjQgKTsJCVwKKwkoYilbKGkpCSsgMV0gPSAodWludDgpICggKG4pID4+CTE2ICk7CQlcCisJKGIpWyhpKQkrIDJdID0gKHVpbnQ4KSAoIChuKSA+PgkgOCApOwkJXAorCShiKVsoaSkJKyAzXSA9ICh1aW50OCkgKCAobikJICAgKTsJCVwKK30KKworLyogQUVTIGtleSBzY2hlZHVsaW5nIHJvdXRpbmUgKi8KKworaW50CXJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICprZXksIGludCBuYml0cyApCit7CisJaW50CWk7CisJdWludDMyICpSSywJKlNLOworCisJc3dpdGNoKAluYml0cyApCisJeworCQljYXNlIDEyODogY3R4LT5uciA9CTEwOwlicmVhazsKKwkJY2FzZSAxOTI6IGN0eC0+bnIgPQkxMjsJYnJlYWs7CisJCWNhc2UgMjU2OiBjdHgtPm5yID0JMTQ7CWJyZWFrOworCQlkZWZhdWx0CTogcmV0dXJuKCAxCSk7CisJfQorCisJUksgPSBjdHgtPmVyazsKKworCWZvciggaSA9IDA7CWkgPAkobmJpdHMgPj4gNSk7IGkrKyApCisJeworCQlHRVRfVUlOVDMyKAlSS1tpXSwga2V5LAlpICoJNCApOworCX0KKworCS8qIHNldHVwIGVuY3J5cHRpb24Jcm91bmQga2V5cyAqLworCisJc3dpdGNoKAluYml0cyApCisJeworCWNhc2UgMTI4OgorCisJCWZvciggaSA9IDA7CWkgPAkxMDsJaSsrLCBSSwkrPSA0ICkKKwkJeworCQkJUktbNF0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbNV0gID0gUktbMV0gXiBSS1s0XTsKKwkJCVJLWzZdICA9IFJLWzJdIF4gUktbNV07CisJCQlSS1s3XSAgPSBSS1szXSBeIFJLWzZdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOTI6CisKKwkJZm9yKCBpID0gMDsJaSA8CTg7IGkrKywJUksgKz0gNgkpCisJCXsKKwkJCVJLWzZdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzddICA9IFJLWzFdIF4gUktbNl07CisJCQlSS1s4XSAgPSBSS1syXSBeIFJLWzddOworCQkJUktbOV0gID0gUktbM10gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzRdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjU2OgorCisJCWZvciggaSA9IDA7CWkgPAk3OyBpKyssCVJLICs9IDgJKQorCQl7CisJCQlSS1s4XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDI0ICkgXQkgICApOworCisJCQlSS1s5XSAgPSBSS1sxXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbMl0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzNdIF4gUktbMTBdOworCisJCQlSS1sxMl0gPSBSS1s0XSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAyNCApCV0gPDwgMjQJKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAxNiApCV0gPDwgMTYJKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+Pgk4ICkJXSA8PCAgOAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCQkgICkJXQkJKTsKKworCQkJUktbMTNdID0gUktbNV0gXiBSS1sxMl07CisJCQlSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKKwkJCVJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIHNldHVwIGRlY3J5cHRpb24Jcm91bmQga2V5cyAqLworCisJaWYoCUtUX2luaXQJKQorCXsKKwkJZm9yKCBpID0gMDsJaSA8CTI1NjsgaSsrICkKKwkJeworCQkJS1QwW2ldID0gUlQwWyBGU2JbaV0gXTsKKwkJCUtUMVtpXSA9IFJUMVsgRlNiW2ldIF07CisJCQlLVDJbaV0gPSBSVDJbIEZTYltpXSBdOworCQkJS1QzW2ldID0gUlQzWyBGU2JbaV0gXTsKKwkJfQorCisJCUtUX2luaXQJPSAwOworCX0KKworCVNLID0gY3R4LT5kcms7CisKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCisJZm9yKCBpID0gMTsJaSA8CWN0eC0+bnI7IGkrKyApCisJeworCQlSSyAtPSA4OworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCisJCSpTSysrID0JS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisJCQkJS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisJCQkJS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisJCQkJS1QzWyAodWludDgpICggKlJLCQkgKSBdOyBSSysrOworCX0KKworCVJLIC09IDg7CisKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCisJcmV0dXJuKAkwICk7Cit9CisKKy8qIEFFUyAxMjgtYml0IGJsb2NrIGVuY3J5cHRpb24Jcm91dGluZQkqLworCit2b2lkIHJ0bXBfYWVzX2VuY3J5cHQoYWVzX2NvbnRleHQgKmN0eCwgdWludDggaW5wdXRbMTZdLAl1aW50OCBvdXRwdXRbMTZdICkKK3sKKwl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7CisKKwlSSyA9IGN0eC0+ZXJrOworCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKKwlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07CisJR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOworCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107CisKKyNkZWZpbmUJQUVTX0ZST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKK3sJCQkJCQkJCQkJCQlcCisJUksgKz0gNDsJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJWDAgPSBSS1swXSBeIEZUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDEgPSBSS1sxXSBeIEZUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDIgPSBSS1syXSBeIEZUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDMgPSBSS1szXSBeIEZUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCit9CisKKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KKwlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KKwlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KKworCWlmKAljdHgtPm5yCT4gMTAgKQorCXsKKwkJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCisJCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLworCX0KKworCWlmKAljdHgtPm5yCT4gMTIgKQorCXsKKwkJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCisJCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLworCX0KKworCS8qIGxhc3QJcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDEgPSBSS1sxXSBeICggRlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVgyID0gUktbMl0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxCSAgICkgXQkJICk7CisKKwlYMyA9IFJLWzNdIF4gKCBGU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTAgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMgkgICApIF0JCSApOworCisJUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKKwlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOworCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7CisJUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZGVjcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICkKK3sKKwl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7CisKKwlSSyA9IGN0eC0+ZHJrOworCisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfUlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gUlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gUlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTIJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gUlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gUlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBSVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIFJUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgUlQzWyAodWludDgpICgJWTAJCSApIF07CVwKK30KKworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMgkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggUlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU0hBMSBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJSE1BQ19TSEExKAorCUlOCVVDSEFSCSp0ZXh0LAorCUlOCVVJTlQJdGV4dF9sZW4sCisJSU4JVUNIQVIJKmtleSwKKwlJTglVSU5UCWtleV9sZW4sCisJSU4JVUNIQVIJKmRpZ2VzdCkKK3sKKwlTSEFfQ1RYCWNvbnRleHQ7CisJVUNIQVIJa19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZAkqLworCVVDSEFSCWtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQJKi8KKwlJTlQJCWk7CisKKwkvLyBpZiBrZXkgaXMgbG9uZ2VyCXRoYW4gNjQJYnl0ZXMgcmVzZXQJaXQgdG8ga2V5PVNIQTEoa2V5KQorCWlmIChrZXlfbGVuCT4gNjQpCisJeworCQlTSEFfQ1RYCQkgdGN0eDsKKwkJU0hBSW5pdCgmdGN0eCk7CisJCVNIQVVwZGF0ZSgmdGN0eCwga2V5LCBrZXlfbGVuKTsKKwkJU0hBRmluYWwoJnRjdHgsCWtleSk7CisJCWtleV9sZW4JPSAyMDsKKwl9CisJTmRpc1plcm9NZW1vcnkoa19pcGFkLCBzaXplb2Yoa19pcGFkKSk7CisJTmRpc1plcm9NZW1vcnkoa19vcGFkLCBzaXplb2Yoa19vcGFkKSk7CisJTmRpc01vdmVNZW1vcnkoa19pcGFkLCBrZXksCWtleV9sZW4pOworCU5kaXNNb3ZlTWVtb3J5KGtfb3BhZCwga2V5LAlrZXlfbGVuKTsKKworCS8vIFhPUiBrZXkgd2l0aAlpcGFkIGFuZCBvcGFkIHZhbHVlcworCWZvcgkoaSA9IDA7CWkgPAk2NDsJaSsrKQorCXsKKwkJa19pcGFkW2ldIF49IDB4MzY7CisJCWtfb3BhZFtpXSBePSAweDVjOworCX0KKworCS8vIHBlcmZvcm0gaW5uZXIgU0hBMQorCVNIQUluaXQoJmNvbnRleHQpOyAJCQkJCQkvKiBpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJCS8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAl0ZXh0LCB0ZXh0X2xlbik7CS8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCQkvKiBmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8vcGVyZm9ybSBvdXRlcglTSEExCisJU0hBSW5pdCgmY29udGV4dCk7CQkJCQkvKiBpbml0IGNvbnRleHQgZm9yIDJuZCBwYXNzICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAlrX29wYWQsCTY0KTsJLyoJc3RhcnQgd2l0aCBvdXRlciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWRpZ2VzdCwJMjApOwkvKgl0aGVuIHJlc3VsdHMgb2YJMXN0CWhhc2ggKi8KKwlTSEFGaW5hbCgmY29udGV4dCwgZGlnZXN0KTsJCQkvKiBmaW5pc2ggdXAgMm5kIHBhc3MgKi8KKworfQorCisvKgorKiBGKFAsIFMsIGMsIGkpID0gVTEgeG9yIFUyIHhvciAuLi4gVWMKKyogVTEgPSBQUkYoUCwgUyB8fCBJbnQoaSkpCisqIFUyID0gUFJGKFAsIFUxKQorKiBVYyA9IFBSRihQLCBVYy0xKQorKi8KKwordm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQoreworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzM2XSwgZGlnZXN0MVtTSEFfRElHRVNUX0xFTl07CisgICAgaW50IGksIGo7CisKKyAgICAvKiBVMSA9IFBSRihQLCBTIHx8IGludChpKSkgKi8KKyAgICBtZW1jcHkoZGlnZXN0LCBzc2lkLCBzc2lkbGVuZ3RoKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aF0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4yNCkgJiAweGZmKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aCsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjE2KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzJdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+OCkgJiAweGZmKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aCszXSA9ICh1bnNpZ25lZCBjaGFyKShjb3VudCAmIDB4ZmYpOworICAgIEhNQUNfU0hBMShkaWdlc3QsIHNzaWRsZW5ndGgrNCwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0MSk7IC8vIGZvciBXUEEgdXBkYXRlCisKKyAgICAvKiBvdXRwdXQgPSBVMSAqLworICAgIG1lbWNweShvdXRwdXQsIGRpZ2VzdDEsIFNIQV9ESUdFU1RfTEVOKTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBpdGVyYXRpb25zOyBpKyspCisgICAgeworICAgICAgICAvKiBVbiA9IFBSRihQLCBVbi0xKSAqLworICAgICAgICBITUFDX1NIQTEoZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4sICh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdCk7IC8vIGZvciBXUEEgdXBkYXRlCisgICAgICAgIG1lbWNweShkaWdlc3QxLCBkaWdlc3QsIFNIQV9ESUdFU1RfTEVOKTsKKworICAgICAgICAvKiBvdXRwdXQgPSBvdXRwdXQgeG9yIFVuICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBTSEFfRElHRVNUX0xFTjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRbal0gXj0gZGlnZXN0W2pdOworICAgICAgICB9CisgICAgfQorfQorLyoKKyogcGFzc3dvcmQgLSBhc2NpaSBzdHJpbmcgdXAgdG8gNjMgY2hhcmFjdGVycyBpbiBsZW5ndGgKKyogc3NpZCAtIG9jdGV0IHN0cmluZyB1cCB0byAzMiBvY3RldHMKKyogc3NpZGxlbmd0aCAtIGxlbmd0aCBvZiBzc2lkIGluIG9jdGV0cworKiBvdXRwdXQgbXVzdCBiZSA0MCBvY3RldHMgaW4gbGVuZ3RoIGFuZCBvdXRwdXRzIDI1NiBiaXRzIG9mIGtleQorKi8KK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgaWYgKChzdHJsZW4ocGFzc3dvcmQpID4gNjMpIHx8IChzc2lkbGVuZ3RoID4gMzIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDEsIG91dHB1dCk7CisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMiwgJm91dHB1dFtTSEFfRElHRVNUX0xFTl0pOworICAgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk3NDcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCkBAIC0wLDAgKzEsODY2NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltbG1lLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDgtMjUJCU1vZGlmeSBmcm9tIFJUMjUwMCBjb2RlIGJhc2UKKwlKb2huIENoYW5nCTIwMDQtMDktMDYJCW1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworVUNIQVIJQ0lTQ09fT1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07CisKK1VDSEFSCVdQQV9PVUlbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKK1VDSEFSCVJTTl9PVUlbXSA9IHsweDAwLCAweDBmLCAweGFjfTsKK1VDSEFSCVdBUElfT1VJW10gPSB7MHgwMCwgMHgxNCwgMHg3Mn07CitVQ0hBUiAgIFdNRV9JTkZPX0VMRU1bXSAgPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07CitVQ0hBUiAgIFdNRV9QQVJNX0VMRU1bXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKK1VDSEFSCUNjeDJRb3NJbmZvW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwNH07CitVQ0hBUiAgIFJBTElOS19PVUlbXSAgPSB7MHgwMCwgMHgwYywgMHg0M307CitVQ0hBUiAgIEJST0FEQ09NX09VSVtdICA9IHsweDAwLCAweDkwLCAweDRjfTsKK1VDSEFSICAgV1BTX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIJUFJFX05fSFRfT1VJW10JPSB7MHgwMCwgMHg5MCwgMHg0Y307CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZVtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsIDUwLAorICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDBhLCAweDIxLCAgNiwgIDgsIDI1LAorICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMjUsCisgICAgMHgwYywgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwZCwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDBlLCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MGYsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgxMCwgMHgyMiwgMTUsICA4LCAyNSwKKyAgICAweDExLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTIsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMywgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE0LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTUsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE3LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTgsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFhLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWIsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYywgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFkLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWUsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZiwgMHgwMCwgIDAsICAwLCAgMCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQltdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDQsIDB4MDMsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCisgICAgMHgwNCwgMHgxMCwgIDIsIDIwLCAzNSwKKyAgICAweDA1LCAweDEwLCAgMywgMTYsIDM1LAorICAgIDB4MDYsIDB4MTAsICA0LCAxMCwgMjUsCisgICAgMHgwNywgMHgxMCwgIDUsIDE2LCAyNSwKKyAgICAweDA4LCAweDEwLCAgNiwgMTAsIDI1LAorICAgIDB4MDksIDB4MTAsICA3LCAxMCwgMTMsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA4LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgxMCwgIDAsIDIwLCAxMDEsCisgICAgMHgwMSwgMHgxMCwgIDEsIDIwLCAzNSwKKyAgICAweDAyLCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDMsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNCwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA1LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDYsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwNywgMHgxMCwgIDcsIDEwLCAxMywKK307CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwOSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDA2LCAweDIxLCAgNiwgIDgsIDE0LAorICAgIDB4MDcsIDB4MjEsICA3LCAgOCwgMTQsCisgICAgMHgwOCwgMHgyMywgIDcsICA4LCAxNCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTW10gPSB7CisvLyBJdGVtIE5vLglNb2RlCUN1cnItTUNTCVRyYWluVXAJVHJhaW5Eb3duCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwgICAgICAvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBkLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCisgICAgMHgwNCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKKyAgICAweDBhLCAweDIxLCAgNiwgIDgsIDE0LAorICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMTQsCisJMHgwYywgMHgyMywgIDcsICA4LCAxNCwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU1tdID0geyAvLyAzKjMKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMjAsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgNTAsCisgICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAorfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworUFVDSEFSIFJlYXNvblN0cmluZ1tdID0geworCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKKwkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKKwkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKKwkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKKwkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAorCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCisJLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKKwkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAorCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAorCS8qIDExICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCisJLyogMTQgKi8JICJNSUMgZXJyb3IiLAorCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCisJLyogMTggKi8KK307CisKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKKy8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgorLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCitVTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAorCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKKwkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307CisKK1VDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgorLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgorLy8JCWNsZWFuIGVudmlyb25tZW50LgorLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAorQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CisKK1VDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKK1VTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07CisKK1VDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKK1VDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOworVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7CitVQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7CitVQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitVQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK1VDSEFSICBFcnBJZQkgPSBJRV9FUlA7CitVQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKK1VDSEFSICBUaW1JZQkgPSBJRV9USU07CitVQ0hBUiAgV3BhSWUJID0gSUVfV1BBOworVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOworVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07CitVQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKKworVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OworCitVQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKworLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCitSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKKwkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKKwkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKKworCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgorCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAorCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCisKKwkJLy8gODAyLjExIEh5cGVyTGFuIDIKKwkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCisKKwkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAorCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQorCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCisJCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAorCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCisKKwkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAorCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNworCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKKwkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisKKwkJLy8gODAyLjExIFVOSUkKKwkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKKwkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCisJCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAorCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKKwkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCisKKwkJLy8gSmFwYW4KKwkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCisJCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisJCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisKKwkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgorfTsKK1VDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKKworRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyAxMWcKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KKwl7MSwgICAgMjQxLCAgMiwgIDJ9LAorCXsyLCAgICAyNDEsCSAyLCAgN30sCisJezMsICAgIDI0MiwJIDIsICAyfSwKKwl7NCwgICAgMjQyLAkgMiwgIDd9LAorCXs1LCAgICAyNDMsCSAyLCAgMn0sCisJezYsICAgIDI0MywJIDIsICA3fSwKKwl7NywgICAgMjQ0LAkgMiwgIDJ9LAorCXs4LCAgICAyNDQsCSAyLCAgN30sCisJezksICAgIDI0NSwJIDIsICAyfSwKKwl7MTAsICAgMjQ1LAkgMiwgIDd9LAorCXsxMSwgICAyNDYsCSAyLCAgMn0sCisJezEyLCAgIDI0NiwJIDIsICA3fSwKKwl7MTMsICAgMjQ3LAkgMiwgIDJ9LAorCXsxNCwgICAyNDgsCSAyLCAgNH0sCit9OworI2RlZmluZQlOVU1fT0ZfMzAyMF9DSE5MCShzaXplb2YoRnJlcUl0ZW1zMzAyMCkgLyBzaXplb2YoRlJFUVVFTkNZX0lURU0pKQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCisJCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmV0dXJuOgorCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCWRvCisJeworCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisKKwkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCisJCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7CisJCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7CisJCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7CisJCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7CisJCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisJCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKKwkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCisJCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkgICAgICAgIHsKKwkgICAgICAgICAgICAvLyBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzCisJICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyksIHBBZCwgRkFMU0UpOworCSAgICAJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKSwgcEFkLCBGQUxTRSk7CisJICAgICAgICB9CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWFpbiBsb29wIG9mIHRoZSBNTE1FCisJUHJlOgorCQlNbG1lIGhhcyB0byBiZSBpbml0aWFsaXplZCwgYW5kIHRoZXJlIGFyZSBzb21ldGhpbmcgaW5zaWRlIHRoZSBxdWV1ZQorCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIE1QU2V0SW5mb3JtYXRpb24gYW5kIE1QUmVjZWl2ZTsKKwkJVGhpcyB0YXNrIGd1YXJhbnRlZSBvbmx5IG9uZSBNbG1lSGFuZGxlciB3aWxsIHJ1bi4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1FVRVVFX0VMRU0gCSAgICpFbGVtID0gTlVMTDsKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisJU0hPUlQgYXBjbGlJZkluZGV4OworI2VuZGlmCisKKwkvLyBPbmx5IGFjY2VwdCBNTE1FIGFuZCBGcmFtZSBmcm9tIHBlZXIgc2lkZSwgbm8gb3RoZXIgKGNvbnRyb2wvZGF0YSkgZnJhbWUgc2hvdWxkCisJLy8gZ2V0IGludG8gdGhpcyBzdGF0ZSBtYWNoaW5lCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCWlmKHBBZC0+TWxtZS5iUnVubmluZykKKwl7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGV2aWNlIEhhbHRlZCBvciBSZW1vdmVkIG9yIE1sbWVSZXN0LCBleGl0IE1sbWVIYW5kbGVyISAocXVldWUgbnVtID0gJWxkKVxuIiwgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJaWYoQVRFX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93IGluIE1sbWVIYW5kbGVyXG4iKSk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQorCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQorCQl7CisKKwkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcworCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQorCQkJeworCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworI2lmZGVmCUNPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6CisJCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQljYXNlIExFQVBfU1RBVEVfTUFDSElORToKKwkJCQkJTGVhcE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5MZWFwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQljYXNlIERMU19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5EbHNNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKworCisKKwkJCQlkZWZhdWx0OgorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7CisJCQkJCWJyZWFrOworCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCisKKwkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJRWxlbS0+TXNnTGVuID0gMDsKKworCQl9CisJCWVsc2UgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOworCQl9CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlc3RydWN0b3Igb2YgTUxNRSAoRGVzdHJveSBxdWV1ZSwgc3RhdGUgbWFjaGluZSwgc3BpbiBsb2NrIGFuZCB0aW1lcikKKwlQYXJhbWV0ZXJzOgorCQlBZGFwdGVyIC0gTklDIEFkYXB0ZXIgcG9pbnRlcgorCVBvc3Q6CisJCVRoZSBNTE1FIHRhc2sgd2lsbCBubyBsb25nZXIgd29yayBwcm9wZXJseQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUhhbHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQk9PTEVBTiAJICBDYW5jZWxsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKKworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCisJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUgkJaTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7CisjaWZkZWYgUlQyODYwCisJICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJICAgIHsKKwkgICAJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7CisgICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKwl9CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOyAgICAvLyAgNSBtc2VjIHRvIGd1cmFudGVlIEFudCBEaXZlcnNpdHkgdGltZXIgY2FuY2VsZWQKKworCU1sbWVRdWV1ZURlc3Ryb3koJnBBZC0+TWxtZS5RdWV1ZSk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lSGFsdFxuIikpOworfQorCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKKwkvLyBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLgorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQgPSAwOworCisJLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4Q291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCA9IDA7CisKKwlyZXR1cm47Cit9CisKK3Vuc2lnbmVkIGxvbmcgcnhfQU1TRFU7Cit1bnNpZ25lZCBsb25nIHJ4X1RvdGFsOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgdG8gLQorCQkxLiBEZWNpZGUgaWYgaXQncyBhIHJpZ2h0IHRpbWUgdG8gdHVybiBvbiBQd3JNZ210IGJpdCBvZiBhbGwKKwkJICAgb3V0Z29paW5nIGZyYW1lcworCQkyLiBDYWxjdWxhdGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb24gc3RhdGlzdGljcyBvZiB0aGUgbGFzdAorCQkgICBwZXJpb2QsIHNvIHRoYXQgVFggcmF0ZSB3b24ndCB0b2dnbGluZyB2ZXJ5IGZyZXF1ZW50bHkgYmV0d2VlbiBhCisJCSAgIHN1Y2Nlc3NmdWwgVFggYW5kIGEgZmFpbGVkIFRYLgorCQkzLiBJZiB0aGUgY2FsY3VsYXRlZCBDaGFubmVsUXVhbGl0eSBpbmRpY2F0ZWQgY3VycmVudCBjb25uZWN0aW9uIG5vdAorCQkgICBoZWFsdGh5LCB0aGVuIGEgUk9BTWluZyBhdHRlbXB0IGlzIHRyaWVkIGhlcmUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYworVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlVTE9ORwkJCVR4VG90YWxDbnQ7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJICAgIC8vIElmIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCwgd2UgaGF2ZSB0byBjaGVjayBHUElPIHBpbjIgZXZlcnkgMiBzZWNvbmQuCisJCS8vIE1vdmUgY29kZSB0byBoZXJlLCBiZWNhdXNlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV0dXJuIHdoZW4gcmFkaW8gaXMgb2ZmCisJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiAyKSA9PSAwKSAmJiAocEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSkKKwkJeworCQkJVUlOVDMyCQkJCWRhdGEgPSAwOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmIChkYXRhICYgMHgwNCkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCX0KKwkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworCQkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwkJCQl7CisJCQkJCU1sbWVSYWRpb09uKHBBZCk7CisJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCU1sbWVSYWRpb09mZihwQWQpOworCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQorCQlyZXR1cm47CisKKwlSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogRG8gbm90IHNob3cgUlNTSSB1bnRpbCAiTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjIi4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAhPSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgLSAxKSkKKwl7CisJCQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpCisJCXsKKwkJCS8vIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBECisJCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkgJiYKKwkJCQkoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9PSBGQUxTRSkpCisKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkJCSgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gRkFMU0U7CisJCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworCisvLwlSRUNCQVRpbWVyVGltZW91dChTeXN0ZW1TcGVjaWZpYzEsRnVuY3Rpb25Db250ZXh0LFN5c3RlbVNwZWNpZmljMixTeXN0ZW1TcGVjaWZpYzMpOworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOworCisJLy8gZXhlY3V0ZSBldmVyeSA1MDBtcworCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJCQkpCisJCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKKwkJCQlNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhwQWQpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgorCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKKwl7CisgICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7CisKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgCWlmIChBVEVfT04ocEFkKSkKKyAgICAJeworCQkJLyogcmVxdWVzdCBmcm9tIEJhcm9uIDogbW92ZSB0aGlzIHJvdXRpbmUgZnJvbSBsYXRlciB0byBoZXJlICovCisJCQkvKiBmb3Igc2hvd2luZyBSeCBlcnJvciBjb3VudCBpbiBBVEUgUlhGUkFNRSAqLworICAgICAgICAgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKwkJCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5SeFRvdGFsQ250ICs9IHBBZC0+YXRlLlJ4Q250UGVyU2VjOworCQkJICAgIGF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBwYWNrZXQgY250ID0gJWQvJWRcbiIsIHBBZC0+YXRlLlJ4Q250UGVyU2VjLCBwQWQtPmF0ZS5SeFRvdGFsQ250KTsKKwkJCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisKKwkJCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpMD0lZCwgQXZnUnNzaTE9JWQsIEF2Z1Jzc2kyPSVkXG5cbiIsCisJCQkJCQlwQWQtPmF0ZS5BdmdSc3NpMCwgcEFkLT5hdGUuQXZnUnNzaTEsIHBBZC0+YXRlLkF2Z1Jzc2kyKTsKKwkJCQllbHNlCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpPSVkXG5cbiIsIHBBZC0+YXRlLkF2Z1Jzc2kwKTsKKwkJCX0KKwkJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CisJCQlyZXR1cm47CisgICAgCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCQlpZiAocnhfVG90YWwpCisJCXsKKworCQkJLy8gcmVzZXQgY291bnRlcnMKKwkJCXJ4X0FNU0RVID0gMDsKKwkJCXJ4X1RvdGFsID0gMDsKKwkJfQorCisJCS8vIE1lZGlhIHN0YXR1cyBjaGFuZ2VkLCByZXBvcnQgdG8gTkRJUworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSkpCisJCXsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQl7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCQkJfQorCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLk5vdzMyKTsKKworCQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgdmFyaWFibGUsIHNvIHRoYXQKKwkJLy8gdGhlIGR5bmFtaWMgdHVuaW5nIG1lY2hhbmlzbSBiZWxvdyBhcmUgYmFzZWQgb24gbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYworCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250ID4gNTApCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVNUQU1sbWVQZXJpb2RpY0V4ZWMocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJeworCQkJCS8vIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jaworCQkJCS8vIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuCisJCQkJLy8gU29mdHdhcmUgUGF0Y2ggU29sdXRpb246CisJCQkJLy8gMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4KKwkJCQkvLyAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4KKwkJCQkvLyAzLiBJZiB0aGUgZGVhZGxvY2sgb2NjdXJyZWQsIHJlc2V0IE1BQy9CQlAgYnkgc2V0dGluZyAweDEwMDQgdG8gMHgwMDAxIGZvciBhIHdoaWxlIHRoZW4gc2V0dGluZyBpdCBiYWNrIHRvIDB4MDAwQyBhZ2Fpbi4KKworCQkJCVVJTlQzMglNYWNSZWcgPSAwOworCisJCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEwRjQsICZNYWNSZWcpOworCQkJCWlmICgoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDgwKSkgfHwgKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHgyMCkpKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCQkJCQlSVE1QdXNlY0RlbGF5KDEpOworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Qyk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIldhcm5pbmcsIE1BQyBzcGVjaWZpYyBjb25kaXRpb24gb2NjdXJzIFxuIikpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisKKworCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAorCVBSVE1QX0FEQVBURVIgcEFkKQoreworCVVMT05HCQkJICAgIFR4VG90YWxDbnQ7CisKKy8vCisvLyBXZSByZXR1cm4gaGVyZSBpbiBBVEUgbW9kZSwgYmVjYXVzZSB0aGUgc3RhdGlzdGljcworLy8gdGhhdCBBVEUgbmVlZHMgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KKy8vCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgorCUFTU0VSVCghKEFURV9PTihwQWQpKSk7CisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgeworICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisgICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgIH0KKworICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7CisJfQorCisKKworCisgICAJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCisJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJLy8gdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheQorCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKworCS8vIG11c3QgYmUgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgaWYKKwkvLyBSYWRpbyBpcyBjdXJyZW50bHkgaW4gbm9pc3kgZW52aXJvbm1lbnQKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgorCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KKwkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKKwkJeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7CisJCX0KKworICAgICAgICB7CisgICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorICAgIAkJeworICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAgICAgfQorCisJCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7CisKKwkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisJCWVsc2UgaWYgKENRSV9JU19CQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCArKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gQmFkIENRSS4gQXV0byBSZWNvdmVyeSBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfQorCisJCS8vIEFkZCBhdXRvIHNlYW1sZXNzIHJvYW1pbmcKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykKKwkJeworCQkJU0hPUlQJZEJtVG9Sb2FtID0gKFNIT1JUKXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCAoQ0hBUilkQm1Ub1JvYW0pKTsKKworCQkJaWYgKFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMikgPD0gKENIQVIpZEJtVG9Sb2FtKQorCQkJeworCQkJCU1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gMjAwMy0wNC0xNyBqb2huLiB0aGlzIGlzIGEgcGF0Y2ggdGhhdCBkcml2ZXIgZm9yY2VzIGEgQkVBQ09OIG91dCBpZiBBU0lDIGZhaWxzCisJCS8vIHRoZSAiVFggQkVBQ09OIGNvbXBldGl0aW9uIiBmb3IgdGhlIGVudGlyZSBwYXN0IDEgc2VjLgorCQkvLyBTbyB0aGF0IGV2ZW4gd2hlbiBBU0lDJ3MgQkVBQ09OZ2VuIGVuZ2luZSBiZWVuIGJsb2NrZWQKKwkJLy8gYnkgcGVlcidzIEJFQUNPTiBkdWUgdG8gc2xvd2VyIHN5c3RlbSBjbG9jaywgdGhpcyBTVEEgc3RpbGwgY2FuIHNlbmQgb3V0CisJCS8vIG1pbmltdW0gQkVBQ09OIHRvIHRlbGwgdGhlIHBlZXIgSSdtIGFsaXZlLgorCQkvLyBkcmF3YmFjayBpcyB0aGF0IHRoaXMgQkVBQ09OIHdvbid0IGJlIHdlbGwgYWxpZ25lZCBhdCBUQlRUIGJvdW5kYXJ5LgorCQkvLyBFbnF1ZXVlQmVhY29uRnJhbWUocEFkKTsJCQkgIC8vIHNvZnR3YXJlIHNlbmQgQkVBQ09OCisKKwkJLy8gaWYgYWxsIDExYiBwZWVycyBsZWF2ZSB0aGlzIEJTUyBtb3JlIHRoYW4gNSBzZWNvbmRzLCB1cGRhdGUgVHggcmF0ZSwKKwkJLy8gcmVzdG9yZSBvdXRnb2luZyBCRUFDT04gdG8gc3VwcG9ydCBCL0ctbWl4ZWQgbW9kZQorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCQkJICAgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkJICAgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA+IFJBVEVfMTEpICAmJgorCQkJKChwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lICsgNSpPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFCIHBlZXIgbGVmdCwgdXBkYXRlIFR4IHJhdGVzXG4iKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCQkJTWFrZUlic3NCZWFjb24ocEFkKTsJCS8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CS8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCkgJiYKKwkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWdCZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFHIHBlZXIgbGVmdFxuIikpOworCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKKwkJCX0KKworCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCkgJiYKKwkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMjBNSHogTiBwZWVyIGxlZnRcbiIpKTsKKwkJCQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOworCQkJfQorCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy9yYWRhciBkZXRlY3QKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCXsKKwkJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwkJfQorCisJCS8vIElmIGFsbCBwZWVycyBsZWF2ZSwgYW5kIHRoaXMgU1RBIGJlY29tZXMgdGhlIGxhc3Qgb25lIGluIHRoaXMgSUJTUywgdGhlbiBjaGFuZ2UgTWVkaWFTdGF0ZQorCQkvLyB0byBESVNDT05ORUNURUQuIEJ1dCBzdGlsbCBob2xkaW5nIHRoaXMgSUJTUyAoaS5lLiBzZW5kaW5nIEJFQUNPTikgc28gdGhhdCBvdGhlciBTVEFzIGNhbgorCQkvLyBqb2luIGxhdGVyLgorCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FIDwgcEFkLT5NbG1lLk5vdzMyKSAmJgorCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQl7CisJCQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJCX0KKwl9CisJZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgorCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCisJCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCisJCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCisJCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJCXsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCQkJeworCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7CisKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNSkgPT0gMSkKKwkJCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK1NLSVBfQVVUT19TQ0FOX0NPTk46CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCAhPTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKwllbHNlIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwID09MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpCisJeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKQorCQlUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZShwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworLy8gTGluayBkb3duIHJlcG9ydAorVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkJCTAsCisJCQkJCU5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworCisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJeworCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7CisJCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfU1NJRCwKKwkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorCQkJCQkmT2lkU3NpZCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKKwlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCisJVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUglwU3NpZCwKKwlJTiBVQ0hBUglTc2lkTGVuKQoreworCWludAlpbmRleDsKKworCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKKwl7CisJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLy8gQWxsIGNoZWNrZWQKKwlyZXR1cm4gKFRSVUUpOworfQorCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCit7CisJZG8KKwl7CisJCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQorCQl7CisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKKwkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQkJey8vIDExTiAxUyBBZGhvYworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKKwkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKKwkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkJCShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweGZmKSAmJgorCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXsvLyAxMU4gMlMgQWRob2MKKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQl9CisJICAgICAgICBlbHNlIGlmKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID09IFRSVUUpKQorCQkJeworCQkJCS8vIFVTZSBCIFRhYmxlIHdoZW4gT25seSBiLW9ubHkgU3RhdGlvbiBpbiBteSBJQlNTIC4KKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gMTIpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCisJCXsvLyAxMUJHTiAxUyBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCisJCXsvLyAxMUJHTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExTiAxUyBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEIgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID4gOCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQi9HICBtaXhlZCBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBHIG9ubHkgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsJLy8gTGVnYWN5IG1vZGUKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPiBSQVRFXzExKSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZShGQUxTRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIExpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVU0hPUlQJICAgaTsKKwlCU1NfVEFCTEUgICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlCU1NfRU5UUlkgICpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKKwkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwlCc3NUYWJsZUluaXQocFJvYW1UYWIpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCisJCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCisJCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgorCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKKwkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU91dHB1dDoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkJTm93KQoreworCVVTSE9SVAkJaTsKKwlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWQkqcEJzczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKyAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisJCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAorCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKKyAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7CisJCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKKwl9CisKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKKwl7CisJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKwl9CisJLy8gTWF5YmUgc2l0ZSBzdXJ2ZXkgcmVxdWlyZWQKKwllbHNlCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogMTAwMCkgPCBOb3cpCisJCXsKKwkJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJCU1sbWVBdXRvU2NhbihwQWQpOworCQl9CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCisJCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCisKKwkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KKwlPdXRwdXQ6CisJCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCisJCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCisJCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCisJCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93MzIpCit7CisJVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwlVTE9ORyBSeENudCwgUnhQRVI7CisJVUNIQVIgTm9yUnNzaTsKKwlDSEFSICBNYXhSc3NpOworCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJeworCQlCZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUUgKyBCRUFDT05fTE9TVF9USU1FLzI7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCisJLy8KKwkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKKwkvLworCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkKKwl7CisJCVR4UEVSID0gMDsKKwkJVHhQUlIgPSAwOworCX0KKwllbHNlCisJeworCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OworCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8vCisJLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCisJLy8KKwlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJaWYgKFJ4Q250IDwgNSkKKwkJUnhQRVIgPSAwOworCWVsc2UKKwkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8vCisJLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKKwkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTm9ybWFsaXplIFJzc2kKKwkJaWYgKE1heFJzc2kgPiAtNDApCisJCQlOb3JSc3NpID0gMTAwOworCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQorCQkJTm9yUnNzaSA9IDA7CisJCWVsc2UKKwkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7CisKKwkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKKwkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCisJCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJfQorCit9CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCit7CisJVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heE1vZGUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKworCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworCWlmIChwVHhSYXRlLT5DdXJyTUNTIDwgTUNTX0FVVE8pCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwVHhSYXRlLT5DdXJyTUNTOworCisJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworICAgCWlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisKKwkJLy8KKwkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5CisJCS8vCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJCS8vIFBhdGNoIHNwZWVkIGVycm9yIGluIHN0YXR1cyBwYWdlCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgorCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKKwkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgorCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKKwkJeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCisJCXsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKKwkJICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCSAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKKwkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KKworCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQorCU91dHB1dDoKKwkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6CisJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLyppZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJZWxzZQorCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsqLworCisJLy8KKwkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5CisJLy8KKyAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gVFJVRTsKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCUFjY3VUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKKwkJeworCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOworCQl9CisKKwkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KKwkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJKQorCQl7CisKKwkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCisJCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCisJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKKworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisJCS8vCisJCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgorCQkvLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCisJCXsKKwkJCUNIQVIJaWR4ID0gMDsKKwkJCVVDSEFSCVR4UmF0ZUlkeDsKKwkJCS8vVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCBNQ1M3ID0gMCwgTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCAgTUNTNSA9MCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCSAgICAgICAgVUNIQVIJTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOyAvLyAzKjMKKworCQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKQorCQkJeworCQkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhpZHgrMSkqNV07CisKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApCisJCQkJeworCQkJCQlNQ1MwID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMSkKKwkJCQl7CisJCQkJCU1DUzEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQorCQkJCXsKKwkJCQkJTUNTMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCisJCQkJeworCQkJCQlNQ1MzID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNCkKKwkJCQl7CisJCQkJCU1DUzQgPSBpZHg7CisJCQkJfQorCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgTUNTNSA9IGlkeDsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M2ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkJCQkvL2Vsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0CisJCQkJeworCQkJCQlNQ1M3ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCisJCQkJeworCQkJCQlNQ1MxMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKQorCQkJCXsKKwkJCQkJTUNTMTMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKKwkJCQl7CisJCQkJCU1DUzE0ID0gaWR4OworCQkJCX0KKwkJCQkvL2Vsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpLyogJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkqLykJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQl7CisJCQkJCU1DUzE1ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApIC8vIDMqMworCQkJCXsKKwkJCQkJTUNTMjAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKKwkJCQl7CisJCQkJCU1DUzIxID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpCisJCQkJeworCQkJCQlNQ1MyMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQorCQkJCXsKKwkJCQkJTUNTMjMgPSBpZHg7CisJCQkJfQorCQkJCWlkeCArKzsKKwkJCX0KKworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDg7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLyppZiAoTUNTMTUpKi8KKwkJCWlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1MpIHx8CisJCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCisJCQl7Ly8gTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozCisJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzIyICYmIChSc3NpID49IC03MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworICAgICAgICAJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQllbHNlCisJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJfQorCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSkgLy8gMyozCisJCQl7Ly8gTiBtb2RlIHdpdGggMiBzdHJlYW0KKwkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzE0ICYmIChSc3NpID49ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNDsKKwkJCQllbHNlIGlmIChNQ1MxMyAmJiAoUnNzaSA+PSAoLTc2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gKC04MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gKC04OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjFTKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAxIHN0cmVhbQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CisJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+ICgtNzQrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAoLTc3K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gKC03OStSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+ICgtODErUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAoLTgzK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJey8vIExlZ2FjeSBtb2RlCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAtNzApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAtNzQpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAtNzgpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M1OworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAtODIpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzQgPT0gMCkJLy8gZm9yIEItb25seSBtb2RlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+IC04NSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+IC04NykpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+IC05MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCisJCQl7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBUeFJhdGVJZHg7CisJCQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJCX0KKworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IFRSVUU7CisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID09IFRSVUUpCisJCXsKKwkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gRkFMU0U7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWRvCisJCXsKKwkJCUJPT0xFQU4JYlRyYWluVXBEb3duID0gRkFMU0U7CisKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgKys7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQliVHJhaW5VcERvd24gPSBUUlVFOworCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJLy8gdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZAorCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQliVXBncmFkZVF1YWxpdHkgPSBUUlVFOworCQkJCWlmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSAtLTsgIC8vIHF1YWxpdHkgdmVyeSBnb29kIGluIEN1cnJSYXRlCisKKwkJCQlpZiAocEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkpCisJCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5IC0tOworCQkJCWVsc2UgaWYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gLS07ICAgIC8vIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkKKwkJCX0KKworCQkJcEVudHJ5LT5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJaWYgKGJUcmFpblVwRG93bikKKwkJCXsKKwkJCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCisJCQkJaWYgKChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA+PSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCX0KKwkJCQllbHNlIGlmICgoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSA8PSAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7IC8vIHJhdGUgVVAKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCisJCQkvLworCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5CisJCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOworCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMjsgLy8gcmF0ZSBET1dOCisJCQlwRW50cnktPlR4UXVhbGl0eVtwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOworCQkJcEVudHJ5LT5QRVJbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiBkb3duCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOyAvLyByYXRlIG5vIGNoYW5nZQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBFbnRyeS0+TGFzdFR4T2tDb3VudCA9IFR4U3VjY2VzczsKKworCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKKwkJeworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN0YXRpb24gc2lkZSwgQXV0byBUeFJhdGUgZmFzdGVyIHRyYWluIHVwIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJU3lzdGVtU3BlY2lmaWMxCQkJLSBOb3QgdXNlZC4KKwkJRnVuY3Rpb25Db250ZXh0CQkJLSBQb2ludGVyIHRvIG91ciBBZGFwdGVyIGNvbnRleHQuCisJCVN5c3RlbVNwZWNpZmljMgkJCS0gTm90IHVzZWQuCisJCVN5c3RlbVNwZWNpZmljMwkJCS0gTm90IHVzZWQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUFJUTVBfQURBUFRFUgkJCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7CisJVUxPTkcJCQkJCVR4VG90YWxDbnQ7CisJVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7CisJQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJQ0hBUgkJCQkJUnNzaSwgcmF0aW87CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCVVMT05HCQkJCQlpOworCisJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKyAgICAvLworICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKyAgICAvLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJLy9Sc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMCwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTEsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kyKTsKKwkgICAgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKQorCQkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKKwkJZWxzZQorCQkJUnNzaSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisKKwkJQ3VyclJhdGVJZHggPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleDsKKworCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQorCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfQorCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKKwkJeworCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOworCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpCisJCXsKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisKKwkJLy8KKwkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKKwkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCisJCS8vCisJCWlmIChUeFRvdGFsQ250IDw9IDEyKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCX0KKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IFR4VG90YWxDbnQgPD0gMTUsIHRyYWluIGJhY2sgdG8gb3JpZ2luYWwgcmF0ZSBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRvCisJCXsKKwkJCVVMT05HIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7CisKKwkJCWlmIChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID09IDApCisJCQkJcmF0aW8gPSA1OworCQkJZWxzZQorCQkJCXJhdGlvID0gNDsKKworCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQorCQkJeworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCisJCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKKworCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKFR4RXJyb3JSYXRpbyA+PSA1MCkgfHwgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pKQorCQkJCXsKKworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfXdoaWxlIChGQUxTRSk7CisKKwkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLCBDdXJyUmF0ZUlkeCwgcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpKTsKKworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOworCQl9CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IGluc2lkZSBNbG1lUGVyaW9kaWNFeGVjKCkgYWZ0ZXIKKwkJYXNzb2NpYXRpb24gd2l0aCBhbiBBUC4KKwkJSXQgY2hlY2tzIGlmIFN0YUNmZy5Qc20gaXMgY29uc2lzdGVudCB3aXRoIHVzZXIgcG9saWN5IChyZWNvcmRlZCBpbgorCQlTdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkuIElmIG5vdCwgZW5mb3JjZSB1c2VyIHBvbGljeS4gSG93ZXZlciwKKwkJdGhlcmUncmUgc29tZSBjb25kaXRpb25zIHRvIGNvbnNpZGVyOgorCQkxLiB3ZSBkb24ndCBzdXBwb3J0IHBvd2VyLXNhdmluZyBpbiBBREhPQyBtb2RlLCBzbyBQc209UFdSX0FDVElWRSBhbGwKKwkJICAgdGhlIHRpbWUgd2hlbiBNaWJzcz09VFJVRQorCQkyLiBXaGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZSwgUHNtIHNob3VsZCBub3QgYmUgc3dpdGNoIHRvIFBXUl9TQVZFCisJCSAgIGlmIG91dGdvaW5nIHRyYWZmaWMgYXZhaWxhYmxlIGluIFR4UmluZyBvciBNZ210UmluZy4KKwlPdXRwdXQ6CisJCTEuIGNoYW5nZSBwQWQtPlN0YUNmZy5Qc20gdG8gUFdSX1NBVkUgb3IgbGVhdmUgaXQgdW50b3VjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVMT05HCVBvd2VyTW9kZTsKKworCS8vIGNvbmRpdGlvbiAtCisJLy8gMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkvLyAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQCisJLy8gMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRQorCS8vIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcKKwkvLyA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QKKyNpZmRlZiBORElTNTFfTUlOSVBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyUHJvZmlsZSA9PSBOZGlzUG93ZXJQcm9maWxlQmF0dGVyeSkKKwkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGU7CisJZWxzZQorI2VuZGlmCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisKKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCisJCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKKwkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCX0KKwl9Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJcEFkLT5TdGFDZmcuUHNtID0gcHNtOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCS8vVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAxOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBVcGRhdGUgYmFzaWMgcmF0ZSBiaXRtYXAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit7CisgICAgSU5UICBpLCBqOworICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OworICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKKyAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisgICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisKKworICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisgICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCisgICAgLyogRW5kIG9mIGlmICovCisKKyAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KQorICAgIHsKKyAgICAgICAgLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBzdXBfcFtpXSAmPSAweDdmOworICAgICAgICBleHRfcFtpXSAmPSAweDdmOworICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLworICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogRW5kIG9mIGlmICovCisgICAgfSAvKiBFbmQgb2YgZm9yICovCit9IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCisvLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgorVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCWludCBpLCBudW07CisJVUNIQVIgUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCVVDSEFSIE1pblN1cHBvcnQgPSBSQVRFXzU0OworCVVMT05HIEJhc2ljUmF0ZUJpdG1hcCA9IDA7CisJVUNIQVIgQ3VyckJhc2ljUmF0ZSA9IFJBVEVfMTsKKwlVQ0hBUiAqcFN1cFJhdGUsIFN1cFJhdGVMZW4sICpwRXh0UmF0ZSwgRXh0UmF0ZUxlbjsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCVVDSEFSCQkJCQlIdE1jcyA9IE1DU19BVVRPOworCisJLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CisKKwludW0gPSAwOworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKKwkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwkJfQorCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCisJCXsKKwkJCU1heERlc2lyZSA9IFJBVEVfMTE7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA9IE1heERlc2lyZTsKKwlwTWluSHRQaHktPndvcmQgPSAwOworCXBNYXhIdFBoeS0+d29yZCA9IDA7CisJcEh0UGh5LT53b3JkID0gMDsKKworCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKKwkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAorCWlmIChudW0gPD0gMSkKKwl7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisJfQorCisjaWYgMQorCWlmIChIdE1jcyAhPSBNQ1NfQVVUTykKKwl7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJcFN1cFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZVswXTsKKwkJcEV4dFJhdGUgPSAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZVswXTsKKwkJU3VwUmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW47CisJCUV4dFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuOworCX0KKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJfQorCisJLy8gZmluZCBtYXggc3VwcG9ydGVkIHJhdGUKKwlmb3IgKGk9MDsgaTxTdXBSYXRlTGVuOyBpKyspCisJeworCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKKwkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7CisJCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7CisJCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKKwkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKKwkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7CisJCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOworCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7CisJCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOworCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7CisJCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKKwkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOworCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCQl9CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisKKwkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKKwl9CisKKwlmb3IgKGk9MDsgaTxFeHRSYXRlTGVuOyBpKyspCisJeworCQlzd2l0Y2ggKHBFeHRSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKKwkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7CisJCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7CisJCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKKwkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKKwkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7CisJCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOworCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7CisJCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOworCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7CisJCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKKwkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOworCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCQl9CisJCWlmIChNYXhTdXBwb3J0IDwgUmF0ZSkJTWF4U3VwcG9ydCA9IFJhdGU7CisKKwkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRUdBQ1lfQkFTSUNfUkFURSwgQmFzaWNSYXRlQml0bWFwKTsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCisJLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisJeworCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCisJCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CisKKwlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OworCWlmICgqYXV0b19yYXRlX2N1cl9wKQorCXsKKwkJc2hvcnQgZGJtID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCWRibSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlpZiAoYkxpbmtVcCA9PSBUUlVFKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCWlmIChkYm0gPCAtNzUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzExOworCQllbHNlIGlmIChkYm0gPCAtNzApCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OworCisJCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQorCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlID4gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7CisKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IHBIdFBoeS0+ZmllbGQuU1RCQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBIdFBoeS0+ZmllbGQuTUNTOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEh0UGh5LT5maWVsZC5NT0RFOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisJfQorCWVsc2UKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdOworCQlpZiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID49IFJBVEVfNiAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKQorCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTt9CisJCWVsc2UKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTt9CisJfQorCisJcEh0UGh5LT53b3JkID0gKHBNYXhIdFBoeS0+d29yZCk7CisJaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkID0gcE1heEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCA9IHBNaW5IdFBoeS0+d29yZDsKKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCQl7CisJCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJY2FzZSBQSFlfMTFCOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfMTFHOgorCQkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQlicmVhazsKKwkJfQorCQkvLworCQkvLyBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4KKwkJLy8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOworCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07CisJCWVsc2UKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IFJBVEVfMTsKKwkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAorCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCisJCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nLgorCQlJbnB1dCBXY2lkIHZhbHVlIGlzIHZhbGlkIGZvciAyIGNhc2UgOgorCQkxLiBpdCdzIHVzZWQgZm9yIFN0YXRpb24gaW4gaW5mcmEgbW9kZSB0aGF0IGNvcHkgQVAgcmF0ZSB0byBNYWN0YWJsZS4KKwkJMi4gT1IgU3RhdGlvbiAJaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCkKK3sKKwlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7CisJQ0hBUiAJaTsgLy8gMyozCisJUlRfSFRfQ0FQQUJJTElUWSAJKnBSdEh0Q2FwID0gTlVMTDsKKwlSVF9IVF9QSFlfSU5GTwkJKnBBY3RpdmVIdFBoeSA9IE5VTEw7CisJVUxPTkcJCUJhc2ljTUNTOworCVVDSEFSIGosIGJpdG1hc2s7CisJUFJUX0hUX1BIWV9JTkZPCQkJcERlc2lyZUh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPT09PiBcbiIpKTsKKworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcERlc2lyZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBBY3RpdmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7CisJCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXJldHVybjsKKworCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7CisJCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCisJLy8gRGVjaWRlIE1BWCBodCByYXRlLgorCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKworICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKKworCWZvciAoaT0yMzsgaT49MDsgaS0tKSAvLyAzKjMKKwl7CisJCWogPSBpLzg7CisJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKworCQlpZiAoKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGk9PTApCisJCQlicmVhazsKKwl9CisKKwkvLyBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/CisJcE1pbkh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOworCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNUQkMgPSAwOworCXBNaW5IdFBoeS0+ZmllbGQuU2hvcnRHSSA9IDA7CisJLy9JZiBTVEEgYXNzaWducyBmaXhlZCByYXRlLiB1cGRhdGUgdG8gZml4ZWQgaGVyZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKKwkJeworCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFVzZSBGaXhlZCBNQ1MgPSAlZFxuIixwTWluSHRQaHktPmZpZWxkLk1DUykpOworCQl9CisKKwkJZm9yIChpPTIzOyAoQ0hBUilpID49IDA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGVjaWRlIGh0IHJhdGUKKwlwSHRQaHktPmZpZWxkLlNUQkMgPSBwTWF4SHRQaHktPmZpZWxkLlNUQkM7CisJcEh0UGh5LT5maWVsZC5CVyA9IHBNYXhIdFBoeS0+ZmllbGQuQlc7CisJcEh0UGh5LT5maWVsZC5NT0RFID0gcE1heEh0UGh5LT5maWVsZC5NT0RFOworCXBIdFBoeS0+ZmllbGQuTUNTID0gcE1heEh0UGh5LT5maWVsZC5NQ1M7CisJcEh0UGh5LT5maWVsZC5TaG9ydEdJID0gcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJOworCisJLy8gdXNlIGRlZmF1bHQgbm93LiBydDI4NjAKKwlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCWVsc2UKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsIHBBY3RpdmVIdFBoeS0+TUNTU2V0WzBdLHBIdFBoeS0+ZmllbGQuTUNTLAorCQlwSHRQaHktPmZpZWxkLkJXLCBwSHRQaHktPmZpZWxkLlNob3J0R0ksIHBIdFBoeS0+ZmllbGQuTU9ERSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCk7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBic3NfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQorICoJXHJldHVybiBub25lCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc1RhYmxlSW5pdCgKKwlJTiBCU1NfVEFCTEUgKlRhYikKK3sKKwlpbnQgaTsKKworCVRhYi0+QnNzTnIgPSAwOworICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CU1NfVEFCTEU7IGkrKykKKwl7CisJCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8vIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlCisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPm51bUFzT3JpZ2luYXRvciA9IDA7CisJVGFiLT5udW1Bc1JlY2lwaWVudCA9IDA7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyohIFxicmllZiBzZWFyY2ggdGhlIEJTUyB0YWJsZSBieSBTU0lECisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gc3NpZCBTU0lEIHN0cmluZworICoJXHJldHVybiBpbmRleCBvZiB0aGUgdGFibGUsIEJTU19OT1RfRk9VTkQgaWYgbm90IGluIHRoZSB0YWJsZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIHNlYXJjaCBieSBzZXF1ZW50aWFsIHNlYXJjaAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBwQnNzaWQsCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKKwkJCVNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgQnNzaWQsCisJSU4gUFVDSEFSCSBwU3NpZCwKKwlJTiBVQ0hBUgkgU3NpZExlbiwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKCYoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCksIEJzc2lkKSAmJgorCQkJKFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShwU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFplcm9Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUCUJTU19UQUJMRSAqVGFiLAorCUlOCQlQVUNIQVIJICBwQnNzaWQsCisJSU4JCVVDSEFSCSAgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCisJCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCisJCXsKKwkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQl9CisJCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJVGFiLT5Cc3NOciAtPSAxOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCURlbGV0ZSB0aGUgT3JpZ2luYXRvciBFbnRyeSBpbiBCQXRhYmxlLiBPciBkZWNyZWFzZSBudW1BcyBPcmlnaW5hdG9yIGJ5IDEgaWYgbmVlZGVkLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKK3sKKworCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVEZWxldGVPUklFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKKwkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgQnNzRW50cnlTZXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19FTlRSWSAqcEJzcywKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIFBDRl9QQVJNIHBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7CisJLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAorCXBCc3MtPkhpZGRlbiA9IDE7CisJaWYgKFNzaWRMZW4gPiAwKQorCXsKKwkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKKwkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKKwkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgorCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCisJCXsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCXBCc3MtPlNzaWRMZW4gPSBTc2lkTGVuOworCQkJcEJzcy0+SGlkZGVuID0gMDsKKwkJfQorCX0KKwllbHNlCisJCXBCc3MtPlNzaWRMZW4gPSAwOworCXBCc3MtPkJzc1R5cGUgPSBCc3NUeXBlOworCXBCc3MtPkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJeworCQlpZiAocENmUGFybS0+YlZhbGlkKQorCQl7CisJCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OworCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOworCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKKwkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKKwl9CisKKwlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOworCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKKwkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KKwlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOworCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJcEJzcy0+U3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJQVNTRVJUKEV4dFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKwlwQnNzLT5OZXdFeHRDaGFuT2Zmc2V0ID0gTmV3RXh0Q2hhbk9mZnNldDsKKwlwQnNzLT5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlwQnNzLT5DaGFubmVsID0gQ2hhbm5lbDsKKwlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+UnNzaSA9IFJzc2k7CisJLy8gVXBkYXRlIENraXBGbGFnLiBpZiBub3QgZXhpc3RzLCB0aGUgdmFsdWUgaXMgMHgwCisJcEJzcy0+Q2tpcEZsYWcgPSBDa2lwRmxhZzsKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IEZpeGVkIElFcworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkZpeElFcy5UaW1lc3RhbXAsICZUaW1lU3RhbXAsIDgpOworCXBCc3MtPkZpeElFcy5CZWFjb25JbnRlcnZhbCA9IEJlYWNvblBlcmlvZDsKKwlwQnNzLT5GaXhJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMKKwlpZiAoTGVuZ3RoVklFICE9IDApCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IExlbmd0aFZJRTsKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+VmFySUVzLCBwVklFLCBwQnNzLT5WYXJJRUxlbik7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPlZhcklFTGVuID0gMDsKKwl9CisKKwlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOworCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKEh0Q2FwYWJpbGl0eUxlbj4gMCkKKwl7CisJCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKKwkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCXsKKwkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisKKwkgCQkJaWYgKChwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiA+IDIpJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCSAJCQl7CisJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKKwkgCQkJfQorCSAJCQllbHNlIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCQkJeworCQkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCUJzc0NpcGhlclBhcnNlKHBCc3MpOworCisJLy8gbmV3IGZvciBRT1MKKwlpZiAocEVkY2FQYXJtKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+RWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+RWRjYVBhcm0uYlZhbGlkID0gRkFMU0U7CisJaWYgKHBRb3NDYXBhYmlsaXR5KQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UW9zQ2FwYWJpbGl0eSwgcFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5Rb3NDYXBhYmlsaXR5LmJWYWxpZCA9IEZBTFNFOworCWlmIChwUWJzc0xvYWQpCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVBFSURfU1RSVUNUICAgICBwRWlkOworCQlVU0hPUlQgICAgICAgICAgTGVuZ3RoID0gMDsKKworCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAzKTsKKwkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IEZBTFNFOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJd2hpbGUgKChMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW4pIDw9IExlbmd0aFZJRSkKKwkJeworCQkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJCXsKKwkJCQljYXNlIElFX1dQQToKKwkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5XcGFJRS5JRSwgcEVpZCwgcEJzcy0+V3BhSUUuSUVMZW4pOworCQkJCQl9CisJCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgorICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwgcEJzcy0+UnNuSUUuSUVMZW4pOworCQkJfQorCQkJCWJyZWFrOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQljYXNlIElFX0NPVU5UUlk6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCBwRWlkLT5PY3RldCwgMyk7CisJCQkJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisgICAgICAgICAgICB9CisJCQlMZW5ndGggPSBMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKKy8qIQorICoJXGJyaWVmIGluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBic3MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBUaGUgQlNTIHRhYmxlCisgKglccGFyYW0gQnNzaWQgQlNTSUQKKyAqCVxwYXJhbSBzc2lkIFNTSUQKKyAqCVxwYXJhbSBzc2lkX2xlbiBMZW5ndGggb2YgU1NJRAorICoJXHBhcmFtIGJzc190eXBlCisgKglccGFyYW0gYmVhY29uX3BlcmlvZAorICoJXHBhcmFtIHRpbWVzdGFtcAorICoJXHBhcmFtIHBfY2YKKyAqCVxwYXJhbSBhdGltX3dpbgorICoJXHBhcmFtIGNhcAorICoJXHBhcmFtIHJhdGVzCisgKglccGFyYW0gcmF0ZXNfbGVuCisgKglccGFyYW0gY2hhbm5lbF9pZHgKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIElmIFNTSUQgaXMgaWRlbnRpY2FsLCB0aGUgb2xkIGVudHJ5IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCVVMT05HCUlkeDsKKworCUlkeCA9IEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoVGFiLCBwQnNzaWQsICBTc2lkLCBTc2lkTGVuLCBDaGFubmVsTm8pOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCWlmIChUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCSAgICB7CisJCQkvLworCQkJLy8gSXQgbWF5IGhhcHBlbiB3aGVuIEJTUyBUYWJsZSB3YXMgZnVsbC4KKwkJCS8vIFRoZSBkZXNpcmVkIEFQIHdpbGwgbm90IGJlIGFkZGVkIGludG8gQlNTIFRhYmxlCisJCQkvLyBJbiB0aGlzIGNhc2UsIGlmIHdlIGZvdW5kIHRoZSBkZXNpcmVkIEFQIHRoZW4gb3ZlcndyaXRlIEJTUyBUYWJsZS4KKwkJCS8vCisJCQlpZighT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJeworCQkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3NpZCkgfHwKKwkJCQkJU1NJRF9FUVVBTChwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIFNzaWQsIFNzaWRMZW4pKQorCQkJCXsKKwkJCQkJSWR4ID0gVGFiLT5Cc3NPdmVybGFwTnI7CisJCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKyAgICAgICAgICAgICAgICAgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJSBNQVhfTEVOX09GX0JTU19UQUJMRTsKKwkJCQl9CisJCQkJcmV0dXJuIElkeDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCXJldHVybiBCU1NfTk9UX0ZPVU5EOworCQkJfQorCQl9CisJCUlkeCA9IFRhYi0+QnNzTnI7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCVRhYi0+QnNzTnIrKzsKKwl9CisJZWxzZQorCXsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCxDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCX0KKworCXJldHVybiBJZHg7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPSAwOworfQorCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKQoreworCS8vIEV2ZW50IEEKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID09IDApCisJeworCQlpZiAoVGFiLT5FdmVudEFObyA8IE1BWF9UUklHR0VSX0VWRU5UKQorCQl7CisJCQlSVE1QTW92ZU1lbW9yeShUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5CU1NJRCwgcEJzc2lkLCA2KTsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLmJWYWxpZCA9IFRSVUU7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DaGFubmVsID0gQ2hhbm5lbE5vOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ0RDb3VudGVyID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJCQlpZiAoUmVnQ2xhc3MgIT0gMCkKKwkJCXsKKwkJCQkvLyBCZWFjb24gaGFzIFJlZ3VsYXRvcnkgY2xhc3MgSUUuIFNvIHVzZSBiZWFjb24ncworCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gUmVnQ2xhc3M7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVXNlIFN0YXRpb24ncyBSZWd1bGF0b3J5IGNsYXNzIGluc3RlYWQuCisJCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9PSBUUlVFKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJeworCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMzOworCQkJCX0KKwkJCQllbHNlCisJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gPz87CisKKwkJCX0KKworCQkJVGFiLT5FdmVudEFObyArKzsKKwkJfQorCX0KKwllbHNlIGlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uSW50b2xlcmFudDQwKQorCXsKKwkJVGFiLT5FdmVudEJDb3VudERvd24gPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUcmlnZ2VyIEV2ZW50IHRhYmxlIE1haW50YWluZW5jZSBjYWxsZWQgb25jZSBldmVyeSBzZWNvbmQuCisKKwlBcmd1bWVudHM6CisJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJaTsKKwlCT09MRUFOCQkJYk5vdGlmeSA9IEZBTFNFOworCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCAmJiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPiAwKSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXItLTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA9PSAwKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisJCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vIC0tOworCQkJCS8vIE5lZWQgdG8gc2VuZCAyMC80MCBDb2V4aXN0ZW5jZSBOb3RpZnkgZnJhbWUgaWYgaGFzIHN0YXR1cyBjaGFuZ2UuCisJCQkJYk5vdGlmeSA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93bi0tOworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9PSAwKQorCQkJYk5vdGlmeSA9IFRSVUU7CisJfQorCisJaWYgKGJOb3RpZnkgPT0gVFJVRSkKKwkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOCUNIQVIgU3NpZFtdLAorCUlOCVVDSEFSIFNzaWRMZW4pCit7CisJSU5UIGk7CisJQnNzVGFibGVJbml0KE91dFRhYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlCU1NfRU5UUlkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisJCUJPT0xFQU4JYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOworCisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKyAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCWlmIChwSW5Cc3MtPkhpZGRlbikKKwkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKKwkJfQorCisJCWlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmCisJCQkoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwSW5Cc3MtPlNzaWQsIHBJbkJzcy0+U3NpZExlbikgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkvLyBJZiBubyBDb3VudHJ5IElFIGV4aXN0cyBubyBDb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgd2hlbiBJRUVFODAyMTFkQ2xpZW50TW9kZSBpcyBzdHJpY3QuCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0KSAmJgorCQkJCShwSW5Cc3MtPmJIYXNDb3VudHJ5SUUgPT0gRkFMU0UpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0LCBidXQgdGhpcyBBUCBkb2Vzbid0IGhhdmUgY291bnRyeSBJRS5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOworCQkJCS8vCisJCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KKwkJCQkvLworCQkJCWlmICghcEluQnNzLT5iU0VTKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQorCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgorCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCisJCQlpZiAoU3NpZExlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCisJCQkJCXsKKwkJCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisJCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgorCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkJCU91dFRhYi0+QnNzTnIrKzsKKwkJfQorCisJCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCQkJYnJlYWs7CisJfQorCisJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCit7CisJSU5UIAkgIGksIGo7CisJQlNTX0VOVFJZIFRtcEJzczsKKworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQorCXsKKwkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQorCQl7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit7CisJUEVJRF9TVFJVQ1QgCQkgcEVpZDsKKwlQVUNIQVIJCQkJcFRtcDsKKwlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOworCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKKwlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOworCVVTSE9SVAkJCQkJCQlDb3VudDsKKwlJTlQJCQkJCQkJCUxlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisKKwkvLworCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgorCS8vCisJaWYgKHBCc3MtPlByaXZhY3kpCisJeworCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJfQorCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCisJcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkvLyBJbml0IFdQQSBzZXR0aW5nCisJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisKKwkvLyBJbml0IFdQQTIgc2V0dGluZworCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IDA7CisJcEJzcy0+V1BBMi5iTWl4TW9kZSAJID0gRkFMU0U7CisKKworCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOworCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5CisJCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9XUEE6CisJCQkJLy9QYXJzZSBDaXNjbyBJRV9XUEEgKExFQVAsIENDS00sIGV0Yy4pCisJCQkJaWYgKCBOZGlzRXF1YWxNZW1vcnkoKHBUbXArOCksIENJU0NPX09VSSwgMykpCisJCQkJeworCQkJCQlwVG1wICAgKz0gMTE7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gaWYgQ2lzY28gSUVfV1BBLCBicmVhaworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBTRVNfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorCQkJCXsKKwkJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9IDEpCisJCQkJeworCQkJCQkvLyBpZiB1bnN1cHBvcnRlZCB2ZW5kb3Igc3BlY2lmaWMgSUUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFNraXAgT1VJLCB2ZXJzaW9uLCBhbmQgbXVsdGljYXN0IHN1aXRlCisJCQkJLy8gVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4KKwkJCQkvLyBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4KKwkJCQkvLyBwVG1wID0gKFBVQ0hBUikgcEVpZC0+T2N0ZXQ7CisJCQkJcFRtcCAgICs9IDExOworCisJCQkJLy8gQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuCisJCQkJLy8JVmFsdWUJICAgTWVhbmluZworCQkJCS8vCTAJCQlOb25lCisJCQkJLy8JMQkJCVdFUC00MAorCQkJCS8vCTIJCQlUa2lwCisJCQkJLy8JMwkJCVdSQVAKKwkJCQkvLwk0CQkJQUVTCisJCQkJLy8JNQkJCVdFUC0xMDQKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwkJCQl3aGlsZSAoQ291bnQgPiAwKQorCQkJCXsKKwkJCQkJLy8gU2tpcCBPVUkKKwkJCQkJcFRtcCArPSAzOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCQl9CisJCQkJCXBUbXArKzsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQlwVG1wICAgKz0gMzsKKworCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQorCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IDE7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZQkgID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQkJLy8gUGF0Y2hlZCBidWdzIGZvciBvbGQgZHJpdmVyCisJCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9SU046CisJCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7CisKKwkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQorCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKKworCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgorCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCisJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDU6CS8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZworCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisKKwkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKKwkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQorCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAorICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKi8KK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJeworCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwl9CisKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Cit9CisKKy8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCisgKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgorICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKKyAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcworICoJXHJldHVybiBub25lCisgKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZworICoJIC0gYnNzaWQKKyAqCSAtIHN0YXRpb24gYWRkcmVzcworICoJXHBvc3QKKyAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKwlwSGRyODAyMTEtPkZDLlRvRHMgPSBUb0RzOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcERBKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWVtX21nbXQuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgcm91dGluZSBidWlsZCBhbiBvdXRnb2luZyBmcmFtZSwgYW5kIGZpbGwgYWxsIGluZm9ybWF0aW9uIHNwZWNpZmllZAorICogaW4gYXJndW1lbnQgbGlzdCB0byB0aGUgZnJhbWUgYm9keS4gVGhlIGFjdHVhbCBmcmFtZSBzaXplIGlzIHRoZSBzdW1tYXRpb24KKyAqIG9mIGFsbCBhcmd1bWVudHMuCisgKiBpbnB1dCBwYXJhbXM6CisgKgkJQnVmZmVyIC0gcG9pbnRlciB0byBhIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHNlZ21lbnQKKyAqCQlhcmdzIC0gYSBsaXN0IG9mIDxpbnQgYXJnX3NpemUsIGFyZz4gcGFpcnMuCisgKgkJTk9URSBOT1RFIE5PVEUhISEhIHRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgTlVMTCwgb3RoZXJ3aXNlIHRoaXMKKyAqCQkJCQkJICAgZnVuY3Rpb24gd2lsbCBGQUlMISEhCisgKiByZXR1cm46CisgKgkJU2l6ZSBvZiB0aGUgYnVmZmVyCisgKiB1c2FnZToKKyAqCQlNYWtlT3V0Z29pbmdGcmFtZShCdWZmZXIsIG91dHB1dF9sZW5ndGgsIDIsICZmYywgMiwgJmR1ciwgNiwgcF9hZGRyMSwgNixwX2FkZHIyLCBFTkRfT0ZfQVJHUyk7CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpGcmFtZUxlbiwgLi4uKQoreworCUNIQVIgICAqcDsKKwlpbnQgCWxlbmc7CisJVUxPTkcJVG90TGVuZzsKKwl2YV9saXN0IEFyZ3M7CisKKwkvLyBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGgKKwlUb3RMZW5nID0gMDsKKwl2YV9zdGFydChBcmdzLCBGcmFtZUxlbik7CisJZG8KKwl7CisJCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKKwkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCisJCXsKKwkJCWJyZWFrOworCQl9CisJCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOworCQlOZGlzTW92ZU1lbW9yeSgmQnVmZmVyW1RvdExlbmddLCBwLCBsZW5nKTsKKwkJVG90TGVuZyA9IFRvdExlbmcgKyBsZW5nOworCX0gd2hpbGUoVFJVRSk7CisKKwl2YV9lbmQoQXJncyk7IC8qIGNsZWFuIHVwICovCisJKkZyYW1lTGVuID0gVG90TGVuZzsKKwlyZXR1cm4gVG90TGVuZzsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWxtZV9xdWV1ZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucworICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBBbHdheXMJICAgUmV0dXJuIE5ESVNfU1RBVEVfU1VDQ0VTUyBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJQmVjYXVzZSB0aGlzIGlzIGRvbmUgb25seSBvbmNlIChhdCB0aGUgaW5pdCBzdGFnZSksIG5vIG5lZWQgdG8gYmUgbG9ja2VkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK05ESVNfU1RBVFVTIE1sbWVRdWV1ZUluaXQoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJSU5UIGk7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmUXVldWUtPkxvY2spOworCisJUXVldWUtPk51bQk9IDA7CisJUXVldWUtPkhlYWQgPSAwOworCVF1ZXVlLT5UYWlsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01MTUVfUVVFVUU7IGkrKykKKwl7CisJCVF1ZXVlLT5FbnRyeVtpXS5PY2N1cGllZCA9IEZBTFNFOworCQlRdWV1ZS0+RW50cnlbaV0uTXNnTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoUXVldWUtPkVudHJ5W2ldLk1zZywgTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKiEgXGJyaWVmCSBFbnF1ZXVlIGEgbWVzc2FnZSBmb3Igb3RoZXIgdGhyZWFkcywgaWYgdGhleSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgdG8gTUxNRSB0aHJlYWQKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAorICoJXHBhcmFtCSBNc2dUeXBlICBUaGUgTWVzc2FnZSBUeXBlCisgKglccGFyYW0JIE1zZ0xlbiAgIFRoZSBNZXNzYWdlIGxlbmd0aAorICoJXHBhcmFtCSpNc2cJICBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGVucXVldWUgaXMgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQkgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpCit7CisJSU5UIFRhaWw7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCVRhaWwgPSBRdWV1ZS0+VGFpbDsKKwlRdWV1ZS0+VGFpbCsrOworCVF1ZXVlLT5OdW0rKzsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPlRhaWwgPSAwOworCX0KKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gUkVTRVJWRURfV0NJRDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIFJlY3YgZ2V0cyBhIE1MTUUgbWVzc2FnZQorICoJXHBhcmFtCSpRdWV1ZQkJCSBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCisgKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCisgKglccGFyYW0JIE1zZ0xlbiAJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCisJSU4gVUNIQVIgUnNzaTAsCisJSU4gVUNIQVIgUnNzaTEsCisJSU4gVUNIQVIgUnNzaTIsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVQ0hBUiBTaWduYWwpCit7CisJSU5UIAkJIFRhaWwsIE1hY2hpbmU7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJSU5UCQkgTXNnVHlwZTsKKwlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYoQVRFX09OKHBBZCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1NcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIscEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gT0ssIHdlIGdvdCBhbGwgdGhlIGluZm9ybWF0aW9ucywgaXQgaXMgdGltZSB0byBwdXQgdGhpbmdzIGludG8gcXVldWUKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5Mb3dQYXJ0ID0gVGltZVN0YW1wTG93OworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5IaWdoUGFydCA9IFRpbWVTdGFtcEhpZ2g7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kwID0gUnNzaTA7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kxID0gUnNzaTE7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kyID0gUnNzaTI7CisJUXVldWUtPkVudHJ5W1RhaWxdLlNpZ25hbCA9IFNpZ25hbDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IChVQ0hBUilXY2lkOworCisJUXVldWUtPkVudHJ5W1RhaWxdLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKiEgXGJyaWVmCSBEZXF1ZXVlIGEgbWVzc2FnZSBmcm9tIHRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkqRWxlbQkgIFRoZSBtZXNzYWdlIGRlcXVldWVkIGZyb20gTUxNRSBRdWV1ZQorICoJXHJldHVybiAgVFJVRSBpZiB0aGUgRWxlbSBjb250YWlucyBzb21ldGhpbmcsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZURlcXVldWUoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUsCisJT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJKkVsZW0gPSAmKFF1ZXVlLT5FbnRyeVtRdWV1ZS0+SGVhZF0pOworCVF1ZXVlLT5OdW0tLTsKKwlRdWV1ZS0+SGVhZCsrOworCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+SGVhZCA9IDA7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjaWZkZWYgUlQyODYwCisJTUxNRV9RVUVVRV9FTEVNCQkqRWxlbSA9IE5VTEw7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQlDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJLy8gUmVtb3ZlIGFsbCBNbG1lIHF1ZXVlcyBlbGVtZW50cworCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCisJeworCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQorCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQorCQl7CisJCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCUVsZW0tPk1zZ0xlbiA9IDA7CisKKwkJfQorCQllbHNlIHsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUiBpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cworCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgorCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOworCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCS8vIFJlbW92ZSBydW5uaW5nIHN0YXRlCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworI2VuZGlmIC8vIFJUMjg2MCAvLworfQorCisvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IDApOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJcmV0dXJuIEFuczsKK30KKworLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCisgKglccGFyYW0JICpRdWV1ZSAJIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJQk9PTEVBTiBBbnM7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+SGVhZCA9IDA7CisJcFF1ZXVlLT5UYWlsID0gMDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CisJTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworfQorCisvKiEgXGJyaWVmCSBUbyBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlIHR5cGUgaWYgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gZXh0ZXJuYWwKKyAqCVxwYXJhbQlwRnJhbWUJCSAgIFRoZSBmcmFtZSByZWNlaXZlZAorICoJXHBhcmFtCSpNYWNoaW5lCSAgIFRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JKk1zZ1R5cGUJICAgdGhlIG1lc3NhZ2UgdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxyZXR1cm4gVFJVRSBpZiB0aGUgc3Vic3RpdHV0aW9uIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpCit7CisJVVNIT1JUCVNlcTsKKwlVQ0hBUglFQVBUeXBlOworCVBVQ0hBUglwRGF0YTsKKworCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCisJcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCisJLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCisJaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwl7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCQl7CisJCQkvLyBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGVyCisJCQkqTWFjaGluZSA9IEFJUk9ORVRfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX0FJUk9ORVRfTVNHOworCQkJcmV0dXJuIChUUlVFKTsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoIHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVAgKSAvL0xFQVAKKwkJeworCQkJLy8gTEVBUCBmcmFtZXMKKwkJCSpNYWNoaW5lID0gTEVBUF9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoTGVhcE1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQl7CisJCQkqTWFjaGluZSA9IFdQQV9QU0tfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPSAqKChVQ0hBUiopcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgMSk7CisJCQlyZXR1cm4oV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCX0KKworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQkVBQ09OOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BVElNOgorCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkvLyBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtCisJCQlOZGlzTW92ZU1lbW9yeSgmU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgc2l6ZW9mKFVTSE9SVCkpOworCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQorCQkJeworCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQkJfQorCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CisJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKKwkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKKwkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQorCQkJeworCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBzdGF0ZV9tYWNoaW5lLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KKyAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCisgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcworICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKKyAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKQoreworCVVMT05HIGksIGo7CisKKwkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKKwlTLT5OclN0YXRlID0gU3ROcjsKKwlTLT5Ock1zZyAgID0gTXNnTnI7CisJUy0+QmFzZSAgICA9IEJhc2U7CisKKwlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisKKwkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCisJCXsKKwkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7CisJCX0KKwl9CisKKwkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCisJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOworfQorCisvKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbSBTdAlzdGF0ZQorICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCisgKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQorICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlJTiBVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCit7CisJVUxPTkcgTXNnSWR4OworCisJTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKKworCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCisJeworCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCisJCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7CisJfQorfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKKyAqCVxwYXJhbQkgKlMgCSAgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAorICoJXHJldHVybiAgIE5vbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKShwQWQsIEVsZW0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5CisJCWlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgorCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERyb3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsZnNyLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTGZzckluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgU2VlZCkKK3sKKwlpZiAoU2VlZCA9PSAwKQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOworCWVsc2UKKwkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gU2VlZDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKwlVQ0hBUiBSLCBSZXN1bHQ7CisKKwlSID0gMDsKKworCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKQorCQl7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAoKHBBZC0+TWxtZS5TaGlmdFJlZyBeIExGU1JfTUFTSykgPj4gMSkgfCAweDgwMDAwMDAwOworCQkJUmVzdWx0ID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IHBBZC0+TWxtZS5TaGlmdFJlZyA+PiAxOworCQkJUmVzdWx0ID0gMDsKKwkJfQorCQlSID0gKFIgPDwgMSkgfCBSZXN1bHQ7CisJfQorCisJcmV0dXJuIFI7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCit7CisJVUNIQVIJCQkJCWk7CisJSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOworCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7CisKKwkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQorCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKKwlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKKworCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQorCXsKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCisJCXsKKwkJCWNhc2UgMDoJCS8vQ0NLCisJCQkJYnJlYWs7CisJCQljYXNlIDE6CQkvL09GRE0KKwkJCQl7CisJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDU6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNzoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIDI6CQkvL0hULU1JWAorCQkJY2FzZSAzOgkJLy9IVC1HRgorCQkJCXsKKwkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDU6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA2OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNzoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA5OgorCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTA6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTE6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTI6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTM6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTU6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKKwl7CisJCS8vCisJCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgorCQkvLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKyNpZiAwCisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisjZWxzZQorCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKKyAgICAgICAgaWYgKCgKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKyAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgeworCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyAgICAgICAgfQorI2VuZGlmCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisJZWxzZQorCXsKKwkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAorCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KKwlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCisJeworCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKKwkJeworCQkJY2FzZSAweDA6CisJCQkJLy8gTk8gUFJPVEVDVAorCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCQkJCS8vIE1NMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIE1NNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkJCQkvLyBDRjIwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCQkvLyBDRjQwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQorCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQorCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworIAkJCWNhc2UgMToKKwkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCisJCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7CisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKworCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCQl7CisJCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQl9CisJCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKKwkJCQkvLyBBc3NpZ24gUmF0ZQorCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OworCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KKwkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwl7CisJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKQoreworCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKKwlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCVVDSEFSCWluZGV4OworCVVJTlQzMiAJVmFsdWUgPSAwOyAvL0JicFJlZywgVmFsdWU7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCisJLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwl7CisJCWlmIChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwpCisJCXsKKwkJCVR4UHdlciA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FudCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOworCX0KKworCXsKKwkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwkJeworCQkJY2FzZSBSRklDXzI4MjA6CisJCQljYXNlIFJGSUNfMjg1MDoKKwkJCWNhc2UgUkZJQ18yNzIwOgorCQkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChDaGFubmVsID4gMTQpCisJCQkJCXsKKwkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSk7CisKKwkJCQkJCS8vIDVHIGJhbmQgcG93ZXIgcmFuZ2U6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIiBtZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQgorCQkJCQkJLy8gUjMKKwkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOworCQkJCQkJfQorCisJCQkJCQkvLyBSNAorCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsgLy8gc2V0IFRYIHBvd2VyMAorCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxCisJCQkJCX0KKworCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgorCQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQorCQkJCQl7CisJCQkJCQlSNCB8PTB4MjAwMDAwOworCQkJCQl9CisKKwkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFIzOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzaXd0Y2ggZnJvbSBhLT5nLCBnLT5hCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly9HYXJ5IDIwMDcvMDgvMDkgMHgwNTBBMEEKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CS8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJICAgIH0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKwllbHNlCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly9HYXJ5IDIwMDcvOC85IDB4MDUwNTA1CisKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOyAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisJCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAorCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOworCQl9CisKKwkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOworCWlmIChiU2NhbikKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwllbHNlCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCisJLy8KKwkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCisJLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKKwkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KKwkvLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVsdSwgUHdyMT0lbHUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKKwkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgMjQyMSBvbmx5LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGR1cmluZworCQlzaXRlIHN1cnZleS4gSXQncyBvbmx5IHJlcXVpcmVkIGFmdGVyIE5JQyBkZWNpZGVkIHRvIHN0YXkgYXQgYSBjaGFubmVsCisJCWZvciBhIGxvbmdlciBwZXJpb2QuCisJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0J3MgYWx3YXlzIGFmdGVyIEFzaWNTd2l0Y2hDaGFubmVsKCkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljTG9ja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCkKK3sKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQXNpY0FudGVubmFTZWxlY3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQW50ZW5uYSBtaXNjZWxsYW5lb3VzIHNldHRpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJQmFuZFN0YXRlCQkJCUluZGljYXRlIGN1cnJlbnQgQmFuZCBTdGF0ZS4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA8PSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJMS4pIEZyYW1lIEVuZCB0eXBlIGNvbnRyb2wKKwkJCW9ubHkgdmFsaWQgZm9yIEcgb25seSAoUkZfMjUyNyAmIFJGXzI1MjkpCisJCQkwOiBtZWFucyBEUERULCBzZXQgQkJQIFI0IGJpdCA1IHRvIDEKKwkJCTE6IG1lYW5zIFNQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMAorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFzaWNBbnRlbm5hU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSkKK3sKK30KKworVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCisJCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIExJTksgVVAgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZS4KKworCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KKwkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQorCQkxLiBUeFBvd2VyUGVyY2VudGFnZQorCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKKwkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCisJCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCisKKwlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKKwkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0U3dpdGNoaW5nKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVAkJCWksIGo7CisJQ0hBUgkJRGVsdGFQd3IgPSAwOworCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKKwlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7CisJVUNIQVIJCUJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQKKwlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJLyogYmcgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBhIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCXsKKwkJCS8qIEJicFIxIGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOworCisJCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLworCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLworCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KKworCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KKwkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KKwkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLworCisJCQkvKiBwbHVzICgrKSBpcyAweDAwIH4gMHg0NSwgbWludXMgKC0pIGlzIDB4YTAgfiAweGYwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4YTUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCisJCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlcgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7CisKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCisJCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7CisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFIxKTsKKwlCYnBSMSAmPSAweEZDOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vIEhhbmRsZSByZWd1bGF0b3J5IG1heCB0eCBwb3dlciBjb25zdHJhaW4KKwlkbworCXsKKwkJVUNIQVIgICAgVHhQd3JJbkVFUFJPTSA9IDB4RkYsIENvdW50cnlUeFB3ciA9IDB4RkYsIGNyaXRlcmlvbjsKKwkJVUNIQVIgICAgQWRqdXN0TWF4VHhQd3JbNDBdOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIDVHIGJhbmQKKwkJCVR4UHdySW5FRVBST00gPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHhGRjAwKSA+PiA4KTsKKwkJZWxzZSAvLyAyLjRHIGJhbmQKKwkJCVR4UHdySW5FRVBST00gPSAocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweDAwRkYpOworCQlDb3VudHJ5VHhQd3IgPSBHZXRDdW50cnlNYXhUeFB3cihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCS8vIGVycm9yIGhhbmRsaW5nLCByYW5nZSBjaGVjaworCQlpZiAoKFR4UHdySW5FRVBST00gPiAweDUwKSB8fCAoQ291bnRyeVR4UHdyID4gMHg1MCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQXNpY0FkanVzdFR4UG93ZXIgLSBJbnZhbGlkIG1heCB0eCBwb3dlciAoPTB4JTAyeCksIENvdW50cnlUeFB3cj0lZFxuIiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7CisJCQlicmVhazsKKwkJfQorCisJCWNyaXRlcmlvbiA9ICooKFBVQ0hBUilUeFB3ciArIDIpICYgMHhGOyAgICAgICAgLy8gRkFFIHVzZSBPRkRNIDZNIGFzIGNyaXRlcmlvbgorCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChjcml0ZXJpb249JWQsIFR4UHdySW5FRVBST009JWQsIENvdW50cnlUeFB3cj0lZClcbiIsIGNyaXRlcmlvbiwgVHhQd3JJbkVFUFJPTSwgQ291bnRyeVR4UHdyKSk7CisKKwkJLy8gQWRqdXN0IG1heCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcCBvZiB0eCBwb3dlciBpbiBFMlBST00KKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQorCQkJLy8gVGhlcmVmb3JlLCB3ZSBzaG91bGQgc2VwYXJhdGUgdG8gcGFyc2UgdGhlIHR4IHBvd2VyIGZpZWxkCisJCQlpZiAoaSA9PSAwKQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJaWYgKGogPCA0KQorCQkJCQl7CisJCQkJCQkvLyBDQ0sgd2lsbCBoYXZlIDRkQm0gbGFyZ2VyIHRoYW4gT0ZETQorCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbikgKyA0OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCX0KKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQWRqdXN0IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwCisJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJeworCQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQkvLyBUaGUgc3lzdGVtIHR4IHBvd2VyIGlzIGxhcmdlciB0aGFuIHRoZSByZWd1bGF0b3J5LCB0aGUgcG93ZXIgc2hvdWxkIGJlIHJlc3RyYWluCisJCQkJCWlmIChBZGp1c3RNYXhUeFB3cltpKjgral0gPiBDb3VudHJ5VHhQd3IpCisJCQkJCXsKKwkJCQkJCS8vIGRlY3JlYXNlIHRvIHplcm8gYW5kIGRvbid0IG5lZWQgdG8gdGFrZSBjYXJlIEJCUFIxCisJCQkJCQlpZiAoKFZhbHVlIC0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cikpID4gMCkKKwkJCQkJCQlWYWx1ZSAtPSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlWYWx1ZSA9IDA7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQsIG5vIGNoYW5nZSlcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKworCQkJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisJLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQorCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAorCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxOworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDM7CisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gNjsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDk7CisJeworCQlCYnBSMSB8PSAweDAxOworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxMjsKKwl7CisJCUJicFIxIHw9IDB4MDI7CisJfQorCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOworCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCQl9CisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCisJCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCisJCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQorCQlQSFkgdXAuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCit7CisgICAgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBtYW51YWwgd2FrZXVwIGlzIHJlcXVpcmVkCisJCUFzaWNGb3JjZVNsZWVwKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIG5vdCBpbiBJTkZSQSBCU1MuIFdoZW4KKwkJaW4gSU5GUkEgQlNTLCB3ZSBzaG91bGQgdXNlIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKCkgaW5zdGVhZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQorCQlleHBpcmVkLgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgIGJGcm9tVHgpCit7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNGb3JjZVdha2V1cCBcbiIpKTsKKyAgICBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTZXQgTXkgQlNTSUQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBCc3NpZCkKK3sKKwlVTE9ORwkJICBBZGRyNDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PT09PT09PT4gQXNpY1NldEJzc2lkICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQlwQnNzaWRbMF0scEJzc2lkWzFdLHBCc3NpZFsyXSxwQnNzaWRbM10sIHBCc3NpZFs0XSxwQnNzaWRbNV0pKTsKKworCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbMF0pCQkgfAorCQkJKFVMT05HKShwQnNzaWRbMV0gPDwgOCkgIHwKKwkJCShVTE9ORykocEJzc2lkWzJdIDw8IDE2KSB8CisJCQkoVUxPTkcpKHBCc3NpZFszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMCwgQWRkcjQpOworCisJQWRkcjQgPSAwOworCS8vIGFsd2F5cyBvbmUgQlNTSUQgaW4gU1RBIG1vZGUKKwlBZGRyNCA9IChVTE9ORykocEJzc2lkWzRdKSB8IChVTE9ORykocEJzc2lkWzVdIDw8IDgpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMSwgQWRkcjQpOworfQorCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJVVNIT1JUCQlvZmZzZXQ7CisKKwlwRW50cnktPlNzdCAgICAgICAgPSBTU1RfQVNTT0M7CisJcEVudHJ5LT5BaWQgICAgICAgID0gTUNBU1RfV0NJRDsJLy8gU29mdGFwIHN1cHBvcnRzIDEgQlNTSUQgYW5kIHVzZSBXQ0lEPTAgYXMgbXVsdGljYXN0IFdjaWQgaW5kZXgKKwlwRW50cnktPlBzTW9kZSAgICAgPSBQV1JfQUNUSVZFOworCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBCU1MwTWNhc3RfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEZWxXY2lkVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCVdjaWQpCit7CisJVUxPTkcJCSAgQWRkcjAgPSAweDAsIEFkZHIxID0gMHgwOworCVVMT05HIAkJb2Zmc2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0RlbFdjaWRUYWI9PT5XY2lkID0gMHgleFxuIixXY2lkKSk7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7CisJb2Zmc2V0ICs9IDQ7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRW5hYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKKwlVSU5UMzIJCQkJRGF0YSA9IDA7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCURhdGEgIHw9IDB4ODA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDCVR4TGlua0NmZzsKKwlVSU5UMzIJCQkJRGF0YSA9IDA7CisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCisJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk1JTU9QU0R5bmFtaWMgPT0gRkFMU0UpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJKQorCXsKKwkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQkJRGF0YSB8PSAweDIwOworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRGlzYWJsZVN5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKKworCS8vIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0CisJLy8JCQkgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUKKwkvLwkJCSAgVEJUVCBpbnRlcnJ1cHRzCisJcEFkLT5UYnR0VGlja0NvdW50ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVCc3NTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgorCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwlQVUNIQVIJCQlwdHI7CisJVUlOVCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeQorCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKKwlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKKwl7CisJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPSA0OworCX0KKworCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9NCkKKwl7CisJCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPTQ7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gc3RhcnQgc2VuZGluZyBCRUFDT04KKwljc3I5LmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCWNzcjkuZmllbGQuVHNmU3luY01vZGUgPSAyOyAvLyBzeW5jIFRTRiBpbiBJQlNTIG1vZGUKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0JIHBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyAgIEFjMENmZywgQWMxQ2ZnLCBBYzJDZmcsIEFjM0NmZzsKKwlBQ19UWE9QX0NTUjBfU1RSVUMgY3NyMDsKKwlBQ19UWE9QX0NTUjFfU1RSVUMgY3NyMTsKKwlBSUZTTl9DU1JfU1RSVUMgICAgQWlmc25Dc3I7CisJQ1dNSU5fQ1NSX1NUUlVDICAgIEN3bWluQ3NyOworCUNXTUFYX0NTUl9TVFJVQyAgICBDd21heENzcjsKKwlpbnQgaTsKKworCUFjMENmZy53b3JkID0gMDsKKwlBYzFDZmcud29yZCA9IDA7CisJQWMyQ2ZnLndvcmQgPSAwOworCUFjM0NmZy53b3JkID0gMDsKKwlpZiAoKHBFZGNhUGFybSA9PSBOVUxMKSB8fCAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W2ldLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkgLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCisJCXsKKwkJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsgLy8gU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUKKwkJfQorCQllbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisJCUFjMENmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7CisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CSworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCXsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCQl9CisJCWVsc2UKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwkJfQorCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gMDsJCS8vIFFJRF9BQ19CRQorCQljc3IwLmZpZWxkLkFjMVR4b3AgPSAwOwkJLy8gUUlEX0FDX0JLCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCXsKKwkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDE5MjsJCS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDk2OwkJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCQl9CisJCWVsc2UKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gOTY7CQkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDQ4OwkJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBDV19NSU5fSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7CisKKwkJQ3dtYXhDc3Iud29yZCA9IDA7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IENXX01BWF9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjIyKTsKKworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCX0KKwllbHNlCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weS4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLworCQkvLyBNb2RpZnkgQ3dtaW4vQ3dtYXgvVHhvcCBvbiBxdWV1ZVtRSURfQUNfVkldLCBSZWNvbW1lbmQgYnkgSmVycnkgMjAwNS8wNy8yNworCQkvLyBUbyBkZWdyYWRlIG91ciBWSURPIFF1ZXVlJ3MgdGhyb3VnaHB1dCBmb3IgV2lGaSBXTU0gUzNUMDcgSXNzdWUuCisJCS8vCisJCS8vcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDcgLyAxMDsgLy8gcnQyODYwYyBuZWVkIHRoaXMKKworCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtaW49IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07IC8vKzE7CisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOyAvLysyOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsgLy8rMTsKKworCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gKHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNikgLyAxMDsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFjMkNmZy5maWVsZC5BaWZzbiAtPSAxOworCisJCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKKwkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCisJCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQl7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMzsKKwkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gNTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsKKworLy8jaWZkZWYgV0lGSV9URVNUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpCisJCXsKKwkJCWlmIChBYzNDZmcuZmllbGQuQWNUeG9wID09IDEwMikKKwkJCXsKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA/IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdIDogMTA7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuICA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXS0xOyAvKiBBSUZTTiBtdXN0ID49IDEgKi8KKwkJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKKwkJCQlBYzFDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfQorLy8jZW5kaWYgLy8gV0lGSV9URVNUIC8vCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7CisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisKKwkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSAtIDE7IC8vZm9yIFRHbiB3aWZpIHRlc3QKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7CisKKwkJQ3dtYXhDc3Iud29yZCA9IDA7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7CisKKwkJQWlmc25Dc3Iud29yZCA9IDA7CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IEFjMENmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMSA9IEFjMUNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc24gLSA0OworCisJCQkvLyBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIKKwkJCS8vIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCisJCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQl7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gMzsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSA3OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIEFpZnNuQ3NyLndvcmQpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJaWYgKCFBREhPQ19PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLCBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JFICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzBdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVswXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JLICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzFdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsxXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzJdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsyXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZPICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzNdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVszXSkpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCAJQXNpY1NldFNsb3RUaW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCit7CisJVUxPTkcJU2xvdFRpbWU7CisJVUlOVDMyCVJlZ1ZhbHVlID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCWJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChiVXNlU2hvcnRTbG90VGltZSkKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwllbHNlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKworCVNsb3RUaW1lID0gKGJVc2VTaG9ydFNsb3RUaW1lKT8gOSA6IDIwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OCisJCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsKKwkJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0aGluayBpdCBpcyBkb2luZyBXaS1GaSB0ZXN0CisJCQkvLyBBbmQgd2Ugd2lsbCBub3Qgc2V0IHRvIHNob3J0IHNsb3Qgd2hlbiBiRW5hYmxlVHhCdXJzdCBpcyBUUlVFLgorCQl9CisJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQkJU2xvdFRpbWUgPSA5OworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vCisJLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCisJLy8KKwkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCVNsb3RUaW1lID0gMjA7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKKwlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKKworCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgorCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQorCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0luZGV4LAorCUlOIFVDSEFSCQkgS2V5SWR4LAorCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUgkJIHBLZXksCisJSU4gUFVDSEFSCQkgcFR4TWljLAorCUlOIFBVQ0hBUgkJIHBSeE1pYykKK3sKKwlVTE9ORyBvZmZzZXQ7IC8vLCBjc3IwOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisjaWZkZWYgUlQyODYwCisJSU5UICAgaTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeSBCc3NJbmRleD0lZCwgS2V5SWR4PSVkXG4iLCBCc3NJbmRleCxLZXlJZHgpKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkZFNoYXJlZEtleUVudHJ5OiAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW0NpcGhlckFsZ10sIEJzc0luZGV4KjQgKyBLZXlJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwS2V5WzBdLHBLZXlbMV0scEtleVsyXSxwS2V5WzNdLHBLZXlbNF0scEtleVs1XSxwS2V5WzZdLHBLZXlbN10scEtleVs4XSxwS2V5WzldLHBLZXlbMTBdLHBLZXlbMTFdLHBLZXlbMTJdLHBLZXlbMTNdLHBLZXlbMTRdLHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLworCS8vIGZpbGwga2V5IG1hdGVyaWFsIC0ga2V5ICsgVFggTUlDICsgUlggTUlDCisJLy8KKyNpZmRlZiBSVDI4NjAKKwlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCpCc3NJbmRleCArIEtleUlkeCkqSFdfS0VZX0VOVFJZX1NJWkU7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TSEFSRV9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpCisJeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKKwkJfQorCX0KKworCW9mZnNldCArPSA4OworCWlmIChwUnhNaWMpCisJeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8KKwkvLyBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAKKwkvLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVhZDogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdIEtleUlkeFslZF09IDB4JXggXG4iLCBCc3NJbmRleCxLZXlJZHgsIGNzcjEud29yZCkpOworCWlmICgoQnNzSW5kZXglMikgPT0gMCkKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwllbHNlCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKworfQorCisvLwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlJZHgpCit7CisJLy9VTE9ORyBTZWNDc3IwOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeTogIyVkIFxuIiwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSAwOworCX0KKwllbHNlCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7CisJQVNTRVJUKEJzc0luZGV4IDwgNCk7CisJQVNTRVJUKEtleUlkeCA8IDQpOworCit9CisKKworVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKQoreworCVVMT05HICAgV0NJREF0dHJpID0gMCwgb2Zmc2V0OworCisJLy8KKwkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUuCisJLy8gT25seSBUeEtleSBjb3VsZCB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUuCisJLy8KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXQ0lEICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSW5kZXggPDwgNCkgfCAoQ2lwaGVyQWxnIDw8IDEpIHwgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitWT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVMT05HICAgICAgICB1SVYsCisJSU4gVUxPTkcgICAgICAgIHVFSVYpCit7CisJVUxPTkcJb2Zmc2V0OworCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB1SVYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIHVFSVYpOworfQorCitWT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkcikKK3sKKwlVTE9ORyBvZmZzZXQ7CisJVUxPTkcgQWRkcjsKKworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7CisJQWRkciA9IHBBZGRyWzBdICsgKHBBZGRyWzFdIDw8IDgpICsocEFkZHJbMl0gPDwgMTYpICsocEFkZHJbM10gPDwgMjQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcik7CisJQWRkciA9IHBBZGRyWzRdICsgKHBBZGRyWzVdIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIEFkZHIpOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSwgSVYvRUlWIHRvIEFzaWMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBXQ0lEICAgICAgICAgICAgICAgICAgICBXQ0lEIEVudHJ5IG51bWJlci4KKyAgICAgICAgQnNzSW5kZXggICAgICAgICAgICAgICAgQlNTSUQgaW5kZXgsIHN0YXRpb24gb3Igbm9uZSBtdWx0aXBsZSBCU1NJRCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDAuCisgICAgICAgIEtleUlkeCAgICAgICAgICAgICAgICAgIFRoaXMgS2V5SWR4IHdpbGwgc2V0IHRvIElWJ3MgS2V5SUQgaWYgYlR4S2V5IGVuYWJsZWQKKyAgICAgICAgcENpcGhlcktleSAgICAgICAgICAgICAgUG9pbnRlciB0byBDaXBoZXIgS2V5LgorICAgICAgICBiVXNlUGFpcmV3aXNlS2V5VGFibGUgICBUUlVFIG1lYW5zIHNhdmVkIHRoZSBrZXkgaW4gU2hhcmVkS2V5IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgUGFpcmV3aXNlS2V5IHRhYmxlCisgICAgICAgIGJUeEtleSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHRyYW5zbWl0IGtleSBpZiBlbmFibGVkLgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHJlbGF0aXZlIGtleSBzdHVmZiB0byBBc2ljIGluY2x1ZGluZyBXQ0lEIGF0dHJpYnV0ZSwKKyAgICAgICAgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSBhbmQgSVYvRUlWLgorCisgICAgICAgIElWL0VJViB3aWxsIGJlIHVwZGF0ZSBpZiB0aGlzIENpcGhlcktleSBpcyB0aGUgdHJhbnNtaXNzaW9uIGtleSBiZWNhdXNlCisgICAgICAgIEFTSUMgd2lsbCBiYXNlIG9uIElWJ3MgS2V5SUQgdmFsdWUgdG8gc2VsZWN0IENpcGhlciBLZXkuCisKKyAgICAgICAgSWYgYlR4S2V5IHNldHMgdG8gRkFMU0UsIHRoaXMgaXMgbm90IHRoZSBUWCBrZXksIGJ1dCBpdCBjb3VsZCBiZQorICAgICAgICBSWCBrZXkKKworICAgIAlGb3IgQVAgbW9kZSBiVHhLZXkgbXVzdCBiZSBhbHdheXMgc2V0IHRvIFRSVUUuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUgkJS2V5SWR4LAorCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAorCUlOIEJPT0xFQU4JCWJUeEtleSkKK3sKKwlVTE9ORwlvZmZzZXQ7CisJVUNIQVIJSVY0ID0gMDsKKwlQVUNIQVIJCXBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworI2lmZGVmIFJUMjg2MAorCVVDSEFSCQlpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8vCisJLy8gMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0CisJLy8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8vCisJLy8gMi4pIFNldCBLZXkgdG8gQXNpYworCS8vCisJLy9mb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspCisjaWZkZWYgUlQyODYwCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8KKwkvLyAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlCisJLy8KKwlpZiAocFR4TWljKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCW9mZnNldCArPSBMRU5fVEtJUF9UWE1JQ0s7CisKKwlpZiAocFJ4TWljKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIDQuKSBNb2RpZnkgSVYvRUlWIGlmIG5lZWRzCisJLy8gICAgIFRoaXMgd2lsbCBmb3JjZSBBc2ljIHRvIHVzZSB0aGlzIGtleSBJRCBieSBzZXR0aW5nIElWLgorCS8vCisJaWYgKGJUeEtleSkKKwl7CisjaWZkZWYgUlQyODYwCisJCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJLy8KKwkJLy8gV3JpdGUgSVYKKwkJLy8KKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQsIHBUeHRzY1sxXSk7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMSwgKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAyLCBwVHh0c2NbMF0pOworCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7ICAvLyB0dXJuIG9uIGV4dGVuc2lvbiBiaXQgbWVhbnMgRUlWIGV4aXN0ZW5jZQorCisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgMywgSVY0KTsKKworCQkvLworCQkvLyBXcml0ZSBFSVYKKwkJLy8KKwkJb2Zmc2V0ICs9IDQ7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4dHNjW2kgKyAyXSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIFdDSUQsIEJzc0luZGV4LCBDaXBoZXJBbGcsIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJfQorCisJaWYgKCFiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJeworCQkvLworCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlCisJCS8vCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksICZjc3IxLndvcmQpOworCQlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCBjc3IxLndvcmQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgUGFpci13aXNlIGtleSBtYXRlcmlhbCBpbnRvIEFTSUMuCisJCVVwZGF0ZSBwYWlyd2lzZSBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFBhaXItd2lzZSBrZXkgdGFibGUKKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIJCVdDSUQsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KQoreworCUlOVCBpOworCVVMT05HIAkJb2Zmc2V0OworCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7CisJUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisjaWZkZWYgREJHCisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKyNlbmRpZiAvLyBEQkcgLy8KKworCS8vIEVLRVkKKwlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworI2lmZGVmIFJUMjg2MAorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCisJeworCQlVSU5UMzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8vICBNSUMgS0VZCisJaWYgKHBUeE1pYykKKwl7CisjaWZkZWYgUlQyODYwCisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcFR4TWljW2ldKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCX0KKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwUnhNaWNbaV0pOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkUGFpcndpc2VLZXlFbnRyeTogV0NJRCAjJWQgQWxnPSVzXG4iLFdDSUQsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10scFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7CisJfQorCWlmIChwVHhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKKwl9Cit9CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0lkeCwKKwlJTiBVQ0hBUgkJIFdjaWQpCit7CisJVUxPTkcJCVdDSURBdHRyaTsKKwlVU0hPUlQJCW9mZnNldDsKKworCS8vIHJlLXNldCB0aGUgZW50cnkncyBXQ0lEIGF0dHJpYnV0ZSBhcyBPUEVOLU5PTkUuCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisJV0NJREF0dHJpID0gKEJzc0lkeDw8NCkgfCBQQUlSV0lTRUtFWVRBQkxFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKK30KKworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIENvbW1hbmQsCisJSU4gVUNIQVIJCSBUb2tlbiwKKwlJTiBVQ0hBUgkJIEFyZzAsCisJSU4gVUNIQVIJCSBBcmcxKQoreworCUhPU1RfQ01EX0NTUl9TVFJVQwlIMk1DbWQ7CisJSDJNX01BSUxCT1hfU1RSVUMJSDJNTWFpbGJveDsKKwlVTE9ORwkJCQlpID0gMDsKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJc3RhdGljIFVJTlQzMiBqID0gMDsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKKwkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMik7CisJfSB3aGlsZShpKysgPCAxMDApOworCisJaWYgKGkgPj0gMTAwKQorCXsKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJCWlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCisJCXsKKwkJCS8qIHJlbG9hZGluZyBmaXJtd2FyZSB3aGVuIHJlY2VpdmVkIGl3cHJpdiBjbWQgIkFURT1BVEVTVE9QIiAqLworCQkJaWYgKGogPiAwKQorCQkJeworCQkJCWlmIChqICUgNjQgIT0gMCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiMiKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlxuIikpOworCQkJCX0KKwkJCQkrK2o7CisJCQl9CisJCQllbHNlIGlmIChqID09IDApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTG9hZGluZyBmaXJtd2FyZS4gUGxlYXNlIHdhaXQgZm9yIGEgbW9tZW50Li4uXG4iKSk7CisJCQkJKytqOworCQkJfQorCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisJCXsKKwkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSQUxJTktfQVRFCisJZWxzZSBpZiAocEFkLT5hdGUuYkZXTG9hZGluZyA9PSBUUlVFKQorCXsKKwkJLyogcmVsb2FkaW5nIG9mIGZpcm13YXJlIGlzIGNvbXBsZXRlZCAqLworCQlwQWQtPmF0ZS5iRldMb2FkaW5nID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlxuIikpOworCQlqID0gMDsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCisJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOworCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKKworCUgyTUNtZC53b3JkIAkJCSAgPSAwOworCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCAgPSBDb21tYW5kOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOworCisJaWYgKENvbW1hbmQgIT0gMHg4MCkKKwl7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBSVDI4NjAKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBDb21tYW5kKQoreworCVVJTlQzMglDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOworCVVJTlQzMglUaGlzQ0lETWFzayA9IDA7CisKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsICZDSUQpOworCQkvLyBGaW5kIHdoZXJlIHRoZSBjb21tYW5kIGlzLiBCZWNhdXNlIHRoaXMgaXMgcmFuZG9tbHkgc3BlY2lmaWVkIGJ5IGZpcm13YXJlLgorCQlpZiAoKENJRCAmIENJRDBNQVNLKSA9PSBDb21tYW5kKQorCQl7CisJCQlUaGlzQ0lETWFzayA9IENJRDBNQVNLOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMU1BU0spPj44KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSyk+PjE2KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSyk+PjI0KSAmIDB4ZmYpID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEM01BU0s7CisJCQlicmVhazsKKwkJfQorCisJCVJUTVB1c2VjRGVsYXkoMTAwKTsKKwkJaSsrOworCX13aGlsZSAoaSA8IDIwMCk7CisKKwkvLyBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZQorCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKKworCS8vIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuCisJaWYgKGkgPCAyMDApCisJeworCQkvLyBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4KKwkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDApCisJCQl8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ29tbWFuZCwgQ21kU3RhdHVzKSk7CisJfQorCS8vIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2hlY2tSYXRlcygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAorCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQoreworCVVDSEFSCVJhdGVJZHgsIGksIGo7CisJVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CisKKwlOZXdSYXRlTGVuID0gMDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCVJhdGVJZHggPSA0OworCWVsc2UKKwkJUmF0ZUlkeCA9IDEyOworCisJLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAorCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07CisKKwkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47CisJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpCit7CisJVUNIQVIJCWs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7CisKKwkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KKwlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKKwkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKKwkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7CisJCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7CisJfQorCisJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKKwkJeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQl9CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQorCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRkFMU0UgaWYgcEFkLT5Db21tb25DZmcuU3VwcG9ydGVkSHRQaHkgZG9lc24ndCBhY2NlcHQgdGhlIHBIdENhcGFiaWxpdHkuICAoQVAgTW9kZSkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVVDSEFSCQkJCQlXY2lkLAorCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK3sKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJfQorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJfQorCisJLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOworICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKworCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKyAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCX0KKworICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCisJQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJTWluaW11bVJhdGU7CisJVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OworCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisJQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQjoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQorCQkJCS8vIEIgb25seSBBUAorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCWVsc2UKKwkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCXsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKKwkJCQl7CisJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChiTWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCQl7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCQl7CisJCQkJCQliTWF0Y2ggPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChiTWF0Y2gpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQorCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKK30KKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMikKK3sKKwlDSEFSCWxhcmdlciA9IC0xMjc7CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQorCXsKKwkJbGFyZ2VyID0gUnNzaTA7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOworCX0KKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCisJeworCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7CisJfQorCisJaWYgKGxhcmdlciA9PSAtMTI3KQorCQlsYXJnZXIgPSAwOworCisJcmV0dXJuIGxhcmdlcjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBQZXJpb2RpYyBldmFsdWF0ZSBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJQkJQUjMgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUCQl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKyAgICAJcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCSkKKwl7CisJCVVMT05HCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOworCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgQWZ0ZXIgZXZhbHVhdGlvbiwgY2hlY2sgYW50ZW5uYSBsaW5rIHN0YXR1cworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIJKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIJCQlCQlBSMyA9IDA7CisJQ0hBUgkJCWxhcmdlciA9IC0xMjcsIHJzc2kwLCByc3NpMSwgcnNzaTI7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpCQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJcmV0dXJuOworCisKKwkJLy8gaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYQorCQlpZiAocEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID09IFRSVUUpCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKKwkJfQorCisJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwkJeworCQkJbGFyZ2VyID0gbWF4KHJzc2kwLCByc3NpMSk7CisKKwkJCWlmIChsYXJnZXIgPiAocnNzaTIgKyAyMCkpCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQkJZWxzZQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMzsKKwkJfQorCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJeworCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CisJCX0KKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJCUJCUFIzICY9ICh+MHgxOCk7CisJCWlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDMpCisJCXsKKwkJCUJCUFIzIHw9ICgweDEwKTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDIpCisJCXsKKwkJCUJCUFIzIHw9ICgweDgpOworCQl9CisJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMSkKKwkJeworCQkJQkJQUjMgfD0gKDB4MCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworI2lmZGVmIFJUMjg2MAorICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworCisKK1ZPSUQgQVBTRFBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXJldHVybjsKKworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50Kys7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKyAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKworCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQl9CisJCWVsc2UKKwkJCXJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykpCisJCQlyZXN1bHQgPSBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gZml4IHR4IGxlZ2FjeSByYXRlCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHR4X21vZGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgT3ZlcndyaXRlIEhUIFR4IE1vZGUgYnkgRml4ZWQgTGVnZW5jeSBUeCBNb2RlLCBpZiBzcGVjaWZpZWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlUcmFuc21pdFNldHRpbmcud29yZCA9IDA7CisKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7CisJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUzsKKworCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spCisJeworCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzMpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisJfQorCWVsc2UKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQorCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworCX0KKworCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWR5bmFtaWMgdHVuZSBCQlAgUjY2IHRvIGZpbmQgYSBiYWxhbmNlIGJldHdlZW4gc2Vuc2liaWxpdHkgYW5kCisJCW5vaXNlIGlzb2xhdGlvbgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJT3JpZ1I2NlZhbHVlID0gMCwgUjY2Oy8vLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7CisJQ0hBUglSc3NpOworCisJLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuOworCisJLy8KKwkvLyB3b3JrIGFzIGEgU1RBCisJLy8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICAvLyBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcKKwkJcmV0dXJuOworCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkpCisJCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyNpZmRlZiBSVDI4NjAKKwkJJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CisJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKKworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQl7CS8vQkcgYmFuZAorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewkvL0EgYmFuZAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKQoreworCVVDSEFSCVI2NiA9IDB4MzA7CisKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCXsJLy8gQkcgYmFuZAorCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJewkvL0EgYmFuZAorCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCit9CisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJQ2hhbm5lbCkKK3sKKworCS8vIFJGIFIyIGJpdCAxOCA9IDAKKwlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCVVDSEFSCQkJaW5kZXg7CisJUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjEgJiAweGZmZmZkZmZmOworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyICYgMHhmZmZiZmZmZjsKKwkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7CisKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJLy8gUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4KKwkJCQkJLy8gU2V0IFJGIFIyIGJpdDE4PTAsIFIzIGJpdFsxODoxOV09MAorCQkJCQkvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCQkJCWlmICgxKQorCQkJCQl7CisJCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIsIFIzKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworCitWT0lEIEFzaWNUdXJuT25SRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7CisJCQkJCVIzICY9IDB4ZmZmM2ZmZmY7CisJCQkJCVIzIHw9IDB4MDAwODAwMDA7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAorCQlDaGFubmVsLAorCQlwQWQtPlJmSWNUeXBlLAorCQlSMikpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y3ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgIm5ldGlmX2Jsb2NrLmgiCisKK3N0YXRpYyBORVRJRl9FTlRSWSBmcmVlTmV0SWZFbnRyeVBvb2xbRlJFRV9ORVRJRl9QT09MX1NJWkVdOworc3RhdGljIExJU1RfSEVBREVSIGZyZWVOZXRJZkVudHJ5TGlzdDsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpbnQgaTsKKworCWluaXRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBGUkVFX05FVElGX1BPT0xfU0laRTsgaSsrKQorCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpJmZyZWVOZXRJZkVudHJ5UG9vbFtpXSk7CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJCWluaXRMaXN0KCZwQWQtPmJsb2NrUXVldWVUYWJbaV0uTmV0SWZMaXN0KTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpCit7CisJUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKKworCWlmICgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpKSAhPSBOVUxMKQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShwTmV0RGV2KTsKKwkJcE5ldElmRW50cnktPnBOZXREZXYgPSBwTmV0RGV2OworCQlpbnNlcnRUYWlsTGlzdCgmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IFRSVUU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3N0b3BfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKK1ZPSUQgcmVsZWFzZU5ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisJUExJU1RfSEVBREVSIHBOZXRJZkxpc3QgPSAmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0OworCisJd2hpbGUoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdChwTmV0SWZMaXN0KSkgIT0gIE5VTEwpCisJeworCQlQTkVUX0RFViBwTmV0RGV2ID0gcE5ldElmRW50cnktPnBOZXREZXY7CisJCW5ldGlmX3dha2VfcXVldWUocE5ldERldik7CisJCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibmV0aWZfd2FrZV9xdWV1ZSglcylcbiIsIHBOZXREZXYtPm5hbWUpKTsKKwl9CisJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gRkFMU0U7CisJcmV0dXJuOworfQorCisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KQoreworCVBORVRfREVWIE5ldERldiA9IE5VTEw7CisJVUNIQVIgSWZJZHggPSAwOworCUJPT0xFQU4gdmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpICUgTUFYX0FQQ0xJX05VTTsKKwkJTmV0RGV2ID0gcEFkLT5BcENmZy5BcENsaVRhYltJZklkeF0uZGV2OworCX0KKwllbHNlCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworI2lmZGVmIFdEU19TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpCisJeworCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpICUgTUFYX1dEU19FTlRSWTsKKwkJTmV0RGV2ID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCisJeworI2lmZGVmIE1CU1NfU1VQUE9SVAorCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQl7CisJCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQpICUgTUFYX01CU1NJRF9OVU07CisJCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLk1CU1NJRFtJZklkeF0uTVNTSUREZXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworCQl9CisjZWxzZQorCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7CisjZW5kaWYKKwl9CisKKwkvLyBXTU0gc3VwcG9ydCA0IHNvZnR3YXJlIHF1ZXVlcy4KKwkvLyBPbmUgc29mdHdhcmUgcXVldWUgZnVsbCBkb2Vzbid0IG1lYW4gZGV2aWNlIGhhdmUgbm8gY2FwYmlsaXR5IHRvIHRyYW5zbWl0IHBhY2tldC4KKwkvLyBTbyBkaXNhYmxlIGJsb2NrIE5ldC1JZiBxdWV1ZSBmdW5jdGlvbiB3aGlsZSBXTU0gZW5hYmxlLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXZhbGlkID0gKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID09IFRSVUUpID8gRkFMU0UgOiBUUlVFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHZhbGlkKQorCQlibG9ja05ldElmKCZwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XSwgTmV0RGV2KTsKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19ORVRfSUZfQkxPQ0tfSF9fCisjZGVmaW5lIF9fTkVUX0lGX0JMT0NLX0hfXworCisvLyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJsaW5rX2xpc3QuaCIKKyNpbmNsdWRlICJydG1wLmgiCisKKyNkZWZpbmUgRlJFRV9ORVRJRl9QT09MX1NJWkUgMzIKKwordHlwZWRlZiBzdHJ1Y3QgX05FVElGX0VOVFJZCit7CisJc3RydWN0IF9ORVRJRl9FTlRSWSAqcE5leHQ7CisJUE5FVF9ERVYgcE5ldERldjsKK30gTkVUSUZfRU5UUlksICpQTkVUSUZfRU5UUlk7CisKK3ZvaWQgaW5pdGJsb2NrUXVldWVUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIGJsb2NrTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCisJSU4gUE5FVF9ERVYgcE5ldERldik7CisKK1ZPSUQgcmVsZWFzZU5ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KTsKKworVk9JRCBTdG9wTmV0SWZRdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQpOworI2VuZGlmIC8vIF9fTkVUX0lGX0JMT0NLX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWRmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDM3NDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAJImZpcm13YXJlLmgiCisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisKK1VDSEFSICAgIEJJVDhbXSA9IHsweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKK1VMT05HICAgIEJJVDMyW10gPSB7MHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwOCwKKwkJCQkJMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MCwKKwkJCQkJMHgwMDAwMDEwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDgwMCwKKwkJCQkJMHgwMDAwMTAwMCwgMHgwMDAwMjAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwODAwMCwKKwkJCQkJMHgwMDAxMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDA0MDAwMCwgMHgwMDA4MDAwMCwKKwkJCQkJMHgwMDEwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDgwMDAwMCwKKwkJCQkJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkJCQkJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMH07CisKK2NoYXIqICAgQ2lwaGVyTmFtZVtdID0geyJub25lIiwid2VwNjQiLCJ3ZXAxMjgiLCJUS0lQIiwiQUVTIiwiQ0tJUDY0IiwiQ0tJUDEyOCJ9OworCitjb25zdCB1bnNpZ25lZCBzaG9ydCBjY2l0dF8xNlRhYmxlW10gPSB7CisJMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCisJMHg4MTA4LCAweDkxMjksIDB4QTE0QSwgMHhCMTZCLCAweEMxOEMsIDB4RDFBRCwgMHhFMUNFLCAweEYxRUYsCisJMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyQjUsIDB4NDI5NCwgMHg3MkY3LCAweDYyRDYsCisJMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCisJMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0RTYsIDB4NzRDNywgMHg0NEE0LCAweDU0ODUsCisJMHhBNTZBLCAweEI1NEIsIDB4ODUyOCwgMHg5NTA5LCAweEU1RUUsIDB4RjVDRiwgMHhDNUFDLCAweEQ1OEQsCisJMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCisJMHhCNzVCLCAweEE3N0EsIDB4OTcxOSwgMHg4NzM4LCAweEY3REYsIDB4RTdGRSwgMHhENzlELCAweEM3QkMsCisJMHg0OEM0LCAweDU4RTUsIDB4Njg4NiwgMHg3OEE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCisJMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCisJMHg1QUY1LCAweDRBRDQsIDB4N0FCNywgMHg2QTk2LCAweDFBNzEsIDB4MEE1MCwgMHgzQTMzLCAweDJBMTIsCisJMHhEQkZELCAweENCREMsIDB4RkJCRiwgMHhFQjlFLCAweDlCNzksIDB4OEI1OCwgMHhCQjNCLCAweEFCMUEsCisJMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCisJMHhFREFFLCAweEZEOEYsIDB4Q0RFQywgMHhERENELCAweEFEMkEsIDB4QkQwQiwgMHg4RDY4LCAweDlENDksCisJMHg3RTk3LCAweDZFQjYsIDB4NUVENSwgMHg0RUY0LCAweDNFMTMsIDB4MkUzMiwgMHgxRTUxLCAweDBFNzAsCisJMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCisJMHg5MTg4LCAweDgxQTksIDB4QjFDQSwgMHhBMUVCLCAweEQxMEMsIDB4QzEyRCwgMHhGMTRFLCAweEUxNkYsCisJMHgxMDgwLCAweDAwQTEsIDB4MzBDMiwgMHgyMEUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCisJMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCisJMHgwMkIxLCAweDEyOTAsIDB4MjJGMywgMHgzMkQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCisJMHhCNUVBLCAweEE1Q0IsIDB4OTVBOCwgMHg4NTg5LCAweEY1NkUsIDB4RTU0RiwgMHhENTJDLCAweEM1MEQsCisJMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCisJMHhBN0RCLCAweEI3RkEsIDB4ODc5OSwgMHg5N0I4LCAweEU3NUYsIDB4Rjc3RSwgMHhDNzFELCAweEQ3M0MsCisJMHgyNkQzLCAweDM2RjIsIDB4MDY5MSwgMHgxNkIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCisJMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCisJMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4QzAsIDB4MDhFMSwgMHgzODgyLCAweDI4QTMsCisJMHhDQjdELCAweERCNUMsIDB4RUIzRiwgMHhGQjFFLCAweDhCRjksIDB4OUJEOCwgMHhBQkJCLCAweEJCOUEsCisJMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCisJMHhGRDJFLCAweEVEMEYsIDB4REQ2QywgMHhDRDRELCAweEJEQUEsIDB4QUQ4QiwgMHg5REU4LCAweDhEQzksCisJMHg3QzI2LCAweDZDMDcsIDB4NUM2NCwgMHg0QzQ1LCAweDNDQTIsIDB4MkM4MywgMHgxQ0UwLCAweDBDQzEsCisJMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCisJMHg2RTE3LCAweDdFMzYsIDB4NEU1NSwgMHg1RTc0LCAweDJFOTMsIDB4M0VCMiwgMHgwRUQxLCAweDFFRjAKK307CisjZGVmaW5lIEJ5dGVDUkMxNih2LCBjcmMpIFwKKwkodW5zaWduZWQgc2hvcnQpKChjcmMgPDwgOCkgXiAgY2NpdHRfMTZUYWJsZVsoKGNyYyA+PiA4KSBeICh2KSkgJiAyNTVdKQorCisvLworLy8gQkJQIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAorLy8KK1JFR19QQUlSICAgQkJQUmVnVGFibGVbXSA9IHsKKwl7QkJQX1I2NSwJCTB4MkN9LAkJLy8gZml4IHJzc2kgaXNzdWUKKwl7QkJQX1I2NiwJCTB4Mzh9LAkvLyBBbHNvIHNldCB0aGlzIGRlZmF1bHQgdmFsdWUgdG8gcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlIGF0IGluaXRpYWwKKwl7QkJQX1I2OSwJCTB4MTJ9LAorCXtCQlBfUjcwLAkJMHhhfSwJLy8gQkJQX1I3MCB3aWxsIGNoYW5nZSB0byAweDggaW4gQXBTdGFydFVwIGFuZCBMaW5rVXAgZm9yIHJ0Mjg2MEMsIG90aGVyd2lzZSB2YWx1ZSBpcyAweGEKKwl7QkJQX1I3MywJCTB4MTB9LAorCXtCQlBfUjgxLAkJMHgzN30sCisJe0JCUF9SODIsCQkweDYyfSwKKwl7QkJQX1I4MywJCTB4NkF9LAorCXtCQlBfUjg0LAkJMHg5OX0sCS8vIDB4MTkgaXMgZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuIDB4OTkgaXMgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZQorCXtCQlBfUjg2LAkJMHgwMH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjkxLAkJMHgwNH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjkyLAkJMHgwMH0sCS8vIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOAorCXtCQlBfUjEwMywgIAkweDAwfSwgCS8vIG5lYXIgcmFuZ2UgaGlnaC1wb3dlciBpc3N1ZSwgcmVxdWVzdGVkIGZyb20gR2FyeSBAMjAwOC0wNTI4CisJe0JCUF9SMTA1LAkJMHgwNX0sCS8vIDB4MDUgaXMgZm9yIHJ0Mjg2MEUgdG8gdHVybiBvbiBGRVEgY29udHJvbC4gSXQgaXMgc2FmZSBmb3IgcnQyODYwRCBhbmQgYmVmb3JlLCBiZWNhdXNlIEJpdCA3OjIgYXJlIHJlc2VydmVkIGluIHJ0Mjg2MEQgYW5kIGJlZm9yZS4KK307CisjZGVmaW5lCU5VTV9CQlBfUkVHX1BBUk1TCShzaXplb2YoQkJQUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKKworLy8KKy8vIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAorLy8KKworLy8KKy8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cworLy8KKworUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0JeworI2lmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgyMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZjhmMGU4ZTB9LCAvKiAweDM4MDAoZTApLCAweDNBMDAoZTgpLCAweDNDMDAoZjApLCAweDNFMDAoZjgpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwJCQkweDZmNzdkMGM4fSwgLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisjZWxzZQorICAgICNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hISEKKyNlbmRpZiAvLyBIV19CRUFDT05fT0ZGU0VUIC8vCisKKwl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAorCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgorCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAorCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCisJe0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgorCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0CisJe1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMworCXtUWF9USU1FT1VUX0NGRywJMHgwMDBhMjA5MH0sCS8vIENDSyBoYXMgc29tZSBwcm9ibGVtLiBTbyBpbmNyZWFzZSB0aW1pZW91dCB2YWx1ZS4gMjAwNi0xMC0wOS8vIE1BcnZlayBSVCAsIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDEKKwl7TUFYX0xFTl9DRkcsCQlNQVhfQUdHUkVHQVRJT05fU0laRSB8IDB4MDAwMDEwMDB9LAkvLyAweDMwMTgsIE1BWCBmcmFtZSBsZW5ndGguIE1heCBQU0RVID0gMTZrYnl0ZXMuCisJe0xFRF9DRkcsCQkweDdmMDMxZTQ2fSwgLy8gR2FyeSwgMjAwNi0wOC0yMworCXtQQkZfTUFYX1BDTlQsCQkJMHgxRjNGQkY5Rn0sIAkvLzB4MUYzZjdmOWZ9LAkJLy9KYW4sIDIwMDYvMDQvMjAKKwl7VFhfUlRZX0NGRywJCQkweDQ3ZDAxZjBmfSwJLy8gSmFuLCAyMDA2LzExLzE2LCBTZXQgVHhXSS0+QUNLID0wIGluIFByb2JlIFJzcCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAzCisJe0FVVE9fUlNQX0NGRywJCQkweDAwMDAwMDEzfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCisJe0NDS19QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgorCXtPRkRNX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe0dGMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sICAgIC8vIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTCisJe0dGNDBfUFJPVF9DRkcsCQkJMHgwM0Y0NDA4NH0sCisJe01NMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sCisjaWZkZWYgUlQyODYwCisJe01NNDBfUFJPVF9DRkcsCQkJMHgwM0Y1NDA4NH0sCisjZW5kaWYgLy8gUlQyODYwIC8vCisJe1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCisJe1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCisJe0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQorCXtUWE9QX0hMRFJfRVQsIAkJCTB4MDAwMDAwMDJ9LAorCisJLyogSmVycnkgY29tbWVudHMgMjAwOC8wMS8xNjogd2UgdXNlIFNJRlMgPSAxMHVzIGluIENDSyBkZWZhdWx0bHksIGJ1dCBpdCBzZWVtcyB0aGF0IDEwdXMKKwkJaXMgdG9vIHNtYWxsIGZvciBJTlRFTCAyMjAwYmcgY2FyZCwgc28gaW4gTUJTUyBtb2RlLCB0aGUgZGVsdGEgdGltZSBiZXR3ZWVuIGJlYWNvbjAKKwkJYW5kIGJlYWNvbjEgaXMgU0lGUyAoMTB1cyksIHNvIGlmIElOVEVMIDIyMDBiZyBjYXJkIGNvbm5lY3RzIHRvIEJTUzAsIHRoZSBwaW5nCisJCXdpbGwgYWx3YXlzIGxvc3QuIFNvIHdlIGNoYW5nZSB0aGUgU0lGUyBvZiBDQ0sgZnJvbSAxMHVzIHRvIDE2dXMuICovCisJe1hJRlNfVElNRV9DRkcsCQkJMHgzM2E0MTAxMH0sCisJe1BXUl9QSU5fQ0ZHLAkJCTB4MDAwMDAwMDN9LAkvLyBwYXRjaCBmb3IgMjg4MC1FCit9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1JUTVBfUkVHX1BBSVIJU1RBTUFDUmVnVGFibGVbXSA9CXsKKwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDIyNzN9LAorCXtXTU1fQ1dNSU5fQ0ZHLAkweDAwMDAyMzQ0fSwKKwl7V01NX0NXTUFYX0NGRywJMHgwMDAwMzRhYX0sCit9OworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJKHNpemVvZiAoRmlybXdhcmVJbWFnZSkgLyBzaXplb2YoVUNIQVIpKQorI2RlZmluZSBGSVJNV0FSRV9NQUpPUl9WRVJTSU9OCTAKKworI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICTB4MTAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICTB4MTAwMAorCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JMgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gIFBWT0lECWhhbmRsZSwKKwlPVVQJUFJUTVBfQURBUFRFUgkqcHBBZGFwdGVyKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UIAkJCWluZGV4OworCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOworCisJKnBwQWRhcHRlciA9IE5VTEw7CisKKwlkbworCXsKKwkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKKwkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKworCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKyNpZmRlZiBSVDI4NjAKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJZm9yIChpbmRleCA9MCA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspCisJCXsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOworCQl9CisKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJaWYgKChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgJiYgKHBCZWFjb25CdWYpKQorCQlrZnJlZShwQmVhY29uQnVmKTsKKworCSpwcEFkYXB0ZXIgPSBwQWQ7CisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jQWRhcHRlckJsb2NrLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgVHggcG93ZXIgcGVyIE1DUyBhbmQgQlcgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZWFkVHhQd3JQZXJSYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCQlkYXRhLCBBZGF0YSwgR2RhdGE7CisJVVNIT1JUCQlpLCB2YWx1ZSwgdmFsdWUyOworCUlOVAkJCUFwd3JkZWx0YSwgR3B3cmRlbHRhOworCVVDSEFSCQl0MSx0Mix0Myx0NDsKKwlCT09MRUFOCQliVmFsaWQsIGJBcHdyZGVsdGFNaW51cyA9IFRSVUUsIGJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CisKKwkvLworCS8vIEdldCBwb3dlciBkZWx0YSBmb3IgMjBNSHogYW5kIDQwTUh6LgorCS8vCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhwb3dlciBwZXIgUmF0ZVxuIikpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfREVMVEEsIHZhbHVlMik7CisJQXB3cmRlbHRhID0gMDsKKwlHcHdyZGVsdGEgPSAwOworCisJaWYgKCh2YWx1ZTIgJiAweGZmKSAhPSAweGZmKQorCXsKKwkJaWYgKCh2YWx1ZTIgJiAweDgwKSkKKwkJCUdwd3JkZWx0YSA9ICh2YWx1ZTImMHhmKTsKKworCQlpZiAoKHZhbHVlMiAmIDB4NDApKQorCQkJYkdwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJHcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCWlmICgodmFsdWUyICYgMHhmZjAwKSAhPSAweGZmMDApCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODAwMCkpCisJCQlBcHdyZGVsdGEgPSAoKHZhbHVlMiYweGYwMCk+PjgpOworCisJCWlmICgodmFsdWUyICYgMHg0MDAwKSkKKwkJCWJBcHdyZGVsdGFNaW51cyA9IEZBTFNFOworCQllbHNlCisJCQliQXB3cmRlbHRhTWludXMgPSBUUlVFOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHcHdyZGVsdGEgPSAleCwgQXB3cmRlbHRhID0gJXggLlxuIiwgR3B3cmRlbHRhLCBBcHdyZGVsdGEpKTsKKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gMi40Ry4KKwkvLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKKwkJZGF0YSA9IHZhbHVlOworCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKwkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlkYXRhIHw9ICh2YWx1ZTw8MTYpOworCisJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCQlwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gPSBHZGF0YTsKKworCQlpZiAoZGF0YSAhPSAweGZmZmZmZmZmKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBkYXRhKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCAyLjRHIGJhbmQtJWx4LCAgQWRhdGEgPSAlbHgsICBHZGF0YSA9ICVseCBcbiIsIGRhdGEsIEFkYXRhLCBHZGF0YSkpOworCX0KKworCS8vCisJLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgNDBNSHogaW4gMi40Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciA0ME1IeiBpbiAyLjRHLgorCS8vCisJaWYgKGJWYWxpZCkKKwl7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJeworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gKHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdICYgMHgwMDAwRkZGRikgfCAoR2RhdGEgJiAweEZGRkYwMDAwKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSA9IEdkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiNDBNSHogQlcsIDIuNEcgYmFuZCwgR2RhdGEgPSAlbHggXG4iLCBHZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciAyME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSAocEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldICYgMHgwMDAwRkZGRikgfCAoQWRhdGEgJiAweEZGRkYwMDAwKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KKworCS8vCisJLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgNDBNSHogaW4gNUcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKKwkvLworCWJWYWxpZCA9IFRSVUU7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDVHLgorCS8vCisJaWYgKGJWYWxpZCkKKwl7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJeworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyBpKjQsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdID0gQWRhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgNUdIeiBiYW5kLCBBZGF0YSA9ICVseCBcbiIsIEFkYXRhKSk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBjaGFubmVsIHBvd2VyIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZWFkQ2hhbm5lbFB3cigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCQlpLCBjaG9mZnNldDsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjI7CisKKwkvLyBSZWFkIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMKKwkvLyBWYWx1ZSBmcm9tIDEgLSAweDdmLiBEZWZhdWx0IHZhbHVlIGlzIDI0LgorCS8vIFBvd2VyIHZhbHVlIDogMi40RyAweDAwICgwKSB+IDB4MUYgKDMxKQorCS8vICAgICAgICAgICAgIDogNS41RyAweEY5ICgtNykgfiAweDBGICgxNSkKKworCS8vIDAuIDExYi9nLCBjaDEgLSBjaCAxNAorCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCQlwQWQtPlR4UG93ZXJbaSAqIDJdLkNoYW5uZWwgPSBpICogMiArIDE7CisJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLkNoYW5uZWwgPSBpICogMiArIDI7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTAgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyAxLiBVLU5JSSBsb3dlci9taWRkbGUgYmFuZDogMzYsIDM4LCA0MDsgNDQsIDQ2LCA0ODsgNTIsIDU0LCA1NjsgNjAsIDYyLCA2NCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDEuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwl9CisKKwkvLyAxLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMi4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyAzLiBVLU5JSSB1cHBlciBiYW5kOiAxNDksIDE1MSwgMTUzOyAxNTcsIDE1OSwgMTYxOyAxNjUgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKKwkvLyAzLjEgRmlsbCB1cCBjaGFubmVsCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTY7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTY1OworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMy4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyA0LiBQcmludCBhbmQgRGVidWcKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7CisKKworI2lmIDAKKwkvLyBJbml0IHRoZSA4MDIuMTFqIGNoYW5uZWwgbnVtYmVyIGZvciBUWCBjaGFubmVsIHBvd2VyCisJLy8gMC4gMjBNSHoKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2ldLkNoYW5uZWwgPSA4ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpXS5CVyA9IEJXXzIwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDNdLkNoYW5uZWwgPSAzNCArIGkgKiA0OworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDNdLkJXID0gQldfMjA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlcjExSltpICsgN10uQ2hhbm5lbCA9IDE4NCArIGkgKiA0OworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDddLkJXID0gQldfMjA7CisJfQorCisJLy8gMC4gMTBNSHoKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxMV0uQ2hhbm5lbCA9IDcgKyBpOworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDExXS5CVyA9IEJXXzEwOworCX0KKwlwQWQtPlR4UG93ZXIxMUpbMTNdLkNoYW5uZWwgPSAxMTsKKwlwQWQtPlR4UG93ZXIxMUpbMTNdLkJXID0gQldfMTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxNF0uQ2hhbm5lbCA9IDE4MyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTRdLkJXPSBCV18xMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxN10uQ2hhbm5lbCA9IDE4NyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTddLkJXID0gQldfMTA7CisJfQorCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9KYXBhbl9UWDJfUFdSX09GRlNFVCArIGkgKiAyKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMzYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMzYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAzNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMl0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMzYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPiAtNikpCisJCQlwQWQtPlR4UG93ZXIxMUpbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKKwkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCisJCTIuIE5ldHdvcmtBZGRyZXMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKQoreworCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBwYXJhbWV0ZXJzIGZyb20gRUVQUk9NCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQltYWNfYWRkcikKK3sKKwlVSU5UMzIJCQlkYXRhID0gMDsKKwlVU0hPUlQJCQlpLCB2YWx1ZSwgdmFsdWUyOworCVVDSEFSCQkJVG1wUGh5OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9WRVJTSU9OX1NUUlVDICAgIFZlcnNpb247CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworCisJLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKKworCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2CisJZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgorCWVsc2UKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOworCisJLy8gUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZQorCS8vIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcKKwlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAorCQlzdHJsZW4obWFjX2FkZHIpICE9IDE3IHx8CisJCW1hY19hZGRyWzJdICE9ICc6JyAgfHwgbWFjX2FkZHJbNV0gIT0gJzonICB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKKwkJbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKQorCXsKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBBZGRyMDEpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIEFkZHIyMyk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgQWRkcjQ1KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBFMlBST00gXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCUlOVAkJajsKKwkJUFVDSEFSCW1hY3B0cjsKKworCQltYWNwdHIgPSBtYWNfYWRkcjsKKworCQlmb3IgKGo9MDsgajxNQUNfQUREUl9MRU47IGorKykKKwkJeworCQkJQXRvSChtYWNwdHIsICZwQWQtPlBlcm1hbmVudEFkZHJlc3Nbal0sIDEpOworCQkJbWFjcHRyPW1hY3B0ciszOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CisJfQorCisKKwl7CisJCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQorCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKKwkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCisJCXsKKwkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKKwkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKwkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOworCQkJY3NyMy53b3JkID0gMDsKKwkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQl9CisJfQorCisJLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCisJLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKKworCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAorCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7CisJcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CisKKwlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCisJeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CisKKwkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAorCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CisJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCisJCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQlyZXR1cm47ICAqLworCX0KKworCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJfQorCisJLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCisJLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQorCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCisJLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKKwl7CisJCUFudGVubmEud29yZCA9IDA7CisJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAyOworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7CisJfQorCisJLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlR4UGF0aDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCisJCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKKwkJeworCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJfQorCX0KKworCS8vIDMqMworCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKKwkvLyB5ZXQgaW1wbGVtZW50CisJZm9yKGk9MDsgaTwzOyBpKyspCisJeworCX0KKworCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOaWNDb25maWcyLndvcmQgPSAwOworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKKwkJfQorCisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCisJCXsKKwkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6IFJ4UGF0aCA9ICVkLCBUeFBhdGggPSAlZFxuIiwgQW50ZW5uYS5maWVsZC5SeFBhdGgsIEFudGVubmEuZmllbGQuVHhQYXRoKSk7CisKKwkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CisKKwkvLworCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCisJLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCisJLy8KKwlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAorCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHTl9NSVhFRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseQorCS8vIDAuIDExYi9nCisJeworCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCisJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkgICBUc3NpUGx1c0JvdW5kYXJ5RyBbNF0gWzNdIFsyXSBbMV0gWzBdIChzbWFsbGVyKSArCisJCSAgIFRzc2lNaW51c0JvdW5kYXJ5R1swXSBbMV0gWzJdIFszXSBbNF0gKGxhcmdlcikgKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDZFLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcwLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcyLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmRyAgID0gUG93ZXIuZmllbGQuQnl0ZTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisKKwkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0CisJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCisJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAorCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCisJCQlwQWQtPlRzc2lSZWZHLAorCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKKwkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCX0KKwkvLyAxLiAxMWEKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENiwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REMsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwQSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUEgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXSA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gID0gcEFkLT5Uc3NpUmVmQTsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKKwkJCXBBZC0+VHNzaVJlZkEsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJfQorCXBBZC0+QmJwUnNzaVRvRGJtRGVsdGEgPSAweDA7CisKKwkvLyBSZWFkIGZyZXF1ZW5jeSBvZmZzZXQgc2V0dGluZyBmb3IgUkYKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9GUkVRX09GRlNFVCwgdmFsdWUpOworCWlmICgodmFsdWUgJiAweDAwRkYpICE9IDB4MDBGRikKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAoVUxPTkcpICh2YWx1ZSAmIDB4MDBGRik7CisJZWxzZQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKworCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQorCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAorCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisKKwlpZiAoKHZhbHVlIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpICYmICh2YWx1ZTIgPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKFVDSEFSKSB2YWx1ZSkgfCAweDgwOworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoKFVDSEFSKSB2YWx1ZTIpIHwgMHg4MDsKKwkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLworCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KKwkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQwID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOworCisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMSA9IHBBZC0+QUxOQUdhaW4wOworCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKKwkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKKworCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CisKKwkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MiA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDIgPSAwOworCisJLy8KKwkvLyBHZXQgTEVEIFNldHRpbmcuCisJLy8KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4M2EsIHZhbHVlKTsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSYweGZmMDApID4+IDg7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDEgPSB2YWx1ZTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMiA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDNfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQzID0gdmFsdWU7CisKKwlSVE1QUmVhZFR4UHdyUGVyUmF0ZShwQWQpOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUik7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVSU5UMzIJCQkJCWRhdGEgPSAwOworCVVDSEFSCUJCUFIxID0gMDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQkJCWk7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlVQ0hBUglCQlBSMyA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CisJZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwl7CisJCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7CisKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKKwkJeworCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKKwkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKKwkJfQorCX0KKworCUFudGVubmEud29yZCA9IHBBZC0+QW50ZW5uYS53b3JkOworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOworCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKKworCS8vCisJLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKKwl7CisJCXBBZC0+TGVkQ250bC53b3JkID0gMHgwMTsKKwkJcEFkLT5MZWQxID0gMHg1NTU1OworCQlwQWQtPkxlZDIgPSAweDIyMjE7CisKKyNpZmRlZiBSVDI4NjAKKwkJcEFkLT5MZWQzID0gMHhBOUY4OworI2VuZGlmIC8vIFJUMjg2MCAvLworCX0KKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMSwgKFVDSEFSKShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMiwgKFVDSEFSKShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMywgKFVDSEFSKShwQWQtPkxlZDMgPj4gOCkpOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKKwkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKKwkJeworCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKKwkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisjaWZkZWYgUlQyODYwCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOworCQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQorCXsKKwl9CisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisJLy8KKwkvLyBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlCisJLy8gdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhIQorCS8vCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQkJQUjEpOworCQlpZihwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJQkJQUjEgJj0gKH4weDE4KTsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCQlBSMSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBhdGggPSAlZCwgUnhQYXRoID0gJWQsIFJGSUM9JWQsIFBvbGFyK0xFRCBtb2RlPSV4XG4iLCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgTklDIGhhcmR3YXJlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisjaWZkZWYgUlQyODYwCisJVUlOVDMyCQkJVmFsdWU7CisJREVMQVlfSU5UX0NGR19TVFJVQwlJbnRDZmc7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUxPTkcJaSA9MCwgaj0wOworCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7CisKKwkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorcmV0cnk6CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpPDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJLy8gUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQKKwlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKKwlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKKwlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKKwlwQWQtPkJlYWNvbk9mZnNldFszXSA9IEhXX0JFQUNPTl9CQVNFMzsKKwlwQWQtPkJlYWNvbk9mZnNldFs0XSA9IEhXX0JFQUNPTl9CQVNFNDsKKwlwQWQtPkJlYWNvbk9mZnNldFs1XSA9IEhXX0JFQUNPTl9CQVNFNTsKKwlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKKwlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKKworCS8vCisJLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQworCS8vCisKKwkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCisJLy8gcGJmIGhhcmR3YXJlIHJlc2V0CisjaWZkZWYgUlQyODYwCisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8vIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTFmKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTAwKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCS8vIEluaXRpYWx6ZSBBU0lDIGZvciBUWCAmIFJ4IG9wZXJhdGlvbgorCWlmIChOSUNJbml0aWFsaXplQXNpYyhwQWQgLCBiSGFyZFJlc2V0KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJaWYgKGorKyA9PSAwKQorCQl7CisJCQlOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBSVDI4NjAKKwkvLyBXcml0ZSBBQ19CSyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjEsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIxIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEFDX0JFIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMCwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjAgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgQUNfVkkgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVkldLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIyLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMiA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBBQ19WTyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjMsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIzIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEhDQ0EgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJICBWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9IQ0NBXS5DZWxsWzBdLkFsbG9jUGEpOworCSAgUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI0LCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNCA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBNR01UX0JBU0VfQ1NSIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPk1nbXRSaW5nLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI1LCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNSA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBSWF9CQVNFX0NTUiByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9CQVNFX1BUUiwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSWF9CQVNFX1BUUiA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlcgorCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKKwlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRS0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCXsKKwkJZm9yIChpPTA7IGk8TlVNX09GX1RYX1JJTkc7IGkrKykKKwkJeworCQkJcEFkLT5UeFJpbmdbaV0uVHhTd0ZyZWVJZHggPSAwOworCQkJcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHggPSAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKKwkJfQorCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCisJLy8KKwkvLyBzZXQgZWFjaCBSaW5nJ3MgU0laRSAgaW50byBBU0lDLiBEZXNjcmlwdG9yIFNpemUgaXMgZml4ZWQgYnkgZGVzaWduLgorCS8vCisKKwkvLyBXcml0ZSBUWF9SSU5HX0NTUjAgcmVnaXN0ZXIKKwlWYWx1ZSA9IFRYX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMCwgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQxLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDIsIFZhbHVlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMywgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQ0LCBWYWx1ZSk7CisJVmFsdWUgPSBNR01UX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UTUFYX0NOVCwgVmFsdWUpOworCisJLy8gV3JpdGUgUlhfUklOR19DU1IgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJYX1JJTkdfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9NQVhfQ05ULCBWYWx1ZSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vIFdNTSBwYXJhbWV0ZXIKKwljc3IwLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwl7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCX0KKwllbHNlCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOworCisKKyNpZmRlZiBSVDI4NjAKKwkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8IDEwMCk7CisKKwlHbG9DZmcud29yZCAmPSAweGZmMDsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCUludENmZy53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCBJbnRDZmcud29yZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vIHJlc2V0IGFjdGlvbgorCS8vIExvYWQgZmlybXdhcmUKKwkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCit7CisJVUxPTkcJCQlJbmRleCA9IDA7CisJVUNIQVIJCQlSMCA9IDB4ZmY7CisJVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKKwlVU0hPUlQJCQlLZXlJZHg7CisJSU5UCQkJCWksYXBpZHg7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7CisJfQorCWVsc2UKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8KKwkvLyBCZWZvcmUgcHJvZ3JhbSBCQlAsIHdlIG5lZWQgdG8gd2FpdCBCQlAvUkYgZ2V0IHdha2UgdXAuCisJLy8KKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NUQVRVU19DRkcsICZNYWNDc3IxMik7CisKKwkJaWYgKChNYWNDc3IxMiAmIDB4MDMpID09IDApCS8vIGlmIEJCLlJGIGlzIHN0YWJsZQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2sgTUFDX1NUQVRVU19DRkcgID0gQnVzeSA9ICV4XG4iLCBNYWNDc3IxMikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOworCisgICAgLy8gVGhlIGNvbW1hbmRzIHRvIGZpcm13YXJlIHNob3VsZCBiZSBhZnRlciB0aGVzZSBjb21tYW5kcywgdGhlc2UgY29tbWFuZHMgd2lsbCBpbml0IGZpcm13YXJlCisJLy8gUENJIGFuZCBVU0IgYXJlIG5vdCB0aGUgc2FtZSBiZWNhdXNlIFBDSSBkcml2ZXIgbmVlZHMgdG8gd2FpdCBmb3IgUENJIGJ1cyByZWFkeQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkvLyBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJLy8gUmVhZCBCQlAgcmVnaXN0ZXIsIG1ha2Ugc3VyZSBCQlAgaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIHdyaXRlIG5ldyBkYXRhCisJSW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjAsICZSMCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJCUCB2ZXJzaW9uID0gJXhcbiIsIFIwKSk7CisJfSB3aGlsZSAoKCsrSW5kZXggPCAyMCkgJiYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpKTsKKwkvL0FTU0VSVChJbmRleCA8IDIwKTsgLy90aGlzIHdpbGwgY2F1c2UgQlNPRCBvbiBDaGVjay1idWlsZCBkcml2ZXIKKworCWlmICgoUjAgPT0gMHhmZikgfHwgKFIwID09IDB4MDApKQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIEJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKKworCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMik7CisgICAgfQorCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKSAvLyAzKjMKKwl7CisJCS8vIGVubGFyZ2UgTUFYX0xFTl9DRkcKKwkJVUlOVDMyIGNzcjsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQVhfTEVOX0NGRywgJmNzcik7CisJCWNzciAmPSAweEZGRjsKKwkJY3NyIHw9IDB4MjAwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIGNzcik7CisJfQorCisKKwkvLyBBZGQgcmFkaW8gb2ZmIGNvbnRyb2wKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworLy8JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IFJhZGlvIE9mZlxuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisKKwkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKKwkvLyBDbGVhciBhbGwgc2VhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KKwlpZiAoYkhhcmRSZXNldCkKKwl7CisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOworCQl9CisKKwkJLy8gQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKKwkJfQorCX0KKworCisJLy8gSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGNsZWFyIHRoaXMgc3BhY2Ugd2hlbiBub3QgaGFyZCByZXNldC4KKwlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKQorCXsKKwkJLy8gY2xlYXIgYWxsIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlCisJCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGFwaWR4KyspCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fT0ZGU0VUPj4yOyBpKz00KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2FwaWR4XSArIGksIDB4MDApOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSXNzdWVSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UMzIJVmFsdWUgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CisKKwkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBBU0lDIHJlZ2lzdGVycyBhbmQgZmluZCBhbnkgcmVhc29uIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOworCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKKwlVQ0hBUgkJCQlpID0gMDsKKwlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOworCUNIQVIJCQkJcmVUcnk7CisJVUNIQVIJCQkJc3VjY01DUzsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCWRvCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKKwkJCQlicmVhazsKKworCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7CisKKworCQkvKiBpZ25vcmUgTm9BQ0sgYW5kIE1HTVQgZnJhbWUgdXNlIDB4RkYgYXMgV0NJRCAqLworCQkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorCQkJeworCQkJCWkrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCisJCQlwaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC5QaWRUeXBlOworCisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeEJGKSAvLyAzKjMKKwkJCQlwRW50cnktPlR4QkZDb3VudCsrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQkJVUFQU0RfU1BfQVVFX0hhbmRsZShwQWQsIHBFbnRyeSwgU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKworCQkJaWYgKCFTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKKwkJCXsKKwkJCQlwRW50cnktPkZJRk9Db3VudCsrOworCQkJCXBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQrKzsKKworCQkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKKyNpZiAwCisJCQkJCVNlbmRSZWZyZXNoQkFSKHBBZCwgcEVudHJ5KTsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2Vsc2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCWlmKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpCisJCQkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCWludCB0aWQ7CisJCQkJCQlmb3IgKHRpZD0wOyB0aWQ8TlVNX09GX1RJRDsgdGlkKyspCisJCQkJCQl7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgIHRpZCwgRkFMU0UsIEZBTFNFKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQkJLy8gVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlCisJCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250Kys7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZQorCQkJCQkJLy8gICAgIHRoaXMgdHggZXJyb3IgaGFwcGVuZWQgZHVlIHRvIHN0YSBqdXN0IGdvIHRvIHNsZWVwLgorCQkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQkJCX0KKyNlbmRpZgorCQkJCQkvL3BFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQl9CisJCQkJLy9wRW50cnktPmJTZW5kQkFSID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoKHBFbnRyeS0+UHNNb2RlICE9IFBXUl9TQVZFKSAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOworCQkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bj09MCkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOworCQkJCQl9CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQlwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQrKzsKKwkJCQkvLyB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4KKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQl9CisKKwkJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKKworCQkJcmVUcnkgPSBwaWQgLSBzdWNjTUNTOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0V4cGVjdGVkW3BpZF0rKzsKKwkJCQlpZiAocGlkID09IHN1Y2NNQ1MpCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnktPlRYTUNTRmFpbGVkW3BpZF0rKzsKKwkJCX0KKworCQkJaWYgKHJlVHJ5ID4gMCkKKwkJCXsKKwkJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PTcpCisJCQkJeworCQkJCQlyZVRyeSAtPSA0OworCQkJCX0KKwkJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OworCQkJfQorCisJCQlpKys7CisJCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCisJCX0gd2hpbGUgKCBpIDwgKDIqVFhfUklOR19TSVpFKSApOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHN0YXRpc3RpY2FsIGNvdW50ZXJzIGZyb20gaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCByZWNvcmQgdGhlbQorCQlpbiBzb2Z0d2FyZSB2YXJpYWJsZXMgZm9yIGxhdGVyIG9uIHF1ZXJ5CisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyCU9sZFZhbHVlOworCVJYX1NUQV9DTlQwX1NUUlVDCSBSeFN0YUNudDA7CisJUlhfU1RBX0NOVDFfU1RSVUMgICBSeFN0YUNudDE7CisJUlhfU1RBX0NOVDJfU1RSVUMgICBSeFN0YUNudDI7CisJVFhfU1RBX0NOVDBfU1RSVUMgCSBUeFN0YUNudDA7CisJVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKKwlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOworCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7CisJVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOworCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKKwlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7CisJVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOworCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKKwlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7CisJVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OworCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZSeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJlJ4U3RhQ250Mi53b3JkKTsKKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJlJ4U3RhQ250MS53b3JkKTsKKwkgICAgLy8gVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlcgorCSAgICBwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvLyBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPSBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CisJfQorCisJLy8gVXBkYXRlIEZDUyBjb3VudGVycworCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCisJcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOworCisJaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQorCXsKKwkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJfQorCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMiwgJlR4QWdnQ250Mi53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwl9CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwl7CisJCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKKwkJQ09VTlRFUl9SQUxJTksJKnBSYWxpbmtDb3VudGVyczsKKwkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKKworCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisJCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOworCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKKworCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7CisJCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7CisJCQlwRGlhZy0+aW5pdGVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFR4CisJCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCisJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQorCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOworCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCX0KKwkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKKwkJCWZvciAoaSA9IDk7IGkgPCAyNDsgaSsrKSAvLyAzKjMKKwkJCXsKKwkJCQlwRGlhZy0+VHhEZXNjQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlR4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlJ4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Cit9CisKKwkJCWlmIChwRGlhZy0+QXJyYXlDdXJJZHggPT0gcERpYWctPkFycmF5U3RhcnRJZHgpCisJCQkJSU5DX1JJTkdfSU5ERVgocERpYWctPkFycmF5U3RhcnRJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJfQorCisJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIGZyb20gZXJyb3IKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yIHN0YXRlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ1Jlc2V0RnJvbUVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vIFJlc2V0IEJCUCAoYWNjb3JkaW5nIHRvIGFsZXgsIHJlc2V0IEFTSUMgd2lsbCBmb3JjZSByZXNldCBCQlAKKwkvLyBUaGVyZWZvcmUsIHNraXAgdGhlIHJlc2V0IEJCUAorCS8vIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCS8vIFJlbW92ZSBBU0lDIGZyb20gcmVzZXQgc3RhdGUKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CisKKwlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIEZBTFNFKTsKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKKworCS8vIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCisJZm9yKGk9MDsgaTxNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSs9NCkKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIDApOworCit9LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgODA1MSBmaXJtd2FyZSBSVDI1NjEuQklOIGZpbGUgaW50byBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIEJJTl9JTl9GSUxFCisjZGVmaW5lIE5JQ0xGX0RFRkFVTFRfVVNFKCkJXAorCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gVFJVRTsgXAorCXByaW50aygiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlzcmM7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVCAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZCwgaTsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUlOVAkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMgkJCU1hY1JlZzsKKwlVTE9ORwkJCUluZGV4OworCVVMT05HCQkJZmlybTsKKwlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwkvKiBpbml0ICovCisJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXNyYyA9IFJUTVBfRklSTVdBUkVfRklMRV9OQU1FOworCisJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkgKi8KKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCisJCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KKyAgICBwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKKwl7CisJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJTklDTEZfREVGQVVMVF9VU0UoKTsKKyAgICB9CisJZWxzZQorCXsKKwkJLyogYWxsb2NhdGUgb2shIHplcm8gdGhlIGZpcm13YXJlIGJ1ZmZlciAqLworCQltZW1zZXQocEZpcm13YXJlSW1hZ2UsIDB4MDAsIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiBpZiBvaywgcmVhZCBmaXJtd2FyZSBmaWxlIGZyb20gKi5iaW4gZmlsZSAqLworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCXByaW50aygiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCXByaW50aygiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICBwRmlybXdhcmVJbWFnZSwKKwkJCQkJCQkJCQkgIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCisJCQl7CisJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUFVDSEFSIHB0ciA9IHBGaXJtd2FyZUltYWdlOworCQkJCVVTSE9SVCBjcmMgPSAweGZmZmY7CisKKworCQkJCS8qIGNhbGN1bGF0ZSBmaXJtd2FyZSBDUkMgKi8KKwkJCQlmb3IoaT0wOyBpPChNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yKTsgaSsrLCBwdHIrKykKKwkJCQkJY3JjID0gQnl0ZUNSQzE2KGJpdHJldjgoKnB0ciksIGNyYyk7CisJCQkJLyogRW5kIG9mIGZvciAqLworCisJCQkJaWYgKChwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSAhPSBcCisJCQkJCQkJCShVQ0hBUiliaXRyZXY4KChVQ0hBUikoY3JjPj44KSkpIHx8CisJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSAhPSBcCisJCQkJCQkJCShVQ0hBUiliaXRyZXY4KChVQ0hBUiljcmMpKSkKKwkJCQl7CisJCQkJCS8qIENSQyBmYWlsICovCisJCQkJCXByaW50aygiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgorCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKKwkJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAorCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCisJCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSk7CisJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBmaXJtd2FyZSBpcyBvayAqLworCQkJCQlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IFwKKwkJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSA8PCA4KSArCisJCQkJCQlwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXTsKKworCQkJCQkvKiBjaGVjayBpZiBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIHRvbyBvbGQgKi8KKwkJCQkJaWYgKChwQWQtPkZpcm13YXJlVmVyc2lvbikgPCBcCisJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCisJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKKwkJCQkJeworCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKKwkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLworCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJOworCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfSAvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiB3cml0ZSBmaXJtd2FyZSB0byBBU0lDICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IFRSVUUpCisJeworCQkvKiB1c2UgZGVmYXVsdCBmaW1ld2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKworCQkvKiB1c2UgZGVmYXVsdCAqLmJpbiBhcnJheSAqLworCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CisKKwkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCS8qIHVzZSBmaWxlIGZpcm13YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbHNlCisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKKwlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OworCS8vVUxPTkcJCQlmaXJtOworCVVJTlQzMgkJCU1hY1JlZyA9IDA7CisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwlSVDI4WFhfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOworICAgIHJldHVybiBTdGF0dXM7Cit9IC8qIEVuZCBvZiBOSUNMb2FkRmlybXdhcmUgKi8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCBUeCByYXRlIHN3aXRjaGluZyBwYXJhbWV0ZXJzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlSYXRlIFRhYmxlIEZvcm1hdDoKKwkJMS4gKEIwOiBWYWxpZCBJdGVtIG51bWJlcikgKEIxOkluaXRpYWwgaXRlbSBmcm9tIHplcm8pCisJCTIuIEl0ZW0gTnVtYmVyKERlYykgICAgICBNb2RlKEhleCkgICAgIEN1cnJlbnQgTUNTKERlYykgICAgVHJhaW5VcChEZWMpICAgIFRyYWluRG93bihEZWMpCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgorCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCisKKwlSZXR1cm4gVmFsdWU6CisJCTE6CQkJbm90IGFsbCB6ZXJvCisJCTA6CQkJYWxsIHplcm8KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJbmRleCA9PSBMZW5ndGgpCisJeworCQlyZXR1cm4gKDApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBmaXJzdCBtZW1vcnkgYWRkcmVzcworCQlwU3JjMgkJUG9pbnRlciB0byBzZWNvbmQgbWVtb3J5IGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKwkJMDoJCQltZW1vcnkgaXMgZXF1YWwKKwkJMToJCQlwU3JjMSBtZW1vcnkgaXMgbGFyZ2VyCisJCTI6CQkJcFNyYzIgbWVtb3J5IGlzIGxhcmdlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JUFZPSUQJcFNyYzIsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmMyOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMSk7CisJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMik7CisJfQorCisJLy8gRXF1YWwKKwlyZXR1cm4gKDApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJU2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFplcm9NZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IDB4MDA7CisJfQorfQorCitWT0lECVJUTVBGaWxsTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCVVDSEFSCUZpbGwpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IEZpbGw7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKKworCUFyZ3VtZW50czoKKwkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKwkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlDb3B5IHNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb3ZlTWVtb3J5KAorCU9VVAlQVk9JRAlwRGVzdCwKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVJTlQJSW5kZXg7CisKKwlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKworCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgcG9ydCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJVXNlckNmZ0luaXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgVUlOVCBrZXlfaW5kZXgsIGJzc19pbmRleDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdFxuIikpOworCisJLy8KKwkvLyAgcGFydCBJLiBpbnRpYWxpemUgY29tbW9uIGNvbmZpZ3VyYXRpb24KKwkvLworCisJZm9yKGtleV9pbmRleD0wOyBrZXlfaW5kZXg8U0hBUkVfS0VZX05VTTsga2V5X2luZGV4KyspCisJeworCQlmb3IoYnNzX2luZGV4ID0gMDsgYnNzX2luZGV4IDwgTUFYX01CU1NJRF9OVU07IGJzc19pbmRleCsrKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uS2V5TGVuID0gMDsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJfQorCX0KKworCXBBZC0+QW50ZW5uYS53b3JkID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKworCXBBZC0+TGVkQ250bC53b3JkID0gMDsKKyNpZmRlZiBSVDI4NjAKKwlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAwOworCXBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOworCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKworCS8vIEluaXQgdGltZXIgZm9yIHJlc2V0IGNvbXBsZXRlIGV2ZW50CisJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAxOworCXBBZC0+YkZvcmNlUHJpbnRUWCA9IEZBTFNFOworCXBBZC0+YkZvcmNlUHJpbnRSWCA9IEZBTFNFOworCXBBZC0+YlN0YUZpZm9UZXN0ID0gRkFMU0U7CisJcEFkLT5iUHJvdGVjdGlvblRlc3QgPSBGQUxTRTsKKwlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOworCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5Ec2lmcyA9IDEwOyAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSAweGZmZmZmZmZmOyAvLyBBVVRPCisJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVBdXRvOyAvLyB1c2UgTG9uZyBwcmVhbWJsZSBvbiBUWCBieSBkZWZhdXQKKwlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gMjM0NzsKKwlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IDIzNDY7CisJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsgICAgLy8gMDogQVVUTworCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsgLy8wOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOyAgICAgLy8gdW5rbm93bgorCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IDEwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IDY1OworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSAzOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMDsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCXBBZC0+YkJyb2FkQ29tSFQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbCA9IGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gNX4xMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsID0gZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsOwkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgPSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbDsJLy8gVW5pdCA6IFNlY29uZAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbCA9IGRvdDExT0JTU1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvciA9IGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcjsKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlID0gZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQ7CS8vIFVuaXQgOiBwZXJjZW50YWdlCisJcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXkgPSAocEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpOworI2VuZGlmICAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXQuIEJBQ2FwYWJpbGl0eSA9IDB4JXhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkKSk7CisKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJQkFUYWJsZUluaXQocEFkLCAmcEFkLT5CQVRhYmxlKTsKKworCXBBZC0+Q29tbW9uQ2ZnLmJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDc7CisKKwlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OworCisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7CisJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCisKKwkvLworCS8vIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJYX0ZJTFRFUl9TRVRfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCk7CisJCVJYX0ZJTFRFUl9DTEVBUl9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUKTsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCk7CisKKwkJcEFkLT5TdGFDZmcuUHNtID0gUFdSX0FDVElWRTsKKworCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCS8vIDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gMDsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250ICAgICAgICA9IDA7CisJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICAgICAgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgICAgICAgICA9IFNTX05PVFVTRTsKKworCQlwQWQtPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9IEZBTFNFOwkJLy8gTmV3IHRvIHN1cHBvcnQgbWljcm9zb2Z0IGRpc2FibGUgcmFkaW8gd2l0aCBPSUQgY29tbWFuZAorCisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHNpemVvZihSU1NJX1NBTVBMRSkpOworCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlck1vZGUgPSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKKwkJcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ly9kZWZhdWx0IGxpc3RlbiBjb3VudDsKKwkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0Mgb3IgQlNTX01PTklUT1IKKwkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCX0KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBnbG9iYWwgdmFyaWFibGVzIG1YWFhYIHVzZWQgaW4gTUFDIHByb3RvY29sIHN0YXRlIG1hY2hpbmVzCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKworCS8vIFBIWSBzcGVjaWZpY2F0aW9uCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkJLy8gZGVmYXVsdCBQSFkgbW9kZQorCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7ICAvLyBDQ0sgdXNlIExPTkcgcHJlYW1ibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZQorCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID0gRkFMU0U7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJLy8gQ0NYIHYxLjAgcmVsZWF0ZWQgaW5pdCB2YWx1ZQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID0gQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZTsKKwkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwgcEFkLCBGQUxTRSk7CisJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IEZBTFNFOworCisJCS8vIFBhdGNoIGZvciBOZHRlc3QKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKwkJLy8gQ0NYIDIuMCBjb250cm9sIGZsYWcgaW5pdAorCQlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7CisJCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCisJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgSGFyZHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJTd1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgU29mdHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCisJCXBBZC0+U3RhQ2ZnLmJSYWRpbyAgICA9IFRSVUU7IC8vIGJId1JhZGlvICYmIGJTd1JhZGlvCisJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CQkvLyBEZWZhdWx0IGlzIE9GRgorCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJCS8vIERlZmF1bHQgbm8gc2hvdworCisJCS8vIE5pdHJvIG1vZGUgY29udHJvbAorCQlwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisKKwkJLy8gU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4KKwkJLy8gVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4KKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gMDsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5uaWNrbmFtZSwgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJCXNwcmludGYocEFkLT5uaWNrbmFtZSwgIiVzIiwgU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyksIHBBZCwgRkFMU0UpOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRGVmYXVsdCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gaXMgbm90IHZhbGlkCisJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCisJLy8gRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcKKwlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CisKKwkvLworCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucworCS8vCisKKworCS8vCisJLy8gcGFydCBJVi4gb3RoZXJzCisJLy8KKwkvLyBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlCisJcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSAgICAgICAgICAgICAgICA9IFRSVUU7CisJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOworCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OworCXBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjayA9IFRSVUU7CisKKwkvLworCS8vIEFsc28gaW5pdGlhbCBSNjZDdXJyZW50VmFsdWUsIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiBtaWdodCB1c2UgdGhpcyB2YWx1ZS4KKwkvLyBpZiBub3QgaW5pdGlhbCB0aGlzIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDAuCisJLy8KKwlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OworCisJcEFkLT5CYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCXBBZC0+QmJwRm9yQ0NLID0gRkFMU0U7CisKKwkvLyBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPk1hY1RhYi5NY2FzdFBzUXVldWUpOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPmF0ZSwgc2l6ZW9mKEFURV9JTkZPKSk7CisJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCXBBZC0+YXRlLlR4Q291bnQgPSAyMDA7LyogdG8gZXhjZWVkIFRYX1JJTkdfU0laRSAuLi4gKi8KKwlwQWQtPmF0ZS5UeExlbmd0aCA9IDEwMjQ7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsvLyBMT05HIEdJIDogODAwIG5zCisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gTU9ERV9DQ0s7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwlwQWQtPmF0ZS5DaGFubmVsID0gMTsKKwlwQWQtPmF0ZS5RSUQgPSBRSURfQUNfQkU7CisJcEFkLT5hdGUuQWRkcjFbMF0gPSAweDAwOworCXBBZC0+YXRlLkFkZHIxWzFdID0gMHgxMTsKKwlwQWQtPmF0ZS5BZGRyMVsyXSA9IDB4MjI7CisJcEFkLT5hdGUuQWRkcjFbM10gPSAweEFBOworCXBBZC0+YXRlLkFkZHIxWzRdID0gMHhCQjsKKwlwQWQtPmF0ZS5BZGRyMVs1XSA9IDB4Q0M7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjIsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlwQWQtPmF0ZS5iUnhGZXIgPSAwOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisjaWZkZWYgUlQyODYwCisJcEFkLT5hdGUuYkZXTG9hZGluZyA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKKwlwQWQtPmF0ZS5BdGVQaWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOworI2lmZGVmIFJUMjg2MAorICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VDSEFSIEJ0b0goY2hhciBjaCkKK3sKKwlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgcmV0dXJuIChjaCAtICcwJyk7ICAgICAgICAvLyBIYW5kbGUgbnVtZXJhbHMKKwlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgcmV0dXJuIChjaCAtICdBJyArIDB4QSk7ICAvLyBIYW5kbGUgY2FwaXRvbCBoZXggZGlnaXRzCisJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHJldHVybiAoY2ggLSAnYScgKyAweEEpOyAgLy8gSGFuZGxlIHNtYWxsIGhleCBkaWdpdHMKKwlyZXR1cm4oMjU1KTsKK30KKworLy8KKy8vICBGVU5DVElPTjogQXRvSChjaGFyICosIFVDSEFSICosIGludCkKKy8vCisvLyAgUFVSUE9TRTogIENvbnZlcnRzIGFzY2lpIHN0cmluZyB0byBuZXR3b3JrIG9yZGVyIGhleAorLy8KKy8vICBQQVJBTUVURVJTOgorLy8gICAgc3JjICAgIC0gcG9pbnRlciB0byBpbnB1dCBhc2NpaSBzdHJpbmcKKy8vICAgIGRlc3QgICAtIHBvaW50ZXIgdG8gb3V0cHV0IGhleAorLy8gICAgZGVzdGxlbiAtIHNpemUgb2YgZGVzdAorLy8KKy8vICBDT01NRU5UUzoKKy8vCisvLyAgICAyIGFzY2lpIGJ5dGVzIG1ha2UgYSBoZXggYnl0ZSBzbyBtdXN0IHB1dCAxc3QgYXNjaWkgYnl0ZSBvZiBwYWlyCisvLyAgICBpbnRvIHVwcGVyIG5pYmJsZSBhbmQgMm5kIGFzY2lpIGJ5dGUgb2YgcGFpciBpbnRvIGxvd2VyIG5pYmJsZS4KKy8vCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCit2b2lkIEF0b0goY2hhciAqIHNyYywgVUNIQVIgKiBkZXN0LCBpbnQgZGVzdGxlbikKK3sKKwljaGFyICogc3JjcHRyOworCVBVQ0hBUiBkZXN0VGVtcDsKKworCXNyY3B0ciA9IHNyYzsKKwlkZXN0VGVtcCA9IChQVUNIQVIpIGRlc3Q7CisKKwl3aGlsZShkZXN0bGVuLS0pCisJeworCQkqZGVzdFRlbXAgPSBCdG9IKCpzcmNwdHIrKykgPDwgNDsgICAgLy8gUHV0IDFzdCBhc2NpaSBieXRlIGluIHVwcGVyIG5pYmJsZS4KKwkJKmRlc3RUZW1wICs9IEJ0b0goKnNyY3B0cisrKTsgICAgICAvLyBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuCisJCWRlc3RUZW1wKys7CisJfQorfQorCitWT0lECVJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwlJbmRleDsKKworCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIChVQ0hBUilCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLy8gUmUtaW5pdCBCQlAgcmVnaXN0ZXIgZnJvbSBFRVBST00gdmFsdWUKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJcFRpbWVyRnVuYwkJCUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aW1lciBleHBpcmVkCisJCVJlcGVhdAkJCQlUdXJlIGZvciBwZXJpb2QgdGltZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRUaW1lcigKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglQVk9JRAkJCQkJcFRpbWVyRnVuYywKKwlJTglQVk9JRAkJCQkJcERhdGEsCisJSU4JQk9PTEVBTgkJCQkJUmVwZWF0KQoreworCS8vCisJLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCisJLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgorCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KKwkvLworCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7CisKKwlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKKwlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7CisKKworCVJUTVBfT1NfSW5pdF9UaW1lcihwQWQsCSZwVGltZXItPlRpbWVyT2JqLAlwVGltZXJGdW5jLCAoUFZPSUQpIHBUaW1lcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IHRpbWVyIG9iamVjdHMKKworCUFyZ3VtZW50czoKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0VGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSkKK3sKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKKwkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKKwkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUFNldFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb2RUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCUJPT0xFQU4JQ2FuY2VsOworCisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKKwkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7CisJCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIocFRpbWVyLCAmQ2FuY2VsKTsKKwkJCVJUTVBTZXRUaW1lcihwVGltZXIsIFZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfT1NfTW9kX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYW5jZWwgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJMS4pIFRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKwkJMi4pIFJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYW5jZWxUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJaWYgKHBUaW1lci0+U3RhdGUgPT0gRkFMU0UpCisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19EZWxfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBDYW5jZWxsZWQpOworCisJCWlmICgqcENhbmNlbGxlZCA9PSBUUlVFKQorCQkJcFRpbWVyLT5TdGF0ZSA9IFRSVUU7CisKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgorCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KKwkJLy8KKwkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFN0YXR1cworCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVN0YXR1cwkJCQkJTEVEIFN0YXR1cworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpCit7CisJLy9VTE9ORwkJCWRhdGE7CisJVUNIQVIJCQlIaWdoQnl0ZSA9IDA7CisJVUNIQVIJCQlMb3dCeXRlOworCisvLyBJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgorLy8gU28gTEVEIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB3aGVuIEFURSBpcyBydW5uaW5nLgorI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKKwlzd2l0Y2ggKFN0YXR1cykKKwl7CisJCWNhc2UgTEVEX0xJTktfRE9XTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKwkJCWJyZWFrOworCQljYXNlIExFRF9MSU5LX1VQOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCQlIaWdoQnl0ZSA9IDB4YTA7CisJCQllbHNlCisJCQkJSGlnaEJ5dGUgPSAweDYwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUkFESU9fT046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9IQUxUOgorCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAorCQljYXNlIExFRF9SQURJT19PRkY6CisJCQlIaWdoQnl0ZSA9IDA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIExFRF9XUFM6CisJCQlIaWdoQnl0ZSA9IDB4MTA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJCUhpZ2hCeXRlID0gMHgwODsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1BPV0VSX1VQOgorCQkJSGlnaEJ5dGUgPSAweDA0OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisJfQorCisgICAgLy8KKwkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCisJLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkvLworCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQorCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU2lnbmFsIFN0cmVndGgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlEYm0JCQkJCQlTaWduYWwgU3RyZWd0aAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJQ2FuIGJlIHJ1biBvbiBhbnkgSVJRTCBsZXZlbC4KKworCQlBY2NvcmRpbmcgdG8gTWljcm9zb2Z0IFplcm8gQ29uZmlnIFdpcmVsZXNzIFNpZ25hbCBTdHJlZ3RoIGRlZmluaXRpb24gYXMgYmVsb3dzLgorCQk8PSAtOTAgIE5vIFNpZ25hbAorCQk8PSAtODEgIFZlcnkgTG93CisJCTw9IC03MSAgTG93CisJCTw9IC02NyAgR29vZAorCQk8PSAtNTcgIFZlcnkgR29vZAorCQkgPiAtNTcgIEV4Y2VsbGVudAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCit7CisJVUNIQVIJCW5MZWQgPSAwOworCisJLy8KKwkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KKwkvLworCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRGJtIDw9IC05MCkKKwkJbkxlZCA9IDA7CisJZWxzZSBpZiAoRGJtIDw9IC04MSkKKwkJbkxlZCA9IDE7CisJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJbkxlZCA9IDM7CisJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJbkxlZCA9IDc7CisJZWxzZSBpZiAoRGJtIDw9IC01NykKKwkJbkxlZCA9IDE1OworCWVsc2UKKwkJbkxlZCA9IDMxOworCisJLy8KKwkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KKwkvLworCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKKwl7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKwkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmFibGUgUlgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKKworCS8vIEVuYWJsZSBSeCBETUEuCisJUlQyOFhYRE1BRW5hYmxlKHBBZCk7CisKKwkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZWEzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jCkBAIC0wLDAgKzEsMTYwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCitVSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KK3sKKwkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisJMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAorCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKKwkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisJMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAorCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKKwkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisJMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAorCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKKwkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisJMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAorCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKKwkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisJMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAorCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKKwkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisJMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAorCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKKwkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisJMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAorCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKKwkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisJMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAorCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKKwkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisJMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAorCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKKwkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisJMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAorCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKKwkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisJMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCit9OworCitVSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KK3sKKwkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCisJMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAorCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKwkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCisJMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAorCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKwkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCisJMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAorCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKwkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCisJMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAorCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKwkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCisJMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAorCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKwkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCisJMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAorCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKwkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCisJMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAorCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKwkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCisJMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAorCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKwkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCisJMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAorCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKwkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCisJMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAorCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKwkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCisJMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VDSEFSIFNib3hUYWJsZVsyNTZdID0KK3sKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworLy8KKy8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgorLy8KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KK3sKKwl1bmlvbiBQQUNLRUQKKwl7CisJCXN0cnVjdCBQQUNLRUQKKwkJeworCQkJVUNIQVIJCXJjMDsKKwkJCVVDSEFSCQlyYzE7CisJCQlVQ0hBUgkJcmMyOworCisJCQl1bmlvbiBQQUNLRUQKKwkJCXsKKwkJCQlzdHJ1Y3QgUEFDS0VECisJCQkJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJUnN2ZDo1OworI2Vsc2UKKwkJCQkJVUNIQVIJUnN2ZDo1OworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglLZXlJRDoyOworI2VuZGlmCisJCQkJfQlmaWVsZDsKKwkJCQlVQ0hBUgkJQnl0ZTsKKwkJCX0JQ09OVFJPTDsKKwkJfQlmaWVsZDsKKworCQlVTE9ORwl3b3JkOworCX0JSVYxNjsKKworCVVMT05HCUlWMzI7Cit9CVRLSVBfSVYsICpQVEtJUF9JVjsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCisJSU4JUFVDSEFSCXBNSUNLZXkpCit7CisJVUxPTkcJcmVzID0gMDsKKwlJTlQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQorICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBQdXRVSW50MzIoCisJSU4gT1VUCVBVQ0hBUgkJcERzdCwKKwlJTgkJVUxPTkcJCXZhbCkKK3sKKwlJTlQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKKwkJdmFsID4+PSA4OworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVNldCB0aGUgTUlDIEtleS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwkvLyBTZXQgdGhlIGtleQorCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOworCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKKwkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKKwlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKKwlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKKwlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwlwVGtpcC0+TSA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglVQ0hBUiAJCQl1Q2hhcikKK3sKKwkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7CisJcFRraXAtPm5CeXRlc0luTSsrOworCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KKwlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKKwl7CisJCXBUa2lwLT5MIF49IHBUa2lwLT5NOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgorCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZCgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQluQnl0ZXMpCit7CisJLy8gVGhpcyBpcyBzaW1wbGUKKwl3aGlsZShuQnl0ZXMgPiAwKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEdldE1JQygKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKK3sKKwkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJfQorCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JUFVDSEFSCQkJcFRBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JUFVDSEFSCQkJcFRTQywKKwlPVVQJUFVMT05HCQkJcElWMTYsCisJT1VUCVBVTE9ORwkJCXBJVjMyKQoreworCVRLSVBfSVYJdGtpcEl2OworCisJLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQorCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisJTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0TUlDRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcExMQwkJTExDIGhlYWRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTExDLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gMDsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRW5jYXAsCisJSU4JUENJUEhFUl9LRVkJCXBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQVUNIQVIJCQlwU3JjOworICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7CisJVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFNyYyA9IHBTcmNCdWZWQTsKKworCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKKwlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKKwkJdmxhbl9vZmZzZXQgPSA0OworCisJeworCQlSVE1QSW5pdE1JQ0VuZ2luZSgKKwkJCXBBZCwKKwkJCXBLZXktPktleSwKKwkJCXBTcmMsCisJCQlwU3JjICsgNiwKKwkJCVVzZXJQcmlvcml0eSwKKwkJCXBLZXktPlR4TWljKTsKKwl9CisKKworCWlmIChwRW5jYXAgIT0gTlVMTCkKKwl7CisJCS8vIExMQyBlbmNhcHN1bGF0aW9uCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOworCQkvLyBQcm90b2NvbCBUeXBlCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8KKwl7CisJCWlmIChTcmNCdWZMZW4gPiAwKQorCQl7CisJCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKKwkJfQorCisJCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAorCisJfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCisKKwkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKK3sKKwlVSU5UIGluZGV4X2xvdzsKKwlVSU5UIGluZGV4X2hpZ2g7CisJVUlOVCBsZWZ0LCByaWdodDsKKworCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7CisJaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOworCisJbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKKwlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOworCisJcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCitVSU5UIHJvdHIxKFVJTlQgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCisJeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfQorCWVsc2UKKwl7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKworVk9JRCBSVE1QVGtpcE1peEtleSgKKwlVQ0hBUiAqa2V5LAorCVVDSEFSICp0YSwKKwlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVDSEFSICpyYzRrZXksCisJVUlOVCAqcDFrKQoreworCisJVUlOVCB0c2MwOworCVVJTlQgdHNjMTsKKwlVSU5UIHRzYzI7CisKKwlVSU5UIHBwazA7CisJVUlOVCBwcGsxOworCVVJTlQgcHBrMjsKKwlVSU5UIHBwazM7CisJVUlOVCBwcGs0OworCVVJTlQgcHBrNTsKKworCUlOVCBpOworCUlOVCBqOworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJLyogUGhhc2UgMSwgc3RlcCAxICovCisJcDFrWzBdID0gdHNjMTsKKwlwMWtbMV0gPSB0c2MwOworCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKKwlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7CisJcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOworCisJLyogUGhhc2UgMSwgc3RlcCAyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IDIqKGkgJiAxKTsKKwkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OworCX0KKworCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLworCXBwazAgPSBwMWtbMF07CisJcHBrMSA9IHAxa1sxXTsKKwlwcGsyID0gcDFrWzJdOworCXBwazMgPSBwMWtbM107CisJcHBrNCA9IHAxa1s0XTsKKwlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7CisKKwkvKiBQaGFzZTIsIFN0ZXAgMiAqLworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7CisKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisgICAgLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKKworCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7CisJcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OworCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OworCisJcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKKwlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OworCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OworCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OworCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJaW50IGhlYWRlcl9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOworCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOworCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOworCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOworCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQorCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCisJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KKworCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCisJeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOworCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdigKKwl1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJaW50IHFjX2V4aXN0cywKKwlpbnQgYTRfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKK3sKKwlpbnQgaTsKKworCW1pY19pdlswXSA9IDB4NTk7CisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKKwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQorCXsKKwkJaWYgKHJvdW5kID09IDApCisJCXsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJCWVsc2UgaWYgKHJvdW5kID09IDEwKQorCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfQorCQllbHNlICAgIC8qIDEgLSA5ICovCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKKwl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCisJaW50IGMpCit7CisKKwlpbnQgaSA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKKwljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKKworfQorCisKKy8vCisvLyBUUlVFOiBTdWNjZXNzIQorLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCisvLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisgICAgVUNIQVIJCQlmYzA7CisJVUNIQVIJCQlmYzE7CisJVVNIT1JUCQkJZmM7CisJVUlOVAkJCWZyYW1lX3R5cGU7CisJVUlOVAkJCWZyYW1lX3N1YnR5cGU7CisgICAgVUlOVAkJCWZyb21fZHM7CisgICAgVUlOVAkJCXRvX2RzOworCUlOVAkJCQlhNF9leGlzdHM7CisJSU5UCQkJCXFjX2V4aXN0czsKKwlVU0hPUlQJCQlkdXJhdGlvbjsKKwlVU0hPUlQJCQlzZXFfY29udHJvbDsKKwlVU0hPUlQJCQlxb3NfY29udHJvbDsKKwlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVJDNEtleVsxNl07CisJVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKKwlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKKwlVSU5UCQkJY3JjMzIgPSAwOworCVVJTlQJCQl0cmFpbGZjcyA9IDA7CisJVUNIQVIJCQlNSUNbOF07CisJVUNIQVIJCQlUcmFpbE1JQ1s4XTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlmYzAgPSAqcERhdGE7CisJZmMxID0gKihwRGF0YSArIDEpOworCisJZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisgICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisgICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKKworICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCisgICAgICAgICAgICAgICAgICk7CisKKwlIZWFkZXJMZW4gPSAyNDsKKwlpZiAoYTRfZXhpc3RzKQorCQlIZWFkZXJMZW4gKz0gNjsKKworCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKKworCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKKworCWlmIChxY19leGlzdHMpCisJeworCQlpZiAoYTRfZXhpc3RzKQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7CisJCX0KKwl9CisKKwlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECisJfQorCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgorCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKKwlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwlyZXR1cm4gVFJVRTsKK30KKworCisKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpCit7CisJVUNIQVIJCQlLZXlJRDsKKwlVSU5UCQkJSGVhZGVyTGVuOworCVVDSEFSCQkJUE5bNl07CisJVUlOVAkJCXBheWxvYWRfbGVuOworCVVJTlQJCQludW1fYmxvY2tzOworCVVJTlQJCQlwYXlsb2FkX3JlbWFpbmRlcjsKKwlVU0hPUlQJCQlmYzsKKwlVQ0hBUgkJCWZjMDsKKwlVQ0hBUgkJCWZjMTsKKwlVSU5UCQkJZnJhbWVfdHlwZTsKKwlVSU5UCQkJZnJhbWVfc3VidHlwZTsKKwlVSU5UCQkJZnJvbV9kczsKKwlVSU5UCQkJdG9fZHM7CisJSU5UCQkJCWE0X2V4aXN0czsKKwlJTlQJCQkJcWNfZXhpc3RzOworCVVDSEFSCQkJYWVzX291dFsxNl07CisJaW50IAkJCXBheWxvYWRfaW5kZXg7CisJVUlOVCAJCQlpOworCVVDSEFSIAkJCWN0cl9wcmVsb2FkWzE2XTsKKwlVQ0hBUiAJCQljaGFpbl9idWZmZXJbMTZdOworCVVDSEFSIAkJCXBhZGRlZF9idWZmZXJbMTZdOworCVVDSEFSIAkJCW1pY19pdlsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjFbMTZdOworCVVDSEFSIAkJCW1pY19oZWFkZXIyWzE2XTsKKwlVQ0hBUgkJCU1JQ1s4XTsKKwlVQ0hBUgkJCVRyYWlsTUlDWzhdOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKFBVU0hPUlQpcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKwlmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKwl0b19kcyA9IChmYzEgJiAweDEpOworCisJYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisJcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAorCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKwkJCQkgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7CisJS2V5SUQgPSBLZXlJRCA+PiA2OworCisJaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0QUVTIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUE5bMF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4pOworCVBOWzFdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgMSk7CisJUE5bMl0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA0KTsKKwlQTlszXSA9ICoocERhdGErIEhlYWRlckxlbiArIDUpOworCVBOWzRdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNik7CisJUE5bNV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA3KTsKKworCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gODsJLy8gOCBieXRlcyBmb3IgQ0NNUCBoZWFkZXIgLCA4IGJ5dGVzIGZvciBNSUMKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChwYXlsb2FkX2xlbikgJSAxNjsKKwludW1fYmxvY2tzID0gKHBheWxvYWRfbGVuKSAvIDE2OworCisKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW4gKyA4OyAvL0lWK0VJVgorCisJZm9yIChpPTA7IGk8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlQTiwKKwkJCQkJCQkJaSsxICk7CisKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIDE2KTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwl9CisKKwkvLworCS8vIElmIHRoZXJlIGlzIGEgc2hvcnQgZmluYWwgYmxvY2ssIHRoZW4gcGFkIGl0CisJLy8gZW5jcnlwdCBpdCBhbmQgY29weSB0aGUgdW5wYWRkZWQgcGFydCBiYWNrCisJLy8KKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQludW1fYmxvY2tzICsgMSk7CisKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlOZGlzTW92ZU1lbW9yeShwRGF0YSArIHBheWxvYWRfaW5kZXggLSA4LCBjaGFpbl9idWZmZXIsIHBheWxvYWRfcmVtYWluZGVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSBwYXlsb2FkX3JlbWFpbmRlcjsKKwl9CisKKwkvLworCS8vIERlc2NyeXB0IHRoZSBNSUMKKwkvLworCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKKwkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCXBEYXRhLAorCQkJCQkJCVBOLAorCQkJCQkJCTApOworCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIDgpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CisKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIGNoYWluX2J1ZmZlciwgOCk7CisKKwkvLworCS8vIENhbGN1bGF0ZSBNSUMKKwkvLworCisJLy9Gb3JjZSB0aGUgcHJvdGVjdGVkIGZyYW1lIGJpdCBvbgorCSoocERhdGEgKyAxKSA9ICoocERhdGEgKyAxKSB8IDB4NDA7CisKKwkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKKwkvLyBCZWNhdXNlIHRoZSBDQ01QIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbjsKKworCWNvbnN0cnVjdF9taWNfaXYoCisJCQkJCW1pY19pdiwKKwkJCQkJcWNfZXhpc3RzLAorCQkJCQlhNF9leGlzdHMsCisJCQkJCXBEYXRhLAorCQkJCQlwYXlsb2FkX2xlbiwKKwkJCQkJUE4pOworCisJY29uc3RydWN0X21pY19oZWFkZXIxKAorCQkJCQkJbWljX2hlYWRlcjEsCisJCQkJCQlIZWFkZXJMZW4sCisJCQkJCQlwRGF0YSk7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJCQkJCQltaWNfaGVhZGVyMiwKKwkJCQkJCXBEYXRhLAorCQkJCQkJYTRfZXhpc3RzLAorCQkJCQkJcWNfZXhpc3RzKTsKKworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCisJLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKwl7CisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKKwkJcGF5bG9hZF9pbmRleCArPSAxNjsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKworCS8vIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nCisJaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7CisKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKKwkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCX0KKwkvLyBhZXNfb3V0IGNvbnRhaW5zIHBhZGRlZCBtaWMsIGRpc2NhcmQgbW9zdCBzaWduaWZpY2FudAorCS8vIDggYnl0ZXMgdG8gZ2VuZXJhdGUgNjQgYml0IE1JQworCWZvciAoaSA9IDAgOyBpIDwgODsgaSsrKSBNSUNbaV0gPSBhZXNfb3V0W2ldOworCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRBRVMsIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhZXMxMjhrMTI4ZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBlcmZvcm1zIGEgMTI4IGJpdCBBRVMgZW5jcnlwdCB3aXRoICAqLworLyogMTI4IGJpdCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZPSUQgeG9yXzEyOCgKKwlJTiAgUFVDSEFSICBhLAorCUlOICBQVUNIQVIgIGIsCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7aTwxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCitWT0lEIG5leHRfa2V5KAorCUlOICBQVUNIQVIgIGtleSwKKwlJTiAgSU5UICAgICByb3VuZCkKK3sKKwlVQ0hBUiAgICAgICByY29uOworCVVDSEFSICAgICAgIHNib3hfa2V5WzRdOworCVVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KKwl7CisJCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKKwl9OworCisJc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7CisJc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7CisJc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7CisJc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7CisKKwlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07CisKKwl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOworCWtleVswXSA9IGtleVswXSBeIHJjb247CisKKwl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7CisJeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOworCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOworfQorCitWT0lEIHhvcl8zMigKKwlJTiAgUFVDSEFSICBhLAorCUlOICBQVUNIQVIgIGIsCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7aTw0OyBpKyspCisJeworCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKKwl9Cit9CisKK1ZPSUQgYnl0ZV9zdWIoCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCBpOworCisJZm9yIChpPTA7IGk8IDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOworCX0KK30KKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgIGEpCit7CisJcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOworfQorCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJb3V0WzBdID0gIGluWzBdOworCW91dFsxXSA9ICBpbls1XTsKKwlvdXRbMl0gPSAgaW5bMTBdOworCW91dFszXSA9ICBpblsxNV07CisJb3V0WzRdID0gIGluWzRdOworCW91dFs1XSA9ICBpbls5XTsKKwlvdXRbNl0gPSAgaW5bMTRdOworCW91dFs3XSA9ICBpblszXTsKKwlvdXRbOF0gPSAgaW5bOF07CisJb3V0WzldID0gIGluWzEzXTsKKwlvdXRbMTBdID0gaW5bMl07CisJb3V0WzExXSA9IGluWzddOworCW91dFsxMl0gPSBpblsxMl07CisJb3V0WzEzXSA9IGluWzFdOworCW91dFsxNF0gPSBpbls2XTsKKwlvdXRbMTVdID0gaW5bMTFdOworfQorCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCUlOVCAgICAgICAgIGk7CisJVUNIQVIgICAgICAgYWRkMWJbNF07CisJVUNIQVIgICAgICAgYWRkMWJmN1s0XTsKKwlVQ0hBUiAgICAgICByb3RsWzRdOworCVVDSEFSICAgICAgIHN3YXBfaGFsZnNbNF07CisJVUNIQVIgICAgICAgYW5kZjdbNF07CisJVUNIQVIgICAgICAgcm90cls0XTsKKwlVQ0hBUiAgICAgICB0ZW1wWzRdOworCVVDSEFSICAgICAgIHRlbXBiWzRdOworCisJZm9yIChpPTAgOyBpPDQ7IGkrKykKKwl7CisJCWlmICgoaW5baV0gJiAweDgwKT09IDB4ODApCisJCQlhZGQxYltpXSA9IDB4MWI7CisJCWVsc2UKKwkJCWFkZDFiW2ldID0gMHgwMDsKKwl9CisKKwlzd2FwX2hhbGZzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsZnMgKi8KKwlzd2FwX2hhbGZzWzFdID0gaW5bM107CisJc3dhcF9oYWxmc1syXSA9IGluWzBdOworCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKKworCXJvdGxbMF0gPSBpblszXTsgICAgICAgIC8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLworCXJvdGxbMV0gPSBpblswXTsKKwlyb3RsWzJdID0gaW5bMV07CisJcm90bFszXSA9IGluWzJdOworCisJYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7CisJYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7CisJYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7CisJYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7CisKKwlmb3IgKGkgPSAzOyBpPjA7IGktLSkgICAgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCisJeworCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7CisJCWlmICgoYW5kZjdbaS0xXSAmIDB4ODApID09IDB4ODApCisJCXsKKwkJCWFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7CisJCX0KKwl9CisJYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOworCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOworCisJeG9yXzMyKGFkZDFiLCBhbmRmNywgYWRkMWJmNyk7CisKKwl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOworCisJdGVtcFswXSA9IHJvdHJbMF07ICAgICAgICAgLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLworCXJvdHJbMF0gPSByb3RyWzFdOworCXJvdHJbMV0gPSByb3RyWzJdOworCXJvdHJbMl0gPSByb3RyWzNdOworCXJvdHJbM10gPSB0ZW1wWzBdOworCisJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOworCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLHRlbXBiKTsKKwl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTI2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3dlcC5jCkBAIC0wLDAgKzEsNDk5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfd2VwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIFd1CQkxMC0yOC0wMgkJSW5pdGlhbAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVSU5UIEZDU1RBQl8zMlsyNTZdID0KK3sKKwkweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLAorCTB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsCisJMHgwZWRiODgzMiwgMHg3OWRjYjhhNCwgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwKKwkweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLAorCTB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsCisJMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKKwkweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLAorCTB4MTQwMTVjNGYsIDB4NjMwNjZjZDksIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsCisJMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwgMHhhMjY3NzE3MiwKKwkweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLAorCTB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsCisJMHgzMmQ4NmNlMywgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwKKwkweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LAorCTB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsCisJMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKwkweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLAorCTB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsCisJMHg3MWIxODU4OSwgMHgwNmI2YjUxZiwgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywKKwkweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LAorCTB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsCisJMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwKKwkweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LAorCTB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsCisJMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKKwkweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLAorCTB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsCisJMHg0MzY5ZTk2YSwgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwKKwkweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LAorCTB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsCisJMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZiwKKwkweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LAorCTB4NTliMzNkMTcsIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsCisJMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKKwkweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLAorCTB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsCisJMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwKKwkweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLAorCTB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsCisJMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwgMHg2N2RkNGFjYywKKwkweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LAorCTB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsCisJMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKKwkweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLAorCTB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksCisJMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKKwkweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLAorCTB4YzViYTNiYmUsIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsCisJMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSwgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwKKwkweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLAorCTB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsCisJMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKKwkweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLAorCTB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsCisJMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwgMHgxOGI3NDc3NywKKwkweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLAorCTB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsCisJMHhhMDBhZTI3OCwgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwKKwkweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLAorCTB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsCisJMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKwkweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LAorCTB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsCisJMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCwgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwKKwkweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkCit9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBXRVAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlJZAkJICAgV0VQIEtleSBJRAorCQlLZXlMZW4gICAgICB0aGUgbGVuZ3RoIG9mIFdFUCBLRVkKKwkJcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hpY2ggRW5jcnlwdGlvbiBkYXRhIHdpbGwgc3RvcmUgaW4uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVQ0hBUgkJCUtleUlkLAorCUlOCVVDSEFSCQkJS2V5TGVuLAorCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQoreworCVVJTlQgaTsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBQUFBJTklURkNTMzI7ICAgLy9Jbml0IGNyYzMyLgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLmJDa2lwT24gJiYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgIHsKKyAgICAgICAgQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBLZXksIEtleUxlbik7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwS2V5LCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICB7CisJCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBLZXksIEtleUxlbik7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOyAgIC8vQ2FsbCBtbG1lIFJhbmRvbUJ5dGUoKSBmdW5jdGlvbi4KKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgS2V5TGVuICsgMyk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIFdFUEtFWSwgMyk7ICAvL0FwcGVuZCBJbml0IFZlY3RvcgorICAgIH0KKwkqKHBEZXN0KzMpID0gKEtleUlkIDw8IDYpOyAgICAgICAvL0FwcGVuZCBLRVlJRAorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlFbmNyeXB0IHRyYW5zaW1pdHRlZCBkYXRhCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHRyYW5zaW1pdHRlZCBzb3VyY2UgZGF0YSB0aGF0IHdpbGwgYmUgZW5jcnlwdAorICAgICAgcERlc3QgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gd2hlcmUgZW50cnlwdGlvbiBkYXRhIHdpbGwgYmUgc3RvcmUgaW4uCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorICAgICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QRW5jcnlwdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwRGVzdCwKKwlJTglVSU5UCQkJTGVuKQoreworCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIHBTcmMsIExlbik7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURlY3J5cHQgcmVjZWl2ZWQgV0VQIGRhdGEKKworCUFyZ3VtZW50czoKKwkJcEFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgZGF0YQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIERlY3J5cHQgV0VQIGRhdGEgc3VjY2VzcworCQlGQUxTRSAgICAgICBEZWNyeXB0IFdFUCBkYXRhIGZhaWxlZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFNvZnREZWNyeXB0V0VQKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBQVUNIQVIJCQlwRGF0YSwKKwlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpCit7CisJVUlOVAl0cmFpbGZjczsKKwlVSU5UICAgIGNyYzMyOworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUiAgIFdFUEtFWVtdID0geworCQkvL0lWCisJCTB4MDAsIDB4MTEsIDB4MjIsCisJCS8vV0VQIEtFWQorCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJfTsKKwlVQ0hBUiAJKnBQYXlsb2FkID0gKFVDSEFSICopcERhdGEgKyBMRU5HVEhfODAyXzExOworCVVMT05HCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7ICAgIC8vR2V0IFdFUCBJVgorCisJS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7CisJaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuKTsKKwlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKKwlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwgcGF5bG9hZF9sZW4gLSA0KTsKKwlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBQYXlsb2FkICsgcGF5bG9hZF9sZW4gLSA4LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOyAgLy9Ta2lwIGxhc3QgNCBieXRlcyhGQ1MpLgorCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKworICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEgV0VQIERhdGEgQ1JDIEVycm9yICFcbiIpKTsJIC8vQ1JDIGVycm9yLgorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtICJBUkNGT1VSIiBpbml0aWFsaXplCisKKwlBcmd1bWVudHM6CisJICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKKwkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQorCisJUmV0dXJuIFZhbHVlOgorCSAgIE5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9JTklUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglVSU5UCQkJS2V5TGVuKQoreworCVVDSEFSCXQsIHU7CisJVUlOVAlrZXlpbmRleDsKKwlVSU5UCXN0YXRlaW5kZXg7CisJUFVDSEFSCXN0YXRlOworCVVJTlQJY291bnRlcjsKKworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwlDdHgtPlggPSAwOworCUN0eC0+WSA9IDA7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQorCQlzdGF0ZVtjb3VudGVyXSA9IChVQ0hBUiljb3VudGVyOworCWtleWluZGV4ID0gMDsKKwlzdGF0ZWluZGV4ID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJeworCQl0ID0gc3RhdGVbY291bnRlcl07CisJCXN0YXRlaW5kZXggPSAoc3RhdGVpbmRleCArIHBLZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOworCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07CisJCXN0YXRlW3N0YXRlaW5kZXhdID0gdDsKKwkJc3RhdGVbY291bnRlcl0gPSB1OworCQlpZiAoKytrZXlpbmRleCA+PSBLZXlMZW4pCisJCQlrZXlpbmRleCA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IGJ5dGVzIGZyb20gQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKworCVJldHVybiBWYWx1ZToKKwkgICBVQ0hBUiAgLSB0aGUgdmFsdWUgb2YgdGhlIEFSQ0ZPVVIgQ09OVEVYVCAoUy1CT1gpCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIJQVJDRk9VUl9CWVRFKAorCUlOCVBBUkNGT1VSQ09OVEVYVAkJQ3R4KQoreworICBVSU5UIHg7CisgIFVJTlQgeTsKKyAgVUNIQVIgc3gsIHN5OworICBQVUNIQVIgc3RhdGU7CisKKyAgc3RhdGUgPSBDdHgtPlNUQVRFOworICB4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKyAgc3ggPSBzdGF0ZVt4XTsKKyAgeSA9IChzeCArIEN0eC0+WSkgJiAweGZmOworICBzeSA9IHN0YXRlW3ldOworICBDdHgtPlggPSB4OworICBDdHgtPlkgPSB5OworICBzdGF0ZVt5XSA9IHN4OworICBzdGF0ZVt4XSA9IHN5OworCisgIHJldHVybihzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVRoZSBTdHJlYW0gQ2lwaGVyIERlY3J5cHRpb24gQWxnb3JpdGhtCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfREVDUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCisJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCisKKwlBcmd1bWVudHM6CisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCisJCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkdGEKKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitWT0lECVdQQUFSQ0ZPVVJfRU5DUllQVCgKKwlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVSU5UIGk7CisgICAgICAgIC8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBBUkNGT1VSX0JZVEUoQ3R4KTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSBhIG5ldyBGQ1MgZ2l2ZW4gdGhlIGN1cnJlbnQgRkNTIGFuZCB0aGUgbmV3IGRhdGEuCisKKwlBcmd1bWVudHM6CisJCUZjcwkgICAgICB0aGUgb3JpZ2luYWwgRkNTIHZhbHVlCisJCUNwICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBjYWxjdWxhdGUgdGhlIEZDUworCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisJCVVJTlQgLSBGQ1MgMzIgYml0cworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUlOVAlSVE1QX0NBTENfRkNTMzIoCisJSU4JVUlOVAlGY3MsCisJSU4JUFVDSEFSCUNwLAorCUlOCUlOVAkJTGVuKQoreworCXdoaWxlIChMZW4tLSkKKwkgICBGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOworCisJcmV0dXJuIChGY3MpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgbGFzdCBGQ1MgYW5kIGVuY3J5cHQgaXQgdG8gdGhlIGRlc3RpbmF0aW9uCisKKwlBcmd1bWVudHM6CisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldElDVigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJcERlc3QpCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOworCisJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCAoUFVDSEFSKSAmcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgNCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTYzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCkBAIC0wLDAgKzEsMTg3NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWN0aW9uLmgiCisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7CisKKwlyZXR1cm47Cit9CisKK1ZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIE1lYXN1cmVSZXFEZWxldGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKKwkJCWJyZWFrOworCQllbHNlCisJCXsKKwkJCXBQcmV2RW50cnkgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCQl9CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUluc2VydCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCUlOVCBpOworCVVMT05HIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7CisJVUxPTkcgTm93OworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQl7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnktPmxhc3RUaW1lID0gTm93OworCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7CisJCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47CisJCQlwVGFiLT5TaXplKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnkgPSBOVUxMOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIFRwY1JlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm47CisJfQorCisJLy8gaWYgZW1wdHksIHJldHVybgorCWlmIChwVGFiLT5TaXplID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHBjUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgIT0gTlVMTCkKKwl7CisJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7CisJCXBUYWItPlNpemUtLTsKKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUaW1lUyB0YW1wLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UNjQgR2V0Q3VycmVudFRpbWVTdGFtcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBnZXQgY3VycmVudCB0aW1lIHN0YW1wLgorCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRyYW5zbWl0IFBvd2VyLgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBVSU5UOCBHZXRDdXJUeFB3cigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBXY2lkKQoreworCXJldHVybiAxNjsgLyogMTYgZEJtICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IERpYWxvZyBUb2tlbiBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBEaWFsb2cgdG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydERpYWxvZ1Rva2VuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKQoreworCVVMT05HIFRlbXBMZW47CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKKwkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXFJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IDA7CisJVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUVVFU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBUUEMgUmVwb3J0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIFRyYW5zbWl0IFBvd2VyLgorCQk0LiBMaW5rIE1hcmdpbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOworCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKKworCVRwY1JlcG9ydElFLlR4UHdyID0gVHhQd3I7CisJVHBjUmVwb3J0SUUuTGlua01hcmdpbiA9IExpbmtNYXJnaW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCSZUcGNSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTQuIG5ldyBzZWxlY3RlZCBjaGFubmVsLgorCQk1LiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgY291bnQuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaGFubmVsLAorCUlOIFVJTlQ4IENoU3dDbnQpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7CisKKwlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKKwlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXF1ZXN0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIE1lYXN1cmUgVG9rZW4uCisJCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgorCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KKwkJNi4gTWVhc3VyZSBDaGFubmVsLgorCQk3LiBNZWFzdXJlIFN0YXJ0IHRpbWUuCisJCTguIE1lYXN1cmUgRHVyYXRpb24uCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSUUpCit7CisJVUxPTkcgVGVtcExlbjsKKwlVSU5UOCBMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXFJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgTWVhc3VyZSBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBMZW5ndGggb2YgUmVwb3J0IEluZm9tYXRpb24KKwkJNy4gUG9pbnRlciBvZiBSZXBvcnQgSW5mb21hdGlvbiBCdWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXBvcnRJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydElFLAorCUlOIFVJTlQ4IFJlcG9ydExuZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKworCUxlbiA9IHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSArIFJlcG9ydExuZm9MZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVwb3J0SUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYgKyAqcEZyYW1lTGVuLAkJJlRlbXBMZW4sCisJCQkJCQkJUmVwb3J0TG5mb0xlbiwJCQkJcFJlcG9ydEluZm8sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCisJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKwl9CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJRTsKKwlVSU5UOCBSbVJlcURhaWxvZ1Rva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lID0gR2V0Q3VycmVudFRpbWVTdGFtcChwQWQpOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKKworCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKKwlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydFR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKwkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZUNoU3dBbm4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaCkKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLCBOZXdDaCwgMCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKwlCT09MRUFOIFJlc3VsdCA9IEZBTFNFOworCUlOVCBpOworCisJZG8KKwl7CisJCS8vIGNoZWNrIERGUyBwcm9jZWR1cmUgaXMgcnVubmluZy4KKwkJLy8gbWFrZSBzdXJlIERGUyBwcm9jZWR1cmUgd29uJ3Qgc3RhcnQgdHdpY2UuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJCXsKKwkJCVJlc3VsdCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4KKwkJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJCSYmKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkKKwkJCXsKKwkJCQkvLyBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOy8vMzAgbWluID0gMTgwMCBzZWMKKwkJCQlSZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitWT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBSQSwKKwlJTiBQVUNIQVIgcFRBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IENoYW5uZWwpCit7CisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoISgocFJBWzBdICYgMHhmZikgPT0gMHhmZikpIC8vIGlzIHBSQSBhIGJyb2FkY2FzZSBhZGRyZXNzLgorCXsKKwkJSU5UIGk7CisJCS8vIGluZm8gbmVpZ2hib3IgQVBzIHRoYXQgUmFkYXIgc2lnbmFsIGZvdW5kIHRocm9naCBXRFMgbGluay4KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9XRFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKFZhbGlkV2RzRW50cnkocEFkLCBpKSkKKwkJCXsKKwkJCQlQVUNIQVIgcERBID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbaV0uUGVlcldkc0FkZHI7CisKKwkJCQkvLyBEQSBlcXVhbCB0byBTQS4gaGF2ZSBubyBuZWNlc3Nhcnkgb3JpZ25hbCBBUCB3aGljaCBmb3VuZCBSYWRhciBzaWduYWwuCisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBUQSwgcERBKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBzZW5kIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBmcmFtZSB0byBpbmZvIE5laWdoYnJvIEFQcy4KKwkJCQlFbnF1ZXVlQ2hTd0FubihwQWQsIHBEQSwgQ2hTd01vZGUsIENoYW5uZWwpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCit9CisKK3N0YXRpYyBWT0lEIFN0YXJ0REZTUHJvY2VkdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUlOVDggQ2hTd01vZGUpCit7CisJLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU1dJVENISU5HX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgIHwgSUQgfCBMZW4gfENoIFN3IE1vZGUgfCBOZXcgQ2ggTnVtIHwgQ2ggU3cgQ250IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKKyovCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3sKKwlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisJUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXF1ZXN0IGluZm9tYXRpb24gYnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKKwlPVVQgUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gTWVhc3VyZW1lbnQgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgorCQk0LiBiYXNpYyByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgTWVhc3VyZW1lbnQgUmVwb3J0IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8IFRva2VuIHwgUmVwb3J0IE1vZGUgfCBNZWFzdXJlIFR5cGUgfCBNZWFzdXJlIFJlcG9ydCB8CisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICAgIDEgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgIHZhcmlhYmxlCisKKyAgQmFzaWMgUmVwb3J0LgorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgIHwgQ2ggTnVtIHwgU3RhcnQgVGltZSB8IER1cmF0aW9uIHwgTWFwIHwKKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKworICAgICAgMSAgICAgICAgICA4ICAgICAgICAgICAyICAgICAgICAxCisKKyAgTWFwIEZpZWxkIEJpdCBGb3JtYXQuCisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgIHwgQnNzIHwgT0ZETSBQcmVhbWJsZSB8IFVuaWRlbnRpZmllZCBzaWduYWwgfCBSYWRhciB8IFVubWVhc3VyZWQgfCBSZXNlcnZlZCB8CisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgIDAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUtNworKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydEluZm8sCisJT1VUIFBVSU5UOCBwUmVwb3J0QnVmKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisKKwkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBNZWFzdXJlUmVwb3J0SW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLCA4KTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVFVRVNUOgorCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCQk0LiBUUEMgUmVwb3J0IElFLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5UeFB3ciwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwlVTE9ORyBCc3NpZHggPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJkNoU3dBbm5JbmZvLCBzaXplb2YoQ0hfU1dfQU5OX0lORk8pKTsKKwlpZiAoISBQZWVyQ2hTd0FublNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmQ2hTd0FubkluZm8pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisKKwkJQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU5ld0NoYW5uZWwgPSBDaFN3QW5uSW5mby5DaGFubmVsOworCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm47Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJbmZvOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKworCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKKwl7CisJCVJlcG9ydE1vZGUud29yZCA9IDA7CisJCVJlcG9ydE1vZGUuZmllbGQuSW5jYXBhYmxlID0gMTsKKwkJRW5xdWV1ZU1lYXN1cmVtZW50UmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLCBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisKKy8vCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorLy8JCXJldHVybjsKKworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19GVU5DVElPTl9fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU5kaXNaZXJvTWVtb3J5KHBNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpOworCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVwb3J0SW5mbywgcE1lYXN1cmVSZXBvcnRJbmZvKSkKKwl7CisJCWRvIHsKKwkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJCQkvLyBOb3QgYSBhdXRvbm9tb3VzIG1lYXN1cmUgcmVwb3J0LgorCQkJLy8gY2hlY2sgdGhlIGRpYWxvZyB0b2tlbiBmaWVsZC4gZHJvcCBpdCBpZiB0aGUgZGlhbG9nIHRva2VuIGRvZXNuJ3QgbWF0Y2guCisJCQlpZiAoKERpYWxvZ1Rva2VuICE9IDApCisJCQkJJiYgKChwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSA9PSBOVUxMKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHBFbnRyeSAhPSBOVUxMKQorCQkJCU1lYXN1cmVSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKworCQkJaWYgKE1lYXN1cmVSZXBvcnRJbmZvLlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQl7CisJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBCYXNpY1JlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcE1lYXN1cmVSZXBvcnRJbmZvOworCQkJCWlmICgocEJhc2ljUmVwb3J0LT5NYXAuZmllbGQuUmFkYXIpCisJCQkJCSYmIChEZnNSZXF1aXJlbWVudENoZWNrKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSkgPT0gVFJVRSkpCisJCQkJeworCQkJCQlOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKHBBZCwgcEZyLT5IZHIuQWRkcjEsIHBGci0+SGRyLkFkZHIyLCAxLCBwQmFzaWNSZXBvcnQtPkNoTnVtKTsKKwkJCQkJU3RhcnRERlNQcm9jZWR1cmUocEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtLCAxKTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIE1lYXN1cmVtZW50IFJlcG9ydCBGcmFtZS5cbiIpKTsKKworCWtmcmVlKHBNZWFzdXJlUmVwb3J0SW5mbyk7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOworCVVJTlQ4IExpbmtNYXJnaW4gPSAwOworCUNIQVIgUmVhbFJzc2k7CisKKwkvLyBsaW5rIG1hcmdpbjogUmF0aW8gb2YgdGhlIHJlY2VpdmVkIHNpZ25hbCBwb3dlciB0byB0aGUgbWluaW11bSBkZXNpcmVkIGJ5IHRoZSBzdGF0aW9uIChTVEEpLiBUaGUKKwkvLwkJCQlTVEEgbWF5IGluY29ycG9yYXRlIHJhdGUgaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgY29uZGl0aW9ucywgaW5jbHVkaW5nIGludGVyZmVyZW5jZSwgaW50byBpdHMgY29tcHV0YXRpb24KKwkvLwkJCQlvZiBsaW5rIG1hcmdpbi4KKworCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksCisJCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCS8vIHNraXAgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCisJLy8gRGlhbG9nIHRva2VuLgorCU5kaXNNb3ZlTWVtb3J5KCZEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKworCUxpbmtNYXJnaW4gPSAoUmVhbFJzc2kgLyBNSU5fUkNWX1BXUik7CisJaWYgKFBlZXJUcGNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuKSkKKwkJRW5xdWV1ZVRQQ1JlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgVHhQd3IsIExpbmtNYXJnaW4pOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlclRwY1JlcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcEluZm87CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KCZUcGNSZXBJbmZvLCBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKSk7CisJaWYgKFBlZXJUcGNSZXBTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmVHBjUmVwSW5mbykpCisJeworCQlpZiAoKHBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgIT0gTlVMTCkKKwkJeworCQkJVHBjUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogRGlhbG9nVG9rZW49JXgsIFR4UHdyPSVkLCBMaW5rTWFyZ2luPSVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgU1BFQ19NUlE6CisJCQkvLyBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LgorCQkJLy8gcmVqZWN0IGFsbCBtZWFzdXJlbWVudCByZXF1ZXN0LgorCQkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19NUlA6CisJCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JROgorCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JQOgorCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7CisJCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOworCisJCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisJCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7CisKKwkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KKwkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQorCQkJCXsKKwkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCit9CisJCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZCA9IDE7CisJVUlOVCBBcmdJZHg7CisJUFVDSEFSIHRoaXNDaGFyOworCisJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKKwlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCisJQXJnSWR4ID0gMTsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCisJeworCQlzd2l0Y2goQXJnSWR4KQorCQl7CisJCQljYXNlIDE6CS8vIEFpZC4KKwkJCQlBaWQgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgorCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KKwkJCQlNZWFzdXJlQ2ggPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisJCX0KKwkJQXJnSWR4Kys7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7CisJaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlNZWFzdXJlUmVxTW9kZS53b3JkID0gMDsKKwlNZWFzdXJlUmVxTW9kZS5maWVsZC5FbmFibGUgPSAxOworCisJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CisKKwlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKKwkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZDsKKworCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCisJQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJCXJldHVybiBUUlVFOworCX0KKworCVRwY1JlcUluc2VydChwQWQsIFRwY1JlcVRva2VuKTsKKworCUVucXVldWVUUENSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwgVHBjUmVxVG9rZW4pOworCisJcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3ZDdiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjQ1IEBACisjIFN1cHBvcnQgQVRFIGZ1bmN0aW9uCitIQVNfQVRFPW4KKworIyBTdXBwb3J0IDI4eHggUUEgQVRFIGZ1bmN0aW9uCitIQVNfMjh4eF9RQT1uCisKKyMgU3VwcG9ydCBXcGFfU3VwcGxpY2FudAorSEFTX1dQQV9TVVBQTElDQU5UPW4KKworIyBTdXBwb3J0IE5hdGl2ZSBXcGFTdXBwbGljYW50IGZvciBOZXR3b3JrIE1hZ2FuZ2VyCitIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBOZXQgaW50ZXJmYWNlIGJsb2NrIHdoaWxlIFR4LVN3IHF1ZXVlIGZ1bGwKK0hBU19CTE9DS19ORVRfSUY9bgorCisjU3VwcG9ydCBERlMgZnVuY3Rpb24KK0hBU19ERlNfU1VQUE9SVD1uCisKKyNTdXBwb3J0IENhcnJpZXItU2Vuc2UgZnVuY3Rpb24KK0hBU19DU19TVVBQT1JUPW4KKworI2lmZGVmIE1VTFRJX0NBUkQKKyMgU3VwcG9ydCBmb3IgTXVsdGlwbGUgQ2FyZHMKK0hBU19NQ19TVVBQT1JUPW4KKyNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCisKKyNTdXBwb3J0IGZvciBJRUVFODAyLjExZSBETFMKK0hBU19RT1NfRExTX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBmb3IgRVhUX0NIQU5ORUwKK0hBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUPW4KKworI1N1cHBvcnQgZm9yIE5ldC1TTk1QCitIQVNfU05NUF9TVVBQT1JUPW4KKworI1N1cHBvcnQgZmVhdHVyZXMgb2YgU2luZ2xlIFNLVS4KK0hBU19TSU5HTEVfU0tVX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBmZWF0dXJlcyBvZiA4MDIuMTFuCitIQVNfRE9UMTFfTl9TVVBQT1JUPXkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0NDIDo9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK0xEIDo9ICQoQ1JPU1NfQ09NUElMRSlsZAorCitXRkxBR1MgOj0gLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVCAgLURMSU5VWCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjIGNvbmZpZyBmb3IgU1RBIG1vZGUKKworaWZlcSAoJChSVDI4eHhfTU9ERSksU1RBKQorV0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUIC1EREJHCisKK2lmZXEgKCQoSEFTX1dQQV9TVVBQTElDQU5UKSx5KQorV0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfQVRFKSx5KQorV0ZMQUdTICs9IC1EUkFMSU5LX0FURQoraWZlcSAoJChIQVNfMjh4eF9RQSkseSkKK1dGTEFHUyArPSAtRFJBTElOS18yOHh4X1FBCitlbmRpZgorZW5kaWYKKworaWZlcSAoJChIQVNfU05NUF9TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EU05NUF9TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19RT1NfRExTX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURRT1NfRExTX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0RPVDExX05fU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfQ1NfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX1NJTkdMRV9TS1VfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRFNJTkdMRV9TS1UKK2VuZGlmCisKK2VuZGlmCisjIGVuZGlmIG9mIGlmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgQ29tbW9uIGNvbXBpbGVyIGZsYWcKKyMKKworCitpZmVxICgkKEhBU19FWFRfQlVJTERfQ0hBTk5FTF9MSVNUKSx5KQorV0ZMQUdTICs9IC1ERVhUX0JVSUxEX0NIQU5ORUxfTElTVAorZW5kaWYKKworaWZlcSAoJChDSElQU0VUKSwyODYwKQorV0ZMQUdTICs9LURSVDI4NjAKK2VuZGlmCisKK2lmZXEgKCQoQ0hJUFNFVCksMjg3MCkKK1dGTEFHUyArPS1EUlQyODcwCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSw1VlQpCisjV0ZMQUdTICs9IC1EQ09ORklHXzVWVF9FTkhBTkNFCitlbmRpZgorCitpZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCitXRkxBR1MgKz0gLURCTE9DS19ORVRfSUYKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0RGU19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EREZTX1NVUFBPUlQKK2VuZGlmCisKKyNpZmRlZiBNVUxUSV9DQVJECitpZmVxICgkKEhBU19NQ19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1ETVVMVElQTEVfQ0FSRF9TVVBQT1JUCitlbmRpZgorI2VuZGlmIC8vIE1VTFRJX0NBUkQgLy8KKworaWZlcSAoJChIQVNfTExURCkseSkKK1dGTEFHUyArPSAtRExMVERfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSVhQKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxNjApCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX1RXSU5QQVNTKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9UV0lOUEFTUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKK1dGTEFHUyArPSAtRElORl9EQU5VQkUgLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxDQVZNX09DVEVPTikKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9BTUFaT05fU0UpCisjV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9BTUFaT05fU0UgLURCR19GVF9TVVBQT1JUCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX0FNQVpPTl9TRQorZW5kaWYKKworI2tlcm5lbCBidWlsZCBvcHRpb25zIGZvciAyLjQKKyMgbW92ZSB0byBNYWtlZmlsZSBvdXRzaWRlIExJTlVYX1NSQyA6PSAvb3B0L3N0YXIva2VybmVsL2xpbnV4LTIuNC4yNy1zdGFyCisKK2lmZXEgKCQoUExBVEZPUk0pLFNUQVIpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLVVhcm0gLWZuby1jb21tb24gLXBpcGUgLW1hcGNzLTMyIC1EX19MSU5VWF9BUk1fQVJDSF9fPTQgLW1hcmNoPWFybXY0ICAtbXNob3J0LWxvYWQtYnl0ZXMgLW1zb2Z0LWZsb2F0IC1VYXJtIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgJChMSU5VWF9TUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAkKFdGTEFHUykKKworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksU0lHTUEpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtREVNODZYWF9DSElQPUVNODZYWF9DSElQSURfVEFOR08yIC1ERU04NlhYX1JFVklTSU9OPTYgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjg2MF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtbWFiaT0zMiAtbWFyY2g9bWlwczMycjIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMnIyIC1XYSwtbWlwczMycjIgLVdhLC0tdHJhcCAtRE1PRFVMRSAkKFdGTEFHUykKKworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksU0lHTUFfODYyMikKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKENST1NTX0NPTVBJTEVfSU5DTFVERSkvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mbm8tY29tbW9uIC1waXBlIC1mbm8tYnVpbHRpbiAtRF9fbGludXhfXyAtRE5PX01NIC1tYXBjcy0zMiAtbWFyY2g9YXJtdjQgLW10dW5lPWFybTd0ZG1pIC1tc29mdC1mbG9hdCAtRE1PRFVMRSAtbXNob3J0LWxvYWQtYnl0ZXMgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLDVWVCkKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWxpdHRsZS1lbmRpYW4gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1PMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1hcGNzIC1tbm8tc2NoZWQtcHJvbG9nIC1tYWJpPWFwY3MtZ251IC1tbm8tdGh1bWItaW50ZXJ3b3JrIC1EX19MSU5VWF9BUk1fQVJDSF9fPTUgLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTkyNmVqLXMgLS1wYXJhbSBtYXgtaW5saW5lLWluc25zLXNpbmdsZT00MDAwMCAgLVVhcm0gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVduby1wb2ludGVyLXNpZ24gLURNT0RVTEUgJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTYwKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1hcmNoPWx4NDE4OSAtV2EsIC1ETU9EVUxFICQoV0ZMQUdTKQorZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbWlwczMycjIgLVdhLCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9UV0lOUEFTUykKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLURNT0RVTEUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLW1hcmNoPTRrYyAtbWlwczMyIC1XYSwtLXRyYXAgLXBpcGUgLW1sb25nLWNhbGxzICQoV0ZMQUdTKQorZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKK0NGTEFHUyA6PSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAkKFdGTEFHUykgLVd1bmRlZiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1tc29mdC1mbG9hdCAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKK0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCBpbmNsdWRlIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1JICQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtZmlubGluZS1saW1pdD0xMDAwMDAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTk2M3h4IC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljICAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1ETU9EVUxFIC1tbG9uZy1jYWxscworZXhwb3J0IENGTEFHUworZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksUEMpCisgICAgaWZuZXEgKCwkKGZpbmRzdHJpbmcgMi40LCQoTElOVVhfU1JDKSkpCisJIyBMaW51eCAyLjQKKwlDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1waXBlIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLW1hcmNoPWk2ODYgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAkKExJTlVYX1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICQoV0ZMQUdTKQorCWV4cG9ydCBDRkxBR1MKKyAgICBlbHNlCisJIyBMaW51eCAyLjYKKwlFWFRSQV9DRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlCisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElYUCkKKyAgICAgICAgRVhUUkFfQ0ZMQUdTIDo9IC12ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWJpZy1lbmRpYW4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLENBVk1fT0NURU9OKQorCUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgXAorCQkJCSAgICAtbWFiaT02NCAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmE2MzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGRmcy5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBTdXBwb3J0IERGUyBmdW5jdGlvbi4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCisqLworCisjZGVmaW5lIFJBREFSX1BVTFNFIDEKKyNkZWZpbmUgUkFEQVJfV0lEVEggMgorCisjZGVmaW5lIFdJRFRIX1JEX0lETEUgMAorI2RlZmluZSBXSURUSF9SRF9DSEVDSyAxCisKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBDVFNfUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpOworCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworQk9PTEVBTiBSYWRhckNoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUNoKTsKKworVUxPTkcgSmFwUmFkYXJUeXBlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUxPTkcgUlRNUEJicFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QUHJlcGFyZVJEQ1RTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVVMT05HCQkJRHVyYXRpb24sCisJSU4gIFVDSEFSICAgICAgICAgICBSVFNSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgQ1RTQmFzZUFkZHIsCisJSU4gIFVDSEFSCQkJRnJhbWVHYXApOworCitWT0lEIFJUTVBQcmVwYXJlUmFkYXJEZXRlY3RQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK0lOVCBTZXRfQ2hNb3ZpbmdUaW1lX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK0lOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9sZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxOGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWxlYXAuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYgX19MRUFQX0hfXworI2RlZmluZSBfX0xFQVBfSF9fCisKKy8vIE1lc3NhZ2VzIGZvciBBc3NvY2lhdGUgc3RhdGUgbWFjaGluZQorI2RlZmluZSBMRUFQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAgICAzMAorCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfSURFTlRJVFkgICAgICAgICAgIDMxCisjZGVmaW5lIExFQVBfTVNHX1JFUVVFU1RfTEVBUCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExFQVBfTVNHX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIExFQVBfTVNHX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIExFQVBfTVNHX1JFU1BPTlNFX0xFQVAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIExFQVBfTVNHX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIExFQVBfTVNHX1VOS05PV04gICAgICAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIExFQVBfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CisvLyEgYXNzb2Mgc3RhdGUtbWFjaGluZSBzdGF0ZXMKKyNkZWZpbmUgTEVBUF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRUFQX1dBSVRfSURFTlRJVFlfUkVRVUVTVCAgICAgICAgICAxCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFUVVFU1QgICAgICAgIDIKKyNkZWZpbmUgTEVBUF9XQUlUX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBMRUFQX1dBSVRfQ0hBTkxMRU5HRV9SRVNQT05TRSAgICAgICA0CisjZGVmaW5lIExFQVBfV0FJVF9FQVBPTEtFWSAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEggICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9GUk9NX0FQX0ZBSUxFRCAgICAgICAgMHgwMworI2RlZmluZSBMRUFQX1JFQVNPTl9DSEFMTEVOR0VfVE9fQVBfRkFJTEVEICAgICAgICAgIDB4MDQKKworI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0lTQ09fQXV0aE1vZGVMRUFQTm9uZSAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIExFQVBfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMDAKKyNkZWZpbmUgTEVBUF9DSEFMTEVOR0VfUkVTUE9OU0VfTEVOR1RIICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVFVRVNUX0xFTkdUSCAgICAgICAgICAgICAgIDgKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfSEVBREVSXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKK30gTEVBUF9FQVBPTF9IRUFERVIsICpQTEVBUF9FQVBPTF9IRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUE9MX1BBQ0tFVF8geworICAgIFVDSEFSICAgICAgIENvZGU7CisgICAgVUNIQVIgICAgICAgSWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07CisgICAgVUNIQVIgICAgICAgVHlwZTsKK30gTEVBUF9FQVBPTF9QQUNLRVQsICpQTEVBUF9FQVBPTF9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUF9DT05URU5UU18geworICAgIFVDSEFSICAgICAgIFZlcnNpb247CisgICAgVUNIQVIgICAgICAgUmVzZXJ2ZWQ7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoOworfSBMRUFQX0VBUF9DT05URU5UUywgKlBMRUFQX0VBUF9DT05URU5UUzsKKworLyoqKiBFQVBPTCBrZXkgKioqLwordHlwZWRlZiBzdHJ1Y3QgX0VBUE9MX0tFWV9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBDb3VudGVyWzhdOworICAgIFVDSEFSICAgICAgIElWWzE2XTsKKyAgICBVQ0hBUiAgICAgICBJbmRleDsKKyAgICBVQ0hBUiAgICAgICBTaWduYXR1cmVbMTZdOworfSBFQVBPTF9LRVlfSEVBREVSLCAqUEVBUE9MX0tFWV9IRUFERVI7CisKK0JPT0xFQU4gTGVhcE1zZ1R5cGVTdWJzdCgKKyAgICBJTiAgVUNIQVIgICBFQVBUeXBlLAorICAgIE9VVCBVTE9ORyAgICpNc2dUeXBlKTsKKworVk9JRCBMZWFwTWFjaGluZVBlcmZvcm1BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAgICAqUywKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTWFjSGVhZGVySW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIE9VVCBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIHdlcCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwQWRkcjMpOworCitWT0lEIExlYXBTdGFydEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwSWRlbnRpdHlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcFBlZXJDaGFsbGVuZ2VBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaFB3ZCgKKyAgICBJTiAgUFVDSEFSICBwd2QsCisgICAgSU4gIElOVCAgICAgcHdkbGVuLAorICAgIE9VVCBQVUNIQVIgIGhhc2gpOworCitWT0lEIFBlZXJDaGFsbGVuZ2VSZXNwb25zZSgKKyAgICBJTiAgUFVDSEFSICBzekNoYWxsZW5nZSwKKyAgICBJTiAgUFVDSEFSICBzbWJQYXNzd2QsCisgICAgT1VUIFBVQ0hBUiAgc3pSZXNwb25zZSk7CisKK1ZPSUQgUGFyaXR5S2V5KAorICAgIE9VVCBQVUNIQVIgIHN6T3V0LAorICAgIElOICBQVUNIQVIgIHN6SW4pOworCitWT0lEIERlc0tleSgKKyAgICBPVVQgVUxPTkcgICBrWzE2XVsyXSwKKyAgICBJTiAgUFVDSEFSICBrZXksCisgICAgSU4gIElOVCAgICAgZGVjcnlwdCk7CisKK1ZPSUQgRGVzKAorICAgIElOICBVTE9ORyAgIGtzWzE2XVsyXSwKKyAgICBPVVQgVUNIQVIgICBibG9ja1s4XSk7CisKK1ZPSUQgRGVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICBzekNsZWFyLAorICAgIElOICBQVUNIQVIgIHN6S2V5LAorICAgIE9VVCBQVUNIQVIgIHN6T3V0KTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhc2hwd2RIYXNoKAorICAgIElOICBQVUNIQVIgIGhhc2gsCisgICAgSU4gIFBVQ0hBUiAgaGFzaGhhc2gpOworCitWT0lEIFByb2Nlc3NTZXNzaW9uS2V5KAorICAgIE9VVCBQVUNIQVIgIFNlc3Npb25LZXksCisgICAgSU4gIFBVQ0hBUiAgaGFzaDIsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlVG9SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VGcm9tUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlUmVzcG9uc2VUb1JhZGl1cyk7CisKK1ZPSUQgTGVhcEVhcG9sS2V5QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIFJvZ3VlQXBUYWJsZUluaXQoCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2VhcmNoKAorICAgIElOIFJPR1VFQVBfVEFCTEUgICAgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBSb2d1ZUFwRW50cnlTZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfRU5UUlkgICAqcFJvZ3VlQXAsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1VMT05HIFJvZ3VlQXBUYWJsZVNldEVudHJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBST0dVRUFQX1RBQkxFICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICAgICBGYWlsZUNvZGUpOworCitWT0lEIFJvZ3VlQXBUYWJsZURlbGV0ZUVudHJ5KAorICAgIElOIE9VVCBST0dVRUFQX1RBQkxFICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBMZWFwQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMZWFwU2VuZFJvZ3VlQVBSZXBvcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIENDS01Bc3NvY1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBWT0lEICAgICAgICAgICAgICpNc2csCisgICAgSU4gVUxPTkcgICAgICAgICAgICBNc2dMZW4pOworCisjZW5kaWYgIC8vIF9fTEVBUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGlua19saXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTIxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTElOS19MSVNUX0hfXworI2RlZmluZSBfX0xJTktfTElTVF9IX18KKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKK3sKKwlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OworfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCit7CisJUExJU1RfRU5UUlkgcEhlYWQ7CisJUExJU1RfRU5UUlkgcFRhaWw7CisJVUNIQVIgc2l6ZTsKK30gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKKwlwTGlzdC0+c2l6ZSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0LAorCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKK3sKKwlwRW50cnktPnBOZXh0ID0gTlVMTDsKKwlpZiAocExpc3QtPnBUYWlsKQorCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OworCWVsc2UKKwkJcExpc3QtPnBIZWFkID0gcEVudHJ5OworCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKKwlwTGlzdC0+c2l6ZSsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlQTElTVF9FTlRSWSBwTmV4dDsKKwlQTElTVF9FTlRSWSBwRW50cnk7CisKKwlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQorCXsKKwkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OworCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKKwkJaWYgKHBOZXh0ID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCQlwTGlzdC0+c2l6ZS0tOworCX0KKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJcmV0dXJuIHBMaXN0LT5zaXplOworfQorCitzdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKKwlQTElTVF9FTlRSWSBwUHJ2RW50cnk7CisKKwlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQorCXsKKwkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOworCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKKworCQlwTGlzdC0+c2l6ZS0tOworCQlyZXR1cm4gcEN1ckVudHJ5OworCX0KKworCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQorCXsKKwkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCisJCXsKKwkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OworCisJCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQorCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKKworCQkJcExpc3QtPnNpemUtLTsKKwkJCWJyZWFrOworCQl9CisJCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKKwkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKKwl9CisKKwlyZXR1cm4gcEN1ckVudHJ5OworfQorCisjZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU1YjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTUQ0X0hfXworI2RlZmluZSBfX01ENF9IX18KKworLyogTUQ0IGNvbnRleHQuICovCit0eXBlZGVmCXN0cnVjdAlfTUQ0X0NUWF8JeworCVVMT05HCXN0YXRlWzRdOyAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCisJVUxPTkcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KKwlVQ0hBUglidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworfQlNRDRfQ1RYOworCitWT0lEIE1ENEluaXQgKE1ENF9DVFggKik7CitWT0lEIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCBQVUNIQVIsIFVJTlQpOworVk9JRCBNRDRGaW5hbCAoVUNIQVIgWzE2XSwgTUQ0X0NUWCAqKTsKKworI2VuZGlmIC8vX19NRDRfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1ZGIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWQ1LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAorCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQorKi8KKworI2lmbmRlZgl1aW50OAorI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgorI2VuZGlmCisKKyNpZm5kZWYJdWludDMyCisjZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlsb25nIGludAorI2VuZGlmCisKKworI2lmbmRlZglfX01ENV9IX18KKyNkZWZpbmUJX19NRDVfSF9fCisKKyNkZWZpbmUgTUQ1X01BQ19MRU4gMTYKKwordHlwZWRlZiBzdHJ1Y3QgX01ENV9DVFggeworICAgIFVJTlQzMiAgIEJ1Zls0XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmb3VyIHN0YXRlcworCVVDSEFSICAgSW5wdXRbNjRdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCisJVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCit9ICAgTUQ1X0NUWDsKKworVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpOworVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pOworCit2b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7CisKKy8vCisvLyBTSEEgY29udGV4dAorLy8KK3R5cGVkZWYJc3RydWN0IF9TSEFfQ1RYCit7CisJVUlOVDMyICAgQnVmWzVdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZpdmUgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs4MF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKKworfQlTSEFfQ1RYOworCitWT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCk7CitVQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7CitWT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pOworVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pOworCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOIDIwCisjZW5kaWYgLy8gX19NRDVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9BRVNfSAorI2RlZmluZQlfQUVTX0gKKwordHlwZWRlZglzdHJ1Y3QKK3sKKwl1aW50MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQJa2V5cyAqLworCXVpbnQzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZAlrZXlzICovCisJaW50CW5yOwkJCQkvKiBudW1iZXIgb2Ygcm91bmRzCSovCit9CithZXNfY29udGV4dDsKKworaW50CSBydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCAqa2V5LAlpbnQJbmJpdHMgKTsKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Cit2b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CisKKyNlbmRpZiAvKiBhZXMuaAkqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMCwwICsxLDE0NDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWxtZS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDAzLTA4LTI4CQlDcmVhdGVkCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKworKi8KKyNpZm5kZWYgX19NTE1FX0hfXworI2RlZmluZSBfX01MTUVfSF9fCisKKy8vIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLQorLy8gRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdAorI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCisKKyNkZWZpbmUgRU5EX09GX0FSR1MgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIExGU1JfTUFTSyAgICAgICAgICAgICAgICAgICAweDgwMDAwMDU3CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX0lOVFYgICAgICAgICAxMDAvKjIwMCovICAgICAgIC8vCisjZGVmaW5lIExFQURfVElNRSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICAgICAgIDEwICAvKjUqLyAgICAgICAvLyBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIE1MTUVfVEFTS19FWEVDX0lOVFYgPSAxIHNlYworI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UViAgICAgICAgIAkxMDAgICAgICAgLy8gMC4xIHNlYworCisvLyBUaGUgZGVmaW5pdGlvbiBvZiBSYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCisjZGVmaW5lIENFCQkwCisjZGVmaW5lIEZDQwkJMQorI2RlZmluZSBKQVAJCTIKKyNkZWZpbmUgSkFQX1c1MwkzCisjZGVmaW5lIEpBUF9XNTYJNAorI2RlZmluZSBNQVhfUkRfUkVHSU9OIDUKKworI2lmZGVmCU5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNDAwMCAgICAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYworI2Vsc2UKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYworI2VuZGlmCisKKyNkZWZpbmUgRExTX1RJTUVPVVQgICAgICAgICAgICAgICAgIDEyMDAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEFVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgSk9JTl9USU1FT1VUICAgICAgICAgICAgICAgIDIgKiBPU19IWiAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgU0hPUlRfQ0hBTk5FTF9USU1FICAgICAgICAgIDkwICAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIE1JTl9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxMTAgICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBkdWFsIGJhbmQgc2NhbgorI2RlZmluZSBNQVhfQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTQwICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBzaW5nbGUgYmFuZCBzY2FuCisjZGVmaW5lCUZBU1RfQUNUSVZFX1NDQU5fVElNRQkgICAgMzAgCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKKyNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKyNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwICAgICAgICAvLyBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMQorI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorZXh0ZXJuIFVJTlQzMiBDV19NQVhfSU5fQklUUzsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisvLyBOb3RlOiBSU1NJX1RPX0RCTV9PRkZTRVQgaGFzIGJlZW4gY2hhbmdlZCB0byB2YXJpYWJsZSBmb3IgbmV3IFJGICgyMDA0LTA3MjApLgorLy8gU0hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUKKy8vI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0KKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NSAgLy8gLTU1IGRiIGlzIGNvbnNpZGVyZWQgbWlkLWRpc3RhbmNlCisjZGVmaW5lIFJTU0lfRk9SX0xPV19UWF9QT1dFUiAgICAgICAtNDUgIC8vIC00NSBkYiBpcyBjb25zaWRlcmVkIHZlcnkgc2hvcnQgZGlzdGFuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxpZ2libGUgdG8gdXNlIGEgbG93ZXIgVFggcG93ZXIKKyNkZWZpbmUgUlNTSV9GT1JfTE9XRVNUX1RYX1BPV0VSICAgIC0zMAorLy8jZGVmaW5lIE1JRF9UWF9QT1dFUl9ERUxUQSAgICAgICAgICAwICAgLy8gMCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBtaWQtZGlzdGFuY2UgdG8gQVAKKyNkZWZpbmUgTE9XX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDYgICAgLy8gLTMgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gdmVyeSBzaG9ydCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIKKyNkZWZpbmUgTE9XRVNUX1RYX1BPV0VSX0RFTFRBICAgICAgIDE2ICAgLy8gLTggZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gc2hvcnRlc3QgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisKKyNkZWZpbmUgUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgICAgIDAKKyNkZWZpbmUgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRCAgIDEKKyNkZWZpbmUgUlNTSV9USFJFU0hPTERfRk9SX1JPQU1JTkcgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFJTU0lfREVMVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisKKy8vIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uCisjZGVmaW5lIENRSV9JU19HT09EKGNxaSkgICAgICAgICAgICAoKGNxaSkgPj0gNTApCisvLyNkZWZpbmUgQ1FJX0lTX0ZBSVIoY3FpKSAgICAgICAgICAoKChjcWkpID49IDIwKSAmJiAoKGNxaSkgPCA1MCkpCisjZGVmaW5lIENRSV9JU19QT09SKGNxaSkgICAgICAgICAgICAoY3FpIDwgNTApICAvLygoKGNxaSkgPj0gNSkgJiYgKChjcWkpIDwgMjApKQorI2RlZmluZSBDUUlfSVNfQkFEKGNxaSkgICAgICAgICAgICAgKGNxaSA8IDUpCisjZGVmaW5lIENRSV9JU19ERUFEKGNxaSkgICAgICAgICAgICAoY3FpID09IDApCisKKy8vIHdlaWdodGluZyBmYWN0b3IgdG8gY2FsY3VsYXRlIENoYW5uZWwgcXVhbGl0eSwgdG90YWwgc2hvdWxkIGJlIDEwMCUKKyNkZWZpbmUgUlNTSV9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgNTAKKyNkZWZpbmUgVFhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgUlhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMjAKKworI2RlZmluZSBCU1NfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MCAvLzEwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJCS8vIHNjYW4gd2l0aCBubyBwcm9iZSByZXF1ZXN0LCBvbmx5IHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZSBTQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxOQkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUJU0NBTl9DSVNDT19QQVNTSVZFCQkJCSAyMAkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuCisjZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkJLy8gU2luZ2xlIGNoYW5uZWwgYWN0aXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19OT0lTRQkJCQkgMjIJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3Igbm9pc2UgaGlzdG9ncmFtIGNvbGxlY3Rpb24KKyNkZWZpbmUJU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQJCQkgMjMJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24KKyNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIFNDQU5fMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgICAgIDI2CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIE1BQ19BRERSX0lTX0dST1VQKEFkZHIpICAgICAgICgoKEFkZHJbMF0pICYgMHgwMSkpCisjZGVmaW5lIE1BQ19BRERSX0hBU0goQWRkcikgICAgICAgICAgICAoQWRkclswXSBeIEFkZHJbMV0gXiBBZGRyWzJdIF4gQWRkclszXSBeIEFkZHJbNF0gXiBBZGRyWzVdKQorI2RlZmluZSBNQUNfQUREUl9IQVNIX0lOREVYKEFkZHIpICAgICAgKE1BQ19BRERSX0hBU0goQWRkcikgJSBIQVNIX1RBQkxFX1NJWkUpCisjZGVmaW5lIFRJRF9NQUNfSEFTSChBZGRyLFRJRCkgICAgICAgICAgICAoVElEXkFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgVElEX01BQ19IQVNIX0lOREVYKEFkZHIsVElEKSAgICAgIChUSURfTUFDX0hBU0goQWRkcixUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQorCisvLyBMRUQgQ29udHJvbAorLy8gYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlCisvLyBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmCisjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCisjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCisKKy8vIGJpdCBkZWZpbml0aW9uIG9mIHRoZSAyLWJ5dGUgcEJFQUNPTi0+Q2FwYWJpbGl0eSBmaWVsZAorI2RlZmluZSBDQVBfSVNfRVNTX09OKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMSkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0lCU1NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDIpICE9IDApCisjZGVmaW5lIENBUF9JU19DRl9QT0xMQUJMRV9PTih4KSAgICAgICAgICgoKHgpICYgMHgwMDA0KSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTF9SRVFfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwOCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BSSVZBQ1lfT04oeCkgICAgICAgICAgICAgKCgoeCkgJiAweDAwMTApICE9IDApCisjZGVmaW5lIENBUF9JU19TSE9SVF9QUkVBTUJMRV9PTih4KSAgICAgICgoKHgpICYgMHgwMDIwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfUEJDQ19PTih4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDA0MCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0FHSUxJVFlfT04oeCkgICAgICAgICAgICAgKCgoeCkgJiAweDAwODApICE9IDApCisjZGVmaW5lIENBUF9JU19TUEVDVFJVTV9NR01UKHgpICAgICAgICAgICgoKHgpICYgMHgwMTAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfUU9TKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDIwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1NIT1JUX1NMT1QoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDA0MDApICE9IDApCisjZGVmaW5lIENBUF9JU19BUFNEKHgpICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwODAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfSU1NRURfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MTAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0RTU1NfT0ZETSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDIwMDApICE9IDApCisjZGVmaW5lIENBUF9JU19ERUxBWV9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHg0MDAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorCisjZGVmaW5lIENBUF9HRU5FUkFURShlc3MsaWJzcyxwcml2LHNfcHJlLHNfc2xvdCxzcGVjdHJ1bSkgICgoKGVzcykgPyAweDAwMDEgOiAweDAwMDApIHwgKChpYnNzKSA/IDB4MDAwMiA6IDB4MDAwMCkgfCAoKHByaXYpID8gMHgwMDEwIDogMHgwMDAwKSB8ICgoc19wcmUpID8gMHgwMDIwIDogMHgwMDAwKSB8ICgoc19zbG90KSA/IDB4MDQwMCA6IDB4MDAwMCkgfCAoKHNwZWN0cnVtKSA/IDB4MDEwMCA6IDB4MDAwMCkpCisKKyNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKKworI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKKyNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEJBX05PVFVTRSAJMgorLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKyNkZWZpbmUgSU1NRURfQkEgCTEKKyNkZWZpbmUgREVMQVlfQkEJMAorCisvLyBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUKKyNkZWZpbmUgT1JJR0lOQVRPUgkxCisjZGVmaW5lIFJFQ0lQSUVOVAkwCisKKy8vIEFEREJBIFN0YXR1cyBDb2RlCisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfU1VDQ0VTUwkJCQkJMAorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1JFRlVTRUQJCQkJCTM3CisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfSU5WQUxJRF9QQVJBTUVURVJTCQkJMzgKKworLy8gREVMQkEgUmVhc29uIENvZGUKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNworI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKKworLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCitpZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKK3sgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4RmFpbENvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOyBcCit9CisKKy8vCisvLyA4MDIuMTEgZnJhbWUgZm9ybWF0cworLy8KKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOworCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCUFNc2R1U2l6ZToxOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCUFkdkNvZGluZzoxOworI2Vsc2UKKwlVU0hPUlQJQWR2Q29kaW5nOjE7CisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQorCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CisJVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKKwlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCVBTTVA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKyNlbmRpZgkvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKworLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJTUNTU2V0WzEwXTsKKwlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOworCVVDSEFSCU1wZHVEZW5zaXR5OjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglUeFJ4Tm90RXF1YWw6MTsKKwlVQ0hBUglUeE1DU1NldERlZmluZWQ6MTsKKyNlbHNlCisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCXJzdjozOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVQ0hBUglyc3YzWzNdOworfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjQ7CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJUGNvOjE7CisjZWxzZQorCVVTSE9SVAlQY286MTsKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlyc3YyOjQ7CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworfSBFWFRfSFRfQ0FQX0lORk8sICpQRVhUX0hUX0NBUF9JTkZPOworCisvLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVTE9ORwlyc3Y6MzsKKwlVTE9ORwlDaGFuRXN0aW1hdGlvbjoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlFeHBDb21CRjoyOworCVVMT05HCUV4cE5vQ29tQkY6MjsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBOb0NvbVN0ZWVyQ2FwYWJsZToxOworCVVMT05HCUV4cENTSUNhcGFibGU6MTsKKwlVTE9ORwlDYWxpYnJhdGlvbjoyOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJVHhORFBDYXBhYmxlOjE7CisJVUxPTkcJUnhORFBDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisjZWxzZQorCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlNaW5Hcm91cGluZzoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisKKy8vICBIVCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9BU19DQVB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJUnhBU2VsOjE7CisJVUNIQVIJQW50SW5kRmJrOjE7CisJVUNIQVIJRXhwQ1NJRmJrOjE7CisJVUNIQVIJQW50SW5kRmJrVHhBU0VMOjE7CisJVUNIQVIJRXhwQ1NJRmJrVHhBU0VMOjE7CisJVUNIQVIJQW50U2VsZWN0OjE7CisjZWxzZQorCVVDSEFSCUFudFNlbGVjdDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJcnN2OjE7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworCisvLyBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLgorI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7CisJSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKKwlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOworLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7CisJVUNIQVIJCQlNQ1NTZXRbMTZdOworCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87CisJSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCisJSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KK30gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworCisKKy8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorLy8gNy4zLjIuNjAKKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCisJCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgorI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKKwkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7CisJVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOworCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOworCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAorCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKKwlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAorfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKKworCisvLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAordHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Cisgc3RydWN0IFBBQ0tFRCB7CisgI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6NTsKKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CisJVUNIQVIJSW50b2xlcmFudDQwOjE7CisJVUNIQVIJSW5mb1JlcToxOworICNlbHNlCisJVUNIQVIJSW5mb1JlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KKwlVQ0hBUglyc3Y6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisgICAgfSBmaWVsZDsKKyBVQ0hBUiAgIHdvcmQ7Cit9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKKworCit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBeworCUJPT0xFQU4JCQliVmFsaWQ7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKKwlVU0hPUlQJQ2hhbm5lbDsKKwlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KK30gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7CisKKy8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKKy8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKyNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Cit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCeworCVVDSEFSCUV2ZW50QU5vOworCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KK30gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CisKKy8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KKy8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2Mjo1OworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKyNlbHNlCisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOworCVVDSEFSCXJzdjI6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9RVhUX0NBUF9JTkZPX0VMRU1FTlQsICpQRVhUX0NBUF9JTkZPX0VMRU1FTlQ7CisKKworLy8gODAyLjExbiA3LjMuMi42MQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlR7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfQ09FWElTVCA9IDcyCisJVUNIQVIJCQkJCUxlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0SWU7Cit9QlNTXzIwNDBfQ09FWElTVF9FTEVNRU5ULCAqUEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVDsKKworCisvLzgwMi4xMW4gNy4zLjIuNTkKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCisJVUNIQVIJCQkJTGVuOworCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUgkJCQlDaExpc3RbMF07Cit9QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFeworCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCisJVUNIQVIJCQlOZXdDaGFubmVsOwkvLworCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCit9IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKworCisvLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ19DSEFfT0ZGU0VUX0lFeworCVVDSEFSCQkJU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJIC8vIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkKK30gU0VDX0NIQV9PRkZTRVRfSUUsICpQU0VDX0NIQV9PRkZTRVRfSUU7CisKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQorCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAorfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKworLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCisvL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3Y6NTsKKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCisJVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworI2Vsc2UKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQorCVVTSE9SVAlyc3Y6NTsKKyNlbmRpZgorCisJLy9TdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUmVjb21XaWR0aDoxOworCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZyAJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuCisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKyNlbHNlCisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjExOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2MzoxOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisjZWxzZQorCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKKworCS8vIE5ldyBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgSUUKKwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OworCS8vIEV4dGVuc2lvbiBDYXBhYmlsaXR5IElFID0gMTI3CisJVUNIQVIJQlNTQ29leGlzdDIwNDA7Cit9IFJUX0hUX0NBUEFCSUxJVFksICpQUlRfSFRfQ0FQQUJJTElUWTsKKworLy8gICBmaWVsZCBpbiBBZGR0aW9uYWwgSFQgSW5mb3JtYXRpb24gSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJU2VySW50ZXJHcmFudTozOworCVVDSEFSCVNfUFNNUFN1cDoxOworCVVDSEFSCVJpZnNNb2RlOjE7CisJVUNIQVIJUmVjb21XaWR0aDoxOworCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKyNlbHNlCisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVNfUFNNUFN1cDoxOwkgLy9JbmRpY2F0ZSBzdXBwb3J0IGZvciBzY2hlZHVsZWQgUFNNUAorCVVDSEFSCVNlckludGVyR3JhbnU6MzsJIC8vc2VydmljZSBpbnRlcnZhbCBncmFudWxhcml0eQorI2VuZGlmCit9IEFERF9IVElORk8sICpQQUREX0hUSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjoxOworCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisjZWxzZQorCVVTSE9SVAlPcGVyYWlvbk1vZGU6MjsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCXJzdjoxOworCVVTSE9SVAlPQlNTX05vbkhURXhpc3Q6MTsKKwlVU0hPUlQJcnN2MjoxMTsKKyNlbmRpZgorfSBBRERfSFRJTkZPMiwgKlBBRERfSFRJTkZPMjsKKworCisvLyBUT0RPOiBOZWVkIHN5bmMgd2l0aCBzcGVjIGFib3V0IHRoZSBkZWZpbml0aW9uIG9mIFN0YmNNY3MuIEluIERyYWZ0IDMuMDMsIGl0J3MgcmVzZXJ2ZWQuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3Y6NDsKKwlVU0hPUlQJUGNvUGhhc2U6MTsKKwlVU0hPUlQJUGNvQWN0aXZlOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7CisJVVNIT1JUCUR1YWxCZWFjb246MTsKKwlVU0hPUlQJU3RiY01jczo2OworI2Vsc2UKKwlVU0hPUlQJU3RiY01jczo2OworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCUR1YWxDVFNQcm90ZWN0OjE7CisJVVNIT1JUCVNUQkNCZWFjb246MTsKKwlVU0hPUlQJTHNpZ1R4b3BQcm90OjE7CS8vIEwtU0lHIFRYT1AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQKKwlVU0hPUlQJUGNvQWN0aXZlOjE7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCXJzdjo0OworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KK30gQUREX0hUSU5GTzMsICpQQUREX0hUSU5GTzM7CisKKyNkZWZpbmUgU0laRV9BRERfSFRfSU5GT19JRQkJMjIKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUR7CisJVUNIQVIJCQkJQ29udHJvbENoYW47CisJQUREX0hUSU5GTwkJCUFkZEh0SW5mbzsKKwlBRERfSFRJTkZPMgkJCUFkZEh0SW5mbzI7CisJQUREX0hUSU5GTzMJCQlBZGRIdEluZm8zOworCVVDSEFSCQkJCU1DU1NldFsxNl07CQkvLyBCYXNpYyBNQ1Mgc2V0Cit9IEFERF9IVF9JTkZPX0lFLCAqUEFERF9IVF9JTkZPX0lFOworCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCU5ld0V4dENoYW5PZmZzZXQ7Cit9IE5FV19FWFRfQ0hBTl9JRSwgKlBORVdfRVhUX0NIQU5fSUU7CisKKworLy8gNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQorI2Vsc2UKKyAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQorICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAorICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjaworICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KKyAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCisgICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KKyAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKKyAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQorICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ09OVFJPTCwgKlBIVF9DT05UUk9MOworCisvLyAyLWJ5dGUgUU9TIENPTlRST0wgZmllbGQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7CisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQorICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgRU9TUDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFFPU19DT05UUk9MLCAqUFFPU19DT05UUk9MOworCisvLyAyLWJ5dGUgRnJhbWUgY29udHJvbCBmaWVsZAordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAorCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCisJVVNIT1JUCQlNb3JlRGF0YToxOwkJCS8vIE1vcmUgZGF0YSBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0CisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKyNlbHNlCisJVVNIT1JUCQlWZXI6MjsJCQkJLy8gUHJvdG9jb2wgdmVyc2lvbgorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVN1YlR5cGU6NDsJCQkvLyBNU0RVIHN1YnR5cGUKKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCU1vcmVGcmFnOjE7CQkJLy8gTW9yZSBmcmFnbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJUHdyTWdtdDoxOwkJCS8vIFBvd2VyIG1hbmFnZW1lbnQgYml0CisJVVNIT1JUCQlNb3JlRGF0YToxOwkJCS8vIE1vcmUgZGF0YSBiaXQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBGUkFNRV9DT05UUk9MLCAqUEZSQU1FX0NPTlRST0w7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8xMQl7CisgICAgRlJBTUVfQ09OVFJPTCAgIEZDOworICAgIFVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCUFkZHIzW01BQ19BRERSX0xFTl07CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworCVVTSE9SVAkJCUZyYWc6NDsKKyNlbHNlCisJVVNIT1JUCQkJRnJhZzo0OworCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCisJVUNIQVIJCQlPY3RldFswXTsKK30JSEVBREVSXzgwMl8xMSwgKlBIRUFERVJfODAyXzExOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7CisgICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKKyAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOworfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7CisKKy8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgeworICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7CisgICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBNQV9CT0RZLCAqUE1BX0JPRFk7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKKyAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOworfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOworLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAorLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluIAlERUxCQSBmcmFtZXMgdG8gdGVybWluYXRlIGFuIGFscmVhZHkgc2V0IHVwIGJBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUR7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50CisgICAgVVNIT1JUICAgICAgUnN2OjExOwkvLyBhbHdheXMgc2V0IHRvIDAKKyNlbHNlCisgICAgVVNIT1JUICAgICAgUnN2OjExOwkvLyBhbHdheXMgc2V0IHRvIDAKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IERFTEJBX1BBUk0sICpQREVMQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFBhcmFtZXRlciBTZXQgZmllbGQgIGluIEFEREJBIGZyYW1lcyB0byBzaWduYWwgcGFybSBmb3Igc2V0dGluZyB1cCBhIEJBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKKyAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFfUEFSTSwgKlBCQV9QQVJNOworCisvLyAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQKK3R5cGVkZWYgdW5pb24gUEFDS0VEIHsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAorCVVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEZyYWdOdW06NDsJLy8gYWx3YXlzIHNldCB0byAwCisJVVNIT1JUICAgICAgU3RhcnRTZXE6MTI7ICAgLy8gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSAxc3QgTVNEVSBmb3Igd2hpY2ggdGhpcyBCQVIgaXMgc2VudAorI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KKyAgICB9ICAgZmllbGQ7CisgICAgVVNIT1JUICAgICAgICAgICB3b3JkOworfSBCQVNFUV9DT05UUk9MLCAqUEJBU0VRX0NPTlRST0w7CisKKy8vQkFDb250cm9sIGFuZCBCQVJDb250cm9sIGFyZSB0aGUgc2FtZQorLy8gMi1ieXRlIEJBIENPTlRST0wgZmllbGQgaW4gQkEgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyBvbmx5IHJlbGF0ZWQgdG8gTi1EZWxheWVkIEJBLiBCdXQgbm90IHN1cHBvcnQgaW4gUlQyODYwYi4gMDpOb3JtYWxBQ0sgIDE6Tm8gQUNLCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyBvbmx5IHJlbGF0ZWQgdG8gTi1EZWxheWVkIEJBLiBCdXQgbm90IHN1cHBvcnQgaW4gUlQyODYwYi4gMDpOb3JtYWxBQ0sgIDE6Tm8gQUNLCisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgUnN2Ojk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFfQ09OVFJPTCwgKlBCQV9DT05UUk9MOworCisvLyAyLWJ5dGUgQkFSIENPTlRST0wgZmllbGQgaW4gQkFSIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gMDpub3JtYWwgYWNrLCAgMTpubyBhY2suCisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBCQVJfQ09OVFJPTCwgKlBCQVJfQ09OVFJPTDsKKworLy8gQkFSQ29udHJvbCBpbiBNVEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgTnVtVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IE1UQkFSX0NPTlRST0wsICpQTVRCQVJfQ09OVFJPTDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MToxMjsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgUnN2MToxMjsKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBQRVJfVElEX0lORk8sICpQUEVSX1RJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisJUEVSX1RJRF9JTkZPICAgICAgUGVyVElEOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSBFQUNIX1RJRCwgKlBFQUNIX1RJRDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1BTUE9MTF9GUkFNRSB7CisgICAgRlJBTUVfQ09OVFJPTCAgIEZDOworICAgIFVTSE9SVCAgICAgICAgICBBaWQ7CisgICAgVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIFRhW01BQ19BRERSX0xFTl07Cit9ICAgUFNQT0xMX0ZSQU1FLCAqUFBTUE9MTF9GUkFNRTsKKwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SVFNfRlJBTUUJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Cit9UlRTX0ZSQU1FLCAqUFJUU19GUkFNRTsKKworLy8gQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wgIEJBUkNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Cit9ICAgRlJBTUVfQkFfUkVRLCAqUEZSQU1FX0JBX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBX1JFUSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlNVEJBUl9DT05UUk9MICBNVEJBUkNvbnRyb2w7CisJUEVSX1RJRF9JTkZPCVBlclRJREluZm87CisJQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Cit9ICAgRlJBTUVfTVRCQV9SRVEsICpQRlJBTUVfTVRCQV9SRVE7CisKKy8vIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFfQ09OVFJPTCAgQkFDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworCVVDSEFSCQlCaXRNYXBbOF07Cit9ICAgRlJBTUVfTVRCQSwgKlBGUkFNRV9NVEJBOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1BTTVBfQUNUSU9OIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglQc21wOwkvLyA3LjMuMS4yNQorfSAgIEZSQU1FX1BTTVBfQUNUSU9OLCAqUEZSQU1FX1BTTVBfQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKKworLy9BY3Rpb24gRnJhbWUKKy8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgeworCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKKwlVQ0hBUgkJCQkJTGVuOworCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOworfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOworCisKKy8vODAyLjExbiA6IDcuMy4yLjIwYQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNPTkRfQ0hBTl9PRkZTRVQgeworCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyCisJVUNIQVIJCQkJTGVuOworCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY0NoT2Zmc2V0SWU7Cit9ICAgU0VDT05EX0NIQU5fT0ZGU0VULCAqUFNFQ09ORF9DSEFOX09GRlNFVDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7CisJU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOworfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CS8vIDEKKwlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKKwlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAorfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlVQ0hBUglUb2tlbjsKKwlVU0hPUlQJU3RhdHVzQ29kZTsKKwlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKK30gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJREVMQkFfUEFSTQkJRGVsYmFQYXJtOworCVVTSE9SVAlSZWFzb25Db2RlOworfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7CisKKworLy83LjIuMS43Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7CisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7CisJRlJBTUVfQ09OVFJPTCAgIEZDOworCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOworCVVDSEFSCQliaXRtYXNrWzhdOworfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOworCisKKy8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVJlcGV0aXRpb247CisJVUNIQVIgICBkYXRhWzBdOworfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKwlVQ0hBUgkJSUQ7CisJVUNIQVIJCUxlbmd0aDsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7CisJVUNIQVIJCU5ld1JlZ0NsYXNzOworCVVDSEFSCQlOZXdDaGFubmVsTnVtOworCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Cit9IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKKworCisvLworLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCisvLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKKy8vCisjZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKKyNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCisjZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKKyNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAorCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQorCisvLworLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQorLy8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7CisgICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKK30gQ0ZfUEFSTSwgKlBDRl9QQVJNOworCit0eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKKwlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KKwlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKK30JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKKworLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKKyAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYlFBY2s7CisgICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKKyAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7CisgICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KKyAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKKyAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKKyAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKKyAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKK30gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKKworLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgVVNIT1JUICAgICAgU3RhTnVtOworICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKKyAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cworfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKKworLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFTVEEncyBhc3NvYyByZXEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCQlSc3YyOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjE6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKKwlVQ0hBUgkJVUFQU0RfQUNfVk86MTsKKyNlbHNlCisgICAgVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVJzdjE6MTsKKwlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKKwlVQ0hBUgkJUnN2MjoxOworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCQlVQVBTRDoxOworCVVDSEFSCQlSc3Y6MzsKKyAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OworI2Vsc2UKKyAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OworCVVDSEFSCQlSc3Y6MzsKKwlVQ0hBUgkJVUFQU0Q6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKKworLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCisvLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYlFBY2s7CisgICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKKyAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7CisvLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOworICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKK30gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgSUVMZW47CisgICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOworfSBXUEFfSUVfOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICBDaGFubmVsOworCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KKyAgICBVQ0hBUiAgIEJzc1R5cGU7CisgICAgVVNIT1JUICBBdGltV2luOworICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOworCisgICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKyAgICBVQ0hBUiAgIFN1cFJhdGVMZW47CisgICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKyAgICBVQ0hBUiAgIEV4dFJhdGVMZW47CisJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7CisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7CisJQ0hBUiAgICBSc3NpOworICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCisJVUNIQVIJSGlkZGVuOworCisgICAgVVNIT1JUICBEdGltUGVyaW9kOworICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBVU0hPUlQgIENmcENvdW50OworICAgIFVTSE9SVCAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgQ2ZwTWF4RHVyYXRpb247CisgICAgVVNIT1JUICBDZnBEdXJSZW1haW5pbmc7CisgICAgVUNIQVIgICBTc2lkTGVuOworICAgIENIQVIgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCisgICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAorCisJQk9PTEVBTgliU0VTOworCisJLy8gTmV3IGZvciBXUEEyCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKKwlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydAorCU5ESVNfODAyXzExX0ZJWEVEX0lFcwlGaXhJRXM7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZUF1eDsJLy8gQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1czsJCQkJLy8gVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFCisJVVNIT1JUCQkJCQlWYXJJRUxlbjsJCQkJLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIJCQkJCVZhcklFc1tNQVhfVklFX0xFTl07CisKKwkvLyBDQ1ggQ2tpcCBpbmZvcm1hdGlvbgorICAgIFVDSEFSICAgQ2tpcEZsYWc7CisKKwkvLyBDQ1ggMiBUU0YKKwlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgorCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCisKKyAgICAvLyA4MDIuMTFlIGQ5LCBhbmQgV01NCisJRURDQV9QQVJNICAgICAgICAgICBFZGNhUGFybTsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJUUJTU19MT0FEX1BBUk0gICAgICBRYnNzTG9hZDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBXUEFfSUVfICAgICBXcGFJRTsKKyAgICBXUEFfSUVfICAgICBSc25JRTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJVUNIQVIJCUNvdW50cnlTdHJpbmdbM107CisJQk9PTEVBTgkJYkhhc0NvdW50cnlJRTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IEJTU19FTlRSWSwgKlBCU1NfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ0hBUiAgICAgICAgICAgQnNzTnI7CisgICAgVUNIQVIgICAgICAgICAgIEJzc092ZXJsYXBOcjsKKyAgICBCU1NfRU5UUlkgICAgICAgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfSBCU1NfVEFCTEUsICpQQlNTX1RBQkxFOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFX0VMRU0geworICAgIFVMT05HICAgICAgICAgICAgIE1hY2hpbmU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnVHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICBNc2dMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgTXNnW01HTVRfRE1BX0JVRkZFUl9TSVpFXTsKKyAgICBMQVJHRV9JTlRFR0VSICAgICBUaW1lU3RhbXA7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTA7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTE7CisgICAgVUNIQVIgICAgICAgICAgICAgUnNzaTI7CisgICAgVUNIQVIgICAgICAgICAgICAgU2lnbmFsOworICAgIFVDSEFSICAgICAgICAgICAgIENoYW5uZWw7CisgICAgVUNIQVIgICAgICAgICAgICAgV2NpZDsKKyAgICBCT09MRUFOICAgICAgICAgICBPY2N1cGllZDsKK30gTUxNRV9RVUVVRV9FTEVNLCAqUE1MTUVfUVVFVUVfRUxFTTsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUUgeworICAgIFVMT05HICAgICAgICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICAgICAgICBIZWFkOworICAgIFVMT05HICAgICAgICAgICAgIFRhaWw7CisgICAgTkRJU19TUElOX0xPQ0sgICBMb2NrOworICAgIE1MTUVfUVVFVUVfRUxFTSAgRW50cnlbTUFYX0xFTl9PRl9NTE1FX1FVRVVFXTsKK30gTUxNRV9RVUVVRSwgKlBNTE1FX1FVRVVFOworCit0eXBlZGVmIFZPSUQgKCpTVEFURV9NQUNISU5FX0ZVTkMpKFZPSUQgKkFkYXB0b3IsIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK3R5cGVkZWYgc3RydWN0IF9TVEFURV9NQUNISU5FIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOclN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJNc2c7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyU3RhdGU7CisgICAgU1RBVEVfTUFDSElORV9GVU5DICAgICAgICAgICAgICpUcmFuc0Z1bmM7Cit9IFNUQVRFX01BQ0hJTkUsICpQU1RBVEVfTUFDSElORTsKKworCisvLyBNTE1FIEFVWCBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGQgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LgorLy8gT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4KKy8vIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mCisvLyBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseQorLy8gc2VwYXJhdGUgdGhpcyB1bmRlci10cmlhbCBzZXR0aW5ncyBhd2F5IGZyb20gcEFkLT5TdGFBY3RpdmUgc28gdGhhdCBvbmNlCisvLyB0aGlzIG5ldyBhdHRlbXB0IGZhaWxlZCwgZHJpdmVyIGNhbiBhdXRvLXJlY292ZXIgYmFjayB0byB0aGUgYWN0aXZlIHNldHRpbmdzLgordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVVYIHsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc1R5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVUNIQVIgICAgICAgICAgICAgICBTc2lkTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkTGVuOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWxnOworICAgIFVDSEFSICAgICAgICAgICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgICAgICAgICAgQ2VudHJhbENoYW5uZWw7CisgICAgVVNIT1JUICAgICAgICAgICAgICBBaWQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwUGVyaW9kOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQXRpbVdpbjsKKworCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCisJVUNIQVIJCSAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUgkJICAgICAgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlVQ0hBUgkJICAgICAgICAJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisKKyAgICAvLyBuZXcgZm9yIFFPUworICAgIFFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisgICAgRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisgICAgUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisKKyAgICAvLyBuZXcgdG8ga2VlcCBSYWxpbmsgc3BlY2lmaWMgZmVhdHVyZQorICAgIFVMT05HICAgICAgICAgICAgICAgQVBSYWxpbmtJZTsKKworICAgIEJTU19UQUJMRSAgICAgICAgICAgU3NpZEJzc1RhYjsgICAgIC8vIEFQIGxpc3QgZm9yIHRoZSBzYW1lIFNTSUQKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFJvYW1UYWI7ICAgICAgICAvLyBBUCBsaXN0IGVsaWdpYmxlIGZvciByb2FtaW5nCisgICAgVUxPTkcgICAgICAgICAgICAgICBCc3NJZHg7CisgICAgVUxPTkcgICAgICAgICAgICAgICBSb2FtSWR4OworCisJQk9PTEVBTgkJCQlDdXJyUmVxSXNGcm9tTmRpczsKKworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQmVhY29uVGltZXIsIFNjYW5UaW1lcjsKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEF1dGhUaW1lcjsKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEFzc29jVGltZXIsIFJlYXNzb2NUaW1lciwgRGlzYXNzb2NUaW1lcjsKK30gTUxNRV9BVVgsICpQTUxNRV9BVVg7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQnVmU2l6ZTsKKwlVU0hPUlQJVGltZU91dFZhbHVlOworCVVDSEFSICAgVElEOworCVVDSEFSICAgVG9rZW47CisJVVNIT1JUCUJhU3RhcnRTZXE7Cit9IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKKwlVQ0hBUiAgIFdjaWQ7CS8vCisJVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUglJbml0aWF0b3I7Cit9IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7CisKKy8vIGFzc29jIHN0cnVjdCBpcyBlcXVhbCB0byByZWFzc29jCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BU1NPQ19SRVFfU1RSVUNUeworICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgIENhcGFiaWxpdHlJbmZvOworICAgIFVTSE9SVCAgICBMaXN0ZW5JbnR2OworICAgIFVMT05HICAgICBUaW1lb3V0OworfSBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9BU1NPQ19SRVFfU1RSVUNULCBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfRElTQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBSZWFzb247Cit9IE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7CisgICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgQWxnOworICAgIFVMT05HICAgICAgICBUaW1lb3V0OworfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIFJlYXNvbjsKK30gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUxPTkcgICAgICBCc3NJZHg7Cit9IE1MTUVfSk9JTl9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgIEJzc1R5cGU7CisgICAgVUNIQVIgICAgICBTY2FuVHlwZTsKKyAgICBVQ0hBUiAgICAgIFNzaWRMZW47CisgICAgQ0hBUiAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Cit9IE1MTUVfU0NBTl9SRVFfU1RSVUNULCAqUE1MTUVfU0NBTl9SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TVEFSVF9SRVFfU1RSVUNUIHsKKyAgICBDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVUNIQVIgICAgICAgU3NpZExlbjsKK30gTUxNRV9TVEFSVF9SRVFfU1RSVUNULCAqUE1MTUVfU1RBUlRfUkVRX1NUUlVDVDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLy8gc3RydWN0dXJlIGZvciBETFMKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTIHsKKwlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQorCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSx1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKKwlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKKwlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJCVRpbWVyOwkJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBoYW5kc2hha2UKKwlVU0hPUlQJCQkJCQlTZXF1ZW5jZTsKKwlVU0hPUlQJCQkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKKwlCT09MRUFOCQkJCQkJYkhUQ2FwOworCVBWT0lECQkJCQkJcEFkOworfSBSVF84MDJfMTFfRExTLCAqUFJUXzgwMl8xMV9ETFM7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RMU19SRVFfU1RSVUNUIHsKKyAgICBQUlRfODAyXzExX0RMUwlwRExTOworICAgIFVTSE9SVAkJCVJlYXNvbjsKK30gTUxNRV9ETFNfUkVRX1NUUlVDVCwgKlBNTE1FX0RMU19SRVFfU1RSVUNUOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIFVDSEFSICAgRWlkOworICAgIFVDSEFSICAgTGVuOworICAgIENIQVIgICBPY3RldFsxXTsKK30gRUlEX1NUUlVDVCwqUEVJRF9TVFJVQ1QsIEJFQUNPTl9FSURfU1RSVUNULCAqUEJFQUNPTl9FSURfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUTVBfVFhfUkFURV9TV0lUQ0gKK3sKKwlVQ0hBUiAgIEl0ZW1ObzsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUnN2MjoyOworCVVDSEFSCU1vZGU6MjsKKwlVQ0hBUglSc3YxOjE7CisJVUNIQVIJQlc6MTsKKwlVQ0hBUglTaG9ydEdJOjE7CisJVUNIQVIJU1RCQzoxOworI2Vsc2UKKwlVQ0hBUglTVEJDOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCU1vZGU6MjsKKwlVQ0hBUglSc3YyOjI7CisjZW5kaWYKKwlVQ0hBUiAgIEN1cnJNQ1M7CisJVUNIQVIgICBUcmFpblVwOworCVVDSEFSICAgVHJhaW5Eb3duOworfSBSUlRNUF9UWF9SQVRFX1NXSVRDSCwgKlBSVE1QX1RYX1JBVEVfU1dJVENIOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBUQlRUX1BSRUxPQURfVElNRSAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKyNkZWZpbmUgREVGQVVMVF9EVElNX1BFUklPRCAgICAgMQorCisjZGVmaW5lIE1BQ19UQUJMRV9BR0VPVVRfVElNRQkJCTMwMAkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfQVNTT0NfVElNRU9VVAkJCTUJCQkvLyB1bml0OiBzZWMKKyNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKworLy8gQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4KKyNkZWZpbmUgTUFDX0VOVFJZX0xJRkVfQ0hFQ0tfQ05UCQkyMAkJCS8vIHBhY2tldCBjbnQuCisKKy8vIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdAordHlwZWRlZiBlbnVtIF9Tc3QgeworICAgIFNTVF9OT1RfQVVUSCwgICAvLyAwOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMQorICAgIFNTVF9BVVRILCAgICAgICAvLyAxOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMgorICAgIFNTVF9BU1NPQyAgICAgICAvLyAyOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMworfSBTU1Q7CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPkF1dGhTdGF0ZQordHlwZWRlZiBlbnVtIF9BdXRoU3RhdGUgeworICAgIEFTX05PVF9BVVRILAorICAgIEFTX0FVVEhfT1BFTiwgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgT1BFTiBTWVNURU0KKyAgICBBU19BVVRIX0tFWSwgICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIFNIQVJFRCBLRVkKKyAgICBBU19BVVRIRU5USUNBVElORyAgIC8vIFNUQSBpcyB3YWl0aW5nIGZvciBBVVRIIHNlcSMzIHVzaW5nIFNIQVJFRCBLRVkKK30gQVVUSF9TVEFURTsKKworLy9mb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9BcFdwYVN0YXRlIHsKKyAgICBBU19OT1RVU0UsICAgICAgICAgICAgICAvLyAwCisgICAgQVNfRElTQ09OTkVDVCwgICAgICAgICAgLy8gMQorICAgIEFTX0RJU0NPTk5FQ1RFRCwgICAgICAgIC8vIDIKKyAgICBBU19JTklUSUFMSVpFLCAgICAgICAgICAvLyAzCisgICAgQVNfQVVUSEVOVElDQVRJT04sICAgICAgLy8gNAorICAgIEFTX0FVVEhFTlRJQ0FUSU9OMiwgICAgIC8vIDUKKyAgICBBU19JTklUUE1LLCAgICAgICAgICAgICAvLyA2CisgICAgQVNfSU5JVFBTSywgICAgICAgICAgICAgLy8gNworICAgIEFTX1BUS1NUQVJULCAgICAgICAgICAgIC8vIDgKKyAgICBBU19QVEtJTklUX05FR09USUFUSU5HLCAvLyA5CisgICAgQVNfUFRLSU5JVERPTkUsICAgICAgICAgLy8gMTAKKyAgICBBU19VUERBVEVLRVlTLCAgICAgICAgICAvLyAxMQorICAgIEFTX0lOVEVHUklUWV9GQUlMVVJFLCAgIC8vIDEyCisgICAgQVNfS0VZVVBEQVRFLCAgICAgICAgICAgLy8gMTMKK30gQVBfV1BBX1NUQVRFOworCisvLyBmb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9HVEtTdGF0ZSB7CisgICAgUkVLRVlfTkVHT1RJQVRJTkcsCisgICAgUkVLRVlfRVNUQUJMSVNIRUQsCisgICAgS0VZRVJST1IsCit9IEdUS19TVEFURTsKKworLy8gIGZvci13cGEgIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAordHlwZWRlZiBlbnVtIF9XcGFHVEtTdGF0ZSB7CisgICAgU0VUS0VZUywKKyAgICBTRVRLRVlTX0RPTkUsCit9IFdQQV9HVEtfU1RBVEU7CisvLyA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyNlbmRpZgkvLyBNTE1FX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmOTFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKQEAgLTAsMCArMSw5OTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJb2lkLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmIF9PSURfSF8KKyNkZWZpbmUgX09JRF9IXworCisKKyNkZWZpbmUgVFJVRQkJCQkxCisjZGVmaW5lIEZBTFNFCQkJCTAKKy8vCisvLyBJRUVFIDgwMi4xMSBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucworLy8KKyNkZWZpbmUgTUFYX1RYX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAxMDAgICAvKiBtVyAqLworI2RlZmluZSBNQVhfUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0xMCAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUlOX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMjAwICAgLyogZEJtICovCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NiAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDI1NiAgIC8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3ICAvKiBieXRlIGNvdW50ICovCisKKy8vIG5ldyB0eXBlcyBmb3IgTWVkaWEgU3BlY2lmaWMgSW5kaWNhdGlvbnMKKy8vIEV4dGVuc2lvbiBjaGFubmVsIG9mZnNldAorI2RlZmluZSBFWFRDSEFfTk9ORQkJCTAKKyNkZWZpbmUgRVhUQ0hBX0FCT1ZFCQkweDEKKyNkZWZpbmUgRVhUQ0hBX0JFTE9XCQkweDMKKworLy8gQlcKKyNkZWZpbmUgQkFORF9XSURUSF8yMAkJMAorI2RlZmluZSBCQU5EX1dJRFRIXzQwCQkxCisjZGVmaW5lIEJBTkRfV0lEVEhfQk9USAkJMgorI2RlZmluZSBCQU5EX1dJRFRIXzEwCQkzCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorLy8gU0hPUlRHSQorI2RlZmluZSBHQVBfSU5URVJWQUxfNDAwCTEJLy8gb25seSBzdXBwb3J0IGluIEhUIG1vZGUKKyNkZWZpbmUgR0FQX0lOVEVSVkFMXzgwMAkwCisjZGVmaW5lIEdBUF9JTlRFUlZBTF9CT1RICTIKKworI2RlZmluZSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAkJCTEKKyNkZWZpbmUgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQJCTAKKworI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCAgICAgICAgIDMyCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFUyAgICAgICAgOAorI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVggICAgIDE2CisjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAgIC8vIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9BQ0wJCQkJNjQKKyNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMiAgICAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCQkJNAorCisjaWZuZGVmIFVOREVSX0NFCisKKyNkZWZpbmUgT0lEX0dFTl9NQUNISU5FX05BTUUgICAgICAgICAgICAgICAweDAwMDEwMjFBCisKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQJCQkweDA0MDEKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQgICAgICAgICAgICAgICAgIAkweDA0MDQKKyNkZWZpbmUgUlRfU0VUX0FQRF9QSUQJCQkJCQkweDA0MDUKKyNkZWZpbmUgUlRfU0VUX0RFTF9NQUNfRU5UUlkJCQkJMHgwNDA2CisKKy8vCisvLyBJRUVFIDgwMi4xMSBPSURzCisvLworI2RlZmluZQlPSURfR0VUX1NFVF9UT0dHTEUJCQkweDgwMDAKKworI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVECQkJMHgwMTAzCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRQkJCQkweDAxMDQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkJCQkweDAxMDcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJCQkJCQkJCTB4MDEwOCAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzEJCQkJCQkweDAxMDkgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8yCQkJCQkJMHgwMTBBIC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlPSURfODAyXzExX05VTUJFUl9PRl9BTlRFTk5BUwkJCQkweDAxMEIKKyNkZWZpbmUJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwQworI2RlZmluZQlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBECisjZGVmaW5lCU9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkJCQkweDAxMEUKKyNkZWZpbmUJT0lEXzgwMl8xMV9BRERfV0VQCQkJCQkJCTB4MDExMgorI2RlZmluZQlPSURfODAyXzExX1JFTU9WRV9XRVAJCQkJCQkweDAxMTMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkJCQkweDAxMTQKKyNkZWZpbmUJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJCQkJMHgwMTE4CisjZGVmaW5lCU9JRF84MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04JCQkweDAxMUUKKyNkZWZpbmUJT0lEXzgwMl8xMV9URVNUCQkJCQkJCQkweDAxMUYKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTgkJCQkweDA1MDcKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCQkJCTB4MDUwOAorI2RlZmluZQlPSURfODAyXzExX1NTSUQJCQkJCQkJCTB4MDUwOQorI2RlZmluZQlPSURfODAyXzExX0JTU0lECQkJCQkJCTB4MDUwQQorI2RlZmluZQlSVF9PSURfODAyXzExX1JBRElPCQkJCQkJCTB4MDUwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1BIWV9NT0RFCQkJCQkJMHgwNTBDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1RBX0NPTkZJRwkJCQkJMHgwNTBECisjZGVmaW5lCU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCQkJMHgwNTBFCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUFJFQU1CTEUJCQkJCQkweDA1MEYKKyNkZWZpbmUJT0lEXzgwMl8xMV9XRVBfU1RBVFVTCQkJCQkJMHgwNTEwCisjZGVmaW5lCU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQkJCQkweDA1MTEKKyNkZWZpbmUJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCQkJCTB4MDUxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTCQkJCTB4MDUxMworI2RlZmluZQlPSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkJCTB4MDUxNAorI2RlZmluZQlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xECQkJMHgwNTE1CisjZGVmaW5lCU9JRF84MDJfMTFfUE9XRVJfTU9ERQkJCQkJCTB4MDUxNgorI2RlZmluZQlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkJCQkweDA1MTcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfV1BBCQkJCQkJMHgwNTE4CisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCQkJCTB4MDUxOQorI2RlZmluZQlPSURfODAyXzExX0FERF9LRVkJCQkJCQkJMHgwNTIwCisjZGVmaW5lCU9JRF84MDJfMTFfQ09ORklHVVJBVElPTgkJCQkJMHgwNTIxCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUEFDS0VUX0JVUlNUCQkJCQkweDA1MjIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTAkJCQkweDA1MjMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPCQkJCQkweDA1MjQKKyNpZmRlZglEQkcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUgkJCQkweDA1MjUKKyNlbmRpZgorI2RlZmluZSBPSURfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTICAgICAgICAgICAgT0lEXzgwMl8xMV9XRVBfU1RBVFVTCisjZGVmaW5lIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAgICAgICAgICAgICAgICAgMHgwNTI2CisjZGVmaW5lIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAgICAgICAgICAgICAgICAgMHgwNTI3CisjZGVmaW5lIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FICAgICAgICAgMHgwNTI4CisKKy8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgorI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAorCisjZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKKyNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5CisjZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQorI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQworI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAorI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKKyNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgorI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMworI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKKy8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKKyNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKKyNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKKyNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKKyNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKKworCisvL3J0Mjg2MCAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzAJCQkJCQkJMHgwNjMwCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU05SXzEJCQkJCQkJMHgwNjMxCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFCQkJMHgwNjMyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERQkJCQkweDA2MzMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERQkJCQkweDA2MzQKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCQkJCTB4MDYzNQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORwkJCTB4MDYzNgorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcJCQkJMHgwNjM3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00JCQkJMHgwNjM4CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNCQkJCQkweDA2MzkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMJCQkJCQkweDA2M0EKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTCQkJCQkJMHgwNjNCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNCQkJCTB4MDYzQworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0JCQkJCTB4MDYzRAorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTSAgICAgICAgICAgICAgCQkweDA2M0UKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfV01NICAgICAgCQkJCQkweDA2M0YKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9JTU1FX0JBX0NBUAkJCQkweDA2NDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVAJCQkJMHgwNjQxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfQkFUQUJMRQkJCQkJMHgwNjQyCisjZGVmaW5lIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEJCQkJCTB4MDY0MworI2RlZmluZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQQkJCQkJMHgwNjQ0CisjZGVmaW5lIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgICAgICAgICAgICAgICAgICAgMHgwNjQ1CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREUgICAgICAgICAgMHgwNjQ2CisjZGVmaW5lIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQgICAgICAgICAgMHgwNjQ3CisKKy8vIFJhbGluayBkZWZpbmVkIE9JRHMKKy8vIERlbm5pcyBMZWUgbW92ZSB0byBwbGF0Zm9ybSBzcGVjaWZpYworCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQlNTSUQJCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TU0lEKQorI2RlZmluZQlSVF9PSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XRVAJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfV0VQKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9LRVkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BRERfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTU9WRV9XRVAJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTU9WRV9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX0tFWQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX0tFWSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0RJU0FTU09DSUFURSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9QUklWQUNZX0ZJTFRFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4JCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOKQorI2RlZmluZQlSVF9PSURfODAyXzExX1dFUF9TVEFUVVMJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1dFUF9TVEFUVVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTAkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JTU0lfVFJJR0dFUikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfREVTSVJFRF9SQVRFUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfREVTSVJFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BPV0VSX01PREUJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BPV0VSX01PREUpCisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfU1RBVFVTX1RZUEUKK3sKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfUE1LSURfQ2FuZGlkYXRlTGlzdCwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfU1RBVFVTX1RZUEUsICpQTkRJU184MDJfMTFfU1RBVFVTX1RZUEU7CisKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9NQUNfQUREUkVTU1s2XTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OCit7CisgICAgTkRJU184MDJfMTFfU1RBVFVTX1RZUEUgU3RhdHVzVHlwZTsKK30gTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04sICpQTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT047CisKKy8vIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0FVVEhfRklFTERTICAgICAgICAweDBmCisKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1JFQVVUSCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9LRVlVUERBVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUEFJUldJU0VfRVJST1IgICAgIDB4MDYKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0dST1VQX0VSUk9SICAgICAgICAweDBFCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKyAgICBVTE9ORyBGbGFnczsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUOworCisvL0FkZGVkIG5ldyB0eXBlcyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3RzLgordHlwZWRlZiBzdHJ1Y3QgX1BNS0lEX0NBTkRJREFURSB7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgVUxPTkcgRmxhZ3M7Cit9IFBNS0lEX0NBTkRJREFURSwgKlBQTUtJRF9DQU5ESURBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVAoreworICAgIFVMT05HIFZlcnNpb247ICAgICAgIC8vIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZQorICAgIFVMT05HIE51bUNhbmRpZGF0ZXM7IC8vIE5vLiBvZiBwbWtpZCBjYW5kaWRhdGVzCisgICAgUE1LSURfQ0FORElEQVRFIENhbmRpZGF0ZUxpc3RbMV07Cit9IE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNULCAqUE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUOworCisvL0ZsYWdzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdCBzdHJ1Y3R1cmUKKyNkZWZpbmUgTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX1BSRUFVVEhfRU5BQkxFRAkweDAxCisKKy8vIEFkZGVkIG5ldyB0eXBlcyBmb3IgT0ZETSA1RyBhbmQgMi40RwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUKK3sKKyAgIE5kaXM4MDJfMTFGSCwKKyAgIE5kaXM4MDJfMTFEUywKKyAgICBOZGlzODAyXzExT0ZETTUsCisgICAgTmRpczgwMl8xMU9GRE01X04sCisgICAgTmRpczgwMl8xMU9GRE0yNCwKKyAgICBOZGlzODAyXzExT0ZETTI0X04sCisgICBOZGlzODAyXzExQXV0b21vZGUsCisgICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKK30gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQoreworICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOworCit0eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKKworLy8KKy8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCisvLwordHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAorICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQorICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Cit9IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKK3sKKyAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKK30gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOworCit0eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwordHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOworCisjZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKKwlVSU5UMzIJCQlyYWRpdXNfaXA7CisJVUlOVDMyCQkJcmFkaXVzX3BvcnQ7CisJVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKKwlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOworfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTworeworCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCisgICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOworfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOworCisvLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKK3sKKyAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKKwlVSU5UMzIJCQlvd25faXBfYWRkcjsKKwlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKKwlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7CisJVUNIQVIJCQlFQVBpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJRUFQaWZuYW1lX2xlbjsKKwlVQ0hBUiAJCQlQcmVBdXRoaWZuYW1lW0lGTkFNU0laXTsKKwlVQ0hBUgkJCVByZUF1dGhpZm5hbWVfbGVuOworCVJBRElVU19LRVlfSU5GTwlSYWRpdXNJbmZvWzgvKk1BWF9NQlNTSURfTlVNKi9dOworfSBSQURJVVNfQ09ORiwgKlBSQURJVVNfQ09ORjsKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIEtleSBtYXBwaW5nIGtleXMgcmVxdWlyZSBhIEJTU0lECit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKKyAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX0tFWSwgKlBORElTXzgwMl8xMV9LRVk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9SRU1PVkVfS0VZCit7CisgICAgVUlOVCAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBVSU5UICAgICAgICAgICBLZXlJbmRleDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKK30gTkRJU184MDJfMTFfUkVNT1ZFX0tFWSwgKlBORElTXzgwMl8xMV9SRU1PVkVfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfV0VQCit7CisgICBVSU5UICAgICBMZW5ndGg7ICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgIFVJTlQgICAgIEtleUluZGV4OyAgICAgICAgICAgLy8gMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2xvYmFsIGtleXMKKyAgIFVJTlQgICAgIEtleUxlbmd0aDsgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgIFVDSEFSICAgICBLZXlNYXRlcmlhbFsxXTsvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCit9IE5ESVNfODAyXzExX1dFUCwgKlBORElTXzgwMl8xMV9XRVA7CisKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFCit7CisgICBOZGlzODAyXzExSUJTUywKKyAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSwKKyAgIE5kaXM4MDJfMTFBdXRvVW5rbm93biwKKyAgIE5kaXM4MDJfMTFNb25pdG9yLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlTWF4ICAgICAvLyBOb3QgYSByZWFsIHZhbHVlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUsICpQTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRTsKKworLy8gQWRkIG5ldyBhdXRoZW50aWNhdGlvbiBtb2RlcwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCit7CisgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuLAorICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAorICAgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEsCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyLAorICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKKyAgIAlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKKwlOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSywKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAgICAgLy8gTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU107ICAgICAgICAvLyBTZXQgb2YgOCBkYXRhIHJhdGVzCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNfRVhbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsgIC8vIFNldCBvZiAxNiBkYXRhIHJhdGVzCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfU1NJRAoreworICAgIFVJTlQgICBTc2lkTGVuZ3RoOyAgICAgICAgIC8vIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgemVyby4KKyAgICBVQ0hBUiAgIFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOyAgICAgICAgICAgLy8gU1NJRCBpbmZvcm1hdGlvbiBmaWVsZAorfSBORElTXzgwMl8xMV9TU0lELCAqUE5ESVNfODAyXzExX1NTSUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSUQKK3sKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgLy8gQlNTSUQKKyAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOworICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgLy8gU1NJRAorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKKyAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIGluIGRCbQorICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247CisgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKK30gTkRJU19XTEFOX0JTU0lELCAqUE5ESVNfV0xBTl9CU1NJRDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUCit7CisgICBVSU5UICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgIE5ESVNfV0xBTl9CU1NJRCBCc3NpZFsxXTsKK30gTkRJU184MDJfMTFfQlNTSURfTElTVCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUOworCisvLyBBZGRlZCBDYXBhYmlsaXRpZXMsIElFTGVuZ3RoIGFuZCBJRXMgZm9yIGVhY2ggQlNTSUQKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lEX0VYCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAgICAgICAgIC8vIEJTU0lECisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsgICAgICAgICAgICAgICAvLyBTU0lECisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmFjeTsgICAgICAgICAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgIE5ESVNfODAyXzExX1JTU0kgICAgICAgICAgICAgICAgICAgIFJzc2k7ICAgICAgICAgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVuZ3RoIGluIGRCbQorICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBJbmZyYXN0cnVjdHVyZU1vZGU7CisgICAgTkRJU184MDJfMTFfUkFURVNfRVggICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVMZW5ndGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVzWzFdOworfSBORElTX1dMQU5fQlNTSURfRVgsICpQTkRJU19XTEFOX0JTU0lEX0VYOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgKK3sKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgIE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfRklYRURfSUVzCit7CisgICAgVUNIQVIgVGltZXN0YW1wWzhdOworICAgIFVTSE9SVCBCZWFjb25JbnRlcnZhbDsKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworfSBORElTXzgwMl8xMV9GSVhFRF9JRXMsICpQTkRJU184MDJfMTFfRklYRURfSUVzOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCit7CisgICAgVUNIQVIgRWxlbWVudElEOworICAgIFVDSEFSIExlbmd0aDsgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgZmllbGQKKyAgICBVQ0hBUiBkYXRhWzFdOworfSBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMsICpQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfQU5URU5OQTsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUgoreworICAgTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCisgICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQCit9IE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSLCAqUE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSOworCisvLyBBZGRlZCBuZXcgZW5jcnlwdGlvbiB0eXBlcworLy8gQWxzbyBhbGlhc2VkIHR5cGVkZWYgdG8gbmV3IG5hbWUKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfV0VQX1NUQVRVUworeworICAgTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAorICAgTmRpczgwMl8xMVdFUERpc2FibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUtleUFic2VudCA9IE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkLAkvLyBUS0lQIG9yIEFFUyBtaXgKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQsCit9IE5ESVNfODAyXzExX1dFUF9TVEFUVVMsICpQTkRJU184MDJfMTFfV0VQX1NUQVRVUywKKyAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMsICpQTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTCit7CisgICBOZGlzODAyXzExUmVsb2FkV0VQS2V5cworfSBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMsICpQTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTOworCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyAgICAgIDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUwgICAgMgorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DVVJSRU5UQVBBRERSRVNTICA0CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9TVEFUVVNDT0RFICAgICAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0FTU09DSUFUSU9OSUQgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FJX1JFUUZJCit7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKKyAgICBVU0hPUlQgTGlzdGVuSW50ZXJ2YWw7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgIEN1cnJlbnRBUEFkZHJlc3M7Cit9IE5ESVNfODAyXzExX0FJX1JFUUZJLCAqUE5ESVNfODAyXzExX0FJX1JFUUZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVTRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBTdGF0dXNDb2RlOworICAgIFVTSE9SVCBBc3NvY2lhdGlvbklkOworfSBORElTXzgwMl8xMV9BSV9SRVNGSSwgKlBORElTXzgwMl8xMV9BSV9SRVNGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgTGVuZ3RoOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVFGSSAgICBSZXF1ZXN0Rml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVxdWVzdElFTGVuZ3RoOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlcXVlc3RJRXM7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKKyAgICBORElTXzgwMl8xMV9BSV9SRVNGSSAgICBSZXNwb25zZUZpeGVkSUVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlSUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVzcG9uc2VJRXM7Cit9IE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OLCAqUE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQKK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiAgICAgICBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVCAgUmVxdWVzdFsxXTsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRVZFTlQ7CisKKy8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit7CisgICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAorfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKKworLy8gUE1LSUQgU3RydWN0dXJlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KK3sKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK30gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKK3sKKyAgICBVSU5UICAgIExlbmd0aDsKKyAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OworICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOworfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgoreworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisgICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQoreworICAgICBVTE9ORyBMZW5ndGg7CisgICAgIFVMT05HIFZlcnNpb247CisgICAgIFVMT05HIE5vT2ZQTUtJRHM7CisgICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK30gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworCisvLyNlbmRpZiAvL29mIFdJTiAyaworI2VuZGlmIC8vVU5ERVJfQ0UKKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMQorI2lmbmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUFJJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJFMAorI2VuZGlmCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkJCQkJCQkJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0UyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNykKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCitlbnVtIHsKKyAgICBTSE9XX0NPTk5fU1RBVFVTID0gNCwKKyAgICBTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorICAgIFNIT1dfQkFfSU5GTyA9IDYsCisJU0hPV19ERVNDX0lORk8gPSA3LAorICAgIFJBSU9fT0ZGID0gMTAsCisgICAgUkFJT19PTiA9IDExLAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwlTSE9XX0NGR19WQUxVRSA9IDIwLAorfTsKKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKKy8vIGRvdDExcmVzKDMpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQorI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCisKKy8vIGRvdDExc210KDEpCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMworI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKKyNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2CisjZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3CisjZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAorI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQorI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKKworLy8gLy9kb3QxMVBoeSg0KQorI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgorCisvL2RvdDExbWFjCisjZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3CisKKyNpZmRlZiBMTFREX1NVUFBPUlQKKy8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKKyNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQorI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisvLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBPSURfTUhfODAyXzFYX1NVUFBPUlRFRCAgICAgICAgICAgICAgIDB4RkZFREMxMDAKKworLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISEhCit0eXBlZGVmIHVuaW9uICBfSFRUUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlyc3Y6MjsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QUkVBTUJMRSB7CisgICAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcsCisgICAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LAorICAgIFJ0ODAyXzExUHJlYW1ibGVBdXRvCit9IFJUXzgwMl8xMV9QUkVBTUJMRSwgKlBSVF84MDJfMTFfUFJFQU1CTEU7CisKKy8vIE9ubHkgZm9yIFNUQSwgbmVlZCB0byBzeW5jIHdpdGggQVAKKy8vIDIwMDUtMDMtMDggbWF0Y2ggY3VycmVudCBSYUNvbmZpZy4KK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX1BIWV9NT0RFIHsKKwlQSFlfMTFCR19NSVhFRCA9IDAsCisJUEhZXzExQiwKKwlQSFlfMTFBLAorCVBIWV8xMUFCR19NSVhFRCwKKwlQSFlfMTFHLAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBIWV8xMUFCR05fTUlYRUQsCS8vIGJvdGggYmFuZCAgIDUKKwlQSFlfMTFOXzJfNEcsCQkvLyAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgIAk2CisJUEhZXzExR05fTUlYRUQsCS8vIDIuNEcgYmFuZCAgICAgIDcKKwlQSFlfMTFBTl9NSVhFRCwJLy8gNUcgIGJhbmQgICAgICAgOAorCVBIWV8xMUJHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICA5CisJUEhZXzExQUdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDEwCisJUEhZXzExTl81RywJCQkvLyAxMW4tb25seSB3aXRoIDVHIGJhbmQJCTExCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IFJUXzgwMl8xMV9QSFlfTU9ERTsKKworLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7CisgICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKKyAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKKyAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCisgICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCit9IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfTE9HIHsKKyAgICBMQVJHRV9JTlRFR0VSICAgU3lzdGVtVGltZTsgIC8vIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpCisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgICAgICAgICAgRXZlbnQ7ICAgICAgIC8vIEVWRU5UX3h4eAorfSBSVF84MDJfMTFfRVZFTlRfTE9HLCAqUFJUXzgwMl8xMV9FVkVOVF9MT0c7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICBSc3Y7ICAgICAvLyB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkKKyAgICBSVF84MDJfMTFfRVZFTlRfTE9HICAgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfSBSVF84MDJfMTFfRVZFTlRfVEFCTEUsIFBSVF84MDJfMTFfRVZFTlRfVEFCTEU7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworCVVTSE9SVAkJd29yZDsKKyB9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVUNIQVIgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQorICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKKyAgICBDSEFSCQlBdmdSc3NpMDsKKwlDSEFSCQlBdmdSc3NpMTsKKwlDSEFSCQlBdmdSc3NpMjsKKwlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7CisgICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKK30gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7CisgICAgVUxPTkcgICAgICAgTnVtOworICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8vIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSIHsKKyAgICBVTE9ORyAgIEhhcmR3YXJlVHlwZTsgICAgICAgLy8gMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTQorICAgIFVMT05HICAgT2Zmc2V0OyAgICAgICAgICAgICAvLyBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIKKyAgICBVTE9ORyAgIERhdGE7ICAgICAgICAgICAgICAgLy8gUi9XIGRhdGEgYnVmZmVyCit9IFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiwgKlBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVI7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQVBfQ09ORklHIHsKKyAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQorICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQorICAgIFVMT05HICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaXNvbGF0aW9uCisgICAgVUxPTkcgICBIaWRlU3NpZDsgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgaGlkaW5nCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9BUF9DT05GSUcsICpQUlRfODAyXzExX0FQX0NPTkZJRzsKKworLy8gc3RydWN0dXJlIHRvIHF1ZXJ5L3NldCBTVEFfQ09ORklHCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1NUQV9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBVc2VCR1Byb3RlY3Rpb247ICAgIC8vIDAtQVVUTywgMS1hbHdheXMgT04sIDItYWx3YXlzIE9GRgorICAgIFVMT05HICAgVXNlU2hvcnRTbG90VGltZTsgICAvLyAwLW5vIHVzZSwgMS11c2UgOS11cyBzaG9ydCBzbG90IHRpbWUgd2hlbiBhcHBsaWNhYmxlCisgICAgVUxPTkcgICBBZGhvY01vZGU7IAkJCS8vIDAtMTFiIHJhdGVzIG9ubHkgKFdJRkkgc3BlYyksIDEgLSBiL2cgbWl4ZWQsIDIgLSBnIG9ubHkKKyAgICBVTE9ORyAgIEh3UmFkaW9TdGF0dXM7ICAgICAgLy8gMC1PRkYsIDEtT04sIGRlZmF1bHQgaXMgMSwgUmVhZC1Pbmx5CisgICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQorfSBSVF84MDJfMTFfU1RBX0NPTkZJRywgKlBSVF84MDJfMTFfU1RBX0NPTkZJRzsKKworLy8KKy8vICBGb3IgT0lEIFF1ZXJ5IG9yIFNldCBhYm91dCBCQSBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmCXN0cnVjdAlfT0lEX0JBQ0FQX1NUUlVDCXsKKwkJVUNIQVIJCVJ4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVR4QkFXaW5MaW1pdDsKKwkJVUNIQVIJCVBvbGljeTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUgkJTXBkdURlbnNpdHk7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKKwkJVUNIQVIgICAgICAgCUFtc2R1RW5hYmxlOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVDSEFSICAgICAgIAlBbXNkdVNpemU7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVDSEFSICAgICAgIAlNTVBTbW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCUJPT0xFQU4JCUF1dG9CQTsJLy8gQXV0byBCQSB3aWxsIGF1dG9tYXRpY2FsbHkKK30gT0lEX0JBQ0FQX1NUUlVDLCAqUE9JRF9CQUNBUF9TVFJVQzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BQ0xfRU5UUlkgeworICAgIFVDSEFSICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVTSE9SVCAgUnN2OworfSBSVF84MDJfMTFfQUNMX0VOVFJZLCAqUFJUXzgwMl8xMV9BQ0xfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX0FDTCB7CisgICAgVUxPTkcgICBQb2xpY3k7ICAgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1wb3NpdGl2ZSBsaXN0LCAyLW5lZ2F0aXZlIGxpc3QKKyAgICBVTE9ORyAgIE51bTsKKyAgICBSVF84MDJfMTFfQUNMX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKK30gUlRfODAyXzExX0FDTCwgKlBSVF84MDJfMTFfQUNMOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEUyB7CisgICAgVUxPTkcJCQkJCQlOdW07CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCUVudHJ5WzI0LypNQVhfTlVNX09GX1dEU19MSU5LKi9dOworCVVMT05HCQkJCQkJS2V5TGVuZ3RoOworCVVDSEFSCQkJCQkJS2V5TWF0ZXJpYWxbMzJdOworfSBSVF84MDJfMTFfV0RTLCAqUFJUXzgwMl8xMV9XRFM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfVFhfUkFURVNfIHsKKyAgICBVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKKyAgICBVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTXTsKK30gUlRfODAyXzExX1RYX1JBVEVTLCAqUFJUXzgwMl8xMV9UWF9SQVRFUzsKKworCisvLyBEZWZpbml0aW9uIG9mIGV4dHJhIGluZm9ybWF0aW9uIGNvZGUKKyNkZWZpbmUJR0VORVJBTF9MSU5LX1VQCQkJMHgwCQkJLy8gTGluayBpcyBVcAorI2RlZmluZQlHRU5FUkFMX0xJTktfRE9XTgkJMHgxCQkJLy8gTGluayBpcyBEb3duCisjZGVmaW5lCUhXX1JBRElPX09GRgkJCTB4MgkJCS8vIEhhcmR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlTV19SQURJT19PRkYJCQkweDMJCQkvLyBTb2Z0d2FyZSByYWRpbyBvZmYKKyNkZWZpbmUJQVVUSF9GQUlMCQkJCTB4NAkJCS8vIE9wZW4gYXV0aGVudGljYXRpb24gZmFpbAorI2RlZmluZQlBVVRIX0ZBSUxfS0VZUwkJCTB4NQkJCS8vIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CQkJLy8gQXNzb2NpYXRpb24gZmFpbGVkCisjZGVmaW5lCUVBUF9NSUNfRkFJTFVSRQkJCTB4NwkJCS8vIERlYXV0aGVuY2F0aW9uIGJlY2F1c2UgTUlDIGZhaWx1cmUKKyNkZWZpbmUJRUFQXzRXQVlfVElNRU9VVAkJMHg4CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQKKyNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIGdyb3VwIGtleSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfU1VDQ0VTUwkJCQkweGEJCQkvLyBFQVAgc3VjY2VlZAorI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIgICAgICAgICAvLyBSYWRhciBzaWduYWwgb2NjdXIgaW4gY3VycmVudCBjaGFubmVsCisjZGVmaW5lIEVYVFJBX0lORk9fTUFYCQkJMHhiCQkJLy8gSW5kaWNhdGUgTGFzdCBPSUQKKworI2RlZmluZSBFWFRSQV9JTkZPX0NMRUFSCQkweGZmZmZmZmZmCisKKy8vIFRoaXMgaXMgT0lEIHNldHRpbmcgc3RydWN0dXJlLiBTbyBvbmx5IEdGIG9yIE1NIGFzIE1vZGUuIFRoaXMgaXMgdmFsaWQgd2hlbiBvdXIgd2lyZWxzcyBtb2RlIGhhcyA4MDIuMTFuIGluIHVzZS4KK3R5cGVkZWYgc3RydWN0IHsKKwlSVF84MDJfMTFfUEhZX01PREUJCVBoeU1vZGU7IAkvLworCVVDSEFSCQlUcmFuc21pdE5vOworCVVDSEFSCQlIdE1vZGU7IAkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KKwlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93CisJVUNIQVIJCU1DUzsKKwlVQ0hBUiAgIAlCVzsKKwlVQ0hBUgkJU1RCQzsKKwlVQ0hBUgkJU0hPUlRHSTsKKwlVQ0hBUgkJcnN2OworfSBPSURfU0VUX0hUX1BIWU1PREUsICpQT0lEX1NFVF9IVF9QSFlNT0RFOworCisjaWZkZWYgTExURF9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSB7CisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgTU9SOyAgICAgICAgLy8gbWF4aW11bSBvcGVyYXRpb25hbCByYXRlCisgICAgVUNIQVIgICAgICAgICAgIHBoeU1vZGU7Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlksICpQUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBOdW07CisgICAgUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFOworI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvL3J0Mjg2MCwga2F0aHkgMjAwNy0wMTE4CisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfVUkgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworfSBSVF84MDJfMTFfRExTX1VJLCAqUFJUXzgwMl8xMV9ETFNfVUk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX0lORk8geworCVJUXzgwMl8xMV9ETFNfVUkJRW50cnlbTUFYX05VTUJFUl9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCW51bTsKK30gUlRfODAyXzExX0RMU19JTkZPLCAqUFJUXzgwMl8xMV9ETFNfSU5GTzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRExTX01PREUgeworICAgIERMU19OT05FLAorICAgIERMU19XQUlUX0tFWSwKKyAgICBETFNfRklOSVNICit9IFJUXzgwMl8xMV9ETFNfTU9ERTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJUlRfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUJUlRfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUJUlRfUkVRSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUJUlRfUkVTUElFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUJUlRfQVNTT0NJTkZPX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgUlRfUE1LSURDQU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgUlRfSU5URVJGQUNFX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgUlRfSU5URVJGQUNFX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiAxMjgKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRF9DTElFTlRfTU9ERQoreworICAgUnQ4MDJfMTFfRF9Ob25lLAorICAgUnQ4MDJfMTFfRF9GbGV4aWJsZSwKKyAgIFJ0ODAyXzExX0RfU3RyaWN0LAorfSBSVF84MDJfMTFfRF9DTElFTlRfTU9ERSwgKlBSVF84MDJfMTFfRF9DTElFTlRfTU9ERTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0NIQU5ORUxfTElTVF9JTkZPCit7CisJVUNIQVIgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwlVQ0hBUiBDaGFubmVsTGlzdE51bTsgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQorfSBSVF9DSEFOTkVMX0xJU1RfSU5GTywgKlBSVF9DSEFOTkVMX0xJU1RfSU5GTzsKKworCisjZW5kaWYgLy8gX09JRF9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjg2MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTcyMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg2MF9IX18KKyNkZWZpbmUgX19SVDI4NjBfSF9fCisKKyNkZWZpbmUgUlQyOHh4X0NISVBfTkFNRQkiUlQyODYwIgorCisjZGVmaW5lIFRYSU5GT19TSVpFICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWFBBRERJTkdfU0laRSAgICAgIAkgIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCVwKKwl2YXIgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQpCisKKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQlcCisJUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFyKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAorCWluaXRfdGhyZWFkX3Rhc2socEFkKTsgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKHBBZCk7CVwKKwlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgaXJxcmV0dXJuX3QKKyNlbHNlCisjZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgdm9pZAorI2VuZGlmCisKK0lSUV9IQU5ETEVfVFlQRQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKK3J0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKKyNlbHNlCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1dSSVRFX0ZJUk1XQVJFKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQkJCQlcCisJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJVUxPTkcJX2ksIF9maXJtOwkJCQkJCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQlcCisJCWZvcihfaT0wOyBfaTxfRndMZW47IF9pKz00KQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCVwKKwkJCV9maXJtID0gX3BGd0ltYWdlW19pXSArCQkJCQkJCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSszXSA8PCAyNCkgKwkJCQkJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzJdIDw8IDE2KSArCQkJCQkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krMV0gPDwgOCk7CQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIF9pLCBfZmlybSk7CVwKKwkJfQkJCQkJCQkJCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7CQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCQkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOwkJCQkJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQorI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQorCisKKyNkZWZpbmUgUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBmcmVlTnVtLCBwUGFja2V0KSBcCisJCSgoZnJlZU51bSkgPj0gKFVMT05HKShwVHhCbGstPlRvdGFsRnJhZ051bSArIFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgKyAzKSkgLyogcm91Z2ggZXN0aW1hdGUgd2Ugd2lsbCB1c2UgMyBtb3JlIGRlc2NyaXB0b3IuICovCisjZGVmaW5lIFJUMjhYWF9SRUxFQVNFX0RFU0NfUkVTT1VSQ0UocEFkLCBRdWVJZHgpCQkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBmcmVlTnVtLCBfVHhGcmFtZVR5cGUpIFwKKwkJKCgoZnJlZU51bSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMCkpIHx8IChmcmVlTnVtPDMpKQorCQkvLygoKGZyZWVOdW0pICE9IChUWF9SSU5HX1NJWkUtMSkpICYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA9PSAxIC8qMCovKSkKKworCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQlcCisJCQlSdG1wUENJTWdtdEtpY2tPdXQoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkwCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJLyogUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKSovCisKKyNkZWZpbmUgSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKF9wQWQsIF9wVHhCbGssIF9Ub3RhbE1QRFVTaXplLCBfRmlyc3RUeElkeCkJXAorCQkJUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpIFwKKwkJCS8qUnRtcFBDSURhdGFMYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChfcEFkLCBfcFR4QmxrLCBfUXVlSWR4KQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBUWF9DVFhfSURYMCsoKF9RdWVJZHgpKjB4MTApLCAoX3BBZCktPlR4UmluZ1soX1F1ZUlkeCldLlR4Q3B1SWR4KQorLyoJCQlSdG1wUENJRGF0YUtpY2tPdXQoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0TnVsbEZyYW1lVHgoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikJXAorCQkJTWluaXBvcnRNTVJlcXVlc3QoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikKKworI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSBcCisJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCA+IF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCkJPyBcCisJCQkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4IC0gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4IC0gMSkgXAorCQkJIDoJXAorCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCArIFRYX1JJTkdfU0laRSAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpOworCisKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSBcCisJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID4gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxKSBcCisJCQkgOglcCisJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBubyB1c2UKKyNkZWZpbmUgUlQyOFhYX1JDVl9QS1RfR0VUX0lOSVQocEFkKQorI2RlZmluZSBSVDI4WFhfUlZfQV9CVUZfRU5ECisvLyNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5ECisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBubyB1c2UKKyNkZWZpbmUgUlQyOFhYX0RNQV9QT1NUX1dSSVRFKHBBZCkKKworLy8gcmVzZXQgTUFDIG9mIGEgc3RhdGlvbiBlbnRyeSB0byAweDAwMDAwMDAwMDAwMAorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQkJXAorCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7CisKKy8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQorI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCQkJCQkJXAorCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOworCisvLyByZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQnNzSWR4LCBXY2lkKQkJCQkJXAorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQnNzSWR4LCAoVUNIQVIpV2NpZCk7CisKKy8vIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCVwKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELCAJCQkJCVwKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywgcEVudHJ5KTsKKworI2RlZmluZSBSVDI4WFhfU0VDVVJJVFlfS0VZX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQlcCisJewkvKiB1cGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLwlcCisJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQkJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLAkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLktleSwJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLlR4TWljLAkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5SeE1pYyk7CQkJXAorCQkvKiB1cGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8JCQlcCisJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLAkJXAorCQkJCQkJICBwRW50cnkpOyB9CisKKworLy8gSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMoX3BBZCwgX0FpZCwgX1RJRCkJCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVVJTlQzMglfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJCQkJCVwKKwkJCV9PZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKF9BaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAorCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQkJCVwKKwkJCV9WYWx1ZSB8PSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJCQlcCisJCX13aGlsZSgwKQorCisKKy8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKy8vCQliaXRtYXAgZmllbGQgc3RhcnRzIGF0IDB4MTAwMDAgaW4gQVNJQyBXQ0lEIHRhYmxlCisjZGVmaW5lIFJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKKwkJZG97CQkJCQkJCQkJCQkJCQkJCVwKKwkJCVVJTlQzMglfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJCQkJCVwKKwkJCV9PZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKF9XY2lkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKKwkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCisJCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCisJCX13aGlsZSgwKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBDSS9VU0IgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKQkJCQlcCisJKChQT1NfQ09PS0lFKWhhbmRsZSktPnBjaV9kZXYgPSBkZXZfcDsKKworLy8gc2V0IGRyaXZlciBkYXRhCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkJCQlwY2lfc2V0X2RydmRhdGEoX2EsIG5ldF9kZXYpOworCisjZGVmaW5lIFJUMjhYWF9VTk1BUCgpCQkJCQkJCQkJCVwKK3sJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAorCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2X3AsIDApLAlcCisJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihkZXZfcCwgMCkpOyB9CVwKKwlpZiAobmV0X2Rldi0+aXJxKSBwY2lfcmVsZWFzZV9yZWdpb25zKGRldl9wKTsgfQorCisjaWZkZWYgUENJX01TSV9TVVBQT1JUCisjZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKSBcCit7IAlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7IFwKKwkoX3BBZCktPkhhdmVNc2kgPQlwY2lfZW5hYmxlX21zaShfcE9iai0+cGNpX2RldikgPT0gMCA/IFRSVUUgOiBGQUxTRTsgfQorCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkgXAoreyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCisJaWYgKF9wQWQtPkhhdmVNc2kgPT0gVFJVRSkgXAorCQlwY2lfZGlzYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpOyBcCisJX3BBZC0+SGF2ZU1zaSA9IEZBTFNFOwl9CisjZWxzZQorI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkKKyNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKQorI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNkZWZpbmUgU0FfU0hJUlEgSVJRRl9TSEFSRUQKKyNlbmRpZgorCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQkJCQkJCQlcCit7CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwlcCisJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJXAorCVJUTVBfTVNJX0VOQUJMRShfcEFkKTsJCQkJCQkJCQlcCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAJCVwKKwkJCQkJCQlydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwJCVwKKwkJCQkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSkpKSB7CVwKKwkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CVwKKwlyZXR1cm4gcmV0dmFsOyB9IH0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCit7CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwkJXAorCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCQlcCisJc3luY2hyb25pemVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEpOwkJCQkJCVwKKwlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAorCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KKyNlbHNlCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQkJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5wcml2KTsJCVwKKwlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAorCWZyZWVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CQkJCQlcCisJUlRNUF9NU0lfRElTQUJMRShfcEFkKTsgfQorI2VuZGlmCisKKyNkZWZpbmUgUlQyOFhYX0lSUV9JTklUKHBBZCkJCQkJCQkJCQkJXAorCXsJcEFkLT5pbnRfZW5hYmxlX3JlZyA9ICgoREVMQVlJTlRNQVNLKSB8CQkJCQkJXAorCQkJCQkJCShSeElOVHxUeERhdGFJbnR8VHhNZ210SW50KSkgJiB+KDB4MDMpOwlcCisJCXBBZC0+aW50X2Rpc2FibGVfbWFzayA9IDA7CQkJCQkJCQkJXAorCQlwQWQtPmludF9wZW5kaW5nID0gMDsgfQorCisjZGVmaW5lIFJUMjhYWF9JUlFfRU5BQkxFKHBBZCkJCQkJCQkJCQlcCisJewkvKiBjbGVhciBnYXJiYWdlIGludHMgKi8JCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIDB4ZmZmZmZmZmYpOwkJXAorCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsgfQorCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFKGRldl9wKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCkJCQlNbG1lSGFuZGxlcihwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAorCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpCVwKKwkJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUocEFkKQorCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCisJCUhhbmRsZUNvdW50ZXJNZWFzdXJlKF9wQWQsIF9wRW50cnkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJRW5xdWV1ZVBzUG9sbChwQWQpCisKKy8vCisvLyBEZXZpY2UgSUQgJiBWZW5kb3IgSUQsIHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggRUVQUk9NIHZhbHVlCisvLworI2RlZmluZSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQgICAweDA2MDEKKyNkZWZpbmUgTklDMjg2MF9QQ0llX0RFVklDRV9JRCAgMHgwNjgxCisjZGVmaW5lIE5JQzI3NjBfUENJX0RFVklDRV9JRCAgIDB4MDcwMQkJLy8gMVQvMlIgQ2FyZGJ1cyA/Pz8KKyNkZWZpbmUgTklDMjc5MF9QQ0llX0RFVklDRV9JRCAgMHgwNzgxCSAgICAvLyAxVC8yUiBtaW5pQ2FyZAorCisjZGVmaW5lIE5JQ19QQ0lfVkVORE9SX0lEICAgICAgIDB4MTgxNAorCisjZGVmaW5lIFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQJMHgxMDU5CisjZGVmaW5lIFZFTl9BV1RfUENJX1ZFTkRPUl9JRAkweDFBM0IKKworLy8gRm9yIFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKCkgZnVuY3Rpb24KKyNkZWZpbmUgUkVTVE9SRV9IQUxUCQkgICAgMQorI2RlZmluZSBSRVNUT1JFX1dBS0VVUAkJICAgIDIKKyNkZWZpbmUgUkVTVE9SRV9DTE9TRSAgICAgICAgICAgMworCisjZGVmaW5lIFBvd2VyU2FmZUNJRAkJMQorI2RlZmluZSBQb3dlclJhZGlvT2ZmQ0lECQkyCisjZGVmaW5lIFBvd2VyV2FrZUNJRAkJMworI2RlZmluZSBDSUQwTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDSUQxTUFTSwkJMHgwMDAwZmYwMAorI2RlZmluZSBDSUQyTUFTSwkJMHgwMGZmMDAwMAorI2RlZmluZSBDSUQzTUFTSwkJMHhmZjAwMDAwMAorCisjZGVmaW5lIFBDSV9SRUdfUkVBRF9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgICBcCisgICAgaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgJnJlZzE2KSA9PSAwKSAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENvbmZpZ3VyYXRpb24gPSAwOworCisjZGVmaW5lIFBDSV9SRUdfV0lSVEVfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICBcCisgICAgcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaV9kZXYsIG9mZnNldCwgcmVnMTYpOyAgICAgICAgICBcCisKKyNkZWZpbmUgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KSBcCisgICAgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgYkZyb21UeCk7CisKKyNkZWZpbmUgUlQyOFhYX1NUQV9TTEVFUF9USEVOX0FVVE9fV0FLRVVQKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKKworI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKSBcCisgICAgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHBBZCk7CisKKyNlbmRpZiAvL19fUlQyODYwX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjh4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIzMDQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaApAQCAtMCwwICsxLDI3MTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQyOHh4LmgKKworCUFic3RyYWN0OgorCVJUMjh4eCBBU0lDIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJICBXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBKYW4gTGVlICAgICAgICAgICBKYW4tMy0yMDA2ICAgICBjcmVhdGVkIGZvciBSVDI4NjBjCisqLworCisjaWZuZGVmCV9fUlQyOFhYX0hfXworI2RlZmluZQlfX1JUMjhYWF9IX18KKworCisvLworLy8gUENJIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAwMDAKKy8vCisjZGVmaW5lIFBDSV9DRkcJCQkweDAwMDAKKyNkZWZpbmUgUENJX0VFQ1RSTAkJCTB4MDAwNAorI2RlZmluZSBQQ0lfTUNVQ1RSTAkJCTB4MDAwOAorCisvLworLy8gU0NIL0RNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMjAwCisvLworLy8gSU5UX1NPVVJDRV9DU1I6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuIFdyaXRlIG9uZSB0byBjbGVhciBjb3JyZXNwb25kaW5nIGJpdAorLy8KKyNkZWZpbmUgRE1BX0NTUjAgICAgICAweDIwMAorI2RlZmluZSBJTlRfU09VUkNFX0NTUiAgICAgIDB4MjAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJOjE0OworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRCVFRJbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CS8vZGVsYXllZCBpbnRlcnJ1cHQsIG5vdCBpbnRlcnJ1cHQgdW50aWwgc2V2ZXJhbCBpbnQgb3IgdGltZSBsaW1pdCBoaXQKKwkJVUlOVDMyCQlSeERlbGF5SU5UOjE7IC8vZGVhbHllZCBpbnRlcnJ1cHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlUeERlbGF5SU5UOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOy8vNAorCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7IC8vIGJpdDcKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsvL2JpdCA5CisJCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAorCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7Ly9iaXQxNgorCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKKy8vCisjZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJVHhEZWxheToxOworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31JTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJOjIwOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBJTlRfTUFTS19DU1JfU1RSVUMsICpQSU5UX01BU0tfQ1NSX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX0dMT19DRkcgCTB4MjA4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlIRFJfU0VHX0xFTjoxNjsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCVdQRE1BQnVyc3RTSVpFOjI7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlUeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlFbmFibGVUeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7CisJCVVJTlQzMgkJUnhETUFCdXN5OjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKKwkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdQRE1BX1JTVF9JRFggCTB4MjBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJcnN2OjEwOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDQ6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDU6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RSWF9JRFgwOjE7CisJCVVJTlQzMiAgICAgICAJOjE1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OworCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisjZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKKyNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLy9NQUNfQ1NSMTMKKyNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCisjZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8vQUNfQksgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0CisjZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAorI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYworI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MCAJLy9BQ19CRSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDEgICAgICAweDAyNDQKKyNkZWZpbmUgVFhfQ1RYX0lEWDEgICAgICAgMHgwMjQ4CisjZGVmaW5lIFRYX0RUWF9JRFgxICAgICAgMHgwMjRjCisjZGVmaW5lIFRYX0JBU0VfUFRSMiAgICAgMHgwMjUwIAkvL0FDX1ZJIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMiAgICAgIDB4MDI1NAorI2RlZmluZSBUWF9DVFhfSURYMiAgICAgICAweDAyNTgKKyNkZWZpbmUgVFhfRFRYX0lEWDIgICAgICAweDAyNWMKKyNkZWZpbmUgVFhfQkFTRV9QVFIzICAgICAweDAyNjAgCS8vQUNfVk8gYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0CisjZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAorI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YworI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MCAJLy9IQ0NBIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UNCAgICAgIDB4MDI3NAorI2RlZmluZSBUWF9DVFhfSURYNCAgICAgICAweDAyNzgKKyNkZWZpbmUgVFhfRFRYX0lEWDQgICAgICAweDAyN2MKKyNkZWZpbmUgVFhfQkFTRV9QVFI1ICAgICAweDAyODAgCS8vTUdNVCBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgIFRYX01BWF9DTlQ1ICAgICAweDAyODQKKyNkZWZpbmUgVFhfQ1RYX0lEWDUgICAgICAgMHgwMjg4CisjZGVmaW5lIFRYX0RUWF9JRFg1ICAgICAgMHgwMjhjCisjZGVmaW5lIFRYX01HTVRNQVhfQ05UICAgICAgVFhfTUFYX0NOVDUKKyNkZWZpbmUgVFhfTUdNVENUWF9JRFggICAgICAgVFhfQ1RYX0lEWDUKKyNkZWZpbmUgVFhfTUdNVERUWF9JRFggICAgICBUWF9EVFhfSURYNQorI2RlZmluZSBSWF9CQVNFX1BUUiAgICAgMHgwMjkwIAkvL1JYIGJhc2UgYWRkcmVzcworI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0CisjZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4CisjZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKKyNkZWZpbmUgVVNCX0RNQV9DRkcgICAgICAweDAyYTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5IC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDEwMjQgYnl0ZXMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9VU0JfRE1BX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dUT3V0Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gVGltZU91dCAgaW4gdW5pdCBvZiAzM25zCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMjU2IGJ5dGVzCisJICAgIFVJTlQzMiAgcGh5Y2xlYXI6MTsgICAgICAgIAkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQorCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCisJICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4CisJICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKKwkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKKwkgICAgVUlOVDMyICBUeEJ1c3k6MTsgICAJLy9VU0IgRE1BIFRYIEZTTSBidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlVU0JfRE1BX0NGR19TVFJVQywgKlBVU0JfRE1BX0NGR19TVFJVQzsKKyNlbmRpZgorCisvLworLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCisvLworLy8KKy8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgorI2RlZmluZSAJUEJGX1NZU19DVFJMIAkgMHgwNDAwCisjZGVmaW5lICAgICBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgCVBCRl9NQVhfUENOVCAJIDB4MDQwQworI2RlZmluZSAJUEJGX0NUUkwJIAkweDA0MTAKKyNkZWZpbmUgCVBCRl9JTlRfU1RBCSAweDA0MTQKKyNkZWZpbmUgCVBCRl9JTlRfRU5BCSAweDA0MTgKKyNkZWZpbmUgCVRYUlhRX1BDTlQgIAkgMHgwNDM4CisjZGVmaW5lIAlQQkZfREJHIAkgCSAweDA0M2MKKyNkZWZpbmUgICAgIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCisKKy8vCisvLyAgNCAgTUFDICByZWdpc3RlcnMKKy8vCisvLworLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKKy8vCisjZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCisJICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQorI2RlZmluZSBNQUNfQUREUl9EVzAgICAgICAgICAgICAJCTB4MTAwOAkJLy8gTUFDIEFERFIgRFcwCisjZGVmaW5lIE1BQ19BRERSX0RXMSAgICAgICAgICAgCQkgMHgxMDBjCQkvLyBNQUMgQUREUiBEVzEKKy8vCisvLyBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19EVzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMF9TVFJVQywgKlBNQUNfRFcwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBNQUNfQ1NSMzogU1RBIE1BQyByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlSc3ZkMTsKKwkJVUNIQVIJCVUyTWVNYXNrOworCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlSc3ZkMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE1BQ19CU1NJRF9EVzAgICAgICAgICAgICAJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAorI2RlZmluZSBNQUNfQlNTSURfRFcxICAgICAgICAgICAgCQkweDEwMTQJCS8vIE1BQyBCU1NJRCBEVzEKKworLy8KKy8vIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJzdmQ6MTE7CisJCVVTSE9SVAkJTUJzc0Jjbk51bTozOworCQlVU0hPUlQJCUJzc0lkTW9kZToyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECisJCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVU0hPUlQgICAgICAJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgorI2RlZmluZSBCQlBfQ1NSX0NGRyAgICAgICAgICAgIAkJMHgxMDFjCQkvLworLy8KKy8vIEJCUF9DU1JfQ0ZHOiBCQlAgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjEyOworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCisJCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlCQlBfUEFSX0RVUjoxOwkJICAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcworCQlVSU5UMzIJCUJCUF9SV19NT0RFOjE7CQkvLyAwOiB1c2Ugc2VyaWFsIG1vZGUgIDE6cGFyYWxsZWwKKwkJVUlOVDMyCQk6MTI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQlBfQ1NSX0NGR19TVFJVQywgKlBCQlBfQ1NSX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMCAgICAgICAgICAgIAkJMHgxMDIwCisvLworLy8gUkZfQ1NSX0NGRzogUkYgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlTdGFuZGJ5TW9kZToxOwkJICAgIC8vIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOglsb3cgd2hlbiBzdGFuZGJ5CisJCVVJTlQzMgkJYml0d2lkdGg6NTsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCisJCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcxICAgICAgICAgICAJCTB4MTAyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKKwkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMiAgICAgICAgICAgCQkweDEwMjgJCS8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExFRF9DRkcgICAgICAgICAgIAkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTsKKwkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJcnN2OjI7CisJCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgorCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKKwkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQorCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQorLy8KKyNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cworCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAorCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgorCSAgICBVSU5UMzIgIHJzdjoyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cworI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQorI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCSAJLy8gQ291bnQgYXMgY2hhbm5lbCBidXN5CisjZGVmaW5lIFBCRl9MSUZFX1RJTUVSICAgICAgICAgICAgIDB4MTExMAkJIC8vVFgvUlggTVBEVSB0aW1lc3RhbXAgdGltZXIgKGZyZWUgcnVuKVVuaXQ6IDF1cworI2RlZmluZSBCQ05fVElNRV9DRkcgICAgICAgICAgICAgMHgxMTE0CQkgLy8gVFhSWF9DU1I5CisKKyNkZWZpbmUgQkNOX09GRlNFVDAJCQkJMHgwNDJDCisjZGVmaW5lIEJDTl9PRkZTRVQxCQkJCTB4MDQzMAorCisvLworLy8gQkNOX1RJTUVfQ0ZHIDogU3luY2hyb25pemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKKyAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7CisJCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKKwkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCZWFjb25JbnRlcnZhbDoxNjsgIC8vIGluIHVuaXQgb2YgMS8xNiBUVQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgOjM7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRCVFRfU1lOQ19DRkcgICAgICAgICAgICAweDExMTggIAkJLy8gdHhyeF9jc3IxMAorI2RlZmluZSBUU0ZfVElNRVJfRFcwICAgICAgICAgICAgIDB4MTExQyAgCQkvLyBMb2NhbCBUU0YgdGltZXIgbHNiIDMyIGJpdHMuIFJlYWQtb25seQorI2RlZmluZSBUU0ZfVElNRVJfRFcxICAgICAgICAgICAgIDB4MTEyMCAgCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgorI2RlZmluZSBUQlRUX1RJTUVSICAgICAgICAgICAgIAkweDExMjQgIAkJLy8gVEltZXIgcmVtYWlucyB0aWxsIG5leHQgVEJUVC4gUmVhZC1vbmx5LiAgVFhSWF9DU1IxNAorI2RlZmluZSBJTlRfVElNRVJfQ0ZHICAgICAgICAgICAgICAJMHgxMTI4ICAJCS8vCisjZGVmaW5lIElOVF9USU1FUl9FTiAgICAgICAgICAgICAJMHgxMTJjICAJCS8vICBHUC10aW1lciBhbmQgcHJlLXRidHQgSW50IGVuYWJsZQorI2RlZmluZSBDSF9JRExFX1NUQSAgICAgICAgICAgICAgCTB4MTEzMCAgCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKKyNkZWZpbmUgQ0hfQlVTWV9TVEEgICAgICAgICAgICAgIAkweDExMzQgIAkJLy8gIGNoYW5ubGUgYnVzeSB0aW1lCisvLworLy8gIDQuMiBNQUMgUE9XRVIgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMjAwKQorLy8KKyNkZWZpbmUgTUFDX1NUQVRVU19DRkcgICAgICAgICAgICAgMHgxMjAwCQkgLy8gb2xkIE1BQ19DU1IxMgorI2RlZmluZSBQV1JfUElOX0NGRyAgICAgICAgICAgICAweDEyMDQJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIEFVVE9fV0FLRVVQX0NGRyAgICAgICAgICAgICAweDEyMDgJCSAvLyBvbGQgTUFDX0NTUjEwCisvLworLy8gQVVUT19XQUtFVVBfQ0ZHOiBNYW51YWwgcG93ZXIgY29udHJvbCAvIHN0YXR1cyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTY7CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQXV0b0xlYWRUaW1lOjg7CisJCVVJTlQzMiAgICAgICBOdW1vZlNsZWVwaW5nVGJ0dDo3OyAgICAgICAgICAvLyBGb3JjZVdha2UgaGFzIGhpZ2ggcHJpdmlsZWdlIHRoYW4gUHV0VG9TbGVlcCB3aGVuIGJvdGggc2V0CisJCVVJTlQzMgkJRW5hYmxlQXV0b1dha2V1cDoxOwkvLyAwOnNsZWVwLCAxOmF3YWtlCisJCVVJTlQzMgkJOjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZW5kaWYKKy8vCisvLyAgNC4zIE1BQyBUWCAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEzMDApCisvLworCisjZGVmaW5lIEVEQ0FfQUMwX0NGRwkweDEzMDAJCS8vQUNfVFhPUF9DU1IwIDB4MzQ3NAorI2RlZmluZSBFRENBX0FDMV9DRkcJMHgxMzA0CisjZGVmaW5lIEVEQ0FfQUMyX0NGRwkweDEzMDgKKyNkZWZpbmUgRURDQV9BQzNfQ0ZHCTB4MTMwYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIDoxMjsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQ3dtYXg6NDsgICAgICAgIC8vdW5pdCBwb3dlciBvZiAyCisJICAgIFVJTlQzMiAgQ3dtaW46NDsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQWlmc246NDsgICAgICAgIC8vICMgb2Ygc2xvdCB0aW1lCisJICAgIFVJTlQzMiAgQWNUeG9wOjg7ICAgICAgICAvLyAgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICA6MTI7ICAgICAgIC8vCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKKyNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAorI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4CisjZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKKyNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0CisjZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAorI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJCS8vIDB4MSB1c2UgdXBwZXIgMjBNSHouIDAganVzZSBsb3dlciAyME1IegorI2RlZmluZSBUWF9TV19DRkcwCQkweDEzMzAKKyNkZWZpbmUgVFhfU1dfQ0ZHMQkJMHgxMzM0CisjZGVmaW5lIFRYX1NXX0NGRzIJCTB4MTMzOAorI2RlZmluZSBUWE9QX1RIUkVTX0NGRwkJMHgxMzNjCisjZGVmaW5lIFRYT1BfQ1RSTF9DRkcJCTB4MTM0MAorI2RlZmluZSBUWF9SVFNfQ0ZHCQkweDEzNDQKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9SVFNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwkgICAgVUlOVDMyICAgICAgIFJ0c1RocmVzOjE2OyAgICAvLyB1bml0OmJ5dGUKKwkgICAgVUlOVDMyICAgICAgIFJ0c0Zia0VuOjE7ICAgIC8vIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2Ojc7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1RJTUVPVVRfQ0ZHCTB4MTM0OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OworCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7CisJICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cworCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9SVFlfQ0ZHCTB4MTM0YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE7CisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFNob3J0UnR5TGltaXQ6ODsJLy8gIHNob3J0IHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5TGltaXQ6ODsJLy9sb25nIHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5VGhyZToxMjsJLy8gTG9uZyByZXRyeSB0aHJlc2hvb2xkCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgQWdnUnR5TW9kZToxOwkvLyBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgVHhhdXRvRkJFbmFibGU6MTsgICAgLy8gVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUWV9DRkdfU1RSVUMsICpQVFhfUlRZX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9MSU5LX0NGRwkweDEzNTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJeworCXN0cnVjdCBQQUNLRUQgeworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKKwkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLworCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVVTUZTRW5hYmxlOjE7CS8vICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykKKwkgICAgVUlOVDMyICAgICAgIFR4TVJRRW46MTsJLy8gIE1DUyByZXF1ZXN0IFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRlM6ODsJLy9yZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlcgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgSFRfRkJLX0NGRzAJMHgxMzU0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzZGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzBGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMQkweDEzNTgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9IVF9GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzExRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE1RkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMV9TVFJVQywgKlBIVF9GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMR19GQktfQ0ZHMAkweDEzNWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M3RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA2CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M0RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAzCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxNjsKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT0gUHJvdGVjdGlvbiBQYXJhbWF0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIENDS19QUk9UX0NGRwkweDEzNjQJCS8vQ0NLIFByb3RlY3Rpb24KKyNkZWZpbmUgQVNJQ19TSE9SVE5BVgkJMQorI2RlZmluZSBBU0lDX0xPTkdOQVYJCTIKKyNkZWZpbmUgQVNJQ19SVFMJCTEKKyNkZWZpbmUgQVNJQ19DVFMJCTIKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo1OworCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAorCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE9GRE1fUFJPVF9DRkcJMHgxMzY4CQkvL09GRE0gUHJvdGVjdGlvbgorI2RlZmluZSBNTTIwX1BST1RfQ0ZHCTB4MTM2QwkJLy9NTTIwIFByb3RlY3Rpb24KKyNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJCS8vTU00MCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGMjBfUFJPVF9DRkcJMHgxMzc0CQkvL0dGMjAgUHJvdGVjdGlvbgorI2RlZmluZSBHRjQwX1BST1RfQ0ZHCTB4MTM3OAkJLy9HUjQwIFByb3RlY3Rpb24KKyNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkJLy8KKyNkZWZpbmUgRVhQX0FDS19USU1FCTB4MTM4MAkJLy8KKworLy8KKy8vICA0LjQgTUFDIFJYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNDAwKQorLy8KKyNkZWZpbmUgUlhfRklMVFJfQ0ZHCTB4MTQwMAkJCS8vVFhSWF9DU1IwCisjZGVmaW5lIEFVVE9fUlNQX0NGRwkweDE0MDQJCQkvL1RYUlhfQ1NSNAorLy8KKy8vIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Cisgc3RydWN0IHsKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgICA6MjQ7CisgfSBmaWVsZDsKKyBVSU5UMzIgICB3b3JkOworfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTEVHQUNZX0JBU0lDX1JBVEUJMHgxNDA4CS8vICBUWFJYX0NTUjUgICAgICAgICAgIDB4MzA1NAorI2RlZmluZSBIVF9CQVNJQ19SQVRFCQkweDE0MGMKKyNkZWZpbmUgSFRfQ1RSTF9DRkcJCTB4MTQxMAorI2RlZmluZSBTSUZTX0NPU1RfQ0ZHCQkweDE0MTQKKyNkZWZpbmUgUlhfUEFSU0VSX0NGRwkJMHgxNDE4CS8vU2V0IE5BViBmb3IgYWxsIHJlY2VpdmVkIGZyYW1lcworCisvLworLy8gIDQuNSBNQUMgU2VjdXJpdHkgY29uZmlndXJhdGlvbiAob2Zmc2V0OjB4MTUwMCkKKy8vCisjZGVmaW5lIFRYX1NFQ19DTlQwCQkweDE1MDAJCS8vCisjZGVmaW5lIFJYX1NFQ19DTlQwCQkweDE1MDQJCS8vCisjZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CQkvLworLy8KKy8vICA0LjYgSENDQS9QU01QIChvZmZzZXQ6MHgxNjAwKQorLy8KKyNkZWZpbmUgVFhPUF9ITERSX0FERFIwCQkweDE2MDAKKyNkZWZpbmUgVFhPUF9ITERSX0FERFIxCQkweDE2MDQKKyNkZWZpbmUgVFhPUF9ITERSX0VUCQkweDE2MDgKKyNkZWZpbmUgUU9TX0NGUE9MTF9SQV9EVzAJCTB4MTYwYworI2RlZmluZSBRT1NfQ0ZQT0xMX0ExX0RXMQkJMHgxNjEwCisjZGVmaW5lIFFPU19DRlBPTExfUUMJCTB4MTYxNAorLy8KKy8vICA0LjcgTUFDIFN0YXRpc3RpcyByZWdpc3RlcnMgKG9mZnNldDoweDE3MDApCisvLworI2RlZmluZSBSWF9TVEFfQ05UMAkJMHgxNzAwCQkvLworI2RlZmluZSBSWF9TVEFfQ05UMQkJMHgxNzA0CQkvLworI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CQkvLworCisvLworLy8gUlhfU1RBX0NOVDBfU1RSVUM6IFJYIFBMQ1AgZXJyb3IgY291bnQgJiBSWCBDUkMgZXJyb3IgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGh5RXJyOworCSAgICBVU0hPUlQgIENyY0VycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIENyY0VycjsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIExPTkcgZnJhbWUgY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwkgICAgVVNIT1JUICBGYWxzZUNjYTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCSAgICBVU0hPUlQgIFBsY3BFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUlhfU1RBX0NOVDJfU1RSVUM6CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhEdXBsaUNvdW50OworCSAgICBVU0hPUlQgIFJ4Rmlmb092ZXJmbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMAkJMHgxNzBDCQkvLworLy8KKy8vIFNUQV9DU1IzOiBUWCBCZWFjb24gY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMQkJMHgxNzEwCQkvLworLy8KKy8vIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhTdWNjZXNzOworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQyCQkweDE3MTQJCS8vCisvLworLy8gVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0ZJRk8JCTB4MTcxOAkJLy8KKy8vCisvLyBUWF9TVEFfRklGT19TVFJVQzogVFggUmVzdWx0IGZvciBzcGVjaWZpYyBQSUQgc3RhdHVzIGZpZm8gcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwkJVUlOVDMyCQlUeEJGOjE7IC8vIDMqMworCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIGFjayByZXF1aXJlZAorCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggaXMgYWdncmVnYXRlZAorCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IHN1Y2Nlc3MuIHdoZXRoZXIgc3VjY2VzcyBvciBub3QKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJYlZhbGlkOjE7ICAgLy8gMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0CisJCVVJTlQzMiAgICAgICAJUGlkVHlwZTo0OworCQlVSU5UMzIgICAgICAgCVR4U3VjY2VzczoxOyAgIC8vIFR4IE5vIHJldHJ5IHN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFnZ3JlOjE7ICAgIC8vIFR4IFJldHJ5IFN1Y2Nlc3MKKwkJVUlOVDMyICAgICAgIAlUeEFja1JlcXVpcmVkOjE7ICAgIC8vIFR4IGZhaWwKKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorLy8JCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTY7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisJCVVJTlQzMgkJVHhCRjoxOworCQlVSU5UMzIJCVJlc2VydmU6MjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQJMHgxNzFjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dUeENvdW50OworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDAJMHgxNzIwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDFfU1RSVUMsICpQVFhfQUdHX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDIJMHgxNzI4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDMJMHgxNzJjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEwQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNQkweDE3MzQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDYJCTB4MTczOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNwkJMHgxNzNjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIE1QRFVfREVOU0lUWV9DTlQJCTB4MTc0MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFRYUlggY29udHJvbCByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgzMDAwCisvLworLy8gcnQyODYwYiAgVU5LTk9XTiByZWcgdXNlIFIvTyBSZWcgQWRkciAweDc3ZDAgZmlyc3QuLgorI2RlZmluZSBUWFJYX0NTUjEgICAgICAgICAgIDB4NzdkMAorCisvLworLy8gU2VjdXJpdHkga2V5IHRhYmxlIG1lbW9yeSwgYmFzZSBhZGRyZXNzID0gMHgxMDAwCisvLworI2RlZmluZSBNQUNfV0NJRF9CQVNFCQkweDE4MDAgLy84LWJ5dGVzKHVzZSBvbmx5IDYtYnl0ZXMpICogMjU2IGVudHJ5ID0KKyNkZWZpbmUgSFdfV0NJRF9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSAgICAgMHg0MDAwICAgICAgLy8gMzItYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19LRVlfRU5UUllfU0laRSAgICAgICAgICAgMHgyMAorI2RlZmluZSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19JVkVJVl9FTlRSWV9TSVpFICAgOAorI2RlZmluZSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSAgICAgMHg2ODAwICAgICAgLy8gNC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX1dDSURfQVRUUklfU0laRSAgIDQKKyNkZWZpbmUgV0NJRF9SRVNFUlZFRCAgICAgICAgICAJCTB4NmJmYworI2RlZmluZSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgICAgICAgMHg2YzAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwICAgICAgLy8gMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUKKyNkZWZpbmUgSFdfU0hBUkVEX0tFWV9NT0RFX1NJWkUgICA0CisjZGVmaW5lIFNIQVJFREtFWVRBQkxFCQkJMAorI2RlZmluZSBQQUlSV0lTRUtFWVRBQkxFCQkJMQorCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQnNzMEtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMEtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTFDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTJDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCQlVSU5UMzIgICAgICAgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJVUlOVDMyICAgICAgIDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZW5kaWYKKy8vIDY0LWVudHJ5IGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK3R5cGVkZWYgc3RydWN0IF9IV19XQ0lEX0VOVFJZIHsgIC8vIDgtYnl0ZSBwZXIgZW50cnkKKyAgICBVQ0hBUiAgIEFkZHJlc3NbNl07CisgICAgVUNIQVIgICBSc3ZbMl07Cit9IEhXX1dDSURfRU5UUlksIFBIV19XQ0lEX0VOVFJZOworCisKKworLy8KKy8vIE90aGVyIG9uLWNoaXAgc2hhcmVkIG1lbW9yeSBzcGFjZSwgYmFzZSA9IDB4MjAwMAorLy8KKworLy8gQ0lTIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHgyMDAwCisjZGVmaW5lIEhXX0NJU19CQVNFICAgICAgICAgICAgIDB4MjAwMAorCisvLyBDYXJyaWVyLXNlbnNlIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBjYXJyaWVyLXNlbnNlIGZyYW1lIGZvciBjYXJyaWVyLXNlbnNlIGZ1bmN0aW9uLgorI2RlZmluZSBIV19DU19DVFNfQkFTRQkJCTB4NzcwMAorLy8gREZTIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBDVFMgZnJhbWUgZm9yIERGUy4KKyNkZWZpbmUgSFdfREZTX0NUU19CQVNFCQkJMHg3NzgwCisjZGVmaW5lIEhXX0NUU19GUkFNRV9TSVpFCQkweDgwCisKKy8vIDIwMDQtMTEtMDggam9obiAtIHNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSkuIFdlIHN0ZWFsIDE2IHRhaWwgYnl0ZXMKKy8vIHRvIHNhdmUgZGVidWdnaW5nIHNldHRpbmdzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRSAgIDB4NzdmMCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UyICAgMHg3NzcwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisKKy8vIEluIG9yZGVyIHRvIHN1cHBvcnQgbWF4aW11bSA4IE1CU1MgYW5kIGl0cyBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgZm9yIGVhY2ggYmVhY29uCisvLyBUaHJlZSBzZWN0aW9uIGRpc2NvbnRpbnVlIG1lbW9yeSBzZWdtZW50cyB3aWxsIGJlIHVzZWQuCisvLyAxLiBUaGUgb3JpZ2luYWwgcmVnaW9uIGZvciBCQ04gMH4zCisvLyAyLiBFeHRyYWN0IG1lbW9yeSBmcm9tIEZDRSB0YWJsZSBmb3IgQkNOIDR+NQorLy8gMy4gRXh0cmFjdCBtZW1vcnkgZnJvbSBQYWlyLXdpc2Uga2V5IHRhYmxlIGZvciBCQ04gNn43CisvLwkgIEl0IG9jY3VwaWVkIHRob3NlIG1lbW9yeSBvZiB3Y2lkIDIzOH4yNTMgZm9yIEJDTiA2CisvLwkJCQkJCSAgICAgIGFuZCB3Y2lkIDIyMn4yMzcgZm9yIEJDTiA3CisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MTAwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDdBMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3QzAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N0UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDcyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3NDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4NURDMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDVCQzAKKworI2RlZmluZSBIV19CRUFDT05fTUFYX0NPVU5UICAgICA4CisjZGVmaW5lIEhXX0JFQUNPTl9PRkZTRVQJCTB4MDIwMAorI2RlZmluZSBIV19CRUFDT05fQ09OVEVOVF9MRU4JKEhXX0JFQUNPTl9PRkZTRVQgLSBUWFdJX1NJWkUpCisKKy8vIEhPU1QtTUNVIHNoYXJlZCBtZW1vcnkgLSBiYXNlIGFkZHJlc3MgPSAweDIxMDAKKyNkZWZpbmUgSE9TVF9DTURfQ1NSCQkweDQwNAorI2RlZmluZSBIMk1fTUFJTEJPWF9DU1IgICAgICAgICAweDcwMTAKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ0lEICAgICAgICAgMHg3MDE0CisjZGVmaW5lIEgyTV9NQUlMQk9YX1NUQVRVUyAgICAgIDB4NzAxYworI2RlZmluZSBIMk1fSU5UX1NSQyAgICAgICAgICAgICAweDcwMjQKKyNkZWZpbmUgSDJNX0JCUF9BR0VOVCAgICAgICAgICAgMHg3MDI4CisjZGVmaW5lIE0ySF9DTURfRE9ORV9DU1IgICAgICAgIDB4MDAwYworI2RlZmluZSBNQ1VfVFhPUF9BUlJBWV9CQVNFICAgICAweDAwMGMgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX1RYT1BfRU5UUllfU0laRSAgICAgMzIgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1BWF9OVU1fT0ZfVFhPUF9FTlRSWSAgIDE2ICAgICAgIC8vIFRPRE86IG11c3QgYmUgc2FtZSB3aXRoIDgwNTEgZmlybXdhcmUKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTiAgICAgICAgMHgwMSAgICAgLy8gVE9ETzogdG8gYmUgY29uZmlybWVkIGJ5IEFsYmVydAorI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OX09GRlNFVCA1ICAgICAgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKKworLy8KKy8vIEhvc3QgRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDIwMCAuICBUWDAtMz1FRENBUWlkMC0zLCBUWDQ9SENDQSwgVFg1PU1HTVQsCisvLworLy8KKy8vICBETUEgUklORyBERVNDUklQVE9SCisvLworI2RlZmluZSBFMlBST01fQ1NSICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJT19DTlRMX0NTUiAgICAgICAgIDB4NzdkMAorCisjaWZkZWYgUlQyODYwCisvLyA4MDUxIGZpcm13YXJlIGltYWdlIGZvciBSVDI4NjAgLSBiYXNlIGFkZHJlc3MgPSAweDQwMDAKKyNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgyMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MjAwMCAgICAvLyA4a2J5dGUKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUeCAvCVJ4IC8gTWdtdCByaW5nIGRlc2NyaXB0b3IgZGVmaW5pdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZm9sbG93aW5nIFBJRCB2YWx1ZXMgYXJlIHVzZWQgdG8gbWFyayBvdXRnb2luZyBmcmFtZSB0eXBlIGluIFRYRC0+UElEIHNvIHRoYXQKKy8vIHByb3BlciBUWCBzdGF0aXN0aWNzIGNhbiBiZSBjb2xsZWN0ZWQgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcworLy8gYjMtMiBvZiBQSUQgZmllbGQgLQorI2RlZmluZSBQSURfTUdNVAkJCTB4MDUKKyNkZWZpbmUgUElEX0JFQUNPTgkJCTB4MGMKKyNkZWZpbmUgUElEX0RBVEFfTk9STUFMVUNBU1QJIAkweDAyCisjZGVmaW5lIFBJRF9EQVRBX0FNUERVCSAJMHgwNAorI2RlZmluZSBQSURfREFUQV9OT19BQ0sgICAgCTB4MDgKKyNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCSAJMHgwMworLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQorI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQkJQICYgUkYJZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAorI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCisjZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKKyNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMworI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0CisjZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKKyNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgorI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3CisjZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKKyNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQorI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAorI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQorI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgorI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMworI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAorI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQorI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgorI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNworI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAorI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQorI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAorI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQorI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgorI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMworI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAorI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQorI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgorI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNworI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAorI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQorI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAorI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQorCisjZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KKyNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQorI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKKyNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQorI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKKyNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1CisjZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2CisjZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQorI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKKyNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAorI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMworI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKKyNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgorI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKKyNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQorI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKKyNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgorI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCisKKworI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCisKKyNkZWZpbmUgUlNTSV9GT1JfVkVSWV9MT1dfU0VOU0lCSUxJVFkgLTM1CisjZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWSAgICAgIC01OAorI2RlZmluZSBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZICAtODAKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1NFTlNJQklMSVRZICAgICAgLTkwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRUVQUk9NIGRlZmluaXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFRURPICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFRURJICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFRUNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFRVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFRVJMICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREUgICAgICAgICAweDA1CisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgICAgICAgICAweDA2CisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERSAgICAgICAgICAweDEwCisjZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERSAgICAgICAgICAweDEzCisKKyNkZWZpbmUJTlVNX0VFUFJPTV9CQlBfUEFSTVMJCTE5CQkJLy8gSW5jbHVkZSBOSUMgQ29uZmlnIDAsIDEsIENSLCBUWCBBTEMgc3RlcCwgQkJQcworI2RlZmluZQlOVU1fRUVQUk9NX1RYX0dfUEFSTVMJCTcKKyNkZWZpbmUJRUVQUk9NX05JQzFfT0ZGU0VUICAgICAgICAgIDB4MzQJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECisjZGVmaW5lCUVFUFJPTV9OSUMyX09GRlNFVCAgICAgICAgICAweDM2CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fQkJQX0JBU0VfT0ZGU0VUCQkweGYwCQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fR19UWF9QV1JfT0ZGU0VUCQkweDUyCisjZGVmaW5lCUVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUCQkweDYwCisjZGVmaW5lIEVFUFJPTV9MRUQxX09GRlNFVAkJCTB4M2MKKyNkZWZpbmUgRUVQUk9NX0xFRDJfT0ZGU0VUCQkJMHgzZQorI2RlZmluZSBFRVBST01fTEVEM19PRkZTRVQJCQkweDQwCisjZGVmaW5lIEVFUFJPTV9MTkFfT0ZGU0VUCQkJMHg0NAorI2RlZmluZSBFRVBST01fUlNTSV9CR19PRkZTRVQJCTB4NDYKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQV9PRkZTRVQJCTB4NGEKKyNkZWZpbmUgRUVQUk9NX0RFRklORV9NQVhfVFhQV1IJCTB4NGUKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcJMHhkZQkvLyAyME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RwkweGVlCS8vIDQwTUhaIDIuNEcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RwkJMHhmYQkvLyAyME1IWiA1RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHCQkweDEwYQkvLyA0ME1IWiA1RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCAgICAgIDB4NzgKKyNkZWZpbmUgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgICAgICAweGE2CisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OX09GRlNFVCAgICAgICAweDAyCisjZGVmaW5lCUVFUFJPTV9GUkVRX09GRlNFVAkJCTB4M2EKKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFIAkweGRlCS8vIDIwTUhaIHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvLyAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouCisjZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCisKKy8vIFBhaXJLZXlNb2RlIGRlZmluaXRpb24KKyNkZWZpbmUgUEtNT0RFX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEtNT0RFX1dFUDY0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEtNT0RFX1dFUDEyOCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUEtNT0RFX1RLSVAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEtNT0RFX0FFUyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUEtNT0RFX0NLSVA2NCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUEtNT0RFX0NLSVAxMjggICAgICAgICAgICAgIDYKKyNkZWZpbmUgUEtNT0RFX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gV0NJRCAgZm9ybWF0CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vNy4xCVdDSUQgIEVOVFJZICBmb3JtYXQgIDogOGJ5dGVzCit0eXBlZGVmCXN0cnVjdAlfV0NJRF9FTlRSWV9TVFJVQyB7CisJVUNIQVIJCVJYQkFCaXRtYXA3OyAgICAvLyBiaXQwIGZvciBUSUQ4LCBiaXQ3IGZvciBUSUQgMTUKKwlVQ0hBUgkJUlhCQUJpdG1hcDA7ICAgIC8vIGJpdDAgZm9yIFRJRDAsIGJpdDcgZm9yIFRJRCA3CisJVUNIQVIJCU1BQ1s2XTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQorfQlXQ0lEX0VOVFJZX1NUUlVDLCAqUFdDSURfRU5UUllfU1RSVUM7CisKKy8vOC4xLjEJU0VDVVJJVFkgIEtFWSAgZm9ybWF0ICA6IDhEVworLy8gMzItYnl0ZSBwZXIgZW50cnksIHRvdGFsIDE2LWVudHJ5IGZvciBzaGFyZWQga2V5IHRhYmxlLCA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit0eXBlZGVmIHN0cnVjdCBfSFdfS0VZX0VOVFJZIHsgICAgICAgICAgLy8gMzItYnl0ZSBwZXIgZW50cnkKKyAgICBVQ0hBUiAgIEtleVsxNl07CisgICAgVUNIQVIgICBUeE1pY1s4XTsKKyAgICBVQ0hBUiAgIFJ4TWljWzhdOworfSBIV19LRVlfRU5UUlksICpQSFdfS0VZX0VOVFJZOworCisvLzguMS4yCUlWL0VJViAgZm9ybWF0ICA6IDJEVworCisvLzguMS4zCVJYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQgIDogMURXCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJX01BQ19BVFRSSUJVVEVfU1RSVUMgeworCVVJTlQzMgkJcnN2OjIyOworCVVJTlQzMgkJUlhXSVVERjozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVBhaXJLZXlNb2RlOjM7CisJVUlOVDMyCQlLZXlUYWI6MTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQorfQlNQUNfQVRUUklCVVRFX1NUUlVDLCAqUE1BQ19BVFRSSUJVVEVfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJX01BQ19BVFRSSUJVVEVfU1RSVUMgeworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKKwlVSU5UMzIJCVBhaXJLZXlNb2RlOjM7CisJVUlOVDMyCQlCU1NJRElkeDozOyAvL211bHRpcGxlQlNTIGluZGV4IGZvciB0aGUgV0NJRAorCVVJTlQzMgkJUlhXSVVERjozOworCVVJTlQzMgkJcnN2OjIyOworfQlNQUNfQVRUUklCVVRFX1NUUlVDLCAqUE1BQ19BVFRSSUJVVEVfU1RSVUM7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KKy8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCisjZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCisKKy8vCisvLyBUWCBkZXNjcmlwdG9yIGZvcm1hdCwgVHgJcmluZywgTWdtdCBSaW5nCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVNEUHRyMDsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCURNQURPTkU6MTsKKwlVSU5UMzIJCUxhc3RTZWMwOjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlCdXJzdDoxOworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCVNETGVuMToxNDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCUlDTzoxOworCVVJTlQzMgkJVUNPOjE7CisJVUlOVDMyCQlUQ086MTsKKwlVSU5UMzIJCXJzdjoyOworCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJcnN2MjoyNDsKK30JVFhEX1NUUlVDLCAqUFRYRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZAkxCisJVUlOVDMyCQlTRExlbjE6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMToxOworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCVNETGVuMDoxNDsKKwlVSU5UMzIJCUxhc3RTZWMwOjE7CisJVUlOVDMyCQlETUFET05FOjE7CisJLy9Xb3JkMgorCVVJTlQzMgkJU0RQdHIxOworCS8vV29yZDMKKwlVSU5UMzIJCXJzdjI6MjQ7CisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVRDTzoxOwkvLworCVVJTlQzMgkJVUNPOjE7CS8vCisJVUlOVDMyCQlJQ086MTsJLy8KK30JVFhEX1NUUlVDLCAqUFRYRF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBUWEQgV2lyZWxlc3MgSW5mb3JtYXRpb24gZm9ybWF0IGZvciBUeCByaW5nIGFuZCBNZ210IFJpbmcKKy8vCisvL3R4b3AgOiBmb3IgdHhvcCBtb2RlCisvLyAwOnR4b3AgZm9yIHRoZSBNUERVIGZyYW1lIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDIGJ5IHJlZ2lzdGVyCisvLyAxLzIvMzp0aGUgTVBEVSBmcmFtZSBpcyBzZW5kIGFmdGVyIFBJRlMvYmFja29mZi9TSUZTCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVBIWU1PREU6MjsKKwlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCisJVUlOVDMyCQlyc3YyOjE7CisJVUlOVDMyCQlJZnM6MTsJLy8KKwlVSU5UMzIJCVNUQkM6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlNQ1M6NzsKKworCVVJTlQzMgkJcnN2OjY7CisJVUlOVDMyCQl0eG9wOjI7CS8vdHggYmFjayBvZmYgbW9kZSAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCVVJTlQzMgkJQU1QRFU6MTsKKworCVVJTlQzMgkJVFM6MTsKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJLy8gV29yZCAxCisJVUlOVDMyCQlQYWNrZXRJZDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlBQ0s6MTsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCUlWOworCS8vIFdvcmQgMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KKwlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlUUzoxOworCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlyc3Y6NjsKKworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQorCVVJTlQzMgkJSWZzOjE7CS8vCisJVUlOVDMyCQlyc3YyOjE7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJUEhZTU9ERToyOworCS8vIFdvcmQJMQorCVVJTlQzMgkJQUNLOjE7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlCQVdpblNpemU6NjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVBhY2tldElkOjQ7CisJLy9Xb3JkMgorCVVJTlQzMgkJSVY7CisJLy9Xb3JkMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBSeCBkZXNjcmlwdG9yIGZvcm1hdCwgUngJUmluZworLy8KKyNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYRF9TVFJVQwl7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFAwOworCS8vIFdvcmQgMQorCVVJTlQzMgkJRERPTkU6MTsKKwlVSU5UMzIJCUxTMDoxOworCVVJTlQzMgkJU0RMMDoxNDsKKwlVSU5UMzIJCVJzdjoyOworCVVJTlQzMgkJU0RMMToxNDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCVNEUDE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlSc3YxOjEzOworCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ly8gVG8gYmUgbW92ZWQKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsJLy8gdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCVJTU0k6MTsKKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4gb2Jzb2xldGUuCisJVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKKwlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUKKwlVSU5UMzIJCVUyTToxOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJREFUQToxOworCVVJTlQzMgkJQkE6MTsKKworfQlSWERfU1RSVUMsICpQUlhEX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQMDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCVNETDE6MTQ7CisJVUlOVDMyCQlSc3Y6MjsKKwlVSU5UMzIJCVNETDA6MTQ7CisJVUlOVDMyCQlMUzA6MTsKKwlVSU5UMzIJCURET05FOjE7CisJLy8gV29yZAkyCisJVUlOVDMyCQlTRFAxOworCS8vIFdvcmQJMworCVVJTlQzMgkJQkE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgorCVVJTlQzMgkJSFRDOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlMMlBBRDoxOworCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCURlY3J5cHRlZDoxOwkvLyB0aGlzIGZyYW1lIGlzIGJlaW5nIGRlY3J5cHRlZC4KKwlVSU5UMzIJCVBsY3BTaWduYWw6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlQbGNwUnNzaWw6MTsvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJUnN2MToxMzsKK30JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworI2VuZGlmCisjZW5kaWYgLy8gUlQyODYwIC8vCisvLworLy8gUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkIDAKKwlVSU5UMzIJCVRJRDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJS2V5SW5kZXg6MjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlTVEJDOjI7CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlTRVFVRU5DRToxMjsKKwlVSU5UMzIJCUZSQUc6NDsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCXJzdjE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlSU1NJMTo4OworCVVJTlQzMgkJUlNTSTA6ODsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCXJzdjI6MTY7CisJVUlOVDMyCQlTTlIxOjg7CisJVUlOVDMyCQlTTlIwOjg7Cit9CVJYV0lfU1RSVUMsICpQUlhXSV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJS2V5SW5kZXg6MjsKKwlVSU5UMzIJCUJTU0lEOjM7CisJVUlOVDMyCQlVREY6MzsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVRJRDo0OworCS8vIFdvcmQJMQorCVVJTlQzMgkJRlJBRzo0OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlNQ1M6NzsKKwlVSU5UMzIJCUJXOjE7CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlTVEJDOjI7CisJVUlOVDMyCQlyc3Y6MzsKKwlVSU5UMzIJCVBIWU1PREU6MjsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCS8vV29yZDIKKwlVSU5UMzIJCVJTU0kwOjg7CisJVUlOVDMyCQlSU1NJMTo4OworCVVJTlQzMgkJUlNTSTI6ODsKKwlVSU5UMzIJCXJzdjE6ODsKKwkvL1dvcmQzCisJVUlOVDMyCQlTTlIwOjg7CisJVUlOVDMyCQlTTlIxOjg7CisJVUlOVDMyCQlyc3YyOjE2OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEhPU1QtTUNVIGNvbW11bmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLworLy8gSDJNX01BSUxCT1hfQ1NSOiBIb3N0LXRvLU1DVSBNYWlsYm94CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIE93bmVyOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OyAgICAvLyAweGZmIHRlbGxzIE1DVSBub3QgdG8gcmVwb3J0IENtZERvbmVJbnQgYWZ0ZXIgZXhjdXRpbmcgdGhlIGNvbW1hbmQKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBMb3dCeXRlOjg7CisgICAgfSAgIGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiAgX0gyTV9NQUlMQk9YX1NUUlVDIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgSGlnaEJ5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgeworICAgIHN0cnVjdCAgeworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4wOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4xOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4yOworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW4zOworICAgIH0gZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBNMkhfQ01EX0RPTkVfU1RSVUMsICpQTTJIX0NNRF9ET05FX1NUUlVDOworI2VuZGlmCisKKworCisvLworLy8gTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7CisJc3RydWN0CXsKKwkJVUNIQVIJCVBvbGFyaXR5OjE7CisJCVVDSEFSCQlMZWRNb2RlOjc7CisJfSBmaWVsZDsKKwlVQ0hBUgkJCQl3b3JkOworfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlMZWRNb2RlOjc7CisJCVVDSEFSCQlQb2xhcml0eToxOworCX0gZmllbGQ7CisJVUNIQVIJCQl3b3JkOworfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOworI2VuZGlmCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFJlZ2lzdGVyIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisvL05BVl9USU1FX0NGRyA6TkFWCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCXJzdjo2OworCQlVU0hPUlQJCVplcm9TaWZzOjE7ICAgICAgICAgICAgICAgLy8gQXBwbGllZCB6ZXJvIFNJRlMgdGltZXIgYWZ0ZXIgT0ZETSBSWCAwOiBkaXNhYmxlCisJCVVTSE9SVAkJRWlmczo5OyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUiAgICAgICBTbG90VGltZTsgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVDSEFSCQlTaWZzOyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlTaWZzOyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUiAgICAgICBTbG90VGltZTsgICAgLy8gaW4gdW5pdCBvZiAxLXVzCisJCVVTSE9SVAkJRWlmczo5OyAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCVplcm9TaWZzOjE7ICAgICAgICAgICAgICAgLy8gQXBwbGllZCB6ZXJvIFNJRlMgdGltZXIgYWZ0ZXIgT0ZETSBSWCAwOiBkaXNhYmxlCisJCVVTSE9SVAkJcnN2OjY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOworI2VuZGlmCisKKworCisKKworLy8KKy8vIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxNTsKKwkJVUlOVDMyICAgICAgIERyb3BSc3ZDbnRsVHlwZToxOworCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisJCVVJTlQzMgkJRHJvcFBzUG9sbDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcFJ0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wQ3RzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmQ6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wRHVwbGljYXRlOjE7CQkvLyBEcm9wIGR1cGxpY2F0ZSBmcmFtZQorCQlVSU5UMzIJCURyb3BCY2FzdDoxOwkJLy8gRHJvcCBicm9hZGNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wVmVyRXJyOjE7CSAgICAvLyBEcm9wIHZlcnNpb24gZXJyb3IgZnJhbWUKKworCQlVSU5UMzIJCURyb3BOb3RNeUJTU0lEOjE7CQkJLy8gRHJvcCBmcmFtIFRvRHMgYml0IGlzIHRydWUKKwkJVUlOVDMyCQlEcm9wTm90VG9NZToxOwkJLy8gRHJvcCBub3QgdG8gbWUgdW5pY2FzdCBmcmFtZQorCQlVSU5UMzIJCURyb3BQaHlFcnI6MTsJCS8vIERyb3AgcGh5c2ljYWwgZXJyb3IKKwkJVUlOVDMyCQlEcm9wQ1JDRXJyOjE7CQkvLyBEcm9wIENSQyBlcnJvcgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9GSUxUUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisKKwkJVUlOVDMyCQlEcm9wVmVyRXJyOjE7CSAgICAvLyBEcm9wIHZlcnNpb24gZXJyb3IgZnJhbWUKKwkJVUlOVDMyCQlEcm9wTWNhc3Q6MTsJCS8vIERyb3AgbXVsdGljYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BCY2FzdDoxOwkJLy8gRHJvcCBicm9hZGNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKworCQlVSU5UMzIJCURyb3BDRkVuZEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ3RzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKworCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BCQToxOwkJLy8KKyAgICAgICAgCVVJTlQzMiAgICAgICAJRHJvcEJBUjoxOyAgICAgICAvLworCisJCVVJTlQzMiAgICAgICAJRHJvcFJzdkNudGxUeXBlOjE7CisJCVVJTlQzMgkJOjE1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisvLworLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cworCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KKwkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKKyAgICAgICAgVUlOVDMyICAgICAgIDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjI0OworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDCisvLworCisKKworLy8KKy8vIEUyUFJPTV9DU1I6IEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUnN2ZDoyNTsKKwkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQorCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgorCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJRWVwcm9tREk6MTsKKwkJVUlOVDMyCQlFZXByb21DUzoxOworCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJCVVJTlQzMgkJRWVwcm9tU0s6MTsKKwkJVUlOVDMyCQlFZXByb21DUzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tRE86MTsKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQorCQlVSU5UMzIJCVJzdmQ6MjU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRTJQUk9NIGRhdGEgbGF5b3V0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBFRVBST00gYW50ZW5uYSBzZWxlY3QgZm9ybWF0CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQgICAgICBSc3Y6NDsKKwkJVVNIT1JUICAgICAgUmZJY1R5cGU6NDsgICAgICAgICAgICAgLy8gc2VlIEUyUFJPTSBkb2N1bWVudAorCQlVU0hPUlQJCVR4UGF0aDo0OwkvLyAxOiAxVCwgMjogMlQKKwkJVVNIT1JUCQlSeFBhdGg6NDsJLy8gMTogMVIsIDI6IDJSLCAzOiAzUgorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0FOVEVOTkFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fQU5URU5OQV9TVFJVQywgKlBFRVBST01fQU5URU5OQV9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworICAgICAgICBVU0hPUlQJCVJzdjI6NjsJCQkJCS8vIG11c3QgYmUgMAorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQorCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAorCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKKwkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQorCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDVHCisJCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RworCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIFdoZXRoZXIgUkYgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgb3IgSFcuIDE6ZW5hYmxlIGh3IGNvbnRyb2wsIDA6ZGlzYWJsZQorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJeworCXN0cnVjdCB7CisJCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gMTplbmFibGUsIDA6ZGlzYWJsZQorCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCQkvLworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQorCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlSc3YyOjY7ICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFRYX1BXUiBWYWx1ZSB2YWxpZCByYW5nZSAweEZBKC02KSB+IDB4MjQoMzYpCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWF9QV1JfU1RSVUMJeworCXN0cnVjdAl7CisJCUNIQVIJQnl0ZTE7CQkJCS8vIEhpZ2ggQnl0ZQorCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUwOwkJCQkvLyBMb3cgQnl0ZQorCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQorCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9WRVJTSU9OX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglGYWVSZWxlYXNlTnVtYmVyOwkvLyBMb3cgQnl0ZQorCQlVQ0hBUglWZXJzaW9uOwkJCS8vIEhpZ2ggQnl0ZQorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAorCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzQ6MTsJLy8gUG9sYXJpdHkgR1BJTyM0IHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzE6MTsJLy8gUG9sYXJpdHkgR1BJTyMxIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5QUNUOjE7CQkvLyBQb2xhcml0eSBBQ1Qgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9HOjE7CQkvLyBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLgorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fTEVEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0E6MTsJCS8vIFBvbGFyaXR5IFJEWV9BIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMDoxOwkvLyBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzI6MTsJLy8gUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMzoxOwkvLyBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJTGVkTW9kZTo1OwkJCS8vIExlZCBtb2RlLgorCQlVU0hPUlQJUnN2ZDozOwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVVNIT1JUCXdvcmQ7Cit9CUVFUFJPTV9MRURfU1RSVUMsICpQRUVQUk9NX0xFRF9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCVR4UG93ZXJFbmFibGU6MTsvLyBFbmFibGUKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJRGVsdGFWYWx1ZTo2OwkvLyBUeCBQb3dlciBkYWx0YSB2YWx1ZSAoTUFYPTQpCisJfQlmaWVsZDsKKwlVQ0hBUgl2YWx1ZTsKK30JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCQlVQ0hBUglUeXBlOjE7CQkJLy8gMTogcGx1cyB0aGUgZGVsdGEgdmFsdWUsIDA6IG1pbnVzIHRoZSBkZWx0YSB2YWx1ZQorCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJfQlmaWVsZDsKKwlVQ0hBUgl2YWx1ZTsKK30JRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IwOiBUWE9QIGhvbGRlciBhZGRyZXNzMCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJUnN2ZDE7CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCVJzdmQwOworCQlVQ0hBUgkJUnN2ZDE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAorCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECisJCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCisJfQlmaWVsZDsKKwlVSU5UCXdvcmQ7Cit9CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQorCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCisJCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCisJfQlmaWVsZDsKKwlVSU5UCXdvcmQ7Cit9CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZW5kaWYJLy8gX19SVDI4WFhfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYwpAQCAtMCwwICsxLDYwMjUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIFJBTElOS19BVEUKK1VDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgvKiBEYXRhIHR5cGUgKi8sMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweEFBLDB4QkIsMHgxMiwweDM0LDB4NTYsMHgwMCwweDExLDB4MjIsMHhBQSwweEJCLDB4Q0MsMHgwMCwweDAwfTsJLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOworCitzdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCitzdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCitzdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCisKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBSeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpOworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCk7CisKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpOworCitzdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCUlOIFVDSEFSIE1vZGUsCisJSU4gVUNIQVIgTWNzKTsKKworI2lmZGVmIFJUMjg2MAorc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09ZW5kIG9mIHByb3RvdHlwZT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgUlQyODYwCitzdGF0aWMgSU5UIFR4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQorCWlmIChHbG9DZmcuZmllbGQuVHhETUFCdXN5KQorCQlyZXN1bHQgPSAxOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBJTlQgUnhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJaWYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kpCisJCXJlc3VsdCA9IDE7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKQoreworCUJPT0xFQU4gdmFsdWU7CisJVUxPTkcgV2FpdENudDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKworCXZhbHVlID0gRW5hYmxlID4gMCA/IDEgOiAwOworCisJLy8gY2hlY2sgRE1BIGlzIGluIGJ1c3kgbW9kZS4KKwlXYWl0Q250ID0gMDsKKwl3aGlsZSAoVHhEbWFCdXN5KHBBZCkgfHwgUnhEbWFCdXN5KHBBZCkpCisJeworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwkJaWYgKFdhaXRDbnQrKyA+IDEwMCkKKwkJCWJyZWFrOworCX0KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSB2YWx1ZTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSB2YWx1ZTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CS8vIGFib3J0IGFsbCBUWCByaW5ncworCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIEJicERhdGEgPSAwOworCisJLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJVUNIQVIgTW9kZSwKKwlVQ0hBUiBNY3MpCit7CisJaW50IGk7CisJUENIQVIgcFJhdGVUYWI7CisKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCXBSYXRlVGFiID0gQ0NLUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBSYXRlVGFiID0gT0ZETVJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCXBSYXRlVGFiID0gSFRNSVhSYXRlVGFibGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInVucmVjb2duaXphYmxlIFR4IE1vZGUgJWRcbiIsIE1vZGUpKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCWkgPSAwOworCXdoaWxlKHBSYXRlVGFiW2ldICE9IC0xKQorCXsKKwkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMQorc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisJQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChUeFBvd2VyID4gMzEpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAzMTsKKwkJCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMDsKKwkJCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gMCB+IDMxCisJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisJCX0KKwkJZWxzZS8vIDUuNSBHSHoKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAxNSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQorCQkJCS8vCisJCQkJUiA9IDE1OworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAKKwkJCQkvLworCQkJCS8vIC0xIH4gLTcKKwkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKKwkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7CisJCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMTUKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFIpKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCXsKKwkJCQlSID0gUiA8PCA5OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUiA9IFIgPDwgNjsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJfQorCQl9CisJCWVsc2UvLyA1LjVHSHoKKwkJeworCQkJaWYgKGJQb3dlclJlZHVjZSA9PSBGQUxTRSkKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlSID0gKFIgPDwgMTApOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCisJCQkJCS8qIENsZWFyIGJpdCA5IG9mIFIzIHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSAoUiAmICh+KDEgPDwgOSkpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCisJCQkJCS8qIENsZWFyIGJpdCA2IG9mIFI0IHRvIHJlZHVjZSA3ZEIuICovCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSAoUiAmICh+KDEgPDwgNikpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJcmV0dXJuIDA7CisJfQorfQorI2Vsc2UvLyAxIC8vCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KQoreworCVVMT05HIFI7CisJQ0hBUiBUeFBvd2VyOworCVVDSEFSIEJicDk0ID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLy8gVE9ETzogaG93IHRvIGdldCBjdXJyZW50IFR4UG93ZXIwLzEgZnJvbSBwQWQtPkxhdGNoUmZSZWdzID8KKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlpZiAoVHhQb3dlciA+IDMxKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzYgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAzMTsKKwkJaWYgKFR4UG93ZXIgPD0gMzYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOworCX0KKwllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwl7CisJCS8vCisJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAorCQkvLworCQlSID0gMDsKKwkJaWYgKFR4UG93ZXIgPj0gLTYpCisJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgVHhQb3dlcjsKKwl9CisJZWxzZQorCXsKKwkJLy8gMCB+IDMxCisJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFIzPSVsZCwgQkJQX1I5ND0lZClcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCWlmIChpbmRleCA9PSAwKQorCXsKKwkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJfQorCWVsc2UKKwl7CisJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiAwOworCX0KK30KKyNlbmRpZiAvLyAxIC8vCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgb3BlcmF0aW9uIG1vZGUgdG8KKyAgICAgICAgMC4gQVRFU1RBUlQgID0gU3RhcnQgQVRFIE1vZGUKKyAgICAgICAgMS4gQVRFU1RPUCAgID0gU3RvcCBBVEUgTW9kZQorICAgICAgICAyLiBUWENPTlQgICAgPSBDb250aW51b3VzIFRyYW5zbWl0CisgICAgICAgIDMuIFRYQ0FSUiAgICA9IFRyYW5zbWl0IENhcnJpZXIKKyAgICAgICAgNC4gVFhGUkFNRSAgID0gVHJhbnNtaXQgRnJhbWVzCisgICAgICAgIDUuIFJYRlJBTUUgICA9IFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyAgICAgICAgNi4gVFhTVE9QICAgID0gU3RvcCBBbnkgVHlwZSBvZiBUcmFuc21pdGlvbgorICAgICAgICA3LiBSWFNUT1AgICAgPSBTdG9wIFJlY2VpdmluZyBGcmFtZXMKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIJCQlWYWx1ZSA9IDA7CisJVUNIQVIJCQlCYnBEYXRhOworCVVJTlQzMgkJCU1hY0RhdGEgPSAwOworCVBUWERfU1RSVUMJCXBUeEQ7CisJSU5UCQkJCWluZGV4OworCVVJTlQJCQlpPTAsIGF0ZW1vZGU7CisJUFJYRF9TVFJVQwkJcFJ4RDsKKwlQUlRNUF9UWF9SSU5HIAlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07CisjaWZuZGVmIFVDT1MKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyNlbmRpZiAvLyBVQ09TIC8vCisjaWZkZWYJUlRfQklHX0VORElBTgorICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKKyAgICBUWERfU1RSVUMgICAgICAgVHhEOworI2VuZGlmCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKworCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5hdGUuQ2hhbm5lbCk7CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJLy8gcmVhZCBNQUNfU1lTX0NUUkwgYW5kIGJhY2t1cCBNQUNfU1lTX0NUUkwgdmFsdWUuCisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKworCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJQmJwRGF0YSA9IDA7CisKKwkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCisJaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RBUlQiKSkgCQkvL0VudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVEFSVFxuIikpOworCisjaWZuZGVmIFVDT1MKKwkJLy8gY2hlY2sgaWYgd2UgaGF2ZSByZW1vdmVkIHRoZSBmaXJtd2FyZQorCQlpZiAoIShBVEVfT04ocEFkKSkpCisJCXsKKwkJCU5JQ0VyYXNlRmlybXdhcmUocEFkKTsKKwkJfQorI2VuZGlmIC8vICFVQ09TIC8vCisJCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUQVJUOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKKwkJfQorCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKworCQkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDT05UKQorCQkJeworCQkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJCX0KKwkJCS8vIEFib3J0IFR4LCBSeCBETUEuCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisJCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXsKKwkJCQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJICAgIHBUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKKyNlbHNlCisgICAgICAgIAkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKKyAgICAgICAgCQlUeEQgPSAqcERlc3RUeEQ7CisgICAgICAgIAkJcFR4RCA9ICZUeEQ7CisgICAgICAgIAkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCQl9CisJCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCQl9CisJCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKwkJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisJCQl9CisJCQkvLyBTdGFydCBUeCwgUlggRE1BCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisJCX0KKwkJLy8gcmVzZXQgUnggc3RhdGlzdGljcy4KKwkJcEFkLT5hdGUuTGFzdFNOUjAgPSAwOworCQlwQWQtPmF0ZS5MYXN0U05SMSA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMCA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMSA9IDA7CisJCXBBZC0+YXRlLkxhc3RSc3NpMiA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTEgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMiA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IDA7CisJCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSA9IDA7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBUeCBmcmFtZQorCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKwkJcEFkLT5hdGUuc2VxID0gMDsKKworCQkvLyBjb3VudGVycworCQlwQWQtPmF0ZS5VMk0gPSAwOworCQlwQWQtPmF0ZS5PdGhlckRhdGEgPSAwOworCQlwQWQtPmF0ZS5CZWFjb24gPSAwOworCQlwQWQtPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhBYzAgPSAwOworCQlwQWQtPmF0ZS5UeEFjMSA9IDA7CisJCXBBZC0+YXRlLlR4QWMyID0gMDsKKwkJcEFkLT5hdGUuVHhBYzMgPSAwOworCQlwQWQtPmF0ZS5UeEhDQ0EgPSAwOworCQlwQWQtPmF0ZS5UeE1nbXQgPSAwOworCQlwQWQtPmF0ZS5SU1NJMCA9IDA7CisJCXBBZC0+YXRlLlJTU0kxID0gMDsKKwkJcEFkLT5hdGUuUlNTSTIgPSAwOworCQlwQWQtPmF0ZS5TTlIwID0gMDsKKwkJcEFkLT5hdGUuU05SMSA9IDA7CisKKwkJLy8gY29udHJvbAorCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vCisJCS8vIExpbmtEb3duKCkgaGFzICJBc2ljRGlzYWJsZVN5bmMoKTsiIGFuZCAiUlRNUF9CQlBfSU9fUi9XOF9CWV9SRUdfSUQoKTsiIGluc2lkZS4KKwkJLy8KKy8vICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisvLwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKyNpZm5kZWYgVUNPUworCQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisjZW5kaWYgLy8gIVVDT1MgLy8KKwkJLy8KKwkJLy8gSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KKwkJLy8gdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KKwkJLy8KKwkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7CisJCVJUTVBTdGF0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8qIERpc2FibGUgVHggKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLyogRGlzYWJsZSBSeCAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEFURVNUT1BcbiIpKTsKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsgLy8gcmVjb3ZlciB0aGUgTUFDX1NZU19DVFJMIHJlZ2lzdGVyIGJhY2suCisKKwkJLy8gRGlzYWJsZSBUeCwgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisjaWZuZGVmIFVDT1MKKwkJcEFkLT5hdGUuYkZXTG9hZGluZyA9IFRSVUU7CisJCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLworCQkvLyBFdmVuIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQsCisJCS8vIHdlIHN0aWxsIGNvdWxkIHVzZSBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRCgpLgorCQkvLyBCdXQgdGhpcyBpcyBub3Qgc3VnZ2VzdGVkLgorCQkvLworCQlCYnBTb2Z0UmVzZXQocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisKKwkJTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBUUlVFKTsKKworCisJCS8vIFJlaW5pdGlhbGl6ZSBSeCBSaW5nIGJlZm9yZSBSeCBETUEgaXMgZW5hYmxlZC4KKwkJLy8gVGhlIG5pZ2h0bWFyZSBvZiA+Pj5SeENvaGVyZW50PDw8IHdhcyBnb25lICEKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQorCQl7CisJCQlwUnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwUnhELT5ERE9ORSA9IDA7CisJCX0KKworCQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4KKwkJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBOVUxMKTsKKwkJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCS8vCisJCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwkJLy8KKworCQkvLworCQkvLyBUaGVzZSBzdGVwcyBhcmUgb25seSBmb3IgQVBBdXRvU2VsZWN0Q2hhbm5lbCgpLgorCQkvLworI2lmIDAKKwkJLy9wQWQtPmJTdGFGaWZvVGVzdCA9IFRSVUU7CisJCXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgIHwgKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CisJCXBBZC0+aW50X2Rpc2FibGVfbWFzayA9IDA7CisJCXBBZC0+aW50X3BlbmRpbmcgPSAwOworI2VuZGlmCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cworCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvKiByZXN0b3JlIFJYX0ZJTFRSX0NGRyAqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvKiByZXN0b3JlIFJYX0ZJTFRSX0NGRyBkdWUgdG8gdGhhdCBRQSBtYXliZSBzZXQgaXQgdG8gMHgzICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRW5hYmxlIFR4LCBSeCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCVJUTVBTdGF0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNpZm5kZWYgVUNPUworCQluZXRpZl9zdGFydF9xdWV1ZShwQWQtPm5ldF9kZXYpOworI2VuZGlmIC8vICFVQ09TIC8vCisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDQVJSIikpCS8vIFR4IENhcnJpZXIKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDQVJSXG4iKSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUjsKKworCQkvLyBRQSBoYXMgZG9uZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGlmIGl0IGlzIHVzZWQuCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IEZBTFNFKQorCQl7CisJCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJCUJicFNvZnRSZXNldChwQWQpOworCisJCQkvLyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCQlCYnBEYXRhIHw9IDB4MDAwMDAwQzE7IC8vc2V0IGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJVmFsdWUgPSBWYWx1ZSB8IDB4MDAwMDAwMTA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ09OVCIpKQkvLyBUeCBDb250aW51ZQorCXsKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLyogc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIGJpdDQoQ29udGludW91cyBUeCBQcm9kdWN0aW9uIFRlc3QpCisJCQkgICBhbmQgYml0MihNQUMgVFggZW5hYmxlKSBiYWNrIHRvIHplcm8uICovCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkJTWFjRGF0YSAmPSAweEZGRkZGRkVCOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQkJLy8gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkY3RjsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCisJCS8qIGZvciBUeENvbnQgbW9kZS4KKwkJKiogU3RlcCAxOiBTZW5kIDUwIHBhY2tldHMgZmlyc3QgdGhlbiB3YWl0IGZvciBhIG1vbWVudC4KKwkJKiogU3RlcCAyOiBTZW5kIG1vcmUgNTAgcGFja2V0IHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KKwkJKi8KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWENPTlRcbiIpKTsKKwkJLy8gU3RlcCAxOiBzZW5kIDUwIHBhY2tldHMgZmlyc3QuCisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ09OVDsKKwkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOworICAgICAgICAgICAgICAgIC8qIERvIGl0IGFmdGVyIFR4L1J4IERNQSBpcyBhYm9ydGVkLiAqLworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCS8qIE9ubHkgbmVlZGVkIGlmIHdlIGhhdmUgdG8gc2VuZCBzb21lIG5vcm1hbCBmcmFtZXMuICovCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCQl9CisKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBmcmFtZSBmb3JtYXQuCisJCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKworCQkvLyBTdGVwIDI6IHNlbmQgbW9yZSA1MCBwYWNrZXRzIHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MQorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJQmJwRGF0YSB8PSAweDAwMDAwMDgwOyAvL3NldCBiaXQ3PTEKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIGNsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCQl9CisKKwkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8ga2ljayBUeC1SaW5nLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7CisKKwkJUlRNUHVzZWNEZWxheSg1MDApOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisJCU1hY0RhdGEgfD0gMHgwMDAwMDAxMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWEZSQU1FIikpIC8vIFR4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWEZSQU1FKENvdW50PSVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCS8vIEZpeCBjYW4ndCBzbW9vdGgga2ljaworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OworCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCQl9CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJZm9yIChpID0gMDsgKGkgPCBUWF9SSU5HX1NJWkUtMSkgJiYgKGkgPCBwQWQtPmF0ZS5UeENvdW50KTsgaSsrKQorCQl7CisJCQlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwkJCVVJTlQzMiBUeElkeCA9IHBUeFJpbmctPlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCXBUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwkJCVR4RCA9ICpwRGVzdFR4RDsKKwkJCXBUeEQgPSAmVHhEOworCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCS8vIENsZWFuIGN1cnJlbnQgY2VsbC4KKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOworCisJCX0KKworCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCS8vIFN0YXJ0IFR4LCBSeCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQorCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gRGlzYWJsZSBSeAorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2Vsc2UKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4RG1hSWR4KTsKKwkJLy8ga2ljayBUeC1SaW5nLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCX0KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYU1RPUFxuIikpOworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSAmPSBBVEVfVFhTVE9QOworCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCisJCWlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUikKKwkJeworCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvL2NsZWFyIGJpdDAKKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOworCQl9CisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggYWxsb2NhdGUgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisKKwkJCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworCisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCisJCQkvLyBBYm9ydCBUeCwgUnggRE1BLgorCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCSAgICBwVHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisjZWxzZQorICAgICAgICAJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisgICAgICAgIAkJVHhEID0gKnBEZXN0VHhEOworICAgICAgICAJCXBUeEQgPSAmVHhEOworICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJfQorCQkJLy8gRW5hYmxlIFR4LCBSeCBETUEKKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQl9CisKKwkJLy8gY29udHJvbAorLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkvLyBEaXNhYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1JYU1RPUDsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCTsKKwkJfQorCisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggd2FzIGFsbG9jYXRlZCB3aGVuIEFURV9UWEZSQU1FICwgQVRFX1NUT1AsIGFuZCBBVEVfVFhDT05ULgorCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQk7CisJCQl9CisJCX0KKworCQkvLyBjb250cm9sCisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworLy8JCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYRlJBTUUiKSkgLy8gUnggRnJhbWVzCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFJYRlJBTUVcbiIpKTsKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9SWEZSQU1FOworCisJCS8vIERpc2FibGUgVHggb2YgTUFDIGJsb2NrLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBFbmFibGUgUnggb2YgTUFDIGJsb2NrLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEludmFsaWQgYXJnIVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IEFURUNtZEhhbmRsZXIoKVxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVDI4NjA9PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09U3RhcnQgb2YgUlQyODcwPT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKK0lOVAlTZXRfQVRFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWlmIChBVEVDbWRIYW5kbGVyKHBBZCwgYXJnKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBGYWlsZWRcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIxPURBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIzPURBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIzW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfREFfUHJvYyAoREEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIzWzBdLAorCQlwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9EQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjM9U0EgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjI9U0EgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjJbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9TQV9Qcm9jIChTQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjJbMF0sCisJCXBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1NBX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMj1CU1NJRCBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMT1CU1NJRCBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMVtpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0JTU0lEX1Byb2MgKEJTU0lEID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLAlwQWQtPmF0ZS5BZGRyMVswXSwKKwkJcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQlNTSURfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IENoYW5uZWwKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBjaGFubmVsOworCisJY2hhbm5lbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDIxNikpLy8gdG8gYWxsb3cgQSBiYW5kIGNoYW5uZWwgOiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAxfjE0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9DSEFOTkVMX1Byb2MgKEFURSBDaGFubmVsID0gJWQpXG4iLCBwQWQtPmF0ZS5DaGFubmVsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0NIQU5ORUxfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggUG93ZXIwCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIFR4UG93ZXI7CisKKwlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCXsKKwkJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJZWxzZS8vIDUuNUdIegorCXsKKwkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcEFkLT5hdGUuVHhQb3dlcjAgPSBUeFBvd2VyOworCUFURVR4UHdySGFuZGxlcihwQWQsIDApOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjBfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggUG93ZXIxCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIFR4UG93ZXI7CisKKwlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCXsKKwlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJfQorCWVsc2UKKwl7CisJCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXBBZC0+YXRlLlR4UG93ZXIxID0gVHhQb3dlcjsKKwlBVEVUeFB3ckhhbmRsZXIocEFkLCAxKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIxX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IEFudGVubmEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIHZhbHVlOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCh2YWx1ZSA+IDIpIHx8ICh2YWx1ZSA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gdmFsdWU7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSYWxpbms6IFNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSeCBBbnRlbm5hCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiB2YWx1ZTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgodmFsdWUgPiAzKSB8fCAodmFsdWUgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IHZhbHVlOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJGIGZyZXF1ZW5jZSBvZmZzZXQKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBSRkZyZXFPZmZzZXQ7CisJVUxPTkcgUjQ7CisKKwlSRkZyZXFPZmZzZXQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoUkZGcmVxT2Zmc2V0ID49IDY0KQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDB+NjMuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPSBSRkZyZXFPZmZzZXQ7CisJUjQgPSBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTU7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJUjQgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAoKH4weDAwMWY4MDAwKSkpOworCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIChSRkZyZXFPZmZzZXQgPSAlZClcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJGIEJXCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWludCBpOworCVVDSEFSIHZhbHVlID0gMDsKKwlVQ0hBUiBCQlBDdXJyZW50Qlc7CisKKwlCQlBDdXJyZW50QlcgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoQkJQQ3VycmVudEJXID09IDApCisJCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwllbHNlCisJCXBBZC0+YXRlLlR4V0kuQlcgPSBCV180MDsKKworCWlmKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCisJeworCQlpZihwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisgCQlmb3IgKGk9MDsgaTw1OyBpKyspCisgCQl7CisJCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisgCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSk7CisgCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisgCQkJfQorIAkJfQorCQl9CisKKwkJLy9TZXQgQkJQIFI0IGJpdFs0OjNdPTA6MAorIAkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisgCQl2YWx1ZSAmPSAofjB4MTgpOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisKKyAgCQkvL1NldCBCQlAgUjY2PTB4M0MKKyAJCXZhbHVlID0gMHgzQzsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OD0weDBCCisJCS8vdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eS4KKwkJdmFsdWUgPSAweDBCOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY4LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjk9MHgxNgorCQl2YWx1ZSA9IDB4MTY7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzA9MHgwOAorCQl2YWx1ZSA9IDB4MDg7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzM9MHgxMQorCQl2YWx1ZSA9IDB4MTE7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCB2YWx1ZSk7CisKKwkgICAgLy8gSWYgQ2hhbm5lbD0xNCwgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIFNldCBCQlAgUjQgYml0NT0xCisJICAgIC8vIChKYXBhbiBmaWx0ZXIgY29lZmZpY2llbnRzKQorCSAgICAvLyBUaGlzIHNlZ21lbnQgb2YgY29kZSB3aWxsIG9ubHkgd29ya3Mgd2hlbiBBVEVUWE1PREUgYW5kIEFURUNIQU5ORUwKKwkgICAgLy8gd2VyZSBzZXQgdG8gTU9ERV9DQ0sgYW5kIDE0IHJlc3BlY3RpdmVseSBiZWZvcmUgQVRFVFhCVyBpcyBzZXQgdG8gMC4KKwkgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpCisJCXsKKwkJCWludCBUeE1vZGUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCQlpZiAoVHhNb2RlID09IE1PREVfQ0NLKQorCQkJeworCQkJCS8vIHdoZW4gQ2hhbm5lbD09MTQgJiYgTW9kZT09Q0NLICYmIEJhbmRXaWR0aD09MjBNLCBCQlAgUjQgYml0NT0xCisgCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworCQkJCXZhbHVlIHw9IDB4MjA7IC8vc2V0IGJpdDU9MQorIAkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKwkJCX0KKwkJfQorCisJICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIElmIGJhbmR3aWR0aCAhPSA0ME0sIFJGIFJlZzQgYml0IDIxID0gMC4KKwkJcEFkLT5MYXRjaFJmUmVncy5SNCAmPSB+MHgwMDIwMDAwMDsKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCX0KKwllbHNlIGlmKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJeworCQlpZihwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBBZC0+YXRlLlR4V0kuTUNTID09IDcpKQorCQkJeworICAgIAkJCXZhbHVlID0gMHgyODsKKyAgICAJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY3LCB2YWx1ZSk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCX0KKworCQkvL1NldCBCQlAgUjQgYml0WzQ6M109MTowCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworCQl2YWx1ZSAmPSAofjB4MTgpOworCQl2YWx1ZSB8PSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKworCQkvL1NldCBCQlAgUjY2PTB4M0MKKwkJdmFsdWUgPSAweDNDOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjg9MHgwQworCQkvL3RvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCisJCXZhbHVlID0gMHgwQzsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY5PTB4MUEKKwkJdmFsdWUgPSAweDFBOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzA9MHgwQQorCQl2YWx1ZSA9IDB4MEE7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3Mz0weDE2CisJCXZhbHVlID0gMHgxNjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOworCisJCS8vIElmIGJhbmR3aWR0aCA9IDQwTSwgc2V0IFJGIFJlZzQgYml0IDIxID0gMS4KKwkJcEFkLT5MYXRjaFJmUmVncy5SNCB8PSAweDAwMjAwMDAwOworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9CV19Qcm9jIChCQlBDdXJyZW50QlcgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuQlcpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQldfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgbGVuZ3RoCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeExlbmd0aCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigocEFkLT5hdGUuVHhMZW5ndGggPCAyNCkgfHwgKHBBZC0+YXRlLlR4TGVuZ3RoID4gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpCisJeworCQlwQWQtPmF0ZS5UeExlbmd0aCA9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLyk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDI0fiVkLlxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYyAoVHhMZW5ndGggPSAlZClcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBjb3VudAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeENvdW50ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNQ1MKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgTUNTOworCWludCByZXN1bHQ7CisKKwlNQ1MgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCXJlc3VsdCA9IENoZWNrTUNTVmFsaWQocEFkLT5hdGUuVHhXSS5QSFlNT0RFLCBNQ1MpOworCisJaWYgKHJlc3VsdCAhPSAtMSkKKwl7CisJCXBBZC0+YXRlLlR4V0kuTUNTID0gKFVDSEFSKU1DUzsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NQ1NfUHJvYzo6T3V0IG9mIHJhbmdlLCByZWZlciB0byByYXRlIHRhYmxlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9NQ1NfUHJvYyAoTUNTID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLk1DUykpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9NQ1NfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgTW9kZQorICAgICAgICAwOiBNT0RFX0NDSworICAgICAgICAxOiBNT0RFX09GRE0KKyAgICAgICAgMjogTU9ERV9IVE1JWAorICAgICAgICAzOiBNT0RFX0hUR1JFRU5GSUVMRAorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+IDMpCisJeworCQlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01PREVfUHJvYzo6T3V0IG9mIHJhbmdlLiBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH4zXG4iKSk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjA6IENDSywgMTogT0ZETSwgMjogSFRfTUlYLCAzOiBIVF9HUkVFTl9GSUVMRC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jIChUeE1vZGUgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9NT0RFX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIEdJCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKHBBZC0+YXRlLlR4V0kuU2hvcnRHSSA+IDEpCisJeworCQlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0dJX1Byb2M6Ok91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9HSV9Qcm9jIChHSSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5TaG9ydEdJKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0dJX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5iUnhGZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLmJSeEZlciA9PSAxKQorCXsKKwkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOworCQlwQWQtPmF0ZS5SeFRvdGFsQ250ID0gMDsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0ZFUl9Qcm9jIChiUnhGZXIgPSAlZClcbiIsIHBBZC0+YXRlLmJSeEZlcikpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9GRVJfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9SZWFkX1JGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMSA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIyID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjMgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjMpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSNCA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIxID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMiA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkY0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTG9hZCBhbmQgV3JpdGUgRUVQUk9NIGZyb20gYSBiaW5hcnkgZmlsZSBwcmVwYXJlZCBpbiBhZHZhbmNlLgorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZm5kZWYgVUNPUworSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgkJICAgIHJldCA9IEZBTFNFOworCVBVQ0hBUgkJCXNyYyA9IEVFUFJPTV9CSU5fRklMRV9OQU1FOworCXN0cnVjdCBmaWxlCQkqc3JjZjsKKwlJTlQzMiAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJVUlOVDMyCQkJRmlsZUxlbmd0aCA9IDA7CisJVUlOVDMyIAkJCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT4gJXMgKHZhbHVlPSVkKVxuXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlKSk7CisKKwlpZiAodmFsdWUgPiAwKQorCXsKKwkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7CisKKwkJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICAgKiogc2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJICAgICovCisJCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCS8qIGFzIHJvb3QgKi8KKwkJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgCW9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgCXNldF9mcyhLRVJORUxfRFMpOworCisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgcmVhZCBtZXRob2RcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLworCQkJRmlsZUxlbmd0aCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwKKwkJCQkJCQkJCQkgIChQVUNIQVIpV3JpdGVFRVBST00sCisJCQkJCQkJCQkJICBFRVBST01fU0laRSwKKwkJCQkJCQkJCQkgICZzcmNmLT5mX3Bvcyk7CisKKwkJCWlmIChGaWxlTGVuZ3RoICE9IEVFUFJPTV9TSVpFKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIGUycC5iaW5cbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgRmlsZUxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKwkJCQlyZXQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQkJOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCisJCQl9CisJCX0KKworCQkvKiByZXN0b3JlICovCisJCXNldF9mcyhvcmdmcyk7CisJCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJfQorICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fRlVOQ1RJT05fXywgcmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisjZWxzZQorSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJc3RydWN0IGl3cmVxCSp3cnEgPSAoc3RydWN0IGl3cmVxICopYXJnOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlcyAod3JxLT51LmRhdGEubGVuZ3RoID0gJWQpXG5cbiIsIF9fRlVOQ1RJT05fXywgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCIlczogZXJyb3IgbGVuZ3RoICg9JWQpIGZyb20gaG9zdFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIGZpbGwgdGhlIGxvY2FsIGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCWRvCisJCXsKKwkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOworCisJCX0gd2hpbGUoRkFMU0UpOworCQl9CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworICAgIHJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gIVVDT1MgLy8KKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKwlVU0hPUlQgKnA7CisJaW50IGk7CisKKwlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOworCXAgPSBidWZmZXI7CisJZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQorCXsKKwkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7CisJCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKKwkJCWF0ZV9wcmludCgiXG4iKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIk1vZGU9JWRcbiIsIHBBZC0+YXRlLk1vZGUpOworCWF0ZV9wcmludCgiVHhQb3dlcjA9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIwKTsKKwlhdGVfcHJpbnQoIlR4UG93ZXIxPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMSk7CisJYXRlX3ByaW50KCJUeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJSeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJCQlBDdXJyZW50Qlc9JWRcbiIsIHBBZC0+YXRlLlR4V0kuQlcpOworCWF0ZV9wcmludCgiR0k9JWRcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSk7CisJYXRlX3ByaW50KCJNQ1M9JWRcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKTsKKwlhdGVfcHJpbnQoIlR4TW9kZT0lZFxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKTsKKwlhdGVfcHJpbnQoIkFkZHIxPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMVswXSwgcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMlswXSwgcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIzPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyM1swXSwgcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKTsKKwlhdGVfcHJpbnQoIkNoYW5uZWw9JWRcbiIsIHBBZC0+YXRlLkNoYW5uZWwpOworCWF0ZV9wcmludCgiVHhMZW5ndGg9JWRcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKTsKKwlhdGVfcHJpbnQoIlR4Q291bnQ9JXVcbiIsIHBBZC0+YXRlLlR4Q291bnQpOworCWF0ZV9wcmludCgiUkZGcmVxT2Zmc2V0PSVkXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJTZXRfQVRFX1Nob3dfUHJvYyBTdWNjZXNzXG4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIkFURT1BVEVTVEFSVCwgQVRFU1RPUCwgVFhDT05ULCBUWENBUlIsIFRYRlJBTUUsIFJYRlJBTUVcbiIpOworCWF0ZV9wcmludCgiQVRFREFcbiIpOworCWF0ZV9wcmludCgiQVRFU0FcbiIpOworCWF0ZV9wcmludCgiQVRFQlNTSURcbiIpOworCWF0ZV9wcmludCgiQVRFQ0hBTk5FTCwgcmFuZ2U6MH4xNCh1bmxlc3MgQSBiYW5kICEpXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYUE9XMCwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cxLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAyLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEFOVCwgc2V0IFRYIGFudGVubmEuIDA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLlxuIik7CisJYXRlX3ByaW50KCJBVEVSWEFOVCwgc2V0IFJYIGFudGVubmEuMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28sIDM6YW50ZW5uYSB0aHJlZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhGUkVRT0ZGU0VULCBzZXQgZnJlcXVlbmN5IG9mZnNldCwgcmFuZ2UgMH42M1xuIik7CisJYXRlX3ByaW50KCJBVEVUWEJXLCBzZXQgQmFuZFdpZHRoLCAwOjIwTUh6LCAxOjQwTUh6LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWExFTiwgc2V0IEZyYW1lIGxlbmd0aCwgcmFuZ2UgMjR+JWRcbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCWF0ZV9wcmludCgiQVRFVFhDTlQsIHNldCBob3cgbWFueSBmcmFtZSBnb2luZyB0byB0cmFuc21pdC5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhNQ1MsIHNldCBNQ1MsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1PREUsIHNldCBNb2RlIDA6Q0NLLCAxOk9GRE0sIDI6SFQtTWl4LCAzOkdyZWVuRmllbGQsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEdJLCBzZXQgR0kgaW50ZXJ2YWwsIDA6TG9uZywgMTpTaG9ydFxuIik7CisJYXRlX3ByaW50KCJBVEVSWEZFUiwgMDpkaXNhYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuIDE6ZW5hYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJSRiwgc2hvdyBhbGwgUkYgcmVnaXN0ZXJzLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYxLCBzZXQgUkYxIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYyLCBzZXQgUkYyIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYzLCBzZXQgUkYzIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkY0LCBzZXQgUkY0IHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVMREUyUCwgbG9hZCBFRVBST00gZnJvbSAuYmluIGZpbGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJFMlAsIGRpc3BsYXkgYWxsIEVFUFJPTSBjb250ZW50LlxuIik7CisJYXRlX3ByaW50KCJBVEVTSE9XLCBkaXNwbGF5IGFsbCBwYXJhbWV0ZXJzIG9mIEFURS5cbiIpOworCWF0ZV9wcmludCgiQVRFSEVMUCwgb25saW5lIGhlbHAuXG4iKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMiBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwLCBWYWx1ZSA9IDA7CisJQ0hBUiBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gMDsKKwlVQ0hBUiBpbmRleCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOworCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKKwlVQ0hBUiBDaGFubmVsOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCAhPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwpCisJCXsKKwkJCXBBZC0+YXRlLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisJCX0KKwkJcmV0dXJuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwlDaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKworCS8vIFNlbGVjdCBhbnRlbm5hCisJQXNpY0FudGVubmFTZWxlY3QocEFkLCBDaGFubmVsKTsKKworCS8vIGZpbGwgVHggcG93ZXIgdmFsdWUKKwlUeFB3ZXIgPSBwQWQtPmF0ZS5UeFBvd2VyMDsKKwlUeFB3ZXIyID0gcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCVIyIHw9IDB4NDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQkvKiBPbmx5IGVuYWJsZSB0d28gQW50ZW5uYSB0byByZWNlaXZlLiAqLworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsJCS8vMTExMDAxMTFCCisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMikKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDgwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDIgLCBiaXQgMTUgPSAxOyBEaXNhYmxlIEFudCAxCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CisJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJUjIgfD0gMHgzMDAwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDI7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJCQkJCS8vIDUuNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIG9mZnNldCAmIFR4UHdyMQorCQkJCQl9CisKKwkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KKwkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc3dpdGNoIGZyb20gYS0+ZywgZy0+YQorCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vIDIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTBBID09PiAweDAwMDUwRjBBCisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKworCQkvKiBGb3IgMVQvMlIgY2hpcCBvbmx5Li4uICovCisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOworCSAgICB9CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQorCQl7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKKwkJfQorCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisJZWxzZQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MDUgPT0+IDB4MDAwNTBGMDUKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MSwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDA0KSk7CisKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkyLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKworCQkvLyA1LjVHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCSAgICB9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCQkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gNS41IEdIeiBiYW5kCisJCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisgICAgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorCX0KKworCS8vCisJLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQorCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCisJLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCisJLy8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJaWYgKENoYW5uZWwgPiAxNCkKKwl7CisJCS8vIFdoZW4gNS41R0h6IGJhbmQgdGhlIExTQiBvZiBUeFB3ciB3aWxsIGJlIHVzZWQgdG8gcmVkdWNlZCA3ZEIgb3Igbm90LgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JXUsIFB3cjE9JXUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisgICAgfQorfQorCisvLworLy8gSW4gZmFjdCwgbm8gb25lIHdpbGwgY2FsbCB0aGlzIHJvdXRpbmUgc28gZmFyICEKKy8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gQVRFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KKwlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KKwkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgaXMgMHgxMCB+IDB4NDAsIG1pbnVzIGlzIDB4NjAgfiAweDkwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4NjUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgorCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIuCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwl9CisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gOTsKKwl9CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTI7CisJfQorCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCisKKwkJfQorCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVdyaXRlIFR4V0kgZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit7CisJVFhXSV9TVFJVQyAJCVR4V0k7CisJUFRYV0lfU1RSVUMgCXBUeFdJOworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7CisJcFR4V0kgPSAmVHhXSTsKKworCXBUeFdJLT5GUkFHPSBGUkFHOworCisJcFR4V0ktPkNGQUNLID0gQ0ZBQ0s7CisJcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7CisJcFR4V0ktPkFNUERVID0gQU1QRFU7CisJcFR4V0ktPkFDSyA9IEFjazsKKwlwVHhXSS0+dHhvcD0gVHhvcG1vZGU7CisKKwlwVHhXSS0+TlNFUSA9IE5TZXE7CisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKwlwVHhXSS0+TUlNT3BzID0gMDsKKwlwVHhXSS0+TXBkdURlbnNpdHkgPSAwOworCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKKwlOZGlzTW92ZU1lbW9yeShwT3V0VHhXSSwgJlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7CisKKyAgICAgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRGlzYWJsZSBwcm90ZWN0aW9uIGZvciBBVEUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBVEVEaXNhYmxlQXNpY1Byb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBST1RfQ0ZHX1NUUlVDCVByb3RDZmcsIFByb3RDZmc0OworCVVJTlQzMiBQcm90ZWN0WzZdOworCVVTSE9SVAkJCW9mZnNldDsKKwlVQ0hBUgkJCWk7CisJVUlOVDMyIE1hY1JlZyA9IDA7CisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uCisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CisJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCisJLy8gTk8gUFJPVEVDVAorCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCS8vIE1NMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCS8vIE1NNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkvLyBDRjIwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkvLyBDRjQwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCit9CisKKworLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnZlcnQgUnNzaSAqLworI2lmIDEKKy8vCisvLyBUaGUgd2F5IHVzZWQgd2l0aCBHRVRfTE5BX0dBSU4oKS4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUglSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworCX0KKwllbHNlCisJeworCQlpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKwl9CisKKwlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisjZWxzZQorLy8KKy8vIFRoZSB3YXkgb3JpZ2luYWxseSB1c2VkIGluIEFURSBvZiBydDI4NjBhcC4KKy8vCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBMTkFHYWluID0gcEFkLT5BTE5BR2FpbjsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkJMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0zMiAtIFJzc2lPZmZzZXQgKyBMTkFHYWluIC0gUnNzaSk7Cit9CisjZW5kaWYgLyogZW5kIG9mICNpZiAxICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cyBpZiBuZWVkZWQuCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCisJCWVudGVyaW5nIFRYRlJBTUUgbW9kZSBvciBUWENPTlQgbW9kZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUJicERhdGEgPSAwOworCisJLy8KKwkvLyBJZiBDaGFubmVsPTE0IGFuZCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgc2V0IEJCUCBSNCBiaXQ1PTEKKwkvLyAoSmFwYW4gVHggZmlsdGVyIGNvZWZmaWNpZW50cyl3aGVuIChUWEZSQU1FIG9yIFRYQ09OVCkuCisJLy8KKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJicERhdGEpOworCisgICAgaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KSAmJiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkpCisgICAgeworICAgICAgICBCYnBEYXRhIHw9IDB4MjA7ICAgIC8vIHR1cm4gb24KKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0SmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJQmJwRGF0YSAmPSAweGRmOyAgICAvLyB0dXJuIG9mZgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbGVhckphcGFuRmlsdGVyISEhXG4iKSk7CisgICAgfQorCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKK30KKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKK3sKKwkvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29sbGVjdCBSU1NJLiAqLworI2lmIDEKKwkvL3BBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKwlpZiAocFJ4V0ktPlJTU0kwICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTAJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCAgCT0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kxICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTEJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCQlwQWQtPmF0ZS5BdmdSc3NpMQk9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisJaWYgKHBSeFdJLT5SU1NJMiAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDgJPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwkJcEFkLT5hdGUuQXZnUnNzaTIJPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJfQorCisJcEFkLT5hdGUuTGFzdFNOUjAgPSAoQ0hBUikocFJ4V0ktPlNOUjApOy8vIENIQVIgPT0+IFVDSEFSID8KKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2Vsc2UKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7CisJcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOworCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJcEFkLT5hdGUuTGFzdFJzc2kwID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7CisJcEFkLT5hdGUuTGFzdFJzc2kxID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7CisJcEFkLT5hdGUuTGFzdFJzc2kyID0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTIsIFJTU0lfMik7CisJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOworCXBBZC0+YXRlLkF2Z1Jzc2kwID0gcEFkLT5hdGUuQXZnUnNzaTBYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKKwlwQWQtPmF0ZS5BdmdSc3NpMSA9IHBBZC0+YXRlLkF2Z1Jzc2kxWDggPj4gMzsKKwlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7CisJcEFkLT5hdGUuQXZnUnNzaTIgPSBwQWQtPmF0ZS5BdmdSc3NpMlg4ID4+IDM7CisJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlICsrOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFN0YXRpb25TdG9wKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworLy8JQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdG9wXG4iKSk7CisKKyNpZiAwCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgICAgICAgJkNhbmNlbGxlZCk7CisjZW5kaWYKKwkvLyBGb3Igcnggc3RhdGlzdGljcywgd2UgbmVlZCB0byBrZWVwIHRoaXMgdGltZXIgcnVubmluZy4KKy8vCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsICAgICAgJkNhbmNlbGxlZCk7CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUFN0YXRpb25TdG9wXG4iKSk7Cit9CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdGFydFxuIikpOworI2lmZGVmIFJUMjg2MAorCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJLy8KKwkvLyBXZSBkaWQgbm90IGNhbmNlbCB0aGlzIHRpbWVyIHdoZW4gZW50ZXJpbmcgQVRFIG1vZGUuCisJLy8KKy8vCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2V0dXAgRnJhbWUgZm9ybWF0LgorCU5PVEU6CisJCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSB1c2VkIGluIEFURSBtb2RlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpCit7CisJVUlOVCBqOworCVBUWERfU1RSVUMgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlQVUNIQVIgcERlc3Q7CisJUFZPSUQgQWxsb2NWYTsKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgQWxsb2NQYTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJVHhIVFBoeU1vZGU7CisKKwlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKwlQVFhXSV9TVFJVQyBwVHhXSSA9IChQVFhXSV9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJUFVDSEFSIHBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBCisKKwkJLy8gZmlsbCBUeFdJCisJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgcEFkLT5hdGUuVHhXSS5GUkFHLCBwQWQtPmF0ZS5UeFdJLkNGQUNLLCBwQWQtPmF0ZS5UeFdJLlRTLCAgcEFkLT5hdGUuVHhXSS5BTVBEVSwgcEFkLT5hdGUuVHhXSS5BQ0ssIHBBZC0+YXRlLlR4V0kuTlNFUSwKKwkJCXBBZC0+YXRlLlR4V0kuQkFXaW5TaXplLCAwLCBwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCwgcEFkLT5hdGUuVHhXSS5QYWNrZXRJZCwgMCwgMCwgcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sICZUeEhUUGh5TW9kZSk7CisJfQorCWVsc2UKKwl7CisJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgIEZBTFNFLCBGQUxTRSwgRkFMU0UsCisJCQk0LCAwLCBwQWQtPmF0ZS5UeExlbmd0aCwgMCwgMCwgMCwgSUZTX0hUVFhPUCwgRkFMU0UsICZUeEhUUGh5TW9kZSk7CisJfQorCisJLy8gZmlsbCA4MDIuMTEgaGVhZGVyLgorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUsIHBBZC0+YXRlLkhlYWRlciwgcEFkLT5hdGUuSExlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgVGVtcGxhdGVGcmFtZSwgTEVOR1RIXzgwMl8xMSk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrNCwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTAsIHBBZC0+YXRlLkFkZHIyLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFKzE2LCBwQWQtPmF0ZS5BZGRyMywgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBETUFIZWFkZXJCdWZWQSkrVFhXSV9TSVpFKSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvKiBhbGxvYyBidWZmZXIgZm9yIHBheWxvYWQgKi8KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvKiBXaHkgbm90IHVzZSBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoKSBpbnN0ZWFkIG9mIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigpPyAqLworCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgcEFkLT5hdGUuRExlbiArIDB4MTAwLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQkvKiBXaHkgbm90IHVzZSBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoKSBpbnN0ZWFkIG9mIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigpPyAqLworCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgcEFkLT5hdGUuVHhMZW5ndGgsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOworCX0KKworCWlmIChwUGFja2V0ID09IE5VTEwpCisJeworCQlwQWQtPmF0ZS5UeENvdW50ID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgZmFpbCB0byBhbGxvYyBwYWNrZXQgc3BhY2UuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBwUGFja2V0OworCisJcERlc3QgPSAoUFVDSEFSKSBBbGxvY1ZhOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbiA9IHBBZC0+YXRlLkRMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbiA9IHBBZC0+YXRlLlR4TGVuZ3RoIC0gTEVOR1RIXzgwMl8xMTsKKwl9CisKKwkvLyBQcmVwYXJlIGZyYW1lIHBheWxvYWQKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBjb3B5IHBhdHRlcm4KKwkJaWYgKChwQWQtPmF0ZS5QTGVuICE9IDApKQorCQl7CisJCQlpbnQgajsKKworCQkJZm9yIChqID0gMDsgaiA8IHBBZC0+YXRlLkRMZW47IGorPXBBZC0+YXRlLlBMZW4pCisJCQl7CisJCQkJbWVtY3B5KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5kYXRhICsgaiwgcEFkLT5hdGUuUGF0dGVybiwgcEFkLT5hdGUuUExlbik7CisJCQl9CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlmb3IoaiA9IDA7IGogPCBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOyBqKyspCisJCQlwRGVzdFtqXSA9IDB4QTU7CisJfQorCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisgICAgcERlc3RUeEQgID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisjZW5kaWYgLy8gIVJUX0JJR19FTkRJQU4gLy8KKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8vIHByZXBhcmUgVHhECisJCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKwkJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisJCS8vIGJ1aWxkIFRYIERFU0MKKwkJcFR4RC0+U0RQdHIwID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5ITGVuOworCQlwVHhELT5MYXN0U2VjMCA9IDA7CisJCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7CisJCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47CisJCXBUeEQtPkxhc3RTZWMxID0gMTsKKworCQlwRGVzdCA9IChQVUNIQVIpcFR4V0k7CisJCXBEZXN0ICs9IFRYV0lfU0laRTsKKwkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OworCisJCS8vIG1vZGlmeSBzZXF1ZW5jZSBudW1iZXIuLi4uCisJCWlmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA9PSAwKQorCQl7CisJCQlwQWQtPmF0ZS5zZXEgPSBwSGVhZGVyODAyMTEtPlNlcXVlbmNlOworCQl9CisJCWVsc2UKKwkJCXBIZWFkZXI4MDIxMS0+U2VxdWVuY2UgPSArK3BBZC0+YXRlLnNlcTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisJCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCQkvLyBidWlsZCBUWCBERVNDCisJCXBUeEQtPlNEUHRyMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisJCXBUeEQtPlNETGVuMCA9IFRYV0lfU0laRSArIExFTkdUSF84MDJfMTE7CisJCXBUeEQtPkxhc3RTZWMwID0gMDsKKwkJcFR4RC0+U0RQdHIxID0gQWxsb2NQYTsKKwkJcFR4RC0+U0RMZW4xID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbjsKKwkJcFR4RC0+TGFzdFNlYzEgPSAxOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlyZXR1cm4gMDsKK30KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09RW5kIG9mIFJUMjg2MD09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitWT0lEIHJ0X2VlX3JlYWRfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGkqMiwgdmFsdWUpOworCQlEYXRhW2ldID0gdmFsdWU7CisJCWkrKzsKKwl9Cit9CisKK1ZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQl2YWx1ZSA9IERhdGFbaV07CisJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIGkqMiwgdmFsdWUpOworCQlpICsrOworCX0KK30KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKKwlJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOIFBIRUFERVJfODAyXzExCQkJcEhlYWRlcikKK3sKKwkvLyB1cGRhdGUgY291bnRlciBmaXJzdAorCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCQl7CisJCQlpZiAocFJ4RC0+VTJNKQorCQkJCXBBZC0+YXRlLlUyTSsrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyRGF0YSsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwkJeworCQkJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pCisJCQkJcEFkLT5hdGUuQmVhY29uKys7CisJCQllbHNlCisJCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwkJeworCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJfQorCXBBZC0+YXRlLlJTU0kwID0gcFJ4V0ktPlJTU0kwOworCXBBZC0+YXRlLlJTU0kxID0gcFJ4V0ktPlJTU0kxOworCXBBZC0+YXRlLlJTU0kyID0gcFJ4V0ktPlJTU0kyOworCXBBZC0+YXRlLlNOUjAgPSBwUnhXSS0+U05SMDsKKwlwQWQtPmF0ZS5TTlIxID0gcFJ4V0ktPlNOUjE7Cit9CisKKy8qIGNvbW1hbmQgaWQgd2l0aCBDbWQgVHlwZSA9PSAweDAwMDgoZm9yIDI4eHgpLzB4MDAwNShmb3IgaU5JQykgKi8KKyNkZWZpbmUgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTAkJMHgwMDAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2CQkweDAwMDEKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2CTB4MDAwMgorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMCTB4MDAwMworI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTAkweDAwMDQKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQUQJCQkweDAwMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1dSSVRFCQkJMHgwMDA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsJCTB4MDAwNworI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQUQ4CQkJMHgwMDA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4CQkweDAwMDkKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTAkJMHgwMDBhCisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUgkJMHgwMDBiCisjZGVmaW5lIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSCQkweDAwMGMKKworI2RlZmluZSBSQUNGR19DTURfUlNWMQkJCQkweDAwMGQKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjIJCQkJMHgwMDBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YzCQkJCTB4MDAwZgorCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVEFSVAkJCTB4MDAxMAorI2RlZmluZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUwkJMHgwMDExCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVE9QCQkJMHgwMDEyCisjZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVEFSVAkJCTB4MDAxMworI2RlZmluZSBSQUNGR19DTURfUlhfU1RPUAkJCTB4MDAxNAorI2RlZmluZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMCTB4MDAxNQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlQJCQkweDAwODAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVE9QCQkJMHgwMDgxCisKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSCQkweDAxMDAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UCQkJMHgwMTAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUJCTB4MDEwMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9CVwkgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwCSAgICAgICAgMHgwMTA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMQkJCTB4MDEwNQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVAkJMHgwMTA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MJCTB4MDEwNworI2RlZmluZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIJCQkweDAxMDgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQQkJMHgwMTA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEJCTB4MDEwYQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRQkJCTB4MDEwYgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMCQkJMHgwMTBjCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxCQkJCTB4MDEwZAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMgkJCQkweDAxMGUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjMJCQkJMHgwMTBmCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUJCQkJMHgwMTEwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTgkJMHgwMTExCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UCTB4MDExMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FCQkweDAxMTMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLCTB4MDExNAorI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLCTB4MDExNQorI2RlZmluZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsJCTB4MDExNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsJCTB4MDExNworI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLCTB4MDExOAorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSwkJMHgwMTE5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSwkJMHgwMTFhCisKKworCisjZGVmaW5lIEEySGV4KF9YLCBfcCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJVUNIQVIgKnA7CQkJCQkJXAorCV9YID0gMDsJCQkJCQkJXAorCXAgPSBfcDsJCQkJCQkJXAorCXdoaWxlICgoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkgfHwgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCQkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gODc7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA1NTsJCQkJCVwKKwkJZWxzZSBpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDQ4OwkJCQkJXAorCQlwKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisKK3N0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7CitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOworCisjaWZkZWYgVUNPUworaW50IGF0ZV9jb3B5X3RvX3VzZXIoCisJSU4gUFVDSEFSIHBheWxvYWQsCisJSU4gUFVDSEFSIG1zZywKKwlJTiBJTlQgICAgbGVuKQoreworCW1lbW1vdmUocGF5bG9hZCwgbXNnLCBsZW4pOworCXJldHVybiAwOworfQorCisjdW5kZWYJY29weV90b191c2VyCisjZGVmaW5lIGNvcHlfdG9fdXNlcih4LHkseikgYXRlX2NvcHlfdG9fdXNlcigoUFVDSEFSKXgsIChQVUNIQVIpeSwgeikKKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNkZWZpbmUJTEVOX09GX0FSRyAxNgorCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRfSWQ7CisJc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnOworCUlOVAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisKKworCWlmKChwUmFDZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJeworCQlTdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkocFJhQ2ZnLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKChQVUNIQVIpcFJhQ2ZnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwkJa2ZyZWUocFJhQ2ZnKTsKKwkJcmV0dXJuOworCX0KKworCisJQ29tbWFuZF9JZCA9IG50b2hzKHBSYUNmZy0+Y29tbWFuZF9pZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19GVU5DVElPTl9fLCBDb21tYW5kX0lkKSk7CisKKwlzd2l0Y2ggKENvbW1hbmRfSWQpCisJeworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIHdoZW4gUUEgc3RhcnRzLgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrIGFzIHNvb24gYXMgd2UgY2FuIHRvIGF2b2lkIFFBIHRpbWVvdXQuCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVEFSVCIpOworCQkJfQorCQkJYnJlYWs7CisKKyAJCS8vIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCBlaXRoZXIgUUEgaXMgY2xvc2VkIG9yIGF0ZWQgaXMga2lsbGVkIGJ5IHVzZXIuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVE9QOgorCQkJeworI2lmbmRlZiBVQ09TCisJCQkJSU5UMzIgcmV0OworI2VuZGlmIC8vICFVQ09TIC8vCisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCisJCQkJLy8gRGlzdGluZ3Vpc2ggdGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQSh2aWEgYXRlZCkKKwkJCQkvLyBvciBhdGUgZGFlbW9uIGFjY29yZGluZyB0byB0aGUgZXhpc3RlbmNlIG9mIHBpZCBpbiBwYXlsb2FkLgorCQkJCS8vIE5vIG5lZWQgdG8gcHJlcGFyZSBmZWVkYmFjayBpZiB0aGlzIGNtZCBjYW1lIGRpcmVjdGx5IGZyb20gYXRlIGRhZW1vbi4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQorCQkJCXsKKwkJCQkJLy8gVGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQS4KKwkJCQkJLy8gR2V0IHRoZSBwaWQgb2YgQVRFIGRhZW1vbi4KKwkJCQkJbWVtY3B5KChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkF0ZVBpZCwKKwkJCQkJCSgmcFJhQ2ZnLT5kYXRhWzBdKSAtIDIvKiA9PSAmKHBSYUNmZy0+c3RhdHVzKSAqLywKKwkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOworCisJCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKworCQkJCQkvLworCQkJCQkvLyBraWxsIEFURSBkYWVtb24gd2hlbiBsZWF2aW5nIEFURSBtb2RlLgorCQkJCQkvLyBXZSBtdXN0IGtpbGwgQVRFIGRhZW1vbiBmaXJzdCBiZWZvcmUgc2V0dGluZyBBVEVTVE9QLAorCQkJCQkvLyBvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KKyNpZm5kZWYgVUNPUworCQkJCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocEFkYXB0ZXItPmF0ZS5BdGVQaWQsIFNJR1RFUk0sIDEpOworCQkJCQlpZiAocmV0KQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIHNpZ25hbCB0aHJlYWRcbiIsIHBBZGFwdGVyLT5uZXRfZGV2LT5uYW1lKSk7CisJCQkJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQkJCX0KKworCQkJCS8vIEFQIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQkvLyBTb21lb25lIGhhcyBraWxsZWQgYXRlIGRhZW1vbiB3aGlsZSBRQSBHVUkgaXMgc3RpbGwgb3Blbi4KKwkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RPUCIpOworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVBfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMOgorCQkJeworCQkJCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKKwkJCQlVU0hPUlQgY2hhbm5lbDsKKworCQkJCW1lbWNweSgmUjEsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJlIyLCBwUmFDZmctPmRhdGErMiwgNCk7CisJCQkJbWVtY3B5KCZSMywgcFJhQ2ZnLT5kYXRhKzYsIDQpOworCQkJCW1lbWNweSgmUjQsIHBSYUNmZy0+ZGF0YSsxMCwgNCk7CisJCQkJbWVtY3B5KCZjaGFubmVsLCBwUmFDZmctPmRhdGErMTQsIDIpOworCisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxID0gbnRvaGwoUjEpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMiA9IG50b2hsKFIyKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMgPSBudG9obChSMyk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0ID0gbnRvaGwoUjQpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5DaGFubmVsID0gbnRvaHMoY2hhbm5lbCk7CisKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JGX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICBicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQsIHZhbHVlLCB0bXA7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJLyogInRtcCIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgb2Zmc2V0LCB0bXApOworCQkJCXZhbHVlID0gdG1wOworCQkJCXZhbHVlID0gaHRvbnModmFsdWUpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRVBST00gUmVhZCBvZmZzZXQgPSAweCUwNHgsIHZhbHVlID0gMHglMDR4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg0KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgMik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorICAgICAgICAgICAJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrRUVQUk9NX1NJWkUpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciwgKFVDSEFSICopJnBSYUNmZy0+c3RhdHVzLCBFRVBST01fU0laRSk7CisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQUQ6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVSU5UMzIJdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldCBvdXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCA0KTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQsIHZhbHVlOworCisJCQkJbWVtY3B5KCZvZmZzZXQsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGErMiwgNCk7CisKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3Qgb3V0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfSU9fV1JJVEU6IG9mZnNldCA9ICV4LCB2YWx1ZSA9ICV4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19XUklURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEs6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVU0hPUlQJbGVuOworCisJCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQkJaWYgKGxlbiA+IDM3MSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgibGVuIGlzIHRvbyBsYXJnZSwgbWFrZSBpdCBzbWFsbGVyXG4iKSk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCVJUTVBfSU9fUkVBRF9CVUxLKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKW9mZnNldCwgbGVuKjQpOy8vIHVuaXQgaW4gZm91ciBieXRlcworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQkJQX1JFQUQ4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQl2YWx1ZSA9IDA7CisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgJnZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygzKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXBSYUNmZy0+ZGF0YVswXSA9IHZhbHVlOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAgdmFsdWUgPSAleFxuIiwgdmFsdWUpKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDhcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFODoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0OworCQkJCVVDSEFSCXZhbHVlOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMSk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCisJCQkJaWYgKChvZmZzZXQgPT0gQkJQX1IxKSB8fCAob2Zmc2V0ID09IEJCUF9SMykpCisJCQkJeworCQkJCQlTeW5jVHhSeENvbmZpZyhwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1dSSVRFOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGo7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTM3OyBqKyspCisJCQkJeworCQkJCQlwUmFDZmctPmRhdGFbal0gPSAwOworCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbal0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzEzNyk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQorCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyK29mZnNldCwgbGVuKTsKKwkJCWVsc2UKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIgKyBvZmZzZXQsIChVQ0hBUiAqKXBSYUNmZy0+ZGF0YSArIDIsIGxlbik7CisJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgorCQl7CisJCQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKKwkJCVVTSE9SVCBsZW47CisKKwkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopJnZhbHVlLCBwUmFDZmctPmRhdGErNCtpLCA0KTsKKwkJCQlwcmludGsoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCAob2Zmc2V0ICtpKSAmIDB4ZmZmZiwgdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQlwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0gPSAwOworCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfUkFMSU5LX1JUMzA1MgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTDoKKwkJCXsKKwkJCQlVQ0hBUgljaGFubmVsOworCQkJCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLworCisJCQkJY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOworCQkJCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIgKyAoc2l6ZW9mKElOVDMyKSozKjEwKSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVI6CisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVTJNLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkJlYWNvbiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMxLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMywgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4TWdtdCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Ml0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIxLCA0KTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis2MCk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6CisJCQl7CisJCQkJcEFkYXB0ZXItPmF0ZS5VMk0gPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLkJlYWNvbiA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMwID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMxID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMyID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMzID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4SENDQSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKKwkJCXsKKwkJCQlVU0hPUlQgKnA7CisJCQkJVVNIT1JUCWVyciA9IDE7CisJCQkJVUNIQVIgICBCYnAyMlZhbHVlID0gMCwgQmJwMjRWYWx1ZSA9IDA7CisKKwkJCQlpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXRlIFR4IGlzIGFscmVhZHkgcnVubmluZywgdG8gcnVuIG5leHQgVHgsIHlvdSBtdXN0IHN0b3AgaXQgZmlyc3RcbiIpKTsKKwkJCQkJZXJyID0gMjsKKwkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgIShwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJCQkJeworCQkJCQlpbnQgaSA9IDA7CisKKwkJCQkJd2hpbGUgKChpKysgPCAxMCkgJiYgKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkpCisJCQkJCXsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJCX0KKworCQkJCQkvLyBmb3JjZSBpdCB0byBzdG9wCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgPSAwOworCQkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJCQkJLy9wQWRhcHRlci0+YXRlLlJlcGVhdCA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQkJCX0KKworCQkJCS8vIElmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIgaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgorCQkJCWlmIChudG9ocyhwUmFDZmctPmxlbmd0aCkgIT0gMCkKKwkJCQl7CisJCQkJCS8vIEdldCBmcmFtZSBpbmZvCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhXSSwgcFJhQ2ZnLT5kYXRhICsgMiwgMTYpOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpJnBBZGFwdGVyLT5hdGUuVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhDb3VudCwgcFJhQ2ZnLT5kYXRhICsgMTgsIDQpOworCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSBudG9obChwQWRhcHRlci0+YXRlLlR4Q291bnQpOworCisJCQkJCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjJdKTsKKwkJCQkJLy9wID0gcFJhQ2ZnLT5kYXRhICsgMjI7CisJCQkJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFCisJCQkJCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyNF0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyNDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ITGVuID0gbnRvaHMoKnApOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLkhMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLkhMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gMzsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5IZWFkZXIsIHBSYUNmZy0+ZGF0YSArIDI2LCBwQWRhcHRlci0+YXRlLkhMZW4pOworCisKKwkJCQkJcEFkYXB0ZXItPmF0ZS5QTGVuID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpIC0gKHBBZGFwdGVyLT5hdGUuSExlbiArIDI4KTsKKworCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5QTGVuID4gMzIpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5QTGVuID4gMzJcbiIpKTsKKwkJCQkJCWVyciA9IDQ7CisJCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCQl9CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuUGF0dGVybiwgcFJhQ2ZnLT5kYXRhICsgMjYgKyBwQWRhcHRlci0+YXRlLkhMZW4sIHBBZGFwdGVyLT5hdGUuUExlbik7CisJCQkJCXBBZGFwdGVyLT5hdGUuRExlbiA9IHBBZGFwdGVyLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgLSBwQWRhcHRlci0+YXRlLkhMZW47CisJCQkJfQorCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMjIsICZCYnAyMlZhbHVlKTsKKworCQkJCXN3aXRjaCAoQmJwMjJWYWx1ZSkKKwkJCQl7CisJCQkJCWNhc2UgQkJQMjJfVFhGUkFNRToKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5UeENvdW50ID09IDApCisJCQkJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJCX0KKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYRlJBTUVcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQOgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQXG4iKSk7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIDI0LCAmQmJwMjRWYWx1ZSk7CisKKwkJCQkJCQlzd2l0Y2ggKEJicDI0VmFsdWUpCisJCQkJCQkJeworCQkJCQkJCQljYXNlIEJCUDI0X1RYQ09OVDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ09OVFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIEJCUDI0X0NBUlJTVVBQOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSU1VQUFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlJTVVBQOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENBUlI6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCSAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSB3YXMgZmFpbGVkIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisJICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworCSAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKwkJCQkJeworCSAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworVFhfU1RBUlRfRVJST1I6CisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucyhlcnIpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmZWVkYmFjayBvZiBUWF9TVEFSVF9FUlJPUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgorCQkJeworCQkJCVVJTlQzMiBjb3VudDsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJY291bnQgPSBodG9ubChwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUmFDZmctPmRhdGEsICZjb3VudCwgNCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCXBBZGFwdGVyLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7CisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVE9QIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBuZXcgQVRFIEdVSShub3QgUUEpLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVI6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKworCQkJCVNldF9BVEVfVFhfQldfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQlcgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjA6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworCisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCwgNCk7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQl7CisJCQkJCUlOVDMyIFJTU0kwID0gMDsKKwkJCQkJSU5UMzIgUlNTSTEgPSAwOworCQkJCQlJTlQzMiBSU1NJMiA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTEgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kxIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTIgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kyIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmUlNTSTEsIDQpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJlJTU0kyLCA0KTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzUyKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCisJCQkJCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNDQpOworCQkJCX0KKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDE7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7CisKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjE6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjEsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMSBpcyBkb25lICFcbiAoQUREUjEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjFbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIxWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMiwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyIGlzIGRvbmUgIVxuIChBRERSMiA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMlswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjJbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIzLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjMgaXMgZG9uZSAhXG4gKEFERFIzID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIzWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyM1sxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1syXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1szXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUkFURToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUkFURVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU46CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQ6CisJCQl7CisJCQkJVVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKwkJCQkvKiBUWF9GUkFNRV9DT1VOVCA9PSAwIG1lYW5zIHR4IGluZmluaXRlbHkgKi8KKwkJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl7CisJCQkJCS8qIFVzZSBUeENvdW50ID0gMHhGRkZGRkZGRiB0byBhcHByb3hpbWF0ZSB0aGUgaW5maW5pdHkuICovCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkYXB0ZXItPmF0ZS5UeENvdW50KSk7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl7CisJCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2MocEFkYXB0ZXIsIHN0cik7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUU6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKyAgICBBU1NFUlQocFJhQ2ZnICE9IE5VTEwpOworICAgIGlmIChwUmFDZmcgIT0gTlVMTCkKKyAgICB7CisgICAga2ZyZWUocFJhQ2ZnKTsKKyAgICB9CisJcmV0dXJuOworfQorCitWT0lEIEJ1YmJsZVNvcnQoSU5UMzIgbiwgSU5UMzIgYVtdKQoreworCUlOVDMyIGssIGosIHRlbXA7CisKKwlmb3IgKGsgPSBuLTE7ICBrPjA7ICBrLS0pCisJeworCQlmb3IgKGogPSAwOyBqPGs7IGorKykKKwkJeworCQkJaWYoYVtqXSA+IGFbaisxXSkKKwkJCXsKKwkJCQl0ZW1wID0gYVtqXTsKKwkJCQlhW2pdPWFbaisxXTsKKwkJCQlhW2orMV09dGVtcDsKKwkJCX0KKwkJfQorCX0KK30KKworVk9JRCBDYWxOb2lzZUxldmVsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiBjaGFubmVsLCBJTlQzMiBSU1NJWzNdWzEwXSkKK3sKKwlJTlQzMgkJUlNTSTAsIFJTU0kxLCBSU1NJMjsKKyAJQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKKwlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKKwlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7CisJVVNIT1JUCQlMTkFfR2FpbiA9IDA7CisJSU5UMzIgICAgICAgaiA9IDA7CisJVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKwlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7CisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOworCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKKworCS8vIGZvciBOb2lzZSBMZXZlbAorCWlmIChjaGFubmVsIDw9IDE0KQorCXsKKwkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKKwkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwllbHNlCisJeworCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKKwkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwl9CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJeworCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKwkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkJbWRlbGF5KDUpOworCisJCWRhdGEgPSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKKwkJZGF0YSA9IDB4NDA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7CisJCW1kZWxheSg1KTsKKworCQkvLyBTdGFydCBSeAorCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKKworCQltZGVsYXkoNSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisJCXsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKKworCQkJbWRlbGF5KDEwKTsKKworCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMAorCQkJaWYgKEJicFI1MFJzc2kwID09IDApCisJCQl7CisJCQkJUlNTSTAgPSAtMTAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOworCQkJfQorCQkJUlNTSVswXVtqXSA9IFJTU0kwOworCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMQorCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQorCQkJCXsKKwkJCQkJUlNTSTEgPSAtMTAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKKwkJCQl9CisJCQkJUlNTSVsxXVtqXSA9IFJTU0kxOworCQkJfQorCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMgorCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQorCQkJCQlSU1NJMiA9IC0xMDA7CisJCQkJZWxzZQorCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKKworCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKKwkJCX0KKwkJfQorCisJCS8vIFN0b3AgUngKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOworCisJCW1kZWxheSg1KTsKKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCWF0ZV9wcmludCgiTm9pc2UgTGV2ZWw6IENoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlhdGVfcHJpbnQoIlJTU0kwID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQlSU1NJWzBdWzBdLCBSU1NJWzBdWzFdLCBSU1NJWzBdWzJdLAorCQkJUlNTSVswXVszXSwgUlNTSVswXVs0XSwgUlNTSVswXVs1XSwKKwkJCVJTU0lbMF1bNl0sIFJTU0lbMF1bN10sIFJTU0lbMF1bOF0sCisJCQlSU1NJWzBdWzldKTsKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kxID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsxXVswXSwgUlNTSVsxXVsxXSwgUlNTSVsxXVsyXSwKKwkJCQlSU1NJWzFdWzNdLCBSU1NJWzFdWzRdLCBSU1NJWzFdWzVdLAorCQkJCVJTU0lbMV1bNl0sIFJTU0lbMV1bN10sIFJTU0lbMV1bOF0sCisJCQkJUlNTSVsxXVs5XSk7CisJCX0KKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kyID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsyXVswXSwgUlNTSVsyXVsxXSwgUlNTSVsyXVsyXSwKKwkJCQlSU1NJWzJdWzNdLCBSU1NJWzJdWzRdLCBSU1NJWzJdWzVdLAorCQkJCVJTU0lbMl1bNl0sIFJTU0lbMl1bN10sIFJTU0lbMl1bOF0sCisJCQkJUlNTSVsyXVs5XSk7CisJCX0KKyNlbmRpZiAvLyAwIC8vCisJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMF0pOwkvLyAxUgorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsxXSk7CisJCX0KKworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMl0pOworCQl9CisKKyNpZiAwLy8gRGVidWcgTWVzc2FnZS4uLi4uLi4uLi4uLi4uLi4KKwkJYXRlX3ByaW50KCJcbkFmdGVyIFNvcnRpbmcuLi4uQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorCQlhdGVfcHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworI2VuZGlmIC8vIDAgLy8KKwl9CisKKwlwQWQtPmF0ZS5DaGFubmVsID0gT3JnX0NoYW5uZWw7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKworCS8vIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBPcmdfQkJQNjZ2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgT3JnX0JCUDY5dmFsdWUpOworICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIE9yZ19CQlA3MHZhbHVlKTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZyhQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpCit7CisJVUNIQVIgdG1wID0gMCwgYmJwX2RhdGEgPSAwOworCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisKKwkvKiBjb25maXJtIGFnYWluICovCisJQVNTRVJUKGJicF9kYXRhID09IHZhbHVlKTsKKworCXN3aXRjaChvZmZzZXQpCisJeworCQljYXNlIEJCUF9SMToKKwkJCS8qIE5lZWQgdG8gc3luYy4gdHggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDE4ICovKSA+PiAzOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCQkgICAgfQorCQkJYnJlYWs7LyogY2FzZSBCQlBfUjEgKi8KKworCQljYXNlIEJCUF9SMzoKKwkJCS8qIE5lZWQgdG8gc3luYy4gcnggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgMSkgfCAoMSA8PCAwKSkvKiAweDAzICovKTsKKwkJICAgIHN3aXRjaCh0bXApCisJCSAgICB7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDMgOjogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMzoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAwIDo6IEFEQyAwIHdpbGwgYmUgdXNlZCBieSBRQSwgKi8KKwkJCQkvKiB1bmxlc3MgdGhlIEJCUCBSMyBiaXRbNDozXSA9IDIgKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDE7CisJCQkJCXRtcCA9ICgoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDAzICovKSA+PiAzKTsKKwkJCQkJaWYgKHRtcCA9PSAyKS8vIDNSCisJCQkJCXsKKwkJCQkJCS8qIERlZmF1bHQgOiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEgKi8KKwkJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDA7CisJCQkJCX0KKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDEgOjogQURDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMToKKwkJCQkJLyogQW50ZW5uYSB0d28gKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMjsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDIgOjogQURDIDIgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQW50ZW5uYSB0aHJlZSAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOworCQkgICAgICAgICAgICBicmVhazsKKwkJICAgICAgICBkZWZhdWx0OgorCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQoreworCVVMT05HIGksIFZhbHVlID0gMDsKKwlVTE9ORyAqcERzdCwgKnBTcmM7CisJVUNIQVIgKnA4OworCisJcDggPSBzcmM7CisJcERzdCA9IChVTE9ORyAqKSBkc3Q7CisJcFNyYyA9IChVTE9ORyAqKSBzcmM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IChsZW4vNCk7IGkrKykKKwl7CisJCS8qIEZvciBhbGlnbm1lbnQgaXNzdWUsIHdlIG5lZWQgYSB2YXJpYWJsZSAiVmFsdWUiLiAqLworCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgNCk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgNCk7CisJCXBEc3QrKzsKKwkJcFNyYysrOworCX0KKwlpZiAoKGxlbiAlIDQpICE9IDApCisJeworCQkvKiB3aXNoIHRoYXQgaXQgd2lsbCBuZXZlciByZWFjaCBoZXJlICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCAobGVuICUgNCkpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIChsZW4gJSA0KSk7CisJfQorfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaTsKKwlVQ0hBUiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gZHN0OworCXBTcmMgPSBzcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbi8yKTsgaSsrKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAyKTsKKwkJKigoVVNIT1JUICopcERzdCkgPSBodG9ucygqKChVU0hPUlQgKilwRHN0KSk7CisJCXBEc3QrPTI7CisJCXBTcmMrPTI7CisJfQorCisJaWYgKChsZW4gJSAyKSAhPSAwKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQoreworCVVJTlQzMiBpLCBWYWx1ZTsKKwlVSU5UMzIgKnBEc3QsICpwU3JjOworCisJcERzdCA9IChVSU5UMzIgKikgZHN0OworCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCXJldHVybjsKK30KKworLy8gVE9ETzoKKyNpZiAwCisvKiBUaGVzZSB3b3JrIG9ubHkgd2hlbiBSQUxJTktfQVRFIGlzIGRlZmluZWQgKi8KK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJVUNIQVIgYnVmZmVyWzI2XSA9IHsweDg4LCAweDAyLCAweDJjLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDAwLCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweGMwLCAweDIyLCAweDAwLCAweDAwfTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlpZiAocEFkLT5hdGUuVHhTdGF0dXMgIT0gMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcEFkLT5hdGUuVHhJbmZvID0gMHgwNDAwMDAwMDsKKwliemVybygmcEFkLT5hdGUuVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOy8vIE1PREVfQ0NLCisJcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgPSAxMjI2OworCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKKwkvL3BBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwlwQWQtPmF0ZS5UeENvdW50ID0gdmFsdWU7CisJcEFkLT5hdGUuUUlEID0gMDsKKwlwQWQtPmF0ZS5ITGVuID0gMjY7CisJcEFkLT5hdGUuUExlbiA9IDA7CisJcEFkLT5hdGUuRExlbiA9IDEyMDA7CisJbWVtY3B5KHBBZC0+YXRlLkhlYWRlciwgYnVmZmVyLCAyNik7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJLy9wT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCS8vdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+QXRlVHhUYXNrKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLyogZW5kIG9mICNpZiAwICovCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1R4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlRYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9SeFN0b3BfUHJvY1xuIikpOworCisJaWYgKFNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKSkKKwl7CisJcmV0dXJuIFRSVUU7Cit9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworI2lmIDAKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMCwgdmFsdWU7CisJUFVDSEFSIHAyID0gYXJnOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgPT0gJzonKQorCXsKKwkJQTJIZXgob2Zmc2V0LCBhcmcpOworCQlBMkhleCh2YWx1ZSwgcDIrIDEpOworCX0KKwllbHNlCisJeworCQlBMkhleCh2YWx1ZSwgYXJnKTsKKwl9CisKKwlpZiAob2Zmc2V0ID49IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgdmFsdWUgPSAwLCBvZmZzZXQ7CisKKwlBMkhleChvZmZzZXQsIGFyZyk7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCisJYXRlX3ByaW50KCIleFxuIiwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMDsKKwlQVUNIQVIgcDIgPSBhcmc7CisJVUNIQVIgdmFsdWU7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlROUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVBVQ0hBUiBwMiwgcDMsIHA0OworCVVMT05HIFIxLCBSMiwgUjMsIFI0OworCisJcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXAzID0gcDIgKyAxOworCisJd2hpbGUoKCpwMyAhPSAnOicpICYmICgqcDMgIT0gJ1wwJykpCisJeworCQlwMysrOworCX0KKworCWlmICgqcDMgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwNCA9IHAzICsgMTsKKworCXdoaWxlKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQorCXsKKwkJcDQrKzsKKwl9CisKKwlpZiAoKnA0ICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisKKwlBMkhleChSMSwgYXJnKTsKKwlBMkhleChSMiwgcDIgKyAxKTsKKwlBMkhleChSMywgcDMgKyAxKTsKKwlBMkhleChSNCwgcDQgKyAxKTsKKworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZgkvLyBSQUxJTktfMjh4eF9RQSAvLworCisjZW5kaWYJLy8gUkFMSU5LX0FURSAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFhNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0FURV9IX18KKyNkZWZpbmUgX19BVEVfSF9fCisKKyNpZm5kZWYgVUNPUworI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCisjZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNlbHNlIC8vICFVQ09TIC8vCisjZGVmaW5lIGZBVEVfTE9BRF9FRVBST00JCQkJCQkweDBDNDMKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CitleHRlcm4gdm9pZCBwdXRzIChjb25zdCBjaGFyICpzKTsKKworLyogc3BlY2lmaWNseSBkZWZpbmVkIHRvIHJlZGlyZWN0IGFuZCBzaG93IGF0ZS1yZWxhdGVkIG1lc3NhZ2VzIHRvIGhvc3QuICovCisvKiBUcnkgdG8gZGVmaW5lIGF0ZV9wcmludCBhcyBhIG1hY3JvLiAqLworI2RlZmluZSBhdGVfcHJpbnQoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgXAorZG97ICAgaW50ICgqb3JnX3JlbW90ZV9kaXNwbGF5KShjaGFyICopID0gTlVMTDsgICBcCisJb3JnX3JlbW90ZV9kaXNwbGF5ID0gcmVtb3RlX2Rpc3BsYXk7XAorCS8qIFNhdmUgb3JpZ2luYWwgInJlbW90ZV9kaXNwbGF5IiAqL1wKKwlyZW1vdGVfZGlzcGxheSA9IChpbnQgKCopKGNoYXIgKikpQ29uc29sZVJlc3BvbnNlOyAgICAgICAgICAgXAorCXByaW50ayhmbXQsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgXAorCS8qIFJlc3RvcmUgdGhlIHJlbW90ZV9kaXNwbGF5IGZ1bmN0aW9uIHBvaW50ZXIgKi8gICAgICAgIFwKKwlyZW1vdGVfZGlzcGxheSA9IG9yZ19yZW1vdGVfZGlzcGxheTsgfXdoaWxlKDApCisKKyNkZWZpbmUgQVRFREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgCVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKExldmVsKSA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdGVfcHJpbnQgRm10OwkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19QUklOVEsgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworCisjZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQorCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSAiUlQyODYwIi4gKi8KKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorLyogaU5JQyBoYXMgaXRzIG93biBFRVBST01fQklOX0ZJTEVfTkFNRSAqLworI2lmbmRlZiBVQ09TCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworVk9JRCBydF9lZV9yZWFkX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVVNIT1JUICpEYXRhKTsKKworCitWT0lEIHJ0X2VlX3dyaXRlX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUICpEYXRhKTsKKworSU5UIFNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMgICAgcDI4eHhSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCXBIZWFkZXIpOworCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBCdWJibGVTb3J0KAorCUlOICBJTlQzMiBuLAorCUlOICBJTlQzMiBhW10pOworCitWT0lEIENhbE5vaXNlTGV2ZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIGNoYW5uZWwsCisJT1VUIElOVDMyICAgICAgICAgICBidWZmZXJbM11bMTBdKTsKKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVTSE9SVAkJCW9mZnNldCwKKwlJTglVQ0hBUgkJCXZhbHVlKTsKKworI2lmIDAKK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgIC8vIDAgLy8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZiAwCitJTlQgU2V0X0VFUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydF9jb25maWcuaAorCisJQWJzdHJhY3Q6CisJQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKKwltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorCisqLworI2lmbmRlZglfX1JUX0NPTkZJR19IX18KKyNkZWZpbmUJX19SVF9DT05GSUdfSF9fCisKKyNpbmNsdWRlICAgICJydG1wX3R5cGUuaCIKKyNpZmRlZiBVQ09TCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgCSJydF91Y29zLmgiCisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZQkicnRfbGludXguaCIKKyNlbmRpZgorI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCisjaW5jbHVkZSAgICAicnQyOHh4LmgiCisKKyNpZmRlZiBSVDI4NjAKKyNpbmNsdWRlCSJydDI4NjAuaCIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaW5jbHVkZSAgICAib2lkLmgiCisjaW5jbHVkZSAgICAibWxtZS5oIgorI2luY2x1ZGUgICAgIndwYS5oIgorI2luY2x1ZGUgICAgIm1kNS5oIgorI2luY2x1ZGUgICAgInJ0bXAuaCIKKyNpbmNsdWRlCSJhcC5oIgorI2luY2x1ZGUJImRmcy5oIgorI2luY2x1ZGUJImNobGlzdC5oIgorI2luY2x1ZGUJInNwZWN0cnVtLmgiCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKyNpbmNsdWRlCSJ2cl9pa2Fucy5oIgorI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0YzE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwpAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7CisKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFJUMjg2MAorQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisjaWZkZWYgUlQyODYwCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKyAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CisJKnBwUGFja2V0ID0gcFBhY2tldDsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlc2NyaXB0aW9uOgorCVRoaXMgcm91dGluZSBmcmVlcyBhIG1pbmlwb3J0IGludGVybmFsbHkgYWxsb2NhdGVkIE5ESVNfUEFDS0VUIGFuZCBpdHMKKwljb3JyZXNwb25kaW5nIE5ESVNfQlVGRkVSIGFuZCBhbGxvY2F0ZWQgbWVtb3J5LgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCit7CisJZGV2X2tmcmVlX3NrYl9hbnkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCkpOworfQorCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gTk9URTogd2UgZG8gaGF2ZSBhbiBhc3N1bXB0aW9uIGhlcmUsIHRoYXQgQnl0ZTAgYW5kIEJ5dGUxIGFsd2F5cyByZWFzaWQgYXQgdGhlIHNhbWUKKy8vCQkJIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcgorTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKKwlJTglQTkRJU19CVUZGRVIJcEZpcnN0QnVmZmVyLAorCUlOCVVDSEFSCQkJRGVzaXJlZE9mZnNldCwKKwlPVVQgUFVDSEFSCQkJcEJ5dGUwLAorCU9VVCBQVUNIQVIJCQlwQnl0ZTEpCit7CisgICAgKnBCeXRlMCA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0KTsKKyAgICAqcEJ5dGUxID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQgKyAxKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit7CisJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKKwlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKK30KKwordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlQTkRJU19QQUNLRVQgcFBhY2tldCA9IE5VTEw7CisKKwlpZiAoKnBwUGFja2V0KQorCQlwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKCpwcFBhY2tldCk7CisKKwlpZiAocFBhY2tldCkKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwkJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJKnBwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAwOworCQlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gTlVMTDsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAwOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSAwOworCisJCSpwU3JjQnVmVkEgPSBOVUxMOworCQkqcFNyY0J1ZkxlbiA9IDA7CisJCSpwcFBhY2tldCA9IE5VTEw7CisJfQorfQorCisvLyBub3QgeWV0IHN1cHBvcnQgTUJTUworUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisgICAgUE5FVF9ERVYgZGV2X3AgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWRldl9wID0gcEFkLT5uZXRfZGV2OworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFTU0VSVChkZXZfcCk7CisJcmV0dXJuIGRldl9wOyAvKiByZXR1cm4gb25lIG9mIE1CU1MgKi8KK30KKworUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOworCVVTSE9SVAkJCURhdGFTaXplOworCVVDSEFSCQkJKnBEYXRhOworCisJRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKworCisJc2tiID0gc2tiX2Nsb25lKFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYgKHNrYikKKwl7CisJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCQlwUmV0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKKworfQorCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQgPSBOVUxMOworCisKKwlpZiAoKHNrYiA9IF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkKKwl7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4pOworCQlza2JfcHV0KHNrYiwgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisJcmV0dXJuIHBQYWNrZXQ7Cit9CisKKworI2RlZmluZSBUS0lQX1RYX01JQ19TSVpFCQk4CitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCXN0cnVjdCBza19idWZmCSpza2IsICpuZXdza2I7CisKKworCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCisJeworCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNrYiA9IG5ld3NrYjsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKK30KKworCisKKworUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqcENsb25lZFBrdDsKKworCUFTU0VSVChwUGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworCS8vIGNsb25lIHRoZSBwYWNrZXQKKwlwQ2xvbmVkUGt0ID0gc2tiX2Nsb25lKHBSeFBrdCwgTUVNX0FMTE9DX0ZMQUcpOworCisJaWYgKHBDbG9uZWRQa3QpCisJeworICAgIAkvLyBzZXQgdGhlIGNvcnJlY3QgZGF0YXB0ciBhbmQgZGF0YSBsZW4KKyAgICAJcENsb25lZFBrdC0+ZGV2ID0gcFJ4UGt0LT5kZXY7CisgICAgCXBDbG9uZWRQa3QtPmRhdGEgPSBwRGF0YTsKKyAgICAJcENsb25lZFBrdC0+bGVuID0gRGF0YVNpemU7CisgICAgCXBDbG9uZWRQa3QtPnRhaWwgPSBwQ2xvbmVkUGt0LT5kYXRhICsgcENsb25lZFBrdC0+bGVuOworCQlBU1NFUlQoRGF0YVNpemUgPCAxNTMwKTsKKwl9CisJcmV0dXJuIHBDbG9uZWRQa3Q7Cit9CisKKy8vCisvLyBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4KKy8vCit2b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKK30KKworCit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlBU1NFUlQocEhlYWRlcjgwMl8zKTsKKworCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCXBPU1BrdC0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOworCisJLy8KKwkvLyBjb3B5IDgwMi4zIGhlYWRlcgorCS8vCisJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgTEVOR1RIXzgwMl8zKSwgcEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisKK3ZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCisJc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKKworCUFTU0VSVChwUGFja2V0KTsKKworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisgICAgLyogUHVzaCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJSUtBTk9TX0RhdGFGcmFtZVJ4KHBBZCwgcFJ4UGt0LT5kZXYsIHBSeFBrdCwgcFJ4UGt0LT5sZW4pOworI2Vsc2UKKwlwUnhQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocFJ4UGt0LCBwUnhQa3QtPmRldik7CisKKwluZXRpZl9yeChwUnhQa3QpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KK30KKworCitQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZykKK3sKKwlzZy0+TnVtYmVyT2ZFbGVtZW50cyA9IDE7CisJc2ctPkVsZW1lbnRzWzBdLkFkZHJlc3MgPSAgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCXNnLT5FbGVtZW50c1swXS5MZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwlyZXR1cm4gKHNnKTsKK30KKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1ZkxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdDsKKwlpbnQgeDsKKworCWlmIChSVERlYnVnTGV2ZWwgPCBSVF9ERUJVR19UUkFDRSkKKwkJcmV0dXJuOworCisJcHQgPSBwU3JjQnVmVkE7CisJcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLHN0ciwgIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKKwlmb3IgKHg9MDsgeDxTcmNCdWZMZW47IHgrKykKKwl7CisJCWlmICh4ICUgMTYgPT0gMCkKKwkJCXByaW50aygiMHglMDR4IDogIiwgeCk7CisJCXByaW50aygiJTAyeCAiLCAoKHVuc2lnbmVkIGNoYXIpcHRbeF0pKTsKKwkJaWYgKHglMTYgPT0gMTUpIHByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2VuZCBsb2cgbWVzc2FnZSB0aHJvdWdoIHdpcmVsZXNzIGV2ZW50CisKKwkJU3VwcG9ydCBzdGFuZGFyZCBpd19ldmVudCB3aXRoIElXRVZDVVNUT00uIEl0IGlzIHVzZWQgYmVsb3cuCisKKwkJaXdyZXFfZGF0YS5kYXRhLmZsYWdzIGlzIHVzZWQgdG8gc3RvcmUgZXZlbnRfZmxhZyB0aGF0IGlzIGRlZmluZWQgYnkgdXNlci4KKwkJaXdyZXFfZGF0YS5kYXRhLmxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBldmVudCBsb2cuCisKKwkJVGhlIGZvcm1hdCBvZiB0aGUgZXZlbnQgbG9nIGlzIGNvbXBvc2VkIG9mIHRoZSBlbnRyeSdzIE1BQyBhZGRyZXNzIGFuZAorCQl0aGUgZGVzaXJlZCBsb2cgbWVzc2FnZSAocmVmZXIgdG8gcFdpcmVsZXNzRXZlbnRUZXh0KS4KKworCQkJZXg6IDExOjIyOjMzOjQ0OjU1OjY2IGhhcyBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseQorCisJCXAucy4gVGhlIHJlcXVpcmVtZW50IG9mIFdpcmVsZXNzIEV4dGVuc2lvbiBpcyB2MTUgb3IgbmV3ZXIuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAorCUlOCVBVQ0hBUiAJCQlwQWRkciwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTglDSEFSCQkJUnNzaSkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKworCXVuaW9uIAlpd3JlcV9kYXRhICAgICAgd3JxdTsKKwlQVUNIQVIgCXBCdWYgPSBOVUxMLCBwQnVmUHRyID0gTlVMTDsKKwlVU0hPUlQJZXZlbnQsIHR5cGUsIEJ1ZkxlbjsKKwlVQ0hBUglldmVudF90YWJsZV9sZW4gPSAwOworCisJdHlwZSA9IEV2ZW50X2ZsYWcgJiAweEZGMDA7CisJZXZlbnQgPSBFdmVudF9mbGFnICYgMHgwMEZGOworCisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVDoKKwkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NZU19FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKKwkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NQT09GX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKwl9CisKKwlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXZlbnQgPj0gZXZlbnRfdGFibGVfbGVuKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgZXZlbnQoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHBCdWYpKTsKKworCQlrZnJlZShwQnVmKTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2lyZWxlc3MgZXZlbnQuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyNlbHNlCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgV2lyZWxlc3MgRXh0ZW5zaW9uIE1VU1QgYmUgdjE1IG9yIG5ld2VyLlxuIiwgX19GVU5DVElPTl9fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUpKTsKKwkJZ290byBlcnJfZnJlZV9za19idWZmOworICAgIH0KKworICAgIGlmIChwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgPiBSWF9CVUZGRVJfQUdHUkVTSVpFKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBsYXJnZSEgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpKTsKKwkJZ290byBlcnJfZnJlZV9za19idWZmOworICAgIH0KKworICAgIHBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworICAgIGlmIChwUnhCbGstPnBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgICAgIHBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKyAgICAgICAgaWYgKChwUnhCbGstPnBIZWFkZXItPkZDLlRvRHMgPT0gMSkgJiYKKyAgICAgICAgICAgIChwUnhCbGstPnBIZWFkZXItPkZDLkZyRHMgPT0gMSkpCisgICAgICAgICAgICBoZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWFkZXJfbGVuID0gTEVOR1RIXzgwMl8xMTsKKworICAgICAgICAvLyBRT1MKKyAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCisgICAgCXsKKyAgICAJICAgIGhlYWRlcl9sZW4gKz0gMjsKKyAgICAJCS8vIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZAorICAgIAkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7CisgICAgCX0KKworICAgIAkvLyBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKKyAgICAJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpCisgICAgCXsKKyAgICAJICAgIGhlYWRlcl9sZW4gKz0gNDsKKwkJCS8vIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OworICAgIAl9CisKKyAgICAgICAgLy8gQ29weSBIZWFkZXIKKyAgICAgICAgaWYgKGhlYWRlcl9sZW4gPD0gNDApCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7CisKKyAgICAgICAgLy8gc2tpcCBIVyBwYWRkaW5nCisgICAgCWlmIChwUnhCbGstPlJ4RC5MMlBBRCkKKyAgICAJICAgIHBSeEJsay0+cERhdGEgKz0gKGhlYWRlcl9sZW4gKyAyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcFJ4QmxrLT5wRGF0YSArPSBoZWFkZXJfbGVuOworICAgIH0gLy9lbmQgaWYKKworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPCBwT1NQa3QtPmxlbikgeworICAgICAgICBza2JfdHJpbShwT1NQa3QscFJ4QmxrLT5EYXRhU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2tiX3B1dChwT1NQa3QsKHBSeEJsay0+RGF0YVNpemUgLSBwT1NQa3QtPmxlbikpOworICAgIH0gLy9lbmQgaWYKKworICAgIGlmICgocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkgPiAwKSB7CisJICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7CisJICAgIHNrYl9wdWxsKHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChza2JfaGVhZHJvb20ocE9TUGt0KSA8IChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSsgaGVhZGVyX2xlbikpIHsKKyAgICAgICAgaWYgKHBza2JfZXhwYW5kX2hlYWQocE9TUGt0LCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgKyBoZWFkZXJfbGVuKSwgMCwgR0ZQX0FUT01JQykpIHsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzdjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFNUQV9QUk9GSUxFX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBLmRhdCIKKyNkZWZpbmUgU1RBX1JUTVBfRklSTVdBUkVfRklMRV9OQU1FICIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuYmluIgorI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg2MFNUQSIKKyNkZWZpbmUgU1RBX0RSSVZFUl9WRVJTSU9OCQkJIjEuOC4wLjAiCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisjZGVmaW5lIENBUkRfSU5GT19QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQUNhcmQuZGF0IgorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorI2lmbmRlZiBQQ0lfREVWSUNFCisjZGVmaW5lIFBDSV9ERVZJQ0UodmVuZCxkZXYpIFwKKwkudmVuZG9yID0gKHZlbmQpLCAuZGV2aWNlID0gKGRldiksIFwKKwkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKKyNlbmRpZiAvLyBQQ0lfREVWSUNFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKKyNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZWxzZQorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKSB0aW1lX2FmdGVyKGEsIGIpCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKSBcCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIFwKKwl7IFwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCByZXNlcnZlIG1vZHVsZVxuIiwgX19GVU5DVElPTl9fKSk7IFwKKwkJcmV0dXJuIC0xOyBcCisJfQorCisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZWxzZQorI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpCU1PRF9JTkNfVVNFX0NPVU5UOworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIE1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisKKyNkZWZpbmUgT1NfSFoJCQlIWgorCisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisKKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisKKyNkZWZpbmUgTkRJU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVAorI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgorI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCQkvLzB4MDB+MHgzZgorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCQkvLzB4MDAsMHgxMCwweDIwLDB4MzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUwkJCTB4MTAJCS8vMHg0MCwweDUwLDB4NjAsMHg3MAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQordHlwZWRlZglzdHJ1Y3QgcGlkICoJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCU5VTEwKKyNkZWZpbmUJR0VUX1BJRChfdikJZmluZF9nZXRfcGlkKF92KQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKF92KQorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKHBpZF9ucihfcGlkKSA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoX0EsIF9CLCBfQykKKyNlbHNlCit0eXBlZGVmCXBpZF90CVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQktMQorI2RlZmluZQlHRVRfUElEKF92KQlfdgorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJX3YKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChfcGlkID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3Byb2MoX0EsIF9CLCBfQykKKyNlbmRpZgorCitzdHJ1Y3Qgb3NfbG9jayAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJdW5zaWduZWQgbG9uZyAgCWZsYWdzOworfTsKKworCitzdHJ1Y3Qgb3NfY29va2llIHsKKyNpZmRlZiBSVDI4NjAKKwlzdHJ1Y3QgcGNpX2RldiAJCQkqcGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAJCQkqcGFyZW50X3BjaV9kZXY7CisJZG1hX2FkZHJfdAkJICAJCXBBZF9wYTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlyeF9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAltZ210X2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzBfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMV9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMyX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzNfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWhjY2FfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGJ0dF90YXNrOworI2lmZGVmIFJUMjg2MAorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCisJSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKKwlJTlQgCQkJCQlpb2N0bF9pZjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9WSVJUVUFMX0FEQVBURVIKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlJ0bXBEZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpWaXJ0dWFsRGV2OworfSBWSVJUVUFMX0FEQVBURVIsIFBWSVJUVUFMX0FEQVBURVI7CisKKyN1bmRlZiAgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3R5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Cit0eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKK3R5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKK3R5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKK3R5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7Cit0eXBlZGVmIHNwaW5sb2NrX3QJCQlORElTX1NQSU5fTE9DSzsKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJTkRJU19NSU5JUE9SVF9USU1FUjsKK3R5cGVkZWYgdm9pZAkJCQkqIE5ESVNfSEFORExFOwordHlwZWRlZiBjaGFyIAkJCQkqIFBORElTX0JVRkZFUjsKKworCisKK3ZvaWQgaGV4X2R1bXAoY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyICpwU3JjQnVmVkEsIHVuc2lnbmVkIGludCBTcmNCdWZMZW4pOworCitkbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Cit2b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTU9WRSBUTyBydG1wLmggPworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUEtUU1JDX05ESVMgICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBQS1RTUkNfRFJJVkVSICAgICAgICAgICAweDBmCisjZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCisJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQorCisKKyNkZWZpbmUgUlQyODYwX1BDSV9ERVZJQ0VfSUQJCTB4MDYwMQorCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKSBcCisJbGludXhfcGNpX21hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpCisKKyNkZWZpbmUgUENJX1VOTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgXAorCWxpbnV4X3BjaV91bm1hcF9zaW5nbGUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCisKKyNkZWZpbmUgUENJX0FMTE9DX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKSBcCisJcGNpX2FsbG9jX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfcHRyKQorCisjZGVmaW5lIFBDSV9GUkVFX0NPTlNJU1RFTlQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikgXAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoX3BjaV9kZXYsIF9zaXplLCBfdmlydHVhbF9hZGRyLCBfcGh5c2ljYWxfYWRkcikKKworI2RlZmluZSBERVZfQUxMT0NfU0tCKF9sZW5ndGgpIFwKKwlkZXZfYWxsb2Nfc2tiKF9sZW5ndGgpCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCisjZGVmaW5lIEJFQUNPTl9GUkFNRV9ETUFfQ0FDSEVfV0JBQ0soX3B0ciwgX3NpemUpCVwKKwlkbWFfY2FjaGVfd2JhY2soX3B0ciwgX3NpemUpCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworI2RlZmluZSBOZGlzTUluZGljYXRlU3RhdHVzKF93LCBfeCwgX3ksIF96KQorCisKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUlRNUF9PU19USU1FUjsKKworCisKK3R5cGVkZWYgc3RydWN0ICBfUkFMSU5LX1RJTUVSX1NUUlVDVCAgICB7CisgICAgUlRNUF9PU19USU1FUgkJVGltZXJPYmo7ICAgICAgIC8vIE5kaXMgVGltZXIgb2JqZWN0CisJQk9PTEVBTgkJCQlWYWxpZDsJCQkvLyBTZXQgdG8gVHJ1ZSB3aGVuIGNhbGwgUlRNUEluaXRUaW1lcgorICAgIEJPT0xFQU4gICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgIC8vIFRydWUgaWYgdGltZXIgY2FuY2VsbGVkCisgICAgQk9PTEVBTgkgICAgICAJCVBlcmlvZGljVHlwZTsJLy8gVHJ1ZSBpZiB0aW1lciBpcyBwZXJpb2RpYyB0aW1lcgorICAgIEJPT0xFQU4gICAgICAgICAgICAgUmVwZWF0OyAgICAgICAgIC8vIFRydWUgaWYgcGVyaW9kaWMgdGltZXIKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFRpbWVyVmFsdWU7ICAgICAvLyBUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKKwlVTE9ORwkJCQljb29raWU7CQkJLy8gb3Mgc3BlY2lmaWMgb2JqZWN0Cit9ICAgUkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOworCisKKworCisvLyNkZWZpbmUgREJHCTEKKworLy8KKy8vICBNQUNSTyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uCisvLworCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKExldmVsIDw9IFJURGVidWdMZXZlbCkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorCisKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoIkVSUk9SISEhICIpOyAgICAgICAgICBcCisgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKK3sJCQkJCQkJCQlcCisJcHJpbnRrIEZtdDsJCQkJCVwKK30KKworCisjZWxzZQorI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfRVJSKEZtdCkKKyNlbmRpZgorCisKKy8vCisvLyAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrCisvLworI2RlZmluZSBOZGlzQWxsb2NhdGVTcGluTG9jayhfX2xvY2spICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcGluX2xvY2tfaW5pdCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTmRpc0ZyZWVTcGluTG9jayhsb2NrKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgUlRNUF9TRU1fTE9DSyhfX2xvY2spCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQkJXAorfQorCisjZGVmaW5lIFJUTVBfU0VNX1VOTE9DSyhfX2xvY2spCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKy8vIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUKKyNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJX19pcnFmbGFncyA9IDA7CQkJCQkJCQkJXAorCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCisJcEFkLT5pcnFfZGlzYWJsZWQgfD0gMTsgXAorfQorCisjZGVmaW5lIFJUTVBfSVJRX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOyBcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAorfQorCisjZGVmaW5lIFJUTVBfSU5UX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAorfQorCisjZGVmaW5lIFJUTVBfSU5UX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAorfQorCisjaWZkZWYgUlQyODYwCisjaWYgZGVmaW5lZChJTkZfVFdJTlBBU1MpIHx8IGRlZmluZWQoSU5GX0RBTlVCRSkgfHwgZGVmaW5lZChJS0FOT1NfVlhfMVgwKQorLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAorI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKKwkoKl9wViA9IFNXQVAzMigqKChVSU5UMzIgKikoX3BWKSkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCit9CisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlVSU5UMzIJX1ZhbDsJCQkJCQkJCQkJCQkJXAorCV9WYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQlcCisJX1ZhbCA9IFNXQVAzMihfVik7CQkJCQkJCQkJCQkJXAorCXdyaXRlbChfVmFsLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAorCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQlcCit9CisjZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKKwl3cml0ZXcoU1dBUDE2KChfVikpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKK30KKyNlbHNlCisvL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4CisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UJCQkJCQkJCQkJCQkJCQlcCisJCSpfcFYgPSAwOwkJCQkJCQkJCQkJCQlcCit9CisjZGVmaW5lIFJUTVBfSU9fUkVBRDgoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQkJXAorCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCQlcCit9CisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlbChfViwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBkZWZpbmVkKEJSQ01fNjM1OCkKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICBcCisJVUxPTkcgVmFsOyAgICAgICAgICAgICAgICBcCisJVUNIQVIgX2k7ICAgICAgICAgICAgICAgIFwKKwlfaSA9IChfUiAmIDB4Myk7ICAgICAgICAgICAgIFwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUiAtIF9pKSkpOyAgIFwKKwlWYWwgPSBWYWwgJiAofigweDAwMDAwMGZmIDw8ICgoX2kpKjgpKSk7ICAgICAgICAgXAorCVZhbCA9IFZhbCB8ICgoVUxPTkcpX1YgPDwgKChfaSkqOCkpOyAgICAgICAgIFwKKwl3cml0ZWwoKFZhbCksICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SIC0gX2kpKSk7ICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCit9CisjZW5kaWYKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZXcoKF9WKSwgKFBVU0hPUlQpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwlcCit9CisjZW5kaWYKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisjZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCitkbyB7IFwKKyAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAorICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAorICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCisgICAgICAgIGZvciAoOzspIHsgXAorICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKyAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCisoeyBcCisgICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCisgICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKKyAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAorICAgICAgICBfX3JldDsgXAorfSkKKyNlbmRpZgorI2RlZmluZSBPTkVfVElDSyAxCisjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKK3sJaW50IF9pOyBcCisJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XAorCXdhaXRfcXVldWVfaGVhZF90IF93YWl0OyBcCisJaW5pdF93YWl0cXVldWVfaGVhZCgmX3dhaXQpOyBcCisJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KKworCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKyNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKSBvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKSAgICAgb3NfZnJlZV9tZW0oX3BBZCwgX3BWQSkKKworI2lmZGVmIFJUMjg2MAorI2RlZmluZSBCVUlMRF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJCQkJCQkJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVCkgZGF0YTsJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJX2Z1bmMoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsgCQkJCQkJCVwKKwlpZiAocFRpbWVyLT5SZXBlYXQpCQkJCQkJCQkJCQkJCQkJXAorCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyLT5UaW1lclZhbHVlKTsJCQkJXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworI2RlZmluZSBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCisKKyNkZWZpbmUgR0VUX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQlcCisJCWxpbnV4XyMjX2Z1bmMKKworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorREVDTEFSRV9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTGVhcEF1dGhUaW1lb3V0KTsKKyNlbmRpZgorREVDTEFSRV9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorREVDTEFSRV9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpOworCisKKy8qCisgKiBwYWNrZXQgaGVscGVyCisgKiAJLSBjb252ZXJ0IGludGVybmFsIHJ0IHBhY2tldCB0byBvcyBwYWNrZXQgb3IKKyAqICAgICAgICAgICAgIG9zIHBhY2tldCB0byBydCBwYWNrZXQKKyAqLworI2RlZmluZSBSVFBLVF9UT19PU1BLVChfcCkJCSgoc3RydWN0IHNrX2J1ZmYgKikoX3ApKQorI2RlZmluZSBPU1BLVF9UT19SVFBLVChfcCkJCSgoUE5ESVNfUEFDS0VUKShfcCkpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9EQVRBUFRSKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTEVOKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5sZW4pCisKKyNkZWZpbmUgR0VUX09TX1BLVF9EQVRBVEFJTChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+dGFpbCkKKworI2RlZmluZSBHRVRfT1NfUEtUX0hFQUQoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmhlYWQpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9FTkQoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmVuZCkKKworI2RlZmluZSBHRVRfT1NfUEtUX05FVERFVihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KQorCisjZGVmaW5lIEdFVF9PU19QS1RfVFlQRShfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KSkKKworI2RlZmluZSBHRVRfT1NfUEtUX05FWFQoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPm5leHQpCisKKworI2RlZmluZSBPU19OVE9IUyhfVmFsKSBcCisJCShudG9ocyhfVmFsKSkKKyNkZWZpbmUgT1NfSFRPTlMoX1ZhbCkgXAorCQkoaHRvbnMoX1ZhbCkpCisjZGVmaW5lIE9TX05UT0hMKF9WYWwpIFwKKwkJKG50b2hsKF9WYWwpKQorI2RlZmluZSBPU19IVE9OTChfVmFsKSBcCisJCShodG9ubChfVmFsKSkKKworLyogc3RhdGlzdGljcyBjb3VudGVyICovCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9QQUNLRVRTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9QQUNLRVRTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9FUlJPUlMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0VSUk9SUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9EUk9QUEVEKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9EUk9QUEVEKF9wQWQsIF9kZXYpCisKKworI2RlZmluZSBDQl9PRkYgIDEwCisKKworLy8gICBjaGVjayBEREsgTkRJU19QQUNLRVQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGZpbmQgb3V0IG9ubHkgTWluaXBvcnRSZXNlcnZlZEV4WzAuLjddIGNhbiBiZSB1c2VkIGJ5IG91ciBkcml2ZXIgd2l0aG91dAorLy8gICBhbWJpZ3VpdHkuIEZpZWxkcyBhZnRlciBwUGFja2V0LT5NaW5pcG9ydFJlc2VydmVkRXhbOF0gbWF5IGJlIHVzZWQgYnkgb3RoZXIgd3JhcHBlciBsYXllciB0aHVzIGNyYXNoZXMgdGhlIGRyaXZlcgorLy8KKworLy8gVXNlciBQcmlvcml0eQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVVAoX3AsIF9wcmlvKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSA9IF9wcmlvKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVVAoX3ApCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0pCisKKy8vIEZyYWdtZW50ICMKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCwgX251bSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSA9IF9udW0pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3ApCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdKQorCisvLyAweDAgfjB4N2Y6IFRYIHRvIEFQJ3Mgb3duIEJTUyB3aGljaCBoYXMgdGhlIHNwZWNpZmllZCBBSUQuIGlmIEFJRD4xMjcsIHNldCBiaXQgNyBpbiBSVE1QX1NFVF9QQUNLRVRfRU1BQ1RBQiB0b28uCisvLyh0aGlzIHZhbHVlIGFsc28gYXMgTUFDKG9uLWNoaXAgV0NJRCkgdGFibGUgaW5kZXgpCisvLyAweDgwfjB4ZmY6IFRYIHRvIGEgV0RTIGxpbmsuIGIwfjY6IFdEUyBpbmRleAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0NJRChfcCwgX3dkc2lkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSA9IF93ZHNpZHgpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKF9wKSAgICAgICAgICAJCSgoVUNIQVIpKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdKSkKKworLy8gMHhmZjogUEtUU1JDX05ESVMsIG90aGVyczogbG9jYWwgVFggYnVmZmVyIGluZGV4LiBUaGlzIHZhbHVlIGFmZmVjdHMgaG93IHRvIGEgcGFja2V0CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoX3AsIF9wa3RzcmMpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10gPSBfcGt0c3JjKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfU09VUkNFKF9wKSAgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSkKKworLy8gUlRTL0NUUy10by1zZWxmIHByb3RlY3Rpb24gbWV0aG9kCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9SVFMoX3AsIF9udW0pICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0gPSBfbnVtKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfUlRTKF9wKSAgICAgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSkKKy8vIHNlZSBSVE1QX1MoRylFVF9QQUNLRVRfRU1BQ1RBQgorCisvLyBUWCByYXRlIGluZGV4CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUoX3AsIF9yYXRlKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzVdID0gX3JhdGUpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUoX3ApCQkgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzVdKQorCisvLyBGcm9tIHdoaWNoIEludGVyZmFjZQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSUYoX3AsIF9pZmR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdID0gX2lmZHgpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9JRihfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0pCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoX2JzcykpCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX1dEUyhfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9ic3MpICsgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykpCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX0FQQ0xJKF9wLCBfaWR4KSAgIAlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkpCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01FU0goX3AsIF9pZHgpICAgCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gpKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKF9wKQkJCQkJUlRNUF9HRVRfUEFDS0VUX0lGKChfcCkpCisKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX01PUkVEQVRBKF9wLCBfbW9yZWJpdCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSA9IF9tb3JlYml0KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis3XSkKKworCisjaWYgMAorLy8jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdID0gX2ZsZykKKy8vI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkgICAgICAgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkKKyNlbHNlCisvLworLy8JU2VwY2lmaWMgUGFrY2V0IFR5cGUgZGVmaW5pdGlvbgorLy8KKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfQ0JfT0ZGU0VUCTExCisKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUAkJMHgwMQorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTAkJMHgwMgorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0CQkweDA0CisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSQkJMHgwOAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOCQkweDEwCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVAJMHgyMAorCisvL1NwZWNpZmljCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhfcCwgX2ZsZykJICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQorCisvL0RIQ1AKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKTsJXAorCQkJfXdoaWxlKDApCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApCisKKy8vRUFQT0wKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0VBUE9MKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKTsJXAorCQkJfXdoaWxlKDApCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCkKKworLy9XQUkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dBSShfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJXAorCQkJfXdoaWxlKDApCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9XQUkoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKQorCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpKQorCisvL1ZMQU4KKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1ZMQU4oX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKTsJXAorCQkJfXdoaWxlKDApCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9WTEFOKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pCisKKy8vTExDL1NOQVAKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0xMQ1NOQVAoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKTsJCVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MTENTTkFQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApCisKKy8vIElQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JUFY0KF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpOwlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSVBWNChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KQorCisjZW5kaWYKKworCisvLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEVBUG9MIGZyYW1lIE1VU1QgYmUgY2xlYXIuCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSA9IF9mbGcpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSkKKworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfNVZUKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0gPSBfZmxnKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfNVZUKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyMl0pCisKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyNkZWZpbmUgQlJJREdFX1RBRyAweDM1NTY0MjUyICAgIC8vIGRlcGVuZHMgb24gNVZUIGRlZmluZSBpbiBicl9pbnB1dC5jCisjZW5kaWYKKworCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCisKKworI2RlZmluZSBHRVRfU0dfTElTVF9GUk9NX1BBQ0tFVChfcCwgX3NjKQlcCisgICAgcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoX3AsIF9zYykKKworI2RlZmluZSBOZGlzTW92ZU1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpIG1lbW1vdmUoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQorI2RlZmluZSBOZGlzWmVyb01lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoKSAgICAgICAgIG1lbXNldChEZXN0aW5hdGlvbiwgMCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRmlsbE1lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoLCBGaWxsKSAgIG1lbXNldChEZXN0aW5hdGlvbiwgRmlsbCwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSAgICghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisjZGVmaW5lIFJUTVBFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpCSghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisKKworI2RlZmluZSBSVE1QX0lOQ19SRUYoX0EpCQkwCisjZGVmaW5lIFJUTVBfREVDX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9HRVRfUkVGKF9BKQkJMAorCisKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOworICovCisjZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KFBoeXNpY2FsQWRkcmVzcykJCShQaHlzaWNhbEFkZHJlc3MpCisKKy8qCisgKiBVTE9ORworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcykJCSgwKQorCisvKgorICogVk9JRAorICogUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCVwKKwkJCVBoeXNpY2FsQWRkcmVzcyA9IFZhbHVlOworCisvKgorICogVk9JRAorICogUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKKyAqICAgSU4gVUxPTkcgIFZhbHVlKTsKKyAqLworI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkKKworCisvL0NPTlRBSU5JTkdfUkVDT1JEKHBFbnRyeSwgTkRJU19QQUNLRVQsIE1pbmlwb3J0UmVzZXJ2ZWRFeCk7CisjZGVmaW5lIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpIFwKKwkoUE5ESVNfUEFDS0VUKShwRW50cnkpCisKKyNkZWZpbmUgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpIFwKKwkoUFFVRVVFX0VOVFJZKShwUGFja2V0KQorCisKKyNpZm5kZWYgQ09OVEFJTklOR19SRUNPUkQKKyNkZWZpbmUgQ09OVEFJTklOR19SRUNPUkQoYWRkcmVzcywgdHlwZSwgZmllbGQpCQkJXAorKCh0eXBlICopKChQQ0hBUikoYWRkcmVzcykgLSBvZmZzZXRvZih0eXBlLCBmaWVsZCkpKQorI2VuZGlmCisKKworI2RlZmluZSBSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfU3RhdHVzKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QRnJlZU5kaXNQYWNrZXQoX3BBZCwgX3BQYWNrZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgU1dJVENIX1BoeUFCKF9wQUEsIF9wQkIpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQUFCYXNlUGFIaWdoOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcJQkJCYXNlUGFIaWdoOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFBQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFBQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BBQSwgQkJCYXNlUGFIaWdoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQUEsIEJCQmFzZVBhTG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEJCLCBBQUJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BCQiwgQUFCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBOZGlzV3JpdGVFcnJvckxvZ0VudHJ5KF9hLCBfYiwgX2MsIF9kKQorI2RlZmluZSBOZGlzTUFsbG9jYXRlTWFwUmVnaXN0ZXJzKF9hLCBfYiwgX2MsIF9kLCBfZSkJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCisjZGVmaW5lIE5kaXNBY3F1aXJlU3BpbkxvY2sJCVJUTVBfU0VNX0xPQ0sKKyNkZWZpbmUgTmRpc1JlbGVhc2VTcGluTG9jawkJUlRNUF9TRU1fVU5MT0NLCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzR2V0U3lzdGVtVXBUaW1lKFVMT05HICp0aW1lKQoreworCSp0aW1lID0gamlmZmllczsKK30KKworLy9wUGFja2V0ID0gQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSkgXAorCQkoKFBORElTX1BBQ0tFVCkgKHBFbnRyeSkpCisKK2ludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKworCit2b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KTsKKworI2lmZGVmIFJUMjg2MAorI2lmICFkZWZpbmVkKFBDSV9DQVBfSURfRVhQKQorI2RlZmluZSBQQ0lfQ0FQX0lEX0VYUAkJCSAgICAweDEwCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBDSV9FWFBfTE5LQ1RMKQorI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJCSAgICAweDEwCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBDSV9DTEFTU19CUklER0VfUENJKQorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQkJMHgwNjA0CisjZW5kaWYKKworI2RlZmluZSBQQ0lCVVNfSU5URUxfVkVORE9SICAgICAgICAgMHg4MDg2CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzNjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKQEAgLTAsMCArMSwxNjg2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0X21haW5fZGV2LmMKKworICAgIEFic3RyYWN0OgorICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTYW1wbGUJCU1hci8yMS8wNwkJTWVyZ2UgUlQyODcwIGFuZCBSVDI4NjAgZHJpdmVycy4KKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2RlZmluZSBGT1JUWV9NSFpfSU5UT0xFUkFOVF9JTlRFUlZBTAkoNjAqMTAwMCkgLy8gMSBtaW4KKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKK1VJTlQ4ICBNQ19DYXJkVXNlZFtNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdOworLy8gcmVjb3JkIHVzZWQgY2FyZCBtYWMgYWRkcmVzcyBpbiB0aGUgY2FyZCBsaXN0CitzdGF0aWMgVUlOVDggIE1DX0NhcmRNYWNbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXVs2XTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBWYXJpYWJsZXMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy9zdGF0aWMgUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKKworY2hhciAqbWFjID0gIiI7CQkgICAvLyBkZWZhdWx0IDAwOjAwOjAwOjAwOjAwOjAwCitjaGFyICpob3N0bmFtZSA9ICIiOwkJICAgLy8gZGVmYXVsdCBDTVBDCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikKK01PRFVMRV9QQVJNIChtYWMsICJzIik7CisjZWxzZQorbW9kdWxlX3BhcmFtIChtYWMsIGNoYXJwLCAwKTsKKyNlbmRpZgorTU9EVUxFX1BBUk1fREVTQyAobWFjLCAicnQyOHh4OiB3aXJlbGVzcyBtYWMgYWRkciIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb3RvdHlwZXMgb2YgRnVuY3Rpb25zIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7CitleHRlcm4gdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworZXh0ZXJuIE5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmZGVmIFJUMjg2MAorZXh0ZXJuIHZvaWQgaW5pdF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKK0lOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCisvLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQorc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCitzdGF0aWMgdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworI2VuZGlmCisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKAorICAgIElOICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2UgcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6CisJMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCisJMi4gRnJlZSBtZW1vcnkgZm9yCisJCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQorCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQorCQkoMykgQkEgUmVvcmRlcmluZzogCQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgTWFpblZpcnR1YWxJRl9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKwluZXRpZl9jYXJyaWVyX29mZihwQWQtPm5ldF9kZXYpOworCW5ldGlmX3N0b3BfcXVldWUocEFkLT5uZXRfZGV2KTsKKworCisJVklSVFVBTF9JRl9ET1dOKHBBZCk7CisKKwlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX29wZW4oSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworICAgIFJUTVBfQURBUFRFUgkqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlCT09MRUFOIAkJQ2FuY2VsbGVkID0gRkFMU0U7CisJVUlOVDMyCQkJaSA9IDA7CisKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKworI2lmZGVmIFdEU19TVVBQT1JUCisJV2RzRG93bihwQWQpOworI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKwkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgeworCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIH0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQlVQ0hBUiBpOworCisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJeworCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNSZXEuUmVhc29uID0gIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOworCQkJa2ZyZWUoTXNnRWxlbSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKworCisjaWZkZWYgQ0NYX1NVUFBPUlQKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKKyNlbmRpZgorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJeworCQkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCB0byB3cGFfc3VwcGxpY2FudCBmb3IgaW5mcm9taW5nIGludGVyZmFjZSBkb3duLgorCQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQkJd3JxdS5kYXRhLmZsYWdzID0gUlRfSU5URVJGQUNFX0RPV047CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCQl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJTWxtZVJhZGlvT2ZmKHBBZCk7CisjaWZkZWYgUlQyODYwCisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCisJZm9yIChpID0gMCA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQorCXsKKwkJd2hpbGUgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbaV0gPT0gVFJVRSkKKwkJeworCQkJcHJpbnRrKCJXYWl0aW5nIGZvciBUeFF1ZXVlWyVkXSBkb25lLi4uLi4uLi4uLlxuIiwgaSk7CisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQl9CisJfQorCisJLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKKwlNbG1lSGFsdChwQWQpOworCisJLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKKwlraWxsX3RocmVhZF90YXNrKHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOworCVRwY1JlcVRhYkV4aXQocEFkKTsKKworCisjaWZkZWYgUlQyODYwCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKSkKKwl7CisJCU5JQ0Rpc2FibGVJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCU5JQ0lzc3VlUmVzZXQocEFkKTsKKworCS8vIEZyZWUgSVJRCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCS8vIERlcmVnaXN0ZXIgaW50ZXJydXB0IGZ1bmN0aW9uCisJCVJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8gRnJlZSBSaW5nIG9yIFVTQiBidWZmZXJzCisJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOworCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEZyZWUgQkEgcmVvcmRlciByZXNvdXJjZQorCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKKworCXJldHVybiAwOyAvLyBjbG9zZSBvaworfSAvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCisKK3N0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJUFJUTVBfQURBUFRFUiAJCQlwQWQgPSAoUFJUTVBfQURBUFRFUiluZXRfZGV2LT5tbF9wcml2OworCVVJTlQJCQkJCWluZGV4OworCVVDSEFSCQkJCQlUbXBQaHk7CisJTkRJU19TVEFUVVMJCQkJU3RhdHVzOworCVVJTlQzMiAJCU1hY0NzcjAgPSAwOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeQorCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4KKwlpbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKwkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCisJLy8gRGlzYWJsZSBETUEKKwlSVDI4WFhETUFEaXNhYmxlKHBBZCk7CisKKworCS8vIExvYWQgODA1MSBmaXJtd2FyZQorCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOworCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQorCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKKyNpZmRlZiBSVDI4NjAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQorCXsKKwkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCVN0YXR1cyA9IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCisJLy8gaW5pdGlhbGl6ZSBNTE1FCisJLy8KKworCVN0YXR1cyA9IE1sbWVJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjI7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdAorCS8vCisJVXNlckNmZ0luaXQocEFkKTsKKworCisJUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIxOworCisJQ2ZnSW5pdEhvb2socEFkKTsKKworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKKwlUcGNSZXFUYWJJbml0KHBBZCk7CisKKwkvLworCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0CisJLy8KKwlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjM7CisJfQorCisJLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKKwlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7CisKKwlwcmludGsoIjEuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOworCQlnb3RvIGVycjQ7CisJfQorCisKKworICAgCS8vSW5pdCBCYSBDYXBhYmlsaXR5IHBhcmFtZXRlcnMuCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvLyBVUGRhdGEgdG8gSFQgSUUKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcHJpbnRrKCIyLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKworCS8vIFdlIHNob3VsZCByZWFkIEVFUFJPTSBmb3IgYWxsIGNhc2VzLiAgcnQyODYwYgorCU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHBBZCwgbWFjKTsKKworCXByaW50aygiMy4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsgLy9ydDI4NjBiCisKKwkvLyBTZXQgUEhZIHRvIGFwcHJvcHJpYXRlIG1vZGUKKwlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gTm8gdmFsaWQgY2hhbm5lbHMuCisJaWYgKHBBZC0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwl7CisJCXByaW50aygiV3JvbmcgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY2hhbm5lbCBmb3VuZC4gQ2hlY2sgXCJDb250cnlDb2RlXCIgYW5kIFwiQ2hhbm5lbEdlb2dyYXBoeVwiIHNldHRpbmcuXG4iKTsKKwkJZ290byBlcnI0OworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXByaW50aygiTUNTIFNldCA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwKKyAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSwKKyAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFszXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJVlJfSUtBTk9TX0ZQX0luaXQocEFkLT5BcENmZy5Cc3NpZE51bSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKwkJLy8KKwkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwkvLworCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLy8gODA1MSBmaXJtd2FyZSByZXF1aXJlIHRoZSBzaWduYWwgZHVyaW5nIGJvb3RpbmcgdGltZS4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDB4RkYsIDB4MDAsIDB4MDApOworCisJaWYgKHBBZCAmJiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCXsKKwkJLy8KKwkJLy8gVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZAorCQkvLworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCQl7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCQl9CisJfQorCWVsc2UgaWYgKHBBZCkKKwl7CisJCS8vIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEIhXG4iKSk7CisKKworCX0vLyBlbmQgb2YgZWxzZQorCisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8PT09PSBSVE1QSW5pdGlhbGl6ZSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKworCXJldHVybiBUUlVFOworCisKK2VycjQ6CitlcnIzOgorCU1sbWVIYWx0KHBBZCk7CitlcnIyOgorCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKK2VycjE6CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2Rldik7CisKKwkvLyBzaGFsbCBub3Qgc2V0IG1sX3ByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIG1sX3ByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCisJLy9uZXRfZGV2LT5tbF9wcml2ID0gMDsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCitlcnIwOgorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7CisJcmV0dXJuIEZBTFNFOworfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaW50IHJldHZhbCA9IDA7CisgCVBPU19DT09LSUUgcE9iajsKKworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gMTA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID49IDEyIC8vCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFJUMjg2MAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworICAgIAkvLyBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsCisgICAgCS8vIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4KKyAgICAJLy8gUlQyODYwIFBDSQorICAgIAlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSAmJgorICAgICAgICAJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgIAl7CisgICAgICAgIAlBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIAlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCSAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgCX0KKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBJbml0CisgCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCS8vIHJlc2V0IEFkYXB0ZXIgZmxhZ3MKKwlSVE1QX0NMRUFSX0ZMQUdTKHBBZCk7CisKKwkvLyBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UKKwkvLyByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MKKwlSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2Rldik7CisKKworCS8vIEluaXQgQnNzVGFiICYgQ2hhbm5lbEluZm8gdGFiYmxlcyBmb3IgYXV0byBjaGFubmVsIHNlbGVjdC4KKworCisJLy8gQ2hpcCAmIG90aGVyIGluaXQKKwlpZiAocnQyOHh4X2luaXQobmV0X2RldikgPT0gRkFMU0UpCisJCWdvdG8gZXJyOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCBuZXRfZGV2LT5uYW1lLCBzdHJsZW4obmV0X2Rldi0+bmFtZSkpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIFNldCB1cCB0aGUgTWFjIGFkZHJlc3MKKwlOZGlzTW92ZU1lbW9yeShuZXRfZGV2LT5kZXZfYWRkciwgKHZvaWQgKikgcEFkLT5DdXJyZW50QWRkcmVzcywgNik7CisKKwkvLyBJbml0IElSUSBwYXJhbWV0ZXJzCisJUlQyOFhYX0lSUV9JTklUKHBBZCk7CisKKwkvLyBWYXJpb3VzIEFQIGZ1bmN0aW9uIGluaXQKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJeworCQkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCB0byB3cGFfc3VwcGxpY2FudCBmb3IgaW5mcm9taW5nIGludGVyZmFjZSBkb3duLgorCQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQkJd3JxdS5kYXRhLmZsYWdzID0gUlRfSU5URVJGQUNFX1VQOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwkJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRW5hYmxlIEludGVycnVwdAorCVJUMjhYWF9JUlFfRU5BQkxFKHBBZCk7CisKKwkvLyBOb3cgRW5hYmxlIFJ4VHgKKwlSVE1QRW5hYmxlUnhUeChwQWQpOworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKTsKKworCXsKKwlVSU5UMzIgcmVnID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKKwlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKyAgICAgICAgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIChyZXR2YWwpOworCitlcnI6CisJcmV0dXJuICgtMSk7Cit9IC8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLworCisKKy8qIE11c3Qgbm90IGJlIGNhbGxlZCBmb3IgbWRldiBhbmQgYXBkZXYgKi8KK3N0YXRpYyBORElTX1NUQVRVUyBydF9pZWVlODAyMTFfaWZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzOworCUlOVCAgICAgaT0wOworCUNIQVIgICAgc2xvdF9uYW1lW0lGTkFNU0laXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXZpY2U7CisKKworCS8vZXRoZXJfc2V0dXAoZGV2KTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHJ0Mjh4eF9zZW5kX3BhY2tldHM7CisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBJS0FOT1NfRGF0YUZyYW1lc1R4OworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMjEKKwkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT5nZXRfc3RhdHMgPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzOworCWRldi0+b3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbjsgLy9ydDI4eHhfb3BlbjsKKwlkZXYtPnN0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlOyAvL3J0Mjh4eF9jbG9zZTsKKwlkZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKKwlkZXYtPmRvX2lvY3RsID0gcnQyOHh4X2lvY3RsOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgZGV2LT52YWxpZGF0ZV9hZGRyID0gTlVMTDsKKyNlbmRpZgorCS8vIGZpbmQgYXZhaWxhYmxlIGRldmljZSBuYW1lCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJCQlzcHJpbnRmKHNsb3RfbmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoc2xvdF9uYW1lLCAicmElZCIsIGkpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNikKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldl9uZXQoZGV2KSwgc2xvdF9uYW1lKTsKKyNlbHNlCisgICAgICAgIGRldmljZSA9IGRldl9nZXRfYnlfbmFtZShkZXYtPm5kX25ldCwgc2xvdF9uYW1lKTsKKyNlbmRpZgorI2Vsc2UKKwkJZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKHNsb3RfbmFtZSk7CisjZW5kaWYKKwkJaWYgKGRldmljZSAhPSBOVUxMKSBkZXZfcHV0KGRldmljZSk7CisjZWxzZQorCQlmb3IgKGRldmljZSA9IGRldl9iYXNlOyBkZXZpY2UgIT0gTlVMTDsgZGV2aWNlID0gZGV2aWNlLT5uZXh0KQorCQl7CisJCQlpZiAoc3RybmNtcChkZXZpY2UtPm5hbWUsIHNsb3RfbmFtZSwgNCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmKGRldmljZSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCisJaWYoaSA9PSA4KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwllbHNlCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAocEFkLT5NQ19Sb3dJRCA+PSAwKQorCSAgICAgICAgc3ByaW50ZihkZXYtPm5hbWUsICJyYSUwMmRfJWQiLCBwQWQtPk1DX1Jvd0lELCBpKTsKKwkJZWxzZQorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQlzcHJpbnRmKGRldi0+bmFtZSwgInJhJWQiLCBpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gU3RhdHVzOworCit9CisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBHZXQgY2FyZCBwcm9maWxlIHBhdGguCisKK0FyZ3VtZW50czoKKyAgICBwQWQKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCS0gRmluZCBhIGNhcmQgcHJvZmlsZQorCUZBTFNFCQktIHVzZSBkZWZhdWx0IHByb2ZpbGUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2V4dGVybiBJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpOworCitCT09MRUFOIFJUTVBfQ2FyZEluZm9SZWFkKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKQoreworI2RlZmluZSBNQ19TRUxFQ1RfQ0FSRElECQkwCS8qIHVzZSBDQVJEIElEICgwIH4gMzEpIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBjYXJkcyAqLworI2RlZmluZSBNQ19TRUxFQ1RfTUFDCQkJMQkvKiB1c2UgQ0FSRCBNQUMgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9DQVJEVFlQRQkJMgkvKiB1c2UgQ0FSRCB0eXBlIChhYmduIG9yIGJnbikgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisKKyNkZWZpbmUgTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHR4dF9wLCBjYXJkX2lkKQkJCVwKKwl7CVVJTlQzMiBfbGVuOyBjaGFyIF9jaGFyOwkJCQkJCVwKKwkJZm9yKF9sZW49MDsgX2xlbjxzdHJsZW4oY2FyZF9pZCk7IF9sZW4rKykgewkJXAorCQkJX2NoYXIgPSAqKHR4dF9wICsgX2xlbik7CQkJCQlcCisJCQlpZiAoKCdBJyA8PSBfY2hhcikgJiYgKF9jaGFyIDw9ICdaJykpCQlcCisJCQkJKih0eHRfcCtfbGVuKSA9ICdhJysoX2NoYXItJ0EnKTsJCVwKKwkJfSB9CisKKwlzdHJ1Y3QgZmlsZSAqc3JjZjsKKwlJTlQgcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90IG9yZ2ZzOworCUNIQVIgKmJ1ZmZlciwgKnRtcGJ1ZiwgY2FyZF9pZF9idWZbMzBdLCBSRklDX3dvcmRbMzBdOworCUJPT0xFQU4gZmxnX21hdGNoX29rID0gRkFMU0U7CisJSU5UMzIgY2FyZF9zZWxlY3RfbWV0aG9kOworCUlOVDMyIGNhcmRfZnJlZV9pZCwgY2FyZF9ub3VzZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9tYXRjaF9pZDsKKwlFRVBST01fQU5URU5OQV9TVFJVQyBhbnRlbm5hOworCVVTSE9SVCBhZGRyMDEsIGFkZHIyMywgYWRkcjQ1OworCVVJTlQ4IG1hY1s2XTsKKwlVSU5UMzIgZGF0YSwgY2FyZF9pbmRleDsKKwlVQ0hBUiAqc3RhcnRfcHRyOworCisKKwkvLyBpbml0CisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKwl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKHRtcGJ1ZiA9PSBOVUxMKQorCXsKKwkJa2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJb3JnZnN1aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIG9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwkvLyBnZXQgUkYgSUMgdHlwZQorCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOworCisJaWYgKChkYXRhICYgMHgzMCkgPT0gMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJLy8gOTNDNDYKKwllbHNlIGlmICgoZGF0YSAmIDB4MzApID09IDB4MTApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzY2CisJZWxzZQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M4NgorCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7CisKKwlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAorCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQorCXsKKwkJLyogQUJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7CisJfQorCWVsc2UKKwl7CisJCS8qIEJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKKwl9CisKKwkvLyBnZXQgTUFDIGFkZHJlc3MKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKKworCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7CisJbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7CisJbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKKwltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKKwltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOworCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOworCisJLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKKwlzcmNmID0gZmlscF9vcGVuKENBUkRfSU5GT19QQVRILCBPX1JET05MWSwgMCk7CisJaWYgKElTX0VSUihzcmNmKSkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLCBDQVJEX0lORk9fUEFUSCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBleGlzdHMgc28gcmVhZGluZyB0aGUgY2FyZCBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJcmV0dmFsID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQl7CisJCQkvKiByZWFkIGZhaWwgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgQ0FSRF9JTkZPX1BBVEgsIC1yZXR2YWwpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGdldCBjYXJkIHNlbGVjdGlvbiBtZXRob2QgKi8KKwkJCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7IC8vIGRlZmF1bHQKKworCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNFTEVDVCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJeworCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRElEIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRJRDsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX01BQzsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRFRZUEUiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKKworCQkJLy8gaW5pdAorCQkJY2FyZF9mcmVlX2lkID0gLTE7CisJCQljYXJkX25vdXNlX2lkID0gLTE7CisJCQljYXJkX3NhbWVfbWFjX2lkID0gLTE7CisJCQljYXJkX21hdGNoX2lkID0gLTE7CisKKwkJCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcworCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQljYXJkX2luZGV4KyspCisJCQl7CisJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCXsKKwkJCQkJLy8gTUFDIGlzIGFsbC0wIHNvIHRoZSBlbnRyeSBpcyBhdmFpbGFibGUKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOworCisJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPCAwKQorCQkJCQkJY2FyZF9mcmVlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGZyZWUgZW50cnkKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZpbmQgdGhlIGVudHJ5IHdpdGggc2FtZSBNQUMKKwkJCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKKwkJCQkJCQljYXJkX3NhbWVfbWFjX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IHNhbWUgZW50cnkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIE1BQyBpcyBub3QgYWxsLTAgYnV0IHVzZWQgZmxhZyA9PSAwCisJCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCisJCQkJCQkJKGNhcmRfbm91c2VfaWQgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCisJCQkJCWNhcmRfZnJlZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9ub3VzZV9pZCkpOworCisJCQlpZiAoKGNhcmRfc2FtZV9tYWNfaWQgPj0gMCkgJiYKKwkJCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAorCQkJCShjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKSkpCisJCQl7CisJCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKKwkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9zYW1lX21hY19pZDsKKworCQkJCWlmIChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKQorCQkJCXsKKwkJCQkJLy8gZm9yIENBUkRUWVBFCisJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKworCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZm91bmQgdGhlIGNhcmQgSUQKKwkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKGNhcmRfZnJlZV9pZCA+PSAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7CisJCQkJCQllbHNlCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIk1BQyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisKKwkJCQkJCS8qIHRyeSB0byBmaW5kIHRoZSBrZXkgd29yZCBpbiB0aGUgY2FyZCBmaWxlICovCisJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkvKiBnZXQgdGhlIHJvdyBJRCAoMiBBU0NJSSBjaGFyYWN0ZXJzKSAqLworCQkJCQkJCXN0YXJ0X3B0ciAtPSAyOworCQkJCQkJCWNhcmRfaWRfYnVmWzBdID0gKihzdGFydF9wdHIpOworCQkJCQkJCWNhcmRfaWRfYnVmWzFdID0gKihzdGFydF9wdHIrMSk7CisJCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOworCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IHNpbXBsZV9zdHJ0b2woY2FyZF9pZF9idWYsIDAsIDEwKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCisJCQkJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCQkJCWNhcmRfaW5kZXgrKykKKwkJCQkJCXsKKwkJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCQkJY2FyZF9pbmRleCwgUkZJQ193b3JkKTsKKworCQkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwKKwkJCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvKiBjdXJyZW50IHRoZSBjYXJkIHByb2ZpbGUgaXMgbm90IHVzZWQgKi8KKwkJCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJaWYgKGNhcmRfbm91c2VfaWQgPCAwKQorCQkJCQkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gaWYgbm90IGZpbmQgYSBmcmVlIG9uZSwgdXNlIHRoZSBhdmFpbGFibGUgb25lCisJCQkJCQlpZiAoY2FyZF9tYXRjaF9pZCA8IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjYXJkX21hdGNoX2lkID49IDApCisJCQl7CisJCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJESUQiLCBjYXJkX21hdGNoX2lkKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLAorCQkJCQkJCQkiJTAyZG1hYyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZWFyY2ggS2V5d29yZCA9ICVzXG4iLCBjYXJkX2lkX2J1ZikpOworCisJCQkJLy8gcmVhZCBjYXJkIGZpbGUgcGF0aAorCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8IHNpemVvZihwQWQtPk1DX0ZpbGVOYW1lKSkKKwkJCQkJeworCQkJCQkJLy8gYmFja3VwIGNhcmQgaW5mb3JtYXRpb24KKwkJCQkJCXBBZC0+TUNfUm93SUQgPSBjYXJkX21hdGNoX2lkOyAvKiBiYXNlIDAgKi8KKwkJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKKwkJCQkJCW1lbWNweShNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCBtYWMsIHNpemVvZihtYWMpKTsKKworCQkJCQkJLy8gYmFja3VwIGNhcmQgZmlsZSBwYXRoCisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7CisJCQkJCQlwQWQtPk1DX0ZpbGVOYW1lW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7CisJCQkJCQlmbGdfbWF0Y2hfb2sgPSBUUlVFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSA9ICVzXG4iLCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoKGZsZ19tYXRjaF9vayAhPSBUUlVFKSAmJgorCQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQkJeworCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDA7CisJCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7CisJCQkJfQorCQkJfSAvLyBpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQl9CisJfQorCisJLy8gY2xvc2UgZmlsZQorCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJc2V0X2ZzKG9yZ2ZzKTsKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCXJldHVybiBmbGdfbWF0Y2hfb2s7Cit9CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCVByb2JlIE9LCisJLUVOT0RFVgkJCQlQcm9iZSBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAorICAgIElOICB2b2lkICpfZGV2X3AsCisgICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKKwlJTiAgVUlOVCBhcmdjLAorCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQoreworICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOworICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOworCVBWT0lECQkJCWhhbmRsZTsKKyNpZmRlZiBSVDI4NjAKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2X3AgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNUQSBEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAgICAgICAvLyBSZWQgSGF0IDcuMQorICAgIG5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7CisjZWxzZQorICAgIG5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoUFJUTVBfQURBUFRFUikpOworI2VuZGlmCisgICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKyNlbHNlCisJCU1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgU0VUX01PRFVMRV9PV05FUihuZXRfZGV2KTsKKyNlbmRpZgorCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCisvKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlCisgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQorICAgIFNFVF9ORVRERVZfREVWKG5ldF9kZXYsICYoZGV2X3AtPmRldikpOworI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQorCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKKwlSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCk7CisKKwlzdGF0dXMgPSBSVE1QQWxsb2NBZGFwdGVyQmxvY2soaGFuZGxlLCAmcEFkKTsKKwlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCW5ldF9kZXYtPm1sX3ByaXYgPSAoUFZPSUQpcEFkOworICAgIHBBZC0+bmV0X2RldiA9IG5ldF9kZXY7IC8vIG11c3QgYmUgYmVmb3JlIFJUMjhYWE5ldERldkluaXQoKQorCisJUlQyOFhYTmV0RGV2SW5pdChfZGV2X3AsIG5ldF9kZXYsIHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBwQWQtPlN0YUNmZy5PcmlEZXZUeXBlID0gbmV0X2Rldi0+dHlwZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIFBvc3QgY29uZmlnCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJaWYgKFJUMjhYWFByb2JlUG9zdENvbmZpZyhfZGV2X3AsIHBBZCwgYXJnYykgPT0gRkFMU0UpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKyNlbHNlCisJaWYgKFJUMjhYWFByb2JlUG9zdENvbmZpZyhfZGV2X3AsIHBBZCwgMCkgPT0gRkFMU0UpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCXBBZC0+T3BNb2RlID0gT1BNT0RFX1NUQTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJLy8gZmluZCBpdHMgcHJvZmlsZSBwYXRoCisJcEFkLT5NQ19Sb3dJRCA9IC0xOyAvLyB1c2UgZGVmYXVsdCBwcm9maWxlIHBhdGgKKwlSVE1QX0NhcmRJbmZvUmVhZChwQWQpOworCisJaWYgKHBBZC0+TUNfUm93SUQgPT0gLTEpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCXN0cmNweShwQWQtPk1DX0ZpbGVOYW1lLCBTVEFfUFJPRklMRV9QQVRIKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJKCJNQz4gUk9XID0gJWQsIFBBVEggPSAlc1xuIiwgcEFkLT5NQ19Sb3dJRCwgcEFkLT5NQ19GaWxlTmFtZSkpOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisJLy8gc2FtcGxlIG1vdmUKKwlpZiAocnRfaWVlZTgwMjExX2lmX3NldHVwKG5ldF9kZXYsIHBBZCkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X3VubWFwOworCisgICAgLy8gUmVnaXN0ZXIgdGhpcyBkZXZpY2UKKyAgICBzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisgICAgaWYgKHN0YXR1cykKKyAgICAgICAgZ290byBlcnJfb3V0X3VubWFwOworCisgICAgLy8gU2V0IGRyaXZlciBkYXRhCisJUlQyOFhYX0RSVkRBVEFfU0VUKF9kZXZfcCk7CisKKwkqcHBBZCA9IHBBZDsKKyAgICByZXR1cm4gMDsgLy8gcHJvYmUgb2sKKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Vycl9vdXRfdW5tYXA6CisJUlRNUEZyZWVBZGFwdGVyKHBBZCk7CisJUlQyOFhYX1VOTUFQKCk7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIGZyZWVfbmV0ZGV2KG5ldF9kZXYpOworI2Vsc2UKKwlrZnJlZShuZXRfZGV2KTsKKyNlbmRpZgorCitlcnJfb3V0OgorCVJUMjhYWF9QVVRfREVWSUNFKGRldl9wKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXJldHVybiAoTE9ORylOVUxMOworI2Vsc2UKKyAgICByZXR1cm4gLUVOT0RFVjsgLyogcHJvYmUgZmFpbCAqLworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworfSAvKiBFbmQgb2YgcnQyOHh4X3Byb2JlICovCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBUaGUgZW50cnkgcG9pbnQgZm9yIExpbnV4IGtlcm5lbCBzZW50IHBhY2tldCB0byBvdXIgZHJpdmVyLgorCitBcmd1bWVudHM6CisgICAgc2tfYnVmZiAqc2tiCQl0aGUgcG9pbnRlciByZWZlciB0byBhIHNrX2J1ZmZlci4KKworUmV0dXJuIFZhbHVlOgorICAgIDAKKworTm90ZToKKwlUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBvZiBUeCBQYXRoIGZvciBPcyBkZWxpdmVyeSBwYWNrZXQgdG8KKwlvdXIgZHJpdmVyLiBZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEvQVAgY29tbW9uIGhhbmRsZSBwcm9jZWR1cmVzCisJaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHNrYi0+ZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpbnQgc3RhdHVzID0gMDsKKwlQTkRJU19QQUNLRVQgcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHNrYjsKKworCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRWFwb2xTdGFydCBzaXplIGlzIDE4CisJaWYgKHNrYi0+bGVuIDwgMTQpCisJeworCQkvL3ByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOworCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDApOworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorICAgIGlmICgqKGludCopKHNrYi0+Y2IpID09IEJSSURHRV9UQUcpIHsKKwkJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAxKTsKKyAgICB9CisjZW5kaWYKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKworCQlTVEFTZW5kUGFja2V0cygoTkRJU19IQU5ETEUpcEFkLCAoUFBORElTX1BBQ0tFVCkgJnBQYWNrZXQsIDEpOworCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJc3RhdHVzID0gMDsKK2RvbmU6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgU2VuZCBhIHBhY2tldCB0byBXTEFOLgorCitBcmd1bWVudHM6CisgICAgc2tiX3AgICAgICAgICAgIHBvaW50cyB0byBvdXIgYWRhcHRlcgorICAgIGRldl9wICAgICAgICAgICB3aGljaCBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlCisKK1JldHVybiBWYWx1ZToKKyAgICAwOiB0cmFuc21pdCBzdWNjZXNzZnVsbHkKKyAgICBvdGhlcndpc2U6IHRyYW5zbWl0IGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBydDI4eHhfc2VuZF9wYWNrZXRzKAorCUlOIHN0cnVjdCBza19idWZmIAkJKnNrYl9wLAorCUlOIHN0cnVjdCBuZXRfZGV2aWNlIAkqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaWYgKCEobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIChQTkRJU19QQUNLRVQpc2tiX3AsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZza2JfcC0+Y2JbQ0JfT0ZGXSwgMTUpOworCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChza2JfcCwgTUFJTl9NQlNTSUQpOworCisJcmV0dXJuIHJ0Mjh4eF9wYWNrZXRfeG1pdChza2JfcCk7CisKK30gLyogRW5kIG9mIE1CU1NfVmlydHVhbElGX1BhY2tldFNlbmQgKi8KKworCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKyAgICBJTlQJCQkJCWFsbG9jX3NpemU7CisKKworICAgIC8qIGVuc3VyZSAzMi1ieXRlIGFsaWdubWVudCBvZiB0aGUgcHJpdmF0ZSBhcmVhICovCisgICAgYWxsb2Nfc2l6ZSA9IHNpemVvZiAoKmRldikgKyBzaXplb2ZfcHJpdiArIDMxOworCisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKGRldiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJKCJhbGxvY19uZXRkZXY6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LlxuIikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoZGV2LCAwLCBhbGxvY19zaXplKTsKKworICAgIGlmIChzaXplb2ZfcHJpdikKKyAgICAgICAgZGV2LT5wcml2ID0gKHZvaWQgKikgKCgobG9uZykoZGV2ICsgMSkgKyAzMSkgJiB+MzEpOworCisgICAgc2V0dXAoZGV2KTsKKyAgICBzdHJjcHkoZGV2LT5uYW1lLCBtYXNrKTsKKworICAgIHJldHVybiBkZXY7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKwordm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlwQWQtPmJCcm9hZENvbUhUID0gVFJVRTsKK30gLyogRW5kIG9mIENmZ0luaXRIb29rICovCisKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLS0tPlxuIikpOworCisJcEFkLT5pd19zdGF0cy5zdGF0dXMgPSAwOyAvLyBTdGF0dXMgLSBkZXZpY2UgZGVwZW5kZW50IGZvciBub3cKKworCS8vIGxpbmsgcXVhbGl0eQorCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gKChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgKiAxMikvMTAgKyAxMCk7CisJaWYocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCisJCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gMTAwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgPSBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdOyAvLyBub2lzZSBsZXZlbCAoZEJtKQorCisJcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlICs9IDI1NiAtIDE0MzsKKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCA9IDE7ICAgICAvLyBGbGFncyB0byBrbm93IGlmIHVwZGF0ZWQKKyNpZmRlZiBJV19RVUFMX0RCTQorCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfREJNOwkvLyBMZXZlbCArIE5vaXNlIGFyZSBkQm0KKyNlbmRpZiAvLyBJV19RVUFMX0RCTSAvLworCisJcEFkLT5pd19zdGF0cy5kaXNjYXJkLm53aWQgPSAwOyAgICAgLy8gUnggOiBXcm9uZyBud2lkL2Vzc2lkCisJcEFkLT5pd19zdGF0cy5taXNzLmJlYWNvbiA9IDA7ICAgICAgLy8gTWlzc2VkIGJlYWNvbnMvc3VwZXJmcmFtZQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzXG4iKSk7CisJcmV0dXJuICZwQWQtPml3X3N0YXRzOworfSAvKiBFbmQgb2YgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAqLworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCAvLworCisKKwordm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworI2RlZmluZSBNQVhfVFhfSU5fVEJUVAkJKDE2KQorCit9CisKK0lOVCBydDI4eHhfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIJKnBBZCA9IE5VTEw7CisJSU5UCQkJCXJldCA9IDA7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXJldCA9IHJ0Mjh4eF9zdGFfaW9jdGwobmV0X2RldiwgcnEsIGNtZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIHJldHVybiBldGhlcm5ldCBzdGF0aXN0aWNzIGNvdW50ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgbmV0X2RldiAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gbmV0X2RldmljZQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBuZXRfZGV2aWNlX3N0YXRzKgorCisgICAgTm90ZToKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKAorICAgIElOICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IE5VTEw7CisKKwlpZiAobmV0X2RldikKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQpCisJeworCisJCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKwkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCisJCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKworCQlwQWQtPnN0YXRzLnJ4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzOworCQlwQWQtPnN0YXRzLnR4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlR4RXJyb3JzOworCisJCXBBZC0+c3RhdHMucnhfZHJvcHBlZCA9IDA7CisJCXBBZC0+c3RhdHMudHhfZHJvcHBlZCA9IDA7CisKKwkgICAgcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7ICAgLy8gbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQKKwkgICAgcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7ICAvLyBDb2xsaXNpb24gcGFja2V0cworCisJICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKKwkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCisJICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCisJICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCisJICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0CisKKwkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCisJICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7CisKKwkgICAgLy8gZm9yIGNzbGlwIGV0YworCSAgICBwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOworCisJCXJldHVybiAmcEFkLT5zdGF0czsKKwl9CisJZWxzZQorICAgIAlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdmZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMKQEAgLTAsMCArMSwxOTgxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyB2b2lkIEhUUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAorCUlOCUNIQVIJCSAgKnBJbnB1dCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNkZWZpbmUgRVRIX01BQ19BRERSX1NUUl9MRU4gMTcgIC8vIGluIGZvcm1hdCBvZiB4eDp4eDp4eDp4eDp4eDp4eAorCisvLyBXZSBhc3N1bWUgdGhlIHMxIGlzIGEgc3RpbmcsIHMyIGlzIGEgbWVtb3J5IHNwYWNlIHdpdGggNiBieXRlcy4gYW5kIGNvbnRlbnQgb2YgczEgd2lsbCBiZSBjaGFuZ2VkLgorQk9PTEVBTiBydHN0cm1hY3RvaGV4KGNoYXIgKnMxLCBjaGFyICpzMikKK3sKKwlpbnQgaSA9IDA7CisJY2hhciAqcHRva1MgPSBzMSwgKnB0b2tFID0gczE7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBFVEhfTUFDX0FERFJfU1RSX0xFTikKKwkJcmV0dXJuIEZBTFNFOworCisJd2hpbGUoKCpwdG9rUykgIT0gJ1wwJykKKwl7CisJCWlmKChwdG9rRSA9IHN0cmNocihwdG9rUywgJzonKSkgIT0gTlVMTCkKKwkJCSpwdG9rRSsrID0gJ1wwJzsKKwkJaWYgKChzdHJsZW4ocHRva1MpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnB0b2tTKSkgfHwgKCFpc3hkaWdpdCgqKHB0b2tTKzEpKSkpCisJCQlicmVhazsgLy8gZmFpbAorCQlBdG9IKHB0b2tTLCAmczJbaSsrXSwgMSk7CisJCXB0b2tTID0gcHRva0U7CisJCWlmIChpID09IDYpCisJCQlicmVhazsgLy8gcGFyc2luZyBmaW5pc2hlZAorCX0KKworCXJldHVybiAoIGkgPT0gNiA/IFRSVUUgOiBGQUxTRSk7CisKK30KKworCisvLyB3ZSBhc3N1bWUgdGhlIHMxIGFuZCBzMiBib3RoIGFyZSBzdHJpbmdzLgorQk9PTEVBTiBydHN0cmNhc2VjbXAoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWNoYXIgKnAxID0gczEsICpwMiA9IHMyOworCisJaWYgKHN0cmxlbihzMSkgIT0gc3RybGVuKHMyKSkKKwkJcmV0dXJuIEZBTFNFOworCisJd2hpbGUoKnAxICE9ICdcMCcpCisJeworCQlpZigoKnAxICE9ICpwMikgJiYgKCgqcDEgXiAqcDIpICE9IDB4MjApKQorCQkJcmV0dXJuIEZBTFNFOworCQlwMSsrOworCQlwMisrOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyB3ZSBhc3N1bWUgdGhlIHMxIChidWZmZXIpIGFuZCBzMiAoa2V5KSBib3RoIGFyZSBzdHJpbmdzLgorY2hhciAqIHJ0c3Ryc3RydW5jYXNlY21wKGNoYXIgKiBzMSwgY2hhciAqIHMyKQoreworCUlOVCBsMSwgbDIsIGk7CisJY2hhciB0ZW1wMSwgdGVtcDI7CisKKwlsMiA9IHN0cmxlbihzMik7CisJaWYgKCFsMikKKwkJcmV0dXJuIChjaGFyICopIHMxOworCisJbDEgPSBzdHJsZW4oczEpOworCisJd2hpbGUgKGwxID49IGwyKQorCXsKKwkJbDEtLTsKKworCQlmb3IoaT0wOyBpPGwyOyBpKyspCisJCXsKKwkJCXRlbXAxID0gKihzMStpKTsKKwkJCXRlbXAyID0gKihzMitpKTsKKworCQkJaWYgKCgnYScgPD0gdGVtcDEpICYmICh0ZW1wMSA8PSAneicpKQorCQkJCXRlbXAxID0gJ0EnKyh0ZW1wMS0nYScpOworCQkJaWYgKCgnYScgPD0gdGVtcDIpICYmICh0ZW1wMiA8PSAneicpKQorCQkJCXRlbXAyID0gJ0EnKyh0ZW1wMi0nYScpOworCisJCQlpZiAodGVtcDEgIT0gdGVtcDIpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBsMikKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKworCQlzMSsrOworCX0KKworCXJldHVybiBOVUxMOyAvLyBub3QgZm91bmQKK30KKworLy9hZGQgYnkga2F0aHkKKworIC8qKgorICAqIHN0cnN0ciAtIEZpbmQgdGhlIGZpcnN0IHN1YnN0cmluZyBpbiBhICVOVUwgdGVybWluYXRlZCBzdHJpbmcKKyAgKiBAczE6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICAqLworY2hhciAqIHJ0c3Ryc3RyKGNvbnN0IGNoYXIgKiBzMSxjb25zdCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCQlpZiAoIW1lbWNtcChzMSxzMixsMikpCisJCQlyZXR1cm4gKGNoYXIgKikgczE7CisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcnN0cnRvayAtIFNwbGl0IGEgc3RyaW5nIGludG8gdG9rZW5zCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGN0OiBUaGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCisgKiAqIFdBUk5JTkc6IHN0cnRvayBpcyBkZXByZWNhdGVkLCB1c2Ugc3Ryc2VwIGluc3RlYWQuIEhvd2V2ZXIgc3Ryc2VwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb2xkIGFyY2hpdGVjdHVyZS4KKyAqLworY2hhciAqIF9fcnN0cnRvazsKK2NoYXIgKiByc3RydG9rKGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwljaGFyICpzYmVnaW4sICpzZW5kOworCisJc2JlZ2luICA9IHMgPyBzIDogX19yc3RydG9rOworCWlmICghc2JlZ2luKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOworCWlmICgqc2JlZ2luID09ICdcMCcpCisJeworCQlfX3JzdHJ0b2sgPSBOVUxMOworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKwlzZW5kID0gc3RycGJyayggc2JlZ2luLCBjdCk7CisJaWYgKHNlbmQgJiYgKnNlbmQgIT0gJ1wwJykKKwkJKnNlbmQrKyA9ICdcMCc7CisKKwlfX3JzdHJ0b2sgPSBzZW5kOworCisJcmV0dXJuIChzYmVnaW4pOworfQorCisvKioKKyAqIGRlbGltaXRjbnQgLSByZXR1cm4gdGhlIGNvdW50IG9mIGEgZ2l2ZW4gZGVsaW1pdGVyIGluIGEgZ2l2ZW4gc3RyaW5nLgorICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuCisgKiBAY3Q6IFRoZSBkZWxpbWl0ZXIgdG8gc2VhcmNoIGZvci4KKyAqIE5vdGljZSA6IFdlIHN1cHBvc2UgdGhlIGRlbGltaXRlciBpcyBhIHNpbmdsZS1jaGFyIHN0cmluZyhmb3IgZXhhbXBsZSA6ICI7IikuCisgKi8KK0lOVCBkZWxpbWl0Y250KGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwlJTlQgY291bnQgPSAwOworCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKwljb25zdCBjaGFyICp0b2tlbiA9IHM7CisKKwlmb3IgKCA7OyApCisJeworCQl0b2tlbiA9IHN0cnBicmsodG9rZW4sIGN0KTsgLyogc2VhcmNoIGZvciBkZWxpbWl0ZXJzICovCisKKyAgICAgICAgaWYgKCB0b2tlbiA9PSBOVUxMICkKKwkJeworCQkJLyogYWR2YW5jZWQgdG8gdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyICovCisJCQlicmVhazsKKwkJfQorCQkvKiBza2lwIHRoZSBkZWxpbWl0ZXIgKi8KKwkgICAgKyt0b2tlbjsKKworCQkvKgorCQkgKiBQcmludCB0aGUgZm91bmQgdGV4dDogdXNlIGxlbiB3aXRoICUuKnMgdG8gc3BlY2lmeSBmaWVsZCB3aWR0aC4KKwkJICovCisKKwkJLyogYWNjdW11bGF0ZSBkZWxpbWl0ZXIgY291bnQgKi8KKwkgICAgKytjb3VudDsKKwl9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKgorICAqIGNvbnZlcnRzIHRoZSBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZnJvbSB0aGUgc3RhbmRhcmQgbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbgorICAqIGludG8gYmluYXJ5IGRhdGEuCisgICogcmV0dXJucyBub256ZXJvIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkLCB6ZXJvIGlmIG5vdC4KKyAgKi8KK2ludCBydGluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgdW5zaWduZWQgaW50ICphZGRyKQoreworCXVuc2lnbmVkIGludCAJdmFsOworCWludCAgICAgICAgIAliYXNlLCBuOworCWNoYXIgICAgICAgIAljOworCXVuc2lnbmVkIGludCAgICBwYXJ0c1s0XTsKKwl1bnNpZ25lZCBpbnQgICAgKnBwID0gcGFydHM7CisKKwlmb3IgKDs7KQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KKyAgICAgICAgICAqIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGZvciBDOgorICAgICAgICAgICoJMHg9aGV4LCAwPW9jdGFsLCBvdGhlcj1kZWNpbWFsLgorICAgICAgICAgICovCisgICAgICAgICB2YWwgPSAwOworICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgaWYgKCpjcCA9PSAnMCcpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKCorK2NwID09ICd4JyB8fCAqY3AgPT0gJ1gnKQorICAgICAgICAgICAgICAgICBiYXNlID0gMTYsIGNwKys7CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgIH0KKyAgICAgICAgIHdoaWxlICgoYyA9ICpjcCkgIT0gJ1wwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICB2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAoYmFzZSA9PSAxNiAmJiBpc3hkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgIChjICsgMTAgLSAoaXNsb3dlcigodW5zaWduZWQgY2hhcikgYykgPyAnYScgOiAnQScpKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKCpjcCA9PSAnLicpCisgICAgICAgICB7CisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBJbnRlcm5ldCBmb3JtYXQ6IGEuYi5jLmQgYS5iLmMgICAod2l0aCBjIHRyZWF0ZWQgYXMgMTYtYml0cykKKyAgICAgICAgICAgICAgKiBhLmIgICAgICh3aXRoIGIgdHJlYXRlZCBhcyAyNCBiaXRzKQorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIGlmIChwcCA+PSBwYXJ0cyArIDMgfHwgdmFsID4gMHhmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgKnBwKysgPSB2YWwsIGNwKys7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAvKgorICAgICAgKiBDaGVjayBmb3IgdHJhaWxpbmcganVuay4KKyAgICAgICovCisgICAgIHdoaWxlICgqY3ApCisgICAgICAgICBpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpjcCsrKSkKKyAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAvKgorICAgICAgKiBDb25jb2N0IHRoZSBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHBhcnRzIHNwZWNpZmllZC4KKyAgICAgICovCisgICAgIG4gPSBwcCAtIHBhcnRzICsgMTsKKyAgICAgc3dpdGNoIChuKQorICAgICB7CisKKyAgICAgICAgIGNhc2UgMTogICAgICAgICAvKiBhIC0tIDMyIGJpdHMgKi8KKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOiAgICAgICAgIC8qIGEuYiAtLSA4LjI0IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSBwYXJ0c1swXSA8PCAyNDsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAzOiAgICAgICAgIC8qIGEuYi5jIC0tIDguOC4xNiBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpOworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogYS5iLmMuZCAtLSA4LjguOC44IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpIHwgKHBhcnRzWzJdIDw8IDgpOworICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgKmFkZHIgPSBodG9ubCh2YWwpOworICAgICByZXR1cm4gMTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgRmluZCBrZXkgc2VjdGlvbiBmb3IgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5IHNlY3Rpb24KKyAgICAgICAgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHNlY2lvbiB0byBiZSBmaW5kCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisgICAgICAgIE90aGVycyAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFVDSEFSICBSVE1QRmluZFNlY3Rpb24oCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIENIQVIgdGVtcF9idWZbMzJdOworICAgIFBVQ0hBUiAgcHRyOworCisgICAgc3RyY3B5KHRlbXBfYnVmLCAiRGVmYXVsdCIpOworCisgICAgaWYoKHB0ciA9IHJ0c3Ryc3RyKGJ1ZmZlciwgdGVtcF9idWYpKSAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwdHIrc3RybGVuKCJcbiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKyAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisgICAgeworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpLgorICAgICAgICBJdCBpcyBjYWxsZWQgZm9yIHBhcnNpbmcgU1NJRCBhbmQgYW55IGtleSBzdHJpbmcuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisKKyAgICAvL3RyaW0gdGFiCisgICAgLyogV2UgY2Fubm90IHRyaW0gc3BhY2UoJyAnKSBmb3IgU1NJRCBhbmQga2V5IHN0cmluZy4gKi8KKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICAvL2lmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgaWYoICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBtdWx0aXBsZSBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcldpdGhPZmZzZXQoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgT1VUCVVTSE9SVAkqZW5kX29mZnNldCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIsCisgICAgSU4JQk9PTEVBTgliVHJpbVNwYWNlKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJaWYgKCplbmRfb2Zmc2V0ID49IE1BWF9JTklfQlVGRkVSX1NJWkUpCisJCXJldHVybiAoRkFMU0UpOworCisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisJaWYoKmVuZF9vZmZzZXQgPT0gMCkKKyAgICB7CisJCWlmICgob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisJICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIAkgICAgcmV0dXJuIChGQUxTRSk7CisJCX0KKyAgICB9CisJZWxzZQorCQlvZmZzZXQgPSBidWZmZXIgKyAoKmVuZF9vZmZzZXQpOworCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKwkqZW5kX29mZnNldCA9IGVuZF9wdHIgLSBidWZmZXI7CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKyAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgaWYoKGJUcmltU3BhY2UgJiYgKCpwdHIgPT0gJyAnKSkgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBpbnQgcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsSU4gIGNoYXIgKmJ1ZmZlcixJTiAgVUxPTkcgS2V5VHlwZSxJTiAgSU5UIEJTU0lkeCxJTiAgSU5UIEtleUlkeCkKK3sKKwlQVUNIQVIJCWtleWJ1ZmY7CisJSU5UCQkJaSA9IEJTU0lkeCwgaWR4ID0gS2V5SWR4OworCVVMT05HCQlLZXlMZW47CisJVUNIQVIJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKworCWtleWJ1ZmYgPSBidWZmZXI7CisJS2V5TGVuID0gc3RybGVuKGtleWJ1ZmYpOworCisJaWYgKEtleVR5cGUgPT0gMSkKKwl7Ly9Bc2NpaQorCQlpZiggKEtleUxlbiA9PSA1KSB8fCAoS2V5TGVuID09IDEzKSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwga2V5YnVmZiwgS2V5TGVuKTsKKwkJCWlmIChLZXlMZW4gPT0gNSkKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0YocmElZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UKKwkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwl7Ly9IZXggdHlwZQorCQlpZiggKEtleUxlbiA9PSAxMCkgfHwgKEtleUxlbiA9PSAyNikpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuIC8gMjsKKwkJCUF0b0goa2V5YnVmZiwgcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIEtleUxlbiAvIDIpOworCQkJaWYgKEtleUxlbiA9PSAxMCkKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0YocmElZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UKKwkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJL0YocmElZCkgS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpLCBpZHgrMSwgS2V5TGVuKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCit7CisJY2hhcgkJdG9rX3N0clsxNl07CisJUFVDSEFSCQltYWNwdHI7CisJSU5UCQkJaSA9IDAsIGlkeDsKKwlVTE9ORwkJS2V5VHlwZVtNQVhfTUJTU0lEX05VTV07CisJVUxPTkcJCUtleUlkeDsKKworCU5kaXNaZXJvTWVtb3J5KEtleVR5cGUsIE1BWF9NQlNTSURfTlVNKTsKKworCS8vRGVmYXVsdEtleUlECisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGVmYXVsdEtleUlEIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJS2V5SWR4ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCWlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSk7CisJCQllbHNlCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlEKDB+Myk9JWRcbiIsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQorCXsKKwkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRUeXBlIiwgaWR4ICsgMSk7CisJCS8vS2V5MVR5cGUKKwkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCXsKKwkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJICAgIHsKKwkJCSAgICBLZXlUeXBlW2ldID0gc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKwkJICAgIH0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKwkJCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFN0ciIsIGlkeCArIDEpOworCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJeworCQkJCQlydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBLZXlUeXBlW0JTUzBdLCBCU1MwLCBpZHgpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCX0KK30KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitzdGF0aWMgdm9pZCBydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwlQVUNIQVIJCQkJCW1hY3B0cjsKKwlJTlQJCQkJCQlpPTA7CisJQk9PTEVBTgkJCQkJYldtbUVuYWJsZSA9IEZBTFNFOworCisJLy9XbW1DYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV21tQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApIC8vRW5hYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwkJCWJXbW1FbmFibGUgPSBUUlVFOworCQl9CisJCWVsc2UgLy9EaXNhYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXbW1DYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCX0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vRExTQ2FwYWJsZQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRMU0NhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBUUlVFOworCQl9CisJCWVsc2UgLy9EaXNhYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiRExTQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvL0Fja1BvbGljeSBmb3IgQUNfQkssIEFDX0JFLCBBQ19WSSwgQUNfVk8KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBY2tQb2xpY3kiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWNrUG9saWN5WyVkXT0lZFxuIiwgaSwgcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldKSk7CisJCX0KKwl9CisKKwlpZiAoYldtbUVuYWJsZSkKKwl7CisJCS8vQVBTRENhcGFibGUKKwkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTRENhcGFibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQl7CisJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IFRSVUU7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUpKTsKKwkJfQorCisJCS8vQVBTREFDIGZvciBBQ19CRSwgQUNfQkssIEFDX1ZJLCBBQ19WTworCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQUMiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQl7CisJCQlCT09MRUFOIGFwc2RfYWNbNF07CisKKwkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJCXsKKwkJCQlhcHNkX2FjW2ldID0gKEJPT0xFQU4pc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RBQyVkICAlZFxuIiwgaSwgIGFwc2RfYWNbaV0pKTsKKwkJCX0KKworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9IGFwc2RfYWNbMF07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gYXBzZF9hY1sxXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSBhcHNkX2FjWzJdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9IGFwc2RfYWNbM107CisJCX0KKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKQoreworCVBVQ0hBUgkJCQkJc3JjID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZQkJCQkqc3JjZjsKKwlJTlQgCQkJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3QJCQlvcmdmczsKKwlDSEFSCQkJCQkqYnVmZmVyOworCUNIQVIJCQkJCSp0bXBidWY7CisJVUxPTkcJCQkJCVJ0c1RocmVzaDsKKwlVTE9ORwkJCQkJRnJhZ1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUgkgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlQVUNIQVIJCQkJCW1hY3B0cjsKKwlJTlQJCQkJCQlpID0gMDsKKworCWJ1ZmZlciA9IGttYWxsb2MoTUFYX0lOSV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlzcmMgPSBTVEFfUFJPRklMRV9QQVRIOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCXNyYyA9IHBBZC0+TUNfRmlsZU5hbWU7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwkvLyBTYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgorCS8vIFNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQorCW9yZ2ZzdWlkID0gY3VycmVudF9mc3VpZCgpOworCW9yZ2ZzZ2lkID0gY3VycmVudF9mc2dpZCgpOworCS8qIEhtLCBjYW4ndCByZWFsbHkgZG8gdGhpcyBuaWNlbHkgYW55bW9yZSwgc28gcmVseSBvbiB0aGVzZSBmaWxlcworCSAqIGJlaW5nIHNldCB0byB0aGUgcHJvcGVyIHBlcm1pc3Npb24gdG8gcmVhZCB0aGVtLi4uICovCisJLyogY3VycmVudC0+Y3JlZC0+ZnN1aWQgPSBjdXJyZW50LT5jcmVkLT5mc2dpZCA9IDA7ICovCisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCWlmIChzcmMgJiYgKnNyYykKKwl7CisJCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7CisJCWlmIChJU19FUlIoc3JjZikpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgLVBUUl9FUlIoc3JjZiksc3JjKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCisJCQlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT5yZWFkKQorCQkJeworCQkJCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOworCQkJCXJldHZhbD1zcmNmLT5mX29wLT5yZWFkKHNyY2YsIGJ1ZmZlciwgTUFYX0lOSV9CVUZGRVJfU0laRSwgJnNyY2YtPmZfcG9zKTsKKwkJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBzcmMsIC1yZXR2YWwpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gc2V0IGZpbGUgcGFyYW1ldGVyIHRvIHBvcnRjZmcKKwkJCQkJLy9Db3VudHJ5UmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb24iLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbj0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeVJlZ2lvbkFCYW5kCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb25BQmFuZCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZD0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbkFCYW5kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCQkJfQorCQkJCQkvL0NvdW50cnlDb2RlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlDb2RlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIHRtcGJ1ZiAsIDIpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuU3RhT3JpQ291bnRyeUNvZGUsIHRtcGJ1ZiAsIDIpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCWlmIChzdHJsZW4ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpICE9IDApCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gVFJVRTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlDb2RlPSVzXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkpOworCQkJCQl9CisJCQkJCS8vQ2hhbm5lbEdlb2dyYXBoeQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsR2VvZ3JhcGh5IiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJVUNIQVIgR2VvZ3JhcGh5ID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYgKEdlb2dyYXBoeSA8PSBCT1RIKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEdlb2dyYXBoeTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9CisJCQkJCQkJCShwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gQk9USCkgPyAnICcgOiAoKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBJRE9SKSA/ICdJJyA6ICdPJyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHkgPSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxHZW9ncmFwaHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0gJyAnOworCQkJCQl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL1NTSUQKKwkJCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIlNTSUQiLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPD0gMzIpCisJCQkJCQkJeworCQkJIAkJCQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IChVQ0hBUikgc3RybGVuKHRtcGJ1Zik7CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwkJCQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL05ldHdvcmtUeXBlCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiTmV0d29ya1R5cGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCQkJCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQWRob2MiKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworCQkJCQkJCWVsc2UgLy9EZWZhdWx0IEluZnJhc3RydWN0dXJlIG1vZGUKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCX0KKwkJCQkJLy9FbmNyeXBUeXBlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkVuY3J5cFR5cGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAidGtpcCIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJhZXMiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCQkJCQkJCS8vIFVwZGF0ZSBhbGwgd2Vwc3RhdHVzIHJlbGF0ZWQKKwkJCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyCQk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciAJCT0gRkFMU0U7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCWlmKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiV1BBUFNLIiwgdG1wYnVmLCA1MTIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaW50ICAgICBlcnI9MDsKKworCQkJCQkJCXRtcGJ1ZltzdHJsZW4odG1wYnVmKV0gPSAnXDAnOyAvLyBtYWtlIFNUQSBjYW4gcHJvY2VzcyAuJF4mIGZvciBXUEFQU0sgaW5wdXQKKworCQkJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQkJCQkJCSkKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKChzdHJsZW4odG1wYnVmKSA+PSA4KSAmJiAoc3RybGVuKHRtcGJ1ZikgPCA2NCkpCisJCQkJCQkJeworCQkJCQkJCQlQYXNzd29yZEhhc2goKGNoYXIgKil0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHN0cmxlbih0bXBidWYpID09IDY0KQorCQkJCQkJCXsKKwkJCQkJCQkJQXRvSCh0bXBidWYsIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZXJyID0gMTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6OihXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEpXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkvL0RlZmF1bHRLZXlJRCwgS2V5VHlwZSwgS2V5U3RyCisJCQkJCXJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCUhUUGFyYW1ldGVyc0hvb2socEFkLCB0bXBidWYsIGJ1ZmZlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwkJCQkJCS8vQ2FycmllckRldGVjdAorCQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2FycmllckRldGVjdCIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICIwIiwgMSkgPT0gMCkpCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisJCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiMSIsIDEpID09IDApKQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FycmllckRldGVjdC5FbmFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9QU01vZGUKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJQU01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJCQkJCQl7CisJCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIk1BWF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIm1heF9wc3AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc20ocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiRmFzdF9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImZhc3RfcHNwIikgPT0gMCkKKwkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiRkFTVF9QU1AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJsZWdhY3lfcHNwIikgPT0gMCkKKwkJCQkJCQkJCXx8IChzdHJjbXAodG1wYnVmLCAiTEVHQUNZX1BTUCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7IC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisJCQkJCQkJCQkvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisJCQkJCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQkJCQkJCQl9CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTW9kZT0lbGRcbiIsIHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBGYXN0Um9hbWluZworCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZhc3RSb2FtaW5nIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBGQUxTRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IFRSVUU7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGYXN0Um9hbWluZz0lZFxuIiwgcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKSk7CisJCQkJCQl9CisJCQkJCQkvLyBSb2FtVGhyZXNob2xkCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUm9hbVRocmVzaG9sZCIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJbG9uZyBsSW5mbyA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCQlpZiAobEluZm8gPiA5MCB8fCBsSW5mbyA8IDYwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAtNzA7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAoQ0hBUikoLTEpKmxJbmZvOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUm9hbVRocmVzaG9sZD0lZCAgZEJtXG4iLCBwQWQtPlN0YUNmZy5kQm1Ub1JvYW0pKTsKKwkJCQkJCX0KKworCQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVEduV2lmaVRlc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUR25XaWZpVGVzdD0lZFxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgc3JjKSk7CisJCQl9CisKKwkJCXJldHZhbD1maWxwX2Nsb3NlKHNyY2YsTlVMTCk7CisKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfQorCQl9CisJfQorCisJc2V0X2ZzKG9yZ2ZzKTsKKworI2lmIDAKKwljdXJyZW50LT5jcmVkLT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmNyZWQtPmZzZ2lkID0gb3JnZnNnaWQ7CisjZW5kaWYKKworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUodG1wYnVmKTsKKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyB2b2lkCUhUUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAorCUlOCUNIQVIJCSAgKnBJbnB1dCkKK3sKKworCUlOVCBWYWx1ZTsKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9QUk9URUNUIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBQcm90ZWN0aW9uICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTRW5hYmxlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFNFbmFibGUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU01vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPiBNTVBTX0VOQUJMRSkKKyAgICAgICAgeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGFkZCBtaW1vIHBvd2VyIHNhdmluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOworCQkJLy9wQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTIE1vZGUgID0gJWRcbiIsIFZhbHVlKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBRGVjbGluZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgRGVjbGluZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWJsZVJlb3JkZXJpbmciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBEaXNhYmxlUmVvcmRlcmluZyAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0F1dG9CQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEF1dG8gQkEgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCS8vIFR4XytIVEMgZnJhbWUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfSFRDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKwl9CisKKwkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisJLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOworCX0KKworCisKKworCS8vIFR4IEEtTVNVRCA/CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIE1QRFUgRGVuc2l0eQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIFZhbHVlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOworCQl9CisJfQorCisJLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7CisJCX0KKworCX0KKworCS8vIEd1YXJkIEludGVydmFsCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7CisJfQorCisJLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7CisJfQorCisJLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlVQ0hBUglmaXhfdHhfbW9kZTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCisJCQl7CisJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKKwkJCXsKKwkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKwkJfQorCQllbHNlCisJCXsKKwkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCQkJLy8gMSA6IENDSworCQkJCS8vIDIgOiBPRkRNCisJCQkJLy8gb3RoZXJ3aXNlIDogSFQKKwkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKKwkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKKwkJCQllbHNlCisJCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisKKwkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwkvLyBDaGFubmVsIFdpZHRoCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gQldfNDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJfQorCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKKwl9CisKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOworCX0KKworCS8vIE1TQworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAyMykgfHwgKFZhbHVlID09IDMyKSkgLy8gMyozCisJCXsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBWYWx1ZTsKKwkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSAlZFxuIiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBNQ1NfQVVUTzsKKwkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9IEFVVE9cbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBTVEJDCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1NUQkMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogU1RCQyA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOworCX0KKworCS8vIDQwX01oel9JbnRvbGVyYW50CisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUXzQwTUhaX0lOVE9MRVJBTlQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiA0ME1IWiBJTlRPTEVSQU5UID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCkpOworCX0KKwkvL0hUX1R4U3RyZWFtCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfVHhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQorCXsKKwkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQorCQl7CisJCQljYXNlIDE6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzogLy8gMyozCisJCQlkZWZhdWx0OgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMzsKKworCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQorCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiB0eCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCisJCQkJYnJlYWs7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSkpOworCX0KKwkvL0hUX1J4U3RyZWFtCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUnhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQorCXsKKwkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQorCQl7CisJCQljYXNlIDE6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsgLy8gb25seSAyIHJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUnggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKSk7CisJfQorCit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExOTU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC0wLDAgKzEsNzE3NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCisgICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisqLworI2lmbmRlZiBfX1JUTVBfSF9fCisjZGVmaW5lIF9fUlRNUF9IX18KKworI2luY2x1ZGUgImxpbmtfbGlzdC5oIgorI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpbmNsdWRlICJhaXJvbmV0LmgiCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vI2RlZmluZSBEQkdfRElBR05PU0UJCTEKKworI2lmIGRlZmluZWQoQ09ORklHX0FQX1NVUFBPUlQpICYmIGRlZmluZWQoQ09ORklHX1NUQV9TVVBQT1JUKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9BUChfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisjZWxzZQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9BUChfcEFkKQorI2RlZmluZSBJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEoX3BBZCkKKyNlbmRpZgorCisjZGVmaW5lIFZJUlRVQUxfSUZfSU5DKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KyspCisjZGVmaW5lIFZJUlRVQUxfSUZfREVDKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250LS0pCisjZGVmaW5lIFZJUlRVQUxfSUZfTlVNKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KQorCisKKworLy8KKy8vICBORElTIFZlcnNpb24gZGVmaW5pdGlvbnMKKy8vCisjaWZkZWYgIE5ESVM1MF9NSU5JUE9SVAorI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQorI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMAorI2VuZGlmCisKKyNpZmRlZiAgTkRJUzUxX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAxCisjZW5kaWYKKworZXh0ZXJuICBjaGFyICAgIE5JQ19WRU5ET1JfREVTQ1tdOworZXh0ZXJuICBpbnQgICAgIE5JQ19WRU5ET1JfREVTQ19MRU47CisKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIFNOQVBfQUlST05FVFtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01bXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdOworZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbjsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcFtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ0lTQ09fT1VJW107CitleHRlcm4gIFVDSEFSCUJhU2l6ZUFycmF5WzRdOworCitleHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVQ0hBUiBNVUxUSUNBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVTE9ORyBCSVQzMlszMl07CitleHRlcm4gVUNIQVIgQklUOFs4XTsKK2V4dGVybiBjaGFyKiBDaXBoZXJOYW1lW107CitleHRlcm4gY2hhciogTUNTVG9NYnBzW107CitleHRlcm4gVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXTsKK2V4dGVybiBVQ0hBUiBTTkFQXzgwMl8xSFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0JSSURHRV9UVU5ORUxbNl07CitleHRlcm4gVUNIQVIgU05BUF9BSVJPTkVUWzhdOworZXh0ZXJuIFVDSEFSIENLSVBfTExDX1NOQVBbOF07CitleHRlcm4gVUNIQVIgRUFQT0xfTExDX1NOQVBbOF07CitleHRlcm4gVUNIQVIgRUFQT0xbMl07CitleHRlcm4gVUNIQVIgSVBYWzJdOworZXh0ZXJuIFVDSEFSIEFQUExFX1RBTEtbMl07CitleHRlcm4gVUNIQVIgUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOworZXh0ZXJuIFVDSEFSIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtaW5bNF07CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21heFs0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbls0XTsKK2V4dGVybiBVQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdOworCitleHRlcm4gVVNIT1JUIFJhdGVVcFBFUltdOworZXh0ZXJuIFVTSE9SVCBSYXRlRG93blBFUltdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlVXB3YXJkW107CitleHRlcm4gQ0hBUiAgIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZUlkVG9NYnBzW107CitleHRlcm4gVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBbXTsKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbjsKKworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXTsKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuOworCitleHRlcm4gVUNIQVIgIFNzaWRJZTsKK2V4dGVybiBVQ0hBUiAgU3VwUmF0ZUllOworZXh0ZXJuIFVDSEFSICBFeHRSYXRlSWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgSHRDYXBJZTsKK2V4dGVybiBVQ0hBUiAgQWRkSHRJbmZvSWU7CitleHRlcm4gVUNIQVIgIE5ld0V4dENoYW5JZTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitleHRlcm4gVUNIQVIgIEV4dEh0Q2FwSWU7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitleHRlcm4gVUNIQVIgIEVycEllOworZXh0ZXJuIFVDSEFSICBEc0llOworZXh0ZXJuIFVDSEFSICBUaW1JZTsKK2V4dGVybiBVQ0hBUiAgV3BhSWU7CitleHRlcm4gVUNIQVIgIFdwYTJJZTsKK2V4dGVybiBVQ0hBUiAgSWJzc0llOworZXh0ZXJuIFVDSEFSICBDY3gySWU7CisKK2V4dGVybiBVQ0hBUiAgV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSICBSU05fT1VJW107CitleHRlcm4gVUNIQVIgIFdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUiAgV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBDY3gyUW9zSW5mb1tdOworZXh0ZXJuIFVDSEFSICBDY3gySWVJbmZvW107CitleHRlcm4gVUNIQVIgIFJBTElOS19PVUlbXTsKK2V4dGVybiBVQ0hBUiAgUG93ZXJDb25zdHJhaW50SUVbXTsKKworCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFHW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjFTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBQUkVfTl9IVF9PVUlbXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZQlNQVhTRVEJCSgweEZGRikKKworI2lmZGVmIFJBTElOS19BVEUKK3R5cGVkZWYJc3RydWN0IF9BVEVfSU5GTyB7CisJVUNIQVIJTW9kZTsKKwlDSEFSCVR4UG93ZXIwOworCUNIQVIJVHhQb3dlcjE7CisJQ0hBUiAgICBUeEFudGVubmFTZWw7CisJQ0hBUiAgICBSeEFudGVubmFTZWw7CisJVFhXSV9TVFJVQyAgVHhXSTsgCSAgLy8gVFhXSQorCVVTSE9SVAlRSUQ7CisJVUNIQVIJQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIzW01BQ19BRERSX0xFTl07CisJVUNIQVIJQ2hhbm5lbDsKKwlVSU5UMzIJVHhMZW5ndGg7CisJVUlOVDMyCVR4Q291bnQ7CisJVUlOVDMyCVR4RG9uZUNvdW50OyAvLyBUeCBETUEgRG9uZQorCVVJTlQzMglSRkZyZXFPZmZzZXQ7CisJQk9PTEVBTgliUnhGZXI7CisJQk9PTEVBTgliUUFUeFN0YXJ0OyAvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHR4LgorCUJPT0xFQU4JYlFBUnhTdGFydDsJLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSByeC4KKyNpZmRlZiBSVDI4NjAKKwlCT09MRUFOCWJGV0xvYWRpbmc7CS8vIFJlbG9hZCBmaXJtd2FyZSB3aGVuIEFURSBpcyBkb25lLgorI2VuZGlmIC8vIFJUMjg2MCAvLworCVVJTlQzMglSeFRvdGFsQ250OworCVVJTlQzMglSeENudFBlclNlYzsKKworCUNIQVIJTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SCisJQ0hBUiAgICBMYXN0U05SMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCUNIQVIgICAgTGFzdFJzc2kwOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIgICAgTGFzdFJzc2kxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTI7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAzcmQgIGFudGVubmEKKwlDSEFSICAgIEF2Z1Jzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kwWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCVNIT1JUICAgQXZnUnNzaTFYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMlg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKworCVVJTlQzMglOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCS8vIFR4IGZyYW1lCisJVVNIT1JUCQlITGVuOyAvLyBIZWFkZXIgTGVuZ3RoCisJVVNIT1JUCQlQTGVuOyAvLyBQYXR0ZXJuIExlbmd0aAorCVVDSEFSIAkJSGVhZGVyWzMyXTsgLy8gSGVhZGVyIGJ1ZmZlcgorCVVDSEFSCQlQYXR0ZXJuWzMyXTsgLy8gUGF0dGVybiBidWZmZXIKKwlVU0hPUlQJCURMZW47IC8vIERhdGEgTGVuZ3RoCisJVVNIT1JUCQlzZXE7CisJVUlOVDMyCQlDSUQ7CisJVEhSRUFEX1BJRCAJCUF0ZVBpZDsKKwkvLyBjb3VudGVycworCVVJTlQzMgkJVTJNOworCVVJTlQzMgkJT3RoZXJEYXRhOworCVVJTlQzMgkJQmVhY29uOworCVVJTlQzMgkJT3RoZXJDb3VudDsKKwlVSU5UMzIJCVR4QWMwOworCVVJTlQzMgkJVHhBYzE7CisJVUlOVDMyCQlUeEFjMjsKKwlVSU5UMzIJCVR4QWMzOworCVVJTlQzMgkJVHhIQ0NBOworCVVJTlQzMgkJVHhNZ210OworCVVJTlQzMgkJUlNTSTA7CisJVUlOVDMyCQlSU1NJMTsKKwlVSU5UMzIJCVJTU0kyOworCVVJTlQzMgkJU05SMDsKKwlVSU5UMzIJCVNOUjE7CisJLy8gY29udHJvbAorCS8vVUlOVDMyCQlSZXBlYXQ7IC8vIFR4IENwdSBjb3VudAorCVVDSEFSCQlUeFN0YXR1czsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworfQlBVEVfSU5GTywgKlBBVEVfSU5GTzsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCitzdHJ1Y3QgYXRlX3JhY2ZnaGRyIHsKKyAJVUlOVDMyCQltYWdpY19ubzsKKwlVU0hPUlQJCWNvbW1hbmRfdHlwZTsKKwlVU0hPUlQJCWNvbW1hbmRfaWQ7CisJVVNIT1JUCQlsZW5ndGg7CisJVVNIT1JUCQlzZXF1ZW5jZTsKKwlVU0hPUlQJCXN0YXR1czsKKwlVQ0hBUgkJZGF0YVsyMDQ2XTsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1Cit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbmV4dDsKKwlQTkRJU19QQUNLRVQJCQlwUGFja2V0OwkJLyogY292ZXJ0ZWQgdG8gODAyLjMgZnJhbWUgKi8KKwlpbnQJCQkJCQlTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCisJQk9PTEVBTgkJCQkJYkFNU0RVOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbGlzdAoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm5leHQ7CisJaW50IAlxbGVuOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sCit7CisJUFZPSUQJCQkJCW1lbTsKKwlORElTX1NQSU5fTE9DSwkJCWxvY2s7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAJZnJlZWxpc3Q7Cit9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCAJX1JTU0lfU0FNUExFIHsKKwlDSEFSCQkJTGFzdFJzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJTGFzdFJzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJTGFzdFJzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSCQkJQXZnUnNzaTA7CisJQ0hBUgkJCUF2Z1Jzc2kxOworCUNIQVIJCQlBdmdSc3NpMjsKKwlTSE9SVAkJCUF2Z1Jzc2kwWDg7CisJU0hPUlQJCQlBdmdSc3NpMVg4OworCVNIT1JUCQkJQXZnUnNzaTJYODsKK30gUlNTSV9TQU1QTEU7CisKKy8vCisvLyAgUXVldWUgc3RydWN0dXJlIGFuZCBtYWNyb3MKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0VOVFJZICAgIHsKKwlzdHJ1Y3QgX1FVRVVFX0VOVFJZICAgICAqTmV4dDsKK30gICBRVUVVRV9FTlRSWSwgKlBRVUVVRV9FTlRSWTsKKworLy8gUXVldWUgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0hFQURFUiAgIHsKKwlQUVVFVUVfRU5UUlkgICAgSGVhZDsKKwlQUVVFVUVfRU5UUlkgICAgVGFpbDsKKwlVTE9ORyAgICAgICAgICAgTnVtYmVyOworfSAgIFFVRVVFX0hFQURFUiwgKlBRVUVVRV9IRUFERVI7CisKKyNkZWZpbmUgSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgIFwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFJlbW92ZUhlYWRRdWV1ZShRdWV1ZUhlYWRlcikgICAgICAgICAgICAgICAgXAorKFF1ZXVlSGVhZGVyKS0+SGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJUFFVRVVFX0VOVFJZIHBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoUXVldWVIZWFkZXIpLT5IZWFkICE9IE5VTEwpCQkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlwTmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQ7ICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IHBOZXh0OyAgICAgICAgICAgICAgICBcCisJCWlmIChwTmV4dCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyLS07ICAgICAgICAgICAgICAgICAgICBcCisJfQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBJbnNlcnRIZWFkUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQ7IFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCisJCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSW5zZXJ0VGFpbFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgXAorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyAgICAgICAgICAgXAorCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8KKy8vICBNYWNyb3MgZm9yIGZsYWcgYW5kIHJlZiBjb3VudCBvcGVyYXRpb25zCisvLworI2RlZmluZSBSVE1QX1NFVF9GTEFHKF9NLCBfRikgICAgICAgKChfTSktPkZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBRyhfTSwgX0YpICAgICAoKF9NKS0+RmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBR1MoX00pICAgICAgICAoKF9NKS0+RmxhZ3MgPSAwKQorI2RlZmluZSBSVE1QX1RFU1RfRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5GbGFncyAmIChfRikpICE9IDApCisjZGVmaW5lIFJUTVBfVEVTVF9GTEFHUyhfTSwgX0YpICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgPT0gKF9GKSkKKworI2RlZmluZSBPUFNUQVRVU19TRVRfRkxBRyhfcEFkLCBfRikgICAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIE9QU1RBVFVTX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIE9QU1RBVFVTX1RFU1RfRkxBRyhfcEFkLCBfRikgICAgKCgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKF9wRW50cnksX0YpICAgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKF9wRW50cnksX0YpICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhfcEVudHJ5LF9GKSAgICAgKCgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBSWF9GSUxURVJfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgfD0gKF9GKSkKKyNkZWZpbmUgUlhfRklMVEVSX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICY9IH4oX0YpKQorI2RlZmluZSBSWF9GSUxURVJfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICgoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyICYgKF9GKSkgIT0gMCkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBTVEFfTk9fU0VDVVJJVFlfT04oX3ApICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorI2RlZmluZSBTVEFfV0VQX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorI2RlZmluZSBTVEFfVEtJUF9PTihfcCkgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorI2RlZmluZSBTVEFfQUVTX09OKF9wKSAgICAgICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCisjZGVmaW5lIFNUQV9UR05fV0lGSV9PTihfcCkgICAgICAgICAgICAgKF9wLT5TdGFDZmcuYlRHbldpZmlUZXN0ID09IFRSVUUpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgQ0tJUF9LUF9PTihfcCkJCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MTApICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCisjZGVmaW5lIENLSVBfQ01JQ19PTihfcCkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgwOCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKKworCisjZGVmaW5lIElOQ19SSU5HX0lOREVYKF9pZHgsIF9SaW5nU2l6ZSkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX2lkeCkgPSAoX2lkeCsxKSAlIChfUmluZ1NpemUpOyAgICAgICBcCit9CisKKyNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcwMDAwMCkKKworI2RlZmluZSBSSU5HX1BBQ0tFVF9JTklUKF9UeFJpbmcsIF9pZHgpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVFhEVF9JTklUKF9UeEQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc1plcm9NZW1vcnkoX1R4RCwgVFhEX1NJWkUpOwlcCisJX1R4RC0+RE1BRE9ORSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvL1NldCBsYXN0IGRhdGEgc2VnbWVudAorI2RlZmluZSBSSU5HX1NFVF9MQVNURFMoX1R4RCwgX0lzU0QwKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfSXNTRDApIHtfVHhELT5MYXN0U2VjMCA9IDE7fSAgICAgXAorICAgIGVsc2Uge19UeEQtPkxhc3RTZWMxID0gMTt9ICAgICBcCit9CisKKy8vIEluY3JlYXNlIFR4VHNjIHZhbHVlIGZvciBuZXh0IHRyYW5zbWlzc2lvbgorLy8gVE9ETzoKKy8vIFdoZW4gaT09NiwgbWVhbnMgVFNDIGhhcyBkb25lIG9uZSBmdWxsIGN5Y2xlLCBkbyByZS1rZXlpbmcgc3R1ZmYgZm9sbG93IHNwZWNzCisvLyBTaG91bGQgc2VuZCBhIHNwZWNpYWwgZXZlbnQgbWljcm9zb2Z0IGRlZmluZWQgdG8gcmVxdWVzdCByZS1rZXkKKyNkZWZpbmUgSU5DX1RYX1RTQyhfdHNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKytfdHNjW2ldID09IDB4MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGkgPT0gNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBpcyBjb3BpZWQgZnJvbSBBUCBiZWFjb24uICBEb24ndCBuZWVkIHRvIHVwZGF0ZSBoZXJlLgorI2RlZmluZSBDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1pbW9QcyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5HRiA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRjsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3IyMCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjA7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuVHhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQzsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJ4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5FeHRDaGFuT2Zmc2V0ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQ7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SZWNvbVdpZHRoID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5PcGVyYWlvbk1vZGUgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk5vbkdmUHJlc2VudCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OyAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YoVUNIQVIpICogMTYpO1wKK30KKworI2RlZmluZSBDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04oX3BBZCwgX3BIdENhcGFiaWxpdHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vCisvLyBNQUNSTyBmb3IgMzItYml0IFBDSSByZWdpc3RlciByZWFkIC8gd3JpdGUKKy8vCisvLyBVc2FnZSA6IFJUTVBfSU9fUkVBRDMyKAorLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAorLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKKy8vICAgICAgICAgICAgICBQVUxPTkcgIHBWYWx1ZSkKKy8vCisvLyAgICAgICAgIFJUTVBfSU9fV1JJVEUzMigKKy8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKKy8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCisvLyAgICAgICAgICAgICAgVUxPTkcgVmFsdWUpCisvLworCisvLworLy8gQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LgorLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4KKy8vCisjZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAgICAgICAgICAvLyBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyCisvLworI2lmZGVmIFJUMjg2MAorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUEhZX0NTUjRfU1RSVUMgIFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HICAgICAgICAgICBCdXN5Q250ID0gMDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZikgCSAgICAgICAgICAgICAgICBcCisgICAgewkJCQkJCQkJCQkJCVwKKyAgICAgICAgcmV0dXJuOwkJCQkJCQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIFJGX0NTUl9DRkcwLCAmVmFsdWUud29yZCk7ICBcCisgICAgICAgIGlmIChWYWx1ZS5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQnVzeUNudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgIHdoaWxlIChCdXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpOyAgICAgICAgICAgXAorICAgIGlmIChCdXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgUkZfQ1NSX0NGRzAsIF9WKTsgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgICAgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyBcCisgICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERCR1BSSU5UX0VSUigoIkRGUyBCQlAgcmVhZCBSJWQgZmFpbFxuIiwgX0kpKTsgICAgICBcCisgICAgICAgICooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICB7fQorLy8gUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKKyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgICAgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAorICAgICAgICBmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCVwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7CVwKKyAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgICAgQnVzeUNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOyAgICAgXAorICAgICAgICAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIFdyaXRlIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElEICYgdmFsdWUKKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgICAgQnVzeUNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCisgICAgICAgICAgICBpZiAoX0EtPk9wTW9kZSA9PSBPUE1PREVfQVApICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CQkJCQkJCVwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNkZWZpbmUgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwga2h6KSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAga2h6ID0gMjQxNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAga2h6ID0gMjQyMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAga2h6ID0gMjQyNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiAgICAga2h6ID0gMjQzMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAgICAga2h6ID0gMjQzNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiAgICAga2h6ID0gMjQ0MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiAgICAga2h6ID0gMjQ0NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiAgICAga2h6ID0gMjQ1MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogICAga2h6ID0gMjQ1NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogICAga2h6ID0gMjQ2MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogICAga2h6ID0gMjQ2NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogICAga2h6ID0gMjQ3MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogICAga2h6ID0gMjQ4NDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjogIC8qIFVOSUkgKi8gIGtoeiA9IDUxODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6ICAvKiBVTklJICovICBraHogPSA1MjAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OiAgLyogVU5JSSAqLyAga2h6ID0gNTIyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6ICAvKiBVTklJICovICBraHogPSA1MjYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2OiAgLyogVU5JSSAqLyAga2h6ID0gNTI4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6ICAvKiBVTklJICovICBraHogPSA1MzIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OTogLyogVU5JSSAqLyAga2h6ID0gNTc0NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NjUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OiAvKiBVTklJICovICBraHogPSA1Nzg1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MTogLyogVU5JSSAqLyAga2h6ID0gNTgwNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MjUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1ODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2ODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU3MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE3MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE5MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIxMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIzMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5MjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE4ODogLyogSmFwYW4gKi8gICBraHogPSA0OTQwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTI6IC8qIEphcGFuICovICAga2h6ID0gNDk2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk2OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5ODAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIwODogLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgIGtoeiA9IDUwNDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIxMjogLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgIGtoeiA9IDUwNjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIxNjogLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgIGtoeiA9IDUwODAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisjZGVmaW5lICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQoa2h6LCBjaCkgIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3dpdGNoIChraHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxMjAwMDogICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxNzAwMDogICAgY2ggPSAyOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyMjAwMDogICAgY2ggPSAzOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyNzAwMDogICAgY2ggPSA0OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzMjAwMDogICAgY2ggPSA1OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzNzAwMDogICAgY2ggPSA2OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0MjAwMDogICAgY2ggPSA3OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0NzAwMDogICAgY2ggPSA4OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1MjAwMDogICAgY2ggPSA5OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1NzAwMDogICAgY2ggPSAxMDsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2MjAwMDogICAgY2ggPSAxMTsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2NzAwMDogICAgY2ggPSAxMjsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ3MjAwMDogICAgY2ggPSAxMzsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ4NDAwMDogICAgY2ggPSAxNDsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE4MDAwMDogICAgY2ggPSAzNjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMDAwMDA6ICAgIGNoID0gNDA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjIwMDAwOiAgICBjaCA9IDQ0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI0MDAwMDogICAgY2ggPSA0ODsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNjAwMDA6ICAgIGNoID0gNTI7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjgwMDAwOiAgICBjaCA9IDU2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMwMDAwMDogICAgY2ggPSA2MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMjAwMDA6ICAgIGNoID0gNjQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzQ1MDAwOiAgICBjaCA9IDE0OTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc2NTAwMDogICAgY2ggPSAxNTM7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3ODUwMDA6ICAgIGNoID0gMTU3OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODA1MDAwOiAgICBjaCA9IDE2MTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTgyNTAwMDogICAgY2ggPSAxNjU7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MDAwMDA6ICAgIGNoID0gMTAwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MjAwMDA6ICAgIGNoID0gMTA0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NDAwMDA6ICAgIGNoID0gMTA4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NjAwMDA6ICAgIGNoID0gMTEyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1ODAwMDA6ICAgIGNoID0gMTE2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MDAwMDA6ICAgIGNoID0gMTIwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MjAwMDA6ICAgIGNoID0gMTI0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NDAwMDA6ICAgIGNoID0gMTI4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NjAwMDA6ICAgIGNoID0gMTMyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2ODAwMDA6ICAgIGNoID0gMTM2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3MDAwMDA6ICAgIGNoID0gMTQwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxNzAwMDA6ICAgIGNoID0gMzQ7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOTAwMDA6ICAgIGNoID0gMzg7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMTAwMDA6ICAgIGNoID0gNDI7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMzAwMDA6ICAgIGNoID0gNDY7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5MjAwMDA6ICAgIGNoID0gMTg0OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NDAwMDA6ICAgIGNoID0gMTg4OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NjAwMDA6ICAgIGNoID0gMTkyOyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5ODAwMDA6ICAgIGNoID0gMTk2OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNDAwMDA6ICAgIGNoID0gMjA4OyAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA2MDAwMDogICAgY2ggPSAyMTI7IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDgwMDAwOiAgICBjaCA9IDIxNjsgLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisvLworLy8gQ29tbW9uIGZyYWdtZW50IGxpc3Qgc3RydWN0dXJlIC0gIElkZW50aWNhbCB0byB0aGUgc2NhdHRlciBnYXRoZXIgZnJhZyBsaXN0IHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgTklDX01BWF9QSFlTX0JVRl9DT1VOVCAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIHsKKyAgICBQVk9JRAkJQWRkcmVzczsKKyAgICBVTE9ORwkJTGVuZ3RoOworICAgIFBVTE9ORwkJUmVzZXJ2ZWQ7Cit9IFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCB7CisgICAgVUxPTkcgIE51bWJlck9mRWxlbWVudHM7CisgICAgUFVMT05HIFJlc2VydmVkOworICAgIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tOSUNfTUFYX1BIWVNfQlVGX0NPVU5UXTsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVDsKKworLy8KKy8vICBTb21lIHV0aWxpdHkgbWFjcm9zCisvLworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKF9hLCBfYikgICAgICgoKF9hKSA8IChfYikpID8gKF9hKSA6IChfYikpCisjZW5kaWYKKworI2lmbmRlZiBtYXgKKyNkZWZpbmUgbWF4KF9hLCBfYikgICAgICgoKF9hKSA+IChfYikpID8gKF9hKSA6IChfYikpCisjZW5kaWYKKworI2RlZmluZSBHRVRfTE5BX0dBSU4oX3BBZCkJKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSA/IChfcEFkLT5CTE5BR2FpbikgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gNjQpID8gKF9wQWQtPkFMTkFHYWluMCkgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTI4KSA/IChfcEFkLT5BTE5BR2FpbjEpIDogKF9wQWQtPkFMTkFHYWluMikpKSkKKworI2RlZmluZSBJTkNfQ09VTlRFUjY0KFZhbCkgICAgICAgICAgKFZhbC5RdWFkUGFydCsrKQorCisjZGVmaW5lIElORlJBX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0lORlJBX09OKSkKKyNkZWZpbmUgQURIT0NfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfQURIT0NfT04pKQorI2RlZmluZSBNT05JVE9SX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuQnNzVHlwZSkgPT0gQlNTX01PTklUT1IpCisjZGVmaW5lIElETEVfT04oX3ApICAgICAgICAgICAgICAgICAoIUlORlJBX09OKF9wKSAmJiAhQURIT0NfT04oX3ApKQorCisvLyBDaGVjayBMRUFQICYgQ0NLTSBmbGFncworI2RlZmluZSBMRUFQX09OKF9wKSAgICAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZGVmaW5lIExFQVBfQ0NLTV9PTihfcCkgICAgICAgICAgICAoKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApICYmICgoX3ApLT5TdGFDZmcuTGVhcEF1dGhJbmZvLkNDS00gPT0gVFJVRSkpCisKKy8vIGlmIG9yZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfODAyXzFIOwkJCQkJCVwKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShJUFgsIF9wQnVmVkEgKyAxMiwgMikgfHwgCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEgKyAxMiwgMikpCQlcCisJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAorCQl9CQkJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKK30KKworLy8gTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguCisjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgoKCooX3BCdWZWQSkgPDwgOCkgKyAqKF9wQnVmVkEgKyAxKSkgPiAxNTAwKQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSwgMikgfHwgCQkJCVwKKwkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBLCAyKSkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAorCQl9CQkJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKK30KKworCisjZGVmaW5lIE1BS0VfODAyXzNfSEVBREVSKF9wLCBfcE1hYzEsIF9wTWFjMiwgX3BUeXBlKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoX3AsIF9wTWFjMSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOKSwgX3BNYWMyLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOICogMiksIF9wVHlwZSwgTEVOR1RIXzgwMl8zX1RZUEUpOyBcCit9CisKKy8vIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4KKy8vIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkCisvLyBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lCisvLyBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQKKy8vIE5vdGU6CisvLyAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPCisvLyAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkCisjZGVmaW5lIENPTlZFUlRfVE9fODAyXzMoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBfcERhdGEsIF9EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCkgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBMTENfTGVuWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BSZW1vdmVkTExDU05BUCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSAgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBVQ0hBUiBwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTmRpc0VxdWFsTWVtb3J5KElQWCwgcFByb3RvLCAyKSB8fCBOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgcFByb3RvLCAyKSkgJiYgIFwKKyAgICAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgcFByb3RvKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBfcERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9wRGF0YSArPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTV0lUQ0hfQUIoIF9wQUEsIF9wQkIpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFZPSUQgcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcENDID0gX3BCQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wQkIgPSBfcEFBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BBQSA9IHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUKKy8vIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUKKy8vIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlcgorI2lmZGVmIFJUMjg2MAorI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVSU5UMzIgSGlnaDMyVFNGLCBMb3czMlRTRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzEsICZIaWdoMzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcwLCAmTG93MzJUU0YpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsIChVQ0hBUilfUnNzaTAsIChVQ0hBUilfUnNzaTEsKFVDSEFSKV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAoVUNIQVIpX1BsY3BTaWduYWwpOyAgIFwKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworI2RlZmluZSBORElTX1FVRVJZX0JVRkZFUihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKSAgICAgICAgICAgICAgICAgICAgXAorICAgIE5kaXNRdWVyeUJ1ZmZlcihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKQorCisjZGVmaW5lIE1BQ19BRERSX0VRVUFMKHBBZGRyMSxwQWRkcjIpICAgICAgICAgICBSVE1QRXF1YWxNZW1vcnkoKFBWT0lEKShwQWRkcjEpLCAoUFZPSUQpKHBBZGRyMiksIE1BQ19BRERSX0xFTikKKyNkZWZpbmUgU1NJRF9FUVVBTChzc2lkMSwgbGVuMSwgc3NpZDIsIGxlbjIpICAgICgobGVuMT09bGVuMikgJiYgKFJUTVBFcXVhbE1lbW9yeShzc2lkMSwgc3NpZDIsIGxlbjEpKSkKKworLy8KKy8vIENoZWNrIGlmIGl0IGlzIEphcGFuIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVsLgorLy8KKyNkZWZpbmUgSmFwYW5DaGFubmVsQ2hlY2soY2hhbm5lbCkgICgoY2hhbm5lbCA9PSA1MikgfHwgKGNoYW5uZWwgPT0gNTYpIHx8IChjaGFubmVsID09IDYwKSB8fCAoY2hhbm5lbCA9PSA2NCkpCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgU1RBX1BPUlRfU0VDVVJFRChfcEFkKSBcCit7IFwKKwlfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAorCU5kaXNBY3F1aXJlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBfcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7IFwKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vCisvLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRUdfUEFJUgoreworCVVMT05HICAgUmVnaXN0ZXI7CisJVUxPTkcgICBWYWx1ZTsKK30gUlRNUF9SRUdfUEFJUiwgKlBSVE1QX1JFR19QQUlSOworCit0eXBlZGVmIHN0cnVjdCAgX1JFR19QQUlSCit7CisJVUNIQVIgICBSZWdpc3RlcjsKKwlVQ0hBUiAgIFZhbHVlOworfSBSRUdfUEFJUiwgKlBSRUdfUEFJUjsKKworLy8KKy8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JGX1JFR1MKK3sKKwlVQ0hBUiAgIENoYW5uZWw7CisJVUxPTkcgICBSMTsKKwlVTE9ORyAgIFIyOworCVVMT05HICAgUjM7CisJVUxPTkcgICBSNDsKK30gUlRNUF9SRl9SRUdTLCAqUFJUTVBfUkZfUkVHUzsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZSRVFVRU5DWV9JVEVNIHsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCU47CisJVUNIQVIJUjsKKwlVQ0hBUglLOworfSBGUkVRVUVOQ1lfSVRFTSwgKlBGUkVRVUVOQ1lfSVRFTTsKKworLy8KKy8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5CisvLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9ETUFCVUYKK3sKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7CisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MKK30gUlRNUF9ETUFCVUYsICpQUlRNUF9ETUFCVUY7CisKKwordHlwZWRlZgl1bmlvbglfSEVBREVSXzgwMl8xMV9TRVF7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIHN0cnVjdCB7CisgICAJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisJVVNIT1JUCQkJRnJhZzo0OworICAgIH0gICBmaWVsZDsKKyNlbHNlCisgICAgc3RydWN0IHsKKwlVU0hPUlQJCQlGcmFnOjQ7CisJVVNIT1JUCQkJU2VxdWVuY2U6MTI7CisgICAgfSAgIGZpZWxkOworI2VuZGlmCisgICAgVVNIT1JUICAgICAgICAgICB2YWx1ZTsKK30JSEVBREVSXzgwMl8xMV9TRVEsICpQSEVBREVSXzgwMl8xMV9TRVE7CisKKy8vCisvLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQorLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVPUkRFUkJVRgoreworCUJPT0xFQU4JCQlJc0Z1bGw7CisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKwlIRUFERVJfODAyXzExX1NFUQkJCVNlcXVlbmNlOwkvL3N1cHBvcnQgY29tcHJlc3NlZCBiaXRtYXAgQkEsIHNvIG5vIGNvbnNpZGVyIGZyYWdtZW50IGluIEJBCisJVUNIQVIgCQlEYXRhT2Zmc2V0OworCVVTSE9SVCAJCURhdGFzaXplOworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKKyNpZmRlZiBSVDI4NjAKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MKKyNlbmRpZiAvLyBSVDI4NjAgLy8KK30gICBSVE1QX1JFT1JERVJCVUYsICpQUlRNUF9SRU9SREVSQlVGOworCisvLworLy8gQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUKKy8vIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IKKy8vIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQKKy8vIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpcgorLy8gdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgTkRJU19QQUNLRVQgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4KKy8vCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9ETUFDQgoreworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCisJUE5ESVNfUEFDS0VUIHBOZGlzUGFja2V0OworCVBORElTX1BBQ0tFVCBwTmV4dE5kaXNQYWNrZXQ7CisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBEbWFCdWY7ICAgICAgICAgICAgIC8vIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUKK30gUlRNUF9ETUFDQiwgKlBSVE1QX0RNQUNCOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9CVUYKK3sKKwlQUVVFVUVfRU5UUlkgICAgTmV4dDsKKwlVQ0hBUiAgICAgICAgICAgSW5kZXg7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKK30gUlRNUF9UWEJVRiwgKlBSVE1QX1RYQlVGOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9CVUYKK3sKKwlCT09MRUFOICAgICAgICAgICBJblVzZTsKKwlVTE9ORyAgICAgICAgICAgCUJ5QmFSZWNJbmRleDsKKwlSVE1QX1JFT1JERVJCVUYJTUFQX1JYQnVmW01BWF9SWF9SRU9SREVSQlVGXTsKK30gUlRNUF9SWEJVRiwgKlBSVE1QX1JYQlVGOwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbVFhfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgCS8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAorfSBSVE1QX1RYX1JJTkcsICpQUlRNUF9UWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtSWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJUnhDcHVJZHg7CisJVUlOVDMyCQlSeERtYUlkeDsKKwlJTlQzMgkJUnhTd1JlYWRJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IHJlYWQgaW5kZXgKK30gUlRNUF9SWF9SSU5HLCAqUFJUTVBfUlhfUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfTUdNVF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtNR01UX1JJTkdfU0laRV07CisJVUlOVDMyCQlUeENwdUlkeDsKKwlVSU5UMzIJCVR4RG1hSWR4OworCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IC8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAorfSBSVE1QX01HTVRfUklORywgKlBSVE1QX01HTVRfUklORzsKKworLy8KKy8vICBTdGF0aXN0aWMgY291bnRlciBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMworeworCS8vIEdlbmVyYWwgU3RhdHMKKwlVTE9ORyAgICAgICBHb29kVHJhbnNtaXRzOworCVVMT05HICAgICAgIEdvb2RSZWNlaXZlczsKKwlVTE9ORyAgICAgICBUeEVycm9yczsKKwlVTE9ORyAgICAgICBSeEVycm9yczsKKwlVTE9ORyAgICAgICBSeE5vQnVmZmVyOworCisJLy8gRXRoZXJuZXQgU3RhdHMKKwlVTE9ORyAgICAgICBSY3ZBbGlnbm1lbnRFcnJvcnM7CisJVUxPTkcgICAgICAgT25lQ29sbGlzaW9uOworCVVMT05HICAgICAgIE1vcmVDb2xsaXNpb25zOworCit9IENPVU5URVJfODAyXzMsICpQQ09VTlRFUl84MDJfMzsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzExIHsKKwlVTE9ORyAgICAgICAgICAgTGVuZ3RoOworCUxBUkdFX0lOVEVHRVIgICBMYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7Cit9IENPVU5URVJfODAyXzExLCAqUENPVU5URVJfODAyXzExOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9SQUxJTksgeworCVVMT05HICAgICAgICAgICBUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgUmVjZWl2ZWRCeXRlQ291bnQ7ICAgICAgLy8gYm90aCBDUkMgb2theSBhbmQgQ1JDIGVycm9yLCB1c2VkIHRvIGNhbGN1bGF0ZSBSWCB0aHJvdWdocHV0CisJVUxPTkcgICAgICAgICAgIEJlZW5EaXNhc3NvY2lhdGVkQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEJhZENRSUF1dG9SZWNvdmVyeUNvdW50OworCVVMT05HICAgICAgICAgICBQb29yQ1FJUm9hbWluZ0NvdW50OworCVVMT05HICAgICAgICAgICBNZ210UmluZ0Z1bGxDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudFNpbmNlTGFzdE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJ4Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFJ4UmluZ0VyckNvdW50OworCVVMT05HICAgICAgICAgICBLaWNrVHhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgVHhSaW5nRXJyQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJlYWxGY3NFcnJDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUGVuZGluZ05kaXNQYWNrZXRDb3VudDsKKworCVVMT05HICAgICAgICAgICBPbmVTZWNPc1R4Q291bnRbTlVNX09GX1RYX1JJTkddOworCVVMT05HICAgICAgICAgICBPbmVTZWNEbWFEb25lQ291bnRbTlVNX09GX1RYX1JJTkddOworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeERvbmVDb3VudDsKKwlVTE9ORyAgICAgICAgICAgT25lU2VjUnhDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQ7CisKKwlVSU5UMzIgICAJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisKKworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250CisJVUxPTkcJCUR1cGxpY2F0ZVJjdjsKKwlVTE9ORwkJVHhBZ2dDb3VudDsKKwlVTE9ORwkJVHhOb25BZ2dDb3VudDsKKwlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKKworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKK30gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7CisKK3R5cGVkZWYgc3RydWN0IF9QSURfQ09VTlRFUiB7CisJVUxPTkcgICAgICAgICAgIFR4QWNrUmVxdWlyZWRDb3VudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVTE9ORyAgICAgICAgICAgVHhBZ2dyZUNvdW50OworCVVMT05HICAgICAgICAgICBUeFN1Y2Nlc3NDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVTE9ORwkJTGFzdFN1Y2Nlc3NSYXRlOworfSBQSURfQ09VTlRFUiwgKlBQSURfQ09VTlRFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKKwkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKK30gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7CisKKy8vCisvLyAgQXJjZm91ciBTdHJ1Y3R1cmUgQWRkZWQgYnkgUGF1bFd1CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9BUkNGT1VSCit7CisJVUlOVCAgICAgICAgICAgIFg7CisJVUlOVCAgICAgICAgICAgIFk7CisJVUNIQVIgICAgICAgICAgIFNUQVRFWzI1Nl07Cit9IEFSQ0ZPVVJDT05URVhULCAqUEFSQ0ZPVVJDT05URVhUOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kgdG9vLiBqdXN0IGNvcHkgdG8gVFhXSS4KK3R5cGVkZWYgc3RydWN0ICBfUkVDRUlWRV9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQlNSU1POjE7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisjZWxzZQorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJT0ZETToxOworCVVTSE9SVAkJTUlNTzoxOworI2VuZGlmCisgfSBSRUNFSVZFX1NFVFRJTkcsICpQUkVDRUlWRV9TRVRUSU5HOworCisvLyBTaGFyZWQga2V5IGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCAgX1dFUF9LRVkgeworCVVDSEFSICAgS2V5TGVuOyAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCisJVUNIQVIgICBLZXlbTUFYX0xFTl9PRl9LRVldOyAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorfSBXRVBfS0VZLCAqUFdFUF9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKKwlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKKwlVQ0hBUiAgIFR4TWljWzhdOworCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCisJVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKKwlVQ0hBUiAgIEtleUxlbjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiAgIEJzc0lkWzZdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCit9IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JCUF9UVU5JTkdfU1RSVUNUIHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudFVwcGVyQm91bmQ7ICAvLyAxMDAgcGVyIHNlYworCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRMb3dlckJvdW5kOyAgLy8gMTAgcGVyIHNlYworCVVDSEFSICAgICAgIFIxN0xvd2VyQm91bmQ7ICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEUyUFJPTQorCVVDSEFSICAgICAgIFIxN1VwcGVyQm91bmQ7ICAgICAgICAgICAgLy8gMHg2OCBhY2NvcmRpbmcgdG8gRGF2aWQgVHVuZworCVVDSEFSICAgICAgIEN1cnJlbnRSMTdWYWx1ZTsKK30gQkJQX1RVTklORywgKlBCQlBfVFVOSU5HOworCit0eXBlZGVmIHN0cnVjdCBfU09GVF9SWF9BTlRfRElWRVJTSVRZX1NUUlVDVCB7CisJVUNIQVIgICAgIEV2YWx1YXRlUGVyaW9kOwkJIC8vIDA6bm90IGV2YWx1dGUgc3RhdHVzLCAxOiBldmFsdWF0ZSBzdGF0dXMsIDI6IHN3aXRjaGluZyBzdGF0dXMKKwlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCisJU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAorCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCisJU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOworCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOworfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9BVVRIX0lORk8geworCUJPT0xFQU4gICAgICAgICBFbmFibGVkOyAgICAgICAgLy9UdXJlOiBFbmFibGUgTEVBUCBBdXRoZW50aWNhdGlvbgorCUJPT0xFQU4gICAgICAgICBDQ0tNOyAgICAgICAgICAgLy9UdXJlOiBVc2UgRmFzdCBSZWF1dGhlbnRpY2F0aW9uIHdpdGggQ0NLTQorCVVDSEFSICAgICAgICAgICBSZXNlcnZlWzJdOworCVVDSEFSICAgICAgICAgICBVc2VyTmFtZVsyNTZdOyAgLy9MRUFQLCBVc2VyIG5hbWUKKwlVTE9ORyAgICAgICAgICAgVXNlck5hbWVMZW47CisJVUNIQVIgICAgICAgICAgIFBhc3N3b3JkWzI1Nl07ICAvL0xFQVAsIFVzZXIgUGFzc3dvcmQKKwlVTE9ORyAgICAgICAgICAgUGFzc3dvcmRMZW47Cit9IExFQVBfQVVUSF9JTkZPLCAqUExFQVBfQVVUSF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgRXJyb3JDb2RlWzJdOyAgLy8wMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUKKwkJCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0CisJCQkJCQkJCS8vMDAgMDMtQ2hhbGxlbmdlIGZyb20gQVAgZmFpbGVkCisJCQkJCQkJCS8vMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZAorCUJPT0xFQU4gICAgICBSZXBvcnRlZDsKK30gUk9HVUVBUF9FTlRSWSwgKlBST0dVRUFQX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgICAgICAgICBSb2d1ZUFwTnI7CisJUk9HVUVBUF9FTlRSWSAgICAgICBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfSBST0dVRUFQX1RBQkxFLCAqUFJPR1VFQVBfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRGVsdGE7CisJQk9PTEVBTiAgICAgUGx1c1NpZ247Cit9IENDS19UWF9QT1dFUl9DQUxJQlJBVEUsICpQQ0NLX1RYX1BPV0VSX0NBTElCUkFURTsKKworLy8KKy8vIFJlY2VpdmUgVHVwbGUgQ2FjaGUgRm9ybWF0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9UVVBMRV9DQUNIRSAgICB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBNYWNBZGRyZXNzW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgIFNlcXVlbmNlOworCVVTSE9SVCAgICAgICAgICBGcmFnOworfSBUVVBMRV9DQUNIRSwgKlBUVVBMRV9DQUNIRTsKKworLy8KKy8vIEZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgeworCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKKwlVTE9ORyAgICAgICBSeFNpemU7CisJVVNIT1JUICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgTGFzdEZyYWc7CisJVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCit9IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOworCisKKy8vCisvLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAorLy8KK3R5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgeworCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCisJUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKK30gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87CisKKy8vCisvLyBUa2lwIEtleSBzdHJ1Y3R1cmUgd2hpY2ggUkM0IGtleSAmIE1JQyBjYWxjdWxhdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfVEtJUF9LRVlfSU5GTyAgeworCVVJTlQgICAgICAgIG5CeXRlc0luTTsgIC8vICMgYnl0ZXMgaW4gTSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgSVYxNjsKKwlVTE9ORyAgICAgICBJVjMyOworCVVMT05HICAgICAgIEswOyAgICAgICAgIC8vIGZvciBNSUNLRVkgTG93CisJVUxPTkcgICAgICAgSzE7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBIaWcKKwlVTE9ORyAgICAgICBMOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBSOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBNOyAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIGZvciBNSUNLRVkKKwlVQ0hBUiAgICAgICBSQzRLRVlbMTZdOworCVVDSEFSICAgICAgIE1JQ1s4XTsKK30gVEtJUF9LRVlfSU5GTywgKlBUS0lQX0tFWV9JTkZPOworCisvLworLy8gUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX19QUklWQVRFX1NUUlVDIHsKKwlVSU5UICAgICAgIFN5c3RlbVJlc2V0Q250OyAgICAgICAgIC8vIFN5c3RlbSByZXNldCBjb3VudGVyCisJVUlOVCAgICAgICBUeFJpbmdGdWxsQ250OyAgICAgICAgICAvLyBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIKKwlVSU5UICAgICAgIFBoeVJ4RXJyQ250OyAgICAgICAgICAgIC8vIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwkvLyBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jCisJVUlOVCAgICAgICBGQ1NDUkMzMjsKKwlBUkNGT1VSQ09OVEVYVCAgV0VQQ09OVEVYVDsKKwkvLyBUa2lwIHN0dWZmCisJVEtJUF9LRVlfSU5GTyAgIFR4OworCVRLSVBfS0VZX0lORk8gICBSeDsKK30gUFJJVkFURV9TVFJVQywgKlBQUklWQVRFX1NUUlVDOworCisvLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKQordHlwZWRlZiBzdHJ1Y3QgX0JCUF9SNjZfVFVOSU5HIHsKKwlCT09MRUFOICAgICBiRW5hYmxlOworCVVTSE9SVCAgICAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDEwMAorCVVTSE9SVCAgICAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDUxMgorCVVDSEFSICAgICAgIFI2NkRlbHRhOworCVVDSEFSICAgICAgIFI2NkN1cnJlbnRWYWx1ZTsKKwlCT09MRUFOCQlSNjZMb3dlclVwcGVyU2VsZWN0OyAvL0JlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4KK30gQkJQX1I2Nl9UVU5JTkcsICpQQkJQX1I2Nl9UVU5JTkc7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9UWF9QT1dFUiB7CisJVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCUJPT0xFQU4gICAgICAgYkVmZmVjdGVkQ2hhbm5lbDsJLy8gRm9yIEJXIDQwIG9wZXJhdGluZyBpbiAyLjRHSHogLCB0aGUgImVmZmVjdGVkIGNoYW5uZWwiIGlzIHRoZSBjaGFubmVsIHRoYXQgaXMgY292ZXJlZCBpbiA0ME1oei4KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVQ0hBUiAgICAgIE1heFR4UHdyOworCVVDSEFSICAgICAgRGZzUmVxOworfSBDSEFOTkVMX1RYX1BPV0VSLCAqUENIQU5ORUxfVFhfUE9XRVI7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMXzExSl9UWF9QT1dFUiB7CisJVUNIQVIgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgQlc7CS8vIEJXXzEwIG9yIEJXXzIwCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworfSBDSEFOTkVMXzExSl9UWF9QT1dFUiwgKlBDSEFOTkVMXzExSl9UWF9QT1dFUjsKKwordHlwZWRlZiBlbnVtIF9BQkdCQU5EX1NUQVRFXyB7CisJVU5LTk9XTl9CQU5ELAorCUJHX0JBTkQsCisJQV9CQU5ELAorfSBBQkdCQU5EX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFpcm9uZXRNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBXcGFQc2tGdW5jW1dQQV9QU0tfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBaXJvbmV0RnVuY1tBSVJPTkVUX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWN0RnVuY1tBQ1RfRlVOQ19TSVpFXTsKKwkvLyBBY3Rpb24KKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBY3RNYWNoaW5lOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTVEFURV9NQUNISU5FCQkJRGxzTWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBEbHNGdW5jW0RMU19GVU5DX1NJWkVdOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTm93MzI7ICAgICAgICAgICAvLyBsYXRjaCB0aGUgdmFsdWUgb2YgTmRpc0dldFN5c3RlbVVwVGltZSgpCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFNlbmROVUxMcHNtVGltZTsKKworCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJSdW5uaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRhc2tMb2NrOworCU1MTUVfUVVFVUUgICAgICAgICAgICAgIFF1ZXVlOworCisJVUlOVCAgICAgICAgICAgICAgICAgICAgU2hpZnRSZWc7CisKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIEFQU0RQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtEb3duVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua1VwVGltZXI7CisjaWZkZWYgUlQyODYwCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgYlBzUG9sbFRpbWVyUnVubmluZzsKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUICAgICBQc1BvbGxUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBSYWRpb09uT2ZmVGltZXI7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUxPTkcgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNSb3VuZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBPbmVTZWNQZXJpb2RpY1JvdW5kOworCisJVUNIQVIJCQkJCVJlYWxSeFBhdGg7CisJQk9PTEVBTgkJCQkJYkxvd1Rocm91Z2hwdXQ7CisJQk9PTEVBTgkJCQkJYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJUnhBbnRFdmFsVGltZXI7CisKKworfSBNTE1FX1NUUlVDVCwgKlBNTE1FX1NUUlVDVDsKKworLy8gc3RydWN0dXJlIGZvciByYWRhciBkZXRlY3Rpb24gYW5kIGNoYW5uZWwgc3dpdGNoCit0eXBlZGVmIHN0cnVjdCBfUkFEQVJfREVURUNUX1NUUlVDVCB7CisJVUNIQVIJCUNTQ291bnQ7CQkJLy9DaGFubmVsIHN3aXRjaCBjb3VudGVyCisJVUNIQVIJCUNTUGVyaW9kOwkJCS8vQ2hhbm5lbCBzd2l0Y2ggcGVyaW9kIChiZWFjb24gY291bnQpCisJVUNIQVIJCVJEQ291bnQ7CQkJLy9SYWRhciBkZXRlY3Rpb24gY291bnRlcgorCVVDSEFSCQlSRE1vZGU7CQkJCS8vUmFkYXIgRGV0ZWN0aW9uIG1vZGUKKwlVQ0hBUgkJUkREdXJSZWdpb247CQkvL1JhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KKwlVQ0hBUgkJQkJQUjE2OworCVVDSEFSCQlCQlBSMTc7CisJVUNIQVIJCUJCUFIxODsKKwlVQ0hBUgkJQkJQUjIxOworCVVDSEFSCQlCQlBSMjI7CisJVUNIQVIJCUJCUFI2NDsKKwlVTE9ORwkJSW5TZXJ2aWNlTW9uaXRvckNvdW50OyAvLyB1bml0OiBzZWMKKwlVSU5UOAkJRGZzU2Vzc2lvblRpbWU7CisJQk9PTEVBTgkJYkZhc3REZnM7CisJVUlOVDgJCUNoTW92aW5nVGltZTsKKwlVSU5UOAkJTG9uZ1B1bHNlUmFkYXJUaDsKK30gUkFEQVJfREVURUNUX1NUUlVDVCwgKlBSQURBUl9ERVRFQ1RfU1RSVUNUOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAordHlwZWRlZiBlbnVtIENEX1NUQVRFX24KK3sKKwlDRF9OT1JNQUwsCisJQ0RfU0lMRU5DRSwKKwlDRF9NQVhfU1RBVEUKK30gQ0RfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IENBUlJJRVJfREVURUNUSU9OX3MKK3sKKwlCT09MRUFOCQkJCQlFbmFibGU7CisJVUlOVDgJCQkJCUNEU2Vzc2lvblRpbWU7CisJVUlOVDgJCQkJCUNEUGVyaW9kOworCUNEX1NUQVRFCQkJCUNEX1N0YXRlOworfSBDQVJSSUVSX0RFVEVDVElPTiwgKlBDQVJSSUVSX0RFVEVDVElPTjsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgZW51bSBfUkVDX0JMT0NLQUNLX1NUQVRVUworeworICAgIFJlY2lwaWVudF9OT05FPTAsCisJUmVjaXBpZW50X1VTRUQsCisJUmVjaXBpZW50X0hhbmRsZVJlcywKKyAgICBSZWNpcGllbnRfQWNjZXB0Cit9IFJFQ19CTE9DS0FDS19TVEFUVVMsICpQUkVDX0JMT0NLQUNLX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9PUklfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgT3JpZ2luYXRvcl9OT05FPTAsCisJT3JpZ2luYXRvcl9VU0VELAorICAgIE9yaWdpbmF0b3JfV2FpdFJlcywKKyAgICBPcmlnaW5hdG9yX0RvbmUKK30gT1JJX0JMT0NLQUNLX1NUQVRVUywgKlBPUklfQkxPQ0tBQ0tfU1RBVFVTOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfQkFfT1JJX0VOVFJZeworCVVDSEFSICAgV2NpZDsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIEJBV2luU2l6ZTsKKwlVQ0hBUiAgIFRva2VuOworLy8gU2VxdWVuY2UgaXMgdG8gZmlsbCBldmVyeSBvdXRnb2luZyBRb1MgREFUQSBmcmFtZSdzIHNlcXVlbmNlIGZpZWxkIGluIDgwMi4xMSBoZWFkZXIuCisJVVNIT1JUCVNlcXVlbmNlOworCVVTSE9SVAlUaW1lT3V0VmFsdWU7CisJT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1czsKKwlSQUxJTktfVElNRVJfU1RSVUNUIE9SSUJBVGltZXI7CisJUFZPSUQJcEFkYXB0ZXI7Cit9IEJBX09SSV9FTlRSWSwgKlBCQV9PUklfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9CQV9SRUNfRU5UUlkgeworCVVDSEFSICAgV2NpZDsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIEJBV2luU2l6ZTsJLy8gNy4zLjEuMTQuIGVhY2ggYnVmZmVyIGlzIGNhcGFibGUgb2YgaG9sZGluZyBhIG1heCBBTVNEVSBvciBNU0RVLgorCVVTSE9SVAkJTGFzdEluZFNlcTsKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKKwlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisJVUxPTkcJCUxhc3RJbmRTZXFBdFRpbWVyOworCVVMT05HCQluRHJvcFBhY2tldDsKKwlVTE9ORwkJcmN2U2VxOworCVJFQ19CTE9DS0FDS19TVEFUVVMgIFJFQ19CQV9TdGF0dXM7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSZVJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jaworCVBWT0lECXBBZGFwdGVyOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QJbGlzdDsKK30gQkFfUkVDX0VOVFJZLCAqUEJBX1JFQ19FTlRSWTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJVUxPTkcJCW51bUFzUmVjaXBpZW50OwkJLy8gSSBhbSByZWNpcGllbnQgb2YgbnVtQXNSZWNpcGllbnQgY2xpZW50cy4gVGhlc2UgY2xpZW50IGFyZSBpbiB0aGUgQkFSZWNFbnRyeVtdCisJVUxPTkcJCW51bUFzT3JpZ2luYXRvcjsJLy8gSSBhbSBvcmlnaW5hdG9yIG9mIAludW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXQorCUJBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5W01BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFXTsKKwlCQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07Cit9IEJBX1RBQkxFLCAqUEJBX1RBQkxFOworCisvL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX1JFQ19FTlRSWXsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQml0bWFwOyAgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplCisJVUNIQVIgICByc3Y7CisJVUNIQVIgICBCdWZTaXplWzhdOworCVJFQ19CTE9DS0FDS19TVEFUVVMJUkVDX0JBX1N0YXR1c1s4XTsKK30gT0lEX0JBX1JFQ19FTlRSWSwgKlBPSURfQkFfUkVDX0VOVFJZOworCisvL0ZvciBRdXJleUJBVGFibGVPSUQgdXNlOwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRCBfT0lEX0JBX09SSV9FTlRSWXsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIEJhQml0bWFwOyAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUsIHJlYWQgT1JJX0JBX1N0YXR1c1tUSURdIGZvciBzdGF0dXMKKwlVQ0hBUiAgIHJzdjsKKwlVQ0hBUiAgIEJ1ZlNpemVbOF07CisJT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1c1s4XTsKK30gT0lEX0JBX09SSV9FTlRSWSwgKlBPSURfQkFfT1JJX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUVVFUllCQV9UQUJMRXsKKwlPSURfQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbMzJdOworCU9JRF9CQV9SRUNfRU5UUlkgICAgICAgQkFSZWNFbnRyeVszMl07CisJVUNIQVIgICBPcmlOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBT3JpRW50cnkKKwlVQ0hBUiAgIFJlY051bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFSZWNFbnRyeQorfSBRVUVSWUJBX1RBQkxFLCAqUFFVRVJZQkFfVEFCTEU7CisKK3R5cGVkZWYJdW5pb24JX0JBQ0FQX1NUUlVDCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwkJVUlOVDMyICAgICA6NDsKKwkJVUlOVDMyICAgICBiMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KKwkJVUlOVDMyICAgICBiSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KKwkJVUlOVDMyICAgICBNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJVUlOVDMyICAgICBBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUlOVDMyICAgICBBbXNkdUVuYWJsZToxOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQorCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCisJCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7CisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQorCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCisJCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwkJVUlOVDMyICAgICAgIAlBbXNkdUVuYWJsZToxOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCisJCVVJTlQzMiAgICAgICAJQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVJTlQzMiAgICAgICAJTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCVVJTlQzMiAgICAgICAJYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCisJCVVJTlQzMiAgICAgICAJYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCisJCVVJTlQzMiAgICAgICAJOjQ7CisJfQlmaWVsZDsKKyNlbmRpZgorCVVJTlQzMgkJCXdvcmQ7Cit9IEJBQ0FQX1NUUlVDLCAqUEJBQ0FQX1NUUlVDOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvL1RoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykKK3R5cGVkZWYJc3RydWN0CV9JT1RfU1RSVUMJeworCVVDSEFSCQkJVGhyZXNob2xkWzJdOworCVVDSEFSCQkJUmVvcmRlclRpbWVPdXROdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzBdCisJVUNIQVIJCQlSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXQorCVVMT05HCQkJT25lU2VjSW5XaW5kb3dDb3VudDsKKwlVTE9ORwkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisJVUxPTkcJCQlPbmVTZWNPdXRXaW5kb3dDb3VudDsKKwlVQ0hBUgkJCURlbE9yaUFjdDsKKwlVQ0hBUgkJCURlbFJlY0FjdDsKKwlVQ0hBUgkJCVJUU1Nob3J0UHJvdDsKKwlVQ0hBUgkJCVJUU0xvbmdQcm90OworCUJPT0xFQU4JCQliUlRTTG9uZ1Byb3RPbjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJYkxhc3RBdGhlcm9zOworICAgIEJPT0xFQU4JCQliQ3VycmVudEF0aGVyb3M7CisgICAgQk9PTEVBTiAgICAgICAgIGJOb3dBdGhlcm9zQnVyc3RPbjsKKwlCT09MRUFOCQkJYk5leHREaXNhYmxlUnhCQTsKKyAgICBCT09MRUFOCQkJYlRvZ2dsZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30gSU9UX1NUUlVDLCAqUElPVF9TVFJVQzsKKworLy8gVGhpcyBpcyB0aGUgcmVnaXN0cnkgc2V0dGluZyBmb3IgODAyLjExbiB0cmFuc21pdCBzZXR0aW5nLiAgVXNlZCBpbiBhZHZhbmNlZCBwYWdlLgordHlwZWRlZiB1bmlvbiBfUkVHX1RSQU5TTUlUX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyBzdHJ1Y3QgeworICAgICAgICAgVUlOVDMyICByc3Y6MTM7CisJCSBVSU5UMzIgIEVYVENIQToyOworCQkgVUlOVDMyICBIVE1PREU6MTsKKwkJIFVJTlQzMiAgVFJBTlNOTzoyOworCQkgVUlOVDMyICBTVEJDOjE7IC8vU1BBQ0UKKwkJIFVJTlQzMiAgU2hvcnRHSToxOworCQkgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCQkgVUlOVDMyICBUeEJGOjE7IC8vIDMqMworCQkgVUlOVDMyICByc3YwOjEwOworICAgIH0gZmllbGQ7CisjZWxzZQorIHN0cnVjdCB7CisJCSBVSU5UMzIgIHJzdjA6MTA7CisJCSBVSU5UMzIgIFR4QkY6MTsKKyAgICAgICAgIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKyAgICAgICAgIFVJTlQzMiAgU2hvcnRHSToxOworICAgICAgICAgVUlOVDMyICBTVEJDOjE7IC8vU1BBQ0UKKyAgICAgICAgIFVJTlQzMiAgVFJBTlNOTzoyOworICAgICAgICAgVUlOVDMyICBIVE1PREU6MTsKKyAgICAgICAgIFVJTlQzMiAgRVhUQ0hBOjI7CisgICAgICAgICBVSU5UMzIgIHJzdjoxMzsKKyAgICB9IGZpZWxkOworI2VuZGlmCisgVUlOVDMyICAgd29yZDsKK30gUkVHX1RSQU5TTUlUX1NFVFRJTkcsICpQUkVHX1RSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgdW5pb24gIF9ERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCQkJVVNIT1JUCQlyc3Y6MzsKKwkJCVVTSE9SVAkJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCisJCQlVU0hPUlQJCVBoeU1vZGU6NDsKKwkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAJLy8gTUNTCisJCQlVU0hPUlQJCVBoeU1vZGU6NDsKKwkJCVVTSE9SVAkgCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgorCQkJVVNIT1JUCQlyc3Y6MzsKKwl9CWZpZWxkOworI2VuZGlmCisJVVNIT1JUCQl3b3JkOworIH0gREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HLCAqUERFU0lSRURfVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJPT0xFQU4JCUlzUmVjaXBpZW50OworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgVElEOworCVVDSEFSICAgbk1TRFU7CisJVVNIT1JUICAgVGltZU91dDsKKwlCT09MRUFOIGJBbGxUaWQ7ICAvLyBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuCit9IE9JRF9BRERfQkFfRU5UUlksICpQT0lEX0FERF9CQV9FTlRSWTsKKworLy8KKy8vIE11bHRpcGxlIFNTSUQgc3RydWN0dXJlCisvLworI2RlZmluZSBXTEFOX01BWF9OVU1fT0ZfVElNCQkJKChNQVhfTEVOX09GX01BQ19UQUJMRSA+PiAzKSArIDEpIC8qIC84ICsgMSAqLworI2RlZmluZSBXTEFOX0NUX1RJTV9CQ01DX09GRlNFVAkJMCAvKiB1bml0OiAzMkIgKi8KKworLyogY2xlYXIgYmNtYyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfQ0xFQVIoYXBpZHgpIFwKKwlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gJj0gfkJJVDhbMF07CisKKy8qIHNldCBiY21jIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19TRVQoYXBpZHgpIFwKKwlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gfD0gQklUOFswXTsKKworLyogY2xlYXIgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQklUX0NMRUFSKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCisJewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSAmPSAofkJJVDhbYml0X29mZnNldF0pOyB9CisKKy8qIHNldCBhIHN0YXRpb24gUFMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfU0VUKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCisJewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCisJCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCisJCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSB8PSBCSVQ4W2JpdF9vZmZzZXRdOyB9CisKKwordHlwZWRlZiBzdHJ1Y3QgX01VTFRJU1NJRF9TVFJVQ1QgeworCVVDSEFSCQkJCQkJCQlCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRMZW47CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCisgICAgUE5FVF9ERVYgICAgICAgICAgICAgICAgICAgCQkJTVNTSUREZXY7CisKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlHcm91cEtleVdlcFN0YXR1czsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQkJCQlXcGFNaXhQYWlyQ2lwaGVyOworCisJVUxPTkcJCQkJCQkJCVR4Q291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4Q291bnQ7CisJVUxPTkcJCQkJCQkJCVJlY2VpdmVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlUcmFuc21pdHRlZEJ5dGVDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhFcnJvckNvdW50OworCVVMT05HCQkJCQkJCQlSeERyb3BDb3VudDsKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKwlSVF9IVF9QSFlfSU5GTwkJCQkJCURlc2lyZWRIdFBoeUluZm87CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwlCT09MRUFOCQkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKworCVVDSEFSCQkJCQkJCQlUeFJhdGU7ICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMSwgLi4uCisJVUNIQVIgICAgIAkJCQkJCQlEZXNpcmVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOy8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUworCVVDSEFSCQkJCQkJCQlEZXNpcmVkUmF0ZXNJbmRleDsKKwlVQ0hBUiAgICAgCQkJCQkJCU1heFR4UmF0ZTsgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKworCVVDSEFSCQkJCQkJCQlUaW1CaXRtYXBzW1dMQU5fTUFYX05VTV9PRl9USU1dOworCisgICAgLy8gV1BBCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01LWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUtbMzJdOworCVVDSEFSCQkJCQkJCQlHVEtbMzJdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxWDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVBdXRoOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOb25jZVszMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFNlY3VyZWQ7CisgICAgTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQU5DbGFzczNEYXRhOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7CisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05JRV9MZW5bMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOX0lFWzJdW01BWF9MRU5fT0ZfUlNOSUVdOworCisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb247CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOworICAgIC8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhXSQorCS8vIFBUWFdJX1NUUlVDICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uVHhXSTsgLy8KKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25CdWZbTUFYX0JFQUNPTl9TSVpFXTsgLy8gTk9URTogQmVhY29uQnVmIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZAorCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpZGVTc2lkOworCVVJTlQxNgkJCQkJCQkJU3RhdGlvbktlZXBBbGl2ZVRpbWU7IC8vIHVuaXQ6IHNlY29uZAorCisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9WSUQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9Qcmlvcml0eTsKKworICAgIFJUXzgwMl8xMV9BQ0wJCQkJCQlBY2Nlc3NDb250cm9sTGlzdDsKKworCS8vIEVEQ0EgUW9zCisgICAgQk9PTEVBTgkJCQkJCQkJYldtbUNhcGFibGU7CS8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQorICAgIEJPT0xFQU4JCQkJCQkJCWJETFNDYXBhYmxlOwkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKKworCVVDSEFSICAgICAgICAgICAJCQkJCURsc1BUS1s2NF07CQkvLyBEdWUgdG8gd2luZG93cyBkaXJ2ZXIgY291bnQgb24gbWVldGluZ2hvdXNlIHRvIGhhbmRsZSA0LXdheSBzaGFrZQorCisJLy8gRm9yIDgwMi4xeCBkYWVtb24gc2V0dGluZyBwZXIgQlNTCisJVUNIQVIJCQkJCQkJCXJhZGl1c19zcnZfbnVtOworCVJBRElVU19TUlZfSU5GTwkJCQkJCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCisjaWZkZWYgUlRMODY1WF9TT0MKKwl1bnNpZ25lZCBpbnQJCQkJCQlteWxpbmtpZDsKKyNlbmRpZgorCisKKwlVSU5UMzIJCQkJCVJjdmRDb25mbGljdFNzaWRDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXNzb2NSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFByb2JlUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRCZWFjb25Db3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGlzYXNzb2NDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREZWF1dGhDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkVW5rbm93bk1nbXRDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRSZXBsYXlBdHRhY2tDb3VudDsKKworCUNIQVIJCQkJCVJzc2lPZlJjdmRDb25mbGljdFNzaWQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBc3NvY1Jlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRSZWFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFByb2JlUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEJlYWNvbjsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERpc2Fzc29jOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXV0aDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERlYXV0aDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFVua25vd25NZ210OworCUNIQVIJCQkJCVJzc2lPZlJjdmRSZXBsYXlBdHRhY2s7CisKKwlCT09MRUFOCQkJCQliQmNuU250UmVxOworCVVDSEFSCQkJCQlCY25CdWZJZHg7Cit9IE1VTFRJU1NJRF9TVFJVQ1QsICpQTVVMVElTU0lEX1NUUlVDVDsKKworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCit0eXBlZGVmIGVudW0gX0JTUzIwNDBDT0VYSVNUX0ZMQUd7CisJQlNTXzIwNDBfQ09FWElTVF9ESVNBQkxFID0gMCwKKwlCU1NfMjA0MF9DT0VYSVNUX1RJTUVSX0ZJUkVEICA9IDEsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX1NZTkMgPSAyLAorCUJTU18yMDQwX0NPRVhJU1RfSU5GT19OT1RJRlkgPSA0LAorfUJTUzIwNDBDT0VYSVNUX0ZMQUc7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvLyBjb25maWd1cmF0aW9uIGNvbW1vbiB0byBPUE1PREVfQVAgYXMgd2VsbCBhcyBPUE1PREVfU1RBCit0eXBlZGVmIHN0cnVjdCBfQ09NTU9OX0NPTkZJRyB7CisKKwlCT09MRUFOCQliQ291bnRyeUZsYWc7CisJVUNIQVIJCUNvdW50cnlDb2RlWzNdOworCVVDSEFSCQlHZW9ncmFwaHk7CisJVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbjsgICAgICAvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uLCAwOkZDQywgMTpJQywgMjpFVFNJLCAzOlNQQUlOLCA0OkZyYW5jZSwgNTpNS0ssIDY6TUtLMSwgNzpJc3JhZWwKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uRm9yQUJhbmQ7CS8vIEVudW0gb2YgY291bnRyeSByZWdpb24gZm9yIEEgYmFuZAorCVVDSEFSICAgICAgIFBoeU1vZGU7ICAgICAgICAgICAgLy8gUEhZXzExQSwgUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV9BQkdfTUlYRUQKKwlVU0hPUlQgICAgICBEc2lmczsgICAgICAgICAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKKwlVTE9ORyAgICAgICBQYWNrZXRGaWx0ZXI7ICAgICAgIC8vIFBhY2tldCBmaWx0ZXIgZm9yIHJlY2VpdmluZworCisJQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCisJVUNIQVIgICAgICAgU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlVQ0hBUiAgICAgICBMYXN0U3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlDSEFSICAgICAgICBMYXN0U3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCisJVUNIQVIJCUxhc3RCc3NpZFtNQUNfQUREUl9MRU5dOworCisJVUNIQVIgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBCZWFjb25QZXJpb2Q7CisJVUNIQVIgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICBDZW50cmFsQ2hhbm5lbDsgICAgCS8vIENlbnRyYWwgQ2hhbm5lbCB3aGVuIHVzaW5nIDQwTUh6IGlzIGluZGljYXRpbmcuIG5vdCByZWFsIGNoYW5uZWwuCisKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107ICAgICAgLy8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIgICAgICAgTWF4RGVzaXJlZFJhdGU7CisJVUNIQVIgICAgICAgRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKworCVVMT05HICAgICAgIEJhc2ljUmF0ZUJpdG1hcDsgICAgICAgIC8vIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwCisKKwlCT09MRUFOCQliQVBTRENhcGFibGU7CisJQk9PTEVBTgkJYkluU2VydmljZVBlcmlvZDsKKwlCT09MRUFOCQliQVBTREFDX0JFOworCUJPT0xFQU4JCWJBUFNEQUNfQks7CisJQk9PTEVBTgkJYkFQU0RBQ19WSTsKKwlCT09MRUFOCQliQVBTREFDX1ZPOworCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKKwlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCisJVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OworCVVDSEFSCQlNYXhTUExlbmd0aDsKKwlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwgCUJXXzIwLCBCV180MAorCVJFR19UUkFOU01JVF9TRVRUSU5HICAgICAgICBSZWdUcmFuc21pdFNldHRpbmc7IC8vcmVnaXN0cnkgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCisJVUNIQVIgICAgICAgVHhSYXRlOyAgICAgICAgICAgICAgICAgLy8gU2FtZSB2YWx1ZSB0byBmaWxsIGluIFRYRC4gVHhSYXRlIGlzIDYtYml0CisJVUNIQVIgICAgICAgTWF4VHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJVUNIQVIgICAgICAgVHhSYXRlSW5kZXg7ICAgICAgICAgICAgLy8gVHggcmF0ZSBpbmRleCBpbiBSYXRlU3dpdGNoVGFibGUKKwlVQ0hBUiAgICAgICBUeFJhdGVUYWJsZVNpemU7ICAgICAgICAvLyBWYWxpZCBUeCByYXRlIHRhYmxlIHNpemUgaW4gUmF0ZVN3aXRjaFRhYmxlCisJVUNIQVIgICAgICAgTWluVHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJVUNIQVIgICAgICAgUnRzUmF0ZTsgICAgICAgICAgICAgICAgLy8gUkFURV94eHgKKwlIVFRSQU5TTUlUX1NFVFRJTkcJTWxtZVRyYW5zbWl0OyAgIC8vIE1HTVQgZnJhbWUgUEhZIHJhdGUgc2V0dGluZyB3aGVuIG9wZXJhdGluIGF0IEh0IHJhdGUuCisJVUNIQVIgICAgICAgTWxtZVJhdGU7ICAgICAgICAgICAgICAgLy8gUkFURV94eHgsIHVzZWQgdG8gc2VuZCBNTE1FIGZyYW1lcworCVVDSEFSICAgICAgIEJhc2ljTWxtZVJhdGU7ICAgICAgICAgIC8vIERlZmF1bHQgUmF0ZSBmb3Igc2VuZGluZyBNTE1FIGZyYW1lcworCisJVVNIT1JUICAgICAgUnRzVGhyZXNob2xkOyAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisJVVNIT1JUICAgICAgRnJhZ21lbnRUaHJlc2hvbGQ7ICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisKKwlVQ0hBUiAgICAgICBUeFBvd2VyOyAgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIG1XCisJVUxPTkcgICAgICAgVHhQb3dlclBlcmNlbnRhZ2U7ICAgICAgLy8gMH4xMDAgJQorCVVMT05HICAgICAgIFR4UG93ZXJEZWZhdWx0OyAgICAgICAgIC8vIGtlZXAgZm9yIFR4UG93ZXJQZXJjZW50YWdlCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQUNBUF9TVFJVQyAgICAgICAgQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisJQkFDQVBfU1RSVUMgICAgICAgIFJFR0JBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUlPVF9TVFJVQwkJSU9UZXN0UGFybTsJLy8gODAyLjExbiBJbnRlck9wYmlsaXR5IFRlc3QgUGFyYW1ldGVyOworCVVMT05HICAgICAgIFR4UHJlYW1ibGU7ICAgICAgICAgICAgIC8vIFJ0ODAyXzExUHJlYW1ibGVMb25nLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQsIFJ0ODAyXzExUHJlYW1ibGVBdXRvCisJQk9PTEVBTiAgICAgYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudDsgICAgIC8vIE1pY3Jvc29mdCB1c2UgMCBhcyBkaXNhYmxlCisJVUxPTkcgICAgICAgVXNlQkdQcm90ZWN0aW9uOyAgICAgICAgLy8gMDogYXV0bywgMTogYWx3YXlzIHVzZSwgMjogYWx3YXlzIG5vdCB1c2UKKwlCT09MRUFOICAgICBiVXNlU2hvcnRTbG90VGltZTsgICAgICAvLyAwOiBkaXNhYmxlLCAxIC0gdXNlIHNob3J0IHNsb3QgKDl1cykKKwlCT09MRUFOICAgICBiRW5hYmxlVHhCdXJzdDsgICAgICAgICAvLyAxOiBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgVFggUEFDS0VUIEJVUlNUCisJQk9PTEVBTiAgICAgYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsgICAgICAvLyAxOiBlbmFibGUgVFggYWdncmVnYXRpb24gd2hlbiB0aGUgcGVlciBzdXBwb3J0cyBpdAorCUJPT0xFQU4gICAgIGJQaWdneUJhY2tDYXBhYmxlOwkJLy8gMTogZW5hYmxlIFRYIHBpZ2d5LWJhY2sgYWNjb3JkaW5nIE1BQydzIHZlcnNpb24KKwlCT09MRUFOICAgICBiSUVFRTgwMjExSDsJCQkvLyAxOiBlbmFibGUgSUVFRTgwMi4xMWggc3BlYy4KKwlVTE9ORwkJRGlzYWJsZU9MQkNEZXRlY3Q7CQkvLyAwOiBlbmFibGUgT0xCQyBkZXRlY3Q7IDEgZGlzYWJsZSBPTEJDIGRldGVjdAorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCQliUmRnOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUJPT0xFQU4gICAgICAgICAgICAgYldtbUNhcGFibGU7ICAgICAgICAvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KKwlRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCUVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVVDSEFSICAgICAgICAgICAgICAgQWNrUG9saWN5WzRdOyAgICAgICAvLyBBQ0sgcG9saWN5IG9mIHRoZSBzcGVjaWZpZWQgQUMuIHNlZSBBQ0tfeHh4CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQliRExTQ2FwYWJsZTsJCS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBPUFNUQVRVU19URVNUX0ZMQUcoKSwgT1BTVEFUVVNfU0VUX0ZMQUcoKSwgT1BfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCisJLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbgorCVVMT05HICAgICAgICAgICAgICAgT3BTdGF0dXNGbGFnczsKKworCUJPT0xFQU4JCQkJTmRpc1JhZGlvU3RhdGVPZmY7IC8vRm9yIEhDVCAxMi4wLCBzZXQgdGhpcyBmbGFnIHRvIFRSVUUgaW5zdGVhZCBvZiBjYWxsZWQgTWxtZVJhZGlvT2ZmLgorCUFCR0JBTkRfU1RBVEUJCUJhbmRTdGF0ZTsJCS8vIEZvciBzZXR0aW5nIEJCUCB1c2VkIG9uIEIvRyBvciBBIG1vZGUuCisKKwkvLyBJRUVFODAyLjExSC0tREZTLgorCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJQ0FSUklFUl9ERVRFQ1RJT04JCUNhcnJpZXJEZXRlY3Q7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSFQKKwlVQ0hBUgkJCUJBU2l6ZTsJCS8vIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eQorCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKKwlSVF9IVF9DQVBBQklMSVRZCURlc2lyZWRIdFBoeTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEhUSW5mbzsJLy8gVXNlZnVsIGFzIEFQLgorCS8vVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4KKwkvL1RoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuCisJTkVXX0VYVF9DSEFOX0lFCU5ld0V4dENoYW5PZmZzZXQ7CS8vNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJCQkJQnNzMjA0MENvZXhpc3RGbGFnOwkJLy8gYml0IDA6IGJCc3NDb2V4aXN0VGltZXJSdW5uaW5nLCBiaXQgMTogTmVlZFN5bmNBZGRIdEluZm8uCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlCc3MyMDQwQ29leGlzdFRpbWVyOworCisJLy9UaGlzIElFIGlzIHVzZWQgZm9yIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZS4KKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1MyMDQwQ29leGlzdEluZm87CisJLy8gPT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09PgorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiAxMH4xMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQ7CQkJLy8gVW5pdCA6IFNlY29uZAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcjsKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmU7CQkJCS8vIFVuaXQgOiBwZXJjZW50YWdlCisKKwlVTE9ORwkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CQkJLy8gbXVsdGlwbGUgb2YgKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCVVMT05HCQkJCQlDb3VudERvd25DdHI7CS8vIENvdW50RG93biBDb3VudGVyIGZyb20gKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHJpZ2dlckV2ZW50VGFiTG9jazsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlMYXN0QlNTQ29leGlzdDIwNDA7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTQ29leGlzdDIwNDA7CisJVFJJR0dFUl9FVkVOVF9UQUIJCVRyaWdnZXJFdmVudFRhYjsKKwlVQ0hBUgkJCQkJQ2hhbm5lbExpc3RJZHg7CisJLy8gPD09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PQorCUJPT0xFQU4JCQkJCWJPdmVybGFwU2Nhbm5pbmc7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkhUUHJvdGVjdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiTUlNT1BTRW5hYmxlOworICAgIEJPT0xFQU4JCQkJCWJCQURlY2xpbmU7CisJQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOworCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKKwlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKKwlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOworCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKKworCVVDSEFSCQkJCQlUeEJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAorCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7CisJQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0CisKKwkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCisJVUNIQVIJCQkJVHhTdHJlYW07CisJVUNIQVIJCQkJUnhTdHJlYW07CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7CisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJQk9PTEVBTiAgICAgCQliSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCisKKworIAlORElTX1NQSU5fTE9DSwkJCU1lYXN1cmVSZXFUYWJMb2NrOworCVBNRUFTVVJFX1JFUV9UQUIJCXBNZWFzdXJlUmVxVGFiOworCisJTkRJU19TUElOX0xPQ0sJCQlUcGNSZXFUYWJMb2NrOworCVBUUENfUkVRX1RBQgkJCXBUcGNSZXFUYWI7CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCUhUVFJBTlNNSVRfU0VUVElORwkJTUNhc3RQaHlNb2RlOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworI2lmZGVmIFNJTkdMRV9TS1UKKwlVSU5UMTYJCQkJCURlZmluZU1heFR4UHdyOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCit9IENPTU1PTl9DT05GSUcsICpQQ09NTU9OX0NPTkZJRzsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisvLyBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FETUlOX0NPTkZJRyB7CisJLy8gR1JPVVAgMSAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyCisJLy8gICBBUCBvciBJQlNTIGhvbGRlcikuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIEJzc1R5cGU7ICAgICAgICAgICAgICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DCisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgLy8gdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MKKworCS8vIEdST1VQIDIgLQorCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKKwkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyOworCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyTW9kZTsgICAgICAvLyBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xECisJVVNIT1JUICAgICAgRGVmYXVsdExpc3RlbkNvdW50OyAgIC8vIGRlZmF1bHQgbGlzdGVuIGNvdW50OworCVVMT05HICAgICAgIFdpbmRvd3NQb3dlck1vZGU7ICAgICAgICAgICAvLyBQb3dlciBtb2RlIGZvciBBQyBwb3dlcgorCVVMT05HICAgICAgIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOyAgICAvLyBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cworCUJPT0xFQU4gICAgIGJXaW5kb3dzQUNDQU1FbmFibGU7ICAgICAgICAvLyBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbgorCUJPT0xFQU4gICAgIGJBdXRvUmVjb25uZWN0OyAgICAgICAgIC8vIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRAorCVVMT05HICAgICAgIFdpbmRvd3NQb3dlclByb2ZpbGU7ICAgIC8vIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QCisKKwkvLyBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpCisJVVNIT1JUICAgICAgUHNtOyAgICAgICAgICAgICAgICAgIC8vIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKQorCVVTSE9SVCAgICAgIERpc2Fzc29jUmVhc29uOworCVVDSEFSICAgICAgIERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgRGVhdXRoUmVhc29uOworCVVDSEFSICAgICAgIERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEF1dGhGYWlsUmVhc29uOworCVVDSEFSICAgICAgIEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07CisKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAorCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7CisKKwlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSworCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOworCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgorCisJVUNIQVIJCURlZmF1bHRLZXlJZDsKKworCisJLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKKwlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKKworCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCisJVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQorCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KKwlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKwkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCisJV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4CisJVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKKwlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKKwlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCisJVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCisJVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7CisJVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOworCisJVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCisJVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQorCisJVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAorCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKKwlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgorCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKKwlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgorCisgICAgQk9PTEVBTgkJQWRob2NCT25seUpvaW5lZDsJLy8gSW5kaWNhdGUgQWRob2MgQiBKb2luLgorICAgIEJPT0xFQU4JCUFkaG9jQkdKb2luZWQ7CQkvLyBJbmRpY2F0ZSBBZGhvYyBCL0cgSm9pbi4KKyAgICBCT09MRUFOCQlBZGhvYzIwTkpvaW5lZDsJCS8vIEluZGljYXRlIEFkaG9jIDIwTUh6IE4gSm9pbi4KKworCS8vIE5ldyBmb3IgV1BBLCB3aW5kb3dzIHdhbnQgdXMgdG8gdG8ga2VlcCBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiBhbmQKKwkvLyBGaXhlZCBJRXMgZnJvbSBsYXN0IGFzc29jaWF0aW9uIHJlc3BvbnNlCisJTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04gICAgIEFzc29jSW5mbzsKKwlVU0hPUlQgICAgICAgUmVxVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSICAgICAgIFJlcVZhcklFc1tNQVhfVklFX0xFTl07CQkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwlVU0hPUlQgICAgICAgUmVzVmFySUVMZW47ICAgICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSICAgICAgIFJlc1ZhcklFc1tNQVhfVklFX0xFTl07CisKKwlVQ0hBUiAgICAgICBSU05JRV9MZW47CisJVUNIQVIgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOwkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKworCS8vIE5ldyB2YXJpYWJsZXMgdXNlZCBmb3IgQ0NYIDEuMAorCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBPbjsKKwlCT09MRUFOICAgICAgICAgICAgIGJDa2lwQ21pY09uOworCVVDSEFSICAgICAgICAgICAgICAgQ2tpcEZsYWc7CisJVUNIQVIgICAgICAgICAgICAgICBHSVZbM107ICAvL2ZvciBDQ1ggaXYKKwlVQ0hBUiAgICAgICAgICAgICAgIFJ4U0VRWzRdOworCVVDSEFSICAgICAgICAgICAgICAgVHhTRVFbNF07CisJVUNIQVIgICAgICAgICAgICAgICBDS0lQTUlDWzRdOworCVVDSEFSICAgICAgICAgICAgICAgTGVhcEF1dGhNb2RlOworCUxFQVBfQVVUSF9JTkZPICAgICAgTGVhcEF1dGhJbmZvOworCVVDSEFSICAgICAgICAgICAgICAgSGFzaFB3ZFsxNl07CisJVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlWzhdOworCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlWzI0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VbOF07CisKKwlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VSZXNwb25zZVsyNF07CisJVUNIQVIgICAgICAgICAgICAgICBTZXNzaW9uS2V5WzE2XTsgLy9OZXR3b3JrIHNlc3Npb24ga2V5cyAoTlNLKQorCVJBTElOS19USU1FUl9TVFJVQ1QgTGVhcEF1dGhUaW1lcjsKKwlST0dVRUFQX1RBQkxFICAgICAgIFJvZ3VlQXBUYWI7ICAgLy9DaXNjbyBDQ1gxIFJvZ3VlIEFQIERldGVjdGlvbgorCisJLy8gTmV3IGNvbnRyb2wgZmxhZ3MgZm9yIENDWAorCUNDWF9DT05UUk9MICAgICAgICAgQ0NYQ29udHJvbDsgICAgICAgICAgICAgICAgIC8vIE1hc3RlciBhZG1pbmlzdHJhdGlvbiBzdGF0ZQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NYRW5hYmxlOyAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBDQ1ggc3RhdGUKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFNjYW5DaGFubmVsOyAgICAgICAgICAgICAvLyBTZWxlY3RlZCBjaGFubmVsIGZvciBDQ1ggYmVhY29uIHJlcXVlc3QKKwlVU0hPUlQgICAgICAgICAgICAgIENDWFNjYW5UaW1lOyAgICAgICAgICAgICAgICAvLyBUaW1lIG91dCB0byB3YWl0IGZvciBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hSZXFUeXBlOyAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBwcm9jZXNzaW5nIENDWCByZXF1ZXN0IHR5cGUKKwlCU1NfVEFCTEUgICAgICAgICAgIENDWEJzc1RhYjsgICAgICAgICAgICAgICAgICAvLyBCU1MgVGFibGUKKwlVQ0hBUiAgICAgICAgICAgICAgIEZyYW1lUmVwb3J0QnVmWzIwNDhdOyAgICAgICAvLyBCdWZmZXIgZm9yIGNyZWF0aW5nIGZyYW1lIHJlcG9ydAorCVVTSE9SVCAgICAgICAgICAgICAgRnJhbWVSZXBvcnRMZW47ICAgICAgICAgICAgIC8vIEN1cnJlbnQgRnJhbWUgcmVwb3J0IGxlbmd0aAorCVVMT05HICAgICAgICAgICAgICAgQ0xCdXN5Qnl0ZXM7ICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIGR1cm5pbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZQorCVVTSE9SVCAgICAgICAgICAgICAgUlBJRGVuc2l0eVs4XTsgICAgICAgICAgICAgIC8vIEFycmF5IGZvciBSUEkgZGVuc2l0eSBjb2xsZWN0aW9uCisJLy8gU3RhcnQgYWRkcmVzcyBvZiBlYWNoIEJTUyB0YWJsZSB3aXRoaW4gRnJhbWVSZXBvcnRCdWYKKwkvLyBJdCdzIGltcG9ydGFudCB0byB1cGRhdGUgdGhlIFJ4UG93ZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQnNzCisJVVNIT1JUICAgICAgICAgICAgICBCc3NSZXBvcnRPZmZzZXRbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworCVVTSE9SVCAgICAgICAgICAgICAgQmVhY29uVG9rZW47ICAgICAgICAgICAgICAgIC8vIFRva2VuIGZvciBiZWFjb24gcmVwb3J0CisJVUxPTkcgICAgICAgICAgICAgICBMYXN0QnNzSW5kZXg7ICAgICAgICAgICAgICAgLy8gTW9zdCBjdXJyZW50IHJlcG9ydGVkIEJzcyBpbmRleAorCVJNX1JFUVVFU1RfQUNUSU9OICAgTWVhc3VyZW1lbnRSZXF1ZXN0WzE2XTsgICAgIC8vIFNhdmVkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwlVQ0hBUiAgICAgICAgICAgICAgIFJNUmVxQ250OyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KKwlVQ0hBUiAgICAgICAgICAgICAgIEN1cnJlbnRSTVJlcUlkeDsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4KKwlCT09MRUFOICAgICAgICAgICAgIFBhcmFsbGVsUmVxOyAgICAgICAgICAgICAgICAvLyBQYXJhbGxlbCBtZWFzdXJlbWVudCwgb25seSBvbmUgcmVxdWVzdCBwZXJmb3JtZWQsCisJCQkJCQkJCQkJCQkJLy8gSXQgbXVzdCBiZSB0aGUgc2FtZSBjaGFubmVsIHdpdGggbWF4aW11bSBkdXJhdGlvbgorCVVTSE9SVCAgICAgICAgICAgICAgUGFyYWxsZWxEdXJhdGlvbjsgICAgICAgICAgIC8vIE1heGltdW0gZHVyYXRpb24gZm9yIHBhcmFsbGVsIG1lYXN1cmVtZW50CisJVUNIQVIgICAgICAgICAgICAgICBQYXJhbGxlbENoYW5uZWw7ICAgICAgICAgICAgLy8gT25seSBvbmUgY2hhbm5lbCB3aXRoIHBhcmFsbGVsIG1lYXN1cmVtZW50CisJVVNIT1JUICAgICAgICAgICAgICBJQVBQVG9rZW47ICAgICAgICAgICAgICAgICAgLy8gSUFQUCBkaWFsb2cgdG9rZW4KKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01pbjsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWluIGZvciBBQyAwCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNYXg7ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01heCBmb3IgQUMgMAorCS8vIEhhY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdG9ncmFtIHBhcmFtZXRlcnMKKwlVQ0hBUiAgICAgICAgICAgICAgIE5IRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbQorCVVDSEFSICAgICAgICAgICAgICAgQ0xGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgY2hhbm5lbCBsb2FkCisKKwlVQ0hBUiAgICAgICAgICAgICAgIEtSS1sxNl07ICAgICAgICAvL0tleSBSZWZyZXNoIEtleS4KKwlVQ0hBUiAgICAgICAgICAgICAgIEJUS1szMl07ICAgICAgICAvL0Jhc2UgVHJhbnNpZW50IEtleQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NLTUxpbmtVcEZsYWc7CisJVUxPTkcgICAgICAgICAgICAgICBDQ0tNUk47ICAgIC8vKFJlKUFzc29jaWF0aW9uIHJlcXVlc3QgbnVtYmVyLgorCUxBUkdFX0lOVEVHRVIgICAgICAgQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcDsgIC8vVFNGIHRpbWVyIGZvciBSZS1hc3NvY2FpdGUgdG8gdGhlIG5ldyBBUAorCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0OyAgICAgIC8vaW4gZEJtCisJVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0SVBBZGRyZXNzWzRdOyAgICAgICAgLy9lZy4gMTkyLjE2OC4xLjEKKwlCT09MRUFOICAgICAgICAgICAgIENDWEFkamFjZW50QVBSZXBvcnRGbGFnOyAgICAvL2ZsYWcgZm9yIGRldGVybWluaW5nIHJlcG9ydCBBc3NvYyBMb3N0IHRpbWUKKwlDSEFSICAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vQWRqYWNlbnQgQVAncyBTU0lEIHJlcG9ydAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQnNzaWRbTUFDX0FERFJfTEVOXTsgICAgICAgICAvL0FkamFjZW50IEFQJ3MgQlNTSUQgcmVwb3J0CisJVVNIT1JUICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQ2hhbm5lbDsKKwlVTE9ORyAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBMaW5rRG93blRpbWU7ICAvL2ZvciBTcGVjIFMzMi4KKworCVJBTElOS19USU1FUl9TVFJVQ1QJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXI7CisJQk9PTEVBTgkJCQlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmc7CisKKwlVQ0hBUiAgICAgICAgICAgCUR0aW1Db3VudDsgICAgICAvLyAwLi4gRHRpbVBlcmlvZC0xCisJVUNIQVIgICAgICAgICAgIAlEdGltUGVyaW9kOyAgICAgLy8gZGVmYXVsdCA9IDMKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVJUXzgwMl8xMV9ETFMJCURMU0VudHJ5W01BWF9OVU1fT0ZfRExTX0VOVFJZXTsKKwlVQ0hBUgkJCQlEbHNSZXBsYXlDb3VudGVyWzhdOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwkvLyBUaGlzIGlzIG9ubHkgZm9yIFdIUUwgdGVzdC4KKwlCT09MRUFOCQkJCVdocWxUZXN0OworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXI7CisgICAgLy8gRmFzdCBSb2FtaW5nCisJQk9PTEVBTgkJICAgICAgICBiRmFzdFJvYW1pbmc7ICAgICAgIC8vIDA6ZGlzYWJsZSBmYXN0IHJvYW1pbmcsIDE6ZW5hYmxlIGZhc3Qgcm9hbWluZworCUNIQVIJCSAgICAgICAgZEJtVG9Sb2FtOyAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxWDsKKyAgICBCT09MRUFOICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworICAgIENJUEhFUl9LRVkJICAgICAgICBEZXNpcmVTaGFyZWRLZXlbNF07CS8vIFJlY29yZCB1c2VyIGRlc2lyZWQgV0VQIGtleXMKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIERlc2lyZVNoYXJlZEtleUlkOworCisgICAgLy8gMDogZHJpdmVyIGlnbm9yZXMgd3BhX3N1cHBsaWNhbnQKKyAgICAvLyAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbgorICAgIC8vIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzCisgICAgVUNIQVIgICAgICAgICAgICAgICBXcGFTdXBwbGljYW50VVA7CisJVUNIQVIJCQkJV3BhU3VwcGxpY2FudFNjYW5Db3VudDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBDSEFSICAgICAgICAgICAgICAgIGRldl9uYW1lWzE2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIE9yaURldlR5cGU7CisKKyAgICBCT09MRUFOICAgICAgICAgICAgIGJUR25XaWZpVGVzdDsKKwlCT09MRUFOCQkJICAgIGJTY2FuUmVxSXNGcm9tV2ViVUk7CisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworI2lmZGVmIFJUMjg2MAorICAgIFVDSEFSICAgICAgIEJCUFIzOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQkJCUlFRUU4MDIxMWRDbGllbnRNb2RlOworCVVDSEFSCQkJCVN0YU9yaUNvdW50cnlDb2RlWzNdOworCVVDSEFSCQkJCVN0YU9yaUdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCit9IFNUQV9BRE1JTl9DT05GSUcsICpQU1RBX0FETUlOX0NPTkZJRzsKKworLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBrZWVwIHRoZSBjdXJyZW50IGFjdGl2ZSBCU1MvSUJTUydzIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGlzIFNUQQorLy8gaGFkIGFncmVlZCB1cG9uIGpvaW5pbmcgdGhlIG5ldHdvcmsuIFdoaWNoIG1lYW5zIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzdWFsbHkgZGVjaWRlZAorLy8gYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVycmUKKy8vIGlzIHZhbGlkIG9ubHkgd2hlbiBlaXRoZXIgQURIT0NfT04ocEFkKSBvciBJTkZSQV9PTihwQWQpIGlzIFRSVUUuCisvLyBOb3JtYWxseSwgYWZ0ZXIgU0NBTiBvciBmYWlsZWQgcm9hbWluZyBhdHRlbXB0cywgd2UgbmVlZCB0byByZWNvdmVyIGJhY2sgdG8KKy8vIHRoZSBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9TVEFfQUNUSVZFX0NPTkZJRyB7CisJVVNIT1JUICAgICAgQWlkOworCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgICAgICAgIC8vIGluIGt1c2VjOyBJQlNTIHBhcmFtZXRlciBzZXQgZWxlbWVudAorCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOworCVVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOworCVVTSE9SVCAgICAgIENmcFBlcmlvZDsKKworCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCisJVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworCS8vIENvcHkgc3VwcG9ydGVkIGh0IGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCVJUX0hUX1BIWV9JTkZPCQlTdXBwb3J0ZWRQaHlJbmZvOworCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Cit9IFNUQV9BQ1RJVkVfQ09ORklHLCAqUFNUQV9BQ1RJVkVfQ09ORklHOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyAtLS0tLS0tLS0tLSBzdGFydCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVVUSC1SU1AgU3RhdGUgTWFjaGluZSBBdXggZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IF9BUF9NTE1FX0FVWCB7CisJVUNIQVIgICAgICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgICAgICBBbGc7CisJQ0hBUiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VbQ0lQSEVSX1RFWFRfTEVOXTsKK30gQVBfTUxNRV9BVVgsICpQQVBfTUxNRV9BVVg7CisKKy8vIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfV1BBX1JFS0VZIHsKKwlVTE9ORyBSZUtleU1ldGhvZDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBSZUtleUludGVydmFsOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKK30gUlRfV1BBX1JFS0VZLCpQUlRfV1BBX1JFS0VZLCBSVF84MDJfMTFfV1BBX1JFS0VZLCAqUFJUXzgwMl8xMV9XUEFfUkVLRVk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgeworCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KKwlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KKwlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KKwlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgorCUJPT0xFQU4JCVZhbGlkQXNNZXNoOworCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KKwlCT09MRUFOCQlpc0NhY2hlZDsKKwlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCisKKwlVQ0hBUiAgICAgICAgIAlFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsgIC8vIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNCisJLy9qYW4gZm9yIHdwYQorCS8vIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCCisJVUNIQVIgICAgICAgICAgIENNVGltZXJSdW5uaW5nOworCVVDSEFSICAgICAgICAgICBhcGlkeDsJCQkvLyBNQlNTIG51bWJlcgorCVVDSEFSICAgICAgICAgICBSU05JRV9MZW47CisJVUNIQVIgICAgICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKKwlVQ0hBUiAgICAgICAgICAgQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIgICAgICAgICAgIFJfQ291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiAgICAgICAgICAgUFRLWzY0XTsKKwlVQ0hBUiAgICAgICAgICAgUmVUcnlDb3VudGVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgICAgICAgICAgICAgIFJldHJ5VGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJCQkJRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXI7CS8vIEEgdGltZXIgd2hpY2ggZW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBQU0sgU00KKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlBUF9XUEFfU1RBVEUgICAgV3BhU3RhdGU7CisJR1RLX1NUQVRFICAgICAgIEdUS1N0YXRlOworCVVTSE9SVCAgICAgICAgICBQb3J0U2VjdXJlZDsKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgUHJpdmFjeUZpbHRlcjsgICAgICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCUNJUEhFUl9LRVkgICAgICBQYWlyd2lzZUtleTsKKwlQVk9JRCAgICAgICAgICAgcEFkOworICAgIElOVAkJCQlQTUtJRF9DYWNoZUlkeDsKKyAgICBVQ0hBUgkJCVBNS0lEW0xFTl9QTUtJRF07CisKKworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFBzTW9kZTsKKwlTU1QgICAgICAgICAgICAgU3N0OworCUFVVEhfU1RBVEUgICAgICBBdXRoU3RhdGU7IC8vIGZvciBTSEFSRUQgS0VZIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgdXNlZCBvbmx5CisJQk9PTEVBTgkJCUlzUmVhc3NvY1N0YTsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwlVU0hPUlQgICAgICAgICAgQWlkOworCVVTSE9SVCAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFJzc2k7CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlVSU5UMTYJCQlTdGF0aW9uS2VlcEFsaXZlQ291bnQ7IC8vIHVuaXQ6IHNlY29uZAorCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7CisJUVVFVUVfSEVBREVSICAgIFBzUXVldWU7CisKKwlVSU5UMzIJCQlTdGFDb25uZWN0VGltZTsJCS8vIHRoZSBsaXZlIHRpbWUgb2YgdGhpcyBzdGF0aW9uIHNpbmNlIGFzc29jaWF0ZWQgd2l0aCBBUAorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJYlNlbmRCQVI7CisJVVNIT1JUCQkJTm9CQURhdGFDb3VudERvd247CisKKwlVSU5UMzIgICAJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50CisJVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJVUlOVAkJCUZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdGSUZPQ291bnQ7CisJVUlOVAkJCURlYnVnVHhDb3VudDsKKyAgICBCT09MRUFOCQkJYkRsc0luaXQ7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQorLy8gcnQyODYwIGFkZCB0aGlzLiBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYgorCVVJTlQJCQlNYXRjaFdEU1RhYklkeDsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZUluZGV4OworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVSU5UMzIJCQlPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUlOVDMyCQkJQ29udGludWVUeEZhaWxDbnQ7CisJVUlOVDMyICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlVSU5UCQkJTWF0Y2hEbHNFbnRyeUlkeDsgLy8gaW5kaWNhdGUgdGhlIGluZGV4IGluIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTgkJCWZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCisJQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KKwlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7CisJVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisKKwkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKKwkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCisJLy8gQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygpLCBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCisJLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbi4gZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECisJVUxPTkcgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOworCisJLy8gVE9ETzogU2hhbGwgd2UgbW92ZSB0aGF0IHRvIERPVDExX05fU1VQUE9SVD8/PworCUhUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSFQgRVdDIE1JTU8tTiB1c2VkIHBhcmFtZXRlcnMKKwlVU0hPUlQJCVJYQkFiaXRtYXA7CS8vIGZpbGwgdG8gb24tY2hpcCAgUlhXSV9CQV9CSVRNQVNLIGluIDguMS4zUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdAorCVVTSE9SVAkJVFhCQWJpdG1hcDsJLy8gVGhpcyBiaXRtYXAgYXMgb3JpZ2luYXRvciwgb25seSBrZWVwIGluIHNvZnR3YXJlIHVzZWQgdG8gbWFyayBBTVBEVSBiaXQgaW4gVFhXSQorCVVTSE9SVAkJVFhBdXRvQkFiaXRtYXA7CisJVVNIT1JUCQlCQURlY2xpbmVCaXRtYXA7CisJVVNIT1JUCQlCQVJlY1djaWRBcnJheVtOVU1fT0ZfVElEXTsJLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiByZWNpcGllbnQgc2Vzc2lvbi4gaWYgUlhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisJVVNIT1JUCQlCQU9yaVdjaWRBcnJheVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCVVTSE9SVAkJQkFPcmlTZXF1ZW5jZVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCisJLy8gODAyLjExbiBmZWF0dXJlcy4KKwlVQ0hBUgkJTXBkdURlbnNpdHk7CisJVUNIQVIJCU1heFJBbXBkdUZhY3RvcjsKKwlVQ0hBUgkJQU1zZHVTaXplOworCVVDSEFSCQlNbXBzTW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUuCisKKwlIVF9DQVBBQklMSVRZX0lFCQlIVENhcGFiaWxpdHk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJCUJTUzIwNDBDb2V4aXN0ZW5jZU1nbXRTdXBwb3J0OworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCUJPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOworCisJVUNIQVIgICAgICAgUmF0ZUxlbjsKKwlzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSAqcE5leHQ7CisgICAgVVNIT1JUICAgICAgVHhTZXFbTlVNX09GX1RJRF07CisJVVNIT1JUCQlOb25Rb3NEYXRhU2VxOworCisJUlNTSV9TQU1QTEUJUnNzaVNhbXBsZTsKKworCVVJTlQzMgkJCVRYTUNTRXhwZWN0ZWRbMTZdOworCVVJTlQzMgkJCVRYTUNTU3VjY2Vzc2Z1bFsxNl07CisJVUlOVDMyCQkJVFhNQ1NGYWlsZWRbMTZdOworCVVJTlQzMgkJCVRYTUNTQXV0b0ZhbGxCYWNrWzE2XVsxNl07Cit9IE1BQ19UQUJMRV9FTlRSWSwgKlBNQUNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEUgeworCVVTSE9SVAkJCVNpemU7CisJTUFDX1RBQkxFX0VOVFJZICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJTUFDX1RBQkxFX0VOVFJZIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVFVRVVFX0hFQURFUiAgICBNY2FzdFBzUXVldWU7CisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25JblBzbTsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25CYWRBdGhlcm9zOwkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBhdGhlcm9zIDgwMi4xMW4gQ2hpcC4gIFdlIG5lZWQgdG8gdXNlIFJUUy9DVFMgd2l0aCBBdGhlcm9zIDgwMiwuMTFuIGNoaXAuCisJQk9PTEVBTgkJCWZBbnlUeE9QRm9yY2VEaXNhYmxlOwkvLyBDaGVjayBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBCRSBUeE9QCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8vIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbk5vbkdGOwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb24yME9ubHk7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4JCQlmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7IC8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYworCUJPT0xFQU4gICAgICAgICBmQW55QkFTZXNzaW9uOyAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30gTUFDX1RBQkxFLCAqUE1BQ19UQUJMRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9XRFNfRU5UUlkgeworCUJPT0xFQU4gICAgICAgICBWYWxpZDsKKwlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7CisJc3RydWN0IF9XRFNfRU5UUlkgKnBOZXh0OworfSBXRFNfRU5UUlksICpQV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCAgX1dEU19UQUJMRV9FTlRSWSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlVQ0hBUiAgICAgICAgICAgV2RzQWRkcltNQUNfQUREUl9MRU5dOworCVdEU19FTlRSWSAgICAgICAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCVdEU19FTlRSWSAgICAgICBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCit9IFdEU19UQUJMRV9FTlRSWSwgKlBXRFNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTX0VOVFJZIHsKKwlQTkVUX0RFVgkJCWRldjsKKwlVQ0hBUgkJCQlWYWxpZDsKKwlVQ0hBUgkJCQlQaHlNb2RlOworCVVDSEFSCQkJCVBlZXJXZHNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgV2VwU3RhdHVzOworCVVDSEFSCQkJCQlLZXlJZHg7CisJQ0lQSEVSX0tFWSAgICAgICAgICAJV2RzS2V5OworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCit9IFJUXzgwMl8xMV9XRFNfRU5UUlksICpQUlRfODAyXzExX1dEU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19UQUJMRSB7CisJVUNIQVIgICAgICAgICAgICAgICBNb2RlOworCVVMT05HICAgICAgICAgICAgICAgU2l6ZTsKKwlSVF84MDJfMTFfV0RTX0VOVFJZCVdkc0VudHJ5W01BWF9XRFNfRU5UUlldOworfSBXRFNfVEFCTEUsICpQV0RTX1RBQkxFOworCit0eXBlZGVmIHN0cnVjdCBfQVBDTElfU1RSVUNUIHsKKwlQTkVUX0RFVgkJCQlkZXY7CisjaWZkZWYgUlRMODY1WF9TT0MKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBteWxpbmtpZDsKKyNlbmRpZgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIEVuYWJsZTsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSB3YXMgY29uZmlndXJlZCB0byAiMSIgIG9yIGJ5IGl3cHJpdiBjbWQgIkFwQ2xpRW5hYmxlIgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIFZhbGlkOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIGFzc29jaWF0ZWQgc3VjY2VzcyB0byByZW1vdGUgQVAuCisJVUNIQVIJCQkJCU1hY1RhYldDSUQ7CS8vV0NJRCB2YWx1ZSwgd2hpY2ggcG9pbnQgdG8gdGhlIGVudHJ5IG9mIEFTSUMgTWFjIHRhYmxlLgorCVVDSEFSICAgICAgICAgICAgICAgICAgIFNzaWRMZW47CisJQ0hBUiAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBDZmdTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnQXBDbGlCc3NpZFtFVEhfTEVOR1RIX09GX0FERFJFU1NdOworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBcENsaVJjdkJlYWNvblRpbWU7CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDdHJsQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5bmNDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXV0aEN1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBc3NvY0N1cnJTdGF0ZTsKKwlVTE9ORwkJCQkJV3BhUHNrQ3VyclN0YXRlOworCisJVVNIT1JUICAgICAgICAgICAgICAgICAgQXV0aFJlcUNudDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBc3NvY1JlcUNudDsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOworCVVDSEFSICAgICAgICAgICAgICAgICAgIE1wZHVEZW5zaXR5OworCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlVQ0hBUgkJUFNLWzEwMF07CQkJCS8vIHJlc2VydmUgUFNLIGtleSBtYXRlcmlhbAorCVVDSEFSICAgICAgIFBTS0xlbjsKKwlVQ0hBUiAgICAgICBQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKworCUNJUEhFUl9LRVkgICAgICBTaGFyZWRLZXlbU0hBUkVfS0VZX05VTV07CisJVUNIQVIgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKworCS8vIHN0b3JlIFJTTl9JRSBidWlsdCBieSBkcml2ZXIKKwlVQ0hBUgkJUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOyAgLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgY29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwlVQ0hBUgkJUlNOSUVfTGVuOworCisJLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKKwlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkJsb2NrQXNzb2M7IC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKworCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKKwlVQ0hBUiAgICAgICAJU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKKwlVQ0hBUgkJCUdOb25jZVszMl07CQkJLy8gR05vbmNlIGZvciBXUEEtUFNLIGZyb20gYXV0aGVudGljYXRvcgorCisjaWZkZWYgV1NDX0FQX1NVUFBPUlQKKwlXU0NfQ1RSTAkgICAgICAgICAgIFdzY0NvbnRyb2w7CisjZW5kaWYgLy8gV1NDX0FQX1NVUFBPUlQgLy8KKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCit9IEFQQ0xJX1NUUlVDVCwgKlBBUENMSV9TVFJVQ1Q7CisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKK3R5cGVkZWYgc3RydWN0IF9CTE9DS19RVUVVRV9FTlRSWQoreworCUJPT0xFQU4gU3dUeFF1ZXVlQmxvY2tGbGFnOworCUxJU1RfSEVBREVSIE5ldElmTGlzdDsKK30gQkxPQ0tfUVVFVUVfRU5UUlksICpQQkxPQ0tfUVVFVUVfRU5UUlk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKK3N0cnVjdCB3aWZpY29uZgoreworCUJPT0xFQU4JYlNob3J0R0k7CisJQk9PTEVBTiBiR3JlZW5GaWVsZDsKK307CisKKworCisKK3R5cGVkZWYgc3RydWN0IF9JTkZfUENJX0NPTkZJRworeworCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCit9SU5GX1BDSV9DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IF9JTkZfVVNCX0NPTkZJRworeworCVVJTlQgICAgICAgICAgICAgICAgQnVsa0luRXBBZGRyOwkJLy8gYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzCisJVUlOVCAgICAgICAgICAgICAgICBCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCisKK31JTkZfVVNCX0NPTkZJRzsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwl0eXBlZGVmIHZvaWQgKCpJa2Fub3NXbGFuVHhDYkZ1bmNQKSh2b2lkICosIHZvaWQgKik7CisKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8KKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJCUlrYW5vc1dsYW5UeENiRnVuY1AgKmZwOworCX07CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisjaWZkZWYgTklOVEVORE9fQVAKK3R5cGVkZWYgc3RydWN0IF9OSU5ET19DVFJMX0JMT0NLIHsKKworCVJUX05JTlRFTkRPX1RBQkxFCURTX1RBQkxFOworCisjaWZkZWYgQ0hJUDI1WFgKKwlzcGlubG9ja190CQkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbHNlCisJTkRJU19TUElOX0xPQ0sJCU5JTlRFTkRPX1RBQkxFX0xvY2s7CisjZW5kaWYgLy8gQ0hJUDI1WFggLy8KKworCVVDSEFSCQkJCU5JTlRFTkRPX1VQX0JVRkZFUls1MTJdOworCVVDSEFSCQkJCUxvY2FsX0tleUlkeDsKKwlDSVBIRVJfS0VZCQkJTG9jYWxfU2hhcmVkS2V5OworCVVDSEFSCQkJCUxvY2FsX2JIaWRlU3NpZDsKKwlVQ0hBUgkJCQlMb2NhbF9BdXRoTW9kZTsKKwlVQ0hBUgkJCQlMb2NhbF9XZXBTdGF0dXM7CisJVVNIT1JUCQkJCUxvY2FsX0NhcGFiaWxpdHlJbmZvOworfSBOSU5ET19DVFJMX0JMT0NLOworI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCisKKworI2lmZGVmIERCR19ESUFHTk9TRQorI2RlZmluZSBESUFHTk9TRV9USU1FCTEwICAgLy8gMTAgc2VjCit0eXBlZGVmIHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfCit7CS8vIERpYWdub3NpcyBSZWxhdGVkIGVsZW1lbnQKKwl1bnNpZ25lZCBjaGFyCQlpbml0ZWQ7CisJdW5zaWduZWQgY2hhciAJcUlkeDsKKwl1bnNpZ25lZCBjaGFyIAlBcnJheVN0YXJ0SWR4OworCXVuc2lnbmVkIGNoYXIJCUFycmF5Q3VySWR4OworCS8vIFR4IFJlbGF0ZWQgQ291bnQKKwlVU0hPUlQJCQlUeERhdGFDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhGYWlsQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4RGVzY0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMwkvLyBUeERlc2MgcXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDB+MTQsID49MTUKKwlVU0hPUlQJCQlUeE1jc0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMworCVVTSE9SVAkJCVR4U1dRdWVDbnRbRElBR05PU0VfVElNRV1bOV07CQkvLyBUeFN3UXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsID49OAorCisJVVNIT1JUCQkJVHhBZ2dDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhOb25BZ2dDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhBTVBEVUNudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMyAvLyAxMCBzZWMsIFR4RE1BIEFQTURVIEFnZ3JlZ2F0aW9uIGNvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgaW4gc2V0cCBvZiAxLgorCVVTSE9SVAkJCVR4UmFsaW5rQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4UmFsaW5rIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgorCVVTSE9SVAkJCVR4QU1TRFVDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhBTVNVRCBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KKworCS8vIFJ4IFJlbGF0ZWQgQ291bnQKKwlVU0hPUlQJCQlSeERhdGFDbnRbRElBR05PU0VfVElNRV07CQkJLy8gUnggVG90YWwgRGF0YSBjb3VudC4KKwlVU0hPUlQJCQlSeENyY0VyckNudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlSeE1jc0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMworfVJ0bXBEaWFnU3RydWN0OworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKKy8vCisvLyAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgoreworCVBWT0lECQkJCQlPU19Db29raWU7CS8vIHNhdmUgc3BlY2lmaWMgc3RydWN0dXJlIHJlbGF0aXZlIHRvIE9TCisJUE5FVF9ERVYJCQkJbmV0X2RldjsKKwlVTE9ORwkJCQkJVmlydHVhbElmQ250OworCisjaWZkZWYgUlQyODYwCisgICAgVVNIT1JUCQkgICAgICAgICAgICBMbmtDdHJsQml0TWFzazsKKyAgICBVU0hPUlQJCSAgICAgICAgICAgIFJMbmtDdHJsQ29uZmlndXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBSTG5rQ3RybE9mZnNldDsKKyAgICBVU0hPUlQJCSAgICAgICAgICAgIEhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBIb3N0TG5rQ3RybE9mZnNldDsKKwlVU0hPUlQJCSAgICAgICAgICAgIFBDSWVQb3dlclNhdmVMZXZlbDsKKyAgIAlCT09MRUFOCQkJCQliUENJY2xrT2ZmOwkJCQkJCS8vIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uCisJQk9PTEVBTgkJCQkJYlBDSWNsa09mZkRpc2FibGVUeDsJCQkvLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgUENJIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQorCisJVUlOVAkJCQkJaW50X2VuYWJsZV9yZWc7CisJVUlOVAkJCQkJaW50X2Rpc2FibGVfbWFzazsKKwlVSU5UCQkJCQlpbnRfcGVuZGluZzsKKworCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhCdWZTcGFjZVtOVU1fT0ZfVFhfUklOR107IC8vIFNoYXJlZCBtZW1vcnkgb2YgYWxsIDFzdCBwcmUtYWxsb2NhdGVkIFR4QnVmIGFzc29jaWF0ZWQgd2l0aCBlYWNoIFRYRAorCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFJ4RGVzY1Jpbmc7ICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgbWVtb3J5IGZvciBSWCBkZXNjcmlwdG9ycworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFR4RGVzY1JpbmdbTlVNX09GX1RYX1JJTkddOyAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgVHggZGVzY3JpcHRvcnMKKwlSVE1QX1RYX1JJTkcgICAgICAgICAgICBUeFJpbmdbTlVNX09GX1RYX1JJTkddOyAgICAgCS8vIEFDMH40ICsgSENDQQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBpcnFfbG9jazsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBpcnFfZGlzYWJsZWQ7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogICAgICBCb3RoIFBDSS9VU0IgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgVHggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCUJPT0xFQU4gICAgICAgICAgICAgICAgIERlUXVldWVSdW5uaW5nW05VTV9PRl9UWF9SSU5HXTsgIC8vIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIERlUXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsKKworCisJLy8gcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzCisJUVVFVUVfSEVBREVSICAgICAgICAgICAgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsgIC8vIDQgQUMgKyAxIEhDQ0EKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLy8gVHhTd1F1ZXVlIHNwaW5sb2NrCisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBNZ210RGVzY1Jpbmc7ICAgICAgICAgICAgICAgCS8vIFNoYXJlZCBtZW1vcnkgZm9yIE1HTVQgZGVzY3JpcHRvcnMKKwlSVE1QX01HTVRfUklORyAgICAgICAgICBNZ210UmluZzsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBNZ210UmluZ0xvY2s7ICAgICAgICAgICAgICAgCS8vIFByaW8gUmluZyBzcGlubG9jaworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgUnggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgUlQyODYwCisJUlRNUF9SWF9SSU5HICAgICAgICAgICAgUnhSaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIEFTSUMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJVUlOVDMyICAgICAgICAgICAgICAgCU1BQ1ZlcnNpb247ICAgICAgCS8vIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBFMlBST00KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBFZXByb21WZXJzaW9uOyAgICAgICAgICAvLyBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBFRVBST01BZGRyZXNzTnVtOyAgICAgICAvLyA5M2M0Nj02ICA5M2M2Nj04CisJVVNIT1JUICAgICAgICAgICAgICAgICAgRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBGaXJtd2FyZVZlcnNpb247ICAgICAgICAvLyBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEJCUCBDb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsxNDBdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECisJVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwUnNzaVRvRGJtRGVsdGE7CisJQkJQX1I2Nl9UVU5JTkcgICAgICAgICAgQmJwVHVuaW5nOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFJGSUMgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBSZkljVHlwZTsgICAgICAgLy8gUkZJQ194eHgKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBSZkZyZXFPZmZzZXQ7ICAgLy8gRnJlcXVlbmN5IG9mZnNldCBmb3IgY2hhbm5lbCBzd2l0Y2hpbmcKKwlSVE1QX1JGX1JFR1MgICAgICAgICAgICBMYXRjaFJmUmVnczsgICAgLy8gbGF0Y2ggdGggbGF0ZXN0IFJGIHByb2dyYW1taW5nIHZhbHVlIHNpbmNlIFJGIElDIGRvZXNuJ3Qgc3VwcG9ydCBSRUFECisKKwlFRVBST01fQU5URU5OQV9TVFJVQyAgICBBbnRlbm5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBBTnRlbm5hIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGZvciBhICYgZy4gV2UgbmVlZCB0byBzYXZlIGl0IGZvciBmdXR1cmUgcmVmZXJlbmNlLgorCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCisJLy8gVGhpcyBzb2Z0IFJ4IEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgd2hlbiB1c2VyIHNldAorCS8vIFJYIEFudGVubmEgPSBESVZFUlNJVFkgT04KKwlTT0ZUX1JYX0FOVF9ESVZFUlNJVFkgICBSeEFudDsKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIFJGUHJvZ1NlcTsKKwlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBUeFBvd2VyW01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgICAgICAvLyBTdG9yZSBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzLgorCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBUeFBvd2VyMTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgICAgICAvLyA4MDIuMTFqIGNoYW5uZWwgYW5kIGJ3CisJQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgQ2hhbm5lbExpc3QxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3ROdW07ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQorCVVDSEFSCQkJCQlCYnA5NDsKKwlCT09MRUFOCQkJCQlCYnBGb3JDQ0s7CisJVUxPTkcJCVR4MjBNUHdyQ2ZnQUJhbmRbNV07CisJVUxPTkcJCVR4MjBNUHdyQ2ZnR0JhbmRbNV07CisJVUxPTkcJCVR4NDBNUHdyQ2ZnQUJhbmRbNV07CisJVUxPTkcJCVR4NDBNUHdyQ2ZnR0JhbmRbNV07CisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjQTsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZBOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwQTsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlQTsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJQk9PTEVBTiAgICAgYkF1dG9UeEFnY0c7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAorCVVDSEFSCSAgICBUc3NpUmVmRzsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgorCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFR4QWdjU3RlcEc7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQorCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUc7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKworCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQkdSc3NpT2Zmc2V0MSB+IEJHUnNzaU9mZnNldDMKKwlDSEFSCQlCR1Jzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmgKKwlDSEFSCQlCR1Jzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUJHUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQVJzc2lPZmZzZXQxIH4gQVJzc2lPZmZzZXQzCisJQ0hBUgkJQVJzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBBIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NEFoCisJQ0hBUgkJQVJzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBBIFJTU0kjMSBPZmZzZXQgdmFsdWUKKwlDSEFSCQlBUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEEgUlNTSSMyIE9mZnNldCB2YWx1ZQorCS8vLS0tCisKKwlDSEFSCQlCTE5BR2FpbjsJCQkJCS8vIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGgKKwlDSEFSCQlBTE5BR2FpbjA7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0CisJQ0hBUgkJQUxOQUdhaW4xOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4CisJQ0hBUgkJQUxOQUdhaW4yOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gTEVEIGNvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUNVX0xFRENTX1NUUlVDCQlMZWRDbnRsOworCVVTSE9SVAkJCQlMZWQxOwkvLyByZWFkIGZyb20gRUVQUk9NIDB4M2MKKwlVU0hPUlQJCQkJTGVkMjsJLy8gRUVQUk9NIDB4M2UKKwlVU0hPUlQJCQkJTGVkMzsJLy8gRUVQUk9NIDB4NDAKKwlVQ0hBUgkJCQlMZWRJbmRpY2F0b3JTdHJlZ3RoOworCVVDSEFSCQkJCVJzc2lTaW5nYWxzdHJlbmd0aE9mZmV0OworICAgIEJPT0xFQU4JCQkJYkxlZE9uU2Nhbm5pbmc7CisJVUNIQVIJCQkJTGVkU3RhdHVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIDgwMi4xMSByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWEQKKwlUWFdJX1NUUlVDICAgICAgICAgICAgICAJQmVhY29uVHhXSTsKKwlQVUNIQVIJCQkJCQlCZWFjb25CdWY7CisJVVNIT1JUCQkJCQkJQmVhY29uT2Zmc2V0W0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCisJLy8gcHJlLWJ1aWxkIFBTLVBPTEwgYW5kIE5VTEwgZnJhbWUgdXBvbiBsaW5rIHVwLiBmb3IgZWZmaWNpZW5jeSBwdXJwb3NlLgorCVBTUE9MTF9GUkFNRSAgICAgICAgICAgIAlQc1BvbGxGcmFtZTsKKwlIRUFERVJfODAyXzExICAgICAgICAgICAJTnVsbEZyYW1lOworCisvLz09PT09PT09PUFQPT09PT09PT09PT0KKworCisvLz09PT09PT1TVEE9PT09PT09PT09PQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gJiBvcGVyYXRpb24gc3RhdHVzCisJLy8gdXNlZCBvbmx5IHdoZW4gcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU1RBX0FETUlOX0NPTkZJRyAgICAgICAgU3RhQ2ZnOyAgICAgICAgICAgLy8gdXNlciBkZXNpcmVkIHNldHRpbmdzCisJU1RBX0FDVElWRV9DT05GSUcgICAgICAgU3RhQWN0aXZlOyAgICAgICAgIC8vIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkKKwlDSEFSICAgICAgICAgICAgICAgICAgICBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsgLy8gbmlja25hbWUsIG9ubHkgdXNlZCBpbiB0aGUgaXdjb25maWcgaS9mCisJTkRJU19NRURJQV9TVEFURSAgICAgICAgUHJlTWVkaWFTdGF0ZTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy89PT09PT09Q29tbW9uPT09PT09PT09PT0KKwkvLyBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBCisJVUNIQVIgICAgICAgICAgICAgICAgICAgT3BNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vIE9QTU9ERV9TVEEsIE9QTU9ERV9BUAorCisJTkRJU19NRURJQV9TVEFURSAgICAgICAgSW5kaWNhdGVNZWRpYVN0YXRlOwkJCS8vIEJhc2Ugb24gSW5kaWNhdGlvbiBzdGF0ZSwgZGVmYXVsdCBpcyBOZGlzTWVkaWFTdGF0ZURpc0Nvbm5lY3RlZAorCisJLy8gTUFUIHJlbGF0ZWQgcGFyYW1ldGVycworCisJLy8gY29uZmlndXJhdGlvbjogcmVhZCBmcm9tIFJlZ2lzdHJ5ICYgRTJQUk9NCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkxvY2FsQWRtaW5NQUM7ICAgICAgICAgICAgIC8vIFVzZSB1c2VyIGNoYW5nZWQgTUFDCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUGVybWFuZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAvLyBGYWN0b3J5IGRlZmF1bHQgTUFDIGFkZHJlc3MKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAgIC8vIFVzZXIgY2hhbmdlZCBNQUMgYWRkcmVzcworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY29tbW9uIGNvbmZpZ3VyYXRpb24gdG8gYm90aCBPUE1PREVfU1RBIGFuZCBPUE1PREVfQVAKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlDT01NT05fQ09ORklHICAgICAgICAgICBDb21tb25DZmc7CisJTUxNRV9TVFJVQ1QgICAgICAgICAgICAgTWxtZTsKKworCS8vIEFQIG5lZWRzIHRob3NlIHZhaWFibGVzIGZvciBzaXRlIHN1cnZleSBmZWF0dXJlLgorCU1MTUVfQVVYICAgICAgICAgICAgICAgIE1sbWVBdXg7ICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgc2V0dGluZ3MgdXNlZCBkdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lCisJQlNTX1RBQkxFICAgICAgICAgICAgICAgU2NhblRhYjsgICAgICAgICAgIC8vIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQKKworCS8vQWJvdXQgTWFjVGFiLCB0aGUgc3RhIGRyaXZlciB3aWxsIHVzZSAjMCBhbmQgIzEgZm9yIG11bHRpY2FzdCBhbmQgQVAuCisJTUFDX1RBQkxFICAgICAgICAgICAgICAgICBNYWNUYWI7ICAgICAvLyBBU0lDIG9uLWNoaXAgV0NJRCBlbnRyeSB0YWJsZS4gIEF0IFRYLCBBU0lDIGFsd2F5cyB1c2Uga2V5IGFjY29yZGluZyB0byB0aGlzIG9uLWNoaXAgdGFibGUuCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWFjVGFiTG9jazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBX1RBQkxFCQkJQkFUYWJsZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBCQVRhYkxvY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCisJLy8gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEtFWSB0YWJsZXMKKwlDSVBIRVJfS0VZICAgICAgICAgICAgICBTaGFyZWRLZXlbTUFYX01CU1NJRF9OVU1dWzRdOyAvLyBTVEEgYWx3YXlzIHVzZSBTaGFyZWRLZXlbQlNTMF1bMC4uM10KKworCQkvLyBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24KKwlGUkFHTUVOVF9GUkFNRSAgICAgICAgICBGcmFnRnJhbWU7ICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUKKworCS8vIHZhcmlvdXMgQ291bnRlcnMKKwlDT1VOVEVSXzgwMl8zICAgICAgICAgICBDb3VudGVyczgwMjM7ICAgICAgICAgICAgICAgLy8gODAyLjMgY291bnRlcnMKKwlDT1VOVEVSXzgwMl8xMSAgICAgICAgICBXbGFuQ291bnRlcnM7ICAgICAgICAgICAgICAgLy8gODAyLjExIE1JQiBjb3VudGVycworCUNPVU5URVJfUkFMSU5LICAgICAgICAgIFJhbGlua0NvdW50ZXJzOyAgICAgICAgICAgICAvLyBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzCisJQ09VTlRFUl9EUlMgICAgICAgICAgICAgRHJzQ291bnRlcnM7ICAgICAgICAgICAgICAgIC8vIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nCisJUFJJVkFURV9TVFJVQyAgICAgICAgICAgUHJpdmF0ZUluZm87ICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycworCisJLy8gZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncworCVVMT05HICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzCisKKwkvLyBjdXJyZW50IFRYIHNlcXVlbmNlICMKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBTZXF1ZW5jZTsKKworI2lmZGVmIFVOREVSX0NFCisJTkRJU19IQU5ETEUgICAgICAgICAgICAgaEdpSVNSOworI2VuZGlmCisKKworCS8vIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbgorCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQorCVVMT05HICAgICAgICAgICAgICAgICAgIExpbmtEb3duVGltZTsKKwkvLy0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RSeFJhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFR4UmF0ZTsKKwkvLysrK1VzZWQgb25seSBmb3IgU3RhdGlvbgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJDb25maWdDaGFuZ2VkOyAgICAgICAgIC8vIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nCisJLy8tLS0KKworCVVMT05HICAgICAgICAgICAgICAgICAgIEV4dHJhSW5mbzsgICAgICAgICAgICAgIC8vIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5c3RlbUVycm9yQml0bWFwOyAgICAgIC8vIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvcgorCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTWFjSWNWZXJzaW9uOyAgICAgICAgICAgLy8gTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRAorCS8vLS0tCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTeXN0ZW0gZXZlbnQgbG9nCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUlRfODAyXzExX0VWRU5UX1RBQkxFICAgRXZlbnRUYWI7CisKKworCUJPT0xFQU4JCUhUQ0VuYWJsZTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIFN0YXRpc3RpYyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJQk9PTEVBTgkJCQkJCWJVcGRhdGVCY25DbnREb25lOworCVVMT05HCQkJCQkJd2F0Y2hEb2dNYWNEZWFkbG9jazsJLy8gcHJldmVudCBNQUMvQkJQIGludG8gZGVhZGxvY2sgY29uZGl0aW9uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIERFQlVHIHBhcmFtZXJ0cworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlCT09MRUFOCQliQmFuQWxsQmFTZXR1cDsKKwlCT09MRUFOCQliUHJvbWlzY3VvdXM7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gcnQyODYwYyBlbXVsYXRpb24tdXNlIFBhcmFtZXRlcnMKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUxPTkcJCXJ0c2FjY3VbMzBdOworCVVMT05HCQljdHNhY2N1WzMwXTsKKwlVTE9ORwkJY2ZlbmRhY2N1WzMwXTsKKwlVTE9ORwkJYmFjb250ZW50WzE2XTsKKwlVTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOworCVVDSEFSCQlyY3ZiYVs2MF07CisJQk9PTEVBTgkJYkxpbmtBZGFwdDsKKwlCT09MRUFOCQliRm9yY2VQcmludFRYOworCUJPT0xFQU4JCWJGb3JjZVByaW50Ulg7CisJQk9PTEVBTgkJYkRpc2FibGVzY2FubmluZzsJCS8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCCisJQk9PTEVBTgkJYlN0YUZpZm9UZXN0OworCUJPT0xFQU4JCWJQcm90ZWN0aW9uVGVzdDsKKwlCT09MRUFOCQliSENDQVRlc3Q7CisJQk9PTEVBTgkJYkdlbk9uZUhDQ0E7CisJQk9PTEVBTgkJYkJyb2FkQ29tSFQ7CisJLy8rKytGb2xsb3dpbmcgYWRkIGZyb20gUlQyODcwIFVTQi4KKwlVTE9ORwkJQnVsa091dFJlcTsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVPdGhlcjsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlQ2FuY2VsOwkvLyBzZWVtcyBub3QgdXNlIG5vdz8KKwlVTE9ORwkJQnVsa0luUmVxOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZTsKKwlVTE9ORwkJQnVsa0luQ29tcGxldGVGYWlsOworCS8vLS0tCisKKyAgICBzdHJ1Y3Qgd2lmaWNvbmYJCQlXSUZJdGVzdGJlZDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlBVEVfSU5GTwkJCQlhdGU7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sIG1wZHVfYmxrX3Bvb2w7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJT25lU2Vjb25kbm9uQkVwYWNrZXRzOwkJLy8gcmVjb3JkIG5vbiBCRSBwYWNrZXRzIHBlciBzZWNvbmQKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgIGl3X3N0YXRzOworI2VuZGlmCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKworI2lmZGVmIEJMT0NLX05FVF9JRgorCUJMT0NLX1FVRVVFX0VOVFJZCQlibG9ja1F1ZXVlVGFiW05VTV9PRl9UWF9SSU5HXTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwlJTlQzMgkJCQkJTUNfUm93SUQ7CisJVUNIQVIJCQkJCU1DX0ZpbGVOYW1lWzI1Nl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJVGJ0dFRpY2tDb3VudDsKKyNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKKwlCT09MRUFOCQkJCQlIYXZlTXNpOworI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisKKwlVQ0hBUgkJCQkJaXNfb247CisKKyNkZWZpbmUgVElNRV9CQVNFCQkJKDEwMDAwMDAvT1NfSFopCisjZGVmaW5lIFRJTUVfT05FX1NFQ09ORAkJKDEwMDAwMDAvVElNRV9CQVNFKQorCVVDSEFSCQkJCQlmbGdfYmVfYWRqdXN0OworCVVMT05HCQkJCQliZV9hZGp1c3RfbGFzdF90aW1lOworCisjaWZkZWYgTklOVEVORE9fQVAKKwlOSU5ET19DVFJMX0JMT0NLCQluaW5kb19jdHJsX2Jsb2NrOworI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCisKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zVHhJbmZvOworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NSeEluZm9bTUFYX01CU1NJRF9OVU0gKyBNQVhfV0RTX0VOVFJZICsgTUFYX0FQQ0xJX05VTSArIE1BWF9NRVNIX05VTV07CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwlSdG1wRGlhZ1N0cnVjdAlEaWFnU3RydWN0OworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKKwlVSU5UOAkJCQkJUE1fRmxnU3VzcGVuZDsKK30gUlRNUF9BREFQVEVSLCAqUFJUTVBfQURBUFRFUjsKKworLy8KKy8vIENpc2NvIElBUFAgZm9ybWF0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9DSVNDT19JQVBQX0NPTlRFTlRfCit7CisJVVNIT1JUICAgICBMZW5ndGg7ICAgICAgICAvL0lBUFAgTGVuZ3RoCisJVUNIQVIgICAgICBNZXNzYWdlVHlwZTsgICAgICAvL0lBUFAgdHlwZQorCVVDSEFSICAgICAgRnVuY3Rpb25Db2RlOyAgICAgLy9JQVBQIGZ1bmN0aW9uIHR5cGUKKwlVQ0hBUiAgICAgIERlc3RpbmFpb25NQUNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgIFNvdXJjZU1BQ1tNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgVGFnOyAgICAgICAgICAgLy9UYWcoZWxlbWVudCBJRSkgLSBBZGphY2VudCBBUCByZXBvcnQKKwlVU0hPUlQgICAgIFRhZ0xlbmd0aDsgICAgIC8vTGVuZ3RoIG9mIGVsZW1lbnQgbm90IGluY2x1ZGluZyA0IGJ5dGUgaGVhZGVyCisJVUNIQVIgICAgICBPVUlbNF07ICAgICAgICAgICAvLzB4MDAsIDB4NDAsIDB4OTYsIDB4MDAKKwlVQ0hBUiAgICAgIFByZXZpb3VzQVBbTUFDX0FERFJfTEVOXTsgICAgICAgLy9NQUMgQWRkcmVzcyBvZiBhY2Nlc3MgcG9pbnQKKwlVU0hPUlQgICAgIENoYW5uZWw7CisJVVNIT1JUICAgICBTc2lkTGVuOworCVVDSEFSICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVTSE9SVCAgICAgU2Vjb25kczsgICAgICAgICAgLy9TZWNvbmRzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBkaXNhc3NvY2lhdGVkLgorfSBDSVNDT19JQVBQX0NPTlRFTlQsICpQQ0lTQ09fSUFQUF9DT05URU5UOworCisjZGVmaW5lIERFTEFZSU5UTUFTSwkJMHgwMDAzZmZmYgorI2RlZmluZSBJTlRNQVNLCQkJCTB4MDAwM2ZmZmIKKyNkZWZpbmUgSW5kTWFzawkJCQkweDAwMDNmZmZjCisjZGVmaW5lIFJ4SU5UCQkJCTB4MDAwMDAwMDUJLy8gRGVsYXllZCBSeCBvciBpbmRpdmkgcngKKyNkZWZpbmUgVHhEYXRhSW50CQkJMHgwMDAwMDBmYQkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAorI2RlZmluZSBUeE1nbXRJbnQJCQkweDAwMDAwMTAyCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4CisjZGVmaW5lIFR4Q29oZXJlbnQJCQkweDAwMDIwMDAwCS8vIHR4IGNvaGVyZW50CisjZGVmaW5lIFJ4Q29oZXJlbnQJCQkweDAwMDEwMDAwCS8vIHJ4IGNvaGVyZW50CisjZGVmaW5lIE1jdUNvbW1hbmQJCQkweDAwMDAwMjAwCS8vIG1jdQorI2RlZmluZSBQcmVUQlRUSW50CQkJMHgwMDAwMTAwMAkvLyBQcmUtVEJUVCBpbnRlcnJ1cHQKKyNkZWZpbmUgVEJUVEludAkJCQkweDAwMDAwODAwCQkvLyBUQlRUIGludGVycnVwdAorI2RlZmluZSBHUFRpbWVPdXRJbnQJCQkweDAwMDA4MDAwCQkvLyBHUHRpbWVvdXQgaW50ZXJydXB0CisjZGVmaW5lIEF1dG9XYWtldXBJbnQJCTB4MDAwMDQwMDAJCS8vIEF1dG9XYWtldXBJbnQgaW50ZXJydXB0CisjZGVmaW5lIEZpZm9TdGFGdWxsSW50CQkJMHgwMDAwMjAwMAkvLyAgZmlmbyBzdGF0aXN0aWNzIGZ1bGwgaW50ZXJydXB0CisKKwordHlwZWRlZiBzdHJ1Y3QgX1JYX0JMS18KK3sKKwlSVDI4WFhfUlhEX1NUUlVDCVJ4RDsKKwlQUlhXSV9TVFJVQwkJCXBSeFdJOworCVBIRUFERVJfODAyXzExCQlwSGVhZGVyOworCVBORElTX1BBQ0tFVAkJcFJ4UGFja2V0OworCVVDSEFSCQkJCSpwRGF0YTsKKwlVU0hPUlQJCQkJRGF0YVNpemU7CisJVVNIT1JUCQkJCUZsYWdzOworCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJLy8gZm9yIGNhbGN1bGF0ZSBUS0lQIE1JQyB1c2luZworfSBSWF9CTEs7CisKKworI2RlZmluZSBSWF9CTEtfU0VUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCQkoX3BSeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCisjZGVmaW5lIFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmIF9mbGFnKQorI2RlZmluZSBSWF9CTEtfQ0xFQVJfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQorCisKKyNkZWZpbmUgZlJYX1dEUwkJCTB4MDAwMQorI2RlZmluZSBmUlhfQU1TRFUgICAgICAgMHgwMDAyCisjZGVmaW5lIGZSWF9BUkFMSU5LICAgICAweDAwMDQKKyNkZWZpbmUgZlJYX0hUQyAgICAgICAgIDB4MDAwOAorI2RlZmluZSBmUlhfUEFEICAgICAgICAgMHgwMDEwCisjZGVmaW5lIGZSWF9BTVBEVSAgICAgICAweDAwMjAKKyNkZWZpbmUgZlJYX1FPUwkJCTB4MDA0MAorI2RlZmluZSBmUlhfSU5GUkEJCTB4MDA4MAorI2RlZmluZSBmUlhfRUFQCQkJMHgwMTAwCisjZGVmaW5lIGZSWF9NRVNICQkweDAyMDAKKyNkZWZpbmUgZlJYX0FQQ0xJCQkweDA0MDAKKyNkZWZpbmUgZlJYX0RMUwkJCTB4MDgwMAorI2RlZmluZSBmUlhfV1BJCQkJMHgxMDAwCisKKyNkZWZpbmUgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRAkxNAorI2RlZmluZSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQJMTQKKyNkZWZpbmUgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxECSAyCisKKyNkZWZpbmUgVFhfVU5LT1dOX0ZSQU1FCQkJMHgwMAorI2RlZmluZSBUWF9NQ0FTVF9GUkFNRQkJCTB4MDEKKyNkZWZpbmUgVFhfTEVHQUNZX0ZSQU1FCQkJMHgwMgorI2RlZmluZSBUWF9BTVBEVV9GUkFNRQkJCTB4MDQKKyNkZWZpbmUgVFhfQU1TRFVfRlJBTUUJCQkweDA4CisjZGVmaW5lIFRYX1JBTElOS19GUkFNRQkJCTB4MTAKKyNkZWZpbmUgVFhfRlJBR19GUkFNRQkJCTB4MjAKKworCisvLwlDdXJyZW50bHkgdGhlIHNpemVvZihUWF9CTEspIGlzIDE0OCBieXRlcy4KK3R5cGVkZWYgc3RydWN0IF9UWF9CTEtfCit7CisJVUNIQVIJCQkJUXVlSWR4OworCVVDSEFSCQkJCVR4RnJhbWVUeXBlOwkJCQkvLyBJbmRpY2F0ZSB0aGUgVHJhbnNtaXNzaW9uIHR5cGUgb2YgdGhlIGFsbCBmcmFtZXMgaW4gb25lIGJhdGNoCisJVUNIQVIJCQkJVG90YWxGcmFtZU51bTsJCQkJLy8gVG90YWwgZnJhbWUgbnVtYmVyIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisJVVNIT1JUCQkJCVRvdGFsRnJhZ051bTsJCQkJLy8gVG90YWwgZnJhbWUgZnJhZ21lbnRzIHJlcXVpcmVkIGluIG9uZSBiYXRjaAorCVVTSE9SVAkJCQlUb3RhbEZyYW1lTGVuOwkJCQkvLyBUb3RhbCBsZW5ndGggb2YgYWxsIGZyYW1lcyB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCisJUVVFVUVfSEVBREVSCQlUeFBhY2tldExpc3Q7CisJTUFDX1RBQkxFX0VOVFJZCQkqcE1hY0VudHJ5OwkJCQkJLy8gTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCisJLy8gRm9sbG93aW5nIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgc3BlY2lmaWMgcGFja2V0LgorCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQVUNIQVIJCQkJcFNyY0J1ZkhlYWRlcjsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEKKwlQVUNIQVIJCQkJcFNyY0J1ZkRhdGE7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzCisJVUlOVAkJCQlTcmNCdWZMZW47CQkJCQkvLyBMZW5ndGggb2YgcGFja2V0IHBheWxvYWQgd2hpY2ggbm90IGluY2x1ZGluZyBMYXllciAyIGhlYWRlcgorCVBVQ0hBUgkJCQlwRXh0cmFMbGNTbmFwRW5jYXA7CQkJLy8gTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZAorCVVDSEFSCQkJCUhlYWRlckJ1Zls4MF07CQkJCS8vIFRlbXBCdWZmZXIgZm9yIFRYX0lORk8gKyBUWF9XSSArIDgwMi4xMSBIZWFkZXIgKyBwYWRkaW5nICsgQU1TRFUgU3ViSGVhZGVyICsgTExDL1NOQVAKKwlVQ0hBUgkJCQlNcGR1SGVhZGVyTGVuOwkJCQkvLyA4MDIuMTEgaGVhZGVyIGxlbmd0aCBOT1QgaW5jbHVkaW5nIHRoZSBwYWRkaW5nCisJVUNIQVIJCQkJSGRyUGFkTGVuOwkJCQkJLy8gcmVjb3JkaW5nIEhlYWRlciBQYWRkaW5nIExlbmd0aDsKKwlVQ0hBUgkJCQlhcGlkeDsJCQkJCQkvLyBUaGUgaW50ZXJmYWNlIGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQlXY2lkOwkJCQkJCS8vIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAorCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJCQkJLy8gcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0CisJVUNIQVIJCQkJRnJhbWVHYXA7CQkJCQkvLyB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZQorCVVDSEFSCQkJCU1wZHVSZXFOdW07CQkJCQkvLyBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIHRoaXMgZnJhbWUKKwlVQ0hBUgkJCQlUeFJhdGU7CQkJCQkJLy8gVE9ETzogT2Jzb2xldGVkPyBTaG91bGQgY2hhbmdlIHRvIE1DUz8KKwlVQ0hBUgkJCQlDaXBoZXJBbGc7CQkJCQkvLyBjaXBoZXIgYWxvZ3JpdGhtCisJUENJUEhFUl9LRVkJCQlwS2V5OworCisKKworCVVTSE9SVAkJCQlGbGFnczsJCQkJCQkvL1NlZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIGRldGFpbC4KKworCS8vWU9VIFNIT1VMRCBOT1QgVE9VQ0ggSVQhIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBoYXJkd2FyZS1kZXBlbmRlZCBsYXllci4KKwlVTE9ORwkJCQlQcml2OwkJCQkJCS8vIEhhcmR3YXJlIHNwZWNpZmljIHZhbHVlIHNhdmVkIGluIGhlcmUuCit9IFRYX0JMSywgKlBUWF9CTEs7CisKKworI2RlZmluZSBmVFhfYlJ0c1JlcXVpcmVkCQkweDAwMDEJLy8gSW5kaWNhdGUgaWYgbmVlZCBzZW5kIFJUUyBmcmFtZSBmb3IgcHJvdGVjdGlvbi4gTm90IHVzZWQgaW4gUlQyODYwL1JUMjg3MC4KKyNkZWZpbmUgZlRYX2JBY2tSZXF1aXJlZCAgICAgICAJMHgwMDAyCS8vIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UKKyNkZWZpbmUgZlRYX2JQaWdneUJhY2sgICAgIAkJMHgwMDA0CS8vIExlZ2FjeSBkZXZpY2UgdXNlIFBpZ2diYWNrIG9yIG5vdAorI2RlZmluZSBmVFhfYkhUUmF0ZSAgICAgICAgIAkweDAwMDgJLy8gYWxsb3cgdG8gdXNlIEhUIHJhdGUKKyNkZWZpbmUgZlRYX2JGb3JjZU5vblFvUyAgICAgICAJMHgwMDEwCS8vIGZvcmNlIHRvIHRyYW5zbWl0IGZyYW1lIHdpdGhvdXQgV01NLVFvUyBpbiBIVCBtb2RlCisjZGVmaW5lIGZUWF9iQWxsb3dGcmFnICAgICAgIAkweDAwMjAJLy8gYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50CisjZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLy8gdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZQorI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLy8gUU9TIERhdGEKKworI2RlZmluZSBmVFhfYkNsZWFyRUFQRnJhbWUJCTB4MDEwMAorCisjZGVmaW5lIFRYX0JMS19BU1NJR05fRkxBRyhfcFR4QmxrLCBfZmxhZywgdmFsdWUpCVwKKwkJZG8gewkJCQkJCQkJCQlcCisJCQlpZiAodmFsdWUpIAkJCQkJCQkJXAorCQkJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykgCQkJXAorCQkJZWxzZSAJCQkJCQkJCQlcCisJCQkJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQkJXAorCQl9d2hpbGUoMCkKKworI2RlZmluZSBUWF9CTEtfU0VUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpCisjZGVmaW5lIFRYX0JMS19URVNUX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCSgoKF9wVHhCbGstPkZsYWdzICYgX2ZsYWcpID09IF9mbGFnKSA/IDEgOiAwKQorI2RlZmluZSBUWF9CTEtfQ0xFQVJfRkxBRyhfcFR4QmxrLCBfZmxhZykJKF9wVHhCbGstPkZsYWdzICY9IH4oX2ZsYWcpKQorCisKKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI2lmZGVmIFJUMjg2MAorLy8KKy8vIEVuYWJsZSAmIERpc2FibGUgTklDIGludGVycnVwdCB2aWEgd3JpdGluZyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgorLy8gU2luY2UgaXQgdXNlIEFEQVBURVIgc3RydWN0dXJlLCBpdCBoYXZlIHRvIGJlIHB1dCBhZnRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKy8vCitfX2lubGluZSAgICBWT0lEICAgIE5JQ0Rpc2FibGVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAweDApOyAgICAgLy8gMDogZGlzYWJsZQorCS8vUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0lOVF9FTkEsIDB4MCk7CSAJLy8gMHg0MTggaXMgZm9yIGZpcm13YXJlIC4gU1cgZG9lc24ndCBoYW5kbGUgaGVyZS4KKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworfQorCitfX2lubGluZSAgICBWT0lEICAgIE5JQ0VuYWJsZUludGVycnVwdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwkvLworCS8vIEZsYWcgImZPUF9TVEFUVVNfRE9aRSIgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbHNlIG1lYW5zIEFTSUMgV2FrZVVwCisJLy8gVG8gcHJldmVudCBTeXN0ZW0gaGFuZywgd2Ugc2hvdWxkIGVuYWxiZSB0aGUgaW50ZXJydXB0IHdoZW4KKwkvLyBBU0lDIGlzIGFscmVhZHkgV2FrZSBVcC4KKwkvLworICAgIC8vIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4KKwkvLyBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCisJLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHBBZC0+aW50X2VuYWJsZV9yZWcgLypERUxBWUlOVE1BU0sqLyk7ICAgICAvLyAxOmVuYWJsZQorCX0KKwkvL2Vsc2UKKwkvLwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX0RPWkUgIVxuIikpOworCisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfSU5UX0VOQSwgMHgwMDAwMDAzMCk7IC8vIDEgOiBlbmFibGUKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3N0YXRpYyBpbmxpbmUgVk9JRAlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoCisJSU4gIFBVQ0hBUgkJCURlc3QsCisgCUlOCVBVQ0hBUgkJCVNyYywKKyAgICBJTiAgQk9PTEVBTgkJCURvRW5jcnlwdCwKKwlJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKQoreworCVVJTlQzMiAqcDEsICpwMjsKKworCXAxID0gKChVSU5UMzIgKilEZXN0KTsKKwlwMiA9ICgoVUlOVDMyICopU3JjKTsKKworCSpwMSA9ICpwMjsKKwkqKHAxKzIpID0gKihwMisyKTsKKwkqKHAxKzMpID0gKihwMiszKTsKKwkqKHAxKzEpID0gKihwMisxKTsgLy8gV29yZCAxOyB0aGlzIG11c3QgYmUgd3JpdHRlbiBiYWNrIGxhc3QKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSBWT0lECVJUTVBXSUVuZGlhbkNoYW5nZSgKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQoreworCWludCBzaXplOworCWludCBpOworCisJc2l6ZSA9ICgoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKSA/IFRYV0lfU0laRSA6IFJYV0lfU0laRSk7CisKKwlpZihEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpCisJeworCQkqKChVSU5UMzIgKikocERhdGEpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEpKSk7CQkvLyBCeXRlIDB+MworCQkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzQpKSk7CS8vIEJ5dGUgNH43CisJfQorCWVsc2UKKwl7CisJCWZvcihpPTA7IGkgPCBzaXplLzQgOyBpKyspCisJCQkqKCgoVUlOVDMyICopcERhdGEpICtpKSA9IFNXQVAzMigqKCgoVUlOVDMyICopcERhdGEpK2kpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCisJCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQoreworCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCisJKigoVUlOVDMyICopKHBEYXRhICsgOCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs4KSkpOwkvLyBCeXRlIDh+MTEKKwkqKChVSU5UMzIgKikocERhdGEgKzEyKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgMTIpKSk7CS8vIEJ5dGUgMTJ+MTUKKwkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhICsgNCkpKTsJCQkJLy8gQnl0ZSA0fjcsIHRoaXMgbXVzdCBiZSBzd2FwcGVkIGxhc3QKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIGFsbCBraW5kcyBvZiA4MDIuMTEgZnJhbWVzIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byB0aGUgODAyLjExIGZyYW1lIHN0cnVjdHVyZQorCQlEaXIgCQkJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCQlGcm9tUnhEb25lSW50CUNhbGxlciBpcyBmcm9tIFJ4RG9uZSBpbnRlcnJ1cHQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgYnVmZmVyIGRhdGEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGlyLAorCUlOCUJPT0xFQU4gCQlGcm9tUnhEb25lSW50KQoreworCVBIRUFERVJfODAyXzExIHBGcmFtZTsKKwlQVUNIQVIJcE1hY0hkcjsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wgZmllbGQKKwlpZihEaXIgPT0gRElSX1JFQUQpCisJeworCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOworCX0KKworCXBGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcERhdGE7CisJcE1hY0hkciA9IChQVUNIQVIpIHBGcmFtZTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIER1cmF0aW9uL0lEIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyKSk7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpKTsKKworCWlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gTGlzdGVuIEludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEFJRCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkJLy8gSWYgZnJvbSBBUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLCBpdCBpcyBzdGlsbCBhIGVuY3J5cHQgZm9ybWF0LgorCQkJCS8vIFRoZSBjb252ZXJ0aW9uIGlzIGRlbGF5ZWQgdG8gUlRNUEhhbmRsZURlY3J5cHRpb25Eb25lSW50ZXJydXB0LgorCQkJCWlmKCFGcm9tUnhEb25lSW50ICYmIHBGcmFtZS0+RkMuV2VwID09IDEpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggQWxnIE5vLiBmaWVsZAorCQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBTZXEgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEJlYWNvbkludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAoc2l6ZW9mKEhFQURFUl84MDJfMTEpICsgVElNRVNUQU1QX0xFTik7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gUmVhc29uIGNvZGUgZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmKCBwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSApCisJeworCX0KKwllbHNlIGlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisJCQkJeworCQkJCQlQRlJBTUVfQkFfUkVRIHBCQVJlcSA9IChQRlJBTUVfQkFfUkVRKXBGcmFtZTsKKwkJCQkJKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkgPSBTV0FQMTYoKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkpOworCQkJCQlwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCA9IFNXQVAxNihwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJCQkvLyBGb3IgQmxvY2sgQWNrIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjMKKwkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkgPSBTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJCQkvL0ZvciBBQ0sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMgorCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKT0JU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJJbnZhbGlkIEZyYW1lIFR5cGUhISFcbiIpKTsKKwl9CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sCisJaWYoRGlyID09IERJUl9XUklURSkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorfQorI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCitzdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKKwlJTiBQVUNIQVIgcElwQWRkciwKKwlJTiBQVUNIQVIgKnBwTWFjQWRkciwKKwlJTiBVSU5UMTYgUHJvdG9UeXBlKQoreworCWlmIChwSXBBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoUHJvdG9UeXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUFY2OgorLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJCSooKnBwTWFjQWRkcikgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVRIX1BfSVA6CisJCWRlZmF1bHQ6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7CisJCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOworCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitCT09MRUFOIFJUTVBDaGVja0ZvckhhbmcoCisJSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQKKwkpOworCitWT0lEICBSVE1QSGFsdCgKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKKy8vCisvLyAgUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2luaXQuYworLy8KK05ESVNfU1RBVFVTIFJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiBQVk9JRAkJCWhhbmRsZSwKKwlPVVQgUFJUTVBfQURBUFRFUiAgICpwcEFkYXB0ZXIKKwkpOworCitORElTX1NUQVRVUyBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBGaW5kQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQKKwkpOworCitWT0lEIFJUTVBGcmVlQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpOworCisKK1ZPSUQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOCVBVQ0hBUgkJCQltYWNfYWRkcik7CisKK1ZPSUQgTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQXNpYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCk7CisKK1ZPSUQgTklDSXNzdWVSZXNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFJpbmdDbGVhblVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUpOworCitWT0lEIFJ4VGVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIERiZ1NlbmRQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVk9JRCBVc2VyQ2ZnSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDUmVzZXRGcm9tRXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTklDQ2hlY2tGb3JIYW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUxPTkcJUlRNUE5vdEFsbFplcm8oCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JVUxPTkcJTGVuZ3RoKTsKKworVk9JRCBSVE1QWmVyb01lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1VMT05HIFJUTVBDb21wYXJlTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgUlRNUE1vdmVNZW1vcnkoCisJT1VUIFBWT0lEICAgcERlc3QsCisJSU4gIFBWT0lEICAgcFNyYywKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIEF0b0goCisJY2hhcgkqc3JjLAorCVVDSEFSCSpkZXN0LAorCWludAkJZGVzdGxlbik7CisKK1VDSEFSIEJ0b0goCisJY2hhciBjaCk7CisKK1ZPSUQgUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUGF0Y2hDYXJkQnVzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIpOworCitWT0lEIFJUTVBQYXRjaFJhbGlua0NhcmRCdXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglVTE9ORwkJCUJ1cyk7CisKK1VMT05HIFJUTVBSZWFkQ0JDb25maWcoCisJSU4JVUxPTkcJQnVzLAorCUlOCVVMT05HCVNsb3QsCisJSU4JVUxPTkcJRnVuYywKKwlJTglVTE9ORwlPZmZzZXQpOworCitWT0lEIFJUTVBXcml0ZUNCQ29uZmlnKAorCUlOCVVMT05HCUJ1cywKKwlJTglVTE9ORwlTbG90LAorCUlOCVVMT05HCUZ1bmMsCisJSU4JVUxPTkcJT2Zmc2V0LAorCUlOCVVMT05HCVZhbHVlKTsKKworVk9JRCBSVE1QSW5pdFRpbWVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgICAgICBwQWQsCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlJTiAgUFZPSUQgICAgICAgICAgICAgICAgICAgcFRpbWVyRnVuYywKKwlJTglQVk9JRAkJCQkJcERhdGEsCisJSU4gIEJPT0xFQU4gICAgICAgICAgICAgICAgIFJlcGVhdCk7CisKK1ZPSUQgUlRNUFNldFRpbWVyKAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJSU4gIFVMT05HICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKKworCitWT0lEIFJUTVBNb2RUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKTsKKworVk9JRCBSVE1QQ2FuY2VsVGltZXIoCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgKnBDYW5jZWxsZWQpOworCitWT0lEIFJUTVBTZXRMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFVDSEFSCQkJU3RhdHVzKTsKKworVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBORElTXzgwMl8xMV9SU1NJIERibSk7CisKK1ZPSUQgUlRNUEVuYWJsZVJ4VHgoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLworLy8gcHJvdG90eXBlIGluIGFjdGlvbi5jCisvLworVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURFTEJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVJbnZhbGlkQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEZWxCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFNlbmRQU01QQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJV2NpZCwKKwlJTiBVQ0hBUgkJCVBzbXApOworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIFNlbmRCU1MyMDQwQ29leGlzdE1nbXRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJV2NpZCwKKwlJTglVQ0hBUglhcGlkeCwKKwlJTglVQ0hBUglJbmZvUmVxKTsKKworVk9JRCBTZW5kTm90aWZ5QldBY3Rpb25GcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgV2NpZCwKKwlJTiBVQ0hBUiBhcGlkeCk7CisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOworCitWT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIENoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7CisKK1VMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgUFVDSEFSICBwRGVzdCk7CisKK1ZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKKworVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCitWT0lEIFBlZXJSTUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTdGFQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1ZPSUQgUGVlckJTU1RyYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVySFRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBQZWVyUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgUGVlckRMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIERsc1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAorCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCisJSU4gVVNIT1JUIHJlYXNvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUkVDQkFUaW1lclRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBPUklCQVRpbWVyVGltZW91dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEFjdEhlYWRlckluaXQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBQVUNIQVIgQWRkcjEsCisgICAgSU4gUFVDSEFSIEFkZHIyLAorICAgIElOIFBVQ0hBUiBBZGRyMyk7CisKK1ZPSUQgQmFySGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwU0EpOworCitWT0lEIEluc2VydEFjdEZpZWxkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENhdGVnb3J5LAorCUlOIFVJTlQ4IEFjdENvZGUpOworCitCT09MRUFOIFFvc0JBRGF0YVBhcnNlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIEJPT0xFQU4gYkFNU0RVLAorCUlOIFBVQ0hBUiBwODAyM0hlYWRlciwKKwlJTiBVQ0hBUglXQ0lELAorCUlOIFVDSEFSCVRJRCwKKwlJTiBVU0hPUlQgU2VxdWVuY2UsCisJSU4gVUNIQVIgRGF0YU9mZnNldCwKKwlJTiBVU0hPUlQgRGF0YXNpemUsCisJSU4gVUlOVCAgIEN1clJ4SW5kZXgpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlJTiBQRlJBTUVfQkFfUkVRIHBNc2cpOworCitWT0lEIEJhQXV0b01hblN3aXRjaCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgSFRJT1RDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgICAgQmF0UmVjSWR4KTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9kYXRhLmMKKy8vCitCT09MRUFOIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVUeERvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApOworCitWT0lEIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK3ZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lECVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwUHJldkFkZHIxLAorCUlOICBQVUNIQVIgICAgICAgICAgcDgwMjNoZHIpOworCitCT09MRUFOIFBlZXJJc0FnZ3JlT24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFVMT05HICAgICAgICAgIFR4UmF0ZSwKKyAgICBJTiAgUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpOworCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOICBQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGVzaXJlZE9mZnNldCwKKwlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMCwKKwlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMSk7CisKK05ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVk9JRCBTVEFTZW5kUGFja2V0cygKKwlJTiAgTkRJU19IQU5ETEUgICAgIE1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4gIFBQTkRJU19QQUNLRVQgICBwcFBhY2tldEFycmF5LAorCUlOICBVSU5UICAgICAgICAgICAgTnVtYmVyT2ZQYWNrZXRzKTsKKworVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgIAlJTglCT09MRUFOCQkJYkludENvbnRleHQsCisJSU4gIFVDSEFSCQkJUXVlSWR4LAorCUlOCVVDSEFSCQkJTWF4X1R4X1BhY2tldHMpOworCitORElTX1NUQVRVUwlSVE1QSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJT1VUCVBVTE9ORwkJCXBGcmVlVFhETGVmdCk7CisKK05ESVNfU1RBVFVTCVNUQUhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBUWF9CTEsJCQkqcFR4QmxrLAorCUlOICBVQ0hBUgkJCVF1ZUlkeCk7CisKK1ZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUsCisJSU4gIFVDSEFSICAgICAgICAgICBOdW1iZXJSZXF1aXJlZCwKKwlJTiAJUFVDSEFSICAgICAgICAgIEZyZWVOdW1iZXJJcyk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVVNIT1JUICBSVE1QQ2FsY0R1cmF0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmF0ZSwKKwlJTiAgVUxPTkcgICAgICAgICAgIFNpemUpOworCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOICBCT09MRUFOICAgIAkJRlJBRywKKwlJTiAgQk9PTEVBTiAgICAJCUNGQUNLLAorCUlOICBCT09MRUFOICAgIAkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4JCQlBTVBEVSwKKwlJTglCT09MRUFOCQkJQWNrLAorCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOICBVQ0hBUiAgICAgIAkJUElELAorCUlOCVVDSEFSCQkJVElELAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsayk7CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOCQkJYldJViwKKwlJTglVQ0hBUgkJCVFTRUwpOworCitWT0lEIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbmd0aCk7CisKK1ZPSUQgUlRNUFNlbmROdWxsRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKKworVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBTZW5kUlRTRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCisJSU4gIFVTSE9SVCAgICAgICAgICBBY2tEdXJhdGlvbiwKKwlJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKKwlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7CisKKworTkRJU19TVEFUVVMgUlRNUEFwcGx5UGFja2V0RmlsdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworUFFVRVVFX0hFQURFUiAgIFJUTVBDaGVja1R4U3dRdWV1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVUNIQVIgICAgICAgICAgICpRdWVJZHgpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBSZXBvcnRNaWNFcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUENJUEhFUl9LRVkgICAgIHBXcGFLZXkpOworCitWT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiAgUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JQk9PTEVBTiAgICBwSW5zQU1TRFVIZHIsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwSW5QYWNrZXQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCk7CisKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICAqcFBhY2tldCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCisJSU4gIFVJTlQgICAgICAgICAgICBIZWFkZXJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4pOworCitWT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitCT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIFF1ZUlkeCk7CisKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitCT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVk9JRCBSVE1QQ2NrQmJwVHVuaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQJCQlUeFJhdGUpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jCisvLworVk9JRCBSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKKworVk9JRCBSVE1QRW5jcnlwdERhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitCT09MRUFOCVJUTVBEZWNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbiwKKwlJTglVSU5UCQkJaWR4KTsKKworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSk7CisKK1ZPSUQgUlRNUFNldElDVigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKKworVk9JRCBBUkNGT1VSX0lOSVQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBVSU5UICAgICAgICAgICAgS2V5TGVuKTsKKworVUNIQVIgICBBUkNGT1VSX0JZVEUoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCAgICAgQ3R4KTsKKworVk9JRCBBUkNGT1VSX0RFQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEIEFSQ0ZPVVJfRU5DUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVUlOVCBSVE1QX0NBTENfRkNTMzIoCisJSU4gIFVJTlQgICBGY3MsCisJSU4gIFBVQ0hBUiAgQ3AsCisJSU4gIElOVCAgICAgTGVuKTsKKworLy8KKy8vIE1MTUUgcm91dGluZXMKKy8vCisKKy8vIEFzaWMvUkYvQkJQIHJlbGF0ZWQgZnVuY3Rpb25zCisKK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCQlVU0hPUlQJCQlPcGVyYWlvbk1vZGUsCisJSU4gCQlVQ0hBUgkJCVNldE1hc2ssCisJSU4JCUJPT0xFQU4JCQliRGlzYWJsZUJHUHJvdGVjdCwKKwlJTgkJQk9PTEVBTgkJCWJOb25HRkV4aXN0KTsKKworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKTsKKworVk9JRCBBc2ljTG9ja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCkgOworCitWT0lEIEFzaWNBbnRlbm5hU2VsZWN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKTsKKworVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworVk9JRCBBc2ljRm9yY2VTbGVlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgQXNpY1NldEJzc2lkKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEJzc2lkKTsKKworVk9JRCBBc2ljU2V0TWNhc3RXQygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCk7CisKK1ZPSUQgQXNpY0VuYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0gICAgcEVkY2FQYXJtKTsKKworVk9JRCBBc2ljU2V0U2xvdFRpbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7CisKK1ZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCisJSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCisJSU4gUFVDSEFSICAgICAgICBwS2V5LAorCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAorCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKKworVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVik7CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKKworVk9JRCBBc2ljQWRkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUgkJS2V5SWR4LAorCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAorCUlOIEJPT0xFQU4JCWJUeEtleSk7CisKK1ZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUgkJV0NJRCwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOworCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0lkeCwKKwlJTiBVQ0hBUgkJIFdjaWQpOworCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKKwlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAorCUlOIFVDSEFSICAgICAgICAgQXJnMCwKKwlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOworCisjaWZkZWYgUlQyODYwCitCT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgIHBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIE1sbWVSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKK1ZPSUQgQnNzVGFibGVJbml0KAorCUlOIEJTU19UQUJMRSAqVGFiKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBVQ0hBUiBDaGFubmVsKTsKKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBwQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgICAgQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVCAgUEJTU19UQUJMRSBwVGFiLAorCUlOICAgICAgUFVDSEFSIHBCc3NpZCwKKwlJTiAgICAgIFVDSEFSIENoYW5uZWwpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpOworCitWT0lEIEJBVGFibGVEZWxldGVSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX1JFQ19FTlRSWQkqcEJBUkVDRW50cnkpOworCitWT0lEIEJBVGFibGVUZWFyT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBUSUQsCisJSU4JCVVDSEFSIFdjaWQsCisJSU4JCUJPT0xFQU4gYkZvcmNlRGVsZXRlLAorCUlOCQlCT09MRUFOIEFMTCk7CisKK1ZPSUQgQkFUYWJsZVRlYXJSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV0NJRCwKKwlJTgkJQk9PTEVBTiBBTEwpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICBCc3NFbnRyeVNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUEJTU19FTlRSWSBwQnNzLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gUENGX1BBUk0gQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK1VMT05HICBCc3NUYWJsZVNldEVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX1RBQkxFIHBUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBDRl9QQVJNICpDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5zZXJ0RW50cnkoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVVNIT1JUIEFpZCwKKyAgICBJTiBVU0hPUlQJCVRpbWVPdXRWYWx1ZSwKKwlJTiBVU0hPUlQJCVN0YXJ0aW5nU2VxLAorICAgIElOIFVDSEFSIFRJRCwKKwlJTiBVQ0hBUiBCQVdpblNpemUsCisJSU4gVUNIQVIgT3JpZ2luYXRvclN0YXR1cywKKyAgICBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnNzMjA0MENvZXhpc3RUaW1lT3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObyk7CisKK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4pOworCitWT0lEICBCc3NUYWJsZVNvcnRCeVJzc2koCisJSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKTsKKworVk9JRCBCc3NDaXBoZXJQYXJzZSgKKwlJTiBPVVQgIFBCU1NfRU5UUlkgIHBCc3MpOworCitORElTX1NUQVRVUyAgTWxtZVF1ZXVlSW5pdCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK1ZPSUQgIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKTsKKworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAorCUlOIFVMT05HIFRpbWVTdGFtcExvdywKKwlJTiBVQ0hBUiBSc3NpMCwKKwlJTiBVQ0hBUiBSc3NpMSwKKwlJTiBVQ0hBUiBSc3NpMiwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gUFZPSUQgTXNnLAorCUlOIFVDSEFSIFNpZ25hbCk7CisKKworQk9PTEVBTiBNbG1lRGVxdWV1ZSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKKwlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSk7CisKK1ZPSUQgICAgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOICBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOICBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisJT1VUIElOVCAqTWFjaGluZSwKKwlPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpOworCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCVVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7CisKK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRHJvcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBSZWFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIERpc2Fzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBSZWFzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQ2xzM2VyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKworVk9JRCAgQ29tcG9zZVBzUG9sbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgIENvbXBvc2VOdWxsRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAgQXNzb2NQb3N0UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyMiwKKwlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOICBVU0hPUlQgQWlkLAorCUlOICBVQ0hBUiBTdXBSYXRlW10sCisJSU4gIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiAgVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAgVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAorCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQgQXV0aFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gUFNUQVRFX01BQ0hJTkUgc20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBdXRoVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEF1dGhUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENsczJlcnJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXV0aCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFNUQVRFX01BQ0hJTkUgU20sCisJSU4gIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorCUlOICBVU0hPUlQgQWxnLAorCUlOICBVU0hPUlQgU2VxLAorCUlOICBVU0hPUlQgUmVhc29uLAorCUlOICBVU0hPUlQgU3RhdHVzKTsKKworLy8KKy8vIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMKKy8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK3ZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1JzcEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gVUxPTkcJCQlMZW4sCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCk7CisKK0lOVAlSVE1QQ2hlY2tETFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7CisKK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKKworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKK1ZPSUQgRGxzVGltZW91dEFjdGlvbigKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCisgICAgT1VUIFBVU0hPUlQgcFJlYXNvbik7CisKK0lOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJcEFkZHIsCisJSU4gIFVJTlQJRGxzRW50cnlJZHgpOworCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgl3Y2lkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCk7CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGxzUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQmVhY29uVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gU2NhblJ1bm5pbmcoCisJCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBNbG1lQ250bEluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxJZGxlUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsT2lkU2NhblByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxPaWRTc2lkUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRTdGFydFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBdXRoUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgQ250bE9pZERMU1NldHVwUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCitWT0lEIExpbmtVcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgQnNzVHlwZSk7CisKK1ZPSUQgTGlua0Rvd24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBJc1JlcUZyb21BUCk7CisKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTs7CisKK1ZPSUQgSm9pblBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCisJSU4gIFVMT05HIEJzc0lkeCk7CisKK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gIFVMT05HIFRpbWVvdXQsCisJSU4gIFVTSE9SVCBMaXN0ZW5JbnR2KTsKKworVk9JRCBTY2FuUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4sCisJSU4gIFVDSEFSIEJzc1R5cGUsCisJSU4gIFVDSEFSIFNjYW5UeXBlKTsKKworVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgUmVhc29uKTsKKworVk9JRCBTdGFydFBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4pOworCitWT0lEIEF1dGhQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBBbGcpOworCitWT0lEIEVucXVldWVQc1BvbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVucXVldWVCZWFjb25GcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBTY2FuTmV4dENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVTE9ORyBNYWtlSWJzc0JlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQ0NYQWRqYWNlbnRBUFJlcG9ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAqQnNzVHlwZSwKKwlPVVQgQ0hBUiBzc2lkW10sCisJT1VUIFVDSEFSICpTc2lkTGVuLAorCU9VVCBVQ0hBUiAqU2NhblR5cGUpOworCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJSU4gIFVDSEFSIE1zZ0NoYW5uZWwsCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFBVQ0hBUiBwQnNzaWQsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAorCU9VVCBVQ0hBUiAqcENoYW5uZWwsCisJT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKKwlPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKKwlPVVQgQ0ZfUEFSTSAqcENmUGFybSwKKwlPVVQgVVNIT1JUICpwQXRpbVdpbiwKKwlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVDSEFSICpwRXJwLAorCU9VVCBVQ0hBUiAqcER0aW1Db3VudCwKKwlPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAorCU9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKKwlPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKKwlPVVQgVUNIQVIgU3VwUmF0ZVtdLAorCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisJT1VUIFVDSEFSIEV4dFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorCU9VVAlVQ0hBUiAqcENraXBGbGFnLAorCU9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwlPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCisJT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAorCU9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlPVVQgVUxPTkcgKnBSYWxpbmtJZSwKKwlPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKKwlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKKwlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWwsCisJT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAorCU9VVCBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMik7CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgV2NpZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBcEFkZHIsCisJT1VUIFVTSE9SVCAqQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVMT05HICpUaW1lb3V0LAorCU9VVCBVU0hPUlQgKkxpc3RlbkludHYpOworCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyLAorCU9VVCBVTE9ORyAqVGltZW91dCwKKwlPVVQgVVNIT1JUICpBbGcpOworCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqU3NpZGxlbik7CisKK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIsCisJT1VUIFVTSE9SVCAqQWxnLAorCU9VVCBVU0hPUlQgKlNlcSwKKwlPVVQgVVNIT1JUICpTdGF0dXMsCisJT1VUIENIQVIgQ2hsZ1RleHRbXSk7CisKK0JPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisJT1VUIFVTSE9SVCAqcFN0YXR1cywKKwlPVVQgVVNIT1JUICpwQWlkLAorCU9VVCBVQ0hBUiBTdXBSYXRlW10sCisJT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKwlPVVQgVUNIQVIgRXh0UmF0ZVtdLAorCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwlPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJT1VUIFVDSEFSICpwQ2tpcEZsYWcpOworCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpOworCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbik7CisKK0JPT0xFQU4gR2V0VGltQml0KAorCUlOICBDSEFSICpQdHIsCisJSU4gIFVTSE9SVCBBaWQsCisJT1VUIFVDSEFSICpUaW1MZW4sCisJT1VUIFVDSEFSICpCY2FzdEZsYWcsCisJT1VUIFVDSEFSICpEdGltQ291bnQsCisJT1VUIFVDSEFSICpEdGltUGVyaW9kLAorCU9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpOworCitVQ0hBUiBDaGFubmVsU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIGNoYW5uZWwpOworCitORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKKwlJTiBQQlNTX0VOVFJZIHBCc3MpOworCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMik7CisKK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpMZW5ndGgsIC4uLik7CisKK1ZPSUQgIExmc3JJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBTZWVkKTsKKworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBUeFJhdGUpOworCitWT0lEICBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua0Rvd25FeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua1VwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKKwlJTiBQVUNIQVIgcFNzaWQsCisJSU4gVUNIQVIgIFNzaWRMZW4pOworCitWT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgICAgTm93MzIpOworCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgTm93KTsKKworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOworCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOworCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3cpOworCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKTsKKworVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVHhQcmVhbWJsZSk7CisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gCUJPT0xFQU4JCSAJYkxpbmtVcCwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICAgIFJUTVBDaGVja1JhdGVzKAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCisJSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAorCUlOIFVDSEFSCQlDaGFubmVsKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworQk9PTEVBTiAJUlRNUENoZWNrSHQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUglXY2lkLAorCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCisJSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOworCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0JicFR1bmluZzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgUlRNUE1heFJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQ0hBUgkJCQlSc3NpMCwKKwlJTiBDSEFSCQkJCVJzc2kxLAorCUlOIENIQVIJCQkJUnNzaTIpOworCitWT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOworCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbmRsZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVIYWx0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VDSEFSIE5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBjaGFubmVsKTsKKworVk9JRCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKworVk9JRCBSYWlzZUNsb2NrKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UMzIgKngpOworCitWT0lEIExvd2VyQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1VTSE9SVCBTaGlmdEluQml0cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgU2hpZnRPdXRCaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgZGF0YSwKKwlJTiAgVVNIT1JUIGNvdW50KTsKKworVk9JRCBFRXByb21DbGVhbnVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0RTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0VOKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCk7CisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCwKKwlJTiAgVVNIT1JUIERhdGEpOworCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHJ0bXBfdGtpcC5jCisvLworVk9JRCAgICBSVE1QSW5pdFRraXBFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFRBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUU0MsCisJT1VUIFBVTE9ORyAgICAgICAgICBwSVYxNiwKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjMyKTsKKworVk9JRCAgICBSVE1QSW5pdE1JQ0VuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEVuY2FwLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTExDLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAorCUlOICBVQ0hBUiAgICAgICAgICAgdUNoYXIpOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgbkJ5dGVzKTsKKworVk9JRCAgICBSVE1QVGtpcEdldE1JQygKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwKTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7CisKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworLy8KKy8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jCisvLworTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKKworVk9JRCAgICBSVE1QV1BBUmVtb3ZlQWxsS2V5cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAorICAgIElOICBDSEFSICpwSW5QdXRTdHIsCisgICAgSU4gIFVDSEFSIHN0ckxlbik7CisKK1ZPSUQgICAgUlRNUFNldFBoeU1vZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HIHBoeW1vZGUpOworCitWT0lECVJUTVBVcGRhdGVIVElFKAorCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAorCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKKwlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOworCitWT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCc3NJZHgsCisJSU4gCVVDSEFSCQkgCUtleUlkeCwKKwlJTiAJVUNIQVIJCSAJQ2lwaGVyQWxnLAorCUlOIAlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK0NIQVIgKkdldEVuY3J5cHRUeXBlKAorCUNIQVIgZW5jKTsKKworQ0hBUiAqR2V0QXV0aE1vZGUoCisJQ0hBUiBhdXRoKTsKKworVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIHN0cnVjdCBpd3JlcSAqd3JxKTsKKworVk9JRCBSVE1QSW5kaWNhdGVXUEEyU3RhdHVzKAorCUlOICBQUlRNUF9BREFQVEVSICBwQWRhcHRlcik7CisKK1ZPSUQJUlRNUE9QTW9kZVN3aXRjaGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgICAgUlRNUEFkZEJTU0lEQ2lwaGVyKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCUFpZCwKKyAgICBJTiAgUE5ESVNfODAyXzExX0tFWSAgICBwS2V5LAorICAgIElOICBVQ0hBUiAgIENpcGhlckFsZyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQJUlRNUFNldEhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSk7CisKK1ZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAorCUlOCVBVQ0hBUiAJCQlwQWRkciwKKwlJTiAgVUNIQVIJCQlCc3NJZHgsCisJSU4JQ0hBUgkJCVJzc2kpOworCitWT0lECU5JQ1VwZGF0ZUNudGxDb3VudGVycygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOICAgIFVDSEFSCQkJU3ViVHlwZSwKKwlJTglQUlhXSV9TVFJVQyAJcFJ4V0kpOworLy8KKy8vIHByb3RvdHlwZSBpbiB3cGEuYworLy8KK0JPT0xFQU4gV3BhTXNnVHlwZVN1YnN0KAorCUlOICBVQ0hBUiAgIEVBUFR5cGUsCisJT1VUIElOVAkJKk1zZ1R5cGUpOworCitWT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhUGFpck1zZzNBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhR3JvdXBNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYU1hY0hlYWRlckluaXQoCisJSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKwlJTiAgICAgIFVDSEFSICAgICAgICAgICB3ZXAsCisJSU4gICAgICBQVUNIQVIgICAgICAgICAgcEFkZHIxKTsKKworVk9JRCAgICBXcGEyUGFpck1zZzFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitCT09MRUFOIFBhcnNlS2V5RGF0YSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpOworCitWT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSk7CisKK1ZPSUQgICAgSE1BQ19TSEExKAorCUlOICBVQ0hBUiAgICp0ZXh0LAorCUlOICBVSU5UICAgIHRleHRfbGVuLAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIFVJTlQgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqZGlnZXN0KTsKKworVk9JRCAgICBQUkYoCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgSU5UICAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpwcmVmaXgsCisJSU4gIElOVCAgICAgcHJlZml4X2xlbiwKKwlJTiAgVUNIQVIgICAqZGF0YSwKKwlJTiAgSU5UICAgICBkYXRhX2xlbiwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBJTlQgICAgIGxlbik7CisKK1ZPSUQgICAgQ0NLTVBSRigKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBJTlQgICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKmRhdGEsCisJSU4gIElOVCAgICAgZGF0YV9sZW4sCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgSU5UICAgICBsZW4pOworCitWT0lEIFdwYUNvdW50UFRLKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICpQTUssCisJSU4gIFVDSEFSICAgKkFOb25jZSwKKwlJTiAgVUNIQVIgICAqQUEsCisJSU4gIFVDSEFSICAgKlNOb25jZSwKKwlJTiAgVUNIQVIgICAqU0EsCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgVUlOVCAgICBsZW4pOworCitWT0lEICAgIEdlblJhbmRvbSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pOworCisvLworLy8gcHJvdG90eXBlIGluIGFpcm9uZXQuYworLy8KK1ZPSUQgICAgQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICAgICAgICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgIFRyYW5zW10pOworCitWT0lEICAgIEFpcm9uZXRNc2dBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQWlyb25ldFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIE5vaXNlSGlzdFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0UmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIENoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIE5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICAgIEJlYWNvblJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBBaXJvbmV0QWRkQmVhY29uUmVwb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgICAgICBJbmRleCwKKwlJTiAgUE1MTUVfUVVFVUVfRUxFTSAgICBwRWxlbSk7CisKK1ZPSUQgICAgQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworCitWT0lEICAgIERCR1BSSU5UX1RYX1JJTkcoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgIFF1ZUlkeCk7CisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpOworCitDSEFSICAgIENvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIENIQVIJCQkJUnNzaSwKKwlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK1ZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vCisvLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gY21tX3dwYS5jCisvLworQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKKwlJTiBQVUNIQVIgCQkJcERhdGEsCisJSU4gVUxPTkcgCQkJRGF0YUJ5dGVDb3VudCwKKwlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4gIFVDSEFSICAgKmtleSwKKwlPVVQgVUNIQVIgICAqcGxhaW50ZXh0LAorCUlOCVVDSEFSCWNfbGVuLAorCUlOICBVQ0hBUiAgICpjaXBoZXJ0ZXh0KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCk7CisKK0JPT0xFQU4gUlRNUFBhcnNlRWFwb2xLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlJbmRleCwKKwlJTglVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JQk9PTEVBTgkJCWJXUEEyLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJUGVlckF1dGhNb2RlLAorICAgIElOIAlVQ0hBUgkJCQlQZWVyV2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlNeUdyb3VwS2V5V2VwU3RhdHVzLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOCVVDSEFSCQkJCURlZmF1bHRLZXlJZHgsCisgICAgSU4gCVVDSEFSCQkJCSpSZXBsYXlDb3VudGVyLAorCUlOIAlVQ0hBUgkJCQkqS2V5Tm9uY2UsCisJSU4JVUNIQVIJCQkJKlR4UlNDLAorCUlOCVVDSEFSCQkJCSpQVEssCisJSU4JVUNIQVIJCQkJKkdUSywKKwlJTglVQ0hBUgkJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQkJUlNOSUVfTGVuLAorICAgIE9VVCBQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cpOworCitWT0lECUNhbGN1bGF0ZU1JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQkqUFRLLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7CisKK05ESVNfU1RBVFVTCVJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJCQkJcEFkLAorCUlOCVJYX0JMSwkJCQkJCQkqcFJ4QmxrLAorCUlOICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAJR3JvdXBDaXBoZXIsCisJSU4gIFBDSVBIRVJfS0VZCQkJCQkJcFNoYXJkX2tleSk7CisKK1ZPSUQJQ29uc3RydWN0RWFwb2xLZXlEYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlckF1dGhNb2RlLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCUdyb3VwS2V5V2VwU3RhdHVzLAorCUlOIAlVQ0hBUgkJCU1zZ1R5cGUsCisJSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAorCUlOCUJPT0xFQU4JCQliV1BBMkNhcGFibGUsCisJSU4JVUNIQVIJCQkqUFRLLAorCUlOCVVDSEFSCQkJKkdUSywKKwlJTglVQ0hBUgkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCVJTTklFX0xFTiwKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpOworCitWT0lEIFJUTVBNYWtlUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKKwlJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworLy8KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBhcF93cGEuYworLy8KKworQk9PTEVBTiBBUFdwYU1zZ1R5cGVTdWJzdCgKKwlJTiBVQ0hBUiAgICBFQVBUeXBlLAorCU9VVCBJTlQgKk1zZ1R5cGUpIDsKKworTUFDX1RBQkxFX0VOVFJZICpQQUNJbnF1aXJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgV2NpZCk7CisKK0JPT0xFQU4gUlRNUENoZWNrTWNhc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUENoZWNrVWNhc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUENoZWNrQVVUSCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworVk9JRCBXUEFTdGFydDRXYXlIUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJSU4JVUxPTkcJCQlUaW1lSW50ZXJ2YWwpOworCitWT0lEIFdQQVN0YXJ0MldheUdyb3VwSFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworVk9JRCBBUFdwYUVBUFBhY2tldEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xTdGFydEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xMb2dvZmZBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFuZGxlQ291bnRlck1lYXN1cmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworVk9JRCBQZWVyUGFpck1zZzJBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclBhaXJNc2c0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENNVGltZXJFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgV1BBUmV0cnlFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgRW5xdWV1ZVN0YXJ0Rm9yUFNLRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFJUTVBIYW5kbGVTVEFLZXkoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWRhcHRlciwKKyAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgUGVlckdyb3VwTXNnMkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBWT0lEICAgICAgICAgICAgICpNc2csCisJSU4gIFVJTlQgICAgICAgICAgICAgTXNnTGVuKTsKKworVk9JRCBQYWlyRGlzQXNzb2NBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIE1sbWVEZUF1dGhBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIEdSRUtFWVBlcmlvZGljRXhlYygKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIENvdW50R1RLKAorCUlOICBVQ0hBUiAgICpQTUssCisJSU4gIFVDSEFSICAgKkdOb25jZSwKKwlJTiAgVUNIQVIgICAqQUEsCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgVUlOVCAgICBsZW4pOworCitWT0lEICAgIEdldFNtYWxsKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEICAgIEdldExhcmdlKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIEFQR2VuUmFuZG9tKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAqcmFuZG9tKTsKKworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorCUlOIFVDSEFSICprZXksCisJSU4gVUNIQVIgKnBsYWludGV4dCwKKwlJTiBVQ0hBUiBwX2xlbiwKKwlPVVQgVUNIQVIgKmNpcGhlcnRleHQpOworCitWT0lEICAgIFdwYVNlbmQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBQYWNrZXQsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW4pOworCitWT0lEICAgIEFQVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisJSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWJDbGVhckZyYW1lKTsKKworVk9JRCBSVE1QQWRkUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAkJcEFkLAorCUlOCUlOVAkJCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJCQlwQWRkciwKKwlJTglVQ0hBUgkJCQkJKlBNS0lELAorCUlOCVVDSEFSCQkJCQkqUE1LKTsKKworSU5UIFJUTVBTZWFyY2hQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTglQVUNIQVIJCXBBZGRyKTsKKworVk9JRCBSVE1QRGVsZXRlUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgsCisJSU4gIElOVAkJCQlpZHgpOworCitWT0lEIFJUTVBNYWludGFpblBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECVJUTVBTZW5kVHJpZ2dlckZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZmZlciwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSk7CisKK1ZPSUQgUlRNUF9PU19BZGRfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKKworVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJICpwQ2FuY2VsbGVkKTsKKworCitWT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpOworCitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYyk7CisKK05ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQJUFVDSEFSICptZW0sCisJSU4JVUxPTkcgIHNpemUpOworCitORElTX1NUQVRVUyBvc19mcmVlX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQVUNIQVIgbWVtKTsKKworCit2b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUlOVAlJbmRleCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKKworCitCT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsgKnBUeEJsayk7CisKKworUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpOworCisKKyB2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBIYW5kbGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK3ZvaWQgY29udmVydF84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXA4MDIzaGRyLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwT2xkUGt0KTsKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9WTEFOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1dQSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVSU5UMzIJCQlleHRfaGVhZF9sZW4sCisJSU4JVUlOVDMyCQkJZXh0X3RhaWxfbGVuKTsKKworVUNIQVIgVkxBTl84MDIzX0hlYWRlcl9Db3B5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTglVSU5UICAgICAgICAgICAgSGRyTGVuLAorCU9VVCBQVUNIQVIJCQlwRGF0YSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTiBVTE9ORwkJCU5vdzMyKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblNldFVwKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQlJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwkJCUlOIFVDSEFSCQkJVElELAorCQkJSU4gVVNIT1JUCQkJVGltZU91dCwKKwkJCUlOIFVMT05HCQkJRGVsYXlUaW1lLAorCQkJSU4gQk9PTEVBTgkJaXNGb3JjZWQpOworCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgV2NpZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCk7CisKKworVk9JRCBidWlsZF90eF9wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCXBGcmFtZSwKKwlJTglVTE9ORwlGcmFtZUxlbik7CisKKworVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKKwlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJV2NpZCwKKwlJTgkJVUNIQVIJCQlUSUQsCisJSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSwKKwlJTgkJQk9PTEVBTgkJCWJGb3JjZVNlbmQpOworCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlKTsKKworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBBdXRvQ2hCc3NJbnNlcnRFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0luaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIEF1dG9DaEJzc1RhYmxlRGVzdHJveSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQ2hhbm5lbEluZm9EZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgTmV3X0FwQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitCT09MRUFOIHJ0c3RyY2FzZWNtcCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK2NoYXIgKnJ0c3Ryc3RydW5jYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAgICAqcnRzdHJzdHIoCisJSU4JY29uc3QgY2hhciAqIHMxLAorCUlOCWNvbnN0IGNoYXIgKiBzMik7CisKK2NoYXIgKnJzdHJ0b2soCisJSU4gY2hhciAqIHMsCisJSU4gY29uc3QgY2hhciAqIGN0KTsKKworaW50IHJ0aW5ldF9hdG9uKAorCWNvbnN0IGNoYXIgKmNwLAorCXVuc2lnbmVkIGludCAqYWRkcik7CisKKy8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeEJ1cnN0X1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgREJHCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0U3RiY19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEFtc2R1X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0ZvcmNlR0ZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvL0RscyAsCWthdGh5CitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvL0Jsb2NrIEFDSworVk9JRCBRdWVyeUJBVEFCTEUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQUVVFUllCQV9UQUJMRSBwQkFUKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCXBBZCwKKwlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKKwlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAorCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKKworVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOworCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEhhbmRsZV9CU1NfV2lkdGhfVHJpZ2dlcl9FdmVudHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIGJ1aWxkX2V4dF9jaGFubmVsX3N3aXRjaF9pZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFICpwSUUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisvLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKKyNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfSU5GUkEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRExTKSkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7CQkJCQkJCQkJCVwKKwkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCUNPTlZFUlRfVE9fODAyXzMoX3BIZWFkZXI4MDJfMywgX3BEQSwgX3BTQSwgX3BSeEJsay0+cERhdGEsIAkJCQlcCisJCV9wUnhCbGstPkRhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIEFQRm93YXJkV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVMT05HCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKVwKKwkJCVN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUyk7CisJCQkvL2Fubm91bmNlXzgwMl8zX3BhY2tldChfcEFkLCBfcFBhY2tldCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBVcGRhdGVfUnNzaV9TYW1wbGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUlNTSV9TQU1QTEUJCSpwUnNzaSwKKwlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpOworCitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwkJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL2ZvciBzbm1wICwga2F0aHkKK3R5cGVkZWYgc3RydWN0IF9EZWZhdWx0S2V5SWR4VmFsdWUKK3sKKwlVQ0hBUglLZXlJZHg7CisJVUNIQVIJVmFsdWVbMTZdOworfSBEZWZhdWx0S2V5SWR4VmFsdWUsICpQRGVmYXVsdEtleUlkeFZhbHVlOworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZW51bSB7CisJRElEbXNnX2xueGluZF93bGFuc25pZmZybQkJPSAweDAwMDAwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUJPSAweDAwMDEwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZQk9IDB4MDAwMjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsCT0gMHgwMDAzMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kJCT0gMHgwMDA0MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxCQk9IDB4MDAwNTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwJPSAweDAwMDYwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UJCT0gMHgwMDA3MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUJCT0gMHgwMDA4MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHgJCT0gMHgwMDA5MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbgk9IDB4MDAwQTAwNDQKK307CitlbnVtIHsKKwlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlCT0gMHgwMAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UJCQk9IDB4MDAsCisJUDgwMjExRU5VTV90cnV0aF90cnVlCQkJPSAweDAxCit9OworCisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgZGlkOworICAgICAgICBVSU5UMTYgc3RhdHVzOworICAgICAgICBVSU5UMTYgbGVuOworICAgICAgICBVSU5UMzIgZGF0YTsKK30gcDgwMjExaXRlbV91aW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgbXNnY29kZTsKKyAgICAgICAgVUlOVDMyIG1zZ2xlbjsKKyNkZWZpbmUgV0xBTl9ERVZOQU1FTEVOX01BWCAxNgorICAgICAgICBVSU5UOCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGhvc3R0aW1lOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG1hY3RpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgY2hhbm5lbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByc3NpOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNxOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByYXRlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGlzdHg7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgZnJtbGVuOworfSB3bGFuX25nX3ByaXNtMl9oZWFkZXI7CisKKy8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7CisgICAgVUlOVDgJaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcworCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCisJCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKKwkJCQkgKiBuZXcgZmllbGRzIGRvZXMgbm90IGNvdW50LgorCQkJCSAqLworICAgIFVJTlQ4CWl0X3BhZDsKKyAgICBVSU5UMTYgICAgIGl0X2xlbjsgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHdob2xlCisJCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKKwkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCisJCQkJICogaXRfbGVuLCBhbmQgZGF0YSBmaWVsZHMuCisJCQkJICovCisgICAgVUlOVDMyICAgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAorCQkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKKwkJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKKwkJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KKwkJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCisJCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgorCQkJCQkgKi8KK31pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIDsKKworZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7CisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKK307CisKKyNkZWZpbmUgV0xBTl9SQURJT1RBUF9QUkVTRU5UICgJCQlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCXwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpICB8IAlcCisJIDApCisKK3R5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7CisJaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOworCUlOVDY0IHd0X3RzZnQ7CisJVUlOVDggd3RfZmxhZ3M7CisJVUlOVDggd3RfcmF0ZTsKK30gd2xhbl9yYWRpb3RhcF9oZWFkZXI7CisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLworCit2b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspOworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0UGh5TW9kZSgKKwlpbnQgTW9kZSkKK3sKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgTU9ERV9DQ0s6CisJCQlyZXR1cm4gIkNDSyI7CisKKwkJY2FzZSBNT0RFX09GRE06CisJCQlyZXR1cm4gIk9GRE0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIE1PREVfSFRNSVg6CisJCQlyZXR1cm4gIkhUTUlYIjsKKworCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQkJcmV0dXJuICJHUkVFTiI7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0QlcoCisJaW50IEJXKQoreworCXN3aXRjaChCVykKKwl7CisJCWNhc2UgQldfMTA6CisJCQlyZXR1cm4gIjEwTSI7CisKKwkJY2FzZSBCV18yMDoKKwkJCXJldHVybiAiMjBNIjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBCV180MDoKKwkJCXJldHVybiAiNDBNIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApOworCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlhcmdjKTsKKworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAorCUlOIFJUTVBfQURBUFRFUiAqIHBBZCwKKwlJTiBJTlQgYXBpZHgsCisJSU4gVUxPTkcgQmVhY29uTGVuLAorCUlOIFVMT05HIFVwZGF0ZVBvcyk7CisKK0lOVCBydDI4eHhfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJY21kKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIFJUMjhYWFNlY3VyaXR5S2V5QWRkKAorCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JCVVMT05HCQkJCWFwaWR4LAorCUlOCQlVTE9ORwkJCQlLZXlJZHgsCisJSU4JCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKKworCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisjaWZkZWYgUlQyODYwCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhXzI4NjAuYworLy8KK1VTSE9SVCBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFnTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wUENJX1dyaXRlU3ViVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1ZPSUQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCisJSU4JVVNIT1JUCQkJRmlyc3RUeElkeCk7CisKK1ZPSUQgUnRtcFBDSURhdGFMYXN0VHhJZHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JVVNIT1JUCQkJTGFzdFR4SWR4KTsKKworVk9JRCBSdG1wUENJRGF0YUtpY2tPdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCk7CisKKworaW50IFJ0bXBQQ0lNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pOworCisKK05ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyLAorCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAorCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBGaW5kSG9zdFBDSURldigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgIFVDSEFSCQlMZXZlbCk7CisKK1ZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCVVTSE9SVAkJTWF4KTsKKworVk9JRCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgICBMZXZlbCwKKwlJTiBVU0hPUlQgICAgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXApOworCitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICBMZXZlbCk7CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCk7CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIFBzUG9sbFdha2VFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgIFJhZGlvT25FeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTglVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQXNpY1R1cm5PblJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVk9JRCBRQlNTX0xvYWRJbml0KAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCitVSU5UMzIgUUJTU19Mb2FkRWxlbWVudEFwcGVuZCgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkLAorCU9VVAkJVUlOVDgJCQkqYnVmX3ApOworCitWT0lEIFFCU1NfTG9hZFVwZGF0ZSgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKTsKKworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUmVTeW5jQmVhY29uVGltZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUJhbmRXaWR0aCk7CisKK2ludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KTsKK2ludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpOworCitfX2lubGluZSBJTlQgVklSVFVBTF9JRl9VUChQUlRNUF9BREFQVEVSIHBBZCkKK3sKK2V4dGVybiBWT0lEIE1lc2hNYWtlQmVhY29uKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBVQ0hBUiBpZHgpOworZXh0ZXJuIFZPSUQgTWVzaFVwZGF0ZUJlYWNvbkZyYW1lKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBVQ0hBUiBpZHgpOworCisJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKKwl7CisJCWlmIChydDI4eHhfb3BlbihwQWQtPm5ldF9kZXYpICE9IDApCisJCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisJfQorCVZJUlRVQUxfSUZfSU5DKHBBZCk7CisJcmV0dXJuIDA7Cit9CisKK19faW5saW5lIFZPSUQgVklSVFVBTF9JRl9ET1dOKFBSVE1QX0FEQVBURVIgcEFkKQoreworCVZJUlRVQUxfSUZfREVDKHBBZCk7CisJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKKwkJcnQyOHh4X2Nsb3NlKHBBZC0+bmV0X2Rldik7CisJcmV0dXJuOworfQorCisKKyNlbmRpZiAgLy8gX19SVE1QX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q5NDlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2NraXBtaWMuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKyNpZm5kZWYJX19SVE1QX0NLSVBNSUNfSF9fCisjZGVmaW5lCV9fUlRNUF9DS0lQTUlDX0hfXworCit0eXBlZGVmCXN0cnVjdAlfTUlDX0NPTlRFWFQJeworCS8qIC0tLSBNTUggY29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCVVDSEFSCQlDS1sxNl07CQkJCS8qIHRoZSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCVVDSEFSCQljb2VmZmljaWVudFsxNl07CS8qIGN1cnJlbnQgYWVzIGNvdW50ZXIgbW9kZSBjb2VmZmljaWVudHMgICAgICAqLworCVVMT05HTE9ORwlhY2N1bTsJCQkJLyogYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpICovCisJVUlOVAkJcG9zaXRpb247CQkJLyogY3VycmVudCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQpIGluIG1lc3NhZ2UgICovCisJVUNIQVIJCXBhcnRbNF07CQkJLyogZm9yIGNvbnZlcnNpb24gb2YgbWVzc2FnZSB0byB1MzIgZm9yIG1taCAgICovCit9CU1JQ19DT05URVhULCAqUE1JQ19DT05URVhUOworCitWT0lECUNLSVBfa2V5X3Blcm11dGUoCisJT1VUCVVDSEFSCSpQSywJCQkvKiBvdXRwdXQgcGVybXV0ZWQga2V5ICovCisJSU4JVUNIQVIJKkNLLAkJCS8qIGlucHV0IENLSVAga2V5ICovCisJSU4JVUNIQVIJdG9Ec0Zyb21EcywJCS8qIGlucHV0IHRvRHMvRnJvbURzIGJpdHMgKi8KKwlJTglVQ0hBUgkqcGl2KTsJCQkvKiBpbnB1dCBwb2ludGVyIHRvIElWICovCisKK1ZPSUQJUlRNUENraXBNaWNJbml0KAorCUlOCVBNSUNfQ09OVEVYVAkJcENvbnRleHQsCisJSU4JUFVDSEFSCQkJCUNLKTsKKworVk9JRCBSVE1QTWljVXBkYXRlKAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBPY3RldHMsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgbGVuKTsKKworVUxPTkcgUlRNUE1pY0dldENvZWZmaWNpZW50KAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgICBwQ29udGV4dCk7CisKK1ZPSUQgeG9yXzEyOCgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorICAgIElOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworCitWT0lEIHhvcl8zMigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBuZXh0X2tleSgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOworCitWT0lEIGJ5dGVfc3ViKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgc2hpZnRfcm93KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbWl4X2NvbHVtbigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIFJUTVBBZXNFbmNyeXB0KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBkYXRhLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGNpcGhlcnRleHQpOworCitWT0lEIFJUTVBNaWNGaW5hbCgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICAgICBkaWdlc3RbNF0pOworCitWT0lEIFJUTVBDa2lwSW5zZXJ0Q01JQygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgIHBNSUMsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwODAyMTFoZHIsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAorICAgIElOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIG1pY19zbmFwKTsKKworI2VuZGlmIC8vX19SVE1QX0NLSVBNSUNfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2ZjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApAQCAtMCwwICsxLDE1ODggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKKyovCisjaWZuZGVmIF9fUlRNUF9ERUZfSF9fCisjZGVmaW5lIF9fUlRNUF9ERUZfSF9fCisKKyNpbmNsdWRlICJvaWQuaCIKKworLy8KKy8vICBEZWJ1ZyBpbmZvcm1hdGlvbiB2ZXJib3NpdHk6IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgdXJnZW5jeQorLy8KKyNkZWZpbmUgUlRfREVCVUdfT0ZGICAgICAgICAwCisjZGVmaW5lIFJUX0RFQlVHX0VSUk9SICAgICAgMQorI2RlZmluZSBSVF9ERUJVR19XQVJOICAgICAgIDIKKyNkZWZpbmUgUlRfREVCVUdfVFJBQ0UgICAgICAzCisjZGVmaW5lIFJUX0RFQlVHX0lORk8gICAgICAgNAorI2RlZmluZSBSVF9ERUJVR19MT1VEICAgICAgIDUKKworI2RlZmluZSBOSUNfVEFHICAgICAgICAgICAgICgoVUxPTkcpJzA2ODInKQorI2RlZmluZSBOSUNfREJHX1NUUklORyAgICAgICgiKipSVDI4eHgqKiIpCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vIGZvciBzbm1wCisvLyB0byBnZXQgbWFudWZhY3R1cmVyIE9VSSwga2F0aHksIDIwMDhfMDIyMAorI2RlZmluZSBNYW51ZmFjdHVyZXJPVUlfTEVOCQkJMworI2RlZmluZSBNYW51ZmFjdHVyZXJOQU1FCQkJKCJSYWxpbmsgVGVjaG5vbG9neSBDb21wYW55LiIpCisjZGVmaW5lCVJlc291cmNlVHlwZUlkTmFtZQkJCSgiUmFsaW5rX0lEIikKKyNlbmRpZgorCisKKyNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKKyNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKKyNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKKworLy8KKy8vIE5ESVMgdmVyc2lvbiBpbiB1c2UgYnkgdGhlIE5JQyBkcml2ZXIuCisvLyBUaGUgaGlnaCBieXRlIGlzIHRoZSBtYWpvciB2ZXJzaW9uLiBUaGUgbG93IGJ5dGUgaXMgdGhlIG1pbm9yIHZlcnNpb24uCisvLworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAxCisjZWxzZQorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDAKKyNlbmRpZgorCisvLworLy8gTkRJUyBtZWRpYSB0eXBlLCBjdXJyZW50IGlzIGV0aGVybmV0LCBjaGFuZ2UgaWYgbmF0aXZlIHdpcmVsZXNzIHN1cHBvcnRlZAorLy8KKyNkZWZpbmUgTklDX01FRElBX1RZUEUgICAgICAgICAgTmRpc01lZGl1bTgwMl8zCisjZGVmaW5lIE5JQ19QQ0lfSERSX0xFTkdUSCAgICAgIDB4ZTIKKyNkZWZpbmUgTklDX01BWF9QQUNLRVRfU0laRSAgICAgMjMwNAorI2RlZmluZSBOSUNfSEVBREVSX1NJWkUgICAgICAgICAxNAorI2RlZmluZSBNQVhfTUFQX1JFR0lTVEVSU19ORUVERUQgMzIKKyNkZWZpbmUgTUlOX01BUF9SRUdJU1RFUlNfTkVFREVEIDIgICAvL1RvZG86IHNob3VsZCBjb25zaWRlciBmcmFnbWVudCBpc3N1ZS4KKworLy8KKy8vIGludGVyZmFjZSB0eXBlLCB3ZSB1c2UgUENJCisvLworI2RlZmluZSBOSUNfSU5URVJGQUNFX1RZUEUgICAgICBOZGlzSW50ZXJmYWNlUGNpCisjZGVmaW5lIE5JQ19JTlRFUlJVUFRfTU9ERSAgICAgIE5kaXNJbnRlcnJ1cHRMZXZlbFNlbnNpdGl2ZQorCisvLworLy8gYnVmZmVyIHNpemUgcGFzc2VkIGluIE5kaXNNUXVlcnlBZGFwdGVyUmVzb3VyY2VzCisvLyBXZSBzaG91bGQgb25seSBuZWVkIHRocmVlIGFkYXB0ZXIgcmVzb3VyY2VzIChJTywgaW50ZXJydXB0IGFuZCBtZW1vcnkpLAorLy8gU29tZSBkZXZpY2VzIGdldCBleHRyYSByZXNvdXJjZXMsIHNvIGhhdmUgcm9vbSBmb3IgMTAgcmVzb3VyY2VzCisvLyAgICAgICAgICAgICAgICAgICAgVUZfU0laRSAgIChzaXplb2YoTkRJU19SRVNPVVJDRV9MSVNUKSArICgxMCpzaXplb2YoQ01fUEFSVElBTF9SRVNPVVJDRV9ERVNDUklQVE9SKSkpCisKKworI2RlZmluZSBOSUNfUkVTT1VSQ0VfQi8vCisvLyBJTyBzcGFjZSBsZW5ndGgKKy8vCisjZGVmaW5lIE5JQ19NQVBfSU9TUEFDRV9MRU5HVEggIHNpemVvZihDU1JfU1RSVUMpCisKKyNkZWZpbmUgTUFYX1JYX1BLVF9MRU4JMTUyMAorCisvLworLy8gRW50cnkgbnVtYmVyIGZvciBlYWNoIERNQSBkZXNjcmlwdG9yIHJpbmcKKy8vCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgNjQgLy82NAorI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAgICAxMjgKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgICAgICAgMTI4IC8vNjQKKyNkZWZpbmUgTUFYX1RYX1BST0NFU1MgICAgICAgICAgVFhfUklOR19TSVpFIC8vOAorI2RlZmluZSBNQVhfRE1BX0RPTkVfUFJPQ0VTUyAgICBUWF9SSU5HX1NJWkUKKyNkZWZpbmUgTUFYX1RYX0RPTkVfUFJPQ0VTUyAgICAgVFhfUklOR19TSVpFIC8vOAorI2RlZmluZSBMT0NBTF9UWEJVRl9TSVpFICAgICAgICAyCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gTUM6IE11bHRwbGUgQ2FyZHMKKyNkZWZpbmUgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJECQkzMgorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisjZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOCAvLzY0IC8vMzIKKyNkZWZpbmUgTlVNX09GX0xPQ0FMX1RYQlVGICAgICAgMgorI2RlZmluZSBUWERfU0laRSAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBUWFdJX1NJWkUgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSWERfU0laRSAgICAgICAgICAgICAgIAkxNgorI2RlZmluZSBSWFdJX1NJWkUgICAgICAgICAgICAgCTE2CisvLyBUWElORk9fU0laRSArIFRYV0lfU0laRSArIDgwMi4xMSBIZWFkZXIgU2l6ZSArIEFNU0RVIHN1YiBmcmFtZSBoZWFkZXIKKyNkZWZpbmUgVFhfRE1BXzFTVF9CVUZGRVJfU0laRSAgOTYgICAgLy8gb25seSB0aGUgMXN0IHBoeXNpY2FsIGJ1ZmZlciBpcyBwcmUtYWxsb2NhdGVkCisjZGVmaW5lIE1HTVRfRE1BX0JVRkZFUl9TSVpFICAgIDE1MzYgLy8yMDQ4CisjZGVmaW5lIFJYX0JVRkZFUl9BR0dSRVNJWkUgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBSWF9CVUZGRVJfTk9STVNJWkUgICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKKyNkZWZpbmUgVFhfQlVGRkVSX05PUk1TSVpFCQlSWF9CVUZGRVJfTk9STVNJWkUKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgMjM0NiAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSA4MDIuMTEgZnJhbWUgc2l6ZQorI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fU0laRSAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2CisjZGVmaW5lIE1BWF9OVU1fT0ZfVFVQTEVfQ0FDSEUgIDIKKyNkZWZpbmUgTUFYX01DQVNUX0xJU1RfU0laRSAgICAgMzIKKyNkZWZpbmUgTUFYX0xFTl9PRl9WRU5ET1JfREVTQyAgNjQKKy8vI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAoTlVNX09GX0xPQ0FMX1RYQlVGID4+IDIpIC8vIEFQIHdvbid0IHNwZW5kIG1vcmUgdGhhbiAxLzQgb2YgdG90YWwgYnVmZmVycyBvbiBNL0JDQVNUIFBTUQorI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIE1BWF9SWF9QUk9DRVNTX0NOVAkoUlhfUklOR19TSVpFKQorCisKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikgLy8oNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1BTX1FVRVVFCQkJCTEyOAkvLzMyCisjZGVmaW5lIFdNTV9OVU1fT0ZfQUMgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFDMCwgQUMxLCBBQzIsIGFuZCBBQzMgKi8KKworCisKKy8vIFJ4RmlsdGVyCisjZGVmaW5lIFNUQU5PUk1BTAkgMHgxN2Y5NworI2RlZmluZSBBUE5PUk1BTAkgMHgxNWY5NworLy8KKy8vICBSVE1QX0FEQVBURVIgZmxhZ3MKKy8vCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUFQX1JFR0lTVEVSICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBVFRFUl9HQVRIRVIgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TRU5EX1BBQ0tFVF9FUlJPUiAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MgMHgwMDAwMDAyMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1RYX1JJTkdfQUxMT0NBVEVEICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NSU1PUkFURV9JTlVTRUQgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JYX1JJTkdfQUxMT0NBVEVEICAgICAweDAwMDAxMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyAgMHgwMDAwNDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JFQVNTT0NfSU5fUFJPR1JFU1MJMHgwMDAwODAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX1BFTkRJTkcJMHgwMDAxMDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCQkweDAwMDIwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVAkJCTB4MDAwNDAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQJCQkweDAwMDgwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkRHX0FDVElWRQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9EWU5BTUlDX0JFX1RYT1BfQUNUSVZFIDB4MDAyMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCisKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvL0Rldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LgorI2RlZmluZSBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSAgICAweDIwMDAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYgICAgICAgIDB4NDAwMDAwMDAKKworLy8KKy8vICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncworLy8KKyNkZWZpbmUgZk9QX1NUQVRVU19JTkZSQV9PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmT1BfU1RBVFVTX0FESE9DX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmT1BfU1RBVFVTX1dNTV9JTlVTRUQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19ET1pFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy8gZGVidWcgcHVycG9zZQorI2RlZmluZSBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQgICAgICAgICAweDAwMDAwODAwICAvLyBwaWdneS1iYWNrLCBhbmQgYWdncmVnYXRpb24KKyNkZWZpbmUgZk9QX1NUQVRVU19BUFNEX0lOVVNFRAkJCQkweDAwMDAxMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfVFhfQU1TRFVfSU5VU0VECQkJMHgwMDAwMjAwMAorI2RlZmluZSBmT1BfU1RBVFVTX01BWF9SRVRSWV9FTkFCTEVECQkweDAwMDA0MDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfV0FLRVVQX05PVyAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UgICAgICAgMHgwMDAyMDAwMAorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBmT1BfU1RBVFVTX1NDQU5fMjA0MCAgICAgICAgICAgICAgIAkgICAgMHgwMDA0MDAwMAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBDQ0tTRVRQUk9URUNUCQkweDEKKyNkZWZpbmUgT0ZETVNFVFBST1RFQ1QJCTB4MgorI2RlZmluZSBNTTIwU0VUUFJPVEVDVAkJMHg0CisjZGVmaW5lIE1NNDBTRVRQUk9URUNUCQkweDgKKyNkZWZpbmUgR0YyMFNFVFBST1RFQ1QJCTB4MTAKKyNkZWZpbmUgR1I0MFNFVFBST1RFQ1QJCTB4MjAKKyNkZWZpbmUgQUxMTl9TRVRQUk9URUNUCQkoR1I0MFNFVFBST1RFQ1QgfCBHRjIwU0VUUFJPVEVDVCB8IE1NNDBTRVRQUk9URUNUIHwgTU0yMFNFVFBST1RFQ1QpCisKKy8vCisvLyAgQVAncyBjbGllbnQgdGFibGUgb3BlcmF0aW9uIHN0YXR1cyBmbGFncworLy8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUgICAgICAgICAgMHgwMDAwMDAwMSAgLy8gQ0xJRU5UIGNhbiBwYXJzZSBRT1MgREFUQSBmcmFtZQorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFICAweDAwMDAwMDAyICAvLyBDTElFTlQgY2FuIHJlY2VpdmUgUmFsaW5rJ3MgcHJvcHJpZXRhcnkgVFggYWdncmVnYXRpb24gZnJhbWUKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUgICAgMHgwMDAwMDAwNCAgLy8gQ0xJRU5UIHN1cHBvcnQgcGlnZ3ktYmFjaworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQJCQkweDAwMDAwMDA4CisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA0MAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA4MAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUJCQkweDAwMDAwMjAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUgIDB4MDAwMDA0MDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQVBTRF9DQVBBQkxFICAgICAgICAgMHgwMDAwMDgwMCAgLyogVUFQU0QgU1RBVElPTiAqLworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19CU1NDT0VYSVNUX0NBUEFCTEUJMHgwMDAwMTAwMAorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVAkJMHgwMDEwMDAwMAorLy8KKy8vICBTVEEgY29uZmlndXJhdGlvbiBmbGFncworLy8KKworLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCisjZGVmaW5lIEhUX05PX1BST1RFQ1QJMAorI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCisjZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgorI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMworI2RlZmluZSBIVF9SVFNDVFNfNk0JNworLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KKyNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KKyNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgorCisvLworLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgorLy8KKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKKworLy8KKy8vIEVycm9yIGNvZGUgc2VjdGlvbgorLy8KKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX05PVF9GT1VORAorI2RlZmluZSBFUlJMT0dfUkVBRF9QQ0lfU0xPVF9GQUlMRUQgICAgIDB4MDAwMDAxMDFMCisjZGVmaW5lIEVSUkxPR19XUklURV9QQ0lfU0xPVF9GQUlMRUQgICAgMHgwMDAwMDEwMkwKKyNkZWZpbmUgRVJSTE9HX1ZFTkRPUl9ERVZJQ0VfTk9NQVRDSCAgICAweDAwMDAwMTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9ESVNBQkxFRAorI2RlZmluZSBFUlJMT0dfQlVTX01BU1RFUl9ESVNBQkxFRCAgICAgIDB4MDAwMDAyMDFMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DT05GSUdVUkFUSU9OCisjZGVmaW5lIEVSUkxPR19JTlZBTElEX1NQRUVEX0RVUExFWCAgICAgMHgwMDAwMDMwMUwKKyNkZWZpbmUgRVJSTE9HX1NFVF9TRUNPTkRBUllfRkFJTEVEICAgICAweDAwMDAwMzAyTAorCisvLyBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUworI2RlZmluZSBFUlJMT0dfT1VUX09GX01FTU9SWSAgICAgICAgICAgIDB4MDAwMDA0MDFMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWSAgICAgMHgwMDAwMDQwMkwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9NQVBfUkVHSVNURVJTICAgICAweDAwMDAwNDAzTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX0JVRkZFUl9QT09MICAgICAgIDB4MDAwMDA0MDRMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19CVUZGRVIgICAgICAgMHgwMDAwMDQwNUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9QQUNLRVRfUE9PTCAgICAgICAweDAwMDAwNDA2TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfUEFDS0VUICAgICAgIDB4MDAwMDA0MDdMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTE9PS0FTSURFX01FTU9SWSAgMHgwMDAwMDQwOEwKKworLy8gTkRJU19FUlJPUl9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUKKyNkZWZpbmUgRVJSTE9HX1NFTEZURVNUX0ZBSUxFRCAgICAgICAgICAweDAwMDAwNTAxTAorI2RlZmluZSBFUlJMT0dfSU5JVElBTElaRV9BREFQVEVSICAgICAgIDB4MDAwMDA1MDJMCisjZGVmaW5lIEVSUkxPR19SRU1PVkVfTUlOSVBPUlQgICAgICAgICAgMHgwMDAwMDUwM0wKKworLy8gTkRJU19FUlJPUl9DT0RFX1JFU09VUkNFX0NPTkZMSUNUCisjZGVmaW5lIEVSUkxPR19NQVBfSU9fU1BBQ0UgICAgICAgICAgICAgMHgwMDAwMDYwMUwKKyNkZWZpbmUgRVJSTE9HX1FVRVJZX0FEQVBURVJfUkVTT1VSQ0VTICAweDAwMDAwNjAyTAorI2RlZmluZSBFUlJMT0dfTk9fSU9fUkVTT1VSQ0UgICAgICAgICAgIDB4MDAwMDA2MDNMCisjZGVmaW5lIEVSUkxPR19OT19JTlRFUlJVUFRfUkVTT1VSQ0UgICAgMHgwMDAwMDYwNEwKKyNkZWZpbmUgRVJSTE9HX05PX01FTU9SWV9SRVNPVVJDRSAgICAgICAweDAwMDAwNjA1TAorCisKKy8vIFdEUyBkZWZpbml0aW9uCisjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorCisjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCisjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCisjZGVmaW5lCVdEU19CUklER0VfTU9ERSAgICAgICAgICAgICAyCisjZGVmaW5lCVdEU19SRVBFQVRFUl9NT0RFICAgICAgICAgICAzCisjZGVmaW5lCVdEU19MQVpZX01PREUgICAgICAgICAgICAgICA0CisKKworI2RlZmluZSBNQVhfTUVTSF9OVU0JCQkJMAorCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMAorI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKyN1bmRlZglNQVhfQVBDTElfTlVNCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkxCisjaWZkZWYgTUJTU19TVVBQT1JUCisjdW5kZWYJTUFYX01CU1NJRF9OVU0KKyNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJKDggLSBNQVhfTUVTSF9OVU0gLSBNQVhfQVBDTElfTlVNKQorI2VuZGlmIC8vIE1CU1NfU1VQUE9SVCAvLworCisvKiBzYW5pdHkgY2hlY2sgZm9yIGFwaWR4ICovCisjZGVmaW5lIE1CU1NfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGFwaWR4KSBcCisgICAgeyBpZiAoYXBpZHggPiBNQVhfTUJTU0lEX05VTSkgeyBcCisgICAgICAgICAgcHJpbnRrKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fRlVOQ1RJT05fXywgYXBpZHgpOyBcCisJICBhcGlkeCA9IE1BSU5fTUJTU0lEOyB9IH0KKworI2RlZmluZSBWQUxJRF9XQ0lEKF93Y2lkKQkoKF93Y2lkKSA+IDAgJiYgKF93Y2lkKSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFICkKKworI2RlZmluZSBNQUlOX01CU1NJRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSVJTVF9NQlNTSUQgICAgICAgICAgICAgICAgMQorCisKKyNkZWZpbmUgTUFYX0JFQUNPTl9TSVpFCQkJCTUxMgorLy8gSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDYsCisvLyBpdCBzaGFsbCByZXNlcnZlIHNvbWUgV0NJRCBzcGFjZSh3Y2lkIDIyMn4yNTMpIGZvciBiZWFjb24gZnJhbWVzLgorLy8gLQl0aGVzZSB3Y2lkIDIzOH4yNTMgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNihyYTYpLgorLy8gLQl0aGVzZSB3Y2lkIDIyMn4yMzcgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNyhyYTcpLgorI2lmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA4KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIyMgorI2VsaWYgZGVmaW5lZChNQVhfTUJTU0lEX05VTSkgJiYgKE1BWF9NQlNTSURfTlVNID09IDcpCisjZGVmaW5lIEhXX1JFU0VSVkVEX1dDSUQJMjM4CisjZWxzZQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTI1NQorI2VuZGlmCisKKy8vIFRoZW4gZGVkaWNhdGUgd2NpZCBvZiBERlMgYW5kIENhcnJpZXItU2Vuc2UuCisjZGVmaW5lIERGU19DVFNfV0NJRCAJCShIV19SRVNFUlZFRF9XQ0lEIC0gMSkKKyNkZWZpbmUgQ1NfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCisjZGVmaW5lIExBU1RfU1BFQ0lGSUNfV0NJRAkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCisKKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjExLgorLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgNywgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMjguCisjZGVmaW5lIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQJKExBU1RfU1BFQ0lGSUNfV0NJRCAtIE1BWF9NQlNTSURfTlVNIC0gMSkKKworLy8gVFggbmVlZCBXQ0lEIHRvIGZpbmQgQ2lwaGVyIEtleQorLy8gdGhlc2Ugd2NpZCAyMTIgfiAyMTkgYXJlIHJlc2VydmVkIGZvciBiYy9tYyBwYWNrZXRzIGlmIE1BWF9NQlNTSURfTlVNIGlzIDguCisjZGVmaW5lIEdFVF9Hcm91cEtleV9XQ0lEKF9fd2NpZCwgX19ic3NpZHgpIFwKKwl7CQkJCQkJCQkJCVwKKwkJX193Y2lkID0gTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSArIF9fYnNzaWR4OwlcCisJfQorCisjZGVmaW5lIElzR3JvdXBLZXlXQ0lEKF9fd2NpZCkgKCgoX193Y2lkKSA8IExBU1RfU1BFQ0lGSUNfV0NJRCkgJiYgKChfX3djaWQpID49IChMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pKSkpCisKKworLy8gZGVmaW5pdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIEJTU0lECisjZGVmaW5lIEJTUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCU1MxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJTUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCU1M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQlNTNSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJTUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBCU1M3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTGVuZ3RoIGRlZmluaXRpb25zCisjZGVmaW5lIFBFRVJfS0VZX05PICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQUNfQUREUl9MRU4gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVElNRVNUQU1QX0xFTiAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTICAgICAgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX0xFTl9PRl9LRVkgICAgICAgICAgICAgICAgICAzMiAgICAgIC8vIDMyIG9jdGV0cyA9PSAyNTYgYml0cywgUmVkZWZpbmUgZm9yIFdQQQorI2RlZmluZSBNQVhfTlVNX09GX0NIQU5ORUxTICAgICAgICAgICAgIE1BWF9OVU1fT0ZfQ0hTICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24KKyNkZWZpbmUgTUFYX05VTV9PRl8xMUpDSEFOTkVMUyAgICAgICAgICAgICAyMCAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfU1NJRCAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgQ0lQSEVSX1RFWFRfTEVOICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTUFYX1ZJRV9MRU4gICAgICAgICAgICAgICAgICAgICAxMDI0ICAgLy8gTmV3IGZvciBXUEEgY2lwaGVyIHN1aXRlIHZhcmlhYmxlIElFIHNpemVzLgorI2RlZmluZSBNQVhfU1VQUE9SVF9NQ1MgICAgICAgICAgICAgMzIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQlNTSURfV0NJRAkJMQkvLyBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lECisjZGVmaW5lIE1DQVNUX1dDSUQJMHgwCisjZGVmaW5lIEJTUzBNY2FzdF9XQ0lECTB4MAorI2RlZmluZSBCU1MxTWNhc3RfV0NJRAkweGY4CisjZGVmaW5lIEJTUzJNY2FzdF9XQ0lECTB4ZjkKKyNkZWZpbmUgQlNTM01jYXN0X1dDSUQJMHhmYQorI2RlZmluZSBCU1M0TWNhc3RfV0NJRAkweGZiCisjZGVmaW5lIEJTUzVNY2FzdF9XQ0lECTB4ZmMKKyNkZWZpbmUgQlNTNk1jYXN0X1dDSUQJMHhmZAorI2RlZmluZSBCU1M3TWNhc3RfV0NJRAkweGZlCisjZGVmaW5lIFJFU0VSVkVEX1dDSUQJCTB4ZmYKKworI2RlZmluZSBNQVhfTlVNX09GX0FDTF9MSVNUCQkJCU1BWF9OVU1CRVJfT0ZfQUNMCisKKyNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQyAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorCisjaWYgTUFYX0xFTl9PRl9NQUNfVEFCTEU+TUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAorI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEhISEKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQJICAgICAgICAgICAgMworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LCSAgICAgICAgICAgIChNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lEKk1BWF9NQlNTSURfTlVNKQorI2RlZmluZSBNQVhfTlVNX09GX0VWRU5UICAgICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfRVZFTlQKKyNkZWZpbmUgV0RTX0xJTktfU1RBUlRfV0NJRAkJCQkoTUFYX0xFTl9PRl9NQUNfVEFCTEUtMSkKKworI2RlZmluZSBOVU1fT0ZfVElECQkJOAorI2RlZmluZSBNQVhfQUlEX0JBICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKQkgLy9CbG9jayBBQ0sgcmVjaXBpZW50CisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yCisjZGVmaW5lIE1BWF9MRU5fT0ZfQlNTX1RBQkxFICAgICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNCQkJIDUxMgorCisvLyBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucworI2RlZmluZSBTSEFSRV9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50CisjZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0ICAgIC8vIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZSBHUk9VUF9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUE1LX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisjZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgLy8gTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfQlVGRkVSICAgICAgICAgIDIwNDgKKworLy8gcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgUFdSX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBXUl9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJCQkvL01JTU8gcG93ZXIgc2F2ZQorCisvLyBBdXRoIGFuZCBBc3NvYyBtb2RlIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFVVEhfTU9ERV9LRVkgICAgICAgICAgICAgICAgICAgMHgwMQorCisvLyBCU1MgVHlwZSBkZWZpbml0aW9ucworI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vID0gTmRpczgwMl8xMUlCU1MKKyNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxICAvLyA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZQorI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8vID0gTmRpczgwMl8xMUF1dG9Vbmtub3duCisjZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMyAgLy8gPSBOZGlzODAyXzExTW9uaXRvcgorCisKKy8vIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIFJFQVNPTl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRUFTT05fVU5TUEVDSUZZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU09OX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkcgICAgICAgMworI2RlZmluZSBSRUFTT05fRElTQVNTT0NfSU5BQ1RJVkUgICAgICAgIDQKKyNkZWZpbmUgUkVBU09OX0RJU0FTU1BDX0FQX1VOQUJMRSAgICAgICA1CisjZGVmaW5lIFJFQVNPTl9DTFMyRVJSICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUFTT05fQ0xTM0VSUiAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HICAgICA4CisjZGVmaW5lIFJFQVNPTl9TVEFfUkVRX0FTU09DX05PVF9BVVRIICAgOQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9JRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJFQVNPTl9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVBU09OXzRfV0FZX1RJTUVPVVQgICAgICAgICAgICAxNQorI2RlZmluZSBSRUFTT05fR1JPVVBfS0VZX0hTX1RJTUVPVVQgICAgIDE2CisjZGVmaW5lIFJFQVNPTl9JRV9ESUZGRVJFTlQgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVBU09OX01DSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOAorI2RlZmluZSBSRUFTT05fVUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE5CisjZGVmaW5lIFJFQVNPTl9BS01QX05PVF9WQUxJRCAgICAgICAgICAgMjAKKyNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVF9SU05FX1ZFUiAgICAgICAyMQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9SU05FX0NBUCAgICAgICAgIDIyCisjZGVmaW5lIFJFQVNPTl84MDIxWF9BVVRIX0ZBSUwgICAgICAgICAgMjMKKyNkZWZpbmUgUkVBU09OX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCAgICAyNAorI2RlZmluZSBSRUFTT05fREVDTElORUQgICAgICAgICAgICAgICAgIDM3CisKKyNkZWZpbmUgUkVBU09OX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJFQVNPTl9RT1NfTEFDS19CQU5EV0lEVEggICAgICAgICAzMworI2RlZmluZSBSRUFTT05fUE9PUl9DSEFOTkVMX0NPTkRJVElPTiAgICAgMzQKKyNkZWZpbmUgUkVBU09OX1FPU19PVVRTSURFX1RYT1BfTElNSVRJT04gIDM1CisjZGVmaW5lIFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1MgICAgICAzNgorI2RlZmluZSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTSAgICAgMzcKKyNkZWZpbmUgUkVBU09OX1FPU19NRUNIX1NFVFVQX1JFUVVJUkVEICAgIDM4CisjZGVmaW5lIFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUICAgICAgICAzOQorI2RlZmluZSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVCAgICAgNDUKKworLy8gU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUxNRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1MTUVfVU5TUEVDSUZZX0ZBSUwgICAgICAgICAgICAgMQorI2RlZmluZSBNTE1FX0NBTk5PVF9TVVBQT1JUX0NBUCAgICAgICAgIDEwCisjZGVmaW5lIE1MTUVfUkVBU1NPQ19ERU5ZX0FTU09DX0VYSVNUICAgMTEKKyNkZWZpbmUgTUxNRV9BU1NPQ19ERU5ZX09VVF9TQ09QRSAgICAgICAxMgorI2RlZmluZSBNTE1FX0FMR19OT1RfU1VQUE9SVCAgICAgICAgICAgIDEzCisjZGVmaW5lIE1MTUVfU0VRX05SX09VVF9PRl9TRVFVRU5DRSAgICAgMTQKKyNkZWZpbmUgTUxNRV9SRUpfQ0hBTExFTkdFX0ZBSUxVUkUgICAgICAxNQorI2RlZmluZSBNTE1FX1JFSl9USU1FT1VUICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfVU5BQkxFX0hBTkRMRV9TVEEgIDE3CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX0RBVEFfUkFURSAgICAgICAgICAxOAorCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFICAgICAgICAyMgorI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURV9QQkNDICAgMjMKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fQ0NLX09GRE0gICAgICAgIDI0CisKKyNkZWZpbmUgTUxNRV9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1MTUVfUkVRVUVTVF9ERUNMSU5FRCAgICAgICAgICAgICAzNworI2RlZmluZSBNTE1FX1JFUVVFU1RfV0lUSF9JTlZBTElEX1BBUkFNICAgMzgKKyNkZWZpbmUgTUxNRV9ETFNfTk9UX0FMTE9XX0lOX1FCU1MgICAgICAgIDQ4CisjZGVmaW5lIE1MTUVfREVTVF9TVEFfTk9UX0lOX1FCU1MgICAgICAgICA0OQorI2RlZmluZSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEEgICAgICAgNTAKKworI2RlZmluZSBNTE1FX0lOVkFMSURfRk9STUFUICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgTUxNRV9GQUlMX05PX1JFU09VUkNFICAgICAgICAgICAweDUyCisjZGVmaW5lIE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1QgICAgICAgMHg1MworI2RlZmluZSBNTE1FX01BQ19UQUJMRV9GQUlMICAgICAgICAgICAgIDB4NTQKKworLy8gSUUgY29kZQorI2RlZmluZSBJRV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVfU1VQUF9SQVRFUyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElFX0ZIX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRV9EU19QQVJNICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSUVfQ0ZfUEFSTSAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElFX1RJTSAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRV9JQlNTX1BBUk0gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvLyA4MDIuMTFkCisjZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMiAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgICAgICAzMiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MiAgICAvLyA4MDIuMTFnCisjZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NiAgICAvLyA4MDIuMTFlIGQ2CisjZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MSAgICAvLyA4MDIuMTFrIGQ2CisjZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyA4MDIuMTFpIGQzLjAKKyNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyBXUEEyCisjZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5ICAgIC8vIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuCisjZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLy8gODAyLjExbgorI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorCisKKy8vIEZvciA4MDIuMTFuIEQzLjAzCisvLyNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0CisjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8vIDgwMi4xMW4gRDMuMDMJU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQKKyNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyICAgIC8vIDgwMi4xMW4gRDMuMC4zCisjZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MyAgICAvLyA4MDIuMTFuIEQzLjAzCisjZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NCAgICAvLyA4MDIuMTFuIEQzLjAzCisjZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNyAgIC8vIDgwMi4xMW4gRDMuMDMKKworCisjZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxICAgLy8gV1BBCisjZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxICAgLy8gV2lmaSBXTU0gKFdNRSkKKworI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MiAgIC8vCisjZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEgICAvLworI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyICAgLy8KKworLy8gQ0NYIGluZm9ybWF0aW9uCisjZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzICAgLy8gQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUAorI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MCAgIC8vIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxICAgLy8gQ0NYIDIuMAorI2RlZmluZSBJRV9DQ1hfVjIgICAgICAgICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OSAgIC8vIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MKKyNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYgICAvLyBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50CisjZGVmaW5lIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIICAgICAgICAgMzAKKyNkZWZpbmUgQUlST05FVF9JUEFERFJFU1NfTEVOR1RIICAgICAgICAxMAorI2RlZmluZSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSCAgICAgIDI0CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMKKyNkZWZpbmUgQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAxCisjZGVmaW5lIEFVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgMgorI2RlZmluZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgICAgIDMKKyNkZWZpbmUgU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgICA0CisjZGVmaW5lIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgNQorI2RlZmluZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDYKKyNkZWZpbmUgTEVBUF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICA3CisjZGVmaW5lIEFJUk9ORVRfU1RBVEVfTUFDSElORSAgICAgICAgICAgOAorI2RlZmluZSBBQ1RJT05fU1RBVEVfTUFDSElORSAgICAgICAgICAgOQorCisvLyBBUCBNTE1FIHN0YXRlIG1hY2hpbmVzCisjZGVmaW5lIEFQX0FTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgMTEKKyNkZWZpbmUgQVBfQVVUSF9TVEFURV9NQUNISU5FICAgICAgICAgICAxMgorI2RlZmluZSBBUF9BVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgIDEzCisjZGVmaW5lIEFQX1NZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTQKKyNkZWZpbmUgQVBfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgICAxNQorI2RlZmluZSBBUF9XUEFfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE2CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyNkZWZpbmUgRExTX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgICAyNgorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvLworLy8gU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBDTlRMX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ05UTF9XQUlUX0RJU0FTU09DICAgICAgICAgICAgICAxCisjZGVmaW5lIENOVExfV0FJVF9KT0lOICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDTlRMX1dBSVRfUkVBU1NPQyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ05UTF9XQUlUX1NUQVJUICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENOVExfV0FJVF9BVVRIICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBDTlRMX1dBSVRfQVNTT0MgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ05UTF9XQUlUX0FVVEgyICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENOVExfV0FJVF9PSURfTElTVF9TQ0FOICAgICAgICAgOAorI2RlZmluZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DICAgICAgICAgIDkKKworI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQorI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCisjZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBNVDJfTUxNRV9ST0FNSU5HX1JFUSAgICAgICAgICAgIDUyCisKKyNkZWZpbmUgQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAxCisKKy8vCisvLyBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElTQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEFTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfUkVBU1NPQ19SRVEgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SU1AgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9ESVNBU1NPQ19USU1FT1VUICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX1JFQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAxMAorI2RlZmluZSBNQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FTU09DX1NUQVRFICogTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUNUX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfQUNUX1NUQVRFICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorCisvL1Rob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4KKy8vQ2F0ZWdvcnkKKyNkZWZpbmUgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9RT1NfQ0FURSAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfQ0FURSAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0JBX0NBVEUgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9QVUJMSUNfQ0FURSAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX1JNX0NBVEUgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKKyNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfTUxNRV9BRERfQkFfQ0FURSAgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTVQyX01MTUVfUU9TX0NBVEUgICAgICAgICAgICAgIDExCisjZGVmaW5lIE1UMl9NTE1FX0RMU19DQVRFICAgICAgICAgICAgIDEyCisjZGVmaW5lIE1UMl9BQ1RfSU5WQUxJRCAgICAgICAgICAgICAxMworI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAorCisvL0NhdGVnb3J5IGZpZWxkCisjZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCisjZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKKyNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgorI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKKyNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0CisjZGVmaW5lIENBVEVHT1JZX1JNCQkJNQorI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKKworCisvLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KKyNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAorI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQorI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgorCisvL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQorI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKKyNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAorI2RlZmluZSBTUEVDX1RQQ1JRCTIKKyNkZWZpbmUgU1BFQ19UUENSUAkzCisjZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAorCisKKy8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBBRERCQV9SRVEJMAorI2RlZmluZSBBRERCQV9SRVNQCTEKKyNkZWZpbmUgREVMQkEgICAyCisKKy8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCisjZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCisjZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcgIAkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCisKKworLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCisjZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAorI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKKyNkZWZpbmUgUFNNUF9BQ1RJT04gICAJCQkJCTIKKyNkZWZpbmUgU0VUUENPX0FDVElPTgkJCQkJMworI2RlZmluZSBNSU1PX0NIQV9NRUFTVVJFX0FDVElPTgkJCTQKKyNkZWZpbmUgTUlNT19OX0JFQUNPTkZPUk0JCQkJNQorI2RlZmluZSBNSU1PX0JFQUNPTkZPUk0JCQkJCTYKKyNkZWZpbmUgQU5URU5OQV9TRUxFQ1QJCQkJCTcKKyNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4CisKKyNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKKy8vCisvLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKKworLy8KKy8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQorCisvLworLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFNZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9TQ0FOX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfSk9JTl9SRVEgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX1NUQVJUX1JFUSAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FUSU0gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfU0NBTl9USU1FT1VUICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX0JFQUNPTl9USU1FT1VUICAgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9BVElNX1RJTUVPVVQgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQorCisvL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgRExTX0lETEUJCQkJCQkwCisjZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKKworI2RlZmluZSBETFNfTUFDSElORV9CQVNFCQkJCTAKKyNkZWZpbmUgTVQyX01MTUVfRExTX1JFUQkJCSAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0RMU19SRVEJCQkgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfUlNQCQkJICAgIDIKKyNkZWZpbmUgTVQyX01MTUVfRExTX1RFQVJfRE9XTgkJICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1RFQVJfRE9XTgkJICAgIDQKKyNkZWZpbmUgTUFYX0RMU19NU0cJCQkJICAgICAgICA1CisKKyNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKKworLy8KKy8vIFNUQSdzIFdQQS1QU0sgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFdQQV9QU0tfSURMRQkJCQkJMAorI2RlZmluZSBNQVhfV1BBX1BTS19TVEFURQkJCQkxCisKKyNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1dQQV9QU0tfTVNHICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUJV1BBX1BTS19GVU5DX1NJWkUJCQkJKE1BWF9XUEFfUFNLX1NUQVRFICogTUFYX1dQQV9QU0tfTVNHKQorCisvLworLy8gU1RBJ3MgQ0lTQ08tQUlST05FVCBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUlST05FVF9JRExFCQkJCQkwCisjZGVmaW5lCUFJUk9ORVRfU0NBTk5JTkcJCQkJMQorI2RlZmluZSBNQVhfQUlST05FVF9TVEFURQkJCQkyCisKKyNkZWZpbmUgQUlST05FVF9NQUNISU5FX0JBU0UJCSAgICAwCisjZGVmaW5lIE1UMl9BSVJPTkVUX01TRwkJCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX1JFUQkJICAgIDEKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9ET05FCQkgICAgMgorI2RlZmluZSBNQVhfQUlST05FVF9NU0cJCQkJICAgIDMKKworI2RlZmluZQlBSVJPTkVUX0ZVTkNfU0laRQkJCQkoTUFYX0FJUk9ORVRfU1RBVEUgKiBNQVhfQUlST05FVF9NU0cpCisKKy8vCisvLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCisKKy8vCisvLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSC1SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAoQVBfTUFYX0FVVEhfUlNQX1NUQVRFICogQVBfTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCisjZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9SRVEJCQkJMgorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JTUAkJCTMKKyNkZWZpbmUgQVBNVDJfU0NBTl9USU1FT1VUCQkJCTQKKyNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX0NOQ0wJCQk1CisjZGVmaW5lIEFQX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQorCisvLworLy8gQVAncyBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1dQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9XUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgNAorI2RlZmluZSBBUF9NQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUF9XUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChBUF9NQVhfV1BBX1BUS19TVEFURSAqIEFQX01BWF9XUEFfTVNHKQorCisjaWZkZWYgQVBDTElfU1VQUE9SVAorLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQorCisvL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQorCisvL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCisKKy8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNworCisjZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2CisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5CisjZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCisKKyNlbmRpZgkvLyBBUENMSV9TVVBQT1JUIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIEJUWVBFX01HTVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJUWVBFX0NOVEwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAyCisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUlNQICAgICAgICAgICAxCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SRVEgICAgICAgICAyCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SU1AgICAgICAgICAzCisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUkVRICAgICAgICAgICA0CisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUlNQICAgICAgICAgICA1CisjZGVmaW5lIFNVQlRZUEVfQkVBQ09OICAgICAgICAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfQVRJTSAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfRElTQVNTT0MgICAgICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX0FVVEggICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU1VCVFlQRV9ERUFVVEggICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfQUNUSU9OICAgICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX0FDVElPTl9OT19BQ0sgICAgICAgICAgICAgIDE0CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfV1JBUFBFUiAgICAgICAJNworI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDS19SRVEgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDSyAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1BTX1BPTEwgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9SVFMgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfQ1RTICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDSyAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9DRkVORCAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkRfQ0ZBQ0sgICAgICAgICAxNQorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0sgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMICAgMworI2RlZmluZSBTVUJUWVBFX05VTExfRlVOQyAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX0NGQUNLICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0NGUE9MTCAgICAgICAgICAgICAgNgorI2RlZmluZSBTVUJUWVBFX0NGQUNLX0NGUE9MTCAgICAgICAgNworI2RlZmluZSBTVUJUWVBFX1FEQVRBICAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGUE9MTCAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDS19DRlBPTEwgIDExCisjZGVmaW5lIFNVQlRZUEVfUU9TX05VTEwgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDSyAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZQT0xMICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLX0NGUE9MTCAgICAxNQorCisvLyBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUKKyNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAgIC8vIGI2OjUgPSAwMAorI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLy8gYjY6NSA9IDAxCisjZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwICAvLyBiNjo1ID0gMTAKKyNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAgIC8vIGI2OjUgPSAxMQorCisvLworLy8gcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIExFTkdUSF84MDJfMTEgICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0FORF9IICAgICAgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkNfSCAgICAgICAgIDM0CisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDICAgICAgICAgICAyOAorI2RlZmluZSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8zICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIExFTkdUSF84MDJfM19UWVBFICAgICAgICAgICAyCisjZGVmaW5lIExFTkdUSF84MDJfMV9IICAgICAgICAgICAgICA4CisjZGVmaW5lIExFTkdUSF9FQVBPTF9IICAgICAgICAgICAgICA0CisjZGVmaW5lIExFTkdUSF9XTU1RT1NfSAkJCQkyCisjZGVmaW5lIExFTkdUSF9DUkMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9TRVFfTlVNQkVSICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgTEVOR1RIXzgwMl8zX05PX1RZUEUJCTEyCisjZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNCAvKiBWTEFOIHJlbGF0ZWQgKi8KKworLy8gU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQKKyNkZWZpbmUgVFhfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfUkVTVUxUX1pFUk9fTEVOR1RIICAgICAgIDEKKyNkZWZpbmUgVFhfUkVTVUxUX1VOREVSX1JVTiAgICAgICAgIDIKKyNkZWZpbmUgVFhfUkVTVUxUX09IWV9FUlJPUiAgICAgICAgIDQKKyNkZWZpbmUgVFhfUkVTVUxUX1JFVFJZX0ZBSUwgICAgICAgIDYKKworLy8gQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhECisvLyBQcmVhbWJsZSBNT0RFIGluIFR4RAorI2RlZmluZSBNT0RFX0NDSwkwCisjZGVmaW5lIE1PREVfT0ZETSAgIDEKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgTU9ERV9IVE1JWAkyCisjZGVmaW5lIE1PREVfSFRHUkVFTkZJRUxECTMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKy8vIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8vIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDcKKy8vIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwICAgLy8gbGVnYWN5IE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMyAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNyAvLyBPRkRNCisvLyBIVAorI2RlZmluZSBNQ1NfMAkJMAkvLyAxUworI2RlZmluZSBNQ1NfMQkJMQorI2RlZmluZSBNQ1NfMgkJMgorI2RlZmluZSBNQ1NfMwkJMworI2RlZmluZSBNQ1NfNAkJNAorI2RlZmluZSBNQ1NfNQkJNQorI2RlZmluZSBNQ1NfNgkJNgorI2RlZmluZSBNQ1NfNwkJNworI2RlZmluZSBNQ1NfOAkJOAkvLyAyUworI2RlZmluZSBNQ1NfOQkJOQorI2RlZmluZSBNQ1NfMTAJCTEwCisjZGVmaW5lIE1DU18xMQkJMTEKKyNkZWZpbmUgTUNTXzEyCQkxMgorI2RlZmluZSBNQ1NfMTMJCTEzCisjZGVmaW5lIE1DU18xNAkJMTQKKyNkZWZpbmUgTUNTXzE1CQkxNQorI2RlZmluZSBNQ1NfMTYJCTE2CS8vIDMqMworI2RlZmluZSBNQ1NfMTcJCTE3CisjZGVmaW5lIE1DU18xOAkJMTgKKyNkZWZpbmUgTUNTXzE5CQkxOQorI2RlZmluZSBNQ1NfMjAJCTIwCisjZGVmaW5lIE1DU18yMQkJMjEKKyNkZWZpbmUgTUNTXzIyCQkyMgorI2RlZmluZSBNQ1NfMjMJCTIzCisjZGVmaW5lIE1DU18zMgkJMzIKKyNkZWZpbmUgTUNTX0FVVE8JCTMzCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIE9JRF9IVFBIWU1PREUKKy8vIE1PREUKKyNkZWZpbmUgSFRNT0RFX01NCTAKKyNkZWZpbmUgSFRNT0RFX0dGCTEKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETQorI2RlZmluZSBGSVhFRF9UWE1PREVfSFQJCTAKKyNkZWZpbmUgRklYRURfVFhNT0RFX0NDSwkxCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9PRkRNIAkyCisvLyBCVworI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAorI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAorI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKKyNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAorLy8gU1RCQworI2RlZmluZSBTVEJDX05PTkUJMAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5CisjZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCisjZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQorLy8gTUNTIEZFRURCQUNLCisjZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCisjZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAorI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjaworI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjaworCisvLyBNSU1PIHBvd2VyIHNhZmUKKyNkZWZpbmUJTU1QU19TVEFUSUMJMAorI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKKyNkZWZpbmUgICBNTVBTX1JTVgkJMgorI2RlZmluZSBNTVBTX0VOQUJMRQkJMworCisKKy8vIEEtTVNEVSBzaXplCisjZGVmaW5lCUFNU0RVXzAJMAorI2RlZmluZQlBTVNEVV8xCQkxCisKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTUNTIHVzZSA3IGJpdHMKKyNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAorI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKKyNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgorI2RlZmluZSBSQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKKyNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURSAgICAgICAgCVJBVEVfNTQKKyNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKKy8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQorI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKKyNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisKKy8vIHBUeFdJLT50eG9wCisjZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCisjZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCisKKy8vIHBUeEQtPlJldHJ5TW9kZQorI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAorCisvLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKKyNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMworI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQorI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMworI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAorI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0CisjZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQorI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3CisKKyNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCisjZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAorI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDExCisKKy8vIHBUeEQtPkNpcGhlckFsZworI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgorI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQorI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgorI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKyNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKKyNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCisjZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgorI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKKyNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCisjZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgorI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRworCisvLyBMRUQgU3RhdHVzLgorI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgorI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMworI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgorI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTQorI2RlZmluZSBMRURfTU9ERV9ERUZBVUxUICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTU9ERV9UV09fTEVECQkJMQorI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAorCisvLyBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUAorI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiAgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEICAgICAxCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAyCisKKyNkZWZpbmUgUEFJUldJU0VfS0VZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1JPVVBfS0VZICAgICAgICAgICAgICAgICAgIDIKKworLy9kZWZpbml0aW9uIG9mIERSUworI2RlZmluZSBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSAkzMgorCisKKy8vIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UKKyNkZWZpbmUgTUFYX05VTV9PRl9GUkVFX05ESVNfUEFDS0VUIDEyOAorCisvL0Jsb2NrIEFDSworI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUICAgMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUICAgMzAKKworLy8gZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvcgorI2RlZmluZSBJX1JFQ0lQSUVOVCAgICAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgSV9PUklHSU5BVE9SICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgREVGQVVMVF9CQlBfVFhfUE9XRVIgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRl9UWF9QT1dFUiAgICAgICAgIDUKKworI2RlZmluZSBNQVhfSU5JX0JVRkZFUl9TSVpFCQkJNDA5NgorI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCisJCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQorCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAorLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQorI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQorLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQorCisjaWZkZWYgUlRfQklHX0VORElBTgorI2RlZmluZSBESVJfUkVBRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBESVJfV1JJVEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWVBFX1JYRCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYSU5GTwkJCQkJMAorI2RlZmluZSBUWVBFX1JYSU5GTwkJCQkJMQorI2RlZmluZSBUWVBFX1RYV0kJCQkJCTAKKyNkZWZpbmUgVFlQRV9SWFdJCQkJCQkxCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50CisjZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgorI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKKyNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKKyNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKKyNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKKy8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09CisKKy8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKKyNkZWZpbmUgUlNTSV8wCQkJCQkwCisjZGVmaW5lIFJTU0lfMQkJCQkJMQorI2RlZmluZSBSU1NJXzIJCQkJCTIKKworLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KKyNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisjZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAorI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAorCisvL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCisjZGVmaW5lICBTTEVFUENJRAkweDExCisjZGVmaW5lICBXQUtFQ0lECTB4MjIKKyNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMworI2RlZmluZSAgT1dORVJNQ1UJMHgxCisjZGVmaW5lICBPV05FUkNQVQkweDAKKworLy8gTUJTU0lEIGRlZmluaXRpb24KKyNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKKworCisvKiBBZnRlciBMaW51eCAyLjYuOSwKKyAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KKyAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKKyAqIHJlZiB0byBpcF9zYWJvdGFnZV9vdXQoKSBbIG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiBdIGluIGJyX25ldGZpbHRlci5jCisgKgorICogRm9yIHRoaXMgcmVhc29uLCB3ZSBNVVNUIHVzZSBFVkVOIHZhbHVlIGluIHByaXZfZmxhZ3MKKyAqLworI2RlZmluZSBJTlRfTUFJTiAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElOVF9NQlNTSUQgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSU5UX1dEUyAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJTlRfQVBDTEkgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElOVF9NRVNIICAgICAgICAgICAgICAgICAgIAkweDA1MDAKKworLy8gVXNlIGJpdG1hcCB0byBhbGxvdyBjb2V4aXN0IG9mIEFURV9UWEZSQU1FIGFuZCBBVEVfUlhGUkFNRShpLmUuLHRvIHN1cHBvcnQgTG9vcEJhY2sgbW9kZSkKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCisjZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKKyNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgorI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCisjZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhGUkFNRSAgICAgCQkJMHgwMCAgIC8vIFRyYW5zbWl0IEZyYW1lcworI2RlZmluZQlCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFAgICAgMHg4MCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQgb3IgQ2FycmllciBTdXBwcmVzc2lvbgorI2RlZmluZQlCQlAyMl9UWENBUlIgICAgICAgICAgICAgICAgMHhjMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQkJQMjRfVFhDT05UICAgICAgICAgICAgICAgIDB4MDAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUJCUDI0X0NBUlJTVVBQICAgICAgICAgICAgICAweDAxICAgLy8gQ2FycmllciBTdXBwcmVzc2lvbgorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisvLyBXRVAgS2V5IFRZUEUKKyNkZWZpbmUgV0VQX0hFWEFERUNJTUFMX1RZUEUgICAgMAorI2RlZmluZSBXRVBfQVNDSUlfVFlQRSAgICAgICAgICAxCisKKworCisvLyBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogTWF4IG51bWJlciBvZiBjaGFyIGluIGN1c3RvbSBldmVudCwgcmVmZXIgdG8gd2lyZWxlc3NfdG9vbHMuMjgvd2lyZWxlc3MuMjAuaCAqLworI2RlZmluZSBJV19DVVNUT01fTUFYX0xFTgkJCQkgIAkJCTI1NQkvKiBJbiBieXRlcyAqLworCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMgorI2RlZmluZQlJV19BR0VPVVRfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAJMHgwMjAzCisjZGVmaW5lCUlXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lCUlXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lCUlXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgCQkJMHgwMjA2CisjZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNworI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAorI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQorI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCisjZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgorI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQworI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAorI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQorI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgorI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCisjZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCisjZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCisvLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKKworLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCisjZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKKyNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKKyNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMworI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0CisjZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1CisjZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2CisjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKKyNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKKyNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKKy8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCisKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKKyNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKKyNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCisjZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0CisjZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKKyNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKKy8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQKKworLy8gRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeQorI2RlZmluZQlNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZICAgMQorI2RlZmluZQlNQVhfTlVNX09GX0RMU19FTlRSWSAgICAgICAgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkKKworLy9CbG9jayBBQ0sgLCBydDI4NjAsIGthdGh5CisjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGCQk2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUCQkzMAorI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQJCTMwCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIE1BWF9CQVJFQ0lfU0VTU0lPTgkJOAorI2VuZGlmCisKKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLworI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRSAgIAkJMzIKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKKyNkZWZpbmUgTUNBU1RfQ0NLCQkxCisjZGVmaW5lIE1DQVNUX09GRE0JCTIKKyNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKy8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KKyNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKKyNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCisjZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKKyNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMworLy8gLS0KKworCisvLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKKyNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCisjZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCisKKy8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCisjZGVmaW5lIFNXQVAxNih4KSBcCisgICAgKChVSU5UMTYpKCBcCisgICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQorCisjZGVmaW5lIFNXQVAzMih4KSBcCisgICAgKChVSU5UMzIpKCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisKKyNkZWZpbmUgU1dBUDY0KHgpIFwKKyAgICAoKFVJTlQ2NCkoIFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCisjZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisKKyNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgorCisjZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisKKyNlbmRpZiAgLy8gUlRfQklHX0VORElBTgorCisjZW5kaWYgIC8vIF9fUlRNUF9ERUZfSF9fCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX3R5cGUuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBQYXVsIExpbiAgICAxLTItMjAwNAorKi8KKyNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCisjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXworCisjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQorLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVSU5UNjQ7Cit0eXBlZGVmIGludAkJCQkJSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAJCQlJTlQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCQlQVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKK3R5cGVkZWYgaW50CSoJCQkJCVBJTlQzMjsKK3R5cGVkZWYgbG9uZyBsb25nICogCQkJUElOVDY0OworCit0eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0CQlTSE9SVDsKK3R5cGVkZWYgc2lnbmVkIGludAkJCUlOVDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUxPTkdMT05HOworCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJQk9PTEVBTjsKK3R5cGVkZWYgdm9pZAkJCQlWT0lEOworCit0eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKK3R5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwordHlwZWRlZiBVQ0hBUiAqIAkJCVBVQ0hBUjsKK3R5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwordHlwZWRlZiBMT05HICoJCQkJUExPTkc7Cit0eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwordHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CU5ESVNfTUVESUFfU1RBVEU7CisKK3R5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQgTG93UGFydDsKKyAgICAgICAgSU5UMzIgSGlnaFBhcnQ7CisgICAgfSB1OworICAgIElOVDY0IFF1YWRQYXJ0OworfSBMQVJHRV9JTlRFR0VSOworCisjZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmMjVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCisjZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUeFB3cjsKKwlVSU5UOCBMaW5rTWFyZ2luOworfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCit7CisJVUlOVDggQ2hTd01vZGU7CisJVUlOVDggQ2hhbm5lbDsKKwlVSU5UOCBDaFN3Q250OworfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggUmV2MTo0OworCQlVSU5UOCBSZXBvcnQ6MTsKKwkJVUlOVDggUmVxdWVzdDoxOworCQlVSU5UOCBFbmFibGU6MTsKKwkJVUlOVDggUmV2MDoxOworCX0gZmllbGQ7CisjZWxzZQorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjA6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJldjE6NDsKKwl9IGZpZWxkOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVSU5UOCB3b3JkOworfSBNRUFTVVJFX1JFUV9NT0RFLCAqUE1FQVNVUkVfUkVRX01PREU7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVEKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworfSBNRUFTVVJFX1JFUSwgKlBNRUFTVVJFX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUV9JTkZPCit7CisJVUlOVDggVG9rZW47CisJTUVBU1VSRV9SRVFfTU9ERSBSZXFNb2RlOworCVVJTlQ4IFJlcVR5cGU7CisJTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKK30gTUVBU1VSRV9SRVFfSU5GTywgKlBNRUFTVVJFX1JFUV9JTkZPOworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjozOworCQlVSU5UOCBVbm1lYXN1cmU6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBCU1M6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBCU1M6MTsKKwkJVUlOVDggT2ZkbVByZWFtYmxlOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBSYWRhcjoxOworCQlVSU5UOCBVbm1lYXN1cmU6MTsKKwkJVUlOVDggUmV2OjM7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQLCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKK30gTUVBU1VSRV9CQVNJQ19SRVBPUlQsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9DQ0FfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBDQ0FfQnVzeV9GcmFjdGlvbjsKK30gTUVBU1VSRV9DQ0FfUkVQT1JULCAqUE1FQVNVUkVfQ0NBX1JFUE9SVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JQSV9SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCVVJTlQ4IFJQSV9EZW5zaXR5WzhdOworfSBNRUFTVVJFX1JQSV9SRVBPUlQsICpQTUVBU1VSRV9SUElfUkVQT1JUOworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERQoreworCXN0cnVjdCBQQUNLRUQKKwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlVSU5UOCBSZXY6NTsKKwkJVUlOVDggUmVmdXNlZDoxOworCQlVSU5UOCBJbmNhcGFibGU6MTsKKwkJVUlOVDggTGF0ZToxOworI2Vsc2UKKwkJVUlOVDggTGF0ZToxOworCQlVSU5UOCBJbmNhcGFibGU6MTsKKwkJVUlOVDggUmVmdXNlZDoxOworCQlVSU5UOCBSZXY6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJfSBmaWVsZDsKKwlVSU5UOCB3b3JkOworfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKwlVSU5UOCBSZXBvcnRUeXBlOworCVVJTlQ4IE9jdGVjdFswXTsKK30gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KK3sKKwlVSU5UOCBRdWlldENudDsKKwlVSU5UOCBRdWlldFBlcmlvZDsKKwlVSU5UOCBRdWlldER1cmF0aW9uOworCVVJTlQ4IFF1aWV0T2Zmc2V0OworfSBRVUlFVF9JTkZPLCAqUFFVSUVUX0lORk87CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IE1lYXN1cmVDaCwKKwlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbyk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisJCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVDaFN3QW5uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2gpOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBUcGNSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwUkEsCisJSU4gUFVDSEFSIHBUQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBDaGFubmVsKTsKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E0ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaApAQCAtMCwwICsxLDk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXNwZWN0cnVtX2RlZi5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaWZuZGVmIF9fU1BFQ1RSVU1fREVGX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0RFRl9IX18KKworI2RlZmluZSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUJCTMKKyNkZWZpbmUgTUFYX0hBU0hfTUVBU1VSRV9SRVFfVEFCX1NJWkUJTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCisKKyNkZWZpbmUgTUFYX1RQQ19SRVFfVEFCX1NJWkUJCQkzCisjZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCisKKyNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KKworI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKKyNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCisKKyNkZWZpbmUgUk1fQkFTSUMJCQkJMAorI2RlZmluZSBSTV9DQ0EJCQkJCTEKKyNkZWZpbmUgUk1fUlBJX0hJU1RPR1JBTQkJMgorCisjZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkJLyogbXMgKi8KKyNkZWZpbmUgTVFfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisKKyNkZWZpbmUgVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoX0RpYWxvZ1Rva2VuKQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFKQorI2RlZmluZSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJCSgoX0RpYWxvZ1Rva2VuKSAlIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwordHlwZWRlZiBzdHJ1Y3QgX01FQVNVUkVfUkVRX0VOVFJZCit7CisJc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTglWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlVSU5UOCBNZWFzdXJlRGlhbG9nVG9rZW5bM107CS8vIDA6YmFzaWMgbWVhc3VyZSwgMTogQ0NBIG1lYXN1cmUsIDI6IFJQSV9IaXN0b2dyYW0gbWVhc3VyZS4KK30gTUVBU1VSRV9SRVFfRU5UUlksICpQTUVBU1VSRV9SRVFfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBNRUFTVVJFX1JFUV9FTlRSWSBIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKKwlNRUFTVVJFX1JFUV9FTlRSWSBDb250ZW50W01BWF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Cit9IE1FQVNVUkVfUkVRX1RBQiwgKlBNRUFTVVJFX1JFUV9UQUI7CisKK3R5cGVkZWYgc3RydWN0IF9UUENfUkVRX0VOVFJZCit7CisJc3RydWN0IF9UUENfUkVRX0VOVFJZICpwTmV4dDsKKwlVTE9ORyBsYXN0VGltZTsKKwlCT09MRUFOIFZhbGlkOworCVVJTlQ4IERpYWxvZ1Rva2VuOworfSBUUENfUkVRX0VOVFJZLCAqUFRQQ19SRVFfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9UUENfUkVRX1RBQgoreworCVVDSEFSIFNpemU7CisJUFRQQ19SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFXTsKKwlUUENfUkVRX0VOVFJZIENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOworfSBUUENfUkVRX1RBQiwgKlBUUENfUkVRX1RBQjsKKworI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNGExOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fpcm9uZXQuYwpAQCAtMCwwICsxLDEzMTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorCVBhcmFtZXRlcnM6CisJCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JU1RBVEVfTUFDSElORQkJKlMsCisJT1VUCVNUQVRFX01BQ0hJTkVfRlVOQwlUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9BSVJPTkVUX1NUQVRFLCBNQVhfQUlST05FVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUlST05FVF9JRExFLCBBSVJPTkVUX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfSURMRSwgTVQyX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRNc2dBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRSZXF1ZXN0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9TQ0FOTklORywgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRSZXBvcnRBY3Rpb24pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKwkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKwkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCisJCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgorCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgorCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCisJUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0TXNnQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlVU0hPUlQJCQkJCQkJTGVuZ3RoOworCVVDSEFSCQkJCQkJCUluZGV4LCBpOworCVBVQ0hBUgkJCQkJCQlwRGF0YTsKKwlQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCQlwUk1SZXE7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXFFbGVtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tLS0+IEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKKworCS8vIDAuIEdldCBBaXJvbmV0IElBUFAgaGVhZGVyIGZpcnN0CisJcFJNUmVxID0gKFBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisJcERhdGEgID0gKFBVQ0hBUikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKKworCS8vIDEuIENoYW5nZSBlbmRpYW4gZm9ybWF0IGZvcm0gbmV0d29yayB0byBsaXR0bGUgZW5kaWFuCisJTGVuZ3RoID0gYmUyY3B1MTYocFJNUmVxLT5JQVBQLkxlbmd0aCk7CisKKwkvLyAyLjAgU2FuaXR5IGNoZWNrLCB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIENDWCAyLjAgc3VwcG9ydCBpcyBlbmFibGVkCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSAhPSBUUlVFKQorCQlyZXR1cm47CisKKwkvLyAyLjEgUmFkaW8gbWVhc3VyZW1lbnQgbXVzdCBiZSBvbgorCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLlJNRW5hYmxlICE9IDEpCisJCXJldHVybjsKKworCS8vIDIuMi4gRGVidWcgcHJpbnQgYWxsIGJpdCBpbmZvcm1hdGlvbgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgSUQgJiBMZW5ndGggJWRcbiIsIExlbmd0aCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgVHlwZSAleFxuIiwgcFJNUmVxLT5JQVBQLlR5cGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFN1YlR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5TdWJUeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBEaWFsb2cgVG9rZW4gJXhcbiIsIHBSTVJlcS0+SUFQUC5Ub2tlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgQWN0aXZhdGlvbiBEZWxheSAleFxuIiwgcFJNUmVxLT5EZWxheSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgTWVhc3VyZW1lbnQgT2Zmc2V0ICV4XG4iLCBwUk1SZXEtPk9mZnNldCkpOworCisJLy8gMy4gQ2hlY2sgSUFQUCBmcmFtZSB0eXBlLCBpdCBtdXN0IGJlIDB4MzIgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uCisJaWYgKHBSTVJlcS0+SUFQUC5UeXBlICE9IEFJUk9ORVRfSUFQUF9UWVBFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCB0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNC4gQ2hlY2sgSUFQUCBmcmFtZSBzdWJ0eXBlLCBpdCBtdXN0IGJlIDB4MDEgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uIHJlcXVlc3QuCisJLy8gICAgU2luY2Ugd2UgYXJlIGFjdGluZyBhcyBjbGllbnQgb25seSwgd2Ugd2lsbCBkaXNyZWdhcmRzIHJlcGx5IHN1YnR5cGUuCisJaWYgKHBSTVJlcS0+SUFQUC5TdWJUeXBlICE9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUVVFU1QpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIHN1YnR5cGUgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA1LiBWZXJpZnkgRGVzdGluYXRpb24gTUFDIGFuZCBTb3VyY2UgTUFDLCBib3RoIHNob3VsZCBiZSBhbGwgemVyb3MuCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLkRBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgREEgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoISBNQUNfQUREUl9FUVVBTChwUk1SZXEtPklBUFAuU0EsIFpFUk9fTUFDX0FERFIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBTQSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24sIGl0J3Mgbm90IFplcm9cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDYuIFJlaW5pdCBhbGwgcmVwb3J0IHJlbGF0ZWQgZmllbGRzCisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWYsIDIwNDgpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldCwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfTEVOX09GX0JTU19UQUJMRSk7CisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0LCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pICogNCk7CisKKwkvLyA3LiBQb2ludCB0byB0aGUgc3RhcnQgb2YgZmlyc3QgZWxlbWVudCByZXBvcnQgZWxlbWVudAorCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICAgPSBMRU5HVEhfODAyXzExICsgc2l6ZW9mKEFJUk9ORVRfSUFQUF9IRUFERVIpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZSIGxlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOworCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCAgICAgPSAweGZmOworCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ICAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxICAgICAgPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbER1cmF0aW9uID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbENoYW5uZWwgID0gMDsKKwlwQWQtPlN0YUNmZy5JQVBQVG9rZW4gICAgICAgID0gcFJNUmVxLT5JQVBQLlRva2VuOworCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCAgPSAwOworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICAgICAgPSAwOworCS8vIFJlc2V0IHRoZSBzdGF0aXN0aWNzCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSA9IDA7CisKKwlJbmRleCA9IDA7CisKKwkvLyA4LiBTYXZlIGRpYWxvZyB0b2tlbiBmb3IgcmVwb3J0CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuID0gcFJNUmVxLT5JQVBQLlRva2VuOworCisJLy8gU2F2ZSBBY3RpdmF0aW9uIGRlbGF5ICYgbWVhc3VyZW1lbnQgb2Zmc2V0LCBOb3QgcmVhbGx5IG5lZWRlZAorCisJLy8gOS4gUG9pbnQgdG8gdGhlIGZpcnN0IHJlcXVlc3QgZWxlbWVudAorCXBEYXRhICs9IHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpOworCS8vICAgIExlbmd0aCBzaG91bGQgZXhjbHVkZSB0aGUgQ0lTQ08gQWlyb25ldCBTTkFQIGhlYWRlcgorCUxlbmd0aCAtPSAoc2l6ZW9mKEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSkgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAxMC4gU3RhcnQgUGFyc2luZyB0aGUgTWVhc3VyZW1lbnQgZWxlbWVudHMuCisJLy8gICAgQmUgY2FyZWZ1bCBhYm91dCBtdWx0aXBsZSBNUiBlbGVtZW50cyB3aXRoaW4gb25lIGZyYW1lcy4KKwl3aGlsZSAoTGVuZ3RoID4gMCkKKwl7CisJCXBSZXFFbGVtID0gKFBSTV9SRVFVRVNUX0FDVElPTikgcERhdGE7CisJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uRWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6CisJCQkJLy8gRnJvbSB0aGUgZXhhbXBsZSwgaXQgc2VlbXMgd2Ugb25seSBuZWVkIHRvIHN1cHBvcnQgb25lIHJlcXVlc3QgaW4gb25lIGZyYW1lCisJCQkJLy8gVGhlcmUgaXMgbm8gbXVsdGlwbGUgcmVxdWVzdCBpbiBvbmUgZnJhbWUuCisJCQkJLy8gQmVzaWRlcywgbG9va3MgbGlrZSB3ZSBuZWVkIHRvIHRha2UgY2FyZSB0aGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBvbmx5LgorCQkJCS8vIFRoZSBtZWFzdXJlbWVudCByZXF1ZXN0IGlzIGFsd2F5cyA0IGJ5dGVzLgorCisJCQkJLy8gU3RhcnQgcGFyc2luZyB0aGlzIHR5cGUgb2YgcmVxdWVzdC4KKwkJCQkvLyAwLiBFaWQgaXMgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVAorCQkJCS8vIDEuIExlbmd0aCBkaWRuJ3QgaW5jbHVkZSBFaWQgYW5kIExlbmd0aCBmaWVsZCwgaXQgYWx3YXlzIGJlIDguCisJCQkJLy8gMi4gTWVhc3VyZW1lbnQgVG9rZW4sIHdlIG5uZWQgdG8gc2F2ZSBpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVwb3J0LgorCQkJCS8vIDMuIE1lYXN1cmVtZW50IE1vZGUsIEFsdGhvdWdoIHRoZXJlIGFyZSBkZWZpbml0aW9ucywgYnV0IHdlIGRpbid0IHNlZSB2YWx1ZSBvdGhlciB0aGFuCisJCQkJLy8gICAgMCBmcm9tIHRlc3Qgc3BlY3MgZXhhbXBsZXMuCisJCQkJLy8gNC4gTWVhc3VyZW1lbnQgVHlwZSwgdGhpcyBpcyB3aGF0IHdlIG5lZWQgdG8gZG8uCisJCQkJc3dpdGNoIChwUmVxRWxlbS0+UmVxRWxlbS5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUToKKwkJCQkJY2FzZSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX0JFQUNPTl9SRVE6CisJCQkJCQkvLyBDaGVjayB0aGUgRW5hYmxlIG5vbi1zZXJ2aW5nIGNoYW5uZWwgbWVhc3VyZW1lbnQgY29udHJvbAorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRENSTUVuYWJsZSA9PSAwKQorCQkJCQkJeworCQkJCQkJCS8vIENoZWNrIGNoYW5uZWwgYmVmb3JlIGVucXVldWUgdGhlIGFjdGlvbgorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvLyBJZiBvZmYgY2hhbm5lbCBtZWFzdXJlbWVudCwgY2hlY2sgdGhlIFRVIGR1cmF0aW9uIGxpbWl0CisJCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuRHVyYXRpb24gPiBwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLlR1TGltaXQpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gU2F2ZSByZXF1ZXN0cyBhbmQgZXhlY3V0ZSBhY3Rpb25zIGxhdGVyCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XSwgcFJlcUVsZW0sIHNpemVvZihSTV9SRVFVRVNUX0FDVElPTikpOworCQkJCQkJSW5kZXggKz0gMTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTVNSTl9UWVBFX0ZSQU1FX1JFUToKKwkJCQkJCS8vIFNpbmNlIGl0J3Mgb3B0aW9uLCB3ZSB3aWxsIHN1cHBvcnQgbGF0ZXIKKwkJCQkJCS8vIEZyYW1lUmVxdWVzdEFjdGlvbihwQWQsIHBEYXRhKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBQb2ludCB0byBuZXh0IE1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCQlwRGF0YSAgKz0gc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKTsKKwkJCQlMZW5ndGggLT0gc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKTsKKwkJCQlicmVhazsKKworCQkJLy8gV2UgYWNjZXB0IHJlcXVlc3Qgb25seSwgYWxsIG90aGVycyBhcmUgZHJvcHBlZAorCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ6CisJCQljYXNlIElFX0FQX1RYX1BPV0VSOgorCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvLyAxMS4gVXBkYXRlIHNvbWUgZmxhZ3MgYW5kIGluZGV4CisJcEFkLT5TdGFDZmcuUk1SZXFDbnQgPSBJbmRleDsKKworCWlmIChJbmRleCkKKwl7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgMCwgTlVMTCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gQWlyb25ldE1zZ0FjdGlvblxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldFJlcXVlc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCisJLy8gMS4gUG9pbnQgdG8gbmV4dCByZXF1ZXN0IGVsZW1lbnQKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJLy8gMi4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCisJCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0CisJCU5vaXNlSGlzdFJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJLy8gQmVhY29uIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQmVhY29uUmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4sIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQlyZXR1cm47CisKKwkvLyAzLiBQZWVrIGludG8gdGhlIG5leHQgcmVxdWVzdCwgaWYgaXQncyBwYXJhbGxlbCwgd2Ugd2lsbCB1cGRhdGUgdGhlIHNjYW4gdGltZSB0byB0aGUgbGFyZ2VzdCBvbmUKKwlpZiAoKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCArIDEpIDwgcEFkLT5TdGFDZmcuUk1SZXFDbnQpCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxXTsKKwkJLy8gQ2hlY2sgZm9yIHBhcmFsbGVsIGJpdAorCQlpZiAoKHBSZXEtPlJlcUVsZW0uTW9kZSAmIDB4MDEpICYmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJLy8gVXBkYXRlIHBhcmFsbGVsIG1vZGUgcmVxdWVzdCBpbmZvcm1hdGlvbgorCQkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgPSAoKHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpID8KKwkJCShwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikgOiAocEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpKTsKKwkJfQorCX0KKworCS8vIDQuIENhbGwgUlQyOFhYX01MTUVfSEFORExFUiB0byBleGVjdXRlIHRoZSByZXF1ZXN0IG1sbWUgY29tbWFuZHMsIFNjYW4gcmVxdWVzdCBpcyB0aGUgb25seSBvbmUgdXNlZAorCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIGNoYW5uZWwgbG9hZCByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisJVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpOworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKworCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7CisJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCwgQ2hhbm5lbCAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uLCBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsKSk7CisKKwkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuOworCisJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7OworCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCisJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJcE51bGxGcmFtZS0+RkMuVHlwZSAJPSBCVFlQRV9EQVRBOworCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210CT0gUFdSX1NBVkU7CisKKwkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQorCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICA9IDA7CisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIG5vaXNlIGhpc3RvZ3JhbSByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXSwgaTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKKwlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOworCisJLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKKwkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgorCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KKwkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCisJLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCisJLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCisJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKworCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQlyZXR1cm47CisKKwkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX05PSVNFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCisJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJcE51bGxGcmFtZS0+RkMuVHlwZSAgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCS8vIFJlc2V0IHRoZSBzdGF0aXN0aWNzCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSA9IDA7CisKKwkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIDB4MTAxMCk7CisKKwkvLyBTZXQgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIEJlYWNvbiByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlCZWFjb25SZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisJVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKKwlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOworCisJLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKKwkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgorCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KKwkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCisJLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCisJLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCisJaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX1BBU1NJVkUpCisJeworCQkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXNzaXZlIFNjYW4gTW9kZSFcbiIpKTsKKworCQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCQlyZXR1cm47CisKKwkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fUEFTU0lWRSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pKTsKKworCQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJCXBOdWxsRnJhbWUtPkZDLlR5cGUgICAgID0gQlRZUEVfREFUQTsKKwkJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQgID0gUFdSX1NBVkU7CisKKwkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCX0KKwllbHNlIGlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9BQ1RJVkUpCisJeworCQkvLyBBY3RpdmUgc2NhbiBNb2RlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFjdGl2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX0FDVElWRSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pKTsKKworCQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJCXBOdWxsRnJhbWUtPkZDLlR5cGUgICAgID0gQlRZUEVfREFUQTsKKwkJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQgID0gUFdSX1NBVkU7CisKKwkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCX0KKwllbHNlIGlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUpCisJeworCQkvLyBCZWFjb24gcmVwb3J0IE1vZGUsIHJlcG9ydCBhbGwgdGhlIEFQUyBpbiBjdXJyZW50IGJzcyB0YWJsZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb24gUmVwb3J0IE1vZGUhXG4iKSk7CisKKwkJLy8gQ29weSBjdXJyZW50IEJTUyB0YWJsZSB0byBDQ1ggdGFibGUsIHdlIGNhbiBvbWl0IHRoaXMgc3RlcCBsYXRlciBvbi4KKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYiwgJnBBZC0+U2NhblRhYiwgc2l6ZW9mKEJTU19UQUJMRSkpOworCisJCS8vIENyZWF0ZSBiZWFjb24gcmVwb3J0IGZyb20gQnNzIHRhYmxlCisJCUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUocEFkKTsKKworCQkvLyBTZXQgc3RhdGUgdG8gc2Nhbm5pbmcKKwkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwkJLy8gRW5xdWV1ZSByZXBvcnQgcmVxdWVzdAorCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gV3Jvbmcgc2NhbiBNb2RlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyb25nIFNjYW4gTW9kZSFcbiIpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCXBSZXE7CisJVUxPTkcJCQkJTm93MzI7CisKKyAgICBOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzMyOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAxLiBQYXJzZSBtZWFzdXJlbWVudCB0eXBlIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucworCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJLy8gQmVhY29uIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQmVhY29uUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlCisJCS8vIFVua25vd24uIERvIG5vdGhpbmcgYW5kIHJldHVybgorCQk7CisKKwkvLyAyLiBQb2ludCB0byB0aGUgY29ycmVjdCBpbmRleCBvZiBhY3Rpb24gZWxlbWVudCwgc3RhcnQgZnJvbSAwCisJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisKKwkvLyAzLiBDaGVjayBmb3IgcGFyYWxsZWwgYWN0aW9ucworCWlmIChwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9PSBUUlVFKQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCQkvLyBQcm9jZXNzIG5leHQgYWN0aW9uIHJpZ2h0IGF3YXkKKwkJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCisJCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKworCQlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgrKzsKKwl9CisKKwlpZiAocEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ID49IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJLy8gNC4gVGhlcmUgaXMgbm8gbW9yZSB1bnByb2Nlc3NlZCBtZWFzdXJlbWVudCByZXF1ZXN0LCBnbyBmb3IgdHJhbnNtaXQgdGhpcyByZXBvcnQKKwkJQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKHBBZCk7CisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisJfQorCWVsc2UKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJaWYgKHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJeworCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQl9CisKKwkJLy8gNS4gVGhlcmUgYXJlIG1vcmUgcmVxdWVzdHMgdG8gYmUgbWVhc3VyZQorCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVUNIQVIJCQkJCXBEZXN0OworCVBBSVJPTkVUX0lBUFBfSEVBREVSCXBJQVBQOworCVBIRUFERVJfODAyXzExCQkJcEhlYWRlcjsKKwlVQ0hBUgkJCQkJQWNrUmF0ZSA9IFJBVEVfMjsKKwlVU0hPUlQJCQkJCUFja0R1cmF0aW9uID0gMDsKKwlORElTX1NUQVRVUwkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcJCQkJCUZyYW1lTGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIDAuIFNldCB1cCB0aGUgZnJhbWUgcG9pbnRlciwgRnJhbWUgd2FzIGluaXRlZCBhdCB0aGUgZW5kIG9mIG1lc3NhZ2UgYWN0aW9uCisJcERlc3QgPSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBVcGRhdGUgcmVwb3J0IElBUFAgZmllbGRzCisJcElBUFAgPSAoUEFJUk9ORVRfSUFQUF9IRUFERVIpIHBEZXN0OworCisJLy8gMi4gQ29weSBDaXNjbyBTTkFQIGhlYWRlcgorCU5kaXNNb3ZlTWVtb3J5KHBJQVBQLT5DaXNjb1NuYXBIZWFkZXIsIFNOQVBfQUlST05FVCwgTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMy4gbmV0d29yayBvcmRlciBmb3IgdGhpcyAxNmJpdCBsZW5ndGgKKwlwSUFQUC0+TGVuZ3RoICA9IGNwdTJiZTE2KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuMSBzYW5pdHkgY2hlY2sgdGhlIHJlcG9ydCBsZW5ndGgsIGlnbm9yZSBpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydAorCWlmIChiZTJjcHUxNihwSUFQUC0+TGVuZ3RoKSA8PSAxOCkKKwkJcmV0dXJuOworCisJLy8gNC4gVHlwZSBtdXN0IGJlIDB4MzIKKwlwSUFQUC0+VHlwZSAgICA9IEFJUk9ORVRfSUFQUF9UWVBFOworCisJLy8gNS4gU3ViVHlwZSBmb3IgcmVwb3J0IG11c3QgYmUgMHg4MQorCXBJQVBQLT5TdWJUeXBlID0gQUlST05FVF9JQVBQX1NVQlRZUEVfUkVQT1JUOworCisJLy8gNi4gREEgaXMgbm90IHVzZWQgYW5kIG11c3QgYmUgemVybywgYWx0aG91Z2ggdGhlIHdob2xlIGZyYW1lIHdhcyBjbGVhcmVkIGF0IHRoZSBzdGFydCBvZiBmdW5jdGlvbgorCS8vICAgIFdlIHdpbGwgZG8gaXQgYWdhaW4gaGVyZS4gV2UgY2FuIHVzZSBCU1NJRCBpbnN0ZWFkCisJQ09QWV9NQUNfQUREUihwSUFQUC0+REEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIDcuIFNBIGlzIHRoZSBjbGllbnQgcmVwb3J0aW5nIHdoaWNoIG11c3QgYmUgb3VyIE1BQworCUNPUFlfTUFDX0FERFIocElBUFAtPlNBLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCS8vIDguIENvcHkgdGhlIHNhdmVkIGRpYWxvZyB0b2tlbgorCXBJQVBQLT5Ub2tlbiA9IHBBZC0+U3RhQ2ZnLklBUFBUb2tlbjsKKworCS8vIDkuIE1ha2UgdGhlIFJlcG9ydCBmcmFtZSA4MDIuMTEgaGVhZGVyCisJLy8gICAgUmV1c2UgZnVuY3Rpb24gaW4gd3BhLmMKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZjsKKwlwQWQtPlNlcXVlbmNlICsrOworCVdwYU1hY0hlYWRlckluaXQocEFkLCBwSGVhZGVyLCAwLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBBQ0sgc2l6ZQlpcyAxNCBpbmNsdWRlIENSQywgYW5kIGl0cyByYXRlCWlzIGJhc2VkIG9uIHJlYWwgdGltZSBpbmZvcm1hdGlvbgorCUFja1JhdGUgICAgID0gcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBBY2tSYXRlLCAxNCk7CisJcEhlYWRlci0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIEFja0R1cmF0aW9uOworCisJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKKworCS8vIDEwLiBQcmVwYXJlIHJlcG9ydCBmcmFtZSB3aXRoIGR5bmFtaWMgb3V0YnVmZmVyLiBKdXN0IHNpbXBseSBjb3B5IGV2ZXJ5dGhpbmcuCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWYsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gMTEuIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBDSEFOTkVMX0xPQURfUkVQT1JUCQlwTG9hZDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCUNDQUJ1c3lGcmFjdGlvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKworCS8vIDAuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCisJLy8gMS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZWxlbWVudCBmaWVsZC4KKwlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJLy8gRml4ZWQgTGVuZ3RoIGF0IDksIG5vdCBpbmNsdWRlIEVpZCBhbmQgbGVuZ3RoIGZpZWxkcworCXBSZXBvcnQtPkxlbmd0aCA9IDk7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROworCisJLy8gMi4gRmlsbCBjaGFubmVsIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTG9hZCAgPSAoUENIQU5ORUxfTE9BRF9SRVBPUlQpIHBEZXN0OworCXBMb2FkLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTG9hZC0+U3BhcmUgICAgPSAwOworCXBMb2FkLT5EdXJhdGlvbiA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuRHVyYXRpb247CisKKwkvLyAzLiBDYWxjdWxhdGUgdGhlIENDQSBCdXN5IEZyYWN0aW9uCisJLy8gICAgKEJ5dGVzICsgQUNLIHNpemUpICogOCAvIFR4IHNwZWVkICogMjU1IC8gMTAwMCAvIG1lYXN1cmVtZW50IGR1cmF0aW9uLCB1c2UgMjQgdXMgVHggc3BlZWQKKwkvLyAgICAgPSAgKEJ5dGVzICsgQUNLKSAvIDEyIC8gZHVyYXRpb24KKwkvLyAgICAgOSBpcyB0aGUgZ29vZCB2YWx1ZSBmb3IgcEFkLT5TdGFDZmcuQ0xGYWN0b3IKKwkvLyBDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDkgLyBwTG9hZC0+RHVyYXRpb24pOworCUNDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gcEFkLT5TdGFDZmcuQ0xGYWN0b3IgLyBwTG9hZC0+RHVyYXRpb24pOworCWlmIChDQ0FCdXN5RnJhY3Rpb24gPCAxMCkKKwkJCUNDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gMyAvIHBMb2FkLT5EdXJhdGlvbikgKyAxOworCisJcExvYWQtPkNDQUJ1c3kgPSBDQ0FCdXN5RnJhY3Rpb247CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ0xCdXN5Qnl0ZSAlbGQsIER1cmF0aW9uICVkLCBSZXN1bHQsICVkXG4iLCBwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcywgcExvYWQtPkR1cmF0aW9uLCBDQ0FCdXN5RnJhY3Rpb24pKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOworCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IChzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpICsgc2l6ZW9mKENIQU5ORUxfTE9BRF9SRVBPUlQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKworCS8vIDQuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA1LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7CisJUE5PSVNFX0hJU1RfUkVQT1JUCQkJcE5vaXNlOworCVBVQ0hBUgkJCQkJCXBEZXN0OworCVVDSEFSCQkJCQkJaSxOb2lzZUNudDsKKwlVU0hPUlQJCQkJCQlUb3RhbFJQSUNudCwgVG90YWxSUElTdW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBEaXNhYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uLCBtYWtlIGl0IGJhY2sgdG8gbm9ybWFsCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAvLyBTdGFpb24gbm90IGRyb3AgY29udHJvbCBmcmFtZSB3aWxsIGZhaWwgV2lGaSBDZXJ0aWZpY2F0aW9uLgorCS8vIDEuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCisJLy8gMi4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZWxlbWVudCBmaWVsZC4KKwlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJLy8gRml4ZWQgTGVuZ3RoIGF0IDE2LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSAxNjsKKwlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLk1vZGU7CisJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROworCisJLy8gMy4gRmlsbCBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IG1lYXN1cmVtZW50IGRhdGEKKwlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCXBOb2lzZSAgPSAoUE5PSVNFX0hJU1RfUkVQT1JUKSBwRGVzdDsKKwlwTm9pc2UtPkNoYW5uZWwgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5DaGFubmVsOworCXBOb2lzZS0+U3BhcmUgICAgPSAwOworCXBOb2lzZS0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCS8vIDQuIEZpbGwgTm9pc2UgaGlzdG9ncmFtLCB0aGUgdG90YWwgUlBJIGNvdW50cyBzaG91bGQgYmUgMC40ICogVFUKKwkvLyAgICBXZSBlc3RpbWF0ZSA0MDAwIG5vcm1hbCBwYWNrZXRzIHJlY2VpdmVkIGR1cm5pbmcgMTAgc2Vjb25kcyB0ZXN0LgorCS8vICAgIEFkanVzdCBpdCBpZiByZXF1aXJlZC4KKwkvLyAzIGlzIGEgZ29vZCB2YWx1ZSBmb3IgcEFkLT5TdGFDZmcuTkhGYWN0b3IKKwkvLyBUb3RhbFJQSUNudCA9IHBOb2lzZS0+RHVyYXRpb24gKiAzIC8gMTA7CisJVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogcEFkLT5TdGFDZmcuTkhGYWN0b3IgLyAxMDsKKwlUb3RhbFJQSVN1bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJVG90YWxSUElTdW0gKz0gcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlBJICVkIENvbnV0cyAlZFxuIiwgaSwgcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSkpOworCX0KKworCS8vIERvdWJsZSBjaGVjayBpZiB0aGUgY291bnRlciBpcyBsYXJnZXIgdGhhbiBvdXIgZXhwZWN0YXRpb24uCisJLy8gV2Ugd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIHRvdGFsIG51bWJlciBwbHVzIGEgZnJhY3Rpb24uCisJaWYgKFRvdGFsUlBJU3VtID4gVG90YWxSUElDbnQpCisJCVRvdGFsUlBJQ250ID0gVG90YWxSUElTdW0gKyBwTm9pc2UtPkR1cmF0aW9uIC8gMjA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUb3RhbCBSUEkgQ29udXRzICVkXG4iLCBUb3RhbFJQSUNudCkpOworCisJLy8gNS4gSW5pdGlhbGl6ZSBub2lzZSBjb3VudCBmb3IgdGhlIHRvdGFsIHN1bW1hdGlvbiBvZiAweGZmCisJTm9pc2VDbnQgPSAwOworCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisJeworCQlwTm9pc2UtPkRlbnNpdHlbaV0gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldICogMjU1IC8gVG90YWxSUElDbnQpOworCQlpZiAoKHBOb2lzZS0+RGVuc2l0eVtpXSA9PSAwKSAmJiAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAhPSAwKSkKKwkJCXBOb2lzZS0+RGVuc2l0eVtpXSsrOworCQlOb2lzZUNudCArPSBwTm9pc2UtPkRlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVslZF0gID0gMHglMDJ4XG4iLCBpLCBwTm9pc2UtPkRlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyA2LiBSUElbMF0gcmVwcmVzZW50cyB0aGUgcmVzdCBvZiBjb3VudHMKKwlwTm9pc2UtPkRlbnNpdHlbMF0gPSAweGZmIC0gTm9pc2VDbnQ7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVwb3J0ZWQgUlBJWzBdICA9IDB4JTAyeFxuIiwgcE5vaXNlLT5EZW5zaXR5WzBdKSk7CisKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihOT0lTRV9ISVNUX1JFUE9SVCkpOworCisJLy8gNy4gQ2xlYXIgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCS8vIDguIHJlc2V0IHRvIGlkbGUgc3RhdGUKKwlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVwb3J0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gTG9va3MgbGlrZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRoaW5nIG5lZWQgdG8gZG8gaGVyZS4KKwkvLyBBbGwgbWVhc3VyZW1lbnQgcmVwb3J0IGFscmVhZHkgZmluaXNoZWQgaW4gQWRkQmVhY29uUmVwb3J0CisJLy8gVGhlIGxlbmd0aCBpcyBpbiB0aGUgRnJhbWVSZXBvcnRMZW4KKworCS8vIHJlc2V0IEJlYWNvbiBpbmRleCBmb3IgbmV4dCBiZWFjb24gcmVxdWVzdAorCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCA9IDB4ZmY7CisKKwkvLyByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisJCUluZGV4CQlDdXJyZW50IEJTU0lEIGluIENDWEJzc3RhYiBlbnRyeSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUxPTkcJCQkJSW5kZXgsCisJSU4JUE1MTUVfUVVFVUVfRUxFTQlwRWxlbSkKK3sKKwlQVk9JRAkJCQkJCXBNc2c7CisJUFVDSEFSCQkJCQkJcFNyYywgcERlc3Q7CisJVUNIQVIJCQkJCQlSZXFJZHg7CisJVUxPTkcJCQkJCQlNc2dMZW47CisJVVNIT1JUCQkJCQkJTGVuZ3RoOworCVBGUkFNRV84MDJfMTEJCQkJcEZyYW1lOworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBFSURfU1RSVUNUCQkJICAgICAgICBwRWlkOworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJUEJTU19FTlRSWQkJCQkJcEJzczsKKworCS8vIDAuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwTXNnICAgPSBwRWxlbS0+TXNnOworCU1zZ0xlbiA9IHBFbGVtLT5Nc2dMZW47CisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIHBNc2c7CisJcFNyYyAgID0gcEZyYW1lLT5PY3RldDsJCQkJLy8gU3RhcnQgZnJvbSBBUCBUU0YKKwlwQnNzICAgPSAoUEJTU19FTlRSWSkgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJbmRleF07CisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJLy8gMSBDaGVjayB0aGUgSW5kZXgsIGlmIHdlIGFscmVhZHkgY3JlYXRlIHRoaXMgZW50cnksIG9ubHkgdXBkYXRlIHRoZSBhdmVyYWdlIFJTU0kKKwlpZiAoKEluZGV4IDw9IHBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCkgJiYgKHBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCAhPSAweGZmKSkKKwl7CisJCXBEZXN0ICA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdXTsKKwkJLy8gUG9pbnQgdG8gYnNzIHJlcG9ydCBpbmZvcm1hdGlvbgorCQlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKworCQkvLyBVcGRhdGUgUnggcG93ZXIsIGluIGRCbQorCQkvLyBHZXQgdGhlIG9yaWdpbmFsIFJTU0kgcmVhZGJhY2sgZnJvbSBCQlAKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciArPSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQkvLyBBdmVyYWdlIHRoZSBSc3NpIHJlYWRpbmcKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgPSAocEJlYWNvblJlcG9ydC0+UnhQb3dlciArIHBCc3MtPlJzc2kpIC8gMjsKKwkJLy8gR2V0IHRvIGRCbSBmb3JtYXQKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtPSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJzc2lkICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIsCisJCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQkJcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeFBvd2VyWyVsZF0gUnNzaSAlZCwgQXZnIFJzc2kgJWRcbiIsIEluZGV4LCAocEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpLCBwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC0gMjU2KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF0pKTsKKworCQkvLyBVcGRhdGUgb3RoZXIgaW5mb3JtYXRpb24gaGVyZQorCisJCS8vIERvbmUKKwkJcmV0dXJuOworCX0KKworCS8vIDIuIFVwZGF0ZSByZXBvcnRlZCBJbmRleAorCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCA9IEluZGV4OworCisJLy8gMy4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkvLyAgICBUaGUgb2Zmc2V0IHNob3VsZCBzdGFydCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCByZXBvcnQgZnJhbWUgaGVhZGVyLgorCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKworCS8vIDQuIFNhdmUgdGhlIHN0YXJ0IG9mZnNldCBvZiBlYWNoIEJzcyBpbiByZXBvcnQgZnJhbWUKKwlwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdID0gcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW47CisKKwkvLyA1LiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBmaWVsZHMKKwlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7CisJcFJlcG9ydC0+RWlkID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCXBSZXBvcnQtPkxlbmd0aCA9IDA7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJTGVuZ3RoICAgICAgICAgID0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJLy8gNi4gU3RhcnQgdGhlYmVhY29uIHJlcG9ydCBmb3JtYXQKKwlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwlwRGVzdCAgICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCUxlbmd0aCAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7CisKKwkvLyA3LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJcEJlYWNvblJlcG9ydC0+Q2hhbm5lbCAgICAgICAgPSBwQnNzLT5DaGFubmVsOworCXBCZWFjb25SZXBvcnQtPlNwYXJlICAgICAgICAgID0gMDsKKwlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCXBCZWFjb25SZXBvcnQtPlBoeVR5cGUgICAgICAgID0gKChwQnNzLT5TdXBSYXRlTGVuK3BCc3MtPkV4dFJhdGVMZW4gPiA0KSA/IFBIWV9FUlAgOiBQSFlfRFNTKTsKKwkvLyA4LiBSeCBwb3dlciwgaW4gZEJtCisJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgICAgICAgPSBwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJzc2lkICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIsCisJCXBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sCisJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeFBvd2VyWyVsZF0sIFJzc2kgJWRcbiIsIEluZGV4LCBwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC0gMjU2KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKworCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCUNPUFlfTUFDX0FERFIocEJlYWNvblJlcG9ydC0+QlNTSUQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5QYXJlbnRUU0YsIHBTcmMsIDQpOworCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgJnBFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGWzRdLCAmcEVsZW0tPlRpbWVTdGFtcC51LkhpZ2hQYXJ0LCA0KTsKKworCS8vIDkuIFNraXAgdGhlIGJlYWNvbiBmcmFtZSBhbmQgb2Zmc2V0IHRvIHN0YXJ0IG9mIGNhcGFiaWxpdHlpbmZvIHNpbmNlIHdlIGFscmVhZHkgcHJvY2Vzc2VkIGNhcGFiaWxpdHlpbmZvCisJcFNyYyArPSAoVElNRVNUQU1QX0xFTiArIDIpOworCXBCZWFjb25SZXBvcnQtPkNhcGFiaWxpdHlJbmZvID0gKihVU0hPUlQgKilwU3JjOworCisJLy8gMTAuIFBvaW50IHRvIHN0YXJ0IG9mIGVsZW1lbnQgSUQKKwlwU3JjICs9IDI7CisJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFNyYzsKKworCS8vIDExLiBTdGFydCBwcm9jZXNzIGFsbCB2YXJpYWJsZSBFaWQgb2F5bG9hZCBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZSB0byB0aGUgZnJhbWUgcmVwb3J0CisJd2hpbGUgKCgoUFVDSEFSKSBwRWlkICsgcEVpZC0+TGVuICsgMSkgPCAoKFBVQ0hBUikgcEZyYW1lICsgTXNnTGVuKSkKKwl7CisJCS8vIE9ubHkgbGltaXRlZCBFSUQgYXJlIHJlcXVpcmVkIHRvIHJlcG9ydCBmb3IgQ0NYIDIuIEl0IGluY2x1ZGVzIFNTSUQsIFN1cHBvcnRlZCByYXRlLAorCQkvLyBGSCBwYXJhbWVudGVyIHNldCwgRFMgcGFyYW1ldGVyIHNldCwgQ0YgcGFyYW1ldGVyIHNldCwgSUJTUyBwYXJhbWV0ZXIgc2V0LAorCQkvLyBUSU0gKHJlcG9ydCBmaXJzdCA0IGJ5dGVzIG9ubHksIHJhZGlvIG1lYXN1cmVtZW50IGNhcGFiaWxpdHkKKwkJc3dpdGNoIChwRWlkLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1NJRDoKKwkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKwkJCWNhc2UgSUVfRkhfUEFSTToKKwkJCWNhc2UgSUVfRFNfUEFSTToKKwkJCWNhc2UgSUVfQ0ZfUEFSTToKKwkJCWNhc2UgSUVfSUJTU19QQVJNOgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCQkvLyBTaW5jZSB0aGlzIElFIGlzIGR1cGxpY2F0ZWQgd2l0aCBXUEEgc2VjdXJpdHkgSUUsIHdlIGhhcyB0byBkbyBzYW5pdHkgY2hlY2sgYmVmb3JlCisJCQkJLy8gcmVjb2duaXplIGl0LgorCQkJCS8vIDEuIEl0IGFsc28gaGFzIGZpeGVkIDYgYnl0ZXMgSUUgbGVuZ3RoLgorCQkJCWlmIChwRWlkLT5MZW4gIT0gNikKKwkJCQkJYnJlYWs7CisJCQkJLy8gMi4gQ2hlY2sgdGhlIENpc2NvIEFpcm9uZXQgT1VJCisJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShDSVNDT19PVUksIChwU3JjICsgMiksIDMpKQorCQkJCXsKKwkJCQkJLy8gTWF0Y2hlZCwgdGhpcyBpcyB3aGF0IHdlIHdhbnQKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9USU06CisJCQkJaWYgKHBFaWQtPkxlbiA+IDQpCisJCQkJeworCQkJCQkvLyBNYXkgdHJ1bmNhdGUgYW5kIHJlcG9ydCB0aGUgZmlyc3QgNCBieXRlcyBvbmx5LCB3aXRoIHRoZSBlaWQgJiBsZW4sIHRvdGFsIHNob3VsZCBiZSA2CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCA2KTsKKwkJCQkJcERlc3QgICs9IDY7CisJCQkJCUxlbmd0aCArPSA2OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7CisJCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCS8vIDEyLiBNb3ZlIHRvIG5leHQgZWxlbWVudCBJRAorCQlwU3JjICs9ICgyICsgcEVpZC0+TGVuKTsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFNyYzsKKwl9CisKKwkvLyAxMy4gVXBkYXRlIHRoZSBsZW5ndGggaW4gdGhlIGhlYWRlciwgbm90IGluY2x1ZGUgRUlEIGFuZCBsZW5ndGgKKwlwUmVwb3J0LT5MZW5ndGggPSBMZW5ndGggLSA0OworCisJLy8gMTQuIFVwZGF0ZSB0aGUgZnJhbWUgcmVwb3J0IGJ1ZmZlciBkYXRhIGxlbmd0aAorCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisJCUluZGV4CQlDdXJyZW50IEJTU0lEIGluIENDWEJzc3RhYiBlbnRyeSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQpCit7CisJUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7CisJUEJFQUNPTl9SRVBPUlQJCQkJcEJlYWNvblJlcG9ydDsKKwlVQ0hBUgkJCQkJCUluZGV4LCBSZXFJZHg7CisJVVNIT1JUCQkJCQkJTGVuZ3RoOworCVBVQ0hBUgkJCQkJCXBEZXN0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBzZXR1cCBiYXNlIHBvaW50ZXIKKwlSZXFJZHggPSBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHg7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzTnI7IEluZGV4KyspCisJeworCQkvLyAxLiBTZXR1cCB0aGUgYnVmZmVyIGFkZHJlc3MgZm9yIGNvcHlpbmcgdGhpcyBCU1NJRCBpbnRvIHJlcG9ydGluZyBmcmFtZQorCQkvLyAgICBUaGUgb2Zmc2V0IHNob3VsZCBzdGFydCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCByZXBvcnQgZnJhbWUgaGVhZGVyLgorCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCQlwQnNzICAgPSAoUEJTU19FTlRSWSkgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJbmRleF07CisJCUxlbmd0aCA9IDA7CisKKwkJLy8gMi4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJCXBSZXBvcnQgICAgICAgICA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCQlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJCXBSZXBvcnQtPkxlbmd0aCA9IDA7CisJCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uTW9kZTsKKwkJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJCXBEZXN0ICAgICAgICAgICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisKKwkJLy8gMy4gU3RhcnQgdGhlIGJlYWNvbiByZXBvcnQgZm9ybWF0CisJCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OworCQlwRGVzdCAgICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCQlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJCS8vIDQuIENvcHkgQ2hhbm5lbCBudW1iZXIKKwkJcEJlYWNvblJlcG9ydC0+Q2hhbm5lbCAgICAgICAgPSBwQnNzLT5DaGFubmVsOworCQlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJCXBCZWFjb25SZXBvcnQtPkR1cmF0aW9uICAgICAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uTWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBCZWFjb25SZXBvcnQtPlBoeVR5cGUgICAgICAgID0gKChwQnNzLT5TdXBSYXRlTGVuK3BCc3MtPkV4dFJhdGVMZW4gPiA0KSA/IFBIWV9FUlAgOiBQSFlfRFNTKTsKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgICAgICAgPSBwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJcEJlYWNvblJlcG9ydC0+QmVhY29uSW50ZXJ2YWwgPSBwQnNzLT5CZWFjb25QZXJpb2Q7CisJCXBCZWFjb25SZXBvcnQtPkNhcGFiaWxpdHlJbmZvID0gcEJzcy0+Q2FwYWJpbGl0eUluZm87CisJCUNPUFlfTUFDX0FERFIocEJlYWNvblJlcG9ydC0+QlNTSUQsIHBCc3MtPkJzc2lkKTsKKwkJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwQnNzLT5QVFNGLCA0KTsKKwkJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGLCBwQnNzLT5UVFNGLCA4KTsKKworCQkvLyA1LiBDcmVhdGUgU1NJRAorCQkqcERlc3QrKyA9IDB4MDA7CisJCSpwRGVzdCsrID0gcEJzcy0+U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOworCQlwRGVzdCAgKz0gcEJzcy0+U3NpZExlbjsKKwkJTGVuZ3RoICs9ICgyICsgcEJzcy0+U3NpZExlbik7CisKKwkJLy8gNi4gQ3JlYXRlIFN1cHBvcnRSYXRlcworCQkqcERlc3QrKyA9IDB4MDE7CisJCSpwRGVzdCsrID0gcEJzcy0+U3VwUmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBCc3MtPlN1cFJhdGUsIHBCc3MtPlN1cFJhdGVMZW4pOworCQlwRGVzdCAgKz0gcEJzcy0+U3VwUmF0ZUxlbjsKKwkJTGVuZ3RoICs9ICgyICsgcEJzcy0+U3VwUmF0ZUxlbik7CisKKwkJLy8gNy4gRFMgUGFyYW1ldGVyCisJCSpwRGVzdCsrID0gMHgwMzsKKwkJKnBEZXN0KysgPSAxOworCQkqcERlc3QrKyA9IHBCc3MtPkNoYW5uZWw7CisJCUxlbmd0aCAgKz0gMzsKKworCQkvLyA4LiBJQlNTIHBhcmFtZXRlciBpZiBwcmVzZW50cworCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCXsKKwkJCSpwRGVzdCsrID0gMHgwNjsKKwkJCSpwRGVzdCsrID0gMjsKKwkJCSooUFVTSE9SVCkgcERlc3QgPSBwQnNzLT5BdGltV2luOworCQkJcERlc3QgICArPSAyOworCQkJTGVuZ3RoICArPSA0OworCQl9CisKKwkJLy8gOS4gVXBkYXRlIGxlbmd0aCBmaWVsZCwgbm90IGluY2x1ZGUgRUlEIGFuZCBsZW5ndGgKKwkJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCQkvLyAxMC4gVXBkYXRlIHRvdGFsIGZyYW1lIHNpemUKKwkJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gTGVuZ3RoOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGI3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCkBAIC0wLDAgKzEsMTgyNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhc3NvYy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VDSEFSCUNpcGhlcldwYVRlbXBsYXRlW10gPSB7CisJCTB4ZGQsIAkJCQkJLy8gV1BBIElFCisJCTB4MTYsCQkJCQkvLyBMZW5ndGgKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CisKK1VDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0geworCQkweDMwLAkJCQkJLy8gUlNOIElFCisJCTB4MTQsCQkJCQkvLyBMZW5ndGgKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCisJCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgorCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQorCQl9OworCitVQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKKworCS8vIGZpcnN0IGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVJlYXNzb2NSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURpc2Fzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7CisKKwkvLyBzZWNvbmQgY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKKwkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCisJLy8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gdGhpcmQgY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwkvLworCS8vIFBhdGNoLCBBUCBkb2Vzbid0IHNlbmQgUmVhc3NvY2lhdGUgUnNwIGZyYW1lIHRvIFN0YXRpb24uCisJLy8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZWFzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBmb3VydGggY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpRGlzYXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIGluaXRpYWxpemUgdGhlIHRpbWVyCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzIGZ1bmN0aW9uCisJCXdpbGwgYmUgY2FsbGVkIGFuZCBpdCB3aWxsIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCSBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZWFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciByZWFzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMKKwkJZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSZWFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGlzYXNzb2NpYXRpb24gdGltZW91dCBwcm9jZWR1cmUuIEFmdGVyIGRpc2Fzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMKKwkJZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBEaXNhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltbG1lIGFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKKwlQYXJhbWV0ZXJzOgorCQlBZGFwdGVyIC0gQWRhcHRlciBwb2ludGVyCisJCUVsZW0gLSBNTE1FIFF1ZXVlIEVsZW1lbnQKKwlQcmU6CisJCXRoZSBzdGF0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBjb25maWcKKwkJCS0jIFNTSUQKKwkJCS0jIHN1cHBvcnRlZCByYXRlcyBhbmQgdGhlaXIgbGVuZ3RoCisJCQktIyBsaXN0ZW4gaW50ZXJ2YWwgKEFkYXB0ZXItPlN0YUNmZy5kZWZhdWx0X2xpc3Rlbl9jb3VudCkKKwkJCS0jIFRyYW5zbWl0IHBvd2VyICAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCVBvc3QgIDoKKwkJLSMgQW4gYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHNlbnQgdG8gdGhlIGFpcgorCQktIyBBc3NvY2lhdGlvbiB0aW1lciBzdGFydHMKKwkJLSMgQXNzb2NpYXRpb24gc3RhdGUgLT4gQVNTT0NfV0FJVF9SU1AKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCQkJQXBBZGRyWzZdOworCUhFQURFUl84MDJfMTEJQXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJTGlzdGVuSW50djsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCVZhckllc09mZnNldDsKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwSWUgPSBJRV9BSVJPTkVUX0NLSVA7CisJVUNIQVIJCQlBaXJvbmV0Q2tpcExlbiA9IENLSVBfTkVHT1RJQVRJT05fTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0lFID0gSUVfQUlST05FVF9JUEFERFJFU1M7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzTGVuID0gQUlST05FVF9JUEFERFJFU1NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0J1ZmZlcltBSVJPTkVUX0lQQUREUkVTU19MRU5HVEhdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCS8vIGNoZWNrIHNhbml0eSBmaXJzdAorCWVsc2UgaWYgKE1sbWVBc3NvY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkKKwl7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOworCisJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCQkvLyBBc3NvY2lhdGlvbiBkb24ndCBuZWVkIHRvIHJlcG9ydCBNQUMgYWRkcmVzcworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzID0KKwkJCU5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyB8IE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkxpc3RlbkludGVydmFsID0gTGlzdGVuSW50djsKKwkJLy8gT25seSByZWFzc29jaWF0ZSBuZWVkIHRoaXMKKwkJLy9DT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ3VycmVudEFQQWRkcmVzcywgQXBBZGRyKTsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlcXVlc3RJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgTUFYX1ZJRV9MRU4pOworCQkvLyBGaXJzdCBhZGQgU1NJRAorCQlWYXJJZXNPZmZzZXQgPSAwOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTc2lkSWUsIDEpOworCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sIDEpOworCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisKKwkJLy8gU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOworCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisKKyAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gVFJVRSkpCisgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbyB8PSAweDAxMDA7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIEFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBc3NvY0hkciwgU1VCVFlQRV9BU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKworCQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwJJkFzc29jSGRyLAorCQkJCQkJICAyLAkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgMiwJCQkJCQkmTGlzdGVuSW50diwKKwkJCQkJCSAgMSwJCQkJCQkmU3NpZEllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIAlwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBIVAorCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgSHRMZW47CisJCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQorCQkJeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCSAgICAgICAgSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuKTsKKyAgICAgICAgCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKyAgICAgICAgCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworICAgICAgICAJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAmVG1wTGVuLAorICAgICAgICAJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisgICAgICAgIAkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCZIdENhcGFiaWxpdHlUbXAsCisgICAgICAgIAkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJCQl7CisJCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzCisgICAgICAgICAgICAgICAgLy8gV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCS8vCisJCS8vIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuCisJCS8vIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuCisJCS8vIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuCisJCS8vIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpCisJCS8vCisJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJKQorICAgICAgICAgICAgKQorCQl7CisJCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCXsKKwkJCQlSU05JZSA9IElFX1dQQTI7CisJCQl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgV1BBIFBNSyBjYWNoZSBsaXN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCXsKKwkJCSAgICBJTlQgICAgIGlkeDsKKyAgICAgICAgICAgICAgICBCT09MRUFOIEZvdW5kUE1LID0gRkFMU0U7CisJCQkJLy8gU2VhcmNoIGNoY2hlZCBQTUtJRCwgYXBwZW5kIGl0IGlmIGV4aXN0ZWQKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBNS0lEX05POyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQXBBZGRyLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRCwgNikpCisJCQkJCXsKKwkJCQkJCUZvdW5kUE1LID0gVFJVRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKEZvdW5kUE1LKQorCQkJCXsKKwkJCQkJLy8gU2V0IFBNSyBudW1iZXIKKwkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJfQorCQkJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gMSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgCQkmdG1wLAorCQkJCSAgICAgICAgICAgICAgCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlFTkRfT0ZfQVJHUyk7CisJCQl9CisKKwkJCUZyYW1lTGVuICs9IHRtcDsKKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IDEpCisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJeworCSAgICAgICAgICAgIC8vIEFwcGVuZCBWYXJpYWJsZSBJRQorCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlJTTkllLCAxKTsKKwkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKKwkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sIDEpOworCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCQkJfQorCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCisJCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSBWYXJJZXNPZmZzZXQ7CisJCX0KKworCQkvLyBXZSBoYXZlIHVwZGF0ZSB0aGF0IGF0IFBlZXJCZWFjb25BdEpvaW5SZXF1ZXN0KCkKKwkJQ2tpcEZsYWcgPSBwQWQtPlN0YUNmZy5Da2lwRmxhZzsKKwkJaWYgKENraXBGbGFnICE9IDApCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KENraXBOZWdvdGlhdGlvbkJ1ZmZlciwgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEgpOworCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzJdID0gMHg2NjsKKwkJCS8vIE1ha2UgaXQgdHJ5IEtQICYgTUlDLCBzaW5jZSB3ZSBoYXZlIHRvIGZvbGxvdyB0aGUgcmVzdWx0IGZyb20gQXNzb2NSc3AKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcls4XSA9IDB4MTg7CisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAxXSA9IDB4MjI7CisJCQlDa2lwRmxhZyA9IDB4MTg7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgCSZ0bXAsCisJCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBJZSwKKwkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcExlbiwKKwkJCQkJCUFpcm9uZXRDa2lwTGVuLCAJCSAgCQlDa2lwTmVnb3RpYXRpb25CdWZmZXIsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgorCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKwkJeworCisJCQkvLworCQkJLy8gQWRkIEFpcm9uZXRJUEFkZHJlc3NJRSBmb3IgQ2lzY28gQ0NYIDIuWAorCQkJLy8gQWRkIENDWCBWZXJzaW9uCisJCQkvLworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NJRSwKKwkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzTGVuLAorCQkJCQkJQWlyb25ldElQQWRkcmVzc0xlbiwJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXIsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkllLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJMZW4sCisJCQkJCQlDY3gyTGVuLAkJCQkgICAgQ2N4MkllSW5mbywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJLy8KKwkJCS8vIEFkZCBDaXBoZXJTdWl0ZSBDQ0tNIG9yIExlYXBUa2lwIGlmIHNldHRpbmcuCisJCQkvLworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCUNpcGhlclN1aXRlQ2lzY29DQ0tNTGVuLAkJQ2lwaGVyU3VpdGVDaXNjb0NDS00sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkJLy8gVGhpcmQgYWRkIFJTTgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgQ2lwaGVyU3VpdGVDaXNjb0NDS00sIENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuKTsgLy9TYXZlIENpcGhlclN1aXRlCisJCQkJVmFySWVzT2Zmc2V0ICs9IENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuLAkgICAgQ2lwaGVyU3VpdGVDQ1hUa2lwLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJCS8vIFRoaXJkIGFkZCBSU04KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIENpcGhlclN1aXRlQ0NYVGtpcCwgQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuKTsKKwkJCQlWYXJJZXNPZmZzZXQgKz0gQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuOworCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCQkvLyBBZGQgYnkgSmFtZXMgMDMvMDYvMjcKKwkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCisJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKKwkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0SUVMZW5ndGggPSBWYXJJZXNPZmZzZXQ7CisKKwkJCS8vIE9mZnNldFJlc3BvbnNlSUVzIGZvbGxvdyBSZXFWYXJJRQorCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlc3BvbnNlSUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSArIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOworCQkJLy8gRW5kIEFkZCBieSBKYW1lcworCQl9CisKKworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCBUaW1lb3V0KTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19XQUlUX1JTUDsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEhISBcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSByZWFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKKwlQYXJhbWV0ZXJzOgorCQlFbGVtIC0KKwlQcmU6CisJCS0jIFNTSUQgIChBZGFwdGVyLT5TdGFDZmcuc3NpZFtdKQorCQktIyBCU1NJRCAoQVAgYWRkcmVzcywgQWRhcHRlci0+U3RhQ2ZnLmJzc2lkKQorCQktIyBTdXBwb3J0ZWQgcmF0ZXMgKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNbXSkKKwkJLSMgU3VwcG9ydGVkIHJhdGVzIGxlbmd0aCAoQWRhcHRlci0+U3RhQ2ZnLnN1cHBvcnRlZF9yYXRlc19sZW4pCisJCS0jIFR4IHBvd2VyIChBZGFwdGVyLT5TdGFDZmcudHhfcG93ZXIpCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCQkJQXBBZGRyWzZdOworCUhFQURFUl84MDJfMTEJUmVhc3NvY0hkcjsKKwlVQ0hBUgkJCUNjeDJMZW4gPSA1OworCVVDSEFSCQkJV21lSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCAweDA3LCAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKKwlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbywgTGlzdGVuSW50djsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJdG1wOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworLy9DQ1ggMi5YCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0lFID0gSUVfQUlST05FVF9DQ0tNUkVBU1NPQzsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0xlbiA9IEFJUk9ORVRfQ0NLTVJFQVNTT0NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jQnVmZmVyW0FJUk9ORVRfQ0NLTVJFQVNTT0NfTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRPVUlbXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwfTsKKwlVQ0hBUgkJCU1JQ01OWzE2XTsKKwlVQ0hBUgkJCUNhbGNNaWNCdWZmZXJbODBdOworCVVMT05HCQkJQ2FsY01pY0J1ZmZlckxlbiA9IDA7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJVVNIT1JUCQkJU3RhdHVzOworCisJLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCisJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCS8vIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRpb24KKwllbHNlIGlmKE1sbWVBc3NvY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkKKwl7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOworCisJCS8vIG1ha2UgZnJhbWUsIHVzZSBic3NpZCBhcyB0aGUgQVAgYWRkcmVzcz8/CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBSRS1BU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmUmVhc3NvY0hkciwgU1VCVFlQRV9SRUFTU09DX1JFUSwgMCwgQXBBZGRyLCBBcEFkZHIpOworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmUmVhc3NvY0hkciwKKwkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkxpc3RlbkludHYsCisJCQkJCQkgIE1BQ19BRERSX0xFTiwgICAgICAgICAgICAgQXBBZGRyLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCSAgICBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKKwkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfQorCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy8gYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04KKwkJLy8gQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sKKwkJLy8gMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCisJCS8vIENhc2UgSUk6IChBZ2dyZWdhdGlvbikKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQorCQl7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAoKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykpCisJCQl7CisJCQkJVUxPTkcgVG1wTGVuOworCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCisJCQl7CisJCQkJVUxPTkcgVG1wTGVuOworCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlVTE9ORyBUbXBMZW47CisJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwJCSAmVG1wTGVuLAorCQkJCQkJCSAgOSwJCQkJCQkgUmFsaW5rSWUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJaWYgKExFQVBfQ0NLTV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5DQ0tNTGlua1VwRmxhZyA9PSBUUlVFKSkKKwkJeworCQkJQ2tpcEZsYWcgPSBwQWQtPlN0YUNmZy5Da2lwRmxhZzsJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCisJCQlpZiAoQ2tpcEZsYWcgIT0gMCkKKwkJCXsKKwkJCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OworCQkJCS8vIE1ha2UgaXQgdHJ5IEtQICYgTUlDLCBzaW5jZSB3ZSBoYXZlIHRvIGZvbGxvdyB0aGUgcmVzdWx0IGZyb20gQXNzb2NSc3AKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OworCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKKworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmdG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENraXBJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDa2lwTGVuLAorCQkJCQkJCQkJQWlyb25ldENraXBMZW4sICAgICAgICAgICAgICAgICBDa2lwTmVnb3RpYXRpb25CdWZmZXIsCisJCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldElQQWRkcmVzc0lFLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRJUEFkZHJlc3NMZW4sCisJCQkJCQkJQWlyb25ldElQQWRkcmVzc0xlbiwgICAgICAgICAgICBBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJLy8KKwkJCS8vIFRoZSBSTiBpcyBpbmNyZW1lbnRlZCBiZWZvcmUgZWFjaCByZWFzc29jaWF0aW9uIHJlcXVlc3QuCisJCQkvLworCQkJcEFkLT5TdGFDZmcuQ0NLTVJOKys7CisJCQkvLworCQkJLy8gQ2FsY3VsYXRlIE1JQyA9IGhtYWMtbWQ1KGtyaywgU1RBLUlEfEJTU0lEfFJTTklFfFRTRnxSTik7CisJCQkvLworCQkJQ09QWV9NQUNfQUREUihDYWxjTWljQnVmZmVyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gPSBNQUNfQUREUl9MRU47CisJCQlDT1BZX01BQ19BRERSKENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBNQUNfQUREUl9MRU47CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgQ2lwaGVyU3VpdGVDaXNjb0NDS00sIENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXAsIHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wKSk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCAoUFVDSEFSKSZwQWQtPlN0YUNmZy5DQ0tNUk4sIHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNUk4pKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01STik7CisJCQlobWFjX21kNShwQWQtPlN0YUNmZy5LUkssIExFTl9FQVBfTUlDSywgQ2FsY01pY0J1ZmZlciwgQ2FsY01pY0J1ZmZlckxlbiwgTUlDTU4pOworCisJCQkvLworCQkJLy8gZmlsbCB1cCBDQ0tNIHJlYXNzb2NpYXRpb24gcmVxdWVzdCBlbGVtZW50CisJCQkvLworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyLCBBaXJvbmV0T1VJLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArIDQsIChQVUNIQVIpJnBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXAsIDgpOworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyICsgMTIsIChQVUNIQVIpICZwQWQtPlN0YUNmZy5DQ0tNUk4sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyICsxNiwgTUlDTU4sIDgpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDQ0tNUmVhc3NvY0lFLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q0NLTVJlYXNzb2NMZW4sCisJCQkJCQkJQWlyb25ldENDS01SZWFzc29jTGVuLCAgQWlyb25ldENDS01SZWFzc29jQnVmZmVyLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCUNpcGhlclN1aXRlQ2lzY29DQ0tNTGVuLENpcGhlclN1aXRlQ2lzY29DQ0tNLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorCQl7CisJCQkvLworCQkJLy8gQWRkIENDWCBWZXJzaW9uCisJCQkvLworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKKwkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAorCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIFRpbWVvdXQpOyAvKiBpbiBtU2VjICovCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gUkVBU1NPQ19XQUlUX1JTUDsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISBcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBwZXIgbGF5ZXIgaXNzdWVzIGRpc2Fzc29jIHJlcXVlc3QKKwlQYXJhbWV0ZXJzOgorCQlFbGVtIC0KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCBwRGlzYXNzb2NSZXE7CisJSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOworCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7CisJUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7CisJQk9PTEVBTiAgICAgICAgICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVMT05HICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gMDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgU3RhdHVzOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UsCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCXsKKwkJVUNIQVIgaTsKKworCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQl7CisJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCX0KKwkJfQorCisJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCXsKKwkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJLy8gc2tpcCBzYW5pdHkgY2hlY2sKKwlwRGlzYXNzb2NSZXEgPSAoUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkoRWxlbS0+TXNnKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gTWxtZURpc2Fzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlyZXR1cm47CisJfQorCisKKworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgRElTQVNTT0MgcmVxdWVzdFtCU1NJRDo6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggKFJlYXNvbj0lZClcbiIsCisJCQkJcERpc2Fzc29jUmVxLT5BZGRyWzBdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMV0sIHBEaXNhc3NvY1JlcS0+QWRkclsyXSwKKwkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbM10sIHBEaXNhc3NvY1JlcS0+QWRkcls0XSwgcERpc2Fzc29jUmVxLT5BZGRyWzVdLCBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJnBEaXNhc3NvY1JlcS0+UmVhc29uLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCisJLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQorCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCisJcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkc7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcERpc2Fzc29jUmVxLT5BZGRyKTsKKworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIFRpbWVvdXQpOyAvKiBpbiBtU2VjICovCisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBESVNBU1NPQ19XQUlUX1JTUDsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisJeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgIC8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcGVlciBzZW5kcyBhc3NvYyByc3AgYmFjaworCVBhcmFtZXRlcnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQXNzb2NSc3BBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm8sIFN0YXR1cywgQWlkOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIENraXBGbGFnOworCUVEQ0FfUEFSTSAgICAgRWRjYVBhcm07CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKwlpZiAoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJJkh0Q2FwYWJpbGl0eSwmQWRkSHRJbmZvLCAmSHRDYXBhYmlsaXR5TGVuLCZBZGRIdEluZm9MZW4sJk5ld0V4dENoYW5uZWxPZmZzZXQsICZFZGNhUGFybSwgJkNraXBGbGFnKSkKKwl7CisJCS8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQlpZihNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6QVNTT0MgLSByZWNlaXZlIEFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwgU3RhdHVzKSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpNYWNUYWJsZSBbJWRdLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIixFbGVtLT5XY2lkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCisJCQl7CisJCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgorCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJJkVkY2FQYXJtLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8pOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgICAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJaWYgKENraXBGbGFnICYgMHgxOCkKKwkJCQl7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUnhTRVEsIDQpOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5DS0lQTUlDLCA0KTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMV0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlsyXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjxDQ1g+IHBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gMHglMDJ4XG4iLCBwQWQtPlN0YUNmZy5Da2lwRmxhZykpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGYWlsZSBvbiBBc3NvY2lhdGlvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhdHVzIGNvZGUKKwkJCQkvLyBJcyB0aGF0IGEgUm9ndWUgQVA/CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoU3RhdHVzID09IE1MTUVfQUxHX05PVF9TVVBQT1JUKSkKKwkJCQl7IC8vUG9zc2libHkgUm9ndWUgQVAKKwkJCQkJUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgcEFkLT5NbG1lQXV4LkJzc2lkLCBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEgpOworCQkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCX0KKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgcmVhc3NvYyByc3AKKwlQYXJhbWV0cnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVU0hPUlQgICAgICBTdGF0dXM7CisJVVNIT1JUICAgICAgQWlkOworCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgQ2tpcEZsYWc7CisJQk9PTEVBTiAgICAgVGltZXJDYW5jZWxsZWQ7CisJRURDQV9QQVJNICAgRWRjYVBhcm07CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKwlpZihQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAkmQWRkSHRJbmZvLCAmSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQlpZihNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKSkgLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/CisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gcmVjZWl2ZSBSRUFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwgU3RhdHVzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCisJCQl7CisJCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgorCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJICZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCQl9CisKKwkJCS8vCisJCQkvLyBDaXNjbyBMZWFwIENDS00gc3VwcG9ydGVkIFJlLWFzc29jaWF0aW9uLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQl7CisJCQkJaWYgKENDS01Bc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSA9PSBUUlVFKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuQ2tpcEZsYWcgPSBDa2lwRmxhZzsKKwkJCQkJaWYgKENraXBGbGFnICYgMHgxOCkKKwkJCQkJeworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuVHhTRVEsIDQpOworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUnhTRVEsIDQpOworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMF0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMV0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gVFJVRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjxDQ1g+IHBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gMHglMDJ4XG4iLCBwQWQtPlN0YUNmZy5Da2lwRmxhZykpOworCQkJCQl9CisKKwkJCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDQ0tNQXNzb2NSc3BTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBDa2lwRmxhZyBpcyBubyB1c2UgZm9yIHJlYXNzb2NpYXRlCisJCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlclJlYXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXByb2NlZHVyZXMgb24gSUVFRSA4MDIuMTEvMTk5OSBwLjM3NgorCVBhcmFtZXRyczoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1Bvc3RQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQWRkcjIsCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVTSE9SVCBBaWQsCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAorCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCit7CisJVUxPTkcgSWR4OworCisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBBZGRyMik7CisJcEFkLT5NbG1lQXV4LkFpZCA9IEFpZDsKKwlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4KKwlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCisJeworCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCXBFZGNhUGFybS0+QWlmc25bMF0gPSAzOworCQlwRWRjYVBhcm0tPkFpZnNuWzFdID0gNzsKKwkJcEVkY2FQYXJtLT5BaWZzblsyXSA9IDI7CisJCXBFZGNhUGFybS0+QWlmc25bM10gPSAyOworCisJCXBFZGNhUGFybS0+Q3dtaW5bMF0gPSA0OworCQlwRWRjYVBhcm0tPkN3bWluWzFdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsyXSA9IDM7CisJCXBFZGNhUGFybS0+Q3dtaW5bM10gPSAyOworCisJCXBFZGNhUGFybS0+Q3dtYXhbMF0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsxXSA9IDEwOworCQlwRWRjYVBhcm0tPkN3bWF4WzJdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21heFszXSA9IDM7CisKKwkJcEVkY2FQYXJtLT5UeG9wWzBdICA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsxXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMl0gID0gOTY7CisJCXBFZGNhUGFybS0+VHhvcFszXSAgPSA0ODsKKworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKworCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzCisJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA+IDApCisJeworCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8pOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gICAgKE1tcHM9JWQsIEFtc2R1U2l6ZT0lZCwgKVxuIiwKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFNldCBOZXcgV1BBIGluZm9ybWF0aW9uCisJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkZHIyLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gSW5pdCB2YXJpYWJsZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKKworCQkvLyBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlcgorCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuICE9IDApKQorCQl7CisJCQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJCQlVU0hPUlQgICAgICAgICAgICAgIGxlbjsKKwkJCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKworCQkJcFZJRSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFczsKKwkJCWxlbgkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbjsKKworCQkJd2hpbGUgKGxlbiA+IDApCisJCQl7CisJCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJCQkvLyBGb3IgV1BBL1dQQVBTSworCQkJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwVklFLCAocEVpZC0+TGVuICsgMikpOworCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gXG4iKSk7CisJCQkJfQorCQkJCS8vIEZvciBXUEEyL1dQQTJQU0sKKwkJCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwVklFLCAocEVpZC0+TGVuICsgMikpOworCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEyIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKworCQkJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCQkJfQorCQl9CisKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhleF9kdW1wKCJSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWxlZnQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgUmVhc29uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKVxuIikpOworCWlmKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLCBSZWFzb24pKTsKKwkJaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIEFkZHIyKSkKKwkJeworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQl7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJCX0KKworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQkvLyBDaXNjb19MRUFQIGhhcyBzdGFydCBhIHRpbWVyCisJCQkJLy8gV2Ugc2hvdWxkIGNhbmNlbCBpdCBpZiB1c2luZyBMRUFQCisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCS8vQ2hlY2sgaXMgaXQgbWFjaCB0aGUgTEVBUCBBdXRoZW50aWNhdGlvbiBmYWlsZWQgYXMgcG9zc2libGUgYSBSb2d1ZSBBUAorCQkJCS8vb24gaXQncyBQb3J0U2VjdXJlZCBub3QgZXF1YWwgdG8gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgd2hpbGUgcHJvY2VzcyB0aGUgQXNzb2NpYXRpb24uCisJCQkJaWYgKChwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlICE9IExFQVBfSURMRSkgJiYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQl7CisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQpOworCQkJCX0KKwkJCX0KKyNlbmRpZgkvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCS8vCisJCQkvLyBHZXQgQ3VycmVudCBTeXN0ZW0gdGltZSBhbmQgVHVybiBvbiBBZGphY2VudEFQUmVwb3J0CisJCQkvLworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSk7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CisJCQlMaW5rRG93bihwQWQsIFRSVUUpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIGFzc29jIHRpbWVvdXQKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciByZWFzc29jIHRpbWVvdXQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSZWFzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBSZWFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBkaXNhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAorCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcmlnaHQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHBhZ2UgMzc0CisJTm90ZToKKwkJVGhpcyBldmVudCBzaG91bGQgbmV2ZXIgY2F1c2UgQVNTT0Mgc3RhdGUgbWFjaGluZSBwZXJmb3JtIHN0YXRlCisJCXRyYW5zaXRpb24sIGFuZCBoYXMgbm8gcmVsYXRpb25zaGlwIHdpdGggQ05UTCBtYWNoaW5lLiBTbyB3ZSBzZXBhcmF0ZQorCQl0aGlzIHJvdXRpbmUgYXMgYSBzZXJ2aWNlIG91dHNpZGUgb2YgQVNTT0Mgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBDbHMzZXJyQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCit7CisJSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOworCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7CisJUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7CisJVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCisJLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQorCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCisJcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwQWRkcik7Cit9CisKKyAvKgorCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSBEZXNjcmlwdGlvbjoKKwkJIFN3aXRjaCBiZXR3ZWVuIFdFUCBhbmQgQ0tJUCB1cG9uIG5ldyBhc3NvY2lhdGlvbiB1cC4KKwkgUGFyYW1ldGVyczoKKworCSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAqLworVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpbnQgICAgICAgICAgICBpOworCVNIQVJFREtFWV9NT0RFX1NUUlVDICBjc3IxOworCisJLy8gaWYgS1AgaXMgcmVxdWlyZWQuIGNoYW5nZSB0aGUgQ2lwaGVyQWxnIGluIGhhcmR3YXJlIHNoYXJkIGtleSB0YWJsZSBmcm9tIFdFUAorCS8vIHRvIENLSVAuIGVsc2UgcmVtYWluIGFzIFdFUAorCWlmIChwQWQtPlN0YUNmZy5iQ2tpcE9uICYmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MTApKQorCXsKKwkJLy8gbW9kaWZ5IGhhcmR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IE1BQyB1c2UgY29ycmVjdCBhbGdvcml0aG0gdG8gZGVjcnlwdCBSWAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCAmY3NyMS53b3JkKTsKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKworCQkvLyBtb2RpZnkgc29mdHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgZHJpdmVyIGNhbiBzcGVjaWZ5IGNvcnJlY3QgYWxnb3JpdGhtIGluIFRYRCB1cG9uIFRYCisJCWZvciAoaT0wOyBpPFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCQl9CisJfQorCisJLy8gZWxzZSBpZiBLUCBOT1QgaW51c2VkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBDS0lQCisJLy8gdG8gV0VQLgorCWVsc2UKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCisJCS8vCisJCS8vIE9uIFdQQS1OT05FLCBtdXN0IHVwZGF0ZSBDaXBoZXJBbGcuCisJCS8vIEJlY2F1c2UgdGhlIE9JRF84MDJfMTFfV0VQX1NUQVRVUyB3YXMgYmVlbiBzZXQgYWZ0ZXIgT0lEXzgwMl8xMV9BRERfS0VZCisJCS8vIGFuZCBDaXBoZXJBbGcgd2lsbCBiZSBDSVBIRVJfTk9ORSBieSBXaW5kb3dzIFplcm9Db25maWcuCisJCS8vIFNvIHdlIG5lZWQgdG8gdXBkYXRlIENpcGhlckFsZyBhZnRlciBjb25uZWN0LgorCQkvLworCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuICE9IDApCisJCQkJeworCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCXsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCX0KKwkJCX0KKworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgY3NyMS53b3JkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQmV0d2VlbldlcEFuZENraXA6IG1vZGlmeSBCU1MwIGNpcGhlciB0byAlc1xuIiwgQ2lwaGVyTmFtZVtjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnXSkpOworCX0KK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK1ZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgdW5zaWduZWQgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTcpIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIkFTU09DSU5GT19SZXFJRXM9Iik7CisJICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSsxNywgcEFkLT5TdGFDZmcuUmVxVmFySUVzLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisJICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTc7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX1JFUUlFX0VWRU5UX0ZMQUc7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKworICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DSU5GT19FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKKwlJTiAgUlRNUF9BREFQVEVSICpwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICBpZiAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKyAgICAgICAgbWVtY3B5KGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQVNTT0NSRVFJRSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2Vsc2UKKyAgICBpZiAoKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbioyKSArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgVUNIQVIgICBpZHg7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNzsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk8oUmVxSUVzPSIpOworICAgICAgICBmb3IgKGlkeD0wOyBpZHg8cEFkLT5TdGFDZmcuUmVxVmFySUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXNbaWR4XSk7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNyA+IE1BWF9DVVNUT01fTEVOXG4iKSk7CisjZW5kaWYKKworCXJldHVybiAwOworCit9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZmI4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXV0aC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRlIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHBvaW50ZXIgdG8gdGhlIGF1dGggc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX1JFUV9JRExFICAgICAgICAgICBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgICBBVVRIX1dBSVRfU0VRNAorICAgIE1UMl9NTE1FX0FVVEhfUkVRICAgbWxtZV9hdXRoX3JlcV9hY3Rpb24gICAgaW52YWxpZF9zdGF0ZV93aGVuX2F1dGggICAgICAgICAgaW52YWxpZF9zdGF0ZV93aGVuX2F1dGgKKyAgICBNVDJfUEVFUl9BVVRIX0VWRU4gIGRyb3AgICAgICAgICAgICAgICAgICAgIHBlZXJfYXV0aF9ldmVuX2F0X3NlcTJfYWN0aW9uICAgIHBlZXJfYXV0aF9ldmVuX2F0X3NlcTRfYWN0aW9uCisgICAgTVQyX0FVVEhfVElNRU9VVCAgICBEcm9wICAgICAgICAgICAgICAgICAgICBhdXRoX3RpbWVvdXRfYWN0aW9uICAgICAgICAgICAgICBhdXRoX3RpbWVvdXRfYWN0aW9uCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2b2lkIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfU1RBVEUsIE1BWF9BVVRIX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JFUV9JRExFLCBBVVRIX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyB0aGUgZmlyc3QgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JFUV9JRExFLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXV0aFJlcUFjdGlvbik7CisKKyAgICAvLyB0aGUgc2Vjb25kIGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCisgICAgLy8gdGhlIHRoaXJkIGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aW1lciB0aHJlYWQgd2hlbiBhdXRoIHRpbWVyIGV4cGlyZXMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCS8vIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KQorCWlmIChwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID09IEFVVEhfV0FJVF9TRVEyKQorCQlDbHMyZXJyQWN0aW9uKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKworCisgICAgTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX1RJTUVPVVQsIDAsIE5VTEwpOworICAgIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgICAgICBBZGRyWzZdOworICAgIFVTSE9SVCAgICAgICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOworICAgIFVMT05HICAgICAgICAgICAgICBUaW1lb3V0OworICAgIEhFQURFUl84MDJfMTEgICAgICBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKyAgICBORElTX1NUQVRVUyAgICAgICAgTlN0YXR1czsKKyAgICBQVUNIQVIgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgVUxPTkcgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEJsb2NrIEF1dGggcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisgICAgZWxzZSBpZihNbG1lQXV0aFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpCisgICAgeworICAgICAgICAvLyByZXNldCB0aW1lcgorICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyKTsKKyAgICAgICAgcEFkLT5NbG1lQXV4LkFsZyAgPSBBbGc7CisgICAgICAgIFNlcSA9IDE7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKworICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIEFsZykpOworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgQWxnKSk7CisgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBUaW1lb3V0KTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVF9FUlIoKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICAgU2VxLCBTdGF0dXMsIFJlbW90ZVN0YXR1cywgQWxnOworICAgIFVDSEFSICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgIEN5cGVyQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOICsgOCArIDhdOworICAgIFVDSEFSICAgICAgICAgRWxlbWVudFsyXTsKKyAgICBIRUFERVJfODAyXzExIEF1dGhIZHI7CisgICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFN0YXR1czI7CisKKyAgICBpZiAoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKKyAgICB7CisgICAgICAgIGlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzIgdG8gbWUgKEFsZz0lZCwgU3RhdHVzPSVkKVxuIiwgQWxnLCBTdGF0dXMpKTsKKyAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworICAgICAgICAgICAgaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSAiTEVBUCIgaGFzIGFsbG93IGZvciBDQ1ggMS5YCisgICAgICAgICAgICAgICAgaWYgKChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJCXx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlID0gTEVBUF9JRExFOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkCisgICAgICAgICAgICAgICAgICAgIFNlcSsrOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKwkJCQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgQXV0aEhkci5GQy5XZXAgPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBSVE1QSW5pdFdlcEVuZ2luZSgKKyAgICAgICAgICAgICAgICAgICAgCXBBZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisgICAgICAgICAgICAgICAgICAgIAlDeXBlckNobGdUZXh0KTsKKworCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOworCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOworCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7CisKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJkFsZywgQ3lwZXJDaGxnVGV4dCArIDQsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmU2VxLCBDeXBlckNobGdUZXh0ICsgNiwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZSZW1vdGVTdGF0dXMsIEN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKKwkJCQkJRWxlbWVudFswXSA9IDE2OworCQkJCQlFbGVtZW50WzFdID0gMTI4OworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOworCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7CisgICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisgICAgICAgICAgICAgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBBVVRIX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9JbnZhbGlkIEF1dGhlbnRpY2F0aW9uIHBvc3NpYmxlIHJvZ3VlIEFQCisgICAgICAgICAgICAgICAgICAgIC8vQWRkIHRoaXMgQXAgdG8gUm9ndWUgQVAuCisgICAgICAgICAgICAgICAgICAgIFJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEgpOworCQkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKKyAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7CisgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKworICAgIGlmKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZihNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzQgdG8gbWVcbiIpKTsKKyAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworICAgICAgICAgICAgaWYgKFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqcEluZm87CisgICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXM7CisKKyAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgREUtQVVUSCByZXF1ZXN0IChSZWFzb249JWQpLi4uXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmcEluZm8tPlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IHBJbmZvLT5SZWFzb247CisgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBJbmZvLT5BZGRyKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoVGltZW91dEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVVNIT1JUIFN0YXR1czsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQXV0aFRpbWVvdXRBY3Rpb25cbiIpKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEludmFsaWRTdGF0ZVdoZW5BdXRoIChzdGF0ZT0lbGQpLCByZXNldCBBVVRIIHN0YXRlIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUpKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNvbWUgU1RBL0FQCisgICAgTm90ZToKKyAgICAgICAgVGhpcyBhY3Rpb24gc2hvdWxkIG5ldmVyIHRyaWdnZXIgQVVUSCBzdGF0ZSB0cmFuc2l0aW9uLCB0aGVyZWZvcmUgd2UKKyAgICAgICAgc2VwYXJhdGUgaXQgZnJvbSBBVVRIIHN0YXRlIG1hY2hpbmUsIGFuZCBtYWtlIGl0IGFzIGEgc3RhbmRhbG9uZSBzZXJ2aWNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzMmVyckFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQVUNIQVIgcEFkZHIpCit7CisgICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTMkVSUjsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIENsYXNzIDIgZXJyb3IsIFNlbmQgREVBVVRIIGZyYW1lLi4uXG4iKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhYTRiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXV0aF9yc3AuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtMTAtMQkJY29weSBmcm9tIFJUMjU2MAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQgcHJvY2VkdXJlCisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSB0aGUgc3RhdGUgbWFjaGluZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1JTUF9TVEFURSwgTUFYX0FVVEhfUlNQX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JTUF9JRExFLCBBVVRIX1JTUF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gY29sdW1uIDEKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX0lETEUsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKworICAgIC8vIGNvbHVtbiAyCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFVTSE9SVCBBbGcsCisgICAgSU4gVVNIT1JUIFNlcSwKKyAgICBJTiBVU0hPUlQgUmVhc29uLAorICAgIElOIFVTSE9SVCBTdGF0dXMpCit7CisgICAgSEVBREVSXzgwMl8xMSAgICAgQXV0aEhkcjsKKyAgICBVTE9ORyAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICAgICAgTlN0YXR1czsKKworICAgIGlmIChSZWFzb24gIT0gTUxNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZBbGcsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckRlYXV0aEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQTUxNRV9RVUVVRV9FTEVNIEVsZW0pCit7CisgICAgVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICBSZWFzb247CisKKyAgICBpZiAoUGVlckRlYXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCisgICAgeworICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLCBSZWFzb24pKTsKKworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisgICAgICAgICAgICBMaW5rRG93bihwQWQsIFRSVUUpOworCisgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlIENpc2NvX0xFQVAgaGFzIHN0YXJ0IGEgdGltZXIKKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICAgICAgICAgIC8vQ2hlY2sgaXMgaXQgbWFjaCB0aGUgTEVBUCBBdXRoZW50aWNhdGlvbiBmYWlsZWQgYXMgcG9zc2libGUgYSBSb2d1ZSBBUAorICAgICAgICAgICAgICAgIC8vb24gaXQncyBQb3J0U2VjdXJlZCBub3QgZXF1YWwgdG8gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgd2hpbGUgcHJvY2VzcyB0aGUgQXV0aGVudGljYXRvbi4KKyAgICAgICAgICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSAmJiAocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgQWRkcjIsIExFQVBfUkVBU09OX0FVVEhfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmYyOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCkBAIC0wLDAgKzEsMjc1MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljb25uZWN0LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0geworCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc1tdID0geworCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc0xlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lQWVzKSAvIHNpemVvZihVQ0hBUikpOworCisvLyBUaGUgZm9sbG93aW5nIE1BQ1JPIGlzIGNhbGxlZCBhZnRlciAxLiBzdGFydGluZyBhbiBuZXcgSUJTUywgMi4gc3VjY2VzZnVsbHkgSk9JTiBhbiBJQlNTLAorLy8gb3IgMy4gc3VjY2VzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTCisvLyBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MKKy8vIGFuZCBhcmUgY29waWVkIHRvIHBBZC0+U3RhQWN0aXZlCisjZGVmaW5lIENPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5Tc2lkTGVuID0gKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5Db21tb25DZmcuU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuKTsgXAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5Db21tb25DZmcuQnNzaWQsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5DaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNoYW5uZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2VudHJhbENoYW5uZWw7ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5BdGltV2luID0gKF9wQWQpLT5NbG1lQXV4LkF0aW1XaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8gPSAoX3BBZCktPk1sbWVBdXguQ2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5CZWFjb25QZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DZnBNYXhEdXJhdGlvbiA9IChfcEFkKS0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbjsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkNmcFBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW4pO1wKKwkoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sICYoX3BBZCktPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmKF9wQWQpLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICYoX3BBZCktPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7XAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgIFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IChfcEFkKS0+TWxtZUF1eC5BaWQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSAoX3BBZCktPlN0YUNmZy5QYWlyQ2lwaGVyO1wKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQnNzSWQsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7XAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUmF0ZUxlbiA9IChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyAoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlTGVuO1wKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBNbG1lQ250bEluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGRpZmZlcnMgZnJvbSBvdGhlciBzdGF0ZSBtYWNoaW5lcywgdGhlIGludGVyZmFjZQorCS8vIGZvbGxvd3MgdGhlIHN0YW5kYXJkIGludGVyZmFjZQorCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJc3dpdGNoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUpCisJeworCQljYXNlIENOVExfSURMRToKKwkJCXsKKwkJCQlDbnRsSWRsZVByb2MocEFkLCBFbGVtKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKKwkJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfSk9JTjoKKwkJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCS8vIENOVExfV0FJVF9SRUFTU09DIGlzIHRoZSBvbmx5IHN0YXRlIGluIENOVEwgbWFjaGluZSB0aGF0IGRvZXMKKwkJLy8gbm90IHRyaWdnZXJlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5ICJSVE1QU2V0SW5mb3JtYXRpb24oT0lEX3h4eCkiLgorCQkvLyBUaGVyZWZvcmUgbm90IHByb3RlY3RlZCBieSBORElTJ3MgIm9ubHkgb25lIG91dHN0YW5kaW5nIE9JRCByZXF1ZXN0IgorCQkvLyBydWxlLiBXaGljaCBtZWFucyBORElTIG1heSBTRVQgT0lEIGluIHRoZSBtaWRkbGUgb2YgUk9BTWluZyBhdHRlbXB0cy4KKwkJLy8gQ3VycmVudCBhcHByb2FjaCBpcyB0byBibG9jayBuZXcgU0VUIHJlcXVlc3QgYXQgUlRNUFNldEluZm9ybWF0aW9uKCkKKwkJLy8gd2hlbiBDbnRsTWFjaGluZS5DdXJyU3RhdGUgaXMgbm90IENOVExfSURMRQorCQljYXNlIENOVExfV0FJVF9SRUFTU09DOgorCQkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6CisJCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FVVEg6CisJCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVVUSDI6CisJCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FTU09DOgorCQkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46CisJCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCisJCQl7CisJCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCisJCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcworCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkKKwkJCQl7CisJCQkJCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOworCQkJCX0KKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuCisJCQkJLy8KKwkJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykKKwkJCQl7CisJCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKKwkJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKKwkJCQl9CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCS8vIEFQIHNlbnQgYSAyMDQwQ29leGlzdGVuY2UgbWdtdCBmcmFtZSwgdGhlbiBzdGF0aW9uIHBlcmZvcm0gYSBzY2FuLCBhbmQgdGhlbiBzZW5kIGJhY2sgdGhlIHJlc3BvbmUuCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPT0gMSkKKwkJCQl7CisJCQkJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOgorCQkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCisJCQl7CisJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlRfRVJSKCgiIUVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEVsZW0tPk1zZ1R5cGUpCisJeworCQljYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0JTU0lEOgorCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisJCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZihBVEVfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgIAkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKyAgICAJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisgICAgCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKyAgICAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKworCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgorCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRToKKyAgICAgICAgICAgIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlDbnRsT2lkRExTU2V0dXBQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKKwkJCWJyZWFrOworCX0KK30KKworVk9JRCBDbnRsT2lkU2NhblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogRGlzYWJsZSBzY2FubmluZyB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJLy8gcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLgorCS8vIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlCc3NJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZDdXJyQnNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJfQorCX0KKworCS8vIGNsZWFuIHVwIHByZXZpb3VzIFNDQU4gcmVzdWx0LCBhZGQgY3VycmVudCBCU1MgYmFjayB0byB0YWJsZSBpZiBhbnkKKwlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJLy8gRERLIE5vdGU6IElmIHRoZSBOSUMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBCU1NJRCBhbmQgU1NJRAorCQkvLyAgICB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZSBsaXN0IG9mIEJTU0lEcyBnZW5lcmF0ZWQgYnkgdGhpcyBzY2FuLCB0aGUKKwkJLy8gICAgQlNTSUQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEJTU0lEIGFuZCBTU0lEIHNob3VsZCBiZQorCQkvLyAgICBhcHBlbmRlZCB0byB0aGUgbGlzdCBvZiBCU1NJRHMgaW4gdGhlIE5JQydzIGRhdGFiYXNlLgorCQkvLyBUbyBlbnN1cmUgdGhpcywgd2UgYXBwZW5kIHRoaXMgQlNTIGFzIHRoZSBmaXJzdCBlbnRyeSBpbiBTQ0FOIHJlc3VsdAorCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5WzBdLCAmQ3VyckJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwQWQtPlNjYW5UYWIuQnNzTnIgPSAxOworCX0KKworCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAiIiwgMCwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHVzZXIgZGVzaXJlZCBTU0lEIHNob3VsZCBhbHJlYWR5IGJlZW4KKwkJcmVjb3JkZWQgaW4gQ29tbW9uQ2ZnLlNzaWRbXQorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRTc2lkUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQoreworCVBORElTXzgwMl8xMV9TU0lEICAgICAgICAgIHBPaWRTc2lkID0gKE5ESVNfODAyXzExX1NTSUQgKilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisJVUxPTkcJCQkJCSAgIE5vdzsKKworCS8vIFN0ZXAgMS4gcmVjb3JkIHRoZSBkZXNpcmVkIHVzZXIgc2V0dGluZ3MgdG8gTWxtZUF1eAorCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwT2lkU3NpZC0+U3NpZCwgcE9pZFNzaWQtPlNzaWRMZW5ndGgpOworCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gKFVDSEFSKXBPaWRTc2lkLT5Tc2lkTGVuZ3RoOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKworCS8vCisJLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgorCS8vCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKworCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKKwkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgorCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gJWQgQlNTIG9mICVkIEJTUyBtYXRjaCB0aGUgZGVzaXJlICglZClTU0lEIC0gJXNcbiIsCisJCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQpKTsKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQkocEFkLT5Db21tb25DZmcuU3NpZExlbiA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKSAmJgorCQlOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLkJzc2lkKSkKKwl7CisJCS8vIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQKKwkJLy8gICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSQorCisJCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAorCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCSB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCSApICYmCisJCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJLy8gY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbworCQkJLy8gICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpCisJCXsKKwkJCS8vIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gY2FzZSAxLjMuIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBTU0lEIHdpdGggaGlnaGVzdCBSU1NJLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGFscmVhZHkgd2l0aCB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfU1NJRCByZXF1ZXN0XG4iKSk7CisJCQkvLworCQkJLy8gKEhDVCAxMi4xKSAxY193bGFuX21lZGlhZXZlbnRzIHJlcXVpcmVkCisJCQkvLyBtZWRpYSBjb25uZWN0IGV2ZW50cyBhcmUgaW5kaWNhdGVkIHdoZW4gYXNzb2NpYXRpbmcgd2l0aCB0aGUgc2FtZSBBUAorCQkJLy8KKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCS8vCisJCQkJLy8gU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCisJCQkJLy8gV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLgorCQkJCS8vCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJCQl9CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJfQorCX0KKwllbHNlIGlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8KKwkJLy8gRm9yIFJUNjEKKwkJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKKwkJLy8gUlQ2MSBtYXkgbG9zdCBTU0lELCBhbmQgbm90IGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYW5kIHdpbGwgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBieSBBdXRvcmVjb25uZWN0CisJCS8vIEJ1dCBtZWRpYSBzdGF0dXMgaXMgY29ubmVjdGVkLCBzbyB0aGUgU1NJRCBub3QgcmVwb3J0IGNvcnJlY3RseS4KKwkJLy8KKwkJaWYgKCFTU0lEX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikpCisJCXsKKwkJCS8vCisJCQkvLyBEaWZmZXJlbnQgU1NJRCBtZWFucyBub3QgUm9hbWluZyBjYXNlLCBzbyB3ZSBsZXQgTGlua0Rvd24oKSB0byBJbmRpY2F0ZSBhIGRpc2Nvbm5lY3QgZXZlbnQuCisJCQkvLworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKwkJfQorCQkvLyBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudAorCQkvLyAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24KKwkJLy8gICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdAorCQkvLyAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLAorCQkvLyAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlCisJCS8vICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCX0KKwllbHNlCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQl9CisKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9PSAwKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCisJCQkocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSA9PSBUUlVFKQorCQkJKQorCQl7CisJCQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlVTE9ORyAgICAgICBCc3NJZHg7CisJUFVDSEFSICAgICAgcE9pZEJzc2lkID0gKFBVQ0hBUilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgICAgICBKb2luUmVxOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogTm8gbmVlZCB0byBwZXJmb3JtIHRoaXMgcm91dGluZSB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcE9pZEJzc2lkKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwkvLyBmaW5kIHRoZSBkZXNpcmVkIEJTUyBpbiB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0IHRhYmxlCisJQnNzSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcE9pZEJzc2lkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJaWYgKEJzc0lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCXJldHVybjsKKwl9CisKKwkvLyBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/CisJLy8gQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUKKwlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IDE7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKworCS8vIDIwMDItMTEtMjYgc2tpcCB0aGUgZm9sbG93aW5nIGNoZWNraW5nLiBpLmUuIGlmIHVzZXIgd2FudHMgdG8gcmUtY29ubmVjdCB0byBzYW1lIEFQCisJLy8gICB3ZSBqdXN0IGZvbGxvdyBub3JtYWwgcHJvY2VkdXJlLiBUaGUgcmVhc29uIG9mIHVzZXIgZG9pbmcgdGhpcyBtYXkgYmVjYXVzZSBoZS9zaGUgY2hhbmdlZAorCS8vICAgQVAgdG8gYW5vdGhlciBjaGFubmVsLCBidXQgd2Ugc3RpbGwgcmVjZWl2ZWQgQkVBQ09OIGZyb20gaXQgdGh1cyBkb24ndCBjbGFpbSBMaW5rIERvd24uCisJLy8gICBTaW5jZSB1c2VyIGtub3dzIGhlJ3MgY2hhbmdlZCBBUCBjaGFubmVsLCBoZSdsbCByZS1jb25uZWN0IGFnYWluLiBCeSBza2lwcGluZyB0aGUgZm9sbG93aW5nCisJLy8gICBjaGVja2luZywgd2UnbGwgZGlzYXNzb2NpYXRlIHRoZW4gcmUtZG8gbm9ybWFsIGFzc29jaWF0aW9uIHdpdGggdGhpcyBBUCBhdCB0aGUgbmV3IGNoYW5uZWwuCisJLy8gMjAwMy0xLTYgUmUtZW5hYmxlIHRoaXMgZmVhdHVyZSBiYXNlZCBvbiBtaWNyb3NvZnQgcmVxdWlyZW1lbnQgd2hpY2ggcHJlZmVyIG5vdCB0byByZS1kbworCS8vICAgY29ubmVjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHNhbWUgQlNTSUQuCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcE9pZEJzc2lkKSkKKwl7CisJCS8vIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBzYW1lIEJTU0lELCBnbyBiYWNrIHRvIGlkbGUgc3RhdGUgZGlyZWN0bHkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGFscmVhZHkgaW4gdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX0JTU0lEIHJlcXVlc3RcbiIpKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJCX0KKworCQkJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZworCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OworCQkJfQorCisJCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJCXsKKwkJCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCX0KKwkJCS8vIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcE9pZEJzc2lkWzBdLHBPaWRCc3NpZFsxXSxwT2lkQnNzaWRbMl0scE9pZEJzc2lkWzNdLHBPaWRCc3NpZFs0XSxwT2lkQnNzaWRbNV0pKTsKKworCQkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIHBBZC0+TWxtZUF1eC5Cc3NJZHgpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLCAmSm9pblJlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKKwkJfQorCX0KK30KKworLy8gUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lCisvLyBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMKKy8vIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZQorLy8gdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4KKy8vIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPworLy8gb3IgYmVlbiBjb3JydXB0ZWQgYnkgb3RoZXIgIlNFVCBPSUQiPworLy8KKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkvLyBUT0RPOgorCS8vIEFQIGluIGRpZmZlcmVudCBjaGFubmVsIG1heSBzaG93IGxvd2VyIFJTU0kgdGhhbiBhY3R1YWwgdmFsdWU/PworCS8vIHNob3VsZCB3ZSBhZGQgYSB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNvbXBlbnNhdGUgaXQ/CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gUm9hbWluZyBpbiBNbG1lQXV4LlJvYW1UYWIuLi5cbiIpKTsKKworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCisJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7CisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBSVF84MDJfMTFfRExTCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUVsZW0tPk1zZzsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJSU5UCQkJCQlpOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fVU5TUEVDSUZZOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gKE9JRCBzZXQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkLCBDb3VudERvd25UaW1lcj0lZClcbiIsCisJCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0sCisJCXBETFMtPlZhbGlkLCBwRExTLT5TdGF0dXMsIHBETFMtPlRpbWVPdXQsIHBETFMtPkNvdW50RG93blRpbWVyKSk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwkvLyBETFMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIHdoZW4gQWRob2MgbW9kZQorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJKHBETFMtPlRpbWVPdXQgPT0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMS4gU2FtZSBzZXR0aW5nLCBqdXN0IGRyb3AgaXQKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzZXR0aW5nIHVuY2hhbmdlZFxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIXBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyAyLiBEaXNhYmxlIERMUyBsaW5rIGNhc2UsIGp1c3QgdGVhciBkb3duIERMUyBsaW5rCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc3RhcnQgdGVhciBkb3duIHByb2NlZHVyZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQorCQkJeworCQkJCS8vIDMuIEVuYWJsZSBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCisJCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgc2V0dXAgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmICFNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA0LiB1cGRhdGUgbWFjIGNhc2UsIHRlYXIgZG93biBvbGQgRExTIGFuZCBzZXR1cCBuZXcgRExTCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdGVhciBkb3duIGFuZCByZXN0YXJ0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gcERMUy0+VGltZU91dCkpCisJCQl7CisJCQkJLy8gNS4gdXBkYXRlIHRpbWVvdXQgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQJPSBwRExTLT5UaW1lT3V0OworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHVwZGF0ZSB0aW1lb3V0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyAhPSBETFNfRklOSVNIKSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA2LiByZS1zZXR1cCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyByZXRyeSBzZXR1cCBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiQ05UTCAtIERMUyBub3QgY2hhbmdlZCBpbiBlbnRyeSAtICVkIC0gVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZFxuIiwKKwkJCQkJaSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cywgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bFxuIikpOworCisJICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCisJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCisJCS8vIGNhc2UgMS4gbm8gbWF0Y2hpbmcgQlNTLCBhbmQgdXNlciB3YW50cyBBREhPQywgc28gd2UganVzdCBzdGFydCBhIG5ldyBvbmUKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcj09MCkgJiYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisJCS8vIGNhc2UgMi4gdHJ5IGVhY2ggbWF0Y2hlZCBCU1MKKwkJZWxzZQorCQl7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLyAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZQorCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCSAgICAvLworCQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgorCQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCQkvLworCQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCSAgICkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJfQorCQkJLy8gMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQkvLyBBZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQkJeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQorCQkJCQl7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJCX0KKwkJCQl9CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTCisJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVzdWx0OworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJICAgIC8vCisJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCS8vCisJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJICAgKQorCQkJeworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCXJldHVybjsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIDE2KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLCAxNik7CisJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCisJCQkJCShwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkJIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJfQorCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkvLyBCZWZvcmUgc2VuZCBiZWFjb24sIGRyaXZlciBuZWVkIGRvIHJhZGFyIGRldGVjdGlvbgorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQgKQorCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU0lMRU5DRV9NT0RFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQgPSAwOworI2lmZGVmIERGU19TVVBQT1JUCisJCQkJQmJwUmFkYXJEZXRlY3Rpb25TdGFydChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchISEhIVxuIikpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vCisJCQkvLyBDaXNjbyBMZWFwIENDS00gc3VwcG9ydGVkIFJlLWFzc29jaWF0aW9uLgorCQkJLy8KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQl7CisJCQkJLy9pZiBDQ0tNIGlzIHR1cm4gb24gLCB0aGF0J3MgbWVhbiBGYXN0IFJlYXV0aGVudGljYXRpb24KKwkJCQkvL1VzZSBDQ0tNIFJlYXNzb2NpYXRpb24gaW5zdGVhZCBvZiBub3JtYWwgYXNzb2NpYXRpb24gZm9yIEZhc3QgUm9hbWluZy4KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAorCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCisJCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvL0FkZCBBdXRoTW9kZSAiTEVBUCIgZm9yIENDWCAxLlgKKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIENJU0NPX0F1dGhNb2RlTEVBUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8CisJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQl7CisJCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJfQorCQkJfQorCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQl9CisJCWVsc2UKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gUHJvY2VzcyBMRUFQIGZpcnN0LCBzaW5jZSBpdCB1c2UgZGlmZmVyZW50IGNvbnRyb2wgdmFyaWFibGUKKwkJCS8vIFdlIGRvbid0IHdhbnQgdG8gYWZmZWN0IG90aGVyIHBvdmVuIG9wZXJhdGlvbgorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gTEVBUCBBdXRoIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gKkxFQVAqIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgbWF0Y2ggQlNTSUQgWz0lZF1cbiIsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCisJCQkJIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PworCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlYXNvbjsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCS8vCisJCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQworCQkJLy8KKwkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CisKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIyKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIExpbmtVcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3NUeXBlKQoreworCVVMT05HCU5vdzsKKwlVSU5UMzIJRGF0YTsKKwlCT09MRUFOCUNhbmNlbGxlZDsKKwlVQ0hBUglWYWx1ZSA9IDAsIGlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisKKwkvLworCS8vIEFTU09DIC0gRGlzYXNzb2NUaW1lb3V0QWN0aW9uCisJLy8gQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bAorCS8vICEhISBMSU5LIERPV04gISEhCisJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKKwkvLworCS8vIFRvIHByZXZlbnQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uIHRvIGNhbGwgTGluayBkb3duIGFmdGVyIHdlIGxpbmsgdXAsCisJLy8gY2FuY2VsIHRoZSBEaXNhc3NvY1RpbWVyIG5vIG1hdHRlciB3aGF0IGl0IHN0YXJ0IG9yIG5vdC4KKwkvLworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKKworCUNPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJLy8gSXQncyBxdWl0ZSBkaWZmaWN1bHQgdG8gdGVsbCBpZiBhIG5ld2x5IGFkZGVkIEtFWSBpcyBXRVAgb3IgQ0tJUCB1bnRpbCBhIG5ldyBCU1MKKwkvLyBpcyBmb3JtZWQgKGVpdGhlciBBU1NPQy9SRS1BU1NPQyBkb25lIG9yIElCU1Mgc3RhcnRlZC4gTGlua1VQIHNob3VsZCBiZSBhIHNhZmUgcGxhY2UKKwkvLyB0byBleGFtaW5lIGlmIGNpcGhlciBhbGdvcml0aG0gc3dpdGNoaW5nIGlzIHJlcXVpcmVkLgorCS8vcnQyODYwYi4gRG9uJ3Qga25vdyB3aHkgbmVlZCB0aGlzCisJU3dpdGNoQmV0d2VlbldlcEFuZENraXAocEFkKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIEJlZm9yZSBwb3dlciBzYXZlIGJlZm9yZSBsaW5rIHVwIGZ1bmN0aW9uLCBXZSB3aWxsIGZvcmNlIHVzZSAxUi4KKwkvLyBTbyBhZnRlciBsaW5rIHVwLCBjaGVjayBSeCBhbnRlbm5hICMgYWdhaW4uCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwl7CisJCVZhbHVlIHw9ICgweDEwKTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJeworCQlWYWx1ZSB8PSAoMHg4KTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJeworCQlWYWx1ZSB8PSAoMHgwKTsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQkvLyBObyBjYXJyaWVyIGRldGVjdGlvbiB3aGVuIGFkaG9jCisJCS8vIENhcnJpZXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuQ0RfU3RhdGUgPSBDRF9OT1JNQUw7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUFkaG9jIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisJZWxzZQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUluZnJhIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisKKwkvLyAzKjMKKwkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJVmFsdWUgJj0gKH4weDAxKTsKKwlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwl7CisJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisjaWZkZWYgUlQyODYwCisgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhICY9IDB4ZmZmZmZmZmU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IExvd2VyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBCZWxvdy4gQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJfQorCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorICAgIHsKKwkgICAgLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkgICAgQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSB8PSAweDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJICAgIFZhbHVlIHw9ICgweDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworI2lmZGVmIFJUMjg2MAorICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOworCQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIHsKKwkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisjaWZkZWYgUlQyODYwCisgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgMjBNSHogTElOSyBVUCAhISEgXG4iICkpOworICAgIH0KKworCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCS8vCisJLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCisJLy8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKKwkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOworCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCS8vIENhbGwgdGhpcyBmb3IgUlRTIHByb3RlY3Rpb25mb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0CisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoT0ZETVNFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKKwl7CisJCS8vIFVwZGF0ZSBIVCBwcm90ZWN0aW9uZm9yIGJhc2VkIG9uIEFQJ3Mgb3BlcmF0aW5nIG1vZGUuCisgICAgCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisgICAgCXsKKyAgICAJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworICAgIAl9CisgICAgCWVsc2UKKyAgIAkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKENPVU5URVJfRFJTKSk7CisKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKworCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKKwkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKKwl7CisJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKwl9CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpCisJeworI2lmZGVmIERGU19TVVBQT1JUCisJCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJfQorCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJTWFrZUlic3NCZWFjb24ocEFkKTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCXsKKwkJCTsgLy9EbyBub3RoaW5nCisJCX0KKwkJZWxzZQorCQl7CisJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsKKwkJfQorCisJCS8vIEluIGFkIGhvYyBtb2RlLCB1c2UgTUFDIHRhYmxlIGZyb20gaW5kZXggMS4KKwkJLy8gcC5zIEFTSUMgdXNlIGFsbCAweGZmIGFzIHRlcm1pbmF0aW9uIG9mIFdDSUQgdGFibGUgc2VhcmNoLlRvIHByZXZlbnQgaXQncyAweGZmLWZmLWZmLWZmLWZmLWZmLCBXcml0ZSAwIGhlcmUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0JBU0UsIDB4MDApOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDE4MDgsIDB4MDApOworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKworCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQl7CisJCQlQVUNIQVIJS2V5OworCQkJVUNIQVIgCUNpcGhlckFsZzsKKworCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCisgICAgICAgIAl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQorCQkJCXsKKwkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQkJCXsKKwkJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCQl9CisJCQkJfQorCisKKwkJCX0KKwkJfQorCQkvLyBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKKwkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQl7CisJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvLyBhbHdheXMgYmUgemVybworCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICB9CisKKwkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQllbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAgICAgfQorCisJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkgIDAsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQl9CisKKwl9CisJZWxzZSAvLyBCU1NfSU5GUkEKKwl7CisJCS8vIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRAorCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKQorCQkJeworCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApCisJCQkJeworCQkJCQkvLyBMaW5rIHRvIHRoZSBvbGQgb25lIG5vIGxpbmtkb3duIGlzIHJlcXVpcmVkLgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKKwkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KKwkJLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCQl7CisJCQlVTE9ORyAJCUlWOworCisJCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOworCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKworCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAorCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCisJCQlJViA9IDA7CisJCQlJViB8PSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBCU1NJRF9XQ0lELCBJViwgMCk7CisJCX0KKwkJLy8gTk9URToKKwkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bworCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiB0byB1c2UgIlJUQy9DVFMiIG9yICJDVFMtdG8tc2VsZiIgcHJvdGVjdGlvbiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseQorCQkvLyBkdWUgdG8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQlDb21wb3NlUHNQb2xsKHBBZCk7CisJCUNvbXBvc2VOdWxsRnJhbWUocEFkKTsKKworCQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKworCQkvLyBBZGQgQlNTSUQgdG8gV0NJRCBzZWFyY2ggdGFibGUKKwkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgQlNTSURfV0NJRCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8vIGFkZCB0aGlzIEJTU0lEIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQl7CisJCQlVQ0hBUiBIYXNoSWR4OworCisJCQkvL3BFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkmJgorICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKSB8fAorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkmJgorICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkpCisjZWxzZQorCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlCisJCS8vIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisgICAgICAgIC8vIEZvciBHVUkgKysKKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQl7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCX0KKyAgICAgICAgLy8gLS0KKwkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKworCQkvLyBBZGQgQlNTSUQgaW4gbXkgTUFDIFRhYmxlLgorICAgICAgICBOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCQlSVE1QTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IEJTU0lEX1dDSUQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0ucEFkID0gcEFkOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlZhbGlkQXNDTEkgPSBUUlVFOwkvL0FsdGhvdWdoIHRoaXMgaXMgYnNzaWQuLnN0aWxsIHNldCBWYWxpZEFzQ2wKKwkJcEFkLT5NYWNUYWIuU2l6ZSA9IDE7CS8vIGluZnJhIG1vZGUgYWx3YXlzIHNldCBNQUN0YWIgc2l6ZSA9MS4KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Tc3QgPSBTU1RfQVNTT0M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQXV0aFN0YXRlID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgIENsaWVudFN0YXR1c0ZsYWdzPSVseClcbiIsCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisKKwkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBUUlVFLCBCU1MwKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISAoU3RhQWN0aXZlLmJIdEVuYWJsZSA9JWQsIClcbiIsIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gUmVwb3J0IEFkamFjZW50IEFQIHJlcG9ydC4KKwkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJQ0NYQWRqYWNlbnRBUFJlcG9ydChwQWQpOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQorCQl7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKQorCQkJeworCisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworICAgICAgICAgICAgICAgIFJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUdXJuIG9uIFBpZ2d5LUJhY2tcbiIpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApCisJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQkJeworCQkJCUFzaWNFbmFibGVSREcocEFkKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQl9CisJCWVsc2UKKwkJeworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQl9CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCBFdmVudCBCIS5CQUNhcGFiaWxpdHkgPSAleC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAlbHhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX1VQKTsKKworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOyAgICAgICAgLy8gUmVzZXQgY29uZmlnIGZsYWcKKwlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCisJLy8gU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sKKwl7CisJCVBVQ0hBUgkJCQkJcFRhYmxlOworCQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKKwkJQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHBBZCwgcFRhYmxlKTsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworICAgIHBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKQorCXsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKQorCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA+IE1DU183KSB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgorCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pCisJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCX0KKwllbHNlCisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkvLyAgTGV0IExpbmsgU3RhdHVzIFBhZ2UgZGlzcGxheSBmaXJzdCBpbml0aWFsIHJhdGUuCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CisJLy8gU2VsZWN0IERBQyBhY2NvcmRpbmcgdG8gSFQgb3IgTGVnYWN5CisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdICE9IDB4MDApCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCXsKKwkJICAgIFZhbHVlIHw9IDB4MTA7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJeworCX0KKwllbHNlIGlmIChwRW50cnktPk1heFJBbXBkdUZhY3RvciA9PSAwKQorCXsKKwkgICAgLy8gSWYgSFQgQVAgZG9lc24ndCBzdXBwb3J0IE1heFJBbXBkdUZhY3RvciA9IDEsIHdlIG5lZWQgdG8gc2V0IG1heCBQU0RVIHRvIDAuCisJICAgIC8vIEJlY2F1c2Ugb3VyIEluaXQgdmFsdWUgaXMgMSBhdCBNQUNSZWdUYWJsZS4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MGZmZik7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUGF0Y2ggZm9yIE1hcnZlbCBBUCB0byBnYWluIGhpZ2ggdGhyb3VnaHB1dAorCS8vIE5lZWQgdG8gc2V0IGFzIGZvbGxvd2luZywKKwkvLyAxLiBTZXQgdHhvcCBpbiByZWdpc3Rlci1FRENBX0FDMF9DRkcgYXMgMHg2MAorCS8vIDIuIFNldCBFblRYV3JpdGVCYWNrRERPTkUgaW4gcmVnaXN0ZXItV1BETUFfR0xPX0NGRyBhcyB6ZXJvCisJLy8gMy4gUEJGX01BWF9QQ05UIGFzIDB4MUYzRkJGOUYKKwkvLyA0LiBraWNrIHBlciB0d28gcGFja2V0cyB3aGVuIGRlcXVldWUKKwkvLworCS8vIFR4b3AgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBSREcgaXMgb2ZmLCBXTU0gaXMgZGlzYWJsZSBhbmQgVHhCdXJzdCBpcyBlbmFibGUKKwkvLworCS8vIGlmIDEuIExlZ2FjeSBBUCBXTU0gb24sICBvciAyLiAxMW4gQVAsIEFNUERVIGRpc2FibGUuICBGb3JjZSB0dXJuIG9mZiBidXJzdCBubyBtYXR0ZXIgd2hhdCBiRW5hYmxlVHhCdXJzdCBpcy4KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDFcbiIpKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCURhdGEgIHw9IDB4NjA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gVFJVRTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDJcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDNcbiIpKTsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBSZS1jaGVjayB0byB0dXJuIG9uIFRYIGJ1cnN0IG9yIG5vdC4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID09IFRSVUUpICYmICgoU1RBX1dFUF9PTihwQWQpKXx8KFNUQV9US0lQX09OKHBBZCkpKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IFRSVUU7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJeworCQkgICAgVUlOVDMyIE1BQ1ZhbHVlID0gMDsKKwkJCS8vIEZvcmNlIGRpc2FibGUgIFRYT1AgdmFsdWUgaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSBhY3Rpb24gaW4gTUxNRVVwZGF0ZVByb3RlY3QgdG9vLgorCQkJLy8gSSBkaWRuJ3QgY2hhbmdlIFBCRl9NQVhfUENOVCBzZXR0aW5nLgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAgJj0gMHhGRkZGRkYwMDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgTUFDVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IEZBTFNFOworCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSkpOworCS8vIEJTU0lEIGFkZCBpbiBvbmUgTUFDIGVudHJ5IHRvby4gIEJlY2F1c2UgaW4gVHgsIEFTSUMgbmVlZCB0byBjaGVjayBDaXBoZXIgYW5kIElWL0VJViwgQkFiaXRtYXAKKwkvLyBQdGhlciBpbmZvcm1hdGlvbiBpbiBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSBpcyBub3QgbmVjZXNzYXJ5IGZvciBkcml2ZXIuCisJLy8gTm90ZTogQXMgU1RBLCBUaGUgTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uIFBhaXJ3aXNlS2V5IGFuZCBTaGFyZWQgS2V5IGZvciBCU1MwIGFyZSB0aGUgc2FtZS4KKworICAgIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPD0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorICAgIHsKKyAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKyAgICAvLworCS8vIFBhdGNoIEF0aGVyb3MgQVAgVFggd2lsbCBicmVha2Rvd24gaXNzdWUuCisJLy8gQVAgTW9kZWw6IERMaW5rIERXTC04MjAwQVAKKwkvLworCWlmIChJTkZSQV9PTihwQWQpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgU1RBX1RLSVBfT04ocEFkKSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDEpOworCX0KKwllbHNlCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAwKTsKKwl9CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxMSkpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwkJQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KHBBZCk7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGlzY29ubmVjdCBjdXJyZW50IEJTU0lECisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJSXNSZXFGcm9tQVAJCS0gUmVxdWVzdCBmcm9tIEFQCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJV2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGtub3cgaXQncyB0aGlzIHJlcXVzdCBmcm9tIEFQLgorCQlJZiB5ZXMhIHdlIG5lZWQgdG8gZG8gZXh0cmEgaGFuZGxpbmcsIGZvciBleGFtcGxlLCByZW1vdmUgdGhlIFdQQSBrZXkuCisJCU90aGVyd2lzZSBvbiA0LXdheSBoYW5kc2hha2luZyB3aWxsIGZhaWVkLCBzaW5jZSB0aGUgV1BBIGtleSBkaWRuJ3QgYmUKKwkJcmVtb3ZlIHdoaWxlIGF1dG8gcmVjb25uZWN0LgorCQlEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBBUCwgaXQgbWVhbnMgd2Ugd2lsbCBzdGFydCBhZnJlc2ggNC13YXkgaGFuZHNoYWtpbmcKKwkJb24gV1BBIG1vZGUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua0Rvd24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIEJPT0xFQU4gICAgICBJc1JlcUZyb21BUCkKK3sKKwlVQ0hBUgkJCSAgICBpLCBCeXRlVmFsdWUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQlyZXR1cm47CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJeworCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgIHsKKwkgICAgQk9PTEVBTiBDYW5jZWxsZWQ7CisgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKyAgICB9CisKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICB7CisgICAgICAgIEFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworICAgIH0KKworICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworI2VuZGlmIC8vIFJUMjg2MCAvLworCWlmIChBREhPQ19PTihwQWQpKQkJLy8gQWRob2MgbW9kZSBsaW5rIGRvd24KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMSEhIVxuIikpOworCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNYWNUYWIuU2l6ZT0lZCAhISFcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwl9CisJZWxzZQkJCQkJLy8gSW5mcmEgc3RydWN0dXJlIG1vZGUKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMiEhIVxuIikpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIERMUyB0ZWFyIGRvd24gZnJhbWUgbXVzdCBiZSBzZW50IGJlZm9yZSBsaW5rIGRvd24KKwkJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gIERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworCQkvLyBTYXZlZCBsYXN0IFNTSUQgZm9yIGxpbmt1cCBjb21wYXJpc29uCisJCXBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKTsKKwkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJaWYgKHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9PSBUUlVFKQorCQl7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEEhXG4iKSk7CisJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIC8vCisJCQkvLyBJZiBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGlzIGZyb20gTkRJUywgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRlbGV0ZSBCU1NJRCBmcm9tIGVudHJ5LgorCQkJLy8gT3RoZXJ3aXNlIGxvc3QgYmVhY29uIG9yIHJlY2VpdmUgRGUtQXV0aGVudGljYXRpb24gZnJvbSBBUCwKKwkJCS8vIHRoZW4gd2Ugc2hvdWxkIGRlbGV0ZSBCU1NJRCBmcm9tIEJzc1RhYmxlLgorCQkJLy8gSWYgd2UgZG9uJ3QgZGVsZXRlIGZyb20gZW50cnksIHJvYW1pbmcgd2lsbCBmYWlsLgorCQkJLy8KKwkJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKwkJLy8gcmVzdG9yZSBiYWNrIHRvIC0KKwkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCisJCS8vICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbgorCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKworCQlpZiAocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPT0gVFJVRSkKKwkJeworCQkJLy8KKwkJCS8vIFJlY29yZCBjdXJyZW50IEFQJ3MgaW5mb3JtYXRpb24uCisJCQkvLyBmb3IgbGF0ZXIgdXNlZCByZXBvcnRpbmcgQWRqYWNlbnQgQVAgcmVwb3J0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbik7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQl9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCisJCWlmIChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlWzBdLCAyKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IHBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeTsKKwkJCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOworCQl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJfQorCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKKwkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKKwl9CisKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNaW4JPSA0OworCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCisJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7IC8vRkFMU0UpOworCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19ET1dOKTsKKyAgICBwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAweEYwOworICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKworCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CisKKwlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJeworCQkvLyBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93bgorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7CisJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkKKwl7CisJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisJCS8vIENsZWFyIFJlcGxheSBjb3VudGVyCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIDgpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKworCisJLy8KKwkvLyBpZiBsaW5rIGRvd24gY29tZSBmcm9tIEFQLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgV1BBIGtleXMgb24gV1BBIG1vZGUuCisJLy8gb3RoZXJ3aXNlIHdpbGwgY2F1c2UgNC13YXkgaGFuZHNoYWtpbmcgZmFpbGVkLCBzaW5jZSB0aGUgV1BBIGtleSBub3QgZW1wdHkuCisJLy8KKwlpZiAoKElzUmVxRnJvbUFQKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKKwl9CisKKwkvLyA4MDIuMXggcG9ydCBjb250cm9sCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCS8vIFByZXZlbnQgY2xlYXIgUG9ydFNlY3VyZWQgaGVyZSB3aXRoIHN0YXRpYyBXRVAKKwkvLyBOZXR3b3JrTWFuZ2VyIHNldCBzZWN1cml0eSBwb2xpY3kgZmlyc3QgdGhlbiBzZXQgU1NJRCB0byBjb25uZWN0IEFQLgorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKKwkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBGQUxTRSkpCisJeworCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCX0KKwllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPSAwOworCisJLy8gVHVybiBvZmYgQ2tpcCBjb250cm9sIGZsYWcKKwlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gRkFMU0U7CisKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKworICAgIHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPSBGQUxTRTsKKyAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCisJLy8gUmVzZXQgdGhlIEN1cnJlbnQgQVAncyBJUCBhZGRyZXNzCisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgNCk7CisKKwkvLyBDbGVhbiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbgorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Bc3NvY0luZm8sIHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikpOworCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gMDsKKwlwQWQtPlN0YUNmZy5SZXNWYXJJRUxlbiA9IDA7CisKKwkvLworCS8vIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duCisJLy8KKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4ID0gMDsKKworCS8vIFJlc3RvcmUgTWxtZVJhdGUKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLworCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgorCS8vCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCeXRlVmFsdWUpOworCQlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQnl0ZVZhbHVlKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJLy8gUmVzZXQgREFDCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQnl0ZVZhbHVlKTsKKwlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCXsKKwkJQnl0ZVZhbHVlIHw9IDB4MTA7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJ5dGVWYWx1ZSk7CisKKwlSVE1QU2V0UGlnZ3lCYWNrKHBBZCxGQUxTRSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxPRkRNU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKwlBc2ljRGlzYWJsZVJERyhwQWQpOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOworCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQgPSAwOworCVRyaUV2ZW50SW5pdChwQWQpOworCWZvciAoaSA9IDA7IGkgPCAocEFkLT5DaGFubmVsTGlzdE51bSAtIDEpOyBpKyspCisJeworCQlwQWQtPkNoYW5uZWxMaXN0W2ldLmJFZmZlY3RlZENoYW5uZWwgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MWZmZik7CisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisKKwkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKKwlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Cc3NJZHg7CisJaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKQorCXsKKwkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJfQorCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJfQorCisJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJeworCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIEJzc0lkeCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwKKwkJCQkJJkpvaW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCBzdGF5IEAgY2ggIyVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwl9Cit9CisKKy8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5CisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCBSZWFzc29jUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAqcEJzczsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKKworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCk7CisKKwkJLy8gcmVhc3NvY2lhdGUgbWVzc2FnZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFzc29jaWF0ZSBtZXNzYWdlCisJCUFzc29jUGFybUZpbGwocEFkLCAmUmVhc3NvY1JlcSwgcEJzcy0+QnNzaWQsIHBCc3MtPkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCksICZSZWFzc29jUmVxKTsKKworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7CisJfQorCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgZmFzdCByb2FtaW5nIGZhaWxlZCwgYmFjayB0byBjaCAjJWRcbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOIFVMT05HIEJzc0lkeCkKK3sKKwlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVDSEFSIFNjYW5UeXBlKQoreworICAgIE5kaXNaZXJvTWVtb3J5KFNjYW5SZXEtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJU2NhblJlcS0+U3NpZExlbiA9IFNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU2NhblJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJU2NhblJlcS0+QnNzVHlwZSA9IEJzc1R5cGU7CisJU2NhblJlcS0+U2NhblR5cGUgPSBTY2FuVHlwZTsKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKQoreworCXBEbHNSZXEtPnBETFMgPSBwRGxzOworCXBEbHNSZXEtPlJlYXNvbiA9IHJlYXNvbjsKK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuKQoreworCUFTU0VSVChTc2lkTGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkoU3RhcnRSZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVN0YXJ0UmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIEFsZykKK3sKKwlDT1BZX01BQ19BRERSKEF1dGhSZXEtPkFkZHIsIHBBZGRyKTsKKwlBdXRoUmVxLT5BbGcgPSBBbGc7CisJQXV0aFJlcS0+VGltZW91dCA9IEFVVEhfVElNRU9VVDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjaWZkZWYgUlQyODYwCitWT0lEIENvbXBvc2VQc1BvbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEFkLT5OdWxsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEFkLT5OdWxsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOworCXBBZC0+TnVsbEZyYW1lLkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlLWJ1aWxkIGEgQkVBQ09OIGZyYW1lIGluIHRoZSBzaGFyZWQgbWVtb3J5CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORyBNYWtlSWJzc0JlYWNvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMHgwNH07CisJSEVBREVSXzgwMl8xMSBCY25IZHI7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFRYV0lfU1RSVUMJICBwVHhXSSA9ICZwQWQtPkJlYWNvblR4V0k7CisJQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisJCUV4dFJhdGVMZW4gPSAwOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJeworCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVMZW4gID0gODsKKwkJRXh0UmF0ZUxlbiAgPSAwOworCisJCS8vCisJCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5CisJCS8vCisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisKKwkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlTGVuICA9IDg7CisJfQorCisJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisKKwkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCisJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkvLyBhZGQgRVJQX0lFIGFuZCBFWFRfUkFFIElFIG9mIGluIDgwMi4xMWcKKwlpZiAoRXh0UmF0ZUxlbikKKwl7CisJCVVMT05HCXRtcDsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgICAmdG1wLAorCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKKwkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwl7CisJCVVMT05HIHRtcDsKKyAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZSU05JZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUxPTkcgVG1wTGVuOworCQlVQ0hBUiBIdExlbiwgSHRMZW4xOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKwkJQUREX0hUX0lORk9fSUUJYWRkSFRJbmZvVG1wOworCQlVU0hPUlQJYjJsVG1wLCBiMmxUbXAyOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJSHRMZW4xID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAorCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKKwkJCQkJCSAgSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAorCQkJCQkJICBIdExlbjEsCQkJCQkmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmYWRkSFRJbmZvVG1wLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBIdExlbjEpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJmFkZEhUSW5mb1RtcCwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuICs9IFRtcExlbjsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKyAgICB7CisJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAorCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4KKwkJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0OworICAgICAgICBUcmFuc21pdC53b3JkID0gMDsKKyAgICAgICAgUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAorICAgIAkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZUcmFuc21pdCk7CisgICAgfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIHBCZWFjb25GcmFtZSwgRElSX1dSSVRFLCBGQUxTRSk7CisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1ha2VJYnNzQmVhY29uIChsZW49JWxkKSwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgQ2hhbm5lbD0lZCwgUGh5TW9kZT0lZFxuIiwKKwkJCQkJRnJhbWVMZW4sIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvZGxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9kbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZiMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvZGxzLmMKQEAgLTAsMCArMSwyMjAxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGRscy5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgV01NLURMUyBzdGF0ZSBtYWNoaW5lCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAyLTE0LTIwMDYKKwlBcnZpbiBUYWkJMDYtMDMtMjAwOAkgIE1vZGlmaWVkIGZvciBSVDI4eHgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZGxzIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHBvaW50ZXIgdG8gdGhlIGRscyBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBETFNfSURMRQorICAgIE1UMl9NTE1FX0RMU19SRVFVRVNUICAgTWxtZURsc1JlcUFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19SRVFVRVNUICAgUGVlckRsc1JlcUFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19SRVNQT05TRSAgUGVlckRsc1JzcEFjdGlvbgorICAgIE1UMl9NTE1FX0RMU19URUFSRE9XTiAgTWxtZVRlYXJEb3duQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1RFQVJET1dOICBQZWVyVGVhckRvd25BY3Rpb24KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVVDSEFSCWk7CisKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCAoU1RBVEVfTUFDSElORV9GVU5DKilUcmFucywgTUFYX0RMU19TVEFURSwgTUFYX0RMU19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgRExTX0lETEUsIERMU19NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1JlcUFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUmVxQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSc3BBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1RlYXJEb3duQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNUZWFyRG93bkFjdGlvbik7CisKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0ucEFkID0gcEFkOworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbiksIHBBZCwgRkFMU0UpOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUhFQURFUl84MDJfMTEJRGxzUmVxSGRyOworCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFUVVFU1Q7CisJVUxPTkcJCQl0bXA7CisJVVNIT1JUCQkJcmVhc29uOworCVVMT05HCQkJVGltZW91dDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisKKwlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJnJlYXNvbikpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIFxuIikpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzUmVxSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSZXFIZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJJnBETFMtPk1hY0FkZHIsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKKwkJCQkJMiwJCQkJCQkJJnBETFMtPlRpbWVPdXQsCisJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCisJCQkJCTEsCQkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCSAgMSwJCQkJCQkmRXh0UmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVQ0hBUiBIdExlbjsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKKwlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVTSE9SVAkJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7CisJSEVBREVSXzgwMl8xMQlEbHNSc3BIZHI7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVTUE9OU0U7CisJVUxPTkcJCQl0bXA7CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJCURMU1RpbWVPdXQ7CisJU0hPUlQJCQlpOworCVVMT05HCQkJVGltZW91dDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7CisJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKyAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzTGVuOworICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OworCisJaWYgKCFQZWVyRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmRExTVGltZU91dCwKKwkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCisJCXJldHVybjsKKworICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisgICAgZm9yIChpID0gMDsgaSA8IFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQorICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKKyAgICB9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKKwl9CisJZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQTsKKwl9CisJZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCXsKKwkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKKwl9CisJZWxzZQorCXsKKwkJLy8gZmluZCB0YWJsZSB0byB1cGRhdGUgcGFyYW1ldGVycworCQlmb3IgKGkgPSAoTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGkgPj0gMDsgaS0tKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCX0KKworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7CisJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCWVsc2UKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGNhbiBub3QgZmluZCBpbiB0YWJsZSwgY3JlYXRlIGEgbmV3IG9uZQorCQlpZiAoaSA8IDApCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGNhbiBub3QgZmluZCBzYW1lIGVudHJ5IFxuIikpOworCQkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWSAtIDEpOyBpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKKwkJCXsKKwkJCQlpZiAoIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQorCQkJCXsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQl9CisKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCA9IFRSVUU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFNBLCBNQUNfQUREUl9MRU4pOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCQllbHNlCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCQlDSEFSICAgIGlpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQkJfQorCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQkJfQorCisJCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJCXsKKwkJCQkJCQlqID0gaWkvODsKKwkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJCXsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJCXsKKworCQkJCQkJCXByaW50aygiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQkJeworCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCQl9CisJCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOworCisJCS8vIGNhbiBub3QgZmluZCBpbiB0YWJsZSwgY3JlYXRlIGEgbmV3IG9uZQorCQlpZiAoaSA8IDApCisJCXsKKwkJCVN0YXR1c0NvZGUgPSBNTE1FX1FPU19VTlNQRUNJRlk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBETFNFbnRyeSB0YWJsZSBmdWxsKG9ubHkgY2FuIHN1cHBvcnQgJWQgRExTIHNlc3Npb24pIFxuIiwgTUFYX05VTV9PRl9ETFNfRU5UUlkgLSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSB1c2UgZW50cnkoJWQpICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWksIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJfQorCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzUnNwSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAorCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAorCQkJCQkJNiwJCQkJCQkJU0EsCisJCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkJMiwJCQkJCQkJJnBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJMSwJCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCTEsCQkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCSAgMSwJCQkJCQkmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVQ0hBUiBIdExlbjsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKwkJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJaWYgKHBETFMgJiYgKHBETFMtPlN0YXR1cyAhPSBETFNfRklOSVNIKSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKKwkJCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCisJCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCisJCQkJCQk2LAkJCQkJCQlTQSwKKwkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJfQorCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1JzcEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUCQlDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCVN0YXR1c0NvZGU7CisJU0hPUlQJCWk7CisJQk9PTEVBTgkJVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc0xlbjsKKyAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQlIdENhcGFiaWxpdHlMZW47CisJSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmICghUGVlckRsc1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1c0NvZGUsCisJCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQorCQlyZXR1cm47CisKKyAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorICAgIGZvciAoaT0wOyBpPFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQorICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKKyAgICB9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggU3RhdHVzQ29kZT0lZCwgQ2FwYWJpbGl0eUluZm89MHgleFxuIiwKKwkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgU3RhdHVzQ29kZSwgQ2FwYWJpbGl0eUluZm8pKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJCQl7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCXsKKwkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCX0KKworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQl9CisKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQl7CisJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQlDSEFSICAgIGlpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQl9CisKKwkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJeworCQkJCQkJaiA9IGlpLzg7CisJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCXsKKwkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQl7CisJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCX0KKwkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJeworCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJCWlmIChSVE1QU2VuZFNUQUtleVJlcXVlc3QocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQl7CisJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQkJCX0KKworCQkJCS8vaW5pdGlhbGl6ZSBzZXEgbm8gZm9yIERMUyBmcmFtZXMuCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQllbHNlCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdpdGggU3RhdHVzQ29kZT0lZCBcbiIsIFN0YXR1c0NvZGUpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSB1cGRhdGUgdGltZW91dCB2YWx1ZSBcbiIpKTsKKwkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaT49TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwkJCQl7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQkJeworCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQkJfQorCisJCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOworCQkJCQkJfQorCisJCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKKwkJCQkJCXsKKwkJCQkJCQlqID0gaWkvODsKKwkJCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOworCQkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJCXsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoaWk9PTApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAorCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJeworCQkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQkJCWlmIChSVE1QU2VuZFNUQUtleVJlcXVlc3QocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQkJeworCQkJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdoZW4gY2FsbCBSVE1QU2VuZFNUQUtleVJlcXVlc3QgXG4iKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBTdWNjZWVkIHdpdGggV0VQIG9yIG5vIHNlY3VyaXR5XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCQllbHNlCisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gRExTIHNldHVwIHByb2NlZHVyZSBmYWlsZWQuCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdpdGggU3RhdHVzQ29kZT0lZCBcbiIsIFN0YXR1c0NvZGUpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1RFQVJET1dOOworCVVTSE9SVAkJCVJlYXNvbkNvZGUgPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKKwlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOworCVBSVF84MDJfMTFfRExTCXBETFM7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVVDSEFSCQkJaTsKKworCWlmKCFNbG1lRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZwRExTLCAmUmVhc29uQ29kZSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgd2l0aCBSZWFzb25Db2RlPSVkIFxuIiwgUmVhc29uQ29kZSkpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJJnBETFMtPk1hY0FkZHIsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZSZWFzb25Db2RlLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCS8vIFJlbW92ZSBrZXkgaW4gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBjbGVhciBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCQlSZWFzb25Db2RlOworCVVJTlQJCQlpOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKCFQZWVyRGxzVGVhckRvd25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmUmVhc29uQ29kZSkpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1RlYXJEb3duQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFJlYXNvbkNvZGU9JWRcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFJlYXNvbkNvZGUpKTsKKworCS8vIGNsZWFyIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBjbGVhciBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwkJCQlpOworCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTlNQRUNJRlk7CisKKwlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCEgSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KKworCS8vIHVwZGF0ZSBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07CisKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQorCQkJeworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJfQorCQl9CisJfQorCisJLy8gdXBkYXRlIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCisJCQl7CisJCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVE1QUmN2RnJhbWVETFNDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOIFVMT05HCQkJTGVuLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCXBSeEQpCit7CisJVUxPTkcJCQlpOworCUJPT0xFQU4JCQliRmluZEVudHJ5ID0gRkFMU0U7CisJQk9PTEVBTgkJCWJTVEFLZXlGcmFtZSA9IEZBTFNFOworCVBFQVBPTF9QQUNLRVQJcEVhcDsKKwlQVUNIQVIJCQlwUHJvdG8sIHBBZGRyID0gTlVMTDsKKwlQVUNIQVIJCQlwU1RBS2V5ID0gTlVMTDsKKwlVQ0hBUgkJCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIJCQlNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSCQkJZGlnZXN0WzgwXTsKKwlVQ0hBUgkJCURsc1BUS1s4MF07CisJVUNIQVIJCQl0ZW1wWzY0XTsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJQ0lQSEVSX0tFWQkJUGFpcndpc2VLZXk7CisKKworCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKCEgSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmICghIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoTGVuIDwgTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMikKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCXBQcm90bwk9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTEgKyAyICsgNjsJLy8gUU9TIENvbnRyb2wgZmllbGQgLCAweEFBIDB4QUEgMHhBQSAweDAwIDB4MDAgMHgwMAorCXBBZGRyCT0gcEhlYWRlci0+QWRkcjI7CisKKwkvLyBMMlBBRCBiaXQgb24gd2lsbCBwYWQgMiBieXRlcyBhdCBMTEMKKwlpZiAocFJ4RC0+TDJQQUQpCisJeworCQlwUHJvdG8gKz0gMjsKKwl9CisKKwlpZiAoUlRNUEVxdWFsTWVtb3J5KEVBUE9MLCBwUHJvdG8sIDIpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXBFYXAgPSAoUEVBUE9MX1BBQ0tFVCkgKHBQcm90byArIDIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgTGVuPSVsZCwgRGF0YUxlbj0lZCwgS2V5TWljPSVkLCBJbnN0YWxsPSVkLCBLZXlBY2s9JWQsIFNlY3VyZT0lZCwgRUtEX0RMPSVkLCBFcnJvcj0lZCwgUmVxdWVzdD0lZFxuIiwgTGVuLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjaywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KSk7CisKKwkJaWYgKChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNikpICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlNaWMKKwkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2sgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZQorCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVycm9yICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkKKwkJeworCQkJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKKwkJCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKKwkJCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJaWYgKChSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCQkJKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCQkJLy9SVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJLy8gcHV0IHRoZXNlIGNvZGUgc2VnbWVudCB0byBnZXQgdGhlIHJlcGxheSBjb3VudGVyCisJCQlpZiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQorCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwkJCS8vIENoZWNrIE1JQyB2YWx1ZQorCQkJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCQkJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCQkJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCQkJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCQkJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCQkJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQlOZGlzWmVyb01lbW9yeShwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJSE1BQ19TSEExKChQVUNIQVIpIHBFYXAsIHBFYXAtPkJvZHlfTGVuWzFdICsgNCwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCQkJTmRpc01vdmVNZW1vcnkoTWljLAlkaWdlc3QsCUxFTl9LRVlfREVTQ19NSUMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJCQl9CisKKwkJCWlmICghTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7CisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNSUMgVkFMSUQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKKyNpZiAxCisJCQlpZiAoKHBFYXAtPktleURlc2MuS2V5RGF0YVswXSA9PSAweEREKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzJdID09IDB4MDApICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbM10gPT0gMHgwQykKKwkJCQkmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzRdID09IDB4NDMpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNV0gPT0gMHgwMikpCisJCQl7CisJCQkJcEFkZHIJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDg7CQkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMikKKwkJCQlwU1RBS2V5CQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyAxNDsJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpLCBTVEFLZXlfTWFjX0FkZHIoNikKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQkJcEFkZHJbMF0sIHBBZGRyWzFdLCBwQWRkclsyXSwgcEFkZHJbM10sIHBBZGRyWzRdLCBwQWRkcls1XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJCWJTVEFLZXlGcmFtZSA9IFRSVUU7CisJCQl9CisjZWxzZQorCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEYpCisJCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweEFDKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQorCQkJeworCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCisJCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQkJcEFkZHJbMF0sIHBBZGRyWzFdLCBwQWRkclsyXSwgcEFkZHJbM10sIHBBZGRyWzRdLCBwQWRkcls1XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQkJCWJTVEFLZXlGcmFtZSA9IFRSVUU7CisJCQl9CisjZW5kaWYKKworCQl9CisJCWVsc2UgaWYgKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSkpCisJCXsKKyNpZiAwCisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisjZW5kaWYKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyIDIoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCX0KKwl9CisKKwkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgorCS8vIHVwZGF0ZSBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoYlNUQUtleUZyYW1lKQorCQkJeworCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5OworCisJCQkJLy8gU1RBS2V5IGZyYW1lLCBhZGQgcGFpcndpc2Uga2V5IHRhYmxlCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOworCisJCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAorCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworI2lmZGVmIFJUMjg2MAorICAgICAgICAgICAgCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLAorCQkJCQkJCQkJCShVQ0hBUilwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsCisJCQkJCQkJCQkJJlBhaXJ3aXNlS2V5KTsKKworCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCQkgIDAsCisJCQkJCQkJCQkJICBQYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQkJCQkJICBwRW50cnkpOworCisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoUGVlciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KSBcbiIpKTsKKworCQkJCVJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoSW5pdGlhdG9yIHNpZGUpXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoYlNUQUtleUZyYW1lKQorCQkJeworCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZSwgYW5kIHNlbmQgU1RBa2V5IE1zZy0yCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOworCisJCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAorCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworI2lmZGVmIFJUMjg2MAorICAgICAgICAgICAgCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLAorCQkJCQkJCQkJCShVQ0hBUilwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsCisJCQkJCQkJCQkJJlBhaXJ3aXNlS2V5KTsKKworCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJCQkgIDAsCisJCQkJCQkJCQkJICBQYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQkJCQkJICBwRW50cnkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKEluaXRpYXRvciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KVxuIikpOworCisJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJaWYgKFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKFBlZXIgc2lkZSlcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCisJcmV0dXJuIGJTVEFLZXlGcmFtZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRExTIGVudHJ5IGluZGV4CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCUlOVCBydmFsID0gLTE7CisJSU5UCWk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm4gcnZhbDsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlkb3sKKwkJLy8gY2hlY2sgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2hlY2sgcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlSZWFzb24gPSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1RFQVJET1dOOworCVVDSEFSCQkJaSA9IDA7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIFxuIikpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBU1NPQyAtIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCXBEQSwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbiwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCS8vIFJlbW92ZSBrZXkgaW4gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIFJlbW92ZSBrZXkgaW4gcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgYW5kIHJlbW92ZSBrZXkgaW4gKGk9JWQpIFxuIiwgaSkpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7CisKKwlwQWQtPlNlcXVlbmNlICsrOworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdAk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleVJlcXVlc3QtIFNlbmQgU1RBS2V5IHJlcXVlc3QgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7CisKKwlyZXR1cm4gTlN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CQkJLy8gRHVlIHRvIGRpcnZlciBjYW4gbm90IGdldCBQVEssIHVzZSBwcm9wcmlldGFyeSBQVEsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmQgUGVlciBNQUMgYWRkcmVzcworCisJLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKKwlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworICAgIH0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleUhhbmRTaGFrZS0gU2VuZCBTVEFLZXkgTWVzc2FnZS0yIChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKK1ZPSUQgRGxzVGltZW91dEFjdGlvbigKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAkJTWxtZURsc1JlcTsKKwlVU0hPUlQJCQkJCXJlYXNvbjsKKwlQUlRfODAyXzExX0RMUwkJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRnVuY3Rpb25Db250ZXh0OworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSBwRExTLT5wQWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEbHNUaW1lb3V0IC0gVGVhciBkb3duIERMUyBsaW5rcyAoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdKSk7CisKKwlpZiAoKHBETFMpICYmIChwRExTLT5WYWxpZCkpCisJeworCQlyZWFzb24JCQk9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQlwRExTLT5WYWxpZAkJPSBGQUxTRTsKKwkJcERMUy0+U3RhdHVzCT0gRExTX05PTkU7CisJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsIHBETFMsIHJlYXNvbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGVzY3JpcHRpb24gOiBiZWNhdXNlIERMUyBhbmQgQ0xJIHNoYXJlIHRoZSBzYW1lIFdDSUQgdGFibGUgaW4gQVNJQy4KK01lc2ggZW50cnkgYWxzbyBpbnNlcnQgdG8gcEFkLT5NYWNUYWIuY29udGVudFtdLiAgU3VjaCBpcyBtYXJrZWQgYXMgVmFsaWRBc0RscyA9IFRSVUUuCitBbHNvIGZpbGxzIHRoZSBwYWlyd2lzZSBrZXkuCitCZWNhdXNlIGZyb250IE1BWF9BSURfQkEgZW50cmllcyBoYXZlIGRpcmVjdCBtYXBwaW5nIHRvIEJBRW50cnksIHdoaWNoIGlzIG9ubHkgdXNlZCBhcyBDTEkuIFNvIHdlIGluc2VydCBEbHMKK2Zyb20gaW5kZXggTUFYX0FJRF9CQS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7CisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJZG8KKwl7CisJCWlmKChwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkZHIsIFRSVUUpKSAhPSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQorCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgcEFkZHIsIERsc0VudHJ5SWR4ICsgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUywgVFJVRSk7CisJCWlmIChwRW50cnkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SWR4XS5NYWNUYWJNYXRjaFdDSUQgPSBwRW50cnktPkFpZDsKKwkJCXBFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeCA9IERsc0VudHJ5SWR4OworCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixwRW50cnktPkFpZCwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCisJCQkvLyBJZiBsZWdhY3kgV0VQIGlzIHVzZWQsIHNldCBwYWlyLXdpc2UgY2lwaGVyQWxnIGludG8gV0NJRCBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKQorCQkJeworCQkJCVVDSEFSIEtleUlkeCA9IDA7CisJCQkJVUNIQVIgQ2lwaGVyQWxnID0gMDsKKworCQkJCUtleUlkeAk9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCQkJCUNpcGhlckFsZyAJPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKworCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQlCU1MwLAorCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkJCQlwRW50cnkpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlbGV0ZSBhbGwgTWVzaCBFbnRyeSBpbiBwQWQtPk1hY1RhYgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgd2NpZCwgcEFkZHIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgSGFzaElkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgl3Y2lkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKK3sKKwlVTE9ORyBETHNJbmRleDsKKwlQTUFDX1RBQkxFX0VOVFJZIHBDdXJFbnRyeSA9IE5VTEw7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlkbworCXsKKwkJcEN1ckVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJRExzSW5kZXggPSAweGZmOworCQlpZiAoKHBDdXJFbnRyeSkgJiYgKHBDdXJFbnRyeS0+VmFsaWRBc0Rscz09IFRSVUUpKQorCQl7CisJCQlETHNJbmRleCA9IHBDdXJFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeDsKKwkJfQorCisJCWlmIChETHNJbmRleCA9PSAweGZmKQorCQkJYnJlYWs7CisKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBDdXJFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlpZihiUmVzZXRJZGVsQ291bnQpCisJCQkJcEN1ckVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5ID0gcEN1ckVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKK0lOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCUlOVCBpOworCisJcHJpbnRrKCJcbiUtMTlzJS04c1xuIiwgIk1BQyIsICJUSU1FT1VUXG4iKTsKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJeworCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSURdOworCisJCQlwcmludGsoIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAiLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMV0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMl0sCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclszXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls0XSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls1XSk7CisJCQlwcmludGsoIiUtOGRcbiIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpOworCisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIlxuJS0xOXMlLTRzJS00cyUtNHMlLTRzJS04cyUtN3MlLTdzJS03cyUtMTBzJS02cyUtNnMlLTZzJS02c1xuIiwKKwkJCQkgICAiTUFDIiwgIkFJRCIsICJCU1MiLCAiUFNNIiwgIldNTSIsICJNSU1PUFMiLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKwkJCXByaW50aygiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSk7CisJCQlwcmludGsoIiUtOGQiLCAoaW50KXBFbnRyeS0+TW1wc01vZGUpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQkJcHJpbnRrKCIlLTEwcyIsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJcHJpbnRrKCIlLTZzIiwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworCQkJcHJpbnRrKCIlLTEwZCwgJWQsICVkJSVcbiIsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJcHJpbnRrKCJcbiIpOworCisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUgltYWNbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJVGltZW91dDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBSVF84MDJfMTFfRExTCURsczsKKworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpbWVvdXQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCVRpbWVvdXQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSVkIiwgbWFjWzBdLCBtYWNbMV0sCisJICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIChpbnQpVGltZW91dCk7CisKKwkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJRGxzLlRpbWVPdXQgPSBUaW1lb3V0OworCQlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWMpOworCQlEbHMuVmFsaWQgPSAxOworCisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkmRGxzKTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSCQkJbWFjQWRkcltNQUNfQUREUl9MRU5dOworCUNIQVIJCQkqdmFsdWU7CisJSU5UCQkJCWk7CisJUlRfODAyXzExX0RMUwlEbHM7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCQlBdG9IKHZhbHVlLCAmbWFjQWRkcltpKytdLCAyKTsKKwl9CisKKwlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBtYWNBZGRyWzBdLCBtYWNBZGRyWzFdLAorCSAgICAgICAgICAgbWFjQWRkclsyXSwgbWFjQWRkclszXSwgbWFjQWRkcls0XSwgbWFjQWRkcls1XSk7CisKKwlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hY0FkZHIpOworCURscy5WYWxpZCA9IDA7CisKKwlNbG1lRW5xdWV1ZShwQWQsCisJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkmRGxzKTsKKworCXJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWZmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMCwwICsxLDI2MTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9kYXRhLmMKKworCUFic3RyYWN0OgorCURhdGEgcGF0aCBzdWJyb3V0aW5lcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkgICAgICBBdWcvMTcvMDQJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyNTYxLzI2NjEKKwlKYW4gTGVlCSAgICAgIE1hci8xNy8wNgkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI4NjAgTmV3IFJpbmcgRGVzaWduCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJVUNIQVIJCQkqcFRtcEJ1ZjsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCXsKKwkJLy8gQWxsIEVBUG9MIGZyYW1lcyBoYXZlIHRvIHBhc3MgdG8gdXBwZXIgbGF5ZXIgKGV4LiBXUEFfU1VQUExJQ0FOVCBkYWVtb24pCisJCS8vIFRCRCA6IHByb2Nlc3MgZnJhZ21lbnRlZCBFQVBvbCBmcmFtZXMKKwkJeworCQkJLy8gSW4gODAyLjF4IG1vZGUsIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtU1VDQ0VTUyBwYWNrZXQsIHR1cm4gb24gdGhlIFBvcnRTZWN1cmVkIHZhcmlhYmxlCisJCQlpZiAoIHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFICYmCisJCQkJIChFQVBfQ09ERV9TVUNDRVNTID09IFdwYUNoZWNrRWFwQ29kZShwQWQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIExFTkdUSF84MDJfMV9IKSkpCisJCQl7CisJCQkJUFVDSEFSCUtleTsKKwkJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCQkJCWludCAgICAgaWR4ID0gMDsKKworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOworICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5DaXBoZXJBbGc7CisJCQkJCUtleSA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuID4gMCkKKyAgICAJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKworCQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKwkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJCQkvLyBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLgorICAgIAkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKKyAgICAJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQkvLyBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FCisJCS8vCSAxLiBDaXNjbyBBaXJvbmV0IGZyYW1lcyBmb3IgQ0NYMi4gV2UgbmVlZCBwYXNzIGl0IHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCQkvLwkgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJeworCQkJcFRtcEJ1ZiA9IHBSeEJsay0+cERhdGEgLSBMRU5HVEhfODAyXzExOworCQkJTmRpc01vdmVNZW1vcnkocFRtcEJ1ZiwgcFJ4QmxrLT5wSGVhZGVyLCBMRU5HVEhfODAyXzExKTsKKwkJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcFRtcEJ1ZiwgcFJ4QmxrLT5EYXRhU2l6ZSArIExFTkdUSF84MDJfMTEsIHBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiEhISByZXBvcnQgRUFQT0wvQUlST05FVCBEQVRBIHRvIE1MTUUgKGxlbj0lZCkgISEhXG4iLCBwUnhCbGstPkRhdGFTaXplKSk7CisJCX0KKwl9CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCXJldHVybjsKKworfQorCitWT0lEIFNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCisJLy8gbm9uLUVBUCBmcmFtZQorCWlmICghUlRNUENoZWNrV1BBZnJhbWUocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkKKwl7CisJCXsKKwkJCS8vIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUKKwkJCS8vIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkCisJCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApCisJCQl7CisJCQkJLy8gdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0CisJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgJiYKKwkJCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCQkJeworCQkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CisJCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkKKwkJeworCQkJLy8gTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUKKwkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBBUkFMSU5LCisJCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorCWVsc2UKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9FQVApOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwkJeworCQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyBEZXRlcm1pbiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIEVBUCBmcmFtZQorCQkJLy8gIHRvIFdQQSBzdGF0ZSBtYWNoaW5lIG9yIHVwcGVyIGxheWVyCisJCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCitCT09MRUFOIFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVVDSEFSCQkJVXNlclByaW9yaXR5ID0gcFJ4QmxrLT5Vc2VyUHJpb3JpdHk7CisJUENJUEhFUl9LRVkJCXBXcGFLZXk7CisJVUNIQVIJCQkqcERBLCAqcFNBOworCisJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhCbGstPnBSeFdJLT5LZXlJbmRleF07CisKKwlwREEgPSBwSGVhZGVyLT5BZGRyMTsKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSkpCisJeworCQlwU0EgPSBwSGVhZGVyLT5BZGRyMzsKKwl9CisJZWxzZQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjI7CisJfQorCisJaWYgKFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKHBBZCwKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCXBEQSwKKwkJCQkJCQkJcFNBLAorCQkJCQkJCQlwV3BhS2V5LT5SeE1pYywKKwkJCQkJCQkJVXNlclByaW9yaXR5LAorCQkJCQkJCQlEYXRhU2l6ZSkgPT0gRkFMU0UpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3IgMlxuIikpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQl7CisJCQlXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUUgOiBGQUxTRSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisJCX0KKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLy8KKy8vIEFsbCBSeCByb3V0aW5lcyB1c2UgUlhfQkxLIHN0cnVjdHVyZSB0byBoYW5kZSByeCBldmVudHMKKy8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGJ1aWxkIHBSeEJsayBhdHRyaWJ1dGVzCisvLyAgMS4gcEhlYWRlciBwb2ludGVyIHRvIDgwMi4xMSBIZWFkZXIKKy8vICAyLiBwRGF0YSBwb2ludGVyIHRvIHBheWxvYWQgaW5jbHVkaW5nIExMQyAoanVzdCBza2lwIEhlYWRlcikKKy8vICAzLiBzZXQgcGF5bG9hZCBzaXplIGluY2x1ZGluZyBMTEMgdG8gRGF0YVNpemUKKy8vICA0LiBzZXQgc29tZSBmbGFncyB3aXRoIFJYX0JMS19TRVRfRkxBRygpCisvLworVk9JRCBTVEFIYW5kbGVSeERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCQkJCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJCQkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCQkJCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCUJPT0xFQU4gCQkJCQkJYkZyYWdtZW50ID0gRkFMU0U7CisJTUFDX1RBQkxFX0VOVFJZCSAgICAJCQkqcEVudHJ5ID0gTlVMTDsKKwlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOworCisJeworCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAorCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy9pZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCisJCWlmIChSVE1QUmN2RnJhbWVETFNDaGVjayhwQWQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBSeEQpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWVzCisJCWlmIChwUnhELT5NeUJzcyA9PSAwKQorCQl7CisJCQl7CisJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKys7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJeworCQkJVUNIQVIgKnBEYXRhOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJiQVBTRENhcGFibGVcbiIpKTsKKworCQkJLy8gUW9zIGJpdCA0CisJCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7CisJCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOworCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QgPSBGQUxTRTsKKworCQkJCS8vIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lCisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCXsKKwkJCQkJVVNIT1JUICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQlVU0hPUlQgIE5leHREdGltID0gcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKKwkJCQkJVUxPTkcgICBOb3c7CisKKwkJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCQkJTmV4dER0aW0gLT0gKFVTSE9SVCkoTm93IC0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSkvcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJLy8gaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZQorCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChwSGVhZGVyLT5GQy5Nb3JlRGF0YSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyBhbm90aGVyIHRyaWdnZXIgZnJhbWUgd2hlbiBNb3JlIERhdGEgYml0IGlzIHNldCB0byAxXG4iKSk7CisJCQl9CisJCX0KKworCQkvLyBEcm9wIE5VTEwsIENGLUFDSyhubyBkYXRhKSwgQ0YtUE9MTChubyBkYXRhKSwgYW5kIENGLUFDSytDRi1QT0xMKG5vIGRhdGEpIGRhdGEgZnJhbWUKKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwNCkpIC8vIGJpdCAyIDogbm8gREFUQQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCSAgICAvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWUgKHdlIGNhbiBub3Qgb25seSBjaGVjayB0aGUgTXlCc3MgYml0IGluIFJ4RCkKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkgICAgeworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gSW5mcmFzdHJ1Y3R1cmUgbW9kZSwgY2hlY2sgYWRkcmVzcyAyIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIyLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZWxzZQkvLyBBZC1Ib2MgbW9kZSBvciBOb3QgYXNzb2NpYXRlZAorCQl7CisJCQkvLyBBZC1Ib2MgbW9kZSwgY2hlY2sgYWRkcmVzcyAzIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIzLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vCisJCS8vIGZpbmQgcEVudHJ5CisJCS8vCisJCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCisJCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gaW5mcmEgb3IgYWQtaG9jCisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOworCQl9CisKKwkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKKwkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQorCQl7CisJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKKwkJCWlmICghU1RBX0FFU19PTihwQWQpKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7CisJCQl9CisJCX0KKwl9CisKKwlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKKworCS8vCisJLy8gdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUKKwkvLyA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZworCS8vCisKKwkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKKwl7CisJCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOworCX0KKworCS8vIDIuIFFPUworCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOworCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKKwkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAorCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CisJCX0KKworCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7CisJfQorCXBSeEJsay0+VXNlclByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gMy4gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisJaWYgKHBIZWFkZXItPkZDLk9yZGVyKQorCXsKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCWlmICgocFJ4V0ktPlBIWU1PREUgPD0gTU9ERV9PRkRNKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSFRDKTsKKwkJCS8vIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+cERhdGEgKz0gNDsKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCX0KKworCS8vIDQuIHNraXAgSFcgcGFkZGluZworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCS8vIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyCisJCS8vIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7CisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocFJ4RC0+QkEpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJLy8KKwkvLyBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUKKwkvLworCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkKKwl7CisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50KTsKKworCQkvLyBEcm9wIE1jYXN0L0JjYXN0IGZyYW1lIHdpdGggZnJhZ21lbnQgYml0IG9uCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cworCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChwUnhELT5VMk0pCisJeworCQlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorICAgICAgICBpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9ETFMpKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBEbHNFbnRyeSA9IE5VTEw7CisKKwkJCXBEbHNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlci0+QWRkcjIsIFRSVUUpOworCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEbHNFbnRyeSkKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRGxzRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKKwkJCWlmIChwRW50cnkpCisJCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQl9CisKKworCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOworCisKKyAgICAJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKKyAgICAJeworICAgIAkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworICAgIAkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKKyAgICAJCWJGcmFnbWVudCA9IFRSVUU7CisgICAgCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7CisgICAgCX0KKworICAgIAlpZiAocFJ4UGFja2V0KQorICAgIAl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisKKyAgICAJCS8vIHByb2Nlc3MgY29tcGxldGUgZnJhbWUKKyAgICAJCWlmIChiRnJhZ21lbnQgJiYgKHBSeEQtPkRlY3J5cHRlZCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorICAgIAkJeworCQkJCS8vIE1pbnVzIE1JQyBsZW5ndGgKKwkJCQlwUnhCbGstPkRhdGFTaXplIC09IDg7CisKKyAgICAJCQkvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKKyAgICAJCQlpZiAoU1RBQ2hlY2tUa2lwTUlDVmFsdWUocEFkLCBwRW50cnksIHBSeEJsaykgPT0gRkFMU0UpCisgICAgCQkJeworICAgIAkJCQlyZXR1cm47CisgICAgCQkJfQorICAgIAkJfQorCisgICAgCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKyAgICAJfQorICAgIAllbHNlCisgICAgCXsKKyAgICAJCS8vIGp1c3QgcmV0dXJuCisgICAgCQkvLyBiZWNhdXNlIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKCkgd2lsbCByZWxlYXNlIHJ4IHBhY2tldCwKKyAgICAJCS8vIGlmIHBhY2tldCBpcyBmcmFnbWVudGVkCisgICAgCQlyZXR1cm47CisgICAgCX0KKwl9CisKKwlBU1NFUlQoMCk7CisJLy8gcmVsZWFzZSBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeE1nbXRGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJZG8KKwl7CisKKwkJLy8gV2Ugc2hvdWxkIGNvbGxlY3QgUlNTSSBub3Qgb25seSBVMk0gZGF0YSBidXQgYWxzbyBteSBiZWFjb24KKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSAmJiAoTUFDX0FERFJfRVFVQUwoJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCAmcEhlYWRlci0+QWRkcjIpKSkKKwkJeworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisJCX0KKworCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCQkJYnJlYWs7CisJCX0KKworCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpCisJeworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXsKKwkJCQlDbnRsRW5xdWV1ZUZvclJlY3YocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpLCAoUEZSQU1FX0JBX1JFUSlwSGVhZGVyKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQljYXNlIFNVQlRZUEVfQUNLOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUnhEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgaGFzIHRvIG1haW50YWluIFJ4IHJpbmcgcmVhZCBwb2ludGVyLgorCQlOZWVkIHRvIGNvbnNpZGVyIFFPUyBEQVRBIGZvcm1hdCB3aGVuIGNvbnZlcnRpbmcgdG8gODAyLjMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYykKK3sKKwlORElTX1NUQVRVUwkJCVN0YXR1czsKKwlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7CisJVUNIQVIJCQkqcERhdGE7CisJUFJYV0lfU1RSVUMJCXBSeFdJOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKKwlSWF9CTEsJCQlSeENlbGw7CisKKwlSeFByb2Nlc3NlZCA9IFJ4UGVuZGluZyA9IDA7CisKKwkvLyBwcm9jZXNzIHdob2xlIHJ4IHJpbmcKKwl3aGlsZSAoMSkKKwl7CisKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAorCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFJUMjg2MAorCQlpZiAoUnhQcm9jZXNzZWQrKyA+IE1BWF9SWF9QUk9DRVNTX0NOVCkKKwkJeworCQkJLy8gbmVlZCB0byByZXNjaGVkdWxlIHJ4IGhhbmRsZQorCQkJYlJlc2NoZWR1bGUgPSBUUlVFOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlSeFByb2Nlc3NlZCArKzsgLy8gdGVzdAorCisJCS8vIDEuIGFsbG9jYXRlIGEgbmV3IGRhdGEgcGFja2V0IGludG8gcnggcmluZyB0byByZXBsYWNlIHJlY2VpdmVkIHBhY2tldAorCQkvLyAgICB0aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIHBhY2tldAorCQkvLyAyLiB0aGUgY2FsbGVlIG11c3QgdGFrZSBjaGFyZ2Ugb2YgcmVsZWFzZSBvZiBwYWNrZXQKKwkJLy8gMy4gQXMgZmFyIGFzIGRyaXZlciBpcyBjb25jZXJuZWQgLAorCQkvLyAgICB0aGUgcnggcGFja2V0IG11c3QKKwkJLy8gICAgICBhLiBiZSBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIgb3IKKwkJLy8gICAgICBiLiBiZSByZWxlYXNlZCBpZiBpdCBpcyBkaXNjYXJkZWQKKwkJcFJ4UGFja2V0ID0gR2V0UGFja2V0RnJvbVJ4UmluZyhwQWQsICYoUnhDZWxsLlJ4RCksICZiUmVzY2hlZHVsZSwgJlJ4UGVuZGluZyk7CisJCWlmIChwUnhQYWNrZXQgPT0gTlVMTCkKKwkJeworCQkJLy8gbm8gbW9yZSBwYWNrZXQgdG8gcHJvY2VzcworCQkJYnJlYWs7CisJCX0KKworCQkvLyBnZXQgcnggcmluZyBkZXNjcmlwdG9yCisJCXBSeEQgPSAmKFJ4Q2VsbC5SeEQpOworCQkvLyBnZXQgcnggZGF0YSBidWZmZXIKKwkJcERhdGEJPSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGFja2V0KTsKKwkJcFJ4V0kJPSAoUFJYV0lfU1RSVUMpIHBEYXRhOworCQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSAocERhdGErUlhXSV9TSVpFKSA7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJICAgIFJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlciwgRElSX1JFQUQsIFRSVUUpOworCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhXSSwgVFlQRV9SWFdJKTsKKyNlbmRpZgorCisJCS8vIGJ1aWxkIFJ4Q2VsbAorCQlSeENlbGwucFJ4V0kgPSBwUnhXSTsKKwkJUnhDZWxsLnBIZWFkZXIgPSBwSGVhZGVyOworCQlSeENlbGwucFJ4UGFja2V0ID0gcFJ4UGFja2V0OworCQlSeENlbGwucERhdGEgPSAoVUNIQVIgKikgcEhlYWRlcjsKKwkJUnhDZWxsLkRhdGFTaXplID0gcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJUnhDZWxsLkZsYWdzID0gMDsKKworCQkvLyBJbmNyZWFzZSBUb3RhbCByZWNlaXZlIGJ5dGUgY291bnRlciBhZnRlciByZWFsIGRhdGEgcmVjZWl2ZWQgbm8gbWF0ZXIgYW55IGVycm9yIG9yIG5vdAorCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50ICs9ICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgKys7CisKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQpOworCisJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IDwgMTQpCisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCisgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKyAgICAgICAgICAgIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBSVDI4NzAgaW52b2tlcyBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpbiBydHVzYl9idWxrLmMgKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJCWlmIChBVEVfT04ocEFkKSkKKwkJeworCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKKwkJCUFURVNhbXBsZVJzc2kocEFkLCBwUnhXSSk7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJCWlmIChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpCisJCQl7CisJCQkJLyogKCpwUnhEKSBoYXMgYmVlbiBzd2FwcGVkIGluIEdldFBhY2tldEZyb21SeFJpbmcoKSAqLworCQkJCUFURV9RQV9TdGF0aXN0aWNzKHBBZCwgcFJ4V0ksIHBSeEQsCXBIZWFkZXIpOworCQkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycworCQlTdGF0dXMgPSBSVE1QQ2hlY2tSeEVycm9yKHBBZCwgcEhlYWRlciwgcFJ4V0ksIHBSeEQpOworCisJCS8vIEhhbmRsZSB0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlzd2l0Y2ggKHBIZWFkZXItPkZDLlR5cGUpCisJCQl7CisJCQkJLy8gQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZQorCQkJCWNhc2UgQlRZUEVfREFUQToKKwkJCQl7CisJCQkJCS8vIHByb2Nlc3MgREFUQSBmcmFtZQorCQkJCQlTVEFIYW5kbGVSeERhdGFGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBDQVNFIElJLCByZWNlaXZlIGEgTUdNVCBmcmFtZQorCQkJCWNhc2UgQlRZUEVfTUdNVDoKKwkJCQl7CisJCQkJCVNUQUhhbmRsZVJ4TWdtdEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZQorCQkJCWNhc2UgQlRZUEVfQ05UTDoKKwkJCQl7CisJCQkJCVNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIGRpc2NhcmQgb3RoZXIgdHlwZQorCQkJCWRlZmF1bHQ6CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzKys7CisJCQkvLyBkaXNjYXJkIHRoaXMgZnJhbWUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJcmV0dXJuIGJSZXNjaGVkdWxlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUFzaWNGb3JjZVdha2V1cChwQWQsIEZBTFNFKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFYXJseSBjaGVja2luZyBhbmQgT1MtZGVwZW5lZCBwYXJzaW5nIGZvciBUeCBwYWNrZXQgc2VuZCB0byBvdXIgU1RBIGRyaXZlci4KKworQXJndW1lbnRzOgorICAgIE5ESVNfSEFORExFIAlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CVBvaW50ZXIgcmVmZXIgdG8gdGhlIGRldmljZSBoYW5kbGUsIGkuZS4sIHRoZSBwQWQuCisJUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5CQkJVGhlIHBhY2tldCBhcnJheSBuZWVkIHRvIGRvIHRyYW5zbWlzc2lvbi4KKwlVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzCQkJTnVtYmVyIG9mIHBhY2tldCBpbiBwYWNrZXQgYXJyYXkuCisKK1JldHVybiBWYWx1ZToKKwlOT05FCisKK05vdGU6CisJVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KKwlZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKKwlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKQoreworCVVJTlQJCQlJbmRleDsKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCUJPT0xFQU4JCQlhbGxvd1RvU2VuZCA9IEZBTFNFOworCisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOdW1iZXJPZlBhY2tldHM7IEluZGV4KyspCisJeworCQlwUGFja2V0ID0gcHBQYWNrZXRBcnJheVtJbmRleF07CisKKwkJZG8KKwkJeworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykgfHwKKwkJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCXsKKwkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSBoYXJkd2FyZSBpcyBpbiByZXNldCBzdGF0ZQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCFJTkZSQV9PTihwQWQpICYmICFBREhPQ19PTihwQWQpKQorCQkJeworCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBwaHlzaWNhbCBjb25uZWN0aW9uIHlldAorCQkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBSZWNvcmQgdGhhdCBvcmlnbmFsIHBhY2tldCBzb3VyY2UgaXMgZnJvbSBORElTIGxheWVyLHNvIHRoYXQKKwkJCQkvLyBsYXRlciBvbiBkcml2ZXIga25vd3MgaG93IHRvIHJlbGVhc2UgdGhpcyBORElTIFBBQ0tFVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCVBVQ0hBUiBwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CisJCQkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQkJCXsKKwkJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgcEVudHJ5LT5BaWQpOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgMCk7IC8vIHRoaXMgZmllbGQgaXMgdXNlbGVzcyB3aGVuIGluIFNUQSBtb2RlCisJCQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisJCQkJTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhwUGFja2V0LCBORElTX1NUQVRVU19QRU5ESU5HKTsKKwkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQrKzsKKworCQkJCWFsbG93VG9TZW5kID0gVFJVRTsKKwkJCX0KKwkJfSB3aGlsZShGQUxTRSk7CisKKwkJaWYgKGFsbG93VG9TZW5kID09IFRSVUUpCisJCQlTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCWVsc2UKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBEZXF1ZXVlIG91dGdvaW5nIGZyYW1lcyBmcm9tIFR4U3dRdWV1ZVtdIGFuZCBwcm9jZXNzIGl0CisJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZG8gcGFja2V0IHBhcnNpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBUeCBwYWNrZXQKKwl0byBTVEEgZGV2aWNlLCBhbmQgaXQgd2lsbCBlbi1xdWV1ZSBwYWNrZXRzIHRvIG91ciBUeFN3UXVldWUgZGVwZW5kcyBvbiBBQworCWNsYXNzLgorCitBcmd1bWVudHM6CisJcEFkICAgIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCXBQYWNrZXQgCVBvaW50ZXIgdG8gc2VuZCBwYWNrZXQKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCQlJZiBzdWNjZXMgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KKwlORElTX1NUQVRVU19GQUlMVVJFCQkJSWYgZmFpbGVkIHRvIGRvIGVuLXF1ZXVlLgorCitOb3RlOgorCVlvdSBvbmx5IGNhbiBwdXQgT1MtaW5kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlVSU5UCQkJQWxsb3dGcmFnU2l6ZTsKKwlVQ0hBUgkJCU51bWJlck9mRnJhZzsKKwlVQ0hBUgkJCVF1ZUlkeCwgVXNlclByaW9yaXR5OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgCUlycUZsYWdzOworCVVDSEFSCQkJRmxnSXNJUCA9IDA7CisJVUNIQVIJCQlSYXRlOworCisJLy8gUHJlcGFyZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBidWZmZXIgZGVzY3JpcHRvcgorCS8vIGNoYWluZWQgd2l0aGluIGEgc2luZ2xlIE5ESVMgcGFja2V0LgorCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgISEhU3JjQnVmTGVuPSV4XG4iLFNyY0J1ZkxlbikpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCWlmIChTcmNCdWZMZW4gPCAxNCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4KKwkvLyBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguCisJeworCQlpZihJTkZSQV9PTihwQWQpKQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlVU0hPUlQJdG1wV2NpZDsKKworCQkJdG1wV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCQkJaWYgKFZBTElEX1dDSUQodG1wV2NpZCkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5WYWxpZEFzRGxzPT0gVFJVRSkpCisJCQl7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF07CisJCQkJUmF0ZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uQ3VyclR4UmF0ZTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJCX0KKwkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQorCQkJeworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIE1DQVNUX1dDSUQpOworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCX0KKwkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCX0KKwl9CisKKwlpZiAoIXBFbnRyeSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLCBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkKQorCQkpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCX0KKworCS8vCisJLy8gQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4KKwkvLwkJSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuCisJUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7CisKKworCisJLy8KKwkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCisJLy8KKwlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJICB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJICApCisJCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCisJCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQorCQkgICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisKKwkvLyBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLgorCS8vCSAgIFRoZSBlc3RpbWF0aW9uIGhlcmUgaXMgbm90IHZlcnkgYWNjdXJhdGUgYmVjYXVzZSBkaWZmaWN1bHQgdG8KKwkvLwkgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQKKwkvLwkgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUKKwkvLwkgICBUWEQgYXJlIGF2YWlsYWJsZSB0byBob2xkIHRoaXMgTVNEVS4KKworCisJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQkvLyBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkIG9uIG11bHRpY2FzdCAmIGJyb2FkY2FzdAorCQlOdW1iZXJPZkZyYWcgPSAxOworCWVsc2UgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKKwkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKKwkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCisJCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0CisJCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKKwkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgorCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAorCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgorCisJCUFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7CisJCU51bWJlck9mRnJhZyA9ICgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAvIEFsbG93RnJhZ1NpemUpICsgMTsKKwkJLy8gVG8gZ2V0IGFjY3VyYXRlIG51bWJlciBvZiBmcmFnbWVudGF0aW9uLCBNaW51cyAxIGlmIHRoZSBzaXplIGp1c3QgbWF0Y2ggdG8gYWxsb3dhYmxlIGZyYWdtZW50IHNpemUKKwkJaWYgKCgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAlIEFsbG93RnJhZ1NpemUpID09IDApCisJCXsKKwkJCU51bWJlck9mRnJhZy0tOworCQl9CisJfQorCisJLy8gU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQKKwlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7CisKKworCS8vIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzoKKwkvLwkgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudAorCS8vCSAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGxhcmdlIHRoYW4gUlRTIHRocmVzaG9sZAorCS8vICAgICBGb3IgUlQyOHh4LCBMZXQgQVNJQyBzZW5kIFJUUy9DVFMKKwlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOworCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKKworCS8vCisJLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgorCS8vCisJVXNlclByaW9yaXR5ID0gMDsKKwlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkKKwl7CisJCVVTSE9SVCBQcm90b2NvbDsKKwkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7CisJCWRvCisJCXsKKwkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOworCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCisJCQl7CisJCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKKwkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCisJCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQkJTGxjU25hcExlbiA9IDg7CisJCQl9CisKKwkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAorCQkJaWYgKFByb3RvY29sICE9IDB4MDgwMCkKKwkJCQlicmVhazsKKworCQkJLy8gZ2V0IElQIGhlYWRlcgorCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIExsY1NuYXBMZW4sICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQkvLyByZXR1cm4gQUNfQkUgaWYgcGFja2V0IGlzIG5vdCBJUHY0CisJCQlpZiAoKEJ5dGUwICYgMHhmMCkgIT0gMHg0MCkKKwkJCQlicmVhazsKKworCQkJRmxnSXNJUCA9IDE7CisJCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OworCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOworCisJCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgorCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKQorCQkJeworCQkJCVVzZXJQcmlvcml0eSA9IDA7CisJCQkJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisKKwlSVE1QX1NFVF9QQUNLRVRfVVAocFBhY2tldCwgVXNlclByaW9yaXR5KTsKKworCisKKwkvLyBNYWtlIHN1cmUgU2VuZFR4V2FpdCBxdWV1ZSByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJCVN0b3BOZXRJZlF1ZXVlKHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwllbHNlCisJeworCQlJbnNlcnRUYWlsUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpJiYKKyAgICAgICAgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQorCXsKKwkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCisgICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCisgICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKwkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCisJCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKKwkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAorCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCisJCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAorCQkJIAkgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCB8fCBwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJCSkKKwkJeworCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIDAsIDAsIDEwLCBGQUxTRSk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRdWVJZHhdKys7IC8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxlYXRpdmUgcmluZyBkZXNjcmlwdG9yIHRvIGZpbmQKKwkJb3V0IGF2YWxpYWJsZSBmcmVlIHJpbmcgZGVzY3JpcHRvciBhbmQgY29tcGFyZSB3aXRoIHJlcXVlc3Qgc2l6ZS4KKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUXVlSWR4CQlTZWxlY3RlZCBUWCBSaW5nCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgCU5vdCBlbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgCUVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlRdWVJZHgsCisJSU4JCVVDSEFSCQkJTnVtYmVyUmVxdWlyZWQsCisJSU4JCVBVQ0hBUgkJCUZyZWVOdW1iZXJJcykKK3sKKwlVTE9ORwkJRnJlZU51bWJlciA9IDA7CisJTkRJU19TVEFUVVMgCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JLOgorCQljYXNlIFFJRF9BQ19CRToKKwkJY2FzZSBRSURfQUNfVkk6CisJCWNhc2UgUUlEX0FDX1ZPOgorCQljYXNlIFFJRF9IQ0NBOgorCQkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4IC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7CisJCQllbHNlCisJCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKKworCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWNhc2UgUUlEX01HTVQ6CisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCisJCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKKwkJCWVsc2UKKwkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7CisKKwkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQorCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCSpGcmVlTnVtYmVySXMgPSAoVUNIQVIpRnJlZU51bWJlcjsKKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKK1ZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworfQorCitWT0lECVJUTVBTZW5kTnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCUJPT0xFQU4gCQliUW9zTnVsbCkKK3sKKwlVQ0hBUglOdWxsRnJhbWVbNDhdOworCVVMT05HCUxlbmd0aDsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICAvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sCisgICAgaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisjZW5kaWYKKyAgICAgICAgKSAmJgorICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCXsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KE51bGxGcmFtZSwgNDgpOworCUxlbmd0aCA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDE6IDA7CisJfQorCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFR4UmF0ZSwgMTQpOworCisJcEFkLT5TZXF1ZW5jZSsrOworCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisKKwkvLyBQcmVwYXJlIFFvc051bGwgZnVuY3Rpb24gZnJhbWUKKwlpZiAoYlFvc051bGwpCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfUU9TX05VTEw7CisKKwkJLy8gY29weSBRT1MgY29udHJvbCBieXRlcworCQlOdWxsRnJhbWVbTGVuZ3RoXQk9ICAwOworCQlOdWxsRnJhbWVbTGVuZ3RoKzFdID0gIDA7CisJCUxlbmd0aCArPSAyOy8vIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwKKwl9CisKKwlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOworCit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJUlRTUmF0ZSwKKwlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVQ0hBUgkJCUZyYW1lR2FwKQoreworfQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITQorLy8JCUZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkKKy8vCQlMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0CisvLyBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24KKy8vCQkgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleQorLy8JCSAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4KK1ZPSUQgU1RBRmluZENpcGhlckFsZ29yaXRobSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUNpcGhlcjsJCQkJLy8gVG8gaW5kaWNhdGUgY2lwaGVyIHVzZWQgZm9yIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CQkvLyBjaXBoZXIgYWxvZ3JpdGhtCisJVUNIQVIJCQkJCQkJS2V5SWR4ID0gMHhmZjsKKwlQVUNIQVIJCQkJCQkJcFNyY0J1ZlZBOworCVBDSVBIRVJfS0VZCQkJCQkJcEtleSA9IE5VTEw7CisKKwlwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFR4QmxrLT5wUGFja2V0KTsKKworCXsKKwkgICAgLy8gU2VsZWN0IENpcGhlcgorCSAgICBpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsgLy8gQ2lwaGVyIGZvciBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0CisJICAgIGVsc2UKKwkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXI7IC8vIENpcGhlciBmb3IgVW5pY2FzdAorCisJCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJeworCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PSBDSVBIRVJfQ0tJUDEyOCk7CisKKwkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKKwkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgorCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQorCQkJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCQlLZXlJZHggPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAvLyBDaXNjbyBDS0lQIEtQIGlzIG9uCisJCQl7CisJCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJCXsKKwkJCQkJaWYgKCgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkpCisJCQkJCQlLZXlJZHggPSAxOworCQkJCQllbHNlCisJCQkJCQlLZXlJZHggPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgwOCkgLy8gb25seSBDS0lQIENNSUMKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJCQkJCUtleUlkeCA9IDE7CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSAwOworCQkJfQorCQkJZWxzZQkvLyBzdGFuZGFyZCBXRVA2NCBvciBXRVAxMjgKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCSAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpIC8vIG11bHRpY2FzdAorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikKKwkJCQlLZXlJZHggPSAwOworCQkJZWxzZQorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJfQorCisJCWlmIChLZXlJZHggPT0gMHhmZikKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpIHx8IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSAwKSkKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgZWxzZSBpZiAoIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCSAgICAgICAgICAgICAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkgJiYKKwkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCWVsc2UKKwkJeworCQkJLy9IZWFkZXJfODAyXzExLkZDLldlcCA9IDE7CisJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJCXBLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XTsKKwkJfQorCX0KKworCXBUeEJsay0+Q2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCXBUeEJsay0+cEtleSA9IHBLZXk7Cit9CisKKworVk9JRCBTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVFhfQkxLICAgICAgICAgICpwVHhCbGspCit7CisKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCUlOVAlEbHNFbnRyeUluZGV4ID0gMDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vCisJLy8gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSCisJLy8KKworCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCisJTmRpc1plcm9NZW1vcnkocEhlYWRlcl84MDJfMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuRnJEcyA9IDA7CisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gKChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKSA/IFNVQlRZUEVfUURBVEEgOiBTVUJUWVBFX0RBVEEpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJaWYgKElORlJBX09OKHBBZCkpCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorCQlEbHNFbnRyeUluZGV4ID0gUlRNUENoZWNrRExTRnJhbWUocEFkLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQlpZiAoRGxzRW50cnlJbmRleCA+PSAwKQorCQkJYkRMU0ZyYW1lID0gVFJVRTsKKwkJZWxzZQorCQkJYkRMU0ZyYW1lID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisgICAgaWYgKHBUeEJsay0+cE1hY0VudHJ5KQorCXsKKwkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkKKwkJeworCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXE7CisJCQlwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSA9IChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSsxKSAmIE1BWFNFUTsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChiRExTRnJhbWUpCisJCQl7CisJCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJbmRleF0uU2VxdWVuY2U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJbmRleF0uU2VxdWVuY2UgPSAocEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJbmRleF0uU2VxdWVuY2UrMSkgJiBNQVhTRVE7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisgICAgCSAgICBwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIAkgICAgcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9IChwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworICAgIAl9CisJfQorCX0KKwllbHNlCisJeworCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UrMSkgJiBNQVhTRVE7IC8vIG5leHQgc2VxdWVuY2UKKwl9CisKKwlwSGVhZGVyXzgwMl8xMS0+RnJhZyA9IDA7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisKKwl7CisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoYkRMU0ZyYW1lKQorCQkJeworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwkJfQorCQl9CisJCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKKwkJfQorCX0KKworCWlmIChwVHhCbGstPkNpcGhlckFsZyAhPSBDSVBIRVJfTk9ORSkKKwkJcEhlYWRlcl84MDJfMTEtPkZDLldlcCA9IDE7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKyAgICAJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwllbHNlCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gVFhfQkxLCQkJKnBUeEJsaywKKwlJTiBVQ0hBUgkJCSpwSGVhZGVyKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OworCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKKworCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwSGVhZGVyOworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisJLy8KKwkvLyBVcGRhdGUgdGhlIGNhY2hlZCA4MDIuMTEgSEVBREVSCisJLy8KKworCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gTW9yZSBCaXQKKwlwSGVhZGVyODAyMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJLy8gU2VxdWVuY2UKKwlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisgICAgcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisKKwl7CisJCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKwkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7CisJCUlOVAlEbHNFbnRyeUluZGV4ID0gMDsKKworCQlEbHNFbnRyeUluZGV4ID0gUlRNUENoZWNrRExTRnJhbWUocEFkLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQlpZiAoRGxzRW50cnlJbmRleCA+PSAwKQorCQkJYkRMU0ZyYW1lID0gVFJVRTsKKwkJZWxzZQorCQkJYkRMU0ZyYW1lID0gRkFMU0U7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gVGhlIGFkZHIzIG9mIG5vcm1hbCBwYWNrZXQgc2VuZCBmcm9tIERTIGlzIERlc3QgTWFjIGFkZHJlc3MuCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChiRExTRnJhbWUpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcEhlYWRlcjgwMjExLT5GQy5Ub0RzID0gMDsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBORElTX1BBQ0tFVAlwTmV4dFBhY2tldDsKKwlVSU5UMzIJCQluZXh0QnVmTGVuOworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIKKwlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlci4gTExDIGhlYWRlciBzaG91bGQgYXQgNC1ieXRlcyBhbGlnbWVudC4KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkvLyBGb3IgUkEgQWdncmVnYXRpb24sCisJLy8gcHV0IHRoZSAybmQgTVNEVSBsZW5ndGgoZXh0cmEgMi1ieXRlIGZpZWxkKSBhZnRlciBRT1NfQ09OVFJPTCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAorCXBRRW50cnkgPSBwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkOworCXBOZXh0UGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBRRW50cnkpOworCW5leHRCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwTmV4dFBhY2tldCk7CisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBOZXh0UGFja2V0KSkKKwkJbmV4dEJ1ZkxlbiAtPSBMRU5HVEhfODAyXzFROworCisJKnBIZWFkZXJCdWZQdHIgPSAoVUNIQVIpbmV4dEJ1ZkxlbiAmIDB4ZmY7CisJKihwSGVhZGVyQnVmUHRyKzEpID0gKFVDSEFSKShuZXh0QnVmTGVuID4+IDgpOworCisJcEhlYWRlckJ1ZlB0ciArPSAyOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJLy8KKwkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCS8vCisJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCS8vCisJLy8gQS1NU0RVIHBhY2tldAorCS8vCisJKnBIZWFkZXJCdWZQdHIgfD0gMHg4MDsKKworCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJcEhlYWRlckJ1ZlB0ciArPTI7CisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKKworCS8vCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJLy8KKwkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKKwkvLworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKKworfQorCisKK1ZPSUQgU1RBX0FNUERVX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQlpZiAoIFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworCQkJLy8gTk9URTogUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiBwTWFjRW50cnktPkNhY2hlZEJ1ZltdIGlzIHNtYWxsZXIgdGhhbiBwVHhCbGstPkhlYWRlckJ1ZltdISEhIQorCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdLCAoUFVDSEFSKSZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSwgVFhXSV9TSVpFICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCXBIZWFkZXJCdWZQdHIgPSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdKTsKKwkJCVNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIocEFkLCBwVHhCbGssIHBIZWFkZXJCdWZQdHIpOworCQl9CisJCWVsc2UKKwkJeworCQkJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJCQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCQl9CisKKworCQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCQkvLworCQkvLyBidWlsZCBIVEMrCisJCS8vIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQKKwkJLy8KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCisJCXsKKwkJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkID09IEZBTFNFKQorCQkJeworCQkJCS8vIG1hcmsgSFRDIGJpdAorCQkJCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCA0KTsKKwkJCQkqKHBIZWFkZXJCdWZQdHIrMykgfD0gMHg4MDsKKwkJCX0KKwkJCXBIZWFkZXJCdWZQdHIgKz0gNDsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSA0OworCQl9CisKKwkJLy9wVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsKKwkJQVNTRVJUKHBUeEJsay0+TXBkdUhlYWRlckxlbiA+PSAyNCk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCS8vCisJCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkJLy8KKwkJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJCS8vCisJCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCQl7CisKKwkJCS8vCisJCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCQkvLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQl9CisKKwkJfQorCisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQorCQl7CisgICAgICAgICAgICBSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIHNpemVvZihwTWFjRW50cnktPkNhY2hlZEJ1ZikpOworCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIChwSGVhZGVyQnVmUHRyIC0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSkpKTsKKwkJCXBNYWNFbnRyeS0+aXNDYWNoZWQgPSBUUlVFOworCQl9CisKKwkJLy8gY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNUERVIGNvdW50IGFuZCBCeXRlQ291bnQKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50LnUuTG93UGFydCArKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQuUXVhZFBhcnQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJCX0KKworCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwkJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOworCisJCS8vCisJCS8vIEtpY2sgb3V0IFR4CisJCS8vCisJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKwl9CisKK30KKworCitWT0lEIFNUQV9BTVNEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQlzdWJGcmFtZVBheWxvYWRMZW4gPSAwOwkvLyBBTVNEVSBTdWJmcmFtZSBsZW5ndGggd2l0aG91dCBBTVNEVS1IZWFkZXIgLyBQYWRkaW5nLgorCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKKwlVQ0hBUgkJCSpzdWJGcmFtZUhlYWRlcjsKKwlVQ0hBUgkJCXBhZGRpbmcgPSAwOworCVVTSE9SVAkJCUZpcnN0VHggPSAwLCBMYXN0VHhJZHggPSAwOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlpbnQgCQkJZnJhbWVOdW0gPSAwOworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID4gMSkpOworCisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCS8vIE5PVEU6IFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCQl9CisJCWVsc2UKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKKwkJCXBhZGRpbmcgPSBST1VORF9VUChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuLCA0KSAtIChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBhZGRpbmcgKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gcGFkZGluZzsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBhZGRpbmc7CisJCX0KKworCQkvLworCQkvLyBBLU1TRFUgc3ViZnJhbWUKKwkJLy8gICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcAorCQkvLworCQlzdWJGcmFtZUhlYWRlciA9IHBIZWFkZXJCdWZQdHI7CisJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCU5kaXNNb3ZlTWVtb3J5KHN1YkZyYW1lSGVhZGVyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKworCisJCXBIZWFkZXJCdWZQdHIgKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisKKworCQkvLworCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCS8vCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCisJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJc3ViRnJhbWVQYXlsb2FkTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwkJLy8gdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZAorCQlzdWJGcmFtZUhlYWRlclsxMl0gPSAoc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjAwKSA+PiA4OworCQlzdWJGcmFtZUhlYWRlclsxM10gPSBzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGOworCisJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCArKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9IHRvdGFsTVBEVVNpemU7CisJCX0KKworCX0KKworCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CisJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFNUQV9MZWdhY3lfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJQVNTRVJUKHBUeEJsayk7CisKKworCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTUNBU1RfRlJBTUUpCisJeworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudCk7CisJfQorCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9SVFMocFR4QmxrLT5wUGFja2V0KSkKKwkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7CisJZWxzZQorCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlpZiAocFR4QmxrLT5UeFJhdGUgPCBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUpCisJCXBUeEJsay0+VHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisKKwkvLyBza2lwIDgwMi4zIGhlYWRlcgorCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwl7CisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQkvLworICAgCQkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKKwkJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCVVDSEFSIHZsYW5fc2l6ZTsKKworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJLy8gc2tpcCB2bGFuIHRhZworCQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCX0KKworCX0KKworCS8vCisJLy8gcHJlcGFyZSBmb3IgVFhXSQorCS8vIHVzZSBXY2lkIGFzIEtleSBJbmRleAorCS8vCisKKwlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCitWT0lEIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKKwlVU0hPUlQJCQlGaXJzdFR4LCBMYXN0VHhJZHg7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7CisKKworCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOyAgLy8gSXMgaXQgb2sgaW5pdCB0aGV5IGFzIDA/CisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJaWYgKGZyYW1lTnVtID09IDApCisJCXsJLy8gRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyCisKKwkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAorCQkJLy8Jd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CS8vIEZvciBzZWNvbmQgYWdncmVnYXRlZCBmcmFtZSwgd2UgbmVlZCBjcmVhdGUgdGhlIDgwMi4zIGhlYWRlciB0byBoZWFkZXJCdWYsIGJlY2F1c2UgUENJIHdpbGwgY29weSBpdCB0byBTRFB0cjAuCisKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSAwOworCisJCQkvLyBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLgorCQkJLy8gICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRDsKKwkJfQorCisJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQlpZiAoZnJhbWVOdW0gPT0wKQorCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJZWxzZQorCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCisJCWZyYW1lTnVtKys7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKKworfQorCisKK1ZPSUQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVUNIQVIgCQkJZnJhZ051bSA9IDA7CisJUEFDS0VUX0lORk8JCVBhY2tldEluZm87CisJVVNIT1JUCQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKwlVSU5UMzIJCQlGcmVlTXBkdVNpemUsIFNyY1JlbWFpbmluZ0J5dGVzOworCVVTSE9SVAkJCUFja0R1cmF0aW9uOworCVVJTlQgCQkJTmV4dE1wZHVTaXplOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpKTsKKwliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisJCXBUeEJsay0+cFBhY2tldCA9IGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhwQWQsIHBUeEJsay0+cFBhY2tldCk7CisJCWlmIChwVHhCbGstPnBQYWNrZXQgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKwl9CisKKwkvLyBza2lwIDgwMi4zIGhlYWRlcgorCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCisJLy8gc2tpcCB2bGFuIHRhZworCWlmIChiVkxBTlBrdCkKKwl7CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwl9CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopcEhlYWRlckJ1ZlB0cjsKKworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisKKworCS8vCisJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCS8vCisJLy8KKyAgIAkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKKwkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisJLy8KKwlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwl7CisJCVVDSEFSIHZsYW5fc2l6ZTsKKworCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJLy8gc2tpcCB2bGFuIHRhZworCQl2bGFuX3NpemUgPSAgKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7CisJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCX0KKworCisJLy8gSWYgVEtJUCBpcyB1c2VkIGFuZCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLiBEcml2ZXIgaGFzIHRvCisJLy8JYXBwZW5kIFRLSVAgTUlDIGF0IHRhaWwgb2YgdGhlIHNjYXR0ZXIgYnVmZmVyCisJLy8JTUFDIEFTSUMgd2lsbCBvbmx5IHBlcmZvcm0gSVYvRUlWL0lDViBpbnNlcnRpb24gYnV0IG5vIFRLSVAgTUlDCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsKKworCQkvLyBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0CisJCS8vCQkJdG8gY29ycmVjdCBsZW5naHQsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuCisJCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwgJnBBZC0+UHJpdmF0ZUluZm8uVHguTUlDWzBdLCA4KTsKKwkJLy9za2JfcHV0KChSVFBLVF9UT19PU1BLVChwVHhCbGstPnBQYWNrZXQpKS0+dGFpbCwgOCk7CisJCXBUeEJsay0+U3JjQnVmTGVuICs9IDg7CisJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSA4OworCQlwVHhCbGstPkNpcGhlckFsZyA9IENJUEhFUl9US0lQX05PX01JQzsKKwl9CisKKwkvLworCS8vIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMKKwkvLyBhZmZlY3RzIHRoZSBjYWxjdWxhdGUgb2YgImR1cmF0aW9uIiBmaWVsZAorCS8vCisJaWYgKChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpIHx8IChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KSkKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gODsgLy9XRVA6IElWWzRdICsgSUNWWzRdOworCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTI7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSwgTUlDIHdpbGwgYmUgYWRkZWQgdG8gVG90YWxQYWNrZXRMZW5ndGgKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMjA7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XQorCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9BRVMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvLyBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdCisJZWxzZQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOworCisJLy8gZGVjaWRlIGhvdyBtdWNoIHRpbWUgYW4gQUNLL0NUUyBmcmFtZSB3aWxsIGNvbnN1bWUgaW4gdGhlIGFpcgorCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKKworCS8vIEluaXQgdGhlIHRvdGFsIHBheWxvYWQgbGVuZ3RoIG9mIHRoaXMgZnJhbWUuCisJU3JjUmVtYWluaW5nQnl0ZXMgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCXBUeEJsay0+VG90YWxGcmFnTnVtID0gMHhmZjsKKworCWRvIHsKKworCQlGcmVlTXBkdVNpemUgPSBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCAtIExFTkdUSF9DUkM7CisKKwkJRnJlZU1wZHVTaXplIC09IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQlpZiAoU3JjUmVtYWluaW5nQnl0ZXMgPD0gRnJlZU1wZHVTaXplKQorCQl7CS8vIHRoaXMgaXMgdGhlIGxhc3Qgb3Igb25seSBmcmFnbWVudAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IFNyY1JlbWFpbmluZ0J5dGVzOworCisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAwOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCQkJLy8gSW5kaWNhdGUgdGhlIGxvd2VyIGxheWVyIHRoYXQgdGhpcydzIHRoZSBsYXN0IGZyYWdtZW50LgorCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSBmcmFnTnVtOworCQl9CisJCWVsc2UKKwkJewkvLyBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkCisKKwkJCXBUeEJsay0+U3JjQnVmTGVuID0gRnJlZU1wZHVTaXplOworCisJCQlOZXh0TXBkdVNpemUgPSBtaW4oKChVSU5UKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLCAoKFVJTlQpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDE7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAoMyAqIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzKSArICgyICogQWNrRHVyYXRpb24pICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLCBOZXh0TXBkdVNpemUgKyBFbmNyeXB0aW9uT3ZlcmhlYWQpOworCQl9CisKKwkJaWYgKGZyYWdOdW0gPT0gMCkKKwkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOworCQllbHNlCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX1NJRlM7CisKKwkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCQlIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgJkZyZWVOdW1iZXIpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJCS8vIFVwZGF0ZSB0aGUgZnJhbWUgbnVtYmVyLCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgTkRJUyBwYWNrZXQgcGF5bG9hZC4KKworCQkvLyBzcGFjZSBmb3IgODAyLjExIGhlYWRlci4KKwkJaWYgKGZyYWdOdW0gPT0gMCAmJiBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiAtPSBMRU5HVEhfODAyXzFfSDsKKworCQlmcmFnTnVtKys7CisJCVNyY1JlbWFpbmluZ0J5dGVzIC09IHBUeEJsay0+U3JjQnVmTGVuOworCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCXBIZWFkZXJfODAyXzExLT5GcmFnKys7CSAvLyBpbmNyZWFzZSBGcmFnICMKKworCX13aGlsZShTcmNSZW1haW5pbmdCeXRlcyA+IDApOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorCisKKyNkZWZpbmUgUkVMRUFTRV9GUkFNRVNfT0ZfVFhCTEsoX3BBZCwgX3BUeEJsaywgX3BRRW50cnksIF9TdGF0dXMpIAkJCQkJCQkJCQlcCisJCXdoaWxlKF9wVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQkJCQkJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCV9wUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZfcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJCQkJCQkJCVwKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKKwkJfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5CisJc2VudCBvdXQgdG8gYWlyLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFNUQUhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBUWF9CTEsgCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCkKK3sKKwlORElTX1BBQ0tFVAkJKnBQYWNrZXQ7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDAuIERPIFNBTklUWSBDSEVDSyBBTkQgU09NRSBFQVJMWSBQUkVQQVJBVElPTi4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLworCUFTU0VSVChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpOworCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHhCbGstPlRvdGFsRnJhbWVOdW0gPT0gJWxkIVxuIiwgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCk7CisKKyNpZiAwIC8vZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCWlmICgocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkgJiYgKGlzQ2FycmllckRldGVjdEV4aXN0KHBBZCkgPT0gVFJVRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiU1RBSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMS4gV0FLRSBVUCBQSFkKKwkvLwkJb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0IGFuZAorCS8vCQl0dXJuIG9mZiBQU00gYml0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBub3QgdG8gY2hhbmdlIFBTTSBiaXQsIGp1c3Qgc2VuZCB0aGlzIGZyYW1lIG91dD8KKwlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwl7CisJICAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljRm9yY2VXYWtldXAgQXQgSGFyZFR4XG4iKSk7CisJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCX0KKworCS8vIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLgorCWlmICgoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpICYmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID09IEZBTFNFKSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQorCQl8fCAoUlRNUF9HRVRfUEFDS0VUX1dBSShwVHhCbGstPnBQYWNrZXQpKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKKwkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwl9CisKKwlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFRYX0FNUERVX0ZSQU1FOgorCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9BTVNEVV9GUkFNRToKKwkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfTUNBU1RfRlJBTUU6CisJCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9SQUxJTktfRlJBTUU6CisJCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfRlJBR19GUkFNRToKKwkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl7CisJCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOworCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKKwkJCQl7CisJCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJCQkJaWYgKHBQYWNrZXQpCisJCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKworfQorCitVTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICB1bnNpZ25lZCBjaGFyICp3b3JkID0gdmFsdWU7CisgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCisgICB7CisJICBpbnQgbW9kID0gaSAlIDMyOworCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOworICAgfQorICAgcmV0dXJuIHJldDsKK30KKworVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlpZiAoVFJVRQorCQkpCisJeworCQlhbm5vdW5jZV84MDJfM19wYWNrZXQocEFkLCBwUGFja2V0KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk4NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJc2FuaXR5LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nICAyMDA0LTA5LTAxICAgICAgYWRkIFdNTSBzdXBwb3J0CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCit7CisgICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOworCisgICAgSW5mbyA9IChNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKikoTXNnKTsKKworICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKKyAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisgICAgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVVNIT1JUICpwQWlkLAorICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCisgICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKyAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKyAgICBPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisgICAgT1VUIFVDSEFSICpwQ2tpcEZsYWcpCit7CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworICAgIFBFSURfU1RSVUNUICAgcEVpZDsKKyAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7CisKKwkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKwkqcEFkZEh0SW5mb0xlbiA9IDA7CisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OworICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOworCisgICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgICAgICAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisgICAgKnBDa2lwRmxhZyA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOworCisgICAgaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybQorICAgICpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsgLy8gQUlEIGlzIGxvdyAxNC1iaXQKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFs2XTsKKyAgICAqcFN1cFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0WzddOworICAgIGlmICgoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpIHx8ICgqcFN1cFJhdGVMZW4gPiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRlZFJhdGVzIElFXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKKworICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47CisKKyAgICAvLyBtYW55IEFQIGltcGxlbWVudCBwcm9wcmlldGFyeSBJRXMgaW4gbm9uLXN0YW5kYXJkIG9yZGVyLCB3ZSdkIGJldHRlcgorICAgIC8vIHRvbGVyYXRlIG1pcy1vcmRlcmVkIElFcyB0byBnZXQgYmVzdCBjb21wYXRpYmlsaXR5CisgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgJnBGcmFtZS0+T2N0ZXRbOCArICgqcFN1cFJhdGVMZW4pXTsKKworICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCisgICAgeworICAgICAgICBzd2l0Y2ggKHBFaWQtPkVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBTSVpFX0hUX0NBUF9JRSk7CisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6CisJCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCisJCQl7CisJCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKKwkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKwkJCQkqcEFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQorCQkJeworCQkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IHBFaWQtPk9jdGV0WzBdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6CisgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBWeFdvcmsgdmVyc2lvbih3aWxsIG5vdCBiZSBzdXBwb3J0ZWQpIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMjgKKyAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIElPUyB2ZXJzaW9uIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMzAKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcworICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9JUEFERFJFU1M6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDBBKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gR2V0IENpc2NvIEFpcm9uZXQgSVAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIHBFaWQtPk9jdGV0ICsgNCwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIENDWDIsIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsdWUKKyAgICAgICAgICAgIC8vIGNhc2UgSUVfQ0NYX1YyOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIFdNRSBQQVJBTVRFUiBFTEVNRU5UCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIC8vcEVkY2FQYXJtLT5iTW9yZURhdGFBY2sgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDgwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIENDWCBJRQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIHRoZSBzaXplIGFuZCBDQ1ggYWRtaW4gY29udHJvbAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIENDWDIgaWYgbWF0Y2hlZAorICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDY3gySWVJbmZvLCA1KSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsIHBFaWQtPkVpZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsKKyAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisgICAgfQorCisgICAgLy8gRm9yY2UgQ0NYMiBlbmFibGUgdG8gVFJVRSBmb3IgdGhvc2UgQVAgZGlkbid0IHJlcGxheSBDQ1ggdjIgSUUsIHdlIHN0aWxsIGZvcmNlIGl0IHRvIGJlIG9uCisgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCit7CisgICAgVUNIQVIgICAgICAgICBJZHg7CisgICAgVUNIQVIJICAgICAgUmF0ZUxlbjsKKyAgICBDSEFSICAgICAgICAgIEllVHlwZTsKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisKKyAgICBpZiAoKHBGcmFtZS0+T2N0ZXRbMF0gIT0gSUVfU1NJRCkgfHwgKHBGcmFtZS0+T2N0ZXRbMV0gPiBNQVhfTEVOX09GX1NTSUQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0WzBdLHBGcmFtZS0+T2N0ZXRbMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IHBGcmFtZS0+T2N0ZXRbMV07CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgJnBGcmFtZS0+T2N0ZXRbMl0sICpwU3NpZExlbik7CisKKyAgICBJZHggPSAqcFNzaWRMZW4gKyAyOworCisgICAgLy8gLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBJZVR5cGUgPSBwRnJhbWUtPk9jdGV0W0lkeF07CisgICAgUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV07CisgICAgaWYgKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0UmF0ZXMgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbSWR4XSxwRnJhbWUtPk9jdGV0W0lkeCsxXSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoUmF0ZUxlbiA8IDgpKQorICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBHZXRUaW1CaXQoCisgICAgSU4gQ0hBUiAqUHRyLAorICAgIElOIFVTSE9SVCBBaWQsCisgICAgT1VUIFVDSEFSICpUaW1MZW4sCisgICAgT1VUIFVDSEFSICpCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpEdGltUGVyaW9kLAorICAgIE9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpCit7CisgICAgVUNIQVIgICAgICAgICAgQml0Q250bCwgTjEsIE4yLCBNeUJ5dGUsIE15Qml0OworICAgIENIQVIgICAgICAgICAgKklkeFB0cjsKKworICAgIElkeFB0ciA9IFB0cjsKKworICAgIElkeFB0ciArKzsKKyAgICAqVGltTGVuID0gKklkeFB0cjsKKworICAgIC8vIGdldCBEVElNIENvdW50IGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIgKys7CisgICAgKkR0aW1Db3VudCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBQZXJpb2QgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgICpEdGltUGVyaW9kID0gKklkeFB0cjsKKworICAgIC8vIGdldCBCaXRtYXAgQ29udHJvbCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyKys7CisgICAgQml0Q250bCA9ICpJZHhQdHI7CisKKyAgICBpZiAoKCpEdGltQ291bnQgPT0gMCkgJiYgKEJpdENudGwgJiAweDAxKSkKKyAgICAgICAgKkJjYXN0RmxhZyA9IFRSVUU7CisgICAgZWxzZQorICAgICAgICAqQmNhc3RGbGFnID0gRkFMU0U7CisKKyAgICAvLyBQYXJzZSBQYXJ0aWFsIFZpcnR1YWwgQml0bWFwIGZyb20gVElNIGVsZW1lbnQKKyAgICBOMSA9IEJpdENudGwgJiAweGZlOyAgICAvLyBOMSBpcyB0aGUgZmlyc3QgYml0bWFwIGJ5dGUjCisgICAgTjIgPSAqVGltTGVuIC0gNCArIE4xOyAgLy8gTjIgaXMgdGhlIGxhc3QgYml0bWFwIGJ5dGUjCisKKyAgICBpZiAoKEFpZCA8IChOMSA8PCAzKSkgfHwgKEFpZCA+PSAoKE4yICsgMSkgPDwgMykpKQorICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBNeUJ5dGUgPSAoQWlkID4+IDMpIC0gTjE7ICAgICAgICAgICAgICAgICAgICAgICAvLyBteSBieXRlIHBvc2l0aW9uIGluIHRoZSBiaXRtYXAgYnl0ZS1zdHJlYW0KKyAgICAgICAgTXlCaXQgPSBBaWQgJSAxNiAtICgoTXlCeXRlICYgMHgwMSk/IDg6MCk7CisKKyAgICAgICAgSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKKworICAgICAgICAvL2lmICgqSWR4UHRyKQorICAgICAgICAvLyAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlRJTSBiaXRtYXAgPSAweCUwMnhcbiIsICpJZHhQdHIpKTsKKworICAgICAgICBpZiAoKklkeFB0ciAmICgweDAxIDw8IE15Qml0KSkKKyAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IFRSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5NmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYwpAQCAtMCwwICsxLDE5NTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJc3luYy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDA0LTA5LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0MjU2MS8yNjYxCisJSmFuIExlZQkJMjAwNi0wOC0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI4NjAgZm9yIDgwMi4xMW4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgQUMwX0RFRl9UWE9QCQkwCisjZGVmaW5lIEFDMV9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzJfREVGX1RYT1AJCTk0CisjZGVmaW5lIEFDM19ERUZfVFhPUAkJNDcKKworVk9JRAlBZGhvY1R1cm5PblFvcygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gVHVybiBvbiBRT3MgaWYgdXNlIEhUIHJhdGUuCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gMTA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSA2OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gQUMyX0RFRl9UWE9QOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gQUMzX0RFRl9UWE9QOworCX0KKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIHN5bmMgc3RhdGUgbWFjaGluZSwKKwlQYXJhbWV0ZXJzOgorCQlTbSAtIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKwlOb3RlOgorCQl0aGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOworCisJLy8gY29sdW1uIDEKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVNjYW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSm9pblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU3RhcnRSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX1BST0JFX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHJvYmVSZXFBY3Rpb24pOworCisJLy9jb2x1bW4gMgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbik7CisKKwkvLyBjb2x1bW4gMworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX1BST0JFX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVNjYW5UaW1lb3V0QWN0aW9uKTsKKworCS8vIHRpbWVyIGluaXQKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUJlYWNvbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1lOQyAtIEJlYWNvblRpbWVvdXRcbiIpKTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCQkpCisJeworCQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlCQlBWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfQkVBQ09OX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTY2FuIHRpbWVvdXQgaGFuZGxlciwgZXhlY3V0ZWQgaW4gdGltZXIgdGhyZWFkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJaWYgKE1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9USU1FT1VULCAwLCBOVUxMKSkKKwl7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU0NBTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIFNjYW5UeXBlLCBCc3NUeXBlLCBCQlBWYWx1ZSA9IDA7CisJQk9PTEVBTiAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcJCSAgIE5vdzsKKwlVU0hPUlQgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgcEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgIE5TdGF0dXM7CisKKwkvLyBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZAorCS8vIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0IQorCWlmICggIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgorCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKKworI2lmZGVmIFJUMjg2MAorICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgorICAgICAgICAoSURMRV9PTihwQWQpKSAmJgorCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKKwl7CisJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKKwlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAorCQkJCQkJICBFbGVtLT5Nc2csCisJCQkJCQkgIEVsZW0tPk1zZ0xlbiwKKwkJCQkJCSAgJkJzc1R5cGUsCisJCQkJCQkgIFNzaWQsCisJCQkJCQkgICZTc2lkTGVuLAorCQkJCQkJICAmU2NhblR5cGUpKQorCXsKKworCQkvLyBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QKKwkJLy8gU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCisJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJfQorCisJCS8vCisJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJLy8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOworCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKworCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCisJCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKKworCQkvLyBDaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbCB3aGVuIGRlYWxpbmcgd2l0aCBDQ1ggYmVhY29uIHJlcG9ydAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpCisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsOworCisJCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CisJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBKT0lOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7CisJQlNTX0VOVFJZICAgICpwQnNzOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47CisJUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVKb2luUmVxQWN0aW9uKEJTUyAjJWxkKVxuIiwgcEluZm8tPkJzc0lkeCkpOworCisjaWZkZWYgUlQyODYwCisgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpICYmCisgICAgICAgIChJRExFX09OKHBBZCkpICYmCisJCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKKwkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQorCXsKKwkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07CisKKwkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3MtPkJzc2lkKTsKKworCS8vIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLgorCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOworCX0KKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEJzcy0+QnNzVHlwZTsKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7CisJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KKwlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkgJiYKKwkJKHBCc3MtPmJIYXNDb3VudHJ5SUUgPT0gVFJVRSkpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAyKTsKKwkJaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ0knKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gSURPUjsKKwkJZWxzZSBpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnTycpCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBPRE9SOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCisJLy8gc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lcgorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7CisKKyAgICBkbworCXsKKwkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQkvLworCQkJLy8gV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguCisJCQkvLworCQkJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLy8KKwkJLy8gc2VuZCBwcm9iZSByZXF1ZXN0CisJCS8vCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7CisJCQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOworCQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCisJCQkJLy8KKwkJCQlwU3VwUmF0ZSA9IEFTdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBBU3VwUmF0ZUxlbjsKKwkJCQlFeHRSYXRlTGVuID0gMDsKKwkJCX0KKworCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQkJZWxzZQorCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgcFN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChFeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQl9CisKKworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisgICAgfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwgcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOworCisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IEpPSU5fV0FJVF9CRUFDT047Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBTVEFSVCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlLCBzdGFydGluZyBhbiBJQlNTCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsgCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlMQVJHRV9JTlRFR0VSCQkJCVRpbWVTdGFtcDsKKwlCT09MRUFOIFByaXZhY3k7CisJVVNIT1JUIFN0YXR1czsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworCVRpbWVTdGFtcC51Lkxvd1BhcnQgID0gMDsKKwlUaW1lU3RhbXAudS5IaWdoUGFydCA9IDA7CisKKwlpZiAoTWxtZVN0YXJ0UmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCisJCS8vCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47CisKKwkJLy8gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQKKwkJTWFjQWRkclJhbmRvbUJzc2lkKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQgXG4iKSk7CisKKwkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyAgICA9IENBUF9HRU5FUkFURSgwLDEsUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7CisJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKwkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gICAgICAgICAgID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgICAgICAgICAgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKworCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQl7CisJCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQl9CisJCS8vIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWwuXG4iKSk7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcGVlciBzZW5kcyBiZWFjb24gYmFjayB3aGVuIHNjYW5uaW5nCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLAorCQkJCQlTc2lkTGVuLCBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTWVzc2FnZVRvTWU7CisJQ0ZfUEFSTSAgICAgICAgIENmUGFybTsKKwlVU0hPUlQgICAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlQRlJBTUVfODAyXzExICAgcEZyYW1lOworCUxBUkdFX0lOVEVHRVIgICBUaW1lU3RhbXA7CisJVUNIQVIgICAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIAlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgCVN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVVNIT1JUIAkJCUxlblZJRTsKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HCQkJCQkJUmFsaW5rSWU7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBFbGVtLT5Nc2c7CisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2ZQYXJtLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQlVTE9ORyBJZHg7CisJCUNIQVIgUnNzaSA9IDA7CisKKwkJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQlSc3NpID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUnNzaTsKKworCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkKKwkJCUh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkgJiYgKENoYW5uZWwgPT0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwpKQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbixFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQorCQkJCQlBaXJvbmV0QWRkQmVhY29uUmVwb3J0KHBBZCwgSWR4LCBFbGVtKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUlkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgICZIdENhcGFiaWxpdHksCisJCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCisJCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W3BBZC0+Q29tbW9uQ2ZnLkNoYW5uZWxMaXN0SWR4XS5iRWZmZWN0ZWRDaGFubmVsID09IFRSVUUpCisJCQl7CisJCQkJVUNIQVIJCVJlZ0NsYXNzOworCQkJCVBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eTIocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJlJlZ0NsYXNzKTsKKwkJCQlUcmlFdmVudFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLCBCc3NpZCwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBSZWdDbGFzcywgQ2hhbm5lbCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQl9CisJCX0KKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZWQKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlXaGVuIHdhaXRpbmcgam9pbmluZyB0aGUgKEkpQlNTLCBiZWFjb24gcmVjZWl2ZWQgZnJvbSBleHRlcm5hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKKwkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCVVTSE9SVCAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlDRl9QQVJNICAgICAgIENmOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIENraXBGbGFnOworCVVTSE9SVCAJCSAgTGVuVklFOworCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVU0hPUlQgICAgICAgIFN0YXR1czsKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7CisJVUxPTkcgICAgICAgICBJZHg7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCQlDZW50cmFsQ2hhbm5lbDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2YsCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCS8vIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZQorCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbik8IDEyKSkKKwkJCXJldHVybjsKKworCQkvLyBCRUFDT04gZnJvbSBkZXNpcmVkIEJTUy9JQlNTIGZvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgbW9zdAorCQkvLyBCU1MgcGFyYW1ldGVycyBoZXJlLgorCQkvLyBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFURUlPTj8KKwkJLy8gICAgRG8gd2UgbmVlZCB0byByZWNlb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/CisJCS8vIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWQKKwkJLy8gICAgYSBuZXcgSk9JTi1BVVRILUFTU09DIHNlcXVlbmNlLgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSByZWNlaXZlIGRlc2lyZWQgQkVBQ09OIGF0IEpvaW5XYWl0QmVhY29uLi4uIENoYW5uZWwgPSAlZFxuIiwgQ2hhbm5lbCkpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCS8vIFVwZGF0ZSBSU1NJIHRvIHByZXZlbnQgTm8gc2lnbmFsIGRpc3BsYXkgd2hlbiBjYXJkcyBmaXJzdCBpbml0aWFsaXplZAorCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMQk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMgk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA8PCAzOworCisJCQkvLworCQkJLy8gV2UgbmVlZCB0byBjaGVjayBpZiBTU0lEIG9ubHkgc2V0IHRvIGFueSwgdGhlbiB3ZSBjYW4gcmVjb3JkIHRoZSBjdXJyZW50IFNTSUQuCisJCQkvLyBPdGhlcndpc2Ugd2lsbCBjYXVzZSBoaWRkZW4gU1NJRCBhc3NvY2lhdGlvbiBmYWlsZWQuCisJCQkvLworCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkTGVuID09IDApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQ2hhbm5lbCk7CisKKwkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQkJeworCQkJCQkvLworCQkJCQkvLyBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbworCQkJCQkvLworCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOworCQkJCX0KKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7CisJCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOworCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBDaGFubmVsOworCQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gPSBBdGltV2luOworCQkJcEFkLT5NbG1lQXV4LkNmcFBlcmlvZCA9IENmLkNmcFBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOworCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKKworCQkJLy8gQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QKKwkJCS8vIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUKKwkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgMTYpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKKworCQkJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgaHQgcmF0ZXMKKwkJCWlmICgoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJeworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisgICAJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCisJCQkJLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKwkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlpZiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApCisJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9IFRSVUU7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvKTsKKwkJCQkvLyBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24hIChNcGR1RGVuc2l0eT0lZCwgTWF4UkFtcGR1RmFjdG9yPSVkLCBCVz0lZClcbiIsCisJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1wZHVEZW5zaXR5LCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IsIEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSk7CisKKwkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKKwkJCQl7CisJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOworCQkgCQkJLy8gQ2hlY2sgYWdhaW4gdGhlIEJhbmR3aWR0aCBjYXBhYmlsaXR5IG9mIHRoaXMgQVAuCisJCSAJCQlpZiAoKEFkZEh0SW5mby5Db250cm9sQ2hhbiA+IDIpJiYgKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCSAJCQl7CisJCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gLSAyOworCQkgCQkJfQorCQkgCQkJZWxzZSBpZiAoKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCSAJCQl7CisJCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOworCQkgCQkJfQorCisJCQkJCS8vIENoZWNrIEVycm9yIC4KKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPSBDZW50cmFsQ2hhbm5lbCkKKwkJIAkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkJlYWNvbiBDZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQuIE1sbWVhdXggQ2VudHJhbENoYW5uZWwgPSAlZFxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbiwgcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsKSk7CisKKwkJIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+Q2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLCAgLlxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbikpOworCisJCQkJfQorCisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7CisgICAJCQkJLy8gVG8gcHJldmVudCBlcnJvciwgbGV0IGxlZ2FjeSBBUCBtdXN0IGhhdmUgc2FtZSBDZW50cmFsQ2hhbm5lbCBhbmQgQ2hhbm5lbC4KKwkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5NbG1lQXV4LkNoYW5uZWw7CisKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJfQorCisJCQlSVE1QVXBkYXRlTWxtZVJhdGUocEFkKTsKKworCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQkpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCAmRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBhZnRlciBKT0lOLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkXG4iLAorCQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLyBVcGRhdGUgQ2tpcEZsYWcKKwkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisKKwkJCS8vIEtlZXAgVGltZVN0YW1wIGZvciBSZS1Bc3NvY2lhdGlvbiB1c2VkLgorCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5DQ0tNTGlua1VwRmxhZyA9PSBUUlVFKSkKKwkJCQlwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wID0gVGltZVN0YW1wOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCisJCQl7CisJCQkJLy9XZSBuZWVkIHRvIGNoYW5nZSBvdXIgVHhQb3dlciBmb3IgQ0NYIDIuMCBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgorCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfQorCQkJZWxzZSAgLy9Vc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UuCisJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworCQl9CisJCS8vIG5vdCB0byBtZSBCRUFDT04sIGlnbm9yZWQKKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZSB0aGlzIGZyYW1lCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcmVjZWl2ZSBCRUFDT04gZnJvbSBwZWVyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCUNGX1BBUk0gICAgICAgQ2ZQYXJtOworCVVDSEFSICAgICAgICAgU3NpZExlbiwgTWVzc2FnZVRvTWU9MCwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwgaW5kZXg9MDsKKwlVQ0hBUiAgICAgICAgIER0aW1Db3VudD0wLCBEdGltUGVyaW9kPTAsIEJjYXN0RmxhZz0wOworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm8sIEF0aW1XaW4sIEJlYWNvblBlcmlvZDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXA7CisJVUNIQVIgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVQ0hBUgkJICBDa2lwRmxhZzsKKwlVU0hPUlQgICAgICAgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwgUHJlTkh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlpZiAoIShJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkKKwkJKSkKKwkJcmV0dXJuOworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2ZQYXJtLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQlCT09MRUFOIGlzX215X2Jzc2lkLCBpc19teV9zc2lkOworCQlVTE9ORyAgIEJzc2lkeCwgTm93OworCQlCU1NfRU5UUlkgKnBCc3M7CisJCUNIQVIJCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCQlpc19teV9ic3NpZCA9IE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk/IFRSVUUgOiBGQUxTRTsKKwkJaXNfbXlfc3NpZCA9IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbik/IFRSVUU6RkFMU0U7CisKKworCQkvLyBpZ25vcmUgQkVBQ09OIG5vdCBmb3IgbXkgU1NJRAorCQlpZiAoKCEgaXNfbXlfc3NpZCkgJiYgKCEgaXNfbXlfYnNzaWQpKQorCQkJcmV0dXJuOworCisJCS8vIEl0IG1lYW5zIFNUQSB3YWl0cyBkaXNhc3NvYyBjb21wbGV0ZWx5IGZyb20gdGhpcyBBUCwgaWdub3JlcyB0aGlzIGJlYWNvbi4KKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9XQUlUX0RJU0FTU09DKQorCQkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIENvcHkgQ29udHJvbCBjaGFubmVsIGZvciB0aGlzIEJTU0lELgorCQlpZiAoQWRkSHRJbmZvTGVuICE9IDApCisJCQlDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOworCisJCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkKKwkJCUh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIEhvdXNla2VlcGluZyAiU3NpZEJzc1RhYiIgdGFibGUgZm9yIGxhdGVyLW9uIFJPQU1pbmcgdXNhZ2UuCisJCS8vCisJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCQl7CisJCQkvLyBkaXNjb3ZlciBuZXcgQVAgb2YgdGhpcyBuZXR3b3JrLCBjcmVhdGUgQlNTIGVudHJ5CisJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJCSZIdENhcGFiaWxpdHksICZBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLEFkZEh0SW5mb0xlbixOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLAorCQkJCQkJUmVhbFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksCisJCQkJCQkmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpIC8vIHJldHVybiBpZiBCU1MgdGFibGUgZnVsbAorCQkJCXJldHVybjsKKworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisKKworCisJCX0KKworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKQorCQl7CisJCQkvLyBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuCisJCQkvLyBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIDEsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIDEpOworCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCQkgICAgUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJCS8vIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jCisKKwkJCS8vIGNoYW5uZWwgc2FuaXR5IGNoZWNrCisJCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQkJCXsKKwkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCX0KKwkJfQorCisJCS8vIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuCisJCS8vIFRoaXMgbWlnaHQgaGFwcGVuZWQgd2hlbiB0d28gU1RBIHN0YXJ0IGF0IHRoZSBzYW1lIHRpbWUKKwkJaWYgKCghIGlzX215X2Jzc2lkKSAmJiBBREhPQ19PTihwQWQpKQorCQl7CisJCQlJTlQJaTsKKworCQkJLy8gQWRkIHRoZSBzYWZlZ3VhcmQgYWdhaW5zdCB0aGUgbWlzbWF0Y2ggb2YgYWRob2Mgd2VwIHN0YXR1cworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5XZXBTdGF0dXMpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBjb2xsYXBzZSBpbnRvIHRoZSBBREhPQyBuZXR3b3JrIHdoaWNoIGhhcyBiaWdnZXIgQlNTSUQgdmFsdWUuCisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJeworCQkJCWlmIChCc3NpZFtpXSA+IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIG1lcmdlIHRvIHRoZSBJQlNTIHdpdGggYmlnZ2VyIEJTU0lEPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCQkJCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwkJCQkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQnNzaWQpOworCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKwkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgQkVBQ09OIGZyYW1lIHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJCWlzX215X2Jzc2lkID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKEJzc2lkW2ldIDwgcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdOworCQlwQnNzLT5Sc3NpID0gUmVhbFJzc2k7ICAgICAgIC8vIGxhc3Rlc3QgUlNTSQorCQlwQnNzLT5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisKKwkJLy8KKwkJLy8gQkVBQ09OIGZyb20gbXkgQlNTSUQgLSBlaXRoZXIgSUJTUyBvciBJTkZSQSBuZXR3b3JrCisJCS8vCisJCWlmIChpc19teV9ic3NpZCkKKwkJeworCQkJUlhXSV9TVFJVQwlSeFdJOworCisJCQlwQWQtPlN0YUNmZy5EdGltQ291bnQgPSBEdGltQ291bnQ7CisJCQlwQWQtPlN0YUNmZy5EdGltUGVyaW9kID0gRHRpbVBlcmlvZDsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CisKKworCQkJUnhXSS5SU1NJMCA9IEVsZW0tPlJzc2kwOworCQkJUnhXSS5SU1NJMSA9IEVsZW0tPlJzc2kxOworCQkJUnhXSS5SU1NJMiA9IEVsZW0tPlJzc2kyOworCisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgJlJ4V0kpOworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vCisJCQkJLy8gV2UgZ2V0IHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgcmVxdWlyZWQKKwkJCQkvLyBDaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIFR4UG93ZXIgTGltaXQgZm9yIENpc28gQ29tcGF0aWJsZSBFeHRlbnNpb25zCisJCQkJLy8KKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJCS8vIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBlcXVhbCB0byAweEZGIG1lYW5zIHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgbm90IGV4aXN0LgorCQkJCS8vIFVzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZSwgdGhhdCBzZXQgZnJvbSBVSS4KKwkJCQkvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisJCQl9CisKKwkJCS8vIGF0IGxlYXN0IG9uZSAxMWIgcGVlciBqb2luZWQuIGRvd25ncmFkZSB0aGUgTWF4VHhSYXRlIHRvIDExTWJwcworCQkJLy8gYWZ0ZXIgbGFzdCAxMWIgcGVlciBsZWZ0IGZvciBzZXZlcmFsIHNlY29uZHMsIHdlJ2xsIGF1dG8gc3dpdGNoIGJhY2sgdG8gMTFHIHJhdGUKKwkJCS8vIGluIE1sbWVQZXJpb2RpY0V4ZWMoKQorCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpCisJCQl7CisJCQkJQk9PTEVBTgliUmVzdGFydDsKKyAgICAgICAgICAgICAgICBCT09MRUFOCWJuUmVzdGFydDsKKworCQkJCWJSZXN0YXJ0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYm5SZXN0YXJ0ID0gRkFMU0U7CisKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPD0gNCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpKQorCQkJCQl7CisJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9PSBGQUxTRSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gMTFiIHBlZXIgam9pbmVkLiBkb3duLWdyYWRlIHRvIDExYiBUWCByYXRlcyBcbiIpKTsKKwkJCQkJCQliUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwkJCQkJCQlwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gVFJVRTsKKwkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOworCQkJCQkJfQorCisJCQkJCQkvLyB0aGlzIHRpbWVzdGFtcCBpcyBmb3IgTWxtZVBlcmlvZGljRXhlYygpIHRvIGNoZWNrIGlmIGFsbCAxMUIgcGVlcnMgaGF2ZSBsZWZ0CisJCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lID0gTm93OworCQkJCQkJYnJlYWs7CisJCQkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJLy8gVXBkYXRlIEh0IFBoeS4KKwkJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQkJCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCisJCQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQpCisJCQkJCQkJQWRob2NUdXJuT25Rb3MocEFkKTsKKworCQkJCQkJLy8gSGFuZGxlIHJhdGUgc3dpdGNoIGlzc3VlIHdoZW4gQWRob2MgbW9kZQorCQkJCQkJaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPj0gOCkgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gMTFnIHBlZXIgam9pbmVkLiBkb3duLWdyYWRlIHRvIDExZyBUWCByYXRlcyBcbiIpKTsKKwkJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQkJCQkJCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJCQkJCQlwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID0gVFJVRTsKKwkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gdGhpcyB0aW1lc3RhbXAgaXMgZm9yIE1sbWVQZXJpb2RpY0V4ZWMoKSB0byBjaGVjayBpZiBhbGwgMTFnIHBlZXJzIGhhdmUgbGVmdAorCQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QxMWdCZWFjb25SeFRpbWUgPSBOb3c7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICghcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCQkJCQkgIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKKwkJCQkJCQkJIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApICYmCisJCQkJCQkJCSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApKQorCQkJCQkJeworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9PSBGQUxTRSkKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCQkJCQkJCQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IFRSVUU7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJCQkJCWlmIChBZGRIdEluZm9MZW4gIT0gMCkKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgSHRDYXBhYmlsaXR5Lk1DU1NldCwgMTYpOworCisJCQkJCQkJCVJUTVBDaGVja0h0KHBBZCwgRWxlbS0+V2NpZCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKKwkJCQkJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJYm5SZXN0YXJ0ID0gVFJVRTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gdGhpcyB0aW1lc3RhbXAgaXMgZm9yIE1sbWVQZXJpb2RpY0V4ZWMoKSB0byBjaGVjayBpZiBhbGwgMjBNSHogTiBwZWVycyBoYXZlIGxlZnQKKwkJCQkJCQlwQWQtPlN0YUNmZy5MYXN0MjBOQmVhY29uUnhUaW1lID0gTm93OworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCQl7CisJCQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJCQl9CisJCQkJfXdoaWxlIChGQUxTRSk7CisKKwkJCQkvLyBJZiBwZWVyIEFkaG9jIGlzIGxlZ2FjeSBtb2RlLCBJIGRvbid0IG5lZWQgdG8gY2FsbCBNbG1lVXBkYXRlSHRUeFJhdGVzIG5vIG1hdHRlciBJIHN1cHBvcnQgSFQgb3Igbm90CisJCQkJaWYgKChiUmVzdGFydCA9PSBUUlVFKSAmJiAoYm5SZXN0YXJ0ID09IEZBTFNFKSkKKwkJCQl7CisJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWVsc2UgaWYgKChiUmVzdGFydCA9PSBUUlVFKSAmJiAoYm5SZXN0YXJ0ID09IFRSVUUpKQorCQkJCXsKKwkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgQlNTMCk7CisJCQkJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCS8vIEF0IGxlYXN0IGFub3RoZXIgcGVlciBpbiB0aGlzIElCU1MsIGRlY2xhcmUgTWVkaWFTdGF0ZSBhcyBDT05ORUNURUQKKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQl7CisJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkJCQkJLy8gMjAwMy8wMy8xMiAtIGpvaG4KKwkJCQkJLy8gTWFrZSBzdXJlIHRoaXMgZW50cnkgaW4gIlNjYW5UYWIiIHRhYmxlLCB0aHVzIGNvbXBsaWVzIHRvIE1pY3Jvc29mdCdzIHBvbGljeSB0aGF0CisJCQkJCS8vICJzaXRlIHN1cnZleSIgcmVzdWx0IHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgY3VycmVudCBjb25uZWN0ZWQgbmV0d29yay4KKwkJCQkJLy8KKwkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQkJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCQkJCXsKKwkJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJCQkJJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCisJCQkJCQkJCQkmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUmVhbFJzc2ksIFRpbWVTdGFtcCwgMCwKKwkJCQkJCQkJCSZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQuXG4iKSk7CisJCQkJfQorCisJCQkJLy8gQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLgorCQkJCS8vIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLgorCQkJCWlmIChBREhPQ19PTihwQWQpICYmIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQorCQkJCXsKKwkJCQkJVUNIQVIJaWR4OworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQorCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKKwkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCQkvLyBBbm90aGVyIGFkaG9jIGpvaW5pbmcsIGFkZCB0byBvdXIgTUFDIHRhYmxlLgorCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIEFkZHIyLCBCU1MwLCBGQUxTRSk7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOworCQkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCQkJCQkvLyBBZnRlciBJbnNlcnRFbnRyeSwgV3JpdGUgdG8gQVNJQyBvbi1jaGlwIHRhYmxlLgorCQkJCQkJCVJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBCU1MwLCBpZHgsIHBFbnRyeSk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgJXg6JXg6JXg6JXg6JXg6JXggIGpvaW4gaW4uRW50cnk9JWRcbiIsIEFkZHIyWzBdLEFkZHIyWzFdLEFkZHIyWzJdLEFkZHIyWzNdLEFkZHIyWzRdLEFkZHIyWzVdLCBwRW50cnktPkFpZCkpOworCisJCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIdENhcGFiaWxpdHlMZW4gPD0gMCkKKwkgICAgICAgICAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA8PSA0KSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCisJICAgICAgICAJCQkJCXsKKwkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkgICAgICAgIAkJCQkJfQorCSAgICAgICAgCQkJCQllbHNlCisJICAgICAgICAJCQkJCXsKKwkgICAgICAgIAkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJICAgICAgICAJCQkJCX0KKwkJCQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCQkJCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJCQkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJICAgICAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCQlCT09MRUFOIGJVc2VTaG9ydFNsb3QsIGJVc2VCR1Byb3RlY3Rpb247CisKKwkJCQkvLyBkZWNpZGUgdG8gdXNlL2NoYW5nZSB0byAtCisJCQkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCisJCQkJLy8gICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uCisJCQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCisJCQkJLy9iVXNlU2hvcnRTbG90ID0gcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgJiYgQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWJVc2VTaG9ydFNsb3QgPSBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7CisJCQkJaWYgKGJVc2VTaG9ydFNsb3QgIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCisJCQkJCUFzaWNTZXRTbG90VGltZShwQWQsIGJVc2VTaG9ydFNsb3QpOworCisJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwgICAgLy8gYWx3YXlzIHVzZQorCQkJCQkJCQkgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKSAmJiBFUlBfSVNfVVNFX1BST1RFQ1RJT04oRXJwKSk7CisKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyBhbHdheXMgbm8gQkcgcHJvdGVjdGlvbiBpbiBBLWJhbmQuIGZhbHNlbHkgaGFwcGVuZWQgd2hlbiBzd2l0Y2hpbmcgQS9HIGJhbmQgdG8gYSBkdWFsLWJhbmQgQVAKKwkJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IEZBTFNFOworCisJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24gIT0gT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCisJCQkJeworCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikKKwkJCQkJeworCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxGQUxTRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksVFJVRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIEIvRyBwcm90ZWN0aW9uIHRvICVkXG4iLCBiVXNlQkdQcm90ZWN0aW9uKSk7CisJCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gY2hlY2sgSHQgcHJvdGVjdGlvbiBtb2RlLiBhbmQgYWRoZXJlIHRvIHRoZSBOb24tR0YgZGV2aWNlIGluZGljYXRpb24gYnkgQVAuCisJCQkJaWYgKChBZGRIdEluZm9MZW4gIT0gMCkgJiYKKwkJCQkJKChBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkgfHwKKwkJCQkJKEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KSkpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOworCQkJCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQorCQkJCXsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpICYmCisJCQkJCUVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpCisJCQkJeworCQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGZvcmNlZCB0byB1c2UgTE9ORyBwcmVhbWJsZVxuIikpOworCQkJCX0KKworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICAgICYmCisJCQkJCShFZGNhUGFybS5iVmFsaWQgPT0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisJCQkJCShFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgIT0gcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZSBFRENBIHBhcmFtZXRlcnMoZnJvbSAlZCB0byAlZClcbiIsCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCwKKwkJCQkJCUVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpOworCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmRWRjYVBhcm0pOworCQkJCX0KKworCQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJlFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKworCQkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUKKwkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKQorCQkJeworCQkJCVVDSEFSIEZyZWVOdW1iZXI7CisJCQkJLy8gIDEuIEFQIGhhcyBiYWNrbG9nZ2VkIHVuaWNhc3QtdG8tbWUgZnJhbWUsIHN0YXkgQVdBS0UsIHNlbmQgUFNQT0xMCisJCQkJLy8gIDIuIEFQIGhhcyBiYWNrbG9nZ2VkIGJyb2FkY2FzdC9tdWx0aWNhc3QgZnJhbWUgYW5kIHdlIHdhbnQgdGhvc2UgZnJhbWVzLCBzdGF5IEFXQUtFCisJCQkJLy8gIDMuIHdlIGhhdmUgb3V0Z29pbmcgZnJhbWVzIGluIFR4UmluZyBvciBNZ210UmluZywgYmV0dGVyIHN0YXkgQVdBS0UKKwkJCQkvLyAgNC4gUHNtIGNoYW5nZSB0byBQV1JfU0FWRSwgYnV0IEFQIG5vdCBiZWVuIGluZm9ybWVkIHlldCwgd2UgYmV0dGVyIHN0YXkgQVdBS0UKKwkJCQkvLyAgNS4gb3RoZXJ3aXNlLCBwdXQgUEhZIGJhY2sgdG8gc2xlZXAgdG8gc2F2ZSBiYXR0ZXJ5LgorCQkJCWlmIChNZXNzYWdlVG9NZSkKKwkJCQl7CisjaWZkZWYgUlQyODYwCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKKwkJCQkJCS8vIFR1cm4gY2xrIHRvIDgwTWh6LgorCQkJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpOworCQkJCX0KKwkJCQllbHNlIGlmIChCY2FzdEZsYWcgJiYgKER0aW1Db3VudCA9PSAwKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkpCisJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisJCQkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JLLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkUsIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WSSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZPLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfTUdNVCwgTUdNVF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJCQkJeworCQkJCQkvLyBUT0RPOiBjb25zaWRlciBzY2hlZHVsZWQgSENDQS4gbWlnaHQgbm90IGJlIHByb3BlciB0byB1c2UgdHJhZGl0aW9uYWwgRFRJTS1iYXNlZCBwb3dlci1zYXZpbmcgc2NoZW1lCisJCQkJCS8vIGNhbiB3ZSBjaGVhdCBoZXJlIChpLmUuIGp1c3QgY2hlY2sgTUdNVCAmIEFDX0JFKSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlPworI2lmZGVmIFJUMjg2MAorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisJCQkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVVNIT1JUIE5leHREdGltID0gRHRpbUNvdW50OworCisJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQorCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCQl7CisJCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlY2VpdmUgUFJPQkUgUkVRIGZyb20gcmVtb3RlIHBlZXIgd2hlbiBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW47CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCSAgSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSEVBREVSXzgwMl8xMSBQcm9iZVJzcEhkcjsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OworCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOworCisJaWYgKCEgQURIT0NfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKFBlZXJQcm9iZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgU3NpZCwgJlNzaWRMZW4pKQorCXsKKwkJaWYgKChTc2lkTGVuID09IDApIHx8IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCXsKKwkJCS8vIGFsbG9jYXRlIGFuZCBzZW5kIG91dCBQcm9iZVJzcCBmcmFtZQorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQkvL3BBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/CisKKwkJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAorCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorCisJCQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQl7CisJCQkJVUxPTkcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIAkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICAJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOworCQkJCUFkZEh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisJCQkJTmV3RXh0TGVuID0gMTsKKwkJCQkvL05ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0SW5mb0llLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoQUREX0hUX0lORk9fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0Q2hhbkllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKE5FV19FWFRfQ0hBTl9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisJfQorfQorCitWT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IHByb2NlZHVyZS4gYmFzaWNhbGx5IGFkZCBjaGFubmVsIGluZGV4IGJ5IDEgYW5kIHJlc2NhbgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0CisJaWYgKChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CisKKwkvLyB0aGlzIHJvdXRpbmUgd2lsbCBzdG9wIGlmIHBBZC0+TWxtZUF1eC5DaGFubmVsID09IDAKKwlTY2FuTmV4dENoYW5uZWwocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVlOQyAtIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIFJBTElOS19BVEUKKyAgICBpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQlyZXR1cm47CisgICAgfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisgICAgCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgKFBVQ0hBUikmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKKworCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJfQorCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJRUNoYW5uZWxbMTFdOworCVVDSEFSCQlpLCBqLCBrOworCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOworCisJUlRNUFplcm9NZW1vcnkoRUNoYW5uZWwsIDExKTsKKwlpID0gMDsKKwkvLyBGaW5kIHVwcGVyIGNoYW5uZWwgYW5kIGxvd2VyIGNoYW5uZWwuCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJlbG93IGxvd2VyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPiAxKQorCXsKKwkJRUNoYW5uZWxbMF0gPSBMb3dlckNoYW5uZWwgLSAxOworCQlpID0gMTsKKwkJaWYgKExvd2VyQ2hhbm5lbCA+IDIpCisJCXsKKwkJCUVDaGFubmVsWzFdID0gTG93ZXJDaGFubmVsIC0gMjsKKwkJCWkgPSAyOworCQkJaWYgKExvd2VyQ2hhbm5lbCA+IDMpCisJCQl7CisJCQkJRUNoYW5uZWxbMl0gPSBMb3dlckNoYW5uZWwgLSAzOworCQkJCWkgPSAzOworCQkJfQorCQl9CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJldHdlZW4gIGxvd2VyIGNoYW5uZWwgYW5kIHVwcGVyIGNoYW5uZWwuCisJZm9yIChrID0gTG93ZXJDaGFubmVsO2sgPCBVcHBlckNoYW5uZWw7aysrKQorCXsKKwkJRUNoYW5uZWxbaV0gPSBrOworCQlpKys7CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGFib3ZlIHVwcGVyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPCAxMSkKKwl7CisJCUVDaGFubmVsW2ldID0gVXBwZXJDaGFubmVsICsgMTsKKwkJaSsrOworCQlpZiAoTG93ZXJDaGFubmVsIDwgMTApCisJCXsKKwkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMjsKKwkJCWkrKzsKKwkJCWlmIChMb3dlckNoYW5uZWwgPCA5KQorCQkJeworCQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMzsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisJLy8KKwlmb3IgKGogPSAwO2ogPCBpO2orKykKKwl7CisJCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQorCQl7CisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IEVDaGFubmVsW2pdKQorCQkJeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rba10uYkVmZmVjdGVkQ2hhbm5lbCA9IFRSVUU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgRWZmZWN0ZWRDaGFubmVsKCA9JWQpXG4iLCBFQ2hhbm5lbFtqXSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJcmV0dXJuIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNDQU5fTElTVEVOKSA/IFRSVUUgOiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRjNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKQEAgLTAsMCArMSwyMDg2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKKwlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lCQlXUEFSU05JRQkweGRkCisjZGVmaW5lCQlXUEEyUlNOSUUJMHgzMAorCisvL2V4dGVybiBVQ0hBUiBCSVQ4W107CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlcldwYVBza1RraXBMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza1RraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlcldwYVBza0Flc1tdID0geworCQkweERELCAweDE2LCAJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tBZXNMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza0FlcykgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01bXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0CisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDQwLCAweDk2LCAweDAwICAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W10gPSB7CisJCTB4REQsIDB4MTgsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwKKwkJMHgyOCwgMHgwMC8vIEF1dGhlbnRpY2F0aW9uCisJCX07CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNMjQpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ0NYVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ0NYX0xMQ19IRFJbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUxMQ19OT1JNQUxbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKworVUNIQVIJRUFQT0xfRlJBTUVbXSA9IHsweDg4LCAweDhFfTsKKworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKKwkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisJCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAorCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAorCUlOCVVDSEFSCUVBUFR5cGUsCisJT1VUCUlOVAkJKk1zZ1R5cGUpCit7CisJc3dpdGNoIChFQVBUeXBlKQorCXsKKwkJY2FzZSBFQVBQYWNrZXQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTFN0YXJ0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MTG9nb2ZmOgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTEtleToKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xBU0ZBbGVydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorCVBhcmFtZXRlcnM6CisJCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUgKlMsCisJT1VUCVNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9XUEFfUFNLX1NUQVRFLCBNQVhfV1BBX1BTS19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgV1BBX1BTS19JRExFLCBXUEFfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BTS19JRExFLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKwkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKwkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCisJCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgorCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgorCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCisJUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlJTlQgICAgICAgICAgICAgTXNnVHlwZSA9IEVBUE9MX01TR19JTlZBTElEOworCVBLRVlfREVTQ1JJUFRFUiBwS2V5RGVzYzsKKwlQSEVBREVSXzgwMl8xMSAgcEhlYWRlcjsgLy9yZWQKKwlVQ0hBUiAgICAgICAgICAgWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiBFYXBvbFZyOworCUtFWV9JTkZPCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBXcGFFQVBPTEtleUFjdGlvblxuIikpOworCisJLy8gR2V0IDgwMi4xMSBoZWFkZXIgZmlyc3QKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBHZXQgRUFQb0wtS2V5IERlc2NyaXB0b3IKKwlwS2V5RGVzYyA9IChQS0VZX0RFU0NSSVBURVIpICZFbGVtLT5Nc2dbKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKV07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBLZXlEZXNjLT5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmcGVlcktleUluZm8pKTsKKworCisJLy8gMS4gQ2hlY2sgRUFQT0wgZnJhbWUgdmVyc2lvbiBhbmQgdHlwZQorCUVhcG9sVnIJPSAoVUNIQVIpIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExK0xFTkdUSF84MDJfMV9IXTsKKworICAgIGlmICgoKEVhcG9sVnIgIT0gRUFQT0xfVkVSKSAmJiAoRWFwb2xWciAhPSBFQVBPTF9WRVIyKSkgfHwgKChwS2V5RGVzYy0+VHlwZSAhPSBXUEExX0tFWV9ERVNDKSAmJiAocEtleURlc2MtPlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQorCXsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5IGRlc2NyaXB0ZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCBXUEEgcnVsZVxuIikpOworCQkJcmV0dXJuOworCX0KKworCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJaWYoKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiICAgUmVwbGF5Q291bnRlciBub3QgbWF0Y2ggICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByb2Nlc3MgV1BBMlBTSyBmcmFtZQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7CisJCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCisJCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgorCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKKwkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQorCQl7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCisJCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCS8vIFByb2Nlc3MgV1BBUFNLIEZyYW1lCisJLy8gQ2xhc3NpZnkgbWVzc2FnZSBUeXBlLCBlaXRoZXIgcGFpcndpc2UgbWVzc2FnZSAxLCAzLCBvciBncm91cCBtZXNzYWdlIDEgZm9yIHN1cHBsaWNhbnQKKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwl7CisJCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7CisJCX0KKwkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCAhPSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisJCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKwkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIFVwZGF0ZSBLZXkgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKwkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisKKwkvLyA0LiBGaWxsIFNOb25jZQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyA1LiBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBTZW5kIEVBUE9MKDAsIDEsIDAsIDAsIDAsIFAsIDAsIFNOb25jZSwgTUlDLCBSU05fSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vaGV4X2R1bXAoIk1JQyIsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworVk9JRCBXcGEyUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7CisKKwlpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUFRLIExlbiA9IDgwLgorCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKKwkJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwlpZihwTXNnMS0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCApCisJeworCQkvLyBjYWNoZWQgUE1LSUQKKwl9CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTI7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOworCisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IDA7CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gU2VuZCBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYVBhaXJNc2czQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlQVUNIQVIgICAgICAgICAgCXBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7CisJVUNIQVIgICAgICAgICAgIAlNaWNbMTZdLCBPbGRNaWNbMTZdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUmVjb3JkIDgwMi4xMSBoZWFkZXIgJiB0aGUgcmVjZWl2ZWQgRUFQT0wgcGFja2V0IE1zZzMKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisJcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gVmVyaWZ5IFJTTiBJRQorCS8vaWYgKCFSVE1QRXF1YWxNZW1vcnkocE1zZzMtPktleURlc2MuS2V5RGF0YSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkKKwlpZiAoIUNoZWNrUlNOSUUocEFkLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAmc2tpcF9vZmZzZXQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOworCQloZXhfZHVtcCgiVGhlIG9yaWdpbmFsIFJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7CisJCWhleF9kdW1wKCJUaGUgcmVjZWl2ZWQgUlNOX0lFIiwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSU05fSUUgVkFMSUQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKworCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlVQ0hBUiBkaWdlc3RbODBdOworCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQkvLyBUS0lQCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwkJcmV0dXJuOworCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKKwkJcmV0dXJuOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gSW4gTXNnMywgIEtleUluZm8uc2VjdXJlID0wIGlmIEdyb3VwIEtleSBIUyB0byBjb21lLiAxIGlmIG5vIGdyb3VwIGtleSBIUworCS8vIFN0YXRpb24gc2VuZHMgTXNnNCAgS2V5SW5mby5zZWN1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gTXNnLjMKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZT0gcGVlcktleUluZm8uU2VjdXJlOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy8gVXBkYXRlIFBUSworCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgcEVudHJ5KTsKKworCS8vIE1ha2UgdHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKktFWURBVEEsICpkaWdlc3Q7CisJVUNIQVIgICAgICAgICAgICAgICBLZXlbMzJdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeQorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOworCisJaWYobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gS0VZREFUQSBMZW4gPSA1MTIuCisJS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChLRVlEQVRBICsgNTEyLCA0KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAzIGZyYW1lLgorCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKwkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gT2J0YWluIEdUSworCS8vIDUuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiRUtEID0gJWRcbiIsIHBlZXJLZXlJbmZvLkVLRF9ETCkpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnMy0+S2V5RGVzYy5LZXlEYXRhKTsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCUlOVCBpOworCQkvLyBEZWNyeXB0IFRLSVAgR1RLCisJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZzMtPktleURlc2MuS2V5SXYsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7CisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKKwkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKKwkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCX0KKworCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIEdUSyB0byBBU0lDCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gIAk9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIEJTUzAsIDApOworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3BhMlBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIEdyb3VwIGtleSAyLXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhR3JvdXBNc2cxQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwR3JvdXA7CisJVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpkaWdlc3QsICpLRVlEQVRBOworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIEdUS1szMl0sIEtleVszMl07CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeQorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOworCisJaWYobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gS0VZREFUQSBMZW4gPSA1MTIuCisJS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChkaWdlc3QgKyA4MCwgNCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBQcm9jZXNzIEdyb3VwIE1lc3NhZ2UgMSBmcmFtZS4gc2tpcCA4MDIuMTEgaGVhZGVyKDI0KSAmIExMQ19TTkFQIGhlYWRlcig4KQorCXBHcm91cCA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBHcm91cC0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKwkvLyAwLiBDaGVjayBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gMS4gVmVyaWZ5IFJlcGxheSBjb3VudGVyCisJLy8gICAgQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFZlcmlmeSBNSUMgaXMgdmFsaWQKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworCQlITUFDX1NIQTEoKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKworCS8vIDMuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBEZWNyeXB0IEFFUyBHVEsKKwkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCAgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhKTsKKwl9CisJZWxzZQkvLyBUS0lQCisJeworCQlJTlQgaTsKKworCQkvLyBEZWNyeXB0IFRLSVAgR1RLCisJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEdyb3VwLT5LZXlEZXNjLktleUl2LCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOworCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCX0KKworCS8vIFByb2Nlc3MgZGVjcnlwdGVkIGtleSBkYXRhIG1hdGVyaWFsCisJLy8gUGFyc2Uga2V5RGF0YSB0byBoYW5kbGUgS0RFIGZvcm1hdCBmb3IgV1BBMlBTSworCWlmIChwZWVyS2V5SW5mby5FS0RfREwpCisJeworCQlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAwKSkKKwkJeworCQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCS8vIFdQQVBTSworCXsKKwkJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKKwkJTmRpc01vdmVNZW1vcnkoR1RLLCBLRVlEQVRBLCAzMik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgR1RLLCAzMik7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBlZXJLZXlJbmZvLktleUluZGV4OworCisJCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBHVEssIExFTl9US0lQX0VLKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZHVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKyAgICAJLy9oZXhfZHVtcCgiR3JvdXAgS2V5IDoiLCBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgTEVOX1RLSVBfRUspOworCX0KKworCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCisJLy8gaW5pdCBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIEdyb3VwIG1lc3NhZ2UgMSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIEdyb3VwIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDEsMCwwLDAsRywwLDAsTUlDLDApCisJLy8KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwl7CisJCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCX0KKwllbHNlCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwl9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgSW5kZXggYXMgRy1Nc2cgMQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IHBlZXJLZXlJbmZvLktleUluZGV4OworCisJLy8gS2V5IFR5cGUgR3JvdXAga2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIFNlY3VyZSBiaXQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSAgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBncm91cCBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgCQkmRnJhbWVMZW4sCisJCQkJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgcHJlcGFyZSBmb3IgZW5jcnlwdGlvbgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7CisKKwkvLyA2IEZyZWUgYWxsb2NhdGVkIG1lbW9yeQorCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgV1BBIE1BQyBoZWFkZXIKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhTWFjSGVhZGVySW5pdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVBIRUFERVJfODAyXzExCXBIZHI4MDIxMSwKKwlJTgkJVUNIQVIJCQl3ZXAsCisJSU4JCVBVQ0hBUgkJICAgIHBBZGRyMSkKK3sKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEhkcjgwMjExLT5GQy5UeXBlCT0gQlRZUEVfREFUQTsKKwlwSGRyODAyMTEtPkZDLlRvRHMJPSAxOworCWlmICh3ZXAJPT0gMSkKKwkJcEhkcjgwMjExLT5GQy5XZXAgPSAxOworCisJIC8vCUFkZHIxOiBCU1NJRCwgQWRkcjI6IFNBLCBBZGRyMzoJREEKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBBZGRyMSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlwSGRyODAyMTEtPlNlcXVlbmNlID0JcEFkLT5TZXF1ZW5jZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKQorCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1czsKKwlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKKwlVQ0hBUiAgIEluZGV4OworCisJZG8KKwl7CisJCS8vIDEuIGJ1aWxkIGEgTkRJUyBwYWNrZXQgYW5kIGNhbGwgUlRNUFNlbmRQYWNrZXQoKTsKKwkJLy8gICAgYmUgY2FyZWZ1bCBhYm91dCBob3cvd2hlbiB0byByZWxlYXNlIHRoaXMgaW50ZXJuYWwgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIGJ1ZmZlcgorCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChpczR3YXlGcmFtZSkKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7CisJCWVsc2UKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7CisKKwkJLy8gMi4gc2VuZCBvdXQgdGhlIHBhY2tldAorCQlTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQkvLyBEZXF1ZXVlIG9uZSBmcmFtZSBmcm9tIFR4U3dRdWV1ZTAuLjMgcXVldWUgYW5kIHByb2Nlc3MgaXQKKwkJCS8vIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuCisJCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCisJCQkvLyAyLiBBdCB0aGUgZW5kIG9mIFR4UmluZ1R4RG9uZSBzZXJ2aWNlIHJvdXRpbmUuCisJCQkvLyAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMKKwkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKQorCQkJeworCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCisJCQkJCWlmKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS5OdW1iZXIgPiAwKQorCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgSW5kZXgsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIFNhbml0eSBSU04gSUUgZm9ybSBBUAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEvV1BBUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCS8vIFdQQTIgUlNOIElFCisJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IHNraXBfb2Zmc2V0KCVkKSBcbiIsICpPZmZzZXQpKTsKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBQYXJzZUtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTjsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKworCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBQYWlyZXdpc2UtTXNnIDMgYW5kIHNraXAgaXQKKwlpZiAoYlBhaXJld2lzZSkKKyAgICB7CisJCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSworCQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgJnNraXBfb2Zmc2V0KSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1pc21hdGNoZWQgXG4iKSk7CisJCQloZXhfZHVtcCgiR2V0IEtFWURBVEEgOiIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKKwkJCXJldHVybiBGQUxTRTsKKyAgICAJfQorICAgIAllbHNlCisJCXsKKwkJCS8vIHNraXAgUlNOIElFCisJCQlwTXlLZXlEYXRhICs9IHNraXBfb2Zmc2V0OworCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKworCQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlBhcnNlS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQKKwlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQorICAgIHsKKyAgICAgICAgcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOworICAgIH0KKwllbHNlCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS2V5RGF0YUxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggc2hvdWxkIG5vdCBiZSAwCisJaWYgKHBLREUtPkdUS0VuY2FwLktpZCA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXggemVybyBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKKwlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBUaGUgbGVuIGZyb20gS0RFIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgorCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKKworCWlmIChHVEtMRU4gPCBMRU5fQUVTX0tFWSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIEtleSB3aXRoIEtERSBmb3JtZXQgZ290IGluZGV4PSVkLCBsZW49JWQgXG4iLCBwS0RFLT5HVEtFbmNhcC5LaWQsIEdUS0xFTikpOworCisJLy8gVXBkYXRlIEdUSworCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwS0RFLT5HVEtFbmNhcC5HVEssIDMyKTsKKwlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwS0RFLT5HVEtFbmNhcC5LaWQ7CisKKwkvLyBVcGRhdGUgc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLREUtPkdUS0VuY2FwLkdUSywgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2lzY28gQ0NLTSBQUkYgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJa2V5CQkJCUNpc2NvIEJhc2UgVHJhbnNpZW50IEtleSAoQlRLKQorCQlrZXlfbGVuCQkJVGhlIGtleSBsZW5ndGggb2YgdGhlIEJUSworCQlkYXRhCQkJUnVxdWVzdCBOdW1iZXIoUk4pICsgQlNTSUQKKwkJZGF0YV9sZW4JCVRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKwkJb3V0cHV0CQkJU3RvcmUgZm9yIFBUSyhQYWlyd2lzZSB0cmFuc2llbnQga2V5cykKKwkJbGVuCQkJCVRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAorCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJODAyLjFpCUFubmV4IEYuOQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDQ0tNUFJGKAorCUlOCVVDSEFSCSprZXksCisJSU4JSU5UCQlrZXlfbGVuLAorCUlOCVVDSEFSCSpkYXRhLAorCUlOCUlOVAkJZGF0YV9sZW4sCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JSU5UCQlsZW4pCit7CisJSU5UCQlpOworCVVDSEFSCWlucHV0WzEwMjRdOworCUlOVAkJY3VycmVudGluZGV4ID0gMDsKKwlJTlQJCXRvdGFsX2xlbjsKKworCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0gZGF0YV9sZW47CisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgTUlDIGVycm9yIGluZGljYXRpb24gYW5kIHJlY29yZCBNSUMgZXJyb3IgdGltZXIuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwV3BhS2V5IAkJUG9pbnRlciB0byB0aGUgV1BBIGtleSBzdHJ1Y3R1cmUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QUmVwb3J0TWljRXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENJUEhFUl9LRVkgCXBXcGFLZXkpCit7CisJVUxPTkcJTm93OworICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7CisKKwkvLyBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQKKwlOb3cgPSBqaWZmaWVzOworCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkKKwl7CisJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQorCQl7CisJCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KKwkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIE1JQyBlcnJvciBjb3VudCA+PSAyCisJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJOworCX0KKyAgICBNbG1lRW5xdWV1ZShwQWQsCisJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUsCisJCQkJMSwKKwkJCQkmdW5pY2FzdEtleSk7CisKKyAgICBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpCisgICAgeworICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOworICAgIH0KK30KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2RlZmluZQlMRU5HVEhfRUFQX0ggICAgNAorLy8gSWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1QYWNrZXQgLGZpbmQgb3V0IGl0cyBFQVAtQ29kZSAoUmVxdWVzdCgweDAxKSwgUmVzcG9uc2UoMHgwMiksIFN1Y2Nlc3MoMHgwMyksIEZhaWx1cmUoMHgwNCkpLgorSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJCXBBZCwKKwlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKKwlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAorCUlOICBVU0hPUlQJCQkJT2ZmU2V0KQoreworCisJUFVDSEFSCXBEYXRhOworCUlOVAlyZXN1bHQgPSAwOworCisJaWYoIEZyYW1lTGVuIDwgT2ZmU2V0ICsgTEVOR1RIX0VBUE9MX0ggKyBMRU5HVEhfRUFQX0ggKQorCQlyZXR1cm4gcmVzdWx0OworCisJcERhdGEgPSBwRnJhbWUgKyBPZmZTZXQ7IC8vIHNraXAgb2Zmc2V0IGJ5dGVzCisKKwlpZigqKHBEYXRhKzEpID09IEVBUFBhY2tldCkgCS8vIDgwMi4xeCBoZWFkZXIgLSBQYWNrZXQgVHlwZQorCXsKKwkJIHJlc3VsdCA9ICoocERhdGErNCk7CQkvLyBFQVAgaGVhZGVyIC0gQ29kZQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK1ZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOICBCT09MRUFOICAgICAgICAgIGJVbmljYXN0KQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworICAgIHNwcmludGYoY3VzdG9tLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIik7CisgICAgaWYgKGJVbmljYXN0KQorICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzIHVuaWNhc3QiLCBjdXN0b20pOworICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oY3VzdG9tKTsKKyAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCitWT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKKworICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7CisJcEFkLT5TZXF1ZW5jZSA9ICgocEFkLT5TZXF1ZW5jZSkgKyAxKSAmIChNQVhfU0VRX05VTUJFUik7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisKKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworICAgIC8vIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkCisgICAgUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKKworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKyAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsKKworCS8vIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICBpbmNfYnl0ZV9hcnJheShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworICAgICAgICBVQ0hBUiBkaWdlc3RbMjBdID0gezB9OworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisgICAgCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAorICAgIAkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAgJlBhY2tldCwKKyAgICAJCQkJRU5EX09GX0FSR1MpOworCisJLy8gb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTUlDIGZhaWx1cmUgcmVwb3J0IGZyYW1lIHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOworfQorCisvKiogZnJvbSB3cGFfc3VwcGxpY2FudAorICogaW5jX2J5dGVfYXJyYXkgLSBJbmNyZW1lbnQgYXJiaXRyYXJ5IGxlbmd0aCBieXRlIGFycmF5IGJ5IG9uZQorICogQGNvdW50ZXI6IFBvaW50ZXIgdG8gYnl0ZSBhcnJheQorICogQGxlbjogTGVuZ3RoIG9mIHRoZSBjb3VudGVyIGluIGJ5dGVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvdW50ZXIgYnkgb25lIGFuZCBjb250aW51ZXMKKyAqIHJvbGxpbmcgb3ZlciB0byBtb3JlIHNpZ25pZmljYW50IGJ5dGVzIGlmIHRoZSBieXRlIHdhcyBpbmNyZW1lbnRlZCBmcm9tCisgKiAweGZmIHRvIDB4MDAuCisgKi8KK3ZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pCit7CisJaW50IHBvcyA9IGxlbiAtIDE7CisJd2hpbGUgKHBvcyA+PSAwKSB7CisJCWNvdW50ZXJbcG9zXSsrOworCQlpZiAoY291bnRlcltwb3NdICE9IDApCisJCQlicmVhazsKKwkJcG9zLS07CisJfQorfQorCitWT0lEIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKyAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKyAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisKKwkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKKwlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX01JQ19GQUlMVVJFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0N2QxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKQEAgLTAsMCArMSw2OTQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHN0YV9pb2N0bC5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBJT0NUTCByZWxhdGVkIHN1YnJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAxLTAzLTIwMDMgICAgY3JlYXRlZAorCVJvcnkgQ2hlbiAgIDAyLTE0LTIwMDUgICAgbW9kaWZ5IHRvIHN1cHBvcnQgUlQ2MQorKi8KKworI2luY2x1ZGUJInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworI2VuZGlmCisKKyNkZWZpbmUgTlJfV0VQX0tFWVMgCQkJCTQKKyNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4gCQkJKDQwLzgpCisjZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOIAkJCSgxMDQvOCkKKworI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCisjZWxzZQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbmRpZgorCitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPeworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OworfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKK3sgUlRQUklWX0lPQ1RMX1NFVCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAorICAic2V0In0sCisKK3sgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKK3sgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAorLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCisgICAgeyBTSE9XX0NPTk5fU1RBVFVTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCisJeyBTSE9XX0RSVklFUl9WRVJJT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAorICAgIHsgU0hPV19CQV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKKwl7IFNIT1dfREVTQ19JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAorICAgIHsgUkFJT19PRkYsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAorCXsgUkFJT19PTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IFNIT1dfRExTX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGxzZW50cnlpbmZvIiB9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsgU0hPV19DRkdfVkFMVUUsCisJICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAorLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLworCisjaWZkZWYgREJHCit7IFJUUFJJVl9JT0NUTF9CQlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJiYnAifSwKK3sgUlRQUklWX0lPQ1RMX01BQywKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJtYWMifSwKK3sgUlRQUklWX0lPQ1RMX0UyUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJlMnAifSwKKyNlbmRpZiAgLyogREJHICovCisKK3sgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MsCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJzdGF0In0sCit7IFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWSwKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZ2V0X3NpdGVfc3VydmV5In0sCit9OworCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKK1ZPSUQgUlRNUElvY3RsQkJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxFMlBST00oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOworI2VuZGlmIC8vIERCRyAvLworCisKK05ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTglQVk9JRAkJCXBCdWYpOworCitJTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0geworCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAorCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKKwl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKKwl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCisJeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKKwl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFdNTV9TVVBQT1JUCisJeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAorI2VuZGlmCisJeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAorICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAorCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAorCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKKwl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCisJeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKKwl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAorCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCisJeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKKwl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKKwl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAorCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKKyNpZmRlZiBEQkcKKwl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKwl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCisJeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKKwl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAorCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKKwl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAorCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAorCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAorCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAorCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKKwl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAorCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKKwl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAorCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKKwl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCisJeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKKwl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAorCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCisJeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKKwl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAorCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCisJeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAorCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKKwl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKKwl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCisJeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKwl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCXsiT3BNb2RlIiwJCQkJCQlTZXRfT3BNb2RlX1Byb2N9LAorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgeyJUR25XaWZpVGVzdCIsICAgICAgICAgICAgICAgICBTZXRfVEduV2lmaVRlc3RfUHJvY30sCisgICAgeyJGb3JjZUdGIiwJCSAgICAgICAgCQlTZXRfRm9yY2VHRl9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKKwl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKKwl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJeyIxMWRDbGllbnRNb2RlIiwJCQkJU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2N9LAorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJeyJDYXJyaWVyRGV0ZWN0IiwJCQkJU2V0X0NhcnJpZXJEZXRlY3RfUHJvY30sCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJe05VTEwsfQorfTsKKworCitWT0lEIFJUTVBBZGRLZXkoCisJSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAorCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKK3sKKwlVTE9ORwkJCQlLZXlJZHg7CisJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwl7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCXsKKwkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisJCSAgICAvLyBVcGRhdGUgUFRLCisJCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKyAgICAgICAgCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgICAgIAllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgCWVsc2UKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisgICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBzdHJuY3B5KG5hbWUsICJSVDI4NjAgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXUxNiB2YWw7CisJaW50IGk7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKKwl7CisJCXUzMiBtOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7CisJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisKKwkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJdmFsKys7CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisKKwkvKiBXaGF0IHdvdWxkIGJlIHN1aXRhYmxlIHZhbHVlcyBmb3IgImF2ZXJhZ2UvdHlwaWNhbCIgcXVhbD8gKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IC02MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAtOTU7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKKworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTlJfV0VQX0tFWVM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJVUxPTkcJCQkJCQkJCU5vdzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCXJldHVybiAwOworCWRveworCQlOb3cgPSBqaWZmaWVzOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQl7CisJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJfQorCisJCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQkvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCQlwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkwLAorCQkJTlVMTCk7CisKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfXdoaWxlKDApOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgRVRIX0FMRU4pOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VTU0lECisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL05ldHdvcmsgVHlwZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CisJCX0KKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWVsc2UKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWl3ZS51LmZyZXEuaSA9IDA7CisKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisgICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcworICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKyAgICAJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisgICAgCWl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgICAgICBzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworICAgIAljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VuY3lwdGlvbiBrZXkKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQml0IFJhdGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisgICAgCQljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworICAgICAgICAgICAgaWYgKHRtcFJhdGUgPT0gMHg4MikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMiAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICA1LjUgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDk2KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMTEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZQorICAgIAkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOworCisJCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJCWN1cnJlbnRfdmFsID0gSVdFX1NUUkVBTV9BRERfVkFMVUUoaW5mbywgY3VycmVudF9ldiwKKwkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKKyAgICAJCQlJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIAlpZigoY3VycmVudF92YWwtY3VycmVudF9ldik+SVdfRVZfTENQX0xFTikKKyAgICAgICAgICAgIAljdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisgICAgICAgIAllbHNlCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgSVdFVkdFTklFCisJCS8vV1BBIElFCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisJCXsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCS8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgICAgIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vV1BBIElFCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJ3cGFfaWU9IiwgNyk7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAicnNuX2llPSIsIDcpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCX0KKworCWRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAsKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsaSAsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yLCBkYXRhLT5sZW5ndGgpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5mbGFncykKKwl7CisJCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBTc2lkU3RyaW5nKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOworCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQU5ZIHNzaWQKKwkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJZGF0YS0+ZmxhZ3MgPSAxOworICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKwllbHNlCisJey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKKwkJZGF0YS0+bGVuZ3RoICA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworaW50IHJ0X2lvY3RsX3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKwltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKKworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChkYXRhLT5sZW5ndGggPiBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgeworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOworCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXUxNiB2YWw7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA8IDAgfHwgcnRzLT52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChydHMtPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwkJdmFsID0gcnRzLT52YWx1ZTsKKworCWlmICh2YWwgIT0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpCisJCXBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJdTE2IHZhbDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoZnJhZy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisJZWxzZSBpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pKQorCXsKKwkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICAJZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQorCXsKKwkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sga2V5IGluZGV4ICovCisJCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisKKwkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UKKwkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisgICAgICAgIH0KKwl9CisgICAgZWxzZQorCQkJeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCitkb25lOgorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKwlpbnQga2lkOworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCisJeworCQkvLyBjb3B5IHdlcCBrZXkKKwkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCisJCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKKwkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisKKwl9CisJZWxzZSBpZiAoa2lkID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOworCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7CisJUE9TX0NPT0tJRSBwT2JqOworCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOworCWNoYXIgKnZhbHVlOworCWludCAgU3RhdHVzPTA7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOworCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKCEqdGhpc19jaGFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJICAgICp2YWx1ZSsrID0gMDsKKworCWlmICghdmFsdWUpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKKyAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCisJeworCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCisJICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKKwkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICAgICAgfQorCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KKwkgICAgfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAorCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitzdGF0aWMgaW50CitydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworCX0KKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJCWVsc2UKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKyAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQJZ2V0QmFJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCit7CisJSU5UIGksIGo7CisJQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKKwlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJCXsKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKKyAgICAgICAgICAgICAgICBwT3V0QnVmLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKKwkJfQorICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKyAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJCXBBZCA9IGRldi0+bWxfcHJpdjsKKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworICAgIHN3aXRjaChzdWJjbWQpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPV19DT05OX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisgICAgICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2VudHJhbENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIlNzaWQ9JXMgLFNzaWRsZW4gPSAlZFxuIixwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJDb25uU3RhdHVzIGlzIG5vdCBjb25uZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKKyAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU0hPV19ERVNDX0lORk86CisJCQl7CisJCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT0ZGOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PTjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7CisgICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFNIT1dfRExTX0VOVFJZX0lORk86CisJCQl7CisJCQkJU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJY2FzZSBTSE9XX0NGR19WQUxVRToKKwkJCXsKKwkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7CisJCQkJaWYgKFN0YXR1cyA9PSAwKQorCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3ViY21kKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgU0lPQ1NJV01MTUUKK2ludCBydF9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCisJaWYgKHBNbG1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKHBNbG1lLT5jbWQpCisJeworI2lmZGVmIElXX01MTUVfREVBVVRICisJCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworaW50IHJ0X2lvY3RsX3Npd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKwkJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fRlVOQ1RJT05fXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWxnKSB7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQl7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBkZXYtPm1sX3ByaXY7CisJUENIQVIgcEtleSA9IE5VTEw7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOworCisJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpCisJeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCisJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWVsc2UKKwkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKKwltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOworCisJZXh0LT5rZXlfbGVuID0gMDsKKwlzd2l0Y2gocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbjsKKwkJCQlwS2V5ID0gJihwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleVswXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCQllbHNlCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisKKwkJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMzI7CisJCQkJcEtleSA9ICZwQWQtPlN0YUNmZy5QTUtbMF07CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKKwl7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ1NJV0dFTklFCitpbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisKK2ludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8CisJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJCXJldHVybiAtRTJCSUc7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQlSU05JZSA9IElFX1JTTjsKKworCQlleHRyYVswXSA9IChjaGFyKVJTTkllOworCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19wbWtzYSAqcFBta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlJTlQJQ2FjaGVkSWR4ID0gMCwgaWR4ID0gMDsKKworCWlmIChwUG1rc2EgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd3Bta3NhXG4iKSk7CisJc3dpdGNoKHBQbWtzYS0+Y21kKQorCXsKKwkJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9GTFVTSFxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJICAgICAgICB7CisJCSAgICAgICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSUQsIDE2KTsKKwkJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7IGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOyBpZHgrKykKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uQlNTSURbMF0sIE1BQ19BRERSX0xFTik7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5QTUtJRFswXSwgMTYpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07CisJCQkgICAgICAgIGJyZWFrOworCQkgICAgICAgIH0KKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX0FERDoKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCQkgICAgICAgIGJyZWFrOworCSAgICAgICAgfQorCisJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCSAgICAgICAgeworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCSAgICAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkgICAgICAgIH0KKwkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkgICAgICAgIENhY2hlZElkeCA9IChwUG1rc2EtPmJzc2lkLnNhX2RhdGFbNV0gJSBQTUtJRF9OTyk7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyAjaWYgV0lSRUxFU1NfRVhUID4gMTcKKworI2lmZGVmIERCRworc3RhdGljIGludAorcnRfcHJpdmF0ZV9pb2N0bF9iYnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQorCQkJeworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZSA9IE5VTEw7CisJVUNIQVIJCQkJcmVnQkJQID0gMDsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCisJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwlpZiAod3JxLT5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJCQkJeworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSB3cnEtPnBvaW50ZXI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lc1xuIiwgdGhpc19jaGFyKSk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lcywgdmFsdWU9JXNcbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwkJCWlmIChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworICAgIAkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKyAgICAJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQl9CisJZWxzZQorCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisKK25leHQ6CisJaWYgKGJJc1ByaW50QWxsQkJQKQorCXsKKwkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gMTM2OyBiYnBJZCsrKQorCQl7CisJCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAxMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKwkJCWlmIChiYnBJZCU1ID09IDQpCisJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiXG4iKTsKKwkJfQorCisgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKK2ludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7CisgICAgc3dpdGNoKGNtZCAmIDB4N0ZGRikgeworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCisgICAgICAgICAgICBlbHNlIGlmICghKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTE9ORyAgIENvdW50cnk7CisgICAgICAgICAgICAgICAgVUNIQVIJVG1wUGh5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvdW50cnksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gKEE6JWQgIEIvRzolZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAorCQkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorICNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKKworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJLy9CZW5zb24gYWRkIDIwMDgwNTI3LCB3aGVuIHJhZGlvIG9mZiwgc3RhIGRvbid0IG5lZWQgdG8gc2NhbgorCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQlpZiAocEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlQQ0hBUiBwU3NpZFN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgICAgICAgICAgICAgIGlmIChTc2lkLlNzaWRMZW5ndGggPiBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIik7CisgICAgICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgICAgIAlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJCQkJCWlmIChwU3NpZFN0cmluZykKKwkJCQkJCXsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpOworCQkJCQkJCWtmcmVlKHBTc2lkU3RyaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisKKwkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyA9IFJhZGlvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFN0YUNvbmZpZy5FbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gU3RhQ29uZmlnLkFkaG9jTW9kZSkgJiYKKwkJCQkJKFN0YUNvbmZpZy5BZGhvY01vZGUgPD0gTWF4UGh5TW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiAiVVNFIE9GRE0gcmF0ZSBvciBub3QiIGluIEFESE9DIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2V0dGluZyBjaGFuZ2VkLCBuZWVkIHRvIHJlc2V0IGN1cnJlbnQgVFggcmF0ZSBhcyB3ZWxsIGFzIEJFQUNPTiBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkYXB0ZXIpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkYXB0ZXIpOyAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgKEJ1cnN0PSVkLCBQcm90ZWN0aW9uPSVsZCxTaG9ydFNsb3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgfHwgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVBdXRvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICE9IFdlcFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyAoPSVkKVxuIixXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZBdXRoTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0aE1vZGUgPiBOZGlzODAyXzExQXV0aE1vZGVNYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IEF1dGhNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgID0gLUVJTlZBTDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJCQlLZXlJZHggPSAqKE5ESVNfODAyXzExX0tFWV9JTkRFWCAqKSB3cnEtPnUuZGF0YS5wb2ludGVyOworCisJCQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworCQkJCQlpZiAoS2V5SWR4ID49IDQpeworCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlM6CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworICAgICAgICAgICAgcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTIFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUnRzVGhyZXNoID4gTUFYX1JUU19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKD0lbGQpIFxuIixGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9QT1dFUl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlck1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJDQU0iKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIk1heF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJGYXN0X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTGVnYWN5X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFICg9JWQpXG4iLFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIDwgc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlclRlbXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBvd2VyVGVtcCA+IDEwMCkKKwkJCQkJUG93ZXJUZW1wID0gMHhmZmZmZmZmZjsgIC8vIEFVVE8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gUG93ZXJUZW1wOyAvL2tlZXAgY3VycmVudCBzZXR0aW5nLgorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCX0KKwkgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfVFlQRSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTmV0VHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFEUykKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUIpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUJHX01JWEVEKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUEpOworCQkJCWVsc2UKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSAoPSVkKVxuIixOZXRUeXBlKSk7CisJCSAgICB9CisJCQlicmVhazsKKyAgICAgICAgLy8gRm9yIFdQQSBQU0sgUE1LIGtleQorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQUREX1dQQToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhIFtBdXRoTW9kZSAhPSBXUEFQU0svV1BBMlBTSy9XUEFOT05FXVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApICAgICAvLyBPbmx5IGZvciBXUEEgUFNLIG1vZGUKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKKyAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVE1QV1BBUmVtb3ZlS2V5UHJvYyhwQWRhcHRlciwgcFJlbW92ZUtleSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBSZW1vdmUgV1BBIEtleSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IHBSZW1vdmVLZXktPktleUluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKEtleUlkWyVkXSBvdXQgb2YgcmFuZ2UpXG4iLCBLZXlJZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwUmVtb3ZlS2V5LT5LZXlJbmRleCwgcFJlbW92ZUtleS0+TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICBjYXNlIE9JRF84MDJfMTFfQUREX0tFWToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUEFkZEtleShwQWRhcHRlciwgcEtleSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOworCisgICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQorICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBwQ29uZmlnLT5CZWFjb25QZXJpb2Q7CisKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoVVNIT1JUKSBwQ29uZmlnLT5BVElNV2luZG93OworICAgICAgICAgICAgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChwQ29uZmlnLT5EU0NvbmZpZywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCisJCQkJLy8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5DaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04gKEJlYWNuUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2g9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5CZWFjb25QZXJpb2QsIHBDb25maWctPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJICAgIFBPSURfU0VUX0hUX1BIWU1PREUJcEhUUGh5TW9kZSA9ICZIVF9QaHlNb2RlOworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkhUX1BoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpwSFRQaHlNb2RlCShQaHlNb2RlID0gJWQsVHJhbnNtaXRObyA9ICVkLCBIdE1vZGUgPQklZCwJRXh0T2Zmc2V0ID0JJWQgLCBNQ1MgPSAlZCwgQlcgPQklZCwJU1RCQyA9ICVkLCBTSE9SVEdJID0gJWQpIFxuIiwKKwkJCQlwSFRQaHlNb2RlLT5QaHlNb2RlLCBwSFRQaHlNb2RlLT5UcmFuc21pdE5vLHBIVFBoeU1vZGUtPkh0TW9kZSxwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywJcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUJPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCQkJUlRNUFNldEhUKHBBZGFwdGVyLAlwSFRQaHlNb2RlKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuQlcsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQykpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUxPTkcgYXBzZCA7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFwc2QsIHdycS0+dS5kYXRhLnBvaW50ZXIsCXdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8QjMxfkI3CXwJQjZ+QjUJIHwJIEI0CSB8CSBCMwkgfAlCMgkgfAlCMQkgfAkgICBCMAkJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXwgUnN2ZAl8IE1heCBTUCBMZW4gfCBBQ19WTyB8IEFDX1ZJIHwgQUNfQksgfCBBQ19CRSB8IEFQU0QJQ2FwYWJsZQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IChhcHNkICYgMHgwMDAwMDAwMSkgPyBUUlVFIDoJRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gKChhcHNkCSYgMHgwMDAwMDAwNCkgPj4gMikJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gKChhcHNkCSYgMHgwMDAwMDAwOCkgPj4gMykJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aAk9IChVQ0hBUikoKGFwc2QJJiAweDAwMDAwMDYwKSA+PiA1KTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HIChhcHNkPTB4JWx4LCBBUFNEQ2FwPSVkLCBbQkUsQkssVkksVk9dPVslZC8lZC8lZC8lZF0sCU1heFNQTGVuPSVkKVxuIiwgYXBzZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUsCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkksCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCS8vIERyaXZlciBuZWVkcwl0byBub3RpZnkgQVAgd2hlbiBQU00gY2hhbmdlcworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWRhcHRlci0+U3RhQ2ZnLlBzbSkKKwkJCQl7CisJCQkJCU1sbWVTZXRQc21CaXQocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7CisJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZSwJVFJVRSk7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00gKGJBUFNERm9yY2VQb3dlclNhdmU6JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChvbGR2YWx1ZSAmJgkhcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCQl7CisJCQkJCWludAlpOworCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQorCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihSVF84MDJfMTFfRExTX1VJKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVJUXzgwMl8xMV9ETFMJRGxzOworCisJCQkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJCQlSVE1QTW92ZU1lbW9yeSgmRGxzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCQkJJkRscyk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSBcbiIpKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX1dNTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJLy8KKwkJCS8vIFNldCBOZGlzUmFkaW9TdGF0ZU9mZiB0bwlUUlVFLCBpbnN0ZWFkIG9mIGNhbGxlZAlNbG1lUmFkaW9PZmYuCisJCQkvLyBMYXRlciBvbiwgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWC0+TnVtYmVyT2ZJdGVtcyBzaG91bGQgYmUJMAorCQkJLy8gd2hlbglxdWVyeSBPSURfODAyXzExX0JTU0lEX0xJU1QuCisJCQkvLworCQkJLy8gVFJVRTogIE51bWJlck9mSXRlbXMJd2lsbCBzZXQgdG8JMC4KKwkJCS8vIEZBTFNFOiBOdW1iZXJPZkl0ZW1zCW5vIGNoYW5nZS4KKwkJCS8vCisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0JVFJVRTsKKwkJCS8vIFNldCB0byBpbW1lZGlhdGVseSBzZW5kIHRoZSBtZWRpYSBkaXNjb25uZWN0CWV2ZW50CisJCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOworCisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0JQ05UTF9JRExFKQorCQkJCXsKKwkJCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJCQl9CisKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFLAorCQkJCQkwLAorCQkJCQlOVUxMKTsKKworCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQJPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUDoKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQkFDQVBfU1RSVUMpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCU9JRF9CQUNBUF9TVFJVQyBPcmRlIDsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk9yZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCWlmIChPcmRlLlBvbGljeSA+IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKE9yZGUuUG9saWN5ID09IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9Qcz0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsgLy8gd2Ugb25seSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKworCQkJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA+IE1BWF9SWF9SRU9SREVSQlVGKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOworCisJCQkJCX0KKworCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooT3JkZS5BdXRvQkEgPSAlZCkgKFBvbGljeT0lZCkoUmVCQVdpbkxpbWl0PSVkKShUeEJBV2luTGltaXQ9JWQpKEF1dG9Nb2RlPSVkKVxuIixPcmRlLkF1dG9CQSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0LHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkpKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFNldCA6OiBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUNIQVIJCSAgICAgICAgaW5kZXg7CisJCQkJT0lEX0FERF9CQV9FTlRSWSAgICBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKEJBLlRJRCA+IDE1KQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkKKwkJCQkJLy9BcyBhZC1ob2MgbW9kZSwgQkEgcGFpciBpcyBub3QgbGltaXRlZCB0byBvbmx5IEJTU0lELiBzbyBhZGQgdmlhIE9JRC4KKwkJCQkJaW5kZXggPSBCQS5USUQ7CisJCQkJCS8vIGluIGFkIGhvYyBtb2RlLCB3aGVuIGFkZGluZyBCQSBwYWlyLCB3ZSBzaG91bGQgaW5zZXJ0IHRoaXMgZW50cnkgaW50byBNQUNFbnRyeSB0b28KKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIEJBLk1BQ0FkZHIpOworCQkJCQlpZiAoIXBFbnRyeSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gYnJlYWsgb24gbm8gY29ubmVjdGlvbi4tLS0tOiV4OiV4XG4iLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoQkEuSXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJICAgIGlmIChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IFRSVUUpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKKworCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkYXB0ZXIsIHBFbnRyeSwgaW5kZXgsIDAsIDEwMCwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeShwQWRhcHRlciwgcEVudHJ5LT5BaWQsIEJBLk1BQ0FkZHIsIDAsIDB4ZmZmZiwgQkEuVElELCBCQS5uTVNEVSwgQkEuSXNSZWNpcGllbnQpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBSZWMgPSAlZC4gTWFjID0gJXg6JXg6JXg6JXg6JXg6JXggLiBcbiIsCisJCQkJCQlCQS5Jc1JlY2lwaWVudCwgQkEuTUFDQWRkclswXSwgQkEuTUFDQWRkclsxXSwgQkEuTUFDQWRkclsyXSwgQkEuTUFDQWRkclsyXQorCQkJCQkJLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVBPSURfQUREX0JBX0VOVFJZCXBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCXBCQSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCQlpZiAocEJBID09IE5VTEwpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEga21hbGxvYygpIGNhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIpKTsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEoVElEPSVkLCBiQWxsVGlkPSVkKVxuIiwgcEJBLT5USUQsIHBCQS0+YkFsbFRpZCkpOworCisJCQkJCWlmICghcEJBLT5iQWxsVGlkICYmIChwQkEtPlRJRCA+IE5VTV9PRl9USUQpKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZGFwdGVyLCBwRW50cnktPkFpZCwgcEJBLT5USUQsIEZBTFNFLCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlCQVJlY1Nlc3Npb25UZWFyRG93biggcEFkYXB0ZXIsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWtmcmVlKHBCQSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQorICAgIAljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKKyAgICAJICAgIHBXZXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMworICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQorICAgIAkJCXsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKEtleUlkeCBtdXN0IGJlIHNtYWxsZXIgdGhhbiA0KSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVDSEFSIENpcGhlckFsZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBLZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChwV2VwS2V5LT5LZXlMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBvbmx5IHN1cHBvcnQgQ0lQSEVSX1dFUDY0KGxlbjo1KSAmIENJUEhFUl9XRVAxMjgobGVuOjEzKSEhXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQgPSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKyAgICAJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gIlBvcnQgU2VjdXJlZCI6IlBvcnQgTk9UIFNlY3VyZWQiKSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFdlcEtleSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGNhc2UgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPyAiVFJVRSI6IkZBTFNFIikpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJndwYV9zdXBwbGljYW50X2VuYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAJCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IHdwYV9zdXBwbGljYW50X2VuYWJsZTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgICpwSW5mbzsKKwkJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworICAgICAgICAgICAgICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKikgTXNnRWxlbS0+TXNnOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBJbmZvLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkYXB0ZXIsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCisgICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisJCQkJcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwkJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgKCVkKVxuIiwgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMpKTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE1LSUQ6CisJICAgICAgICBwUG1rSWQgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJICAgICAgICBpZihwUG1rSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUG1rSWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkgICAgICAgIC8vIGNoZWNrIHRoZSBQTUtJRCBpbmZvcm1hdGlvbgorCSAgICAgICAgaWYgKHBQbWtJZC0+QlNTSURJbmZvQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87CisJCSAgICAgICAgVUlOVAkJQnNzSWR4OworCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKKworCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCisJCSAgICAgICAgeworCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQorCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCisJCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpKQorCQkJCQkgICAgICAgIGJyZWFrOworCQkJICAgICAgICB9CisKKwkJCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkJCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCQkJICAgICAgICBlbHNlCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIH0KKwkJICAgICAgICB9CisJCQl9CisJCQlpZihwUG1rSWQpCisJCQkJa2ZyZWUocFBta0lkKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKKwkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJLy9wS2V5ID0gJldlcEtleTsKKworCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorCQkJeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKKwkJCX0KKwkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKworCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQlpZiAoS2V5SWR4ID4gNCkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJCX0KKwkJCQkvL1Jlc3RhcnRBUElzUmVxdWlyZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXNwcmludGYoJmN0bXAsIiVkIiwgY3RtcCk7CisJCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWRhcHRlciwgJmN0bXApOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOworICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOworICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisJVUNIQVIJZHJpdmVyVmVyc2lvbls4XTsKKyAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJLy9mb3Igc25tcCwga2F0aHkKKwlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOworCUlOVAkJCQkJCQl2YWx1ZUxlbjsKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQl0bXBbNjRdOworI2VuZGlmIC8vU05NUAorCisgICAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFNUQV9OSUNfREVWSUNFX05BTUUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFNUQV9OSUNfREVWSUNFX05BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihVQ0hBUik7CisJCQlzcHJpbnRmKCZkcml2ZXJWZXJzaW9uWzBdLCAiJXMiLCBTVEFfRFJJVkVSX1ZFUlNJT04pOworCQkJZHJpdmVyVmVyc2lvbls3XSA9ICdcMCc7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkcml2ZXJWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCWNhc2UgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQzMik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkvKgorICAgICAgICAgICAgCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisgICAgICAgICAgICAJICovCisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoU3RpbGwgc2Nhbm5pbmcpXG4iKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUICglZCBCU1MgcmV0dXJuZWQpXG4iLHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKSk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAorICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsaWduIHBvaW50ZXIgdG8gNCBieXRlcyBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAvL1BhZGRpbmcgPSA0IC0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAvL2lmIChQYWRkaW5nID09IDQpCisgICAgICAgICAgICAgICAgLy8gICAgUGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgorICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7CisgICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOworICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAorICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCisgICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKKyAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzID0gKFBORElTX1dMQU5fQlNTSURfRVgpIHBQdHI7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBCc3MtPk1hY0FkZHJlc3MsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPT0gRkFMU0UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKwkJCQkJLy8gV2UgbXVzdCByZXR1cm4gdGhpcyBTU0lEIGR1cmluZyA0d2F5IGhhbmRzaGFraW5nLCBvdGhlcndpc2UgQWVnaXMgd2lsbCBmYWlsZWQgdG8gcGFyc2UgV1BBIGluZm9tYXRpb24KKwkJCQkJLy8gYW5kIHRoZW4gZmFpbGVkIHRvIHNlbmQgRUFQT2wgZmFyYW1lLgorCQkJCQkvLworCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJCXsKKwkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQkJCQl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Qcml2YWN5OworICAgICAgICAgICAgICAgIHBCc3MtPlJzc2kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKKworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsLCBwQnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7CisKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgKz0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZW5kaWYKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOworICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSUQoPUVNUFRZKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworCQkJTmRpc1plcm9NZW1vcnkoU3NpZC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKKyAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGVdOyAgIC8vIHVuaXQgOiA1MDAga2JwcworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DaGFubmVsUXVhbGl0eSA9IHBBZGFwdGVyLT5NbG1lLkNoYW5uZWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisgICAgICAgIAkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcExpbmtTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHBDb25maWd1cmF0aW9uID0gKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+TGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbjsKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBwQ29uZmlndXJhdGlvbi0+RFNDb25maWcpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENvbmZpZ3VyYXRpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihCZWFjb25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaGFubmVsPSVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCwgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgorCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMCgweD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCSAgICBTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMToKKwkJCWlmICgocEFkYXB0ZXItPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMSgweD0lbHgpXG4iLHVsSW5mbykpOworCQkJfQorCQkJZWxzZQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKKwkJCXVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSV8yOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAorICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA8IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisjaWZkZWYgREJHCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlczsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHVyYm9SYXRlID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VCR1Byb3RlY3Rpb24gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKKyAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkh3UmFkaW9TdGF0dXMgPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkYXB0ZXItPlN5c3RlbUVycm9yQml0bWFwOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUnRzVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCg9JWxkKVxuIiwgUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgRnJhZ1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCisgICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFBvd2VyTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1BPV0VSX01PREUoPSVkKVxuIiwgUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgUmFkaW9TdGF0ZSA9IChCT09MRUFOKSBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEF1dGhNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQXV0aE1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKD0lZClcbiIsIEF1dGhNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlcikpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgorCQkJaWYgKChwQWRhcHRlci0+UmZJY1R5cGUJPT0gUkZJQ18yODUwKSB8fCAocEFkYXB0ZXItPlJmSWNUeXBlID09CVJGSUNfMjc1MCkpCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMzsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAzCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkJTmV0d29ya1R5cGVMaXN0WzNdID0gTmRpczgwMl8xMU9GRE01OyAgIC8vIE5ldHdvcmtUeXBlWzNdID0gMTFhCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAyCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRFxuIikpOworCQkJCWJyZWFrOworCSAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OworCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTI0OworCQkJZWxzZQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFEUzsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RSeFJhdGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKKwkJCS8vdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0VHhSYXRlOworCQkJdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUgKD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwgKD0lZClcbiIsIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSkpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWRhcHRlci0+RXh0cmFJbmZvKSk7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UKTsKKwkgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJndlX3ZlcnNpb25fY29tcGlsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORzoKKwkJCWFwc2QgPSAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA8PCAyKQorCQkJCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCA8PCA1KSk7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmFwc2QsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcgKD0weCVseCxBUFNEQ2FwPSVkLEFDX0JFPSVkLEFDX0JLPSVkLEFDX1ZJPSVkLEFDX1ZPPSVkLE1BWFNQTGVuPSVkKVxuIiwKKwkJCQlhcHNkLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gKD0lZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCWJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKKyAgICAJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgIAkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkYXB0ZXItPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCisgICAgCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworICAgICAgICAgICAgdWxJbmZvID0gKHVsSW5mbyA8PCA4KXwocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQ6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgICAgICAgICAgaSA9IDA7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisgICAgICAgICAgICBpID0gMTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmksIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUKD0lZCkgXG4iLCBpKSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKKwkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLlBzbSA9PSBQU01QX0FDVElPTikKKwkJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHBvd2VyIGFjdGl2ZSBlbHNlIDIgaXMgcG93ZXIgc2F2ZS4KKwkJCWVsc2UKKwkJCQl1bEluZm8gPSAyOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSBcbiIpKTsKKwkJCS8vS2V5SWR4VmFsdWUuS2V5SWR4ID0gcEFkLT5Qb3J0Q2ZnLk1CU1NJRFtwQWQtPklvY3RsSUZdLkRlZmF1bHRLZXlJZDsKKwkJCXBLZXlJZHhWYWx1ZSA9IHdycS0+dS5kYXRhLnBvaW50ZXI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIktleUlkeFZhbHVlLktleUlkeCA9ICVkLCBcbiIscEtleUlkeFZhbHVlLT5LZXlJZHgpKTsKKwkJCXZhbHVlTGVuID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKKwkJCQkJCSAgICZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgICB2YWx1ZUxlbik7CisJCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKKworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5WzBdKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCQkJCSZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlMb25nUmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1JldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0PSVkXG4iLCBMb25nUmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJPRFVDVElEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJPRFVDVElEIFxuIikpOworCisjaWZkZWYgUlQyODYwCisJCQl7CisKKwkJCQlVU0hPUlQgIGRldmljZV9pZDsKKwkJCQlpZiAoKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wY2lfZGV2ICE9IE5VTEwpCisJCQkgICAgCXBjaV9yZWFkX2NvbmZpZ193b3JkKCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cGNpX2RldiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7CisJCQkJZWxzZQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcGNpX2RldiA9IE5VTExcbiIpKTsKKwkJCQlzcHJpbnRmKHRtcCwgIiUwNHggJTA0eFxuIiwgTklDX1BDSV9WRU5ET1JfSUQsIGRldmljZV9pZCk7CisJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4odG1wKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisjZW5kaWYgLy9TTk1QX1NVUFBPUlQKKworCQljYXNlIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWDoKKwkJCXsKKwkJCQlVQ0hBUiB2YWx1ZTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYIFxuIikpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDE7CisjZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3Qgc3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ2YWx1ZSwgMSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVDoKKwkJCXsKKwkJCQlQUlRfQ0hBTk5FTF9MSVNUX0lORk8gcENoTGlzdEJ1ZjsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSF9MSVNUIFxuIikpOworCQkJCWlmIChwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENoTGlzdEJ1Ziwgc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKworCQkJCWlmIChwQ2hMaXN0QnVmKQorCQkJCQlrZnJlZShwQ2hMaXN0QnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06CisJCQl7CisJCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQl9CisKKwkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOworCisJCQkJaWYgKHBEbHNJbmZvKQorCQkJCQlrZnJlZShwRGxzSW5mbyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVBPU19DT09LSUUJCQlwT2JqOworCVZJUlRVQUxfQURBUFRFUgkJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVVNIT1JUCQkJCXN1YmNtZDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJICAgIHsKKwkJICAgIHJldHVybiBTdGF0dXM7CisJICAgIH0KKworCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJICAgIHJldHVybiAtRU5FVERPV047CisgICAgICAgIH0KKyAgICB9CisKKwl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCXN3aXRjaChjbWQpCisJeworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6CisJCQl7CisJCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgeworICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07CisgICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQJKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCisJCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9naXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV01PREU6ICAgLy9nZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKKwkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOworCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKKwkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKKwkJCQkJYnJlYWs7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKKwkJCQlicmVhazsKKwkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgorCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7CisJCSAgICBicmVhazsKKyNpZmRlZiBEQkcKKwkJY2FzZSBSVFBSSVZfSU9DVExfTUFDOgorCQkJUlRNUElvY3RsTUFDKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9FMlA6CisJCQlSVE1QSW9jdGxFMlBST00ocEFkLCB3cnEpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gREJHIC8vCisgICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCX0KKworICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBTU0lECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKyAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAorICAgICAgICB7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOworCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQl9CisgICAgICAgIHBTc2lkID0gJlNzaWQ7CisKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKworICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKKworICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisKKyAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JYldtbUNhcGFibGU7CisKKwliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGJXbW1DYXBhYmxlID09IDEpCisJCSkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBOZXR3b3JrIFR5cGUoSW5mcmFzdHJ1Y3R1cmUvQWRob2MgbW9kZSkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVJTlQzMglWYWx1ZSA9IDA7CisKKyAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQorICAgIHsKKwkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOworCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCisJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9CRUxPVykKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIDIwTUh6CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQl9CisJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgMHgzKTsKKwkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgorCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCS8vVmFsdWUgfD0gKDB4ODApOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCS8vIGRpc2FibGUgc3luYworCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsgLy9BUlBIUkRfSUVFRTgwMjExOyAvLyBJRUVFODAyMTEKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIk5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInRraXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkFFUyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiYWVzIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9FbmNyeXBUeXBlX1Byb2M6OihFbmNyeXBUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBEZWZhdWx0IEtleSBJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKKworICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisgICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTEKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTMKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVk0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworCisgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKyAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7CisKKyAgICBOZGlzWmVyb01lbW9yeShrZXlNYXRlcmlhbCwgNDApOworCisgICAgaWYgKChzdHJsZW4oYXJnKSA8IDgpIHx8IChzdHJsZW4oYXJnKSA+IDY0KSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBmYWlsZWQhIShXUEFQU0s9JXMpLCBXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyBcbiIsIGFyZykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmxlbihhcmcpID09IDY0KQorICAgIHsKKyAgICAgICAgQXRvSChhcmcsIGtleU1hdGVyaWFsLCAzMik7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBhc3N3b3JkSGFzaCgoY2hhciAqKWFyZywgcEFkYXB0ZXItPk1sbWVBdXguU3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguU3NpZExlbiwga2V5TWF0ZXJpYWwpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICB9CisKKworCisgICAgaWYocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyAmJgorICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICB7CisgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICB7CisgICAgICAgIGlmICgoc3RyY21wKGFyZywgIk1heF9QU1AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJtYXhfcHNwIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAiTUFYX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkZhc3RfUFNQIikgPT0gMCkgfHwKKwkJCQkgKHN0cmNtcChhcmcsICJmYXN0X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiRkFTVF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJsZWdhY3lfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisgICAgICAgICAgICAvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICBNbG1lU2V0UHNtQml0KHBBZGFwdGVyLCBQV1JfQUNUSVZFKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9QU01vZGVfUHJvYzo6KFBTTW9kZT0lbGQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgorICAgIFZhbHVlOgorICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgorICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KKyAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIE1BQworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgbWFjIDAgICAgICAgID09PiByZWFkIE1BQyB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgbWFjIDA9MTIgICAgID09PiB3cml0ZSBNQUMgd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVMT05HCQkJCW1hY0FkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKKwlJTlQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkgICAgdGhpc19jaGFyID0gYXJnOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBNYWMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKG1hY0FkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lbHgsIE1hY1ZhbHVlPSV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyICwgbWFjVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDgpCisJCQkJdGVtcDJbNy1rKytdPScwJzsKKwkJCXRlbXAyWzhdPSdcMCc7CisKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKKwkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOworCisJCQkJLy8gZGVidWcgbW9kZQorCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKKwkJCQl7CisJCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwICAgICAJPT0+IHJlYWQgRTJQUk9NIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBlMnAgMD0xMjM0ICAgID09PiB3cml0ZSBFMlBST00gd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyMzQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVVNIT1JUCQkJCWVlcEFkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVVNIT1JUCQkJCWVlcFZhbHVlOworCWludAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCSAgICAvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSBhcmc7CisKKworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIEUyUFJPTSBhZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAoZWVwQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA0WF06MHglMDRYICAiLCBlZXBBZGRyICwgZWVwVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRlbXAyWzMtaysrXT0nMCc7CisJCQl0ZW1wMls0XT0nXDAnOworCisJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7CisJCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworCisKKworSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX0ZsZXhpYmxlOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfU3RyaWN0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0llZWU4MDJkTW9kZV9Qcm9jOjooSUVFRUUwMjExZE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2M6OihDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM3YzhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaApAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKworI2lmbmRlZglfX1dQQV9IX18KKyNkZWZpbmUJX19XUEFfSF9fCisKKy8vIEVBUE9MIEtleSBkZXNjcmlwdGVyIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aAorI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgorI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lECQkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX1JFUExBWQkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX01JQwkJCTE2CisKKy8vIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuCisvLyBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzgKKyNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUpCisKKy8vIEVBUCBDb2RlIFR5cGUuCisjZGVmaW5lIEVBUF9DT0RFX1JFUVVFU1QJMQorI2RlZmluZSBFQVBfQ09ERV9SRVNQT05TRQkyCisjZGVmaW5lIEVBUF9DT0RFX1NVQ0NFU1MgICAgMworI2RlZmluZSBFQVBfQ09ERV9GQUlMVVJFICAgIDQKKworLy8gRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbgorI2RlZmluZQlFQVBPTF9WRVIJCQkJCTEKKyNkZWZpbmUJRUFQT0xfVkVSMgkJCQkJMgorCisvLyBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlCisjZGVmaW5lCVdQQTFfS0VZX0RFU0MJCQkJMHhmZQorI2RlZmluZSBXUEEyX0tFWV9ERVNDICAgICAgICAgICAgICAgMHgwMgorCisvLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbgorI2RlZmluZQlERVNDX1RZUEVfVEtJUAkJCQkxCisjZGVmaW5lCURFU0NfVFlQRV9BRVMJCQkJMgorI2RlZmluZSBERVNDX1RZUEVfTUVTSAkJCQkzCisKKyNkZWZpbmUgTEVOX01TRzFfMldBWSAgICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgTUFYX0xFTl9PRl9FQVBfSFMgICAgICAgICAgIDI1NgorCisjZGVmaW5lIExFTl9NQVNURVJfS0VZCQkJCTMyCisKKy8vIEVBUE9MIEVLLCBNSworI2RlZmluZSBMRU5fRUFQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fRUFQX01JQ0sJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9LRVkJCQkJCSgoTEVOX0VBUF9FSykrKExFTl9FQVBfTUlDSykpCisvLyBUS0lQIGtleSByZWxhdGVkCisjZGVmaW5lIExFTl9QTUtJRAkJCQkJMTYKKyNkZWZpbmUgTEVOX1RLSVBfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX1JYTUlDSwkJCQk4CisjZGVmaW5lIExFTl9US0lQX1RYTUlDSwkJCQk4CisjZGVmaW5lIExFTl9BRVNfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9BRVNfS0VZCQkJCQlMRU5fQUVTX0VLCisjZGVmaW5lIExFTl9US0lQX0tFWQkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKKyNkZWZpbmUgVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUCQkoKExFTl9FQVBfS0VZKSsoTEVOX1RLSVBfRUspKQorI2RlZmluZSBUS0lQX0FQX1JYTUlDS19PRkZTRVQJCShUS0lQX0FQX1RYTUlDS19PRkZTRVQrTEVOX1RLSVBfVFhNSUNLKQorI2RlZmluZSBUS0lQX0dUS19MRU5HVEgJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIExFTl9QVEsJCQkJCQkoKExFTl9FQVBfS0VZKSsoTEVOX1RLSVBfS0VZKSkKKworLy8gUlNOIElFIExlbmd0aCBkZWZpbml0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfUlNOSUUgICAgICAgICAJOTAKKyNkZWZpbmUgTUlOX0xFTl9PRl9SU05JRSAgICAgICAgIAk4CisKKy8vRUFQIFBhY2tldCBUeXBlCisjZGVmaW5lCUVBUFBhY2tldAkJMAorI2RlZmluZQlFQVBPTFN0YXJ0CQkxCisjZGVmaW5lCUVBUE9MTG9nb2ZmCQkyCisjZGVmaW5lCUVBUE9MS2V5CQkzCisjZGVmaW5lCUVBUE9MQVNGQWxlcnQJNAorI2RlZmluZQlFQVBUdHlwZU1heAkJNQorCisjZGVmaW5lCUVBUE9MX01TR19JTlZBTElECTAKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMQkxCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzIJMgorI2RlZmluZQlFQVBPTF9QQUlSX01TR18zCTMKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfNAk0CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18xCTUKKyNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzIJNgorCisjZGVmaW5lIFBBSVJXSVNFS0VZCQkJCQkxCisjZGVmaW5lIEdST1VQS0VZCQkJCQkwCisKKy8vIFJldHJ5IHRpbWVyIGNvdW50ZXIgaW5pdGlhbCB2YWx1ZQorI2RlZmluZSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAwCisjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDEwCisjZGVmaW5lIEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgIDIwCisKKworI2RlZmluZSBFQVBPTF9TVEFSVF9ESVNBQkxFCQkJCQkwCisjZGVmaW5lIEVBUE9MX1NUQVJUX1BTSwkJCQkJCTEKKyNkZWZpbmUgRUFQT0xfU1RBUlRfMVgJCQkJCQkyCisKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfVEtJUF9PTih4KSAgICAgICAoKCh4KSAmIDB4MDgpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX0FFU19PTih4KSAgICAgICAgKCgoeCkgJiAweDA0KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTih4KSAgICAgICgoKHgpICYgMHgwMikgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX0FFU19PTih4KSAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApCisKKyNkZWZpbmUgUk9VTkRfVVAoX194LCBfX3kpIFwKKwkoKChVTE9ORykoKF9feCkrKChfX3kpLTEpKSkgJiAoKFVMT05HKX4oKF9feSktMSkpKQorCisjZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAorewkJCQkJCQkJCQlcCisJVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAorCWRvCQkJCQkJCQkJXAorCXsJCQkJCQkJCQlcCisJCWNudC0tOwkJCQkJCQlcCisJCV9WW2NudF0rKzsJCQkJCQlcCisJCWlmIChjbnQgPT0gMCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwl9d2hpbGUgKF9WW2NudF0gPT0gMCk7CQkJCVwKK30KKworI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCisvLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCUtleUFjazoxOworICAgIFVDSEFSCUluc3RhbGw6MTsKKyAgICBVQ0hBUglLZXlJbmRleDoyOworICAgIFVDSEFSCUtleVR5cGU6MTsKKyAgICBVQ0hBUglLZXlEZXNjVmVyOjM7CisgICAgVUNIQVIJUnN2ZDozOworICAgIFVDSEFSCUVLRF9ETDoxOwkJLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorICAgIFVDSEFSCVJlcXVlc3Q6MTsKKyAgICBVQ0hBUglFcnJvcjoxOworICAgIFVDSEFSCVNlY3VyZToxOworICAgIFVDSEFSCUtleU1pYzoxOworI2Vsc2UKKwlVQ0hBUglLZXlNaWM6MTsKKwlVQ0hBUglTZWN1cmU6MTsKKwlVQ0hBUglFcnJvcjoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorCVVDSEFSCVJzdmQ6MzsKKwlVQ0hBUglLZXlEZXNjVmVyOjM7CisJVUNIQVIJS2V5VHlwZToxOworCVVDSEFSCUtleUluZGV4OjI7CisJVUNIQVIJSW5zdGFsbDoxOworCVVDSEFSCUtleUFjazoxOworI2VuZGlmCit9CUtFWV9JTkZPLCAqUEtFWV9JTkZPOworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0RFU0NSSVBURVIKK3sKKwlVQ0hBUgkJVHlwZTsKKwlLRVlfSU5GTwlLZXlJbmZvOworCVVDSEFSCQlLZXlMZW5ndGhbMl07CisJVUNIQVIJCVJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIJCUtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIJCUtleUl2W0xFTl9LRVlfREVTQ19JVl07CisJVUNIQVIJCUtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKKwlVQ0hBUgkJS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKKwlVQ0hBUgkJS2V5TWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCQlLZXlEYXRhTGVuWzJdOworCVVDSEFSCQlLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOworfQlLRVlfREVTQ1JJUFRFUiwgKlBLRVlfREVTQ1JJUFRFUjsKKwordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKK3sKKwlVQ0hBUgkgCQkJUHJvVmVyOworCVVDSEFSCSAJCQlQcm9UeXBlOworCVVDSEFSCSAJCQlCb2R5X0xlblsyXTsKKwlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKK30JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKKworLy84MDIuMTFpIEQxMCBwYWdlIDgzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAoreworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7CisjZWxzZQorICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2VuZGlmCisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKK30gICBHVEtfRU5DQVAsICpQR1RLX0VOQ0FQOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAoreworICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOworICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOworfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7CisKKy8vIEZvciBXUEExCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKKyAgICBVQ0hBUiAgIG91aVs0XTsKKyAgICBVU0hPUlQgIHZlcnNpb247CisgICAgVUNIQVIgICBtY2FzdFs0XTsKKyAgICBVU0hPUlQgIHVjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH11Y2FzdFsxXTsKK30gUlNOSUUsICpQUlNOSUU7CisKKy8vIEZvciBXUEEyCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFMiwgKlBSU05JRTI7CisKKy8vIEFLTSBTdWl0ZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRV9BVVRIIHsKKyAgICBVU0hPUlQgYWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfWF1dGhbMV07Cit9IFJTTklFX0FVVEgsKlBSU05JRV9BVVRIOworCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUwl7CisJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBVU0hPUlQJCVJzdmQ6MTA7CisgICAgICAgIFVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQcmVBdXRoOjE7CisjZWxzZQorICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKKwkJVVNIT1JUCQlOb19QYWlyd2lzZToxOworCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCVJzdmQ6MTA7CisjZW5kaWYKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CVJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKKyAgICBVQ0hBUiAgIFByb1ZlcjsKKyAgICBVQ0hBUiAgIFByb1R5cGU7CisgICAgVUNIQVIgICBCb2R5X0xlblsyXTsKKyAgICBVQ0hBUiAgIGNvZGU7CisgICAgVUNIQVIgICBpZGVudGlmaWVyOworICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKK30gRUFQX0hEUiwgKlBFQVBfSERSOworCisvLyBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3CisvLyBXZSBzaW1wbGlmaWVkIGl0Cit0eXBlZGVmCWVudW0JX1dwYVN0YXRlCit7CisJU1NfTk9UVVNFLAkJCQkvLyAwCisJU1NfU1RBUlQsCQkJCS8vIDEKKwlTU19XQUlUX01TR18zLAkJCS8vIDIKKwlTU19XQUlUX0dST1VQLAkJCS8vIDMKKwlTU19GSU5JU0gsICAJCQkvLyA0CisJU1NfS0VZVVBEQVRFLAkJCS8vIDUKK30JV1BBX1NUQVRFOworCisvLworLy8JVGhlIGRlZmluaXRpb24gb2YgdGhlIGNpcGhlciBjb21iaW5hdGlvbgorLy8KKy8vIAkgYml0MwliaXQyICBiaXQxICAgYml0MAorLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisvLyAJfAkgIFdQQQkgfAkgICBXUEEyICAgfAorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwl8IFRLSVAgfCBBRVMgfCBUS0lQIHwgQUVTIHwKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNgorLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMSAgfCAtPiAweDA3CisvLwl8CTEgIHwgIDAgIHwgICAwICB8ICAxICB8IC0+IDB4MDkKKy8vCXwJMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQgorLy8JfAkxICB8ICAxICB8ICAgMCAgfCAgMSAgfCAtPiAweDBECisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MEUKKy8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwJLT4gMHgwRgorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwordHlwZWRlZgllbnVtCV9XcGFNaXhQYWlyQ2lwaGVyCit7CisJTUlYX0NJUEhFUl9OT1RVU0UgCQkJPSAweDAwLAorCVdQQV9OT05FX1dQQTJfVEtJUEFFUwkJPSAweDAzLAkJLy8gV1BBMi1US0lQQUVTCisJV1BBX0FFU19XUEEyX1RLSVAgCQkJPSAweDA2LAorCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCisJV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCisJV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCisJV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUworCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKK30JV1BBX01JWF9QQUlSX0NJUEhFUjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7CisJVUNIQVIJCUVpZDsKKwlVQ0hBUgkJTGVuZ3RoOworCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKK30JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7CisKKy8vIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSVBIRVJfU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlDSVBIRVJfU1VJVEVfU1RSVUNULCAqUENJUEhFUl9TVUlURV9TVFJVQ1Q7CisKKy8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7CisKKy8vIFJTTiBjYXBhYmlsaXR5Cit0eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKKwlVU0hPUlQJCVJzdjoxMDsKKwlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7CisJVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJTm9QYWlyd2lzZToxOworCVVTSE9SVAkJUHJlQXV0aDoxOworfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZGE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDE2MTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF9tYWluLmMKKworICAgIEFic3RyYWN0OgorICAgIG1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5hbWUgICAgICAgIERhdGUgICAgICAgICAgICBNb2RpZmljYXRpb24gbG9ncworICAgIEphbiBMZWUJCTAxLTEwLTIwMDUJICAgIG1vZGlmaWVkCisJU2FtcGxlCQlKdW4vMDEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKworLy8gRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nCisvLyAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4KKy8vIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKioKK01PRFVMRV9BVVRIT1IoIlBhdWwgTGluIDxwYXVsX2xpbkByYWxpbmt0ZWNoLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlQyODcwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBNT0RVTEVfVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorZXh0ZXJuIFVJTlQ4ICBNQ19DYXJkVXNlZFtdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisvKiBLZXJuZWwgdGhyZWFkIGFuZCB2YXJzLCB3aGljaCBoYW5kbGVzIHBhY2tldHMgdGhhdCBhcmUgY29tcGxldGVkLiBPbmx5CisgKiBwYWNrZXRzIHRoYXQgaGF2ZSBhICJjb21wbGV0ZSIgZnVuY3Rpb24gYXJlIHNlbnQgaGVyZS4gVGhpcyB3YXksIHRoZQorICogY29tcGxldGlvbiBpcyBydW4gb3V0IG9mIGtlcm5lbCBjb250ZXh0LCBhbmQgZG9lc24ndCBibG9jayB0aGUgcmVzdCBvZgorICogdGhlIHN0YWNrLiAqLworCitleHRlcm4gSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCisJCQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKworCisvKiBtb2R1bGUgdGFibGUgKi8KK3N0cnVjdCB1c2JfZGV2aWNlX2lkICAgIHJ0dXNiX3VzYl9pZFtdID0gUlQyODcwX1VTQl9ERVZJQ0VTOworSU5UIGNvbnN0ICAgICAgICAgICAgICAgcnR1c2JfdXNiX2lkX2xlbiA9IHNpemVvZihydHVzYl91c2JfaWQpIC8gc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydHVzYl91c2JfaWQpOworCisjaWZuZGVmIFBGX05PRlJFRVpFCisjZGVmaW5lIFBGX05PRlJFRVpFICAwCisjZW5kaWYKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vdGVzdGVkIGZvciBrZXJuZWwgMi40IHNlcmllcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKnJ0dXNiX3Byb2JlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFVJTlQgaW50ZXJmYWNlLAorCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKTsKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKTsKKworc3RydWN0IHVzYl9kcml2ZXIgcnR1c2JfZHJpdmVyID0geworCQluYW1lOiJydDI4NzAiLAorCQlwcm9iZTpydHVzYl9wcm9iZSwKKwkJZGlzY29ubmVjdDpydHVzYl9kaXNjb25uZWN0LAorCQlpZF90YWJsZTpydHVzYl91c2JfaWQsCisJfTsKKworI2Vsc2UKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDI4NzBfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisjZW5kaWYgLy8gQ09ORklHX1BNIC8vCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vdGVzdGVkIGZvciBrZXJuZWwgMi42c2VyaWVzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJ0dXNiX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworc3RydWN0IHVzYl9kcml2ZXIgcnR1c2JfZHJpdmVyID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKyNlbmRpZgorCS5uYW1lPSJydDI4NzAiLAorCS5wcm9iZT1ydHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdD1ydHVzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZT1ydHVzYl91c2JfaWQsCisKKyNpZmRlZiBDT05GSUdfUE0KKwlzdXNwZW5kOglydDI4NzBfc3VzcGVuZCwKKwlyZXN1bWU6CQlydDI4NzBfcmVzdW1lLAorI2VuZGlmCisJfTsKKworI2lmZGVmIENPTkZJR19QTQorCitWT0lEIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vIGNsZWFyIFBTIHBhY2tldHMKKwkvLyBjbGVhciBUeFN3IHBhY2tldHMKK30KKworc3RhdGljIGludCBydDI4NzBfc3VzcGVuZCgKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwlwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg3MF9zdXNwZW5kKClcbiIpKTsKKwluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OworCW5ldGlmX2RldmljZV9kZXRhY2ggKG5ldF9kZXYpOworCisJcEFkLT5QTV9GbGdTdXNwZW5kID0gMTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRfZGV2KSkgeworCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg3MF9zdXNwZW5kKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDI4NzBfcmVzdW1lKAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfcmVzdW1lKClcbiIpKTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDA7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfYXR0YWNoIChuZXRfZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg3MF9yZXN1bWUoKVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIENPTkZJR19QTSAvLworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKKy8vIEluaXQgZHJpdmVyIG1vZHVsZQorSU5UIF9faW5pdCBydHVzYl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJydHVzYiBpbml0IC0tLT5cbiIpOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7Cit9CisKKy8vIERlaW5pdCBkcml2ZXIgbW9kdWxlCitWT0lEIF9fZXhpdCBydHVzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7CisJcHJpbnRrKCI8LS0tIHJ0dXNiIGV4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChydHVzYl9pbml0KTsKK21vZHVsZV9leGl0KHJ0dXNiX2V4aXQpOworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zCQkJCQkJCQkJCQkJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUxNRSBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgTWxtZVRocmVhZCgKKwlJTiB2b2lkICpDb250ZXh0KQoreworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpQ29udGV4dDsKKwlQT1NfQ09PS0lFCXBPYmo7CisJaW50IHN0YXR1czsKKworCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3ME1sbWVUaHJlYWQiLCAoUFZPSUQpJihwQWQtPm1sbWVDb21wbGV0ZSkpOworCisJd2hpbGUgKHBBZC0+bWxtZV9raWxsID09IDApCisJeworCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy9kb3duKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOworCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7CisKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCovCisJCS8vZG93bigmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQlNbG1lSGFuZGxlcihwQWQpOworCisJCS8qIHVubG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vdXAoJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19GVU5DVElPTl9fKSk7CisKKwlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5tbG1lQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBVU0IgY29tbWFuZCBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRVU0JDbWRUaHJlYWQoCisJSU4gdm9pZCAqIENvbnRleHQpCit7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCVBPU19DT09LSUUJCXBPYmo7CisJaW50IHN0YXR1czsKKworCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3MENtZFRocmVhZCIsIChQVk9JRCkmKHBBZC0+Q21kUUNvbXBsZXRlKSk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9SVU5OSU5HOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJd2hpbGUgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9SVU5OSU5HKQorCXsKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vZG93bigmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisJCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9TVE9QRUQpCisJCQlicmVhazsKKworCQlpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCovCisJCS8vZG93bigmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQlDTURIYW5kbGVyKHBBZCk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCX0KKworCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCXsJLy8gQ2xlYXIgdGhlIENtZFFFbGVtZW50cy4KKwkJQ21kUUVsbXQJKnBDbWRRRWxtdCA9IE5VTEw7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJd2hpbGUocEFkLT5DbWRRLnNpemUpCisJCXsKKwkJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmcENtZFFFbG10KTsKKwkJCWlmIChwQ21kUUVsbXQpCisJCQl7CisJCQkJaWYgKHBDbWRRRWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKworCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpICYmIChwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdC0+YnVmZmVyLCBwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCSAgICAgICAgICAgIHsKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwl9CisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tUlRVU0JDbWRUaHJlYWRcbiIpKTsKKworCXBPYmotPlJUVVNCQ21kVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5DbWRRQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworc3RhdGljIHZvaWQgUlQyODcwX1RpbWVyUV9IYW5kbGUoUlRNUF9BREFQVEVSICpwQWQpCit7CisJaW50IHN0YXR1czsKKwlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7CisJUlQyODcwX1RJTUVSX0VOVFJZCSpwRW50cnk7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisJd2hpbGUoIXBBZC0+VGltZXJGdW5jX2tpbGwpCisJeworLy8JCXByaW50aygid2FpdGluZyBmb3IgZXZlbnQhXG4iKTsKKwkJcFRpbWVyID0gTlVMTDsKKworCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKKwkJCWJyZWFrOworCisJCS8vIGV2ZW50IGhhcHBlbmVkLgorCQl3aGlsZShwQWQtPlRpbWVyUS5wUUhlYWQpCisJCXsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7CisJCQlwRW50cnkgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCQlpZiAocEVudHJ5KQorCQkJeworCQkJCXBUaW1lciA9IHBFbnRyeS0+cFJhVGltZXI7CisKKwkJCQkvLyB1cGRhdGUgcFFIZWFkCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcEVudHJ5LT5wTmV4dDsKKwkJCQlpZiAocEVudHJ5ID09IHBBZC0+VGltZXJRLnBRVGFpbCkKKwkJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKworCQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJCXBFbnRyeS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKworCQkJaWYgKHBUaW1lcikKKwkJCXsKKwkJCQlpZiAocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkKKwkJCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsKKwkJCQlpZiAoKHBUaW1lci0+UmVwZWF0KSAmJiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkpCisJCQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworSU5UIFRpbWVyUVRocmVhZCgKKwlJTiBPVVQgUFZPSUQgQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFCXBPYmo7CisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBUaW1lclFIYW5kbGUiLCAoUFZPSUQpJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7CisKKwlSVDI4NzBfVGltZXJRX0hhbmRsZShwQWQpOworCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19GVU5DVElPTl9fKSk7CisKKwlwT2JqLT5UaW1lclFUaHJfcGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJY29tcGxldGVfYW5kX2V4aXQoJnBBZC0+VGltZXJRQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCit7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUgPSBOVUxMLCAqcFFUYWlsOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCisJeworCQlpZihwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCkKKwkJeworCQkJcFFOb2RlID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBRTm9kZS0+cE5leHQ7CisKKwkJCXBRTm9kZS0+cFJhVGltZXIgPSBwVGltZXI7CisJCQlwUU5vZGUtPnBOZXh0ID0gTlVMTDsKKworCQkJcFFUYWlsID0gcEFkLT5UaW1lclEucFFUYWlsOworCQkJaWYgKHBBZC0+VGltZXJRLnBRVGFpbCAhPSBOVUxMKQorCQkJCXBRVGFpbC0+cE5leHQgPSBwUU5vZGU7CisJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBwUU5vZGU7CisJCQlpZiAocEFkLT5UaW1lclEucFFIZWFkID09IE5VTEwpCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcFFOb2RlOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKKwkJaWYgKHBRTm9kZSkKKwkJCXVwKCZwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKTsKKwkJCS8vd2FrZV91cCgmdGltZXJXYWl0USk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJfQorCXJldHVybiBwUU5vZGU7Cit9CisKKworQk9PTEVBTiBSVDI4NzBfVGltZXJRX1JlbW92ZSgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCit7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycUZsYWdzOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVDI4NzBfVEhSRUFEX0lOSVRFRCkKKwl7CisJCXBOb2RlID0gcEFkLT5UaW1lclEucFFIZWFkOworCQl3aGlsZSAocE5vZGUpCisJCXsKKwkJCWlmIChwTm9kZS0+cFJhVGltZXIgPT0gcFRpbWVyKQorCQkJCWJyZWFrOworCQkJcFByZXYgPSBwTm9kZTsKKwkJCXBOb2RlID0gcE5vZGUtPnBOZXh0OworCQl9CisKKwkJLy8gTm93IG1vdmUgaXQgdG8gZnJlZUxpc3QgcXVldWUuCisJCWlmIChwTm9kZSkKKwkJeworCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRSGVhZCkKKwkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwTm9kZS0+cE5leHQ7CisJCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFUYWlsKQorCQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBQcmV2OworCQkJaWYgKHBQcmV2ICE9IE5VTEwpCisJCQkJcFByZXYtPnBOZXh0ID0gcE5vZGUtPnBOZXh0OworCisJCQkvLyByZXR1cm4gdGhpcyBxdWV1ZSBlbnRyeSB0byB0aW1lclFGcmVlTGlzdC4KKwkJCXBOb2RlLT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OworCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwTm9kZTsKKwkJfQorCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKwordm9pZCBSVDI4NzBfVGltZXJRX0V4aXQoUlRNUF9BREFQVEVSICpwQWQpCit7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwVGltZXJROworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQorCXsKKwkJcFRpbWVyUSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKKwkJcEFkLT5UaW1lclEucFFIZWFkID0gcFRpbWVyUS0+cE5leHQ7CisJCS8vIHJlbW92ZSB0aGUgdGltZVEKKwl9CisJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOworCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisJcEFkLT5UaW1lclEucFFIZWFkID0gTlVMTDsKKwlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCit9CisKKwordm9pZCBSVDI4NzBfVGltZXJRX0luaXQoUlRNUF9BREFQVEVSICpwQWQpCit7CisJaW50IAlpOworCVJUMjg3MF9USU1FUl9FTlRSWSAqcFFOb2RlLCAqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UaW1lclFMb2NrKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlRpbWVyUSwgc2l6ZW9mKHBBZC0+VGltZXJRKSk7CisJLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlRpbWVyUS5jb3VudCwgMCk7CisKKwkvKiBJbml0aWFsaXNlIHRoZSB3YWl0IHEgaGVhZCAqLworCS8vaW5pdF93YWl0cXVldWVfaGVhZCgmdGltZXJXYWl0USk7CisKKwlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsIHNpemVvZihSVDI4NzBfVElNRVJfRU5UUlkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOworCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkKKwl7CisJCXBFbnRyeSA9IE5VTEw7CisJCXBRTm9kZSA9IChSVDI4NzBfVElNRVJfRU5UUlkgKilwQWQtPlRpbWVyUS5wVGltZXJRUG9sbDsKKwkJZm9yIChpID0gMCA7aSA8VElNRVJfUVVFVUVfU0laRV9NQVg7IGkrKykKKwkJeworCQkJcFFOb2RlLT5wTmV4dCA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBRTm9kZTsKKwkJCXBRTm9kZSsrOworCQl9CisJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OworCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOworCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOworCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKK30KKworCitWT0lEIFJUMjg3MF9XYXRjaERvZyhJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCWludCAJCQkJCWlkeDsKKwlVTE9ORwkJCQlpcnFGbGFnczsKKwlQVVJCCQkgICAJCXBVcmI7CisJQk9PTEVBTgkJCQluZWVkRHVtcFNlcSA9IEZBTFNFOworCVVJTlQzMiAgICAgICAgICAJTUFDVmFsdWU7CisKKworCWlkeCA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCWlmICgoTUFDVmFsdWUgJiAweGZmKSAhPTAgKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVFggUVVFVUUgMCBOb3QgRU1QVFkoVmFsdWU9MHglMHgpLiAhISEhISEhISEhISEhISFcbiIsIE1BQ1ZhbHVlKSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDEyKTsKKwkJd2hpbGUoKE1BQ1ZhbHVlICYweGZmKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKKwkJeworCQkgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwkJICAgICAgICBOZGlzTVNsZWVwKDEpOworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDA2KTsKKwl9CisKKwlpZHggPSAwOworCWlmICgoTUFDVmFsdWUgJiAweGZmMDApICE9MCApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAxIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMGEpOworCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYwMCkgIT0gMCAmJiAoaWR4KysgPCAxMCkpCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwkJCU5kaXNNU2xlZXAoMSk7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOworCX0KKworCisJaWYgKHBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID49IDIpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXliZSB0aGUgUnggQnVsay1JbiBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBSeCBidWxrcyByZXF1ZXN0IVxuIikpOworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbGwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gdG8gY2FuY2VsIHRoZSBwZW5kaW5nIFJ4IEJ1bGshXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7CisJCQluZWVkRHVtcFNlcSA9IFRSVUU7CisJCX0KKwkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOworCX0KKworCisJZm9yIChpZHggPSAwOyBpZHggPCBOVU1fT0ZfVFhfUklORzsgaWR4KyspCisJeworCQlwVXJiID0gTlVMTDsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKKwkJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW2lkeF0gPT0gVFJVRSkgJiYgcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudCkKKwkJeworCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdKys7CisKKwkJCWlmICgocEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdID4gMikgJiYKKwkJCQkgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCQkJKQorCQkJeworCQkJCS8vIEZJWE1FOiBGb2xsb3dpbmcgY29kZSBqdXN0IHN1cHBvcnQgc2luZ2xlIGJ1bGsgb3V0LiBJZiB5b3Ugd2FubmEgc3VwcG9ydCBtdWx0aXBsZSBidWxrIG91dC4gTW9kaWZ5IGl0IQorCQkJCXBIVFRYQ29udGV4dCA9IChQSFRfVFhfQ09OVEVYVCkoJnBBZC0+VHhDb250ZXh0W2lkeF0pOworCQkJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJewkvLyBDaGVjayBUeENvbnRleHQuCisJCQkJCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7CisJCQkJfQorCQkJCWVsc2UgaWYgKGlkeCA9PSBNR01UUElQRUlEWCkKKwkJCQl7CisJCQkJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCwgcE5VTExDb250ZXh0LCBwUHNQb2xsQ29udGV4dDsKKworCQkJCQkvL0NoZWNrIE1nbXRDb250ZXh0LgorCQkJCQlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpKHBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhKTsKKwkJCQkJcFBzUG9sbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPlBzUG9sbENvbnRleHQpOworCQkJCQlwTlVMTENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPk51bGxDb250ZXh0KTsKKworCQkJCQlpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQl7CisJCQkJCQlBU1NFUlQocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQl7CisJCQkJCQlBU1NFUlQocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwTlVMTENvbnRleHQtPnBVcmI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyk7CisJCQkJCQlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWF5YmUgdGhlIFR4IEJ1bGstT3V0IGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFR4IGJ1bGtzIHJlcXVlc3Qgb2YgaWR4KCVkKSFcbiIsIGlkeCkpOworCQkJCWlmIChwVXJiKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5saW5rIHRoZSBwZW5kaW5nIFVSQiFcbiIpKTsKKwkJCQkJLy8gdW5saW5rIGl0IG5vdworCQkJCQlSVFVTQl9VTkxJTktfVVJCKHBVcmIpOworCQkJCQkvLyBTbGVlcCAyMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yaworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCQkJCW5lZWREdW1wU2VxID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVW5rb253IGJ1bGtPdXQgVVJCIG1heWJlIGhhbmdlZCEhISEhISEhISEhIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKKwkJfQorCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEZvciBTaWdtYSBkZWJ1ZywgZHVtcCB0aGUgYmFfcmVvcmRlcmluZyBzZXF1ZW5jZS4KKwlpZigobmVlZER1bXBTZXEgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCVVTSE9SVAkJCQlJZHg7CisJCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwkJVUNIQVIJCQkJY291bnQgPSAwOworCQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkJBUmVjV2NpZEFycmF5WzBdOworCisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCWlmKChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgIT0gTlVMTCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5JQ1VwZGF0ZVJhd0NvdW50ZXJzKCk6VGhlIFF1ZXVlaW5nIHBrdCBpbiByZW9yZGVyaW5nIGJ1ZmZlcjpcbiIpKTsKKwkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCQkJbXBkdV9ibGsgPSBwQkFFbnRyeS0+bGlzdC5uZXh0OworCQkJd2hpbGUgKG1wZHVfYmxrKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0JWQ6U2VxLSVkLCBiQU1TRFUtJWQhXG4iLCBjb3VudCwgbXBkdV9ibGstPlNlcXVlbmNlLCBtcGR1X2Jsay0+YkFNU0RVKSk7CisJCQkJbXBkdV9ibGsgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQljb3VudCsrOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbnBCQUVudHJ5LT5MYXN0SW5kU2VxPSVkIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFJlbGVhc2UgYWxsb2NhdGVkIHJlc291cmNlcy4KKworQXJndW1lbnRzOgorICAgICpkZXYJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJcEFkCQkJCQlkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCBfcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiA9IE5VTEw7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHVucmVnaXN0ZXIgdXNibmV0IHVzYi0lcy0lc1xuIiwKKwkJCQlkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+ZGV2cGF0aCkpOworCWlmICghcEFkKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKChwQWQtPk1DX1Jvd0lEID49IDApICYmIChwQWQtPk1DX1Jvd0lEIDw9IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQlNQ19DYXJkVXNlZFtwQWQtPk1DX1Jvd0lEXSA9IDA7IC8vIG5vdCBjbGVhciBNQUMgYWRkcmVzcworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJCXdoaWxlKE1PRF9JTl9VU0UgPiAwKQorCQl7CisJCQlNT0RfREVDX1VTRV9DT1VOVDsKKwkJfQorI2Vsc2UKKwkJdXNiX3B1dF9kZXYoZGV2KTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHBBZCA9PSBOVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CisKKworCisJLy8gZm9yIGRlYnVnLCB3YWl0IHRvIHNob3cgc29tZSBtZXNzYWdlcyB0byAvcHJvYyBzeXN0ZW0KKwl1ZGVsYXkoMSk7CisKKworCisKKwluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OworCWlmIChwQWQtPm5ldF9kZXYgIT0gTlVMTCkKKwl7CisJCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogdW5yZWdpc3Rlcl9uZXRkZXYoKSwgZGV2LT5uYW1lPSVzIVxuIiwgbmV0X2Rldi0+bmFtZSk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2IChwQWQtPm5ldF9kZXYpOworCX0KKwl1ZGVsYXkoMSk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisjZWxzZQorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisJdWRlbGF5KDEpOworCisJLy8gZnJlZSBuZXRfZGV2aWNlIG1lbW9yeQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQkvKiBrZXJuZWwgMi40IHNlcmllcyAqLworCWtmcmVlKG5ldF9kZXYpOworI2Vsc2UKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCS8vIGZyZWUgYWRhcHRlciBtZW1vcnkKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworCS8vIHJlbGVhc2UgYSB1c2Ugb2YgdGhlIHVzYiBkZXZpY2Ugc3RydWN0dXJlCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJd2hpbGUoTU9EX0lOX1VTRSA+IDApCisJeworCQlNT0RfREVDX1VTRV9DT1VOVDsKKwl9CisjZWxzZQorCXVzYl9wdXRfZGV2KGRldik7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisJdWRlbGF5KDEpOworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIFJUVVNCIGRpc2Nvbm5lY3Qgc3VjY2Vzc2Z1bGx5XG4iKSk7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KKworQXJndW1lbnRzOgorICAgICpkZXYJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJaW50ZXJmYWNlCisJKmlkX3RhYmxlCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlIElECisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCitzdGF0aWMgdm9pZCAqcnR1c2JfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgVUlOVCBpbnRlcmZhY2UsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJcnQyOHh4X3Byb2JlKCh2b2lkICopZGV2LCAodm9pZCAqKWlkLCBpbnRlcmZhY2UsICZwQWQpOworCXJldHVybiAodm9pZCAqKXBBZDsKK30KKworLy9EaXNjb25uZWN0IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoaW4gZXhpdCByb3V0aW5lCitzdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKnB0cikKK3sKKwlfcnR1c2JfZGlzY29ubmVjdChkZXYsICgoUFJUTVBfQURBUFRFUilwdHIpKTsKK30KKworI2Vsc2UJLyoga2VybmVsIDIuNiBzZXJpZXMgKi8KK3N0YXRpYyBpbnQgcnR1c2JfcHJvYmUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCVBSVE1QX0FEQVBURVIgcEFkOworCXJldHVybiAoaW50KXJ0Mjh4eF9wcm9iZSgodm9pZCAqKWludGYsICh2b2lkICopaWQsIDAsICZwQWQpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgICAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlQUlRNUF9BREFQVEVSICAgICAgIHBBZDsKKworCisJcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJX3J0dXNiX2Rpc2Nvbm5lY3QoZGV2LCBwQWQpOworfQorI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2Uga2VybmVsIHRocmVhZHMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5PTkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOHh4VGhyZWFkVGVybWluYXRlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCVBPU19DT09LSUUJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlJTlQJCQlyZXQ7CisKKworCS8vIFNsZWVwIDUwIG1pbGxpc2Vjb25kcyBzbyBwZW5kaW5nIGlvIG1pZ2h0IGZpbmlzaCBub3JtYWxseQorCVJUTVB1c2VjRGVsYXkoNTAwMDApOworCisJLy8gV2Ugd2FudCB0byB3YWl0IHVudGlsIGFsbCBwZW5kaW5nIHJlY2VpdmVzIGFuZCBzZW5kcyB0byB0aGUKKwkvLyBkZXZpY2Ugb2JqZWN0LiBXZSBjYW5jZWwgYW55CisJLy8gaXJwcy4gV2FpdCB1bnRpbCBzZW5kcyBhbmQgcmVjZWl2ZXMgaGF2ZSBzdG9wcGVkLgorCVJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMocEFkKTsKKworCS8vIFRlcm1pbmF0ZSBUaHJlYWRzCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPlRpbWVyUVRocl9waWQpCisJeworCQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgVGltZXJRVGhyX3BpZD0lZCFcbiIsIEdFVF9QSURfTlVNQkVSKHBPYmotPlRpbWVyUVRocl9waWQpKTsKKwkJbWIoKTsKKwkJcEFkLT5UaW1lckZ1bmNfa2lsbCA9IDE7CisJCW1iKCk7CisJCXJldCA9IEtJTExfVEhSRUFEX1BJRChwT2JqLT5UaW1lclFUaHJfcGlkLCBTSUdURVJNLCAxKTsKKwkJaWYgKHJldCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdG9wIFRpbWVyUVRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAorCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIEdFVF9QSURfTlVNQkVSKHBPYmotPlRpbWVyUVRocl9waWQpLCByZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcEFkLT5UaW1lclFDb21wbGV0ZSk7CisJCQlwT2JqLT5UaW1lclFUaHJfcGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCQl9CisJfQorCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPk1MTUVUaHJfcGlkKQorCXsKKwkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIE1MTUVUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+TUxNRVRocl9waWQpKTsKKwkJbWIoKTsKKwkJcEFkLT5tbG1lX2tpbGwgPSAxOworCQkvL1JUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJbWIoKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPk1MTUVUaHJfcGlkLCBTSUdURVJNLCAxKTsKKwkJaWYgKHJldCkKKwkJeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gTWxtZSB0aHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKKwkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBHRVRfUElEX05VTUJFUihwT2JqLT5NTE1FVGhyX3BpZCksIHJldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL3dhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm5vdGlmeSk7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5tbG1lQ29tcGxldGUpOworCQkJcE9iai0+TUxNRVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJCX0KKwl9CisKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+UlRVU0JDbWRUaHJfcGlkKQorCXsKKwkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIFJUVVNCQ21kVGhyX3BpZD0lZCFcbiIsIEdFVF9QSURfTlVNQkVSKHBPYmotPlJUVVNCQ21kVGhyX3BpZCkpOworCQltYigpOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJbWIoKTsKKwkJLy9SVFVTQkNNRFVwKHBBZCk7CisJCXJldCA9IEtJTExfVEhSRUFEX1BJRChwT2JqLT5SVFVTQkNtZFRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIFJUVVNCQ21kIHRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAorCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIEdFVF9QSURfTlVNQkVSKHBPYmotPlJUVVNCQ21kVGhyX3BpZCksIHJldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvL3dhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm5vdGlmeSk7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5DbWRRQ29tcGxldGUpOworCQkJcE9iai0+UlRVU0JDbWRUaHJfcGlkID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCX0KKwl9CisKKworCS8vIEtpbGwgdGFza2xldHMKKwlwQWQtPm1sbWVfa2lsbCA9IDA7CisJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfVU5LTk9XTjsKKwlwQWQtPlRpbWVyRnVuY19raWxsID0gMDsKK30KKworCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+dGJ0dF90YXNrKTsKKworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNoZWNrIG9rCisJRkFMU0UJCQkJQ2hlY2sgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCisJSU4gdm9pZCAqX2Rldl9wKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQkvKiBrZXJuZWwgMi40IHNlcmllcyAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKV9kZXZfcDsKKyNlbHNlCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwlVSU5UMzIgaTsKKworCisJZm9yKGk9MDsgaTxydHVzYl91c2JfaWRfbGVuOyBpKyspCisJeworCQlpZiAoZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IgPT0gcnR1c2JfdXNiX2lkW2ldLmlkVmVuZG9yICYmCisJCQlkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gcnR1c2JfdXNiX2lkW2ldLmlkUHJvZHVjdCkKKwkJeworCQkJcHJpbnRrKCJydDI4NzA6IGlkVmVuZG9yID0gMHgleCwgaWRQcm9kdWN0ID0gMHgleFxuIiwKKwkJCQkJZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHJ0dXNiX3VzYl9pZF9sZW4pCisJeworCQlwcmludGsoInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorICAgICpuZXRfZGV2CQkJUG9pbnQgdG8gdGhlIG5ldCBkZXZpY2UKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJSW5pdCBvaworCUZBTFNFCQkJCUluaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gKHN0cnVjdCB1c2JfZGV2aWNlICopX2Rldl9wOworI2Vsc2UKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlwQWQtPmNvbmZpZyA9IGRldl9wLT5jb25maWc7CisjZWxzZQorCXBBZC0+Y29uZmlnID0gJmRldl9wLT5jb25maWctPmRlc2M7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDb25maWcgb2sKKwlGQUxTRQkJCQlDb25maWcgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCVVMT05HIEJ1bGtPdXRJZHg7CisJVUlOVDMyIGk7CisKKworCS8qIGdldCB0aGUgYWN0aXZlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCisJaW50ZiA9ICZkZXZfcC0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaW50ZXJmYWNlXTsKKwlpZmFjZV9kZXNjID0gJmludGYtPmFsdHNldHRpbmdbMF07CisKKwkvKiBnZXQgIyBvZiBlbnBvaW50cyAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5iTnVtRW5kcG9pbnRzKSk7CisKKwkvKiBDb25maWd1cmUgUGlwZXMgKi8KKwllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFswXTsKKwlCdWxrT3V0SWR4ID0gMDsKKworCWZvcihpPTA7IGk8cEFkLT5OdW1iZXJPZlBpcGVzOyBpKyspCisJeworCQlpZiAoKGVuZHBvaW50W2ldLmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJKChlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKSkKKwkJeworCQkJcEFkLT5CdWxrSW5FcEFkZHIgPSBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0gZW5kcG9pbnRbaV0ud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgSU4gTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCJFUCBhZGRyZXNzID0gMHglMnggIFxuIiwgZW5kcG9pbnRbaV0uYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJCWVsc2UgaWYgKChlbmRwb2ludFtpXS5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgJiYKKwkJCQkoKGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSkKKwkJeworCQkJLy8gVGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LgorCQkJLy8gRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLgorCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPSBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA9IGVuZHBvaW50W2ldLndNYXhQYWNrZXRTaXplOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCJCVUxLIE9VVCBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCJFUCBhZGRyZXNzID0gMHglMnggIFxuIiwgZW5kcG9pbnRbaV0uYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJfQorCisJaWYgKCEocEFkLT5CdWxrSW5FcEFkZHIgJiYgcEFkLT5CdWxrT3V0RXBBZGRyWzBdKSkKKwl7CisJCXByaW50aygiQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNlbHNlCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJVUxPTkcgQnVsa091dElkeDsKKwlVSU5UMzIgaTsKKworCisJLyogZ2V0IHRoZSBhY3RpdmUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisKKwkvKiBnZXQgIyBvZiBlbnBvaW50cyAgKi8KKwlwQWQtPk51bWJlck9mUGlwZXMgPSBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkoIk51bUVuZHBvaW50cz0lZFxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7CisKKwkvKiBDb25maWd1cmUgUGlwZXMgKi8KKwlCdWxrT3V0SWR4ID0gMDsKKworCWZvcihpPTA7IGk8cEFkLT5OdW1iZXJPZlBpcGVzOyBpKyspCisJeworCQlpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09CisJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgJiYKKwkJCSgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKKwkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKQorCQl7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJCXBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgSU4gTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCJFUCBhZGRyZXNzID0gMHglMnhcbiIsIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJCWVsc2UgaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQorCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJCSgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKKwkJCQkJVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkpCisJCXsKKwkJCS8vIHRoZXJlIGFyZSA2IGJ1bGsgb3V0IEVQLiBFUDYgaGlnaGVzdCBwcmlvcml0eS4KKwkJCS8vIEVQMS00IGlzIEVEQ0EuICBFUDUgaXMgSENDQS4KKwkJCXBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0SWR4KytdID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgT1VUIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MpKTsKKwkJfQorCX0KKworCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpCisJeworCQlwcmludGsoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCS8vIG5vIHVzZQorfQorCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVTQl9ETUFfQ0ZHX1NUUlVDCVVzYkNmZzsKKwlpbnQJCQkJCWkgPSAwOworCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8MjAwKTsKKworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlVc2JDZmcud29yZCA9IDA7CisJVXNiQ2ZnLmZpZWxkLnBoeWNsZWFyID0gMDsKKwkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCisJaWYgKHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA1MTIpCisJCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnRW4gPSAxOworCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsKKwlVc2JDZmcuZmllbGQuUnhCdWxrQWdnVE91dCA9IDB4ODA7IC8qIDIwMDYtMTAtMTggKi8KKwlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSAxOworCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CisKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIElOVAkJCQlhcGlkeCwKKwlJTiBVTE9ORwkJCUZyYW1lTGVuLAorCUlOIFVMT05HCQkJVXBkYXRlUG9zKQoreworCVBVQ0hBUiAgICAgICAgCXBCZWFjb25GcmFtZSA9IE5VTEw7CisJVUNIQVIgIAkJCSpwdHI7CisJVUlOVCAgCQkJaSwgcGFkZGluZzsKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJVUlOVDMyCQkJbG9uZ1ZhbHVlOworCUJPT0xFQU4JCQliQmNuUmVxID0gRkFMU0U7CisJVUNIQVIJCQliY25faWR4ID0gMDsKKworCisJaWYgKHBCZWFjb25GcmFtZSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uRnJhbWUgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQmVhY29uU3luYyA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQmVhY29uU3luYyBpcyBOVUxMIVxuIikpOworCQlyZXR1cm47CisJfQorCisJLy9pZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKSB8fAorCS8vCSgocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2ID09IE5VTEwpIHx8ICEocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2LT5mbGFncyAmIElGRl9VUCkpCisJLy8JKQorCWlmIChiQmNuUmVxID09IEZBTFNFKQorCXsKKwkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KKwkJLyogY2xlYXIgYWxsIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmPSAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOworCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgVFhXSV9TSVpFKTsKKwl9CisJZWxzZQorCXsKKwkJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKHB0ciwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2Jjbl9pZHhdLCAmcEFkLT5CZWFjb25UeFdJLCBUWFdJX1NJWkUpID09IEZBTFNFKQorCQl7CS8vIElmIEJlYWNvblR4V0kgY2hhbmdlZCwgd2UgbmVlZCB0byByZXdyaXRlIHRoZSBUeFdJIGZvciB0aGUgQmVhY29uIGZyYW1lcy4KKwkJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJj0gKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2Jjbl9pZHhdLCAmcEFkLT5CZWFjb25UeFdJLCBUWFdJX1NJWkUpOworCQl9CisKKwkJaWYgKChwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICYgKDEgPDwgYmNuX2lkeCkpICE9ICgxIDw8IGJjbl9pZHgpKQorCQl7CisJCQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKKwkJCXsKKwkJCQlsb25nVmFsdWUgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgbG9uZ1ZhbHVlKTsKKwkJCQlwdHIgKz0gNDsKKwkJCX0KKwkJfQorCisJCXB0ciA9IHBCZWFjb25TeW5jLT5CZWFjb25CdWZbYmNuX2lkeF07CisJCXBhZGRpbmcgPSAoRnJhbWVMZW4gJiAweDAxKTsKKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4pLCBwYWRkaW5nKTsKKwkJRnJhbWVMZW4gKz0gcGFkZGluZzsKKwkJZm9yIChpID0gMCA7IGkgPCBGcmFtZUxlbiAvKkhXX0JFQUNPTl9PRkZTRVQqLzsgaSArPSAyKQorCQl7CisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKSA9PSBGQUxTRSkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMik7CisJCQkJLy9zaG9ydFZhbHVlID0gKnB0ciArICgqKHB0cisxKTw8OCk7CisJCQkJLy9SVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgc2hvcnRWYWx1ZSk7CisJCQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOworCQkJfQorCQkJcHRyICs9MjsKKwkJCXBCZWFjb25GcmFtZSArPSAyOworCQl9CisKKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCB8PSAoMSA8PCBiY25faWR4KTsKKwl9CisKK30KKworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25TdG9wKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7CisJaW50IGksIG9mZnNldDsKKwlCT09MRUFOCUNhbmNlbGxlZCA9IFRSVUU7CisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKQorCXsKKwkJSU5UIE51bU9mQmNuOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJTnVtT2ZCY24gPSBNQVhfTUVTSF9OVU07CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQlmb3IoaT0wOyBpPE51bU9mQmNuOyBpKyspCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisKKwkJCWZvciAob2Zmc2V0PTA7IG9mZnNldDxIV19CRUFDT05fT0ZGU0VUOyBvZmZzZXQrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbaV0gKyBvZmZzZXQsIDB4MDApOworCisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKKwl9Cit9CisKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RhcnQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJaW50IGFwaWR4OworCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7CisvLwlMQVJHRV9JTlRFR0VSIAl0c2ZUaW1lLCBkZWx0YVRpbWU7CisKKwlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKQorCXsKKwkJSU5UIE51bU9mQmNuOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJTnVtT2ZCY24gPSBNQVhfTUVTSF9OVU07CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlmb3IoYXBpZHg9MDsgYXBpZHg8TnVtT2ZCY247IGFwaWR4KyspCisJCXsKKwkJCVVDSEFSIENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbiA9IDA7CisJCQlVQ0hBUiBUaW1JRUxvY2F0aW9uSW5CZWFjb24gPSAwOworCisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2FwaWR4XSwgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9IENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0gVGltSUVMb2NhdGlvbkluQmVhY29uOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYXBpZHhdLCBUWFdJX1NJWkUpOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuUmVwZWF0ID0gVFJVRTsKKworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25BZGp1c3QgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25GYWN0b3IgPSAweGZmZmZmZmZmIC8gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiA9ICgweGZmZmZmZmZmICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkpICsgMTsKKwkJcHJpbnRrKCJSVDI4NzBfQnNzQmVhY29uU3RhcnQ6QmVhY29uRmFjdG9yPSVkLCBCZWFjb25SZW1haW49JWQhXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25GYWN0b3IsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbik7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCk7CisKKwl9Cit9CisKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uSW5pdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCWludCBpOworCisJTmRpc0FsbG9jTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jLCBzaXplb2YoQkVBQ09OX1NZTkNfU1RSVUNUKSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYykKKwl7CisJCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLCBzaXplb2YoQkVBQ09OX1NZTkNfU1RSVUNUKSk7CisJCWZvcihpPTA7IGkgPCBIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCisJCS8vUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpLCBwQWQsIFRSVUUpOworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gVFJVRTsKKwl9Cit9CisKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uRXhpdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCUJPT0xFQU4JQ2FuY2VsbGVkID0gVFJVRTsKKwlpbnQgaTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYykKKwl7CisJCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCisJCWZvcihpPTA7IGk8SFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCU5kaXNGcmVlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jLCBIV19CRUFDT05fT0ZGU0VUICogSFdfQkVBQ09OX01BWF9DT1VOVCwgMCk7CisJCXBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jID0gTlVMTDsKKwl9Cit9CisKK1ZPSUQgQmVhY29uVXBkYXRlRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisJTEFSR0VfSU5URUdFUgl0c2ZUaW1lX2E7Ly8sIHRzZlRpbWVfYiwgZGVsdGFUaW1lX2V4cCwgZGVsdGFUaW1lX2FiOworCVVJTlQzMgkJCWRlbHRhLCByZW1haW4sIHJlbWFpbl9sb3csIHJlbWFpbl9oaWdoOworLy8JQk9PTEVBTgkJCXBvc2l0aXZlOworCisJUmVTeW5jQmVhY29uVGltZShwQWQpOworCisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFNGX1RJTUVSX0RXMCwgJnRzZlRpbWVfYS51Lkxvd1BhcnQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFNGX1RJTUVSX0RXMSwgJnRzZlRpbWVfYS51LkhpZ2hQYXJ0KTsKKworCisJLy9wb3NpdGl2ZT1nZXREZWx0YVRpbWUodHNmVGltZV9hLCBleHBlY3RlZFRpbWUsICZkZWx0YVRpbWVfZXhwKTsKKwlyZW1haW5faGlnaCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblJlbWFpbiAqIHRzZlRpbWVfYS51LkhpZ2hQYXJ0OworCXJlbWFpbl9sb3cgPSB0c2ZUaW1lX2EudS5Mb3dQYXJ0ICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJcmVtYWluID0gKHJlbWFpbl9oaWdoICsgcmVtYWluX2xvdyklKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJZGVsdGEgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKSAtIHJlbWFpbjsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlRpbWVyVmFsdWUgPSAoZGVsdGEgPj4gMTApICsgMTA7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOThkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgUlQyODcwCisJdHJpc3RhdGUgIlJhbGluayAyODcwIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgWDg2ICYmIFdMQU5fODAyMTEKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgMjg3MCB3aXJlbGVzcyBjaGlwLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTAxNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACitvYmotJChDT05GSUdfUlQyODcwKQkrPSBydDI4NzBzdGEubworCisjIFRPRE86IGFsbCBvZiB0aGVzZSBzaG91bGQgYmUgcmVtb3ZlZAorRVhUUkFfQ0ZMQUdTICs9IC1ETElOVVggLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EUlQyODcwCitFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfU1RBX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRERCRworRVhUUkFfQ0ZMQUdTICs9IC1ERE9UMTFfTl9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLUROQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCitydDI4NzBzdGEtb2JqcyA6PQkJXAorCWNvbW1vbi9tZDUubwkJXAorCWNvbW1vbi9tbG1lLm8JCVwKKwljb21tb24vcnRtcF93ZXAubwlcCisJY29tbW9uL2FjdGlvbi5vCQlcCisJY29tbW9uL2NtbV9kYXRhLm8JXAorCWNvbW1vbi9ydG1wX2luaXQubwlcCisJY29tbW9uL3J0bXBfdGtpcC5vCVwKKwljb21tb24vY21tX3N5bmMubwlcCisJY29tbW9uL2VlcHJvbS5vCQlcCisJY29tbW9uL2NtbV9zYW5pdHkubwlcCisJY29tbW9uL2NtbV9pbmZvLm8JXAorCWNvbW1vbi9jbW1fd3BhLm8JXAorCWNvbW1vbi9kZnMubwkJXAorCWNvbW1vbi9zcGVjdHJ1bS5vCVwKKwlzdGEvYXNzb2MubwkJXAorCXN0YS9haXJvbmV0Lm8JCVwKKwlzdGEvYXV0aC5vCQlcCisJc3RhL2F1dGhfcnNwLm8JCVwKKwlzdGEvc3luYy5vCQlcCisJc3RhL3Nhbml0eS5vCQlcCisJc3RhL3J0bXBfZGF0YS5vCQlcCisJc3RhL2Nvbm5lY3QubwkJXAorCXN0YS93cGEubwkJXAorCXJ0X2xpbnV4Lm8JCVwKKwlydF9wcm9maWxlLm8JCVwKKwlydF9tYWluX2Rldi5vCQlcCisJc3RhX2lvY3RsLm8JCVwKKwljb21tb24vYmFfYWN0aW9uLm8JXAorCTI4NzBfbWFpbl9kZXYubwkJXAorCWNvbW1vbi8yODcwX3J0bXBfaW5pdC5vCVwKKwljb21tb24vcnR1c2JfaW8ubwlcCisJY29tbW9uL3J0dXNiX2J1bGsubwlcCisJY29tbW9uL3J0dXNiX2RhdGEubwlcCisJY29tbW9uL2NtbV9kYXRhXzI4NzAubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMWFjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvVE9ETwpAQCAtMCwwICsxLDEwIEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgZG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcwora2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkgd2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYWlyb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Fpcm9uZXQuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FJUk9ORVRfSF9fCisjZGVmaW5lCV9fQUlST05FVF9IX18KKworLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCisjZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAorI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQorI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKKyNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCisjZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAorCisvLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKKworLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05CisjZGVmaW5lCVBIWV9GSAkJCQkJCQkxCisjZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgorI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMworI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKKyNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKKyNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2CisKKy8vIFJQSSB0YWJsZSBpbiBkQm0KKyNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3CisjZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgorI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKKyNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCisjZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NworI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKKyNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3CisjZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucworI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAorCVVTSE9SVAlEdXJhdGlvbjsKK30JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOworCisvLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0CisvLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCisvLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCit0eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQorCVVDSEFSCVJ4UG93ZXI7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUGFyZW50VFNGWzRdOworCVVDSEFSCVRhcmdldFRTRls4XTsKKwlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7CisJVVNIT1JUCUNhcGFiaWxpdHlJbmZvOworfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7CisKKy8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCit0eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglUQTsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglSU1NJOworCVVDSEFSCUNvdW50OworfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOworCisjcHJhZ21hIHBhY2soMSkKKy8vIENoYW5uZWwgTG9hZCBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglDQ0FCdXN5OworfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7CisjcHJhZ21hIHBhY2soKQorCisvLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCURlbnNpdHlbOF07Cit9CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOworCisvLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAordHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7CisJVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQorCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCisJVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCit9CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7CisKKy8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKKwlVQ0hBUglSc3ZkOjQ7CisJVUNIQVIJUmVwb3J0OjE7CisJVUNIQVIJTm90VXNlZDoxOworCVVDSEFSCUVuYWJsZToxOworCVVDSEFSCVBhcmFsbGVsOjE7Cit9CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7CisKKy8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7CisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7CisJVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCisJVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQorCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQorCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCisJVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcworCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQorfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCisJVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQorCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKK30JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCit9CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOworCisvLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KK3R5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7CisJTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKKwlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Cit9CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOworCisvLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAordHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKKwkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCisJCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKKwkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQorCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0CisJCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZworCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKKwkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOworCisjZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzU1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2FwLmgKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDA5LTA2LTIwMDIgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAxMi0yMi0yMDA0ICAgIG1vZGlmaWVkIGZvciBSVDI1NjEvMjY2MS4gbWVyZ2Ugd2l0aCBTVEEgZHJpdmVyCisqLworI2lmbmRlZiBfX0FQX0hfXworI2RlZmluZSBfX0FQX0hfXworCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBhcF9kYXRhLmMKKworQk9PTEVBTiBBUEJyaWRnZVRvV2lyZWxlc3NTdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOICBVTE9ORyAgICAgICAgICAgZnJvbXdkc2lkeCk7CisKK0JPT0xFQU4gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECUFQU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOworCitORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworCitORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOCVVDSEFSCQkJV2NpZCk7CisKK0JPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBBZGRyLAorCUlOCVVTSE9SVAkJCUFpZCwKKyAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOworCitWT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7CisKK1ZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKKworLy8gYXBfYXNzb2MuYworCitWT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNYnNzS2lja091dFN0YXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZUtpY2tPdXRTdGEoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBTdGFBZGRyLAorCUlOIFVDSEFSIFdjaWQsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisKK1VTSE9SVCBBUEJ1aWxkQXNzb2NpYXRpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisgICAgSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorICAgIElOIFVDSEFSICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorICAgIElOIFVDSEFSICAqUlNOLAorICAgIElOIFVDSEFSICAqcFJTTkxlbiwKKyAgICBJTiBCT09MRUFOIGJXbW1DYXBhYmxlLAorICAgIElOIFVMT05HICBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgSU4gRVhUX0NBUF9JTkZPX0VMRU1FTlQgRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCSBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVTSE9SVCAqcEFpZCk7CisKKy8qCitWT0lECVJUTVBBZGRDbGllbnRTZWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJQnNzSWR4LAorCUlOIFVDSEFSCQkgS2V5SWR4LAorCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUgkJIHBLZXksCisJSU4gUFVDSEFSCQkgcFR4TWljLAorCUlOIFBVQ0hBUgkJIHBSeE1pYywKKwlJTiBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisqLworCisvLyBhcF9hdXRoLmMKKwordm9pZCBBUEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQVBNbG1lRGVhdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBDbHMyZXJyQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisvLyBhcF9hdXRocnNwLmMKKworVk9JRCBBUEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAorICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUFBlZXJBdXRoQXRBdXRoUnNwSWRsZUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOICBVU0hPUlQgQWxnLAorICAgIElOICBVU0hPUlQgU2VxLAorICAgIElOICBVU0hPUlQgU3RhdHVzQ29kZSk7CisKKy8vIGFwX2Nvbm5lY3QuYworCitCT09MRUFOIEJlYWNvblRyYW5zbWl0UmVxdWlyZWQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gSU5UCQkJCWFwaWR4KTsKKworVk9JRCBBUE1ha2VCc3NCZWFjb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4KTsKKworVk9JRCAgQVBVcGRhdGVCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUFsbEJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgIEFQVXBkYXRlQWxsQmVhY29uRnJhbWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCisKKy8vIGFwX3N5bmMuYworCitWT0lEIEFQU3luY1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQVBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJQcm9iZVJlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQU2NhbkNuY2xBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBcFNpdGVTdXJ2ZXkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFN1cHBvcnRSYXRlKAorCUlOIFBVQ0hBUiBTdXBSYXRlLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gUFVDSEFSIEV4dFJhdGUsCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlPVVQgUFVDSEFSICpSYXRlcywKKwlPVVQgUFVDSEFSIFJhdGVzTGVuLAorCU9VVCBQVUNIQVIgcE1heFN1cHBvcnRSYXRlKTsKKworCitCT09MRUFOIEFwU2NhblJ1bm5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBBUE92ZXJsYXBwaW5nQlNTU2NhbigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvLyBhcF93cGEuYworCitWT0lEIEFQV3BhU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworLy8gYXBfbWxtZS5jCisKK1ZPSUQgQVBNbG1lUGVyaW9kaWNFeGVjKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOworCitWT0lEIEFQTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOworCitWT0lEIEFQTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIEFQTXNnVHlwZVN1YnN0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorICAgIE9VVCBJTlQgKk1hY2hpbmUsCisgICAgT1VUIElOVCAqTXNnVHlwZSk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKyNpZmRlZiBSVDI4NzAKK1ZPSUQgQmVhY29uVXBkYXRlRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTgkJCWJQaWdneUJhY2spOworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLyBhcC5jCisKK1ZPSUQgQVBTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBDaGFubmVsKTsKKworTkRJU19TVEFUVVMgQVBJbml0aWFsaXplKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFNodXRkb3duKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworVk9JRCBBUFN0YXJ0VXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBDbGVhbnVwUHNRdWV1ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFFVRVVFX0hFQURFUiAgIHBRdWV1ZSk7CisKK1ZPSUQgTWFjVGFibGVSZXNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBNYWNUYWJsZU1haW50ZW5hbmNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUlOVDMyIE1hY1RhYmxlQXNzb2NTdGFOdW1HZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKkFQU3NQc0lucXVpcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKyAgICBPVVQgU1NUICAgICAgICAgICAgICpTc3QsCisgICAgT1VUIFVTSE9SVCAgICAgICAgICAqQWlkLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlBzTW9kZSwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpSYXRlKTsKKworQk9PTEVBTiBBUFBzSW5kaWNhdGUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUHNtKTsKKworVk9JRCBBcExvZ0V2ZW50KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVVNIT1JUICAgICAgICAgICBFdmVudCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQVBVcGRhdGVPcGVyYXRpb25Nb2RlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBUFVwZGF0ZUNhcGFiaWxpdHlBbmRFcnBJZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gQXBDaGVja0FjY2Vzc0NvbnRyb2xMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBVcGRhdGVBY2Nlc3NDb250cm9sTGlzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcEVucXVldWVOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIFBJRCwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4LAorICAgIElOIEJPT0xFQU4gICAgICAgYlFvc051bGwsCisgICAgSU4gQk9PTEVBTiAgICAgICBiRU9TUCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIE9sZFVQKTsKKworVk9JRCBBcFNlbmRGcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFZPSUQgICAgICAgICAgIHBCdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW5ndGgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQSUQpOworCitWT0lEIEFwRW5xdWV1ZUFja0ZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCk7CisKK1VDSEFSIEFQQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBPcHRpbWFsKTsKKworLy8gYXBfc2FuaXR5LmMKKworCitCT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGlzUmVzc29jLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgY2hhciAqU3NpZCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKlJTTiwKKyAgICBPVVQgVUNIQVIgKnBSU05MZW4sCisgICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKKyNpZmRlZiBXU0NfQVBfU1VQUE9SVAorICAgIE9VVCBCT09MRUFOICpwV3NjQ2FwYWJsZSwKKyNlbmRpZiAvLyBXU0NfQVBfU1VQUE9SVCAvLworICAgIE9VVCBVTE9ORyAgKnBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgT1VUIEVYVF9DQVBfSU5GT19FTEVNRU5UCSpwRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEaXNhc3NvY1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlckRlYXV0aFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gQVBQZWVyQXV0aFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIxLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKkFsZywKKyAgICBPVVQgVVNIT1JUICpTZXEsCisgICAgT1VUIFVTSE9SVCAqU3RhdHVzLAorICAgIENIQVIgKkNobGdUZXh0KTsKKworQk9PTEVBTiBBUFBlZXJQcm9iZVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4pOworCitCT09MRUFOIEFQUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFBVQ0hBUiBwQnNzaWQsCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqU3NpZExlbiwKKyAgICBPVVQgVUNIQVIgKkJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqQmVhY29uUGVyaW9kLAorICAgIE9VVCBVQ0hBUiAqQ2hhbm5lbCwKKyAgICBPVVQgTEFSR0VfSU5URUdFUiAqVGltZXN0YW1wLAorICAgIE9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiBSYXRlW10sCisgICAgT1VUIFVDSEFSICpSYXRlTGVuLAorICAgIE9VVCBCT09MRUFOICpFeHRlbmRlZFJhdGVJZUV4aXN0LAorICAgIE9VVCBVQ0hBUiAqRXJwKTsKKworLy8gYXBfaW5mby5jCisKKworCisvLyA9PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYgIC8vIF9fQVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NobGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NobGlzdC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljaGxpc3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAorKi8KKworI2lmbmRlZiBfX0NITElTVF9IX18KKyNkZWZpbmUgX19DSExJU1RfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX2RlZi5oIgorCisKKyNkZWZpbmUgT0RPUgkJCTAKKyNkZWZpbmUgSURPUgkJCTEKKyNkZWZpbmUgQk9USAkJCTIKKworI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAorI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQorI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7CisJVUNIQVIgRmlyc3RDaGFubmVsOworCVVDSEFSIE51bU9mQ2g7CisJQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KKwlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKKwlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KK30gQ0hfREVTUCwgKlBDSF9ERVNQOworCit0eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKKwlVQ0hBUiBDb3VudFJlZ1szXTsKKwlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2CisJQ0hfREVTUCBDaERlc3BbMTBdOworfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOworCitzdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQoreworCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKKwkJCSJBRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFyZ2VudGluYQorCQkJIkFSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFydWJhCisJCQkiQVciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmFsaWEKKwkJCSJBVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyaWEKKwkJCSJBVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhaGFtYXMKKwkJCSJCUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhcmJhZG9zCisJCQkiQkIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZXJtdWRhCisJCQkiQk0iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCcmF6aWwKKwkJCSJCUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZWxnaXVtCisJCQkiQkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJ1bGdhcmlhCisJCQkiQkciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2FuYWRhCisJCQkiQ0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYXltYW4gSXNMYW5kcworCQkJIktZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbGUKKwkJCSJDTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaW5hCisJCQkiQ04iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvbG9tYmlhCisJCQkiQ08iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29zdGEgUmljYQorCQkJIkNSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3lwcnVzCisJCQkiQ1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDemVjaF9SZXB1YmxpYworCQkJIkNaIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZW5tYXJrCisJCQkiREsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKKwkJCSJETyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCisJCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRXF1YWRvcgorCQkJIkVDIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVsIFNhbHZhZG9yCisJCQkiU1YiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZpbmxhbmQKKwkJCSJGSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRnJhbmNlCisJCQkiRlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR2VybWFueQorCQkJIkRFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHcmVlY2UKKwkJCSJHUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhbQorCQkJIkdVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhdGVtYWxhCisJCQkiR1QiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSGFpdGkKKwkJCSJIVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25kdXJhcworCQkJIkhOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmcgS29uZworCQkJIkhLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEh1bmdhcnkKKwkJCSJIVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJY2VsYW5kCisJCQkiSVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZGlhCisJCQkiSU4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kb25lc2lhCisJCQkiSUQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXJlbGFuZAorCQkJIklFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXNyYWVsCisJCQkiSUwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MworCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45CisJCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEl0YWx5CisJCQkiSVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKYXBhbgorCQkJIkpQIiwKKwkJCUpBUCwKKwkJCXsKKwkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAorCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKb3JkYW4KKwkJCSJKTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExhdHZpYQorCQkJIkxWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGllY2h0ZW5zdGVpbgorCQkJIkxJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpdGh1YW5pYQorCQkJIkxUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTHV4ZW1idXJnCisJCQkiTFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWxheXNpYQorCQkJIk1ZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsdGEKKwkJCSJNVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hcm9jY28KKwkJCSJNQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNZXhpY28KKwkJCSJNWCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV0aGVybGFuZHMKKwkJCSJOTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldyBaZWFsYW5kCisJCQkiTloiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5vcndheQorCQkJIk5PIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUGVydQorCQkJIlBFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvcnR1Z2FsCisJCQkiUFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvbGFuZAorCQkJIlBMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSb21hbmlhCisJCQkiUk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJ1c3NpYQorCQkJIlJVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNhdWRpIEFyYWJpYQorCQkJIlNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybworCQkJIkNTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTaW5nYXBvcmUKKwkJCSJTRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92YWtpYQorCQkJIlNLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92ZW5pYQorCQkJIlNJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEFmcmljYQorCQkJIlpBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBLb3JlYQorCQkJIktSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3BhaW4KKwkJCSJFUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dlZGVuCisJCQkiU0UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3aXR6ZXJsYW5kCisJCQkiQ0giLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUYWl3YW4KKwkJCSJUVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVHVya2V5CisJCQkiVFIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVLCisJCQkiR0IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVrcmFpbmUKKwkJCSJVQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKKwkJCSJBRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX1N0YXRlcworCQkJIlVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFZlbmV6dWVsYQorCQkJIlZFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlZmF1bHQKKwkJCSIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCit9OworCitzdGF0aWMgaW5saW5lIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCisJSU4gUFVDSEFSIENudHJ5Q29kZSkKK3sKKwlJTlQgbG9vcCA9IDA7CisJUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCisJeworCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQorCQl7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAorCUlOIFVDSEFSIFBoeU1vZGUsCisJT1VUIFBVQ0hBUiBwQ2hUeXBlKQoreworCXN3aXRjaChQaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBVQ0hBUiBGaWxsQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9ERVNQIHBDaERlc3AsCisJSU4gVUNIQVIgT2Zmc2V0LAorCUlOIFVDSEFSIGluY3JlbWVudCkKK3sKKwlJTlQgaSwgaiwgbDsKKwlVQ0hBUiBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQorCXsKKwkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKKwkJeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwkJCWNvbnRpbnVlOworCisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKKwlJTiBVQ0hBUiBHZW9ncmFwaHkpCit7CisJSU5UIGk7CisJVUNIQVIgb2Zmc2V0ID0gMDsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKwlVQ0hBUiBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCisgICAgICAgIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworICAgICAgICB9CisJfQorfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDSF9SRUdJT04gcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEJ1ZiwKKwlPVVQJUFVMT05HIHBCdWZMZW4pCit7CisJSU5UIGk7CisJVUxPTkcgVG1wTGVuOworCVBDSF9SRUdJT04gcENoUmVnaW9uOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQorCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIFVDSEFSIERpcmVjdGlvbikKK3sKKwlDSEFSIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07CisJVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQorCXsKKwkJaWYgKENoYW5uZWwgPiAxNCkKKwkJeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKKwkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKKwkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlVQ0hBUiBFeHRDaDsKKwkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfSB3aGlsZShGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCisJCQl9CisjaWYgMAorCQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCisJCQl7CisJCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQkJaWYgKENoYW5uZWwgPD0gNCkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChDaGFubmVsID49IDgpCisJCQkJCXsKKwkJCQkJCWlmICgoQ2hhbm5lbE51bSAtIENoYW5uZWwpIDwgNCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCisJCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCQlpZiAoQ2hhbm5lbCA8PSA1KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA9PSA2KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDcpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCQlpZiAoQ2hhbm5lbCA8PSA4KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSAxMCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fU2V0Q2VuQ2goCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK3N0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KKyNlbmRpZiAvLyBfX0NITElTVF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4OWEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKQEAgLTAsMCArMSwxNzc4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCTI4NzBfcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAJMjAwNi0wOS0xNSAgICBSVDI4NjAuIENoYW5nZSBmb3IgODAyLjExbiAsIEVFUFJPTSwgTGVkLCBCQSwgSFQuCisJU2FtcGxlIExpbgkyMDA3LTA1LTMxICAgIE1lcmdlIFJUMjg2MCBhbmQgUlQyODcwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX3BzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsaXplIHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6CisJSW5pdGlhbGl6ZSBhbGwgcmVjZWl2ZSByZWxlYXRlZCBwcml2YXRlIGJ1ZmZlciwgaW5jbHVkZSB0aG9zZSBkZWZpbmUKKwlpbiBSVE1QX0FEQVBURVIgc3RydWN0dXJlIGFuZCBhbGwgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBtYWhvcgorCXdvcmsgaXMgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBlYWNoIHBhY2tldCBhbmQgY2hhaW4gYnVmZmVyIHRvCisJTkRJUyBwYWNrZXQgZGVzY3JpcHRvci4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCU5JQ0luaXRSZWN2KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWk7CisJTkRJU19TVEFUVVMJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdFJlY3ZcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8vSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5QZW5kaW5nUngsIDApOworCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCAJPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDAgOyAvL1JYX1JJTkdfU0laRSAtMTsgLy8gUnggQnVsayBwb2ludGVyCisJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiAJPSAwOworCisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCS8vQWxsb2NhdGUgVVJCCisJCXBSeENvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CisJCWlmIChwUnhDb250ZXh0LT5wVXJiID09IE5VTEwpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCisJCS8vIEFsbG9jYXRlIHRyYW5zZmVyIGJ1ZmZlcgorCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwgJnBSeENvbnRleHQtPmRhdGFfZG1hKTsKKwkJaWYgKHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID09IE5VTEwpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCisJCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBNQVhfUlhCVUxLX1NJWkUpOworCisJCXBSeENvbnRleHQtPnBBZAk9IHBBZDsKKwkJcFJ4Q29udGV4dC0+cElycCA9IE5VTEw7CisJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisJCS8vcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7CisJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCA9IDA7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRSZWN2XG4iKSk7CisJcmV0dXJuIFN0YXR1czsKKworb3V0MToKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJaWYgKE5VTEwgIT0gcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIpCisJCXsKKwkJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgTUFYX1JYQlVMS19TSVpFLAorCQkJCQkJCQlwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFJ4Q29udGV4dC0+ZGF0YV9kbWEpOworCQkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOworCQl9CisKKwkJaWYgKE5VTEwgIT0gcFJ4Q29udGV4dC0+cFVyYikKKwkJeworCQkJUlRVU0JfVU5MSU5LX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJCVJUVVNCX0ZSRUVfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+cFVyYiA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSB0cmFuc21pdCBkYXRhIHN0cnVjdHVyZXMuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCU5JQ0luaXRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNkZWZpbmUgTE1fVVNCX0FMTE9DKHBPYmosIENvbnRleHQsIFRCX1R5cGUsIEJ1ZmZlclNpemUsIFN0YXR1cywgbXNnMSwgZXJyMSwgbXNnMiwgZXJyMikJXAorCUNvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CQlcCisJaWYgKENvbnRleHQtPnBVcmIgPT0gTlVMTCkgewkJCVwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsIG1zZzEpOwkJXAorCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CQlcCisJCWdvdG8gZXJyMTsgfQkJCQkJCVwKKwkJCQkJCQkJCQkJXAorCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gCQkJCVwKKwkJKFRCX1R5cGUpUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwgJkNvbnRleHQtPmRhdGFfZG1hKTsJXAorCWlmIChDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKSB7CVwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsIG1zZzIpOwkJXAorCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CQlcCisJCWdvdG8gZXJyMjsgfQorCisjZGVmaW5lIExNX1VSQl9GUkVFKHBPYmosIENvbnRleHQsIEJ1ZmZlclNpemUpCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5wVXJiKSB7CQkJCQkJCVwKKwkJUlRVU0JfVU5MSU5LX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCVwKKwkJUlRVU0JfRlJFRV9VUkIoQ29udGV4dC0+cFVyYik7CQkJCQkJXAorCQlDb250ZXh0LT5wVXJiID0gTlVMTDsgfQkJCQkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKSB7CQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisJVUNIQVIJCQlpLCBhY2lkeDsKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ICAgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlQVFhfQ09OVEVYVAkJcFJUU0NvbnRleHQgICAgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IE5VTEw7CisvLwlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQgPSBOVUxMOworCVBPU19DT09LSUUJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJUFZPSUQJCQlSaW5nQmFzZVZhOworLy8JUlRNUF9UWF9SSU5HCSpwVHhSaW5nOworCVJUTVBfTUdNVF9SSU5HICAqcE1nbXRSaW5nOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRUcmFuc21pdFxuIikpOworCXBPYmogPSBwT2JqOworCisJLy8gSW5pdCA0IHNldCBvZiBUeCBwYXJhbWV0ZXJzCisJZm9yKGFjaWR4ID0gMDsgYWNpZHggPCBOVU1fT0ZfVFhfUklORzsgYWNpZHgrKykKKwl7CisJCS8vIEluaXRpYWxpemUgYWxsIFRyYW5zbWl0IHJlbGVhdGVkIHF1ZXVlcworCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW2FjaWR4XSk7CisKKwkJLy8gTmV4dCBMb2NhbCB0eCByaW5nIHBvaW50ZXIgd2FpdGluZyBmb3IgYnVjayBvdXQKKwkJcEFkLT5OZXh0QnVsa091dEluZGV4W2FjaWR4XSA9IGFjaWR4OworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOyAvLyBCdWNrIE91dCBjb250cm9sIGZsYWcKKwkJLy9wQWQtPkRhdGFCdWxrRG9uZUlkeFthY2lkeF0gPSAwOworCX0KKworCS8vcEFkLT5OZXh0TUxNRUluZGV4CT0gMDsKKwkvL3BBZC0+UHVzaE1nbXRJbmRleAk9IDA7CisJLy9wQWQtPlBvcE1nbXRJbmRleAk9IDA7CisJLy9JbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPk1nbXRRdWV1ZVNpemUsIDApOworCS8vSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5UeENvdW50LCAwKTsKKworCS8vcEFkLT5QcmlvUmluZ0ZpcnN0SW5kZXgJPSAwOworCS8vcEFkLT5QcmlvUmluZ1R4Q250CQk9IDA7CisKKwlkbworCXsKKwkJLy8KKwkJLy8gVFhfUklOR19TSVpFLCA0IEFDcworCQkvLworCQlmb3IoYWNpZHg9MDsgYWNpZHg8NDsgYWNpZHgrKykKKwkJeworCQkJUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOworCisJCQlOZGlzWmVyb01lbW9yeShwSFRUWENvbnRleHQsIHNpemVvZihIVF9UWF9DT05URVhUKSk7CisJCQkvL0FsbG9jYXRlIFVSQgorCQkJTE1fVVNCX0FMTE9DKHBPYmosIHBIVFRYQ29udGV4dCwgUEhUVFhfQlVGRkVSLCBzaXplb2YoSFRUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggVHhDb250ZXh0WyVkXSB1cmIhISBcbiIsIGFjaWR4KSwKKwkJCQkJCQlkb25lLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFR4Q29udGV4dFslZF0gSFRUWF9CVUZGRVIgISEgXG4iLCBhY2lkeCksCisJCQkJCQkJb3V0MSk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPkFnZ3JlZ2F0aW9uLCA0KTsKKwkJCXBIVFRYQ29udGV4dC0+cEFkID0gcEFkOworCQkJcEhUVFhDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkID0gYWNpZHg7CisJCQlwSFRUWENvbnRleHQtPmJSaW5nRW1wdHkgPSBUUlVFOworCQkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKKworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsKKwkJfQorCisKKwkJLy8KKwkJLy8gTUdNVF9SSU5HX1NJWkUKKwkJLy8KKyNpZiAwCisJCWZvcihpPTA7IGk8TUdNVF9SSU5HX1NJWkU7IGkrKykgLy8gOAorCQl7CisJCQlQVFhfQ09OVEVYVAlwTUxNRUNvbnRleHQgPSAmKHBBZC0+TUxNRUNvbnRleHRbaV0pOworCisKKwkJCU5kaXNaZXJvTWVtb3J5KHBNTE1FQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKworCQkJLy9BbGxvY2F0ZSBVUkIKKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwTUxNRUNvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIHVyYiEhIFxuIiwgaSksCisJCQkJCQkJb3V0MiwKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBNTE1FQ29udGV4dFslZF0gVFhfQlVGRkVSICEhIFxuIiwgaSksCisJCQkJCQkJb3V0Mik7CisKKwkJCXBNTE1FQ29udGV4dC0+cEFkID0gcEFkOworCQkJcE1MTUVDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQl9CisjZWxzZQorCQkvLyBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeQorCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIHNpemVvZihUWF9DT05URVhUKTsKKwkJUlRNUEFsbG9jYXRlTWVtb3J5KCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKKwkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQorCQl7CisJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIE1nbXQgYnVmZmVyIHRvIE1nbXRSaW5nLkNlbGwKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1NpemUgPSBzaXplb2YoVFhfQ09OVEVYVCk7CisJCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCS8vQWxsb2NhdGUgVVJCIGZvciBNTE1FQ29udGV4dAorCQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKKwkJCWlmIChwTUxNRUNvbnRleHQtPnBVcmIgPT0gTlVMTCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIHVyYiEhIFxuIiwgaSkpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCQkJcE1MTUVDb250ZXh0LT5TZWxmSWR4ID0gaTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgc2l6ZW9mKFRYX0NPTlRFWFQpOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpKSk7CisKKwkJLy9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gKE1HTVRfUklOR19TSVpFIC0gMSk7CisJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBNR01UX1JJTkdfU0laRTsKKwkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7CisJCXBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPSAwOworI2VuZGlmCisKKwkJLy8KKwkJLy8gQkVBQ09OX1JJTkdfU0laRQorCQkvLworCQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgLy8gMgorCQl7CisJCQlQVFhfQ09OVEVYVAlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKworCisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKworCQkJLy9BbGxvY2F0ZSBVUkIKKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwQmVhY29uQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBCZWFjb25Db250ZXh0WyVkXSB1cmIhISBcbiIsIGkpLAorCQkJCQkJCW91dDIsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gVFhfQlVGRkVSICEhIFxuIiwgaSksCisJCQkJCQkJb3V0Myk7CisKKwkJCXBCZWFjb25Db250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwQmVhY29uQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwQmVhY29uQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCXBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCX0KKworCQkvLworCQkvLyBOdWxsQ29udGV4dAorCQkvLworCQlOZGlzWmVyb01lbW9yeShwTnVsbENvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJLy9BbGxvY2F0ZSBVUkIKKwkJTE1fVVNCX0FMTE9DKHBPYmosIHBOdWxsQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IHVyYiEhIFxuIiksCisJCQkJCQlvdXQzLAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgVFhfQlVGRkVSICEhIFxuIiksCisJCQkJCQlvdXQ0KTsKKworCQlwTnVsbENvbnRleHQtPnBBZCA9IHBBZDsKKwkJcE51bGxDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkvLworCQkvLyBSVFNDb250ZXh0CisJCS8vCisJCU5kaXNaZXJvTWVtb3J5KHBSVFNDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCisJCS8vQWxsb2NhdGUgVVJCCisJCUxNX1VTQl9BTExPQyhwT2JqLCBwUlRTQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFJUU0NvbnRleHQgdXJiISEgXG4iKSwKKwkJCQkJCW91dDQsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAorCQkJCQkJb3V0NSk7CisKKwkJcFJUU0NvbnRleHQtPnBBZCA9IHBBZDsKKwkJcFJUU0NvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUlRTQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkvLworCQkvLyBQc1BvbGxDb250ZXh0CisJCS8vCisJCS8vTmRpc1plcm9NZW1vcnkocFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisJCS8vQWxsb2NhdGUgVVJCCisJCUxNX1VTQl9BTExPQyhwT2JqLCBwUHNQb2xsQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgdXJiISEgXG4iKSwKKwkJCQkJCW91dDUsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAorCQkJCQkJb3V0Nik7CisKKwkJcFBzUG9sbENvbnRleHQtPnBBZCA9IHBBZDsKKwkJcFBzUG9sbENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUHNQb2xsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcFBzUG9sbENvbnRleHQtPmJBZ2dyZWdhdGlibGUgPSBGQUxTRTsKKwkJcFBzUG9sbENvbnRleHQtPkxhc3RPbmUgPSBUUlVFOworCisJfSAgIHdoaWxlIChGQUxTRSk7CisKKworZG9uZToKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFRyYW5zbWl0XG4iKSk7CisKKwlyZXR1cm4gU3RhdHVzOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK291dDY6CisJTE1fVVJCX0ZSRUUocE9iaiwgcFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworb3V0NToKKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCitvdXQ0OgorCUxNX1VSQl9GUkVFKHBPYmosIHBOdWxsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCitvdXQzOgorCWZvcihpPTA7IGk8QkVBQ09OX1JJTkdfU0laRTsgaSsrKQorCXsKKwkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisJfQorCitvdXQyOgorCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCXsKKwkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJZm9yKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKQorCXsKKwkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYgKHBNTE1FQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCX0KKwkJTmRpc0ZyZWVNZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLCAwKTsKKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9IE5VTEw7CisJfQorCitvdXQxOgorCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspCisJeworCQlQSFRfVFhfQ09OVEVYVCBwVHhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOworCQlpZiAocFR4Q29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBUeENvbnRleHQsIHNpemVvZihIVFRYX0JVRkZFUikpOworCX0KKworCS8vIEhlcmUgd2UgZGlkbid0IGhhdmUgYW55IHByZS1hbGxvY2F0ZWQgbWVtb3J5IG5lZWQgdG8gZnJlZS4KKworCXJldHVybiBTdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZS4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworLy8JQ09VTlRFUl84MDJfMTEJcENvdW50ZXIgPSAmcEFkLT5XbGFuQ291bnRlcnM7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwlJTlQJCQkJbnVtOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCisJZG8KKwl7CisJCS8vIEluaXQgdGhlIENtZFEgYW5kIENtZFFMb2NrCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCVJUVVNCSW5pdGlhbGl6ZUNtZFEoJnBBZC0+Q21kUSk7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKwkJLy9OZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FV2FpdFF1ZXVlTG9jayk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMV0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1syXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzNdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNF0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s1XSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCisJCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKQorCQl7CisJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbbnVtXSk7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworLy8JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1lbUxvY2spOwkvLyBOb3QgdXNlZCBpbiBSVDI4WFgKKworLy8JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOyAvLyBpbml0IGl0IGluIFVzZXJDZmdJbml0KCkKKy8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOyAvLyBpbml0IGl0IGluIEJBVGFibGVJbml0KCkKKworLy8JCWZvcihudW09MDsgbnVtPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBudW0rKykKKy8vCQl7CisvLwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtudW1dLlJ4UmVSaW5nTG9jayk7CisvLwkJfQorCisJCS8vCisJCS8vIEluaXQgTWFjIFRhYmxlCisJCS8vCisvLwkJTWFjVGFibGVJbml0aWFsaXplKHBBZCk7CisKKwkJLy8KKwkJLy8gSW5pdCBzZW5kIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCisJCS8vCisJCVN0YXR1cyA9IE5JQ0luaXRUcmFuc21pdChwQWQpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQkvLworCQkvLyBJbml0IHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMKKwkJLy8KKwkJU3RhdHVzID0gTklDSW5pdFJlY3YocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJcEFkLT5QZW5kaW5nSW9Db3VudCA9IDE7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihGUkFHTUVOVF9GUkFNRSkpOworCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0gIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKQorCXsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCX0KKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisJQ2FsbHMgVVNCX0ludGVyZmFjZVN0b3AgYW5kIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBVUkJzCisgICAgY2FsbHMgTmRpc01EZXJlZ2lzdGVyRGV2aWNlIGFuZCBmcmVlcyB0aGUgbWVtb3J5CisgICAgYWxsb2NhdGVkIGluIFZOZXRJbml0aWFsaXplIGZvciB0aGUgQWRhcHRlciBPYmplY3QKKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQkJXAorCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKKwkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKKwkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKKwkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9CisKKworCVVJTlQgICAgICAgICAgICAgICAgaSwgYWNpZHg7CisJUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQgICA9ICZwQWQtPk51bGxDb250ZXh0OworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQgPSAmcEFkLT5Qc1BvbGxDb250ZXh0OworCVBUWF9DT05URVhUCQkJcFJUU0NvbnRleHQgICAgPSAmcEFkLT5SVFNDb250ZXh0OworLy8JUEhUX1RYX0NPTlRFWFQgCQlwSFRUWENvbnRleHQ7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBSZW9yZGVyQnVmOworCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworLy8JUlRNUF9UWF9SSU5HCQkqcFR4UmluZzsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOworCXBPYmogPSBwT2JqOworCisJLy8gRnJlZSBhbGwgcmVzb3VyY2VzIGZvciB0aGUgUkVDRUlWRSBidWZmZXIgcXVldWUuCisJZm9yKGk9MDsgaTwoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYgKHBSeENvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwUnhDb250ZXh0LCBNQVhfUlhCVUxLX1NJWkUpOworCX0KKworCS8vIEZyZWUgUHNQb2xsIGZyYW1lIHJlc291cmNlCisJTE1fVVJCX0ZSRUUocE9iaiwgcFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworCS8vIEZyZWUgTlVMTCBmcmFtZSByZXNvdXJjZQorCUxNX1VSQl9GUkVFKHBPYmosIHBOdWxsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCisJLy8gRnJlZSBSVFMgZnJhbWUgcmVzb3VyY2UKKwlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCisKKwkvLyBGcmVlIGJlYWNvbiBmcmFtZSByZXNvdXJjZQorCWZvcihpPTA7IGk8QkVBQ09OX1JJTkdfU0laRTsgaSsrKQorCXsKKwkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisJCWlmIChwQmVhY29uQ29udGV4dCkKKwkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisJfQorCisKKwkvLyBGcmVlIG1nbXQgZnJhbWUgcmVzb3VyY2UKKwlmb3IoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQorCXsKKwkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkvL0xNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCQlpZiAoTlVMTCAhPSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpCisJCXsKKwkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCk7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCX0KKworCQlpZiAocE1MTUVDb250ZXh0KQorCQl7CisJCQlpZiAoTlVMTCAhPSBwTUxNRUNvbnRleHQtPnBVcmIpCisJCQl7CisJCQkJUlRVU0JfVU5MSU5LX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOworCQkJCVJUVVNCX0ZSRUVfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQkJcE1MTUVDb250ZXh0LT5wVXJiID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKKwkJTmRpc0ZyZWVNZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLCAwKTsKKworCisJLy8gRnJlZSBUeCBmcmFtZSByZXNvdXJjZQorCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspCisJCXsKKwkJUEhUX1RYX0NPTlRFWFQgcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOworCQkJaWYgKHBIVFRYQ29udGV4dCkKKwkJCQlMTV9VUkJfRlJFRShwT2JqLCBwSFRUWENvbnRleHQsIHNpemVvZihIVFRYX0JVRkZFUikpOworCQl9CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlmb3IoaT0wOyBpPDY7IGkrKykKKwl7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbaV0pOworCX0KKworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QnVsa0luTG9jayk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkvLyBDbGVhciBhbGwgcGVuZGluZyBidWxrLW91dCByZXF1ZXN0IGZsYWdzLgorCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIDB4ZmZmZmZmZmYpOworCisvLwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisvLwlmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisvLwl7CisvLwkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKTsKKy8vCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS0gUmVsZWFzZUFkYXB0ZXJcbiIpKTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCkKK3sKKwlQVVNCX0RFVgl1c2JfZGV2OworCVBPU19DT09LSUUJcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7CisKKworCXVzYl9kZXYgPSBwT2JqLT5wVXNiX0RldjsKKworCXBPYmotPk1MTUVUaHJfcGlkCQk9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwlwT2JqLT5SVFVTQkNtZFRocl9waWQJPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsKKworCWlmICgqcHBBZCkKKwl7CisJCU5kaXNaZXJvTWVtb3J5KCpwcEFkLCBzaXplb2YoUlRNUF9BREFQVEVSKSk7CisJCSgoUFJUTVBfQURBUFRFUikqcHBBZCktPk9TX0Nvb2tpZSA9IGhhbmRsZTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDcmVhdGUga2VybmVsIHRocmVhZHMgJiB0YXNrbGV0cy4KKworQXJndW1lbnRzOgorICAgICpuZXRfZGV2CQkJUG9pbnRlciB0byB3aXJlbGVzcyBuZXQgZGV2aWNlIGludGVyZmFjZQorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCSBDcmVhdGVUaHJlYWRzKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcGlkX3QgcGlkX251bWJlciA9IC0xOworCisJLy9pbml0X01VVEVYKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisKKwlpbml0X01VVEVYX0xPQ0tFRCgmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKKwlpbml0X2NvbXBsZXRpb24gKCZwQWQtPm1sbWVDb21wbGV0ZSk7CisKKwlpbml0X01VVEVYX0xPQ0tFRCgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisJaW5pdF9jb21wbGV0aW9uICgmcEFkLT5DbWRRQ29tcGxldGUpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7CisJaW5pdF9jb21wbGV0aW9uICgmcEFkLT5UaW1lclFDb21wbGV0ZSk7CisKKwkvLyBDcmVhdCBNTE1FIFRocmVhZAorCXBPYmotPk1MTUVUaHJfcGlkPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJcGlkX251bWJlciA9IGtlcm5lbF90aHJlYWQoTWxtZVRocmVhZCwgcEFkLCBDTE9ORV9WTSk7CisJaWYgKHBpZF9udW1iZXIgPCAwKQorCXsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgTWxtZSB0aHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCXBPYmotPk1MTUVUaHJfcGlkID0gR0VUX1BJRChwaWRfbnVtYmVyKTsKKwkvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0CisJd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+bWxtZUNvbXBsZXRlKSk7CisKKwkvLyBDcmVhdCBDb21tYW5kIFRocmVhZAorCXBPYmotPlJUVVNCQ21kVGhyX3BpZD0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFJUVVNCQ21kVGhyZWFkLCBwQWQsIENMT05FX1ZNKTsKKwlpZiAocGlkX251bWJlciA8IDApCisJeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBSVFVTQkNtZCB0aHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCXBPYmotPlJUVVNCQ21kVGhyX3BpZCA9IEdFVF9QSUQocGlkX251bWJlcik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+Q21kUUNvbXBsZXRlKSk7CisKKwlwT2JqLT5UaW1lclFUaHJfcGlkPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJcGlkX251bWJlciA9IGtlcm5lbF90aHJlYWQoVGltZXJRVGhyZWFkLCBwQWQsIENMT05FX1ZNKTsKKwlpZiAocGlkX251bWJlciA8IDApCisJeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBUaW1lclFUaHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCXBPYmotPlRpbWVyUVRocl9waWQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCS8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gc3RhcnQKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYocEFkLT5UaW1lclFDb21wbGV0ZSkpOworCisJLy8gQ3JlYXRlIHJlY2VpdmUgdGFza2xldAorCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsIChVTE9ORylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzaywgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnRidHRfdGFzaywgdGJ0dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrLCBydDI4NzBfbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrLCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorIAlBcyBTVEEncyBCU1NJRCBpcyBhIFdDIHRvbywgaXQgdXNlcyBzaGFyZWQga2V5IHRhYmxlLgorIAlUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvcnJlY3QgdW5pY2FzdCBUWCBrZXkgdG8gQVNJQyBXQ0lELgorIAlBbmQgd2Ugc3RpbGwgbWFrZSBhIGNvcHkgaW4gb3VyIE1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LgorCUNhbGxlciBndWFyYW50ZWUgVEtJUC9BRVMgYWx3YXlzIGhhcyBrZXlpZHggPSAwLiAocGFpcndpc2Uga2V5KQorCUNhbGxlciBndWFyYW50ZWUgV0VQIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBzZXQgVHhrZXksICBkZWZhdWx0IGtleSBpbmRleD0wfjMuCisKK0FyZ3VtZW50czoKKwlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJcEtleQkJCQkJUG9pbnRlciB0byB0aGUgd2hlcmUgdGhlIGtleSBzdG9yZWQKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1VDQ0VTUwkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBBZGRCU1NJRENpcGhlcigKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJQWlkLAorCUlOCVBORElTXzgwMl8xMV9LRVkJcEtleSwKKwlJTiAgVUNIQVIgICAJCQlDaXBoZXJBbGcpCit7CisJUFVDSEFSCQlwVHhNaWMsIHBSeE1pYzsKKwlCT09MRUFOIAliS2V5UlNDLCBiQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZQorLy8JVUNIQVIJCUNpcGhlckFsZzsKKwlVQ0hBUgkJaTsKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkgCW9mZnNldDsKKwlVQ0hBUgkJS2V5SWR4LCBJVkVJVls4XTsKKwlVSU5UMzIJCVZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEJTU0lEQ2lwaGVyPT0+IEFpZCA9ICVkXG4iLEFpZCkpOworCisJLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCisJYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCUtleUlkeCA9IChVQ0hBUilwS2V5LT5LZXlJbmRleCYweGZmOworCisJaWYgKEtleUlkeCA+IDQpCisJCXJldHVybjsKKworCisJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJewlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJLy8gZm9yIFdQQS1Ob25lIFR4LCBSeCBNSUMgaXMgdGhlIHNhbWUKKwkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCQlwUnhNaWMgPSBwVHhNaWM7CisJCX0KKwkJZWxzZSBpZiAoYkF1dGhlbnRpY2F0b3IgPT0gVFJVRSkKKwkJeworCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKKwkJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAyNDsKKwkJfQorCisJCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKSArIDB4MTA7CisJCWZvciAoaT0wOyBpPDg7ICkKKwkJeworCQkJVmFsdWUgPSAqKHBUeE1pYytpKTsKKwkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzEpPDw4KTsKKwkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzIpPDwxNik7CisJCQlWYWx1ZSArPSAoKihwVHhNaWMraSszKTw8MjQpOworCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKKwkJCWkrPTQ7CisJCX0KKworCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSkgKyAweDE4OworCQlmb3IgKGk9MDsgaTw4OyApCisJCXsKKwkJCVZhbHVlID0gKihwUnhNaWMraSk7CisJCQlWYWx1ZSArPSAoKihwUnhNaWMraSsxKTw8OCk7CisJCQlWYWx1ZSArPSAoKihwUnhNaWMraSsyKTw8MTYpOworCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMyk8PDI0KTsKKwkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQlpKz00OworCQl9CisKKwkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeE1pYywgcFR4TWljLCA4KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkoIglUeE1JQyAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSwKKwkJCQlwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCIJUnhNSUMgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJCQlwUnhNaWNbMF0scFJ4TWljWzFdLHBSeE1pY1syXSxwUnhNaWNbM10sCisJCQkJcFJ4TWljWzRdLHBSeE1pY1s1XSxwUnhNaWNbNl0scFJ4TWljWzddKSk7CisJfQorCisJLy8gMi4gUmVjb3JkIFNlY3VyaXR5IEtleS4KKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleUxlbj0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkvLyAzLiBDaGVjayBSeFRzYy4gQW5kIHVzZWQgdG8gaW5pdCB0byBBU0lDIElWLgorCWlmIChiS2V5UlNDID09IFRSVUUpCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7CisJZWxzZQorCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhUc2MsIDYpOworCisJLy8gNC4gSW5pdCBUeFRzYyB0byBvbmUgYmFzZWQgb24gV2lGaSBXUEEgc3BlY3MKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMF0gPSAxOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzJdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbM10gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzVdID0gMDsKKworCUNpcGhlckFsZyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5DaXBoZXJBbGc7CisKKwlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSk7CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBwS2V5LT5LZXlNYXRlcmlhbCwKKwkJCQkoKHBLZXktPktleUxlbmd0aCA9PSBMRU5fVEtJUF9LRVkpID8gMTYgOiAoVVNIT1JUKXBLZXktPktleUxlbmd0aCkpOworCisJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKEtleUlkeCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKwlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIHBLZXktPktleU1hdGVyaWFsLCAoVVNIT1JUKXBLZXktPktleUxlbmd0aCk7CisKKwlvZmZzZXQgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKKworCS8vIElWL0VJVgorCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAorCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKKwl7CisJCUlWRUlWWzNdID0gMHgyMDsgLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCX0KKwkvLyBkZWZhdWx0IGtleSBpZHggbmVlZHMgdG8gc2V0LgorCS8vIGluIFRLSVAvQUVTIEtleUlkeCA9IDAgLCBXRVAgS2V5SWR4IGlzIGRlZmF1bHQgdHgga2V5LgorCWVsc2UKKwl7CisJCUlWRUlWWzNdIHw9IChLZXlJZHg8PCA2KTsKKwl9CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBJVkVJViwgOCk7CisKKwkvLyBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZToxPVBBSVJXSVNFIEtFWSwgQlNTSWR4IGlzIDAKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKKwl9CisJZWxzZQorCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKXxTSEFSRURLRVlUQUJMRTsKKworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEFpZCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7CisJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCU1NJRF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICVseFxuIiwKKwkJCW9mZnNldCwgV0NJREF0dHJpKSk7CisKKwkvLyBwQWRkcgorCS8vIEFkZCBCc3NpZCBtYWMgYWRkcmVzcyBhdCBsaW5rdXAuIG5vdCBoZXJlLiAgY2hlY2shCisJLypvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKEJTU0lEX1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOworCSpmb3IgKGk9MDsgaTxNQUNfQUREUl9MRU47IGkrKykKKwl7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBLZXktPkJTU0lEW2ldKTsKKwl9CisJKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFkZEJTU0lEYXNXQ0lERW50cnk6IEFsZz0lcywgS2V5TGVuZ3RoID0gJWRcbiIsCisJCQlDaXBoZXJOYW1lW0NpcGhlckFsZ10sIHBLZXktPktleUxlbmd0aCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIktleSBbaWR4PSV4XSBbS2V5TGVuID0gJWRdXG4iLAorCQkJcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCWZvcihpPTA7IGk8cEtleS0+S2V5TGVuZ3RoOyBpKyspCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAleDoiLCBwS2V5LT5LZXlNYXRlcmlhbFtpXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCSBcbiIpKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBHZXQgYSByZWNlaXZlZCBwYWNrZXQuCisKK0FyZ3VtZW50czoKKwlwQWQJCQkJCWRldmljZSBjb250cm9sIGJsb2NrCisJcFNhdmVSeEQJCQlyZWNlaXZlIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24KKwkqcGJSZXNjaGVkdWxlCQluZWVkIHJlc2NoZWR1bGUgZmxhZworCSpwUnhQZW5kaW5nCQkJcGVuZGluZyByZWNlaXZlZCBwYWNrZXQgZmxhZworCitSZXR1cm4gVmFsdWU6CisgICAgdGhlIHJlY2lldmVkIHBhY2tldAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRQkJCTQKK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJCSpwUnhQZW5kaW5nKQoreworCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBORElTX1BBQ0tFVAlwU2tiOworCVBVQ0hBUgkJCXBEYXRhOworCVVMT05HCQkJVGhpc0ZyYW1lTGVuOworCVVMT05HCQkJUnhCdWZmZXJMZW5ndGg7CisJUFJYV0lfU1RSVUMJCXBSeFdJOworCisJcFJ4Q29udGV4dCA9ICZwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF07CisJaWYgKChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBGQUxTRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQorCQlyZXR1cm4gTlVMTDsKKworCVJ4QnVmZmVyTGVuZ3RoID0gcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0IC0gcEFkLT5SZWFkUG9zaXRpb247CisJaWYgKFJ4QnVmZmVyTGVuZ3RoIDwgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKFJYV0lfU1RSVUMpICsgc2l6ZW9mKFJYSU5GT19TVFJVQykpKQorCXsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCXBEYXRhID0gJnBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+UmVhZFBvc2l0aW9uXTsgLyogNEtCICovCisJLy8gVGhlIFJYRE1BIGZpZWxkIGlzIDQgYnl0ZXMsIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgMiBieXRlcy4gVGhlIExlbmd0aCBpbmNsdWRpbmcgdGhlIChSWFdJICsgTVNEVSArIFBhZGRpbmcpCisJVGhpc0ZyYW1lTGVuID0gKnBEYXRhICsgKCoocERhdGErMSk8PDgpOworICAgIGlmIChUaGlzRnJhbWVMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIGlzIHplcm8uWyVsZF0sIEJ1bGtJbkJ1ZkxlbiA9ICVsZClcbiIsCisJCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCWlmICgoVGhpc0ZyYW1lTGVuJjB4MykgIT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJJUklkeCglZCk6IFJYRE1BTGVuIG5vdCBtdWx0aXBsZSBvZiA0LlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAorCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCWlmICgoVGhpc0ZyYW1lTGVuICsgOCk+IFJ4QnVmZmVyTGVuZ3RoKQkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQklSSWR4KCVkKTpGcmFtZUxlbigweCVseCkgb3V0cmFuZ2VzLiBCdWxrSW5MZW49MHglbHgsIHJlbWFpbmluZyBSeEJ1Zkxlbj0weCVseCwgUmVhZFBvcz0weCVseFxuIiwKKwkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCwgUnhCdWZmZXJMZW5ndGgsIHBBZC0+UmVhZFBvc2l0aW9uKSk7CisKKwkJLy8gZXJyb3IgZnJhbWUuIGZpbmlzaCB0aGlzIGxvb3AKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCS8vIHNraXAgVVNCIGZyYW1lIGxlbmd0aCBmaWVsZAorCXBEYXRhICs9IFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFOworCXBSeFdJID0gKFBSWFdJX1NUUlVDKXBEYXRhOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UocERhdGEsIFRZUEVfUlhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gVGhpc0ZyYW1lTGVuKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTpwUnhXSU1QRFV0b3RhbEJ5dGVDb3VudCglZCkgbGFyZ2UgdGhhbiBSeERNQUxlbiglbGQpXG4iLAorCQkJCQkJCQkJX19GVU5DVElPTl9fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKHBEYXRhLCBUWVBFX1JYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIGFsbG9jYXRlIGEgcnggcGFja2V0CisJcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKKwlpZiAocFNrYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcygpOkNhbm5vdCBBbGxvY2F0ZSBzayBidWZmZXIgZm9yIHRoaXMgQnVsay1JbiBidWZmZXIhXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCS8vIGNvcHkgdGhlIHJ4IHBhY2tldAorCW1lbWNweShza2JfcHV0KHBTa2IsIFRoaXNGcmFtZUxlbiksIHBEYXRhLCBUaGlzRnJhbWVMZW4pOworCVJUUEtUX1RPX09TUEtUKHBTa2IpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKwlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBTa2IpLCBQS1RTUkNfTkRJUyk7CisKKwkvLyBjb3B5IFJ4RAorCSpwU2F2ZVJ4RCA9ICooUFJYSU5GT19TVFJVQykocERhdGEgKyBUaGlzRnJhbWVMZW4pOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBTYXZlUnhELCBUWVBFX1JYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gdXBkYXRlIG5leHQgcGFja2V0IHJlYWQgcG9zaXRpb24uCisJcEFkLT5SZWFkUG9zaXRpb24gKz0gKFRoaXNGcmFtZUxlbiArIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgUlhJTkZPX1NJWkUpOwkvLyA4IGZvciAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkKKworCXJldHVybiBwU2tiOworCitsYWJlbF9udWxsOgorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBIYW5kbGUgcmVjZWl2ZWQgcGFja2V0cy4KKworQXJndW1lbnRzOgorCWRhdGEJCQkJLSBVUkIgaW5mb3JtYXRpb24gcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlwdXJiYl90IAkJCXBVcmI7CisJUFJYX0NPTlRFWFQJCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwl1bnNpZ25lZCBpbnQJCUlycUZsYWdzOworCisJcFVyYgkJPSAocHVyYmJfdClkYXRhOworCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCArPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOworCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJcEFkLT5QZW5kaW5nUngtLTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQlwQWQtPkJ1bGtJbkNvbXBsZXRlKys7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCQlpZiAocFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KQkvLyBBcyBqYW4ncyBjb21tZW50LCBpdCBtYXkgYnVsay1pbiBzdWNjZXNzIGJ1dCBzaXplIGlzIHplcm8uCisJCXsKKwkJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gVFJVRTsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwl9CisJZWxzZQkgLy8gU1RBVFVTX09USEVSCisJeworCQlwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCsrOworCQkvLyBTdGlsbCByZWFkIHRoaXMgcGFja2V0IGFsdGhvdWdoIGl0IG1heSBjb210YWluIHdyb25nIGJ5dGVzLgorCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgorCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCXsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXM9JWQsIEJJSWR4PTB4JXgsIEJJUklkeD0weCV4LCBhY3R1YWxfbGVuZ3RoPSAweCV4XG4iLAorCQkJCQkJCVN0YXR1cywgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBSeENvbnRleHQtPnBVcmItPmFjdHVhbF9sZW5ndGgpKTsKKworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOworCQl9CisJfQorCisJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJLy8gSWYgdGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBhbmQgUnggZnJhbWUgaXMgc2V0IGludG8gaGVyZS4KKwkJaWYgKHBBZC0+Q29udGluQnVsa0luID09IFRSVUUpCisJCXsKKwkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKworCXJldHVybjsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZDsKKwlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OworCWludAkJCQlpbmRleDsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7CisJaW5kZXggCQkJPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7CisKKwlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKworCWlmIChTdGF0dXMgIT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvL0J1bGstT3V0IGZhaWwgc3RhdHVzIGhhbmRsZQorCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IE1MTUUgRmFpbGVkLCBTdGF0dXM9JWQhXG4iLCBTdGF0dXMpKTsKKwkJCS8vIFRPRE86IEhvdyB0byBoYW5kbGUgYWJvdXQgdGhlIE1MTUVCdWxrT3V0IGZhaWxlZCBpc3N1ZS4gTmVlZCB0byByZXNlbmQgdGhlIG1nbXQgcGt0PworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJfQorCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKwkvLyBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MKKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKworCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8gSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXgKKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7CisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCS8vIE5vLW1hdHRlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGZyZWUgdGhlIG1nbXQgcGFja2V0LgorCWlmIChwUGFja2V0KQorCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwUGFja2V0KTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwl7CisJCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KKwl9CisJZWxzZQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSAmJgorCQkJKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykpCisJCXsJLy8gRm9yIE1nbXQgQnVsay1PdXQgZmFpbGVkLCBpZ25vcmUgaXQgbm93LgorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJeworCisJCQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkJCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPCBNR01UX1JJTkdfU0laRSAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKQorCQkJeworCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQl9CisJCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQkJfQorCQl9CisKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gNDsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCItLS0+aGNjYV9kbWFfZG9uZV90YXNrbGV0XG4iKSk7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLS1oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKKworCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMzsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDMpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisKKwkJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7CisJVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDI7CisJcHVyYmJfdAkJCQlwVXJiOworCisKKwlwVXJiCQkJPSAocHVyYmJfdClkYXRhOworCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZAkJCQk9IHBIVFRYQ29udGV4dC0+cEFkOworCisJcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCgodW5zaWduZWQgbG9uZylwVXJiKTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwl7CisJCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KKwl9CisJZWxzZQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkKKwkJeworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJewlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCisJCQkJLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCisJCQl7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMPDwyKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMTsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDEpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMDsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKiAgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCXJldHVybjsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQ7CisJcHVyYmJfdAkJCXBVcmI7CisJTlRTVEFUVVMJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWlycUZsYWc7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcE51bGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE51bGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzIAkJCT0gcFVyYi0+c3RhdHVzOworCisJLy8gUmVzZXQgTnVsbCBmcmFtZSBjb250ZXh0IGZsYWdzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nIAk9IEZBTFNFOworCXBOdWxsQ29udGV4dC0+SW5Vc2UgCQk9IEZBTFNFOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IE51bGwgRnJhbWUgRmFpbGVkLCBSZWFzb25Db2RlPSVkIVxuIiwgU3RhdHVzKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCX0KKwl9CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKKworCisJcFVyYgkJPSAocHVyYmJfdClkYXRhOworCXBSVFNDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJPSBwUlRTQ29udGV4dC0+cEFkOworCVN0YXR1cwkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBSZXNldCBSVFMgZnJhbWUgY29udGV4dCBmbGFncworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJUU0NvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IFJUUyBGcmFtZSBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX3BzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQVFhfQ09OVEVYVAkJcFBzUG9sbENvbnRleHQ7CisJcHVyYmJfdAkJCXBVcmI7CisJTlRTVEFUVVMJCVN0YXR1czsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwUHNQb2xsQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZAkJCQk9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBSZXNldCBQc1BvbGwgY29udGV4dCBmbGFncworCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJcFBzUG9sbENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCWVsc2UgLy8gU1RBVFVTX09USEVSCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IFBTUG9sbCBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlwdXJiYl90CQkJCXBVcmI7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworCisKKwlwVXJiCQkJPSAocHVyYmJfdClkYXRhOworCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZAkJCQk9IHBIVFRYQ29udGV4dC0+cEFkOworCXBPYmogCQkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCUJ1bGtPdXRQaXBlSWQgPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CisKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsICgiRG9uZS1CKCVkKTpJPTB4JWx4LCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBCdWxrT3V0UGlwZUlkLCBpbl9pbnRlcnJ1cHQoKSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCS8vCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbQnVsa091dFBpcGVJZF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa091dENvbXBsZXRlKys7CisKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkJcEFkLT5Db3VudGVyczgwMjMuR29vZFRyYW5zbWl0cysrOworCQkvL1JUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCUZSRUVfSFRUWF9SSU5HKHBBZCwgQnVsa091dFBpcGVJZCwgcEhUVFhDb250ZXh0KTsKKwkJLy9SVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJUFVDSEFSCXBCdWY7CisKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcisrOworCisJCXBCdWYgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uXTsKKworCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IEJ1bGtPdXRQaXBlSWQ7CisJCQlwQWQtPmJ1bGtSZXNldFJlcVtCdWxrT3V0UGlwZUlkXSA9IHBBZC0+QnVsa091dFJlcTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa091dERhdGFQYWNrZXQgZmFpbGVkOiBSZWFzb25Db2RlPSVkIVxuIiwgU3RhdHVzKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwgcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiXHQ+PkJ1bGtPdXQgSGVhZGVyOiV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddKSk7CisJCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dENvbXBsZXRlQ2FuY2VsPTB4JXgsIEJ1bGtPdXRDb21wbGV0ZU90aGVyPTB4JXhcbiIsIHBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisKKwl9CisKKwkvLworCS8vIGJJblVzZSA9IFRSVUUsIG1lYW5zIHNvbWUgcHJvY2VzcyBhcmUgZmlsbGluZyBUWCBkYXRhLCBhZnRlciB0aGF0IG11c3QgdHVybiBvbiBiV2FpdGluZ0J1bGtPdXQKKwkvLyBiV2FpdGluZ0J1bGtPdXQgPSBUUlVFLCBtZWFucyB0aGUgVFggZGF0YSBhcmUgd2FpdGluZyBmb3IgYnVsayBvdXQuCisJLy8KKwkvL1JUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgJiYKKwkJKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbis4KSkgJiYKKwkJIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpKQorCXsKKwkJLy8gSW5kaWNhdGUgVGhlcmUgaXMgZGF0YSBhdmFsaWFibGUKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworfQorCisvKiBFbmQgb2YgMjg3MF9ydG1wX2luaXQuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ4YTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmMKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4gTGVlCQkyMDA2CSAgCWNyZWF0ZWQgZm9yIHJ0Mjg2MAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NPQ19JRExFCisgICAgICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICBtbG1lX2Rpc2Fzc29jX3JlcV9hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgIHBlZXJfZGlzYXNzb2NfYWN0aW9uCisgICAgICAgIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICBkcm9wCisgICAgICAgIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICBkcm9wCisgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9BQ1RfU1RBVEUsIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFDVF9JRExFLCBBQ1RfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRExTQWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87CisJVUNIQVIgICAgICAgICAgIEFkZHJbNl07CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCisJcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCisJaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQorCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyAxLiBmaW5kIGVudHJ5CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEluZm8tPnBBZGRyKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gQUREQkFfUkVROworCQlGcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCQlGcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwkJRnJhbWUuQmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLkJhUGFybS5CdWZTaXplID0gcEluZm8tPkJhQnVmU2l6ZTsKKwkJRnJhbWUuVG9rZW4gPSBwSW5mby0+VG9rZW47CisJCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IHBJbmZvLT5UaW1lT3V0VmFsdWU7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuRnJhZ051bSA9IDA7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsKKworCQkqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pKTsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKKwkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQorICAgIFBhcmFtZXRyczoKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlGUkFNRV9CQVIJRnJhbWVCYXI7CisKKwlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisKKwlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwJCQkJJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOworCisJCS8vIFNFTkQgREVMQkEgRlJBTUUKKwkJRnJhbWVMZW4gPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCQlGcmFtZS5BY3Rpb24gPSBERUxCQTsKKwkJRnJhbWUuRGVsYmFQYXJtLkluaXRpYXRvciA9IHBJbmZvLT5Jbml0aWF0b3I7CisJCUZyYW1lLkRlbGJhUGFybS5USUQgPSBwSW5mby0+VElEOworCQlGcmFtZS5SZWFzb25Db2RlID0gMzk7IC8vIFRpbWUgT3V0CisJCSooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkpOworCQlGcmFtZS5SZWFzb25Db2RlID0gY3B1MmxlMTYoRnJhbWUuUmVhc29uQ29kZSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSksICAgICZGcmFtZSwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiAzIERFTEJBIHNlbnQuIEluaXRpYXRvciglZClcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKKyAgICAJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIE1sbWVRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCitWT0lEIE1sbWVETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCitWT0lEIE1sbWVJbnZhbGlkQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkvL1BVQ0hBUgkJICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJLy9SZXR1cm4gdGhlIHJlY2VpdmluZyBmcmFtZSBleGNlcHQgdGhlIE1TQiBvZiBjYXRlZ29yeSBmaWxlZCBzZXQgdG8gMS4gIDcuMy4xLjExCit9CisKK1ZPSUQgUGVlclFPU0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgUGVlckRMU0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBQ1RJT05fRExTX1JFUVVFU1Q6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1JlcUFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1RJT05fRExTX1JFU1BPTlNFOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNSc3BBY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNUSU9OX0RMU19URUFSRE9XTjoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzVGVhckRvd25BY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCX0KK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVyQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUREQkFfUkVROgorCQkJUGVlckFkZEJBUmVxQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIEFEREJBX1JFU1A6CisJCQlQZWVyQWRkQkFSc3BBY3Rpb24ocEFkLEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgREVMQkE6CisJCQlQZWVyRGVsQkFBY3Rpb24ocEFkLEVsZW0pOworCQkJYnJlYWs7CisJfQorfQorCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgU3RhUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzczIwNDBDb2V4aXN0KQoreworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3Q7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCisJQnNzQ29leGlzdC53b3JkID0gQnNzMjA0MENvZXhpc3Q7CisJLy8gQVAgYXNrcyBTdGF0aW9uIHRvIHJldHVybiBhIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lLiAgU28gd2UgZmlyc3Qgc3RhcnRzIGEgc2NhbiwgdGhlbiBzZW5kIGJhY2sgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUKKwlpZiAoKEJzc0NvZXhpc3QuZmllbGQuSW5mb1JlcSA9PSAxKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKSkKKwl7CisJCS8vIENsZWFyIHJlY29yZCBmaXJzdC4gIEFmdGVyIHNjYW4gLCB3aWxsIHVwZGF0ZSB0aG9zZSBiaXQgYW5kIHNlbmQgYmFjayB0byB0cmFuc21pdGVyLgorCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW50b2xlcmFudDQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDA7CisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOXzIwNDBfQlNTX0NPRVhJU1QpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCX0KK30KKworCisvKgorRGVzY3JpcHRpb24gOiBCdWlsZCBJbnRvbGVyYW50IENoYW5uZWwgUmVycG90IGZyb20gVHJpZ2dlciBldmVudCB0YWJsZS4KK3JldHVybiA6IGhvdyBtYW55IGJ5dGVzIGNvcGllZC4KKyovCitVTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFBVQ0hBUiAgcERlc3QpCit7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVUxPTkcJCQlSZWFkT2Zmc2V0ID0gMDsKKwlVQ0hBUgkJCWk7CisJVUNIQVIJCQlMYXN0UmVnQ2xhc3MgPSAweGZmOworCVBVQ0hBUgkJCXBMZW47CisKKwlmb3IgKCBpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID09IFRSVUUpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzID09IExhc3RSZWdDbGFzcykKKwkJCXsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOworCQkJCSpwTGVuKys7CisJCQkJUmVhZE9mZnNldCsrOworCQkJCUZyYW1lTGVuKys7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQ7ICAvLyBJRQorCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMSkgPSAyOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgorCQkJCXBMZW4gPSBwRGVzdCArIFJlYWRPZmZzZXQgKyAxOworCQkJCUxhc3RSZWdDbGFzcyA9IHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3M7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAyKSA9IExhc3RSZWdDbGFzczsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDMpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKKwkJCQlGcmFtZUxlbiArPSA0OworCQkJCVJlYWRPZmZzZXQgKz0gNDsKKwkJCX0KKworCQl9CisJfQorCXJldHVybiBGcmFtZUxlbjsKK30KKworCisvKgorRGVzY3JpcHRpb24gOiBTZW5kIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBBY3Rpb24gZnJhbWUgSWYgb25lIHRyaWdnZXIgZXZlbnQgaXMgdHJpZ2dlcmVkLgorKi8KK1ZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKKwlVTE9ORwkJCUZyYW1lTGVuOworCVVMT05HCQkJSW50b2xlcmFudENoYVJlcExlbjsKKworCUludG9sZXJhbnRDaGFSZXBMZW4gPSAwOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBQ1QgLSBTZW5kMjA0MENvZXhpc3RBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX1BVQkxJQzsKKwlGcmFtZS5BY3Rpb24gPSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihGUkFNRV9BQ1RJT05fSERSKSwJICAmRnJhbWUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkqKHBPdXRCdWZmZXIgKyBGcmFtZUxlbikgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOworCUZyYW1lTGVuKys7CisKKwlpZiAoYkFkZEludG9sZXJhbnRDaGEgPT0gVFJVRSkKKwkJSW50b2xlcmFudENoYVJlcExlbiA9IEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAocEFkLCBwT3V0QnVmZmVyICsgRnJhbWVMZW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuICsgSW50b2xlcmFudENoYVJlcExlbik7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBQ1QgLSBTZW5kMjA0MENvZXhpc3RBY3Rpb24oIEJTU0NvZXhpc3QyMDQwID0gMHgleCApICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQpKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwlBZnRlciBzY2FuLCBVcGRhdGUgMjAvNDAgQlNTIENvZXhpc3RlbmNlIElFIGFuZCBzZW5kIG91dC4KKwlBY2NvcmRpbmcgdG8gODAyLjExbiBEMy4wMyAxMS4xNC4xMAorCisJUGFyYW1ldGVyczoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKK3sKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCU9sZFZhbHVlOworCisJT2xkVmFsdWUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQ7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gPiAwKSB8fCAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA+IDApKQorCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMTsKKworCS8vIE5lZWQgdG8gY2hlY2sgISEhIQorCS8vIEhvdyBTVEEgd2lsbCBzZXQgSW50b2xlcmFudDQwIGlmIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gTm93IHdlIGRvbid0IHNldCB0aGlzIGJpdCBmaXJzdC4hISEhIQorCS8vIFNvIE9ubHkgY2hlY2sgQlNTMjBXaWR0aFJlcSBjaGFuZ2UuCisJaWYgKE9sZFZhbHVlLmZpZWxkLkJTUzIwV2lkdGhSZXEgIT0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSkKKwl7CisJCVNlbmQyMDQwQ29leGlzdEFjdGlvbihwQWQsIFdjaWQsIGJBZGRJbnRvbGVyYW50Q2hhKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSkKK3sKKwlVQ0hBUgkJaTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoKE5ld0NoYW5uZWwgPiA3KSAmJiAoU2Vjb25kYXJ5ID09IDEpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoKE5ld0NoYW5uZWwgPCA1KSAmJiAoU2Vjb25kYXJ5ID09IDMpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyAwLiBDaGVjayBpZiBuZXcgY2hhbm5lbCBpcyBpbiB0aGUgY2hhbm5lbGxpc3QuCisJZm9yIChpID0gMDtpIDwgcEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCit7CisJVUNIQVIJCUJCUFZhbHVlID0gMDsKKwlVTE9ORwkJTUFDVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNQRUNUUlVNIC0gQ2hhbm5lbFN3aXRjaEFjdGlvbihOZXdDaGFubmVsID0gJWQgLCBTZWNvbmRhcnkgPSAlZCkgIFxuIiwgTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5KSk7CisKKwlpZiAoQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKHBBZCwgV2NpZCwgTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5KSA9PSBGQUxTRSkKKwkJcmV0dXJuOworCisJLy8gMS4gIFN3aXRjaGVzIHRvIEJXID0gMjAuCisJaWYgKFNlY29uZGFyeSA9PSAwKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCxGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITIwTUh6ICAgISEhIFxuIiApKTsKKwl9CisJLy8gMS4gIFN3aXRjaGVzIHRvIEJXID0gNDAgQW5kIFN0YXRpb24gc3VwcG9ydHMgQlcgPSA0MC4KKwllbHNlIGlmICgoKFNlY29uZGFyeSA9PSAxKSB8fCAoU2Vjb25kYXJ5ID09IDMpKSAmJiAocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gMSkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKworCQlpZiAoU2Vjb25kYXJ5ID09IDEpCisJCXsKKwkJCS8vIFNlY29uZGFyeSBhYm92ZS4KKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgJj0gMHhmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IExvd2VyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBCZWxvdy4gQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTZWNvbmRhcnkgYmVsb3cuCisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICY9IDB4ZmU7CisJCQlNQUNWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MTgpOworCQkJQkJQVmFsdWV8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgyMCk7CisJCQlCQlBWYWx1ZXw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCQl9CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCX0KK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUGVlclB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q6CS8vIEZvcm1hdCBkZWZpbmVkIGluIElFRUUgNy40LjdhLjEgaW4gMTFuIERyYWYzLjAzCisJCQl7CisJCQkJLy9VQ0hBUglCc3NDb2V4aXN0OworCQkJCUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVAkJKnBDb2V4aXN0SW5mbzsKKwkJCQlCU1NfMjA0MF9DT0VYSVNUX0lFIAkJCSpwQnNzQ29leGlzdEllOworCQkJCUJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUCSpwSW50b2xlcmFudFJlcG9ydCA9IE5VTEw7CisKKwkJCQlpZiAoRWxlbS0+TXNnTGVuIDw9IChMRU5HVEhfODAyXzExICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpICkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IEZyYW1lIGxlbmd0aCB0b28gc2hvcnQhIGxlbiA9ICVsZCFcbiIsIEVsZW0tPk1zZ0xlbikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQUNUSU9OIC0gMjAvNDAgQlNTIENvZXhpc3RlbmNlIE1hbmFnZW1lbnQgYWN0aW9uLS0tLT4gXG4iKSk7CisJCQkJaGV4X2R1bXAoIkNvZXhpc3RlbmNlTWdtdEZyYW1lIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCisKKwkJCQlwQ29leGlzdEluZm8gPSAoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UICopICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXTsKKwkJCQkvL2hleF9kdW1wKCJDb2V4aXN0SW5mbyIsIChQVUNIQVIpcENvZXhpc3RJbmZvLCBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7CisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA+PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpICsgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSkpCisJCQkJeworCQkJCQlwSW50b2xlcmFudFJlcG9ydCA9IChCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCAqKSgoUFVDSEFSKXBDb2V4aXN0SW5mbyArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKTsKKwkJCQl9CisJCQkJLy9oZXhfZHVtcCgiSW50b2xlcmFudFJlcG9ydCAiLCAoUFVDSEFSKXBJbnRvbGVyYW50UmVwb3J0LCBzaXplb2YoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQpKTsKKworCQkJCXBCc3NDb2V4aXN0SWUgPSAoQlNTXzIwNDBfQ09FWElTVF9JRSAqKSgmcENvZXhpc3RJbmZvLT5Cc3NDb2V4aXN0SWUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJCQl7CisJCQkJCQlTdGFQdWJsaWNBY3Rpb24ocEFkLCBwQ29leGlzdEluZm8pOworCQkJCQl9CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQl9CisJCQlicmVhazsKKwl9CisKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKK30KKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgQ2F0ZWdvcnk7CisKKwlpZiAoRWxlbS0+TXNnTGVuIDw9IExFTkdUSF84MDJfMTEpCisJeworCQlyZXR1cm47CisJfQorCisJQ2F0ZWdvcnkgPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSY3YgcmVzZXJ2ZWQgY2F0ZWdvcnkoJWQpIEFjdGlvbiBGcmFtZVxuIiwgQ2F0ZWdvcnkpKTsKKwloZXhfZHVtcCgiUmVzZXJ2ZWQgQWN0aW9uIEZyYW1lIiwgJkVsZW0tPk1zZ1swXSwgRWxlbS0+TXNnTGVuKTsKK30KKworVk9JRCBQZWVyUk1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJcmV0dXJuOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgVk9JRCByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlGUkFNRV9IVF9JTkZPCUhUSU5GT2ZyYW1lLCAqcEZyYW1lOworCVVDSEFSICAgCQkqcEFkZHI7CisKKworCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gZ2V0IFJBCisJcEZyYW1lID0gKEZSQU1FX0hUX0lORk8gKikgJkVsZW0tPk1zZ1swXTsKKwlwQWRkciA9IHBGcmFtZS0+SGRyLkFkZHIyOworCisJTmRpc1plcm9NZW1vcnkoJkhUSU5GT2ZyYW1lLCBzaXplb2YoRlJBTUVfSFRfSU5GTykpOworCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJSFRJTkZPZnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlIVElORk9mcmFtZS5BY3Rpb24gPSBIVF9JTkZPX0VYQ0hBTkdFOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uUmVxdWVzdCA9IDA7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5Gb3J0eV9NSHpfSW50b2xlcmFudCA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQ7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5TVEFfQ2hhbm5lbF9XaWR0aAkgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkJJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihGUkFNRV9IVF9JTkZPKSwJJkhUSU5GT2ZyYW1lLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBTZW5kTm90aWZ5QldBY3Rpb25GcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgV2NpZCwKKwlJTiBVQ0hBUiBhcGlkeCkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOworCVVMT05HCQkJRnJhbWVMZW47CisJUFVDSEFSCQkJcEFkZHIxOworCisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCisJCXBBZGRyMSA9ICZCUk9BRENBU1RfQUREUlswXTsKKwllbHNlCisJCXBBZGRyMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcjsKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkZHIxLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCk7CisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IE5PVElGWV9CV19BQ1RJT047CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAorCQkJCSAgRU5EX09GX0FSR1MpOworCisJKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCUZyYW1lTGVuKys7CisKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oTm90aWZ5Qlc9ICVkKSFcbiIsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCkpOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisKK1ZPSUQgUGVlckhUQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBOT1RJRllfQldfQUNUSU9OOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlpZihwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXsKKwkJCQkvLyBOb3RlLCB0aGlzIGlzIHRvIHBhdGNoIERJUi0xMzUzIEFQLiBXaGVuIHRoZSBBUCBzZXQgdG8gV2VwLCBpdCB3aWxsIHVzZSBsZWdhY3kgbW9kZS4gQnV0IEFQIHN0aWxsIGtlZXBzCisJCQkJLy8gc2VuZGluZyBCV19Ob3RpZnkgQWN0aW9uIGZyYW1lLCBhbmQgY2F1c2UgdXMgdG8gbGlua3VwIGFuZCBsaW5rZG93bi4KKwkJCQkvLyBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKKwkJCQkJCQkJRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCWlmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSAwKQkvLyA3LjQuOC4yLiBpZiB2YWx1ZSBpcyAxLCBrZWVwIHRoZSBzYW1lIGFzIHN1cHBvcnRlZCBjaGFubmVsIGJhbmR3aWR0aC4KKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU01QU19BQ1RJT046CisJCQkvLyA3LjMuMS4yNQorIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gU01QUyBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJCWlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MSkgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfRU5BQkxFOworCQkJfQorCQkJZWxzZSBpZiAoKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSYweDIpID09IDApKQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX1NUQVRJQzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19EWU5BTUlDOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFpZCglZCkgTUlNTyBQUyA9ICVkXG4iLCBFbGVtLT5XY2lkLCBwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlKSk7CisJCQkvLyBydDI4NjBjIDogYWRkIHNvbWV0aGluZyBmb3Igc21wcyBjaGFuZ2UuCisJCQlicmVhazsKKworCQljYXNlIFNFVFBDT19BQ1RJT046CisJCQlicmVhazsKKworCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQkJYnJlYWs7CisKKwkJY2FzZSBIVF9JTkZPX0VYQ0hBTkdFOgorCQkJeworCQkJCUhUX0lORk9STUFUSU9OX09DVEVUCSpwSFRfaW5mbzsKKworCQkJCXBIVF9pbmZvID0gKEhUX0lORk9STUFUSU9OX09DVEVUICopICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXTsKKyAgICAJCQkJLy8gNy40LjguMTAKKyAgICAJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBIVCBJbmZvcm1hdGlvbiBFeGNoYW5nZSBhY3Rpb24tLS0tPiBcbiIpKTsKKyAgICAJCQkJaWYgKHBIVF9pbmZvLT5SZXF1ZXN0KQorICAgIAkJCQl7CisgICAgCQkJCQlyZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbihwQWQsIEVsZW0pOworICAgIAkJCQl9CisJCQl9CisgICAgCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZCSpwRW50cnk7CisJSU5UCQkJaSwgdG90YWw7CisvLwlGUkFNRV9CQVIJCQlGcmFtZUJhcjsKKy8vCVVMT05HCQkJRnJhbWVMZW47CisvLwlORElTX1NUQVRVUyAJTlN0YXR1czsKKy8vCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworLy8JVVNIT1JUCQkJU2VxdWVuY2U7CisJVUNIQVIJCQlUSUQ7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJdG90YWwgPSBwQWQtPk1hY1RhYi5TaXplICogTlVNX09GX1RJRDsKKworCWZvciAoaSA9IDE7ICgoaSA8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpICYmICh0b3RhbCA+IDApKSA7IGkrKykKKwl7CisJCWlmICAocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWRdOworCQkJVElEID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uVElEOworCisJCQlBU1NFUlQocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKKwkJfQorCQl0b3RhbCAtLTsKKwl9Cit9CisKKworVk9JRCBTZW5kUmVmcmVzaEJBUigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSkKK3sKKwlGUkFNRV9CQVIJCUZyYW1lQmFyOworCVVMT05HCQkJRnJhbWVMZW47CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJVVNIT1JUCQkJU2VxdWVuY2U7CisJVUNIQVIJCQlpLCBUSUQ7CisJVVNIT1JUCQkJaWR4OworCUJBX09SSV9FTlRSWQkqcEJBRW50cnk7CisKKwlmb3IgKGkgPSAwOyBpIDxOVU1fT0ZfVElEOyBpKyspCisJeworCQlpZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W2ldOworCQlpZiAoaWR4ID09IDApCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2lkeF07CisKKwkJaWYgIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJCVRJRCA9IHBCQUVudHJ5LT5USUQ7CisKKwkJCUFTU0VSVChwQkFFbnRyeS0+V2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKKworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCVNlcXVlbmNlID0gcEVudHJ5LT5UeFNlcVtUSURdOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCS8vaWYgKCEoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpKQorCQkJaWYgKDEpCS8vIE5vdyB3ZSBhbHdheXMgc2VuZCBCQVIuCisJCQl7CisJCQkJLy9NaW5pcG9ydE1NUmVxdWVzdFVubG9jayhwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCX0KKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQWN0SGVhZGVySW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFBVQ0hBUiBBZGRyMSwKKyAgICBJTiBQVUNIQVIgQWRkcjIsCisgICAgSU4gUFVDSEFSIEFkZHIzKQoreworICAgIE5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKyAgICBwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOworICAgIHBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQUNUSU9OOworCisgICAgQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBBZGRyMSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBBZGRyMik7CisgICAgQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBBZGRyMyk7Cit9CisKK1ZPSUQgQmFySGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwU0EpCit7CisvLwlVU0hPUlQJRHVyYXRpb247CisKKwlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKKyAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOworCisKKwlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCisJCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKQoreworCVVMT05HIFRlbXBMZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkmQWN0Q29kZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BQ1RJT05fSF9fCisjZGVmaW5lCV9fQUNUSU9OX0hfXworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19IVF9JTkZPX09DVEVUCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlc2VydmVkOjU7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisjZWxzZQorCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOworCVVDSEFSCVJlc2VydmVkOjU7CisjZW5kaWYKK30gSFRfSU5GT1JNQVRJT05fT0NURVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTworeworCUhFQURFUl84MDJfMTEgICAJCUhkcjsKKwlVQ0hBUgkJCQkJQ2F0ZWdvcnk7CisJVUNIQVIJCQkJCUFjdGlvbjsKKwlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOworfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKKworI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhZGRiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTc5OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKKyNkZWZpbmUgQkFfT1JJX0lOSVRfU0VRCQkocEVudHJ5LT5UeFNlcVtUSURdKSAvLzEJCQkvLyBpbml0YWwgc2VxdWVuY2UgbnVtYmVyIG9mIEJBIHNlc3Npb24KKworI2RlZmluZSBPUklfU0VTU0lPTl9NQVhfUkVUUlkJOAorI2RlZmluZSBPUklfQkFfU0VTU0lPTl9USU1FT1VUCSgyMDAwKQkvLyBtcworI2RlZmluZSBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQJKDEwMDApCS8vIG1zCisKKyNkZWZpbmUgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkJKCgxMDAgKiBIWikvMTAwMCkJLy8gc3lzdGVtIHRpY2tzIC0tIDEwMCBtcworI2RlZmluZSBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkoKDMwMDAgKiBIWikvMTAwMCkJLy8gc3lzdGVtIHRpY2tzIC0tIDEwMCBtcworCisjZGVmaW5lIFJFU0VUX1JDVl9TRVEJCSgweEZGRkYpCisKK3N0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKTsKKworCitCQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKKworVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCk7CisKKyNkZWZpbmUgQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQoX3BBZCwgX21wZHVfYmxrKQlcCisJCQlBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChfcEFkLCBfbXBkdV9ibGspOworCitWT0lEIEJBX01heFdpblNpemVSZWFzaWduKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeVBlZXIsCisJT1VUIFVDSEFSCQkJKnBXaW5TaXplKQoreworCVVDSEFSIE1heFNpemU7CisKKworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTikgLy8gMyozCisJeworCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18zMDcwX1ZFUlNJT04pCisJCXsKKwkJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJCWVsc2UKKwkJCQlNYXhTaXplID0gMTM7CisJCX0KKwkJZWxzZQorCQkJTWF4U2l6ZSA9IDMxOworCX0KKwllbHNlIGlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04pIC8vIDI4ODAgZQorCXsKKwkJaWYgKHBFbnRyeVBlZXItPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCWVsc2UKKwkJCU1heFNpemUgPSAxMzsKKwl9CisJZWxzZQorCQlNYXhTaXplID0gNzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiBXaW4gU2l6ZSA9ICVkLCBNYXggU2l6ZSA9ICVkXG4iLAorCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7CisKKwlpZiAoKCpwV2luU2l6ZSkgPiBNYXhTaXplKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IHJlYXNzaWduIG1heCB3aW4gc2l6ZSBmcm9tICVkIHRvICVkXG4iLAorCQkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJCSpwV2luU2l6ZSA9IE1heFNpemU7CisJfQorfQorCit2b2lkIEFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KElOIFBSVE1QX0FEQVBURVIJCQlwQWQsCisJCQkJCQkJCUlOIHN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm1wZHUpCit7CisJUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7CisKKwlwUGFja2V0ID0gbXBkdS0+cFBhY2tldDsKKworCWlmIChtcGR1LT5iQU1TRFUpCisJeworCQlBU1NFUlQoMCk7CisJCUJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKHBBZCwgcFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCS8vCisJCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCQkvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisvKgorICogSW5zZXJ0IGEgcmVvcmRlcmluZyBtcGR1IGludG8gc29ydGVkIGxpbmtlZCBsaXN0IGJ5IHNlcXVlbmNlIG5vLgorICovCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdSkKK3sKKworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKipwcFNjYW4gPSAmbGlzdC0+bmV4dDsKKworCXdoaWxlICgqcHBTY2FuICE9IE5VTEwpCisJeworCQlpZiAoU0VRX1NNQUxMRVIoKCpwcFNjYW4pLT5TZXF1ZW5jZSwgbXBkdS0+U2VxdWVuY2UsIE1BWFNFUSkpCisJCXsKKwkJCXBwU2NhbiA9ICYoKnBwU2NhbiktPm5leHQ7CisJCX0KKwkJZWxzZSBpZiAoKCpwcFNjYW4pLT5TZXF1ZW5jZSA9PSBtcGR1LT5TZXF1ZW5jZSkKKwkJeworCQkJLyogZ2l2ZSB1cCB0aGlzIGR1cGxpY2F0ZWQgZnJhbWUgKi8KKwkJCXJldHVybihGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBmaW5kIHBvc2l0aW9uICovCisJCQlicmVhazsKKwkJfQorCX0KKworCW1wZHUtPm5leHQgPSAqcHBTY2FuOworCSpwcFNjYW4gPSBtcGR1OworCWxpc3QtPnFsZW4rKzsKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJhX2VucXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJbGlzdC0+cWxlbisrOworCW1wZHVfYmxrLT5uZXh0ID0gbGlzdC0+bmV4dDsKKwlsaXN0LT5uZXh0ID0gbXBkdV9ibGs7Cit9CisKKy8qCisgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKiBiYV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGsgPSBOVUxMOworCisJQVNTRVJUKGxpc3QpOworCisJCWlmIChsaXN0LT5xbGVuKQorCQl7CisJCQlsaXN0LT5xbGVuLS07CisJCQltcGR1X2JsayA9IGxpc3QtPm5leHQ7CisJCQlpZiAobXBkdV9ibGspCisJCQl7CisJCQkJbGlzdC0+bmV4dCA9IG1wZHVfYmxrLT5uZXh0OworCQkJCW1wZHVfYmxrLT5uZXh0ID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtcGR1X2JsazsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgICpiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXJldHVybihiYV9kZXF1ZXVlKGxpc3QpKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgICpiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKKwl7CisJQVNTRVJUKGxpc3QpOworCisJCXJldHVybihsaXN0LT5uZXh0KTsKKwl9CisKKworLyoKKyAqIGZyZWUgYWxsIHJlc291cmNlIGZvciByZW9yZGVyaW5nIG1lY2hhbmlzbQorICovCit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQV9UQUJMRSAgICAgICAgKlRhYjsKKwlQQkFfUkVDX0VOVFJZICAgcEJBRW50cnk7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJaW50IGk7CisKKwlUYWIgPSAmcEFkLT5CQVRhYmxlOworCisJLyogSS4gIHJlbGVhc2UgYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBwYWNrZXQgKi8KKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlwQkFFbnRyeSA9ICZUYWItPkJBUmVjRW50cnlbaV07CisJCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKKwkJeworCQkJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQkJeworCQkJCUFTU0VSVChtcGR1X2Jsay0+cFBhY2tldCk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIG1wZHVfYmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQkJfQorCQl9CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCS8qIElJLiBmcmVlIG1lbW9yeSBvZiByZW9yZGVyaW5nIG1wZHUgdGFibGUgKi8KKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Cit9CisKKworCisvKgorICogQWxsb2NhdGUgYWxsIHJlc291cmNlIGZvciByZW9yZGVyaW5nIG1lY2hhbmlzbQorICovCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSkKK3sKKwlpbnQgICAgIGk7CisJUFVDSEFSICBtZW07CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqZnJlZWxpc3Q7CisKKwkvKiBhbGxvY2F0ZSBzcGlubG9jayAqLworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisKKwkvKiBpbml0aWFsaXplIGZyZWVsaXN0ICovCisJZnJlZWxpc3QgPSAmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0OworCWZyZWVsaXN0LT5uZXh0ID0gTlVMTDsKKwlmcmVlbGlzdC0+cWxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSAlZCBtZW1vcnkgZm9yIEJBIHJlb3JkZXJpbmdcbiIsIChVSU5UMzIpKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKSk7CisKKwkvKiBhbGxvY2F0ZSBudW1iZXIgb2YgbXBkdV9ibGsgbWVtb3J5ICovCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtZW0sIChudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSk7CisKKwlwQWQtPm1wZHVfYmxrX3Bvb2wubWVtID0gbWVtOworCisJaWYgKG1lbSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBCQSBSZW9yZGVyaW5nXG4iKSk7CisJCXJldHVybihGQUxTRSk7CisJfQorCisJLyogYnVpbGQgbXBkdV9ibGsgZnJlZSBsaXN0ICovCisJZm9yIChpPTA7IGk8bnVtOyBpKyspCisJeworCQkvKiBnZXQgbXBkdV9ibGsgKi8KKwkJbXBkdV9ibGsgPSAoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKSBtZW07CisJCS8qIGluaXRpYWwgbXBkdV9ibGsgKi8KKwkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CisJCS8qIG5leHQgbXBkdV9ibGsgKi8KKwkJbWVtICs9IHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KTsKKwkJLyogaW5zZXJ0IG1wZHVfYmxrIGludG8gZnJlZWxpc3QgKi8KKwkJYmFfZW5xdWV1ZShmcmVlbGlzdCwgbXBkdV9ibGspOworCX0KKworCXJldHVybihUUlVFKTsKK30KKworLy9zdGF0aWMgaW50IGJsa19jb3VudD0wOyAvLyBzYW1wbGUgdGFrZSBvZmYsIG5vIHVzZQorCitzdGF0aWMgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfbXBkdV9ibGtfYWxsb2MoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisJbXBkdV9ibGsgPSBiYV9kZXF1ZXVlKCZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3QpOworCWlmIChtcGR1X2JsaykKKwl7CisvLwkJYmxrX2NvdW50Kys7CisJCS8qIHJlc2V0IG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisJcmV0dXJuIG1wZHVfYmxrOworfQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKK3sKKwlBU1NFUlQobXBkdV9ibGspOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworLy8JYmxrX2NvdW50LS07CisJYmFfZW5xdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0LCBtcGR1X2Jsayk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKK3N0YXRpYyBVU0hPUlQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcigKKwkJCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKKwkJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU3RhcnRTZXEpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVVNIT1JUICBMYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJeworCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoIVNFUV9TVEVQT05FKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU3RhcnRTZXEsIE1BWFNFUSkpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKKwkJLyogbW92ZSB0byBuZXh0IHNlcXVlbmNlICovCisJCQlTdGFydFNlcSA9IG1wZHVfYmxrLT5TZXF1ZW5jZTsKKwkJTGFzdEluZFNlcSA9IFN0YXJ0U2VxOworCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJLyogdXBkYXRlIGxhc3QgaW5kaWNhdGVkIHNlcXVlbmNlICovCisJcmV0dXJuIExhc3RJbmRTZXE7Cit9CisKK3N0YXRpYyB2b2lkIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKAorCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJICAgSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKKwkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTZXF1ZW5jZSkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKChtcGR1X2Jsay0+U2VxdWVuY2UgPT0gU2VxdWVuY2UpIHx8IFNFUV9TTUFMTEVSKG1wZHVfYmxrLT5TZXF1ZW5jZSwgU2VxdWVuY2UsIE1BWFNFUSkpCisJCXsKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOworCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKKwkJCS8qIGZyZWUgbXBkdV9ibGsgKi8KKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKwkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKK30KKworCitzdGF0aWMgdm9pZCBiYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMoCisJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCSAgIFBCQV9SRUNfRU5UUlkgICAgICAgcEJBRW50cnkpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKQorCXsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQlBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChwQWQsIG1wZHVfYmxrKTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IG1wZHVfYmxrLT5TZXF1ZW5jZTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisKKwkJLyogdXBkYXRlIGxhc3QgaW5kaWNhdGVkIHNlcXVlbmNlICovCisJfQorCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKK30KKworCisvL3N0YXRpYwordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCisJCQkJCQkJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCUlOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQlJTiBVTE9ORyAgICAgICAgICAgIE5vdzMyKQorCit7CisJVVNIT1JUIFNlcXVlbmNlOworCisvLwlpZiAoKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcitSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAoKHBCQUVudHJ5LT5CQVdpblNpemUqNykvOCkpKSAvL3x8CisvLwkJKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoMTAqUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorLy8JCSAocEJBRW50cnktPmxpc3QucWxlbiA+IChwQkFFbnRyeS0+QkFXaW5TaXplLzgpKSkKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVC82KSkpCisJCSAmJihwQkFFbnRyeS0+bGlzdC5xbGVuID4gMSkKKwkJKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0aW1lb3V0WyVkXSAoJTA4bHgtJTA4bHggPSAlZCA+ICVkKTogJXgsIGZsdXNoIGFsbCFcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJZWxzZQorCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkKKwkJJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKQorCSAgICkKKwkJeworICAgIAkJLy8KKwkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKKyAgICAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCS8vCisgICAgCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cworICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKKyAgICAJCXsKKyAgICAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJfQorCisJfQorI2lmIDAKKwllbHNlIGlmICgKKwkJCSAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorCQkJICAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpKQorCQkJKQorCQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXhcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQkJfQorI2VuZGlmCit9CisKKworLyoKKyAqIGdlbmVyYXRlIEFEREJBIHJlcXVlc3QgdG8KKyAqIHNldCB1cCBCQSBhZ3JlZW1lbnQKKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgSU4gVUNIQVIgICAgICAgICAgICBUSUQsCisJCQkJCSAgSU4gVVNIT1JUICAgICAgICAgICBUaW1lT3V0LAorCQkJCQkgIElOIFVMT05HICAgICAgICAgICAgRGVsYXlUaW1lLAorCQkJCQkgIElOIEJPT0xFQU4gICAgICAgICAgaXNGb3JjZWQpCisKK3sKKwkvL01MTUVfQUREQkFfUkVRX1NUUlVDVAlBZGRiYVJlcTsKKwlCQV9PUklfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkgICYmICAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCQlyZXR1cm47CisKKwkvLyBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLgorCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKKwkJcmV0dXJuOworCisJaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCXsKKwkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCQlEZWxheVRpbWUgPSAzMDAwOworLy8JCXByaW50aygiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpOworLy8JCXJldHVybjsKKwl9CisKKworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJeworCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9CisKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQorCXsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKKworCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOworCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VElEID0gVElEOworCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OworCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKworCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKKwl7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOworCX0KKwllbHNlCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Cit9CisKK1ZPSUQgQkFPcmlTZXNzaW9uQWRkKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQoreworCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIFRJRDsKKwlVU0hPUlQgICAgICAgIElkeDsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKwlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCisJeworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOworCisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7CisJCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvL3BGcmFtZS0+VGltZU91dFZhbHVlOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX0ZVTkNUSU9OX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwKKwkJCQkJCQkJIHBCQUVudHJ5LT5CQVdpblNpemUsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpKTsKKworCQkvLyBTRU5EIEJBUiA7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gQkFPcmlTZXNzaW9uQWRkKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOwkvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jdGlvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQkFFbnRyeS0+U2VxdWVuY2U7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBCQUVudHJ5LT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyMiwgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksICAgICAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCisKKwkJaWYgKHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpCisJCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKTsgLy8gaW4gbVNlYworCX0KK30KKworQk9PTEVBTiBCQVJlY1Nlc3Npb25BZGQoCisJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgIElOIFBGUkFNRV9BRERCQV9SRVEgcEZyYW1lKQoreworCUJBX1JFQ19FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgU3RhdHVzID0gVFJVRTsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OworCVVDSEFSICAgICAgICAgICAgICAgICAgIFRJRDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCQVdpblNpemU7CisJLy9VSU5UMzIgICAgICAgICAgICAgICAgICBWYWx1ZTsKKwkvL1VJTlQgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKworCisJQVNTRVJUKHBFbnRyeSk7CisKKwkvLyBmaW5kIFRJRAorCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKKworCUJBV2luU2l6ZSA9IG1pbigoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisKKwkvLyBJbnRlbCBwYXRjaAorCWlmIChCQVdpblNpemUgPT0gMCkKKwl7CisJCUJBV2luU2l6ZSA9IDY0OworCX0KKworCUlkeCA9IHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXTsKKworCisJaWYgKElkeCA9PSAwKQorCXsKKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NSZWNFbnRyeShwQWQsICZJZHgpOworCX0KKwllbHNlCisJeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAorCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAocEJBRW50cnkgIT0gTlVMTCkKKwl7CisJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCisJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IEJBV2luU2l6ZTsKKwkJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwkJcEJBRW50cnktPlRJRCA9IFRJRDsKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7CisJCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisKKwkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDE8PFRJRCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+UkVDQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksIFRSVUUpOworCQl9CisKKyNpZiAwCS8vIGZvciBkZWJ1Z2dpbmcKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKTsKKyNlbmRpZgorCisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOworCisJCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KKwkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJfQorCXJldHVybihTdGF0dXMpOworfQorCisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKKwl7CisJCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwkJZ290byBkb25lOworCX0KKworCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQorCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKKwkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CisJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKKwkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKwkJCSpJZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvbmU6CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCXJldHVybiBwQkFFbnRyeTsKK30KKworCitWT0lEIEJBVGFibGVGcmVlT3JpRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOworCisJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBRW50cnktPlRva2VuID0gMDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKKwlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQorCXsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKKwkJeworCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCisJCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKyNpZiAxCisJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCX0KKwlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKKworCWlmIChiUGFzc2l2ZSkKKwl7CisJCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7CisJfQorfQorCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKK3sKKwlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOworCisKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7CisJLy8KKwkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KKwkvLworCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlCT09MRUFOIAkJCQlDYW5jZWxsZWQ7CisJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkvL1VMT05HICAgb2Zmc2V0OworCQkvL1VJTlQzMiAgVkFMVUU7CisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKKwkJLy8KKwkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKKyNpZiAxCisJCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJa2ZyZWUoRWxlbSk7CisjZWxzZQorCQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCQl9CisKKworCQkvLworCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KKwkJLy8KKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSAwOworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpKSk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7CisKKwkJUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhwQWQsIFdjaWQsIFRJRCk7CisKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJfQorCisJQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7Cit9CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxOVU1fT0ZfVElEOyBpKyspCisJeworCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7CisJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisKKwlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpCisJeworCQlNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICAgQWRkYmFSZXE7CisKKwkJTmRpc1plcm9NZW1vcnkoJkFkZGJhUmVxLCBzaXplb2YoQWRkYmFSZXEpKTsKKwkJQ09QWV9NQUNfQUREUihBZGRiYVJlcS5wQWRkciwgcEVudHJ5LT5BZGRyKTsKKwkJQWRkYmFSZXEuV2NpZCA9IChVQ0hBUikocEVudHJ5LT5BaWQpOworCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OworCQlBZGRiYVJlcS5UaW1lT3V0VmFsdWUgPSAwOworCQlBZGRiYVJlcS5Ub2tlbiA9IHBCQUVudHJ5LT5Ub2tlbjsKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkFkZGJhUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIE9yaSBTZXNzaW9uIFRpbWVvdXQoJWQpIDogU2VuZCBBREQgQkEgYWdhaW5cbiIsIHBCQUVudHJ5LT5Ub2tlbikpOworCisJCXBCQUVudHJ5LT5Ub2tlbisrOworCQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBPUklfQkFfU0VTU0lPTl9USU1FT1VUKTsKKwl9CisJZWxzZQorCXsKKwkJQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0pOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQVJlY1Nlc3Npb25JZGxlVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gKEJBX1JFQ19FTlRSWSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSICAgcEFkOworCVVMT05HICAgICAgICAgICBOb3czMjsKKworCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCisJCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKyBSRUNfQkFfU0VTU0lPTl9JRExFX1RJTUVPVVQpKSkKKwkJeworCQkJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcHJpbnRrKCIlbGQ6IFJFQyBCQSBzZXNzaW9uIFRpbWVvdXRcbiIsIE5vdzMyKTsKKwkJfQorCX0KK30KKworCitWT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvLwk3LjQuNC4xCisJLy9VTE9ORwlJZHg7CisJVUNIQVIgICBTdGF0dXMgPSAxOworCVVDSEFSICAgcEFkZHJbNl07CisJRlJBTUVfQUREQkFfUlNQIEFERGZyYW1lOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVBGUkFNRV9BRERCQV9SRVEgIHBBZGRyZXFGcmFtZSA9IE5VTEw7CisJLy9VQ0hBUgkJQnVmU2l6ZTsKKwlVTE9ORyAgICAgICBGcmFtZUxlbjsKKwlQVUxPTkcgICAgICBwdGVtcDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJBZGRCQVJlcSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCS8vQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisKKwlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKKwl7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKKwkJeworCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOworCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQkJCVN0YXR1cyA9IDA7CisJCQllbHNlCisJCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisJCX0KKwkJZWxzZQorCQl7CisJCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCX0KKwl9CisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQorCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKKworCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNEbHMpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKKwlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47CisJLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOworCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKKwlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCisJeworCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OworCX0KKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCisJKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7CisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKKwkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKK30KKworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQlJZHgsIGk7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKKwkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCisJLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJQZWVyQWRkQkFSc3BBY3Rpb24oKSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCWlmIChQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JTUCkoJkVsZW0tPk1zZ1swXSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOworCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkKKwkJeworCQkJY2FzZSAwOgorCQkJCS8vIEkgd2FudCBhIEJBc2Vzc2lvbiB3aXRoIHRoaXMgcGVlciBhcyBhbiBvcmlnaW5hdG9yLgorCQkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwRnJhbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvLyBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8KKwkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIEVsZW0tPldjaWQsIHBGcmFtZS0+QmFQYXJtLlRJRCwgVFJVRSwgRkFMU0UpOworCQkJCWJyZWFrOworCQl9CisJCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKKwkJaWYgKChwRnJhbWUtPlN0YXR1c0NvZGUgPT0gMzcpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgICAgICAgICB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIFNUQV9UR05fV0lGSV9PTihwQWQpICYmIChwRnJhbWUtPlN0YXR1c0NvZGUgIT0gMCkpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uQkFEZWNsaW5lQml0bWFwIHw9IDE8PHBGcmFtZS0+QmFQYXJtLlRJRDsKKwkJfQorCX0KK30KKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy9VQ0hBUgkJCQlJZHg7CisJLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOworCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOworCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKKwkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOworCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJfQorCX0KK30KKworCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKwkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCisJCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCit7CisJUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7CisJUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKKwkvL0JPT0xFQU4gCVJlc3VsdDsKKwlVTE9ORyAgIElkeDsKKwkvL1VDSEFSCU51bVJ4UGt0OworCVVDSEFSCVRJRDsvLywgaTsKKworCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCisJCXsKKwkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQl9CisJCWVsc2UKKwkJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCisJaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCisJeworCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCX0KKwkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCBQU01QIEFjdGlvbiBmcmFtZSBJZiBQU01QIG1vZGUgc3dpdGNoZXMuCisqLworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwkJCQkgICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJCQkJICAgSU4gVUNIQVIJCQkJV2NpZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlQc21wKQoreworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwkvL1VMT05HICAgICAgICAgICBJZHg7CisJRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOworCXN3aXRjaCAoUHNtcCkKKwl7CisJCWNhc2UgTU1QU19FTkFCTEU6CisJCQlGcmFtZS5Qc21wID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfRFlOQU1JQzoKKwkJCUZyYW1lLlBzbXAgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19TVEFUSUM6CisJCQlGcmFtZS5Qc21wID0gMTsKKwkJCWJyZWFrOworCX0KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Cit9CisKKworI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUglDaGFubmVsTnVtYmVyOworCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKKwlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKKwlVQ0hBUglNZWFzdXJlbWVudE1vZGU7CisJVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOworCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKKwlVQ0hBUglUaHJlc2hvbGQ7CisJVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCit9IEJFQUNPTl9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglJRDsKKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJVG9rZW47CisJVUNIQVIJUmVxdWVzdE1vZGU7CisJVUNIQVIJVHlwZTsKK30gTUVBU1VSRU1FTlRfUkVROworCisKKworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBrdDsKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisKKwkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCisJLy8gMi4gcmVtb3ZlIExMQworCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKKwkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT50YWlsID0gUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSArIFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQorCS8vCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIExJTlVYCisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisjaWZkZWYgVUNPUworCQkJTmRpc01vdmVNZW1vcnkobmV0X3BrdF9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCisJZG8JCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWVsc2UJCQkJCQkJCQkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsKKworCisKK3N0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKworCW1wZHVfYmxrID0gYmFfbXBkdV9ibGtfYWxsb2MocEFkKTsKKwlpZiAobXBkdV9ibGsgIT0gTlVMTCkKKwl7CisJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOworCisJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisgICAgICAgIC8vCisJCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCisJCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KKwkJLy8KKwkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKKwkJeworCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0CisJCQkvLyBkb24ndCBpbmRpY2F0ZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKworCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl9CisJZWxzZQorCXsKKyNpZiAwCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkOiVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBibGtfY291bnQsIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZW5kaWYKKwkJLyoKKwkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgorCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KKwkJICovCisJCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGUgdGhpcyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgcHV0IGl0IGludG8gcmVvcmRlcmluZyBidWZmZXIKKworCVBhcmFtZXRyczoKKwkJcFJ4QmxrICAgICAgICAgOiBjYXJyeSBuZWNlc3NhcnkgcGFja2V0IGluZm8gODAyLjExIGZvcm1hdAorCQlGcm9tV2hpY2hCU1NJRCA6IHRoZSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB3aGljaCBCU1MKKworCVJldHVybgk6CisJCQkgIG5vbmUKKworCU5vdGUgICAgOgorCSAgICAgICAgICB0aGUgcGFja2V0IHF1ZXVlZCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyIG5lZWQgdG8gY292ZXIgdG8gODAyLjMgZm9ybWF0CisJCQkgIG9yIHByZV9BTVNEVSBmb3JtYXQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVU0hPUlQJCQkJSWR4OworCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCVVMT05HCQkJCU5vdzMyOworCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKworCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCisJeworI2lmIDAgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKwkJc3RhdGljIGludCBlcnJfc2l6ZTsKKworCQllcnJfc2l6ZSsrOworCQlpZiAoZXJyX3NpemUgPiAyMCkgeworCQkJIHByaW50aygiQU1QRFUgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4xMSBIZWFkZXIiLCAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIsIDI0KTsKKwkJCSBoZXhfZHVtcCgiUGF5bG9hZCIsIHBSeEJsay0+cERhdGEsIDY0KTsKKwkJCSBlcnJfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisKKyNpZiAwIC8vIHRlc3QKKwkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCX0KKwllbHNlCisJeworCQkvLyBpbXBvc3NpYmxlICEhIQorCQlBU1NFUlQoMCk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQocEJBRW50cnkpOworCisJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKKworCisJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCS8vCisJLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQorCS8vCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCisJeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCisJCS8vIHJlc2V0IHJjdiBzZXF1ZW5jZSBvZiBCQSBzZXNzaW9uCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKworCisJLy8KKwkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KKwkvLworCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCQlVU0hPUlQgIExhc3RJbmRTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisgCQlMYXN0SW5kU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChMYXN0SW5kU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gTGFzdEluZFNlcTsKKwkJfQorCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJLy8KKwkvLyBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKKwl7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCS8vCisJLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgorCS8vCisJZWxzZQorCXsKKyNpZiAwCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisjZWxzZQorCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisKKworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKKwkJaWYgKFRtcFNlcSA8IDApCisJCXsKKwkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7CisJCX0KKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CisJCX0KKyNlbmRpZgorCX0KK30KKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc3YThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMCwwICsxLDI3MzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKKworVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OworLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0CitVQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKK1VDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKK1VDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07CitVQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCisKK1VDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OworVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OworVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLyAJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKKwkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKwkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKworVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQorCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK307CisKK1VDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7CisJMCwgIDAsCTAsICAwLAorCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CitVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCisJUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKKworY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKKworVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OworLy9VQ0hBUiBkZWZhdWx0X2N3bWF4W109e0NXX01BWF9JTl9CSVRTLCBDV19NQVhfSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTF9OworVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CisKK1VDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCisJb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlMZW5ndGgpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSAJCUZyZWVOdW07CisJVUNIQVIJCQlJcnFTdGF0ZTsKKwlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJUXVlSWR4PTM7CisKKwkvLyAyODYwQyB1c2UgVHggUmluZworCisJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKworCWRvCisJeworCQkvLyBSZXNldCBpcyBpbiBwcm9ncmVzcywgc3RvcCBpbW1lZGlhdGVseQorCQlpZiAoIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCSBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCl8fAorCQkJICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBDaGVjayBGcmVlIHByaW9yaXR5IHF1ZXVlCisJCS8vIFNpbmNlIHdlIHVzZSBQQkYgUXVldWUyIGZvciBtYW5hZ2VtZW50IGZyYW1lLiAgSXRzIGNvcnJlc3BvbmRpbmcgRE1BIHJpbmcgc2hvdWxkIGJlIHVzaW5nIFR4UmluZy4KKworCQkvLyAyODYwQyB1c2UgVHggUmluZworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlGcmVlTnVtID0gR0VUX01HTVRSSU5HX0ZSRUVOTyhwQWQpOworCQl9CisKKwkJaWYgKChGcmVlTnVtID4gMCkpCisJCXsKKwkJCS8vIFdlIG5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgcnRtcCBoYXJkd2FyZSBoZWFkZXIuIGkuZS4sIFR4V0kgZm9yIFJUMjg2MCBhbmQgVHhJbmZvK1R4V0kgZm9yIFJUMjg3MAorCQkJTmRpc1plcm9NZW1vcnkoJnJ0bXBId0hkciwgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSk7CisJCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJnJ0bXBId0hkciwgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy9wQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJLy9wQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMjsKKworCisJCQlTdGF0dXMgPSBNbG1lSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQrKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIE1nbXRSaW5nLCBNZ210UmluZ0Z1bGxDb3VudD0lbGQhXG4iLAorCQkJCQkJCQkJCVF1ZUlkeCwgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCkpOworCQl9CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKworCXJldHVybiBTdGF0dXM7Cit9CisKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZmZlciAJUG9pbnRlciB0bwltZW1vcnkgb2Ygb3V0Z29pbmcgZnJhbWUKKwkJTGVuZ3RoCQlTaXplIG9mIG91dGdvaW5nIG1hbmFnZW1lbnQgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19QRU5ESU5HCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCQkpCisJeworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCit9CisKKworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcworLy8gc2FtcGxlLCBmb3IgSVJRIExPQ0sgLT4gU0VNIExPQ0sKKy8vCUlycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7CisvLwlpZiAoIUlycVN0YXRlKQorCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKKy8vCQlpZiAoIUlycVN0YXRlKQorCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7CisKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAorCQlNbG1lUmF0ZSA9IFJBVEVfNjsKKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQorCXsKKwkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkpCisJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQorCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0CisJLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCisJLy8KKwkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCWVsc2UKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7CisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQkvL3BBZC0+U2VxdWVuY2UrKzsKKwkJLy9wSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCisJCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSAvLyBNVUxUSUNBU1QsIEJST0FEQ0FTVAorCQl7CisJCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQWNrUmVxdWlyZWQgPSBUUlVFOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7CisJCQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SU1ApCisJCQl7CisJCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisKKwlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlKys7CisJaWYgKHBBZC0+U2VxdWVuY2UgPjB4ZmZmKQorCQlwQWQtPlNlcXVlbmNlID0gMDsKKworCS8vIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcQorCS8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbgorCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKy8vCQlpZiAoIUlycVN0YXRlKQorCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcl84MDJfMTEsIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmCisKKwkvLworCS8vIGZpbGwgc2NhdHRlci1hbmQtZ2F0aGVyIGJ1ZmZlciBsaXN0IGludG8gVFhELiBJbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKKwkvLyBzaG91bGQgYWx3YXlzIGhhcyBvbmx5IG9uZSBvaHlzaWNhbCBidWZmZXIsIGFuZCB0aGUgd2hvbGUgZnJhbWUgc2l6ZSBlcXVhbHMKKwkvLyB0byB0aGUgZmlyc3Qgc2NhdHRlciBidWZmZXIgc2l6ZQorCS8vCisKKwkvLyBJbml0aWFsaXplIFRYIERlc2NyaXB0b3IKKwkvLyBGb3IgaW50ZXItZnJhbWUgZ2FwLCB0aGUgbnVtYmVyIGlzIGZvciB0aGlzIGZyYW1lIGFuZCBuZXh0IGZyYW1lCisJLy8gRm9yIE1MTUUgcmF0ZSwgd2Ugd2lsbCBmaXggYXMgMk1iIHRvIG1hdGNoIG90aGVyIHZlbmRvcidzIGltcGxlbWVudAorLy8JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOworCisvLyBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4KKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwgUElEX01HTVQsIDAsICAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwKKwkJCQkJYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCQkJCTAsIHBNYWNFbnRyeS0+QWlkLCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLAorCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCisJCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCisJCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCisJLy8gTm93IGRvIGhhcmR3YXJlLWRlcGVuZWQga2ljayBvdXQuCisJSEFMX0tpY2tPdXRNZ210VHgocEFkLCBRdWVJZHgsIHBQYWNrZXQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKKworCS8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIE1HTVQgcmluZyByZXNvdXJjZQorLy8JaWYgKCFJcnFTdGF0ZSkKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlOZXcgRGVRdWV1ZSBQcm9jZWR1cmVzLgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREVRVUVVRV9MT0NLKGxvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncykgCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQlSVE1QX0lSUV9MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwkJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgREVRVUVVRV9VTkxPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChiSW50Q29udGV4dCA9PSBGQUxTRSkJCQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygobG9jayksIElycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKworI2lmIDAKK3N0YXRpYyBWT0lEIGR1bXBUeEJsayhUWF9CTEsgKnBUeEJsaykKK3sKKwlORElTX1BBQ0tFVCAqcFBhY2tldDsKKwlpbnQgaSwgZnJhbWVOdW07CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlwcmludGsoIkR1bXAgVFhfQkxLIFN0cnVjdHVyZTpcbiIpOworCXByaW50aygiXHRUeEZyYW1lVHlwZT0lZCFcbiIsIHBUeEJsay0+VHhGcmFtZVR5cGUpOworCXByaW50aygiXHRUb3RhbEZyYW1lTGVuPSVkXG4iLCBwVHhCbGstPlRvdGFsRnJhbWVMZW4pOworCXByaW50aygiXHRUb3RhbEZyYW1lTnVtPSVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcik7CisJcHJpbnRrKCJcdFRvdGFsRnJhZ051bT0lZCFcbiIsIHBUeEJsay0+VG90YWxGcmFnTnVtKTsKKwlwcmludGsoIlx0cFBhY2tldExpc3Q9XG4iKTsKKworCWZyYW1lTnVtID0gcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyOworCisJZm9yKGk9MDsgaSA8IGZyYW1lTnVtOyBpKyspCisJewlpbnQgajsKKwkJVUNIQVIJKnBCdWY7CisKKwkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQlpZiAocFBhY2tldCkKKwkJeworCQkJcEJ1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJCXByaW50aygiXHRcdFslZF06cHRyPTB4JXgsIExlbj0lZCFcbiIsIGksIChVSU5UMzIpKEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSksIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkJCXByaW50aygiXHRcdCIpOworCQkJZm9yIChqID0wIDsgaiA8IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOyBqKyspCisJCQl7CisJCQkJcHJpbnRrKCIlMDJ4ICIsIChwQnVmW2pdICYgMHhmZikpOworCQkJCWlmIChqID09IDE2KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCX0KKwl9CisJcHJpbnRrKCJcdFdjaWQ9JWQhXG4iLCBwVHhCbGstPldjaWQpOworCXByaW50aygiXHRhcGlkeD0lZCFcbiIsIHBUeEJsay0+YXBpZHgpOworCXByaW50aygiLS0tLUVuZE9mRHVtcFxuIik7CisKK30KKyNlbmRpZgorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJVHggUGF0aCBkZXNpZ24gYWxnb3JpdGhtOgorCQlCYXNpY2FsbHksIHdlIGRpdmlkZSB0aGUgcGFja2V0cyBpbnRvIGZvdXIgdHlwZXMsIEJyb2FkY2FzdC9NdWx0aWNhc3QsIDExTiBSYXRlKEFNUERVLCBBTVNEVSwgTm9ybWFsKSwgQi9HIFJhdGUoQVJBTElOSywgTm9ybWFsKSwKKwkJU3BlY2lmaWMgUGFja2V0IFR5cGUuIEZvbGxvd2luZyBzaG93IHRoZSBjbGFzc2lmaWNhdGlvbiBydWxlIGFuZCBwb2xpY3kgZm9yIGVhY2gga2luZHMgb2YgcGFja2V0cy4KKwkJCQlDbGFzc2lmaWNhdGlvbiBSdWxlPT4KKwkJCQkJTXVsdGljYXN0OiAoKmFkZHIxICYgMHgwMSkgPT0gMHgwMQorCQkJCQlTcGVjaWZpYyA6IGJESENQRnJhbWUsIGJBUlBGcmFtZSwgYkVBUE9MRnJhbWUsIGV0Yy4KKwkJCQkJMTFOIFJhdGUgOiBJZiBwZWVyIHN1cHBvcnQgSFQKKwkJCQkJCQkJKDEpLkFNUERVICAtLSBJZiBUWEJBIGlzIG5lZ290aWF0ZWQuCisJCQkJCQkJCSgyKS5BTVNEVSAgLS0gSWYgQU1TRFUgaXMgY2FwYWJsZSBmb3IgYm90aCBwZWVyIGFuZCBvdXJzZWxmLgorCQkJCQkJCQkJCQkqKS4gQU1TRFUgY2FuIGVtYmVkZGVkIGluIGEgQU1QRFUsIGJ1dCBub3cgd2UgZGlkbid0IHN1cHBvcnQgaXQuCisJCQkJCQkJCSgzKS5Ob3JtYWwgLS0gT3RoZXIgcGFja2V0cyB3aGljaCBzZW5kIGFzIDExbiByYXRlLgorCisJCQkJCUIvRyBSYXRlIDogSWYgcGVlciBpcyBiL2cgb25seS4KKwkJCQkJCQkJKDEpLkFSQUxJTkstLSBJZiBib3RoIG9mIHBlZXIvdXMgc3VwcHJvdCBSYWxpbmsgcHJvcHJpZXRhcnkgQWdncmVnYXRpb24gYW5kIHRoZSBUeFJhdGUgaXMgbGFyZ2UgdGhhbiBSQVRFXzYKKwkJCQkJCQkJKDIpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgYi9nIHJhdGUuCisJCQkJCUZyYWdtZW50OgorCQkJCQkJCQlUaGUgcGFja2V0IG11c3QgYmUgdW5pY2FzdCwgTk9UIEEtUkFMSU5LLCBOT1QgQS1NU0RVLCBOT1QgMTFuLCB0aGVuIGNhbiBjb25zaWRlciBhYm91dCBmcmFnbWVudC4KKworCQkJCUNsYXNzaWZpZWQgUGFja2V0IEhhbmRsZSBSdWxlPT4KKwkJCQkJTXVsdGljYXN0OgorCQkJCQkJCQlObyBBQ0ssIAkJLy9wVHhCbGstPmJBY2tSZXF1aXJlZCA9IEZBTFNFOworCQkJCQkJCQlObyBXTU0sIAkJLy9wVHhCbGstPmJXTU0gPSBGQUxTRTsKKwkJCQkJCQkJTm8gcGlnZ3liYWNrLCAgIC8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisJCQkJCVNwZWNpZmljIDoJQmFzaWNhbGx5LCBmb3Igc3BlY2lmaWMgcGFja2V0LCB3ZSBzaG91bGQgaGFuZGxlIGl0IHNwZWNpZmljYWxseSwgYnV0IG5vdyBhbGwgc3BlY2lmaWMgcGFja2V0cyBhcmUgdXNlCisJCQkJCQkJCQl0aGUgc2FtZSBwb2xpY3kgdG8gaGFuZGxlIGl0LgorCQkJCQkJCQlGb3JjZSBMb3dSYXRlLCAgLy9wVHhCbGstPmJGb3JjZUxvd1JhdGUgPSBUUlVFOworCisJCQkJCTExTiBSYXRlIDoKKwkJCQkJCQkJTm8gcGlnZ3liYWNrLAkvL3BUeEJsay0+YlBpZ2d5QmFjayA9IEZBTFNFOworCisJCQkJCQkJCSgxKS5BTVNEVQorCQkJCQkJCQkJcFR4QmxrLT5iV01NID0gVFJVRTsKKwkJCQkJCQkJKDIpLkFNUERVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMykuTm9ybWFsCisKKwkJCQkJQi9HIFJhdGUgOgorCQkJCQkJCQkoMSkuQVJBTElOSworCisJCQkJCQkJCSgyKS5Ob3JtYWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVUNIQVIgVHhQa3RDbGFzc2lmaWNhdGlvbigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCit7CisJVUNIQVIJCQlUeEZyYW1lVHlwZSA9IFRYX1VOS09XTl9GUkFNRTsKKwlVQ0hBUgkJCVdjaWQ7CisJTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQliSFRSYXRlID0gRkFMU0U7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlXY2lkID0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7CisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKKwl7CS8vIEhhbmRsZSBmb3IgUkEgaXMgQnJvYWRjYXN0L011bHRpY2FzdCBBZGRyZXNzLgorCQlyZXR1cm4gVFhfTUNBU1RfRlJBTUU7CisJfQorCisJLy8gSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMKKwlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXTsKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpCisJewkvLyBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUKKwkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWVsc2UgaWYgKElTX0hUX1JBVEUocE1hY0VudHJ5KSkKKwl7CS8vIGl0J3MgYSAxMW4gY2FwYWJsZSBwYWNrZXQKKworCQkvLyBEZXBlbmRzIG9uIEhUUGh5TW9kZSB0byBjaGVjayBpZiB0aGUgcGVlciBzdXBwb3J0IHRoZSBIVFJhdGUgdHJhbnNtaXNzaW9uLgorCQkvLyAJQ3VycmVudGx5IGRpZG4ndCBzdXBwb3J0IEEtTVNEVSBlbWJlZGRlZCBpbiBBLU1QRFUKKwkJYkhUUmF0ZSA9IFRSVUU7CisJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkgfHwgKHBNYWNFbnRyeS0+UHNNb2RlID09IFBXUl9TQVZFKSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKKwkJZWxzZSBpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKyNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCisJCWVsc2UgaWYoKHBNYWNFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDwoUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpKSkpICE9IDApCisJCQlyZXR1cm4gVFhfQU1QRFVfRlJBTUU7CisJCWVsc2UgaWYoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQorCQkJcmV0dXJuIFRYX0FNU0RVX0ZSQU1FOworCQllbHNlCisJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJZWxzZQorCXsJLy8gaXQncyBhIGxlZ2FjeSBiL2cgcGFja2V0LgorCQlpZiAoKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSkgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgJiYKKwkJCShSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYKKwkJCSghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBpZiBwZWVyIHN1cHBvcnQgUmFsaW5rIEFnZ3JlZ2F0aW9uLCB3ZSB1c2UgaXQuCisJCQlUeEZyYW1lVHlwZSA9IFRYX1JBTElOS19GUkFNRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQl9CisJfQorCisJLy8gQ3VycmVudGx5LCBvdXIgZnJhZ21lbnQgb25seSBzdXBwb3J0IHdoZW4gYSB1bmljYXN0IHBhY2tldCBzZW5kIGFzIE5PVC1BUkFMSU5LLCBOT1QtQU1TRFUgYW5kIE5PVC1BTVBEVS4KKwlpZiAoKFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgPiAxKSAmJiAoVHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKSkKKwkJVHhGcmFtZVR5cGUgPSBUWF9GUkFHX0ZSQU1FOworCisJcmV0dXJuIFR4RnJhbWVUeXBlOworfQorCisKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSyAqcFR4QmxrKQoreworCVBBQ0tFVF9JTkZPCQkJUGFja2V0SW5mbzsKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnkgPSBOVUxMOworCisJcFBhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKworCXBUeEJsay0+V2NpZAkgCSAJCT0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7CisJcFR4QmxrLT5hcGlkeAkJIAkJPSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCk7CisJcFR4QmxrLT5Vc2VyUHJpb3JpdHkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKKwlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsJCS8vIEFTSUMgZGV0ZXJtaW5lIEZyYW1lIEdhcAorCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFR4QmxrLT5wUGFja2V0KSkKKwkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKTsKKwllbHNlCisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKTsKKworCS8vIERlZmF1bHQgdG8gY2xlYXIgdGhpcyBmbGFnCisJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKTsKKworCisJaWYgKHBUeEJsay0+V2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsKKwkJcFR4QmxrLT5wTWFjRW50cnkgPSBOVUxMOworCQl7CisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCQkJUFVDSEFSIHBEQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJCWlmICgoKCpwREEgJiAweDAxKSA9PSAweDAxKSAmJiAoKnBEQSAhPSAweGZmKSkKKwkJCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGU7CisJCQllbHNlCisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworCQl9CisKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsJLy8gQWNrUmVxdWlyZWQgPSBGQUxTRSwgd2hlbiBicm9hZGNhc3QgcGFja2V0IGluIEFkaG9jIG1vZGUuCisJCS8vVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZUxvd1JhdGUpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7CisJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkpCisJCXsKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCQl9CisKKwl9CisJZWxzZQorCXsKKwkJcFR4QmxrLT5wTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwVHhCbGstPldjaWRdOworCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwVHhCbGstPnBNYWNFbnRyeS0+SFRQaHlNb2RlOworCisJCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkJLy8gRm9yIGFsbCB1bmljYXN0IHBhY2tldHMsIG5lZWQgQWNrIHVubGVzcyB0aGUgQWNrIFBvbGljeSBpcyBub3Qgc2V0IGFzIE5PUk1BTF9BQ0suCisJCWlmIChwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbcFR4QmxrLT5RdWVJZHhdICE9IE5PUk1BTF9BQ0spCisJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCQllbHNlCisJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKKworCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQl7CisKKwkJCQkvLyBJZiBzdXBwb3J0IFdNTSwgZW5hYmxlIGl0LgorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCisJCQkJCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQorCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7CisJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpCisJCXsKKwkJCWlmICggKFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKHBQYWNrZXQpKSB8fAorICAgICAgICAgICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSBSQVRFXzEpKSkKKwkJCXsJLy8gU3BlY2lmaWMgcGFja2V0LCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lLCBuZWVkIGZvcmNlIGxvdyByYXRlLgorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCS8vIE1vZGlmeSB0aGUgV01NIGJpdCBmb3IgSUNWIGlzc3VlLiBJZiB3ZSBoYXZlIGEgcGFja2V0IHdpdGggRU9TUCBmaWVsZCBuZWVkIHRvIHNldCBhcyAxLCBob3cgdG8gaGFuZGxlIGl0Pz8/CisJCQkJaWYgKElTX0hUX1NUQShwVHhCbGstPnBNYWNFbnRyeSkgJiYKKwkJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKSAmJgorCQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpKQorCQkJCXsKKwkJCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7CisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKCAoSVNfSFRfUkFURShwTWFjRW50cnkpID09IEZBTFNFKSAmJgorCQkJCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKSkpCisJCQl7CS8vIEN1cnJlbnRseSBwaWdneS1iYWNrIG9ubHkgc3VwcG9ydCB3aGVuIHBlZXIgaXMgb3BlcmF0ZSBpbiBiL2cgbW9kZS4KKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCQl9CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9FT1NQKHBQYWNrZXQpKQorCQkJeworCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NX1VBUFNEX0VPU1ApOworCQkJfQorI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJfQorCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0ZSQUdfRlJBTUUpCisJCXsKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKKwkJfQorCisJCXBNYWNFbnRyeS0+RGVidWdUeENvdW50Kys7CisJfQorCisJcmV0dXJuIFRSVUU7CisKK0ZpbGxUeEJsa0VycjoKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworQk9PTEVBTiBDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIE5ESVNfUEFDS0VUICpwUGFja2V0LAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKworCS8vcHJpbnRrKCJDaGVjayBpZiBjYW4gZG8gYWdncmVnYXRpb24hIFR4RnJhbWVUeXBlPSVkIVxuIiwgcFR4QmxrLT5UeEZyYW1lVHlwZSk7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCkgPT0gTUNBU1RfV0NJRCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fAorCQlSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpICYmCisJCSgocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKQorCXsJLy8gRm9yIEFNU0RVLCBhbGxvdyB0aGUgcGFja2V0cyB3aXRoIHRvdGFsIGxlbmd0aCA8IG1heC1hbXNkdSBzaXplCisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJgorCQkocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDIpKQorCXsJLy8gRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guCisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJCXJldHVybiBUUlVFOworCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJcmV0dXJuIEZBTFNFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRvIGRvIHRoZSBlbnF1ZXVlIG9wZXJhdGlvbiBhbmQgZXh0cmFjdCB0aGUgZmlyc3QgaXRlbSBvZiB3YWl0aW5nCisJCWxpc3QuIElmIGEgbnVtYmVyIG9mIGF2YWlsYWJsZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIGNvdWxkIG1lZXQKKwkJdGhlIHJlcXVlc3Qgb2YgZXh0cmFjdGVkIGl0ZW0sIHRoZSBleHRyYWN0ZWQgaXRlbSB3aWxsIGJlIGZyYWdtZW50ZWQKKwkJaW50byBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzLgorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOICAgICAgICAgYkludENvbnRleHQsCisJSU4gIFVDSEFSCQkJUUlkeCwgLyogQnVsa091dFBpcGVJZCAqLworCUlOICBVQ0hBUiAgICAgICAgICAgTWF4X1R4X1BhY2tldHMpCit7CisJUFFVRVVFX0VOVFJZICAgIHBFbnRyeSA9IE5VTEw7CisJUE5ESVNfUEFDS0VUIAlwUGFja2V0OworCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVDSEFSICAgICAgICAgICBDb3VudD0wOworCVBRVUVVRV9IRUFERVIgICBwUXVldWU7CisJVUxPTkcgICAgICAgICAgIEZyZWVOdW1iZXJbTlVNX09GX1RYX1JJTkddOworCVVDSEFSCQkJUXVlSWR4LCBzUUlkeCwgZVFJZHg7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7CisJQk9PTEVBTgkJCWhhc1R4RGVzYyA9IEZBTFNFOworCVRYX0JMSwkJCVR4QmxrOworCVRYX0JMSwkJCSpwVHhCbGs7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwlCT09MRUFOCQkJZmlyc3RSb3VuZDsKKwlSdG1wRGlhZ1N0cnVjdAkqcERpYWdTdHJ1Y3QgPSAmcEFkLT5EaWFnU3RydWN0OworI2VuZGlmCisKKworCWlmIChRSWR4ID09IE5VTV9PRl9UWF9SSU5HKQorCXsKKwkJc1FJZHggPSAwOworCQllUUlkeCA9IDM7CS8vIDQgQUNzLCBzdGFydCBmcm9tIDAuCisJfQorCWVsc2UKKwl7CisJCXNRSWR4ID0gZVFJZHggPSBRSWR4OworCX0KKworCWZvciAoUXVlSWR4PXNRSWR4OyBRdWVJZHggPD0gZVFJZHg7IFF1ZUlkeCsrKQorCXsKKwkJQ291bnQ9MDsKKworCQlSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWZpcnN0Um91bmQgPSAoKFF1ZUlkeCA9PSAwKSA/IFRSVUUgOiBGQUxTRSk7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwkJd2hpbGUgKDEpCisJCXsKKwkJCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCQkJeworCQkJCVJUMjhYWF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChDb3VudCA+PSBNYXhfVHhfUGFja2V0cykKKwkJCQlicmVhazsKKworCQkJREVRVUVVRV9MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJaWYgKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdID09IE5VTEwpCisJCQl7CisjaWZkZWYgREJHX0RJQUdOT1NFCisJCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKKwkJCQkJcERpYWdTdHJ1Y3QtPlR4U1dRdWVDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVswXSsrOworI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCisKKwkJCS8vIHByb2JlIHRoZSBRdWV1ZSBIZWFkCisJCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XTsKKwkJCWlmICgocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQorCQkJeworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwVHhCbGsgPSAmVHhCbGs7CisJCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKXBUeEJsaywgc2l6ZW9mKFRYX0JMSykpOworCQkJLy9Jbml0aWFsaXplUXVldWVIZWFkZXIoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsJCS8vIERpZG4ndCBuZWVkIGl0IGJlY2F1c2Ugd2UgYWxyZWFkeSBtZW16ZXJvIGl0LgorCQkJcFR4QmxrLT5RdWVJZHggPSBRdWVJZHg7CisKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKKworCQkJLy8gRWFybHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vZ3VoIFR4IFJlc291cmNlLgorCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJaWYgKCFoYXNUeERlc2MpCisJCQl7CisJCQkJcEFkLT5Qcml2YXRlSW5mby5UeFJpbmdGdWxsQ250Kys7CisKKwkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVHhQa3RDbGFzc2lmaWNhdGlvbihwQWQsIHBQYWNrZXQpOworCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQlwVHhCbGstPlRvdGFsRnJhbWVOdW0rKzsKKwkJCXBUeEJsay0+VG90YWxGcmFnTnVtICs9IFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCk7CS8vIFRoZSByZWFsIGZyYWdtZW50IG51bWJlciBtYXliZSB2YXJ5CisJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQlwVHhCbGstPnBQYWNrZXQgPSBwUGFja2V0OworCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKworCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FIHx8IHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCisJCQl7CisJCQkJLy8gRW5oYW5jZSBTVyBBZ2dyZWdhdGlvbiBNZWNoYW5pc20KKwkJCQlpZiAoTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0cocEFkLCBRdWVJZHgsIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFR4QmxrLT5UeEZyYW1lVHlwZSkpCisJCQkJeworCQkJCQlJbnNlcnRIZWFkUXVldWUocFF1ZXVlLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZG97CisJCQkJCWlmKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQkJCQlicmVhazsKKworCQkJCQkvLyBGb3IgVFhfQU1TRFVfRlJBTUUvVFhfUkFMSU5LX0ZSQU1FLCBOZWVkIHRvIGNoZWNrIGlmIG5leHQgcGFrY2V0IGNhbiBkbyBhZ2dyZWdhdGlvbi4KKwkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCQkJCQlGcmVlTnVtYmVyW1F1ZUlkeF0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQkJCWhhc1R4RGVzYyA9IFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgRnJlZU51bWJlcltRdWVJZHhdLCBwUGFja2V0KTsKKwkJCQkJaWYgKChoYXNUeERlc2MgPT0gRkFMU0UpIHx8IChDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0KHBBZCwgcFBhY2tldCwgcFR4QmxrKSA9PSBGQUxTRSkpCisJCQkJCQlicmVhazsKKworCQkJCQkvL1JlbW92ZSB0aGUgcGFja2V0IGZyb20gdGhlIFR4U3dRdWV1ZSBhbmQgaW5zZXJ0IGludG8gcFR4QmxrCisJCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJCQlBU1NFUlQocEVudHJ5KTsKKwkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVOdW0rKzsKKwkJCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCQkJCX13aGlsZSgxKTsKKworCQkJCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMSkKKwkJCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwkJCX0KKworI2lmZGVmIFJUMjg3MAorCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWYgMAkvLyBXZSBzaG91bGQgbm90IGJyZWFrIGlmIEhhcmRUcmFuc21pdCBmYWlsZWQuIFdlbGwsIGF0IGxlYXN0IG5vdyB3ZSBzaG91bGQgbm90IQorCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFIC8qUlRfREVCVUdfSU5GTyovLCgiUlRNUEhhcmRUcmFuc21pdCByZXR1cm4gZmFpbGVkISEhXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCVJUMjhYWF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKKworI2lmZGVmIFJUMjg3MAorCQlpZiAoIWhhc1R4RGVzYykKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIEJMT0NLX05FVF9JRgorCQlpZiAoKHBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLlN3VHhRdWV1ZUJsb2NrRmxhZyA9PSBUUlVFKQorCQkJJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDwgMSkpCisJCXsKKwkJCXJlbGVhc2VOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0pOworCQl9CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKwl9CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlSYXRlCQkJVHJhbnNtaXQgcmF0ZQorCQlTaXplCQkJRnJhbWUgc2l6ZSBpbiB1bml0cyBvZiBieXRlCisKKwlSZXR1cm4gVmFsdWU6CisJCUR1cmF0aW9uIG51bWJlciBpbiB1bml0cyBvZiB1c2VjCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VTSE9SVAlSVE1QQ2FsY0R1cmF0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmF0ZSwKKwlJTglVTE9ORwkJCVNpemUpCit7CisJVUxPTkcJRHVyYXRpb24gPSAwOworCisJaWYgKFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgLy8gQ0NLCisJeworCQlpZiAoKFJhdGUgPiBSQVRFXzEpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSkKKwkJCUR1cmF0aW9uID0gOTY7CS8vIDcyKzI0IHByZWFtYmxlK3BsY3AKKwkJZWxzZQorCQkJRHVyYXRpb24gPSAxOTI7IC8vIDE0NCs0OCBwcmVhbWJsZStwbGNwCisKKwkJRHVyYXRpb24gKz0gKFVTSE9SVCkoKFNpemUgPDwgNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOworCQlpZiAoKFNpemUgPDwgNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArKzsKKwl9CisJZWxzZSBpZiAoUmF0ZSA8PSBSQVRFX0xBU1RfT0ZETV9SQVRFKS8vIE9GRE0gcmF0ZXMKKwl7CisJCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgorCQlEdXJhdGlvbiArPSA0ICogKFVTSE9SVCkoKDExICsgU2l6ZSAqIDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKCgxMSArIFNpemUgKiA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKKwkJCUR1cmF0aW9uICs9IDQ7CisJfQorCWVsc2UJLy9taW1vIHJhdGUKKwl7CisJCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgorCX0KKworCXJldHVybiAoVVNIT1JUKUR1cmF0aW9uOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcFR4V0kJCVBvaW50ZXIgdG8gaGVhZCBvZiBlYWNoIE1QRFUgdG8gSFcuCisJCUFjayAJCVNldHRpbmcgZm9yIEFjayByZXF1aXJlbWVudCBiaXQKKwkJRnJhZ21lbnQJU2V0dGluZyBmb3IgRnJhZ21lbnQgYml0CisJCVJldHJ5TW9kZQlTZXR0aW5nIGZvciByZXRyeSBtb2RlCisJCUlmcyAJCVNldHRpbmcgZm9yIElGUyBnYXAKKwkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQorCQlTZXJ2aWNlIAlTZXR0aW5nIGZvciBzZXJ2aWNlCisJCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCisJCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcworCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICBTZWUgYWxzbyA6IEJBU21hcnRIYXJkVHJhbnNtaXQoKSAgICAhISEKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQyAJcE91dFR4V0ksCisJSU4JQk9PTEVBTgkJCUZSQUcsCisJSU4JQk9PTEVBTgkJCUNGQUNLLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJVElELAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KQoreworCVBNQUNfVEFCTEVfRU5UUlkJcE1hYyA9IE5VTEw7CisJVFhXSV9TVFJVQyAJCVR4V0k7CisJUFRYV0lfU1RSVUMgCXBUeFdJOworCisJaWYgKFdDSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcE1hYyA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1dDSURdOworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7CisJcFR4V0kgPSAmVHhXSTsKKworCXBUeFdJLT5GUkFHPSBGUkFHOworCisJcFR4V0ktPkNGQUNLID0gQ0ZBQ0s7CisJcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7CisJcFR4V0ktPkFNUERVID0gQU1QRFU7CisJcFR4V0ktPkFDSyA9IEFjazsKKwlwVHhXSS0+dHhvcD0gVHhvcG1vZGU7CisKKwlwVHhXSS0+TlNFUSA9IE5TZXE7CisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCisJaWYoIEJBU2l6ZSA+NyApCisJCUJBU2l6ZSA9NzsKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7CisJcFR4V0ktPlBhY2tldElkID0gUElEOworCisJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKKwlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAocFR4V0ktPkJXKQorCQlwVHhXSS0+QlcgPSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID09IDApID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7CisJcFR4V0ktPkNGQUNLID0gQ2ZBY2s7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocE1hYykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQorCQl7CisJCQlpZiAoKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCQl7CisJCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCXBUeFdJLT5NSU1PcHMgPSAxOworCQkJfQorCQkJZWxzZSBpZiAocE1hYy0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCisJCQl7CisJCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKKwkJCQl7CisJCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJLy9wVHhXSS0+TUlNT3BzID0gKHBNYWMtPlBzTW9kZSA9PSBQV1JfTU1QUyk/IDE6MDsKKwkJaWYgKHBNYWMtPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWMtPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKKwlOZGlzTW92ZU1lbW9yeShwT3V0VHhXSSwgJlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7Cit9CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCQkJQkFTaXplOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlBU1NFUlQocFR4V0kpOworCisJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CisJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KHBUeFdJLCBUWFdJX1NJWkUpOworCisJcFR4V0ktPkZSQUcJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKKwlwVHhXSS0+QUNLCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKKwlwVHhXSS0+dHhvcAkJPSBwVHhCbGstPkZyYW1lR2FwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJaWYgKHBNYWNFbnRyeSAmJgorCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpICYmCisJCShwTWFjRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCisJCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gQlNTSURfV0NJRDsKKwllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCXBUeFdJLT5XaXJlbGVzc0NsaUlECQk9IHBUeEJsay0+V2NpZDsKKworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQJPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhXSS0+Q0ZBQ0sJCQkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JQaWdneUJhY2spOworCisJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKKwlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAocFR4V0ktPkJXKQorCQlwVHhXSS0+QlcgPSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID09IDApID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJcFR4V0ktPkFNUERVCT0gKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSA/IFRSVUUgOiBGQUxTRSk7CisKKwkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCisJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7CisJaWYoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpICYmIChwTWFjRW50cnkpKQorCXsKKwkJVUNIQVIJCVJBQkFPcmlJZHggPSAwOwkvL1RoZSBSQSdzIEJBIE9yaWdpbmF0b3IgdGFibGUgaW5kZXguCisKKwkJUkFCQU9yaUlkeCA9IHBUeEJsay0+cE1hY0VudHJ5LT5CQU9yaVdjaWRBcnJheVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisJCUJBU2l6ZSA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W1JBQkFPcmlJZHhdLkJBV2luU2l6ZTsKKwl9CisKKyNpZiAwIC8vIDMqMworCWlmIChCQVNpemUgPiA3KQorCQlCQVNpemUgPSA3OworI2VuZGlmCisKKwlwVHhXSS0+VHhCRiA9IHBUcmFuc21pdC0+ZmllbGQuVHhCRjsKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWNFbnRyeSkKKwl7CisJCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQl7CisJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJfQorCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQl7CisJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQl7CisJCQkJcFR4V0ktPk1DUyA9IDc7CisJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAocE1hY0VudHJ5LT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hY0VudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWNFbnRyeS0+TXBkdURlbnNpdHk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJaWYgKHBUeEJsay0+UXVlSWR4PT0gMCkKKwkJeworCQkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7CisJCQlwQWQtPkRpYWdTdHJ1Y3QuVHhNY3NDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XVtwVHhXSS0+TUNTXSsrOworCQl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwkvLyBmb3IgcmF0ZSBhZGFwYXRpb24KKwlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9DYWNoZSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsaykKK3sKKwlQSFRUUkFOU01JVF9TRVRUSU5HCS8qcFR4SFRQaHlNb2RlLCovIHBUcmFuc21pdDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKworCS8vCisJLy8gdXBkYXRlIFRYV0kKKwkvLworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCisJaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpCisJeworCQlwVHhXSS0+dHhvcCA9IElGU19IVFRYT1A7CisKKwkJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKKwkJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwkJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CisJCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOworCisJCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwkJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7CisKKwkJLy8gc2V0IFBJRCBmb3IgVHhSYXRlU3dpdGNoaW5nCisJCXBUeFdJLT5QYWNrZXRJZCA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXBUeFdJLT5BTVBEVSA9ICgocE1hY0VudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9PSAwKSA/IFRSVUU6IEZBTFNFKTsKKwlwVHhXSS0+TUlNT3BzID0gMDsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAocFR4V0ktPkJXKQorCQlwVHhXSS0+QlcgPSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID09IDApID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwl7CisJCS8vIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQl7CisJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJfQorCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQl7CisJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCWlmICgocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJaWYgKHBUeEJsay0+UXVlSWR4PT0gMCkKKwl7CisJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhNY3NDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XVtwVHhXSS0+TUNTXSsrOworCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCisJCUFjayAJCVNldHRpbmcgZm9yIEFjayByZXF1aXJlbWVudCBiaXQKKwkJRnJhZ21lbnQJU2V0dGluZyBmb3IgRnJhZ21lbnQgYml0CisJCVJldHJ5TW9kZQlTZXR0aW5nIGZvciByZXRyeSBtb2RlCisJCUlmcyAJCVNldHRpbmcgZm9yIElGUyBnYXAKKwkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQorCQlTZXJ2aWNlIAlTZXR0aW5nIGZvciBzZXJ2aWNlCisJCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCisJCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcworCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhEX1NUUlVDCQlwVHhELAorCUlOCUJPT0xFQU4gCQliV0lWLAorCUlOCVVDSEFSCQkJUXVldWVTRUwpCit7CisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisKKwlwVHhELT5XSVYJPSAoYldJVikgPyAxOiAwOworCXBUeEQtPlFTRUw9IChRdWV1ZVNFTCk7CisJLy9SVDI4NjBjPz8gIGZpeGVkIHVzaW5nIEVEQ0EgcXVldWUgZm9yIHRlc3QuLi4gIFdlIGRvdWJ0IFF1ZXVlMSBoYXMgcHJvYmxlbS4gIDIwMDYtMDktMjYgSmFuCisJLy9wVHhELT5RU0VMPSBGSUZPX0VEQ0E7CisJaWYgKHBBZC0+Ykdlbk9uZUhDQ0EgPT0gVFJVRSkKKwkJcFR4RC0+UVNFTD0gRklGT19IQ0NBOworCXBUeEQtPkRNQURPTkUgPSAwOworfQorCisKKy8vIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIC0KKy8vIDEuIE1FQURJQV9DT05ORUNURUQKKy8vIDIuIEFHR1JFR0FUSU9OX0lOX1VTRUQKKy8vIDMuIEZyYWdtZW50YXRpb24gbm90IGluIHVzZWQKKy8vIDQuIGVpdGhlciBubyBwcmV2aW91cyBmcmFtZSAocFByZXZBZGRyMT1OVUxMKSAuT1IuIHByZXZpb3VkIGZyYW1lIGlzIGFnZ3JlZ2F0aWJsZQorQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFByZXZBZGRyMSwKKwlJTglQVUNIQVIJCQlwODAyM2hkcikKK3sKKworCS8vIGNhbid0IGFnZ3JlZ2F0ZSBFQVBPTCAoODAyLjF4KSBmcmFtZQorCWlmICgocDgwMjNoZHJbMTJdID09IDB4ODgpICYmIChwODAyM2hkclsxM10gPT0gMHg4ZSkpCisJCXJldHVybiBGQUxTRTsKKworCS8vIGNhbid0IGFnZ3JlZ2F0ZSBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lCisJaWYgKHA4MDIzaGRyWzBdICYgMHgwMSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKElORlJBX09OKHBBZCkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAorCQlyZXR1cm4gVFJVRTsKKwllbHNlIGlmICgocFByZXZBZGRyMSA9PSBOVUxMKSB8fCBNQUNfQUREUl9FUVVBTChwUHJldkFkZHIxLCBwODAyM2hkcikpIC8vIHVuaWNhc3QgdG8gc2FtZSBTVEEKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJICAgQ2hlY2sgdGhlIE1TRFUgQWdncmVnYXRpb24gcG9saWN5CisJMS5IVCBhZ2dyZWdhdGlvbiBpcyBBLU1TRFUKKwkyLmxlZ2FhY3kgcmF0ZSBhZ2dyZWdhdGlvbiBpcyBzb2Z0d2FyZSBhZ2dyZWdhdGlvbiBieSBSYWxpbmsuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkgICBUeFJhdGUsCisJSU4JUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpCit7CisJVUxPTkcJQUZsYWdzID0gKGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCB8IGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCisJaWYgKHBNYWNFbnRyeSAhPSBOVUxMICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgQUZsYWdzKSkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisJCXsKKwkJCXJldHVybiBUUlVFOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCWlmIChUeFJhdGUgPj0gUkFURV82ICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgJiYgKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGxlZ2FjeSAgUmFsaW5rIEFnZ3JlZ2F0aW9uIHN1cHBvcnQKKwkJCXJldHVybiBUUlVFOworCQl9CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgYW5kIGZpbmUgdGhlIHBhY2tldCB3YWl0aW5nIGluIFNXIHF1ZXVlIHdpdGggaGlnaGVzdCBwcmlvcml0eQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCit7CisKKwlVTE9ORwlOdW1iZXI7CisJLy8gMjAwNC0xMS0xNSB0byBiZSByZW1vdmVkLiB0ZXN0IGFnZ3JlZ2F0aW9uIG9ubHkKKy8vCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSAmJiAoKnBOdW1iZXIgPCAyKSkKKy8vCQkgcmV0dXJuIE5VTEw7CisKKwlOdW1iZXIgPSBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLk51bWJlcjsKKworCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQkU7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0hDQ0E7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7CisJfQorCisJLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKworCXJldHVybiAoTlVMTCk7Cit9CisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTk5JTkcsIHN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisKKworCS8vCisJLy8gQmVmb3JlIEJTU19TQ0FOX0lOX1BST0dSRVNTLCB3ZSBuZWVkIHRvIGtlZXAgQ3VycmVudCBSNjYgdmFsdWUgYW5kCisJLy8gdXNlIExvd2JvdW5kIGFzIFI2NiB2YWx1ZSBvbiBTY2FuTmV4dENoYW5uZWwoLi4uKQorCS8vCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJnBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwkvLyBzZXQgQkJQX1I2NiB0byAweDMwLzB4NDAgd2hlbiBzY2FubmluZyAoQXNpY1N3aXRjaENoYW5uZWwgd2lsbCBzZXQgUjY2IGFjY29yZGluZyB0byBjaGFubmVsIHdoZW4gc2Nhbm5pbmcpCisJLy9SVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOworCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDBmMDAwMCk7CQkvLyBhYm9ydCBhbGwgVFggcmluZ3MKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworLy8gICAgVUNIQVIJCQlJcnFTdGF0ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU0NBTiBkb25lLCByZXN1bWUgTVNEVSB0cmFuc21pc3Npb24gLi4uXG4iKSk7CisKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisvLyBzYW1wbGUsIGZvciBJUlEgTE9DSyB0byBTRU0gTE9DSworLy8gICAgSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKy8vCWlmIChJcnFTdGF0ZSkKKy8vCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIFRSVUUsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisvLyAgICBlbHNlCisJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKK30KKworCitVSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKQoreworCVVTSE9SVCAJCQlQYXlsb2FkU2l6ZTsKKwlVU0hPUlQgCQkJU3ViRnJhbWVTaXplOworCVBIRUFERVJfODAyXzMgCXBBTVNEVXN1YmhlYWRlcjsKKwlVSU5UCQkJbk1TRFU7CisgICAgVUNIQVIJCQlIZWFkZXI4MDJfM1sxNF07CisKKwlQVUNIQVIJCQlwUGF5bG9hZCwgcERBLCBwU0EsIHBSZW1vdmVkTExDU05BUDsKKwlQTkRJU19QQUNLRVQJcENsb25lUGFja2V0OworCisKKworCW5NU0RVID0gMDsKKworCXdoaWxlIChEYXRhU2l6ZSA+IExFTkdUSF84MDJfMykKKwl7CisKKwkJbk1TRFUrKzsKKworCQkvL2hleF9kdW1wKCJzdWJoZWFkZXIiLCBwRGF0YSwgNjQpOworCQlwQU1TRFVzdWJoZWFkZXIgPSAoUEhFQURFUl84MDJfMylwRGF0YTsKKwkJLy9wRGF0YSArPSBMRU5HVEhfODAyXzM7CisJCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CisKKworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy9wcmludGsoIiVkIHN1YmZyYW1lOiBTaXplID0gJWRcbiIsICBuTVNEVSwgUGF5bG9hZFNpemUpOworCisJCXBQYXlsb2FkID0gcERhdGEgKyBMRU5HVEhfODAyXzM7CisJCXBEQSA9IHBEYXRhOworCQlwU0EgPSBwRGF0YSArIE1BQ19BRERSX0xFTjsKKworCQkvLyBjb252ZXJ0IHRvIDgwMi4zIGhlYWRlcgorICAgICAgICBDT05WRVJUX1RPXzgwMl8zKEhlYWRlcjgwMl8zLCBwREEsIHBTQSwgcFBheWxvYWQsIFBheWxvYWRTaXplLCBwUmVtb3ZlZExMQ1NOQVApOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgoSGVhZGVyODAyXzNbMTJdID09IDB4ODgpICYmIChIZWFkZXI4MDJfM1sxM10gPT0gMHg4RSkgKQorCQl7CisJCSAgICAvLyBhdm9pZCBsb2NhbCBoZWFwIG92ZXJmbG93LCB1c2UgZHlhbmFtaWMgYWxsb2NhdGlvbgorCQkgICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKwkJICAgbWVtbW92ZShFbGVtLT5Nc2crKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCksIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCSAgIEVsZW0tPk1zZ0xlbiA9IExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIFBheWxvYWRTaXplOworCQkgICBXcGFFQVBPTEtleUFjdGlvbihwQWQsIEVsZW0pOworCQkgICBrZnJlZShFbGVtKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkgICAgICAgIAlpZiAocFJlbW92ZWRMTENTTkFQKQorCSAgICAgICAgCXsKKwkgICAgCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOworCSAgICAJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBQYXlsb2FkLCAmSGVhZGVyODAyXzNbMF0sIExFTkdUSF84MDJfMyk7CisJICAgICAgICAJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJcENsb25lUGFja2V0ID0gQ2xvbmVQYWNrZXQocEFkLCBwUGFja2V0LCBwUGF5bG9hZCwgUGF5bG9hZFNpemUpOworCQlpZiAocENsb25lUGFja2V0KQorCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisKKworCQkvLyBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLgorCQkvLyBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNAorCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplKzMpJih+MHgzKTsKKworCisJCWlmIChTdWJGcmFtZVNpemUgPiAxNTI4IHx8IFN1YkZyYW1lU2l6ZSA8IDMyKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChEYXRhU2l6ZSA+IFN1YkZyYW1lU2l6ZSkKKwkJeworCQkJcERhdGEgKz0gU3ViRnJhbWVTaXplOworCQkJRGF0YVNpemUgLT0gU3ViRnJhbWVTaXplOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gZW5kIG9mIEEtTVNEVQorCQkJRGF0YVNpemUgPSAwOworCQl9CisJfQorCisJLy8gZmluYWxseSByZWxlYXNlIG9yaWdpbmFsIHJ4IHBhY2tldAorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCitVSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBVQ0hBUgkJCXBEYXRhOworCVVTSE9SVAkJCURhdGFTaXplOworCVVJTlQJCQluTVNEVSA9IDA7CisKKwlwRGF0YSA9IChQVUNIQVIpIEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7CisKKwlyZXR1cm4gbk1TRFU7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlMb29rIHVwIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgTUFDIHRhYmxlLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCisJUmV0dXJuOgorCQlwRW50cnkgLSBwb2ludGVyIHRvIHRoZSBNQUMgZW50cnk7IE5VTEwgaXMgbm90IGZvdW5kCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCVBVQ0hBUiBwQWRkcikKK3sKKwlVTE9ORyBIYXNoSWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNNZXNoKSkKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwl9CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUgkJCXBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCkKK3sKKwlVQ0hBUiBIYXNoSWR4OworCWludCBpLCBGaXJzdFdjaWQ7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKworCS8vIGlmIEZVTEwsIHJldHVybgorCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gTlVMTDsKKworCUZpcnN0V2NpZCA9IDE7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCUZpcnN0V2NpZCA9IDI7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5CisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlmb3IgKGkgPSBGaXJzdFdjaWQ7IGk8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspICAgLy8gc2tpcCBlbnRyeSMwIHNvIHRoYXQgImVudHJ5IGluZGV4ID09IEFJRCIgZm9yIGZhc3QgbG9va3VwCisJeworCQkvLyBwaWNrIHVwIHRoZSBmaXJzdCBhdmFpbGFibGUgdmFjYW5jeQorCQlpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNXRFMgPT0gRkFMU0UpICYmCisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGk9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNNZXNoID09IEZBTFNFKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0RscyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCQlpZiAoQ2xlYW5BbGwgPT0gVFJVRSkKKwkJCXsKKwkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IFJBVEVfMTE7CisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQl9CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoYXBpZHggPj0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUykKKwkJCXsKKwkJCQlwRW50cnktPlZhbGlkQXNDTEkgPSBGQUxTRTsKKwkJCQlwRW50cnktPlZhbGlkQXNXRFMgPSBGQUxTRTsKKwkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc01lc2ggPSBGQUxTRTsKKwkJCQlwRW50cnktPlZhbGlkQXNEbHMgPSBUUlVFOworCQkJCXBFbnRyeS0+aXNDYWNoZWQgPSBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwRW50cnktPlZhbGlkQXNDTEkgPSBUUlVFOworCQkJCQlwRW50cnktPlZhbGlkQXNXRFMgPSBGQUxTRTsKKwkJCQkJcEVudHJ5LT5WYWxpZEFzQXBDbGkgPSBGQUxTRTsKKwkJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNEbHMgPSBGQUxTRTsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl9CisKKwkJCXBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPSBGQUxTRTsKKwkJCXBFbnRyeS0+cEFkID0gcEFkOworCQkJcEVudHJ5LT5DTVRpbWVyUnVubmluZyA9IEZBTFNFOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCQlwRW50cnktPlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CisJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7CisKKwkJCWlmIChwRW50cnktPlZhbGlkQXNNZXNoKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCk7CisJCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNBcENsaSkKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc1dEUykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNEbHMpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJZWxzZQorCQkJCXBFbnRyeS0+YXBpZHggPSBhcGlkeDsKKworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwkJCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisjZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOworCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKKwkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOworCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7CisJCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKKworCisJCQlwQWQtPk1hY1RhYi5TaXplICsrOworCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixpLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGFkZCB0aGlzIE1BQyBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwlpZiAocEVudHJ5KQorCXsKKwkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQl7CisJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQl9CisJCWVsc2UKKwkJeworCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJfQorCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJcmV0dXJuIHBFbnRyeTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZWxldGUgYSBzcGVjaWZpZWQgY2xpZW50IGZyb20gTUFDIHRhYmxlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcikKK3sKKwlVU0hPUlQgSGFzaElkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwgKnBQcmV2RW50cnksICpwUHJvYmVFbnRyeTsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwkvL1VTSE9SVAlvZmZzZXQ7CS8vIHVudXNlZCB2YXJpYWJsZQorCS8vVUNIQVIJajsJCQkvLyB1bnVzZWQgdmFyaWFibGUKKworCWlmICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCS8vcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorIAkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCSkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKworCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCXBQcmV2RW50cnkgPSBOVUxMOworCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJZG8KKwkJCXsKKwkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCXsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkvLyBub3QgZm91bmQgISEhCisJCQlBU1NFUlQocFByb2JlRW50cnkgIT0gTlVMTCk7CisKKwkJCVJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOworCisKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQl9CisKKworICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQlwQWQtPk1hY1RhYi5TaXplIC0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fRlVOQ1RJT05fXywgd2NpZCk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gMDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwIC8qcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKi8sIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwIC8qcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiovKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXNldCB0aGUgZW50aXJlIE1BQyB0YWJsZS4gQWxsIHBhY2tldHMgcGVuZGluZyBpbgorCQl0aGUgcG93ZXItc2F2aW5nIHF1ZXVlcyBhcmUgZnJlZWQgaGVyZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1hY1RhYmxlUmVzZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZCkKK3sKKwlpbnQgICAgICAgICBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVSZXNldFxuIikpOworCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJICAgeworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7CisKKworCisjaWZkZWYgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIsIDYpOworCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIGkpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBBZGRyLAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvLAorCUlOIFVMT05HICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsCisJSU4gVVNIT1JUICAgICAgICAgICAgICAgICAgICAgTGlzdGVuSW50dikKK3sKKwlDT1BZX01BQ19BRERSKEFzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJLy8gQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seQorCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsgLy8gbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0CisJQXNzb2NSZXEtPlRpbWVvdXQgPSBUaW1lb3V0OworCUFzc29jUmVxLT5MaXN0ZW5JbnR2ID0gTGlzdGVuSW50djsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOIFBVQ0hBUiBwQWRkciwKKwlJTiBVU0hPUlQgUmVhc29uKQoreworCUNPUFlfTUFDX0FERFIoRGlzYXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKKwlEaXNhc3NvY1JlcS0+UmVhc29uID0gUmVhc29uOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayB0aGUgb3V0IGdvaW5nIGZyYW1lLCBpZiB0aGlzIGlzIGFuIERIQ1Agb3IgQVJQIGRhdGFncmFtCisJd2lsbCBiZSBkdXBsaWNhdGUgYW5vdGhlciBmcmFtZSBhdCBsb3cgZGF0YSByYXRlIHRyYW5zbWl0LgorCisJQXJndW1lbnRzOgorCQlwQWQgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBQYWNrZXQgCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlUbyBiZSBkdXBsaWNhdGUgYXQgTG93IGRhdGEgcmF0ZSB0cmFuc21pdC4gKDFtYikKKwkJRkFMU0UJCURvIG5vdGhpbmcuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwkJTUFDIGhlYWRlciArIElQIEhlYWRlciArIFVEUCBIZWFkZXIKKwkJICAxNCBCeXRlcwkgIDIwIEJ5dGVzCisKKwkJVURQIEhlYWRlcgorCQkwMHwwMXwwMnwwM3wwNHwwNXwwNnwwN3wwOHwwOXwxMHwxMXwxMnwxM3wxNHwxNXwKKwkJCQkJCVNvdXJjZSBQb3J0CisJCTE2fDE3fDE4fDE5fDIwfDIxfDIyfDIzfDI0fDI1fDI2fDI3fDI4fDI5fDMwfDMxfAorCQkJCQlEZXN0aW5hdGlvbiBQb3J0CisKKwkJcG9ydCAweDQzIG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgc2VydmVyLgorCQlQb3J0IDB4NDQgbWVhbnMgQm9vdHN0cmFwIFByb3RvY29sLCBjbGllbnQuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVVMT05HCQkJTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOworCVVMT05HCQkJQ3VycmVudE9mZnNldCA9IDA7CisJUFZPSUQJCQlwVmlydHVhbEFkZHJlc3MgPSBOVUxMOworCVVJTlQJCQlOZGlzQnVmZmVyTGVuZ3RoOworCVBVQ0hBUgkJCXBTcmM7CisJVVNIT1JUCQkJUHJvdG9jb2w7CisJVUNIQVIJCQlCeXRlT2Zmc2V0MzYgPSAwOworCVVDSEFSCQkJQnl0ZU9mZnNldDM4ID0gMDsKKwlCT09MRUFOIAkJUmVhZEZpcnN0UGFybSA9IFRSVUU7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKKworCU51bWJlck9mQnl0ZXNSZWFkICs9IE5kaXNCdWZmZXJMZW5ndGg7CisJcFNyYyA9IChQVUNIQVIpIHBWaXJ0dWFsQWRkcmVzczsKKwlQcm90b2NvbCA9ICoocFNyYyArIDEyKSAqIDI1NiArICoocFNyYyArIDEzKTsKKworCS8vCisJLy8gQ2hlY2sgREhDUCAmIEJPT1RQIHByb3RvY29sCisJLy8KKwl3aGlsZSAoTnVtYmVyT2ZCeXRlc1JlYWQgPD0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCkKKwl7CisJCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzUgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzNiA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJUmVhZEZpcnN0UGFybSA9IEZBTFNFOworCQl9CisKKwkJaWYgKE51bWJlck9mQnl0ZXNSZWFkID49IDM3KQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzcgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzOCA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJLy9FbmQgb2YgUmVhZAorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIENoZWNrIGZvciBESENQICYgQk9PVFAgcHJvdG9jb2wKKwlpZiAoKEJ5dGVPZmZzZXQzNiAhPSAweDQ0KSB8fCAoQnl0ZU9mZnNldDM4ICE9IDB4NDMpKQorCQl7CisJCS8vCisJCS8vIDIwNTQgKGhleCAwODA2KSBmb3IgQVJQIGRhdGFncmFtcworCQkvLyBpZiB0aGlzIHBhY2tldCBpcyBub3QgQVJQIGRhdGFncmFtcywgdGhlbiBkbyBub3RoaW5nCisJCS8vIEFSUCBkYXRhZ3JhbXMgd2lsbCBhbHNvIGJlIGR1cGxpY2F0ZSBhdCAxbWIgYnJvYWRjYXN0IGZyYW1lcworCQkvLworCQlpZiAoUHJvdG9jb2wgIT0gMHgwODA2ICkKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJVVNIT1JUCVR5cGVMZW47CisJVUNIQVIJQnl0ZTAsIEJ5dGUxOworCVBVQ0hBUglwU3JjQnVmOworCVVJTlQzMglwa3RMZW47CisJVUlOVDE2IAlzcmNQb3J0LCBkc3RQb3J0OworCUJPT0xFQU4Jc3RhdHVzID0gVFJVRTsKKworCisJcFNyY0J1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwa3RMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCUFTU0VSVChwU3JjQnVmKTsKKworCVJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhwUGFja2V0LCAwKTsKKworCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgKyBwU3JjQnVmWzEzXTsKKworCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvLyBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuCisKKwlpZiAoVHlwZUxlbiA8PSAxNTAwKQorCXsJLy8gODAyLjMsIDgwMi4zIExMQworCQkvKgorCQkJRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCisJCQlEU0FQKDEpICsgU1NBUCgxKSArIENvbnRyb2woMSkgKworCQkJaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgorCQkJCT0+ICsgU05BUCAoNSwgT3JpZ2luYXRpb25JRCgzKSArIGV0aGVyVHlwZSgyKSkKKwkJKi8KKwkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKQorCQl7CisJCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOworCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgorCQl9CisJCWVsc2UKKwkJeworCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KKwkJfQorCX0KKworCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgorCWlmIChUeXBlTGVuID09IDB4ODEwMCkKKwl7CisJCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KKworCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKworCQkgICBTb3VyY2UgTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgTGVuZ3RoL1R5cGUgPSA4MDIuMVEgVGFnIFR5cGUgKDItYnl0ZSkgKworCQkgICBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoMi1ieXRlcykgKworCQkgICBMZW5ndGggLyBUeXBlICgyLWJ5dGVzKSArCisJCSAgIGRhdGEgcGF5bG9hZCAoMC1uIGJ5dGVzKSArCisJCSAgIFBhZCAoMC1wIGJ5dGVzKSArCisJCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLworCisJCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOworCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDIsICZCeXRlMCwgJkJ5dGUxKTsKKwkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKworCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgorCX0KKworCXN3aXRjaCAoVHlwZUxlbikKKwl7CisJCWNhc2UgMHgwODAwOgorCQkJeworCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKKwkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKKwkJCQl7CS8vIHVkcCBwYWNrZXQKKwkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCisKKwkJCQkJcFNyY0J1ZiArPSAyMDsJLy8gU2tpcCB0aGUgSVAgaGVhZGVyCisJCQkJCXNyY1BvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKilwU3JjQnVmKSk7CisJCQkJCWRzdFBvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKikocFNyY0J1ZiArMikpKTsKKworCQkJCQlpZiAoKHNyY1BvcnQ9PTB4NDQgJiYgZHN0UG9ydD09MHg0MykgfHwgKHNyY1BvcnQ9PTB4NDMgJiYgZHN0UG9ydD09MHg0NCkpCisJCQkJCXsJLy9JdCdzIGEgQk9PVFAvREhDUCBwYWNrZXQKKwkJCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwODA2OgorCQkJeworCQkJCS8vQVJQIFBhY2tldC4KKwkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4ODg4ZToKKwkJCXsKKwkJCQkvLyBFQVBPTCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQsIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworCisKK1ZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQorCQl7CisJQ0hBUglyc3NpMCA9IHBSeFdJLT5SU1NJMDsKKwlDSEFSCXJzc2kxID0gcFJ4V0ktPlJTU0kxOworCUNIQVIJcnNzaTIgPSBwUnhXSS0+UlNTSTI7CisKKwlpZiAocnNzaTAgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTAsIFJTU0lfMCk7CisJCXBSc3NpLT5BdmdSc3NpMFg4CT0gKHBSc3NpLT5BdmdSc3NpMFg4IC0gcFJzc2ktPkF2Z1Jzc2kwKSArIHBSc3NpLT5MYXN0UnNzaTA7CisJCXBSc3NpLT5BdmdSc3NpMAk9IHBSc3NpLT5BdmdSc3NpMFg4ID4+IDM7CisJfQorCisJaWYgKHJzc2kxICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kxLCBSU1NJXzEpOworCQlwUnNzaS0+QXZnUnNzaTFYOAk9IChwUnNzaS0+QXZnUnNzaTFYOCAtIHBSc3NpLT5BdmdSc3NpMSkgKyBwUnNzaS0+TGFzdFJzc2kxOworCQlwUnNzaS0+QXZnUnNzaTEJPSBwUnNzaS0+QXZnUnNzaTFYOCA+PiAzOworCX0KKworCWlmIChyc3NpMiAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMiwgUlNTSV8yKTsKKwkJcFJzc2ktPkF2Z1Jzc2kyWDggID0gKHBSc3NpLT5BdmdSc3NpMlg4IC0gcFJzc2ktPkF2Z1Jzc2kyKSArIHBSc3NpLT5MYXN0UnNzaTI7CisJCXBSc3NpLT5BdmdSc3NpMiA9IHBSc3NpLT5BdmdSc3NpMlg4ID4+IDM7CisJfQorfQorCisKKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOworCisJLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgorCS8vIDIuIHJlbW92ZSBMTEMKKwkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCisJLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQorCXsKKyNpZiAwIC8vIHNhbXBsZSB0YWtlIG9mZiwgZm9yIG11bHRpcGxlIGNhcmQgZGVzaWduCisJCXN0YXRpYyBpbnQgZXJyX3NpemU7CisKKwkJZXJyX3NpemUrKzsKKwkJaWYgKGVycl9zaXplID4gMjApCisJCXsKKwkJCSBwcmludGsoIkxlZ2FjeSBEYXRhU2l6ZSA9ICVkXG4iLCBwUnhCbGstPkRhdGFTaXplKTsKKwkJCSBoZXhfZHVtcCgiODAyLjMgSGVhZGVyIiwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisJCQkgaGV4X2R1bXAoIlBheWxvYWQiLCBwUnhCbGstPnBEYXRhLCA2NCk7CisJCQkgZXJyX3NpemUgPSAwOworCQl9CisjZW5kaWYKKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCisJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApCisJeworCQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeTsKKwkJVUxPTkcJCQkJTm93MzI7CisJCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7CisJCVVTSE9SVAkJCQlJZHg7CisKKyNkZWZpbmUgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkJKCgxMDAgKiBIWikvMTAwMCkJLy8gc3lzdGVtIHRpY2tzIC0tIDEwMCBtcworCisJCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXsKKwkJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwkJCWlmIChJZHggIT0gMCkKKwkJCXsKKwkJCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQkJCS8vIHVwZGF0ZSBsYXN0IHJ4IHRpbWUKKwkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisJCQkJaWYgKChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkgJiYKKwkJCQkJIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCSAgIAkJCQkpCisJCQkJeworCQkJCQlwcmludGsoIkluZGljYXRlX0xlZ2FjeV9QYWNrZXQoKTpmbHVzaCByZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMhIFJ4V0ktPkZsYWdzPSVkLCBwUnhXSS5USUQ9JWQsIFJ4RC0+QU1QRFU9JWQhXG4iLCBwUnhCbGstPkZsYWdzLCBwUnhCbGstPnBSeFdJLT5USUQsIHBSeEJsay0+UnhELkFNUERVKTsKKwkJCQkJaGV4X2R1bXAoIkR1bXAgdGhlIGxlZ2FjeSBQYWNrZXQ6IiwgR0VUX09TX1BLVF9EQVRBUFRSKHBSeEJsay0+cFJ4UGFja2V0KSwgNjQpOworCQkJCQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworCS8vCisJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5CisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit9CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwkJeworCQkJLy8gaGFuZGxlIEEtTVNEVQorCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVSU5UMTYJCQlNc2R1MlNpemU7CisJVUlOVDE2IAkJCVBheWxvYWQxU2l6ZSwgUGF5bG9hZDJTaXplOworCVBVQ0hBUiAJCQlwRGF0YTI7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQyID0gTlVMTDsKKworCisKKwlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSsxKSA8PCA4KTsKKworCWlmICgoTXNkdTJTaXplIDw9IDE1MzYpICYmIChNc2R1MlNpemUgPCBwUnhCbGstPkRhdGFTaXplKSkKKwl7CisJCS8qIHNraXAgdHdvIGJ5dGUgTVNEVTIgbGVuICovCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOworCX0KKwllbHNlCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gZ2V0IDgwMi4zIEhlYWRlciBhbmQgIHJlbW92ZSBMTEMKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJLy8gUmFsaW5rIEFnZ3JlZ2F0aW9uIGZyYW1lCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgKys7CisJUGF5bG9hZDFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZSAtIE1zZHUyU2l6ZTsKKwlQYXlsb2FkMlNpemUgPSBNc2R1MlNpemUgLSBMRU5HVEhfODAyXzM7CisKKwlwRGF0YTIgPSBwUnhCbGstPnBEYXRhICsgUGF5bG9hZDFTaXplICsgTEVOR1RIXzgwMl8zOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBQYWNrZXQyID0gZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTItTEVOR1RIXzgwMl8zKSwgTEVOR1RIXzgwMl8zLCBwRGF0YTIsIFBheWxvYWQyU2l6ZSwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKCFwUGFja2V0MikKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQKKwlwUnhCbGstPkRhdGFTaXplID0gUGF5bG9hZDFTaXplOworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwUGFja2V0MikKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQyLCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisKKyNkZWZpbmUgUkVTRVRfRlJBR0ZSQU1FKF9mcmFnRnJhbWUpIFwKKwl7CQkJCQkJCQlcCisJCV9mcmFnRnJhbWUuUnhTaXplID0gMDsJCVwKKwkJX2ZyYWdGcmFtZS5TZXF1ZW5jZSA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5MYXN0RnJhZyA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5GbGFncyA9IDA7CQlcCisJfQorCisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJKnBGcmFnQnVmZmVyID0gTlVMTDsKKwlCT09MRUFOIAkJYlJlYXNzRG9uZSA9IEZBTFNFOworCVVDSEFSCQkJSGVhZGVyUm9vbSA9IDA7CisKKworCUFTU0VSVChwSGVhZGVyKTsKKworCUhlYWRlclJvb20gPSBwRGF0YSAtIChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLyBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCisJaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJCS8vIEZyYWcuIE51bWJlciBpcyAwIDogRmlyc3QgZnJhZyBvciBvbmx5IG9uZSBwa3QKKwl7CisJCS8vIHRoZSBmaXJzdCBwa3Qgb2YgZnJhZ21lbnQsIHJlY29yZCBpdC4KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQorCQl7CisJCQlBU1NFUlQocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICAgPSBEYXRhU2l6ZSArIEhlYWRlclJvb207CisJCQlOZGlzTW92ZU1lbW9yeShwRnJhZ0J1ZmZlciwJIHBIZWFkZXIsIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSk7CisJCQlwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSA9IHBIZWFkZXItPlNlcXVlbmNlOworCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBTaG91bGQgYmUgMAorCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID09IDApOworCQkJZ290byBkb25lOwkvLyBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzIGZyYW1lCisJCX0KKwl9CisJZWxzZQkvL01pZGRsZSAmIEVuZCBvZiBmcmFnbWVudAorCXsKKwkJaWYgKChwSGVhZGVyLT5TZXF1ZW5jZSAhPSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkgfHwKKwkJCShwSGVhZGVyLT5GcmFnICE9IChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyArIDEpKSkKKwkJeworCQkJLy8gRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIKKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisJCWVsc2UgaWYgKChwQWQtPkZyYWdGcmFtZS5SeFNpemUgKyBEYXRhU2l6ZSkgPiBNQVhfRlJBTUVfU0laRSkKKwkJeworCQkJLy8gRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS4KKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworICAgICAgICAvLworCQkvLyBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuCisJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4KKwkJLy8KKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLCBwSGVhZGVyLT5TZXF1ZW5jZSwgcEhlYWRlci0+RnJhZykpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCisJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGlzIGZyYWdtZW50IGludG8gdGhlIHJlLWFzc2VtYmx5IGJ1ZmZlcgorCQlOZGlzTW92ZU1lbW9yeSgocEZyYWdCdWZmZXIgKyBwQWQtPkZyYWdGcmFtZS5SeFNpemUpLCBwRGF0YSwgRGF0YVNpemUpOworCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICs9IERhdGFTaXplOworCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CSAgIC8vIFVwZGF0ZSBmcmFnbWVudCBudW1iZXIKKworCQkvLyBMYXN0IGZyYWdtZW50CisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSBGQUxTRSkKKwkJeworCQkJYlJlYXNzRG9uZSA9IFRSVUU7CisJCX0KKwl9CisKK2RvbmU6CisJLy8gYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCS8vIHJldHVybiBkZWZyYWdtZW50ZWQgcGFja2V0IGlmIHBhY2tldCBpcyByZWFzc2VtYmxlZCBjb21wbGV0ZWx5CisJLy8gb3RoZXJ3aXNlIHJldHVybiBOVUxMCisJaWYgKGJSZWFzc0RvbmUpCisJeworCQlQTkRJU19QQUNLRVQgcE5ld0ZyYWdQYWNrZXQ7CisKKwkJLy8gYWxsb2NhdGUgYSBuZXcgcGFja2V0IGJ1ZmZlciBmb3IgZnJhZ21lbnQKKwkJcE5ld0ZyYWdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisJCWlmIChwTmV3RnJhZ1BhY2tldCkKKwkJeworCQkJLy8gdXBkYXRlIFJ4QmxrCisJCQlwUmV0UGFja2V0ID0gcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQ7CisJCQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9IHBOZXdGcmFnUGFja2V0OworCQkJcFJ4QmxrLT5wSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7CisJCQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcFJ4QmxrLT5wSGVhZGVyICsgSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+RGF0YVNpemUgPSBwQWQtPkZyYWdGcmFtZS5SeFNpemUgLSBIZWFkZXJSb29tOworCQkJcFJ4QmxrLT5wUnhQYWNrZXQgPSBwUmV0UGFja2V0OworCQl9CisJCWVsc2UKKwkJeworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBwUmV0UGFja2V0OworfQorCisKK1ZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVSU5UCQkJbk1TRFU7CisKKwl1cGRhdGVfb3NfcGFja2V0X2luZm8ocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOworfQorCitWT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KK30KKworI2RlZmluZSBCQ05fVEJUVF9PRkZTRVQJCTY0CS8vZGVmZXIgNjQgdXMKK1ZPSUQgUmVTeW5jQmVhY29uVGltZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKworCVVJTlQzMiAgT2Zmc2V0OworCisKKwlPZmZzZXQgPSAocEFkLT5UYnR0VGlja0NvdW50KSAlIChCQ05fVEJUVF9PRkZTRVQpOworCisJcEFkLT5UYnR0VGlja0NvdW50Kys7CisKKwkvLworCS8vIFRoZSB1cGRhdGVkIEJlYWNvbkludGVydmFsIFZhbHVlIHdpbGwgYWZmZWN0IEJlYWNvbiBJbnRlcnZhbCBhZnRlciB0d28gVEJUVAorCS8vIGJlYWNhc3VlIHRoZSBvcmlnaW5hbCBCZWFjb25JbnRlcnZhbCBoYWQgYmVlbiBsb2FkZWQgaW50byBuZXh0IFRCVFRfVElNRVIKKwkvLworCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0yKSkKKwl7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMSA7CS8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0xKSkKKwkJeworCQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhXzI4NzAuYwpAQCAtMCwwICsxLDk2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworLyoKKyAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgVVNCLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCisJaW4gb3RoZXIgZmlsZXMuCisKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworLyoKKwlXZSBjYW4gZG8gY29weSB0aGUgZnJhbWUgaW50byBwVHhDb250ZXh0IHdoZW4gbWF0Y2ggZm9sbG93aW5nIGNvbmRpdGlvbnMuCisJCT0+CisJCT0+CisJCT0+CisqLworc3RhdGljIGlubGluZSBORElTX1NUQVRVUyBSdG1wVVNCQ2FuRG9Xcml0ZSgKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gVUNIQVIJCQlRdWVJZHgsCisJSU4gSFRfVFhfQ09OVEVYVCAJKnBIVFRYQ29udGV4dCkKK3sKKwlORElTX1NUQVRVUwljYW5Xcml0ZSA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKworCWlmICgoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgPCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBMT0NBTF9UWEJVRl9TSVpFKSA+IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUnRtcFVTQkNhbkRvV3JpdGUgYzEhXG4iKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOworCX0KKwllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCBMT0NBTF9UWEJVRl9TSVpFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUnRtcFVTQkNhbkRvV3JpdGUgYzIhXG4iKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOworCX0KKwllbHNlIGlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMzIVxuIikpOworCX0KKwllbHNlCisJeworCQljYW5Xcml0ZSA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisKKwlyZXR1cm4gY2FuV3JpdGU7Cit9CisKKworVVNIT1JUIFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCisJLy8gRHVtbXkgZnVuY3Rpb24uIFNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisJcmV0dXJuIDA7CisKK30KKworVVNIT1JUCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJZnJhZ051bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOwkvLyBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguCisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJVUNIQVIJCQlRdWVJZHg7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKKwlCT09MRUFOCQkJVHhRTGFzdFJvdW5kID0gRkFMU0U7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCisJLy8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCWlmKGZyYWdOdW0gPT0gMCkKKwl7CisJCS8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLgorCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgorCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQl7CisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArPSA4OworCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OworCQkJCWZpbGxPZmZzZXQgKz0gODsKKwkJCX0KKwkJCXBUeEJsay0+UHJpdiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybihTdGF0dXMpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIEZvciBzdWItc2VxdWVudCBmcmFtZXMgb2YgdGhpcyBidWxrLW91dCBiYXRjaC4gSnVzdCBjb3B5IGl0IHRvIG91ciBidWxrLW91dCBidWZmZXIuCisJCVN0YXR1cyA9ICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlmaWxsT2Zmc2V0ICs9IHBUeEJsay0+UHJpdjsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybihTdGF0dXMpOworCQl9CisJfQorCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmWzBdKSwgVFhJTkZPX1NJWkUpOworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmWzBdKTsKKwlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCS8vIGNvcHkgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAorCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50CisJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwlwVHhCbGstPlByaXYgKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCS8vIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOworCisJaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCisJeworCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMDsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYgKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKKwkJeworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQkJVHhRTGFzdFJvdW5kID0gVFJVRTsKKwkJfQorCX0KKwllbHNlCisJeworCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKKwlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOworCisJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgorCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQorCXsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCS8vIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLiAzOTA2IHVzZWQgdG8gcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7CisJCWlmIChUeFFMYXN0Um91bmQgPT0gVFJVRSkKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisKKwkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCisJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfQorCisKKwlyZXR1cm4oU3RhdHVzKTsKKworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJVVNIT1JUCQkJaHdIZHJMZW47CisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKKwlVQ0hBUgkJCVF1ZUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCUJPT0xFQU4JCQliVHhRTGFzdFJvdW5kID0gRkFMU0U7CisKKwkvLyBGb3IgVVNCLCBkaWRuJ3QgbmVlZCBQQ0lfTUFQX1NJTkdMRSgpCisJLy9TcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKGNoYXIgKikgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCisJLy8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCisKKwkvLyBDaGVjayByaW5nIGZ1bGwuCisJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJCXBUeFdJPSAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pOworCisJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KKwkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCXsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OworCQkJZmlsbE9mZnNldCArPSA4OworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOworCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKKwkJRE1BSGRyTGVuID0gVFhXSV9TSVpFICsgaHdIZHJMZW47CisJCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAorCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKKworCQlwVHhCbGstPlByaXYgPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCisJCS8vIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQKKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYgKyBwVHhCbGstPlByaXYpID4gTUFYX1RYQlVMS19MSU1JVCkKKwkJeworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQkJYlR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCX0KKwkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwV2lyZWxlc3NQYWNrZXQgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKKworCQkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGVkIGlzc3VlLgorCQkvLwkxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhjb250ZXh0LgorCQkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KKwkJLy8JMy4gSW4gdGhlIGJ1bGstb3V0IGNvbXBsbGV0ZSwgaXQgbmVlZCB0byBkbyBhbm90aGVyIGJ1bGstb3V0LAorCQkvLwkJCWlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sCisJCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCisJCS8vCTQuIEludGVycnVwdCBjb21wbGV0ZS4KKwkJLy8gIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4KKwkJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCisJCS8vCQlhbmQgdGhlIHBhY2tldCB3aWxsIHdyb25nLgorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOworCQlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoYlR4UUxhc3RSb3VuZCkKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCX0KKworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKworCS8vIHN1Y2NlZWQgYW5kIHJlbGVhc2UgdGhlIHNrYiBidWZmZXIKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybihTdGF0dXMpOworCit9CisKKworVVNIT1JUIFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJVVNIT1JUCQkJaHdIZHJMZW47CS8vIFRoZSBod0hkckxlbiBjb25zaXN0IG9mIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIGhlYWRlciBwYWRkaW5nIGxlbmd0aC4KKwlVSU5UMzIJCQlmaWxsT2Zmc2V0OworCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKKwlUWFdJX1NUUlVDCQkqcFR4V0k7CisJUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCVF1ZUlkeDsKKwlORElTX1NUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJLy9VSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCisJLy8KKwlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKKwlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlpZihmcmFtZU51bSA9PSAwKQorCXsKKwkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgYnVsay1vdXQgYmF0Y2guCisJCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOworCisJCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCisJCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCisJCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJCXsKKworCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCX0KKwkJCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOworCisJCQkvLworCQkJLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQkJLy8KKwkJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQorCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCisJCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJCWVsc2UKKwkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCQkvLyBVcGRhdGUgdGhlIHBUeEJsay0+UHJpdi4KKwkJCXBUeEJsay0+UHJpdiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47CisKKwkJCS8vCXBUeEluZm8tPlVTQkRNQXBrdExlbiBub3cganVzdCBhIHRlbXAgdmFsdWUgYW5kIHdpbGwgdG8gY29ycmVjdCBsYXR0ZXIuCisJCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShwVHhCbGstPlByaXYpLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOworCisJCQkvLyBDb3B5IGl0LgorCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgcFR4QmxrLT5Qcml2KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwV2lyZWxlc3NQYWNrZXQrIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gcFR4QmxrLT5Qcml2OworCQkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+UHJpdjsKKwkJfQorCX0KKwllbHNlCisJewkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgorCisJCVN0YXR1cyA9ICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlmaWxsT2Zmc2V0ID0gIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYpOworCQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOworCisJCQkvL2h3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgcFR4QmxrLT5NcGR1SGVhZGVyTGVuKTsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSAocFR4QmxrLT5NcGR1SGVhZGVyTGVuKTsKKwkJCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisJCX0KKwkJZWxzZQorCQl7CS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQgbm93IHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gc2h1dGRvd24uCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcml0ZU11bHRpVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIHN1Yi1zZXF1ZW50IGZyYW1lcy5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisKKworCS8vIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZSBpc3N1ZS4KKwkvLwkxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhDb250ZXh0LgorCS8vCTIuIEFuIGludGVycnVwdCBicmVhayBvdXIgcm91dGluZSBhbmQgaGFuZGxlIGJ1bGstb3V0IGNvbXBsZXRlLgorCS8vCTMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwKKwkvLwkJCWlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sCisJLy8JCQlidXQgdGhlIHBheWxvYWQgc3RpbGwgbm90IGNvcHllZC4gdGhlIHBUeENvbnRleHQtPlNhdmVkUGFkW10gd2lsbCBzYXZlIGFzIGFsbHplcm8uIGFuZCBzZXQgdGhlIGJDb3B5UGFkID0gVFJVRS4KKwkvLwk0LiBJbnRlcnJ1cHQgY29tcGxldGUuCisJLy8gIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4KKwkvLwk2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4KKwkvLwkJYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiV3JpdGVNdWx0aVR4UmVzb3VyY2U6IENXUG9zID0gJWxkLCBOQk91dFBvcyA9ICVsZC5cbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyBDb3B5IHRoZSBmcmFtZSBjb250ZW50IGludG8gRE1BIGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBwVHhCbGstPlByaXYKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKwlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCitkb25lOgorCS8vIFJlbGVhc2UgdGhlIHNrYiBidWZmZXIgaGVyZQorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuKFN0YXR1cyk7CisKK30KKworCitWT0lEIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAorCUlOCVVTSE9SVAkJCVR4SWR4KQoreworCVVDSEFSCQkJUXVlSWR4OworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwlVSU5UMzIJCQlmaWxsT2Zmc2V0OworCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKKwlUWFdJX1NUUlVDCQkqcFR4V0k7CisJVUlOVDMyCQkJVVNCRE1BcGt0TGVuLCBwYWRkaW5nOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0OworCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKKwl7CisJCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCWlmICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSB8fCAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24tOCkgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJCSYmIChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKKwkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdKTsKKwkJZWxzZQorCQkJcFdpcmVsZXNzUGFja2V0ID0gKFBVQ0hBUikoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdKTsKKworCQkvLworCQkvLyBVcGRhdGUgVHhJbmZvLT5VU0JETUFwa3RMZW4gLAorCQkvLwkJdGhlIGxlbmd0aCA9IFRYV0lfU0laRSArIDgwMi4xMV9oZHIgKyA4MDIuMTFfaGRyX3BhZCArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcyArIEJ1bGstT3V0LXBhZGRpbmcKKwkJLy8KKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwV2lyZWxlc3NQYWNrZXQpOworCisJCS8vIENhbGN1bGF0ZSB0aGUgYnVsay1vdXQgcGFkZGluZworCQlVU0JETUFwa3RMZW4gPSBwVHhCbGstPlByaXYgLSBUWElORk9fU0laRTsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8vIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQKKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47CisKKwkJLy8KKwkJLy8gVXBkYXRlIFRYV0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAsCisJCS8vCQl0aGUgbGVuZ3RoID0gODAyLjExIGhlYWRlciArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcworCQlwVHhXST0gKFBUWFdJX1NUUlVDKShwV2lyZWxlc3NQYWNrZXQgKyBUWElORk9fU0laRSk7CisJCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworCisJCS8vCisJCS8vIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uCisJCS8vCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYpPiBNQVhfVFhCVUxLX0xJTUlUKQorCQl7CS8vIEFkZCAzOTA2IGZvciBwcmV2ZW50IHRoZSBOZXh0QnVsa091dCBwYWNrZXQgc2l6ZSBpcyBhIEEtUkFMSU5LL0EtTVNEVSBGcmFtZS4KKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCX0KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKworCQkvLworCQkvLwlaZXJvIHRoZSBsYXN0IHBhZGRpbmcuCisJCS8vCisJCXBXaXJlbGVzc1BhY2tldCA9ICgmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldCArIHBUeEJsay0+UHJpdl0pOworCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCQkvLyBGaW5hbGx5LCBzZXQgYkN1cldyaXRpbmcgYXMgRkFMU0UKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCisJfQorCWVsc2UKKwl7CS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQgbm93IHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gc2h1dGRvd24uCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZpbmFsV3JpdGVUeFJlc291cmNlKCk6YkN1cldyaXRpbmcgaXMgRkFMU0Ugd2hlbiBoYW5kbGUgbGFzdCBmcmFtZXMuXG4iKSk7CisJfQorCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKK30KKworCitWT0lEIFJ0bXBVU0JEYXRhTGFzdFR4SWR4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVTSE9SVAkJCVR4SWR4KQoreworCS8vIERPIG5vdGhpbmcgZm9yIFVTQi4KK30KKworCisvKgorCVdoZW4gY2FuIGRvIGJ1bGstb3V0OgorCQkxLiBUeFN3RnJlZUlkeCA8IFRYX1JJTkdfU0laRTsKKwkJCUl0IG1lYW5zIGhhcyBhdCBsZWFzdCBvbmUgUmluZyBlbnRpdHkgaXMgcmVhZHkgZm9yIGJ1bGstb3V0LCBraWNrIGl0IG91dC4KKwkJMi4gSWYgVHhTd0ZyZWVJZHggPT0gVFhfUklOR19TSVpFCisJCQlDaGVjayBpZiB0aGUgQ3VyV3JpdGluZyBmbGFnIGlzIEZBTFNFLCBpZiBpdCdzIEZBTFNFLCB3ZSBjYW4gZG8ga2ljayBvdXQuCisKKyovCitWT0lEIFJ0bXBVU0JEYXRhS2lja091dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KQoreworCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisKKy8qCisJTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKKwlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBSVDI4NzAgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgorICovCitpbnQgUnRtcFVTQk1nbXRLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKKwlJTiBVQ0hBUiAJCQlRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKKwlJTiBVSU5UIAkJCVNyY0J1ZkxlbikKK3sKKwlQVFhJTkZPX1NUUlVDCXBUeEluZm87CisJVUxPTkcJCQlCdWxrT3V0U2l6ZTsKKwlVQ0hBUgkJCXBhZExlbjsKKwlQVUNIQVIJCQlwRGVzdDsKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKwlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKHBTcmNCdWZWQSk7CisKKwkvLyBCdWlsZCBvdXIgVVJCIGZvciBVU0JECisJQnVsa091dFNpemUgPSBTcmNCdWZMZW47CisJQnVsa091dFNpemUgPSAoQnVsa091dFNpemUgKyAzKSAmICh+Myk7CisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoQnVsa091dFNpemUgLSBUWElORk9fU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCisJQnVsa091dFNpemUgKz0gNDsgLy8gQWx3YXlzIGFkZCA0IGV4dHJhIGJ5dGVzIGF0IGV2ZXJ5IHBhY2tldC4KKworCS8vIElmIEJ1bGtPdXRTaXplIGlzIG11bHRpcGxlIG9mIEJ1bGtPdXRNYXhQYWNrZXRTaXplLCBhZGQgZXh0cmEgNCBieXRlcyBhZ2Fpbi4KKwlpZiAoKEJ1bGtPdXRTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKKwkJQnVsa091dFNpemUgKz0gNDsKKworCXBhZExlbiA9IEJ1bGtPdXRTaXplIC0gU3JjQnVmTGVuOworCUFTU0VSVCgocGFkTGVuIDw9IFJUTVBfUEtUX1RBSUxfUEFERElORykpOworCisJLy8gTm93IG1lbXplcm8gYWxsIGV4dHJhIHBhZGRpbmcgYnl0ZXMuCisJcERlc3QgPSAoUFVDSEFSKShwU3JjQnVmVkEgKyBTcmNCdWZMZW4pOworCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBwYWRMZW4pOworCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCBwYWRMZW4pOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7CisJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IChQVFhfQlVGRkVSKShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkpOworCisJLy8gTGVuZ3RoIGluIFR4SW5mbyBzaG91bGQgYmUgOCBsZXNzIHRoYW4gYnVsa291dCBzaXplLgorCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSBCdWxrT3V0U2l6ZTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gVFJVRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IFRSVUU7CisKKworCS8vZm9yIGRlYnVnCisJLy9oZXhfZHVtcCgiUnRtcFVTQk1nbXRLaWNrT3V0IiwgJnBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAocE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA+IDE2ID8gMTYgOiBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplKSk7CisKKwkvL3BBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkvL3BBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8vaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPT0gTUdNVF9SSU5HX1NJWkUpCisJLy8JbmVlZEtpY2tPdXQgPSBUUlVFOworCisJLy8gRGVjcmVhc2UgdGhlIFR4U3dGcmVlSWR4IGFuZCBJbmNyZWFzZSB0aGUgVFhfQ1RYX0lEWAorCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgtLTsKKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7CisKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOworCS8vaWYgKG5lZWRLaWNrT3V0KQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCXJldHVybiAwOworfQorCisKK1ZPSUQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVUNIQVIJCVF1ZUlkeCwKKwlJTiBVQ0hBUgkJKnBOdWxsRnJhbWUsCisJSU4gVUlOVDMyCQlmcmFtZUxlbikKK3sKKwlpZiAocEFkLT5OdWxsQ29udGV4dC5JblVzZSA9PSBGQUxTRSkKKwl7CisJCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQ7CisJCVBUWElORk9fU1RSVUMJcFR4SW5mbzsKKwkJUFRYV0lfU1RSVUMJCXBUeFdJOworCQlQVUNIQVIJCQlwV2lyZWxlc3NQa3Q7CisKKwkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKworCQkvLyBTZXQgdGhlIGluIHVzZSBiaXQKKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCXBXaXJlbGVzc1BrdCA9IChQVUNIQVIpJnBOdWxsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCisJCVJUTVBaZXJvTWVtb3J5KCZwV2lyZWxlc3NQa3RbMF0sIDEwMCk7CisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcFdpcmVsZXNzUGt0WzBdOworCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoSEVBREVSXzgwMl8xMSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7CisJCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7CisJCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkVdOworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoSEVBREVSXzgwMl8xMSkpLAorCQkJMCwgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCQlSVE1QTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpJnBXaXJlbGVzc1BrdFtUWElORk9fU0laRSArIFRYV0lfU0laRV0sIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9ICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihwQWQtPk51bGxGcmFtZSkgKyA0OworCisJCS8vIEZpbGwgb3V0IGZyYW1lIGxlbmd0aCBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIEJ1bGsgb3V0IGFyYml0b3IKKwkJLy9wTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplID0gVHJhbnNmZXJCdWZmZXJMZW5ndGg7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBzZW5kIE5VTEwgRnJhbWUgQCVkIE1icHMuLi5cbiIsIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKTsKKworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyCXRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCU5vIGVycgorCQlORElTX1NUQVRVU19GQUlMVVJFCQlFcnJvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBDaGVja1J4RXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTglQUlhXSV9TVFJVQwlwUnhXSSwKKwlJTglQUlQyOFhYX1JYRF9TVFJVQwlwUnhJTkZPKQoreworCVBDSVBIRVJfS0VZIHBXcGFLZXk7CisJSU5UCWRCbTsKKworCWlmIChwQWQtPmJQcm9taXNjdW91cyA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJaWYocFJ4SU5GTyA9PSBOVUxMKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycworCWlmIChwUnhJTkZPLT5DcmMpCisJeworCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgorCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCWlmIChkQm0gPD0gLTg3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTgyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTc3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTcyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTY3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTYyKQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOworCQllbHNlIGlmIChkQm0gPD0gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOworCQllbHNlIGlmIChkQm0gPiAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KyAxNCk7CisKKwkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcworCWlmIChwSGVhZGVyLT5GQy5Ub0RzKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkVycjtGQy5Ub0RzXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8vIFBhdWwgMDQtMDMgZm9yIE9GRE0gUnggbGVuZ3RoIGlzc3VlCisJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNQVhfQUdHUkVHQVRJT05fU0laRSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJyZWNlaXZlZCBwYWNrZXQgdG9vIGxvbmdcbiIpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCisJLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgorCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKKwkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCisJaWYgKHBSeElORk8tPkRlY3J5cHRlZCAmJiBwUnhJTkZPLT5DaXBoZXJFcnIpCisJeworCisJCS8vCisJCS8vIE1JQyBFcnJvcgorCQkvLworCQlpZiAoKHBSeElORk8tPkNpcGhlckVyciA9PSAyKSAmJiBwUnhJTkZPLT5NeUJzcykKKwkJeworCQkJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhXSS0+S2V5SW5kZXhdOworCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKKwkJfQorCisJCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYKKwkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhXSS0+S2V5SW5kZXhdLkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSAmJgorCQkJKHBIZWFkZXItPlNlcXVlbmNlID09IHBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlKSkKKwkJeworCQkJLy8KKwkJCS8vIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4KKwkJCS8vCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCX0KKworCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCitWT0lEIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpCit7CisgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKworCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAwKTsKKworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworfQorCitWT0lEIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKQoreworCUFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisKKwkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCisJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkVuYWJsZUF1dG9XYWtldXAgPSAxOworCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgorCisJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVDI4eHhVc2JNbG1lUmFkaW9PbigpXG4iKSk7CisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyAgICAJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAwKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCU5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7CisKKwkvLyBFbmFibGUgVHgvUngKKwlSVE1QRW5hYmxlUnhUeChwQWQpOworCisJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Cit9CisKK1ZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVJTlQzMglWYWx1ZSwgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKClcbiIpKTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT0ZGKTsKKwkvLyBTZXQgUmFkaW8gb2ZmIGZsYWcKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ2xlYW4gdXAgb2xkIGJzcyB0YWJsZQorCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwkvLyBEaXNhYmxlIE1BQyBUeC9SeAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCS8vIE1BQ19TWVNfQ1RSTCA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAwKTsKKworCS8vIFBXUl9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDQwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMCk7CisKKwkvLyBUWF9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDIwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCAwKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0KKwllbHNlCisJeworCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJfQorCisJLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX13aGlsZSAoaSsrIDwgMTAwKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzkyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0wLDAgKzEsMzcxMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dQQVBTS19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzaG93X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQywgUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DW10gPSB7CisJeyJTU0lEIiwJCQkJCVNob3dfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJU2hvd19XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNob3dfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTaG93X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNob3dfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2hvd19DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJU2hvd19SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCQkJCVNob3dfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCQkJCVNob3dfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCQkJCVNob3dfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCQkJU2hvd19IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCQkJU2hvd19IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgU2hvd19IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCVNob3dfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCVNob3dfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgU2hvd19IdEF1dG9CYV9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7IkNvdW50cnlSZWdpb24iLAkJCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IkNvdW50cnlDb2RlIiwJCQkJU2hvd19Db3VudHJ5Q29kZV9Qcm9jfSwKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCVNob3dfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCVNob3dfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCVNob3dfSUVFRTgwMjExSF9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICB7Ik5ldHdvcmtUeXBlIiwJCQkJU2hvd19OZXR3b3JrVHlwZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7IkF1dGhNb2RlIiwJCQkJU2hvd19BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQlTaG93X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCVNob3dfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQlTaG93X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCVNob3dfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJU2hvd19LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQlTaG93X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJU2hvd19XUEFQU0tfUHJvY30sCisJe05VTEwsIE5VTEx9Cit9OworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBEcml2ZXIgdmVyc2lvbi4KKworICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UgaWYgKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0CisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24gZm9yIEEgYmFuZC4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgcmVnaW9uOworCisJcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gQ291bnRyeSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBFRVBST00gbm90IHByb2dyYW1tZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORwlXaXJlbGVzc01vZGU7CisJSU5UCQlzdWNjZXNzID0gVFJVRTsKKworCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlJTlQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKQorCQl7CisJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCS8vIFNldCBBZGhvY01vZGUgcmF0ZXMKKwkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGl0IGlzIG5lZWRlZCB0byBzZXQgU1NJRCB0byB0YWtlIGVmZmVjdAorCWlmIChzdWNjZXNzID09IFRSVUUpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6Oig9JWxkKVxuIiwgV2lyZWxlc3NNb2RlKSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2hhbm5lbAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworIAlJTlQJCXN1Y2Nlc3MgPSBUUlVFOworCVVDSEFSCUNoYW5uZWw7CisKKwlDaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJLy8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIHZhbGlkCisJaWYgKENoYW5uZWxTYW5pdHkocEFkLCBDaGFubmVsKSA9PSBUUlVFKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwkJCQl7CisJCQkJCU5fU2V0Q2VuQ2gocEFkKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwLCBjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJeworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJc3VjY2VzcyA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NoYW5uZWxfUHJvYzo6KENoYW5uZWw9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU2hvcnQgU2xvdCBUaW1lIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBTaG9ydFNsb3Q7CisKKwlTaG9ydFNsb3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNob3J0U2xvdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisJZWxzZSBpZiAoU2hvcnRTbG90ID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TaG9ydFNsb3RfUHJvYzo6KFNob3J0U2xvdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHggcG93ZXIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeFBvd2VyOworCUlOVCAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworCVR4UG93ZXIgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4UG93ZXIgPD0gMTAwKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFR4UG93ZXI7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCXN1Y2Nlc3MgPSBUUlVFOworCX0KKwllbHNlCisJCXN1Y2Nlc3MgPSBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFBvd2VyX1Byb2M6OihUeFBvd2VyUGVyY2VudGFnZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IDExQi8xMUcgUHJvdGVjdGlvbgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQorCXsKKwkJY2FzZSAwOiAvL0FVVE8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhQcmVhbWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKKworCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCisJc3dpdGNoIChQcmVhbWJsZSkKKwl7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgorCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisJCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBSVFMgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworCisJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChSdHNUaHJlc2ggPiAwKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWVsc2UgaWYgKFJ0c1RocmVzaCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUlRTVGhyZXNob2xkX1Byb2M6OihSVFNUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBGcmFnbWVudCBUaHJlc2hvbGQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7CisKKwlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisJeworCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwl9CisJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwl7CisJCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50CisJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jOjooRnJhZ1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhCdXJzdAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFR4QnVyc3Q7CisKKwlUeEJ1cnN0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVHhCdXJzdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7CisJZWxzZSBpZiAoVHhCdXJzdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhCdXJzdF9Qcm9jOjooVHhCdXJzdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIGFnZ3JlOworCisJYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGFnZ3JlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGFnZ3JlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUGt0QWdncmVnYXRlX1Byb2M6OihBR0dSRT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IElFRUU4MDIxMUguCisgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIDEgd2hlbiBuZWVkcyByYWRhciBkZXRlY3Rpb24sIG90aGVyd2lzZSAwCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUxPTkcgaWVlZTgwMjExaDsKKworCWllZWU4MDIxMWggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGllZWU4MDIxMWggPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworCWVsc2UgaWYgKGllZWU4MDIxMWggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0lFRUU4MDIxMUhfUHJvYzo6KElFRUU4MDIxMUg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBGb3IgRGVidWcgaW5mb3JtYXRpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKKworICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKKyAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVzZXQgc3RhdGlzdGljcyBjb3VudGVyCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICBhcmcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCS8vVUNIQVIgICAgICAgICAgIGk7CisJLy9NQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKKworCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisKKwkvLyBSZXNldCBIb3RTcG90IGNvdW50ZXIKKyNpZiAwIC8vIFRvRG8uCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpIHx8IChwRW50cnktPlNzdCAhPSBTU1RfQVNTT0MpKQorCQkJY29udGludWU7CisKKwkJcEVudHJ5LT5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lID0gMDsKKwkJcEVudHJ5LT5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudD0gMDsKKwkJcEVudHJ5LT5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudD0gMDsKKwl9CisjZW5kaWYKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBZGQgV1BBIGtleSBwcm9jZXNzLgorCQlJbiBBZGhvYyBXUEFOT05FLCBiUGFpcndpc2UgPSAwOyAgS2V5SWR4ID0gMDsKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwQnVmCQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZiAwIC8vIHJlbW92ZSBieSBBbGJlcnRZCitORElTX1NUQVRVUyBSVE1QV1BBQWRkS2V5UHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVk9JRAkJCXBCdWYpCit7CisJUE5ESVNfODAyXzExX0tFWQlwS2V5OworCVVMT05HCQkJCUtleUlkeDsKKy8vCU5ESVNfU1RBVFVTIAkJU3RhdHVzOworLy8JVUxPTkcgCW9mZnNldDsJLy8gdW51c2VkIHZhcmlhYmxlLCBzbm93cGluIDIwMDYuMDcuMTMKKworCVBVQ0hBUgkJcFR4TWljLCBwUnhNaWM7CisJQk9PTEVBTiAJYlR4S2V5OyAJCS8vIFNldCB0aGUga2V5IGFzIHRyYW5zbWl0IGtleQorCUJPT0xFQU4gCWJQYWlyd2lzZTsJCS8vIEluZGljYXRlIHRoZSBrZXkgaXMgcGFpcndpc2Uga2V5CisJQk9PTEVBTiAJYktleVJTQzsJCS8vIGluZGljYXRlIHRoZSByZWNlaXZlICBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlLgorCQkJCQkJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgc2V0IGJ5IHRoZSBOSUMuCisJQk9PTEVBTiAJYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIGtleSBpcyBzZXQgYnkgYXV0aGVudGljYXRvci4KKwlVQ0hBUgkJYXBpZHggPSBCU1MwOworCisJcEtleSA9IChQTkRJU184MDJfMTFfS0VZKSBwQnVmOworCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHhmZjsKKwkvLyBCaXQgMzEgb2YgQWRkLWtleSwgVHggS2V5CisJYlR4S2V5CQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAzMCBvZiBBZGQta2V5IFBhaXJ3aXNlS2V5CisJYlBhaXJ3aXNlCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg0MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCisJYktleVJTQyAJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCisJYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQUFkZEtleVByb2M9PT5wS2V5LT5LZXlJbmRleCA9ICV4LiBiUGFpcndpc2U9ICVkXG4iLCBwS2V5LT5LZXlJbmRleCwgYlBhaXJ3aXNlKSk7CisJLy8gMS4gQ2hlY2sgR3JvdXAgLyBQYWlyd2lzZSBLZXkKKwlpZiAoYlBhaXJ3aXNlKQkvLyBQYWlyd2lzZSBLZXkKKwl7CisJCS8vIDEuIEtleUlkeCBtdXN0IGJlIDAsIG90aGVyd2lzZSwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoS2V5SWR4ICE9IDApCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAyLiBDaGVjayBiVHgsIGl0IG11c3QgYmUgdHJ1ZSwgb3RoZXJ3aXNlLCByZXR1cm4gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBCisJCWlmIChiVHhLZXkgPT0gRkFMU0UpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLiBJZiBCU1NJRCBpcyBhbGwgMHhmZiwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoTUFDX0FERFJfRVFVQUwocEtleS0+QlNTSUQsIEJST0FEQ0FTVF9BRERSKSkKKwkJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJCS8vIDMuMSBDaGVjayBQYWlyd2lzZSBrZXkgbGVuZ3RoIGZvciBUS0lQIGtleS4gRm9yIEFFUywgaXQncyBhbHdheXMgMTI4IGJpdHMKKwkJLy9pZiAoKHBBZGFwdGVyLT5Qb3J0Q2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJiAocEtleS0+S2V5TGVuZ3RoICE9IExFTl9US0lQX0tFWSkpCisJCWlmICgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJiAocEtleS0+S2V5TGVuZ3RoICE9IExFTl9US0lQX0tFWSkpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeXBlID0gUEFJUldJU0VfS0VZOworCisJCWlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJeworCQkJLy8gU2VuZCBtZWRpYSBzcGVjaWZpYyBldmVudCB0byBzdGFydCBQTUtJRCBjYWNoaW5nCisJCQlSVE1QSW5kaWNhdGVXUEEyU3RhdHVzKHBBZCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gMS4gQ2hlY2sgQlNTSUQsIGlmIG5vdCBjdXJyZW50IEJTU0lEIG9yIEJjYXN0LCByZXR1cm4gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBCisJCWlmICgoISBNQUNfQUREUl9FUVVBTChwS2V5LT5CU1NJRCwgQlJPQURDQVNUX0FERFIpKSAmJgorCQkJKCEgTUFDX0FERFJfRVFVQUwocEtleS0+QlNTSUQsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCkpKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMi4gQ2hlY2sgS2V5IGluZGV4IGZvciBzdXBwb3J0ZWQgR3JvdXAgS2V5CisJCWlmIChLZXlJZHggPj0gR1JPVVBfS0VZX05VTSkKKwkJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJCS8vIDMuIFNldCBhcyBkZWZhdWx0IFR4IEtleSBpZiBiVHhLZXkgaXMgVFJVRQorCQlpZiAoYlR4S2V5ID09IFRSVUUpCisJCQlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHlwZSA9IEdST1VQX0tFWTsKKwl9CisKKwkvLyA0LiBTZWxlY3QgUnhNaWMgLyBUeE1pYyBiYXNlZCBvbiBTdXBwIC8gQXV0aGVudGljYXRvcgorCWlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwl7CisJCS8vIGZvciBXUEEtTm9uZSBUeCwgUnggTUlDIGlzIHRoZSBzYW1lCisJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCXBSeE1pYyA9IHBUeE1pYzsKKwl9CisJZWxzZSBpZiAoYkF1dGhlbnRpY2F0b3IgPT0gVFJVRSkKKwl7CisJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7CisJfQorCWVsc2UKKwl7CisJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7CisJfQorCisJLy8gNi4gQ2hlY2sgUnhUc2MKKwlpZiAoYktleVJTQyA9PSBUUlVFKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uUnhUc2MsICZwS2V5LT5LZXlSU0MsIDYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uUnhUc2MsIDYpOworCX0KKworCS8vIDcuIENvcHkgaW5mb3JtYXRpb24gaW50byBQYWlyd2lzZSBLZXkgc3RydWN0dXJlLgorCS8vIHBLZXktPktleUxlbmd0aCB3aWxsIGluY2x1ZGUgVHhNaWMgYW5kIFJ4TWljLCB0aGVyZWZvcmUsIHdlIHVzZSAxNiBieXRlcyBoYXJkY29kZWQuCisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIDE2KTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCAxNik7CisJaWYgKHBLZXktPktleUxlbmd0aCA9PSBMRU5fVEtJUF9LRVkpCisJeworCQkvLyBPbmx5IEtleSBsZW50aCBlcXVhbCB0byBUS0lQIGtleSBoYXZlIHRoZXNlCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4TWljLCBwUnhNaWMsIDgpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeE1pYywgcFR4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5SeE1pYywgcFJ4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeE1pYywgcFR4TWljLCA4KTsKKwl9CisKKwlDT1BZX01BQ19BRERSKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQnNzSWQsIHBLZXktPkJTU0lEKTsKKworCS8vIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbMF0gPSAxOworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzFdID0gMDsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1syXSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbM10gPSAwOworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzRdID0gMDsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1s1XSA9IDA7CisJLy8gNC4gSW5pdCBUeFRzYyB0byBvbmUgYmFzZWQgb24gV2lGaSBXUEEgc3BlY3MKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzBdID0gMTsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzFdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzJdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzNdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzRdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LlR4VHNjWzVdID0gMDsKKworCWlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJfQorCWVsc2UgaWYgKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwl7CisJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCX0KKwllbHNlIGlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJeworCQlpZiAocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uS2V5TGVuID09IDUpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9PSAxMykKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwl9CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAgLy8gUGFpcndpc2UgS2V5LiBBZGQgQlNTSUQgdG8gV0NUYWJsZQorCXsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXlMZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbjsKKwl9CisKKwlpZiAoKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCXsKKwkJLy8KKwkJLy8gT24gV1BBMiwgVXBkYXRlIEdyb3VwIEtleSBDaXBoZXIuCisJCS8vCisJCWlmICghYlBhaXJ3aXNlKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U2hhcmVkS2V5WyVkXVslZF0uQ2lwaGVyQWxnID0gJWRcbiIsIGFwaWR4LCBLZXlJZHgsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZykpOworCisjaWYgMAorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlcyBLZXkgIyVkIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGddLEtleUlkeCkpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiUwMng6IiwgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uS2V5W2ldKSk7CisJfQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbgkgIFJ4IE1JQyBLZXkgPSAiKSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlMDJ4OiIsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4TWljW2ldKSk7CisJfQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbgkgIFR4IE1JQyBLZXkgPSAiKSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlMDJ4OiIsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4TWljW2ldKSk7CisJfQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbgkgIFJ4VFNDID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeFRzY1tpXSkpOworCX0KKyNlbmRpZgorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbiBwS2V5LT4gQlNTSUQ6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQlwS2V5LT5CU1NJRFswXSxwS2V5LT5CU1NJRFsxXSxwS2V5LT5CU1NJRFsyXSxwS2V5LT5CU1NJRFszXSxwS2V5LT5CU1NJRFs0XSxwS2V5LT5CU1NJRFs1XSkpOworCisJaWYgKChiVHhLZXkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgIC8vIFBhaXJ3aXNlIEtleS4gQWRkIEJTU0lEIHRvIFdDVGFibGUKKwkJUlRNUEFkZEJTU0lEQ2lwaGVyKHBBZCwgQlNTSURfV0NJRCwgcEtleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcpOworCisKKwkvLyBObyBtYXR0ZXIgcGFpcndpc2Uga2V5IG9yIHdoYXQgbGV5aWR4IGlzLCBhbHdheXMgaGFzIGEgY29weSBhdCBvbi1jaGlwIFNoYXJlZEtleXRhYmxlLgorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIGFwaWR4LAorCQkJCQkJICAoVUNIQVIpS2V5SWR4LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4TWljKTsKKworCS8vIFRoZSBXQ0lEIGtleSBzcGVjaWZpZWQgaW4gdXNlZCBhdCBUeC4gRm9yIFNUQSwgYWx3YXlzIHVzZSBwYWlyd2lzZSBrZXkuCisKKwkvLyBhZC1ob2MgbW9kZSBuZWVkIHRvIHNwZWNpZnkgV0FQIEdyb3VwIGtleSB3aXRoIFdDSUQgaW5kZXg9QlNTME1jYXN0X1dDSUQuIExldCdzIGFsd2F5cyBzZXQgdGhpcyBrZXkgaGVyZS4KKy8qCWlmIChiUGFpcndpc2UgPT0gRkFMU0UpCisJeworCQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQlOZGlzWmVyb01lbW9yeShJVkVJViwgOCk7CisJCS8vIDEuIElWL0VJVgorCQkvLyBTcGVjaWZ5IGtleSBpbmRleCB0byBmaW5kIHNoYXJlZCBrZXkuCisJCWlmICgocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc9PUNJUEhFUl9US0lQKSB8fAorCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPT1DSVBIRVJfQUVTKSkKKwkJSVZFSVZbM10gPSAweDIwOwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJVlszXSB8PSAoS2V5SWR4PDwgNik7CS8vIGdyb3Vwa2V5IGluZGV4IGlzIG5vdCAwCisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgSVZFSVZbaV0pOworCQl9CisKKwkJLy8gMi4gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6dXNlIHNoYXJlIGtleSwgQlNTSWR4IGlzIDAKKwkJV0NJREF0dHJpID0gKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPDwxKXxQQUlSV0lTRUtFWVRBQkxFOworCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCisJfQorCisqLworCisgICBpZiAocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHlwZSA9PSBHUk9VUF9LRVkpCisJeworCQkvLyA4MDIuMXggcG9ydCBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiISFXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCEhXG4iKSk7CisKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorI2VuZGlmCisKK0JPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAorICAgIElOICBDSEFSICpwSW5QdXRTdHIsCisgICAgSU4gIFVDSEFSIHN0ckxlbikKK3sKKyAgICBVQ0hBUiBpPTA7CisKKyAgICBmb3IgKGk9MDsgaTxzdHJMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmICgocEluUHV0U3RyW2ldIDwgMHgyMSkgfHwKKyAgICAgICAgICAgIChwSW5QdXRTdHJbaV0gPiAweDdFKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlbW92ZSBXUEEgS2V5IHByb2Nlc3MKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwQnVmCQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpCit7CisgICAgTkRJU184MDJfMTFfUkFURVMgYXJ5UmF0ZXM7CisKKyAgICBtZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICBzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgUEhZXzExQTogLy8gQSBvbmx5CisgICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcworICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcworICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcworICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MTg7IC8vIDEyTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwYzsgLy8gNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBIWV8xMUJHX01JWEVEOiAvLyBCL0cgTWl4ZWQKKyAgICAgICAgY2FzZSBQSFlfMTFCOiAvLyBCIG9ubHkKKyAgICAgICAgY2FzZSBQSFlfMTFBQkdfTUlYRUQ6IC8vIEEvQi9HIE1peGVkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMTAwMDAwMDogLy8xTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDI7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDAwMDAwOiAvLzJNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwNDsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUwMDAwMDA6IC8vNS41TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGI7IC8vIDUuNU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDExMDAwMDAwOiAvLzExTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisgICAgICAgICAgICAgICAgICAgIHsgLy9CIE9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsgLy8oQi9HKSBNaXhlZCBvciAoQS9CL0cpIE1peGVkCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDE2OyAvLyAxMU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgwYjsgLy8gNS41TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDA0OyAvLyAyTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDAyOyAvLyAxTWJwcworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFJUTVBTZXREZXNpcmVkUmF0ZXMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKK30KKworTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmKQoreworCVBORElTXzgwMl8xMV9SRU1PVkVfS0VZIHBLZXk7CisJVUxPTkcJCQkJCUtleUlkeDsKKwlORElTX1NUQVRVUyAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCUJPT0xFQU4gCWJUeEtleTsgCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKKwlCT09MRUFOIAliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQorCUJPT0xFQU4gCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KKwkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgorCUJPT0xFQU4gCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCisJSU5UIAkJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0tPiBSVE1QV1BBUmVtb3ZlS2V5UHJvY1xuIikpOworCisJcEtleSA9IChQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSkgcEJ1ZjsKKwlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4ZmY7CisJLy8gQml0IDMxIG9mIEFkZC1rZXksIFR4IEtleQorCWJUeEtleQkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMzAgb2YgQWRkLWtleSBQYWlyd2lzZUtleQorCWJQYWlyd2lzZQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgorCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwkvLyAxLiBJZiBiVHggaXMgVFJVRSwgcmV0dXJuIGZhaWx1cmUgaW5mb3JtYXRpb24KKwlpZiAoYlR4S2V5ID09IFRSVUUpCisJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJLy8gMi4gQ2hlY2sgUGFpcndpc2UgS2V5CisJaWYgKGJQYWlyd2lzZSkKKwl7CisJCS8vIGEuIElmIEJTU0lEIGlzIGJyb2FkY2FzdCwgcmVtb3ZlIGFsbCBwYWlyd2lzZSBrZXlzLgorCQkvLyBiLiBJZiBub3QgYnJvYWRjYXN0LCByZW1vdmUgdGhlIHBhaXJ3aXNlIHNwZWNpZmllZCBieSBCU1NJRAorCQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQnNzSWQsIHBLZXktPkJTU0lEKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lZClcbiIsIGkpKTsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5LZXlMZW4gPSAwOworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8vIDMuIEdyb3VwIEtleQorCWVsc2UKKwl7CisJCS8vIGEuIElmIEJTU0lEIGlzIGJyb2FkY2FzdCwgcmVtb3ZlIGFsbCBncm91cCBrZXlzIGluZGV4ZWQKKwkJLy8gYi4gSWYgQlNTSUQgbWF0Y2hlZCwgZGVsZXRlIHRoZSBncm91cCBrZXkgaW5kZXhlZC4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWxkKVxuIiwgS2V5SWR4KSk7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKUtleUlkeCk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIChTdGF0dXMpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgQWxsIFdQQSBLZXlzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QV1BBUmVtb3ZlQWxsS2V5cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKworCVVDSEFSIAlpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlQWxsS2V5cyhBdXRoTW9kZT0lZCwgV2VwU3RhdHVzPSVkKVxuIiwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisJLy8gRm9yIFdFUC9DS0lQLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlbW92ZSBpdCwgc2luY2UgV2luWFAgd29uJ3Qgc2V0IGl0IGFnYWluIGFmdGVyCisJLy8gTGluayB1cC4gQW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgaWYgdXNlciBjaGFuZ2VkIGl0LgorCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJcmV0dXJuOworCisJLy8gRm9yIFdQQS1Ob25lLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlbW92ZSBpdCwgc2luY2UgV2luWFAgd29uJ3Qgc2V0IGl0IGFnYWluIGFmdGVyCisJLy8gTGluayB1cC4gQW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgaWYgdXNlciBjaGFuZ2VkIGl0LgorCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQlyZXR1cm47CisKKwkvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKworCS8vIHNldCBhbGwgc2hhcmVkIGtleSBtb2RlIGFzIG5vLXNlY3VyaXR5LgorCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInJlbW92ZSAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW3BBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZ10sIGkpKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGkpOworCX0KKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoYW5nZSBOSUMgUEhZIG1vZGUuIFJlLWFzc29jaWF0aW9uIG1heSBiZSBuZWNlc3NhcnkuIHBvc3NpYmxlIHNldHRpbmdzCisJCWluY2x1ZGUgLSBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZXzExQSwgYW5kIFBIWV8xMUFCR19NSVhFRAorCisJQXJndW1lbnRzOgorCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBoeW1vZGUgIC0KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRQaHlNb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HIHBoeW1vZGUpCit7CisJSU5UIGk7CisJLy8gdGhlIHNlbGVjdGVkIHBoeW1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIFJGIElDIGVuY29kZWQgaW4gRTJQUk9NCisKKwkvLyBpZiBubyBjaGFuZ2UsIGRvIG5vdGhpbmcKKwkvKiBidWcgZml4CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gcGh5bW9kZSkKKwkJcmV0dXJuOworICAgICovCisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IChVQ0hBUilwaHltb2RlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QU2V0UGh5TW9kZSA6IFBoeU1vZGU9JWQsIGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOworI2Vsc2UKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gc2FuaXR5IGNoZWNrIHVzZXIgc2V0dGluZworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldFBoeU1vZGU6IGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLCB1c2UgZmlyc3QgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwl9CisKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlzd2l0Y2ggKHBoeW1vZGUpIHsKKwkJY2FzZSBQSFlfMTFCOgorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gNDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQorCQkJYnJlYWs7CisKKwkJY2FzZSBQSFlfMTFHOgorCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHgyNDsJICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF0gID0gMHgwQzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzFdICA9IDB4MTg7CSAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMl0gID0gMHgzMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVszXSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzhdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs5XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTBdID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzExXSA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJYnJlYWs7CisKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDhDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OTg7CSAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHgyNDsJICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSAgPSAweGIwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSAgPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKworCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKK30KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCisJCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBoeW1vZGUgIC0KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldEhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSkKK3sKKwkvL1VMT05HCSpwbWNzOworCVVJTlQzMglWYWx1ZSA9IDA7CisJVUNIQVIJQkJQVmFsdWUgPSAwOworCVVDSEFSCUJCUDNWYWx1ZSA9IDA7CisJVUNIQVIJUnhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRIVCA6IEhUX21vZGUoJWQpLCBFeHRPZmZzZXQoJWQpLCBNQ1MoJWQpLCBCVyglZCksIFNUQkMoJWQpLCBTSE9SVEdJKCVkKVxuIiwKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLAorCQkJCQkJCQkJCXBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKworCS8vIERvbid0IHplcm8gc3VwcG9ydGVkSHlQaHkgc3RydWN0dXJlLgorCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQsIHNpemVvZihwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSkpOworCisgICAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSAwOworCX0KKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gMzsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yID0gMzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRIVCA6IFJ4QkFXaW5MaW1pdCA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7CisKKwkvLyBNaW1vIHBvd2VyIHNhdmUsIEEtTVNEVSBzaXplLAorCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRIVCA6IEFNc2R1U2l6ZSA9ICVkLCBNaW1vUHMgPSAlZCwgTXBkdURlbnNpdHkgPSAlZCwgTWF4UkFtcGR1RmFjdG9yID0gJWRcbiIsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSwKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yKSk7CisKKwlpZihwSFRQaHlNb2RlLT5IdE1vZGUgPT0gSFRNT0RFX0dGKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDE7CisJfQorCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGID0gMDsKKworCS8vIERlY2lkZSBSeCBNQ1NTZXQKKwlzd2l0Y2ggKFJ4U3RyZWFtKQorCXsKKwkJY2FzZSAxOgorCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweDAwOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOworCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOiAvLyAzKjMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAgMHhmZjsKKwkJCWJyZWFrOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpICYmIChwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkgKQorCXsKKwkJcEhUUGh5TW9kZS0+QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudCA9IDE7CisJfQorCisJaWYocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOyAvLyBNQ1MgMzIKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAxOworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ0NLbW9kZWluNDAgPSAxOworCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSAocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9CRUxPVyk/IChFWFRDSEFfQkVMT1cpOiBFWFRDSEFfQUJPVkU7CisJCS8vIFNldCBSZWdzaXRlciBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgcG9zaXRpb24uCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUDNWYWx1ZSk7CisJCWlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCisJCXsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCUJCUDNWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQl9CisJCWVsc2UgaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKKwkJeworCQkJVmFsdWUgJj0gMHhmZTsKKwkJCUJCUDNWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCisJCS8vIFR1cm4gb24gQkJQIDQwTUh6IG1vZGUgbm93IG9ubHkgYXMgQVAgLgorCQkvLyBTdGEgY2FuIHR1cm4gb24gQkJQIDQwTUh6IGFmdGVyIGNvbm5lY3Rpb24gd2l0aCA0ME1IeiBBUC4gU3RhIG9ubHkgYnJvYWRjYXN0IDQwTUh6IGNhcGFiaWxpdHkgYmVmb3JlIGNvbm5lY3Rpb24uCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSB8fCBJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkKKwkJCSkKKwkJeworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUDNWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBFWFRDSEFfTk9ORTsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQkvLyBUdXJuIG9uIEJCUCAyME1IeiBtb2RlIGJ5IHJlcXVlc3QgaGVyZS4KKwkJeworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQl9CisJfQorCisJaWYocEhUUGh5TW9kZS0+U1RCQyA9PSBTVEJDX1VTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDID0gMDsKKwl9CisKKyNpZmRlZiBSVDI4NzAKKwkvKiBGcmFuayByZWNvbW1lbmQgLElmIG5vdCwgVHggbWF5YmUgYmxvY2sgaW4gaGlnaCBwb3dlci4gUnggaGFzIG5vIHByb2JsZW0qLworCWlmKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlpZihwSFRQaHlNb2RlLT5TSE9SVEdJID09IEdJXzQwMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDA7CisJfQorCisJLy8gV2Ugc3VwcG9ydCBsaW5rIGFkYXB0YXRpb24gZm9yIHVuc29saWNpdCBNQ1MgZmVlZGJhY2ssIHNldCB0byAyLgorCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPSBNQ1NGQktfTk9ORTsgLy9NQ1NGQktfVU5TT0xJQ0lUOworCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5Db250cm9sQ2hhbiA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJLy8gMSwgdGhlIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwuCisKKwkvLyBFRENBIHBhcmFtZXRlcnMgdXNlZCBmb3IgQVAncyBvd24gdHJhbnNtaXNzaW9uCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gOTQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSA0NzsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCisJCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBoeW1vZGUgIC0KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJUFJUX0hUX1BIWV9JTkZPCQlwRGVzaXJlZF9odF9waHkgPSBOVUxMOworCVVDSEFSCVR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07CisJVUNIQVIJRGVzaXJlZE1jcwk9IE1DU19BVVRPOworCisJZG8KKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcERlc2lyZWRfaHRfcGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCQlEZXNpcmVkTWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisJCQkvL3BBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRSA6IEZBTFNFOworCQkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZSAoRkFMU0UpOworCisJaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7CisJCXJldHVybjsKKwl9CisJUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7CisJLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUworCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOworCQlEZXNpcmVkTWNzID0gTUNTXzc7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKSAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOworCQlEZXNpcmVkTWNzID0gTUNTXzA7CisJfQorCisJcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOworCisJLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCisJc3dpdGNoIChUeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDIpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAzOiAvLyAzKjMKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCS8qIE1DUzAgfiBNQ1MyMywgMyBieXRlcyAqLworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDMpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKKwl7CisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPIHx8IERlc2lyZWRNY3MgPT0gTUNTXzMyKQorCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbNF0gPSAweDE7CisJfQorCisJLy8gdXBkYXRlIEhUIFJhdGUgc2V0dGluZworICAgIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorICAgICAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisgICAgZWxzZQorCSAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIEhUIElFIGZyb20gb3VyIGNhcGFiaWxpdHkuCisKKwlBcmd1bWVudHM6CisJCVNlbmQgYWxsIEhUIElFIGluIGJlYWNvbi9wcm9iZSByc3AvYXNzb2MgcnNwL2FjdGlvbiBmcmFtZS4KKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQoreworCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJUlRNUFplcm9NZW1vcnkocEFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKKworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0IDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggPSBwUnRIdC0+UmVjb21XaWR0aDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7CisJCVJUTVBNb3ZlTWVtb3J5KHBBZGRIdEluZm8tPk1DU1NldCwgLypwUnRIdC0+TUNTU2V0Ki9wTWNzU2V0LCA0KTsgLy8gcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLgorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZS4KKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit7CisJVUlOVDMyCQlXQ0lEQXR0cmkgPSAwOworCVVTSE9SVAkJb2Zmc2V0OworCVVDSEFSCQlJVkVJViA9IDA7CisJVVNIT1JUCQlXY2lkID0gMDsKKworCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEJzc0lkeCA+IEJTUzApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogVGhlIEJTUy1pbmRleCglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBJbmZyYSBsaW5rLiBcbiIsIEJzc0lkeCkpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gMS4JSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuCisJCQkvLyAyLglJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4KKwkJCS8vCQkJCQkgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuCisJCQlpZiAocEVudHJ5ICYmIEFESE9DX09OKHBBZCkpCisJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJZWxzZSBpZiAocEVudHJ5ICYmIElORlJBX09OKHBBZCkpCisJCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJCQlXY2lkID0gcEVudHJ5LT5BaWQ7CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVdjaWQgPSBCU1NJRF9XQ0lEOworCQkJfQorCQkJZWxzZQorCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNNZXNoKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQllbHNlIGlmICgocEVudHJ5KSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSAmJgorCQkJCQkoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJCQkgCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9OT05FKSkpCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWVsc2UKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgU0hBUkVES0VZVEFCTEU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCisKKwkvLyBVcGRhdGUgSVYvRUlWIHRhYmxlCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV2NpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJLy8gV1BBIG1vZGUKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQkvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgaXMgMCBmb3IgcGFpcndpc2Uga2V5CisJCUlWRUlWID0gKEtleUlkeCA8PDYpIHwgMHgyMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KKwkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpOworCX0KKworCS8vIEZvciBrZXkgaW5kZXggYW5kIGV4dCBJViBiaXQsIHNvIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIHBvc2l0aW9uKG9mZnNldCszKS4KKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGVfT25lQnl0ZShwQWQsIG9mZnNldCszLCAmSVZFSVYpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBXQ0lEICMlZCwgS2V5SW5kZXggIyVkLCBBbGc9JXNcbiIsV2NpZCwgS2V5SWR4LCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglXQ0lEQXR0cmkgPSAweCV4IFxuIiwgIFdDSURBdHRyaSkpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUGFyc2UgZW5jcnlwdGlvbiB0eXBlCitBcmd1bWVudHM6CisgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQoreworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisgICAgICAgIHJldHVybiAiTk9ORSI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorICAgIAlyZXR1cm4gIldFUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUCI7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCXJldHVybiAiQUVTIjsKKwlpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKKyAgICAJcmV0dXJuICJUS0lQQUVTIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworQ0hBUiAqR2V0QXV0aE1vZGUoQ0hBUiBhdXRoKQoreworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyAgICAJcmV0dXJuICJPUEVOIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKyAgICAJcmV0dXJuICJTSEFSRUQiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkKKyAgICAJcmV0dXJuICJBVVRPV0VQIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAJcmV0dXJuICJXUEEiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgIAlyZXR1cm4gIldQQVBTSyI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIAlyZXR1cm4gIldQQU5PTkUiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAJcmV0dXJuICJXUEEyIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgCXJldHVybiAiV1BBMlBTSyI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikKKyAgICAJcmV0dXJuICJXUEExV1BBMiI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykKKyAgICAJcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7CisKKyAgICAJcmV0dXJuICJVTktOT1ciOworfQorCisjaWYgMSAvLyNpZm5kZWYgVUNPUworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgc2l0ZSBzdXJ2ZXkgcmVzdWx0cworCUFyZ3VtZW50czoKKwkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAJCTEuKSBVSSBuZWVkcyB0byB3YWl0IDQgc2Vjb25kcyBhZnRlciBpc3N1ZSBhIHNpdGUgc3VydmV5IGNvbW1hbmQKKyAgICAgICAgCQkyLikgaXdwcml2IHJhMCBnZXRfc2l0ZV9zdXJ2ZXkKKyAgICAgICAgCQkzLikgVUkgbmVlZHMgdG8gcHJlcGFyZSBhdCBsZWFzdCA0MDk2Ynl0ZXMgdG8gZ2V0IHRoZSByZXN1bHRzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lCUxJTkVfTEVOCSg0KzMzKzIwKzgrMTArOSs3KzMpCS8vIENoYW5uZWwrU1NJRCtCc3NpZCtXZXBTdGF0dXMrQXV0aE1vZGUrU2lnbmFsK1dpcmVzc01vZGUrTmV0d29ya1R5cGUKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCSptc2c7CisJSU5UIAkJaT0wOworCUlOVAkJCVdhaXRDbnQ7CisJSU5UIAkJU3RhdHVzPTA7CisJQ0hBUgkJU3NpZFtNQVhfTEVOX09GX1NTSUQgKzFdOworICAgIElOVCAgICAgICAgIFJzc2kgPSAwLCBtYXhfbGVuID0gTElORV9MRU47CisJVUlOVCAgICAgICAgUnNzaV9RdWFsaXR5ID0gMDsKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgd2lyZWxlc3NfbW9kZTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJm1zZywgc2l6ZW9mKENIQVIpKigoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4pKTsKKworCWlmIChtc2cgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkgLSBtc2cgbWVtb3J5IGFsbG9jIGZhaWwuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQobXNnLCAwICwoTUFYX0xFTl9PRl9CU1NfVEFCTEUpKm1heF9sZW4gKTsKKwltZW1zZXQoU3NpZCwgMCAsKE1BWF9MRU5fT0ZfU1NJRCArMSkpOworCXNwcmludGYobXNnLCIlcyIsIlxuIik7CisJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNHMlLTMzcyUtMjBzJS04cyUtMTBzJS05cyUtN3MlLTNzXG4iLAorCSAgICAiQ2giLCAiU1NJRCIsICJCU1NJRCIsICJFbmMiLCAiQXV0aCIsICJTaWdhbmwoJSkiLCAiVy1Nb2RlIiwgIiBOVCIpOworCisKKwlXYWl0Q250ID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCXdoaWxlICgoU2NhblJ1bm5pbmcocEFkYXB0ZXIpID09IFRSVUUpICYmIChXYWl0Q250KysgPCAyMDApKQorCQlPU19XQUlUKDUwMCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlmb3IoaT0wOyBpPHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yIDtpKyspCisJeworCQlpZiggcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbD09MCkKKwkJCWJyZWFrOworCisJCWlmKChzdHJsZW4obXNnKSttYXhfbGVuICkgPj0gSVdfU0NBTl9NQVhfREFUQSkKKwkJCWJyZWFrOworCisJCS8vQ2hhbm5lbAorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwpOworCQkvL1NTSUQKKwkJbWVtY3B5KFNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQlTc2lkW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW5dID0gJ1wwJzsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMzNzIiwgU3NpZCk7CisJCS8vQlNTSUQKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAgIiwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzBdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMV0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFsyXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzNdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNF0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFs1XSk7CisJCS8vRW5jcnlwdGlvbiBUeXBlCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLThzIixHZXRFbmNyeXB0VHlwZShwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMpKTsKKwkJLy9BdXRoZW50aWNhdGlvbiBNb2RlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLCAiVU5LTk9XIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwcyIsR2V0QXV0aE1vZGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXV0aE1vZGUpKTsKKwkJLy8gUnNzaQorCQlSc3NpID0gKElOVClwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpOworCQlpZiAoUnNzaSA+PSAtNTApCisJCQlSc3NpX1F1YWxpdHkgPSAxMDA7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTgwKSAgICAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKDI0ICsgKChSc3NpICsgODApICogMjYpLzEwKTsKKwkJZWxzZSBpZiAoUnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgoKFJzc2kgKyA5MCkgKiAyNikvMTApOworCQllbHNlICAgIC8vIDwgLTg0IGRibQorCQkJUnNzaV9RdWFsaXR5ID0gMDsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOWQiLCBSc3NpX1F1YWxpdHkpOworCQkvLyBXaXJlbGVzcyBNb2RlCisJCXdpcmVsZXNzX21vZGUgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisJCWlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFGSCB8fAorCQkJd2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRFMpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTVfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYS9uIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNF9OKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2cvbiIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICJ1bmtub3ciKTsKKwkJLy9OZXR3b3JrIFR5cGUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEFkIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBJbiIpOworCisgICAgICAgIHNwcmludGYobXNnK3N0cmxlbihtc2cpLCJcbiIpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gd3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpbXNnKTsKK30KKworCisjZGVmaW5lCU1BQ19MSU5FX0xFTgkoMTQrNCs0KzEwKzEwKzEwKzYrNikJLy8gQWRkcithaWQrcHNtK2RhdGF0aW1lK3J4Ynl0ZSt0eGJ5dGUrY3VycmVudCB0eCByYXRlK2xhc3QgdHggcmF0ZQorVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlJTlQgaTsKKwlSVF84MDJfMTFfTUFDX1RBQkxFIE1hY1RhYjsKKwljaGFyICptc2c7CisKKwlNYWNUYWIuTnVtID0gMDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSAmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWRkciwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWlkID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlBzbSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUHNNb2RlOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLk1pbW9QcyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTW1wc01vZGU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbGwgaW4gUlNTSSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMjsKKworCQkJLy8gdGhlIGNvbm5lY3RlZCB0aW1lIHBlciBlbnRyeQorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkNvbm5lY3RlZFRpbWUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlN0YUNvbm5lY3RUaW1lOworI2lmIDAgLy8gVG9EbworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uSFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50OworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudDsKKyNlbmRpZgorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NQ1MgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLkJXID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuQlc7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNob3J0R0kgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TVEJDID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQucnN2ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQucnN2OworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NT0RFID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLndvcmQ7CisKKwkJCU1hY1RhYi5OdW0gKz0gMTsKKwkJfQorCX0KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX01BQ19UQUJMRSk7CisJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWFjVGFiLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGNvcHlfdG9fdXNlcigpIGZhaWxcbiIsIF9fRlVOQ1RJT05fXykpOworCX0KKworCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7CisJbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7CisJc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKKwlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAorCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQorCQkJCWJyZWFrOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbworCQl9CisJfQorCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQorCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7CisJfQorCisJa2ZyZWUobXNnKTsKK30KKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworLyoKKwlUaGUgQkFTZXR1cCBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKwkvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKworCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IDE1KQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMnhcbiIsIG1hY1swXSwgbWFjWzFdLAorCQkJCW1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKyAgICAJaWYgKHBFbnRyeSkgeworICAgICAgICAJcHJpbnRrKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworCSAgICAgICAgQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIHRpZCwgMCwgMTAwLCBUUlVFKTsKKyAgICAJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBiQkFEZWNsaW5lOworCisJYkJBRGVjbGluZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoYkJBRGVjbGluZSA9PSAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChiQkFEZWNsaW5lID09IDEpCisJeworCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkFEZWNsaW5lX1Byb2M6OihCQURlY2xpbmU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQU9yaVRlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCSAgICBwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCSAgICBpZiAocEVudHJ5KSB7CisJICAgICAgICBwcmludGsoIlxuVGVhciBkb3duIE9yaSBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKyAgICAgICAgQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSwgVFJVRSk7CisJICAgIH0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkJICAgIEJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEJ3OworCisJSHRCdyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKEh0QncgPT0gQldfNDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwllbHNlIGlmIChIdEJ3ID09IEJXXzIwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCd19Qcm9jOjooSHRCdz0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRNY3MsIE1jc190bXA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKKwkJSHRNY3MgPSBNY3NfdG1wOworCWVsc2UKKwkJSHRNY3MgPSBNQ1NfQVVUTzsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IEh0TWNzOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChIdE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFOkZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEh0TWNzPSVkLCBiQXV0b1R4UmF0ZVN3aXRjaCA9ICVkKVxuIiwKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTLCBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkpOworCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpIHx8CisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8IE1PREVfSFRNSVgpKQorCQl7CisJICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgorCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDMpICYmCisJICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX0NDSykpCisJCQl7CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzXSAqIDEwMDAwMDApKTsKKwkJCX0KKwkgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gNykgJiYKKwkgICAgICAgICAgICAJKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX09GRE0pKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jcys0XSAqIDEwMDAwMDApKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQliQXV0b1JhdGUgPSBUUlVFOworCisJCQlpZiAoYkF1dG9SYXRlKQorCQkJeworCSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKwkJCX0KKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUpKTsKKwkJfQorICAgICAgICBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0R2k7CisKKwlIdEdpID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICggSHRHaSA9PSBHSV80MDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCWVsc2UgaWYgKCBIdEdpID09IEdJXzgwMCApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRHaV9Qcm9jOjooU2hvcnRHST0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBTaXplOworCisJU2l6ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoU2l6ZSA8PTAgfHwgU2l6ZSA+PTY0KQorCXsKKwkJU2l6ZSA9IDg7CisJfQorCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gU2l6ZS0xOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9IdFR4QkFTaXplIDo6KFR4QkFTaXplPSAlZClcbiIsIFNpemUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCWVsc2UgaWYgKCBWYWx1ZSA9PSBIVE1PREVfTU0gKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0T3BNb2RlX1Byb2M6OihIdE9wTW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFN0YmNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlIGlmICggVmFsdWUgPT0gU1RCQ19OT05FICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TdGJjX1Byb2M6OihIdFN0YmM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICAJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEh0Y19Qcm9jOjooSHRIdGM9JWQpXG4iLHBBZC0+SFRDRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRFeHRjaGFfUHJvYzo6KEh0RXh0Y2hhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TXBkdURlbnNpdHlfUHJvYzo6KEh0TXBkdURlbnNpdHk9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJfQorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJhV2luU2l6ZV9Qcm9jOjooSHRCYVdpblNpemU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UmRnX1Byb2M6OihIdFJkZz0lZClcbiIscEFkLT5Db21tb25DZmcuYlJkZykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdExpbmtBZGFwdF9Qcm9jOjooSHRMaW5rQWRhcHQ9JWQpXG4iLHBBZC0+YkxpbmtBZGFwdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IDEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBbXNkdV9Qcm9jOjooSHRBbXNkdT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBdXRvQmFfUHJvYzo6KEh0QXV0b0JhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCitJTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCBtb2RlOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSBtb2RlIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCBtb2RlIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKyAgIAl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQltb2RlID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKG1vZGUgPiBNTVBTX0VOQUJMRSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpOworCQkgICAgU2VuZFBTTVBBY3Rpb24ocEFkLCBwRW50cnktPkFpZCwgbW9kZSk7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKKworfQorCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTMgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSAzOworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1JTU9QU21vZGVfUHJvYzo6KE1JTU9QUyBtb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKworSU5UCVNldF9Gb3JjZUdGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZUdGX1Byb2M6OihGb3JjZUdGPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNaW1vUHNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNaW1vUHNfUHJvYzo6KEh0TWltb1BzPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJT0lEX1NFVF9IVF9QSFlNT0RFCQlTZXRIVDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkKKwkJcmV0dXJuIEZBTFNFOworCisJU2V0SFQuUGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJU2V0SFQuVHJhbnNtaXRObyA9ICgoVUNIQVIpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7CisJU2V0SFQuSHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisJU2V0SFQuRXh0T2Zmc2V0ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CisJU2V0SFQuTUNTID0gTUNTX0FVVE87CisJU2V0SFQuQlcgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworCVNldEhULlNUQkMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisJU2V0SFQuU0hPUlRHSSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKworCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQorCXsKKwkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCisJeworICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIFJUMjg3MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCit7CisJc3dpdGNoKGF1dGhNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgorCQkJcmV0dXJuICJPUEVOIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCQlyZXR1cm4gIldQQVBTSyI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgorCQkJcmV0dXJuICJTSEFSRUQiOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJCXJldHVybiAiV1BBIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorCQkJcmV0dXJuICJXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQkJcmV0dXJuICJXUEEyUFNLIjsKKyAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlyZXR1cm4gIldQQTFXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorCQkJcmV0dXJuICJXUEFOT05FIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiVU5LTk9XIjsKKwl9Cit9CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKK3sKKwlzd2l0Y2goZW5jcnlNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlyZXR1cm4gIk5PTkUiOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJcmV0dXJuICJXRVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlyZXR1cm4gIkFFUyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCXJldHVybiAiVEtJUEFFUyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIlVOS05PVyI7CisJfQorfQorCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKQoreworCUlOVAlTdGF0dXMgPSAwOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCisJeworCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCisJCXsKKwkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KKwkJfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7CisJCXNwcmludGYocEJ1ZiwgIlxuIik7CisJCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworSU5UCVNob3dfU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKKwkJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitJTlQJU2hvd19UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKKwkJCWJyZWFrOworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgorCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQorCXsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOworCQkJYnJlYWs7CisJCWNhc2UgMDogLy9BVVRPCisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNob3dfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOworCX0KKwllbHNlCisJeworICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCisJeworCQljYXNlIEdJXzQwMDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7CisJCQlicmVhazsKKwkJY2FzZSBHSV84MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpCisJeworCQljYXNlIEhUTU9ERV9HRjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0YiKTsKKwkJCWJyZWFrOworCQljYXNlIEhUTU9ERV9NTToKKwkJCXNwcmludGYocEJ1ZiwgIlx0TU0iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCisJeworCQljYXNlIEVYVENIQV9CRUxPVzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVENIQV9BQk9WRToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKKwl7CisJCWNhc2UgQlNTX0FESE9DOgorCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0lORlJBOgorCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0FOWToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7CisJCQlicmVhazsKKwkJY2FzZSBCU1NfTU9OSVRPUjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCisJCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1dlcEtleV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBJTlQJCQkJS2V5SWR4LAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKKwlJTlQJCWluZGV4ID0gQlNTMDsKKworCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKKwlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKKworCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKKyAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQorICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7CisgICAgfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQgCWlkeDsKKwlVQ0hBUglQTUtbMzJdID0gezB9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKKyAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc2FuaXR5LmMKQEAgLTAsMCArMSwxNjYzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMikKK3sKKyAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7CisKKyAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvKgorICAgIGlmICgocEluZm8tPkJhQnVmU2l6ZSA+IE1BWF9SWF9SRU9SREVSQlVGKSB8fCAocEluZm8tPkJhQnVmU2l6ZSA8IDIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBSeCBSZW9yZGVyaW5nIGJ1ZmZlciB0b28gYmlnIG9yIHRvbyBzbWFsbFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCSovCisKKyAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMikKK3sKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworCit9CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4gKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKKwlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisKKwkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKKworCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAorICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisgICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCisgICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiAqcEVycCwKKyAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKKyAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisgICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKyAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisgICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQorICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKyAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworICAgIENIQVIJCQkJKlB0cjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlDSEFSIAkJCQlUaW1MZW47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKyAgICBVQ0hBUgkJCQlTdWJUeXBlOworICAgIFVDSEFSCQkJCVNhbml0eTsKKyAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OworICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7CisgICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKKworCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAorCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgorCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCisJVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7CisKKyAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjaworICAgIFNhbml0eSA9IDA7CisKKyAgICAqcEF0aW1XaW4gPSAwOworICAgICpwRXJwID0gMDsKKyAgICAqcER0aW1Db3VudCA9IDA7CisgICAgKnBEdGltUGVyaW9kID0gMDsKKyAgICAqcEJjYXN0RmxhZyA9IDA7CisgICAgKnBNZXNzYWdlVG9NZSA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAorICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKKyAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKyAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBSYWxpbmtJZSA9IDA7CisgICAgKnBOZXdDaGFubmVsID0gMDsKKyAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKKyAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCisgICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCisgICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAorCisgICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKKyAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisKKyAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCisvLwloZXhfZHVtcCgiQmVhY29uIiwgTXNnLCBNc2dMZW4pOworCisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKworCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7CisJcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOworCisgICAgUHRyICs9IFRJTUVTVEFNUF9MRU47CisgICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47CisKKyAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgZWxzZQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCisgICAgICAgIC8vCisgICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisgICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKworCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCisJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOworCisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKKwkJCQkJCXsKKworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9USU06CisgICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbworICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgQnJvYWRjb20vQXRoZXJvcyA4MDIuMTFuIE9VSSB2ZXJzaW9uLCBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKyAgICAgICAgICAgICAgICAvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDMwKSkKKyAgICAgICAgICAgIAkJeworCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfQlJPQURDT01fSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgCQl7CisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICB9CisJCQkJKi8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgCQkJZWxzZQorICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgorICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisKKyAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAorICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPSAyOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPSBDV19NSU5fSU5fQklUUy0xOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gID0gOTY7ICAgLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9FUlA6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBFcnAgPSAoVUNIQVIpcEVpZC0+T2N0ZXRbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKKyAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDM1MCB1c2VkIGxlbmd0aCBhcyAyOAorICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMAorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcworICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQVBfVFhfUE9XRVI6CisgICAgICAgICAgICAgICAgLy8gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKyAgICAgICAgICAgICAgICAvLzAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIDYKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MDYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gR2V0IGNlbGwgcG93ZXIgbGltaXQgaW4gZEJtCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9ICoocEVpZC0+T2N0ZXQgKyA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gV1BBMiAmIDgwMi4xMWkgUlNOCisgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcKKyAgICAgICAgICAgICAgICBpZiAoUlRNUEVxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCVB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCisJCXsKKwkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQorCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOworCQkJZWxzZQorCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOworCQkJU2FuaXR5IHw9IDB4NDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChTYW5pdHkgIT0gMHg3KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisKK30KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCisJUmV0dXJuOgorCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAJKlJlZ0NsYXNzKQoreworCUNIQVIJCQkJKlB0cjsKKwlQRlJBTUVfODAyXzExCQlwRnJhbWU7CisJUEVJRF9TVFJVQ1QJCQlwRWlkOworCVVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKwkqUmVnQ2xhc3MgPSAwOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKwkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisJLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKKworCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKwkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorCXsKKwkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKKwkJCQlpZihwRWlkLT5MZW4gPiAwKQorCQkJCXsKKwkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KKworCXJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKworCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKwkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CisKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKKwkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQorCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVUNIQVIgQ2hhbm5lbFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBjaGFubmVsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkgKyspCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBBbGcsCisgICAgT1VUIFVTSE9SVCAqcFNlcSwKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIENIQVIgKnBDaGxnVGV4dCkKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCisgICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgfHwgKCpwQWxnID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBBbGcpCit7CisgICAgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOworICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKKyAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisKKyAgICBpZiAoKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8KCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgIAkpICYmCisgICAgICAgICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUF1dGhSZXFTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCit7CisgICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKKyAgICBDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsgICAgICAgICAgICAgICAgICAgLy8gQVAgYWRkcmVzcworICAgICpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSBpbmZvCisgICAgKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2FuaXR5IGNoZWNrIE5ldHdvcmtUeXBlICgxMWIsIDExZyBvciAxMWEpCisKKwlBcmd1bWVudHM6CisJCXBCc3MgLSBQb2ludGVyIHRvIEJTUyB0YWJsZS4KKworCVJldHVybiBWYWx1ZToKKyAgICAgICAgTmRpczgwMl8xMURTIC4uLi4uLi4oMTFiKQorICAgICAgICBOZGlzODAyXzExT0ZETTI0Li4uLigxMWcpCisgICAgICAgIE5kaXM4MDJfMTFPRkRNNS4uLi4uKDExYSkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisgICAgSU4gUEJTU19FTlRSWSBwQnNzKQoreworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKKwlVQ0hBUgkJCQkJCXJhdGUsIGk7CisKKwlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKKworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQorCXsKKwkJLy8KKwkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgorCQkvLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQorCQl7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCS8vCisJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgorCQkvLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKKwkJCXsKKwkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0CisJCQkJCS8vCisJCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OworCX0KKworICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKyAgICB9CisKKwlyZXR1cm4gTmV0V29ya1R5cGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV1BBIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpCit7CisJVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7CisJQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7CisJS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKKwlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOworCisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKwlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKKwlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8vIDAuIENoZWNrIE1zZ1R5cGUKKwlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKKyAJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkJLy8gRm9yIHN1cHBsaWNhbnQKKyAgICB7CisgICAgCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgorCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKyAJfQorCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKKwl7CisJCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKKyAgICAJaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCisgICAgCXsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKyAgICAJfQorCX0KKworCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KKwlpZiAoYlJlcGxheURpZmYpCisJeworCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJfQorCisJCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgICAgIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQkvLyBUS0lQCisgICAgICAgIHsKKyAgICAgICAgICAgIGhtYWNfbWQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCS8vIEFFUworICAgICAgICB7CisgICAgICAgICAgICBITUFDX1NIQTEoKFBVQ0hBUilwTXNnLCBNc2dMZW4sIHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKyAgICAgICAgeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQkJfQorCisJCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCX0KKworCS8vIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0CisJLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIHVuLWVuY3J5cHRlZC4KKwkvLyBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLgorCWlmIChwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwKQorCXsKKwkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXsKKwkJCWlmKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlOVCAJaTsKKwkJCQlVQ0hBUiAgIEtleVszMl07CisJCQkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQkJfQorCisJCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OworCisJCX0KKwkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLy8gUGFyc2UgS2V5IERhdGEgZmllbGQgdG8KKwkJLy8gMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKQorCQkvLyAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMgorCQkvLyAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKQorCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSwgR3JvdXBLZXlJbmRleCwgTXNnVHlwZSwgYldQQTIsIHBFbnRyeSkpCisJCXsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9ETFNfUkVRX1NUUlVDVCAqKU1zZzsKKworCSpwRExTID0gcEluZm8tPnBETFM7CisJKnBSZWFzb24gPSBwSW5mby0+UmVhc29uOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKwlPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisJQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcENhcGFiaWxpdHlJbmZvCT0gMDsKKyAgICAqcERsc1RpbWVvdXQJPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKwkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCVBFSURfU1RSVUNUICBlaWRfcHRyOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwU3RhdHVzCQk9IDA7CisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisJLy8gZ2V0IHN0YXR1cyBjb2RlIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisJaWYgKHBTdGF0dXMgPT0gMCkKKwl7CisJICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwkgICAgUHRyICs9IDI7CisJfQorCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIHN0YXR1cyBjb2RlICsgREEgKyBTQSArIGNhcGFiaWxpdHkKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKKworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OworCQkJCQlSYXRlc1swXSA9IDB4ODI7CisJCQkJCVJhdGVzWzFdID0gMHg4NDsKKwkJCQkJUmF0ZXNbMl0gPSAweDhiOworCQkJCQlSYXRlc1szXSA9IDB4OTY7CisJCQkJCVJhdGVzWzRdID0gMHgxMjsKKwkJCQkJUmF0ZXNbNV0gPSAweDI0OworCQkJCQlSYXRlc1s2XSA9IDB4NDg7CisJCQkJCVJhdGVzWzddID0gMHg2YzsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0hUX0NBUDoKKwkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIENIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBSZWFzb24JPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTdjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NJWkUJMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU0laRQk0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJCQkvLyAxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NJWkUJMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCQkJLy8gMyw0LDUsNiw3LDgsOQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NJWkUJNworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJCQkvLyA1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKKworLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KK1VDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OworVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworCisvL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgorVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKKwkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCisJCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOworCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisKKwkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCisJCXsKKwkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bSAhPSAwKQorCQl7CisJCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKwkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJeworCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKKwkJCQl7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwkJCQkJfQorCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCX0KKwkJCWluZGV4ICs9IG51bTsKKwkJfQorCX0KKworCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworI2lmZGVmIERCRworCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5CisJCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAorCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKKwkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KKwlSZXR1cm46CisJCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCisJTm90ZToKKwkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQoreworCWludCBpOworCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0X2NoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCisJCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwlSZXR1cm46CisJCU5vbmUKKwlOb3RlOgorCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQorCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCisJCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQorCisJICAgV2Ugc3VwcG9ydGVkCisJCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCisJCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQorCisJCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgorCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3sKKwkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KKwkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKKwkJcmV0dXJuOworCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKK30KKworQ0hBUglDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVTSE9SVCAgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkmJiAoSU5GUkFfT04ocEFkKQorCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLworCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJCS8vCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJCXsKKwkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCisJCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJTWxtZUNudGxDb25maXJtKHBBZCwgTVQyX1NDQU5fQ09ORiwgTUxNRV9GQUlMX05PX1JFU09VUkNFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJeworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisJCQkJeworCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQkJfQorCQkJfQorCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwkJCXsKKwkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQorCQl7CisJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQorCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKKwkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIFNjYW5UaW1lSW41Z0NoYW5uZWwpOworCQkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfQorCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUFYX0NIQU5ORUxfVElNRSk7CisJCX0KKworCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KKwkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJCSkKKwkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJCQllbHNlCisJCQkJU3NpZExlbiA9IDA7CisKKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCisJCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HCVRtcDsKKwkJCQlVQ0hBUglIdExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQorCQkJCXsKKwkJCQkJVUxPTkcJCVRtcDsKKwkJCQkJSHRMZW4gPSAxOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAorCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAorCQkJCQkJCQkJICAxLCAgICAgICAgICAJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKKwkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCisJCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0KK30KKworVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQorCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMyNGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dwYS5jCkBAIC0wLDAgKzEsMTY1NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIFdQQSBPVUkKK1VDSEFSCQlPVUlfV1BBX05PTkVfQUtNWzRdCQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAwfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVkVSU0lPTls0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9XRVA0MFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9US0lQWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfQ0NNUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBX1dFUDEwNFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDV9OworVUNIQVIgICAgICAgT1VJX1dQQV84MDIxWF9BS01bNF0JPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBX1BTS19BS01bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKKy8vIFdQQTIgT1VJCitVQ0hBUiAgICAgICBPVUlfV1BBMl9XRVA0MFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfVEtJUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9DQ01QWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA0fTsKK1VDSEFSICAgICAgIE9VSV9XUEEyXzgwMjFYX0FLTVs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1dFUDEwNFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OworLy8gTVNBIE9VSQorVUNIQVIgICAJT1VJX01TQV84MDIxWF9BS01bNF0gICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CitVQ0hBUiAgIAlPVUlfTVNBX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNn07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCisJCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQorCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCisKKwkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KKworCUFyZ3VtZW50czoKKwkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCisJUmV0dXJuIFZhbHVlOgorCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCisJTm90ZToKKwkJODAyLjExaS0yMDA0CUFubmV4IEguMworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlQUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKnByZWZpeCwKKwlJTglJTlQJCXByZWZpeF9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisgICAgVUNIQVIgICAqaW5wdXQ7CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAorCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKworICAgIGlmIChpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKworCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisKKwkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKKwkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCisJCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KKyAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgorCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCVBNSwkJLQlwb2ludGVyIHRvIFBNSworCQlBTm9uY2UJLQlwb2ludGVyIHRvIEFOb25jZQorCQlBQQkJLQlwb2ludGVyIHRvIEF1dGhlbnRpY2F0b3IgQWRkcmVzcworCQlTTm9uY2UJLQlwb2ludGVyIHRvIFNOb25jZQorCQlTQQkJLQlwb2ludGVyIHRvIFN1cHBsaWNhbnQgQWRkcmVzcworCQlsZW4JCS0JaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiBQVEsgKG9jdGV0KQorCisJUmV0dXJuIFZhbHVlOgorCQlPdXRwdXQJCXBvaW50ZXIgdG8gdGhlIFBUSworCisJTm90ZToKKwkJUmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgOC41LjEuMgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFDb3VudFBUSygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkqUE1LLAorCUlOCVVDSEFSCSpBTm9uY2UsCisJSU4JVUNIQVIJKkFBLAorCUlOCVVDSEFSCSpTTm9uY2UsCisJSU4JVUNIQVIJKlNBLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCVVJTlQJbGVuKQoreworCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOworCVVJTlQJQ3VyclBvcyA9IDA7CisJVUNIQVIJdGVtcFszMl07CisJVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAorCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisKKwkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CisJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKKworCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKKwkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCS8vIEdldCBsYXJnZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKKwlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCTgwMi4xaWktMjAwNCAgQW5uZXggSC41CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUdlblJhbmRvbSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit7CisJSU5UCQlpLCBjdXJyOworCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07CisJVUNIQVIJcmVzdWx0WzgwXTsKKwlVTE9ORwlDdXJyZW50VGltZTsKKwlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKworCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOworCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKKworCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQorCXsKKwkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7CisJCWN1cnIgPQlNQUNfQUREUl9MRU47CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0JMzI7CisKKwkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOworCQljdXJyICs9CTI7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCisJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJV2VwU3RhdHVzLAorCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAorCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlVQ0hBUglQYWlyd2lzZUNudDsKKworCSpyc25fbGVuID0gMDsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisgICAgICAgIHN3aXRjaCAoV2VwU3RhdHVzKQorICAgICAgICB7CisgICAgICAgIAkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQllbHNlCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJfQorCisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKKwkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKKyAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKwkJc3dpdGNoIChXZXBTdGF0dXMpCisJCXsKKwkJCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQNDAsIDQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDEwNCwgNCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgQUtNIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCisJcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05JRV9BVVRIKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKKworCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCisJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKKwkJcmV0dXJuOworCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOworCisKKwlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QTWFrZVJTTklFKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQorCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQorCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKKwlVQ0hBUgkJUHJpbWFyeVJzbmllOworCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAorCVVDSEFSCQlwX29mZnNldDsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IE1JWF9DSVBIRVJfTk9UVVNFOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisKKwlyc25pZWxlbl9jdXJfcCA9IE5VTEw7CisJcnNuaWVsZW5fZXhfY3VyX3AgPSBOVUxMOworCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworCQkJCWlmIChBdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCisJCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCisJCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCisJCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisKKwkJCWJNaXhDaXBoZXIgPSBwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKKwllbHNlCisJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKKworCXsKKwkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKKwkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQorCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAyLiBpbnNlcnQgQUtNCisJCVJUTVBJbnNlcnRSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKKwkJUlRNUEluc2VydFJzbkllQ2FwKHBBZCwgUHJpbWFyeVJzbmllLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCX0KKworCS8vIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoCisJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CisKKwloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKKworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQIGZyYW1lLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBFbnRyeQkJCS0JcG9pbnRlciB0byBhY3RpdmUgZW50cnkKKwkJcERhdGEJCQktCXRoZSByZWNlaXZlZCBmcmFtZQorCQlEYXRhQnl0ZUNvdW50IAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAorCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworICAgIFJldHVybjoKKyAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwRGF0YSwKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIERhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVTE9ORwlCb2R5X2xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCisgICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKwkvLyBTa2lwIExMQyBoZWFkZXIKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKKyAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gNjsKKyAgICB9CisJLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCisgICAgeworICAgICAgICBwRGF0YSArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKKyAgICB7CisgICAgICAgIGNhc2UgRUFQUGFja2V0OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEtleToKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorICAgIElOIFVDSEFSICAgICprZXksCisgICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKKyAgICBJTiBVQ0hBUiAgICBwX2xlbiwKKyAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKK3sKKyAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKyAgICBVQ0hBUiAgICAgICBSWzUxMl07CisgICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKKyAgICBJTlQgICAgICAgICBpLCBqOworICAgIGFlc19jb250ZXh0IGFlc2N0eDsKKyAgICBVQ0hBUiAgICAgICB4b3I7CisKKyAgICBydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworICAgIC8vIEluaXQgSUEKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBBW2ldID0gMHhhNjsKKworICAgIC8vSW5wdXQgcGxhaW50ZXh0CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgUls4ICogKGkgKyAxKSArIGpdID0gcGxhaW50ZXh0WzggKiBpICsgal07CisgICAgfQorCisgICAgLy8gS2V5IE1peAorICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgeworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BoYXNlIDEKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworICAgICAgICAgICAgcnRtcF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisgICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7CisgICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKKyAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07CisgICAgfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4JVUNIQVIJKmtleSwKKwlPVVQJVUNIQVIJKnBsYWludGV4dCwKKwlJTglVQ0hBUiAgICBjX2xlbiwKKwlJTglVQ0hBUgkqY2lwaGVydGV4dCkKKworeworCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCVVDSEFSICAgICAgIHhvcjsKKwlJTlQgICAgICAgICBpLCBqOworCWFlc19jb250ZXh0IGFlc2N0eDsKKwlVQ0hBUiAgICAgICAqUjsKKwlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKworCWlmIChSID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworCS8vIEluaXRpYWxpemUKKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvL0lucHV0IHBsYWludGV4dAorCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQorCXsKKwkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCisJeworCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQorCQl7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOworCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8vIE9VVFBVVAorCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCisJeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKK3sKKyAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOworICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkvKiBUb0RvLUFsYmVydFkgZm9yIG1lc2gqLykKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTiA9IDA7CisJVUNIQVIJCQkJRGVmYXVsdElkeCA9IDA7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdAorCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghUlRNUENoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKKworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJaWYgKGJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQkvLyBza2lwIFJTTiBJRQorCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCisJaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAorICAgIAl7CisgICAgICAgIAlwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgCQl7CisgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKyAgICAJCX0KKworCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisJCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworCQkJfQorCisgICAgCX0KKwkJZWxzZQorICAgIAl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8vIHNraXAgaXQKKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9CisJZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJeworCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKKwlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCisgICAgeworICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFRvZG8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiBUUlVFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKK3sKKwlCT09MRUFOCWJXUEEyID0gRkFMU0U7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisgICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCisgICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCisJcE1zZy0+Qm9keV9MZW5bMV0gPSBMRU5fRUFQT0xfS0VZX01TRzsKKworCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgorCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzgKKwkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorICAgICAgICAJKCgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCS8vIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkKKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEKKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fCAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgIAlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKyAgICB9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKKyAgICB9CisKKwkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KKwkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEZpbGwgaW4gS2V5IExlbmd0aAorI2lmIDAKKwlpZiAoYldQQTIpCisJeworCQkvLyBJbiBXUEEyIG1vZGUsIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyLAorCQkvLyBzbyBvbmx5IHBhaXJ3aXNlX21zZ18xIGFuZCBwYWlyd2lzZV9tc2dfMyBuZWVkIHRvIGZpbGwuCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7CisJfQorCWVsc2UgaWYgKCFiV1BBMikKKyNlbmRpZgorCXsKKwkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCQl9CisJfQorCisgCS8vIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKKwkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMworCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKKwkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKKwlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCisgICAgCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5Tm9uY2UsIEtleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBTdWdnZXN0IElWIGJlIHJhbmRvbSBudW1iZXIgcGx1cyBzb21lIG51bWJlciwKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlJdiwgJktleU5vbmNlWzE2XSwgTEVOX0tFWV9ERVNDX0lWKTsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisKKyAgICAvLyBGaWxsIEtleSBSU0MgZmllbGQKKyAgICAvLyBJdCBjb250YWlucyB0aGUgUlNDIGZvciB0aGUgR1RLIGJlaW5nIGluc3RhbGxlZC4KKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisKKwkvLyBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIKKyAgICBOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEFkLAorCQkJCQkJICBBdXRoTW9kZSwKKwkJCQkJCSAgV2VwU3RhdHVzLAorCQkJCQkJICBHcm91cEtleVdlcFN0YXR1cywKKwkJCQkJCSAgTXNnVHlwZSwKKwkJCQkJCSAgRGVmYXVsdEtleUlkeCwKKwkJCQkJCSAgYldQQTIsCisJCQkJCQkgIFBUSywKKwkJCQkJCSAgR1RLLAorCQkJCQkJICBSU05JRSwKKwkJCQkJCSAgUlNOSUVfTGVuLAorCQkJCQkJICBwTXNnKTsKKworCS8vIENhbGN1bGF0ZSBNSUMgYW5kIGZpbGwgaW4gS2V5TWljIEZpZWxkIGV4Y2VwdCBQYWlyd2lzZSBNc2cgMS4KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJQ2FsY3VsYXRlTUlDKHBBZCwgV2VwU3RhdHVzLCBQVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIHBNc2ctPkJvZHlfTGVuWzFdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsIHBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdKSk7CisKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKwlVQ0hBUgkJKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJVUNIQVIgICAgICAgZWtleVsoTEVOX0tFWV9ERVNDX0lWK0xFTl9FQVBfRUspXTsKKwlVQ0hBUgkJZGF0YV9vZmZzZXQ7CisKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybjsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7CisKKyAgICBpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmM0R1RLIExlbiA9IDUxMiAqLworCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLyogS2V5X0RhdGEgTGVuID0gNTEyICovCisJS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKKworCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOworCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IDA7CisJZGF0YV9vZmZzZXQgPSAwOworCisJLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKKwlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCisJeworCQlpZiAoYldQQTJDYXBhYmxlKQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTI7CisJCWVsc2UKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEE7CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IFJTTklFX0xFTjsKKwkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0sIFJTTklFLCBSU05JRV9MRU4pOworCQlkYXRhX29mZnNldCArPSAoMiArIFJTTklFX0xFTik7CisJfQorCisJLy8gRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIKKwlpZiAoYldQQTJDYXBhYmxlICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorCXsKKwkJLy8gS2V5IERhdGEgRW5jYXBzdWxhdGlvbiAoS0RFKSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3cgYW5kIFRhYmxlLTIwaAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MTY7Ly8gNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKwkJZWxzZQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsvLyA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8vIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLy8gUmVzZXJ2ZWQgQnl0ZQorCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisKKwkvLyBFbmNhcHN1bGF0ZSBHVEsgYW5kIGVuY3J5cHQgdGhlIGtleS1kYXRhIGZpZWxkIHdpdGggS0VLLgorCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gRmlsbCBpbiBHVEsKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQkvLyBTdGlsbCBkb250IGtub3cgd2h5LCBidXQgaWYgbm90IGFwcGVuZCB3aWxsIG9jY3VyICJHVEsgbm90IGluY2x1ZGUgaW4gTVNHMyIKKwkJLy8gUGF0Y2ggZm9yIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB6ZXJvIGNvbmZpZyBhbmQgZnVuaworCQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkJeworCQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSA2OworCQkJfQorCQl9CisKKwkJLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZAorCQlpZiAoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUFFU19HVEtfS0VZX1dSQVAoJlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKKyAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpCisJCQkvLyBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZAorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKwkJCS8vIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXQorCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZQVEtbMTZdLCBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJfQorCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvLyBzZXQga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBsZW5ndGgKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBkYXRhX29mZnNldDsKKyAgICBwTXNnLT5Cb2R5X0xlblsxXSArPSBkYXRhX29mZnNldDsKKworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKKwlVTE9ORwlGcmFtZUxlbiA9IDA7CisJVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCWRpZ2VzdFs4MF07CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOworCisgICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKKwkJcmV0dXJuOworICAgIH0KKworCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgorICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwgICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJvZHlfTGVuWzFdICsgNCwgIAlwTXNnLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLy8gQ2FsY3VsYXRlIE1JQworICAgIGlmIChQZWVyV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgCXsKKwkJSE1BQ19TSEExKE91dEJ1ZmZlciwgIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYyk7CisJfQorCisJLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCisJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlvc19mcmVlX21lbShwQWQsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KQoreworCVBSWFdJX1NUUlVDCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCisKKworCS8vIGhhbmRsZSBXRVAgZGVjcnlwdGlvbgorCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorICAgIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFdFUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgSVZbNF0gJiBJQ1ZbNF0KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLy8gaGFuZGxlIFRLSVAgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWLCA0IGJ5dGVzIElDVgorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAyMDsKKwkJfQorICAgICAgICBlbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0VEtJUCBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKwl9CisJLy8gaGFuZGxlIEFFUyBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy84IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NmMTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXBfZGZzLmMKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCit7CisJVUxPTkcgUkREdXJSZWdpb247CisJVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKKwlVTE9ORyBUb2xlcmFuY2U7Cit9IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOworCisKK3N0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQoreworCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCisJezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MworCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgorfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UOCBSYWRhclBlcmlvZDsKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7CisKKyNpZiAwCisJLy8gdG9nZ2xlIFJ4IGVuYWJsZSBiaXQgZm9yIHJhZGFyIGRldGVjdGlvbi4KKwkvLyBpdCdzIEFuZHkncyByZWNvbW1hbmQuCisJeworCQlVSU5UMzIgVmFsdWU7CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgfD0gKDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwlWYWx1ZSAmPSB+KDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYKKwlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KKwkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOworCisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpCit7CisJVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOworCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KKworCWlmIChDVFNQcm90ZWN0ICE9IDApCisJeworCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCisJCXsKKwkJY2FzZSBGQ0M6CisJCWNhc2UgSkFQX1c1NjoKKwkJCUN0c1Byb3RlY3QgPSAweDAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRToKKwkJY2FzZSBKQVBfVzUzOgorCQlkZWZhdWx0OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJCUN0c1Byb3RlY3QgPSAweDAxOworCisKKwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKwkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKKwkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgorCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KKworCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7CisJLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAorCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAorCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCkKK3sKKyNpZiAxCisJSU5UCQlpOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJSU5UCQlpOworCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChDaCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IDE1KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCWk7CisJY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQorCXsKKwkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOworCX0KKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgNCkKKwkJcmV0dXJuIEpBUF9XNTM7CisJZWxzZSBpZiAoaSA8IDE1KQorCQlyZXR1cm4gSkFQX1c1NjsKKwllbHNlCisJCXJldHVybiBKQVA7IC8vIFc1MgorCit9CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UOCBieXRlVmFsdWUgPSAwOworCVVMT05HIHJlc3VsdDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7CisKKwlyZXN1bHQgPSAwOworCXN3aXRjaCAoYnl0ZVZhbHVlKQorCXsKKwljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgorCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCisJCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOworCQlicmVhazsKKworCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgorCWRlZmF1bHQ6CisKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HIHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERlNfU1VQUE9SVAorCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKKwlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKworCXJldHVybiByZXN1bHQ7CisKK30KKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJaTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA+IDApCisJCXsKKwkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSAtLTsKKwkJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQlNSkgPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWRhckRldGVjdFBlcmlvZGljIC0gY2g9JWQsIFJlbWFpbmluZ1RpbWVGb3JVc2U9JWRcbiIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvL3JhZGFyIGRldGVjdAorCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwl7CisJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8vIFBlcmlvZGljIFJhZGFyIGRldGVjdGlvbiwgc3dpdGNoIGNoYW5uZWwgd2lsbCBvY2N1ciBpbiBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgpCisvLyBCZWZvcmUgc3dpdGNoIGNoYW5uZWwsIGRyaXZlciBuZWVkcyBkb2luZyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQuCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKKwkJCXJldHVybjsKKworCS8vIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIHRpbWUgaXMgNjBzZWMsIHVzZSA2NSBmb3IgYXNzdXJhbmNlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQrKyA+IHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBmb3VuZCByYWRhciBzaWduYWwsIHN0YXJ0IHNlbmQgYmVhY29uIGFuZCByYWRhciBkZXRlY3Rpb24gaW4gc2VydmljZSBtb25pdG9yXG5cbiIpKTsKKwkJCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCisKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpCit7CisJVUlOVDggVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPiAxMCA/IDEwIDogc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9lZXByb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YxNmVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVwcm9tLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJZWVwcm9tLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNpZiAwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorI2RlZmluZSBOVlJBTV9PRkZTRVQJCQkweDMwMDAwCisjZGVmaW5lIFJGX09GRlNFVAkJCQkweDQwMDAwCisKK3N0YXRpYyBVQ0hBUiBpbml0X2ZsYWcgPSAwOworc3RhdGljIFBVQ0hBUiBudl9lZV9zdGFydCA9IDA7CisKK3N0YXRpYyBVQ0hBUiBFZUJ1ZmZlcltFRVBST01fU0laRV07CisjZW5kaWYKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFJhaXNlQ2xvY2soCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFVJTlQzMiAqeCkKK3sKKyAgICAqeCA9ICp4IHwgRUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsJCQkJLy8gTWF4IGZyZXF1ZW5jeSA9IDFNSHogaW4gU3BlYy4gZGVmaW5pdGlvbgorfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBMb3dlckNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCAmIH5FRVNLOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKKyAgICBSVE1QdXNlY0RlbGF5KDEpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFNoaWZ0SW5CaXRzKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgkJeCxpOworCVVTSE9SVCAgICAgIGRhdGE9MDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KCBFRURPIHwgRUVESSk7CisKKyAgICBmb3IoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBkYXRhID0gZGF0YSA8PCAxOworICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOworCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgICAgIHggJj0gfihFRURJKTsKKyAgICAgICAgaWYoeCAmIEVFRE8pCisgICAgICAgICAgICBkYXRhIHw9IDE7CisKKyAgICAgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgU2hpZnRPdXRCaXRzKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVU0hPUlQgZGF0YSwKKyAgICBJTiAgVVNIT1JUIGNvdW50KQoreworICAgIFVJTlQzMiAgICAgICB4LG1hc2s7CisKKyAgICBtYXNrID0gMHgwMSA8PCAoY291bnQgLSAxKTsKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfihFRURPIHwgRUVESSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgeCAmPSB+RUVESTsKKyAgICAgICAgaWYoZGF0YSAmIG1hc2spCQl4IHw9IEVFREk7CisKKyAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKyAgICAgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBtYXNrID0gbWFzayA+PiAxOworICAgIH0gd2hpbGUobWFzayk7CisKKyAgICB4ICY9IH5FRURJOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBFRXByb21DbGVhbnVwKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMiB4OworCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVDUyB8IEVFREkpOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKyAgICBMb3dlckNsb2NrKHBBZCwgJngpOworfQorCitWT0lEIEVXRU4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgVUlOVDMyCXg7CisKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKKworICAgIEVFcHJvbUNsZWFudXAocEFkKTsKK30KKworVk9JRCBFV0RTKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitVU0hPUlQgUlRNUF9FRVBST01fUkVBRDE2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVU0hPUlQgT2Zmc2V0KQoreworICAgIFVJTlQzMgkJeDsKKyAgICBVU0hPUlQJCWRhdGE7CisKKyAgICBPZmZzZXQgLz0gMjsKKyAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOworICAgIHggfD0gRUVDUzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCS8vIGtpY2sgYSBwdWxzZQorCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHJlZ2lzdGVyIG51bWJlciBpbiB0aGF0IG9yZGVyCisgICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1JFQURfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisKKyAgICAvLyBOb3cgcmVhZCB0aGUgZGF0YSAoMTYgYml0cykgaW4gZnJvbSB0aGUgc2VsZWN0ZWQgRUVQUk9NIHdvcmQKKyAgICBkYXRhID0gU2hpZnRJbkJpdHMocEFkKTsKKworICAgIEVFcHJvbUNsZWFudXAocEFkKTsKKworICAgIHJldHVybiBkYXRhOworfQkvL1JlYWRFRXByb20KKworVk9JRCBSVE1QX0VFUFJPTV9XUklURTE2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVU0hPUlQgT2Zmc2V0LAorICAgIElOICBVU0hPUlQgRGF0YSkKK3sKKyAgICBVSU5UMzIgeDsKKworCU9mZnNldCAvPSAyOworCisJRVdFTihwQWQpOworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlICxyZWdpc3RlciBudW1iZXIgYW5kIGRhdGEgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9XUklURV9PUENPREUsIDMpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKKwlTaGlmdE91dEJpdHMocEFkLCBEYXRhLCAxNik7CQkvLyAxNi1iaXQgYWNjZXNzCisKKyAgICAvLyByZWFkIERPIHN0YXR1cworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisJRUVwcm9tQ2xlYW51cChwQWQpOworCisJUlRNUHVzZWNEZWxheSgxMDAwMCk7CS8vZGVsYXkgZm9yIHR3cChNQVgpPTEwbXMKKworCUVXRFMocEFkKTsKKworICAgIEVFcHJvbUNsZWFudXAocEFkKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNjY5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Zpcm13YXJlLmgKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgQ29weXJpZ2h0IChjKSAyMDA3LCBSYWxpbmsgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbi4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gYmluYXJ5IGZvcm0sIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgbWV0OgorCisgCSogUmVkaXN0cmlidXRpb25zIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGUKKyAJZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworIAlwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgCSogTmVpdGhlciB0aGUgbmFtZSBvZiBSYWxpbmsgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworIAlzdXBwbGllcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgCXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIAkqIE5vIHJldmVyc2UgZW5naW5lZXJpbmcsIGRlY29tcGlsYXRpb24sIG9yIGRpc2Fzc2VtYmx5IG9mIHRoaXMgc29mdHdhcmUKKyAJaXMgcGVybWl0dGVkLgorCisgTGltaXRlZCBwYXRlbnQgbGljZW5zZS4gUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gZ3JhbnRzIGEgd29ybGQtd2lkZSwKKyByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZSB1bmRlciBwYXRlbnRzIGl0IG5vdyBvciBoZXJlYWZ0ZXIKKyBvd25zIG9yIGNvbnRyb2xzIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBpbXBvcnQsIG9mZmVyIHRvIHNlbGwgYW5kCisgc2VsbCAoIlV0aWxpemUiKSB0aGlzIHNvZnR3YXJlLCBidXQgc29sZWx5IHRvIHRoZSBleHRlbnQgdGhhdCBhbnkKKyBzdWNoIHBhdGVudCBpcyBuZWNlc3NhcnkgdG8gVXRpbGl6ZSB0aGUgc29mdHdhcmUgYWxvbmUsIG9yIGluCisgY29tYmluYXRpb24gd2l0aCBhbiBvcGVyYXRpbmcgc3lzdGVtIGxpY2Vuc2VkIHVuZGVyIGFuIGFwcHJvdmVkIE9wZW4KKyBTb3VyY2UgbGljZW5zZSBhcyBsaXN0ZWQgYnkgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUgYXQKKyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCisgYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoaXMgc29mdHdhcmUuICBObyBoYXJkd2FyZSBwZXIKKyBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKKyBESVNDTEFJTUVSLiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLAorIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorIERBTUFHRS4KKyovCisvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKworCitVQ0hBUiBGaXJtd2FyZUltYWdlIFtdID0geworMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMiwgMHg3OSwgMHgwMiwKKzB4MTIsIDB4N2EsIDB4MDIsIDB4MTIsIDB4OTksIDB4MDIsIDB4MTIsIDB4OWUsIDB4MTIsIDB4MTIsIDB4OWEsIDB4MjIsIDB4MDIsIDB4MTYsIDB4MzYsIDB4MDIsCisweDE3LCAweDBjLCAweDAyLCAweDEzLCAweDg5LCAweDAyLCAweDEyLCAweDlmLCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE3LAorMHhhZSwgMHgyMiwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMywgMHgxYiwgMHhlNSwgMHg0YywgMHgzMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHg0MCwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZWYsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ZTQsCisweDkwLCAweDAxLCAweGE3LCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUwLCAweDFjLCAweDkwLCAweDAxLCAweDgwLCAweGUwLCAweGI0LAorMHgwMiwgMHgxNSwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMSwgMHgxMCwgMHg5MCwgMHgwMSwgMHg4NCwgMHhlMCwgMHhiNCwgMHg4MSwgMHgwOSwgMHg5MCwgMHgwMSwKKzB4OGMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4MTIsIDB4MGQsIDB4YzgsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsCisweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDU2LCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDEyLCAweDBhLCAweDlkLCAweDEwLAorMHhiNywgMHgzMSwgMHgxMCwgMHhlMiwgMHg1MCwgMHgxMSwgMHgwOCwgMHg1MSwgMHgxMSwgMHgxMywgMHg1MiwgMHgxMSwgMHgxMywgMHg1MywgMHgxMSwgMHgxMywKKzB4NTQsIDB4MTEsIDB4NTQsIDB4NTUsIDB4MTEsIDB4NzksIDB4NzAsIDB4MTEsIDB4YTQsIDB4NzEsIDB4MTEsIDB4ZDIsIDB4NzIsIDB4MTIsIDB4MjUsIDB4NzMsCisweDEyLCAweDQ2LCAweDgwLCAweDAwLCAweDAwLCAweDEyLCAweDZlLCAweDIwLCAweDAyLCAweDAzLCAweDMwLCAweDAzLCAweDFkLCAweDdkLCAweDAyLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4NmUsIDB4MDIsIDB4MTIsIDB4NjcsIDB4ODUsIDB4NTYsIDB4NDEsIDB4ZDIsIDB4MDIsIDB4MDIsCisweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweDY0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDkwLAorMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhlMCwgMHg2NCwgMHgyMCwgMHg2MCwgMHgwMywgMHgwMiwgMHgxMiwgMHg2ZSwgMHg3NSwKKzB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4MDIsIDB4MTIsIDB4NmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NDcsCisweDAyLCAweDEyLCAweDZlLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLCAweDEwLAorMHhlMCwgMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwgMHg3NCwKKzB4NDgsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsCisweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLAorMHg2ZSwgMHgwMiwgMHgxMiwgMHg2NywgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgwYiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgwNSwKKzB4ZTUsIDB4NDcsIDB4YjQsIDB4MDksIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4M2EsIDB4ZTQsIDB4ZmQsIDB4YWYsCisweDU2LCAweDEyLCAweDBiLCAweDkxLCAweGQyLCAweDA0LCAweDAyLCAweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmOCwgMHhlNiwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwKKzB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsCisweDZlLCAweDAyLCAweDEyLCAweDY3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZkLCAweGVkLCAweGY1LAorMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwKKzB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4NmUsIDB4MDIsCisweDEyLCAweDY3LCAweDkwLCAweDEwLCAweDAyLCAweGUwLCAweGI0LCAweDcwLCAweDFlLCAweGEzLCAweGUwLCAweGI0LCAweDMwLCAweDE5LCAweDkwLCAweDA1LAorMHgwOCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhmZCwgMHg5MCwgMHgwNSwgMHgwNSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg0NCwgMHgwNCwgMHhmMCwKKzB4ZWQsIDB4NTQsIDB4ZmUsIDB4OTAsIDB4MDUsIDB4MDgsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4M2EsIDB4ZmYsIDB4YWQsCisweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLAorMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHg5MCwgMHg3MCwgMHg0MCwKKzB4ZTUsIDB4M2EsIDB4ZjAsIDB4ODAsIDB4NDksIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4OTMsIDB4ZTQsIDB4ZmQsIDB4YWYsCisweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LAorMHg1NiwgMHhmNCwgMHg2MCwgMHgyYSwgMHg4MCwgMHgyMSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0YSwgMHhkMiwgMHgwNSwKKzB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsCisweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLAorMHg0MiwgMHhlNSwgMHgzYSwgMHhmMCwgMHhhMywgMHg3NCwgMHhhYiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg3MCwgMHgxYSwgMHgzMCwgMHg2MCwKKzB4MDksIDB4YjIsIDB4NGQsIDB4MzAsIDB4NGQsIDB4MDQsIDB4MDUsIDB4NDYsIDB4YzIsIDB4MDQsIDB4ZTUsIDB4NGYsIDB4NDUsIDB4NGUsIDB4NjAsIDB4MDgsCisweGU1LCAweDRmLCAweDE1LCAweDRmLCAweDcwLCAweDAyLCAweDE1LCAweDRlLCAweDIyLCAweDIyLCAweGMyLCAweDQyLCAweGQzLCAweDIyLCAweDIyLCAweGMyLAorMHg0YiwgMHhjMiwgMHg0YywgMHhlNSwgMHg0NCwgMHgxMiwgMHgwYSwgMHg5ZCwgMHgxMiwgMHhjMSwgMHgwMCwgMHgxMywgMHg1NCwgMHgwNCwgMHgxMywgMHg1MCwKKzB4MDgsIDB4MTMsIDB4MmIsIDB4MTAsIDB4MTIsIDB4ZDUsIDB4MjAsIDB4MTIsIDB4ZjUsIDB4NjAsIDB4MTMsIDB4MDYsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MTMsCisweDU2LCAweDg1LCAweDQ4LCAweDQzLCAweDg1LCAweDRhLCAweDQyLCAweDg1LCAweDRjLCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDYwLCAweDAzLAorMHgwMiwgMHgxMywgMHg1NiwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YSwgMHhjNCwgMHg1NCwKKzB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NjYsCisweDUzLCAweDQzLCAweDBmLCAweDgwLCAweDYxLCAweDg1LCAweDQ5LCAweDQzLCAweDg1LCAweDRiLCAweDQyLCAweDg1LCAweDRkLCAweDVlLCAweGU1LCAweDQ3LAorMHg2NCwgMHgwNiwgMHg3MCwgMHg1MiwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OSwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YiwgMHhjNCwKKzB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGQsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsCisweDM1LCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDEwLCAweGY1LCAweDQzLCAweDgwLCAweDJiLCAweGU1LCAweDQ3LCAweGI0LCAweDA0LCAweDA2LAorMHg1MywgMHg1ZSwgMHhmYiwgMHg3NSwgMHg0MiwgMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNSwgMHgwNiwgMHg0MywgMHg1ZSwgMHgwNCwgMHg3NSwgMHg0MiwKKzB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDYsIDB4MTAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MzAsIDB4ZjUsIDB4NDMsIDB4ODAsIDB4MDYsCisweGQyLCAweDRiLCAweDgwLCAweDAyLCAweGQyLCAweDRjLCAweGU0LCAweGY1LCAweDI1LCAweGU1LCAweDQyLCAweGM0LCAweDU0LCAweGYwLCAweGZmLCAweGU1LAorMHg0MywgMHg1NCwgMHgwZiwgMHg0ZiwgMHhmNSwgMHg1ZiwgMHg5MCwgMHg3MCwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwgMHg1ZSwgMHhmMCwgMHhhMywgMHhlNSwKKzB4NGEsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDgsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NGMsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDQyLCAweGYwLCAweGEzLCAweGU1LCAweDQzLCAweGYwLCAweGQyLCAweDYwLCAweDIyLCAweGU1LCAweDQ3LCAweDYwLCAweDEwLCAweDI0LCAweGMwLCAweDcwLAorMHgwMywgMHgxMiwgMHgxNiwgMHgxNiwgMHgxMiwgMHgxMywgMHg5ZSwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwKKzB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MTgsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsIDB4NGYsCisweDI0LCAweGZmLCAweDkyLCAweDE4LCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDE5LCAweDc0LCAweDFlLAorMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgyNSwgMHg3MCwgMHgxMywgMHgzMCwgMHgxOCwgMHgwNSwgMHhlNSwgMHg1ZiwKKzB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MTksIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsIDB4MjUsCisweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLCAweGU1LAorMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MjUsIDB4NzAsCisweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDA3LCAweDgwLCAweDAyLCAweDE1LAorMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwgMHg0NywgMHhiNCwgMHgwOSwgMHgxNCwgMHhlNSwgMHg0NCwgMHgyMCwgMHhlMywgMHgwYiwgMHhlNSwKKzB4M2EsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDMsIDB4MDQsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4OTAsIDB4NzAsCisweDQ2LCAweGU1LCAweDJkLCAweGYwLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUwLCAweDAyLCAweGIyLCAweDY4LCAweDIwLCAweDZiLAorMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwgMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwMiwKKzB4YjIsIDB4NmMsIDB4OTAsIDB4NzAsIDB4NDcsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4NzUsIDB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsCisweDgwLCAweDI2LCAweDMwLCAweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUyLCAweDA0LAorMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwgMHgwMSwKKzB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzMsIDB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsCisweDZhLCAweDgwLCAweDI2LCAweDMwLCAweDZhLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLCAweGUwLAorMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwgMHg3ZSwKKzB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzUsIDB4OTIsIDB4NzQsIDB4MjAsIDB4NmQsIDB4MDQsCisweGEyLCAweDZjLCAweDgwLCAweDI2LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLCAweDgwLCAweDFkLCAweGU1LCAweDVlLCAweDIwLAorMHhlMSwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZSwgMHhiZSwgMHhmMCwgMHgwNCwKKzB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NzEsIDB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsCisweDJmLCAweGU1LCAweDJlLCAweGYwLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDRjLCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLAorMHhmMCwgMHhlNSwgMHg0MywgMHhjNCwgMHg1NCwgMHgwZiwgMHgxNCwgMHg2MCwgMHgxNCwgMHgyNCwgMHhmZSwgMHg2MCwgMHgyMywgMHgyNCwgMHgwMywgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTYsIDB4MDUsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MzAsIDB4NDcsIDB4MGYsIDB4ODAsIDB4MDcsIDB4OTAsIDB4MDIsIDB4MjgsCisweGUwLCAweDIwLCAweDQ3LCAweDA2LCAweDU0LCAweGZlLCAweGYwLCAweDAyLCAweDE2LCAweDA1LCAweDQ0LCAweDAxLCAweGYwLCAweDAyLCAweDE2LCAweDA1LAorMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHg1NCwKKzB4ZmUsIDB4NGYsIDB4ZjAsIDB4MDIsIDB4MTYsIDB4MDUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MGYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsCisweDYwLCAweDA5LCAweGU1LCAweDQ3LCAweDY0LCAweDA5LCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDA1LCAweGU0LCAweGY1LCAweDI3LCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyZCwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwgMHg2MCwgMHgzNiwKKzB4MjQsIDB4ZmMsIDB4NjAsIDB4NWYsIDB4MjQsIDB4ZjksIDB4NjAsIDB4MWYsIDB4MjQsIDB4MGUsIDB4NzAsIDB4NjksIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsCisweDU0LCAweDNmLCAweDc1LCAweGYwLCAweDAxLCAweDg0LCAweGFmLCAweGYwLCAweDIwLCAweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLAorMHgwMCwgMHhlZiwgMHg2ZSwgMHgyNCwgMHhmZiwgMHg4MCwgMHg0NSwgMHhhMiwgMHg0NywgMHg4MCwgMHg0MSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywKKzB4ZDMsIDB4ODAsIDB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsIDB4NTQsIDB4MzgsIDB4YzMsIDB4OTQsIDB4MzAsCisweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LCAweDA0LCAweDdkLAorMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwKKzB4MzksIDB4ODAsIDB4MTksIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4YTIsIDB4NDcsCisweGIzLCAweDkyLCAweDM4LCAweDgwLCAweDA3LCAweGEyLCAweDQ3LCAweGIzLCAweDkyLCAweDM4LCAweDkyLCAweDM5LCAweDkwLCAweDAyLCAweDI4LCAweGUwLAorMHg1NCwgMHhmYywgMHg0NSwgMHgyNywgMHhmMCwgMHg5MCwgMHg3MCwgMHg5YywgMHhlNSwgMHgzYSwgMHhmMCwgMHhhMywgMHhlNSwgMHg0NywgMHhmMCwgMHg5MCwKKzB4NzAsIDB4NDEsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4MjIsIDB4ZTQsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4NDUsCisweDgwLCAweDA0LCAweGU1LCAweDQ1LCAweGY0LCAweGZmLCAweDkwLCAweDAyLCAweDI4LCAweGVmLCAweGYwLCAweDIyLCAweDhmLCAweDUwLCAweGQyLCAweDU5LAorMHgyMiwgMHg4ZiwgMHg1NCwgMHhkMiwgMHg1OCwgMHgyMiwgMHhlNCwgMHhmNSwgMHg2MiwgMHhjMiwgMHhhZiwgMHhlNSwgMHg1MSwgMHgxNCwgMHg2MCwgMHg0NiwKKzB4MTQsIDB4NjAsIDB4NjIsIDB4MjQsIDB4MDIsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTYsIDB4ZjAsIDB4ZDIsIDB4NTksIDB4NzUsIDB4NTUsIDB4MDEsIDB4OTAsCisweDAyLCAweGEyLCAweGUwLCAweDU0LCAweDdmLCAweGYwLCAweGEzLCAweGUwLCAweDIwLCAweGU3LCAweDIyLCAweDkwLCAweDA0LCAweDM0LCAweGUwLCAweGI0LAorMHgwMiwgMHgxYiwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMiwgMHgxNiwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMiwgMHgxMSwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNiwKKzB4MmMsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjMsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDEsIDB4ODAsIDB4NzMsIDB4ZTUsIDB4NTAsIDB4NzAsCisweDA1LCAweDc1LCAweDYyLCAweDAzLCAweDgwLCAweDZhLCAweDkwLCAweDEyLCAweDAwLCAweGUwLCAweDU0LCAweDAzLCAweDcwLCAweDExLCAweDdmLCAweDIwLAorMHgxMiwgMHgxNiwgMHgyYywgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHhiZiwgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHg4MCwgMHg1MSwgMHhlNSwKKzB4NTAsIDB4NzAsIDB4MDIsIDB4ODAsIDB4NDYsIDB4OTAsIDB4MDIsIDB4YTMsIDB4ZTAsIDB4MjAsIDB4ZTYsIDB4M2IsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsCisweDY0LCAweDIyLCAweDcwLCAweDMzLCAweDkwLCAweDAxLCAweDhhLCAweDc0LCAweDdlLCAweGYwLCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweDkwLCAweDEyLAorMHgwNCwgMHg3NCwgMHgwYSwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwgMHhhMywgMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwKKzB4YTMsIDB4ZTAsIDB4NTQsIDB4ZmEsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NTQsIDB4ZjksIDB4ZjAsIDB4NzUsIDB4NjIsIDB4MDEsIDB4NzUsCisweDU1LCAweDAyLCAweGU0LCAweGY1LCAweDUxLCAweDgwLCAweDA5LCAweGU1LCAweDUwLCAweDcwLCAweDA1LCAweDc1LCAweDYyLCAweDAzLCAweGY1LCAweDUxLAorMHhlNSwgMHg2MiwgMHg2MCwgMHgxNSwgMHhjMiwgMHgwMSwgMHhlNCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHhhZCwgMHg2MiwgMHhhZiwgMHg0MCwgMHgxMiwKKzB4MTcsIDB4N2EsIDB4ZTUsIDB4NjIsIDB4YjQsIDB4MDMsIDB4MDIsIDB4ZDIsIDB4MDMsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsIDB4MzAsIDB4MDEsCisweDEyLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGMyLCAweDAxLCAweDdkLCAweDAyLCAweGFmLCAweDQwLAorMHgxMiwgMHgxNywgMHg3YSwgMHhlNSwgMHg1MiwgMHgxNCwgMHg2MCwgMHgwOSwgMHgwNCwgMHg3MCwgMHg0YywgMHg3NSwgMHg1MiwgMHgwMSwgMHg3NSwgMHg1NSwKKzB4MDMsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsIDB4NDQsIDB4MGUsIDB4ZjAsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NDQsIDB4MGYsIDB4ZjAsIDB4YTMsCisweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDA1LCAweGYwLCAweDkwLCAweDEyLCAweDA0LCAweDc0LCAweDAzLCAweGYwLCAweDkwLAorMHgwMiwgMHhhMiwgMHhlMCwgMHg0NCwgMHhjMCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg0NCwgMHgwYywgMHhmMCwgMHhlNCwgMHhmNSwgMHg1MiwKKzB4ZjUsIDB4NTUsIDB4MzAsIDB4MDIsIDB4MGIsIDB4YzIsIDB4MDIsIDB4N2QsIDB4MDEsIDB4YWYsIDB4NDEsIDB4MTIsIDB4MTcsIDB4N2EsIDB4ODAsIDB4MDIsCisweGMyLCAweDAzLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGQyLCAweGFmLCAweDIyLCAweGVmLCAweGY0LCAweDYwLCAweDJkLCAweGU0LCAweGZlLAorMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlMCwgMHhiNCwgMHhmZiwgMHgxOSwgMHg3NCwgMHgxNCwKKzB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWYsIDB4ZjAsIDB4NzQsIDB4MWMsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsCisweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLCAweDA0LCAweGQ1LCAweDIyLCAweDIyLCAweDIyLCAweDkwLCAweDcwLAorMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg0ZCwgMHhjMiwgMHhhZiwgMHg5MCwgMHg3MCwgMHgyOCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhmMCwgMHg5MCwKKzB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZjAsIDB4OTAsCisweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDYyLCAweDkwLCAweDEwLCAweDFlLCAweGUwLCAweDIwLCAweGUxLCAweGYzLCAweDkwLCAweDEwLCAweDFjLCAweGUwLAorMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwKKzB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjQsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4YzIsIDB4MDUsCisweGQyLCAweGFmLCAweDIyLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHg2OSwgMHg3NywKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTAsIDB4MjgsIDB4MDIsIDB4MTAsIDB4MzIsIDB4MDIsIDB4MTAsIDB4NzgsIDB4MDIsIDB4MTIsIDB4MjUsIDB4MDIsCisweDEyLCAweDI2LCAweDAyLCAweDEyLCAweDM5LCAweDAyLCAweDEyLCAweDNlLCAweDEyLCAweDEyLCAweDNhLCAweDIyLCAweDAyLCAweDE1LCAweDcyLCAweDAyLAorMHgxNiwgMHg0OCwgMHgwMiwgMHgxMywgMHgyOSwgMHgwMiwgMHgxMiwgMHgzZiwgMHgzMCwgMHgwNSwgMHgwNiwgMHgyMCwgMHgwZCwgMHgwMywgMHgxMiwgMHgxNiwKKzB4ZWEsIDB4MjIsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MWIsIDB4ZTUsIDB4NGMsIDB4MzAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4NDAsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDEwLCAweDJmLCAweGVmLCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweDc0LCAweDA4LCAweGYwLCAweGU0LAorMHg5MCwgMHgwMSwgMHhhNywgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMCwgMHgxYywgMHg5MCwgMHgwMSwgMHg4MCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MTUsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDEsIDB4MTAsIDB4OTAsIDB4MDEsIDB4ODQsIDB4ZTAsIDB4YjQsIDB4ODEsIDB4MDksIDB4OTAsIDB4MDEsCisweDhjLCAweDc0LCAweDAxLCAweGYwLCAweDEyLCAweDBkLCAweGRkLCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLAorMHgxMiwgMHgxYSwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgxMiwgMHgwYSwgMHhiNiwgMHgxMCwKKzB4YjQsIDB4MzEsIDB4MTAsIDB4ZGYsIDB4NTAsIDB4MTEsIDB4MDUsIDB4NTEsIDB4MTEsIDB4MTAsIDB4NTIsIDB4MTEsIDB4MTAsIDB4NTMsIDB4MTEsIDB4MTAsCisweDU0LCAweDExLCAweDUxLCAweDU1LCAweDExLCAweDcwLCAweDcwLCAweDExLCAweDlhLCAweDcxLCAweDExLCAweGM0LCAweDcyLCAweDExLCAweGYyLCAweDgwLAorMHgwMCwgMHgwMCwgMHgxMiwgMHgxYSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwKKzB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsCisweDAzLCAweDAyLCAweDEyLCAweDFhLCAweDAyLCAweDEyLCAweDEzLCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDAyLCAweDEyLCAweDFhLCAweDkwLAorMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwKKzB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4NzUsIDB4NGUsIDB4MDMsIDB4NzUsCisweDRmLCAweDIwLCAweDAyLCAweDEyLCAweDFhLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDQ3LCAweDAyLCAweDEyLCAweDFhLAorMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZiwgMHg3NCwKKzB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDgsIDB4MjUsIDB4NTcsCisweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLAorMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHgwMiwgMHgxMiwKKzB4MTMsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDgsIDB4MDgsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweDU0LCAweDA3LCAweGY1LCAweDNhLCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweGQyLCAweDA0LCAweDAyLCAweDEyLCAweDFhLAorMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmOCwgMHhlNiwgMHhmNSwgMHg1NywgMHhmZCwKKzB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsCisweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDFhLCAweDgwLCAweDc5LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLAorMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwKKzB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsCisweDYwLCAweDU4LCAweDgwLCAweDRmLCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDNhLCAweGZmLCAweGFkLCAweDU3LCAweGFmLCAweDU2LAorMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDAsIDB4ZTUsIDB4M2EsIDB4ZjAsCisweDgwLCAweDI4LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LCAweGFkLCAweDU3LCAweGFmLCAweDU2LAorMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDIsIDB4ZTUsIDB4M2EsIDB4ZjAsCisweGEzLCAweDc0LCAweGFiLCAweGYwLCAweDIyLCAweDIyLCAweGU1LCAweDUzLCAweDcwLCAweDBlLCAweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LAorMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwgMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgyMiwgMHhjMiwKKzB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsIDB4YjYsIDB4MTIsIDB4NjEsIDB4MDAsIDB4MTIsIDB4ZjQsIDB4MDQsIDB4MTIsIDB4ZjAsCisweDA4LCAweDEyLCAweGNiLCAweDEwLCAweDEyLCAweDc1LCAweDIwLCAweDEyLCAweDk1LCAweDYwLCAweDEyLCAweGE2LCAweGEwLCAweDAwLCAweDAwLCAweDEyLAorMHhmNiwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywKKzB4MDIsIDB4MTIsIDB4ZjYsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDY2LAorMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwgMHgwNiwKKzB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsCisweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLCAweDA2LAorMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwKKzB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLCAweGU1LAorMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwgMHg3MCwKKzB4MDMsIDB4MTIsIDB4MTUsIDB4NTIsIDB4MTIsIDB4MTMsIDB4M2UsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsCisweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDE4LCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LCAweDRmLAorMHgyNCwgMHhmZiwgMHg5MiwgMHgxOCwgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxOSwgMHg3NCwgMHgxZSwKKzB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MTgsIDB4MDUsIDB4ZTUsIDB4NWYsCisweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDE5LCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LCAweDI1LAorMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwgMHhlNSwKKzB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsIDB4NDcsCisweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDI1LCAweDcwLAorMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwNywgMHg4MCwgMHgwMiwgMHgxNSwKKzB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4OTAsIDB4NzAsIDB4NDYsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4MjAsIDB4NjksIDB4MDcsIDB4ZTUsIDB4NWUsCisweDIwLCAweGUwLCAweDAyLCAweGIyLCAweDY4LCAweDIwLCAweDZiLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDAyLCAweGIyLCAweDZhLCAweDIwLAorMHg2ZCwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwMiwgMHhiMiwgMHg2YywgMHg5MCwgMHg3MCwgMHg0NywgMHhlNSwgMHgyZCwgMHhmMCwgMHg3NSwKKzB4MmUsIDB4NDAsIDB4MjAsIDB4NjksIDB4MDQsIDB4YTIsIDB4NjgsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NjgsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsCisweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDczLAorMHg5MiwgMHg3MiwgMHgyMCwgMHg2YiwgMHgwNCwgMHhhMiwgMHg2YSwgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywKKzB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4NzUsCisweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLCAweDE1LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLAorMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHg3MSwKKzB4OTIsIDB4NzAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NGMsIDB4OTAsIDB4MDIsCisweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLCAweDE0LCAweDYwLCAweDE0LCAweDI0LCAweGZlLCAweDYwLAorMHgyMywgMHgyNCwgMHgwMywgMHg2MCwgMHgwMywgMHgwMiwgMHgxNSwgMHg0MSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHgzMCwgMHg0NywgMHgwZiwgMHg4MCwKKzB4MDcsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MjAsIDB4NDcsIDB4MDYsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4MDIsIDB4MTUsIDB4NDEsIDB4NDQsIDB4MDEsCisweGYwLCAweDAyLCAweDE1LCAweDQxLCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDA0LCAweDdmLCAweDAxLCAweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLAorMHgwMiwgMHgyOCwgMHhlMCwgMHg1NCwgMHhmZSwgMHg0ZiwgMHhmMCwgMHgwMiwgMHgxNSwgMHg0MSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgwOSwKKzB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTUsIDB4NDEsIDB4ZTQsIDB4ZjUsIDB4MjcsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsCisweDU0LCAweGZjLCAweGYwLCAweGU1LCAweDNhLCAweDE0LCAweDYwLCAweDI2LCAweDE0LCAweDYwLCAweDJlLCAweDE0LCAweDYwLCAweDM2LCAweDI0LCAweDAzLAorMHg3MCwgMHg1ZiwgMHhlNSwgMHg0NiwgMHgxMywgMHgxMywgMHgxMywgMHg1NCwgMHgxZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwKKzB4NDcsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWYsIDB4NmUsIDB4MjQsIDB4ZmYsIDB4ODAsIDB4MDIsIDB4YTIsIDB4NDcsCisweDkyLCAweDM5LCAweGEyLCAweDQ3LCAweGIzLCAweDkyLCAweDM4LCAweDgwLCAweDNmLCAweGU1LCAweDQ2LCAweDMwLCAweGUzLCAweDAzLCAweGQzLCAweDgwLAorMHgyNywgMHhjMywgMHg4MCwgMHgyNCwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwZCwgMHg1NCwgMHg3MCwgMHhjMywgMHg5NCwgMHg2MCwgMHg1MCwgMHgwNiwKKzB4N2UsIDB4MDAsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDQsIDB4N2UsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MjAsIDB4NDcsIDB4MDQsIDB4N2QsIDB4MDEsIDB4ODAsCisweDAyLCAweDdkLCAweDAwLCAweGVmLCAweDZkLCAweDRlLCAweDI0LCAweGZmLCAweDkyLCAweDM4LCAweGEyLCAweDQ3LCAweGIzLCAweDkyLCAweDM5LCAweDgwLAorMHgwNywgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg5MiwgMHgzOSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHg1NCwgMHhmYywgMHg0NSwgMHgyNywKKzB4ZjAsIDB4OTAsIDB4NzAsIDB4OWMsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDcsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDEsIDB4ZTUsIDB4M2EsCisweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LCAweDgwLCAweDA0LCAweGU1LCAweDQ1LAorMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwgMHgyMiwgMHg4ZiwgMHg1NCwgMHhkMiwKKzB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4NjIsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NDYsIDB4MTQsIDB4NjAsIDB4NjIsIDB4MjQsCisweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDJjLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDkwLCAweDAyLCAweGEyLCAweGUwLCAweDU0LAorMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNywgMHgyMiwgMHg5MCwgMHgwNCwgMHgzNCwgMHhlMCwgMHhiNCwgMHgwMiwgMHgxYiwgMHhhMywgMHhlMCwKKzB4YjQsIDB4MDIsIDB4MTYsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTUsIDB4NjgsIDB4OTAsIDB4MTAsIDB4MDQsCisweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDgwLCAweDczLCAweGU1LCAweDUwLCAweDcwLCAweDA1LCAweDc1LCAweDYyLCAweDAzLAorMHg4MCwgMHg2YSwgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywgMHg3MCwgMHgxMSwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNSwgMHg2OCwgMHg5MCwKKzB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4YmYsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDIsIDB4ODAsIDB4NTEsIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDIsIDB4ODAsCisweDQ2LCAweDkwLCAweDAyLCAweGEzLCAweGUwLCAweDIwLCAweGU2LCAweDNiLCAweDkwLCAweDA0LCAweDM3LCAweGUwLCAweDY0LCAweDIyLCAweDcwLCAweDMzLAorMHg5MCwgMHgwMSwgMHg4YSwgMHg3NCwgMHg3ZSwgMHhmMCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwYSwgMHhmMCwKKzB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZmEsCisweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LCAweDU1LCAweDAyLCAweGU0LCAweGY1LAorMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwgMHhlNSwgMHg2MiwgMHg2MCwgMHgxNSwKKzB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTYsIDB4YjYsIDB4ZTUsIDB4NjIsCisweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLCAweDEyLCAweGU0LCAweDkwLCAweDAxLAorMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxNiwgMHhiNiwgMHhlNSwKKzB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsIDB4NGMsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDMsIDB4OTAsIDB4MDQsIDB4MDEsCisweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLCAweGUwLCAweDQ0LCAweDBmLCAweGYwLAorMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg0NCwKKzB4YzAsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsIDB4ZjUsIDB4NTUsIDB4MzAsIDB4MDIsCisweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLCAweDEyLCAweDE2LCAweGI2LCAweDgwLCAweDAyLCAweGMyLCAweDAzLCAweGU0LCAweDkwLAorMHgwMSwgMHg5NiwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwKKzB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsCisweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLAorMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwKKzB4NGQsIDB4YzIsIDB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsCisweDEwLCAweDFkLCAweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LAorMHg2MiwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwKKzB4OTAsIDB4MTAsIDB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsCisweDMwLCAweDRhLCAweDA3LCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LCAweGQyLCAweGFmLCAweDIyLCAweDIyLAorMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZTksIDB4MDAsIH0gOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ3NzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWQ1LmMKQEAgLTAsMCArMSwxNDI3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIG1kNS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJamFuCQkJMTAtMjgtMDMJCUluaXRpYWwKKwlSaXRhICAgIAkxMS0yMy0wNAkJTW9kaWZ5IE1ENSBhbmQgU0hBLTEKKwlSaXRhCQkxMC0xNC0wNQkJTW9kaWZ5IFNIQS0xIGluIGJpZy1lbmRpYW4gcGxhdGZvcm0KKyAqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKioKKyAqIG1kNV9tYWM6CisgKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KKyAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcworICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKKyAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCisgKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKKyAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQorICoKKyAqIG1kNV9tYWMoKSBkZXRlcm1pbmVzCXRoZQltZXNzYWdlCWF1dGhlbnRpY2F0aW9uIGNvZGUJYnkgdXNpbmcgc2VjdXJlCWhhc2gKKyAqIE1ENShrZXkgfCBkYXRhIHwJa2V5KS4KKyAqLwordm9pZCBtZDVfbWFjKHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQoreworCU1ENV9DVFgJY29udGV4dDsKKworCU1ENUluaXQoJmNvbnRleHQpOworCU1ENVVwZGF0ZSgmY29udGV4dCwJa2V5LCBrZXlfbGVuKTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7Cit9CisKKy8qKgorICogaG1hY19tZDU6CisgKiBAa2V5OiBwb2ludGVyIHRvCXRoZQlrZXkJdXNlZCBmb3IgTUFDIGdlbmVyYXRpb24KKyAqIEBrZXlfbGVuOiBsZW5ndGgJb2YgdGhlIGtleSBpbiBieXRlcworICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGRhdGEgYXJlYSBmb3Igd2hpY2ggdGhlIE1BQyBpcwlnZW5lcmF0ZWQKKyAqIEBkYXRhX2xlbjogbGVuZ3RoIG9mCXRoZQlkYXRhIGluCWJ5dGVzCisgKiBAbWFjOiBwb2ludGVyIHRvCXRoZQlidWZmZXIgaG9sZGluZyBzcGFjZSBmb3IgdGhlIE1BQzsgdGhlIGJ1ZmZlciBzaG91bGQKKyAqIGhhdmUJc3BhY2UgZm9yIDEyOC1iaXQgKDE2IGJ5dGVzKSBNRDUgaGFzaCB2YWx1ZQorICoKKyAqIGhtYWNfbWQ1KCkgZGV0ZXJtaW5lcyB0aGUgbWVzc2FnZSBhdXRoZW50aWNhdGlvbgljb2RlIHVzaW5nIEhNQUMtTUQ1LgorICogVGhpcwlpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZAlvbiB0aGUgc2FtcGxlIGNvZGUgcHJlc2VudGVkIGluCVJGQwkyMTA0LgorICovCit2b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKQoreworCU1ENV9DVFgJY29udGV4dDsKKyAgICB1OCBrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkICovCisgICAgdTgga19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZCAqLworICAgIHU4IHRrWzE2XTsKKwlpbnQJaTsKKworCS8vYXNzZXJ0KGtleSAhPSBOVUxMICYmIGRhdGEgIT0gTlVMTCAmJiBtYWMgIT0gTlVMTCk7CisKKwkvKiBpZiBrZXkgaXMgbG9uZ2VyCXRoYW4gNjQJYnl0ZXMgcmVzZXQJaXQgdG8ga2V5ID0JTUQ1KGtleSkgKi8KKwlpZiAoa2V5X2xlbgk+IDY0KSB7CisJCU1ENV9DVFgJdHRjb250ZXh0OworCisJCU1ENUluaXQoJnR0Y29udGV4dCk7CisJCU1ENVVwZGF0ZSgmdHRjb250ZXh0LCBrZXksIGtleV9sZW4pOworCQlNRDVGaW5hbCh0aywgJnR0Y29udGV4dCk7CisJCS8va2V5PShQVUNIQVIpdHRjb250ZXh0LmJ1ZjsKKwkJa2V5CT0gdGs7CisJCWtleV9sZW4JPSAxNjsKKwl9CisKKwkvKiB0aGUgSE1BQ19NRDUJdHJhbnNmb3JtIGxvb2tzCWxpa2U6CisJICoKKwkgKiBNRDUoSyBYT1Igb3BhZCwgTUQ1KEsgWE9SIGlwYWQsIHRleHQpKQorCSAqCisJICogd2hlcmUgSyBpcyBhbiBuIGJ5dGUJa2V5CisJICogaXBhZAlpcyB0aGUgYnl0ZQkweDM2IHJlcGVhdGVkIDY0IHRpbWVzCisJICogb3BhZAlpcyB0aGUgYnl0ZQkweDVjIHJlcGVhdGVkIDY0IHRpbWVzCisJICogYW5kIHRleHQJaXMgdGhlIGRhdGEJYmVpbmcgcHJvdGVjdGVkCSovCisKKwkvKiBzdGFydCBvdXQgYnkJc3RvcmluZwlrZXkJaW4gcGFkcwkqLworCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwJc2l6ZW9mKGtfb3BhZCkpOworCS8vYXNzZXJ0KGtleV9sZW4gPCBzaXplb2Yoa19pcGFkKSk7CisJTmRpc01vdmVNZW1vcnkoa19pcGFkLCBrZXksCWtleV9sZW4pOworCU5kaXNNb3ZlTWVtb3J5KGtfb3BhZCwga2V5LAlrZXlfbGVuKTsKKworCS8qIFhPUiBrZXkgd2l0aAlpcGFkIGFuZCBvcGFkIHZhbHVlcyAqLworCWZvcgkoaSA9IDA7CWkgPAk2NDsJaSsrKSB7CisJCWtfaXBhZFtpXSBePSAweDM2OworCQlrX29wYWRbaV0gXj0gMHg1YzsKKwl9CisKKwkvKiBwZXJmb3JtIGlubmVyIE1ENSAqLworCU1ENUluaXQoJmNvbnRleHQpOwkJCQkJIC8qCWluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkgLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlNRDVVcGRhdGUoJmNvbnRleHQsCWRhdGEsIGRhdGFfbGVuKTsgLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLyogcGVyZm9ybSBvdXRlciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDJuZCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX29wYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAltYWMsIDE2KTsJCSAvKgl0aGVuIHJlc3VsdHMgb2YJMXN0CWhhc2ggKi8KKwlNRDVGaW5hbChtYWMsICZjb250ZXh0KTsJCQkgLyoJZmluaXNoIHVwIDJuZCBwYXNzICovCit9CisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorI2RlZmluZSBieXRlUmV2ZXJzZShidWYsIGxlbikgICAvKiBOb3RoaW5nICovCisjZWxzZQordm9pZCBieXRlUmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmdzKTsKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncykKK3sKKyAgICBkbyB7CisgICAgICAgICooVUlOVDMyICopYnVmID0gU1dBUDMyKCooVUlOVDMyICopYnVmKTsKKyAgICAgICAgYnVmICs9IDQ7CisgICAgfSB3aGlsZSAoLS1sb25ncyk7Cit9CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAgTUQ1IGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgTUQ1CisjZGVmaW5lIE1ENV9GMSh4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCisjZGVmaW5lIE1ENV9GMih4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpCisjZGVmaW5lIE1ENV9GMyh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorI2RlZmluZSBNRDVfRjQoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKKyNkZWZpbmUgQ1lDTElDX0xFRlRfU0hJRlQodywgcykgKCgodykgPDwgKHMpKSB8ICgodykgPj4gKDMyLShzKSkpKQorCisjZGVmaW5lCU1ENVN0ZXAoZiwgdywgeCwgeSwJeiwgZGF0YSwgdCwgcykJXAorCSggdwkrPSBmKHgsCXksIHopICsJZGF0YSArIHQsICB3ID0gKENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpKSAmIDB4ZmZmZmZmZmYsIHcgKz0JeCApCisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgSW5pdGlhdGUgTUQ1IENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAxMzIxCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqLworVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFVwZGF0ZSBNRDUgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dCBwb3J0aW9uCisgKiAgICAgIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBNRDUgY29udGV4dAorICogCSAgICBwRGF0YSAgICAgICBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAqICAgICAgTGVuSW5CeXRlcyAgVGhlIGxlbmd0aCBvZiBpbnB1dCBkYXRhICh1bml0OiBieXRlKQorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENUluaXQgb3IgTUQ1VXBkYXRlKGl0c2VsZikKKyAqLworVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKK3sKKworICAgIFVJTlQzMiBUZlRpbWVzOworICAgIFVJTlQzMiB0ZW1wOworCXVuc2lnbmVkIGludCBpOworCisgICAgdGVtcCA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gKyAoTGVuSW5CeXRlcyA8PCAzKSk7CisKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXApCisgICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdICs9IExlbkluQnl0ZXMgPj4gMjk7CisKKyAgICAvLyBtb2QgNjQgYnl0ZXMKKyAgICB0ZW1wID0gKHRlbXAgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDsKKworICAgICAgICBpZiAoKHRlbXArTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXApOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXA7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDsKKyAgICB9IC8vIGVuZCBvZiBpZiAodGVtcCkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgICAgIHBEYXRhICs9IDY0OworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OworICAgIH0gLy8gZW5kIG9mIGZvcgorCisgICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQorICAgIGlmKExlbkluQnl0ZXMpCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7CisKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorICogICAgICBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgRGlnZXN0CQlPdXRwdXQgb2YgRGlnZXN0LU1lc3NhZ2UgZm9yIE1ENQorICogIAlwQ3R4ICAgICAgICBQb2ludGVyCXRvIE1ENSBjb250ZXh0CisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYWZ0ZXIgTUQ1VXBkYXRlCisgKi8KK1ZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCkKK3sKKyAgICBVQ0hBUiBSZW1haW5kZXI7CisgICAgVUNIQVIgUGFkTGVuSW5CeXRlczsKKyAgICBVQ0hBUiAqcEFwcGVuZD0wOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgUmVtYWluZGVyID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAzKSAmIDB4M2YpOworCisgICAgUGFkTGVuSW5CeXRlcyA9IChSZW1haW5kZXIgPCA1NikgPyAoNTYtUmVtYWluZGVyKSA6ICgxMjAtUmVtYWluZGVyKTsKKworICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRob3V0IGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgaWYgKFJlbWFpbmRlciA8IDU2KQorICAgIHsKKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsIFBhZExlbkluQnl0ZXMpOworCisJCS8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZCwgZnJvbSBsb3cgdG8gaGlnaAorICAgICAgIAlmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKKyAgICAgIAl9CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisKKyAgICAgICAgLy8gdGhlIHNlY29uZCBibG9jayA9PT0KKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQsIFBhZExlbkluQnl0ZXMpOworCisgICAgICAgIC8vIGFkZCBkYXRhLWxlbmd0aCBmaWVsZAorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXBDdHgtPklucHV0WzU2K2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA+PiAoaSA8PCAzKSkgJiAweGZmKTsKKyAgICAgIAl9CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIE5kaXNNb3ZlTWVtb3J5KChVQ0hBUiAqKURpZ2VzdCwgKFVJTlQzMiAqKXBDdHgtPkJ1ZiwgMTYpOyAvLyBvdXRwdXQKKyAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilEaWdlc3QsIDQpOworICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIE1ENSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kIHNpeHRlZW4KKyAqICAJc3RlcHMgcGVyIHJvdW5kCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgQnVmICAgICBCdWZmZXJzIG9mIGZvdXIgc3RhdGVzIChvdXRwdXQ6IDE2IGJ5dGVzKQorICogCSAgICBNZXMgICAgIElucHV0IGRhdGEgKGlucHV0OiA2NCBieXRlcykKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBieSBNRDVVcGRhdGUgb3IgTUQ1RmluYWwKKyAqLworVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pCit7CisgICAgVUlOVDMyIFJlZ1s0XSwgVGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHN0YXRpYyBVQ0hBUiBMU2hpZnRWYWxbMTZdID0KKyAgICB7CisgICAgICAgIDcsIDEyLCAxNywgMjIsCisJCTUsIDkgLCAxNCwgMjAsCisJCTQsIDExLCAxNiwgMjMsCisgCQk2LCAxMCwgMTUsIDIxLAorIAl9OworCisKKwkvLyBbZXF1YWwgdG8gNDI5NDk2NzI5NiphYnMoc2luKGluZGV4KSldCisgICAgc3RhdGljIFVJTlQzMiBNRDVUYWJsZVs2NF0gPQorCXsKKwkJMHhkNzZhYTQ3OCwJMHhlOGM3Yjc1NiwJMHgyNDIwNzBkYiwJMHhjMWJkY2VlZSwKKwkJMHhmNTdjMGZhZiwJMHg0Nzg3YzYyYSwJMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKKwkJMHg2OTgwOThkOCwJMHg4YjQ0ZjdhZiwJMHhmZmZmNWJiMSwJMHg4OTVjZDdiZSwKKyAgICAJMHg2YjkwMTEyMiwJMHhmZDk4NzE5MywJMHhhNjc5NDM4ZSwJMHg0OWI0MDgyMSwKKworICAgIAkweGY2MWUyNTYyLAkweGMwNDBiMzQwLAkweDI2NWU1YTUxLAkweGU5YjZjN2FhLAorICAgIAkweGQ2MmYxMDVkLAkweDAyNDQxNDUzLAkweGQ4YTFlNjgxLAkweGU3ZDNmYmM4LAorICAgIAkweDIxZTFjZGU2LAkweGMzMzcwN2Q2LAkweGY0ZDUwZDg3LAkweDQ1NWExNGVkLAorICAgIAkweGE5ZTNlOTA1LAkweGZjZWZhM2Y4LAkweDY3NmYwMmQ5LAkweDhkMmE0YzhhLAorCisgICAgCTB4ZmZmYTM5NDIsCTB4ODc3MWY2ODEsCTB4NmQ5ZDYxMjIsCTB4ZmRlNTM4MGMsCisgICAgCTB4YTRiZWVhNDQsCTB4NGJkZWNmYTksCTB4ZjZiYjRiNjAsCTB4YmViZmJjNzAsCisgICAgCTB4Mjg5YjdlYzYsCTB4ZWFhMTI3ZmEsCTB4ZDRlZjMwODUsCTB4MDQ4ODFkMDUsCisgICAgCTB4ZDlkNGQwMzksCTB4ZTZkYjk5ZTUsCTB4MWZhMjdjZjgsCTB4YzRhYzU2NjUsCisKKyAgICAJMHhmNDI5MjI0NCwJMHg0MzJhZmY5NywJMHhhYjk0MjNhNywJMHhmYzkzYTAzOSwKKyAgIAkJMHg2NTViNTljMywJMHg4ZjBjY2M5MiwJMHhmZmVmZjQ3ZCwJMHg4NTg0NWRkMSwKKyAgICAJMHg2ZmE4N2U0ZiwJMHhmZTJjZTZlMCwJMHhhMzAxNDMxNCwJMHg0ZTA4MTFhMSwKKyAgICAJMHhmNzUzN2U4MiwJMHhiZDNhZjIzNSwJMHgyYWQ3ZDJiYiwJMHhlYjg2ZDM5MQorCX07CisKKworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgUmVnW2ldPUJ1ZltpXTsKKworCisgICAgLy8gNjQgc3RlcHMgaW4gTUQ1IGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbaV0sCisgICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFtpICYgMHgzXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MTY7IGk8MzI7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soNSooaSAmIDB4ZikrMSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT0zMjsgaTw0ODsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWygzKihpICYgMHhmKSs1KSAmIDB4Zl0sCisgICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgxIDw8IDMpKyhpICYgMHgzKV0pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTQ4OyBpPDY0OyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GNCwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDcqKGkgJiAweGYpKSAmIDB4Zl0sCisgICAgICAgICAgICAgICAgTUQ1VGFibGVbaV0sIExTaGlmdFZhbFsoMHgzIDw8IDIpKyhpICYgMHgzKV0pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisKKworICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0CisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOworCit9CisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBTSEEtMSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLy8gZm91ciBiYXNlIGZ1bmN0aW9ucyBmb3IgU0hBLTEKKyNkZWZpbmUgU0hBMV9GMShiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKH5iKSAmIChkKSkpCisjZGVmaW5lIFNIQTFfRjIoYiwgYywgZCkgICAgKChiKSBeIChjKSBeIChkKSkKKyNkZWZpbmUgU0hBMV9GMyhiLCBjLCBkKSAgICAoKChiKSAmIChjKSkgfCAoKGIpICYgKGQpKSB8ICgoYykgJiAoZCkpKQorCisKKyNkZWZpbmUgU0hBMVN0ZXAoZiwgYSwgYiwgYywgZCwgZSwgdywgaykgICAgXAorICAgICggZQkrPSAoIGYoYiwgYywgZCkgKyB3ICsgayArIENZQ0xJQ19MRUZUX1NISUZUKGEsIDUpKSAmIDB4ZmZmZmZmZmYsIFwKKyAgICAgIGIgPSBDWUNMSUNfTEVGVF9TSElGVChiLCAzMCkgKQorCisvL0luaXRpYXRlIFNIQS0xIENvbnRleHQgc2F0aXNmaWVkIGluIFJGQyAzMTc0CitWT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCkKK3sKKyAgICBwQ3R4LT5CdWZbMF09MHg2NzQ1MjMwMTsKKyAgICBwQ3R4LT5CdWZbMV09MHhlZmNkYWI4OTsKKyAgICBwQ3R4LT5CdWZbMl09MHg5OGJhZGNmZTsKKyAgICBwQ3R4LT5CdWZbM109MHgxMDMyNTQ3NjsKKyAgICBwQ3R4LT5CdWZbNF09MHhjM2QyZTFmMDsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF09MDsKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdPTA7Cit9CisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFVwZGF0ZSBTSEEtMSBDb250ZXh0LCBhbGxvdyBvZiBhbiBhcnJhcnkgb2Ygb2N0ZXRzIGFzIHRoZSBuZXh0CisgKiAgICAgIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgICBwQ3R4CQlQb2ludGVyCXRvIFNIQS0xIGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBlcnJvciAgICAgICBpbmRpY2F0ZSBtb3JlIHRoYW4gcG93KDIsNjQpIGJpdHMgb2YgZGF0YQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYWZ0ZXIgU0hBSW5pdCBvciBTSEFVcGRhdGUoaXRzZWxmKQorICovCitVQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcykKK3sKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDEsdGVtcDI7CisJdW5zaWduZWQgaW50IGk7CisJVUNIQVIgZXJyPTE7CisKKyAgICB0ZW1wMSA9IHBDdHgtPkxlbkluQml0Q291bnRbMF07CisgICAgdGVtcDIgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzFdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworICAgIGlmIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdIDwgdGVtcDEpCisgICAgICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0rKzsgICAvL2NhcnJ5IGluCisKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSArKExlbkluQnl0ZXMgPj4gMjkpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFsxXSA8IHRlbXAyKQorICAgICAgICByZXR1cm4gKGVycik7ICAgLy9jaGVjayB0b3RhbCBsZW5ndGggb2Ygb3JpZ2luYWwgZGF0YQorCisKKyAgICAvLyBtb2QgNjQgYnl0ZXMKKyAgICB0ZW1wMSA9ICh0ZW1wMSA+PiAzKSAmIDB4M2Y7CisKKyAgICAvLyBwcm9jZXNzIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQorICAgIGlmICh0ZW1wMSkKKyAgICB7CisgICAgICAgIFVDSEFSICpwQWRzID0gKFVDSEFSICopIHBDdHgtPklucHV0ICsgdGVtcDE7CisKKyAgICAgICAgaWYgKCh0ZW1wMStMZW5JbkJ5dGVzKSA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRzLCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIDY0LXRlbXAxKTsKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKyAgICAgICAgcERhdGEgKz0gNjQtdGVtcDE7CisgICAgICAgIExlbkluQnl0ZXMgLT0gNjQtdGVtcDE7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXAxKQorCisKKyAgICBUZlRpbWVzID0gKExlbkluQnl0ZXMgPj4gNik7CisKKyAgICBmb3IgKGk9VGZUaW1lczsgaT4wOyBpLS0pCisgICAgeworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIDY0KTsKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgICAgIHBEYXRhICs9IDY0OworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0OworICAgIH0gLy8gZW5kIG9mIGZvcgorCisgICAgLy8gYnVmZmVyaW5nIGxhY2tzIG9mIDY0LWJ5dGUgZGF0YQorICAgIGlmKExlbkluQnl0ZXMpCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgTGVuSW5CeXRlcyk7CisKKwlyZXR1cm4gKDApOworCit9CisKKy8vIEFwcGVuZCBwYWRkaW5nIGJpdHMgYW5kIGxlbmd0aCBvZiBvcmlnaW5hbCBtZXNzYWdlIGluIHRoZSB0YWlsCisvLyBUaGUgbWVzc2FnZSBkaWdlc3QgaGFzIHRvIGJlIGNvbXBsZXRlZCBpbiB0aGUgZW5kCitWT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIHBBcHBlbmQgPSAoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcjsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gaGlnaCB0byBsb3cKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgIAl9CisKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTQpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGlmCisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIHRoZSBmaXJzdCBibG9jayA9PT0KKyAgICAgICAgKnBBcHBlbmQgPSAweDgwOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC0tOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgUmVtYWluZGVyKzEsICg2NC1SZW1haW5kZXItMSkpOworICAgICAgICBQYWRMZW5JbkJ5dGVzIC09ICg2NCAtIFJlbWFpbmRlciAtIDEpOworCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKCgzLWkpIDw8IDMpKSAmIDB4ZmYpOworICAgICAgICAJcEN0eC0+SW5wdXRbNjAraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgIAl9CisKKyAgICAgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopcEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgIH0gLy8gZW5kIG9mIGVsc2UKKworCisgICAgLy9PdXRwdXQsIGJ5dGVyZXZlcnNlCisgICAgZm9yIChpPTA7IGk8MjA7IGkrKykKKyAgICB7CisgICAgICAgIERpZ2VzdCBbaV0gPSAoVUNIQVIpKHBDdHgtPkJ1ZltpPj4yXSA+PiA4KigzLShpICYgMHgzKSkpOworICAgIH0KKworICAgIE5kaXNaZXJvTWVtb3J5KHBDdHgsIHNpemVvZihwQ3R4KSk7IC8vIG1lbW9yeSBmcmVlCit9CisKKworLy8gVGhlIGNlbnRyYWwgYWxnb3JpdGhtIG9mIFNIQS0xLCBjb25zaXN0cyBvZiBmb3VyIHJvdW5kcyBhbmQKKy8vIHR3ZW50eSBzdGVwcyBwZXIgcm91bmQKK1ZPSUQgU0hBVHJhbnNmb3JtKFVJTlQzMiBCdWZbNV0sIFVJTlQzMiBNZXNbMjBdKQoreworICAgIFVJTlQzMiBSZWdbNV0sVGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKyAgICBVSU5UMzIgV1s4MF07CisKKyAgICBzdGF0aWMgVUlOVDMyIFNIQTFUYWJsZVs0XSA9IHsgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhmMWJiY2RjLCAweGNhNjJjMWQ2IH07CisKKyAgICBSZWdbMF09QnVmWzBdOworCVJlZ1sxXT1CdWZbMV07CisJUmVnWzJdPUJ1ZlsyXTsKKwlSZWdbM109QnVmWzNdOworCVJlZ1s0XT1CdWZbNF07CisKKyAgICAvL3RoZSBmaXJzdCBvY3RldCBvZiBhIHdvcmQgaXMgc3RvcmVkIGluIHRoZSAwdGggZWxlbWVudCwgYnl0ZXJldmVyc2UKKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAJV1tpXSAgPSAoTWVzW2ldID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA+PiA4ICkgJiAweGZmMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCA4ICkgJiAweGZmMDAwMDsKKyAgICAgICAgV1tpXSB8PSAoTWVzW2ldIDw8IDI0KSAmIDB4ZmYwMDAwMDA7CisgICAgfQorCisKKyAgICBmb3IJKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkgICAgV1sxNitpXSA9IENZQ0xJQ19MRUZUX1NISUZUKFdbaV0gXiBXWzIraV0gXiBXWzgraV0gXiBXWzEzK2ldLCAxKTsKKworCisgICAgLy8gODAgc3RlcHMgaW4gU0hBLTEgYWxnb3JpdGhtCisgICAgZm9yIChpPTA7IGk8ODA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChpPDIwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMSwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMF0pOworCisgICAgICAgIGVsc2UgaWYgKGk+PTIwICYmIGk8NDApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YyLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsxXSk7CisKKwkJZWxzZSBpZiAoaT49NDAgJiYgaTw2MCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjMsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgIFdbaV0sIFNIQTFUYWJsZVsyXSk7CisKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbM10pOworCisKKyAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorCQlUZW1wICAgPSBSZWdbNF07CisgICAgICAgIFJlZ1s0XSA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKworICAgIH0gLy8gZW5kIG9mIGZvci1sb29wCisKKworICAgIC8vICh0ZW1wb3Jhcnkpb3V0cHV0CisgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICBCdWZbaV0gKz0gUmVnW2ldOworCit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogZm9yd2FyZCBTLWJveCAqLworc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9Cit7CisJMHg2MywgMHg3QywJMHg3NywgMHg3QiwJMHhGMiwgMHg2QiwJMHg2RiwgMHhDNSwKKwkweDMwLCAweDAxLAkweDY3LCAweDJCLAkweEZFLCAweEQ3LAkweEFCLCAweDc2LAorCTB4Q0EsIDB4ODIsCTB4QzksIDB4N0QsCTB4RkEsIDB4NTksCTB4NDcsIDB4RjAsCisJMHhBRCwgMHhENCwJMHhBMiwgMHhBRiwJMHg5QywgMHhBNCwJMHg3MiwgMHhDMCwKKwkweEI3LCAweEZELAkweDkzLCAweDI2LAkweDM2LCAweDNGLAkweEY3LCAweENDLAorCTB4MzQsIDB4QTUsCTB4RTUsIDB4RjEsCTB4NzEsIDB4RDgsCTB4MzEsIDB4MTUsCisJMHgwNCwgMHhDNywJMHgyMywgMHhDMywJMHgxOCwgMHg5NiwJMHgwNSwgMHg5QSwKKwkweDA3LCAweDEyLAkweDgwLCAweEUyLAkweEVCLCAweDI3LAkweEIyLCAweDc1LAorCTB4MDksIDB4ODMsCTB4MkMsIDB4MUEsCTB4MUIsIDB4NkUsCTB4NUEsIDB4QTAsCisJMHg1MiwgMHgzQiwJMHhENiwgMHhCMywJMHgyOSwgMHhFMywJMHgyRiwgMHg4NCwKKwkweDUzLCAweEQxLAkweDAwLCAweEVELAkweDIwLCAweEZDLAkweEIxLCAweDVCLAorCTB4NkEsIDB4Q0IsCTB4QkUsIDB4MzksCTB4NEEsIDB4NEMsCTB4NTgsIDB4Q0YsCisJMHhEMCwgMHhFRiwJMHhBQSwgMHhGQiwJMHg0MywgMHg0RCwJMHgzMywgMHg4NSwKKwkweDQ1LCAweEY5LAkweDAyLCAweDdGLAkweDUwLCAweDNDLAkweDlGLCAweEE4LAorCTB4NTEsIDB4QTMsCTB4NDAsIDB4OEYsCTB4OTIsIDB4OUQsCTB4MzgsIDB4RjUsCisJMHhCQywgMHhCNiwJMHhEQSwgMHgyMSwJMHgxMCwgMHhGRiwJMHhGMywgMHhEMiwKKwkweENELCAweDBDLAkweDEzLCAweEVDLAkweDVGLCAweDk3LAkweDQ0LCAweDE3LAorCTB4QzQsIDB4QTcsCTB4N0UsIDB4M0QsCTB4NjQsIDB4NUQsCTB4MTksIDB4NzMsCisJMHg2MCwgMHg4MSwJMHg0RiwgMHhEQywJMHgyMiwgMHgyQSwJMHg5MCwgMHg4OCwKKwkweDQ2LCAweEVFLAkweEI4LCAweDE0LAkweERFLCAweDVFLAkweDBCLCAweERCLAorCTB4RTAsIDB4MzIsCTB4M0EsIDB4MEEsCTB4NDksIDB4MDYsCTB4MjQsIDB4NUMsCisJMHhDMiwgMHhEMywJMHhBQywgMHg2MiwJMHg5MSwgMHg5NSwJMHhFNCwgMHg3OSwKKwkweEU3LCAweEM4LAkweDM3LCAweDZELAkweDhELCAweEQ1LAkweDRFLCAweEE5LAorCTB4NkMsIDB4NTYsCTB4RjQsIDB4RUEsCTB4NjUsIDB4N0EsCTB4QUUsIDB4MDgsCisJMHhCQSwgMHg3OCwJMHgyNSwgMHgyRSwJMHgxQywgMHhBNiwJMHhCNCwgMHhDNiwKKwkweEU4LCAweERELAkweDc0LCAweDFGLAkweDRCLCAweEJELAkweDhCLCAweDhBLAorCTB4NzAsIDB4M0UsCTB4QjUsIDB4NjYsCTB4NDgsIDB4MDMsCTB4RjYsIDB4MEUsCisJMHg2MSwgMHgzNSwJMHg1NywgMHhCOSwJMHg4NiwgMHhDMSwJMHgxRCwgMHg5RSwKKwkweEUxLCAweEY4LAkweDk4LCAweDExLAkweDY5LCAweEQ5LAkweDhFLCAweDk0LAorCTB4OUIsIDB4MUUsCTB4ODcsIDB4RTksCTB4Q0UsIDB4NTUsCTB4MjgsIDB4REYsCisJMHg4QywgMHhBMSwJMHg4OSwgMHgwRCwJMHhCRiwgMHhFNiwJMHg0MiwgMHg2OCwKKwkweDQxLCAweDk5LAkweDJELCAweDBGLAkweEIwLCAweDU0LAkweEJCLCAweDE2Cit9OworCisvKiBmb3J3YXJkIHRhYmxlICovCisjZGVmaW5lCUZUIFwKK1wKKwlWKEM2LDYzLDYzLEE1KSwJVihGOCw3Qyw3Qyw4NCksCVYoRUUsNzcsNzcsOTkpLAlWKEY2LDdCLDdCLDhEKSwJXAorCVYoRkYsRjIsRjIsMEQpLAlWKEQ2LDZCLDZCLEJEKSwJVihERSw2Riw2RixCMSksCVYoOTEsQzUsQzUsNTQpLAlcCisJVig2MCwzMCwzMCw1MCksCVYoMDIsMDEsMDEsMDMpLAlWKENFLDY3LDY3LEE5KSwJVig1NiwyQiwyQiw3RCksCVwKKwlWKEU3LEZFLEZFLDE5KSwJVihCNSxENyxENyw2MiksCVYoNEQsQUIsQUIsRTYpLAlWKEVDLDc2LDc2LDlBKSwJXAorCVYoOEYsQ0EsQ0EsNDUpLAlWKDFGLDgyLDgyLDlEKSwJVig4OSxDOSxDOSw0MCksCVYoRkEsN0QsN0QsODcpLAlcCisJVihFRixGQSxGQSwxNSksCVYoQjIsNTksNTksRUIpLAlWKDhFLDQ3LDQ3LEM5KSwJVihGQixGMCxGMCwwQiksCVwKKwlWKDQxLEFELEFELEVDKSwJVihCMyxENCxENCw2NyksCVYoNUYsQTIsQTIsRkQpLAlWKDQ1LEFGLEFGLEVBKSwJXAorCVYoMjMsOUMsOUMsQkYpLAlWKDUzLEE0LEE0LEY3KSwJVihFNCw3Miw3Miw5NiksCVYoOUIsQzAsQzAsNUIpLAlcCisJVig3NSxCNyxCNyxDMiksCVYoRTEsRkQsRkQsMUMpLAlWKDNELDkzLDkzLEFFKSwJVig0QywyNiwyNiw2QSksCVwKKwlWKDZDLDM2LDM2LDVBKSwJVig3RSwzRiwzRiw0MSksCVYoRjUsRjcsRjcsMDIpLAlWKDgzLENDLENDLDRGKSwJXAorCVYoNjgsMzQsMzQsNUMpLAlWKDUxLEE1LEE1LEY0KSwJVihEMSxFNSxFNSwzNCksCVYoRjksRjEsRjEsMDgpLAlcCisJVihFMiw3MSw3MSw5MyksCVYoQUIsRDgsRDgsNzMpLAlWKDYyLDMxLDMxLDUzKSwJVigyQSwxNSwxNSwzRiksCVwKKwlWKDA4LDA0LDA0LDBDKSwJVig5NSxDNyxDNyw1MiksCVYoNDYsMjMsMjMsNjUpLAlWKDlELEMzLEMzLDVFKSwJXAorCVYoMzAsMTgsMTgsMjgpLAlWKDM3LDk2LDk2LEExKSwJVigwQSwwNSwwNSwwRiksCVYoMkYsOUEsOUEsQjUpLAlcCisJVigwRSwwNywwNywwOSksCVYoMjQsMTIsMTIsMzYpLAlWKDFCLDgwLDgwLDlCKSwJVihERixFMixFMiwzRCksCVwKKwlWKENELEVCLEVCLDI2KSwJVig0RSwyNywyNyw2OSksCVYoN0YsQjIsQjIsQ0QpLAlWKEVBLDc1LDc1LDlGKSwJXAorCVYoMTIsMDksMDksMUIpLAlWKDFELDgzLDgzLDlFKSwJVig1OCwyQywyQyw3NCksCVYoMzQsMUEsMUEsMkUpLAlcCisJVigzNiwxQiwxQiwyRCksCVYoREMsNkUsNkUsQjIpLAlWKEI0LDVBLDVBLEVFKSwJVig1QixBMCxBMCxGQiksCVwKKwlWKEE0LDUyLDUyLEY2KSwJVig3NiwzQiwzQiw0RCksCVYoQjcsRDYsRDYsNjEpLAlWKDdELEIzLEIzLENFKSwJXAorCVYoNTIsMjksMjksN0IpLAlWKERELEUzLEUzLDNFKSwJVig1RSwyRiwyRiw3MSksCVYoMTMsODQsODQsOTcpLAlcCisJVihBNiw1Myw1MyxGNSksCVYoQjksRDEsRDEsNjgpLAlWKDAwLDAwLDAwLDAwKSwJVihDMSxFRCxFRCwyQyksCVwKKwlWKDQwLDIwLDIwLDYwKSwJVihFMyxGQyxGQywxRiksCVYoNzksQjEsQjEsQzgpLAlWKEI2LDVCLDVCLEVEKSwJXAorCVYoRDQsNkEsNkEsQkUpLAlWKDhELENCLENCLDQ2KSwJVig2NyxCRSxCRSxEOSksCVYoNzIsMzksMzksNEIpLAlcCisJVig5NCw0QSw0QSxERSksCVYoOTgsNEMsNEMsRDQpLAlWKEIwLDU4LDU4LEU4KSwJVig4NSxDRixDRiw0QSksCVwKKwlWKEJCLEQwLEQwLDZCKSwJVihDNSxFRixFRiwyQSksCVYoNEYsQUEsQUEsRTUpLAlWKEVELEZCLEZCLDE2KSwJXAorCVYoODYsNDMsNDMsQzUpLAlWKDlBLDRELDRELEQ3KSwJVig2NiwzMywzMyw1NSksCVYoMTEsODUsODUsOTQpLAlcCisJVig4QSw0NSw0NSxDRiksCVYoRTksRjksRjksMTApLAlWKDA0LDAyLDAyLDA2KSwJVihGRSw3Riw3Riw4MSksCVwKKwlWKEEwLDUwLDUwLEYwKSwJVig3OCwzQywzQyw0NCksCVYoMjUsOUYsOUYsQkEpLAlWKDRCLEE4LEE4LEUzKSwJXAorCVYoQTIsNTEsNTEsRjMpLAlWKDVELEEzLEEzLEZFKSwJVig4MCw0MCw0MCxDMCksCVYoMDUsOEYsOEYsOEEpLAlcCisJVigzRiw5Miw5MixBRCksCVYoMjEsOUQsOUQsQkMpLAlWKDcwLDM4LDM4LDQ4KSwJVihGMSxGNSxGNSwwNCksCVwKKwlWKDYzLEJDLEJDLERGKSwJVig3NyxCNixCNixDMSksCVYoQUYsREEsREEsNzUpLAlWKDQyLDIxLDIxLDYzKSwJXAorCVYoMjAsMTAsMTAsMzApLAlWKEU1LEZGLEZGLDFBKSwJVihGRCxGMyxGMywwRSksCVYoQkYsRDIsRDIsNkQpLAlcCisJVig4MSxDRCxDRCw0QyksCVYoMTgsMEMsMEMsMTQpLAlWKDI2LDEzLDEzLDM1KSwJVihDMyxFQyxFQywyRiksCVwKKwlWKEJFLDVGLDVGLEUxKSwJVigzNSw5Nyw5NyxBMiksCVYoODgsNDQsNDQsQ0MpLAlWKDJFLDE3LDE3LDM5KSwJXAorCVYoOTMsQzQsQzQsNTcpLAlWKDU1LEE3LEE3LEYyKSwJVihGQyw3RSw3RSw4MiksCVYoN0EsM0QsM0QsNDcpLAlcCisJVihDOCw2NCw2NCxBQyksCVYoQkEsNUQsNUQsRTcpLAlWKDMyLDE5LDE5LDJCKSwJVihFNiw3Myw3Myw5NSksCVwKKwlWKEMwLDYwLDYwLEEwKSwJVigxOSw4MSw4MSw5OCksCVYoOUUsNEYsNEYsRDEpLAlWKEEzLERDLERDLDdGKSwJXAorCVYoNDQsMjIsMjIsNjYpLAlWKDU0LDJBLDJBLDdFKSwJVigzQiw5MCw5MCxBQiksCVYoMEIsODgsODgsODMpLAlcCisJVig4Qyw0Niw0NixDQSksCVYoQzcsRUUsRUUsMjkpLAlWKDZCLEI4LEI4LEQzKSwJVigyOCwxNCwxNCwzQyksCVwKKwlWKEE3LERFLERFLDc5KSwJVihCQyw1RSw1RSxFMiksCVYoMTYsMEIsMEIsMUQpLAlWKEFELERCLERCLDc2KSwJXAorCVYoREIsRTAsRTAsM0IpLAlWKDY0LDMyLDMyLDU2KSwJVig3NCwzQSwzQSw0RSksCVYoMTQsMEEsMEEsMUUpLAlcCisJVig5Miw0OSw0OSxEQiksCVYoMEMsMDYsMDYsMEEpLAlWKDQ4LDI0LDI0LDZDKSwJVihCOCw1Qyw1QyxFNCksCVwKKwlWKDlGLEMyLEMyLDVEKSwJVihCRCxEMyxEMyw2RSksCVYoNDMsQUMsQUMsRUYpLAlWKEM0LDYyLDYyLEE2KSwJXAorCVYoMzksOTEsOTEsQTgpLAlWKDMxLDk1LDk1LEE0KSwJVihEMyxFNCxFNCwzNyksCVYoRjIsNzksNzksOEIpLAlcCisJVihENSxFNyxFNywzMiksCVYoOEIsQzgsQzgsNDMpLAlWKDZFLDM3LDM3LDU5KSwJVihEQSw2RCw2RCxCNyksCVwKKwlWKDAxLDhELDhELDhDKSwJVihCMSxENSxENSw2NCksCVYoOUMsNEUsNEUsRDIpLAlWKDQ5LEE5LEE5LEUwKSwJXAorCVYoRDgsNkMsNkMsQjQpLAlWKEFDLDU2LDU2LEZBKSwJVihGMyxGNCxGNCwwNyksCVYoQ0YsRUEsRUEsMjUpLAlcCisJVihDQSw2NSw2NSxBRiksCVYoRjQsN0EsN0EsOEUpLAlWKDQ3LEFFLEFFLEU5KSwJVigxMCwwOCwwOCwxOCksCVwKKwlWKDZGLEJBLEJBLEQ1KSwJVihGMCw3OCw3OCw4OCksCVYoNEEsMjUsMjUsNkYpLAlWKDVDLDJFLDJFLDcyKSwJXAorCVYoMzgsMUMsMUMsMjQpLAlWKDU3LEE2LEE2LEYxKSwJVig3MyxCNCxCNCxDNyksCVYoOTcsQzYsQzYsNTEpLAlcCisJVihDQixFOCxFOCwyMyksCVYoQTEsREQsREQsN0MpLAlWKEU4LDc0LDc0LDlDKSwJVigzRSwxRiwxRiwyMSksCVwKKwlWKDk2LDRCLDRCLEREKSwJVig2MSxCRCxCRCxEQyksCVYoMEQsOEIsOEIsODYpLAlWKDBGLDhBLDhBLDg1KSwJXAorCVYoRTAsNzAsNzAsOTApLAlWKDdDLDNFLDNFLDQyKSwJVig3MSxCNSxCNSxDNCksCVYoQ0MsNjYsNjYsQUEpLAlcCisJVig5MCw0OCw0OCxEOCksCVYoMDYsMDMsMDMsMDUpLAlWKEY3LEY2LEY2LDAxKSwJVigxQywwRSwwRSwxMiksCVwKKwlWKEMyLDYxLDYxLEEzKSwJVig2QSwzNSwzNSw1RiksCVYoQUUsNTcsNTcsRjkpLAlWKDY5LEI5LEI5LEQwKSwJXAorCVYoMTcsODYsODYsOTEpLAlWKDk5LEMxLEMxLDU4KSwJVigzQSwxRCwxRCwyNyksCVYoMjcsOUUsOUUsQjkpLAlcCisJVihEOSxFMSxFMSwzOCksCVYoRUIsRjgsRjgsMTMpLAlWKDJCLDk4LDk4LEIzKSwJVigyMiwxMSwxMSwzMyksCVwKKwlWKEQyLDY5LDY5LEJCKSwJVihBOSxEOSxEOSw3MCksCVYoMDcsOEUsOEUsODkpLAlWKDMzLDk0LDk0LEE3KSwJXAorCVYoMkQsOUIsOUIsQjYpLAlWKDNDLDFFLDFFLDIyKSwJVigxNSw4Nyw4Nyw5MiksCVYoQzksRTksRTksMjApLAlcCisJVig4NyxDRSxDRSw0OSksCVYoQUEsNTUsNTUsRkYpLAlWKDUwLDI4LDI4LDc4KSwJVihBNSxERixERiw3QSksCVwKKwlWKDAzLDhDLDhDLDhGKSwJVig1OSxBMSxBMSxGOCksCVYoMDksODksODksODApLAlWKDFBLDBELDBELDE3KSwJXAorCVYoNjUsQkYsQkYsREEpLAlWKEQ3LEU2LEU2LDMxKSwJVig4NCw0Miw0MixDNiksCVYoRDAsNjgsNjgsQjgpLAlcCisJVig4Miw0MSw0MSxDMyksCVYoMjksOTksOTksQjApLAlWKDVBLDJELDJELDc3KSwJVigxRSwwRiwwRiwxMSksCVwKKwlWKDdCLEIwLEIwLENCKSwJVihBOCw1NCw1NCxGQyksCVYoNkQsQkIsQkIsRDYpLAlWKDJDLDE2LDE2LDNBKQorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyB1aW50MzIgRlQwWzI1Nl0gPSB7IEZUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgRlQxWzI1Nl0gPSB7IEZUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07CisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKK3N0YXRpYyB1aW50MzIgRlQzWzI1Nl0gPSB7IEZUIH07CisjdW5kZWYgVgorCisjdW5kZWYgRlQKKworLyogcmV2ZXJzZSBTLWJveCAqLworCitzdGF0aWMgdWludDMyIFJTYlsyNTZdID0KK3sKKwkweDUyLCAweDA5LAkweDZBLCAweEQ1LAkweDMwLCAweDM2LAkweEE1LCAweDM4LAorCTB4QkYsIDB4NDAsCTB4QTMsIDB4OUUsCTB4ODEsIDB4RjMsCTB4RDcsIDB4RkIsCisJMHg3QywgMHhFMywJMHgzOSwgMHg4MiwJMHg5QiwgMHgyRiwJMHhGRiwgMHg4NywKKwkweDM0LCAweDhFLAkweDQzLCAweDQ0LAkweEM0LCAweERFLAkweEU5LCAweENCLAorCTB4NTQsIDB4N0IsCTB4OTQsIDB4MzIsCTB4QTYsIDB4QzIsCTB4MjMsIDB4M0QsCisJMHhFRSwgMHg0QywJMHg5NSwgMHgwQiwJMHg0MiwgMHhGQSwJMHhDMywgMHg0RSwKKwkweDA4LCAweDJFLAkweEExLCAweDY2LAkweDI4LCAweEQ5LAkweDI0LCAweEIyLAorCTB4NzYsIDB4NUIsCTB4QTIsIDB4NDksCTB4NkQsIDB4OEIsCTB4RDEsIDB4MjUsCisJMHg3MiwgMHhGOCwJMHhGNiwgMHg2NCwJMHg4NiwgMHg2OCwJMHg5OCwgMHgxNiwKKwkweEQ0LCAweEE0LAkweDVDLCAweENDLAkweDVELCAweDY1LAkweEI2LCAweDkyLAorCTB4NkMsIDB4NzAsCTB4NDgsIDB4NTAsCTB4RkQsIDB4RUQsCTB4QjksIDB4REEsCisJMHg1RSwgMHgxNSwJMHg0NiwgMHg1NywJMHhBNywgMHg4RCwJMHg5RCwgMHg4NCwKKwkweDkwLCAweEQ4LAkweEFCLCAweDAwLAkweDhDLCAweEJDLAkweEQzLCAweDBBLAorCTB4RjcsIDB4RTQsCTB4NTgsIDB4MDUsCTB4QjgsIDB4QjMsCTB4NDUsIDB4MDYsCisJMHhEMCwgMHgyQywJMHgxRSwgMHg4RiwJMHhDQSwgMHgzRiwJMHgwRiwgMHgwMiwKKwkweEMxLCAweEFGLAkweEJELCAweDAzLAkweDAxLCAweDEzLAkweDhBLCAweDZCLAorCTB4M0EsIDB4OTEsCTB4MTEsIDB4NDEsCTB4NEYsIDB4NjcsCTB4REMsIDB4RUEsCisJMHg5NywgMHhGMiwJMHhDRiwgMHhDRSwJMHhGMCwgMHhCNCwJMHhFNiwgMHg3MywKKwkweDk2LCAweEFDLAkweDc0LCAweDIyLAkweEU3LCAweEFELAkweDM1LCAweDg1LAorCTB4RTIsIDB4RjksCTB4MzcsIDB4RTgsCTB4MUMsIDB4NzUsCTB4REYsIDB4NkUsCisJMHg0NywgMHhGMSwJMHgxQSwgMHg3MSwJMHgxRCwgMHgyOSwJMHhDNSwgMHg4OSwKKwkweDZGLCAweEI3LAkweDYyLCAweDBFLAkweEFBLCAweDE4LAkweEJFLCAweDFCLAorCTB4RkMsIDB4NTYsCTB4M0UsIDB4NEIsCTB4QzYsIDB4RDIsCTB4NzksIDB4MjAsCisJMHg5QSwgMHhEQiwJMHhDMCwgMHhGRSwJMHg3OCwgMHhDRCwJMHg1QSwgMHhGNCwKKwkweDFGLCAweERELAkweEE4LCAweDMzLAkweDg4LCAweDA3LAkweEM3LCAweDMxLAorCTB4QjEsIDB4MTIsCTB4MTAsIDB4NTksCTB4MjcsIDB4ODAsCTB4RUMsIDB4NUYsCisJMHg2MCwgMHg1MSwJMHg3RiwgMHhBOSwJMHgxOSwgMHhCNSwJMHg0QSwgMHgwRCwKKwkweDJELCAweEU1LAkweDdBLCAweDlGLAkweDkzLCAweEM5LAkweDlDLCAweEVGLAorCTB4QTAsIDB4RTAsCTB4M0IsIDB4NEQsCTB4QUUsIDB4MkEsCTB4RjUsIDB4QjAsCisJMHhDOCwgMHhFQiwJMHhCQiwgMHgzQywJMHg4MywgMHg1MywJMHg5OSwgMHg2MSwKKwkweDE3LCAweDJCLAkweDA0LCAweDdFLAkweEJBLCAweDc3LAkweEQ2LCAweDI2LAorCTB4RTEsIDB4NjksCTB4MTQsIDB4NjMsCTB4NTUsIDB4MjEsCTB4MEMsIDB4N0QKK307CisKKy8qIHJldmVyc2UgdGFibGUgKi8KKworI2RlZmluZQlSVCBcCitcCisJVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKKwlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAorCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCisJVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKKwlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAorCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCisJVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKKwlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAorCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCisJVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKKwlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAorCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCisJVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKKwlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAorCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCisJVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKKwlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAorCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCisJVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKKwlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAorCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCisJVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKKwlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAorCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCisJVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKKwlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAorCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCisJVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKKwlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAorCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCisJVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKKwlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAorCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCisJVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKKwlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAorCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCisJVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKKwlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAorCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCisJVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKKwlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAorCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCisJVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKKwlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAorCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCisJVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKKwlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAorCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCisJVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKKwlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAorCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCisJVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKKwlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAorCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCisJVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKKwlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAorCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCisJVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKKwlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAorCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCisJVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKKwlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAorCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCisJVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIFJUMVsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI3VuZGVmIFJUCisKKy8qIHJvdW5kIGNvbnN0YW50cyAqLworCitzdGF0aWMgdWludDMyIFJDT05bMTBdID0KK3sKKwkweDAxMDAwMDAwLAkweDAyMDAwMDAwLAkweDA0MDAwMDAwLAkweDA4MDAwMDAwLAorCTB4MTAwMDAwMDAsCTB4MjAwMDAwMDAsCTB4NDAwMDAwMDAsCTB4ODAwMDAwMDAsCisJMHgxQjAwMDAwMCwJMHgzNjAwMDAwMAorfTsKKworLyoga2V5IHNjaGVkdWxlCXRhYmxlcyAqLworCitzdGF0aWMgaW50IEtUX2luaXQgPSAxOworCitzdGF0aWMgdWludDMyIEtUMFsyNTZdOworc3RhdGljIHVpbnQzMiBLVDFbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QyWzI1Nl07CitzdGF0aWMgdWludDMyIEtUM1syNTZdOworCisvKiBwbGF0Zm9ybS1pbmRlcGVuZGFudAkzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24JbWFjcm9zICovCisKKyNkZWZpbmUJR0VUX1VJTlQzMihuLGIsaSkJCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCShuKQk9ICgJKHVpbnQzMikgKGIpWyhpKQldIDw8IDI0CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNgkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMl0gPDwgIDgJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDNdCQkpOwkJXAorfQorCisjZGVmaW5lCVBVVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkoYilbKGkpCSAgIF0gPSAodWludDgpICggKG4pID4+CTI0ICk7CQlcCisJKGIpWyhpKQkrIDFdID0gKHVpbnQ4KSAoIChuKSA+PgkxNiApOwkJXAorCShiKVsoaSkJKyAyXSA9ICh1aW50OCkgKCAobikgPj4JIDggKTsJCVwKKwkoYilbKGkpCSsgM10gPSAodWludDgpICggKG4pCSAgICk7CQlcCit9CisKKy8qIEFFUyBrZXkgc2NoZWR1bGluZyByb3V0aW5lICovCisKK2ludAlydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqa2V5LCBpbnQgbmJpdHMgKQoreworCWludAlpOworCXVpbnQzMiAqUkssCSpTSzsKKworCXN3aXRjaCgJbmJpdHMgKQorCXsKKwkJY2FzZSAxMjg6IGN0eC0+bnIgPQkxMDsJYnJlYWs7CisJCWNhc2UgMTkyOiBjdHgtPm5yID0JMTI7CWJyZWFrOworCQljYXNlIDI1NjogY3R4LT5uciA9CTE0OwlicmVhazsKKwkJZGVmYXVsdAk6IHJldHVybiggMQkpOworCX0KKworCVJLID0gY3R4LT5lcms7CisKKwlmb3IoIGkgPSAwOwlpIDwJKG5iaXRzID4+IDUpOyBpKysgKQorCXsKKwkJR0VUX1VJTlQzMigJUktbaV0sIGtleSwJaSAqCTQgKTsKKwl9CisKKwkvKiBzZXR1cCBlbmNyeXB0aW9uCXJvdW5kIGtleXMgKi8KKworCXN3aXRjaCgJbmJpdHMgKQorCXsKKwljYXNlIDEyODoKKworCQlmb3IoIGkgPSAwOwlpIDwJMTA7CWkrKywgUksJKz0gNCApCisJCXsKKwkJCVJLWzRdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzVdICA9IFJLWzFdIF4gUktbNF07CisJCQlSS1s2XSAgPSBSS1syXSBeIFJLWzVdOworCQkJUktbN10gID0gUktbM10gXiBSS1s2XTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMTkyOgorCisJCWZvciggaSA9IDA7CWkgPAk4OyBpKyssCVJLICs9IDYJKQorCQl7CisJCQlSS1s2XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s3XSAgPSBSS1sxXSBeIFJLWzZdOworCQkJUktbOF0gID0gUktbMl0gXiBSS1s3XTsKKwkJCVJLWzldICA9IFJLWzNdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1s0XSBeIFJLWzldOworCQkJUktbMTFdID0gUktbNV0gXiBSS1sxMF07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI1NjoKKworCQlmb3IoIGkgPSAwOwlpIDwJNzsgaSsrLAlSSyArPSA4CSkKKwkJeworCQkJUktbOF0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbOV0gID0gUktbMV0gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzJdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKKworCQkJUktbMTJdID0gUktbNF0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMjQgKQldIDw8IDI0CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4gMTYgKQldIDw8IDE2CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JPj4JOCApCV0gPDwgIDgJKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQkJICApCV0JCSk7CisKKwkJCVJLWzEzXSA9IFJLWzVdIF4gUktbMTJdOworCQkJUktbMTRdID0gUktbNl0gXiBSS1sxM107CisJCQlSS1sxNV0gPSBSS1s3XSBeIFJLWzE0XTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBzZXR1cCBkZWNyeXB0aW9uCXJvdW5kIGtleXMgKi8KKworCWlmKAlLVF9pbml0CSkKKwl7CisJCWZvciggaSA9IDA7CWkgPAkyNTY7IGkrKyApCisJCXsKKwkJCUtUMFtpXSA9IFJUMFsgRlNiW2ldIF07CisJCQlLVDFbaV0gPSBSVDFbIEZTYltpXSBdOworCQkJS1QyW2ldID0gUlQyWyBGU2JbaV0gXTsKKwkJCUtUM1tpXSA9IFJUM1sgRlNiW2ldIF07CisJCX0KKworCQlLVF9pbml0CT0gMDsKKwl9CisKKwlTSyA9IGN0eC0+ZHJrOworCisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKworCWZvciggaSA9IDE7CWkgPAljdHgtPm5yOyBpKysgKQorCXsKKwkJUksgLT0gODsKKworCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKKworCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKKworCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKKworCQkqU0srKyA9CUtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorCQkJCUtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorCQkJCUtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorCQkJCUtUM1sgKHVpbnQ4KSAoICpSSwkJICkgXTsgUksrKzsKKwl9CisKKwlSSyAtPSA4OworCisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKworCXJldHVybigJMCApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBlbmNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19lbmNyeXB0KGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4IGlucHV0WzE2XSwJdWludDggb3V0cHV0WzE2XSApCit7CisJdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOworCisJUksgPSBjdHgtPmVyazsKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19GUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBGVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBGVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBGVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBGVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIEZUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgRlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBGVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorfQorCisJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX0ZST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfRlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggRlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTMJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBGU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggRlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qIEFFUyAxMjgtYml0IGJsb2NrIGRlY3J5cHRpb24Jcm91dGluZQkqLworCit2b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApCit7CisJdWludDMyICpSSywJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzOworCisJUksgPSBjdHgtPmRyazsKKworCUdFVF9VSU5UMzIoCVgwLAlpbnB1dCwJMCApOyBYMAlePSBSS1swXTsKKwlHRVRfVUlOVDMyKAlYMSwJaW5wdXQsCTQgKTsgWDEJXj0gUktbMV07CisJR0VUX1VJTlQzMigJWDIsCWlucHV0LAk4ICk7IFgyCV49IFJLWzJdOworCUdFVF9VSU5UMzIoCVgzLAlpbnB1dCwgMTIgKTsgWDMJXj0gUktbM107CisKKyNkZWZpbmUJQUVTX1JST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKK3sJCQkJCQkJCQkJCQlcCisJUksgKz0gNDsJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJWDAgPSBSS1swXSBeIFJUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKKwkJCQkgUlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAorCQkJCSBSVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCisJCQkJIFJUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDEgPSBSS1sxXSBeIFJUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKKwkJCQkgUlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAorCQkJCSBSVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCisJCQkJIFJUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDIgPSBSS1syXSBeIFJUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKKwkJCQkgUlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAorCQkJCSBSVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCisJCQkJIFJUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDMgPSBSS1szXSBeIFJUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKKwkJCQkgUlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAorCQkJCSBSVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCisJCQkJIFJUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCit9CisKKwlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDEgKi8KKwlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDIgKi8KKwlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDMgKi8KKwlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDQgKi8KKwlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDUgKi8KKwlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDYgKi8KKwlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDcgKi8KKwlBRVNfUlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJCS8qIHJvdW5kIDggKi8KKwlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJCS8qIHJvdW5kIDkgKi8KKworCWlmKAljdHgtPm5yCT4gMTAgKQorCXsKKwkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEwCSovCisJCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMQkqLworCX0KKworCWlmKAljdHgtPm5yCT4gMTIgKQorCXsKKwkJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CS8qIHJvdW5kIDEyCSovCisJCUFFU19SUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkvKiByb3VuZCAxMwkqLworCX0KKworCS8qIGxhc3QJcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMQkgICApIF0JCSApOworCisJWDEgPSBSS1sxXSBeICggUlNiWwkodWludDgpCSggWTEgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTIJICAgKSBdCQkgKTsKKworCVgyID0gUktbMl0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMyA9IFJLWzNdIF4gKCBSU2JbCSh1aW50OCkJKCBZMyA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJUFVUX1VJTlQzMigJWDAsCW91dHB1dCwJIDAgKTsKKwlQVVRfVUlOVDMyKAlYMSwJb3V0cHV0LAkgNCApOworCVBVVF9VSU5UMzIoCVgyLAlvdXRwdXQsCSA4ICk7CisJUFVUX1VJTlQzMigJWDMsCW91dHB1dCwJMTIgKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNIQTEgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUhNQUNfU0hBMSgKKwlJTglVQ0hBUgkqdGV4dCwKKwlJTglVSU5UCXRleHRfbGVuLAorCUlOCVVDSEFSCSprZXksCisJSU4JVUlOVAlrZXlfbGVuLAorCUlOCVVDSEFSCSpkaWdlc3QpCit7CisJU0hBX0NUWAljb250ZXh0OworCVVDSEFSCWtfaXBhZFs2NV07IC8qIGlubmVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIGlwYWQJKi8KKwlVQ0hBUglrX29wYWRbNjVdOyAvKiBvdXRlciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBvcGFkCSovCisJSU5UCQlpOworCisJLy8gaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleT1TSEExKGtleSkKKwlpZiAoa2V5X2xlbgk+IDY0KQorCXsKKwkJU0hBX0NUWAkJIHRjdHg7CisJCVNIQUluaXQoJnRjdHgpOworCQlTSEFVcGRhdGUoJnRjdHgsIGtleSwga2V5X2xlbik7CisJCVNIQUZpbmFsKCZ0Y3R4LAlrZXkpOworCQlrZXlfbGVuCT0gMjA7CisJfQorCU5kaXNaZXJvTWVtb3J5KGtfaXBhZCwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNaZXJvTWVtb3J5KGtfb3BhZCwgc2l6ZW9mKGtfb3BhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvLyBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMKKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykKKwl7CisJCWtfaXBhZFtpXSBePSAweDM2OworCQlrX29wYWRbaV0gXj0gMHg1YzsKKwl9CisKKwkvLyBwZXJmb3JtIGlubmVyIFNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsgCQkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAxc3QgcGFzcyAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJa19pcGFkLAk2NCk7CQkvKglzdGFydCB3aXRoIGlubmVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJdGV4dCwgdGV4dF9sZW4pOwkvKgl0aGVuIHRleHQgb2YgZGF0YWdyYW0gKi8KKwlTSEFGaW5hbCgmY29udGV4dCwgZGlnZXN0KTsJCQkJLyogZmluaXNoIHVwIDFzdCBwYXNzICovCisKKwkvL3BlcmZvcm0gb3V0ZXIJU0hBMQorCVNIQUluaXQoJmNvbnRleHQpOwkJCQkJLyogaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CS8qCXN0YXJ0IHdpdGggb3V0ZXIgcGFkICovCisJU0hBVXBkYXRlKCZjb250ZXh0LAlkaWdlc3QsCTIwKTsJLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJLyogZmluaXNoIHVwIDJuZCBwYXNzICovCisKK30KKworLyoKKyogRihQLCBTLCBjLCBpKSA9IFUxIHhvciBVMiB4b3IgLi4uIFVjCisqIFUxID0gUFJGKFAsIFMgfHwgSW50KGkpKQorKiBVMiA9IFBSRihQLCBVMSkKKyogVWMgPSBQUkYoUCwgVWMtMSkKKyovCisKK3ZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFszNl0sIGRpZ2VzdDFbU0hBX0RJR0VTVF9MRU5dOworICAgIGludCBpLCBqOworCisgICAgLyogVTEgPSBQUkYoUCwgUyB8fCBpbnQoaSkpICovCisgICAgbWVtY3B5KGRpZ2VzdCwgc3NpZCwgc3NpZGxlbmd0aCk7CisgICAgZGlnZXN0W3NzaWRsZW5ndGhdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MjQpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMV0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4xNikgJiAweGZmKTsKKyAgICBkaWdlc3Rbc3NpZGxlbmd0aCsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjgpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrM10gPSAodW5zaWduZWQgY2hhcikoY291bnQgJiAweGZmKTsKKyAgICBITUFDX1NIQTEoZGlnZXN0LCBzc2lkbGVuZ3RoKzQsICh1bnNpZ25lZCBjaGFyKikgcGFzc3dvcmQsIChpbnQpIHN0cmxlbihwYXNzd29yZCksIGRpZ2VzdDEpOyAvLyBmb3IgV1BBIHVwZGF0ZQorCisgICAgLyogb3V0cHV0ID0gVTEgKi8KKyAgICBtZW1jcHkob3V0cHV0LCBkaWdlc3QxLCBTSEFfRElHRVNUX0xFTik7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKQorICAgIHsKKyAgICAgICAgLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KKyAgICAgICAgSE1BQ19TSEExKGRpZ2VzdDEsIFNIQV9ESUdFU1RfTEVOLCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QpOyAvLyBmb3IgV1BBIHVwZGF0ZQorICAgICAgICBtZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEFfRElHRVNUX0xFTik7CisKKyAgICAgICAgLyogb3V0cHV0ID0gb3V0cHV0IHhvciBVbiAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgU0hBX0RJR0VTVF9MRU47IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0W2pdIF49IGRpZ2VzdFtqXTsKKyAgICAgICAgfQorICAgIH0KK30KKy8qCisqIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCisqIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCisqIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKKyogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKKyovCitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KQoreworICAgIGlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOworICAgIEYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBX0RJR0VTVF9MRU5dKTsKKyAgICByZXR1cm4gMTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tbG1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4MmNlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21sbWUuYwpAQCAtMCwwICsxLDg2MDkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbWxtZS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDA0LTA4LTI1CQlNb2RpZnkgZnJvbSBSVDI1MDAgY29kZSBiYXNlCisJSm9obiBDaGFuZwkyMDA0LTA5LTA2CQltb2RpZmllZCBmb3IgUlQyNjAwCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK1VDSEFSCUNJU0NPX09VSVtdID0gezB4MDAsIDB4NDAsIDB4OTZ9OworCitVQ0hBUglXUEFfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CitVQ0hBUglSU05fT1VJW10gPSB7MHgwMCwgMHgwZiwgMHhhY307CitVQ0hBUglXQVBJX09VSVtdID0gezB4MDAsIDB4MTQsIDB4NzJ9OworVUNIQVIgICBXTUVfSU5GT19FTEVNW10gID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDF9OworVUNIQVIgICBXTUVfUEFSTV9FTEVNW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMSwgMHgwMX07CitVQ0hBUglDY3gyUW9zSW5mb1tdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDR9OworVUNIQVIgICBSQUxJTktfT1VJW10gID0gezB4MDAsIDB4MGMsIDB4NDN9OworVUNIQVIgICBCUk9BRENPTV9PVUlbXSAgPSB7MHgwMCwgMHg5MCwgMHg0Y307CitVQ0hBUiAgIFdQU19PVUlbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDA0fTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1VDSEFSCVBSRV9OX0hUX09VSVtdCT0gezB4MDAsIDB4OTAsIDB4NGN9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGVbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDExLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCisgICAgMHgwNCwgMHgyMSwgIDAsIDMwLCA1MCwKKyAgICAweDA1LCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDYsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwNywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA4LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDksIDB4MjEsICA1LCAxMCwgMjUsCisgICAgMHgwYSwgMHgyMSwgIDYsICA4LCAyNSwKKyAgICAweDBiLCAweDIxLCAgNywgIDgsIDI1LAorICAgIDB4MGMsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MGQsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwZSwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDBmLCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MTAsIDB4MjIsIDE1LCAgOCwgMjUsCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEyLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTMsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE1LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTYsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNywgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE4LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTksIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFiLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWMsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFlLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWYsIDB4MDAsICAwLCAgMCwgIDAsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA0LCAweDAzLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCisgICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKKyAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAorICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwNSwgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA2LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDcsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwOCwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA5LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFHW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwOCwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MTAsICAwLCAyMCwgMTAxLAorICAgIDB4MDEsIDB4MTAsICAxLCAyMCwgMzUsCisgICAgMHgwMiwgMHgxMCwgIDIsIDIwLCAzNSwKKyAgICAweDAzLCAweDEwLCAgMywgMTYsIDM1LAorICAgIDB4MDQsIDB4MTAsICA0LCAxMCwgMjUsCisgICAgMHgwNSwgMHgxMCwgIDUsIDE2LCAyNSwKKyAgICAweDA2LCAweDEwLCAgNiwgMTAsIDI1LAorICAgIDB4MDcsIDB4MTAsICA3LCAxMCwgMTMsCit9OworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDksIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxMCwgMjUsCisgICAgMHgwNiwgMHgyMSwgIDYsICA4LCAxNCwKKyAgICAweDA3LCAweDIxLCAgNywgIDgsIDE0LAorICAgIDB4MDgsIDB4MjMsICA3LCAgOCwgMTQsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0geworLy8gSXRlbSBOby4JTW9kZQlDdXJyLU1DUwlUcmFpblVwCVRyYWluRG93bgkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NGb3JBQmFuZFtdID0geyAvLyAzKjMKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwZCwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDA1LCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDYsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwNywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA4LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDksIDB4MjEsICA1LCAxMCwgMjUsCisgICAgMHgwYSwgMHgyMSwgIDYsICA4LCAxNCwKKyAgICAweDBiLCAweDIxLCAgNywgIDgsIDE0LAorCTB4MGMsIDB4MjMsICA3LCAgOCwgMTQsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDIwLCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDUwLAorI2lmIDEKKyAgICAweDA1LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDIzLCAgOCwgMjUsCisjZWxzZSAvLyBmb3IgUlQyODYwIDIqMyB0ZXN0CisgICAgMHgwNSwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorI2VuZGlmCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYywgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMSwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDgsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDBhLCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MGIsIDB4MjIsIDIzLCAgOCwgMjUsCit9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitQVUNIQVIgUmVhc29uU3RyaW5nW10gPSB7CisJLyogMCAgKi8JICJSZXNlcnZlZCIsCisJLyogMSAgKi8JICJVbnNwZWNpZmllZCBSZWFzb24iLAorCS8qIDIgICovCSAiUHJldmlvdXMgQXV0aCBubyBsb25nZXIgdmFsaWQiLAorCS8qIDMgICovCSAiU1RBIGlzIGxlYXZpbmcgLyBoYXMgbGVmdCIsCisJLyogNCAgKi8JICJESVMtQVNTT0MgZHVlIHRvIGluYWN0aXZpdHkiLAorCS8qIDUgICovCSAiQVAgdW5hYmxlIHRvIGhhbmxlIGFsbCBhc3NvY2lhdGlvbnMiLAorCS8qIDYgICovCSAiY2xhc3MgMiBlcnJvciIsCisJLyogNyAgKi8JICJjbGFzcyAzIGVycm9yIiwKKwkvKiA4ICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDkgICovCSAicmVxdWlyZSBhdXRoIGJlZm9yZSBhc3NvYy9yZS1hc3NvYyIsCisJLyogMTAgKi8JICJSZXNlcnZlZCIsCisJLyogMTEgKi8JICJSZXNlcnZlZCIsCisJLyogMTIgKi8JICJSZXNlcnZlZCIsCisJLyogMTMgKi8JICJpbnZhbGlkIElFIiwKKwkvKiAxNCAqLwkgIk1JQyBlcnJvciIsCisJLyogMTUgKi8JICI0LXdheSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTYgKi8JICIyLXdheSAoZ3JvdXAga2V5KSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTcgKi8JICI0LXdheSBoYW5kc2hha2UgSUUgZGlmZiBhbW9uZyBBc3Nvc1JlcS9Sc3AvQmVhY29uIiwKKwkvKiAxOCAqLworfTsKKworZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOworLy8gc2luY2UgUlQ2MSBoYXMgYmV0dGVyIFJYIHNlbnNpYmlsaXR5LCB3ZSBoYXZlIHRvIGxpbWl0IFRYIEFDSyByYXRlIG5vdCB0byBleGNlZWQgb3VyIG5vcm1hbCBkYXRhIFRYIHJhdGUuCisvLyBvdGhlcndpc2UgdGhlIFdMQU4gcGVlciBtYXkgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgQUNLIHRodXMgZG93bmdyYWRlIGl0cyBkYXRhIFRYIHJhdGUKK1VMT05HIEJhc2ljUmF0ZU1hc2tbMTJdCQkJCT0gezB4ZmZmZmYwMDEgLyogMS1NYnBzICovLCAweGZmZmZmMDAzIC8qIDIgTWJwcyAqLywgMHhmZmZmZjAwNyAvKiA1LjUgKi8sIDB4ZmZmZmYwMGYgLyogMTEgKi8sCisJCQkJCQkJCQkgIDB4ZmZmZmYwMWYgLyogNiAqLwkgLCAweGZmZmZmMDNmIC8qIDkgKi8JICAsIDB4ZmZmZmYwN2YgLyogMTIgKi8gLCAweGZmZmZmMGZmIC8qIDE4ICovLAorCQkJCQkJCQkJICAweGZmZmZmMWZmIC8qIDI0ICovCSAsIDB4ZmZmZmYzZmYgLyogMzYgKi8JICAsIDB4ZmZmZmY3ZmYgLyogNDggKi8gLCAweGZmZmZmZmZmIC8qIDU0ICovfTsKKworVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CitVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisvLyBlLmcuIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbUkFURV8zNl0iIG1lYW5zIGlmIHRoZSBjdXJyZW50IFJTU0kgaXMgZ3JlYXRlciB0aGFuCisvLwkJdGhpcyB2YWx1ZSwgdGhlbiBpdCdzIHF1YXJhbnRlZWQgY2FwYWJsZSBvZiBvcGVyYXRpbmcgaW4gMzYgbWJwcyBUWCByYXRlIGluCisvLwkJY2xlYW4gZW52aXJvbm1lbnQuCisvLwkJCQkJCQkJICBUeFJhdGU6IDEgICAyICAgNS41CTExCSA2CSAgOSAgICAxMgkxOAkgMjQgICAzNiAgIDQ4CTU0CSA3MiAgMTAwCitDSEFSIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXSA9eyAgLTkyLCAtOTEsIC05MCwgLTg3LCAtODgsIC04NiwgLTg1LCAtODMsIC04MSwgLTc4LCAtNzIsIC03MSwgLTQwLCAtNDAgfTsKKworVUNIQVIgIFJhdGVJZFRvTWJwc1tdCSA9IHsgMSwgMiwgNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDcyLCAxMDB9OworVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDE0NCwgMjAwfTsKKworVUNIQVIgIFNzaWRJZQkgPSBJRV9TU0lEOworVUNIQVIgIFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7CitVQ0hBUiAgRXh0UmF0ZUllID0gSUVfRVhUX1NVUFBfUkFURVM7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUiAgSHRDYXBJZSA9IElFX0hUX0NBUDsKK1VDSEFSICBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKK1VDSEFSICBOZXdFeHRDaGFuSWUgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOworI2lmZGVmIERPVDExTl9EUkFGVDMKK1VDSEFSICBFeHRIdENhcEllID0gSUVfRVhUX0NBUEFCSUxJVFk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworVUNIQVIgIEVycEllCSA9IElFX0VSUDsKK1VDSEFSICBEc0llIAkgPSBJRV9EU19QQVJNOworVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKK1VDSEFSICBXcGFJZQkgPSBJRV9XUEE7CitVQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7CitVQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKK1VDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOworVUNIQVIgIFdhcGlJZQkgPSBJRV9XQVBJOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworCitVQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307CisKK1VDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OworCisvLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKK1JUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0geworLy8JCWNoCSBSMSAJCSBSMiAJCSBSMyhUWDB+ND0wKSBSNAorCQl7MSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9LAorCQl7MiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7OCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7OSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTAsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9LAorCisJCS8vIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyCisJCXszNiwgMHg5ODQwMmVjYywgMHg5ODRjMDk5YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs0NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXs1MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs2MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sIC8vIFBsdWdmZXN0IzQsIERheTQsIGNoYW5nZSBSRlIzIGxlZnQ0dGggOS0+NS4KKworCQkvLyA4MDIuMTEgSHlwZXJMYW4gMgorCQl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfSwKKworCQkvLyAyMDA4LjA0LjMwIG1vZGlmaWVkCisJCS8vIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlCisJCS8vIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4KKwkJezEwMiwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDc5M30sCisJCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfSwKKworCQl7MTEwLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKwkJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTE4LCAweDk4NDAyZWNjLCAweDk4NGMwYTNlLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTI2LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTVifSwgLy8gMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3CisJCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTMyLCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMThifSwKKwkJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTQwLCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKworCQkvLyA4MDIuMTEgVU5JSQorCQl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKKwkJezE1MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCisJCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9LAorCQl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfSwKKwkJezE1OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fSwKKworCQkvLyBKYXBhbgorCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKKwkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKwkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKworCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Cit9OworVUNIQVIJTlVNX09GXzI4NTBfQ0hOTCA9IChzaXplb2YoUkYyODUwUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkZfUkVHUykpOworCitGUkVRVUVOQ1lfSVRFTSBGcmVxSXRlbXMzMDIwW10gPQoreworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vIDExZworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLy1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLQorCXsxLCAgICAyNDEsICAyLCAgMn0sCisJezIsICAgIDI0MSwJIDIsICA3fSwKKwl7MywgICAgMjQyLAkgMiwgIDJ9LAorCXs0LCAgICAyNDIsCSAyLCAgN30sCisJezUsICAgIDI0MywJIDIsICAyfSwKKwl7NiwgICAgMjQzLAkgMiwgIDd9LAorCXs3LCAgICAyNDQsCSAyLCAgMn0sCisJezgsICAgIDI0NCwJIDIsICA3fSwKKwl7OSwgICAgMjQ1LAkgMiwgIDJ9LAorCXsxMCwgICAyNDUsCSAyLCAgN30sCisJezExLCAgIDI0NiwJIDIsICAyfSwKKwl7MTIsICAgMjQ2LAkgMiwgIDd9LAorCXsxMywgICAyNDcsCSAyLCAgMn0sCisJezE0LCAgIDI0OCwJIDIsICA0fSwKK307CisjZGVmaW5lCU5VTV9PRl8zMDIwX0NITkwJKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihGUkVRVUVOQ1lfSVRFTSkpCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJaW5pdGlhbGl6ZSB0aGUgTUxNRSB0YXNrIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmUgKHF1ZXVlLCBzcGlubG9jaywKKwkJdGltZXIsIHN0YXRlIG1hY2hpbmVzKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlSZXR1cm46CisJCWFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJZG8KKwl7CisJCVN0YXR1cyA9IE1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCWlmKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKworCQkJLy8gaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMKKwkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKKwkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhGdW5jKTsKKwkJCUF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKKwkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgcEFkLT5NbG1lLlN5bmNGdW5jKTsKKwkJCVdwYVBza1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIHBBZC0+TWxtZS5XcGFQc2tGdW5jKTsKKwkJCUFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgcEFkLT5NbG1lLkFpcm9uZXRGdW5jKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJRGxzU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgcEFkLT5NbG1lLkRsc0Z1bmMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKwkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQorCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0CisJCQlNbG1lQ250bEluaXQocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBOVUxMKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7CisKKwkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKKworCQkvLyBTZXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKKworCQkvLyBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTUxNRSBJbml0aWFsaXplXG4iKSk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCW1haW4gbG9vcCBvZiB0aGUgTUxNRQorCVByZToKKwkJTWxtZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVyZSBhcmUgc29tZXRoaW5nIGluc2lkZSB0aGUgcXVldWUKKwlOb3RlOgorCQlUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgZnJvbSBNUFNldEluZm9ybWF0aW9uIGFuZCBNUFJlY2VpdmU7CisJCVRoaXMgdGFzayBndWFyYW50ZWUgb25seSBvbmUgTWxtZUhhbmRsZXIgd2lsbCBydW4uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9RVUVVRV9FTEVNIAkgICAqRWxlbSA9IE5VTEw7CisjaWZkZWYgQVBDTElfU1VQUE9SVAorCVNIT1JUIGFwY2xpSWZJbmRleDsKKyNlbmRpZgorCisJLy8gT25seSBhY2NlcHQgTUxNRSBhbmQgRnJhbWUgZnJvbSBwZWVyIHNpZGUsIG5vIG90aGVyIChjb250cm9sL2RhdGEpIGZyYW1lIHNob3VsZAorCS8vIGdldCBpbnRvIHRoaXMgc3RhdGUgbWFjaGluZQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCisJeworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCQlyZXR1cm47CisJfQorCWVsc2UKKwl7CisJCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwl3aGlsZSAoIU1sbWVRdWV1ZUVtcHR5KCZwQWQtPk1sbWUuUXVldWUpKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRldmljZSBIYWx0ZWQgb3IgUmVtb3ZlZCBvciBNbG1lUmVzdCwgZXhpdCBNbG1lSGFuZGxlciEgKHF1ZXVlIG51bSA9ICVsZClcbiIsIHBBZC0+TWxtZS5RdWV1ZS5OdW0pKTsKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBSQUxJTktfQVRFCisJCWlmKEFURV9PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vdyBpbiBNbG1lSGFuZGxlclxuIikpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJLy9Gcm9tIG1lc3NhZ2UgdHlwZSwgZGV0ZXJtaW5lIHdoaWNoIHN0YXRlIG1hY2hpbmUgSSBzaG91bGQgZHJpdmUKKwkJaWYgKE1sbWVEZXF1ZXVlKCZwQWQtPk1sbWUuUXVldWUsICZFbGVtKSkKKwkJeworI2lmZGVmIFJUMjg3MAorCQkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFU0VUX0NPTkYpCisJCQl7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiEhISByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUocEFkKTsKKwkJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJCUVsZW0tPk1zZ0xlbiA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcworCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQorCQkJeworCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworI2lmZGVmCUNPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6CisJCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQljYXNlIExFQVBfU1RBVEVfTUFDSElORToKKwkJCQkJTGVhcE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5MZWFwTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJY2FzZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQljYXNlIERMU19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5EbHNNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisKKworCisKKwkJCQlkZWZhdWx0OgorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7CisJCQkJCWJyZWFrOworCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCisKKwkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJRWxlbS0+TXNnTGVuID0gMDsKKworCQl9CisJCWVsc2UgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUhhbmRsZXI6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOworCQl9CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlc3RydWN0b3Igb2YgTUxNRSAoRGVzdHJveSBxdWV1ZSwgc3RhdGUgbWFjaGluZSwgc3BpbiBsb2NrIGFuZCB0aW1lcikKKwlQYXJhbWV0ZXJzOgorCQlBZGFwdGVyIC0gTklDIEFkYXB0ZXIgcG9pbnRlcgorCVBvc3Q6CisJCVRoZSBNTE1FIHRhc2sgd2lsbCBubyBsb25nZXIgd29yayBwcm9wZXJseQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUhhbHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQk9PTEVBTiAJICBDYW5jZWxsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKKworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCisJCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUgkJaTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJkNhbmNlbGxlZCk7CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKworCisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIFNldCBMRUQKKwkJUlRNUFNldExFRChwQWQsIExFRF9IQUxUKTsKKyAgICAgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorI2lmZGVmIFJUMjg3MAorICAgICAgICB7CisgICAgICAgICAgICBMRURfQ0ZHX1NUUlVDIExlZENmZzsKKyAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgTEVEX0NGRywgJkxlZENmZy53b3JkKTsKKyAgICAgICAgICAgIExlZENmZy5maWVsZC5MZWRQb2xhciA9IDA7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuUkxlZE1vZGUgPSAwOworICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLkdMZWRNb2RlID0gMDsKKyAgICAgICAgICAgIExlZENmZy5maWVsZC5ZTGVkTW9kZSA9IDA7CisgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBMRURfQ0ZHLCBMZWRDZmcud29yZCk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOyAgICAvLyAgNSBtc2VjIHRvIGd1cmFudGVlIEFudCBEaXZlcnNpdHkgdGltZXIgY2FuY2VsZWQKKworCU1sbWVRdWV1ZURlc3Ryb3koJnBBZC0+TWxtZS5RdWV1ZSk7CisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lSGFsdFxuIikpOworfQorCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1J4T2tEYXRhQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudDsKKwkvLyBjbGVhciBhbGwgT25lU2VjeHh4IGNvdW50ZXJzLgorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQgPSAwOworCisJLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQkVdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfQktdID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVkldID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRSURfQUNfVk9dID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4Q291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCA9IDA7CisKKwlyZXR1cm47Cit9CisKK3Vuc2lnbmVkIGxvbmcgcnhfQU1TRFU7Cit1bnNpZ25lZCBsb25nIHJ4X1RvdGFsOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgdG8gLQorCQkxLiBEZWNpZGUgaWYgaXQncyBhIHJpZ2h0IHRpbWUgdG8gdHVybiBvbiBQd3JNZ210IGJpdCBvZiBhbGwKKwkJICAgb3V0Z29paW5nIGZyYW1lcworCQkyLiBDYWxjdWxhdGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb24gc3RhdGlzdGljcyBvZiB0aGUgbGFzdAorCQkgICBwZXJpb2QsIHNvIHRoYXQgVFggcmF0ZSB3b24ndCB0b2dnbGluZyB2ZXJ5IGZyZXF1ZW50bHkgYmV0d2VlbiBhCisJCSAgIHN1Y2Nlc3NmdWwgVFggYW5kIGEgZmFpbGVkIFRYLgorCQkzLiBJZiB0aGUgY2FsY3VsYXRlZCBDaGFubmVsUXVhbGl0eSBpbmRpY2F0ZWQgY3VycmVudCBjb25uZWN0aW9uIG5vdAorCQkgICBoZWFsdGh5LCB0aGVuIGEgUk9BTWluZyBhdHRlbXB0IGlzIHRyaWVkIGhlcmUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYworVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlVTE9ORwkJCVR4VG90YWxDbnQ7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpKQorCQlyZXR1cm47CisKKwlSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogRG8gbm90IHNob3cgUlNTSSB1bnRpbCAiTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjIi4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAhPSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgLSAxKSkKKwl7CisJCQlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpCisJCXsKKwkJCS8vIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBECisJCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkgJiYKKwkJCQkoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9PSBGQUxTRSkpCisKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkJCSgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gRkFMU0U7CisJCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworCisvLwlSRUNCQVRpbWVyVGltZW91dChTeXN0ZW1TcGVjaWZpYzEsRnVuY3Rpb25Db250ZXh0LFN5c3RlbVNwZWNpZmljMixTeXN0ZW1TcGVjaWZpYzMpOworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOworCisJLy8gZXhlY3V0ZSBldmVyeSA1MDBtcworCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSA1ID09IDApICYmIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHBBZCkvKihPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSovKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8gcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeQorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJCQkpCisJCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKKwkJCQlNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhwQWQpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLgorCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgPT0gMCkKKwl7CisgICAgICAgICAgICAgICAgcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgKys7CisKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgCWlmIChBVEVfT04ocEFkKSkKKyAgICAJeworCQkJLyogcmVxdWVzdCBmcm9tIEJhcm9uIDogbW92ZSB0aGlzIHJvdXRpbmUgZnJvbSBsYXRlciB0byBoZXJlICovCisJCQkvKiBmb3Igc2hvd2luZyBSeCBlcnJvciBjb3VudCBpbiBBVEUgUlhGUkFNRSAqLworICAgICAgICAgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKwkJCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5SeFRvdGFsQ250ICs9IHBBZC0+YXRlLlJ4Q250UGVyU2VjOworCQkJICAgIGF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBwYWNrZXQgY250ID0gJWQvJWRcbiIsIHBBZC0+YXRlLlJ4Q250UGVyU2VjLCBwQWQtPmF0ZS5SeFRvdGFsQ250KTsKKwkJCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisKKwkJCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpMD0lZCwgQXZnUnNzaTE9JWQsIEF2Z1Jzc2kyPSVkXG5cbiIsCisJCQkJCQlwQWQtPmF0ZS5BdmdSc3NpMCwgcEFkLT5hdGUuQXZnUnNzaTEsIHBBZC0+YXRlLkF2Z1Jzc2kyKTsKKwkJCQllbHNlCisJCQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJNbG1lUGVyaW9kaWNFeGVjOiBSeCBBdmdSc3NpPSVkXG5cbiIsIHBBZC0+YXRlLkF2Z1Jzc2kwKTsKKwkJCX0KKwkJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CisJCQlyZXR1cm47CisgICAgCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCQlpZiAocnhfVG90YWwpCisJCXsKKworCQkJLy8gcmVzZXQgY291bnRlcnMKKwkJCXJ4X0FNU0RVID0gMDsKKwkJCXJ4X1RvdGFsID0gMDsKKwkJfQorCisJCS8vT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKworCQkvLyBNZWRpYSBzdGF0dXMgY2hhbmdlZCwgcmVwb3J0IHRvIE5ESVMKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpKQorCQl7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7CisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKwkJCX0KKwkJfQorCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5Ob3czMik7CisKKwkJLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIHZhcmlhYmxlLCBzbyB0aGF0CisJCS8vIHRoZSBkeW5hbWljIHR1bmluZyBtZWNoYW5pc20gYmVsb3cgYXJlIGJhc2VkIG9uIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgorCQlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCisjaWZkZWYgUlQyODcwCisJCVJUMjg3MF9XYXRjaERvZyhwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAJCS8vIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycworCQlPUklCQVRpbWVyVGltZW91dChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGlmIE1HTVQgUklORyBpcyBmdWxsIG1vcmUgdGhhbiB0d2ljZSB3aXRoaW4gMSBzZWNvbmQsIHdlIGNvbnNpZGVyIHRoZXJlJ3MKKwkJLy8gYSBoYXJkd2FyZSBwcm9ibGVtIHN0dWNraW5nIHRoZSBUWCBwYXRoLiBJbiB0aGlzIGNhc2UsIHRyeSBhIGhhcmR3YXJlIHJlc2V0CisJCS8vIHRvIHJlY292ZXIgdGhlIHN5c3RlbQorCS8vCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID49IDIpCisJLy8JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SKTsKKwkvLwllbHNlCisJLy8JCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCisJCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYworCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250ID4gNTApCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0gMCkKKwkJCQl7CisJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJfQorCQkJfQorCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVNUQU1sbWVQZXJpb2RpY0V4ZWMocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXsKKwkJCQkvLyBXaGVuIEFkaG9jIGJlYWNvbiBpcyBlbmFibGVkIGFuZCBSVFMvQ1RTIGlzIGVuYWJsZWQsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgaGFyZHdhcmUgTUFDIEZTTSB3aWxsIHJ1biBpbnRvIGEgZGVhZGxvY2sKKwkJCQkvLyBhbmQgc2VuZGluZyBDVFMtdG8tc2VsZiBvdmVyIGFuZCBvdmVyLgorCQkJCS8vIFNvZnR3YXJlIFBhdGNoIFNvbHV0aW9uOgorCQkJCS8vIDEuIFBvbGxpbmcgZGVidWcgc3RhdGUgcmVnaXN0ZXIgMHgxMEY0IGV2ZXJ5IG9uZSBzZWNvbmQuCisJCQkJLy8gMi4gSWYgaW4gMHgxMEY0IHRoZSAoKGJpdDI5PT0xKSAmJiAoYml0Nz09MSkpIE9SICgoYml0Mjk9PTEpICYmIChiaXQ1PT0xKSksIGl0IG1lYW5zIHRoZSBkZWFkbG9jayBoYXMgb2NjdXJyZWQuCisJCQkJLy8gMy4gSWYgdGhlIGRlYWRsb2NrIG9jY3VycmVkLCByZXNldCBNQUMvQkJQIGJ5IHNldHRpbmcgMHgxMDA0IHRvIDB4MDAwMSBmb3IgYSB3aGlsZSB0aGVuIHNldHRpbmcgaXQgYmFjayB0byAweDAwMEMgYWdhaW4uCisKKwkJCQlVSU5UMzIJTWFjUmVnID0gMDsKKworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMEY0LCAmTWFjUmVnKTsKKwkJCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4MjApKSkKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKKwkJCQkJUlRNUHVzZWNEZWxheSgxKTsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweEMpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sKCJXYXJuaW5nLCBNQUMgc3BlY2lmaWMgY29uZGl0aW9uIG9jY3VycyBcbiIpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisKKwlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKKwlQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORwlUeFRvdGFsQ250OworCWludCAJaTsKKworLy8KKy8vIFdlIHJldHVybiBoZXJlIGluIEFURSBtb2RlLCBiZWNhdXNlIHRoZSBzdGF0aXN0aWNzCisvLyB0aGF0IEFURSBuZWVkcyBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgorLy8KKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gSXQgaXMgc3VwcG9zZWQgdGhhdCB3ZSB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgaW4gQVRFIG1vZGUuCisJQVNTRVJUKCEoQVRFX09OKHBBZCkpKTsKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICB7CisgICAgCS8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmIChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKyAgICAJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpCisJeworCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKKwl9CisKKworCisKKyAgIAlBc2ljU3RhQmJwVHVuaW5nKHBBZCk7CisKKwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQkvLyB1cGRhdGUgY2hhbm5lbCBxdWFsaXR5IGZvciBSb2FtaW5nIGFuZCBVSSBMaW5rUXVhbGl0eSBkaXNwbGF5CisJCU1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShwQWQsIHBBZC0+TWxtZS5Ob3czMik7CisJfQorCisJLy8gbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZgorCS8vIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudAorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJQXNpY0FkanVzdFR4UG93ZXIocEFkKTsKKworCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gQ2hlY2sgRExTIHRpbWUgb3V0LCB0aGVuIHRlYXIgZG93biB0aG9zZSBzZXNzaW9uCisJCVJUTVBDaGVja0RMU1RpbWVPdXQocEFkKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PworCQkvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4KKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQlNbG1lQ2hlY2tQc21DaGFuZ2UocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA9IFR4VG90YWxDbnQ7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgMSpPU19IWiA8IHBBZC0+TWxtZS5Ob3czMikgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCSgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA8IDYwMCkpKQorCQl7CisJCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKKwkJfQorCisgICAgICAgIC8vaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKyAgICAgICAgLy8gICAgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkpCisgICAgICAgIHsKKyAgICAJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisgICAgCQl7CisgICAgCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCisgICAgCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKyAgICAJCX0KKyAgICAJCWVsc2UKKyAgICAJCXsKKyAgICAJCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisgICAgCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgfQorICAgIAkJfQorICAgICAgICB9CisKKwkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCisJCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lID0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZTsKKworCQkJLy8gTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCQl7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIC8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKyAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCQkvLyBSVE1QUGF0Y2hNYWNCYnBCdWcocEFkKTsKKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfQorCQllbHNlIGlmIChDUUlfSVNfQkFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIEJhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKworCQkvLyBBZGQgYXV0byBzZWFtbGVzcyByb2FtaW5nCisJCWlmIChwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcpCisJCXsKKwkJCVNIT1JUCWRCbVRvUm9hbSA9IChTSE9SVClwQWQtPlN0YUNmZy5kQm1Ub1JvYW07CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJzc2k9JWQsIGRCbVRvUm9hbT0lZFxuIiwgUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwgKENIQVIpZEJtVG9Sb2FtKSk7CisKKwkJCWlmIChSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpIDw9IChDSEFSKWRCbVRvUm9hbSkKKwkJCXsKKwkJCQlNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhwQWQsIHBBZC0+TWxtZS5Ob3czMik7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwl7CisJCS8vcmFkYXIgZGV0ZWN0CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQl7CisJCQlSYWRhckRldGVjdFBlcmlvZGljKHBBZCk7CisJCX0KKworCQkvLyBJZiBhbGwgcGVlcnMgbGVhdmUsIGFuZCB0aGlzIFNUQSBiZWNvbWVzIHRoZSBsYXN0IG9uZSBpbiB0aGlzIElCU1MsIHRoZW4gY2hhbmdlIE1lZGlhU3RhdGUKKwkJLy8gdG8gRElTQ09OTkVDVEVELiBCdXQgc3RpbGwgaG9sZGluZyB0aGlzIElCU1MgKGkuZS4gc2VuZGluZyBCRUFDT04pIHNvIHRoYXQgb3RoZXIgU1RBcyBjYW4KKwkJLy8gam9pbiBsYXRlci4KKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikgJiYKKwkJCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJeworCQkJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBleGNlc3NpdmUgQkVBQ09OIGxvc3QsIGxhc3QgU1RBIGluIHRoaXMgSUJTUywgTWVkaWFTdGF0ZT1EaXNjb25uZWN0ZWRcbiIpKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisKKwkJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJCWlmIChwRW50cnktPlZhbGlkQXNDTEkgPT0gRkFMU0UpCisJCQkJY29udGludWU7CisKKwkJCWlmIChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKKwkJfQorCX0KKwllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCisJeworCisJCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCisgICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDMwICogT1NfSFopID4gcEFkLT5NbG1lLk5vdzMyKSkKKwkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCisJCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKKwkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKKwkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwkJeworCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCisJCQl7CisJCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKKworCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKKwkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvLyBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbQorCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkKKwkJCQl7CisJCQkJCU1sbWVBdXRvU2NhbihwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA1KSA9PSAxKQorCQkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworU0tJUF9BVVRPX1NDQU5fQ09OTjoKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IFRSVUU7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBGQUxTRTsKKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpCisJCVRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcmV0dXJuOworfQorCisvLyBMaW5rIGRvd24gcmVwb3J0CitWT0lEIExpbmtEb3duRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCisKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCisJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwl7CisJCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKKwkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9TU0lELAorCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisJCQkJCSZPaWRTc2lkKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQorCVZhbGlkIFNTSUQgd2lsbCBoYXZlIHZpc2libGUgY2hhcnMgb25seS4KKwlUaGUgdmFsaWQgbGVuZ3RoIGlzIGZyb20gMCB0byAzMi4KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCisJSU4gUFVDSEFSCXBTc2lkLAorCUlOIFVDSEFSCVNzaWRMZW4pCit7CisJaW50CWluZGV4OworCisJaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCisJCXJldHVybiAoRkFMU0UpOworCisJLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQorCXsKKwkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCisJCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwkvLyBBbGwgY2hlY2tlZAorCXJldHVybiAoVFJVRSk7Cit9CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKK3sKKwlkbworCXsKKwkJLy8gZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApCisJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07CisKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQkJey8vIDExTiAxUyBBZGhvYworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmCisJCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJey8vIDExTiAyUyBBZGhvYworCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJfQorCisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJCSkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExRzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy9pZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJLy8JKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQorCQl7Ly8gMTFCR04gMVMgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMV07CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkvLwkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExQkdOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKKwkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExTiAxUyBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQorCQl7Ly8gMTFOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQiBvbmx5IEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPiA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBCL0cgIG1peGVkIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDgpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEcgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJewkvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+IFJBVEVfMTEpKQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUgKFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIE1DU1NldFswXT0weCV4LCBNQ1NTZXRbMV09MHgleClcbiIsCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9IHdoaWxlKEZBTFNFKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZXJlJ3JlIG90aGVyIEFQcyBvdXQgdGhlcmUgY2FwYWJsZSBmb3IKKwkJcm9hbWluZy4gQ2FsbGVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gTGluayB1cCBpbiBJTkZSQSBtb2RlCisJCWFuZCBjaGFubmVsIHF1YWxpdHkgaXMgYmVsb3cgQ1FJX0dPT0RfVEhSRVNIT0xELgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlPdXRwdXQ6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVTSE9SVAkgICBpOworCUJTU19UQUJMRSAgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWSAgKnBCc3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yUm9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKwkJaWYgKChwQnNzLT5MYXN0QmVhY29uUnhUaW1lICsgQkVBQ09OX0xPU1RfVElNRSkgPCBOb3czMikKKwkJCWNvbnRpbnVlOwkgLy8gQVAgZGlzYXBwZWFyCisJCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQorCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQorCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKKwkJaWYgKHBCc3MtPlJzc2kgPCAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKKwkJCWNvbnRpbnVlOwkgLy8gb25seSBBUCB3aXRoIHN0cm9uZ2VyIFJTU0kgaXMgZWxpZ2libGUgZm9yIHJvYW1pbmcKKworCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcFJvYW1UYWItPkJzc05yICs9IDE7CisJfQorCisJaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCisJeworCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lQ2hlY2tGb3JSb2FtaW5nKCMgb2YgY2FuZGlkYXRlPSAlZClcbiIscFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcJCQlOb3cpCit7CisJVVNIT1JUCQlpOworCUJTU19UQUJMRQkqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJQlNTX0VOVFJZCSpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nXG4iKSk7CisJLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCisJQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKworICAgICAgICBpZiAoKHBCc3MtPlJzc2kgPD0gLTUwKSAmJiAocEJzcy0+Q2hhbm5lbCA9PSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmICghU1NJRF9FUVVBTChwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBkaWZmZXJlbnQgU1NJRAorICAgICAgICBpZiAocEJzcy0+UnNzaSA8IChSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIHNraXAgQVAgd2l0aG91dCBiZXR0ZXIgUlNTSQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxhc3RSc3NpMCA9ICVkLCBwQnNzLT5Sc3NpID0gJWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIHBCc3MtPlJzc2kpKTsKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwkvLyBNYXliZSBzaXRlIHN1cnZleSByZXF1aXJlZAorCWVsc2UKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiAxMDAwKSA8IE5vdykKKwkJeworCQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZywgTm8gZWxpZ2FibGUgZW50cnksIHRyeSBuZXcgc2NhbiFcbiIpKTsKKwkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAyOworCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCX0KKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgVHhQRVIsIFJ4UEVSIG9mIHRoZSBwYXN0IE4tc2VjIHBlcmlvZC4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBDaGFubmVsUXVhbGl0eSBpcyBjYWxjdWxhdGVkIGhlcmUKKwkJdG8gZGVjaWRlIGlmIGN1cnJlbnQgQVAgaXMgc3RpbGwgZG9pbmcgdGhlIGpvYi4KKworCQlJZiBDaGFubmVsUXVhbGl0eSBpcyBub3QgZ29vZCwgYSBST0FNaW5nIGF0dGVtcHQgbWF5IGJlIHRyaWVkIGxhdGVyLgorCU91dHB1dDoKKwkJU3RhQ2ZnLkNoYW5uZWxRdWFsaXR5IC0gMC4uMTAwCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6IFRoaXMgcm91dGluZSBkZWNpZGUgY2hhbm5sZSBxdWFsaXR5IGJhc2VkIG9uIFJYIENSQyBlcnJvciByYXRpby4KKwkJQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgYSBmdW5jdGlvbiBjYWxsIHRvIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCkKKwkJaXMgcGVyZm9ybWVkIHJpZ2h0IGJlZm9yZSB0aGlzIHJvdXRpbmUsIHNvIHRoYXQgdGhpcyByb3V0aW5lIGNhbiBkZWNpZGUKKwkJY2hhbm5lbCBxdWFsaXR5IGJhc2VkIG9uIHRoZSBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3czMikKK3sKKwlVTE9ORyBUeE9rQ250LCBUeENudCwgVHhQRVIsIFR4UFJSOworCVVMT05HIFJ4Q250LCBSeFBFUjsKKwlVQ0hBUiBOb3JSc3NpOworCUNIQVIgIE1heFJzc2k7CisJVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkvLyBsb25nZXIgYmVhY29uIGxvc3QgdGltZSB3aGVuIGNhcnJpZXIgZGV0ZWN0aW9uIGVuYWJsZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwl7CisJCUJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRSArIEJFQUNPTl9MT1NUX1RJTUUvMjsKKwl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisKKwkvLworCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcworCS8vCisJVHhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVHhDbnQgPSBUeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwlpZiAoVHhDbnQgPCA1KQorCXsKKwkJVHhQRVIgPSAwOworCQlUeFBSUiA9IDA7CisJfQorCWVsc2UKKwl7CisJCVR4UEVSID0gKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7CisJCVR4UFJSID0gKChUeENudCAtIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7CisJfQorCisJLy8KKwkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKKwkvLworCVJ4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudDsKKwlpZiAoUnhDbnQgPCA1KQorCQlSeFBFUiA9IDA7CisJZWxzZQorCQlSeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OworCisJLy8KKwkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYgLy8gbm8gaGVhdnkgdHJhZmZpYworCQkocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lIDwgTm93MzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOworCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOb3JtYWxpemUgUnNzaQorCQlpZiAoTWF4UnNzaSA+IC00MCkKKwkJCU5vclJzc2kgPSAxMDA7CisJCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCisJCQlOb3JSc3NpID0gMDsKKwkJZWxzZQorCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKKworCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKFJTU0lfV0VJR0hUSU5HICogTm9yUnNzaSArCisJCQkJCQkJCSAgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKworCQkJCQkJCQkgICBSWF9XRUlHSFRJTkcqICgxMDAgLSBSeFBFUikpIC8gMTAwOworCQlpZiAocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID49IDEwMCkKKwkJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDEwMDsKKwl9CisKK30KKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKK3sKKwlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4TW9kZSA9IE1PREVfSFRHUkVFTkZJRUxEOworCisJaWYgKHBUeFJhdGUtPlNUQkMgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisJaWYgKHBUeFJhdGUtPkN1cnJNQ1MgPCBNQ1NfQVVUTykKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBUeFJhdGUtPkN1cnJNQ1M7CisKKwlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA+IDcpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisgICAJaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvLyBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLgorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKKworCQkvLworCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKKwkJLy8KKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisKKwkJLy8gUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOworCX0KKwllbHNlCisJeworCQlpZiAocFR4UmF0ZS0+TW9kZSA8PSBNYXhNb2RlKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwVHhSYXRlLT5Nb2RlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwVHhSYXRlLT5TaG9ydEdJICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSkpCisJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuCisJCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApCisJCXsKKwkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKSkpCisJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJLy8gVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkpCisJCXsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisKKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpKQorCQl7CisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSAmJgorCQkgICAgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkKKwkJICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyB0aGUgYWN1bXVsYXRlZCBUeFBFUiBvZiBlYXhoIFR4UmF0ZS4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBjaGFuZ2UgQ29tbW9uQ2ZnLlR4UmF0ZSB3aGljaAorCQlpcyB0aGUgc3RhYmxlIFRYIFJhdGUgd2UgZXhwZWN0IHRoZSBSYWRpbyBzaXR1YXRpb24gY291bGQgc3VzdGFpbmVkLgorCisJCUNvbW1vbkNmZy5UeFJhdGUgd2lsbCBjaGFuZ2UgZHluYW1pY2FsbHkgd2l0aGluIHtSQVRFXzEvUkFURV82LCBNYXhUeFJhdGV9CisJT3V0cHV0OgorCQlDb21tb25DZmcuVHhSYXRlIC0KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTk9URToKKwkJY2FsbCB0aGlzIHJvdXRpbmUgZXZlcnkgc2Vjb25kCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKKwlVTE9ORwkJCQkJaSwgQWNjdVR4VG90YWxDbnQgPSAwLCBUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLworCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKwkvLworICAgCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKQorCQl7CisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKwkJCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBUUlVFOworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisJCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCisJCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0CisJCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAorCQkJQWNjdVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKKwkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCWVsc2UKKwkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisKKwkJQ3VyclJhdGVJZHggPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKKworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKQorCQl7CisJCQlDdXJyUmF0ZUlkeCA9IFRhYmxlU2l6ZSAtIDE7CisJCX0KKworCQkvLyBXaGVuIHN3aXRjaCBmcm9tIEZpeGVkIHJhdGUgLT4gYXV0byByYXRlLCB0aGUgUkVBTCBUWCByYXRlIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4LgorCQkvLyBTbyBuZWVkIHRvIHN5bmMgaGVyZS4KKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCS8vJiYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkpCisJCXsKKworCQkJLy8gTmVlZCB0byBzeW5jIFJlYWwgVHggcmF0ZSBhbmQgb3VyIHJlY29yZC4KKwkJCS8vIFRoZW4gcmV0dXJuIGZvciBuZXh0IERSUy4KKwkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhJbml0VHhSYXRlSWR4KzEpKjVdOworCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBJbml0VHhSYXRlSWR4OworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcEN1cnJUeFJhdGUpOworCisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKKwkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLTE7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CisJCX0KKworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCisJCXsKKwkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKKwkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCX0KKworCQkvL3BBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKwkJLy8KKwkJLy8gS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuCisJCS8vCisJCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxNSkKKwkJeworCQkJQ0hBUglpZHggPSAwOworCQkJVUNIQVIJVHhSYXRlSWR4OworCQkJLy9VQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsIE1DUzcgPSAwLCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsICBNQ1M1ID0wLCBNQ1M2ID0gMCwgTUNTNyA9IDA7CisJICAgICAgICBVQ0hBUglNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7IC8vIDMqMworCisJCQkvLyBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MKKwkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pCisJCQl7CisJCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKGlkeCsxKSo1XTsKKworCQkJCWlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMCkKKwkJCQl7CisJCQkJCU1DUzAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKQorCQkJCXsKKwkJCQkJTUNTMSA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCisJCQkJeworCQkJCQlNQ1MyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMykKKwkJCQl7CisJCQkJCU1DUzMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KQorCQkJCXsKKwkJCQkJTUNTNCA9IGlkeDsKKwkJCQl9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzUpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M1ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIE1DUzYgPSBpZHg7CisJICAgICAgICAgICAgfQorCQkJCS8vZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy8gcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQKKwkJCQl7CisJCQkJCU1DUzcgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKKwkJCQl7CisJCQkJCU1DUzEyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpCisJCQkJeworCQkJCQlNQ1MxMyA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE0KQorCQkJCXsKKwkJCQkJTUNTMTQgPSBpZHg7CisJCQkJfQorCQkJCS8vZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkvKiAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSovKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUsIGhvd2V2ZXIgQXRoZXJvcydzIGNoaXAgaGFzIGJ1Z3Mgd2hlbiBzaG9ydCBHSQorCQkJCXsKKwkJCQkJTUNTMTUgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkgLy8gMyozCisJCQkJeworCQkJCQlNQ1MyMCA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQorCQkJCXsKKwkJCQkJTUNTMjEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikKKwkJCQl7CisJCQkJCU1DUzIyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjMpCisJCQkJeworCQkJCQlNQ1MyMyA9IGlkeDsKKwkJCQl9CisJCQkJaWR4ICsrOworCQkJfQorCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gODsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvKmlmIChNQ1MxNSkqLworCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fAorCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAzIHN0cmVhbSAvLyAzKjMKKwkJCQlpZiAoTUNTMjMgJiYgKFJzc2kgPj0gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7CisJCQkJZWxzZSBpZiAoTUNTMjIgJiYgKFJzc2kgPj0gLTcyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisgICAgICAgIAkgICAgZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMjAgJiYgKFJzc2kgPj0gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7CisJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49IC04MikpCisJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49IC04OCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCWVsc2UKKwkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQl9CisvLwkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKQorCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSkgLy8gMyozCisJCQl7Ly8gTiBtb2RlIHdpdGggMiBzdHJlYW0KKwkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzE0ICYmIChSc3NpID49ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNDsKKwkJCQllbHNlIGlmIChNQ1MxMyAmJiAoUnNzaSA+PSAoLTc2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMTIgJiYgKFJzc2kgPj0gKC03OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gKC04MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gKC04OCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjFTKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAxIHN0cmVhbQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CisJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+ICgtNzQrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAoLTc3K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gKC03OStSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+ICgtODErUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAoLTgzK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJey8vIExlZ2FjeSBtb2RlCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAtNzApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAtNzQpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M2OworCQkJCWVsc2UgaWYgKE1DUzUgJiYgKFJzc2kgPiAtNzgpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M1OworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAtODIpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzQgPT0gMCkJLy8gZm9yIEItb25seSBtb2RlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+IC04NSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+IC04NykpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+IC05MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQkJZWxzZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQkJfQorCisJLy8JCWlmIChUeFJhdGVJZHggIT0gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpCisJCQl7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBUeFJhdGVJZHg7CisJCQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJCX0KKworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IFRSVUU7CisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID09IFRSVUUpCisJCXsKKwkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gRkFMU0U7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWRvCisJCXsKKwkJCUJPT0xFQU4JYlRyYWluVXBEb3duID0gRkFMU0U7CisKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgKys7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQliVHJhaW5VcERvd24gPSBUUlVFOworCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJLy8gdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZAorCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQliVXBncmFkZVF1YWxpdHkgPSBUUlVFOworCQkJCWlmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSAtLTsgIC8vIHF1YWxpdHkgdmVyeSBnb29kIGluIEN1cnJSYXRlCisKKwkJCQlpZiAocEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkpCisJCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5IC0tOworCQkJCWVsc2UgaWYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0pCisJCQkJCXBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gLS07ICAgIC8vIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkKKwkJCX0KKworCQkJcEVudHJ5LT5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJaWYgKGJUcmFpblVwRG93bikKKwkJCXsKKwkJCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCisJCQkJaWYgKChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA+PSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCX0KKwkJCQllbHNlIGlmICgoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSA8PSAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7IC8vIHJhdGUgVVAKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCisJCQkvLworCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5CisJCWVsc2UgaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOworCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMjsgLy8gcmF0ZSBET1dOCisJCQlwRW50cnktPlR4UXVhbGl0eVtwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOworCQkJcEVudHJ5LT5QRVJbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiBkb3duCisJCQkvLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpCisJCQl7CisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKKworCQkJCXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZyA9IFRSVUU7CisJCQl9CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOyAvLyByYXRlIG5vIGNoYW5nZQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBFbnRyeS0+TGFzdFR4T2tDb3VudCA9IFR4U3VjY2VzczsKKworCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKKwkJeworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN0YXRpb24gc2lkZSwgQXV0byBUeFJhdGUgZmFzdGVyIHRyYWluIHVwIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJU3lzdGVtU3BlY2lmaWMxCQkJLSBOb3QgdXNlZC4KKwkJRnVuY3Rpb25Db250ZXh0CQkJLSBQb2ludGVyIHRvIG91ciBBZGFwdGVyIGNvbnRleHQuCisJCVN5c3RlbVNwZWNpZmljMgkJCS0gTm90IHVzZWQuCisJCVN5c3RlbVNwZWNpZmljMwkJCS0gTm90IHVzZWQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUFJUTVBfQURBUFRFUgkJCXBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7CisJVUxPTkcJCQkJCVR4VG90YWxDbnQ7CisJVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7CisJQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQ7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlDSEFSCQkJCQlSc3NpLCByYXRpbzsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisJVUxPTkcJCQkJCWk7CisKKwlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKworICAgIC8vCisgICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQorICAgIC8vCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQljb250aW51ZTsKKworCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKKwkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQllbHNlCisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQlDdXJyUmF0ZUlkeCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4OworCisJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkKKwkJeworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisjaWYgMCAvLyB0ZXN0IGJ5IEdhcnkuCisJCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCisJCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0CisJCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAorCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKyNlbmRpZgorCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisKKwkJLy8KKwkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKKwkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCisJCS8vCisJCWlmIChUeFRvdGFsQ250IDw9IDEyKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCX0KKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IFR4VG90YWxDbnQgPD0gMTUsIHRyYWluIGJhY2sgdG8gb3JpZ2luYWwgcmF0ZSBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRvCisJCXsKKwkJCVVMT05HIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7CisKKwkJCWlmIChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID09IDApCisJCQkJcmF0aW8gPSA1OworCQkJZWxzZQorCQkJCXJhdGlvID0gNDsKKworCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQorCQkJeworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCQkJfQorCisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCisJCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKKworCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OworCQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKKwkJCXsKKwkJCQlpZiAoKFR4RXJyb3JSYXRpbyA+PSA1MCkgfHwgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pKQorCQkJCXsKKworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJCX0KKwkJCX0KKwkJfXdoaWxlIChGQUxTRSk7CisKKwkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLCBDdXJyUmF0ZUlkeCwgcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpKTsKKworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQorCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOworCQl9CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IGluc2lkZSBNbG1lUGVyaW9kaWNFeGVjKCkgYWZ0ZXIKKwkJYXNzb2NpYXRpb24gd2l0aCBhbiBBUC4KKwkJSXQgY2hlY2tzIGlmIFN0YUNmZy5Qc20gaXMgY29uc2lzdGVudCB3aXRoIHVzZXIgcG9saWN5IChyZWNvcmRlZCBpbgorCQlTdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkuIElmIG5vdCwgZW5mb3JjZSB1c2VyIHBvbGljeS4gSG93ZXZlciwKKwkJdGhlcmUncmUgc29tZSBjb25kaXRpb25zIHRvIGNvbnNpZGVyOgorCQkxLiB3ZSBkb24ndCBzdXBwb3J0IHBvd2VyLXNhdmluZyBpbiBBREhPQyBtb2RlLCBzbyBQc209UFdSX0FDVElWRSBhbGwKKwkJICAgdGhlIHRpbWUgd2hlbiBNaWJzcz09VFJVRQorCQkyLiBXaGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZSwgUHNtIHNob3VsZCBub3QgYmUgc3dpdGNoIHRvIFBXUl9TQVZFCisJCSAgIGlmIG91dGdvaW5nIHRyYWZmaWMgYXZhaWxhYmxlIGluIFR4UmluZyBvciBNZ210UmluZy4KKwlPdXRwdXQ6CisJCTEuIGNoYW5nZSBwQWQtPlN0YUNmZy5Qc20gdG8gUFdSX1NBVkUgb3IgbGVhdmUgaXQgdW50b3VjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVMT05HCVBvd2VyTW9kZTsKKworCS8vIGNvbmRpdGlvbiAtCisJLy8gMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkvLyAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQCisJLy8gMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRQorCS8vIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcKKwkvLyA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QKKyNpZmRlZiBORElTNTFfTUlOSVBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyUHJvZmlsZSA9PSBOZGlzUG93ZXJQcm9maWxlQmF0dGVyeSkKKwkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGU7CisJZWxzZQorI2VuZGlmCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisKKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCisJCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKKy8vCQkoISBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpIC8qJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9PSAwKSAmJgorCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9PSAwKSovKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID0gMDsKKwkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKwkJeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKwkJfQorCX0KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwlwQWQtPlN0YUNmZy5Qc20gPSBwc207CisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFR4UHJlYW1ibGUpCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJLy9UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7CisJaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gU0hPUlQgUFJFQU1CTEUpXG4iKSk7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDE7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFVwZGF0ZSBiYXNpYyByYXRlIGJpdG1hcAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlcikKK3sKKyAgICBJTlQgIGksIGo7CisgICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCisgICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07CisgICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOworICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKKyAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKKworCisgICAgLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KKyAgICAvL2lmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KKyAgICAvKiBFbmQgb2YgaWYgKi8KKworICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpCisgICAgeworICAgICAgICAvKiAoMiBeIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAtMSAqLworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKyAgICB7CisgICAgICAgIHN1cF9wW2ldICY9IDB4N2Y7CisgICAgICAgIGV4dF9wW2ldICY9IDB4N2Y7CisgICAgfSAvKiBFbmQgb2YgZm9yICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoYml0bWFwICYgKDEgPDwgaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgc3VwX3Bbal0gfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KKyAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KKyAgICB9IC8qIEVuZCBvZiBmb3IgKi8KK30gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLworCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KKy8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4gCUJPT0xFQU4JCSAJCWJMaW5rVXAsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJaW50IGksIG51bTsKKwlVQ0hBUiBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7CisJVUNIQVIgTWluU3VwcG9ydCA9IFJBVEVfNTQ7CisJVUxPTkcgQmFzaWNSYXRlQml0bWFwID0gMDsKKwlVQ0hBUiBDdXJyQmFzaWNSYXRlID0gUkFURV8xOworCVVDSEFSICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisJVUNIQVIJCQkJCUh0TWNzID0gTUNTX0FVVE87CisKKwkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKKwlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKKworCW51bSA9IDA7CisJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOworCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOworCQl9CisJCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKKwl9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKworCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCUh0TWNzIAkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKKwkJCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKKwkJeworCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID0gTWF4RGVzaXJlOworCXBNaW5IdFBoeS0+d29yZCA9IDA7CisJcE1heEh0UGh5LT53b3JkID0gMDsKKwlwSHRQaHktPndvcmQgPSAwOworCisJLy8gQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZQorCS8vIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkCisJaWYgKG51bSA8PSAxKQorCXsKKwkJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKKwkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IEZBTFNFOworCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCS8vT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOworCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gVFJVRTsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisJfQorCisjaWYgMQorCWlmIChIdE1jcyAhPSBNQ1NfQVVUTykKKwl7CisJCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBGQUxTRTsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkvL09QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKKwkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IFRSVUU7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXsKKwkJcFN1cFJhdGUgPSAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXTsKKwkJcEV4dFJhdGUgPSAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXTsKKwkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCX0KKworCS8vIGZpbmQgbWF4IHN1cHBvcnRlZCByYXRlCisJZm9yIChpPTA7IGk8U3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJc3dpdGNoIChwU3VwUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogICBSYXRlID0gUkFURV8xOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOwkgYnJlYWs7CisJCQljYXNlIDQ6ICAgUmF0ZSA9IFJBVEVfMjsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsJIGJyZWFrOworCQkJY2FzZSAxMTogIFJhdGUgPSBSQVRFXzVfNTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsJIGJyZWFrOworCQkJY2FzZSAyMjogIFJhdGUgPSBSQVRFXzExOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OwkgYnJlYWs7CisJCQljYXNlIDEyOiAgUmF0ZSA9IFJBVEVfNjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOyAgYnJlYWs7CisJCQljYXNlIDE4OiAgUmF0ZSA9IFJBVEVfOTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsJIGJyZWFrOworCQkJY2FzZSAyNDogIFJhdGUgPSBSQVRFXzEyOwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7ICBicmVhazsKKwkJCWNhc2UgMzY6ICBSYXRlID0gUkFURV8xODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsJIGJyZWFrOworCQkJY2FzZSA0ODogIFJhdGUgPSBSQVRFXzI0OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7ICBicmVhazsKKwkJCWNhc2UgNzI6ICBSYXRlID0gUkFURV8zNjsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsJIGJyZWFrOworCQkJY2FzZSA5NjogIFJhdGUgPSBSQVRFXzQ4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOwkgYnJlYWs7CisJCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CSBicmVhazsKKwkJCWRlZmF1bHQ6ICBSYXRlID0gUkFURV8xOwlicmVhazsKKwkJfQorCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOworCisJCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7CisJfQorCisJZm9yIChpPTA7IGk8RXh0UmF0ZUxlbjsgaSsrKQorCXsKKwkJc3dpdGNoIChwRXh0UmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogICBSYXRlID0gUkFURV8xOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOwkgYnJlYWs7CisJCQljYXNlIDQ6ICAgUmF0ZSA9IFJBVEVfMjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsJIGJyZWFrOworCQkJY2FzZSAxMTogIFJhdGUgPSBSQVRFXzVfNTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsJIGJyZWFrOworCQkJY2FzZSAyMjogIFJhdGUgPSBSQVRFXzExOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OwkgYnJlYWs7CisJCQljYXNlIDEyOiAgUmF0ZSA9IFJBVEVfNjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOyAgYnJlYWs7CisJCQljYXNlIDE4OiAgUmF0ZSA9IFJBVEVfOTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsJIGJyZWFrOworCQkJY2FzZSAyNDogIFJhdGUgPSBSQVRFXzEyOwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7ICBicmVhazsKKwkJCWNhc2UgMzY6ICBSYXRlID0gUkFURV8xODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsJIGJyZWFrOworCQkJY2FzZSA0ODogIFJhdGUgPSBSQVRFXzI0OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7ICBicmVhazsKKwkJCWNhc2UgNzI6ICBSYXRlID0gUkFURV8zNjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsJIGJyZWFrOworCQkJY2FzZSA5NjogIFJhdGUgPSBSQVRFXzQ4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOwkgYnJlYWs7CisJCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CSBicmVhazsKKwkJCWRlZmF1bHQ6ICBSYXRlID0gUkFURV8xOwlicmVhazsKKwkJfQorCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOworCisJCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTEVHQUNZX0JBU0lDX1JBVEUsIEJhc2ljUmF0ZUJpdG1hcCk7CisKKwkvLyBidWcgZml4CisJLy8gcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gQmFzaWNSYXRlQml0bWFwOworCisJLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKKwkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKKwkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKKwkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOworCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KKwlpZiAoTWF4U3VwcG9ydCA8IE1heERlc2lyZSkKKwkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4U3VwcG9ydDsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heERlc2lyZTsKKworCXBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA9IE1pblN1cHBvcnQ7CisJLy8gMjAwMy0wNy0zMSBqb2huIC0gMjUwMCBkb2Vzbid0IGhhdmUgZ29vZCBzZW5zaXRpdml0eSBhdCBoaWdoIE9GRE0gcmF0ZXMuIHRvIGluY3JlYXNlIHRoZSBzdWNjZXNzCisJLy8gcmF0aW8gb2YgaW5pdGlhbCBESENQIHBhY2tldCBleGNoYW5nZSwgVFggcmF0ZSBzdGFydHMgZnJvbSBhIGxvd2VyIHJhdGUgZGVwZW5kaW5nCisJLy8gb24gYXZlcmFnZSBSU1NJCisJLy8JIDEuIFJTU0kgPj0gLTcwZGIsIHN0YXJ0IGF0IDU0IE1icHMgKHNob3J0IGRpc3RhbmNlKQorCS8vCSAyLiAtNzAgPiBSU1NJID49IC03NSwgc3RhcnQgYXQgMjQgTWJwcyAobWlkIGRpc3RhbmNlKQorCS8vCSAzLiAtNzUgPiBSU1NJLCBzdGFydCBhdCAxMSBNYnBzIChsb25nIGRpc3RhbmNlKQorCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkvKiAmJgorCS8vCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSovKQorCWlmICgqYXV0b19yYXRlX2N1cl9wKQorCXsKKwkJc2hvcnQgZGJtID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCWRibSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlpZiAoYkxpbmtVcCA9PSBUUlVFKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCWlmIChkYm0gPCAtNzUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzExOworCQllbHNlIGlmIChkYm0gPCAtNzApCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OworCisJCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQorCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlID4gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7CisKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IHBIdFBoeS0+ZmllbGQuU1RCQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBIdFBoeS0+ZmllbGQuTUNTOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEh0UGh5LT5maWVsZC5NT0RFOworCX0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7CisJfQorCWVsc2UKKwl7CisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdOworCQlpZiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID49IFJBVEVfNiAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKQorCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTt9CisJCWVsc2UKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTt9CisJfQorCisJcEh0UGh5LT53b3JkID0gKHBNYXhIdFBoeS0+d29yZCk7CisJaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkID0gcE1heEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCA9IHBNaW5IdFBoeS0+d29yZDsKKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCQl7CisJCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJY2FzZSBQSFlfMTFCOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCisvLyNpZmRlZglXSUZJX1RFU1QKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xMTsKKy8vI2Vsc2UKKy8vCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisvLyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfMTFHOgorCQkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzJfNEc6CisJCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQlicmVhazsKKwkJfQorCQkvLworCQkvLyBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4KKwkJLy8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOworCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07CisJCWVsc2UKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IFJBVEVfMTsKKwkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAorCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCisJCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCisJCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nLgorCQlJbnB1dCBXY2lkIHZhbHVlIGlzIHZhbGlkIGZvciAyIGNhc2UgOgorCQkxLiBpdCdzIHVzZWQgZm9yIFN0YXRpb24gaW4gaW5mcmEgbW9kZSB0aGF0IGNvcHkgQVAgcmF0ZSB0byBNYWN0YWJsZS4KKwkJMi4gT1IgU3RhdGlvbiAJaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCkKK3sKKwlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7CisJQ0hBUiAJaTsgLy8gMyozCisJUlRfSFRfQ0FQQUJJTElUWSAJKnBSdEh0Q2FwID0gTlVMTDsKKwlSVF9IVF9QSFlfSU5GTwkJKnBBY3RpdmVIdFBoeSA9IE5VTEw7CisJVUxPTkcJCUJhc2ljTUNTOworCVVDSEFSIGosIGJpdG1hc2s7CisJUFJUX0hUX1BIWV9JTkZPCQkJcERlc2lyZUh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPT09PiBcbiIpKTsKKworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcERlc2lyZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBBY3RpdmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHk7CisJCXBBY3RpdmVIdFBoeSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvOworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9cEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMF0rKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCWlmIChwRGVzaXJlSHRQaHktPmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXJldHVybjsKKworCQlwUnRIdENhcCA9ICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHk7CisJCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzBdKyhwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uTUNTU2V0WzFdPDw4KSsoU3RiY01jczw8MTYpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpICYmIChwUnRIdENhcC0+UnhTVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCQllbHNlCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJfQorCisJLy8gRGVjaWRlIE1BWCBodCByYXRlLgorCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKworICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjQwKTsKKworCWZvciAoaT0yMzsgaT49MDsgaS0tKSAvLyAzKjMKKwl7CisJCWogPSBpLzg7CisJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKworCQlpZiAoKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGk9PTApCisJCQlicmVhazsKKwl9CisKKwkvLyBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/CisJcE1pbkh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOworCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNUQkMgPSAwOworCXBNaW5IdFBoeS0+ZmllbGQuU2hvcnRHSSA9IDA7CisJLy9JZiBTVEEgYXNzaWducyBmaXhlZCByYXRlLiB1cGRhdGUgdG8gZml4ZWQgaGVyZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikpCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKKwkJeworCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFVzZSBGaXhlZCBNQ1MgPSAlZFxuIixwTWluSHRQaHktPmZpZWxkLk1DUykpOworCQl9CisKKwkJZm9yIChpPTIzOyAoQ0hBUilpID49IDA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGVjaWRlIGh0IHJhdGUKKwlwSHRQaHktPmZpZWxkLlNUQkMgPSBwTWF4SHRQaHktPmZpZWxkLlNUQkM7CisJcEh0UGh5LT5maWVsZC5CVyA9IHBNYXhIdFBoeS0+ZmllbGQuQlc7CisJcEh0UGh5LT5maWVsZC5NT0RFID0gcE1heEh0UGh5LT5maWVsZC5NT0RFOworCXBIdFBoeS0+ZmllbGQuTUNTID0gcE1heEh0UGh5LT5maWVsZC5NQ1M7CisJcEh0UGh5LT5maWVsZC5TaG9ydEdJID0gcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJOworCisJLy8gdXNlIGRlZmF1bHQgbm93LiBydDI4NjAKKwlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbMF0gIT0gMHhmZikKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCWVsc2UKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsIHBBY3RpdmVIdFBoeS0+TUNTU2V0WzBdLHBIdFBoeS0+ZmllbGQuTUNTLAorCQlwSHRQaHktPmZpZWxkLkJXLCBwSHRQaHktPmZpZWxkLlNob3J0R0ksIHBIdFBoeS0+ZmllbGQuTU9ERSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCk7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBic3NfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQorICoJXHJldHVybiBub25lCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc1RhYmxlSW5pdCgKKwlJTiBCU1NfVEFCTEUgKlRhYikKK3sKKwlpbnQgaTsKKworCVRhYi0+QnNzTnIgPSAwOworICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CU1NfVEFCTEU7IGkrKykKKwl7CisJCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCVRhYi0+QnNzRW50cnlbaV0uUnNzaSA9IC0xMjc7CS8vIGluaXRpYWwgdGhlIHJzc2kgYXMgYSBtaW5pbXVtIHZhbHVlCisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPm51bUFzT3JpZ2luYXRvciA9IDA7CisJVGFiLT5udW1Bc1JlY2lwaWVudCA9IDA7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCVRhYi0+QkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyohIFxicmllZiBzZWFyY2ggdGhlIEJTUyB0YWJsZSBieSBTU0lECisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gc3NpZCBTU0lEIHN0cmluZworICoJXHJldHVybiBpbmRleCBvZiB0aGUgdGFibGUsIEJTU19OT1RfRk9VTkQgaWYgbm90IGluIHRoZSB0YWJsZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIHNlYXJjaCBieSBzZXF1ZW50aWFsIHNlYXJjaAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBwQnNzaWQsCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQkvLworCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KKwkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KKwkJLy8KKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkgJiYKKwkJCVNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgQnNzaWQsCisJSU4gUFVDSEFSCSBwU3NpZCwKKwlJTiBVQ0hBUgkgU3NpZExlbiwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJCU1BQ19BRERSX0VRVUFMKCYoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCksIEJzc2lkKSAmJgorCQkJKFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShwU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pKSB8fAorCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFplcm9Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSkpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUCUJTU19UQUJMRSAqVGFiLAorCUlOCQlQVUNIQVIJICBwQnNzaWQsCisJSU4JCVVDSEFSCSAgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCisJCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCisJCXsKKwkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQl9CisJCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJVGFiLT5Cc3NOciAtPSAxOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCURlbGV0ZSB0aGUgT3JpZ2luYXRvciBFbnRyeSBpbiBCQXRhYmxlLiBPciBkZWNyZWFzZSBudW1BcyBPcmlnaW5hdG9yIGJ5IDEgaWYgbmVlZGVkLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKK3sKKworCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVEZWxldGVPUklFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBT1JJRW50cnktPlRva2VuID0gMTsKKwkJLy8gTm90IGNsZWFyIFNlcXVlbmNlIGhlcmUuCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgQnNzRW50cnlTZXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19FTlRSWSAqcEJzcywKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIFBDRl9QQVJNIHBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7CisJLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAorCXBCc3MtPkhpZGRlbiA9IDE7CisJaWYgKFNzaWRMZW4gPiAwKQorCXsKKwkJLy8gRm9yIGhpZGRlbiBTU0lEIEFQLCBpdCBtaWdodCBzZW5kIGJlYWNvbiB3aXRoIFNTSUQgbGVuIGVxdWFsIHRvIDAKKwkJLy8gT3Igc2VuZCBiZWFjb24gL3Byb2JlIHJlc3BvbnNlIHdpdGggU1NJRCBsZW4gbWF0Y2hpbmcgcmVhbCBTU0lEIGxlbmd0aCwKKwkJLy8gYnV0IFNTSUQgaXMgYWxsIHplcm8uIHN1Y2ggYXMgIjAwLTAwLTAwLTAwIiB3aXRoIGxlbmd0aCA0LgorCQkvLyBXZSBoYXZlIHRvIHByZXZlbnQgdGhpcyBjYXNlIG92ZXJ3cml0ZSBjb3JyZWN0IHRhYmxlCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU3NpZCwgWmVyb1NzaWQsIFNzaWRMZW4pID09IDApCisJCXsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KHBCc3MtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCXBCc3MtPlNzaWRMZW4gPSBTc2lkTGVuOworCQkJcEJzcy0+SGlkZGVuID0gMDsKKwkJfQorCX0KKwllbHNlCisJCXBCc3MtPlNzaWRMZW4gPSAwOworCXBCc3MtPkJzc1R5cGUgPSBCc3NUeXBlOworCXBCc3MtPkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJeworCQlpZiAocENmUGFybS0+YlZhbGlkKQorCQl7CisJCQlwQnNzLT5DZnBDb3VudCA9IHBDZlBhcm0tPkNmcENvdW50OworCQkJcEJzcy0+Q2ZwUGVyaW9kID0gcENmUGFybS0+Q2ZwUGVyaW9kOworCQkJcEJzcy0+Q2ZwTWF4RHVyYXRpb24gPSBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbjsKKwkJCXBCc3MtPkNmcER1clJlbWFpbmluZyA9IHBDZlBhcm0tPkNmcER1clJlbWFpbmluZzsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKKwl9CisKKwlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOworCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKKwkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KKwlwQnNzLT5Qcml2YWN5ID0gQ0FQX0lTX1BSSVZBQ1lfT04ocEJzcy0+Q2FwYWJpbGl0eUluZm8pOworCUFTU0VSVChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlpZiAoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJcEJzcy0+U3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJQVNTRVJUKEV4dFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKwlwQnNzLT5OZXdFeHRDaGFuT2Zmc2V0ID0gTmV3RXh0Q2hhbk9mZnNldDsKKwlwQnNzLT5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlwQnNzLT5DaGFubmVsID0gQ2hhbm5lbDsKKwlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+UnNzaSA9IFJzc2k7CisJLy8gVXBkYXRlIENraXBGbGFnLiBpZiBub3QgZXhpc3RzLCB0aGUgdmFsdWUgaXMgMHgwCisJcEJzcy0+Q2tpcEZsYWcgPSBDa2lwRmxhZzsKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IEZpeGVkIElFcworCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkZpeElFcy5UaW1lc3RhbXAsICZUaW1lU3RhbXAsIDgpOworCXBCc3MtPkZpeElFcy5CZWFjb25JbnRlcnZhbCA9IEJlYWNvblBlcmlvZDsKKwlwQnNzLT5GaXhJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMKKwlpZiAoTGVuZ3RoVklFICE9IDApCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IExlbmd0aFZJRTsKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+VmFySUVzLCBwVklFLCBwQnNzLT5WYXJJRUxlbik7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPlZhcklFTGVuID0gMDsKKwl9CisKKwlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOworCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKEh0Q2FwYWJpbGl0eUxlbj4gMCkKKwl7CisJCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKKwkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCXsKKwkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisKKwkgCQkJaWYgKChwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiA+IDIpJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCSAJCQl7CisJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKKwkgCQkJfQorCSAJCQllbHNlIGlmICgocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCQkJeworCQkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCUJzc0NpcGhlclBhcnNlKHBCc3MpOworCisJLy8gbmV3IGZvciBRT1MKKwlpZiAocEVkY2FQYXJtKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+RWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+RWRjYVBhcm0uYlZhbGlkID0gRkFMU0U7CisJaWYgKHBRb3NDYXBhYmlsaXR5KQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UW9zQ2FwYWJpbGl0eSwgcFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5Rb3NDYXBhYmlsaXR5LmJWYWxpZCA9IEZBTFNFOworCWlmIChwUWJzc0xvYWQpCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVBFSURfU1RSVUNUICAgICBwRWlkOworCQlVU0hPUlQgICAgICAgICAgTGVuZ3RoID0gMDsKKworCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAzKTsKKwkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IEZBTFNFOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJd2hpbGUgKChMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW4pIDw9IExlbmd0aFZJRSkKKwkJeworCQkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJCXsKKwkJCQljYXNlIElFX1dQQToKKwkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5XcGFJRS5JRSwgcEVpZCwgcEJzcy0+V3BhSUUuSUVMZW4pOworCQkJCQl9CisJCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgorICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisJCQkJCXsKKwkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKKwkJCQkJCXsKKwkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Sc25JRS5JRSwgcEVpZCwgcEJzcy0+UnNuSUUuSUVMZW4pOworCQkJfQorCQkJCWJyZWFrOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQljYXNlIElFX0NPVU5UUlk6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCBwRWlkLT5PY3RldCwgMyk7CisJCQkJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisgICAgICAgICAgICB9CisJCQlMZW5ndGggPSBMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKKy8qIQorICoJXGJyaWVmIGluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBic3MgdGFibGUKKyAqCVxwYXJhbSBwX3RhYiBUaGUgQlNTIHRhYmxlCisgKglccGFyYW0gQnNzaWQgQlNTSUQKKyAqCVxwYXJhbSBzc2lkIFNTSUQKKyAqCVxwYXJhbSBzc2lkX2xlbiBMZW5ndGggb2YgU1NJRAorICoJXHBhcmFtIGJzc190eXBlCisgKglccGFyYW0gYmVhY29uX3BlcmlvZAorICoJXHBhcmFtIHRpbWVzdGFtcAorICoJXHBhcmFtIHBfY2YKKyAqCVxwYXJhbSBhdGltX3dpbgorICoJXHBhcmFtIGNhcAorICoJXHBhcmFtIHJhdGVzCisgKglccGFyYW0gcmF0ZXNfbGVuCisgKglccGFyYW0gY2hhbm5lbF9pZHgKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlIElmIFNTSUQgaXMgaWRlbnRpY2FsLCB0aGUgb2xkIGVudHJ5IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworCVVMT05HCUlkeDsKKworCUlkeCA9IEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoVGFiLCBwQnNzaWQsICBTc2lkLCBTc2lkTGVuLCBDaGFubmVsTm8pOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCWlmIChUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCSAgICB7CisJCQkvLworCQkJLy8gSXQgbWF5IGhhcHBlbiB3aGVuIEJTUyBUYWJsZSB3YXMgZnVsbC4KKwkJCS8vIFRoZSBkZXNpcmVkIEFQIHdpbGwgbm90IGJlIGFkZGVkIGludG8gQlNTIFRhYmxlCisJCQkvLyBJbiB0aGlzIGNhc2UsIGlmIHdlIGZvdW5kIHRoZSBkZXNpcmVkIEFQIHRoZW4gb3ZlcndyaXRlIEJTUyBUYWJsZS4KKwkJCS8vCisJCQlpZighT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJeworCQkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3NpZCkgfHwKKwkJCQkJU1NJRF9FUVVBTChwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIFNzaWQsIFNzaWRMZW4pKQorCQkJCXsKKwkJCQkJSWR4ID0gVGFiLT5Cc3NPdmVybGFwTnI7CisJCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKyAgICAgICAgICAgICAgICAgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAoVGFiLT5Cc3NPdmVybGFwTnIrKykgJSBNQVhfTEVOX09GX0JTU19UQUJMRTsKKwkJCQl9CisJCQkJcmV0dXJuIElkeDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCXJldHVybiBCU1NfTk9UX0ZPVU5EOworCQkJfQorCQl9CisJCUlkeCA9IFRhYi0+QnNzTnI7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCVRhYi0+QnNzTnIrKzsKKwl9CisJZWxzZQorCXsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCxDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCX0KKworCXJldHVybiBJZHg7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gPSAwOworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPSAwOworfQorCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKQoreworCS8vIEV2ZW50IEEKKwlpZiAoSHRDYXBhYmlsaXR5TGVuID09IDApCisJeworCQlpZiAoVGFiLT5FdmVudEFObyA8IE1BWF9UUklHR0VSX0VWRU5UKQorCQl7CisJCQlSVE1QTW92ZU1lbW9yeShUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5CU1NJRCwgcEJzc2lkLCA2KTsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLmJWYWxpZCA9IFRSVUU7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DaGFubmVsID0gQ2hhbm5lbE5vOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ0RDb3VudGVyID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJCQlpZiAoUmVnQ2xhc3MgIT0gMCkKKwkJCXsKKwkJCQkvLyBCZWFjb24gaGFzIFJlZ3VsYXRvcnkgY2xhc3MgSUUuIFNvIHVzZSBiZWFjb24ncworCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gUmVnQ2xhc3M7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVXNlIFN0YXRpb24ncyBSZWd1bGF0b3J5IGNsYXNzIGluc3RlYWQuCisJCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9PSBUUlVFKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJeworCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMzOworCQkJCX0KKwkJCQllbHNlCisJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gPz87CisKKwkJCX0KKworCQkJVGFiLT5FdmVudEFObyArKzsKKwkJfQorCX0KKwllbHNlIGlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uSW50b2xlcmFudDQwKQorCXsKKwkJVGFiLT5FdmVudEJDb3VudERvd24gPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUcmlnZ2VyIEV2ZW50IHRhYmxlIE1haW50YWluZW5jZSBjYWxsZWQgb25jZSBldmVyeSBzZWNvbmQuCisKKwlBcmd1bWVudHM6CisJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJaTsKKwlCT09MRUFOCQkJYk5vdGlmeSA9IEZBTFNFOworCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCAmJiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPiAwKSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXItLTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA9PSAwKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7CisJCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vIC0tOworCQkJCS8vIE5lZWQgdG8gc2VuZCAyMC80MCBDb2V4aXN0ZW5jZSBOb3RpZnkgZnJhbWUgaWYgaGFzIHN0YXR1cyBjaGFuZ2UuCisJCQkJYk5vdGlmeSA9IFRSVUU7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93bi0tOworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9PSAwKQorCQkJYk5vdGlmeSA9IFRSVUU7CisJfQorCisJaWYgKGJOb3RpZnkgPT0gVFJVRSkKKwkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOCUNIQVIgU3NpZFtdLAorCUlOCVVDSEFSIFNzaWRMZW4pCit7CisJSU5UIGk7CisJQnNzVGFibGVJbml0KE91dFRhYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlCU1NfRU5UUlkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisJCUJPT0xFQU4JYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOworCisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKyAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCWlmIChwSW5Cc3MtPkhpZGRlbikKKwkJCQliSXNIaWRkZW5BcEluY2x1ZGVkID0gVFJVRTsKKwkJfQorCisJCWlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmCisJCQkoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwSW5Cc3MtPlNzaWQsIHBJbkJzcy0+U3NpZExlbikgfHwgYklzSGlkZGVuQXBJbmNsdWRlZCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkvLyBJZiBubyBDb3VudHJ5IElFIGV4aXN0cyBubyBDb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgd2hlbiBJRUVFODAyMTFkQ2xpZW50TW9kZSBpcyBzdHJpY3QuCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0KSAmJgorCQkJCShwSW5Cc3MtPmJIYXNDb3VudHJ5SUUgPT0gRkFMU0UpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID09IFJ0ODAyXzExX0RfU3RyaWN0LCBidXQgdGhpcyBBUCBkb2Vzbid0IGhhdmUgY291bnRyeSBJRS5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKSAmJgorCQkJCQkJKHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKKwkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKKwkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKSAmJgorCQkJCQkJKHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5XZXBTdGF0dXM9JWQsIHdoaWxlIHBJbkJzcy0+V2VwU3RhdHVzPSVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBJbkJzcy0+V2VwU3RhdHVzKSk7CisJCQkJLy8KKwkJCQkvLyBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKCFwSW5Cc3MtPmJTRVMpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBTaW5jZSB0aGUgQVAgaXMgdXNpbmcgaGlkZGVuIFNTSUQsIGFuZCB3ZSBhcmUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQU5ZCisJCQkvLyBJdCBkZWZpbml0ZWx5IHdpbGwgZmFpbC4gU28sIHNraXAgaXQuCisJCQkvLyBDQ1ggYWxzbyByZXF1aXJlIG5vdCBldmVuIHRyeSB0byBjb25uZWN0IGl0ISEKKwkJCWlmIChTc2lkTGVuID09IDApCisJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQkFORF9XSURUSF8yMCkKKwkJCQkJeworCQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCisJCQlPdXRUYWItPkJzc05yKys7CisJCX0KKwkJZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJiAoU3NpZExlbiA9PSAwKSkKKwkJeworCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgorCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBOZXcgZm9yIFdQQTIKKwkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXsKKwkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCisJCQkJCS8vIE5vbmUgbWF0Y2hlZAorCQkJCQljb250aW51ZTsKKworCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisKKwkJaWYgKE91dFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCisJCQlicmVhazsKKwl9CisKKwlCc3NUYWJsZVNvcnRCeVJzc2koT3V0VGFiKTsKK30KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVTb3J0QnlSc3NpKAorCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYikKK3sKKwlJTlQgCSAgaSwgajsKKwlCU1NfRU5UUlkgVG1wQnNzOworCisJZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCisJeworCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCisJCXsKKwkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1ZPSUQgQnNzQ2lwaGVyUGFyc2UoCisJSU4gT1VUCVBCU1NfRU5UUlkJcEJzcykKK3sKKwlQRUlEX1NUUlVDVCAJCSBwRWlkOworCVBVQ0hBUgkJCQlwVG1wOworCVBSU05fSUVfSEVBREVSX1NUUlVDVAkJCXBSc25IZWFkZXI7CisJUENJUEhFUl9TVUlURV9TVFJVQ1QJCQlwQ2lwaGVyOworCVBBS01fU1VJVEVfU1RSVUNUCQkJCXBBS007CisJVVNIT1JUCQkJCQkJCUNvdW50OworCUlOVAkJCQkJCQkJTGVuZ3RoOworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVRtcENpcGhlcjsKKworCS8vCisJLy8gV2VwU3RhdHVzIHdpbGwgYmUgcmVzZXQgbGF0ZXIsIGlmIEFQIGFubm91bmNlIFRLSVAgb3IgQUVTIG9uIHRoZSBiZWFjb24gZnJhbWUuCisJLy8KKwlpZiAocEJzcy0+UHJpdmFjeSkKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl9CisJLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKKwlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworCS8vIEluaXQgV1BBIHNldHRpbmcKKwlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOworCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKKworCS8vIEluaXQgV1BBMiBzZXR0aW5nCisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEyLmJNaXhNb2RlIAkgPSBGQUxTRTsKKworCisJTGVuZ3RoID0gKElOVCkgcEJzcy0+VmFySUVMZW47CisKKwl3aGlsZSAoTGVuZ3RoID4gMCkKKwl7CisJCS8vIFBhcnNlIGNpcGhlciBzdWl0ZSBiYXNlIG9uIFdQQTEgJiBXUEEyLCB0aGV5IHNob3VsZCBiZSBwYXJzZWQgZGlmZmVyZW50bHkKKwkJcFRtcCA9ICgoUFVDSEFSKSBwQnNzLT5WYXJJRXMpICsgcEJzcy0+VmFySUVMZW4gLSBMZW5ndGg7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBUbXA7CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1dQQToKKwkJCQkvL1BhcnNlIENpc2NvIElFX1dQQSAoTEVBUCwgQ0NLTSwgZXRjLikKKwkJCQlpZiAoIE5kaXNFcXVhbE1lbW9yeSgocFRtcCs4KSwgQ0lTQ09fT1VJLCAzKSkKKwkJCQl7CisJCQkJCXBUbXAgICArPSAxMTsKKwkJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OgkvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpZiBDaXNjbyBJRV9XUEEsIGJyZWFrCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisJCQkJeworCQkJCQlwQnNzLT5iU0VTID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0gMSkKKwkJCQl7CisJCQkJCS8vIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUKKwkJCQkvLyBUaGlzIHBhcnQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgd2hlbiBBUCBzdXBwb3J0ZWQgbXVsdGlwbGUgY2lwaGVyIHN1aXRlLgorCQkJCS8vIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLgorCQkJCS8vIHBUbXAgPSAoUFVDSEFSKSBwRWlkLT5PY3RldDsKKwkJCQlwVG1wICAgKz0gMTE7CisKKwkJCQkvLyBDaXBoZXIgU3VpdGUgU2VsZWN0b3JzIGZyb20gU3BlYyBQODAyLjExaS9EMy4yIFAyNi4KKwkJCQkvLwlWYWx1ZQkgICBNZWFuaW5nCisJCQkJLy8JMAkJCU5vbmUKKwkJCQkvLwkxCQkJV0VQLTQwCisJCQkJLy8JMgkJCVRraXAKKwkJCQkvLwkzCQkJV1JBUAorCQkJCS8vCTQJCQlBRVMKKwkJCQkvLwk1CQkJV0VQLTEwNAorCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwkJCQl3aGlsZSAoQ291bnQgPiAwKQorCQkJCXsKKwkJCQkJLy8gU2tpcCBPVUkKKwkJCQkJcFRtcCArPSAzOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOworCQkJCQl9CisJCQkJCXBUbXArKzsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQlwVG1wICAgKz0gMzsKKworCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQorCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IDE7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZQkgID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQkJLy8gUGF0Y2hlZCBidWdzIGZvciBvbGQgZHJpdmVyCisJCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9SU046CisJCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7CisKKwkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQorCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKKworCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgorCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCisJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDU6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCisJCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKworCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgorCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQl7CisJCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAorCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycworCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJc3dpdGNoIChwQUtNLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKKworCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQorCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQl7CisJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gcEJzcy0+V1BBMi5Hcm91cENpcGhlcjsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzIAkJPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCisJCQkJLy8gNi4gR2V0IFJTTiBjYXBhYmlsaXR5CisJCQkJLy9wQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEJzcy0+V1BBMi5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJTGVuZ3RoIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1hY190YWJsZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYgZ2VuZXJhdGVzIGEgcmFuZG9tIG1hYyBhZGRyZXNzIHZhbHVlIGZvciBJQlNTIEJTU0lECisgKglccGFyYW0gQWRkciB0aGUgYnNzaWQgbG9jYXRpb24KKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqLworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcikKK3sKKwlJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwl7CisJCXBBZGRyW2ldID0gUmFuZG9tQnl0ZShwQWQpOworCX0KKworCXBBZGRyWzBdID0gKHBBZGRyWzBdICYgMHhmZSkgfCAweDAyOyAgLy8gdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHgKK30KKworLyohIFxicmllZiBpbml0IHRoZSBtYW5hZ2VtZW50IG1hYyBmcmFtZSBoZWFkZXIKKyAqCVxwYXJhbSBwX2hkciBtYWMgaGVhZGVyCisgKglccGFyYW0gc3VidHlwZSBzdWJ0eXBlIG9mIHRoZSBmcmFtZQorICoJXHBhcmFtIHBfZHMgZGVzdGluYXRpb24gYWRkcmVzcywgZG9uJ3QgY2FyZSBpZiBpdCBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUgdGhlIHN0YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHBBZC0+U3RhQ2ZnCisgKgkgLSBic3NpZAorICoJIC0gc3RhdGlvbiBhZGRyZXNzCisgKglccG9zdAorICoJXG5vdGUgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworLy8JaWYgKFN1YlR5cGUgPT0gU1VCVFlQRV9BQ0spCS8vIHNhbXBsZSwgbm8gdXNlLCBpdCB3aWxsIGNvbmZsaWN0IHdpdGggQUNUSU9OIGZyYW1lIHN1YiB0eXBlCisvLwkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwSGRyODAyMTEtPkZDLlRvRHMgPSBUb0RzOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcERBKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWVtX21nbXQuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgcm91dGluZSBidWlsZCBhbiBvdXRnb2luZyBmcmFtZSwgYW5kIGZpbGwgYWxsIGluZm9ybWF0aW9uIHNwZWNpZmllZAorICogaW4gYXJndW1lbnQgbGlzdCB0byB0aGUgZnJhbWUgYm9keS4gVGhlIGFjdHVhbCBmcmFtZSBzaXplIGlzIHRoZSBzdW1tYXRpb24KKyAqIG9mIGFsbCBhcmd1bWVudHMuCisgKiBpbnB1dCBwYXJhbXM6CisgKgkJQnVmZmVyIC0gcG9pbnRlciB0byBhIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHNlZ21lbnQKKyAqCQlhcmdzIC0gYSBsaXN0IG9mIDxpbnQgYXJnX3NpemUsIGFyZz4gcGFpcnMuCisgKgkJTk9URSBOT1RFIE5PVEUhISEhIHRoZSBsYXN0IGFyZ3VtZW50IG11c3QgYmUgTlVMTCwgb3RoZXJ3aXNlIHRoaXMKKyAqCQkJCQkJICAgZnVuY3Rpb24gd2lsbCBGQUlMISEhCisgKiByZXR1cm46CisgKgkJU2l6ZSBvZiB0aGUgYnVmZmVyCisgKiB1c2FnZToKKyAqCQlNYWtlT3V0Z29pbmdGcmFtZShCdWZmZXIsIG91dHB1dF9sZW5ndGgsIDIsICZmYywgMiwgJmR1ciwgNiwgcF9hZGRyMSwgNixwX2FkZHIyLCBFTkRfT0ZfQVJHUyk7CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpGcmFtZUxlbiwgLi4uKQoreworCUNIQVIgICAqcDsKKwlpbnQgCWxlbmc7CisJVUxPTkcJVG90TGVuZzsKKwl2YV9saXN0IEFyZ3M7CisKKwkvLyBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGgKKwlUb3RMZW5nID0gMDsKKwl2YV9zdGFydChBcmdzLCBGcmFtZUxlbik7CisJZG8KKwl7CisJCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKKwkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCisJCXsKKwkJCWJyZWFrOworCQl9CisJCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOworCQlOZGlzTW92ZU1lbW9yeSgmQnVmZmVyW1RvdExlbmddLCBwLCBsZW5nKTsKKwkJVG90TGVuZyA9IFRvdExlbmcgKyBsZW5nOworCX0gd2hpbGUoVFJVRSk7CisKKwl2YV9lbmQoQXJncyk7IC8qIGNsZWFuIHVwICovCisJKkZyYW1lTGVuID0gVG90TGVuZzsKKwlyZXR1cm4gVG90TGVuZzsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gbWxtZV9xdWV1ZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucworICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBBbHdheXMJICAgUmV0dXJuIE5ESVNfU1RBVEVfU1VDQ0VTUyBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJQmVjYXVzZSB0aGlzIGlzIGRvbmUgb25seSBvbmNlIChhdCB0aGUgaW5pdCBzdGFnZSksIG5vIG5lZWQgdG8gYmUgbG9ja2VkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK05ESVNfU1RBVFVTIE1sbWVRdWV1ZUluaXQoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJSU5UIGk7CisKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmUXVldWUtPkxvY2spOworCisJUXVldWUtPk51bQk9IDA7CisJUXVldWUtPkhlYWQgPSAwOworCVF1ZXVlLT5UYWlsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01MTUVfUVVFVUU7IGkrKykKKwl7CisJCVF1ZXVlLT5FbnRyeVtpXS5PY2N1cGllZCA9IEZBTFNFOworCQlRdWV1ZS0+RW50cnlbaV0uTXNnTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoUXVldWUtPkVudHJ5W2ldLk1zZywgTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCX0KKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKiEgXGJyaWVmCSBFbnF1ZXVlIGEgbWVzc2FnZSBmb3Igb3RoZXIgdGhyZWFkcywgaWYgdGhleSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgdG8gTUxNRSB0aHJlYWQKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAorICoJXHBhcmFtCSBNc2dUeXBlICBUaGUgTWVzc2FnZSBUeXBlCisgKglccGFyYW0JIE1zZ0xlbiAgIFRoZSBNZXNzYWdlIGxlbmd0aAorICoJXHBhcmFtCSpNc2cJICBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGVucXVldWUgaXMgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQkgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpCit7CisJSU5UIFRhaWw7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCVRhaWwgPSBRdWV1ZS0+VGFpbDsKKwlRdWV1ZS0+VGFpbCsrOworCVF1ZXVlLT5OdW0rKzsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPlRhaWwgPSAwOworCX0KKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gUkVTRVJWRURfV0NJRDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIFJlY3YgZ2V0cyBhIE1MTUUgbWVzc2FnZQorICoJXHBhcmFtCSpRdWV1ZQkJCSBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCisgKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCisgKglccGFyYW0JIE1zZ0xlbiAJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCisgKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCisJSU4gVUNIQVIgUnNzaTAsCisJSU4gVUNIQVIgUnNzaTEsCisJSU4gVUNIQVIgUnNzaTIsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVQ0hBUiBTaWduYWwpCit7CisJSU5UIAkJIFRhaWwsIE1hY2hpbmU7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJSU5UCQkgTXNnVHlwZTsKKwlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYoQVRFX09OKHBBZCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1NcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIscEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gT0ssIHdlIGdvdCBhbGwgdGhlIGluZm9ybWF0aW9ucywgaXQgaXMgdGltZSB0byBwdXQgdGhpbmdzIGludG8gcXVldWUKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5Mb3dQYXJ0ID0gVGltZVN0YW1wTG93OworCVF1ZXVlLT5FbnRyeVtUYWlsXS5UaW1lU3RhbXAudS5IaWdoUGFydCA9IFRpbWVTdGFtcEhpZ2g7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kwID0gUnNzaTA7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kxID0gUnNzaTE7CisJUXVldWUtPkVudHJ5W1RhaWxdLlJzc2kyID0gUnNzaTI7CisJUXVldWUtPkVudHJ5W1RhaWxdLlNpZ25hbCA9IFNpZ25hbDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IChVQ0hBUilXY2lkOworCisJUXVldWUtPkVudHJ5W1RhaWxdLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisKKwlpZiAoTXNnICE9IE5VTEwpCisJeworCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKiEgXGJyaWVmCSBEZXF1ZXVlIGEgbWVzc2FnZSBmcm9tIHRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkqRWxlbQkgIFRoZSBtZXNzYWdlIGRlcXVldWVkIGZyb20gTUxNRSBRdWV1ZQorICoJXHJldHVybiAgVFJVRSBpZiB0aGUgRWxlbSBjb250YWlucyBzb21ldGhpbmcsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZURlcXVldWUoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUsCisJT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJKkVsZW0gPSAmKFF1ZXVlLT5FbnRyeVtRdWV1ZS0+SGVhZF0pOworCVF1ZXVlLT5OdW0tLTsKKwlRdWV1ZS0+SGVhZCsrOworCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+SGVhZCA9IDA7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQlDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVVDSEFSIGk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzCisJCS8vIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lcgorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCSAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCSAgICZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCisJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOworCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJcEFkLT5NbG1lLkRsc01hY2hpbmUuQ3VyclN0YXRlICAgID0gRExTX0lETEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit9CisKKy8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUJPT0xFQU4gQW5zOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJQW5zID0gKFF1ZXVlLT5OdW0gPT0gMCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKKyAqCVxwYXJhbQkgKlF1ZXVlIAkgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKworCXJldHVybiBBbnM7Cit9CisKKy8qISBcYnJpZWYJIFRoZSBkZXN0cnVjdG9yIG9mIE1MTUUgUXVldWUKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUNsZWFyIE1sbWUgUXVldWUsIFNldCBRdWV1ZS0+TnVtIHRvIFplcm8uCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpwUXVldWUpCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworCXBRdWV1ZS0+TnVtICA9IDA7CisJcFF1ZXVlLT5IZWFkID0gMDsKKwlwUXVldWUtPlRhaWwgPSAwOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Cit9CisKKy8qISBcYnJpZWYJIFRvIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UgdHlwZSBpZiB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSBleHRlcm5hbAorICoJXHBhcmFtCXBGcmFtZQkJICAgVGhlIGZyYW1lIHJlY2VpdmVkCisgKglccGFyYW0JKk1hY2hpbmUJICAgVGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkqTXNnVHlwZQkgICB0aGUgbWVzc2FnZSB0eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBzdWJzdGl0dXRpb24gaXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQk9PTEVBTiBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorCU9VVCBJTlQgKk1hY2hpbmUsCisJT1VUIElOVCAqTXNnVHlwZSkKK3sKKwlVU0hPUlQJU2VxOworCVVDSEFSCUVBUFR5cGU7CisJUFVDSEFSCXBEYXRhOworCisJLy8gUG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGZyYW1lcyBpbmNsdWRpbmcgU05BUCBoZWFkZXIKKwlwRGF0YSA9IChQVUNIQVIpIHBGcmFtZSArIExFTkdUSF84MDJfMTE7CisKKwkvLyBUaGUgb25seSBkYXRhIHR5cGUgd2lsbCBwYXNzIHRvIHRoaXMgZnVuY3Rpb24gaXMgRUFQT0wgZnJhbWUKKwlpZiAocEZyYW1lLT5IZHIuRkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCXsKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQX0FJUk9ORVQsIHBEYXRhLCBMRU5HVEhfODAyXzFfSCkpCisJCXsKKwkJCS8vIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZXIKKwkJCSpNYWNoaW5lID0gQUlST05FVF9TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfQUlST05FVF9NU0c7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmICggcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCApIC8vTEVBUAorCQl7CisJCQkvLyBMRUFQIGZyYW1lcworCQkJKk1hY2hpbmUgPSBMRUFQX1NUQVRFX01BQ0hJTkU7CisJCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOworCQkJcmV0dXJuIChMZWFwTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCXsKKwkJCSpNYWNoaW5lID0gV1BBX1BTS19TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybihXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgTXNnVHlwZSkpOworCQl9CisJfQorCisJc3dpdGNoIChwRnJhbWUtPkhkci5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JTUDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FUSU06CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVRJTTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCS8vIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0KKwkJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YoVVNIT1JUKSk7CisJCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOworCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7CisJCQl9CisJCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKKwkJCXsKKwkJCQkqTWFjaGluZSA9IEFVVEhfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfRVZFTjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BQ1RJT046CisJCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOworCQkJLy8gIFNvbWV0aW1lcyBTdGEgd2lsbCByZXR1cm4gd2l0aCBjYXRlZ29yeSBieXRlcyB3aXRoIE1TQiA9IDEsIGlmIHRoZXkgcmVjZWl2ZSBjYXRvZ29yeSBvdXQgb2YgdGhlaXIgc3VwcG9ydAorCQkJaWYgKChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpCisJCQl7CisJCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSYweDdGKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHN0YXRlX21hY2hpbmUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUuCisgKglccGFyYW0gKlMJCQlwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JVHJhbnMJCVN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgorICoJXHBhcmFtCVN0TnIJCW51bWJlciBvZiBzdGF0ZXMKKyAqCVxwYXJhbQlNc2dOcgkJbnVtYmVyIG9mIG1lc3NhZ2VzCisgKglccGFyYW0JRGVmRnVuYyAJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KKyAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQorICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpCit7CisJVUxPTkcgaSwgajsKKworCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcworCVMtPk5yU3RhdGUgPSBTdE5yOworCVMtPk5yTXNnICAgPSBNc2dOcjsKKwlTLT5CYXNlICAgID0gQmFzZTsKKworCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKKworCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgorCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKKwkJeworCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKKwkJfQorCX0KKworCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKKwlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Cit9CisKKy8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0gKlMJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtIFN0CXN0YXRlCisgKglccGFyYW0gTXNnCWluY29taW5nIG1lc3NhZ2UKKyAqCVxwYXJhbSBmCXRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCUlOIFVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKK3sKKwlVTE9ORyBNc2dJZHg7CisKKwlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOworCisJaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKKwl7CisJCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KKwkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKKwl9Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgorICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgorICoJXHBhcmFtCSAqUyAJICB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCSAqRWxlbQkgIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkCisgKglccmV0dXJuICAgTm9uZQorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCSgqKFMtPlRyYW5zRnVuY1tTLT5DdXJyU3RhdGUgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKKwkJaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCisJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRHJvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGxmc3IuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBMZnNySW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBTZWVkKQoreworCWlmIChTZWVkID09IDApCisJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7CisJZWxzZQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBTZWVkOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCVVDSEFSIFIsIFJlc3VsdDsKKworCVIgPSAwOworCisJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyA9PSAwKQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoKFVMT05HICopJnBBZC0+TWxtZS5TaGlmdFJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyAmIDB4MDAwMDAwMDEpCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9ICgocEFkLT5NbG1lLlNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7CisJCQlSZXN1bHQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gcEFkLT5NbG1lLlNoaWZ0UmVnID4+IDE7CisJCQlSZXN1bHQgPSAwOworCQl9CisJCVIgPSAoUiA8PCAxKSB8IFJlc3VsdDsKKwl9CisKKwlyZXR1cm4gUjsKK30KKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFJhdGVUYWJsZSkKK3sKKwlVQ0hBUgkJCQkJaTsKKwlIVF9GQktfQ0ZHMF9TVFJVQwkJSHRDZmcwOworCUhUX0ZCS19DRkcxX1NUUlVDCQlIdENmZzE7CisJTEdfRkJLX0NGRzBfU1RSVUMJCUxnQ2ZnMDsKKwlMR19GQktfQ0ZHMV9TVFJVQwkJTGdDZmcxOworCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZTsKKworCS8vIHNldCB0byBpbml0aWFsIHZhbHVlCisJSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOworCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOworCisJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxOworCWZvciAoaSA9IDE7IGkgPCAqKChQVUNIQVIpIHBSYXRlVGFibGUpOyBpKyspCisJeworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzEraTsKKwkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkKKwkJeworCQkJY2FzZSAwOgkJLy9DQ0sKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJCS8vT0ZETQorCQkJCXsKKwkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQorCQkJCQl7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzJGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDM6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzVGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDY6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA3OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgMjoJCS8vSFQtTUlYCisJCQljYXNlIDM6CQkvL0hULUdGCisJCQkJeworCQkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpCisJCQkJCXsKKwkJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDA6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDM6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDY6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA3OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgODoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDk6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMjoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMzoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLCBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJcE5leHRUeFJhdGUgPSBwQ3VyclR4UmF0ZTsKKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMCwgSHRDZmcwLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcxLCBIdENmZzEud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzAsIExnQ2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMSwgTGdDZmcxLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUuCisJCU9wZXJhdGlvbk1vZGUgQU5EIGJOb25HRkV4aXN0IGFyZSBmb3IgTU0gYW5kIEdGIFByb3RlY2l0b24uCisJCUlmIE1NIG9yIEdGIG1hc2sgaXMgbm90IHNldCwgdGhvc2UgcGFzc2luZyBhcmd1bWVudCBkb2Vzbid0IG5vdCB0YWtlIGVmZmVjdC4KKworCQlPcGVyYXRpb24gbW9kZSBtZWFuaW5nOgorCQk9IDAgOiBQdXJlIEhULCBubyBwcmVvdGVjdGlvbi4KKwkJPSAweDAxOyB0aGVyZSBtYXkgYmUgbm9uLUhUIGRldmljZXMgaW4gYm90aCB0aGUgY29udHJvbCBhbmQgZXh0ZW5zaW9uIGNoYW5uZWwsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgaW4gQlNTLgorCQk9IDB4MTA6IE5vIFRyYW5zbWlzc2lvbiBpbiA0ME0gaXMgcHJvdGVjdGVkLgorCQk9IDB4MTE6IFRyYW5zbWlzc2lvbiBpbiBib3RoIDQwTSBhbmQgMjBNIHNoYWxsIGJlIHByb3RlY3RlZAorCQlpZiAoYk5vbkdGRXhpc3QpCisJCQl3ZSBzaG91bGQgY2hvb3NlIG5vdCB0byB1c2UgR0YuIEJ1dCBzdGlsbCBzZXQgY29ycmVjdCBBU0lDIHJlZ2lzdGVycy4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCQlVU0hPUlQJCQlPcGVyYXRpb25Nb2RlLAorCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAorCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCisJSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCkKK3sKKwlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKKwlVSU5UMzIgUHJvdGVjdFs2XTsKKwlVU0hPUlQJCQlvZmZzZXQ7CisJVUNIQVIJCQlpOworCVVJTlQzMiBNYWNSZWcgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKQorCXsKKwkJLy8KKwkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCisJCS8vCisJCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7CisJCU9wZXJhdGlvbk1vZGUgPSA4OworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworI2lmIDAKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyNlbHNlCisJLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5iYWxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgorICAgICAgICBpZiAoKAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQorICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworICAgICAgICB9CisjZW5kaWYKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gdXBkYXRlIFBIWSBtb2RlIGFuZCByYXRlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IDB4NDAwMDsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisKKwkvLyBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbgorCWlmIChiRGlzYWJsZUJHUHJvdGVjdCkKKwl7CisJCS8vUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKwllbHNlCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsJCQkvLyBDQ0sgZG8gbm90IG5lZWQgdG8gYmUgcHJvdGVjdGVkCisJCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX0NUUzsJLy8gT0ZETSBuZWVkcyB1c2luZyBDQ0sgdG8gcHJvdGVjdAorCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLgorCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkKKwl7CisJCXN3aXRjaChPcGVyYXRpb25Nb2RlKQorCQl7CisJCQljYXNlIDB4MDoKKwkJCQkvLyBOTyBQUk9URUNUCisJCQkJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkJCQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkJCQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkJCQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJCQkJLy8gTU0yMF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCQkJCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJCQkJLy8gTU00MF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCQkJCS8vIENGMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIENGNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwkJCQlpZiAoYk5vbkdGRXhpc3QpCisJCQkJeworCQkJCQkvLyBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlpb24pCisJCQkJCS8vIFBST1RfQ1RSTCgxNzoxNikgLS0gMDEgKFJUUy9DVFMpCisJCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisgCQkJY2FzZSAxOgorCQkJCS8vIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIKKwkJCQkvLyBJZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMgbXkgQlNTCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCisJCQkJeworCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCisJCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQkvLyBJZiBvbmx5IEhUIFNUQXMgYXJlIGluIEJTUy4gYXQgbGVhc3Qgb25lIGlzIDIwTUh6LiBPbmx5IHByb3RlY3QgNDBNSHogcGFja2V0cworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7ICAvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCX0KKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJLy8gSFQgbWl4ZWQgbW9kZS4JIFBST1RFQ1QgQUxMIQorCQkJCS8vIEFzc2lnbiBSYXRlCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy9kdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CisJCQkJLy8gYm90aCAyME1IeiBhbmQgNDBNSHogYXJlIHByb3RlY3RlZC4gV2hldGhlciB1c2UgUlRTIG9yIENUUy10by1zZWxmIGRlcGVuZHMgb24gdGhlCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgODoKKwkJCQkvLyBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLgorCQkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbM10gPSAweDAzZjU0MDg0OworCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCXsKKwkJaWYgKChTZXRNYXNrICYgKDE8PCBpKSkpCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pCit7CisJVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOworCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJVUNIQVIJaW5kZXg7CisJVUlOVDMyIAlWYWx1ZSA9IDA7IC8vQmJwUmVnLCBWYWx1ZTsKKwlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7CisKKwkvLyBTZWFyY2ggVHggcG93ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCXsKKwkJaWYgKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCkKKwkJeworCQkJVHhQd2VyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXI7CisJCQlUeFB3ZXIyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXIyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW50IGZpbmQgdGhlIENoYW5uZWwjJWQgXG4iLCBDaGFubmVsKSk7CisJfQorCisjaWZkZWYgUlQyODcwCisJLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4CisJaWYgKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkpKQorCXsKKwkJLyogbW9kaWZ5IGJ5IFdZIGZvciBSZWFkIFJGIFJlZy4gZXJyb3IgKi8KKwkJVUNIQVIgUkZWYWx1ZTsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQorCQl7CisJCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQorCQkJeworCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAzLCBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKKworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEZDKSB8IEZyZXFJdGVtczMwMjBbaW5kZXhdLlI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoVUNIQVIpUkZWYWx1ZSk7CisKKwkJCQkvLyBTZXQgVHggUG93ZXIKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgKFBVQ0hBUikmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCAoVUNIQVIpUkZWYWx1ZSk7CisKKwkJCQkvLyBTZXQgUkYgb2Zmc2V0CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjMsIChQVUNIQVIpJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAoVUNIQVIpUkZWYWx1ZSk7CisKKwkJCQkvLyBTZXQgQlcKKwkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQorCQkJCXsKKwkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0OworCQkJCQkvL0RJU0FCTEVfMTFOX0NIRUNLKHBBZCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNDsKKwkJCQl9CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAoVUNIQVIpUkZWYWx1ZSk7CisKKwkJCQkvLyBFbmFibGUgUkYgdHVuaW5nCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIChQVUNIQVIpJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLgorCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCisJCQlDaGFubmVsLAorCQkJcEFkLT5SZkljVHlwZSwKKwkJCVR4UHdlciwKKwkJCVR4UHdlcjIsCisJCQlwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKKwkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLkssCisJCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5SKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl7CisJCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJCXsKKwkJCWNhc2UgUkZJQ18yODIwOgorCQkJY2FzZSBSRklDXzI4NTA6CisJCQljYXNlIFJGSUNfMjcyMDoKKwkJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgorCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCisJCQkJCX0KKworCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQorCQkJCQl7CisJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAorCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpOworCisJCQkJCQkvLyA1RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKKwkJCQkJCS8vIFIzCisJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gUjQKKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKKwkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIE9mZnNldCAmIFR4UHdyMQorCQkJCQl9CisKKwkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KKwkJCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKKwkJCQkJeworCQkJCQkJUjQgfD0weDIwMDAwMDsKKwkJCQkJfQorCisJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzIHwgMHgwNCkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YQorCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vR2FyeSAyMDA3LzA4LzA5IDB4MDUwQTBBCisKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwkvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOworCisJCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAorCSAgICBpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkgICAgeworCSAgICAgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOworCSAgICB9CisKKwkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisJZWxzZQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vR2FyeSAyMDA3LzgvOSAweDA1MDUwNQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkJfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKworICAgIC8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZworCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwlpZiAoYlNjYW4pCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisJZWxzZQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKworCS8vCisJLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQorCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCisJLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCisJLy8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAorCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKKwkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCisJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIDI0MjEgb25seSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkdXJpbmcKKwkJc2l0ZSBzdXJ2ZXkuIEl0J3Mgb25seSByZXF1aXJlZCBhZnRlciBOSUMgZGVjaWRlZCB0byBzdGF5IGF0IGEgY2hhbm5lbAorCQlmb3IgYSBsb25nZXIgcGVyaW9kLgorCQlXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCdzIGFsd2F5cyBhZnRlciBBc2ljU3dpdGNoQ2hhbm5lbCgpLgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0xvY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lECUFzaWNBbnRlbm5hU2VsZWN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCkKK3sKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFudGVubmEgbWlzY2VsbGFuZW91cyBzZXR0aW5nLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCUJhbmRTdGF0ZQkJCQlJbmRpY2F0ZSBjdXJyZW50IEJhbmQgU3RhdGUuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPD0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCTEuKSBGcmFtZSBFbmQgdHlwZSBjb250cm9sCisJCQlvbmx5IHZhbGlkIGZvciBHIG9ubHkgKFJGXzI1MjcgJiBSRl8yNTI5KQorCQkJMDogbWVhbnMgRFBEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAxCisJCQkxOiBtZWFucyBTUERULCBzZXQgQkJQIFI0IGJpdCA1IHRvIDAKKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBc2ljQW50ZW5uYVNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpCit7Cit9CisKK1ZPSUQgQXNpY1JmVHVuaW5nRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgorCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBMSU5LIFVQIGluIElORlJBU1RSVUNUVVJFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdFN3aXRjaGluZygpCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJCQlpLCBqOworCUNIQVIJCURlbHRhUHdyID0gMDsKKwlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7CisJVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCVVDSEFSCQlCYnBSMSA9IDAsIEJicFI0OSA9IDAsIGlkeDsKKwlQQ0hBUgkJcFR4QWdjQ29tcGVuc2F0ZTsKKwlVTE9ORwkJVHhQd3JbNV07CisJQ0hBUgkJVmFsdWU7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4gdHJ5IGV2ZXJ5IDQgc2Vjb25kCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCS8qIGJnIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQl7CisJCQkvKiBCYnBSMSBpcyB1bnNpZ25lZCBjaGFyICovCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKKworCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KKwkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KKwkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCisKKwkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCisJCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCisJCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KKworCQkJLyogcGx1cyAoKykgaXMgMHgwMCB+IDB4NDUsIG1pbnVzICgtKSBpcyAweGEwIH4gMHhmMCAqLworCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCisJCQkvKiBpZiB2YWx1ZSBpcyAweGE1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLworCisJCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIKKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisvLwkJCQlpZiAoUjMgPiAoVUxPTkcpIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSkKKwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOworLy8JCQkJZWxzZQorLy8JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLSgoVUNIQVIpUjMpOworCisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSNDk9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwl9CisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBSMSk7CisJQmJwUjEgJj0gMHhGQzsKKworI2lmZGVmIFNJTkdMRV9TS1UKKwkvLyBIYW5kbGUgcmVndWxhdG9yeSBtYXggdHggcG93ZXIgY29uc3RyYWluCisJZG8KKwl7CisJCVVDSEFSICAgIFR4UHdySW5FRVBST00gPSAweEZGLCBDb3VudHJ5VHhQd3IgPSAweEZGLCBjcml0ZXJpb247CisJCVVDSEFSICAgIEFkanVzdE1heFR4UHdyWzQwXTsKKworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyA1RyBiYW5kCisJCQlUeFB3ckluRUVQUk9NID0gKChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4RkYwMCkgPj4gOCk7CisJCWVsc2UgLy8gMi40RyBiYW5kCisJCQlUeFB3ckluRUVQUk9NID0gKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHgwMEZGKTsKKwkJQ291bnRyeVR4UHdyID0gR2V0Q3VudHJ5TWF4VHhQd3IocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQkvLyBlcnJvciBoYW5kbGluZywgcmFuZ2UgY2hlY2sKKwkJaWYgKChUeFB3ckluRUVQUk9NID4gMHg1MCkgfHwgKENvdW50cnlUeFB3ciA+IDB4NTApKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFzaWNBZGp1c3RUeFBvd2VyIC0gSW52YWxpZCBtYXggdHggcG93ZXIgKD0weCUwMngpLCBDb3VudHJ5VHhQd3I9JWRcbiIsIFR4UHdySW5FRVBST00sIENvdW50cnlUeFB3cikpOworCQkJYnJlYWs7CisJCX0KKworCQljcml0ZXJpb24gPSAqKChQVUNIQVIpVHhQd3IgKyAyKSAmIDB4RjsgICAgICAgIC8vIEZBRSB1c2UgT0ZETSA2TSBhcyBjcml0ZXJpb24KKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoY3JpdGVyaW9uPSVkLCBUeFB3ckluRUVQUk9NPSVkLCBDb3VudHJ5VHhQd3I9JWQpXG4iLCBjcml0ZXJpb24sIFR4UHdySW5FRVBST00sIENvdW50cnlUeFB3cikpOworCisJCS8vIEFkanVzdCBtYXggdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAgb2YgdHggcG93ZXIgaW4gRTJQUk9NCisJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJeworCQkJLy8gQ0NLIHdpbGwgaGF2ZSA0ZEJtIGxhcmdlciB0aGFuIE9GRE0KKwkJCS8vIFRoZXJlZm9yZSwgd2Ugc2hvdWxkIHNlcGFyYXRlIHRvIHBhcnNlIHRoZSB0eCBwb3dlciBmaWVsZAorCQkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCWlmIChqIDwgNCkKKwkJCQkJeworCQkJCQkJLy8gQ0NLIHdpbGwgaGF2ZSA0ZEJtIGxhcmdlciB0aGFuIE9GRE0KKwkJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pICsgNDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOworCQkJCQl9CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEFkanVzdCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcAorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJLy8gVGhlIHN5c3RlbSB0eCBwb3dlciBpcyBsYXJnZXIgdGhhbiB0aGUgcmVndWxhdG9yeSwgdGhlIHBvd2VyIHNob3VsZCBiZSByZXN0cmFpbgorCQkJCQlpZiAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdID4gQ291bnRyeVR4UHdyKQorCQkJCQl7CisJCQkJCQkvLyBkZWNyZWFzZSB0byB6ZXJvIGFuZCBkb24ndCBuZWVkIHRvIHRha2UgY2FyZSBCQlBSMQorCQkJCQkJaWYgKChWYWx1ZSAtIChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpKSA+IDApCisJCQkJCQkJVmFsdWUgLT0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cik7CisJCQkJCQllbHNlCisJCQkJCQkJVmFsdWUgPSAwOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkLCBubyBjaGFuZ2UpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisKKwkJCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQkJfQorCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLworCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKKwkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQorCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApICAvLyA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKSAgLy8gNjEgfiA5MCUsIHRyZWF0IGFzIDc1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMTsKKwl7CisJCURlbHRhUHdyIC09IDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAzOworCXsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8vIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDY7CisJeworCQlCYnBSMSB8PSAweDAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpICAgLy8gMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA5OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMTI7CisJeworCQlCYnBSMSB8PSAweDAyOworCX0KKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFIxKTsKKworCS8qIHJlc2V0IGRpZmZlcmVudCBuZXcgdHggcG93ZXIgZm9yIGRpZmZlcmVudCBUWCByYXRlICovCisJZm9yKGk9MDsgaTw1OyBpKyspCisJeworCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJeworCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJeworCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7IC8qIDAgfiAxNSAqLworCisJCQkJaWYgKChWYWx1ZSArIERlbHRhUHdyKSA8IDApCisJCQkJeworCQkJCQlWYWx1ZSA9IDA7IC8qIG1pbiAqLworCQkJCX0KKwkJCQllbHNlIGlmICgoVmFsdWUgKyBEZWx0YVB3cikgPiAweEYpCisJCQkJeworCQkJCQlWYWx1ZSA9IDB4RjsgLyogbWF4ICovCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVZhbHVlICs9IERlbHRhUHdyOyAvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24gKi8KKwkJCQl9CisKKwkJCQkvKiBmaWxsIG5ldyB2YWx1ZSB0byBDU1Igb2Zmc2V0ICovCisJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKKwkJCX0KKworCQkJLyogd3JpdGUgdHggcG93ZXIgdmFsdWUgdG8gQ1NSICovCisJCQkvKiBUWF9QV1JfQ0ZHXzAgKDggdHggcmF0ZSkgZm9yCVRYIHBvd2VyIGZvciBPRkRNIDEyTS8xOE0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIE9GRE0gNk0vOU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzUuNU0vMTFNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0sxTS8yTSAqLworCQkJLyogVFhfUFdSX0NGR18xIH4gVFhfUFdSX0NGR180ICovCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIFR4UHdyW2ldKTsKKwkJfQorCX0KKworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXB1dCBQSFkgdG8gc2xlZXAgaGVyZSwgYW5kIHNldCBuZXh0IHdha2V1cCB0aW1lci4gUEhZIGRvZXNuJ3Qgbm90IHdha2V1cAorCQlhdXRvbWF0aWNhbGx5LiBJbnN0ZWFkLCBNQ1Ugd2lsbCBpc3N1ZSBhIFR3YWtlVXBJbnRlcnJ1cHQgdG8gaG9zdCBhZnRlcgorCQl0aGUgd2FrZXVwIHRpbWVyIHRpbWVvdXQuIERyaXZlciBoYXMgdG8gaXNzdWUgYSBzZXBhcmF0ZSBjb21tYW5kIHRvIHdha2UKKwkJUEhZIHVwLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKQoreworICAgIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgbWFudWFsIHdha2V1cCBpcyByZXF1aXJlZAorCQlBc2ljRm9yY2VTbGVlcCgpIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBub3QgaW4gSU5GUkEgQlNTLiBXaGVuCisJCWluIElORlJBIEJTUywgd2Ugc2hvdWxkIHVzZSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgpIGluc3RlYWQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRm9yY2VTbGVlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgVHdha2V1cCB0aW1lciAoc2V0IHZpYSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCkKKwkJZXhwaXJlZC4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICBiRnJvbVR4KQoreworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljRm9yY2VXYWtldXAgXG4iKSk7CisgICAgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2V0IE15IEJTU0lECisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJVUxPTkcJCSAgQWRkcjQ7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwKKwkJcEJzc2lkWzBdLHBCc3NpZFsxXSxwQnNzaWRbMl0scEJzc2lkWzNdLCBwQnNzaWRbNF0scEJzc2lkWzVdKSk7CisKKwlBZGRyNCA9IChVTE9ORykocEJzc2lkWzBdKQkJIHwKKwkJCShVTE9ORykocEJzc2lkWzFdIDw8IDgpICB8CisJCQkoVUxPTkcpKHBCc3NpZFsyXSA8PCAxNikgfAorCQkJKFVMT05HKShwQnNzaWRbM10gPDwgMjQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzAsIEFkZHI0KTsKKworCUFkZHI0ID0gMDsKKwkvLyBhbHdheXMgb25lIEJTU0lEIGluIFNUQSBtb2RlCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFs0XSkgfCAoVUxPTkcpKHBCc3NpZFs1XSA8PCA4KTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKK30KKworVk9JRCBBc2ljU2V0TWNhc3RXQygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOworCVVTSE9SVAkJb2Zmc2V0OworCisJcEVudHJ5LT5Tc3QgICAgICAgID0gU1NUX0FTU09DOworCXBFbnRyeS0+QWlkICAgICAgICA9IE1DQVNUX1dDSUQ7CS8vIFNvZnRhcCBzdXBwb3J0cyAxIEJTU0lEIGFuZCB1c2UgV0NJRD0wIGFzIG11bHRpY2FzdCBXY2lkIGluZGV4CisJcEVudHJ5LT5Qc01vZGUgICAgID0gUFdSX0FDVElWRTsKKwlwRW50cnktPkN1cnJUeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgQlNTME1jYXN0X1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRGVsV2NpZFRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUglXY2lkKQoreworCVVMT05HCQkgIEFkZHIwID0gMHgwLCBBZGRyMSA9IDB4MDsKKwlVTE9ORyAJCW9mZnNldDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNEZWxXY2lkVGFiPT0+V2NpZCA9IDB4JXhcbiIsV2NpZCkpOworCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBXY2lkICogSFdfV0NJRF9FTlRSWV9TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjApOworCW9mZnNldCArPSA0OworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjEpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7CisJVUlOVDMyCQkJCURhdGEgPSAwOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwlEYXRhICB8PSAweDgwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRGlzYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7CisJVUlOVDMyCQkJCURhdGEgPSAwOworCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJLy9EYXRhICB8PSAweDIwOworI2lmbmRlZiBXSUZJX1RFU1QKKwkvL2lmICggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQorCS8vCURhdGEgfD0gMHg2MDsgLy8gZm9yIHBlcmZvcm1hbmNlIGlzc3VlIG5vdCBzZXQgdGhlIFRYT1AgdG8gMAorI2VuZGlmCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9EWU5BTUlDX0JFX1RYT1BfQUNUSVZFKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkmJiAocEFkLT5NYWNUYWIuZkFueVN0YXRpb25NSU1PUFNEeW5hbWljID09IEZBTFNFKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJCURhdGEgfD0gMHgyMDsKKwl9CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+RGlzYWJsZSBUU0Ygc3luY2hyb25pemF0aW9uXG4iKSk7CisKKwkvLyAyMDAzLTEyLTIwIGRpc2FibGUgVFNGIGFuZCBUQlRUIHdoaWxlIE5JQyBpbiBwb3dlci1zYXZpbmcgaGF2ZSBzaWRlIGVmZmVjdAorCS8vCQkJICB0aGF0IE5JQyB3aWxsIG5ldmVyIHdha2VzIHVwIGJlY2F1c2UgVFNGIHN0b3BzIGFuZCBubyBtb3JlCisJLy8JCQkgIFRCVFQgaW50ZXJydXB0cworCXBBZC0+VGJ0dFRpY2tDb3VudCA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVCc3NTeW5jKElORlJBIG1vZGUpXG4iKSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKy8vCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgMHgwMDAwMDAwMCk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMTsgLy8gc3luYyBUU0YgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQorCQljc3IuZmllbGQuYkJlYWNvbkdlbiAgPSAwOyAvLyBkbyBOT1QgZ2VuZXJhdGUgQkVBQ09OCisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDE7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJTm90ZToKKwkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKKwkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5CisJCUJlYWNvbiBwZXJpb2QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I5OworCVBVQ0hBUgkJCXB0cjsKKwlVSU5UIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3I5LndvcmQpOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworCisKKyNpZmRlZiBSVDI4NzAKKwkvLyBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkKKwlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz0yKSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCisJeworCQkvL1VJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgcHRyLCAyKTsKKwkJcHRyICs9IDI7CisJfQorCisJLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXB0ciA9IHBBZC0+QmVhY29uQnVmOworCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz0yKQorCXsKKwkJLy9VSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIHB0ciwgMik7CisJCXB0ciArPTI7CisJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8KKwkvLyBGb3IgV2ktRmkgZmFpbHkgZ2VuZXJhdGVkIGJlYWNvbnMgYmV0d2VlbiBwYXJ0aWNpcGF0aW5nIHN0YXRpb25zLgorCS8vIFNldCBUQlRUIHBoYXNlIGFkYXB0aXZlIGFkanVzdG1lbnQgc3RlcCB0byA4dXMgKGRlZmF1bHQgMTZ1cykKKwkvLyBkb24ndCBjaGFuZ2Ugc2V0dGluZ3MgMjAwNi01LSBieSBKZXJyeQorCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVEJUVF9TWU5DX0NGRywgMHgwMDAwMTAxMCk7CisKKwkvLyBzdGFydCBzZW5kaW5nIEJFQUNPTgorCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7IC8vIHN5bmMgVFNGIGluIElCU1MgbW9kZQorCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTQkgcEVkY2FQYXJtKQoreworCUVEQ0FfQUNfQ0ZHX1NUUlVDICAgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOworCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOworCUFJRlNOX0NTUl9TVFJVQyAgICBBaWZzbkNzcjsKKwlDV01JTl9DU1JfU1RSVUMgICAgQ3dtaW5Dc3I7CisJQ1dNQVhfQ1NSX1NUUlVDICAgIEN3bWF4Q3NyOworCWludCBpOworCisJQWMwQ2ZnLndvcmQgPSAwOworCUFjMUNmZy53b3JkID0gMDsKKwlBYzJDZmcud29yZCA9IDA7CisJQWMzQ2ZnLndvcmQgPSAwOworCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNTZXRFZGNhUGFybVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSB8fCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSkKKwkJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vI2lmbmRlZiBXSUZJX1RFU1QKKwkJaWYoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkJeworCQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAweDIwOyAvLyBTdWdnZXN0IGJ5IEpvaG4gZm9yIFR4QnVyc3QgaW4gSFQgTW9kZQorCQl9CisJCWVsc2UKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKKy8vI2Vsc2UKKy8vCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisvLyNlbmRpZgorCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQksKKwkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKKworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKKwkJfQorCQllbHNlCisJCXsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisJCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisJCX0KKwkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CQkvLyBRSURfQUNfQkUKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gMDsJCS8vIFFJRF9BQ19CSworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSAxOTI7CQkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCisJCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJCS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKKwkJfQorCQllbHNlCisJCXsKKwkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDk2OwkJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisJCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA0ODsJCS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKKworCQlDd21pbkNzci53b3JkID0gMDsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOworCisJCUN3bWF4Q3NyLndvcmQgPSAwOworCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7CisKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwl9CisJZWxzZQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8KKwkJLy8gTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcKKwkJLy8gVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLgorCQkvLworCQkvL3BFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzCisKKwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOyAvLysxOworCisJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107CisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsgLy8rMjsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107IC8vKzE7CisKKwkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IChwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDYpIC8gMTA7CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOworCQlBYzJDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCQlBYzJDZmcuZmllbGQuQWlmc24gLT0gMTsKKworCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCisJCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQorCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJeworCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7CisJCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107CisKKy8vI2lmZGVmIFdJRklfVEVTVAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0KQorCQl7CisJCQlpZiAoQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9PSAxMDIpCisJCQl7CisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gPyBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA6IDEwOworCQkJCUFjMENmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0tMTsgLyogQUlGU04gbXVzdCA+PSAxICovCisJCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107CisJCQkJQWMxQ2ZnLmZpZWxkLkFpZnNuICA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXTsKKwkJCX0gLyogRW5kIG9mIGlmICovCisJCX0KKy8vI2VuZGlmIC8vIFdJRklfVEVTVCAvLworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOworCisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSBBYzBDZmcuZmllbGQuQWNUeG9wOworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSBBYzFDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCisJCWNzcjEuZmllbGQuQWMyVHhvcCA9IEFjMkNmZy5maWVsZC5BY1R4b3A7CisJCWNzcjEuZmllbGQuQWMzVHhvcCA9IEFjM0NmZy5maWVsZC5BY1R4b3A7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdOworCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gLSAxOyAvL2ZvciBUR24gd2lmaSB0ZXN0CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOworCisJCUN3bWF4Q3NyLndvcmQgPSAwOworCQlDd21heENzci5maWVsZC5Dd21heDAgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOworCQlDd21heENzci5maWVsZC5Dd21heDMgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCUFpZnNuQ3NyLndvcmQgPSAwOworCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSBBYzBDZmcuZmllbGQuQWlmc247IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOworCQlBaWZzbkNzci5maWVsZC5BaWZzbjEgPSBBYzFDZmcuZmllbGQuQWlmc247IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOworCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc247IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKKworCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCisJCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQorCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJeworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IDM7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gNzsKKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIEFpZnNuQ3NyLndvcmQpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJaWYgKCFBREhPQ19PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLCBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JFICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzBdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVswXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JLICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzFdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsxXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzJdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsyXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZPICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzNdPDw1LAorCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVszXSkpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCAJQXNpY1NldFNsb3RUaW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpCit7CisJVUxPTkcJU2xvdFRpbWU7CisJVUlOVDMyCVJlZ1ZhbHVlID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCWJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChiVXNlU2hvcnRTbG90VGltZSkKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwllbHNlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKworCVNsb3RUaW1lID0gKGJVc2VTaG9ydFNsb3RUaW1lKT8gOSA6IDIwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OCisJCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsKKwkJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0aGluayBpdCBpcyBkb2luZyBXaS1GaSB0ZXN0CisJCQkvLyBBbmQgd2Ugd2lsbCBub3Qgc2V0IHRvIHNob3J0IHNsb3Qgd2hlbiBiRW5hYmxlVHhCdXJzdCBpcyBUUlVFLgorCQl9CisJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQorCQkJU2xvdFRpbWUgPSA5OworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vCisJLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCisJLy8KKwkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCVNsb3RUaW1lID0gMjA7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKKwlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKKworCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgorCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQorCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0luZGV4LAorCUlOIFVDSEFSCQkgS2V5SWR4LAorCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUgkJIHBLZXksCisJSU4gUFVDSEFSCQkgcFR4TWljLAorCUlOIFBVQ0hBUgkJIHBSeE1pYykKK3sKKwlVTE9ORyBvZmZzZXQ7IC8vLCBjc3IwOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnkgQnNzSW5kZXg9JWQsIEtleUlkeD0lZFxuIiwgQnNzSW5kZXgsS2V5SWR4KSk7CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeTogJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiIAlSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOworCX0KKwlpZiAocFR4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJVHggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBUeE1pY1swXSxwVHhNaWNbMV0scFR4TWljWzJdLHBUeE1pY1szXSxwVHhNaWNbNF0scFR4TWljWzVdLHBUeE1pY1s2XSxwVHhNaWNbN10pKTsKKwl9CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8KKwkvLyBmaWxsIGtleSBtYXRlcmlhbCAtIGtleSArIFRYIE1JQyArIFJYIE1JQworCS8vCisKKyNpZmRlZiBSVDI4NzAKK3sKKwlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCpCc3NJbmRleCArIEtleUlkeCkqSFdfS0VZX0VOVFJZX1NJWkU7CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwS2V5LCBNQVhfTEVOX09GX1NIQVJFX0tFWSk7CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJaWYgKHBUeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKKwl9CisKKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOworCX0KK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwCisJLy8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlYWQ6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSBLZXlJZHhbJWRdPSAweCV4IFxuIiwgQnNzSW5kZXgsS2V5SWR4LCBjc3IxLndvcmQpKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7CisKK30KKworLy8JSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0luZGV4LAorCUlOIFVDSEFSCQkgS2V5SWR4KQoreworCS8vVUxPTkcgU2VjQ3NyMDsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnk6ICMlZCBcbiIsIEJzc0luZGV4KjQgKyBLZXlJZHgpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOworCWlmICgoQnNzSW5kZXglMikgPT0gMCkKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJZWxzZQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSAwOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCUFTU0VSVChCc3NJbmRleCA8IDQpOworCUFTU0VSVChLZXlJZHggPCA0KTsKKworfQorCisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKK3sKKwlVTE9ORyAgIFdDSURBdHRyaSA9IDAsIG9mZnNldDsKKworCS8vCisJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlLgorCS8vIE9ubHkgVHhLZXkgY291bGQgdXBkYXRlIFdDSUQgYXR0cmlidXRlLgorCS8vCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisJV0NJREF0dHJpID0gKEJzc0luZGV4IDw8IDQpIHwgKENpcGhlckFsZyA8PCAxKSB8IChiVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKK30KKworVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVTE9ORyAgICAgICAgdUlWLAorCUlOIFVMT05HICAgICAgICB1RUlWKQoreworCVVMT05HCW9mZnNldDsKKworCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgdUlWKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCB1RUlWKTsKK30KKworVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCit7CisJVUxPTkcgb2Zmc2V0OworCVVMT05HIEFkZHI7CisKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkUpOworCUFkZHIgPSBwQWRkclswXSArIChwQWRkclsxXSA8PCA4KSArKHBBZGRyWzJdIDw8IDE2KSArKHBBZGRyWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIpOworCUFkZHIgPSBwQWRkcls0XSArIChwQWRkcls1XSA8PCA4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCBBZGRyKTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0sIElWL0VJViB0byBBc2ljCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgV0NJRCAgICAgICAgICAgICAgICAgICAgV0NJRCBFbnRyeSBudW1iZXIuCisgICAgICAgIEJzc0luZGV4ICAgICAgICAgICAgICAgIEJTU0lEIGluZGV4LCBzdGF0aW9uIG9yIG5vbmUgbXVsdGlwbGUgQlNTSUQgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlIHNob3VsZCBiZSAwLgorICAgICAgICBLZXlJZHggICAgICAgICAgICAgICAgICBUaGlzIEtleUlkeCB3aWxsIHNldCB0byBJVidzIEtleUlEIGlmIGJUeEtleSBlbmFibGVkCisgICAgICAgIHBDaXBoZXJLZXkgICAgICAgICAgICAgIFBvaW50ZXIgdG8gQ2lwaGVyIEtleS4KKyAgICAgICAgYlVzZVBhaXJld2lzZUtleVRhYmxlICAgVFJVRSBtZWFucyBzYXZlZCB0aGUga2V5IGluIFNoYXJlZEtleSB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIFBhaXJld2lzZUtleSB0YWJsZQorICAgICAgICBiVHhLZXkgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSB0cmFuc21pdCBrZXkgaWYgZW5hYmxlZC4KKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIHdpbGwgc2V0IHRoZSByZWxhdGl2ZSBrZXkgc3R1ZmYgdG8gQXNpYyBpbmNsdWRpbmcgV0NJRCBhdHRyaWJ1dGUsCisgICAgICAgIENpcGhlciBLZXksIENpcGhlciBhbGdvcml0aG0gYW5kIElWL0VJVi4KKworICAgICAgICBJVi9FSVYgd2lsbCBiZSB1cGRhdGUgaWYgdGhpcyBDaXBoZXJLZXkgaXMgdGhlIHRyYW5zbWlzc2lvbiBrZXkgYmVjYXVzZQorICAgICAgICBBU0lDIHdpbGwgYmFzZSBvbiBJVidzIEtleUlEIHZhbHVlIHRvIHNlbGVjdCBDaXBoZXIgS2V5LgorCisgICAgICAgIElmIGJUeEtleSBzZXRzIHRvIEZBTFNFLCB0aGlzIGlzIG5vdCB0aGUgVFgga2V5LCBidXQgaXQgY291bGQgYmUKKyAgICAgICAgUlgga2V5CisKKyAgICAJRm9yIEFQIG1vZGUgYlR4S2V5IG11c3QgYmUgYWx3YXlzIHNldCB0byBUUlVFLgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0FkZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIJCUtleUlkeCwKKwlJTiBQQ0lQSEVSX0tFWQlwQ2lwaGVyS2V5LAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSwKKwlJTiBCT09MRUFOCQliVHhLZXkpCit7CisJVUxPTkcJb2Zmc2V0OworLy8JVUxPTkcgICBXQ0lEQXR0cmkgPSAwOworCVVDSEFSCUlWNCA9IDA7CisJUFVDSEFSCQlwS2V5ID0gcENpcGhlcktleS0+S2V5OworLy8JVUxPTkcJCUtleUxlbiA9IHBDaXBoZXJLZXktPktleUxlbjsKKwlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisJUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisKKy8vCUFTU0VSVChLZXlMZW4gPD0gTUFYX0xFTl9PRl9QRUVSX0tFWSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gQXNpY0FkZEtleUVudHJ5XG4iKSk7CisJLy8KKwkvLyAxLikgZGVjaWRlIGtleSB0YWJsZSBvZmZzZXQKKwkvLworCWlmIChiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisJZWxzZQorCQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCisJLy8KKwkvLyAyLikgU2V0IEtleSB0byBBc2ljCisJLy8KKwkvL2ZvciAoaSA9IDA7IGkgPCBLZXlMZW47IGkrKykKKworI2lmZGVmIFJUMjg3MAorCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvLworCS8vIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUKKwkvLworCWlmIChwVHhNaWMpCisJeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBUeE1pYywgOCk7CisJfQorCW9mZnNldCArPSBMRU5fVEtJUF9UWE1JQ0s7CisKKwlpZiAocFJ4TWljKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwUnhNaWMsIDgpOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMKKwkvLyAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuCisJLy8KKwlpZiAoYlR4S2V5KQorCXsKKworI2lmZGVmIFJUMjg3MAorCQlVSU5UMzIgdG1wVmFsOworCisJCS8vCisJCS8vIFdyaXRlIElWCisJCS8vCisJCUlWNCA9IChLZXlJZHggPDwgNik7CisJCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCQkJSVY0IHw9IDB4MjA7ICAvLyB0dXJuIG9uIGV4dGVuc2lvbiBiaXQgbWVhbnMgRUlWIGV4aXN0ZW5jZQorCisJCXRtcFZhbCA9IHBUeHRzY1sxXSArICgoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikgPDwgOCkgKyAocFR4dHNjWzBdIDw8IDE2KSArIChJVjQgPDwgMjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHRtcFZhbCk7CisKKwkJLy8KKwkJLy8gV3JpdGUgRUlWCisJCS8vCisJCW9mZnNldCArPSA0OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsICooUFVJTlQzMikmcENpcGhlcktleS0+VHhUc2NbMl0pOworI2VuZGlmIC8vIFJUMjg3MCAvLworCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIFdDSUQsIEJzc0luZGV4LCBDaXBoZXJBbGcsIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisJfQorCisJaWYgKCFiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJeworCQkvLworCQkvLyBPbmx5IHVwZGF0ZSB0aGUgc2hhcmVkIGtleSBzZWN1cml0eSBtb2RlCisJCS8vCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksICZjc3IxLndvcmQpOworCQlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKEtleUlkeCA9PSAwKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCBjc3IxLndvcmQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgUGFpci13aXNlIGtleSBtYXRlcmlhbCBpbnRvIEFTSUMuCisJCVVwZGF0ZSBwYWlyd2lzZSBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFBhaXItd2lzZSBrZXkgdGFibGUKKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIJCVdDSUQsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KQoreworCUlOVCBpOworCVVMT05HIAkJb2Zmc2V0OworCVBVQ0hBUgkJIHBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJUFVDSEFSCQkgcFR4TWljID0gcENpcGhlcktleS0+VHhNaWM7CisJUFVDSEFSCQkgcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisjaWZkZWYgREJHCisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKyNlbmRpZiAvLyBEQkcgLy8KKworCS8vIEVLRVkKKwlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworI2lmZGVmIFJUMjg3MAorCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPktleVswXSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSs9NCkKKwl7CisJCVVJTlQzMiBWYWx1ZTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBvZmZzZXQgKyBpLCAmVmFsdWUpOworCX0KKworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8gIE1JQyBLRVkKKwlpZiAocFR4TWljKQorCXsKKyNpZmRlZiBSVDI4NzAKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+VHhNaWNbMF0sIDgpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCX0KKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKQorCXsKKyNpZmRlZiBSVDI4NzAKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+UnhNaWNbMF0sIDgpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnk6IFdDSUQgIyVkIEFsZz0lc1xuIixXQ0lELCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwS2V5WzBdLHBLZXlbMV0scEtleVsyXSxwS2V5WzNdLHBLZXlbNF0scEtleVs1XSxwS2V5WzZdLHBLZXlbN10scEtleVs4XSxwS2V5WzldLHBLZXlbMTBdLHBLZXlbMTFdLHBLZXlbMTJdLHBLZXlbMTNdLHBLZXlbMTRdLHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOworCX0KKwlpZiAocFR4TWljKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJZHgsCisJSU4gVUNIQVIJCSBXY2lkKQoreworCVVMT05HCQlXQ0lEQXR0cmk7CisJVVNIT1JUCQlvZmZzZXQ7CisKKwkvLyByZS1zZXQgdGhlIGVudHJ5J3MgV0NJRCBhdHRyaWJ1dGUgYXMgT1BFTi1OT05FLgorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJZHg8PDQpIHwgUEFJUldJU0VLRVlUQUJMRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBDb21tYW5kLAorCUlOIFVDSEFSCQkgVG9rZW4sCisJSU4gVUNIQVIJCSBBcmcwLAorCUlOIFVDSEFSCQkgQXJnMSkKK3sKKwlIT1NUX0NNRF9DU1JfU1RSVUMJSDJNQ21kOworCUgyTV9NQUlMQk9YX1NUUlVDCUgyTU1haWxib3g7CisJVUxPTkcJCQkJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKKwkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMik7CisJfSB3aGlsZShpKysgPCAxMDApOworCisJaWYgKGkgPj0gMTAwKQorCXsKKwkJeworCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCisJSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCisJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOworCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKKworCUgyTUNtZC53b3JkIAkJCSAgPSAwOworCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCAgPSBDb21tYW5kOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOworCisJaWYgKENvbW1hbmQgIT0gMHg4MCkKKwl7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDaGVja1JhdGVzKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQJVUNIQVIJCQlTdXBSYXRlW10sCisJSU4gT1VUCVVDSEFSCQkJKlN1cFJhdGVMZW4pCit7CisJVUNIQVIJUmF0ZUlkeCwgaSwgajsKKwlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKKworCU5ld1JhdGVMZW4gPSAwOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJUmF0ZUlkeCA9IDQ7CisJZWxzZQorCQlSYXRlSWR4ID0gMTI7CisKKwkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0CisJZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCisJCQkJTmV3UmF0ZVtOZXdSYXRlTGVuKytdID0gU3VwUmF0ZVtpXTsKKworCSpTdXBSYXRlTGVuID0gTmV3UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBOZXdSYXRlLCBOZXdSYXRlTGVuKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKKwlJTiBVQ0hBUgkJQ2hhbm5lbCkKK3sKKwlVQ0hBUgkJazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKwlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKKworCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgorCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOworCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQorCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOworCQllbHNlCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKKwkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKKwl9CisKKwlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCisJCXsKKwkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVG90YWwgQ2hhbm5lbCBpbiBDaGFubmVsIExpc3QgPSBbJWRdXG4iLCBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKKwlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIEhUIHBoeSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlGQUxTRSBpZiBwQWQtPkNvbW1vbkNmZy5TdXBwb3J0ZWRIdFBoeSBkb2Vzbid0IGFjY2VwdCB0aGUgcEh0Q2FwYWJpbGl0eS4gIChBUCBNb2RlKQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gCVJUTVBDaGVja0h0KAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JVUNIQVIJCQkJCVdjaWQsCisJSU4gCUhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKQoreworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgorCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJLy8gU2F2ZSBQZWVyIENhcGFiaWxpdHkKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwl7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwl9CisKKwlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwl9CisKKwkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7CisgICAgc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJfQorCisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUENoZWNrSHQ6OiBIdENhcEluZm8uQ2hhbm5lbFdpZHRoPSVkLCBSZWNvbVdpZHRoPSVkLCBEZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoPSVkLCBCVzQwTUF2YWlsRm9yQS9HPSVkLyVkLCBQaHlNb2RlPSVkIFxuIiwKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLCBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCwKKwkJcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLCBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGOworCisJLy8gU2VuZCBBc3NvYyBSZXEgd2l0aCBteSBIVCBjYXBhYmlsaXR5LgorCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yOworICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKKwl7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CisJfQorCisgICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCisKKwlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglNaW5pbXVtUmF0ZTsKKwlVQ0hBUglQcm9wZXJNbG1lUmF0ZTsgLy89IFJBVEVfNTQ7CisJVUNIQVIJaSwgaiwgUmF0ZUlkeCA9IDEyOyAvLzEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKwlCT09MRUFOCWJNYXRjaCA9IEZBTFNFOworCisJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFCOgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKKwkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCisJCQkJLy8gQiBvbmx5IEFQCisJCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJZWxzZQorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQorCQkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CS8vIHJ0Mjg2MCBuZWVkIHRvIGNoZWNrIG1sbWVyYXRlIGZvciA4MDIuMTFuCisJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCSAgIE1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vIGVycm9yCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQl7CisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJeworCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCXsKKwkJCQkJYk1hdGNoID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGJNYXRjaCkKKwkJCWJyZWFrOworCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykKKwkJeworCQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZUF1eC5FeHRSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCXsKKwkJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpCisJCQkJCXsKKwkJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGJNYXRjaCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCX0KKworCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOworCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOworfQorCitDSEFSIFJUTVBNYXhSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIENIQVIJCQkJUnNzaTAsCisJSU4gQ0hBUgkJCQlSc3NpMSwKKwlJTiBDSEFSCQkJCVJzc2kyKQoreworCUNIQVIJbGFyZ2VyID0gLTEyNzsKKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCisJeworCQlsYXJnZXIgPSBSc3NpMDsKKwl9CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQorCXsKKwkJbGFyZ2VyID0gbWF4KFJzc2kwLCBSc3NpMSk7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpICYmIChSc3NpMiAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKKwl9CisKKwlpZiAobGFyZ2VyID09IC0xMjcpCisJCWxhcmdlciA9IDA7CisKKwlyZXR1cm4gbGFyZ2VyOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFBlcmlvZGljIGV2YWx1YXRlIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglCQlBSMyA9IDA7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJQkJQUjMgJj0gKH4weDE4KTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlCQlBSMyB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJQkJQUjMgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJQkJQUjMgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCSkKKwl7CisJCVVMT05HCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOworCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgQWZ0ZXIgZXZhbHVhdGlvbiwgY2hlY2sgYW50ZW5uYSBsaW5rIHN0YXR1cworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIJKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIJCQlCQlBSMyA9IDA7CisJQ0hBUgkJCWxhcmdlciA9IC0xMjcsIHJzc2kwLCByc3NpMSwgcnNzaTI7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpCQkJfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJCXJldHVybjsKKworCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJcmV0dXJuOworCisKKwkJLy8gaWYgdGhlIHRyYWZmaWMgaXMgbG93LCB1c2UgYXZlcmFnZSByc3NpIGFzIHRoZSBjcml0ZXJpYQorCQlpZiAocEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID09IFRSVUUpCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKKwkJfQorCisJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwkJeworCQkJbGFyZ2VyID0gbWF4KHJzc2kwLCByc3NpMSk7CisKKwkJCWlmIChsYXJnZXIgPiAocnNzaTIgKyAyMCkpCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQkJZWxzZQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMzsKKwkJfQorCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJeworCQkJaWYgKHJzc2kwID4gKHJzc2kxICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CisJCX0KKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJCUJCUFIzICY9ICh+MHgxOCk7CisJCWlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDMpCisJCXsKKwkJCUJCUFIzIHw9ICgweDEwKTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDIpCisJCXsKKwkJCUJCUFIzIHw9ICgweDgpOworCQl9CisJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMSkKKwkJeworCQkJQkJQUjMgfD0gKDB4MCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit9CisKKworCitWT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQlyZXR1cm47CisKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyVGltZXJDb3VudCsrOworCisvLyBEcml2ZXIgc2hvdWxkIG5vdCBzZW5kIHRyaWdnZXIgZnJhbWUsIGl0IHNob3VsZCBiZSBzZW5kIGJ5IGFwcGxpY2F0aW9uIGxheWVyCisvKgorCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSB8fAorCQkoKChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyVGltZXJDb3VudCUyMCkgPT0gMTkpICYmICghcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSB8fCAhcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyB8fCAhcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSB8fCAhcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyB0cmlnZ2VyIGZyYW1lIGFuZCBlbnRlciBzZXJ2aWNlIHBlcmlvZCB3aGVuIHN1cHBvcnQgQVBTRFxuIikpOworCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCXBBZC0+Q29tbW9uQ2ZnLmJOZWVkU2VuZFRyaWdnZXJGcmFtZSA9IEZBTFNFOworCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyVGltZXJDb3VudCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QgPSBUUlVFOworCX0qLworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldC9yZXNldCBNQUMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBiUGlnZ3lCYWNrIHBhcmFtZXRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorICAgICAgICBiUGlnZ3lCYWNrICAtIEVuYWJsZSAvIERpc2FibGUgUGlnZ3ktQmFjaworCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBiUGlnZ3lCYWNrKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDICBUeExpbmtDZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCisJVHhMaW5rQ2ZnLmZpZWxkLlR4Q0ZBY2tFbiA9IGJQaWdneUJhY2s7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQKKyAgICAgICAgcEVudHJ5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRVUkUKKyAgICAgICAgRkFMU0UKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlCT09MRUFOCQlyZXN1bHQgPSBUUlVFOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCX0KKwkJZWxzZQorCQkJcmVzdWx0ID0gRkFMU0U7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKQorCQkJcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiBGQUxTRTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBmaXggdHggbGVnYWN5IHJhdGUKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJVUNIQVIJdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gdHhfbW9kZTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBPdmVyd3JpdGUgSFQgVHggTW9kZSBieSBGaXhlZCBMZWdlbmN5IFR4IE1vZGUsIGlmIHNwZWNpZmllZC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdFNldHRpbmc7CisKKwlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfSFQpCisJCXJldHVybjsKKworCVRyYW5zbWl0U2V0dGluZy53b3JkID0gMDsKKworCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKKwkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfMykKKwkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKwl9CisJZWxzZQorCXsKKwkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCS8vIE9GRE0gbW9kZSBhbGxvdyBNQ1MgMH43CisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzcpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisJfQorCisJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUpCisJeworCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAorCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJZHluYW1pYyB0dW5lIEJCUCBSNjYgdG8gZmluZCBhIGJhbGFuY2UgYmV0d2VlbiBzZW5zaWJpbGl0eSBhbmQKKwkJbm9pc2UgaXNvbGF0aW9uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1N0YUJicFR1bmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUglPcmlnUjY2VmFsdWUgPSAwLCBSNjY7Ly8sIFI2NlVwcGVyQm91bmQgPSAweDMwLCBSNjZMb3dlckJvdW5kID0gMHgzMDsKKwlDSEFSCVJzc2k7CisKKwkvLyAyODYwQyBkaWQgbm90IHN1cHBvcnQgRmFzZSBDQ0EsIHRoZXJlZm9yZSBjYW4ndCB0dW5lCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQlyZXR1cm47CisKKwkvLworCS8vIHdvcmsgYXMgYSBTVEEKKwkvLworCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgIC8vIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORworCQlyZXR1cm47CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCSkKKwkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkpCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKKwkJUjY2ID0gT3JpZ1I2NlZhbHVlOworCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKKwkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJCWVsc2UKKwkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOworCisJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCXsJLy9CRyBiYW5kCisjaWZkZWYgUlQyODcwCisJCQkvLyBSVDMwNzAgaXMgYSBubyBMTkEgc29sdXRpb24sIGl0IHNob3VsZCBoYXZlIGRpZmZlcmVudCBjb250cm9sIHJlZ2FyZGluZyB0byBBR0MgZ2FpbiBjb250cm9sCisJCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgaGF2ZSBzb21lIHRocm91Z2hwdXQgc2lkZSBlZmZlY3Qgd2hlbiBsb3cgUlNTSQorCQkJaWYgKElTX1JUMzA3MChwQWQpKQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgxQyArIDIqR0VUX0xOQV9HQUlOKHBBZCk7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9ICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJewkvL0EgYmFuZAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKQoreworCVVDSEFSCVI2NiA9IDB4MzA7CisKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCXsJLy8gQkcgYmFuZAorCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJewkvL0EgYmFuZAorCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCit9CisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJQ2hhbm5lbCkKK3sKKworCS8vIFJGIFIyIGJpdCAxOCA9IDAKKwlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCVVDSEFSCQkJaW5kZXg7CisJUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjEgJiAweGZmZmZkZmZmOworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyICYgMHhmZmZiZmZmZjsKKwkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7CisKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJLy8gUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4KKwkJCQkJLy8gU2V0IFJGIFIyIGJpdDE4PTAsIFIzIGJpdFsxODoxOV09MAorCQkJCQkvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCQkJCWlmICgxKQorCQkJCQl7CisJCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIsIFIzKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCBcbiIsCisJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworCitWT0lEIEFzaWNUdXJuT25SRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7CisJCQkJCVIzICY9IDB4ZmZmM2ZmZmY7CisJCQkJCVIzIHw9IDB4MDAwODAwMDA7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAorCQlDaGFubmVsLAorCQlwQWQtPlJmSWNUeXBlLAorCQlSMikpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9uZXRpZl9ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbmV0aWZfYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y3ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbmV0aWZfYmxvY2suYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgIm5ldGlmX2Jsb2NrLmgiCisKK3N0YXRpYyBORVRJRl9FTlRSWSBmcmVlTmV0SWZFbnRyeVBvb2xbRlJFRV9ORVRJRl9QT09MX1NJWkVdOworc3RhdGljIExJU1RfSEVBREVSIGZyZWVOZXRJZkVudHJ5TGlzdDsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpbnQgaTsKKworCWluaXRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBGUkVFX05FVElGX1BPT0xfU0laRTsgaSsrKQorCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpJmZyZWVOZXRJZkVudHJ5UG9vbFtpXSk7CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJCWluaXRMaXN0KCZwQWQtPmJsb2NrUXVldWVUYWJbaV0uTmV0SWZMaXN0KTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpCit7CisJUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKKworCWlmICgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpKSAhPSBOVUxMKQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShwTmV0RGV2KTsKKwkJcE5ldElmRW50cnktPnBOZXREZXYgPSBwTmV0RGV2OworCQlpbnNlcnRUYWlsTGlzdCgmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IFRSVUU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3N0b3BfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKK1ZPSUQgcmVsZWFzZU5ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisJUExJU1RfSEVBREVSIHBOZXRJZkxpc3QgPSAmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0OworCisJd2hpbGUoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdChwTmV0SWZMaXN0KSkgIT0gIE5VTEwpCisJeworCQlQTkVUX0RFViBwTmV0RGV2ID0gcE5ldElmRW50cnktPnBOZXREZXY7CisJCW5ldGlmX3dha2VfcXVldWUocE5ldERldik7CisJCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibmV0aWZfd2FrZV9xdWV1ZSglcylcbiIsIHBOZXREZXYtPm5hbWUpKTsKKwl9CisJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gRkFMU0U7CisJcmV0dXJuOworfQorCisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KQoreworCVBORVRfREVWIE5ldERldiA9IE5VTEw7CisJVUNIQVIgSWZJZHggPSAwOworCUJPT0xFQU4gdmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpICUgTUFYX0FQQ0xJX05VTTsKKwkJTmV0RGV2ID0gcEFkLT5BcENmZy5BcENsaVRhYltJZklkeF0uZGV2OworCX0KKwllbHNlCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworI2lmZGVmIFdEU19TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpCisJeworCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpICUgTUFYX1dEU19FTlRSWTsKKwkJTmV0RGV2ID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCisJeworI2lmZGVmIE1CU1NfU1VQUE9SVAorCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQl7CisJCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQpICUgTUFYX01CU1NJRF9OVU07CisJCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLk1CU1NJRFtJZklkeF0uTVNTSUREZXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworCQl9CisjZWxzZQorCQlJZklkeCA9IE1BSU5fTUJTU0lEOworCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7CisjZW5kaWYKKwl9CisKKwkvLyBXTU0gc3VwcG9ydCA0IHNvZnR3YXJlIHF1ZXVlcy4KKwkvLyBPbmUgc29mdHdhcmUgcXVldWUgZnVsbCBkb2Vzbid0IG1lYW4gZGV2aWNlIGhhdmUgbm8gY2FwYmlsaXR5IHRvIHRyYW5zbWl0IHBhY2tldC4KKwkvLyBTbyBkaXNhYmxlIGJsb2NrIE5ldC1JZiBxdWV1ZSBmdW5jdGlvbiB3aGlsZSBXTU0gZW5hYmxlLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXZhbGlkID0gKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID09IFRSVUUpID8gRkFMU0UgOiBUUlVFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHZhbGlkKQorCQlibG9ja05ldElmKCZwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XSwgTmV0RGV2KTsKKwlyZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0wLDAgKzEsNDEzMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJmaXJtd2FyZS5oIgorCisvLyNkZWZpbmUgQklOX0lOX0ZJTEUgLyogdXNlICouYmluIGZpcm13YXJlICovCisKK1VDSEFSICAgIEJJVDhbXSA9IHsweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKK1VMT05HICAgIEJJVDMyW10gPSB7MHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwOCwKKwkJCQkJMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA4MCwKKwkJCQkJMHgwMDAwMDEwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDgwMCwKKwkJCQkJMHgwMDAwMTAwMCwgMHgwMDAwMjAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwODAwMCwKKwkJCQkJMHgwMDAxMDAwMCwgMHgwMDAyMDAwMCwgMHgwMDA0MDAwMCwgMHgwMDA4MDAwMCwKKwkJCQkJMHgwMDEwMDAwMCwgMHgwMDIwMDAwMCwgMHgwMDQwMDAwMCwgMHgwMDgwMDAwMCwKKwkJCQkJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkJCQkJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMH07CisKK2NoYXIqICAgQ2lwaGVyTmFtZVtdID0geyJub25lIiwid2VwNjQiLCJ3ZXAxMjgiLCJUS0lQIiwiQUVTIiwiQ0tJUDY0IiwiQ0tJUDEyOCJ9OworCitjb25zdCB1bnNpZ25lZCBzaG9ydCBjY2l0dF8xNlRhYmxlW10gPSB7CisJMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBBNSwgMHg2MEM2LCAweDcwRTcsCisJMHg4MTA4LCAweDkxMjksIDB4QTE0QSwgMHhCMTZCLCAweEMxOEMsIDB4RDFBRCwgMHhFMUNFLCAweEYxRUYsCisJMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyQjUsIDB4NDI5NCwgMHg3MkY3LCAweDYyRDYsCisJMHg5MzM5LCAweDgzMTgsIDB4QjM3QiwgMHhBMzVBLCAweEQzQkQsIDB4QzM5QywgMHhGM0ZGLCAweEUzREUsCisJMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0RTYsIDB4NzRDNywgMHg0NEE0LCAweDU0ODUsCisJMHhBNTZBLCAweEI1NEIsIDB4ODUyOCwgMHg5NTA5LCAweEU1RUUsIDB4RjVDRiwgMHhDNUFDLCAweEQ1OEQsCisJMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2RDcsIDB4NjZGNiwgMHg1Njk1LCAweDQ2QjQsCisJMHhCNzVCLCAweEE3N0EsIDB4OTcxOSwgMHg4NzM4LCAweEY3REYsIDB4RTdGRSwgMHhENzlELCAweEM3QkMsCisJMHg0OEM0LCAweDU4RTUsIDB4Njg4NiwgMHg3OEE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCisJMHhDOUNDLCAweEQ5RUQsIDB4RTk4RSwgMHhGOUFGLCAweDg5NDgsIDB4OTk2OSwgMHhBOTBBLCAweEI5MkIsCisJMHg1QUY1LCAweDRBRDQsIDB4N0FCNywgMHg2QTk2LCAweDFBNzEsIDB4MEE1MCwgMHgzQTMzLCAweDJBMTIsCisJMHhEQkZELCAweENCREMsIDB4RkJCRiwgMHhFQjlFLCAweDlCNzksIDB4OEI1OCwgMHhCQjNCLCAweEFCMUEsCisJMHg2Q0E2LCAweDdDODcsIDB4NENFNCwgMHg1Q0M1LCAweDJDMjIsIDB4M0MwMywgMHgwQzYwLCAweDFDNDEsCisJMHhFREFFLCAweEZEOEYsIDB4Q0RFQywgMHhERENELCAweEFEMkEsIDB4QkQwQiwgMHg4RDY4LCAweDlENDksCisJMHg3RTk3LCAweDZFQjYsIDB4NUVENSwgMHg0RUY0LCAweDNFMTMsIDB4MkUzMiwgMHgxRTUxLCAweDBFNzAsCisJMHhGRjlGLCAweEVGQkUsIDB4REZERCwgMHhDRkZDLCAweEJGMUIsIDB4QUYzQSwgMHg5RjU5LCAweDhGNzgsCisJMHg5MTg4LCAweDgxQTksIDB4QjFDQSwgMHhBMUVCLCAweEQxMEMsIDB4QzEyRCwgMHhGMTRFLCAweEUxNkYsCisJMHgxMDgwLCAweDAwQTEsIDB4MzBDMiwgMHgyMEUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCisJMHg4M0I5LCAweDkzOTgsIDB4QTNGQiwgMHhCM0RBLCAweEMzM0QsIDB4RDMxQywgMHhFMzdGLCAweEYzNUUsCisJMHgwMkIxLCAweDEyOTAsIDB4MjJGMywgMHgzMkQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCisJMHhCNUVBLCAweEE1Q0IsIDB4OTVBOCwgMHg4NTg5LCAweEY1NkUsIDB4RTU0RiwgMHhENTJDLCAweEM1MEQsCisJMHgzNEUyLCAweDI0QzMsIDB4MTRBMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCisJMHhBN0RCLCAweEI3RkEsIDB4ODc5OSwgMHg5N0I4LCAweEU3NUYsIDB4Rjc3RSwgMHhDNzFELCAweEQ3M0MsCisJMHgyNkQzLCAweDM2RjIsIDB4MDY5MSwgMHgxNkIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCisJMHhEOTRDLCAweEM5NkQsIDB4RjkwRSwgMHhFOTJGLCAweDk5QzgsIDB4ODlFOSwgMHhCOThBLCAweEE5QUIsCisJMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4QzAsIDB4MDhFMSwgMHgzODgyLCAweDI4QTMsCisJMHhDQjdELCAweERCNUMsIDB4RUIzRiwgMHhGQjFFLCAweDhCRjksIDB4OUJEOCwgMHhBQkJCLCAweEJCOUEsCisJMHg0QTc1LCAweDVBNTQsIDB4NkEzNywgMHg3QTE2LCAweDBBRjEsIDB4MUFEMCwgMHgyQUIzLCAweDNBOTIsCisJMHhGRDJFLCAweEVEMEYsIDB4REQ2QywgMHhDRDRELCAweEJEQUEsIDB4QUQ4QiwgMHg5REU4LCAweDhEQzksCisJMHg3QzI2LCAweDZDMDcsIDB4NUM2NCwgMHg0QzQ1LCAweDNDQTIsIDB4MkM4MywgMHgxQ0UwLCAweDBDQzEsCisJMHhFRjFGLCAweEZGM0UsIDB4Q0Y1RCwgMHhERjdDLCAweEFGOUIsIDB4QkZCQSwgMHg4RkQ5LCAweDlGRjgsCisJMHg2RTE3LCAweDdFMzYsIDB4NEU1NSwgMHg1RTc0LCAweDJFOTMsIDB4M0VCMiwgMHgwRUQxLCAweDFFRjAKK307CisjZGVmaW5lIEJ5dGVDUkMxNih2LCBjcmMpIFwKKwkodW5zaWduZWQgc2hvcnQpKChjcmMgPDwgOCkgXiAgY2NpdHRfMTZUYWJsZVsoKGNyYyA+PiA4KSBeICh2KSkgJiAyNTVdKQorCit1bnNpZ25lZCBjaGFyIEJpdFJldmVyc2UodW5zaWduZWQgY2hhciB4KQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgVGVtcD0wOworCWZvcihpPTA7IDsgaSsrKQorCXsKKwkJaWYoeCAmIDB4ODApCVRlbXAgfD0gMHg4MDsKKwkJaWYoaT09NykJCWJyZWFrOworCQl4CTw8PSAxOworCQlUZW1wID4+PSAxOworCX0KKwlyZXR1cm4gVGVtcDsKK30KKworLy8KKy8vIEJCUCByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKKy8vCitSRUdfUEFJUiAgIEJCUFJlZ1RhYmxlW10gPSB7CisJe0JCUF9SNjUsCQkweDJDfSwJCS8vIGZpeCByc3NpIGlzc3VlCisJe0JCUF9SNjYsCQkweDM4fSwJLy8gQWxzbyBzZXQgdGhpcyBkZWZhdWx0IHZhbHVlIHRvIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSBhdCBpbml0aWFsCisJe0JCUF9SNjksCQkweDEyfSwKKwl7QkJQX1I3MCwJCTB4YX0sCS8vIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhCisJe0JCUF9SNzMsCQkweDEwfSwKKwl7QkJQX1I4MSwJCTB4Mzd9LAorCXtCQlBfUjgyLAkJMHg2Mn0sCisJe0JCUF9SODMsCQkweDZBfSwKKwl7QkJQX1I4NCwJCTB4OTl9LAkvLyAweDE5IGlzIGZvciBydDI4NjBFIGFuZCBhZnRlci4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAweDk5IGlzIGZvciBydDI4NjBEIGFuZCBiZWZvcmUKKwl7QkJQX1I4NiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKKwl7QkJQX1I5MSwJCTB4MDR9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKKwl7QkJQX1I5MiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKKwl7QkJQX1IxMDMsICAJMHgwMH0sIAkvLyBuZWFyIHJhbmdlIGhpZ2gtcG93ZXIgaXNzdWUsIHJlcXVlc3RlZCBmcm9tIEdhcnkgQDIwMDgtMDUyOAorCXtCQlBfUjEwNSwJCTB4MDV9LAkvLyAweDA1IGlzIGZvciBydDI4NjBFIHRvIHR1cm4gb24gRkVRIGNvbnRyb2wuIEl0IGlzIHNhZmUgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSwgYmVjYXVzZSBCaXQgNzoyIGFyZSByZXNlcnZlZCBpbiBydDI4NjBEIGFuZCBiZWZvcmUuCit9OworI2RlZmluZQlOVU1fQkJQX1JFR19QQVJNUwkoc2l6ZW9mKEJCUFJlZ1RhYmxlKSAvIHNpemVvZihSRUdfUEFJUikpCisKKy8vCisvLyBSRiByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKKy8vCisjaWZkZWYgUlQyODcwCitSRUdfUEFJUiAgIFJUMzB4eF9SRlJlZ1RhYmxlW10gPSB7CisgICAgICAgIHtSRl9SMDQsICAgICAgICAgIDB4NDB9LAorICAgICAgICB7UkZfUjA1LCAgICAgICAgICAweDAzfSwKKyAgICAgICAge1JGX1IwNiwgICAgICAgICAgMHgwMn0sCisgICAgICAgIHtSRl9SMDcsICAgICAgICAgIDB4NzB9LAorICAgICAgICB7UkZfUjA5LCAgICAgICAgICAweDBGfSwKKyAgICAgICAge1JGX1IxMCwgICAgICAgICAgMHg3MX0sCisgICAgICAgIHtSRl9SMTEsICAgICAgICAgIDB4MjF9LAorICAgICAgICB7UkZfUjEyLCAgICAgICAgICAweDdCfSwKKyAgICAgICAge1JGX1IxNCwgICAgICAgICAgMHg5MH0sCisgICAgICAgIHtSRl9SMTUsICAgICAgICAgIDB4NTh9LAorICAgICAgICB7UkZfUjE2LCAgICAgICAgICAweEIzfSwKKyAgICAgICAge1JGX1IxNywgICAgICAgICAgMHg5Mn0sCisgICAgICAgIHtSRl9SMTgsICAgICAgICAgIDB4MkN9LAorICAgICAgICB7UkZfUjE5LCAgICAgICAgICAweDAyfSwKKyAgICAgICAge1JGX1IyMCwgICAgICAgICAgMHhCQX0sCisgICAgICAgIHtSRl9SMjEsICAgICAgICAgIDB4REJ9LAorICAgICAgICB7UkZfUjI0LCAgICAgICAgICAweDE2fSwKKyAgICAgICAge1JGX1IyNSwgICAgICAgICAgMHgwMX0sCisgICAgICAgIHtSRl9SMjcsICAgICAgICAgIDB4MDN9LAorICAgICAgICB7UkZfUjI5LCAgICAgICAgICAweDFGfSwKK307CisjZGVmaW5lCU5VTV9SRl9SRUdfUEFSTVMJKHNpemVvZihSVDMweHhfUkZSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisvLworLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCisvLworCitSVE1QX1JFR19QQUlSCU1BQ1JlZ1RhYmxlW10gPQl7CisjaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbHNlCisgICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQorI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KKworCXtMRUdBQ1lfQkFTSUNfUkFURSwJCTB4MDAwMDAxM2Z9LCAvLyAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwCisJe0hUX0JBU0lDX1JBVEUsCQkweDAwMDA4MDAzfSwgLy8gQmFzaWMgSFQgcmF0ZSBzZXQgLCAyME0sIE1DUz0zLCBNTS4gRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGluIFRYV0kuCisJe01BQ19TWVNfQ1RSTCwJCTB4MDB9LCAvLyAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYCisJe1JYX0ZJTFRSX0NGRywJCTB4MTdmOTd9LCAvLzB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwKKwl7QktPRkZfU0xPVF9DRkcsCTB4MjA5fSwgLy8gZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyCisJe1RYX1NXX0NGRzAsCQkweDB9LCAJCS8vIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QKKwl7VFhfU1dfQ0ZHMSwJCTB4ODA2MDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKKwl7VFhfTElOS19DRkcsCQkweDEwMjB9LAkJLy8gR2FyeSwyMDA2LTA4LTIzCisJLy97VFhfVElNRU9VVF9DRkcsCTB4MDAxODIwOTB9LAkvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQKKwl7VFhfVElNRU9VVF9DRkcsCTB4MDAwYTIwOTB9LAkvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQgLCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAxCisJe01BWF9MRU5fQ0ZHLAkJTUFYX0FHR1JFR0FUSU9OX1NJWkUgfCAweDAwMDAxMDAwfSwJLy8gMHgzMDE4LCBNQVggZnJhbWUgbGVuZ3RoLiBNYXggUFNEVSA9IDE2a2J5dGVzLgorCXtMRURfQ0ZHLAkJMHg3ZjAzMWU0Nn0sIC8vIEdhcnksIDIwMDYtMDgtMjMKKwl7UEJGX01BWF9QQ05ULAkJCTB4MUYzRkJGOUZ9LCAJLy8weDFGM2Y3ZjlmfSwJCS8vSmFuLCAyMDA2LzA0LzIwCisJLy97VFhfUlRZX0NGRywJCQkweDZiYjgwNDA4fSwJLy8gSmFuLCAyMDA2LzExLzE2CisJe1RYX1JUWV9DRkcsCQkJMHg0N2QwMWYwZn0sCS8vIEphbiwgMjAwNi8xMS8xNiwgU2V0IFR4V0ktPkFDSyA9MCBpbiBQcm9iZSBSc3AgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMworCXtBVVRPX1JTUF9DRkcsCQkJMHgwMDAwMDAxM30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgorCXtDQ0tfUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKwl7T0ZETV9QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgorI2lmZGVmIFJUMjg3MAorCXtQQkZfQ0ZHLCAJCQkJMHhmNDAwMDZ9LCAJCS8vIE9ubHkgZW5hYmxlIFF1ZXVlIDIKKwl7TU00MF9QUk9UX0NGRywJCQkweDNGNDQwODR9LAkJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCisJe1dQRE1BX0dMT19DRkcsCQkJMHgwMDAwMDAzMH0sCisjZW5kaWYgLy8gUlQyODcwIC8vCisJe0dGMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sICAgIC8vIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTCisJe0dGNDBfUFJPVF9DRkcsCQkJMHgwM0Y0NDA4NH0sCisJe01NMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sCisJe1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCisJe1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCisvLyNpZmRlZiBXSUZJX1RFU1QKKwl7RVhQX0FDS19USU1FLAkJCTB4MDAyNDAwY2F9LAkvLyBkZWZhdWx0IHZhbHVlCisvLyNlbHNlCisvLwl7RVhQX0FDS19USU1FLAkJCTB4MDA1NDAwY2F9LAkvLyBzdWdnZXN0ZWQgYnkgR3JheSBAIDIwMDcwMzIzIGZvciAxMW4gaW50ZWwtc3RhIHRocm91Z2hwdXQKKy8vI2VuZGlmIC8vIGVuZCAtIFdJRklfVEVTVCAvLworCXtUWE9QX0hMRFJfRVQsIAkJCTB4MDAwMDAwMDJ9LAorCisJLyogSmVycnkgY29tbWVudHMgMjAwOC8wMS8xNjogd2UgdXNlIFNJRlMgPSAxMHVzIGluIENDSyBkZWZhdWx0bHksIGJ1dCBpdCBzZWVtcyB0aGF0IDEwdXMKKwkJaXMgdG9vIHNtYWxsIGZvciBJTlRFTCAyMjAwYmcgY2FyZCwgc28gaW4gTUJTUyBtb2RlLCB0aGUgZGVsdGEgdGltZSBiZXR3ZWVuIGJlYWNvbjAKKwkJYW5kIGJlYWNvbjEgaXMgU0lGUyAoMTB1cyksIHNvIGlmIElOVEVMIDIyMDBiZyBjYXJkIGNvbm5lY3RzIHRvIEJTUzAsIHRoZSBwaW5nCisJCXdpbGwgYWx3YXlzIGxvc3QuIFNvIHdlIGNoYW5nZSB0aGUgU0lGUyBvZiBDQ0sgZnJvbSAxMHVzIHRvIDE2dXMuICovCisJe1hJRlNfVElNRV9DRkcsCQkJMHgzM2E0MTAxMH0sCisJe1BXUl9QSU5fQ0ZHLAkJCTB4MDAwMDAwMDN9LAkvLyBwYXRjaCBmb3IgMjg4MC1FCit9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1JUTVBfUkVHX1BBSVIJU1RBTUFDUmVnVGFibGVbXSA9CXsKKwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDIyNzN9LAorCXtXTU1fQ1dNSU5fQ0ZHLAkweDAwMDAyMzQ0fSwKKwl7V01NX0NXTUFYX0NGRywJMHgwMDAwMzRhYX0sCit9OworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUJTlVNX1NUQV9NQUNfUkVHX1BBUk1TCShzaXplb2YoU1RBTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODcwCisvLworLy8gUlQyODcwIEZpcm13YXJlIFNwZWMgb25seSB1c2VkIDEgb2N0IGZvciB2ZXJzaW9uIGV4cHJlc3Npb24KKy8vCisjZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JNworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJKHNpemVvZiAoRmlybXdhcmVJbWFnZSkgLyBzaXplb2YoVUNIQVIpKQorI2RlZmluZSBGSVJNV0FSRV9NQUpPUl9WRVJTSU9OCTAKKworI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICTB4MTAwMAorI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICTB4MTAwMAorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiAgUFZPSUQJaGFuZGxlLAorCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwlJTlQgCQkJaW5kZXg7CisJVUNIQVIJCQkqcEJlYWNvbkJ1ZiA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jQWRhcHRlckJsb2NrXG4iKSk7CisKKwkqcHBBZGFwdGVyID0gTlVMTDsKKworCWRvCisJeworCQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWVtb3J5IGJsb2NrCisJCXBCZWFjb25CdWYgPSBrbWFsbG9jKE1BWF9CRUFDT05fU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocEJlYWNvbkJ1ZiA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEJlYWNvbkJ1ZiFcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAoUFZPSUQgKikmcEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQURBUFRFUlxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJcEFkLT5CZWFjb25CdWYgPSBwQmVhY29uQnVmOworCQlwcmludGsoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKTsKKworCisJCS8vIEluaXQgc3BpbiBsb2NrcworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisJCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCQl7CisJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisJCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOworCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKKwkJfQorCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKKworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmICgoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpICYmIChwQmVhY29uQnVmKSkKKwkJa2ZyZWUocEJlYWNvbkJ1Zik7CisKKwkqcHBBZGFwdGVyID0gcEFkOworCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPC0tIFJUTVBBbGxvY0FkYXB0ZXJCbG9jaywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIFR4IHBvd2VyIHBlciBNQ1MgYW5kIEJXIGZyb20gRUVQUk9NCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QUmVhZFR4UHdyUGVyUmF0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVTE9ORwkJZGF0YSwgQWRhdGEsIEdkYXRhOworCVVTSE9SVAkJaSwgdmFsdWUsIHZhbHVlMjsKKwlJTlQJCQlBcHdyZGVsdGEsIEdwd3JkZWx0YTsKKwlVQ0hBUgkJdDEsdDIsdDMsdDQ7CisJQk9PTEVBTgkJYlZhbGlkLCBiQXB3cmRlbHRhTWludXMgPSBUUlVFLCBiR3B3cmRlbHRhTWludXMgPSBUUlVFOworCisJLy8KKwkvLyBHZXQgcG93ZXIgZGVsdGEgZm9yIDIwTUh6IGFuZCA0ME1Iei4KKwkvLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4cG93ZXIgcGVyIFJhdGVcbiIpKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0RFTFRBLCB2YWx1ZTIpOworCUFwd3JkZWx0YSA9IDA7CisJR3B3cmRlbHRhID0gMDsKKworCWlmICgodmFsdWUyICYgMHhmZikgIT0gMHhmZikKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MCkpCisJCQlHcHdyZGVsdGEgPSAodmFsdWUyJjB4Zik7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwKSkKKwkJCWJHcHdyZGVsdGFNaW51cyA9IEZBTFNFOworCQllbHNlCisJCQliR3B3cmRlbHRhTWludXMgPSBUUlVFOworCX0KKwlpZiAoKHZhbHVlMiAmIDB4ZmYwMCkgIT0gMHhmZjAwKQorCXsKKwkJaWYgKCh2YWx1ZTIgJiAweDgwMDApKQorCQkJQXB3cmRlbHRhID0gKCh2YWx1ZTImMHhmMDApPj44KTsKKworCQlpZiAoKHZhbHVlMiAmIDB4NDAwMCkpCisJCQliQXB3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkFwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR3B3cmRlbHRhID0gJXgsIEFwd3JkZWx0YSA9ICV4IC5cbiIsIEdwd3JkZWx0YSwgQXB3cmRlbHRhKSk7CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDIuNEcuCisJLy8KKwlmb3IgKGk9MDsgaTw1OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCWRhdGEgPSB2YWx1ZTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKwkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOworCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKwkJZGF0YSB8PSAodmFsdWU8PDE2KTsKKworCQlwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gPSBBZGF0YTsKKwkJcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldID0gR2RhdGE7CisKKwkJaWYgKGRhdGEgIT0gMHhmZmZmZmZmZikKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgZGF0YSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgMi40RyBiYW5kLSVseCwgIEFkYXRhID0gJWx4LCAgR2RhdGEgPSAlbHggXG4iLCBkYXRhLCBBZGF0YSwgR2RhdGEpKTsKKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDIuNEcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKKwkvLworCWJWYWxpZCA9IFRSVUU7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gMi40Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyBpKjQsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJR2RhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEdkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSBHZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCAyLjRHIGJhbmQsIEdkYXRhID0gJWx4IFxuIiwgR2RhdGEpKTsKKwkJfQorCX0KKworCS8vCisJLy8gQ2hlY2sgdGhpcyBibG9jayBpcyB2YWxpZCBmb3IgMjBNSHogaW4gNUcuIElmIGludmFsaWQsIHVzZSBwYXJhbWV0ZXIgZm9yIDIwTUh6IGluIDIuNEcKKwkvLworCWJWYWxpZCA9IFRSVUU7CisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDIwTUh6IGluIDVHLgorCS8vCisJaWYgKGJWYWxpZCkKKwl7CisJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJeworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOworCisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUFkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyME1IeiBCVywgNUdIeiBiYW5kLCBBZGF0YSA9ICVseCBcbiIsIEFkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDQwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciA0ME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdID0gKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpKzFdICYgMHgwMDAwRkZGRikgfCAoQWRhdGEgJiAweEZGRkYwMDAwKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiNDBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgY2hhbm5lbCBwb3dlciBwYXJhbWV0ZXJzIGZyb20gRUVQUk9NCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QUmVhZENoYW5uZWxQd3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCQkJaSwgY2hvZmZzZXQ7CisJRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7CisJRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXIyOworCisJLy8gUmVhZCBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzCisJLy8gVmFsdWUgZnJvbSAxIC0gMHg3Zi4gRGVmYXVsdCB2YWx1ZSBpcyAyNC4KKwkvLyBQb3dlciB2YWx1ZSA6IDIuNEcgMHgwMCAoMCkgfiAweDFGICgzMSkKKwkvLyAgICAgICAgICAgICA6IDUuNUcgMHhGOSAoLTcpIH4gMHgwRiAoMTUpCisKKwkvLyAwLiAxMWIvZywgY2gxIC0gY2ggMTQKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCQlwQWQtPlR4UG93ZXJbaSAqIDJdLkNoYW5uZWwgPSBpICogMiArIDE7CisJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLkNoYW5uZWwgPSBpICogMiArIDI7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTAgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTEgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyAxLiBVLU5JSSBsb3dlci9taWRkbGUgYmFuZDogMzYsIDM4LCA0MDsgNDQsIDQ2LCA0ODsgNTIsIDU0LCA1NjsgNjAsIDYyLCA2NCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDEuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwl9CisKKwkvLyAxLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworLy8JCVBvd2VyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgaSAqIDIpOworLy8JCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMik7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQgKyAxMjsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAyLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworLy8JCVBvd2VyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworLy8JCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMik7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMy4gVS1OSUkgdXBwZXIgYmFuZDogMTQ5LCAxNTEsIDE1MzsgMTU3LCAxNTksIDE2MTsgMTY1IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMy4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2OworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwl9CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE2NTsKKwlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCS8vIDMuMiBGaWxsIHVwIHBvd2VyCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisvLwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMik7CisvLwkJUG93ZXIyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisKKwkvLyA0LiBQcmludCBhbmQgRGVidWcKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSByZWdpc3RyeQorCQkxLiBBbGwgdGhlIHBhcmFtZXRlcnMKKwkJMi4gTmV0d29ya0FkZHJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQJRm9yIHVzZSBieSBOZGlzT3BlbkNvbmZpZ3VyYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpCit7CisJTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKyNpZmRlZiBSVDI4NzAKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlGb3IgUkYgZmlsdGVyIGNhbGlicmF0aW9uIHB1cnBvc2UKKworCUFyZ3VtZW50czoKKwkJcEFkICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUVVNCRmlsdGVyQ2FsaWJyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZTsKKwlVSU5UCWxvb3AgPSAwLCBjb3VudCA9IDAsIGxvb3BjbnQgPSAwLCBSZVRyeSA9IDA7CisJVUNIQVIJUkZfUjI0X1ZhbHVlID0gMDsKKworCS8vIEdpdmUgYmJwIGZpbHRlciBpbml0aWFsIHZhbHVlCisJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAweDE2OworCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gMHgzNjsgIC8vQml0WzVdIG11c3QgYmUgMSBmb3IgQlcgNDAKKworCWRvCisJeworCQlpZiAobG9vcCA9PSAxKQkvL0JhbmRXaWR0aCA9IDQwIE1IegorCQl7CisJCQkvLyBXcml0ZSAweDI3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUkZfUjI0X1ZhbHVlID0gMHgyNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCUZpbHRlclRhcmdldCA9IDB4MTk7CisKKwkJCS8vIHdoZW4gY2FsaWJyYXRlIEJXNDAsIEJCUCBtYXNrIG11c3Qgc2V0IHRvIEJXNDAuCisJCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCX0KKwkJZWxzZQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6CisJCXsKKwkJCS8vIFdyaXRlIDB4MDcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCisJCQlSRl9SMjRfVmFsdWUgPSAweDA3OworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNjsKKwkJfQorCisJCS8vIFdyaXRlIDB4MDEgdG8gUkZfUjIyIHRvIGVuYWJsZSBiYXNlYmFuZCBsb29wYmFjayBtb2RlCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOworCQl2YWx1ZSB8PSAweDAxOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKKworCQkvLyBXcml0ZSAweDAwIHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHBhc3NiYW5kIHRlc3QgdG9uZQorCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjI0LCAwKTsKKworCQlkbworCQl7CisJCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCisJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjI1LCAweDkwKTsKKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCS8vIFJlYWQgQkJQX1I1NVs2OjBdIGZvciByZWNlaXZlZCBwb3dlciwgc2V0IFI1NXggPSBCQlBfUjU1WzY6MF0KKwkJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCVI1NXggPSB2YWx1ZSAmIDB4RkY7CisKKwkJfSB3aGlsZSAoKFJlVHJ5KysgPCAxMDApICYmIChSNTV4ID09IDApKTsKKworCQkvLyBXcml0ZSAweDA2IHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHN0b3BiYW5kIHRlc3QgdG9uZQorCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjI0LCAweDA2KTsKKworCQl3aGlsZShUUlVFKQorCQl7CisJCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCisJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjI1LCAweDkwKTsKKworCQkJLy9XZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjU1LCAmdmFsdWUpOworCQkJdmFsdWUgJj0gMHhGRjsKKwkJCWlmICgoUjU1eCAtIHZhbHVlKSA8IEZpbHRlclRhcmdldCkKKwkJCXsKKwkJCQlSRl9SMjRfVmFsdWUgKys7CisJCQl9CisJCQllbHNlIGlmICgoUjU1eCAtIHZhbHVlKSA9PSBGaWx0ZXJUYXJnZXQpCisJCQl7CisJCQkJUkZfUjI0X1ZhbHVlICsrOworCQkJCWNvdW50ICsrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBwcmV2ZW50IGluZmluaXRlIGxvb3AgY2F1c2UgZHJpdmVyIGhhbmcuCisJCQlpZiAobG9vcGNudCsrID4gMTAwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsIGxvb3BjbnQpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gV3JpdGUgUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisJCX0KKworCQlpZiAoY291bnQgPiAwKQorCQl7CisJCQlSRl9SMjRfVmFsdWUgPSBSRl9SMjRfVmFsdWUgLSAoKGNvdW50KSA/ICgxKSA6ICgwKSk7CisJCX0KKworCQkvLyBTdG9yZSBmb3IgZnV0dXJlIHVzYWdlCisJCWlmIChsb29wY250IDwgMTAwKQorCQl7CisJCQlpZiAobG9vcCsrID09IDApCisJCQl7CisJCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKKwkJCQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy9CYW5kV2lkdGggPSA0MCBNSHoKKwkJCQlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IChVQ0hBUilSRl9SMjRfVmFsdWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCisJCS8vIHJlc2V0IGNvdW50CisJCWNvdW50ID0gMDsKKwl9IHdoaWxlKFRSVUUpOworCisJLy8KKwkvLyBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlCisJLy8KKwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjI0LCAwKTsKKworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOworCXZhbHVlICY9IH4oMHgwMSk7CisJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7CisKKwkvLyBzZXQgQkJQIGJhY2sgdG8gQlcyMAorCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCUJCUFZhbHVlJj0gKH4weDE4KTsKKwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUVVNCRmlsdGVyQ2FsaWJyYXRpb24gLSBDYWxpQlcyMFJmUjI0PTB4JXgsIENhbGlCVzQwUmZSMjQ9MHgleFxuIiwgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Cit9CisKKworVk9JRCBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UIGk7CisJLy8gRHJpdmVyIG11c3QgcmVhZCBFRVBST00gdG8gZ2V0IFJmSWNUeXBlIGJlZm9yZSBpbml0aWFsIFJGIHJlZ2lzdGVycworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICBpZiAoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkgfHwocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEluaXQgUkYgY2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgICAvLyBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMKKyAgICAgICAgICAgICAgICBVTE9ORyBSZlJlZyA9IDA7CisgICAgICAgICAgICAgICAgUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChQVUNIQVIpJlJmUmVnKTsKKyAgICAgICAgICAgICAgICBSZlJlZyB8PSAweDgwOworICAgICAgICAgICAgICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKKyAgICAgICAgICAgICAgICBSVE1QdXNlY0RlbGF5KDEwMDApOworICAgICAgICAgICAgICAgIFJmUmVnICY9IDB4N0Y7CisgICAgICAgICAgICAgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOworCisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgorICAgICAgICAgICAgICAgIFJUVVNCRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKKyAgICAgICAgfQorCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBwYXJhbWV0ZXJzIGZyb20gRUVQUk9NCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQltYWNfYWRkcikKK3sKKwlVSU5UMzIJCQlkYXRhID0gMDsKKwlVU0hPUlQJCQlpLCB2YWx1ZSwgdmFsdWUyOworCVVDSEFSCQkJVG1wUGh5OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9WRVJTSU9OX1NUUlVDICAgIFZlcnNpb247CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworCisJLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKKworCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2CisJZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgorCWVsc2UKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOworCisJLy8gUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZQorCS8vIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcKKwlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAorCQlzdHJsZW4obWFjX2FkZHIpICE9IDE3IHx8CisJCW1hY19hZGRyWzJdICE9ICc6JyAgfHwgbWFjX2FkZHJbNV0gIT0gJzonICB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKKwkJbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKQorCXsKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBBZGRyMDEpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIEFkZHIyMyk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgQWRkcjQ1KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBFMlBST00gXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCUlOVAkJajsKKwkJUFVDSEFSCW1hY3B0cjsKKworCQltYWNwdHIgPSBtYWNfYWRkcjsKKworCQlmb3IgKGo9MDsgajxNQUNfQUREUl9MRU47IGorKykKKwkJeworCQkJQXRvSChtYWNwdHIsICZwQWQtPlBlcm1hbmVudEFkZHJlc3Nbal0sIDEpOworCQkJbWFjcHRyPW1hY3B0ciszOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7CisJfQorCisKKwl7CisjaWYgMAorCQlVU0hPUlQgIEFkZHIwMSxBZGRyMjMsQWRkcjQ1IDsKKworCQlBZGRyMDE9UlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCk7CisJCUFkZHIyMz1SVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA2KTsKKwkJQWRkcjQ1PVJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgpOworCisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IChVQ0hBUikoQWRkcjAxICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSA9IChVQ0hBUikoQWRkcjAxID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0gPSAoVUNIQVIpKEFkZHIyMyAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10gPSAoVUNIQVIpKEFkZHIyMyA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdID0gKFVDSEFSKShBZGRyNDUgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gKFVDSEFSKShBZGRyNDUgPj4gOCk7CisjZW5kaWYKKwkJLy9tb3JlIGNvbnZlbmluZXQgdG8gdGVzdCBtYnNzaWQsIHNvIGFwJ3MgYnNzaWQgJjB4ZjEKKwkJaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweGZmKQorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7CisKKwkJLy9pZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4ZmYpCisJCS8vCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10sCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkKKwkJeworCQkJTUFDX0RXMF9TVFJVQyBjc3IyOworCQkJTUFDX0RXMV9TVFJVQyBjc3IzOworCQkJQ09QWV9NQUNfQUREUihwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworCQkJY3NyMi5maWVsZC5CeXRlMCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMF07CisJCQljc3IyLmZpZWxkLkJ5dGUxID0gcEFkLT5DdXJyZW50QWRkcmVzc1sxXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdOworCQkJY3NyMi5maWVsZC5CeXRlMyA9IHBBZC0+Q3VycmVudEFkZHJlc3NbM107CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQUREUl9EVzAsIGNzcjIud29yZCk7CisJCQljc3IzLndvcmQgPSAwOworCQkJY3NyMy5maWVsZC5CeXRlNCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNF07CisJCQljc3IzLmZpZWxkLkJ5dGU1ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s1XTsKKwkJCWNzcjMuZmllbGQuVTJNZU1hc2sgPSAweGZmOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcxLCBjc3IzLndvcmQpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCX0KKwl9CisKKwkvLyBpZiBub3QgcmV0dXJuIGVhcmx5LiBjYXVzZSBmYWlsIGF0IGVtdWxhdGlvbi4KKwkvLyBJbml0IHRoZSBjaGFubmVsIG51bWJlciBmb3IgVFggY2hhbm5lbCBwb3dlcgorCVJUTVBSZWFkQ2hhbm5lbFB3cihwQWQpOworCisJLy8gaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwCisJLy8gYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9WRVJTSU9OX09GRlNFVCwgVmVyc2lvbi53b3JkKTsKKwlwQWQtPkVlcHJvbVZlcnNpb24gPSBWZXJzaW9uLmZpZWxkLlZlcnNpb24gKyBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIgKiAyNTY7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIpKTsKKworCWlmIChWZXJzaW9uLmZpZWxkLlZlcnNpb24gPiBWQUxJRF9FRVBST01fVkVSU0lPTikKKwl7CisJCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWQUxJRF9FRVBST01fVkVSU0lPTikpOworCQkvKnBBZC0+U3lzdGVtRXJyb3JCaXRtYXAgfD0gMHgwMDAwMDAwMTsKKworCQkvLyBoYXJkLWNvZGUgZGVmYXVsdCB2YWx1ZSB3aGVuIG5vIHByb3BlciBFMlBST00gaW5zdGFsbGVkCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKwkJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl8xMUpDSEFOTkVMUzsgaSsrKQorCQkJcEFkLT5UeFBvd2VyMTFKW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPSAweGZmZmY7CisJCXJldHVybjsgICovCisJfQorCisJLy8gUmVhZCBCQlAgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdG8gYXJyYXkoRUVQUk9NRGVmYXVsdFZhbHVlKSBpbiBwQWQKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLy8gQ291bnRyeSBSZWdpb24KKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA9IHZhbHVlOworCisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQkJQX0JBU0VfT0ZGU0VUICsgaSoyLCB2YWx1ZSk7CisJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2krM10gPSB2YWx1ZTsKKwl9CisKKwkvLyBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4KKwkvLyBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlCisJLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4KKwkvLyBSZWFkIFR4IEFHQyBjb250cm9sIGJpdAorCUFudGVubmEud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdOworCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKQorCXsKKwkJQW50ZW5uYS53b3JkID0gMDsKKwkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKwkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOworCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKKwl9CisKKwkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgorCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQorCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IEFudGVubmEuZmllbGQuUnhQYXRoOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKQorCQl7CisJCQkvLyBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQl9CisJfQorCisJLy8gMyozCisJLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgorCS8vIHlldCBpbXBsZW1lbnQKKwlmb3IoaT0wOyBpPDM7IGkrKykKKwl7CisJfQorCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU5pY0NvbmZpZzIud29yZCA9IDA7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQorCQl7CisJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOworCQl9CisKKwkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOworCWVsc2UKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKKworCS8vCisJLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKKwkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKKwkvLworCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkpCisJeworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5CisJLy8gMC4gMTFiL2cKKwl7CisJCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKKwkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCSAgIFRzc2lQbHVzQm91bmRhcnlHIFs0XSBbM10gWzJdIFsxXSBbMF0gKHNtYWxsZXIpICsKKwkJICAgVHNzaU1pbnVzQm91bmRhcnlHWzBdIFsxXSBbMl0gWzNdIFs0XSAobGFyZ2VyKSAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NkUsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzAsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzYsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwRyA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUcgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXSA9IHBBZC0+VHNzaVJlZkc7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gID0gcEFkLT5Uc3NpUmVmRzsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKKwkJCXBBZC0+VHNzaVJlZkcsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7CisJfQorCS8vIDEuIDExYQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ0LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ4LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmQSAgID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQywgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOworCisJCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQlpZiAocEFkLT5Uc3NpUmVmQSA9PSAweGZmKQorCQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLAorCQkJcEFkLT5Uc3NpUmVmQSwKKwkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCisJCQlwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKKwl9CisJcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKKworCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgorCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7CisJaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKKwllbHNlCisJCXBBZC0+UmZGcmVxT2Zmc2V0ID0gMDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFJGIEZyZXFPZmZzZXQ9MHglbHggXG4iLCBwQWQtPlJmRnJlcU9mZnNldCkpOworCisJLy9Db3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpCisJdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkJLy8gMi40RyBiYW5kCisJdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8vIDVHIGJhbmQKKworCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOworCQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vCisJLy8gR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLgorCS8vIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKQorCS8vCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOworCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MSA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQxID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjIgPSAodmFsdWUgPj4gOCk7CisKKwlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCisJCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7CisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKKworCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7CisKKwkvLworCS8vIEdldCBMRUQgU2V0dGluZy4KKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOworCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlJjB4ZmYwMCkgPj4gODsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMSA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQyID0gdmFsdWU7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEM19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDMgPSB2YWx1ZTsKKworCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy9wQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSLCBwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3cik7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVJTlQzMgkJCQkJZGF0YSA9IDA7CisJVUNIQVIJQkJQUjEgPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVVTSE9SVAkJCQkJaTsKKwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCVVDSEFSCUJCUFIzID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKKwlmb3IoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCXsKKwkJVUNIQVIgQmJwUmVnSWR4LCBCYnBWYWx1ZTsKKworCQlpZiAoKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDB4RkZGRikgJiYgKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDApKQorCQl7CisJCQlCYnBSZWdJZHggPSAoVUNIQVIpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID4+IDgpOworCQkJQmJwVmFsdWUgID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAmIDB4ZmYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJicFJlZ0lkeCwgQmJwVmFsdWUpOworCQl9CisJfQorCisJQW50ZW5uYS53b3JkID0gcEFkLT5BbnRlbm5hLndvcmQ7CisJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOworCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7CisKKwlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKKworCisJLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCXBBZC0+TmljQ29uZmlnMi53b3JkID0gTmljQ29uZmlnMi53b3JkOworCisJLy8KKwkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KKwkvLworCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQorCXsKKwkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOworCQlwQWQtPkxlZDEgPSAweDU1NTU7CisJCXBBZC0+TGVkMiA9IDB4MjIyMTsKKworI2lmZGVmIFJUMjg3MAorCQlwQWQtPkxlZDMgPSAweDU2Mjc7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfQorCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAorCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQorCQl7CisJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IFRSVUU7CisKKwkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IEZBTFNFOworLy8JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOworCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsKKworCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCisJeworLy8JCXBBZC0+YlRlc3QxID0gVFJVRTsKKwl9CisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisJLy8KKwkvLyBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlCisJLy8gdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhIQorCS8vCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQkJQUjEpOworCQlpZihwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJQkJQUjEgJj0gKH4weDE4KTsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCQlBSMSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBhdGggPSAlZCwgUnhQYXRoID0gJWQsIFJGSUM9JWQsIFBvbGFyK0xFRCBtb2RlPSV4XG4iLCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgTklDIGhhcmR3YXJlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisvLwlJTlRfTUFTS19DU1JfU1RSVUMJCUludE1hc2s7CisJVUxPTkcJaSA9MCwgaj0wOworCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7CisKKwkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorcmV0cnk6CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpPDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJLy8gUmVjb3JkIEhXIEJlYWNvbiBvZmZzZXQKKwlwQWQtPkJlYWNvbk9mZnNldFswXSA9IEhXX0JFQUNPTl9CQVNFMDsKKwlwQWQtPkJlYWNvbk9mZnNldFsxXSA9IEhXX0JFQUNPTl9CQVNFMTsKKwlwQWQtPkJlYWNvbk9mZnNldFsyXSA9IEhXX0JFQUNPTl9CQVNFMjsKKwlwQWQtPkJlYWNvbk9mZnNldFszXSA9IEhXX0JFQUNPTl9CQVNFMzsKKwlwQWQtPkJlYWNvbk9mZnNldFs0XSA9IEhXX0JFQUNPTl9CQVNFNDsKKwlwQWQtPkJlYWNvbk9mZnNldFs1XSA9IEhXX0JFQUNPTl9CQVNFNTsKKwlwQWQtPkJlYWNvbk9mZnNldFs2XSA9IEhXX0JFQUNPTl9CQVNFNjsKKwlwQWQtPkJlYWNvbk9mZnNldFs3XSA9IEhXX0JFQUNPTl9CQVNFNzsKKworCS8vCisJLy8gd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQworCS8vCisKKwkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCisJLy8gcGJmIGhhcmR3YXJlIHJlc2V0CisKKwkvLyBJbml0aWFsemUgQVNJQyBmb3IgVFggJiBSeCBvcGVyYXRpb24KKwlpZiAoTklDSW5pdGlhbGl6ZUFzaWMocEFkICwgYkhhcmRSZXNldCkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCWlmIChqKysgPT0gMCkKKwkJeworCQkJTklDTG9hZEZpcm13YXJlKHBBZCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCisKKworCS8vIFdNTSBwYXJhbWV0ZXIKKwljc3IwLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwl7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA5NjsJLy8gQUNfVk86IDk2KjMydXMgIH49IDNtcworCX0KKwllbHNlCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCX0KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOworCisKKworCisJLy8gcmVzZXQgYWN0aW9uCisJLy8gTG9hZCBmaXJtd2FyZQorCS8vICBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQXNpYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCkKK3sKKwlVTE9ORwkJCUluZGV4ID0gMDsKKwlVQ0hBUgkJCVIwID0gMHhmZjsKKwlVSU5UMzIJCQlNYWNDc3IxMiA9IDAsIENvdW50ZXIgPSAwOworI2lmZGVmIFJUMjg3MAorCVVJTlQzMgkJCU1hY0NzcjAgPSAwOworCU5UU1RBVFVTCQlTdGF0dXM7CisJVUNIQVIJCQlWYWx1ZSA9IDB4ZmY7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJVVNIT1JUCQkJS2V5SWR4OworCUlOVAkJCQlpLGFwaWR4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBc2ljXG4iKSk7CisKKworI2lmZGVmIFJUMjg3MAorCS8vCisJLy8gTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5IGFmdGVyIE5JQ0xvYWRGaXJtd2FyZSgpLgorCS8vCisJSW5kZXggPSAwOworCisJLy9UbyBhdm9pZCBoYW5nLW9uIGlzc3VlIHdoZW4gaW50ZXJmYWNlIHVwIGluIGtlcm5lbCAyLjQsCisJLy93ZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSAiTWFjQ3NyMCIgaW5zdGVhZCBvZiB1c2luZyAicEFkLT5NQUNWZXJzaW9uIiBkaXJlY3RseS4KKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCisJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTApOworCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOworCisJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCS8vIHR1cm4gb24gYml0MTMgKHNldCB0byB6ZXJvKSBhZnRlciBydDI4NjBELiBUaGlzIGlzIHRvIHNvbHZlIGhpZ2gtY3VycmVudCBpc3N1ZS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY0NzcjEyKTsKKwlNYWNDc3IxMiAmPSAofjB4MjAwMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBNYWNDc3IxMik7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIDB4MCk7CisJU3RhdHVzID0gUlRVU0JWZW5kZXJSZXNldChwQWQpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCisJLy8gSW5pdGlhbGl6ZSBNQUMgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvcihJbmRleD0wOyBJbmRleDxOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChVU0hPUlQpTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCWlmKElTX1JUMzA3MChwQWQpKQorCXsKKwkJLy8gQWNjb3JkaW5nIHRvIEZyYW5rIEhzdSAoZnJvbSBHYXJ5IFRzYW8pCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChVU0hPUlQpVFhfU1dfQ0ZHMCwgMHgwMDAwMDQwMCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBSVDMwNzAgc2VyaWFsIE1BQyByZWdpc3RlcnMgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gUlQyODcwIHNlcmlhbAorCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBUWF9TV19DRkcxLCAwKTsKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfU1dfQ0ZHMiwgMCk7CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKVNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gQmVmb3JlIHByb2dyYW0gQkJQLCB3ZSBuZWVkIHRvIHdhaXQgQkJQL1JGIGdldCB3YWtlIHVwLgorCS8vCisJSW5kZXggPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TVEFUVVNfQ0ZHLCAmTWFjQ3NyMTIpOworCisJCWlmICgoTWFjQ3NyMTIgJiAweDAzKSA9PSAwKQkvLyBpZiBCQi5SRiBpcyBzdGFibGUKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIE1BQ19TVEFUVVNfQ0ZHICA9IEJ1c3kgPSAleFxuIiwgTWFjQ3NyMTIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKKworICAgIC8vIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZQorCS8vIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLy8gaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCS8vIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YQorCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IwLCAmUjApOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQlAgdmVyc2lvbiA9ICV4XG4iLCBSMCkpOworCX0gd2hpbGUgKCgrK0luZGV4IDwgMjApICYmICgoUjAgPT0gMHhmZikgfHwgKFIwID09IDB4MDApKSk7CisJLy9BU1NFUlQoSW5kZXggPCAyMCk7IC8vdGhpcyB3aWxsIGNhdXNlIEJTT0Qgb24gQ2hlY2stYnVpbGQgZHJpdmVyCisKKwlpZiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwkvLyBJbml0aWFsaXplIEJCUCByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IEluZGV4KyspCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBCQlBfUjg0IHdpdGggMHgxOS4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgorCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NCwgMHgxOSk7CisKKyNpZmRlZiBSVDI4NzAKKwkvL3dyaXRlIFJUMzA3MCBCQlAgd2NoaWNoIGRpZmZlcmVudCB3aXRoIDI4NzAgYWZ0ZXIgd3JpdGUgUlQyODcwIEJCUAorCWlmIChJU19SVDMwNzAocEFkKSkKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBhKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4OTkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsIDB4MDUpOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwl7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTIpOworICAgIH0KKworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04gJiYgcEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzMwNzBfVkVSU0lPTikgLy8gMyozCisJeworCQkvLyBlbmxhcmdlIE1BWF9MRU5fQ0ZHCisJCVVJTlQzMiBjc3I7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZjc3IpOworCQljc3IgJj0gMHhGRkY7CisJCWNzciB8PSAweDIwMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCBjc3IpOworCX0KKworI2lmZGVmIFJUMjg3MAoreworCVVDSEFSCU1BQ19WYWx1ZVtdPXsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDAsMH07CisKKwkvL0luaXRpYWxpemUgV0NJRCB0YWJsZQorCVZhbHVlID0gMHhmZjsKKwlmb3IoSW5kZXggPTAgO0luZGV4IDwgMjU0O0luZGV4KyspCisJeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKShNQUNfV0NJRF9CQVNFICsgSW5kZXggKiA4KSwgTUFDX1ZhbHVlLCA4KTsKKwl9Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLyBBZGQgcmFkaW8gb2ZmIGNvbnRyb2wKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworLy8JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IFJhZGlvIE9mZlxuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisKKwkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKKwkvLyBDbGVhciBhbGwgc2VhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KKwlpZiAoYkhhcmRSZXNldCkKKwl7CisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOworCQl9CisKKwkJLy8gQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKKwkJfQorCX0KKworCS8vIGFzc2VydCBIT1NUIHJlYWR5IGJpdAorLy8gIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDApOyAvLyAyMDA0LTA5LTE0IGFza2VkIGJ5IE1hcmsKKy8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHg0KTsKKworCS8vIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjbGVhciB0aGlzIHNwYWNlIHdoZW4gbm90IGhhcmQgcmVzZXQuCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKKwl7CisJCS8vIGNsZWFyIGFsbCBvbi1jaGlwIEJFQUNPTiBmcmFtZSBzcGFjZQorCQlmb3IgKGFwaWR4ID0gMDsgYXBpZHggPCBIV19CRUFDT05fTUFYX0NPVU5UOyBhcGlkeCsrKQorCQl7CisJCQlmb3IgKGkgPSAwOyBpIDwgSFdfQkVBQ09OX09GRlNFVD4+MjsgaSs9NCkKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFthcGlkeF0gKyBpLCAweDAwKTsKKwkJfQorCX0KKyNpZmRlZiBSVDI4NzAKKwlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwkvLyBDbGVhciByYXcgY291bnRlcnMKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZDb3VudGVyKTsKKwkvLyBEZWZhdWx0IFBDSSBjbG9jayBjeWNsZSBwZXIgbXMgaXMgZGlmZmVyZW50IGFzIGRlZmF1bHQgc2V0dGluZywgd2hpY2ggaXMgYmFzZWQgb24gUENJLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0NZQ19DRkcsICZDb3VudGVyKTsKKwlDb3VudGVyJj0weGZmZmZmZjAwOworCUNvdW50ZXJ8PTB4MDAwMDAxZTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBVU0JfQ1lDX0NGRywgQ291bnRlcik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IFRYT1BfQ1RSTF9DRkcgd2l0aCAweDU4M2YuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDU4M2YpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIEFzaWNzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgdG8gaW5pdGlhbCBzdGF0ZSBBUyBJUyBzeXN0ZW0gYm9vdCB1cCB0aW1lLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNJc3N1ZVJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMglWYWx1ZSA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0lzc3VlUmVzZXRcbiIpKTsKKworCS8vIEFib3J0IFR4LCBwcmV2ZW50IEFTSUMgZnJvbSB3cml0aW5nIHRvIEhvc3QgbWVtb3J5CisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DTlRMX0NTUiwgMHgwMDFmMDAwMCk7CisKKwkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCVZhbHVlICY9ICgweGZmZmZmZmYzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCS8vIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsgLy8gMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBBU0lDIHJlZ2lzdGVycyBhbmQgZmluZCBhbnkgcmVhc29uIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOworCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKKwlVQ0hBUgkJCQlpID0gMDsKKwlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOworCUNIQVIJCQkJcmVUcnk7CisJVUNIQVIJCQkJc3VjY01DUzsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCWRvCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0ZJRk8sICZTdGFGaWZvLndvcmQpOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5iVmFsaWQgPT0gMCkKKwkJCQlicmVhazsKKworCQkJd2NpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLndjaWQ7CisKKworCQkvKiBpZ25vcmUgTm9BQ0sgYW5kIE1HTVQgZnJhbWUgdXNlIDB4RkYgYXMgV0NJRCAqLworCQkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkgfHwgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorCQkJeworCQkJCWkrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCisJCQlwaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC5QaWRUeXBlOworCisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeEJGKSAvLyAzKjMKKwkJCQlwRW50cnktPlR4QkZDb3VudCsrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQkJVUFQU0RfU1BfQVVFX0hhbmRsZShwQWQsIHBFbnRyeSwgU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKworCQkJaWYgKCFTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKKwkJCXsKKwkJCQlwRW50cnktPkZJRk9Db3VudCsrOworCQkJCXBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQrKzsKKworCQkJCWlmIChwRW50cnktPkZJRk9Db3VudCA+PSAxKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIyIpKTsKKyNpZiAwCisJCQkJCVNlbmRSZWZyZXNoQkFSKHBBZCwgcEVudHJ5KTsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2Vsc2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCWlmKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpCisJCQkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCWludCB0aWQ7CisJCQkJCQlmb3IgKHRpZD0wOyB0aWQ8TlVNX09GX1RJRDsgdGlkKyspCisJCQkJCQl7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgIHRpZCwgRkFMU0UsIEZBTFNFKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQkJLy8gVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlCisJCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250Kys7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZQorCQkJCQkJLy8gICAgIHRoaXMgdHggZXJyb3IgaGFwcGVuZWQgZHVlIHRvIHN0YSBqdXN0IGdvIHRvIHNsZWVwLgorCQkJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQkJCX0KKyNlbmRpZgorCQkJCQkvL3BFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQl9CisJCQkJLy9wRW50cnktPmJTZW5kQkFSID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoKHBFbnRyeS0+UHNNb2RlICE9IFBXUl9TQVZFKSAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOworCQkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bj09MCkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOworCQkJCQl9CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQlwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQrKzsKKwkJCQkvLyB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4KKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQl9CisKKwkJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKKworCQkJcmVUcnkgPSBwaWQgLSBzdWNjTUNTOworCisJCQlpZiAoU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0V4cGVjdGVkW3BpZF0rKzsKKwkJCQlpZiAocGlkID09IHN1Y2NNQ1MpCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTU3VjY2Vzc2Z1bFtwaWRdKys7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+VFhNQ1NBdXRvRmFsbEJhY2tbcGlkXVtzdWNjTUNTXSsrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnktPlRYTUNTRmFpbGVkW3BpZF0rKzsKKwkJCX0KKworCQkJaWYgKHJlVHJ5ID4gMCkKKwkJCXsKKwkJCQlpZiAoKHBpZCA+PSAxMikgJiYgc3VjY01DUyA8PTcpCisJCQkJeworCQkJCQlyZVRyeSAtPSA0OworCQkJCX0KKwkJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OworCQkJfQorCisJCQlpKys7CisJCQkvLyBBU0lDIHN0b3JlIDE2IHN0YWNrCisJCX0gd2hpbGUgKCBpIDwgKDIqVFhfUklOR19TSVpFKSApOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHN0YXRpc3RpY2FsIGNvdW50ZXJzIGZyb20gaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCByZWNvcmQgdGhlbQorCQlpbiBzb2Z0d2FyZSB2YXJpYWJsZXMgZm9yIGxhdGVyIG9uIHF1ZXJ5CisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyCU9sZFZhbHVlOworCVJYX1NUQV9DTlQwX1NUUlVDCSBSeFN0YUNudDA7CisJUlhfU1RBX0NOVDFfU1RSVUMgICBSeFN0YUNudDE7CisJUlhfU1RBX0NOVDJfU1RSVUMgICBSeFN0YUNudDI7CisJVFhfU1RBX0NOVDBfU1RSVUMgCSBUeFN0YUNudDA7CisJVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKKwlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOworCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7CisJVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOworCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKKwlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7CisJVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOworCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKKwlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7CisJVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OworCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOworCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOworCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCisJICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7CisJCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgorCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKKwl9CisKKwkvLyBVcGRhdGUgRkNTIGNvdW50ZXJzCisJT2xkVmFsdWU9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsgLy8gPj4gNyk7CisJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCU9sZFZhbHVlID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7CisJLy8gVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIKKwlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7CisKKwkvL3BBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCA9IDA7CisjaWZkZWYgUlQyODcwCisJaWYgKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCAhPSBwQWQtPndhdGNoRG9nUnhDbnQpCisJeworCQlwQWQtPndhdGNoRG9nUnhDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQ7CisJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJaWYgKFJ4U3RhQ250Mi5maWVsZC5SeEZpZm9PdmVyZmxvd0NvdW50KQorCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQrKzsKKwkJZWxzZQorCQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisJLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgfHwKKwkvLwkoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSAmJiAocEFkLT5NYWNUYWIuU2l6ZSAhPSAxKSkpCisJaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQorCXsKKwkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJfQorCisjaWYgMAorCVJldHJ5ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlGYWlsID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCVR4RXJyb3JSYXRpbyA9IDA7CisJT25lU2VjVHJhbnNtaXRDb3VudCA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQtIHBBZC0+V2xhbkNvdW50ZXJzLkxhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0OworCWlmICgoT25lU2VjVHJhbnNtaXRDb3VudCtSZXRyeSArIEZhaWwpID4gMCkKKwkJVHhFcnJvclJhdGlvID0gKCggUmV0cnkgKyBGYWlsKSAqMTAwKSAvIChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCk7CisKKwlpZiAoKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKSA+IDApCisJCVR4RXJyb3JSYXRpbyA9ICgoIFJldHJ5ICsgRmFpbCkgKjEwMCkgLyAoT25lU2VjVHJhbnNtaXRDb3VudCtSZXRyeSArIEZhaWwpOworCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiVFggRVJST1IgUmF0ZSA9ICVsZCAlJSwgUmV0cnkgPSAlbGQsIEZhaWwgPSAlbGQsIFRvdGFsID0gJWxkICBcbiIsVHhFcnJvclJhdGlvLCBSZXRyeSwgRmFpbCwgKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKSkpOworCXBBZC0+V2xhbkNvdW50ZXJzLkxhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydDsKKyNlbmRpZgorCisJLy9pZiAocEFkLT5iU3RhRmlmb1Rlc3QgPT0gVFJVRSkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQwLCAmVHhBZ2dDbnQwLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQxLCAmVHhBZ2dDbnQxLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQyLCAmVHhBZ2dDbnQyLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQzLCAmVHhBZ2dDbnQzLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ0LCAmVHhBZ2dDbnQ0LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ1LCAmVHhBZ2dDbnQ1LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ2LCAmVHhBZ2dDbnQ2LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ3LCAmVHhBZ2dDbnQ3LndvcmQpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuQWdnVHhDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeE5vbkFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMk1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnM01QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzRNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c1TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNk1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnN01QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzhNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c5TVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTBNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMU1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMk1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxM01QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNE1QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE1TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE2TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0dGVkIEEtTVBEVSBjb3VudAorCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50IC8gOSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50IC8gMTEpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQgLyAxNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQgLyAxNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50IC8gMTYpOworCX0KKworI2lmZGVmIERCR19ESUFHTk9TRQorCXsKKwkJUnRtcERpYWdTdHJ1Y3QJKnBEaWFnOworCQlDT1VOVEVSX1JBTElOSwkqcFJhbGlua0NvdW50ZXJzOworCQlVQ0hBUgkJCUFycmF5Q3VySWR4LCBpOworCisJCXBEaWFnID0gJnBBZC0+RGlhZ1N0cnVjdDsKKwkJcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7CisJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCisJCWlmIChwRGlhZy0+aW5pdGVkID09IDApCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEaWFnLCBzaXplb2Yoc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8pKTsKKwkJCXBEaWFnLT5BcnJheVN0YXJ0SWR4ID0gcERpYWctPkFycmF5Q3VySWR4ID0gMDsKKwkJCXBEaWFnLT5pbml0ZWQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVHgKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcERpYWctPlR4QWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhOb25BZ2dDbnRbQXJyYXlDdXJJZHhdID0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVswXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzFdID0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMl0gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVszXSA9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzRdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNV0gPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs2XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzddID0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOF0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs5XSA9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMF0gPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTFdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzEyXSA9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxM10gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTRdID0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE1XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSA9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheUN1cklkeCwgIERJQUdOT1NFX1RJTUUpOworCQkJQXJyYXlDdXJJZHggPSBwRGlhZy0+QXJyYXlDdXJJZHg7CisJCQlmb3IgKGkgPTA7IGkgPCA5OyBpKyspCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV09IDA7CisJCQkJcERpYWctPlR4U1dRdWVDbnRbQXJyYXlDdXJJZHhdW2ldID0wOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJfQorCQkJcERpYWctPlR4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlR4RmFpbENudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSAgPSAwOworLy8JCQlmb3IgKGkgPSA5OyBpIDwgMTY7IGkrKykKKwkJCWZvciAoaSA9IDk7IGkgPCAyNDsgaSsrKSAvLyAzKjMKKwkJCXsKKwkJCQlwRGlhZy0+VHhEZXNjQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlR4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7CisJCQkJcERpYWctPlJ4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Cit9CisKKwkJCWlmIChwRGlhZy0+QXJyYXlDdXJJZHggPT0gcERpYWctPkFycmF5U3RhcnRJZHgpCisJCQkJSU5DX1JJTkdfSU5ERVgocERpYWctPkFycmF5U3RhcnRJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJfQorCisJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIGZyb20gZXJyb3IKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yIHN0YXRlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ1Jlc2V0RnJvbUVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vIFJlc2V0IEJCUCAoYWNjb3JkaW5nIHRvIGFsZXgsIHJlc2V0IEFTSUMgd2lsbCBmb3JjZSByZXNldCBCQlAKKwkvLyBUaGVyZWZvcmUsIHNraXAgdGhlIHJlc2V0IEJCUAorCS8vIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOworCS8vIFJlbW92ZSBBU0lDIGZyb20gcmVzZXQgc3RhdGUKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CisKKwlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIEZBTFNFKTsKKwlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKKworCS8vIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCisJZm9yKGk9MDsgaTxNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSs9NCkKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIDApOworCit9LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgODA1MSBmaXJtd2FyZSBSVDI1NjEuQklOIGZpbGUgaW50byBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIEJJTl9JTl9GSUxFCisjZGVmaW5lIE5JQ0xGX0RFRkFVTFRfVVNFKCkJXAorCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gVFJVRTsgXAorCXByaW50aygiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlzcmM7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVCAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZCwgaTsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUlOVAkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMgkJCU1hY1JlZzsKKwlVTE9ORwkJCUluZGV4OworCVVMT05HCQkJZmlybTsKKwlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwkvKiBpbml0ICovCisJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXNyYyA9IFJUTVBfRklSTVdBUkVfRklMRV9OQU1FOworCisJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkgKi8KKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCisJCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KKyAgICBwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKKwl7CisJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJTklDTEZfREVGQVVMVF9VU0UoKTsKKyAgICB9CisJZWxzZQorCXsKKwkJLyogYWxsb2NhdGUgb2shIHplcm8gdGhlIGZpcm13YXJlIGJ1ZmZlciAqLworCQltZW1zZXQocEZpcm13YXJlSW1hZ2UsIDB4MDAsIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiBpZiBvaywgcmVhZCBmaXJtd2FyZSBmaWxlIGZyb20gKi5iaW4gZmlsZSAqLworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCXByaW50aygiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCXByaW50aygiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICBwRmlybXdhcmVJbWFnZSwKKwkJCQkJCQkJCQkgIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCisJCQl7CisJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUFVDSEFSIHB0ciA9IHBGaXJtd2FyZUltYWdlOworCQkJCVVTSE9SVCBjcmMgPSAweGZmZmY7CisKKworCQkJCS8qIGNhbGN1bGF0ZSBmaXJtd2FyZSBDUkMgKi8KKwkJCQlmb3IoaT0wOyBpPChNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yKTsgaSsrLCBwdHIrKykKKwkJCQkJY3JjID0gQnl0ZUNSQzE2KEJpdFJldmVyc2UoKnB0ciksIGNyYyk7CisJCQkJLyogRW5kIG9mIGZvciAqLworCisJCQkJaWYgKChwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSAhPSBcCisJCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUikoY3JjPj44KSkpIHx8CisJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSAhPSBcCisJCQkJCQkJCShVQ0hBUilCaXRSZXZlcnNlKChVQ0hBUiljcmMpKSkKKwkJCQl7CisJCQkJCS8qIENSQyBmYWlsICovCisJCQkJCXByaW50aygiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgorCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKKwkJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAorCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCisJCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSk7CisJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBmaXJtd2FyZSBpcyBvayAqLworCQkJCQlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IFwKKwkJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSA8PCA4KSArCisJCQkJCQlwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXTsKKworCQkJCQkvKiBjaGVjayBpZiBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIHRvbyBvbGQgKi8KKwkJCQkJaWYgKChwQWQtPkZpcm13YXJlVmVyc2lvbikgPCBcCisJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCisJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKKwkJCQkJeworCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKKwkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLworCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJOworCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfSAvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiB3cml0ZSBmaXJtd2FyZSB0byBBU0lDICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IFRSVUUpCisJeworCQkvKiB1c2UgZGVmYXVsdCBmaW1ld2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKworCQkvKiB1c2UgZGVmYXVsdCAqLmJpbiBhcnJheSAqLworCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CisKKwkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCS8qIHVzZSBmaWxlIGZpcm13YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbHNlCisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKKwlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OworCS8vVUxPTkcJCQlmaXJtOworCVVJTlQzMgkJCU1hY1JlZyA9IDA7CisjaWZkZWYgUlQyODcwCisJVUlOVDMyCQkJVmVyc2lvbiA9IChwQWQtPk1BQ1ZlcnNpb24gPj4gMTYpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOworCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisjaWZkZWYgUlQyODcwCisJLy8gTmV3IDhrIGJ5dGUgZmlybXdhcmUgc2l6ZSBmb3IgUlQzMDcxL1JUMzA3MgorCS8vcHJpbnRrKCJVc2IgQ2hpcFxuIik7CisJaWYgKEZJUk1XQVJFSU1BR0VfTEVOR1RIID09IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSCkKKwkvL1RoZSBmaXJtd2FyZSBpbWFnZSBjb25zaXN0cyBvZiB0d28gcGFydHMuIE9uZSBpcyB0aGUgb3JpZ2lhbmwgYW5kIHRoZSBvdGhlciBpcyB0aGUgbmV3LgorCS8vVXNlIFNlY29uZCBQYXJ0CisJeworCQlpZiAoKFZlcnNpb24gIT0gMHgyODYwKSAmJiAoVmVyc2lvbiAhPSAweDI4NzIpICYmIChWZXJzaW9uICE9IDB4MzA3MCkpCisJCXsJLy8gVXNlIEZpcm13YXJlIFYyLgorCQkJLy9wcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MlxuIik7CisJCQlwRmlybXdhcmVJbWFnZSA9IChQVUNIQVIpJkZpcm13YXJlSW1hZ2VbRklSTVdBUkVJTUFHRVYxX0xFTkdUSF07CisJCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRVYyX0xFTkdUSDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vcHJpbnRrKCJLSDpVc2UgTmV3IFZlcnNpb24scGFydDFcbiIpOworCQkJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOworCQkJRmlsZUxlbmd0aCA9IEZJUk1XQVJFSU1BR0VWMV9MRU5HVEg7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS0g6IGJpbiBmaWxlIHNob3VsZCBiZSA4S0IuXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZiAwCisJLyogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uICovCisJUlQyOFhYX0ZJUk1VRF9JTklUKHBBZCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVDI4WFhfRklSTVVEX0VORChwQWQpOworI2Vsc2UKKwlSVDI4WFhfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisjZW5kaWYKKworI2VuZGlmCisKKwkvKiBjaGVjayBpZiBNQ1UgaXMgcmVhZHkgKi8KKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmTWFjUmVnKTsKKworCQlpZiAoTWFjUmVnICYgMHg4MCkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMDApOworCisgICAgaWYgKEluZGV4ID49IDEwMDApCisJeworCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmU6IE1DVSBpcyBub3QgcmVhZHlcblxuXG4iKSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworI2lmIDAKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjw9PT0gJXMgKHNyYz0lcywgc3RhdHVzPSVkKVxuIiwgX19GVU5DVElPTl9fLCBzcmMsIFN0YXR1cykpOworI2Vsc2UKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fRlVOQ1RJT05fXywgU3RhdHVzKSk7CisjZW5kaWYKKyAgICByZXR1cm4gU3RhdHVzOworfSAvKiBFbmQgb2YgTklDTG9hZEZpcm13YXJlICovCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgVHggcmF0ZSBzd2l0Y2hpbmcgcGFyYW1ldGVycworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmF0ZSBUYWJsZSBGb3JtYXQ6CisJCTEuIChCMDogVmFsaWQgSXRlbSBudW1iZXIpIChCMTpJbml0aWFsIGl0ZW0gZnJvbSB6ZXJvKQorCQkyLiBJdGVtIE51bWJlcihEZWMpICAgICAgTW9kZShIZXgpICAgICBDdXJyZW50IE1DUyhEZWMpICAgIFRyYWluVXAoRGVjKSAgICBUcmFpbkRvd24oRGVjKQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWYgMAorCU5ESVNfU1RBVFVTIFN0YXR1czsKKworCU5ESVNfSEFORExFIEZpbGVIYW5kbGU7CisJVUlOVCBGaWxlTGVuZ3RoID0gMCwgaSwgajsKKwlQVUNIQVIgcEZpcm13YXJlSW1hZ2U7CisJTkRJU19TVFJJTkcgRmlsZU5hbWU7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIEhpZ2hlc3RBY2NlcHRhYmxlTWF4ID0gTkRJU19QSFlTSUNBTF9BRERSRVNTX0NPTlNUKC0xLCAtMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PT4gTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMgXG4iKSk7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gMDsKKworCWlmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQpIHx8IChwQWQtPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpKQorCXsKKwkJTmRpc0luaXRpYWxpemVTdHJpbmcoJkZpbGVOYW1lLCJyYXRlLmJpbiIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogbG9hZCBmaWxlIC0gcmF0ZS5iaW4gZm9yIHR4IHJhdGUgc3dpdGNoIFxuIikpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogd3JvbmcgRGV2aWNlSUQgPSAweCUwNHgsIGNhbid0IGZpbmQgVHggcmF0ZSBzd2l0Y2ggcGFyYW1ldGVycyBmaWxlXG4iLCBwQWQtPkRldmljZUlEKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwlOZGlzT3BlbkZpbGUoJlN0YXR1cywgJkZpbGVIYW5kbGUsICZGaWxlTGVuZ3RoLCAmRmlsZU5hbWUsIEhpZ2hlc3RBY2NlcHRhYmxlTWF4KTsKKwlOZGlzRnJlZVN0cmluZyhGaWxlTmFtZSk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogTmRpc09wZW5GaWxlKCkgZmFpbGVkLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCWlmICgoRmlsZUxlbmd0aCA9PSAwKSB8fCAoRmlsZUxlbmd0aCA+IChNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCsxKSoxNikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogZmlsZSBzaXplIGlzIG5vdCByZWFzb25hYmxlLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisKKwkJTmRpc0Nsb3NlRmlsZShGaWxlSGFuZGxlKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCWVsc2UKKwl7CisJCS8vCisJCS8vIE5ESVNfU1RBVFVTX1NVQ0NFU1MgbWVhbnMKKwkJLy8gVGhlIGhhbmRsZSBhdCBGaWxlSGFuZGxlIGlzIHZhbGlkIGZvciBhIHN1YnNlcXVlbnQgY2FsbCB0byBOZGlzTWFwRmlsZS4KKwkJLy8KKwkJTmRpc01hcEZpbGUoJlN0YXR1cywgJnBGaXJtd2FyZUltYWdlLCBGaWxlSGFuZGxlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTmRpc01hcEZpbGUgRmlsZUxlbmd0aD0lZFxuIiwgRmlsZUxlbmd0aCkpOworCX0KKworCWZvciAoaT0wLCBqPTA7IGk8RmlsZUxlbmd0aDsgaSsrKQorCXsKKwkJaWYgKChpJTE2KSA8PSA0KQkvLyB0cmltIHJlc2VydmVkIGZpZWxkCisJCXsKKwkJCWlmIChpJTE2ID09IDEpCS8vIGRlYWwgd2l0aCBERUMgYW5kIEhFWCwgb25seSByb3cwIGlzIEhleCwgb3RoZXJzIGFyZSBEZWMKKwkJCXsKKwkJCQlSYXRlU3dpdGNoVGFibGVbal0gPSAqKHBGaXJtd2FyZUltYWdlICsgaSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUmF0ZVN3aXRjaFRhYmxlW2pdID0gKCoocEZpcm13YXJlSW1hZ2UgKyBpKT4+NCkgKiAxMCArICgqKHBGaXJtd2FyZUltYWdlICsgaSkgJiAweDBGKTsKKwkJCX0KKworCQkJaisrOworCQl9CisJfQorCisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOwkJLy8gYmFja3VwIHRhYmxlIHNpemUKKworCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCU5kaXNVbm1hcEZpbGUoRmlsZUhhbmRsZSk7CisJCU5kaXNDbG9zZUZpbGUoRmlsZUhhbmRsZSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI8PT09IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKFZhbGlkIFR4UmF0ZVRhYmxlIGl0ZW0gbnVtYmVyPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplKSk7CisjZW5kaWYKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgorCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCisKKwlSZXR1cm4gVmFsdWU6CisJCTE6CQkJbm90IGFsbCB6ZXJvCisJCTA6CQkJYWxsIHplcm8KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJbmRleCA9PSBMZW5ndGgpCisJeworCQlyZXR1cm4gKDApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBmaXJzdCBtZW1vcnkgYWRkcmVzcworCQlwU3JjMgkJUG9pbnRlciB0byBzZWNvbmQgbWVtb3J5IGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKwkJMDoJCQltZW1vcnkgaXMgZXF1YWwKKwkJMToJCQlwU3JjMSBtZW1vcnkgaXMgbGFyZ2VyCisJCTI6CQkJcFNyYzIgbWVtb3J5IGlzIGxhcmdlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JUFZPSUQJcFNyYzIsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmMyOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMSk7CisJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMik7CisJfQorCisJLy8gRXF1YWwKKwlyZXR1cm4gKDApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJU2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFplcm9NZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IDB4MDA7CisJfQorfQorCitWT0lECVJUTVBGaWxsTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCVVDSEFSCUZpbGwpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IEZpbGw7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKKworCUFyZ3VtZW50czoKKwkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKwkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlDb3B5IHNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb3ZlTWVtb3J5KAorCU9VVAlQVk9JRAlwRGVzdCwKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVJTlQJSW5kZXg7CisKKwlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKworCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgcG9ydCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJVXNlckNmZ0luaXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisvLwlFRENBX1BBUk0gRGVmYXVsdEVkY2FQYXJtOworICAgIFVJTlQga2V5X2luZGV4LCBic3NfaW5kZXg7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXRcbiIpKTsKKworCS8vCisJLy8gIHBhcnQgSS4gaW50aWFsaXplIGNvbW1vbiBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBSVDI4NzAKKwlwQWQtPkJ1bGtPdXRSZXEgPSAwOworCisJcEFkLT5CdWxrT3V0Q29tcGxldGUgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwlwQWQtPkJ1bGtJblJlcSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworCisJLy9wQWQtPlF1aWNrVGltZXJQID0gMTAwOworCS8vcEFkLT5UdXJuQWdnckJ1bGtJbkNvdW50ID0gMDsKKwlwQWQtPmJVc2JUeEJ1bGtBZ2dyZSA9IDA7CisKKwkvLyBpbml0IGFzIHVuc2VkIHZhbHVlIHRvIGVuc3VyZSBkcml2ZXIgd2lsbCBzZXQgdG8gTUNVIG9uY2UuCisJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKworCXBBZC0+Q29tbW9uQ2ZnLk1heFBrdE9uZVR4QnVsayA9IDI7CisJcEFkLT5Db21tb25DZmcuVHhCdWxrRmFjdG9yID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPTE7CisKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCWZvcihrZXlfaW5kZXg9MDsga2V5X2luZGV4PFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKQorCXsKKwkJZm9yKGJzc19pbmRleCA9IDA7IGJzc19pbmRleCA8IE1BWF9NQlNTSURfTlVNOyBic3NfaW5kZXgrKykKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLktleUxlbiA9IDA7CisJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisKKwlwQWQtPkFudGVubmEud29yZCA9IDA7CisJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisKKwlwQWQtPkxlZENudGwud29yZCA9IDA7CisKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOworCisJLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7CisJcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7CisJcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7CisJcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKKwlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOworCXBBZC0+YkhDQ0FUZXN0ID0gRkFMU0U7CisJcEFkLT5iR2VuT25lSENDQSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAorCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OworCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7CisJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7CisJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOworCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7CisjZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOworCisJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKworCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKworCS8vCisJLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKKwkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKworCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOworCisJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOworCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOworCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisJLy8gUEhZIHNwZWNpZmljYXRpb24KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkvLyBDQ1ggdjEuMCByZWxlYXRlZCBpbml0IHZhbHVlCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCQlwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPSBDSVNDT19BdXRoTW9kZUxFQVBOb25lOworCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKwkJLy8gUGF0Y2ggZm9yIE5kdGVzdAorCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKKworCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0CisJCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCisJCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93CisKKwkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKworCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgorCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgorCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwkJc3ByaW50ZihwQWQtPm5pY2tuYW1lLCAiJXMiLCBTVEFfTklDX0RFVklDRV9OQU1FKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisKKwkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsKKworCS8vCisJLy8gcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zCisJLy8KKworCisJLy8KKwkvLyBwYXJ0IElWLiBvdGhlcnMKKwkvLworCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKKwlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYUxvd2VyVGhyZXNob2xkID0gMTAwOworCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQgPSA1MTI7CisJcEFkLT5CYnBUdW5pbmcuUjY2RGVsdGEgICAgICAgICAgICAgICA9IDQ7CisJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKKworCS8vCisJLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgorCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KKwkvLworCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CisKKwlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKKworCS8vIERlZmF1bHQgaXMgRkFMU0UgZm9yIHRlc3QgYml0IDEKKwkvL3BBZC0+YlRlc3QxID0gRkFMU0U7CisKKwkvLyBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPk1hY1RhYi5NY2FzdFBzUXVldWUpOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+UkVDQkFUaW1lciwgUkVDQkFUaW1lclRpbWVvdXQsIHBBZCwgVFJVRSk7CisJLy9SVE1QU2V0VGltZXIoJnBBZC0+UkVDQkFUaW1lciwgUkVPUkRFUl9FWEVDX0lOVFYpOworCisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPmF0ZSwgc2l6ZW9mKEFURV9JTkZPKSk7CisJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCXBBZC0+YXRlLlR4Q291bnQgPSAyMDA7LyogdG8gZXhjZWVkIFRYX1JJTkdfU0laRSAuLi4gKi8KKwlwQWQtPmF0ZS5UeExlbmd0aCA9IDEwMjQ7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsvLyBMT05HIEdJIDogODAwIG5zCisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gTU9ERV9DQ0s7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwlwQWQtPmF0ZS5DaGFubmVsID0gMTsKKwlwQWQtPmF0ZS5RSUQgPSBRSURfQUNfQkU7CisJcEFkLT5hdGUuQWRkcjFbMF0gPSAweDAwOworCXBBZC0+YXRlLkFkZHIxWzFdID0gMHgxMTsKKwlwQWQtPmF0ZS5BZGRyMVsyXSA9IDB4MjI7CisJcEFkLT5hdGUuQWRkcjFbM10gPSAweEFBOworCXBBZC0+YXRlLkFkZHIxWzRdID0gMHhCQjsKKwlwQWQtPmF0ZS5BZGRyMVs1XSA9IDB4Q0M7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjIsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlwQWQtPmF0ZS5iUnhGZXIgPSAwOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworCXBBZC0+YXRlLkF0ZVBpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVUNIQVIgQnRvSChjaGFyIGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cworCXJldHVybigyNTUpOworfQorCisvLworLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQorLy8KKy8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4CisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZworLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4CisvLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KKy8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKKy8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgorLy8KKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKK3ZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQoreworCWNoYXIgKiBzcmNwdHI7CisJUFVDSEFSIGRlc3RUZW1wOworCisJc3JjcHRyID0gc3JjOworCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKKworCXdoaWxlKGRlc3RsZW4tLSkKKwl7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgorCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwkJZGVzdFRlbXArKzsKKwl9Cit9CisKK1ZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCUluZGV4OworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQorCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlwVGltZXJGdW5jCQkJRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRpbWVyIGV4cGlyZWQKKwkJUmVwZWF0CQkJCVR1cmUgZm9yIHBlcmlvZCB0aW1lcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit7CisJLy8KKwkvLyBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4KKwkvLyBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyCisJLy8gdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLgorCS8vCisJcFRpbWVyLT5WYWxpZCAgICAgID0gVFJVRTsKKworCXBUaW1lci0+UGVyaW9kaWNUeXBlID0gUmVwZWF0OworCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKFVMT05HKSBwRGF0YTsKKworI2lmZGVmIFJUMjg3MAorCXBUaW1lci0+cEFkID0gcEFkOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7CisJCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBUUlVFOworCQkJUlRNUF9TZXRQZXJpb2RpY1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpCit7CisJQk9PTEVBTglDYW5jZWw7CisKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOworCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbmNlbCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbmNlbFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKKwkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CisJCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCisJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKKworI2lmZGVmIFJUMjg3MAorCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCisJCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KKworCQlSVDI4NzBfVGltZXJRX1JlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgorCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KKwkJLy8KKwkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFN0YXR1cworCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVN0YXR1cwkJCQkJTEVEIFN0YXR1cworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpCit7CisJLy9VTE9ORwkJCWRhdGE7CisJVUNIQVIJCQlIaWdoQnl0ZSA9IDA7CisJVUNIQVIJCQlMb3dCeXRlOworCisvLyBJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgorLy8gU28gTEVEIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB3aGVuIEFURSBpcyBydW5uaW5nLgorI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKKwlzd2l0Y2ggKFN0YXR1cykKKwl7CisJCWNhc2UgTEVEX0xJTktfRE9XTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKwkJCWJyZWFrOworCQljYXNlIExFRF9MSU5LX1VQOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCQlIaWdoQnl0ZSA9IDB4YTA7CisJCQllbHNlCisJCQkJSGlnaEJ5dGUgPSAweDYwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUkFESU9fT046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9IQUxUOgorCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAorCQljYXNlIExFRF9SQURJT19PRkY6CisJCQlIaWdoQnl0ZSA9IDA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIExFRF9XUFM6CisJCQlIaWdoQnl0ZSA9IDB4MTA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJCUhpZ2hCeXRlID0gMHgwODsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1BPV0VSX1VQOgorCQkJSGlnaEJ5dGUgPSAweDA0OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisJfQorCisgICAgLy8KKwkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCisJLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkvLworCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQorCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU2lnbmFsIFN0cmVndGgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlEYm0JCQkJCQlTaWduYWwgU3RyZWd0aAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJQ2FuIGJlIHJ1biBvbiBhbnkgSVJRTCBsZXZlbC4KKworCQlBY2NvcmRpbmcgdG8gTWljcm9zb2Z0IFplcm8gQ29uZmlnIFdpcmVsZXNzIFNpZ25hbCBTdHJlZ3RoIGRlZmluaXRpb24gYXMgYmVsb3dzLgorCQk8PSAtOTAgIE5vIFNpZ25hbAorCQk8PSAtODEgIFZlcnkgTG93CisJCTw9IC03MSAgTG93CisJCTw9IC02NyAgR29vZAorCQk8PSAtNTcgIFZlcnkgR29vZAorCQkgPiAtNTcgIEV4Y2VsbGVudAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCit7CisJVUNIQVIJCW5MZWQgPSAwOworCisJLy8KKwkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KKwkvLworCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRGJtIDw9IC05MCkKKwkJbkxlZCA9IDA7CisJZWxzZSBpZiAoRGJtIDw9IC04MSkKKwkJbkxlZCA9IDE7CisJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJbkxlZCA9IDM7CisJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJbkxlZCA9IDc7CisJZWxzZSBpZiAoRGJtIDw9IC01NykKKwkJbkxlZCA9IDE1OworCWVsc2UKKwkJbkxlZCA9IDMxOworCisJLy8KKwkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KKwkvLworCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKKwl7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKwkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmFibGUgUlgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JVUxPTkcJaSA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKKworI2lmIDAKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJUlQyOFhYX0RNQV9XUklURV9JTklUKEdsb0NmZyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCVJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpOworI2Vsc2UKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUMjhYWERNQUVuYWJsZShwQWQpOworI2VuZGlmCisKKwkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0NzQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jCkBAIC0wLDAgKzEsMTYxMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCitVSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KK3sKKwkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisJMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAorCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKKwkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisJMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAorCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKKwkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisJMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAorCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKKwkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisJMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAorCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKKwkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisJMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAorCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKKwkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisJMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAorCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKKwkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisJMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAorCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKKwkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisJMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAorCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKKwkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisJMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAorCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKKwkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisJMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAorCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKKwkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisJMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCit9OworCitVSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KK3sKKwkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCisJMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAorCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKwkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCisJMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAorCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKwkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCisJMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAorCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKwkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCisJMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAorCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKwkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCisJMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAorCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKwkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCisJMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAorCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKwkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCisJMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAorCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKwkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCisJMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAorCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKwkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCisJMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAorCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKwkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCisJMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAorCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKwkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCisJMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VDSEFSIFNib3hUYWJsZVsyNTZdID0KK3sKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworLy8KKy8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgorLy8KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KK3sKKwl1bmlvbiBQQUNLRUQKKwl7CisJCXN0cnVjdCBQQUNLRUQKKwkJeworCQkJVUNIQVIJCXJjMDsKKwkJCVVDSEFSCQlyYzE7CisJCQlVQ0hBUgkJcmMyOworCisJCQl1bmlvbiBQQUNLRUQKKwkJCXsKKwkJCQlzdHJ1Y3QgUEFDS0VECisJCQkJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJUnN2ZDo1OworI2Vsc2UKKwkJCQkJVUNIQVIJUnN2ZDo1OworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglLZXlJRDoyOworI2VuZGlmCisJCQkJfQlmaWVsZDsKKwkJCQlVQ0hBUgkJQnl0ZTsKKwkJCX0JQ09OVFJPTDsKKwkJfQlmaWVsZDsKKworCQlVTE9ORwl3b3JkOworCX0JSVYxNjsKKworCVVMT05HCUlWMzI7Cit9CVRLSVBfSVYsICpQVEtJUF9JVjsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCisJSU4JUFVDSEFSCXBNSUNLZXkpCit7CisJVUxPTkcJcmVzID0gMDsKKwlJTlQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQorICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBQdXRVSW50MzIoCisJSU4gT1VUCVBVQ0hBUgkJcERzdCwKKwlJTgkJVUxPTkcJCXZhbCkKK3sKKwlJTlQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKKwkJdmFsID4+PSA4OworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVNldCB0aGUgTUlDIEtleS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwkvLyBTZXQgdGhlIGtleQorCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOworCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKKwkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKKwlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKKwlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKKwlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwlwVGtpcC0+TSA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglVQ0hBUiAJCQl1Q2hhcikKK3sKKwkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7CisJcFRraXAtPm5CeXRlc0luTSsrOworCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KKwlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKKwl7CisJCXBUa2lwLT5MIF49IHBUa2lwLT5NOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgorCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZCgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQluQnl0ZXMpCit7CisJLy8gVGhpcyBpcyBzaW1wbGUKKwl3aGlsZShuQnl0ZXMgPiAwKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEdldE1JQygKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKK3sKKwkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJfQorCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JUFVDSEFSCQkJcFRBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JUFVDSEFSCQkJcFRTQywKKwlPVVQJUFVMT05HCQkJcElWMTYsCisJT1VUCVBVTE9ORwkJCXBJVjMyKQoreworCVRLSVBfSVYJdGtpcEl2OworCisJLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQorCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisvLwl0a2lwSXYuSVYzMiA9ICooUFVMT05HKShwVFNDICsgMik7CisJTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0TUlDRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcExMQwkJTExDIGhlYWRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTExDLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gMDsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRW5jYXAsCisJSU4JUENJUEhFUl9LRVkJCXBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQVUNIQVIJCQlwU3JjOworICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7CisJVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFNyYyA9IHBTcmNCdWZWQTsKKworCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKKwlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKKwkJdmxhbl9vZmZzZXQgPSA0OworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlSVE1QSW5pdE1JQ0VuZ2luZSgKKwkJCXBBZCwKKwkJCXBLZXktPktleSwKKwkJCXBTcmMsCisJCQlwU3JjICsgNiwKKwkJCVVzZXJQcmlvcml0eSwKKwkJCXBLZXktPlR4TWljKTsKKwl9CisKKworCWlmIChwRW5jYXAgIT0gTlVMTCkKKwl7CisJCS8vIExMQyBlbmNhcHN1bGF0aW9uCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOworCQkvLyBQcm90b2NvbCBUeXBlCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8KKwl7CisJCWlmIChTcmNCdWZMZW4gPiAwKQorCQl7CisJCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKKwkJfQorCisJCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAorCisJfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCisKKwkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKK3sKKwlVSU5UIGluZGV4X2xvdzsKKwlVSU5UIGluZGV4X2hpZ2g7CisJVUlOVCBsZWZ0LCByaWdodDsKKworCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7CisJaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOworCisJbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKKwlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOworCisJcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCitVSU5UIHJvdHIxKFVJTlQgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCisJeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfQorCWVsc2UKKwl7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKworVk9JRCBSVE1QVGtpcE1peEtleSgKKwlVQ0hBUiAqa2V5LAorCVVDSEFSICp0YSwKKwlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVDSEFSICpyYzRrZXksCisJVUlOVCAqcDFrKQoreworCisJVUlOVCB0c2MwOworCVVJTlQgdHNjMTsKKwlVSU5UIHRzYzI7CisKKwlVSU5UIHBwazA7CisJVUlOVCBwcGsxOworCVVJTlQgcHBrMjsKKwlVSU5UIHBwazM7CisJVUlOVCBwcGs0OworCVVJTlQgcHBrNTsKKworCUlOVCBpOworCUlOVCBqOworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJLyogUGhhc2UgMSwgc3RlcCAxICovCisJcDFrWzBdID0gdHNjMTsKKwlwMWtbMV0gPSB0c2MwOworCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKKwlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7CisJcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOworCisJLyogUGhhc2UgMSwgc3RlcCAyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IDIqKGkgJiAxKTsKKwkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OworCX0KKworCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLworCXBwazAgPSBwMWtbMF07CisJcHBrMSA9IHAxa1sxXTsKKwlwcGsyID0gcDFrWzJdOworCXBwazMgPSBwMWtbM107CisJcHBrNCA9IHAxa1s0XTsKKwlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7CisKKwkvKiBQaGFzZTIsIFN0ZXAgMiAqLworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7CisKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisgICAgLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKKworCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7CisJcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OworCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OworCisJcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKKwlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OworCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OworCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OworCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJaW50IGhlYWRlcl9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOworCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOworCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOworCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOworCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQorCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCisJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KKworCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCisJeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOworCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdigKKwl1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJaW50IHFjX2V4aXN0cywKKwlpbnQgYTRfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKK3sKKwlpbnQgaTsKKworCW1pY19pdlswXSA9IDB4NTk7CisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKKwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQorCXsKKwkJaWYgKHJvdW5kID09IDApCisJCXsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJCWVsc2UgaWYgKHJvdW5kID09IDEwKQorCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfQorCQllbHNlICAgIC8qIDEgLSA5ICovCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKKwl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCisJaW50IGMpCit7CisKKwlpbnQgaSA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKKwljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKKworfQorCisKKy8vCisvLyBUUlVFOiBTdWNjZXNzIQorLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCisvLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisgICAgVUNIQVIJCQlmYzA7CisJVUNIQVIJCQlmYzE7CisJVVNIT1JUCQkJZmM7CisJVUlOVAkJCWZyYW1lX3R5cGU7CisJVUlOVAkJCWZyYW1lX3N1YnR5cGU7CisgICAgVUlOVAkJCWZyb21fZHM7CisgICAgVUlOVAkJCXRvX2RzOworCUlOVAkJCQlhNF9leGlzdHM7CisJSU5UCQkJCXFjX2V4aXN0czsKKwlVU0hPUlQJCQlkdXJhdGlvbjsKKwlVU0hPUlQJCQlzZXFfY29udHJvbDsKKwlVU0hPUlQJCQlxb3NfY29udHJvbDsKKwlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVJDNEtleVsxNl07CisJVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKKwlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKKwlVSU5UCQkJY3JjMzIgPSAwOworCVVJTlQJCQl0cmFpbGZjcyA9IDA7CisJVUNIQVIJCQlNSUNbOF07CisJVUNIQVIJCQlUcmFpbE1JQ1s4XTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlmYzAgPSAqcERhdGE7CisJZmMxID0gKihwRGF0YSArIDEpOworCisJZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisgICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisgICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKKworICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCisgICAgICAgICAgICAgICAgICk7CisKKwlIZWFkZXJMZW4gPSAyNDsKKwlpZiAoYTRfZXhpc3RzKQorCQlIZWFkZXJMZW4gKz0gNjsKKworCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKKworCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKKworCWlmIChxY19leGlzdHMpCisJeworCQlpZiAoYTRfZXhpc3RzKQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7CisJCX0KKwl9CisKKwlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECisJfQorCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgorCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKKwlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJLy9SVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOwkvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwCisJCXJldHVybiAoRkFMU0UpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lISFcbiIpOworCXJldHVybiBUUlVFOworfQorCisKKworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisJVUNIQVIJCQlQTls2XTsKKwlVSU5UCQkJcGF5bG9hZF9sZW47CisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCVVTSE9SVAkJCWZjOworCVVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworCVVJTlQJCQlmcm9tX2RzOworCVVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVUNIQVIJCQlhZXNfb3V0WzE2XTsKKwlpbnQgCQkJcGF5bG9hZF9pbmRleDsKKwlVSU5UIAkJCWk7CisJVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOworCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJbWljX2l2WzE2XTsKKwlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworCXRvX2RzID0gKGZjMSAmIDB4MSk7CisKKwlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKwlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCQkJCSApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKKwlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKKwlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKworCisJLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCisKKwlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQlpKzEgKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8vCisJLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKKwkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKKwkvLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCisJeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJUE4sCisJCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKKworCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKworCS8vCisJLy8gRGVzY3J5cHQgdGhlIE1JQworCS8vCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJcERhdGEsCisJCQkJCQkJUE4sCisJCQkJCQkJMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8vCisJLy8gQ2FsY3VsYXRlIE1JQworCS8vCisKKwkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdigKKwkJCQkJbWljX2l2LAorCQkJCQlxY19leGlzdHMsCisJCQkJCWE0X2V4aXN0cywKKwkJCQkJcERhdGEsCisJCQkJCXBheWxvYWRfbGVuLAorCQkJCQlQTik7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJCQkJCQltaWNfaGVhZGVyMSwKKwkJCQkJCUhlYWRlckxlbiwKKwkJCQkJCXBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwkJCQkJCW1pY19oZWFkZXIyLAorCQkJCQkJcERhdGEsCisJCQkJCQlhNF9leGlzdHMsCisJCQkJCQlxY19leGlzdHMpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisKKwkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gYWVzX291dCBjb250YWlucyBwYWRkZWQgbWljLCBkaXNjYXJkIG1vc3Qgc2lnbmlmaWNhbnQKKwkvLyA4IGJ5dGVzIHRvIGdlbmVyYXRlIDY0IGJpdCBNSUMKKwlmb3IgKGkgPSAwIDsgaSA8IDg7IGkrKykgTUlDW2ldID0gYWVzX291dFtpXTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0QUVTLCBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KKy8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBuZXh0X2tleSgKKwlJTiAgUFVDSEFSICBrZXksCisJSU4gIElOVCAgICAgcm91bmQpCit7CisJVUNIQVIgICAgICAgcmNvbjsKKwlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKKwlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9CisJeworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCQkweDFiLCAweDM2LCAweDM2LCAweDM2CisJfTsKKworCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOworCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOworCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOworCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOworCisJcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOworCisJeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKKwlrZXlbMF0gPSBrZXlbMF0gXiByY29uOworCisJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOworCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKKwl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKK30KKworVk9JRCB4b3JfMzIoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8NDsgaSsrKQorCXsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCitWT0lEIGJ5dGVfc3ViKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wOyBpPCAxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKKwl9Cit9CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKwlJTiAgVUNIQVIgICBhKQoreworCXJldHVybiBTYm94VGFibGVbKGludClhXTsKK30KKworVk9JRCBzaGlmdF9yb3coCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCW91dFswXSA9ICBpblswXTsKKwlvdXRbMV0gPSAgaW5bNV07CisJb3V0WzJdID0gIGluWzEwXTsKKwlvdXRbM10gPSAgaW5bMTVdOworCW91dFs0XSA9ICBpbls0XTsKKwlvdXRbNV0gPSAgaW5bOV07CisJb3V0WzZdID0gIGluWzE0XTsKKwlvdXRbN10gPSAgaW5bM107CisJb3V0WzhdID0gIGluWzhdOworCW91dFs5XSA9ICBpblsxM107CisJb3V0WzEwXSA9IGluWzJdOworCW91dFsxMV0gPSBpbls3XTsKKwlvdXRbMTJdID0gaW5bMTJdOworCW91dFsxM10gPSBpblsxXTsKKwlvdXRbMTRdID0gaW5bNl07CisJb3V0WzE1XSA9IGluWzExXTsKK30KKworVk9JRCBtaXhfY29sdW1uKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgICAgICAgICBpOworCVVDSEFSICAgICAgIGFkZDFiWzRdOworCVVDSEFSICAgICAgIGFkZDFiZjdbNF07CisJVUNIQVIgICAgICAgcm90bFs0XTsKKwlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOworCVVDSEFSICAgICAgIGFuZGY3WzRdOworCVVDSEFSICAgICAgIHJvdHJbNF07CisJVUNIQVIgICAgICAgdGVtcFs0XTsKKwlVQ0hBUiAgICAgICB0ZW1wYls0XTsKKworCWZvciAoaT0wIDsgaTw0OyBpKyspCisJeworCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQorCQkJYWRkMWJbaV0gPSAweDFiOworCQllbHNlCisJCQlhZGQxYltpXSA9IDB4MDA7CisJfQorCisJc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCisJc3dhcF9oYWxmc1sxXSA9IGluWzNdOworCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKKwlzd2FwX2hhbGZzWzNdID0gaW5bMV07CisKKwlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KKwlyb3RsWzFdID0gaW5bMF07CisJcm90bFsyXSA9IGluWzFdOworCXJvdGxbM10gPSBpblsyXTsKKworCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOworCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOworCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOworCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOworCisJZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLworCXsKKwkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOworCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQorCQl7CisJCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOworCQl9CisJfQorCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKKwlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKKworCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOworCisJeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKKworCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KKwlyb3RyWzBdID0gcm90clsxXTsKKwlyb3RyWzFdID0gcm90clsyXTsKKwlyb3RyWzJdID0gcm90clszXTsKKwlyb3RyWzNdID0gdGVtcFswXTsKKworCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKKwl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7CisJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY5ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3dlcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworVUlOVCBGQ1NUQUJfMzJbMjU2XSA9Cit7CisJMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwKKwkweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLAorCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisJMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywgMHg5MGJmMWQ5MSwKKwkweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLAorCTB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisJMHgxMzZjOTg1NiwgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywKKwkweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LAorCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisJMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwKKwkweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLAorCTB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisJMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwKKwkweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LCAweGI4YmRhNTBmLAorCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisJMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwKKwkweDc2ZGM0MTkwLCAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLAorCTB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisJMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwKKwkweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLAorCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisJMHg2YzA2OTVlZCwgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywKKwkweDY1YjBkOWM2LCAweDEyYjdlOTUwLCAweDhiYmViOGVhLCAweGZjYjk4ODdjLAorCTB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisJMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMiwKKwkweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLAorCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisJMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwKKwkweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LAorCTB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisJMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwKKwkweDU5YjMzZDE3LCAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLAorCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisJMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwgMHg3M2RjMTY4MywKKwkweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LAorCTB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisJMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwKKwkweGY3NjI1NzVkLCAweDgwNjU2N2NiLCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LAorCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisJMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwKKwkweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLAorCTB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisJMHhkODBkMmJkYSwgMHhhZjBhMWI0YywgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwKKwkweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LAorCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisJMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwKKwkweGM1YmEzYmJlLCAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LAorCTB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisJMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywgMHgwMjZkOTMwYSwKKwkweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAorCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisJMHg5MmQyOGU5YiwgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwKKwkweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLAorCTB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisJMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywKKwkweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LAorCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisJMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwKKwkweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLAorCTB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisJMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwKKwkweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLAorCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisJMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZAorfTsKKworLyoKK1VDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFdFUCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCisJCUtleUlkCQkgICBXRVAgS2V5IElECisJCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQorCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JVUNIQVIJCQlLZXlMZW4sCisJSU4gT1VUCVBVQ0hBUgkJcERlc3QpCit7CisJVUlOVCBpOworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgeworICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIHsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgorCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKworCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0CisgICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICBOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBFbmNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVVJTlQJCQlMZW4pCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOworCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQorCisJQXJndW1lbnRzOgorCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCisJCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKK3sKKwlVSU5UCXRyYWlsZmNzOworCVVJTlQgICAgY3JjMzI7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7CisJVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisKKwlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCisKKwlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKKwlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCisJCXJldHVybiAoRkFMU0UpOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOworCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCisKKwlSZXR1cm4gVmFsdWU6CisJICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBUkNGT1VSX0lOSVQoCisJSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVJTlQJCQlLZXlMZW4pCit7CisJVUNIQVIJdCwgdTsKKwlVSU5UCWtleWluZGV4OworCVVJTlQJc3RhdGVpbmRleDsKKwlQVUNIQVIJc3RhdGU7CisJVUlOVAljb3VudGVyOworCisJc3RhdGUgPSBDdHgtPlNUQVRFOworCUN0eC0+WCA9IDA7CisJQ3R4LT5ZID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7CisJa2V5aW5kZXggPSAwOworCXN0YXRlaW5kZXggPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwl7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQorCisJQXJndW1lbnRzOgorCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCisJUmV0dXJuIFZhbHVlOgorCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUglBUkNGT1VSX0JZVEUoCisJSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCit7CisgIFVJTlQgeDsKKyAgVUlOVCB5OworICBVQ0hBUiBzeCwgc3k7CisgIFBVQ0hBUiBzdGF0ZTsKKworICBzdGF0ZSA9IEN0eC0+U1RBVEU7CisgIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOworICBzeCA9IHN0YXRlW3hdOworICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7CisgIHN5ID0gc3RhdGVbeV07CisgIEN0eC0+WCA9IHg7CisgIEN0eC0+WSA9IHk7CisgIHN0YXRlW3ldID0gc3g7CisgIHN0YXRlW3hdID0gc3k7CisKKyAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9ERUNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQorCisJQXJndW1lbnRzOgorCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK1ZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKyAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KKworCUFyZ3VtZW50czoKKwkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKKwkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVUlOVCAtIEZDUyAzMiBiaXRzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVSU5UCVJUTVBfQ0FMQ19GQ1MzMigKKwlJTglVSU5UCUZjcywKKwlJTglQVUNIQVIJQ3AsCisJSU4JSU5UCQlMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7CisKKwlyZXR1cm4gKEZjcyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KKworCUFyZ3VtZW50czoKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SUNWKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUglwRGVzdCkKK3sKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CisKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmJhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKQEAgLTAsMCArMSwxOTgxIEBACisgLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydHVzYl9idWxrLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNi0yNS0yMDA0CWNyZWF0ZWQKKworKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorLy8gTWF0Y2ggdG90YWwgNiBidWxrb3V0IGVuZHBvaW50IHRvIGNvcnJlc3BvbmRpbmcgcXVldWUuCitVQ0hBUglFcFRvUXVldWVbNl09e0ZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVR9OworCisvL3N0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsKKwordm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCIChzdHJ1Y3QgdXJiICpwVXJiLAorCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldiwKKwl1bnNpZ25lZCBpbnQgYnVsa3BpcGUsCisJdm9pZCAqcFRyYW5zZmVyQnVmLAorCWludCBCdWZTaXplLAorCXVzYl9jb21wbGV0ZV90IENvbXBsZXRlLAorCXZvaWQgKnBDb250ZXh0KQoreworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLCAodXNiX2NvbXBsZXRlX3QpQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbHNlCisJRklMTF9CVUxLX1VSQihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwgQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0VHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJeworCQlwU3JjID0gJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvblsyXTsKKwl9CisJZWxzZQorCXsKKwkJcFNyYyA9IChQVUNIQVIpIHBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldDsKKwl9CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJcFR4Q29udGV4dC0+QnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIFRYX0JVRkZFUl9OT1JNU0laRSArIDIpOworCWVsc2UKKwkJcFVyYi0+dHJhbnNmZXJfZG1hCT0gcFR4Q29udGV4dC0+ZGF0YV9kbWE7CisKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0SFRUeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJcFNyYyA9ICZwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJQnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CisJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisjZW5kaWYKKworfQorCitWT0lECVJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCkKK3sKKwlQVVJCCQkJCXBVcmI7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJVUxPTkcJCQkJUlhfYnVsa19zaXplOworCisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwlpZiAoIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA2NCkKKwkJUlhfYnVsa19zaXplID0gNDA5NjsKKwllbHNlCisJCVJYX2J1bGtfc2l6ZSA9IE1BWF9SWEJVTEtfU0laRTsKKworCS8vSW5pdGlhbGl6ZSBhIHJ4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKKwkJCQkJCSYocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAorCQkJCQkJUlhfYnVsa19zaXplIC0gKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24pLAorCQkJCQkJKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa1J4Q29tcGxldGUsCisJCQkJCQkodm9pZCAqKXBSeENvbnRleHQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKworVk9JRAlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCisJUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCVBUWElORk9fU1RSVUMJcFR4SW5mbywgcExhc3RUeEluZm8gPSBOVUxMOworCVBUWFdJX1NUUlVDICAgICAgICAgICAgIHBUeFdJOworCVVMT05HCQkJVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwLCBJcnFGbGFnczIgPSAwOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BrdCwgcEFwcGVuZGFudDsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCVVDSEFSCQkJYWxsemVyb1s0XT0gezB4MCwweDAsMHgwLDB4MH07CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IFRSVUU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdKTsKKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXx8ICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbi04KSA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKworCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKworCQkvLyBDbGVhciBEYXRhIGZsYWcKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8vIENsZWFyIERhdGEgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUI6ST0weCVseCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgaW5faW50ZXJydXB0KCksCisJLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbjsKKwlUaGlzQnVsa1NpemUgPSAwOworCVRtcEJ1bGtFbmRQb3MgPSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CisJcFdpcmVsZXNzUGt0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCisJaWYgKChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKKwl7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwkJfQorCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKKwkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IC0tPiBDT1BZIFBBRC4gQ3VyV3JpdGUgPSAlbGQsIE5leHRCdWxrID0gJWxkLiAgIEVOZXh0QnVsayA9ICVsZC5cbiIsICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwl9CisKKwlkbworCXsKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107CisJCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKKworCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLCAgIHBUeFdJLT5BTVBEVSkpOworCisJCS8vIGFkZCBieSBJdmVyc29uLCBsaW1pdCBCdWxrT3V0IHNpemUgdG8gNGsgdG8gcGFzcyBXTU0gYiBtb2RlIDJUMVIgdGVzdCBpdGVtcworCQkvL2lmICgoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKQorCQlpZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAmJiAocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spKQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHgxMDAwKSA9PSAweDEwMDApKQorCQkJeworCQkJCS8vIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUmMHhmZmZmZjgwMCkgIT0gMCkgKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkqLykKKwkJCXsKKwkJCQkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLy8gZW5kIEl2ZXJzb24KKwkJZWxzZQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHg2MDAwKSA9PSAweDYwMDApKQorCQkJewkvLyBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLgorCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSYweGZmZmZmODAwKSAhPSAwKSApIC8qfHwgKCAoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKSovKQorCQkJewkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCisJCXsKKwkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19GVU5DVElPTl9fLCBwVHhJbmZvLT5RU0VMKTsKKwkJCXByaW50aygiXHRDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpOworCQkJaGV4X2R1bXAoIldyb25nIFFTZWwgUGt0OiIsIChQVUNIQVIpJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXSwgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAtIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQl9CisKKwkJaWYgKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuIDw9IDgpCisJCXsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFKi8sKCJlMiwgVVNCRE1BVHhQa3RMZW49PTAsIFNpemU9JWxkLCBiQ1NQYWQ9JWQsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBDV1JQb3M9JWxkIVxuIiwKKwkJCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcykpOworCQkJeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFKi8sKCIleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCQlwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbM10KKwkJCQkJLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOworCQkJfQorCQkJcEFkLT5iRm9yY2VQcmludFRYID0gVFJVRTsKKwkJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiT3V0OnBUeEluZm8tPlVTQkRNQVR4UGt0TGVuPSVkIVxuIiwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pKTsKKwkJCXJldHVybjsKKwkJfQorCisJCQkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKworCQlwTGFzdFR4SW5mbyA9IHBUeEluZm87CisKKwkJLy8gTWFrZSBzdXJlIHdlIHVzZSBFRENBIFFVRVVFLgorCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlUaGlzQnVsa1NpemUgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuKzQpOworCQlUbXBCdWxrRW5kUG9zICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbis0KTsKKworCQlpZiAoVG1wQnVsa0VuZFBvcyAhPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCQlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMTsKKworCQlpZiAocFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPT0gMSkKKwkJeworCQkJaWYgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KQorCQkJCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAwOworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCisJCQliVHhRTGFzdFJvdW5kID0gVFJVRTsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSA4OworCisJI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4SW5mbywgVFlQRV9UWElORk8pOworCQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisJI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCX13aGlsZSAoVFJVRSk7CisKKwkvLyBhZGp1c3QgdGhlIHBUeEluZm8tPlVTQkRNQU5leHRWTEQgdmFsdWUgb2YgbGFzdCBwVHhJbmZvLgorCWlmIChwTGFzdFR4SW5mbykKKwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBMYXN0VHhJbmZvLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCQlwTGFzdFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBMYXN0VHhJbmZvLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0KKworCS8qCisJCVdlIG5lZWQgdG8gY29weSBTYXZlZFBhZCB3aGVuIGZvbGxvd2luZyBjb25kaXRpb24gbWF0Y2hlZCEKKwkJCTEuIE5vdCB0aGUgbGFzdCByb3VuZCBvZiB0aGUgVHhRdWV1ZSBhbmQKKwkJCTIuIGFueSBtYXRjaCBvZiBmb2xsb3dpbmcgY2FzZXM6CisJCQkJKDEpLiBUaGUgRW5kIFBvc2l0aW9uIG9mIHRoaXMgYnVsayBvdXQgaXMgcmVhY2ggdG8gdGhlIEN1cnJlbmN0IFdyaXRlIHBvc2l0aW9uIGFuZAorCQkJCQkJdGhlIFR4SW5mbyBhbmQgcmVsYXRlZCBoZWFkZXIgYWxyZWFkeSB3cml0ZSB0byB0aGUgQ3VyV3JpdGVQb3NpdGlvbi4KKwkJCSAgIAkJPT4oRU5leHRCdWxrT3V0UG9zaXRpb24gPT0gQ3VyV3JpdGVQb3NpdGlvbikgJiYgKEN1cldyaXRlUmVhbFBvcyA+IEN1cldyaXRlUG9zaXRpb24pCisKKwkJCQkoMikuIFRoZSBFbmRQb3NpdGlvbiBvZiB0aGUgYnVsayBvdXQgaXMgbm90IHJlYWNoIHRvIHRoZSBDdXJyZW50IFdyaXRlIFBvc2l0aW9uLgorCQkJCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBDdXJXcml0ZVBvc2l0aW9uKQorCSovCisJaWYgKChiVHhRTGFzdFJvdW5kID09IEZBTFNFKSAmJgorCQkgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHx8CisJCSAgKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uXSwgOCk7CisJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gVFJVRTsKKwkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLDQpKQorCQl7CisJCQlQVUNIQVIJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiV0FSTklORy1aZXJvLTM6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngsQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1c9JWQsIE5CUG9zPSVsZCwgVEJQb3M9JWxkLCBUQlNpemU9JWxkXG4iLAorCQkJCXBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0scEJ1ZlszXSxwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLHBCdWZbN10sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsCisJCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBUbXBCdWxrRW5kUG9zLCBUaGlzQnVsa1NpemUpKTsKKworCQkJcEJ1ZiA9ICZwV2lyZWxlc3NQa3RbcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uXTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlx0Q1dQb3M9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0scEJ1ZlszXSxwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLHBCdWZbN10pKTsKKwkJfQorCQkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJFTlBvcz09Q1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1NQYWQ9JWQhXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCX0KKworCWlmIChwQWQtPmJGb3JjZVByaW50VFggPT0gVFJVRSkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUE6U2l6ZT0lbGQsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIFRoaXNCdWxrU2l6ZSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIGJMUm91bmQ9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIGJUeFFMYXN0Um91bmQpKTsKKworCQkvLyBVU0IgRE1BIGVuZ2luZSByZXF1aXJlcyB0byBwYWQgZXh0cmEgNCBieXRlcy4gVGhpcyBwYWQgZG9lc24ndCBjb3VudCBpbnRvIHJlYWwgYnVsa291dHNpemUuCisJcEFwcGVuZGFudCA9ICZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107CisJTmRpc1plcm9NZW1vcnkocEFwcGVuZGFudCwgOCk7CisJCVRoaXNCdWxrU2l6ZSArPSA0OworCQlwSFRUWENvbnRleHQtPkxhc3RPbmUgPSBUUlVFOworCQlpZiAoKFRoaXNCdWxrU2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCQlUaGlzQnVsa1NpemUgKz0gNDsKKwlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gVGhpc0J1bGtTaXplOworCisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDE7CisJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0SFRUeERlc2MocEFkLCBwSFRUWENvbnRleHQsIEJ1bGtPdXRQaXBlSWQsIFRoaXNCdWxrU2l6ZSwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwlwVXJiID0gcEhUVFhDb250ZXh0LT5wVXJiOworCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKworCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCXJldHVybjsKKwl9CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRSZXErKzsKKworfQorCisKK1ZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBPU19DT09LSUUJCQlwT2JqOworCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7CisJVUNIQVIJCQkJQnVsa091dFBpcGVJZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGVcbiIpKTsKKworCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZAkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVN0YXR1cwkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCUJ1bGtPdXRQaXBlSWQgPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CisJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CisKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsICgiRG9uZS1CKCVkKTpJPTB4JWx4LCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBCdWxrT3V0UGlwZUlkLCBpbl9pbnRlcnJ1cHQoKSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCS8vCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa091dENvbXBsZXRlKys7CisKKwkJcEFkLT5Db3VudGVyczgwMjMuR29vZFRyYW5zbWl0cysrOworCQkvL1JUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCUZSRUVfSFRUWF9SSU5HKHBBZCwgQnVsa091dFBpcGVJZCwgcEhUVFhDb250ZXh0KTsKKwkJLy9SVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJUFVDSEFSCXBCdWY7CisKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcisrOworCisJCXBCdWYgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+V2lyZWxlc3NQYWNrZXRbcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa091dERhdGFQYWNrZXQgZmFpbGVkOiBSZWFzb25Db2RlPSVkIVxuIiwgU3RhdHVzKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsIHBBZC0+QnVsa091dFJlcSwgcEFkLT5CdWxrT3V0Q29tcGxldGUsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKKwkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKworCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IEJ1bGtPdXRQaXBlSWQ7CisJCX0KKwl9CisKKwkvLworCS8vIGJJblVzZSA9IFRSVUUsIG1lYW5zIHNvbWUgcHJvY2VzcyBhcmUgZmlsbGluZyBUWCBkYXRhLCBhZnRlciB0aGF0IG11c3QgdHVybiBvbiBiV2FpdGluZ0J1bGtPdXQKKwkvLyBiV2FpdGluZ0J1bGtPdXQgPSBUUlVFLCBtZWFucyB0aGUgVFggZGF0YSBhcmUgd2FpdGluZyBmb3IgYnVsayBvdXQuCisJLy8KKwkvL1JUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgJiYKKwkJKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbis4KSkgJiYKKwkJIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpKQorCXsKKwkJLy8gSW5kaWNhdGUgVGhlcmUgaXMgZGF0YSBhdmFsaWFibGUKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJEb25lLUEoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZFxuIiwgQnVsa091dFBpcGVJZCwgaW5faW50ZXJydXB0KCksCisJLy8JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCisJc3dpdGNoIChCdWxrT3V0UGlwZUlkKQorCXsKKwkJY2FzZSAwOgorCQkJCXBPYmotPmFjMF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDE6CisJCQkJcE9iai0+YWMxX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCQlwT2JqLT5hYzJfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJCXBPYmotPmFjM19kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDQ6CisJCQkJcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwl9CisjZWxzZQorCit7CisJUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUgCQlwT2JqOworCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKKworCisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZAk9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCXN3aXRjaCAoQnVsa091dFBpcGVJZCkKKwl7CisJCWNhc2UgMDoKKwkJCQlwT2JqLT5hYzBfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCQlwT2JqLT5hYzFfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCQlwT2JqLT5hYzJfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCQlwT2JqLT5hYzNfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCQlwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOiBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXROdWxsRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gVFJVRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMTsKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKworCisJLy8gQ2xlYXIgTnVsbCBmcmFtZSBidWxrIGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBOdWxsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKTsKKworCXBVcmIgPSBwTnVsbENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0TnVsbEZyYW1lOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCXJldHVybjsKKwl9CisKK30KKworLy8gTlVMTCBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQkJcE9iajsKKworCisJcE51bGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE51bGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzIAkJCT0gcFVyYi0+c3RhdHVzOworCisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJLy8gUmVzZXQgTnVsbCBmcmFtZSBjb250ZXh0IGZsYWdzCisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nIAk9IEZBTFNFOworCXBOdWxsQ29udGV4dC0+SW5Vc2UgCQk9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vIERvbid0IHdvcnJ5IGFib3V0IHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpdHNlbGYKKwkJLy9SVE1QVVNCRGVRdWV1ZVBhY2tldChwQWQsIDApOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIFRSVUUsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IE51bGwgRnJhbWUgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisjZWxzZQorCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrKTsKKyNlbmRpZgorCit9CisKKyNpZiAwCS8vIEZvciBSVDI4NzAsIFJUUyBmcmFtZSBub3QgdXNlZCBub3csIGJ1dCBtYXliZSB3aWxsIHVzZSBpdCBsYXR0ZXIuCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6IFJUUyBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrT3V0UlRTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0ID0gJihwQWQtPlJUU0NvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJVUNIQVIJCQlQaXBlSUQ9MDsKKworCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80KSkKKwkJUGlwZUlEPSAzOworCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzMpKQorCQlQaXBlSUQ9IDI7CisJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMikpCisJCVBpcGVJRD0gMTsKKwllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCkpCisJCVBpcGVJRD0gMDsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbUGlwZUlEXSwgSXJxRmxhZ3MpOworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tQaXBlSURdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW1BpcGVJRF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW1BpcGVJRF0gPSBUUlVFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tQaXBlSURdLCBJcnFGbGFncyk7CisKKwkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwUlRTQ29udGV4dC0+QnVsa091dFNpemU7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0UlRTRnJhbWUgXG4iKSk7CisKKwkvLyBDbGVhciBSVFMgZnJhbWUgYnVsayBmbGFnCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1JUUyk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUlRTQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBSVFNDb250ZXh0LCBQaXBlSUQsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKTsKKwlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisKKwlwVXJiID0gcFJUU0NvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0UlRTRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIjwtLS1SVFVTQkJ1bGtPdXRSVFNGcmFtZSBcbiIpKTsKKworfQorCisvLyBSVFMgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCitWT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQVFhfQ09OVEVYVAkJcFJUU0NvbnRleHQ7CisJTlRTVEFUVVMJCVN0YXR1czsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworI2VuZGlmCisJUE9TX0NPT0tJRQkJcE9iajsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlXG4iKSk7CisKKwlwUlRTQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZAkJCT0gcFJUU0NvbnRleHQtPnBBZDsKKwlTdGF0dXMJCT0gcFVyYi0+c3RhdHVzOworCisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJLy8gUmVzZXQgUlRTIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBSVFNDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvLyBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmCisJCS8vUlRNUFVTQkRlUXVldWVQYWNrZXQocEFkLCBwUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2Vsc2UKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iai0+cnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCI8LS0tUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZVxuIikpOworCit9CisjZW5kaWYKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOiBNTE1FIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhOworCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7CisKKwlpZiAoKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPj0gTUdNVF9SSU5HX1NJWkUpIHx8CisJCShwTUxNRUNvbnRleHQtPkluVXNlID09IEZBTFNFKSB8fAorCQkocE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gRkFMU0UpKQorCXsKKworCisJCS8vIENsZWFyIE1MTUUgYnVsayBmbGFnCisJCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKworCQlyZXR1cm47CisJfQorCisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IFRSVUU7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtNR01UUElQRUlEWF0gPSAxOworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplOworCisJLy8gQ2xlYXIgTUxNRSBidWxrIGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisKKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dE1MTUVQYWNrZXRcbiIpKTsKKyNpZiAwIC8vIGZvciBkZWJ1ZworeworCXByaW50aygiTUxNRS1PdXQsIEM9JWQhLCBEPSVkLCBGPSVkIVxuIiwgcEFkLT5NZ210UmluZy5UeENwdUlkeCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCwgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCk7CisKKwkvL1RPRE86IE5lZWQgdG8gcmVtb3ZlIGl0IHdoZW4gZm9ybWFsIHJlbGVhc2UKKwlQVFhJTkZPX1NUUlVDIHBUeEluZm87CisKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcjsKKwlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCisJeworCQkJcHJpbnRrKCIlcygpOiA9PT09PiBwVHhJbmZvLT5RdWV1ZVNlbCglZCkhPSBGSUZPX0VEQ0EhISEhXG4iLCBfX0ZVTkNUSU9OX18sIHBUeEluZm8tPlFTRUwpOworCQkJcHJpbnRrKCJcdE1MTUVfSW5kZXg9JWQhXG4iLCBJbmRleCk7CisJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUilwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbik7CisJfQorfQorI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwTUxNRUNvbnRleHQsIE1HTVRQSVBFSURYLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkvL0ZvciBtZ210IHVyYiBidWZmZXIsIGJlY2F1c2Ugd2UgdXNlIHNrX2J1ZmYsIHNvIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBVU0IgY29udHJvbGxlciBkbyBkbWEgbWFwcGluZy4KKwlwVXJiLT50cmFuc2Zlcl9kbWEJPSAwOworCXBVcmItPnRyYW5zZmVyX2ZsYWdzICY9ICh+VVJCX05PX1RSQU5TRkVSX0RNQV9NQVApOworI2VuZGlmCisKKwlwVXJiID0gcE1MTUVDb250ZXh0LT5wVXJiOworCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dE1MTUVQYWNrZXQ6IFN1Ym1pdCBNTE1FIFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOworCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W01HTVRQSVBFSURYXSA9IDA7CisJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IFRSVUU7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldCBcbiIpKTsKKy8vCXByaW50aygiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQsQ3B1PSVkISwgRG1hPSVkLCBTd0lkeD0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworfQorCisKK1ZPSUQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFRYX0NPTlRFWFQJCQlwTUxNRUNvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCVBPU19DT09LSUUgCQkJcE9iajsKKwlpbnQJCQkJCWluZGV4OworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKyNlbmRpZgorCisKKwkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGVcbiIpKTsKKwlwTUxNRUNvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlwT2JqIAkJCT0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisJU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7CisJaW5kZXggCQkJPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7CisKKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCUFTU0VSVCgocEFkLT5NZ210UmluZy5UeERtYUlkeCA9PSBpbmRleCkpOworCS8vcHJpbnRrKCJNTE1FLURvbmUtQjogQz0lZCwgRD0lZCwgRj0lZCwgU2VsZj0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgsIHBNTE1FQ29udGV4dC0+U2VsZklkeCk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisKKwlpZiAoU3RhdHVzICE9IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJLy9CdWxrLU91dCBmYWlsIHN0YXR1cyBoYW5kbGUKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBNTE1FIEZhaWxlZCwgU3RhdHVzPSVkIVxuIiwgU3RhdHVzKSk7CisJCQkvLyBUT0RPOiBIb3cgdG8gaGFuZGxlIGFib3V0IHRoZSBNTE1FQnVsa091dCBmYWlsZWQgaXNzdWUuIE5lZWQgdG8gcmVzZW5kIHRoZSBtZ210IHBrdD8KKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCX0KKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCS8vIFJlc2V0IE1MTUUgY29udGV4dCBmbGFncworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCisJcFBhY2tldCA9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQ7CisJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLyBJbmNyZWFzZSBNZ210UmluZyBJbmRleAorCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIE1HTVRfUklOR19TSVpFKTsKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4Kys7CisKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwkvLyBOby1tYXR0ZXIgc3VjY2VzcyBvciBmYWlsLCB3ZSBmcmVlIHRoZSBtZ210IHBhY2tldC4KKwlpZiAocFBhY2tldCkKKwkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisKKyNpZiAwCisJLy9CdWxrLU91dCBmYWlsIHN0YXR1cyBoYW5kbGUKKwlpZiAoU3RhdHVzICE9IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBNTE1FIEZhaWxlZCwgU3RhdHVzPSVkIVxuIiwgU3RhdHVzKSk7CisJCQkvLyBUT0RPOiBIb3cgdG8gaGFuZGxlIGFib3V0IHRoZSBNTE1FQnVsa091dCBmYWlsZWQgaXNzdWUuIE5lZWQgdG8gcmVzZXQgdGhlIGVuZHBvaW50PworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJfQorCX0KKyNlbmRpZgorCisJLy9wcmludGsoIk1MTUUtRG9uZS1BOiBDPSVkLCBEPSVkLCBGPSVkIVxuIiwgcEFkLT5NZ210UmluZy5UeENwdUlkeCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCwgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCk7CisKKwlwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7CisvLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUsIENwdT0lZCwgRG1hPSVkLCBTd0lkeD0lZCFcbiIsCisvLwkJCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKKworI2Vsc2UKKworCXBPYmotPm1nbXRfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworI2VuZGlmCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOiBQc1BvbGwgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dFBzUG9sbCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVFhfQ09OVEVYVAkJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gVFJVRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMTsKKwlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKworCS8vIENsZWFyIFBTLVBvbGwgYnVsayBmbGFnCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCk7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUHNQb2xsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBQc1BvbGxDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKTsKKworCXBVcmIgPSBwUHNQb2xsQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisJCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dFBzUG9sbDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCit9CisKKy8vIFBTLVBvbGwgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCitWT0lEIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHB1cmJiX3QgcFVyYixzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUFRYX0NPTlRFWFQJCQlwUHNQb2xsQ29udGV4dDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKyNlbmRpZgorCVBPU19DT09LSUUJCQlwT2JqOworCisKKwlwUHNQb2xsQ29udGV4dD0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcFBzUG9sbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwkvLyBSZXNldCBQc1BvbGwgY29udGV4dCBmbGFncworCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJcFBzUG9sbENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vIERvbid0IHdvcnJ5IGFib3V0IHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpdHNlbGYKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKwllbHNlIC8vIFNUQVRVU19PVEhFUgorCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBQU1BvbGwgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisjZWxzZQorCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzayk7CisjZW5kaWYKK30KKworCisjaWYgMAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJVVNCX1J4UGFja2V0IGluaXRpYWxpemVzIGEgVVJCIGFuZCB1c2VzIHRoZSBSeCBJUlAgdG8gc3VibWl0IGl0CisJdG8gVVNCLiBJdCBjaGVja3MgaWYgYW4gUnggRGVzY3JpcHRvciBpcyBhdmFpbGFibGUgYW5kIHBhc3NlcyB0aGUKKwl0aGUgY29yZXNwb25kaW5nIGJ1ZmZlciB0byBiZSBmaWxsZWQuIElmIG5vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCisJZmFpbHMgdGhlIHJlcXVlc3QuIFdoZW4gc2V0dGluZyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdlIHBhc3Mgb3VyCisJQWRhcHRlciBPYmplY3QgYXMgQ29udGV4dC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJCWZvdW5kIG1hdGNoZWQgdHVwbGUgY2FjaGUKKwkJRkFMU0UJCQlubyBtYXRjaGVkIGZvdW5kCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtSZWNlaXZlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKworCS8qIGRldmljZSBoYWQgYmVlbiBjbG9zZWQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJLy8gTGFzdCBpcyB0aW1lIHBvaW50IGJldHdlZW4gMiBzZXBhcmF0ZSBVUkIuCisJaWYgKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPT0gMCkKKwl7CisJCS8vcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IChwQWQtPk5leHRSeEJ1bGtJbkluZGV4ICsgMSkgJSAoUlhfUklOR19TSVpFKTsKKwkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKKwl9CisJZWxzZSBpZiAoKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24mMHgxZmYpICE9IDApCisJeworCQkvL3BBZC0+TmV4dFJ4QnVsa0luSW5kZXggPSAocEFkLT5OZXh0UnhCdWxrSW5JbmRleCArIDEpICUgKFJYX1JJTkdfU0laRSk7CisJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMHglbHguICBFbmQgb2YgVVJCLlxuIiwgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiApKTsKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJfQorCisJaWYgKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPT0gTUFYX1JYQlVMS19TSVpFKQorCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKworCS8vIFRPRE86IFdoeSBuZWVkIHRvIGNoZWNrIGlmIHBSeENvbnRleHQtPkluVXNlZCA9PSBUUlVFPworCS8vaWYgKChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkpCisJaWYgKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgJiYgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoInBSeENvbnRleHRbJWRdIEluVXNlID0gJWQucFJ4Q29udGV4dC0+UmVhZGFibGUgPSAlZC4gIFJldHVybi5cbiIsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgscFJ4Q29udGV4dC0+SW5Vc2UsIHBSeENvbnRleHQtPlJlYWRhYmxlICkpOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCS8vIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgVFJVRSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy9yZXR1cm47CisJfQorCXBSeENvbnRleHQtPkluVXNlID0gVFJVRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nPSBUUlVFOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCisJTmRpc1plcm9NZW1vcnkocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIEJVRkZFUl9TSVpFKTsKKwlSVFVTQkluaXRSeERlc2MocEFkLCBwUnhDb250ZXh0KTsKKworCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCXJldHVybjsKKwl9CisJZWxzZSAvLyBzdWNjZXNzCisJeworCQlOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwkJcEFkLT5CdWxrSW5SZXErKzsKKwl9CisKKwkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgRkFMU0UpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHByb2Nlc3MgUnggSXJwIGFuZCBjYWxsIHJ4IGNvbXBsZXRlIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorCQlEZXZpY2VPYmplY3QJUG9pbnRlciB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgbmV4dCBsb3dlcgorCQkJCQkJZGV2aWNlLiBEZXZpY2VPYmplY3QgcGFzc2VkIGluIGhlcmUgYmVsb25ncyB0bworCQkJCQkJdGhlIG5leHQgbG93ZXIgZHJpdmVyIGluIHRoZSBzdGFjayBiZWNhdXNlIHdlCisJCQkJCQl3ZXJlIGludm9rZWQgdmlhIElvQ2FsbERyaXZlciBpbiBVU0JfUnhQYWNrZXQKKwkJCQkJCUFORCBpdCBpcyBub3QgT1VSIGRldmljZSBvYmplY3QKKwkgIElycAkJCQlQdHIgdG8gY29tcGxldGVkIElSUAorCSAgQ29udGV4dAkJCVB0ciB0byBvdXIgQWRhcHRlciBvYmplY3QgKGNvbnRleHQgc3BlY2lmaWVkCisJCQkJCQlpbiBJb1NldENvbXBsZXRpb25Sb3V0aW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKKworCU5vdGU6CisJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUVVNCQnVsa1J4Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKyNpZiAwCisJUFJYX0NPTlRFWFQJCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKy8vCVBPU19DT09LSUUJCQlwT2JqOworCisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworLy8JcE9iagkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKwkvL3BSeENvbnRleHQtPnBJcnAgPSBOVUxMOworCisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrSW5Db21wbGV0ZSsrOworCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IFRSVUU7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCisJfQorCWVsc2UJIC8vIFNUQVRVU19PVEhFUgorCXsKKwkJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwrKzsKKwkJLy8gU3RpbGwgcmVhZCB0aGlzIHBhY2tldCBhbHRob3VnaCBpdCBtYXkgY29tdGFpbiB3cm9uZyBieXRlcy4KKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJLy8gUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uCisKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJeworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cyA9ICVkXG4iLCBTdGF0dXMpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT5OZXh0UnhCdWxrSW5JbmRleD0weCV4LCBOZXh0UnhCdWxrSW5SZWFkSW5kZXg9MHgleCwgVHJhbnNmZXJCdWZmZXJMZW5ndGg9IDB4JXhcbiIsCisJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBSeENvbnRleHQtPnBVcmItPmFjdHVhbF9sZW5ndGgpKTsKKworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sIE5VTEwsIDApOworCQl9CisJCS8vcFVyYiA9IE5VTEw7CisJfQorCisJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKSkgJiYKKy8vCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgJiYKKwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkgJiYKKwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKyNpZiAwCisjaWYgMQorCQlTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCBGQUxTRSk7CisjZWxzZQorCQlwT2JqLT5yeF9iaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJdGFza2xldF9zY2hlZHVsZSgmcE9iai0+cnhfYmgpOworI2VuZGlmCisjZW5kaWYKKwl9CisKKwkvLyBDYWxsIFJ4UGFja2V0IHRvIHByb2Nlc3MgcGFja2V0IGFuZCByZXR1cm4gdGhlIHN0YXR1cworCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworI2Vsc2UKKworCisJLy8gdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOworCS8vIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90CisJLy8gdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PAorCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUgCQlwT2JqOworCisKKwlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcE9iai0+cnhfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisjZW5kaWYKK30KKworI2Vsc2UKKworVk9JRCBEb0J1bGtJbihJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0pOworCWlmICgocEFkLT5QZW5kaW5nUnggPiAwKSB8fCAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJcEFkLT5QZW5kaW5nUngrKzsKKwlwQWQtPkJ1bGtJblJlcSsrOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpOworCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOworCisJcFVyYiA9IHBSeENvbnRleHQtPnBVcmI7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwl7CS8vIGZhaWwKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlwQWQtPlBlbmRpbmdSeC0tOworCQlwQWQtPkJ1bGtJblJlcS0tOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlOiBTdWJtaXQgUnggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJfQorCWVsc2UKKwl7CS8vIHN1Y2Nlc3MKKyNpZiAwCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJLy9OZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwkJcEFkLT5QZW5kaW5nUngrKzsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrSW5SZXErKzsKKyNlbmRpZgorCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKwkJLy9wcmludGsoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCBwQWQtPlBlbmRpbmdSeCwgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlVU0JfUnhQYWNrZXQgaW5pdGlhbGl6ZXMgYSBVUkIgYW5kIHVzZXMgdGhlIFJ4IElSUCB0byBzdWJtaXQgaXQKKwl0byBVU0IuIEl0IGNoZWNrcyBpZiBhbiBSeCBEZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSBhbmQgcGFzc2VzIHRoZQorCXRoZSBjb3Jlc3BvbmRpbmcgYnVmZmVyIHRvIGJlIGZpbGxlZC4gSWYgbm8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKKwlmYWlscyB0aGUgcmVxdWVzdC4gV2hlbiBzZXR0aW5nIHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2UgcGFzcyBvdXIKKwlBZGFwdGVyIE9iamVjdCBhcyBDb250ZXh0LgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQkJZm91bmQgbWF0Y2hlZCB0dXBsZSBjYWNoZQorCQlGQUxTRQkJCW5vIG1hdGNoZWQgZm91bmQKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1JYCQlcCisJCShmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAlcCisJCSBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8IGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBcCisJCSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKQorCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX0hBTkRMRV9SWAlcCisJCShmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAlcCisJCSBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8IGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBcCisJCSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUykKKworVk9JRAlSVFVTQkJ1bGtSZWNlaXZlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKworCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX0hBTkRMRV9SWCkpCisJCXJldHVybjsKKworCXdoaWxlKDEpCisJeworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleF0pOworCQlpZiAoKChwUnhDb250ZXh0LT5JblVzZSA9PSBGQUxTRSkgJiYgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKSAmJgorCQkJKHBSeENvbnRleHQtPmJSeEhhbmRsaW5nID09IEZBTFNFKSkKKwkJeworCQkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBUUlVFOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQkJLy8gcmVhZCBSeENvbnRleHQsIFNpbmNlIG5vdAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCBUUlVFKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJLy8gRmluaXNoIHRvIGhhbmRsZSB0aGlzIGJ1bGtJbiBidWZmZXIuCisJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCXBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCA9IDA7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKKwkJCXBBZC0+UmVhZFBvc2l0aW9uID0gMDsKKwkJCXBBZC0+VHJhbnNmZXJCdWZmZXJMZW5ndGggPSAwOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1JYKSkpCisJCURvQnVsa0luKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHByb2Nlc3MgUnggSXJwIGFuZCBjYWxsIHJ4IGNvbXBsZXRlIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorCQlEZXZpY2VPYmplY3QJUG9pbnRlciB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgbmV4dCBsb3dlcgorCQkJCQkJZGV2aWNlLiBEZXZpY2VPYmplY3QgcGFzc2VkIGluIGhlcmUgYmVsb25ncyB0bworCQkJCQkJdGhlIG5leHQgbG93ZXIgZHJpdmVyIGluIHRoZSBzdGFjayBiZWNhdXNlIHdlCisJCQkJCQl3ZXJlIGludm9rZWQgdmlhIElvQ2FsbERyaXZlciBpbiBVU0JfUnhQYWNrZXQKKwkJCQkJCUFORCBpdCBpcyBub3QgT1VSIGRldmljZSBvYmplY3QKKwkgIElycAkJCQlQdHIgdG8gY29tcGxldGVkIElSUAorCSAgQ29udGV4dAkJCVB0ciB0byBvdXIgQWRhcHRlciBvYmplY3QgKGNvbnRleHQgc3BlY2lmaWVkCisJCQkJCQlpbiBJb1NldENvbXBsZXRpb25Sb3V0aW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKKworCU5vdGU6CisJCUFsd2F5cyByZXR1cm5zIFNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUVVNCQnVsa1J4Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwkvLyB1c2UgYSByZWNlaXZlIHRhc2tsZXQgdG8gaGFuZGxlIHJlY2VpdmVkIHBhY2tldHM7CisJLy8gb3Igc29tZXRpbWVzIGhhcmR3YXJlIElSUSB3aWxsIGJlIGRpc2FibGVkIGhlcmUsIHNvIHdlIGNhbiBub3QKKwkvLyB1c2Ugc3Bpbl9sb2NrX2JoKCkvc3Bpbl91bmxvY2tfYmgoKSBhZnRlciBJUlEgaXMgZGlzYWJsZWQuIDo8CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUE9TX0NPT0tJRSAJCXBPYmo7CisKKworCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKKwlwT2JqIAkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwT2JqLT5yeF9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKKworfQorCisjZW5kaWYKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JLaWNrQnVsa091dCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBCdWxrSW4gUmVzZXQgd2lsbCByZXNldCB3aG9sZSBVU0IgUEhZLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCBub3QgZmxhZ2VkLgorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkICxmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkKKyNpZmRlZiBSQUxJTktfQVRFCisJCSYmICEoQVRFX09OKHBBZCkpCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkpCisJeworI2lmIDAJLy8gbm90IHVzZWQgbm93IGluIFJUMjh4eCwgYnV0IG1heSB1c2VkIGxhdHRlci4KKwkJLy8gMS4gRGF0YSBGcmFnbWVudCBoYXMgaGlnaGVzdCBwcmlvcml0eQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMCwgcEFkLT5OZXh0QnVsa091dEluZGV4WzBdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMV0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfMykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsyXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR180KSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMywgcEFkLT5OZXh0QnVsa091dEluZGV4WzNdKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLy8gMi4gUFMtUG9sbCBmcmFtZSBpcyBuZXh0CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpKQorCQl7CisJCQlSVFVTQkJ1bGtPdXRQc1BvbGwocEFkKTsKKwkJfQorCisJCS8vIDUuIE1sbWUgZnJhbWUgaXMgbmV4dAorCQllbHNlIGlmICgoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSkpICYmCisJCQkJIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUpKQorCQl7CisJCQlSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KHBBZCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCk7CisJCX0KKworCQkvLyA2LiBEYXRhIGZyYW1lIG5vcm1hbCBpcyBuZXh0CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCkpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFswXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAxLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMV0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMiwgcEFkLT5OZXh0QnVsa091dEluZGV4WzJdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNCkpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFszXSk7CisJCQl9CisJCX0KKworCQkvLyA3LiBOdWxsIGZyYW1lIGlzIHRoZSBsYXN0CisJCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCkpCisJCXsKKwkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXROdWxsRnJhbWUocEFkKTsKKwkJCX0KKwkJfQorCisJCS8vIDguIE5vIGRhdGEgYXZhbGlhYmxlCisJCWVsc2UKKwkJeworCisJCX0KKwl9CisjaWZkZWYgUkFMSU5LX0FURQorCS8qIElmIHRoZSBtb2RlIGlzIGluIEFURSBtb2RlLiAqLworCWVsc2UgaWYoKEFURV9PTihwQWQpKSAmJgorCQkhUlRNUF9URVNUX0ZMQUcocEFkICxmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpLy8gUEVURVIgOiB3YXRjaCBvdXQgIQorCXsKKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKSkKKwkJeworCQkJQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQ2FsbCBmcm9tIFJlc2V0IGFjdGlvbiBhZnRlciBCdWxrT3V0IGZhaWxlZC4KKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJSWR4OworCVBIVF9UWF9DT05URVhUCXBUeENvbnRleHQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+Q2xlYW5VcERhdGFCdWxrT3V0UXVldWVcbiIpKTsKKworCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspCisJeworCQlwVHhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0lkeF07CisKKwkJcFR4Q29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CisJCXBUeENvbnRleHQtPkxhc3RPbmUgPSBGQUxTRTsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tJZHhdKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tJZHhdID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLUNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+Q2xlYW5VcE1MTUVCdWxrT3V0UXVldWVcbiIpKTsKKworI2lmIDAJLy8gRG8gbm90aGluZyEKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisJd2hpbGUgKHBBZC0+UHJpb1JpbmdUeENudCA+IDApCisJeworCQlwQWQtPk1MTUVDb250ZXh0W3BBZC0+UHJpb1JpbmdGaXJzdEluZGV4XS5JblVzZSA9IEZBTFNFOworCisJCXBBZC0+UHJpb1JpbmdGaXJzdEluZGV4Kys7CisJCWlmIChwQWQtPlByaW9SaW5nRmlyc3RJbmRleCA+PSBNR01UX1JJTkdfU0laRSkKKwkJeworCQkJcEFkLT5QcmlvUmluZ0ZpcnN0SW5kZXggPSAwOworCQl9CisKKwkJcEFkLT5QcmlvUmluZ1R4Q250LS07CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKyNlbmRpZgorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLUNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlVSU5UCQkJaTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+UlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CisJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCQlpZihwUnhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwkJCS8vcEFkLT5QZW5kaW5nUngtLTsKKwkJfQorCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPC0tLVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OworCVBUWF9DT05URVhUCQkJcEJlYWNvbkNvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUHNQb2xsQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0OworCVVJTlQJCQkJaSwgSWR4OworLy8JdW5zaWduZWQgaW50IAkJSXJxRmxhZ3M7CisvLwlORElTX1NQSU5fTE9DSwkJKnBMb2NrOworLy8JQk9PTEVBTgkJCQkqcFBlbmRpbmc7CisKKworLy8JcExvY2sgPSAmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF07CisvLwlwUGVuZGluZyA9ICZwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXTsKKworCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspCisJeworCQlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0lkeF0pOworCisJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJeworCisJCQkvLyBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYKKwkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0CisJCQkvLwl3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbgljYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AKKwkJCS8vCisKKwkJCVJUVVNCX1VOTElOS19VUkIocEhUVFhDb250ZXh0LT5wVXJiKTsKKworCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IDA7CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gMDsKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOworCQlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPSAwOworCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCX0KKworCS8vUlRNUF9JUlFfTE9DSyhwTG9jaywgSXJxRmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQorCXsKKwkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQlpZihwTUxNRUNvbnRleHQgJiYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSkKKwkJeworCisJCQkvLyBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYKKwkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0CisJCQkvLwl3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbgljYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AKKwkJCS8vCisKKwkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJCQkvLyBTbGVlcCAyMDAgbWljcm9zZWNzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yaworCQkJUlRNUHVzZWNEZWxheSgyMDApOworCQl9CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJLy9SVE1QX0lSUV9VTkxPQ0socExvY2ssIElycUZsYWdzKTsKKworCisJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCisJCWlmKHBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBCZWFjb25Db250ZXh0LT5wVXJiKTsKKworCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJfQorCX0KKworCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJaWYgKHBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQlSVFVTQl9VTkxJTktfVVJCKHBOdWxsQ29udGV4dC0+cFVyYik7CisKKwlwUlRTQ29udGV4dCA9ICYocEFkLT5SVFNDb250ZXh0KTsKKwlpZiAocFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJUlRVU0JfVU5MSU5LX1VSQihwUlRTQ29udGV4dC0+cFVyYik7CisKKwlwUHNQb2xsQ29udGV4dCA9ICYocEFkLT5Qc1BvbGxDb250ZXh0KTsKKwlpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJUlRVU0JfVU5MSU5LX1VSQihwUHNQb2xsQ29udGV4dC0+cFVyYik7CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tJZHhdKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tJZHhdID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwZDc4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydHVzYl9kYXRhLmMKKworCUFic3RyYWN0OgorCVJhbGluayBVU0IgZHJpdmVyIFR4L1J4IGZ1bmN0aW9ucy4KKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuICAgICAgICAgICAgMDMtMjUtMjAwNiAgICBjcmVhdGVkCisKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK2V4dGVybiAgVUNIQVIgUGh5MTFCR05leHRSYXRlVXB3YXJkW107IC8vIGRlZmluZWQgaW4gbWxtZS5jCitleHRlcm4gVUNIQVIJRXBUb1F1ZXVlW107CisKK1ZPSUQgUkVQT1JUX0FNU0RVX0ZSQU1FU19UT19MTEMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlVSU5UCQkJbk1TRFU7CisJc3RydWN0CQkJc2tfYnVmZiAqcFNrYjsKKworCW5NU0RVID0gMDsKKwkvKiBhbGxvY2F0ZSBhIHJ4IHBhY2tldCAqLworCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRkZFUl9BR0dSRVNJWkUpOworCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKU9TUEtUX1RPX1JUUEtUKHBTa2IpOworCWlmIChwU2tiKQorCXsKKworCQkvKiBjb252ZXJ0IDgwMi4xMSB0byA4MDIuMyBwYWNrZXQgKi8KKwkJcFNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCQlkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBQYWNrZXQsIHBEYXRhLCBEYXRhU2l6ZSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQ2FuJ3QgYWxsb2NhdGUgc2tiXG4iKSk7CisJfQorfQorCitORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpCit7CisvLwlVQ0hBUgkJCUZyZWVOdW1iZXIgPSAwOworLy8JVUlOVAkJCUluZGV4OworCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIE51bWJlclJlcXVpcmVkICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKQorCXsKKworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCWVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkgJiYgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA8IChOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpKSkKKwl7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkZyZWVEIGMzIC0tPiBRdWVJZHg9JWQsIENXUG9zPSVsZCwgTkJPdXRQb3M9JWxkIVxuIiwgQnVsa091dFBpcGVJZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwllbHNlCisJeworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKworCXJldHVybiAoU3RhdHVzKTsKK30KKworTkRJU19TVEFUVVMgUlRVU0JGcmVlRGVzY3JpcHRvclJlbGVhc2UoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVUNIQVIJCUJ1bGtPdXRQaXBlSWQpCit7CisJdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisKK0JPT0xFQU4JUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQoreworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJQk9PTEVBTgkJCW5lZWRRdWVCYWNrID0gRkFMU0U7CisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCWlmICgocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpICAvKiYmIChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPT0gMCkgKi8pCisJeworI2lmIDAKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPD0gOCkgJiYKKwkJCShwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiA4ICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24rTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgTUFYX1RYQlVMS19MSU1JVCkpCisJCXsKKwkJCW5lZWRRdWVCYWNrID0gVFJVRTsKKwkJfQorCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJgorCQkJCSAoKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIE1BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKyNlbHNlCisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCSgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24rTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgTUFYX1RYQlVMS19MSU1JVCkgfHwgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IE1BWF9BR0dSRUdBVElPTl9TSVpFKSkpCisJCXsKKwkJCW5lZWRRdWVCYWNrID0gVFJVRTsKKwkJfQorI2VuZGlmCisJCWVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSAmJgorCQkJCSAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKyBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJcmV0dXJuIG5lZWRRdWVCYWNrOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCQlJbmRleDsKKwlQUVVFVUVfRU5UUlkJcEVudHJ5OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCVBRVUVVRV9IRUFERVIJcFF1ZXVlOworCisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCA0OyBJbmRleCsrKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW0luZGV4XSk7CisJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0uSGVhZCAhPSBOVUxMKQorCQl7CisJCQlwUXVldWUgPSAoUFFVRVVFX0hFQURFUikgJihwQWQtPlR4U3dRdWV1ZVtJbmRleF0pOworCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW0luZGV4XSk7CisKKwl9CisKK30KKworVk9JRCBSVE1QV3JpdGVUeEluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKKwlJTgkgIFVTSE9SVAkJVVNCRE1BcGt0TGVuLAorCUlOCSAgQk9PTEVBTgkJYldpdiwKKwlJTgkgIFVDSEFSCQkJUXVldWVTZWwsCisJSU4JICBVQ0hBUgkJCU5leHRWYWxpZCwKKwlJTgkgIFVDSEFSCQkJVHhCdXJzdCkKK3sKKwlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKKwlwVHhJbmZvLT5RU0VMID0gUXVldWVTZWw7CisJaWYgKFF1ZXVlU2VsICE9IEZJRk9fRURDQSkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gUXVldWVTZWwgIT0gRklGT19FRENBPD09PT09PT09PT09PVxuIikpOworCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSBGQUxTRTsgLy9OZXh0VmFsaWQ7ICAvLyBOZWVkIHRvIGNoZWNrIHdpdGggSmFuIGFib3V0IHRoaXMuCisJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IFR4QnVyc3Q7CisJcFR4SW5mby0+V0lWID0gYldpdjsKKwlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CisJcFR4SW5mby0+cnN2ID0gMDsKKwlwVHhJbmZvLT5yc3YyID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNDQzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMKQEAgLTAsMCArMSwyMDA2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworIAlNb2R1bGUgTmFtZToKKwlydHVzYl9pby5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkgICAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCSAgICBNb2RpZmljYXRpb24gbG9ncworCVBhdWwgTGluICAgIDA2LTI1LTIwMDQgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogTklDIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK05UU1RBVFVTCVJUVVNCRmlybXdhcmVSdW4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4MDEsCisJCTB4OCwKKwkJMCwKKwkJTlVMTCwKKwkJMCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIEZpcm13YXJlIHRvIE5JQy4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJCXBGd0ltYWdlLAorCUlOIFVMT05HCQlGd0xlbikKK3sKKwlVSU5UMzIJCU1hY1JlZzsKKwlOVFNUQVRVUyAJU3RhdHVzOworLy8JVUxPTkcgCQlpOworCVVTSE9SVAkJd3JpdGVMZW47CisKKwlTdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE1BQ19DU1IwLCAmTWFjUmVnKTsKKworCisJd3JpdGVMZW4gPSBGd0xlbjsKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFLCBwRndJbWFnZSwgd3JpdGVMZW4pOworCisJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDE0LCAweGZmZmZmZmZmKTsKKwlTdGF0dXMgPSBSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMWMsIDB4ZmZmZmZmZmYpOworCVN0YXR1cyA9IFJUVVNCRmlybXdhcmVSdW4ocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IEdldCBjdXJyZW50IGZpcm13YXJlIG9wZXJhdGlvbiBtb2RlIChSZXR1cm4gVmFsdWUpCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCTAgb3IgMSA9IERvd25sb2FkZWQgYnkgaG9zdCBkcml2ZXIKKwkJb3RoZXJzID0gRHJpdmVyIGRvZXNuJ3QgZG93bmxvYWQgZmlybXdhcmUKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCRmlybXdhcmVPcG1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDEsCisJCTB4MTEsCisJCTAsCisJCXBWYWx1ZSwKKwkJNCk7CisJcmV0dXJuIFN0YXR1czsKK30KK05UU1RBVFVTCVJUVVNCVmVuZGVyUmVzZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCItLT5SVFVTQlZlbmRlclJlc2V0XG4iKSk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4MDEsCisJCTB4MSwKKwkJMCwKKwkJTlVMTCwKKwkJMCk7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPC0tUlRVU0JWZW5kZXJSZXNldFxuIikpOworCXJldHVybiBTdGF0dXM7Cit9CisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCB2YXJpb3VzIGxlbmd0aCBkYXRhIGZyb20gUlQyNTczCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQk11bHRpUmVhZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCisJCTB4NywKKwkJMCwKKwkJT2Zmc2V0LAorCQlwRGF0YSwKKwkJbGVuZ3RoKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSB2YXJpb3VzIGxlbmd0aCBkYXRhIHRvIFJUMjU3MworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCS8vIFRPRE86IEluIDI4NzAsIHVzZSB0aGlzIGZ1bmNpdG9uIGNhcmVmdWxseSBjYXVzZSBpdCdzIG5vdCBzdGFibGUuCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4NiwKKwkJMCwKKwkJT2Zmc2V0LAorCQlwRGF0YSwKKwkJMSk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCitOVFNUQVRVUwlSVFVTQk11bHRpV3JpdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKworICAgICAgICBVU0hPUlQgICAgICAgICAgaW5kZXggPSAwLFZhbHVlOworICAgICAgICBQVUNIQVIgICAgICAgICAgcFNyYyA9IHBEYXRhOworICAgICAgICBVU0hPUlQgICAgICAgICAgcmVzdWRlID0gMDsKKworICAgICAgICByZXN1ZGUgPSBsZW5ndGggJSAyOworCQlsZW5ndGggICs9IHJlc3VkZTsKKwkJZG8KKwkJeworCQkJVmFsdWUgPShVU0hPUlQpKCAqcFNyYyAgfCAoKihwU3JjICsgMSkgPDwgOCkpOworCQlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCxPZmZzZXQgKyBpbmRleCxWYWx1ZSk7CisgICAgICAgICAgICBpbmRleCArPTI7CisgICAgICAgICAgICBsZW5ndGggLT0gMjsKKyAgICAgICAgICAgIHBTcmMgPSBwU3JjICsgMjsKKyAgICAgICAgfXdoaWxlKGxlbmd0aCA+IDApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCitOVFNUQVRVUyBSVFVTQlNpbmdsZVdyaXRlKAorCUlOIAlSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVVTSE9SVAkJCVZhbHVlKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDIsCisJCVZhbHVlLAorCQlPZmZzZXQsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIDMyLWJpdCBNQUMgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVJTlQzMgkJCXBWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisJVUlOVDMyCQlsb2NhbFZhbDsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKKwkJMHg3LAorCQkwLAorCQlPZmZzZXQsCisJCSZsb2NhbFZhbCwKKwkJNCk7CisKKwkqcFZhbHVlID0gbGUyY3B1MzIobG9jYWxWYWwpOworCisKKwlpZiAoU3RhdHVzIDwgMCkKKwkJKnBWYWx1ZSA9IDB4ZmZmZmZmZmY7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSAzMi1iaXQgTUFDIHJlZ2lzdGVyCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVVJTlQzMgkJCVZhbHVlKQoreworCU5UU1RBVFVTCVN0YXR1czsKKwlVSU5UMzIJCWxvY2FsVmFsOworCisJbG9jYWxWYWwgPSBWYWx1ZTsKKworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQsIChVU0hPUlQpKGxvY2FsVmFsICYgMHhmZmZmKSk7CisJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIDIsIChVU0hPUlQpKChsb2NhbFZhbCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKworI2lmIDEKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIDgtYml0IEJCUCByZWdpc3RlcgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglQVUNIQVIJCQlwVmFsdWUpCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCVVJTlQJCQlpID0gMDsKKwlOVFNUQVRVUwkJc3RhdHVzOworCisJLy8gVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbgorCWRvCisJeworCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOworCQlpZihzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKKwkJCWJyZWFrOworCQl9CisJCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMSk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQkvLworCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgorCQkvLworCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCS8vIFByZXBhcmUgZm9yIHdyaXRlIG1hdGVyaWFsCisJQmJwQ3NyLndvcmQgCQkJCT0gMDsKKwlCYnBDc3IuZmllbGQuZlJlYWQJCQk9IDE7CisJQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKKworCWkgPSAwOworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQl7CisJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQl7CisJCQkqcFZhbHVlID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsKKwkJCWJyZWFrOworCQl9CisJCX0KKwkJcHJpbnRrKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18yKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlpKys7CisJfQorCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCisJaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCS8vCisJCS8vIFJlYWQgZmFpbGVkIHRoZW4gUmV0dXJuIERlZmF1bHQgdmFsdWUuCisJCS8vCisJCSpwVmFsdWUgPSBwQWQtPkJicFdyaXRlTGF0Y2hbSWRdOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorI2Vsc2UKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIDgtYml0IEJCUCByZWdpc3RlciB2aWEgZmlybXdhcmUKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKKwlpbnQJCQkJCWksIGs7CisJZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykKKwl7CisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKKwkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCUJicENzci53b3JkID0gMDsKKwkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsKKwkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsKKwkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOworCQlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CisJCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCisJCXsKKwkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsKKwkJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKQorCQkJCWJyZWFrOworCQl9CisJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYKKwkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IElkKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkJCUCByZWFkIFIlZD0weCV4IGZhaWxcbiIsIElkLCBCYnBDc3Iud29yZCkpOworCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgMQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIDgtYml0IEJCUCByZWdpc3RlcgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JVUNIQVIJCQlWYWx1ZSkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CisJVUlOVAkJCWkgPSAwOworCU5UU1RBVFVTCQlzdGF0dXM7CisJLy8gVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbgorCWRvCisJeworCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOworCQlpZiAoc3RhdHVzID49IDApCisJCXsKKwkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIlJUVVNCV3JpdGVCQlBSZWdpc3RlcihCQlBfQ1NSX0NGRyk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCS8vIFByZXBhcmUgZm9yIHdyaXRlIG1hdGVyaWFsCisJQmJwQ3NyLndvcmQgCQkJCT0gMDsKKwlCYnBDc3IuZmllbGQuZlJlYWQJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLlZhbHVlCQkJPSBWYWx1ZTsKKwlCYnBDc3IuZmllbGQuQnVzeQkJCT0gMTsKKwlCYnBDc3IuZmllbGQuUmVnTnVtIAkJPSBJZDsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOworCisJcEFkLT5CYnBXcml0ZUxhdGNoW0lkXSA9IFZhbHVlOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorI2Vsc2UKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSA4LWJpdCBCQlAgcmVnaXN0ZXIgdmlhIGZpcm13YXJlCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK05UU1RBVFVTCVJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpCisKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CisJaW50CQkJCQlCdXN5Q250OworCWZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQorCQkJY29udGludWU7CisJCUJicENzci53b3JkID0gMDsKKwkJQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsKKwkJQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsKKwkJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOworCQlCYnBDc3IuZmllbGQuVmFsdWUgPSBWYWx1ZTsKKwkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MCwgMHhmZiwgMHgwLCAweDApOworCQlwQWQtPkJicFdyaXRlTGF0Y2hbSWRdID0gVmFsdWU7CisJCWJyZWFrOworCX0KKwlpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsXG4iLCBJZCwgQmJwQ3NyLndvcmQpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJGIHJlZ2lzdGVyIHRocm91Z2ggTUFDCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQldyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UMzIJCQlWYWx1ZSkKK3sKKwlQSFlfQ1NSNF9TVFJVQwlQaHlDc3I0OworCVVJTlQJCQlpID0gMDsKKwlOVFNUQVRVUwkJc3RhdHVzOworCisJTmRpc1plcm9NZW1vcnkoJlBoeUNzcjQsIHNpemVvZihQSFlfQ1NSNF9TVFJVQykpOworCWRvCisJeworCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcwLCAmUGh5Q3NyNC53b3JkKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQl7CisJCWlmICghKFBoeUNzcjQuZmllbGQuQnVzeSkpCisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIlJUVVNCV3JpdGVSRlJlZ2lzdGVyKFJGX0NTUl9DRkcwKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlpKys7CisJfQorCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCisJaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRzAsIFZhbHVlKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzA3MCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JVUNIQVIJCQlWYWx1ZSkKK3sKKwlSRl9DU1JfQ0ZHX1NUUlVDCXJmY3NyOworCVVJTlQJCQkJaSA9IDA7CisKKwlkbworCXsKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7CisKKwkJaWYgKCFyZmNzci5maWVsZC5SRl9DU1JfS0lDSykKKwkJCWJyZWFrOworCQlpKys7CisJfQorCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCisJaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKKwkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CisJfQorCisJcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKKwlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSBSZWdJRDsKKwlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IFZhbHVlOworCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBSZWFkIFJUMzA3MCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlSZWdJRCwKKwlJTglQVUNIQVIJCQlwVmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKKwlVSU5UCQkJCWk9MCwgazsKKworCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCisJeworCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJcmZjc3Iud29yZCA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDA7CisJCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKKwkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSBSZWdJRDsKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7CisJCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCisJCXsKKwkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpICYmCisJCQkocmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPT0gUmVnSUQpKQorCQl7CisJCQkqcFZhbHVlID0gKFVDSEFSKXJmY3NyLmZpZWxkLlJGX0NTUl9EQVRBOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCisJeworCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWxcbiIsIFJlZ0lELCByZmNzci53b3JkKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCisJCTB4OSwKKwkJMCwKKwkJT2Zmc2V0LAorCQlwRGF0YSwKKwkJbGVuZ3RoKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKQoreworCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4OCwKKwkJMCwKKwkJT2Zmc2V0LAorCQlwRGF0YSwKKwkJbGVuZ3RoKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQlB1dFRvU2xlZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUlOVDMyCQl2YWx1ZTsKKworCS8vIFRpbWVvdXQgMHg0MCB4IDUwdXMKKwl2YWx1ZSA9IChTTEVFUENJRDw8MTYpKyhPV05FUk1DVTw8MjQpKyAoMHg0MDw8OCkrMTsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMTAsIHZhbHVlKTsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDQwNCwgMHgzMCk7CisJLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiU2xlZXAgTWFpbGJveCB0ZXN0dmFsdWUgJXhcbiIsIHZhbHVlKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyBSVFVTQldha2VVcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJMHgwMSwKKwkJMHgwOSwKKwkJMCwKKwkJTlVMTCwKKwkJMCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JJbml0aWFsaXplQ21kUSgKKwlJTglQQ21kUQljbWRxKQoreworCWNtZHEtPmhlYWQgPSBOVUxMOworCWNtZHEtPnRhaWwgPSBOVUxMOworCWNtZHEtPnNpemUgPSAwOworCWNtZHEtPkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU5ESVNfT0lECQlPaWQsCisJSU4JQk9PTEVBTgkJCVNldEluZm9ybWF0aW9uLAorCUlOCVBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAorCUlOCVVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKQoreworCU5ESVNfU1RBVFVTCXN0YXR1czsKKwlQQ21kUUVsbXQJY21kcWVsbXQgPSBOVUxMOworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPlJUVVNCQ21kVGhyX3BpZCkKKwkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCisJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisKKwkJY21kcWVsbXQtPmJ1ZmZlciA9IE5VTEw7CisJCWlmIChwSW5mb3JtYXRpb25CdWZmZXIgIT0gTlVMTCkKKwkJeworCQkJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdC0+YnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAoY21kcWVsbXQtPmJ1ZmZlciA9PSBOVUxMKSkKKwkJCXsKKwkJCQlrZnJlZShjbWRxZWxtdCk7CisJCQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkJCX0KKwkJfQorCQllbHNlCisJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKKworCWNtZHFlbG10LT5jb21tYW5kID0gT2lkOworCWNtZHFlbG10LT5DbWRGcm9tTmRpcyA9IFRSVUU7CisJaWYgKFNldEluZm9ybWF0aW9uID09IFRSVUUpCisJCWNtZHFlbG10LT5TZXRPcGVyYXRpb24gPSBUUlVFOworCWVsc2UKKwkJY21kcWVsbXQtPlNldE9wZXJhdGlvbiA9IEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVDI4NzBfVEhSRUFEX0NBTl9ET19JTlNFUlQpCisJeworCQlFbnF1ZXVlQ21kKCgmcEFkLT5DbWRRKSwgY21kcWVsbXQpOworCQlzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwllbHNlCisJeworCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKKwl7CisJCWlmIChjbWRxZWxtdC0+YnVmZmVyKQorCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwl9CisJZWxzZQorCVJUVVNCQ01EVXAocEFkKTsKKworCisgICAgcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE5ESVNfT0lECQkJT2lkLAorCUlOIFBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAorCUlOIFVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKQoreworCU5ESVNfU1RBVFVTCXN0YXR1czsKKwlQQ21kUUVsbXQJY21kcWVsbXQgPSBOVUxMOworCisKKwlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpKTsKKwlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAoY21kcWVsbXQgPT0gTlVMTCkpCisJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwlOZGlzWmVyb01lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisKKwlpZihJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IDApCisJeworCQlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LT5idWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCisJCXsKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOworCQl9CisJfQorCWVsc2UKKwl7CisJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOworCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gMDsKKwl9CisKKwljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKKwljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBGQUxTRTsKKworCWlmIChjbWRxZWxtdCAhPSBOVUxMKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUKQorCQl7CisJCQlFbnF1ZXVlQ21kKCgmcEFkLT5DbWRRKSwgY21kcWVsbXQpOworCQkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwkJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKQorCQl7CisJCQlpZiAoY21kcWVsbXQtPmJ1ZmZlcikKKwkJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBjbWRxZWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwkJfQorCQllbHNlCisJCVJUVVNCQ01EVXAocEFkKTsKKwl9CisJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JEZXF1ZXVlQ21kKAorCUlOCVBDbWRRCQljbWRxLAorCU9VVAlQQ21kUUVsbXQJKnBjbWRxZWxtdCkKK3sKKwkqcGNtZHFlbG10ID0gY21kcS0+aGVhZDsKKworCWlmICgqcGNtZHFlbG10ICE9IE5VTEwpCisJeworCQljbWRxLT5oZWFkID0gY21kcS0+aGVhZC0+bmV4dDsKKwkJY21kcS0+c2l6ZS0tOworCQlpZiAoY21kcS0+c2l6ZSA9PSAwKQorCQkJY21kcS0+dGFpbCA9IE5VTEw7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgdXNiX2NvbnRyb2xfbXNnIC0gQnVpbGRzIGEgY29udHJvbCB1cmIsIHNlbmRzIGl0IG9mZiBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24KKwkgIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHVzYiBkZXZpY2UgdG8gc2VuZCB0aGUgbWVzc2FnZSB0bworCSAgQHBpcGU6IGVuZHBvaW50ICJwaXBlIiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvCisJICBAcmVxdWVzdDogVVNCIG1lc3NhZ2UgcmVxdWVzdCB2YWx1ZQorCSAgQHJlcXVlc3R0eXBlOiBVU0IgbWVzc2FnZSByZXF1ZXN0IHR5cGUgdmFsdWUKKwkgIEB2YWx1ZTogVVNCIG1lc3NhZ2UgdmFsdWUKKwkgIEBpbmRleDogVVNCIG1lc3NhZ2UgaW5kZXggdmFsdWUKKwkgIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHNlbmQKKwkgIEBzaXplOiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdG8gc2VuZAorCSAgQHRpbWVvdXQ6IHRpbWUgaW4gamlmZmllcyB0byB3YWl0IGZvciB0aGUgbWVzc2FnZSB0byBjb21wbGV0ZSBiZWZvcmUKKwkJCSAgdGltaW5nIG91dCAoaWYgMCB0aGUgd2FpdCBpcyBmb3JldmVyKQorCSAgQ29udGV4dDogIWluX2ludGVycnVwdCAoKQorCisJICBUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc2ltcGxlIGNvbnRyb2wgbWVzc2FnZSB0byBhIHNwZWNpZmllZCBlbmRwb2ludAorCSAgYW5kIHdhaXRzIGZvciB0aGUgbWVzc2FnZSB0byBjb21wbGV0ZSwgb3IgdGltZW91dC4KKwkgIElmIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgorCisJIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGZyb20gd2l0aGluIGFuIGludGVycnVwdCBjb250ZXh0LCBsaWtlIGEKKwkgIGJvdHRvbSBoYWxmIGhhbmRsZXIuCUlmIHlvdSBuZWVkIGFuIGFzeW5jaHJvbm91cyBtZXNzYWdlLCBvciBuZWVkIHRvIHNlbmQKKwkgIGEgbWVzc2FnZSBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQgY29udGV4dCwgdXNlIHVzYl9zdWJtaXRfdXJiKCkKKwkgIElmIGEgdGhyZWFkIGluIHlvdXIgZHJpdmVyIHVzZXMgdGhpcyBjYWxsLCBtYWtlIHN1cmUgeW91ciBkaXNjb25uZWN0KCkKKwkgIG1ldGhvZCBjYW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBTaW5jZSB5b3UgZG9uJ3QgaGF2ZSBhIGhhbmRsZSBvbgorCSAgdGhlIFVSQiB1c2VkLCB5b3UgY2FuJ3QgY2FuY2VsIHRoZSByZXF1ZXN0LgorCisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTICAgIFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKKwlJTglVQ0hBUgkJCVJlcXVlc3RUeXBlLAorCUlOCVVDSEFSCQkJUmVxdWVzdCwKKwlJTglVU0hPUlQJCQlWYWx1ZSwKKwlJTglVU0hPUlQJCQlJbmRleCwKKwlJTglQVk9JRAkJCVRyYW5zZmVyQnVmZmVyLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoKQoreworCWludAkJCQlyZXQ7CisJUE9TX0NPT0tJRQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJkZXZpY2UgZGlzY29ubmVjdGVkXG4iKSk7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoaW5faW50ZXJydXB0KCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJpbl9pbnRlcnJ1cHQsIFJUVVNCX1ZlbmRvclJlcXVlc3QgUmVxdWVzdCUwMnggVmFsdWUlMDR4IE9mZnNldCUwNHhcbiIsUmVxdWVzdCxWYWx1ZSxJbmRleCkpOworCisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKyNkZWZpbmUgTUFYX1JFVFJZX0NPVU5UICAxMAorCisJCWludCByZXRyeUNvdW50ID0gMDsKKwkJdm9pZAkqdG1wQnVmID0gVHJhbnNmZXJCdWZmZXI7CisKKwkJLy8gQWNxdWlyZSBDb250cm9sIHRva2VuCisjaWZkZWYgSU5GX0FNQVpPTl9TRQorCQkvL1NlbWFwaG9yZSBmaXggSU5GX0FNQVpPTl9TRSBoYW5nCisJCS8vcEFkLT5Vc2JWZW5kb3JSZXFCdWYgaXMgdGhlIHN3YXAgZm9yIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiB0byBmaXggZG1hIGJ1Zy4KKwkJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5Vc2JWZW5kb3JSZXFfc2VtYXBob3JlKSk7CisJCWlmIChwQWQtPlVzYlZlbmRvclJlcUJ1ZikKKwkJeworCQkJQVNTRVJUKFRyYW5zZmVyQnVmZmVyTGVuZ3RoIDxNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJCSAgIAl0bXBCdWYgPSAodm9pZCAqKXBBZC0+VXNiVmVuZG9yUmVxQnVmOworCQkgICAJTmRpc1plcm9NZW1vcnkocEFkLT5Vc2JWZW5kb3JSZXFCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworCQkgICAJaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCisJCSAgIAkgTmRpc01vdmVNZW1vcnkodG1wQnVmLCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCQl9CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCQlkbyB7CisJCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3NuZGN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCisJCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2JfcmN2Y3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgdG1wQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOworCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInZlbmRvciByZXF1ZXN0IGRpcmVjdGlvbiBpcyBmYWlsZWRcbiIpKTsKKwkJCXJldCA9IC0xOworCQl9CisKKwkJCXJldHJ5Q291bnQrKzsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRrKCIjXG4iKTsKKwkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJfQorCQl9IHdoaWxlKChyZXQgPCAwKSAmJiAocmV0cnlDb3VudCA8IE1BWF9SRVRSWV9DT1VOVCkpOworCisjaWZkZWYgSU5GX0FNQVpPTl9TRQorCSAgCWlmICgocEFkLT5Vc2JWZW5kb3JSZXFCdWYpICYmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pKQorCQkJTmRpc01vdmVNZW1vcnkoVHJhbnNmZXJCdWZmZXIsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCSAgCXVwKCYocEFkLT5Vc2JWZW5kb3JSZXFfc2VtYXBob3JlKSk7CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisvLwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlVTQlZlbmRvclJlcXVlc3QgZmFpbGVkIHJldD0lZCBcbiIscmV0KSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQl9WZW5kb3JSZXF1ZXN0IGZhaWxlZCglZCksVHhGbGFncz0weCV4LCBSZXFUeXBlPSVzLCBSZXE9MHgleCwgSW5kZXg9MHgleFxuIiwKKwkJCQkJCXJldCwgVHJhbnNmZXJGbGFncywgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgPyAiT1VUIiA6ICJJTiIpLCBSZXF1ZXN0LCBJbmRleCkpOworCQkJaWYgKFJlcXVlc3QgPT0gMHgyKQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlx0UmVxdWVzdCBWYWx1ZT0weCUwNHghXG4iLCBWYWx1ZSkpOworCisJCQlpZiAoKFRyYW5zZmVyQnVmZmVyIT0gTlVMTCkgJiYgKFRyYW5zZmVyQnVmZmVyTGVuZ3RoID4gMCkpCisJCQkJaGV4X2R1bXAoIkZhaWxlZCBUcmFuc2ZlckJ1ZmZlciB2YWx1ZSIsIFRyYW5zZmVyQnVmZmVyLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgLy8gcmV0cnkKKwkJaWYgKHJldCA8IDApIHsKKwkJCWludCB0ZW1wX2k9MDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlVTQlZlbmRvclJlcXVlc3QgZmFpbGVkIHJldD0lZCwgXG4iLHJldCkpOworCQkJcmV0ID0gMDsKKwkJCWRvCisJCQl7CisJCQkJaWYoIFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCisJCQkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9zbmRjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCQllbHNlIGlmKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTikKKwkJCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3JjdmN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIFRyYW5zZmVyQnVmZmVyLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOworCQkJCXRlbXBfaSsrOworCQkJfSB3aGlsZSggKHJldCA8IDApICYmICh0ZW1wX2kgPD0gMSkgKTsKKworCQkJaWYoIHJldCA+PSAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJfQorI2VuZGlmCisKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJICBDcmVhdGVzIGFuIElSUCB0byBzdWJtaXRlIGFuIElPQ1RMX0lOVEVSTkFMX1VTQl9SRVNFVF9QT1JUCisJICBzeW5jaHJvbm91c2x5LiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBydW5uaW5nIGF0CisJICBQQVNTSVZFIExFVkVMLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCX1Jlc2V0RGV2aWNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCQlTdGF0dXMgPSBUUlVFOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5VU0JfUmVzZXREZXZpY2VcbiIpKTsKKwkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCitWT0lEIENNREhhbmRsZXIoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUENtZFFFbG10CQljbWRxZWxtdDsKKwlQVUNIQVIJCQlwRGF0YTsKKwlORElTX1NUQVRVUwkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisvLwlVTE9ORwkJCU5vdyA9IDA7CisJTlRTVEFUVVMJCW50U3RhdHVzOworLy8JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCXdoaWxlIChwQWQtPkNtZFEuc2l6ZSA+IDApCisJeworCQlOZGlzU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJUlRVU0JEZXF1ZXVlQ21kKCZwQWQtPkNtZFEsICZjbWRxZWxtdCk7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJCWlmIChjbWRxZWxtdCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcERhdGEgPSBjbWRxZWxtdC0+YnVmZmVyOworCisJCWlmKCEoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCXsKKwkJCXN3aXRjaCAoY21kcWVsbXQtPmNvbW1hbmQpCisJCQl7CisJCQkJY2FzZSBDTURUSFJFQURfQ0hFQ0tfR1BJTzoKKwkJCQkJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJVUlOVDMyIGRhdGE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZkZWYgUkFMSU5LX0FURQorICAgICAgIAkJCQkJaWYoQVRFX09OKHBBZCkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKworCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKCBwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKworCQkJCQkJCWlmIChkYXRhICYgMHgwNCkKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gVFJVRTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZihwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisJCQkJCQkJCWlmKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorCQkJCQkJCQl7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiISEhIFJhZGlvIE9uICEhIVxuIikpOworCisJCQkJCQkJCQlNbG1lUmFkaW9PbihwQWQpOworCQkJCQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiISEhIFJhZGlvIE9mZiAhISFcbiIpKTsKKworCQkJCQkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7CisJCQkJCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gSFdfUkFESU9fT0ZGOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJY2FzZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVDoKKwkJCQkJeworCQkJCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyhOVUxMLCBwQWQsIE5VTEwsIE5VTEwpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6CisJCQkJCXsKKwkJCQkJCVVJTlQzMgkJTUFDVmFsdWU7CisJCQkJCQlVQ0hBUgkJSW5kZXg7CisJCQkJCQlpbnQJCQlyZXQ9MDsKKwkJCQkJCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKKy8vCQkJCQkJUlRNUF9UWF9SSU5HICpwVHhSaW5nOworCQkJCQkJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUKFJlc2V0UGlwZWlkPTB4JTB4KT09PT5cbiIsIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkvLyBBbGwgdHJhbnNmZXJzIG11c3QgYmUgYWJvcnRlZCBvciBjYW5jZWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIHBpcGUuCisJCQkJCQkvL1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCQkJCS8vIFdhaXQgMTBtcyB0byBsZXQgcHJldmlvdXMgcGFja2V0IHRoYXQgYXJlIGFscmVhZHkgaW4gSFcgRklGTyB0byBjbGVhci4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCUluZGV4ID0gMDsKKwkJCQkJCWRvCisJCQkJCQl7CisJCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGYwMDAwMC8qMHg4MDAwMDAqLykgPT0gMCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJSW5kZXgrKzsKKwkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKwkJCQkJCX13aGlsZShJbmRleCA8IDEwMCk7CisJCQkJCQlNQUNWYWx1ZSA9IDA7CisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOworCQkJCQkJLy8gVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAybmQgY2hlY2sgdGhlIHZhbGlkaXR5LgorCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7CisJCQkJCQkvLyBUbyBwcmV2ZW50IFJlYWQgUmVnaXN0ZXIgZXJyb3IsIHdlIDNyZCBjaGVjayB0aGUgdmFsaWRpdHkuCisJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhjMDAwMDApID09IDApCisJCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCQkJCU1BQ1ZhbHVlIHw9IDB4ODAwMDA7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgTUFDVmFsdWUpOworCisJCQkJCQkvLyBXYWl0IDFtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNworCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCQkJCQkJTUFDVmFsdWUgJj0gKH4weDgwMDAwKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBNQUNWYWx1ZSk7CisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRTZXQgMHgyYTAgYml0MTkuIENsZWFyIFVTQiBETUEgVFggcGF0aFxuIikpOworCisJCQkJCQkvLyBXYWl0IDVtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgYmVmb3JlIEhXIHJlc2V0LiBieSBNQVhMRUUgMTItMjUtMjAwNworCQkJCQkJLy9SVE1QdXNlY0RlbGF5KDUwMDApOworCisJCQkJCQlpZiAoKHBBZC0+YnVsa1Jlc2V0UGlwZWlkICYgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKQorCQkJCQkJeworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQkJCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPCBNR01UX1JJTkdfU0laRSAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKQorCQkJCQkJCXsKKwkJCQkJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCQkJCQl9CisJCQkJCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0VFggTUdNVCBSRUNPVkVSIERvbmUhXG4iKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtwQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCS8vTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCVJUTVBfSU5UX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisJCQkJCQkJaWYgKCBwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9PSBGQUxTRSkKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gVFJVRTsKKwkJCQkJCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJCQkJCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtwQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSAxOworCisJCQkJCQkJCS8vIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZworCQkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQkJCWlmKEFURV9PTihwQWQpKQorCQkJCQkJCSAgICB7CisJCQkJCQkJCQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCQkJLy8KKwkJCQkJCQkJCS8vIElmIGRyaXZlciBpcyBzdGlsbCBpbiBBVEUgVFhGUkFNRSBtb2RlLAorCQkJCQkJCQkJLy8ga2VlcCBvbiB0cmFuc21pdHRpbmcgQVRFIGZyYW1lcy4KKwkJCQkJCQkJCS8vCisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5hdGUuTW9kZSA9PSAlZFxucEFkLT5Db250aW5CdWxrT3V0ID09ICVkXG5wQWQtPkJ1bGtPdXRSZW1haW5lZCA9PSAlZFxuIiwgcEFkLT5hdGUuTW9kZSwgcEFkLT5Db250aW5CdWxrT3V0LCBhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpKSk7CisJCQkJCQkJCQlpZigocEFkLT5hdGUuTW9kZSA9PSBBVEVfVFhGUkFNRSkgJiYgKChwQWQtPkNvbnRpbkJ1bGtPdXQgPT0gVFJVRSkgfHwgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKSkpCisJCQkJCQkJCSAgICB7CisJCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFmdGVyIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgY29udGludWUgdG8gYnVsayBvdXQgZnJhbWVzICFcbiIpKTsKKworCQkJCQkJCQkJCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJCQkJCQkJCQkJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCAwLyogcEFkLT5idWxrUmVzZXRQaXBlaWQgKi8sICh1c2JfY29tcGxldGVfdClBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKworCQkJCQkJCQkJCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBOdWxsQ29udGV4dC0+cFVyYikpIT0wKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQlwQWQtPkJ1bGtPdXRSZXErKzsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJCQkJCXsKKwkJCQkJCQkJUlRVU0JJbml0SFRUeERlc2MocEFkLCBwSFRUWENvbnRleHQsIHBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKworCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwSFRUWENvbnRleHQtPnBVcmIpKSE9MCkKKwkJCQkJCQkJeworCQkJCQkJCQkJCVJUTVBfSU5UX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IEZBTFNFOworCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQkJCQkJCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtwQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSAwOworCQkJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKwkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogVHhDb250ZXh0WyVkXTpDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIHBlbmRpbmc9JWQhXG4iLAorCQkJCQkJCQkJCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCQkJCQkJCQkJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIHBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdKSk7CisJCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRcdEJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsCisJCQkJCQkJCQkJCQkJCQlwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDogU3VibWl0IFR4IERBVEEgVVJCIGZvciBmYWlsZWQgQnVsa1JlcSgweCVseCkgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcEFkLT5idWxrUmVzZXRSZXFbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBwSFRUWENvbnRleHQtPnBVcmItPnN0YXR1cykpOworCisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7CisJCQkJCQkJCS8vUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBUWCBEQVRBIFJFQ09WRVIgRkFJTCBmb3IgQnVsa1JlcSgweCVseCkgYmVjYXVzZSBCdWxrT3V0UGVuZGluZ1slZF0gaXMgVFJVRSFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKKwkJCQkJCQkJaWYgKHBBZC0+YnVsa1Jlc2V0UGlwZWlkID09IDApCisJCQkJCQkJCXsKKwkJCQkJCQkJCVVDSEFSCXBlbmRpbmdDb250ZXh0ID0gMDsKKwkJCQkJCQkJCVBIVF9UWF9DT05URVhUIHBIVFRYQ29udGV4dCA9IChQSFRfVFhfQ09OVEVYVCkoJnBBZC0+VHhDb250ZXh0W3BBZC0+YnVsa1Jlc2V0UGlwZWlkIF0pOworCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKShwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeERtYUlkeF0uQWxsb2NWYSk7CisJCQkJCQkJCQlQVFhfQ09OVEVYVCBwTlVMTENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPlBzUG9sbENvbnRleHQpOworCQkJCQkJCQkJUFRYX0NPTlRFWFQgcFBzUG9sbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPk51bGxDb250ZXh0KTsKKworCQkJCQkJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAxOworCQkJCQkJCQkJZWxzZSBpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDI7CisJCQkJCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gNDsKKwkJCQkJCQkJCWVsc2UgaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDg7CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgPSAwOworCisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiXHRUWCBPY2N1cGllZCBieSAlZCFcbiIsIHBlbmRpbmdDb250ZXh0KSk7CisJCQkJCQkJCX0KKworCQkJCQkJCS8vIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisKKwkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCisJCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkJfQorCisJCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCQkJCQkvL1JUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCS8qCisJCQkJCQkvLyBEb24ndCBjYW5jZWwgQlVMS0lOLgorCQkJCQkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYKKwkJCQkJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJeworCQkJCQkJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchIWNhbmNlbCBpdCFcbiIpKTsKKwkJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJfQorCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID09IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKKwkJCQkJCXsKKwkJCQkJCQlVQ0hBUglpOworCQkJCQkJCVJUVVNCUnhQYWNrZXQocEFkKTsKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAorCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gMDsJLy8gUnggQnVsayBwb2ludGVyCisJCQkJCQkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCQkJCQkJeworCQkJCQkJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCQkJCQkJCXBSeENvbnRleHQtPnBBZAk9IHBBZDsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUJPSBGQUxTRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+UmVvcmRlckluVXNlID0gRkFMU0U7CisKKwkJCQkJCQl9CisJCQkJCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtSZWNlaXZlXG4iKSk7CisJCQkJCQl9Ki8KKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVDw9PT1cbiIpKTsKKyAgICAJICAgCQkJYnJlYWs7CisKKwkJCQljYXNlIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOgorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gPT09ID5cbiIpKTsKKworCQkJCQkvLyBBbGwgdHJhbnNmZXJzIG11c3QgYmUgYWJvcnRlZCBvciBjYW5jZWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIHBpcGUuCisJCQkJCXsKKwkJCQkJCVVJTlQzMgkJTUFDVmFsdWU7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZCkpCisJCQkJCQl7CisJCQkJCQkJaWYoKHBBZC0+UGVuZGluZ1J4ID4gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJCXsKKwkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkFURSA6IEJ1bGtJbiBJUlAgUGVuZGluZyEhIVxuIikpOworCQkJCQkJCQlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJCQkJCQkJcEFkLT5QZW5kaW5nUnggPSAwOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCQkJCXsKKwkJCQkJCS8vd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJaWYoKHBBZC0+UGVuZGluZ1J4ID4gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrSW4gSVJQIFBlbmRpbmchISFcbiIpKTsKKwkJCQkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKwkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQkJcEFkLT5QZW5kaW5nUnggPSAwOworCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBXYWl0IDEwbXMgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuCisJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKwkJCQkJCW50U3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1BQ1ZhbHVlKTsKKworCQkJCQkJaWYgKChOVF9TVUNDRVNTKG50U3RhdHVzKSA9PSBUUlVFKSAmJgorCQkJCQkJCSghKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSkKKwkJCQkJCXsKKwkJCQkJCQlVQ0hBUglpOworCisJCQkJCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gcEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0uQnVsa0luT2Zmc2V0OworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJVTEtfSU5fUkVTRVQ6IE5CSUlkeD0weCV4LE5CSVJJZHg9MHgleCwgQklSUG9zPTB4JWx4LiBCSVJlcT14JWx4LCBCSUNvbXBsZXRlPTB4JWx4LCBCSUNGYWlsMHglbHhcbiIsCisJCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24sIHBBZC0+QnVsa0luUmVxLCBwQWQtPkJ1bGtJbkNvbXBsZXRlLCBwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCkpOworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCQkJCQl7CisgCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdFJ4Q29udGV4dFslZF06IElSUFBlbmRpbmc9JWQsIEluVXNlPSVkLCBSZWFkYWJsZT0lZCFcbiIKKwkJCQkJCQkJCSwgaSwgcEFkLT5SeENvbnRleHRbaV0uSVJQUGVuZGluZywgcEFkLT5SeENvbnRleHRbaV0uSW5Vc2UsIHBBZC0+UnhDb250ZXh0W2ldLlJlYWRhYmxlKSk7CisJCQkJCQkJfQorIAkJCQkJCQkvKgorCisJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikpOworCisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDA7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkJCQkJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCQkJCQkJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCisJCQkJCQkJfSovCisJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQkJLy9SVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCQkJCQkJCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCQkJCQkJCQlQVVJCCQkJcFVyYjsKKwkJCQkJCQkJaW50CQkJCXJldCA9IDA7CisJCQkJCQkJCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKworCQkJCQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0pOworCQkJCQkJCQlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCXBSeENvbnRleHQtPkluVXNlID0gVFJVRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCXBBZC0+UGVuZGluZ1J4Kys7CisJCQkJCQkJCXBBZC0+QnVsa0luUmVxKys7CisJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJCQkJCQkJLy8gSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IKKwkJCQkJCQkJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CisJCQkJCQkJCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOworCQkJCQkJCQlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCQkJCQkJCQl7CS8vIGZhaWwKKworCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJCQkJCQkJcEFkLT5QZW5kaW5nUngtLTsKKwkJCQkJCQkJCXBBZC0+QnVsa0luUmVxLS07CisJCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgZmFpbGVkKCVkKSwgc3RhdHVzPSVkXG4iLCByZXQsIHBVcmItPnN0YXR1cykpOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJewkvLyBzdWNjZXNzCisjaWYgMAorCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJCQkJCQkJCS8vTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJCXBBZC0+QnVsa0luUmVxKys7CisjZW5kaWYKKwkJCQkJCQkJCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogU3VibWl0IFJ4IFVSQiBEb25lLCBzdGF0dXM9JWQhXG4iLCBwVXJiLT5zdGF0dXMpKTsKKwkJCQkJCQkJCUFTU0VSVCgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gcFJ4Q29udGV4dC0+SVJQUGVuZGluZykpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gQ2FyZCBtdXN0IGJlIHJlbW92ZWQKKwkJCQkJCQlpZiAoTlRfU1VDQ0VTUyhudFN0YXR1cykgIT0gVFJVRSkKKwkJCQkJCQl7CisJCQkJCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogUmVhZCBSZWdpc3RlciBGYWlsZWQhQ2FyZCBtdXN0IGJlIHJlbW92ZWQhIVxuXG4iKSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogQ2Fubm90IGRvIGJ1bGsgaW4gYmVjYXVzZSBmbGFncygweCVseCkgb24gIVxuIiwgcEFkLT5GbGFncykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCX0KKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOIDw9PT1cbiIpKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEOgorCQkJCQl7CisJCQkJCQlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOworCQkJCQkJVVNIT1JUCQlvZmZzZXQ7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlLCBNQUNSVmFsdWUgPSAwOworCQkJCQkJU2V0QXNpY1djaWQgPSAqKChQUlRfU0VUX0FTSUNfV0NJRCkocERhdGEpKTsKKworCQkJCQkJaWYgKFNldEFzaWNXY2lkLldDSUQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCQkJCQkJcmV0dXJuOworCisJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZC5XQ0lEKSpIV19XQ0lEX0VOVFJZX1NJWkU7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCA6IFdDSUQgPSAlbGQsIFNldFRpZCAgPSAlbHgsIERlbGV0ZVRpZCA9ICVseC5cbiIsIFNldEFzaWNXY2lkLldDSUQsIFNldEFzaWNXY2lkLlNldFRpZCwgU2V0QXNpY1djaWQuRGVsZXRlVGlkKSk7CisJCQkJCQlNQUNWYWx1ZSA9IChwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbM108PDI0KSsocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzJdPDwxNikrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclsxXTw8OCkrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclswXSk7CisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMS1NQUNWYWx1ZT0gJXgsXG4iLCBNQUNWYWx1ZSkpOworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNWYWx1ZSk7CisJCQkJCQkvLyBSZWFkIGJpdG1hc2sKKwkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0KzQsICZNQUNSVmFsdWUpOworCQkJCQkJaWYgKCBTZXRBc2ljV2NpZC5EZWxldGVUaWQgIT0gMHhmZmZmZmZmZikKKwkJCQkJCQlNQUNSVmFsdWUgJj0gKH5TZXRBc2ljV2NpZC5EZWxldGVUaWQpOworCQkJCQkJaWYgKFNldEFzaWNXY2lkLlNldFRpZCAhPSAweGZmZmZmZmZmKQorCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoU2V0QXNpY1djaWQuU2V0VGlkKTsKKwkJCQkJCU1BQ1JWYWx1ZSAmPSAweGZmZmYwMDAwOworCisJCQkJCQlNQUNWYWx1ZSA9IChwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbNV08PDgpK3BBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkcls0XTsKKwkJCQkJCU1BQ1ZhbHVlIHw9IE1BQ1JWYWx1ZTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCs0LCBNQUNWYWx1ZSk7CisKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLU1BQ1ZhbHVlPSAleCxcbiIsIE1BQ1ZhbHVlKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUjoKKwkJCQkJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJUlRfU0VUX0FTSUNfV0NJRF9BVFRSSQlTZXRBc2ljV2NpZEF0dHJpOworCQkJCQkJVVNIT1JUCQlvZmZzZXQ7CisJCQkJCQlVSU5UMzIJCU1BQ1JWYWx1ZSA9IDA7CisJCQkJCQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCQkJCQkJU2V0QXNpY1djaWRBdHRyaSA9ICooKFBSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJKShwRGF0YSkpOworCisJCQkJCQlpZiAoU2V0QXNpY1djaWRBdHRyaS5XQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQkJCQkJCXJldHVybjsKKworCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuV0NJRCkqSFdfV0NJRF9BVFRSSV9TSVpFOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSIDogV0NJRCA9ICVsZCwgQ2lwaGVyID0gJWx4LlxuIiwgU2V0QXNpY1djaWRBdHRyaS5XQ0lELCBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikpOworCQkJCQkJLy8gUmVhZCBiaXRtYXNrCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJk1BQ1JWYWx1ZSk7CisJCQkJCQlNQUNSVmFsdWUgPSAwOworCQkJCQkJTUFDUlZhbHVlIHw9ICgoKFVDSEFSKVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSA8PCAxKTsKKworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjItb2Zmc2V0ID0gJXggLCBNQUNWYWx1ZT0gJXgsXG4iLCBvZmZzZXQsIE1BQ1JWYWx1ZSkpOworCisJCQkJCQlvZmZzZXQgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLldDSUQpKkhXX0lWRUlWX0VOVFJZX1NJWkU7CisJCQkJCQlNQUNSVmFsdWUgPSAwOworCQkJCQkJaWYgKCAoU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPD0gQ0lQSEVSX1dFUDEyOCkpCisJCQkJCQkJTUFDUlZhbHVlIHw9ICggcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKDB4MjAwMDAwMDApOworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjItb2Zmc2V0ID0gJXggLCBNQUNWYWx1ZT0gJXgsXG4iLCBvZmZzZXQsIE1BQ1JWYWx1ZSkpOworCisJCQkJCQkvLworCQkJCQkJLy8gVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwCisJCQkJCQkvLworCQkJCQkJLy8gZm9yIGFkaG9jIG1vZGUgb25seSAsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICkKKwkJCQkJCXsKKwkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRTsKKworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAmTUFDUlZhbHVlKTsKKwkJCQkJCQlNQUNSVmFsdWUgJj0gKH4weGUpOworCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikgPDwgMSk7CisKKwkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7CisKKwkJCQkJCQkvL1VwZGF0ZSBncm91cCBrZXkgY2lwaGVyLCxiZWNhdXNlIHdlcCBzdGF0dXMgc2xvdyB0aGFuIGFkZCBrZXksIHdoZW4gdXNlIHplcm8gY29uZmlnCisJCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KigwLzIpLCAmY3NyMS53b3JkKTsKKworCQkJCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcjsKKwkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisKKwkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KigwLzIpLCBjc3IxLndvcmQpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJLy8gYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5CisJCQkJY2FzZSBSVF9DTURfU0VUX0tFWV9UQUJMRTogLy9HZW5lcmFsIGNhbGwgZm9yIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KCkKKwkJCQkJeworCQkJCQkJUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSBLZXlJbmZvOworCQkJCQkJS2V5SW5mbyAgPSAqKChQUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSkocERhdGEpKTsKKwkJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkJCUtleUluZm8uTWFjQWRkciwKKwkJCQkJCQkJCQkJCShVQ0hBUilLZXlJbmZvLk1hY1RhYk1hdGNoV0NJRCwKKwkJCQkJCQkJCQkJCSZLZXlJbmZvLkNpcGhlcktleSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRTogLy9HZW5lcmFsIGNhbGwgZm9yIFJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoKQorCQkJCQl7CisJCQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA7CisJCQkJCQlwRW50cnkgPSAoUE1BQ19UQUJMRV9FTlRSWSkocERhdGEpOworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkJCQkJQlNTMCwKKwkJCQkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJCQkJCQkJCXBFbnRyeSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQljYXNlIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWToKKwkJCQkJeworCQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCQlwRW50cnkgPSAoTUFDX1RBQkxFX0VOVFJZICopcERhdGE7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIHBFbnRyeS0+YXBpZHgsIChVQ0hBUilwRW50cnktPkFpZCk7CisJCQkJCQkJaWYgKChwRW50cnktPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSkKKwkJCQkJCQl7CisJCQkJCQkJCVVJTlQzMiB1SVYgPSAwOworCQkJCQkJCQlQVUNIQVIgIHB0cjsKKworCQkJCQkJCQlwdHIgPSAoUFVDSEFSKSAmdUlWOworCQkJCQkJCQkqKHB0ciArIDMpID0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCA2KTsKKwkJCQkJCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIHBFbnRyeS0+QWlkLCB1SVYsIDApOworCQkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIHBFbnRyeS0+QWlkLCBCU1MwLCBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywgRkFMU0UpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQkJCQkJeworCQkJCQkJCQlVSU5UMzIgdUlWID0gMDsKKwkJCQkJCQkJUFVDSEFSICBwdHI7CisKKwkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKKwkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKKwkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJLy8KKwkJCQkJCQkJLy8gT3RoZXIgY2FzZSwgZGlzYWJsZSBlbmdpbmUuCisJCQkJCQkJCS8vIERvbid0IHdvcnJ5IFdQQSBrZXksIHdlIHdpbGwgYWRkIFdQQSBLZXkgYWZ0ZXIgNC1XYXkgaGFuZHNoYWtpbmcuCisJCQkJCQkJCS8vCisJCQkJCQkJCVVTSE9SVCAgIG9mZnNldDsKKwkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAocEVudHJ5LT5BaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCQkJCQkJCQkvLyBSWF9QS0VZX01PREU6MCBmb3Igbm8gc2VjdXJpdHk7IFJYX0tFWV9UQUI6MCBmb3Igc2hhcmVkIGtleSB0YWJsZTsgQlNTX0lEWDowCisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgMCk7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKKwkJCQkJCXByaW50aygiVXBkYXRlUnhXQ0lEVGFibGUoKTogQWlkPSVkLCBBZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IVxuIiwgcEVudHJ5LT5BaWQsCisJCQkJCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sIHBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVVJTlQJaTsKKwkJCQkJCVVJTlQzMglLZXlJZHg7CisJCQkJCQlQTkRJU184MDJfMTFfV0VQCXBXZXBLZXk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQICBcbiIpKTsKKworCQkJCQkJcFdlcEtleSA9IChQTkRJU184MDJfMTFfV0VQKXBEYXRhOworCQkJCQkJS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCQkJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCQkJCWlmICgoS2V5SWR4ID49IDQpIHx8ICgocFdlcEtleS0+S2V5TGVuZ3RoICE9IDUpICYmIChwV2VwS2V5LT5LZXlMZW5ndGggIT0gMTMpKSkKKwkJCQkJCXsKKwkJCQkJCQlOZGlzU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQLCBJTlZBTElEX0RBVEEhIVxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVVDSEFSIENpcGhlckFsZzsKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisJCQkJCQkJQ2lwaGVyQWxnID0gKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDUpPyBDSVBIRVJfV0VQNjQgOiBDSVBIRVJfV0VQMTI4OworCisJCQkJCQkJLy8KKwkJCQkJCQkvLyBDaGFuZ2UgdGhlIFdFUCBjaXBoZXIgdG8gQ0tJUCBjaXBoZXIgaWYgQ0tJUCBLUCBvbi4KKwkJCQkJCQkvLyBGdW5rIFVJIG9yIE1lZXRpbmdob3VzZSBVSSB3aWxsIGFkZCBja2lwIGtleSBmcm9tIHRoaXMgcGF0aC4KKwkJCQkJCQkvLworCisJCQkJCQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQkJCQkgCXsKKwkJCQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJCQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXlMZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbjsKKwkJCQkJCSAJfQorCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJCWlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJCQkJeworCQkJCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCQkJCVVDSEFSCUlWRUlWWzhdOworCQkJCQkJCQlVSU5UMzIJV0NJREF0dHJpLCBWYWx1ZTsKKwkJCQkJCQkJVVNIT1JUCW9mZnNldCwgb2Zmc2V0MjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOworCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQkJCQkJLy8gQWRkIEJTU0lEIHRvIFdDVGFibGUuIGJlY2F1c2UgdGhpcyBpcyBUeCB3ZXAga2V5LgorCQkJCQkJCQkvLyBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZToxPVBBSVJXSVNFIEtFWSwgQlNTSWR4IGlzIDAKKwkJCQkJCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisKKwkJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTSURfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCQkJCQkJCQkvLyAxLiBJVi9FSVYKKwkJCQkJCQkJLy8gU3BlY2lmeSBrZXkgaW5kZXggdG8gZmluZCBzaGFyZWQga2V5LgorCQkJCQkJCQlJVkVJVlszXSA9IChVQ0hBUikoS2V5SWR4PDwgNik7CS8vV0VQIEVpdiBiaXQgb2ZmLiBncm91cGtleSBpbmRleCBpcyBub3QgMAorCQkJCQkJCQlvZmZzZXQgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKEJTUzBNY2FzdF9XQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisJCQkJCQkJCW9mZnNldDIgPSBQQUlSV0lTRV9JVkVJVl9UQUJMRV9CQVNFICsgKEJTU0lEX1dDSUQqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCQlmb3IgKGk9MDsgaTw4OykKKwkJCQkJCQkJeworCQkJCQkJCQkJVmFsdWUgPSBJVkVJVltpXTsKKwkJCQkJCQkJCVZhbHVlICs9IChJVkVJVltpKzFdPDw4KTsKKwkJCQkJCQkJCVZhbHVlICs9IChJVkVJVltpKzJdPDwxNik7CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSszXTw8MjQpOworCQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKKwkJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldDIraSwgVmFsdWUpOworCQkJCQkJCQkJaSs9NDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCS8vIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwCisJCQkJCQkJCVdDSURBdHRyaSA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEJTUzBNY2FzdF9XQ0lEKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCQkJCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQlNTME1jYXN0X1dDSUQgOiBvZmZzZXQgPSAleCwgV0NJREF0dHJpID0gJXhcbiIsIG9mZnNldCwgV0NJREF0dHJpKSk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCQkJCQkJCX0KKwkJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4LCBDaXBoZXJBbGcsIHBXZXBLZXktPktleU1hdGVyaWFsLCBOVUxMLCBOVUxMKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoS2V5SWR4PSVkLCBMZW49JWQtYnl0ZSlcbiIsIEtleUlkeCwgcFdlcEtleS0+S2V5TGVuZ3RoKSk7CisJCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gQ29udHJvbCBUaHJlYWQgISEgRVJST1IgISEgVW5rbm93bihjbWRxZWxtdC0+Y29tbWFuZD0weCV4KSAhISBcbiIsIGNtZHFlbG10LT5jb21tYW5kKSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGNtZHFlbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKQorCQl7CisJCQkJaWYgKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKKwkJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgoY21kcWVsbXQtPmJ1ZmZlciAhPSBOVUxMKSAmJiAoY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBjbWRxZWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKyAgICAgICAgICAgIHsKKwkJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQl9CisJCX0KKwl9CS8qIGVuZCBvZiB3aGlsZSAqLworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9zcGVjdHJ1bS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJhODQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYwpAQCAtMCwwICsxLDE4NzYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRm9uY2hpIFd1ICAgIDIwMDgJICAJICAgY3JlYXRlZCBmb3IgODAyLjExaAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLCBzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSk7CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzRnJlZVNwaW5Mb2NrKHBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpOworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxTG9va1VwKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJVUlOVCBIYXNoSWR4OworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisKKwlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKKwkJCWJyZWFrOworCQllbHNlCisJCXsKKwkJCXBQcmV2RW50cnkgPSBwRW50cnk7CisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCQl9CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFJbnNlcnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlJTlQgaTsKKwlVTE9ORyBIYXNoSWR4OworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OworCVVMT05HIE5vdzsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKKworCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCisJCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQorCQkJeworCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJCWRvCisJCQkJeworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCQl7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQkJeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKKwkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOworCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOworCQkJcFRhYi0+U2l6ZSsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5ID0gTlVMTDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGlmIGVtcHR5LCByZXR1cm4KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicE1lYXN1cmVSZXFUYWIgZW1wdHkuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgIT0gTlVMTCkKKwl7CisJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCWRvCisJCXsKKwkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQl7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7CisJCXBUYWItPlNpemUtLTsKKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0ga21hbGxvYyhzaXplb2YoVFBDX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiwgc2l6ZW9mKFRQQ19SRVFfVEFCKSk7CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYi5cbiIsIF9fRlVOQ1RJT05fXykpOworCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQorCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJeworCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCitzdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFOyBpKyspCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKKworCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCisJCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBUUENfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJCWRvCisJCQkJeworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCQl7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQkJeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7CisJCQkJcFRhYi0+U2l6ZS0tOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChwRW50cnktPlZhbGlkID09IEZBTFNFKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSAhPSBOVUxMKQorCXsKKwkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCWRvCisJCXsKKwkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQl7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJcFRhYi0+U2l6ZS0tOworCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRpbWVTIHRhbXAuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ2NCBHZXRDdXJyZW50VGltZVN0YW1wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCisJcmV0dXJuIDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQ4IFdjaWQpCit7CisJcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgRGlhbG9nIFRva2VuIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIERpYWxvZyB0b2tlbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0RGlhbG9nVG9rZW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggRGlhbG9nVG9rZW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAorCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgVFBDIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gMDsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gVHJhbnNtaXQgUG93ZXIuCisJCTQuIExpbmsgTWFyZ2luLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVwb3J0SUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihUUENfUkVQT1JUX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVBPUlQ7CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcG9ydElFOworCisJVHBjUmVwb3J0SUUuVHhQd3IgPSBUeFB3cjsKKwlUcGNSZXBvcnRJRS5MaW5rTWFyZ2luID0gTGlua01hcmdpbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJJlRwY1JlcG9ydElFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJNC4gbmV3IHNlbGVjdGVkIGNoYW5uZWwuCisJCTUuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBjb3VudC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0Q2hTd0FubklFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoYW5uZWwsCisJSU4gVUlOVDggQ2hTd0NudCkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihDSF9TV19BTk5fSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JRTsKKworCUNoU3dBbm5JRS5DaFN3TW9kZSA9IENoU3dNb2RlOworCUNoU3dBbm5JRS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwlDaFN3QW5uSUUuQ2hTd0NudCA9IENoU3dDbnQ7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJJkNoU3dBbm5JRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBNZWFzdXJlIENoYW5uZWwuCisJCTcuIE1lYXN1cmUgU3RhcnQgdGltZS4KKwkJOC4gTWVhc3VyZSBEdXJhdGlvbi4KKworCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVxSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVJTlQ4IExlbiA9IHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcUlFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBNZWFzdXJlIFRva2VuLgorCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KKwkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCisJCTYuIExlbmd0aCBvZiBSZXBvcnQgSW5mb21hdGlvbgorCQk3LiBQb2ludGVyIG9mIFJlcG9ydCBJbmZvbWF0aW9uIEJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCisJSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW47CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCisJTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pICsgUmVwb3J0TG5mb0xlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiArICpwRnJhbWVMZW4sCQkmVGVtcExlbiwKKwkJCQkJCQlSZXBvcnRMbmZvTGVuLAkJCQlwUmVwb3J0SW5mbywKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IE1lYXN1cmVDaCwKKwlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOworCVVJTlQ4IFJtUmVxRGFpbG9nVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJRKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBNZWFzdXJlVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcUlFLCBzaXplb2YoTUVBU1VSRV9SRVFfSU5GTykpOworCU1lYXN1cmVSZXFJRS5Ub2tlbiA9IFJtUmVxRGFpbG9nVG9rZW47CisJTWVhc3VyZVJlcUlFLlJlcU1vZGUud29yZCA9IE1lYXN1cmVSZXFNb2RlOworCU1lYXN1cmVSZXFJRS5SZXFUeXBlID0gTWVhc3VyZVJlcVR5cGU7CisJTWVhc3VyZVJlcUlFLk1lYXN1cmVSZXEuQ2hOdW0gPSBNZWFzdXJlQ2g7CisJTWVhc3VyZVJlcUlFLk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IGNwdTJsZTY0KE1lYXN1cmVTdGFydFRpbWUpOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IGNwdTJsZTE2KE1lYXN1cmVEdXJhdGlvbik7CisJSW5zZXJ0TWVhc3VyZVJlcUlFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgJk1lYXN1cmVSZXFJRSk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJTUVBU1VSRV9SRVBPUlRfSU5GTyBNZWFzdXJlUmVwSUU7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgorCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwSUUsIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTWVhc3VyZVJlcElFLlRva2VuID0gTWVhc3VyZVRva2VuOworCU1lYXN1cmVSZXBJRS5SZXBvcnRNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKKworCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwlJbnNlcnRUcGNSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlApOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKKworCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwlJbnNlcnRUcGNSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOworCisJSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBDaGFubmVsKQoreworCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7CisJSU5UIGk7CisKKwlkbworCXsKKwkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgorCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkJeworCQkJUmVzdWx0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgorCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCXsKKwkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQorCQkJeworCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYworCQkJCVJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmICghKChwUkFbMF0gJiAweGZmKSA9PSAweGZmKSkgLy8gaXMgcFJBIGEgYnJvYWRjYXNlIGFkZHJlc3MuCisJeworCQlJTlQgaTsKKwkJLy8gaW5mbyBuZWlnaGJvciBBUHMgdGhhdCBSYWRhciBzaWduYWwgZm91bmQgdGhyb2doIFdEUyBsaW5rLgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1dEU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAoVmFsaWRXZHNFbnRyeShwQWQsIGkpKQorCQkJeworCQkJCVBVQ0hBUiBwREEgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtpXS5QZWVyV2RzQWRkcjsKKworCQkJCS8vIERBIGVxdWFsIHRvIFNBLiBoYXZlIG5vIG5lY2Vzc2FyeSBvcmlnbmFsIEFQIHdoaWNoIGZvdW5kIFJhZGFyIHNpZ25hbC4KKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocFRBLCBwREEpKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIHNlbmQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIGZyYW1lIHRvIGluZm8gTmVpZ2hicm8gQVBzLgorCQkJCUVucXVldWVDaFN3QW5uKHBBZCwgcERBLCBDaFN3TW9kZSwgQ2hhbm5lbCk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KK30KKworc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBVSU5UOCBDaFN3TW9kZSkKK3sKKwkvLyBzdGFydCBERlMgcHJvY2VkdXJlCisJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTl9DaGFubmVsQ2hlY2socEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TV0lUQ0hJTkdfTU9ERTsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaW5mb21hdGlvbiBidWZmZXIuCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8Q2ggU3cgTW9kZSB8IE5ldyBDaCBOdW0gfCBDaCBTdyBDbnQgfAorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgICAgMSAgICAxICAgICAgICAxICAgICAgICAgICAxICAgICAgICAgICAgMQorKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQQ0hfU1dfQU5OX0lORk8gcENoU3dBbm5JbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwQ2hTd0FubkluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaGFubmVsLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgorCisJUGFyYW1ldHJzOgorCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJMi4gbWVzc2FnZSBsZW5ndGguCisJCTMuIE1lYXN1cmVtZW50IHJlcXVlc3QgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwTWVhc3VyZVJlcUluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKwlwRnJhbWVQdHIgKz0gMTsKKwlNc2dMZW4gLT0gMTsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxTW9kZS53b3JkLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuQ2hOdW0sIHB0ciwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKKworCQkJCXJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisJCTQuIGJhc2ljIHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBNZWFzdXJlbWVudCBSZXBvcnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICB8IElEIHwgTGVuIHwgVG9rZW4gfCBSZXBvcnQgTW9kZSB8IE1lYXN1cmUgVHlwZSB8IE1lYXN1cmUgUmVwb3J0IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgMSAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICAgICAxICAgICAgICAgICAgdmFyaWFibGUKKworICBCYXNpYyBSZXBvcnQuCisgICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKKyAgfCBDaCBOdW0gfCBTdGFydCBUaW1lIHwgRHVyYXRpb24gfCBNYXAgfAorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgICAgICAxICAgICAgICAgIDggICAgICAgICAgIDIgICAgICAgIDEKKworICBNYXAgRmllbGQgQml0IEZvcm1hdC4KKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgfCBCc3MgfCBPRkRNIFByZWFtYmxlIHwgVW5pZGVudGlmaWVkIHNpZ25hbCB8IFJhZGFyIHwgVW5tZWFzdXJlZCB8IFJlc2VydmVkIHwKKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03CisqLworc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKKwlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXBvcnRJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQkJeworCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DQ0FfQnVzeV9GcmFjdGlvbiwgcHRyICsgMTEsIDEpOworCisJCQkJfQorCQkJCWVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9SUElfSElTVE9HUkFNKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfUlBJX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX1JQSV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisJCTQuIFRQQyBSZXBvcnQgSUUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlckNoU3dBbm5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSIGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOworCVVMT05HIEJzc2lkeCA9IDA7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOworCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbioqKipCc3NpZHggaXMgJWQsIENoYW5uZWwgPSAlZFxuIiwgaW5kZXgsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwpKTsKKwkJaGV4X2R1bXAoIlNTSUQiLHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkICw2KTsKKworCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87CisJTUVBU1VSRV9SRVBPUlRfTU9ERSBSZXBvcnRNb2RlOworCisJaWYoUGVlck1lYXN1cmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcUluZm8pKQorCXsKKwkJUmVwb3J0TW9kZS53b3JkID0gMDsKKwkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOworCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcG9ydEluZm87CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJVUlOVDggRGlhbG9nVG9rZW47CisJUFVJTlQ4IHBNZWFzdXJlUmVwb3J0SW5mbzsKKworLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCisvLwkJcmV0dXJuOworCisJaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSk7CisJaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXBvcnRJbmZvLCBwTWVhc3VyZVJlcG9ydEluZm8pKQorCXsKKwkJZG8geworCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCisJCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KKwkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKKwkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQorCQkJCWJyZWFrOworCisJCQlpZiAocEVudHJ5ICE9IE5VTEwpCisJCQkJTWVhc3VyZVJlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCisJCQlpZiAoTWVhc3VyZVJlcG9ydEluZm8uUmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKKwkJCXsKKwkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcEJhc2ljUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwTWVhc3VyZVJlcG9ydEluZm87CisJCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKKwkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOworCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgTWVhc3VyZW1lbnQgUmVwb3J0IEZyYW1lLlxuIikpOworCisJa2ZyZWUocE1lYXN1cmVSZXBvcnRJbmZvKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlVSU5UOCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7CisJVUlOVDggTGlua01hcmdpbiA9IDA7CisJQ0hBUiBSZWFsUnNzaTsKKworCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQorCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgorCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgorCisJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisJLy8gc2tpcCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisKKwkvLyBEaWFsb2cgdG9rZW4uCisJTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCisJTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKKwlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQorCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlUUENfUkVQT1JUX0lORk8gVHBjUmVwSW5mbzsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKKwlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKKwl7CisJCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQorCQl7CisJCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwgVHBjUmVwSW5mby5MaW5rTWFyZ2luKSk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU3BlY3RydW4gYWN0aW9uIGZyYW1lcyBIYW5kbGVyIHN1Y2ggYXMgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQsCisJCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorCQlyZXR1cm47CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBTUEVDX01SUToKKwkJCS8vIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuCisJCQkvLyByZWplY3QgYWxsIG1lYXN1cmVtZW50IHJlcXVlc3QuCisJCQlQZWVyTWVhc3VyZVJlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX01SUDoKKwkJCVBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUNfVFBDUlE6CisJCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUNfVFBDUlA6CisJCQlQZWVyVHBjUmVwQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6Cit7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY29uZGFyeTsKKwkJCQlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNoYW5uZWxTd2l0Y2g7CisKKwkJCQkvLyA4MDIuMTFoIG9ubHkgaGFzIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBJRS4KKwkJCQlSVE1QTW92ZU1lbW9yeSgmQ2hhbm5lbFN3aXRjaCwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzRdLCBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpKTsKKworCQkJCS8vIDgwMi4xMW4gRDMuMDMgYWRkcyBzZWNvbmRhcnkgY2hhbm5lbCBvZmZzZXQgZWxlbWVudCBpbiB0aGUgZW5kLgorCQkJCWlmIChFbGVtLT5Nc2dMZW4gPT0gIChMRU5HVEhfODAyXzExICsgMiArIHNpemVvZiAoQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSkgKyBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSkpCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmU2Vjb25kYXJ5LCAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErOV0sIHNpemVvZiAoU0VDX0NIQV9PRkZTRVRfSUUpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQgPSAwOworCQkJCX0KKworCQkJCWlmICgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UKSAmJiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErM10gPT0gMykpCisJCQkJeworCQkJCQlDaGFubmVsU3dpdGNoQWN0aW9uKHBBZCwgRWxlbS0+V2NpZCwgQ2hhbm5lbFN3aXRjaC5OZXdDaGFubmVsLCBTZWNvbmRhcnkuU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KK30KKwkJCVBlZXJDaFN3QW5uQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQgQWlkID0gMTsKKwlVSU5UIEFyZ0lkeDsKKwlQVUNIQVIgdGhpc0NoYXI7CisKKwlNRUFTVVJFX1JFUV9NT0RFIE1lYXN1cmVSZXFNb2RlOworCVVJTlQ4IE1lYXN1cmVSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKwlVSU5UOCBNZWFzdXJlUmVxVHlwZSA9IFJNX0JBU0lDOworCVVJTlQ4IE1lYXN1cmVDaCA9IDE7CisKKwlBcmdJZHggPSAxOworCXdoaWxlICgodGhpc0NoYXIgPSBzdHJzZXAoKGNoYXIgKiopJmFyZywgIi0iKSkgIT0gTlVMTCkKKwl7CisJCXN3aXRjaChBcmdJZHgpCisJCXsKKwkJCWNhc2UgMToJLy8gQWlkLgorCQkJCUFpZCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOiAvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IFR5cGUuCisJCQkJTWVhc3VyZVJlcVR5cGUgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIE1lYXN1cmVSZXFUeXBlKSk7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvLyBNZWFzdXJlbWVudCBjaGFubmVsLgorCQkJCU1lYXN1cmVDaCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlicmVhazsKKwkJfQorCQlBcmdJZHgrKzsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19GVU5DVElPTl9fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJCXJldHVybiBUUlVFOworCX0KKworCU1lYXN1cmVSZXFNb2RlLndvcmQgPSAwOworCU1lYXN1cmVSZXFNb2RlLmZpZWxkLkVuYWJsZSA9IDE7CisKKwlNZWFzdXJlUmVxSW5zZXJ0KHBBZCwgTWVhc3VyZVJlcVRva2VuKTsKKworCUVucXVldWVNZWFzdXJlbWVudFJlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLAorCQlNZWFzdXJlUmVxVG9rZW4sIE1lYXN1cmVSZXFNb2RlLndvcmQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gsIDIwMDApOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfVHBjUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQgQWlkOworCisJVUlOVDggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisKKwlBaWQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJVHBjUmVxSW5zZXJ0KHBBZCwgVHBjUmVxVG9rZW4pOworCisJRW5xdWV1ZVRQQ1JlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLCBUcGNSZXFUb2tlbik7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9kZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGZzLmgKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNkZWZpbmUgUkFEQVJfUFVMU0UgMQorI2RlZmluZSBSQURBUl9XSURUSCAyCisKKyNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCisjZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKKworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAorCUlOIFVJTlQ4IENUU1BlcmlvZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQ2gpOworCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBQcmVwYXJlUkRDVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JVUxPTkcJCQlEdXJhdGlvbiwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCisJSU4gIFVMT05HICAgICAgICAgICBDVFNCYXNlQWRkciwKKwlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7CisKK1ZPSUQgUlRNUFByZXBhcmVSYWRhckRldGVjdFBhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2xlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE4YzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbGVhcC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfX0xFQVBfSF9fCisjZGVmaW5lIF9fTEVBUF9IX18KKworLy8gTWVzc2FnZXMgZm9yIEFzc29jaWF0ZSBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIExFQVBfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgICAgIDMwCisKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9JREVOVElUWSAgICAgICAgICAgMzEKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9MRUFQICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTEVBUF9NU0dfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgTEVBUF9NU0dfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgTEVBUF9NU0dfUkVTUE9OU0VfTEVBUCAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTEVBUF9NU0dfRUFQT0xLRVkgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTEVBUF9NU0dfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTEVBUF9NU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKKy8vISBhc3NvYyBzdGF0ZS1tYWNoaW5lIHN0YXRlcworI2RlZmluZSBMRUFQX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExFQVBfV0FJVF9JREVOVElUWV9SRVFVRVNUICAgICAgICAgIDEKKyNkZWZpbmUgTEVBUF9XQUlUX0NIQU5MTEVOR0VfUkVRVUVTVCAgICAgICAgMgorI2RlZmluZSBMRUFQX1dBSVRfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFU1BPTlNFICAgICAgIDQKKyNkZWZpbmUgTEVBUF9XQUlUX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIExFQVBfUkVBU09OX0lOVkFMSURfQVVUSCAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEVBUF9SRUFTT05fQ0hBTExFTkdFX0ZST01fQVBfRkFJTEVEICAgICAgICAweDAzCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9UT19BUF9GQUlMRUQgICAgICAgICAgMHgwNAorCisjZGVmaW5lIENJU0NPX0F1dGhNb2RlTEVBUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVBOb25lICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTEVBUF9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwMAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVNQT05TRV9MRU5HVEggICAgICAgICAgICAgIDI0CisjZGVmaW5lIExFQVBfQ0hBTExFTkdFX1JFUVVFU1RfTEVOR1RIICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBPTF9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBWZXJzaW9uOworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworfSBMRUFQX0VBUE9MX0hFQURFUiwgKlBMRUFQX0VBUE9MX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfUEFDS0VUXyB7CisgICAgVUNIQVIgICAgICAgQ29kZTsKKyAgICBVQ0hBUiAgICAgICBJZGVudGlmaWVyOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworfSBMRUFQX0VBUE9MX1BBQ0tFVCwgKlBMRUFQX0VBUE9MX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQX0NPTlRFTlRTXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBSZXNlcnZlZDsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGg7Cit9IExFQVBfRUFQX0NPTlRFTlRTLCAqUExFQVBfRUFQX0NPTlRFTlRTOworCisvKioqIEVBUE9MIGtleSAqKiovCit0eXBlZGVmIHN0cnVjdCBfRUFQT0xfS0VZX0hFQURFUl8geworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworICAgIFVDSEFSICAgICAgIENvdW50ZXJbOF07CisgICAgVUNIQVIgICAgICAgSVZbMTZdOworICAgIFVDSEFSICAgICAgIEluZGV4OworICAgIFVDSEFSICAgICAgIFNpZ25hdHVyZVsxNl07Cit9IEVBUE9MX0tFWV9IRUFERVIsICpQRUFQT0xfS0VZX0hFQURFUjsKKworQk9PTEVBTiBMZWFwTXNnVHlwZVN1YnN0KAorICAgIElOICBVQ0hBUiAgIEVBUFR5cGUsCisgICAgT1VUIFVMT05HICAgKk1zZ1R5cGUpOworCitWT0lEIExlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICAgICpTLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBNYWNIZWFkZXJJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgT1VUIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgd2VwLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBBZGRyMyk7CisKK1ZPSUQgTGVhcFN0YXJ0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBJZGVudGl0eUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwUGVlckNoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYXNoUHdkKAorICAgIElOICBQVUNIQVIgIHB3ZCwKKyAgICBJTiAgSU5UICAgICBwd2RsZW4sCisgICAgT1VUIFBVQ0hBUiAgaGFzaCk7CisKK1ZPSUQgUGVlckNoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOICBQVUNIQVIgIHN6Q2hhbGxlbmdlLAorICAgIElOICBQVUNIQVIgIHNtYlBhc3N3ZCwKKyAgICBPVVQgUFVDSEFSICBzelJlc3BvbnNlKTsKKworVk9JRCBQYXJpdHlLZXkoCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQsCisgICAgSU4gIFBVQ0hBUiAgc3pJbik7CisKK1ZPSUQgRGVzS2V5KAorICAgIE9VVCBVTE9ORyAgIGtbMTZdWzJdLAorICAgIElOICBQVUNIQVIgIGtleSwKKyAgICBJTiAgSU5UICAgICBkZWNyeXB0KTsKKworVk9JRCBEZXMoCisgICAgSU4gIFVMT05HICAga3NbMTZdWzJdLAorICAgIE9VVCBVQ0hBUiAgIGJsb2NrWzhdKTsKKworVk9JRCBEZXNFbmNyeXB0KAorICAgIElOICBQVUNIQVIgIHN6Q2xlYXIsCisgICAgSU4gIFBVQ0hBUiAgc3pLZXksCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQpOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2UoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaHB3ZEhhc2goCisgICAgSU4gIFBVQ0hBUiAgaGFzaCwKKyAgICBJTiAgUFVDSEFSICBoYXNoaGFzaCk7CisKK1ZPSUQgUHJvY2Vzc1Nlc3Npb25LZXkoCisgICAgT1VUIFBVQ0hBUiAgU2Vzc2lvbktleSwKKyAgICBJTiAgUFVDSEFSICBoYXNoMiwKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VUb1JhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlRnJvbVJhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZVRvUmFkaXVzKTsKKworVk9JRCBMZWFwRWFwb2xLZXlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlSW5pdCgKKyAgICBJTiBST0dVRUFQX1RBQkxFICAgICpUYWIpOworCitVTE9ORyBSb2d1ZUFwVGFibGVTZWFyY2goCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIpOworCitWT0lEIFJvZ3VlQXBFbnRyeVNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUk9HVUVBUF9FTlRSWSAgICpwUm9ndWVBcCwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgICAgRmFpbGVDb2RlKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2V0RW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfVEFCTEUgICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlRGVsZXRlRW50cnkoCisgICAgSU4gT1VUIFJPR1VFQVBfVEFCTEUgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgcEFkZHIpOworCitWT0lEIExlYXBBdXRoVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExlYXBTZW5kUm9ndWVBUFJlcG9ydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gQ0NLTUFzc29jUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFZPSUQgICAgICAgICAgICAgKk1zZywKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIE1zZ0xlbik7CisKKyNlbmRpZiAgLy8gX19MRUFQX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MjExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19MSU5LX0xJU1RfSF9fCisjZGVmaW5lIF9fTElOS19MSVNUX0hfXworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWQoreworCXN0cnVjdCBfTElTVF9FTlRSWSAqcE5leHQ7Cit9IExJU1RfRU5UUlksICpQTElTVF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfSEVBRFIKK3sKKwlQTElTVF9FTlRSWSBwSGVhZDsKKwlQTElTVF9FTlRSWSBwVGFpbDsKKwlVQ0hBUiBzaXplOworfSBMSVNUX0hFQURFUiwgKlBMSVNUX0hFQURFUjsKKworc3RhdGljIGlubGluZSBWT0lEIGluaXRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlwTGlzdC0+cEhlYWQgPSBwTGlzdC0+cFRhaWwgPSBOVUxMOworCXBMaXN0LT5zaXplID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbnNlcnRUYWlsTGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCXBFbnRyeS0+cE5leHQgPSBOVUxMOworCWlmIChwTGlzdC0+cFRhaWwpCisJCXBMaXN0LT5wVGFpbC0+cE5leHQgPSBwRW50cnk7CisJZWxzZQorCQlwTGlzdC0+cEhlYWQgPSBwRW50cnk7CisJcExpc3QtPnBUYWlsID0gcEVudHJ5OworCXBMaXN0LT5zaXplKys7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgcmVtb3ZlSGVhZExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCVBMSVNUX0VOVFJZIHBOZXh0OworCVBMSVNUX0VOVFJZIHBFbnRyeTsKKworCXBFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlpZiAocExpc3QtPnBIZWFkICE9IE5VTEwpCisJeworCQlwTmV4dCA9IHBMaXN0LT5wSGVhZC0+cE5leHQ7CisJCXBMaXN0LT5wSGVhZCA9IHBOZXh0OworCQlpZiAocE5leHQgPT0gTlVMTCkKKwkJCXBMaXN0LT5wVGFpbCA9IE5VTEw7CisJCXBMaXN0LT5zaXplLS07CisJfQorCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldExpc3RTaXplKAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlyZXR1cm4gcExpc3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgZGVsRW50cnlMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKKwlJTiBQTElTVF9FTlRSWSBwRW50cnkpCit7CisJUExJU1RfRU5UUlkgcEN1ckVudHJ5OworCVBMSVNUX0VOVFJZIHBQcnZFbnRyeTsKKworCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmKHBFbnRyeSA9PSBwTGlzdC0+cEhlYWQpCisJeworCQlwQ3VyRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJCXBMaXN0LT5wSGVhZCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJaWYocExpc3QtPnBIZWFkID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCisJCXBMaXN0LT5zaXplLS07CisJCXJldHVybiBwQ3VyRW50cnk7CisJfQorCisJcFBydkVudHJ5ID0gcExpc3QtPnBIZWFkOworCXBDdXJFbnRyeSA9IHBQcnZFbnRyeS0+cE5leHQ7CisJd2hpbGUocEN1ckVudHJ5ICE9IE5VTEwpCisJeworCQlpZiAocEVudHJ5ID09IHBDdXJFbnRyeSkKKwkJeworCQkJcFBydkVudHJ5LT5wTmV4dCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJCWlmKHBFbnRyeSA9PSBwTGlzdC0+cFRhaWwpCisJCQkJcExpc3QtPnBUYWlsID0gcFBydkVudHJ5OworCisJCQlwTGlzdC0+c2l6ZS0tOworCQkJYnJlYWs7CisJCX0KKwkJcFBydkVudHJ5ID0gcEN1ckVudHJ5OworCQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwQ3VyRW50cnk7Cit9CisKKyNlbmRpZiAvLyBfX19MSU5LX0xJU1RfSF9fIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWQ0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19NRDRfSF9fCisjZGVmaW5lIF9fTUQ0X0hfXworCisvKiBNRDQgY29udGV4dC4gKi8KK3R5cGVkZWYJc3RydWN0CV9NRDRfQ1RYXwl7CisJVUxPTkcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KKwlVTE9ORwljb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLworCVVDSEFSCWJ1ZmZlcls2NF07ICAgICAgLyogaW5wdXQgYnVmZmVyICovCit9CU1ENF9DVFg7CisKK1ZPSUQgTUQ0SW5pdCAoTUQ0X0NUWCAqKTsKK1ZPSUQgTUQ0VXBkYXRlIChNRDRfQ1RYICosIFBVQ0hBUiwgVUlOVCk7CitWT0lEIE1ENEZpbmFsIChVQ0hBUiBbMTZdLCBNRDRfQ1RYICopOworCisjZW5kaWYgLy9fX01ENF9IX18KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltZDUuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisqLworCisjaWZuZGVmCXVpbnQ4CisjZGVmaW5lCXVpbnQ4ICB1bnNpZ25lZAljaGFyCisjZW5kaWYKKworI2lmbmRlZgl1aW50MzIKKyNkZWZpbmUJdWludDMyIHVuc2lnbmVkCWxvbmcgaW50CisjZW5kaWYKKworCisjaWZuZGVmCV9fTUQ1X0hfXworI2RlZmluZQlfX01ENV9IX18KKworI2RlZmluZSBNRDVfTUFDX0xFTiAxNgorCit0eXBlZGVmIHN0cnVjdCBfTUQ1X0NUWCB7CisgICAgVUlOVDMyICAgQnVmWzRdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZvdXIgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs2NF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKK30gICBNRDVfQ1RYOworCitWT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSk7CisKK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Cit2b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKKworLy8KKy8vIFNIQSBjb250ZXh0CisvLwordHlwZWRlZglzdHJ1Y3QgX1NIQV9DVFgKK3sKKwlVSU5UMzIgICBCdWZbNV07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZml2ZSBzdGF0ZXMKKwlVQ0hBUiAgIElucHV0WzgwXTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQorCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cworCit9CVNIQV9DVFg7CisKK1ZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KTsKK1VDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSk7CitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSk7CisKKyNkZWZpbmUgU0hBX0RJR0VTVF9MRU4gMjAKKyNlbmRpZiAvLyBfX01ENV9IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX0FFU19ICisjZGVmaW5lCV9BRVNfSAorCit0eXBlZGVmCXN0cnVjdAoreworCXVpbnQzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZAlrZXlzICovCisJdWludDMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kCWtleXMgKi8KKwlpbnQJbnI7CQkJCS8qIG51bWJlciBvZiByb3VuZHMJKi8KK30KK2Flc19jb250ZXh0OworCitpbnQJIHJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4ICprZXksCWludAluYml0cyApOwordm9pZCBydG1wX2Flc19lbmNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKK3ZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7CisKK3ZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKKworI2VuZGlmIC8qIGFlcy5oCSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tbG1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmYjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oCkBAIC0wLDAgKzEsMTQ3MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltbG1lLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCisqLworI2lmbmRlZiBfX01MTUVfSF9fCisjZGVmaW5lIF9fTUxNRV9IX18KKworLy9leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbXTsKKworLy8gbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtCisvLyBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90CisjZGVmaW5lIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk8gICAweDA1MzMKKworI2RlZmluZSBFTkRfT0ZfQVJHUyAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgTEZTUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwNTcKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfSU5UViAgICAgICAgIDEwMC8qMjAwKi8gICAgICAgLy8KKyNkZWZpbmUgTEVBRF9USU1FICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovICAgICAgIC8vIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjCisjZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMCAgICAgICAvLyAwLjEgc2VjCisvLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKworLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorI2RlZmluZSBDRQkJMAorI2RlZmluZSBGQ0MJCTEKKyNkZWZpbmUgSkFQCQkyCisjZGVmaW5lIEpBUF9XNTMJMworI2RlZmluZSBKQVBfVzU2CTQKKyNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CisKKyNpZmRlZglORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbHNlCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbmRpZgorCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyICogT1NfSFogICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgorI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwIAkJICAvLyBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0ICAgICAgICAgLy8gYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KKy8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCisvLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCisjZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKKy8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCisjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQorI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQorLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQorI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKKyNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQorI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQorCisvLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCisjZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCisKKy8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCisvLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKKworLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgorI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgorI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgorI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQorI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQorI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKKworLy8gTEVEIENvbnRyb2wKKy8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQorLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQorCisvLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKyNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCisjZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCisjZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCisjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKworI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQorCisvLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCisKKyNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKKworI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKKyNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEJBX05PVFVTRSAJMgorLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKyNkZWZpbmUgSU1NRURfQkEgCTEKKyNkZWZpbmUgREVMQVlfQkEJMAorCisvLyBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUKKyNkZWZpbmUgT1JJR0lOQVRPUgkxCisjZGVmaW5lIFJFQ0lQSUVOVAkwCisKKy8vIEFEREJBIFN0YXR1cyBDb2RlCisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfU1VDQ0VTUwkJCQkJMAorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1JFRlVTRUQJCQkJCTM3CisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfSU5WQUxJRF9QQVJBTUVURVJTCQkJMzgKKworLy8gREVMQkEgUmVhc29uIENvZGUKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNworI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKKworLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCitpZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKK3sgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4RmFpbENvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOyBcCit9CisKKy8vCisvLyA4MDIuMTEgZnJhbWUgZm9ybWF0cworLy8KKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOworCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCUFNc2R1U2l6ZToxOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCUFkdkNvZGluZzoxOworI2Vsc2UKKwlVU0hPUlQJQWR2Q29kaW5nOjE7CisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQorCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CisJVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKKwlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCVBTTVA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKyNlbmRpZgkvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKworLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJTUNTU2V0WzEwXTsKKwlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOworCVVDSEFSCU1wZHVEZW5zaXR5OjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglUeFJ4Tm90RXF1YWw6MTsKKwlVQ0hBUglUeE1DU1NldERlZmluZWQ6MTsKKyNlbHNlCisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCXJzdjozOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVQ0hBUglyc3YzWzNdOworfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjQ7CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJUGNvOjE7CisjZWxzZQorCVVTSE9SVAlQY286MTsKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlyc3YyOjQ7CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworfSBFWFRfSFRfQ0FQX0lORk8sICpQRVhUX0hUX0NBUF9JTkZPOworCisvLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVTE9ORwlyc3Y6MzsKKwlVTE9ORwlDaGFuRXN0aW1hdGlvbjoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlFeHBDb21CRjoyOworCVVMT05HCUV4cE5vQ29tQkY6MjsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBOb0NvbVN0ZWVyQ2FwYWJsZToxOworCVVMT05HCUV4cENTSUNhcGFibGU6MTsKKwlVTE9ORwlDYWxpYnJhdGlvbjoyOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJVHhORFBDYXBhYmxlOjE7CisJVUxPTkcJUnhORFBDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisjZWxzZQorCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlNaW5Hcm91cGluZzoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisKKy8vICBIVCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9BU19DQVB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJUnhBU2VsOjE7CisJVUNIQVIJQW50SW5kRmJrOjE7CisJVUNIQVIJRXhwQ1NJRmJrOjE7CisJVUNIQVIJQW50SW5kRmJrVHhBU0VMOjE7CisJVUNIQVIJRXhwQ1NJRmJrVHhBU0VMOjE7CisJVUNIQVIJQW50U2VsZWN0OjE7CisjZWxzZQorCVVDSEFSCUFudFNlbGVjdDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJcnN2OjE7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworCisvLyBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLgorI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7CisJSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKKwlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOworLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7CisJVUNIQVIJCQlNQ1NTZXRbMTZdOworCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87CisJSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCisJSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KK30gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworCisKKy8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorLy8gNy4zLjIuNjAKKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCisJCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgorI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKKwkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7CisJVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOworCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOworCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAorCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKKwlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAorfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKKworCisvLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAordHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Cisgc3RydWN0IFBBQ0tFRCB7CisgI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6NTsKKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CisJVUNIQVIJSW50b2xlcmFudDQwOjE7CisJVUNIQVIJSW5mb1JlcToxOworICNlbHNlCisJVUNIQVIJSW5mb1JlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KKwlVQ0hBUglyc3Y6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisgICAgfSBmaWVsZDsKKyBVQ0hBUiAgIHdvcmQ7Cit9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKKworCit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBeworCUJPT0xFQU4JCQliVmFsaWQ7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKKwlVU0hPUlQJQ2hhbm5lbDsKKwlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KK30gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7CisKKy8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKKy8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKyNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Cit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCeworCVVDSEFSCUV2ZW50QU5vOworCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KK30gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CisKKy8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KKy8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2Mjo1OworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKyNlbHNlCisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOworCVVDSEFSCXJzdjI6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9RVhUX0NBUF9JTkZPX0VMRU1FTlQsICpQRVhUX0NBUF9JTkZPX0VMRU1FTlQ7CisKKworLy8gODAyLjExbiA3LjMuMi42MQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlR7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfQ09FWElTVCA9IDcyCisJVUNIQVIJCQkJCUxlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0SWU7Cit9QlNTXzIwNDBfQ09FWElTVF9FTEVNRU5ULCAqUEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVDsKKworCisvLzgwMi4xMW4gNy4zLjIuNTkKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCisJVUNIQVIJCQkJTGVuOworCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUgkJCQlDaExpc3RbMF07Cit9QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFeworCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCisJVUNIQVIJCQlOZXdDaGFubmVsOwkvLworCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCit9IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKworCisvLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ19DSEFfT0ZGU0VUX0lFeworCVVDSEFSCQkJU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJIC8vIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkKK30gU0VDX0NIQV9PRkZTRVRfSUUsICpQU0VDX0NIQV9PRkZTRVRfSUU7CisKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQorCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAorfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKworLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCisvL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgMAkvLyBtb3ZlIHRvCisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKKyNlbmRpZgorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjU7CisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKyNlbHNlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJcnN2OjU7CisjZW5kaWYKKworCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisjZWxzZQorCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCisKKwkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCisJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNworCVVDSEFSCUJTU0NvZXhpc3QyMDQwOworfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7CisKKy8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVNlckludGVyR3JhbnU6MzsKKwlVQ0hBUglTX1BTTVBTdXA6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisjZWxzZQorCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKKyNlbmRpZgorfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKK30gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7CisKKworLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjQ7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCVN0YmNNY3M6NjsKKyNlbHNlCisJVVNIT1JUCVN0YmNNY3M6NjsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlyc3Y6NDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOworCisjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCUNvbnRyb2xDaGFuOworCUFERF9IVElORk8JCQlBZGRIdEluZm87CisJQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOworCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKKwlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAorfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKKwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OworfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworCisKKy8vIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyNlbHNlCisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKworLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRT1NfQ09OVFJPTCwgKlBRT1NfQ09OVFJPTDsKKworLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisjZWxzZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisjZWxzZQorCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworCVVDSEFSCQkJT2N0ZXRbMF07Cit9CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV84MDJfMTEgeworICAgIEhFQURFUl84MDJfMTEgICBIZHI7CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBGUkFNRV84MDJfMTEsICpQRlJBTUVfODAyXzExOworCisvLyBRb1NOdWxsIGVtYmVkZGluZyBvZiBtYW5hZ2VtZW50IGFjdGlvbi4gV2hlbiBIVCBDb250cm9sIE1BIGZpZWxkIHNldCB0byAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NQV9CT0RZIHsKKyAgICBVQ0hBUiAgICAgICAgICAgIENhdGVnb3J5OworICAgIFVDSEFSICAgICAgICAgICAgQWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgTUFfQk9EWSwgKlBNQV9CT0RZOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMwl7CisgICAgVUNIQVIgICAgICAgICAgIERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgU0FBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBPY3RldFsyXTsKK30JSEVBREVSXzgwMl8zLCAqUEhFQURFUl84MDJfMzsKKy8vLy9CbG9jayBBQ0sgcmVsYXRlZCBmb3JtYXQKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgIGZpZWxkICBpbiAJREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX1BBUk0sICpQQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCB7CisgICAgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKwlVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKyNlbmRpZiAvKiBSVF9CSUdfRU5ESUFOICovCisgICAgfSAgIGZpZWxkOworICAgIFVTSE9SVCAgICAgICAgICAgd29yZDsKK30gQkFTRVFfQ09OVFJPTCwgKlBCQVNFUV9DT05UUk9MOworCisvL0JBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUKKy8vIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX0NPTlRST0wsICpQQkFfQ09OVFJPTDsKKworLy8gMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgorICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFSX0NPTlRST0wsICpQQkFSX0NPTlRST0w7CisKKy8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBNVEJBUl9DT05UUk9MLCAqUE1UQkFSX0NPTlRST0w7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBFUl9USURfSU5GTyAgICAgIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gRUFDSF9USUQsICpQRUFDSF9USUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOworfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7CisKKy8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MICBCQVJDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOworCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworCisvLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKKwlVQ0hBUgkJQml0TWFwWzhdOworfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKK30gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKK30gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CisKKy8vQWN0aW9uIEZyYW1lCisvL0FjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQU5fU1dJVENIX0FOTk9VTkNFIHsKKwlVQ0hBUgkJCQkJRWxlbWVudElEOwkvLyBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3CisJVUNIQVIJCQkJCUxlbjsKKwlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNTQW5ub3VuY2VJZTsKK30gICBDSEFOX1NXSVRDSF9BTk5PVU5DRSwgKlBDSEFOX1NXSVRDSF9BTk5PVU5DRTsKKworCisvLzgwMi4xMW4gOiA3LjMuMi4yMGEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKKwlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgorCVVDSEFSCQkJCUxlbjsKKwlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOworfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOworCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKK30gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOwkvLyAxCisJQkFfUEFSTQkJQmFQYXJtOwkgICAgICAvLyAgMiAtIDEwCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CS8vIDAgLSAwCisJQkFTRVFfQ09OVFJPTAlCYVN0YXJ0U2VxOyAvLyAwLTAKK30gICBGUkFNRV9BRERCQV9SRVEsICpQRlJBTUVfQUREQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JTUCB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVN0YXR1c0NvZGU7CisJQkFfUEFSTQkJQmFQYXJtOyAvLzAgLSAyCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7Cit9ICAgRlJBTUVfQUREQkFfUlNQLCAqUEZSQU1FX0FEREJBX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9ERUxCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCURFTEJBX1BBUk0JCURlbGJhUGFybTsKKwlVU0hPUlQJUmVhc29uQ29kZTsKK30gICBGUkFNRV9ERUxCQV9SRVEsICpQRlJBTUVfREVMQkFfUkVROworCisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQVIgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQVIsICpQRlJBTUVfQkFSOworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKKwlVQ0hBUgkJYml0bWFza1s4XTsKK30gICBGUkFNRV9CQSwgKlBGUkFNRV9CQTsKKworCisvLyBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1JNX1JFUV9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlSZXBldGl0aW9uOworCVVDSEFSICAgZGF0YVswXTsKK30gICBGUkFNRV9STV9SRVFfQUNUSU9OLCAqUEZSQU1FX1JNX1JFUV9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJCUlEOworCVVDSEFSCQlMZW5ndGg7CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hNb2RlOworCVVDSEFSCQlOZXdSZWdDbGFzczsKKwlVQ0hBUgkJTmV3Q2hhbm5lbE51bTsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaENvdW50OworfSBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFLCAqUEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUU7CisKKworLy8KKy8vIF9MaW1pdCBtdXN0IGJlIHRoZSAyKipuIC0gMQorLy8gX1NFUTEgLCBfU0VRMiBtdXN0IGJlIHdpdGhpbiAwIH4gX0xpbWl0CisvLworI2RlZmluZSBTRVFfU1RFUE9ORShfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSA9PSAoKF9TRVEyKzEpICYgX0xpbWl0KSkpCisjZGVmaW5lIFNFUV9TTUFMTEVSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKQorI2RlZmluZSBTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExICE9IF9TRVEyKSAmJiAhKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkpCisjZGVmaW5lIFNFUV9XSVRISU5fV0lOKF9TRVExLCBfU0VRMiwgX1dJTiwgX0xpbWl0KSAoU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkgJiYgIFwKKwkJCQkJCQkJCQkJCVNFUV9TTUFMTEVSKF9TRVExLCAoKF9TRVEyK19XSU4rMSkmX0xpbWl0KSwgX0xpbWl0KSkKKworLy8KKy8vIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkKKy8vCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVDSEFSICAgICAgIENmcENvdW50OworICAgIFVDSEFSICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICBDZnBEdXJSZW1haW5pbmc7Cit9IENGX1BBUk0sICpQQ0ZfUEFSTTsKKwordHlwZWRlZglzdHJ1Y3QJX0NJUEhFUl9TVUlURQl7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlcjsJCS8vIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlckF1eDsJLy8gVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlcjsJLy8gR3JvdXAgY2lwaGVyCisJVVNIT1JUCQkJCQkJCVJzbkNhcGFiaWxpdHk7CS8vIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uCisJQk9PTEVBTgkJCQkJCQliTWl4TW9kZTsJCS8vIEluZGljYXRlIFBhaXIgJiBHcm91cCBjaXBoZXIgbWlnaHQgYmUgZGlmZmVyZW50Cit9CUNJUEhFUl9TVUlURSwgKlBDSVBIRVJfU1VJVEU7CisKKy8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCisgICAgVUNIQVIgICAgICAgQ3dtaW5bNF07CisgICAgVUNIQVIgICAgICAgQ3dtYXhbNF07CisgICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Cit9IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisKKy8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVTSE9SVCAgICAgIFN0YU51bTsKKyAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247CisgICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKK30gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJUnN2MjoxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisjZWxzZQorICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjI6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX1NUQV9JTkZPX1BBUk0sICpQUUJTU19TVEFfSU5GT19QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJVUFQU0Q6MTsKKwlVQ0hBUgkJUnN2OjM7CisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKyNlbHNlCisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKwlVQ0hBUgkJUnN2OjM7CisJVUNIQVIJCVVBUFNEOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisKKy8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAorLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Cit9IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgIElFTGVuOworICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKK30gV1BBX0lFXzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgQ2hhbm5lbDsKKwlVQ0hBUiAgIENlbnRyYWxDaGFubmVsOwkvL1N0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuCisgICAgVUNIQVIgICBCc3NUeXBlOworICAgIFVTSE9SVCAgQXRpbVdpbjsKKyAgICBVU0hPUlQgIEJlYWNvblBlcmlvZDsKKworICAgIFVDSEFSICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5OworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFIEFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0OworCUNIQVIgICAgUnNzaTsKKyAgICBVQ0hBUiAgIFByaXZhY3k7CQkJLy8gSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLgorCVVDSEFSCUhpZGRlbjsKKworICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKKyAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCisgICAgVVNIT1JUICBDZnBDb3VudDsKKyAgICBVU0hPUlQgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOworICAgIFVDSEFSICAgU3NpZExlbjsKKyAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKworCUJPT0xFQU4JYlNFUzsKKworCS8vIE5ldyBmb3IgV1BBMgorCUNJUEhFUl9TVUlURQkJCQkJV1BBOwkJCS8vIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEEyOwkJCS8vIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZQorCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKKwlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQorCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KKyAgICBVQ0hBUiAgIENraXBGbGFnOworCisJLy8gQ0NYIDIgVFNGCisJVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKKwlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCisgICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQorCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgV1BBX0lFXyAgICAgV3BhSUU7CisgICAgV1BBX0lFXyAgICAgUnNuSUU7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQlDb3VudHJ5U3RyaW5nWzNdOworCUJPT0xFQU4JCWJIYXNDb3VudHJ5SUU7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgICAgIEJzc05yOworICAgIFVDSEFSICAgICAgICAgICBCc3NPdmVybGFwTnI7CisgICAgQlNTX0VOVFJZICAgICAgIEJzc0VudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gQlNTX1RBQkxFLCAqUEJTU19UQUJMRTsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRV9FTEVNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBNYWNoaW5lOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ1R5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnTGVuOworICAgIFVDSEFSICAgICAgICAgICAgIE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisgICAgTEFSR0VfSU5URUdFUiAgICAgVGltZVN0YW1wOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kwOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kxOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kyOworICAgIFVDSEFSICAgICAgICAgICAgIFNpZ25hbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBDaGFubmVsOworICAgIFVDSEFSICAgICAgICAgICAgIFdjaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgT2NjdXBpZWQ7Cit9IE1MTUVfUVVFVUVfRUxFTSwgKlBNTE1FX1FVRVVFX0VMRU07CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKKyAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOworICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKKyAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKKwordHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCit0eXBlZGVmIHN0cnVjdCBfU1RBVEVfTUFDSElORSB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yTXNnOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclN0YXRlOworICAgIFNUQVRFX01BQ0hJTkVfRlVOQyAgICAgICAgICAgICAqVHJhbnNGdW5jOworfSBTVEFURV9NQUNISU5FLCAqUFNUQVRFX01BQ0hJTkU7CisKKworLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKy8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCisvLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgorLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKKy8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQorLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCisgICAgLy8gbmV3IGZvciBRT1MKKyAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCisgICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECisgICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZworICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OworICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKworCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7CisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJ1ZlNpemU7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIFRva2VuOworCVVTSE9SVAlCYVN0YXJ0U2VxOworfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFTEJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIJSW5pdGlhdG9yOworfSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUxCQV9SRVFfU1RSVUNUOworCisvLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKKyAgICBVTE9ORyAgICAgVGltZW91dDsKK30gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgUmVhc29uOworfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIEFsZzsKKyAgICBVTE9ORyAgICAgICAgVGltZW91dDsKK30gTUxNRV9BVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9BVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBSZWFzb247Cit9IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVMT05HICAgICAgQnNzSWR4OworfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7CisgICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgIFNzaWRMZW47Cit9IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8vIHN0cnVjdHVyZSBmb3IgRExTCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMUyB7CisJVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLCB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworCVJBTElOS19USU1FUl9TVFJVQ1QJCQlUaW1lcjsJCQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgaGFuZHNoYWtlCisJVVNIT1JUCQkJCQkJU2VxdWVuY2U7CisJVVNIT1JUCQkJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJQk9PTEVBTgkJCQkJCWJIVENhcDsKKwlQVk9JRAkJCQkJCXBBZDsKK30gUlRfODAyXzExX0RMUywgKlBSVF84MDJfMTFfRExTOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ETFNfUkVRX1NUUlVDVCB7CisgICAgUFJUXzgwMl8xMV9ETFMJcERMUzsKKyAgICBVU0hPUlQJCQlSZWFzb247Cit9IE1MTUVfRExTX1JFUV9TVFJVQ1QsICpQTUxNRV9ETFNfUkVRX1NUUlVDVDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBVQ0hBUiAgIEVpZDsKKyAgICBVQ0hBUiAgIExlbjsKKyAgICBDSEFSICAgT2N0ZXRbMV07Cit9IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICit7CisJVUNIQVIgICBJdGVtTm87CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJzdjI6MjsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCVNUQkM6MTsKKyNlbHNlCisJVUNIQVIJU1RCQzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MjoyOworI2VuZGlmCisJVUNIQVIgICBDdXJyTUNTOworCVVDSEFSICAgVHJhaW5VcDsKKwlVQ0hBUiAgIFRyYWluRG93bjsKK30gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKKworLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKKy8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAorLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCisKKyNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCisvLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgorI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KKworLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Cit0eXBlZGVmIGVudW0gX1NzdCB7CisgICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCisgICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCisgICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCit9IFNTVDsKKworLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCit0eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7CisgICAgQVNfTk9UX0FVVEgsCisgICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQorICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQorICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQorfSBBVVRIX1NUQVRFOworCisvL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgeworICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKKyAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCisgICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgorICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKKyAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0CisgICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQorICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKKyAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3CisgICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAorICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKKyAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAorICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCisgICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKKyAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMworfSBBUF9XUEFfU1RBVEU7CisKKy8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKKyAgICBSRUtFWV9ORUdPVElBVElORywKKyAgICBSRUtFWV9FU1RBQkxJU0hFRCwKKyAgICBLRVlFUlJPUiwKK30gR1RLX1NUQVRFOworCisvLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKKyAgICBTRVRLRVlTLAorICAgIFNFVEtFWVNfRE9ORSwKK30gV1BBX0dUS19TVEFURTsKKy8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbmV0aWZfYmxvY2suaApAQCAtMCwwICsxLDU4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTkVUX0lGX0JMT0NLX0hfXworI2RlZmluZSBfX05FVF9JRl9CTE9DS19IX18KKworLy8jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAicnRtcC5oIgorCisjZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCisKK3R5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQoreworCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OworCVBORVRfREVWIHBOZXREZXY7Cit9IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOworCit2b2lkIGluaXRibG9ja1F1ZXVlVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpOworCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7CisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKKyNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4OGRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKQEAgLTAsMCArMSwxMDkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW9pZC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfT0lEX0hfCisjZGVmaW5lIF9PSURfSF8KKworI2RlZmluZSBUUlVFCQkJCTEKKyNkZWZpbmUgRkFMU0UJCQkJMAorLy8KKy8vIElFRUUgODAyLjExIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisvLworI2RlZmluZSBNQVhfVFhfUE9XRVJfTEVWRUwgICAgICAgICAgICAgIDEwMCAgIC8qIG1XICovCisjZGVmaW5lIE1BWF9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTEwICAgIC8qIGRCbSAqLworI2RlZmluZSBNSU5fUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0yMDAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ2ICAvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjU2ICAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIzNDcgIC8qIGJ5dGUgY291bnQgKi8KKworLy8gbmV3IHR5cGVzIGZvciBNZWRpYSBTcGVjaWZpYyBJbmRpY2F0aW9ucworLy8gRXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0CisjZGVmaW5lIEVYVENIQV9OT05FCQkJMAorI2RlZmluZSBFWFRDSEFfQUJPVkUJCTB4MQorI2RlZmluZSBFWFRDSEFfQkVMT1cJCTB4MworCisvLyBCVworI2RlZmluZSBCQU5EX1dJRFRIXzIwCQkwCisjZGVmaW5lIEJBTkRfV0lEVEhfNDAJCTEKKyNkZWZpbmUgQkFORF9XSURUSF9CT1RICQkyCisjZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisvLyBTSE9SVEdJCisjZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHQVBfSU5URVJWQUxfODAwCTAKKyNkZWZpbmUgR0FQX0lOVEVSVkFMX0JPVEgJMgorCisjZGVmaW5lIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCQkJMQorI2RlZmluZSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZAkJMAorCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEICAgICAgICAgMzIKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKKyNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCQk0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9FVkVOVAkJCQkxMCAgLy8gZW50cnkgIyBpbiBFVkVOVCB0YWJsZQorI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMiAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorI2RlZmluZSBNQVhfTlVNQkVSX09GX0FDTAkJCQk2NAorI2RlZmluZSBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJCTEyICAgIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CisKKyNpZm5kZWYgVU5ERVJfQ0UKKy8vIE9JRCBkZWZpbml0aW9uLCBzaW5jZSBORElTIDUuMCBkaWRuJ3QgZGVmaW5lIHRoZXNlLCB3ZSBuZWVkIHRvIGRlZmluZSBmb3Igb3VyIG93bgorLy8jaWYgX1dJTjMyX1dJTk5UPD0weDA1MDAKKworI2RlZmluZSBPSURfR0VOX01BQ0hJTkVfTkFNRSAgICAgICAgICAgICAgIDB4MDAwMTAyMUEKKworI2lmZGVmIFJBTElOS19BVEUKKyNkZWZpbmUgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVAkJCTB4MDQwMQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCisjZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfQVBEX1BJRAkJCQkJCTB4MDQwNQorI2RlZmluZSBSVF9TRVRfREVMX01BQ19FTlRSWQkJCQkweDA0MDYKKworLy8KKy8vIElFRUUgODAyLjExIE9JRHMKKy8vCisjZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAorCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQJCQkweDAxMDMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCQkJCTB4MDEwNAorI2RlZmluZQlPSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCQkJCTB4MDEwNworI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0kJCQkJCQkJMHgwMTA4IC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMQkJCQkJCTB4MDEwOSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzIJCQkJCQkweDAxMEEgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCU9JRF84MDJfMTFfTlVNQkVSX09GX0FOVEVOTkFTCQkJCTB4MDEwQgorI2RlZmluZQlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBDCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMJCQkJCTB4MDEwRQorI2RlZmluZQlPSURfODAyXzExX0FERF9XRVAJCQkJCQkJMHgwMTEyCisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCQkJCTB4MDExMworI2RlZmluZQlPSURfODAyXzExX0RJU0FTU09DSUFURQkJCQkJCTB4MDExNAorI2RlZmluZQlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkJCQkweDAxMTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgkJCTB4MDExRQorI2RlZmluZQlPSURfODAyXzExX1RFU1QJCQkJCQkJCTB4MDExRgorI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNworI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4CisjZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgorI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKKyNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQorI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCisjZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0CisjZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKKyNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2CisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNworI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5CisjZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKKyNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMworI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAorI2lmZGVmCURCRworI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQorI2VuZGlmCisjZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKKyNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKKyNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKKyNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKKworLy8gRm9yIDgwMi4xeCBkYWVtaW4gdXNpbmcgdG8gcmVxdWlyZSBjdXJyZW50IGRyaXZlciBjb25maWd1cmF0aW9uCisjZGVmaW5lIE9JRF84MDJfMTFfUkFESVVTX1FVRVJZX1NFVFRJTkcJCQkJMHgwNTQwCisKKyNkZWZpbmUJUlRfT0lEX0RFVklDRV9OQU1FCQkJCQkJCTB4MDYwNworI2RlZmluZQlSVF9PSURfVkVSU0lPTl9JTkZPCQkJCQkJCTB4MDYwOAorI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1QJCQkJCQkweDA2MDkKKyNkZWZpbmUJT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUwkJCQkJMHgwNjBBCisjZGVmaW5lCU9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMJCQkJMHgwNjBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMJCQkJMHgwNjBDCisjZGVmaW5lCU9JRF84MDJfMTFfUlNTSQkJCQkJCQkJMHgwNjBECisjZGVmaW5lCU9JRF84MDJfMTFfU1RBVElTVElDUwkJCQkJCTB4MDYwRQorI2RlZmluZQlPSURfR0VOX1JDVl9PSwkJCQkJCQkJMHgwNjBGCisjZGVmaW5lCU9JRF9HRU5fUkNWX05PX0JVRkZFUgkJCQkJCTB4MDYxMAorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OCQkJMHgwNjExCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTgkJMHgwNjEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFCQkJMHgwNjEzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMQkJCQkweDA2MTQKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9QSURWSUQJCQkJCTB4MDYxNQorLy9mb3IgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2RlZmluZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUyAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgorI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVggICAgICAgICAgICAgICAgICAgIDB4MDYxNworI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgICAgICAgIDB4MDYxOAorI2RlZmluZSBPSURfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMAorI2RlZmluZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAgICAgICAgICAgICAgIDB4MDYyMQorI2RlZmluZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRCAgICAgICAgICAgICAgICAgIDB4MDYyMgorI2RlZmluZSBSVF9PSURfTkVXX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMworCisKKy8vcnQyODYwICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMAkJCQkJCQkweDA2MzAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMQkJCQkJCQkweDA2MzEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUJCQkweDA2MzIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFCQkJCTB4MDYzMworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFCQkJCTB4MDYzNAorI2RlZmluZQlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUwkJCQkJMHgwNjM1CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HCQkJMHgwNjM2CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORwkJCQkweDA2MzcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTQkJCQkweDA2MzgKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00JCQkJCTB4MDYzOQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMUwkJCQkJCTB4MDYzQQorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFMJCQkJCQkweDA2M0IKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU0JCQkJMHgwNjNDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTQkJCQkJMHgwNjNECisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfV01NICAgICAgICAgICAgICAJCTB4MDYzRQorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9XTU0gICAgICAJCQkJCTB4MDYzRgorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKKyNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKKyNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKKworLy8gUmFsaW5rIGRlZmluZWQgT0lEcworLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCisKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQorI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQoreworICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOworfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKKworLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKKworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKK3sKKyAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworICAgIFVMT05HIEZsYWdzOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7CisKKy8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCit0eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBVTE9ORyBGbGFnczsKK30gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCit7CisgICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCisgICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKKyAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKK30gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7CisKKy8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQorI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKKworLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQoreworICAgTmRpczgwMl8xMUZILAorICAgTmRpczgwMl8xMURTLAorICAgIE5kaXM4MDJfMTFPRkRNNSwKKyAgICBOZGlzODAyXzExT0ZETTVfTiwKKyAgICBOZGlzODAyXzExT0ZETTI0LAorICAgIE5kaXM4MDJfMTFPRkRNMjRfTiwKKyAgIE5kaXM4MDJfMTFBdXRvbW9kZSwKKyAgICBOZGlzODAyXzExTmV0d29ya1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgTmV0d29ya1R5cGUgWzFdOworfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVCwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVDsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QT1dFUl9NT0RFCit7CisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUNBTSwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1heCAgICAgIC8vIG5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9QT1dFUl9NT0RFLCAqUE5ESVNfODAyXzExX1BPV0VSX01PREU7CisKK3R5cGVkZWYgVUxPTkcgICBORElTXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDsgLy8gaW4gbWlsbGl3YXR0cworCisvLworLy8gUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIEluZGljYXRpb24KKy8vCit0eXBlZGVmIExPTkcgICAgTkRJU184MDJfMTFfUlNTSTsgICAgICAgICAgIC8vIGluIGRCbQorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSAoreworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBVTE9ORyAgICAgICAgICAgSG9wUGF0dGVybjsgICAgICAgIC8vIEFzIGRlZmluZWQgYnkgODAyLjExLCBNU0Igc2V0CisgICBVTE9ORyAgICAgICAgICAgSG9wU2V0OyAgICAgICAgICAgIC8vIHRvIG9uZSBpZiBub24tODAyLjExCisgICBVTE9ORyAgICAgICAgICAgRHdlbGxUaW1lOyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZILCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkg7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OCit7CisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7ICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBBVElNV2luZG93OyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0NvbmZpZzsgICAgICAgICAgIC8vIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIegorICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCAgICBGSENvbmZpZzsKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVElTVElDUworeworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUExvY2FsTUlDRmFpbHVyZXM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlbW90ZU1JQ0Vycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQSUNWRXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBGb3JtYXRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUFJlcGxheXM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUERlY3J5cHRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOworfSBORElTXzgwMl8xMV9TVEFUSVNUSUNTLCAqUE5ESVNfODAyXzExX1NUQVRJU1RJQ1M7CisKK3R5cGVkZWYgIFVMT05HICBORElTXzgwMl8xMV9LRVlfSU5ERVg7Cit0eXBlZGVmIFVMT05HTE9ORyAgIE5ESVNfODAyXzExX0tFWV9SU0M7CisKKyNkZWZpbmUgTUFYX1JBRElVU19TUlZfTlVNCQkJMgkgIC8vIDgwMi4xeCBmYWlsb3ZlciBudW1iZXIKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfU1JWX0lORk8geworCVVJTlQzMgkJCXJhZGl1c19pcDsKKwlVSU5UMzIJCQlyYWRpdXNfcG9ydDsKKwlVQ0hBUgkJCXJhZGl1c19rZXlbNjRdOworCVVDSEFSCQkJcmFkaXVzX2tleV9sZW47Cit9IFJBRElVU19TUlZfSU5GTywgKlBSQURJVVNfU1JWX0lORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0tFWV9JTkZPCit7CisJVUNIQVIJCQlyYWRpdXNfc3J2X251bTsKKwlSQURJVVNfU1JWX0lORk8JcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisJVUNIQVIJCQlpZWVlODAyMXhXRVA7CQkgLy8gZHluYW1pYyBXRVAKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2luZGV4OworICAgIFVDSEFSICAgICAgICAgICBrZXlfbGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICAgVUNIQVIgICAgICAgICAgIGtleV9tYXRlcmlhbFsxM107Cit9IFJBRElVU19LRVlfSU5GTywgKlBSQURJVVNfS0VZX0lORk87CisKKy8vIEl0J3MgdXNlZCBieSA4MDIuMXggZGFlbW9uIHRvIHJlcXVpcmUgcmVsYXRpdmUgY29uZmlndXJhdGlvbgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfQ09ORgoreworICAgIFVJTlQzMiAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVDSEFSCQkJbWJzc19udW07CQkJLy8gaW5kaWNhdGUgbXVsdGlwbGUgQlNTIG51bWJlcgorCVVJTlQzMgkJCW93bl9pcF9hZGRyOworCVVJTlQzMgkJCXJldHJ5X2ludGVydmFsOworCVVJTlQzMgkJCXNlc3Npb25fdGltZW91dF9pbnRlcnZhbDsKKwlVQ0hBUgkJCUVBUGlmbmFtZVtJRk5BTVNJWl07CisJVUNIQVIJCQlFQVBpZm5hbWVfbGVuOworCVVDSEFSIAkJCVByZUF1dGhpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW47CisJUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOC8qTUFYX01CU1NJRF9OVU0qL107Cit9IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOworICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKK3sKKyAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cworICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKKworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKK3sKKyAgIE5kaXM4MDJfMTFJQlNTLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAorICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAorICAgTmRpczgwMl8xMU1vbml0b3IsCisgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOworCisvLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKK3sKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCisgICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCisgICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAorICAgCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAorICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOworCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECit7CisgICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgorICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCit9IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAorICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOworICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOworfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKK3sKKyAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7CisKKy8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50CisgICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Cit9IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Cit9IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKK3sKKyAgICBVQ0hBUiBUaW1lc3RhbXBbOF07CisgICAgVVNIT1JUIEJlYWNvbkludGVydmFsOworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Cit9IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKK3sKKyAgICBVQ0hBUiBFbGVtZW50SUQ7CisgICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAorICAgIFVDSEFSIGRhdGFbMV07Cit9IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCit7CisgICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKKyAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKK30gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7CisKKy8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCisvLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCit7CisgICBOZGlzODAyXzExV0VQRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKyAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKKyAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKKyAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCisJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKK30gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAorICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKK3sKKyAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCit9IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKKworI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKK30gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQoreworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7CisgICAgVVNIT1JUIFN0YXR1c0NvZGU7CisgICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Cit9IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKK30gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAoreworICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKKworLyoKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOworICAgIFVMT05HIFR5cGU7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7CisgICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7CisgICAgfTsKK30gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOworICovCisKKy8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit7CisgICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAorfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKKworLy8gUE1LSUQgU3RydWN0dXJlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KK3sKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK30gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKK3sKKyAgICBVSU5UICAgIExlbmd0aDsKKyAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OworICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOworfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgoreworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisgICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQoreworICAgICBVTE9ORyBMZW5ndGg7CisgICAgIFVMT05HIFZlcnNpb247CisgICAgIFVMT05HIE5vT2ZQTUtJRHM7CisgICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK30gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworCisvLyNlbmRpZiAvL29mIFdJTiAyaworI2VuZGlmIC8vVU5ERVJfQ0UKKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMQorI2lmbmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUFJJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJFMAorI2VuZGlmCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkJCQkJCQkJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0UyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNykKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCitlbnVtIHsKKyAgICBTSE9XX0NPTk5fU1RBVFVTID0gNCwKKyAgICBTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorICAgIFNIT1dfQkFfSU5GTyA9IDYsCisJU0hPV19ERVNDX0lORk8gPSA3LAorI2lmZGVmIFJUMjg3MAorCVNIT1dfUlhCVUxLX0lORk8gPSA4LAorCVNIT1dfVFhCVUxLX0lORk8gPSA5LAorI2VuZGlmIC8vIFJUMjg3MCAvLworICAgIFJBSU9fT0ZGID0gMTAsCisgICAgUkFJT19PTiA9IDExLAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwlTSE9XX0NGR19WQUxVRSA9IDIwLAorCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAorfTsKKworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vU05NUCBpZWVlIDgwMmRvdDExLCBrYXRoeSAsIDIwMDhfMDIyMAorLy8gZG90MTFyZXMoMykKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkJCQkweDA3MDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FCQkJMHgwNzAxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FCQkweDA3MDIKKworLy8gZG90MTFzbXQoMSkKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQJMHgwNzAzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERQkJMHgwNzA0CisjZGVmaW5lIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFCQkJMHgwNzA1IC8vIHJlYWQgLCB3cml0ZQorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRAkJCQkweDA3MDYKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RICQkweDA3MDcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQJCQkJMHgwNzA4CisjZGVmaW5lIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQJCQkJMHgwNzA5CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJPRFVDVElECQkJCQkweDA3MTAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlECQkJCTB4MDcxMQorCisvLyAvL2RvdDExUGh5KDQpCisjZGVmaW5lIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwJCQkJMHgwNzEyCisKKy8vZG90MTFtYWMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUwkJCQkweDA3MTMKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworI2RlZmluZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVgJCQkJMHgwNzE0CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIX0xJU1QJCQkJCTB4MDcxNQorI2RlZmluZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUJCQkJMHgwNzE2CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZCQkweDA3MTcKKworI2lmZGVmIExMVERfU1VQUE9SVAorLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQorI2RlZmluZSBSVF9PSURfR0VUX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzYxCisjZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorLy8JVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVR4QkY6MTsKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisvLwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QUkVBTUJMRSB7CisgICAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcsCisgICAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LAorICAgIFJ0ODAyXzExUHJlYW1ibGVBdXRvCit9IFJUXzgwMl8xMV9QUkVBTUJMRSwgKlBSVF84MDJfMTFfUFJFQU1CTEU7CisKKy8vIE9ubHkgZm9yIFNUQSwgbmVlZCB0byBzeW5jIHdpdGggQVAKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX1BIWV9NT0RFIHsKKwlQSFlfMTFCR19NSVhFRCA9IDAsCisJUEhZXzExQiwKKwlQSFlfMTFBLAorCVBIWV8xMUFCR19NSVhFRCwKKwlQSFlfMTFHLAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBIWV8xMUFCR05fTUlYRUQsCS8vIGJvdGggYmFuZCAgIDUKKwlQSFlfMTFOXzJfNEcsCQkvLyAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgIAk2CisJUEhZXzExR05fTUlYRUQsCS8vIDIuNEcgYmFuZCAgICAgIDcKKwlQSFlfMTFBTl9NSVhFRCwJLy8gNUcgIGJhbmQgICAgICAgOAorCVBIWV8xMUJHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICA5CisJUEhZXzExQUdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDEwCisJUEhZXzExTl81RywJCQkvLyAxMW4tb25seSB3aXRoIDVHIGJhbmQJCTExCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IFJUXzgwMl8xMV9QSFlfTU9ERTsKKworLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7CisgICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKKyAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKKyAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCisgICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCit9IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfTE9HIHsKKyAgICBMQVJHRV9JTlRFR0VSICAgU3lzdGVtVGltZTsgIC8vIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpCisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgICAgICAgICAgRXZlbnQ7ICAgICAgIC8vIEVWRU5UX3h4eAorfSBSVF84MDJfMTFfRVZFTlRfTE9HLCAqUFJUXzgwMl8xMV9FVkVOVF9MT0c7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICBSc3Y7ICAgICAvLyB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkKKyAgICBSVF84MDJfMTFfRVZFTlRfTE9HICAgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfSBSVF84MDJfMTFfRVZFTlRfVEFCTEUsIFBSVF84MDJfMTFfRVZFTlRfVEFCTEU7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworCVVTSE9SVAkJd29yZDsKKyB9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVUNIQVIgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQorICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKKyAgICBDSEFSCQlBdmdSc3NpMDsKKwlDSEFSCQlBdmdSc3NpMTsKKwlDSEFSCQlBdmdSc3NpMjsKKwlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7CisgICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKK30gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7CisgICAgVUxPTkcgICAgICAgTnVtOworICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8vIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSIHsKKyAgICBVTE9ORyAgIEhhcmR3YXJlVHlwZTsgICAgICAgLy8gMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTQorICAgIFVMT05HICAgT2Zmc2V0OyAgICAgICAgICAgICAvLyBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIKKyAgICBVTE9ORyAgIERhdGE7ICAgICAgICAgICAgICAgLy8gUi9XIGRhdGEgYnVmZmVyCit9IFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiwgKlBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVI7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSMTcgIlJYIEFHQyBWR0MgaW5pdCIKKy8vdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORyB7CisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwCisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwMAorLy8gICAgVUNIQVIgICBWZ2NEZWx0YTsgICAgICAgICAgICAgICAgLy8gUjE3ICstPSBWZ2NEZWx0YSB3aGVuZXZlciBmbGFzZSBDQ0Egb3ZlciBVcHByVGhyZXNob2xkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBsb3dlciB0aGFuIExvd2VyVGhyZXNob2xkdXBwZXIgdGhyZXNob2xkCisvLyAgICBVQ0hBUiAgIFZnY1VwcGVyQm91bmQ7ICAgICAgICAgICAvLyBtYXggdmFsdWUgb2YgUjE3CisvL30gUlRfODAyXzExX1JYX0FHQ19WR0NfVFVOSU5HLCAqUFJUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KKyAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQorICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKyAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKK30gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOworCisvLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7CisgICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKKyAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKKyAgICBVTE9ORyAgIEFkaG9jTW9kZTsgCQkJLy8gMC0xMWIgcmF0ZXMgb25seSAoV0lGSSBzcGVjKSwgMSAtIGIvZyBtaXhlZCwgMiAtIGcgb25seQorICAgIFVMT05HICAgSHdSYWRpb1N0YXR1czsgICAgICAvLyAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9TVEFfQ09ORklHLCAqUFJUXzgwMl8xMV9TVEFfQ09ORklHOworCisvLworLy8gIEZvciBPSUQgUXVlcnkgb3IgU2V0IGFib3V0IEJBIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYJc3RydWN0CV9PSURfQkFDQVBfU1RSVUMJeworCQlVQ0hBUgkJUnhCQVdpbkxpbWl0OworCQlVQ0hBUgkJVHhCQVdpbkxpbWl0OworCQlVQ0hBUgkJUG9saWN5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCisJCVVDSEFSCQlNcGR1RGVuc2l0eTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUiAgICAgICAJQW1zZHVFbmFibGU7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUNIQVIgICAgICAgCUFtc2R1U2l6ZTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUNIQVIgICAgICAgCU1NUFNtb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJQk9PTEVBTgkJQXV0b0JBOwkvLyBBdXRvIEJBIHdpbGwgYXV0b21hdGljYWxseQorfSBPSURfQkFDQVBfU1RSVUMsICpQT0lEX0JBQ0FQX1NUUlVDOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FDTF9FTlRSWSB7CisgICAgVUNIQVIgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICBSc3Y7Cit9IFJUXzgwMl8xMV9BQ0xfRU5UUlksICpQUlRfODAyXzExX0FDTF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfQUNMIHsKKyAgICBVTE9ORyAgIFBvbGljeTsgICAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdAorICAgIFVMT05HICAgTnVtOworICAgIFJUXzgwMl8xMV9BQ0xfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9BQ0xdOworfSBSVF84MDJfMTFfQUNMLCAqUFJUXzgwMl8xMV9BQ0w7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTIHsKKyAgICBVTE9ORwkJCQkJCU51bTsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJRW50cnlbMjQvKk1BWF9OVU1fT0ZfV0RTX0xJTksqL107CisJVUxPTkcJCQkJCQlLZXlMZW5ndGg7CisJVUNIQVIJCQkJCQlLZXlNYXRlcmlhbFszMl07Cit9IFJUXzgwMl8xMV9XRFMsICpQUlRfODAyXzExX1dEUzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9UWF9SQVRFU18geworICAgIFVDSEFSICAgICAgIFN1cFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworfSBSVF84MDJfMTFfVFhfUkFURVMsICpQUlRfODAyXzExX1RYX1JBVEVTOworCisKKy8vIERlZmluaXRpb24gb2YgZXh0cmEgaW5mb3JtYXRpb24gY29kZQorI2RlZmluZQlHRU5FUkFMX0xJTktfVVAJCQkweDAJCQkvLyBMaW5rIGlzIFVwCisjZGVmaW5lCUdFTkVSQUxfTElOS19ET1dOCQkweDEJCQkvLyBMaW5rIGlzIERvd24KKyNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCQkJLy8gSGFyZHdhcmUgcmFkaW8gb2ZmCisjZGVmaW5lCVNXX1JBRElPX09GRgkJCTB4MwkJCS8vIFNvZnR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlBVVRIX0ZBSUwJCQkJMHg0CQkJLy8gT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CQkJLy8gU2hhcmVkIGF1dGhlbnRpY2F0aW9uIGZhaWwKKyNkZWZpbmUJQVNTT0NfRkFJTAkJCQkweDYJCQkvLyBBc3NvY2lhdGlvbiBmYWlsZWQKKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CQkJLy8gRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZQorI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0CisjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkJCS8vIEVBUCBzdWNjZWVkCisjZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YiAgICAgICAgIC8vIFJhZGFyIHNpZ25hbCBvY2N1ciBpbiBjdXJyZW50IGNoYW5uZWwKKyNkZWZpbmUgRVhUUkFfSU5GT19NQVgJCQkweGIJCQkvLyBJbmRpY2F0ZSBMYXN0IE9JRAorCisjZGVmaW5lIEVYVFJBX0lORk9fQ0xFQVIJCTB4ZmZmZmZmZmYKKworLy8gVGhpcyBpcyBPSUQgc2V0dGluZyBzdHJ1Y3R1cmUuIFNvIG9ubHkgR0Ygb3IgTU0gYXMgTW9kZS4gVGhpcyBpcyB2YWxpZCB3aGVuIG91ciB3aXJlbHNzIG1vZGUgaGFzIDgwMi4xMW4gaW4gdXNlLgordHlwZWRlZiBzdHJ1Y3QgeworCVJUXzgwMl8xMV9QSFlfTU9ERQkJUGh5TW9kZTsgCS8vCisJVUNIQVIJCVRyYW5zbWl0Tm87CisJVUNIQVIJCUh0TW9kZTsgCS8vSFRNT0RFX0dGIG9yIEhUTU9ERV9NTQorCVVDSEFSCQlFeHRPZmZzZXQ7CS8vZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgb3IgYmVsb3cKKwlVQ0hBUgkJTUNTOworCVVDSEFSICAgCUJXOworCVVDSEFSCQlTVEJDOworCVVDSEFSCQlTSE9SVEdJOworCVVDSEFSCQlyc3Y7Cit9IE9JRF9TRVRfSFRfUEhZTU9ERSwgKlBPSURfU0VUX0hUX1BIWU1PREU7CisKKyNpZmRlZiBOSU5URU5ET19BUAorI2RlZmluZSBOSU5URU5ET19NQVhfRU5UUlkgMTYKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FX0xOIDgKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FICJOV0NVU0JBUCIKKyNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX0ZMQUdfTUFTSyAweDAzCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9PTiAweDAxCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9TSUdOQUwgMHgwMgorI2RlZmluZSBOSU5URU5ET19QUk9CRV9SU1BfT04gMHgwMQorI2RlZmluZSBOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOIDIwCisKKyNkZWZpbmUgTklOVEVORE9fV0VQS0VZX0xOIDEzCisKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TU0lECit7CisJVUNIQVIJTklOVEVORE9GaXhDaGFyW05JTlRFTkRPX1NTSURfTkFNRV9MTl07CisJVUNIQVIJemVybzE7CisJVUNIQVIJcmVnaXN0ZTsKKwlVQ0hBUglJRDsKKwlVQ0hBUgl6ZXJvMjsKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKK30gUlRfTklOVEVORE9fU1NJRCwgKlBSVF9OSU5URU5ET19TU0lEOworCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fRU5UUlkKK3sKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKKyAgICBVQ0hBUiAgIERTX0FkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlVQ0hBUglyZWdpc3RlOworCVVDSEFSCVVzZXJTcGFjZUFjazsKK30gUlRfTklOVEVORE9fRU5UUlksICpQUlRfTklOVEVORE9fRU5UUlk7CisKKy8vUlRQUklWX0lPQ1RMX05JTlRFTkRPX0dFVF9UQUJMRQorLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VUX1RBQkxFCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fVEFCTEUKK3sKKwlVSU5UCQkJCW51bWJlcjsKKwlSVF9OSU5URU5ET19FTlRSWQllbnRyeVtOSU5URU5ET19NQVhfRU5UUlldOworfSBSVF9OSU5URU5ET19UQUJMRSwgKlBSVF9OSU5URU5ET19UQUJMRTsKKworLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VFRF9XRVBLRVkKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TRUVEX1dFUEtFWQoreworCVVDSEFSCXNlZWRbTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTl07CisJVUNIQVIJd2Vwa2V5WzE2XTsvL3VzZSAxMyBmb3IgMTA0IGJpdHMgd2VwIGtleQorfSBSVF9OSU5URU5ET19TRUVEX1dFUEtFWSwgKlBSVF9OSU5URU5ET19TRUVEX1dFUEtFWTsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisjaWZkZWYgTExURF9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSB7CisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgTU9SOyAgICAgICAgLy8gbWF4aW11bSBvcGVyYXRpb25hbCByYXRlCisgICAgVUNIQVIgICAgICAgICAgIHBoeU1vZGU7Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlksICpQUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBOdW07CisgICAgUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFOworI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvL3J0Mjg2MCwga2F0aHkgMjAwNy0wMTE4CisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfVUkgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworfSBSVF84MDJfMTFfRExTX1VJLCAqUFJUXzgwMl8xMV9ETFNfVUk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX0lORk8geworCVJUXzgwMl8xMV9ETFNfVUkJRW50cnlbTUFYX05VTUJFUl9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCW51bTsKK30gUlRfODAyXzExX0RMU19JTkZPLCAqUFJUXzgwMl8xMV9ETFNfSU5GTzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRExTX01PREUgeworICAgIERMU19OT05FLAorICAgIERMU19XQUlUX0tFWSwKKyAgICBETFNfRklOSVNICit9IFJUXzgwMl8xMV9ETFNfTU9ERTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJUlRfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUJUlRfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUJUlRfUkVRSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUJUlRfUkVTUElFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUJUlRfQVNTT0NJTkZPX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgUlRfUE1LSURDQU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgUlRfSU5URVJGQUNFX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgUlRfSU5URVJGQUNFX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCit7CisgICBSdDgwMl8xMV9EX05vbmUsCisgICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAorICAgUnQ4MDJfMTFfRF9TdHJpY3QsCit9IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KK3sKKwlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCit9IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOworCisvLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCit0eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKK3sKKwlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQorCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCisJVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKKwlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCisJVVNIT1JUCQkJCUtleUxlbmd0aDsKKwlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKKwlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCisJVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAorfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKworLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKK3R5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQoreworCVVJTlQJCQlQcm9maWxlQ250OworCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcworfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKKworCisjZW5kaWYgLy8gX09JRF9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjg3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFmNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApAQCAtMCwwICsxLDc2MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg3MF9IX18KKyNkZWZpbmUgX19SVDI4NzBfSF9fCisKKy8vdXNiIGhlYWRlciBmaWxlcworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBydG1wX2RlZi5oICovCisvLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQlVMS0FHR1JFX1pJU0UgICAgICAgICAgMTAwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKF9hLCBwQWQpOworI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3B1dF9kZXYKKyNkZWZpbmUgUlRVU0JfQUxMT0NfVVJCKGlzbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9hbGxvY191cmIoaXNvLCBHRlBfQVRPTUlDKQorI2RlZmluZSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQykKKyNkZWZpbmUJUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcERtYV9hZGRyKSAgICAgICAgICAgICAgIHVzYl9idWZmZXJfYWxsb2MocFVzYl9EZXYsIEJ1ZlNpemUsIEdGUF9BVE9NSUMsIHBEbWFfYWRkcikKKyNkZWZpbmUJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKSAgIHVzYl9idWZmZXJfZnJlZShwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikKKyNlbHNlCisjZGVmaW5lIEJVTEtBR0dSRV9aSVNFICAgICAgICAgIDYwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApCisjZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfYWxsb2NfdXJiKGlzbykKKyNkZWZpbmUgUlRVU0JfU1VCTUlUX1VSQihwVXJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zdWJtaXRfdXJiKHBVcmIpCisjZGVmaW5lIFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikgICAgICAgICAgICAgICBrbWFsbG9jKEJ1ZlNpemUsIEdGUF9BVE9NSUMpCisjZGVmaW5lCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikgICBrZnJlZShwVHJhbnNmZXJCdWYpCisjZW5kaWYKKworI2RlZmluZSBSWEJVTEtBR0dSRV9aSVNFICAgICAgICAxMgorI2RlZmluZSBNQVhfVFhCVUxLX0xJTUlUICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSooQlVMS0FHR1JFX1pJU0UtMSkpCisjZGVmaW5lIE1BWF9UWEJVTEtfU0laRSAgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKkJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfUlhCVUxLX1NJWkUgICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSpSWEJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfTUxNRV9IQU5ETEVSX01FTU9SWSAyMAorI2RlZmluZQlSRVRSWV9MSU1JVCAgICAgICAgICAgICAxMAorI2RlZmluZSBCVUZGRVJfU0laRQkJCQkyNDAwCS8vMjA0OAorI2RlZmluZQlUWF9SSU5HCQkJCQkweGEKKyNkZWZpbmUJUFJJT19SSU5HCQkJCTB4YworCisKKy8vIEZsYWdzIGZvciBCdWxrZmxhZ3MgY29udHJvbCBmb3IgYnVsayBvdXQgZGF0YQorLy8KKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIGZSVFVTQl9CVUxLX09VVF9SVFMJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9NTE1FCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIJCQkweDAwMDIwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNAkJCTB4MDAwODAwMDAKKworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfUFNQT0xMCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcJCQkJMHgwMDAwMDA0MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIJCQkJMHgwMDAwMDA4MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMJCQkJMHgwMDAwMDEwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzQJCQkJMHgwMDAwMDIwMAorCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUJCQkJMHgwMDEwMDAwMAorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2RlZmluZSBSVDI4NzBfVVNCX0RFVklDRVMJXAorewlcCisJe1VTQl9ERVZJQ0UoMHgxNDhGLDB4Mjc3MCl9LCAvKiBSYWxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0OEYsMHgyODcwKX0sIC8qIFJhbGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTQ4RiwweDMwNzApfSwgLyogUmFsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwQjA1LDB4MTczMSl9LCAvKiBBc3VzICovCQkJXAorCXtVU0JfREVWSUNFKDB4MEIwNSwweDE3MzIpfSwgLyogQXN1cyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBCMDUsMHgxNzQyKX0sIC8qIEFzdXMgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAxNyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQil9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyRCl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwNil9LCAvKiBDb25jZXB0cm9uaWMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0QjIsMHgzQzI4KX0sIC8qIENvbmNlcHRyb25pYyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MjAxOSwweEVEMDYpfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCQlcCisJe1VTQl9ERVZJQ0UoMHgyMDE5LDB4QUIyNSl9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0QxLDB4M0MwOSl9LCAvKiBELUxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3RDEsMHgzQzExKX0sIC8qIEQtTGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMDcpfSwgLyogQUwgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MxMil9LCAvKiBBTCAqLyAgICAgICAgICAgXAorCXtVU0JfREVWSUNFKDB4MDUwRCwweDgwNTMpfSwgLyogQmVsa2luICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyMyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyNyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0FBLDB4MDAyRil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QUEsMHgwMDNDKX0sIC8qIENvcmVnYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdBQSwweDAwM0YpfSwgLyogQ29yZWdhICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxOEM1LDB4MDAxMil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEwNDQsMHg4MDBCKX0sIC8qIEdpZ2FieXRlICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNUE5LDB4MDAwNil9LCAvKiBTcGFya2xhbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEI1MjIpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEE2MTgpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweDc1MjIpfSwgLyogQXJjYWR5YW4gKi8JCVwKKwl7VVNCX0RFVklDRSgweDBDREUsMHgwMDIyKX0sIC8qIFpDT00gKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwNTg2LDB4MzQxNil9LCAvKiBaeXhlbCAqLwkJXAorCXtVU0JfREVWSUNFKDB4MENERSwweDAwMjUpfSwgLyogWnl4ZWwgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE3NDAsMHg5NzAxKX0sIC8qIEVuR2VuaXVzICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNzQwLDB4OTcwMil9LCAvKiBFbkdlbml1cyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDQ3MSwweDIwMGYpfSwgLyogUGhpbGlwcyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMjUpfSwgLyogRHJheXRlayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTNEMywweDMyNDcpfSwgLyogQXp1cmVXYXZlICovCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHg2NjE4KX0sIC8qIEFjY3RvbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTVjNSwweDAwMDgpfSwgLyogQW1pdCAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAxKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAzKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEyOUIsMHgxODI4KX0sIC8qIFNpZW1lbnMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE1N0UsMHgzMDBFKX0sCS8qIFUtTWVkaWEgKi8JXAorCXtVU0JfREVWSUNFKDB4MDUwZCwweDgwNWMpfSwJCQkJCVwKKwl7VVNCX0RFVklDRSgweDE0ODIsMHgzQzA5KX0sIC8qIEFib2NvbSovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwOSl9LCAvKiBBbHBoYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDRFOCwweDIwMTgpfSwgLyogc2Ftc3VuZyAqLyAgCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgzMDcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdCOCwweDMwNzEpfSwgLyogQWJvQ29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0I4LDB4Mjg3MCl9LCAvKiBBYm9Db20gKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgyNzcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4NzM5MiwweDc3MTEpfSwgLyogRWRpbWF4ICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4MCl9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4Mil9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Mil9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Myl9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2NCl9LCAvKiBMb2dpdGVjICovCQlcCisJeyB9LyogVGVybWluYXRpbmcgZW50cnkgKi8gICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lCUZSRUVfSFRUWF9SSU5HKF9wLCBfYiwgX3QpCQkJXAorewkJCQkJCQkJCQlcCisJaWYgKChfdCktPkVOZXh0QnVsa091dFBvc2l0aW9uID09IChfdCktPkN1cldyaXRlUG9zaXRpb24pCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCShfdCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCisJLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKK30KKworLy8KKy8vIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhJTkZPX1NUUlVDIHsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCUNpcGhlckFsZzoxOworCVVJTlQzMgkJUGxjcFJzc2lsOjE7CisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCVJTU0k6MTsKKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCUZSQUc6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlCQToxOworfQlSWElORk9fU1RSVUMsICpQUlhJTkZPX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWElORk9fU1RSVUMgeworCVVJTlQzMgkJQkE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgorCVVJTlQzMgkJSFRDOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlMMlBBRDoxOworCVVJTlQzMgkJQU1QRFU6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOworCVVJTlQzMgkJQ2lwaGVyQWxnOjE7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7Cit9CVJYSU5GT19TVFJVQywgKlBSWElORk9fU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBUWElORk8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJX1RYSU5GT19TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlVU0JETUFUeGJ1cnN0OjE7Ly91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmUuIEZvcmNlIFVTQiBETUEgdHJhbnNtaXQgZnJhbWUgZnJvbSBjdXJyZW50IHNlbGVjdGVkIGVuZHBvaW50CisJVUlOVDMyCQlVU0JETUFOZXh0VkxEOjE7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQKKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjo4OworCVVJTlQzMgkJVVNCRE1BVHhQa3RMZW46MTY7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4KK30JVFhJTkZPX1NUUlVDLCAqUFRYSU5GT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlfVFhJTkZPX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVVTQkRNQVR4UGt0TGVuOjE2OwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgIFRvdGFsIGJ5dGUgY291bnRzIG9mIGFsbCBzdWItZnJhbWUuCisJVUlOVDMyCQlyc3Y6ODsKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVVTQkRNQU5leHRWTEQ6MTsJLy91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sIE5leHRWYWxpZAorCVVJTlQzMgkJVVNCRE1BVHhidXJzdDoxOy8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlLiBGb3JjZSBVU0IgRE1BIHRyYW5zbWl0IGZyYW1lIGZyb20gY3VycmVudCBzZWxlY3RlZCBlbmRwb2ludAorfQlUWElORk9fU1RSVUMsICpQVFhJTkZPX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBSWElORk9fU0laRQkJCQk0CisjZGVmaW5lIFRYUEFERElOR19TSVpFCQkJMTEKKworLy8KKy8vIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0CisvLwordHlwZWRlZglzdHJ1Y3QJX01HTVRfU1RSVUMJeworCUJPT0xFQU4JCVZhbGlkOworCVBVQ0hBUgkJcEJ1ZmZlcjsKKwlVTE9ORwkJTGVuZ3RoOworfQlNR01UX1NUUlVDLCAqUE1HTVRfU1RSVUM7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkbyB7CQkJCQkJCQkJCQkJCQlcCisJCVJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKHZhciksIDIpOwkJXAorCQl2YXIgPSBsZTJjcHUxNih2YXIpOwkJCQkJCQkJCVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCVVTSE9SVCBfdG1wVmFyOwkJCQkJCQkJCQkJXAorCQlfdG1wVmFyID0gY3B1MmxlMTYodmFyKTsJCQkJCQkJCVwKKwkJUlRVU0JXcml0ZUVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKF90bXBWYXIpLCAyKTsJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAorCVN0YXR1cyA9IENyZWF0ZVRocmVhZHMobmV0X2Rldik7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIDAKKyNkZWZpbmUgUlQyOFhYX0ZJUk1VRF9JTklUKHBBZCkJCVwKKwl7CVVJTlQzMglNYWNSZWc7CQkJCVwKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7IH0KKworI2RlZmluZSBSVDI4WFhfRklSTVVEX0VORChwQWQpCVwKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMTQsIDB4ZmZmZmZmZmYpOwlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsJXAorCVJUVVNCRmlybXdhcmVSdW4ocEFkKTsKKyNlbHNlCisjZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCVwKKwlSVFVTQkZpcm13YXJlV3JpdGUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAorCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJCXByaW50aygiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KTsJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJfQorI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCisJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKworI2RlZmluZQlSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKKwkJKFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHBBZCwgcFR4QmxrLT5RdWVJZHgsIChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkpID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisKKyNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpIAkJXAorCQkoKF9UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coX3BBZCwgX1F1ZUlkeCkpKQorCisKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKKwkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKKworI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCisJCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKKworI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCisJCQkvKlJ0bXBVU0JEYXRhTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCisJCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKKworCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAorCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIAkxMSAvLyAzKG1heCA0IGJ5dGUgcGFkZGluZykgKyA0IChsYXN0IHBhY2tldCBwYWRkaW5nKSArIDQgKE1heEJ1bGtPdXRzaXplIGFsaWduIHBhZGRpbmcpCisKK2V4dGVybiBVQ0hBUiBFcFRvUXVldWVbNl07CisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSAJKF9RdWVJZHgpIC8vKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSAJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworLy8jZGVmaW5lIFJUMjhYWF9SWF9FUlJPUl9DSEVDSwkJCQlSVE1QQ2hlY2tSeFdJCisKKyNpZiAwCisjZGVmaW5lIFJUMjhYWF9SQ1ZfSU5JVChwQWQpCQkJCQlcCisJcEFkLT5UcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IDA7CQkJCVwKKwlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CQkJCQkJXAorCXBBZC0+cEN1cnJSeENvbnRleHQgPSBOVUxMOworI2VuZGlmCisKKyNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5EKGJCdWxrUmVjZWl2ZSkJCVwKKwkvKiBXZSByZXR1cm4gU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRCBzbyB0aGF0IHRoZSBjb21wbGV0aW9uICovCVwKKwkvKiByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuICovCQlcCisJaWYgKGJCdWxrUmVjZWl2ZSA9PSBUUlVFKQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgMAorI2RlZmluZSBSVDI4WFhfRE1BX1dSSVRFX0lOSVQoR2xvQ2ZnKQkJCVwKKwl7CUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwlcCisJCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CQkJXAorCQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOyB9CisKKyNkZWZpbmUgUlQyOFhYX0RNQV9QT1NUX1dSSVRFKF9wQWQpCQkJCVwKKwlkb3sJVVNCX0RNQV9DRkdfU1RSVUMJVXNiQ2ZnOwkJCQlcCisJCVVzYkNmZy53b3JkID0gMDsJCQkJCQlcCisJCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8gXAorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsJXAorCQlVc2JDZmcuZmllbGQucGh5Y2xlYXIgPSAwOwkJCQkJCQkJXAorCQkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCVwKKwkJaWYgKF9wQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQkJCQkJXAorCQkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0VuID0gMTsJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsgLyogMjAwNi0xMC0xOCAqLwkJXAorCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX3BBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsgCVwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisvLyByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4RkZGRkZGRkZGRkZGCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJCQkJCVwKKwl7CVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJXAorCQlTZXRBc2ljV2NpZC5XQ0lEID0gV2NpZDsJCQkJCQkJCVwKKwkJU2V0QXNpY1djaWQuU2V0VGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCisJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAorCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAJXAorCQkJCSZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJfQorCisvLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSwgCVwKKwkJCQkJCQlwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKworLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCisvLyB5ZXQgaW1wbGVtZW50CisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkKKworLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQkJCVwKKwl7CVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgcEVudHJ5LT5BaWQpOwkJCQkJCQkJXAorCQlpZiAocEVudHJ5LT5BaWQgPj0gMSkgewkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRF9BVFRSSQlTZXRBc2ljV2NpZEF0dHJpOwkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWRBdHRyaS5XQ0lEID0gcEVudHJ5LT5BaWQ7CQkJCQkJCQkJXAorCQkJaWYgKChwRW50cnktPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCQkJCVwKKwkJCQkocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSAwOwkJCQkJCQkJCQlcCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhaWQgY2lwaGVyID0gJWxkXG4iLFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7ICAgICAgIFwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSLCAJCQlcCisJCQkJCQkJJlNldEFzaWNXY2lkQXR0cmksIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJKSk7IH0gfQorCisvLyBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQorI2RlZmluZSBSVDI4WFhfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfQWlkKTsJCQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKy8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfV2NpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4ZmZmZmZmZmYpOwkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAoMHgxMDAwMDw8KF9USUQpICk7CQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUENJL1VTQiBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKQkJCVwKKwkoKFBPU19DT09LSUUpaGFuZGxlKS0+cFVzYl9EZXYgPSBkZXZfcDsKKworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9VTk1BUCgpCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQorI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKyNkZWZpbmUgUlQyOFhYX0lSUV9JTklUKHBBZCkKKyNkZWZpbmUgUlQyOFhYX0lSUV9FTkFCTEUocEFkKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCkJCQlSVFVTQk1sbWVVcChwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpCQkJCQkJCQlcCisJewlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpICYmIAkJCQkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCQlcCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfQ0hFQ0tfR1BJTywgTlVMTCwgMCk7IH0gfQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQsIE5VTEwsIDApOwlcCisJCVJUVVNCTWxtZVVwKHBBZCk7IH0KKworI2RlZmluZSBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQkgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRVNFVF9DT05GLCAwLCBOVUxMKTsJXAorCQkgICAgICAgIFJUVVNCTWxtZVVwKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSkJCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKF9wQWQsIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFLCBfcEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CVwKKwkJUlRVU0JNbG1lVXAoX3BBZCk7CQkJCQkJCQkJXAorCX0KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCQkJXAorCXsJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOwlcCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsgfQorCisjZGVmaW5lIFJUMjh4eF9DSElQX05BTUUgICAgICAgICAgICAiUlQyODcwIgorI2RlZmluZSBVU0JfQ1lDX0NGRyAgICAgICAgICAgICAgICAgMHgwMmE0CisjZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKKyNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAJCTB4MDEKKyNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+IDApID8gKDEpOigwKSkKKyNkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgCSAJYXRvbWljX2luYworI2RlZmluZSBOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQgCWF0b21pY19pbmMKKyNkZWZpbmUgSW50ZXJsb2NrZWREZWNyZW1lbnQJCWF0b21pY19kZWMKKyNkZWZpbmUgTmRpc0ludGVybG9ja2VkRGVjcmVtZW50IAlhdG9taWNfZGVjCisjZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCQlhdG9taWNfc2V0CisvLyNkZWZpbmUgTmRpc01TZW5kQ29tcGxldGUJCQlSVE1QX1NlbmRDb21wbGV0ZQorI2RlZmluZSBOZGlzTUNhbmNlbFRpbWVyCQkJUlRNUENhbmNlbFRpbWVyCisjZGVmaW5lIE5kaXNBbGxvY01lbW9yeShfcHRyLCBfc2l6ZSwgX2ZsYWcpCVwKKwkJCQkJCQkJCWRve19wdHIgPSBrbWFsbG9jKChfc2l6ZSksKF9mbGFnKSk7fXdoaWxlKDApCisjZGVmaW5lIE5kaXNGcmVlTWVtb3J5KGEsIGIsIGMpIAlrZnJlZSgoYSkpCisjZGVmaW5lIE5kaXNNU2xlZXAJCQkJCVJUTVB1c2VjRGVsYXkJCS8qIHVuaXQ6IG1pY3Jvc2Vjb25kICovCisKKworI2RlZmluZSBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQJCTAKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4JCTAKKyNkZWZpbmUgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSwkJCTAKKyNkZWZpbmUgUFVSQgkJCXB1cmJiX3QKKworI2RlZmluZSBSVFVTQl9GUkVFX1VSQihwVXJiKQl1c2JfZnJlZV91cmIocFVyYikKKworLy8jdW5kZWYgTWxtZUFsbG9jYXRlTWVtb3J5CisvLyN1bmRlZiBNbG1lRnJlZU1lbW9yeQorCit0eXBlZGVmIGludAkJCQlOVFNUQVRVUzsKK3R5cGVkZWYgc3RydWN0IHVzYl9kZXZpY2UJKiBQVVNCX0RFVjsKKworLyogTUFDUk8gZm9yIGxpbnV4IHVzYiAqLwordHlwZWRlZiBzdHJ1Y3QgdXJiICpwdXJiYl90OwordHlwZWRlZiBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGRldmN0cmxyZXF1ZXN0OworI2RlZmluZSBQSVJQCQlQVk9JRAorI2RlZmluZSBQTURMCQlQVk9JRAorI2RlZmluZSBORElTX09JRAlVSU5UCisjaWZuZGVmIFVTQl9TVF9OT0VSUk9SCisjZGVmaW5lIFVTQl9TVF9OT0VSUk9SICAgICAwCisjZW5kaWYKKworLy8gdmVuZG9yLXNwZWNpZmljIGNvbnRyb2wgb3BlcmF0aW9ucworI2RlZmluZSBDT05UUk9MX1RJTUVPVVRfSklGRklFUyAoICgxMDAgKiBIWikgLyAxMDAwKQorI2RlZmluZSBVTkxJTktfVElNRU9VVF9NUwkJMworCisvKiB1bmxpbmsgdXJiCSovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiw3KQorI2RlZmluZSBSVFVTQl9VTkxJTktfVVJCKHBVcmIpCQl1c2Jfa2lsbF91cmIocFVyYikKKyNlbHNlCisjZGVmaW5lIFJUVVNCX1VOTElOS19VUkIocFVyYikJCXVzYl91bmxpbmtfdXJiKHBVcmIpCisjZW5kaWYKKworLy8gUHJvdG90eXBlcyBvZiBjb21wbGV0aW9uIGZ1bnVjLgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYiwgcHRfcmVncykgICAgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZGVmaW5lIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwVXJiLCBwdF9yZWdzKSAgICBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocFVyYikKKyNkZWZpbmUgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgICBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwVXJiKQorI2RlZmluZSBSVFVTQkJ1bGtSeENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICAgICAgICAgUlRVU0JCdWxrUnhDb21wbGV0ZShwVXJiKQorI2VuZGlmCisKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCisKKyNkZWZpbmUgUlRVU0JNbG1lVXAocEFkKQkgICAgICAgIFwKK3sJCQkJCQkJCSAgICBcCisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwlcCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPk1MTUVUaHJfcGlkKQkJICAgIFwKKyAgICAgICAgdXAoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7IFwKK30KKworI2RlZmluZSBSVFVTQkNNRFVwKHBBZCkJICAgICAgICAgICAgICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAorCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCSAgICBcCisJICAgIHVwKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsgXAorfQorCisKK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTWVtb3J5KAorCU9VVCBQVk9JRCAqcHRyLAorCUlOIHNpemVfdCBzaXplKQoreworCSpwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCWlmKCpwdHIpCisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWVsc2UKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKK30KKworLyogcnRtcC5oICovCisjZGVmaW5lCUJFQUNPTl9SSU5HX1NJWkUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgICAgIDB4NDAKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAgICAweGMwCisjZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQorI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKKyNkZWZpbmUgTUdNVFBJUEVJRFgJCQkJCQkwCS8vIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5CisKKyNkZWZpbmUgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcJCQkJMHg4MAorCisjZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkJCQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCQkJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoKF9NKS0+QnVsa0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBFbnF1ZXVlQ21kKGNtZHEsIGNtZHFlbG10KQkJXAorewkJCQkJCQkJCQlcCisJaWYgKGNtZHEtPnNpemUgPT0gMCkJCQkJXAorCQljbWRxLT5oZWFkID0gY21kcWVsbXQ7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJY21kcS0+dGFpbC0+bmV4dCA9IGNtZHFlbG10OwlcCisJY21kcS0+dGFpbCA9IGNtZHFlbG10OwkJCQlcCisJY21kcWVsbXQtPm5leHQgPSBOVUxMOwkJCQlcCisJY21kcS0+c2l6ZSsrOwkJCQkJCVwKK30KKwordHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRCB7CisJVUxPTkcgV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBTZXRUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworCVVMT05HIERlbGV0ZVRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCisJVUNIQVIgQWRkcltNQUNfQUREUl9MRU5dOwkvLyBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKK30gUlRfU0VUX0FTSUNfV0NJRCwqUFJUX1NFVF9BU0lDX1dDSUQ7CisKK3R5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSURfQVRUUkkgeworCVVMT05HCVdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcJQ2lwaGVyOyAgICAgICAgLy8gQVNJQyBDaXBoZXIgZGVmaW5pdGlvbgorCVVDSEFSCUFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKK30gUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSwqUFJUX1NFVF9BU0lDX1dDSURfQVRUUkk7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgeworCVBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgLy9Qb2ludGVyIHRvIHRoZSBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorCXN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUICAgICAgKk5leHQ7ICAgICAgLy9Qb2ludGVyIHRvIHRoZSBuZXh0IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorfSAgIE1MTUVfTUVNT1JZX1NUUlVDVCwgKlBNTE1FX01FTU9SWV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0ICBfTUxNRV9NRU1PUllfSEFORExFUiB7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgTWVtUnVubmluZzsgICAgICAgICAvL1RoZSBmbGFnIG9mIHRoZSBNbG1lIG1lbW9yeSBoYW5kbGVyJ3Mgc3RhdHVzCisJVUlOVCAgICAgICAgICAgICAgICAgICAgTWVtb3J5Q291bnQ7ICAgICAgICAvL1RvdGFsIG5vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgbm90IHNpemUKKwlVSU5UICAgICAgICAgICAgICAgICAgICBJblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBpbiB1c2VkIGNvdW50cworCVVJTlQgICAgICAgICAgICAgICAgICAgIFVuVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGF2YWlsYWJsZSBjb3VudHMKKwlJTlQgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb3VudDsgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGZvciBmcmVlIGNvdW50cworCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWVkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCisJUFVMT05HICAgICAgICAgICAgICAgICAgTWVtRnJlZVBlbmRpbmdbTUFYX01MTUVfSEFORExFUl9NRU1PUlldOyAgIC8vYW4gYXJyYXkgdG8ga2VlcCBwZW5kaW5nIGZyZWUtbWVtb3J5J3MgcG9pbnRlciAoMzJiaXRzKQorfSAgIE1MTUVfTUVNT1JZX0hBTkRMRVIsICpQTUxNRV9NRU1PUllfSEFORExFUjsKKwordHlwZWRlZglzdHJ1Y3QgX0NtZFFFbG10CXsKKwlVSU5UCQkJCWNvbW1hbmQ7CisJUFZPSUQJCQkJYnVmZmVyOworCVVMT05HCQkJCWJ1ZmZlcmxlbmd0aDsKKwlCT09MRUFOCQkJCUNtZEZyb21OZGlzOworCUJPT0xFQU4JCQkJU2V0T3BlcmF0aW9uOworCXN0cnVjdCBfQ21kUUVsbXQJKm5leHQ7Cit9CUNtZFFFbG10LCAqUENtZFFFbG10OworCit0eXBlZGVmCXN0cnVjdAlfQ21kUQl7CisJVUlOVAkJc2l6ZTsKKwlDbWRRRWxtdAkqaGVhZDsKKwlDbWRRRWxtdAkqdGFpbDsKKwlVSU5UMzIJCUNtZFFTdGF0ZTsKK31DbWRRLCAqUENtZFE7CisKKy8vCisvLyBGb3IgV1BBIFNVUFBMSUNBTlQ6IFdJUkVMRVNTIEVYVCBzdXBwb3J0IHdpcmVsZXNzIGV2ZW50czogdjE0IG9yIG5ld2VyCisvLworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNAorLy8jZGVmaW5lIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgIDEKKyNlbmRpZgorCisvKiBvaWQuaCAqLworLy8gQ2lwaGVyIHN1aXRlIHR5cGUgZm9yIG1peGVkIG1vZGUgZ3JvdXAgY2lwaGVyLCBQODAyLjExaS0yMDA0Cit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSB7CisJQ2lwaGVyX1R5cGVfTk9ORSwKKwlDaXBoZXJfVHlwZV9XRVA0MCwKKwlDaXBoZXJfVHlwZV9US0lQLAorCUNpcGhlcl9UeXBlX1JTVkQsCisJQ2lwaGVyX1R5cGVfQ0NNUCwKKwlDaXBoZXJfVHlwZV9XRVAxMDQKK30gUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFLCAqUFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRTsKKworLy9DTURUSFJFQURfTVVMVElfUkVBRF9NQUMKKy8vQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQworLy9DTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFECisvL0NNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFCit0eXBlZGVmCXN0cnVjdAlfQ01ESGFuZGxlcl9UTFYJeworCVVTSE9SVAkJT2Zmc2V0OworCVVTSE9SVAkJTGVuZ3RoOworCVVDSEFSCQlEYXRhRmlyc3Q7Cit9CUNNREhhbmRsZXJfVExWLCAqUENNREhhbmRsZXJfVExWOworCisvLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDEJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfVU5QTFVHICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9TV0lUQ0hfRlVOQ1RJT04gICAgICAgICAgICAweDBENzMwMTAzCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfTVVMVElfV1JJVEVfTUFDICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDcJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9SRUFEX01BQyAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fV1JJVEUgICAgICAgICAgICAgICAweDBENzMwMTBBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFEICAgICAgICAgICAgICAgIDB4MEQ3MzAxMEIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRU5URVJfVEVTVE1PREUgICAgICAgICAgICAgMHgwRDczMDEwQwkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FWElUX1RFU1RNT0RFICAgICAgICAgICAgICAweDBENzMwMTBECS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX0JCUCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTkJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVBRF9CQlAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9SRiAgICAgICAgICAgICAgICAgICAweDBENzMwMTFBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0ZMSVBfSVEgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUQJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gICAgICAgICAgICAgICAgICAgICAweDBENzMwMjExCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX1BTTV9CSVRfU0FWRSAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUkFESU8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE2CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0FERF9LRVlfV0VQICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTgJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0xJTktfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjFCCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9ORElTICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9DSEVDS19HUElPICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjIyCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX0JXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjUJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSICAgICAgICAgICAgICAweDBENzMwMjI3CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyM0QJLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfS0VZX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOCAgLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOSAgLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSAgICAgICAgICAgICAgMHgwRDczMDIzRQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9RVUVSWV9IQVJEV0FSRV9SRUdJU1RFUiAgICAweDBENzEwMTA1CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QSFlfTU9ERSAgICAgICAgICAgICAgIDB4MEQ3OTAxMEMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgICAgICAgICAgICAgMHgwRDc5MDExMQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUFJFQU1CTEUgICAgICAgICAgICAgICAweDBENzkwMTAxCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRQkJCTB4MEQ3OTAxMDIJLy8gY21kCisKKworI2RlZmluZSBXUEExQUtNQklUCSAgICAweDAxCisjZGVmaW5lIFdQQTJBS01CSVQJICAgIDB4MDIKKyNkZWZpbmUgV1BBMVBTS0FLTUJJVCAgIDB4MDQKKyNkZWZpbmUgV1BBMlBTS0FLTUJJVCAgIDB4MDgKKyNkZWZpbmUgVEtJUEJJVCAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0NNUEJJVCAgICAgICAgIDB4MDIKKworCisjZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLy9fX1JUMjg3MF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyOHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjdkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCkBAIC0wLDAgKzEsMjY4OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydDI4eHguaAorCisJQWJzdHJhY3Q6CisJUlQyOHh4IEFTSUMgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIEphbiBMZWUgICAgICAgICAgIEphbi0zLTIwMDYgICAgIGNyZWF0ZWQgZm9yIFJUMjg2MGMKKyovCisKKyNpZm5kZWYJX19SVDI4WFhfSF9fCisjZGVmaW5lCV9fUlQyOFhYX0hfXworCisKKy8vCisvLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAorLy8KKyNkZWZpbmUgUENJX0NGRwkJCTB4MDAwMAorI2RlZmluZSBQQ0lfRUVDVFJMCQkJMHgwMDA0CisjZGVmaW5lIFBDSV9NQ1VDVFJMCQkJMHgwMDA4CisKKy8vCisvLyBTQ0gvRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAyMDAKKy8vCisvLyBJTlRfU09VUkNFX0NTUjogSW50ZXJydXB0IHNvdXJjZSByZWdpc3Rlci4gV3JpdGUgb25lIHRvIGNsZWFyIGNvcnJlc3BvbmRpbmcgYml0CisvLworI2RlZmluZSBETUFfQ1NSMCAgICAgIDB4MjAwCisjZGVmaW5lIElOVF9TT1VSQ0VfQ1NSICAgICAgMHgyMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlHUFRpbWVyOjE7CisJCVVJTlQzMiAgICAgICAJQXV0b1dha2V1cDoxOy8vYml0MTQKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlQcmVUQlRUOjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVJ4VHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsJLy9kZWxheWVkIGludGVycnVwdCwgbm90IGludGVycnVwdCB1bnRpbCBzZXZlcmFsIGludCBvciB0aW1lIGxpbWl0IGhpdAorCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsgLy9kZWFseWVkIGludGVycnVwdAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSU5UX1NPVVJDRV9DU1JfU1RSVUMsICpQSU5UX1NPVVJDRV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhEZWxheUlOVDoxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ly80CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsgLy8gYml0NworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOy8vYml0IDkKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7CisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsvL2JpdDE2CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToxNDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBJTlRfTUFTS19DU1I6ICAgSW50ZXJydXB0IE1BU0sgcmVnaXN0ZXIuICAgMTogdGhlIGludGVycnVwdCBpcyBtYXNrIE9GRgorLy8KKyNkZWZpbmUgSU5UX01BU0tfQ1NSICAgICAgICAweDIwNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToyMDsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCQlVSU5UMzIJCVR4RGVsYXk6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfR0xPX0NGRyAJMHgyMDgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJQmlnRW5kaWFuOjE7CisJCVVJTlQzMiAgICAgICAJRW5UWFdyaXRlQmFja0RET05FOjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVSeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJCVVJTlQzMgkJVHhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfUlNUX0lEWCAJMHgyMGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCToxNTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgREVMQVlfSU5UX0NGRyAgMHgwMjEwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfREVMQVlfSU5UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9REVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2VuZGlmCisvLworLy8gQ1dNSU5fQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCisvLworI2RlZmluZSBXTU1fQ1dNSU5fQ0ZHICAgMHgwMjE4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEN3bWluMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIENXTUFYX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUFYX0NGRyAgIDB4MDIxYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21heDE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIEFDX1RYT1BfQ1NSMTogQUNfVk8vQUNfVkkgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AxX0NGRyAgICAweDAyMjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzJUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzNUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMV9TVFJVQywgKlBBQ19UWE9QX0NTUjFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUklOR1JFR19ESUZGCQkJMHgxMAorI2RlZmluZSBHUElPX0NUUkxfQ0ZHICAgIDB4MDIyOAkvL01BQ19DU1IxMworI2RlZmluZSBNQ1VfQ01EX0NGRyAgICAweDAyMmMKKyNkZWZpbmUgVFhfQkFTRV9QVFIwICAgICAweDAyMzAJLy9BQ19CSyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDAgICAgICAweDAyMzQKKyNkZWZpbmUgVFhfQ1RYX0lEWDAgICAgICAgMHgwMjM4CisjZGVmaW5lIFRYX0RUWF9JRFgwICAgICAgMHgwMjNjCisjZGVmaW5lIFRYX0JBU0VfUFRSMSAgICAgMHgwMjQwIAkvL0FDX0JFIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMSAgICAgIDB4MDI0NAorI2RlZmluZSBUWF9DVFhfSURYMSAgICAgICAweDAyNDgKKyNkZWZpbmUgVFhfRFRYX0lEWDEgICAgICAweDAyNGMKKyNkZWZpbmUgVFhfQkFTRV9QVFIyICAgICAweDAyNTAgCS8vQUNfVkkgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQyICAgICAgMHgwMjU0CisjZGVmaW5lIFRYX0NUWF9JRFgyICAgICAgIDB4MDI1OAorI2RlZmluZSBUWF9EVFhfSURYMiAgICAgIDB4MDI1YworI2RlZmluZSBUWF9CQVNFX1BUUjMgICAgIDB4MDI2MCAJLy9BQ19WTyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDMgICAgICAweDAyNjQKKyNkZWZpbmUgVFhfQ1RYX0lEWDMgICAgICAgMHgwMjY4CisjZGVmaW5lIFRYX0RUWF9JRFgzICAgICAgMHgwMjZjCisjZGVmaW5lIFRYX0JBU0VfUFRSNCAgICAgMHgwMjcwIAkvL0hDQ0EgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQ0ICAgICAgMHgwMjc0CisjZGVmaW5lIFRYX0NUWF9JRFg0ICAgICAgIDB4MDI3OAorI2RlZmluZSBUWF9EVFhfSURYNCAgICAgIDB4MDI3YworI2RlZmluZSBUWF9CQVNFX1BUUjUgICAgIDB4MDI4MCAJLy9NR01UIGJhc2UgYWRkcmVzcworI2RlZmluZSAgVFhfTUFYX0NOVDUgICAgIDB4MDI4NAorI2RlZmluZSBUWF9DVFhfSURYNSAgICAgICAweDAyODgKKyNkZWZpbmUgVFhfRFRYX0lEWDUgICAgICAweDAyOGMKKyNkZWZpbmUgVFhfTUdNVE1BWF9DTlQgICAgICBUWF9NQVhfQ05UNQorI2RlZmluZSBUWF9NR01UQ1RYX0lEWCAgICAgICBUWF9DVFhfSURYNQorI2RlZmluZSBUWF9NR01URFRYX0lEWCAgICAgIFRYX0RUWF9JRFg1CisjZGVmaW5lIFJYX0JBU0VfUFRSICAgICAweDAyOTAgCS8vUlggYmFzZSBhZGRyZXNzCisjZGVmaW5lIFJYX01BWF9DTlQgICAgICAweDAyOTQKKyNkZWZpbmUgUlhfQ1JYX0lEWCAgICAgICAweDAyOTgKKyNkZWZpbmUgUlhfRFJYX0lEWCAgICAgIDB4MDI5YworI2RlZmluZSBVU0JfRE1BX0NGRyAgICAgIDB4MDJhMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4CisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMTAyNCBieXRlcworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAyNTYgYnl0ZXMKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQKKwkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeQorCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyAgMyAgUEJGICByZWdpc3RlcnMKKy8vCisvLworLy8gTW9zdCBhcmUgZm9yIGRlYnVnLiBEcml2ZXIgZG9lc24ndCB0b3VjaCBQQkYgcmVnaXN0ZXIuCisjZGVmaW5lIAlQQkZfU1lTX0NUUkwgCSAweDA0MDAKKyNkZWZpbmUgICAgIFBCRl9DRkcgICAgICAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSAJUEJGX01BWF9QQ05UIAkgMHgwNDBDCisjZGVmaW5lIAlQQkZfQ1RSTAkgCTB4MDQxMAorI2RlZmluZSAJUEJGX0lOVF9TVEEJIDB4MDQxNAorI2RlZmluZSAJUEJGX0lOVF9FTkEJIDB4MDQxOAorI2RlZmluZSAJVFhSWFFfUENOVCAgCSAweDA0MzgKKyNkZWZpbmUgCVBCRl9EQkcgCSAJIDB4MDQzYworI2RlZmluZSAgICAgUEJGX0NBUF9DVFJMICAgICAweDA0NDAKKworLy8KKy8vICA0ICBNQUMgIHJlZ2lzdGVycworLy8KKy8vCisvLyAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKQorLy8KKyNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAorCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CQkvL01BQ19DU1IxCisjZGVmaW5lIE1BQ19BRERSX0RXMCAgICAgICAgICAgIAkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKKyNkZWZpbmUgTUFDX0FERFJfRFcxICAgICAgICAgICAJCSAweDEwMGMJCS8vIE1BQyBBRERSIERXMQorLy8KKy8vIE1BQ19DU1IyOiBTVEEgTUFDIHJlZ2lzdGVyIDAKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlVMk1lTWFzazsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMCAgICAgICAgICAgIAkJMHgxMDEwCQkvLyBNQUMgQlNTSUQgRFcwCisjZGVmaW5lIE1BQ19CU1NJRF9EVzEgICAgICAgICAgICAJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQorCisvLworLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1CisJCVVTSE9SVCAgICAgIAlCc3NJZE1hc2s6MjsgLy8gMDogb25lIEJTU0lELCAxMDogNCBCU1NJRCwgIDAxOiAyIEJTU0lEICwgMTE6IDhCU1NJRAorCQlVU0hPUlQJCU1Cc3NCY25OdW06MzsKKwkJVVNIT1JUCQlSc3ZkOjExOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBNQVhfTEVOX0NGRyAgICAgICAgICAgICAgMHgxMDE4CQkvLyBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2CisjZGVmaW5lIEJCUF9DU1JfQ0ZHICAgICAgICAgICAgCQkweDEwMWMJCS8vCisvLworLy8gQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTI7CisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAorCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCToxMjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcwICAgICAgICAgICAgCQkweDEwMjAKKy8vCisvLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzEgICAgICAgICAgIAkJMHgxMDI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcyICAgICAgICAgICAJCTB4MTAyOAkJLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlyc3Y6ODsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEVEX0NGRyAgICAgICAgICAgCQkweDEwMmMJCS8vICBNQUNfQ1NSMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxOworCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKKwkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCisJCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcworCQlVSU5UMzIJCXJzdjoyOworCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKKwkJVUlOVDMyCQk6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApCisvLworI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkJIC8vIE1BQ19DU1I4ICBNQUNfQ1NSOQorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBDY2ttU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBDQ0sgUlgvVFgKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBFSUZTOjk7ICAgICAgICAvLyAgdW5pdCAxdXMKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgcnN2OjI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CQkgLy8gIG1hY19jc3I5IGxhc3QgOCBiaXRzCisjZGVmaW5lIE5BVl9USU1FX0NGRyAgICAgICAgICAgICAweDExMDgJCSAvLyBOQVYgIChNQUNfQ1NSMTUpCisjZGVmaW5lIENIX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwQwkJIAkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKKyNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCisjZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKKworI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKKyNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCisKKy8vCisvLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZworCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCisgICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOworCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOCAgCQkvLyB0eHJ4X2NzcjEwCisjZGVmaW5lIFRTRl9USU1FUl9EVzAgICAgICAgICAgICAgMHgxMTFDICAJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5CisjZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwICAJCS8vIG1zYiAzMiBiaXRzLiBSZWFkLW9ubHkuCisjZGVmaW5lIFRCVFRfVElNRVIgICAgICAgICAgICAgCTB4MTEyNCAgCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0CisjZGVmaW5lIElOVF9USU1FUl9DRkcgICAgICAgICAgICAgIAkweDExMjggIAkJLy8KKyNkZWZpbmUgSU5UX1RJTUVSX0VOICAgICAgICAgICAgIAkweDExMmMgIAkJLy8gIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlCisjZGVmaW5lIENIX0lETEVfU1RBICAgICAgICAgICAgICAJMHgxMTMwICAJCS8vICBjaGFubmVsIGlkbGUgdGltZQorI2RlZmluZSBDSF9CVVNZX1NUQSAgICAgICAgICAgICAgCTB4MTEzNCAgCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKKy8vCisvLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCisvLworI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKKyNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKKy8vCisvLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxNjsKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyCQk6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKKy8vCisKKyNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0CisjZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKKyNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAorI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cworCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQorCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgorCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0CisjZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKKyNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQworI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCisjZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKKyNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4CisjZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6CisjZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAorI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKKyNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4CisjZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKKyNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCisjZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo3OworCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3YyOjg7CisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQorCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKKwkgICAgVUlOVDMyICAgICAgIHJzdjo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQorCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6MTsKKwkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCisJICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICByc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PSBQcm90ZWN0aW9uIFBhcmFtYXRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQ0NLX1BST1RfQ0ZHCTB4MTM2NAkJLy9DQ0sgUHJvdGVjdGlvbgorI2RlZmluZSBBU0lDX1NIT1JUTkFWCQkxCisjZGVmaW5lIEFTSUNfTE9OR05BVgkJMgorI2RlZmluZSBBU0lDX1JUUwkJMQorI2RlZmluZSBBU0lDX0NUUwkJMgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICByc3Y6NTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgT0ZETV9QUk9UX0NGRwkweDEzNjgJCS8vT0ZETSBQcm90ZWN0aW9uCisjZGVmaW5lIE1NMjBfUFJPVF9DRkcJMHgxMzZDCQkvL01NMjAgUHJvdGVjdGlvbgorI2RlZmluZSBNTTQwX1BST1RfQ0ZHCTB4MTM3MAkJLy9NTTQwIFByb3RlY3Rpb24KKyNkZWZpbmUgR0YyMF9QUk9UX0NGRwkweDEzNzQJCS8vR0YyMCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGNDBfUFJPVF9DRkcJMHgxMzc4CQkvL0dSNDAgUHJvdGVjdGlvbgorI2RlZmluZSBFWFBfQ1RTX1RJTUUJMHgxMzdDCQkvLworI2RlZmluZSBFWFBfQUNLX1RJTUUJMHgxMzgwCQkvLworCisvLworLy8gIDQuNCBNQUMgUlggY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDE0MDApCisvLworI2RlZmluZSBSWF9GSUxUUl9DRkcJMHgxNDAwCQkJLy9UWFJYX0NTUjAKKyNkZWZpbmUgQVVUT19SU1BfQ0ZHCTB4MTQwNAkJCS8vVFhSWF9DU1I0CisvLworLy8gVFhSWF9DU1I0OiBBdXRvLVJlc3BvbmRlci8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBMRUdBQ1lfQkFTSUNfUkFURQkweDE0MDgJLy8gIFRYUlhfQ1NSNSAgICAgICAgICAgMHgzMDU0CisjZGVmaW5lIEhUX0JBU0lDX1JBVEUJCTB4MTQwYworI2RlZmluZSBIVF9DVFJMX0NGRwkJMHgxNDEwCisjZGVmaW5lIFNJRlNfQ09TVF9DRkcJCTB4MTQxNAorI2RlZmluZSBSWF9QQVJTRVJfQ0ZHCQkweDE0MTgJLy9TZXQgTkFWIGZvciBhbGwgcmVjZWl2ZWQgZnJhbWVzCisKKy8vCisvLyAgNC41IE1BQyBTZWN1cml0eSBjb25maWd1cmF0aW9uIChvZmZzZXQ6MHgxNTAwKQorLy8KKyNkZWZpbmUgVFhfU0VDX0NOVDAJCTB4MTUwMAkJLy8KKyNkZWZpbmUgUlhfU0VDX0NOVDAJCTB4MTUwNAkJLy8KKyNkZWZpbmUgQ0NNUF9GQ19NVVRFCQkweDE1MDgJCS8vCisvLworLy8gIDQuNiBIQ0NBL1BTTVAgKG9mZnNldDoweDE2MDApCisvLworI2RlZmluZSBUWE9QX0hMRFJfQUREUjAJCTB4MTYwMAorI2RlZmluZSBUWE9QX0hMRFJfQUREUjEJCTB4MTYwNAorI2RlZmluZSBUWE9QX0hMRFJfRVQJCTB4MTYwOAorI2RlZmluZSBRT1NfQ0ZQT0xMX1JBX0RXMAkJMHgxNjBjCisjZGVmaW5lIFFPU19DRlBPTExfQTFfRFcxCQkweDE2MTAKKyNkZWZpbmUgUU9TX0NGUE9MTF9RQwkJMHgxNjE0CisvLworLy8gIDQuNyBNQUMgU3RhdGlzdGlzIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTcwMCkKKy8vCisjZGVmaW5lIFJYX1NUQV9DTlQwCQkweDE3MDAJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQxCQkweDE3MDQJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQyCQkweDE3MDgJCS8vCisKKy8vCisvLyBSWF9TVEFfQ05UMF9TVFJVQzogUlggUExDUCBlcnJvciBjb3VudCAmIFJYIENSQyBlcnJvciBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCSAgICBVU0hPUlQgIFBoeUVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMV9TVFJVQzogUlggRmFsc2UgQ0NBIGNvdW50ICYgUlggTE9ORyBmcmFtZSBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQbGNwRXJyOworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgRmFsc2VDY2E7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMl9TVFJVQzoKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQwCQkweDE3MEMJCS8vCisvLworLy8gU1RBX0NTUjM6IFRYIEJlYWNvbiBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJCS8vCisvLworLy8gVFhfU1RBX0NOVDE6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDIJCTB4MTcxNAkJLy8KKy8vCisvLyBUWF9TVEFfQ05UMjogVFggdHggY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfRklGTwkJMHgxNzE4CQkvLworLy8KKy8vIFRYX1NUQV9GSUZPX1NUUlVDOiBUWCBSZXN1bHQgZm9yIHNwZWNpZmljIFBJRCBzdGF0dXMgZmlmbyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCQlVSU5UMzIJCVR4QkY6MTsgLy8gMyozCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gYWNrIHJlcXVpcmVkCisJCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBpcyBhZ2dyZWdhdGVkCisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggc3VjY2Vzcy4gd2hldGhlciBzdWNjZXNzIG9yIG5vdAorCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggTm8gcmV0cnkgc3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggUmV0cnkgU3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gVHggZmFpbAorCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4CisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlUeEJGOjE7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMAkweDE3MjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMQkweDE3MjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMwkweDE3MmMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UNAkweDE3MzAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ1CTB4MTczNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNgkJMHgxNzM4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ3CQkweDE3M2MKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTVBEVV9ERU5TSVRZX0NOVAkJMHgxNzQwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOworI2VuZGlmCisvLworLy8gVFhSWCBjb250cm9sIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDMwMDAKKy8vCisvLyBydDI4NjBiICBVTktOT1dOIHJlZyB1c2UgUi9PIFJlZyBBZGRyIDB4NzdkMCBmaXJzdC4uCisjZGVmaW5lIFRYUlhfQ1NSMSAgICAgICAgICAgMHg3N2QwCisKKy8vCisvLyBTZWN1cml0eSBrZXkgdGFibGUgbWVtb3J5LCBiYXNlIGFkZHJlc3MgPSAweDEwMDAKKy8vCisjZGVmaW5lIE1BQ19XQ0lEX0JBU0UJCTB4MTgwMCAvLzgtYnl0ZXModXNlIG9ubHkgNi1ieXRlcykgKiAyNTYgZW50cnkgPQorI2RlZmluZSBIV19XQ0lEX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICAgICAweDQwMDAgICAgICAvLyAzMi1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0tFWV9FTlRSWV9TSVpFICAgICAgICAgICAweDIwCisjZGVmaW5lIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBNQUNfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0lWRUlWX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICAgICAweDY4MDAgICAgICAvLyA0LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfV0NJRF9BVFRSSV9TSVpFICAgNAorI2RlZmluZSBXQ0lEX1JFU0VSVkVEICAgICAgICAgIAkJMHg2YmZjCisjZGVmaW5lIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSAgICAgICAweDZjMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBTSEFSRURfS0VZX01PREVfQkFTRSAgICAgICAweDcwMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBIV19TSEFSRURfS0VZX01PREVfU0laRSAgIDQKKyNkZWZpbmUgU0hBUkVES0VZVEFCTEUJCQkwCisjZGVmaW5lIFBBSVJXSVNFS0VZVEFCTEUJCQkxCisKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKyNlbmRpZgorLy8gNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX1dDSURfRU5UUlkgeyAgLy8gOC1ieXRlIHBlciBlbnRyeQorICAgIFVDSEFSICAgQWRkcmVzc1s2XTsKKyAgICBVQ0hBUiAgIFJzdlsyXTsKK30gSFdfV0NJRF9FTlRSWSwgUEhXX1dDSURfRU5UUlk7CisKKworCisvLworLy8gT3RoZXIgb24tY2hpcCBzaGFyZWQgbWVtb3J5IHNwYWNlLCBiYXNlID0gMHgyMDAwCisvLworCisvLyBDSVMgc3BhY2UgLSBiYXNlIGFkZHJlc3MgPSAweDIwMDAKKyNkZWZpbmUgSFdfQ0lTX0JBU0UgICAgICAgICAgICAgMHgyMDAwCisKKy8vIENhcnJpZXItc2Vuc2UgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIGNhcnJpZXItc2Vuc2UgZnJhbWUgZm9yIGNhcnJpZXItc2Vuc2UgZnVuY3Rpb24uCisjZGVmaW5lIEhXX0NTX0NUU19CQVNFCQkJMHg3NzAwCisvLyBERlMgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIENUUyBmcmFtZSBmb3IgREZTLgorI2RlZmluZSBIV19ERlNfQ1RTX0JBU0UJCQkweDc3ODAKKyNkZWZpbmUgSFdfQ1RTX0ZSQU1FX1NJWkUJCTB4ODAKKworLy8gMjAwNC0xMS0wOCBqb2huIC0gc2luY2UgTlVMTCBmcmFtZSB3b24ndCBiZSB0aGF0IGxvbmcgKDI1NiBieXRlKS4gV2Ugc3RlYWwgMTYgdGFpbCBieXRlcworLy8gdG8gc2F2ZSBkZWJ1Z2dpbmcgc2V0dGluZ3MKKyNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFICAgMHg3N2YwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKKworI2lmIDAKKy8vIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MDgwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDc5MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3YTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N2IwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDdjMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3ZDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4N2UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDdmMDAKKy8qIDEuIEhXX0JFQUNPTl9PRkZTRVQvNjRCIG11c3QgYmUgMDsKKyAgIDIuIEJDTl9PRkZTRVQwIG11c3QgYWxzbyBiZSBjaGFuZ2VkIGluIE5JQ0luaXRpYWxpemVBc2ljKCk7CisgICAzLiBtYXggMHgwODAwIGZvciA4IGJlYWNvbiBmcmFtZXM7ICovCisjZWxzZQorLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBtYXhpbXVtIDggTUJTUyBhbmQgaXRzIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBmb3IgZWFjaCBiZWFjb24KKy8vIFRocmVlIHNlY3Rpb24gZGlzY29udGludWUgbWVtb3J5IHNlZ21lbnRzIHdpbGwgYmUgdXNlZC4KKy8vIDEuIFRoZSBvcmlnaW5hbCByZWdpb24gZm9yIEJDTiAwfjMKKy8vIDIuIEV4dHJhY3QgbWVtb3J5IGZyb20gRkNFIHRhYmxlIGZvciBCQ04gNH41CisvLyAzLiBFeHRyYWN0IG1lbW9yeSBmcm9tIFBhaXItd2lzZSBrZXkgdGFibGUgZm9yIEJDTiA2fjcKKy8vCSAgSXQgb2NjdXBpZWQgdGhvc2UgbWVtb3J5IG9mIHdjaWQgMjM4fjI1MyBmb3IgQkNOIDYKKy8vCQkJCQkJICAgICAgYW5kIHdjaWQgMjIyfjIzNyBmb3IgQkNOIDcKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9TSVpFICAgICAgMHgxMDAwIC8qIHVuaXQ6IGJ5dGUgKi8KKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UwICAgICAgICAgMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMSAgICAgICAgIDB4N0EwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTIgICAgICAgICAweDdDMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UzICAgICAgICAgMHg3RTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNCAgICAgICAgIDB4NzIwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTUgICAgICAgICAweDc0MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U2ICAgICAgICAgMHg1REMwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNyAgICAgICAgIDB4NUJDMAorI2VuZGlmCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisKKy8vCisvLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAorLy8KKy8vCisvLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgorLy8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworI2lmZGVmIFJUMjg3MAorLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgdXNiIC0gdXNlIGxhc3QtaGFsZiBiYXNlIGFkZHJlc3MgPSAweDMwMDAKKyNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgzMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MTAwMCAgICAvLyA0a2J5dGUKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8gVE9ETzogPz8/Pz8gb2xkIFJUMjU2MCByZWdpc3RlcnMuIHRvIGtlZXAgdGhlbSBvciByZW1vdmUgdGhlbT8KKy8vI2RlZmluZSBNQ0FTVDAgICAgICAgICAgICAgICAgICAweDAxNzggIC8vIG11bHRpY2FzdCBmaWx0ZXIgcmVnaXN0ZXIgMAorLy8jZGVmaW5lIE1DQVNUMSAgICAgICAgICAgICAgICAgIDB4MDE3YyAgLy8gbXVsdGljYXN0IGZpbHRlciByZWdpc3RlciAxCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVHggLwlSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0CisvLyBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMKKy8vIGIzLTIgb2YgUElEIGZpZWxkIC0KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCSAJMHgwMgorI2RlZmluZSBQSURfREFUQV9BTVBEVQkgCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLICAgIAkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkgCTB4MDMKKyNpZiAwCisjZGVmaW5lIFBUWVBFX0RBVEFfUkVRVUlSRV9BQ0sgIDB4MDAgLy8gYjctNjowMCwgYjUtMDogMH41OSBpcyBNQUMgdGFibGUgaW5kZXggKEFJRD8pLCA2MH42MyBpcyBXRFMgaW5kZXgKKyNkZWZpbmUgUFRZUEVfTlVMTF9BVF9ISUdIX1JBVEUgMHgwNCAvLyBiNy02OjAxLCBiNS0wOiAwfjU5IGlzIE1BQyB0YWJsZSBpbmRleCAoQUlEPyksIDYwfjYzIGlzIFdEUyBpbmRleAorI2RlZmluZSBQVFlQRV9SRVNFUlZFRCAgICAgICAgICAweDA4IC8vIGI3LTY6MTAKKyNkZWZpbmUgUFRZUEVfU1BFQ0lBTCAgICAgICAgICAgMHgwYyAvLyBiNy02OjExCisKKy8vIHdoZW4gYjMtMj0xMSAoUFRZUEVfU1BFQ0lBTCksIGIxLTAgY291YmUgYmUgLi4uCisjZGVmaW5lIFBTVUJUWVBFX0RBVEFfTk9fQUNLICAgIDB4MDAKKyNkZWZpbmUgUFNVQlRZUEVfTUdNVCAgICAgICAgICAgMHgwMQorI2RlZmluZSBQU1VCVFlQRV9PVEhFUl9DTlRMICAgICAweDAyCisjZGVmaW5lIFBTVUJUWVBFX1JUUyAgICAgICAgICAgIDB4MDMKKyNlbmRpZgorLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQorI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQkJQICYgUkYJZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAorI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCisjZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKKyNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMworI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0CisjZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKKyNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgorI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3CisjZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKKyNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQorI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAorI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQorI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgorI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMworI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAorI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQorI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgorI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNworI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAorI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQorI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAorI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQorI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgorI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMworI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAorI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQorI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgorI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNworI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAorI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQorI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAorI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQorCisjZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KKyNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQorI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKKyNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQorI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKKyNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1CisjZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2CisjZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQorI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKKyNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAorI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMworI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKKyNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgorI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKKyNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQorI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKKyNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgorI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCisKKworI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCisKKy8vI2RlZmluZSBQSFlfVFJfU1dJVENIX1RJTUUgICAgICAgICAgNSAgLy8gdXNlYworCisvLyNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAKKy8vI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MQorLy8jZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZIC0zNQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfU0VOU0lCSUxJVFkgICAgICAtNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSAgLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWSAgICAgIC05MAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVFUFJPTSBkZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lCU5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKKyNkZWZpbmUJTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lCUVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZQlFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqCisvLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZQorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQJMHg1NAorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVAkweDI0CisvLyNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyCisvLyNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQJMHg3YworI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZQlFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURSAJMHhkZQkvLyAyME1IWiBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLy8gMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLgorI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvLyBQYWlyS2V5TW9kZSBkZWZpbml0aW9uCisjZGVmaW5lIFBLTU9ERV9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLTU9ERV9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBLTU9ERV9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIFBLTU9ERV9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBLTU9ERV9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBLTU9ERV9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBLTU9ERV9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIFBLTU9ERV9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdDSUQgIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwordHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgeworCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1CisJVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNworCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOworCisvLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKKy8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBLZXlbMTZdOworICAgIFVDSEFSICAgVHhNaWNbOF07CisgICAgVUNIQVIgICBSeE1pY1s4XTsKK30gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKKworLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKKworLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCXJzdjoyMjsKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCXJzdjoyMjsKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCisvLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgorI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgorCisvLworLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZCAxCisJVUlOVDMyCQlETUFET05FOjE7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlTRExlbjE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFB0cjE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlJQ086MTsKKwlVSU5UMzIJCVVDTzoxOworCVVJTlQzMgkJVENPOjE7CisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjI6MjQ7Cit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQJMQorCVVJTlQzMgkJU0RMZW4xOjE0OworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJRE1BRE9ORToxOworCS8vV29yZDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvL1dvcmQzCisJVUlOVDMyCQlyc3YyOjI0OworCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlUQ086MTsJLy8KKwlVSU5UMzIJCVVDTzoxOwkvLworCVVJTlQzMgkJSUNPOjE7CS8vCit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCisvLworLy90eG9wIDogZm9yIHR4b3AgbW9kZQorLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgorLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJcnN2MjoxOworLy8JVUlOVDMyCQlyc3YyOjI7CisJVUlOVDMyCQlJZnM6MTsJLy8KKwlVSU5UMzIJCVNUQkM6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlNQ1M6NzsKKworCVVJTlQzMgkJcnN2OjY7CisJVUlOVDMyCQl0eG9wOjI7CS8vdHggYmFjayBvZmYgbW9kZSAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCVVJTlQzMgkJQU1QRFU6MTsKKworCVVJTlQzMgkJVFM6MTsKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJLy8gV29yZCAxCisJVUlOVDMyCQlQYWNrZXRJZDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlBQ0s6MTsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCUlWOworCS8vIFdvcmQgMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KKwlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlUUzoxOworCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlyc3Y6NjsKKworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQorCVVJTlQzMgkJSWZzOjE7CS8vCisvLwlVSU5UMzIJCXJzdjI6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCXJzdjI6MTsKKwlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJLy8gV29yZAkxCisJVUlOVDMyCQlBQ0s6MTsKKwlVSU5UMzIJCU5TRVE6MTsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwkvL1dvcmQyCisJVUlOVDMyCQlJVjsKKwkvL1dvcmQzCisJVUlOVDMyCQlFSVY7Cit9CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeAlSaW5nCisvLworLy8KKy8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlUSUQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJLy8gV29yZCAxCisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlGUkFHOjQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlyc3YxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kwOjg7CisJLy8gV29yZCAzCisJVUlOVDMyCQlyc3YyOjE2OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJU05SMDo4OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlUSUQ6NDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUZSQUc6NDsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwkvL1dvcmQyCisJVUlOVDMyCQlSU1NJMDo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlyc3YxOjg7CisJLy9Xb3JkMworCVVJTlQzMgkJU05SMDo4OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJcnN2MjoxNjsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbmRpZgorCisKKworLy8KKy8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlQb2xhcml0eToxOworCQlVQ0hBUgkJTGVkTW9kZTo3OworCX0gZmllbGQ7CisJVUNIQVIJCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJTGVkTW9kZTo3OworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCVVDSEFSCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbmRpZgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWdpc3RlciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy9OQVZfVElNRV9DRkcgOk5BVgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlyc3Y6NjsKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCXJzdjo2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisKKy8vCisvLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVJYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTU7CisJCVVJTlQzMiAgICAgICBEcm9wUnN2Q250bFR5cGU6MTsKKworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKworCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOworCQlVSU5UMzIJCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworLy8KKy8vIFBIWV9DU1I0OiBSRiBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQworLy8KKworCisKKy8vCisvLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJzdmQ6MjU7CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlSc3ZkOjI1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEUyUFJPTSBkYXRhIGxheW91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVCAgICAgIFJzdjo0OworCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVVNIT1JUCQlSc3YyOjY7CQkJCQkvLyBtdXN0IGJlIDAKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciA1RworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyBXaGV0aGVyIFJGIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyIG9yIEhXLiAxOmVuYWJsZSBodyBjb250cm9sLCAwOmRpc2FibGUKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QgeworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIDE6ZW5hYmxlLCAwOmRpc2FibGUKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJUnN2Mjo2OyAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZQlSRl9DU1JfQ0ZHCTB4NTAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKworI2VuZGlmCS8vIF9fUlQyOFhYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YjNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKQEAgLTAsMCArMSw2NDUyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNpZmRlZiBVQ09TCitJTlQgSW9jdGxSZXNwb25zZShQVUNIQVIgcGF5bG9hZCwgUFVDSEFSIG1zZywgSU5UIGxlbik7CisjZW5kaWYgLy8gVUNPUyAvLworCisjaWZkZWYgUkFMSU5LX0FURQorVUNIQVIgVGVtcGxhdGVGcmFtZVsyNF0gPSB7MHgwOC8qIERhdGEgdHlwZSAqLywweDAwLDB4MDAsMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDAwLDB4QUEsMHhCQiwweDEyLDB4MzQsMHg1NiwweDAwLDB4MTEsMHgyMiwweEFBLDB4QkIsMHhDQywweDAwLDB4MDB9OwkvLyA4MDIuMTEgTUFDIEhlYWRlciwgVHlwZTpEYXRhLCBMZW5ndGg6MjRieXRlcworZXh0ZXJuIFJUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdOworZXh0ZXJuIFVDSEFSIE5VTV9PRl8yODUwX0NITkw7CisKKyNpZmRlZiBSVDI4NzAKK2V4dGVybiBVQ0hBUiBFcFRvUXVldWVbXTsKK2V4dGVybiBWT0lECVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMoCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIFVDT1MKK2V4dGVybiBJTlQgQ29uc29sZVJlc3BvbnNlKElOIFBVQ0hBUiBidWZmKTsKK2V4dGVybiBpbnQgKCpyZW1vdGVfZGlzcGxheSkoY2hhciAqKTsKKyNlbmRpZiAvLyBVQ09TIC8vCisKK3N0YXRpYyBDSEFSIENDS1JhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSwgLTF9OyAvKiBDQ0sgTW9kZS4gKi8KK3N0YXRpYyBDSEFSIE9GRE1SYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAtMX07IC8qIE9GRE0gTW9kZS4gKi8KK3N0YXRpYyBDSEFSIEhUTUlYUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTF9OyAvKiBIVCBNaXggTW9kZS4gKi8KKworc3RhdGljIElOVCBUeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIEVuYWJsZSk7CisKK3N0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgSU5UIEFURVNldFVwRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDMyIFR4SWR4KTsKKworc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCk7CisKK3N0YXRpYyBJTlQgQVRFQ21kSGFuZGxlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJSU4gVUNIQVIgTW9kZSwKKwlJTiBVQ0hBUiBNY3MpOworCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBWT0lEIEFURVdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTgkgIEJPT0xFQU4JCWJXaXYsCisJSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JICBVQ0hBUgkJCVR4QnVyc3QpOworCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJTUlNT3BzLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwlUcmFuc21pdCk7CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworc3RhdGljIFZPSUQgU2V0SmFwYW5GaWx0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT1lbmQgb2YgcHJvdG90eXBlPT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmZGVmIFJUMjg3MAorc3RhdGljIElOVCBUeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UIHJlc3VsdDsKKwlVU0JfRE1BX0NGR19TVFJVQyBVc2JDZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFVTQl9ETUFfQ0ZHLCAmVXNiQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQorCWlmIChVc2JDZmcuZmllbGQuVHhCdXN5KQorCQlyZXN1bHQgPSAxOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBJTlQgUnhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJVVNCX0RNQV9DRkdfU1RSVUMgVXNiQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBVU0JfRE1BX0NGRywgJlVzYkNmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoVXNiQ2ZnLmZpZWxkLlJ4QnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpCit7CisJQk9PTEVBTiB2YWx1ZTsKKwlVTE9ORyBXYWl0Q250OworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKworCXZhbHVlID0gRW5hYmxlID4gMCA/IDEgOiAwOworCisJLy8gY2hlY2sgRE1BIGlzIGluIGJ1c3kgbW9kZS4KKwlXYWl0Q250ID0gMDsKKwl3aGlsZSAoVHhEbWFCdXN5KHBBZCkgfHwgUnhEbWFCdXN5KHBBZCkpCisJeworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwkJaWYgKFdhaXRDbnQrKyA+IDEwMCkKKwkJCWJyZWFrOworCX0KKworCS8vV2h5IG5vdCB0byBjbGVhciBVU0IgRE1BIFRYIHBhdGggZmlyc3QgPz8/CisJUlRNUF9JT19SRUFEMzIocEFkLCBVU0JfRE1BX0NGRywgJlVzYkNmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlVc2JDZmcuZmllbGQuVHhCdWxrRW4gPSB2YWx1ZTsKKwlVc2JDZmcuZmllbGQuUnhCdWxrRW4gPSB2YWx1ZTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBVU0JfRE1BX0NGRywgVXNiQ2ZnLndvcmQpOwkvLyBhYm9ydCBhbGwgVFggcmluZ3MKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIgQmJwRGF0YSA9IDA7CisKKwkvLyBTb2Z0IHJlc2V0LCBzZXQgQkJQIFIyMSBiaXQwPTEtPjAKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsICZCYnBEYXRhKTsKKwlCYnBEYXRhIHw9IDB4MDAwMDAwMDE7IC8vc2V0IGJpdDA9MQorCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsIEJicERhdGEpOworCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSAmPSB+KDB4MDAwMDAwMDEpOyAvL3NldCBiaXQwPTAKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCXJldHVybjsKK30KKworc3RhdGljIFZPSUQgUnRtcFJmSW9Xcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJUlRNUHVzZWNEZWxheSgyMDApOworCisJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKKwlVQ0hBUiBNb2RlLAorCVVDSEFSIE1jcykKK3sKKwlpbnQgaTsKKwlQQ0hBUiBwUmF0ZVRhYjsKKworCXN3aXRjaChNb2RlKQorCXsKKwkJY2FzZSAwOgorCQkJcFJhdGVUYWIgPSBDQ0tSYXRlVGFibGU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcFJhdGVUYWIgPSBPRkRNUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJcFJhdGVUYWIgPSBIVE1JWFJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgidW5yZWNvZ25pemFibGUgVHggTW9kZSAlZFxuIiwgTW9kZSkpOworCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJfQorCisJaSA9IDA7CisJd2hpbGUocFJhdGVUYWJbaV0gIT0gLTEpCisJeworCQlpZiAocFJhdGVUYWJbaV0gPT0gTWNzKQorCQkJcmV0dXJuIDA7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNpZiAxCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KQoreworCVVMT05HIFI7CisJQ0hBUiBUeFBvd2VyOworCVVDSEFSIEJicDk0ID0gMDsKKwlCT09MRUFOIGJQb3dlclJlZHVjZSA9IEZBTFNFOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQkvKiBXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCisJCSoqIGFyZSBub3Qgc3luY2hyb25pemVkLgorCQkqLworLyoKKwkJcEFkLT5hdGUuVHhQb3dlcjAgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKwkJcEFkLT5hdGUuVHhQb3dlcjEgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKyovCisJCXJldHVybiAwOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVR4UG93ZXIgPSBpbmRleCA9PSAwID8gcEFkLT5hdGUuVHhQb3dlcjAgOiBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAzMSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDMxICgweDI0KSwgMzEgfiAzNiB1c2VkIGJ5IEJCUCA5NAorCQkJCS8vCisJCQkJUiA9IDMxOworCQkJCWlmIChUeFBvd2VyIDw9IDM2KQorCQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgKFVDSEFSKShUeFBvd2VyIC0gMzEpOworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAsIC0xIH4gLTYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAwOworCQkJCWlmIChUeFBvd2VyID49IC02KQorCQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgVHhQb3dlcjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMzEKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJCQl9CisKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsZCwgQkJQX1I5ND0lZClcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKwkJfQorCQllbHNlLy8gNS41IEdIegorCQl7CisJCQlpZiAoVHhQb3dlciA+IDE1KQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMTUgKDB4MEYpCisJCQkJLy8KKwkJCQlSID0gMTU7CisJCQl9CisJCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMAorCQkJCS8vCisJCQkJLy8gLTEgfiAtNworCQkJCUFTU0VSVCgoVHhQb3dlciA+PSAtNykpOworCQkJCVIgPSAoVUxPTkcpKFR4UG93ZXIgKyA3KTsKKwkJCQliUG93ZXJSZWR1Y2UgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDAgfiAxNQorCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCQl9CisKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsdSlcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUikpOworCQl9CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSBSIDw8IDk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSID0gUiA8PCA2OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKwkJZWxzZS8vIDUuNUdIegorCQl7CisJCQlpZiAoYlBvd2VyUmVkdWNlID09IEZBTFNFKQorCQkJeworCQkJCWlmIChpbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDEwKSB8ICgxIDw8IDkpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDkgb2YgUjMgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IChSICYgKH4oMSA8PCA5KSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSID0gKFIgPDwgNyk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDYgb2YgUjQgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IChSICYgKH4oMSA8PCA2KSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQlyZXR1cm4gMDsKKwl9Cit9CisjZWxzZS8vIDEgLy8KK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpCit7CisJVUxPTkcgUjsKKwlDSEFSIFR4UG93ZXI7CisJVUNIQVIgQmJwOTQgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQkvLyBUT0RPOiBob3cgdG8gZ2V0IGN1cnJlbnQgVHhQb3dlcjAvMSBmcm9tIHBBZC0+TGF0Y2hSZlJlZ3MgPworCQkvKiBXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCisJCSoqIGFyZSBub3Qgc3luY2hyb25pemVkLgorCQkqLworLyoKKwkJcEFkLT5hdGUuVHhQb3dlcjAgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKwkJcEFkLT5hdGUuVHhQb3dlcjEgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKyovCisJCXJldHVybiAwOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVR4UG93ZXIgPSBpbmRleCA9PSAwID8gcEFkLT5hdGUuVHhQb3dlcjAgOiBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCWlmIChUeFBvd2VyID4gMzEpCisJeworCQkvLworCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzNiAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJLy8KKwkJUiA9IDMxOworCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7CisJfQorCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAwOworCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyBUeFBvd2VyOworCX0KKwllbHNlCisJeworCQkvLyAwIH4gMzEKKwkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUjM9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSLCBCYnA5NCkpOworCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJaWYgKGluZGV4ID09IDApCisJeworCQlSID0gUiA8PCA5OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwl9CisJZWxzZQorCXsKKwkJUiA9IFIgPDwgNjsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGluZGV4ID09IDApCisJCQl7CisJCQkJUiA9IChSIDw8IDEwKSB8ICgxIDw8IDkpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCX0KKwkJfQorCisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmIC8vIDEgLy8KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBvcGVyYXRpb24gbW9kZSB0bworICAgICAgICAwLiBBVEVTVEFSVCAgPSBTdGFydCBBVEUgTW9kZQorICAgICAgICAxLiBBVEVTVE9QICAgPSBTdG9wIEFURSBNb2RlCisgICAgICAgIDIuIFRYQ09OVCAgICA9IENvbnRpbnVvdXMgVHJhbnNtaXQKKyAgICAgICAgMy4gVFhDQVJSICAgID0gVHJhbnNtaXQgQ2FycmllcgorICAgICAgICA0LiBUWEZSQU1FICAgPSBUcmFuc21pdCBGcmFtZXMKKyAgICAgICAgNS4gUlhGUkFNRSAgID0gUmVjZWl2ZSBGcmFtZXMKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorICAgICAgICA2LiBUWFNUT1AgICAgPSBTdG9wIEFueSBUeXBlIG9mIFRyYW5zbWl0aW9uCisgICAgICAgIDcuIFJYU1RPUCAgICA9IFN0b3AgUmVjZWl2aW5nIEZyYW1lcworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVDI4NjA9PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09U3RhcnQgb2YgUlQyODcwPT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgSU5UCUFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMgkJCVZhbHVlOworCVVDSEFSCQkJQmJwRGF0YTsKKwlVSU5UMzIgICAgICAgICAgTWFjRGF0YTsKKwlVSU5UCQkJaT0wLCBhdGVtb2RlOworCS8vTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJLy9QVUNIQVIJCQlwRGVzdDsKKwlVSU5UMzIgCQkJdGVtcDsKKwlVTE9ORwkJCUlycUZsYWdzOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCS8qIEFzaWNMb2NrQ2hhbm5lbCgpIGlzIGVtcHR5IGZ1bmN0aW9uIHNvIGZhciBpbiBmYWN0ICovCisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5hdGUuQ2hhbm5lbCk7CisKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwlCYnBEYXRhID0gMDsKKworCS8qIEVudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZSAqLworCWlmICghc3RyY21wKGFyZywgIkFURVNUQVJUIikpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVEFSVFxuIikpOworCisJCW5ldGlmX3N0b3BfcXVldWUocEFkLT5uZXRfZGV2KTsKKworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGlzYWJsZSBhdXRvIHJlc3BvbmRlcgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJnRlbXApOworCQl0ZW1wID0gdGVtcCAmIDB4RkZGRkZGRkU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgdGVtcCk7CisKKwkJLy8gcmVhZCBNQUNfU1lTX0NUUkwgYW5kIGJhY2t1cCBNQUNfU1lTX0NUUkwgdmFsdWUuCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisJCS8vIGNsZWFuIGJpdDQgdG8gc3RvcCBjb250aW51b3VzIFR4IHByb2R1Y3Rpb24gdGVzdC4KKwkJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCQkvLyBTdG9wIGNvbnRpbnVvdXMgVFggcHJvZHVjdGlvbiB0ZXN0LgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOy8vZGlzYWJsZSBvciBjYW5jZWwgcGVuZGluZyBpcnAgZmlyc3QgPz8/CisKKyAgICAgICAgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJLy8gV2Ugc2hvdWxkIGZyZWUgc29tZSByZXNvdXJjZSB3aGljaCBhbGxvY2F0ZSB3aGVuIEFURV9UWEZSQU1FICwgQVRFX1NUT1AsIGFuZCBBVEVfVFhDT05ULgorCQkvLyBUT0RPOlNob3VsZCB3ZSBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggd2FzIGFsbG9jYXRlZCB3aGVuIExvb3BCYWNrIGFuZCBBVEVfU1RPUCA/CisJCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKKwkJeworCQkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDT05UKQorCQkJeworCQkJCS8vIE5vdCBDb250LiBUWCBhbnltb3JlLCBzbyBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCQl9CisJCQkvLyBBYm9ydCBUeCwgUnggRE1BLgorCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCQl7CisJCQkJLy8gSXQgc2VlbXMgbm90aGluZyB0byBmcmVlLAorCQkJCS8vIGJlY2F1c2Ugd2UgZGlkbid0IGFsbG9jYXRlIGFueSByZXNvdXJjZSB3aGVuIHdlIGVudGVyZWQgQVRFX1RYRlJBTUUgbW9kZSBsYXRlc3RseS4KKwkJCX0KKworCQkJLy8gU3RhcnQgVHgsIFJYIERNQQorCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCQl9CisKKwkJUlRVU0JSZWplY3RQZW5kaW5nUGFja2V0cyhwQWQpOworCQlSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8KKwkJLy8gSXQgd2lsbCBiZSBjYWxsZWQgaW4gTWxtZVN1c3BlbmQoKS4KKwkJLy8KKwkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgICAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vUlRVU0JDbGVhblVwTUxNRVdhaXRRdWV1ZShwQWQpOwkvKiBub3QgdXNlZCBpbiBSVDI4eHggKi8KKwkJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8vIFNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIG9uLCBzbyB3ZSBhdm9pZCBjYWxsaW5nIE1sbWVTdXNwZW5kKCkuCisvLwkJTWxtZVN1c3BlbmQocEFkLCBUUlVFKTsKKwkJLy9SVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBEaXNhYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcGVuZGluZyBidWxrIGluL291dCBJUlBzIGJlZm9yZSB3ZSBnbyBvbi4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8qIHBBZC0+UGVuZGluZ1J4IGlzIG5vdCBvZiB0eXBlIGF0b21pY190IGFueW1vcmUgaW4gMjh4eCAqLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJd2hpbGUgKChwQWQtPlBlbmRpbmdSeCA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisJCQlOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKyNlbmRpZgorCQkJLyogZGVsYXkgMC41IHNlY29uZHMgKi8KKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJfQorCQkvKiBwZXRlciA6IHdoeSBkb24ndCB3ZSBoYXZlIHRvIGdldCBCdWxrT3V0TG9jayBmaXJzdCA/ICovCisJCXdoaWxlICgoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1sxXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzJdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbM10gPT0gVFJVRSkpICYmIChwQWQtPkJ1bGtGbGFncyAhPSAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXsKKwkJCWRvCisJCQl7CisJCQkJLyogcEFkLT5CdWxrT3V0UGVuZGluZ1t5XSB3aWxsIGJlIHNldCB0byBGQUxTRSBpbiBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCkgKi8KKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCS8qIHdlIGhhdmUgZW5vdWdoIHRpbWUgZGVsYXkgaW4gUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpCisJCQkqKiBzbyB0aGlzIGlzIG5vdCBuZWNlc3NhcnkKKwkJCSovCisvLwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisJCS8qIHBBZC0+UGVuZGluZ1J4IGlzIG5vdCBvZiB0eXBlIGF0b21pY190IGFueW1vcmUgaW4gMjh4eCAqLworLy8JCUFTU0VSVChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID09IDApOworCQlBU1NFUlQocEFkLT5QZW5kaW5nUnggPT0gMCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIHJlc2V0IFJ4IHN0YXRpc3RpY3MuCisJCXBBZC0+YXRlLkxhc3RTTlIwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFNOUjEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTAgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAwOworCQlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJLy8gVHggZnJhbWUKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisJCXBBZC0+YXRlLnNlcSA9IDA7CisKKwkJLy8gY291bnRlcnMKKwkJcEFkLT5hdGUuVTJNID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJcEFkLT5hdGUuQmVhY29uID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4QWMwID0gMDsKKwkJcEFkLT5hdGUuVHhBYzEgPSAwOworCQlwQWQtPmF0ZS5UeEFjMiA9IDA7CisJCXBBZC0+YXRlLlR4QWMzID0gMDsKKwkJcEFkLT5hdGUuVHhIQ0NBID0gMDsKKwkJcEFkLT5hdGUuVHhNZ210ID0gMDsKKwkJcEFkLT5hdGUuUlNTSTAgPSAwOworCQlwQWQtPmF0ZS5SU1NJMSA9IDA7CisJCXBBZC0+YXRlLlJTU0kyID0gMDsKKwkJcEFkLT5hdGUuU05SMCA9IDA7CisJCXBBZC0+YXRlLlNOUjEgPSAwOworCisJCS8vIGNvbnRyb2wKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKworCQkvKgorCQkqKiBJZiB3ZSBza2lwICJMaW5rRG93bigpIiwgd2Ugc2hvdWxkIGRpc2FibGUgcHJvdGVjdGlvbgorCQkqKiB0byBwcmV2ZW50IGZyb20gc2VuZGluZyBvdXQgUlRTIG9yIENUUy10by1zZWxmLgorCQkqLworCQlBVEVEaXNhYmxlQXNpY1Byb3RlY3QocEFkKTsKKwkJUlRNUFN0YXRpb25TdG9wKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwkJQmJwRGF0YSA9IDA7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisJICAgCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCSAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKwkJLy9DbGVhbiBBVEUgQnVsayBpbi9vdXQgY291bnRlciBhbmQgY29udGludWUgc2V0dXAKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCisJCS8qIE5kaXNBY3F1aXJlU3BpbkxvY2soKS9OZGlzUmVsZWFzZVNwaW5Mb2NrKCkgbmVlZCBvbmx5IG9uZSBhcmd1bWVudCBpbiBSVDI4eHggKi8KKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCQlwQWQtPkNvbnRpbkJ1bGtJbiA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIkFURVNUT1AiKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURSA6IEFURVNUT1AgPT09PlxuIikpOworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOy8vMDgyMAorCQkvLyBDbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7IC8vIHJlY292ZXIgdGhlIE1BQ19TWVNfQ1RSTCByZWdpc3RlciBiYWNrLgorCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLyoKKwkJKiogQWJvcnQgVHgsIFJYIERNQS4KKwkJKiogUSAgIDogSG93IHRvIGRvIHRoZSBmb2xsb3dpbmcgSS9PIGlmIFR4LCBSeCBETUEgaXMgYWJvcnRlZCA/CisJCSoqIEFucyA6IEJ1bGsgZW5kcG9pbnRzIGFyZSBhYm9ydGVkLCB3aGlsZSB0aGUgY29udHJvbCBlbmRwb2ludCBpcyBub3QuCisJCSovCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBEaXNhYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcGVuZGluZyBidWxrIGluL291dCBJUlBzIGJlZm9yZSB3ZSBnbyBvbi4gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLwkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl3aGlsZSAocEFkLT5QZW5kaW5nUnggPiAwKQorCQl7CisjaWYgMQorCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworI2Vsc2UKKy8vCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQlwQWQtPlBlbmRpbmdSeC0tOworI2VuZGlmCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKy8vCQlBU1NFUlQoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKTsKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgUmVzZXQgUnggUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwkJcEFkLT5QZW5kaW5nUnggPSAwOworCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7CS8vIE5leHQgUnggUmVhZCBpbmRleAorCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4ID0gUlhfUklOR19TSVpFIC0gMTsJLy8gUnggQnVsayBwb2ludGVyCisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJeworCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBNQVhfUlhCVUxLX1NJWkUpOworCQkJLyogcGV0ZXIgOiB3aHkgZG9uJ3Qgd2UgaGF2ZSB0byBnZXQgQnVsa0luTG9jayBmaXJzdCA/ICovCisJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCQlwUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKKyAgICAgICAgICAgIC8qIHBldGVyIGRlYnVnICsrICovCisJCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCQkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIC8qIHBldGVyIGRlYnVnIC0tICovCisJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisvLwkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworLy8JCQlwUnhDb250ZXh0LT5SZWFkUG9zT2Zmc2V0ID0gMDsKKwkJfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICBSZXNldCBUeCBSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCWRvCisJCXsKKwkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJfSB3aGlsZSAoRkFMU0UpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvLyBFbmFibGUgYXV0byByZXNwb25kZXIuCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmdGVtcCk7CisJCXRlbXAgPSB0ZW1wIHwgKDB4MDEpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIHRlbXApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisKKwkJLyogU29mdCByZXNldCBCQlAuKi8KKwkJLyogSW4gMjg3MCBjaGlwc2V0LCBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRCgpID09IFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRCgpICovCisJCS8qIEJvdGggcnQyODcwYXAgYW5kIHJ0Mjg3MHN0YSB1c2UgQmJwU29mdFJlc2V0KHBBZCkgdG8gZG8gQkJQIHNvZnQgcmVzZXQgKi8KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCS8vIFNldCBhbGwgc3RhdGUgbWFjaGluZXMgYmFjayBJRExFCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQVVUSF9SRVFfSURMRTsKKwkJCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJCXBBZC0+TWxtZS5BY3RNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFDVF9JRExFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkvLworCQkJLy8gPT09PiByZWZlciB0byBNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgpLgorCQkJLy8gV2hlbiB3ZSBlbnRlcmVkIEFURV9TVEFSVCBtb2RlLCBQZXJpb2RpY1RpbWVyIHdhcyBub3QgY2FuY2VsbGVkLgorCQkJLy8gU28gd2UgZG9uJ3QgaGF2ZSB0byBzZXQgaXQgaGVyZS4KKwkJCS8vCisJCQkvL1JUTVBTZXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJCUFTU0VSVChwQWQtPkNvbW1vbkNmZy5DaGFubmVsICE9IDApOworCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJICAgIFJUTVBTdGF0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorLy8KKy8vIFRoZXNlIHR3byBzdGVwcyBoYXZlIGJlZW4gZG9uZSB3aGVuIGVudGVyaW5nIEFURV9TVE9QIG1vZGUuCisvLworI2lmIDAKKwkgICAgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJICAgCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisjZW5kaWYKKwkJLy8gQ2xlYW4gQVRFIEJ1bGsgaW4vb3V0IGNvdW50ZXIgYW5kIGNvbnRpbnVlIHNldHVwLgorCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgMCk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBGQUxTRTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJLyogV2FpdCA1MG1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBkdXJpbmcgSFcgcmVzZXQuICovCisJCS8qIHRvZG8gOiByZW1vdmUgdGhpcyBpZiBub3QgbmVjZXNzYXJ5ICovCisJCU5kaXNNU2xlZXAoNTAwMDApOworCisJCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RPUDsKKworCQkvLyBFbmFibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgaW4gb3JkZXIgdGhhdCBRQSBtYXliZSBzZXQgaXQgdG8gMHgzICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLy8gRW5hYmxlIFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBXYWl0IDEwbXMgdG8gd2FpdCBhbGwgb2YgdGhlIGJ1bGstaW4gVVJCcyB0byBjb21wbGV0ZS4KKwkJLyogdG9kbyA6IHJlbW92ZSB0aGlzIGlmIG5vdCBuZWNlc3NhcnkgKi8KKwkJTmRpc01TbGVlcCgxMDAwMCk7CisKKwkJLy8gRXZlcnl0aGluZyBpcyByZWFkeSB0byBzdGFydCBub3JtYWwgVHgvUnguCisJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUocEFkLT5uZXRfZGV2KTsKKworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IEFURSA6IEFURVNUT1AgXG4iKSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDQVJSIikpCS8vIFR4IENhcnJpZXIKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDQVJSXG4iKSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUjsKKworCQkvLyBEaXNhYmxlIFJ4CisJCS8vIE1heSBiZSB3ZSBuZWVkIG5vdCB0byBkbyB0aGlzLCBiZWNhdXNlIHRoZXNlIGhhdmUgYmVlbiBkb25lIGluIEFURV9TVEFSVCBtb2RlID8/PworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBRQSBoYXMgZG9uZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGlmIGl0IGlzIHVzZWQuCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IEZBTFNFKQorCQl7CisJCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJCUJicFNvZnRSZXNldChwQWQpOworCisJCQkvLyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCQlCYnBEYXRhIHw9IDB4MDAwMDAwQzE7IC8vc2V0IGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJVmFsdWUgPSBWYWx1ZSB8IDB4MDAwMDAwMTA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ09OVCIpKQkvLyBUeCBDb250aW51ZQorCXsKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLyogc2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIGJpdDQoQ29udGludW91cyBUeCBQcm9kdWN0aW9uIFRlc3QpCisJCQkgICBhbmQgYml0MihNQUMgVFggZW5hYmxlKSBiYWNrIHRvIHplcm8uICovCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkJTWFjRGF0YSAmPSAweEZGRkZGRkVCOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQkJLy8gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkY3RjsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCisJCS8qIGZvciBUeENvbnQgbW9kZS4KKwkJKiogU3RlcCAxOiBTZW5kIDUwIHBhY2tldHMgZmlyc3QgdGhlbiB3YWl0IGZvciBhIG1vbWVudC4KKwkJKiogU3RlcCAyOiBTZW5kIG1vcmUgNTAgcGFja2V0IHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KKwkJKi8KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWENPTlRcbiIpKTsKKwkJLy8gU3RlcCAxOiBzZW5kIDUwIHBhY2tldHMgZmlyc3QuCisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYQ09OVDsKKwkJcEFkLT5hdGUuVHhDb3VudCA9IDUwOworCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCisJCS8qIE9ubHkgbmVlZGVkIGlmIHdlIGhhdmUgdG8gc2VuZCBzb21lIG5vcm1hbCBmcmFtZXMuICovCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgorCQlBVEVTZXRVcEZyYW1lKHBBZCwgMCk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIHBBZC0+YXRlLlR4Q291bnQpOworCisjaWZkZWYJUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYJLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsvLzA4MjAKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJCS8vIEtpY2sgYnVsayBvdXQKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisJCS8qIFRvIG1ha2Ugc3VyZSBhbGwgdGhlIDUwIGZyYW1lcyBoYXZlIGJlZW4gYnVsayBvdXQgYmVmb3JlIGV4ZWN1dGluZyBzdGVwIDIgKi8KKwkJd2hpbGUgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCQl7CisJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQl9CisKKwkJLy8gU3RlcCAyOiBzZW5kIG1vcmUgNTAgcGFja2V0cyB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTEKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCUJicERhdGEgfD0gMHgwMDAwMDA4MDsgLy9zZXQgYml0Nz0xCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCVNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgorCQlBVEVTZXRVcEZyYW1lKHBBZCwgMCk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgcEFkLT5hdGUuVHhDb3VudCk7CisKKyNpZmRlZglSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbmRpZgkvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOy8vMDgyMAorCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSk7CisJCS8vIEtpY2sgYnVsayBvdXQKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCisjaWYgMQorCQlSVE1QdXNlY0RlbGF5KDUwMCk7CisjZWxzZQorCQl3aGlsZSAoYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSA+IDApCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKyNlbmRpZiAvLyAxIC8vCisKKwkJLy8gU2V0IE1BQ19TWVNfQ1RSTCgweDEwMDQpIENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0IChiaXQ0KSA9IDEuCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisJCU1hY0RhdGEgfD0gMHgwMDAwMDAxMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWEZSQU1FIikpCS8vIFR4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWEZSQU1FKENvdW50PTB4JTA4eClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwkJQmJwRGF0YSA9IDA7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKworCQkvLyBDbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKworCSAgIAlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCS8vIGFkZCB0aGlzIGZvciBMb29wQmFjayBtb2RlCisJCWlmIChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IEZBTFNFKQorCQl7CisJCQkvLyBEaXNhYmxlIFJ4CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQl9CisKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZWxzZQorCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyAgICAgICAgU2V0SmFwYW5GaWx0ZXIocEFkKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisgICAgICAgIC8vIFNldHVwIGZyYW1lIGZvcm1hdAorCQlBVEVTZXRVcEZyYW1lKHBBZCwgMCk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCS8vIENoZWNrIGNvdW50IGlzIGNvbnRpbnVvdXMgb3Igbm90IHlldC4KKwkJLy8KKwkJLy8gRHVlIHRvIHRoZSB0eXBlIG1pc21hdGNoIGJldHdlZW4gInBBZC0+QnVsa091dFJlbWFpbmVkIihhdG9taWNfdCkgYW5kICJwQWQtPmF0ZS5UeENvdW50IihVSU5UMzIpCisJCS8vCisJCWlmIChwQWQtPmF0ZS5UeENvdW50ID09IDApCisJCXsKKwkJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCBwQWQtPmF0ZS5UeENvdW50KTsKKwkJfQorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJidWxrIG91dCBjb3VudCA9ICVkXG4iLCBhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpKSk7CisJCUFTU0VSVCgoYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSA+PSAwKSk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPT0gMCkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBwYWNrZXQgY291bnRpbnVvdXNseVxuIikpOworCisJCQkvKiBJbiAyOHh4LCBOZGlzQWNxdWlyZVNwaW5Mb2NrKCkgPT0gc3Bpbl9sb2NrX2JoKCkgKi8KKwkJCS8qIE5kaXNBY3F1aXJlU3BpbkxvY2sgb25seSBuZWVkIG9uZSBhcmd1bWVudCBpbiAyOHh4LiAqLworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisJCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBUUlVFOworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJCS8qIEluIDI4eHgsIEJVTEtfT1VUX0xPQ0soKSA9PSBzcGluX2xvY2tfaXJxc2F2ZSgpICovCisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7Ly8gcGV0ZXIgOiBOZGlzQWNxdWlyZVNwaW5Mb2NrID09PiBCVUxLX09VVF9MT0NLCisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsvLyBwZXRlciA6IE5kaXNBY3F1aXJlU3BpbkxvY2sgPT0+IEJVTEtfT1VUX0xPQ0sKKwkJfQorCQllbHNlCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgcGFja2V0cyBkZXBlbmQgb24gY291bnRlclxuIikpOworCisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKwkJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQl9CisKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSk7CisKKwkJLy8gS2ljayBidWxrIG91dAorCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJfQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWFNUT1AiKSkgCQkvL0VudGVyIEFURSBtb2RlIGFuZCBzZXQgVHgvUnggSWRsZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWFNUT1BcbiIpKTsKKworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSAmPSBBVEVfVFhTVE9QOworCQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCQl9CisJCX0KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJUlRVU0JSZWplY3RQZW5kaW5nUGFja2V0cyhwQWQpOworCQlSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKHBBZCk7CisKKwkJLyogbm90IHVzZWQgaW4gUlQyOHh4ICovCisJCS8vUlRVU0JDbGVhblVwTUxNRVdhaXRRdWV1ZShwQWQpOworCQkvKiBlbXB0eSBmdW5jdGlvbiBzbyBmYXIgKi8KKwkJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvKiBJbiAyOHh4LCBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlICovCisvLwkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQkvKiBwZXRlciB0b2RvIDogQnVsa0luTG9jayAqLworCQl3aGlsZSAocEFkLT5QZW5kaW5nUnggPiAwKQorCQl7CisjaWYgMQorCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworI2Vsc2UKKy8vCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQlwQWQtPlBlbmRpbmdSeC0tOworI2VuZGlmCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLy8gRW5hYmxlIFR4LCBSeCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvKiB0YXNrIFR4IHN0YXR1cyA6IDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nICovCisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhICY9ICgweGZmZmZmZmZiKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQkvL0NsZWFuIEFURSBCdWxrIGluL291dCBjb3VudGVyIGFuZCBjb250aW51ZSBzZXR1cAorCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgMCk7CisKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiUlhTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFJYU1RPUFxuIikpOworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1JYU1RPUDsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJUlRVU0JSZWplY3RQZW5kaW5nUGFja2V0cyhwQWQpOworCQlSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKHBBZCk7CisKKwkJLyogbm90IHVzZWQgaW4gUlQyOHh4ICovCisJCS8vUlRVU0JDbGVhblVwTUxNRVdhaXRRdWV1ZShwQWQpOworCQlSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKHBBZCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLwkJd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkpCisJCXdoaWxlIChwQWQtPlBlbmRpbmdSeCA+IDApCisJCXsKKyNpZiAxCisJCQlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisjZWxzZQorLy8JCQlOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwkJCXBBZC0+UGVuZGluZ1J4LS07CisjZW5kaWYKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisJCXdoaWxlICgoKHBBZC0+QnVsa091dFBlbmRpbmdbMF0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1sxXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzJdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbM10gPT0gVFJVRSkpICYmIChwQWQtPkJ1bGtGbGFncyAhPSAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXsKKwkJCWRvCisJCQl7CisJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCQkJfSB3aGlsZSAoRkFMU0UpOworCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQlBU1NFUlQocEFkLT5QZW5kaW5nUnggPT0gMCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYRlJBTUUiKSkgLy8gUnggRnJhbWVzCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFJYRlJBTUVcbiIpKTsKKworCQkvLyBEaXNhYmxlIFJ4IG9mIE1BQyBibG9jaworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCQlCYnBEYXRhID0gMDsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkvLyBDbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKworCSAgIAlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKKworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9SWEZSQU1FOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBEaXNhYmxlIFRYIG9mIE1BQyBibG9jaworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworICAgICAgICAvLyBSZXNldCBSeCBSSU5HLgorCQlmb3IgKCBpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCXsKKwkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZSA9IEZBTFNFOworCisJCQkvLworCQkJLy8gR2V0IHRoZSB1cmIgZnJvbSBrZXJuZWwgYmFjayB0byBkcml2ZXIuCisJCQkvLworCQkJUlRVU0JfVU5MSU5LX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKworCQkJLyogU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsuICovCisJCQlOZGlzTVNsZWVwKDIwMCk7CisJCQlwQWQtPkJ1bGtJblJlcSA9IDA7CisKKy8vCQkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5QZW5kaW5nUngsIDApOworCQkJcEFkLT5QZW5kaW5nUnggPSAwOworCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgJCT0gUlhfUklOR19TSVpFIC0gMTsJLy8gUnggQnVsayBwb2ludGVyCisJCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKwkJfQorCisJCS8vIHJlYWQgdG8gY2xlYXIgY291bnRlcnMKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMCwgJnRlbXApOyAvL1JYIFBIWSAmIFJYIENSQyBjb3VudAorCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJYX1NUQV9DTlQxLCAmdGVtcCk7IC8vUlggUExDUCBlcnJvciBjb3VudCAmIENDQSBmYWxzZSBhbGFybSBjb3VudAorCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJYX1NUQV9DTlQyLCAmdGVtcCk7IC8vUlggRklGTyBvdmVyZmxvdyBmcmFtZSBjb3VudCAmIFJYIGR1cGxpY2F0ZWQgZmlsdGVyZWQgZnJhbWUgY291bnQKKworCQlwQWQtPkNvbnRpbkJ1bGtJbiA9IFRSVUU7CisKKwkJLy8gRW5hYmxlIFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgUlggb2YgTUFDIGJsb2NrCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gS2ljayBidWxrIGluCisJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBJbnZhbGlkIGFyZyFcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCitJTlQJU2V0X0FURV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpZiAoQVRFQ21kSGFuZGxlcihwQWQsIGFyZykpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgRmFpbGVkXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMT1EQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMz1EQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyM1tpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0RBX1Byb2MgKERBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyM1swXSwKKwkJcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfREFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIzPVNBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIyPVNBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIyW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfU0FfUHJvYyAoU0EgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIyWzBdLAorCQlwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9TQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjI9QlNTSUQgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjE9QlNTSUQgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjFbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9CU1NJRF9Qcm9jIChCU1NJRCA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwJcEFkLT5hdGUuQWRkcjFbMF0sCisJCXBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0JTU0lEX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBDaGFubmVsCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0NIQU5ORUxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgY2hhbm5lbDsKKworCWNoYW5uZWwgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAyMTYpKS8vIHRvIGFsbG93IEEgYmFuZCBjaGFubmVsIDogKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMX4xNC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jIChBVEUgQ2hhbm5lbCA9ICVkKVxuIiwgcEFkLT5hdGUuQ2hhbm5lbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9DSEFOTkVMX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCWVsc2UvLyA1LjVHSHoKKwl7CisJCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXBBZC0+YXRlLlR4UG93ZXIwID0gVHhQb3dlcjsKKwlBVEVUeFB3ckhhbmRsZXIocEFkLCAwKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIwX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCX0KKwllbHNlCisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMSA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBBbnRlbm5hCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiB2YWx1ZTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgodmFsdWUgPiAyKSB8fCAodmFsdWUgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IHZhbHVlOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFsaW5rOiBTZXRfQVRFX1RYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUnggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMykgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBmcmVxdWVuY2Ugb2Zmc2V0CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgUkZGcmVxT2Zmc2V0OworCVVMT05HIFI0OworCisJUkZGcmVxT2Zmc2V0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKFJGRnJlcU9mZnNldCA+PSA2NCkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjYzLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUkZGcmVxT2Zmc2V0ID0gUkZGcmVxT2Zmc2V0OworCVI0ID0gcEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCVI0IHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgKCh+MHgwMDFmODAwMCkpKTsKKwlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyAoUkZGcmVxT2Zmc2V0ID0gJWQpXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBCVworCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9CV19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpbnQgaTsKKwlVQ0hBUiB2YWx1ZSA9IDA7CisJVUNIQVIgQkJQQ3VycmVudEJXOworCisJQkJQQ3VycmVudEJXID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKEJCUEN1cnJlbnRCVyA9PSAwKQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7CisJZWxzZQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfNDA7CisKKwlpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworIAkJZm9yIChpPTA7IGk8NTsgaSsrKQorIAkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorIAkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0pOworIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworIAkJCX0KKyAJCX0KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0wOjAKKyAJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworIAkJdmFsdWUgJj0gKH4weDE4KTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisgIAkJLy9TZXQgQkJQIFI2Nj0weDNDCisgCQl2YWx1ZSA9IDB4M0M7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjg9MHgwQgorCQkvL3RvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCisJCXZhbHVlID0gMHgwQjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY5PTB4MTYKKwkJdmFsdWUgPSAweDE2OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MDgKKwkJdmFsdWUgPSAweDA4OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTEKKwkJdmFsdWUgPSAweDExOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOworCisJICAgIC8vIElmIENoYW5uZWw9MTQsIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBTZXQgQkJQIFI0IGJpdDU9MQorCSAgICAvLyAoSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cykKKwkgICAgLy8gVGhpcyBzZWdtZW50IG9mIGNvZGUgd2lsbCBvbmx5IHdvcmtzIHdoZW4gQVRFVFhNT0RFIGFuZCBBVEVDSEFOTkVMCisJICAgIC8vIHdlcmUgc2V0IHRvIE1PREVfQ0NLIGFuZCAxNCByZXNwZWN0aXZlbHkgYmVmb3JlIEFURVRYQlcgaXMgc2V0IHRvIDAuCisJICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KQorCQl7CisJCQlpbnQgVHhNb2RlID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQkJaWYgKFR4TW9kZSA9PSBNT0RFX0NDSykKKwkJCXsKKwkJCQkvLyB3aGVuIENoYW5uZWw9PTE0ICYmIE1vZGU9PUNDSyAmJiBCYW5kV2lkdGg9PTIwTSwgQkJQIFI0IGJpdDU9MQorIAkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSB8PSAweDIwOyAvL3NldCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJZiBiYW5kd2lkdGggIT0gNDBNLCBSRiBSZWc0IGJpdCAyMSA9IDAuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgJj0gfjB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisJZWxzZSBpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID49IE1PREVfSFRNSVgpICYmIChwQWQtPmF0ZS5UeFdJLk1DUyA9PSA3KSkKKwkJCXsKKyAgICAJCQl2YWx1ZSA9IDB4Mjg7CisgICAgCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NywgdmFsdWUpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJLy9TZXQgQkJQIFI0IGJpdFs0OjNdPTE6MAorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJdmFsdWUgJj0gKH4weDE4KTsKKwkJdmFsdWUgfD0gMHgxMDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisKKwkJLy9TZXQgQkJQIFI2Nj0weDNDCisJCXZhbHVlID0gMHgzQzsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEMKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEM7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDFBCisJCXZhbHVlID0gMHgxQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MEEKKwkJdmFsdWUgPSAweDBBOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzM9MHgxNgorCQl2YWx1ZSA9IDB4MTY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCQkvLyBJZiBiYW5kd2lkdGggPSA0ME0sIHNldCBSRiBSZWc0IGJpdCAyMSA9IDEuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgfD0gMHgwMDIwMDAwMDsKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQldfUHJvYyAoQkJQQ3VycmVudEJXID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0JXX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGxlbmd0aAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhMZW5ndGggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoKHBBZC0+YXRlLlR4TGVuZ3RoIDwgMjQpIHx8IChwQWQtPmF0ZS5UeExlbmd0aCA+IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKQorCXsKKwkJcEFkLT5hdGUuVHhMZW5ndGggPSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAyNH4lZC5cbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2MgKFR4TGVuZ3RoID0gJWQpXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9MRU5HVEhfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgY291bnQKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhDb3VudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgTUNTCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTUNTX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIE1DUzsKKwlpbnQgcmVzdWx0OworCisJTUNTID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlyZXN1bHQgPSBDaGVja01DU1ZhbGlkKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSwgTUNTKTsKKworCWlmIChyZXN1bHQgIT0gLTEpCisJeworCQlwQWQtPmF0ZS5UeFdJLk1DUyA9IChVQ0hBUilNQ1M7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTUNTX1Byb2M6Ok91dCBvZiByYW5nZSwgcmVmZXIgdG8gcmF0ZSB0YWJsZS5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTUNTX1Byb2MgKE1DUyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTUNTX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1vZGUKKyAgICAgICAgMDogTU9ERV9DQ0sKKyAgICAgICAgMTogTU9ERV9PRkRNCisgICAgICAgIDI6IE1PREVfSFRNSVgKKyAgICAgICAgMzogTU9ERV9IVEdSRUVORklFTEQKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPiAzKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6Ok91dCBvZiByYW5nZS4gaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDB+M1xuIikpOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIwOiBDQ0ssIDE6IE9GRE0sIDI6IEhUX01JWCwgMzogSFRfR1JFRU5fRklFTEQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01PREVfUHJvYyAoVHhNb2RlID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTU9ERV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBHSQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0dJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPiAxKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9HSV9Qcm9jOjpPdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfR0lfUHJvYyAoR0kgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9HSV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQJU2V0X0FURV9SWF9GRVJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuYlJ4RmVyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwl7CisJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKKwkJcEFkLT5hdGUuUnhUb3RhbENudCA9IDA7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9GRVJfUHJvYyAoYlJ4RmVyID0gJWQpXG4iLCBwQWQtPmF0ZS5iUnhGZXIpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfRkVSX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjEgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMiA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIzID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIzKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjQgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMSA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIzID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIExvYWQgYW5kIFdyaXRlIEVFUFJPTSBmcm9tIGEgYmluYXJ5IGZpbGUgcHJlcGFyZWQgaW4gYWR2YW5jZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZuZGVmIFVDT1MKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JCSAgICByZXQgPSBGQUxTRTsKKwlQVUNIQVIJCQlzcmMgPSBFRVBST01fQklOX0ZJTEVfTkFNRTsKKwlzdHJ1Y3QgZmlsZQkJKnNyY2Y7CisJSU5UMzIgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVVTSE9SVCAJCQlXcml0ZUVFUFJPTVsoRUVQUk9NX1NJWkUvMildOworCVVJTlQzMgkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMiAJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZSkpOworCisJaWYgKHZhbHVlID4gMCkKKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIHNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJICAgICoqIHNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQorCSAgICAqLworCQlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCQkvKiBhcyByb290ICovCisJCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIAlvcmdmcyA9IGdldF9mcygpOworICAgIAlzZXRfZnMoS0VSTkVMX0RTKTsKKworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHJlYWQgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICAoUFVDSEFSKVdyaXRlRUVQUk9NLAorCQkJCQkJCQkJCSAgRUVQUk9NX1NJWkUsCisJCQkJCQkJCQkJICAmc3JjZi0+Zl9wb3MpOworCisJCQlpZiAoRmlsZUxlbmd0aCAhPSBFRVBST01fU0laRSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBlMnAuYmluXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIHdyaXRlIHRoZSBjb250ZW50IG9mIC5iaW4gZmlsZSB0byBFRVBST00gKi8KKwkJCQlydF9lZV93cml0ZV9hbGwocEFkLCBXcml0ZUVFUFJPTSk7CisJCQkJcmV0ID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IHdoaWxlKFRSVUUpOworCisJCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJCTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKworCQkJfQorCQl9CisKKwkJLyogcmVzdG9yZSAqLworCQlzZXRfZnMob3JnZnMpOworCQljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCQljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworCX0KKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8PT09ICVzIChyZXQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCkpOworCisgICAgcmV0dXJuIHJldDsKKworfQorI2Vsc2UKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCAJCQlXcml0ZUVFUFJPTVsoRUVQUk9NX1NJWkUvMildOworCXN0cnVjdCBpd3JlcQkqd3JxID0gKHN0cnVjdCBpd3JlcSAqKWFyZzsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXMgKHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkKVxuXG4iLCBfX0ZVTkNUSU9OX18sIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBFRVBST01fU0laRSkKKwl7CisJCWF0ZV9wcmludCgiJXM6IGVycm9yIGxlbmd0aCAoPSVkKSBmcm9tIGhvc3RcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZS8qICh3cnEtPnUuZGF0YS5sZW5ndGggPT0gRUVQUk9NX1NJWkUpICovCisJeworCQkvKiB6ZXJvIHRoZSBlMnAgYnVmZmVyICovCisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpV3JpdGVFRVBST00sIEVFUFJPTV9TSVpFKTsKKworCQkvKiBmaWxsIHRoZSBsb2NhbCBidWZmZXIgKi8KKwkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQlkbworCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKworCQl9IHdoaWxlKEZBTFNFKTsKKwkJfQorCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKyAgICByZXR1cm4gVFJVRTsKKworfQorI2VuZGlmIC8vICFVQ09TIC8vCisKK0lOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisJVVNIT1JUICpwOworCWludCBpOworCisJcnRfZWVfcmVhZF9hbGwocEFkLCAoVVNIT1JUICopYnVmZmVyKTsKKwlwID0gYnVmZmVyOworCWZvciAoaSA9IDA7IGkgPCAoRUVQUk9NX1NJWkUvMik7IGkrKykKKwl7CisJCWF0ZV9wcmludCgiJTQuNHggIiwgKnApOworCQlpZiAoKChpKzEpICUgMTYpID09IDApCisJCQlhdGVfcHJpbnQoIlxuIik7CisJCXArKzsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfQVRFX1Nob3dfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJYXRlX3ByaW50KCJNb2RlPSVkXG4iLCBwQWQtPmF0ZS5Nb2RlKTsKKwlhdGVfcHJpbnQoIlR4UG93ZXIwPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMCk7CisJYXRlX3ByaW50KCJUeFBvd2VyMT0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjEpOworCWF0ZV9wcmludCgiVHhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpOworCWF0ZV9wcmludCgiUnhBbnRlbm5hU2VsPSVkXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpOworCWF0ZV9wcmludCgiQkJQQ3VycmVudEJXPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKTsKKwlhdGVfcHJpbnQoIkdJPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpOworCWF0ZV9wcmludCgiTUNTPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLk1DUyk7CisJYXRlX3ByaW50KCJUeE1vZGU9JWRcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSk7CisJYXRlX3ByaW50KCJBZGRyMT0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEFkLT5hdGUuQWRkcjFbMF0sIHBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSk7CisJYXRlX3ByaW50KCJBZGRyMj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEFkLT5hdGUuQWRkcjJbMF0sIHBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSk7CisJYXRlX3ByaW50KCJBZGRyMz0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEFkLT5hdGUuQWRkcjNbMF0sIHBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSk7CisJYXRlX3ByaW50KCJDaGFubmVsPSVkXG4iLCBwQWQtPmF0ZS5DaGFubmVsKTsKKwlhdGVfcHJpbnQoIlR4TGVuZ3RoPSVkXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCk7CisJYXRlX3ByaW50KCJUeENvdW50PSV1XG4iLCBwQWQtPmF0ZS5UeENvdW50KTsKKwlhdGVfcHJpbnQoIlJGRnJlcU9mZnNldD0lZFxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiU2V0X0FURV9TaG93X1Byb2MgU3VjY2Vzc1xuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfQVRFX0hlbHBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJYXRlX3ByaW50KCJBVEU9QVRFU1RBUlQsIEFURVNUT1AsIFRYQ09OVCwgVFhDQVJSLCBUWEZSQU1FLCBSWEZSQU1FXG4iKTsKKwlhdGVfcHJpbnQoIkFURURBXG4iKTsKKwlhdGVfcHJpbnQoIkFURVNBXG4iKTsKKwlhdGVfcHJpbnQoIkFURUJTU0lEXG4iKTsKKwlhdGVfcHJpbnQoIkFURUNIQU5ORUwsIHJhbmdlOjB+MTQodW5sZXNzIEEgYmFuZCAhKVxuIik7CisJYXRlX3ByaW50KCJBVEVUWFBPVzAsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDEuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYUE9XMSwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMi5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhBTlQsIHNldCBUWCBhbnRlbm5hLiAwOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3by5cbiIpOworCWF0ZV9wcmludCgiQVRFUlhBTlQsIHNldCBSWCBhbnRlbm5hLjA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLCAzOmFudGVubmEgdGhyZWUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYRlJFUU9GRlNFVCwgc2V0IGZyZXF1ZW5jeSBvZmZzZXQsIHJhbmdlIDB+NjNcbiIpOworCWF0ZV9wcmludCgiQVRFVFhCVywgc2V0IEJhbmRXaWR0aCwgMDoyME1IeiwgMTo0ME1Iei5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhMRU4sIHNldCBGcmFtZSBsZW5ndGgsIHJhbmdlIDI0fiVkXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKKwlhdGVfcHJpbnQoIkFURVRYQ05ULCBzZXQgaG93IG1hbnkgZnJhbWUgZ29pbmcgdG8gdHJhbnNtaXQuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTUNTLCBzZXQgTUNTLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhNT0RFLCBzZXQgTW9kZSAwOkNDSywgMTpPRkRNLCAyOkhULU1peCwgMzpHcmVlbkZpZWxkLCByZWZlcmVuY2UgdG8gcmF0ZSB0YWJsZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhHSSwgc2V0IEdJIGludGVydmFsLCAwOkxvbmcsIDE6U2hvcnRcbiIpOworCWF0ZV9wcmludCgiQVRFUlhGRVIsIDA6ZGlzYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLiAxOmVuYWJsZSBSeCBGcmFtZSBlcnJvciByYXRlLlxuIik7CisJYXRlX3ByaW50KCJBVEVSUkYsIHNob3cgYWxsIFJGIHJlZ2lzdGVycy5cbiIpOworCWF0ZV9wcmludCgiQVRFV1JGMSwgc2V0IFJGMSByZWdpc3Rlci5cbiIpOworCWF0ZV9wcmludCgiQVRFV1JGMiwgc2V0IFJGMiByZWdpc3Rlci5cbiIpOworCWF0ZV9wcmludCgiQVRFV1JGMywgc2V0IFJGMyByZWdpc3Rlci5cbiIpOworCWF0ZV9wcmludCgiQVRFV1JGNCwgc2V0IFJGNCByZWdpc3Rlci5cbiIpOworCWF0ZV9wcmludCgiQVRFTERFMlAsIGxvYWQgRUVQUk9NIGZyb20gLmJpbiBmaWxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVSRTJQLCBkaXNwbGF5IGFsbCBFRVBST00gY29udGVudC5cbiIpOworCWF0ZV9wcmludCgiQVRFU0hPVywgZGlzcGxheSBhbGwgcGFyYW1ldGVycyBvZiBBVEUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURUhFTFAsIG9ubGluZSBoZWxwLlxuIik7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJQXNpY1N3aXRjaENoYW5uZWwoKSBkZWRpY2F0ZWQgZm9yIEFURS4KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBVEVBc2ljU3dpdGNoQ2hhbm5lbCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UMzIgUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMCwgVmFsdWUgPSAwOworCUNIQVIgVHhQd2VyID0gMCwgVHhQd2VyMiA9IDA7CisJVUNIQVIgaW5kZXgsIEJicFZhbHVlID0gMCwgUjY2ID0gMHgzMDsKKwlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7CisJVUNIQVIgQ2hhbm5lbDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgIT0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsKQorCQl7CisJCQlwQWQtPmF0ZS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOworCQl9CisJCXJldHVybjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJQ2hhbm5lbCA9IHBBZC0+YXRlLkNoYW5uZWw7CisKKwkvLyBTZWxlY3QgYW50ZW5uYQorCUFzaWNBbnRlbm5hU2VsZWN0KHBBZCwgQ2hhbm5lbCk7CisKKwkvLyBmaWxsIFR4IHBvd2VyIHZhbHVlCisJVHhQd2VyID0gcEFkLT5hdGUuVHhQb3dlcjA7CisJVHhQd2VyMiA9IHBBZC0+YXRlLlR4UG93ZXIxOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJLyogQnV0IG9ubHkgMjg1MCBhbmQgMjc1MCBzdXBwb3J0IDUuNUdIeiBiYW5kLi4uICovCisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJc3dpdGNoIChwQWQtPmF0ZS5SeEFudGVubmFTZWwpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlSMiB8PSAweDIwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJUjIgfD0gMHgxMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDE7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlSMiB8PSAweDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJLyogT25seSBlbmFibGUgdHdvIEFudGVubmEgdG8gcmVjZWl2ZS4gKi8KKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwODsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlpZiAocEFkLT5hdGUuVHhBbnRlbm5hU2VsID09IDEpCisJCQkJCQl7CisJCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWCBBbnRlbm5hIHNlbGVjdCBpcyAxICwgYml0IDE0ID0gMTsgRGlzYWJsZSBBbnQgMgorCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CQkvLzExMTAwMTExQgorCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAocEFkLT5hdGUuVHhBbnRlbm5hU2VsID09IDIpCisJCQkJCQl7CisJCQkJCQkJUjIgfD0gMHg4MDAwOwkvLyBJZiBUWCBBbnRlbm5hIHNlbGVjdCBpcyAyICwgYml0IDE1ID0gMTsgRGlzYWJsZSBBbnQgMQorCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CisJCQkJCQkJQmJwVmFsdWUgfD0gMHgwODsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OworCQkJCQkJCUJicFZhbHVlIHw9IDB4MTA7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwkJCQkJeworCQkJCQkJc3dpdGNoIChwQWQtPmF0ZS5SeEFudGVubmFTZWwpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlSMiB8PSAweDIwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJUjIgfD0gMHgxMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDE7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDM6CisJCQkJCQkJCVIyIHw9IDB4MzAwMDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAyOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MTA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChDaGFubmVsID4gMTQpCisJCQkJCXsKKwkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCQkJCQkvLyA1LjVHIGJhbmQgcG93ZXIgcmFuZ2U6IDB4Rjl+MFgwRiwgVFgwIFJlZzMgYml0OS9UWDEgUmVnNCBiaXQ2PSIwIiBtZWFucyB0aGUgVFggcG93ZXIgcmVkdWNlIDdkQgorCQkJCQkJLy8gUjMKKwkJCQkJCWlmICgoVHhQd2VyID49IC03KSAmJiAoVHhQd2VyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCk7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKSB8ICgxIDw8IDkpOworCQkJCQkJfQorCisJCQkJCQkvLyBSNAorCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KSAmJiAoVHhQd2VyMiA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoNytUeFB3ZXIyKTsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcjI9JWQgXG4iLCBUeFB3ZXIyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpIHwgKFR4UHdlciA8PCA5KTsgLy8gc2V0IFRYIHBvd2VyMAorCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBvZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCQkJCQl7CisJCQkJCQlSNCB8PTB4MjAwMDAwOworCQkJCQl9CisKKwkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlcworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFIzOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwkJCQkJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHN3aXRjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvLyAyMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwQSA9PT4gMHgwMDA1MEYwQQorCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisKKwkJLyogRm9yIDFULzJSIGNoaXAgb25seS4uLiAqLworCSAgICBpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkgICAgeworCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkgICAgfQorCisgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKwkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKKwkJeworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7CisJCX0KKworCQkvLyA1LjVHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvLzIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTA1ID09PiAweDAwMDUwRjA1CisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQorCQl7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKKwkJfQorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTEsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwNCkpOworCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisKKwkJLy8gNS41R0h6IGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUi4KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkgICAgfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKworICAgIC8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZworCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkJLy8gQkcgYmFuZAorCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJfQorCWVsc2UKKwl7CisJCS8vIDUuNSBHSHogYmFuZAorCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworICAgIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKwl9CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCWlmIChDaGFubmVsID4gMTQpCisJeworCQkvLyBXaGVuIDUuNUdIeiBiYW5kIHRoZSBMU0Igb2YgVHhQd3Igd2lsbCBiZSB1c2VkIHRvIHJlZHVjZWQgN2RCIG9yIG5vdC4KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAorCQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSV1LCBQd3IxPSV1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKKwkJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOworICAgIH0KK30KKworLy8KKy8vIEluIGZhY3QsIG5vIG9uZSB3aWxsIGNhbGwgdGhpcyByb3V0aW5lIHNvIGZhciAhCisvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCisJCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIEFURSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFURUFzaWNBZGp1c3RUeFBvd2VyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVAkJCWksIGo7CisJQ0hBUgkJRGVsdGFQd3IgPSAwOworCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKKwlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7CisJVUNIQVIJCUJicFI0OSA9IDAsIGlkeDsKKwlQQ0hBUgkJcFR4QWdjQ29tcGVuc2F0ZTsKKwlVTE9ORwkJVHhQd3JbNV07CisJQ0hBUgkJVmFsdWU7CisKKwkvKiBubyBvbmUgY2FsbHMgdGhpcyBwcm9jZWR1cmUgc28gZmFyICovCisJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuCisJLy8gRG8gaXQgcGVyIDQgc2Vjb25kcy4KKwlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJLyogYmcgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkc7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBhIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZBOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEE7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCXsKKwkJCS8qIEJicFI0OSBpcyB1bnNpZ25lZCBjaGFyICovCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNDksICZCYnBSNDkpOworCisJCQkvKiAocCkgVHNzaVBsdXNCb3VuZGFyeUdbMF0gPSAwID0gKG0pIFRzc2lNaW51c0JvdW5kYXJ5R1swXSAqLworCQkJLyogY29tcGVuc2F0ZTogKzQgICAgICszICAgKzIgICArMSAgICAwICAgLTEgICAtMiAgIC0zICAgLTQgKiBzdGVwcyAqLworCQkJLyogc3RlcCB2YWx1ZSBpcyBkZWZpbmVkIGluIHBBZC0+VHhBZ2NTdGVwRyBmb3IgdHggcG93ZXIgdmFsdWUgKi8KKworCQkJLyogWzRdKzErWzRdICAgcDQgICAgIHAzICAgcDIgICBwMSAgIG8xICAgbTEgICBtMiAgIG0zICAgbTQgKi8KKwkJCS8qIGV4OiAgICAgICAgIDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCQkgICBhYm92ZSB2YWx1ZSBhcmUgZXhhbWluZWQgaW4gbWFzcyBmYWN0b3J5IHByb2R1Y3Rpb24gKi8KKwkJCS8qICAgICAgICAgICAgIFs0XSAgICBbM10gIFsyXSAgWzFdICBbMF0gIFsxXSAgWzJdICBbM10gIFs0XSAqLworCisJCQkvKiBwbHVzIGlzIDB4MTAgfiAweDQwLCBtaW51cyBpcyAweDYwIH4gMHg5MCAqLworCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCisJCQkvKiBpZiB2YWx1ZSBpcyAweDY1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLworCisJCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZS4KKwkJCQkvLyBDaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyLgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5IDw9IHBUc3NpTWludXNCb3VuZGFyeVtpZHhdKSAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBkZWNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKy8vCQkJCWlmIChSMyA+IChVTE9ORykgKFR4QWdjU3RlcCAqIChpZHgtMSkpKQorCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeC0xKSk7CisvLwkJCQllbHNlCisvLwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKChVQ0hBUilSMyk7CisKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9IC0lZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlIGlmIChCYnBSNDkgPCBwVHNzaVBsdXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlCisJCQkJLy8gY2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlcgorCQkJCWZvciAoaWR4ID0gMTsgaWR4IDwgNTsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pICAgLy8gRm91bmQgdGhlIHJhbmdlCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7CisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJLyogY2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJICovCisJLy8gRTJQUk9NIHNldHRpbmcgaXMgY2FsaWJyYXRlZCBmb3IgbWF4aW11bSBUWCBwb3dlciAoaS5lLiAxMDAlKQorCS8vIFdlIGxvd2VyIFRYIHBvd2VyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID09IDB4ZmZmZmZmZmYpICAgICAgIC8vIEFVVE8gVFggUE9XRVIgY29udHJvbAorCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8vIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDY7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDk7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDEyOworCX0KKworCS8qIHJlc2V0IGRpZmZlcmVudCBuZXcgdHggcG93ZXIgZm9yIGRpZmZlcmVudCBUWCByYXRlICovCisJZm9yKGk9MDsgaTw1OyBpKyspCisJeworCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJeworCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJeworCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7IC8qIDAgfiAxNSAqLworCisJCQkJaWYgKChWYWx1ZSArIERlbHRhUHdyKSA8IDApCisJCQkJeworCQkJCQlWYWx1ZSA9IDA7IC8qIG1pbiAqLworCQkJCX0KKwkJCQllbHNlIGlmICgoVmFsdWUgKyBEZWx0YVB3cikgPiAweEYpCisJCQkJeworCQkJCQlWYWx1ZSA9IDB4RjsgLyogbWF4ICovCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVZhbHVlICs9IERlbHRhUHdyOyAvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24gKi8KKwkJCQl9CisKKwkJCQkvKiBmaWxsIG5ldyB2YWx1ZSB0byBDU1Igb2Zmc2V0ICovCisJCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKKwkJCX0KKworCQkJLyogd3JpdGUgdHggcG93ZXIgdmFsdWUgdG8gQ1NSICovCisJCQkvKiBUWF9QV1JfQ0ZHXzAgKDggdHggcmF0ZSkgZm9yCVRYIHBvd2VyIGZvciBPRkRNIDEyTS8xOE0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIE9GRE0gNk0vOU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzUuNU0vMTFNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0sxTS8yTSAqLworCQkJLyogVFhfUFdSX0NGR18xIH4gVFhfUFdSX0NGR180ICovCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIFR4UHdyW2ldKTsKKworCisJCX0KKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlXcml0ZSBUeFdJIGZvciBBVEUgbW9kZS4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwVHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCU1JTU9wcywKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJVHJhbnNtaXQpCit7CisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJcFR4V0ktPkZSQUc9IEZSQUc7CisJcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7CisJcFR4V0ktPkFNUERVID0gQU1QRFU7CisKKwlwVHhXSS0+TUlNT3BzID0gUFdSX0FDVElWRTsKKwlwVHhXSS0+TXBkdURlbnNpdHkgPSA0OworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3AgPSBUeG9wbW9kZTsKKwlwVHhXSS0+TlNFUSA9IE5TZXE7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCXBUeFdJLT5CVyA9IFRyYW5zbWl0LmZpZWxkLkJXOworCXBUeFdJLT5TaG9ydEdJID0gVHJhbnNtaXQuZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQz0gVHJhbnNtaXQuZmllbGQuU1RCQzsKKworCXBUeFdJLT5NQ1MgPSBUcmFuc21pdC5maWVsZC5NQ1M7CisJcFR4V0ktPlBIWU1PREU9IFRyYW5zbWl0LmZpZWxkLk1PREU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLworCS8vIE1NUFMgaXMgODAyLjExbiBmZWF0dXJlcy4gQmVjYXVzZSBUeFdJLT5NQ1MgPiA3IG11c3QgYmUgSFQgbW9kZSwKKwkvLyBzbyBuZWVkIG5vdCBjaGVjayBpZiBpdCdzIEhUIHJhdGUuCisJLy8KKwlpZiAoKE1JTU9wcyA9PSBNTVBTX1NUQVRJQykgJiYgKHBUeFdJLT5NQ1MgPiA3KSkKKwkJcFR4V0ktPk1DUyA9IDc7CisKKwlpZiAoKE1JTU9wcyA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHhXSS0+TUNTID4gNykpIC8vIFNNUFMgcHJvdGVjdCAyIHNwYXRpYWwuCisJCXBUeFdJLT5NSU1PcHMgPSAxOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcFR4V0ktPkNGQUNLID0gQ2ZBY2s7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRGlzYWJsZSBwcm90ZWN0aW9uIGZvciBBVEUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBVEVEaXNhYmxlQXNpY1Byb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVBST1RfQ0ZHX1NUUlVDCVByb3RDZmcsIFByb3RDZmc0OworCVVJTlQzMiBQcm90ZWN0WzZdOworCVVTSE9SVAkJCW9mZnNldDsKKwlVQ0hBUgkJCWk7CisJVUlOVDMyIE1hY1JlZyA9IDA7CisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uCisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CisJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCisJLy8gTk8gUFJPVEVDVAorCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCS8vIE1NMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCS8vIE1NNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkvLyBDRjIwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkvLyBDRjQwX1BST1RfQ0ZHCisJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCit9CisKKyNpZmRlZiBSVDI4NzAKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJV3JpdGUgVHhJbmZvIGZvciBBVEUgbW9kZS4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIEFURVdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JQk9PTEVBTgkJYldpdiwKKwlJTglVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCVVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCVVDSEFSCQkJVHhCdXJzdCkKK3sKKwlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFVTQkRNQXBrdExlbjsKKwlwVHhJbmZvLT5RU0VMID0gUXVldWVTZWw7CisKKwlpZiAoUXVldWVTZWwgIT0gRklGT19FRENBKQorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09PiBRdWV1ZVNlbCAhPSBGSUZPX0VEQ0E8PT09PT09PVxuIikpOworCisJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IE5leHRWYWxpZDsKKwlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gVHhCdXJzdDsKKwlwVHhJbmZvLT5XSVYgPSBiV2l2OworCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMDsKKwlwVHhJbmZvLT5yc3YgPSAwOworCXBUeEluZm8tPnJzdjIgPSAwOworCisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29udmVydCBSc3NpICovCisjaWYgMQorLy8KKy8vIFRoZSB3YXkgdXNlZCB3aXRoIEdFVF9MTkFfR0FJTigpLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKwlMTkFHYWluID0gR0VUX0xOQV9HQUlOKHBBZCk7CisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorCXsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisJfQorCWVsc2UKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworCX0KKworCXJldHVybiAoLTEyIC0gUnNzaU9mZnNldCAtIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbHNlCisvLworLy8gVGhlIHdheSBvcmlnaW5hbGx5IHVzZWQgaW4gQVRFIG9mIHJ0Mjg2MGFwLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkFMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTE5BR2FpbiA9IHBBZC0+QkxOQUdhaW47CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworICAgIH0KKworICAgIHJldHVybiAoLTMyIC0gUnNzaU9mZnNldCArIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIDEgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBKYXBhbiBmaWx0ZXIgY29lZmZpY2llbnRzIGlmIG5lZWRlZC4KKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4KKwkJZW50ZXJpbmcgVFhGUkFNRSBtb2RlIG9yIFRYQ09OVCBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgU2V0SmFwYW5GaWx0ZXIoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJQmJwRGF0YSA9IDA7CisKKwkvLworCS8vIElmIENoYW5uZWw9MTQgYW5kIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBzZXQgQkJQIFI0IGJpdDU9MQorCS8vIChKYXBhbiBUeCBmaWx0ZXIgY29lZmZpY2llbnRzKXdoZW4gKFRYRlJBTUUgb3IgVFhDT05UKS4KKwkvLworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQmJwRGF0YSk7CisKKyAgICBpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpICYmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKSkKKyAgICB7CisgICAgICAgIEJicERhdGEgfD0gMHgyMDsgICAgLy8gdHVybiBvbgorICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRKYXBhbkZpbHRlciEhIVxuIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlCYnBEYXRhICY9IDB4ZGY7ICAgIC8vIHR1cm4gb2ZmCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNsZWFySmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJicERhdGEpOworfQorCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQoreworCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb2xsZWN0IFJTU0kuICovCisjaWYgMQorCS8vcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCWlmIChwUnhXSS0+UlNTSTAgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMAk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kwLCBSU1NJXzApOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwICAJPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJfQorCWlmIChwUnhXSS0+UlNTSTEgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMQk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOworCQlwQWQtPmF0ZS5BdmdSc3NpMVg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxCT0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kyICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTIJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTJYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOworCQlwQWQtPmF0ZS5BdmdSc3NpMgk9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwl9CisKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsvLyBDSEFSID09PiBVQ0hBUiA/CisKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZWxzZQorCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsKKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7CisJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKKwlwQWQtPmF0ZS5MYXN0UnNzaTAgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTEgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTIgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJcEFkLT5hdGUuQXZnUnNzaTAgPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCXBBZC0+YXRlLkF2Z1Jzc2kxID0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwlwQWQtPmF0ZS5BdmdSc3NpMiA9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisvLwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0b3BcbiIpKTsKKworI2lmIDAKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZgorCS8vIEZvciByeCBzdGF0aXN0aWNzLCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyB0aW1lciBydW5uaW5nLgorLy8JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0b3BcbiIpKTsKK30KKworVk9JRCBSVE1QU3RhdGlvblN0YXJ0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTZXR1cCBGcmFtZSBmb3JtYXQuCisJTk9URToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gQVRFIG1vZGUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjaWZkZWYgUlQyODcwCisvKj09PT09PT09PT09PT09PT09PT09PT1TdGFydCBvZiBSVDI4NzA9PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgSU5UIEFURVNldFVwRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDMyIFR4SWR4KQoreworCVVJTlQgajsKKwlQVFhfQ09OVEVYVAlwTnVsbENvbnRleHQ7CisJUFVDSEFSCQkJcERlc3Q7CisJSFRUUkFOU01JVF9TRVRUSU5HCVR4SFRQaHlNb2RlOworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwlQVFhJTkZPX1NUUlVDCQlwVHhJbmZvOworCVVJTlQzMgkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBPcmdCdWZmZXJMZW5ndGggPSAwOworCVVDSEFSCQkJcGFkTGVuID0gMDsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMSA9IE5VTEw7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgfHwKKwkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgfHwKKwkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgfHwKKwkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogV2UgYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSBpbiBBVEUgbW9kZS4gKi8KKworCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJQVNTRVJUKHBOdWxsQ29udGV4dCAhPSBOVUxMKTsKKworCWlmIChwTnVsbENvbnRleHQtPkluVXNlID09IEZBTFNFKQorCXsKKwkJLy8gU2V0IHRoZSBpbiB1c2UgYml0CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCQlOZGlzWmVyb01lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCQkvLyBGaWxsIDgwMi4xMSBoZWFkZXIuCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEhlYWRlcjgwMjExID0gTmRpc01vdmVNZW1vcnkoJihwQWQtPk51bGxGcmFtZSksIHBBZC0+YXRlLkhlYWRlciwgcEFkLT5hdGUuSExlbik7CisvLwkJCXBEZXN0ID0gTmRpc01vdmVNZW1vcnkoJihwQWQtPk51bGxGcmFtZSksIHBBZC0+YXRlLkhlYWRlciwgcEFkLT5hdGUuSExlbik7CisvLwkJCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwRGVzdDsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJeworCQkJLy8gRmlsbCA4MDIuMTEgaGVhZGVyLgorCQkJTmRpc01vdmVNZW1vcnkoJihwQWQtPk51bGxGcmFtZSksIFRlbXBsYXRlRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCX0KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpJihwQWQtPk51bGxGcmFtZSksIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLyogbW9kaWZ5IHNlcXVlbmNlIG51bWJlci4uLi4gKi8KKwkJCWlmIChwQWQtPmF0ZS5UeERvbmVDb3VudCA9PSAwKQorCQkJeworCQkJCXBBZC0+YXRlLnNlcSA9IHBIZWFkZXI4MDIxMS0+U2VxdWVuY2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9ICsrcEFkLT5hdGUuc2VxOworCQkJfQorCQkJLyogV2UgYWxyZWFkeSBnb3QgYWxsIHRoZSBhZGRyLiBmaWVsZHMgZnJvbSBRQSBHVUkuICovCisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjEsIHBBZC0+YXRlLkFkZHIxKTsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+YXRlLkFkZHIyKTsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+YXRlLkFkZHIzKTsKKwkJfQorCisJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgVFhfQlVGRkVSX05PUk1TSVpFKTsvLz8/PworCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLy8gQXZvaWQgdG8gZXhjZWVkIHRoZSByYW5nZSBvZiBXaXJlbGVzc1BhY2tldFtdLgorCQkJQVNTRVJUKHBBZC0+YXRlLlR4SW5mby5VU0JETUFUeFBrdExlbiA8PSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBUeEluZm8sICYocEFkLT5hdGUuVHhJbmZvKSwgc2l6ZW9mKHBBZC0+YXRlLlR4SW5mbykpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQl7CisJCQkvLyBBdm9pZCB0byBleGNlZWQgdGhlIHJhbmdlIG9mIFdpcmVsZXNzUGFja2V0W10uCisJCQlBU1NFUlQocEFkLT5hdGUuVHhMZW5ndGggPD0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSk7CisKKwkJCS8vIHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuIHdpbGwgYmUgdXBkYXRlZCB0byBpbmNsdWRlIHBhZGRpbmcgbGF0ZXIuCisJCQlBVEVXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKFRYV0lfU0laRSArIHBBZC0+YXRlLlR4TGVuZ3RoKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7CisJCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQl9CisKKwkJcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKworCQkvLyBGaWxsIFR4V0kuCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBwQWQtPmF0ZS5UeFdJLlNob3J0R0k7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gcEFkLT5hdGUuVHhXSS5TVEJDOworCQkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQkJQVRFV3JpdGVUeFdJKHBBZCwgcFR4V0ksIHBBZC0+YXRlLlR4V0kuRlJBRywgcEFkLT5hdGUuVHhXSS5UUywgcEFkLT5hdGUuVHhXSS5BTVBEVSwgcEFkLT5hdGUuVHhXSS5BQ0ssIHBBZC0+YXRlLlR4V0kuTlNFUSwKKwkJCQlwQWQtPmF0ZS5UeFdJLkJBV2luU2l6ZSwgQlNTSURfV0NJRCwgcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQvKiBpbmNsdWRlIDgwMi4xMSBoZWFkZXIgKi8sIHBBZC0+YXRlLlR4V0kuUGFja2V0SWQsIDAsIHBBZC0+YXRlLlR4V0kudHhvcC8qSUZTX0hUVFhPUCovLCBwQWQtPmF0ZS5UeFdJLkNGQUNLLypGQUxTRSovLCBUeEhUUGh5TW9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+YXRlLlR4V0kuQlc7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQkJVHhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPmF0ZS5UeFdJLk1DUzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisKKwkJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UvKiBObyBhY2sgcmVxdWlyZWQuICovLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgcEFkLT5hdGUuVHhMZW5ndGgsCisJCQkJMCwgMCwgSUZTX0hUVFhPUCwgRkFMU0UsIFR4SFRQaHlNb2RlKTsvLyAiTU1QU19TVEFUSUMiIGluc3RlYWQgb2YgIk1NUFNfRFlOQU1JQyIgPz8/CisJCX0KKworCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkUrVFhXSV9TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJCXBEZXN0ID0gJihwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRStUWFdJX1NJWkUrc2l6ZW9mKEhFQURFUl84MDJfMTEpXSk7CisKKwkJLy8gUHJlcGFyZSBmcmFtZSBwYXlsb2FkCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJLy8gY29weSBwYXR0ZXJuCisJCQlpZiAoKHBBZC0+YXRlLlBMZW4gIT0gMCkpCisJCQl7CisJCQkJZm9yIChqID0gMDsgaiA8IHBBZC0+YXRlLkRMZW47IGorPXBBZC0+YXRlLlBMZW4pCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeShwRGVzdCwgcEFkLT5hdGUuUGF0dGVybiwgcEFkLT5hdGUuUExlbik7CisJCQkJCXBEZXN0ICs9IHBBZC0+YXRlLlBMZW47CisJCQkJfQorCQkJfQorCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQl7CisJCSAgICBmb3IgKGogPSAwOyBqIDwgKHBBZC0+YXRlLlR4TGVuZ3RoIC0gc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsgaisrKQorCQkgICAgeworCQkJCSpwRGVzdCA9IDB4QTU7CisJCQkJcERlc3QgKz0gMTsKKwkJICAgIH0KKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBwQWQtPmF0ZS5UeExlbmd0aDsKKwkJfQorCisjaWYgMQorCQlPcmdCdWZmZXJMZW5ndGggPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aDsKKwkJVHJhbnNmZXJCdWZmZXJMZW5ndGggPSAoVHJhbnNmZXJCdWZmZXJMZW5ndGggKyAzKSAmICh+Myk7CisKKwkJLy8gQWx3YXlzIGFkZCA0IGV4dHJhIGJ5dGVzIGF0IGV2ZXJ5IHBhY2tldC4KKwkJcGFkTGVuID0gVHJhbnNmZXJCdWZmZXJMZW5ndGggLSBPcmdCdWZmZXJMZW5ndGggKyA0Oy8qIDQgPT0gbGFzdCBwYWNrZXQgcGFkZGluZyAqLworCQlBU1NFUlQoKHBhZExlbiA8PSAoUlRNUF9QS1RfVEFJTF9QQURESU5HIC0gNC8qIDQgPT0gTWF4QnVsa091dHNpemUgYWxpZ25tZW50IHBhZGRpbmcgKi8pKSk7CisKKwkJLyogTm93IG1lbXplcm8gYWxsIGV4dHJhIHBhZGRpbmcgYnl0ZXMuICovCisJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCBwYWRMZW4pOworCQlwRGVzdCArPSBwYWRMZW47CisjZWxzZQorCQlpZiAoKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICUgNCkgPT0gMSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocERlc3QsIDcpOworCQkJcERlc3QgKz0gNzsKKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICArPSAzOworCQl9CisJCWVsc2UgaWYgKChUcmFuc2ZlckJ1ZmZlckxlbmd0aCAlIDQpID09IDIpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCA2KTsKKwkJCXBEZXN0ICs9IDY7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCAgKz0gMjsKKwkJfQorCQllbHNlIGlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSA0KSA9PSAzKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNSk7CisJCQlwRGVzdCArPSA1OworCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggICs9IDE7CisJCX0KKyNlbmRpZiAvLyAxIC8vCisKKwkJLy8gVXBkYXRlIHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuIHRvIGluY2x1ZGUgcGFkZGluZy4KKwkJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aCAtIFRYSU5GT19TSVpFOworCisJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICs9IDQ7CisKKwkJLy8gSWYgVHJhbnNmZXJCdWZmZXJMZW5ndGggaXMgbXVsdGlwbGUgb2YgNjQsIGFkZCBleHRyYSA0IGJ5dGVzIGFnYWluLgorCQlpZiAoKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocERlc3QsIDQpOworCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggKz0gNDsKKwkJfQorCisJCS8vIEZpbGwgb3V0IGZyYW1lIGxlbmd0aCBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIEJ1bGsgb3V0IGFyYml0b3IKKwkJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCX0KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBUeEluZm8pK1RYV0lfU0laRStUWElORk9fU0laRSksIERJUl9XUklURSwgRkFMU0UpOworICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlyZXR1cm4gMDsKK30KKworVk9JRCBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBUWF9DT05URVhUCQkgICAgcE51bGxDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisJVUxPTkcJCQkgICAgT2xkVmFsdWU7CisKKwlwTnVsbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwTnVsbENvbnRleHQtPnBBZDsKKworCisJLy8gUmVzZXQgTnVsbCBmcmFtZSBjb250ZXh0IGZsYWdzCisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBOdWxsQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWlmICgoQVRFX09OKHBBZCkpICYmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpKQorCQl7CisJCQlpZiAocEFkLT5hdGUuUUlEID09IEJ1bGtPdXRQaXBlSWQpCisJCQl7CisJCQkJLy8gTGV0IFJ4IGNhbiBoYXZlIGEgY2hhbmNlIHRvIGJyZWFrIGluIGR1cmluZyBUeCBwcm9jZXNzLAorCQkJCS8vIGVzcGVjaWFsbHkgZm9yIGxvb3BiYWNrIG1vZGUgaW4gUUEgQVRFLgorCQkJCS8vIFRvIHRyYWRlIG9mZiBiZXR3ZWVuIHR4IHBlcmZvcm1hbmNlIGFuZCBsb29wYmFjayBtb2RlIGludGVncml0eS4KKwkJCQkvKiBRICAgOiBOb3cgUnggaXMgaGFuZGxlZCBieSB0YXNrbGV0LCBkbyB3ZSBzdGlsbCBuZWVkIHRoaXMgZGVsYXkgPyAqLworCQkJCS8qIEFucyA6IEV2ZW4gdGFza2xldCBpcyB1c2VkLCBSeC9UeCA8IDEgaWYgd2UgZG8gbm90IGRlbGF5IGZvciBhIHdoaWxlIHJpZ2h0IGhlcmUuICovCisJCQkJUlRNUHVzZWNEZWxheSg1MDApOworCQkJCXBBZC0+YXRlLlR4RG9uZUNvdW50Kys7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7CisJCQkJcEFkLT5hdGUuVHhBYzArKzsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXBBZC0+QnVsa091dENvbXBsZXRlKys7CisKKwkJcEFkLT5Db3VudGVyczgwMjMuR29vZFRyYW5zbWl0cysrOworCisJCS8qIERvbid0IHdvcnJ5IGFib3V0IHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBub3QuIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpdHNlbGYuICovCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOworCisJCS8qIEluIDI4eHgsIFNlbmRUeFdhaXRRdWV1ZSA9PT4gVHhTd1F1ZXVlICAqLworLyoKKwkJaWYgKHBBZC0+U2VuZFR4V2FpdFF1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApCisJCXsKKwkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgQnVsa091dFBpcGVJZCk7CisJCX0KKyovCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQnVsa091dERhdGFQYWNrZXQgRmFpbGVkIFNUQVRVU19PVEhFUiA9IDB4JXggLiBcbiIsIFN0YXR1cykpOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXRSZXE9MHglbHgsIEJ1bGtPdXRDb21wbGV0ZT0weCVseFxuIiwgcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSkpOworCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCS8qIEluIDI4eHgsIFJUX09JRF9VU0JfUkVTRVRfQlVMS19PVVQgPT0+IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCAqLworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQkJLy8gQ2hlY2sKKwkJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfQorCisKKworCWlmIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkKKwl7CisJCWF0b21pY19kZWMoJnBBZC0+QnVsa091dFJlbWFpbmVkKTsKKwl9CisKKwkvLyAxc3QgLSBUcmFuc21pdCBTdWNjZXNzCisJT2xkVmFsdWUgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQrKzsKKworCWlmIChwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJeworCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5IaWdoUGFydCsrOworCX0KKworCWlmKCgocEFkLT5Db250aW5CdWxrT3V0ID09IFRSVUUgKSB8fChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkpICYmIChwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQorCXsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSk7CisJfQorCWVsc2UKKwl7CisJCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSk7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJfQorCisJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lLgorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQpCit7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJQVNTRVJUKEJ1bGtPdXRQaXBlSWQgPT0gMCk7CisKKwkvKiBCdWlsZCB1cCB0aGUgZnJhbWUgZmlyc3QuICovCisvLwlBVEVTZXRVcEZyYW1lKHBBZCwgMCk7CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwlpZiAocEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9PSBUUlVFKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gVFJVRTsKKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKworCS8vIENsZWFyIEFURSBmcmFtZSBidWxrIG91dCBmbGFnCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwTnVsbENvbnRleHQsIEJ1bGtPdXRQaXBlSWQsICh1c2JfY29tcGxldGVfdClBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKwlwVXJiID0gcE51bGxDb250ZXh0LT5wVXJiOworCisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworCXBBZC0+QnVsa091dFJlcSsrOworCXJldHVybjsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJVUlOVAkJCWk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworI2lmIDEKKwlmb3IgKCBpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmKHBSeENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJeworCQkJUlRVU0JfVU5MSU5LX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQkvL05kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJLy9wQWQtPlBlbmRpbmdSeC0tOworCQl9CisJfQorI2Vsc2UKKwlmb3IgKCBpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmKGF0b21pY19yZWFkKCZwUnhDb250ZXh0LT5JcnBMb2NrKSA9PSBJUlBMT0NLX0NBTkNFTEFCTEUpCisJCXsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCX0KKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcFJ4Q29udGV4dC0+SXJwTG9jaywgSVJQTE9DS19DQU5DRV9TVEFSVCk7CisJfQorI2VuZGlmIC8vIDEgLy8KKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCBydF9lZV9yZWFkX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJRGF0YVtpXSA9IHZhbHVlOworCQlpKys7CisJfQorfQorCitWT0lEIHJ0X2VlX3dyaXRlX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJdmFsdWUgPSBEYXRhW2ldOworCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJaSArKzsKKwl9Cit9CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCQlwUnhXSSwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKKwlJTiBQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXIpCit7CisJLy8gdXBkYXRlIGNvdW50ZXIgZmlyc3QKKwlpZiAocEhlYWRlciAhPSBOVUxMKQorCXsKKwkJaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwkJeworCQkJaWYgKHBSeEQtPlUyTSkKKwkJCQlwQWQtPmF0ZS5VMk0rKzsKKwkJCWVsc2UKKwkJCQlwQWQtPmF0ZS5PdGhlckRhdGErKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJCXsKKwkJCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorCQkJCXBBZC0+YXRlLkJlYWNvbisrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJCXsKKwkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCX0KKwlwQWQtPmF0ZS5SU1NJMCA9IHBSeFdJLT5SU1NJMDsKKwlwQWQtPmF0ZS5SU1NJMSA9IHBSeFdJLT5SU1NJMTsKKwlwQWQtPmF0ZS5SU1NJMiA9IHBSeFdJLT5SU1NJMjsKKwlwQWQtPmF0ZS5TTlIwID0gcFJ4V0ktPlNOUjA7CisJcEFkLT5hdGUuU05SMSA9IHBSeFdJLT5TTlIxOworfQorCisvKiBjb21tYW5kIGlkIHdpdGggQ21kIFR5cGUgPT0gMHgwMDA4KGZvciAyOHh4KS8weDAwMDUoZm9yIGlOSUMpICovCisjZGVmaW5lIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEwJCTB4MDAwMAorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNgkJMHgwMDAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNgkweDAwMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAkweDAwMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwJMHgwMDA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFECQkJMHgwMDA1CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19XUklURQkJCTB4MDAwNgorI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLCQkweDAwMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEOAkJCTB4MDAwOAorI2RlZmluZSBSQUNGR19DTURfQkJQX1dSSVRFOAkJMHgwMDA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwJCTB4MDAwYQorI2RlZmluZSBSQUNGR19DTURfR0VUX0NPVU5URVIJCTB4MDAwYgorI2RlZmluZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUgkJMHgwMDBjCisKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjEJCQkJMHgwMDBkCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YyCQkJCTB4MDAwZQorI2RlZmluZSBSQUNGR19DTURfUlNWMwkJCQkweDAwMGYKKworI2RlZmluZSBSQUNGR19DTURfVFhfU1RBUlQJCQkweDAwMTAKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMJCTB4MDAxMQorI2RlZmluZSBSQUNGR19DTURfVFhfU1RPUAkJCTB4MDAxMgorI2RlZmluZSBSQUNGR19DTURfUlhfU1RBUlQJCQkweDAwMTMKKyNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUT1AJCQkweDAwMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTAkweDAwMTUKKworI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUCQkJMHgwMDgwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RPUAkJCTB4MDA4MQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUgkJMHgwMTAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVAkJCTB4MDEwMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FCQkweDAxMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQlcJICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMAkgICAgICAgIDB4MDEwNAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEJCQkweDAxMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQJCTB4MDEwNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTCQkweDAxMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSCQkJMHgwMTA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEJCTB4MDEwOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BCQkweDAxMGEKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUJCQkweDAxMGIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTAkJCTB4MDEwYworI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMQkJCQkweDAxMGQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjIJCQkJMHgwMTBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzCQkJCTB4MDEwZgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFCQkJCTB4MDExMAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4JCTB4MDExMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVAkweDAxMTIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRQkJMHgwMTEzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSwkweDAxMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSwkweDAxMTUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLCQkweDAxMTYKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLCQkweDAxMTcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSwkweDAxMTgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsJCTB4MDExOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsJCTB4MDExYQorCisKKworI2RlZmluZSBBMkhleChfWCwgX3ApIAkJCQlcCit7CQkJCQkJCQkJXAorCVVDSEFSICpwOwkJCQkJCVwKKwlfWCA9IDA7CQkJCQkJCVwKKwlwID0gX3A7CQkJCQkJCVwKKwl3aGlsZSAoKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpIHx8ICgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJaWYgKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKQkJCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDg3OwkJCQkJXAorCQllbHNlIGlmICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gNTU7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA0ODsJCQkJCVwKKwkJcCsrOwkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30KKworCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKTsKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKTsKKworI2lmZGVmIFVDT1MKK2ludCBhdGVfY29weV90b191c2VyKAorCUlOIFBVQ0hBUiBwYXlsb2FkLAorCUlOIFBVQ0hBUiBtc2csCisJSU4gSU5UICAgIGxlbikKK3sKKwltZW1tb3ZlKHBheWxvYWQsIG1zZywgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmCWNvcHlfdG9fdXNlcgorI2RlZmluZSBjb3B5X3RvX3VzZXIoeCx5LHopIGF0ZV9jb3B5X3RvX3VzZXIoKFBVQ0hBUil4LCAoUFVDSEFSKXksIHopCisjZW5kaWYgLy8gVUNPUyAvLworCisjZGVmaW5lCUxFTl9PRl9BUkcgMTYKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBDb21tYW5kX0lkOworCXN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZzsKKwlJTlQJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCisKKwlpZigocFJhQ2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCXsKKwkJU3RhdHVzID0gLUVJTlZBTDsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KHBSYUNmZywgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKTsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcigoUFVDSEFSKXBSYUNmZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCWtmcmVlKHBSYUNmZyk7CisJCXJldHVybjsKKwl9CisKKworCUNvbW1hbmRfSWQgPSBudG9ocyhwUmFDZmctPmNvbW1hbmRfaWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzOiBDb21tYW5kX0lkID0gMHglMDR4ICFcbiIsIF9fRlVOQ1RJT05fXywgQ29tbWFuZF9JZCkpOworCisJc3dpdGNoIChDb21tYW5kX0lkKQorCXsKKyAJCS8vIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCB3aGVuIFFBIHN0YXJ0cy4KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LgorCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RBUlQiKTsKKwkJCX0KKwkJCWJyZWFrOworCisgCQkvLyBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgZWl0aGVyIFFBIGlzIGNsb3NlZCBvciBhdGVkIGlzIGtpbGxlZCBieSB1c2VyLgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUDoKKwkJCXsKKyNpZm5kZWYgVUNPUworCQkJCUlOVDMyIHJldDsKKyNlbmRpZiAvLyAhVUNPUyAvLworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKKworCQkJCS8vIERpc3Rpbmd1aXNoIHRoaXMgY29tbWFuZCBjYW1lIGZyb20gUUEodmlhIGF0ZWQpCisJCQkJLy8gb3IgYXRlIGRhZW1vbiBhY2NvcmRpbmcgdG8gdGhlIGV4aXN0ZW5jZSBvZiBwaWQgaW4gcGF5bG9hZC4KKwkJCQkvLyBObyBuZWVkIHRvIHByZXBhcmUgZmVlZGJhY2sgaWYgdGhpcyBjbWQgY2FtZSBkaXJlY3RseSBmcm9tIGF0ZSBkYWVtb24uCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlpZiAocFJhQ2ZnLT5sZW5ndGggPT0gc2l6ZW9mKHBBZGFwdGVyLT5hdGUuQXRlUGlkKSkKKwkJCQl7CisJCQkJCS8vIFRoaXMgY29tbWFuZCBjYW1lIGZyb20gUUEuCisJCQkJCS8vIEdldCB0aGUgcGlkIG9mIEFURSBkYWVtb24uCisJCQkJCW1lbWNweSgoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5BdGVQaWQsCisJCQkJCQkoJnBSYUNmZy0+ZGF0YVswXSkgLSAyLyogPT0gJihwUmFDZmctPnN0YXR1cykgKi8sCisJCQkJCQlzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKTsKKworCQkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrIGFzIHNvb24gYXMgd2UgY2FuIHRvIGF2b2lkIFFBIHRpbWVvdXQuCisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisJICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCSAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7CisJICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworCSAgICAgICAgICAgIAl9CisKKwkJCQkJLy8KKwkJCQkJLy8ga2lsbCBBVEUgZGFlbW9uIHdoZW4gbGVhdmluZyBBVEUgbW9kZS4KKwkJCQkJLy8gV2UgbXVzdCBraWxsIEFURSBkYWVtb24gZmlyc3QgYmVmb3JlIHNldHRpbmcgQVRFU1RPUCwKKwkJCQkJLy8gb3IgTWljcm9zb2Z0IHdpbGwgcmVwb3J0IHN0aC4gd3JvbmcuCisjaWZuZGVmIFVDT1MKKwkJCQkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBBZGFwdGVyLT5hdGUuQXRlUGlkLCBTSUdURVJNLCAxKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVuYWJsZSB0byBzaWduYWwgdGhyZWFkXG4iLCBwQWRhcHRlci0+bmV0X2Rldi0+bmFtZSkpOworCQkJCQl9CisjZW5kaWYgLy8gIVVDT1MgLy8KKwkJCQl9CisKKwkJCQkvLyBBUCBtaWdodCBoYXZlIGluIEFURV9TVE9QIG1vZGUgZHVlIHRvIGNtZCBmcm9tIFFBLgorCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCXsKKwkJCQkJLy8gU29tZW9uZSBoYXMga2lsbGVkIGF0ZSBkYWVtb24gd2hpbGUgUUEgR1VJIGlzIHN0aWxsIG9wZW4uCisJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUT1AiKTsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FQX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTDoKKwkJCXsKKwkJCQlVSU5UMzIgUjEsIFIyLCBSMywgUjQ7CisJCQkJVVNIT1JUIGNoYW5uZWw7CisKKwkJCQltZW1jcHkoJlIxLCBwUmFDZmctPmRhdGEtMiwgNCk7CisJCQkJbWVtY3B5KCZSMiwgcFJhQ2ZnLT5kYXRhKzIsIDQpOworCQkJCW1lbWNweSgmUjMsIHBSYUNmZy0+ZGF0YSs2LCA0KTsKKwkJCQltZW1jcHkoJlI0LCBwUmFDZmctPmRhdGErMTAsIDQpOworCQkJCW1lbWNweSgmY2hhbm5lbCwgcFJhQ2ZnLT5kYXRhKzE0LCAyKTsKKworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSA9IG50b2hsKFIxKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIgPSBudG9obChSMik7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzID0gbnRvaGwoUjMpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCA9IG50b2hsKFI0KTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IG50b2hzKGNoYW5uZWwpOworCisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyk7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SRl9XUklURV9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorICAgICAgICAgICAgYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNjoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZSwgdG1wOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCS8qICJ0bXAiIGlzIGV4cGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCisJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIG9mZnNldCwgdG1wKTsKKwkJCQl2YWx1ZSA9IHRtcDsKKwkJCQl2YWx1ZSA9IGh0b25zKHZhbHVlKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRUVQUk9NIFJlYWQgb2Zmc2V0ID0gMHglMDR4LCB2YWx1ZSA9IDB4JTA0eFxuIiwgb2Zmc2V0LCB2YWx1ZSkpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNCk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDIpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpID0gJWRcbiIsIHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSkpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKyAgICAgICAgICAgCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQsIHZhbHVlOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK0VFUFJPTV9TSVpFKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMOgorCQkJeworCQkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCQlOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKKwkJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIsIChVQ0hBUiAqKSZwUmFDZmctPnN0YXR1cywgRUVQUk9NX1NJWkUpOworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQ7CisJCQkJVUlOVDMyCXZhbHVlOworCisJCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQgb3V0LgorCQkJCW9mZnNldCAmPSAweDAwMDBGRkZGOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBvZmZzZXQsICZ2YWx1ZSk7CisJCQkJdmFsdWUgPSBodG9ubCh2YWx1ZSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg2KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgNCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fUkVBRFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfSU9fUkVBRCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19XUklURToKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0LCB2YWx1ZTsKKworCQkJCW1lbWNweSgmb2Zmc2V0LCBwUmFDZmctPmRhdGEtMiwgNCk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhKzIsIDQpOworCisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IG91dCB0aGUgb2Zmc2V0LgorCQkJCW9mZnNldCAmPSAweDAwMDBGRkZGOworCQkJCXZhbHVlID0gbnRvaGwodmFsdWUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0lPX1dSSVRFOiBvZmZzZXQgPSAleCwgdmFsdWUgPSAleFxuIiwgb2Zmc2V0LCB2YWx1ZSkpOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19XUklURVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfSU9fV1JJVEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQ7CisJCQkJVVNIT1JUCWxlbjsKKworCQkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0LgorCQkJCW9mZnNldCAmPSAweDAwMDBGRkZGOworCQkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7CisJCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJCWlmIChsZW4gPiAzNzEpCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImxlbiBpcyB0b28gbGFyZ2UsIG1ha2UgaXQgc21hbGxlclxuIikpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDEpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlSVE1QX0lPX1JFQURfQlVMSyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilvZmZzZXQsIGxlbio0KTsvLyB1bml0IGluIGZvdXIgYnl0ZXMKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKjQpOy8vIHVuaXQgaW4gZm91ciBieXRlcworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfSU9fUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEODoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0OworCQkJCVVDSEFSCXZhbHVlOworCisJCQkJdmFsdWUgPSAwOworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKworCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgICZ2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgJnZhbHVlKTsKKwkJCQl9CisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMyk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQlwUmFDZmctPmRhdGFbMF0gPSB2YWx1ZTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkJQIHZhbHVlID0gJXhcbiIsIHZhbHVlKSk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1JFQUQ4XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9CQlBfUkVBRDggaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkFDRkdfQ01EX0JCUF9XUklURTg6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldDsKKwkJCQlVQ0hBUgl2YWx1ZTsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDEpOworCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgIHZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgdmFsdWUpOworCQkJCX0KKworCQkJCWlmICgob2Zmc2V0ID09IEJCUF9SMSkgfHwgKG9mZnNldCA9PSBCQlBfUjMpKQorCQkJCXsKKwkJCQkJU3luY1R4UnhDb25maWcocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCQkJCX0KKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9XUklURThcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9XUklURTggaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQkJQX1JFQURfQUxMOgorCQkJeworCQkJCVVTSE9SVCBqOworCisJCQkJZm9yIChqID0gMDsgaiA8IDEzNzsgaisrKQorCQkJCXsKKwkJCQkJcFJhQ2ZnLT5kYXRhW2pdID0gMDsKKworCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2pdKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbal0pOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMisxMzcpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1JFQURfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCQkJaWYgKG9mZnNldCArIGxlbiA8PSBFRVBST01fU0laRSkKKwkJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlcitvZmZzZXQsIGxlbik7CisJCQllbHNlCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZXhjZWVkIEVFUFJPTSBzaXplXG4iKSk7CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4pOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgKFVDSEFSICopYnVmZmVyICsgb2Zmc2V0LCAoVUNIQVIgKilwUmFDZmctPmRhdGEgKyAyLCBsZW4pOworCQkJcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSzoKKwkJeworCQkJVUlOVDMyIG9mZnNldCwgaSwgdmFsdWU7CisJCQlVU0hPUlQgbGVuOworCisJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KQorCQkJeworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsIChVQ0hBUiAqKSZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhKzQraSwgNCk7CisJCQkJcHJpbnRrKCJXcml0ZSAleCAleFxuIiwgb2Zmc2V0ICsgaSwgdmFsdWUpOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgKG9mZnNldCAraSkgJiAweGZmZmYsIHZhbHVlKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdID0gMDsKKworCQkJCWlmIChwQWRhcHRlci0+YXRlLk1vZGUgPT0gQVRFX1NUT1ApCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4pOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisJCQlVQ0hBUiAqdmFsdWU7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJdmFsdWUgPSBwUmFDZmctPmRhdGEgKyAyICsgKGogLSBvZmZzZXQpOworCQkJCWlmIChwQWRhcHRlci0+YXRlLk1vZGUgPT0gQVRFX1NUT1ApCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1JBTElOS19SVDMwNTIKKwkJY2FzZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQlwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0gPSAwOworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4pOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisJCQlVQ0hBUiAqdmFsdWU7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJdmFsdWUgPSBwUmFDZmctPmRhdGEgKyAyICsgKGogLSBvZmZzZXQpOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUw6CisJCQl7CisJCQkJVUNIQVIJY2hhbm5lbDsKKwkJCQlJTlQzMiAgIGJ1ZmZlclszXVsxMF07LyogMyA6IFJ4UGF0aCA7IDEwIDogbm8uIG9mIHBlciByc3NpIHNhbXBsZXMgKi8KKworCQkJCWNoYW5uZWwgPSAobnRvaHMocFJhQ2ZnLT5zdGF0dXMpICYgMHgwMEZGKTsKKwkJCQlDYWxOb2lzZUxldmVsKHBBZGFwdGVyLCBjaGFubmVsLCBidWZmZXIpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsIChVQ0hBUiAqKXBSYUNmZy0+ZGF0YSwgKFVDSEFSICopJihidWZmZXJbMF1bMF0pLCAoc2l6ZW9mKElOVDMyKSozKjEwKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyICsgKHNpemVvZihJTlQzMikqMyoxMCkpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9DT1VOVEVSOgorCQkJeworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlUyTSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5CZWFjb24sIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzMsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEhDQ0EsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeE1nbXQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kxLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzU2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMSwgNCk7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNjApOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9DT1VOVEVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfQ09VTlRFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSOgorCQkJeworCQkJCXBBZGFwdGVyLT5hdGUuVTJNID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLk90aGVyRGF0YSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5CZWFjb24gPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuT3RoZXJDb3VudCA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeEFjMCA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeEFjMSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeEFjMiA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeEFjMyA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeEhDQ0EgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhNZ210ID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfVFhfU1RBUlQ6CisJCQl7CisJCQkJVVNIT1JUICpwOworCQkJCVVTSE9SVAllcnIgPSAxOworCQkJCVVDSEFSICAgQmJwMjJWYWx1ZSA9IDAsIEJicDI0VmFsdWUgPSAwOworCisJCQkJaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmIChwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkF0ZSBUeCBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRvIHJ1biBuZXh0IFR4LCB5b3UgbXVzdCBzdG9wIGl0IGZpcnN0XG4iKSk7CisJCQkJCWVyciA9IDI7CisJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApICYmICEocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQorCQkJCXsKKwkJCQkJaW50IGkgPSAwOworCisJCQkJCXdoaWxlICgoaSsrIDwgMTApICYmIChwQWRhcHRlci0+YXRlLlR4U3RhdHVzICE9IDApKQorCQkJCQl7CisJCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCQl9CisKKwkJCQkJLy8gZm9yY2UgaXQgdG8gc3RvcAorCQkJCQlwQWRhcHRlci0+YXRlLlR4U3RhdHVzID0gMDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisJCQkJCS8vcEFkYXB0ZXItPmF0ZS5SZXBlYXQgPSAwOworCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwkJCQl9CisKKwkJCQkvLyBJZiBwUmFDZmctPmxlbmd0aCA9PSAwLCB0aGlzICJSQUNGR19DTURfVFhfU1RBUlQiIGlzIGZvciBDYXJyaWVyIHRlc3Qgb3IgQ2FycmllciBTdXBwcmVzc2lvbi4KKwkJCQlpZiAobnRvaHMocFJhQ2ZnLT5sZW5ndGgpICE9IDApCisJCQkJeworCQkJCQkvLyBHZXQgZnJhbWUgaW5mbworI2lmZGVmIFJUMjg3MAorCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeEluZm8sIHBSYUNmZy0+ZGF0YSAtIDIsIDQpOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUikgJnBBZGFwdGVyLT5hdGUuVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlR4V0ksIHBSYUNmZy0+ZGF0YSArIDIsIDE2KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKSZwQWRhcHRlci0+YXRlLlR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlR4Q291bnQsIHBSYUNmZy0+ZGF0YSArIDE4LCA0KTsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5UeENvdW50ID0gbnRvaGwocEFkYXB0ZXItPmF0ZS5UeENvdW50KTsKKworCQkJCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzIyXSk7CisJCQkJCS8vcCA9IHBSYUNmZy0+ZGF0YSArIDIyOworCQkJCQkvLyBhbHdheXMgdXNlIFFJRF9BQ19CRQorCQkJCQlwQWRhcHRlci0+YXRlLlFJRCA9IDA7CisJCQkJCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjRdKTsKKwkJCQkJLy9wID0gcFJhQ2ZnLT5kYXRhICsgMjQ7CisJCQkJCXBBZGFwdGVyLT5hdGUuSExlbiA9IG50b2hzKCpwKTsKKworCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5ITGVuID4gMzIpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5ITGVuID4gMzJcbiIpKTsKKwkJCQkJCWVyciA9IDM7CisJCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCQl9CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuSGVhZGVyLCBwUmFDZmctPmRhdGEgKyAyNiwgcEFkYXB0ZXItPmF0ZS5ITGVuKTsKKworCisJCQkJCXBBZGFwdGVyLT5hdGUuUExlbiA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAtIChwQWRhcHRlci0+YXRlLkhMZW4gKyAyOCk7CisKKwkJCQkJaWYgKHBBZGFwdGVyLT5hdGUuUExlbiA+IDMyKQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBBZGFwdGVyLT5hdGUuUExlbiA+IDMyXG4iKSk7CisJCQkJCQllcnIgPSA0OworCQkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQkJfQorCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlBhdHRlcm4sIHBSYUNmZy0+ZGF0YSArIDI2ICsgcEFkYXB0ZXItPmF0ZS5ITGVuLCBwQWRhcHRlci0+YXRlLlBMZW4pOworCQkJCQlwQWRhcHRlci0+YXRlLkRMZW4gPSBwQWRhcHRlci0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50IC0gcEFkYXB0ZXItPmF0ZS5ITGVuOworCQkJCX0KKworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjIyLCAmQmJwMjJWYWx1ZSk7CisKKwkJCQlzd2l0Y2ggKEJicDIyVmFsdWUpCisJCQkJeworCQkJCQljYXNlIEJCUDIyX1RYRlJBTUU6CisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZGFwdGVyLT5hdGUuVHhDb3VudCA9PSAwKQorCQkJCQkJCXsKKwkJCQkJCQl9CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWEZSQU1FXG4iKSk7CisJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWEZSQU1FIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUDoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUFxuIikpOworCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCAyNCwgJkJicDI0VmFsdWUpOworCisJCQkJCQkJc3dpdGNoIChCYnAyNFZhbHVlKQorCQkJCQkJCXsKKwkJCQkJCQkJY2FzZSBCQlAyNF9UWENPTlQ6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENPTlRcbiIpKTsKKwkJCQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ09OVCIpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJY2FzZSBCQlAyNF9DQVJSU1VQUDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlNVUFBcbiIpKTsKKwkJCQkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuTW9kZSB8PSBBVEVfVFhDQVJSU1VQUDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFN0YXJ0IFRYIHN1YnR5cGUgISIpKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQkJQMjJfVFhDQVJSOgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSXG4iKSk7CisJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENBUlIiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJVbmtub3duIFN0YXJ0IFRYIHN1YnR5cGUgISIpKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCSAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkgICAgICAgICAgICAJeworCSAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgd2FzIGZhaWxlZCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVFxuIikpOworCSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkgICAgICAgICAgICAJfQorCQkJCQllbHNlCisJCQkJCXsKKwkgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9UWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKK1RYX1NUQVJUX0VSUk9SOgorCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoZXJyKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZmVlZGJhY2sgb2YgVFhfU1RBUlRfRVJST1IgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUzoKKwkJCXsKKwkJCQlVSU5UMzIgY291bnQ7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg2KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCWNvdW50ID0gaHRvbmwocEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCk7CisJCQkJTmRpc01vdmVNZW1vcnkocFJhQ2ZnLT5kYXRhLCAmY291bnQsIDQpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1RYX1NUT1A6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfVFhfU1RPUFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhTVE9QIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9UWF9TVE9QIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisKKwkJCQlwQWRhcHRlci0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SWF9TVE9QOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1JYX1NUT1BcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYU1RPUCIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RPUFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUlhfU1RPUCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkvKiBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBmb3IgbmV3IEFURSBHVUkobm90IFFBKS4gKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENBUlIiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlRcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ09OVCIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUU6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWEZSQU1FIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CVzoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisKKwkJCQlTZXRfQVRFX1RYX0JXX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0JXIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVRcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUzoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKKworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzEyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQsIDQpOworCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCQkJeworCQkJCQlJTlQzMiBSU1NJMCA9IDA7CisJCQkJCUlOVDMyIFJTU0kxID0gMDsKKwkJCQkJSU5UMzIgUlNTSTIgPSAwOworCisJCQkJCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCVJTU0kxID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCVJTU0kyID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMiAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJlJTU0kxLCA0KTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZSU1NJMiwgNCk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis1Mik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUlOVDMyIFJTU0kwID0gMDsKKworCQkJCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzQ0KTsKKwkJCQl9CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVI6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAxOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOworCisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEU6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUw6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUxcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjFcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIxLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjEgaXMgZG9uZSAhXG4gKEFERFIxID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIxWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyMVsxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMVsyXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMVszXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMVs0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyMVs1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjI6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMlxuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjIsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMiBpcyBkb25lICFcbiAoQUREUjIgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjJbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIyWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIyWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIyWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIyWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIyWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMzoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMywgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzIGlzIGRvbmUgIVxuIChBRERSMyA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyM1swXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjNbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjNbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjNbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjNbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjNbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEU6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEVcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9NQ1NfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUkFURVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UOgorCQkJeworCQkJCVVTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlRcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJeworCQkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCQkJCX0KKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWEZSQU1FIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUlhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisgICAgQVNTRVJUKHBSYUNmZyAhPSBOVUxMKTsKKyAgICBpZiAocFJhQ2ZnICE9IE5VTEwpCisgICAgeworICAgIGtmcmVlKHBSYUNmZyk7CisgICAgfQorCXJldHVybjsKK30KKworVk9JRCBCdWJibGVTb3J0KElOVDMyIG4sIElOVDMyIGFbXSkKK3sKKwlJTlQzMiBrLCBqLCB0ZW1wOworCisJZm9yIChrID0gbi0xOyAgaz4wOyAgay0tKQorCXsKKwkJZm9yIChqID0gMDsgajxrOyBqKyspCisJCXsKKwkJCWlmKGFbal0gPiBhW2orMV0pCisJCQl7CisJCQkJdGVtcCA9IGFbal07CisJCQkJYVtqXT1hW2orMV07CisJCQkJYVtqKzFdPXRlbXA7CisJCQl9CisJCX0KKwl9Cit9CisKK1ZPSUQgQ2FsTm9pc2VMZXZlbChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgY2hhbm5lbCwgSU5UMzIgUlNTSVszXVsxMF0pCit7CisJSU5UMzIJCVJTU0kwLCBSU1NJMSwgUlNTSTI7CisgCUNIQVIJCVJzc2kwT2Zmc2V0LCBSc3NpMU9mZnNldCwgUnNzaTJPZmZzZXQ7CisJVUNIQVIJCUJicFI1MFJzc2kwID0gMCwgQmJwUjUxUnNzaTEgPSAwLCBCYnBSNTJSc3NpMiA9IDA7CisJVUNIQVIJCU9yZ19CQlA2NnZhbHVlID0gMCwgT3JnX0JCUDY5dmFsdWUgPSAwLCBPcmdfQkJQNzB2YWx1ZSA9IDAsIGRhdGEgPSAwOworCVVTSE9SVAkJTE5BX0dhaW4gPSAwOworCUlOVDMyICAgICAgIGogPSAwOworCVVDSEFSCQlPcmdfQ2hhbm5lbCA9IHBBZC0+YXRlLkNoYW5uZWw7CisJVVNIT1JUCSAgICBHYWluVmFsdWUgPSAwLCBPZmZzZXRWYWx1ZSA9IDA7CisKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZPcmdfQkJQNjZ2YWx1ZSk7CisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAmT3JnX0JCUDY5dmFsdWUpOworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgJk9yZ19CQlA3MHZhbHVlKTsKKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS8vIFJlYWQgdGhlIHZhbHVlIG9mIExOQSBnYWluIGFuZCBSc3NpIG9mZnNldAorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIEdhaW5WYWx1ZSk7CisKKwkvLyBmb3IgTm9pc2UgTGV2ZWwKKwlpZiAoY2hhbm5lbCA8PSAxNCkKKwl7CisJCUxOQV9HYWluID0gR2FpblZhbHVlICYgMHgwMEZGOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kwT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJCVJzc2kxT2Zmc2V0ID0gKE9mZnNldFZhbHVlICYgMHhGRjAwKSA+PiA4OworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9CR19PRkZTRVQgKyAyKS8qIDB4NDggKi8sIE9mZnNldFZhbHVlKTsKKwkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwl9CisJZWxzZQorCXsKKwkJTE5BX0dhaW4gPSAoR2FpblZhbHVlICYgMHhGRjAwKSA+PiA4OworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQV9PRkZTRVQsIE9mZnNldFZhbHVlKTsKKwkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0FfT0ZGU0VUICsgMikvKiAweDRDICovLCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kyT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJfQorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCXsKKwkJcEFkLT5hdGUuQ2hhbm5lbCA9IGNoYW5uZWw7CisJCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7CisJCW1kZWxheSg1KTsKKworCQlkYXRhID0gMHgxMDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgZGF0YSk7CisJCWRhdGEgPSAweDQwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBkYXRhKTsKKwkJZGF0YSA9IDB4NDA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIGRhdGEpOworCQltZGVsYXkoNSk7CisKKwkJLy8gU3RhcnQgUngKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7CisJCVNldF9BVEVfUHJvYyhwQWQsICJSWEZSQU1FIik7CisKKwkJbWRlbGF5KDUpOworCisJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorCQl7CisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTAsICZCYnBSNTBSc3NpMCk7CisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTEsICZCYnBSNTFSc3NpMSk7CisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTIsICZCYnBSNTJSc3NpMik7CisKKwkJCW1kZWxheSgxMCk7CisKKwkJCS8vIENhbGN1bGF0ZSBSU1NJIDAKKwkJCWlmIChCYnBSNTBSc3NpMCA9PSAwKQorCQkJeworCQkJCVJTU0kwID0gLTEwMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSU1NJMCA9IChJTlQzMikoLTEyIC0gQmJwUjUwUnNzaTAgLSBMTkFfR2FpbiAtIFJzc2kwT2Zmc2V0KTsKKwkJCX0KKwkJCVJTU0lbMF1bal0gPSBSU1NJMDsKKworCQkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQkJeworCQkJCS8vIENhbGN1bGF0ZSBSU1NJIDEKKwkJCQlpZiAoQmJwUjUxUnNzaTEgPT0gMCkKKwkJCQl7CisJCQkJCVJTU0kxID0gLTEwMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlNTSTEgPSAoSU5UMzIpKC0xMiAtIEJicFI1MVJzc2kxIC0gTE5BX0dhaW4gLSBSc3NpMU9mZnNldCk7CisJCQkJfQorCQkJCVJTU0lbMV1bal0gPSBSU1NJMTsKKwkJCX0KKworCQkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQkJeworCQkJCS8vIENhbGN1bGF0ZSBSU1NJIDIKKwkJCQlpZiAoQmJwUjUyUnNzaTIgPT0gMCkKKwkJCQkJUlNTSTIgPSAtMTAwOworCQkJCWVsc2UKKwkJCQkJUlNTSTIgPSAoSU5UMzIpKC0xMiAtIEJicFI1MlJzc2kyIC0gTE5BX0dhaW4gLSBSc3NpMk9mZnNldCk7CisKKwkJCQlSU1NJWzJdW2pdID0gUlNTSTI7CisJCQl9CisJCX0KKworCQkvLyBTdG9wIFJ4CisJCVNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKTsKKworCQltZGVsYXkoNSk7CisKKyNpZiAwLy8gRGVidWcgTWVzc2FnZS4uLi4uLi4uLi4uLi4uLi4KKwkJYXRlX3ByaW50KCJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQlhdGVfcHJpbnQoIk5vaXNlIExldmVsOiBDaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKwkJYXRlX3ByaW50KCJSU1NJMCA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJUlNTSVswXVswXSwgUlNTSVswXVsxXSwgUlNTSVswXVsyXSwKKwkJCVJTU0lbMF1bM10sIFJTU0lbMF1bNF0sIFJTU0lbMF1bNV0sCisJCQlSU1NJWzBdWzZdLCBSU1NJWzBdWzddLCBSU1NJWzBdWzhdLAorCQkJUlNTSVswXVs5XSk7CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMSA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMV1bMF0sIFJTU0lbMV1bMV0sIFJTU0lbMV1bMl0sCisJCQkJUlNTSVsxXVszXSwgUlNTSVsxXVs0XSwgUlNTSVsxXVs1XSwKKwkJCQlSU1NJWzFdWzZdLCBSU1NJWzFdWzddLCBSU1NJWzFdWzhdLAorCQkJCVJTU0lbMV1bOV0pOworCQl9CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMiA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMl1bMF0sIFJTU0lbMl1bMV0sIFJTU0lbMl1bMl0sCisJCQkJUlNTSVsyXVszXSwgUlNTSVsyXVs0XSwgUlNTSVsyXVs1XSwKKwkJCQlSU1NJWzJdWzZdLCBSU1NJWzJdWzddLCBSU1NJWzJdWzhdLAorCQkJCVJTU0lbMl1bOV0pOworCQl9CisjZW5kaWYgLy8gMCAvLworCQlCdWJibGVTb3J0KDEwLCBSU1NJWzBdKTsJLy8gMVIKKworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMV0pOworCQl9CisKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlCdWJibGVTb3J0KDEwLCBSU1NJWzJdKTsKKwkJfQorCisjaWYgMC8vIERlYnVnIE1lc3NhZ2UuLi4uLi4uLi4uLi4uLi4uCisJCWF0ZV9wcmludCgiXG5BZnRlciBTb3J0aW5nLi4uLkNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlhdGVfcHJpbnQoIlJTU0kwID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQlSU1NJWzBdWzBdLCBSU1NJWzBdWzFdLCBSU1NJWzBdWzJdLAorCQkJUlNTSVswXVszXSwgUlNTSVswXVs0XSwgUlNTSVswXVs1XSwKKwkJCVJTU0lbMF1bNl0sIFJTU0lbMF1bN10sIFJTU0lbMF1bOF0sCisJCQlSU1NJWzBdWzldKTsKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kxID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsxXVswXSwgUlNTSVsxXVsxXSwgUlNTSVsxXVsyXSwKKwkJCQlSU1NJWzFdWzNdLCBSU1NJWzFdWzRdLCBSU1NJWzFdWzVdLAorCQkJCVJTU0lbMV1bNl0sIFJTU0lbMV1bN10sIFJTU0lbMV1bOF0sCisJCQkJUlNTSVsxXVs5XSk7CisJCX0KKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kyID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsyXVswXSwgUlNTSVsyXVsxXSwgUlNTSVsyXVsyXSwKKwkJCQlSU1NJWzJdWzNdLCBSU1NJWzJdWzRdLCBSU1NJWzJdWzVdLAorCQkJCVJTU0lbMl1bNl0sIFJTU0lbMl1bN10sIFJTU0lbMl1bOF0sCisJCQkJUlNTSVsyXVs5XSk7CisJCX0KKwkJYXRlX3ByaW50KCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKyNlbmRpZiAvLyAwIC8vCisJfQorCisJcEFkLT5hdGUuQ2hhbm5lbCA9IE9yZ19DaGFubmVsOworCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7CisKKwkvLyBSZXN0b3JlIG9yaWdpbmFsIHZhbHVlCisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgT3JnX0JCUDY2dmFsdWUpOworICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIE9yZ19CQlA2OXZhbHVlKTsKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBPcmdfQkJQNzB2YWx1ZSk7CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gU3luY1R4UnhDb25maWcoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCBvZmZzZXQsIFVDSEFSIHZhbHVlKQoreworCVVDSEFSIHRtcCA9IDAsIGJicF9kYXRhID0gMDsKKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOworCX0KKwllbHNlCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7CisJfQorCisJLyogY29uZmlybSBhZ2FpbiAqLworCUFTU0VSVChiYnBfZGF0YSA9PSB2YWx1ZSk7CisKKwlzd2l0Y2gob2Zmc2V0KQorCXsKKwkJY2FzZSBCQlBfUjE6CisJCQkvKiBOZWVkIHRvIHN5bmMuIHR4IGNvbmZpZ3VyYXRpb24gd2l0aCBsZWdhY3kgQVRFLiAqLworCQkJdG1wID0gKGJicF9kYXRhICYgKCgxIDw8IDQpIHwgKDEgPDwgMykpLyogMHgxOCAqLykgPj4gMzsKKwkJICAgIHN3aXRjaCh0bXApCisJCSAgICB7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDIgOjogQm90aCBEQUNzIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDI6CisJCQkJCS8qIEFsbCAqLworCQkJCQlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSAwOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMCA6OiBEQUMgMCB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAwOgorCQkJCQkvKiBBbnRlbm5hIG9uZSAqLworCQkJCQlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSAxOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMSA6OiBEQUMgMSB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAxOgorCQkJCQkvKiBBbnRlbm5hIHR3byAqLworCQkJCQlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSAyOworCQkgICAgICAgICAgICBicmVhazsKKwkJICAgICAgICBkZWZhdWx0OgorCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IxICovCisKKwkJY2FzZSBCQlBfUjM6CisJCQkvKiBOZWVkIHRvIHN5bmMuIHJ4IGNvbmZpZ3VyYXRpb24gd2l0aCBsZWdhY3kgQVRFLiAqLworCQkJdG1wID0gKGJicF9kYXRhICYgKCgxIDw8IDEpIHwgKDEgPDwgMCkpLyogMHgwMyAqLyk7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAzIDo6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDM6CisJCQkJCS8qIEFsbCAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMCA6OiBBREMgMCB3aWxsIGJlIHVzZWQgYnkgUUEsICovCisJCQkJLyogdW5sZXNzIHRoZSBCQlAgUjMgYml0WzQ6M10gPSAyICovCisJCSAgICAgICAgY2FzZSAwOgorCQkJCQkvKiBBbnRlbm5hIG9uZSAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAxOworCQkJCQl0bXAgPSAoKGJicF9kYXRhICYgKCgxIDw8IDQpIHwgKDEgPDwgMykpLyogMHgwMyAqLykgPj4gMyk7CisJCQkJCWlmICh0bXAgPT0gMikvLyAzUgorCQkJCQl7CisJCQkJCQkvKiBEZWZhdWx0IDogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBICovCisJCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkJCQl9CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAxIDo6IEFEQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAyIDo6IEFEQyAyIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDI6CisJCQkJCS8qIEFudGVubmEgdGhyZWUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMzsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLS0gSW1wb3NzaWJsZSEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fRlVOQ1RJT05fXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbikKK3sKKwlVTE9ORyBpLCBWYWx1ZSA9IDA7CisJVUxPTkcgKnBEc3QsICpwU3JjOworCVVDSEFSICpwODsKKworCXA4ID0gc3JjOworCXBEc3QgPSAoVUxPTkcgKikgZHN0OworCXBTcmMgPSAoVUxPTkcgKikgc3JjOworCisJZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCisJeworCQkvKiBGb3IgYWxpZ25tZW50IGlzc3VlLCB3ZSBuZWVkIGEgdmFyaWFibGUgIlZhbHVlIi4gKi8KKwkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIDQpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOworCQlwRHN0Kys7CisJCXBTcmMrKzsKKwl9CisJaWYgKChsZW4gJSA0KSAhPSAwKQorCXsKKwkJLyogd2lzaCB0aGF0IGl0IHdpbGwgbmV2ZXIgcmVhY2ggaGVyZSAqLworCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgKGxlbiAlIDQpKTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCAobGVuICUgNCkpOworCX0KK30KKworc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQoreworCVVMT05HIGk7CisJVUNIQVIgKnBEc3QsICpwU3JjOworCisJcERzdCA9IGRzdDsKKwlwU3JjID0gc3JjOworCisJZm9yIChpID0gMDsgaSA8IChsZW4vMik7IGkrKykKKwl7CisJCW1lbW1vdmUocERzdCwgcFNyYywgMik7CisJCSooKFVTSE9SVCAqKXBEc3QpID0gaHRvbnMoKigoVVNIT1JUICopcERzdCkpOworCQlwRHN0Kz0yOworCQlwU3JjKz0yOworCX0KKworCWlmICgobGVuICUgMikgIT0gMCkKKwl7CisJCW1lbW1vdmUocERzdCwgcFNyYywgMSk7CisJfQorfQorCitzdGF0aWMgVk9JRCBSVE1QX0lPX1JFQURfQlVMSyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUlOVDMyIGxlbikKK3sKKwlVSU5UMzIgaSwgVmFsdWU7CisJVUlOVDMyICpwRHN0LCAqcFNyYzsKKworCXBEc3QgPSAoVUlOVDMyICopIGRzdDsKKwlwU3JjID0gKFVJTlQzMiAqKSBzcmM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IChsZW4vNCk7IGkrKykKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgKFVMT05HKXBTcmMsICZWYWx1ZSk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgNCk7CisJCXBEc3QrKzsKKwkJcFNyYysrOworCX0KKwlyZXR1cm47Cit9CisKKy8vIFRPRE86CisjaWYgMAorLyogVGhlc2Ugd29yayBvbmx5IHdoZW4gUkFMSU5LX0FURSBpcyBkZWZpbmVkICovCitJTlQgU2V0X1R4U3RhcnRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCVVDSEFSIGJ1ZmZlclsyNl0gPSB7MHg4OCwgMHgwMiwgMHgyYywgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHgwMCwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHhjMCwgMHgyMiwgMHgwMCwgMHgwMH07CisJUE9TX0NPT0tJRSBwT2JqOworCisJaWYgKHBBZC0+YXRlLlR4U3RhdHVzICE9IDApCisJCXJldHVybiBGQUxTRTsKKworCXBBZC0+YXRlLlR4SW5mbyA9IDB4MDQwMDAwMDA7CisJYnplcm8oJnBBZC0+YXRlLlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7CisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gMDsvLyBNT0RFX0NDSworCXBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50ID0gMTIyNjsKKwlwQWQtPmF0ZS5UeFdJLk1DUyA9IDM7CisJLy9wQWQtPmF0ZS5Nb2RlID0gQVRFX1NUQVJUOworCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYRlJBTUU7CisJcEFkLT5hdGUuVHhDb3VudCA9IHZhbHVlOworCXBBZC0+YXRlLlFJRCA9IDA7CisJcEFkLT5hdGUuSExlbiA9IDI2OworCXBBZC0+YXRlLlBMZW4gPSAwOworCXBBZC0+YXRlLkRMZW4gPSAxMjAwOworCW1lbWNweShwQWQtPmF0ZS5IZWFkZXIsIGJ1ZmZlciwgMjYpOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCS8vcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwkvL3Rhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPkF0ZVR4VGFzayk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgIC8qIGVuZCBvZiAjaWYgMCAqLworCitJTlQgU2V0X1R4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9UeFN0b3BfUHJvY1xuIikpOworCisJaWYgKFNldF9BVEVfUHJvYyhwQWQsICJUWFNUT1AiKSkKKwl7CisJcmV0dXJuIFRSVUU7Cit9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworSU5UIFNldF9SeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfUnhTdG9wX1Byb2NcbiIpKTsKKworCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIikpCisJeworCXJldHVybiBUUlVFOworfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKyNpZiAwCitJTlQgU2V0X0VFV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIG9mZnNldCA9IDAsIHZhbHVlOworCVBVQ0hBUiBwMiA9IGFyZzsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyID09ICc6JykKKwl7CisJCUEySGV4KG9mZnNldCwgYXJnKTsKKwkJQTJIZXgodmFsdWUsIHAyKyAxKTsKKwl9CisJZWxzZQorCXsKKwkJQTJIZXgodmFsdWUsIGFyZyk7CisJfQorCisJaWYgKG9mZnNldCA+PSBFRVBST01fU0laRSkKKwl7CisJCWF0ZV9wcmludCgiT2Zmc2V0IGNhbiBub3QgZXhjZWVkIEVFUFJPTV9TSVpFKCA9PSAweCUwNHgpXG4iLCBFRVBST01fU0laRSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlSVE1QX0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YWx1ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9CQlBSZWFkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIHZhbHVlID0gMCwgb2Zmc2V0OworCisJQTJIZXgob2Zmc2V0LCBhcmcpOworCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICAmdmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICAmdmFsdWUpOworCX0KKworCWF0ZV9wcmludCgiJXhcbiIsIHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIG9mZnNldCA9IDA7CisJUFVDSEFSIHAyID0gYXJnOworCVVDSEFSIHZhbHVlOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgPT0gJzonKQorCXsKKwkJQTJIZXgob2Zmc2V0LCBhcmcpOworCQlBMkhleCh2YWx1ZSwgcDIrIDEpOworCX0KKwllbHNlCisJeworCQlBMkhleCh2YWx1ZSwgYXJnKTsKKwl9CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICB2YWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTlBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICB2YWx1ZSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfUkZXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlQVUNIQVIgcDIsIHAzLCBwNDsKKwlVTE9ORyBSMSwgUjIsIFIzLCBSNDsKKworCXAyID0gYXJnOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwMyA9IHAyICsgMTsKKworCXdoaWxlKCgqcDMgIT0gJzonKSAmJiAoKnAzICE9ICdcMCcpKQorCXsKKwkJcDMrKzsKKwl9CisKKwlpZiAoKnAzICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisJcDQgPSBwMyArIDE7CisKKwl3aGlsZSgoKnA0ICE9ICc6JykgJiYgKCpwNCAhPSAnXDAnKSkKKwl7CisJCXA0Kys7CisJfQorCisJaWYgKCpwNCAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCisJQTJIZXgoUjEsIGFyZyk7CisJQTJIZXgoUjIsIHAyICsgMSk7CisJQTJIZXgoUjMsIHAzICsgMSk7CisJQTJIZXgoUjQsIHA0ICsgMSk7CisKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSNCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLy8gZW5kIG9mICNpZiAwIC8vCisjZW5kaWYJLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworI2VuZGlmCS8vIFJBTElOS19BVEUgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxOGNlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmgKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19BVEVfSF9fCisjZGVmaW5lIF9fQVRFX0hfXworCisjaWZuZGVmIFVDT1MKKyNkZWZpbmUgYXRlX3ByaW50IHByaW50aworI2RlZmluZSBBVEVEQkdQUklOVCBEQkdQUklOVAorCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDQwMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL2UycC5iaW4iCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisjZWxzZSAvLyAhVUNPUyAvLworI2RlZmluZSBmQVRFX0xPQURfRUVQUk9NCQkJCQkJMHgwQzQzCisjaWZkZWYgQ09ORklHX1BSSU5USworZXh0ZXJuIElOVCBDb25zb2xlUmVzcG9uc2UoSU4gUFVDSEFSIGJ1ZmYpOworZXh0ZXJuIGludCAoKnJlbW90ZV9kaXNwbGF5KShjaGFyICopOworZXh0ZXJuIHZvaWQgcHV0cyAoY29uc3QgY2hhciAqcyk7CisKKy8qIHNwZWNpZmljbHkgZGVmaW5lZCB0byByZWRpcmVjdCBhbmQgc2hvdyBhdGUtcmVsYXRlZCBtZXNzYWdlcyB0byBob3N0LiAqLworLyogVHJ5IHRvIGRlZmluZSBhdGVfcHJpbnQgYXMgYSBtYWNyby4gKi8KKyNkZWZpbmUgYXRlX3ByaW50KGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgIFwKK2RveyAgIGludCAoKm9yZ19yZW1vdGVfZGlzcGxheSkoY2hhciAqKSA9IE5VTEw7ICAgXAorCW9yZ19yZW1vdGVfZGlzcGxheSA9IHJlbW90ZV9kaXNwbGF5O1wKKwkvKiBTYXZlIG9yaWdpbmFsICJyZW1vdGVfZGlzcGxheSIgKi9cCisJcmVtb3RlX2Rpc3BsYXkgPSAoaW50ICgqKShjaGFyICopKUNvbnNvbGVSZXNwb25zZTsgICAgICAgICAgIFwKKwlwcmludGsoZm10LCAjIyBhcmdzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkvKiBSZXN0b3JlIHRoZSByZW1vdGVfZGlzcGxheSBmdW5jdGlvbiBwb2ludGVyICovICAgICAgICBcCisJcmVtb3RlX2Rpc3BsYXkgPSBvcmdfcmVtb3RlX2Rpc3BsYXk7IH13aGlsZSgwKQorCisjZGVmaW5lIEFURURCR1BSSU5UKExldmVsLCBGbXQpICAgIAlcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMZXZlbCkgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXRlX3ByaW50IEZtdDsJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBDT05GSUdfUFJJTlRLIC8vCisjZW5kaWYgLy8gIVVDT1MgLy8KKworI2RlZmluZSBBVEVfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPmF0ZS5Nb2RlKSAhPSBBVEVfU1RPUCkKKworLyogUlQyODgwX2lOSUMgd2lsbCBkZWZpbmUgIlJUMjg2MCIuICovCisKKy8qIFJUMjg4MF9pTklDIHdpbGwgZGVmaW5lIFJUMjg2MC4gKi8KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHg0MDAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgRUVQUk9NX0JJTl9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9lMnAuYmluIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpCisjZGVmaW5lIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCisKKyNkZWZpbmUgQlVMS19PVVRfTE9DSyhwTG9jaywgSXJxRmxhZ3MpCVwKKwkJaWYoMSAvKiEoaW5faW50ZXJydXB0KCkgJiAweGZmZmYwMDAwKSovKQlcCisJCQlSVE1QX0lSUV9MT0NLKChwTG9jayksIElycUZsYWdzKTsKKworI2RlZmluZSBCVUxLX09VVF9VTkxPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfVU5MT0NLKChwTG9jayksIElycUZsYWdzKTsKKworLy8gUHJvdG90eXBlcyBvZiBjb21wbGV0aW9uIGZ1bnVjLgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIsIHB0X3JlZ3MpICAgIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYikKKyNlbmRpZgorCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUoCisJSU4gcHVyYmJfdCBwdXJiLAorCU9VVCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CisKK1ZPSUQgQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkKTsKKworVk9JRCBBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCBydF9lZV9yZWFkX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVVNIT1JUICpEYXRhKTsKKworCitWT0lEIHJ0X2VlX3dyaXRlX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUICpEYXRhKTsKKworSU5UIFNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMgICAgcDI4eHhSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCXBIZWFkZXIpOworCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBCdWJibGVTb3J0KAorCUlOICBJTlQzMiBuLAorCUlOICBJTlQzMiBhW10pOworCitWT0lEIENhbE5vaXNlTGV2ZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIGNoYW5uZWwsCisJT1VUIElOVDMyICAgICAgICAgICBidWZmZXJbM11bMTBdKTsKKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVTSE9SVAkJCW9mZnNldCwKKwlJTglVQ0hBUgkJCXZhbHVlKTsKKworI2lmIDAKK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgIC8vIDAgLy8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZiAwCitJTlQgU2V0X0VFUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZlMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9jb25maWcuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydF9jb25maWcuaAorCisJQWJzdHJhY3Q6CisJQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKKwltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorCisqLworI2lmbmRlZglfX1JUX0NPTkZJR19IX18KKyNkZWZpbmUJX19SVF9DT05GSUdfSF9fCisKKyNpbmNsdWRlICAgICJydG1wX3R5cGUuaCIKKyNpZmRlZiBVQ09TCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgCSJydF91Y29zLmgiCisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZQkicnRfbGludXguaCIKKyNlbmRpZgorI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCisjaW5jbHVkZSAgICAicnQyOHh4LmgiCisKKworI2lmZGVmIFJUMjg3MAorI2luY2x1ZGUJInJ0Mjg3MC5oIgorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaW5jbHVkZSAgICAib2lkLmgiCisjaW5jbHVkZSAgICAibWxtZS5oIgorI2luY2x1ZGUgICAgIndwYS5oIgorI2luY2x1ZGUgICAgIm1kNS5oIgorI2luY2x1ZGUgICAgInJ0bXAuaCIKKyNpbmNsdWRlCSJhcC5oIgorI2luY2x1ZGUJImRmcy5oIgorI2luY2x1ZGUJImNobGlzdC5oIgorI2luY2x1ZGUJInNwZWN0cnVtLmgiCisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorI2luY2x1ZGUgICAgImxlYXAuaCIKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworI2lmZGVmIEJMT0NLX05FVF9JRgorI2luY2x1ZGUgIm5ldGlmX2Jsb2NrLmgiCisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKyNpZmRlZiBJR01QX1NOT09QX1NVUFBPUlQKKyNpbmNsdWRlICJpZ21wX3Nub29wLmgiCisjZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisjaW5jbHVkZSAicnRfYXRlLmgiCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKyNpbmNsdWRlCSJ2cl9pa2Fucy5oIgorI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlYThlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbGludXguYwpAQCAtMCwwICsxLDEwOTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7CisKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworLy9CVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKyNpZmRlZiBSVDI4NzAKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOworI2lmZGVmIExFQVBfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oTGVhcEF1dGhUaW1lb3V0KTsKKyNlbmRpZgorQlVJTERfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8gZm9yIHdpcmVsZXNzIHN5c3RlbSBldmVudCBtZXNzYWdlCitjaGFyIGNvbnN0ICpwV2lyZWxlc3NTeXNFdmVudFRleHRbSVdfU1lTX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkvLyBzeXN0ZW0gc3RhdHVzIGV2ZW50CisgICAgImhhZCBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseSIsCQkJCQkJCS8qIElXX0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiaGFkIGRpc2Fzc29jaWF0ZWQiLAkJCQkJCQkJCS8qIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiaGFkIGRlYXV0aGVudGljYXRlZCIsCQkJCQkJCQkJLyogSVdfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKyAgICAiaGFkIGJlZW4gYWdlZC1vdXQgYW5kIGRpc2Fzc29jaWF0ZWQiLAkJCQkJLyogSVdfQUdFT1VUX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgQ291bnRlck1lYXN1cmVzIGF0dGFjayIsCQkJCQkJLyogSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgUlNOSUUgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIE1JQyBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJCQkvKiBJV19NSUNfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIElDViBlcnJvciBpbiBSWCIsCQkJCQkJCQkvKiBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKwkiR3JvdXAgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX0dST1VQX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJQYWlyd2lzZSBLZXkgSGFuZHNoYWtpbmcgdGltZW91dCIsCQkJCQkJLyogSVdfUEFJUldJU0VfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCisJIlJTTiBJRSBzYW5pdHkgY2hlY2sgZmFpbHVyZSIsCQkJCQkJCS8qIElXX1JTTklFX1NBTklUWV9GQUlMX0VWRU5UX0ZMQUcgKi8KKwkic2V0IGtleSBkb25lIGluIFdQQS9XUEFQU0siLAkJCQkJCQkvKiBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEyL1dQQTJQU0siLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHICovCisJImNvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcgKi8KKwkiZGlzY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwgICAgICAgICAgICAgICAgIC8qIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHICovCisJInNjYW4gY29tcGxldGVkIgkJCQkJCQkJCQkvKiBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHICovCisJInNjYW4gdGVybWluYXRlISEgQnVzeSEhIEVucXVldWUgZmFpbCEhIgkJCQkvKiBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHICovCisJfTsKKworLy8gZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU1dID0geworICAgICJkZXRlY3RlZCBjb25mbGljdCBTU0lEIiwJCQkJCQkJCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJCQkJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkJCQkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJCQkJCQkvKiBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBiZWFjb24iLAkJCQkJCQkJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIGF1dGhlbnRpY2F0aW9uIiwJCQkJCQkvKiBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkZWF1dGhlbnRpY2F0aW9uIiwJCQkJCS8qIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lIiwJCQkvKiBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCByZXBsYXkgYXR0YWNrIgkJCQkJCQkJLyogSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHICovCisJfTsKKworLy8gZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU1dID0geworCSJkZXRlY3RlZCBhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIGFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCByZWFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHByb2JlIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIGRlYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkJCQkJLyogSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHICovCisJfTsKKworLyogdGltZW91dCAtLSBtcyAqLworVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCisvKiBjb252ZXJ0IE5kaXNNSW5pdGlhbGl6ZVRpbWVyIC0tPiBSVE1QX09TX0luaXRfVGltZXIgKi8KK1ZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKKwlJTglQVk9JRCBkYXRhKQoreworCWluaXRfdGltZXIocFRpbWVyKTsKKyAgICBwVGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOworICAgIHBUaW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKK30KKworCitWT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJCXJldHVybjsKKworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CisJYWRkX3RpbWVyKHBUaW1lcik7Cit9CisKK1ZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwltb2RfdGltZXIocFRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Cit9CisKK1ZPSUQgUlRNUF9PU19EZWxfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHRpbWVyX3BlbmRpbmcocFRpbWVyKSkKKwl7CisJCSpwQ2FuY2VsbGVkID0gZGVsX3RpbWVyX3N5bmMocFRpbWVyKTsKKwl9CisJZWxzZQorCXsKKwkJKnBDYW5jZWxsZWQgPSBUUlVFOworCX0KKworfQorCitWT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpCit7CisJLy9SVE1QRnJlZU5kaXNQYWNrZXQocEFkLCAoc3RydWN0IHNrX2J1ZmYgKilwRW50cnkpOworfQorCisvLyBVbmlmeSBhbGwgZGVsYXkgcm91dGluZSBieSB1c2luZyB1ZGVsYXkKK1ZPSUQgUlRNUHVzZWNEZWxheSgKKwlJTglVTE9ORwl1c2VjKQoreworCVVMT05HCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVzZWMgLyA1MCk7IGkrKykKKwkJdWRlbGF5KDUwKTsKKworCWlmICh1c2VjICUgNTApCisJCXVkZWxheSh1c2VjICUgNTApOworfQorCit2b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSkKK3sKKwl0aW1lLT51Lkxvd1BhcnQgPSBqaWZmaWVzOworfQorCisvLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCitORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUCVBVQ0hBUiAqbWVtLAorCUlOCVVMT05HICBzaXplKQoreworCSptZW0gPSAoUFVDSEFSKSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCWlmICgqbWVtKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCWVsc2UKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFVDSEFSIG1lbSkKK3sKKworCUFTU0VSVChtZW0pOworCWtmcmVlKG1lbSk7CisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCXN0cnVjdCBza19idWZmICpwa3Q7CisKKwlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7CisKKwlpZiAocGt0ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSBmcmFnIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKQoreworCXN0cnVjdCBza19idWZmICpwa3Q7CisKKwlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7CisKKwlpZiAocGt0ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKKwl9CisJZWxzZQorCXsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworVk9JRCBidWlsZF90eF9wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCXBGcmFtZSwKKwlJTglVTE9ORwlGcmFtZUxlbikKK3sKKworCXN0cnVjdCBza19idWZmCSpwVHhQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisJcFR4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKwlOZGlzTW92ZU1lbW9yeShza2JfcHV0KHBUeFBrdCwgRnJhbWVMZW4pLCBwRnJhbWUsIEZyYW1lTGVuKTsKK30KKworVk9JRAlSVE1QRnJlZUFkYXB0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisgICAgUE9TX0NPT0tJRSBvc19jb29raWU7CisJaW50IGluZGV4OworCisJb3NfY29va2llPShQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJa2ZyZWUocEFkLT5CZWFjb25CdWYpOworCisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKworCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKyAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKKworCisJdmZyZWUocEFkKTsgLy8gcGNpX2ZyZWVfY29uc2lzdGVudChvc19jb29raWUtPnBjaV9kZXYsc2l6ZW9mKFJUTVBfQURBUFRFUikscEFkLG9zX2Nvb2tpZS0+cEFkX3BhKTsKKwlrZnJlZShvc19jb29raWUpOworfQorCitCT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpCit7CisJcmV0dXJuIChGQUxTRSk7Cit9CisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJY2xvbmUgYW4gaW5wdXQgTkRJUyBQQUNLRVQgdG8gYW5vdGhlciBvbmUuIFRoZSBuZXcgaW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJCW11c3QgaGF2ZSBvbmx5IG9uZSBORElTIEJVRkZFUgorCQlyZXR1cm4gLSBieXRlIGNvcGllZC4gMCBtZWFucyBjYW4ndCBjcmVhdGUgTkRJUyBQQUNLRVQKKwkJTk9URTogaW50ZXJuYWxseSBjcmVhdGVkIE5ESVNfUEFDS0VUIHNob3VsZCBiZSBkZXN0cm95ZWQgYnkgUlRNUEZyZWVOZGlzUGFja2V0CisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwSW5zQU1TRFVIZHIJRVdDIEEtTVNEVSBmb3JtYXQgaGFzIGV4dHJhIDE0LWJ5dGVzIGhlYWRlci4gaWYgVFJVRSwgaW5zZXJ0IHRoaXMgMTQtYnl0ZSBoZHIgaW4gZnJvbnQgb2YgTVNEVS4KKwkJKnBTcmNUb3RhbExlbgkJCXJldHVybiB0b3RhbCBwYWNrZXQgbGVuZ3RoLiBUaGlzIGxlbmdodCBpcyBjYWxjdWxhdGVkIHdpdGggODAyLjMgZm9ybWF0IHBhY2tldC4KKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJcEluc0FNU0RVSGRyLAorCUlOCVBORElTX1BBQ0tFVAlwSW5QYWNrZXQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCkKK3sKKworCXN0cnVjdCBza19idWZmICpwa3Q7CisKKwlBU1NFUlQocEluUGFja2V0KTsKKwlBU1NFUlQocHBPdXRQYWNrZXQpOworCisJLy8gMS4gQWxsb2NhdGUgYSBwYWNrZXQKKwlwa3QgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisgCXNrYl9wdXQocGt0LCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKKwlOZGlzTW92ZU1lbW9yeShwa3QtPmRhdGEsIEdFVF9PU19QS1RfREFUQVBUUihwSW5QYWNrZXQpLCBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKKwkqcHBPdXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChwa3QpOworCisKKwlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKworCXByaW50aygiIyMjQ2xvbmUjIyNcbiIpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLy8gdGhlIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBtdXN0IGJlIGZyZWVkIHZpYSBSVE1QRnJlZU5kaXNQYWNrZXQoKQorTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBIZWFkZXIsCisJSU4JVUlOVAkJCUhlYWRlckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJRGF0YUxlbikKK3sKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlBU1NFUlQocERhdGEpOworCUFTU0VSVChEYXRhTGVuKTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcFBhY2tldCA9IChQTkRJU19QQUNLRVQgKikgZGV2X2FsbG9jX3NrYihIZWFkZXJMZW4gKyBEYXRhTGVuICsgVFhQQURESU5HX1NJWkUpOworCWlmIChwUGFja2V0ID09IE5VTEwpCisgCXsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQgRmFpbFxuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvLyAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudAorCWlmIChIZWFkZXJMZW4gPiAwKQorCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCksIHBIZWFkZXIsIEhlYWRlckxlbik7CisJaWYgKERhdGFMZW4gPiAwKQorCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKKworCS8vIDMuIHVwZGF0ZSBsZW5ndGggb2YgcGFja2V0CisgCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBIZWFkZXJMZW4rRGF0YUxlbik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKy8vCXByaW50aygiJXMgOiBwUGFja2V0ID0gJXAsIGxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkqcHBQYWNrZXQgPSBwUGFja2V0OworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgTkRJU19QQUNLRVQgYW5kIGl0cworCWNvcnJlc3BvbmRpbmcgTkRJU19CVUZGRVIgYW5kIGFsbG9jYXRlZCBtZW1vcnkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShSVFBLVF9UT19PU1BLVChwUGFja2V0KSk7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZQorLy8JCQkgc2NhdHRlciBnYXRoZXIgYnVmZmVyCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOCVBORElTX0JVRkZFUglwRmlyc3RCdWZmZXIsCisJSU4JVUNIQVIJCQlEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIJCQlwQnl0ZTAsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMSkKK3sKKyAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworfQorCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWlmICgqcHBQYWNrZXQpCisJCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKKworCWlmIChwUGFja2V0KQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7CisKKwkJKnBTcmNCdWZWQSA9IE5VTEw7CisJCSpwU3JjQnVmTGVuID0gMDsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKwl9Cit9CisKKy8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlkZXZfcCA9IHBBZC0+bmV0X2RldjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQoZGV2X3ApOworCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVU0hPUlQJCQlEYXRhU2l6ZTsKKwlVQ0hBUgkJCSpwRGF0YTsKKworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKworCXNrYiA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChza2IpCisJeworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisjaWYgMAorCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKERhdGFTaXplICsgMiszMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQorCXsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKzMyKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcFJldFBhY2tldDsKKworfQorCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQgPSBOVUxMOworCisKKwlpZiAoKHNrYiA9IF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkKKwl7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4pOworCQlza2JfcHV0KHNrYiwgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisJcmV0dXJuIHBQYWNrZXQ7Cit9CisKKworI2RlZmluZSBUS0lQX1RYX01JQ19TSVpFCQk4CitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCXN0cnVjdCBza19idWZmCSpza2IsICpuZXdza2I7CisKKworCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCisJeworCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNrYiA9IG5ld3NrYjsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKworI2lmIDAKKwlpZiAoKGRhdGEgPSBza2JfcHV0KHNrYiwgVEtJUF9UWF9NSUNfU0laRSkpICE9IE5VTEwpCisJewkvLyBJZiB3ZSBjYW4gZXh0ZW5kIGl0LCB3ZWxsLCBjb3B5IGl0IGZpcnN0LgorCQlOZGlzTW92ZU1lbW9yeShkYXRhLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJfQorCWVsc2UKKwl7CisJCS8vIE90aGVyd2lzZSwgY29weSB0aGUgcGFja2V0LgorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyB0byBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0XG4iKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2IgPSBuZXdza2I7CisKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJCXNrYl9wdXQoc2tiLCBUS0lQX1RYX01JQ19TSVpFKTsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKyNlbmRpZgorCit9CisKKworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKQoreworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKwkvLyBjbG9uZSB0aGUgcGFja2V0CisJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKKworCWlmIChwQ2xvbmVkUGt0KQorCXsKKyAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCisgICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OworICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7CisgICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOworICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7CisJfQorCXJldHVybiBwQ2xvbmVkUGt0OworfQorCisvLworLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCisvLwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Cit9CisKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJQVNTRVJUKHBIZWFkZXI4MDJfMyk7CisKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIKKwkvLworCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCit2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgLyogUHVzaCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJSUtBTk9TX0RhdGFGcmFtZVJ4KHBBZCwgcFJ4UGt0LT5kZXYsIHBSeFBrdCwgcFJ4UGt0LT5sZW4pOworI2Vsc2UKKwlwUnhQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocFJ4UGt0LCBwUnhQa3QtPmRldik7CisKKy8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorLy8JKihpbnQqKShwUnhQa3QtPmNiKSA9IEJSSURHRV9UQUc7CisvLyNlbmRpZgorCW5ldGlmX3J4KHBSeFBrdCk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworfQorCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQoreworCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXJldHVybiAoc2cpOworfQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCWludCB4OworCisJaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQorCQlyZXR1cm47CisKKwlwdCA9IHBTcmNCdWZWQTsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQorCXsKKwkJaWYgKHggJSAxNiA9PSAwKQorCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOworCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKKworCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KKworCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgorCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KKworCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCisJCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgorCisJCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5CisKKwkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKQoreworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCisJdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OworCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOworCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOworCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisKKwl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKKwlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CisKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCX0KKworCWlmIChldmVudF90YWJsZV9sZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldmVudCA+PSBldmVudF90YWJsZV9sZW4pCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fRlVOQ1RJT05fXywgZXZlbnQpKTsKKwkJcmV0dXJuOworCX0KKworCS8vQWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IHRoZSBtc2cuCisJaWYoKHBCdWYgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVhfTEVOLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkKKwl7CisJCS8vUHJlcGFyZSB0aGUgcGF5bG9hZAorCQltZW1zZXQocEJ1ZiwgMCwgSVdfQ1VTVE9NX01BWF9MRU4pOworCisJCXBCdWZQdHIgPSBwQnVmOworCisJCWlmIChwQWRkcikKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgU1RBKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSAiLCBQUklOVF9NQUMocEFkZHIpKTsKKwkJZWxzZSBpZiAoQnNzSWR4IDwgTUFYX01CU1NJRF9OVU0pCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIEJTUyhyYSVkKSAiLCBCc3NJZHgpOworCQllbHNlCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApICIpOworCisJCWlmICh0eXBlID09IElXX1NZU19FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsIHBXaXJlbGVzc1N5c0V2ZW50VGV4dFtldmVudF0pOworCQllbHNlIGlmICh0eXBlID09IElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIChSU1NJPSVkKSIsIHBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W2V2ZW50XSwgUnNzaSk7CisJCWVsc2UgaWYgKHR5cGUgPT0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NGbG9vZEV2ZW50VGV4dFtldmVudF0pOworCQllbHNlCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgInVua25vd24gZXZlbnQiKTsKKworCQlwQnVmUHRyW3BCdWZQdHIgLSBwQnVmXSA9ICdcMCc7CisJCUJ1ZkxlbiA9IHBCdWZQdHIgLSBwQnVmOworCisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkgICAgd3JxdS5kYXRhLmZsYWdzID0gRXZlbnRfZmxhZzsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IEJ1ZkxlbjsKKworCQkvL3NlbmQgd2lyZWxlc3MgZXZlbnQKKwkgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwQnVmKTsKKworCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fRlVOQ1RJT05fXywgcEJ1ZikpOworCisJCWtmcmVlKHBCdWYpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fRlVOQ1RJT05fXykpOworI2Vsc2UKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBXaXJlbGVzcyBFeHRlbnNpb24gTVVTVCBiZSB2MTUgb3IgbmV3ZXIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyNlbmRpZiAgLyogV0lSRUxFU1NfRVhUID49IDE1ICovCit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworICAgIHN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisgICAgd2xhbl9uZ19wcmlzbTJfaGVhZGVyICpwaDsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDA7CisgICAgVVNIT1JUIGhlYWRlcl9sZW4gPSAwOworICAgIFVDSEFSIHRlbXBfaGVhZGVyWzQwXSA9IHswfTsKKworICAgIHVfaW50MzJfdCByYWxpbmtyYXRlWzI1Nl0gPSB7Miw0LDExLDIyLCAxMiwxOCwyNCwzNiw0OCw3Miw5NiwgIDEwOCwgICAxMDksIDExMCwgMTExLCAxMTIsIDEzLCAyNiwgMzksIDUyLDc4LDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIDI3LCA1NCw4MSwxMDgsMTYyLCAyMTYsIDI0MywgMjcwLCAvLyBMYXN0IDM4CisJNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgIDE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LDg3LDExNSwgMTczLCAyMzAsMjYwLCAyODgsIDMwLCA2MCw5MCwxMjAsMTgwLDI0MCwyNzAsMzAwLDYwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDYwMCwgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwKKwkxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MH07CisKKworICAgIEFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7CisgICAgaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorICAgIHsKKyAgICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOworICAgICAgICBpZiAoKHBSeEJsay0+cEhlYWRlci0+RkMuVG9EcyA9PSAxKSAmJgorICAgICAgICAgICAgKHBSeEJsay0+cEhlYWRlci0+RkMuRnJEcyA9PSAxKSkKKyAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExOworCisgICAgICAgIC8vIFFPUworICAgIAlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKKyAgICAJeworICAgIAkgICAgaGVhZGVyX2xlbiArPSAyOworICAgIAkJLy8gRGF0YSBza2lwIFFPUyBjb250b3JsIGZpZWxkCisgICAgCQlwUnhCbGstPkRhdGFTaXplIC09MjsKKyAgICAJfQorCisgICAgCS8vIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKworICAgIAlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5PcmRlcikKKyAgICAJeworICAgIAkgICAgaGVhZGVyX2xlbiArPSA0OworCQkJLy8gRGF0YSBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CisgICAgCX0KKworICAgICAgICAvLyBDb3B5IEhlYWRlcgorICAgICAgICBpZiAoaGVhZGVyX2xlbiA8PSA0MCkKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKKworICAgICAgICAvLyBza2lwIEhXIHBhZGRpbmcKKyAgICAJaWYgKHBSeEJsay0+UnhELkwyUEFEKQorICAgIAkgICAgcFJ4QmxrLT5wRGF0YSArPSAoaGVhZGVyX2xlbiArIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwUnhCbGstPnBEYXRhICs9IGhlYWRlcl9sZW47CisgICAgfSAvL2VuZCBpZgorCisKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA8IHBPU1BrdC0+bGVuKSB7CisgICAgICAgIHNrYl90cmltKHBPU1BrdCxwUnhCbGstPkRhdGFTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5EYXRhU2l6ZSAtIHBPU1BrdC0+bGVuKSk7CisgICAgfSAvL2VuZCBpZgorCisgICAgaWYgKChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSA+IDApIHsKKwkgICAgc2tiX3B1dChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKwkgICAgc2tiX3B1bGwocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7CisgICAgfSAvL2VuZCBpZgorCisgICAgaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKyBoZWFkZXJfbGVuKSkgeworICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChwT1NQa3QsIChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLCBHRlBfQVRPTUlDKSkgeworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJZ290byBlcnJfZnJlZV9za19idWZmOworCSAgICB9IC8vZW5kIGlmCisgICAgfSAvL2VuZCBpZgorCisgICAgaWYgKGhlYWRlcl9sZW4gPiAwKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIGhlYWRlcl9sZW4pLCB0ZW1wX2hlYWRlciwgaGVhZGVyX2xlbik7CisKKyAgICBwaCA9ICh3bGFuX25nX3ByaXNtMl9oZWFkZXIgKikgc2tiX3B1c2gocE9TUGt0LCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisJTmRpc1plcm9NZW1vcnkocGgsIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKTsKKworICAgIHBoLT5tc2djb2RlCQkgICAgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOworCXBoLT5tc2dsZW4JCSAgICA9IHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpOworCXN0cmNweShwaC0+ZGV2bmFtZSwgcEFkLT5uZXRfZGV2LT5uYW1lKTsKKworICAgIHBoLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOworCXBoLT5ob3N0dGltZS5zdGF0dXMgPSAwOworCXBoLT5ob3N0dGltZS5sZW4gPSA0OworCXBoLT5ob3N0dGltZS5kYXRhID0gamlmZmllczsKKworCXBoLT5tYWN0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZTsKKwlwaC0+bWFjdGltZS5zdGF0dXMgPSAwOworCXBoLT5tYWN0aW1lLmxlbiA9IDA7CisJcGgtPm1hY3RpbWUuZGF0YSA9IDA7CisKKyAgICBwaC0+aXN0eC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHg7CisJcGgtPmlzdHguc3RhdHVzID0gMDsKKwlwaC0+aXN0eC5sZW4gPSAwOworCXBoLT5pc3R4LmRhdGEgPSAwOworCisgICAgcGgtPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOworCXBoLT5jaGFubmVsLnN0YXR1cyA9IDA7CisJcGgtPmNoYW5uZWwubGVuID0gNDsKKworICAgIHBoLT5jaGFubmVsLmRhdGEgPSAodV9pbnQzMl90KXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICBwaC0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7CisJcGgtPnJzc2kuc3RhdHVzID0gMDsKKwlwaC0+cnNzaS5sZW4gPSA0OworICAgIHBoLT5yc3NpLmRhdGEgPSAodV9pbnQzMl90KVJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwgUlNTSV8yKSk7OworCisJcGgtPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKKwlwaC0+c2lnbmFsLnN0YXR1cyA9IDA7CisJcGgtPnNpZ25hbC5sZW4gPSA0OworCXBoLT5zaWduYWwuZGF0YSA9IDA7IC8vcnNzaSArIG5vaXNlOworCisJcGgtPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7CisJcGgtPm5vaXNlLnN0YXR1cyA9IDA7CisJcGgtPm5vaXNlLmxlbiA9IDQ7CisJcGgtPm5vaXNlLmRhdGEgPSAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisgICAgCXJhdGVfaW5kZXggPSAxNiArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+QlcgKjE2KSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+U2hvcnRHSSAqMzIpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpICsgNDsKKyAgICBlbHNlCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUyk7CisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKyAgICBpZiAocmF0ZV9pbmRleCA+IDI1NSkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDI1NTsKKworCXBoLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKKwlwaC0+cmF0ZS5zdGF0dXMgPSAwOworCXBoLT5yYXRlLmxlbiA9IDQ7CisgICAgcGgtPnJhdGUuZGF0YSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF07CisKKwlwaC0+ZnJtbGVuLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuOworICAgIHBoLT5mcm1sZW4uc3RhdHVzID0gMDsKKwlwaC0+ZnJtbGVuLmxlbiA9IDQ7CisJcGgtPmZybWxlbi5kYXRhCT0gKHVfaW50MzJfdClwUnhCbGstPkRhdGFTaXplOworCisKKyAgICBwT1NQa3QtPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKyAgICBwT1NQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE9TUGt0LCBwT1NQa3QtPmRldik7CisgICAgcE9TUGt0LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworICAgIG5ldGlmX3J4KHBPU1BrdCk7CisKKyAgICByZXR1cm47CisKK2Vycl9mcmVlX3NrX2J1ZmY6CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlyZXR1cm47CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit2b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KQoreworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWRhZW1vbml6ZShwVGhyZWFkTmFtZSAvKiIlcyIscEFkLT5uZXRfZGV2LT5uYW1lKi8pOworCisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRhZW1vbml6ZSgpOworCXJlcGFyZW50X3RvX2luaXQoKTsKKwlzdHJjcHkoY3VycmVudC0+Y29tbSwgcFRocmVhZE5hbWUpOworCisJc2lnaW5pdHNldGludigmY3VycmVudC0+YmxvY2tlZCwgc2lnbWFzayhTSUdURVJNKSB8IHNpZ21hc2soU0lHS0lMTCkpOworCisJLyogQWxsb3cgaW50ZXJjZXB0aW9uIG9mIFNJR0tJTEwgb25seQorCSAqIERvbid0IGFsbG93IG90aGVyIHNpZ25hbHMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc21pc3Npb24gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjIpCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnbWFza19sb2NrLCBmbGFncyk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgLyogc2lnbmFsIHRoYXQgd2UndmUgc3RhcnRlZCB0aGUgdGhyZWFkICovCisJY29tcGxldGUocE5vdGlmeSk7CisKK30KKwordm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJeworCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0Mjk3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbGludXguaApAQCAtMCwwICsxLDkwOCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBQcm9ncmFtOiAgICBydF9saW51eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDcmVhdGVkOiAgICA0LzIxLzIwMDYgMToxNzozOCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBdXRob3I6ICAgICBXdSBYaS1LdW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb21tZW50czogICBgZGVzY3JpcHRpb25gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmV2aXNpb24gMS4xIDQvMjEvMjAwNiAxOjE3OjM4IFBNICB4c2lrdW4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5pdGlhbCByZXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKy8vIGxvYWQgZmlybXdhcmUKKyNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXworI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworI2RlZmluZSBNRU1fQUxMT0NfRkxBRyAgICAgIChHRlBfQVRPTUlDKSAvLyhHRlBfRE1BIHwgR0ZQX0FUT01JQykKKworI2lmbmRlZiBJRk5BTVNJWgorI2RlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCisKKy8vI2RlZmluZSBDT05GSUdfQ0tJUF9TVVBQT1JUCisKKyN1bmRlZiBfX2lubGluZQorI2RlZmluZSBfX2lubGluZQkgICBzdGF0aWMgaW5saW5lCisKK3R5cGVkZWYgaW50ICgqSEFSRF9TVEFSVF9YTUlUX0ZVTkMpKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworLy8gYWRkIGJ5IGthdGh5CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL1JUMjg3MFNUQS5kYXQiCisjZGVmaW5lIFNUQV9SVDI4NzBfSU1BR0VfRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvcnQyODcwLmJpbiIKKyNkZWZpbmUgU1RBX05JQ19ERVZJQ0VfTkFNRQkJCSJSVDI4NzBTVEEiCisjZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIxLjQuMC4wIgorI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorI2RlZmluZSBDQVJEX0lORk9fUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9SVDI4NzBTVEFDYXJkLmRhdCIKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKKyNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZWxzZQorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKSB0aW1lX2FmdGVyKGEsIGIpCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKSBcCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIFwKKwl7IFwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCByZXNlcnZlIG1vZHVsZVxuIiwgX19GVU5DVElPTl9fKSk7IFwKKwkJcmV0dXJuIC0xOyBcCisJfQorCisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZWxzZQorI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpCU1PRF9JTkNfVVNFX0NPVU5UOworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIE1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisKKyNkZWZpbmUgT1NfSFoJCQlIWgorCisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisKKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisKKyNkZWZpbmUgTkRJU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVAorI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgorI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCQkvLzB4MDB+MHgzZgorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCQkvLzB4MDAsMHgxMCwweDIwLDB4MzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUwkJCTB4MTAJCS8vMHg0MCwweDUwLDB4NjAsMHg3MAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQordHlwZWRlZglzdHJ1Y3QgcGlkICoJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCU5VTEwKKyNkZWZpbmUJR0VUX1BJRChfdikJZmluZF9nZXRfcGlkKF92KQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKF92KQorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKHBpZF9ucihfcGlkKSA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoX0EsIF9CLCBfQykKKyNlbHNlCit0eXBlZGVmCXBpZF90CVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQktMQorI2RlZmluZQlHRVRfUElEKF92KQlfdgorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJX3YKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChfcGlkID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3Byb2MoX0EsIF9CLCBfQykKKyNlbmRpZgorCitzdHJ1Y3Qgb3NfbG9jayAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJdW5zaWduZWQgbG9uZyAgCWZsYWdzOworfTsKKworCitzdHJ1Y3Qgb3NfY29va2llIHsKKworI2lmZGVmIFJUMjg3MAorCXN0cnVjdCB1c2JfZGV2aWNlCQkqcFVzYl9EZXY7CisKKwlUSFJFQURfUElECQkJCU1MTUVUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJUlRVU0JDbWRUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJVGltZXJRVGhyX3BpZDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJcnhfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMwX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzFfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMzX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAloY2NhX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRidHRfdGFzazsKKyNpZmRlZiBSVDI4NzAKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlydHNfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCisJSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKKwlJTlQgCQkJCQlpb2N0bF9pZjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9WSVJUVUFMX0FEQVBURVIKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlJ0bXBEZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpWaXJ0dWFsRGV2OworfSBWSVJUVUFMX0FEQVBURVIsIFBWSVJUVUFMX0FEQVBURVI7CisKKyN1bmRlZiAgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3R5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Cit0eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKK3R5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKK3R5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKK3R5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7CisvL3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUkFMSU5LX1RJTUVSX1NUUlVDVDsKKy8vdHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAkqIFBSQUxJTktfVElNRVJfU1RSVUNUOworLy90eXBlZGVmIHN0cnVjdCBvc19sb2NrCQlORElTX1NQSU5fTE9DSzsKK3R5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlORElTX01JTklQT1JUX1RJTUVSOwordHlwZWRlZiB2b2lkCQkJCSogTkRJU19IQU5ETEU7Cit0eXBlZGVmIGNoYXIgCQkJCSogUE5ESVNfQlVGRkVSOworCisKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNT1ZFIFRPIHJ0bXAuaCA/CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgUFJJTlRfTUFDKGFkZHIpCVwKKwlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdCisKKworI2RlZmluZSBSVDI4NjBfUENJX0RFVklDRV9JRAkJMHgwNjAxCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgKFVMT05HKTAKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX0RNQV9DQUNIRV9XQkFDSyhfcHRyLCBfc2l6ZSkJXAorCWRtYV9jYWNoZV93YmFjayhfcHRyLCBfc2l6ZSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUlRNUF9PU19USU1FUjsKKworI2lmZGVmIFJUMjg3MAorLyogLS0tLS0tLS0tLS0tLS0tLS0gVGltZXIgUmVsYXRlZCBNQVJDTyAtLS0tLS0tLS0tLS0tLS0qLworLy8gSW4gUlQyODcwLCB3ZSBoYXZlIGEgbG90IG9mIHRpbWVyIGZ1bmN0aW9ucyBhbmQgd2lsbCByZWFkL3dyaXRlIHJlZ2lzdGVyLCBpdCdzCisvLwlub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiBzdWJtaXQKKy8vICB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCisKK3R5cGVkZWYgVk9JRCAoKlJUMjg3MF9USU1FUl9IQU5ETEUpKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKKyAgICBSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKKwlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKKyAgICBCT09MRUFOCSAgICAgIAkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgorICAgIFVMT05HICAgICAgICAgICAgICAgVGltZXJWYWx1ZTsgICAgIC8vIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCVVMT05HCQkJCWNvb2tpZTsJCQkvLyBvcyBzcGVjaWZpYyBvYmplY3QKKyNpZmRlZiBSVDI4NzAKKwlSVDI4NzBfVElNRVJfSEFORExFCWhhbmRsZTsKKwl2b2lkCQkJCSpwQWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCit9ICAgUkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOworCisKKyNpZmRlZiBSVDI4NzAKKwordHlwZWRlZiBlbnVtIF9SVDI4NzBfS0VSTkVMX1RIUkVBRF9TVEFUVVNfCit7CisJUlQyODcwX1RIUkVBRF9VTktOT1dOID0gMCwKKwlSVDI4NzBfVEhSRUFEX0lOSVRFRCA9IDEsCisJUlQyODcwX1RIUkVBRF9SVU5OSU5HID0gMiwKKwlSVDI4NzBfVEhSRUFEX1NUT1BFRCA9IDQsCit9UlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTOworCisjZGVmaW5lIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVAkJKFJUMjg3MF9USFJFQURfSU5JVEVEIHxSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCisKK3R5cGVkZWYgc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfCit7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAJCQkqcFJhVGltZXI7CisJc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfIAkqcE5leHQ7Cit9UlQyODcwX1RJTUVSX0VOVFJZOworCisKKyNkZWZpbmUgVElNRVJfUVVFVUVfU0laRV9NQVgJMTI4Cit0eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX1FVRVVFXworeworCXVuc2lnbmVkIGludAkJc3RhdHVzOworCS8vd2FpdF9xdWV1ZV9oZWFkX3QgCXRpbWVyV2FpdFE7CisJLy9hdG9taWNfdAkJCWNvdW50OworCVVDSEFSCQkJCSpwVGltZXJRUG9sbDsKKwlSVDI4NzBfVElNRVJfRU5UUlkJKnBRUG9sbEZyZWVMaXN0OworCVJUMjg3MF9USU1FUl9FTlRSWSAJKnBRSGVhZDsKKwlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUVRhaWw7Cit9UlQyODcwX1RJTUVSX1FVRVVFOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8vI2RlZmluZSBEQkcJMQorCisvLworLy8gIE1BQ1JPIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy8vCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisKKyNlbHNlCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQorI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQorI2VuZGlmCisKKworLy8KKy8vICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sKKy8vCisjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9TRU1fVU5MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAorCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKK30KKworI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAorfQorI2Vsc2UKKworLy8gc2FtcGxlLCB1c2Ugc2VtYXBob3JlIGxvY2sgdG8gcmVwbGFjZSBJUlEgbG9jaywgMjAwNy8xMS8xNQorI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2lycWZsYWdzID0gMDsJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilfX2xvY2ssIF9faXJxZmxhZ3MpOwlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCit9CisjZW5kaWYKKworCisKKyNpZmRlZiBSVDI4NzAKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCisJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoX0EsIF9SLCBfcFYpCisKKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJXAorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihfQSwgX1IsIF9WKQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCVVTSE9SVAlfVmFsID0gX1Y7CQkJCQkJCQkJCQlcCisJUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WYWwpOwkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKF9BLCBfUiwgX1YpOwkJCQkJCQkJXAorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisjZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCitkbyB7IFwKKyAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAorICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAorICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCisgICAgICAgIGZvciAoOzspIHsgXAorICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKyAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCisoeyBcCisgICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCisgICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKKyAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAorICAgICAgICBfX3JldDsgXAorfSkKKyNlbmRpZgorI2RlZmluZSBPTkVfVElDSyAxCisjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKK3sJaW50IF9pOyBcCisJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XAorCXdhaXRfcXVldWVfaGVhZF90IF93YWl0OyBcCisJaW5pdF93YWl0cXVldWVfaGVhZCgmX3dhaXQpOyBcCisJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KKworCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKyNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKSBvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKSAgICAgb3NfZnJlZV9tZW0oX3BBZCwgX3BWQSkKKworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFJBTElOS19USU1FUl9TVFJVQ1QJX3BUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVClkYXRhOwkJCQkJXAorCVJUMjg3MF9USU1FUl9FTlRSWQkJKl9wUU5vZGU7CQkJCQkJCQkJCQkJXAorCVJUTVBfQURBUFRFUgkJCSpfcEFkOwkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfcFRpbWVyLT5oYW5kbGUgPSBfZnVuYzsJCQkJCQkJCQkJCQkJCQlcCisJX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCQkJXAorCV9wUU5vZGUgPSBSVDI4NzBfVGltZXJRX0luc2VydChfcEFkLCBfcFRpbWVyKTsgCQkJCQkJCQkJXAorCWlmICgoX3BRTm9kZSA9PSBOVUxMKSAmJiAoX3BBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkpCVwKKwkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBIWik7ICAgICAgICAgICAgICAgCQkJCQlcCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworI2RlZmluZSBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCisKKyNkZWZpbmUgR0VUX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQlcCisJCWxpbnV4XyMjX2Z1bmMKKworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKKworCisvKgorICogcGFja2V0IGhlbHBlcgorICogCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCisgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CisgKi8KKyNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKKyNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9IRUFEKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5oZWFkKQorCisjZGVmaW5lIEdFVF9PU19QS1RfRU5EKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5lbmQpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVRERVYoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikKKworI2RlZmluZSBHRVRfT1NfUEtUX1RZUEUoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVhUKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5uZXh0KQorCisKKyNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAorCQkobnRvaHMoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKKwkJKGh0b25zKF9WYWwpKQorI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCisJCShudG9obChfVmFsKSkKKyNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAorCQkoaHRvbmwoX1ZhbCkpCisKKy8qIHN0YXRpc3RpY3MgY291bnRlciAqLworI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQorCisKKyNkZWZpbmUgQ0JfT0ZGICAxMAorCisKKy8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKKy8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKKy8vCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01SKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCkpCisKKy8vIFVzZXIgUHJpb3JpdHkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQorCisvLyBGcmFnbWVudCAjCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKKworLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgorLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQorLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dDSUQoX3AsIF93ZHNpZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0gPSBfd2RzaWR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKFVDSEFSKShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCisKKy8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCisKKy8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfUlRTKF9wLCBfbnVtKSAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1JUUyhfcCkgICAgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCisvLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKKworLy8gVFggcmF0ZSBpbmRleAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKKworLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lGKF9wLCBfaWZkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSA9IF9pZmR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSUYoX3ApCQkgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKF9ic3MpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9XRFMoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfYnNzKSArIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9BUENMSShfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NRVNIKF9wLCBfaWR4KSAgIAlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wKQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShfcCkJCQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShfcCwgX21vcmViaXQpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10gPSBfbW9yZWJpdCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10pCisKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCShSVFBLVF9UT19PU1BLVChfcCktPmNiWzhdID0gX2JzcykKKy8vI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYls4XSkKKworCisKKworI2lmIDAKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApICAgICAgICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pCisjZWxzZQorLy8KKy8vCVNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQorCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wJCTB4MDIKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNAkJMHgwNAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkJCTB4MDgKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTgkJMHgxMAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQCTB4MjAKKworLy9TcGVjaWZpYworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMoX3AsIF9mbGcpCSAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdID0gX2ZsZykKKworLy9ESENQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQorCisvL0VBUE9MCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCisKKy8vV0FJCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0FJKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKSkKKworLy9WTEFOCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQorCisvL0xMQy9TTkFQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQorCisvLyBJUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKKworI2VuZGlmCisKKworLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBFQVBvTCBmcmFtZSBNVVNUIGJlIGNsZWFyLgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0gPSBfZmxnKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0pCisKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQorCisKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyNkZWZpbmUgQlJJREdFX1RBRyAweDM1NTY0MjUyICAgIC8vIGRlcGVuZHMgb24gNVZUIGRlZmluZSBpbiBicl9pbnB1dC5jCisjZW5kaWYKKworCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCisKKworI2RlZmluZSBHRVRfU0dfTElTVF9GUk9NX1BBQ0tFVChfcCwgX3NjKQlcCisgICAgcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoX3AsIF9zYykKKworCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKworCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisKKy8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAorCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKKworI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAorCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCisKKworI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAorI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCisoKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCisjZW5kaWYKKworCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCisjZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisKKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKKworc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCit7CisJKnRpbWUgPSBqaWZmaWVzOworfQorCisvL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCisJCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKKworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkwZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTg2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIHJlY29yZCB3aGV0aGVyIHRoZSBjYXJkIGluIHRoZSBjYXJkIGxpc3QgaXMgdXNlZCBpbiB0aGUgY2FyZCBmaWxlCitVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKKy8vIHJlY29yZCB1c2VkIGNhcmQgbWFjIGFkZHJlc3MgaW4gdGhlIGNhcmQgbGlzdAorc3RhdGljIFVJTlQ4ICBNQ19DYXJkTWFjW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF1bNl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisKK2NoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAorY2hhciAqaG9zdG5hbWUgPSAiIjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQorTU9EVUxFX1BBUk0gKG1hYywgInMiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDIChtYWMsICJydDI4eHg6IHdpcmVsZXNzIG1hYyBhZGRyIik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCitleHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKKy8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKK0lOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCisvLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQorc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCitzdGF0aWMgdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCk7CisvL3N0YXRpYyBCT09MRUFOIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKElOIENIQVIgKm5hbWVfcCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKworCisJVklSVFVBTF9JRl9ET1dOKHBBZCk7CisKKwlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX29wZW4oSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworICAgIFJUTVBfQURBUFRFUgkqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlCT09MRUFOIAkJQ2FuY2VsbGVkID0gRkFMU0U7CisJVUlOVDMyCQkJaSA9IDA7CisjaWZkZWYgUlQyODcwCisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodW5saW5rX3dha2V1cCk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKwkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgeworCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIH0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQlVQ0hBUiBpOworCisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJeworCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNSZXEuUmVhc29uID0gIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOworCQkJa2ZyZWUoTXNnRWxlbSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKworI2lmZGVmIFJUMjg3MAorCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfRE9XTjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlNbG1lUmFkaW9PZmYocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwl7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCisJCXsKKwkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4KKwlhZGRfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKKwlwQWQtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKKworCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCisJaSA9IDA7CisJLy93aGlsZSgoaSA8IDI1KSAmJiBhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKKwl3aGlsZShpIDwgMjUpCisJeworCQl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlpZiAocEFkLT5QZW5kaW5nUnggPT0gMCkKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOSkKKwkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsJLy9UaW1lIGluIG1pbGxpc2Vjb25kCisjZWxzZQorCQlSVE1QdXNlY0RlbGF5KFVOTElOS19USU1FT1VUX01TKjEwMDApOwkvL1RpbWUgaW4gbWljcm9zZWNvbmQKKyNlbmRpZgorCQlpKys7CisJfQorCXBBZC0+d2FpdCA9IE5VTEw7CisJcmVtb3ZlX3dhaXRfcXVldWUgKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLypub3QgdXNlZCBpbiBSVDI4eHgqLworCisKKyNpZmRlZiBSVDI4NzAKKwkvLyBXZSBuZWVkIGNsZWFyIHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgZXhpdHMgb2YgdGhlIHRpbWVyIHRocmVhZC4KKwlSVDI4NzBfVGltZXJRX0V4aXQocEFkKTsKKwkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cworCVJUMjh4eFRocmVhZFRlcm1pbmF0ZShwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKKwlNbG1lSGFsdChwQWQpOworCisJLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKKwlraWxsX3RocmVhZF90YXNrKHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOworCVRwY1JlcVRhYkV4aXQocEFkKTsKKworCisKKworCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorI2lmZGVmIElORl9BTUFaT05fU0UKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5Vc2JWZW5kb3JSZXFCdWYpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KKworc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJVUlOVAkJCQkJaW5kZXg7CisJVUNIQVIJCQkJCVRtcFBoeTsKKwlORElTX1NUQVRVUwkJCQlTdGF0dXM7CisJVUlOVDMyIAkJTWFjQ3NyMCA9IDA7CisKKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJaW5pdF9NVVRFWCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIpJnBBZC0+VXNiVmVuZG9yUmVxQnVmLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgLSAxKTsKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFsbG9jYXRlIHZlbmRvciByZXF1ZXN0IHRlbXAgYnVmZmVyIGZhaWxlZCFcbiIpKTsKKwkJZ290byBlcnIwOworCX0KKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeQorCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4KKwlpbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKwkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCisJLy8gRGlzYWJsZSBETUEKKwlSVDI4WFhETUFEaXNhYmxlKHBBZCk7CisKKworCS8vIExvYWQgODA1MSBmaXJtd2FyZQorCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOworCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQorCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKKworCVN0YXR1cyA9IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCisJLy8gaW5pdGlhbGl6ZSBNTE1FCisJLy8KKworCVN0YXR1cyA9IE1sbWVJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjI7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdAorCS8vCisJVXNlckNmZ0luaXQocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCS8vIFdlIG5lZWQgaW5pdCB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGNyZWF0ZSB0aGUgdGltZXIgdGhyZWFkLgorCVJUMjg3MF9UaW1lclFfSW5pdChwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIxOworCisvLwlDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7CisvLwlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOworCisJQ2ZnSW5pdEhvb2socEFkKTsKKworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKKwlUcGNSZXFUYWJJbml0KHBBZCk7CisKKwkvLworCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0CisJLy8KKwlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjM7CisJfQorCisJLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKKwlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7CisKKwlwcmludGsoIjEuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgUlQyODcwCisJcEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQID0gRkFMU0U7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQKQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IFJYX1JJTkdfU0laRTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gMTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisgICAJLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KKy8vCVJUMjhYWF9CQV9JTklUKHBBZCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvLyBVUGRhdGEgdG8gSFQgSUUKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZQorCisJLy8gTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudAorCS8vIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCS8vIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkvLyAgICBicmVhazsKKworCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisKKwkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgorCisJLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCisJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgorCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCisJeworCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7CisJCWdvdG8gZXJyNDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODcwCisgICAgLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQorCU5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWYgMAorCS8vIFBhdGNoIGNhcmRidXMgY29udHJvbGxlciBpZiBFRVBST00gc2FpZCBzby4KKwlpZiAocEFkLT5iVGVzdDEgPT0gRkFMU0UpCisJCVJUTVBQYXRjaENhcmRCdXMocEFkKTsKKyNlbmRpZgorCisKKy8vCQlBUEluaXRpYWxpemUocEFkKTsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCQkvLworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCS8vCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7CisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJeworCQkvLworCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCisJCS8vCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJCXsKKy8vCQkJTmRpc01EZXJlZ2lzdGVySW50ZXJydXB0KCZwQWQtPkludGVycnVwdCk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCQl9CisvLwkJUlRNUEZyZWVBZGFwdGVyKHBBZCk7IC8vIHdlIHdpbGwgZnJlZSBpdCBpbiBkaXNjb25uZWN0KCkKKwl9CisJZWxzZSBpZiAocEFkKQorCXsKKwkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisvLwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEIhXG4iKSk7CisKKworI2lmZGVmIFJUMjg3MAorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworCisJCS8vCisJCS8vIFN1cHBvcnQgbXVsdGlwbGUgQnVsa0luIElSUCwKKwkJLy8gdGhlIHZhbHVlIG9uIHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQIG1heSBiZSBsYXJnZSB0aGFuIDEuCisJCS8vCisJCWZvcihpbmRleD0wOyBpbmRleDxwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaW5kZXgrKykKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRVU0JCdWxrUmVjZWl2ZSFcbiIgKSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9Ly8gZW5kIG9mIGVsc2UKKworCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gUlRNUEluaXRpYWxpemUsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisKKwlyZXR1cm4gVFJVRTsKKworCitlcnI0OgorZXJyMzoKKwlNbG1lSGFsdChwQWQpOworZXJyMjoKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisvLwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKK2VycjE6CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2Rldik7CisKKwkvLyBzaGFsbCBub3Qgc2V0IG1sX3ByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIG1sX3ByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCisJLy9uZXRfZGV2LT5tbF9wcml2ID0gMDsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCitlcnIwOgorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7CisJcmV0dXJuIEZBTFNFOworfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaW50IHJldHZhbCA9IDA7CisgCVBPU19DT09LSUUgcE9iajsKKworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gMTA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID49IDEyIC8vCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gSW5pdAorIAlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkvLyByZXNldCBBZGFwdGVyIGZsYWdzCisJUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCisJLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCisJLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCisJUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpOworCisKKwkvLyBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuCisKKworCS8vIENoaXAgJiBvdGhlciBpbml0CisJaWYgKHJ0Mjh4eF9pbml0KG5ldF9kZXYpID09IEZBTFNFKQorCQlnb3RvIGVycjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwgc3RybGVuKG5ldF9kZXYtPm5hbWUpKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsICh2b2lkICopIHBBZC0+Q3VycmVudEFkZHJlc3MsIDYpOworCisJLy8gSW5pdCBJUlEgcGFyYW1ldGVycworCVJUMjhYWF9JUlFfSU5JVChwQWQpOworCisJLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCXsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgZG93bi4KKwkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCXdycXUuZGF0YS5mbGFncyA9IFJUX0lOVEVSRkFDRV9VUDsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOworCisJLy8gTm93IEVuYWJsZSBSeFR4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CisKKwl7CisJVUlOVDMyIHJlZyA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCX0KKworCXsKKy8vCXUzMiByZWc7CisvLwl1OCAgYnl0ZTsKKy8vCXUxNiB0bXA7CisKKy8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgWElGU19USU1FX0NGRywgJnJlZyk7CisKKy8vCXRtcCA9IDB4MDgwNTsKKy8vCXJlZyAgPSAocmVnICYgMHhmZmZmMDAwMCkgfCB0bXA7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCByZWcpOworCisJfQorCisjaWYgMAorCS8qCisJICogZGVidWdnaW5nIGhlbHBlcgorCSAqIAkJc2hvdyB0aGUgc2l6ZSBvZiBtYWluIHRhYmxlIGluIEFkYXB0ZXIgc3RydWN0dXJlCisJICoJCU1hY1RhYiAgLS0gMTg1SworCSAqCQlCQVRhYmxlIC0tIDEzN0sKKwkgKiAJCVRvdGFsIAktLSAzODVLICAhISEhISAoNS8yNi8yMDA2KQorCSAqLworCXByaW50aygic2l6ZW9mKHBBZC0+TWFjVGFiKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+TWFjVGFiKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BY2Nlc3NDb250cm9sTGlzdCkgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFjY2Vzc0NvbnRyb2xMaXN0KSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BcENmZykgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFwQ2ZnKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5CQVRhYmxlKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+QkFUYWJsZSkpOworCUJVRygpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAocmV0dmFsKTsKKworZXJyOgorCXJldHVybiAoLTEpOworfSAvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KKworCisvKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCitzdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTIFN0YXR1czsKKwlJTlQgICAgIGk9MDsKKwlDSEFSICAgIHNsb3RfbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2aWNlOworCisKKwkvL2V0aGVyX3NldHVwKGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydDI4eHhfc2VuZF9wYWNrZXRzOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gSUtBTk9TX0RhdGFGcmFtZXNUeDsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKy8vCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaWVlZTgwMjExX3NldF9tdWx0aWNhc3RfbGlzdDsKKy8vCWRldi0+Y2hhbmdlX210dSA9IGllZWU4MDIxMV9jaGFuZ2VfbXR1OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMjEKKwkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT5nZXRfc3RhdHMgPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzOworCWRldi0+b3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbjsgLy9ydDI4eHhfb3BlbjsKKwlkZXYtPnN0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlOyAvL3J0Mjh4eF9jbG9zZTsKKy8vCWRldi0+dW5pbml0ID0gaWVlZTgwMjExX2lmX3JlaW5pdDsKKy8vCWRldi0+ZGVzdHJ1Y3RvciA9IGllZWU4MDIxMV9pZl9mcmVlOworCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCWRldi0+ZG9faW9jdGwgPSBydDI4eHhfaW9jdGw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworI2VuZGlmCisJLy8gZmluZCBhdmFpbGFibGUgZGV2aWNlIG5hbWUKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkJCXNwcmludGYoc2xvdF9uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOworI2Vsc2UKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldi0+bmRfbmV0LCBzbG90X25hbWUpOworI2VuZGlmCisjZWxzZQorCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoc2xvdF9uYW1lKTsKKyNlbmRpZgorCQlpZiAoZGV2aWNlICE9IE5VTEwpIGRldl9wdXQoZGV2aWNlKTsKKyNlbHNlCisJCWZvciAoZGV2aWNlID0gZGV2X2Jhc2U7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpCisJCXsKKwkJCWlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwlpZihpID09IDgpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJICAgICAgICBzcHJpbnRmKGRldi0+bmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoZGV2LT5uYW1lLCAicmElZCIsIGkpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KKworQXJndW1lbnRzOgorICAgIHBBZAorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCisJRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZXh0ZXJuIElOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcik7CisKK0JPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKworI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAorCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAorCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCisJCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKKwkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKKwkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAorCQl9IH0KKworCXN0cnVjdCBmaWxlICpzcmNmOworCUlOVCByZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3Qgb3JnZnM7CisJQ0hBUiAqYnVmZmVyLCAqdG1wYnVmLCBjYXJkX2lkX2J1ZlszMF0sIFJGSUNfd29yZFszMF07CisJQk9PTEVBTiBmbGdfbWF0Y2hfb2sgPSBGQUxTRTsKKwlJTlQzMiBjYXJkX3NlbGVjdF9tZXRob2Q7CisJSU5UMzIgY2FyZF9mcmVlX2lkLCBjYXJkX25vdXNlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX21hdGNoX2lkOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIGFudGVubmE7CisJVVNIT1JUIGFkZHIwMSwgYWRkcjIzLCBhZGRyNDU7CisJVUlOVDggbWFjWzZdOworCVVJTlQzMiBkYXRhLCBjYXJkX2luZGV4OworCVVDSEFSICpzdGFydF9wdHI7CisKKworCS8vIGluaXQKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8vIGdldCBSRiBJQyB0eXBlCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvLyA5M0M0NgorCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzg2CisKKwkvL2FudGVubmEud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7CisKKwlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAorCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQorCXsKKwkJLyogQUJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7CisJfQorCWVsc2UKKwl7CisJCS8qIEJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKKwl9CisKKwkvLyBnZXQgTUFDIGFkZHJlc3MKKwkvL2FkZHIwMSA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCS8vYWRkcjIzID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJLy9hZGRyNDUgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKKworCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7CisJbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7CisJbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKKwltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKKwltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOworCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOworCisJLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKKwlzcmNmID0gZmlscF9vcGVuKENBUkRfSU5GT19QQVRILCBPX1JET05MWSwgMCk7CisJaWYgKElTX0VSUihzcmNmKSkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLCBDQVJEX0lORk9fUEFUSCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBleGlzdHMgc28gcmVhZGluZyB0aGUgY2FyZCBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJcmV0dmFsID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQl7CisJCQkvKiByZWFkIGZhaWwgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgQ0FSRF9JTkZPX1BBVEgsIC1yZXR2YWwpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGdldCBjYXJkIHNlbGVjdGlvbiBtZXRob2QgKi8KKwkJCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7IC8vIGRlZmF1bHQKKworCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNFTEVDVCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJeworCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRElEIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRJRDsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX01BQzsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRFRZUEUiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKKworCQkJLy8gaW5pdAorCQkJY2FyZF9mcmVlX2lkID0gLTE7CisJCQljYXJkX25vdXNlX2lkID0gLTE7CisJCQljYXJkX3NhbWVfbWFjX2lkID0gLTE7CisJCQljYXJkX21hdGNoX2lkID0gLTE7CisKKwkJCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcworCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQljYXJkX2luZGV4KyspCisJCQl7CisJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCXsKKwkJCQkJLy8gTUFDIGlzIGFsbC0wIHNvIHRoZSBlbnRyeSBpcyBhdmFpbGFibGUKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOworCisJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPCAwKQorCQkJCQkJY2FyZF9mcmVlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGZyZWUgZW50cnkKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZpbmQgdGhlIGVudHJ5IHdpdGggc2FtZSBNQUMKKwkJCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKKwkJCQkJCQljYXJkX3NhbWVfbWFjX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IHNhbWUgZW50cnkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIE1BQyBpcyBub3QgYWxsLTAgYnV0IHVzZWQgZmxhZyA9PSAwCisJCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCisJCQkJCQkJKGNhcmRfbm91c2VfaWQgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCisJCQkJCWNhcmRfZnJlZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9ub3VzZV9pZCkpOworCisJCQlpZiAoKGNhcmRfc2FtZV9tYWNfaWQgPj0gMCkgJiYKKwkJCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAorCQkJCShjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKSkpCisJCQl7CisJCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKKwkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9zYW1lX21hY19pZDsKKworCQkJCWlmIChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKQorCQkJCXsKKwkJCQkJLy8gZm9yIENBUkRUWVBFCisJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKworCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZm91bmQgdGhlIGNhcmQgSUQKKwkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKGNhcmRfZnJlZV9pZCA+PSAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7CisJCQkJCQllbHNlCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIk1BQyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisKKwkJCQkJCS8qIHRyeSB0byBmaW5kIHRoZSBrZXkgd29yZCBpbiB0aGUgY2FyZCBmaWxlICovCisJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkvKiBnZXQgdGhlIHJvdyBJRCAoMiBBU0NJSSBjaGFyYWN0ZXJzKSAqLworCQkJCQkJCXN0YXJ0X3B0ciAtPSAyOworCQkJCQkJCWNhcmRfaWRfYnVmWzBdID0gKihzdGFydF9wdHIpOworCQkJCQkJCWNhcmRfaWRfYnVmWzFdID0gKihzdGFydF9wdHIrMSk7CisJCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOworCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IHNpbXBsZV9zdHJ0b2woY2FyZF9pZF9idWYsIDAsIDEwKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCisJCQkJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCQkJCWNhcmRfaW5kZXgrKykKKwkJCQkJCXsKKwkJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCQkJY2FyZF9pbmRleCwgUkZJQ193b3JkKTsKKworCQkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwKKwkJCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvKiBjdXJyZW50IHRoZSBjYXJkIHByb2ZpbGUgaXMgbm90IHVzZWQgKi8KKwkJCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJaWYgKGNhcmRfbm91c2VfaWQgPCAwKQorCQkJCQkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gaWYgbm90IGZpbmQgYSBmcmVlIG9uZSwgdXNlIHRoZSBhdmFpbGFibGUgb25lCisJCQkJCQlpZiAoY2FyZF9tYXRjaF9pZCA8IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjYXJkX21hdGNoX2lkID49IDApCisJCQl7CisJCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJESUQiLCBjYXJkX21hdGNoX2lkKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLAorCQkJCQkJCQkiJTAyZG1hYyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZWFyY2ggS2V5d29yZCA9ICVzXG4iLCBjYXJkX2lkX2J1ZikpOworCisJCQkJLy8gcmVhZCBjYXJkIGZpbGUgcGF0aAorCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8IHNpemVvZihwQWQtPk1DX0ZpbGVOYW1lKSkKKwkJCQkJeworCQkJCQkJLy8gYmFja3VwIGNhcmQgaW5mb3JtYXRpb24KKwkJCQkJCXBBZC0+TUNfUm93SUQgPSBjYXJkX21hdGNoX2lkOyAvKiBiYXNlIDAgKi8KKwkJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKKwkJCQkJCW1lbWNweShNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCBtYWMsIHNpemVvZihtYWMpKTsKKworCQkJCQkJLy8gYmFja3VwIGNhcmQgZmlsZSBwYXRoCisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7CisJCQkJCQlwQWQtPk1DX0ZpbGVOYW1lW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7CisJCQkJCQlmbGdfbWF0Y2hfb2sgPSBUUlVFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSA9ICVzXG4iLCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoKGZsZ19tYXRjaF9vayAhPSBUUlVFKSAmJgorCQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQkJeworCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDA7CisJCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7CisJCQkJfQorCQkJfSAvLyBpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQl9CisJfQorCisJLy8gY2xvc2UgZmlsZQorCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJc2V0X2ZzKG9yZ2ZzKTsKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCXJldHVybiBmbGdfbWF0Y2hfb2s7Cit9CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCVByb2JlIE9LCisJLUVOT0RFVgkJCQlQcm9iZSBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAorICAgIElOICB2b2lkICpfZGV2X3AsCisgICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKKwlJTiAgVUlOVCBhcmdjLAorCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQoreworICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOworICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOworCVBWT0lECQkJCWhhbmRsZTsKKyNpZmRlZiBSVDI4NzAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlkZXZfcCA9IHVzYl9nZXRfZGV2KGRldl9wKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoZWNrIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQKKy8vCWlmIChSVDI4WFhDaGlwc2V0Q2hlY2soX2Rldl9wKSA9PSBGQUxTRSkKKy8vCQlnb3RvIGVycl9vdXQ7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAgICAgICAvLyBSZWQgSGF0IDcuMQorICAgIG5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7CisjZWxzZQorICAgIG5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoUFJUTVBfQURBUFRFUikpOworI2VuZGlmCisgICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKyNlbHNlCisJCU1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKy8vIHNhbXBsZQorLy8JaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorLy8JCWdvdG8gZXJyX291dDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKy8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKyAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisgICAgU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihkZXZfcC0+ZGV2KSk7CisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCVJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJbmV0X2Rldi0+bWxfcHJpdiA9IChQVk9JRClwQWQ7CisgICAgcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsgLy8gbXVzdCBiZSBiZWZvcmUgUlQyOFhYTmV0RGV2SW5pdCgpCisKKwlSVDI4WFhOZXREZXZJbml0KF9kZXZfcCwgbmV0X2RldiwgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIHBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRmluZCBhbmQgYXNzaWduIGEgZnJlZSBpbnRlcmZhY2UgbmFtZSwgcmF4eAorLy8JUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24obmV0X2Rldi0+bmFtZSk7CisKKwkvLyBQb3N0IGNvbmZpZworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIGFyZ2MpID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZWxzZQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAorCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCisJUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKKworCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTUM+IFJPVyA9ICVkLCBQQVRIID0gJXNcbiIsIHBBZC0+TUNfUm93SUQsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIHNhbXBsZSBtb3ZlCisJaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2LCBwQWQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCisgICAgc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworICAgIGlmIChzdGF0dXMpCisgICAgICAgIGdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFNldCBkcml2ZXIgZGF0YQorCVJUMjhYWF9EUlZEQVRBX1NFVChfZGV2X3ApOworCisKKworCSpwcEFkID0gcEFkOworICAgIHJldHVybiAwOyAvLyBwcm9iZSBvaworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF91bm1hcDoKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKwlSVDI4WFhfVU5NQVAoKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCisKK2Vycl9vdXQ6CisJUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcmV0dXJuIChMT05HKU5VTEw7CisjZWxzZQorICAgIHJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCit9IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgorCitSZXR1cm4gVmFsdWU6CisgICAgMAorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bworCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKKwlpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCBzdGF0dXMgPSAwOworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKKwlpZiAoc2tiLT5sZW4gPCAxNCkKKwl7CisJCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7CisJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJZ290byBkb25lOworCX0KKworI2lmIDAKKy8vCWlmICgocGt0LT5kYXRhWzBdICYgMHgxKSA9PSAwKQorCXsKKwkJLy9oZXhfZHVtcChfX0ZVTkNUSU9OX18sIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOworCQlwcmludGsoInBQYWNrZXQgPSAleFxuIiwgcFBhY2tldCk7CisJfQorI2VuZGlmCisKKwlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDApOworLy8JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBwa3QtPmRhdGEsIHBrdC0+bGVuKTsKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyAgICBpZiAoKihpbnQqKShza2ItPmNiKSA9PSBCUklER0VfVEFHKSB7CisJCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMSk7CisgICAgfQorI2VuZGlmCisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisKKwkJU1RBU2VuZFBhY2tldHMoKE5ESVNfSEFORExFKXBBZCwgKFBQTkRJU19QQUNLRVQpICZwUGFja2V0LCAxKTsKKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXN0YXR1cyA9IDA7Citkb25lOgorCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFNlbmQgYSBwYWNrZXQgdG8gV0xBTi4KKworQXJndW1lbnRzOgorICAgIHNrYl9wICAgICAgICAgICBwb2ludHMgdG8gb3VyIGFkYXB0ZXIKKyAgICBkZXZfcCAgICAgICAgICAgd2hpY2ggV0xBTiBuZXR3b3JrIGludGVyZmFjZQorCitSZXR1cm4gVmFsdWU6CisgICAgMDogdHJhbnNtaXQgc3VjY2Vzc2Z1bGx5CisgICAgb3RoZXJ3aXNlOiB0cmFuc21pdCBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cygKKwlJTiBzdHJ1Y3Qgc2tfYnVmZiAJCSpza2JfcCwKKwlJTiBzdHJ1Y3QgbmV0X2RldmljZSAJKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKCEobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIChQTkRJU19QQUNLRVQpc2tiX3AsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZza2JfcC0+Y2JbQ0JfT0ZGXSwgMTUpOworCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChza2JfcCwgTUFJTl9NQlNTSUQpOworCisJcmV0dXJuIHJ0Mjh4eF9wYWNrZXRfeG1pdChza2JfcCk7Cit9IC8qIEVuZCBvZiBNQlNTX1ZpcnR1YWxJRl9QYWNrZXRTZW5kICovCisKKworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMgkvLyBSZWQgSGF0IDcuMQorLy9zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldihpbnQgc2l6ZW9mX3ByaXYsIGNvbnN0IGNoYXIgKm1hc2ssIHZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpIC8vc2FtcGxlCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKyAgICBJTlQJCQkJCWFsbG9jX3NpemU7CisKKworICAgIC8qIGVuc3VyZSAzMi1ieXRlIGFsaWdubWVudCBvZiB0aGUgcHJpdmF0ZSBhcmVhICovCisgICAgYWxsb2Nfc2l6ZSA9IHNpemVvZiAoKmRldikgKyBzaXplb2ZfcHJpdiArIDMxOworCisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKGRldiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJKCJhbGxvY19uZXRkZXY6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LlxuIikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoZGV2LCAwLCBhbGxvY19zaXplKTsKKworICAgIGlmIChzaXplb2ZfcHJpdikKKyAgICAgICAgZGV2LT5wcml2ID0gKHZvaWQgKikgKCgobG9uZykoZGV2ICsgMSkgKyAzMSkgJiB+MzEpOworCisgICAgc2V0dXAoZGV2KTsKKyAgICBzdHJjcHkoZGV2LT5uYW1lLCBtYXNrKTsKKworICAgIHJldHVybiBkZXY7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKwordm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlwQWQtPmJCcm9hZENvbUhUID0gVFJVRTsKK30gLyogRW5kIG9mIENmZ0luaXRIb29rICovCisKKworI2lmIDAJLy8gTm90IHVzZWQgbm93LCBzaG91bGQga2VlcCBpdCBpbiBvdXIgc291cmNlIHRyZWU/PworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBGaW5kIGFuZCBhc3NpZ24gYSBmcmVlIGludGVyZmFjZSBuYW1lIChyYXh4KS4KKworQXJndW1lbnRzOgorICAgICpuYW1lX3AJCQkJdGhlIGludGVyZmFjZSBuYW1lIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCVRSVUUJCQkJT0sKKwlGQUxTRQkJCQlGQUlMCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgQk9PTEVBTiBSVDI4WFhBdmFpbFJBTmFtZUFzc2lnbigKKwlJTiBDSEFSCQkJKm5hbWVfcCkKK3sKKyAgICBDSEFSCQkJCXNsb3RfbmFtZVtJRk5BTVNJWl07CisgICAgc3RydWN0IG5ldF9kZXZpY2UJKmRldmljZTsKKwlVSU5UMzIJCQkJaWZfaWQ7CisKKworICAgIGZvcihpZl9pZD0wOyBpZl9pZDw4OyBpZl9pZCsrKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaWZfaWQpOworCisgICAgICAgIGZvcihkZXZpY2U9ZGV2X2Jhc2U7IGRldmljZSE9TlVMTDsgZGV2aWNlPWRldmljZS0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoZGV2aWNlLT5uYW1lLCBzbG90X25hbWUsIDQpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKyAgICB9CisKKyAgICBpZiAoaWZfaWQgPT0gOCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5vIGF2YWlsYWJsZSBzbG90IG5hbWVcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHNwcmludGYobmFtZV9wLCAicmElZCIsIGlmX2lkKTsKKwlyZXR1cm4gVFJVRTsKK30gLyogRW5kIG9mIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduICovCisjZW5kaWYKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLS0tPlxuIikpOworCisJcEFkLT5pd19zdGF0cy5zdGF0dXMgPSAwOyAvLyBTdGF0dXMgLSBkZXZpY2UgZGVwZW5kZW50IGZvciBub3cKKworCS8vIGxpbmsgcXVhbGl0eQorCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gKChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgKiAxMikvMTAgKyAxMCk7CisJaWYocEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPiAxMDApCisJCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gMTAwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgPSBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdOyAvLyBub2lzZSBsZXZlbCAoZEJtKQorCisJcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlICs9IDI1NiAtIDE0MzsKKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCA9IDE7ICAgICAvLyBGbGFncyB0byBrbm93IGlmIHVwZGF0ZWQKKyNpZmRlZiBJV19RVUFMX0RCTQorCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfREJNOwkvLyBMZXZlbCArIE5vaXNlIGFyZSBkQm0KKyNlbmRpZiAvLyBJV19RVUFMX0RCTSAvLworCisJcEFkLT5pd19zdGF0cy5kaXNjYXJkLm53aWQgPSAwOyAgICAgLy8gUnggOiBXcm9uZyBud2lkL2Vzc2lkCisJcEFkLT5pd19zdGF0cy5taXNzLmJlYWNvbiA9IDA7ICAgICAgLy8gTWlzc2VkIGJlYWNvbnMvc3VwZXJmcmFtZQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzXG4iKSk7CisJcmV0dXJuICZwQWQtPml3X3N0YXRzOworfSAvKiBFbmQgb2YgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAqLworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCAvLworCisKKwordm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworI2RlZmluZSBNQVhfVFhfSU5fVEJUVAkJKDE2KQorCit9CisKK0lOVCBydDI4eHhfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIJKnBBZCA9IE5VTEw7CisJSU5UCQkJCXJldCA9IDA7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXJldCA9IHJ0Mjh4eF9zdGFfaW9jdGwobmV0X2RldiwgcnEsIGNtZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIHJldHVybiBldGhlcm5ldCBzdGF0aXN0aWNzIGNvdW50ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgbmV0X2RldiAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gbmV0X2RldmljZQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBuZXRfZGV2aWNlX3N0YXRzKgorCisgICAgTm90ZToKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKAorICAgIElOICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IE5VTEw7CisKKwlpZiAobmV0X2RldikKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQpCisJeworCisJCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKwkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCisJCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKworCQlwQWQtPnN0YXRzLnJ4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzOworCQlwQWQtPnN0YXRzLnR4X2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlR4RXJyb3JzOworCisJCXBBZC0+c3RhdHMucnhfZHJvcHBlZCA9IDA7CisJCXBBZC0+c3RhdHMudHhfZHJvcHBlZCA9IDA7CisKKwkgICAgcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7ICAgLy8gbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQKKwkgICAgcEFkLT5zdGF0cy5jb2xsaXNpb25zID0gcEFkLT5Db3VudGVyczgwMjMuT25lQ29sbGlzaW9uICsgcEFkLT5Db3VudGVyczgwMjMuTW9yZUNvbGxpc2lvbnM7ICAvLyBDb2xsaXNpb24gcGFja2V0cworCisJICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKKwkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCisJICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCisJICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCisJICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0CisKKwkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCisJICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7CisKKwkgICAgLy8gZm9yIGNzbGlwIGV0YworCSAgICBwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOworCisJCXJldHVybiAmcEFkLT5zdGF0czsKKwl9CisJZWxzZQorICAgIAlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ3NGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMKQEAgLTAsMCArMSwyMDIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyB2b2lkIEhUUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAorCUlOCUNIQVIJCSAgKnBJbnB1dCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNkZWZpbmUgRVRIX01BQ19BRERSX1NUUl9MRU4gMTcgIC8vIGluIGZvcm1hdCBvZiB4eDp4eDp4eDp4eDp4eDp4eAorCisvLyBXZSBhc3N1bWUgdGhlIHMxIGlzIGEgc3RpbmcsIHMyIGlzIGEgbWVtb3J5IHNwYWNlIHdpdGggNiBieXRlcy4gYW5kIGNvbnRlbnQgb2YgczEgd2lsbCBiZSBjaGFuZ2VkLgorQk9PTEVBTiBydHN0cm1hY3RvaGV4KGNoYXIgKnMxLCBjaGFyICpzMikKK3sKKwlpbnQgaSA9IDA7CisJY2hhciAqcHRva1MgPSBzMSwgKnB0b2tFID0gczE7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBFVEhfTUFDX0FERFJfU1RSX0xFTikKKwkJcmV0dXJuIEZBTFNFOworCisJd2hpbGUoKCpwdG9rUykgIT0gJ1wwJykKKwl7CisJCWlmKChwdG9rRSA9IHN0cmNocihwdG9rUywgJzonKSkgIT0gTlVMTCkKKwkJCSpwdG9rRSsrID0gJ1wwJzsKKwkJaWYgKChzdHJsZW4ocHRva1MpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnB0b2tTKSkgfHwgKCFpc3hkaWdpdCgqKHB0b2tTKzEpKSkpCisJCQlicmVhazsgLy8gZmFpbAorCQlBdG9IKHB0b2tTLCAmczJbaSsrXSwgMSk7CisJCXB0b2tTID0gcHRva0U7CisJCWlmIChpID09IDYpCisJCQlicmVhazsgLy8gcGFyc2luZyBmaW5pc2hlZAorCX0KKworCXJldHVybiAoIGkgPT0gNiA/IFRSVUUgOiBGQUxTRSk7CisKK30KKworCisvLyB3ZSBhc3N1bWUgdGhlIHMxIGFuZCBzMiBib3RoIGFyZSBzdHJpbmdzLgorQk9PTEVBTiBydHN0cmNhc2VjbXAoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWNoYXIgKnAxID0gczEsICpwMiA9IHMyOworCisJaWYgKHN0cmxlbihzMSkgIT0gc3RybGVuKHMyKSkKKwkJcmV0dXJuIEZBTFNFOworCisJd2hpbGUoKnAxICE9ICdcMCcpCisJeworCQlpZigoKnAxICE9ICpwMikgJiYgKCgqcDEgXiAqcDIpICE9IDB4MjApKQorCQkJcmV0dXJuIEZBTFNFOworCQlwMSsrOworCQlwMisrOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvLyB3ZSBhc3N1bWUgdGhlIHMxIChidWZmZXIpIGFuZCBzMiAoa2V5KSBib3RoIGFyZSBzdHJpbmdzLgorY2hhciAqIHJ0c3Ryc3RydW5jYXNlY21wKGNoYXIgKiBzMSwgY2hhciAqIHMyKQoreworCUlOVCBsMSwgbDIsIGk7CisJY2hhciB0ZW1wMSwgdGVtcDI7CisKKwlsMiA9IHN0cmxlbihzMik7CisJaWYgKCFsMikKKwkJcmV0dXJuIChjaGFyICopIHMxOworCisJbDEgPSBzdHJsZW4oczEpOworCisJd2hpbGUgKGwxID49IGwyKQorCXsKKwkJbDEtLTsKKworCQlmb3IoaT0wOyBpPGwyOyBpKyspCisJCXsKKwkJCXRlbXAxID0gKihzMStpKTsKKwkJCXRlbXAyID0gKihzMitpKTsKKworCQkJaWYgKCgnYScgPD0gdGVtcDEpICYmICh0ZW1wMSA8PSAneicpKQorCQkJCXRlbXAxID0gJ0EnKyh0ZW1wMS0nYScpOworCQkJaWYgKCgnYScgPD0gdGVtcDIpICYmICh0ZW1wMiA8PSAneicpKQorCQkJCXRlbXAyID0gJ0EnKyh0ZW1wMi0nYScpOworCisJCQlpZiAodGVtcDEgIT0gdGVtcDIpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBsMikKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKworCQlzMSsrOworCX0KKworCXJldHVybiBOVUxMOyAvLyBub3QgZm91bmQKK30KKworLy9hZGQgYnkga2F0aHkKKworIC8qKgorICAqIHN0cnN0ciAtIEZpbmQgdGhlIGZpcnN0IHN1YnN0cmluZyBpbiBhICVOVUwgdGVybWluYXRlZCBzdHJpbmcKKyAgKiBAczE6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICAqLworY2hhciAqIHJ0c3Ryc3RyKGNvbnN0IGNoYXIgKiBzMSxjb25zdCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCQlpZiAoIW1lbWNtcChzMSxzMixsMikpCisJCQlyZXR1cm4gKGNoYXIgKikgczE7CisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcnN0cnRvayAtIFNwbGl0IGEgc3RyaW5nIGludG8gdG9rZW5zCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGN0OiBUaGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCisgKiAqIFdBUk5JTkc6IHN0cnRvayBpcyBkZXByZWNhdGVkLCB1c2Ugc3Ryc2VwIGluc3RlYWQuIEhvd2V2ZXIgc3Ryc2VwIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb2xkIGFyY2hpdGVjdHVyZS4KKyAqLworY2hhciAqIF9fcnN0cnRvazsKK2NoYXIgKiByc3RydG9rKGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwljaGFyICpzYmVnaW4sICpzZW5kOworCisJc2JlZ2luICA9IHMgPyBzIDogX19yc3RydG9rOworCWlmICghc2JlZ2luKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2JlZ2luICs9IHN0cnNwbihzYmVnaW4sY3QpOworCWlmICgqc2JlZ2luID09ICdcMCcpCisJeworCQlfX3JzdHJ0b2sgPSBOVUxMOworCQlyZXR1cm4oIE5VTEwgKTsKKwl9CisKKwlzZW5kID0gc3RycGJyayggc2JlZ2luLCBjdCk7CisJaWYgKHNlbmQgJiYgKnNlbmQgIT0gJ1wwJykKKwkJKnNlbmQrKyA9ICdcMCc7CisKKwlfX3JzdHJ0b2sgPSBzZW5kOworCisJcmV0dXJuIChzYmVnaW4pOworfQorCisvKioKKyAqIGRlbGltaXRjbnQgLSByZXR1cm4gdGhlIGNvdW50IG9mIGEgZ2l2ZW4gZGVsaW1pdGVyIGluIGEgZ2l2ZW4gc3RyaW5nLgorICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQuCisgKiBAY3Q6IFRoZSBkZWxpbWl0ZXIgdG8gc2VhcmNoIGZvci4KKyAqIE5vdGljZSA6IFdlIHN1cHBvc2UgdGhlIGRlbGltaXRlciBpcyBhIHNpbmdsZS1jaGFyIHN0cmluZyhmb3IgZXhhbXBsZSA6ICI7IikuCisgKi8KK0lOVCBkZWxpbWl0Y250KGNoYXIgKiBzLGNvbnN0IGNoYXIgKiBjdCkKK3sKKwlJTlQgY291bnQgPSAwOworCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKwljb25zdCBjaGFyICp0b2tlbiA9IHM7CisKKwlmb3IgKCA7OyApCisJeworCQl0b2tlbiA9IHN0cnBicmsodG9rZW4sIGN0KTsgLyogc2VhcmNoIGZvciBkZWxpbWl0ZXJzICovCisKKyAgICAgICAgaWYgKCB0b2tlbiA9PSBOVUxMICkKKwkJeworCQkJLyogYWR2YW5jZWQgdG8gdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyICovCisJCQlicmVhazsKKwkJfQorCQkvKiBza2lwIHRoZSBkZWxpbWl0ZXIgKi8KKwkgICAgKyt0b2tlbjsKKworCQkvKgorCQkgKiBQcmludCB0aGUgZm91bmQgdGV4dDogdXNlIGxlbiB3aXRoICUuKnMgdG8gc3BlY2lmeSBmaWVsZCB3aWR0aC4KKwkJICovCisKKwkJLyogYWNjdW11bGF0ZSBkZWxpbWl0ZXIgY291bnQgKi8KKwkgICAgKytjb3VudDsKKwl9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKgorICAqIGNvbnZlcnRzIHRoZSBJbnRlcm5ldCBob3N0IGFkZHJlc3MgZnJvbSB0aGUgc3RhbmRhcmQgbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbgorICAqIGludG8gYmluYXJ5IGRhdGEuCisgICogcmV0dXJucyBub256ZXJvIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkLCB6ZXJvIGlmIG5vdC4KKyAgKi8KK2ludCBydGluZXRfYXRvbihjb25zdCBjaGFyICpjcCwgdW5zaWduZWQgaW50ICphZGRyKQoreworCXVuc2lnbmVkIGludCAJdmFsOworCWludCAgICAgICAgIAliYXNlLCBuOworCWNoYXIgICAgICAgIAljOworCXVuc2lnbmVkIGludCAgICBwYXJ0c1s0XTsKKwl1bnNpZ25lZCBpbnQgICAgKnBwID0gcGFydHM7CisKKwlmb3IgKDs7KQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KKyAgICAgICAgICAqIFZhbHVlcyBhcmUgc3BlY2lmaWVkIGFzIGZvciBDOgorICAgICAgICAgICoJMHg9aGV4LCAwPW9jdGFsLCBvdGhlcj1kZWNpbWFsLgorICAgICAgICAgICovCisgICAgICAgICB2YWwgPSAwOworICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgaWYgKCpjcCA9PSAnMCcpCisgICAgICAgICB7CisgICAgICAgICAgICAgaWYgKCorK2NwID09ICd4JyB8fCAqY3AgPT0gJ1gnKQorICAgICAgICAgICAgICAgICBiYXNlID0gMTYsIGNwKys7CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgIH0KKyAgICAgICAgIHdoaWxlICgoYyA9ICpjcCkgIT0gJ1wwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICB2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAoYmFzZSA9PSAxNiAmJiBpc3hkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgIChjICsgMTAgLSAoaXNsb3dlcigodW5zaWduZWQgY2hhcikgYykgPyAnYScgOiAnQScpKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgaWYgKCpjcCA9PSAnLicpCisgICAgICAgICB7CisgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgKiBJbnRlcm5ldCBmb3JtYXQ6IGEuYi5jLmQgYS5iLmMgICAod2l0aCBjIHRyZWF0ZWQgYXMgMTYtYml0cykKKyAgICAgICAgICAgICAgKiBhLmIgICAgICh3aXRoIGIgdHJlYXRlZCBhcyAyNCBiaXRzKQorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIGlmIChwcCA+PSBwYXJ0cyArIDMgfHwgdmFsID4gMHhmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgKnBwKysgPSB2YWwsIGNwKys7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAvKgorICAgICAgKiBDaGVjayBmb3IgdHJhaWxpbmcganVuay4KKyAgICAgICovCisgICAgIHdoaWxlICgqY3ApCisgICAgICAgICBpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpjcCsrKSkKKyAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAvKgorICAgICAgKiBDb25jb2N0IHRoZSBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHBhcnRzIHNwZWNpZmllZC4KKyAgICAgICovCisgICAgIG4gPSBwcCAtIHBhcnRzICsgMTsKKyAgICAgc3dpdGNoIChuKQorICAgICB7CisKKyAgICAgICAgIGNhc2UgMTogICAgICAgICAvKiBhIC0tIDMyIGJpdHMgKi8KKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAyOiAgICAgICAgIC8qIGEuYiAtLSA4LjI0IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmZmYpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgIHZhbCB8PSBwYXJ0c1swXSA8PCAyNDsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSAzOiAgICAgICAgIC8qIGEuYi5jIC0tIDguOC4xNiBiaXRzICovCisgICAgICAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpOworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDQ6ICAgICAgICAgLyogYS5iLmMuZCAtLSA4LjguOC44IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpIHwgKHBhcnRzWzJdIDw8IDgpOworICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgKmFkZHIgPSBodG9ubCh2YWwpOworICAgICByZXR1cm4gMTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgRmluZCBrZXkgc2VjdGlvbiBmb3IgR2V0IGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5IHNlY3Rpb24KKyAgICAgICAgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHNlY2lvbiB0byBiZSBmaW5kCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisgICAgICAgIE90aGVycyAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFVDSEFSICBSVE1QRmluZFNlY3Rpb24oCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIENIQVIgdGVtcF9idWZbMzJdOworICAgIFBVQ0hBUiAgcHRyOworCisgICAgc3RyY3B5KHRlbXBfYnVmLCAiRGVmYXVsdCIpOworCisgICAgaWYoKHB0ciA9IHJ0c3Ryc3RyKGJ1ZmZlciwgdGVtcF9idWYpKSAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwdHIrc3RybGVuKCJcbiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRLZXlQYXJhbWV0ZXIoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgSU4gIElOVCAgICAgZGVzdHNpemUsCisgICAgSU4gIFBDSEFSICAgYnVmZmVyKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJLy90ZW1wX2J1ZjEgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYxLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCisJaWYodGVtcF9idWYxID09IE5VTEwpCisgICAgICAgIHJldHVybiAoRkFMU0UpOworCisJLy90ZW1wX2J1ZjIgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKyAgICBpZigob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisgICAgeworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZiggKCpwdHIgPT0gJyAnKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAga2V5ICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8ga2V5IHN0cmluZworICAgICAgICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbgorICAgICAgICBkZXN0c2l6ZSAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcworICAgICAgICBGQUxTRSAgICAgICAgICAgICAgICAgICAgICAgRmFpbAorCisgICAgTm90ZToKKyAgICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpLgorICAgICAgICBJdCBpcyBjYWxsZWQgZm9yIHBhcnNpbmcgU1NJRCBhbmQgYW55IGtleSBzdHJpbmcuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisKKyAgICAvL3RyaW0gdGFiCisgICAgLyogV2UgY2Fubm90IHRyaW0gc3BhY2UoJyAnKSBmb3IgU1NJRCBhbmQga2V5IHN0cmluZy4gKi8KKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICAvL2lmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgaWYoICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBtdWx0aXBsZSBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcldpdGhPZmZzZXQoCisgICAgSU4gIFBDSEFSICAga2V5LAorICAgIE9VVCBQQ0hBUiAgIGRlc3QsCisgICAgT1VUCVVTSE9SVAkqZW5kX29mZnNldCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIsCisgICAgSU4JQk9PTEVBTgliVHJpbVNwYWNlKQoreworICAgIFVDSEFSICp0ZW1wX2J1ZjEgPSBOVUxMOworICAgIFVDSEFSICp0ZW1wX2J1ZjIgPSBOVUxMOworICAgIENIQVIgKnN0YXJ0X3B0cjsKKyAgICBDSEFSICplbmRfcHRyOworICAgIENIQVIgKnB0cjsKKyAgICBDSEFSICpvZmZzZXQgPSAwOworICAgIElOVCAgbGVuOworCisJaWYgKCplbmRfb2Zmc2V0ID49IE1BWF9JTklfQlVGRkVSX1NJWkUpCisJCXJldHVybiAoRkFMU0UpOworCisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisJaWYoKmVuZF9vZmZzZXQgPT0gMCkKKyAgICB7CisJCWlmICgob2Zmc2V0ID0gUlRNUEZpbmRTZWN0aW9uKGJ1ZmZlcikpID09IE5VTEwpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisJICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIAkgICAgcmV0dXJuIChGQUxTRSk7CisJCX0KKyAgICB9CisJZWxzZQorCQlvZmZzZXQgPSBidWZmZXIgKyAoKmVuZF9vZmZzZXQpOworCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKwkqZW5kX29mZnNldCA9IGVuZF9wdHIgLSBidWZmZXI7CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKyAgICAvL3RyaW0gc3BhY2Ugb3IgdGFiCisgICAgd2hpbGUoKnB0ciAhPSAweDAwKQorICAgIHsKKyAgICAgICAgaWYoKGJUcmltU3BhY2UgJiYgKCpwdHIgPT0gJyAnKSkgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBpbnQgcnRtcF9wYXJzZV9rZXlfYnVmZmVyX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsSU4gIGNoYXIgKmJ1ZmZlcixJTiAgVUxPTkcgS2V5VHlwZSxJTiAgSU5UIEJTU0lkeCxJTiAgSU5UIEtleUlkeCkKK3sKKwlQVUNIQVIJCWtleWJ1ZmY7CisJSU5UCQkJaSA9IEJTU0lkeCwgaWR4ID0gS2V5SWR4OworCVVMT05HCQlLZXlMZW47CisJVUNIQVIJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKworCWtleWJ1ZmYgPSBidWZmZXI7CisJS2V5TGVuID0gc3RybGVuKGtleWJ1ZmYpOworCisJaWYgKEtleVR5cGUgPT0gMSkKKwl7Ly9Bc2NpaQorCQlpZiggKEtleUxlbiA9PSA1KSB8fCAoS2V5TGVuID09IDEzKSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwga2V5YnVmZiwgS2V5TGVuKTsKKwkJCWlmIChLZXlMZW4gPT0gNSkKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0YocmElZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UKKwkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwl7Ly9IZXggdHlwZQorCQlpZiggKEtleUxlbiA9PSAxMCkgfHwgKEtleUxlbiA9PSAyNikpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5TGVuID0gS2V5TGVuIC8gMjsKKwkJCUF0b0goa2V5YnVmZiwgcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXksIEtleUxlbiAvIDIpOworCQkJaWYgKEtleUxlbiA9PSAxMCkKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlCisJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCXBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJL0YocmElZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UKKwkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJL0YocmElZCkgS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpLCBpZHgrMSwgS2V5TGVuKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCit7CisJY2hhcgkJdG9rX3N0clsxNl07CisJUFVDSEFSCQltYWNwdHI7CisJSU5UCQkJaSA9IDAsIGlkeDsKKwlVTE9ORwkJS2V5VHlwZVtNQVhfTUJTU0lEX05VTV07CisJVUxPTkcJCUtleUlkeDsKKworCU5kaXNaZXJvTWVtb3J5KEtleVR5cGUsIE1BWF9NQlNTSURfTlVNKTsKKworCS8vRGVmYXVsdEtleUlECisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGVmYXVsdEtleUlEIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJS2V5SWR4ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCWlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSk7CisJCQllbHNlCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlEKDB+Myk9JWRcbiIsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQorCXsKKwkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRUeXBlIiwgaWR4ICsgMSk7CisJCS8vS2V5MVR5cGUKKwkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCXsKKwkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJICAgIHsKKwkJCSAgICBLZXlUeXBlW2ldID0gc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKwkJICAgIH0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKwkJCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFN0ciIsIGlkeCArIDEpOworCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJeworCQkJCQlydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBLZXlUeXBlW0JTUzBdLCBCU1MwLCBpZHgpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCX0KK30KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitzdGF0aWMgdm9pZCBydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwlQVUNIQVIJCQkJCW1hY3B0cjsKKwlJTlQJCQkJCQlpPTA7CisJQk9PTEVBTgkJCQkJYldtbUVuYWJsZSA9IEZBTFNFOworCisJLy9XbW1DYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV21tQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApIC8vRW5hYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwkJCWJXbW1FbmFibGUgPSBUUlVFOworCQl9CisJCWVsc2UgLy9EaXNhYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXbW1DYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCX0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vRExTQ2FwYWJsZQorCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRMU0NhcGFibGUiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBUUlVFOworCQl9CisJCWVsc2UgLy9EaXNhYmxlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlID0gRkFMU0U7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiRExTQ2FwYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvL0Fja1BvbGljeSBmb3IgQUNfQkssIEFDX0JFLCBBQ19WSSwgQUNfVk8KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBY2tQb2xpY3kiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCXsKKwkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWNrUG9saWN5WyVkXT0lZFxuIiwgaSwgcEFkLT5Db21tb25DZmcuQWNrUG9saWN5W2ldKSk7CisJCX0KKwl9CisKKwlpZiAoYldtbUVuYWJsZSkKKwl7CisJCS8vQVBTRENhcGFibGUKKwkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTRENhcGFibGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQl7CisJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IFRSVUU7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUpKTsKKwkJfQorCisJCS8vQVBTREFDIGZvciBBQ19CRSwgQUNfQkssIEFDX1ZJLCBBQ19WTworCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQUMiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQl7CisJCQlCT09MRUFOIGFwc2RfYWNbNF07CisKKwkJCWZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKKwkJCXsKKwkJCQlhcHNkX2FjW2ldID0gKEJPT0xFQU4pc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFQU0RBQyVkICAlZFxuIiwgaSwgIGFwc2RfYWNbaV0pKTsKKwkJCX0KKworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9IGFwc2RfYWNbMF07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gYXBzZF9hY1sxXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSBhcHNkX2FjWzJdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9IGFwc2RfYWNbM107CisJCX0KKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkKQoreworCVBVQ0hBUgkJCQkJc3JjID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZQkJCQkqc3JjZjsKKwlJTlQgCQkJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3QJCQlvcmdmczsKKwlDSEFSCQkJCQkqYnVmZmVyOworCUNIQVIJCQkJCSp0bXBidWY7CisJVUxPTkcJCQkJCVJ0c1RocmVzaDsKKwlVTE9ORwkJCQkJRnJhZ1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUgkgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlQVUNIQVIJCQkJCW1hY3B0cjsKKwlJTlQJCQkJCQlpID0gMDsKKworCWJ1ZmZlciA9IGttYWxsb2MoTUFYX0lOSV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlzcmMgPSBTVEFfUFJPRklMRV9QQVRIOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCXNyYyA9IHBBZC0+TUNfRmlsZU5hbWU7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwkvLyBTYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgorCS8vIFNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQorCW9yZ2ZzdWlkID0gY3VycmVudF9mc3VpZCgpOworCW9yZ2ZzZ2lkID0gY3VycmVudF9mc2dpZCgpOworCS8qIEhtLCBjYW4ndCByZWFsbHkgZG8gdGhpcyBuaWNlbHkgYW55bW9yZSwgc28gcmVseSBvbiB0aGVzZSBmaWxlcworCSAqIGJlaW5nIHNldCB0byB0aGUgcHJvcGVyIHBlcm1pc3Npb24gdG8gcmVhZCB0aGVtLi4uICovCisJLyogY3VycmVudC0+Y3JlZC0+ZnN1aWQgPSBjdXJyZW50LT5jcmVkLT5mc2dpZCA9IDA7ICovCisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCWlmIChzcmMgJiYgKnNyYykKKwl7CisJCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7CisJCWlmIChJU19FUlIoc3JjZikpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgLVBUUl9FUlIoc3JjZiksc3JjKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCisJCQlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT5yZWFkKQorCQkJeworCQkJCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOworCQkJCXJldHZhbD1zcmNmLT5mX29wLT5yZWFkKHNyY2YsIGJ1ZmZlciwgTUFYX0lOSV9CVUZGRVJfU0laRSwgJnNyY2YtPmZfcG9zKTsKKwkJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBzcmMsIC1yZXR2YWwpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gc2V0IGZpbGUgcGFyYW1ldGVyIHRvIHBvcnRjZmcKKwkJCQkJLy9Db3VudHJ5UmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb24iLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbj0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeVJlZ2lvbkFCYW5kCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb25BQmFuZCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZD0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbkFCYW5kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCQkJfQorCQkJCQkvL0NvdW50cnlDb2RlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlDb2RlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIHRtcGJ1ZiAsIDIpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuU3RhT3JpQ291bnRyeUNvZGUsIHRtcGJ1ZiAsIDIpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJCWlmIChzdHJsZW4ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpICE9IDApCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gVFJVRTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlDb2RlPSVzXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkpOworCQkJCQl9CisJCQkJCS8vQ2hhbm5lbEdlb2dyYXBoeQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsR2VvZ3JhcGh5IiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJVUNIQVIgR2VvZ3JhcGh5ID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYgKEdlb2dyYXBoeSA8PSBCT1RIKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEdlb2dyYXBoeTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9CisJCQkJCQkJCShwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gQk9USCkgPyAnICcgOiAoKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBJRE9SKSA/ICdJJyA6ICdPJyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHkgPSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxHZW9ncmFwaHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0gJyAnOworCQkJCQl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL1NTSUQKKwkJCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIlNTSUQiLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPD0gMzIpCisJCQkJCQkJeworCQkJIAkJCQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IChVQ0hBUikgc3RybGVuKHRtcGJ1Zik7CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwkJCQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL05ldHdvcmtUeXBlCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiTmV0d29ya1R5cGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCQkJCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQWRob2MiKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworCQkJCQkJCWVsc2UgLy9EZWZhdWx0IEluZnJhc3RydWN0dXJlIG1vZGUKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisvLyNpZmRlZiBXSUZJX1RFU1QKKy8vCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKy8vI2Vsc2UKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworLy8jZW5kaWYKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCX0KKwkJCQkJLy9FbmNyeXBUeXBlCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkVuY3J5cFR5cGUiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAidGtpcCIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJhZXMiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCQkJCQkJCS8vIFVwZGF0ZSBhbGwgd2Vwc3RhdHVzIHJlbGF0ZWQKKwkJCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyCQk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyAJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciAJCT0gRkFMU0U7CisKKwkJCQkJCQkvL1JUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCWlmKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiV1BBUFNLIiwgdG1wYnVmLCA1MTIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaW50ICAgICBlcnI9MDsKKworCQkJCQkJCXRtcGJ1ZltzdHJsZW4odG1wYnVmKV0gPSAnXDAnOyAvLyBtYWtlIFNUQSBjYW4gcHJvY2VzcyAuJF4mIGZvciBXUEFQU0sgaW5wdXQKKworCQkJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQkJCQkJCSkKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKChzdHJsZW4odG1wYnVmKSA+PSA4KSAmJiAoc3RybGVuKHRtcGJ1ZikgPCA2NCkpCisJCQkJCQkJeworCQkJCQkJCQlQYXNzd29yZEhhc2goKGNoYXIgKil0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHN0cmxlbih0bXBidWYpID09IDY0KQorCQkJCQkJCXsKKwkJCQkJCQkJQXRvSCh0bXBidWYsIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZXJyID0gMTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6OihXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEpXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJLyoKKwkJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCQkJCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkqLworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCQkJLy9EZWZhdWx0S2V5SUQsIEtleVR5cGUsIEtleVN0cgorCQkJCQlydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKworCisJCQkJCS8vSFNDb3VudGVyCisJCQkJCS8qaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFNDb3VudGVyIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9FbmFibGUKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZUhTQ291bnRlciA9IFRSVUU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9EaXNhYmxlCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZUhTQ291bnRlciA9IEZBTFNFOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAiSFNDb3VudGVyPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyKTsKKwkJCQkJfSovCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJSFRQYXJhbWV0ZXJzSG9vayhwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCQkJCQkJLy9DYXJyaWVyRGV0ZWN0CisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDYXJyaWVyRGV0ZWN0IiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjAiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKwkJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICIxIiwgMSkgPT0gMCkpCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL1BTTW9kZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBTTW9kZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiTUFYX1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibWF4X3BzcCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbShwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJGYXN0X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiZmFzdF9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJGQVNUX1BTUCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImxlZ2FjeV9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKwkJCQkJCQkJCS8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKwkJCQkJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCX0KKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNb2RlPSVsZFxuIiwgcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIEZhc3RSb2FtaW5nCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRmFzdFJvYW1pbmciLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gVFJVRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZhc3RSb2FtaW5nPSVkXG4iLCBwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcpKTsKKwkJCQkJCX0KKwkJCQkJCS8vIFJvYW1UaHJlc2hvbGQKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJSb2FtVGhyZXNob2xkIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKworCQkJCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOworCQkJCQkJfQorCisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRHbldpZmlUZXN0PSVkXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgc3JjKSk7CisJCQl9CisKKwkJCXJldHZhbD1maWxwX2Nsb3NlKHNyY2YsTlVMTCk7CisKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfQorCQl9CisJfQorCisJc2V0X2ZzKG9yZ2ZzKTsKKyNpZiAwCisJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworI2VuZGlmCisKKwlrZnJlZShidWZmZXIpOworCWtmcmVlKHRtcGJ1Zik7CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgdm9pZAlIVFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCSAgKnBWYWx1ZVN0ciwKKwlJTglDSEFSCQkgICpwSW5wdXQpCit7CisKKwlJTlQgVmFsdWU7CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUFJPVEVDVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUHJvdGVjdGlvbiAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU0VuYWJsZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTRW5hYmxlICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID4gTU1QU19FTkFCTEUpCisgICAgICAgIHsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9UT0RPOiBhZGQgbWltbyBwb3dlciBzYXZpbmcgbWVjaGFuaXNtCisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwkJCS8vcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QUyBNb2RlICA9ICVkXG4iLCBWYWx1ZSkpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQURlY2xpbmUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIERlY2xpbmUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FibGVSZW9yZGVyaW5nIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRGlzYWJsZVJlb3JkZXJpbmcgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BdXRvQkEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBBdXRvIEJBICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKwkvLyBUeF8rSFRDIGZyYW1lCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0hUQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4ICtIVEMgZnJhbWUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisJfQorCisJLy8gRW5hYmxlIEhUIExpbmsgQWRhcHRhdGlvbiBDb250cm9sCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0xpbmtBZGFwdCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IExpbmsgQWRhcHRhdGlvbiBDb250cm9sID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOworCX0KKworCS8vIFJldmVyc2UgRGlyZWN0aW9uIE1lY2hhbmlzbQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SREciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJERyA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKKwl9CisKKworCisKKwkvLyBUeCBBLU1TVUQgPworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BTVNEVSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IEEtTVNEVSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKwl9CisKKwkvLyBNUERVIERlbnNpdHkKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTXBkdURlbnNpdHkiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkXG4iLCBWYWx1ZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZCAoRGVmYXVsdClcbiIsIDQpKTsKKwkJfQorCX0KKworCS8vIE1heCBSeCBCQSBXaW5kb3cgU2l6ZQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQVdpblNpemUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gJWRcbiIsIFZhbHVlKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9IDY0IChEZWZ1YWx0KVxuIikpOworCQl9CisKKwl9CisKKwkvLyBHdWFyZCBJbnRlcnZhbAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9HSSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEdJXzQwMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBHdWFyZCBJbnRlcnZhbCA9ICVzXG4iLCAoVmFsdWU9PUdJXzQwMCkgPyAiNDAwIiA6ICI4MDAiICkpOworCX0KKworCS8vIEhUIE9wZXJhdGlvbiBNb2RlIDogTWl4ZWQgTW9kZSAsIEdyZWVuIEZpZWxkCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX09wTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKKwkJeworCisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE9wZXJhdGUgTW9kZSA9ICVzXG4iLCAoVmFsdWU9PUhUTU9ERV9HRikgPyAiR3JlZW4gRmllbGQiIDogIk1peGVkIE1vZGUiICkpOworCX0KKworCS8vIEZpeGVkIFR4IG1vZGUgOiBDQ0ssIE9GRE0KKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRml4ZWRUeE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVUNIQVIJZml4X3R4X21vZGU7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKwkJCWlmIChzdHJjbXAocFZhbHVlU3RyLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgIm9mZG0iKSA9PSAwKQorCQkJeworCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07CisJCQl9CisJCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiY2NrIikgPT0gMCkKKwkJCXsKKwkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7CisJCQl9CisJCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiSFQiKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJodCIpID09IDApCisJCQl7CisJCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQkJCS8vIDEgOiBDQ0sKKwkJCQkvLyAyIDogT0ZETQorCQkJCS8vIG90aGVyd2lzZSA6IEhUCisJCQkJaWYgKFZhbHVlID09IEZJWEVEX1RYTU9ERV9DQ0sgfHwgVmFsdWUgPT0gRklYRURfVFhNT0RFX09GRE0pCisJCQkJCWZpeF90eF9tb2RlID0gVmFsdWU7CisJCQkJZWxzZQorCQkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKwkJfQorCisJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaXhlZCBUeCBNb2RlID0gJWRcbiIsIGZpeF90eF9tb2RlKSk7CisKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJLy8gQ2hhbm5lbCBXaWR0aAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CVyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IEJXXzQwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCX0KKworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwkJcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAoVmFsdWU9PUJXXzQwKSA/ICI0MCBNSHoiIDogIjIwIE1IeiIgKSk7CisJfQorCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0VYVENIQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEV4dCBDaGFubmVsID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiQkVMT1ciIDogIkFCT1ZFIiApKTsKKwl9CisKKwkvLyBNU0MKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUNTIiwgcFZhbHVlU3RyLCA1MCwgcElucHV0KSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisvLwkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAxNSkgfHwgKFZhbHVlID09IDMyKSkKKwkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAyMykgfHwgKFZhbHVlID09IDMyKSkgLy8gMyozCisJCXsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBWYWx1ZTsKKwkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSAlZFxuIiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBNQ1NfQVVUTzsKKwkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9IEFVVE9cbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBTVEJDCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1NUQkMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogU1RCQyA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOworCX0KKworCS8vIDQwX01oel9JbnRvbGVyYW50CisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUXzQwTUhaX0lOVE9MRVJBTlQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiA0ME1IWiBJTlRPTEVSQU5UID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCkpOworCX0KKwkvL0hUX1R4U3RyZWFtCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfVHhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQorCXsKKwkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQorCQl7CisJCQljYXNlIDE6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzogLy8gMyozCisJCQlkZWZhdWx0OgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMzsKKworCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQorCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiB0eCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCisJCQkJYnJlYWs7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSkpOworCX0KKwkvL0hUX1J4U3RyZWFtCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUnhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQpKQorCXsKKwkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQorCQl7CisJCQljYXNlIDE6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsgLy8gb25seSAyIHJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUnggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKSk7CisJfQorCit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNDc4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcC5oCkBAIC0wLDAgKzEsNzU4NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCisgICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisqLworI2lmbmRlZiBfX1JUTVBfSF9fCisjZGVmaW5lIF9fUlRNUF9IX18KKworI2luY2x1ZGUgImxpbmtfbGlzdC5oIgorI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpbmNsdWRlICJhaXJvbmV0LmgiCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vI2RlZmluZSBEQkcJCTEKKworLy8jZGVmaW5lIERCR19ESUFHTk9TRQkJMQorCisjaWYgZGVmaW5lZChDT05GSUdfQVBfU1VQUE9SVCkgJiYgZGVmaW5lZChDT05GSUdfU1RBX1NVUFBPUlQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyNlbHNlCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQorI2VuZGlmCisKKyNkZWZpbmUgVklSVFVBTF9JRl9JTkMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQrKykKKyNkZWZpbmUgVklSVFVBTF9JRl9ERUMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQtLSkKKyNkZWZpbmUgVklSVFVBTF9JRl9OVU0oX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQpCisKKyNpZmRlZiBSVDI4NzAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoZSBUWF9CVUZGRVIgc3RydWN0dXJlIGZvcm1zIHRoZSB0cmFuc21pdHRlZCBVU0IgcGFja2V0IHRvIHRoZSBkZXZpY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3R5cGVkZWYgc3RydWN0IF9fVFhfQlVGRkVSeworCXVuaW9uCXsKKwkJVUNIQVIJCQlXaXJlbGVzc1BhY2tldFtUWF9CVUZGRVJfTk9STVNJWkVdOworCQlIRUFERVJfODAyXzExCU51bGxGcmFtZTsKKwkJUFNQT0xMX0ZSQU1FCVBzUG9sbFBhY2tldDsKKwkJUlRTX0ZSQU1FCQlSVFNGcmFtZTsKKwl9ZmllbGQ7CisJVUNIQVIJCQlBZ2dyZWdhdGlvbls0XTsgIC8vQnVmZmVyIGZvciBzYXZlIEFnZ3JlZ2F0aW9uIHNpemUuCit9IFRYX0JVRkZFUiwgKlBUWF9CVUZGRVI7CisKK3R5cGVkZWYgc3RydWN0IF9fSFRUWF9CVUZGRVJ7CisJdW5pb24JeworCQlVQ0hBUgkJCVdpcmVsZXNzUGFja2V0W01BWF9UWEJVTEtfU0laRV07CisJCUhFQURFUl84MDJfMTEJTnVsbEZyYW1lOworCQlQU1BPTExfRlJBTUUJUHNQb2xsUGFja2V0OworCQlSVFNfRlJBTUUJCVJUU0ZyYW1lOworCX1maWVsZDsKKwlVQ0hBUgkJCUFnZ3JlZ2F0aW9uWzRdOyAgLy9CdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4KK30gSFRUWF9CVUZGRVIsICpQSFRUWF9CVUZGRVI7CisKKworLy8gdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMKK3R5cGVkZWYgc3RydWN0IF9UWF9DT05URVhUCit7CisJUFZPSUQJCQlwQWQ7CQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBVUkIJCQlwVXJiOwkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUElSUAkJCXBJcnA7CQkJLy91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LgorCQkJCQkJCQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQVFhfQlVGRkVSCQlUcmFuc2ZlckJ1ZmZlcjsJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlVTE9ORwkJCUJ1bGtPdXRTaXplOworCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKKwlVQ0hBUgkJCVNlbGZJZHg7CisJQk9PTEVBTgkJCUluVXNlOworCUJPT0xFQU4JCQliV2FpdGluZ0J1bGtPdXQ7IC8vIGF0IGxlYXN0IG9uZSBwYWNrZXQgaXMgaW4gdGhpcyBUeENvbnRleHQsIHJlYWR5IGZvciBtYWtpbmcgSVJQIGFueXRpbWUuCisJQk9PTEVBTgkJCWJGdWxsRm9yQnVsa091dDsgLy8gYWxsIHR4IGJ1ZmZlciBhcmUgZnVsbCAsIHNvIHdhaXRpbmcgZm9yIHR4IGJ1bGtvdXQuCisJQk9PTEVBTgkJCUlSUFBlbmRpbmc7CisJQk9PTEVBTgkJCUxhc3RPbmU7CisJQk9PTEVBTgkJCWJBZ2dyZWdhdGlibGU7CisJVUNIQVIJCQlIZWFkZXJfODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVQ0hBUgkJCVJzdlsyXTsKKwlVTE9ORwkJCURhdGFPZmZzZXQ7CisJVUlOVAkJCVR4UmF0ZTsKKwlkbWFfYWRkcl90CQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKKworfQlUWF9DT05URVhULCAqUFRYX0NPTlRFWFQsICoqUFBUWF9DT05URVhUOworCisKKy8vIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzCit0eXBlZGVmIHN0cnVjdCBfSFRfVFhfQ09OVEVYVAoreworCVBWT0lECQkJcEFkOwkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQVVJCCQkJcFVyYjsJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBJUlAJCQlwSXJwOwkJCS8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4KKwkJCQkJCQkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUEhUVFhfQlVGRkVSCVRyYW5zZmVyQnVmZmVyOwkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVVMT05HCQkJQnVsa091dFNpemU7CS8vIEluZGljYXRlIHRoZSB0b3RhbCBidWxrLW91dCBzaXplIGluIGJ5dGVzIGluIG9uZSBidWxrLXRyYW5zbWlzc2lvbgorCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKKwlCT09MRUFOCQkJSVJQUGVuZGluZzsKKwlCT09MRUFOCQkJTGFzdE9uZTsKKwlCT09MRUFOCQkJYkN1cldyaXRpbmc7CisJQk9PTEVBTgkJCWJSaW5nRW1wdHk7CisJQk9PTEVBTgkJCWJDb3B5U2F2ZVBhZDsKKwlVQ0hBUgkJCVNhdmVkUGFkWzhdOworCVVDSEFSCQkJSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107CisJVUxPTkcJCQlDdXJXcml0ZVBvc2l0aW9uOwkJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgc3RhcnQgZnJvbS4KKwlVTE9ORwkJCUN1cldyaXRlUmVhbFBvczsJCS8vIEluZGljYXRlIHRoZSBidWZmZXIgb2Zmc2V0IHdoaWNoIHBhY2tldCBub3cgYXJlIHdyaXRpbmcgdG8uCisJVUxPTkcJCQlOZXh0QnVsa091dFBvc2l0aW9uOwkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIHN0YXJ0IG9mZnNldCBvZiBhIGJ1bGstdHJhbnNtaXNzaW9uCisJVUxPTkcJCQlFTmV4dEJ1bGtPdXRQb3NpdGlvbjsJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBlbmQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24KKwlVSU5UCQkJVHhSYXRlOworCWRtYV9hZGRyX3QJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAorfQlIVF9UWF9DT05URVhULCAqUEhUX1RYX0NPTlRFWFQsICoqUFBIVF9UWF9DT05URVhUOworCisKKy8vCisvLyBTdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiByZWNlaXZlIHBhY2tldHMgYW5kIGJ1ZmZlcnMgdG8gaW5kaWNhdGUKKy8vIHJlY2VpdmUgZGF0YSB0byB0aGUgcHJvdG9jb2wuCisvLwordHlwZWRlZiBzdHJ1Y3QgX1JYX0NPTlRFWFQKK3sKKwlQVUNIQVIJCQkJVHJhbnNmZXJCdWZmZXI7CisJUFZPSUQJCQkJcEFkOworCVBJUlAJCQkJcElycDsvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBpbi4KKwlQVVJCCQkJCXBVcmI7CisJLy9UaGVzZSAyIEJvb2xlYW4gc2hvdWxkbid0IGJvdGggYmUgMSBhdCB0aGUgc2FtZSB0aW1lLgorCVVMT05HCQkJCUJ1bGtJbk9mZnNldDsJLy8gbnVtYmVyIG9mIHBhY2tldHMgd2FpdGluZyBmb3IgcmVvcmRlcmluZyAuCisvLwlCT09MRUFOCQkJCVJlb3JkZXJJblVzZTsJLy8gQXQgbGVhc3Qgb25lIHBhY2tldCBpbiB0aGlzIGJ1ZmZlciBhcmUgaW4gcmVvcmRlcmluZyBidWZmZXIgYW5kIHdhaXQgZm9yIHJlY2VpdmUgaW5kaWNhdGlvbgorCUJPT0xFQU4JCQkJYlJ4SGFuZGxpbmc7CS8vIE5vdGlmeSB0aGlzIHBhY2tldCBpcyBiZWluZyBwcm9jZXNzIG5vdy4KKwlCT09MRUFOCQkJCUluVXNlOwkJCS8vIFVTQiBIYXJkd2FyZSBPY2N1cGllZC4gV2FpdCBmb3IgVVNCIEhXIHRvIHB1dCBwYWNrZXQuCisJQk9PTEVBTgkJCQlSZWFkYWJsZTsJCS8vIFJlY2VpdmUgQ29tcGxldGUgYmFjay4gT0sgZm9yIGRyaXZlciB0byBpbmRpY2F0ZSByZWNlaXZpbmcgcGFja2V0LgorCUJPT0xFQU4JCQkJSVJQUGVuZGluZzsJCS8vIFRPRE86IFRvIGJlIHJlbW92ZWQKKwlhdG9taWNfdAkJCUlycExvY2s7CisJTkRJU19TUElOX0xPQ0sJCVJ4Q29udGV4dExvY2s7CisJZG1hX2FkZHJfdAkJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAorfQlSWF9DT05URVhULCAqUFJYX0NPTlRFWFQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLy8KKy8vICBORElTIFZlcnNpb24gZGVmaW5pdGlvbnMKKy8vCisjaWZkZWYgIE5ESVM1MF9NSU5JUE9SVAorI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQorI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMAorI2VuZGlmCisKKyNpZmRlZiAgTkRJUzUxX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAxCisjZW5kaWYKKworZXh0ZXJuICBjaGFyICAgIE5JQ19WRU5ET1JfREVTQ1tdOworZXh0ZXJuICBpbnQgICAgIE5JQ19WRU5ET1JfREVTQ19MRU47CisKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIFNOQVBfQUlST05FVFtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01bXTsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdOworZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbjsKK2V4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcFtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ0lTQ09fT1VJW107CitleHRlcm4gIFVDSEFSCUJhU2l6ZUFycmF5WzRdOworCitleHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVQ0hBUiBNVUxUSUNBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiBVTE9ORyBCSVQzMlszMl07CitleHRlcm4gVUNIQVIgQklUOFs4XTsKK2V4dGVybiBjaGFyKiBDaXBoZXJOYW1lW107CitleHRlcm4gY2hhciogTUNTVG9NYnBzW107CitleHRlcm4gVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXTsKK2V4dGVybiBVQ0hBUiBTTkFQXzgwMl8xSFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0JSSURHRV9UVU5ORUxbNl07CitleHRlcm4gVUNIQVIgU05BUF9BSVJPTkVUWzhdOworZXh0ZXJuIFVDSEFSIENLSVBfTExDX1NOQVBbOF07CitleHRlcm4gVUNIQVIgRUFQT0xfTExDX1NOQVBbOF07CitleHRlcm4gVUNIQVIgRUFQT0xbMl07CitleHRlcm4gVUNIQVIgSVBYWzJdOworZXh0ZXJuIFVDSEFSIEFQUExFX1RBTEtbMl07CitleHRlcm4gVUNIQVIgUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOworZXh0ZXJuIFVDSEFSIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtaW5bNF07CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21heFs0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbls0XTsKK2V4dGVybiBVQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdOworCitleHRlcm4gVVNIT1JUIFJhdGVVcFBFUltdOworZXh0ZXJuIFVTSE9SVCBSYXRlRG93blBFUltdOworZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOworZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlVXB3YXJkW107CitleHRlcm4gQ0hBUiAgIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZUlkVG9NYnBzW107CitleHRlcm4gVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBbXTsKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbjsKKworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXTsKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuOworCitleHRlcm4gVUNIQVIgIFNzaWRJZTsKK2V4dGVybiBVQ0hBUiAgU3VwUmF0ZUllOworZXh0ZXJuIFVDSEFSICBFeHRSYXRlSWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK2V4dGVybiBVQ0hBUiAgSHRDYXBJZTsKK2V4dGVybiBVQ0hBUiAgQWRkSHRJbmZvSWU7CitleHRlcm4gVUNIQVIgIE5ld0V4dENoYW5JZTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitleHRlcm4gVUNIQVIgIEV4dEh0Q2FwSWU7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitleHRlcm4gVUNIQVIgIEVycEllOworZXh0ZXJuIFVDSEFSICBEc0llOworZXh0ZXJuIFVDSEFSICBUaW1JZTsKK2V4dGVybiBVQ0hBUiAgV3BhSWU7CitleHRlcm4gVUNIQVIgIFdwYTJJZTsKK2V4dGVybiBVQ0hBUiAgSWJzc0llOworZXh0ZXJuIFVDSEFSICBDY3gySWU7CisKK2V4dGVybiBVQ0hBUiAgV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSICBSU05fT1VJW107CitleHRlcm4gVUNIQVIgIFdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUiAgV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBDY3gyUW9zSW5mb1tdOworZXh0ZXJuIFVDSEFSICBDY3gySWVJbmZvW107CitleHRlcm4gVUNIQVIgIFJBTElOS19PVUlbXTsKK2V4dGVybiBVQ0hBUiAgUG93ZXJDb25zdHJhaW50SUVbXTsKKworCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFHW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdbXTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjFTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbXTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBQUkVfTl9IVF9PVUlbXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZQlNQVhTRVEJCSgweEZGRikKKworI2lmZGVmIFJBTElOS19BVEUKK3R5cGVkZWYJc3RydWN0IF9BVEVfSU5GTyB7CisJVUNIQVIJTW9kZTsKKwlDSEFSCVR4UG93ZXIwOworCUNIQVIJVHhQb3dlcjE7CisJQ0hBUiAgICBUeEFudGVubmFTZWw7CisJQ0hBUiAgICBSeEFudGVubmFTZWw7CisJVFhXSV9TVFJVQyAgVHhXSTsgCSAgLy8gVFhXSQorCVVTSE9SVAlRSUQ7CisJVUNIQVIJQWRkcjFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIzW01BQ19BRERSX0xFTl07CisJVUNIQVIJQ2hhbm5lbDsKKwlVSU5UMzIJVHhMZW5ndGg7CisJVUlOVDMyCVR4Q291bnQ7CisJVUlOVDMyCVR4RG9uZUNvdW50OyAvLyBUeCBETUEgRG9uZQorCVVJTlQzMglSRkZyZXFPZmZzZXQ7CisJQk9PTEVBTgliUnhGZXI7CisJQk9PTEVBTgliUUFUeFN0YXJ0OyAvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHR4LgorCUJPT0xFQU4JYlFBUnhTdGFydDsJLy8gSGF2ZSBjb21waWxlZCBRQSBpbiBhbmQgdXNlIGl0IHRvIEFURSByeC4KKwlVSU5UMzIJUnhUb3RhbENudDsKKwlVSU5UMzIJUnhDbnRQZXJTZWM7CisKKwlDSEFSCUxhc3RTTlIwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUgorCUNIQVIgICAgTGFzdFNOUjE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SIGZvciAybmQgIGFudGVubmEKKwlDSEFSICAgIExhc3RSc3NpMDsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKKwlDSEFSICAgIExhc3RSc3NpMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDJuZCAgYW50ZW5uYQorCUNIQVIgICAgTGFzdFJzc2kyOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgM3JkICBhbnRlbm5hCisJQ0hBUiAgICBBdmdSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJQ0hBUiAgICBBdmdSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJQ0hBUiAgICBBdmdSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCA4IGZyYW1lcycgYXZlcmFnZSBSU1NJCisJU0hPUlQgICBBdmdSc3NpMFg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kxWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCVNIT1JUICAgQXZnUnNzaTJYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisKKwlVSU5UMzIJTnVtT2ZBdmdSc3NpU2FtcGxlOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvLyBUeCBmcmFtZQorI2lmZGVmIFJUMjg3MAorCS8qIG5vdCB1c2VkIGluIFJUMjg2MCAqLworCVRYSU5GT19TVFJVQwkJVHhJbmZvOyAvLyBUeEluZm8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwlVU0hPUlQJCUhMZW47IC8vIEhlYWRlciBMZW5ndGgKKwlVU0hPUlQJCVBMZW47IC8vIFBhdHRlcm4gTGVuZ3RoCisJVUNIQVIgCQlIZWFkZXJbMzJdOyAvLyBIZWFkZXIgYnVmZmVyCisJVUNIQVIJCVBhdHRlcm5bMzJdOyAvLyBQYXR0ZXJuIGJ1ZmZlcgorCVVTSE9SVAkJRExlbjsgLy8gRGF0YSBMZW5ndGgKKwlVU0hPUlQJCXNlcTsKKwlVSU5UMzIJCUNJRDsKKwlUSFJFQURfUElEIAkJQXRlUGlkOworCS8vIGNvdW50ZXJzCisJVUlOVDMyCQlVMk07CisJVUlOVDMyCQlPdGhlckRhdGE7CisJVUlOVDMyCQlCZWFjb247CisJVUlOVDMyCQlPdGhlckNvdW50OworCVVJTlQzMgkJVHhBYzA7CisJVUlOVDMyCQlUeEFjMTsKKwlVSU5UMzIJCVR4QWMyOworCVVJTlQzMgkJVHhBYzM7CisJVUlOVDMyCQlUeEhDQ0E7CisJVUlOVDMyCQlUeE1nbXQ7CisJVUlOVDMyCQlSU1NJMDsKKwlVSU5UMzIJCVJTU0kxOworCVVJTlQzMgkJUlNTSTI7CisJVUlOVDMyCQlTTlIwOworCVVJTlQzMgkJU05SMTsKKwkvLyBjb250cm9sCisJLy9VSU5UMzIJCVJlcGVhdDsgLy8gVHggQ3B1IGNvdW50CisJVUNIQVIJCVR4U3RhdHVzOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCit9CUFURV9JTkZPLCAqUEFURV9JTkZPOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK3N0cnVjdCBhdGVfcmFjZmdoZHIgeworIAlVSU5UMzIJCW1hZ2ljX25vOworCVVTSE9SVAkJY29tbWFuZF90eXBlOworCVVTSE9SVAkJY29tbWFuZF9pZDsKKwlVU0hPUlQJCWxlbmd0aDsKKwlVU0hPUlQJCXNlcXVlbmNlOworCVVTSE9SVAkJc3RhdHVzOworCVVDSEFSCQlkYXRhWzIwNDZdOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0cnVjdCByZW9yZGVyaW5nX21wZHUKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSpuZXh0OworCVBORElTX1BBQ0tFVAkJCXBQYWNrZXQ7CQkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLworCWludAkJCQkJCVNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KKwlCT09MRUFOCQkJCQliQU1TRFU7Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19saXN0Cit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKKwlpbnQgCXFsZW47Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKK3sKKwlQVk9JRAkJCQkJbWVtOworCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IAlmcmVlbGlzdDsKK307CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IAlfUlNTSV9TQU1QTEUgeworCUNIQVIJCQlMYXN0UnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlBdmdSc3NpMDsKKwlDSEFSCQkJQXZnUnNzaTE7CisJQ0hBUgkJCUF2Z1Jzc2kyOworCVNIT1JUCQkJQXZnUnNzaTBYODsKKwlTSE9SVAkJCUF2Z1Jzc2kxWDg7CisJU0hPUlQJCQlBdmdSc3NpMlg4OworfSBSU1NJX1NBTVBMRTsKKworLy8KKy8vICBRdWV1ZSBzdHJ1Y3R1cmUgYW5kIG1hY3JvcworLy8KK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfRU5UUlkgICAgeworCXN0cnVjdCBfUVVFVUVfRU5UUlkgICAgICpOZXh0OworfSAgIFFVRVVFX0VOVFJZLCAqUFFVRVVFX0VOVFJZOworCisvLyBRdWV1ZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfSEVBREVSICAgeworCVBRVUVVRV9FTlRSWSAgICBIZWFkOworCVBRVUVVRV9FTlRSWSAgICBUYWlsOworCVVMT05HICAgICAgICAgICBOdW1iZXI7Cit9ICAgUVVFVUVfSEVBREVSLCAqUFFVRVVFX0hFQURFUjsKKworI2RlZmluZSBJbml0aWFsaXplUXVldWVIZWFkZXIoUXVldWVIZWFkZXIpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgXAorCShRdWV1ZUhlYWRlciktPk51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUmVtb3ZlSGVhZFF1ZXVlKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgICBcCisoUXVldWVIZWFkZXIpLT5IZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlQUVVFVUVfRU5UUlkgcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPkhlYWQgIT0gTlVMTCkJCQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCXBOZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dDsgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKKwkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXItLTsgICAgICAgICAgICAgICAgICAgIFwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLworLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKKy8vCisjZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCisjZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQorCisjZGVmaW5lIE9QU1RBVFVTX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoX3BFbnRyeSxfRikgICAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoX3BFbnRyeSxfRikgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKF9wRW50cnksX0YpICAgICAoKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIFJYX0ZJTFRFUl9TRVRfRkxBRyhfcEFkLCBfRikgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciB8PSAoX0YpKQorI2RlZmluZSBSWF9GSUxURVJfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJj0gfihfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9URVNUX0ZMQUcoX3BBZCwgX0YpICAgKCgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJiAoX0YpKSAhPSAwKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9OT19TRUNVUklUWV9PTihfcCkgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisjZGVmaW5lIFNUQV9XRVBfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisjZGVmaW5lIFNUQV9US0lQX09OKF9wKSAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisjZGVmaW5lIFNUQV9BRVNfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisKKyNkZWZpbmUgU1RBX1RHTl9XSUZJX09OKF9wKSAgICAgICAgICAgICAoX3AtPlN0YUNmZy5iVEduV2lmaVRlc3QgPT0gVFJVRSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBDS0lQX0tQX09OKF9wKQkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgxMCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKKyNkZWZpbmUgQ0tJUF9DTUlDX09OKF9wKQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDA4KSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorCisKKyNkZWZpbmUgSU5DX1JJTkdfSU5ERVgoX2lkeCwgX1JpbmdTaXplKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfaWR4KSA9IChfaWR4KzEpICUgKF9SaW5nU2l6ZSk7ICAgICAgIFwKK30KKworI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzAwMDAwKQorCisjZGVmaW5lIFJJTkdfUEFDS0VUX0lOSVQoX1R4UmluZywgX2lkeCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBUWERUX0lOSVQoX1R4RCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzWmVyb01lbW9yeShfVHhELCBUWERfU0laRSk7CVwKKwlfVHhELT5ETUFET05FID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vU2V0IGxhc3QgZGF0YSBzZWdtZW50CisjZGVmaW5lIFJJTkdfU0VUX0xBU1REUyhfVHhELCBfSXNTRDApICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9Jc1NEMCkge19UeEQtPkxhc3RTZWMwID0gMTt9ICAgICBcCisgICAgZWxzZSB7X1R4RC0+TGFzdFNlYzEgPSAxO30gICAgIFwKK30KKworLy8gSW5jcmVhc2UgVHhUc2MgdmFsdWUgZm9yIG5leHQgdHJhbnNtaXNzaW9uCisvLyBUT0RPOgorLy8gV2hlbiBpPT02LCBtZWFucyBUU0MgaGFzIGRvbmUgb25lIGZ1bGwgY3ljbGUsIGRvIHJlLWtleWluZyBzdHVmZiBmb2xsb3cgc3BlY3MKKy8vIFNob3VsZCBzZW5kIGEgc3BlY2lhbCBldmVudCBtaWNyb3NvZnQgZGVmaW5lZCB0byByZXF1ZXN0IHJlLWtleQorI2RlZmluZSBJTkNfVFhfVFNDKF90c2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgrK190c2NbaV0gPT0gMHgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSA9PSA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuCisjZGVmaW5lIENPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5DaGFubmVsV2lkdGggPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWltb1BzID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkdGID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjIwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3I0MCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDA7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5UeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUnhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQzsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkV4dENoYW5PZmZzZXQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJlY29tV2lkdGggPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk9wZXJhaW9uTW9kZSA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTm9uR2ZQcmVzZW50ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7ICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZihVQ0hBUikgKiAxNik7XAorfQorCisjZGVmaW5lIENPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihfcEFkLCBfcEh0Q2FwYWJpbGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8KKy8vIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4KKy8vIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuCisvLworI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwICAgICAgICAgLy8gTnVtYmVyIG9mIHJldHJ5IGJlZm9yZSBmYWlsaW5nIGFjY2VzcyBCQlAgJiBSRiBpbmRpcmVjdCByZWdpc3RlcgorLy8KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoX0EsIF9WKQorI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCisjZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKKworI2RlZmluZSBCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQorI2RlZmluZSBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgIAkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNkZWZpbmUgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwga2h6KSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAga2h6ID0gMjQxNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAga2h6ID0gMjQyMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAga2h6ID0gMjQyNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiAgICAga2h6ID0gMjQzMjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAgICAga2h6ID0gMjQzNzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiAgICAga2h6ID0gMjQ0MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiAgICAga2h6ID0gMjQ0NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiAgICAga2h6ID0gMjQ1MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogICAga2h6ID0gMjQ1NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogICAga2h6ID0gMjQ2MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogICAga2h6ID0gMjQ2NzAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogICAga2h6ID0gMjQ3MjAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogICAga2h6ID0gMjQ4NDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjogIC8qIFVOSUkgKi8gIGtoeiA9IDUxODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6ICAvKiBVTklJICovICBraHogPSA1MjAwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OiAgLyogVU5JSSAqLyAga2h6ID0gNTIyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6ICAvKiBVTklJICovICBraHogPSA1MjYwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2OiAgLyogVU5JSSAqLyAga2h6ID0gNTI4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6ICAvKiBVTklJICovICBraHogPSA1MzIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OTogLyogVU5JSSAqLyAga2h6ID0gNTc0NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NjUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OiAvKiBVTklJICovICBraHogPSA1Nzg1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MTogLyogVU5JSSAqLyAga2h6ID0gNTgwNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MjUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1ODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2ODAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU3MDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE3MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE5MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIxMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIzMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5MjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE4ODogLyogSmFwYW4gKi8gICBraHogPSA0OTQwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTI6IC8qIEphcGFuICovICAga2h6ID0gNDk2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk2OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5ODAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIwODogLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgIGtoeiA9IDUwNDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIxMjogLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgIGtoeiA9IDUwNjAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDIxNjogLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgIGtoeiA9IDUwODAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisjZGVmaW5lICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQoa2h6LCBjaCkgIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3dpdGNoIChraHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxMjAwMDogICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxNzAwMDogICAgY2ggPSAyOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyMjAwMDogICAgY2ggPSAzOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyNzAwMDogICAgY2ggPSA0OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzMjAwMDogICAgY2ggPSA1OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzNzAwMDogICAgY2ggPSA2OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0MjAwMDogICAgY2ggPSA3OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0NzAwMDogICAgY2ggPSA4OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1MjAwMDogICAgY2ggPSA5OyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1NzAwMDogICAgY2ggPSAxMDsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2MjAwMDogICAgY2ggPSAxMTsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2NzAwMDogICAgY2ggPSAxMjsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ3MjAwMDogICAgY2ggPSAxMzsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ4NDAwMDogICAgY2ggPSAxNDsgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE4MDAwMDogICAgY2ggPSAzNjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMDAwMDA6ICAgIGNoID0gNDA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjIwMDAwOiAgICBjaCA9IDQ0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI0MDAwMDogICAgY2ggPSA0ODsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNjAwMDA6ICAgIGNoID0gNTI7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjgwMDAwOiAgICBjaCA9IDU2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMwMDAwMDogICAgY2ggPSA2MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMjAwMDA6ICAgIGNoID0gNjQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzQ1MDAwOiAgICBjaCA9IDE0OTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc2NTAwMDogICAgY2ggPSAxNTM7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3ODUwMDA6ICAgIGNoID0gMTU3OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODA1MDAwOiAgICBjaCA9IDE2MTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTgyNTAwMDogICAgY2ggPSAxNjU7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MDAwMDA6ICAgIGNoID0gMTAwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MjAwMDA6ICAgIGNoID0gMTA0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NDAwMDA6ICAgIGNoID0gMTA4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NjAwMDA6ICAgIGNoID0gMTEyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU1ODAwMDA6ICAgIGNoID0gMTE2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MDAwMDA6ICAgIGNoID0gMTIwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MjAwMDA6ICAgIGNoID0gMTI0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NDAwMDA6ICAgIGNoID0gMTI4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NjAwMDA6ICAgIGNoID0gMTMyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU2ODAwMDA6ICAgIGNoID0gMTM2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3MDAwMDA6ICAgIGNoID0gMTQwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxNzAwMDA6ICAgIGNoID0gMzQ7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOTAwMDA6ICAgIGNoID0gMzg7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMTAwMDA6ICAgIGNoID0gNDI7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMzAwMDA6ICAgIGNoID0gNDY7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5MjAwMDA6ICAgIGNoID0gMTg0OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NDAwMDA6ICAgIGNoID0gMTg4OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NjAwMDA6ICAgIGNoID0gMTkyOyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5ODAwMDA6ICAgIGNoID0gMTk2OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNDAwMDA6ICAgIGNoID0gMjA4OyAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA2MDAwMDogICAgY2ggPSAyMTI7IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDgwMDAwOiAgICBjaCA9IDIxNjsgLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfQorCisvLworLy8gQ29tbW9uIGZyYWdtZW50IGxpc3Qgc3RydWN0dXJlIC0gIElkZW50aWNhbCB0byB0aGUgc2NhdHRlciBnYXRoZXIgZnJhZyBsaXN0IHN0cnVjdHVyZQorLy8KKy8vI2RlZmluZSBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgICAgICAgICBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UCisvLyNkZWZpbmUgUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAgICAgICAgUFNDQVRURVJfR0FUSEVSX0VMRU1FTlQKKyNkZWZpbmUgTklDX01BWF9QSFlTX0JVRl9DT1VOVCAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIHsKKyAgICBQVk9JRAkJQWRkcmVzczsKKyAgICBVTE9ORwkJTGVuZ3RoOworICAgIFBVTE9ORwkJUmVzZXJ2ZWQ7Cit9IFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCB7CisgICAgVUxPTkcgIE51bWJlck9mRWxlbWVudHM7CisgICAgUFVMT05HIFJlc2VydmVkOworICAgIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tOSUNfTUFYX1BIWVNfQlVGX0NPVU5UXTsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVDsKKworLy8KKy8vICBTb21lIHV0aWxpdHkgbWFjcm9zCisvLworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKF9hLCBfYikgICAgICgoKF9hKSA8IChfYikpID8gKF9hKSA6IChfYikpCisjZW5kaWYKKworI2lmbmRlZiBtYXgKKyNkZWZpbmUgbWF4KF9hLCBfYikgICAgICgoKF9hKSA+IChfYikpID8gKF9hKSA6IChfYikpCisjZW5kaWYKKworI2RlZmluZSBHRVRfTE5BX0dBSU4oX3BBZCkJKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSA/IChfcEFkLT5CTE5BR2FpbikgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gNjQpID8gKF9wQWQtPkFMTkFHYWluMCkgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTI4KSA/IChfcEFkLT5BTE5BR2FpbjEpIDogKF9wQWQtPkFMTkFHYWluMikpKSkKKworI2RlZmluZSBJTkNfQ09VTlRFUjY0KFZhbCkgICAgICAgICAgKFZhbC5RdWFkUGFydCsrKQorCisjZGVmaW5lIElORlJBX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0lORlJBX09OKSkKKyNkZWZpbmUgQURIT0NfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfQURIT0NfT04pKQorI2RlZmluZSBNT05JVE9SX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuQnNzVHlwZSkgPT0gQlNTX01PTklUT1IpCisjZGVmaW5lIElETEVfT04oX3ApICAgICAgICAgICAgICAgICAoIUlORlJBX09OKF9wKSAmJiAhQURIT0NfT04oX3ApKQorCisvLyBDaGVjayBMRUFQICYgQ0NLTSBmbGFncworI2RlZmluZSBMRUFQX09OKF9wKSAgICAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZGVmaW5lIExFQVBfQ0NLTV9PTihfcCkgICAgICAgICAgICAoKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApICYmICgoX3ApLT5TdGFDZmcuTGVhcEF1dGhJbmZvLkNDS00gPT0gVFJVRSkpCisKKy8vIGlmIG9yZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfODAyXzFIOwkJCQkJCVwKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShJUFgsIF9wQnVmVkEgKyAxMiwgMikgfHwgCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEgKyAxMiwgMikpCQlcCisJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAorCQl9CQkJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKK30KKworLy8gTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguCisjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCWlmICgoKCooX3BCdWZWQSkgPDwgOCkgKyAqKF9wQnVmVkEgKyAxKSkgPiAxNTAwKQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSwgMikgfHwgCQkJCVwKKwkJCU5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBfcEJ1ZlZBLCAyKSkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQX0JSSURHRV9UVU5ORUw7CQkJXAorCQl9CQkJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCVwKKwkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IE5VTEw7CQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCVwKK30KKworCisjZGVmaW5lIE1BS0VfODAyXzNfSEVBREVSKF9wLCBfcE1hYzEsIF9wTWFjMiwgX3BUeXBlKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoX3AsIF9wTWFjMSwgTUFDX0FERFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOKSwgX3BNYWMyLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICBcCisgICAgTmRpc01vdmVNZW1vcnkoKF9wICsgTUFDX0FERFJfTEVOICogMiksIF9wVHlwZSwgTEVOR1RIXzgwMl8zX1RZUEUpOyBcCit9CisKKy8vIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4KKy8vIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkCisvLyBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lCisvLyBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQKKy8vIE5vdGU6CisvLyAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPCisvLyAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkCisjZGVmaW5lIENPTlZFUlRfVE9fODAyXzMoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBfcERhdGEsIF9EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCkgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBMTENfTGVuWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BSZW1vdmVkTExDU05BUCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSAgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQX0JSSURHRV9UVU5ORUwsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBVQ0hBUiBwUHJvdG8gPSBfcERhdGEgKyA2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTmRpc0VxdWFsTWVtb3J5KElQWCwgcFByb3RvLCAyKSB8fCBOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgcFByb3RvLCAyKSkgJiYgIFwKKyAgICAgICAgICAgIE5kaXNFcXVhbE1lbW9yeShTTkFQXzgwMl8xSCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgcFByb3RvKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9wUmVtb3ZlZExMQ1NOQVAgPSBfcERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9wRGF0YSArPSBMRU5HVEhfODAyXzFfSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTV0lUQ0hfQUIoIF9wQUEsIF9wQkIpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFZPSUQgcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcENDID0gX3BCQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wQkIgPSBfcEFBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BBQSA9IHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBFbnF1ZXVlIHRoaXMgZnJhbWUgdG8gTUxNRSBlbmdpbmUKKy8vIFdlIG5lZWQgdG8gZW5xdWV1ZSB0aGUgd2hvbGUgZnJhbWUgYmVjYXVzZSBNTE1FIG5lZWQgdG8gcGFzcyBkYXRhIHR5cGUKKy8vIGluZm9ybWF0aW9uIGZyb20gODAyLjExIGhlYWRlcgorI2lmZGVmIFJUMjg3MAorI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVSU5UMzIgSGlnaDMyVFNGPTAsIExvdzMyVFNGPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjZGVmaW5lIE5ESVNfUVVFUllfQlVGRkVSKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc1F1ZXJ5QnVmZmVyKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pCisKKyNkZWZpbmUgTUFDX0FERFJfRVFVQUwocEFkZHIxLHBBZGRyMikgICAgICAgICAgIFJUTVBFcXVhbE1lbW9yeSgoUFZPSUQpKHBBZGRyMSksIChQVk9JRCkocEFkZHIyKSwgTUFDX0FERFJfTEVOKQorI2RlZmluZSBTU0lEX0VRVUFMKHNzaWQxLCBsZW4xLCBzc2lkMiwgbGVuMikgICAgKChsZW4xPT1sZW4yKSAmJiAoUlRNUEVxdWFsTWVtb3J5KHNzaWQxLCBzc2lkMiwgbGVuMSkpKQorCisvLworLy8gQ2hlY2sgaWYgaXQgaXMgSmFwYW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWwuCisvLworI2RlZmluZSBKYXBhbkNoYW5uZWxDaGVjayhjaGFubmVsKSAgKChjaGFubmVsID09IDUyKSB8fCAoY2hhbm5lbCA9PSA1NikgfHwgKGNoYW5uZWwgPT0gNjApIHx8IChjaGFubmVsID09IDY0KSkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKK3sgXAorCV9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCisJTmRpc0FjcXVpcmVTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IF9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAorCU5kaXNSZWxlYXNlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8KKy8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFR19QQUlSCit7CisJVUxPTkcgICBSZWdpc3RlcjsKKwlVTE9ORyAgIFZhbHVlOworfSBSVE1QX1JFR19QQUlSLCAqUFJUTVBfUkVHX1BBSVI7CisKK3R5cGVkZWYgc3RydWN0ICBfUkVHX1BBSVIKK3sKKwlVQ0hBUiAgIFJlZ2lzdGVyOworCVVDSEFSICAgVmFsdWU7Cit9IFJFR19QQUlSLCAqUFJFR19QQUlSOworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkZfUkVHUworeworCVVDSEFSICAgQ2hhbm5lbDsKKwlVTE9ORyAgIFIxOworCVVMT05HICAgUjI7CisJVUxPTkcgICBSMzsKKwlVTE9ORyAgIFI0OworfSBSVE1QX1JGX1JFR1MsICpQUlRNUF9SRl9SRUdTOworCit0eXBlZGVmIHN0cnVjdCBfRlJFUVVFTkNZX0lURU0geworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJTjsKKwlVQ0hBUglSOworCVVDSEFSCUs7Cit9IEZSRVFVRU5DWV9JVEVNLCAqUEZSRVFVRU5DWV9JVEVNOworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgoreworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKKworCit0eXBlZGVmCXVuaW9uCV9IRUFERVJfODAyXzExX1NFUXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgc3RydWN0IHsKKyAgIAlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisgICAgfSAgIGZpZWxkOworI2Vsc2UKKyAgICBzdHJ1Y3QgeworCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyAgICB9ICAgZmllbGQ7CisjZW5kaWYKKyAgICBVU0hPUlQgICAgICAgICAgIHZhbHVlOworfQlIRUFERVJfODAyXzExX1NFUSwgKlBIRUFERVJfODAyXzExX1NFUTsKKworLy8KKy8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5CisvLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRU9SREVSQlVGCit7CisJQk9PTEVBTgkJCUlzRnVsbDsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCVVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCUhFQURFUl84MDJfMTFfU0VRCQkJU2VxdWVuY2U7CS8vc3VwcG9ydCBjb21wcmVzc2VkIGJpdG1hcCBCQSwgc28gbm8gY29uc2lkZXIgZnJhZ21lbnQgaW4gQkEKKwlVQ0hBUiAJCURhdGFPZmZzZXQ7CisJVVNIT1JUIAkJRGF0YXNpemU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworI2lmZGVmIFJUMjg3MAorCVBVQ0hBUgkJCQkJQWxsb2NQYTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KK30gICBSVE1QX1JFT1JERVJCVUYsICpQUlRNUF9SRU9SREVSQlVGOworCisvLworLy8gQ29udHJvbCBibG9jayAoRGVzY3JpcHRvcikgZm9yIGFsbCByaW5nIGRlc2NyaXB0b3IgRE1BIG9wZXJhdGlvbiwgYnVmZmVyIG11c3QgYmUKKy8vIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5LiBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIGJpbmRpbmcgUnggcGFja2V0IGRlc2NyaXB0b3IKKy8vIHdoaWNoIHdvbid0IGJlIHJlbGVhc2VkLCBkcml2ZXIgaGFzIHRvIHdhaXQgdW50aWwgdXBwZXIgbGF5ZXIgcmV0dXJuIHRoZSBwYWNrZXQKKy8vIGJlZm9yZSBnaXZlaW5nIHVwIHRoaXMgcnggcmluZyBkZXNjcmlwdG9yIHRvIEFTSUMuIE5ESVNfQlVGRkVSIGlzIGFzc29jYWl0ZWQgcGFpcgorLy8gdG8gZGVzY3JpYmUgdGhlIHBhY2tldCBidWZmZXIuIEZvciBUeCwgTkRJU19QQUNLRVQgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4KKy8vCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9ETUFDQgoreworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCisJUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCisJUE5ESVNfUEFDS0VUIHBOZGlzUGFja2V0OworCVBORElTX1BBQ0tFVCBwTmV4dE5kaXNQYWNrZXQ7CisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBEbWFCdWY7ICAgICAgICAgICAgIC8vIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUKK30gUlRNUF9ETUFDQiwgKlBSVE1QX0RNQUNCOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9CVUYKK3sKKwlQUVVFVUVfRU5UUlkgICAgTmV4dDsKKwlVQ0hBUiAgICAgICAgICAgSW5kZXg7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKK30gUlRNUF9UWEJVRiwgKlBSVE1QX1RYQlVGOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9CVUYKK3sKKwlCT09MRUFOICAgICAgICAgICBJblVzZTsKKwlVTE9ORyAgICAgICAgICAgCUJ5QmFSZWNJbmRleDsKKwlSVE1QX1JFT1JERVJCVUYJTUFQX1JYQnVmW01BWF9SWF9SRU9SREVSQlVGXTsKK30gUlRNUF9SWEJVRiwgKlBSVE1QX1JYQlVGOwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfUklORworeworCVJUTVBfRE1BQ0IgIENlbGxbVFhfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgCS8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAorfSBSVE1QX1RYX1JJTkcsICpQUlRNUF9UWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtSWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJUnhDcHVJZHg7CisJVUlOVDMyCQlSeERtYUlkeDsKKwlJTlQzMgkJUnhTd1JlYWRJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IHJlYWQgaW5kZXgKK30gUlRNUF9SWF9SSU5HLCAqUFJUTVBfUlhfUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUTVBfTUdNVF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtNR01UX1JJTkdfU0laRV07CisJVUlOVDMyCQlUeENwdUlkeDsKKwlVSU5UMzIJCVR4RG1hSWR4OworCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IC8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAorfSBSVE1QX01HTVRfUklORywgKlBSVE1QX01HTVRfUklORzsKKworLy8KKy8vICBTdGF0aXN0aWMgY291bnRlciBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMworeworCS8vIEdlbmVyYWwgU3RhdHMKKwlVTE9ORyAgICAgICBHb29kVHJhbnNtaXRzOworCVVMT05HICAgICAgIEdvb2RSZWNlaXZlczsKKwlVTE9ORyAgICAgICBUeEVycm9yczsKKwlVTE9ORyAgICAgICBSeEVycm9yczsKKwlVTE9ORyAgICAgICBSeE5vQnVmZmVyOworCisJLy8gRXRoZXJuZXQgU3RhdHMKKwlVTE9ORyAgICAgICBSY3ZBbGlnbm1lbnRFcnJvcnM7CisJVUxPTkcgICAgICAgT25lQ29sbGlzaW9uOworCVVMT05HICAgICAgIE1vcmVDb2xsaXNpb25zOworCit9IENPVU5URVJfODAyXzMsICpQQ09VTlRFUl84MDJfMzsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzExIHsKKwlVTE9ORyAgICAgICAgICAgTGVuZ3RoOworCUxBUkdFX0lOVEVHRVIgICBMYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OworCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7Cit9IENPVU5URVJfODAyXzExLCAqUENPVU5URVJfODAyXzExOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9SQUxJTksgeworCVVMT05HICAgICAgICAgICBUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgUmVjZWl2ZWRCeXRlQ291bnQ7ICAgICAgLy8gYm90aCBDUkMgb2theSBhbmQgQ1JDIGVycm9yLCB1c2VkIHRvIGNhbGN1bGF0ZSBSWCB0aHJvdWdocHV0CisJVUxPTkcgICAgICAgICAgIEJlZW5EaXNhc3NvY2lhdGVkQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEJhZENRSUF1dG9SZWNvdmVyeUNvdW50OworCVVMT05HICAgICAgICAgICBQb29yQ1FJUm9hbWluZ0NvdW50OworCVVMT05HICAgICAgICAgICBNZ210UmluZ0Z1bGxDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudFNpbmNlTGFzdE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJ4Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFJ4UmluZ0VyckNvdW50OworCVVMT05HICAgICAgICAgICBLaWNrVHhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgVHhSaW5nRXJyQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJlYWxGY3NFcnJDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUGVuZGluZ05kaXNQYWNrZXRDb3VudDsKKworCVVMT05HICAgICAgICAgICBPbmVTZWNPc1R4Q291bnRbTlVNX09GX1RYX1JJTkddOworCVVMT05HICAgICAgICAgICBPbmVTZWNEbWFEb25lQ291bnRbTlVNX09GX1RYX1JJTkddOworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeERvbmVDb3VudDsKKwlVTE9ORyAgICAgICAgICAgT25lU2VjUnhDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQ7CisKKwlVSU5UMzIgICAJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisKKyNpZmRlZiBSVDI4NzAKKwlVTE9ORyAgICAgICAgICAgT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNGYWxzZUNDQUNudDsgICAgICAvLyBDQ0EgZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tDbnQ7ICAgICAgICAgIC8vIFJYIHdpdGhvdXQgZXJyb3IKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0RhdGFDbnQ7ICAgICAgLy8gdW5pY2FzdC10by1tZSBEQVRBIGZyYW1lIGNvdW50CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4RmNzRXJyQ250OyAgICAgIC8vIENSQyBlcnJvcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNCZWFjb25TZW50Q250OworCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjVG90YWxUeENvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAorCVVJTlQzMiAgICAgICAgICBMYXN0T25lU2VjUnhPa0RhdGFDbnQ7ICAvLyBPbmVTZWNSeE9rRGF0YUNudAorCVVMT05HCQlEdXBsaWNhdGVSY3Y7CisJVUxPTkcJCVR4QWdnQ291bnQ7CisJVUxPTkcJCVR4Tm9uQWdnQ291bnQ7CisJVUxPTkcJCVR4QWdnMU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cyTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzNNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c1TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzZNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnN01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c4TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzlNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTBNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTFNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTJNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTNNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTRNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTVNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMTZNUERVQ291bnQ7CisKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVTsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkT2N0ZXNJbkFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBNUERVSW5SZWNlaXZlZEFNUERVQ291bnQ7Cit9IENPVU5URVJfUkFMSU5LLCAqUENPVU5URVJfUkFMSU5LOworCit0eXBlZGVmIHN0cnVjdCBfUElEX0NPVU5URVIgeworCVVMT05HICAgICAgICAgICBUeEFja1JlcXVpcmVkQ291bnQ7ICAgICAgLy8gQ1JDIGVycm9yCisJVUxPTkcgICAgICAgICAgIFR4QWdncmVDb3VudDsKKwlVTE9ORyAgICAgICAgICAgVHhTdWNjZXNzQ291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50CisJVUxPTkcJCUxhc3RTdWNjZXNzUmF0ZTsKK30gUElEX0NPVU5URVIsICpQUElEX0NPVU5URVI7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX0RSUyB7CisJLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgorCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KKwlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOICAgICAgICAgZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KKwlVQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KKwlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7Cit9IENPVU5URVJfRFJTLCAqUENPVU5URVJfRFJTOworCisvLworLy8gIEFyY2ZvdXIgU3RydWN0dXJlIEFkZGVkIGJ5IFBhdWxXdQorLy8KK3R5cGVkZWYgc3RydWN0ICBfQVJDRk9VUgoreworCVVJTlQgICAgICAgICAgICBYOworCVVJTlQgICAgICAgICAgICBZOworCVVDSEFSICAgICAgICAgICBTVEFURVsyNTZdOworfSBBUkNGT1VSQ09OVEVYVCwgKlBBUkNGT1VSQ09OVEVYVDsKKworLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJIHRvby4ganVzdCBjb3B5IHRvIFRYV0kuCit0eXBlZGVmIHN0cnVjdCAgX1JFQ0VJVkVfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJTUlNTzoxOworCVVTSE9SVAkJT0ZETToxOworCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQgICAJTnVtT2ZSWDoyOyAgICAgICAgICAgICAgICAgLy8gTUlNTy4gV0UgSEFWRSAzUgorI2Vsc2UKKwlVU0hPUlQgICAJTnVtT2ZSWDoyOyAgICAgICAgICAgICAgICAgLy8gTUlNTy4gV0UgSEFWRSAzUgorCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCU9GRE06MTsKKwlVU0hPUlQJCU1JTU86MTsKKyNlbmRpZgorIH0gUkVDRUlWRV9TRVRUSU5HLCAqUFJFQ0VJVkVfU0VUVElORzsKKworLy8gU2hhcmVkIGtleSBkYXRhIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgIF9XRVBfS0VZIHsKKwlVQ0hBUiAgIEtleUxlbjsgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAorCVVDSEFSICAgS2V5W01BWF9MRU5fT0ZfS0VZXTsgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKK30gV0VQX0tFWSwgKlBXRVBfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfQ0lQSEVSX0tFWSB7CisJVUNIQVIgICBLZXlbMTZdOyAgICAgICAgICAgIC8vIHJpZ2h0IG5vdyB3ZSBpbXBsZW1lbnQgNCBrZXlzLCAxMjggYml0cyBtYXgKKwlVQ0hBUiAgIFJ4TWljWzhdOwkJCS8vIG1ha2UgYWxpZ25tZW50CisJVUNIQVIgICBUeE1pY1s4XTsKKwlVQ0hBUiAgIFR4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCisJVUNIQVIgICBSeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQorCVVDSEFSICAgQ2lwaGVyQWxnOyAgICAgICAgICAvLyAwLW5vbmUsIDE6V0VQNjQsIDI6V0VQMTI4LCAzOlRLSVAsIDQ6QUVTLCA1OkNLSVA2NCwgNjpDS0lQMTI4CisJVUNIQVIgICBLZXlMZW47CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUNIQVIgICBCc3NJZFs2XTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCisJVUNIQVIgICBUeXBlOyAgICAgICAgICAgICAgIC8vIEluZGljYXRlIFBhaXJ3aXNlL0dyb3VwIHdoZW4gcmVwb3J0aW5nIE1JQyBlcnJvcgorfSBDSVBIRVJfS0VZLCAqUENJUEhFUl9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9CQlBfVFVOSU5HX1NUUlVDVCB7CisJQk9PTEVBTiAgICAgRW5hYmxlOworCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRVcHBlckJvdW5kOyAgLy8gMTAwIHBlciBzZWMKKwlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50TG93ZXJCb3VuZDsgIC8vIDEwIHBlciBzZWMKKwlVQ0hBUiAgICAgICBSMTdMb3dlckJvdW5kOyAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBFMlBST00KKwlVQ0hBUiAgICAgICBSMTdVcHBlckJvdW5kOyAgICAgICAgICAgIC8vIDB4NjggYWNjb3JkaW5nIHRvIERhdmlkIFR1bmcKKwlVQ0hBUiAgICAgICBDdXJyZW50UjE3VmFsdWU7Cit9IEJCUF9UVU5JTkcsICpQQkJQX1RVTklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NPRlRfUlhfQU5UX0RJVkVSU0lUWV9TVFJVQ1QgeworCVVDSEFSICAgICBFdmFsdWF0ZVBlcmlvZDsJCSAvLyAwOm5vdCBldmFsdXRlIHN0YXR1cywgMTogZXZhbHVhdGUgc3RhdHVzLCAyOiBzd2l0Y2hpbmcgc3RhdHVzCisJVUNIQVIgICAgIFBhaXIxUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCisJVUNIQVIgICAgIFBhaXIxU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTEsIDE6QW50LUUyCisJVUNIQVIgICAgIFBhaXIyUHJpbWFyeVJ4QW50OyAgICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0CisJVUNIQVIgICAgIFBhaXIyU2Vjb25kYXJ5UnhBbnQ7ICAgLy8gMDpBbnQtRTMsIDE6QW50LUU0CisJU0hPUlQgICAgIFBhaXIxQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMSwgQXZnUnNzaVsxXTpFMgorCVNIT1JUICAgICBQYWlyMkF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTMsIEF2Z1Jzc2lbMV06RTQKKwlTSE9SVCAgICAgUGFpcjFMYXN0QXZnUnNzaTsgICAgICAvLworCVNIT1JUICAgICBQYWlyMkxhc3RBdmdSc3NpOyAgICAgIC8vCisJVUxPTkcgICAgIFJjdlBrdE51bVdoZW5FdmFsdWF0ZTsKKwlCT09MRUFOICAgRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgUnhBbnREaXZlcnNpdHlUaW1lcjsKK30gU09GVF9SWF9BTlRfRElWRVJTSVRZLCAqUFNPRlRfUlhfQU5UX0RJVkVSU0lUWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfQVVUSF9JTkZPIHsKKwlCT09MRUFOICAgICAgICAgRW5hYmxlZDsgICAgICAgIC8vVHVyZTogRW5hYmxlIExFQVAgQXV0aGVudGljYXRpb24KKwlCT09MRUFOICAgICAgICAgQ0NLTTsgICAgICAgICAgIC8vVHVyZTogVXNlIEZhc3QgUmVhdXRoZW50aWNhdGlvbiB3aXRoIENDS00KKwlVQ0hBUiAgICAgICAgICAgUmVzZXJ2ZVsyXTsKKwlVQ0hBUiAgICAgICAgICAgVXNlck5hbWVbMjU2XTsgIC8vTEVBUCwgVXNlciBuYW1lCisJVUxPTkcgICAgICAgICAgIFVzZXJOYW1lTGVuOworCVVDSEFSICAgICAgICAgICBQYXNzd29yZFsyNTZdOyAgLy9MRUFQLCBVc2VyIFBhc3N3b3JkCisJVUxPTkcgICAgICAgICAgIFBhc3N3b3JkTGVuOworfSBMRUFQX0FVVEhfSU5GTywgKlBMRUFQX0FVVEhfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgIEVycm9yQ29kZVsyXTsgIC8vMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlCisJCQkJCQkJCS8vMDAgMDItQXV0aGVudGljYXRpb24gdGltZW91dAorCQkJCQkJCQkvLzAwIDAzLUNoYWxsZW5nZSBmcm9tIEFQIGZhaWxlZAorCQkJCQkJCQkvLzAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQKKwlCT09MRUFOICAgICAgUmVwb3J0ZWQ7Cit9IFJPR1VFQVBfRU5UUlksICpQUk9HVUVBUF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVDSEFSICAgICAgICAgICAgICAgUm9ndWVBcE5yOworCVJPR1VFQVBfRU5UUlkgICAgICAgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gUk9HVUVBUF9UQUJMRSwgKlBST0dVRUFQX1RBQkxFOworCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTiAgICAgRW5hYmxlOworCVVDSEFSICAgICAgIERlbHRhOworCUJPT0xFQU4gICAgIFBsdXNTaWduOworfSBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFLCAqUENDS19UWF9QT1dFUl9DQUxJQlJBVEU7CisKKy8vCisvLyBSZWNlaXZlIFR1cGxlIENhY2hlIEZvcm1hdAorLy8KK3R5cGVkZWYgc3RydWN0ICBfVFVQTEVfQ0FDSEUgICAgeworCUJPT0xFQU4gICAgICAgICBWYWxpZDsKKwlVQ0hBUiAgICAgICAgICAgTWFjQWRkcmVzc1tNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgICBTZXF1ZW5jZTsKKwlVU0hPUlQgICAgICAgICAgRnJhZzsKK30gVFVQTEVfQ0FDSEUsICpQVFVQTEVfQ0FDSEU7CisKKy8vCisvLyBGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0ZSQUdNRU5UX0ZSQU1FIHsKKwlQTkRJU19QQUNLRVQgICAgcEZyYWdQYWNrZXQ7CisJVUxPTkcgICAgICAgUnhTaXplOworCVVTSE9SVCAgICAgIFNlcXVlbmNlOworCVVTSE9SVCAgICAgIExhc3RGcmFnOworCVVMT05HICAgICAgIEZsYWdzOyAgICAgICAgICAvLyBTb21lIGV4dHJhIGZyYW1lIGluZm9ybWF0aW9uLiBiaXQgMDogTExDIHByZXNlbnRlZAorfSBGUkFHTUVOVF9GUkFNRSwgKlBGUkFHTUVOVF9GUkFNRTsKKworCisvLworLy8gUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1BBQ0tFVF9JTkZPICAgIHsKKwlVSU5UICAgICAgICAgICAgUGh5c2ljYWxCdWZmZXJDb3VudDsgICAgLy8gUGh5c2ljYWwgYnJlYWtzIG9mIGJ1ZmZlciBkZXNjcmlwb3IgY2hhaW5lZAorCVVJTlQgICAgICAgICAgICBCdWZmZXJDb3VudCA7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZAorCVVJTlQgICAgICAgICAgICBUb3RhbFBhY2tldExlbmd0aCA7ICAgICAvLyBTZWxmIGV4cGxhaW5lZAorCVBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXI7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGZpcnN0IGJ1ZmZlciBkZXNjcmlwdG9yCit9IFBBQ0tFVF9JTkZPLCAqUFBBQ0tFVF9JTkZPOworCisvLworLy8gVGtpcCBLZXkgc3RydWN0dXJlIHdoaWNoIFJDNCBrZXkgJiBNSUMgY2FsY3VsYXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1RLSVBfS0VZX0lORk8gIHsKKwlVSU5UICAgICAgICBuQnl0ZXNJbk07ICAvLyAjIGJ5dGVzIGluIE0gZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIElWMTY7CisJVUxPTkcgICAgICAgSVYzMjsKKwlVTE9ORyAgICAgICBLMDsgICAgICAgICAvLyBmb3IgTUlDS0VZIExvdworCVVMT05HICAgICAgIEsxOyAgICAgICAgIC8vIGZvciBNSUNLRVkgSGlnCisJVUxPTkcgICAgICAgTDsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgUjsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgTTsgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciBmb3IgTUlDS0VZCisJVUNIQVIgICAgICAgUkM0S0VZWzE2XTsKKwlVQ0hBUiAgICAgICBNSUNbOF07Cit9IFRLSVBfS0VZX0lORk8sICpQVEtJUF9LRVlfSU5GTzsKKworLy8KKy8vIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9fUFJJVkFURV9TVFJVQyB7CisJVUlOVCAgICAgICBTeXN0ZW1SZXNldENudDsgICAgICAgICAvLyBTeXN0ZW0gcmVzZXQgY291bnRlcgorCVVJTlQgICAgICAgVHhSaW5nRnVsbENudDsgICAgICAgICAgLy8gVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyCisJVUlOVCAgICAgICBQaHlSeEVyckNudDsgICAgICAgICAgICAvLyBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCisJLy8gVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYworCVVJTlQgICAgICAgRkNTQ1JDMzI7CisJQVJDRk9VUkNPTlRFWFQgIFdFUENPTlRFWFQ7CisJLy8gVGtpcCBzdHVmZgorCVRLSVBfS0VZX0lORk8gICBUeDsKKwlUS0lQX0tFWV9JTkZPICAgUng7Cit9IFBSSVZBVEVfU1RSVUMsICpQUFJJVkFURV9TVFJVQzsKKworLy8gc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykKK3R5cGVkZWYgc3RydWN0IF9CQlBfUjY2X1RVTklORyB7CisJQk9PTEVBTiAgICAgYkVuYWJsZTsKKwlVU0hPUlQgICAgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCAxMDAKKwlVU0hPUlQgICAgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCA1MTIKKwlVQ0hBUiAgICAgICBSNjZEZWx0YTsKKwlVQ0hBUiAgICAgICBSNjZDdXJyZW50VmFsdWU7CisJQk9PTEVBTgkJUjY2TG93ZXJVcHBlclNlbGVjdDsgLy9CZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuCit9IEJCUF9SNjZfVFVOSU5HLCAqUEJCUF9SNjZfVFVOSU5HOworCisvLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlcgordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfVFhfUE9XRVIgeworCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCisJVUNIQVIgICAgICBDaGFubmVsOworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlCT09MRUFOICAgICAgIGJFZmZlY3RlZENoYW5uZWw7CS8vIEZvciBCVyA0MCBvcGVyYXRpbmcgaW4gMi40R0h6ICwgdGhlICJlZmZlY3RlZCBjaGFubmVsIiBpcyB0aGUgY2hhbm5lbCB0aGF0IGlzIGNvdmVyZWQgaW4gNDBNaHouCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCUNIQVIgICAgICAgUG93ZXI7CisJQ0hBUiAgICAgICBQb3dlcjI7CisJVUNIQVIgICAgICBNYXhUeFB3cjsKKwlVQ0hBUiAgICAgIERmc1JlcTsKK30gQ0hBTk5FTF9UWF9QT1dFUiwgKlBDSEFOTkVMX1RYX1BPV0VSOworCisvLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF8xMUpfVFhfUE9XRVIgeworCVVDSEFSICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgIEJXOwkvLyBCV18xMCBvciBCV18yMAorCUNIQVIgICAgICAgUG93ZXI7CisJQ0hBUiAgICAgICBQb3dlcjI7CisJVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKK30gQ0hBTk5FTF8xMUpfVFhfUE9XRVIsICpQQ0hBTk5FTF8xMUpfVFhfUE9XRVI7CisKK3R5cGVkZWYgZW51bSBfQUJHQkFORF9TVEFURV8geworCVVOS05PV05fQkFORCwKKwlCR19CQU5ELAorCUFfQkFORCwKK30gQUJHQkFORF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RSVUNUIHsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkvLyBTVEEgc3RhdGUgbWFjaGluZXMKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBDbnRsTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBc3NvY01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXV0aFJzcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgU3luY01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgV3BhUHNrTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBMZWFwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBaXJvbmV0TWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBc3NvY0Z1bmNbQVNTT0NfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoRnVuY1tBVVRIX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aFJzcEZ1bmNbQVVUSF9SU1BfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBTeW5jRnVuY1tTWU5DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgV3BhUHNrRnVuY1tXUEFfUFNLX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWlyb25ldEZ1bmNbQUlST05FVF9GVU5DX1NJWkVdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFjdEZ1bmNbQUNUX0ZVTkNfU0laRV07CisJLy8gQWN0aW9uCisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQWN0TWFjaGluZTsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJU1RBVEVfTUFDSElORQkJCURsc01hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgRGxzRnVuY1tETFNfRlVOQ19TSVpFXTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisKKworCVVMT05HICAgICAgICAgICAgICAgICAgIENoYW5uZWxRdWFsaXR5OyAgLy8gMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZworCVVMT05HICAgICAgICAgICAgICAgICAgIE5vdzMyOyAgICAgICAgICAgLy8gbGF0Y2ggdGhlIHZhbHVlIG9mIE5kaXNHZXRTeXN0ZW1VcFRpbWUoKQorCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RTZW5kTlVMTHBzbVRpbWU7CisKKwlCT09MRUFOICAgICAgICAgICAgICAgICBiUnVubmluZzsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUYXNrTG9jazsKKwlNTE1FX1FVRVVFICAgICAgICAgICAgICBRdWV1ZTsKKworCVVJTlQgICAgICAgICAgICAgICAgICAgIFNoaWZ0UmVnOworCisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBBUFNEUGVyaW9kaWNUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rRG93blRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtVcFRpbWVyOworCVVMT05HICAgICAgICAgICAgICAgICAgIFBlcmlvZGljUm91bmQ7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgT25lU2VjUGVyaW9kaWNSb3VuZDsKKworCVVDSEFSCQkJCQlSZWFsUnhQYXRoOworCUJPT0xFQU4JCQkJCWJMb3dUaHJvdWdocHV0OworCUJPT0xFQU4JCQkJCWJFbmFibGVBdXRvQW50ZW5uYUNoZWNrOworCVJBTElOS19USU1FUl9TVFJVQ1QJCVJ4QW50RXZhbFRpbWVyOworCisjaWZkZWYgUlQyODcwCisJVUNIQVIgQ2FsaUJXNDBSZlIyNDsKKwlVQ0hBUiBDYWxpQlcyMFJmUjI0OworI2VuZGlmIC8vIFJUMjg3MCAvLworCit9IE1MTUVfU1RSVUNULCAqUE1MTUVfU1RSVUNUOworCisvLyBzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKK3R5cGVkZWYgc3RydWN0IF9SQURBUl9ERVRFQ1RfU1RSVUNUIHsKKyAgICAvL0JPT0xFQU4JCUlFRUU4MDIxMUg7CQkJLy8gMDogZGlzYWJsZSwgMTogZW5hYmxlIElFRUU4MDIuMTFoCisJVUNIQVIJCUNTQ291bnQ7CQkJLy9DaGFubmVsIHN3aXRjaCBjb3VudGVyCisJVUNIQVIJCUNTUGVyaW9kOwkJCS8vQ2hhbm5lbCBzd2l0Y2ggcGVyaW9kIChiZWFjb24gY291bnQpCisJVUNIQVIJCVJEQ291bnQ7CQkJLy9SYWRhciBkZXRlY3Rpb24gY291bnRlcgorCVVDSEFSCQlSRE1vZGU7CQkJCS8vUmFkYXIgRGV0ZWN0aW9uIG1vZGUKKwlVQ0hBUgkJUkREdXJSZWdpb247CQkvL1JhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KKwlVQ0hBUgkJQkJQUjE2OworCVVDSEFSCQlCQlBSMTc7CisJVUNIQVIJCUJCUFIxODsKKwlVQ0hBUgkJQkJQUjIxOworCVVDSEFSCQlCQlBSMjI7CisJVUNIQVIJCUJCUFI2NDsKKwlVTE9ORwkJSW5TZXJ2aWNlTW9uaXRvckNvdW50OyAvLyB1bml0OiBzZWMKKwlVSU5UOAkJRGZzU2Vzc2lvblRpbWU7CisJQk9PTEVBTgkJYkZhc3REZnM7CisJVUlOVDgJCUNoTW92aW5nVGltZTsKKwlVSU5UOAkJTG9uZ1B1bHNlUmFkYXJUaDsKK30gUkFEQVJfREVURUNUX1NUUlVDVCwgKlBSQURBUl9ERVRFQ1RfU1RSVUNUOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAordHlwZWRlZiBlbnVtIENEX1NUQVRFX24KK3sKKwlDRF9OT1JNQUwsCisJQ0RfU0lMRU5DRSwKKwlDRF9NQVhfU1RBVEUKK30gQ0RfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IENBUlJJRVJfREVURUNUSU9OX3MKK3sKKwlCT09MRUFOCQkJCQlFbmFibGU7CisJVUlOVDgJCQkJCUNEU2Vzc2lvblRpbWU7CisJVUlOVDgJCQkJCUNEUGVyaW9kOworCUNEX1NUQVRFCQkJCUNEX1N0YXRlOworfSBDQVJSSUVSX0RFVEVDVElPTiwgKlBDQVJSSUVSX0RFVEVDVElPTjsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgZW51bSBfUkVDX0JMT0NLQUNLX1NUQVRVUworeworICAgIFJlY2lwaWVudF9OT05FPTAsCisJUmVjaXBpZW50X1VTRUQsCisJUmVjaXBpZW50X0hhbmRsZVJlcywKKyAgICBSZWNpcGllbnRfQWNjZXB0Cit9IFJFQ19CTE9DS0FDS19TVEFUVVMsICpQUkVDX0JMT0NLQUNLX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9PUklfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgT3JpZ2luYXRvcl9OT05FPTAsCisJT3JpZ2luYXRvcl9VU0VELAorICAgIE9yaWdpbmF0b3JfV2FpdFJlcywKKyAgICBPcmlnaW5hdG9yX0RvbmUKK30gT1JJX0JMT0NLQUNLX1NUQVRVUywgKlBPUklfQkxPQ0tBQ0tfU1RBVFVTOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfQkFfT1JJX0VOVFJZeworCVVDSEFSICAgV2NpZDsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIEJBV2luU2l6ZTsKKwlVQ0hBUiAgIFRva2VuOworLy8gU2VxdWVuY2UgaXMgdG8gZmlsbCBldmVyeSBvdXRnb2luZyBRb1MgREFUQSBmcmFtZSdzIHNlcXVlbmNlIGZpZWxkIGluIDgwMi4xMSBoZWFkZXIuCisJVVNIT1JUCVNlcXVlbmNlOworCVVTSE9SVAlUaW1lT3V0VmFsdWU7CisJT1JJX0JMT0NLQUNLX1NUQVRVUyAgT1JJX0JBX1N0YXR1czsKKwlSQUxJTktfVElNRVJfU1RSVUNUIE9SSUJBVGltZXI7CisJUFZPSUQJcEFkYXB0ZXI7Cit9IEJBX09SSV9FTlRSWSwgKlBCQV9PUklfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9CQV9SRUNfRU5UUlkgeworCVVDSEFSICAgV2NpZDsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIEJBV2luU2l6ZTsJLy8gNy4zLjEuMTQuIGVhY2ggYnVmZmVyIGlzIGNhcGFibGUgb2YgaG9sZGluZyBhIG1heCBBTVNEVSBvciBNU0RVLgorCS8vVUNIQVIJTnVtT2ZSeFBrdDsKKwkvL1VDSEFSICAgIEN1cmluZGlkeDsgLy8gdGhlIGhlYWQgaW4gdGhlIFJYIHJlb3JkZXJpbmcgYnVmZmVyCisJVVNIT1JUCQlMYXN0SW5kU2VxOworLy8JVVNIT1JUCQlMYXN0SW5kU2VxQXRUaW1lcjsKKwlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKKwlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisJVUxPTkcJCUxhc3RJbmRTZXFBdFRpbWVyOworCVVMT05HCQluRHJvcFBhY2tldDsKKwlVTE9ORwkJcmN2U2VxOworCVJFQ19CTE9DS0FDS19TVEFUVVMgIFJFQ19CQV9TdGF0dXM7CisvLwlVQ0hBUglSeEJ1ZklkeFVzZWQ7CisJLy8gY29ycmVzcG9uZGluZyB2aXJ0dWFsIGFkZHJlc3MgZm9yIFJYIHJlb3JkZXJpbmcgcGFja2V0IHN0b3JhZ2UuCisJLy9SVE1QX1JFT1JERVJETUFCVUYgTUFQX1JYQnVmW01BWF9SWF9SRU9SREVSQlVGXTsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJlUmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCisvLwlzdHJ1Y3QgX0JBX1JFQ19FTlRSWSAqcE5leHQ7CisJUFZPSUQJcEFkYXB0ZXI7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdAlsaXN0OworfSBCQV9SRUNfRU5UUlksICpQQkFfUkVDX0VOVFJZOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVTE9ORwkJbnVtQXNSZWNpcGllbnQ7CQkvLyBJIGFtIHJlY2lwaWVudCBvZiBudW1Bc1JlY2lwaWVudCBjbGllbnRzLiBUaGVzZSBjbGllbnQgYXJlIGluIHRoZSBCQVJlY0VudHJ5W10KKwlVTE9ORwkJbnVtQXNPcmlnaW5hdG9yOwkvLyBJIGFtIG9yaWdpbmF0b3Igb2YgCW51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdCisJQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOworCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKK30gQkFfVEFCTEUsICpQQkFfVEFCTEU7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKKwlVQ0hBUiAgIHJzdjsKKwlVQ0hBUiAgIEJ1ZlNpemVbOF07CisJUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cworCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFeworCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07CisJT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKKwlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQorCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Cit9IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKKwordHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgIDo0OworCQlVSU5UMzIgICAgIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgIGJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgIE1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgIEFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgIEFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIgICAgICAgCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyICAgICAgIAlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUlOVDMyICAgICAgIAlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJVUlOVDMyICAgICAgIAliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KKwkJVUlOVDMyICAgICAgIAliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KKwkJVUlOVDMyICAgICAgIAk6NDsKKwl9CWZpZWxkOworI2VuZGlmCisJVUlOVDMyCQkJd29yZDsKK30gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKQordHlwZWRlZglzdHJ1Y3QJX0lPVF9TVFJVQwl7CisJVUNIQVIJCQlUaHJlc2hvbGRbMl07CisJVUNIQVIJCQlSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0KKwlVQ0hBUgkJCVJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdCisJVUxPTkcJCQlPbmVTZWNJbldpbmRvd0NvdW50OworCVVMT05HCQkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlVTE9ORwkJCU9uZVNlY091dFdpbmRvd0NvdW50OworCVVDSEFSCQkJRGVsT3JpQWN0OworCVVDSEFSCQkJRGVsUmVjQWN0OworCVVDSEFSCQkJUlRTU2hvcnRQcm90OworCVVDSEFSCQkJUlRTTG9uZ1Byb3Q7CisJQk9PTEVBTgkJCWJSVFNMb25nUHJvdE9uOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQliTGFzdEF0aGVyb3M7CisgICAgQk9PTEVBTgkJCWJDdXJyZW50QXRoZXJvczsKKyAgICBCT09MRUFOICAgICAgICAgYk5vd0F0aGVyb3NCdXJzdE9uOworCUJPT0xFQU4JCQliTmV4dERpc2FibGVSeEJBOworICAgIEJPT0xFQU4JCQliVG9nZ2xlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBJT1RfU1RSVUMsICpQSU9UX1NUUlVDOworCisvLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCit0eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorIHN0cnVjdCB7CisgICAgICAgICBVSU5UMzIgIHJzdjoxMzsKKwkJIFVJTlQzMiAgRVhUQ0hBOjI7CisJCSBVSU5UMzIgIEhUTU9ERToxOworCQkgVUlOVDMyICBUUkFOU05POjI7CisJCSBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorCQkgVUlOVDMyICBTaG9ydEdJOjE7CisJCSBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJCSBVSU5UMzIgIFR4QkY6MTsgLy8gMyozCisJCSBVSU5UMzIgIHJzdjA6MTA7CisJCSAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKyAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7CisgICAgfSBmaWVsZDsKKyNlbHNlCisgc3RydWN0IHsKKyAgICAgICAgIC8vVUlOVDMyICBQaHlNb2RlOjQ7CisgICAgICAgICAvL1VJTlQzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKwkJIFVJTlQzMiAgVHhCRjoxOworICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7CisgICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7CisgICAgICAgICBVSU5UMzIgIEhUTU9ERToxOworICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworICAgIH0gZmllbGQ7CisjZW5kaWYKKyBVSU5UMzIgICB3b3JkOworfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiB1bmlvbiAgX0RFU0lSRURfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCQlVU0hPUlQJCXJzdjozOworCQkJVVNIT1JUCQlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIAkvLyBNQ1MKKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUCSAJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCisJCQlVU0hPUlQJCXJzdjozOworCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJSXNSZWNpcGllbnQ7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBuTVNEVTsKKwlVU0hPUlQgICBUaW1lT3V0OworCUJPT0xFQU4gYkFsbFRpZDsgIC8vIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4KK30gT0lEX0FERF9CQV9FTlRSWSwgKlBPSURfQUREX0JBX0VOVFJZOworCisvLworLy8gTXVsdGlwbGUgU1NJRCBzdHJ1Y3R1cmUKKy8vCisjZGVmaW5lIFdMQU5fTUFYX05VTV9PRl9USU0JCQkoKE1BWF9MRU5fT0ZfTUFDX1RBQkxFID4+IDMpICsgMSkgLyogLzggKyAxICovCisjZGVmaW5lIFdMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUCQkwIC8qIHVuaXQ6IDMyQiAqLworCisvKiBjbGVhciBiY21jIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19DTEVBUihhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSAmPSB+QklUOFswXTsKKworLyogc2V0IGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX1NFVChhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSB8PSBCSVQ4WzBdOworCisvKiBjbGVhciBhIHN0YXRpb24gUFMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfQ0xFQVIoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdICY9ICh+QklUOFtiaXRfb2Zmc2V0XSk7IH0KKworLyogc2V0IGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9TRVQoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdIHw9IEJJVDhbYml0X29mZnNldF07IH0KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBCRUFDT05fQklUTUFQX01BU0sJCTB4ZmYKK3R5cGVkZWYgc3RydWN0IF9CRUFDT05fU1lOQ19TVFJVQ1RfCit7CisJVUNIQVIgICAgICAgIAkJCUJlYWNvbkJ1ZltIV19CRUFDT05fTUFYX0NPVU5UXVtIV19CRUFDT05fT0ZGU0VUXTsKKwlVQ0hBUgkJCQkJQmVhY29uVHhXSVtIV19CRUFDT05fTUFYX0NPVU5UXVtUWFdJX1NJWkVdOworCVVMT05HIAkJCQkJVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCVVMT05HCQkJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07CisJQk9PTEVBTgkJCQkJRW5hYmxlQmVhY29uOwkJLy8gdHJpZ2dlciB0byBlbmFibGUgYmVhY29uIHRyYW5zbWlzc2lvbi4KKwlVQ0hBUgkJCQkJQmVhY29uQml0TWFwOwkJLy8gTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLgorCVVDSEFSCQkJCQlEdGltQml0T247CQkJLy8gTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLgorfUJFQUNPTl9TWU5DX1NUUlVDVDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX01VTFRJU1NJRF9TVFJVQ1QgeworCVVDSEFSCQkJCQkJCQlCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzaWRMZW47CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCisgICAgUE5FVF9ERVYgICAgICAgICAgICAgICAgICAgCQkJTVNTSUREZXY7CisKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlHcm91cEtleVdlcFN0YXR1czsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQkJCQlXcGFNaXhQYWlyQ2lwaGVyOworCisJVUxPTkcJCQkJCQkJCVR4Q291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4Q291bnQ7CisJVUxPTkcJCQkJCQkJCVJlY2VpdmVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlUcmFuc21pdHRlZEJ5dGVDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhFcnJvckNvdW50OworCVVMT05HCQkJCQkJCQlSeERyb3BDb3VudDsKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKwlSVF9IVF9QSFlfSU5GTwkJCQkJCURlc2lyZWRIdFBoeUluZm87CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwlCT09MRUFOCQkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCS8vQ0lQSEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkS2V5W1NIQVJFX0tFWV9OVU1dOyAvLyByZWYgcEFkLT5TaGFyZWRLZXlbQlNTXVs0XQorCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKworCVVDSEFSCQkJCQkJCQlUeFJhdGU7ICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMSwgLi4uCisJVUNIQVIgICAgIAkJCQkJCQlEZXNpcmVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOy8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUworCVVDSEFSCQkJCQkJCQlEZXNpcmVkUmF0ZXNJbmRleDsKKwlVQ0hBUiAgICAgCQkJCQkJCU1heFR4UmF0ZTsgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKworLy8JVUxPTkcgICAgICAgICAgIAkJCQkJVGltQml0bWFwOyAgICAgIC8vIGJpdDAgZm9yIGJyb2FkY2FzdCwgMSBmb3IgQUlEMSwgMiBmb3IgQUlEMiwgLi4uc28gb24KKy8vICAgIFVMT05HICAgICAgICAgICAJCQkJCVRpbUJpdG1hcDI7ICAgICAvLyBiMCBmb3IgQUlEMzIsIGIxIGZvciBBSUQzMywgLi4uIGFuZCBzbyBvbgorCVVDSEFSCQkJCQkJCQlUaW1CaXRtYXBzW1dMQU5fTUFYX05VTV9PRl9USU1dOworCisgICAgLy8gV1BBCisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01LWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUtbMzJdOworCVVDSEFSCQkJCQkJCQlHVEtbMzJdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxWDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVBdXRoOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdOb25jZVszMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFNlY3VyZWQ7CisgICAgTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQU5DbGFzczNEYXRhOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7CisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05JRV9MZW5bMl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOX0lFWzJdW01BWF9MRU5fT0ZfUlNOSUVdOworCisKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb247CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOworICAgIC8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhXSQorCS8vIFBUWFdJX1NUUlVDICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uVHhXSTsgLy8KKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25CdWZbTUFYX0JFQUNPTl9TSVpFXTsgLy8gTk9URTogQmVhY29uQnVmIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZAorCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpZGVTc2lkOworCVVJTlQxNgkJCQkJCQkJU3RhdGlvbktlZXBBbGl2ZVRpbWU7IC8vIHVuaXQ6IHNlY29uZAorCisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9WSUQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkxBTl9Qcmlvcml0eTsKKworICAgIFJUXzgwMl8xMV9BQ0wJCQkJCQlBY2Nlc3NDb250cm9sTGlzdDsKKworCS8vIEVEQ0EgUW9zCisgICAgQk9PTEVBTgkJCQkJCQkJYldtbUNhcGFibGU7CS8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQorICAgIEJPT0xFQU4JCQkJCQkJCWJETFNDYXBhYmxlOwkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKKworCVVDSEFSICAgICAgICAgICAJCQkJCURsc1BUS1s2NF07CQkvLyBEdWUgdG8gd2luZG93cyBkaXJ2ZXIgY291bnQgb24gbWVldGluZ2hvdXNlIHRvIGhhbmRsZSA0LXdheSBzaGFrZQorCisJLy8gRm9yIDgwMi4xeCBkYWVtb24gc2V0dGluZyBwZXIgQlNTCisJVUNIQVIJCQkJCQkJCXJhZGl1c19zcnZfbnVtOworCVJBRElVU19TUlZfSU5GTwkJCQkJCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCisjaWZkZWYgUlRMODY1WF9TT0MKKwl1bnNpZ25lZCBpbnQJCQkJCQlteWxpbmtpZDsKKyNlbmRpZgorCisKKwlVSU5UMzIJCQkJCVJjdmRDb25mbGljdFNzaWRDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXNzb2NSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFByb2JlUmVzcENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRCZWFjb25Db3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGlzYXNzb2NDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREZWF1dGhDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkVW5rbm93bk1nbXRDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRSZXBsYXlBdHRhY2tDb3VudDsKKworCUNIQVIJCQkJCVJzc2lPZlJjdmRDb25mbGljdFNzaWQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBc3NvY1Jlc3A7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRSZWFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFByb2JlUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEJlYWNvbjsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERpc2Fzc29jOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXV0aDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERlYXV0aDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFVua25vd25NZ210OworCUNIQVIJCQkJCVJzc2lPZlJjdmRSZXBsYXlBdHRhY2s7CisKKwlCT09MRUFOCQkJCQliQmNuU250UmVxOworCVVDSEFSCQkJCQlCY25CdWZJZHg7Cit9IE1VTFRJU1NJRF9TVFJVQ1QsICpQTVVMVElTU0lEX1NUUlVDVDsKKworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCit0eXBlZGVmIGVudW0gX0JTUzIwNDBDT0VYSVNUX0ZMQUd7CisJQlNTXzIwNDBfQ09FWElTVF9ESVNBQkxFID0gMCwKKwlCU1NfMjA0MF9DT0VYSVNUX1RJTUVSX0ZJUkVEICA9IDEsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX1NZTkMgPSAyLAorCUJTU18yMDQwX0NPRVhJU1RfSU5GT19OT1RJRlkgPSA0LAorfUJTUzIwNDBDT0VYSVNUX0ZMQUc7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvLyBjb25maWd1cmF0aW9uIGNvbW1vbiB0byBPUE1PREVfQVAgYXMgd2VsbCBhcyBPUE1PREVfU1RBCit0eXBlZGVmIHN0cnVjdCBfQ09NTU9OX0NPTkZJRyB7CisKKwlCT09MRUFOCQliQ291bnRyeUZsYWc7CisJVUNIQVIJCUNvdW50cnlDb2RlWzNdOworCVVDSEFSCQlHZW9ncmFwaHk7CisJVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbjsgICAgICAvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uLCAwOkZDQywgMTpJQywgMjpFVFNJLCAzOlNQQUlOLCA0OkZyYW5jZSwgNTpNS0ssIDY6TUtLMSwgNzpJc3JhZWwKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uRm9yQUJhbmQ7CS8vIEVudW0gb2YgY291bnRyeSByZWdpb24gZm9yIEEgYmFuZAorCVVDSEFSICAgICAgIFBoeU1vZGU7ICAgICAgICAgICAgLy8gUEhZXzExQSwgUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV9BQkdfTUlYRUQKKwlVU0hPUlQgICAgICBEc2lmczsgICAgICAgICAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKKwlVTE9ORyAgICAgICBQYWNrZXRGaWx0ZXI7ICAgICAgIC8vIFBhY2tldCBmaWx0ZXIgZm9yIHJlY2VpdmluZworCisJQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCisJVUNIQVIgICAgICAgU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlVQ0hBUiAgICAgICBMYXN0U3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlDSEFSICAgICAgICBMYXN0U3NpZFtNQVhfTEVOX09GX1NTSURdOyAvLyBOT1QgTlVMTC10ZXJtaW5hdGVkCisJVUNIQVIJCUxhc3RCc3NpZFtNQUNfQUREUl9MRU5dOworCisJVUNIQVIgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBCZWFjb25QZXJpb2Q7CisJVUNIQVIgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICBDZW50cmFsQ2hhbm5lbDsgICAgCS8vIENlbnRyYWwgQ2hhbm5lbCB3aGVuIHVzaW5nIDQwTUh6IGlzIGluZGljYXRpbmcuIG5vdCByZWFsIGNoYW5uZWwuCisKKyNpZiAwCS8vIG1vdmUgdG8gU1RBX0FETUlOX0NPTkZJRworCVVDSEFSICAgICAgIERlZmF1bHRLZXlJZDsKKworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7ICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCU9yaWdXZXBTdGF0dXM7CS8vIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lECisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBHcm91cEtleVdlcFN0YXR1czsKKyNlbmRpZgorCisJVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgIERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOyAgICAgIC8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUworCVVDSEFSICAgICAgIE1heERlc2lyZWRSYXRlOworCVVDSEFSICAgICAgIEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisKKwlVTE9ORyAgICAgICBCYXNpY1JhdGVCaXRtYXA7ICAgICAgICAvLyBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcAorCisJQk9PTEVBTgkJYkFQU0RDYXBhYmxlOworCUJPT0xFQU4JCWJJblNlcnZpY2VQZXJpb2Q7CisJQk9PTEVBTgkJYkFQU0RBQ19CRTsKKwlCT09MRUFOCQliQVBTREFDX0JLOworCUJPT0xFQU4JCWJBUFNEQUNfVkk7CisJQk9PTEVBTgkJYkFQU0RBQ19WTzsKKwlCT09MRUFOCQliTmVlZFNlbmRUcmlnZ2VyRnJhbWU7CisJQk9PTEVBTgkJYkFQU0RGb3JjZVBvd2VyU2F2ZTsJLy8gRm9yY2UgcG93ZXIgc2F2ZSBtb2RlLCBzaG91bGQgb25seSB1c2UgaW4gQVBTRC1TVEFVVAorCVVMT05HCQlUcmlnZ2VyVGltZXJDb3VudDsKKwlVQ0hBUgkJTWF4U1BMZW5ndGg7CisJVUNIQVIJCUJCUEN1cnJlbnRCVzsJLy8gQldfMTAsIAlCV18yMCwgQldfNDAKKwkvLyBtb3ZlIHRvIE1VTFRJU1NJRF9TVFJVQ1QgZm9yIE1CU1MKKwkvL0hUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCVJFR19UUkFOU01JVF9TRVRUSU5HICAgICAgICBSZWdUcmFuc21pdFNldHRpbmc7IC8vcmVnaXN0cnkgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCisJLy9VQ0hBUiAgICAgICBGaXhlZFR4TW9kZTsgICAgICAgICAgICAgIC8vIEZpeGVkIFR4IE1vZGUgKENDSywgT0ZETSksIGZvciBIVCBmaXhlZCB0eCBtb2RlIChHRiwgTUlYKSAsIHJlZmVyIHRvIFJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1vZGUKKwlVQ0hBUiAgICAgICBUeFJhdGU7ICAgICAgICAgICAgICAgICAvLyBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQKKwlVQ0hBUiAgICAgICBNYXhUeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBUeFJhdGVJbmRleDsgICAgICAgICAgICAvLyBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZQorCVVDSEFSICAgICAgIFR4UmF0ZVRhYmxlU2l6ZTsgICAgICAgIC8vIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUKKwkvL0JPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOworCVVDSEFSICAgICAgIE1pblR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCVVDSEFSICAgICAgIFJ0c1JhdGU7ICAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4CisJSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvLyBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpbiBhdCBIdCByYXRlLgorCVVDSEFSICAgICAgIE1sbWVSYXRlOyAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMKKwlVQ0hBUiAgICAgICBCYXNpY01sbWVSYXRlOyAgICAgICAgICAvLyBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMKKworCVVTSE9SVCAgICAgIFJ0c1RocmVzaG9sZDsgICAgICAgICAgIC8vIGluIHVuaXQgb2YgQllURQorCVVTSE9SVCAgICAgIEZyYWdtZW50VGhyZXNob2xkOyAgICAgIC8vIGluIHVuaXQgb2YgQllURQorCisJVUNIQVIgICAgICAgVHhQb3dlcjsgICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBtVworCVVMT05HICAgICAgIFR4UG93ZXJQZXJjZW50YWdlOyAgICAgIC8vIDB+MTAwICUKKwlVTE9ORyAgICAgICBUeFBvd2VyRGVmYXVsdDsgICAgICAgICAvLyBrZWVwIGZvciBUeFBvd2VyUGVyY2VudGFnZQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFDQVBfU1RSVUMgICAgICAgIEJBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAorCUJBQ0FQX1NUUlVDICAgICAgICBSRUdCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlJT1RfU1RSVUMJCUlPVGVzdFBhcm07CS8vIDgwMi4xMW4gSW50ZXJPcGJpbGl0eSBUZXN0IFBhcmFtZXRlcjsKKwlVTE9ORyAgICAgICBUeFByZWFtYmxlOyAgICAgICAgICAgICAvLyBSdDgwMl8xMVByZWFtYmxlTG9uZywgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LCBSdDgwMl8xMVByZWFtYmxlQXV0bworCUJPT0xFQU4gICAgIGJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQ7ICAgICAvLyBNaWNyb3NvZnQgdXNlIDAgYXMgZGlzYWJsZQorCVVMT05HICAgICAgIFVzZUJHUHJvdGVjdGlvbjsgICAgICAgIC8vIDA6IGF1dG8sIDE6IGFsd2F5cyB1c2UsIDI6IGFsd2F5cyBub3QgdXNlCisJQk9PTEVBTiAgICAgYlVzZVNob3J0U2xvdFRpbWU7ICAgICAgLy8gMDogZGlzYWJsZSwgMSAtIHVzZSBzaG9ydCBzbG90ICg5dXMpCisJQk9PTEVBTiAgICAgYkVuYWJsZVR4QnVyc3Q7ICAgICAgICAgLy8gMTogZW5ibGUgVFggUEFDS0VUIEJVUlNULCAwOiBkaXNhYmxlIFRYIFBBQ0tFVCBCVVJTVAorCUJPT0xFQU4gICAgIGJBZ2dyZWdhdGlvbkNhcGFibGU7ICAgICAgLy8gMTogZW5hYmxlIFRYIGFnZ3JlZ2F0aW9uIHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgaXQKKwlCT09MRUFOICAgICBiUGlnZ3lCYWNrQ2FwYWJsZTsJCS8vIDE6IGVuYWJsZSBUWCBwaWdneS1iYWNrIGFjY29yZGluZyBNQUMncyB2ZXJzaW9uCisJQk9PTEVBTiAgICAgYklFRUU4MDIxMUg7CQkJLy8gMTogZW5hYmxlIElFRUU4MDIuMTFoIHNwZWMuCisJVUxPTkcJCURpc2FibGVPTEJDRGV0ZWN0OwkJLy8gMDogZW5hYmxlIE9MQkMgZGV0ZWN0OyAxIGRpc2FibGUgT0xCQyBkZXRlY3QKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQkJYlJkZzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlCT09MRUFOICAgICAgICAgICAgIGJXbW1DYXBhYmxlOyAgICAgICAgLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisJUU9TX0NBUEFCSUxJVFlfUEFSTSBBUFFvc0NhcGFiaWxpdHk7ICAgIC8vIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlFRENBX1BBUk0gICAgICAgICAgIEFQRWRjYVBhcm07ICAgICAgICAgLy8gRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlRQlNTX0xPQURfUEFSTSAgICAgIEFQUWJzc0xvYWQ7ICAgICAgICAgLy8gUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKKwlVQ0hBUiAgICAgICAgICAgICAgIEFja1BvbGljeVs0XTsgICAgICAgLy8gQUNLIHBvbGljeSBvZiB0aGUgc3BlY2lmaWVkIEFDLiBzZWUgQUNLX3h4eAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQkJYkRMU0NhcGFibGU7CQkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKKwkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCisJLy8gT1BTVEFUVVNfVEVTVF9GTEFHKCksIE9QU1RBVFVTX1NFVF9GTEFHKCksIE9QX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgorCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24KKwlVTE9ORyAgICAgICAgICAgICAgIE9wU3RhdHVzRmxhZ3M7CisKKwlCT09MRUFOCQkJCU5kaXNSYWRpb1N0YXRlT2ZmOyAvL0ZvciBIQ1QgMTIuMCwgc2V0IHRoaXMgZmxhZyB0byBUUlVFIGluc3RlYWQgb2YgY2FsbGVkIE1sbWVSYWRpb09mZi4KKwlBQkdCQU5EX1NUQVRFCQlCYW5kU3RhdGU7CQkvLyBGb3Igc2V0dGluZyBCQlAgdXNlZCBvbiBCL0cgb3IgQSBtb2RlLgorCisJLy8gSUVFRTgwMi4xMUgtLURGUy4KKwlSQURBUl9ERVRFQ1RfU1RSVUNUCVJhZGFyRGV0ZWN0OworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCUNBUlJJRVJfREVURUNUSU9OCQlDYXJyaWVyRGV0ZWN0OworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEhUCisJVUNIQVIJCQlCQVNpemU7CQkvLyBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkKKwkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJUlRfSFRfQ0FQQUJJTElUWQlEZXNpcmVkSHRQaHk7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIVEluZm87CS8vIFVzZWZ1bCBhcyBBUC4KKwkvL1RoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouCisJLy9UaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLgorCU5FV19FWFRfQ0hBTl9JRQlOZXdFeHRDaGFuT2Zmc2V0OwkvLzcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJCQkJCUJzczIwNDBDb2V4aXN0RmxhZzsJCS8vIGJpdCAwOiBiQnNzQ29leGlzdFRpbWVyUnVubmluZywgYml0IDE6IE5lZWRTeW5jQWRkSHRJbmZvLgorCVJBTElOS19USU1FUl9TVFJVQ1QJQnNzMjA0MENvZXhpc3RUaW1lcjsKKworCS8vVGhpcyBJRSBpcyB1c2VkIGZvciAyMC80MCBCU1MgQ29leGlzdGVuY2UuCisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTMjA0MENvZXhpc3RJbmZvOworCS8vID09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PT4KKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gNX4xMDAwCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGw7CQkJCS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50OwkJCS8vIFVuaXQgOiBTZWNvbmQKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwMH4xMDAwMAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCVVTSE9SVAkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3I7CisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZpdHlUaHJlOwkJCQkvLyBVbml0IDogcGVyY2VudGFnZQorCisJVUxPTkcJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OwkJCS8vIG11bHRpcGxlIG9mIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKKwlVTE9ORwkJCQkJQ291bnREb3duQ3RyOwkvLyBDb3VudERvd24gQ291bnRlciBmcm9tIChEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcikKKworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRyaWdnZXJFdmVudFRhYkxvY2s7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJTGFzdEJTU0NvZXhpc3QyMDQwOworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTU0NvZXhpc3QyMDQwOworCVRSSUdHRVJfRVZFTlRfVEFCCQlUcmlnZ2VyRXZlbnRUYWI7CisJVUNIQVIJCQkJCUNoYW5uZWxMaXN0SWR4OworCS8vIDw9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0KKwlCT09MRUFOCQkJCQliT3ZlcmxhcFNjYW5uaW5nOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJIVFByb3RlY3Q7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYk1JTU9QU0VuYWJsZTsKKyAgICBCT09MRUFOCQkJCQliQkFEZWNsaW5lOworCUJPT0xFQU4JCQkJCWJEaXNhYmxlUmVvcmRlcmluZzsKKwlCT09MRUFOCQkJCQliRm9ydHlfTWh6X0ludG9sZXJhbnQ7CisJQk9PTEVBTgkJCQkJYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQ7CisJQk9PTEVBTgkJCQkJYlJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50czsKKwlVTE9ORwkJCQkJTGFzdFJjdkJTU1dpZHRoVHJpZ2dlckV2ZW50c1RpbWU7CisKKwlVQ0hBUgkJCQkJVHhCQVNpemU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBFbmFibGUgd2lyZWxlc3MgZXZlbnQKKwlCT09MRUFOCQkJCWJXaXJlbGVzc0V2ZW50OworCUJPT0xFQU4JCQkJYldpRmlUZXN0OwkJCQkvLyBFbmFibGUgdGhpcyBwYXJhbWV0ZXIgZm9yIFdpRmkgdGVzdAorCisJLy8gVHggJiBSeCBTdHJlYW0gbnVtYmVyIHNlbGVjdGlvbgorCVVDSEFSCQkJCVR4U3RyZWFtOworCVVDSEFSCQkJCVJ4U3RyZWFtOworCisJLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgorI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0TWNzOworCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRQaHlNb2RlOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworCUJPT0xFQU4gICAgIAkJYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKKworI2lmZGVmIFJUMjg3MAorCUJPT0xFQU4gICAgIAkJYk11bHRpcGxlSVJQOyAgICAgICAvLyBNdWx0aXBsZSBCdWxrIElOIGZsYWcKKwlVQ0hBUiAgICAgICAJCU51bU9mQnVsa0luSVJQOyAgICAgLy8gaWYgYk11bHRpcGxlSVJQID09IFRSVUUsIE51bU9mQnVsa0luSVJQIHdpbGwgYmUgNCBvdGhlcndpc2UgYmUgMQorIAlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCVVMT05HCQkJCU1heFBrdE9uZVR4QnVsazsKKwlVQ0hBUgkJCQlUeEJ1bGtGYWN0b3I7CisJVUNIQVIJCQkJUnhCdWxrRmFjdG9yOworCisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlSQUxJTktfVElNRVJfU1RSVUNUCUJlYWNvblVwZGF0ZVRpbWVyOworCVVJTlQzMgkJCQlCZWFjb25BZGp1c3Q7CisJVUlOVDMyCQkJCUJlYWNvbkZhY3RvcjsKKwlVSU5UMzIJCQkJQmVhY29uUmVtYWluOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyAJTkRJU19TUElOX0xPQ0sJCQlNZWFzdXJlUmVxVGFiTG9jazsKKwlQTUVBU1VSRV9SRVFfVEFCCQlwTWVhc3VyZVJlcVRhYjsKKworCU5ESVNfU1BJTl9MT0NLCQkJVHBjUmVxVGFiTG9jazsKKwlQVFBDX1JFUV9UQUIJCQlwVHBjUmVxVGFiOworCisJLy8gdHJhbnNtaXQgcGh5IG1vZGUsIHRyYXNtaXQgcmF0ZSBmb3IgTXVsdGljYXN0LgorI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCU1DYXN0UGh5TW9kZTsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKyNpZmRlZiBTSU5HTEVfU0tVCisJVUlOVDE2CQkJCQlEZWZpbmVNYXhUeFB3cjsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKworfSBDT01NT05fQ09ORklHLCAqUENPTU1PTl9DT05GSUc7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyogTW9kaWZpZWQgYnkgV3UgWGktS3VuIDQvMjEvMjAwNiAqLworLy8gU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cwordHlwZWRlZiBzdHJ1Y3QgX1NUQV9BRE1JTl9DT05GSUcgeworCS8vIEdST1VQIDEgLQorCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKKwkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbAorCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlcgorCS8vICAgQVAgb3IgSUJTUyBob2xkZXIpLgorCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKKwlVQ0hBUiAgICAgICBCc3NUeXBlOyAgICAgICAgICAgICAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQworCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgIC8vIHVzZWQgd2hlbiBzdGFydGluZyBhIG5ldyBJQlNTCisKKwkvLyBHUk9VUCAyIC0KKwkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCisJLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBhbmQgc2hvdWxkIGJlIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBmaW5hbAorCS8vICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyB3aXRob3V0IGNvbXByb21pc2luZyB3aXRoIHRoZSBCU1MgaG9sZGVyLgorCS8vICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHgKKwlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlcjsKKwlVQ0hBUiAgICAgICBSc3NpVHJpZ2dlck1vZGU7ICAgICAgLy8gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQgb3IgUlNTSV9UUklHR0VSRURfVVBPTl9FWENDRUVEX1RIUkVTSE9MRAorCVVTSE9SVCAgICAgIERlZmF1bHRMaXN0ZW5Db3VudDsgICAvLyBkZWZhdWx0IGxpc3RlbiBjb3VudDsKKwlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJNb2RlOyAgICAgICAgICAgLy8gUG93ZXIgbW9kZSBmb3IgQUMgcG93ZXIKKwlVTE9ORyAgICAgICBXaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsgICAgLy8gUG93ZXIgbW9kZSBmb3IgYmF0dGVyeSBpZiBleGlzdHMKKwlCT09MRUFOICAgICBiV2luZG93c0FDQ0FNRW5hYmxlOyAgICAgICAgLy8gRW5hYmxlIENBTSBwb3dlciBtb2RlIHdoZW4gQUMgb24KKwlCT09MRUFOICAgICBiQXV0b1JlY29ubmVjdDsgICAgICAgICAvLyBTZXQgdG8gVFJVRSB3aGVuIHNldHRpbmcgT0lEXzgwMl8xMV9TU0lEIHdpdGggbm8gbWF0Y2hpbmcgQlNTSUQKKwlVTE9ORyAgICAgICBXaW5kb3dzUG93ZXJQcm9maWxlOyAgICAvLyBXaW5kb3dzIHBvd2VyIHByb2ZpbGUsIGZvciBORElTNS4xIFBuUAorCisJLy8gTUlCOmllZWU4MDJkb3QxMS5kb3QxMXNtdCgxKS5kb3QxMVN0YXRpb25Db25maWdUYWJsZSgxKQorCVVTSE9SVCAgICAgIFBzbTsgICAgICAgICAgICAgICAgICAvLyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgICAoUFdSX0FDVElWRXxQV1JfU0FWRSkKKwlVU0hPUlQgICAgICBEaXNhc3NvY1JlYXNvbjsKKwlVQ0hBUiAgICAgICBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIERlYXV0aFJlYXNvbjsKKwlVQ0hBUiAgICAgICBEZWF1dGhTdGFbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBBdXRoRmFpbFJlYXNvbjsKKwlVQ0hBUiAgICAgICBBdXRoRmFpbFN0YVtNQUNfQUREUl9MRU5dOworCisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOworCisJVUNIQVIJCVBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKKwlVQ0hBUiAgICAgICBQVEtbNjRdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUFRLCisJVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKwlCU1NJRF9JTkZPCVNhdmVkUE1LW1BNS0lEX05PXTsKKwlVSU5UCQlTYXZlZFBNS051bTsJCQkvLyBTYXZlZCBQTUtJRCBudW1iZXIKKworCVVDSEFSCQlEZWZhdWx0S2V5SWQ7CisKKworCS8vIFdQQSA4MDIuMXggcG9ydCBjb250cm9sLCBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCwgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVECisJVUNIQVIgICAgICAgUG9ydFNlY3VyZWQ7CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwlVTE9ORyAgICAgICBNaWNFcnJDbnQ7ICAgICAgICAgIC8vIFNob3VsZCBiZSAwLCAxLCAyLCB0aGVuIHJlc2V0IHRvIHplcm8gKGFmdGVyIGRpc2Fzc29pY2lhdGlvbikuCisJQk9PTEVBTiAgICAgYkJsb2NrQXNzb2M7ICAgICAgICAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCVdQQV9TVEFURSAgIFdwYVN0YXRlOyAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBTU19OT1RVU0UgYW5kIGhhbmRsZWQgYnkgbWljcm9zb2Z0IDgwMi4xeAorCVVDSEFSICAgICAgIFJlcGxheUNvdW50ZXJbOF07CisJVUNIQVIgICAgICAgQU5vbmNlWzMyXTsgICAgICAgICAvLyBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXJoZW50aWNhdG9yCisJVUNIQVIgICAgICAgU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKKworCVVDSEFSICAgICAgIExhc3RTTlIwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUgorCVVDSEFSICAgICAgIExhc3RTTlIxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SIGZvciAybmQgIGFudGVubmEKKwlSU1NJX1NBTVBMRSBSc3NpU2FtcGxlOworCVVMT05HICAgICAgIE51bU9mQXZnUnNzaVNhbXBsZTsKKworCVVMT05HICAgICAgIExhc3RCZWFjb25SeFRpbWU7ICAgICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBCRUFDT04gUlggdGltZQorCVVMT05HICAgICAgIExhc3QxMWJCZWFjb25SeFRpbWU7ICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUIgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORwkJTGFzdDExZ0JlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFHIEJFQUNPTiBSWCB0aW1lCisJVUxPTkcJCUxhc3QyME5CZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDIwTUh6IE4gQkVBQ09OIFJYIHRpbWUKKworCVVMT05HICAgICAgIExhc3RTY2FuVGltZTsgICAgICAgLy8gUmVjb3JkIGxhc3Qgc2NhbiB0aW1lIGZvciBpc3N1ZSBCU1NJRF9TQ0FOX0xJU1QKKwlVTE9ORyAgICAgICBTY2FuQ250OyAgICAgICAgICAgIC8vIFNjYW4gY291bnRzIHNpbmNlIG1vc3QgcmVjZW50IFNTSUQsIEJTU0lELCBTQ0FOIE9JRCByZXF1ZXN0CisJQk9PTEVBTiAgICAgYlN3UmFkaW87ICAgICAgICAgICAvLyBTb2Z0d2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KKwlCT09MRUFOICAgICBiSHdSYWRpbzsgICAgICAgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgorCUJPT0xFQU4gICAgIGJSYWRpbzsgICAgICAgICAgICAgLy8gUmFkaW8gc3RhdGUsIEFuZCBvZiBTdyAmIEh3IHJhZGlvIHN0YXRlCisJQk9PTEVBTiAgICAgYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKKwlCT09MRUFOICAgICBiU2hvd0hpZGRlblNTSUQ7ICAgIC8vIFNob3cgYWxsIGtub3duIFNTSUQgaW4gU1NJRCBsaXN0IGdldCBvcGVyYXRpb24KKworCisJLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAorCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKKwlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOworCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKKworCVVDSEFSICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCisJLy8gTmV3IHZhcmlhYmxlcyB1c2VkIGZvciBDQ1ggMS4wCisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcE9uOworCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBDbWljT247CisJVUNIQVIgICAgICAgICAgICAgICBDa2lwRmxhZzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEdJVlszXTsgIC8vZm9yIENDWCBpdgorCVVDSEFSICAgICAgICAgICAgICAgUnhTRVFbNF07CisJVUNIQVIgICAgICAgICAgICAgICBUeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIENLSVBNSUNbNF07CisJVUNIQVIgICAgICAgICAgICAgICBMZWFwQXV0aE1vZGU7CisJTEVBUF9BVVRIX0lORk8gICAgICBMZWFwQXV0aEluZm87CisJVUNIQVIgICAgICAgICAgICAgICBIYXNoUHdkWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VbOF07CisJVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVs4XTsKKworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVJlc3BvbnNlWzI0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFNlc3Npb25LZXlbMTZdOyAvL05ldHdvcmsgc2Vzc2lvbiBrZXlzIChOU0spCisJUkFMSU5LX1RJTUVSX1NUUlVDVCBMZWFwQXV0aFRpbWVyOworCVJPR1VFQVBfVEFCTEUgICAgICAgUm9ndWVBcFRhYjsgICAvL0Npc2NvIENDWDEgUm9ndWUgQVAgRGV0ZWN0aW9uCisKKwkvLyBOZXcgY29udHJvbCBmbGFncyBmb3IgQ0NYCisJQ0NYX0NPTlRST0wgICAgICAgICBDQ1hDb250cm9sOyAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIGFkbWluaXN0cmF0aW9uIHN0YXRlCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hFbmFibGU7ICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIENDWCBzdGF0ZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYU2NhbkNoYW5uZWw7ICAgICAgICAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgZm9yIENDWCBiZWFjb24gcmVxdWVzdAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYU2NhblRpbWU7ICAgICAgICAgICAgICAgIC8vIFRpbWUgb3V0IHRvIHdhaXQgZm9yIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFJlcVR5cGU7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHByb2Nlc3NpbmcgQ0NYIHJlcXVlc3QgdHlwZQorCUJTU19UQUJMRSAgICAgICAgICAgQ0NYQnNzVGFiOyAgICAgICAgICAgICAgICAgIC8vIEJTUyBUYWJsZQorCVVDSEFSICAgICAgICAgICAgICAgRnJhbWVSZXBvcnRCdWZbMjA0OF07ICAgICAgIC8vIEJ1ZmZlciBmb3IgY3JlYXRpbmcgZnJhbWUgcmVwb3J0CisJVVNIT1JUICAgICAgICAgICAgICBGcmFtZVJlcG9ydExlbjsgICAgICAgICAgICAgLy8gQ3VycmVudCBGcmFtZSByZXBvcnQgbGVuZ3RoCisJVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCisJVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KKwkvLyBTdGFydCBhZGRyZXNzIG9mIGVhY2ggQlNTIHRhYmxlIHdpdGhpbiBGcmFtZVJlcG9ydEJ1ZgorCS8vIEl0J3MgaW1wb3J0YW50IHRvIHVwZGF0ZSB0aGUgUnhQb3dlciBvZiB0aGUgY29ycmVzcG9uZGluZyBCc3MKKwlVU0hPUlQgICAgICAgICAgICAgIEJzc1JlcG9ydE9mZnNldFtNQVhfTEVOX09GX0JTU19UQUJMRV07CisJVVNIT1JUICAgICAgICAgICAgICBCZWFjb25Ub2tlbjsgICAgICAgICAgICAgICAgLy8gVG9rZW4gZm9yIGJlYWNvbiByZXBvcnQKKwlVTE9ORyAgICAgICAgICAgICAgIExhc3RCc3NJbmRleDsgICAgICAgICAgICAgICAvLyBNb3N0IGN1cnJlbnQgcmVwb3J0ZWQgQnNzIGluZGV4CisJUk1fUkVRVUVTVF9BQ1RJT04gICBNZWFzdXJlbWVudFJlcXVlc3RbMTZdOyAgICAgLy8gU2F2ZWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKKwkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCisJVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWluOyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNaW4gZm9yIEFDIDAKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01heDsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWF4IGZvciBBQyAwCisJLy8gSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycworCVVDSEFSICAgICAgICAgICAgICAgTkhGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtCisJVUNIQVIgICAgICAgICAgICAgICBDTEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQKKworCVVDSEFSICAgICAgICAgICAgICAgS1JLWzE2XTsgICAgICAgIC8vS2V5IFJlZnJlc2ggS2V5LgorCVVDSEFSICAgICAgICAgICAgICAgQlRLWzMyXTsgICAgICAgIC8vQmFzZSBUcmFuc2llbnQgS2V5CisJQk9PTEVBTiAgICAgICAgICAgICBDQ0tNTGlua1VwRmxhZzsKKwlVTE9ORyAgICAgICAgICAgICAgIENDS01STjsgICAgLy8oUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBudW1iZXIuCisJTEFSR0VfSU5URUdFUiAgICAgICBDQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wOyAgLy9UU0YgdGltZXIgZm9yIFJlLWFzc29jYWl0ZSB0byB0aGUgbmV3IEFQCisJVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7ICAgICAgLy9pbiBkQm0KKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NbNF07ICAgICAgICAvL2VnLiAxOTIuMTY4LjEuMQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWc7ICAgIC8vZmxhZyBmb3IgZGV0ZXJtaW5pbmcgcmVwb3J0IEFzc29jIExvc3QgdGltZQorCUNIQVIgICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy9BZGphY2VudCBBUCdzIFNTSUQgcmVwb3J0CisJVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBCc3NpZFtNQUNfQUREUl9MRU5dOyAgICAgICAgIC8vQWRqYWNlbnQgQVAncyBCU1NJRCByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIENDWEFkamFjZW50QVBDaGFubmVsOworCVVMT05HICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZTsgIC8vZm9yIFNwZWMgUzMyLgorCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lcjsKKwlCT09MRUFOCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZzsKKworCVVDSEFSICAgICAgICAgICAJRHRpbUNvdW50OyAgICAgIC8vIDAuLiBEdGltUGVyaW9kLTEKKwlVQ0hBUiAgICAgICAgICAgCUR0aW1QZXJpb2Q7ICAgICAvLyBkZWZhdWx0ID0gMworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJUlRfODAyXzExX0RMUwkJRExTRW50cnlbTUFYX05VTV9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCURsc1JlcGxheUNvdW50ZXJbOF07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRoaXMgaXMgb25seSBmb3IgV0hRTCB0ZXN0LgorCUJPT0xFQU4JCQkJV2hxbFRlc3Q7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBXcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lcjsKKyAgICAvLyBGYXN0IFJvYW1pbmcKKwlCT09MRUFOCQkgICAgICAgIGJGYXN0Um9hbWluZzsgICAgICAgLy8gMDpkaXNhYmxlIGZhc3Qgcm9hbWluZywgMTplbmFibGUgZmFzdCByb2FtaW5nCisJQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisgICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cworICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7CisKKyAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAorICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCisgICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKKwlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIENIQVIgICAgICAgICAgICAgICAgZGV2X25hbWVbMTZdOworICAgIFVTSE9SVCAgICAgICAgICAgICAgT3JpRGV2VHlwZTsKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlRHbldpZmlUZXN0OworCUJPT0xFQU4JCQkgICAgYlNjYW5SZXFJc0Zyb21XZWJVSTsKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJVUNIQVIJCQkJSUVFRTgwMjExZENsaWVudE1vZGU7CisJVUNIQVIJCQkJU3RhT3JpQ291bnRyeUNvZGVbM107CisJVUNIQVIJCQkJU3RhT3JpR2VvZ3JhcGh5OworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KK30gU1RBX0FETUlOX0NPTkZJRywgKlBTVEFfQURNSU5fQ09ORklHOworCisvLyBUaGlzIGRhdGEgc3RydWN0dXJlIGtlZXAgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBCisvLyBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkCisvLyBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZQorLy8gaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4KKy8vIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0bworLy8gdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLgordHlwZWRlZiBzdHJ1Y3QgX1NUQV9BQ1RJVkVfQ09ORklHIHsKKwlVU0hPUlQgICAgICBBaWQ7CisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgICAgICAgLy8gaW4ga3VzZWM7IElCU1MgcGFyYW1ldGVyIHNldCBlbGVtZW50CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247CisJVVNIT1JUICAgICAgQ2ZwUGVyaW9kOworCisJLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJLy8gQ29weSBzdXBwb3J0ZWQgaHQgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJUlRfSFRfUEhZX0lORk8JCVN1cHBvcnRlZFBoeUluZm87CisJUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKK30gU1RBX0FDVElWRV9DT05GSUcsICpQU1RBX0FDVElWRV9DT05GSUc7CisKKyNpZmRlZiBSVDI4NzAKKy8vIGZvciBVU0IgaW50ZXJmYWNlLCBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKK3R5cGVkZWYgc3RydWN0ICAgUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSB7CisgICAgICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgTWFjQWRkcjsKKyAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNUYWJNYXRjaFdDSUQ7ICAgICAgICAvLyBBU0lDCisgICAgICAgIENJUEhFUl9LRVkgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyS2V5OworfSBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZLCpQUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8gLS0tLS0tLS0tLS0gc3RhcnQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFVVEgtUlNQIFN0YXRlIE1hY2hpbmUgQXV4IGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCBfQVBfTUxNRV9BVVggeworCVVDSEFSICAgICAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgICAgICAgQWxnOworCUNIQVIgICAgICAgICAgICAgICAgQ2hhbGxlbmdlW0NJUEhFUl9URVhUX0xFTl07Cit9IEFQX01MTUVfQVVYLCAqUEFQX01MTUVfQVVYOworCisvLyBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX1dQQV9SRUtFWSB7CisJVUxPTkcgUmVLZXlNZXRob2Q7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcgUmVLZXlJbnRlcnZhbDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCit9IFJUX1dQQV9SRUtFWSwqUFJUX1dQQV9SRUtFWSwgUlRfODAyXzExX1dQQV9SRUtFWSwgKlBSVF84MDJfMTFfV1BBX1JFS0VZOworCit0eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZIHsKKwkvL0Nob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuCisJQk9PTEVBTgkJVmFsaWRBc0NMSTsJCS8vIFN0YSBtb2RlLCBzZXQgdGhpcyBUUlVFIGFmdGVyIExpbmt1cCx0b28uCisJQk9PTEVBTgkJVmFsaWRBc1dEUzsJLy8gVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuCisJQk9PTEVBTgkJVmFsaWRBc0FwQ2xpOyAgIC8vVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4KKwlCT09MRUFOCQlWYWxpZEFzTWVzaDsKKwlCT09MRUFOCQlWYWxpZEFzRGxzOwkvLyBUaGlzIGlzIERMUyBFbnRyeS4gb25seSBmb3IgU1RBIG1vZGUuCisJQk9PTEVBTgkJaXNDYWNoZWQ7CisJQk9PTEVBTgkJYklBbUJhZEF0aGVyb3M7CS8vIEZsYWcgaWYgdGhpcyBpcyBBdGhlcm9zIGNoaXAgdGhhdCBoYXMgSU9UIHByb2JsZW0uICBXZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyBwcm90ZWN0aW9uLgorCisJVUNIQVIgICAgICAgICAJRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7ICAvLyBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTQorCS8vamFuIGZvciB3cGEKKwkvLyByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQgorCVVDSEFSICAgICAgICAgICBDTVRpbWVyUnVubmluZzsKKwlVQ0hBUiAgICAgICAgICAgYXBpZHg7CQkJLy8gTUJTUyBudW1iZXIKKwlVQ0hBUiAgICAgICAgICAgUlNOSUVfTGVuOworCVVDSEFSICAgICAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CisJVUNIQVIgICAgICAgICAgIEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCVVDSEFSICAgICAgICAgICBSX0NvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIgICAgICAgICAgIFBUS1s2NF07CisJVUNIQVIgICAgICAgICAgIFJlVHJ5Q291bnRlcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICAgICAgICAgICAgICBSZXRyeVRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyOwkvLyBBIHRpbWVyIHdoaWNoIGVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgUFNLIFNNCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJQVBfV1BBX1NUQVRFICAgIFdwYVN0YXRlOworCUdUS19TVEFURSAgICAgICBHVEtTdGF0ZTsKKwlVU0hPUlQgICAgICAgICAgUG9ydFNlY3VyZWQ7CisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgIFByaXZhY3lGaWx0ZXI7ICAgICAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlDSVBIRVJfS0VZICAgICAgUGFpcndpc2VLZXk7CisJUFZPSUQgICAgICAgICAgIHBBZDsKKyAgICBJTlQJCQkJUE1LSURfQ2FjaGVJZHg7CisgICAgVUNIQVIJCQlQTUtJRFtMRU5fUE1LSURdOworCisKKwlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBQc01vZGU7CisJU1NUICAgICAgICAgICAgIFNzdDsKKwlBVVRIX1NUQVRFICAgICAgQXV0aFN0YXRlOyAvLyBmb3IgU0hBUkVEIEtFWSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIHVzZWQgb25seQorCUJPT0xFQU4JCQlJc1JlYXNzb2NTdGE7CS8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHJlYXNzb2NpYXRpb24gcHJvY2VkdXJlCisJVVNIT1JUICAgICAgICAgIEFpZDsKKwlVU0hPUlQgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJVUNIQVIgICAgICAgICAgIExhc3RSc3NpOworCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7CisJVUlOVDE2CQkJU3RhdGlvbktlZXBBbGl2ZUNvdW50OyAvLyB1bml0OiBzZWNvbmQKKwlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OworCVFVRVVFX0hFQURFUiAgICBQc1F1ZXVlOworCisJVUlOVDMyCQkJU3RhQ29ubmVjdFRpbWU7CQkvLyB0aGUgbGl2ZSB0aW1lIG9mIHRoaXMgc3RhdGlvbiBzaW5jZSBhc3NvY2lhdGVkIHdpdGggQVAKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJTZW5kQkFSOworCVVTSE9SVAkJCU5vQkFEYXRhQ291bnREb3duOworCisJVUlOVDMyICAgCQlDYWNoZWRCdWZbMTZdOwkJLy8gVUlOVCAoNCBieXRlcykgZm9yIGFsaWdubWVudAorCVVJTlQJCQlUeEJGQ291bnQ7IC8vIDMqMworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVVJTlQJCQlGSUZPQ291bnQ7CisJVUlOVAkJCURlYnVnRklGT0NvdW50OworCVVJTlQJCQlEZWJ1Z1R4Q291bnQ7CisgICAgQk9PTEVBTgkJCWJEbHNJbml0OworCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy9XRFMgZW50cnkgbmVlZHMgdGhlc2UKKy8vIHJ0Mjg2MCBhZGQgdGhpcy4gaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIKKwlVSU5UCQkJTWF0Y2hXRFNUYWJJZHg7CisJVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGVJbmRleDsKKwkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisvLwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OworCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKKwlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVVJTlQJCQlNYXRjaERsc0VudHJ5SWR4OyAvLyBpbmRpY2F0ZSB0aGUgaW5kZXggaW4gcEFkLT5TdGFDZmcuRExTRW50cnkKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KKwlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKKwlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisKKwkvLyBUT0RPOiBTaGFsbCB3ZSBtb3ZlIHRoYXQgdG8gRE9UMTFfTl9TVVBQT1JUPz8/CisJSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVCBFV0MgTUlNTy1OIHVzZWQgcGFyYW1ldGVycworCVVTSE9SVAkJUlhCQWJpdG1hcDsJLy8gZmlsbCB0byBvbi1jaGlwICBSWFdJX0JBX0JJVE1BU0sgaW4gOC4xLjNSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0CisJVVNIT1JUCQlUWEJBYml0bWFwOwkvLyBUaGlzIGJpdG1hcCBhcyBvcmlnaW5hdG9yLCBvbmx5IGtlZXAgaW4gc29mdHdhcmUgdXNlZCB0byBtYXJrIEFNUERVIGJpdCBpbiBUWFdJCisJVVNIT1JUCQlUWEF1dG9CQWJpdG1hcDsKKwlVU0hPUlQJCUJBRGVjbGluZUJpdG1hcDsKKwlVU0hPUlQJCUJBUmVjV2NpZEFycmF5W05VTV9PRl9USURdOwkvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIHJlY2lwaWVudCBzZXNzaW9uLiBpZiBSWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpV2NpZEFycmF5W05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisJVVNIT1JUCQlCQU9yaVNlcXVlbmNlW05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisKKwkvLyA4MDIuMTFuIGZlYXR1cmVzLgorCVVDSEFSCQlNcGR1RGVuc2l0eTsKKwlVQ0hBUgkJTWF4UkFtcGR1RmFjdG9yOworCVVDSEFSCQlBTXNkdVNpemU7CisJVUNIQVIJCU1tcHNNb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZS4KKworCUhUX0NBUEFCSUxJVFlfSUUJCUhUQ2FwYWJpbGl0eTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJQlNTMjA0MENvZXhpc3RlbmNlTWdtdFN1cHBvcnQ7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKwlVQ0hBUiAgICAgICBSYXRlTGVuOworCXN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZICpwTmV4dDsKKyAgICBVU0hPUlQgICAgICBUeFNlcVtOVU1fT0ZfVElEXTsKKwlVU0hPUlQJCU5vblFvc0RhdGFTZXE7CisKKwlSU1NJX1NBTVBMRQlSc3NpU2FtcGxlOworCisJVUlOVDMyCQkJVFhNQ1NFeHBlY3RlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NTdWNjZXNzZnVsWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0ZhaWxlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NBdXRvRmFsbEJhY2tbMTZdWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVMT05HICAgCQlMYXN0QmVhY29uUnhUaW1lOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBNQUNfVEFCTEVfRU5UUlksICpQTUFDX1RBQkxFX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFIHsKKwlVU0hPUlQJCQlTaXplOworCU1BQ19UQUJMRV9FTlRSWSAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCU1BQ19UQUJMRV9FTlRSWSBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlRVUVVRV9IRUFERVIgICAgTWNhc3RQc1F1ZXVlOworCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7CisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSW5Qc207CisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uQmFkQXRoZXJvczsJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgYXRoZXJvcyA4MDIuMTFuIENoaXAuICBXZSBuZWVkIHRvIHVzZSBSVFMvQ1RTIHdpdGggQXRoZXJvcyA4MDIsLjExbiBjaGlwLgorCUJPT0xFQU4JCQlmQW55VHhPUEZvcmNlRGlzYWJsZTsJLy8gQ2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgQkUgVHhPUAorCUJPT0xFQU4JCQlmQWxsU3RhdGlvbkFzUmFsaW5rOyAJLy8gQ2hlY2sgaWYgYWxsIHN0YXRpb25zIGFyZSByYWxpbmstY2hpcHNldAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbklzTGVnYWN5OwkvLyBDaGVjayBpZiBJIHVzZSBsZWdhY3kgcmF0ZSB0byB0cmFuc21pdCB0byBteSBCU1MgU3RhdGlvbi8KKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Ob25HRjsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uMjBPbmx5OwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KKwlCT09MRUFOCQkJZkFueVN0YXRpb25NSU1PUFNEeW5hbWljOyAvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBNSU1PIER5bmFtaWMKKwlCT09MRUFOICAgICAgICAgZkFueUJBU2Vzc2lvbjsgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBCQSBzZXNzaW9uLiAgRm9yY2UgdHVybiBvbiBSVFMvQ1RTCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IE1BQ19UQUJMRSwgKlBNQUNfVEFCTEU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgSVNfSFRfU1RBKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBJU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBQRUVSX0lTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfV0RTX0VOVFJZIHsKKwlCT09MRUFOICAgICAgICAgVmFsaWQ7CisJVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OworCXN0cnVjdCBfV0RTX0VOVFJZICpwTmV4dDsKK30gV0RTX0VOVFJZLCAqUFdEU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgIF9XRFNfVEFCTEVfRU5UUlkgeworCVVTSE9SVAkJCVNpemU7CisJVUNIQVIgICAgICAgICAgIFdkc0FkZHJbTUFDX0FERFJfTEVOXTsKKwlXRFNfRU5UUlkgICAgICAgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlXRFNfRU5UUlkgICAgICAgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJVUNIQVIgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGU7CisJVUNIQVIgICAgICAgICAgIEN1cnJUeFJhdGU7CisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4T2tDb3VudDsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorfSBXRFNfVEFCTEVfRU5UUlksICpQV0RTX1RBQkxFX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEU19FTlRSWSB7CisJUE5FVF9ERVYJCQlkZXY7CisJVUNIQVIJCQkJVmFsaWQ7CisJVUNIQVIJCQkJUGh5TW9kZTsKKwlVQ0hBUgkJCQlQZWVyV2RzQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJCU1hY1RhYk1hdGNoV0NJRDsJLy8gQVNJQworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgIFdlcFN0YXR1czsKKwlVQ0hBUgkJCQkJS2V5SWR4OworCUNJUEhFUl9LRVkgICAgICAgICAgCVdkc0tleTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgorfSBSVF84MDJfMTFfV0RTX0VOVFJZLCAqUFJUXzgwMl8xMV9XRFNfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9XRFNfVEFCTEUgeworCVVDSEFSICAgICAgICAgICAgICAgTW9kZTsKKwlVTE9ORyAgICAgICAgICAgICAgIFNpemU7CisJUlRfODAyXzExX1dEU19FTlRSWQlXZHNFbnRyeVtNQVhfV0RTX0VOVFJZXTsKK30gV0RTX1RBQkxFLCAqUFdEU19UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FQQ0xJX1NUUlVDVCB7CisJUE5FVF9ERVYJCQkJZGV2OworI2lmZGVmIFJUTDg2NVhfU09DCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgbXlsaW5raWQ7CisjZW5kaWYKKwlCT09MRUFOICAgICAgICAgICAgICAgICBFbmFibGU7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2Ugd2FzIGNvbmZpZ3VyZWQgdG8gIjEiICBvciBieSBpd3ByaXYgY21kICJBcENsaUVuYWJsZSIKKwlCT09MRUFOICAgICAgICAgICAgICAgICBWYWxpZDsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSBhc3NvY2lhdGVkIHN1Y2Nlc3MgdG8gcmVtb3RlIEFQLgorCVVDSEFSCQkJCQlNYWNUYWJXQ0lEOwkvL1dDSUQgdmFsdWUsIHdoaWNoIHBvaW50IHRvIHRoZSBlbnRyeSBvZiBBU0lDIE1hYyB0YWJsZS4KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBTc2lkTGVuOworCUNIQVIgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ1NzaWRMZW47CisJQ0hBUiAgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ0FwQ2xpQnNzaWRbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tFVEhfTEVOR1RIX09GX0FERFJFU1NdOworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXBDbGlSY3ZCZWFjb25UaW1lOworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ3RybEN1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBTeW5jQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIEF1dGhDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXNzb2NDdXJyU3RhdGU7CisJVUxPTkcJCQkJCVdwYVBza0N1cnJTdGF0ZTsKKworCVVTSE9SVCAgICAgICAgICAgICAgICAgIEF1dGhSZXFDbnQ7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgQXNzb2NSZXFDbnQ7CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBNcGR1RGVuc2l0eTsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJVUNIQVIJCVBTS1sxMDBdOwkJCQkvLyByZXNlcnZlIFBTSyBrZXkgbWF0ZXJpYWwKKwlVQ0hBUiAgICAgICBQU0tMZW47CisJVUNIQVIgICAgICAgUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSworCS8vVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSworCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisKKwkvL0NJUEhFUl9LRVkJCVBhaXJ3aXNlS2V5OworCUNJUEhFUl9LRVkgICAgICBTaGFyZWRLZXlbU0hBUkVfS0VZX05VTV07CisJVUNIQVIgICAgICAgICAgIERlZmF1bHRLZXlJZDsKKworCS8vIFdQQSA4MDIuMXggcG9ydCBjb250cm9sLCBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCwgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVECisJLy9VQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKKworCS8vIHN0b3JlIFJTTl9JRSBidWlsdCBieSBkcml2ZXIKKwlVQ0hBUgkJUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOyAgLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgY29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwlVQ0hBUgkJUlNOSUVfTGVuOworCisJLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKKwlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCisJLy9VTE9ORyAgICAgICBNaWNFcnJDbnQ7ICAgICAgICAgIC8vIFNob3VsZCBiZSAwLCAxLCAyLCB0aGVuIHJlc2V0IHRvIHplcm8gKGFmdGVyIGRpc2Fzc29pY2lhdGlvbikuCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkJsb2NrQXNzb2M7IC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKworCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKKwkvL1dQQV9TVEFURSAgIAlXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFCisJLy9VQ0hBUiAgICAgICAJUmVwbGF5Q291bnRlcls4XTsKKwkvL1VDSEFSICAgICAgIAlBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1dGhlbnRpY2F0b3IKKwlVQ0hBUiAgICAgICAJU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKKwlVQ0hBUgkJCUdOb25jZVszMl07CQkJLy8gR05vbmNlIGZvciBXUEEtUFNLIGZyb20gYXV0aGVudGljYXRvcgorCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gQVBDTElfU1RSVUNULCAqUEFQQ0xJX1NUUlVDVDsKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEJMT0NLX05FVF9JRgordHlwZWRlZiBzdHJ1Y3QgX0JMT0NLX1FVRVVFX0VOVFJZCit7CisJQk9PTEVBTiBTd1R4UXVldWVCbG9ja0ZsYWc7CisJTElTVF9IRUFERVIgTmV0SWZMaXN0OworfSBCTE9DS19RVUVVRV9FTlRSWSwgKlBCTE9DS19RVUVVRV9FTlRSWTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworc3RydWN0IHdpZmljb25mCit7CisJQk9PTEVBTgliU2hvcnRHSTsKKwlCT09MRUFOIGJHcmVlbkZpZWxkOworfTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9JTkZfUENJX0NPTkZJRworeworCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCit9SU5GX1BDSV9DT05GSUc7CisKK3R5cGVkZWYgc3RydWN0IF9JTkZfVVNCX0NPTkZJRworeworCVVJTlQgICAgICAgICAgICAgICAgQnVsa0luRXBBZGRyOwkJLy8gYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzCisJVUlOVCAgICAgICAgICAgICAgICBCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCisKK31JTkZfVVNCX0NPTkZJRzsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwl0eXBlZGVmIHZvaWQgKCpJa2Fub3NXbGFuVHhDYkZ1bmNQKSh2b2lkICosIHZvaWQgKik7CisKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8KKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJCUlrYW5vc1dsYW5UeENiRnVuY1AgKmZwOworCX07CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisjaWZkZWYgTklOVEVORE9fQVAKK3R5cGVkZWYgc3RydWN0IF9OSU5ET19DVFJMX0JMT0NLIHsKKworCVJUX05JTlRFTkRPX1RBQkxFCURTX1RBQkxFOworCisjaWZkZWYgQ0hJUDI1WFgKKwlzcGlubG9ja190CQkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbHNlCisJTkRJU19TUElOX0xPQ0sJCU5JTlRFTkRPX1RBQkxFX0xvY2s7CisjZW5kaWYgLy8gQ0hJUDI1WFggLy8KKworCVVDSEFSCQkJCU5JTlRFTkRPX1VQX0JVRkZFUls1MTJdOworCVVDSEFSCQkJCUxvY2FsX0tleUlkeDsKKwlDSVBIRVJfS0VZCQkJTG9jYWxfU2hhcmVkS2V5OworCVVDSEFSCQkJCUxvY2FsX2JIaWRlU3NpZDsKKwlVQ0hBUgkJCQlMb2NhbF9BdXRoTW9kZTsKKwlVQ0hBUgkJCQlMb2NhbF9XZXBTdGF0dXM7CisJVVNIT1JUCQkJCUxvY2FsX0NhcGFiaWxpdHlJbmZvOworfSBOSU5ET19DVFJMX0JMT0NLOworI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCisKKworI2lmZGVmIERCR19ESUFHTk9TRQorI2RlZmluZSBESUFHTk9TRV9USU1FCTEwICAgLy8gMTAgc2VjCit0eXBlZGVmIHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfCit7CS8vIERpYWdub3NpcyBSZWxhdGVkIGVsZW1lbnQKKwl1bnNpZ25lZCBjaGFyCQlpbml0ZWQ7CisJdW5zaWduZWQgY2hhciAJcUlkeDsKKwl1bnNpZ25lZCBjaGFyIAlBcnJheVN0YXJ0SWR4OworCXVuc2lnbmVkIGNoYXIJCUFycmF5Q3VySWR4OworCS8vIFR4IFJlbGF0ZWQgQ291bnQKKwlVU0hPUlQJCQlUeERhdGFDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhGYWlsQ250W0RJQUdOT1NFX1RJTUVdOworLy8JVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQorCVVTSE9SVAkJCVR4RGVzY0NudFtESUFHTk9TRV9USU1FXVsyNF07IC8vIDMqMwkvLyBUeERlc2MgcXVldWUgbGVuZ3RoIGluIHNjYWxlIG9mIDB+MTQsID49MTUKKy8vCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzE2XTsJCQkvLyBUeERhdGUgTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgorCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCisJVVNIT1JUCQkJVHhTV1F1ZUNudFtESUFHTk9TRV9USU1FXVs5XTsJCS8vIFR4U3dRdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgPj04CisKKwlVU0hPUlQJCQlUeEFnZ0NudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeE5vbkFnZ0NudFtESUFHTk9TRV9USU1FXTsKKy8vCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KKwlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozIC8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCisJVVNIT1JUCQkJVHhSYWxpbmtDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhSYWxpbmsgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisJVVNIT1JUCQkJVHhBTVNEVUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeEFNU1VEIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgorCisJLy8gUnggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVJ4RGF0YUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBSeCBUb3RhbCBEYXRhIGNvdW50LgorCVVTSE9SVAkJCVJ4Q3JjRXJyQ250W0RJQUdOT1NFX1RJTUVdOworLy8JVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gUnggTUNTIENvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgc3RlcCBpbiAxLgorCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCit9UnRtcERpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworLy8KKy8vICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCit7CisJUFZPSUQJCQkJCU9TX0Nvb2tpZTsJLy8gc2F2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgcmVsYXRpdmUgdG8gT1MKKwlQTkVUX0RFVgkJCQluZXRfZGV2OworCVVMT05HCQkJCQlWaXJ0dWFsSWZDbnQ7CisKKworCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgaXJxX2xvY2s7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgaXJxX2Rpc2FibGVkOworCisjaWZkZWYgUlQyODcwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFVTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgkJKmNvbmZpZzsKKwlVSU5UCQkJCQkJCQlCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKKwlVSU5UCQkJCQkJCQlCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCisKKwlVSU5UCQkJCQkJCQlOdW1iZXJPZlBpcGVzOworCVVTSE9SVAkJCQkJCQkJQnVsa091dE1heFBhY2tldFNpemU7CisJVVNIT1JUCQkJCQkJCQlCdWxrSW5NYXhQYWNrZXRTaXplOworCisJLy89PT09PT1Db250cm9sIEZsYWdzCisJTE9ORyAgICAgICAgICAgICAgICAgICAgCVBlbmRpbmdJb0NvdW50OworCVVMT05HCQkJCQkJQnVsa0ZsYWdzOworCUJPT0xFQU4gICAgICAgICAgICAgICAgICAgICBiVXNiVHhCdWxrQWdncmU7CS8vIEZsYWdzIGZvciBidWxrIG91dCBkYXRhIHByaW9yaXR5CisKKworCS8vPT09PT09VGltZXIgVGhyZWFkCisJUlQyODcwX1RJTUVSX1FVRVVFCQlUaW1lclE7CisJTkRJU19TUElOX0xPQ0sJCQlUaW1lclFMb2NrOworCisKKwkvLz09PT09PUNtZCBUaHJlYWQKKwlDbWRRCQkJCQlDbWRROworCU5ESVNfU1BJTl9MT0NLCQkJQ21kUUxvY2s7CQkJCS8vIENtZFFMb2NrIHNwaW5sb2NrCisKKwlCT09MRUFOCQkJCQlUaW1lckZ1bmNfa2lsbDsKKwlCT09MRUFOCQkJCQltbG1lX2tpbGw7CisKKworCS8vPT09PT09U2VtYXBob3JlcyAoZXZlbnQpCisJc3RydWN0IHNlbWFwaG9yZQkJCW1sbWVfc2VtYXBob3JlOwkJCS8qIHRvIHNsZWVwIHRocmVhZCBvbgkqLworCXN0cnVjdCBzZW1hcGhvcmUJCQlSVFVTQkNtZF9zZW1hcGhvcmU7CQkvKiB0byBzbGVlcCB0aHJlYWQgb24JKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJUlRVU0JUaW1lcl9zZW1hcGhvcmU7CisjaWZkZWYgSU5GX0FNQVpPTl9TRQorCXN0cnVjdCBzZW1hcGhvcmUJCQlVc2JWZW5kb3JSZXFfc2VtYXBob3JlOworCVBWT0lECQkJCQkJVXNiVmVuZG9yUmVxQnVmOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwlzdHJ1Y3QgY29tcGxldGlvbgkJCVRpbWVyUUNvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uCQkJbWxtZUNvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uCQkJQ21kUUNvbXBsZXRlOworCXdhaXRfcXVldWVfaGVhZF90CQkJKndhaXQ7CisKKwkvLz09PT09PUxvY2sgZm9yIDI4NzAgQVRFCisjaWZkZWYgUkFMSU5LX0FURQorCU5ESVNfU1BJTl9MT0NLCQkJR2VuZXJpY0xvY2s7CQkvLyBBVEUgVHgvUnggZ2VuZXJpYyBzcGlubG9jaworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIEJvdGggUENJL1VTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBUeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOyAgLy8gZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOworCisjaWZkZWYgUlQyODcwCisJLy8gRGF0YSByZWxhdGVkIGNvbnRleHQgYW5kIEFDIHNwZWNpZmllZCwgNCBBQyBzdXBwb3J0ZWQKKwlORElTX1NQSU5fTE9DSwkJCUJ1bGtPdXRMb2NrWzZdOwkJCS8vIEJ1bGtPdXQgc3BpbmxvY2sgZm9yIDQgQUNzCisJTkRJU19TUElOX0xPQ0sJCQlNTE1FQnVsa091dExvY2s7CS8vIE1MTUUgQnVsa091dCBsb2NrCisKKwlIVF9UWF9DT05URVhUCQkJVHhDb250ZXh0W05VTV9PRl9UWF9SSU5HXTsKKwlORElTX1NQSU5fTE9DSwkJCVR4Q29udGV4dFF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CQkvLyBUeENvbnRleHRRdWV1ZSBzcGlubG9jaworCisJLy8gNCBzZXRzIG9mIEJ1bGsgT3V0IGluZGV4IGFuZCBwZW5kaW5nIGZsYWcKKwlVQ0hBUgkJCQkJTmV4dEJ1bGtPdXRJbmRleFs0XTsJLy8gb25seSB1c2VkIGZvciA0IEVEQ0EgYnVsa291dCBwaXBlCisKKwlCT09MRUFOCQkJCQlCdWxrT3V0UGVuZGluZ1s2XTsJLy8gdXNlZCBmb3IgdG90YWwgNiBidWxrb3V0IHBpcGUKKwlVQ0hBUgkJCQkJYnVsa1Jlc2V0UGlwZWlkOworCUJPT0xFQU4JCQkJCU1nbXRCdWxrUGVuZGluZzsKKwlVTE9ORwkJCQkJYnVsa1Jlc2V0UmVxWzZdOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzCisJUVVFVUVfSEVBREVSICAgICAgICAgICAgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsgIC8vIDQgQUMgKyAxIEhDQ0EKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLy8gVHhTd1F1ZXVlIHNwaW5sb2NrCisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBNZ210RGVzY1Jpbmc7ICAgICAgICAgICAgICAgCS8vIFNoYXJlZCBtZW1vcnkgZm9yIE1HTVQgZGVzY3JpcHRvcnMKKwlSVE1QX01HTVRfUklORyAgICAgICAgICBNZ210UmluZzsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBNZ210UmluZ0xvY2s7ICAgICAgICAgICAgICAgCS8vIFByaW8gUmluZyBzcGlubG9jaworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgUnggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBSVDI4NzAKKwlSWF9DT05URVhUCQkJCVJ4Q29udGV4dFtSWF9SSU5HX1NJWkVdOyAgLy8gMSBmb3IgcmVkdW5kYW50IG11bHRpcGxlIElSUCBidWxrIGluLgorCU5ESVNfU1BJTl9MT0NLCQkJQnVsa0luTG9jazsJCQkJLy8gQnVsa0luIHNwaW5sb2NrIGZvciA0IEFDcworCVVDSEFSCQkJCQlQZW5kaW5nUng7CQkJCS8vIFRoZSBNYXhpbWEgcGVuZGluZyBSeCB2YWx1ZSBzaG91bGQgYmUgCVJYX1JJTkdfU0laRS4KKwlVQ0hBUgkJCQkJTmV4dFJ4QnVsa0luSW5kZXg7CQkvLyBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggaG9sZCBieSBIb3N0IGNvbnRyb2xsZXIuCisJVUNIQVIJCQkJCU5leHRSeEJ1bGtJblJlYWRJbmRleDsJLy8gSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGRyaXZlciBjYW4gcmVhZCAmIHByb2Nlc3MgaXQuCisJVUxPTkcJCQkJCU5leHRSeEJ1bGtJblBvc2l0aW9uOyAgIC8vIFdhbnQgdG8gY29udGF0ZW5hdGUgMiBVUkIgYnVmZmVyIHdoaWxlIDFzdCBpcyBidWxraW4gZmFpbGVkIFVSQi4gVGhpcyBQb3NpdGlvbiBpcyAxc3QgVVJCIFRyYW5zZmVyTGVuZ3RoLgorCVVMT05HCQkJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aDsJLy8gY3VycmVudCBsZW5ndGggb2YgdGhlIHBhY2tldCBidWZmZXIKKwlVTE9ORwkJCQkJUmVhZFBvc2l0aW9uOwkJCS8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBpbiBhIHBhY2tldCBidWZmZXIKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIEFTSUMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJVUlOVDMyICAgICAgICAgICAgICAgCU1BQ1ZlcnNpb247ICAgICAgCS8vIE1BQyB2ZXJzaW9uLiBSZWNvcmQgcnQyODYwQygweDI4NjAwMTAwKSBvciBydDI4NjBEICgweDI4NjAwMTAxKS4uCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBFMlBST00KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBFZXByb21WZXJzaW9uOyAgICAgICAgICAvLyBieXRlIDA6IHZlcnNpb24sIGJ5dGUgMTogcmV2aXNpb24sIGJ5dGUgMn4zOiB1bnVzZWQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBFRVBST01BZGRyZXNzTnVtOyAgICAgICAvLyA5M2M0Nj02ICA5M2M2Nj04CisJVVNIT1JUICAgICAgICAgICAgICAgICAgRUVQUk9NRGVmYXVsdFZhbHVlW05VTV9FRVBST01fQkJQX1BBUk1TXTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBGaXJtd2FyZVZlcnNpb247ICAgICAgICAvLyBieXRlIDA6IE1pbm9yIHZlcnNpb24sIGJ5dGUgMTogTWFqb3IgdmVyc2lvbiwgb3RoZXJ3aXNlIHVudXNlZC4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEJCUCBDb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsxNDBdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECisJVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwUnNzaVRvRGJtRGVsdGE7CisJQkJQX1I2Nl9UVU5JTkcgICAgICAgICAgQmJwVHVuaW5nOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFJGSUMgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBSZkljVHlwZTsgICAgICAgLy8gUkZJQ194eHgKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBSZkZyZXFPZmZzZXQ7ICAgLy8gRnJlcXVlbmN5IG9mZnNldCBmb3IgY2hhbm5lbCBzd2l0Y2hpbmcKKwlSVE1QX1JGX1JFR1MgICAgICAgICAgICBMYXRjaFJmUmVnczsgICAgLy8gbGF0Y2ggdGggbGF0ZXN0IFJGIHByb2dyYW1taW5nIHZhbHVlIHNpbmNlIFJGIElDIGRvZXNuJ3Qgc3VwcG9ydCBSRUFECisKKwlFRVBST01fQU5URU5OQV9TVFJVQyAgICBBbnRlbm5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBBTnRlbm5hIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGZvciBhICYgZy4gV2UgbmVlZCB0byBzYXZlIGl0IGZvciBmdXR1cmUgcmVmZXJlbmNlLgorCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCisJLy8gVGhpcyBzb2Z0IFJ4IEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgd2hlbiB1c2VyIHNldAorCS8vIFJYIEFudGVubmEgPSBESVZFUlNJVFkgT04KKwlTT0ZUX1JYX0FOVF9ESVZFUlNJVFkgICBSeEFudDsKKworCVVDSEFSICAgICAgICAgICAgICAgICAgIFJGUHJvZ1NlcTsKKwlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBUeFBvd2VyW01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgICAgICAvLyBTdG9yZSBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzLgorCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBUeFBvd2VyMTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgICAgICAvLyA4MDIuMTFqIGNoYW5uZWwgYW5kIGJ3CisJQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgQ2hhbm5lbExpc3QxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3ROdW07ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQorCVVDSEFSCQkJCQlCYnA5NDsKKwlCT09MRUFOCQkJCQlCYnBGb3JDQ0s7CisJVUxPTkcJCVR4MjBNUHdyQ2ZnQUJhbmRbNV07CisJVUxPTkcJCVR4MjBNUHdyQ2ZnR0JhbmRbNV07CisJVUxPTkcJCVR4NDBNUHdyQ2ZnQUJhbmRbNV07CisJVUxPTkcJCVR4NDBNUHdyQ2ZnR0JhbmRbNV07CisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjQTsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZBOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwQTsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlQTsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJQk9PTEVBTiAgICAgYkF1dG9UeEFnY0c7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAorCVVDSEFSCSAgICBUc3NpUmVmRzsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgorCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCisJVUNIQVIJICAgIFR4QWdjU3RlcEc7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQorCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUc7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKKworCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQkdSc3NpT2Zmc2V0MSB+IEJHUnNzaU9mZnNldDMKKwlDSEFSCQlCR1Jzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0NmgKKwlDSEFSCQlCR1Jzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUJHUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQVJzc2lPZmZzZXQxIH4gQVJzc2lPZmZzZXQzCisJQ0hBUgkJQVJzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBBIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NEFoCisJQ0hBUgkJQVJzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBBIFJTU0kjMSBPZmZzZXQgdmFsdWUKKwlDSEFSCQlBUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEEgUlNTSSMyIE9mZnNldCB2YWx1ZQorCS8vLS0tCisKKwlDSEFSCQlCTE5BR2FpbjsJCQkJCS8vIFN0b3JlIEIvRyBleHRlcm5hbCBMTkEjMCB2YWx1ZSBvbiBFRVBST00gMHg0NGgKKwlDSEFSCQlBTE5BR2FpbjA7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0CisJQ0hBUgkJQUxOQUdhaW4xOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMSB2YWx1ZSBmb3IgY2gxMDB+MTI4CisJQ0hBUgkJQUxOQUdhaW4yOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMiB2YWx1ZSBmb3IgY2gxMzJ+MTY1CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gTEVEIGNvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUNVX0xFRENTX1NUUlVDCQlMZWRDbnRsOworCVVTSE9SVAkJCQlMZWQxOwkvLyByZWFkIGZyb20gRUVQUk9NIDB4M2MKKwlVU0hPUlQJCQkJTGVkMjsJLy8gRUVQUk9NIDB4M2UKKwlVU0hPUlQJCQkJTGVkMzsJLy8gRUVQUk9NIDB4NDAKKwlVQ0hBUgkJCQlMZWRJbmRpY2F0b3JTdHJlZ3RoOworCVVDSEFSCQkJCVJzc2lTaW5nYWxzdHJlbmd0aE9mZmV0OworICAgIEJPT0xFQU4JCQkJYkxlZE9uU2Nhbm5pbmc7CisJVUNIQVIJCQkJTGVkU3RhdHVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIDgwMi4xMSByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWEQKKwlUWFdJX1NUUlVDICAgICAgICAgICAgICAJQmVhY29uVHhXSTsKKwlQVUNIQVIJCQkJCQlCZWFjb25CdWY7CisJVVNIT1JUCQkJCQkJQmVhY29uT2Zmc2V0W0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCisJLy8gcHJlLWJ1aWxkIFBTLVBPTEwgYW5kIE5VTEwgZnJhbWUgdXBvbiBsaW5rIHVwLiBmb3IgZWZmaWNpZW5jeSBwdXJwb3NlLgorCVBTUE9MTF9GUkFNRSAgICAgICAgICAgIAlQc1BvbGxGcmFtZTsKKwlIRUFERVJfODAyXzExICAgICAgICAgICAJTnVsbEZyYW1lOworCisjaWZkZWYgUlQyODcwCisJVFhfQ09OVEVYVAkJCQlCZWFjb25Db250ZXh0W0JFQUNPTl9SSU5HX1NJWkVdOworCVRYX0NPTlRFWFQJCQkJTnVsbENvbnRleHQ7CisJVFhfQ09OVEVYVAkJCQlQc1BvbGxDb250ZXh0OworCVRYX0NPTlRFWFQJCQkJUlRTQ29udGV4dDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisKKy8vPT09PT09PT09QVA9PT09PT09PT09PQorCisKKy8vPT09PT09PVNUQT09PT09PT09PT09CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAmIG9wZXJhdGlvbiBzdGF0dXMKKwkvLyB1c2VkIG9ubHkgd2hlbiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTVEFfQURNSU5fQ09ORklHICAgICAgICBTdGFDZmc7ICAgICAgICAgICAvLyB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlTVEFfQUNUSVZFX0NPTkZJRyAgICAgICBTdGFBY3RpdmU7ICAgICAgICAgLy8gdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKQorCUNIQVIgICAgICAgICAgICAgICAgICAgIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOyAvLyBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YKKwlORElTX01FRElBX1NUQVRFICAgICAgICBQcmVNZWRpYVN0YXRlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLz09PT09PT1Db21tb249PT09PT09PT09PQorCS8vIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBPcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gT1BNT0RFX1NUQSwgT1BNT0RFX0FQCisKKwlORElTX01FRElBX1NUQVRFICAgICAgICBJbmRpY2F0ZU1lZGlhU3RhdGU7CQkJLy8gQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkCisKKworCS8vIGNvbmZpZ3VyYXRpb246IHJlYWQgZnJvbSBSZWdpc3RyeSAmIEUyUFJPTQorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJMb2NhbEFkbWluTUFDOyAgICAgICAgICAgICAvLyBVc2UgdXNlciBjaGFuZ2VkIE1BQworCVVDSEFSICAgICAgICAgICAgICAgICAgIFBlcm1hbmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgLy8gRmFjdG9yeSBkZWZhdWx0IE1BQyBhZGRyZXNzCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgICAvLyBVc2VyIGNoYW5nZWQgTUFDIGFkZHJlc3MKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNvbW1vbiBjb25maWd1cmF0aW9uIHRvIGJvdGggT1BNT0RFX1NUQSBhbmQgT1BNT0RFX0FQCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQ09NTU9OX0NPTkZJRyAgICAgICAgICAgQ29tbW9uQ2ZnOworCU1MTUVfU1RSVUNUICAgICAgICAgICAgIE1sbWU7CisKKwkvLyBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4KKwlNTE1FX0FVWCAgICAgICAgICAgICAgICBNbG1lQXV4OyAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHNldHRpbmdzIHVzZWQgZHVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZQorCUJTU19UQUJMRSAgICAgICAgICAgICAgIFNjYW5UYWI7ICAgICAgICAgICAvLyBzdG9yZSB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0CisKKwkvL0Fib3V0IE1hY1RhYiwgdGhlIHN0YSBkcml2ZXIgd2lsbCB1c2UgIzAgYW5kICMxIGZvciBtdWx0aWNhc3QgYW5kIEFQLgorCU1BQ19UQUJMRSAgICAgICAgICAgICAgICAgTWFjVGFiOyAgICAgLy8gQVNJQyBvbi1jaGlwIFdDSUQgZW50cnkgdGFibGUuICBBdCBUWCwgQVNJQyBhbHdheXMgdXNlIGtleSBhY2NvcmRpbmcgdG8gdGhpcyBvbi1jaGlwIHRhYmxlLgorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1hY1RhYkxvY2s7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQV9UQUJMRQkJCUJBVGFibGU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgQkFUYWJMb2NrOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKworCS8vIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBLRVkgdGFibGVzCisJQ0lQSEVSX0tFWSAgICAgICAgICAgICAgU2hhcmVkS2V5W01BWF9NQlNTSURfTlVNXVs0XTsgLy8gU1RBIGFsd2F5cyB1c2UgU2hhcmVkS2V5W0JTUzBdWzAuLjNdCisKKwkJLy8gUlggcmUtYXNzZW1ibHkgYnVmZmVyIGZvciBmcmFnbWVudGF0aW9uCisJRlJBR01FTlRfRlJBTUUgICAgICAgICAgRnJhZ0ZyYW1lOyAgICAgICAgICAgICAgICAgIC8vIEZyYW1lIHN0b3JhZ2UgZm9yIGZyYWdtZW50IGZyYW1lCisKKwkvLyB2YXJpb3VzIENvdW50ZXJzCisJQ09VTlRFUl84MDJfMyAgICAgICAgICAgQ291bnRlcnM4MDIzOyAgICAgICAgICAgICAgIC8vIDgwMi4zIGNvdW50ZXJzCisJQ09VTlRFUl84MDJfMTEgICAgICAgICAgV2xhbkNvdW50ZXJzOyAgICAgICAgICAgICAgIC8vIDgwMi4xMSBNSUIgY291bnRlcnMKKwlDT1VOVEVSX1JBTElOSyAgICAgICAgICBSYWxpbmtDb3VudGVyczsgICAgICAgICAgICAgLy8gUmFsaW5rIHByb3ByaWV0eSBjb3VudGVycworCUNPVU5URVJfRFJTICAgICAgICAgICAgIERyc0NvdW50ZXJzOyAgICAgICAgICAgICAgICAvLyBjb3VudGVycyBmb3IgRHluYW1pYyBUWCBSYXRlIFN3aXRjaGluZworCVBSSVZBVEVfU1RSVUMgICAgICAgICAgIFByaXZhdGVJbmZvOyAgICAgICAgICAgICAgICAvLyBQcml2YXRlIGluZm9ybWF0aW9uICYgY291bnRlcnMKKworCS8vIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cworCisJLy8gY3VycmVudCBUWCBzZXF1ZW5jZSAjCisJVVNIT1JUICAgICAgICAgICAgICAgICAgU2VxdWVuY2U7CisKKwkvLyBDb250cm9sIGRpc2Nvbm5lY3QgLyBjb25uZWN0IGV2ZW50IGdlbmVyYXRpb24KKwkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMaW5rRG93blRpbWU7CisJLy8tLS0KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0UnhSYXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RUeFJhdGU7CisJLy8rKytVc2VkIG9ubHkgZm9yIFN0YXRpb24KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQ29uZmlnQ2hhbmdlZDsgICAgICAgICAvLyBDb25maWcgQ2hhbmdlIGZsYWcgZm9yIHRoZSBzYW1lIFNTSUQgc2V0dGluZworCS8vLS0tCisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBFeHRyYUluZm87ICAgICAgICAgICAgICAvLyBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBTeXN0ZW1FcnJvckJpdG1hcDsgICAgICAvLyBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IKKworCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQorCVVMT05HICAgICAgICAgICAgICAgICAgIE1hY0ljVmVyc2lvbjsgICAgICAgICAgIC8vIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQKKwkvLy0tLQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU3lzdGVtIGV2ZW50IGxvZworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJUXzgwMl8xMV9FVkVOVF9UQUJMRSAgIEV2ZW50VGFiOworCisKKwlCT09MRUFOCQlIVENFbmFibGU7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogICAgICBTdGF0aXN0aWMgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBSVDI4NzAKKwlVTE9ORwkJCQkJCUJ1bGtPdXREYXRhT25lU2VjQ291bnQ7CisJVUxPTkcJCQkJCQlCdWxrSW5EYXRhT25lU2VjQ291bnQ7CisJVUxPTkcJCQkJCQlCdWxrTGFzdE9uZVNlY0NvdW50OyAvLyBCdWxrT3V0RGF0YU9uZVNlY0NvdW50ICsgQnVsa0luRGF0YU9uZVNlY0NvdW50CisJVUxPTkcJCQkJCQl3YXRjaERvZ1J4Q250OworCVVMT05HCQkJCQkJd2F0Y2hEb2dSeE92ZXJGbG93Q250OworCVVMT05HCQkJCQkJd2F0Y2hEb2dUeFBlbmRpbmdDbnRbTlVNX09GX1RYX1JJTkddOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJQk9PTEVBTgkJCQkJCWJVcGRhdGVCY25DbnREb25lOworCVVMT05HCQkJCQkJd2F0Y2hEb2dNYWNEZWFkbG9jazsJLy8gcHJldmVudCBNQUMvQkJQIGludG8gZGVhZGxvY2sgY29uZGl0aW9uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIERFQlVHIHBhcmFtZXJ0cworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL1VMT05HCQlEZWJ1Z1NldHRpbmdbNF07CisJQk9PTEVBTgkJYkJhbkFsbEJhU2V0dXA7CisJQk9PTEVBTgkJYlByb21pc2N1b3VzOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIHJ0Mjg2MGMgZW11bGF0aW9uLXVzZSBQYXJhbWV0ZXJzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HCQlydHNhY2N1WzMwXTsKKwlVTE9ORwkJY3RzYWNjdVszMF07CisJVUxPTkcJCWNmZW5kYWNjdVszMF07CisJVUxPTkcJCWJhY29udGVudFsxNl07CisJVUxPTkcJCXJ4aW50W1JYX1JJTkdfU0laRSsxXTsKKwlVQ0hBUgkJcmN2YmFbNjBdOworCUJPT0xFQU4JCWJMaW5rQWRhcHQ7CisJQk9PTEVBTgkJYkZvcmNlUHJpbnRUWDsKKwlCT09MRUFOCQliRm9yY2VQcmludFJYOworCUJPT0xFQU4JCWJEaXNhYmxlc2Nhbm5pbmc7CQkvL2RlZmluZWQgaW4gUlQyODcwIFVTQgorCUJPT0xFQU4JCWJTdGFGaWZvVGVzdDsKKwlCT09MRUFOCQliUHJvdGVjdGlvblRlc3Q7CisJQk9PTEVBTgkJYkhDQ0FUZXN0OworCUJPT0xFQU4JCWJHZW5PbmVIQ0NBOworCUJPT0xFQU4JCWJCcm9hZENvbUhUOworCS8vKysrRm9sbG93aW5nIGFkZCBmcm9tIFJUMjg3MCBVU0IuCisJVUxPTkcJCUJ1bGtPdXRSZXE7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZTsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlT3RoZXI7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLy8gc2VlbXMgbm90IHVzZSBub3c/CisJVUxPTkcJCUJ1bGtJblJlcTsKKwlVTE9ORwkJQnVsa0luQ29tcGxldGU7CisJVUxPTkcJCUJ1bGtJbkNvbXBsZXRlRmFpbDsKKwkvLy0tLQorCisgICAgc3RydWN0IHdpZmljb25mCQkJV0lGSXRlc3RiZWQ7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJQVRFX0lORk8JCQkJYXRlOworI2lmZGVmIFJUMjg3MAorCUJPT0xFQU4JCQkJCUNvbnRpbkJ1bGtPdXQ7CQkvL0FURSBidWxrIG91dCBjb250cm9sCisJQk9PTEVBTgkJCQkJQ29udGluQnVsa0luOwkJLy9BVEUgYnVsayBpbiBjb250cm9sCisJYXRvbWljX3QJCQkJQnVsa091dFJlbWFpbmVkOworCWF0b21pY190CQkJCUJ1bGtJblJlbWFpbmVkOworI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbCBtcGR1X2Jsa19wb29sOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJVUxPTkcJCQkJCU9uZVNlY29uZG5vbkJFcGFja2V0czsJCS8vIHJlY29yZCBub24gQkUgcGFja2V0cyBwZXIgc2Vjb25kCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKyAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICBpd19zdGF0czsKKyNlbmRpZgorCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwlCTE9DS19RVUVVRV9FTlRSWQkJYmxvY2tRdWV1ZVRhYltOVU1fT0ZfVFhfUklOR107CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisKKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJSU5UMzIJCQkJCU1DX1Jvd0lEOworCVVDSEFSCQkJCQlNQ19GaWxlTmFtZVsyNTZdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisJVUxPTkcJCQkJCVRidHRUaWNrQ291bnQ7CisjaWZkZWYgUENJX01TSV9TVVBQT1JUCisJQk9PTEVBTgkJCQkJSGF2ZU1zaTsKKyNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KKworCisJVUNIQVIJCQkJCWlzX29uOworCisjZGVmaW5lIFRJTUVfQkFTRQkJCSgxMDAwMDAwL09TX0haKQorI2RlZmluZSBUSU1FX09ORV9TRUNPTkQJCSgxMDAwMDAwL1RJTUVfQkFTRSkKKwlVQ0hBUgkJCQkJZmxnX2JlX2FkanVzdDsKKwlVTE9ORwkJCQkJYmVfYWRqdXN0X2xhc3RfdGltZTsKKworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NUeEluZm87CisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1J4SW5mb1tNQVhfTUJTU0lEX05VTSArIE1BWF9XRFNfRU5UUlkgKyBNQVhfQVBDTElfTlVNICsgTUFYX01FU0hfTlVNXTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKworI2lmZGVmIERCR19ESUFHTk9TRQorCVJ0bXBEaWFnU3RydWN0CURpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworCVVJTlQ4CQkJCQlQTV9GbGdTdXNwZW5kOworfSBSVE1QX0FEQVBURVIsICpQUlRNUF9BREFQVEVSOworCisvLworLy8gQ2lzY28gSUFQUCBmb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KK3sKKwlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKKwlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCisJVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQorCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAorCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKKwlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAorCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAorCVVTSE9SVCAgICAgQ2hhbm5lbDsKKwlVU0hPUlQgICAgIFNzaWRMZW47CisJVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCit9IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7CisKKyNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMDNmZmZiCisjZGVmaW5lIElOVE1BU0sJCQkJMHgwMDAzZmZmYgorI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAwM2ZmZmMKKyNkZWZpbmUgUnhJTlQJCQkJMHgwMDAwMDAwNQkvLyBEZWxheWVkIFJ4IG9yIGluZGl2aSByeAorI2RlZmluZSBUeERhdGFJbnQJCQkweDAwMDAwMGZhCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4CisjZGVmaW5lIFR4TWdtdEludAkJCTB4MDAwMDAxMDIJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhDb2hlcmVudAkJCTB4MDAwMjAwMDAJLy8gdHggY29oZXJlbnQKKyNkZWZpbmUgUnhDb2hlcmVudAkJCTB4MDAwMTAwMDAJLy8gcnggY29oZXJlbnQKKyNkZWZpbmUgTWN1Q29tbWFuZAkJCTB4MDAwMDAyMDAJLy8gbWN1CisjZGVmaW5lIFByZVRCVFRJbnQJCQkweDAwMDAxMDAwCS8vIFByZS1UQlRUIGludGVycnVwdAorI2RlZmluZSBUQlRUSW50CQkJCTB4MDAwMDA4MDAJCS8vIFRCVFQgaW50ZXJydXB0CisjZGVmaW5lIEdQVGltZU91dEludAkJCTB4MDAwMDgwMDAJCS8vIEdQdGltZW91dCBpbnRlcnJ1cHQKKyNkZWZpbmUgQXV0b1dha2V1cEludAkJMHgwMDAwNDAwMAkJLy8gQXV0b1dha2V1cEludCBpbnRlcnJ1cHQKKyNkZWZpbmUgRmlmb1N0YUZ1bGxJbnQJCQkweDAwMDAyMDAwCS8vICBmaWZvIHN0YXRpc3RpY3MgZnVsbCBpbnRlcnJ1cHQKKworCit0eXBlZGVmIHN0cnVjdCBfUlhfQkxLXworeworLy8JUlhEX1NUUlVDCQlSeEQ7IC8vIHNhbXBsZQorCVJUMjhYWF9SWERfU1RSVUMJUnhEOworCVBSWFdJX1NUUlVDCQkJcFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7CisJVUNIQVIJCQkJKnBEYXRhOworCVVTSE9SVAkJCQlEYXRhU2l6ZTsKKwlVU0hPUlQJCQkJRmxhZ3M7CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCit9IFJYX0JMSzsKKworCisjZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCisjZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCisjZGVmaW5lIGZSWF9BTVNEVSAgICAgICAweDAwMDIKKyNkZWZpbmUgZlJYX0FSQUxJTksgICAgIDB4MDAwNAorI2RlZmluZSBmUlhfSFRDICAgICAgICAgMHgwMDA4CisjZGVmaW5lIGZSWF9QQUQgICAgICAgICAweDAwMTAKKyNkZWZpbmUgZlJYX0FNUERVICAgICAgIDB4MDAyMAorI2RlZmluZSBmUlhfUU9TCQkJMHgwMDQwCisjZGVmaW5lIGZSWF9JTkZSQQkJMHgwMDgwCisjZGVmaW5lIGZSWF9FQVAJCQkweDAxMDAKKyNkZWZpbmUgZlJYX01FU0gJCTB4MDIwMAorI2RlZmluZSBmUlhfQVBDTEkJCTB4MDQwMAorI2RlZmluZSBmUlhfRExTCQkJMHgwODAwCisjZGVmaW5lIGZSWF9XUEkJCQkweDEwMDAKKworI2RlZmluZSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRAkxNAorI2RlZmluZSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQJIDIKKworI2RlZmluZSBUWF9VTktPV05fRlJBTUUJCQkweDAwCisjZGVmaW5lIFRYX01DQVNUX0ZSQU1FCQkJMHgwMQorI2RlZmluZSBUWF9MRUdBQ1lfRlJBTUUJCQkweDAyCisjZGVmaW5lIFRYX0FNUERVX0ZSQU1FCQkJMHgwNAorI2RlZmluZSBUWF9BTVNEVV9GUkFNRQkJCTB4MDgKKyNkZWZpbmUgVFhfUkFMSU5LX0ZSQU1FCQkJMHgxMAorI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAorCisKKy8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgordHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KK3sKKwlVQ0hBUgkJCQlRdWVJZHg7CisJVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKKwlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCisJVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisKKwlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCisJSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7CisKKwkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0OworCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQorCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKKwlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCisJUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCisJVUNIQVIJCQkJSGVhZGVyQnVmWzgwXTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAorCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKKwlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOworCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAorCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKKwlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCisJVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQorCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPworCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KKwlQQ0lQSEVSX0tFWQkJCXBLZXk7CisKKworCisJVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgorCisJLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgorCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KK30gVFhfQkxLLCAqUFRYX0JMSzsKKworCisjZGVmaW5lIGZUWF9iUnRzUmVxdWlyZWQJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgorI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkICAgICAgIAkweDAwMDIJLy8gdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZQorI2RlZmluZSBmVFhfYlBpZ2d5QmFjayAgICAgCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90CisjZGVmaW5lIGZUWF9iSFRSYXRlICAgICAgICAgCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQorLy8jZGVmaW5lIGZUWF9iRm9yY2VMb3dSYXRlICAgICAgIDB4MDAxMAkvLyBmb3JjZSB0byB1c2UgTG93IFJhdGUKKyNkZWZpbmUgZlRYX2JGb3JjZU5vblFvUyAgICAgICAJMHgwMDEwCS8vIGZvcmNlIHRvIHRyYW5zbWl0IGZyYW1lIHdpdGhvdXQgV01NLVFvUyBpbiBIVCBtb2RlCisjZGVmaW5lIGZUWF9iQWxsb3dGcmFnICAgICAgIAkweDAwMjAJLy8gYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50CisjZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLy8gdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZQorI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLy8gUU9TIERhdGEKKworI2RlZmluZSBmVFhfYkNsZWFyRUFQRnJhbWUJCTB4MDEwMAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKyNkZWZpbmUgVFhfQkxLX0FTU0lHTl9GTEFHKF9wVHhCbGssIF9mbGFnLCB2YWx1ZSkJXAorCQlkbyB7CQkJCQkJCQkJCVwKKwkJCWlmICh2YWx1ZSkgCQkJCQkJCQlcCisJCQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKSAJCQlcCisJCQllbHNlIAkJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCQlcCisJCX13aGlsZSgwKQorCisjZGVmaW5lIFRYX0JMS19TRVRfRkxBRyhfcFR4QmxrLCBfZmxhZykJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgVFhfQkxLX1RFU1RfRkxBRyhfcFR4QmxrLCBfZmxhZykJKCgoX3BUeEJsay0+RmxhZ3MgJiBfZmxhZykgPT0gX2ZsYWcpID8gMSA6IDApCisjZGVmaW5lIFRYX0JMS19DTEVBUl9GTEFHKF9wVHhCbGssIF9mbGFnKQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCitzdGF0aWMgaW5saW5lIFZPSUQJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKAorCUlOICBQVUNIQVIJCQlEZXN0LAorIAlJTglQVUNIQVIJCQlTcmMsCisgICAgSU4gIEJPT0xFQU4JCQlEb0VuY3J5cHQsCisJSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSkKK3sKKwlVSU5UMzIgKnAxLCAqcDI7CisKKwlwMSA9ICgoVUlOVDMyICopRGVzdCk7CisJcDIgPSAoKFVJTlQzMiAqKVNyYyk7CisKKwkqcDEgPSAqcDI7CisJKihwMSsyKSA9ICoocDIrMik7CisJKihwMSszKSA9ICoocDIrMyk7CisJKihwMSsxKSA9ICoocDIrMSk7IC8vIFdvcmQgMTsgdGhpcyBtdXN0IGJlIHdyaXR0ZW4gYmFjayBsYXN0Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCisJCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QV0lFbmRpYW5DaGFuZ2UoCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEZXNjcmlwdG9yVHlwZSkKK3sKKwlpbnQgc2l6ZTsKKwlpbnQgaTsKKworCXNpemUgPSAoKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkgPyBUWFdJX1NJWkUgOiBSWFdJX1NJWkUpOworCisJaWYoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKQorCXsKKwkJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKKwkJKigoVUlOVDMyICopKHBEYXRhICsgNCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs0KSkpOwkvLyBCeXRlIDR+NworCX0KKwllbHNlCisJeworCQlmb3IoaT0wOyBpIDwgc2l6ZS80IDsgaSsrKQorCQkJKigoKFVJTlQzMiAqKXBEYXRhKSAraSkgPSBTV0FQMzIoKigoKFVJTlQzMiAqKXBEYXRhKStpKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgorCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQoreworCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBhbGwga2luZHMgb2YgODAyLjExIGZyYW1lcyAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gdGhlIDgwMi4xMSBmcmFtZSBzdHJ1Y3R1cmUKKwkJRGlyIAkJCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKwkJRnJvbVJ4RG9uZUludAlDYWxsZXIgaXMgZnJvbSBSeERvbmUgaW50ZXJydXB0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGJ1ZmZlciBkYXRhCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSBWT0lECVJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURpciwKKwlJTglCT09MRUFOIAkJRnJvbVJ4RG9uZUludCkKK3sKKwlQSEVBREVSXzgwMl8xMSBwRnJhbWU7CisJUFVDSEFSCXBNYWNIZHI7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sIGZpZWxkCisJaWYoRGlyID09IERJUl9SRUFEKQorCXsKKwkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKKwl9CisKKwlwRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBEYXRhOworCXBNYWNIZHIgPSAoUFVDSEFSKSBwRnJhbWU7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBEdXJhdGlvbi9JRCBmaWVsZAorCSooVVNIT1JUICopKHBNYWNIZHIgKyAyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMikpOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU2VxdWVuY2UgQ29udHJvbCBmaWVsZAorCSooVVNIT1JUICopKHBNYWNIZHIgKyAyMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIyKSk7CisKKwlpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwl7CisJCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCisJCXsKKwkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIExpc3RlbiBJbnRlcnZhbCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JTUDoKKwkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBSUQgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BVVRIOgorCQkJCS8vIElmIGZyb20gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQgcm91dGluZSwgaXQgaXMgc3RpbGwgYSBlbmNyeXB0IGZvcm1hdC4KKwkJCQkvLyBUaGUgY29udmVydGlvbiBpcyBkZWxheWVkIHRvIFJUTVBIYW5kbGVEZWNyeXB0aW9uRG9uZUludGVycnVwdC4KKwkJCQlpZighRnJvbVJ4RG9uZUludCAmJiBwRnJhbWUtPkZDLldlcCA9PSAxKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIEFsZyBOby4gZmllbGQKKwkJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggU2VxIE5vLiBmaWVsZAorCQkJCQlwTWFjSGRyICs9IDI7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQkVBQ09OOgorCQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBCZWFjb25JbnRlcnZhbCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gKHNpemVvZihIRUFERVJfODAyXzExKSArIFRJTUVTVEFNUF9MRU4pOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihVU0hPUlQpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfREVBVVRIOgorCQkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFJlYXNvbiBjb2RlIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSBpZiggcEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0RBVEEgKQorCXsKKwl9CisJZWxzZSBpZihwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwl7CisJCXN3aXRjaChwRnJhbWUtPkZDLlN1YlR5cGUpCisJCXsKKwkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgorCQkJCXsKKwkJCQkJUEZSQU1FX0JBX1JFUSBwQkFSZXEgPSAoUEZSQU1FX0JBX1JFUSlwRnJhbWU7CisJCQkJCSooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpID0gU1dBUDE2KCooVVNIT1JUICopKCZwQkFSZXEtPkJBUkNvbnRyb2wpKTsKKwkJCQkJcEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQgPSBTV0FQMTYocEJBUmVxLT5CQVN0YXJ0aW5nU2VxLndvcmQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6CisJCQkJLy8gRm9yIEJsb2NrIEFjayBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIzCisJCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pID0gU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BQ0s6CisJCQkJLy9Gb3IgQUNLIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjIKKwkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSk9CVNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyMlswXSkpOworCQkJCWJyZWFrOworCQl9CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSW52YWxpZCBGcmFtZSBUeXBlISEhXG4iKSk7CisJfQorCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbAorCWlmKERpciA9PSBESVJfV1JJVEUpCisJeworCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOworCX0KK30KKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKworc3RhdGljIGlubGluZSBWT0lEIENvbnZlcnRNdWx0aWNhc3RJUDJNQUMoCisJSU4gUFVDSEFSIHBJcEFkZHIsCisJSU4gUFVDSEFSICpwcE1hY0FkZHIsCisJSU4gVUlOVDE2IFByb3RvVHlwZSkKK3sKKwlpZiAocElwQWRkciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocHBNYWNBZGRyID09IE5VTEwgfHwgKnBwTWFjQWRkciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKFByb3RvVHlwZSkKKwl7CisJCWNhc2UgRVRIX1BfSVBWNjoKKy8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCQkqKCpwcE1hY0FkZHIpID0gMHgzMzsKKwkJCSooKnBwTWFjQWRkciArIDEpID0gMHgzMzsKKwkJCSooKnBwTWFjQWRkciArIDIpID0gcElwQWRkclsxMl07CisJCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMTNdOworCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzE0XTsKKwkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclsxNV07CisJCQlicmVhazsKKworCQljYXNlIEVUSF9QX0lQOgorCQlkZWZhdWx0OgorLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJCSooKnBwTWFjQWRkcikgPSAweDAxOworCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDAwOworCQkJKigqcHBNYWNBZGRyICsgMikgPSAweDVlOworCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzFdICYgMHg3ZjsKKwkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsyXTsKKwkJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclszXTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworQk9PTEVBTiBSVE1QQ2hlY2tGb3JIYW5nKAorCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CisJKTsKKworVk9JRCAgUlRNUEhhbHQoCisJSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQKKwkpOworCisvLworLy8gIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9pbml0LmMKKy8vCitORElTX1NUQVRVUyBSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gUFZPSUQJCQloYW5kbGUsCisJT1VUIFBSVE1QX0FEQVBURVIgICAqcHBBZGFwdGVyCisJKTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKKwkpOworCitORElTX1NUQVRVUyBSVE1QRmluZEFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE5ESVNfSEFORExFICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpOworCitORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkCisJKTsKKworVk9JRCBSVE1QRnJlZUFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKKwkpOworCitORElTX1NUQVRVUyBOSUNSZWFkUmVnUGFyYW1ldGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIE5ESVNfSEFORExFICAgICAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKTsKKworI2lmZGVmIFJUMjg3MAorVk9JRCBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCitWT0lEIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTglQVUNIQVIJCQkJbWFjX2FkZHIpOworCitWT0lEIE5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworCitWT0lEIE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KTsKKworTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpOworCitWT0lEIE5JQ0lzc3VlUmVzZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBSaW5nQ2xlYW5VcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlKTsKKworVk9JRCBSeFRlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBEYmdTZW5kUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK1ZPSUQgVXNlckNmZ0luaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ1Jlc2V0RnJvbUVycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNFcmFzZUZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIE5JQ0NoZWNrRm9ySGFuZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKyNpZiAwCitVTE9ORyBSVE1QRXF1YWxNZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKyNlbmRpZgorCitVTE9ORwlSVE1QTm90QWxsWmVybygKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglVTE9ORwlMZW5ndGgpOworCitWT0lEIFJUTVBaZXJvTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QTW92ZU1lbW9yeSgKKwlPVVQgUFZPSUQgICBwRGVzdCwKKwlJTiAgUFZPSUQgICBwU3JjLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQXRvSCgKKwljaGFyCSpzcmMsCisJVUNIQVIJKmRlc3QsCisJaW50CQlkZXN0bGVuKTsKKworVUNIQVIgQnRvSCgKKwljaGFyIGNoKTsKKworVk9JRCBSVE1QUGF0Y2hNYWNCYnBCdWcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBQYXRjaENhcmRCdXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlcik7CisKK1ZPSUQgUlRNUFBhdGNoUmFsaW5rQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVMT05HCQkJQnVzKTsKKworVUxPTkcgUlRNUFJlYWRDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCk7CisKK1ZPSUQgUlRNUFdyaXRlQ0JDb25maWcoCisJSU4JVUxPTkcJQnVzLAorCUlOCVVMT05HCVNsb3QsCisJSU4JVUxPTkcJRnVuYywKKwlJTglVTE9ORwlPZmZzZXQsCisJSU4JVUxPTkcJVmFsdWUpOworCitWT0lEIFJUTVBJbml0VGltZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgICAgIHBBZCwKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBQVk9JRCAgICAgICAgICAgICAgICAgICBwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgUmVwZWF0KTsKKworVk9JRCBSVE1QU2V0VGltZXIoCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlJTiAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWUpOworCisKK1ZPSUQgUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpOworCitWT0lEIFJUTVBDYW5jZWxUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCU9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAqcENhbmNlbGxlZCk7CisKK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpOworCitWT0lEIFJUTVBTZXRTaWduYWxMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKKworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWN0aW9uLmMKKy8vCitWT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgU2VuZFBTTVBBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlXY2lkLAorCUlOIFVDSEFSCQkJUHNtcCk7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZEJTUzIwNDBDb2V4aXN0TWdtdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglXY2lkLAorCUlOCVVDSEFSCWFwaWR4LAorCUlOCVVDSEFSCUluZm9SZXEpOworCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KTsKKworQk9PTEVBTiBDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7CisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgQ2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KTsKKworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworVk9JRCBQZWVyQlNTVHJhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBSRUNCQVRpbWVyVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBTZW5kUmVmcmVzaEJBUigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQWN0SGVhZGVySW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFBVQ0hBUiBBZGRyMSwKKyAgICBJTiBQVUNIQVIgQWRkcjIsCisgICAgSU4gUFVDSEFSIEFkZHIzKTsKKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSk7CisKK1ZPSUQgSW5zZXJ0QWN0RmllbGQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggQ2F0ZWdvcnksCisJSU4gVUlOVDggQWN0Q29kZSk7CisKK0JPT0xFQU4gUW9zQkFEYXRhUGFyc2UoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTiBiQU1TRFUsCisJSU4gUFVDSEFSIHA4MDIzSGVhZGVyLAorCUlOIFVDSEFSCVdDSUQsCisJSU4gVUNIQVIJVElELAorCUlOIFVTSE9SVCBTZXF1ZW5jZSwKKwlJTiBVQ0hBUiBEYXRhT2Zmc2V0LAorCUlOIFVTSE9SVCBEYXRhc2l6ZSwKKwlJTiBVSU5UICAgQ3VyUnhJbmRleCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCUlOIFBGUkFNRV9CQV9SRVEgcE1zZyk7CisKK1ZPSUQgQmFBdXRvTWFuU3dpdGNoKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBIVElPVENoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICAgICBCYXRSZWNJZHgpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2RhdGEuYworLy8KK0JPT0xFQU4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVR4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCk7CisKK1ZPSUQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKwordm9pZCBSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBQcmV2QWRkcjEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwODAyM2hkcik7CisKK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgVHhSYXRlLAorICAgIElOICBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSk7CisKKyNpZiAwCS8vIEl0J3Mgbm90IGJlIHVzZWQKK0hUVFJBTlNNSVRfU0VUVElORyAgKkdldFR4TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKTsKKyNlbmRpZgorCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOICBQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGVzaXJlZE9mZnNldCwKKwlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMCwKKwlPVVQgUFVDSEFSICAgICAgICAgIHBCeXRlMSk7CisKK05ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVk9JRCBTVEFTZW5kUGFja2V0cygKKwlJTiAgTkRJU19IQU5ETEUgICAgIE1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4gIFBQTkRJU19QQUNLRVQgICBwcFBhY2tldEFycmF5LAorCUlOICBVSU5UICAgICAgICAgICAgTnVtYmVyT2ZQYWNrZXRzKTsKKworVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgIAlJTglCT09MRUFOCQkJYkludENvbnRleHQsCisJSU4gIFVDSEFSCQkJUXVlSWR4LAorCUlOCVVDSEFSCQkJTWF4X1R4X1BhY2tldHMpOworCitORElTX1NUQVRVUwlSVE1QSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJT1VUCVBVTE9ORwkJCXBGcmVlVFhETGVmdCk7CisKK05ESVNfU1RBVFVTCVNUQUhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBUWF9CTEsJCQkqcFR4QmxrLAorCUlOICBVQ0hBUgkJCVF1ZUlkeCk7CisKK1ZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUsCisJSU4gIFVDSEFSICAgICAgICAgICBOdW1iZXJSZXF1aXJlZCwKKwlJTiAJUFVDSEFSICAgICAgICAgIEZyZWVOdW1iZXJJcyk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUglRdWVJZHgsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVVNIT1JUICBSVE1QQ2FsY0R1cmF0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmF0ZSwKKwlJTiAgVUxPTkcgICAgICAgICAgIFNpemUpOworCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOICBCT09MRUFOICAgIAkJRlJBRywKKwlJTiAgQk9PTEVBTiAgICAJCUNGQUNLLAorCUlOICBCT09MRUFOICAgIAkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4JCQlBTVBEVSwKKwlJTglCT09MRUFOCQkJQWNrLAorCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOICBVQ0hBUiAgICAgIAkJUElELAorCUlOCVVDSEFSCQkJVElELAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsayk7CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOCQkJYldJViwKKwlJTglVQ0hBUgkJCVFTRUwpOworCitWT0lEIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbmd0aCk7CisKK05ESVNfU1RBVFVTIE1pbmlwb3J0RGF0YU1NUmVxdWVzdCgKKwkgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJIElOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAorCSBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCSBJTiAgVUlOVCAgICAgICAgICAgIExlbmd0aCk7CisKK1ZPSUQgUlRNUFNlbmROdWxsRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKKworVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBTZW5kUlRTRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCisJSU4gIFVTSE9SVCAgICAgICAgICBBY2tEdXJhdGlvbiwKKwlJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKKwlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7CisKKworTkRJU19TVEFUVVMgUlRNUEFwcGx5UGFja2V0RmlsdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworUFFVRVVFX0hFQURFUiAgIFJUTVBDaGVja1R4U3dRdWV1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVUNIQVIgICAgICAgICAgICpRdWVJZHgpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBSZXBvcnRNaWNFcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUENJUEhFUl9LRVkgICAgIHBXcGFLZXkpOworCitWT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiAgUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JQk9PTEVBTiAgICBwSW5zQU1TRFVIZHIsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwSW5QYWNrZXQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCk7CisKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICAqcFBhY2tldCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXIsCisJSU4gIFVJTlQgICAgICAgICAgICBIZWFkZXJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4pOworCitWT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitCT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIFF1ZUlkeCk7CisKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitCT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVk9JRCBSVE1QQ2NrQmJwVHVuaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQJCQlUeFJhdGUpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX3dlcC5jCisvLworVk9JRCBSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKKworVk9JRCBSVE1QRW5jcnlwdERhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitCT09MRUFOCVJUTVBEZWNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCUxlbiwKKwlJTglVSU5UCQkJaWR4KTsKKworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSk7CisKK1ZPSUQgUlRNUFNldElDVigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0KTsKKworVk9JRCBBUkNGT1VSX0lOSVQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBVSU5UICAgICAgICAgICAgS2V5TGVuKTsKKworVUNIQVIgICBBUkNGT1VSX0JZVEUoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCAgICAgQ3R4KTsKKworVk9JRCBBUkNGT1VSX0RFQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEIEFSQ0ZPVVJfRU5DUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVUlOVCBSVE1QX0NBTENfRkNTMzIoCisJSU4gIFVJTlQgICBGY3MsCisJSU4gIFBVQ0hBUiAgQ3AsCisJSU4gIElOVCAgICAgTGVuKTsKKworLy8KKy8vIE1MTUUgcm91dGluZXMKKy8vCisKKy8vIEFzaWMvUkYvQkJQIHJlbGF0ZWQgZnVuY3Rpb25zCisKK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCQlVU0hPUlQJCQlPcGVyYWlvbk1vZGUsCisJSU4gCQlVQ0hBUgkJCVNldE1hc2ssCisJSU4JCUJPT0xFQU4JCQliRGlzYWJsZUJHUHJvdGVjdCwKKwlJTgkJQk9PTEVBTgkJCWJOb25HRkV4aXN0KTsKKworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKTsKKworVk9JRCBBc2ljTG9ja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCkgOworCitWT0lEIEFzaWNBbnRlbm5hU2VsZWN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKTsKKworVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworVk9JRCBBc2ljRm9yY2VTbGVlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgQXNpY1NldEJzc2lkKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEJzc2lkKTsKKworVk9JRCBBc2ljU2V0TWNhc3RXQygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZiAwCS8vIHJlbW92ZWQgYnkgQWxiZXJ0WQorVk9JRCBBc2ljU2V0QnNzaWRXQygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKTsKKyNlbmRpZgorCitWT0lEIEFzaWNEZWxXY2lkVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCVdjaWQpOworCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEaXNhYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGlzYWJsZVN5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNFbmFibGVCc3NTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNTZXRFZGNhUGFybSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRURDQV9QQVJNICAgIHBFZGNhUGFybSk7CisKK1ZPSUQgQXNpY1NldFNsb3RUaW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWUpOworCisjaWYgMAorVk9JRCBBc2ljQWRkV2NpZENpcGhlckVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgV0NJRCwKKwlJTiBVQ0hBUgkJIEJzc0luZGV4LAorCUlOIFVDSEFSCQkgS2V5VGFibGUsCisJSU4gVUNIQVIJCSBDaXBoZXJBbGcsCisJSU4gUFVDSEFSCQkgcEFkZHIsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KTsKKyNlbmRpZgorCitWT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICAgS2V5SWR4LAorCUlOIFVDSEFSICAgICAgICAgQ2lwaGVyQWxnLAorCUlOIFBVQ0hBUiAgICAgICAgcEtleSwKKwlJTiBQVUNIQVIgICAgICAgIHBUeE1pYywKKwlJTiBQVUNIQVIgICAgICAgIHBSeE1pYyk7CisKK1ZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgICBLZXlJZHgpOworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCitWT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVMT05HICAgICAgICB1SVYsCisJSU4gVUxPTkcgICAgICAgIHVFSVYpOworCitWT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkcik7CisKK1ZPSUQgQXNpY0FkZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIJCUtleUlkeCwKKwlJTiBQQ0lQSEVSX0tFWQlwQ2lwaGVyS2V5LAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSwKKwlJTiBCT09MRUFOCQliVHhLZXkpOworCitWT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIJCVdDSUQsCisJSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KTsKKworVk9JRCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gVUNIQVIJCSBCc3NJZHgsCisJSU4gVUNIQVIJCSBXY2lkKTsKKworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIENvbW1hbmQsCisJSU4gVUNIQVIgICAgICAgICBUb2tlbiwKKwlJTiBVQ0hBUiAgICAgICAgIEFyZzAsCisJSU4gVUNIQVIgICAgICAgICBBcmcxKTsKKworCitWT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICBwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKTsKKworVk9JRCBNbG1lUmFkaW9PZmYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworCitWT0lEIEJzc1RhYmxlSW5pdCgKKwlJTiBCU1NfVEFCTEUgKlRhYik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gQkFfVEFCTEUgKlRhYik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1VMT05HIEJzc1RhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gVUNIQVIgQ2hhbm5lbCk7CisKK1VMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgICAgcEJzc2lkLAorCUlOIFBVQ0hBUiAgICBwU3NpZCwKKwlJTiBVQ0hBUiAgICAgU3NpZExlbiwKKwlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7CisKK1VMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSICAgIEJzc2lkLAorCUlOIFBVQ0hBUiAgICBwU3NpZCwKKwlJTiBVQ0hBUiAgICAgU3NpZExlbiwKKwlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKKwlJTiBPVVQgIFBCU1NfVEFCTEUgcFRhYiwKKwlJTiAgICAgIFBVQ0hBUiBwQnNzaWQsCisJSU4gICAgICBVQ0hBUiBDaGFubmVsKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KTsKKworVk9JRCBCQVRhYmxlRGVsZXRlUkVDRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9SRUNfRU5UUlkJKnBCQVJFQ0VudHJ5KTsKKworVk9JRCBCQVRhYmxlVGVhck9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgVElELAorCUlOCQlVQ0hBUiBXY2lkLAorCUlOCQlCT09MRUFOIGJGb3JjZURlbGV0ZSwKKwlJTgkJQk9PTEVBTiBBTEwpOworCitWT0lEIEJBVGFibGVUZWFyUkVDRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBUSUQsCisJSU4JCVVDSEFSIFdDSUQsCisJSU4JCUJPT0xFQU4gQUxMKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCAgQnNzRW50cnlTZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBCU1NfRU5UUlkgcEJzcywKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIFBDRl9QQVJNIENmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCitVTE9ORyAgQnNzVGFibGVTZXRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUEJTU19UQUJMRSBwVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluc2VydEVudHJ5KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVTSE9SVCBBaWQsCisgICAgSU4gVVNIT1JUCQlUaW1lT3V0VmFsdWUsCisJSU4gVVNIT1JUCQlTdGFydGluZ1NlcSwKKyAgICBJTiBVQ0hBUiBUSUQsCisJSU4gVUNIQVIgQkFXaW5TaXplLAorCUlOIFVDSEFSIE9yaWdpbmF0b3JTdGF0dXMsCisgICAgSU4gQk9PTEVBTiBJc1JlY2lwaWVudCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJzczIwNDBDb2V4aXN0VGltZU91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisKK1ZPSUQgIFRyaUV2ZW50SW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1VMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlSZWdDbGFzcywKKwlJTiBVQ0hBUiBDaGFubmVsTm8pOworCitWT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQnNzVGFibGVTc2lkU29ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuKTsKKworVk9JRCAgQnNzVGFibGVTb3J0QnlSc3NpKAorCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYik7CisKK1ZPSUQgQnNzQ2lwaGVyUGFyc2UoCisJSU4gT1VUICBQQlNTX0VOVFJZICBwQnNzKTsKKworTkRJU19TVEFUVVMgIE1sbWVRdWV1ZUluaXQoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitWT0lEICBNbG1lUXVldWVEZXN0cm95KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiBNbG1lRW5xdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBNYWNoaW5lLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZyk7CisKK0JPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCisJSU4gVUNIQVIgUnNzaTAsCisJSU4gVUNIQVIgUnNzaTEsCisJSU4gVUNIQVIgUnNzaTIsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFBWT0lEIE1zZywKKwlJTiBVQ0hBUiBTaWduYWwpOworCisKK0JPT0xFQU4gTWxtZURlcXVldWUoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUsCisJT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pOworCitWT0lEICAgIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiAgTWxtZVF1ZXVlRW1wdHkoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOICBNbG1lUXVldWVGdWxsKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiAgTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorCU9VVCBJTlQgKk1hY2hpbmUsCisJT1VUIElOVCAqTXNnVHlwZSk7CisKK1ZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBTVEFURV9NQUNISU5FICpTbSwKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEYpOworCitWT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIERyb3AoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgUmVhc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBEaXNhc3NvY1RpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIENsczNlcnJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEICBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUlQyODcwCitWT0lEIE1sbWVDbnRsQ29uZmlybSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVTSE9SVCBNc2cpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCitWT0lEICBDb21wb3NlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEICBBc3NvY1Bvc3RQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIyLAorCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gIFVTSE9SVCBBaWQsCisJSU4gIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiAgVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiAgVUNIQVIgRXh0UmF0ZVtdLAorCUlOICBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCisJSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBQU1RBVEVfTUFDSElORSBzbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEF1dGhUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ2xzMmVyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQU1RBVEVfTUFDSElORSBTbSwKKwlJTiAgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gIFVTSE9SVCBBbGcsCisJSU4gIFVTSE9SVCBTZXEsCisJSU4gIFVTSE9SVCBSZWFzb24sCisJSU4gIFVTSE9SVCBTdGF0dXMpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYworLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKTsKKworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKKworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKTsKKworSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCXdjaWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxPaWRTY2FuUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNzaWRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MyKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKK1ZPSUQgTGlua1VwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBCc3NUeXBlKTsKKworVk9JRCBMaW5rRG93bigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKKworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKKworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiAgVUxPTkcgQnNzSWR4KTsKKworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVUxPTkcgVGltZW91dCwKKwlJTiAgVVNIT1JUIExpc3RlbkludHYpOworCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbiwKKwlJTiAgVUNIQVIgQnNzVHlwZSwKKwlJTiAgVUNIQVIgU2NhblR5cGUpOworCitWT0lEIERpc2Fzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBSZWFzb24pOworCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIEFsZyk7CisKK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRW5xdWV1ZUJlYWNvbkZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VMT05HIE1ha2VJYnNzQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBDQ1hBZGphY2VudEFQUmVwb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpCc3NUeXBlLAorCU9VVCBDSEFSIHNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRMZW4sCisJT1VUIFVDSEFSICpTY2FuVHlwZSk7CisKK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlJTiAgVUNIQVIgTXNnQ2hhbm5lbCwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgUFVDSEFSIHBCc3NpZCwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBCc3NUeXBlLAorCU9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisJT1VUIFVDSEFSICpwQ2hhbm5lbCwKKwlPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorCU9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorCU9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorCU9VVCBVU0hPUlQgKnBBdGltV2luLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUNIQVIgKnBFcnAsCisJT1VUIFVDSEFSICpwRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorCU9VVCBVQ0hBUiBTdXBSYXRlW10sCisJT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKwlPVVQgVUNIQVIgRXh0UmF0ZVtdLAorCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisJT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisJT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorCU9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKwlPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisJT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCU9VVCBVTE9ORyAqcFJhbGlua0llLAorCU9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCU9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbCwKKwlPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisJT1VUIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFwQWRkciwKKwlPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqTGlzdGVuSW50dik7CisKK0JPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIsCisJT1VUIFVMT05HICpUaW1lb3V0LAorCU9VVCBVU0hPUlQgKkFsZyk7CisKK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpTc2lkbGVuKTsKKworQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVVNIT1JUICpBbGcsCisJT1VUIFVTSE9SVCAqU2VxLAorCU9VVCBVU0hPUlQgKlN0YXR1cywKKwlPVVQgQ0hBUiBDaGxnVGV4dFtdKTsKKworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVVNIT1JUICpwU3RhdHVzLAorCU9VVCBVU0hPUlQgKnBBaWQsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisgICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisgICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCisgICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCU9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlPVVQgVUNIQVIgKnBDa2lwRmxhZyk7CisKK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KAorICAgIElOIAlQUlRNUF9BREFQVEVSIAkJcEFkLAorICAgIElOIAlQRUFQT0xfUEFDS0VUIAkJcE1zZywKKyAgICBJTiAJVUxPTkcgCQkJCU1zZ0xlbiwKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTiAJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeSk7CisKK0JPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuKTsKKworQk9PTEVBTiBHZXRUaW1CaXQoCisJSU4gIENIQVIgKlB0ciwKKwlJTiAgVVNIT1JUIEFpZCwKKwlPVVQgVUNIQVIgKlRpbUxlbiwKKwlPVVQgVUNIQVIgKkJjYXN0RmxhZywKKwlPVVQgVUNIQVIgKkR0aW1Db3VudCwKKwlPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpNZXNzYWdlVG9NZSk7CisKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCk7CisKK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorCUlOIFBCU1NfRU5UUlkgcEJzcyk7CisKKyNpZiAwCS8vIEl0J3Mgb21pdHRlZAorTkRJU19TVEFUVVMJUlRNUFdlcEtleVNhbml0eSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBWT0lECQkJcEJ1Zik7CisjZW5kaWYKKworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIpOworCitVTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKKwlPVVQgQ0hBUiAqQnVmZmVyLAorCU9VVCBVTE9ORyAqTGVuZ3RoLCAuLi4pOworCitWT0lEICBMZnNySW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgU2VlZCk7CisKK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwVHhSYXRlKTsKKworVk9JRCAgTWxtZVBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExpbmtEb3duRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExpbmtVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAorCVBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCisJSU4gUFVDSEFSIHBTc2lkLAorCUlOIFVDSEFSICBTc2lkTGVuKTsKKworVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HICAgIE5vdzMyKTsKKworVk9JRCBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgIE5vdyk7CisKK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVTZXRUeFJhdGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKKworVk9JRCBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCisJSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCisJSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKKworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93KTsKKworVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgICAgTm93MzIpOworCitWT0lEIE1sbWVTZXRQc21CaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHBzbSk7CisKK1ZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFR4UHJlYW1ibGUpOworCitWT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgTWxtZVVwZGF0ZVR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIAlCT09MRUFOCQkgCWJMaW5rVXAsCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCAgICBSVE1QQ2hlY2tSYXRlcygKKwlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUICBVQ0hBUiAgICAgICAgICAgU3VwUmF0ZVtdLAorCUlOIE9VVCAgVUNIQVIgICAgICAgICAgICpTdXBSYXRlTGVuKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKKwlJTiBVQ0hBUgkJQ2hhbm5lbCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0JPT0xFQU4gCVJUTVBDaGVja0h0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJV2NpZCwKKwlJTiBPVVQJSFRfQ0FQQUJJTElUWV9JRQkJCSpwSHRDYXBhYmlsaXR5LAorCUlOIE9VVAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKTsKKworVk9JRCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQXNpY0JicFR1bmluZzEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNCYnBUdW5pbmcyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitDSEFSIFJUTVBNYXhSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIENIQVIJCQkJUnNzaTAsCisJSU4gQ0hBUgkJCQlSc3NpMSwKKwlJTiBDSEFSCQkJCVJzc2kyKTsKKworVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK1VDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK1ZPSUQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygKKwkJVUNIQVIJCQkJZml4ZWRfdHhfbW9kZSwKKwkJUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSGFsdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVQ0hBUiBGaXJzdENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgY2hhbm5lbCk7CisKK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisKK1ZPSUQgUmFpc2VDbG9jaygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVDMyICp4KTsKKworVk9JRCBMb3dlckNsb2NrKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UMzIgKngpOworCitVU0hPUlQgU2hpZnRJbkJpdHMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFNoaWZ0T3V0Qml0cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIGRhdGEsCisJSU4gIFVTSE9SVCBjb3VudCk7CisKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRVdEUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRVdFTigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBPZmZzZXQpOworCitWT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBPZmZzZXQsCisJSU4gIFVTSE9SVCBEYXRhKTsKKworLy8KKy8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBydG1wX3RraXAuYworLy8KK1ZPSUQgICAgUlRNUEluaXRUa2lwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFRLZXksCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVFNDLAorCU9VVCBQVUxPTkcgICAgICAgICAgcElWMTYsCisJT1VUIFBVTE9ORyAgICAgICAgICBwSVYzMik7CisKK1ZPSUQgICAgUlRNUEluaXRNSUNFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSk7CisKK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBFbmNhcCwKKwlJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcExMQywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBSVE1QVGtpcEFwcGVuZEJ5dGUoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKKwlJTiAgVUNIQVIgICAgICAgICAgIHVDaGFyKTsKKworVk9JRCAgICBSVE1QVGtpcEFwcGVuZCgKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIG5CeXRlcyk7CisKK1ZPSUQgICAgUlRNUFRraXBHZXRNSUMoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCk7CisKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7CisKKyNpZiAwCS8vIHJlbW92ZWQgYnkgQWxiZXJ0WQorTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBWT0lEICAgICAgICAgICBwQnVmKTsKKyNlbmRpZgorCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKKy8vCitORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworCitWT0lEICAgIFJUTVBXUEFSZW1vdmVBbGxLZXlzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCisgICAgSU4gIENIQVIgKnBJblB1dFN0ciwKKyAgICBJTiAgVUNIQVIgc3RyTGVuKTsKKworVk9JRCAgICBSVE1QU2V0UGh5TW9kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgcGh5bW9kZSk7CisKK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworQ0hBUiAqR2V0RW5jcnlwdFR5cGUoCisJQ0hBUiBlbmMpOworCitDSEFSICpHZXRBdXRoTW9kZSgKKwlDSEFSIGF1dGgpOworCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpOworCitWT0lEIFJUTVBJbmRpY2F0ZVdQQTJTdGF0dXMoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZGFwdGVyKTsKKworVk9JRAlSVE1QT1BNb2RlU3dpdGNoaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCAgICBSVE1QQWRkQlNTSURDaXBoZXIoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJQWlkLAorICAgIElOICBQTkRJU184MDJfMTFfS0VZICAgIHBLZXksCisgICAgSU4gIFVDSEFSICAgQ2lwaGVyQWxnKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRAlSVE1QU2V0SFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKTsKKworVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOICBVQ0hBUgkJCUJzc0lkeCwKKwlJTglDSEFSCQkJUnNzaSk7CisKK1ZPSUQJTklDVXBkYXRlQ250bENvdW50ZXJzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gICAgVUNIQVIJCQlTdWJUeXBlLAorCUlOCVBSWFdJX1NUUlVDIAlwUnhXSSk7CisvLworLy8gcHJvdG90eXBlIGluIHdwYS5jCisvLworQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCisJSU4gIFVDSEFSICAgRUFQVHlwZSwKKwlPVVQgSU5UCQkqTXNnVHlwZSk7CisKK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFHcm91cE1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhTWFjSGVhZGVySW5pdCgKKwlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorCUlOICAgICAgVUNIQVIgICAgICAgICAgIHdlcCwKKwlJTiAgICAgIFBVQ0hBUiAgICAgICAgICBwQWRkcjEpOworCitWT0lEICAgIFdwYTJQYWlyTXNnMUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSk7CisKK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKTsKKworVk9JRCAgICBITUFDX1NIQTEoCisJSU4gIFVDSEFSICAgKnRleHQsCisJSU4gIFVJTlQgICAgdGV4dF9sZW4sCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgVUlOVCAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkaWdlc3QpOworCitWT0lEICAgIFBSRigKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBJTlQgICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKnByZWZpeCwKKwlJTiAgSU5UICAgICBwcmVmaXhfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCAgICBDQ0tNUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqZGF0YSwKKwlJTiAgSU5UICAgICBkYXRhX2xlbiwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBJTlQgICAgIGxlbik7CisKK1ZPSUQgV3BhQ291bnRQVEsoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqQU5vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlJTiAgVUNIQVIgICAqU05vbmNlLAorCUlOICBVQ0hBUiAgICpTQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2VuUmFuZG9tKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJKm1hY0FkZHIsCisJT1VUCVVDSEFSCQkJKnJhbmRvbSk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWlyb25ldC5jCisvLworVk9JRCAgICBBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyAgVHJhbnNbXSk7CisKK1ZPSUQgICAgQWlyb25ldE1zZ0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBCZWFjb25SZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgICAgQmVhY29uUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgIEluZGV4LAorCUlOICBQTUxNRV9RVUVVRV9FTEVNICAgIHBFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgICAgREJHUFJJTlRfVFhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgUXVlSWR4KTsKKworVk9JRCBEQkdQUklOVF9SWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCk7CisKK0NIQVIgICAgQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisKK1ZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBjbW1fd3BhLmMKKy8vCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOIFBVQ0hBUiAJCQlwRGF0YSwKKwlJTiBVTE9ORyAJCQlEYXRhQnl0ZUNvdW50LAorCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFFU19HVEtfS0VZX1VOV1JBUCgKKwlJTiAgVUNIQVIgICAqa2V5LAorCU9VVCBVQ0hBUiAgICpwbGFpbnRleHQsCisJSU4JVUNIQVIJY19sZW4sCisJSU4gIFVDSEFSICAgKmNpcGhlcnRleHQpOworCitCT09MRUFOIFJUTVBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKKwlJTiAJUFJUTVBfQURBUFRFUiAgICAJcEFkLAorICAgIElOIAlVQ0hBUgkJCQlQZWVyQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU15R3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZyk7CisKK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7CisKK1ZPSUQgUlRNUE1ha2VSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAorCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCisvLworCitCT09MRUFOIEFQV3BhTXNnVHlwZVN1YnN0KAorCUlOIFVDSEFSICAgIEVBUFR5cGUsCisJT1VUIElOVCAqTXNnVHlwZSkgOworCitNQUNfVEFCTEVfRU5UUlkgKlBBQ0lucXVpcnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBXY2lkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tNY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tVY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tBVVRIKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFdQQVN0YXJ0NFdheUhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTglVTE9ORwkJCVRpbWVJbnRlcnZhbCk7CisKK1ZPSUQgV1BBU3RhcnQyV2F5R3JvdXBIUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lEIEFQV3BhRUFQUGFja2V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTFN0YXJ0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTExvZ29mZkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYW5kbGVDb3VudGVyTWVhc3VyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ01UaW1lckV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBXUEFSZXRyeUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBFbnF1ZXVlU3RhcnRGb3JQU0tFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgUlRNUEhhbmRsZVNUQUtleSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZGFwdGVyLAorICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworI2lmIDAgLy8gbWVyZ2UgaW50byBQZWVyUGFpck1zZzRBY3Rpb24KK1ZPSUQgV3BhMVBlZXJQYWlyTXNnNEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBXcGEyUGVlclBhaXJNc2c0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworI2VuZGlmIC8vIDAgLy8KKworVk9JRCBQZWVyR3JvdXBNc2cyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFZPSUQgICAgICAgICAgICAgKk1zZywKKwlJTiAgVUlOVCAgICAgICAgICAgICBNc2dMZW4pOworCisjaWYgMAkvLyByZXBsYWNlZCBieSBXUEFTdGFydDJXYXlHcm91cEhTCitORElTX1NUQVRVUyBBUFdwYUhhcmRUcmFuc21pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5KTsKKyNlbmRpZiAvLyAwIC8vCisKK1ZPSUQgUGFpckRpc0Fzc29jQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKKworVk9JRCBNbG1lRGVBdXRoQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKKworVk9JRCBHUkVLRVlQZXJpb2RpY0V4ZWMoCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAorCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBDb3VudEdUSygKKwlJTiAgVUNIQVIgICAqUE1LLAorCUlOICBVQ0hBUiAgICpHTm9uY2UsCisJSU4gIFVDSEFSICAgKkFBLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIFVJTlQgICAgbGVuKTsKKworVk9JRCAgICBHZXRTbWFsbCgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlPVVQgUFVDSEFSICBvdXQsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCAgICBHZXRMYXJnZSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlPVVQgUFVDSEFSICBvdXQsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBBUEdlblJhbmRvbSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgVUNIQVIgICAgICAgKnJhbmRvbSk7CisKK1ZPSUQgQUVTX0dUS19LRVlfV1JBUCgKKwlJTiBVQ0hBUiAqa2V5LAorCUlOIFVDSEFSICpwbGFpbnRleHQsCisJSU4gVUNIQVIgcF9sZW4sCisJT1VUIFVDSEFSICpjaXBoZXJ0ZXh0KTsKKworVk9JRCAgICBXcGFTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwUGFja2V0LAorICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBBUFRvV2lyZWxlc3NTdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorCUlOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQliQ2xlYXJGcmFtZSk7CisKK1ZPSUQgUlRNUEFkZFBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJCXBBZCwKKwlJTglJTlQJCQkJCQlhcGlkeCwKKwlJTglQVUNIQVIJCQkJcEFkZHIsCisJSU4JVUNIQVIJCQkJCSpQTUtJRCwKKwlJTglVQ0hBUgkJCQkJKlBNSyk7CisKK0lOVCBSVE1QU2VhcmNoUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgsCisJSU4JUFVDSEFSCQlwQWRkcik7CisKK1ZPSUQgUlRNUERlbGV0ZVBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4LAorCUlOICBJTlQJCQkJaWR4KTsKKworVk9JRCBSVE1QTWFpbnRhaW5QTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRAlSVE1QU2VuZFRyaWdnZXJGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVk9JRAkJCXBCdWZmZXIsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisJSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKKworCisvL3R5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKKworCisvKiB0aW1lb3V0IC0tIG1zICovCitWT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAorCUlOCVBWT0lEIGRhdGEpOworCitWT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCisKK1ZPSUQgUlRNUF9PU19EZWxfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCU9VVAlCT09MRUFOCQkJCSAqcENhbmNlbGxlZCk7CisKKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KTsKKworVk9JRCBSVE1QdXNlY0RlbGF5KAorCUlOCVVMT05HCXVzZWMpOworCitORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUCVBVQ0hBUiAqbWVtLAorCUlOCVVMT05HICBzaXplKTsKKworTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFVDSEFSIG1lbSk7CisKKwordm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1ZPSUQgUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAorCUlOIFBWT0lECWhhbmRsZSwKKwlPVVQJUFZPSUQJKnBwQWQpOworCit2b2lkIFJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUlOVAlJbmRleCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgpOworCit2b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKKwordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCAqcHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspOworCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKTsKKworCisgdm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK1VJTlQgSGFuZGxlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCit2b2lkIGNvbnZlcnRfODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwODAyM2hkciwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcE9sZFBrdCk7CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVkxBTigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9XUEkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUlOVDMyCQkJZXh0X2hlYWRfbGVuLAorCUlOCVVJTlQzMgkJCWV4dF90YWlsX2xlbik7CisKK1VDSEFSIFZMQU5fODAyM19IZWFkZXJfQ29weSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4JVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlPVVQgUFVDSEFSCQkJcERhdGEsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBCQV9SRUNfRU5UUlkJcEJBRW50cnksCisJSU4gVUxPTkcJCQlOb3czMik7CisKKworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJSU4gTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJCQlJTiBVQ0hBUgkJCVRJRCwKKwkJCUlOIFVTSE9SVAkJCVRpbWVPdXQsCisJCQlJTiBVTE9ORwkJCURlbGF5VGltZSwKKwkJCUlOIEJPT0xFQU4JCWlzRm9yY2VkKTsKKworVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFdjaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitCT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpOworCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pOworCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVdjaWQsCisJSU4JCVVDSEFSCQkJVElELAorCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUsCisJSU4JCUJPT0xFQU4JCQliRm9yY2VTZW5kKTsKKworVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKKwlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJV2NpZCwKKwlJTgkJVUNIQVIJCQlUSUQsCisJSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSk7CisKK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK3ZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUxPTkcgQXV0b0NoQnNzSW5zZXJ0RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIENoYW5uZWxObywKKwlJTiBDSEFSIFJzc2kpOworCit2b2lkIEF1dG9DaEJzc1RhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQ2hhbm5lbEluZm9Jbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBBdXRvQ2hCc3NUYWJsZURlc3Ryb3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIENoYW5uZWxJbmZvRGVzdHJveSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VDSEFSIE5ld19BcEF1dG9TZWxlY3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBydHN0cm1hY3RvaGV4KAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworQk9PTEVBTiBydHN0cmNhc2VjbXAoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitjaGFyICpydHN0cnN0cnVuY2FzZWNtcCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK2NoYXIgICAgKnJ0c3Ryc3RyKAorCUlOCWNvbnN0IGNoYXIgKiBzMSwKKwlJTgljb25zdCBjaGFyICogczIpOworCitjaGFyICpyc3RydG9rKAorCUlOIGNoYXIgKiBzLAorCUlOIGNvbnN0IGNoYXIgKiBjdCk7CisKK2ludCBydGluZXRfYXRvbigKKwljb25zdCBjaGFyICpjcCwKKwl1bnNpZ25lZCBpbnQgKmFkZHIpOworCisvLy8vLy8vLy8vIGNvbW1vbiBpb2N0bCBmdW5jdGlvbnMgLy8vLy8vLy8vLworSU5UIFNldF9Ecml2ZXJWZXJzaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfU2hvcnRTbG90X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9UeFBvd2VyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9CR1Byb3RlY3Rpb25fUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1R4UHJlYW1ibGVfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfVHhCdXJzdF9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIERCRworSU5UCVNldF9EZWJ1Z19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UCVNob3dfRGVzY0luZm9fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0X0JBU2V0dXBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFN0YmNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0SHRjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNaW1vUHNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9Gb3JjZUdGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldENvbW1vbkhUKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworCitJTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy9EbHMgLAlrYXRoeQorVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy9CbG9jayBBQ0sKK1ZPSUQgUXVlcnlCQVRBQkxFKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFFVRVJZQkFfVEFCTEUgcEJBVCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQJICAgIFdwYUNoZWNrRWFwQ29kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCk7CisKK1ZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorICAgIElOICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0KTsKKworVk9JRCAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAoraW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKAorCUlOICBSVE1QX0FEQVBURVIgKnBBZCk7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBIYW5kbGVfQlNTX1dpZHRoX1RyaWdnZXJfRXZlbnRzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBidWlsZF9leHRfY2hhbm5lbF9zd2l0Y2hfaWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRSAqcElFKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCitCT09MRUFOIEFQUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCWFyZ2MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBBTVBEVSBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworLy8gQU1TRFUgcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCit2b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitVSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvLyByZW1vdmUgTExDIGFuZCBnZXQgODAyXzMgSGVhZGVyCisjZGVmaW5lICBSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKF9wUnhCbGssIF9wSGVhZGVyODAyXzMpCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlQVUNIQVIgX3BSZW1vdmVkTExDU05BUCA9IE5VTEwsIF9wREEsIF9wU0E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX01FU0gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9wU0EgPSAoUFVDSEFSKV9wUnhCbGstPnBIZWFkZXIgKyBzaXplb2YoSEVBREVSXzgwMl8xMSk7ICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0lORlJBKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0RMUykpCQkJCQkJCQkJXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOwkJCQkJCQkJCQlcCisJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlDT05WRVJUX1RPXzgwMl8zKF9wSGVhZGVyODAyXzMsIF9wREEsIF9wU0EsIF9wUnhCbGstPnBEYXRhLCAJCQkJXAorCQlfcFJ4QmxrLT5EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBBUEZvd2FyZFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVTE9ORwkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBBbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUylcCisJCQlTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpOworCQkJLy9hbm5vdW5jZV84MDJfM19wYWNrZXQoX3BBZCwgX3BQYWNrZXQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKKworUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy9mb3Igc25tcCAsIGthdGh5Cit0eXBlZGVmIHN0cnVjdCBfRGVmYXVsdEtleUlkeFZhbHVlCit7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSCVZhbHVlWzE2XTsKK30gRGVmYXVsdEtleUlkeFZhbHVlLCAqUERlZmF1bHRLZXlJZHhWYWx1ZTsKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2VudW0geworCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0JCT0gMHgwMDAwMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lCT0gMHgwMDAxMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUJPSAweDAwMDIwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbAk9IDB4MDAwMzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpCQk9IDB4MDAwNDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcQkJPSAweDAwMDUwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc2lnbmFsCT0gMHgwMDA2MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlCQk9IDB4MDAwNzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlCQk9IDB4MDAwODAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4CQk9IDB4MDAwOTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4JPSAweDAwMEEwMDQ0Cit9OworZW51bSB7CisJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZQk9IDB4MDAKK307CitlbnVtIHsKKwlQODAyMTFFTlVNX3RydXRoX2ZhbHNlCQkJPSAweDAwLAorCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQkJCT0gMHgwMQorfTsKKworLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyIGRpZDsKKyAgICAgICAgVUlOVDE2IHN0YXR1czsKKyAgICAgICAgVUlOVDE2IGxlbjsKKyAgICAgICAgVUlOVDMyIGRhdGE7Cit9IHA4MDIxMWl0ZW1fdWludDMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyIG1zZ2NvZGU7CisgICAgICAgIFVJTlQzMiBtc2dsZW47CisjZGVmaW5lIFdMQU5fREVWTkFNRUxFTl9NQVggMTYKKyAgICAgICAgVUlOVDggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBob3N0dGltZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBtYWN0aW1lOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcnNzaTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzcTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBzaWduYWw7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgcmF0ZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBpc3R4OworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGZybWxlbjsKK30gd2xhbl9uZ19wcmlzbTJfaGVhZGVyOworCisvKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX2llZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgeworICAgIFVJTlQ4CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKKwkJCQkgKiBmb3IgZHJhc3RpYyBjaGFuZ2VzLAorCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCisJCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KKwkJCQkgKi8KKyAgICBVSU5UOAlpdF9wYWQ7CisgICAgVUlOVDE2ICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQorCQkJCSAqIGhlYWRlciBpbiBieXRlcywgaW5jbHVkaW5nCisJCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAorCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgorCQkJCSAqLworICAgIFVJTlQzMiAgIGl0X3ByZXNlbnQ7CS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKKwkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCisJCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCisJCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCisJCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQorCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KKwkJCQkJICovCit9aWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciA7CisKK2VudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgeworICAgIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzCit9OworCisjZGVmaW5lIFdMQU5fUkFESU9UQVBfUFJFU0VOVCAoCQkJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUKQl8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSAgfCAJXAorCSAwKQorCit0eXBlZGVmIHN0cnVjdCBfd2xhbl9yYWRpb3RhcF9oZWFkZXIgeworCWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgd3RfaWhkcjsKKwlJTlQ2NCB3dF90c2Z0OworCVVJTlQ4IHd0X2ZsYWdzOworCVVJTlQ4IHd0X3JhdGU7Cit9IHdsYW5fcmFkaW90YXBfaGVhZGVyOworLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KKwordm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisjZW5kaWYKKworVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK0lOVAlTZXRfT3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCitzdGF0aWMgaW5saW5lIGNoYXIqIEdldFBoeU1vZGUoCisJaW50IE1vZGUpCit7CisJc3dpdGNoKE1vZGUpCisJeworCQljYXNlIE1PREVfQ0NLOgorCQkJcmV0dXJuICJDQ0siOworCisJCWNhc2UgTU9ERV9PRkRNOgorCQkJcmV0dXJuICJPRkRNIjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBNT0RFX0hUTUlYOgorCQkJcmV0dXJuICJIVE1JWCI7CisKKwkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKKwkJCXJldHVybiAiR1JFRU4iOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJOL0EiOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIGNoYXIqIEdldEJXKAorCWludCBCVykKK3sKKwlzd2l0Y2goQlcpCisJeworCQljYXNlIEJXXzEwOgorCQkJcmV0dXJuICIxME0iOworCisJCWNhc2UgQldfMjA6CisJCQlyZXR1cm4gIjIwTSI7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgQldfNDA6CisJCQlyZXR1cm4gIjQwTSI7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCisKK1ZPSUQgUlQyOHh4VGhyZWFkVGVybWluYXRlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soCisJSU4gdm9pZCAqX2Rldl9wKTsKKworQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJYXJnYyk7CisKK1ZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK1ZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKKwlJTiBSVE1QX0FEQVBURVIgKiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVMT05HIEJlYWNvbkxlbiwKKwlJTiBVTE9ORyBVcGRhdGVQb3MpOworCitJTlQgcnQyOHh4X2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCWNtZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJY21kKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworQk9PTEVBTiBSVDI4WFhTZWN1cml0eUtleUFkZCgKKwlJTgkJUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCQlVTE9ORwkJCQlhcGlkeCwKKwlJTgkJVUxPTkcJCQkJS2V5SWR4LAorCUlOCQlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7CisKKwordm9pZCBraWxsX3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCB0YnR0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKKworCitWT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4JVUNIQVIgICAgICAgICAgIENoYW5uZWwpOworCitWT0lEIEFzaWNUdXJuT25SRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKTsKKworI2lmZGVmIFJUMjg3MAorLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9idWxrLmMKKy8vCitWT0lECVJUVVNCSW5pdFR4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhfQ09OVEVYVAkJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JdXNiX2NvbXBsZXRlX3QJRnVuYyk7CisKK1ZPSUQJUlRVU0JJbml0SFRUeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKTsKKworVk9JRAlSVFVTQkluaXRSeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpOworCitWT0lEIFJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQnVsa091dERhdGFQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVDSEFSCQkJSW5kZXgpOworCitWT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0UlRTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nSVJQcygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KTsKKworVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGwoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCS2lja0J1bGtPdXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lECVJUVVNCQnVsa1JlY2VpdmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIERvQnVsa0luKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVFVTQkluaXRSeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBSWF9DT05URVhUCQlwUnhDb250ZXh0KTsKKworVk9JRCBSVFVTQkJ1bGtSeEhhbmRsZSgKKwlJTiB1bnNpZ25lZCBsb25nIGRhdGEpOworCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2lvLmMKKy8vCitOVFNUQVRVUyBSVFVTQk11bHRpUmVhZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCTXVsdGlXcml0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKTsKKworTlRTVEFUVVMgUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhKTsKKworTlRTVEFUVVMgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglQVUNIQVIJCQlwVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglVQ0hBUgkJCVZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVmFsdWUpOworCitOVFNUQVRVUwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlSZWdJRCwKKwlJTglVQ0hBUgkJCVZhbHVlKTsKKworTlRTVEFUVVMJUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlSZWdJRCwKKwlJTglQVUNIQVIJCQlwVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyRmxhZ3MsCisJSU4JVUNIQVIJCQlSZXNlcnZlZEJpdHMsCisJSU4JVUNIQVIJCQlSZXF1ZXN0LAorCUlOCVVTSE9SVAkJCVZhbHVlLAorCUlOCVVTSE9SVAkJCUluZGV4LAorCUlOCVBWT0lECQkJVHJhbnNmZXJCdWZmZXIsCisJSU4JVUlOVDMyCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCitOVFNUQVRVUyBSVFVTQlJlYWRFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpOworCitOVFNUQVRVUyBSVFVTQldyaXRlRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpOworCitWT0lEIFJUVVNCUHV0VG9TbGVlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK05UU1RBVFVTIFJUVVNCV2FrZVVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkluaXRpYWxpemVDbWRRKAorCUlOCVBDbWRRCWNtZHEpOworCitORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglORElTX09JRAkJT2lkLAorCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKKwlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisKK05ESVNfU1RBVFVTIFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE5ESVNfT0lECQkJT2lkLAorCUlOIFBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAorCUlOIFVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKworVk9JRCBSVFVTQkRlcXVldWVDbWQoCisJSU4JUENtZFEJCWNtZHEsCisJT1VUCVBDbWRRRWxtdAkqcGNtZHFlbG10KTsKKworSU5UIFJUVVNCQ21kVGhyZWFkKAorCUlOIE9VVCBQVk9JRCBDb250ZXh0KTsKKworSU5UIFRpbWVyUVRocmVhZCgKKwlJTiBPVVQgUFZPSUQgQ29udGV4dCk7CisKK1JUMjg3MF9USU1FUl9FTlRSWSAqUlQyODcwX1RpbWVyUV9JbnNlcnQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKKworQk9PTEVBTiBSVDI4NzBfVGltZXJRX1JlbW92ZSgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOworCit2b2lkIFJUMjg3MF9UaW1lclFfRXhpdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK3ZvaWQgUlQyODcwX1RpbWVyUV9Jbml0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uRXhpdCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0b3AoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25TdGFydCgKKwlJTiBSVE1QX0FEQVBURVIgKiBwQWQpOworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25Jbml0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVDI4NzBfV2F0Y2hEb2coCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitOVFNUQVRVUyBSVFVTQldyaXRlTUFDUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVVJTlQzMgkJCVZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JSZWFkTUFDUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUlOVDMyCQkJcFZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKKwlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVU0hPUlQJCQlWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCRmlybXdhcmVSdW4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitOVFNUQVRVUyBSVFVTQkZpcm13YXJlV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCQlwRndJbWFnZSwKKwlJTiBVTE9ORwkJRndMZW4pOworCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUlOVDMyCQkJcFZhbHVlKTsKKworTlRTVEFUVVMJUlRVU0JWZW5kZXJSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK05ESVNfU1RBVFVTIFJUVVNCU2V0SGFyZFdhcmVSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBWT0lECQkJcEJ1Zik7CisKK05ESVNfU1RBVFVTIFJUVVNCUXVlcnlIYXJkV2FyZVJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFZPSUQJCQlwQnVmKTsKKworVk9JRCBDTURIYW5kbGVyKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworCitORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKKwlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiApOworCisKK1ZPSUQgTWFjVGFibGVJbml0aWFsaXplKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lU2V0UHNtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pOworCitORElTX1NUQVRVUyBSVE1QV1BBQWRkS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworCitWT0lEIEFzaWNSeEFudEV2YWxBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWYgMCAvLyBNYXJrIGJlY2F1c2Ugbm90IHVzZWQgaW4gUlQyOHh4LgorTlRTVEFUVVMgUlRVU0JSeFBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gICAgQk9PTEVBTiAgICAgICAgICBiQnVsa1JlY2VpdmUpOworCitWT0lEIFJUVVNCRGVxdWV1ZU1MTUVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmCisKK3ZvaWQgYXBwZW5kX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlPVVQgIFBORElTX1BBQ0tFVAkqcHBQYWNrZXQpOworCitVSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworTkRJU19TVEFUVVMJUlRNUENoZWNrUnhFcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCXBSeElORk8pOworCisKK1ZPSUQgUlRVU0JNbG1lSGFyZFRyYW5zbWl0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBNR01UX1NUUlVDCQlwTWdtdCk7CisKK0lOVCBNbG1lVGhyZWFkKAorCUlOIFBWT0lEIENvbnRleHQpOworCisjaWYgMAorVk9JRCAgICBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEICAgIFJUVVNCU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmCisKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfZGF0YS5jCisvLworTkRJU19TVEFUVVMJUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVJTlQzMgkJCU51bWJlclJlcXVpcmVkKTsKKworCitCT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCk7CisKKworVk9JRCBSVE1QV3JpdGVUeEluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKKwlJTgkgIFVTSE9SVAkJVVNCRE1BcGt0TGVuLAorCUlOCSAgQk9PTEVBTgkJYldpdiwKKwlJTgkgIFVDSEFSCQkJUXVldWVTZWwsCisJSU4JICBVQ0hBUgkJCU5leHRWYWxpZCwKKwlJTgkgIFVDSEFSCQkJVHhCdXJzdCk7CisKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfMjg3MC5jCisvLworVVNIT1JUIFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJZnJhZ051bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJZnJhbWVOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlUeElkeCk7CisKK1ZPSUQgUnRtcFVTQkRhdGFMYXN0VHhJZHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JVVNIT1JUCQkJVHhJZHgpOworCitWT0lEIFJ0bXBVU0JEYXRhS2lja091dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworCitpbnQgUnRtcFVTQk1nbXRLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKKwlJTiBVQ0hBUiAJCQlRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKKwlJTiBVSU5UIAkJCVNyY0J1Zkxlbik7CisKK1ZPSUQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVUNIQVIJCVF1ZUlkeCwKKwlJTiBVQ0hBUgkJKnBOdWxsRnJhbWUsCisJSU4gVUlOVDMyCQlmcmFtZUxlbik7CisKK1ZPSUQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCk7CisKK1ZPSUQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PRkYoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1ZPSUQgUUJTU19Mb2FkSW5pdCgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKKworVUlOVDMyIFFCU1NfTG9hZEVsZW1lbnRBcHBlbmQoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCwKKwlPVVQJCVVJTlQ4CQkJKmJ1Zl9wKTsKKworVk9JRCBRQlNTX0xvYWRVcGRhdGUoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE5hbWUsCisJSU4JUFVDSEFSCQkJcEJ1Zik7CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAorICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKTsKKworUENIQVIgICBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAorICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKTsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgQXNpY1N0YUJicFR1bmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKKwlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOICBVU0hPUlQgICAgICAgIAkJQ2FwYWJpbGl0eUluZm8pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSZVN5bmNCZWFjb25UaW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKKworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOworaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7CisKK19faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQoreworZXh0ZXJuIFZPSUQgTWVzaE1ha2VCZWFjb24oSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CitleHRlcm4gVk9JRCBNZXNoVXBkYXRlQmVhY29uRnJhbWUoSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CisKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCXsKKwkJaWYgKHJ0Mjh4eF9vcGVuKHBBZC0+bmV0X2RldikgIT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwl9CisJVklSVFVBTF9JRl9JTkMocEFkKTsKKwlyZXR1cm4gMDsKK30KKworX19pbmxpbmUgVk9JRCBWSVJUVUFMX0lGX0RPV04oUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVklSVFVBTF9JRl9ERUMocEFkKTsKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCQlydDI4eHhfY2xvc2UocEFkLT5uZXRfZGV2KTsKKwlyZXR1cm47Cit9CisKKworI2VuZGlmICAvLyBfX1JUTVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9ja2lwbWljLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfY2tpcG1pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDk0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfY2tpcG1pYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfY2tpcG1pYy5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZglfX1JUTVBfQ0tJUE1JQ19IX18KKyNkZWZpbmUJX19SVE1QX0NLSVBNSUNfSF9fCisKK3R5cGVkZWYJc3RydWN0CV9NSUNfQ09OVEVYVAl7CisJLyogLS0tIE1NSCBjb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCUNLWzE2XTsJCQkJLyogdGhlIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCWNvZWZmaWNpZW50WzE2XTsJLyogY3VycmVudCBhZXMgY291bnRlciBtb2RlIGNvZWZmaWNpZW50cyAgICAgICovCisJVUxPTkdMT05HCWFjY3VtOwkJCQkvKiBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkgKi8KKwlVSU5UCQlwb3NpdGlvbjsJCQkvKiBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZSAgKi8KKwlVQ0hBUgkJcGFydFs0XTsJCQkvKiBmb3IgY29udmVyc2lvbiBvZiBtZXNzYWdlIHRvIHUzMiBmb3IgbW1oICAgKi8KK30JTUlDX0NPTlRFWFQsICpQTUlDX0NPTlRFWFQ7CisKK1ZPSUQJQ0tJUF9rZXlfcGVybXV0ZSgKKwlPVVQJVUNIQVIJKlBLLAkJCS8qIG91dHB1dCBwZXJtdXRlZCBrZXkgKi8KKwlJTglVQ0hBUgkqQ0ssCQkJLyogaW5wdXQgQ0tJUCBrZXkgKi8KKwlJTglVQ0hBUgl0b0RzRnJvbURzLAkJLyogaW5wdXQgdG9Ecy9Gcm9tRHMgYml0cyAqLworCUlOCVVDSEFSCSpwaXYpOwkJCS8qIGlucHV0IHBvaW50ZXIgdG8gSVYgKi8KKworVk9JRAlSVE1QQ2tpcE1pY0luaXQoCisJSU4JUE1JQ19DT05URVhUCQlwQ29udGV4dCwKKwlJTglQVUNIQVIJCQkJQ0spOworCitWT0lEIFJUTVBNaWNVcGRhdGUoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgcE9jdGV0cywKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBsZW4pOworCitVTE9ORyBSVE1QTWljR2V0Q29lZmZpY2llbnQoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgIHBDb250ZXh0KTsKKworVk9JRCB4b3JfMTI4KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitVQ0hBUiBSVE1QQ2tpcFNib3goCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7CisKK1ZPSUQgeG9yXzMyKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG5leHRfa2V5KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICByb3VuZCk7CisKK1ZPSUQgYnl0ZV9zdWIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBzaGlmdF9yb3coCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBtaXhfY29sdW1uKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgUlRNUEFlc0VuY3J5cHQoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGRhdGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgY2lwaGVydGV4dCk7CisKK1ZPSUQgUlRNUE1pY0ZpbmFsKAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgICAgIGRpZ2VzdFs0XSk7CisKK1ZPSUQgUlRNUENraXBJbnNlcnRDTUlDKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgcE1JQywKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHA4MDIxMWhkciwKKyAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisgICAgSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgbWljX3NuYXApOworCisjZW5kaWYgLy9fX1JUTVBfQ0tJUE1JQ19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg2MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oCkBAIC0wLDAgKzEsMTYyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX2RlZi5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCByZWxhdGVkIGRlZmluaXRpb24gaGVhZGVyCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDA4LTA1LTIwMDMgICAgYWRkIGRlZmluaXRpb24gZm9yIDExZyAmIG90aGVyIGRyYWZ0cworKi8KKyNpZm5kZWYgX19SVE1QX0RFRl9IX18KKyNkZWZpbmUgX19SVE1QX0RFRl9IX18KKworI2luY2x1ZGUgIm9pZC5oIgorCisvLworLy8gIERlYnVnIGluZm9ybWF0aW9uIHZlcmJvc2l0eTogbG93ZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciB1cmdlbmN5CisvLworI2RlZmluZSBSVF9ERUJVR19PRkYgICAgICAgIDAKKyNkZWZpbmUgUlRfREVCVUdfRVJST1IgICAgICAxCisjZGVmaW5lIFJUX0RFQlVHX1dBUk4gICAgICAgMgorI2RlZmluZSBSVF9ERUJVR19UUkFDRSAgICAgIDMKKyNkZWZpbmUgUlRfREVCVUdfSU5GTyAgICAgICA0CisjZGVmaW5lIFJUX0RFQlVHX0xPVUQgICAgICAgNQorCisjZGVmaW5lIE5JQ19UQUcgICAgICAgICAgICAgKChVTE9ORyknMDY4MicpCisjZGVmaW5lIE5JQ19EQkdfU1RSSU5HICAgICAgKCIqKlJUMjh4eCoqIikKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy8gZm9yIHNubXAKKy8vIHRvIGdldCBtYW51ZmFjdHVyZXIgT1VJLCBrYXRoeSwgMjAwOF8wMjIwCisjZGVmaW5lIE1hbnVmYWN0dXJlck9VSV9MRU4JCQkzCisjZGVmaW5lIE1hbnVmYWN0dXJlck5BTUUJCQkoIlJhbGluayBUZWNobm9sb2d5IENvbXBhbnkuIikKKyNkZWZpbmUJUmVzb3VyY2VUeXBlSWROYW1lCQkJKCJSYWxpbmtfSUQiKQorI2VuZGlmCisKKworLy8jZGVmaW5lIFBBQ0tFRAorCisjZGVmaW5lIFJBTElOS18yODgzX1ZFUlNJT04JCSgoVUlOVDMyKTB4Mjg4MzAzMDApCisjZGVmaW5lIFJBTElOS18yODgwRV9WRVJTSU9OCSgoVUlOVDMyKTB4Mjg3MjAyMDApCisjZGVmaW5lIFJBTElOS18zMDcwX1ZFUlNJT04JCSgoVUlOVDMyKTB4MzA3MDAyMDApCisKKy8vCisvLyBORElTIHZlcnNpb24gaW4gdXNlIGJ5IHRoZSBOSUMgZHJpdmVyLgorLy8gVGhlIGhpZ2ggYnl0ZSBpcyB0aGUgbWFqb3IgdmVyc2lvbi4gVGhlIGxvdyBieXRlIGlzIHRoZSBtaW5vciB2ZXJzaW9uLgorLy8KKyNpZmRlZiAgTkRJUzUxX01JTklQT1JUCisjZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMQorI2Vsc2UKKyNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAwCisjZW5kaWYKKworLy8KKy8vIE5ESVMgbWVkaWEgdHlwZSwgY3VycmVudCBpcyBldGhlcm5ldCwgY2hhbmdlIGlmIG5hdGl2ZSB3aXJlbGVzcyBzdXBwb3J0ZWQKKy8vCisjZGVmaW5lIE5JQ19NRURJQV9UWVBFICAgICAgICAgIE5kaXNNZWRpdW04MDJfMworI2RlZmluZSBOSUNfUENJX0hEUl9MRU5HVEggICAgICAweGUyCisjZGVmaW5lIE5JQ19NQVhfUEFDS0VUX1NJWkUgICAgIDIzMDQKKyNkZWZpbmUgTklDX0hFQURFUl9TSVpFICAgICAgICAgMTQKKyNkZWZpbmUgTUFYX01BUF9SRUdJU1RFUlNfTkVFREVEIDMyCisjZGVmaW5lIE1JTl9NQVBfUkVHSVNURVJTX05FRURFRCAyICAgLy9Ub2RvOiBzaG91bGQgY29uc2lkZXIgZnJhZ21lbnQgaXNzdWUuCisKKy8vCisvLyBpbnRlcmZhY2UgdHlwZSwgd2UgdXNlIFBDSQorLy8KKyNkZWZpbmUgTklDX0lOVEVSRkFDRV9UWVBFICAgICAgTmRpc0ludGVyZmFjZVBjaQorI2RlZmluZSBOSUNfSU5URVJSVVBUX01PREUgICAgICBOZGlzSW50ZXJydXB0TGV2ZWxTZW5zaXRpdmUKKworLy8KKy8vIGJ1ZmZlciBzaXplIHBhc3NlZCBpbiBOZGlzTVF1ZXJ5QWRhcHRlclJlc291cmNlcworLy8gV2Ugc2hvdWxkIG9ubHkgbmVlZCB0aHJlZSBhZGFwdGVyIHJlc291cmNlcyAoSU8sIGludGVycnVwdCBhbmQgbWVtb3J5KSwKKy8vIFNvbWUgZGV2aWNlcyBnZXQgZXh0cmEgcmVzb3VyY2VzLCBzbyBoYXZlIHJvb20gZm9yIDEwIHJlc291cmNlcworLy8gICAgICAgICAgICAgICAgICAgIFVGX1NJWkUgICAoc2l6ZW9mKE5ESVNfUkVTT1VSQ0VfTElTVCkgKyAoMTAqc2l6ZW9mKENNX1BBUlRJQUxfUkVTT1VSQ0VfREVTQ1JJUFRPUikpKQorCisKKyNkZWZpbmUgTklDX1JFU09VUkNFX0IvLworLy8gSU8gc3BhY2UgbGVuZ3RoCisvLworI2RlZmluZSBOSUNfTUFQX0lPU1BBQ0VfTEVOR1RIICBzaXplb2YoQ1NSX1NUUlVDKQorCisjZGVmaW5lIE1BWF9SWF9QS1RfTEVOCTE1MjAKKworLy8KKy8vIEVudHJ5IG51bWJlciBmb3IgZWFjaCBETUEgZGVzY3JpcHRvciByaW5nCisvLworCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgOCAvLyAxCisjZGVmaW5lIFBSSU9fUklOR19TSVpFICAgICAgICAgIDgKKyNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgMzIgLy8gUFJJT19SSU5HX1NJWkUKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICA0CisjZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIwNDgKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gTUM6IE11bHRwbGUgQ2FyZHMKKyNkZWZpbmUgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJECQkzMgorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisjZGVmaW5lIE1BWF9SWF9QUk9DRVNTICAgICAgICAgIDEyOCAvLzY0IC8vMzIKKyNkZWZpbmUgTlVNX09GX0xPQ0FMX1RYQlVGICAgICAgMgorI2RlZmluZSBUWERfU0laRSAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBUWFdJX1NJWkUgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSWERfU0laRSAgICAgICAgICAgICAgIAkxNgorI2RlZmluZSBSWFdJX1NJWkUgICAgICAgICAgICAgCTE2CisvLyBUWElORk9fU0laRSArIFRYV0lfU0laRSArIDgwMi4xMSBIZWFkZXIgU2l6ZSArIEFNU0RVIHN1YiBmcmFtZSBoZWFkZXIKKyNkZWZpbmUgVFhfRE1BXzFTVF9CVUZGRVJfU0laRSAgOTYgICAgLy8gb25seSB0aGUgMXN0IHBoeXNpY2FsIGJ1ZmZlciBpcyBwcmUtYWxsb2NhdGVkCisjZGVmaW5lIE1HTVRfRE1BX0JVRkZFUl9TSVpFICAgIDE1MzYgLy8yMDQ4CisjZGVmaW5lIFJYX0JVRkZFUl9BR0dSRVNJWkUgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBSWF9CVUZGRVJfTk9STVNJWkUgICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKKyNkZWZpbmUgVFhfQlVGRkVSX05PUk1TSVpFCQlSWF9CVUZGRVJfTk9STVNJWkUKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgMjM0NiAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSA4MDIuMTEgZnJhbWUgc2l6ZQorI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fU0laRSAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2CisjZGVmaW5lIE1BWF9OVU1fT0ZfVFVQTEVfQ0FDSEUgIDIKKyNkZWZpbmUgTUFYX01DQVNUX0xJU1RfU0laRSAgICAgMzIKKyNkZWZpbmUgTUFYX0xFTl9PRl9WRU5ET1JfREVTQyAgNjQKKy8vI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAoTlVNX09GX0xPQ0FMX1RYQlVGID4+IDIpIC8vIEFQIHdvbid0IHNwZW5kIG1vcmUgdGhhbiAxLzQgb2YgdG90YWwgYnVmZmVycyBvbiBNL0JDQVNUIFBTUQorI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIE1BWF9SWF9QUk9DRVNTX0NOVAkoUlhfUklOR19TSVpFKQorCisKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikgLy8oNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCisjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1BTX1FVRVVFCQkJCTEyOAkvLzMyCisjZGVmaW5lIFdNTV9OVU1fT0ZfQUMgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFDMCwgQUMxLCBBQzIsIGFuZCBBQzMgKi8KKworCisKKy8vIFJ4RmlsdGVyCisjZGVmaW5lIFNUQU5PUk1BTAkgMHgxN2Y5NworI2RlZmluZSBBUE5PUk1BTAkgMHgxNWY5NworLy8KKy8vICBSVE1QX0FEQVBURVIgZmxhZ3MKKy8vCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUFQX1JFR0lTVEVSICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBVFRFUl9HQVRIRVIgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TRU5EX1BBQ0tFVF9FUlJPUiAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01MTUVfUkVTRVRfSU5fUFJPR1JFU1MgMHgwMDAwMDAyMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1RYX1JJTkdfQUxMT0NBVEVEICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NSU1PUkFURV9JTlVTRUQgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1JYX1JJTkdfQUxMT0NBVEVEICAgICAweDAwMDAxMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyAgMHgwMDAwNDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JFQVNTT0NfSU5fUFJPR1JFU1MJMHgwMDAwODAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX1BFTkRJTkcJMHgwMDAxMDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCQkweDAwMDIwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVAkJCTB4MDAwNDAwMDAKKyNkZWZpbmUJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQJCQkweDAwMDgwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUkRHX0FDVElWRQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9EWU5BTUlDX0JFX1RYT1BfQUNUSVZFIDB4MDAyMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCisKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvL0Rldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LgorI2RlZmluZSBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSAgICAweDIwMDAwMDAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYgICAgICAgIDB4NDAwMDAwMDAKKworLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcmluZyBidWZmZXJzCisvLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0JVU1kgICAgICAgIDB4ODAwMDAwMDAKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX01HTVRfUklOR19CVVNZICAgICAgMHg0MDAwMDAwMAorLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfQVRJTV9SSU5HX0JVU1kgICAgICAweDIwMDAwMDAwCisvLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0JVU1kgICAgICAgIDB4MTAwMDAwMDAKKworLy8gTG9jayBiaXQgZm9yIGFjY2Vzc2luZyBkaWZmZXJlbnQgcXVldWUKKy8vI2RlZmluZSAgIGZSVE1QX0FEQVBURVJfVFhfUVVFVUVfQlVTWSAgICAgMHgwODAwMDAwMAorLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9NR01UX1FVRVVFX0JVU1kgICAweDA0MDAwMDAwCisKKy8vCisvLyAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKKy8vCisjZGVmaW5lIGZPUF9TVEFUVVNfSU5GUkFfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgZk9QX1NUQVRVU19BREhPQ19PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEICAgICAweDAwMDAwMDA0CisjZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQgICAgMHgwMDAwMDAxMAorI2RlZmluZSBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSAgICAgICAgICAgICAweDAwMDAwMDIwCisvLyNkZWZpbmUgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEICAgMHgwMDAwMDA0MAorI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCisjZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCisjZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgorI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSAgICAgICAweDAwMDIwMDAwCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZPUF9TVEFUVVNfU0NBTl8yMDQwICAgICAgICAgICAgICAgCSAgICAweDAwMDQwMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIENDS1NFVFBST1RFQ1QJCTB4MQorI2RlZmluZSBPRkRNU0VUUFJPVEVDVAkJMHgyCisjZGVmaW5lIE1NMjBTRVRQUk9URUNUCQkweDQKKyNkZWZpbmUgTU00MFNFVFBST1RFQ1QJCTB4OAorI2RlZmluZSBHRjIwU0VUUFJPVEVDVAkJMHgxMAorI2RlZmluZSBHUjQwU0VUUFJPVEVDVAkJMHgyMAorI2RlZmluZSBBTExOX1NFVFBST1RFQ1QJCShHUjQwU0VUUFJPVEVDVCB8IEdGMjBTRVRQUk9URUNUIHwgTU00MFNFVFBST1RFQ1QgfCBNTTIwU0VUUFJPVEVDVCkKKworLy8KKy8vICBBUCdzIGNsaWVudCB0YWJsZSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSAgICAgICAgICAweDAwMDAwMDAxICAvLyBDTElFTlQgY2FuIHBhcnNlIFFPUyBEQVRBIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUgIDB4MDAwMDAwMDIgIC8vIENMSUVOVCBjYW4gcmVjZWl2ZSBSYWxpbmsncyBwcm9wcmlldGFyeSBUWCBhZ2dyZWdhdGlvbiBmcmFtZQorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSAgICAweDAwMDAwMDA0ICAvLyBDTElFTlQgc3VwcG9ydCBwaWdneS1iYWNrCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRQkJMHgwMDAwMDAxMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDQwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDgwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFCQkJMHgwMDAwMDEwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSAgMHgwMDAwMDQwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUgICAgICAgICAweDAwMDAwODAwICAvKiBVQVBTRCBTVEFUSU9OICovCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0JTU0NPRVhJU1RfQ0FQQUJMRQkweDAwMDAxMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUCQkweDAwMTAwMDAwCisvLworLy8gIFNUQSBjb25maWd1cmF0aW9uIGZsYWdzCisvLworLy8jZGVmaW5lIGZTVEFfQ0ZHX0VOQUJMRV9UWF9CVVJTVCAgICAgICAgICAweDAwMDAwMDAxCisKKy8vIDgwMi4xMW4gT3BlcmF0aW5nIE1vZGUgRGVmaW5pdGlvbi4gMC0zIGFsc28gdXNlZCBpbiBBU0lDVVBkYXRlUHJvdGVjdCBzd2l0Y2ggY2FzZQorI2RlZmluZSBIVF9OT19QUk9URUNUCTAKKyNkZWZpbmUgSFRfTEVHQUNZX1BST1RFQ1QJMQorI2RlZmluZSBIVF80MF9QUk9URUNUCTIKKyNkZWZpbmUgSFRfMjA0MF9QUk9URUNUCTMKKyNkZWZpbmUgSFRfUlRTQ1RTXzZNCTcKKy8vZm9sbG93aW5nIGlzIG91ciBvd24gZGVmaW5pdGlvbiBpbiBvcmRlciB0byB0dXJuIG9uIG91ciBBU0lDIHByb3RlY3Rpb24gcmVnaXN0ZXIgaW4gSU5GUkFTVFJVQ1RVUkUuCisjZGVmaW5lIEhUX0FUSEVST1MJOAkvLyBydDI4NjBjIGhhcyBwcm9ibGVtIHdpdGggYXRoZXJvcyBjaGlwLiB3ZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyAuCisjZGVmaW5lIEhUX0ZPUkNFUlRTQ1RTCTkJLy8gRm9yY2UgdHVybiBvbiBSVFMvQ1RTIGZpcnN0LiB0aGVuIGdvIHRvIGV2YWx1YXRlIGlmIHRoaXMgZm9yY2UgUlRTIGlzIG5lY2Vzc2FyeS4KKworLy8KKy8vIFJYIFBhY2tldCBGaWx0ZXIgY29udHJvbCBmbGFncy4gQXBwbHkgb24gcEFkLT5QYWNrZXRGaWx0ZXIKKy8vCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0RJUkVDVCAgICAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfTVVMVElDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQlJPQURDQVNUICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QKKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfQUxMX01VTFRJQ0FTVCAgICAgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCisKKy8vCisvLyBFcnJvciBjb2RlIHNlY3Rpb24KKy8vCisvLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9OT1RfRk9VTkQKKyNkZWZpbmUgRVJSTE9HX1JFQURfUENJX1NMT1RfRkFJTEVEICAgICAweDAwMDAwMTAxTAorI2RlZmluZSBFUlJMT0dfV1JJVEVfUENJX1NMT1RfRkFJTEVEICAgIDB4MDAwMDAxMDJMCisjZGVmaW5lIEVSUkxPR19WRU5ET1JfREVWSUNFX05PTUFUQ0ggICAgMHgwMDAwMDEwM0wKKworLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfRElTQUJMRUQKKyNkZWZpbmUgRVJSTE9HX0JVU19NQVNURVJfRElTQUJMRUQgICAgICAweDAwMDAwMjAxTAorCisvLyBORElTX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ09ORklHVVJBVElPTgorI2RlZmluZSBFUlJMT0dfSU5WQUxJRF9TUEVFRF9EVVBMRVggICAgIDB4MDAwMDAzMDFMCisjZGVmaW5lIEVSUkxPR19TRVRfU0VDT05EQVJZX0ZBSUxFRCAgICAgMHgwMDAwMDMwMkwKKworLy8gTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAweDAwMDAwNDAxTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlkgICAgIDB4MDAwMDA0MDJMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUFQX1JFR0lTVEVSUyAgICAgMHgwMDAwMDQwM0wKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9CVUZGRVJfUE9PTCAgICAgICAweDAwMDAwNDA0TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfQlVGRkVSICAgICAgIDB4MDAwMDA0MDVMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfUEFDS0VUX1BPT0wgICAgICAgMHgwMDAwMDQwNkwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX1BBQ0tFVCAgICAgICAweDAwMDAwNDA3TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX0xPT0tBU0lERV9NRU1PUlkgIDB4MDAwMDA0MDhMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9IQVJEV0FSRV9GQUlMVVJFCisjZGVmaW5lIEVSUkxPR19TRUxGVEVTVF9GQUlMRUQgICAgICAgICAgMHgwMDAwMDUwMUwKKyNkZWZpbmUgRVJSTE9HX0lOSVRJQUxJWkVfQURBUFRFUiAgICAgICAweDAwMDAwNTAyTAorI2RlZmluZSBFUlJMT0dfUkVNT1ZFX01JTklQT1JUICAgICAgICAgIDB4MDAwMDA1MDNMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9SRVNPVVJDRV9DT05GTElDVAorI2RlZmluZSBFUlJMT0dfTUFQX0lPX1NQQUNFICAgICAgICAgICAgIDB4MDAwMDA2MDFMCisjZGVmaW5lIEVSUkxPR19RVUVSWV9BREFQVEVSX1JFU09VUkNFUyAgMHgwMDAwMDYwMkwKKyNkZWZpbmUgRVJSTE9HX05PX0lPX1JFU09VUkNFICAgICAgICAgICAweDAwMDAwNjAzTAorI2RlZmluZSBFUlJMT0dfTk9fSU5URVJSVVBUX1JFU09VUkNFICAgIDB4MDAwMDA2MDRMCisjZGVmaW5lIEVSUkxPR19OT19NRU1PUllfUkVTT1VSQ0UgICAgICAgMHgwMDAwMDYwNUwKKworCisvLyBXRFMgZGVmaW5pdGlvbgorI2RlZmluZQlNQVhfV0RTX0VOVFJZICAgICAgICAgICAgICAgNAorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKworI2RlZmluZQlXRFNfRElTQUJMRV9NT0RFICAgICAgICAgICAgMAorI2RlZmluZQlXRFNfUkVTVFJJQ1RfTU9ERSAgICAgICAgICAgMQorI2RlZmluZQlXRFNfQlJJREdFX01PREUgICAgICAgICAgICAgMgorI2RlZmluZQlXRFNfUkVQRUFURVJfTU9ERSAgICAgICAgICAgMworI2RlZmluZQlXRFNfTEFaWV9NT0RFICAgICAgICAgICAgICAgNAorCisKKyNkZWZpbmUgTUFYX01FU0hfTlVNCQkJCTAKKworI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTAKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisjdW5kZWYJTUFYX0FQQ0xJX05VTQorI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTEKKyNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJMQorCisvKiBzYW5pdHkgY2hlY2sgZm9yIGFwaWR4ICovCisjZGVmaW5lIE1CU1NfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGFwaWR4KSBcCisgICAgeyBpZiAoYXBpZHggPiBNQVhfTUJTU0lEX05VTSkgeyBcCisgICAgICAgICAgcHJpbnRrKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fRlVOQ1RJT05fXywgYXBpZHgpOyBcCisJICBhcGlkeCA9IE1BSU5fTUJTU0lEOyB9IH0KKworI2RlZmluZSBWQUxJRF9XQ0lEKF93Y2lkKQkoKF93Y2lkKSA+IDAgJiYgKF93Y2lkKSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFICkKKworI2RlZmluZSBNQUlOX01CU1NJRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBGSVJTVF9NQlNTSUQgICAgICAgICAgICAgICAgMQorCisKKyNkZWZpbmUgTUFYX0JFQUNPTl9TSVpFCQkJCTUxMgorLy8gSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDYsCisvLyBpdCBzaGFsbCByZXNlcnZlIHNvbWUgV0NJRCBzcGFjZSh3Y2lkIDIyMn4yNTMpIGZvciBiZWFjb24gZnJhbWVzLgorLy8gLQl0aGVzZSB3Y2lkIDIzOH4yNTMgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNihyYTYpLgorLy8gLQl0aGVzZSB3Y2lkIDIyMn4yMzcgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNyhyYTcpLgorI2lmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA4KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIyMgorI2VsaWYgZGVmaW5lZChNQVhfTUJTU0lEX05VTSkgJiYgKE1BWF9NQlNTSURfTlVNID09IDcpCisjZGVmaW5lIEhXX1JFU0VSVkVEX1dDSUQJMjM4CisjZWxzZQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTI1NQorI2VuZGlmCisKKy8vIFRoZW4gZGVkaWNhdGUgd2NpZCBvZiBERlMgYW5kIENhcnJpZXItU2Vuc2UuCisjZGVmaW5lIERGU19DVFNfV0NJRCAJCShIV19SRVNFUlZFRF9XQ0lEIC0gMSkKKyNkZWZpbmUgQ1NfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCisjZGVmaW5lIExBU1RfU1BFQ0lGSUNfV0NJRAkoSFdfUkVTRVJWRURfV0NJRCAtIDIpCisKKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjExLgorLy8gSWYgTUFYX01CU1NJRF9OVU0gaXMgNywgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMjguCisjZGVmaW5lIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQJKExBU1RfU1BFQ0lGSUNfV0NJRCAtIE1BWF9NQlNTSURfTlVNIC0gMSkKKworLy8gVFggbmVlZCBXQ0lEIHRvIGZpbmQgQ2lwaGVyIEtleQorLy8gdGhlc2Ugd2NpZCAyMTIgfiAyMTkgYXJlIHJlc2VydmVkIGZvciBiYy9tYyBwYWNrZXRzIGlmIE1BWF9NQlNTSURfTlVNIGlzIDguCisjZGVmaW5lIEdFVF9Hcm91cEtleV9XQ0lEKF9fd2NpZCwgX19ic3NpZHgpIFwKKwl7CQkJCQkJCQkJCVwKKwkJX193Y2lkID0gTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSArIF9fYnNzaWR4OwlcCisJfQorCisjZGVmaW5lIElzR3JvdXBLZXlXQ0lEKF9fd2NpZCkgKCgoX193Y2lkKSA8IExBU1RfU1BFQ0lGSUNfV0NJRCkgJiYgKChfX3djaWQpID49IChMQVNUX1NQRUNJRklDX1dDSUQgLSAoTUFYX01CU1NJRF9OVU0pKSkpCisKKworLy8gZGVmaW5pdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIEJTU0lECisjZGVmaW5lIEJTUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCU1MxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlNTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJTUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCU1M0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQlNTNSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJTUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBCU1M3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTGVuZ3RoIGRlZmluaXRpb25zCisjZGVmaW5lIFBFRVJfS0VZX05PICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQUNfQUREUl9MRU4gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgVElNRVNUQU1QX0xFTiAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTICAgICAgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX0xFTl9PRl9LRVkgICAgICAgICAgICAgICAgICAzMiAgICAgIC8vIDMyIG9jdGV0cyA9PSAyNTYgYml0cywgUmVkZWZpbmUgZm9yIFdQQQorI2RlZmluZSBNQVhfTlVNX09GX0NIQU5ORUxTICAgICAgICAgICAgIE1BWF9OVU1fT0ZfQ0hTICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24KKyNkZWZpbmUgTUFYX05VTV9PRl8xMUpDSEFOTkVMUyAgICAgICAgICAgICAyMCAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfU1NJRCAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgQ0lQSEVSX1RFWFRfTEVOICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTUFYX1ZJRV9MRU4gICAgICAgICAgICAgICAgICAgICAxMDI0ICAgLy8gTmV3IGZvciBXUEEgY2lwaGVyIHN1aXRlIHZhcmlhYmxlIElFIHNpemVzLgorI2RlZmluZSBNQVhfU1VQUE9SVF9NQ1MgICAgICAgICAgICAgMzIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQlNTSURfV0NJRAkJMQkvLyBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lECisjZGVmaW5lIE1DQVNUX1dDSUQJMHgwCisjZGVmaW5lIEJTUzBNY2FzdF9XQ0lECTB4MAorI2RlZmluZSBCU1MxTWNhc3RfV0NJRAkweGY4CisjZGVmaW5lIEJTUzJNY2FzdF9XQ0lECTB4ZjkKKyNkZWZpbmUgQlNTM01jYXN0X1dDSUQJMHhmYQorI2RlZmluZSBCU1M0TWNhc3RfV0NJRAkweGZiCisjZGVmaW5lIEJTUzVNY2FzdF9XQ0lECTB4ZmMKKyNkZWZpbmUgQlNTNk1jYXN0X1dDSUQJMHhmZAorI2RlZmluZSBCU1M3TWNhc3RfV0NJRAkweGZlCisjZGVmaW5lIFJFU0VSVkVEX1dDSUQJCTB4ZmYKKworI2RlZmluZSBNQVhfTlVNX09GX0FDTF9MSVNUCQkJCU1BWF9OVU1CRVJfT0ZfQUNMCisKKyNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQyAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorCisjaWYgTUFYX0xFTl9PRl9NQUNfVEFCTEU+TUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAorI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEhISEKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQJICAgICAgICAgICAgMworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LCSAgICAgICAgICAgIChNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lEKk1BWF9NQlNTSURfTlVNKQorI2RlZmluZSBNQVhfTlVNX09GX0VWRU5UICAgICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfRVZFTlQKKyNkZWZpbmUgV0RTX0xJTktfU1RBUlRfV0NJRAkJCQkoTUFYX0xFTl9PRl9NQUNfVEFCTEUtMSkKKworI2RlZmluZSBOVU1fT0ZfVElECQkJOAorI2RlZmluZSBNQVhfQUlEX0JBICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKQkgLy9CbG9jayBBQ0sgcmVjaXBpZW50CisjZGVmaW5lIE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFICAgICAgICAgICgoTlVNX09GX1RJRCAqIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKS8yKS8vICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yCisjZGVmaW5lIE1BWF9MRU5fT0ZfQlNTX1RBQkxFICAgICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNCQkJIDUxMgorCisvLyBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucworI2RlZmluZSBTSEFSRV9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50CisjZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0ICAgIC8vIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZSBHUk9VUF9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUE1LX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisjZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgLy8gTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfQlVGRkVSICAgICAgICAgIDIwNDgKKworLy8gcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgUFdSX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBXUl9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJCQkvL01JTU8gcG93ZXIgc2F2ZQorLy8jZGVmaW5lIFBXUl9VTktOT1dOICAgICAgICAgICAgICAgICAgIDIKKworLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKKy8vI2RlZmluZSBBVVRIX01PREVfQVVUT19TV0lUQ0ggICAgICAgICAweDAzCisvLyNkZWZpbmUgQVVUSF9NT0RFX0RFQVVUSCAgICAgICAgICAgICAgMHgwNAorLy8jZGVmaW5lIEFVVEhfTU9ERV9VUExBWUVSICAgICAgICAgICAgIDB4MDUgLy8gcmVzZXJ2ZWQgZm9yIDgwMi4xMWkgdXNlCisKKy8vIEJTUyBUeXBlIGRlZmluaXRpb25zCisjZGVmaW5lIEJTU19BREhPQyAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gPSBOZGlzODAyXzExSUJTUworI2RlZmluZSBCU1NfSU5GUkEgICAgICAgICAgICAgICAgICAgICAgIDEgIC8vID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlCisjZGVmaW5lIEJTU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLy8gPSBOZGlzODAyXzExQXV0b1Vua25vd24KKyNkZWZpbmUgQlNTX01PTklUT1IJCQkgICAgICAgICAgICAzICAvLyA9IE5kaXM4MDJfMTFNb25pdG9yCisKKworLy8gUmVhc29uIGNvZGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgUkVBU09OX1JFU0VSVkVEICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJFQVNPTl9VTlNQRUNJRlkgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFTT05fTk9fTE9OR0VSX1ZBTElEICAgICAgICAgIDIKKyNkZWZpbmUgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORyAgICAgICAzCisjZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19JTkFDVElWRSAgICAgICAgNAorI2RlZmluZSBSRUFTT05fRElTQVNTUENfQVBfVU5BQkxFICAgICAgIDUKKyNkZWZpbmUgUkVBU09OX0NMUzJFUlIgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFJFQVNPTl9DTFMzRVJSICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcgICAgIDgKKyNkZWZpbmUgUkVBU09OX1NUQV9SRVFfQVNTT0NfTk9UX0FVVEggICA5CisjZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lFICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUkVBU09OX01JQ19GQUlMVVJFICAgICAgICAgICAgICAxNAorI2RlZmluZSBSRUFTT05fNF9XQVlfVElNRU9VVCAgICAgICAgICAgIDE1CisjZGVmaW5lIFJFQVNPTl9HUk9VUF9LRVlfSFNfVElNRU9VVCAgICAgMTYKKyNkZWZpbmUgUkVBU09OX0lFX0RJRkZFUkVOVCAgICAgICAgICAgICAxNworI2RlZmluZSBSRUFTT05fTUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE4CisjZGVmaW5lIFJFQVNPTl9VQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTkKKyNkZWZpbmUgUkVBU09OX0FLTVBfTk9UX1ZBTElEICAgICAgICAgICAyMAorI2RlZmluZSBSRUFTT05fVU5TVVBQT1JUX1JTTkVfVkVSICAgICAgIDIxCisjZGVmaW5lIFJFQVNPTl9JTlZBTElEX1JTTkVfQ0FQICAgICAgICAgMjIKKyNkZWZpbmUgUkVBU09OXzgwMjFYX0FVVEhfRkFJTCAgICAgICAgICAyMworI2RlZmluZSBSRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEICAgIDI0CisjZGVmaW5lIFJFQVNPTl9ERUNMSU5FRCAgICAgICAgICAgICAgICAgMzcKKworI2RlZmluZSBSRUFTT05fUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgUkVBU09OX1FPU19MQUNLX0JBTkRXSURUSCAgICAgICAgIDMzCisjZGVmaW5lIFJFQVNPTl9QT09SX0NIQU5ORUxfQ09ORElUSU9OICAgICAzNAorI2RlZmluZSBSRUFTT05fUU9TX09VVFNJREVfVFhPUF9MSU1JVElPTiAgMzUKKyNkZWZpbmUgUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUyAgICAgIDM2CisjZGVmaW5lIFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNICAgICAzNworI2RlZmluZSBSRUFTT05fUU9TX01FQ0hfU0VUVVBfUkVRVUlSRUQgICAgMzgKKyNkZWZpbmUgUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQgICAgICAgIDM5CisjZGVmaW5lIFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUICAgICA0NQorCisvLyBTdGF0dXMgY29kZSBkZWZpbml0aW9ucworI2RlZmluZSBNTE1FX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUxNRV9VTlNQRUNJRllfRkFJTCAgICAgICAgICAgICAxCisjZGVmaW5lIE1MTUVfQ0FOTk9UX1NVUFBPUlRfQ0FQICAgICAgICAgMTAKKyNkZWZpbmUgTUxNRV9SRUFTU09DX0RFTllfQVNTT0NfRVhJU1QgICAxMQorI2RlZmluZSBNTE1FX0FTU09DX0RFTllfT1VUX1NDT1BFICAgICAgIDEyCisjZGVmaW5lIE1MTUVfQUxHX05PVF9TVVBQT1JUICAgICAgICAgICAgMTMKKyNkZWZpbmUgTUxNRV9TRVFfTlJfT1VUX09GX1NFUVVFTkNFICAgICAxNAorI2RlZmluZSBNTE1FX1JFSl9DSEFMTEVOR0VfRkFJTFVSRSAgICAgIDE1CisjZGVmaW5lIE1MTUVfUkVKX1RJTUVPVVQgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBNTE1FX0FTU09DX1JFSl9VTkFCTEVfSEFORExFX1NUQSAgMTcKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfREFUQV9SQVRFICAgICAgICAgIDE4CisKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEUgICAgICAgIDIyCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFX1BCQ0MgICAyMworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19DQ0tfT0ZETSAgICAgICAgMjQKKworI2RlZmluZSBNTE1FX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTUxNRV9SRVFVRVNUX0RFQ0xJTkVEICAgICAgICAgICAgIDM3CisjZGVmaW5lIE1MTUVfUkVRVUVTVF9XSVRIX0lOVkFMSURfUEFSQU0gICAzOAorI2RlZmluZSBNTE1FX0RMU19OT1RfQUxMT1dfSU5fUUJTUyAgICAgICAgNDgKKyNkZWZpbmUgTUxNRV9ERVNUX1NUQV9OT1RfSU5fUUJTUyAgICAgICAgIDQ5CisjZGVmaW5lIE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQSAgICAgICA1MAorCisjZGVmaW5lIE1MTUVfSU5WQUxJRF9GT1JNQVQgICAgICAgICAgICAgMHg1MQorI2RlZmluZSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0UgICAgICAgICAgIDB4NTIKKyNkZWZpbmUgTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVCAgICAgICAweDUzCisjZGVmaW5lIE1MTUVfTUFDX1RBQkxFX0ZBSUwgICAgICAgICAgICAgMHg1NAorCisvLyBJRSBjb2RlCisjZGVmaW5lIElFX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJRV9TVVBQX1JBVEVTICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSUVfRkhfUEFSTSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElFX0RTX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBJRV9DRl9QQVJNICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSUVfVElNICAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIElFX0lCU1NfUEFSTSAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJRV9DT1VOVFJZICAgICAgICAgICAgICAgICAgICAgIDcgICAgIC8vIDgwMi4xMWQKKyNkZWZpbmUgSUVfODAyXzExRF9SRVFVRVNUICAgICAgICAgICAgICAxMCAgICAvLyA4MDIuMTFkCisjZGVmaW5lIElFX1FCU1NfTE9BRCAgICAgICAgICAgICAgICAgICAgMTEgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9FRENBX1BBUkFNRVRFUiAgICAgICAgICAgICAgIDEyICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVFNQRUMgICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RDTEFTICAgICAgICAgICAgICAgICAgICAgICAgMTQgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIDE1ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJRV9QT1dFUl9DT05TVFJBSU5UICAgICAgICAgICAgIDMyICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9QT1dFUl9DQVBBQklMSVRZICAgICAgICAgICAgIDMzICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9UUENfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDM0ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9UUENfUkVQT1JUICAgICAgICAgICAgICAgICAgIDM1ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9TVVBQX0NIQU5ORUxTICAgICAgICAgICAgICAgIDM2ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgIDM3ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAgICAgIDM4ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAgICAgIDM5ICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9RVUlFVCAgICAgICAgICAgICAgICAgICAgICAgIDQwICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9JQlNTX0RGUyAgICAgICAgICAgICAgICAgICAgIDQxICAgIC8vIDgwMi4xMWggZDMuMworI2RlZmluZSBJRV9FUlAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgSUVfVFNfREVMQVkgICAgICAgICAgICAgICAgICAgICA0MyAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RDTEFTX1BST0NFU1NJTkcgICAgICAgICAgICAgNDQgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDQ2ICAgIC8vIDgwMi4xMWUgZDYKKyNkZWZpbmUgSUVfSFRfQ0FQICAgICAgICAgICAgICAgICAgICAgICA0NSAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9BUF9DSEFOTkVMX1JFUE9SVAkJCTUxICAgIC8vIDgwMi4xMWsgZDYKKyNkZWZpbmUgSUVfSFRfQ0FQMiAgICAgICAgICAgICAgICAgICAgICAgICA1MiAgICAvLyA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9SU04gICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIDgwMi4xMWkgZDMuMAorI2RlZmluZSBJRV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ICAgIC8vIFdQQTIKKyNkZWZpbmUgSUVfRVhUX1NVUFBfUkFURVMgICAgICAgICAgICAgICA1MCAgICAvLyA4MDIuMTFnCisjZGVmaW5lIElFX1NVUFBfUkVHX0NMQVNTICAgICAgICAgICAgICAgNTkgICAgLy8gODAyLjExeS4gU3VwcG9ydGVkIHJlZ3VsYXRvcnkgY2xhc3Nlcy4KKyNkZWZpbmUgSUVfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVAk2MAkvLyA4MDIuMTFuCisjZGVmaW5lIElFX0FERF9IVCAgICAgICAgICAgICAgICAgICAgICAgICA2MSAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX0FERF9IVDIgICAgICAgICAgICAgICAgICAgICAgICA1MyAgICAvLyA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisKKworLy8gRm9yIDgwMi4xMW4gRDMuMDMKKy8vI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQKKyNkZWZpbmUgSUVfU0VDT05EQVJZX0NIX09GRlNFVAkJNjIJLy8gODAyLjExbiBEMy4wMwlTZWNvbmRhcnkgQ2hhbm5lbCBPZmZzZXQgZWxlbWVudAorI2RlZmluZSBJRV9XQVBJCQkJCQkJCTY4CQkvLyBXQVBJIGluZm9ybWF0aW9uIGVsZW1lbnQKKyNkZWZpbmUgSUVfMjA0MF9CU1NfQ09FWElTVCAgICAgICAgICAgICAgIDcyICAgIC8vIDgwMi4xMW4gRDMuMC4zCisjZGVmaW5lIElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUICAgICA3MyAgICAvLyA4MDIuMTFuIEQzLjAzCisjZGVmaW5lIElFX09WRVJMQVBCU1NfU0NBTl9QQVJNICAgICAgICAgICA3NCAgICAvLyA4MDIuMTFuIEQzLjAzCisjZGVmaW5lIElFX0VYVF9DQVBBQklMSVRZICAgICAgICAgICAgICAgIDEyNyAgIC8vIDgwMi4xMW4gRDMuMDMKKworCisjZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxICAgLy8gV1BBCisjZGVmaW5lIElFX1ZFTkRPUl9TUEVDSUZJQyAgICAgICAgICAgICAgMjIxICAgLy8gV2lmaSBXTU0gKFdNRSkKKworI2RlZmluZSBPVUlfQlJPQURDT01fSFQgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MiAgIC8vCisjZGVmaW5lIE9VSV9QUkVOX0hUX0NBUCAgICAgICAgICAgICAgNTEgICAvLworI2RlZmluZSBPVUlfUFJFTl9BRERfSFQgICAgICAgICAgICAgIDUyICAgLy8KKworLy8gQ0NYIGluZm9ybWF0aW9uCisjZGVmaW5lIElFX0FJUk9ORVRfQ0tJUCAgICAgICAgICAgICAgICAgMTMzICAgLy8gQ0NYMS4wIElEIDg1SCBmb3IgQ0tJUAorI2RlZmluZSBJRV9BUF9UWF9QT1dFUiAgICAgICAgICAgICAgICAgIDE1MCAgIC8vIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxICAgLy8gQ0NYIDIuMAorI2RlZmluZSBJRV9DQ1hfVjIgICAgICAgICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OSAgIC8vIENDWCBJRCA5NUggZm9yIElQIEFkZHJlc3MKKyNkZWZpbmUgSUVfQUlST05FVF9DQ0tNUkVBU1NPQyAgICAgICAgICAxNTYgICAvLyBDQ1ggSUQgOUNIIGZvciBDQ0tNIFJlYXNzb2NpYXRpb24gUmVxdWVzdCBlbGVtZW50CisjZGVmaW5lIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIICAgICAgICAgMzAKKyNkZWZpbmUgQUlST05FVF9JUEFERFJFU1NfTEVOR1RIICAgICAgICAxMAorI2RlZmluZSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSCAgICAgIDI0CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBNTE1FIHN0YXRlIG1hY2hpbmUgZGVmaW5pdGlvbgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMKKyNkZWZpbmUgQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAxCisjZGVmaW5lIEFVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgMgorI2RlZmluZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgICAgIDMKKyNkZWZpbmUgU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgICA0CisjZGVmaW5lIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgNQorI2RlZmluZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDYKKyNkZWZpbmUgTEVBUF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICA3CisjZGVmaW5lIEFJUk9ORVRfU1RBVEVfTUFDSElORSAgICAgICAgICAgOAorI2RlZmluZSBBQ1RJT05fU1RBVEVfTUFDSElORSAgICAgICAgICAgOQorCisvLyBBUCBNTE1FIHN0YXRlIG1hY2hpbmVzCisjZGVmaW5lIEFQX0FTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgMTEKKyNkZWZpbmUgQVBfQVVUSF9TVEFURV9NQUNISU5FICAgICAgICAgICAxMgorI2RlZmluZSBBUF9BVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgIDEzCisjZGVmaW5lIEFQX1NZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTQKKyNkZWZpbmUgQVBfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgICAxNQorI2RlZmluZSBBUF9XUEFfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE2CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyNkZWZpbmUgRExTX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgICAyNgorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvLworLy8gU1RBJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBDTlRMX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ05UTF9XQUlUX0RJU0FTU09DICAgICAgICAgICAgICAxCisjZGVmaW5lIENOVExfV0FJVF9KT0lOICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDTlRMX1dBSVRfUkVBU1NPQyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ05UTF9XQUlUX1NUQVJUICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENOVExfV0FJVF9BVVRIICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBDTlRMX1dBSVRfQVNTT0MgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ05UTF9XQUlUX0FVVEgyICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENOVExfV0FJVF9PSURfTElTVF9TQ0FOICAgICAgICAgOAorI2RlZmluZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DICAgICAgICAgIDkKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgQ05UTF9XQUlUX1NDQU5fRk9SX0NPTk5FQ1QgICAgICAxMAorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjZGVmaW5lIE1UMl9BU1NPQ19DT05GICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgTVQyX0FVVEhfQ09ORiAgICAgICAgICAgICAgICAgICAzNQorI2RlZmluZSBNVDJfREVBVVRIX0NPTkYgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIE1UMl9ESVNBU1NPQ19DT05GICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTVQyX1JFQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAzOAorI2RlZmluZSBNVDJfUFdSX01HTVRfQ09ORiAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIE1UMl9KT0lOX0NPTkYgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgTVQyX1NDQU5fQ09ORiAgICAgICAgICAgICAgICAgICA0MQorI2RlZmluZSBNVDJfU1RBUlRfQ09ORiAgICAgICAgICAgICAgICAgIDQyCisjZGVmaW5lIE1UMl9HRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgTVQyX1NFVF9DT05GICAgICAgICAgICAgICAgICAgICA0NAorI2RlZmluZSBNVDJfUkVTRVRfQ09ORiAgICAgICAgICAgICAgICAgIDQ1CisjZGVmaW5lIE1UMl9NTE1FX1JPQU1JTkdfUkVRICAgICAgICAgICAgNTIKKworI2RlZmluZSBDTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIDEKKworLy8KKy8vIFNUQSdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBU1NPQ19JRExFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgMgorI2RlZmluZSBESVNBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9SRUFTU09DX1JFUSAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAgICA1CisjZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgICAgNgorI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JTUCAgICAgICAgICAgIDcKKyNkZWZpbmUgTVQyX0RJU0FTU09DX1RJTUVPVVQgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgOQorI2RlZmluZSBNVDJfUkVBU1NPQ19USU1FT1VUICAgICAgICAgICAgIDEwCisjZGVmaW5lIE1BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgICAgMTEKKworI2RlZmluZSBBU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQVNTT0NfU1RBVEUgKiBNQVhfQVNTT0NfTVNHKQorCisvLworLy8gQUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBQ1RfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9BQ1RfU1RBVEUgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBQ1RfTUFDSElORV9CQVNFICAgICAgICAgICAgICAwCisKKy8vVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvbidlcyBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLgorLy9DYXRlZ29yeQorI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RMU19DQVRFICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfQkFfQ0FURSAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX1BVQkxJQ19DQVRFICAgICAgICAgICAgIDQKKyNkZWZpbmUgTVQyX1BFRVJfUk1fQ0FURSAgICAgICAgICAgICA1CisjZGVmaW5lIE1UMl9QRUVSX0hUX0NBVEUgICAgICAgICAgICAgNwkvLwk3LjQuNworI2RlZmluZSBNQVhfUEVFUl9DQVRFX01TRyAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9NTE1FX0FERF9CQV9DQVRFICAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUgICAgICAgICAgICAgOQorI2RlZmluZSBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSAgICAgICAgICAgICAxMAorI2RlZmluZSBNVDJfTUxNRV9RT1NfQ0FURSAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgTVQyX01MTUVfRExTX0NBVEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgTVQyX0FDVF9JTlZBTElEICAgICAgICAgICAgIDEzCisjZGVmaW5lIE1BWF9BQ1RfTVNHICAgICAgICAgICAgICAgICAgIDE0CisKKy8vQ2F0ZWdvcnkgZmllbGQKKyNkZWZpbmUgQ0FURUdPUllfU1BFQ1RSVU0JCTAKKyNkZWZpbmUgQ0FURUdPUllfUU9TCQkJMQorI2RlZmluZSBDQVRFR09SWV9ETFMJCQkyCisjZGVmaW5lIENBVEVHT1JZX0JBCQkJMworI2RlZmluZSBDQVRFR09SWV9QVUJMSUMJCTQKKyNkZWZpbmUgQ0FURUdPUllfUk0JCQk1CisjZGVmaW5lIENBVEVHT1JZX0hUCQkJNworCisKKy8vIERMUyBBY3Rpb24gZnJhbWUgZGVmaW5pdGlvbgorI2RlZmluZSBBQ1RJT05fRExTX1JFUVVFU1QJCQkwCisjZGVmaW5lIEFDVElPTl9ETFNfUkVTUE9OU0UJCQkxCisjZGVmaW5lIEFDVElPTl9ETFNfVEVBUkRPV04JCQkyCisKKy8vU3BlY3RydW0gIEFjdGlvbiBmaWVsZCB2YWx1ZSA4MDIuMTFoIDcuNC4xCisjZGVmaW5lIFNQRUNfTVJRCTAJLy8gUmVxdWVzdAorI2RlZmluZSBTUEVDX01SUAkxCS8vUmVwb3J0CisjZGVmaW5lIFNQRUNfVFBDUlEJMgorI2RlZmluZSBTUEVDX1RQQ1JQCTMKKyNkZWZpbmUgU1BFQ19DSEFOTkVMX1NXSVRDSAk0CisKKworLy9CQSAgQWN0aW9uIGZpZWxkIHZhbHVlCisjZGVmaW5lIEFEREJBX1JFUQkwCisjZGVmaW5lIEFEREJBX1JFU1AJMQorI2RlZmluZSBERUxCQSAgIDIKKworLy9QdWJsaWMncyAgQWN0aW9uIGZpZWxkIHZhbHVlIGluIFB1YmxpYyBDYXRlZ29yeS4gIFNvbWUgaW4gODAyLjExeSBhbmQgc29tZSBpbiAxMW4KKyNkZWZpbmUgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1QJCQkJMAkvLyAxMW4KKyNkZWZpbmUgQUNUSU9OX0RTRV9FTkFCTEVNRU5UCQkJCQkxCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfREVFTkFCTEVNRU5UCQkJCTIJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9SRUdfTE9DQVRJT05fQU5OT1VOQ0UJMwkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRVhUX0NIX1NXSVRDSF9BTk5PVU5DRQkJNAkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUQkJCTUJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVBPUlQJCTYJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX01FQVNVUkVNRU5UX1BJTE9UX0FDVElPTgkJNyAgCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfUE9XRVJfQ09OU1RSQUlOVAkJCTgJLy8gMTF5IEQ5LjAKKworCisvL0hUICBBY3Rpb24gZmllbGQgdmFsdWUKKyNkZWZpbmUgTk9USUZZX0JXX0FDVElPTgkJCQkwCisjZGVmaW5lIFNNUFNfQUNUSU9OCQkJCQkJMQorI2RlZmluZSBQU01QX0FDVElPTiAgIAkJCQkJMgorI2RlZmluZSBTRVRQQ09fQUNUSU9OCQkJCQkzCisjZGVmaW5lIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OCQkJNAorI2RlZmluZSBNSU1PX05fQkVBQ09ORk9STQkJCQk1CisjZGVmaW5lIE1JTU9fQkVBQ09ORk9STQkJCQkJNgorI2RlZmluZSBBTlRFTk5BX1NFTEVDVAkJCQkJNworI2RlZmluZSBIVF9JTkZPX0VYQ0hBTkdFCQkJCTgKKworI2RlZmluZSBBQ1RfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FDVF9TVEFURSAqIE1BWF9BQ1RfTVNHKQorLy8KKy8vIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1dBSVRfU0VRNCAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX0FVVEhfUkVRICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9BVVRIX0VWRU4gICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9BVVRIX1NUQVRFICogTUFYX0FVVEhfTVNHKQorCisvLworLy8gU1RBJ3MgQVVUSF9SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX1JTUF9XQUlUX0NIQUwgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVVUSF9SU1BfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9BVVRIX0NIQUxMRU5HRV9USU1FT1VUICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9BVVRIX09ERCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX1JTUF9NU0cgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgICAgKE1BWF9BVVRIX1JTUF9TVEFURSAqIE1BWF9BVVRIX1JTUF9NU0cpCisKKy8vCisvLyBTVEEncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBTWU5DX0lETEUgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisjZGVmaW5lIEpPSU5fV0FJVF9CRUFDT04gICAgICAgICAgICAgICAgMQorI2RlZmluZSBTQ0FOX0xJU1RFTiAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgU1lOQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX1NDQU5fUkVRICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9KT0lOX1JFUSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX01MTUVfU1RBUlRfUkVRICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0JFQUNPTiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTVQyX1BFRVJfQVRJTSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1UMl9TQ0FOX1RJTUVPVVQgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNVDJfQkVBQ09OX1RJTUVPVVQgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTVQyX0FUSU1fVElNRU9VVCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgICAgOQorI2RlZmluZSBNQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX1NZTkNfU1RBVEUgKiBNQVhfU1lOQ19NU0cpCisKKy8vTWVzc2FnZXMgZm9yIHRoZSBETFMgc3RhdGUgbWFjaGluZQorI2RlZmluZSBETFNfSURMRQkJCQkJCTAKKyNkZWZpbmUgTUFYX0RMU19TVEFURQkJCQkJMQorCisjZGVmaW5lIERMU19NQUNISU5FX0JBU0UJCQkJMAorI2RlZmluZSBNVDJfTUxNRV9ETFNfUkVRCQkJICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1JFUQkJCSAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RMU19SU1AJCQkgICAgMgorI2RlZmluZSBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOCQkgICAgMworI2RlZmluZSBNVDJfUEVFUl9ETFNfVEVBUl9ET1dOCQkgICAgNAorI2RlZmluZSBNQVhfRExTX01TRwkJCQkgICAgICAgIDUKKworI2RlZmluZSBETFNfRlVOQ19TSVpFCQkJCQkoTUFYX0RMU19TVEFURSAqIE1BWF9ETFNfTVNHKQorCisvLworLy8gU1RBJ3MgV1BBLVBTSyBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgV1BBX1BTS19JRExFCQkJCQkwCisjZGVmaW5lIE1BWF9XUEFfUFNLX1NUQVRFCQkJCTEKKworI2RlZmluZSBXUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfV1BBX1BTS19NU0cgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZQlXUEFfUFNLX0ZVTkNfU0laRQkJCQkoTUFYX1dQQV9QU0tfU1RBVEUgKiBNQVhfV1BBX1BTS19NU0cpCisKKy8vCisvLyBTVEEncyBDSVNDTy1BSVJPTkVUIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBSVJPTkVUX0lETEUJCQkJCTAKKyNkZWZpbmUJQUlST05FVF9TQ0FOTklORwkJCQkxCisjZGVmaW5lIE1BWF9BSVJPTkVUX1NUQVRFCQkJCTIKKworI2RlZmluZSBBSVJPTkVUX01BQ0hJTkVfQkFTRQkJICAgIDAKKyNkZWZpbmUgTVQyX0FJUk9ORVRfTVNHCQkJCSAgICAwCisjZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fUkVRCQkgICAgMQorI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX0RPTkUJCSAgICAyCisjZGVmaW5lIE1BWF9BSVJPTkVUX01TRwkJCQkgICAgMworCisjZGVmaW5lCUFJUk9ORVRfRlVOQ19TSVpFCQkJCShNQVhfQUlST05FVF9TVEFURSAqIE1BWF9BSVJPTkVUX01TRykKKworLy8KKy8vIEFQJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9DTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgIDEKKworLy8KKy8vIEFQJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAzCisjZGVmaW5lIEFQTVQyX0NMUzNFUlIgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUF9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUF9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUF9NQVhfQVNTT0NfU1RBVEUgKiBBUF9NQVhfQVNTT0NfTVNHKQorCisvLworLy8gQVAncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfQ0xTMkVSUiAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9BVVRIX1NUQVRFICogQVBfTUFYX0FVVEhfTVNHKQorCisvLworLy8gQVAncyBBVVRILVJTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX0FVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgMAorI2RlZmluZSBBUE1UMl9BVVRIX0NIQUxMRU5HRV9USU1FT1VUICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9BVVRIX09ERCAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUF9BVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgIChBUF9NQVhfQVVUSF9SU1BfU1RBVEUgKiBBUF9NQVhfQVVUSF9SU1BfTVNHKQorCisvLworLy8gQVAncyBTWU5DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfU0NBTl9MSVNURU4JCQkJCTEKKyNkZWZpbmUgQVBfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBfU1lOQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0JFQUNPTiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX1JFUQkJCQkyCisjZGVmaW5lIEFQTVQyX1BFRVJfUFJPQkVfUlNQCQkJMworI2RlZmluZSBBUE1UMl9TQ0FOX1RJTUVPVVQJCQkJNAorI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fQ05DTAkJCTUKKyNkZWZpbmUgQVBfTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICA2CisKKyNkZWZpbmUgQVBfU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX1NZTkNfU1RBVEUgKiBBUF9NQVhfU1lOQ19NU0cpCisKKy8vCisvLyBBUCdzIFdQQSBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfV1BBX1BUSyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9XUEFfUFRLX1NUQVRFICAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX1dQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICA0CisjZGVmaW5lIEFQX01BWF9XUEFfTVNHICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQX1dQQV9GVU5DX1NJWkUgICAgICAgICAgICAgICAgKEFQX01BWF9XUEFfUFRLX1NUQVRFICogQVBfTUFYX1dQQV9NU0cpCisKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisvL0FwQ2xpIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0FVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRNCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBDTElfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0FVVEhfUkVRICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9NVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBDTElfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBDTElfTUFYX0FVVEhfU1RBVEUgKiBBUENMSV9NQVhfQVVUSF9NU0cpCisKKy8vQXBDbGkgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQQ0xJX0FTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgMgorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX01BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQQ0xJX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BU1NPQ19TVEFURSAqIEFQQ0xJX01BWF9BU1NPQ19NU0cpCisKKy8vQXBDbGkgc3luYyBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBBUENMSV9KT0lOX1dBSVRfUFJPQkVfUlNQICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQQ0xJX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX1BST0JFX1JFUSAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QUk9CRV9USU1FT1VUICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBDTElfU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfU1lOQ19TVEFURSAqIEFQQ0xJX01BWF9TWU5DX01TRykKKworLy9BcENsaSBjdHJsIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQ1RSTF9ESVNDT05ORUNURUQgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisjZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSCAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF8yICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0MgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQyAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQQ0xJX0NUUkxfQ09OTkVDVEVEICAgICAgICAgICAgICA2CisjZGVmaW5lIEFQQ0xJX01BWF9DVFJMX1NUQVRFICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgQVBDTElfQ1RSTF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQ1RSTF9KT0lOX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQ1RSTF9QUk9CRV9SU1AgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIX1JTUCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfQ1RSTF9ESVNDT05ORUNUX1JFUSAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfQ1RSTF9QRUVSX0RJU0NPTk5FQ1RfUkVRICAgIDQKKyNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVBDTElfQ1RSTF9ERUFTU09DX1JTUCAgICAgICAgICAgIDYKKyNkZWZpbmUgQVBDTElfQ1RSTF9KT0lOX1JFUV9USU1FT1VUICAgICAgIDcKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIX1JFUV9USU1FT1VUICAgICAgIDgKKyNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQ19SRVFfVElNRU9VVCAgICAgIDkKKyNkZWZpbmUgQVBDTElfTUFYX0NUUkxfTVNHICAgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgQVBDTElfQ1RSTF9GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQ1RSTF9TVEFURSAqIEFQQ0xJX01BWF9DVFJMX01TRykKKworI2lmIDAJLy8gcmVtb3ZlIHRob3NlIHZhcmlhYmxlcyBieSBBbGJlcnRZCisvLyBBcENsaSBXUEEgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9XUEFfUFNLX0lETEUJCQkJMAorI2RlZmluZSBBUENMSV9NQVhfV1BBX1BTS19TVEFURQkJCTEKKworLy8gQXBDbGkgV1BBIE1TRyBUeXBlCisjZGVmaW5lIEFQQ0xJX1dQQV9NQUNISU5FX0JBU0UJCQkwCisjZGVmaW5lIEFQQ0xJX01UMl9FQVBQYWNrZXQJCQkJMAorI2RlZmluZSBBUENMSV9NVDJfRUFQT0xTdGFydAkJCTEKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MTG9nb2ZmCQkJMgorI2RlZmluZSBBUENMSV9NVDJfRUFQT0xLZXkJCQkJMworI2RlZmluZSBBUENMSV9NVDJfRUFQT0xBU0ZBbGVydAkJCTQKKyNkZWZpbmUgQVBDTElfTUFYX1dQQV9QU0tfTVNHCQkJNQorCisjZGVmaW5lCUFQQ0xJX1dQQV9QU0tfRlVOQ19TSVpFCQkJKEFQQ0xJX01BWF9XUEFfUFNLX1NUQVRFICogQVBDTElfTUFYX1dQQV9QU0tfTVNHKQorI2VuZGlmIC8vIGVuZCAtIDAgLy8KKworI2VuZGlmCS8vIEFQQ0xJX1NVUFBPUlQgLy8KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIGhlYWRlciBGQy5UeXRlLCB3aGljaCBpcyBiMy4uYjIgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgQlRZUEVfTUdNVCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlRZUEVfQ05UTCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgIDIKKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBNR01UIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SRVEgICAgICAgICAgIDAKKyNkZWZpbmUgU1VCVFlQRV9BU1NPQ19SU1AgICAgICAgICAgIDEKKyNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JFUSAgICAgICAgIDIKKyNkZWZpbmUgU1VCVFlQRV9SRUFTU09DX1JTUCAgICAgICAgIDMKKyNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SRVEgICAgICAgICAgIDQKKyNkZWZpbmUgU1VCVFlQRV9QUk9CRV9SU1AgICAgICAgICAgIDUKKyNkZWZpbmUgU1VCVFlQRV9CRUFDT04gICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9BVElNICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9ESVNBU1NPQyAgICAgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfQVVUSCAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTVUJUWVBFX0RFQVVUSCAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9BQ1RJT04gICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfQUNUSU9OX05PX0FDSyAgICAgICAgICAgICAgMTQKKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBDTlRMIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgU1VCVFlQRV9XUkFQUEVSICAgICAgIAk3CisjZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUSAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfQkxPQ0tfQUNLICAgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfUFNfUE9MTCAgICAgICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX1JUUyAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU1VCVFlQRV9DVFMgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfQUNLICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX0NGRU5EICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgU1VCVFlQRV9DRkVORF9DRkFDSyAgICAgICAgIDE1CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgREFUQSBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDSyAgICAgICAgICAxCisjZGVmaW5lIFNVQlRZUEVfREFUQV9DRlBPTEwgICAgICAgICAyCisjZGVmaW5lIFNVQlRZUEVfREFUQV9DRkFDS19DRlBPTEwgICAzCisjZGVmaW5lIFNVQlRZUEVfTlVMTF9GVU5DICAgICAgICAgICA0CisjZGVmaW5lIFNVQlRZUEVfQ0ZBQ0sgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNVQlRZUEVfQ0ZQT0xMICAgICAgICAgICAgICA2CisjZGVmaW5lIFNVQlRZUEVfQ0ZBQ0tfQ0ZQT0xMICAgICAgICA3CisjZGVmaW5lIFNVQlRZUEVfUURBVEEgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0sgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZQT0xMICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLX0NGUE9MTCAgMTEKKyNkZWZpbmUgU1VCVFlQRV9RT1NfTlVMTCAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX1FPU19DRlBPTEwgICAgICAgICAgMTQKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0tfQ0ZQT0xMICAgIDE1CisKKy8vIEFDSyBwb2xpY3kgb2YgUU9TIENvbnRyb2wgZmllbGQgYml0IDY6NQorI2RlZmluZSBOT1JNQUxfQUNLICAgICAgICAgICAgICAgICAgMHgwMCAgLy8gYjY6NSA9IDAwCisjZGVmaW5lIE5PX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDIwICAvLyBiNjo1ID0gMDEKKyNkZWZpbmUgTk9fRVhQTElDSVRfQUNLICAgICAgICAgICAgIDB4NDAgIC8vIGI2OjUgPSAxMAorI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MCAgLy8gYjY6NSA9IDExCisKKy8vCisvLyBydG1wX2RhdGEuYyB1c2UgdGhlc2UgZGVmaW5pdGlvbgorLy8KKyNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMAorI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQ19IICAgICAgICAgMzQKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkMgICAgICAgICAgIDI4CisjZGVmaW5lIExFTkdUSF84MDJfMTFfV0lUSF9BRERSNCAgICAzMAorI2RlZmluZSBMRU5HVEhfODAyXzMgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTEVOR1RIXzgwMl8zX1RZUEUgICAgICAgICAgIDIKKyNkZWZpbmUgTEVOR1RIXzgwMl8xX0ggICAgICAgICAgICAgIDgKKyNkZWZpbmUgTEVOR1RIX0VBUE9MX0ggICAgICAgICAgICAgIDQKKyNkZWZpbmUgTEVOR1RIX1dNTVFPU19ICQkJCTIKKyNkZWZpbmUgTEVOR1RIX0NSQyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1NFUV9OVU1CRVIgICAgICAgICAgICAgIDB4MGZmZgorI2RlZmluZSBMRU5HVEhfODAyXzNfTk9fVFlQRQkJMTIKKyNkZWZpbmUgTEVOR1RIXzgwMl8xUQkJCQk0IC8qIFZMQU4gcmVsYXRlZCAqLworCisvLyBTVEFfQ1NSNC5maWVsZC5UeFJlc3VsdAorI2RlZmluZSBUWF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgMAorI2RlZmluZSBUWF9SRVNVTFRfWkVST19MRU5HVEggICAgICAgMQorI2RlZmluZSBUWF9SRVNVTFRfVU5ERVJfUlVOICAgICAgICAgMgorI2RlZmluZSBUWF9SRVNVTFRfT0hZX0VSUk9SICAgICAgICAgNAorI2RlZmluZSBUWF9SRVNVTFRfUkVUUllfRkFJTCAgICAgICAgNgorCisvLyBBbGwgUEhZIHJhdGUgc3VtbWFyeSBpbiBUWEQKKy8vIFByZWFtYmxlIE1PREUgaW4gVHhECisjZGVmaW5lIE1PREVfQ0NLCTAKKyNkZWZpbmUgTU9ERV9PRkRNICAgMQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBNT0RFX0hUTUlYCTIKKyNkZWZpbmUgTU9ERV9IVEdSRUVORklFTEQJMworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworLy8gTUNTIGZvciBDQ0suICBCVy5TR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcworI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEJLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICA0CSAvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcy4gc2hvcnQgaXMgZm9yYmlkZGVuIGluIDFNYnBzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDUJLy8gc2hvcnQgcHJlYW1ibGUgQ0NLIDJNYnBzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgNworLy8gVG8gc2VuZCBkdXBsaWNhdGUgbGVnYWN5IE9GRE0uIHNldCBCVz1CV180MC4gIFNHSS5TVEJDIGFyZSByZXNlcnZlZAorI2RlZmluZSBNQ1NfUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDAgICAvLyBsZWdhY3kgT0ZETQorI2RlZmluZSBNQ1NfUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDEgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzEyICAgICAgICAgICAgICAgICAgICAgMiAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMTggICAgICAgICAgICAgICAgICAgICAzICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDQgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMzYgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDYgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfNTQgICAgICAgICAgICAgICAgICAgICA3IC8vIE9GRE0KKy8vIEhUCisjZGVmaW5lIE1DU18wCQkwCS8vIDFTCisjZGVmaW5lIE1DU18xCQkxCisjZGVmaW5lIE1DU18yCQkyCisjZGVmaW5lIE1DU18zCQkzCisjZGVmaW5lIE1DU180CQk0CisjZGVmaW5lIE1DU181CQk1CisjZGVmaW5lIE1DU182CQk2CisjZGVmaW5lIE1DU183CQk3CisjZGVmaW5lIE1DU184CQk4CS8vIDJTCisjZGVmaW5lIE1DU185CQk5CisjZGVmaW5lIE1DU18xMAkJMTAKKyNkZWZpbmUgTUNTXzExCQkxMQorI2RlZmluZSBNQ1NfMTIJCTEyCisjZGVmaW5lIE1DU18xMwkJMTMKKyNkZWZpbmUgTUNTXzE0CQkxNAorI2RlZmluZSBNQ1NfMTUJCTE1CisjZGVmaW5lIE1DU18xNgkJMTYJLy8gMyozCisjZGVmaW5lIE1DU18xNwkJMTcKKyNkZWZpbmUgTUNTXzE4CQkxOAorI2RlZmluZSBNQ1NfMTkJCTE5CisjZGVmaW5lIE1DU18yMAkJMjAKKyNkZWZpbmUgTUNTXzIxCQkyMQorI2RlZmluZSBNQ1NfMjIJCTIyCisjZGVmaW5lIE1DU18yMwkJMjMKKyNkZWZpbmUgTUNTXzMyCQkzMgorI2RlZmluZSBNQ1NfQVVUTwkJMzMKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gT0lEX0hUUEhZTU9ERQorLy8gTU9ERQorI2RlZmluZSBIVE1PREVfTU0JMAorI2RlZmluZSBIVE1PREVfR0YJMQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBGaXhlZCBUeCBNT0RFIC0gSFQsIENDSyBvciBPRkRNCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9IVAkJMAorI2RlZmluZSBGSVhFRF9UWE1PREVfQ0NLCTEKKyNkZWZpbmUgRklYRURfVFhNT0RFX09GRE0gCTIKKy8vIEJXCisjZGVmaW5lIEJXXzIwCQlCQU5EX1dJRFRIXzIwCisjZGVmaW5lIEJXXzQwCQlCQU5EX1dJRFRIXzQwCisjZGVmaW5lIEJXX0JPVEgJCUJBTkRfV0lEVEhfQk9USAorI2RlZmluZSBCV18xMAkJQkFORF9XSURUSF8xMAkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gU0hPUlRHSQorI2RlZmluZSBHSV80MDAJCUdBUF9JTlRFUlZBTF80MDAJLy8gb25seSBzdXBwb3J0IGluIEhUIG1vZGUKKyNkZWZpbmUgR0lfQk9USAkJR0FQX0lOVEVSVkFMX0JPVEgKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNkZWZpbmUgR0lfODAwCQlHQVBfSU5URVJWQUxfODAwCisvLyBTVEJDCisjZGVmaW5lIFNUQkNfTk9ORQkwCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIFNUQkNfVVNFCTEJLy8gbGltaXRlZCB1c2UgaW4gcnQyODYwYiBwaHkKKyNkZWZpbmUgUlhTVEJDX09ORQkxCS8vIHJ4IHN1cHBvcnQgb2Ygb25lIHNwYXRpYWwgc3RyZWFtCisjZGVmaW5lIFJYU1RCQ19UV08JMgkvLyByeCBzdXBwb3J0IG9mIDEgYW5kIDIgc3BhdGlhbCBzdHJlYW0KKyNkZWZpbmUgUlhTVEJDX1RIUgkzCS8vIHJ4IHN1cHBvcnQgb2YgMX4zIHNwYXRpYWwgc3RyZWFtCisvLyBNQ1MgRkVFREJBQ0sKKyNkZWZpbmUgTUNTRkJLX05PTkUJMCAgLy8gbm90IHN1cHBvcnQgbWNzIGZlZWRiYWNrIC8KKyNkZWZpbmUgTUNTRkJLX1JTVgkxCS8vIHJlc2VydmVkCisjZGVmaW5lIE1DU0ZCS19VTlNPTElDSVQJMgkvLyBvbmx5IHN1cHBvcnQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrCisjZGVmaW5lIE1DU0ZCS19NUlEJMwkvLyByZXNwb25zZSB0byBib3RoIE1SUSBhbmQgdW5zb2xpY3QgbWNzIGZlZWRiYWNrCisKKy8vIE1JTU8gcG93ZXIgc2FmZQorI2RlZmluZQlNTVBTX1NUQVRJQwkwCisjZGVmaW5lCU1NUFNfRFlOQU1JQwkJMQorI2RlZmluZSAgIE1NUFNfUlNWCQkyCisjZGVmaW5lIE1NUFNfRU5BQkxFCQkzCisKKworLy8gQS1NU0RVIHNpemUKKyNkZWZpbmUJQU1TRFVfMAkwCisjZGVmaW5lCUFNU0RVXzEJCTEKKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBNQ1MgdXNlIDcgYml0cworI2RlZmluZSBUWFJBVEVNSU1PCQkweDgwCisjZGVmaW5lIFRYUkFURU1DUwkJMHg3RgorI2RlZmluZSBUWFJBVEVPRkRNCQkweDdGCisjZGVmaW5lIFJBVEVfMSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFJBVEVfNiAgICAgICAgICAgICAgICAgICAgICA0ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzkgICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDYgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMTggICAgICAgICAgICAgICAgICAgICA3ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgOCAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDkgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfNDggICAgICAgICAgICAgICAgICAgICAxMCAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgMTEgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV9GSVJTVF9PRkRNX1JBVEUgICAgICAgIFJBVEVfNgorI2RlZmluZSBSQVRFX0xBU1RfT0ZETV9SQVRFICAgICAgICAJUkFURV81NAorI2RlZmluZSBSQVRFXzZfNSAgICAgICAgICAgICAgICAgICAgMTIgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzEzICAgICAgICAgICAgICAgICAgICAgMTMgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzE5XzUgICAgICAgICAgICAgICAgICAgMTQgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzI2ICAgICAgICAgICAgICAgICAgICAgMTUgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzM5ICAgICAgICAgICAgICAgICAgICAgMTYgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzUyICAgICAgICAgICAgICAgICAgICAgMTcgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzU4XzUgICAgICAgICAgICAgICAgICAgMTggIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzY1ICAgICAgICAgICAgICAgICAgICAgMTkgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzc4ICAgICAgICAgICAgICAgICAgICAgMjAgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzEwNCAgICAgICAgICAgICAgICAgICAgMjEgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzExNyAgICAgICAgICAgICAgICAgICAgMjIgIC8vIEhUIG1peAorI2RlZmluZSBSQVRFXzEzMCAgICAgICAgICAgICAgICAgICAgMjMgIC8vIEhUIG1peAorLy8jZGVmaW5lIFJBVEVfQVVUT19TV0lUQ0ggICAgICAgICAgICAyNTUgLy8gZm9yIFN0YUNmZy5GaXhlZFR4UmF0ZSBvbmx5CisjZGVmaW5lIEhUUkFURV8wICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFJBVEVfRklSU1RfTU1fUkFURSAgICAgICAgSFRSQVRFXzAKKyNkZWZpbmUgUkFURV9GSVJTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAorI2RlZmluZSBSQVRFX0xBU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKKworLy8gcFR4V0ktPnR4b3AKKyNkZWZpbmUgSUZTX0hUVFhPUCAgICAgICAgICAgICAgICAgMAkvLyBUaGUgdHhvcCB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQy4KKyNkZWZpbmUgSUZTX1BJRlMgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSUZTX1NJRlMgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUZTX0JBQ0tPRkYgICAgICAgICAgICAgICAgIDMKKworLy8gcFR4RC0+UmV0cnlNb2RlCisjZGVmaW5lIExPTkdfUkVUUlkgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNIT1JUX1JFVFJZICAgICAgICAgICAgICAgICAwCisKKy8vIENvdW50cnkgUmVnaW9uIGRlZmluaXRpb24KKyNkZWZpbmUgUkVHSU9OX01JTklNVU1fQkdfQkFORCAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHSU9OXzBfQkdfQkFORCAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMS0xMQorI2RlZmluZSBSRUdJT05fMV9CR19CQU5EICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAxLTEzCisjZGVmaW5lIFJFR0lPTl8yX0JHX0JBTkQgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDEwLTExCisjZGVmaW5lIFJFR0lPTl8zX0JHX0JBTkQgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDEwLTEzCisjZGVmaW5lIFJFR0lPTl80X0JHX0JBTkQgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0CisjZGVmaW5lIFJFR0lPTl81X0JHX0JBTkQgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDEtMTQKKyNkZWZpbmUgUkVHSU9OXzZfQkdfQkFORCAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMy05CisjZGVmaW5lIFJFR0lPTl83X0JHX0JBTkQgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDUtMTMKKyNkZWZpbmUgUkVHSU9OXzMxX0JHX0JBTkQgICAgICAgICAgICAgICAgIDMxICAgICAgIC8vIDUtMTMKKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQkdfQkFORCAgICAgICAgICAgIDcKKworI2RlZmluZSBSRUdJT05fTUlOSU1VTV9BX0JBTkQgICAgICAgICAgICAgMAorI2RlZmluZSBSRUdJT05fMF9BX0JBTkQgICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl8xX0FfQkFORCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKKyNkZWZpbmUgUkVHSU9OXzJfQV9CQU5EICAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0CisjZGVmaW5lIFJFR0lPTl8zX0FfQkFORCAgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OXzRfQV9CQU5EICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzVfQV9CQU5EICAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl82X0FfQkFORCAgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4CisjZGVmaW5lIFJFR0lPTl83X0FfQkFORCAgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl84X0FfQkFORCAgICAgICAgICAgICAgICAgICA4ICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0CisjZGVmaW5lIFJFR0lPTl85X0FfQkFORCAgICAgICAgICAgICAgICAgICA5ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl8xMF9BX0JBTkQgICAgICAgICAgICAgICAgICAxMAkgIC8vIDM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMTFfQV9CQU5EICAgICAgICAgICAgICAgICAgMTEJICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fTUFYSU1VTV9BX0JBTkQgICAgICAgICAgICAgMTEKKworLy8gcFR4RC0+Q2lwaGVyQWxnCisjZGVmaW5lIENJUEhFUl9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENJUEhFUl9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENJUEhFUl9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIENJUEhFUl9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENJUEhFUl9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENJUEhFUl9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIENJUEhFUl9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIENJUEhFUl9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorI2RlZmluZSBDSVBIRVJfU01TNAkJCQkJOAorCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5SZkljVHlwZQorI2RlZmluZSBSRklDXzI4MjAgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAyLjRHIDJUM1IKKyNkZWZpbmUgUkZJQ18yODUwICAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMi40Ry81RyAyVDNSCisjZGVmaW5lIFJGSUNfMjcyMCAgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDIuNEcgMVQyUgorI2RlZmluZSBSRklDXzI3NTAgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAyLjRHLzVHIDFUMlIKKyNkZWZpbmUgUkZJQ18zMDIwICAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMi40RyAxVDFSCisjZGVmaW5lIFJGSUNfMjAyMCAgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDIuNEcgQi9HCisKKy8vIExFRCBTdGF0dXMuCisjZGVmaW5lIExFRF9MSU5LX0RPV04gICAgICAgICAgICAgICAwCisjZGVmaW5lIExFRF9MSU5LX1VQICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExFRF9SQURJT19PRkYgICAgICAgICAgICAgICAyCisjZGVmaW5lIExFRF9SQURJT19PTiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIExFRF9IQUxUICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExFRF9XUFMgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIExFRF9PTl9TSVRFX1NVUlZFWSAgICAgICAgICA2CisjZGVmaW5lIExFRF9QT1dFUl9VUCAgICAgICAgICAgICAgICA3CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPkxlZENudGwuTGVkTW9kZSBhbmQgRTJQUk9NCisjZGVmaW5lIExFRF9NT0RFX0RFRkFVTFQgICAgICAgICAgICAwCisjZGVmaW5lIExFRF9NT0RFX1RXT19MRUQJCQkxCisjZGVmaW5lIExFRF9NT0RFX1NJR05BTF9TVFJFR1RICQk4ICAvLyBFRVBST00gZGVmaW5lID04CisKKy8vIFJDNCBpbml0IHZhbHVlLCB1c2VkIGZybyBXRVAgJiBUS0lQCisjZGVmaW5lIFBQUElOSVRGQ1MzMiAgICAgICAgICAgICAgICAweGZmZmZmZmZmICAgLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkLiA4MDIuMVggY29udHJvbGxlZCBwb3J0IGRlZmluaXRpb24KKyNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgICAgIDEKKyNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEIDIKKworI2RlZmluZSBQQUlSV0lTRV9LRVkgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUk9VUF9LRVkgICAgICAgICAgICAgICAgICAgMgorCisvL2RlZmluaXRpb24gb2YgRFJTCisjZGVmaW5lIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENICTMyCisKKworLy8gcHJlLWFsbG9jYXRlZCBmcmVlIE5ESVMgUEFDS0VUL0JVRkZFUiBwb2xsIGZvciBpbnRlcm5hbCB1c2FnZQorI2RlZmluZSBNQVhfTlVNX09GX0ZSRUVfTkRJU19QQUNLRVQgMTI4CisKKy8vQmxvY2sgQUNLCisjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGICAgNjQKKyNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYgICA2NAorI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQgICAzMAorI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQgICAzMAorCisvLyBkZWZpbml0aW9uIG9mIFJlY2lwaWVudCBvciBPcmlnaW5hdG9yCisjZGVmaW5lIElfUkVDSVBJRU5UICAgICAgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBJX09SSUdJTkFUT1IgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBERUZBVUxUX0JCUF9UWF9QT1dFUiAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JGX1RYX1BPV0VSICAgICAgICAgNQorCisjZGVmaW5lIE1BWF9JTklfQlVGRkVSX1NJWkUJCQk0MDk2CisjZGVmaW5lIE1BWF9QQVJBTV9CVUZGRVJfU0laRQkJKDIwNDgpIC8vIGVub3VnaCBmb3IgQUNMICgxOCo2NCkKKwkJCQkJCQkJCQkJLy8xOCA6IHRoZSBsZW5ndGggb2YgTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgIjAxOjAyOjAzOjA0OjA1OjA2OyIpCisJCQkJCQkJCQkJCS8vNjQgOiBNQVhfTlVNX09GX0FDTF9MSVNUCisvLyBkZWZpbml0aW9uIG9mIHBBZC0+T3BNb2RlCisjZGVmaW5lIE9QTU9ERV9TVEEgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE9QTU9ERV9BUCAgICAgICAgICAgICAgICAgICAxCisvLyNkZWZpbmUgT1BNT0RFX0wzX0JSRyAgICAgICAgICAgICAgIDIgICAgICAgLy8gYXMgQVAgYW5kIFNUQSBhdCB0aGUgc2FtZSB0aW1lCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisjZGVmaW5lIERJUl9SRUFEICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERJUl9XUklURSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRZUEVfVFhEICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRZUEVfUlhEICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRZUEVfVFhJTkZPCQkJCQkwCisjZGVmaW5lIFRZUEVfUlhJTkZPCQkJCQkxCisjZGVmaW5lIFRZUEVfVFhXSQkJCQkJMAorI2RlZmluZSBUWVBFX1JYV0kJCQkJCTEKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyB2YWx1ZSBkb21haW4gZm9yIHBBZC0+RXZlbnRUYWIuTG9nW10uRXZlbnQKKyNkZWZpbmUgRVZFTlRfUkVTRVRfQUNDRVNTX1BPSU5UICAgIDAgLy8gTG9nID0gImhoOm1tOnNzICAgUmVzdGFydCBBY2Nlc3MgUG9pbnQiCisjZGVmaW5lIEVWRU5UX0FTU09DSUFURUQgICAgICAgICAgICAxIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBhc3NvY2lhdGVkIgorI2RlZmluZSBFVkVOVF9ESVNBU1NPQ0lBVEVEICAgICAgICAgMiAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgbGVmdCB0aGlzIEJTUyIKKyNkZWZpbmUgRVZFTlRfQUdFRF9PVVQgICAgICAgICAgICAgIDMgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IHdhcyBhZ2VkLW91dCBhbmQgcmVtb3ZlZCBmcm9tIHRoaXMgQlNTIgorI2RlZmluZSBFVkVOVF9DT1VOVEVSX00gICAgICAgICAgICAgNAorI2RlZmluZSBFVkVOVF9JTlZBTElEX1BTSyAgICAgICAgICAgNQorI2RlZmluZSBFVkVOVF9NQVhfRVZFTlRfVFlQRSAgICAgICAgNgorLy8gPT09PSBlbmQgb2YgQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT0KKworLy8gZGVmaW5pdGlvbiBSU1NJIE51bWJlcgorI2RlZmluZSBSU1NJXzAJCQkJCTAKKyNkZWZpbmUgUlNTSV8xCQkJCQkxCisjZGVmaW5lIFJTU0lfMgkJCQkJMgorCisvLyBkZWZpbml0aW9uIG9mIHJhZGFyIGRldGVjdGlvbgorI2RlZmluZSBSRF9OT1JNQUxfTU9ERQkJCQkwCS8vIE5vdCBmb3VuZCByYWRhciBzaWduYWwKKyNkZWZpbmUgUkRfU1dJVENISU5HX01PREUJCQkxCS8vIEZvdW5kIHJhZGFyIHNpZ25hbCwgYW5kIGRvaW5nIGNoYW5uZWwgc3dpdGNoCisjZGVmaW5lIFJEX1NJTEVOQ0VfTU9ERQkJCQkyCS8vIEFmdGVyIGNoYW5uZWwgc3dpdGNoLCBuZWVkIHRvIGJlIHNpbGVuY2UgYSB3aGlsZSB0byBlbnN1cmUgcmFkYXIgbm90IGZvdW5kCisKKy8vRHJpdmVyIGRlZmluZWQgY2lkIGZvciBtYXBwaW5nIHN0YXR1cyBhbmQgY29tbWFuZC4KKyNkZWZpbmUgIFNMRUVQQ0lECTB4MTEKKyNkZWZpbmUgIFdBS0VDSUQJMHgyMgorI2RlZmluZSAgUVVFUllQT1dFUkNJRAkweDMzCisjZGVmaW5lICBPV05FUk1DVQkweDEKKyNkZWZpbmUgIE9XTkVSQ1BVCTB4MAorCisvLyBNQlNTSUQgZGVmaW5pdGlvbgorI2RlZmluZSBFTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICAgMHhGRgorCisKKy8qIEFmdGVyIExpbnV4IDIuNi45LAorICogVkxBTiBtb2R1bGUgdXNlIFByaXZhdGUgKGZyb20gdXNlcikgaW50ZXJmYWNlIGZsYWdzIChuZXRkZXZpY2UtPnByaXZfZmxhZ3MpLgorICogI2RlZmluZSBJRkZfODAyXzFRX1ZMQU4gMHgxICAgICAgICAgLS0gICAgODAyLjFRIFZMQU4gZGV2aWNlLiAgaW4gaWYuaAorICogcmVmIHRvIGlwX3NhYm90YWdlX291dCgpIFsgb3V0LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOIF0gaW4gYnJfbmV0ZmlsdGVyLmMKKyAqCisgKiBGb3IgdGhpcyByZWFzb24sIHdlIE1VU1QgdXNlIEVWRU4gdmFsdWUgaW4gcHJpdl9mbGFncworICovCisjZGVmaW5lIElOVF9NQUlOICAgICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSU5UX01CU1NJRCAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJTlRfV0RTICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIElOVF9BUENMSSAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSU5UX01FU0ggICAgICAgICAgICAgICAgICAgCTB4MDUwMAorCisvLyBVc2UgYml0bWFwIHRvIGFsbG93IGNvZXhpc3Qgb2YgQVRFX1RYRlJBTUUgYW5kIEFURV9SWEZSQU1FKGkuZS4sdG8gc3VwcG9ydCBMb29wQmFjayBtb2RlKQorI2lmZGVmIFJBTElOS19BVEUKKyNkZWZpbmUJQVRFX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDAgICAvLyBTdGFydCBBVEUKKyNkZWZpbmUJQVRFX1NUT1AgICAgICAgICAgICAgICAgICAgIDB4ODAgICAvLyBTdG9wIEFURQorI2RlZmluZQlBVEVfVFhDT05UICAgICAgICAgICAgICAgICAgMHgwNSAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQKKyNkZWZpbmUJQVRFX1RYQ0FSUiAgICAgICAgICAgICAgICAgIDB4MDkgICAvLyBUcmFuc21pdCBDYXJyaWVyCisjZGVmaW5lCUFURV9UWENBUlJTVVBQICAgICAgICAgICAgICAweDExICAgLy8gVHJhbnNtaXQgQ2FycmllciBTdXBwcmVzc2lvbgorI2RlZmluZQlBVEVfVFhGUkFNRSAgICAgICAgICAgICAgICAgMHgwMSAgIC8vIFRyYW5zbWl0IEZyYW1lcworI2RlZmluZQlBVEVfUlhGUkFNRSAgICAgICAgICAgICAgICAgMHgwMiAgIC8vIFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyNkZWZpbmUgQVRFX1RYU1RPUCAgICAgICAgICAgICAgICAgIDB4ZTIgICAvLyBTdG9wIFRyYW5zbWl0aW9uKGkuZS4sIFRYQ09OVCwgVFhDQVJSLCBUWENBUlJTVVBQLCBhbmQgVFhGUkFNRSkKKyNkZWZpbmUgQVRFX1JYU1RPUAkJCQkJMHhmZCAgIC8vIFN0b3AgcmVjZWl2aW5nIEZyYW1lcworI2RlZmluZQlCQlAyMl9UWEZSQU1FICAgICAJCQkweDAwICAgLy8gVHJhbnNtaXQgRnJhbWVzCisjZGVmaW5lCUJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUCAgICAweDgwICAgLy8gQ29udGludW91cyBUcmFuc21pdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uCisjZGVmaW5lCUJCUDIyX1RYQ0FSUiAgICAgICAgICAgICAgICAweGMxICAgLy8gVHJhbnNtaXQgQ2FycmllcgorI2RlZmluZQlCQlAyNF9UWENPTlQgICAgICAgICAgICAgICAgMHgwMCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQKKyNkZWZpbmUJQkJQMjRfQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MDEgICAvLyBDYXJyaWVyIFN1cHByZXNzaW9uCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKy8vIFdFUCBLZXkgVFlQRQorI2RlZmluZSBXRVBfSEVYQURFQ0lNQUxfVFlQRSAgICAwCisjZGVmaW5lIFdFUF9BU0NJSV9UWVBFICAgICAgICAgIDEKKworCisKKy8vIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisvKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50LCByZWZlciB0byB3aXJlbGVzc190b29scy4yOC93aXJlbGVzcy4yMC5oICovCisjZGVmaW5lIElXX0NVU1RPTV9NQVhfTEVOCQkJCSAgCQkJMjU1CS8qIEluIGJ5dGVzICovCisKKy8vIEZvciBzeXN0ZW0gZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZQlJV19BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZQlJV19ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZQlJV19ERUFVVEhfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAJMHgwMjAyCisjZGVmaW5lCUlXX0FHRU9VVF9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIAkweDAyMDMKKyNkZWZpbmUJSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHICAgICAgICAgICAgICAweDAyMDQKKyNkZWZpbmUJSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUJSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHICAgICAgICAgICAJCQkweDAyMDYKKyNkZWZpbmUJSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgCQkJMHgwMjA3CisjZGVmaW5lIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHCQkJCQkJMHgwMjA4CisjZGVmaW5lIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHCQkJCQkJMHgwMjA5CisjZGVmaW5lIElXX0dST1VQX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCQkweDAyMEEKKyNkZWZpbmUJSVdfUEFJUldJU0VfSFNfVElNRU9VVF9FVkVOVF9GTEFHCQkJMHgwMjBCCisjZGVmaW5lIElXX1JTTklFX1NBTklUWV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjBDCisjZGVmaW5lIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcJCQkJMHgwMjBECisjZGVmaW5lIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcJCQkJMHgwMjBFCisjZGVmaW5lIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRwkJCQkJMHgwMjBGCisjZGVmaW5lIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHCQkJCQkweDAyMTAKKyNkZWZpbmUgSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRwkJCQkweDAyMTEKKyNkZWZpbmUgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMTIKKy8vIGlmIGFkZCBuZXcgc3lzdGVtIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NZU19FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMgorI2RlZmluZQlJV19TWVNfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1lTX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQorLy8gRm9yIHN5c3RlbSBldmVudCAtIGVuZAorCisvLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgSVdfQ09ORkxJQ1RfU1NJRF9FVkVOVF9GTEFHCQkJCQkweDAzMDAKKyNkZWZpbmUgSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMQorI2RlZmluZSBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRwkJCTB4MDMwMgorI2RlZmluZSBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAzCisjZGVmaW5lIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHCQkJCQkweDAzMDQKKyNkZWZpbmUgSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDAzMDUKKyNkZWZpbmUgSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDYKKyNkZWZpbmUgSVdfU1BPT0ZfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNworI2RlZmluZSBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRwkJCTB4MDMwOAorI2RlZmluZSBJV19SRVBMQVlfQVRUQUNLX0VWRU5UX0ZMQUcJCQkJCTB4MDMwOQorLy8gaWYgYWRkIG5ldyBzcG9vZiBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAweDAzMDkKKyNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgLSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBlbmQKKworLy8gRm9yIGZsb29kaW5nIGF0dGFjayBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDAwCisjZGVmaW5lIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMQorI2RlZmluZSBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMgorI2RlZmluZSBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDMKKyNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKKyNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQorI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgorLy8gaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgCTB4MDQwNgorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAtIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQorLy8gRm9yIGZsb29kaW5nIGF0dGFjayAtIGVuZAorCisvLyBFbmQgLSBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvLyBkZWZpbml0aW9uIGZvciBETFMsIGthdGh5CisjZGVmaW5lCU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkgICAxCisjZGVmaW5lCU1BWF9OVU1fT0ZfRExTX0VOVFJZICAgICAgICBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQorCisvL0Jsb2NrIEFDSyAsIHJ0Mjg2MCwga2F0aHkKKyNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYJCTY0CisjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGCQk2NAorI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQJCTMwCisjZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVAkJMzAKKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0JBUkVDSV9TRVNTSU9OCQk4CisjZW5kaWYKKworI2lmbmRlZiBJV19FU1NJRF9NQVhfU0laRQorLyogTWF4aW11bSBzaXplIG9mIHRoZSBFU1NJRCBhbmQgcEFkLT5uaWNrbmFtZSBzdHJpbmdzICovCisjZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFICAgCQkzMgorI2VuZGlmCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisjZGVmaW5lIE1DQVNUX0RJU0FCTEUJMAorI2RlZmluZSBNQ0FTVF9DQ0sJCTEKKyNkZWZpbmUgTUNBU1RfT0ZETQkJMgorI2RlZmluZSBNQ0FTVF9IVE1JWAkJMworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworLy8gRm9yIEFzaWNSYWRpb09mZi9Bc2ljUmFkaW9PbiBmdW5jdGlvbgorI2RlZmluZSBET1QxMVBPV0VSU0FWRQkJMAorI2RlZmluZSBHVUlSQURJT19PRkYJCTEKKyNkZWZpbmUgUlRNUF9IQUxUCQkgICAgMgorI2RlZmluZSBHVUlfSURMRV9QT1dFUl9TQVZFCQkzCisvLyAtLQorCisKKy8vIGRlZmluaXRpb24gZm9yIFdwYVN1cHBvcnQgZmxhZworI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFCQkJCTAKKyNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRU5BQkxFCQkJCTEKKyNkZWZpbmUJV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJCTIKKworLy8gRW5kaWFuIGJ5dGUgc3dhcHBpbmcgY29kZXMKKyNkZWZpbmUgU1dBUDE2KHgpIFwKKyAgICAoKFVJTlQxNikoIFwKKyAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHgwMGZmVSkgPDwgOCkgfCBcCisgICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4ZmYwMFUpID4+IDgpICkpCisKKyNkZWZpbmUgU1dBUDMyKHgpIFwKKyAgICAoKFVJTlQzMikoIFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKKworI2RlZmluZSBTV0FQNjQoeCkgXAorICAgICgoVUlOVDY0KSggXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisKKyNkZWZpbmUgY3B1MmxlNjQoeCkgU1dBUDY0KCh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgU1dBUDY0KCh4KSkKKyNkZWZpbmUgY3B1MmxlMzIoeCkgU1dBUDMyKCh4KSkKKyNkZWZpbmUgbGUyY3B1MzIoeCkgU1dBUDMyKCh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgU1dBUDE2KCh4KSkKKyNkZWZpbmUgbGUyY3B1MTYoeCkgU1dBUDE2KCh4KSkKKyNkZWZpbmUgY3B1MmJlNjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBiZTJjcHU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGNwdTJiZTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgYmUyY3B1MzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBjcHUyYmUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGJlMmNwdTE2KHgpICgoVUlOVDE2KSh4KSkKKworI2Vsc2UgICAvLyBMaXR0bGVfRW5kaWFuCisKKyNkZWZpbmUgY3B1MmxlNjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBsZTJjcHU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgbGUyY3B1MzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBjcHUybGUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgY3B1MmJlNjQoeCkgU1dBUDY0KCh4KSkKKyNkZWZpbmUgYmUyY3B1NjQoeCkgU1dBUDY0KCh4KSkKKyNkZWZpbmUgY3B1MmJlMzIoeCkgU1dBUDMyKCh4KSkKKyNkZWZpbmUgYmUyY3B1MzIoeCkgU1dBUDMyKCh4KSkKKyNkZWZpbmUgY3B1MmJlMTYoeCkgU1dBUDE2KCh4KSkKKyNkZWZpbmUgYmUyY3B1MTYoeCkgU1dBUDE2KCh4KSkKKworI2VuZGlmICAvLyBSVF9CSUdfRU5ESUFOCisKKyNlbmRpZiAgLy8gX19SVE1QX0RFRl9IX18KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfdHlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ3ZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX3R5cGUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfdHlwZS5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIE5hbWUgICAgICAgIERhdGUgICAgICAgICAgICBNb2RpZmljYXRpb24gbG9ncworICAgIFBhdWwgTGluICAgIDEtMi0yMDA0CisqLworI2lmbmRlZiBfX1JUTVBfVFlQRV9IX18KKyNkZWZpbmUgX19SVE1QX1RZUEVfSF9fCisKKyNkZWZpbmUgUEFDS0VEICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLy8gUHV0IHBsYXRmb3JtIGRlcGVuZGVudCBkZWNsYXJhdGlvbiBoZXJlCisvLyBGb3IgZXhhbXBsZSwgbGludXggdHlwZSBkZWZpbml0aW9uCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCVVJTlQ2NDsKK3R5cGVkZWYgaW50CQkJCQlJTlQzMjsKK3R5cGVkZWYgbG9uZyBsb25nIAkJCUlOVDY0OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKgkJCVBVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgKgkJUFVJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICoJCQlQVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgKglQVUlOVDY0OwordHlwZWRlZiBpbnQJKgkJCQkJUElOVDMyOwordHlwZWRlZiBsb25nIGxvbmcgKiAJCQlQSU5UNjQ7CisKK3R5cGVkZWYgc2lnbmVkIGNoYXIJCQlDSEFSOwordHlwZWRlZiBzaWduZWQgc2hvcnQJCVNIT1JUOwordHlwZWRlZiBzaWduZWQgaW50CQkJSU5UOwordHlwZWRlZiBzaWduZWQgbG9uZwkJCUxPTkc7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcJTE9OR0xPTkc7CisKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVQ0hBUjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVTSE9SVDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UOwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQlVTE9ORzsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCVVMT05HTE9ORzsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlCT09MRUFOOwordHlwZWRlZiB2b2lkCQkJCVZPSUQ7CisKK3R5cGVkZWYgVk9JRCAqCQkJCVBWT0lEOwordHlwZWRlZiBDSEFSICoJCQkJUENIQVI7Cit0eXBlZGVmIFVDSEFSICogCQkJUFVDSEFSOwordHlwZWRlZiBVU0hPUlQgKgkJCVBVU0hPUlQ7Cit0eXBlZGVmIExPTkcgKgkJCQlQTE9ORzsKK3R5cGVkZWYgVUxPTkcgKgkJCQlQVUxPTkc7Cit0eXBlZGVmIFVJTlQgKgkJCQlQVUlOVDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQJTkRJU19NRURJQV9TVEFURTsKKwordHlwZWRlZiB1bmlvbiBfTEFSR0VfSU5URUdFUiB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVCBMb3dQYXJ0OworICAgICAgICBJTlQzMiBIaWdoUGFydDsKKyAgICB9IHU7CisgICAgSU5UNjQgUXVhZFBhcnQ7Cit9IExBUkdFX0lOVEVHRVI7CisKKyNlbmRpZiAgLy8gX19SVE1QX1RZUEVfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGNmYTViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bS5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fU1BFQ1RSVU1fSF9fCisjZGVmaW5lIF9fU1BFQ1RSVU1fSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJzcGVjdHJ1bV9kZWYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9UUENfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUeFB3cjsKKwlVSU5UOCBMaW5rTWFyZ2luOworfSBUUENfUkVQT1JUX0lORk8sICpQVFBDX1JFUE9SVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIX1NXX0FOTl9JTkZPCit7CisJVUlOVDggQ2hTd01vZGU7CisJVUlOVDggQ2hhbm5lbDsKKwlVSU5UOCBDaFN3Q250OworfSBDSF9TV19BTk5fSU5GTywgKlBDSF9TV19BTk5fSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUKK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggUmV2MTo0OworCQlVSU5UOCBSZXBvcnQ6MTsKKwkJVUlOVDggUmVxdWVzdDoxOworCQlVSU5UOCBFbmFibGU6MTsKKwkJVUlOVDggUmV2MDoxOworCX0gZmllbGQ7CisjZWxzZQorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjA6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJldjE6NDsKKwl9IGZpZWxkOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVSU5UOCB3b3JkOworfSBNRUFTVVJFX1JFUV9NT0RFLCAqUE1FQVNVUkVfUkVRX01PREU7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVEKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworfSBNRUFTVVJFX1JFUSwgKlBNRUFTVVJFX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUV9JTkZPCit7CisJVUlOVDggVG9rZW47CisJTUVBU1VSRV9SRVFfTU9ERSBSZXFNb2RlOworCVVJTlQ4IFJlcVR5cGU7CisJTUVBU1VSRV9SRVEgTWVhc3VyZVJlcTsKK30gTUVBU1VSRV9SRVFfSU5GTywgKlBNRUFTVVJFX1JFUV9JTkZPOworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjozOworCQlVSU5UOCBVbm1lYXN1cmU6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5pZGVudGlmaWVkU2lnbmFsOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBCU1M6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBCU1M6MTsKKwkJVUlOVDggT2ZkbVByZWFtYmxlOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBSYWRhcjoxOworCQlVSU5UOCBVbm1lYXN1cmU6MTsKKwkJVUlOVDggUmV2OjM7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQLCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQIE1hcDsKK30gTUVBU1VSRV9CQVNJQ19SRVBPUlQsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9DQ0FfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBDQ0FfQnVzeV9GcmFjdGlvbjsKK30gTUVBU1VSRV9DQ0FfUkVQT1JULCAqUE1FQVNVUkVfQ0NBX1JFUE9SVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JQSV9SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCVVJTlQ4IFJQSV9EZW5zaXR5WzhdOworfSBNRUFTVVJFX1JQSV9SRVBPUlQsICpQTUVBU1VSRV9SUElfUkVQT1JUOworCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfTU9ERQoreworCXN0cnVjdCBQQUNLRUQKKwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlVSU5UOCBSZXY6NTsKKwkJVUlOVDggUmVmdXNlZDoxOworCQlVSU5UOCBJbmNhcGFibGU6MTsKKwkJVUlOVDggTGF0ZToxOworI2Vsc2UKKwkJVUlOVDggTGF0ZToxOworCQlVSU5UOCBJbmNhcGFibGU6MTsKKwkJVUlOVDggUmVmdXNlZDoxOworCQlVSU5UOCBSZXY6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJfSBmaWVsZDsKKwlVSU5UOCB3b3JkOworfSBNRUFTVVJFX1JFUE9SVF9NT0RFLCAqUE1FQVNVUkVfUkVQT1JUX01PREU7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVBPUlRfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKwlVSU5UOCBSZXBvcnRUeXBlOworCVVJTlQ4IE9jdGVjdFswXTsKK30gTUVBU1VSRV9SRVBPUlRfSU5GTywgKlBNRUFTVVJFX1JFUE9SVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1FVSUVUX0lORk8KK3sKKwlVSU5UOCBRdWlldENudDsKKwlVSU5UOCBRdWlldFBlcmlvZDsKKwlVSU5UOCBRdWlldER1cmF0aW9uOworCVVJTlQ4IFF1aWV0T2Zmc2V0OworfSBRVUlFVF9JTkZPLCAqUFFVSUVUX0lORk87CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IE1lYXN1cmVDaCwKKwlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbyk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisJCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVDaFN3QW5uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2gpOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBUcGNSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwUkEsCisJSU4gUFVDSEFSIHBUQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBDaGFubmVsKTsKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bV9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E0ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bV9kZWYuaApAQCAtMCwwICsxLDk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCXNwZWN0cnVtX2RlZi5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaWZuZGVmIF9fU1BFQ1RSVU1fREVGX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0RFRl9IX18KKworI2RlZmluZSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUJCTMKKyNkZWZpbmUgTUFYX0hBU0hfTUVBU1VSRV9SRVFfVEFCX1NJWkUJTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCisKKyNkZWZpbmUgTUFYX1RQQ19SRVFfVEFCX1NJWkUJCQkzCisjZGVmaW5lIE1BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkUJCU1BWF9UUENfUkVRX1RBQl9TSVpFCisKKyNkZWZpbmUgTUlOX1JDVl9QV1IJCQkJMTAwCQkvKiBOZWdhdGl2ZSB2YWx1ZSAoKGRCbSkgKi8KKworI2RlZmluZSBSTV9UUENfUkVRCQkJCTAKKyNkZWZpbmUgUk1fTUVBU1VSRV9SRVEJCQkxCisKKyNkZWZpbmUgUk1fQkFTSUMJCQkJMAorI2RlZmluZSBSTV9DQ0EJCQkJCTEKKyNkZWZpbmUgUk1fUlBJX0hJU1RPR1JBTQkJMgorCisjZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkJLyogbXMgKi8KKyNkZWZpbmUgTVFfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisKKyNkZWZpbmUgVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoX0RpYWxvZ1Rva2VuKQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFKQorI2RlZmluZSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJCSgoX0RpYWxvZ1Rva2VuKSAlIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwordHlwZWRlZiBzdHJ1Y3QgX01FQVNVUkVfUkVRX0VOVFJZCit7CisJc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTglWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlVSU5UOCBNZWFzdXJlRGlhbG9nVG9rZW5bM107CS8vIDA6YmFzaWMgbWVhc3VyZSwgMTogQ0NBIG1lYXN1cmUsIDI6IFJQSV9IaXN0b2dyYW0gbWVhc3VyZS4KK30gTUVBU1VSRV9SRVFfRU5UUlksICpQTUVBU1VSRV9SRVFfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBNRUFTVVJFX1JFUV9FTlRSWSBIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKKwlNRUFTVVJFX1JFUV9FTlRSWSBDb250ZW50W01BWF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Cit9IE1FQVNVUkVfUkVRX1RBQiwgKlBNRUFTVVJFX1JFUV9UQUI7CisKK3R5cGVkZWYgc3RydWN0IF9UUENfUkVRX0VOVFJZCit7CisJc3RydWN0IF9UUENfUkVRX0VOVFJZICpwTmV4dDsKKwlVTE9ORyBsYXN0VGltZTsKKwlCT09MRUFOIFZhbGlkOworCVVJTlQ4IERpYWxvZ1Rva2VuOworfSBUUENfUkVRX0VOVFJZLCAqUFRQQ19SRVFfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9UUENfUkVRX1RBQgoreworCVVDSEFSIFNpemU7CisJUFRQQ19SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFXTsKKwlUUENfUkVRX0VOVFJZIENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOworfSBUUENfUkVRX1RBQiwgKlBUUENfUkVRX1RBQjsKKworI2VuZGlmIC8vIF9fU1BFQ1RSVU1fREVGX0hfXyAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9haXJvbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9haXJvbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNGExOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Fpcm9uZXQuYwpAQCAtMCwwICsxLDEzMTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorCVBhcmFtZXRlcnM6CisJCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JU1RBVEVfTUFDSElORQkJKlMsCisJT1VUCVNUQVRFX01BQ0hJTkVfRlVOQwlUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9BSVJPTkVUX1NUQVRFLCBNQVhfQUlST05FVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUlST05FVF9JRExFLCBBSVJPTkVUX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfSURMRSwgTVQyX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRNc2dBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRSZXF1ZXN0QWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9TQ0FOTklORywgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAoU1RBVEVfTUFDSElORV9GVU5DKUFpcm9uZXRSZXBvcnRBY3Rpb24pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKwkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKwkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCisJCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgorCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgorCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCisJUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0TXNnQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlVU0hPUlQJCQkJCQkJTGVuZ3RoOworCVVDSEFSCQkJCQkJCUluZGV4LCBpOworCVBVQ0hBUgkJCQkJCQlwRGF0YTsKKwlQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCQlwUk1SZXE7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXFFbGVtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tLS0+IEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKKworCS8vIDAuIEdldCBBaXJvbmV0IElBUFAgaGVhZGVyIGZpcnN0CisJcFJNUmVxID0gKFBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisJcERhdGEgID0gKFBVQ0hBUikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKKworCS8vIDEuIENoYW5nZSBlbmRpYW4gZm9ybWF0IGZvcm0gbmV0d29yayB0byBsaXR0bGUgZW5kaWFuCisJTGVuZ3RoID0gYmUyY3B1MTYocFJNUmVxLT5JQVBQLkxlbmd0aCk7CisKKwkvLyAyLjAgU2FuaXR5IGNoZWNrLCB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIENDWCAyLjAgc3VwcG9ydCBpcyBlbmFibGVkCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSAhPSBUUlVFKQorCQlyZXR1cm47CisKKwkvLyAyLjEgUmFkaW8gbWVhc3VyZW1lbnQgbXVzdCBiZSBvbgorCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLlJNRW5hYmxlICE9IDEpCisJCXJldHVybjsKKworCS8vIDIuMi4gRGVidWcgcHJpbnQgYWxsIGJpdCBpbmZvcm1hdGlvbgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgSUQgJiBMZW5ndGggJWRcbiIsIExlbmd0aCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgVHlwZSAleFxuIiwgcFJNUmVxLT5JQVBQLlR5cGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFN1YlR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5TdWJUeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBEaWFsb2cgVG9rZW4gJXhcbiIsIHBSTVJlcS0+SUFQUC5Ub2tlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgQWN0aXZhdGlvbiBEZWxheSAleFxuIiwgcFJNUmVxLT5EZWxheSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgTWVhc3VyZW1lbnQgT2Zmc2V0ICV4XG4iLCBwUk1SZXEtPk9mZnNldCkpOworCisJLy8gMy4gQ2hlY2sgSUFQUCBmcmFtZSB0eXBlLCBpdCBtdXN0IGJlIDB4MzIgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uCisJaWYgKHBSTVJlcS0+SUFQUC5UeXBlICE9IEFJUk9ORVRfSUFQUF9UWVBFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCB0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNC4gQ2hlY2sgSUFQUCBmcmFtZSBzdWJ0eXBlLCBpdCBtdXN0IGJlIDB4MDEgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uIHJlcXVlc3QuCisJLy8gICAgU2luY2Ugd2UgYXJlIGFjdGluZyBhcyBjbGllbnQgb25seSwgd2Ugd2lsbCBkaXNyZWdhcmRzIHJlcGx5IHN1YnR5cGUuCisJaWYgKHBSTVJlcS0+SUFQUC5TdWJUeXBlICE9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUVVFU1QpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIHN1YnR5cGUgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA1LiBWZXJpZnkgRGVzdGluYXRpb24gTUFDIGFuZCBTb3VyY2UgTUFDLCBib3RoIHNob3VsZCBiZSBhbGwgemVyb3MuCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLkRBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgREEgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoISBNQUNfQUREUl9FUVVBTChwUk1SZXEtPklBUFAuU0EsIFpFUk9fTUFDX0FERFIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBTQSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb24sIGl0J3Mgbm90IFplcm9cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDYuIFJlaW5pdCBhbGwgcmVwb3J0IHJlbGF0ZWQgZmllbGRzCisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWYsIDIwNDgpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldCwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfTEVOX09GX0JTU19UQUJMRSk7CisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0LCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pICogNCk7CisKKwkvLyA3LiBQb2ludCB0byB0aGUgc3RhcnQgb2YgZmlyc3QgZWxlbWVudCByZXBvcnQgZWxlbWVudAorCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICAgPSBMRU5HVEhfODAyXzExICsgc2l6ZW9mKEFJUk9ORVRfSUFQUF9IRUFERVIpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZSIGxlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOworCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCAgICAgPSAweGZmOworCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ICAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxICAgICAgPSBGQUxTRTsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbER1cmF0aW9uID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbENoYW5uZWwgID0gMDsKKwlwQWQtPlN0YUNmZy5JQVBQVG9rZW4gICAgICAgID0gcFJNUmVxLT5JQVBQLlRva2VuOworCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCAgPSAwOworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICAgICAgPSAwOworCS8vIFJlc2V0IHRoZSBzdGF0aXN0aWNzCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSA9IDA7CisKKwlJbmRleCA9IDA7CisKKwkvLyA4LiBTYXZlIGRpYWxvZyB0b2tlbiBmb3IgcmVwb3J0CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuID0gcFJNUmVxLT5JQVBQLlRva2VuOworCisJLy8gU2F2ZSBBY3RpdmF0aW9uIGRlbGF5ICYgbWVhc3VyZW1lbnQgb2Zmc2V0LCBOb3QgcmVhbGx5IG5lZWRlZAorCisJLy8gOS4gUG9pbnQgdG8gdGhlIGZpcnN0IHJlcXVlc3QgZWxlbWVudAorCXBEYXRhICs9IHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpOworCS8vICAgIExlbmd0aCBzaG91bGQgZXhjbHVkZSB0aGUgQ0lTQ08gQWlyb25ldCBTTkFQIGhlYWRlcgorCUxlbmd0aCAtPSAoc2l6ZW9mKEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSkgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAxMC4gU3RhcnQgUGFyc2luZyB0aGUgTWVhc3VyZW1lbnQgZWxlbWVudHMuCisJLy8gICAgQmUgY2FyZWZ1bCBhYm91dCBtdWx0aXBsZSBNUiBlbGVtZW50cyB3aXRoaW4gb25lIGZyYW1lcy4KKwl3aGlsZSAoTGVuZ3RoID4gMCkKKwl7CisJCXBSZXFFbGVtID0gKFBSTV9SRVFVRVNUX0FDVElPTikgcERhdGE7CisJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uRWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUVVFU1Q6CisJCQkJLy8gRnJvbSB0aGUgZXhhbXBsZSwgaXQgc2VlbXMgd2Ugb25seSBuZWVkIHRvIHN1cHBvcnQgb25lIHJlcXVlc3QgaW4gb25lIGZyYW1lCisJCQkJLy8gVGhlcmUgaXMgbm8gbXVsdGlwbGUgcmVxdWVzdCBpbiBvbmUgZnJhbWUuCisJCQkJLy8gQmVzaWRlcywgbG9va3MgbGlrZSB3ZSBuZWVkIHRvIHRha2UgY2FyZSB0aGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBvbmx5LgorCQkJCS8vIFRoZSBtZWFzdXJlbWVudCByZXF1ZXN0IGlzIGFsd2F5cyA0IGJ5dGVzLgorCisJCQkJLy8gU3RhcnQgcGFyc2luZyB0aGlzIHR5cGUgb2YgcmVxdWVzdC4KKwkJCQkvLyAwLiBFaWQgaXMgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVAorCQkJCS8vIDEuIExlbmd0aCBkaWRuJ3QgaW5jbHVkZSBFaWQgYW5kIExlbmd0aCBmaWVsZCwgaXQgYWx3YXlzIGJlIDguCisJCQkJLy8gMi4gTWVhc3VyZW1lbnQgVG9rZW4sIHdlIG5uZWQgdG8gc2F2ZSBpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcmVwb3J0LgorCQkJCS8vIDMuIE1lYXN1cmVtZW50IE1vZGUsIEFsdGhvdWdoIHRoZXJlIGFyZSBkZWZpbml0aW9ucywgYnV0IHdlIGRpbid0IHNlZSB2YWx1ZSBvdGhlciB0aGFuCisJCQkJLy8gICAgMCBmcm9tIHRlc3Qgc3BlY3MgZXhhbXBsZXMuCisJCQkJLy8gNC4gTWVhc3VyZW1lbnQgVHlwZSwgdGhpcyBpcyB3aGF0IHdlIG5lZWQgdG8gZG8uCisJCQkJc3dpdGNoIChwUmVxRWxlbS0+UmVxRWxlbS5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUToKKwkJCQkJY2FzZSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX0JFQUNPTl9SRVE6CisJCQkJCQkvLyBDaGVjayB0aGUgRW5hYmxlIG5vbi1zZXJ2aW5nIGNoYW5uZWwgbWVhc3VyZW1lbnQgY29udHJvbAorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRENSTUVuYWJsZSA9PSAwKQorCQkJCQkJeworCQkJCQkJCS8vIENoZWNrIGNoYW5uZWwgYmVmb3JlIGVucXVldWUgdGhlIGFjdGlvbgorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvLyBJZiBvZmYgY2hhbm5lbCBtZWFzdXJlbWVudCwgY2hlY2sgdGhlIFRVIGR1cmF0aW9uIGxpbWl0CisJCQkJCQkJaWYgKHBSZXFFbGVtLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuRHVyYXRpb24gPiBwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLlR1TGltaXQpCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gU2F2ZSByZXF1ZXN0cyBhbmQgZXhlY3V0ZSBhY3Rpb25zIGxhdGVyCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XSwgcFJlcUVsZW0sIHNpemVvZihSTV9SRVFVRVNUX0FDVElPTikpOworCQkJCQkJSW5kZXggKz0gMTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTVNSTl9UWVBFX0ZSQU1FX1JFUToKKwkJCQkJCS8vIFNpbmNlIGl0J3Mgb3B0aW9uLCB3ZSB3aWxsIHN1cHBvcnQgbGF0ZXIKKwkJCQkJCS8vIEZyYW1lUmVxdWVzdEFjdGlvbihwQWQsIHBEYXRhKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBQb2ludCB0byBuZXh0IE1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCQlwRGF0YSAgKz0gc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKTsKKwkJCQlMZW5ndGggLT0gc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKTsKKwkJCQlicmVhazsKKworCQkJLy8gV2UgYWNjZXB0IHJlcXVlc3Qgb25seSwgYWxsIG90aGVycyBhcmUgZHJvcHBlZAorCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ6CisJCQljYXNlIElFX0FQX1RYX1BPV0VSOgorCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZOgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvLyAxMS4gVXBkYXRlIHNvbWUgZmxhZ3MgYW5kIGluZGV4CisJcEFkLT5TdGFDZmcuUk1SZXFDbnQgPSBJbmRleDsKKworCWlmIChJbmRleCkKKwl7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgMCwgTlVMTCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gQWlyb25ldE1zZ0FjdGlvblxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldFJlcXVlc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCisJLy8gMS4gUG9pbnQgdG8gbmV4dCByZXF1ZXN0IGVsZW1lbnQKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJLy8gMi4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCisJCS8vIE5vaXNlIEhpc3RvZ3JhbSBtZWFzdXJlbWVudCByZXF1ZXN0CisJCU5vaXNlSGlzdFJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJLy8gQmVhY29uIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQmVhY29uUmVxdWVzdEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4sIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQlyZXR1cm47CisKKwkvLyAzLiBQZWVrIGludG8gdGhlIG5leHQgcmVxdWVzdCwgaWYgaXQncyBwYXJhbGxlbCwgd2Ugd2lsbCB1cGRhdGUgdGhlIHNjYW4gdGltZSB0byB0aGUgbGFyZ2VzdCBvbmUKKwlpZiAoKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCArIDEpIDwgcEFkLT5TdGFDZmcuUk1SZXFDbnQpCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxXTsKKwkJLy8gQ2hlY2sgZm9yIHBhcmFsbGVsIGJpdAorCQlpZiAoKHBSZXEtPlJlcUVsZW0uTW9kZSAmIDB4MDEpICYmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJLy8gVXBkYXRlIHBhcmFsbGVsIG1vZGUgcmVxdWVzdCBpbmZvcm1hdGlvbgorCQkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgPSAoKHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpID8KKwkJCShwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbikgOiAocEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUpKTsKKwkJfQorCX0KKworCS8vIDQuIENhbGwgUlQyOFhYX01MTUVfSEFORExFUiB0byBleGVjdXRlIHRoZSByZXF1ZXN0IG1sbWUgY29tbWFuZHMsIFNjYW4gcmVxdWVzdCBpcyB0aGUgb25seSBvbmUgdXNlZAorCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIGNoYW5uZWwgbG9hZCByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JCQkJcFJlcTsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisJVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpOworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKworCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwlwQWQtPlN0YUNmZy5TY2FuQ250ICAgICAgICA9IDA7CisJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCwgQ2hhbm5lbCAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uLCBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsKSk7CisKKwkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuOworCisJCXBOdWxsRnJhbWUgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7OworCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCisJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJcE51bGxGcmFtZS0+RkMuVHlwZSAJPSBCVFlQRV9EQVRBOworCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210CT0gUFdSX1NBVkU7CisKKwkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQorCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAgICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICA9IDA7CisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIG5vaXNlIGhpc3RvZ3JhbSByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXSwgaTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKKwlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOworCisJLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKKwkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgorCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KKwkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCisJLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCisJLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCisJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKworCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQlyZXR1cm47CisKKwkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX05PSVNFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkvLyBNYWtlIHRoZSBwb3dlciBzYXZlIE51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uCisJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJcE51bGxGcmFtZS0+RkMuVHlwZSAgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCS8vIFJlc2V0IHRoZSBzdGF0aXN0aWNzCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSA9IDA7CisKKwkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIDB4MTAxMCk7CisKKwkvLyBTZXQgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcmVwYXJlIEJlYWNvbiByZXBvcnQgYWN0aW9uLCBzcGVjaWFsIHNjYW4gb3BlcmF0aW9uIGFkZGVkCisJCXRvIHN1cHBvcnQKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCVN0YXJ0IGZyb20gZWxlbWVudCBJRAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlCZWFjb25SZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisJVUNIQVIJCQkJCQkJWmVyb1NzaWRbMzJdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XTsKKwlOZGlzWmVyb01lbW9yeShaZXJvU3NpZCwgMzIpOworCisJLy8gUHJlcGFyZSBmb3Igc3BlY2lhbCBzY2FuIHJlcXVlc3QKKwkvLyBUaGUgc2NhbiBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB3aXRoIG91ciBBY3RpdmUsIFBhc3NpdmUgc2NhbiBkZWZpbml0aW9uLgorCS8vIEZvciBDQ1gyLCBBY3RpdmUgbWVhbnMgc2VuZCBvdXQgcHJvYmUgcmVxdWVzdCB3aXRoIGJyb2FkY2FzdCBCU1NJRC4KKwkvLyBQYXNzaXZlIG1lYW5zIG5vIHByb2JlIHJlcXVlc3Qgc2VudCwgb25seSBsaXN0ZW4gdG8gdGhlIGJlYWNvbnMuCisJLy8gVGhlIGNoYW5uZWwgc2Nhbm5lZCBpcyBmaXhlZCBhcyBzcGVjaWZpZWQsIG5vIG5lZWQgdG8gc2NhbiBhbGwgY2hhbm5lbHMuCisJLy8gVGhlIHNjYW4gd2FpdCB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB0b28uCisJaWYgKHBSZXEtPk1lYXN1cmVtZW50LlNjYW5Nb2RlID09IE1TUk5fU0NBTl9NT0RFX1BBU1NJVkUpCisJeworCQkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXNzaXZlIFNjYW4gTW9kZSFcbiIpKTsKKworCQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCQlyZXR1cm47CisKKwkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fUEFTU0lWRSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pKTsKKworCQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJCXBOdWxsRnJhbWUtPkZDLlR5cGUgICAgID0gQlRZUEVfREFUQTsKKwkJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQgID0gUFdSX1NBVkU7CisKKwkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCX0KKwllbHNlIGlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9BQ1RJVkUpCisJeworCQkvLyBBY3RpdmUgc2NhbiBNb2RlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFjdGl2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX0FDVElWRSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJCUJzc1RhYmxlSW5pdCgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiKTsKKwkJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lICAgID0gcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pKTsKKworCQkvLyBJZiBpdCdzIG5vbiBzZXJ2aW5nIGNoYW5uZWwgc2Nhbiwgc2VuZCBvdXQgYSBudWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbi4KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBOdWxsRnJhbWUsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcE51bGxGcmFtZS0+RHVyYXRpb24gCT0gMDsKKwkJCXBOdWxsRnJhbWUtPkZDLlR5cGUgICAgID0gQlRZUEVfREFUQTsKKwkJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQgID0gUFdSX1NBVkU7CisKKwkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCX0KKwllbHNlIGlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUpCisJeworCQkvLyBCZWFjb24gcmVwb3J0IE1vZGUsIHJlcG9ydCBhbGwgdGhlIEFQUyBpbiBjdXJyZW50IGJzcyB0YWJsZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb24gUmVwb3J0IE1vZGUhXG4iKSk7CisKKwkJLy8gQ29weSBjdXJyZW50IEJTUyB0YWJsZSB0byBDQ1ggdGFibGUsIHdlIGNhbiBvbWl0IHRoaXMgc3RlcCBsYXRlciBvbi4KKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYiwgJnBBZC0+U2NhblRhYiwgc2l6ZW9mKEJTU19UQUJMRSkpOworCisJCS8vIENyZWF0ZSBiZWFjb24gcmVwb3J0IGZyb20gQnNzIHRhYmxlCisJCUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUocEFkKTsKKworCQkvLyBTZXQgc3RhdGUgdG8gc2Nhbm5pbmcKKwkJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwkJLy8gRW5xdWV1ZSByZXBvcnQgcmVxdWVzdAorCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gV3Jvbmcgc2NhbiBNb2RlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyb25nIFNjYW4gTW9kZSFcbiIpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCXBSZXE7CisJVUxPTkcJCQkJTm93MzI7CisKKyAgICBOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzMyOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAxLiBQYXJzZSBtZWFzdXJlbWVudCB0eXBlIGFuZCBjYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9ucworCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJLy8gQmVhY29uIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQmVhY29uUmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlCisJCS8vIFVua25vd24uIERvIG5vdGhpbmcgYW5kIHJldHVybgorCQk7CisKKwkvLyAyLiBQb2ludCB0byB0aGUgY29ycmVjdCBpbmRleCBvZiBhY3Rpb24gZWxlbWVudCwgc3RhcnQgZnJvbSAwCisJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisKKwkvLyAzLiBDaGVjayBmb3IgcGFyYWxsZWwgYWN0aW9ucworCWlmIChwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9PSBUUlVFKQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCQkvLyBQcm9jZXNzIG5leHQgYWN0aW9uIHJpZ2h0IGF3YXkKKwkJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJCS8vIENoYW5uZWwgTG9hZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJCWVsc2UgaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEpCisJCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKworCQlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgrKzsKKwl9CisKKwlpZiAocEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ID49IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJLy8gNC4gVGhlcmUgaXMgbm8gbW9yZSB1bnByb2Nlc3NlZCBtZWFzdXJlbWVudCByZXF1ZXN0LCBnbyBmb3IgdHJhbnNtaXQgdGhpcyByZXBvcnQKKwkJQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKHBBZCk7CisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisJfQorCWVsc2UKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJaWYgKHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJeworCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQl9CisKKwkJLy8gNS4gVGhlcmUgYXJlIG1vcmUgcmVxdWVzdHMgdG8gYmUgbWVhc3VyZQorCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVUNIQVIJCQkJCXBEZXN0OworCVBBSVJPTkVUX0lBUFBfSEVBREVSCXBJQVBQOworCVBIRUFERVJfODAyXzExCQkJcEhlYWRlcjsKKwlVQ0hBUgkJCQkJQWNrUmF0ZSA9IFJBVEVfMjsKKwlVU0hPUlQJCQkJCUFja0R1cmF0aW9uID0gMDsKKwlORElTX1NUQVRVUwkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcJCQkJCUZyYW1lTGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIDAuIFNldCB1cCB0aGUgZnJhbWUgcG9pbnRlciwgRnJhbWUgd2FzIGluaXRlZCBhdCB0aGUgZW5kIG9mIG1lc3NhZ2UgYWN0aW9uCisJcERlc3QgPSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBVcGRhdGUgcmVwb3J0IElBUFAgZmllbGRzCisJcElBUFAgPSAoUEFJUk9ORVRfSUFQUF9IRUFERVIpIHBEZXN0OworCisJLy8gMi4gQ29weSBDaXNjbyBTTkFQIGhlYWRlcgorCU5kaXNNb3ZlTWVtb3J5KHBJQVBQLT5DaXNjb1NuYXBIZWFkZXIsIFNOQVBfQUlST05FVCwgTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMy4gbmV0d29yayBvcmRlciBmb3IgdGhpcyAxNmJpdCBsZW5ndGgKKwlwSUFQUC0+TGVuZ3RoICA9IGNwdTJiZTE2KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuMSBzYW5pdHkgY2hlY2sgdGhlIHJlcG9ydCBsZW5ndGgsIGlnbm9yZSBpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydAorCWlmIChiZTJjcHUxNihwSUFQUC0+TGVuZ3RoKSA8PSAxOCkKKwkJcmV0dXJuOworCisJLy8gNC4gVHlwZSBtdXN0IGJlIDB4MzIKKwlwSUFQUC0+VHlwZSAgICA9IEFJUk9ORVRfSUFQUF9UWVBFOworCisJLy8gNS4gU3ViVHlwZSBmb3IgcmVwb3J0IG11c3QgYmUgMHg4MQorCXBJQVBQLT5TdWJUeXBlID0gQUlST05FVF9JQVBQX1NVQlRZUEVfUkVQT1JUOworCisJLy8gNi4gREEgaXMgbm90IHVzZWQgYW5kIG11c3QgYmUgemVybywgYWx0aG91Z2ggdGhlIHdob2xlIGZyYW1lIHdhcyBjbGVhcmVkIGF0IHRoZSBzdGFydCBvZiBmdW5jdGlvbgorCS8vICAgIFdlIHdpbGwgZG8gaXQgYWdhaW4gaGVyZS4gV2UgY2FuIHVzZSBCU1NJRCBpbnN0ZWFkCisJQ09QWV9NQUNfQUREUihwSUFQUC0+REEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIDcuIFNBIGlzIHRoZSBjbGllbnQgcmVwb3J0aW5nIHdoaWNoIG11c3QgYmUgb3VyIE1BQworCUNPUFlfTUFDX0FERFIocElBUFAtPlNBLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCS8vIDguIENvcHkgdGhlIHNhdmVkIGRpYWxvZyB0b2tlbgorCXBJQVBQLT5Ub2tlbiA9IHBBZC0+U3RhQ2ZnLklBUFBUb2tlbjsKKworCS8vIDkuIE1ha2UgdGhlIFJlcG9ydCBmcmFtZSA4MDIuMTEgaGVhZGVyCisJLy8gICAgUmV1c2UgZnVuY3Rpb24gaW4gd3BhLmMKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZjsKKwlwQWQtPlNlcXVlbmNlICsrOworCVdwYU1hY0hlYWRlckluaXQocEFkLCBwSGVhZGVyLCAwLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBBQ0sgc2l6ZQlpcyAxNCBpbmNsdWRlIENSQywgYW5kIGl0cyByYXRlCWlzIGJhc2VkIG9uIHJlYWwgdGltZSBpbmZvcm1hdGlvbgorCUFja1JhdGUgICAgID0gcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBBY2tSYXRlLCAxNCk7CisJcEhlYWRlci0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIEFja0R1cmF0aW9uOworCisJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKKworCS8vIDEwLiBQcmVwYXJlIHJlcG9ydCBmcmFtZSB3aXRoIGR5bmFtaWMgb3V0YnVmZmVyLiBKdXN0IHNpbXBseSBjb3B5IGV2ZXJ5dGhpbmcuCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWYsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gMTEuIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBDSEFOTkVMX0xPQURfUkVQT1JUCQlwTG9hZDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCUNDQUJ1c3lGcmFjdGlvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKworCS8vIDAuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCisJLy8gMS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZWxlbWVudCBmaWVsZC4KKwlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJLy8gRml4ZWQgTGVuZ3RoIGF0IDksIG5vdCBpbmNsdWRlIEVpZCBhbmQgbGVuZ3RoIGZpZWxkcworCXBSZXBvcnQtPkxlbmd0aCA9IDk7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVROworCisJLy8gMi4gRmlsbCBjaGFubmVsIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTG9hZCAgPSAoUENIQU5ORUxfTE9BRF9SRVBPUlQpIHBEZXN0OworCXBMb2FkLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTG9hZC0+U3BhcmUgICAgPSAwOworCXBMb2FkLT5EdXJhdGlvbiA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuRHVyYXRpb247CisKKwkvLyAzLiBDYWxjdWxhdGUgdGhlIENDQSBCdXN5IEZyYWN0aW9uCisJLy8gICAgKEJ5dGVzICsgQUNLIHNpemUpICogOCAvIFR4IHNwZWVkICogMjU1IC8gMTAwMCAvIG1lYXN1cmVtZW50IGR1cmF0aW9uLCB1c2UgMjQgdXMgVHggc3BlZWQKKwkvLyAgICAgPSAgKEJ5dGVzICsgQUNLKSAvIDEyIC8gZHVyYXRpb24KKwkvLyAgICAgOSBpcyB0aGUgZ29vZCB2YWx1ZSBmb3IgcEFkLT5TdGFDZmcuQ0xGYWN0b3IKKwkvLyBDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDkgLyBwTG9hZC0+RHVyYXRpb24pOworCUNDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gcEFkLT5TdGFDZmcuQ0xGYWN0b3IgLyBwTG9hZC0+RHVyYXRpb24pOworCWlmIChDQ0FCdXN5RnJhY3Rpb24gPCAxMCkKKwkJCUNDQUJ1c3lGcmFjdGlvbiA9IChVQ0hBUikgKHBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzIC8gMyAvIHBMb2FkLT5EdXJhdGlvbikgKyAxOworCisJcExvYWQtPkNDQUJ1c3kgPSBDQ0FCdXN5RnJhY3Rpb247CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ0xCdXN5Qnl0ZSAlbGQsIER1cmF0aW9uICVkLCBSZXN1bHQsICVkXG4iLCBwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcywgcExvYWQtPkR1cmF0aW9uLCBDQ0FCdXN5RnJhY3Rpb24pKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuICVkXG4iLCBwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbikpOworCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IChzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpICsgc2l6ZW9mKENIQU5ORUxfTE9BRF9SRVBPUlQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKworCS8vIDQuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA1LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxMb2FkUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7CisJUE5PSVNFX0hJU1RfUkVQT1JUCQkJcE5vaXNlOworCVBVQ0hBUgkJCQkJCXBEZXN0OworCVVDSEFSCQkJCQkJaSxOb2lzZUNudDsKKwlVU0hPUlQJCQkJCQlUb3RhbFJQSUNudCwgVG90YWxSUElTdW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBEaXNhYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uLCBtYWtlIGl0IGJhY2sgdG8gbm9ybWFsCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAvLyBTdGFpb24gbm90IGRyb3AgY29udHJvbCBmcmFtZSB3aWxsIGZhaWwgV2lGaSBDZXJ0aWZpY2F0aW9uLgorCS8vIDEuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCisJLy8gMi4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZWxlbWVudCBmaWVsZC4KKwlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJLy8gRml4ZWQgTGVuZ3RoIGF0IDE2LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSAxNjsKKwlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLk1vZGU7CisJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROworCisJLy8gMy4gRmlsbCBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IG1lYXN1cmVtZW50IGRhdGEKKwlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCXBOb2lzZSAgPSAoUE5PSVNFX0hJU1RfUkVQT1JUKSBwRGVzdDsKKwlwTm9pc2UtPkNoYW5uZWwgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5DaGFubmVsOworCXBOb2lzZS0+U3BhcmUgICAgPSAwOworCXBOb2lzZS0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCS8vIDQuIEZpbGwgTm9pc2UgaGlzdG9ncmFtLCB0aGUgdG90YWwgUlBJIGNvdW50cyBzaG91bGQgYmUgMC40ICogVFUKKwkvLyAgICBXZSBlc3RpbWF0ZSA0MDAwIG5vcm1hbCBwYWNrZXRzIHJlY2VpdmVkIGR1cm5pbmcgMTAgc2Vjb25kcyB0ZXN0LgorCS8vICAgIEFkanVzdCBpdCBpZiByZXF1aXJlZC4KKwkvLyAzIGlzIGEgZ29vZCB2YWx1ZSBmb3IgcEFkLT5TdGFDZmcuTkhGYWN0b3IKKwkvLyBUb3RhbFJQSUNudCA9IHBOb2lzZS0+RHVyYXRpb24gKiAzIC8gMTA7CisJVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogcEFkLT5TdGFDZmcuTkhGYWN0b3IgLyAxMDsKKwlUb3RhbFJQSVN1bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJVG90YWxSUElTdW0gKz0gcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlBJICVkIENvbnV0cyAlZFxuIiwgaSwgcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSkpOworCX0KKworCS8vIERvdWJsZSBjaGVjayBpZiB0aGUgY291bnRlciBpcyBsYXJnZXIgdGhhbiBvdXIgZXhwZWN0YXRpb24uCisJLy8gV2Ugd2lsbCByZXBsYWNlIGl0IHdpdGggdGhlIHRvdGFsIG51bWJlciBwbHVzIGEgZnJhY3Rpb24uCisJaWYgKFRvdGFsUlBJU3VtID4gVG90YWxSUElDbnQpCisJCVRvdGFsUlBJQ250ID0gVG90YWxSUElTdW0gKyBwTm9pc2UtPkR1cmF0aW9uIC8gMjA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUb3RhbCBSUEkgQ29udXRzICVkXG4iLCBUb3RhbFJQSUNudCkpOworCisJLy8gNS4gSW5pdGlhbGl6ZSBub2lzZSBjb3VudCBmb3IgdGhlIHRvdGFsIHN1bW1hdGlvbiBvZiAweGZmCisJTm9pc2VDbnQgPSAwOworCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisJeworCQlwTm9pc2UtPkRlbnNpdHlbaV0gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5SUElEZW5zaXR5W2ldICogMjU1IC8gVG90YWxSUElDbnQpOworCQlpZiAoKHBOb2lzZS0+RGVuc2l0eVtpXSA9PSAwKSAmJiAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAhPSAwKSkKKwkJCXBOb2lzZS0+RGVuc2l0eVtpXSsrOworCQlOb2lzZUNudCArPSBwTm9pc2UtPkRlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVslZF0gID0gMHglMDJ4XG4iLCBpLCBwTm9pc2UtPkRlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyA2LiBSUElbMF0gcmVwcmVzZW50cyB0aGUgcmVzdCBvZiBjb3VudHMKKwlwTm9pc2UtPkRlbnNpdHlbMF0gPSAweGZmIC0gTm9pc2VDbnQ7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVwb3J0ZWQgUlBJWzBdICA9IDB4JTAyeFxuIiwgcE5vaXNlLT5EZW5zaXR5WzBdKSk7CisKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihOT0lTRV9ISVNUX1JFUE9SVCkpOworCisJLy8gNy4gQ2xlYXIgY2hhbm5lbCBsb2FkIG1lYXN1cmVtZW50IGZsYWcKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCS8vIDguIHJlc2V0IHRvIGlkbGUgc3RhdGUKKwlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVwb3J0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gTG9va3MgbGlrZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRoaW5nIG5lZWQgdG8gZG8gaGVyZS4KKwkvLyBBbGwgbWVhc3VyZW1lbnQgcmVwb3J0IGFscmVhZHkgZmluaXNoZWQgaW4gQWRkQmVhY29uUmVwb3J0CisJLy8gVGhlIGxlbmd0aCBpcyBpbiB0aGUgRnJhbWVSZXBvcnRMZW4KKworCS8vIHJlc2V0IEJlYWNvbiBpbmRleCBmb3IgbmV4dCBiZWFjb24gcmVxdWVzdAorCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCA9IDB4ZmY7CisKKwkvLyByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisJCUluZGV4CQlDdXJyZW50IEJTU0lEIGluIENDWEJzc3RhYiBlbnRyeSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUxPTkcJCQkJSW5kZXgsCisJSU4JUE1MTUVfUVVFVUVfRUxFTQlwRWxlbSkKK3sKKwlQVk9JRAkJCQkJCXBNc2c7CisJUFVDSEFSCQkJCQkJcFNyYywgcERlc3Q7CisJVUNIQVIJCQkJCQlSZXFJZHg7CisJVUxPTkcJCQkJCQlNc2dMZW47CisJVVNIT1JUCQkJCQkJTGVuZ3RoOworCVBGUkFNRV84MDJfMTEJCQkJcEZyYW1lOworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBFSURfU1RSVUNUCQkJICAgICAgICBwRWlkOworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJUEJTU19FTlRSWQkJCQkJcEJzczsKKworCS8vIDAuIFNldHVwIHBvaW50ZXIgZm9yIHByb2Nlc3NpbmcgYmVhY29uICYgcHJvYmUgcmVzcG9uc2UKKwlwTXNnICAgPSBwRWxlbS0+TXNnOworCU1zZ0xlbiA9IHBFbGVtLT5Nc2dMZW47CisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpIHBNc2c7CisJcFNyYyAgID0gcEZyYW1lLT5PY3RldDsJCQkJLy8gU3RhcnQgZnJvbSBBUCBUU0YKKwlwQnNzICAgPSAoUEJTU19FTlRSWSkgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJbmRleF07CisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJLy8gMSBDaGVjayB0aGUgSW5kZXgsIGlmIHdlIGFscmVhZHkgY3JlYXRlIHRoaXMgZW50cnksIG9ubHkgdXBkYXRlIHRoZSBhdmVyYWdlIFJTU0kKKwlpZiAoKEluZGV4IDw9IHBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCkgJiYgKHBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCAhPSAweGZmKSkKKwl7CisJCXBEZXN0ICA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdXTsKKwkJLy8gUG9pbnQgdG8gYnNzIHJlcG9ydCBpbmZvcm1hdGlvbgorCQlwRGVzdCArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKworCQkvLyBVcGRhdGUgUnggcG93ZXIsIGluIGRCbQorCQkvLyBHZXQgdGhlIG9yaWdpbmFsIFJTU0kgcmVhZGJhY2sgZnJvbSBCQlAKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciArPSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQkvLyBBdmVyYWdlIHRoZSBSc3NpIHJlYWRpbmcKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgPSAocEJlYWNvblJlcG9ydC0+UnhQb3dlciArIHBCc3MtPlJzc2kpIC8gMjsKKwkJLy8gR2V0IHRvIGRCbSBmb3JtYXQKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtPSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJzc2lkICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIsCisJCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQkJcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeFBvd2VyWyVsZF0gUnNzaSAlZCwgQXZnIFJzc2kgJWRcbiIsIEluZGV4LCAocEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpLCBwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC0gMjU2KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkJzc1JlcG9ydE9mZnNldFtJbmRleF0pKTsKKworCQkvLyBVcGRhdGUgb3RoZXIgaW5mb3JtYXRpb24gaGVyZQorCisJCS8vIERvbmUKKwkJcmV0dXJuOworCX0KKworCS8vIDIuIFVwZGF0ZSByZXBvcnRlZCBJbmRleAorCXBBZC0+U3RhQ2ZnLkxhc3RCc3NJbmRleCA9IEluZGV4OworCisJLy8gMy4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkvLyAgICBUaGUgb2Zmc2V0IHNob3VsZCBzdGFydCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCByZXBvcnQgZnJhbWUgaGVhZGVyLgorCXBEZXN0ID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKworCS8vIDQuIFNhdmUgdGhlIHN0YXJ0IG9mZnNldCBvZiBlYWNoIEJzcyBpbiByZXBvcnQgZnJhbWUKKwlwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdID0gcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW47CisKKwkvLyA1LiBGaWxsIE1lYXN1cmVtZW50IHJlcG9ydCBmaWVsZHMKKwlwUmVwb3J0ID0gKFBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgcERlc3Q7CisJcFJlcG9ydC0+RWlkID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCXBSZXBvcnQtPkxlbmd0aCA9IDA7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJTGVuZ3RoICAgICAgICAgID0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJLy8gNi4gU3RhcnQgdGhlYmVhY29uIHJlcG9ydCBmb3JtYXQKKwlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwlwRGVzdCAgICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCUxlbmd0aCAgICAgICArPSBzaXplb2YoQkVBQ09OX1JFUE9SVCk7CisKKwkvLyA3LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJcEJlYWNvblJlcG9ydC0+Q2hhbm5lbCAgICAgICAgPSBwQnNzLT5DaGFubmVsOworCXBCZWFjb25SZXBvcnQtPlNwYXJlICAgICAgICAgID0gMDsKKwlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCXBCZWFjb25SZXBvcnQtPlBoeVR5cGUgICAgICAgID0gKChwQnNzLT5TdXBSYXRlTGVuK3BCc3MtPkV4dFJhdGVMZW4gPiA0KSA/IFBIWV9FUlAgOiBQSFlfRFNTKTsKKwkvLyA4LiBSeCBwb3dlciwgaW4gZEJtCisJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgICAgICAgPSBwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJzc2lkICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICIsCisJCXBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sCisJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSeFBvd2VyWyVsZF0sIFJzc2kgJWRcbiIsIEluZGV4LCBwQmVhY29uUmVwb3J0LT5SeFBvd2VyIC0gMjU2KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKworCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCUNPUFlfTUFDX0FERFIocEJlYWNvblJlcG9ydC0+QlNTSUQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5QYXJlbnRUU0YsIHBTcmMsIDQpOworCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgJnBFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGWzRdLCAmcEVsZW0tPlRpbWVTdGFtcC51LkhpZ2hQYXJ0LCA0KTsKKworCS8vIDkuIFNraXAgdGhlIGJlYWNvbiBmcmFtZSBhbmQgb2Zmc2V0IHRvIHN0YXJ0IG9mIGNhcGFiaWxpdHlpbmZvIHNpbmNlIHdlIGFscmVhZHkgcHJvY2Vzc2VkIGNhcGFiaWxpdHlpbmZvCisJcFNyYyArPSAoVElNRVNUQU1QX0xFTiArIDIpOworCXBCZWFjb25SZXBvcnQtPkNhcGFiaWxpdHlJbmZvID0gKihVU0hPUlQgKilwU3JjOworCisJLy8gMTAuIFBvaW50IHRvIHN0YXJ0IG9mIGVsZW1lbnQgSUQKKwlwU3JjICs9IDI7CisJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFNyYzsKKworCS8vIDExLiBTdGFydCBwcm9jZXNzIGFsbCB2YXJpYWJsZSBFaWQgb2F5bG9hZCBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZSB0byB0aGUgZnJhbWUgcmVwb3J0CisJd2hpbGUgKCgoUFVDSEFSKSBwRWlkICsgcEVpZC0+TGVuICsgMSkgPCAoKFBVQ0hBUikgcEZyYW1lICsgTXNnTGVuKSkKKwl7CisJCS8vIE9ubHkgbGltaXRlZCBFSUQgYXJlIHJlcXVpcmVkIHRvIHJlcG9ydCBmb3IgQ0NYIDIuIEl0IGluY2x1ZGVzIFNTSUQsIFN1cHBvcnRlZCByYXRlLAorCQkvLyBGSCBwYXJhbWVudGVyIHNldCwgRFMgcGFyYW1ldGVyIHNldCwgQ0YgcGFyYW1ldGVyIHNldCwgSUJTUyBwYXJhbWV0ZXIgc2V0LAorCQkvLyBUSU0gKHJlcG9ydCBmaXJzdCA0IGJ5dGVzIG9ubHksIHJhZGlvIG1lYXN1cmVtZW50IGNhcGFiaWxpdHkKKwkJc3dpdGNoIChwRWlkLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1NJRDoKKwkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKwkJCWNhc2UgSUVfRkhfUEFSTToKKwkJCWNhc2UgSUVfRFNfUEFSTToKKwkJCWNhc2UgSUVfQ0ZfUEFSTToKKwkJCWNhc2UgSUVfSUJTU19QQVJNOgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCQkvLyBTaW5jZSB0aGlzIElFIGlzIGR1cGxpY2F0ZWQgd2l0aCBXUEEgc2VjdXJpdHkgSUUsIHdlIGhhcyB0byBkbyBzYW5pdHkgY2hlY2sgYmVmb3JlCisJCQkJLy8gcmVjb2duaXplIGl0LgorCQkJCS8vIDEuIEl0IGFsc28gaGFzIGZpeGVkIDYgYnl0ZXMgSUUgbGVuZ3RoLgorCQkJCWlmIChwRWlkLT5MZW4gIT0gNikKKwkJCQkJYnJlYWs7CisJCQkJLy8gMi4gQ2hlY2sgdGhlIENpc2NvIEFpcm9uZXQgT1VJCisJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShDSVNDT19PVUksIChwU3JjICsgMiksIDMpKQorCQkJCXsKKwkJCQkJLy8gTWF0Y2hlZCwgdGhpcyBpcyB3aGF0IHdlIHdhbnQKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9USU06CisJCQkJaWYgKHBFaWQtPkxlbiA+IDQpCisJCQkJeworCQkJCQkvLyBNYXkgdHJ1bmNhdGUgYW5kIHJlcG9ydCB0aGUgZmlyc3QgNCBieXRlcyBvbmx5LCB3aXRoIHRoZSBlaWQgJiBsZW4sIHRvdGFsIHNob3VsZCBiZSA2CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCA2KTsKKwkJCQkJcERlc3QgICs9IDY7CisJCQkJCUxlbmd0aCArPSA2OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCXBEZXN0ICArPSAocEVpZC0+TGVuICsgMik7CisJCQkJCUxlbmd0aCArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCS8vIDEyLiBNb3ZlIHRvIG5leHQgZWxlbWVudCBJRAorCQlwU3JjICs9ICgyICsgcEVpZC0+TGVuKTsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFNyYzsKKwl9CisKKwkvLyAxMy4gVXBkYXRlIHRoZSBsZW5ndGggaW4gdGhlIGhlYWRlciwgbm90IGluY2x1ZGUgRUlEIGFuZCBsZW5ndGgKKwlwUmVwb3J0LT5MZW5ndGggPSBMZW5ndGggLSA0OworCisJLy8gMTQuIFVwZGF0ZSB0aGUgZnJhbWUgcmVwb3J0IGJ1ZmZlciBkYXRhIGxlbmd0aAorCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisJCUluZGV4CQlDdXJyZW50IEJTU0lEIGluIENDWEJzc3RhYiBlbnRyeSBpbmRleAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQpCit7CisJUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXBSZXBvcnQ7CisJUEJFQUNPTl9SRVBPUlQJCQkJcEJlYWNvblJlcG9ydDsKKwlVQ0hBUgkJCQkJCUluZGV4LCBSZXFJZHg7CisJVVNIT1JUCQkJCQkJTGVuZ3RoOworCVBVQ0hBUgkJCQkJCXBEZXN0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBzZXR1cCBiYXNlIHBvaW50ZXIKKwlSZXFJZHggPSBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHg7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzTnI7IEluZGV4KyspCisJeworCQkvLyAxLiBTZXR1cCB0aGUgYnVmZmVyIGFkZHJlc3MgZm9yIGNvcHlpbmcgdGhpcyBCU1NJRCBpbnRvIHJlcG9ydGluZyBmcmFtZQorCQkvLyAgICBUaGUgb2Zmc2V0IHNob3VsZCBzdGFydCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCByZXBvcnQgZnJhbWUgaGVhZGVyLgorCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCQlwQnNzICAgPSAoUEJTU19FTlRSWSkgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJbmRleF07CisJCUxlbmd0aCA9IDA7CisKKwkJLy8gMi4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJCXBSZXBvcnQgICAgICAgICA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCQlwUmVwb3J0LT5FaWQgICAgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisJCXBSZXBvcnQtPkxlbmd0aCA9IDA7CisJCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uTW9kZTsKKwkJcFJlcG9ydC0+VHlwZSAgID0gTVNSTl9UWVBFX0JFQUNPTl9SRVE7CisJCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJCXBEZXN0ICAgICAgICAgICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisKKwkJLy8gMy4gU3RhcnQgdGhlIGJlYWNvbiByZXBvcnQgZm9ybWF0CisJCXBCZWFjb25SZXBvcnQgPSAoUEJFQUNPTl9SRVBPUlQpIHBEZXN0OworCQlwRGVzdCAgICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCQlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJCS8vIDQuIENvcHkgQ2hhbm5lbCBudW1iZXIKKwkJcEJlYWNvblJlcG9ydC0+Q2hhbm5lbCAgICAgICAgPSBwQnNzLT5DaGFubmVsOworCQlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJCXBCZWFjb25SZXBvcnQtPkR1cmF0aW9uICAgICAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uTWVhc3VyZW1lbnQuRHVyYXRpb247CisJCXBCZWFjb25SZXBvcnQtPlBoeVR5cGUgICAgICAgID0gKChwQnNzLT5TdXBSYXRlTGVuK3BCc3MtPkV4dFJhdGVMZW4gPiA0KSA/IFBIWV9FUlAgOiBQSFlfRFNTKTsKKwkJcEJlYWNvblJlcG9ydC0+UnhQb3dlciAgICAgICAgPSBwQnNzLT5Sc3NpIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJcEJlYWNvblJlcG9ydC0+QmVhY29uSW50ZXJ2YWwgPSBwQnNzLT5CZWFjb25QZXJpb2Q7CisJCXBCZWFjb25SZXBvcnQtPkNhcGFiaWxpdHlJbmZvID0gcEJzcy0+Q2FwYWJpbGl0eUluZm87CisJCUNPUFlfTUFDX0FERFIocEJlYWNvblJlcG9ydC0+QlNTSUQsIHBCc3MtPkJzc2lkKTsKKwkJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwQnNzLT5QVFNGLCA0KTsKKwkJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+VGFyZ2V0VFNGLCBwQnNzLT5UVFNGLCA4KTsKKworCQkvLyA1LiBDcmVhdGUgU1NJRAorCQkqcERlc3QrKyA9IDB4MDA7CisJCSpwRGVzdCsrID0gcEJzcy0+U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOworCQlwRGVzdCAgKz0gcEJzcy0+U3NpZExlbjsKKwkJTGVuZ3RoICs9ICgyICsgcEJzcy0+U3NpZExlbik7CisKKwkJLy8gNi4gQ3JlYXRlIFN1cHBvcnRSYXRlcworCQkqcERlc3QrKyA9IDB4MDE7CisJCSpwRGVzdCsrID0gcEJzcy0+U3VwUmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBCc3MtPlN1cFJhdGUsIHBCc3MtPlN1cFJhdGVMZW4pOworCQlwRGVzdCAgKz0gcEJzcy0+U3VwUmF0ZUxlbjsKKwkJTGVuZ3RoICs9ICgyICsgcEJzcy0+U3VwUmF0ZUxlbik7CisKKwkJLy8gNy4gRFMgUGFyYW1ldGVyCisJCSpwRGVzdCsrID0gMHgwMzsKKwkJKnBEZXN0KysgPSAxOworCQkqcERlc3QrKyA9IHBCc3MtPkNoYW5uZWw7CisJCUxlbmd0aCAgKz0gMzsKKworCQkvLyA4LiBJQlNTIHBhcmFtZXRlciBpZiBwcmVzZW50cworCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCXsKKwkJCSpwRGVzdCsrID0gMHgwNjsKKwkJCSpwRGVzdCsrID0gMjsKKwkJCSooUFVTSE9SVCkgcERlc3QgPSBwQnNzLT5BdGltV2luOworCQkJcERlc3QgICArPSAyOworCQkJTGVuZ3RoICArPSA0OworCQl9CisKKwkJLy8gOS4gVXBkYXRlIGxlbmd0aCBmaWVsZCwgbm90IGluY2x1ZGUgRUlEIGFuZCBsZW5ndGgKKwkJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCQkvLyAxMC4gVXBkYXRlIHRvdGFsIGZyYW1lIHNpemUKKwkJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gTGVuZ3RoOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Fzc29jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hc3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hc3NvYy5jCkBAIC0wLDAgKzEsMjAzOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhc3NvYy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VDSEFSCUNpcGhlcldwYVRlbXBsYXRlW10gPSB7CisJCTB4ZGQsIAkJCQkJLy8gV1BBIElFCisJCTB4MTYsCQkJCQkvLyBMZW5ndGgKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CisKK1VDSEFSCUNpcGhlcldwYTJUZW1wbGF0ZVtdID0geworCQkweDMwLAkJCQkJLy8gUlNOIElFCisJCTB4MTQsCQkJCQkvLyBMZW5ndGgKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBncm91cCBjaXBoZXIsIFRLSVAKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIHBhaXJ3aXNlCisJCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyBhdXRoZW50aWNhdGlvbgorCQkweDAwLCAweDAwLAkJCQkvLyBSU04gY2FwYWJpbGl0eQorCQl9OworCitVQ0hBUglDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDJ9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIFRyYW5zLCBNQVhfQVNTT0NfU1RBVEUsIE1BWF9BU1NPQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVNTT0NfSURMRSwgQVNTT0NfTUFDSElORV9CQVNFKTsKKworCS8vIGZpcnN0IGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVJlYXNzb2NSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURpc2Fzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7CisKKwkvLyBzZWNvbmQgY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIKKwkvLyBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuCisJLy8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gdGhpcmQgY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwkvLworCS8vIFBhdGNoLCBBUCBkb2Vzbid0IHNlbmQgUmVhc3NvY2lhdGUgUnNwIGZyYW1lIHRvIFN0YXRpb24uCisJLy8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1JFQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylSZWFzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBmb3VydGggY29sdW1uCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpRGlzYXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIGluaXRpYWxpemUgdGhlIHRpbWVyCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzIGZ1bmN0aW9uCisJCXdpbGwgYmUgY2FsbGVkIGFuZCBpdCB3aWxsIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCSBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZWFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciByZWFzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMKKwkJZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSZWFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGlzYXNzb2NpYXRpb24gdGltZW91dCBwcm9jZWR1cmUuIEFmdGVyIGRpc2Fzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMKKwkJZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQorCVBhcmFtZXRlcnM6CisJCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBEaXNhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltbG1lIGFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKKwlQYXJhbWV0ZXJzOgorCQlBZGFwdGVyIC0gQWRhcHRlciBwb2ludGVyCisJCUVsZW0gLSBNTE1FIFF1ZXVlIEVsZW1lbnQKKwlQcmU6CisJCXRoZSBzdGF0aW9uIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBjb25maWcKKwkJCS0jIFNTSUQKKwkJCS0jIHN1cHBvcnRlZCByYXRlcyBhbmQgdGhlaXIgbGVuZ3RoCisJCQktIyBsaXN0ZW4gaW50ZXJ2YWwgKEFkYXB0ZXItPlN0YUNmZy5kZWZhdWx0X2xpc3Rlbl9jb3VudCkKKwkJCS0jIFRyYW5zbWl0IHBvd2VyICAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCVBvc3QgIDoKKwkJLSMgQW4gYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZSBpcyBnZW5lcmF0ZWQgYW5kIHNlbnQgdG8gdGhlIGFpcgorCQktIyBBc3NvY2lhdGlvbiB0aW1lciBzdGFydHMKKwkJLSMgQXNzb2NpYXRpb24gc3RhdGUgLT4gQVNTT0NfV0FJVF9SU1AKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCQkJQXBBZGRyWzZdOworCUhFQURFUl84MDJfMTEJQXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJTGlzdGVuSW50djsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCVZhckllc09mZnNldDsKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwSWUgPSBJRV9BSVJPTkVUX0NLSVA7CisJVUNIQVIJCQlBaXJvbmV0Q2tpcExlbiA9IENLSVBfTkVHT1RJQVRJT05fTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0lFID0gSUVfQUlST05FVF9JUEFERFJFU1M7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzTGVuID0gQUlST05FVF9JUEFERFJFU1NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0J1ZmZlcltBSVJPTkVUX0lQQUREUkVTU19MRU5HVEhdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCS8vIGNoZWNrIHNhbml0eSBmaXJzdAorCWVsc2UgaWYgKE1sbWVBc3NvY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywgJlRpbWVvdXQsICZMaXN0ZW5JbnR2KSkKKwl7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBcEFkZHIpOworCisJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCQkvLyBBc3NvY2lhdGlvbiBkb24ndCBuZWVkIHRvIHJlcG9ydCBNQUMgYWRkcmVzcworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzID0KKwkJCU5ESVNfODAyXzExX0FJX1JFUUZJX0NBUEFCSUxJVElFUyB8IE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkxpc3RlbkludGVydmFsID0gTGlzdGVuSW50djsKKwkJLy8gT25seSByZWFzc29jaWF0ZSBuZWVkIHRoaXMKKwkJLy9DT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ3VycmVudEFQQWRkcmVzcywgQXBBZGRyKTsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLk9mZnNldFJlcXVlc3RJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgTUFYX1ZJRV9MRU4pOworCQkvLyBGaXJzdCBhZGQgU1NJRAorCQlWYXJJZXNPZmZzZXQgPSAwOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTc2lkSWUsIDEpOworCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sIDEpOworCQlWYXJJZXNPZmZzZXQgKz0gMTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisKKwkJLy8gU2Vjb25kIGFkZCBTdXBwb3J0ZWQgcmF0ZXMKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3VwUmF0ZUllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOworCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisKKyAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gVFJVRSkpCisgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbyB8PSAweDAxMDA7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIEFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBc3NvY0hkciwgU1VCVFlQRV9BU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKworCQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwJJkFzc29jSGRyLAorCQkJCQkJICAyLAkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgMiwJCQkJCQkmTGlzdGVuSW50diwKKwkJCQkJCSAgMSwJCQkJCQkmU3NpZEllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIAlwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBIVAorCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgSHRMZW47CisJCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQorCQkJeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCSAgICAgICAgSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuKTsKKyAgICAgICAgCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKyAgICAgICAgCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworICAgICAgICAJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAmVG1wTGVuLAorICAgICAgICAJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCisgICAgICAgIAkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCZIdENhcGFiaWxpdHlUbXAsCisgICAgICAgIAkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJCQl7CisJCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvLyBUaGUgUGFyYW1ldGVyIFNldCBDb3VudCBpcyBzZXQgdG8goacwoaggaW4gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWVzCisgICAgICAgICAgICAgICAgLy8gV21lSWVbOF0gfD0gKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAmIDB4MGYpOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCS8vCisJCS8vIExldCBXUEEoIzIyMSkgRWxlbWVudCBJRCBvbiB0aGUgZW5kIG9mIHRoaXMgYXNzb2NpYXRpb24gZnJhbWUuCisJCS8vIE90aGVyd2lzZSBzb21lIEFQIHdpbGwgZmFpbCBvbiBwYXJzaW5nIEVsZW1lbnQgSUQgYW5kIHNldCBzdGF0dXMgZmFpbCBvbiBBc3NvYyBSc3AuCisJCS8vIEZvciBleGFtcGxlOiBQdXQgVmVuZG9yIFNwZWNpZmljIElFIG9uIHRoZSBmcm9udCBvZiBXUEEgSUUuCisJCS8vIFRoaXMgaGFwcGVucyBvbiBBUCAoTW9kZWwgTm86TGlua3N5cyBXUks1NEcpCisJCS8vCisJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJKQorICAgICAgICAgICAgKQorCQl7CisJCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCXsKKwkJCQlSU05JZSA9IElFX1dQQTI7CisJCQl9CisKKyAgICAgICAgICAgIAlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBXUEEgUE1LIGNhY2hlIGxpc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJeworCQkJICAgIElOVCAgICAgaWR4OworICAgICAgICAgICAgICAgIEJPT0xFQU4gRm91bmRQTUsgPSBGQUxTRTsKKwkJCQkvLyBTZWFyY2ggY2hjaGVkIFBNS0lELCBhcHBlbmQgaXQgaWYgZXhpc3RlZAorCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgUE1LSURfTk87IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShBcEFkZHIsICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lELCA2KSkKKwkJCQkJeworCQkJCQkJRm91bmRQTUsgPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoRm91bmRQTUspCisJCQkJeworCQkJCQkvLyBTZXQgUE1LIG51bWJlcgorCQkJCQkqKFBVU0hPUlQpICZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuXSA9IDE7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMl0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lELCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArPSAxODsKKwkJCQl9CisJCQl9CisKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKKwkJCQkgICAgICAgICAgICAgIAkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCXsKKwkgICAgICAgICAgICAvLyBBcHBlbmQgVmFyaWFibGUgSUUKKwkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZSU05JZSwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAxKTsKKwkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQl9CisKKwkJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCisJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CisJCWlmIChDa2lwRmxhZyAhPSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OworCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCQkJQ2tpcEZsYWcgPSAweDE4OworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sIAkmdG1wLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBMZW4sCisJCQkJCQlBaXJvbmV0Q2tpcExlbiwgCQkgIAkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKworCQkJLy8KKwkJCS8vIEFkZCBBaXJvbmV0SVBBZGRyZXNzSUUgZm9yIENpc2NvIENDWCAyLlgKKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKKwkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAorCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBBZGQgQ2lwaGVyU3VpdGUgQ0NLTSBvciBMZWFwVGtpcCBpZiBzZXR0aW5nLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiwJCUNpcGhlclN1aXRlQ2lzY29DQ0tNLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJCS8vIFRoaXJkIGFkZCBSU04KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7IC8vU2F2ZSBDaXBoZXJTdWl0ZQorCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCUNpcGhlclN1aXRlQ0NYVGtpcExlbiwJICAgIENpcGhlclN1aXRlQ0NYVGtpcCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNDWFRraXAsIENpcGhlclN1aXRlQ0NYVGtpcExlbik7CisJCQkJVmFySWVzT2Zmc2V0ICs9IENpcGhlclN1aXRlQ0NYVGtpcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSBWYXJJZXNPZmZzZXQ7CisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdElFTGVuZ3RoID0gVmFySWVzT2Zmc2V0OworCisJCQkvLyBPZmZzZXRSZXNwb25zZUlFcyBmb2xsb3cgUmVxVmFySUUKKwkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXNwb25zZUlFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikgKyBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKwkJCS8vIEVuZCBBZGQgYnkgSmFtZXMKKwkJfQorCisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisJUHJlOgorCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKKwkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKKwkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCisJCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQorCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCXRtcDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKy8vQ0NYIDIuWAorI2lmZGVmIExFQVBfU1VQUE9SVAorCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NJRSA9IElFX0FJUk9ORVRfQ0NLTVJFQVNTT0M7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4gPSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlcltBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0T1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMH07CisJVUNIQVIJCQlNSUNNTlsxNl07CisJVUNIQVIJCQlDYWxjTWljQnVmZmVyWzgwXTsKKwlVTE9ORwkJCUNhbGNNaWNCdWZmZXJMZW4gPSAwOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uCisJZWxzZSBpZihNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBtYWtlIGZyYW1lLCB1c2UgYnNzaWQgYXMgdGhlIEFQIGFkZHJlc3M/PworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgUkUtQVNTT0MgcmVxdWVzdC4uLlxuIikpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJlJlYXNzb2NIZHIsIFNVQlRZUEVfUkVBU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJlJlYXNzb2NIZHIsCisJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZMaXN0ZW5JbnR2LAorCQkJCQkJICBNQUNfQUREUl9MRU4sICAgICAgICAgICAgIEFwQWRkciwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAkgICAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKKwkJCXsKKwkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIEhUCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVTE9ORyBUbXBMZW47CisJCQlVQ0hBUiBIdExlbjsKKwkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCisJCQl7CisJCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCXsKKwkJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQkJaWYgKENraXBGbGFnICE9IDApCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzJdID0gMHg2NjsKKwkJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAxXSA9IDB4MjI7CisKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJnRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcExlbiwKKwkJCQkJCQkJCUFpcm9uZXRDa2lwTGVuLCAgICAgICAgICAgICAgICAgQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRJUEFkZHJlc3NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzTGVuLAorCQkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBUaGUgUk4gaXMgaW5jcmVtZW50ZWQgYmVmb3JlIGVhY2ggcmVhc3NvY2lhdGlvbiByZXF1ZXN0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDS01STisrOworCQkJLy8KKwkJCS8vIENhbGN1bGF0ZSBNSUMgPSBobWFjLW1kNShrcmssIFNUQS1JRHxCU1NJRHxSU05JRXxUU0Z8Uk4pOworCQkJLy8KKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDYWxjTWljQnVmZmVyTGVuID0gTUFDX0FERFJfTEVOOworCQkJQ09QWV9NQUNfQUREUihDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gTUFDX0FERFJfTEVOOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpICZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCkpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCk7CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTVJOLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKSk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNUk4pOworCQkJaG1hY19tZDUocEFkLT5TdGFDZmcuS1JLLCBMRU5fRUFQX01JQ0ssIENhbGNNaWNCdWZmZXIsIENhbGNNaWNCdWZmZXJMZW4sIE1JQ01OKTsKKworCQkJLy8KKwkJCS8vIGZpbGwgdXAgQ0NLTSByZWFzc29jaWF0aW9uIHJlcXVlc3QgZWxlbWVudAorCQkJLy8KKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwgQWlyb25ldE9VSSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyA0LCAoUFVDSEFSKSZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCA4KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArIDEyLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTVJOLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArMTYsIE1JQ01OLCA4KTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q0NLTVJlYXNzb2NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jTGVuLAorCQkJCQkJCUFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwgIEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbixDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgorCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKwkJeworCQkJLy8KKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IFJFQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwcGVyIGxheWVyIGlzc3VlcyBkaXNhc3NvYyByZXF1ZXN0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7CisJVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVVDSEFSIGk7CisKKwkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKworCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQl7CisJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vIHNraXAgc2FuaXR5IGNoZWNrCisJcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCisJCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBEaXNhc3NvY1JlcS0+QWRkcik7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCXsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYXNzb2MgcnNwIGJhY2sKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlFRENBX1BBUk0gICAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCisJCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisJCQkJVUNIQVIJCQlpZHg7CisKKwkJCQkvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorCQkJICAgIGZvciAoaWR4PTA7IGlkeDxTdXBSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCisJCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQorCQkJICAgIHsKKwkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCisJCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKKwkJCSAgICB9CisJCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgorCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJJkVkY2FQYXJtLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8pOworCisJCQkJU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKTsKKworCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJaWYgKENraXBGbGFnICYgMHgxOCkKKwkJCQl7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUnhTRVEsIDQpOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5DS0lQTUlDLCA0KTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMV0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlsyXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjxDQ1g+IHBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gMHglMDJ4XG4iLCBwQWQtPlN0YUNmZy5Da2lwRmxhZykpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGYWlsZSBvbiBBc3NvY2lhdGlvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhdHVzIGNvZGUKKwkJCQkvLyBJcyB0aGF0IGEgUm9ndWUgQVA/CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAoU3RhdHVzID09IE1MTUVfQUxHX05PVF9TVVBQT1JUKSkKKwkJCQl7IC8vUG9zc2libHkgUm9ndWUgQVAKKwkJCQkJUm9ndWVBcFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TdGFDZmcuUm9ndWVBcFRhYiwgcEFkLT5NbG1lQXV4LkJzc2lkLCBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEgpOworCQkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCX0KKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJBc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgcmVhc3NvYyByc3AKKwlQYXJhbWV0cnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVU0hPUlQgICAgICBTdGF0dXM7CisJVVNIT1JUICAgICAgQWlkOworCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgQ2tpcEZsYWc7CisJQk9PTEVBTiAgICAgVGltZXJDYW5jZWxsZWQ7CisJRURDQV9QQVJNICAgRWRjYVBhcm07CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKwlpZihQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAkmQWRkSHRJbmZvLCAmSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQlpZihNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKSkgLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/CisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gcmVjZWl2ZSBSRUFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwgU3RhdHVzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCisJCQl7CisJCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgorCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJICZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCQl9CisKKwkJCS8vCisJCQkvLyBDaXNjbyBMZWFwIENDS00gc3VwcG9ydGVkIFJlLWFzc29jaWF0aW9uLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQl7CisJCQkJaWYgKENDS01Bc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSA9PSBUUlVFKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuQ2tpcEZsYWcgPSBDa2lwRmxhZzsKKwkJCQkJaWYgKENraXBGbGFnICYgMHgxOCkKKwkJCQkJeworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuVHhTRVEsIDQpOworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUnhTRVEsIDQpOworCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMF0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMV0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gVFJVRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjxDQ1g+IHBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gMHglMDJ4XG4iLCBwQWQtPlN0YUNmZy5Da2lwRmxhZykpOworCQkJCQl9CisKKwkJCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDQ0tNQXNzb2NSc3BTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBDa2lwRmxhZyBpcyBubyB1c2UgZm9yIHJlYXNzb2NpYXRlCisJCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlclJlYXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXByb2NlZHVyZXMgb24gSUVFRSA4MDIuMTEvMTk5OSBwLjM3NgorCVBhcmFtZXRyczoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1Bvc3RQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQWRkcjIsCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVTSE9SVCBBaWQsCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAorCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCit7CisJVUxPTkcgSWR4OworCisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBBZGRyMik7CisJcEFkLT5NbG1lQXV4LkFpZCA9IEFpZDsKKwlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4KKwlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCisJeworCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCXBFZGNhUGFybS0+QWlmc25bMF0gPSAzOworCQlwRWRjYVBhcm0tPkFpZnNuWzFdID0gNzsKKwkJcEVkY2FQYXJtLT5BaWZzblsyXSA9IDI7CisJCXBFZGNhUGFybS0+QWlmc25bM10gPSAyOworCisJCXBFZGNhUGFybS0+Q3dtaW5bMF0gPSA0OworCQlwRWRjYVBhcm0tPkN3bWluWzFdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsyXSA9IDM7CisJCXBFZGNhUGFybS0+Q3dtaW5bM10gPSAyOworCisJCXBFZGNhUGFybS0+Q3dtYXhbMF0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsxXSA9IDEwOworCQlwRWRjYVBhcm0tPkN3bWF4WzJdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21heFszXSA9IDM7CisKKwkJcEVkY2FQYXJtLT5UeG9wWzBdICA9IDA7CisJCXBFZGNhUGFybS0+VHhvcFsxXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMl0gID0gOTY7CisJCXBFZGNhUGFybS0+VHhvcFszXSAgPSA0ODsKKworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKworCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzCisJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA+IDApCisJeworCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8pOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gICAgKE1tcHM9JWQsIEFtc2R1U2l6ZT0lZCwgKVxuIiwKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFNldCBOZXcgV1BBIGluZm9ybWF0aW9uCisJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkZHIyLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gSW5pdCB2YXJpYWJsZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKKworCQkvLyBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlcgorCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuICE9IDApKQorCQl7CisJCQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJCQlVU0hPUlQgICAgICAgICAgICAgIGxlbjsKKwkJCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKworCQkJcFZJRSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFczsKKwkJCWxlbgkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbjsKKworCQkJd2hpbGUgKGxlbiA+IDApCisJCQl7CisJCQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJCQkvLyBGb3IgV1BBL1dQQVBTSworCQkJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJCSYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwVklFLCAocEVpZC0+TGVuICsgMikpOworCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gXG4iKSk7CisJCQkJfQorCQkJCS8vIEZvciBXUEEyL1dQQTJQU0sKKwkJCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwVklFLCAocEVpZC0+TGVuICsgMikpOworCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gU3RvcmUgUlNOX0lFIGZvciBXUEEyIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKworCQkJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCQkJfQorCQl9CisKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWhleF9kdW1wKCJSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWxlZnQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHAuMzc0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgICAgUmVhc29uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKVxuIikpOworCWlmKFBlZXJEaXNhc3NvY1Nhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIFJlYXNvbiA9ICVkXG4iLCBSZWFzb24pKTsKKwkJaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIEFkZHIyKSkKKwkJeworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQl7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJCX0KKworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQkvLyBDaXNjb19MRUFQIGhhcyBzdGFydCBhIHRpbWVyCisJCQkJLy8gV2Ugc2hvdWxkIGNhbmNlbCBpdCBpZiB1c2luZyBMRUFQCisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCS8vQ2hlY2sgaXMgaXQgbWFjaCB0aGUgTEVBUCBBdXRoZW50aWNhdGlvbiBmYWlsZWQgYXMgcG9zc2libGUgYSBSb2d1ZSBBUAorCQkJCS8vb24gaXQncyBQb3J0U2VjdXJlZCBub3QgZXF1YWwgdG8gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgd2hpbGUgcHJvY2VzcyB0aGUgQXNzb2NpYXRpb24uCisJCQkJaWYgKChwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlICE9IExFQVBfSURMRSkgJiYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQl7CisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQpOworCQkJCX0KKwkJCX0KKyNlbmRpZgkvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCS8vCisJCQkvLyBHZXQgQ3VycmVudCBTeXN0ZW0gdGltZSBhbmQgVHVybiBvbiBBZGphY2VudEFQUmVwb3J0CisJCQkvLworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSk7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CisJCQlMaW5rRG93bihwQWQsIFRSVUUpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIGFzc29jIHRpbWVvdXQKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciByZWFzc29jIHRpbWVvdXQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSZWFzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBSZWFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBkaXNhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAorCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcmlnaHQgcGFydCBvZiBJRUVFIDgwMi4xMS8xOTk5IHBhZ2UgMzc0CisJTm90ZToKKwkJVGhpcyBldmVudCBzaG91bGQgbmV2ZXIgY2F1c2UgQVNTT0Mgc3RhdGUgbWFjaGluZSBwZXJmb3JtIHN0YXRlCisJCXRyYW5zaXRpb24sIGFuZCBoYXMgbm8gcmVsYXRpb25zaGlwIHdpdGggQ05UTCBtYWNoaW5lLiBTbyB3ZSBzZXBhcmF0ZQorCQl0aGlzIHJvdXRpbmUgYXMgYSBzZXJ2aWNlIG91dHNpZGUgb2YgQVNTT0Mgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBDbHMzZXJyQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpCit7CisJSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOworCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7CisJUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7CisJVVNIT1JUICAgICAgICAgICAgICAgIFJlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCisJLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQorCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCisJcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJcERpc2Fzc29jSGRyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9ERUFVVEg7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcEFkLT5TdGFDZmcuRGlzYXNzb2NSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwQWRkcik7Cit9CisKKyAvKgorCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSBEZXNjcmlwdGlvbjoKKwkJIFN3aXRjaCBiZXR3ZWVuIFdFUCBhbmQgQ0tJUCB1cG9uIG5ldyBhc3NvY2lhdGlvbiB1cC4KKwkgUGFyYW1ldGVyczoKKworCSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAqLworVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlpbnQgICAgICAgICAgICBpOworCVNIQVJFREtFWV9NT0RFX1NUUlVDICBjc3IxOworCisJLy8gaWYgS1AgaXMgcmVxdWlyZWQuIGNoYW5nZSB0aGUgQ2lwaGVyQWxnIGluIGhhcmR3YXJlIHNoYXJkIGtleSB0YWJsZSBmcm9tIFdFUAorCS8vIHRvIENLSVAuIGVsc2UgcmVtYWluIGFzIFdFUAorCWlmIChwQWQtPlN0YUNmZy5iQ2tpcE9uICYmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MTApKQorCXsKKwkJLy8gbW9kaWZ5IGhhcmR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IE1BQyB1c2UgY29ycmVjdCBhbGdvcml0aG0gdG8gZGVjcnlwdCBSWAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCAmY3NyMS53b3JkKTsKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKworCQkvLyBtb2RpZnkgc29mdHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgZHJpdmVyIGNhbiBzcGVjaWZ5IGNvcnJlY3QgYWxnb3JpdGhtIGluIFRYRCB1cG9uIFRYCisJCWZvciAoaT0wOyBpPFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCQl9CisJfQorCisJLy8gZWxzZSBpZiBLUCBOT1QgaW51c2VkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBDS0lQCisJLy8gdG8gV0VQLgorCWVsc2UKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCisJCS8vCisJCS8vIE9uIFdQQS1OT05FLCBtdXN0IHVwZGF0ZSBDaXBoZXJBbGcuCisJCS8vIEJlY2F1c2UgdGhlIE9JRF84MDJfMTFfV0VQX1NUQVRVUyB3YXMgYmVlbiBzZXQgYWZ0ZXIgT0lEXzgwMl8xMV9BRERfS0VZCisJCS8vIGFuZCBDaXBoZXJBbGcgd2lsbCBiZSBDSVBIRVJfTk9ORSBieSBXaW5kb3dzIFplcm9Db25maWcuCisJCS8vIFNvIHdlIG5lZWQgdG8gdXBkYXRlIENpcGhlckFsZyBhZnRlciBjb25uZWN0LgorCQkvLworCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuICE9IDApCisJCQkJeworCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCXsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCX0KKwkJCX0KKworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgY3NyMS53b3JkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQmV0d2VlbldlcEFuZENraXA6IG1vZGlmeSBCU1MwIGNpcGhlciB0byAlc1xuIiwgQ2lwaGVyTmFtZVtjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnXSkpOworCX0KK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK1ZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgdW5zaWduZWQgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTcpIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIkFTU09DSU5GT19SZXFJRXM9Iik7CisJICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSsxNywgcEFkLT5TdGFDZmcuUmVxVmFySUVzLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisJICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTc7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX1JFUUlFX0VWRU5UX0ZMQUc7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKworICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DSU5GT19FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKKwlJTiAgUlRNUF9BREFQVEVSICpwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICBpZiAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKyAgICAgICAgbWVtY3B5KGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQVNTT0NSRVFJRSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2Vsc2UKKyAgICBpZiAoKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbioyKSArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgVUNIQVIgICBpZHg7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNzsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk8oUmVxSUVzPSIpOworICAgICAgICBmb3IgKGlkeD0wOyBpZHg8cEFkLT5TdGFDZmcuUmVxVmFySUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXNbaWR4XSk7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgY3VzdG9tKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNyA+IE1BWF9DVVNUT01fTEVOXG4iKSk7CisjZW5kaWYKKworCXJldHVybiAwOworCit9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCitCT09MRUFOIFN0YUFkZE1hY1RhYmxlRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisJSU4gIFVDSEFSCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJSU4gIEhUX0NBUEFCSUxJVFlfSUUJKnBIdENhcGFiaWxpdHksCisJSU4gIFVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiAgVVNIT1JUICAgICAgICAJCUNhcGFiaWxpdHlJbmZvKQoreworCVVDSEFSICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwlpZiAoQURIT0NfT04ocEFkKSkKKwkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorICAgIHsKKyAgICAgICAgY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworICAgICAgICBjYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKyAgICAgICAgY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworICAgICAgICBjYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKyAgICAgICAgY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gMTFuIG9ubHkKKwlpZiAoKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpJiYgKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJaWYgKCFwRW50cnkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJaWYgKHBFbnRyeSkKKwl7CisJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJaWYgKChNYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIHx8CisJCQkocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSkKKwkJeworCQkJcEVudHJ5LT5SYXRlTGVuID0gNDsKKwkJCWlmIChNYXhTdXBwb3J0ZWRSYXRlID49IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCQl9CisJCWVsc2UKKwkJCXBFbnRyeS0+UmF0ZUxlbiA9IDEyOworCisJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQgPSAwOworCQlwRW50cnktPk1pbkhUUGh5TW9kZS53b3JkID0gMDsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IDA7CisJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IE1heFN1cHBvcnRlZFJhdGU7CisJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQl9CisJCXBFbnRyeS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKKwkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKTsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQlDSEFSICAgIGk7CisKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQl9CisKKwkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJfQorCisJCS8vIDMqMworCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04gJiYgcEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzMwNzBfVkVSU0lPTikKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlR4QkYgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKKworCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCWZvciAoaT0yMzsgaT49MDsgaS0tKSAvLyAzKjMKKwkJeworCQkJaiA9IGkvODsKKwkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKwkJCWlmICgocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEh0Q2FwYWJpbGl0eS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCQl7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpPT0wKQorCQkJCWJyZWFrOworCQl9CisKKworCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCXsKKwkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQl7CisJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQl9CisJCX0KKworCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9QczsKKwkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSAmJiAocEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBGQUxTRSkpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uSXNMZWdhY3kgPSBUUlVFOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKworCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJeworCQlQVUNIQVIJCQkJCXBUYWJsZTsKKwkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCisJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJfQorCisJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOworCXBFbnRyeS0+QXV0aFN0YXRlID0gQVNfQVVUSF9PUEVOOworCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKyAgICB7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ19FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7CisKKyAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZmI4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXV0aC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRlIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTbSAtIHBvaW50ZXIgdG8gdGhlIGF1dGggc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX1JFUV9JRExFICAgICAgICAgICBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgICBBVVRIX1dBSVRfU0VRNAorICAgIE1UMl9NTE1FX0FVVEhfUkVRICAgbWxtZV9hdXRoX3JlcV9hY3Rpb24gICAgaW52YWxpZF9zdGF0ZV93aGVuX2F1dGggICAgICAgICAgaW52YWxpZF9zdGF0ZV93aGVuX2F1dGgKKyAgICBNVDJfUEVFUl9BVVRIX0VWRU4gIGRyb3AgICAgICAgICAgICAgICAgICAgIHBlZXJfYXV0aF9ldmVuX2F0X3NlcTJfYWN0aW9uICAgIHBlZXJfYXV0aF9ldmVuX2F0X3NlcTRfYWN0aW9uCisgICAgTVQyX0FVVEhfVElNRU9VVCAgICBEcm9wICAgICAgICAgICAgICAgICAgICBhdXRoX3RpbWVvdXRfYWN0aW9uICAgICAgICAgICAgICBhdXRoX3RpbWVvdXRfYWN0aW9uCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCit2b2lkIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKyAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfU1RBVEUsIE1BWF9BVVRIX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JFUV9JRExFLCBBVVRIX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyB0aGUgZmlyc3QgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JFUV9JRExFLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXV0aFJlcUFjdGlvbik7CisKKyAgICAvLyB0aGUgc2Vjb25kIGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCisgICAgLy8gdGhlIHRoaXJkIGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5BdXRoKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfUEVFUl9BVVRIX0VWRU4sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9BVVRIX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXV0aFRpbWVvdXRBY3Rpb24pOworCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aW1lciB0aHJlYWQgd2hlbiBhdXRoIHRpbWVyIGV4cGlyZXMKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIIC0gQXV0aFRpbWVvdXRcbiIpKTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCS8vIHNlbmQgYSBkZS1hdXRoIHRvIHJlc2V0IEFQJ3Mgc3RhdGUgbWFjaGluZSAoUGF0Y2ggQVAtRGlyNjM1KQorCWlmIChwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID09IEFVVEhfV0FJVF9TRVEyKQorCQlDbHMyZXJyQWN0aW9uKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKworCisgICAgTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX1RJTUVPVVQsIDAsIE5VTEwpOworICAgIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgICAgICBBZGRyWzZdOworICAgIFVTSE9SVCAgICAgICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOworICAgIFVMT05HICAgICAgICAgICAgICBUaW1lb3V0OworICAgIEhFQURFUl84MDJfMTEgICAgICBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKyAgICBORElTX1NUQVRVUyAgICAgICAgTlN0YXR1czsKKyAgICBQVUNIQVIgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgVUxPTkcgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEJsb2NrIEF1dGggcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisgICAgZWxzZSBpZihNbG1lQXV0aFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpCisgICAgeworICAgICAgICAvLyByZXNldCB0aW1lcgorICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyKTsKKyAgICAgICAgcEFkLT5NbG1lQXV4LkFsZyAgPSBBbGc7CisgICAgICAgIFNlcSA9IDE7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKworICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbihBbGc6JWQpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIsIEFsZykpOworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgQWxnKSk7CisgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBUaW1lb3V0KTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVEyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVF9FUlIoKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iKSk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICBTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICAgU2VxLCBTdGF0dXMsIFJlbW90ZVN0YXR1cywgQWxnOworICAgIFVDSEFSICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgIEN5cGVyQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOICsgOCArIDhdOworICAgIFVDSEFSICAgICAgICAgRWxlbWVudFsyXTsKKyAgICBIRUFERVJfODAyXzExIEF1dGhIZHI7CisgICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKyAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKyAgICBVU0hPUlQgICAgICAgIFN0YXR1czI7CisKKyAgICBpZiAoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKKyAgICB7CisgICAgICAgIGlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzIgdG8gbWUgKEFsZz0lZCwgU3RhdHVzPSVkKVxuIiwgQWxnLCBTdGF0dXMpKTsKKyAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworICAgICAgICAgICAgaWYgKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSAiTEVBUCIgaGFzIGFsbG93IGZvciBDQ1ggMS5YCisgICAgICAgICAgICAgICAgaWYgKChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJCXx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlID0gTEVBUF9JRExFOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkCisgICAgICAgICAgICAgICAgICAgIFNlcSsrOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKwkJCQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1czIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgQXV0aEhkci5GQy5XZXAgPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICBSVE1QSW5pdFdlcEVuZ2luZSgKKyAgICAgICAgICAgICAgICAgICAgCXBBZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAgICAgICAgICAgICAJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisgICAgICAgICAgICAgICAgICAgIAlDeXBlckNobGdUZXh0KTsKKworCQkJCQlBbGcgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZBbGcpOworCQkJCQlTZXEgPSBjcHUybGUxNigqKFVTSE9SVCAqKSZTZXEpOworCQkJCQlSZW1vdGVTdGF0dXM9IGNwdTJsZTE2KCooVVNIT1JUICopJlJlbW90ZVN0YXR1cyk7CisKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJkFsZywgQ3lwZXJDaGxnVGV4dCArIDQsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmU2VxLCBDeXBlckNobGdUZXh0ICsgNiwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZSZW1vdGVTdGF0dXMsIEN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKKwkJCQkJRWxlbWVudFswXSA9IDE2OworCQkJCQlFbGVtZW50WzFdID0gMTI4OworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBFbGVtZW50LCBDeXBlckNobGdUZXh0ICsgMTAsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCBDaGxnVGV4dCwgQ3lwZXJDaGxnVGV4dCArIDEyLCAxMjgpOworCQkJCQlSVE1QU2V0SUNWKHBBZCwgQ3lwZXJDaGxnVGV4dCArIDE0MCk7CisgICAgICAgICAgICAgICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfVEVYVF9MRU4gKyAxNiwgICAgIEN5cGVyQ2hsZ1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICAgICAgICAgICAgICAgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisgICAgICAgICAgICAgICAgCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBBVVRIX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9JbnZhbGlkIEF1dGhlbnRpY2F0aW9uIHBvc3NpYmxlIHJvZ3VlIEFQCisgICAgICAgICAgICAgICAgICAgIC8vQWRkIHRoaXMgQXAgdG8gUm9ndWUgQVAuCisgICAgICAgICAgICAgICAgICAgIFJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9JTlZBTElEX0FVVEgpOworCQkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKKyAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7CisgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBDSEFSICAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKworICAgIGlmKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZihNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzQgdG8gbWVcbiIpKTsKKyAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworICAgICAgICAgICAgaWYgKFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqcEluZm87CisgICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXM7CisKKyAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgREUtQVVUSCByZXF1ZXN0IChSZWFzb249JWQpLi4uXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwSW5mby0+QWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmcEluZm8tPlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IHBJbmZvLT5SZWFzb247CisgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBJbmZvLT5BZGRyKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBdXRoVGltZW91dEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisgICAgVVNIT1JUIFN0YXR1czsKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQXV0aFRpbWVvdXRBY3Rpb25cbiIpKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEludmFsaWRTdGF0ZVdoZW5BdXRoIChzdGF0ZT0lbGQpLCByZXNldCBBVVRIIHN0YXRlIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUpKTsKKyAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICBTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNvbWUgU1RBL0FQCisgICAgTm90ZToKKyAgICAgICAgVGhpcyBhY3Rpb24gc2hvdWxkIG5ldmVyIHRyaWdnZXIgQVVUSCBzdGF0ZSB0cmFuc2l0aW9uLCB0aGVyZWZvcmUgd2UKKyAgICAgICAgc2VwYXJhdGUgaXQgZnJvbSBBVVRIIHN0YXRlIG1hY2hpbmUsIGFuZCBtYWtlIGl0IGFzIGEgc3RhbmRhbG9uZSBzZXJ2aWNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzMmVyckFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQVUNIQVIgcEFkZHIpCit7CisgICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTMkVSUjsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIENsYXNzIDIgZXJyb3IsIFNlbmQgREVBVVRIIGZyYW1lLi4uXG4iKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKyAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gUmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwQWRkcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aF9yc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGhfcnNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzYzJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGhfcnNwLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXV0aF9yc3AuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtMTAtMQkJY29weSBmcm9tIFJUMjU2MAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQgcHJvY2VkdXJlCisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSB0aGUgc3RhdGUgbWFjaGluZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1JTUF9TVEFURSwgTUFYX0FVVEhfUlNQX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JTUF9JRExFLCBBVVRIX1JTUF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gY29sdW1uIDEKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX0lETEUsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKworICAgIC8vIGNvbHVtbiAyCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFVTSE9SVCBBbGcsCisgICAgSU4gVVNIT1JUIFNlcSwKKyAgICBJTiBVU0hPUlQgUmVhc29uLAorICAgIElOIFVTSE9SVCBTdGF0dXMpCit7CisgICAgSEVBREVSXzgwMl8xMSAgICAgQXV0aEhkcjsKKyAgICBVTE9ORyAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICAgICAgTlN0YXR1czsKKworICAgIGlmIChSZWFzb24gIT0gTUxNRV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7CisgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZBbGcsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckRlYXV0aEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQTUxNRV9RVUVVRV9FTEVNIEVsZW0pCit7CisgICAgVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICBSZWFzb247CisKKyAgICBpZiAoUGVlckRlYXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCisgICAgeworICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLCBSZWFzb24pKTsKKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKKworICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSBDaXNjb19MRUFQIGhhcyBzdGFydCBhIHRpbWVyCisgICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FuY2VsIGl0IGlmIHVzaW5nIExFQVAKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKyAgICAgICAgICAgICAgICAvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEF1dGhlbnRpY2F0b24uCisgICAgICAgICAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgJiYgKHBBZC0+TWxtZS5MZWFwTWFjaGluZS5DdXJyU3RhdGUgIT0gTEVBUF9JRExFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9jb25uZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9jb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzMTQwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Nvbm5lY3QuYwpAQCAtMCwwICsxLDI4MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY29ubmVjdC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJCTIwMDQtMDgtMDgJCQlNYWpvciBtb2RpZmljYXRpb24gZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKKworLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKKy8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUworLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCisvLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQorI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuU3NpZExlbiA9IChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+Q29tbW9uQ2ZnLlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZExlbik7IFwKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+Q29tbW9uQ2ZnLkJzc2lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DaGFubmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChfcEFkKS0+TWxtZUF1eC5BdGltV2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvID0gKF9wQWQpLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQmVhY29uUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwTWF4RHVyYXRpb24gPSAoX3BBZCktPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb247ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcFBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5DZnBQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuKTtcCisJKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbik7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCAmKF9wQWQpLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpO1wKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gKF9wQWQpLT5TdGFDZmcuUGFpckNpcGhlcjtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkJzc0lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpO1wKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJhdGVMZW4gPSAoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjtcCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBkaWZmZXJzIGZyb20gb3RoZXIgc3RhdGUgbWFjaGluZXMsIHRoZSBpbnRlcmZhY2UKKwkvLyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXN3aXRjaChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKQorCXsKKwkJY2FzZSBDTlRMX0lETEU6CisJCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6CisJCQlDbnRsV2FpdERpc2Fzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0pPSU46CisJCQlDbnRsV2FpdEpvaW5Qcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQkvLyBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzCisJCS8vIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4KKwkJLy8gVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIKKwkJLy8gcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuCisJCS8vIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpCisJCS8vIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUKKwkJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKKwkJCUNudGxXYWl0UmVhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgorCQkJQ250bFdhaXRTdGFydFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIOgorCQkJQ250bFdhaXRBdXRoUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgorCQkJQ250bFdhaXRBdXRoUHJvYzIocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BU1NPQzoKKwkJCUNudGxXYWl0QXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgorCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQorCQkJeworCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQorCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKKwkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCisJCQkJeworCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwkJCQl9CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2V0IExFRCBzdGF0dXMgdG8gcHJldmlvdXMgc3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpCisJCQkJeworCQkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7CisJCQkJCVJUTVBTZXRMRUQocEFkLCBwQWQtPkxlZFN0YXR1cyk7CisJCQkJfQorI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQkvLyBBUCBzZW50IGEgMjA0MENvZXhpc3RlbmNlIG1nbXQgZnJhbWUsIHRoZW4gc3RhdGlvbiBwZXJmb3JtIGEgc2NhbiwgYW5kIHRoZW4gc2VuZCBiYWNrIHRoZSByZXNwb25lLgorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID09IDEpCisJCQkJeworCQkJCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCQkJeworCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBSVDI4NzAKKwkJLy8KKwkJLy8gVGhpcyBzdGF0ZSBpcyBmb3IgdGhhdCB3ZSB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQVAgYnV0CisJCS8vIGl0IGRpZG4ndCBmaW5kIG9uIEJTUyBMaXN0IHRhYmxlLiBTbyB3ZSBuZWVkIHRvIHNjYW4gdGhlIGFpciBmaXJzdCwKKwkJLy8gYWZ0ZXIgdGhhdCB3ZSBjYW4gdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGRlc2lyZWQgQVAgaWYgYXZhaWxhYmxlLgorCQkvLworCQljYXNlIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUOgorCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQorCQkJeworCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQorCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKKwkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOworI2lmZGVmIENDWF9TVVBQT1JUCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkKKwkJCQl7CisJCQkJCS8vIENpc2NvIHNjYW4gcmVxdWVzdCBpcyBmaW5pc2hlZCwgcHJlcGFyZSBiZWFjb24gcmVwb3J0CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLCBNVDJfQUlST05FVF9TQ0FOX0RPTkUsIDAsIE5VTEwpOworCQkJCX0KKyNlbmRpZiAvLyBDQ1hfU1VQUE9SVCAvLworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJCQkvLworCQkJCS8vIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0IHRvLgorCQkJCS8vCisJCQkJQnNzVGFibGVTc2lkU29ydChwQWQsICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJCWlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA+IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCIhRVJST1IhIENOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgdHlwZSg9JWxkKSIsIEVsZW0tPk1zZ1R5cGUpKTsKKwkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsSWRsZVByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwlzd2l0Y2goRWxlbS0+TXNnVHlwZSkKKwl7CisJCWNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJQ250bE9pZFNzaWRQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisJCQlDbnRsT2lkUlRCc3NpZFByb2MocEFkLEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKwkJCUNudGxPaWRTY2FuUHJvYyhwQWQsRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmKEFURV9PTihwQWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorICAgIAkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKyAgICAJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworICAgIAkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKyAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCisJCWNhc2UgTVQyX01MTUVfUk9BTUlOR19SRVE6CisJCQlDbnRsTWxtZVJvYW1pbmdQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgorICAgICAgICAgICAgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHBBZCwgRWxlbSk7CisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCUNudGxPaWRETFNTZXR1cFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIGluIENudGxJZGxlUHJvYyhNc2dUeXBlPSVsZClcbiIsRWxlbS0+TXNnVHlwZSkpOworCQkJYnJlYWs7CisJfQorfQorCitWT0lEIENudGxPaWRTY2FuUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICAgICBCc3NJZHggPSBCU1NfTk9UX0ZPVU5EOworCUJTU19FTlRSWSAgICAgICAgICAgICAgICAgIEN1cnJCc3M7CisKKyNpZmRlZiBSQUxJTktfQVRFCisvKiBEaXNhYmxlIHNjYW5uaW5nIHdoZW4gQVRFIGlzIHJ1bm5pbmcuICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwkvLyByZWNvcmQgY3VycmVudCBCU1MgaWYgbmV0d29yayBpcyBjb25uZWN0ZWQuCisJLy8gMjAwMy0yLTEzIGRvIG5vdCBpbmNsdWRlIGN1cnJlbnQgSUJTUyBpZiB0aGlzIGlzIHRoZSBvbmx5IFNUQSBpbiB0aGlzIElCU1MuCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCUJzc0lkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQl9CisJfQorCisJLy8gY2xlYW4gdXAgcHJldmlvdXMgU0NBTiByZXN1bHQsIGFkZCBjdXJyZW50IEJTUyBiYWNrIHRvIHRhYmxlIGlmIGFueQorCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJeworCQkvLyBEREsgTm90ZTogSWYgdGhlIE5JQyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEJTU0lEIGFuZCBTU0lECisJCS8vICAgIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIGxpc3Qgb2YgQlNTSURzIGdlbmVyYXRlZCBieSB0aGlzIHNjYW4sIHRoZQorCQkvLyAgICBCU1NJRCBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgQlNTSUQgYW5kIFNTSUQgc2hvdWxkIGJlCisJCS8vICAgIGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIEJTU0lEcyBpbiB0aGUgTklDJ3MgZGF0YWJhc2UuCisJCS8vIFRvIGVuc3VyZSB0aGlzLCB3ZSBhcHBlbmQgdGhpcyBCU1MgYXMgdGhlIGZpcnN0IGVudHJ5IGluIFNDQU4gcmVzdWx0CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbMF0sICZDdXJyQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBBZC0+U2NhblRhYi5Cc3NOciA9IDE7CisJfQorCisJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsICIiLCAwLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAorCQlzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZSwgdXNlciBkZXNpcmVkIFNTSUQgc2hvdWxkIGFscmVhZHkgYmVlbgorCQlyZWNvcmRlZCBpbiBDb21tb25DZmcuU3NpZFtdCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZFNzaWRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit7CisJUE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgcE9pZFNzaWQgPSAoTkRJU184MDJfMTFfU1NJRCAqKUVsZW0tPk1zZzsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKwlVTE9ORwkJCQkJICAgTm93OworCisJLy8gU3RlcCAxLiByZWNvcmQgdGhlIGRlc2lyZWQgdXNlciBzZXR0aW5ncyB0byBNbG1lQXV4CisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBPaWRTc2lkLT5Tc2lkLCBwT2lkU3NpZC0+U3NpZExlbmd0aCk7CisJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSAoVUNIQVIpcE9pZFNzaWQtPlNzaWRMZW5ndGg7CisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKKworCisJLy8KKwkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCisJLy8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJLy8gc3RlcCAyLiBmaW5kIGFsbCBtYXRjaGluZyBCU1MgaW4gdGhlIGxhc3Rlc3QgU0NBTiByZXN1bHQgKGluQnNzVGFiKQorCS8vICAgICYgbG9nIHRoZW0gaW50byBNbG1lQXV4LlNzaWRCc3NUYWIgZm9yIGxhdGVyLW9uIGl0ZXJhdGlvbi4gU29ydCBieSBSU1NJIG9yZGVyCisJQnNzVGFibGVTc2lkU29ydChwQWQsICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSAlZCBCU1Mgb2YgJWQgQlNTIG1hdGNoIHRoZSBkZXNpcmUgKCVkKVNTSUQgLSAlc1xuIiwKKwkJCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yLCBwQWQtPlNjYW5UYWIuQnNzTnIsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCkpOworCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCisJCShwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWRMZW4pICYmCisJCU5kaXNFcXVhbE1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSAmJgorCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uQnNzaWQpKQorCXsKKwkJLy8gQ2FzZSAxLiBhbHJlYWR5IGNvbm5lY3RlZCB3aXRoIGFuIEFQIHdobyBoYXMgdGhlIGRlc2lyZWQgU1NJRAorCQkvLyAgICAgICAgIHdpdGggaGlnaGVzdCBSU1NJCisKKwkJLy8gQWRkIGNoZWNraW5nIE1vZGUgIkxFQVAiIGZvciBDQ1ggMS4wCisJCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJIHx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJICkgJiYKKwkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQkvLyBjYXNlIDEuMSBGb3IgV1BBLCBXUEEtUFNLLCBpZiB0aGUgMXggcG9ydCBpcyBub3Qgc2VjdXJlZCwgd2UgaGF2ZSB0byByZWRvCisJCQkvLyAgICAgICAgICBjb25uZWN0aW9uIHByb2Nlc3MKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UgaWYgKHBBZC0+YkNvbmZpZ0NoYW5nZWQgPT0gVFJVRSkKKwkJeworCQkJLy8gY2FzZSAxLjIgSW1wb3J0YW50IENvbmZpZyBoYXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gdGhlIHNhbWUgQVAKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIEJlY2F1c2UgY29uZmlnIGNoYW5nZWQuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBjYXNlIDEuMy4gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFNTSUQgd2l0aCBoaWdoZXN0IFJTU0kuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gYWxyZWFkeSB3aXRoIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9TU0lEIHJlcXVlc3RcbiIpKTsKKwkJCS8vCisJCQkvLyAoSENUIDEyLjEpIDFjX3dsYW5fbWVkaWFldmVudHMgcmVxdWlyZWQKKwkJCS8vIG1lZGlhIGNvbm5lY3QgZXZlbnRzIGFyZSBpbmRpY2F0ZWQgd2hlbiBhc3NvY2lhdGluZyB3aXRoIHRoZSBzYW1lIEFQCisJCQkvLworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBTaW5jZSBNZWRpYVN0YXRlIGFscmVhZHkgaXMgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQKKwkJCQkvLyBXZSBqdXN0IGluZGljYXRlIHRoZSBjb25uZWN0IGV2ZW50IGFnYWluIHRvIG1lZXQgdGhlIFdIUUwgcmVxdWlyZWQuCisJCQkJLy8KKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKwkJCX0KKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl9CisJfQorCWVsc2UgaWYgKElORlJBX09OKHBBZCkpCisJeworCQkvLworCQkvLyBGb3IgUlQ2MQorCQkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQorCQkvLyBSVDYxIG1heSBsb3N0IFNTSUQsIGFuZCBub3QgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBhbmQgd2lsbCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGJ5IEF1dG9yZWNvbm5lY3QKKwkJLy8gQnV0IG1lZGlhIHN0YXR1cyBpcyBjb25uZWN0ZWQsIHNvIHRoZSBTU0lEIG5vdCByZXBvcnQgY29ycmVjdGx5LgorCQkvLworCQlpZiAoIVNTSURfRVFVQUwocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSkKKwkJeworCQkJLy8KKwkJCS8vIERpZmZlcmVudCBTU0lEIG1lYW5zIG5vdCBSb2FtaW5nIGNhc2UsIHNvIHdlIGxldCBMaW5rRG93bigpIHRvIEluZGljYXRlIGEgZGlzY29ubmVjdCBldmVudC4KKwkJCS8vCisJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworCQl9CisJCS8vIGNhc2UgMi4gYWN0aXZlIElORlJBIGFzc29jaWF0aW9uIGV4aXN0ZW50CisJCS8vICAgIHJvYW1pbmcgaXMgZG9uZSB3aXRoaW4gbWluaXBvcnQgZHJpdmVyLCBub3RoaW5nIHRvIGRvIHdpdGggY29uZmlndXJhdGlvbgorCQkvLyAgICB1dGlsaXR5LiBzbyB1cG9uIGEgbmV3IFNFVChPSURfODAyXzExX1NTSUQpIGlzIHJlY2VpdmVkLCB3ZSBqdXN0CisJCS8vICAgIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAsCisJCS8vICAgIHRoZW4gcGVyZm9ybSBhIG5ldyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbmV3IFNTSUQsIG5vIG1hdHRlciB0aGUKKwkJLy8gICAgbmV3L29sZCBTU0lEIGFyZSB0aGUgc2FtZSBvciBub3QuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7CisJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJfQorCWVsc2UKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCX0KKworCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID09IDApICYmCisJCQkocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkgJiYKKwkJCShwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpICYmCisJCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pID09IFRSVUUpCisJCQkpCisJCXsKKwkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IHNjYW5cbiIpKTsKKwkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCisJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRSVEJzc2lkUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQoreworCVVMT05HICAgICAgIEJzc0lkeDsKKwlQVUNIQVIgICAgICBwT2lkQnNzaWQgPSAoUFVDSEFSKUVsZW0tPk1zZzsKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgICAgIEpvaW5SZXE7CisKKyNpZmRlZiBSQUxJTktfQVRFCisvKiBObyBuZWVkIHRvIHBlcmZvcm0gdGhpcyByb3V0aW5lIHdoZW4gQVRFIGlzIHJ1bm5pbmcuICovCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8gcmVjb3JkIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwT2lkQnNzaWQpOworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEFkLT5TdGFDZmcuQnNzVHlwZTsKKworCS8vCisJLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgorCS8vCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCS8vIGZpbmQgdGhlIGRlc2lyZWQgQlNTIGluIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgdGFibGUKKwlCc3NJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwT2lkQnNzaWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKwlpZiAoQnNzSWR4ID09IEJTU19OT1RfRk9VTkQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiByZXBseSBORElTX1NUQVRVU19OT1RfQUNDRVBURURcbiIpKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJcmV0dXJuOworCX0KKworCS8vIGNvcHkgdGhlIG1hdGNoZWQgQlNTIGVudHJ5IGZyb20gU2NhblRhYiB0byBNbG1lQXV4LlNzaWRCc3NUYWIuIFdoeT8KKwkvLyBCZWNhdXNlIHdlIG5lZWQgdGhpcyBlbnRyeSB0byBiZWNvbWUgdGhlIEpPSU4gdGFyZ2V0IGluIGxhdGVyIG9uIFNZTkMgc3RhdGUgbWFjaGluZQorCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gMTsKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0sICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCisJLy9wQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOworCS8vTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuKTsKKworCS8vIEFkZCBTU0lEIGludG8gTWxtZUF1eCBmb3Igc2l0ZSBzdXJleSBqb2luaW5nIGhpZGRlbiBTU0lECisJLy9wQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CisJLy9OZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJLy8gMjAwMi0xMS0yNiBza2lwIHRoZSBmb2xsb3dpbmcgY2hlY2tpbmcuIGkuZS4gaWYgdXNlciB3YW50cyB0byByZS1jb25uZWN0IHRvIHNhbWUgQVAKKwkvLyAgIHdlIGp1c3QgZm9sbG93IG5vcm1hbCBwcm9jZWR1cmUuIFRoZSByZWFzb24gb2YgdXNlciBkb2luZyB0aGlzIG1heSBiZWNhdXNlIGhlL3NoZSBjaGFuZ2VkCisJLy8gICBBUCB0byBhbm90aGVyIGNoYW5uZWwsIGJ1dCB3ZSBzdGlsbCByZWNlaXZlZCBCRUFDT04gZnJvbSBpdCB0aHVzIGRvbid0IGNsYWltIExpbmsgRG93bi4KKwkvLyAgIFNpbmNlIHVzZXIga25vd3MgaGUncyBjaGFuZ2VkIEFQIGNoYW5uZWwsIGhlJ2xsIHJlLWNvbm5lY3QgYWdhaW4uIEJ5IHNraXBwaW5nIHRoZSBmb2xsb3dpbmcKKwkvLyAgIGNoZWNraW5nLCB3ZSdsbCBkaXNhc3NvY2lhdGUgdGhlbiByZS1kbyBub3JtYWwgYXNzb2NpYXRpb24gd2l0aCB0aGlzIEFQIGF0IHRoZSBuZXcgY2hhbm5lbC4KKwkvLyAyMDAzLTEtNiBSZS1lbmFibGUgdGhpcyBmZWF0dXJlIGJhc2VkIG9uIG1pY3Jvc29mdCByZXF1aXJlbWVudCB3aGljaCBwcmVmZXIgbm90IHRvIHJlLWRvCisJLy8gICBjb25uZWN0aW9uIHdoZW4gc2V0dGluZyB0aGUgc2FtZSBCU1NJRC4KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmCisJCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwT2lkQnNzaWQpKQorCXsKKwkJLy8gYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgQlNTSUQsIGdvIGJhY2sgdG8gaWRsZSBzdGF0ZSBkaXJlY3RseQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gYWxyZWFkeSBpbiB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfQlNTSUQgcmVxdWVzdFxuIikpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJfQorCWVsc2UKKwl7CisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOworCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQkJfQorCisJCQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKKwkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKworCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCisJCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisKKwkJCQkvLyBSU04gY2FwYWJpbGl0eQorCQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7CisJCQl9CisKKwkJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKKwkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQkJeworCQkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQkJfQorCQkJLy8gTm8gYWN0aXZlIGFzc29jaWF0aW9uLCBqb2luIHRoZSBCU1MgaW1tZWRpYXRlbHkKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luaW5nICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwT2lkQnNzaWRbMF0scE9pZEJzc2lkWzFdLHBPaWRCc3NpZFsyXSxwT2lkQnNzaWRbM10scE9pZEJzc2lkWzRdLHBPaWRCc3NpZFs1XSkpOworCisJCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgcEFkLT5NbG1lQXV4LkJzc0lkeCk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksICZKb2luUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOworCQl9CisJfQorfQorCisvLyBSb2FtaW5nIGlzIHRoZSBvbmx5IGV4dGVybmFsIHJlcXVlc3QgdHJpZ2dlcmluZyBDTlRMIHN0YXRlIG1hY2hpbmUKKy8vIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9lcmF0aW9ucworLy8gaGFwcGVuIGluIHNlcXVlbmNlLCBiZWNhdXNlIG5vIG90aGVyIFNFVCBPSUQgd2lsbCBiZSBzZW50IHRvIHRoaXMgZGV2aWNlCisvLyB1bnRpbCB0aGUgdGhlIHByZXZpb3VzIFNFVCBvcGVyYXRpb24gaXMgY29tcGxldGUgKHN1Y2Nlc3NmdWwgbyBmYWlsZWQpLgorLy8gU28sIGhvdyBkbyB3ZSBxdWFyYW50ZWUgdGhpcyBST0FNSU5HIHJlcXVlc3Qgd29uJ3QgY29ycnVwdCBvdGhlciAiU0VUIE9JRCI/CisvLyBvciBiZWVuIGNvcnJ1cHRlZCBieSBvdGhlciAiU0VUIE9JRCI/CisvLworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCS8vIFRPRE86CisJLy8gQVAgaW4gZGlmZmVyZW50IGNoYW5uZWwgbWF5IHNob3cgbG93ZXIgUlNTSSB0aGFuIGFjdHVhbCB2YWx1ZT8/CisJLy8gc2hvdWxkIHdlIGFkZCBhIHdlaWdodGluZyBmYWN0b3IgdG8gY29tcGVuc2F0ZSBpdD8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOworCisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCAmcEFkLT5NbG1lQXV4LlJvYW1UYWIsIHNpemVvZihwQWQtPk1sbWVBdXguUm9hbVRhYikpOworCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7CisKKwlCc3NUYWJsZVNvcnRCeVJzc2koJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiKTsKKwlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwlJdGVyYXRlT25Cc3NUYWIocEFkKTsKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZERMU1NldHVwUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFJUXzgwMl8xMV9ETFMJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRWxlbS0+TXNnOworCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwlJTlQJCQkJCWk7CisJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9VTlNQRUNJRlk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSAoT0lEIHNldCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWQsIENvdW50RG93blRpbWVyPSVkKVxuIiwKKwkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSwKKwkJcERMUy0+VmFsaWQsIHBETFMtPlN0YXR1cywgcERMUy0+VGltZU91dCwgcERMUy0+Q291bnREb3duVGltZXIpKTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCS8vIERMUyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgd2hlbiBBZGhvYyBtb2RlCisJaWYgKElORlJBX09OKHBBZCkpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQkocERMUy0+VGltZU91dCA9PSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyAxLiBTYW1lIHNldHRpbmcsIGp1c3QgZHJvcCBpdAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHNldHRpbmcgdW5jaGFuZ2VkXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICghcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDIuIERpc2FibGUgRExTIGxpbmsgY2FzZSwganVzdCB0ZWFyIGRvd24gRExTIGxpbmsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzdGFydCB0ZWFyIGRvd24gcHJvY2VkdXJlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiAhcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCisJCQl7CisJCQkJLy8gMy4gRW5hYmxlIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisKKwkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyBzZXR1cCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYgIU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDQuIHVwZGF0ZSBtYWMgY2FzZSwgdGVhciBkb3duIG9sZCBETFMgYW5kIHNldHVwIG5ldyBETFMKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB0ZWFyIGRvd24gYW5kIHJlc3RhcnQgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSBwRExTLT5UaW1lT3V0KSkKKwkJCXsKKwkJCQkvLyA1LiB1cGRhdGUgdGltZW91dCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dAk9IHBETFMtPlRpbWVPdXQ7CisJCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdXBkYXRlIHRpbWVvdXQgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzICE9IERMU19GSU5JU0gpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDYuIHJlLXNldHVwIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHJldHJ5IHNldHVwIHByb2NlZHVyZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sKCJDTlRMIC0gRExTIG5vdCBjaGFuZ2VkIGluIGVudHJ5IC0gJWQgLSBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkXG4iLAorCQkJCQlpLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSk7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsXG4iKSk7CisKKwkgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisKKwkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJLy8gY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZQorCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yPT0wKSAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKKwkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJCX0KKwkJLy8gY2FzZSAyLiB0cnkgZWFjaCBtYXRjaGVkIEJTUworCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRKb2luUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9KT0lOX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCS8vIDEuIGpvaW5lZCBhbiBJQlNTLCB3ZSBhcmUgcHJldHR5IG11Y2ggZG9uZSBoZXJlCisJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJeworCQkJICAgIC8vCisJCQkJLy8gNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46CisJCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgorCQkJCS8vCisJCQkJaWYgKCAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJICAgKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIEpvaW4gYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW4gdGhlIElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKworICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQl9CisJCQkvLyAyLiBqb2luZWQgYSBuZXcgSU5GUkEgbmV0d29yaywgc3RhcnQgZnJvbSBhdXRoZW50aWNhdGlvbgorCQkJZWxzZQorCQkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCS8vIEFkZCBBdXRoTW9kZSAiTEVBUCIgZm9yIENDWCAxLlgKKwkJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCQl7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIENJU0NPX0F1dGhNb2RlTEVBUCk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQl7CisJCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8CisJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCisJCQkJCXsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0U3RhcnRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZXN1bHQ7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU1RBUlRfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkgICAgLy8KKwkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgorCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgorCQkJLy8KKwkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkgICApCisJCQl7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgU3RhcnQgYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJcmV0dXJuOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlOX0NoYW5uZWxDaGVjayhwQWQpOworCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sIDE2KTsKKwkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7CisKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKKwkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCisJCQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQl9CisJCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCS8vIEJlZm9yZSBzZW5kIGJlYWNvbiwgZHJpdmVyIG5lZWQgZG8gcmFkYXIgZGV0ZWN0aW9uCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCApCisJCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TSUxFTkNFX01PREU7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCA9IDA7CisjaWZkZWYgREZTX1NVUFBPUlQKKwkJCQlCYnBSYWRhckRldGVjdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIHN0YXJ0IGEgbmV3IElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBTdGFydCBJQlNTIGZhaWwuIEJVRyEhISEhXG4iKSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7CisJCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8KKwkJCS8vIENpc2NvIExlYXAgQ0NLTSBzdXBwb3J0ZWQgUmUtYXNzb2NpYXRpb24uCisJCQkvLworCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5DQ0tNTGlua1VwRmxhZyA9PSBUUlVFKSkKKwkJCXsKKwkJCQkvL2lmIENDS00gaXMgdHVybiBvbiAsIHRoYXQncyBtZWFuIEZhc3QgUmVhdXRoZW50aWNhdGlvbgorCQkJCS8vVXNlIENDS00gUmVhc3NvY2lhdGlvbiBpbnN0ZWFkIG9mIG5vcm1hbCBhc3NvY2lhdGlvbiBmb3IgRmFzdCBSb2FtaW5nLgorCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVGhpcyBmYWlsIG1heSBiZWNhdXNlIG9mIHRoZSBBUCBhbHJlYWR5IGtlZXAgdXMgaW4gaXRzIE1BQyB0YWJsZSB3aXRob3V0CisJCQkvLyBhZ2Vpbmctb3V0LiBUaGUgcHJldmlvdXMgYXV0aGVudGljYXRpb24gYXR0ZW1wdCBtdXN0IGhhdmUgbGV0IGl0IHJlbW92ZSB1cy4KKwkJCS8vIHNvIHRyeSBBdXRoZW50aWNhdGlvbiBhZ2FpbiBtYXkgaGVscC4gRm9yIEQtTGluayBEV0wtOTAwQVArIGNvbXBhdGliaWxpdHkuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgYWdhaW4uLi5cbiIpKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vQWRkIEF1dGhNb2RlICJMRUFQIiBmb3IgQ0NYIDEuWAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQ0lTQ09fQXV0aE1vZGVMRUFQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKKwkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQorCQkJCXsKKwkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAorCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQl9CisJCQl9CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXV0aFByb2MyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKKwlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIE9LXG4iKSk7CisJCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLyBQcm9jZXNzIExFQVAgZmlyc3QsIHNpbmNlIGl0IHVzZSBkaWZmZXJlbnQgY29udHJvbCB2YXJpYWJsZQorCQkJLy8gV2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgcG92ZW4gb3BlcmF0aW9uCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQkvLyBMRUFQIEF1dGggbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSAqTEVBUCogQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUb3RhbCBtYXRjaCBCU1NJRCBbPSVkXVxuIiwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYKKwkJCQkgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgT1BFTiBzeXN0ZW0uLi5cbiIpKTsKKwkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsgLy8/Pz8/Pz8/CisJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQkJfQorCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVhc29uOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FTU09DX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQl7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVzdWx0OworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFQVNTT0NfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJLy8KKwkJCS8vIE5ESVMgcmVxdWlyZXMgYSBuZXcgTGluayBVUCBpbmRpY2F0aW9uIGJ1dCBubyBMaW5rIERvd24gZm9yIFJFLUFTU09DCisJCQkvLworCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKKworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBhc3NvY2lhdGlvbgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJeworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gcmVhc3NvYyBmYWlsZWQsIHRyeSB0byBwaWNrIG5leHQgQlNTIGluIHRoZSBCU1MgVGFibGUKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOworCQkJcEFkLT5NbG1lQXV4LlJvYW1JZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYjIocEFkKTsKKwkJfQorCX0KK30KKworCitWT0lECUFkaG9jVHVybk9uUW9zKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNkZWZpbmUgQUMwX0RFRl9UWE9QCQkwCisjZGVmaW5lIEFDMV9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzJfREVGX1RYT1AJCTk0CisjZGVmaW5lIEFDM19ERUZfVFhPUAkJNDcKKworCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBMaW5rVXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzVHlwZSkKK3sKKwlVTE9ORwlOb3c7CisJVUlOVDMyCURhdGE7CisJQk9PTEVBTglDYW5jZWxsZWQ7CisJVUNIQVIJVmFsdWUgPSAwLCBpZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJLy8KKwkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgorCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKKwkvLyAhISEgTElOSyBET1dOICEhIQorCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJLy8KKwkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAorCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCisJLy8KKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisKKwlDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIEl0J3MgcXVpdGUgZGlmZmljdWx0IHRvIHRlbGwgaWYgYSBuZXdseSBhZGRlZCBLRVkgaXMgV0VQIG9yIENLSVAgdW50aWwgYSBuZXcgQlNTCisJLy8gaXMgZm9ybWVkIChlaXRoZXIgQVNTT0MvUkUtQVNTT0MgZG9uZSBvciBJQlNTIHN0YXJ0ZWQuIExpbmtVUCBzaG91bGQgYmUgYSBzYWZlIHBsYWNlCisJLy8gdG8gZXhhbWluZSBpZiBjaXBoZXIgYWxnb3JpdGhtIHN3aXRjaGluZyBpcyByZXF1aXJlZC4KKwkvL3J0Mjg2MGIuIERvbid0IGtub3cgd2h5IG5lZWQgdGhpcworCVN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKHBBZCk7CisKKworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCS8vIE5vIGNhcnJpZXIgZGV0ZWN0aW9uIHdoZW4gYWRob2MKKwkJLy8gQ2FycmllckRldGVjdGlvblN0b3AocEFkKTsKKwkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5DRF9TdGF0ZSA9IENEX05PUk1BTDsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCUFkaG9jVHVybk9uUW9zKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhQWRob2MgTElOSyBVUCAhISEgXG4iICkpOworCX0KKwllbHNlCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhSW5mcmEgTElOSyBVUCAhISEgXG4iICkpOworCX0KKworCS8vIDMqMworCS8vIHJlc2V0IFR4IGJlYW1mb3JtaW5nIGJpdAorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAofjB4MDEpOworCVZhbHVlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgJj0gMHhmZmZmZmZmZTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwl9CisJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisgICAgeworCSAgICAvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhIHw9IDB4MTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkgICAgVmFsdWUgfD0gKDB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7CisJCQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgeworCSAgICBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhICY9IDB4ZmZmZmZmZmU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISAyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7CisgICAgfQorCisJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisJLy8KKwkvLyBTYXZlIEJCUF9SNjYgdmFsdWUsIGl0IHdpbGwgYmUgdXNlZCBpbiBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24KKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChCc3NUeXBlPSVkLCBBSUQ9JWQsIHNzaWQ9JXMsIENoYW5uZWw9JWQsIENlbnRyYWxDaGFubmVsID0gJWQpXG4iLAorCQlCc3NUeXBlLCBwQWQtPlN0YUFjdGl2ZS5BaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKERlbnNpdHkgPSVkLCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1wZHVEZW5zaXR5KSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworCisJLy8gQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQKKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQorCXsKKwkJLy8gVXBkYXRlIEhUIHByb3RlY3Rpb25mb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4KKyAgICAJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKKyAgICAJeworICAgIAkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgVFJVRSk7CisgICAgCX0KKyAgICAJZWxzZQorICAgCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9EUlMpKTsKKworCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlICE9IFJ0ODAyXzExUHJlYW1ibGVMb25nKSAmJgorCQlDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04ocEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8pKQorCXsKKwkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworCX0KKworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkKKwl7CisjaWZkZWYgREZTX1NVUFBPUlQKKwkJUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKwl9CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisKKwlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlNYWtlSWJzc0JlYWNvbihwQWQpOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJOyAvL0RvIG5vdGhpbmcKKwkJfQorCQllbHNlCisJCXsKKwkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOworCQl9CisKKwkJLy8gSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLgorCQkvLyBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQkFTRSwgMHgwMCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTgwOCwgMHgwMCk7CisKKwkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKKwkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisJCXsKKwkJCVBVQ0hBUglLZXk7CisJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCisJCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKKyAgICAgICAgCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKKworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCisJCQkJeworCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCQkJeworCQkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJCX0KKwkJCQl9CisKKworCQkJfQorCQl9CisJCS8vIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYworCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8vIGFsd2F5cyBiZSB6ZXJvCisKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgIH0KKworCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmtub3cgQ2lwaGVyICg9JWQpLCBzZXQgQ2lwaGVyIHRvIEFFU1xuIiwgcEFkLT5TdGFDZmcuUGFpckNpcGhlcikpOworCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgICAgICB9CisKKwkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCSAgMCwKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCAwLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsIE5VTEwpOworCisJCX0KKworCX0KKwllbHNlIC8vIEJTU19JTkZSQQorCXsKKwkJLy8gQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lECisJCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCisJCQl7CisJCQkJaWYgKFJUTVBDb21wYXJlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbikgPT0gMCkKKwkJCQl7CisJCQkJCS8vIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIFNlbmQgbGluayBkb3duIGV2ZW50IGJlZm9yZSBzZXQgdG8gbGluayB1cAorCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBQSFcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8KKwkJLy8gT24gV1BBIG1vZGUsIFJlbW92ZSBBbGwgS2V5cyBpZiBub3QgY29ubmVjdCB0byB0aGUgbGFzdCBCU1NJRAorCQkvLyBLZXkgd2lsbCBiZSBzZXQgYWZ0ZXIgNC13YXkgaGFuZHNoYWtlLgorCQkvLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJCXsKKwkJCVVMT05HIAkJSVY7CisKKwkJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCisJCQkvLyBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQCisJCQkvLyBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4KKwkJCUlWID0gMDsKKwkJCUlWIHw9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOworCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIEJTU0lEX1dDSUQsIElWLCAwKTsKKwkJfQorCQkvLyBOT1RFOgorCQkvLyB0aGUgZGVjaXNpb24gb2YgdXNpbmcgInNob3J0IHNsb3QgdGltZSIgb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvCisJCS8vIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisKKwkJLy8gTk9URToKKwkJLy8gdGhlIGRlY2lzaW9uIHRvIHVzZSAiUlRDL0NUUyIgb3IgIkNUUy10by1zZWxmIiBwcm90ZWN0aW9uIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5CisJCS8vIGR1ZSB0byBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCisJCUNvbXBvc2VQc1BvbGwocEFkKTsKKwkJQ29tcG9zZU51bGxGcmFtZShwQWQpOworCisJCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCisJCS8vIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZQorCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJLy8gYWRkIHRoaXMgQlNTSUQgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCXsKKwkJCVVDSEFSIEhhc2hJZHg7CisKKwkJCS8vcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisKKwkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSYmCisgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkmJgorICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8CisgICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSYmCisgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKSkKKyNlbHNlCisJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl7CisJCQlQVUNIQVIJS2V5OworCQkJVUNIQVIgCUNpcGhlckFsZzsKKworCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCisgICAgICAgIAl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQorCQkJCXsKKwkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQkJCXsKKwkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUKKwkJLy8gc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4KKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKyAgICAgICAgLy8gRm9yIEdVSSArKworCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCX0KKyAgICAgICAgLy8gLS0KKworCQkvLyBBZGQgQlNTSUQgaW4gbXkgTUFDIFRhYmxlLgorICAgICAgICBOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCQlSVE1QTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFpZCA9IEJTU0lEX1dDSUQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0ucEFkID0gcEFkOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlZhbGlkQXNDTEkgPSBUUlVFOwkvL0FsdGhvdWdoIHRoaXMgaXMgYnNzaWQuLnN0aWxsIHNldCBWYWxpZEFzQ2wKKwkJcEFkLT5NYWNUYWIuU2l6ZSA9IDE7CS8vIGluZnJhIG1vZGUgYWx3YXlzIHNldCBNQUN0YWIgc2l6ZSA9MS4KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Tc3QgPSBTU1RfQVNTT0M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQXV0aFN0YXRlID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgIENsaWVudFN0YXR1c0ZsYWdzPSVseClcbiIsCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisKKwkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBUUlVFLCBCU1MwKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISAoU3RhQWN0aXZlLmJIdEVuYWJsZSA9JWQsIClcbiIsIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gUmVwb3J0IEFkamFjZW50IEFQIHJlcG9ydC4KKwkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJQ0NYQWRqYWNlbnRBUFJlcG9ydChwQWQpOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQorCQl7CisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKQorCQkJeworCisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworICAgICAgICAgICAgICAgIFJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUdXJuIG9uIFBpZ2d5LUJhY2tcbiIpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApCisJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQkJeworCQkJCUFzaWNFbmFibGVSREcocEFkKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQl9CisJCWVsc2UKKwkJeworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOworCQl9CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCBFdmVudCBCIS5CQUNhcGFiaWxpdHkgPSAleC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAlbHhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTEVECisJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX1VQKTsKKworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOyAgICAgICAgLy8gUmVzZXQgY29uZmlnIGZsYWcKKwlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCisJLy8gU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sKKwl7CisJCVBVQ0hBUgkJCQkJcFRhYmxlOworCQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKKwkJQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHBBZCwgcFRhYmxlKTsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworICAgIHBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKQorCXsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKQorCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA+IE1DU183KSB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgorCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pCisJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCX0KKwllbHNlCisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkvLyAgTGV0IExpbmsgU3RhdHVzIFBhZ2UgZGlzcGxheSBmaXJzdCBpbml0aWFsIHJhdGUuCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7CisJLy8gU2VsZWN0IERBQyBhY2NvcmRpbmcgdG8gSFQgb3IgTGVnYWN5CisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdICE9IDB4MDApCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCXsKKwkJICAgIFZhbHVlIHw9IDB4MTA7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJeworCX0KKwllbHNlIGlmIChwRW50cnktPk1heFJBbXBkdUZhY3RvciA9PSAwKQorCXsKKwkgICAgLy8gSWYgSFQgQVAgZG9lc24ndCBzdXBwb3J0IE1heFJBbXBkdUZhY3RvciA9IDEsIHdlIG5lZWQgdG8gc2V0IG1heCBQU0RVIHRvIDAuCisJICAgIC8vIEJlY2F1c2Ugb3VyIEluaXQgdmFsdWUgaXMgMSBhdCBNQUNSZWdUYWJsZS4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MGZmZik7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUGF0Y2ggZm9yIE1hcnZlbCBBUCB0byBnYWluIGhpZ2ggdGhyb3VnaHB1dAorCS8vIE5lZWQgdG8gc2V0IGFzIGZvbGxvd2luZywKKwkvLyAxLiBTZXQgdHhvcCBpbiByZWdpc3Rlci1FRENBX0FDMF9DRkcgYXMgMHg2MAorCS8vIDIuIFNldCBFblRYV3JpdGVCYWNrRERPTkUgaW4gcmVnaXN0ZXItV1BETUFfR0xPX0NGRyBhcyB6ZXJvCisJLy8gMy4gUEJGX01BWF9QQ05UIGFzIDB4MUYzRkJGOUYKKwkvLyA0LiBraWNrIHBlciB0d28gcGFja2V0cyB3aGVuIGRlcXVldWUKKwkvLworCS8vIFR4b3AgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBSREcgaXMgb2ZmLCBXTU0gaXMgZGlzYWJsZSBhbmQgVHhCdXJzdCBpcyBlbmFibGUKKwkvLworCS8vIGlmIDEuIExlZ2FjeSBBUCBXTU0gb24sICBvciAyLiAxMW4gQVAsIEFNUERVIGRpc2FibGUuICBGb3JjZSB0dXJuIG9mZiBidXJzdCBubyBtYXR0ZXIgd2hhdCBiRW5hYmxlVHhCdXJzdCBpcy4KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDFcbiIpKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCURhdGEgIHw9IDB4NjA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gVFJVRTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRkJGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDJcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKwkJRGF0YSAgJj0gMHhGRkZGRkYwMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDNcbiIpKTsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBSZS1jaGVjayB0byB0dXJuIG9uIFRYIGJ1cnN0IG9yIG5vdC4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID09IFRSVUUpICYmICgoU1RBX1dFUF9PTihwQWQpKXx8KFNUQV9US0lQX09OKHBBZCkpKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IFRSVUU7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJeworCQkgICAgVUlOVDMyIE1BQ1ZhbHVlID0gMDsKKwkJCS8vIEZvcmNlIGRpc2FibGUgIFRYT1AgdmFsdWUgaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSBhY3Rpb24gaW4gTUxNRVVwZGF0ZVByb3RlY3QgdG9vLgorCQkJLy8gSSBkaWRuJ3QgY2hhbmdlIFBCRl9NQVhfUENOVCBzZXR0aW5nLgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAgJj0gMHhGRkZGRkYwMDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgTUFDVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IEZBTFNFOworCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcEFkLT5iTmV4dERpc2FibGVSeEJBPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSkpOworCS8vIEJTU0lEIGFkZCBpbiBvbmUgTUFDIGVudHJ5IHRvby4gIEJlY2F1c2UgaW4gVHgsIEFTSUMgbmVlZCB0byBjaGVjayBDaXBoZXIgYW5kIElWL0VJViwgQkFiaXRtYXAKKwkvLyBQdGhlciBpbmZvcm1hdGlvbiBpbiBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSBpcyBub3QgbmVjZXNzYXJ5IGZvciBkcml2ZXIuCisJLy8gTm90ZTogQXMgU1RBLCBUaGUgTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uIFBhaXJ3aXNlS2V5IGFuZCBTaGFyZWQgS2V5IGZvciBCU1MwIGFyZSB0aGUgc2FtZS4KKworICAgIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPD0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorICAgIHsKKyAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKyAgICAvLworCS8vIFBhdGNoIEF0aGVyb3MgQVAgVFggd2lsbCBicmVha2Rvd24gaXNzdWUuCisJLy8gQVAgTW9kZWw6IERMaW5rIERXTC04MjAwQVAKKwkvLworCWlmIChJTkZSQV9PTihwQWQpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgU1RBX1RLSVBfT04ocEFkKSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDEpOworCX0KKwllbHNlCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAwKTsKKwl9CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLmIyMDQwQ29leGlzdFNjYW5TdXApICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDExKSkKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOworCQlCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QocEFkKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlEaXNjb25uZWN0IGN1cnJlbnQgQlNTSUQKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlJc1JlcUZyb21BUAkJLSBSZXF1ZXN0IGZyb20gQVAKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlXZSBuZWVkIG1vcmUgaW5mb3JtYXRpb24gdG8ga25vdyBpdCdzIHRoaXMgcmVxdXN0IGZyb20gQVAuCisJCUlmIHllcyEgd2UgbmVlZCB0byBkbyBleHRyYSBoYW5kbGluZywgZm9yIGV4YW1wbGUsIHJlbW92ZSB0aGUgV1BBIGtleS4KKwkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpZWQsIHNpbmNlIHRoZSBXUEEga2V5IGRpZG4ndCBiZQorCQlyZW1vdmUgd2hpbGUgYXV0byByZWNvbm5lY3QuCisJCURpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIEFQLCBpdCBtZWFucyB3ZSB3aWxsIHN0YXJ0IGFmcmVzaCA0LXdheSBoYW5kc2hha2luZworCQlvbiBXUEEgbW9kZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBMaW5rRG93bigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgIElzUmVxRnJvbUFQKQoreworCVVDSEFSCQkJICAgIGksIEJ5dGVWYWx1ZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXJldHVybjsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwl7CisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gISEhXG4iKSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKworCWlmIChBREhPQ19PTihwQWQpKQkJLy8gQWRob2MgbW9kZSBsaW5rIGRvd24KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMSEhIVxuIikpOworCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJQnNzVGFibGVEZWxldGVFbnRyeSgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNYWNUYWIuU2l6ZT0lZCAhISFcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwl9CisJZWxzZQkJCQkJLy8gSW5mcmEgc3RydWN0dXJlIG1vZGUKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMiEhIVxuIikpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIERMUyB0ZWFyIGRvd24gZnJhbWUgbXVzdCBiZSBzZW50IGJlZm9yZSBsaW5rIGRvd24KKwkJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gIERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworCQkvLyBTYXZlZCBsYXN0IFNTSUQgZm9yIGxpbmt1cCBjb21wYXJpc29uCisJCXBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKTsKKwkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJaWYgKHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9PSBUUlVFKQorCQl7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEEhXG4iKSk7CisJCQlwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIC8vCisJCQkvLyBJZiBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGlzIGZyb20gTkRJUywgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRlbGV0ZSBCU1NJRCBmcm9tIGVudHJ5LgorCQkJLy8gT3RoZXJ3aXNlIGxvc3QgYmVhY29uIG9yIHJlY2VpdmUgRGUtQXV0aGVudGljYXRpb24gZnJvbSBBUCwKKwkJCS8vIHRoZW4gd2Ugc2hvdWxkIGRlbGV0ZSBCU1NJRCBmcm9tIEJzc1RhYmxlLgorCQkJLy8gSWYgd2UgZG9uJ3QgZGVsZXRlIGZyb20gZW50cnksIHJvYW1pbmcgd2lsbCBmYWlsLgorCQkJLy8KKwkJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQl9CisKKwkJLy8gcmVzdG9yZSBiYWNrIHRvIC0KKwkJLy8gICAgICAxLiBsb25nIHNsb3QgKDIwIHVzKSBvciBzaG9ydCBzbG90ICg5IHVzKSB0aW1lCisJCS8vICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbgorCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKworCQlpZiAocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPT0gVFJVRSkKKwkJeworCQkJLy8KKwkJCS8vIFJlY29yZCBjdXJyZW50IEFQJ3MgaW5mb3JtYXRpb24uCisJCQkvLyBmb3IgbGF0ZXIgdXNlZCByZXBvcnRpbmcgQWRqYWNlbnQgQVAgcmVwb3J0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbik7CisJCQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQl9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCisJCWlmIChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlWzBdLCAyKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IHBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeTsKKwkJCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOworCQl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJfQorCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKKwkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKKwl9CisKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNaW4JPSA0OworCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCisJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7IC8vRkFMU0UpOworCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19ET1dOKTsKKyAgICBwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAweEYwOworICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKworCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKworCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKKwlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CisKKwlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJeworCQkvLyBSZW1vdmUgU3RhQ2ZnIEluZm9ybWF0aW9uIGFmdGVyIGxpbmsgZG93bgorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IDA7CisJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBSZXNldCBXUEEtUFNLIHN0YXRlLiBPbmx5IHJlc2V0IHdoZW4gc3VwcGxpY2FudCBlbmFibGVkCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN0YXRlICE9IFNTX05PVFVTRSkKKwl7CisJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisJCS8vIENsZWFyIFJlcGxheSBjb3VudGVyCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIDgpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKworCisJLy8KKwkvLyBpZiBsaW5rIGRvd24gY29tZSBmcm9tIEFQLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgV1BBIGtleXMgb24gV1BBIG1vZGUuCisJLy8gb3RoZXJ3aXNlIHdpbGwgY2F1c2UgNC13YXkgaGFuZHNoYWtpbmcgZmFpbGVkLCBzaW5jZSB0aGUgV1BBIGtleSBub3QgZW1wdHkuCisJLy8KKwlpZiAoKElzUmVxRnJvbUFQKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKKwkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKKwl9CisKKwkvLyA4MDIuMXggcG9ydCBjb250cm9sCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCS8vIFByZXZlbnQgY2xlYXIgUG9ydFNlY3VyZWQgaGVyZSB3aXRoIHN0YXRpYyBXRVAKKwkvLyBOZXR3b3JrTWFuZ2VyIHNldCBzZWN1cml0eSBwb2xpY3kgZmlyc3QgdGhlbiBzZXQgU1NJRCB0byBjb25uZWN0IEFQLgorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKKwkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBGQUxTRSkpCisJeworCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCX0KKwllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPSAwOworCisJLy8gVHVybiBvZmYgQ2tpcCBjb250cm9sIGZsYWcKKwlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gRkFMU0U7CisKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKworICAgIC8vcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOworCS8vcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOworCS8vcEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPSBGQUxTRTsKKyAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCisJLy8gUmVzZXQgdGhlIEN1cnJlbnQgQVAncyBJUCBhZGRyZXNzCisJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgNCk7CisjaWZkZWYgUlQyODcwCisJcEFkLT5iVXNiVHhCdWxrQWdncmUgPSBGQUxTRTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vIENsZWFuIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLkFzc29jSW5mbywgc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKSk7CisJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7CisJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSAwOworCXBBZC0+U3RhQ2ZnLlJlc1ZhcklFTGVuID0gMDsKKworCS8vCisJLy8gUmVzZXQgUlNTSSB2YWx1ZSBhZnRlciBsaW5rIGRvd24KKwkvLworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4ID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDggPSAwOworCisJLy8gUmVzdG9yZSBNbG1lUmF0ZQorCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vCisJLy8gQWZ0ZXIgTGluayBkb3duLCByZXNldCBwaWdneS1iYWNrIHNldHRpbmcgaW4gQVNJQy4gRGlzYWJsZSBSREcuCisJLy8KKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJ5dGVWYWx1ZSk7CisJCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCeXRlVmFsdWUpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkvLyBSZXNldCBEQUMKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCeXRlVmFsdWUpOworCUJ5dGVWYWx1ZSAmPSAofjB4MTgpOworCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJeworCQlCeXRlVmFsdWUgfD0gMHgxMDsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQnl0ZVZhbHVlKTsKKworCVJUTVBTZXRQaWdneUJhY2socEFkLEZBTFNFKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBSZXN0b3JlIGFsbCBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nLgorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfE9GRE1TRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOworCUFzaWNEaXNhYmxlUkRHKHBBZCk7CisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IEZBTFNFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7CisJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCA9IDA7CisJVHJpRXZlbnRJbml0KHBBZCk7CisJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKKwl7CisJCXBBZC0+Q2hhbm5lbExpc3RbaV0uYkVmZmVjdGVkQ2hhbm5lbCA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgxZmZmKTsKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSB7CisJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCXdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwl7CisJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisJfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEl0ZXJhdGVPbkJzc1RhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICBTdGFydFJlcTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICBKb2luUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKworCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cworCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCisJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LkJzc0lkeDsKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpCisJeworCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZworCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQl9CisJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkvLyBSU04gY2FwYWJpbGl0eQorCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OworCQl9CisKKwkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQl7CisJCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQlKb2luUGFybUZpbGwocEFkLCAmSm9pblJlcSwgQnNzSWR4KTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLAorCQkJCQkmSm9pblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIEJTUyBmYWlsOyBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKKwkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7CisJfQorCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHN0YXkgQCBjaCAjJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCX0KK30KKworLy8gZm9yIHJlLWFzc29jaWF0aW9uIG9ubHkKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUIFJlYXNzb2NSZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OworCUJTU19FTlRSWSAgICAgICAgICAgICAgICpwQnNzOworCisJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LlJvYW1JZHg7CisJcEJzcyA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NFbnRyeVtCc3NJZHhdOworCisJaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsKTsKKworCQkvLyByZWFzc29jaWF0ZSBtZXNzYWdlIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgYXNzb2NpYXRlIG1lc3NhZ2UKKwkJQXNzb2NQYXJtRmlsbChwQWQsICZSZWFzc29jUmVxLCBwQnNzLT5Cc3NpZCwgcEJzcy0+Q2FwYWJpbGl0eUluZm8sCisJCQkJCSAgQVNTT0NfVElNRU9VVCwgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKKwkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCQkJc2l6ZW9mKE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUKSwgJlJlYXNzb2NSZXEpOworCisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfUkVBU1NPQzsKKwl9CisJZWxzZSAvLyBubyBtb3JlIEJTUworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBmYXN0IHJvYW1pbmcgZmFpbGVkLCBiYWNrIHRvIGNoICMlZFxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEpvaW5QYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCisJSU4gVUxPTkcgQnNzSWR4KQoreworCUpvaW5SZXEtPkJzc0lkeCA9IEJzc0lkeDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU2NhblBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVUNIQVIgU2NhblR5cGUpCit7CisgICAgTmRpc1plcm9NZW1vcnkoU2NhblJlcS0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlTY2FuUmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShTY2FuUmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwlTY2FuUmVxLT5Cc3NUeXBlID0gQnNzVHlwZTsKKwlTY2FuUmVxLT5TY2FuVHlwZSA9IFNjYW5UeXBlOworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBEbHNQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKKwlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAorCUlOIFVTSE9SVCByZWFzb24pCit7CisJcERsc1JlcS0+cERMUyA9IHBEbHM7CisJcERsc1JlcS0+UmVhc29uID0gcmVhc29uOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTdGFydFBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4pCit7CisJQVNTRVJUKFNzaWRMZW4gPD0gTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShTdGFydFJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJU3RhcnRSZXEtPlNzaWRMZW4gPSBTc2lkTGVuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBdXRoUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAorCUlOIFBVQ0hBUiBwQWRkciwKKwlJTiBVU0hPUlQgQWxnKQoreworCUNPUFlfTUFDX0FERFIoQXV0aFJlcS0+QWRkciwgcEFkZHIpOworCUF1dGhSZXEtPkFsZyA9IEFsZzsKKwlBdXRoUmVxLT5UaW1lb3V0ID0gQVVUSF9USU1FT1VUOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworCisjaWZkZWYgUlQyODcwCisKK1ZPSUQgTWxtZUNudGxDb25maXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVVNIT1JUIE1zZykKK3sKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNc2dUeXBlLCBzaXplb2YoVVNIT1JUKSwgJk1zZyk7Cit9CisKK1ZPSUQgQ29tcG9zZVBzUG9sbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQVFhJTkZPX1NUUlVDCQlwVHhJbmZvOworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvbXBvc2VQc1BvbGxcbiIpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworCisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gMDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfUFNfUE9MTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkFpZCA9IHBBZC0+U3RhQWN0aXZlLkFpZCB8IDB4QzAwMDsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+UHNQb2xsRnJhbWUuVGEsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7CisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihQU1BPTExfRlJBTUUpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihQU1BPTExfRlJBTUUpKSwKKwkJMCwgIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7CisJLy8gQXBwZW5kIDQgZXh0cmEgemVybyBieXRlcy4KKwlwQWQtPlBzUG9sbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YoUFNQT0xMX0ZSQU1FKSArIDQ7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBDb21wb3NlTnVsbEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBUWElORk9fU1RSVUMJCXBUeEluZm87CisJUFRYV0lfU1RSVUMJCXBUeFdJOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHNpemVvZihIRUFERVJfODAyXzExKStUWFdJX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKwlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKKwkJMCwgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYV0lfU0laRStUWElORk9fU0laRV0sICZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHBBZC0+TnVsbEZyYW1lKSArIDQ7Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmUtYnVpbGQgYSBCRUFDT04gZnJhbWUgaW4gdGhlIHNoYXJlZCBtZW1vcnkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HIE1ha2VJYnNzQmVhY29uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAweDA0fTsKKwlIRUFERVJfODAyXzExIEJjbkhkcjsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQVFhXSV9TVFJVQwkgIHBUeFdJID0gJnBBZC0+QmVhY29uVHhXSTsKKwlDSEFSICAgICAgICAgKnBCZWFjb25GcmFtZSA9IHBBZC0+QmVhY29uQnVmOworCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW4gPSAwOworCVVDSEFSICAgICAgICAgUlNOSWUgPSBJRV9XUEE7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQorCXsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcworCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCisJCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcworCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcworCQlTdXBSYXRlTGVuID0gNDsKKwkJRXh0UmF0ZUxlbiA9IDA7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwl7CisJCVN1cFJhdGVbMF0gID0gMHg4QzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVsyXSAgPSAweDk4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbNF0gID0gMHhiMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZUxlbiAgPSA4OworCQlFeHRSYXRlTGVuICA9IDA7CisKKwkJLy8KKwkJLy8gQWxzbyBVcGRhdGUgTWxtZVJhdGUgJiBSdHNSYXRlIGZvciBHIG9ubHkgJiBBIG9ubHkKKwkJLy8KKwkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwl9CisJZWxzZQorCXsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcworCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCisJCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcworCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcworCQlTdXBSYXRlTGVuID0gNDsKKworCQlFeHRSYXRlWzBdICA9IDB4MEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzJdICA9IDB4MTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbNF0gID0gMHgzMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVMZW4gID0gODsKKwl9CisKKwlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKworCS8vIGNvbXBvc2UgSUJTUyBiZWFjb24gZnJhbWUKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkJjbkhkciwgU1VCVFlQRV9CRUFDT04sIDAsIEJST0FEQ0FTVF9BRERSLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCUNhcGFiaWxpdHlJbmZvID0gQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOworCisJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lLCAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAgJkJjbkhkciwKKwkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKKwkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBTdXBSYXRlLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCS8vIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZworCWlmIChFeHRSYXRlTGVuKQorCXsKKwkJVUxPTkcJdG1wOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgICZ0bXAsCisJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAorCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBFeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKwkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQorCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCXsKKwkJVUxPTkcgdG1wOworICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJlJTTkllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAgICAgIAkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IHRtcDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVTE9ORyBUbXBMZW47CisJCVVDSEFSIEh0TGVuLCBIdExlbjE7CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworCQlBRERfSFRfSU5GT19JRQlhZGRIVEluZm9UbXA7CisJCVVTSE9SVAliMmxUbXAsIGIybFRtcDI7CisjZW5kaWYKKworCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOworCQlIdExlbjEgPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCisJCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAorCQkJCQkJICBIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCisJCQkJCQkgIEh0TGVuMSwJCQkJCSZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCU5kaXNNb3ZlTWVtb3J5KCZhZGRIVEluZm9UbXAsICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIEh0TGVuMSk7CisJCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSk7CisJCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAorCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKKwkJCQkJCSAgSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAorCQkJCQkJICBIdExlbjEsCQkJCQkmYWRkSFRJbmZvVG1wLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJRnJhbWVMZW4gKz0gVG1wTGVuOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vYmVhY29uIHVzZSByZXNlcnZlZCBXQ0lEIDB4ZmYKKyAgICBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAorCQkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uCisJCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdDsKKyAgICAgICAgVHJhbnNtaXQud29yZCA9IDA7CisgICAgICAgIFJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKyAgICAJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOworICAgIH0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCBwQmVhY29uRnJhbWUsIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWtlSWJzc0JlYWNvbiAobGVuPSVsZCksIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIENoYW5uZWw9JWQsIFBoeU1vZGU9JWRcbiIsCisJCQkJCUZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Rscy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvZGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZmJjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Rscy5jCkBAIC0wLDAgKzEsMjIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBkbHMuYworCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIFdNTS1ETFMgc3RhdGUgbWFjaGluZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMi0xNC0yMDA2CisJQXJ2aW4gVGFpCTA2LTAzLTIwMDgJICBNb2RpZmllZCBmb3IgUlQyOHh4CisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGRscyBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBkbHMgc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExTX0lETEUKKyAgICBNVDJfTUxNRV9ETFNfUkVRVUVTVCAgIE1sbWVEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVRVUVTVCAgIFBlZXJEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVTUE9OU0UgIFBlZXJEbHNSc3BBY3Rpb24KKyAgICBNVDJfTUxNRV9ETFNfVEVBUkRPV04gIE1sbWVUZWFyRG93bkFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19URUFSRE9XTiAgUGVlclRlYXJEb3duQWN0aW9uCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlVQ0hBUglpOworCisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgKFNUQVRFX01BQ0hJTkVfRlVOQyopVHJhbnMsIE1BWF9ETFNfU1RBVEUsIE1BWF9ETFNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIERMU19JRExFLCBETFNfTUFDSElORV9CQVNFKTsKKworICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JlcUFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUnNwQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNUZWFyRG93bkFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzVGVhckRvd25BY3Rpb24pOworCisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLnBBZCA9IHBBZDsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pLCBwQWQsIEZBTFNFKTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExCURsc1JlcUhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVFVRVNUOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCXJlYXNvbjsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZyZWFzb24pKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JlcUhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUmVxSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCTIsCQkJCQkJCSZwRExTLT5UaW1lT3V0LAorCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOworCUhFQURFUl84MDJfMTEJRGxzUnNwSGRyOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFU1BPTlNFOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCQlETFNUaW1lT3V0OworCVNIT1JUCQkJaTsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOworCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc0xlbjsKKyAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghUGVlckRsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJkRMU1RpbWVPdXQsCisJCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQorCQlyZXR1cm47CisKKyAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorICAgIGZvciAoaSA9IDA7IGkgPCBTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghSU5GUkFfT04ocEFkKSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEE7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UKKwl7CisJCS8vIGZpbmQgdGFibGUgdG8gdXBkYXRlIHBhcmFtZXRlcnMKKwkJZm9yIChpID0gKE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpID49IDA7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQl9CisKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQllbHNlCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBjYW4gbm90IGZpbmQgc2FtZSBlbnRyeSBcbiIpKTsKKwkJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlkgLSAxKTsgaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCQl7CisJCQkJaWYgKCFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCQl7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJfQorCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgPSBUUlVFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBTQSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCQl7CisKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlTdGF0dXNDb2RlID0gTUxNRV9RT1NfVU5TUEVDSUZZOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgRExTRW50cnkgdGFibGUgZnVsbChvbmx5IGNhbiBzdXBwb3J0ICVkIERMUyBzZXNzaW9uKSBcbiIsIE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgdXNlIGVudHJ5KCVkKSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlpLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCX0KKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JzcEhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCisJCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sIAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChwRExTICYmIChwRExTLT5TdGF0dXMgIT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJCQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKKwkJfQorCX0KKwllbHNlCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAorCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAorCQkJCQkJNiwJCQkJCQkJU0EsCisJCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkJRU5EX09GX0FSR1MpOworCX0KKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVAkJQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQlTdGF0dXNDb2RlOworCVNIT1JUCQlpOworCUJPT0xFQU4JCVRpbWVyQ2FuY2VsbGVkOworCVVDSEFSCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKyAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJSHRDYXBhYmlsaXR5TGVuOworCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXNDb2RlLAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGk9MDsgaTxTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFN0YXR1c0NvZGU9JWQsIENhcGFiaWxpdHlJbmZvPTB4JXhcbiIsCisJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFN0YXR1c0NvZGUsIENhcGFiaWxpdHlJbmZvKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQl7CisJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQl9CisKKwkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJeworCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJfQorCisJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCXsKKwkJCQkJCWogPSBpaS84OworCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQl7CisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQl7CisJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJeworCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQl7CisJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQl9CisJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCXsKKwkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJeworCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQl9CisKKwkJCQkvL2luaXRpYWxpemUgc2VxIG5vIGZvciBETFMgZnJhbWVzLgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgdXBkYXRlIHRpbWVvdXQgdmFsdWUgXG4iKSk7CisJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGk+PU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCQlDSEFSICAgIGlpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCQkJCQkJCXByaW50aygiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQkJeworCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCQl9CisJCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXsKKwkJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJCXsKKwkJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVU0hPUlQJCQlSZWFzb25Db2RlID0gUkVBU09OX1FPU19VTlNQRUNJRlk7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJCWk7CisKKwlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIHdpdGggUmVhc29uQ29kZT0lZCBcbiIsIFJlYXNvbkNvZGUpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmUmVhc29uQ29kZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJUmVhc29uQ29kZTsKKwlVSU5UCQkJaTsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmICghUGVlckRsc1RlYXJEb3duU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNUZWFyRG93bkFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBSZWFzb25Db2RlPSVkXG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBSZWFzb25Db2RlKSk7CisKKwkvLyBjbGVhciBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCQkJaTsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisKKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07CisKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQorCQkJeworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQoreworCVVMT05HCQkJaTsKKwlCT09MRUFOCQkJYkZpbmRFbnRyeSA9IEZBTFNFOworCUJPT0xFQU4JCQliU1RBS2V5RnJhbWUgPSBGQUxTRTsKKwlQRUFQT0xfUEFDS0VUCXBFYXA7CisJUFVDSEFSCQkJcFByb3RvLCBwQWRkciA9IE5VTEw7CisJUFVDSEFSCQkJcFNUQUtleSA9IE5VTEw7CisJVUNIQVIJCQlaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQkJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUgkJCWRpZ2VzdFs4MF07CisJVUNIQVIJCQlEbHNQVEtbODBdOworCVVDSEFSCQkJdGVtcFs2NF07CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCUNJUEhFUl9LRVkJCVBhaXJ3aXNlS2V5OworCisKKwlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKExlbiA8IExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlwUHJvdG8JPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExICsgMiArIDY7CS8vIFFPUyBDb250cm9sIGZpZWxkICwgMHhBQSAweEFBIDB4QUEgMHgwMCAweDAwIDB4MDAKKwlwQWRkcgk9IHBIZWFkZXItPkFkZHIyOworCisJLy8gTDJQQUQgYml0IG9uIHdpbGwgcGFkIDIgYnl0ZXMgYXQgTExDCisJaWYgKHBSeEQtPkwyUEFEKQorCXsKKwkJcFByb3RvICs9IDI7CisJfQorCisJaWYgKFJUTVBFcXVhbE1lbW9yeShFQVBPTCwgcFByb3RvLCAyKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQlwRWFwID0gKFBFQVBPTF9QQUNLRVQpIChwUHJvdG8gKyAyKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIExlbj0lbGQsIERhdGFMZW49JWQsIEtleU1pYz0lZCwgSW5zdGFsbD0lZCwgS2V5QWNrPSVkLCBTZWN1cmU9JWQsIEVLRF9ETD0lZCwgRXJyb3I9JWQsIFJlcXVlc3Q9JWRcbiIsIExlbiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2ssCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkpOworCisJCWlmICgoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpKSAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUKKwkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpCisJCXsKKwkJCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCQlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkJCShSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwkJCS8vUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyICglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCS8vIHB1dCB0aGVzZSBjb2RlIHNlZ21lbnQgdG8gZ2V0IHRoZSByZXBsYXkgY291bnRlcgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvLyBDaGVjayBNSUMgdmFsdWUKKwkJCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwkJCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwkJCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwkJCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJTmRpc1plcm9NZW1vcnkocEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUhNQUNfU0hBMSgoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQkJCU5kaXNNb3ZlTWVtb3J5KE1pYywJZGlnZXN0LAlMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCQkJfQorCisJCQlpZiAoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisJCQl9CisJCQllbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUlDIFZBTElEIGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7CisjaWYgMQorCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEMpCisJCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweDQzKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQorCQkJeworCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCisJCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2Vsc2UKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBGKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHhBQykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2VuZGlmCisKKwkJfQorCQllbHNlIGlmIChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUpKQorCQl7CisjaWYgMAorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworI2VuZGlmCisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAyKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQl9CisJfQorCisJLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NzAKKwkJCQl7CisJCQkJCVJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgS2V5SW5mbzsKKwkJCQkJQ09QWV9NQUNfQUREUihLZXlJbmZvLk1hY0FkZHIscEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCUtleUluZm8uTWFjVGFiTWF0Y2hXQ0lEPXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRDsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJktleUluZm8uQ2lwaGVyS2V5LCAgJlBhaXJ3aXNlS2V5LHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgUlRfQ01EX1NFVF9LRVlfVEFCTEUsICZLZXlJbmZvLCBzaXplb2YoUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSkpOworCQkJCX0KKwkJCQl7CisJCQkJCVBNQUNfVEFCTEVfRU5UUlkgcERMU0VudHJ5OworCQkJCQlwRExTRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJCXBETFNFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnPVBhaXJ3aXNlS2V5LkNpcGhlckFsZzsKKwkJCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEUsIHBETFNFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOworCQkJCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChQZWVyIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpIFxuIikpOworCisJCQkJUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChJbml0aWF0b3Igc2lkZSlcbiIpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQl9CisJCQl9CisKKwkJCWJGaW5kRW50cnkgPSBUUlVFOworCQl9CisJfQorCisJLy8gdXBkYXRlIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChwQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChiU1RBS2V5RnJhbWUpCisJCQl7CisJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJCQkJLy8gU1RBS2V5IGZyYW1lLCBhZGQgcGFpcndpc2Uga2V5IHRhYmxlLCBhbmQgc2VuZCBTVEFrZXkgTXNnLTIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCQlQYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5LZXksICZwU1RBS2V5WzBdLCBMRU5fVEtJUF9FSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuVHhNaWMsICZwU1RBS2V5WzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5SeE1pYywgJnBTVEFLZXlbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7CisKKwkJCQlwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJLy9Bc2ljQWRkS2V5RW50cnkocEFkLCAoVVNIT1JUKShpICsgMiksIEJTUzAsIDAsICZQYWlyd2lzZUtleSwgVFJVRSwgVFJVRSk7CS8vIHJlc2VydmUgMCBmb3IgbXVsdGljYXN0LCAxIGZvciB1bmljYXN0CisJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisjaWZkZWYgUlQyODcwCisJCQkJeworCQkJCQlSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIEtleUluZm87CisJCQkJCUNPUFlfTUFDX0FERFIoS2V5SW5mby5NYWNBZGRyLHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlLZXlJbmZvLk1hY1RhYk1hdGNoV0NJRD1wQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQ7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlJbmZvLkNpcGhlcktleSwgICZQYWlyd2lzZUtleSxzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfS0VZX1RBQkxFLCAmS2V5SW5mbywgc2l6ZW9mKFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKTsKKwkJCQl9CisJCQkJeworCQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBETFNFbnRyeTsKKwkJCQkJcERMU0VudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCQlwRExTRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZz1QYWlyd2lzZUtleS5DaXBoZXJBbGc7CisJCQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgUlRfQ01EX1NFVF9SWF9XQ0lEX1RBQkxFLCBwRExTRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoSW5pdGlhdG9yIFNUQSBNQUMgQWRkcmVzcyBTVEFLZXkpXG4iKSk7CisKKwkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQlpZiAoUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UocEFkLCBwQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQl7CisJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoUGVlciBzaWRlKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEYXRhIGZyYW1lLCB1cGRhdGUgdGltZW91dCB2YWx1ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQl9CisJCQl9CisKKwkJCWJGaW5kRW50cnkgPSBUUlVFOworCQl9CisJfQorCisKKwlyZXR1cm4gYlNUQUtleUZyYW1lOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlETFMgZW50cnkgaW5kZXgKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJUlRNUENoZWNrRExTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCit7CisJSU5UIHJ2YWwgPSAtMTsKKwlJTlQJaTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybiBydmFsOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm4gcnZhbDsKKworCWRveworCQkvLyBjaGVjayBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJcnZhbCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBjaGVjayBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJcnZhbCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlIRUFERVJfODAyXzExCURsc1RlYXJEb3duSGRyOworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVTSE9SVAkJCVJlYXNvbiA9IFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1M7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047CisJVUNIQVIJCQlpID0gMDsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgXG4iKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFTU09DIC0gUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzVGVhckRvd25IZHIsCisJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJNiwJCQkJCQkJcERBLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmUmVhc29uLAorCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gUmVtb3ZlIGtleSBpbiBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBhbmQgcmVtb3ZlIGtleSBpbiAoaT0lZCkgXG4iLCBpKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSkKK3sKKwlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07CisJTkRJU19TVEFUVVMJCQlOU3RhdHVzOworCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQJCVBhY2tldDsKKwlVQ0hBUgkJCQlNaWNbMTZdOworCVVDSEFSCQkJCWRpZ2VzdFs4MF07CisJUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7CisJVUNIQVIJCQkJdGVtcFs2NF07CisJVUNIQVIJCQkJRGxzUFRLWzgwXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKKworCXBBZC0+U2VxdWVuY2UgKys7CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kUGVlciBNQUMgYWRkcmVzcworCisJLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKKwlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworICAgIH0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0CT0gMTsKKworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKKworCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7CisKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBOU3RhdHVzOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCS8vIGNhbGN1bGF0ZSBNSUMKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7CisJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7CisJCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5UmVxdWVzdC0gU2VuZCBTVEFLZXkgcmVxdWVzdCAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKKworCXJldHVybiBOU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSkKK3sKKwlVQ0hBUgkJCQlIZWFkZXI4MDJfM1sxNF07CisJTkRJU19TVEFUVVMJCQlOU3RhdHVzOworCVVMT05HCQkJCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQJCVBhY2tldDsKKwlVQ0hBUgkJCQlNaWNbMTZdOworCVVDSEFSCQkJCWRpZ2VzdFs4MF07CisJUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJcE5kaXNQYWNrZXQ7CisJVUNIQVIJCQkJdGVtcFs2NF07CisJVUNIQVIJCQkJRGxzUFRLWzgwXTsJCQkvLyBEdWUgdG8gZGlydmVyIGNhbiBub3QgZ2V0IFBUSywgdXNlIHByb3ByaWV0YXJ5IFBUSworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7CisKKwlwQWQtPlNlcXVlbmNlICsrOworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZCBQZWVyIE1BQyBhZGRyZXNzCisKKwkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQorCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworICAgIH0KKyAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisgICAgfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisJCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKKworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0JPSAxMjsKKworCS8vIHVzZSBvdXIgb3duIE9VSSB0byBkaXN0aW5ndWlzaCBwcm9wcmlldGFyeSB3aXRoIHN0YW5kYXJkLgorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0JCT0gMHhERDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdCQk9IDB4MEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsyXQkJPSAweDAwOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbM10JCT0gMHgwQzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzRdCQk9IDB4NDM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs1XQkJPSAweDAzOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzZdLCBwREEsIE1BQ19BRERSX0xFTik7CisKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiBOU3RhdHVzOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gdXNlIHByb3ByaWV0YXJ5IFBUSworCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJV3BhQ291bnRQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKKworCS8vIGNhbGN1bGF0ZSBNSUMKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7CisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgRGxzUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7CisJCWhtYWNfbWQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhlYWRlcjgwMl8zKSwJSGVhZGVyODAyXzMsCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwJJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwlOU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwTmRpc1BhY2tldCwgTlVMTCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwTmRpc1BhY2tldCwgQlNTSURfV0NJRCk7CisJCVNUQVNlbmRQYWNrZXQocEFkLCBwTmRpc1BhY2tldCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfQorCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlLSBTZW5kIFNUQUtleSBNZXNzYWdlLTIgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7CisKKwlyZXR1cm4gTlN0YXR1czsKK30KKworVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlNTE1FX0RMU19SRVFfU1RSVUNUCQlNbG1lRGxzUmVxOworCVVTSE9SVAkJCQkJcmVhc29uOworCVBSVF84MDJfMTFfRExTCQkJcERMUyA9IChQUlRfODAyXzExX0RMUylGdW5jdGlvbkNvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJCXBBZCA9IHBETFMtPnBBZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRsc1RpbWVvdXQgLSBUZWFyIGRvd24gRExTIGxpbmtzICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCisJCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0pKTsKKworCWlmICgocERMUykgJiYgKHBETFMtPlZhbGlkKSkKKwl7CisJCXJlYXNvbgkJCT0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCXBETFMtPlZhbGlkCQk9IEZBTFNFOworCQlwRExTLT5TdGF0dXMJPSBETFNfTk9ORTsKKwkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgcERMUywgcmVhc29uKTsKKwkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEZXNjcmlwdGlvbiA6IGJlY2F1c2UgRExTIGFuZCBDTEkgc2hhcmUgdGhlIHNhbWUgV0NJRCB0YWJsZSBpbiBBU0lDLgorTWVzaCBlbnRyeSBhbHNvIGluc2VydCB0byBwQWQtPk1hY1RhYi5jb250ZW50W10uICBTdWNoIGlzIG1hcmtlZCBhcyBWYWxpZEFzRGxzID0gVFJVRS4KK0Fsc28gZmlsbHMgdGhlIHBhaXJ3aXNlIGtleS4KK0JlY2F1c2UgZnJvbnQgTUFYX0FJRF9CQSBlbnRyaWVzIGhhdmUgZGlyZWN0IG1hcHBpbmcgdG8gQkFFbnRyeSwgd2hpY2ggaXMgb25seSB1c2VkIGFzIENMSS4gU28gd2UgaW5zZXJ0IERscworZnJvbSBpbmRleCBNQVhfQUlEX0JBLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCXBBZGRyLAorCUlOICBVSU5UCURsc0VudHJ5SWR4KQoreworCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKKwkvLyBpZiBGVUxMLCByZXR1cm4KKwlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkbworCXsKKwkJaWYoKHBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWRkciwgVFJVRSkpICE9IE5VTEwpCisJCQlicmVhazsKKworCQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5CisJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBwQWRkciwgRGxzRW50cnlJZHggKyBNSU5fTkVUX0RFVklDRV9GT1JfRExTLCBUUlVFKTsKKwkJaWYgKHBFbnRyeSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJZHhdLk1hY1RhYk1hdGNoV0NJRCA9IHBFbnRyeS0+QWlkOworCQkJcEVudHJ5LT5NYXRjaERsc0VudHJ5SWR4ID0gRGxzRW50cnlJZHg7CisJCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnREbHNFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLHBFbnRyeS0+QWlkLCBwQWQtPk1hY1RhYi5TaXplKSk7CisKKwkJCS8vIElmIGxlZ2FjeSBXRVAgaXMgdXNlZCwgc2V0IHBhaXItd2lzZSBjaXBoZXJBbGcgaW50byBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpCisJCQl7CisJCQkJVUNIQVIgS2V5SWR4ID0gMDsKKwkJCQlVQ0hBUiBDaXBoZXJBbGcgPSAwOworCisJCQkJS2V5SWR4CT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJCQkJQ2lwaGVyQWxnIAk9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJCQkJCXBFbnRyeSk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGFsbCBNZXNoIEVudHJ5IGluIHBBZC0+TWFjVGFiCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcikKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7CisKKwlpZiAoIVZBTElEX1dDSUQod2NpZCkpCisJCXJldHVybiBGQUxTRTsKKworCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCB3Y2lkLCBwQWRkcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKK3sKKwlVTE9ORyBIYXNoSWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlpZihiUmVzZXRJZGVsQ291bnQpCisJCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisJcmV0dXJuIHBFbnRyeTsKK30KKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCXdjaWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQoreworCVVMT05HIERMc0luZGV4OworCVBNQUNfVEFCTEVfRU5UUlkgcEN1ckVudHJ5ID0gTlVMTDsKKwlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZiAoIVZBTElEX1dDSUQod2NpZCkpCisJCXJldHVybiBOVUxMOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKworCWRvCisJeworCQlwQ3VyRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCQlETHNJbmRleCA9IDB4ZmY7CisJCWlmICgocEN1ckVudHJ5KSAmJiAocEN1ckVudHJ5LT5WYWxpZEFzRGxzPT0gVFJVRSkpCisJCXsKKwkJCURMc0luZGV4ID0gcEN1ckVudHJ5LT5NYXRjaERsc0VudHJ5SWR4OworCQl9CisKKwkJaWYgKERMc0luZGV4ID09IDB4ZmYpCisJCQlicmVhazsKKworCQlpZiAoTUFDX0FERFJfRVFVQUwocEN1ckVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWlmKGJSZXNldElkZWxDb3VudCkKKwkJCQlwQ3VyRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnkgPSBwQ3VyRW50cnk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpCit7CisJSU5UIGk7CisKKwlwcmludGsoIlxuJS0xOXMlLThzXG4iLCAiTUFDIiwgIlRJTUVPVVRcbiIpOworCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQl7CisJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRF07CisKKwkJCXByaW50aygiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggICIsCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclswXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsxXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzNdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzRdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzVdKTsKKwkJCXByaW50aygiJS04ZFxuIiwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCk7CisKKwkJCXByaW50aygiXG4iKTsKKwkJCXByaW50aygiXG4lLTE5cyUtNHMlLTRzJS00cyUtNHMlLTdzJS03cyUtN3MiLCJNQUMiLCAiQUlEIiwgIkJTUyIsICJQU00iLCAiV01NIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlwcmludGsoIiUtOHMlLTEwcyUtNnMlLTZzJS02cyUtNnMiLCAiTUlNT1BTIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlwcmludGsoIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOworCQkJcHJpbnRrKCIlLTRkIiwgKGludClDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlwcmludGsoIiUtOGQiLCAoaW50KXBFbnRyeS0+TW1wc01vZGUpOworCQkJcHJpbnRrKCIlLTEwcyIsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJcHJpbnRrKCIlLTZzIiwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXByaW50aygiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcHJpbnRrKCIlLTEwZCwgJWQsICVkJSVcbiIsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJcHJpbnRrKCJcbiIpOworCisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUgltYWNbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJVGltZW91dDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBSVF84MDJfMTFfRExTCURsczsKKworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpbWVvdXQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCVRpbWVvdXQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSVkIiwgbWFjWzBdLCBtYWNbMV0sCisJICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIChpbnQpVGltZW91dCk7CisKKwkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJRGxzLlRpbWVPdXQgPSBUaW1lb3V0OworCQlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWMpOworCQlEbHMuVmFsaWQgPSAxOworCisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkmRGxzKTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSCQkJbWFjQWRkcltNQUNfQUREUl9MRU5dOworCUNIQVIJCQkqdmFsdWU7CisJSU5UCQkJCWk7CisJUlRfODAyXzExX0RMUwlEbHM7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworCWZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCQlBdG9IKHZhbHVlLCAmbWFjQWRkcltpKytdLCAyKTsKKwl9CisKKwlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBtYWNBZGRyWzBdLCBtYWNBZGRyWzFdLAorCSAgICAgICAgICAgbWFjQWRkclsyXSwgbWFjQWRkclszXSwgbWFjQWRkcls0XSwgbWFjQWRkcls1XSk7CisKKwlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCUNPUFlfTUFDX0FERFIoRGxzLk1hY0FkZHIsIG1hY0FkZHIpOworCURscy5WYWxpZCA9IDA7CisKKwlNbG1lRW5xdWV1ZShwQWQsCisJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkmRGxzKTsKKworCXJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9ydG1wX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3J0bXBfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMCwwICsxLDI2MTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9kYXRhLmMKKworCUFic3RyYWN0OgorCURhdGEgcGF0aCBzdWJyb3V0aW5lcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkgICAgICBBdWcvMTcvMDQJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyNTYxLzI2NjEKKwlKYW4gTGVlCSAgICAgIE1hci8xNy8wNgkJbWFqb3IgbW9kaWZpY2F0aW9uIGZvciBSVDI4NjAgTmV3IFJpbmcgRGVzaWduCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKK1ZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVVDSEFSCQkJKnBUbXBCdWY7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwl7CisJCS8vIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKQorCQkvLyBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzCisJCXsKKwkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQorCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgorCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQorCQkJeworCQkJCVBVQ0hBUglLZXk7CisJCQkJVUNIQVIgCUNpcGhlckFsZzsKKwkJCQlpbnQgICAgIGlkeCA9IDA7CisKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKKwkJCQkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQ7CisgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLkNpcGhlckFsZzsKKwkJCQkJS2V5ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4gPiAwKQorICAgIAkJCQl7CisjaWZkZWYgUlQyODcwCisJCQkJCQl1bmlvbgorCQkJCQkJeworCQkJCQkJCWNoYXIgYnVmW3NpemVvZihORElTXzgwMl8xMV9XRVApK01BWF9MRU5fT0ZfS0VZLSAxXTsKKwkJCQkJCQlORElTXzgwMl8xMV9XRVAga2V5aW5mbzsKKwkJCQkJCX0gIFdlcEtleTsKKwkJCQkJCWludCBsZW47CisKKworCQkJCQkJTmRpc1plcm9NZW1vcnkoJldlcEtleSwgc2l6ZW9mKFdlcEtleSkpOworCQkJCQkJbGVuID1wQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KFdlcEtleS5rZXlpbmZvLktleU1hdGVyaWFsLAorCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKKwkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOworCisJCQkJCQlXZXBLZXkua2V5aW5mby5LZXlJbmRleCA9IDB4ODAwMDAwMDAgKyBpZHg7CisJCQkJCQlXZXBLZXkua2V5aW5mby5LZXlMZW5ndGggPSBsZW47CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9KFVDSEFSKSAobGVuIDw9IDUgPyA1IDogMTMpOworCisJCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQkJCQkvLyBuZWVkIHRvIGVucXVldWUgY21kIHRvIHRocmVhZAorCQkJCQkJUlRVU0JFbnF1ZXVlQ21kRnJvbU5kaXMocEFkLCBPSURfODAyXzExX0FERF9XRVAsIFRSVUUsICZXZXBLZXksIHNpemVvZihXZXBLZXkua2V5aW5mbykgKyBsZW4gLSAxKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCQkJCS8vIEZvciBQcmV2ZW50aW5nIFNoYXJkS2V5IFRhYmxlIGlzIGNsZWFyZWQgYnkgcmVtb3ZlIGtleSBwcm9jZWR1cmUuCisgICAgCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXksCisJCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXksCisJCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOworICAgIAkJCQl9CisJCQkJfQorCQkJfQorCisJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCS8vIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUKKwkJLy8JIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCisJCS8vCSAyLiBFQVBPTCBoYW5kc2hha2luZyBmcmFtZXMgd2hlbiBkcml2ZXIgc3VwcGxpY2FudCBlbmFibGVkLCBwYXNzIHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCQl7CisJCQlwVG1wQnVmID0gcFJ4QmxrLT5wRGF0YSAtIExFTkdUSF84MDJfMTE7CisJCQlOZGlzTW92ZU1lbW9yeShwVG1wQnVmLCBwUnhCbGstPnBIZWFkZXIsIExFTkdUSF84MDJfMTEpOworCQkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwVG1wQnVmLCBwUnhCbGstPkRhdGFTaXplICsgTEVOR1RIXzgwMl8xMSwgcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiISEhIHJlcG9ydCBFQVBPTC9BSVJPTkVUIERBVEEgdG8gTUxNRSAobGVuPSVkKSAhISFcbiIsIHBSeEJsay0+RGF0YVNpemUpKTsKKwkJfQorCX0KKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisKK1ZPSUQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisKKwkvLyBub24tRUFQIGZyYW1lCisJaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZShwQWQsIHBFbnRyeSwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgRnJvbVdoaWNoQlNTSUQpKQorCXsKKwkJeworCQkJLy8gZHJvcCBhbGwgbm9uLUVBUCBEQVRBIGZyYW1lIGJlZm9yZQorCQkJLy8gdGhpcyBjbGllbnQncyBQb3J0LUFjY2Vzcy1Db250cm9sIGlzIHNlY3VyZWQKKwkJCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLldlcCkKKwkJCXsKKwkJCQkvLyB1bnN1cHBvcnRlZCBjaXBoZXIgc3VpdGUKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJeworCQkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIGVuY3J5cHRpb24gaW4tdXNlIGJ1dCByZWNlaXZlIGEgbm9uLUVBUE9MIGNsZWFyIHRleHQgZnJhbWUsIGRyb3AgaXQKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSAmJgorCQkJCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJCQl7CisJCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKKwkJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspKQorCQl7CisJCQkvLyBOb3JtYWwgbGVnYWN5LCBBTVBEVSBvciBBTVNEVQorCQkJQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEFSQUxJTksKKwkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisJZWxzZQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCQl7CisJCQlJbmRpY2F0ZV9BTVBEVV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIERldGVybWluIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lCisJCQkvLyAgdG8gV1BBIHN0YXRlIG1hY2hpbmUgb3IgdXBwZXIgbGF5ZXIKKwkJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorCX0KK30KKworCisvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKK0JPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJVUNIQVIJCQlVc2VyUHJpb3JpdHkgPSBwUnhCbGstPlVzZXJQcmlvcml0eTsKKwlQQ0lQSEVSX0tFWQkJcFdwYUtleTsKKwlVQ0hBUgkJCSpwREEsICpwU0E7CisKKwlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeEJsay0+cFJ4V0ktPktleUluZGV4XTsKKworCXBEQSA9IHBIZWFkZXItPkFkZHIxOworCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkKKwl7CisJCXBTQSA9IHBIZWFkZXItPkFkZHIzOworCX0KKwllbHNlCisJeworCQlwU0EgPSBwSGVhZGVyLT5BZGRyMjsKKwl9CisKKwlpZiAoUlRNUFRraXBDb21wYXJlTUlDVmFsdWUocEFkLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJcERBLAorCQkJCQkJCQlwU0EsCisJCQkJCQkJCXBXcGFLZXktPlJ4TWljLAorCQkJCQkJCQlVc2VyUHJpb3JpdHksCisJCQkJCQkJCURhdGFTaXplKSA9PSBGQUxTRSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCXsKKwkJCVdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRSA6IEZBTFNFKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQl7CisJCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKKwkJfQorCisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvLworLy8gQWxsIFJ4IHJvdXRpbmVzIHVzZSBSWF9CTEsgc3RydWN0dXJlIHRvIGhhbmRlIHJ4IGV2ZW50cworLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gYnVpbGQgcFJ4QmxrIGF0dHJpYnV0ZXMKKy8vICAxLiBwSGVhZGVyIHBvaW50ZXIgdG8gODAyLjExIEhlYWRlcgorLy8gIDIuIHBEYXRhIHBvaW50ZXIgdG8gcGF5bG9hZCBpbmNsdWRpbmcgTExDIChqdXN0IHNraXAgSGVhZGVyKQorLy8gIDMuIHNldCBwYXlsb2FkIHNpemUgaW5jbHVkaW5nIExMQyB0byBEYXRhU2l6ZQorLy8gIDQuIHNldCBzb21lIGZsYWdzIHdpdGggUlhfQkxLX1NFVF9GTEFHKCkKKy8vCitWT0lEIFNUQUhhbmRsZVJ4RGF0YUZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUFJUMjhYWF9SWERfU1RSVUMJCQkJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQkJCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVBIRUFERVJfODAyXzExCQkJCQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAkJCQkJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJQk9PTEVBTiAJCQkJCQliRnJhZ21lbnQgPSBGQUxTRTsKKwlNQUNfVEFCTEVfRU5UUlkJICAgIAkJCSpwRW50cnkgPSBOVUxMOworCVVDSEFSCQkJCQkJCUZyb21XaGljaEJTU0lEID0gQlNTMDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJQcmlvcml0eSA9IDA7CisKKwl7CisJCS8vIGJlZm9yZSBMSU5LIFVQLCBhbGwgREFUQSBmcmFtZXMgYXJlIHJlamVjdGVkCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvL2lmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKKwkJaWYgKFJUTVBSY3ZGcmFtZURMU0NoZWNrKHBBZCwgcEhlYWRlciwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgcFJ4RCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIERyb3Agbm90IG15IEJTUyBmcmFtZXMKKwkJaWYgKHBSeEQtPk15QnNzID09IDApCisJCXsKKwkJCXsKKwkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwrKzsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQorCQl7CisJCQlVQ0hBUiAqcERhdGE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImJBUFNEQ2FwYWJsZVxuIikpOworCisJCQkvLyBRb3MgYml0IDQKKwkJCXBEYXRhID0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMTsKKwkJCWlmICgoKnBEYXRhID4+IDQpICYgMHgwMSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJ4RG9uZS0gUmN2IEVPU1AgZnJhbWUsIGRyaXZlciBtYXkgZmFsbCBpbnRvIHNsZWVwXG4iKSk7CisJCQkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IEZBTFNFOworCisJCQkJLy8gRm9yY2UgZHJpdmVyIHRvIGZhbGwgaW50byBzbGVlcCBtb2RlIHdoZW4gcmN2IEVPU1AgZnJhbWUKKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJeworCQkJCQlVU0hPUlQgIFRidHROdW1Ub05leHRXYWtlVXA7CisJCQkJCVVTSE9SVCAgTmV4dER0aW0gPSBwQWQtPlN0YUNmZy5EdGltUGVyaW9kOworCQkJCQlVTE9ORyAgIE5vdzsKKworCQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJCQlOZXh0RHRpbSAtPSAoVVNIT1JUKShOb3cgLSBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lKS9wQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisKKwkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKKwkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKworCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkvLyBpZiBXTU0tQVBTRCBpcyBmYWlsZWQsIHRyeSB0byBkaXNhYmxlIGZvbGxvd2luZyBsaW5lCisJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKSAmJiAocEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKKwkJCX0KKwkJfQorCisJCS8vIERyb3AgTlVMTCwgQ0YtQUNLKG5vIGRhdGEpLCBDRi1QT0xMKG5vIGRhdGEpLCBhbmQgQ0YtQUNLK0NGLVBPTEwobm8gZGF0YSkgZGF0YSBmcmFtZQorCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA0KSkgLy8gYml0IDIgOiBubyBEQVRBCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJICAgIC8vIERyb3Agbm90IG15IEJTUyBmcmFtZSAod2UgY2FuIG5vdCBvbmx5IGNoZWNrIHRoZSBNeUJzcyBiaXQgaW4gUnhEKQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCSAgICBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCSAgICB7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQkvLyBJbmZyYXN0cnVjdHVyZSBtb2RlLCBjaGVjayBhZGRyZXNzIDIgZm9yIEJTU0lECisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjIsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCisJCQl7CisJCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKKwkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAorCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlCS8vIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkCisJCXsKKwkJCS8vIEFkLUhvYyBtb2RlLCBjaGVjayBhZGRyZXNzIDMgZm9yIEJTU0lECisJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeSgmcEhlYWRlci0+QWRkcjMsICZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgNikpCisJCQl7CisJCQkJLy8gUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQKKwkgICAgICAgICAgICAvLyByZWxlYXNlIHBhY2tldAorCSAgICAgICAgICAgIFJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCSAgICB9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8KKwkJLy8gZmluZCBwRW50cnkKKwkJLy8KKwkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDEuIHJlbGVhc2UgcGFja2V0IGlmIGluZnJhIG1vZGUKKwkJCS8vIDIuIG5ldyBhIHBFbnRyeSBpZiBhZC1ob2MgbW9kZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBpbmZyYSBvciBhZC1ob2MKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSk7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCisJCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0RMUyk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQlBU1NFUlQocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPT0gQlNTSURfV0NJRCk7CisJCX0KKworCQkvLyBjaGVjayBBdGhlcm9zIENsaWVudAorCQlpZiAoKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gRkFMU0UpICYmICAocFJ4RC0+QU1QRFUgPT0gMSkgJiYgKHBIZWFkZXItPkZDLlJldHJ5ICkpCisJCXsKKwkJCXBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBUUlVFOworCQkJaWYgKCFTVEFfQUVTX09OKHBBZCkpCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCA4LCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIEZBTFNFKTsKKwkJCX0KKwkJfQorCX0KKworCXBSeEJsay0+cERhdGEgPSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8KKwkvLyB1cGRhdGUgUnhCbGstPnBEYXRhLCBEYXRhU2l6ZQorCS8vIDgwMi4xMSBIZWFkZXIsIFFPUywgSFRDLCBIdyBQYWRkaW5nCisJLy8KKworCS8vIDEuIHNraXAgODAyLjExIEhFQURFUgorCXsKKwkJcFJ4QmxrLT5wRGF0YSArPSBMRU5HVEhfODAyXzExOworCQlwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisJfQorCisJLy8gMi4gUU9TCisJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1FPUyk7CisJCVVzZXJQcmlvcml0eSA9ICoocFJ4QmxrLT5wRGF0YSkgJiAweDBmOworCQkvLyBiaXQgNyBpbiBRb1MgQ29udHJvbCBmaWVsZCBzaWduYWxzIHRoZSBIVCBBLU1TRFUgZm9ybWF0CisJCWlmICgoKnBSeEJsay0+cERhdGEpICYgMHg4MCkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKwkJfQorCisJCS8vIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKwkJcFJ4QmxrLT5wRGF0YSArPSAyOworCQlwUnhCbGstPkRhdGFTaXplIC09MjsKKwl9CisJcFJ4QmxrLT5Vc2VyUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyAzLiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKKwlpZiAocEhlYWRlci0+RkMuT3JkZXIpCisJeworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKChwUnhXSS0+UEhZTU9ERSA8PSBNT0RFX09GRE0pICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSyk7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9IVEMpOworCQkJLy8gc2tpcCBIVEMgY29udG9ybCBmaWVsZAorCQkJcFJ4QmxrLT5wRGF0YSArPSA0OworCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisJfQorCisJLy8gNC4gc2tpcCBIVyBwYWRkaW5nCisJaWYgKHBSeEQtPkwyUEFEKQorCXsKKwkJLy8ganVzdCBtb3ZlIHBEYXRhIHBvaW50ZXIKKwkJLy8gYmVjYXVzZSBEYXRhU2l6ZSBleGNsdWRpbmcgSFcgcGFkZGluZworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUEFEKTsKKwkJcFJ4QmxrLT5wRGF0YSArPSAyOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwUnhELT5CQSkKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkvLworCS8vIENhc2UgSSAgUHJvY2VzcyBCcm9hZGNhc3QgJiBNdWx0aWNhc3QgZGF0YSBmcmFtZQorCS8vCisJaWYgKHBSeEQtPkJjYXN0IHx8IHBSeEQtPk1jYXN0KQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQpOworCisJCS8vIERyb3AgTWNhc3QvQmNhc3QgZnJhbWUgd2l0aCBmcmFnbWVudCBiaXQgb24KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBGaWx0ZXIgb3V0IEJjYXN0IGZyYW1lIHdoaWNoIEFQIHJlbGF5ZWQgZm9yIHVzCisJCWlmIChwSGVhZGVyLT5GQy5GckRzICYmIE1BQ19BRERSX0VRVUFMKHBIZWFkZXItPkFkZHIzLCBwQWQtPkN1cnJlbnRBZGRyZXNzKSkKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBSeEQtPlUyTSkKKwl7CisJCXBBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisgICAgICAgIGlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0RMUykpCisJCXsKKwkJCU1BQ19UQUJMRV9FTlRSWSAqcERsc0VudHJ5ID0gTlVMTDsKKworCQkJcERsc0VudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZChwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLT5BZGRyMiwgVFJVRSk7CisJCQkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgaWYocERsc0VudHJ5KQorCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBEbHNFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOworCQkJaWYgKHBFbnRyeSkKKwkJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEVudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7CisJCX0KKworCisJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CisKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250Kys7CisKKworICAgIAlpZiAoISgocEhlYWRlci0+RnJhZyA9PSAwKSAmJiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gMCkpKQorICAgIAl7CisgICAgCQkvLyByZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCisgICAgCQkvLyByZXR1cm4gY29tcGxldGUgZnJhbWUgKHBSeFBhY2tldCkgb3IgTlVMTAorICAgIAkJYkZyYWdtZW50ID0gVFJVRTsKKyAgICAJCXBSeFBhY2tldCA9IFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKHBBZCwgcFJ4QmxrKTsKKyAgICAJfQorCisgICAgCWlmIChwUnhQYWNrZXQpCisgICAgCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKKworICAgIAkJLy8gcHJvY2VzcyBjb21wbGV0ZSBmcmFtZQorICAgIAkJaWYgKGJGcmFnbWVudCAmJiAocFJ4RC0+RGVjcnlwdGVkKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpCisgICAgCQl7CisJCQkJLy8gTWludXMgTUlDIGxlbmd0aAorCQkJCXBSeEJsay0+RGF0YVNpemUgLT0gODsKKworICAgIAkJCS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQorICAgIAkJCWlmIChTVEFDaGVja1RraXBNSUNWYWx1ZShwQWQsIHBFbnRyeSwgcFJ4QmxrKSA9PSBGQUxTRSkKKyAgICAJCQl7CisgICAgCQkJCXJldHVybjsKKyAgICAJCQl9CisgICAgCQl9CisKKyAgICAJCVNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJLy8ganVzdCByZXR1cm4KKyAgICAJCS8vIGJlY2F1c2UgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoKSB3aWxsIHJlbGVhc2UgcnggcGFja2V0LAorICAgIAkJLy8gaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQKKyAgICAJCXJldHVybjsKKyAgICAJfQorCX0KKworCUFTU0VSVCgwKTsKKwkvLyByZWxlYXNlIHBhY2tldAorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCitWT0lEIFNUQUhhbmRsZVJ4TWdtdEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwlkbworCXsKKworCQkvLyBXZSBzaG91bGQgY29sbGVjdCBSU1NJIG5vdCBvbmx5IFUyTSBkYXRhIGJ1dCBhbHNvIG15IGJlYWNvbgorCQlpZiAoKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pICYmIChNQUNfQUREUl9FUVVBTCgmcEFkLT5Db21tb25DZmcuQnNzaWQsICZwSGVhZGVyLT5BZGRyMikpKQorCQl7CisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKKwkJfQorCisJCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJTVEFIYW5kbGVSeE1nbXRGcmFtZTogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWQgXG4iLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSk7CisJCQlicmVhazsKKwkJfQorCisJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlciwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJCQkJCQkJCXBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCX0gd2hpbGUgKEZBTFNFKTsKKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCitWT0lEIFNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCXN3aXRjaCAocEhlYWRlci0+RkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJeworCQkJCUNudGxFbnF1ZXVlRm9yUmVjdihwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCksIChQRlJBTUVfQkFfUkVRKXBIZWFkZXIpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0s6CisJCWNhc2UgU1VCVFlQRV9BQ0s6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBSeERvbmUgaW50ZXJydXB0LCBydW5uaW5nIGluIERQQyBsZXZlbAorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVRoaXMgcm91dGluZSBoYXMgdG8gbWFpbnRhaW4gUnggcmluZyByZWFkIHBvaW50ZXIuCisJCU5lZWQgdG8gY29uc2lkZXIgUU9TIERBVEEgZm9ybWF0IHdoZW4gY29udmVydGluZyB0byA4MDIuMworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlhcmdjKQoreworCU5ESVNfU1RBVFVTCQkJU3RhdHVzOworCVVJTlQzMgkJCVJ4UHJvY2Vzc2VkLCBSeFBlbmRpbmc7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisJUlQyOFhYX1JYRF9TVFJVQwkqcFJ4RDsKKwlVQ0hBUgkJCSpwRGF0YTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0k7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldDsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyOworCVJYX0JMSwkJCVJ4Q2VsbDsKKworCVJ4UHJvY2Vzc2VkID0gUnhQZW5kaW5nID0gMDsKKworCS8vIHByb2Nlc3Mgd2hvbGUgcnggcmluZworCXdoaWxlICgxKQorCXsKKworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8CisJCQkhUlRNUF9URVNUX0ZMQUcocEFkLGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCQl7CisJCQlicmVhazsKKwkJfQorCisKKwkJUnhQcm9jZXNzZWQgKys7IC8vIHRlc3QKKworCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0CisJCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKKwkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0CisJCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCisJCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCisJCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOworCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCisJCXsKKwkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgorCQlwUnhEID0gJihSeENlbGwuUnhEKTsKKwkJLy8gZ2V0IHJ4IGRhdGEgYnVmZmVyCisJCXBEYXRhCT0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7CisJCXBSeFdJCT0gKFBSWFdJX1NUUlVDKSBwRGF0YTsKKwkJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgKHBEYXRhK1JYV0lfU0laRSkgOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCSAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXIsIERJUl9SRUFELCBUUlVFKTsKKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4V0ksIFRZUEVfUlhXSSk7CisjZW5kaWYKKworCQkvLyBidWlsZCBSeENlbGwKKwkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7CisJCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKKwkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKKwkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7CisJCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCVJ4Q2VsbC5GbGFncyA9IDA7CisKKwkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOworCisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50KTsKKworCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA8IDE0KQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorCQl7CisgICAgICAgICAgICBzZW5kX21vbml0b3JfcGFja2V0cyhwQWQsICZSeENlbGwpOworCQkJYnJlYWs7CisJCX0KKwkJLyogUlQyODcwIGludm9rZXMgU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKCkgaW4gcnR1c2JfYnVsay5jICovCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZiAoQVRFX09OKHBBZCkpCisJCXsKKwkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJCQlBVEVTYW1wbGVSc3NpKHBBZCwgcFJ4V0kpOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKQorCQkJeworCQkJCS8qICgqcFJ4RCkgaGFzIGJlZW4gc3dhcHBlZCBpbiBHZXRQYWNrZXRGcm9tUnhSaW5nKCkgKi8KKwkJCQlBVEVfUUFfU3RhdGlzdGljcyhwQWQsIHBSeFdJLCBwUnhELAlwSGVhZGVyKTsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKKwkJU3RhdHVzID0gUlRNUENoZWNrUnhFcnJvcihwQWQsIHBIZWFkZXIsIHBSeFdJLCBwUnhEKTsKKworCQkvLyBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lCisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKQorCQkJeworCQkJCS8vIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0RBVEE6CisJCQkJeworCQkJCQkvLyBwcm9jZXNzIERBVEEgZnJhbWUKKwkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKKwkJCQljYXNlIEJUWVBFX01HTVQ6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeE1nbXRGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0NOVEw6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBkaXNjYXJkIG90aGVyIHR5cGUKKwkJCQlkZWZhdWx0OgorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9ycysrOworCQkJLy8gZGlzY2FyZCB0aGlzIGZyYW1lCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCXJldHVybiBiUmVzY2hlZHVsZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlBc2ljRm9yY2VXYWtldXAocEFkLCBGQUxTRSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRWFybHkgY2hlY2tpbmcgYW5kIE9TLWRlcGVuZWQgcGFyc2luZyBmb3IgVHggcGFja2V0IHNlbmQgdG8gb3VyIFNUQSBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBORElTX0hBTkRMRSAJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgorCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCisJVUlOVAkJCU51bWJlck9mUGFja2V0cwkJCU51bWJlciBvZiBwYWNrZXQgaW4gcGFja2V0IGFycmF5LgorCitSZXR1cm4gVmFsdWU6CisJTk9ORQorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gZG8gZWFybHkgY2hlY2tpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBzZW5kLW91dCBwYWNrZXQuCisJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTVEFTZW5kUGFja2V0cygKKwlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCisJSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cykKK3sKKwlVSU5UCQkJSW5kZXg7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUikgTWluaXBvcnRBZGFwdGVyQ29udGV4dDsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlCT09MRUFOCQkJYWxsb3dUb1NlbmQgPSBGQUxTRTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTnVtYmVyT2ZQYWNrZXRzOyBJbmRleCsrKQorCXsKKwkJcFBhY2tldCA9IHBwUGFja2V0QXJyYXlbSW5kZXhdOworCisJCWRvCisJCXsKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICghSU5GUkFfT04ocEFkKSAmJiAhQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0CisJCQkJLy8gbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlQVUNIQVIgcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOworCQkJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIHBFbnRyeS0+QWlkKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQorCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwgTkRJU19TVEFUVVNfUEVORElORyk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50Kys7CisKKwkJCQlhbGxvd1RvU2VuZCA9IFRSVUU7CisJCQl9CisJCX0gd2hpbGUoRkFMU0UpOworCisJCWlmIChhbGxvd1RvU2VuZCA9PSBUUlVFKQorCQkJU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQllbHNlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorCVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGRvIHBhY2tldCBwYXJzaW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3IgVHggcGFja2V0CisJdG8gU1RBIGRldmljZSwgYW5kIGl0IHdpbGwgZW4tcXVldWUgcGFja2V0cyB0byBvdXIgVHhTd1F1ZXVlIGRlcGVuZHMgb24gQUMKKwljbGFzcy4KKworQXJndW1lbnRzOgorCXBBZCAgICAJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwlwUGFja2V0IAlQb2ludGVyIHRvIHNlbmQgcGFja2V0CisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCisJTkRJU19TVEFUVVNfRkFJTFVSRQkJCUlmIGZhaWxlZCB0byBkbyBlbi1xdWV1ZS4KKworTm90ZToKKwlZb3Ugb25seSBjYW4gcHV0IE9TLWluZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJVUlOVAkJCUFsbG93RnJhZ1NpemU7CisJVUNIQVIJCQlOdW1iZXJPZkZyYWc7CisvLwlVQ0hBUgkJCVJUU1JlcXVpcmVkOworCVVDSEFSCQkJUXVlSWR4LCBVc2VyUHJpb3JpdHk7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGludCAJSXJxRmxhZ3M7CisJVUNIQVIJCQlGbGdJc0lQID0gMDsKKwlVQ0hBUgkJCVJhdGU7CisKKwkvLyBQcmVwYXJlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBkZXNjcmlwdG9yCisJLy8gY2hhaW5lZCB3aXRoaW4gYSBzaW5nbGUgTkRJUyBwYWNrZXQuCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBwU3JjQnVmVkEgPT0gTlVMTCAhISFTcmNCdWZMZW49JXhcbiIsU3JjQnVmTGVuKSk7CisJCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcworCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCisJaWYgKFNyY0J1ZkxlbiA8IDE0KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBOZGlzIFBhY2tldCBidWZmZXIgZXJyb3IgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBJbiBIVCByYXRlIGFkaG9jIG1vZGUsIEEtTVBEVSBpcyBvZnRlbiB1c2VkLiBTbyBuZWVkIHRvIGxvb2t1cCBCQSBUYWJsZSBhbmQgTUFDIEVudHJ5LgorCS8vIE5vdGUgbXVsdGljYXN0IHBhY2tldHMgaW4gYWRob2MgYWxzbyB1c2UgQlNTSURfV0NJRCBpbmRleC4KKwl7CisJCWlmKElORlJBX09OKHBBZCkpCisJCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCVVTSE9SVAl0bXBXY2lkOworCisJCQl0bXBXY2lkID0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7CisJCQlpZiAoVkFMSURfV0NJRCh0bXBXY2lkKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLlZhbGlkQXNEbHM9PSBUUlVFKSkKKwkJCXsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXTsKKwkJCQlSYXRlID0gcEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5DdXJyVHhSYXRlOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCisJCQl7CisJCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgTUNBU1RfV0NJRCk7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOworCQkJfQorCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJfQorCX0KKworCWlmICghcEVudHJ5KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJTJ4OiUyeDolMng6JTJ4OiUyeDolMngpIGluIE1hY1RhYiFcbiIsIFBSSU5UX01BQyhwU3JjQnVmVkEpKSk7CisJCS8vIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcworCQkvLyByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllcgorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCWlmIChBREhPQ19PTihwQWQpCisJCSkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIChVQ0hBUilwRW50cnktPkFpZCk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGUgRXRoZXJuZXQgRnJhbWUgdHlwZSBvZiB0aGlzIHBhY2tldCwgYW5kIHNldCB0aGUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDIGZsYWdzLgorCS8vCQlIZXJlIHdlIHNldCB0aGUgUEFDS0VUX1NQRUNJRklDIGZsYWdzKExMQywgVkxBTiwgREhDUC9BUlAsIEVBUE9MKS4KKwlSVE1QQ2hlY2tFdGhlclR5cGUocEFkLCBwUGFja2V0KTsKKworCisKKwkvLworCS8vIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wgLSBkcm9wIGFsbCBub24tODAyLjF4IGZyYW1lIGJlZm9yZSBwb3J0IHNlY3VyZWQKKwkvLworCWlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkgIHx8IChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkgICkKKwkJICAmJiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkgfHwgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA+PSAyKSkKKwkJICAmJiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpPT0gRkFMU0UpCisJCSAgKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFTZW5kUGFja2V0IC0tPiBEcm9wIHBhY2tldCBiZWZvcmUgcG9ydCBzZWN1cmVkICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKworCS8vIFNURVAgMS4gRGVjaWRlIG51bWJlciBvZiBmcmFnbWVudHMgcmVxdWlyZWQgdG8gZGVsaXZlciB0aGlzIE1TRFUuCisJLy8JICAgVGhlIGVzdGltYXRpb24gaGVyZSBpcyBub3QgdmVyeSBhY2N1cmF0ZSBiZWNhdXNlIGRpZmZpY3VsdCB0bworCS8vCSAgIHRha2UgZW5jcnlwdGlvbiBvdmVyaGVhZCBpbnRvIGNvbnNpZGVyYXRpb24gaGVyZS4gVGhlIHJlc3VsdAorCS8vCSAgICJOdW1iZXJPZkZyYWciIGlzIHRoZW4ganVzdCB1c2VkIHRvIHByZS1jaGVjayBpZiBlbm91Z2ggZnJlZQorCS8vCSAgIFRYRCBhcmUgYXZhaWxhYmxlIHRvIGhvbGQgdGhpcyBNU0RVLgorCisKKwlpZiAoKnBTcmNCdWZWQSAmIDB4MDEpCS8vIGZyYWdtZW50YXRpb24gbm90IGFsbG93ZWQgb24gbXVsdGljYXN0ICYgYnJvYWRjYXN0CisJCU51bWJlck9mRnJhZyA9IDE7CisJZWxzZSBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKwllbHNlIGlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUTUlYKSB8fCAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBNSU1PIFJBVEUgb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJLy8gVGhlIGNhbGN1bGF0ZWQgIk51bWJlck9mRnJhZyIgaXMgYSByb3VnaCBlc3RpbWF0aW9uIGJlY2F1c2Ugb2YgdmFyaW91cworCQkvLyBlbmNyeXB0aW9uL2VuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhpcyBudW1iZXIgaXMganVzdAorCQkvLyB1c2VkIHRvIG1ha2Ugc3VyZSBlbm91Z2ggZnJlZSBUWEQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZnJhZ21lbnRhdGlvbiB0YWtlcyBwbGFjZS4KKwkJLy8gSW4gY2FzZSB0aGUgYWN0dWFsIHJlcXVpcmVkIG51bWJlciBvZiBmcmFnbWVudHMgb2YgYW4gTkRJUyBwYWNrZXQKKwkJLy8gZXhjY2VlZHMgIk51bWJlck9mRnJhZyJjYWN1bGF0ZWQgaGVyZSBhbmQgbm90IGVub3VnaCBmcmVlIFRYRCBhdmFpbGFibGUsIHRoZQorCQkvLyBsYXN0IGZyYWdtZW50IChpLmUuIGxhc3QgTVBEVSkgd2lsbCBiZSBkcm9wcGVkIGluIFJUTVBIYXJkVHJhbnNtaXQoKSBkdWUgdG8gb3V0IG9mCisJCS8vIHJlc291cmNlLCBhbmQgdGhlIE5ESVMgcGFja2V0IHdpbGwgYmUgaW5kaWNhdGVkIE5ESVNfU1RBVFVTX0ZBSUxVUkUuIFRoaXMgc2hvdWxkCisJCS8vIHJhcmVseSBoYXBwZW4gYW5kIHRoZSBwZW5hbHR5IGlzIGp1c3QgbGlrZSBhIFRYIFJFVFJZIGZhaWwuIEFmZm9yZGFibGUuCisKKwkJQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJTnVtYmVyT2ZGcmFnID0gKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpIC8gQWxsb3dGcmFnU2l6ZSkgKyAxOworCQkvLyBUbyBnZXQgYWNjdXJhdGUgbnVtYmVyIG9mIGZyYWdtZW50YXRpb24sIE1pbnVzIDEgaWYgdGhlIHNpemUganVzdCBtYXRjaCB0byBhbGxvd2FibGUgZnJhZ21lbnQgc2l6ZQorCQlpZiAoKChQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgTEVOR1RIXzgwMl8xX0gpICUgQWxsb3dGcmFnU2l6ZSkgPT0gMCkKKwkJeworCQkJTnVtYmVyT2ZGcmFnLS07CisJCX0KKwl9CisKKwkvLyBTYXZlIGZyYWdtZW50IG51bWJlciB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZAorCVJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCwgTnVtYmVyT2ZGcmFnKTsKKworCisJLy8gU1RFUCAyLiBDaGVjayB0aGUgcmVxdWlyZW1lbnQgb2YgUlRTOgorCS8vCSAgIElmIG11bHRpcGxlIGZyYWdtZW50IHJlcXVpcmVkLCBSVFMgaXMgcmVxdWlyZWQgb25seSBmb3IgdGhlIGZpcnN0IGZyYWdtZW50CisJLy8JICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkCisJLy8gICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUworCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgMCk7CisJUlRNUF9TRVRfUEFDS0VUX1RYUkFURShwUGFja2V0LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUpOworCisJLy8KKwkvLyBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+CisJLy8KKwlVc2VyUHJpb3JpdHkgPSAwOworCVF1ZUlkeAkJID0gUUlEX0FDX0JFOworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCisJCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQorCXsKKwkJVVNIT1JUIFByb3RvY29sOworCQlVQ0hBUiAgTGxjU25hcExlbiA9IDAsIEJ5dGUwLCBCeXRlMTsKKwkJZG8KKwkJeworCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkCisJCQlQcm90b2NvbCA9IChVU0hPUlQpKChwU3JjQnVmVkFbMTJdIDw8IDgpICsgcFNyY0J1ZlZBWzEzXSk7CisJCQlpZiAoUHJvdG9jb2wgPD0gMTUwMCkKKwkJCXsKKwkJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQgZnJvbSBMTEMvU05BUAorCQkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyA2LCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJYnJlYWs7CisKKwkJCQlQcm90b2NvbCA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCQlMbGNTbmFwTGVuID0gODsKKwkJCX0KKworCQkJLy8gYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0CisJCQlpZiAoUHJvdG9jb2wgIT0gMHgwODAwKQorCQkJCWJyZWFrOworCisJCQkvLyBnZXQgSVAgaGVhZGVyCisJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisKKwkJCS8vIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQKKwkJCWlmICgoQnl0ZTAgJiAweGYwKSAhPSAweDQwKQorCQkJCWJyZWFrOworCisJCQlGbGdJc0lQID0gMTsKKwkJCVVzZXJQcmlvcml0eSA9IChCeXRlMSAmIDB4ZTApID4+IDU7CisJCQlRdWVJZHggPSBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W1VzZXJQcmlvcml0eV07CisKKwkJCS8vIFRPRE86IGhhdmUgdG8gY2hlY2sgQUNNIGJpdC4gYXBwbHkgVFNQRUMgaWYgQUNNIGlzIE9OCisJCQkvLyBUT0RPOiBkb3duZ3JhZGUgVVAgJiBRdWVJZHggYmVmb3JlIHBhc3NpbmcgQUNNCisJCQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQUNNW1F1ZUlkeF0pCisJCQl7CisJCQkJVXNlclByaW9yaXR5ID0gMDsKKwkJCQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCX0KKworCVJUTVBfU0VUX1BBQ0tFVF9VUChwUGFja2V0LCBVc2VyUHJpb3JpdHkpOworCisKKworCS8vIE1ha2Ugc3VyZSBTZW5kVHhXYWl0IHF1ZXVlIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJU3RvcE5ldElmUXVldWUocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisJCUluc2VydFRhaWxRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gVFJVRSkmJgorICAgICAgICBJU19IVF9TVEEocEVudHJ5KSkKKwl7CisJICAgIC8vUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCisgICAgICAgICAgICAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFVzZXJQcmlvcml0eSkpID09IDApICYmCisgICAgICAgICAgICAocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKwkJCSAvLyBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmCisJCQkgLy8gMS4gSXQgaXMgUmFsaW5rIGNoaXAgb3IKKwkJCSAvLyAyLiBJdCBpcyBPUEVOIG9yIEFFUyBtb2RlLAorCQkJIC8vIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuCisJCQkgJiYgKChwRW50cnktPlZhbGlkQXNDTEkgJiYgcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKSB8fAorCQkJIAkgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCB8fCBwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJCSkKKwkJeworCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIDAsIDAsIDEwLCBGQUxTRSk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRdWVJZHhdKys7IC8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxlYXRpdmUgcmluZyBkZXNjcmlwdG9yIHRvIGZpbmQKKwkJb3V0IGF2YWxpYWJsZSBmcmVlIHJpbmcgZGVzY3JpcHRvciBhbmQgY29tcGFyZSB3aXRoIHJlcXVlc3Qgc2l6ZS4KKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUXVlSWR4CQlTZWxlY3RlZCBUWCBSaW5nCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgCU5vdCBlbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgCUVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZkZWYgUlQyODcwCisvKgorCUFjdHVhbGx5LCB0aGlzIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgaWYgdGhlIFR4SGFyZHdhcmUgUXVldWUgc3RpbGwgaGFzIGZyYW1lIG5lZWQgdG8gc2VuZC4KKwlJZiBubyBmcmFtZSBuZWVkIHRvIHNlbmQsIGdvIHRvIHNsZWVwLCBlbHNlLCBzdGlsbCB3YWtlIHVwLgorKi8KK05ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJUXVlSWR4LAorCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAorCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCit7CisJLy9VTE9ORwkJRnJlZU51bWJlciA9IDA7CisJTkRJU19TVEFUVVMgCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKworCXN3aXRjaCAoUXVlSWR4KQorCXsKKwkJY2FzZSBRSURfQUNfQks6CisJCWNhc2UgUUlEX0FDX0JFOgorCQljYXNlIFFJRF9BQ19WSToKKwkJY2FzZSBRSURfQUNfVk86CisJCWNhc2UgUUlEX0hDQ0E6CisJCQl7CisJCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCQkJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pIHx8CisJCQkJCShwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCX0KKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUUlEX01HTVQ6CisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAhPSBNR01UX1JJTkdfU0laRSkKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChTdGF0dXMpOworCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKK1ZPSUQJUlRNUFNlbmROdWxsRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JQk9PTEVBTiAJCWJRb3NOdWxsKQoreworCVVDSEFSCU51bGxGcmFtZVs0OF07CisJVUxPTkcJTGVuZ3RoOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYoQVRFX09OKHBBZCkpCisJeworCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworICAgIC8vIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wKKyAgICBpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKKyNlbmRpZgorICAgICAgICApICYmCisgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJeworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoTnVsbEZyYW1lLCA0OCk7CisJTGVuZ3RoID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIE51bGxGcmFtZTsKKworCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOworCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCX0KKwllbHNlCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpID8gMTogMDsKKwl9CisJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgVHhSYXRlLCAxNCk7CisKKwlwQWQtPlNlcXVlbmNlKys7CisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKworCS8vIFByZXBhcmUgUW9zTnVsbCBmdW5jdGlvbiBmcmFtZQorCWlmIChiUW9zTnVsbCkKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9RT1NfTlVMTDsKKworCQkvLyBjb3B5IFFPUyBjb250cm9sIGJ5dGVzCisJCU51bGxGcmFtZVtMZW5ndGhdCT0gIDA7CisJCU51bGxGcmFtZVtMZW5ndGgrMV0gPSAgMDsKKwkJTGVuZ3RoICs9IDI7Ly8gaWYgcGFkIHdpdGggMiBieXRlcyBmb3IgYWxpZ25tZW50LCBBUFNEIHdpbGwgZmFpbAorCX0KKworCUhBTF9LaWNrT3V0TnVsbEZyYW1lVHgocEFkLCAwLCBOdWxsRnJhbWUsIExlbmd0aCk7CisKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lECVJUTVBTZW5kUlRTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlSVFNSYXRlLAorCUlOCVVTSE9SVAkJCUFja0R1cmF0aW9uLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVDSEFSCQkJRnJhbWVHYXApCit7Cit9CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEZJTkQgRU5DUllQVCBLRVkgQU5EIERFQ0lERSBDSVBIRVIgQUxHT1JJVEhNCisvLwkJRmluZCB0aGUgV1BBIGtleSwgZWl0aGVyIEdyb3VwIG9yIFBhaXJ3aXNlIEtleQorLy8JCUxFQVAgKyBUS0lQIGFsc28gdXNlIFdQQSBrZXkuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjaWRlIFdFUCBiaXQgYW5kIGNpcGhlciBzdWl0ZSB0byBiZSB1c2VkLiBTYW1lIGNpcGhlciBzdWl0ZSBzaG91bGQgYmUgdXNlZCBmb3Igd2hvbGUgZnJhZ21lbnQgYnVyc3QKKy8vIEluIENpc2NvIENDWCAyLjAgTGVhcCBBdXRoZW50aWNhdGlvbgorLy8JCSAgIFdlcFN0YXR1cyBpcyBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkIGJ1dCB0aGUga2V5IHdpbGwgdXNlIFBhaXJ3aXNlS2V5CisvLwkJICAgSW5zdGVhZCBvZiB0aGUgU2hhcmVkS2V5LCBTaGFyZWRLZXkgTGVuZ3RoIG1heSBiZSBaZXJvLgorVk9JRCBTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJQ2lwaGVyOwkJCQkvLyBUbyBpbmRpY2F0ZSBjaXBoZXIgdXNlZCBmb3IgdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsJCS8vIGNpcGhlciBhbG9ncml0aG0KKwlVQ0hBUgkJCQkJCQlLZXlJZHggPSAweGZmOworCVBVQ0hBUgkJCQkJCQlwU3JjQnVmVkE7CisJUENJUEhFUl9LRVkJCQkJCQlwS2V5ID0gTlVMTDsKKworCXBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwVHhCbGstPnBQYWNrZXQpOworCisJeworCSAgICAvLyBTZWxlY3QgQ2lwaGVyCisJICAgIGlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKKwkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIE11bHRpY2FzdCBvciBCcm9hZGNhc3QKKwkgICAgZWxzZQorCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuUGFpckNpcGhlcjsgLy8gQ2lwaGVyIGZvciBVbmljYXN0CisKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQorCQl7CisJCQlBU1NFUlQocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnIDw9IENJUEhFUl9DS0lQMTI4KTsKKworCQkJLy8gNC13YXkgaGFuZHNoYWtpbmcgZnJhbWUgbXVzdCBiZSBjbGVhcgorCQkJaWYgKCEoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSkpICYmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcpICYmCisJCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikpCisJCQl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCQkJCUtleUlkeCA9IDA7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MTApIC8vIENpc2NvIENLSVAgS1AgaXMgb24KKwkJCXsKKwkJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQkJeworCQkJCQlpZiAoKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSkKKwkJCQkJCUtleUlkeCA9IDE7CisJCQkJCWVsc2UKKwkJCQkJCUtleUlkeCA9IDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDA4KSAvLyBvbmx5IENLSVAgQ01JQworCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCWVsc2UgaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJeworCQkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkKKwkJCQkJS2V5SWR4ID0gMTsKKwkJCQllbHNlCisJCQkJCUtleUlkeCA9IDA7CisJCQl9CisJCQllbHNlCS8vIHN0YW5kYXJkIFdFUDY0IG9yIFdFUDEyOAorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJfQorCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmICgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkgLy8gbXVsdGljYXN0CisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKQorCQkJCUtleUlkeCA9IDA7CisJCQllbHNlCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9CisKKwkJaWYgKEtleUlkeCA9PSAweGZmKQorCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgfHwgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID09IDApKQorCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBlbHNlIGlmICggcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJICAgICAgICAgICAgIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgJiYKKwkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSAmJgorCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJZWxzZQorCQl7CisJCQkvL0hlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsKKwkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworCQkJcEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdOworCQl9CisJfQorCisJcFR4QmxrLT5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJcFR4QmxrLT5wS2V5ID0gcEtleTsKK30KKworCitWT0lEIFNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBUWF9CTEsgICAgICAgICAgKnBUeEJsaykKK3sKKworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7CisJSU5UCURsc0VudHJ5SW5kZXggPSAwOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJLy8KKwkvLyBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIKKwkvLworCisJLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisKKwlOZGlzWmVyb01lbW9yeShwSGVhZGVyXzgwMl8xMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZWFkZXJfODAyXzExLT5GQy5GckRzID0gMDsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSAoKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpID8gU1VCVFlQRV9RREFUQSA6IFNVQlRZUEVfREFUQSk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKwkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCisJCURsc0VudHJ5SW5kZXggPSBSVE1QQ2hlY2tETFNGcmFtZShwQWQsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCWlmIChEbHNFbnRyeUluZGV4ID49IDApCisJCQliRExTRnJhbWUgPSBUUlVFOworCQllbHNlCisJCQliRExTRnJhbWUgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyAgICBpZiAocFR4QmxrLT5wTWFjRW50cnkpCisJeworCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKKwkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0gKHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxKzEpICYgTUFYU0VROworCQl9CisJCWVsc2UKKwkJeworICAgIAkgICAgcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKKyAgICAJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKKyAgICAJfQorCX0KKwllbHNlCisJeworCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UrMSkgJiBNQVhTRVE7IC8vIG5leHQgc2VxdWVuY2UKKwl9CisKKwlwSGVhZGVyXzgwMl8xMS0+RnJhZyA9IDA7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisKKwl7CisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoYkRMU0ZyYW1lKQorCQkJeworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKKwkJfQorCQl9CisJCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKKwkJfQorCX0KKworCWlmIChwVHhCbGstPkNpcGhlckFsZyAhPSBDSVBIRVJfTk9ORSkKKwkJcEhlYWRlcl84MDJfMTEtPkZDLldlcCA9IDE7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKyAgICAJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwllbHNlCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCisJSU4gVFhfQkxLCQkJKnBUeEJsaywKKwlJTiBVQ0hBUgkJCSpwSGVhZGVyKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OworCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKKworCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwSGVhZGVyOworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisJLy8KKwkvLyBVcGRhdGUgdGhlIGNhY2hlZCA4MDIuMTEgSEVBREVSCisJLy8KKworCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gTW9yZSBCaXQKKwlwSGVhZGVyODAyMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJLy8gU2VxdWVuY2UKKwlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisgICAgcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisKKwl7CisJCS8vIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKwkJLy8gSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCUJPT0xFQU4JYkRMU0ZyYW1lID0gRkFMU0U7CisJCUlOVAlEbHNFbnRyeUluZGV4ID0gMDsKKworCQlEbHNFbnRyeUluZGV4ID0gUlRNUENoZWNrRExTRnJhbWUocEFkLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQlpZiAoRGxzRW50cnlJbmRleCA+PSAwKQorCQkJYkRMU0ZyYW1lID0gVFJVRTsKKwkJZWxzZQorCQkJYkRMU0ZyYW1lID0gRkFMU0U7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gVGhlIGFkZHIzIG9mIG5vcm1hbCBwYWNrZXQgc2VuZCBmcm9tIERTIGlzIERlc3QgTWFjIGFkZHJlc3MuCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChiRExTRnJhbWUpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJcEhlYWRlcjgwMjExLT5GQy5Ub0RzID0gMDsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwl9CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBORElTX1BBQ0tFVAlwTmV4dFBhY2tldDsKKwlVSU5UMzIJCQluZXh0QnVmTGVuOworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBzdGVhbCAib3JkZXIiIGJpdCB0byBtYXJrICJhZ2dyZWdhdGlvbiIKKwlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlci4gTExDIGhlYWRlciBzaG91bGQgYXQgNC1ieXRlcyBhbGlnbWVudC4KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkvLyBGb3IgUkEgQWdncmVnYXRpb24sCisJLy8gcHV0IHRoZSAybmQgTVNEVSBsZW5ndGgoZXh0cmEgMi1ieXRlIGZpZWxkKSBhZnRlciBRT1NfQ09OVFJPTCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAorCXBRRW50cnkgPSBwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkOworCXBOZXh0UGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBRRW50cnkpOworCW5leHRCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwTmV4dFBhY2tldCk7CisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBOZXh0UGFja2V0KSkKKwkJbmV4dEJ1ZkxlbiAtPSBMRU5HVEhfODAyXzFROworCisJKnBIZWFkZXJCdWZQdHIgPSAoVUNIQVIpbmV4dEJ1ZkxlbiAmIDB4ZmY7CisJKihwSGVhZGVyQnVmUHRyKzEpID0gKFVDSEFSKShuZXh0QnVmTGVuID4+IDgpOworCisJcEhlYWRlckJ1ZlB0ciArPSAyOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIGlubGluZSBQVUNIQVIgU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsvLywgcFNhdmVCdWZQdHI7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJLy8KKwkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCS8vCisJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKKworCS8vCisJLy8gQS1NU0RVIHBhY2tldAorCS8vCisJKnBIZWFkZXJCdWZQdHIgfD0gMHg4MDsKKworCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJcEhlYWRlckJ1ZlB0ciArPTI7CisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkvL3BTYXZlQnVmUHRyID0gcEhlYWRlckJ1ZlB0cjsKKworCS8vCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJLy8KKwkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKKwkvLworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKKworfQorCisKK1ZPSUQgU1RBX0FNUERVX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQlpZiAoIFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworCQkJLy8gTk9URTogUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiBwTWFjRW50cnktPkNhY2hlZEJ1ZltdIGlzIHNtYWxsZXIgdGhhbiBwVHhCbGstPkhlYWRlckJ1ZltdISEhIQorCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdLCAoUFVDSEFSKSZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSwgVFhXSV9TSVpFICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCXBIZWFkZXJCdWZQdHIgPSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdKTsKKwkJCVNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIocEFkLCBwVHhCbGssIHBIZWFkZXJCdWZQdHIpOworCQl9CisJCWVsc2UKKwkJeworCQkJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJCQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCQl9CisKKworCQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCQkvLworCQkvLyBidWlsZCBIVEMrCisJCS8vIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQKKwkJLy8KKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCisJCXsKKwkJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkID09IEZBTFNFKQorCQkJeworCQkJCS8vIG1hcmsgSFRDIGJpdAorCQkJCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCA0KTsKKwkJCQkqKHBIZWFkZXJCdWZQdHIrMykgfD0gMHg4MDsKKwkJCX0KKwkJCXBIZWFkZXJCdWZQdHIgKz0gNDsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSA0OworCQl9CisKKwkJLy9wVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsKKwkJQVNTRVJUKHBUeEJsay0+TXBkdUhlYWRlckxlbiA+PSAyNCk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCS8vCisJCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwkJLy8KKwkJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJCS8vCisJCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCQl7CisKKwkJCS8vCisJCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCQkvLworCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQl9CisKKwkJfQorCisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKQorCQl7CisgICAgICAgICAgICBSVE1QV3JpdGVUeFdJX0NhY2hlKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIHNpemVvZihwTWFjRW50cnktPkNhY2hlZEJ1ZikpOworCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIChwSGVhZGVyQnVmUHRyIC0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSkpKTsKKwkJCXBNYWNFbnRyeS0+aXNDYWNoZWQgPSBUUlVFOworCQl9CisKKwkJLy8gY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNUERVIGNvdW50IGFuZCBCeXRlQ291bnQKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50LnUuTG93UGFydCArKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQuUXVhZFBhcnQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJCX0KKworCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisKKwkJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOworCisJCS8vCisJCS8vIEtpY2sgb3V0IFR4CisJCS8vCisJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKwl9CisKK30KKworCitWT0lEIFNUQV9BTVNEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQlzdWJGcmFtZVBheWxvYWRMZW4gPSAwOwkvLyBBTVNEVSBTdWJmcmFtZSBsZW5ndGggd2l0aG91dCBBTVNEVS1IZWFkZXIgLyBQYWRkaW5nLgorCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKKwlVQ0hBUgkJCSpzdWJGcmFtZUhlYWRlcjsKKwlVQ0hBUgkJCXBhZGRpbmcgPSAwOworCVVTSE9SVAkJCUZpcnN0VHggPSAwLCBMYXN0VHhJZHggPSAwOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlpbnQgCQkJZnJhbWVOdW0gPSAwOworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID4gMSkpOworCisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisKKwkJCS8vIE5PVEU6IFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCQl9CisJCWVsc2UKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKKwkJCXBhZGRpbmcgPSBST1VORF9VUChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuLCA0KSAtIChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBhZGRpbmcgKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gcGFkZGluZzsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBhZGRpbmc7CisJCX0KKworCQkvLworCQkvLyBBLU1TRFUgc3ViZnJhbWUKKwkJLy8gICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcAorCQkvLworCQlzdWJGcmFtZUhlYWRlciA9IHBIZWFkZXJCdWZQdHI7CisJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCU5kaXNNb3ZlTWVtb3J5KHN1YkZyYW1lSGVhZGVyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKworCisJCXBIZWFkZXJCdWZQdHIgKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisKKworCQkvLworCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCisJCS8vCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCisJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJc3ViRnJhbWVQYXlsb2FkTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwkJLy8gdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZAorCQlzdWJGcmFtZUhlYWRlclsxMl0gPSAoc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjAwKSA+PiA4OworCQlzdWJGcmFtZUhlYWRlclsxM10gPSBzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGOworCisJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCArKzsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9IHRvdGFsTVBEVVNpemU7CisJCX0KKworCX0KKworCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7CisJSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFNUQV9MZWdhY3lfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJQVNTRVJUKHBUeEJsayk7CisKKworCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwl7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTUNBU1RfRlJBTUUpCisJeworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudCk7CisJfQorCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9SVFMocFR4QmxrLT5wUGFja2V0KSkKKwkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JSdHNSZXF1aXJlZCk7CisJZWxzZQorCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlpZiAocFR4QmxrLT5UeFJhdGUgPCBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUpCisJCXBUeEJsay0+VHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCisJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CisJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisKKwkvLyBza2lwIDgwMi4zIGhlYWRlcgorCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwl7CisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQkvLworICAgCQkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKKwkJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCVVDSEFSIHZsYW5fc2l6ZTsKKworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJcEhlYWRlckJ1ZlB0ciArPSA2OworCQkJLy8gc2tpcCB2bGFuIHRhZworCQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCX0KKworCX0KKworCS8vCisJLy8gcHJlcGFyZSBmb3IgVFhXSQorCS8vIHVzZSBXY2lkIGFzIEtleSBJbmRleAorCS8vCisKKwlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOworCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCitWT0lEIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKKwlVU0hPUlQJCQlGaXJzdFR4LCBMYXN0VHhJZHg7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI9PSAyKSk7CisKKworCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOyAgLy8gSXMgaXQgb2sgaW5pdCB0aGV5IGFzIDA/CisJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKKwl7CisJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCisJCS8vIHNraXAgdmxhbiB0YWcKKwkJaWYgKGJWTEFOUGt0KQorCQl7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQl9CisKKwkJaWYgKGZyYW1lTnVtID09IDApCisJCXsJLy8gRm9yIGZpcnN0IGZyYW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgODAyLjExIGhlYWRlciArIHBhZGRpbmcob3B0aW9uYWwpICsgUkEtQUdHLUxFTiArIFNOQVAgSGVhZGVyCisKKwkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAorCQkJLy8Jd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CS8vIEZvciBzZWNvbmQgYWdncmVnYXRlZCBmcmFtZSwgd2UgbmVlZCBjcmVhdGUgdGhlIDgwMi4zIGhlYWRlciB0byBoZWFkZXJCdWYsIGJlY2F1c2UgUENJIHdpbGwgY29weSBpdCB0byBTRFB0cjAuCisKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSAwOworCisJCQkvLyBBLVJhbGluayBzdWItc2VxdWVudCBmcmFtZSBoZWFkZXIgaXMgdGhlIHNhbWUgYXMgODAyLjMgaGVhZGVyLgorCQkJLy8gICBEQSg2KStTQSg2KStGcmFtZVR5cGUoMikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAxMjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRDsKKwkJfQorCisJCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQlpZiAoZnJhbWVOdW0gPT0wKQorCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJZWxzZQorCQkJTGFzdFR4SWR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCisJCWZyYW1lTnVtKys7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKKworfQorCisKK1ZPSUQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSwkJKnBUeEJsaykKK3sKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVUNIQVIgCQkJZnJhZ051bSA9IDA7CisJUEFDS0VUX0lORk8JCVBhY2tldEluZm87CisJVVNIT1JUCQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKwlVSU5UMzIJCQlGcmVlTXBkdVNpemUsIFNyY1JlbWFpbmluZ0J5dGVzOworCVVTSE9SVAkJCUFja0R1cmF0aW9uOworCVVJTlQgCQkJTmV4dE1wZHVTaXplOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpKTsKKwliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisJCXBUeEJsay0+cFBhY2tldCA9IGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhwQWQsIHBUeEJsay0+cFBhY2tldCk7CisJCWlmIChwVHhCbGstPnBQYWNrZXQgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKwl9CisKKwkvLyBza2lwIDgwMi4zIGhlYWRlcgorCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCisJLy8gc2tpcCB2bGFuIHRhZworCWlmIChiVkxBTlBrdCkKKwl7CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwl9CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopcEhlYWRlckJ1ZlB0cjsKKworCisJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKKwl7CisJCS8vCisJCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCisJCS8vCisJCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKKwkJcEhlYWRlckJ1ZlB0ciArPTI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCX0KKworCS8vCisJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCisJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisKKworCS8vCisJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCS8vCisJLy8KKyAgIAkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKKwkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCisJLy8KKwlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwl7CisJCVVDSEFSIHZsYW5fc2l6ZTsKKworCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CisJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJLy8gc2tpcCB2bGFuIHRhZworCQl2bGFuX3NpemUgPSAgKGJWTEFOUGt0KSA/IExFTkdUSF84MDJfMVEgOiAwOworCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7CisJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCX0KKworCisJLy8gSWYgVEtJUCBpcyB1c2VkIGFuZCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLiBEcml2ZXIgaGFzIHRvCisJLy8JYXBwZW5kIFRLSVAgTUlDIGF0IHRhaWwgb2YgdGhlIHNjYXR0ZXIgYnVmZmVyCisJLy8JTUFDIEFTSUMgd2lsbCBvbmx5IHBlcmZvcm0gSVYvRUlWL0lDViBpbnNlcnRpb24gYnV0IG5vIFRLSVAgTUlDCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsKKworCQkvLyBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0CisJCS8vCQkJdG8gY29ycmVjdCBsZW5naHQsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuCisJCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwgJnBBZC0+UHJpdmF0ZUluZm8uVHguTUlDWzBdLCA4KTsKKwkJLy9za2JfcHV0KChSVFBLVF9UT19PU1BLVChwVHhCbGstPnBQYWNrZXQpKS0+dGFpbCwgOCk7CisJCXBUeEJsay0+U3JjQnVmTGVuICs9IDg7CisJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSA4OworCQlwVHhCbGstPkNpcGhlckFsZyA9IENJUEhFUl9US0lQX05PX01JQzsKKwl9CisKKwkvLworCS8vIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMKKwkvLyBhZmZlY3RzIHRoZSBjYWxjdWxhdGUgb2YgImR1cmF0aW9uIiBmaWVsZAorCS8vCisJaWYgKChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpIHx8IChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KSkKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gODsgLy9XRVA6IElWWzRdICsgSUNWWzRdOworCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTI7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSwgTUlDIHdpbGwgYmUgYWRkZWQgdG8gVG90YWxQYWNrZXRMZW5ndGgKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMjA7Ly9US0lQOiBJVls0XSArIEVJVls0XSArIElDVls0XSArIE1JQ1s4XQorCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9BRVMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDE2OwkvLyBBRVM6IElWWzRdICsgRUlWWzRdICsgTUlDWzhdCisJZWxzZQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOworCisJLy8gZGVjaWRlIGhvdyBtdWNoIHRpbWUgYW4gQUNLL0NUUyBmcmFtZSB3aWxsIGNvbnN1bWUgaW4gdGhlIGFpcgorCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPlR4UmF0ZV0sIDE0KTsKKworCS8vIEluaXQgdGhlIHRvdGFsIHBheWxvYWQgbGVuZ3RoIG9mIHRoaXMgZnJhbWUuCisJU3JjUmVtYWluaW5nQnl0ZXMgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCXBUeEJsay0+VG90YWxGcmFnTnVtID0gMHhmZjsKKworCWRvIHsKKworCQlGcmVlTXBkdVNpemUgPSBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCAtIExFTkdUSF9DUkM7CisKKwkJRnJlZU1wZHVTaXplIC09IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQlpZiAoU3JjUmVtYWluaW5nQnl0ZXMgPD0gRnJlZU1wZHVTaXplKQorCQl7CS8vIHRoaXMgaXMgdGhlIGxhc3Qgb3Igb25seSBmcmFnbWVudAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IFNyY1JlbWFpbmluZ0J5dGVzOworCisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAwOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCQkJLy8gSW5kaWNhdGUgdGhlIGxvd2VyIGxheWVyIHRoYXQgdGhpcydzIHRoZSBsYXN0IGZyYWdtZW50LgorCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSBmcmFnTnVtOworCQl9CisJCWVsc2UKKwkJewkvLyBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkCisKKwkJCXBUeEJsay0+U3JjQnVmTGVuID0gRnJlZU1wZHVTaXplOworCisJCQlOZXh0TXBkdVNpemUgPSBtaW4oKChVSU5UKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLCAoKFVJTlQpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDE7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAoMyAqIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzKSArICgyICogQWNrRHVyYXRpb24pICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLCBOZXh0TXBkdVNpemUgKyBFbmNyeXB0aW9uT3ZlcmhlYWQpOworCQl9CisKKwkJaWYgKGZyYWdOdW0gPT0gMCkKKwkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOworCQllbHNlCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX1NJRlM7CisKKwkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCQlIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgJkZyZWVOdW1iZXIpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJCS8vIFVwZGF0ZSB0aGUgZnJhbWUgbnVtYmVyLCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgTkRJUyBwYWNrZXQgcGF5bG9hZC4KKworCQkvLyBzcGFjZSBmb3IgODAyLjExIGhlYWRlci4KKwkJaWYgKGZyYWdOdW0gPT0gMCAmJiBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiAtPSBMRU5HVEhfODAyXzFfSDsKKworCQlmcmFnTnVtKys7CisJCVNyY1JlbWFpbmluZ0J5dGVzIC09IHBUeEJsay0+U3JjQnVmTGVuOworCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IHBUeEJsay0+U3JjQnVmTGVuOworCisJCXBIZWFkZXJfODAyXzExLT5GcmFnKys7CSAvLyBpbmNyZWFzZSBGcmFnICMKKworCX13aGlsZShTcmNSZW1haW5pbmdCeXRlcyA+IDApOworCisJLy8KKwkvLyBLaWNrIG91dCBUeAorCS8vCisJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOworfQorCisKKyNkZWZpbmUgUkVMRUFTRV9GUkFNRVNfT0ZfVFhCTEsoX3BBZCwgX3BUeEJsaywgX3BRRW50cnksIF9TdGF0dXMpIAkJCQkJCQkJCQlcCisJCXdoaWxlKF9wVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQkJCQkJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCV9wUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZfcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJCQkJCQkJCVwKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgUVVFVUVfRU5UUllfVE9fUEFDS0VUKF9wUUVudHJ5KSwgX1N0YXR1cyk7CVwKKwkJfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5CisJc2VudCBvdXQgdG8gYWlyLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFNUQUhhcmRUcmFuc21pdCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBUWF9CTEsgCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCkKK3sKKwlORElTX1BBQ0tFVAkJKnBQYWNrZXQ7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDAuIERPIFNBTklUWSBDSEVDSyBBTkQgU09NRSBFQVJMWSBQUkVQQVJBVElPTi4KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLworCUFTU0VSVChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpOworCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHhCbGstPlRvdGFsRnJhbWVOdW0gPT0gJWxkIVxuIiwgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCk7CisKKyNpZiAwIC8vZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCWlmICgocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkgJiYgKGlzQ2FycmllckRldGVjdEV4aXN0KHBBZCkgPT0gVFJVRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiU1RBSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNURVAgMS4gV0FLRSBVUCBQSFkKKwkvLwkJb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0IGFuZAorCS8vCQl0dXJuIG9mZiBQU00gYml0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBub3QgdG8gY2hhbmdlIFBTTSBiaXQsIGp1c3Qgc2VuZCB0aGlzIGZyYW1lIG91dD8KKwlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwl7CisJICAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljRm9yY2VXYWtldXAgQXQgSGFyZFR4XG4iKSk7CisJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCX0KKworCS8vIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLgorCWlmICgoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpICYmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID09IEZBTFNFKSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQorCQl8fCAoUlRNUF9HRVRfUEFDS0VUX1dBSShwVHhCbGstPnBQYWNrZXQpKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKSkKKwkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwl9CisKKwlzd2l0Y2ggKHBUeEJsay0+VHhGcmFtZVR5cGUpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFRYX0FNUERVX0ZSQU1FOgorCQkJCVNUQV9BTVBEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9BTVNEVV9GUkFNRToKKwkJCQlTVEFfQU1TRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgVFhfTEVHQUNZX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfTUNBU1RfRlJBTUU6CisJCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7CisJCQlicmVhazsKKwkJY2FzZSBUWF9SQUxJTktfRlJBTUU6CisJCQkJU1RBX0FSYWxpbmtfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfRlJBR19GUkFNRToKKwkJCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl7CisJCQkJLy8gSXQgc2hvdWxkIG5vdCBoYXBwZW5lZCEKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZW5kIGEgcGFjZWt0IHdhcyBub3QgY2xhc3NpZmllZCEhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOworCQkJCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikKKwkJCQl7CisJCQkJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJCQkJaWYgKHBQYWNrZXQpCisJCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKworfQorCitVTE9ORyAgSGFzaEJ5dGVzUG9seW5vbWlhbChVQ0hBUiAqdmFsdWUsIHVuc2lnbmVkIGludCBsZW4pCit7CisgICB1bnNpZ25lZCBjaGFyICp3b3JkID0gdmFsdWU7CisgICB1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKyAgIHVuc2lnbmVkIGludCBpOworCisgICBmb3IoaT0wOyBpIDwgbGVuOyBpKyspCisgICB7CisJICBpbnQgbW9kID0gaSAlIDMyOworCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pIDw8IG1vZDsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA+PiAoMzIgLSBtb2QpOworICAgfQorICAgcmV0dXJuIHJldDsKK30KKworVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlpZiAoVFJVRQorCQkpCisJeworCQlhbm5vdW5jZV84MDJfM19wYWNrZXQocEFkLCBwUGFja2V0KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zYW5pdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk4NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc2FuaXR5LmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJc2FuaXR5LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nICAyMDA0LTA5LTAxICAgICAgYWRkIFdNTSBzdXBwb3J0CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCit7CisgICAgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpJbmZvOworCisgICAgSW5mbyA9IChNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKikoTXNnKTsKKworICAgIGlmIChJbmZvLT5Tc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIGxlbmd0aFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKKyAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisgICAgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVVNIT1JUICpwQWlkLAorICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCisgICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKyAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAorICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKKyAgICBPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisgICAgT1VUIFVDSEFSICpwQ2tpcEZsYWcpCit7CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGUsICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworICAgIFBFSURfU1RSVUNUICAgcEVpZDsKKyAgICBVTE9ORyAgICAgICAgIExlbmd0aCA9IDA7CisKKwkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKwkqcEFkZEh0SW5mb0xlbiA9IDA7CisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OworICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOworCisgICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgICAgICAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisgICAgKnBDa2lwRmxhZyA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOworCisgICAgaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybQorICAgICpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsgLy8gQUlEIGlzIGxvdyAxNC1iaXQKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFs2XTsKKyAgICAqcFN1cFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0WzddOworICAgIGlmICgoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpIHx8ICgqcFN1cFJhdGVMZW4gPiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRlZFJhdGVzIElFXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKKworICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyAqcFN1cFJhdGVMZW47CisKKyAgICAvLyBtYW55IEFQIGltcGxlbWVudCBwcm9wcmlldGFyeSBJRXMgaW4gbm9uLXN0YW5kYXJkIG9yZGVyLCB3ZSdkIGJldHRlcgorICAgIC8vIHRvbGVyYXRlIG1pcy1vcmRlcmVkIElFcyB0byBnZXQgYmVzdCBjb21wYXRpYmlsaXR5CisgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgJnBGcmFtZS0+T2N0ZXRbOCArICgqcFN1cFJhdGVMZW4pXTsKKworICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCisgICAgeworICAgICAgICBzd2l0Y2ggKHBFaWQtPkVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBTSVpFX0hUX0NBUF9JRSk7CisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDI6CisJCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCisJCQl7CisJCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKKwkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWRkSHRJbmZvLCBwRWlkLT5PY3RldCwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKwkJCQkqcEFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQorCQkJeworCQkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IHBFaWQtPk9jdGV0WzBdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0NLSVA6CisgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBWeFdvcmsgdmVyc2lvbih3aWxsIG5vdCBiZSBzdXBwb3J0ZWQpIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMjgKKyAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIElPUyB2ZXJzaW9uIHVzZWQgdGhpcyBJRSBsZW5ndGggYXMgMzAKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcworICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9JUEFERFJFU1M6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDBBKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gR2V0IENpc2NvIEFpcm9uZXQgSVAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIHBFaWQtPk9jdGV0ICsgNCwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIENDWDIsIFdNTSB1c2UgdGhlIHNhbWUgSUUgdmFsdWUKKyAgICAgICAgICAgIC8vIGNhc2UgSUVfQ0NYX1YyOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIFdNRSBQQVJBTVRFUiBFTEVNRU5UCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIC8vcEVkY2FQYXJtLT5iTW9yZURhdGFBY2sgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDgwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIENDWCBJRQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIHRoZSBzaXplIGFuZCBDQ1ggYWRtaW4gY29udHJvbAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIENDWDIgaWYgbWF0Y2hlZAorICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDY3gySWVJbmZvLCA1KSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIGlnbm9yZSB1bnJlY29nbml6ZWQgRUlEID0gJWRcbiIsIHBFaWQtPkVpZCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsKKyAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisgICAgfQorCisgICAgLy8gRm9yY2UgQ0NYMiBlbmFibGUgdG8gVFJVRSBmb3IgdGhvc2UgQVAgZGlkbid0IHJlcGxheSBDQ1ggdjIgSUUsIHdlIHN0aWxsIGZvcmNlIGl0IHRvIGJlIG9uCisgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIENIQVIgU3NpZFtdLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCit7CisgICAgVUNIQVIgICAgICAgICBJZHg7CisgICAgVUNIQVIJICAgICAgUmF0ZUxlbjsKKyAgICBDSEFSICAgICAgICAgIEllVHlwZTsKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisKKyAgICBpZiAoKHBGcmFtZS0+T2N0ZXRbMF0gIT0gSUVfU1NJRCkgfHwgKHBGcmFtZS0+T2N0ZXRbMV0gPiBNQVhfTEVOX09GX1NTSUQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTU0lEIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0WzBdLHBGcmFtZS0+T2N0ZXRbMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IHBGcmFtZS0+T2N0ZXRbMV07CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgJnBGcmFtZS0+T2N0ZXRbMl0sICpwU3NpZExlbik7CisKKyAgICBJZHggPSAqcFNzaWRMZW4gKyAyOworCisgICAgLy8gLS0gZ2V0IHN1cHBvcnRlZCByYXRlcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBJZVR5cGUgPSBwRnJhbWUtPk9jdGV0W0lkeF07CisgICAgUmF0ZUxlbiA9IHBGcmFtZS0+T2N0ZXRbSWR4ICsgMV07CisgICAgaWYgKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlclByb2JlUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0UmF0ZXMgSUUoVHlwZT0lZCxMZW49JWQpXG4iLHBGcmFtZS0+T2N0ZXRbSWR4XSxwRnJhbWUtPk9jdGV0W0lkeCsxXSkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoUmF0ZUxlbiA8IDgpKQorICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBHZXRUaW1CaXQoCisgICAgSU4gQ0hBUiAqUHRyLAorICAgIElOIFVTSE9SVCBBaWQsCisgICAgT1VUIFVDSEFSICpUaW1MZW4sCisgICAgT1VUIFVDSEFSICpCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpEdGltUGVyaW9kLAorICAgIE9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpCit7CisgICAgVUNIQVIgICAgICAgICAgQml0Q250bCwgTjEsIE4yLCBNeUJ5dGUsIE15Qml0OworICAgIENIQVIgICAgICAgICAgKklkeFB0cjsKKworICAgIElkeFB0ciA9IFB0cjsKKworICAgIElkeFB0ciArKzsKKyAgICAqVGltTGVuID0gKklkeFB0cjsKKworICAgIC8vIGdldCBEVElNIENvdW50IGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIgKys7CisgICAgKkR0aW1Db3VudCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBQZXJpb2QgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgICpEdGltUGVyaW9kID0gKklkeFB0cjsKKworICAgIC8vIGdldCBCaXRtYXAgQ29udHJvbCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyKys7CisgICAgQml0Q250bCA9ICpJZHhQdHI7CisKKyAgICBpZiAoKCpEdGltQ291bnQgPT0gMCkgJiYgKEJpdENudGwgJiAweDAxKSkKKyAgICAgICAgKkJjYXN0RmxhZyA9IFRSVUU7CisgICAgZWxzZQorICAgICAgICAqQmNhc3RGbGFnID0gRkFMU0U7CisKKyAgICAvLyBQYXJzZSBQYXJ0aWFsIFZpcnR1YWwgQml0bWFwIGZyb20gVElNIGVsZW1lbnQKKyAgICBOMSA9IEJpdENudGwgJiAweGZlOyAgICAvLyBOMSBpcyB0aGUgZmlyc3QgYml0bWFwIGJ5dGUjCisgICAgTjIgPSAqVGltTGVuIC0gNCArIE4xOyAgLy8gTjIgaXMgdGhlIGxhc3QgYml0bWFwIGJ5dGUjCisKKyAgICBpZiAoKEFpZCA8IChOMSA8PCAzKSkgfHwgKEFpZCA+PSAoKE4yICsgMSkgPDwgMykpKQorICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBNeUJ5dGUgPSAoQWlkID4+IDMpIC0gTjE7ICAgICAgICAgICAgICAgICAgICAgICAvLyBteSBieXRlIHBvc2l0aW9uIGluIHRoZSBiaXRtYXAgYnl0ZS1zdHJlYW0KKyAgICAgICAgTXlCaXQgPSBBaWQgJSAxNiAtICgoTXlCeXRlICYgMHgwMSk/IDg6MCk7CisKKyAgICAgICAgSWR4UHRyICs9IChNeUJ5dGUgKyAxKTsKKworICAgICAgICAvL2lmICgqSWR4UHRyKQorICAgICAgICAvLyAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlRJTSBiaXRtYXAgPSAweCUwMnhcbiIsICpJZHhQdHIpKTsKKworICAgICAgICBpZiAoKklkeFB0ciAmICgweDAxIDw8IE15Qml0KSkKKyAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IFRSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4OTc1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3N5bmMuYwpAQCAtMCwwICsxLDE3NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJc3luYy5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZwkyMDA0LTA5LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0MjU2MS8yNjYxCisJSmFuIExlZQkJMjAwNi0wOC0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI4NjAgZm9yIDgwMi4xMW4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRQkoMipPU19IWikJLy8gMiBzZWMKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGUgc3luYyBzdGF0ZSBtYWNoaW5lLAorCVBhcmFtZXRlcnM6CisJCVNtIC0gcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorCU5vdGU6CisJCXRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9TWU5DX1NUQVRFLCBNQVhfU1lOQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgU1lOQ19JRExFLCBTWU5DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBjb2x1bW4gMQorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU2NhblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVKb2luUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTdGFydFJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfUFJPQkVfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQcm9iZVJlcUFjdGlvbik7CisKKwkvL2NvbHVtbiAyCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRKb2luQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9CRUFDT05fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKTsKKworCS8vIGNvbHVtbiAzCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblN0YXJ0KTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfUFJPQkVfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9TQ0FOX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpU2NhblRpbWVvdXRBY3Rpb24pOworCisJLy8gdGltZXIgaW5pdAorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQmVhY29uIHRpbWVvdXQgaGFuZGxlciwgZXhlY3V0ZWQgaW4gdGltZXIgdGhyZWFkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQmVhY29uVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTWU5DIC0gQmVhY29uVGltZW91dFxuIikpOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJCSkKKwl7CisJCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCUJCUFZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIDQwTUh6IGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9CRUFDT05fVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKQorCXsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKwllbHNlCisJeworCQkvLyBUbyBwcmV2ZW50IFN5bmNNYWNoaW5lLkN1cnJTdGF0ZSBpcyBTQ0FOX0xJU1RFTiBmb3JldmVyLgorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CisJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBTQ0FOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgU2NhblR5cGUsIEJzc1R5cGUsIEJCUFZhbHVlID0gMDsKKwlCT09MRUFOICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORwkJICAgTm93OworCVVTSE9SVCAgICAgICAgIFN0YXR1czsKKwlQSEVBREVSXzgwMl8xMSBwSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgTlN0YXR1czsKKworCS8vIENoZWNrIHRoZSB0b3RhbCBzY2FuIHRyaWVzIGZvciBvbmUgc2luZ2xlIE9JRCBjb21tYW5kCisJLy8gSWYgdGhpcyBpcyB0aGUgQ0NYIDIuMCBDYXNlLCBza2lwIHRoYXQhCisJaWYgKCAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbiBiZWZvcmUgU3RhcnR1cFxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gSW5jcmVhc2UgdGhlIHNjYW4gcmV0cnkgY291bnRlcnMuCisJcEFkLT5TdGFDZmcuU2NhbkNudCsrOworCisKKwkvLyBmaXJzdCBjaGVjayB0aGUgcGFyYW1ldGVyIHNhbml0eQorCWlmIChNbG1lU2NhblJlcVNhbml0eShwQWQsCisJCQkJCQkgIEVsZW0tPk1zZywKKwkJCQkJCSAgRWxlbS0+TXNnTGVuLAorCQkJCQkJICAmQnNzVHlwZSwKKwkJCQkJCSAgU3NpZCwKKwkJCQkJCSAgJlNzaWRMZW4sCisJCQkJCQkgICZTY2FuVHlwZSkpCisJeworCisJCS8vIENoZWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3QgcmVxdWVzdAorCQkvLyBTdXNwZW5kIE1TRFUgb25seSBhdCBzY2FuIHJlcXVlc3QsIG5vdCB0aGUgbGFzdCB0d28gbWVudGlvbmVkCisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKKwkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCQl9CisKKwkJLy8KKwkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgorCQkvLyBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQorCQkvLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJeworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7CisJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGRyODAyMTEtPkR1cmF0aW9uID0gMDsKKwkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCisJCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQorCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCX0KKwkJfQorCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkvLyByZWNvcmQgZGVzaXJlZCBCU1MgcGFyYW1ldGVycworCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7CisJCXBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9IFNjYW5UeXBlOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisKKwkJLy8gc3RhcnQgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbAorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOworCisJCS8vIENoYW5nZSB0aGUgc2NhbiBjaGFubmVsIHdoZW4gZGVhbGluZyB3aXRoIENDWCBiZWFjb24gcmVwb3J0CisJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWw7CisKKwkJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKKwkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIEpPSU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwlCU1NfRU5UUlkgICAgKnBCc3M7CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlIRUFERVJfODAyXzExIEhkcjgwMjExOworCU5ESVNfU1RBVFVTICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBVQ0hBUiAgICAgICAgcFN1cFJhdGUgPSBOVUxMOworCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbjsKKwlQVUNIQVIgICAgICAgIHBFeHRSYXRlID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBU3VwUmF0ZVtdID0gezB4OEMsIDB4MTIsIDB4OTgsIDB4MjQsIDB4YjAsIDB4NDgsIDB4NjAsIDB4NkN9OworCVVDSEFSICAgICAgICAgQVN1cFJhdGVMZW4gPSBzaXplb2YoQVN1cFJhdGUpL3NpemVvZihVQ0hBUik7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKnBJbmZvID0gKE1MTUVfSk9JTl9SRVFfU1RSVUNUICopKEVsZW0tPk1zZyk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZUpvaW5SZXFBY3Rpb24oQlNTICMlbGQpXG4iLCBwSW5mby0+QnNzSWR4KSk7CisKKworCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJcEJzcyA9ICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtwSW5mby0+QnNzSWR4XTsKKworCS8vIHJlY29yZCB0aGUgZGVzaXJlZCBTU0lEICYgQlNTSUQgd2UncmUgd2FpdGluZyBmb3IKKwlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzcy0+QnNzaWQpOworCisJLy8gSWYgQVAncyBTU0lEIGlzIG5vdCBoaWRkZW4sIGl0IGlzIE9LIGZvciB1cGRhdGluZyBzc2lkIHRvIE1sbWVBdXggYWdhaW4uCisJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBCc3MtPlNzaWRMZW47CisJfQorCisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQnNzLT5Cc3NUeXBlOworCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEJzcy0+Q2hhbm5lbDsKKwlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQnNzLT5DZW50cmFsQ2hhbm5lbDsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKSAmJgorCQkocEJzcy0+Ykhhc0NvdW50cnlJRSA9PSBUUlVFKSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDIpOworCQlpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnSScpCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBJRE9SOworCQllbHNlIGlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdPJykKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IE9ET1I7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7CisJCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOworCX0KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CisKKwkvLyBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgSk9JTl9USU1FT1VUKTsKKworICAgIGRvCisJeworCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKyAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisgICAgICAgICAgICApCisJCXsKKwkJCS8vCisJCQkvLyBXZSBjYW4ndCBzZW5kIGFueSBQcm9iZSByZXF1ZXN0IGZyYW1lIHRvIG1lZXQgODAyLjExaC4KKwkJCS8vCisJCQlpZiAocEJzcy0+SGlkZGVuID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvLworCQkvLyBzZW5kIHByb2JlIHJlcXVlc3QKKwkJLy8KKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwkJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCXBTdXBSYXRlID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZTsKKwkJCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJCQlwRXh0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisJCQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdmVyd3JpdGUgU3VwcG9ydCBSYXRlLCBDQ0sgcmF0ZSBhcmUgbm90IGFsbG93ZWQKKwkJCQkvLworCQkJCXBTdXBSYXRlID0gQVN1cFJhdGU7CisJCQkJU3VwUmF0ZUxlbiA9IEFTdXBSYXRlTGVuOworCQkJCUV4dFJhdGVMZW4gPSAwOworCQkJfQorCisJCQlpZiAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQllbHNlCisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmSGRyODAyMTEsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAkgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAorCQkJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICBwU3VwUmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKEV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgVG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICAgcEV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCX0KKworCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKyAgICB9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU3dpdGNoIHRvIGNoICVkLCBXYWl0IEJFQUNPTiBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLCBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gSk9JTl9XQUlUX0JFQUNPTjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIFNUQVJUIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUsIHN0YXJ0aW5nIGFuIElCU1MKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47CisJQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKKworCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOyAJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUxBUkdFX0lOVEVHRVIJCQkJVGltZVN0YW1wOworCUJPT0xFQU4gUHJpdmFjeTsKKwlVU0hPUlQgU3RhdHVzOworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisJVGltZVN0YW1wLnUuTG93UGFydCAgPSAwOworCVRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gMDsKKworCWlmIChNbG1lU3RhcnRSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgU3NpZCwgJlNzaWRMZW4pKQorCXsKKwkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkvLworCQkvLyBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4KKwkJLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uIFxuIikpOworCQlwQWQtPk1sbWVBdXguQnNzVHlwZSAgICAgICAgICAgPSBCU1NfQURIT0M7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gICAgICAgICAgID0gU3NpZExlbjsKKworCQkvLyBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRAorCQlNYWNBZGRyUmFuZG9tQnNzaWQocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKKworCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvICAgID0gQ0FQX0dFTkVSQVRFKDAsMSxQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAxLCAwKTsKKwkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCAgICAgID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCQlwQWQtPk1sbWVBdXguQXRpbVdpbiAgICAgICAgICAgPSBwQWQtPlN0YUNmZy5BdGltV2luOworCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCAgICAgICAgICAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCisJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCXsKKwkJCVJUTVBVcGRhdGVIVElFKCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisJCQkvLyBOb3QgdHVybiBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFIGhlcmUuCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC1wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFXG4iKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKKwkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCX0KKwkJLy8gdGVtcG9yYXJpbHkgbm90IHN1cHBvcnQgUU9TIGluIElCU1MKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oY2g9ICVkLHN1cCByYXRlcz0gJWQsIGV4dCByYXRlcz0lZClcbiIsCisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CisKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpKTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIGJlYWNvbiBiYWNrIHdoZW4gc2Nhbm5pbmcKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsCisJCQkJCVNzaWRMZW4sIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBNZXNzYWdlVG9NZTsKKwlDRl9QQVJNICAgICAgICAgQ2ZQYXJtOworCVVTSE9SVCAgICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOworCVBGUkFNRV84MDJfMTEgICBwRnJhbWU7CisJTEFSR0VfSU5URUdFUiAgIFRpbWVTdGFtcDsKKwlVQ0hBUiAgICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgCVN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJICAJU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVU0hPUlQgCQkJTGVuVklFOworCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVUxPTkcJCQkJCQlSYWxpbmtJZTsKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisKKwkvLyBOZGlzRmlsbE1lbW9yeShTc2lkLCBNQVhfTEVOX09GX1NTSUQsIDB4MDApOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBFbGVtLT5Nc2c7CisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2ZQYXJtLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQlVTE9ORyBJZHg7CisJCUNIQVIgUnNzaSA9IDA7CisKKwkJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOworCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQlSc3NpID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUnNzaTsKKworCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkKKwkJCUh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkgJiYgKENoYW5uZWwgPT0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwpKQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbixFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQorCQkJCQlBaXJvbmV0QWRkQmVhY29uUmVwb3J0KHBBZCwgSWR4LCBFbGVtKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCUlkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgICZIdENhcGFiaWxpdHksCisJCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCisJCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W3BBZC0+Q29tbW9uQ2ZnLkNoYW5uZWxMaXN0SWR4XS5iRWZmZWN0ZWRDaGFubmVsID09IFRSVUUpCisJCQl7CisJCQkJVUNIQVIJCVJlZ0NsYXNzOworCQkJCVBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eTIocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJlJlZ0NsYXNzKTsKKwkJCQlUcmlFdmVudFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLCBCc3NpZCwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBSZWdDbGFzcywgQ2hhbm5lbCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQl9CisJCX0KKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZWQKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlXaGVuIHdhaXRpbmcgam9pbmluZyB0aGUgKEkpQlNTLCBiZWFjb24gcmVjZWl2ZWQgZnJvbSBleHRlcm5hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBCc3NUeXBlLCBDaGFubmVsLCBNZXNzYWdlVG9NZSwKKwkJCQkgIER0aW1Db3VudCwgRHRpbVBlcmlvZCwgQmNhc3RGbGFnLCBOZXdDaGFubmVsOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCVVTSE9SVCAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlDRl9QQVJNICAgICAgIENmOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIENraXBGbGFnOworCVVTSE9SVCAJCSAgTGVuVklFOworCVVDSEFSCQkgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVU0hPUlQgICAgICAgIFN0YXR1czsKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgUmFsaW5rSWU7CisJVUxPTkcgICAgICAgICBJZHg7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCQlDZW50cmFsQ2hhbm5lbDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2YsCisJCQkJCQkJCSZBdGltV2luLAorCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJCSZFcnAsCisJCQkJCQkJCSZEdGltQ291bnQsCisJCQkJCQkJCSZEdGltUGVyaW9kLAorCQkJCQkJCQkmQmNhc3RGbGFnLAorCQkJCQkJCQkmTWVzc2FnZVRvTWUsCisJCQkJCQkJCVN1cFJhdGUsCisJCQkJCQkJCSZTdXBSYXRlTGVuLAorCQkJCQkJCQlFeHRSYXRlLAorCQkJCQkJCQkmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkNraXBGbGFnLAorCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAorCQkJCQkJCQkmRWRjYVBhcm0sCisJCQkJCQkJCSZRYnNzTG9hZCwKKwkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSZSYWxpbmtJZSwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZIdENhcGFiaWxpdHksCisJCQkJCQkJCSZBZGRIdEluZm9MZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJCQkJCQkmTGVuVklFLAorCQkJCQkJCQlwVklFKSkKKwl7CisJCS8vIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZQorCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbik8IDEyKSkKKwkJCXJldHVybjsKKworCQkvLyBCRUFDT04gZnJvbSBkZXNpcmVkIEJTUy9JQlNTIGZvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgbW9zdAorCQkvLyBCU1MgcGFyYW1ldGVycyBoZXJlLgorCQkvLyBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFURUlPTj8KKwkJLy8gICAgRG8gd2UgbmVlZCB0byByZWNlb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/CisJCS8vIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWQKKwkJLy8gICAgYSBuZXcgSk9JTi1BVVRILUFTU09DIHNlcXVlbmNlLgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSByZWNlaXZlIGRlc2lyZWQgQkVBQ09OIGF0IEpvaW5XYWl0QmVhY29uLi4uIENoYW5uZWwgPSAlZFxuIiwgQ2hhbm5lbCkpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCS8vIFVwZGF0ZSBSU1NJIHRvIHByZXZlbnQgTm8gc2lnbmFsIGRpc3BsYXkgd2hlbiBjYXJkcyBmaXJzdCBpbml0aWFsaXplZAorCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMQk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSA8PCAzOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMgk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4CT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA8PCAzOworCisJCQkvLworCQkJLy8gV2UgbmVlZCB0byBjaGVjayBpZiBTU0lEIG9ubHkgc2V0IHRvIGFueSwgdGhlbiB3ZSBjYW4gcmVjb3JkIHRoZSBjdXJyZW50IFNTSUQuCisJCQkvLyBPdGhlcndpc2Ugd2lsbCBjYXVzZSBoaWRkZW4gU1NJRCBhc3NvY2lhdGlvbiBmYWlsZWQuCisJCQkvLworCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkTGVuID09IDApCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQ2hhbm5lbCk7CisKKwkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQkJeworCQkJCQkvLworCQkJCQkvLyBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbworCQkJCQkvLworCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOworCQkJCX0KKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CisJCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7CisJCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOworCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBDaGFubmVsOworCQkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gPSBBdGltV2luOworCQkJcEFkLT5NbG1lQXV4LkNmcFBlcmlvZCA9IENmLkNmcFBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOworCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKKworCQkJLy8gQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QKKwkJCS8vIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUKKwkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgMTYpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKKworCQkJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgaHQgcmF0ZXMKKwkJCWlmICgoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJeworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisgICAJCQkJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCisJCQkJLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKwkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlpZiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApCisJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9IFRSVUU7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvKTsKKwkJCQkvLyBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24hIChNcGR1RGVuc2l0eT0lZCwgTWF4UkFtcGR1RmFjdG9yPSVkLCBCVz0lZClcbiIsCisJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1wZHVEZW5zaXR5LCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IsIEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSk7CisKKwkJCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKKwkJCQl7CisJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOworCQkgCQkJLy8gQ2hlY2sgYWdhaW4gdGhlIEJhbmR3aWR0aCBjYXBhYmlsaXR5IG9mIHRoaXMgQVAuCisJCSAJCQlpZiAoKEFkZEh0SW5mby5Db250cm9sQ2hhbiA+IDIpJiYgKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCSAJCQl7CisJCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gLSAyOworCQkgCQkJfQorCQkgCQkJZWxzZSBpZiAoKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCSAJCQl7CisJCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOworCQkgCQkJfQorCisJCQkJCS8vIENoZWNrIEVycm9yIC4KKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPSBDZW50cmFsQ2hhbm5lbCkKKwkJIAkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkJlYWNvbiBDZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQuIE1sbWVhdXggQ2VudHJhbENoYW5uZWwgPSAlZFxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbiwgcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsKSk7CisKKwkJIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+Q2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLCAgLlxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbikpOworCisJCQkJfQorCisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7CisgICAJCQkJLy8gVG8gcHJldmVudCBlcnJvciwgbGV0IGxlZ2FjeSBBUCBtdXN0IGhhdmUgc2FtZSBDZW50cmFsQ2hhbm5lbCBhbmQgQ2hhbm5lbC4KKwkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5NbG1lQXV4LkNoYW5uZWw7CisKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOworCQkJfQorCisJCQlSVE1QVXBkYXRlTWxtZVJhdGUocEFkKTsKKworCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQkpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCAmRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBhZnRlciBKT0lOLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkXG4iLAorCQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLyBVcGRhdGUgQ2tpcEZsYWcKKwkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisKKwkJCS8vIEtlZXAgVGltZVN0YW1wIGZvciBSZS1Bc3NvY2lhdGlvbiB1c2VkLgorCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5DQ0tNTGlua1VwRmxhZyA9PSBUUlVFKSkKKwkJCQlwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wID0gVGltZVN0YW1wOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCisJCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCisJCQl7CisJCQkJLy9XZSBuZWVkIHRvIGNoYW5nZSBvdXIgVHhQb3dlciBmb3IgQ0NYIDIuMCBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgorCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfQorCQkJZWxzZSAgLy9Vc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UuCisJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworCQl9CisJCS8vIG5vdCB0byBtZSBCRUFDT04sIGlnbm9yZWQKKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZSB0aGlzIGZyYW1lCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcmVjZWl2ZSBCRUFDT04gZnJvbSBwZWVyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCUNGX1BBUk0gICAgICAgQ2ZQYXJtOworCVVDSEFSICAgICAgICAgU3NpZExlbiwgTWVzc2FnZVRvTWU9MCwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwgaW5kZXg9MDsKKwlVQ0hBUiAgICAgICAgIER0aW1Db3VudD0wLCBEdGltUGVyaW9kPTAsIEJjYXN0RmxhZz0wOworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm8sIEF0aW1XaW4sIEJlYWNvblBlcmlvZDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIFRidHROdW1Ub05leHRXYWtlVXA7CisJVUNIQVIgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwlVQ0hBUgkJICBDa2lwRmxhZzsKKwlVU0hPUlQgICAgICAgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwgUHJlTkh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlpZiAoIShJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkKKwkJKSkKKwkJcmV0dXJuOworCisJLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKKwlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCXBWSUUtPkxlbmd0aCA9IDA7CisgICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCisJCQkJCQkJCUVsZW0tPk1zZywKKwkJCQkJCQkJRWxlbS0+TXNnTGVuLAorCQkJCQkJCQlFbGVtLT5DaGFubmVsLAorCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJQnNzaWQsCisJCQkJCQkJCVNzaWQsCisJCQkJCQkJCSZTc2lkTGVuLAorCQkJCQkJCQkmQnNzVHlwZSwKKwkJCQkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJCQkJJkNoYW5uZWwsCisJCQkJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkJCQkmVGltZVN0YW1wLAorCQkJCQkJCQkmQ2ZQYXJtLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQlCT09MRUFOIGlzX215X2Jzc2lkLCBpc19teV9zc2lkOworCQlVTE9ORyAgIEJzc2lkeCwgTm93OworCQlCU1NfRU5UUlkgKnBCc3M7CisJCUNIQVIJCVJlYWxSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKworCQlpc19teV9ic3NpZCA9IE1BQ19BRERSX0VRVUFMKEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk/IFRSVUUgOiBGQUxTRTsKKwkJaXNfbXlfc3NpZCA9IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbik/IFRSVUU6RkFMU0U7CisKKworCQkvLyBpZ25vcmUgQkVBQ09OIG5vdCBmb3IgbXkgU1NJRAorCQlpZiAoKCEgaXNfbXlfc3NpZCkgJiYgKCEgaXNfbXlfYnNzaWQpKQorCQkJcmV0dXJuOworCisJCS8vIEl0IG1lYW5zIFNUQSB3YWl0cyBkaXNhc3NvYyBjb21wbGV0ZWx5IGZyb20gdGhpcyBBUCwgaWdub3JlcyB0aGlzIGJlYWNvbi4KKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9XQUlUX0RJU0FTU09DKQorCQkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIENvcHkgQ29udHJvbCBjaGFubmVsIGZvciB0aGlzIEJTU0lELgorCQlpZiAoQWRkSHRJbmZvTGVuICE9IDApCisJCQlDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOworCisJCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkKKwkJCUh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIEhvdXNla2VlcGluZyAiU3NpZEJzc1RhYiIgdGFibGUgZm9yIGxhdGVyLW9uIFJPQU1pbmcgdXNhZ2UuCisJCS8vCisJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCQl7CisJCQkvLyBkaXNjb3ZlciBuZXcgQVAgb2YgdGhpcyBuZXR3b3JrLCBjcmVhdGUgQlNTIGVudHJ5CisJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkJCSZIdENhcGFiaWxpdHksICZBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLEFkZEh0SW5mb0xlbixOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLAorCQkJCQkJUmVhbFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksCisJCQkJCQkmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpIC8vIHJldHVybiBpZiBCU1MgdGFibGUgZnVsbAorCQkJCXJldHVybjsKKworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisKKworCisJCX0KKworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKQorCQl7CisJCQkvLyBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuCisJCQkvLyBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIDEsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIDEpOworCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCQkgICAgUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJCS8vIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jCisKKwkJCS8vIGNoYW5uZWwgc2FuaXR5IGNoZWNrCisJCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQkJCXsKKwkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCX0KKwkJfQorCisJCS8vIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuCisJCS8vIFRoaXMgbWlnaHQgaGFwcGVuZWQgd2hlbiB0d28gU1RBIHN0YXJ0IGF0IHRoZSBzYW1lIHRpbWUKKwkJaWYgKCghIGlzX215X2Jzc2lkKSAmJiBBREhPQ19PTihwQWQpKQorCQl7CisJCQlJTlQJaTsKKworCQkJLy8gQWRkIHRoZSBzYWZlZ3VhcmQgYWdhaW5zdCB0aGUgbWlzbWF0Y2ggb2YgYWRob2Mgd2VwIHN0YXR1cworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5XZXBTdGF0dXMpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBjb2xsYXBzZSBpbnRvIHRoZSBBREhPQyBuZXR3b3JrIHdoaWNoIGhhcyBiaWdnZXIgQlNTSUQgdmFsdWUuCisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJeworCQkJCWlmIChCc3NpZFtpXSA+IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIG1lcmdlIHRvIHRoZSBJQlNTIHdpdGggYmlnZ2VyIEJTU0lEPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCQkJCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwkJCQkJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQnNzaWQpOworCQkJCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKwkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgQkVBQ09OIGZyYW1lIHRvIG9uLWNoaXAgbWVtb3J5CisJCQkJCWlzX215X2Jzc2lkID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKEJzc2lkW2ldIDwgcEFkLT5Db21tb25DZmcuQnNzaWRbaV0pCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdOworCQlwQnNzLT5Sc3NpID0gUmVhbFJzc2k7ICAgICAgIC8vIGxhc3Rlc3QgUlNTSQorCQlwQnNzLT5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisKKwkJLy8KKwkJLy8gQkVBQ09OIGZyb20gbXkgQlNTSUQgLSBlaXRoZXIgSUJTUyBvciBJTkZSQSBuZXR3b3JrCisJCS8vCisJCWlmIChpc19teV9ic3NpZCkKKwkJeworCQkJUlhXSV9TVFJVQwlSeFdJOworCisJCQlwQWQtPlN0YUNmZy5EdGltQ291bnQgPSBEdGltQ291bnQ7CisJCQlwQWQtPlN0YUNmZy5EdGltUGVyaW9kID0gRHRpbVBlcmlvZDsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CisKKworCQkJUnhXSS5SU1NJMCA9IEVsZW0tPlJzc2kwOworCQkJUnhXSS5SU1NJMSA9IEVsZW0tPlJzc2kxOworCQkJUnhXSS5SU1NJMiA9IEVsZW0tPlJzc2kyOworCisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgJlJ4V0kpOworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vCisJCQkJLy8gV2UgZ2V0IHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgcmVxdWlyZWQKKwkJCQkvLyBDaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIFR4UG93ZXIgTGltaXQgZm9yIENpc28gQ29tcGF0aWJsZSBFeHRlbnNpb25zCisJCQkJLy8KKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJCS8vIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBlcXVhbCB0byAweEZGIG1lYW5zIHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgbm90IGV4aXN0LgorCQkJCS8vIFVzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZSwgdGhhdCBzZXQgZnJvbSBVSS4KKwkJCQkvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisJCQl9CisKKwkJCWlmIChBREhPQ19PTihwQWQpICYmIChDQVBfSVNfSUJTU19PTihDYXBhYmlsaXR5SW5mbykpKQorCQkJeworCQkJCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisJCQkJVUNIQVIJCQlpZHg7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQkvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorCQkJICAgIGZvciAoaWR4PTA7IGlkeDxTdXBSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCisJCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQorCQkJICAgIHsKKwkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCisJCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKKwkJCSAgICB9CisKKwkJCQkvLyBsb29rIHVwIHRoZSBleGlzdGluZyB0YWJsZQorCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgQWRkcjIpOworCisJCQkJLy8gQWQtaG9jIG1vZGUgaXMgdXNpbmcgTUFDIGFkZHJlc3MgYXMgQkEgc2Vzc2lvbi4gU28gd2UgbmVlZCB0byBjb250aW51b3VzbHkgZmluZCBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbiBieSByZWNlaXZpbmcgYmVhY29uLgorCQkJCS8vIFRvIHByZXZlbnQgYWx3YXlzIGNoZWNrIHRoaXMsIHdlIHVzZSB3Y2lkID09IFJFU0VSVkVEX1dDSUQgdG8gcmVjb2duaXplIGl0IGFzIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uLgorCQkJCWlmICgoQURIT0NfT04ocEFkKSAmJiAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkgfHwKKwkJCQkJKHBFbnRyeSAmJiAoKHBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUpIDwgTm93KSkpCisJCQkJeworCQkJCQlpZiAocEVudHJ5ID09IE5VTEwpCisJCQkJCQkvLyBBbm90aGVyIGFkaG9jIGpvaW5pbmcsIGFkZCB0byBvdXIgTUFDIHRhYmxlLgorCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIEFkZHIyLCBCU1MwLCBGQUxTRSk7CisKKwkJCQkJaWYgKFN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCBwRW50cnksIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgQ2FwYWJpbGl0eUluZm8pID09IEZBTFNFKQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAtIEFkZCBFbnRyeSBmYWlsZWQuXG4iKSk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKworCQkJCQlpZiAocEVudHJ5ICYmCisJCQkJCQkoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKKwkJCQkJeworCQkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJCQkJUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzQ0xJKQorCQkJCQlwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7CisKKwkJCQkvLyBBdCBsZWFzdCBhbm90aGVyIHBlZXIgaW4gdGhpcyBJQlNTLCBkZWNsYXJlIE1lZGlhU3RhdGUgYXMgQ09OTkVDVEVECisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJeworCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCQkJCS8vIDIwMDMvMDMvMTIgLSBqb2huCisJCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdAorCQkJCQkvLyAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuCisJCQkJCS8vCisJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCQkJCQl7CisJCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCQkJCSZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsIDAsCisJCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQkJCX0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkJQk9PTEVBTiBiVXNlU2hvcnRTbG90LCBiVXNlQkdQcm90ZWN0aW9uOworCisJCQkJLy8gZGVjaWRlIHRvIHVzZS9jaGFuZ2UgdG8gLQorCQkJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkJCS8vICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbgorCQkJCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKworCQkJCS8vYlVzZVNob3J0U2xvdCA9IHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lICYmIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQliVXNlU2hvcnRTbG90ID0gQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWlmIChiVXNlU2hvcnRTbG90ICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQkJCQlBc2ljU2V0U2xvdFRpbWUocEFkLCBiVXNlU2hvcnRTbG90KTsKKworCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8ICAgIC8vIGFsd2F5cyB1c2UKKwkJCQkJCQkJICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOworCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gYWx3YXlzIG5vIEJHIHByb3RlY3Rpb24gaW4gQS1iYW5kLiBmYWxzZWx5IGhhcHBlbmVkIHdoZW4gc3dpdGNoaW5nIEEvRyBiYW5kIHRvIGEgZHVhbC1iYW5kIEFQCisJCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSBGQUxTRTsKKworCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24pCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksRkFMU0UsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLFRSVUUsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwgYlVzZUJHUHJvdGVjdGlvbikpOworCQkJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCS8vIGNoZWNrIEh0IHByb3RlY3Rpb24gbW9kZS4gYW5kIGFkaGVyZSB0byB0aGUgTm9uLUdGIGRldmljZSBpbmRpY2F0aW9uIGJ5IEFQLgorCQkJCWlmICgoQWRkSHRJbmZvTGVuICE9IDApICYmCisJCQkJCSgoQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpIHx8CisJCQkJCShBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCkpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKKwkJCQl7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIE4gT3BlcmFpb25Nb2RlIHRvICVkXG4iLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSAmJgorCQkJCQlFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKQorCQkJCXsKKwkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIExPTkcgcHJlYW1ibGVcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAgICAmJgorCQkJCQkoRWRjYVBhcm0uYlZhbGlkID09IFRSVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorCQkJCQkoRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICE9IHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2UgRURDQSBwYXJhbWV0ZXJzKGZyb20gJWQgdG8gJWQpXG4iLAorCQkJCQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQsCisJCQkJCQlFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgJkVkY2FQYXJtKTsKKwkJCQl9CisKKwkJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisKKwkJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBzdXBwb3J0IHBvd2VyLXNhdmluZyBmZWF0dXJlCisJCQlpZiAoKElORlJBX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkpIHx8IChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSkKKwkJCXsKKwkJCQlVQ0hBUiBGcmVlTnVtYmVyOworCQkJCS8vICAxLiBBUCBoYXMgYmFja2xvZ2dlZCB1bmljYXN0LXRvLW1lIGZyYW1lLCBzdGF5IEFXQUtFLCBzZW5kIFBTUE9MTAorCQkJCS8vICAyLiBBUCBoYXMgYmFja2xvZ2dlZCBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lIGFuZCB3ZSB3YW50IHRob3NlIGZyYW1lcywgc3RheSBBV0FLRQorCQkJCS8vICAzLiB3ZSBoYXZlIG91dGdvaW5nIGZyYW1lcyBpbiBUeFJpbmcgb3IgTWdtdFJpbmcsIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDQuIFBzbSBjaGFuZ2UgdG8gUFdSX1NBVkUsIGJ1dCBBUCBub3QgYmVlbiBpbmZvcm1lZCB5ZXQsIHdlIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDUuIG90aGVyd2lzZSwgcHV0IFBIWSBiYWNrIHRvIHNsZWVwIHRvIHNhdmUgYmF0dGVyeS4KKwkJCQlpZiAoTWVzc2FnZVRvTWUpCisJCQkJeworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCVJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoQmNhc3RGbGFnICYmIChEdGltQ291bnQgPT0gMCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQorCQkJCXsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXIgIT0gMCkJCQkJCQkJCQkJCQkJCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JLLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfQkUsIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WSSwgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX1ZPLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfTUdNVCwgTUdNVF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJCQkJeworCQkJCQkvLyBUT0RPOiBjb25zaWRlciBzY2hlZHVsZWQgSENDQS4gbWlnaHQgbm90IGJlIHByb3BlciB0byB1c2UgdHJhZGl0aW9uYWwgRFRJTS1iYXNlZCBwb3dlci1zYXZpbmcgc2NoZW1lCisJCQkJCS8vIGNhbiB3ZSBjaGVhdCBoZXJlIChpLmUuIGp1c3QgY2hlY2sgTUdNVCAmIEFDX0JFKSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlPworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlVU0hPUlQgTmV4dER0aW0gPSBEdGltQ291bnQ7CisKKwkJCQkJaWYgKE5leHREdGltID09IDApCisJCQkJCQlOZXh0RHRpbSA9IER0aW1QZXJpb2Q7CisKKwkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKKwkJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBOZXh0RHRpbTsKKworCQkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQkJCXsKKwkJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gbm90IG15IEJTU0lELCBpZ25vcmUgaXQKKwl9CisJLy8gc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZSB0aGlzIGZyYW1lCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVjZWl2ZSBQUk9CRSBSRVEgZnJvbSByZW1vdGUgcGVlciB3aGVuIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCVVDSEFSICAgICAgICAgU3NpZExlbjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJICBIdExlbiwgQWRkSHRMZW4sIE5ld0V4dExlbjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlIRUFERVJfODAyXzExIFByb2JlUnNwSGRyOworCU5ESVNfU1RBVFVTICAgTlN0YXR1czsKKwlQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKKwlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMH07CisJQk9PTEVBTiAgICAgICBQcml2YWN5OworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCSAgUlNOSWUgPSBJRV9XUEE7CisKKwlpZiAoISBBREhPQ19PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoUGVlclByb2JlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCBTc2lkLCAmU3NpZExlbikpCisJeworCQlpZiAoKFNzaWRMZW4gPT0gMCkgfHwgU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJeworCQkJLy8gYWxsb2NhdGUgYW5kIHNlbmQgb3V0IFByb2JlUnNwIGZyYW1lCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlyZXR1cm47CisKKwkJCS8vcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7ICAvLyA/Pz8/Pz8KKworCQkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwkJCUNhcGFiaWxpdHlJbmZvID0gQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAmUHJvYmVSc3BIZHIsCisJCQkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4pCisJCQl7CisJCQkJVUxPTkcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICZ0bXAsCisJCQkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLAorCQkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sICAgICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisKKwkJCS8vIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCXsKKwkJCQlVTE9ORyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCisJCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAorCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAgICAgIAlwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIAkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CisJCQkJQWRkSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlOZXdFeHRMZW4gPSAxOworCQkJCS8vTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBJRSBpcyBpbmNsdWRlZCBpbiBCZWFjb24sIFByb2JlIFJzcCBvciBjaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgRnJhbWUKKwkJCQlpZiAocEFkLT5iQnJvYWRDb21IVCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRJbmZvSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdExlbiwKKwkJCQkJCQkJIHNpemVvZihBRERfSFRfSU5GT19JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdFeHRDaGFuSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOZXdFeHRMZW4sCisJCQkJCQkJCSBzaXplb2YoTkVXX0VYVF9DSEFOX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0KKwkJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCX0KKwl9Cit9CisKK1ZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvblxuIikpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTY2FuIHRpbWVvdXQgcHJvY2VkdXJlLiBiYXNpY2FsbHkgYWRkIGNoYW5uZWwgaW5kZXggYnkgMSBhbmQgcmVzY2FuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBOZXh0Q2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworCS8vIE9ubHkgb25lIGNoYW5uZWwgc2Nhbm5lZCBmb3IgQ0lTQ08gYmVhY29uIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKKworCS8vIHRoaXMgcm91dGluZSB3aWxsIHN0b3AgaWYgcEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMAorCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBWU5DIC0gSW52YWxpZFN0YXRlV2hlblNjYW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkU3RhdGVXaGVuSm9pbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVQc1BvbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwlpZiAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKyAgICAJcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAoUFVDSEFSKSZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyAgICAgTlN0YXRlOworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZm9yY2Ugb3V0IGEgUHJvYmVSZXF1ZXN0IC4uLlxuIikpOworCisJTlN0YXRlID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdGUgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCisJCS8vIHRoaXMgUHJvYmVSZXF1ZXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBTU0lEIHRvIHJlZHVjZSB1bndhbnRlZCBQcm9iZVJlc3BvbnNlCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICZIZHI4MDIxMSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwl9CisKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSCQlFQ2hhbm5lbFsxMV07CisJVUNIQVIJCWksIGosIGs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisKKwlSVE1QWmVyb01lbW9yeShFQ2hhbm5lbCwgMTEpOworCWkgPSAwOworCS8vIEZpbmQgdXBwZXIgY2hhbm5lbCBhbmQgbG93ZXIgY2hhbm5lbC4KKwlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCX0KKwllbHNlCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmVsb3cgbG93ZXIgY2hhbm5lbC4uCisJaWYgKExvd2VyQ2hhbm5lbCA+IDEpCisJeworCQlFQ2hhbm5lbFswXSA9IExvd2VyQ2hhbm5lbCAtIDE7CisJCWkgPSAxOworCQlpZiAoTG93ZXJDaGFubmVsID4gMikKKwkJeworCQkJRUNoYW5uZWxbMV0gPSBMb3dlckNoYW5uZWwgLSAyOworCQkJaSA9IDI7CisJCQlpZiAoTG93ZXJDaGFubmVsID4gMykKKwkJCXsKKwkJCQlFQ2hhbm5lbFsyXSA9IExvd2VyQ2hhbm5lbCAtIDM7CisJCQkJaSA9IDM7CisJCQl9CisJCX0KKwl9CisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmV0d2VlbiAgbG93ZXIgY2hhbm5lbCBhbmQgdXBwZXIgY2hhbm5lbC4KKwlmb3IgKGsgPSBMb3dlckNoYW5uZWw7ayA8IFVwcGVyQ2hhbm5lbDtrKyspCisJeworCQlFQ2hhbm5lbFtpXSA9IGs7CisJCWkrKzsKKwl9CisJLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYWJvdmUgdXBwZXIgY2hhbm5lbC4uCisJaWYgKExvd2VyQ2hhbm5lbCA8IDExKQorCXsKKwkJRUNoYW5uZWxbaV0gPSBVcHBlckNoYW5uZWwgKyAxOworCQlpKys7CisJCWlmIChMb3dlckNoYW5uZWwgPCAxMCkKKwkJeworCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAyOworCQkJaSsrOworCQkJaWYgKExvd2VyQ2hhbm5lbCA8IDkpCisJCQl7CisJCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAzOworCQkJCWkrKzsKKwkJCX0KKwkJfQorCX0KKwkvLworCWZvciAoaiA9IDA7aiA8IGk7aisrKQorCXsKKwkJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJCXsKKwkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gRUNoYW5uZWxbal0pCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtrXS5iRWZmZWN0ZWRDaGFubmVsID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiBFZmZlY3RlZENoYW5uZWwoID0lZClcbiIsIEVDaGFubmVsW2pdKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitCT09MRUFOIFNjYW5SdW5uaW5nKAorCQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU0NBTl9MSVNURU4pID8gVFJVRSA6IEZBTFNFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3dwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS93cGEuYwpAQCAtMCwwICsxLDIxMDcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAorCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUJCVdQQVJTTklFCTB4ZGQKKyNkZWZpbmUJCVdQQTJSU05JRQkweDMwCisKKy8vZXh0ZXJuIFVDSEFSIEJJVDhbXTsKK1VDSEFSCUNpcGhlcldwYVBza1RraXBbXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyV3BhUHNrQWVzW10gPSB7CisJCTB4REQsIDB4MTYsIAkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlcldwYVBza0Flc0xlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrQWVzKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgIC8vIEF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00pIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXSA9IHsKKwkJMHhERCwgMHgxOCwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0CisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDQwLCAweDk2LCAweDAwLAorCQkweDI4LCAweDAwLy8gQXV0aGVudGljYXRpb24KKwkJfTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00yNCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDQ1hUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDQ1hfTExDX0hEUltdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OworVUNIQVIJTExDX05PUk1BTFtdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCitVQ0hBUglFQVBPTF9GUkFNRVtdID0gezB4ODgsIDB4OEV9OworCitCT09MRUFOIENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJT1VUCVVDSEFSCQkJKk9mZnNldCk7CisKK3ZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2xhc3NpZnkgV1BBIEVBUCBtZXNzYWdlIHR5cGUKKworCUFyZ3VtZW50czoKKwkJRUFQVHlwZQkJVmFsdWUgb2YgRUFQIG1lc3NhZ2UgdHlwZQorCQlNc2dUeXBlCQlJbnRlcm5hbCBNZXNzYWdlIGRlZmluaXRpb24gZm9yIE1MTUUgc3RhdGUgbWFjaGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlGb3VuZCBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKwkJRkFMU0UJCU5vIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlBbGwgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHdwYS5oCisJCUZvciBzdXBwbGljYW50LCB0aGVyZSBpcyBvbmx5IEVBUE9MIEtleSBtZXNzYWdlIGF2YWxpYWJsZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglXcGFNc2dUeXBlU3Vic3QoCisJSU4JVUNIQVIJRUFQVHlwZSwKKwlPVVQJSU5UCQkqTXNnVHlwZSkKK3sKKwlzd2l0Y2ggKEVBUFR5cGUpCisJeworCQljYXNlIEVBUFBhY2tldDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUFBhY2tldDsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MU3RhcnQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTFN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xMb2dvZmY6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTExvZ29mZjsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MS2V5OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xLZXk7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTEFTRkFsZXJ0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xBU0ZBbGVydDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbglzdGF0ZSBtYWNoaW5lIGluaXQsCWluY2x1ZGluZyBzdGF0ZQl0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtCXBvaW50ZXIJdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JU1RBVEVfTUFDSElORSAqUywKKwlPVVQJU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLAlUcmFucywgTUFYX1dQQV9QU0tfU1RBVEUsIE1BWF9XUEFfUFNLX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBXUEFfUFNLX0lETEUsIFdQQV9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFNLX0lETEUsIE1UMl9FQVBPTEtleSwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEtleUFjdGlvbik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcwlzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgorCQlXaGVuIHJlY2VpdmluZyBFQVBPTCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGtleSBtYW5hZ2VtZW50LgorCQlVc2UJYm90aCBpbglXUEEsIGFuZCBXUEFQU0sJY2FzZS4KKwkJSW4gdGhpcwlmdW5jdGlvbiwgZnVydGhlciBkaXNwYXRjaCB0byBkaWZmZXJlbnQJZnVuY3Rpb25zIGFjY29yZGluZwl0byB0aGUgcmVjZWl2ZWQJcGFja2V0LgkgMyBjYXRlZ29yaWVzIGFyZSA6CisJCSAgMS4gIG5vcm1hbCA0LXdheSBwYWlyd2lzZWtleSBhbmQgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCisJCSAgMi4gIE1JQyBlcnJvcgkoQ291bnRlcm1lYXN1cmVzIGF0dGFjaykgIHJlcG9ydCBwYWNrZXQJZnJvbSBTVEEuCisJCSAgMy4gIFJlcXVlc3QgZm9yIHBhaXJ3aXNlL2dyb3VwIGtleSB1cGRhdGUJZnJvbSBTVEEKKwlSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCUlOVCAgICAgICAgICAgICBNc2dUeXBlID0gRUFQT0xfTVNHX0lOVkFMSUQ7CisJUEtFWV9ERVNDUklQVEVSIHBLZXlEZXNjOworCVBIRUFERVJfODAyXzExICBwSGVhZGVyOyAvL3JlZAorCVVDSEFSICAgICAgICAgICBaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSIEVhcG9sVnI7CisJS0VZX0lORk8JCXBlZXJLZXlJbmZvOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tLS0+IFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7CisKKwkvLyBHZXQgODAyLjExIGhlYWRlciBmaXJzdAorCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIEdldCBFQVBvTC1LZXkgRGVzY3JpcHRvcgorCXBLZXlEZXNjID0gKFBLRVlfREVTQ1JJUFRFUikgJkVsZW0tPk1zZ1soTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEtleURlc2MtPktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykpOworCisKKwkvLyAxLiBDaGVjayBFQVBPTCBmcmFtZSB2ZXJzaW9uIGFuZCB0eXBlCisJRWFwb2xWcgk9IChVQ0hBUikgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErTEVOR1RIXzgwMl8xX0hdOworCisgICAgaWYgKCgoRWFwb2xWciAhPSBFQVBPTF9WRVIpICYmIChFYXBvbFZyICE9IEVBUE9MX1ZFUjIpKSB8fCAoKHBLZXlEZXNjLT5UeXBlICE9IFdQQTFfS0VZX0RFU0MpICYmIChwS2V5RGVzYy0+VHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpCisJeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciBkb2VzIG5vdCBtYXRjaCB3aXRoIFdQQSBydWxlXG4iKSk7CisJCQlyZXR1cm47CisJfQorCisJLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKKwkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwlpZigoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCShSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgICBSZXBsYXlDb3VudGVyIG5vdCBtYXRjaCAgIFxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJvY2VzcyBXUEEyUFNLIGZyYW1lCisJaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwl7CisJCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKKwkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCAgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7CisJCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOworCQl9CisKKwkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCisJCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQorCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCisJCXsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfTVNHXzM6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKKwkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisJCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJLy8gUHJvY2VzcyBXUEFQU0sgRnJhbWUKKwkvLyBDbGFzc2lmeSBtZXNzYWdlIFR5cGUsIGVpdGhlciBwYWlyd2lzZSBtZXNzYWdlIDEsIDMsIG9yIGdyb3VwIG1lc3NhZ2UgMSBmb3Igc3VwcGxpY2FudAorCWVsc2UgaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCXsKKwkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7CisJCX0KKwkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKKwkJfQorCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ICE9IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCisJCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgorCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKKwkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQorCQl7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfTVNHXzM6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCisJCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKwkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0tLSBXcGFFQVBPTEtleUFjdGlvblxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYVBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7CisKKwlpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUFRLIExlbiA9IDgwLgorCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKKwlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBTYXZlIEFOb25jZQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCisJR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKKworCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQorCVdwYUNvdW50UFRLKHBBZCwKKwkJcEFkLT5TdGFDZmcuUE1LLAorCQlwQWQtPlN0YUNmZy5BTm9uY2UsCisJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQlwQWQtPlN0YUNmZy5TTm9uY2UsCisJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCVBUSywKKwkJTEVOX1BUSyk7CisKKwkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gTWVzc2FnZSAyIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCS8vCisJLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEE7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOworCisJLy8gVXBkYXRlIEtleSBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy9Db252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCS8vIDQuIEZpbGwgU05vbmNlCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIFNlbmQgRUFQT0woMCwgMSwgMCwgMCwgMCwgUCwgMCwgU05vbmNlLCBNSUMsIFJTTl9JRSkKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCQlyZXR1cm47CisJfQorCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy9oZXhfZHVtcCgiTUlDIiwgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1zZyAyIHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworfQorCitWT0lEIFdwYTJQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQVEsgTGVuID0gODAuCisJUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgorCQlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBTYXZlIEFOb25jZQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCisJR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKKworCWlmKHBNc2cxLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwICkKKwl7CisJCS8vIGNhY2hlZCBQTUtJRAorCX0KKworCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQorCVdwYUNvdW50UFRLKHBBZCwKKwkJcEFkLT5TdGFDZmcuUE1LLAorCQlwQWQtPlN0YUNmZy5BTm9uY2UsCisJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQlwQWQtPlN0YUNmZy5TTm9uY2UsCisJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCVBUSywKKwkJTEVOX1BUSyk7CisKKwkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSAyIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCS8vCisJLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCisJLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKwkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBMjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07CisKKwkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyA0LiBGaWxsIFNOb25jZQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyA1LiBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBTZW5kIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisKKwkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhUGFpck1zZzNBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVBVQ0hBUiAgICAgICAgICAJcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgIAlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKKwlVQ0hBUiAgICAgICAgICAgCU1pY1sxNl0sIE9sZE1pY1sxNl07CisJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBSZWNvcmQgODAyLjExIGhlYWRlciAmIHRoZSByZWNlaXZlZCBFQVBPTCBwYWNrZXQgTXNnMworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKwlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCisJLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKKwl7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBWZXJpZnkgUlNOIElFCisJLy9pZiAoIVJUTVBFcXVhbE1lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKQorCWlmICghQ2hlY2tSU05JRShwQWQsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sICZza2lwX29mZnNldCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSU05fSUUgRGlmZmVyZW50IGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7CisJCWhleF9kdW1wKCJUaGUgb3JpZ2luYWwgUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJaGV4X2R1bXAoIlRoZSByZWNlaXZlZCBSU05fSUUiLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJTTl9JRSBWQUxJRCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOworCisKKwkvLyAyLiBDaGVjayBNSUMgdmFsdWUKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCVVDSEFSIGRpZ2VzdFs4MF07CisKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCS8vIFRLSVAKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKwkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQorCQlyZXR1cm47CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gTWVzc2FnZSA0IGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBJbiBNc2czLCAgS2V5SW5mby5zZWN1cmUgPTAgaWYgR3JvdXAgS2V5IEhTIHRvIGNvbWUuIDEgaWYgbm8gZ3JvdXAga2V5IEhTCisJLy8gU3RhdGlvbiBzZW5kcyBNc2c0ICBLZXlJbmZvLnNlY3VyZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhhdCBpbiBNc2cuMworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlPSBwZWVyS2V5SW5mby5TZWN1cmU7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlVQ0hBUiBkaWdlc3RbODBdOworCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvLyBVcGRhdGUgUFRLCisJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJICBwRW50cnkpOworCisJLy8gTWFrZSB0cmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqS0VZREFUQSwgKmRpZ2VzdDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEtleVszMl07CisJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKKwlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOworCisJLy8gYWxsb2NhdGUgbWVtb3J5CisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7CisKKwlpZihtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBLRVlEQVRBIExlbiA9IDUxMi4KKwlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKEtFWURBVEEgKyA1MTIsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDMgZnJhbWUuCisJcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKwkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIhPSAyKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBDaGVjayBNSUMgdmFsdWUKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBPYnRhaW4gR1RLCisJLy8gNS4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQorCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJFS0QgPSAlZFxuIiwgcGVlcktleUluZm8uRUtEX0RMKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBEZWNyeXB0IEFFUyBHVEsKKwkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLHBNc2czLT5LZXlEZXNjLktleURhdGEpOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJSU5UIGk7CisJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKKwkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnMy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJfQorCisJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAxKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgR1RLIHRvIEFTSUMKKwkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSA0IGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgCT0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy8gVXBkYXRlIFBUSworCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgcEVudHJ5KTsKKworCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIEJTUzAsIDApOworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3BhMlBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIEdyb3VwIGtleSAyLXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhR3JvdXBNc2cxQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwR3JvdXA7CisJVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpkaWdlc3QsICpLRVlEQVRBOworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIEdUS1szMl0sIEtleVszMl07CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeQorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOworCisJaWYobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gS0VZREFUQSBMZW4gPSA1MTIuCisJS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChkaWdlc3QgKyA4MCwgNCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBQcm9jZXNzIEdyb3VwIE1lc3NhZ2UgMSBmcmFtZS4gc2tpcCA4MDIuMTEgaGVhZGVyKDI0KSAmIExMQ19TTkFQIGhlYWRlcig4KQorCXBHcm91cCA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBHcm91cC0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKwkvLyAwLiBDaGVjayBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gMS4gVmVyaWZ5IFJlcGxheSBjb3VudGVyCisJLy8gICAgQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFZlcmlmeSBNSUMgaXMgdmFsaWQKKwkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwR3JvdXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworCQlITUFDX1NIQTEoKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEdyb3VwLCBwR3JvdXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIGdyb3VwIG1zZyAxIG9mIDItd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKworCS8vIDMuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBEZWNyeXB0IEFFUyBHVEsKKwkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCAgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhKTsKKwl9CisJZWxzZQkvLyBUS0lQCisJeworCQlJTlQgaTsKKworCQkvLyBEZWNyeXB0IFRLSVAgR1RLCisJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEdyb3VwLT5LZXlEZXNjLktleUl2LCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOworCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCX0KKworCS8vIFByb2Nlc3MgZGVjcnlwdGVkIGtleSBkYXRhIG1hdGVyaWFsCisJLy8gUGFyc2Uga2V5RGF0YSB0byBoYW5kbGUgS0RFIGZvcm1hdCBmb3IgV1BBMlBTSworCWlmIChwZWVyS2V5SW5mby5FS0RfREwpCisJeworCQlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAwKSkKKwkJeworCQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCS8vIFdQQVBTSworCXsKKwkJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKKwkJTmRpc01vdmVNZW1vcnkoR1RLLCBLRVlEQVRBLCAzMik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgR1RLLCAzMik7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBlZXJLZXlJbmZvLktleUluZGV4OworCisJCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBHVEssIExFTl9US0lQX0VLKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZHVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCS8vaGV4X2R1bXAoIkdyb3VwIEtleSA6IiwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIExFTl9US0lQX0VLKTsKKwl9CisKKwkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCS8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwkvLyBpbml0IGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gR3JvdXAgbWVzc2FnZSAxIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gR3JvdXAgTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMSwwLDAsMCxHLDAsMCxNSUMsMCkKKwkvLworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCXsKKwkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisJfQorCWVsc2UKKwl7CisJCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCX0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBJbmRleCBhcyBHLU1zZyAxCisJaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gcGVlcktleUluZm8uS2V5SW5kZXg7CisKKwkvLyBLZXkgVHlwZSBHcm91cCBrZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gU2VjdXJlIGJpdAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlICA9IDE7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIGdyb3VwIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAJCSZGcmFtZUxlbiwKKwkJCQkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBwcmVwYXJlIGZvciBlbmNyeXB0aW9uCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCS8vIDYgRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCBXUEEgTUFDIGhlYWRlcgorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFNYWNIZWFkZXJJbml0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQJUEhFQURFUl84MDJfMTEJcEhkcjgwMjExLAorCUlOCQlVQ0hBUgkJCXdlcCwKKwlJTgkJUFVDSEFSCQkgICAgcEFkZHIxKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwSGRyODAyMTEtPkZDLlR5cGUJPSBCVFlQRV9EQVRBOworCXBIZHI4MDIxMS0+RkMuVG9Ecwk9IDE7CisJaWYgKHdlcAk9PSAxKQorCQlwSGRyODAyMTEtPkZDLldlcCA9IDE7CisKKwkgLy8JQWRkcjE6IEJTU0lELCBBZGRyMjogU0EsIEFkZHIzOglEQQorCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCXBIZHI4MDIxMS0+U2VxdWVuY2UgPQlwQWQtPlNlcXVlbmNlOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpCisKK3sKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzOworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCVVDSEFSICAgSW5kZXg7CisKKwlkbworCXsKKwkJLy8gMS4gYnVpbGQgYSBORElTIHBhY2tldCBhbmQgY2FsbCBSVE1QU2VuZFBhY2tldCgpOworCQkvLyAgICBiZSBjYXJlZnVsIGFib3V0IGhvdy93aGVuIHRvIHJlbGVhc2UgdGhpcyBpbnRlcm5hbCBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgYnVmZmVyCisJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzNHdheUZyYW1lKQorCQkJUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwUGFja2V0LCAxKTsKKwkJZWxzZQorCQkJUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwUGFja2V0LCAwKTsKKworCQkvLyAyLiBzZW5kIG91dCB0aGUgcGFja2V0CisJCVN0YXR1cyA9IFNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCS8vIERlcXVldWUgb25lIGZyYW1lIGZyb20gVHhTd1F1ZXVlMC4uMyBxdWV1ZSBhbmQgcHJvY2VzcyBpdAorCQkJLy8gVGhlcmUgYXJlIHRocmVlIHBsYWNlIGNhbGxpbmcgZGVxdWV1ZSBmb3IgVFggcmluZy4KKwkJCS8vIDEuIEhlcmUsIHJpZ2h0IGFmdGVyIHF1ZXVlaW5nIHRoZSBmcmFtZS4KKwkJCS8vIDIuIEF0IHRoZSBlbmQgb2YgVHhSaW5nVHhEb25lIHNlcnZpY2Ugcm91dGluZS4KKwkJCS8vIDMuIFVwb24gTkRJUyBjYWxsIFJUTVBTZW5kUGFja2V0cworCQkJaWYoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSAmJgorCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpCisJCQl7CisJCQkJZm9yKEluZGV4ID0gMDsgSW5kZXggPCA1OyBJbmRleCArKykKKwkJCQkJaWYocEFkLT5UeFN3UXVldWVbSW5kZXhdLk51bWJlciA+IDApCisJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBJbmRleCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgU2FuaXR5IFJTTiBJRSBmb3JtIEFQCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKKwlVQ0hBUiAgICAgICAgICAgICAgIGxlbjsKKwlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisJQk9PTEVBTgkJCQlyZXN1bHQgPSBGQUxTRTsKKworCXBWSUUgPSBwRGF0YTsKKwlsZW4JID0gRGF0YUxlbjsKKwkqT2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBzaXplb2YoUlNOSUUyKSkKKwl7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCS8vIFdQQSBSU04gSUUKKwkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQS9XUEFQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gc2tpcF9vZmZzZXQoJWQpIFxuIiwgKk9mZnNldCkpOworCisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgorICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworICAgIE5vdGU6CisgICAgICAgIDgwMi4xMWkgRDEwCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFBhcnNlS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCWJQYWlyZXdpc2UpCit7CisgICAgUEtERV9FTkNBUCAgICAgICAgICBwS0RFID0gTlVMTDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgIHBNeUtleURhdGEgPSBwS2V5RGF0YTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLTEVOOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCisJLy8gVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIFBhaXJld2lzZS1Nc2cgMyBhbmQgc2tpcCBpdAorCWlmIChiUGFpcmV3aXNlKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghQ2hlY2tSU05JRShwQWQsIHBLZXlEYXRhLCBLZXlEYXRhTGVuLCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWlzbWF0Y2hlZCBcbiIpKTsKKwkJCWhleF9kdW1wKCJHZXQgS0VZREFUQSA6IiwgcEtleURhdGEsIEtleURhdGFMZW4pOworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJLy8gc2tpcCBSU04gSUUKKwkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQlLZXlEYXRhTGVuZ3RoIC09IHNraXBfb2Zmc2V0OworCisJCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgc2tpcF9vZmZzZXQpKTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUGFyc2VLZXlEYXRhID09PiBLZXlEYXRhTGVuZ3RoICVkIHdpdGhvdXQgUlNOX0lFIFxuIiwgS2V5RGF0YUxlbmd0aCkpOworCisJLy8gUGFyc2UgRUtEIGZvcm1hdAorCWlmIChLZXlEYXRhTGVuZ3RoID49IDgpCisgICAgeworICAgICAgICBwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisgICAgfQorCWVsc2UKKyAgICB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBLZXlEYXRhTGVuZ3RoIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisJLy8gU2FuaXR5IGNoZWNrIC0gc2hhcmVkIGtleSBpbmRleCBzaG91bGQgbm90IGJlIDAKKwlpZiAocEtERS0+R1RLRW5jYXAuS2lkID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBpbmRleCB6ZXJvIFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCWlmIChLZXlEYXRhTGVuZ3RoIDwgKHBLREUtPkxlbiArIDIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJR1RLTEVOID0gcEtERS0+TGVuIC02OworCisJaWYgKEdUS0xFTiA8IE1JTl9MRU5fT0ZfR1RLKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJHVEsgS2V5IHdpdGggS0RFIGZvcm1ldCBnb3QgaW5kZXg9JWQsIGxlbj0lZCBcbiIsIHBLREUtPkdUS0VuY2FwLktpZCwgR1RLTEVOKSk7CisKKwkvLyBVcGRhdGUgR1RLCisJLy8gc2V0IGtleSBtYXRlcmlhbCwgVHhNaWMgYW5kIFJ4TWljIGZvciBXUEFQU0sKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIHBLREUtPkdUS0VuY2FwLkdUSywgMzIpOworCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCS8vIFVwZGF0ZSBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtERS0+R1RLRW5jYXAuR1RLLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgJnBLREUtPkdUS0VuY2FwLkdUS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgJnBLREUtPkdUS0VuY2FwLkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCXJldHVybiBUUlVFOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaXNjbyBDQ0tNIFBSRiBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlrZXkJCQkJQ2lzY28gQmFzZSBUcmFuc2llbnQgS2V5IChCVEspCisJCWtleV9sZW4JCQlUaGUga2V5IGxlbmd0aCBvZiB0aGUgQlRLCisJCWRhdGEJCQlSdXF1ZXN0IE51bWJlcihSTikgKyBCU1NJRAorCQlkYXRhX2xlbgkJVGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorCQlvdXRwdXQJCQlTdG9yZSBmb3IgUFRLKFBhaXJ3aXNlIHRyYW5zaWVudCBrZXlzKQorCQlsZW4JCQkJVGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0CisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQk4MDIuMWkJQW5uZXggRi45CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENDS01QUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisJVUNIQVIJaW5wdXRbMTAyNF07CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJTmRpc01vdmVNZW1vcnkoaW5wdXQsIGRhdGEsIGRhdGFfbGVuKTsKKwl0b3RhbF9sZW4gPSBkYXRhX2xlbjsKKwlpbnB1dFt0b3RhbF9sZW5dID0gMDsKKwl0b3RhbF9sZW4rKzsKKwlmb3IJKGkgPSAwOwlpIDwJKGxlbiArIDE5KSAvIDIwOyBpKyspCisJeworCQlITUFDX1NIQTEoaW5wdXQsIHRvdGFsX2xlbiwJa2V5LCBrZXlfbGVuLCAmb3V0cHV0W2N1cnJlbnRpbmRleF0pOworCQljdXJyZW50aW5kZXggKz0JMjA7CisJCWlucHV0W3RvdGFsX2xlbiAtIDFdKys7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBNSUMgZXJyb3IgaW5kaWNhdGlvbiBhbmQgcmVjb3JkIE1JQyBlcnJvciB0aW1lci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBXcGFLZXkgCQlQb2ludGVyIHRvIHRoZSBXUEEga2V5IHN0cnVjdHVyZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBSZXBvcnRNaWNFcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0lQSEVSX0tFWSAJcFdwYUtleSkKK3sKKwlVTE9ORwlOb3c7CisgICAgVUNIQVIgICB1bmljYXN0S2V5ID0gKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VfS0VZID8gMTowKTsKKworCS8vIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudAorCU5vdyA9IGppZmZpZXM7CisJaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKQorCXsKKwkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSkgPCBOb3cpCisJCXsKKwkJCS8vIFVwZGF0ZSBMYXN0IE1JQyBlcnJvciB0aW1lLCB0aGlzIGRpZCBub3QgdmlvbGF0ZSB0d28gTUlDIGVycm9ycyB3aXRoaW4gNjAgc2Vjb25kcworCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKwkJfQorCQllbHNlCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKwkJCS8vIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbgorCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CisJCQkvLyBXZSBzaGFsbCBibG9jayBhbGwgcmVjZXB0aW9uCisJCQkvLyBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2ljYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZQorCQkJLy8KKwkJCS8vIE5vIG5lY2Vzc2FyeSB0byBjbGVhbiBhbGwgVHggcmluZywgb24gUlRNUEhhcmRUcmFuc21pdCB3aWxsIHN0b3Agc2VuZGluZyBub24tODAyLjFYIEVBUE9MIHBhY2tldHMKKwkJCS8vIGlmIHBBZC0+U3RhQ2ZnLk1pY0VyckNudCBncmVhdGVyIHRoYW4gMi4KKwkJCS8vCisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7CisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIE1JQyBlcnJvciBjb3VudCA+PSAyCisJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJOworCX0KKyAgICBNbG1lRW5xdWV1ZShwQWQsCisJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUsCisJCQkJMSwKKwkJCQkmdW5pY2FzdEtleSk7CisKKyAgICBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpCisgICAgeworICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOworICAgIH0KK30KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2RlZmluZQlMRU5HVEhfRUFQX0ggICAgNAorLy8gSWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1QYWNrZXQgLGZpbmQgb3V0IGl0cyBFQVAtQ29kZSAoUmVxdWVzdCgweDAxKSwgUmVzcG9uc2UoMHgwMiksIFN1Y2Nlc3MoMHgwMyksIEZhaWx1cmUoMHgwNCkpLgorSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJCXBBZCwKKwlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKKwlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAorCUlOICBVU0hPUlQJCQkJT2ZmU2V0KQoreworCisJUFVDSEFSCXBEYXRhOworCUlOVAlyZXN1bHQgPSAwOworCisJaWYoIEZyYW1lTGVuIDwgT2ZmU2V0ICsgTEVOR1RIX0VBUE9MX0ggKyBMRU5HVEhfRUFQX0ggKQorCQlyZXR1cm4gcmVzdWx0OworCisJcERhdGEgPSBwRnJhbWUgKyBPZmZTZXQ7IC8vIHNraXAgb2Zmc2V0IGJ5dGVzCisKKwlpZigqKHBEYXRhKzEpID09IEVBUFBhY2tldCkgCS8vIDgwMi4xeCBoZWFkZXIgLSBQYWNrZXQgVHlwZQorCXsKKwkJIHJlc3VsdCA9ICoocERhdGErNCk7CQkvLyBFQVAgaGVhZGVyIC0gQ29kZQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK1ZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOICBCT09MRUFOICAgICAgICAgIGJVbmljYXN0KQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworICAgIHNwcmludGYoY3VzdG9tLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIik7CisgICAgaWYgKGJVbmljYXN0KQorICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzIHVuaWNhc3QiLCBjdXN0b20pOworICAgIHdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oY3VzdG9tKTsKKyAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCitWT0lECVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSAtLS0tLT5cbiIpKTsKKworICAgIGJVbmljYXN0ID0gKEVsZW0tPk1zZ1swXSA9PSAxID8gVFJVRTpGQUxTRSk7CisJcEFkLT5TZXF1ZW5jZSA9ICgocEFkLT5TZXF1ZW5jZSkgKyAxKSAmIChNQVhfU0VRX05VTUJFUik7CisKKwkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisKKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworICAgIC8vIFJlcXVlc3QgZmllbGQgcHJlc2VudGVkCisgICAgUGFja2V0LktleURlc2MuS2V5SW5mby5SZXF1ZXN0ID0gMTsKKworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKyAgICAvLyBFcnJvciBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yICA9IDE7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsKKworCS8vIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICBpbmNfYnl0ZV9hcnJheShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworICAgICAgICBVQ0hBUiBkaWdlc3RbMjBdID0gezB9OworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisgICAgCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAorICAgIAkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAgJlBhY2tldCwKKyAgICAJCQkJRU5EX09GX0FSR1MpOworCisJLy8gb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTUlDIGZhaWx1cmUgcmVwb3J0IGZyYW1lIHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIDwtLS0tLVxuIikpOworfQorCisvKiogZnJvbSB3cGFfc3VwcGxpY2FudAorICogaW5jX2J5dGVfYXJyYXkgLSBJbmNyZW1lbnQgYXJiaXRyYXJ5IGxlbmd0aCBieXRlIGFycmF5IGJ5IG9uZQorICogQGNvdW50ZXI6IFBvaW50ZXIgdG8gYnl0ZSBhcnJheQorICogQGxlbjogTGVuZ3RoIG9mIHRoZSBjb3VudGVyIGluIGJ5dGVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvdW50ZXIgYnkgb25lIGFuZCBjb250aW51ZXMKKyAqIHJvbGxpbmcgb3ZlciB0byBtb3JlIHNpZ25pZmljYW50IGJ5dGVzIGlmIHRoZSBieXRlIHdhcyBpbmNyZW1lbnRlZCBmcm9tCisgKiAweGZmIHRvIDB4MDAuCisgKi8KK3ZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pCit7CisJaW50IHBvcyA9IGxlbiAtIDE7CisJd2hpbGUgKHBvcyA+PSAwKSB7CisJCWNvdW50ZXJbcG9zXSsrOworCQlpZiAoY291bnRlcltwb3NdICE9IDApCisJCQlicmVhazsKKwkJcG9zLS07CisJfQorfQorCitWT0lEIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKyAgICBSVE1QX0FEQVBURVIgICAgICAgICAgICAgICAgKnBBZCA9IChQUlRNUF9BREFQVEVSKUZ1bmN0aW9uQ29udGV4dDsKKyAgICBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICAgRGlzYXNzb2NSZXE7CisKKwkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKKwlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX01JQ19GQUlMVVJFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyZjM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMKQEAgLTAsMCArMSw3MDY4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHN0YV9pb2N0bC5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBJT0NUTCByZWxhdGVkIHN1YnJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAxLTAzLTIwMDMgICAgY3JlYXRlZAorCVJvcnkgQ2hlbiAgIDAyLTE0LTIwMDUgICAgbW9kaWZ5IHRvIHN1cHBvcnQgUlQ2MQorKi8KKworI2luY2x1ZGUJInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworI2VuZGlmCisKKyNkZWZpbmUgTlJfV0VQX0tFWVMgCQkJCTQKKyNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4gCQkJKDQwLzgpCisjZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOIAkJCSgxMDQvOCkKKworI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCisjZWxzZQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbmRpZgorCitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPeworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OworfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKK3sgUlRQUklWX0lPQ1RMX1NFVCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAorICAic2V0In0sCisKK3sgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKK3sgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAorLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCisgICAgeyBTSE9XX0NPTk5fU1RBVFVTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCisJeyBTSE9XX0RSVklFUl9WRVJJT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAorICAgIHsgU0hPV19CQV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKKwl7IFNIT1dfREVTQ19JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAorICAgIHsgUkFJT19PRkYsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAorCXsgUkFJT19PTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IFNIT1dfRExTX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGxzZW50cnlpbmZvIiB9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsgU0hPV19DRkdfVkFMVUUsCisJICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAorCXsgU0hPV19BREhPQ19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImFkaG9jRW50cnkiIH0sCisKKy8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KKworI2lmZGVmIERCRworeyBSVFBSSVZfSU9DVExfQkJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiYmJwIn0sCit7IFJUUFJJVl9JT0NUTF9NQUMsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAibWFjIn0sCit7IFJUUFJJVl9JT0NUTF9FMlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZTJwIn0sCisjZW5kaWYgIC8qIERCRyAqLworCit7IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAic3RhdCJ9LAoreyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImdldF9zaXRlX3N1cnZleSJ9LAorfTsKKworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisKK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCitWT0lEIFJUTVBJb2N0bEJCUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKKyNlbmRpZiAvLyBEQkcgLy8KKworCitORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4JUFZPSUQJCQlwQnVmKTsKKworSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpOworCitzdGF0aWMgc3RydWN0IHsKKwlDSEFSICpuYW1lOworCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKKwl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAorCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKKwl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAorCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCisJeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAorCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCisJeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKKyAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKKwl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCisJeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKKwl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCisjaWZkZWYgREJHCisJeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBSQUxJTktfQVRFCisJeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAorCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCisJeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKKwl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCisJeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKKwl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKKwl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKKwl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKKwl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCisJeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKKwl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCisJeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKKwl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCisJeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAorCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCisJeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKKwl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAorCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCisJeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKKwl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAorCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKKwl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCisJeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCisJeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAorCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisJeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAorICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCisJeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IkxvbmdSZXRyeSIsCSAgICAgICAgCQlTZXRfTG9uZ1JldHJ5TGltaXRfUHJvY30sCisJeyJTaG9ydFJldHJ5IiwJICAgICAgICAJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCXtOVUxMLH0KK307CisKKworVk9JRCBSVE1QQWRkS2V5KAorCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKKwlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCit7CisJVUxPTkcJCQkJS2V5SWR4OworCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5IC0tLS0tLT5cbiIpKTsKKworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQl7CisJCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCQkgICAgLy8gVXBkYXRlIFBUSworCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisgICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgIAllbHNlCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorICAgICAgICAJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBMRU5fVEtJUF9FSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBwRW50cnkpOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgR1RLCisgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKyAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgIAkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIE5VTEwpOworCisgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgfQorCX0KKwllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKKwl7CisJCVVDSEFSCUNpcGhlckFsZzsKKyAgICAJUFVDSEFSCUtleTsKKworCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCisJCQlnb3RvIGVuZDsKKworCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisKKwkJaWYgKEtleUlkeCA8IDQpCisJCXsKKwkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7CisKKwkJCQlpZiAocEVudHJ5KQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKKworCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkJLy8gc2V0IENpcGhlciB0eXBlCisJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQllbHNlCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKKyAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKworCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlCU1MwLAorCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCXBFbnRyeSk7CisKKwkJCQl9CisJCQl9CisJCQllbHNlCisgICAgICAgICAgICB7CisJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCS8vIFNldCBDaXBlciB0eXBlCisJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQllbHNlCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCX0KKwkJfQorCX0KK2VuZDoKKwlyZXR1cm47Cit9CisKK2NoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisgICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKKyAgICAgICAgaWYgKCpzID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXIgKikgczsKK30KKworLyoKK1RoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgorKi8KKworaW50CitydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworLy8JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworI2lmZGVmIFJUMjg3MAorCXN0cm5jcHkobmFtZSwgIlJUMjg3MCBXaXJlbGVzcyIsIElGTkFNU0laKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlpbnQgCWNoYW4gPSAtMTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCisJaWYgKGZyZXEtPmUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWVsc2UKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCisgICAgaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpCisgICAgeworCXBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9IGNoYW47CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT0+cnRfaW9jdGxfc2l3ZnJlcTo6U0lPQ1NJV0ZSRVFbY21kPTB4JXhdIChDaGFubmVsPSVkKVxuIiwgU0lPQ1NJV0ZSRVEsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKKwlVQ0hBUiBjaDsKKwlVTE9ORwltOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT5ydF9pb2N0bF9naXdmcmVxICAlZFxuIiwgY2gpKTsKKworICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwgbSk7CisJZnJlcS0+bSA9IG0gKiAxMDA7CisJZnJlcS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoICgqbW9kZSkKKwl7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQlicmVhazsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgIGVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd21vZGUobW9kZT0lZClcbiIsICptb2RlKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCXJhbmdlLT5taW5fcG1wID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG1wID0gNjU1MzUgKiAxMDI0OworCQlyYW5nZS0+bWluX3BtdCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtdCA9IDEwMDAgKiAxMDI0OworCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKKwkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCX0KKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OworCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisKKwl2YWwgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKQorCXsKKwkJdTMyIG07CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogSFogKi8KKworCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQl2YWwrKzsKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAorCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKworCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOworCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgeworICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgIH0KKworICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIEVUSF9BTEVOKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOworICAgIH0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbml0cyBhcmUgaW4gZGIgYWJvdmUgdGhlIG5vaXNlIGZsb29yLiBUaGF0IG1lYW5zIHRoZQorICogcnNzaSB2YWx1ZXMgcmVwb3J0ZWQgaW4gdGhlIHR4L3J4IGRlc2NyaXB0b3JzIGluIHRoZQorICogZHJpdmVyIGFyZSB0aGUgU05SIGV4cHJlc3NlZCBpbiBkYi4KKyAqCisgKiBJZiB5b3UgYXNzdW1lIHRoYXQgdGhlIG5vaXNlIGZsb29yIGlzIC05NSwgd2hpY2ggaXMgYW4KKyAqIGV4Y2VsbGVudCBhc3N1bXB0aW9uIDk5LjUgJSBvZiB0aGUgdGltZSwgdGhlbiB5b3UgY2FuCisgKiBkZXJpdmUgdGhlIGFic29sdXRlIHNpZ25hbCBsZXZlbCAoaS5lLiAtOTUgKyByc3NpKS4KKyAqIFRoZXJlIGFyZSBzb21lIG90aGVyIHNsaWdodCBmYWN0b3JzIHRvIHRha2UgaW50byBhY2NvdW50CisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcnNzaSBtZWFzdXJlbWVudCBpcyBmcm9tIDExYiwKKyAqIDExZywgb3IgMTFhLiAgIFRoZXNlIGRpZmZlcmVuY2VzIGFyZSBhdCBtb3N0IDJkYiBhbmQKKyAqIGNhbiBiZSBkb2N1bWVudGVkLgorICoKKyAqIE5COiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIG9yaW5vY28vd2F2ZWxhbgorICogICAgIGRyaXZlcnMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICppcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyIHJzc2kpCit7CisJX191OCBDaGFubmVsUXVhbGl0eTsKKworCS8vIE5vcm1hbGl6ZSBSc3NpCisJaWYgKHJzc2kgPj0gLTUwKQorCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKKwllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOworCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisgICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCisgICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKworICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKKyAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKyAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOworICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKK30KKworaW50IHJ0X2lvY3RsX2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOworCWludCBpOworCisgICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworICAgICAgICAvL3JldHVybiAtRU5FVERPV047CisJfQorCisJZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQorCXsKKwkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCQkJYnJlYWs7CisJCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworCX0KKwlkYXRhLT5sZW5ndGggPSBpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKKwlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLworCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DR0lXU0NBTgoraW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwlVTE9ORwkJCQkJCQkJTm93OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50Kys7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuIDA7CisJZG97CisJCU5vdyA9IGppZmZpZXM7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisJCXsKKwkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQl9CisKKwkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisJCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCTAsCisJCQlOVUxMKTsKKworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9d2hpbGUoMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJaW50IGk9MDsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWY7CisJY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisjaWZuZGVmIElXRVZHRU5JRQorCWNoYXIgaWR4OworI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCXN0cnVjdCBpd19ldmVudCBpd2U7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIHsKKwkJLyoKKwkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwl7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgZWxzZQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2Vsc2UKKyAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCisgICAgICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisJCS8vTUFDIGFkZHJlc3MKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+ZmxhZ3MpCisJeworCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisKKwkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVsc2UKKwl7CisJCS8vIEFOWSBzc2lkCisJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWRhdGEtPmZsYWdzID0gMTsKKyAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjaWZkZWYgUlQyODcwCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwllbHNlCisJey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKKwkJZGF0YS0+bGVuZ3RoICA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworaW50IHJ0X2lvY3RsX3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKwltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKKworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChkYXRhLT5sZW5ndGggPiBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgeworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOworCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXUxNiB2YWw7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA8IDAgfHwgcnRzLT52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChydHMtPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwkJdmFsID0gcnRzLT52YWx1ZTsKKworCWlmICh2YWwgIT0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpCisJCXBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXUxNiB2YWw7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKGZyYWctPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xEIHx8IGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOyAvKiBldmVuIG51bWJlcnMgb25seSAqLworCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKKwlmcmFnLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCisjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQoraW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKwllbHNlIGlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpCisJeworCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICAJZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQorCXsKKwkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sga2V5IGluZGV4ICovCisJCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisKKwkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UKKwkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisgICAgICAgIH0KKwl9CisgICAgZWxzZQorCQkJeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCitkb25lOgorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKwlpbnQga2lkOworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCisJeworCQkvLyBjb3B5IHdlcCBrZXkKKwkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCisJCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKKwkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisKKwl9CisJZWxzZSBpZiAoa2lkID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOworCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7CisJUE9TX0NPT0tJRSBwT2JqOworCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOworCWNoYXIgKnZhbHVlOworCWludCAgU3RhdHVzPTA7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOworCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKCEqdGhpc19jaGFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJICAgICp2YWx1ZSsrID0gMDsKKworCWlmICghdmFsdWUpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKKyAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCisJeworCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCisJICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKKwkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICAgICAgfQorCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KKwkgICAgfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAorCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitzdGF0aWMgaW50CitydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworCX0KKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJCWVsc2UKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKyAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQJZ2V0QmFJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCit7CisJSU5UIGksIGo7CisJQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKKwlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJCXsKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKKyAgICAgICAgICAgICAgICBwT3V0QnVmLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKKwkJfQorICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKyAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJCXBBZCA9IGRldi0+bWxfcHJpdjsKKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworICAgIHN3aXRjaChzdWJjbWQpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPV19DT05OX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisgICAgICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2VudHJhbENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIlNzaWQ9JXMgLFNzaWRsZW4gPSAlZFxuIixwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJDb25uU3RhdHVzIGlzIG5vdCBjb25uZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKKyAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU0hPV19ERVNDX0lORk86CisJCQl7CisJCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT0ZGOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PTjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7CisgICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFNIT1dfRExTX0VOVFJZX0lORk86CisJCQl7CisJCQkJU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJY2FzZSBTSE9XX0NGR19WQUxVRToKKwkJCXsKKwkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7CisJCQkJaWYgKFN0YXR1cyA9PSAwKQorCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKKwkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKKwkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7CisJCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKyNpZmRlZiBJV19NTE1FX0RJU0FTU09DCisJCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisgICAgICAgICAgICAvKmlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIAkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKwkJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fRlVOQ1RJT05fXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWxnKSB7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCX0KKyAgICAgICAgCQllbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKwkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCB8fAorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCisJCQkJeworCQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKwkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIE5VTEwsIE5VTEwpOworCisJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisKKyAgICAJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCX0KKyAgICAJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1RLSVAgLSBrZXlJZHggPSAlZCwgZXh0LT5rZXlfbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQl7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgIAlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBkZXYtPm1sX3ByaXY7CisJUENIQVIgcEtleSA9IE5VTEw7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOworCisJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpCisJeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCisJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWVsc2UKKwkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKKwltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOworCisJZXh0LT5rZXlfbGVuID0gMDsKKwlzd2l0Y2gocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbjsKKwkJCQlwS2V5ID0gJihwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleVswXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCQllbHNlCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisKKwkJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMzI7CisJCQkJcEtleSA9ICZwQWQtPlN0YUNmZy5QTUtbMF07CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKKwl7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ1NJV0dFTklFCitpbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisKK2ludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8CisJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJCXJldHVybiAtRTJCSUc7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQlSU05JZSA9IElFX1JTTjsKKworCQlleHRyYVswXSA9IChjaGFyKVJTTkllOworCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19wbWtzYSAqcFBta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlJTlQJQ2FjaGVkSWR4ID0gMCwgaWR4ID0gMDsKKworCWlmIChwUG1rc2EgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd3Bta3NhXG4iKSk7CisJc3dpdGNoKHBQbWtzYS0+Y21kKQorCXsKKwkJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9GTFVTSFxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJICAgICAgICB7CisJCSAgICAgICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSUQsIDE2KTsKKwkJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7IGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOyBpZHgrKykKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uQlNTSURbMF0sIE1BQ19BRERSX0xFTik7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5QTUtJRFswXSwgMTYpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07CisJCQkgICAgICAgIGJyZWFrOworCQkgICAgICAgIH0KKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX0FERDoKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCQkgICAgICAgIGJyZWFrOworCSAgICAgICAgfQorCisJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCSAgICAgICAgeworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCSAgICAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkgICAgICAgIH0KKwkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkgICAgICAgIENhY2hlZElkeCA9IChwUG1rc2EtPmJzc2lkLnNhX2RhdGFbNV0gJSBQTUtJRF9OTyk7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyAjaWYgV0lSRUxFU1NfRVhUID4gMTcKKworI2lmZGVmIERCRworc3RhdGljIGludAorcnRfcHJpdmF0ZV9pb2N0bF9iYnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQorCQkJeworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZSA9IE5VTEw7CisJVUNIQVIJCQkJcmVnQkJQID0gMDsKKy8vCUNIQVIJCQkJYXJnWzI1NV09ezB9OworCVVJTlQzMgkJCQliYnBJZDsKKwlVSU5UMzIJCQkJYmJwVmFsdWU7CisJQk9PTEVBTgkJCQliSXNQcmludEFsbEJCUCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisKKwltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwkJCQl7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJaWYgKChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkgJiYgKHNzY2FuZih2YWx1ZSwgIiV4IiwgJihiYnBWYWx1ZSkpID09IDEpKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKwkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisgICAgCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworICAgIAkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCX0KKwllbHNlCisJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKworbmV4dDoKKwlpZiAoYklzUHJpbnRBbGxCQlApCisJeworCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisJCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSAxMzY7IGJicElkKyspCisJCXsKKwkJICAgIGlmIChzdHJsZW4oZXh0cmEpID49IChJV19QUklWX1NJWkVfTUFTSyAtIDEwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYICAgICIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworCQkJaWYgKGJicElkJTUgPT0gNCkKKwkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJcbiIpOworCQl9CisKKyAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworICAgIFVJTlQzMiAgICAgICAgICByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisgICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKyAgICAqLworICAgIGlmIChyYXRlID09IC0xKQorICAgIHsKKwkJLy9BdXRvIFJhdGUKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChmaXhlZCkKKyAgICAgICAgeworICAgICAgICAJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisgICAgICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIHJhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJhdGUgPSBYLCBmaXhlZCA9IDAgPT4gKHJhdGVzIDw9IFgpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisgICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKKyAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKKyAgICBfX3MzMiByYWxpbmtyYXRlW10gPQorCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKKwkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCisJMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisKKyAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7CisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKElORlJBX09OKHBBZCkpICYmCisgICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgZWxzZQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorICAgIHsKKy8vICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoyNCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqNDgpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKKyAgICBlbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKKworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisKKyAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCisgICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCisgICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7CisgICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KKyNpZmRlZiBTSU9DU0lXTUxNRQorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCisjaWZkZWYgU0lPQ0dJV1NDQU4KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLworI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDIgKi8KKyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLworI2lmZGVmIERCRworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2lvY3RsX2JicCwgLyogKyAweDAzICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDMgKi8KKyNlbmRpZgorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA4ICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIC8qICsgMHgwOSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEEgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBCICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTAgKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9zaG93LCAvKiArIDB4MTEgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEyICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxOCAqLworfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZiA9Cit7CisjZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIHJ0X3ByaXZfaGFuZGxlcnMsCisJLm51bV9wcml2YXRlCQk9IE4ocnRfcHJpdl9oYW5kbGVycyksCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXZ0YWIsCisJLm51bV9wcml2YXRlX2FyZ3MJPSBOKHByaXZ0YWIpLAorI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3CisgICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKK307CisKK0lOVCBSVE1QU2V0SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIEJzc2lkOworICAgIFJUXzgwMl8xMV9QSFlfTU9ERSAgICAgICAgICAgICAgICAgIFBoeU1vZGU7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgU3RhQ29uZmlnOworICAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtYmxlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBQTkRJU184MDJfMTFfS0VZICAgICAgICAgICAgICAgICAgICBwS2V5ID0gTlVMTDsKKyAgICBQTkRJU184MDJfMTFfV0VQCQkJICAgICAgICBwV2VwS2V5ID1OVUxMOworICAgIFBORElTXzgwMl8xMV9SRU1PVkVfS0VZICAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBOVUxMOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZywgKnBDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldFR5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm93OworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IDA7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUywgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJUZW1wOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU9JRF9TRVRfSFRfUEhZTU9ERQkJCQkJSFRfUGh5TW9kZTsJLy8xMW4gLGthdGh5CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIFBORElTXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgIHBQbWtJZCA9IE5VTEw7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4U3RhdGUgPSBGQUxTRTsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2VuYWJsZSA9IDA7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJY3RtcDsKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+UlRNUFNldEluZm9ybWF0aW9uKCksCTB4JTA4eFxuIiwgY21kJjB4N0ZGRikpOworICAgIHN3aXRjaChjbWQgJiAweDdGRkYpIHsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA8IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkJCS8vIE9ubHkgYXZhbGlhYmxlIHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWluZworICAgICAgICAgICAgZWxzZSBpZiAoIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxPTkcgICBDb3VudHJ5OworICAgICAgICAgICAgICAgIFVDSEFSCVRtcFBoeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikoQ291bnRyeSAmIDB4MDAwMDAwRkYpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCQkJCS8vIEJ1aWxkIGFsbCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwKKwkJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKyAjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBOb3cgPSBqaWZmaWVzOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgVHhDbnQgPSAlZCBcbiIsIHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7CisKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJCWJyZWFrOworCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID4gMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworICAgICAgICAgICAgUlRNUF9TRVRfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJUENIQVIgcFNzaWRTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmIChTc2lkLlNzaWRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpOworICAgICAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJeworCSAgICAgICAgICAgICAgICAJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJCQlpZiAocFNzaWRTdHJpbmcpCisJCQkJCQl7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKTsKKwkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCisJCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gIT0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QSFlfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBoeU1vZGUgPD0gTWF4UGh5TW9kZSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCX0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lZClcbiIsIFBoeU1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IFN0YUNvbmZpZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQorICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCisJCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VJYnNzQmVhY29uKHBBZGFwdGVyKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZGFwdGVyKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFU0lSRURfUkFURVMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUFJFQU1CTEUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQcmVhbWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKKyAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIAlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBBdXRoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAoPSVkKSBcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExTW9uaXRvcikKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzICA9IC1FSU5WQUw7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKKworCQkJCWlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKwkJCQkJaWYgKEtleUlkeCA+PSA0KXsKKwkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKyNpZmRlZiBSVDI4NzAKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGUJPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZU90aGVyPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCA9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dFJlcSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luUmVxPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworI2VuZGlmIC8vIFJUMjg3MCAvLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTIFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUnRzVGhyZXNoID4gTUFYX1JUU19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKD0lbGQpIFxuIixGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9QT1dFUl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlck1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJDQU0iKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIk1heF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJGYXN0X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTGVnYWN5X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFICg9JWQpXG4iLFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIDwgc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlclRlbXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBvd2VyVGVtcCA+IDEwMCkKKwkJCQkJUG93ZXJUZW1wID0gMHhmZmZmZmZmZjsgIC8vIEFVVE8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gUG93ZXJUZW1wOyAvL2tlZXAgY3VycmVudCBzZXR0aW5nLgorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCX0KKwkgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfVFlQRSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTmV0VHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFEUykKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUIpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUJHX01JWEVEKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUEpOworCQkJCWVsc2UKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSAoPSVkKVxuIixOZXRUeXBlKSk7CisJCSAgICB9CisJCQlicmVhazsKKyAgICAgICAgLy8gRm9yIFdQQSBQU0sgUE1LIGtleQorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQUREX1dQQToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhIFtBdXRoTW9kZSAhPSBXUEFQU0svV1BBMlBTSy9XUEFOT05FXVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApICAgICAvLyBPbmx5IGZvciBXUEEgUFNLIG1vZGUKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKKyAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVE1QV1BBUmVtb3ZlS2V5UHJvYyhwQWRhcHRlciwgcFJlbW92ZUtleSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBSZW1vdmUgV1BBIEtleSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IHBSZW1vdmVLZXktPktleUluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKEtleUlkWyVkXSBvdXQgb2YgcmFuZ2UpXG4iLCBLZXlJZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwUmVtb3ZlS2V5LT5LZXlJbmRleCwgcFJlbW92ZUtleS0+TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICBjYXNlIE9JRF84MDJfMTFfQUREX0tFWToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUEFkZEtleShwQWRhcHRlciwgcEtleSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOworCisgICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQorICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBwQ29uZmlnLT5CZWFjb25QZXJpb2Q7CisKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoVVNIT1JUKSBwQ29uZmlnLT5BVElNV2luZG93OworICAgICAgICAgICAgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChwQ29uZmlnLT5EU0NvbmZpZywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCisJCQkJLy8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5DaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04gKEJlYWNuUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2g9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5CZWFjb25QZXJpb2QsIHBDb25maWctPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJICAgIFBPSURfU0VUX0hUX1BIWU1PREUJcEhUUGh5TW9kZSA9ICZIVF9QaHlNb2RlOworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkhUX1BoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpwSFRQaHlNb2RlCShQaHlNb2RlID0gJWQsVHJhbnNtaXRObyA9ICVkLCBIdE1vZGUgPQklZCwJRXh0T2Zmc2V0ID0JJWQgLCBNQ1MgPSAlZCwgQlcgPQklZCwJU1RCQyA9ICVkLCBTSE9SVEdJID0gJWQpIFxuIiwKKwkJCQlwSFRQaHlNb2RlLT5QaHlNb2RlLCBwSFRQaHlNb2RlLT5UcmFuc21pdE5vLHBIVFBoeU1vZGUtPkh0TW9kZSxwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywJcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUJPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCQkJUlRNUFNldEhUKHBBZGFwdGVyLAlwSFRQaHlNb2RlKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuQlcsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQykpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUxPTkcgYXBzZCA7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFwc2QsIHdycS0+dS5kYXRhLnBvaW50ZXIsCXdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8QjMxfkI3CXwJQjZ+QjUJIHwJIEI0CSB8CSBCMwkgfAlCMgkgfAlCMQkgfAkgICBCMAkJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXwgUnN2ZAl8IE1heCBTUCBMZW4gfCBBQ19WTyB8IEFDX1ZJIHwgQUNfQksgfCBBQ19CRSB8IEFQU0QJQ2FwYWJsZQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IChhcHNkICYgMHgwMDAwMDAwMSkgPyBUUlVFIDoJRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gKChhcHNkCSYgMHgwMDAwMDAwNCkgPj4gMikJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gKChhcHNkCSYgMHgwMDAwMDAwOCkgPj4gMykJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aAk9IChVQ0hBUikoKGFwc2QJJiAweDAwMDAwMDYwKSA+PiA1KTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HIChhcHNkPTB4JWx4LCBBUFNEQ2FwPSVkLCBbQkUsQkssVkksVk9dPVslZC8lZC8lZC8lZF0sCU1heFNQTGVuPSVkKVxuIiwgYXBzZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUsCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkksCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCS8vIERyaXZlciBuZWVkcwl0byBub3RpZnkgQVAgd2hlbiBQU00gY2hhbmdlcworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWRhcHRlci0+U3RhQ2ZnLlBzbSkKKwkJCQl7CisJCQkJCU1sbWVTZXRQc21CaXQocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7CisJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZSwJVFJVRSk7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00gKGJBUFNERm9yY2VQb3dlclNhdmU6JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChvbGR2YWx1ZSAmJgkhcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCQl7CisJCQkJCWludAlpOworCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQorCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihSVF84MDJfMTFfRExTX1VJKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVJUXzgwMl8xMV9ETFMJRGxzOworCisJCQkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJCQlSVE1QTW92ZU1lbW9yeSgmRGxzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCQkJJkRscyk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSBcbiIpKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX1dNTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJLy8KKwkJCS8vIFNldCBOZGlzUmFkaW9TdGF0ZU9mZiB0bwlUUlVFLCBpbnN0ZWFkIG9mIGNhbGxlZAlNbG1lUmFkaW9PZmYuCisJCQkvLyBMYXRlciBvbiwgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWC0+TnVtYmVyT2ZJdGVtcyBzaG91bGQgYmUJMAorCQkJLy8gd2hlbglxdWVyeSBPSURfODAyXzExX0JTU0lEX0xJU1QuCisJCQkvLworCQkJLy8gVFJVRTogIE51bWJlck9mSXRlbXMJd2lsbCBzZXQgdG8JMC4KKwkJCS8vIEZBTFNFOiBOdW1iZXJPZkl0ZW1zCW5vIGNoYW5nZS4KKwkJCS8vCisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0JVFJVRTsKKwkJCS8vIFNldCB0byBpbW1lZGlhdGVseSBzZW5kIHRoZSBtZWRpYSBkaXNjb25uZWN0CWV2ZW50CisJCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOworCisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0JQ05UTF9JRExFKQorCQkJCXsKKwkJCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJCQl9CisKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFLAorCQkJCQkwLAorCQkJCQlOVUxMKTsKKworCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQJPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUDoKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQkFDQVBfU1RSVUMpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCU9JRF9CQUNBUF9TVFJVQyBPcmRlIDsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk9yZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCWlmIChPcmRlLlBvbGljeSA+IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKE9yZGUuUG9saWN5ID09IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9Qcz0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsgLy8gd2Ugb25seSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKworCQkJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA+IE1BWF9SWF9SRU9SREVSQlVGKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOworCisJCQkJCX0KKworCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooT3JkZS5BdXRvQkEgPSAlZCkgKFBvbGljeT0lZCkoUmVCQVdpbkxpbWl0PSVkKShUeEJBV2luTGltaXQ9JWQpKEF1dG9Nb2RlPSVkKVxuIixPcmRlLkF1dG9CQSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0LHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkpKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFNldCA6OiBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUNIQVIJCSAgICAgICAgaW5kZXg7CisJCQkJT0lEX0FERF9CQV9FTlRSWSAgICBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKEJBLlRJRCA+IDE1KQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkKKwkJCQkJLy9BcyBhZC1ob2MgbW9kZSwgQkEgcGFpciBpcyBub3QgbGltaXRlZCB0byBvbmx5IEJTU0lELiBzbyBhZGQgdmlhIE9JRC4KKwkJCQkJaW5kZXggPSBCQS5USUQ7CisJCQkJCS8vIGluIGFkIGhvYyBtb2RlLCB3aGVuIGFkZGluZyBCQSBwYWlyLCB3ZSBzaG91bGQgaW5zZXJ0IHRoaXMgZW50cnkgaW50byBNQUNFbnRyeSB0b28KKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIEJBLk1BQ0FkZHIpOworCQkJCQlpZiAoIXBFbnRyeSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gYnJlYWsgb24gbm8gY29ubmVjdGlvbi4tLS0tOiV4OiV4XG4iLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoQkEuSXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJICAgIGlmIChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IFRSVUUpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKKworCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkYXB0ZXIsIHBFbnRyeSwgaW5kZXgsIDAsIDEwMCwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeShwQWRhcHRlciwgcEVudHJ5LT5BaWQsIEJBLk1BQ0FkZHIsIDAsIDB4ZmZmZiwgQkEuVElELCBCQS5uTVNEVSwgQkEuSXNSZWNpcGllbnQpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBSZWMgPSAlZC4gTWFjID0gJXg6JXg6JXg6JXg6JXg6JXggLiBcbiIsCisJCQkJCQlCQS5Jc1JlY2lwaWVudCwgQkEuTUFDQWRkclswXSwgQkEuTUFDQWRkclsxXSwgQkEuTUFDQWRkclsyXSwgQkEuTUFDQWRkclsyXQorCQkJCQkJLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVBPSURfQUREX0JBX0VOVFJZCXBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCXBCQSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCQlpZiAocEJBID09IE5VTEwpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEga21hbGxvYygpIGNhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIpKTsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEoVElEPSVkLCBiQWxsVGlkPSVkKVxuIiwgcEJBLT5USUQsIHBCQS0+YkFsbFRpZCkpOworCisJCQkJCWlmICghcEJBLT5iQWxsVGlkICYmIChwQkEtPlRJRCA+IE5VTV9PRl9USUQpKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZGFwdGVyLCBwRW50cnktPkFpZCwgcEJBLT5USUQsIEZBTFNFLCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlCQVJlY1Nlc3Npb25UZWFyRG93biggcEFkYXB0ZXIsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWtmcmVlKHBCQSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQorICAgIAljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKKyAgICAJICAgIHBXZXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMworICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQorICAgIAkJCXsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKEtleUlkeCBtdXN0IGJlIHNtYWxsZXIgdGhhbiA0KSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVDSEFSIENpcGhlckFsZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBLZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChwV2VwS2V5LT5LZXlMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBvbmx5IHN1cHBvcnQgQ0lQSEVSX1dFUDY0KGxlbjo1KSAmIENJUEhFUl9XRVAxMjgobGVuOjEzKSEhXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQgPSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkgJiYKKwkJCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJCQkJCXsKKwkJCQkJCUtleSA9IHBXZXBLZXktPktleU1hdGVyaWFsOworCisJCQkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCisgICAgICAgIAkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgICAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworICAgIAkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQIChpZD0weCV4LCBMZW49JWQtYnl0ZSksICVzXG4iLCBwV2VwS2V5LT5LZXlJbmRleCwgcFdlcEtleS0+S2V5TGVuZ3RoLCAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfU0VUX0NPVU5URVJNRUFTVVJFUyBiQmxvY2tBc3NvYz0lc1xuIiwgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgIAkJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOworCQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWRhcHRlciwgTXNnRWxlbSk7CisJCQkJa2ZyZWUoTXNnRWxlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKwkJCQlwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gSUVFRTgwMjF4U3RhdGU7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVggKD0lZClcbiIsIElFRUU4MDIxeFN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVk6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKwkJCQkgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKKwkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCisJICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKKwkJICAgICAgICBVSU5UCQlCc3NJZHg7CisJCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OworCisJCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKKwkJICAgICAgICB7CisJCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCisJCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KKwkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEJzc0lkSW5mby0+QlNTSUQsIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCisJCQkJCSAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKworCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkJCSAgICAgICAgfQorCQkJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJCQkgICAgICAgIGVsc2UKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJCQkgICAgICAgIENhY2hlZElkeCA9IChwQnNzSWRJbmZvLT5CU1NJRFs1XSAlIFBNS0lEX05PKTsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgfQorCQkgICAgICAgIH0KKwkJCX0KKwkJCWlmKHBQbWtJZCkKKwkJCQlrZnJlZShwUG1rSWQpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZCwgU2hvcnRSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCwgU2hvcnRSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOworCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkvL3BLZXkgPSAmV2VwS2V5OworCisJCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisJCQl7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOworCQkJfQorCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCisJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCWlmIChLZXlJZHggPiA0KQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJfQorCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJc3ByaW50ZigmY3RtcCwiJWQiLCBjdG1wKTsKKwkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZGFwdGVyLCAmY3RtcCk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYICAgICAgICAgICAqcEJzc2lkTGlzdCA9IE5VTEw7CisgICAgUE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgICAgICAgICAgICAgcEJzczsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgICpwQ29uZmlndXJhdGlvbiA9IE5VTEw7CisgICAgUlRfODAyXzExX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgKnBMaW5rU3RhdHVzID0gTlVMTDsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICAqcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfU1RBVElTVElDUyAgICAgICAgICAgICAgKnBTdGF0aXN0aWNzID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbVR5cGU7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfTUVESUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSwgdWxJbmZvPTAsIE5ldHdvcmtUeXBlTGlzdFs0XSwgYXBzZCA9IDA7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmID0gTlVMTCwgcFB0cjsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUGFkZGluZyA9IDA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKwlVQ0hBUglkcml2ZXJWZXJzaW9uWzhdOworICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkvL2ZvciBzbm1wLCBrYXRoeQorCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7CisJSU5UCQkJCQkJCXZhbHVlTGVuOworCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCXRtcFs2NF07CisjZW5kaWYgLy9TTk1QCisKKyAgICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgU1RBX05JQ19ERVZJQ0VfTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKFVDSEFSKTsKKwkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7CisJCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJY2FzZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVDMyKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8qCisgICAgICAgICAgICAJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIAkgKi8KKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2xhY3VsYXRlIHRvdGFsIGJ1ZmZlciBzaXplIHJlcXVpcmVkCisgICAgICAgICAgICBCc3NCdWZTaXplID0gc2l6ZW9mKFVMT05HKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOworICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKKyAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCisgICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCisgICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKKyAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7CisgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBidWZmZXIgbGVuZ3RoCisgICAgICAgICAgICBCc3NMZW4gPSA0OyAvLyBDb25zaXN0IG9mIE51bWJlck9mSXRlbXMKKyAgICAgICAgICAgIC8vIFBvaW50IHRvIHN0YXJ0IG9mIE5ESVNfV0xBTl9CU1NJRF9FWAorICAgICAgICAgICAgLy8gcFB0ciA9IHBCdWYgKyBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgcFB0ciA9IChQVUNIQVIpICZwQnNzaWRMaXN0LT5Cc3NpZFswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSGlkZGVuID09IDEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLworCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgorCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCisJCQkJCS8vCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQkJeworCQkJCQkJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisJCQkJCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+UHJpdmFjeSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7CisgICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICAgICAgcEJzcy0+TmV0d29ya1R5cGVJblVzZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdGltV2luOworCisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKKworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgICAgIGlmICgoQnNzTGVuICsgcEJzcy0+TGVuZ3RoKSA8IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZWxzZQorICAgICAgICAgICAgaWYgKEJzc0xlbiA+IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbmRpZgorICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBCc3NpZExpc3QsIEJzc0xlbik7CisgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisJCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCVNzaWQuU3NpZExlbmd0aCk7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNzaWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsIHNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTOgorICAgICAgICAgICAgcExpbmtTdGF0dXMgPSAoUlRfODAyXzExX0xJTktfU1RBVFVTICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwTGlua1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q3VyclR4UmF0ZSA9IFJhdGVJZFRvNTAwS2Jwc1twQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkYXB0ZXItPk1sbWUuQ2hhbm5lbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5UeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKyAgICAgICAgCQlwTGlua1N0YXR1cy0+Q2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luOworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6CisJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjAgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgorCQkJaWYgKChwQWRhcHRlci0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7CisJCQl9CisJCQllbHNlCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX1JTU0k6CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgorCQkJdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMToKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKKyAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZGFwdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgY2FsY3VsYXRpb24gb2Ygc3VjZXNzZnVsIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZhaWxlZENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyNpZmRlZiBEQkcKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgLyAxMDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGF0aXN0aWNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9PSzoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgcFN0YUNvbmZpZyA9IChSVF84MDJfMTFfU1RBX0NPTkZJRyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhQ29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUdcbiIpKTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUeEJ1cnN0ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lOworICAgICAgICAgICAgICAgIC8vcFN0YUNvbmZpZy0+QWRob2NNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWRhcHRlci0+U3lzdGVtRXJyb3JCaXRtYXA7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YUNvbmZpZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBSdHNUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICBGcmFnVGhyZXNoID0gMDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihGcmFnVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKD0lbGQpXG4iLCBGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBQb3dlck1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW87CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJQlNTOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUHJlYW1UeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUHJlYW1UeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUoPSVkKVxuIiwgUHJlYW1UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBBdXRoTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwgJXhcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQ6CisJCQlpZiAoKHBBZGFwdGVyLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWRhcHRlci0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSkKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7CisJCQkJYnJlYWs7CisJICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7CisJCQllbHNlIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUJHX01JWEVEKSB8fCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQllbHNlCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFJ4UmF0ZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgorCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RUeFJhdGU7CisJCQl1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKSk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RXh0cmFJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfRVhUUkFfSU5GTyAoPSVsZClcbiIsIHBBZGFwdGVyLT5FeHRyYUluZm8pKTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOworCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgorCQkJYXBzZCA9IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPDwgMSkgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCisJCQkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA8PCA0KQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAorCQkJCWFwc2QscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOworICAgIAkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZlbmFibGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfTkVXX0RSSVZFUiAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWRhcHRlci0+U3RhQ2ZnLmRldl9uYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisKKyAgICAJCQlwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPSAoKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisgICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyAgICAgICAgICAgIGkgPSAxOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oUmVzb3VyY2VUeXBlSWROYW1lKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBSZXNvdXJjZVR5cGVJZE5hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEIFxuIikpOworCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBzdXBwb3J0IHdlcCBlbHNlIDIgaXMgbm90IHN1cHBvcnQuCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFIFxuIikpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQorCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgorCQkJZWxzZQorCQkJCXVsSW5mbyA9IDI7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOworCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOworCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOworCQkJdmFsdWVMZW4gPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwS2V5SWR4VmFsdWUtPlZhbHVlLAorCQkJCQkJICAgJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgIHZhbHVlTGVuKTsKKwkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJCQkJJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCVNob3J0UmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0UmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWRcbiIsIFNob3J0UmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7CisKKyNpZmRlZiBSVDI4NzAKKwkJCXNwcmludGYodG1wLCAiJTA0eCAlMDR4XG4iLCAoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICwoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbih0bXApOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKyNlbmRpZiAvL1NOTVBfU1VQUE9SVAorCisJCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgorCQkJeworCQkJCVVDSEFSIHZhbHVlOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMTsKKyNlbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAwOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgorCQkJeworCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKKwkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJCQkJZm9yIChpID0gMDsgaSA8IHBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0W2ldID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCisJCQkJaWYgKHBDaExpc3RCdWYpCisJCQkJCWtmcmVlKHBDaExpc3RCdWYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuR2VvZ3JhcGh5LCAxKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFM6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKKwkJCXsKKwkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCX0KKworCQkJCXBEbHNJbmZvLT5udW0gPSBNQVhfTlVNX09GX0RMU19FTlRSWTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcERsc0luZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNXG4iKSk7CisKKwkJCQlpZiAocERsc0luZm8pCisJCQkJCWtmcmVlKHBEbHNJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJVklSVFVBTF9BREFQVEVSCQkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVU0hPUlQJCQkJc3ViY21kOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwkgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkgICAgeworCQkgICAgcmV0dXJuIFN0YXR1czsKKwkgICAgfQorCisJICAgIGlmIChzdHJzdHIod3JxLT51LmRhdGEucG9pbnRlciwgIk9wTW9kZSIpID09IE5VTEwpCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICAgICAgfQorICAgIH0KKworCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisJCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJc3dpdGNoKGNtZCkKKwl7CisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWNhc2UgUlRQUklWX0lPQ1RMX0FURToKKwkJCXsKKwkJCQlSdG1wRG9BdGUocEFkLCB3cnEpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lGSFdBRERSXG4iKSk7CisJCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICB7CisgICAgICAgIAljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOV0lEOiAgIC8vIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkKKwkJY2FzZSBTSU9DR0lXTldJRDogICAvLyBnZXQgbmV0d29yayBpZAorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU0lXRlJFUTogICAvL3NldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJICAgIGNhc2UgU0lPQ1NJV0FQOiAgLy9zZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXU0VOUzogICAvL2dldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NTSVdTRU5TOgkvL3NldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NHSVdQT1dFUjogIC8vZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DU0lXUE9XRVI6ICAvL3NldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ0dJV1RYUE9XOiAgLy9nZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DU0lXVFhQT1c6ICAvL3NldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NHSVdSQU5HRToJLy9HZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycworCQljYXNlIFNJT0NHSVdSRVRSWToJLy9nZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQljYXNlIFNJT0NTSVdSRVRSWToJLy9zZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBSVF9QUklWX0lPQ1RMOgorCQkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CisJCQlpZiggc3ViY21kICYgT0lEX0dFVF9TRVRfVE9HR0xFKQorCQkJCVN0YXR1cyA9IFJUTVBTZXRJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IFJUTVBRdWVyeUluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXUFJJVjoKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQorCQkJCQlicmVhazsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQorCQkJCWJyZWFrOworCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKKwkJICAgIGJyZWFrOworI2lmZGVmIERCRworCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6CisJCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKKwkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBEQkcgLy8KKyAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJfQorCisgICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNTSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7CisJCSAgICBtZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCX0KKyAgICAgICAgcFNzaWQgPSAmU3NpZDsKKworICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgeworICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisgICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCisgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworICAgIGlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmZGVmIFdNTV9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXbW1DYXBhYmxlIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgliV21tQ2FwYWJsZTsKKworCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoYldtbUNhcGFibGUgPT0gMSkKKyNpZmRlZiBSVDI4NzAKKwkJJiYgKHBBZC0+TnVtYmVyT2ZQaXBlcyA+PSA1KQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpCit7CisJSU5UIGk7CisKKwlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKKwkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisJCSAgICBicmVhazsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMucGF0Y2ggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzJiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jLnBhdGNoCkBAIC0wLDAgKzEsMTggQEAKKy0tLSBzdGFfaW9jdGwuYwkyMDA4LTA5LTE5IDE0OjM3OjUyLjAwMDAwMDAwMCArMDgwMAorKysrIHN0YV9pb2N0bC5jLmZjOQkyMDA4LTA5LTE5IDE0OjM4OjIwLjAwMDAwMDAwMCArMDgwMAorQEAgLTQ5LDE1ICs0OSw5IEBACisKKyAjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKy0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyAjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyAjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyAjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCistI2Vsc2UKKy0jZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0IsIF9DLCBfRCwgX0UpCistI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCistI2VuZGlmCisKKyBleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107CisgZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjAgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjA5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYwCkBAIC0wLDAgKzEsNzAzNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKwl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJhZGhvY0VudHJ5IiB9LAorCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisjaWZkZWYgUlQyODcwCisJc3RybmNweShuYW1lLCAiUlQyODcwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg3MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlpbnQgCWNoYW4gPSAtMTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCisJaWYgKGZyZXEtPmUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWVsc2UKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCisgICAgaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpCisgICAgeworCXBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9IGNoYW47CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT0+cnRfaW9jdGxfc2l3ZnJlcTo6U0lPQ1NJV0ZSRVFbY21kPTB4JXhdIChDaGFubmVsPSVkKVxuIiwgU0lPQ1NJV0ZSRVEsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKKwlVQ0hBUiBjaDsKKwlVTE9ORwltOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT5ydF9pb2N0bF9naXdmcmVxICAlZFxuIiwgY2gpKTsKKworICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwgbSk7CisJZnJlcS0+bSA9IG0gKiAxMDA7CisJZnJlcS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgeworICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgIH0KKworICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIEVUSF9BTEVOKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOworICAgIH0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbml0cyBhcmUgaW4gZGIgYWJvdmUgdGhlIG5vaXNlIGZsb29yLiBUaGF0IG1lYW5zIHRoZQorICogcnNzaSB2YWx1ZXMgcmVwb3J0ZWQgaW4gdGhlIHR4L3J4IGRlc2NyaXB0b3JzIGluIHRoZQorICogZHJpdmVyIGFyZSB0aGUgU05SIGV4cHJlc3NlZCBpbiBkYi4KKyAqCisgKiBJZiB5b3UgYXNzdW1lIHRoYXQgdGhlIG5vaXNlIGZsb29yIGlzIC05NSwgd2hpY2ggaXMgYW4KKyAqIGV4Y2VsbGVudCBhc3N1bXB0aW9uIDk5LjUgJSBvZiB0aGUgdGltZSwgdGhlbiB5b3UgY2FuCisgKiBkZXJpdmUgdGhlIGFic29sdXRlIHNpZ25hbCBsZXZlbCAoaS5lLiAtOTUgKyByc3NpKS4KKyAqIFRoZXJlIGFyZSBzb21lIG90aGVyIHNsaWdodCBmYWN0b3JzIHRvIHRha2UgaW50byBhY2NvdW50CisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcnNzaSBtZWFzdXJlbWVudCBpcyBmcm9tIDExYiwKKyAqIDExZywgb3IgMTFhLiAgIFRoZXNlIGRpZmZlcmVuY2VzIGFyZSBhdCBtb3N0IDJkYiBhbmQKKyAqIGNhbiBiZSBkb2N1bWVudGVkLgorICoKKyAqIE5COiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIG9yaW5vY28vd2F2ZWxhbgorICogICAgIGRyaXZlcnMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICppcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyIHJzc2kpCit7CisJX191OCBDaGFubmVsUXVhbGl0eTsKKworCS8vIE5vcm1hbGl6ZSBSc3NpCisJaWYgKHJzc2kgPj0gLTUwKQorCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKKwllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOworCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisgICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCisgICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKworICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKKyAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKyAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOworICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKK30KKworaW50IHJ0X2lvY3RsX2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IGk9MDsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWY7CisJY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisjaWZuZGVmIElXRVZHRU5JRQorCWNoYXIgaWR4OworI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCXN0cnVjdCBpd19ldmVudCBpd2U7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIHsKKwkJLyoKKwkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwl7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgZWxzZQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2Vsc2UKKyAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCisgICAgICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisJCS8vTUFDIGFkZHJlc3MKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2lmZGVmIFJUMjg3MAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKKwkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXUxNiB2YWw7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA8IDAgfHwgcnRzLT52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChydHMtPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwkJdmFsID0gcnRzLT52YWx1ZTsKKworCWlmICh2YWwgIT0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpCisJCXBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIAllbHNlCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKworICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCisJeworCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKKwkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOworICAgICAgICB9CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKworCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCX0KKwkJZWxzZQorCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKyAgICBlbHNlCisJCQl7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKK2RvbmU6CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworCWludCBraWQ7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwl7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisJZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKKwl7CisJCS8vIGNvcHkgd2VwIGtleQorCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQorCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKworCX0KKwllbHNlIGlmIChraWQgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlcjsKKwlQT1NfQ09PS0lFIHBPYmo7CisJY2hhciAqdGhpc19jaGFyID0gZXh0cmE7CisJY2hhciAqdmFsdWU7CisJaW50ICBTdGF0dXM9MDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZGFwdGVyLT5PU19Db29raWU7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoISp0aGlzX2NoYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCF2YWx1ZSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQorICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKKwl7CisJICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKKwkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAorCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgICAgICB9CisJCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgorCSAgICB9CisJfQorCisJaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQorCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50CisJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwl9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworCUlOVAkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworCX0KKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJCWVsc2UKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKyAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQJZ2V0QmFJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCit7CisJSU5UIGksIGo7CisJQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKKwlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJCXsKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKKyAgICAgICAgICAgICAgICBwT3V0QnVmLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKKwkJfQorICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKyAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJCXBBZCA9IGRldi0+cHJpdjsKKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworICAgIHN3aXRjaChzdWJjbWQpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPV19DT05OX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisgICAgICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2VudHJhbENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIlNzaWQ9JXMgLFNzaWRsZW4gPSAlZFxuIixwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJDb25uU3RhdHVzIGlzIG5vdCBjb25uZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKKyAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU0hPV19ERVNDX0lORk86CisJCQl7CisJCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT0ZGOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PTjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7CisgICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFNIT1dfRExTX0VOVFJZX0lORk86CisJCQl7CisJCQkJU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJY2FzZSBTSE9XX0NGR19WQUxVRToKKwkJCXsKKwkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7CisJCQkJaWYgKFN0YXR1cyA9PSAwKQorCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKKwkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKKwkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCisJaWYgKHBNbG1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoKHBNbG1lLT5jbWQpCisJeworI2lmZGVmIElXX01MTUVfREVBVVRICisJCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworaW50IHJ0X2lvY3RsX3Npd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdFUCAxeAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IFRSVUU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorCQkJeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfSovCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCX0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworCQkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCXsKKyAgICAgICAga2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgICAgICAvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJICAgIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKyAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGVuY29kaW5nLT5mbGFncykpOworICAgIH0KKwkJCQkJZWxzZQorICAgIHsKKyAgICAgICAgLy8gR2V0IEtleSBJbmRleCBhbmQgY29udmV0IHRvIG91ciBvd24gZGVmaW5lZCBrZXkgaW5kZXgKKyAgICAJa2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgIAlpZigoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0ga2V5SWR4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkRlZmF1bHRLZXlJZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgCQkJYnJlYWs7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwgX19GVU5DVElPTl9fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOworICAgIAkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJCQl9CisgICAgICAgIAkJZWxzZSBpZiAoZXh0LT5rZXlfbGVuID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCX0KKyAgICAgICAgCQllbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKwkJCSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKyAgICAJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1RLSVAgLSBrZXlJZHggPSAlZCwgZXh0LT5rZXlfbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQl7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgIAlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAorCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKworaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8CisJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJCXJldHVybiAtRTJCSUc7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQlSU05JZSA9IElFX1JTTjsKKworCQlleHRyYVswXSA9IChjaGFyKVJTTkllOworCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisvLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIFVJTlQzMiAgICAgICAgICByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisgICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKyAgICAqLworICAgIGlmIChyYXRlID09IC0xKQorICAgIHsKKwkJLy9BdXRvIFJhdGUKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChmaXhlZCkKKyAgICAgICAgeworICAgICAgICAJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisgICAgICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIHJhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJhdGUgPSBYLCBmaXhlZCA9IDAgPT4gKHJhdGVzIDw9IFgpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisvLyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoxNikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqMzIpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisjaWZkZWYgUlQyODcwCisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlCT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVPdGhlcj0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRSZXEgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJblJlcT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg3MAorCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsICgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgLCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorI2lmZGVmIFJUMjg3MAorCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCSkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBOZXR3b3JrIFR5cGUoSW5mcmFzdHJ1Y3R1cmUvQWRob2MgbW9kZSkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVJTlQzMglWYWx1ZSA9IDA7CisKKyAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQorICAgIHsKKwkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOworCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCisJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9CRUxPVykKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIDIwTUh6CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQl9CisJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgMHgzKTsKKwkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgorCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCS8vVmFsdWUgfD0gKDB4ODApOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCS8vIGRpc2FibGUgc3luYworCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsgLy9BUlBIUkRfSUVFRTgwMjExOyAvLyBJRUVFODAyMTEKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIk5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInRraXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkFFUyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiYWVzIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9FbmNyeXBUeXBlX1Byb2M6OihFbmNyeXBUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBEZWZhdWx0IEtleSBJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKKworICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisgICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTEKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTMKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVk0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworCisgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKyAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7CisKKyAgICBOZGlzWmVyb01lbW9yeShrZXlNYXRlcmlhbCwgNDApOworCisgICAgaWYgKChzdHJsZW4oYXJnKSA8IDgpIHx8IChzdHJsZW4oYXJnKSA+IDY0KSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBmYWlsZWQhIShXUEFQU0s9JXMpLCBXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyBcbiIsIGFyZykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmxlbihhcmcpID09IDY0KQorICAgIHsKKyAgICAgICAgQXRvSChhcmcsIGtleU1hdGVyaWFsLCAzMik7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBhc3N3b3JkSGFzaCgoY2hhciAqKWFyZywgcEFkYXB0ZXItPk1sbWVBdXguU3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguU3NpZExlbiwga2V5TWF0ZXJpYWwpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICB9CisKKworCisgICAgaWYocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyAmJgorICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICB7CisgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICB7CisgICAgICAgIGlmICgoc3RyY21wKGFyZywgIk1heF9QU1AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJtYXhfcHNwIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAiTUFYX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkZhc3RfUFNQIikgPT0gMCkgfHwKKwkJCQkgKHN0cmNtcChhcmcsICJmYXN0X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiRkFTVF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJsZWdhY3lfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisgICAgICAgICAgICAvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICBNbG1lU2V0UHNtQml0KHBBZGFwdGVyLCBQV1JfQUNUSVZFKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9QU01vZGVfUHJvYzo6KFBTTW9kZT0lbGQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgorICAgIFZhbHVlOgorICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgorICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KKyAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIE1BQworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgbWFjIDAgICAgICAgID09PiByZWFkIE1BQyB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgbWFjIDA9MTIgICAgID09PiB3cml0ZSBNQUMgd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVMT05HCQkJCW1hY0FkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKKwlJTlQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkgICAgdGhpc19jaGFyID0gYXJnOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBNYWMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKG1hY0FkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lbHgsIE1hY1ZhbHVlPSV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyICwgbWFjVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDgpCisJCQkJdGVtcDJbNy1rKytdPScwJzsKKwkJCXRlbXAyWzhdPSdcMCc7CisKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKKwkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOworCisJCQkJLy8gZGVidWcgbW9kZQorCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKKwkJCQl7CisJCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwICAgICAJPT0+IHJlYWQgRTJQUk9NIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBlMnAgMD0xMjM0ICAgID09PiB3cml0ZSBFMlBST00gd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyMzQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVVNIT1JUCQkJCWVlcEFkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVVNIT1JUCQkJCWVlcFZhbHVlOworCWludAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCSAgICAvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSBhcmc7CisKKworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIEUyUFJPTSBhZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAoZWVwQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA0WF06MHglMDRYICAiLCBlZXBBZGRyICwgZWVwVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRlbXAyWzMtaysrXT0nMCc7CisJCQl0ZW1wMls0XT0nXDAnOworCisJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7CisJCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworCisKKworSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX0ZsZXhpYmxlOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfU3RyaWN0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0llZWU4MDJkTW9kZV9Qcm9jOjooSUVFRUUwMjExZE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2M6OihDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSkKK3sKKwlJTlQgaTsKKworCXNwcmludGYoZXh0cmEsICJcbiIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3ByaW50ZihleHRyYSwgIiVzSFQgT3BlcmF0aW5nIE1vZGUgOiAlZFxuIiwgZXh0cmEsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKGV4dHJhLCAiJXNcbiUtMTlzJS00cyUtNHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsIGV4dHJhLAorCQkJIk1BQyIsICJBSUQiLCAiQlNTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQlpZiAoc3RybGVuKGV4dHJhKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJICAgIGJyZWFrOworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLCBleHRyYSwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBzIiwgZXh0cmEsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02cyIsIGV4dHJhLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwZCwgJWQsICVkJSVcbiIsIGV4dHJhLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlc1xuIiwgZXh0cmEpOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyMDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEKQEAgLTAsMCArMSw3MDM3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHN0YV9pb2N0bC5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBJT0NUTCByZWxhdGVkIHN1YnJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFJvcnkgQ2hlbiAgIDAxLTAzLTIwMDMgICAgY3JlYXRlZAorCVJvcnkgQ2hlbiAgIDAyLTE0LTIwMDUgICAgbW9kaWZ5IHRvIHN1cHBvcnQgUlQ2MQorKi8KKworI2luY2x1ZGUJInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgREJHCitleHRlcm4gVUxPTkcgICAgUlREZWJ1Z0xldmVsOworI2VuZGlmCisKKyNkZWZpbmUgTlJfV0VQX0tFWVMgCQkJCTQKKyNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4gCQkJKDQwLzgpCisjZGVmaW5lIFdFUF9MQVJHRV9LRVlfTEVOIAkJCSgxMDQvOCkKKworI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCisjZWxzZQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1ZBTFVFKF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YpCWl3ZV9zdHJlYW1fYWRkX3ZhbHVlKF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbmRpZgorCitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhMlRlbXBsYXRlW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcFtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBMZW47CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfVkVSU0lPTl9JTkZPeworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25XOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25YOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25ZOworICAgIFVDSEFSICAgICAgIERyaXZlclZlcnNpb25aOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkWWVhcjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZE1vbnRoOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkRGF5OworfSBSVF9WRVJTSU9OX0lORk8sICpQUlRfVkVSU0lPTl9JTkZPOworCitzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKK3sgUlRQUklWX0lPQ1RMX1NFVCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCAwLAorICAic2V0In0sCisKK3sgUlRQUklWX0lPQ1RMX1NIT1csIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKK3sgUlRQUklWX0lPQ1RMX1NIT1csIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAorLyogLS0tIHN1Yi1pb2N0bHMgZGVmaW5pdGlvbnMgLS0tICovCisgICAgeyBTSE9XX0NPTk5fU1RBVFVTLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCisJeyBTSE9XX0RSVklFUl9WRVJJT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZHJpdmVyVmVyIiB9LAorICAgIHsgU0hPV19CQV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImJhaW5mbyIgfSwKKwl7IFNIT1dfREVTQ19JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAorICAgIHsgUkFJT19PRkYsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb2ZmIiB9LAorCXsgUkFJT19PTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vbiIgfSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IFNIT1dfRExTX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGxzZW50cnlpbmZvIiB9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsgU0hPV19DRkdfVkFMVUUsCisJICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAorCXsgU0hPV19BREhPQ19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImFkaG9jRW50cnkiIH0sCisKKy8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KKworI2lmZGVmIERCRworeyBSVFBSSVZfSU9DVExfQkJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiYmJwIn0sCit7IFJUUFJJVl9JT0NUTF9NQUMsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAibWFjIn0sCit7IFJUUFJJVl9JT0NUTF9FMlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZTJwIn0sCisjZW5kaWYgIC8qIERCRyAqLworCit7IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAic3RhdCJ9LAoreyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImdldF9zaXRlX3N1cnZleSJ9LAorfTsKKworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisKK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCitWT0lEIFJUTVBJb2N0bEJCUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKKyNlbmRpZiAvLyBEQkcgLy8KKworCitORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4JUFZPSUQJCQlwQnVmKTsKKworSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpOworCitzdGF0aWMgc3RydWN0IHsKKwlDSEFSICpuYW1lOworCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKKwl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAorCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKKwl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAorCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCisJeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAorCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCisJeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKKyAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKKwl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCisJeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKKwl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCisjaWZkZWYgREJHCisJeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBSQUxJTktfQVRFCisJeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAorCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCisJeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKKwl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCisJeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKKwl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKKwl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKKwl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKKwl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCisJeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKKwl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCisJeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKKwl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCisJeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAorCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCisJeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKKwl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAorCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCisJeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKKwl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAorCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKKwl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCisJeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCisJeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAorCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisJeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAorICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCisJeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IkxvbmdSZXRyeSIsCSAgICAgICAgCQlTZXRfTG9uZ1JldHJ5TGltaXRfUHJvY30sCisJeyJTaG9ydFJldHJ5IiwJICAgICAgICAJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCXtOVUxMLH0KK307CisKKworVk9JRCBSVE1QQWRkS2V5KAorCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKKwlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCit7CisJVUxPTkcJCQkJS2V5SWR4OworCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5IC0tLS0tLT5cbiIpKTsKKworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQl7CisJCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCQkgICAgLy8gVXBkYXRlIFBUSworCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisgICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgIAllbHNlCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorICAgICAgICAJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBMRU5fVEtJUF9FSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBwRW50cnkpOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgR1RLCisgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAocEtleS0+S2V5SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKyAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgIAkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIE5VTEwpOworCisgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCSAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgfQorCX0KKwllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKKwl7CisJCVVDSEFSCUNpcGhlckFsZzsKKyAgICAJUFVDSEFSCUtleTsKKworCQlpZihwS2V5LT5LZXlMZW5ndGggPT0gMzIpCisJCQlnb3RvIGVuZDsKKworCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisKKwkJaWYgKEtleUlkeCA8IDQpCisJCXsKKwkJCS8vIGl0IGlzIGEgZGVmYXVsdCBzaGFyZWQga2V5LCBmb3IgUGFpcndpc2Uga2V5IHNldHRpbmcKKwkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQl7CisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwS2V5LT5CU1NJRCk7CisKKwkJCQlpZiAocEVudHJ5KQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleTogU2V0IFBhaXItd2lzZSBLZXlcbiIpKTsKKworCQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkJLy8gc2V0IENpcGhlciB0eXBlCisJCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQllbHNlCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCShVQ0hBUilwRW50cnktPkFpZCwKKyAgICAgICAgICAgICAgICAJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKworCQkJCQkvLyB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlCU1MwLAorCQkJCQkJS2V5SWR4LCAvLyBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCXBFbnRyeSk7CisKKwkJCQl9CisJCQl9CisJCQllbHNlCisgICAgICAgICAgICB7CisJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCS8vIFNldCBDaXBlciB0eXBlCisJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQllbHNlCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCX0KKwkJfQorCX0KK2VuZDoKKwlyZXR1cm47Cit9CisKK2NoYXIgKiBydHN0cmNocihjb25zdCBjaGFyICogcywgaW50IGMpCit7CisgICAgZm9yKDsgKnMgIT0gKGNoYXIpIGM7ICsrcykKKyAgICAgICAgaWYgKCpzID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKGNoYXIgKikgczsKK30KKworLyoKK1RoaXMgaXMgcmVxdWlyZWQgZm9yIExpbkVYMjAwNC9rZXJuZWwyLjYuNyB0byBwcm92aWRlIGl3bGlzdCBzY2FubmluZyBmdW5jdGlvbgorKi8KKworaW50CitydF9pb2N0bF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworLy8JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyNpZmRlZiBSVDI4NzAKKwlzdHJuY3B5KG5hbWUsICJSVDI4NzAgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCWludCAJY2hhbiA9IC0xOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisKKwlpZiAoZnJlcS0+ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCisJCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJZWxzZQorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCisKKyAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKKyAgICB7CisJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK2ludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBOVUxMOworCVVDSEFSIGNoOworCVVMT05HCW07CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwlmcmVxLT5tID0gbSAqIDEwMDsKKwlmcmVxLT5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoICgqbW9kZSkKKwl7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQlicmVhazsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICAgICAgY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2l3bW9kZTo6U0lPQ1NJV01PREUgKHVua25vd24gJWQpXG4iLCAqbW9kZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgIGVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd21vZGUobW9kZT0lZClcbiIsICptb2RlKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXUxNiB2YWw7CisJaW50IGk7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKKwl7CisJCXUzMiBtOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7CisJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisKKwkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJdmFsKys7CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisKKwkvKiBXaGF0IHdvdWxkIGJlIHN1aXRhYmxlIHZhbHVlcyBmb3IgImF2ZXJhZ2UvdHlwaWNhbCIgcXVhbD8gKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IC02MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAtOTU7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKKworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTlJfV0VQX0tFWVM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICB7CisgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgfQorCisgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKyAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCisgKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCisgKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgorICoKKyAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgorICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KKyAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgorICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAorICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAorICogY2FuIGJlIGRvY3VtZW50ZWQuCisgKgorICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCisgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3sKKwlfX3U4IENoYW5uZWxRdWFsaXR5OworCisJLy8gTm9ybWFsaXplIFJzc2kKKwlpZiAocnNzaSA+PSAtNTApCisJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKyAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZQorCQlDaGFubmVsUXVhbGl0eSA9IDA7CisKKyAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCisgICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOworICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQorICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisgICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworfQorCitpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCXN0cnVjdCBzb2NrYWRkciBhZGRyW0lXX01BWF9BUF07CisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOworCWludCBpOworCisgICAJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworICAgICAgICAvL3JldHVybiAtRU5FVERPV047CisJfQorCisJZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQorCXsKKwkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQorCQkJYnJlYWs7CisJCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworCX0KKwlkYXRhLT5sZW5ndGggPSBpOworCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKKwlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLworCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DR0lXU0NBTgoraW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJVUxPTkcJCQkJCQkJCU5vdzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCXJldHVybiAwOworCWRveworCQlOb3cgPSBqaWZmaWVzOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQl7CisJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJfQorCisJCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQkvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCQlwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkwLAorCQkJTlVMTCk7CisKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfXdoaWxlKDApOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlpbnQgaT0wOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CisJY2hhciAqZW5kX2J1ZjsKKwljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKyNpZm5kZWYgSVdFVkdFTklFCisJY2hhciBpZHg7CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgeworCQkvKgorCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQorCXsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgaWYgKGRhdGEtPmxlbmd0aCA+IDApCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZWxzZQorICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKyAgICAgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKwkJLy9NQUMgYWRkcmVzcworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQkJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgRVRIX0FMRU4pOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VTU0lECisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL05ldHdvcmsgVHlwZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FVVE87CisJCX0KKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBJV19FVl9VSU5UX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQ2hhbm5lbCBhbmQgRnJlcXVlbmN5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWVsc2UKKwkJCWl3ZS51LmZyZXEubSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWl3ZS51LmZyZXEuaSA9IDA7CisKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisgICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcworICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKyAgICAJaXdlLnUucXVhbC5sZXZlbCA9IDA7CisgICAgCWl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgICAgICBzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworICAgIAljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0VuY3lwdGlvbiBrZXkKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKENBUF9JU19QUklWQUNZX09OIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbyApKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9SVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgICAgICBjdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vQml0IFJhdGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikKKyAgICAgICAgeworICAgICAgICAgICAgVUNIQVIgdG1wUmF0ZSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVbcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbi0xXTsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisgICAgCQljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworICAgICAgICAgICAgaWYgKHRtcFJhdGUgPT0gMHg4MikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMiAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICA1LjUgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDk2KQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMTEgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZQorICAgIAkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOworCisJCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJCWN1cnJlbnRfdmFsID0gSVdFX1NUUkVBTV9BRERfVkFMVUUoaW5mbywgY3VycmVudF9ldiwKKwkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKKyAgICAJCQlJV19FVl9QQVJBTV9MRU4pOworCisgICAgICAgIAlpZigoY3VycmVudF92YWwtY3VycmVudF9ldik+SVdfRVZfTENQX0xFTikKKyAgICAgICAgICAgIAljdXJyZW50X2V2ID0gY3VycmVudF92YWw7CisgICAgICAgIAllbHNlCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgSVdFVkdFTklFCisJCS8vV1BBIElFCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisJCXsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCS8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgICAgIAltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIC8vV1BBIElFCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJ3cGFfaWU9IiwgNyk7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAicnNuX2llPSIsIDcpOworCQkJZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCX0KKworCWRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAsKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsaSAsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yLCBkYXRhLT5sZW5ndGgpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+ZmxhZ3MpCisJeworCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisKKwkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVsc2UKKwl7CisJCS8vIEFOWSBzc2lkCisJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWRhdGEtPmZsYWdzID0gMTsKKyAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjaWZkZWYgUlQyODcwCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwllbHNlCisJey8vdGhlIEFOWSBzc2lkIHdhcyBzcGVjaWZpZWQKKwkJZGF0YS0+bGVuZ3RoICA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgbm90IGNvbm5lY3RlZCwgZXNzXG4iKSk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworaW50IHJ0X2lvY3RsX3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJdTE2IHZhbDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChydHMtPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlIGlmIChydHMtPnZhbHVlIDwgMCB8fCBydHMtPnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZQorCQl2YWwgPSBydHMtPnZhbHVlOworCisJaWYgKHZhbCAhPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkKKwkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSB2YWw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7CisJcnRzLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXUxNiB2YWw7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKGZyYWctPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xEIHx8IGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOyAvKiBldmVuIG51bWJlcnMgb25seSAqLworCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmcmFnLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisJZnJhZy0+ZGlzYWJsZWQgPSAoZnJhZy0+dmFsdWUgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKTsKKwlmcmFnLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfV0VQX0tFWV9TSVpFIDEzCisjZGVmaW5lIE1JTl9XRVBfS0VZX1NJWkUgNQoraW50IHJ0X2lvY3RsX3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisJZWxzZSBpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pKQorCXsKKwkgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisgICAgc3ByaW50ZihleHRyYSwgIlxuXG4iKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCSAgICAvL3NwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3Mgd2l0aG91dCByZXRyeSAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgLSAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisJfQorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgYWZ0ZXIgcmV0cnkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBmYWlsIHRvIFJjdiBBQ0sgYWZ0ZXIgcmV0cnkgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBTdWNjZXNzIFJjdiBDVFMgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJUUyBGYWlsIFJjdiBDVFMgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggd2l0aCBDUkMgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGRyb3AgZHVlIHRvIG91dCBvZiByZXNvdXJjZSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyKTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkdXBsaWNhdGUgZnJhbWUgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJGYWxzZSBDQ0EgKG9uZSBzZWNvbmQpICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCk7CisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwkJZWxzZQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJeworICAgIAlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZAlnZXRCYUluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE91dEJ1ZikKK3sKKwlJTlQgaSwgajsKKwlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OworCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7CisKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKKwkJeworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAorICAgICAgICAgICAgICAgIHBPdXRCdWYsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBwT3V0QnVmLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBwT3V0QnVmLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG5cbiIsIHBPdXRCdWYpOworCQl9CisgICAgICAgIGlmIChzdHJsZW4ocE91dEJ1ZikgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitzdGF0aWMgaW50CitydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIElOVAkJCQlTdGF0dXMgPSAwOworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlQT1NfQ09PS0lFCQlwT2JqOworICAgIHUzMiAgICAgICAgICAgICBzdWJjbWQgPSB3cnEtPmZsYWdzOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwkJcEFkID0gZGV2LT5wcml2OworCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZXh0cmEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdycS0+bGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisgICAgc3dpdGNoKHN1YmNtZCkKKyAgICB7CisKKyAgICAgICAgY2FzZSBTSE9XX0NPTk5fU1RBVFVTOgorICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDZW50cmFsQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2hhbm5lbCAlZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIGlmIChJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWQoQVA6ICVzWyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiU3NpZD0lcyAsU3NpZGxlbiA9ICVkXG4iLHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJZWxzZQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgc3ByaW50ZihleHRyYSwgIkRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIkNvbm5TdGF0dXMgaXMgbm90IGNvbm5lY3RlZFxuIikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgorICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKKwkJCXsKKwkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PRkY6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09OOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsKKyAgICAgICAgICAgIC8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT25cbiIpOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgU0hPV19ETFNfRU5UUllfSU5GTzoKKwkJCXsKKwkJCQlTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQljYXNlIFNIT1dfQ0ZHX1ZBTFVFOgorCQkJeworCQkJCVN0YXR1cyA9IFJUTVBTaG93Q2ZnVmFsdWUocEFkLCB3cnEtPnBvaW50ZXIsIGV4dHJhKTsKKwkJCQlpZiAoU3RhdHVzID09IDApCisJCQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0hPV19BREhPQ19FTlRSWV9JTkZPOgorCQkJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKHBBZCwgZXh0cmEpOworCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN1YmNtZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIFNJT0NTSVdNTE1FCitpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKKwkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7CisJCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KKyNpZmRlZiBJV19NTE1FX0RJU0FTU09DCisJCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorICAgICAgICAgICAgLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCQl7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJZGVmYXVsdDoKKyAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fRlVOQ1RJT05fXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWxnKSB7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBrZXlJZHgsIGV4dC0+a2V5X2xlbikpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmtleV9sZW4gPT0gMzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICAgICAgICAgIAkvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAJICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJZGVmYXVsdDoKKyAgICAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJUENIQVIgcEtleSA9IE5VTEw7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGlkeCwgbWF4X2tleV9sZW47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOworCisJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpCisJeworCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCisJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCWVsc2UKKwkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCisJZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKKwltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOworCisJZXh0LT5rZXlfbGVuID0gMDsKKwlzd2l0Y2gocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbjsKKwkJCQlwS2V5ID0gJihwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleVswXSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCQllbHNlCisJCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisKKwkJCWlmIChtYXhfa2V5X2xlbiA8IDMyKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMzI7CisJCQkJcEtleSA9ICZwQWQtPlN0YUNmZy5QTUtbMF07CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChleHQtPmtleV9sZW4gJiYgcEtleSkKKwl7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJbWVtY3B5KGV4dC0+a2V5LCBwS2V5LCBleHQtPmtleV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ1NJV0dFTklFCitpbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJaWYgKChwQWQtPlN0YUNmZy5SU05JRV9MZW4gPT0gMCkgfHwKKwkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwl7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKQorCQlyZXR1cm4gLUUyQklHOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCVVDSEFSIFJTTkllID0gSUVfV1BBOworCisJCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IChwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyKSkgLy8gSUQsIExlbgorCQkJcmV0dXJuIC1FMkJJRzsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKKwkJCVJTTkllID0gSUVfUlNOOworCisJCWV4dHJhWzBdID0gKGNoYXIpUlNOSWU7CisJCWV4dHJhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCQltZW1jcHkoZXh0cmErMiwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3Bta3NhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wbWtzYSAqcFBta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKXdycXUtPmRhdGEucG9pbnRlcjsKKwlJTlQJQ2FjaGVkSWR4ID0gMCwgaWR4ID0gMDsKKworCWlmIChwUG1rc2EgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX3Npd3Bta3NhXG4iKSk7CisJc3dpdGNoKHBQbWtzYS0+Y21kKQorCXsKKwkJY2FzZSBJV19QTUtTQV9GTFVTSDoKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9GTFVTSFxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfUkVNT1ZFOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJICAgICAgICB7CisJCSAgICAgICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTik7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSUQsIDE2KTsKKwkJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7IGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOyBpZHgrKykKKwkJCQkJeworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uQlNTSURbMF0sIE1BQ19BRERSX0xFTik7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5QTUtJRFswXSwgMTYpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07CisJCQkgICAgICAgIGJyZWFrOworCQkgICAgICAgIH0KKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX0FERDoKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCQkgICAgICAgIGJyZWFrOworCSAgICAgICAgfQorCisJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCSAgICAgICAgeworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJCSAgICAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkgICAgICAgIH0KKwkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkgICAgICAgIENhY2hlZElkeCA9IChwUG1rc2EtPmJzc2lkLnNhX2RhdGFbNV0gJSBQTUtJRF9OTyk7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkgICAgICAgIH0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyAjaWYgV0lSRUxFU1NfRVhUID4gMTcKKworI2lmZGVmIERCRworc3RhdGljIGludAorcnRfcHJpdmF0ZV9pb2N0bF9iYnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQorCQkJeworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZSA9IE5VTEw7CisJVUNIQVIJCQkJcmVnQkJQID0gMDsKKy8vCUNIQVIJCQkJYXJnWzI1NV09ezB9OworCVVJTlQzMgkJCQliYnBJZDsKKwlVSU5UMzIJCQkJYmJwVmFsdWU7CisJQk9PTEVBTgkJCQliSXNQcmludEFsbEJCUCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCisJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwlpZiAod3JxLT5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJCQkJeworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSB3cnEtPnBvaW50ZXI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lc1xuIiwgdGhpc19jaGFyKSk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lcywgdmFsdWU9JXNcbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwkJCWlmIChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworICAgIAkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKyAgICAJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQl9CisJZWxzZQorCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisKK25leHQ6CisJaWYgKGJJc1ByaW50QWxsQkJQKQorCXsKKwkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gMTM2OyBiYnBJZCsrKQorCQl7CisJCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAxMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKwkJCWlmIChiYnBJZCU1ID09IDQpCisJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiXG4iKTsKKwkJfQorCisgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKK2ludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKyAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisgICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorICAgICovCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworCQkvL0F1dG8gUmF0ZQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICB7CisgICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisgICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKyAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisgICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKKyAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKKyAgICBfX3MzMiByYWxpbmtyYXRlW10gPQorCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKKwkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCisJMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwkJCQkJCQkJCQkgIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCisKKyAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7CisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKKyAgICAgICAgKElORlJBX09OKHBBZCkpICYmCisgICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgZWxzZQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorICAgIHsKKy8vICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjE2KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICozMikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoyNCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqNDgpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKKyAgICBlbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKKworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisKKyAgICBpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCisgICAgICAgIHJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCisgICAgd3JxdS0+Yml0cmF0ZS52YWx1ZSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF0gKiA1MDAwMDA7CisgICAgd3JxdS0+Yml0cmF0ZS5kaXNhYmxlZCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfaGFuZGxlcltdID0KK3sKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25hbWUsCQkJLyogU0lPQ0dJV05BTUUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyZXEsCQkgICAgLyogU0lPQ1NJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkJICAgIC8qIFNJT0NHSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bW9kZSwJCSAgICAvKiBTSU9DU0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd21vZGUsCQkgICAgLyogU0lPQ0dJV01PREUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhbmdlLAkJICAgIC8qIFNJT0NHSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwgICAgICAgICAgICAvKiBTSU9DU0lXQVAgICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2FwLAkJICAgIC8qIFNJT0NHSVdBUCAgICAgKi8KKyNpZmRlZiBTSU9DU0lXTUxNRQorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkgICAgICAgIC8qIFNJT0NTSVdNTE1FICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV01MTUUgKi8KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCisjaWZkZWYgU0lPQ0dJV1NDQU4KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3c2NhbiwJCSAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3NjYW4sCQkgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXU0NBTiAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ0dJV1NDQU4gICAqLworI2VuZGlmIC8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2Vzc2lkLAkJICAgIC8qIFNJT0NTSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZXNzaWQsCQkgICAgLyogU0lPQ0dJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJCSAgICAvKiBTSU9DU0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd25pY2tuLAkJICAgIC8qIFNJT0NHSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdyYXRlLCAgICAgICAgICAvKiBTSU9DU0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3JhdGUsICAgICAgICAgIC8qIFNJT0NHSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cnRzLAkJICAgIC8qIFNJT0NTSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cnRzLAkJICAgIC8qIFNJT0NHSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJCSAgICAvKiBTSU9DU0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyYWcsCQkgICAgLyogU0lPQ0dJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X3ByaXZfaGFuZGxlcnNbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAwICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMSAqLworI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zZXRwYXJhbSwgLyogKyAweDAyICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDIgKi8KKyNlbmRpZiAvLyBDT05GSUdfQVBfU1VQUE9SVCAvLworI2lmZGVmIERCRworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2lvY3RsX2JicCwgLyogKyAweDAzICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDMgKi8KKyNlbmRpZgorCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA4ICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIC8qICsgMHgwOSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEEgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBCICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTAgKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9zaG93LCAvKiArIDB4MTEgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEyICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxOCAqLworfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZiA9Cit7CisjZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQorCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIHJ0X3ByaXZfaGFuZGxlcnMsCisJLm51bV9wcml2YXRlCQk9IE4ocnRfcHJpdl9oYW5kbGVycyksCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXZ0YWIsCisJLm51bV9wcml2YXRlX2FyZ3MJPSBOKHByaXZ0YWIpLAorI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3CisgICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisjZW5kaWYKK307CisKK0lOVCBSVE1QU2V0SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIEJzc2lkOworICAgIFJUXzgwMl8xMV9QSFlfTU9ERSAgICAgICAgICAgICAgICAgIFBoeU1vZGU7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgU3RhQ29uZmlnOworICAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtYmxlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU1heDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBQTkRJU184MDJfMTFfS0VZICAgICAgICAgICAgICAgICAgICBwS2V5ID0gTlVMTDsKKyAgICBQTkRJU184MDJfMTFfV0VQCQkJICAgICAgICBwV2VwS2V5ID1OVUxMOworICAgIFBORElTXzgwMl8xMV9SRU1PVkVfS0VZICAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBOVUxMOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZywgKnBDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldFR5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm93OworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IDA7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUywgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJUZW1wOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU9JRF9TRVRfSFRfUEhZTU9ERQkJCQkJSFRfUGh5TW9kZTsJLy8xMW4gLGthdGh5CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIFBORElTXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgIHBQbWtJZCA9IE5VTEw7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4U3RhdGUgPSBGQUxTRTsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2VuYWJsZSA9IDA7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJY3RtcDsKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+UlRNUFNldEluZm9ybWF0aW9uKCksCTB4JTA4eFxuIiwgY21kJjB4N0ZGRikpOworICAgIHN3aXRjaChjbWQgJiAweDdGRkYpIHsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA8IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkJCS8vIE9ubHkgYXZhbGlhYmxlIHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWluZworICAgICAgICAgICAgZWxzZSBpZiAoIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxPTkcgICBDb3VudHJ5OworICAgICAgICAgICAgICAgIFVDSEFSCVRtcFBoeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikoQ291bnRyeSAmIDB4MDAwMDAwRkYpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCQkJCS8vIEJ1aWxkIGFsbCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwKKwkJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKyAjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBOb3cgPSBqaWZmaWVzOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgVHhDbnQgPSAlZCBcbiIsIHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7CisKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJCWJyZWFrOworCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID4gMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworICAgICAgICAgICAgUlRNUF9TRVRfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJUENIQVIgcFNzaWRTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmIChTc2lkLlNzaWRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpOworICAgICAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJeworCSAgICAgICAgICAgICAgICAJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJCQlpZiAocFNzaWRTdHJpbmcpCisJCQkJCQl7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKTsKKwkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCisJCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gIT0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QSFlfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBoeU1vZGUgPD0gTWF4UGh5TW9kZSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCX0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lZClcbiIsIFBoeU1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IFN0YUNvbmZpZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQorICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCisJCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VJYnNzQmVhY29uKHBBZGFwdGVyKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZGFwdGVyKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFU0lSRURfUkFURVMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUFJFQU1CTEUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQcmVhbWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKKyAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIAlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBBdXRoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAoPSVkKSBcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExTW9uaXRvcikKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzICA9IC1FSU5WQUw7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKKworCQkJCWlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKwkJCQkJaWYgKEtleUlkeCA+PSA0KXsKKwkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKyNpZmRlZiBSVDI4NzAKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGUJPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZU90aGVyPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCA9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dFJlcSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luUmVxPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworI2VuZGlmIC8vIFJUMjg3MCAvLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTIFxuIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUnRzVGhyZXNoID4gTUFYX1JUU19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEICg9JWxkKVxuIixSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKD0lbGQpIFxuIixGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9QT1dFUl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlck1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJDQU0iKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1ApCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIk1heF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJGYXN0X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTGVnYWN5X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFICg9JWQpXG4iLFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIDwgc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlclRlbXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBvd2VyVGVtcCA+IDEwMCkKKwkJCQkJUG93ZXJUZW1wID0gMHhmZmZmZmZmZjsgIC8vIEFVVE8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gUG93ZXJUZW1wOyAvL2tlZXAgY3VycmVudCBzZXR0aW5nLgorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCX0KKwkgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfVFlQRSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTmV0VHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFEUykKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUIpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUJHX01JWEVEKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKKwkJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBIWV8xMUEpOworCQkJCWVsc2UKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRSAoPSVkKVxuIixOZXRUeXBlKSk7CisJCSAgICB9CisJCQlicmVhazsKKyAgICAgICAgLy8gRm9yIFdQQSBQU0sgUE1LIGtleQorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQUREX1dQQToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhIFtBdXRoTW9kZSAhPSBXUEFQU0svV1BBMlBTSy9XUEFOT05FXVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSApICAgICAvLyBPbmx5IGZvciBXUEEgUFNLIG1vZGUKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBSYUNvbmZpZyBhcyBQU0sgYWdlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX0tFWToKKyAgICAgICAgICAgIHBSZW1vdmVLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocFJlbW92ZUtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBSZW1vdmVLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocFJlbW92ZUtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVE1QV1BBUmVtb3ZlS2V5UHJvYyhwQWRhcHRlciwgcFJlbW92ZUtleSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBSZW1vdmUgV1BBIEtleSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IHBSZW1vdmVLZXktPktleUluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkpXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKEtleUlkWyVkXSBvdXQgb2YgcmFuZ2UpXG4iLCBLZXlJZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwUmVtb3ZlS2V5LT5LZXlJbmRleCwgcFJlbW92ZUtleS0+TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICBjYXNlIE9JRF84MDJfMTFfQUREX0tFWToKKyAgICAgICAgICAgIHBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUEFkZEtleShwQWRhcHRlciwgcEtleSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBDb25maWcgPSAmQ29uZmlnOworCisgICAgICAgICAgICAgICAgaWYgKChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPj0gMjApICYmIChwQ29uZmlnLT5CZWFjb25QZXJpb2QgPD00MDApKQorICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBwQ29uZmlnLT5CZWFjb25QZXJpb2Q7CisKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoVVNIT1JUKSBwQ29uZmlnLT5BVElNV2luZG93OworICAgICAgICAgICAgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChwQ29uZmlnLT5EU0NvbmZpZywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNhdmUgdGhlIGNoYW5uZWwgb24gTWxtZUF1eCBmb3IgQ250bE9pZFJUQnNzaWRQcm9jIHVzZWQuCisJCQkJLy8KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5DaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04gKEJlYWNuUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2g9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5CZWFjb25QZXJpb2QsIHBDb25maWctPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJICAgIFBPSURfU0VUX0hUX1BIWU1PREUJcEhUUGh5TW9kZSA9ICZIVF9QaHlNb2RlOworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkhUX1BoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpwSFRQaHlNb2RlCShQaHlNb2RlID0gJWQsVHJhbnNtaXRObyA9ICVkLCBIdE1vZGUgPQklZCwJRXh0T2Zmc2V0ID0JJWQgLCBNQ1MgPSAlZCwgQlcgPQklZCwJU1RCQyA9ICVkLCBTSE9SVEdJID0gJWQpIFxuIiwKKwkJCQlwSFRQaHlNb2RlLT5QaHlNb2RlLCBwSFRQaHlNb2RlLT5UcmFuc21pdE5vLHBIVFBoeU1vZGUtPkh0TW9kZSxwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywJcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUJPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCQkJUlRNUFNldEhUKHBBZGFwdGVyLAlwSFRQaHlNb2RlKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERShNQ1M9JWQsQlc9JWQsU0dJPSVkLFNUQkM9JWQpXG4iLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuQlcsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0ksCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQykpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUxPTkcgYXBzZCA7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFwc2QsIHdycS0+dS5kYXRhLnBvaW50ZXIsCXdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8QjMxfkI3CXwJQjZ+QjUJIHwJIEI0CSB8CSBCMwkgfAlCMgkgfAlCMQkgfAkgICBCMAkJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXwgUnN2ZAl8IE1heCBTUCBMZW4gfCBBQ19WTyB8IEFDX1ZJIHwgQUNfQksgfCBBQ19CRSB8IEFQU0QJQ2FwYWJsZQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSA9IChhcHNkICYgMHgwMDAwMDAwMSkgPyBUUlVFIDoJRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gKChhcHNkCSYgMHgwMDAwMDAwMikgPj4gMSkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gKChhcHNkCSYgMHgwMDAwMDAwNCkgPj4gMikJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gKChhcHNkCSYgMHgwMDAwMDAwOCkgPj4gMykJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gKChhcHNkCSYgMHgwMDAwMDAxMCkgPj4gNCkJPyBUUlVFIDogRkFMU0U7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aAk9IChVQ0hBUikoKGFwc2QJJiAweDAwMDAwMDYwKSA+PiA1KTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HIChhcHNkPTB4JWx4LCBBUFNEQ2FwPSVkLCBbQkUsQkssVkksVk9dPVslZC8lZC8lZC8lZF0sCU1heFNQTGVuPSVkKVxuIiwgYXBzZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUsCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkksCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTywJcEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCS8vIERyaXZlciBuZWVkcwl0byBub3RpZnkgQVAgd2hlbiBQU00gY2hhbmdlcworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZQkhPSBwQWRhcHRlci0+U3RhQ2ZnLlBzbSkKKwkJCQl7CisJCQkJCU1sbWVTZXRQc21CaXQocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSk7CisJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZSwJVFJVRSk7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00gKGJBUFNERm9yY2VQb3dlclNhdmU6JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMUzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCUJPT0xFQU4Jb2xkdmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChvbGR2YWx1ZSAmJgkhcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJCQl7CisJCQkJCWludAlpOworCQkJCQkvLyB0ZWFyCWRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQkJCWZvcgkoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIHRlYXIJZG93biBwZWVyIGRscyB0YWJsZQllbnRyeQorCQkJCQlmb3IJKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMUyAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihSVF84MDJfMTFfRExTX1VJKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVJUXzgwMl8xMV9ETFMJRGxzOworCisJCQkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwkJCQlSVE1QTW92ZU1lbW9yeSgmRGxzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJCQkJJkRscyk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSBcbiIpKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX1dNTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9XTU0gKD0lZCkJXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJLy8KKwkJCS8vIFNldCBOZGlzUmFkaW9TdGF0ZU9mZiB0bwlUUlVFLCBpbnN0ZWFkIG9mIGNhbGxlZAlNbG1lUmFkaW9PZmYuCisJCQkvLyBMYXRlciBvbiwgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWC0+TnVtYmVyT2ZJdGVtcyBzaG91bGQgYmUJMAorCQkJLy8gd2hlbglxdWVyeSBPSURfODAyXzExX0JTU0lEX0xJU1QuCisJCQkvLworCQkJLy8gVFJVRTogIE51bWJlck9mSXRlbXMJd2lsbCBzZXQgdG8JMC4KKwkJCS8vIEZBTFNFOiBOdW1iZXJPZkl0ZW1zCW5vIGNoYW5nZS4KKwkJCS8vCisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0JVFJVRTsKKwkJCS8vIFNldCB0byBpbW1lZGlhdGVseSBzZW5kIHRoZSBtZWRpYSBkaXNjb25uZWN0CWV2ZW50CisJCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcwk9IFRSVUU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRElTQVNTT0NJQVRFCVxuIikpOworCisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0JQ05UTF9JRExFKQorCQkJCXsKKwkJCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FCWJ1c3ksIHJlc2V0CU1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJCQl9CisKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFLAorCQkJCQkwLAorCQkJCQlOVUxMKTsKKworCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQJPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUDoKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQkFDQVBfU1RSVUMpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCU9JRF9CQUNBUF9TVFJVQyBPcmRlIDsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk9yZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCWlmIChPcmRlLlBvbGljeSA+IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKE9yZGUuUG9saWN5ID09IEJBX05PVFVTRSkKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gQkFfTk9UVVNFOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9Qcz0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gT3JkZS5BdXRvQkE7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsgLy8gd2Ugb25seSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKworCQkJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA+IE1BWF9SWF9SRU9SREVSQlVGKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IE1BWF9SWF9SRU9SREVSQlVGOworCisJCQkJCX0KKworCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooT3JkZS5BdXRvQkEgPSAlZCkgKFBvbGljeT0lZCkoUmVCQVdpbkxpbWl0PSVkKShUeEJBV2luTGltaXQ9JWQpKEF1dG9Nb2RlPSVkKVxuIixPcmRlLkF1dG9CQSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5LAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0LHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE1pbW9QcyA9ICVkKShBbXNkdUVuYWJsZSA9ICVkKSAoQW1zZHVTaXplPSVkKShNcGR1RGVuc2l0eT0lZClcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkpKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFNldCA6OiBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJVUNIQVIJCSAgICAgICAgaW5kZXg7CisJCQkJT0lEX0FERF9CQV9FTlRSWSAgICBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKEJBLlRJRCA+IDE1KQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkKKwkJCQkJLy9BcyBhZC1ob2MgbW9kZSwgQkEgcGFpciBpcyBub3QgbGltaXRlZCB0byBvbmx5IEJTU0lELiBzbyBhZGQgdmlhIE9JRC4KKwkJCQkJaW5kZXggPSBCQS5USUQ7CisJCQkJCS8vIGluIGFkIGhvYyBtb2RlLCB3aGVuIGFkZGluZyBCQSBwYWlyLCB3ZSBzaG91bGQgaW5zZXJ0IHRoaXMgZW50cnkgaW50byBNQUNFbnRyeSB0b28KKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIEJBLk1BQ0FkZHIpOworCQkJCQlpZiAoIXBFbnRyeSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gYnJlYWsgb24gbm8gY29ubmVjdGlvbi4tLS0tOiV4OiV4XG4iLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoQkEuSXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJICAgIGlmIChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IFRSVUUpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gMHgxMDsKKworCQkJCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkYXB0ZXIsIHBFbnRyeSwgaW5kZXgsIDAsIDEwMCwgVFJVRSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeShwQWRhcHRlciwgcEVudHJ5LT5BaWQsIEJBLk1BQ0FkZHIsIDAsIDB4ZmZmZiwgQkEuVElELCBCQS5uTVNEVSwgQkEuSXNSZWNpcGllbnQpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBSZWMgPSAlZC4gTWFjID0gJXg6JXg6JXg6JXg6JXg6JXggLiBcbiIsCisJCQkJCQlCQS5Jc1JlY2lwaWVudCwgQkEuTUFDQWRkclswXSwgQkEuTUFDQWRkclsxXSwgQkEuTUFDQWRkclsyXSwgQkEuTUFDQWRkclsyXQorCQkJCQkJLCBCQS5NQUNBZGRyWzRdLCBCQS5NQUNBZGRyWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVBPSURfQUREX0JBX0VOVFJZCXBCQTsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCQkJCXBCQSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCQlpZiAocEJBID09IE5VTEwpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEga21hbGxvYygpIGNhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIpKTsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEoVElEPSVkLCBiQWxsVGlkPSVkKVxuIiwgcEJBLT5USUQsIHBCQS0+YkFsbFRpZCkpOworCisJCQkJCWlmICghcEJBLT5iQWxsVGlkICYmIChwQkEtPlRJRCA+IE5VTV9PRl9USUQpKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPklzUmVjaXBpZW50ID09IEZBTFNFXG4iKSk7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwQkEtPnBFbnRyeVxuIikpOworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZGFwdGVyLCBwRW50cnktPkFpZCwgcEJBLT5USUQsIEZBTFNFLCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlCQVJlY1Nlc3Npb25UZWFyRG93biggcEFkYXB0ZXIsIChVQ0hBUilwRW50cnktPkFpZCwgcEJBLT5USUQsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWtmcmVlKHBCQSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyAgICAgICAgLy8gRm9yIFdQQV9TVVBQTElDQU5UIHRvIHNldCBzdGF0aWMgd2VwIGtleQorICAgIAljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKKyAgICAJICAgIHBXZXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgCSAgICBpZihwV2VwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBXZXBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKGxlbmd0aCBtaXNtYXRjaCkhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkgICAgICAgIEtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAvLyBLZXlJZHggbXVzdCBiZSAwIH4gMworICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiA0KQorICAgIAkJCXsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQgKEtleUlkeCBtdXN0IGJlIHNtYWxsZXIgdGhhbiA0KSEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVDSEFSIENpcGhlckFsZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBLZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChwV2VwS2V5LT5LZXlMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBvbmx5IHN1cHBvcnQgQ0lQSEVSX1dFUDY0KGxlbjo1KSAmIENJUEhFUl9XRVAxMjgobGVuOjEzKSEhXG4iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQgPSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKyAgICAJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gIlBvcnQgU2VjdXJlZCI6IlBvcnQgTk9UIFNlY3VyZWQiKSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFdlcEtleSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGNhc2UgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPyAiVFJVRSI6IkZBTFNFIikpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJndwYV9zdXBwbGljYW50X2VuYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAJCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IHdwYV9zdXBwbGljYW50X2VuYWJsZTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgICpwSW5mbzsKKwkJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworICAgICAgICAgICAgICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKikgTXNnRWxlbS0+TXNnOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBJbmZvLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkYXB0ZXIsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCisgICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisJCQkJcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwkJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgKCVkKVxuIiwgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMpKTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE1LSUQ6CisJICAgICAgICBwUG1rSWQgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJICAgICAgICBpZihwUG1rSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUG1rSWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkgICAgICAgIC8vIGNoZWNrIHRoZSBQTUtJRCBpbmZvcm1hdGlvbgorCSAgICAgICAgaWYgKHBQbWtJZC0+QlNTSURJbmZvQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87CisJCSAgICAgICAgVUlOVAkJQnNzSWR4OworCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKKworCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCisJCSAgICAgICAgeworCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQorCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCisJCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpKQorCQkJCQkgICAgICAgIGJyZWFrOworCQkJICAgICAgICB9CisKKwkJCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkJCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCQkJICAgICAgICBlbHNlCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIH0KKwkJICAgICAgICB9CisJCQl9CisJCQlpZihwUG1rSWQpCisJCQkJa2ZyZWUocFBta0lkKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKKwkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJLy9wS2V5ID0gJldlcEtleTsKKworCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorCQkJeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKKwkJCX0KKwkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKworCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQlpZiAoS2V5SWR4ID4gNCkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJCX0KKwkJCQkvL1Jlc3RhcnRBUElzUmVxdWlyZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXNwcmludGYoJmN0bXAsIiVkIiwgY3RtcCk7CisJCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWRhcHRlciwgJmN0bXApOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOworICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOworICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisJVUNIQVIJZHJpdmVyVmVyc2lvbls4XTsKKyAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJLy9mb3Igc25tcCwga2F0aHkKKwlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOworCUlOVAkJCQkJCQl2YWx1ZUxlbjsKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQl0bXBbNjRdOworI2VuZGlmIC8vU05NUAorCisgICAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFNUQV9OSUNfREVWSUNFX05BTUUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFNUQV9OSUNfREVWSUNFX05BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihVQ0hBUik7CisJCQlzcHJpbnRmKCZkcml2ZXJWZXJzaW9uWzBdLCAiJXMiLCBTVEFfRFJJVkVSX1ZFUlNJT04pOworCQkJZHJpdmVyVmVyc2lvbls3XSA9ICdcMCc7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkcml2ZXJWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCWNhc2UgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQzMik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkvKgorICAgICAgICAgICAgCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisgICAgICAgICAgICAJICovCisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoU3RpbGwgc2Nhbm5pbmcpXG4iKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUICglZCBCU1MgcmV0dXJuZWQpXG4iLHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKSk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAorICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsaWduIHBvaW50ZXIgdG8gNCBieXRlcyBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAvL1BhZGRpbmcgPSA0IC0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAvL2lmIChQYWRkaW5nID09IDQpCisgICAgICAgICAgICAgICAgLy8gICAgUGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgorICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7CisgICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOworICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAorICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCisgICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKKyAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzID0gKFBORElTX1dMQU5fQlNTSURfRVgpIHBQdHI7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBCc3MtPk1hY0FkZHJlc3MsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPT0gRkFMU0UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKwkJCQkJLy8gV2UgbXVzdCByZXR1cm4gdGhpcyBTU0lEIGR1cmluZyA0d2F5IGhhbmRzaGFraW5nLCBvdGhlcndpc2UgQWVnaXMgd2lsbCBmYWlsZWQgdG8gcGFyc2UgV1BBIGluZm9tYXRpb24KKwkJCQkJLy8gYW5kIHRoZW4gZmFpbGVkIHRvIHNlbmQgRUFQT2wgZmFyYW1lLgorCQkJCQkvLworCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJCXsKKwkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQkJCQl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Qcml2YWN5OworICAgICAgICAgICAgICAgIHBCc3MtPlJzc2kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKKworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsLCBwQnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7CisKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgKz0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZW5kaWYKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOworICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSUQoPUVNUFRZKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworCQkJTmRpc1plcm9NZW1vcnkoU3NpZC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKKyAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGVdOyAgIC8vIHVuaXQgOiA1MDAga2JwcworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DaGFubmVsUXVhbGl0eSA9IHBBZGFwdGVyLT5NbG1lLkNoYW5uZWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisgICAgICAgIAkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcExpbmtTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHBDb25maWd1cmF0aW9uID0gKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+TGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbjsKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBwQ29uZmlndXJhdGlvbi0+RFNDb25maWcpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENvbmZpZ3VyYXRpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihCZWFjb25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaGFubmVsPSVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCwgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgorCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMCgweD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCSAgICBTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMToKKwkJCWlmICgocEFkYXB0ZXItPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMSgweD0lbHgpXG4iLHVsSW5mbykpOworCQkJfQorCQkJZWxzZQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKKwkJCXVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSV8yOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAorICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA8IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisjaWZkZWYgREJHCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlczsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHVyYm9SYXRlID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VCR1Byb3RlY3Rpb24gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKKyAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkh3UmFkaW9TdGF0dXMgPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkYXB0ZXItPlN5c3RlbUVycm9yQml0bWFwOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUnRzVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCg9JWxkKVxuIiwgUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgRnJhZ1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCisgICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFBvd2VyTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1BPV0VSX01PREUoPSVkKVxuIiwgUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgUmFkaW9TdGF0ZSA9IChCT09MRUFOKSBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEF1dGhNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQXV0aE1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKD0lZClcbiIsIEF1dGhNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlcikpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgorCQkJaWYgKChwQWRhcHRlci0+UmZJY1R5cGUJPT0gUkZJQ18yODUwKSB8fCAocEFkYXB0ZXItPlJmSWNUeXBlID09CVJGSUNfMjc1MCkpCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMzsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAzCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkJTmV0d29ya1R5cGVMaXN0WzNdID0gTmRpczgwMl8xMU9GRE01OyAgIC8vIE5ldHdvcmtUeXBlWzNdID0gMTFhCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAyCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRFxuIikpOworCQkJCWJyZWFrOworCSAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OworCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTI0OworCQkJZWxzZQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFEUzsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RSeFJhdGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKKwkJCS8vdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0VHhSYXRlOworCQkJdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUgKD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwgKD0lZClcbiIsIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSkpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWRhcHRlci0+RXh0cmFJbmZvKSk7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UKTsKKwkgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJndlX3ZlcnNpb25fY29tcGlsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORzoKKwkJCWFwc2QgPSAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA8PCAyKQorCQkJCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCA8PCA1KSk7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmFwc2QsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcgKD0weCVseCxBUFNEQ2FwPSVkLEFDX0JFPSVkLEFDX0JLPSVkLEFDX1ZJPSVkLEFDX1ZPPSVkLE1BWFNQTGVuPSVkKVxuIiwKKwkJCQlhcHNkLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gKD0lZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCWJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKKyAgICAJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgIAkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkYXB0ZXItPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCisgICAgCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworICAgICAgICAgICAgdWxJbmZvID0gKHVsSW5mbyA8PCA4KXwocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQ6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgICAgICAgICAgaSA9IDA7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisgICAgICAgICAgICBpID0gMTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmksIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUKD0lZCkgXG4iLCBpKSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKKwkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLlBzbSA9PSBQU01QX0FDVElPTikKKwkJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHBvd2VyIGFjdGl2ZSBlbHNlIDIgaXMgcG93ZXIgc2F2ZS4KKwkJCWVsc2UKKwkJCQl1bEluZm8gPSAyOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSBcbiIpKTsKKwkJCS8vS2V5SWR4VmFsdWUuS2V5SWR4ID0gcEFkLT5Qb3J0Q2ZnLk1CU1NJRFtwQWQtPklvY3RsSUZdLkRlZmF1bHRLZXlJZDsKKwkJCXBLZXlJZHhWYWx1ZSA9IHdycS0+dS5kYXRhLnBvaW50ZXI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIktleUlkeFZhbHVlLktleUlkeCA9ICVkLCBcbiIscEtleUlkeFZhbHVlLT5LZXlJZHgpKTsKKwkJCXZhbHVlTGVuID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKKwkJCQkJCSAgICZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgICB2YWx1ZUxlbik7CisJCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKKworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5WzBdKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCQkJCSZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlMb25nUmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1JldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0PSVkXG4iLCBMb25nUmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJPRFVDVElEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJPRFVDVElEIFxuIikpOworCisjaWZkZWYgUlQyODcwCisJCQlzcHJpbnRmKHRtcCwgIiUwNHggJTA0eFxuIiwgKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAsKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4odG1wKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisjZW5kaWYgLy9TTk1QX1NVUFBPUlQKKworCQljYXNlIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWDoKKwkJCXsKKwkJCQlVQ0hBUiB2YWx1ZTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYIFxuIikpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDE7CisjZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3Qgc3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ2YWx1ZSwgMSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVDoKKwkJCXsKKwkJCQlQUlRfQ0hBTk5FTF9MSVNUX0lORk8gcENoTGlzdEJ1ZjsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSF9MSVNUIFxuIikpOworCQkJCWlmIChwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENoTGlzdEJ1Ziwgc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKworCQkJCWlmIChwQ2hMaXN0QnVmKQorCQkJCQlrZnJlZShwQ2hMaXN0QnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06CisJCQl7CisJCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQl9CisKKwkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOworCisJCQkJaWYgKHBEbHNJbmZvKQorCQkJCQlrZnJlZShwRGxzSW5mbyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVBPU19DT09LSUUJCQlwT2JqOworCVZJUlRVQUxfQURBUFRFUgkJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVVNIT1JUCQkJCXN1YmNtZDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPnByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJICAgIHsKKwkJICAgIHJldHVybiBTdGF0dXM7CisJICAgIH0KKworCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJICAgIHJldHVybiAtRU5FVERPV047CisgICAgICAgIH0KKyAgICB9CisKKwl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCXN3aXRjaChjbWQpCisJeworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6CisJCQl7CisJCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgeworICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07CisgICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQJKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCisJCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9naXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV01PREU6ICAgLy9nZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKKwkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOworCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKKwkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKKwkJCQkJYnJlYWs7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKKwkJCQlicmVhazsKKwkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgorCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7CisJCSAgICBicmVhazsKKyNpZmRlZiBEQkcKKwkJY2FzZSBSVFBSSVZfSU9DVExfTUFDOgorCQkJUlRNUElvY3RsTUFDKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9FMlA6CisJCQlSVE1QSW9jdGxFMlBST00ocEFkLCB3cnEpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gREJHIC8vCisgICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCX0KKworICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBTU0lECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKyAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAorICAgICAgICB7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOworCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQl9CisgICAgICAgIHBTc2lkID0gJlNzaWQ7CisKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKworICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKKworICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisKKyAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JYldtbUNhcGFibGU7CisKKwliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGJXbW1DYXBhYmxlID09IDEpCisjaWZkZWYgUlQyODcwCisJCSYmIChwQWQtPk51bWJlck9mUGlwZXMgPj0gNSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUlOVDMyCVZhbHVlID0gMDsKKworICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCisgICAgeworCQlVQ0hBUgliYnBWYWx1ZSA9IDA7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7CisJCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKKwkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQorICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKyAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBlbHNlCisgICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gMjBNSHoKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCX0KKwkJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOworCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCisJCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJLy9WYWx1ZSB8PSAoMHg4MCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJLy8gZGlzYWJsZSBzeW5jCisJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOworICAgIH0KKworICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcGF1dG8iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJPUEVOIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJvcGVuIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJzaGFyZWQiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhcHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFub25lIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMnBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OworCisgICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKyAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV1BBIFBTSyBrZXkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisKKyAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKKworICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7CisKKyAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCisgICAgeworICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworICAgIH0KKworCisKKyAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCisgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIHsKKyAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgIHsKKyAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAorCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKyAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXcGFTdXBwb3J0IGZsYWcuCisgICAgVmFsdWU6CisgICAgICAgIDA6IERyaXZlciBpZ25vcmUgd3BhX3N1cHBsaWNhbnQuCisgICAgICAgIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uLgorICAgICAgICAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycy4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisgICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVUxPTkcJCQkJbWFjQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVSU5UMzIJCQkJbWFjVmFsdWUgPSAwOworCUlOVAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCSAgICB0aGlzX2NoYXIgPSBhcmc7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIE1hYyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzgtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgOCkKKwkJCQl0ZW1wMls3LWsrK109JzAnOworCQkJdGVtcDJbOF09J1wwJzsKKworCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJCUF0b0godGVtcDIsIHRlbXAsIDQpOworCQkJCW1hY1ZhbHVlID0gKnRlbXAqMjU2KjI1NioyNTYgKyB0ZW1wWzFdKjI1NioyNTYgKyB0ZW1wWzJdKjI1NiArIHRlbXBbM107CisKKwkJCQkvLyBkZWJ1ZyBtb2RlCisJCQkJaWYgKG1hY0FkZHIgPT0gKEhXX0RFQlVHX1NFVFRJTkdfQkFTRSArIDQpKQorCQkJCXsKKwkJCQkJLy8gMHgyYmY0OiBieXRlMCBub24temVybzogZW5hYmxlIFIxNyB0dW5pbmcsIDA6IGRpc2FibGUgUjE3IHR1bmluZworICAgICAgICAgICAgICAgICAgICBpZiAobWFjVmFsdWUgJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9uIFIxNyB0dW5pbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIFI2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgUjY2ID0gMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcik7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvZmYgUjE3IHR1bmluZywgcmVzdG9yZSB0byAweCUwMnhcbiIsIFI2NikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSUwMmx4LCBNYWNWYWx1ZT0weCV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJfQorCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQorICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAgICAgIAk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxFMlBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVU0hPUlQJCQkJZWVwQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVU0hPUlQJCQkJZWVwVmFsdWU7CisJaW50CQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IGFyZzsKKworCisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gRTJQUk9NIGFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls0LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGVtcDJbMy1rKytdPScwJzsKKwkJCXRlbXAyWzRdPSdcMCc7CisKKwkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlBdG9IKHRlbXAyLCB0ZW1wLCAyKTsKKwkJCWVlcFZhbHVlID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwMlhdOiUwMlggICIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bEUyUFJPTVxuIikpOworfQorI2VuZGlmIC8vIERCRyAvLworCisKKworCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCVNob3J0UmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKQoreworCUlOVCBpOworCisJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzcHJpbnRmKGV4dHJhLCAiJXNIVCBPcGVyYXRpbmcgTW9kZSA6ICVkXG4iLCBleHRyYSwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXNwcmludGYoZXh0cmEsICIlc1xuJS0xOXMlLTRzJS00cyUtN3MlLTdzJS03cyUtMTBzJS02cyUtNnMlLTZzJS02c1xuIiwgZXh0cmEsCisJCQkiTUFDIiwgIkFJRCIsICJCU1MiLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCWlmIChzdHJsZW4oZXh0cmEpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorCQkgICAgYnJlYWs7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJc3ByaW50ZihleHRyYSwgIiVzJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsIGV4dHJhLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMHMiLCBleHRyYSwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZzIiwgZXh0cmEsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBkLCAlZCwgJWQlJVxuIiwgZXh0cmEsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJc3ByaW50ZihleHRyYSwgIiVzXG4iLCBleHRyYSk7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC93cGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTM0YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC93cGEuaApAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworKi8KKworI2lmbmRlZglfX1dQQV9IX18KKyNkZWZpbmUJX19XUEFfSF9fCisKKy8vIEVBUE9MIEtleSBkZXNjcmlwdGVyIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aAorI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgorI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lECQkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX1JFUExBWQkJCTgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX01JQwkJCTE2CisKKy8vIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuCisvLyBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzgKKyNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUpCisKKy8vIEVBUCBDb2RlIFR5cGUuCisjZGVmaW5lIEVBUF9DT0RFX1JFUVVFU1QJMQorI2RlZmluZSBFQVBfQ09ERV9SRVNQT05TRQkyCisjZGVmaW5lIEVBUF9DT0RFX1NVQ0NFU1MgICAgMworI2RlZmluZSBFQVBfQ09ERV9GQUlMVVJFICAgIDQKKworLy8gRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbgorI2RlZmluZQlFQVBPTF9WRVIJCQkJCTEKKyNkZWZpbmUJRUFQT0xfVkVSMgkJCQkJMgorCisvLyBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlCisjZGVmaW5lCVdQQTFfS0VZX0RFU0MJCQkJMHhmZQorI2RlZmluZSBXUEEyX0tFWV9ERVNDICAgICAgICAgICAgICAgMHgwMgorCisvLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbgorI2RlZmluZQlERVNDX1RZUEVfVEtJUAkJCQkxCisjZGVmaW5lCURFU0NfVFlQRV9BRVMJCQkJMgorI2RlZmluZSBERVNDX1RZUEVfTUVTSAkJCQkzCisKKyNkZWZpbmUgTEVOX01TRzFfMldBWSAgICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgTUFYX0xFTl9PRl9FQVBfSFMgICAgICAgICAgIDI1NgorCisjZGVmaW5lIExFTl9NQVNURVJfS0VZCQkJCTMyCisKKy8vIEVBUE9MIEVLLCBNSworI2RlZmluZSBMRU5fRUFQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fRUFQX01JQ0sJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9LRVkJCQkJCSgoTEVOX0VBUF9FSykrKExFTl9FQVBfTUlDSykpCisvLyBUS0lQIGtleSByZWxhdGVkCisjZGVmaW5lIExFTl9QTUtJRAkJCQkJMTYKKyNkZWZpbmUgTEVOX1RLSVBfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX1JYTUlDSwkJCQk4CisjZGVmaW5lIExFTl9US0lQX1RYTUlDSwkJCQk4CisjZGVmaW5lIExFTl9BRVNfRUsJCQkJCTE2CisjZGVmaW5lIExFTl9BRVNfS0VZCQkJCQlMRU5fQUVTX0VLCisjZGVmaW5lIExFTl9US0lQX0tFWQkJCQkoKExFTl9US0lQX0VLKSsoTEVOX1RLSVBfUlhNSUNLKSsoTEVOX1RLSVBfVFhNSUNLKSkKKyNkZWZpbmUgVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUCQkoKExFTl9FQVBfS0VZKSsoTEVOX1RLSVBfRUspKQorI2RlZmluZSBUS0lQX0FQX1JYTUlDS19PRkZTRVQJCShUS0lQX0FQX1RYTUlDS19PRkZTRVQrTEVOX1RLSVBfVFhNSUNLKQorI2RlZmluZSBUS0lQX0dUS19MRU5HVEgJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIExFTl9QVEsJCQkJCQkoKExFTl9FQVBfS0VZKSsoTEVOX1RLSVBfS0VZKSkKKyNkZWZpbmUgTUlOX0xFTl9PRl9HVEsJCQkJNQorCisvLyBSU04gSUUgTGVuZ3RoIGRlZmluaXRpb24KKyNkZWZpbmUgTUFYX0xFTl9PRl9SU05JRSAgICAgICAgIAk5MAorI2RlZmluZSBNSU5fTEVOX09GX1JTTklFICAgICAgICAgCTgKKworLy9FQVAgUGFja2V0IFR5cGUKKyNkZWZpbmUJRUFQUGFja2V0CQkwCisjZGVmaW5lCUVBUE9MU3RhcnQJCTEKKyNkZWZpbmUJRUFQT0xMb2dvZmYJCTIKKyNkZWZpbmUJRUFQT0xLZXkJCTMKKyNkZWZpbmUJRUFQT0xBU0ZBbGVydAk0CisjZGVmaW5lCUVBUFR0eXBlTWF4CQk1CisKKyNkZWZpbmUJRUFQT0xfTVNHX0lOVkFMSUQJMAorI2RlZmluZQlFQVBPTF9QQUlSX01TR18xCTEKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMgkyCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzMJMworI2RlZmluZQlFQVBPTF9QQUlSX01TR180CTQKKyNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzEJNQorI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMgk2CisKKyNkZWZpbmUgUEFJUldJU0VLRVkJCQkJCTEKKyNkZWZpbmUgR1JPVVBLRVkJCQkJCTAKKworLy8gUmV0cnkgdGltZXIgY291bnRlciBpbml0aWFsIHZhbHVlCisjZGVmaW5lIFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDAKKyNkZWZpbmUgUEVFUl9NU0czX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMTAKKyNkZWZpbmUgR1JPVVBfTVNHMV9SRVRSWV9USU1FUl9DVFIgICAgICAgICAgMjAKKworCisjZGVmaW5lIEVBUE9MX1NUQVJUX0RJU0FCTEUJCQkJCTAKKyNkZWZpbmUgRUFQT0xfU1RBUlRfUFNLCQkJCQkJMQorI2RlZmluZSBFQVBPTF9TVEFSVF8xWAkJCQkJCTIKKworI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9US0lQX09OKHgpICAgICAgICgoKHgpICYgMHgwOCkgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfQUVTX09OKHgpICAgICAgICAoKCh4KSAmIDB4MDQpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKHgpICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKHgpICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkKKworI2RlZmluZSBST1VORF9VUChfX3gsIF9feSkgXAorCSgoKFVMT05HKSgoX194KSsoKF9feSktMSkpKSAmICgoVUxPTkcpfigoX195KS0xKSkpCisKKyNkZWZpbmUJQUREX09ORV9Ub182NEJJVF9WQVIoX1YpCQlcCit7CQkJCQkJCQkJCVwKKwlVQ0hBUgljbnQgPSBMRU5fS0VZX0RFU0NfUkVQTEFZOwlcCisJZG8JCQkJCQkJCQlcCisJewkJCQkJCQkJCVwKKwkJY250LS07CQkJCQkJCVwKKwkJX1ZbY250XSsrOwkJCQkJCVwKKwkJaWYgKGNudCA9PSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCX13aGlsZSAoX1ZbY250XSA9PSAwKTsJCQkJXAorfQorCisjZGVmaW5lIElTX1dQQV9DQVBBQklMSVRZKGEpICAgICAgICgoKGEpID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKChhKSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisKKy8vIEVBUE9MIEtleSBJbmZvcm1hdGlvbiBkZWZpbml0aW9uIHdpdGhpbiBLZXkgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0lORk8KK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJS2V5QWNrOjE7CisgICAgVUNIQVIJSW5zdGFsbDoxOworICAgIFVDSEFSCUtleUluZGV4OjI7CisgICAgVUNIQVIJS2V5VHlwZToxOworICAgIFVDSEFSCUtleURlc2NWZXI6MzsKKyAgICBVQ0hBUglSc3ZkOjM7CisgICAgVUNIQVIJRUtEX0RMOjE7CQkvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCisgICAgVUNIQVIJUmVxdWVzdDoxOworICAgIFVDSEFSCUVycm9yOjE7CisgICAgVUNIQVIJU2VjdXJlOjE7CisgICAgVUNIQVIJS2V5TWljOjE7CisjZWxzZQorCVVDSEFSCUtleU1pYzoxOworCVVDSEFSCVNlY3VyZToxOworCVVDSEFSCUVycm9yOjE7CisJVUNIQVIJUmVxdWVzdDoxOworCVVDSEFSCUVLRF9ETDoxOyAgICAgICAvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCisJVUNIQVIJUnN2ZDozOworCVVDSEFSCUtleURlc2NWZXI6MzsKKwlVQ0hBUglLZXlUeXBlOjE7CisJVUNIQVIJS2V5SW5kZXg6MjsKKwlVQ0hBUglJbnN0YWxsOjE7CisJVUNIQVIJS2V5QWNrOjE7CisjZW5kaWYKK30JS0VZX0lORk8sICpQS0VZX0lORk87CisKKy8vIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfREVTQ1JJUFRFUgoreworCVVDSEFSCQlUeXBlOworCUtFWV9JTkZPCUtleUluZm87CisJVUNIQVIJCUtleUxlbmd0aFsyXTsKKwlVQ0hBUgkJUmVwbGF5Q291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUgkJS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwlVQ0hBUgkJS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKKwlVQ0hBUgkJS2V5UnNjW0xFTl9LRVlfREVTQ19SU0NdOworCVVDSEFSCQlLZXlJZFtMRU5fS0VZX0RFU0NfSURdOworCVVDSEFSCQlLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107CisJVUNIQVIJCUtleURhdGFMZW5bMl07CisJVUNIQVIJCUtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Cit9CUtFWV9ERVNDUklQVEVSLCAqUEtFWV9ERVNDUklQVEVSOworCit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0VBUE9MX1BBQ0tFVAoreworCVVDSEFSCSAJCQlQcm9WZXI7CisJVUNIQVIJIAkJCVByb1R5cGU7CisJVUNIQVIJIAkJCUJvZHlfTGVuWzJdOworCUtFWV9ERVNDUklQVEVSCQlLZXlEZXNjOworfQlFQVBPTF9QQUNLRVQsICpQRUFQT0xfUEFDS0VUOworCisvLzgwMi4xMWkgRDEwIHBhZ2UgODMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfR1RLX0VOQ0FQCit7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOworICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKKyNlbHNlCisgICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7CisjZW5kaWYKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS1tUS0lQX0dUS19MRU5HVEhdOworfSAgIEdUS19FTkNBUCwgKlBHVEtfRU5DQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfS0RFX0VOQ0FQCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICBUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgTGVuOworICAgIFVDSEFSICAgICAgICAgICAgICAgT1VJWzNdOworICAgIFVDSEFSICAgICAgICAgICAgICAgRGF0YVR5cGU7CisgICAgR1RLX0VOQ0FQICAgICAgR1RLRW5jYXA7Cit9ICAgS0RFX0VOQ0FQLCAqUEtERV9FTkNBUDsKKworLy8gRm9yIFdQQTEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUgeworICAgIFVDSEFSICAgb3VpWzRdOworICAgIFVTSE9SVCAgdmVyc2lvbjsKKyAgICBVQ0hBUiAgIG1jYXN0WzRdOworICAgIFVTSE9SVCAgdWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfXVjYXN0WzFdOworfSBSU05JRSwgKlBSU05JRTsKKworLy8gRm9yIFdQQTIKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUyIHsKKyAgICBVU0hPUlQgIHZlcnNpb247CisgICAgVUNIQVIgICBtY2FzdFs0XTsKKyAgICBVU0hPUlQgIHVjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH11Y2FzdFsxXTsKK30gUlNOSUUyLCAqUFJTTklFMjsKKworLy8gQUtNIFN1aXRlCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFX0FVVEggeworICAgIFVTSE9SVCBhY291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9YXV0aFsxXTsKK30gUlNOSUVfQVVUSCwqUFJTTklFX0FVVEg7CisKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9SU05fQ0FQQUJJTElUSUVTCXsKKwlzdHJ1Y3QJUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFVTSE9SVAkJUnN2ZDoxMDsKKyAgICAgICAgVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKKyAgICAgICAgVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKKyAgICAgICAgVVNIT1JUCQlOb19QYWlyd2lzZToxOworCQlVU0hPUlQJCVByZUF1dGg6MTsKKyNlbHNlCisgICAgICAgIFVTSE9SVAkJUHJlQXV0aDoxOworCQlVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7CisJCVVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7CisJCVVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7CisJCVVTSE9SVAkJUnN2ZDoxMDsKKyNlbmRpZgorCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VBUF9IRFIgeworICAgIFVDSEFSICAgUHJvVmVyOworICAgIFVDSEFSICAgUHJvVHlwZTsKKyAgICBVQ0hBUiAgIEJvZHlfTGVuWzJdOworICAgIFVDSEFSICAgY29kZTsKKyAgICBVQ0hBUiAgIGlkZW50aWZpZXI7CisgICAgVUNIQVIgICBsZW5ndGhbMl07IC8vIGluY2x1ZGluZyBjb2RlIGFuZCBpZGVudGlmaWVyLCBmb2xsb3dlZCBieSBsZW5ndGgtMiBvY3RldHMgb2YgZGF0YQorfSBFQVBfSERSLCAqUEVBUF9IRFI7CisKKy8vIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcKKy8vIFdlIHNpbXBsaWZpZWQgaXQKK3R5cGVkZWYJZW51bQlfV3BhU3RhdGUKK3sKKwlTU19OT1RVU0UsCQkJCS8vIDAKKwlTU19TVEFSVCwJCQkJLy8gMQorCVNTX1dBSVRfTVNHXzMsCQkJLy8gMgorCVNTX1dBSVRfR1JPVVAsCQkJLy8gMworCVNTX0ZJTklTSCwgIAkJCS8vIDQKKwlTU19LRVlVUERBVEUsCQkJLy8gNQorfQlXUEFfU1RBVEU7CisKKy8vCisvLwlUaGUgZGVmaW5pdGlvbiBvZiB0aGUgY2lwaGVyIGNvbWJpbmF0aW9uCisvLworLy8gCSBiaXQzCWJpdDIgIGJpdDEgICBiaXQwCisvLwkrLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKy8vIAl8CSAgV1BBCSB8CSAgIFdQQTIgICB8CisvLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKKy8vCXwgVEtJUCB8IEFFUyB8IFRLSVAgfCBBRVMgfAorLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDA2CisvLwl8CTAgIHwgIDEgIHwgICAxICB8ICAxICB8IC0+IDB4MDcKKy8vCXwJMSAgfCAgMCAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwOQorLy8JfAkxICB8ICAwICB8ICAgMSAgfCAgMSAgfCAtPiAweDBCCisvLwl8CTEgIHwgIDEgIHwgICAwICB8ICAxICB8IC0+IDB4MEQKKy8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwRQorLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMSAgfAktPiAweDBGCisvLwkrLS0tLS0tKy0tLS0tKy0tLS0tLSstLS0tLSsKKy8vCit0eXBlZGVmCWVudW0JX1dwYU1peFBhaXJDaXBoZXIKK3sKKwlNSVhfQ0lQSEVSX05PVFVTRSAJCQk9IDB4MDAsCisJV1BBX05PTkVfV1BBMl9US0lQQUVTCQk9IDB4MDMsCQkvLyBXUEEyLVRLSVBBRVMKKwlXUEFfQUVTX1dQQTJfVEtJUCAJCQk9IDB4MDYsCisJV1BBX0FFU19XUEEyX1RLSVBBRVMJCT0gMHgwNywKKwlXUEFfVEtJUF9XUEEyX0FFUwkJCT0gMHgwOSwKKwlXUEFfVEtJUF9XUEEyX1RLSVBBRVMJCT0gMHgwQiwKKwlXUEFfVEtJUEFFU19XUEEyX05PTkUJCT0gMHgwQywJCS8vIFdQQS1US0lQQUVTCisJV1BBX1RLSVBBRVNfV1BBMl9BRVMJCT0gMHgwRCwKKwlXUEFfVEtJUEFFU19XUEEyX1RLSVAJCT0gMHgwRSwKKwlXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVMJPSAweDBGLAorfQlXUEFfTUlYX1BBSVJfQ0lQSEVSOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTl9JRV9IRUFERVJfU1RSVUNUCXsKKwlVQ0hBUgkJRWlkOworCVVDSEFSCQlMZW5ndGg7CisJVVNIT1JUCQlWZXJzaW9uOwkvLyBMaXR0bGUgZW5kaWFuIGZvcm1hdAorfQlSU05fSUVfSEVBREVSX1NUUlVDVCwgKlBSU05fSUVfSEVBREVSX1NUUlVDVDsKKworLy8gQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NJUEhFUl9TVUlURV9TVFJVQ1QJeworCVVDSEFSCQlPdWlbM107CisJVUNIQVIJCVR5cGU7Cit9CUNJUEhFUl9TVUlURV9TVFJVQ1QsICpQQ0lQSEVSX1NVSVRFX1NUUlVDVDsKKworLy8gQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IHN1aXRlIHNlbGVjdG9yCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0FLTV9TVUlURV9TVFJVQ1QJeworCVVDSEFSCQlPdWlbM107CisJVUNIQVIJCVR5cGU7Cit9CUFLTV9TVUlURV9TVFJVQ1QsICpQQUtNX1NVSVRFX1NUUlVDVDsKKworLy8gUlNOIGNhcGFiaWxpdHkKK3R5cGVkZWYgc3RydWN0CVBBQ0tFRCBfUlNOX0NBUEFCSUxJVFkJeworCVVTSE9SVAkJUnN2OjEwOworCVVTSE9SVAkJR1RLU0FSZXBsYXlDbnQ6MjsKKwlVU0hPUlQJCVBUS1NBUmVwbGF5Q250OjI7CisJVVNIT1JUCQlOb1BhaXJ3aXNlOjE7CisJVVNIT1JUCQlQcmVBdXRoOjE7Cit9CVJTTl9DQVBBQklMSVRZLCAqUFJTTl9DQVBBQklMSVRZOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMyMjVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIFJUTDgxODdTRQorCXRyaXN0YXRlICJSZWFsVGVrIFJUTDgxODdTRSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzdlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCkBAIC0wLDAgKzEsNTUgQEAKKworI0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19JRUVFODAyMTFfTk9XRVA9eQorI0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTgwX0lPTUFQCisjRVhUUkFfQ0ZMQUdTICs9IC1zdGQ9Z251ODkKKyNFWFRSQV9DRkxBR1MgKz0gLU8yCisjQ0MgICAgICAgICAgICA9IGdjYworRVhUUkFfQ0ZMQUdTICs9IC1EVEhPTUFTX1RVUkJPCisjQ0ZMQUdTICs9IC1EQ09ORklHX1JUTDgxODVCCisjQ0ZMQUdTICs9IC1EQ09ORklHX1JUTDgxOHhfUworCisjYWRkZWQgZm9yIEVlZVBDIHRlc3RpbmcKK0VYVFJBX0NGTEFHUyArPSAtREVOQUJMRV9JUFMKK0VYVFJBX0NGTEFHUyArPSAtRFNXX0FOVEUKK0VYVFJBX0NGTEFHUyArPSAtRFRYX1RSQUNLCitFWFRSQV9DRkxBR1MgKz0gLURISUdIX1BPV0VSCitFWFRSQV9DRkxBR1MgKz0gLURTV19ESUcKK0VYVFJBX0NGTEFHUyArPSAtRFJBVEVfQURBUFQKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTgwX1BNCisKKyMrWUosMDgwNjI2CitFWFRSQV9DRkxBR1MgKz0gLURFTkFCTEVfRE9UMTFECisKKyNlbmFibGUgaXQgZm9yIGxlZ2FjeSBwb3dlciBzYXZlLCBkaXNhYmxlIGl0IGZvciBsZWlzdXJlICBwb3dlciBzYXZlCitFWFRSQV9DRkxBR1MgKz0gLURFTkFCTEVfTFBTCisKKworI0VYVFJBX0NGTEFHUyArPSAtbWhhcmQtZmxvYXQgLURDT05GSUdfRk9SQ0VfSEFSRF9GTE9BVD15CisKK3J0bDgxODdzZS1vYmpzIDo9CQkJXAorCQlyODE4MF9jb3JlLm8JCVwKKwkJcjgxODBfc2EyNDAwLm8JCVwKKwkJcjgxODBfOTNjeDYubwkJXAorCQlyODE4MF93eC5vCQlcCisJCXI4MTgwX21heDI4MjAubwkJXAorCQlyODE4MF9nY3QubwkJXAorCQlyODE4MF9ydGw4MjI1Lm8JCVwKKwkJcjgxODBfcnRsODI1NS5vCQlcCisJCXI4MTgwX3J0bDgyMjV6Mi5vCVwKKwkJcjgxODViX2luaXQubwkJXAorCQlyODE4MF9kbS5vCQlcCisJCXI4MTgwX3BtLm8JCVwKKwkJaWVlZTgwMjExL2RvdDExZC5vCQkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3J4Lm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV90eC5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfd3gubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5vCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5vCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLm8JXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5vCisKK29iai0kKENPTkZJR19SVEw4MTg3U0UpCSs9IHJ0bDgxODdzZS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2RvdDExZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjUzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2RvdDExZC5oCkBAIC0wLDAgKzEsMTAxIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9IDQorI2RlZmluZSBfX0lOQ19ET1QxMURfSA0KKw0KKyNpbmNsdWRlICJpZWVlODAyMTEuaCINCisNCisvLyNkZWZpbmUgRU5BQkxFX0RPVDExRA0KKw0KKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzDQorDQordHlwZWRlZiBzdHJ1Y3QgX0NITkxfVFhQT1dFUl9UUklQTEUgew0KKwl1OCBGaXJzdENobmw7DQorCXU4ICBOdW1DaG5sczsNCisJdTggIE1heFR4UG93ZXJJbkRibTsNCit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOw0KKw0KK3R5cGVkZWYgZW51bSBfRE9UMTFEX1NUQVRFIHsNCisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLA0KKwlET1QxMURfU1RBVEVfTEVBUk5FRCwNCisJRE9UMTFEX1NUQVRFX0RPTkUsDQorfURPVDExRF9TVEFURTsNCisNCit0eXBlZGVmIHN0cnVjdCBfUlRfRE9UMTFEX0lORk8gew0KKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsNCisNCisJYm9vbCBiRW5hYmxlZDsgLy8gZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkDQorDQorCXUxNiBDb3VudHJ5SWVMZW47IC8vID4gMCBpZiBDb3VudHJ5SWVCdWZbXSBjb250YWlucyB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuDQorCXU4ICBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07DQorCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuDQorCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsgDQorDQorCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pDQorCS8vdTggIENobmxMaXN0TGVuOyAvLyAjQnl0ZXMgdmFsaWQgaW4gQ2hubExpc3RbXS4NCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07DQorCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOw0KKw0KKwlET1QxMURfU1RBVEUgU3RhdGU7DQorfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOw0KKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApDQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQ0KKyNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkNCisNCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZA0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQ0KKw0KKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpIA0KKyNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGNwTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQ0KKw0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwNCisJKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbikgPyBcDQorCUZBTFNFIDogXA0KKwkoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwgKF9fSWUpLk9jdGV0LCAoX19JZSkuTGVuZ3RoKSkpDQorDQorI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQ0KKyNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVdhdGNoZG9nDQorI2RlZmluZSBSRVNFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDAgDQorI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpDQorDQorDQordm9pZA0KK0RvdDExZF9Jbml0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9SZXNldCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldg0KKwkpOw0KKw0KK3ZvaWQNCitEb3QxMWRfVXBkYXRlQ291bnRyeUllKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCAqCQlwVGFkZHIsDQorCXUxNglDb3V0cnlJZUxlbiwNCisJdTggKiBwQ291dHJ5SWUJIA0KKwkpOw0KKw0KK3U4DQorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4IENoYW5uZWwNCisJKTsNCisNCit2b2lkDQorRE9UMTFEX1NjYW5Db21wbGV0ZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYNCisJKTsNCisNCitpbnQgSXNMZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCitpbnQgVG9MZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDZhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMTc1NSBAQAorLyoKKyAqIE1lcmdlZCB3aXRoIG1haW5saW5lIGllZWU4MDIxMS5oIGluIEF1ZyAyMDA0LiAgT3JpZ2luYWwgaWVlZTgwMl8xMQorICogcmVtYWlucyBjb3B5cmlnaHQgYnkgdGhlIG9yaWdpbmFsIGF1dGhvcnMKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgbWVyZ2VkIGNvZGUgYXJlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzCisgKiBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBNb2RpZmllZCBmb3IgUmVhbHRlaydzIHdpLWZpIGNhcmRzIGJ5IEFuZHJlYSBNZXJlbGxvCisgKiA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfSAorI2RlZmluZSBJRUVFODAyMTFfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZW5kaWYKKworLyoKKyNpZm5kZWYgYm9vbAorI2RlZmluZSBib29sIGludAorI2VuZGlmCisKKyNpZm5kZWYgdHJ1ZQorI2RlZmluZSB0cnVlICAgMQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgIDAKKyNlbmRpZgorKi8KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKyNpZm5kZWYgYm9vbAordHlwZWRlZiBlbnVte2ZhbHNlID0gMCwgdHJ1ZX0gYm9vbDsKKyNlbmRpZgorI2VuZGlmCisvLyNpZmRlZiBKT0hOX0hXU0VDCisjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKKyNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorLy8jZW5kaWYKKworCisjZGVmaW5lIGFTaWZzVGltZQkJCQkJMTAKKworI2RlZmluZSBNR01UX1FVRVVFX05VTSA1CisKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisvL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYworLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCisjZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKKyNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKKyNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAorI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQorCisjZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQorI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKKworCisKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ERUFVVEgJCQkxCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfRElTQVNTT0MJCQkyCisKKworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FMRwkJMgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9VTktOT1dOX0FERFIJCTMKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQJCTQKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJCTUKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVFhfS0VZX1NFVF9GQUlMRUQJCTYKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNworCisKKyNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkpCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfc2NhbiBpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBhZGRlZCBmb3Iga2VybmVsIGNvbmZsaWN0IHVuZGVyIEZDNQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUgICBpZWVlODAyMTFfd3hfZ2V0X25hbWVfcnRsCisjZGVmaW5lIGZyZWVfaWVlZTgwMjExICAgICAgICAgIGZyZWVfaWVlZTgwMjExX3J0bAorI2RlZmluZSBhbGxvY19pZWVlODAyMTEgICAgICAgIGFsbG9jX2llZWU4MDIxMV9ydGwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNlbmRpZgorLy9lcnJvciBpbiB1YnVudHUyLjYuMjIsc28gYWRkIHRoZXNlCisjZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlIGllZWU4MDIxMV93YWtlX3F1ZXVlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9xdWV1ZSBpZWVlODAyMTFfc3RvcF9xdWV1ZV9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcnggaWVlZTgwMjExX3J4X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcwlpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcglpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdAlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXRfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCWllZWU4MDIxMV90eGJfZnJlZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCWllZWU4MDIxMV93eF9zZXRfZXNzaWRfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF0ZQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCWllZWU4MDIxMV93eF9zZXRfd2FwX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3dhcAlpZWVlODAyMTFfd3hfZ2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCWllZWU4MDIxMV93eF9zZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCWllZWU4MDIxMV93eF9nZXRfbW9kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9zY2FuCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCWllZWU4MDIxMV93eF9nZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCWllZWU4MDIxMV93eF9zZXRfZnJlcV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXd0eAlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCWllZWU4MDIxMV93eF9zZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcG93ZXIJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbAlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbF9ydGwKKyNkZWZpbmUJaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGggaWVlZTgwMjExX3d4X3NldF9hdXRoX3J0bAorLy9ieSBhbXkgZm9yIHBzCisjZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudCAgbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlIGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuIGllZWU4MDIxMV9zdGFydF9zY2FuX3J0bAorLy9ieSBhbXkgZm9yIHBzCit0eXBlZGVmIHN0cnVjdCBpZWVlX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKyAgICAgICAgdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggbmFtZTsKKwkJCXUzMiB2YWx1ZTsKKwkJfSB3cGFfcGFyYW07CisJCXN0cnVjdCB7CisJCQl1MzIgbGVuOworCQkJdTggcmVzZXJ2ZWRbMzJdOworCQkJdTggZGF0YVswXTsKKwkJfSB3cGFfaWU7CisJICAgICAgICBzdHJ1Y3R7CisJCQlpbnQgY29tbWFuZDsKKyAgICAJCQlpbnQgcmVhc29uX2NvZGU7CisJCX0gbWxtZTsKKwkJc3RydWN0IHsKKwkJCXU4IGFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1OCBzZXRfdHg7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbMF07CisJCX0gY3J5cHQ7CisKKwl9IHU7Cit9aWVlZV9wYXJhbTsKKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisvLyBsaW51eCB1bmRlciAyLjYuOSByZWxlYXNlIG1heSBub3Qgc3VwcG9ydCBpdCwgc28gbW9kaWZ5IGl0IGZvciBjb21tb24gdXNlCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKKyNkZWZpbmUgTVNFQ1ModCkJKDEwMDAgKiAoKHQpIC8gSFopICsgMTAwMCAqICgodCkgJSBIWikgLyBIWikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwodW5zaWduZWQgaW50IG1zZWNzKQoreworICAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gTVNFQ1MobXNlY3MpICsgMTsKKworICAgICAgICAgd2hpbGUgKHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiB0aW1lb3V0OworfQorI2Vsc2UKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisjZW5kaWYKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4JCTIzMDQKKy8qIE1heGltdW0gc2l6ZSBmb3IgdGhlIE1BLVVOSVREQVRBIHByaW1pdGl2ZSwgODAyLjExIHN0YW5kYXJkIHNlY3Rpb24KKyAgIDYuMi4xLjEuMi4KKworICAgVGhlIGZpZ3VyZSBpbiBzZWN0aW9uIDcuMS4yIHN1Z2dlc3RzIGEgYm9keSBzaXplIG9mIHVwIHRvIDIzMTIKKyAgIGJ5dGVzIGlzIGFsbG93ZWQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZywgSSBzdXNwZWN0IHRoaXMKKyAgIHJlcHJlc2VudHMgdGhlIDIzMDQgYnl0ZXMgb2YgcmVhbCBkYXRhLCBwbHVzIGEgcG9zc2libGUgOCBieXRlcyBvZgorICAgV0VQIElWIGFuZCBJQ1YuICh0aGlzIGludGVycHJldGF0aW9uIHN1Z2dlc3RlZCBieSBSYW1pcm8gQmFycmVpcm8pICovCisKKworI2RlZmluZSBJRUVFODAyMTFfSExFTgkJCTMwCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4JCShJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworLyogdGhpcyBpcyBzdG9sZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIG1hZHdpZmkgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sJCTB4MGMKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEJCTB4MDgKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0sJMHhCMAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpIFwKKwkoKChmYykgJiAoSUVFRTgwMjExX0ZDMF9UWVBFX01BU0sgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSykpID09IFwKKwkgKElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUykpCisKKy8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KKyNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKK3N0cnVjdCBpZWVlX2lic3Nfc2VxIHsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBzZXFfbnVtWzE3XTsKKwl1MTYgZnJhZ19udW1bMTddOworCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWVbMTddOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTE2IFFPU19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSBlYXBfdHlwZSB7CisJRUFQX1BBQ0tFVCA9IDAsCisJRUFQT0xfU1RBUlQsCisJRUFQT0xfTE9HT0ZGLAorCUVBUE9MX0tFWSwKKwlFQVBPTF9FTkNBUF9BU0ZfQUxFUlQKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICplYXBfdHlwZXNbXSA9IHsKKwlbRUFQX1BBQ0tFVF0JCT0gIkVBUC1QYWNrZXQiLAorCVtFQVBPTF9TVEFSVF0JCT0gIkVBUE9MLVN0YXJ0IiwKKwlbRUFQT0xfTE9HT0ZGXQkJPSAiRUFQT0wtTG9nb2ZmIiwKKwlbRUFQT0xfS0VZXQkJPSAiRUFQT0wtS2V5IiwKKwlbRUFQT0xfRU5DQVBfQVNGX0FMRVJUXQk9ICJFQVBPTC1FbmNhcC1BU0YtQWxlcnQiCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVhcF9nZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6IGVhcF90eXBlc1t0eXBlXTsKK30KKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJRUVFODAyMTFfM0FERFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDU19MRU4gICAgNAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0RTVE9EUwkJMHgwMzAwIC8vYWRkZWQgYnkgZGF2aWQKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9SRVRSWQkJMHgwODAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfTU9SRURBVEEJMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQQkweDAwODAgLy9hZGRlZCBmb3IgV01NIDIwMDYvOC8yCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTAkweDAwQzAKKworCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyMTFfU0NUTF9TRVEJCTB4RkZGMAorCisKKy8qIGRlYnVnIG1hY3JvcyAqLworCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworZXh0ZXJuIHUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWw7CisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitkbyB7IGlmIChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVjICVzICIgZm10LCBcCisgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisvLyNkZWZpbmUgSUVFRV9ERUJVR19TQ0FOICBJRUVFODAyMTFfV0FSTklORworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisgICAgICAgIHU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisgICAgICAgIHU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKworI2RlZmluZSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTiAxMjgKKworI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQlNTICgxPDwwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfSUJTUyAoMTw8MSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFICgxPDwyKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUICgxPDwzKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFICgxPDw1KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUEJDQyAoMTw8NikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NIQU5ORUxfQUdJTElUWSAoMTw8NykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQorI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgorI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAorI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQorI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAorLyogODAyLjExYiAqLworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKKworLyogUmVhc29uIGNvZGVzICovCisjZGVmaW5lIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEIDEKKyNkZWZpbmUgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCAyCisjZGVmaW5lIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HIDMKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgNAorI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZIDUKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgNgorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgNworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgOAorI2RlZmluZSBXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA5CisKKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKKworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJdTggc2lnbmFsc3RyZW5ndGg7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU4IG5pY190eXBlOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKKwl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOworCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKKwl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKKwl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOworCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHJlYXNzb2M7CisJdW5zaWduZWQgaW50IHN3dHhzdG9wOworCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKworI2RlZmluZSBXRVBfS0VZX0xFTl9NT0RJRiAzMgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorICAgICAgICAgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKyAgICAgICAgICAgIGF1dGhfYWxnbzo0LAorICAgICAgICAgICAgdW5pY2FzdF91c2VzX2dyb3VwOjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl9NT0RJRl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKworIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCitUb3RhbDogMjgtMjM0MCBieXRlcworCisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVs2XTsKKwl1OCBhZGRyMls2XTsKKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKKy8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLworI2RlZmluZSBNRklFX1RZUEVfU1NJRCAgICAgICAwCisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFUyAgICAgIDEKKyNkZWZpbmUgTUZJRV9UWVBFX0ZIX1NFVCAgICAgMgorI2RlZmluZSBNRklFX1RZUEVfRFNfU0VUICAgICAzCisjZGVmaW5lIE1GSUVfVFlQRV9DRl9TRVQgICAgIDQKKyNkZWZpbmUgTUZJRV9UWVBFX1RJTSAgICAgICAgNQorI2RlZmluZSBNRklFX1RZUEVfSUJTU19TRVQgICA2CisjZGVmaW5lIE1GSUVfVFlQRV9DT1VOVFJZICA3IC8vK1lKLDA4MDYyNQorI2RlZmluZSBNRklFX1RZUEVfQ0hBTExFTkdFICAxNgorI2RlZmluZSBNRklFX1RZUEVfRVJQICAgICAgICA0MgorI2RlZmluZSBNRklFX1RZUEVfUlNOCSAgICAgNDgKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYICAgNTAKKyNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMgICAgMjIxCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMgPSA4LAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOID0gOSwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWCA9IDEwCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUxNiBhbGdvcml0aG07CisJdTE2IHRyYW5zYWN0aW9uOworCXUxNiBzdGF0dXM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwkvKnN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJLy91OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3RhdHVzOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1leworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisgICAgICAgIHUxNiAgICByZWFzb25jb2RlOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgcGF5bG9hZF9zaXplOworCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEggICAgICAgICAgICAgICAgICAoKHU4KTEyKQorI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RIICAgICAgICAgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQgICAgICAgICAgICAgICAgICAxMjgKKy8vI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2NSAvL1lKLG1vZGlmaWVkLDA4MDYyNQorI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKKwl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgIDEwMC8vNDAwCisvLyhIWiAvIDIpCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKy8vYnkgYW15IGZvciBwcworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9ECQkxMDAwIC8vIDEwMDAgbQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfRU5BQkxFICAgSUVFRTgwMjExX0RUSU1fVkFMSUQKKy8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKKy8vI2RlZmluZSBXTU1fSGFuZ184MTg3CisjaWZkZWYgV01NX0hhbmdfODE4NworI3VuZGVmIFdNTV9IYW5nXzgxODcKKyNlbmRpZgorCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDAKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMQorI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCisjZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKKyNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4IHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4IHJhdGVzX2xlbjsKKwl1OCByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggbW9kZTsKKwl1OCBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisJdTggU2lnbmFsU3RyZW5ndGg7CisvL2J5IGFteSAwODAzMTIKKwl1OCBIaWdoZXN0T3BlcmFSYXRlOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCitleHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAorCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgYnJvYWRjYXN0X2tleV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCAqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCS8vIEZvciBMaXRlb24gQ2gxMn4xMyBwYXNzaXZlIHNjYW4KKwl1OAlNaW5QYXNzaXZlQ2hubE51bTsKKwl1OAlJYnNzU3RhcnRDaG5sOworI2Vsc2UKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKworCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd21tX3BhcmFtX3VwZGF0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHNfcmVxdWVzdF90eF9hY2tfd3E7Ly9mb3IgcHMKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCWJvb2wgYkluYWN0aXZlUHM7CisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeERhdGFJblBlcmlvZDsgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeEJjbkluUGVyaW9kOyAgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeE9rVG90YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeFVuaWNhc3Q7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJYm9vbCBiSHdSYWRpb09mZjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod193YWtldXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod19zbGVlcF93cTsvLytieSBhbXkgMDgwMzI0CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzd19hbnRlbm5hX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIHN0YXJ0X2lic3Nfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IGRlbGF5ZWRfd29yayBod19kaWdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IGRlbGF5ZWRfd29yayBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbHNlCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzd19hbnRlbm5hX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IHdvcmtfc3RydWN0IGh3X2RpZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCB3b3JrX3N0cnVjdCBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbmRpZgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogUW9TIHJlbGF0ZWQgKi8KKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFjX3BhcmFtKTsKKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSAyNDsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKKwkJCWhkcmxlbiA9IDMwOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgIAkJCSB1OCogICAgICAgICAgICAgICAgICAgICBhc1N0YSwKKyAgICAgICAgCQkgdTggICAgICAgICAgICAgICAgICAgICAgYXNSc24pOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4Yjc1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMCwwICsxLDI0NiBAQAorI2lmZGVmIEVOQUJMRV9ET1QxMUQNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8JRmlsZToNCisvLwkJRG90MTFkLmMNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlJbXBsZW1lbnQgODAyLjExZC4gDQorLy8NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorI2luY2x1ZGUgImRvdDExZC5oIg0KKw0KK3ZvaWQNCitEb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsNCisNCisJcERvdDExZEluZm8tPmJFbmFibGVkID0gMDsNCisNCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7DQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOw0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7ICANCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsNCisJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOw0KKw0KKwlwcmludGsoIkRvdDExZF9Jbml0KClcbiIpOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXNldCB0byB0aGUgc3RhdGUgYXMgd2UgYXJlIGp1c3QgZW50ZXJpbmcgYSByZWd1bGF0b3J5IGRvbWFpbi4NCisvLw0KK3ZvaWQNCitEb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpDQorew0KKwl1MzIgaTsNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOw0KKw0KKwkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXANCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwDQorCWZvciAoaT0xOyBpPD0xMTsgaSsrKSB7DQorCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7DQorCX0NCisJZm9yIChpPTEyOyBpPD0xNDsgaSsrKSB7DQorCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDI7DQorCX0NCisNCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7DQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOw0KKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7DQorDQorCS8vcHJpbnRrKCJEb3QxMWRfUmVzZXQoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVVwZGF0ZSBjb3VudHJ5IElFIGZyb20gQmVhY29uIG9yIFByb2JlIFJlc29wbnNlIA0KKy8vCQlhbmQgY29uZmlndXJlIFBIWSBmb3Igb3BlcmF0aW9uIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbi4NCisvLw0KKy8vCVRPRE86IA0KKy8vCQlDb25maWd1cmUgVHggcG93ZXIuDQorLy8NCisvLwlBc3N1bXB0aW9uOg0KKy8vCQkxLiBJU19ET1QxMURfRU5BQkxFKCkgaXMgVFJVRS4NCisvLwkJMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLg0KKy8vDQordm9pZA0KK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4ICoJCXBUYWRkciwNCisJdTE2CUNvdXRyeUllTGVuLA0KKwl1OCAqIHBDb3V0cnlJZQkgDQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBpLCBqLCBOdW1UcmlwbGVzLCBNYXhDaG5sTnVtOw0KKwlQQ0hOTF9UWFBPV0VSX1RSSVBMRSBwVHJpcGxlOw0KKw0KKwlpZigoQ291dHJ5SWVMZW4gLSAzKSUzICE9IDApDQorCXsNCisJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOw0KKwkJRG90MTFkX1Jlc2V0KGRldik7DQorCQlyZXR1cm47DQorCX0NCisNCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwlNYXhDaG5sTnVtID0gMDsNCisJTnVtVHJpcGxlcyA9IChDb3V0cnlJZUxlbiAtIDMpIC8gMzsgLy8gc2tpcCAzLWJ5dGUgY291bnRyeSBzdHJpbmcuDQorCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKHBDb3V0cnlJZSArIDMpOw0KKwlmb3IoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspDQorCXsNCisJCWlmKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKQ0KKwkJeyAvLyBJdCBpcyBub3QgaW4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIsIHNvIHN0b3AgcHJvY2Vzc2luZy4NCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsNCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCQlyZXR1cm47IA0KKwkJfQ0KKwkJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkNCisJCXsgLy8gSXQgaXMgbm90IGEgdmFsaWQgc2V0IG9mIGNoYW5uZWwgaWQsIHNvIHN0b3AgcHJvY2Vzc2luZy4NCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsNCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCQlyZXR1cm47IA0KKwkJfQ0KKw0KKwkJZm9yKGogPSAwIDsgaiA8IHBUcmlwbGUtPk51bUNobmxzOyBqKyspDQorCQl7DQorCQkJcERvdDExZEluZm8tPmNoYW5uZWxfbWFwW3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gMTsNCisJCQlwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtOw0KKwkJCU1heENobmxOdW0gPSBwVHJpcGxlLT5GaXJzdENobmwgKyBqOw0KKwkJfQkNCisNCisJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCopcFRyaXBsZSArIDMpOw0KKwl9DQorI2lmIDENCisJLy9wcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogQ2hhbm5lbCBMaXN0OlxuIik7DQorCXByaW50aygiQ2hhbm5lbCBMaXN0OiIpOw0KKwlmb3IoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspDQorCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJCXByaW50aygiICVkIiwgaSk7DQorCXByaW50aygiXG4iKTsNCisjZW5kaWYNCisNCisJVVBEQVRFX0NJRV9TUkMoZGV2LCBwVGFkZHIpOw0KKw0KKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gQ291dHJ5SWVMZW47DQorCW1lbWNweShwRG90MTFkSW5mby0+Q291bnRyeUllQnVmLCBwQ291dHJ5SWUsQ291dHJ5SWVMZW4pOw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTEVBUk5FRDsNCit9DQorDQordm9pZCBkdW1wX2NobmxfbWFwKHU4ICogY2hhbm5lbF9tYXApDQorew0KKwlpbnQgaTsNCisJcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7DQorCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJCWlmKGNoYW5uZWxfbWFwW2ldID4gMCkNCisJCQlwcmludGsoIiAlZCglZCkiLCBpLCBjaGFubmVsX21hcFtpXSk7DQorCXByaW50aygiXG4iKTsNCit9DQorDQordTgNCitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggQ2hhbm5lbA0KKwkpDQorew0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsNCisJdTggTWF4VHhQd3JJbkRibSA9IDI1NTsNCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkNCisJeyANCisJCXByaW50aygiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiBNYXhUeFB3ckluRGJtOyANCisJfQ0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pDQorCXsNCisJCU1heFR4UHdySW5EYm0gPSBwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W0NoYW5uZWxdOwkNCisJfQ0KKw0KKwlyZXR1cm4gTWF4VHhQd3JJbkRibTsNCit9DQorDQorDQordm9pZA0KK0RPVDExRF9TY2FuQ29tcGxldGUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2DQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKw0KKwlzd2l0Y2gocERvdDExZEluZm8tPlN0YXRlKQ0KKwl7DQorCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6DQorCQlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfRE9ORTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIERPVDExRF9TVEFURV9ET05FOg0KKwkJaWYoIEdFVF9DSUVfV0FUQ0hET0coZGV2KSA9PSAwICkNCisJCXsgLy8gUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4gDQorCQkJRG90MTFkX1Jlc2V0KGRldik7IA0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgRE9UMTFEX1NUQVRFX05PTkU6DQorCQlicmVhazsNCisJfQ0KK30NCisNCitpbnQgSXNMZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorDQorCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpDQorCXsgDQorCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7DQorCQlyZXR1cm4gMDsgDQorCX0NCisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkNCisJCXJldHVybiAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IFRvTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKykNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBkZWZhdWx0X2NobiA9IDA7DQorCXUzMiBpID0gMDsNCisNCisJZm9yIChpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJew0KKwkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkNCisJCXsNCisJCQlkZWZhdWx0X2NobiA9IGk7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkNCisJeyANCisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiBkZWZhdWx0X2NobjsgDQorCX0NCisJDQorCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApDQorCQlyZXR1cm4gY2hhbm5lbDsNCisJDQorCXJldHVybiBkZWZhdWx0X2NobjsNCit9DQorDQorI2lmIDANCitFWFBPUlRfU1lNQk9MKERvdDExZF9Jbml0KTsNCitFWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7DQorRVhQT1JUX1NZTUJPTChEb3QxMWRfVXBkYXRlQ291bnRyeUllKTsNCitFWFBPUlRfU1lNQk9MKERPVDExRF9HZXRNYXhUeFB3ckluRGJtKTsNCitFWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOw0KK0VYUE9SVF9TWU1CT0woSXNMZWdhbENoYW5uZWwpOw0KK0VYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOw0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiY2YxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9IDQorI2RlZmluZSBfX0lOQ19ET1QxMURfSA0KKw0KKyNpbmNsdWRlICJpZWVlODAyMTEuaCINCisNCisvLyNkZWZpbmUgRU5BQkxFX0RPVDExRA0KKw0KKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzDQorDQordHlwZWRlZiBzdHJ1Y3QgX0NITkxfVFhQT1dFUl9UUklQTEUgew0KKwl1OCBGaXJzdENobmw7DQorCXU4ICBOdW1DaG5sczsNCisJdTggIE1heFR4UG93ZXJJbkRibTsNCit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOw0KKw0KK3R5cGVkZWYgZW51bSBfRE9UMTFEX1NUQVRFIHsNCisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLA0KKwlET1QxMURfU1RBVEVfTEVBUk5FRCwNCisJRE9UMTFEX1NUQVRFX0RPTkUsDQorfURPVDExRF9TVEFURTsNCisNCit0eXBlZGVmIHN0cnVjdCBfUlRfRE9UMTFEX0lORk8gew0KKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsNCisNCisJYm9vbCBiRW5hYmxlZDsgLy8gZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkDQorDQorCXUxNiBDb3VudHJ5SWVMZW47IC8vID4gMCBpZiBDb3VudHJ5SWVCdWZbXSBjb250YWlucyB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuDQorCXU4ICBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07DQorCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuDQorCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsgDQorDQorCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pDQorCS8vdTggIENobmxMaXN0TGVuOyAvLyAjQnl0ZXMgdmFsaWQgaW4gQ2hubExpc3RbXS4NCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07DQorCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOw0KKw0KKwlET1QxMURfU1RBVEUgU3RhdGU7DQorfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOw0KKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApDQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQ0KKyNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkNCisNCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZA0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQ0KKw0KKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpIA0KKyNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGNwTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQ0KKw0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwNCisJKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbikgPyBcDQorCUZBTFNFIDogXA0KKwkoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwgKF9fSWUpLk9jdGV0LCAoX19JZSkuTGVuZ3RoKSkpDQorDQorI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQ0KKyNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVdhdGNoZG9nDQorI2RlZmluZSBSRVNFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDAgDQorI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpDQorDQorDQordm9pZA0KK0RvdDExZF9Jbml0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9SZXNldCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldg0KKwkpOw0KKw0KK3ZvaWQNCitEb3QxMWRfVXBkYXRlQ291bnRyeUllKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCAqCQlwVGFkZHIsDQorCXUxNglDb3V0cnlJZUxlbiwNCisJdTggKiBwQ291dHJ5SWUJIA0KKwkpOw0KKw0KK3U4DQorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4IENoYW5uZWwNCisJKTsNCisNCit2b2lkDQorRE9UMTFEX1NjYW5Db21wbGV0ZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYNCisJKTsNCisNCitpbnQgSXNMZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCitpbnQgVG9MZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCit2b2lkIGR1bXBfY2hubF9tYXAodTggKiBjaGFubmVsX21hcCk7DQorI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDZhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDE3NTUgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2VuZGlmCisKKy8qCisjaWZuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBpbnQKKyNlbmRpZgorCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZSAgIDEKKyNlbmRpZgorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAwCisjZW5kaWYKKyovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisjaWZuZGVmIGJvb2wKK3R5cGVkZWYgZW51bXtmYWxzZSA9IDAsIHRydWV9IGJvb2w7CisjZW5kaWYKKyNlbmRpZgorLy8jaWZkZWYgSk9ITl9IV1NFQworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKy8vI2VuZGlmCisKKworI2RlZmluZSBhU2lmc1RpbWUJCQkJCTEwCisKKyNkZWZpbmUgTUdNVF9RVUVVRV9OVU0gNQorCisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKworCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DCQkJMgorCisKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECQk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECQk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTApKQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4gaWVlZTgwMjExX3d4X2dldF9zY2FuX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdCB1bmRlciBGQzUKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9uYW1lICAgaWVlZTgwMjExX3d4X2dldF9uYW1lX3J0bAorI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICBmcmVlX2llZWU4MDIxMV9ydGwKKyNkZWZpbmUgYWxsb2NfaWVlZTgwMjExICAgICAgICBhbGxvY19pZWVlODAyMTFfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYKKy8vZXJyb3IgaW4gdWJ1bnR1Mi42LjIyLHNvIGFkZCB0aGVzZQorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBpZWVlODAyMTFfd2FrZV9xdWV1ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgaWVlZTgwMjExX3N0b3BfcXVldWVfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IGllZWU4MDIxMV9yeF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQlpZWVlODAyMTFfdHhiX2ZyZWVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZXNzaWQJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJaWVlZTgwMjExX3d4X3NldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3JhdGUJaWVlZTgwMjExX3d4X2dldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAlpZWVlODAyMTFfd3hfc2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJaWVlZTgwMjExX3d4X2dldF93YXBfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbW9kZQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbglpZWVlODAyMTFfd3hfc2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZnJlcQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJaWVlZTgwMjExX3d4X3NldF9yYXd0eF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcglpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCWllZWU4MDIxMV93eF9nZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzCWllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbAkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoIGllZWU4MDIxMV93eF9zZXRfYXV0aF9ydGwKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBub3RpZnlfd3hfYXNzb2NfZXZlbnQgIG5vdGlmeV93eF9hc3NvY19ldmVudF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2NhbiBpZWVlODAyMTFfc3RhcnRfc2Nhbl9ydGwKKy8vYnkgYW15IGZvciBwcwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisgICAgICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCSAgICAgICAgc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisgICAgCQkJaW50IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU5dOworCQkJdTggc2V0X3R4OworCQkJdTMyIGVycjsKKwkJCXU4IGlkeDsKKwkJCXU4IHNlcVs4XTsgLyogc2VxdWVuY2UgY291bnRlciAoc2V0OiBSWCwgZ2V0OiBUWCkgKi8KKwkJCXUxNiBrZXlfbGVuOworCQkJdTgga2V5WzBdOworCQl9IGNyeXB0OworCisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworLy8gbGludXggdW5kZXIgMi42LjkgcmVsZWFzZSBtYXkgbm90IHN1cHBvcnQgaXQsIHNvIG1vZGlmeSBpdCBmb3IgY29tbW9uIHVzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCisjZGVmaW5lIE1TRUNTKHQpCSgxMDAwICogKCh0KSAvIEhaKSArIDEwMDAgKiAoKHQpICUgSFopIC8gSFopCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKHVuc2lnbmVkIGludCBtc2VjcykKK3sKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7CisKKyAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gdGltZW91dDsKK30KKyNlbHNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworCisKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4JCQkzMAorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOCQkoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisKKy8qIHRoaXMgaXMgc3RvbGVuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBtYWR3aWZpIGRyaXZlciovCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLCQkweDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkweDA4CisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCTB4QjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSBcCisJKCgoZmMpICYgKElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spKSA9PSBcCisJIChJRUVFODAyMTFfRkMwX1RZUEVfREFUQSB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MpKQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyICovCisjZGVmaW5lIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFIDMxCitzdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bVsxN107CisJdTE2IGZyYWdfbnVtWzE3XTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lWzE3XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gZWFwX3R5cGUgeworCUVBUF9QQUNLRVQgPSAwLAorCUVBUE9MX1NUQVJULAorCUVBUE9MX0xPR09GRiwKKwlFQVBPTF9LRVksCisJRUFQT0xfRU5DQVBfQVNGX0FMRVJUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7CisJW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKKwlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCisJW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCisJW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCisJW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUJTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9EU1RPRFMJCTB4MDMwMCAvL2FkZGVkIGJ5IGRhdmlkCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfU0VRCQkweEZGRjAKKworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAlYyAlcyAiIGZtdCwgXAorICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworLyoKKyAqIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOworICoKKyAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKKyAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZjoKKyAqCisgKiAjZGVmaW5lIElFRUU4MDIxMV9ETF94eHh4IFZBTFVFCisgKgorICogc2hpZnRpbmcgdmFsdWUgdG8gdGhlIGxlZnQgb25lIGJpdCBmcm9tIHRoZSBwcmV2aW91cyBlbnRyeS4gIHh4eHggc2hvdWxkIGJlCisgKiB0aGUgbmFtZSBvZiB0aGUgY2xhc3NpZmljYXRpb24gKGZvciBleGFtcGxlLCBXRVApCisgKgorICogWW91IHRoZW4gbmVlZCB0byBlaXRoZXIgYWRkIGEgSUVFRTgwMjExX3h4eHhfREVCVUcoKSBtYWNybyBkZWZpbml0aW9uIGZvciB5b3VyCisgKiBjbGFzc2lmaWNhdGlvbiwgb3IgdXNlIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfeHh4eCwgLi4uKSB3aGVuZXZlciB5b3Ugd2FudAorICogdG8gc2VuZCBvdXRwdXQgdG8gdGhhdCBjbGFzc2lmaWNhdGlvbi4KKyAqCisgKiBUbyBhZGQgeW91ciBkZWJ1ZyBsZXZlbCB0byB0aGUgbGlzdCBvZiBsZXZlbHMgc2VlbiB3aGVuIHlvdSBwZXJmb3JtCisgKgorICogJSBjYXQgL3Byb2MvbmV0L2lwdy9kZWJ1Z19sZXZlbAorICoKKyAqIHlvdSBzaW1wbHkgbmVlZCB0byBhZGQgeW91ciBlbnRyeSB0byB0aGUgaXB3X2RlYnVnX2xldmVscyBhcnJheS4KKyAqCisgKiBJZiB5b3UgZG8gbm90IHNlZSBkZWJ1Z19sZXZlbCBpbiAvcHJvYy9uZXQvaXB3IHRoZW4geW91IGRvIG5vdCBoYXZlCisgKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGRlZmluZWQgaW4geW91ciBrZXJuZWwgY29uZmlndXJhdGlvbgorICoKKyAqLworCisjZGVmaW5lIElFRUU4MDIxMV9ETF9JTkZPICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfRExfV1ggICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NDQU4gICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TVEFURSAgICAgICAgICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfRExfTUdNVCAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0ZSQUcgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9FQVAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBJRUVFODAyMTFfRExfRFJPUCAgICAgICAgICAoMTw8NykKKworI2RlZmluZSBJRUVFODAyMTFfRExfVFggICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1JYICAgICAgICAgICAgKDE8PDkpCisKKyNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKKworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQorLy8jZGVmaW5lIElFRUVfREVCVUdfU0NBTiAgSUVFRTgwMjExX1dBUk5JTkcKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NUQVRFKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NUQVRFLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfTUdNVChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9NR01ULCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRlJBRyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9GUkFHLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRUFQKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VBUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0RST1AoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRFJPUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1RYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUlgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlgsIGYsICMjIGEpCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworICAgICAgICB1OCAgICBkc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisgICAgICAgIHU4ICAgIHNzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworICAgICAgICB1OCAgICBvdWlbUDgwMjExX09VSV9MRU5dOyAgICAvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQorCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgV0xBTl9BVVRIX09QRU4gMAorI2RlZmluZSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAxCisKKyNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CisKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UICgxPDwxMCkKKworLyogU3RhdHVzIGNvZGVzICovCisjZGVmaW5lIFdMQU5fU1RBVFVTX1NVQ0NFU1MgMAorI2RlZmluZSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFIDEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQ0FQU19VTlNVUFBPUlRFRCAxMAorI2RlZmluZSBXTEFOX1NUQVRVU19SRUFTU09DX05PX0FTU09DIDExCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUMgMTIKKyNkZWZpbmUgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRyAxMworI2RlZmluZSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT04gMTQKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUwgMTUKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VUIDE2CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FQX1VOQUJMRV9UT19IQU5ETEVfTkVXX1NUQSAxNworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgMTgKKy8qIDgwMi4xMWIgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlQgMTkKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PUEJDQyAyMAorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9BR0lMSVRZIDIxCisKKy8qIFJlYXNvbiBjb2RlcyAqLworI2RlZmluZSBXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCAxCisjZGVmaW5lIFdMQU5fUkVBU09OX1BSRVZfQVVUSF9OT1RfVkFMSUQgMgorI2RlZmluZSBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyAzCisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZIDQKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfQVBfQlVTWSA1CisjZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBIDYKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBIDcKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfU1RBX0hBU19MRUZUIDgKKyNkZWZpbmUgV0xBTl9SRUFTT05fU1RBX1JFUV9BU1NPQ19XSVRIT1VUX0FVVEggOQorCisKKy8qIEluZm9ybWF0aW9uIEVsZW1lbnQgSURzICovCisjZGVmaW5lIFdMQU5fRUlEX1NTSUQgMAorI2RlZmluZSBXTEFOX0VJRF9TVVBQX1JBVEVTIDEKKyNkZWZpbmUgV0xBTl9FSURfRkhfUEFSQU1TIDIKKyNkZWZpbmUgV0xBTl9FSURfRFNfUEFSQU1TIDMKKyNkZWZpbmUgV0xBTl9FSURfQ0ZfUEFSQU1TIDQKKyNkZWZpbmUgV0xBTl9FSURfVElNIDUKKyNkZWZpbmUgV0xBTl9FSURfSUJTU19QQVJBTVMgNgorI2RlZmluZSBXTEFOX0VJRF9DSEFMTEVOR0UgMTYKKyNkZWZpbmUgV0xBTl9FSURfUlNOIDQ4CisjZGVmaW5lIFdMQU5fRUlEX0dFTkVSSUMgMjIxCisKKyNkZWZpbmUgSUVFRTgwMjExX01HTVRfSERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfREFUQV9IRFIzX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfREFUQV9IRFI0X0xFTiAzMAorCisKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JTU0kgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JBVEUgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19XRU1BU0sgMHg3CisKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04gICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04gICAoMTw8MSkKKworI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfQkFORCAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV81MkdIWl9CQU5EICAgICAoMTw8MSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICAJCTQKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQgkJICAgICAgICAweDAyCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUIJCSAgICAgICAgMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkgICAgICAgIDB4MEIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUIJCSAgICAgICAgMHgxNgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiAJCTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV82TUIJCSAgICAgICAgMHgwQworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQgkJICAgICAgICAweDEyCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQgkJMHgxOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUIJCTB4MjQKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8yNE1CCQkweDMwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQgkJMHg0OAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUIJCTB4NjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CCQkweDZDCisjZGVmaW5lIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sJCTB4ODAKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sJCSgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0sJCSgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CX01BU0sJCSgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLCQkoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSwkJKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sJCSgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSwkJKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLCQkoMTw8NykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8yNE1CX01BU0sJCSgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUJfTUFTSwkJKDE8PDkpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLCQkoMTw8MTApCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLCQkoMTw8MTEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFU19NQVNLCSAgICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sgfCBcCisgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSykKKworI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFU19NQVNLCQkweDAwMDAwRkYwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8yNE1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLICB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfUkFURVNfTUFTSyAoSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSykKKworI2RlZmluZSBJRUVFODAyMTFfTlVNX09GRE1fUkFURVMJICAgIDgKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9DQ0tfUkFURVMJICAgICAgICAgICAgNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EgICAgICAgICA0CisKKworCisKKy8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcworICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCisgKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLworc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7CisJdTMyIG1hY190aW1lWzJdOworCXU4IHNpZ25hbHN0cmVuZ3RoOworCXM4IHJzc2k7CisJdTggc2lnbmFsOworCXU4IG5vaXNlOworCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLworCXU4IHJlY2VpdmVkX2NoYW5uZWw7CisJdTggY29udHJvbDsKKwl1OCBtYXNrOworCXU4IGZyZXE7CisJdTE2IGxlbjsKKwl1OCBuaWNfdHlwZTsKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzeworCXVuc2lnbmVkIGludCByeF9hc3Nfb2s7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19lcnI7CisJdW5zaWduZWQgaW50IHJ4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9yczsKKwl1bnNpZ25lZCBpbnQgdHhfYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19lcnI7CisJdW5zaWduZWQgaW50IHR4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IG5vX2F1dGhfcnM7CisJdW5zaWduZWQgaW50IG5vX2Fzc19yczsKKwl1bnNpZ25lZCBpbnQgdHhfYXNzX3JxOworCXVuc2lnbmVkIGludCByeF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCByZWFzc29jOworCXVuc2lnbmVkIGludCBzd3R4c3RvcDsKKwl1bnNpZ25lZCBpbnQgc3d0eGF3YWtlOworfTsKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7CisKKyNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorCisjZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCisjZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KKworI2RlZmluZSBXRVBfS0VZUyA0CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisKKyNkZWZpbmUgV0VQX0tFWV9MRU5fTU9ESUYgMzIKKworc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7CisJdTE2IGFjdGl2ZV9rZXk6MiwKKyAgICAgICAgICAgIGVuYWJsZWQ6MSwKKwkgICAgYXV0aF9tb2RlOjIsCisgICAgICAgICAgICBhdXRoX2FsZ286NCwKKyAgICAgICAgICAgIHVuaWNhc3RfdXNlc19ncm91cDoxOworCXU4IGtleV9zaXplc1tXRVBfS0VZU107CisJdTgga2V5c1tXRVBfS0VZU11bV0VQX0tFWV9MRU5fTU9ESUZdOworCXU4IGxldmVsOworCXUxNiBmbGFnczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qCisKKyA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCisKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAorICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKworVG90YWw6IDI4LTIzNDAgYnl0ZXMKKworKi8KKworc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbNl07CisJdTggYWRkcjJbNl07CisJdTggYWRkcjNbNl07CisJdTE2IHNlcV9jdHJsOworfTsKKworI2RlZmluZSBCRUFDT05fUFJPQkVfU1NJRF9JRF9QT1NJVElPTiAxMgorCisvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KKyNkZWZpbmUgTUZJRV9UWVBFX1NTSUQgICAgICAgMAorI2RlZmluZSBNRklFX1RZUEVfUkFURVMgICAgICAxCisjZGVmaW5lIE1GSUVfVFlQRV9GSF9TRVQgICAgIDIKKyNkZWZpbmUgTUZJRV9UWVBFX0RTX1NFVCAgICAgMworI2RlZmluZSBNRklFX1RZUEVfQ0ZfU0VUICAgICA0CisjZGVmaW5lIE1GSUVfVFlQRV9USU0gICAgICAgIDUKKyNkZWZpbmUgTUZJRV9UWVBFX0lCU1NfU0VUICAgNgorI2RlZmluZSBNRklFX1RZUEVfQ09VTlRSWSAgNyAvLytZSiwwODA2MjUKKyNkZWZpbmUgTUZJRV9UWVBFX0NIQUxMRU5HRSAgMTYKKyNkZWZpbmUgTUZJRV9UWVBFX0VSUCAgICAgICAgNDIKKyNkZWZpbmUgTUZJRV9UWVBFX1JTTgkgICAgIDQ4CisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFU19FWCAgIDUwCisjZGVmaW5lIE1GSUVfVFlQRV9HRU5FUklDICAgIDIyMQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAordHlwZWRlZiBlbnVtCit7CisJQ09VTlRSWV9DT0RFX0ZDQyA9IDAsCisJQ09VTlRSWV9DT0RFX0lDID0gMSwKKwlDT1VOVFJZX0NPREVfRVRTSSA9IDIsCisJQ09VTlRSWV9DT0RFX1NQQUlOID0gMywKKwlDT1VOVFJZX0NPREVfRlJBTkNFID0gNCwKKwlDT1VOVFJZX0NPREVfTUtLID0gNSwKKwlDT1VOVFJZX0NPREVfTUtLMSA9IDYsCisJQ09VTlRSWV9DT0RFX0lTUkFFTCA9IDcsCisJQ09VTlRSWV9DT0RFX1RFTEVDID0gOCwKKwlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTiA9IDksCisJQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTNfSU5ERVggPSAxMAorfWNvdW50cnlfY29kZV90eXBlX3Q7CisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIHsKKwl1OCBpZDsKKwl1OCBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgeworCXU4IGlkOworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKyAqCisJdTE2IGF1dGhfYWxnb3JpdGhtOworCXUxNiBhdXRoX3NlcXVlbmNlOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwlzdHJ1Y3QgeworCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURSAxMAorCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwl1MTYgYWxnb3JpdGhtOworCXUxNiB0cmFuc2FjdGlvbjsKKwl1MTYgc3RhdHVzOworCS8vc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgeworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdHk7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJLypzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Ki8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCS8vdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IHN0YXR1czsKKwl1MTYgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsgLyogc3VwcG9ydGVkIHJhdGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZXsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworICAgICAgICB1MTYgICAgcmVhc29uY29kZTsKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTE2IHJlc2VydmVkOworCXUxNiBmcmFnX3NpemU7CisJdTE2IHBheWxvYWRfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ21lbnRzWzBdOworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0geworCXU4IGFjX2FjaV9hY21fYWlmc247CisJdTggYWNfZWN3bWluX2Vjd21heDsKKwl1MTYgYWNfdHhvcF9saW1pdDsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8geworCXU4IGFjX2Rpcl90aWQ7CisJdTggYWNfdXBfcHNiOworCXU4IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfd21tX3RzcGVjX2VsZW0geworCXN0cnVjdCBpZWVlODAyMTFfd21tX3RzX2luZm8gdHNfaW5mbzsKKwl1MTYgbm9ybV9tc2R1X3NpemU7CisJdTE2IG1heF9tc2R1X3NpemU7CisJdTMyIG1pbl9zZXJ2X2ludGVyOworCXUzMiBtYXhfc2Vydl9pbnRlcjsKKwl1MzIgaW5hY3RfaW50ZXI7CisJdTMyIHN1c3Blbl9pbnRlcjsKKwl1MzIgc2Vydl9zdGFydF90aW1lOworCXUzMiBtaW5fZGF0YV9yYXRlOworCXUzMiBtZWFuX2RhdGFfcmF0ZTsKKwl1MzIgcGVha19kYXRhX3JhdGU7CisJdTMyIG1heF9idXJzdF9zaXplOworCXUzMiBkZWxheV9ib3VuZDsKKwl1MzIgbWluX3BoeV9yYXRlOworCXUxNiBzdXJwX2JhbmRfYWxsb3c7CisJdTE2IG1lZGl1bV90aW1lOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIHtXTU1fYWxsX2ZyYW1lLCBXTU1fdHdvX2ZyYW1lLCBXTU1fZm91cl9mcmFtZSwgV01NX3NpeF9mcmFtZX07CisjZGVmaW5lIE1BWF9TUF9MZW4gIChXTU1fYWxsX2ZyYW1lIDw8IDQpCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfVElEIDB4MGYKKyNkZWZpbmUgUU9TX0NUTF9OT1RDT05UQUlOX0FDSyAoMHgwMSA8PCA1KQorCisvKiBTV0VFUCBUQUJMRSBFTlRSSUVTIE5VTUJFUiovCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFUwkJICA0MgorI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVNfUEVSX1BBQ0tFVCAgNworLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCisgKiBvbmx5IHVzZSA4LCBhbmQgdGhlbiB1c2UgZXh0ZW5kZWQgcmF0ZXMgZm9yIHRoZSByZW1haW5pbmcgc3VwcG9ydGVkCisgKiByYXRlcy4gIE90aGVyIEFQcywgaG93ZXZlciwgc3RpY2sgYWxsIG9mIHRoZWlyIHN1cHBvcnRlZCByYXRlcyBvbiB0aGUKKyAqIG1haW4gcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudC4uLiAqLworI2RlZmluZSBNQVhfUkFURVNfTEVOR1RIICAgICAgICAgICAgICAgICAgKCh1OCkxMikKKyNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSCAgICAgICAgICAgICAgICgodTgpMTYpCisjZGVmaW5lIE1BWF9ORVRXT1JLX0NPVU5UICAgICAgICAgICAgICAgICAgMTI4CisvLyNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNQkVSICAgICAgICAgICAgICAgICAxNjEKKyNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNQkVSICAgICAgICAgICAgICAgICAxNjUgLy9ZSixtb2RpZmllZCwwODA2MjUKKyNkZWZpbmUgTUFYX0lFX0xFTgkJCQkJCTB4RkYgLy8rWUosMDgwNjI1CisKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMX0xJU1R7CisJdTgJQ2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxXTsKKwl1OAlMZW47Cit9Q0hBTk5FTF9MSVNULCAqUENIQU5ORUxfTElTVDsKKworI2RlZmluZSBJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUJICAxMDAvLzQwMAorLy8oSFogLyAyKQorLy9ieSBhbXkgZm9yIHBzCisjZGVmaW5lIElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSAgICAyMDAwCisvL2J5IGFteSBmb3IgcHMKKy8vYnkgYW15IGZvciBhbnRlbm5hCisjZGVmaW5lIEFOVEVOTkFfRElWRVJTSVRZX1RJTUVSX1BFUklPRAkJMTAwMCAvLyAxMDAwIG0KKy8vYnkgYW15IGZvciBhbnRlbm5hCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUgKEhaICogMikKKworI2RlZmluZSBDUkNfTEVOR1RIICAgICAgICAgICAgICAgICA0VQorCisjZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0CisKKyNkZWZpbmUgTkVUV09SS19FTVBUWV9FU1NJRCAoMTw8MCkKKyNkZWZpbmUgTkVUV09SS19IQVNfT0ZETSAgICAoMTw8MSkKKyNkZWZpbmUgTkVUV09SS19IQVNfQ0NLICAgICAoMTw8MikKKworI2RlZmluZSBJRUVFODAyMTFfRFRJTV9NQkNBU1QgNAorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9VQ0FTVCAyCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1ZBTElEIDEKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fSU5WQUxJRCAwCisKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0RJU0FCTEVEIDAKKyNkZWZpbmUgSUVFRTgwMjExX1BTX1VOSUNBU1QgSUVFRTgwMjExX0RUSU1fVUNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX01CQ0FTVCBJRUVFODAyMTFfRFRJTV9NQkNBU1QKKyNkZWZpbmUgSUVFRTgwMjExX1BTX0VOQUJMRSAgIElFRUU4MDIxMV9EVElNX1ZBTElECisvL2FkZGVkIGJ5IERhdmlkIGZvciBRb1MgMjAwNi82LzMwCisvLyNkZWZpbmUgV01NX0hhbmdfODE4NworI2lmZGVmIFdNTV9IYW5nXzgxODcKKyN1bmRlZiBXTU1fSGFuZ184MTg3CisjZW5kaWYKKworI2RlZmluZSBXTUVfQUNfQkUgICAweDAwCisjZGVmaW5lIFdNRV9BQ19CSyAgIDB4MDEKKyNkZWZpbmUgV01FX0FDX1ZJICAgMHgwMgorI2RlZmluZSBXTUVfQUNfVk8gICAweDAzCisjZGVmaW5lIFdNRV9BQ0lfTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BSUZTTl9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FDX1BSQU1fTEVOIDE2CisKKy8vVVAgTWFwcGluZyB0byBBQywgdXNpbmcgaW4gTWdudFF1ZXJ5X1NlcXVlbmNlTnVtYmVyKCkgYW5kIG1heWJlIGZvciBEU0NQCisvLyNkZWZpbmUgVVAyQUModXApCSgodXA8MykgPyAoKHVwPT0wKT8xOjApIDogKHVwPj4xKSkKKyNkZWZpbmUgVVAyQUModXApICgJCSAgIFwKKwkoKHVwKSA8IDEpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgMykgPyBXTUVfQUNfQksgOiBcCisJKCh1cCkgPCA0KSA/IFdNRV9BQ19CRSA6IFwKKwkoKHVwKSA8IDYpID8gV01FX0FDX1ZJIDogXAorCVdNRV9BQ19WTykKKy8vQUMgTWFwcGluZyB0byBVUCwgdXNpbmcgaW4gVHggcGFydCBmb3Igc2VsZWN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIFRYIHF1ZXVlCisjZGVmaW5lIEFDMlVQKF9hYykJKCAgICAgICBcCisJKChfYWMpID09IFdNRV9BQ19WTykgPyA2IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfVkkpID8gNSA6IFwKKwkoKF9hYykgPT0gV01FX0FDX0JLKSA/IDEgOiBcCisJMCkKKworI2RlZmluZQlFVEhFUl9BRERSX0xFTgkJNgkvKiBsZW5ndGggb2YgYW4gRXRoZXJuZXQgYWRkcmVzcyAqLworc3RydWN0CWV0aGVyX2hlYWRlciB7CisJdTggZXRoZXJfZGhvc3RbRVRIRVJfQUREUl9MRU5dOworCXU4IGV0aGVyX3Nob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1MTYgZXRoZXJfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNpZm5kZWYgRVRIRVJUWVBFX1BBRQorI2RlZmluZQlFVEhFUlRZUEVfUEFFCTB4ODg4ZQkJLyogRUFQT0wgUEFFLzgwMi4xeCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUAorI2RlZmluZQlFVEhFUlRZUEVfSVAJMHgwODAwCQkvKiBJUCBwcm90b2NvbCAqLworI2VuZGlmCisKK3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayB7CisJLyogVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHVuaXF1ZSBuZXR3b3JrICovCisJdTggYnNzaWRbRVRIX0FMRU5dOworCXU4IGNoYW5uZWw7CisJLyogRW5zdXJlIG51bGwtdGVybWluYXRlZCBmb3IgYW55IGRlYnVnIG1zZ3MgKi8KKwl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJdTggc3NpZF9sZW47CisKKwkvKiBUaGVzZSBhcmUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0czsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCByYXRlc1tNQVhfUkFURVNfTEVOR1RIXTsKKwl1OCByYXRlc19sZW47CisJdTggcmF0ZXNfZXhbTUFYX1JBVEVTX0VYX0xFTkdUSF07CisJdTggcmF0ZXNfZXhfbGVuOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zY2FubmVkOworCXU4IG1vZGU7CisJdTggZmxhZ3M7CisJdTMyIGxhc3RfYXNzb2NpYXRlOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1MTYgYXRpbV93aW5kb3c7CisJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCByc25faWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCByc25faWVfbGVuOworCXU4IGR0aW1fcGVyaW9kOworCXU4IGR0aW1fZGF0YTsKKwl1MzIgbGFzdF9kdGltX3N0YV90aW1lWzJdOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvL2FwcGVkZWQgZm9yIFFvUworCXU4IHdtbV9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHdtbV9wYXJhbVs0XTsKKwl1OCBRb1NfRW5hYmxlOworCXU4IFNpZ25hbFN0cmVuZ3RoOworLy9ieSBhbXkgMDgwMzEyCisJdTggSGlnaGVzdE9wZXJhUmF0ZTsKKy8vYnkgYW15IDA4MDMxMgorI2lmZGVmIFRIT01BU19UVVJCTworCXU4IFR1cmJvX0VuYWJsZTsvL2VuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1MTYgQ291bnRyeUllTGVuOworCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKyNlbmRpZgorfTsKKworZW51bSBpZWVlODAyMTFfc3RhdGUgeworCisJLyogdGhlIGNhcmQgaXMgbm90IGxpbmtlZCBhdCBhbGwgKi8KKwlJRUVFODAyMTFfTk9MSU5LID0gMCwKKworCS8qIElFRUU4MDIxMV9BU1NPQ0lBVElORyogYXJlIGZvciBCU1MgY2xpZW50IG1vZGUKKwkgKiB0aGUgZHJpdmVyIHNoYWxsIG5vdCBwZXJmb3JtIFJYIGZpbHRlcmluZyB1bmxlc3MKKwkgKiB0aGUgc3RhdGUgaXMgTElOS0VELgorCSAqIFRoZSBkcml2ZXIgc2hhbGwganVzdCBjaGVjayBmb3IgdGhlIHN0YXRlIExJTktFRCBhbmQKKwkgKiBkZWZhdWx0cyB0byBOT0xJTksgZm9yIEFMTCB0aGUgb3RoZXIgc3RhdGVzIChpbmNsdWRpbmcKKwkgKiBMSU5LRURfU0NBTk5JTkcpCisJICovCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdpbGwgc3RhcnQgKHdxIHNjaGVkdWxpbmcpKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkcsCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBpcyBzZW5kaW5nIEFVVEggcmVxdWVzdCovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HLAorCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSBoYXMgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRjYXRlZAorCSAqIGFuZCBpcyBzZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3QKKwkgKi8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRCwKKworCS8qIHRoZSBsaW5rIGlzIG9rLiB0aGUgY2FyZCBhc3NvY2lhdGVkIHRvIGEgQlNTIG9yIGxpbmtlZAorCSAqIHRvIGEgaWJzcyBjZWxsIG9yIGFjdGluZyBhcyBhbiBBUCBhbmQgY3JlYXRpbmcgdGhlIGJzcworCSAqLworCUlFRUU4MDIxMV9MSU5LRUQsCisKKwkvKiBzYW1lIGFzIExJTktFRCwgYnV0IHRoZSBkcml2ZXIgc2hhbGwgYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgYXMgd2UgYXJlIGluIE5PX0xJTksgbW9kZS4gQXMgdGhlIGNhcmQgaXMgc3RpbGwKKwkgKiBsb2dpY2FsbHkgbGlua2VkLCBidXQgaXQgaXMgZG9pbmcgYSBzeW5jcm8gc2l0ZSBzdXJ2ZXkKKwkgKiB0aGVuIGl0IHdpbGwgYmUgYmFjayB0byBMSU5LRUQgc3RhdGUuCisJICovCisJSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORywKKworfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKKyNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgorI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkpCitleHRlcm4gaW5saW5lIGludCBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKyAgICAgICAgcmV0dXJuICgoYWRkclswXSAhPSAweGZmKSAmJiAoMHgwMSAmIGFkZHJbMF0pKTsKK30KKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQorZXh0ZXJuIGlubGluZSBpbnQgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCit7CisJcmV0dXJuICgoYWRkclswXSA9PSAweGZmKSAmJiAoYWRkclsxXSA9PSAweGZmKSAmJiAoYWRkclsyXSA9PSAweGZmKSAmJiAgIFwKKwkJKGFkZHJbM10gPT0gMHhmZikgJiYgKGFkZHJbNF0gPT0gMHhmZikgJiYgKGFkZHJbNV0gPT0gMHhmZikpOworfQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKwordHlwZWRlZiBzdHJ1Y3QgdHhfcGVuZGluZ190eworCWludCBmcmFnOworCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7Cit9dHhfcGVuZGluZ190OworCisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJLyogQm9va2tlZXBpbmcgc3RydWN0dXJlcyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgaWVlZV9zdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHMgc29mdG1hY19zdGF0czsKKworCS8qIFByb2JlIC8gQmVhY29uIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfZnJlZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19saXN0OworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29ya3M7CisJaW50IHNjYW5zOworCWludCBzY2FuX2FnZTsKKworCWludCBpd19tb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAoSVdfTU9ERV8qKSAqLworCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOworCisJaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAorCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCisJdTMyIGNvbmZpZzsKKworCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KKwlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLworCisJaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCisJCQkJICogV0VQIGtleSBjaGFuZ2VzICovCisKKwkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KKwlpbnQgaG9zdF9lbmNyeXB0OworCWludCBob3N0X2RlY3J5cHQ7CisJaW50IGllZWU4MDJfMXg7IC8qIGlzIElFRUUgODAyLjFYIHVzZWQgKi8KKworCS8qIFdQQSBkYXRhICovCisJaW50IHdwYV9lbmFibGVkOworCWludCBkcm9wX3VuZW5jcnlwdGVkOworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgcHJpdmFjeV9pbnZva2VkOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICp3cGFfaWU7CisKKwl1OCBhcF9tYWNfYWRkcls2XTsKKwl1MTYgcGFpcndpc2Vfa2V5X3R5cGU7CisJdTE2IGJyb2FkY2FzdF9rZXlfdHlwZTsKKworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfZGVpbml0X2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdFtXRVBfS0VZU107CisJaW50IHR4X2tleWlkeDsgLyogZGVmYXVsdCBUWCBrZXkgaW5kZXggKGNyeXB0W3R4X2tleWlkeF0pICovCisJc3RydWN0IHRpbWVyX2xpc3QgY3J5cHRfZGVpbml0X3RpbWVyOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLworCS8vIGVhY2ggc3RyZWFtaW5nIGNvbnRhaW4gYSBlbnRyeQorCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlWzE3XVtJRUVFODAyMTFfRlJBR19DQUNIRV9MRU5dOworCXVuc2lnbmVkIGludCBmcmFnX25leHRfaWR4WzE3XTsKKwl1MTYgZnRzOyAvKiBGcmFnbWVudGF0aW9uIFRocmVzaG9sZCAqLworCisJLyogVGhpcyBzdG9yZXMgaW5mb3MgZm9yIHRoZSBjdXJyZW50IG5ldHdvcmsuCisJICogRWl0aGVyIHRoZSBuZXR3b3JrIHdlIGFyZSBhc3NvY2lhdGVkIGluIElORlJBU1RSVUNUVVJFCisJICogb3IgdGhlIG5ldHdvcmsgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgaW4gTUFTVEVSIG1vZGUuCisJICogYWQtaG9jIGlzIGEgbWl4dHVyZSA7LSkuCisJICogTm90ZSB0aGF0IGluIGluZnJhc3RydWN0dXJlIG1vZGUsIGV2ZW4gd2hlbiBub3QgYXNzb2NpYXRlZCwKKwkgKiBmaWVsZHMgYnNzaWQgYW5kIGVzc2lkIG1heSBiZSB2YWxpZCAoaWYgd3BhX3NldCBhbmQgZXNzaWRfc2V0CisJICogYXJlIHRydWUpIGFzIHRoeSBjYXJyeSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIHZpYSBpd2NvbmZpZworCSAqLworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBjdXJyZW50X25ldHdvcms7CisKKworCWVudW0gaWVlZTgwMjExX3N0YXRlIHN0YXRlOworCisJaW50IHNob3J0X3Nsb3Q7CisJaW50IG1vZGU7ICAgICAgIC8qIEEsIEIsIEcgKi8KKwlpbnQgbW9kdWxhdGlvbjsgLyogQ0NLLCBPRkRNICovCisJaW50IGZyZXFfYmFuZDsgIC8qIDIuNEdoeiwgNS4yR2h6LCBNaXhlZCAqLworCWludCBhYmdfdHJ1ZTsgICAvKiBBQkcgZmxhZyAgICAgICAgICAgICAgKi8KKworCS8qIHVzZWQgZm9yIGZvcmNpbmcgdGhlIGlic3Mgd29ya3F1ZXVlIHRvIHRlcm1pbmF0ZQorCSAqIHdpdGhvdXQgd2FpdCBmb3IgdGhlIHN5bmNybyBzY2FuIHRvIHRlcm1pbmF0ZQorCSAqLworCXNob3J0IHN5bmNfc2Nhbl9odXJyeXVwOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXZvaWQgKiBwRG90MTFkSW5mbzsKKwlib29sIGJHbG9iYWxEb21haW47CisKKwkvLyBGb3IgTGl0ZW9uIENoMTJ+MTMgcGFzc2l2ZSBzY2FuCisJdTgJTWluUGFzc2l2ZUNobmxOdW07CisJdTgJSWJzc1N0YXJ0Q2hubDsKKyNlbHNlCisJLyogbWFwIG9mIGFsbG93ZWQgY2hhbm5lbHMuIDAgaXMgZHVtbXkgKi8KKwkvLyBGSVhNRTogcmVtZWJlciB0byBkZWZhdWx0IHRvIGEgYmFzaWMgY2hhbm5lbCBwbGFuIGRlcGVuZGluZyBvZiB0aGUgUEhZIHR5cGUKKwlpbnQgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworI2VuZGlmCisKKwlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCisJaW50IGJhc2ljX3JhdGU7CisJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcworCXNob3J0IGFjdGl2ZV9zY2FuOworCisJLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLworCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOworCisJLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLworCXUxNiBzZXFfY3RybFs1XTsKKworCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgYXNzb2NpYXRlX3NlcTsKKworCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCisJdTE2IGFzc29jX2lkOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLworCXNob3J0IHBzOworCXNob3J0IHN0YV9zbGVlcDsKKwlpbnQgcHNfdGltZW91dDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcHNfdGFzazsKKwl1MzIgcHNfdGg7CisJdTMyIHBzX3RsOworCisJc2hvcnQgcmF3X3R4OworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXNob3J0IHF1ZXVlX3N0b3A7CisJc2hvcnQgc2Nhbm5pbmc7CisJc2hvcnQgcHJvdG9fc3RhcnRlZDsKKworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2Nhbl9zZW07CisKKwlzcGlubG9ja190IG1nbXRfdHhfbG9jazsKKwlzcGlubG9ja190IGJlYWNvbl9sb2NrOworCisJc2hvcnQgYmVhY29uX3R4aW5nOworCisJc2hvcnQgd2FwX3NldDsKKwlzaG9ydCBzc2lkX3NldDsKKworCXU4ICB3cGF4X3R5cGVfc2V0OyAgICAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI4fQorCXUzMiB3cGF4X3R5cGVfbm90aWZ5OyAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI2fQorCisJLyogUW9TIHJlbGF0ZWQgZmxhZyAqLworCWNoYXIgaW5pdF93bW1wYXJhbV9mbGFnOworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIElCU1MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlic3NfbWFjX2hhc2hbSUVFRV9JQlNTX01BQ19IQVNIX1NJWkVdOworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIEJTUyAqLworCXUxNiBsYXN0X3J4c2VxX251bVsxN107IC8qIHJ4IHNlcSBwcmV2aW91cyBwZXItdGlkICovCisJdTE2IGxhc3RfcnhmcmFnX251bVsxN107LyogdHggZnJhZyBwcmV2aW91cyBwZXItdGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3BhY2tldF90aW1lWzE3XTsKKworCS8qIGZvciBQUyBtb2RlICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3J4X3BzX3RpbWU7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKm1nbXRfcXVldWVfcmluZ1tNR01UX1FVRVVFX05VTV07CisJaW50IG1nbXRfcXVldWVfaGVhZDsKKwlpbnQgbWdtdF9xdWV1ZV90YWlsOworCisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3QgIHR4X3BlbmRpbmdfdCB0eF9wZW5kaW5nOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGFzc29jaWF0ZV90aW1lcjsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYmVhY29uX3RpbWVyOworCisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9wcm9jZWR1cmVfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc29mdG1hY19zY2FuX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHdtbV9wYXJhbV91cGRhdGVfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHBzX3JlcXVlc3RfdHhfYWNrX3dxOy8vZm9yIHBzCisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGh3X3NsZWVwX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoX2RvZ193cTsKKwlib29sIGJJbmFjdGl2ZVBzOworCWJvb2wgYWN0c2Nhbm5pbmc7CisJYm9vbCBiZWlucmV0cnk7CisJdTE2IExpc3RlbkludGVydmFsOworCXVuc2lnbmVkIGxvbmcgTnVtUnhEYXRhSW5QZXJpb2Q7IC8vWUosYWRkLDA4MDgyOAorCXVuc2lnbmVkIGxvbmcgTnVtUnhCY25JblBlcmlvZDsgIC8vWUosYWRkLDA4MDgyOAorCXVuc2lnbmVkIGxvbmcgTnVtUnhPa1RvdGFsOworCXVuc2lnbmVkIGxvbmcgTnVtUnhVbmljYXN0Oy8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCWJvb2wgYkh3UmFkaW9PZmY7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBzb2Z0bWFjX3NjYW5fd3E7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgYXNzb2NpYXRlX3JldHJ5X3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfd2FrZXVwX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfc2xlZXBfd3E7Ly8rYnkgYW15IDA4MDMyNAorCXN0cnVjdCBkZWxheWVkX3dvcmsgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc3dfYW50ZW5uYV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICBzdGFydF9pYnNzX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IGRlbGF5ZWRfd29yayByYXRlX2FkYXB0ZXJfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfZGlnX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCBkZWxheWVkX3dvcmsgR1BJT0NoYW5nZVJGV29ya0l0ZW07CisjZWxzZQorCisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXJ0X2lic3Nfd3E7CisgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGh3X3dha2V1cF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3dfYW50ZW5uYV93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlIDA4MDMxMgorICAgIHN0cnVjdCB3b3JrX3N0cnVjdCByYXRlX2FkYXB0ZXJfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorCXN0cnVjdCB3b3JrX3N0cnVjdCBod19kaWdfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3B3X3dxOworCisvL0FkZGVkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgR1BJT0NoYW5nZVJGV29ya0l0ZW07CisjZW5kaWYKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KKwl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpOworCisJLyogVXNlZCB0byBUWCBkYXRhIGZyYW1lIGJ5IHVzaW5nIHR4YiBzdHJ1Y3RzLgorCSAqIHRoaXMgaXMgbm90IHVzZWQgaWYgaW4gdGhlIHNvZnRtYWNfZmVhdHVyZXMKKwkgKiBpcyBzZXQgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFCisJICovCisJaW50ICgqaGFyZF9zdGFydF94bWl0KShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJaW50ICgqcmVzZXRfcG9ydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgcmF0ZSk7CisKKwkvKiBzdG9wcyB0aGUgSFcgcXVldWUgZm9yIERBVEEgZnJhbWVzLiBVc2VmdWwgdG8gYXZvaWQKKwkgKiB3YXN0ZSB0aW1lIHRvIFRYIGRhdGEgZnJhbWUgd2hlbiB3ZSBhcmUgcmVhc3NvY2lhdGluZworCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorCSAqLworCXZvaWQgKCpkYXRhX2hhcmRfc3RvcCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRhciB0byBkYXRhX3BvbGxfaGFyZF9zdG9wICovCisJdm9pZCAoKmRhdGFfaGFyZF9yZXN1bWUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogYXNrIHRvIHRoZSBkcml2ZXIgdG8gcmV0dW5lIHRoZSByYWRpbyAuCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQorCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0aGNlZCBiZWZvcmUgcmV0dXJuLgorCSAqLworCXZvaWQgKCpzZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKKwkvKiBUaGVzZSBhcmUgbm90IHVzZWQgaWYgdGhlIGllZWUgc3RhY2sgdGFrZXMgY2FyZSBvZgorCSAqIHNjYW5uaW5nIChJRUVFX1NPRlRNQUNfU0NBTiBmZWF0dXJlIHNldCkuCisJICogSW4gdGhpcyBjYXNlIG9ubHkgdGhlIHNldF9jaGFuIGlzIHVzZWQuCisJICoKKwkgKiBUaGUgc3luY3JvIHZlcnNpb24gaXMgc2ltaWxhciB0byB0aGUgc3RhcnRfc2NhbiBidXQKKwkgKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgYWxsIGNoYW5uZWxzIGhhcyBiZWVuIHNjYW5uZWQuCisJICogdGhpcyBpcyBjYWxsZWQgaW4gdXNlciBjb250ZXh0IGFuZCBzaG91bGQgc2xlZXAsCisJICogaXQgaXMgY2FsbGVkIGluIGEgd29ya19xdWV1ZSB3aGVuIHN3aXRoY2luZyB0byBhZC1ob2MgbW9kZQorCSAqIG9yIGluIGJlaGFsZiBvZiBpd2xpc3Qgc2NhbiB3aGVuIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQKKwkgKiBhbmQgcm9vdCB1c2VyIGFzayBmb3IgYSBzY2FuLgorCSAqIHRoZSBmdWNudGlvbiBzdG9wX3NjYW4gc2hvdWxkIHN0b3AgYm90aCB0aGUgc3luY3JvIGFuZAorCSAqIGJhY2tncm91bmQgc2Nhbm5pbmcgYW5kIGNhbiBzbGVlcC4KKwkgKiBUaGUgZnVjbnRpb24gc3RhcnRfc2NhbiBzaG91bGQgaW5pdGlhdGUgdGhlIGJhY2tncm91bmQKKwkgKiBzY2FubmluZyBhbmQgY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNjYW5fc3luY3JvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RhcnRfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnN0b3Bfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBpbmRpY2F0ZSB0aGUgZHJpdmVyIHRoYXQgdGhlIGxpbmsgc3RhdGUgaXMgY2hhbmdlZAorCSAqIGZvciBleGFtcGxlIGl0IG1heSBpbmRpY2F0ZSB0aGUgY2FyZCBpcyBhc3NvY2lhdGVkIG5vdy4KKwkgKiBEcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIHRvIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIG9yIHNpbXBseSBsaWdodCB0aGUgTElOSyBsZWQKKwkgKi8KKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdGhlc2UgdHdvIGZ1bmN0aW9uIGluZGljYXRlcyB0byB0aGUgSFcgd2hlbiB0byBzdGFydAorCSAqIGFuZCBzdG9wIHRvIHNlbmQgYmVhY29ucy4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlCisJICogSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgbm90IHNldC4gRm9yIG5vdyB0aGUKKwkgKiBzdG9wX3NlbmRfYmFjb25zIGlzIE5PVCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmx5CisJICogYWZ0ZXIgc3RhcnRfc2VuZF9iZWFjb25zLgorCSAqLworCXZvaWQgKCpzdGFydF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHBvd2VyIHNhdmUgbW9kZSByZWxhdGVkICovCisJdm9pZCAoKnN0YV93YWtlX3VwKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnBzX3JlcXVlc3RfdHhfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKmVudGVyX3NsZWVwX3N0YXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRoLCB1MzIgdGwpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFFvUyByZWxhdGVkICovCisJLy92b2lkICgqd21tX3BhcmFtX3VwZGF0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICphY19wYXJhbSk7CisJLy92b2lkICgqd21tX3BhcmFtX3VwZGF0ZSkgKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCisKKworc3RhdGljIGlubGluZSB2b2lkICppZWVlODAyMTFfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopbmV0ZGV2X3ByaXYoZGV2KSktPnByaXY7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgaW50IGVzc2lkX2xlbikKK3sKKwkvKiBTaW5nbGUgd2hpdGUgc3BhY2UgaXMgZm9yIExpbmtzeXMgQVBzICovCisJaWYgKGVzc2lkX2xlbiA9PSAxICYmIGVzc2lkWzBdID09ICcgJykKKwkJcmV0dXJuIDE7CisKKwkvKiBPdGhlcndpc2UsIGlmIHRoZSBlbnRpcmUgZXNzaWQgaXMgMCwgd2UgYXNzdW1lIGl0IGlzIGhpZGRlbiAqLworCXdoaWxlIChlc3NpZF9sZW4pIHsKKwkJZXNzaWRfbGVuLS07CisJCWlmIChlc3NpZFtlc3NpZF9sZW5dICE9ICdcMCcpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX3ZhbGlkX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBtb2RlKQoreworCS8qCisJICogSXQgaXMgcG9zc2libGUgZm9yIGJvdGggYWNjZXNzIHBvaW50cyBhbmQgb3VyIGRldmljZSB0byBzdXBwb3J0CisJICogY29tYmluYXRpb25zIG9mIG1vZGVzLCBzbyBhcyBsb25nIGFzIHRoZXJlIGlzIG9uZSB2YWxpZCBjb21iaW5hdGlvbgorCSAqIG9mIGFwL2RldmljZSBzdXBwb3J0ZWQgbW9kZXMsIHRoZW4gcmV0dXJuIHN1Y2Nlc3MKKwkgKgorCSAqLworCWlmICgobW9kZSAmIElFRUVfQSkgJiYKKwkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzUyR0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCWlmICgobW9kZSAmIElFRUVfRykgJiYKKwkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCWlmICgobW9kZSAmIElFRUVfQikgJiYKKwkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfaGRybGVuKHUxNiBmYykKK3sKKwlpbnQgaGRybGVuID0gMjQ7CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSAzMDsgLyogQWRkcjQgKi8KKwkJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQ1RTOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSAxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGRybGVuOworfQorCisKKworLyogaWVlZTgwMjExLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfdHguYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZWU4MDIxMV93eC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEqIHdycXUsIGNoYXIgKmV4dHJhKTsKK2ludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2ludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjLmMgKi8KK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KTsKKworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcG9pbnQgKnApOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpOworZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLHU4KiBhc1N0YSx1OCBhc1Jzbik7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKK2V4dGVybiB2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAJCQkgdTgqICAgICAgICAgICAgICAgICAgICAgYXNTdGEsCisgICAgICAgIAkJIHU4ICAgICAgICAgICAgICAgICAgICAgIGFzUnNuKTsKKworLyogaWVlZTgwMjExX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCk7CisvKiBpZWVlODAyMTFfc29mdG1hY193eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHQpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSx1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCitleHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQorIGV4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworI2VuZGlmCisvL2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcmF3dHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9uYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cik7CisKK2V4dGVybiBjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW107CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpZWVlODAyMTFfaW5jcmVtZW50X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnNjYW5zKys7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcmV0dXJuIGllZWUtPnNjYW5zOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVzY2FwZV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgdTggZXNzaWRfbGVuKSB7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjRjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHRvIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFPEtFUk5FTF9WRVJTSU9OKDIsNiwxOCkpCisjaW5jbHVkZTxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdEFQIGNyeXB0byIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKK307CisKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG8geworCXN0cnVjdCBsaXN0X2hlYWQgYWxnczsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG8gKmhjcnlwdDsKKwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqZW50cnk7CisKKwlmb3IgKHB0ciA9IGllZWUtPmNyeXB0X2RlaW5pdF9saXN0Lm5leHQsIG4gPSBwdHItPm5leHQ7CisJICAgICBwdHIgIT0gJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0OyBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSwgbGlzdCk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZlbnRyeS0+cmVmY250KSAhPSAwICYmICFmb3JjZSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHB0cik7CisKKwkJaWYgKGVudHJ5LT5vcHMpIHsKKwkJCWVudHJ5LT5vcHMtPmRlaW5pdChlbnRyeS0+cHJpdik7CisJCQltb2R1bGVfcHV0KGVudHJ5LT5vcHMtPm93bmVyKTsKKwkJfQorCQlrZnJlZShlbnRyeSk7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhpZWVlLCAwKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudHJpZXMgcmVtYWluaW5nIGluIGRlbGF5ZWQgY3J5cHQgIgorCQkgICAgICAgImRlbGV0aW9uIGxpc3RcbiIsIGllZWUtPmRldi0+bmFtZSk7CisJCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgqY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdG1wID0gKmNyeXB0OworCSpjcnlwdCA9IE5VTEw7CisKKwkvKiBtdXN0IG5vdCBydW4gb3BzLT5kZWluaXQoKSB3aGlsZSB0aGVyZSBtYXkgYmUgcGVuZGluZyBlbmNyeXB0IG9yCisJICogZGVjcnlwdCBvcGVyYXRpb25zLiBVc2UgYSBsaXN0IG9mIGRlbGF5ZWQgZGVpbml0cyB0byBhdm9pZCBuZWVkaW5nCisJICogbG9ja2luZy4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJnRtcC0+bGlzdCwgJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0KTsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcikpIHsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCitpbnQgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZzsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJYWxnID0ga21hbGxvYyhzaXplb2YoKmFsZyksIEdGUF9LRVJORUwpOworCWlmIChhbGcgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoYWxnLCAwLCBzaXplb2YoKmFsZykpOworCWFsZy0+b3BzID0gb3BzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZhbGctPmxpc3QsICZoY3J5cHQtPmFsZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogcmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJ1xuIiwKKwkgICAgICAgb3BzLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmRlbF9hbGcgPSBOVUxMOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJaWYgKGFsZy0+b3BzID09IG9wcykgeworCQkJbGlzdF9kZWwoJmFsZy0+bGlzdCk7CisJCQlkZWxfYWxnID0gYWxnOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGVsX2FsZykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJICAgICAgICInJXMnXG4iLCBvcHMtPm5hbWUpOworCQlrZnJlZShkZWxfYWxnKTsKKwl9CisKKwlyZXR1cm4gZGVsX2FsZyA/IDAgOiAtMTsKK30KKworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmZvdW5kX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOyBwdHIgPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCWlmIChzdHJjbXAoYWxnLT5vcHMtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWZvdW5kX2FsZyA9IGFsZzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGZvdW5kX2FsZykKKwkJcmV0dXJuIGZvdW5kX2FsZy0+b3BzOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfY3J5cHRfbnVsbF9pbml0KGludCBrZXlpZHgpIHsgcmV0dXJuICh2b2lkICopIDE7IH0KK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jcnlwdF9udWxsX2RlaW5pdCh2b2lkICpwcml2KSB7fQorCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9udWxsID0geworCS5uYW1lCQkJPSAiTlVMTCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tcGR1CQk9IE5VTEwsCisJLmVuY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21zZHUJCT0gTlVMTCwKKwkuc2V0X2tleQkJPSBOVUxMLAorCS5nZXRfa2V5CQk9IE5VTEwsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSAwLAorCS5leHRyYV9wb3N0Zml4X2xlbgk9IDAsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJaGNyeXB0ID0ga21hbGxvYyhzaXplb2YoKmhjcnlwdCksIEdGUF9LRVJORUwpOworCWlmICghaGNyeXB0KQorCQlnb3RvIG91dDsKKworCW1lbXNldChoY3J5cHQsIDAsIHNpemVvZigqaGNyeXB0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmhjcnlwdC0+YWxncyk7CisJc3Bpbl9sb2NrX2luaXQoJmhjcnlwdC0+bG9jayk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X251bGwpOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGhjcnlwdCk7CisJCWhjcnlwdCA9IE5VTEw7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQsIG4gPSBwdHItPm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOworCSAgICAgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJbGlzdF9kZWwocHRyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJyAoZGVpbml0KVxuIiwgYWxnLT5vcHMtPm5hbWUpOworCQlrZnJlZShhbGcpOworCX0KKworCWtmcmVlKGhjcnlwdCk7Cit9CisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCk7CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKTsKKyNlbmRpZgorCisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9faW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaWVlZTgwMjExIGNyeXB0byBtb2R1bGUuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0NSWVBUX0gKKyNkZWZpbmUgSUVFRTgwMjExX0NSWVBUX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBpbml0IG5ldyBjcnlwdG8gY29udGV4dCAoZS5nLiwgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHNwYWNlLAorCSAqIHNlbGVjdCBJViwgZXRjLik7IHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIG9yIHBvaW50ZXIgdG8gYWxsb2NhdGVkCisJICogcHJpdmF0ZSBkYXRhIG9uIHN1Y2Nlc3MgKi8KKwl2b2lkICogKCppbml0KShpbnQga2V5aWR4KTsKKworCS8qIGRlaW5pdGlhbGl6ZSBjcnlwdG8gY29udGV4dCBhbmQgZnJlZSBhbGxvY2F0ZWQgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAoKmRlaW5pdCkodm9pZCAqcHJpdik7CisKKwkvKiBlbmNyeXB0L2RlY3J5cHQgcmV0dXJuIDwgMCBvbiBlcnJvciBvciA+PSAwIG9uIHN1Y2Nlc3MuIFRoZSByZXR1cm4KKwkgKiB2YWx1ZSBmcm9tIGRlY3J5cHRfbXBkdSBpcyBwYXNzZWQgYXMgdGhlIGtleWlkeCB2YWx1ZSBmb3IKKwkgKiBkZWNyeXB0X21zZHUuIHNrYiBtdXN0IGhhdmUgZW5vdWdoIGhlYWQgYW5kIHRhaWwgcm9vbSBmb3IgdGhlCisJICogZW5jcnlwdGlvbjsgaWYgbm90LCBlcnJvciB3aWxsIGJlIHJldHVybmVkOyB0aGVzZSBmdW5jdGlvbnMgYXJlCisJICogY2FsbGVkIGZvciBhbGwgTVBEVXMgKGkuZS4sIGZyYWdtZW50cykuCisJICovCisJaW50ICgqZW5jcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisKKwkvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgZnVsbCBNU0RVcywgaS5lLiBmdWxsIGZyYW1lcy4KKwkgKiBUaGVzZSBjYW4gYmUgTlVMTCBpZiBmdWxsIE1TRFUgb3BlcmF0aW9ucyBhcmUgbm90IG5lZWRlZC4gKi8KKwlpbnQgKCplbmNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsIGludCBoZHJfbGVuLAorCQkJICAgIHZvaWQgKnByaXYpOworCisJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKwlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCisJLyogcHJvY2ZzIGhhbmRsZXIgZm9yIHByaW50aW5nIG91dCBrZXkgaW5mb3JtYXRpb24gYW5kIHBvc3NpYmxlCisJICogc3RhdGlzdGljcyAqLworCWNoYXIgKiAoKnByaW50X3N0YXRzKShjaGFyICpwLCB2b2lkICpwcml2KTsKKworCS8qIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIGJ5IGVuY3J5cHRpb247IGVuY3J5cHQgYnVmIGlzCisJICogYWxsb2NhdGVkIHdpdGggZXh0cmFfcHJlZml4X2xlbiBieXRlcywgY29weSBvZiBpbl9idWYsIGFuZAorCSAqIGV4dHJhX3Bvc3RmaXhfbGVuOyBlbmNyeXB0IG5lZWQgbm90IHVzZSBhbGwgdGhpcyBzcGFjZSwgYnV0CisJICogdGhlIHJlc3VsdCBtdXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgY29ycmVjdAorCSAqIGxlbmd0aCBtdXN0IGJlIHJldHVybmVkICovCisJaW50IGV4dHJhX3ByZWZpeF9sZW4sIGV4dHJhX3Bvc3RmaXhfbGVuOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogZGVsYXllZCBkZWxldGlvbiBsaXN0ICovCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJdm9pZCAqcHJpdjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitpbnQgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiwgaW50KTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg5MGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtMCwwICsxLDUzMyBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgQ0NNUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisgICAgI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNlbmRpZgorCisvLyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBDQ01QIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBPUEVOU1VTRV9TTEVECisjaWZuZGVmIElOX09QRU5TVVNFX1NMRUQKKyNkZWZpbmUgSU5fT1BFTlNVU0VfU0xFRCAxCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEFFU19CTE9DS19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9IRFJfTEVOIDgKKyNkZWZpbmUgQ0NNUF9NSUNfTEVOIDgKKyNkZWZpbmUgQ0NNUF9US19MRU4gMTYKKyNkZWZpbmUgQ0NNUF9QTl9MRU4gNgorCitzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSB7CisJdTgga2V5W0NDTVBfVEtfTEVOXTsKKwlpbnQga2V5X3NldDsKKworCXU4IHR4X3BuW0NDTVBfUE5fTEVOXTsKKwl1OCByeF9wbltDQ01QX1BOX0xFTl07CisKKwl1MzIgZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzOworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzOworCisJaW50IGtleV9pZHg7CisKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCB0eF9iMFtBRVNfQkxPQ0tfTEVOXSwgdHhfYltBRVNfQkxPQ0tfTEVOXSwKKwkJdHhfZVtBRVNfQkxPQ0tfTEVOXSwgdHhfczBbQUVTX0JMT0NLX0xFTl07CisJdTggcnhfYjBbQUVTX0JMT0NLX0xFTl0sIHJ4X2JbQUVTX0JMT0NLX0xFTl0sIHJ4X2FbQUVTX0JMT0NLX0xFTl07Cit9OworCit2b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgIGNvbnN0IHU4IHB0WzE2XSwgdTggY3RbMTZdKQoreworICAgICAgCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSgodm9pZCAqKXRmbSwgY3QsIHB0KTsKKwkjZWxzZQorCXN0cnVjdCBzY2F0dGVybGlzdCBzcmMsIGRzdDsKKworCXNyYy5wYWdlID0gdmlydF90b19wYWdlKHB0KTsKKwlzcmMub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocHQpOworCXNyYy5sZW5ndGggPSBBRVNfQkxPQ0tfTEVOOworCisJZHN0LnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoY3QpOworCWRzdC5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShjdCk7CisJZHN0Lmxlbmd0aCA9IEFFU19CTE9DS19MRU47CisKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQodGZtLCAmZHN0LCAmc3JjLCBBRVNfQkxPQ0tfTEVOKTsKKwkjZW5kaWYKK30KKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfY2NtcF9pbml0KGludCBrZXlfaWR4KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKKworICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlwcml2LT50Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJhZXMiLCAwKTsKKwlpZiAocHJpdi0+dGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJZ290byBmYWlsOworCX0KKyAgICAgICAjZWxzZQorICAgICAgIHByaXYtPnRmbSA9ICh2b2lkICopY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFlc1xuIik7CisJCXByaXYtPnRmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisJI2VuZGlmCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbSkKKwkJCS8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisgICAgICAgCQkJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbSk7CisgICAgICAgICAgICAgICAgICAgICNlbHNlCisJCQljcnlwdG9fZnJlZV9jaXBoZXIoKHZvaWQgKilwcml2LT50Zm0pOworCQkgICAgICAjZW5kaWYKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX2NjbXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKl9wcml2ID0gcHJpdjsKKwlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKKwkJLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyAgICAgICAJCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm0pOworICAgICAgICAgICAgICNlbHNlCisJCWNyeXB0b19mcmVlX2NpcGhlcigodm9pZCAqKV9wcml2LT50Zm0pOworCQkjZW5kaWYKKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yX2Jsb2NrKHU4ICpiLCB1OCAqYSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJbaV0gXj0gYVtpXTsKK30KKworI2lmbmRlZiBKT0hOX0NDTVAKK3N0YXRpYyB2b2lkIGNjbXBfaW5pdF9ibG9ja3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgdTggKnBuLCBzaXplX3QgZGxlbiwgdTggKmIwLCB1OCAqYXV0aCwKKwkJCSAgICAgdTggKnMwKQoreworCXU4ICpwb3MsIHFjID0gMDsKKwlzaXplX3QgYWFkX2xlbjsKKwl1MTYgZmM7CisJaW50IGE0X2luY2x1ZGVkLCBxY19pbmNsdWRlZDsKKwl1OCBhYWRbMiAqIEFFU19CTE9DS19MRU5dOworCisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJYTRfaW5jbHVkZWQgPSAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQorCQkgICAgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKTsKKwkvKgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDA4KSk7CisgICAgICAgICovCisJLy8gZml4ZWQgYnkgRGF2aWQgOjIwMDYuOS42CisJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4ODApKTsKKwlhYWRfbGVuID0gMjI7CisJaWYgKGE0X2luY2x1ZGVkKQorCQlhYWRfbGVuICs9IDY7CisJaWYgKHFjX2luY2x1ZGVkKSB7CisJCXBvcyA9ICh1OCAqKSAmaGRyLT5hZGRyNDsKKwkJaWYgKGE0X2luY2x1ZGVkKQorCQkJcG9zICs9IDY7CisJCXFjID0gKnBvcyAmIDB4MGY7CisJCWFhZF9sZW4gKz0gMjsKKwl9CisJLyogQ0NNIEluaXRpYWwgQmxvY2s6CisJICogRmxhZyAoSW5jbHVkZSBhdXRoZW50aWNhdGlvbiBoZWFkZXIsIE09MyAoOC1vY3RldCBNSUMpLAorCSAqICAgICAgIEw9MSAoMi1vY3RldCBEbGVuKSkKKwkgKiBOb25jZTogMHgwMCB8IEEyIHwgUE4KKwkgKiBEbGVuICovCisJYjBbMF0gPSAweDU5OworCWIwWzFdID0gcWM7CisJbWVtY3B5KGIwICsgMiwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCW1lbWNweShiMCArIDgsIHBuLCBDQ01QX1BOX0xFTik7CisJYjBbMTRdID0gKGRsZW4gPj4gOCkgJiAweGZmOworCWIwWzE1XSA9IGRsZW4gJiAweGZmOworCisJLyogQUFEOgorCSAqIEZDIHdpdGggYml0cyA0Li42IGFuZCAxMS4uMTMgbWFza2VkIHRvIHplcm87IDE0IGlzIGFsd2F5cyBvbmUKKwkgKiBBMSB8IEEyIHwgQTMKKwkgKiBTQyB3aXRoIGJpdHMgNC4uMTUgKHNlcSMpIG1hc2tlZCB0byB6ZXJvCisJICogQTQgKGlmIHByZXNlbnQpCisJICogUUMgKGlmIHByZXNlbnQpCisJICovCisJcG9zID0gKHU4ICopIGhkcjsKKwlhYWRbMF0gPSAwOyAvKiBhYWRfbGVuID4+IDggKi8KKwlhYWRbMV0gPSBhYWRfbGVuICYgMHhmZjsKKwlhYWRbMl0gPSBwb3NbMF0gJiAweDhmOworCWFhZFszXSA9IHBvc1sxXSAmIDB4Yzc7CisJbWVtY3B5KGFhZCArIDQsIGhkci0+YWRkcjEsIDMgKiBFVEhfQUxFTik7CisJcG9zID0gKHU4ICopICZoZHItPnNlcV9jdGw7CisJYWFkWzIyXSA9IHBvc1swXSAmIDB4MGY7CisJYWFkWzIzXSA9IDA7IC8qIGFsbCBiaXRzIG1hc2tlZCAqLworCW1lbXNldChhYWQgKyAyNCwgMCwgOCk7CisJaWYgKGE0X2luY2x1ZGVkKQorCQltZW1jcHkoYWFkICsgMjQsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJYWFkW2E0X2luY2x1ZGVkID8gMzAgOiAyNF0gPSBxYzsKKwkJLyogcmVzdCBvZiBRQyBtYXNrZWQgKi8KKwl9CisKKwkvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBibG9jayBhbmQgQUFEICovCisJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBiMCwgYXV0aCk7CisJeG9yX2Jsb2NrKGF1dGgsIGFhZCwgQUVTX0JMT0NLX0xFTik7CisJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBhdXRoLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgJmFhZFtBRVNfQkxPQ0tfTEVOXSwgQUVTX0JMT0NLX0xFTik7CisJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBhdXRoLCBhdXRoKTsKKwliMFswXSAmPSAweDA3OworCWIwWzE0XSA9IGIwWzE1XSA9IDA7CisJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBiMCwgczApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwlpbnQgZGF0YV9sZW4sIGk7CisJdTggKnBvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworI2lmbmRlZiBKT0hOX0NDTVAKKwlpbnQgYmxvY2tzLCBsYXN0LCBsZW47CisJdTggKm1pYzsKKwl1OCAqYjAgPSBrZXktPnR4X2IwOworCXU4ICpiID0ga2V5LT50eF9iOworCXU4ICplID0ga2V5LT50eF9lOworCXU4ICpzMCA9IGtleS0+dHhfczA7CisjZW5kaWYKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBDQ01QX0hEUl9MRU4gfHwKKwkgICAgc2tiX3RhaWxyb29tKHNrYikgPCBDQ01QX01JQ19MRU4gfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CisJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisvLwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKworCWkgPSBDQ01QX1BOX0xFTiAtIDE7CisJd2hpbGUgKGkgPj0gMCkgeworCQlrZXktPnR4X3BuW2ldKys7CisJCWlmIChrZXktPnR4X3BuW2ldICE9IDApCisJCQlicmVhazsKKwkJaS0tOworCX0KKworCSpwb3MrKyA9IGtleS0+dHhfcG5bNV07CisJKnBvcysrID0ga2V5LT50eF9wbls0XTsKKwkqcG9zKysgPSAwOworCSpwb3MrKyA9IChrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0ga2V5LT50eF9wblszXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzJdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMV07CisJKnBvcysrID0ga2V5LT50eF9wblswXTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisjaWZuZGVmIEpPSE5fQ0NNUAorCS8vbWljIGlzIG1vdmVkIHRvIGhlcmUgYnkgam9obgorCW1pYyA9IHNrYl9wdXQoc2tiLCBDQ01QX01JQ19MRU4pOworCisJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBrZXktPnR4X3BuLCBkYXRhX2xlbiwgYjAsIGIsIHMwKTsKKworCWJsb2NrcyA9IChkYXRhX2xlbiArIEFFU19CTE9DS19MRU4gLSAxKSAvIEFFU19CTE9DS19MRU47CisJbGFzdCA9IGRhdGFfbGVuICUgQUVTX0JMT0NLX0xFTjsKKworCWZvciAoaSA9IDE7IGkgPD0gYmxvY2tzOyBpKyspIHsKKwkJbGVuID0gKGkgPT0gYmxvY2tzICYmIGxhc3QpID8gbGFzdCA6IEFFU19CTE9DS19MRU47CisJCS8qIEF1dGhlbnRpY2F0aW9uICovCisJCXhvcl9ibG9jayhiLCBwb3MsIGxlbik7CisJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiLCBiKTsKKwkJLyogRW5jcnlwdGlvbiwgd2l0aCBjb3VudGVyICovCisJCWIwWzE0XSA9IChpID4+IDgpICYgMHhmZjsKKwkJYjBbMTVdID0gaSAmIDB4ZmY7CisJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiMCwgZSk7CisJCXhvcl9ibG9jayhwb3MsIGUsIGxlbik7CisJCXBvcyArPSBsZW47CisJfQorCisJZm9yIChpID0gMDsgaSA8IENDTVBfTUlDX0xFTjsgaSsrKQorCQltaWNbaV0gPSBiW2ldIF4gczBbaV07CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJdTgga2V5aWR4LCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJdTggcG5bNl07CisjaWZuZGVmIEpPSE5fQ0NNUAorCXNpemVfdCBkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIENDTVBfSERSX0xFTiAtIENDTVBfTUlDX0xFTjsKKwl1OCAqbWljID0gc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBDQ01QX01JQ19MRU47CisJdTggKmIwID0ga2V5LT5yeF9iMDsKKwl1OCAqYiA9IGtleS0+cnhfYjsKKwl1OCAqYSA9IGtleS0+cnhfYTsKKwlpbnQgaSwgYmxvY2tzLCBsYXN0LCBsZW47CisjZW5kaWYKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgQ0NNUF9IRFJfTEVOICsgQ0NNUF9NSUNfTEVOKSB7CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5aWR4ID0gcG9zWzNdOworCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYiCisJCQkgICAgICAgIiBmbGFnIGZyb20gIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CisJCXJldHVybiAtMjsKKwl9CisJa2V5aWR4ID4+PSA2OworCWlmIChrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwga2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICgha2V5LT5rZXlfc2V0KSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQKKwkJCSAgICAgICAiIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCIKKwkJCSAgICAgICAiIGtleVxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwga2V5aWR4KTsKKwkJfQorCQlyZXR1cm4gLTM7CisJfQorCisJcG5bMF0gPSBwb3NbN107CisJcG5bMV0gPSBwb3NbNl07CisJcG5bMl0gPSBwb3NbNV07CisJcG5bM10gPSBwb3NbNF07CisJcG5bNF0gPSBwb3NbMV07CisJcG5bNV0gPSBwb3NbMF07CisJcG9zICs9IDg7CisKKwlpZiAobWVtY21wKHBuLCBrZXktPnJ4X3BuLCBDQ01QX1BOX0xFTikgPD0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVwbGF5IGRldGVjdGVkOiBTVEE9IiBNQUNfRk1UCisJCQkgICAgICAgIiBwcmV2aW91cyBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgICAgICJyZWNlaXZlZCBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSwgTUFDX0FSRyhrZXktPnJ4X3BuKSwKKwkJCSAgICAgICBNQUNfQVJHKHBuKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzKys7CisJCXJldHVybiAtNDsKKwl9CisKKyNpZm5kZWYgSk9ITl9DQ01QCisJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBwbiwgZGF0YV9sZW4sIGIwLCBhLCBiKTsKKwl4b3JfYmxvY2sobWljLCBiLCBDQ01QX01JQ19MRU4pOworCisJYmxvY2tzID0gKGRhdGFfbGVuICsgQUVTX0JMT0NLX0xFTiAtIDEpIC8gQUVTX0JMT0NLX0xFTjsKKwlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJZm9yIChpID0gMTsgaSA8PSBibG9ja3M7IGkrKykgeworCQlsZW4gPSAoaSA9PSBibG9ja3MgJiYgbGFzdCkgPyBsYXN0IDogQUVTX0JMT0NLX0xFTjsKKwkJLyogRGVjcnlwdCwgd2l0aCBjb3VudGVyICovCisJCWIwWzE0XSA9IChpID4+IDgpICYgMHhmZjsKKwkJYjBbMTVdID0gaSAmIDB4ZmY7CisJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiMCwgYik7CisJCXhvcl9ibG9jayhwb3MsIGIsIGxlbik7CisJCS8qIEF1dGhlbnRpY2F0aW9uICovCisJCXhvcl9ibG9jayhhLCBwb3MsIGxlbik7CisJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBhLCBhKTsKKwkJcG9zICs9IGxlbjsKKwl9CisKKwlpZiAobWVtY21wKG1pYywgYSwgQ0NNUF9NSUNfTEVOKSAhPSAwKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBkZWNyeXB0IGZhaWxlZDogU1RBPSIKKwkJCSAgICAgICBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycysrOworCQlyZXR1cm4gLTU7CisJfQorCisJbWVtY3B5KGtleS0+cnhfcG4sIHBuLCBDQ01QX1BOX0xFTik7CisKKyNlbmRpZgorCS8qIFJlbW92ZSBoZHIgYW5kIE1JQyAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgQ0NNUF9IRFJfTEVOLCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOKTsKKworCXJldHVybiBrZXlpZHg7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisJaW50IGtleWlkeDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGF0YS0+dGZtOworCisJa2V5aWR4ID0gZGF0YS0+a2V5X2lkeDsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisJZGF0YS0+a2V5X2lkeCA9IGtleWlkeDsKKwlkYXRhLT50Zm0gPSB0Zm07CisJaWYgKGxlbiA9PSBDQ01QX1RLX0xFTikgeworCQltZW1jcHkoZGF0YS0+a2V5LCBrZXksIENDTVBfVEtfTEVOKTsKKwkJZGF0YS0+a2V5X3NldCA9IDE7CisJCWlmIChzZXEpIHsKKwkJCWRhdGEtPnJ4X3BuWzBdID0gc2VxWzVdOworCQkJZGF0YS0+cnhfcG5bMV0gPSBzZXFbNF07CisJCQlkYXRhLT5yeF9wblsyXSA9IHNlcVszXTsKKwkJCWRhdGEtPnJ4X3BuWzNdID0gc2VxWzJdOworCQkJZGF0YS0+cnhfcG5bNF0gPSBzZXFbMV07CisJCQlkYXRhLT5yeF9wbls1XSA9IHNlcVswXTsKKwkJfQorCQljcnlwdG9fY2lwaGVyX3NldGtleSgodm9pZCAqKWRhdGEtPnRmbSwgZGF0YS0+a2V5LCBDQ01QX1RLX0xFTik7CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJZGF0YS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKworCWlmIChsZW4gPCBDQ01QX1RLX0xFTikKKwkJcmV0dXJuIC0xOworCisJaWYgKCFkYXRhLT5rZXlfc2V0KQorCQlyZXR1cm4gMDsKKwltZW1jcHkoa2V5LCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKKworCWlmIChzZXEpIHsKKwkJc2VxWzBdID0gZGF0YS0+dHhfcG5bNV07CisJCXNlcVsxXSA9IGRhdGEtPnR4X3BuWzRdOworCQlzZXFbMl0gPSBkYXRhLT50eF9wblszXTsKKwkJc2VxWzNdID0gZGF0YS0+dHhfcG5bMl07CisJCXNlcVs0XSA9IGRhdGEtPnR4X3BuWzFdOworCQlzZXFbNV0gPSBkYXRhLT50eF9wblswXTsKKwl9CisKKwlyZXR1cm4gQ0NNUF9US19MRU47Cit9CisKKworc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpjY21wID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPUNDTVAga2V5X3NldD0lZCAiCisJCSAgICAgInR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgImZvcm1hdF9lcnJvcnM9JWQgcmVwbGF5cz0lZCBkZWNyeXB0X2Vycm9ycz0lZFxuIiwKKwkJICAgICBjY21wLT5rZXlfaWR4LCBjY21wLT5rZXlfc2V0LAorCQkgICAgIE1BQ19BUkcoY2NtcC0+dHhfcG4pLCBNQUNfQVJHKGNjbXAtPnJ4X3BuKSwKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMsCisJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKTsKKworCXJldHVybiBwOworfQorCit2b2lkIGllZWU4MDIxMV9jY21wX251bGwodm9pZCkKK3sKKy8vICAgIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuOworfQorc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfY2NtcCA9IHsKKwkubmFtZQkJCT0gIkNDTVAiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfY2NtcF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jY21wX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IGllZWU4MDIxMV9jY21wX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBpZWVlODAyMTFfY2NtcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IENDTVBfSERSX0xFTiwKKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSBDQ01QX01JQ19MRU4sCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9jY21wKTsKK30KKworI2lmIDAKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfY2NtcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfY2NtcF9udWxsKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQpOworLy9tb2R1bGVfZXhpdChpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYwYjFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMCwwICsxLDEwMDEgQEAKKy8qCisgKiBIb3N0IEFQIGNyeXB0OiBob3N0LWJhc2VkIFRLSVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorLy8jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisgICAgI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBUS0lQIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBPUEVOU1VTRV9TTEVECisjaWZuZGVmIElOX09QRU5TVVNFX1NMRUQKKyNkZWZpbmUgSU5fT1BFTlNVU0VfU0xFRCAxCisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSB7CisjZGVmaW5lIFRLSVBfS0VZX0xFTiAzMgorCXU4IGtleVtUS0lQX0tFWV9MRU5dOworCWludCBrZXlfc2V0OworCisJdTMyIHR4X2l2MzI7CisJdTE2IHR4X2l2MTY7CisJdTE2IHR4X3R0YWtbNV07CisJaW50IHR4X3BoYXNlMV9kb25lOworCisJdTMyIHJ4X2l2MzI7CisJdTE2IHJ4X2l2MTY7CisJdTE2IHJ4X3R0YWtbNV07CisJaW50IHJ4X3BoYXNlMV9kb25lOworCXUzMiByeF9pdjMyX25ldzsKKwl1MTYgcnhfaXYxNl9uZXc7CisKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5czsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzOworCisJaW50IGtleV9pZHg7CisKKyAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorCSAgIAlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtX2FyYzQ7CisJICAgICAgIHN0cnVjdCBjcnlwdG9faGFzaCAqcnhfdGZtX21pY2hhZWw7CisJICAgICAgIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm1fYXJjNDsKKwkgICAgICAgc3RydWN0IGNyeXB0b19oYXNoICp0eF90Zm1fbWljaGFlbDsKKyAgICAgICAjZW5kaWYKKworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtX21pY2hhZWw7CisKKwkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLworCXU4IHJ4X2hkclsxNl0sIHR4X2hkclsxNl07Cit9OworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV90a2lwX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXByaXYtPnRmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX3RmbSgiYXJjNCIsIDApOworCWlmIChwcml2LT50Zm1fYXJjNCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+dGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfdGZtKCJtaWNoYWVsX21pYyIsIDApOworCWlmIChwcml2LT50Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCSNlbHNlCisJcHJpdi0+dHhfdGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAorCQkJCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm1fYXJjNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbV9hcmM0ID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnR4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKKwkJCQkJCSBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9taWNoYWVsKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCQkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm1fYXJjNCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT5yeF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCisJCQkJCQkgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcml2LT5yeF90Zm1fbWljaGFlbCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisgICAgICAgI2VuZGlmCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwkJaWYgKHByaXYtPnRmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnRmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbV9hcmM0KTsKKyAgICAgICAgICAgICAjZWxzZQorCQlpZiAocHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKHByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnR4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKHByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT5yeF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm1fYXJjNCk7CisJCSNlbmRpZgorCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqX3ByaXYgPSBwcml2OworCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fbWljaGFlbCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fbWljaGFlbCk7CisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm1fYXJjNCkKKwkJY3J5cHRvX2ZyZWVfdGZtKF9wcml2LT50Zm1fYXJjNCk7CisJI2Vsc2UKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtX2FyYzQpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChfcHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm1fYXJjNCk7CisJfQorCSNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IFJvdFIxKHUxNiB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gMSkgfCAodmFsIDw8IDE1KTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IExvOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgJiAweGZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTggSGk4KHUxNiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiA4OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IExvMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IEhpMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsID4+IDE2OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTYodTggaGksIHU4IGxvKQoreworCXJldHVybiBsbyB8ICgoKHUxNikgaGkpIDw8IDgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTZfbGUodTE2ICp2KQoreworCXJldHVybiBsZTE2X3RvX2NwdSgqdik7Cit9CisKKworc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPQoreworCTB4QzZBNSwgMHhGODg0LCAweEVFOTksIDB4RjY4RCwgMHhGRjBELCAweEQ2QkQsIDB4REVCMSwgMHg5MTU0LAorCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAorCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAorCTB4NDFFQywgMHhCMzY3LCAweDVGRkQsIDB4NDVFQSwgMHgyM0JGLCAweDUzRjcsIDB4RTQ5NiwgMHg5QjVCLAorCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAorCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAorCTB4MDgwQywgMHg5NTUyLCAweDQ2NjUsIDB4OUQ1RSwgMHgzMDI4LCAweDM3QTEsIDB4MEEwRiwgMHgyRkI1LAorCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAorCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAorCTB4QTRGNiwgMHg3NjRELCAweEI3NjEsIDB4N0RDRSwgMHg1MjdCLCAweEREM0UsIDB4NUU3MSwgMHgxMzk3LAorCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAorCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAorCTB4QkI2QiwgMHhDNTJBLCAweDRGRTUsIDB4RUQxNiwgMHg4NkM1LCAweDlBRDcsIDB4NjY1NSwgMHgxMTk0LAorCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAorCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAorCTB4NjNERiwgMHg3N0MxLCAweEFGNzUsIDB4NDI2MywgMHgyMDMwLCAweEU1MUEsIDB4RkQwRSwgMHhCRjZELAorCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAorCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAorCTB4QzBBMCwgMHgxOTk4LCAweDlFRDEsIDB4QTM3RiwgMHg0NDY2LCAweDU0N0UsIDB4M0JBQiwgMHgwQjgzLAorCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAorCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAorCTB4OUY1RCwgMHhCRDZFLCAweDQzRUYsIDB4QzRBNiwgMHgzOUE4LCAweDMxQTQsIDB4RDMzNywgMHhGMjhCLAorCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAorCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAorCTB4NkZENSwgMHhGMDg4LCAweDRBNkYsIDB4NUM3MiwgMHgzODI0LCAweDU3RjEsIDB4NzNDNywgMHg5NzUxLAorCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAorCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAorCTB4QzJBMywgMHg2QTVGLCAweEFFRjksIDB4NjlEMCwgMHgxNzkxLCAweDk5NTgsIDB4M0EyNywgMHgyN0I5LAorCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAorCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAorCTB4MDM4RiwgMHg1OUY4LCAweDA5ODAsIDB4MUExNywgMHg2NURBLCAweEQ3MzEsIDB4ODRDNiwgMHhEMEI4LAorCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAorfTsKKworCitzdGF0aWMgaW5saW5lIHUxNiBfU18odTE2IHYpCit7CisJdTE2IHQgPSBTYm94W0hpOCh2KV07CisJcmV0dXJuIFNib3hbTG84KHYpXSBeICgodCA8PCA4KSB8ICh0ID4+IDgpKTsKK30KKworI2lmbmRlZiBKT0hOX1RLSVAKKyNkZWZpbmUgUEhBU0UxX0xPT1BfQ09VTlQgOAorCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTEodTE2ICpUVEFLLCBjb25zdCB1OCAqVEssIGNvbnN0IHU4ICpUQSwgdTMyIElWMzIpCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MC1iaXQgVFRBSyBmcm9tIFRTQyAoSVYzMikgYW5kIFRBWzAuLjVdICovCisJVFRBS1swXSA9IExvMTYoSVYzMik7CisJVFRBS1sxXSA9IEhpMTYoSVYzMik7CisJVFRBS1syXSA9IE1rMTYoVEFbMV0sIFRBWzBdKTsKKwlUVEFLWzNdID0gTWsxNihUQVszXSwgVEFbMl0pOworCVRUQUtbNF0gPSBNazE2KFRBWzVdLCBUQVs0XSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ09VTlQ7IGkrKykgeworCQlqID0gMiAqIChpICYgMSk7CisJCVRUQUtbMF0gKz0gX1NfKFRUQUtbNF0gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSk7CisJCVRUQUtbMV0gKz0gX1NfKFRUQUtbMF0gXiBNazE2KFRLWzUgKyBqXSwgVEtbNCArIGpdKSk7CisJCVRUQUtbMl0gKz0gX1NfKFRUQUtbMV0gXiBNazE2KFRLWzkgKyBqXSwgVEtbOCArIGpdKSk7CisJCVRUQUtbM10gKz0gX1NfKFRUQUtbMl0gXiBNazE2KFRLWzEzICsgal0sIFRLWzEyICsgal0pKTsKKwkJVFRBS1s0XSArPSBfU18oVFRBS1szXSBeIE1rMTYoVEtbMSArIGpdLCBUS1swICsgal0pKSArIGk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMih1OCAqV0VQU2VlZCwgY29uc3QgdTggKlRLLCBjb25zdCB1MTYgKlRUQUssCisJCQkgICAgICAgdTE2IElWMTYpCit7CisJLyogTWFrZSB0ZW1wb3JhcnkgYXJlYSBvdmVybGFwIFdFUCBzZWVkIHNvIHRoYXQgdGhlIGZpbmFsIGNvcHkgY2FuIGJlCisJICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLiAqLworCXUxNiAqUFBLID0gKHUxNiAqKSAmV0VQU2VlZFs0XTsKKworCS8qIFN0ZXAgMSAtIG1ha2UgY29weSBvZiBUVEFLIGFuZCBicmluZyBpbiBUU0MgKi8KKwlQUEtbMF0gPSBUVEFLWzBdOworCVBQS1sxXSA9IFRUQUtbMV07CisJUFBLWzJdID0gVFRBS1syXTsKKwlQUEtbM10gPSBUVEFLWzNdOworCVBQS1s0XSA9IFRUQUtbNF07CisJUFBLWzVdID0gVFRBS1s0XSArIElWMTY7CisKKwkvKiBTdGVwIDIgLSA5Ni1iaXQgYmlqZWN0aXZlIG1peGluZyB1c2luZyBTLWJveCAqLworCVBQS1swXSArPSBfU18oUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1swXSkpOworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1syXSkpOworCVBQS1syXSArPSBfU18oUFBLWzFdIF4gTWsxNl9sZSgodTE2ICopICZUS1s0XSkpOworCVBQS1szXSArPSBfU18oUFBLWzJdIF4gTWsxNl9sZSgodTE2ICopICZUS1s2XSkpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gTWsxNl9sZSgodTE2ICopICZUS1s4XSkpOworCVBQS1s1XSArPSBfU18oUFBLWzRdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMF0pKTsKKworCVBQS1swXSArPSBSb3RSMShQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzEyXSkpOworCVBQS1sxXSArPSBSb3RSMShQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzE0XSkpOworCVBQS1syXSArPSBSb3RSMShQUEtbMV0pOworCVBQS1szXSArPSBSb3RSMShQUEtbMl0pOworCVBQS1s0XSArPSBSb3RSMShQUEtbM10pOworCVBQS1s1XSArPSBSb3RSMShQUEtbNF0pOworCisJLyogU3RlcCAzIC0gYnJpbmcgaW4gbGFzdCBvZiBUSyBiaXRzLCBhc3NpZ24gMjQtYml0IFdFUCBJViB2YWx1ZQorCSAqIFdFUFNlZWRbMC4uMl0gaXMgdHJhbnNtaXR0ZWQgYXMgV0VQIElWICovCisJV0VQU2VlZFswXSA9IEhpOChJVjE2KTsKKwlXRVBTZWVkWzFdID0gKEhpOChJVjE2KSB8IDB4MjApICYgMHg3RjsKKwlXRVBTZWVkWzJdID0gTG84KElWMTYpOworCVdFUFNlZWRbM10gPSBMbzgoKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKSA+PiAxKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlQUEtbaV0gPSAoUFBLW2ldIDw8IDgpIHwgKFBQS1tpXSA+PiA4KTsKKwl9CisjZW5kaWYKK30KKyNlbmRpZgorc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT50eF90Zm1fYXJjNH07CisgICAgICAgICNlbmRpZgorCWludCBsZW47CisJdTggICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKyNpZm5kZWYgSk9ITl9US0lQCisJdTggcmM0a2V5WzE2XSwqaWN2OworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworI2VuZGlmCisJaW50IHJldDsKKworCXJldCA9IDA7CisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgOCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmIDAKK3ByaW50aygiQEAgdGtleVxuIik7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzBdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbMV0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVsyXSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzNdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbNF0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVs1XSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzZdKTsKK3ByaW50aygiJXhcbiIsICgodTMyKil0a2V5LT5rZXkpWzddKTsKKyNlbmRpZgorCisjaWZuZGVmIEpPSE5fVEtJUAorCWlmICghdGtleS0+dHhfcGhhc2UxX2RvbmUpIHsKKwkJdGtpcF9taXhpbmdfcGhhc2UxKHRrZXktPnR4X3R0YWssIHRrZXktPmtleSwgaGRyLT5hZGRyMiwKKwkJCQkgICB0a2V5LT50eF9pdjMyKTsKKwkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworCX0KKwl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnR4X3R0YWssIHRrZXktPnR4X2l2MTYpOworCisjZWxzZQorCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKKyNlbmRpZiAgLypKT0hOX1RLSVAqLworCisJbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgOCk7CisJbWVtbW92ZShwb3MsIHBvcyArIDgsIGhkcl9sZW4pOworCXBvcyArPSBoZHJfbGVuOworCisjaWZkZWYgSk9ITl9US0lQCisJKnBvcysrID0gSGk4KHRrZXktPnR4X2l2MTYpOworCSpwb3MrKyA9IChIaTgodGtleS0+dHhfaXYxNikgfCAweDIwKSAmIDB4N0Y7CisJKnBvcysrID0gTG84KHRrZXktPnR4X2l2MTYpOworI2Vsc2UKKwkqcG9zKysgPSByYzRrZXlbMF07CisJKnBvcysrID0gcmM0a2V5WzFdOworCSpwb3MrKyA9IHJjNGtleVsyXTsKKyNlbmRpZgorCSpwb3MrKyA9ICh0a2V5LT5rZXlfaWR4IDw8IDYpIHwgKDEgPDwgNSkgLyogRXh0IElWIGluY2x1ZGVkICovOworCSpwb3MrKyA9IHRrZXktPnR4X2l2MzIgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDgpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CisjaWZuZGVmIEpPSE5fVEtJUAorCWljdiA9IHNrYl9wdXQoc2tiLCA0KTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh0a2V5LT50Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHQodGtleS0+dGZtX2FyYzQsICZzZywgJnNnLCBsZW4gKyA0KTsKKyAgICAgICNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOworICAgICAgICAjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisgICAgICAgICAgc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5sZW5ndGggPSBsZW4gKyA0OworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCXJldD0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisgICAgICAjZW5kaWYKKyNlbmRpZgorCXRrZXktPnR4X2l2MTYrKzsKKwlpZiAodGtleS0+dHhfaXYxNiA9PSAwKSB7CisJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMDsKKwkJdGtleS0+dHhfaXYzMisrOworCX0KKyNpZm5kZWYgSk9ITl9US0lQCisgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8S0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJICAgcmV0dXJuIDA7CisgICAgICAjZWxzZQorCSAgIHJldHVybiByZXQ7CisgICAgICAjZW5kaWYKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisgICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpIHx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gdGtleS0+cnhfdGZtX2FyYzR9OworICAgICAgICAjZW5kaWYKKwl1OCBrZXlpZHgsICpwb3M7CisJdTMyIGl2MzI7CisJdTE2IGl2MTY7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKyNpZm5kZWYgSk9ITl9US0lQCisJdTggaWN2WzRdOworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCXU4IHJjNGtleVsxNl07CisJaW50IHBsZW47CisjZW5kaWYKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCisJCXJldHVybiAtMTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKHRrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwgdGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcmV0dXJuIC02OworCX0KKwlpZiAoIXRrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisJaXYxNiA9IChwb3NbMF0gPDwgOCkgfCBwb3NbMl07CisJaXYzMiA9IHBvc1s0XSB8IChwb3NbNV0gPDwgOCkgfCAocG9zWzZdIDw8IDE2KSB8IChwb3NbN10gPDwgMjQpOworCXBvcyArPSA4OworI2lmbmRlZiBKT0hOX1RLSVAKKworCWlmIChpdjMyIDwgdGtleS0+cnhfaXYzMiB8fAorCSAgICAoaXYzMiA9PSB0a2V5LT5yeF9pdjMyICYmIGl2MTYgPD0gdGtleS0+cnhfaXYxNikpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJICAgICAgICIgcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkIFRTQyAiCisJCQkgICAgICAgIiUwOHglMDR4XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkJICAgICAgIHRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsIGl2MzIsIGl2MTYpOworCQl9CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMrKzsKKwkJcmV0dXJuIC00OworCX0KKworCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIgfHwgIXRrZXktPnJ4X3BoYXNlMV9kb25lKSB7CisJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT5yeF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsIGl2MzIpOworCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDE7CisJfQorCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+cnhfdHRhaywgaXYxNik7CisKKwlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gMTI7CisgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRrZXktPnRmbV9hcmM0LCByYzRrZXksIDE2KTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBwbGVuICsgNDsKKwljcnlwdG9fY2lwaGVyX2RlY3J5cHQodGtleS0+dGZtX2FyYzQsICZzZywgJnNnLCBwbGVuICsgNCk7CisJI2Vsc2UKKwljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT5yeF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gcGxlbiArIDQ7CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIjogVEtJUDogZmFpbGVkIHRvIGRlY3J5cHQgIgorCQkJICAgICAgICJyZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTc7CisJfQorCSNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgcGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUocGxlbiwgcG9zKTsKKyNlbmRpZgorCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCWlmIChtZW1jbXAoaWN2LCBwb3MgKyBwbGVuLCA0KSAhPSAwKSB7CisJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIpIHsKKwkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkgbG9zdCwgc28KKwkJCSAqIGl0IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGFja2V0LiAqLworCQkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAwOworCQl9CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiBJQ1YgZXJyb3IgZGV0ZWN0ZWQ6IFNUQT0iCisJCQkgICAgICAgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMrKzsKKwkJcmV0dXJuIC01OworCX0KKworI2VuZGlmIAkvKiBKT0hOX1RLSVAgKi8KKworCS8qIFVwZGF0ZSByZWFsIGNvdW50ZXJzIG9ubHkgYWZ0ZXIgTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZCAqLworCXRrZXktPnJ4X2l2MzJfbmV3ID0gaXYzMjsKKwl0a2V5LT5yeF9pdjE2X25ldyA9IGl2MTY7CisKKwkvKiBSZW1vdmUgSVYgYW5kIElDViAqLworCW1lbW1vdmUoc2tiLT5kYXRhICsgOCwgc2tiLT5kYXRhLCBoZHJfbGVuKTsKKwlza2JfcHVsbChza2IsIDgpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0KTsKKworLy9qb2huJ3MgdGVzdAorI2lmZGVmIEpPSE5fRFVNUAoraWYoICgodTE2Kilza2ItPmRhdGEpWzBdICYgMHg0MDAwKXsKKyAgICAgICAgcHJpbnRrKCJAQCByeCBkZWNyeXB0ZWQgc2tiLT5kYXRhIik7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoaT0wO2k8c2tiLT5sZW47aSsrKXsKKyAgICAgICAgICAgICAgICBpZiggKGklMjQpPT0wICkgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgICAgIHByaW50aygiJTJ4ICIsICgodTgqKXNrYi0+ZGF0YSlbaV0pOworICAgICAgICB9CisgICAgICAgIHByaW50aygiXG4iKTsKK30KKyNlbmRpZiAvKkpPSE5fRFVNUCovCisJcmV0dXJuIGtleWlkeDsKK30KKworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSwgdTggKmtleSwgdTggKmhkciwKKwkJICAgICAgIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptaWMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IGhhc2hfZGVzYyBkZXNjOworCWludCByZXQ9MDsKKyNlbmRpZgorCWlmICh0a2V5LT50Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKGhkcik7CisJc2dbMF0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoaGRyKTsKKwlzZ1swXS5sZW5ndGggPSAxNjsKKworCXNnWzFdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CisJc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7CisJc2dbMV0ubGVuZ3RoID0gZGF0YV9sZW47CisKKwkvL2NyeXB0b19kaWdlc3RfaW5pdCh0a2V5LT50Zm1fbWljaGFlbCk7CisJLy9jcnlwdG9fZGlnZXN0X3NldGtleSh0a2V5LT50Zm1fbWljaGFlbCwga2V5LCA4KTsKKwkvL2NyeXB0b19kaWdlc3RfdXBkYXRlKHRrZXktPnRmbV9taWNoYWVsLCBzZywgMik7CisJLy9jcnlwdG9fZGlnZXN0X2ZpbmFsKHRrZXktPnRmbV9taWNoYWVsLCBtaWMpOworCisJLy9yZXR1cm4gMDsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJY3J5cHRvX2RpZ2VzdF9pbml0KHRrZXktPnRmbV9taWNoYWVsKTsKKwljcnlwdG9fZGlnZXN0X3NldGtleSh0a2V5LT50Zm1fbWljaGFlbCwga2V5LCA4KTsKKwljcnlwdG9fZGlnZXN0X3VwZGF0ZSh0a2V5LT50Zm1fbWljaGFlbCwgc2csIDIpOworCWNyeXB0b19kaWdlc3RfZmluYWwodGtleS0+dGZtX21pY2hhZWwsIG1pYyk7CisKKwlyZXR1cm4gMDsKKyNlbHNlCitpZiAoY3J5cHRvX2hhc2hfc2V0a2V5KHRrZXktPnRmbV9taWNoYWVsLCBrZXksIDgpKQorCQlyZXR1cm4gLTE7CisKKy8vCXJldHVybiAwOworCWRlc2MudGZtID0gdGtleS0+dGZtX21pY2hhZWw7CisJZGVzYy5mbGFncyA9IDA7CisJcmV0ID0gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisjZWxzZQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbV9taWNoYWVsLCB1OCAqIGtleSwgdTggKiBoZHIsCisgICAgICAgICAgICAgICAgICAgICAgIHU4ICogZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqIG1pYykKK3sKKyAgICAgICAgc3RydWN0IGhhc2hfZGVzYyBkZXNjOworICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisKKyAgICAgICAgaWYgKHRmbV9taWNoYWVsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgICNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaGRyKTsKKyAgICAgICAgICBzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShoZHIpOworICAgICAgICAgIHNnWzBdLmxlbmd0aCA9IDE2OworICAgICAgICAgIHNnWzFdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YSk7CisgICAgICAgICAgc2dbMV0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7CisgICAgICAgICAgc2dbMV0ubGVuZ3RoID0gZGF0YV9sZW47CisgICAgICAgICNlbHNlCisgICAgICAgICAgc2dfaW5pdF90YWJsZShzZywgMik7CisgICAgICAgICAgc2dfc2V0X2J1Zigmc2dbMF0sIGhkciwgMTYpOworICAgICAgICAgIHNnX3NldF9idWYoJnNnWzFdLCBkYXRhLCBkYXRhX2xlbik7CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGlmIChjcnlwdG9faGFzaF9zZXRrZXkodGZtX21pY2hhZWwsIGtleSwgOCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGRlc2MudGZtID0gdGZtX21pY2hhZWw7CisgICAgICAgIGRlc2MuZmxhZ3MgPSAwOworICAgICAgICByZXR1cm4gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKK30KKyNlbmRpZgorCisKKworc3RhdGljIHZvaWQgbWljaGFlbF9taWNfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZHIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjExOworCisJaGRyMTEgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN3aXRjaCAobGUxNl90b19jcHUoaGRyMTEtPmZyYW1lX2N0bCkgJgorCQkoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHI0LCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIyLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCX0KKworCWhkclsxMl0gPSAwOyAvKiBwcmlvcml0eSAqLworCisJaGRyWzEzXSA9IGhkclsxNF0gPSBoZHJbMTVdID0gMDsgLyogcmVzZXJ2ZWQgKi8KK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCA4IHx8IHNrYi0+bGVuIDwgaGRyX2xlbikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBwYWNrZXQgZm9yIE1pY2hhZWwgTUlDIGFkZCAiCisJCSAgICAgICAiKHRhaWxyb29tPSVkIGhkcl9sZW49JWQgc2tiLT5sZW49JWQpXG4iLAorCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksIGhkcl9sZW4sIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnR4X2hkcik7CisKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT50eF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisJcG9zID0gc2tiX3B1dChza2IsIDgpOworICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChtaWNoYWVsX21pYyh0a2V5LCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLAorCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKG1pY2hhZWxfbWljKHRrZXktPnR4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKKyAgICAgICAgI2VuZGlmCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTgKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJICAgICAgIGludCBrZXlpZHgpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSBldjsKKworCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwga2V5aWQsIGtleSB0eXBlLCBUU0MgKi8KKwltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKwlldi5mbGFncyA9IGtleWlkeCAmIElXX01JQ0ZBSUxVUkVfS0VZX0lEOworCWlmIChoZHItPmFkZHIxWzBdICYgMHgwMSkKKwkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9HUk9VUDsKKwllbHNlCisJCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfUEFJUldJU0U7CisJZXYuc3JjX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShldi5zcmNfYWRkci5zYV9kYXRhLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YoZXYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsICZ3cnF1LCAoY2hhciAqKSAmZXYpOworfQorI2VsaWYgV0lSRUxFU1NfRVhUID49IDE1CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCSAgICAgICBpbnQga2V5aWR4KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCBrZXlpZCwga2V5IHR5cGUsIFRTQyAqLworCXNwcmludGYoYnVmLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKGtleWlkPSVkICVzY2FzdCBhZGRyPSIKKwkJTUFDX0ZNVCAiKSIsIGtleWlkeCwgaGRyLT5hZGRyMVswXSAmIDB4MDEgPyAiYnJvYWQiIDogInVuaSIsCisJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWYpOworfQorI2Vsc2UgLyogV0lSRUxFU1NfRVhUID49IDE1ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCQkJICAgICAgaW50IGtleWlkeCkKK3sKK30KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY192ZXJpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKKwkJCQkgICAgIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCBtaWNbOF07CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAtMTsKKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnJ4X2hkcik7CisJLy8geyBkYXZpZCwgMjAwNi45LjEKKwkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwkJdGtleS0+cnhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKKwl9CisJLy8gfQorICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChtaWNoYWVsX21pYyh0a2V5LCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAorCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKKyAgICAgICAgI2Vsc2UKKwlpZiAobWljaGFlbF9taWModGtleS0+cnhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMjRdLCB0a2V5LT5yeF9oZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQorICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yICIKKwkJICAgICAgICJNU0RVIGZyb20gIiBNQUNfRk1UICIga2V5aWR4PSVkXG4iLAorCQkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICJOL0EiLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkgICAgICAga2V5aWR4KTsKKwkJaWYgKHNrYi0+ZGV2KQorCQkJaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlcysrOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVXBkYXRlIFRTQyBjb3VudGVycyBmb3IgUlggbm93IHRoYXQgdGhlIHBhY2tldCB2ZXJpZmljYXRpb24gaGFzCisJICogY29tcGxldGVkLiAqLworCXRrZXktPnJ4X2l2MzIgPSB0a2V5LT5yeF9pdjMyX25ldzsKKwl0a2V5LT5yeF9pdjE2ID0gdGtleS0+cnhfaXYxNl9uZXc7CisKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gOCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwlpbnQga2V5aWR4OworCSNpZiAoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSB0a2V5LT50Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtMiA9IHRrZXktPnRmbV9hcmM0OworCSNlbHNlCisJc3RydWN0IGNyeXB0b19oYXNoICp0Zm0gPSB0a2V5LT50eF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtMiA9IHRrZXktPnR4X3RmbV9hcmM0OworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtMyA9IHRrZXktPnJ4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm00ID0gdGtleS0+cnhfdGZtX2FyYzQ7CisJI2VuZGlmCisKKwlrZXlpZHggPSB0a2V5LT5rZXlfaWR4OworCW1lbXNldCh0a2V5LCAwLCBzaXplb2YoKnRrZXkpKTsKKwl0a2V5LT5rZXlfaWR4ID0ga2V5aWR4OworCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwl0a2V5LT50Zm1fbWljaGFlbCA9IHRmbTsKKwl0a2V5LT50Zm1fYXJjNCA9IHRmbTI7CisgICAgICAgI2Vsc2UKKwl0a2V5LT50eF90Zm1fbWljaGFlbCA9IHRmbTsKKwl0a2V5LT50eF90Zm1fYXJjNCA9IHRmbTI7CisJdGtleS0+cnhfdGZtX21pY2hhZWwgPSB0Zm0zOworCXRrZXktPnJ4X3RmbV9hcmM0ID0gdGZtNDsKKwkjZW5kaWYKKworCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CisJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKKwkJdGtleS0+a2V5X3NldCA9IDE7CisJCXRrZXktPnR4X2l2MTYgPSAxOyAvKiBUU0MgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworCQlpZiAoc2VxKSB7CisJCQl0a2V5LT5yeF9pdjMyID0gKHNlcVs1XSA8PCAyNCkgfCAoc2VxWzRdIDw8IDE2KSB8CisJCQkJKHNlcVszXSA8PCA4KSB8IHNlcVsyXTsKKwkJCXRrZXktPnJ4X2l2MTYgPSAoc2VxWzFdIDw8IDgpIHwgc2VxWzBdOworCQl9CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJdGtleS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKworCWlmIChsZW4gPCBUS0lQX0tFWV9MRU4pCisJCXJldHVybiAtMTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGtleSwgdGtleS0+a2V5LCBUS0lQX0tFWV9MRU4pOworCisJaWYgKHNlcSkgeworCQkvKiBSZXR1cm4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCB0cmFuc21pdHRlZCBmcmFtZS4gKi8KKwkJdTE2IGl2MTYgPSB0a2V5LT50eF9pdjE2OworCQl1MzIgaXYzMiA9IHRrZXktPnR4X2l2MzI7CisJCWlmIChpdjE2ID09IDApCisJCQlpdjMyLS07CisJCWl2MTYtLTsKKwkJc2VxWzBdID0gdGtleS0+dHhfaXYxNjsKKwkJc2VxWzFdID0gdGtleS0+dHhfaXYxNiA+PiA4OworCQlzZXFbMl0gPSB0a2V5LT50eF9pdjMyOworCQlzZXFbM10gPSB0a2V5LT50eF9pdjMyID4+IDg7CisJCXNlcVs0XSA9IHRrZXktPnR4X2l2MzIgPj4gMTY7CisJCXNlcVs1XSA9IHRrZXktPnR4X2l2MzIgPj4gMjQ7CisJfQorCisJcmV0dXJuIFRLSVBfS0VZX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRraXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9VEtJUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicmVwbGF5cz0lZCBpY3ZfZXJyb3JzPSVkIGxvY2FsX21pY19mYWlsdXJlcz0lZFxuIiwKKwkJICAgICB0a2lwLT5rZXlfaWR4LCB0a2lwLT5rZXlfc2V0LAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+dHhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MTYgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+cnhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MTYgJiAweGZmLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMpOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CisJLm5hbWUJCQk9ICJUS0lQIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfdGtpcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfdGtpcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQsCisJLmRlY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5LAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0ICsgNCwgLyogSVYgKyBFeHRJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDggKyA0LCAvKiBNSUMgKyBJQ1YgKi8KKwkub3duZXIJCSAgICAgICAgPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKworCit2b2lkIGllZWU4MDIxMV90a2lwX251bGwodm9pZCkKK3sKKy8vICAgIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKK30KKworI2lmIDAKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdGtpcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfdGtpcF9udWxsKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTczZGFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBXRVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKyAgICAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2VuZGlmCisvLyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFdFUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgT1BFTlNVU0VfU0xFRAorI2lmbmRlZiBJTl9PUEVOU1VTRV9TTEVECisjZGVmaW5lIElOX09QRU5TVVNFX1NMRUQgMQorI2VuZGlmCisjZW5kaWYKKworCitzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKKwl1MzIgaXY7CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisJdTgga2V5W1dFUF9LRVlfTEVOICsgMV07CisJdTgga2V5X2xlbjsKKwl1OCBrZXlfaWR4OworCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwkjZWxzZQorCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm07CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbTsKKwkjZW5kaWYKK307CisKKworc3RhdGljIHZvaWQgKiBwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5aWR4OworCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJcHJpdi0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbSgiYXJjNCIsIDApOworICAgICAJaWYgKHByaXYtPnRmbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJI2Vsc2UKKwlwcml2LT50eF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+dHhfdGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKwlwcml2LT5yeF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+cnhfdGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKwkjZW5kaWYKKworCS8qIHN0YXJ0IFdFUCBJViBmcm9tIGEgcmFuZG9tIHZhbHVlICovCisJZ2V0X3JhbmRvbV9ieXRlcygmcHJpdi0+aXYsIDQpOworCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50Zm0pCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorICAgICAgICNlbHNlCisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnR4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT50eF90Zm0pOworCQlpZiAocHJpdi0+cnhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnJ4X3RmbSk7CisJCWtmcmVlKHByaXYpOworCX0KKwkjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfd2VwX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKl9wcml2ID0gcHJpdjsKKwkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJaWYgKF9wcml2ICYmIF9wcml2LT50Zm0pCisJCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dGZtKTsKKwkjZWxzZQorCWlmIChfcHJpdikgeworCQlpZiAoX3ByaXYtPnR4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtKTsKKwkJaWYgKF9wcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnJ4X3RmbSk7CisJfQorICAgICAgICAjZW5kaWYKKwlrZnJlZShwcml2KTsKK30KKworCisvKiBQZXJmb3JtIFdFUCBlbmNyeXB0aW9uIG9uIGdpdmVuIHNrYiB0aGF0IGhhcyBhdCBsZWFzdCA0IGJ5dGVzIG9mIGhlYWRyb29tCisgKiBmb3IgSVYgYW5kIDQgYnl0ZXMgb2YgdGFpbHJvb20gZm9yIElDVi4gQm90aCBJViBhbmQgSUNWIHdpbGwgYmUgdHJhbnNtaXR0ZWQsCisgKiBzbyB0aGUgcGF5bG9hZCBsZW5ndGggaW5jcmVhc2VzIHdpdGggOCBieXRlcy4KKyAqCisgKiBXRVAgZnJhbWUgcGF5bG9hZDogSVYgKyBUWCBrZXkgaWR4LCBSQzQoZGF0YSksIElDViA9IFJDNChDUkMzMihkYXRhKSkKKyAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKy8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKyAgICAgICAgc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHdlcC0+dHhfdGZtfTsKKyNlbmRpZgorCXUzMiBrbGVuLCBsZW47CisJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CisJdTggKnBvczsKKyNpZm5kZWYgSk9ITl9IV1NFQworCXUzMiBjcmM7CisJdTggKmljdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisjZW5kaWYKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA0IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIDQpOworCW1lbW1vdmUocG9zLCBwb3MgKyA0LCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKworCWtsZW4gPSAzICsgd2VwLT5rZXlfbGVuOworCisJd2VwLT5pdisrOworCisJLyogRmx1aHJlciwgTWFudGluLCBhbmQgU2hhbWlyIGhhdmUgcmVwb3J0ZWQgd2Vha25lc3NlcyBpbiB0aGUga2V5CisJICogc2NoZWR1bGluZyBhbGdvcml0aG0gb2YgUkM0LiBBdCBsZWFzdCBJVnMgKEtleUJ5dGUgKyAzLCAweGZmLCBOKQorCSAqIGNhbiBiZSB1c2VkIHRvIHNwZWVkdXAgYXR0YWNrcywgc28gYXZvaWQgdXNpbmcgdGhlbS4gKi8KKwlpZiAoKHdlcC0+aXYgJiAweGZmMDApID09IDB4ZmYwMCkgeworCQl1OCBCID0gKHdlcC0+aXYgPj4gMTYpICYgMHhmZjsKKwkJaWYgKEIgPj0gMyAmJiBCIDwga2xlbikKKwkJCXdlcC0+aXYgKz0gMHgwMTAwOworCX0KKworCS8qIFByZXBlbmQgMjQtYml0IElWIHRvIFJDNCBrZXkgYW5kIFRYIGZyYW1lICovCisJKnBvcysrID0ga2V5WzBdID0gKHdlcC0+aXYgPj4gMTYpICYgMHhmZjsKKwkqcG9zKysgPSBrZXlbMV0gPSAod2VwLT5pdiA+PiA4KSAmIDB4ZmY7CisJKnBvcysrID0ga2V5WzJdID0gd2VwLT5pdiAmIDB4ZmY7CisJKnBvcysrID0gd2VwLT5rZXlfaWR4IDw8IDY7CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKyNpZm5kZWYgSk9ITl9IV1NFQworCS8qIEFwcGVuZCBsaXR0bGUtZW5kaWFuIENSQzMyIGFuZCBlbmNyeXB0IGl0IHRvIHByb2R1Y2UgSUNWICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKKyNlbHNlCisJY3JjID0gfmV0aGVyX2NyY19sZShsZW4sIHBvcyk7CisjZW5kaWYKKwlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CisJaWN2WzBdID0gY3JjOworCWljdlsxXSA9IGNyYyA+PiA4OworCWljdlsyXSA9IGNyYyA+PiAxNjsKKwlpY3ZbM10gPSBjcmMgPj4gMjQ7CisKKyAgICAgICAgLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfc2V0a2V5KHdlcC0+dGZtLCBrZXksIGtsZW4pOworCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKwlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworCXNnLmxlbmd0aCA9IGxlbiArIDQ7CisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHdlcC0+dGZtLCAmc2csICZzZywgbGVuICsgNCk7CisKKwlyZXR1cm4gMDsKKwkjZWxzZQorCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+dHhfdGZtLCBrZXksIGtsZW4pOworICAgICAgICAjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisgICAgICAgICAgc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5sZW5ndGggPSBsZW4gKyA0OworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7CisgICAgICAgICNlbmRpZgorCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKKwkjZW5kaWYKKyNlbmRpZiAvKiBKT0hOX0hXU0VDICovCisJcmV0dXJuIDA7Cit9CisKKworLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgorICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAorICogSUNWICg0IGJ5dGVzKS4gbGVuIGluY2x1ZGVzIGJvdGggSVYgYW5kIElDVi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgZnJhbWUgd2FzIGRlY3J5cHRlZCBzdWNjZXNzZnVsbHkgYW5kIElDViB3YXMgY29ycmVjdCBhbmQgLTEgb24KKyAqIGZhaWx1cmUuIElmIGZyYW1lIGlzIE9LLCBJViBhbmQgSUNWIHdpbGwgYmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKyAgICAgICAgLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKyAgICAgICAgc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHdlcC0+cnhfdGZtfTsKKyAgICAgICAgI2VuZGlmCisJdTMyIGtsZW4sIHBsZW47CisJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CisJdTgga2V5aWR4LCAqcG9zOworI2lmbmRlZiBKT0hOX0hXU0VDCisJdTMyIGNyYzsKKwl1OCBpY3ZbNF07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworI2VuZGlmCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIDgpCisJCXJldHVybiAtMTsKKworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5WzBdID0gKnBvcysrOworCWtleVsxXSA9ICpwb3MrKzsKKwlrZXlbMl0gPSAqcG9zKys7CisJa2V5aWR4ID0gKnBvcysrID4+IDY7CisJaWYgKGtleWlkeCAhPSB3ZXAtPmtleV9pZHgpCisJCXJldHVybiAtMTsKKworCWtsZW4gPSAzICsgd2VwLT5rZXlfbGVuOworCisJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCisJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJLyogQXBwbHkgUkM0IHRvIGRhdGEgYW5kIGNvbXB1dGUgQ1JDMzIgb3ZlciBkZWNyeXB0ZWQgZGF0YSAqLworCXBsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW4gLSA4OworI2lmbmRlZiBKT0hOX0hXU0VDCisvLyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkod2VwLT50Zm0sIGtleSwga2xlbik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gcGxlbiArIDQ7CisJY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHdlcC0+dGZtLCAmc2csICZzZywgcGxlbiArIDQpOworI2Vsc2UKKwljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnJ4X3RmbSwga2V5LCBrbGVuKTsKKyAgICAgICAgI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworICAgICAgICAgIHNnLmxlbmd0aCA9IHBsZW4gKyA0OworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfb25lKCZzZywgcG9zLCBwbGVuKzQpOworICAgICAgICAjZW5kaWYKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgcGxlbiArIDQpKQorCQlyZXR1cm4gLTc7CisjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIHBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKHBsZW4sIHBvcyk7CisjZW5kaWYKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKworCWlmIChtZW1jbXAoaWN2LCBwb3MgKyBwbGVuLCA0KSAhPSAwKSB7CisJCS8qIElDViBtaXNtYXRjaCAtIGRyb3AgZnJhbWUgKi8KKwkJcmV0dXJuIC0yOworCX0KKyNlbmRpZiAJLyogSk9ITl9IV1NFQyAqLworCisJLyogUmVtb3ZlIElWIGFuZCBJQ1YgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSArIDQsIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCA0KTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7CisgICAgICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCisJaWYgKGxlbiA8IDAgfHwgbGVuID4gV0VQX0tFWV9MRU4pCisJCXJldHVybiAtMTsKKworCW1lbWNweSh3ZXAtPmtleSwga2V5LCBsZW4pOworCXdlcC0+a2V5X2xlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCisJaWYgKGxlbiA8IHdlcC0+a2V5X2xlbikKKwkJcmV0dXJuIC0xOworCisJbWVtY3B5KGtleSwgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwlyZXR1cm4gd2VwLT5rZXlfbGVuOworfQorCisKK3N0YXRpYyBjaGFyICogcHJpc20yX3dlcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1XRVAgbGVuPSVkXG4iLAorCQkgICAgIHdlcC0+a2V5X2lkeCwgd2VwLT5rZXlfbGVuKTsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF93ZXAgPSB7CisJLm5hbWUJCQk9ICJXRVAiLAorCS5pbml0CQkJPSBwcmlzbTJfd2VwX2luaXQsCisJLmRlaW5pdAkJCT0gcHJpc20yX3dlcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBwcmlzbTJfd2VwX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBwcmlzbTJfd2VwX2RlY3J5cHQsCisJLmVuY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21zZHUJCT0gTlVMTCwKKwkuc2V0X2tleQkJPSBwcmlzbTJfd2VwX3NldF9rZXksCisJLmdldF9rZXkJCT0gcHJpc20yX3dlcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBwcmlzbTJfd2VwX3ByaW50X3N0YXRzLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gNCwgLyogSVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA0LCAvKiBJQ1YgKi8KKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitpbnQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpCit7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCkKK3sKKy8vCXByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKK30KKyNpZiAwCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dlcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd2VwX251bGwpOworI2VuZGlmCisjZW5kaWYKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWZlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MDIuMTEgZGF0YS9tYW5hZ2VtZW50L2NvbnRyb2wgc3RhY2siKTsKK01PRFVMRV9BVVRIT1IoIkNvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIERSVl9OQU1FICJpZWVlODAyMTEiCisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoaWVlZS0+bmV0d29ya3MpCisJCXJldHVybiAwOworCisJaWVlZS0+bmV0d29ya3MgPSBrbWFsbG9jKAorCQlNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWllZWUtPm5ldHdvcmtzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29uc1xuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChpZWVlLT5uZXR3b3JrcywgMCwKKwkgICAgICAgTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmICghaWVlZS0+bmV0d29ya3MpCisJCXJldHVybjsKKwlrZnJlZShpZWVlLT5uZXR3b3Jrcyk7CisJaWVlZS0+bmV0d29ya3MgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTkVUV09SS19DT1VOVDsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZpZWVlLT5uZXR3b3Jrc1tpXS5saXN0LCAmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOworfQorCisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksZXJyOworCisJSUVFRTgwMjExX0RFQlVHX0lORk8oIkluaXRpYWxpemluZy4uLlxuIik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UpICsgc2l6ZW9mX3ByaXYpOworCWlmICghZGV2KSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIG5ldHdvcmsgZGV2aWNlLlxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV94bWl0OworCisJaWVlZS0+ZGV2ID0gZGV2OworCisJZXJyID0gaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKGllZWUpOworCWlmIChlcnIpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgYmVhY29uIHN0b3JhZ2U6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShpZWVlKTsKKworCS8qIERlZmF1bHQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbWF4aW11bSBwYXlsb2FkIHNpemUgKi8KKwlpZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKKwlpZWVlLT5zY2FuX2FnZSA9IERFRkFVTFRfTUFYX1NDQU5fQUdFOworCWllZWUtPm9wZW5fd2VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCisJaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOworCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKKworCWllZWUtPndwYXhfdHlwZV9zZXQgPSAwOworIAlpZWVlLT53cGFfZW5hYmxlZCA9IDA7CisgCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gMDsKKyAJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7CisgCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CisgCWllZWUtPmllZWU4MDJfMXggPSAxOworCWllZWUtPnJhd190eCA9IDA7CisKKwlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOworCisJZm9yIChpID0gMDsgaSA8IElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5pYnNzX21hY19oYXNoW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisJICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKKwl9CisvL1RoZXNlIGZ1bmN0aW9uIHdlcmUgYWRkZWQgdG8gbG9hZCBjcnlwdGUgbW9kdWxlIGF1dG9seQorCWllZWU4MDIxMV90a2lwX251bGwoKTsKKwlpZWVlODAyMTFfd2VwX251bGwoKTsKKwlpZWVlODAyMTFfY2NtcF9udWxsKCk7CisJcmV0dXJuIGRldjsKKworIGZhaWxlZDoKKwlpZiAoZGV2KQorCQlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOworfQorCisKK3ZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKKworCisJaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07CisJCWlmIChjcnlwdCkgeworCQkJaWYgKGNyeXB0LT5vcHMpIHsKKwkJCQljcnlwdC0+b3BzLT5kZWluaXQoY3J5cHQtPnByaXYpOworCQkJCW1vZHVsZV9wdXQoY3J5cHQtPm9wcy0+b3duZXIpOworCQkJfQorCQkJa2ZyZWUoY3J5cHQpOworCQkJaWVlZS0+Y3J5cHRbaV0gPSBOVUxMOworCQl9CisJfQorCisJaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoaWVlZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgcSwgJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pIHsKKwkJCWtmcmVlKGxpc3RfZW50cnkocCwgc3RydWN0IGllZWVfaWJzc19zZXEsIGxpc3QpKTsKKwkJCWxpc3RfZGVsKHApOworCQl9CisJfQorCisKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvLyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisjaWYgMAorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3UzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgc2hvd19kZWJ1Z19sZXZlbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiBzbnByaW50ZihwYWdlLCBjb3VudCwgIjB4JTA4WFxuIiwgaWVlZTgwMjExX2RlYnVnX2xldmVsKTsKK30KKworc3RhdGljIGludCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYnVmW10gPSAiMHgwMDAwMDAwMCI7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBtaW4oc2l6ZW9mKGJ1ZikgLSAxLCAodTMyKWNvdW50KTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbikpCisJCXJldHVybiBjb3VudDsKKwlidWZbbGVuXSA9IDA7CisJaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnIHx8IHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKSB7CisJCXArKzsKKwkJaWYgKHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKQorCQkJcCsrOworCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpOworCX0gZWxzZQorCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOworCWlmIChwID09IGJ1ZikKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gdmFsOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGllZWU4MDIxMV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCisJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gZGVidWc7CisJaWVlZTgwMjExX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgcHJvY19uZXQpOworCWlmIChpZWVlODAyMTFfcHJvYyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSAiIERSVl9OQU1FCisJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgaWVlZTgwMjExX3Byb2MpOworCWlmICghZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwllLT5yZWFkX3Byb2MgPSBzaG93X2RlYnVnX2xldmVsOworCWUtPndyaXRlX3Byb2MgPSBzdG9yZV9kZWJ1Z19sZXZlbDsKKwllLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKK3sKKwlpZiAoaWVlZTgwMjExX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgaWVlZTgwMjExX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJfQorfQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworCisKK21vZHVsZV9leGl0KGllZWU4MDIxMV9leGl0KTsKK21vZHVsZV9pbml0KGllZWU4MDIxMV9pbml0KTsKKyNlbmRpZgorCisjaWYgMAorRVhQT1JUX1NZTUJPTChhbGxvY19pZWVlODAyMTEpOworRVhQT1JUX1NZTUJPTChmcmVlX2llZWU4MDIxMSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllYzY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0wLDAgKzEsMTk3MSBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zIC0gaG9zdGFwLm8gbW9kdWxlLCBjb21tb24gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjIpCisgICAgICAgIHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisjZWxzZQorICAgICAgICBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisjZW5kaWYKKwlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKKwltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwluZXRpZl9yeChza2IpOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqCitpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1bnNpZ25lZCBpbnQgc2VxLAorCQkJICB1bnNpZ25lZCBpbnQgZnJhZywgdTggdGlkLHU4ICpzcmMsIHU4ICpkc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU47IGkrKykgeworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baV07CisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgZW50cnktPmZpcnN0X2ZyYWdfdGltZSArIDIgKiBIWikpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19GUkFHKAorCQkJCSJleHBpcmluZyBmcmFnbWVudCBjYWNoZSBlbnRyeSAiCisJCQkJInNlcT0ldSBsYXN0X2ZyYWc9JXVcbiIsCisJCQkJZW50cnktPnNlcSwgZW50cnktPmxhc3RfZnJhZyk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKwkJCWVudHJ5LT5za2IgPSBOVUxMOworCQl9CisKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJiBlbnRyeS0+c2VxID09IHNlcSAmJgorCQkgICAgKGVudHJ5LT5sYXN0X2ZyYWcgKyAxID09IGZyYWcgfHwgZnJhZyA9PSAtMSkgJiYKKwkJICAgIG1lbWNtcChlbnRyeS0+c3JjX2FkZHIsIHNyYywgRVRIX0FMRU4pID09IDAgJiYKKwkJICAgIG1lbWNtcChlbnRyeS0+ZHN0X2FkZHIsIGRzdCwgRVRIX0FMRU4pID09IDApCisJCQlyZXR1cm4gZW50cnk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2llZWU4MDIxMV9mcmFnX2NhY2hlX2dldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCXVuc2lnbmVkIGludCBmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyXzNhZGRyX1FvUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKmhkcl80YWRkcl9Rb1M7CisJdTggdGlkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJeworCQl0aWQgPSAoaGRyLT5hZGRyMltFVEhfQUxFTi0yXSBeIGhkci0+YWRkcjJbRVRIX0FMRU4tMV0pICYgSUVFRTgwMjExX1FPU19USUQ7CisJfQorCWVsc2UKKyNlbmRpZgorCWlmICgoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeworCSAgdGlkID0gMDsKKwl9CisKKwlpZiAoZnJhZyA9PSAwKSB7CisJCS8qIFJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGZpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGllZWUtPmRldi0+bXR1ICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSArCisJCQkJICAgIDggLyogTExDICovICsKKwkJCQkgICAgMiAvKiBhbGlnbm1lbnQgKi8gKworCQkJCSAgICA4IC8qIFdFUCAqLyArCisJCQkJICAgIEVUSF9BTEVOIC8qIFdEUyAqLyArCisJCQkJICAgIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpPzI6MCkgLyogUU9TIENvbnRyb2wgKi8pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdXTsKKwkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdKys7CisJCWlmIChpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPj0gSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOKQorCQkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID0gMDsKKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisKKwkJZW50cnktPmZpcnN0X2ZyYWdfdGltZSA9IGppZmZpZXM7CisJCWVudHJ5LT5zZXEgPSBzZXE7CisJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQllbnRyeS0+c2tiID0gc2tiOworCQltZW1jcHkoZW50cnktPnNyY19hZGRyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShlbnRyeS0+ZHN0X2FkZHIsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQkvKiByZWNlaXZlZCBhIGZyYWdtZW50IG9mIGEgZnJhbWUgZm9yIHdoaWNoIHRoZSBoZWFkIGZyYWdtZW50CisJCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLworCQllbnRyeSA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCBmcmFnLCB0aWQsaGRyLT5hZGRyMiwKKwkJCQkJCSAgaGRyLT5hZGRyMSk7CisJCWlmIChlbnRyeSAhPSBOVUxMKSB7CisJCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKKwkJCXNrYiA9IGVudHJ5LT5za2I7CisJCX0KKwl9CisKKwlyZXR1cm4gc2tiOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIGludCBpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyXzNhZGRyX1FvUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKmhkcl80YWRkcl9Rb1M7CisJdTggdGlkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJeworCQl0aWQgPSAoaGRyLT5hZGRyMltFVEhfQUxFTi0yXSBeIGhkci0+YWRkcjJbRVRIX0FMRU4tMV0pICYgSUVFRTgwMjExX1FPU19USUQ7CisJfQorCWVsc2UKKyNlbmRpZgorCWlmKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfM2FkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7CisJICB0aWQgPSAwOworCX0KKworCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIC0xLCB0aWQsaGRyLT5hZGRyMiwKKwkJCQkJICBoZHItPmFkZHIxKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVR19GUkFHKAorCQkJImNvdWxkIG5vdCBpbnZhbGlkYXRlIGZyYWdtZW50IGNhY2hlICIKKwkJCSJlbnRyeSAoc2VxPSV1KVxuIiwgc2VxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVudHJ5LT5za2IgPSBOVUxMOworCXJldHVybiAwOworfQorCisKKworLyogaWVlZTgwMjExX3J4X2ZyYW1lX21ndG10CisgKgorICogUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIG1hbmFnZW1lbnQgY29udHJvbCBmcmFtZXMKKyAqCisgKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCS8vIGNoZWF0IHRoZSB0aGUgaGRyIHR5cGUKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisKKwkvKiBPbiB0aGUgc3RydWN0IHN0YXRzIGRlZmluaXRpb24gdGhlcmUgaXMgd3JpdHRlbiB0aGF0CisJICogdGhpcyBpcyBub3QgbWFuZGF0b3J5Li4uLiBidXQgc2VlbXMgdGhhdCB0aGUgcHJvYmUKKwkgKiByZXNwb25zZSBwYXJzZXIgdXNlcyBpdAorCSAqLworCXJ4X3N0YXRzLT5sZW4gPSBza2ItPmxlbjsKKwlpZWVlODAyMTFfcnhfbWd0KGllZWUsKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhLHJ4X3N0YXRzKTsKKworCWlmKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSYmKG1lbWNtcChoZHItPmFkZHIzLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCWllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlyZXR1cm4gMDsKKworCSNpZmRlZiBOT1RfWUVUCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNYXN0ZXIgbW9kZSBub3QgeWV0IHN1cHBwb3J0ZWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisvKgorICBob3N0YXBfdXBkYXRlX3N0YV9wcyhpZWVlLCAoc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfaGRyICopCisgIHNrYi0+ZGF0YSk7Ki8KKwl9CisKKwlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9UWVBFX01HTVQpIHsKKwkJaWYgKHN0eXBlID09IFdMQU5fRkNfU1RZUEVfQkVBQ09OICYmCisJCSAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCS8qIFByb2Nlc3MgYmVhY29uIGZyYW1lcyBhbHNvIGluIGtlcm5lbCBkcml2ZXIgdG8KKwkJCSAqIHVwZGF0ZSBTVEEoQVApIHRhYmxlIHN0YXRpc3RpY3MgKi8KKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyKQorCQkJCWhvc3RhcF9yeChza2IyLT5kZXYsIHNrYjIsIHJ4X3N0YXRzKTsKKwkJfQorCisJCS8qIHNlbmQgbWFuYWdlbWVudCBmcmFtZXMgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGZvcgorCQkgKiBwcm9jZXNzaW5nICovCisJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKKwkJcmV0dXJuIDA7CisJfQorCisJICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgorCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKKwkjZW5kaWYKK30KKworCisKKy8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCisvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCisKKy8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLworc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBoZHJsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLworCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCisJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJvbURTIGZyYW1lIHdpdGggb3duIGFkZHIgYXMgREEgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCArIDgpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZm9yIHBvcnQgYWNjZXNzIGVudGl0eSBFdGhlcm5ldCB0eXBlICovCisvLwlwb3MgPSBza2ItPmRhdGEgKyAyNDsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbikpCisJeworCQloZHJsZW4gPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4oaWVlZSwgc2tiKTsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAorCWlmIChpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgorCSAgICBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVEtJUCBjb3VudGVybWVhc3VyZXM6IGRyb3BwZWQgIgorCQkJICAgICAgICJyZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdShza2IsIGhkcmxlbiwgY3J5cHQtPnByaXYpOworCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOworCWlmIChyZXMgPCAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJImRlY3J5cHRpb24gZmFpbGVkIChTQT0iIE1BQ19GTVQKKwkJCSIpIHJlcz0lZFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwgcmVzKTsKKwkJaWYgKHJlcyA9PSAtMikKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCBJQ1YgIgorCQkJCQkgICAgICJtaXNtYXRjaCAoa2V5ICVkKVxuIiwKKwkJCQkJICAgICBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNik7CisJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGludCBrZXlpZHgsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21zZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbikpCisJeworCQloZHJsZW4gPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4oaWVlZSwgc2tiKTsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdShza2IsIGtleWlkeCwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNU0RVIGRlY3J5cHRpb24vTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiIChTQT0iIE1BQ19GTVQgIiBrZXlpZHg9JWQpXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciovCisjZGVmaW5lIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUgKDUqSFopCitzdGF0aWMgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RsKTsKKwl1MTYgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJdTE2IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdTE2ICpsYXN0X3NlcSwgKmxhc3RfZnJhZzsKKwl1bnNpZ25lZCBsb25nICpsYXN0X3RpbWU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpoZHJfM2FkZHJfUW9TOworCXN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqaGRyXzRhZGRyX1FvUzsKKwl1OCB0aWQ7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwl7CisJCXRpZCA9IChoZWFkZXItPmFkZHIyW0VUSF9BTEVOLTJdIF4gaGVhZGVyLT5hZGRyMltFVEhfQUxFTi0xXSkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwl9CisJZWxzZQorI2VuZGlmCisJLy9UTzJEUyBhbmQgUW9TCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKiloZWFkZXI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeyAvL1FvUworCSAgaGRyXzNhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MqKWhlYWRlcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7IC8vIG5vIFFvUworCSAgdGlkID0gMDsKKwl9CisJc3dpdGNoIChpZWVlLT5pd19tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCXsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJc3RydWN0IGllZWVfaWJzc19zZXEgKmVudHJ5ID0gTlVMTDsKKwkJdTggKm1hYyA9IGhlYWRlci0+YWRkcjI7CisJCWludCBpbmRleCA9IG1hY1s1XSAlIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOworCQkvL2ZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisJCV9fbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaWVlZV9pYnNzX3NlcSwgbGlzdCk7CisJCQlpZiAoIW1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSkKKwkJCQlicmVhazsKKwkJfQorCS8vCWlmIChtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpeworCQlpZiAocCA9PSAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWVfaWJzc19zZXEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZW50cnkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgbWFsbG9jIG5ldyBtYWMgZW50cnlcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOworCQkJZW50cnktPnNlcV9udW1bdGlkXSA9IHNlcTsKKwkJCWVudHJ5LT5mcmFnX251bVt0aWRdID0gZnJhZzsKKwkJCWVudHJ5LT5wYWNrZXRfdGltZVt0aWRdID0gamlmZmllczsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxhc3Rfc2VxID0gJmVudHJ5LT5zZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZlbnRyeS0+ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmVudHJ5LT5wYWNrZXRfdGltZVt0aWRdOworCQlicmVhazsKKwl9CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxhc3Rfc2VxID0gJmllZWUtPmxhc3RfcnhzZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmllZWUtPmxhc3RfcGFja2V0X3RpbWVbdGlkXTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJeworCQkJbGFzdF9zZXEgPSAmaWVlZS0+bGFzdF9yeHNlcV9udW1bdGlkXTsKKwkJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJCWxhc3RfdGltZSA9ICZpZWVlLT5sYXN0X3BhY2tldF90aW1lW3RpZF07CisJCQlicmVhazsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisvLwlpZih0aWQgIT0gMCkgeworLy8JCXByaW50ayhLRVJOX1dBUk5JTkcgIjopKSkpKSkpKSkpKSV4ICV4ICV4LCBmYygleClcbiIsIHRpZCwgKmxhc3Rfc2VxLCBzZXEsIGhlYWRlci0+ZnJhbWVfY3RsKTsKKy8vCX0KKwlpZiAoKCpsYXN0X3NlcSA9PSBzZXEpICYmCisJICAgIHRpbWVfYWZ0ZXIoKmxhc3RfdGltZSArIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUsIGppZmZpZXMpKSB7CisJCWlmICgqbGFzdF9mcmFnID09IGZyYWcpeworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gZ28gZHJvcCFcbiIpOworCQkJZ290byBkcm9wOworCisJCX0KKwkJaWYgKCpsYXN0X2ZyYWcgKyAxICE9IGZyYWcpCisJCQkvKiBvdXQtb2Ytb3JkZXIgZnJhZ21lbnQgKi8KKwkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzJdIGdvIGRyb3AhXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwl9IGVsc2UKKwkJKmxhc3Rfc2VxID0gc2VxOworCisJKmxhc3RfZnJhZyA9IGZyYWc7CisJKmxhc3RfdGltZSA9IGppZmZpZXM7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisvLwlCVUdfT04oIShmYyAmIElFRUU4MDIxMV9GQ1RMX1JFVFJZKSk7CisvLwlwcmludGsoIkRVUFxuIik7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCisgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KK2ludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmhkcjsKKworCXNpemVfdCBoZHJsZW47CisJdTE2IGZjLCB0eXBlLCBzdHlwZSwgc2M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXVuc2lnbmVkIGludCBmcmFnOworCXU4ICpwYXlsb2FkOworCXUxNiBldGhlcnR5cGU7CisjaWZkZWYgTk9UX1lFVAorCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJaW50IGZyb21fYXNzb2NfYXAgPSAwOworCXZvaWQgKnN0YSA9IE5VTEw7CisjZW5kaWYKKy8vCXUxNiBRT1NfY3RsID0gMDsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCWludCBrZXlpZHggPSAwOworCisJLy9BZGRlZCBmb3IgbWVzaCBieSBMYXdyZW5jZS4KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJdTggc3RhdHVzOworCXUzMiBmbGFnczsKKyNlbmRpZgorCS8vIGNoZWF0IHRoZSB0aGUgaGRyIHR5cGUKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisKKwlpZiAoc2tiLT5sZW4gPCAxMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKwlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisKKwlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCisvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlpZigoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSAhPSBJRUVFODAyMTFfRkNUTF9UT0RTKQorCXsKKwkJaWYoIW1lbWNtcChoZHItPmFkZHIxLGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJeworCQkJaWVlZS0+TnVtUnhVbmljYXN0Kys7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIW1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCXsKKwkJCWllZWUtPk51bVJ4VW5pY2FzdCsrOworCQl9CisJfQorLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlLGVuZAorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKSkKKwl7CisJCWhkcmxlbiA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbihpZWVlLCBza2IpOworCQlpZihza2ItPmxlbiA8IGhkcmxlbikKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpOworCisjaWZkZWYgTk9UX1lFVAorI2lmIFdJUkVMRVNTX0VYVCA+IDE1CisJLyogUHV0IHRoaXMgY29kZSBoZXJlIHNvIHRoYXQgd2UgYXZvaWQgZHVwbGljYXRpbmcgaXQgaW4gYWxsCisJICogUnggcGF0aHMuIC0gSmVhbiBJSSAqLworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQkJLyogZGVmaW5lZCBpbiBpd19oYW5kbGVyLmggKi8KKwkvKiBJZiBzcHkgbW9uaXRvcmluZyBvbiAqLworCWlmIChpZmFjZS0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQl3c3RhdHMubGV2ZWwgPSByeF9zdGF0cy0+c2lnbmFsOworCQl3c3RhdHMubm9pc2UgPSByeF9zdGF0cy0+bm9pc2U7CisJCXdzdGF0cy51cGRhdGVkID0gNjsJLyogTm8gcXVhbCB2YWx1ZSAqLworCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGhkci0+YWRkcjIsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNSAqLworCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJaWVlZTgwMjExX21vbml0b3JfcngoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworI2lmZGVmIE5PVF9ZRVQKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKKwkJCQkJCQkmc3RhKTsKKyNlbmRpZgorCisJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCisJCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJaWYgKGNyeXB0ICYmIChjcnlwdC0+b3BzID09IE5VTEwgfHwKKwkJCSAgICAgIGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKKwkJCWNyeXB0ID0gTlVMTDsKKworCQlpZiAoIWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkpIHsKKwkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCisJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCisJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAorCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCisJCQkJCSAgICAgIiAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCQkgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikKKwkJZ290byByeF9kcm9wcGVkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKCBpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X3VwZGF0ZV9leHBpcmUgKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X21ndF91cGRhdGVfZXhwaXJlKCBpZWVlLCBza2IgKTsKKyNlbmRpZgorCisJLy8gaWYgUW9TIGVuYWJsZWQsIHNob3VsZCBjaGVjayB0aGUgc2VxdWVuY2UgZm9yIGVhY2ggb2YgdGhlIEFDCisJaWYgKGlzX2R1cGxpY2F0ZV9wYWNrZXQoaWVlZSwgaGRyKSkKKwkJZ290byByeF9kcm9wcGVkOworCisKKwlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkgeworCisJI2lmIDAKKwkJaWYgKCBzdHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfQVVUSCAmJgorCQkgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9XRVAgJiYgaWVlZS0+aG9zdF9kZWNyeXB0ICYmCisJCSAgICAoa2V5aWR4ID0gaG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gZGVjcnlwdCBtZ210OjphdXRoICIKKwkJCSAgICAgICAiZnJvbSAiIE1BQ19GTVQgIlxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJLyogVE9ETzogY291bGQgaW5mb3JtIGhvc3RhcGQgYWJvdXQgdGhpcyBzbyB0aGF0IGl0CisJCQkgKiBjb3VsZCBzZW5kIGF1dGggZmFpbHVyZSByZXBvcnQgKi8KKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCSNlbmRpZgorCisKKwkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJZWxzZQorCQkJZ290byByeF9leGl0OworCX0KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfb25fcngpCisJeworCQlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X29uX3J4KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKT09MCkKKwkJeworCQkJZ290byByeF9leGl0OworCQl9CisJfQorI2VuZGlmCisKKwkvKiBEYXRhIGZyYW1lIC0gZXh0cmFjdCBzcmMvZHN0IGFkZHJlc3NlcyAqLworCXN3aXRjaCAoZmMgJiAoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCxoZHItPmFkZHIyLEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLGhkci0+YWRkcjEsRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQorCQkJZ290byByeF9kcm9wcGVkOworCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLGhkci0+YWRkcjMsRVRIX0FMRU4pOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKGhvc3RhcF9yeF9mcmFtZV93ZHMoaWVlZSwgaGRyLCBmYywgJndkcykpCisJCWdvdG8gcnhfZHJvcHBlZDsKKwlpZiAod2RzKSB7CisJCXNrYi0+ZGV2ID0gZGV2ID0gd2RzOworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCisJICAgIChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0gSUVFRTgwMjExX0ZDVExfRlJPTURTICYmCisJICAgIGllZWUtPnN0YWRldiAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMiwgaWVlZS0+YXNzb2NfYXBfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJhbWUgZnJvbSBCU1NJRCBvZiB0aGUgQVAgZm9yIHdoaWNoIHdlIGFyZSBhIGNsaWVudCAqLworCQlza2ItPmRldiA9IGRldiA9IGllZWUtPnN0YWRldjsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJCWZyb21fYXNzb2NfYXAgPSAxOworCX0KKyNlbmRpZgorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgfHwKKwkgICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQpICYmCisJICAgICFmcm9tX2Fzc29jX2FwKSB7CisJCXN3aXRjaCAoaG9zdGFwX2hhbmRsZV9zdGFfcngoaWVlZSwgZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQkgICAgIHdkcyAhPSBOVUxMKSkgeworCQljYXNlIEFQX1JYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9DT05USU5VRToKKwkJCWZyYW1lX2F1dGhvcml6ZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQVBfUlhfRFJPUDoKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJY2FzZSBBUF9SWF9FWElUOgorCQkJZ290byByeF9leGl0OworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfaXNfdmFsaWRfZnJhbWVjdGwpCisJeworCQlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2lzX3ZhbGlkX2ZyYW1lY3RsKGllZWUsIGZjLCB0eXBlLCBzdHlwZSk9PTApCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCWVsc2UKKyNlbmRpZgorCS8qIE51bGxmdW5jIGZyYW1lcyBtYXkgaGF2ZSBQUy1iaXQgc2V0LCBzbyB0aGV5IG11c3QgYmUgcGFzc2VkIHRvCisJICogaG9zdGFwX2hhbmRsZV9zdGFfcngoKSBiZWZvcmUgYmVpbmcgZHJvcHBlZCBoZXJlLiAqLworCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQSAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSyAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBLy9hZGQgYnkgRGF2aWQsMjAwNi44LjQKKwkgICAgKSB7CisJCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCQkiUlg6IGRyb3BwZWQgZGF0YSBmcmFtZSAiCisJCQkJIndpdGggbm8gZGF0YSAodHlwZT0weCUwMngsICIKKwkJCQkic3VidHlwZT0weCUwMngsIGxlbj0lZClcbiIsCisJCQkJdHlwZSwgc3R5cGUsIHNrYi0+bGVuKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKwlpZihtZW1jbXAoYnNzaWQsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSkgeworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJaWVlZS0+TnVtUnhEYXRhSW5QZXJpb2QrKzsKKwlpZWVlLT5OdW1SeE9rVG90YWwrKzsKKwkvKiBza2I6IGhkciArIChwb3NzaWJseSBmcmFnbWVudGVkLCBwb3NzaWJseSBlbmNyeXB0ZWQpIHBheWxvYWQgKi8KKworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICAoa2V5aWR4ID0gaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJZ290byByeF9kcm9wcGVkOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQpIHBsYWludGV4dCBwYXlsb2FkICovCisJLy8gUFI6IEZJWE1FOiBob3N0YXAgaGFzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBpbiB0aGUgImlmIiBiZWxvdzoKKwkvLyBpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCWlmICgoZnJhZyAhPSAwIHx8IChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpKSB7CisJCWludCBmbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2IgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoaWVlZSwgaGRyKTsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoIlJ4IEZyYWdtZW50IHJlY2VpdmVkICgldSlcbiIsIGZyYWcpOworCisJCWlmICghZnJhZ19za2IpIHsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlggfCBJRUVFODAyMTFfRExfRlJBRywKKwkJCQkJIlJ4IGNhbm5vdCBnZXQgc2tiIGZyb20gZnJhZ21lbnQgIgorCQkJCQkiY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCQkJKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSAhPSAwLAorCQkJCQlXTEFOX0dFVF9TRVFfU0VRKHNjKSwgZnJhZyk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkJZmxlbiA9IHNrYi0+bGVuOworCQlpZiAoZnJhZyAhPSAwKQorCQkJZmxlbiAtPSBoZHJsZW47CisKKwkJaWYgKGZyYWdfc2tiLT50YWlsICsgZmxlbiA+IGZyYWdfc2tiLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRlY3J5cHRlZCBhbmQgIgorCQkJICAgICAgICJyZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWlmIChmcmFnID09IDApIHsKKwkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAorCQkJICogY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKKwkJCSAgICAgICBmbGVuKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBOVUxMOworCisJCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgeworCQkJLyogbW9yZSBmcmFnbWVudHMgZXhwZWN0ZWQgLSBsZWF2ZSB0aGUgc2tiIGluIGZyYWdtZW50CisJCQkgKiBjYWNoZSBmb3Igbm93OyBpdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB1cHBlciBsYXllcnMKKwkJCSAqIGFmdGVyIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBmcmFnbWVudCBhbmQgdGhlIGZyYW1lIHdpbGwgYmUKKwkJICogZGVsaXZlcmVkLCBzbyByZW1vdmUgc2tiIGZyb20gZnJhZ21lbnQgY2FjaGUgKi8KKwkJc2tiID0gZnJhZ19za2I7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCisJICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShpZWVlLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXApIHsKKwkJaWYgKC8qaWVlZS0+aWVlZTgwMl8xeCAmJiovCisJCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJCSJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCisJCQkJImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSIgTUFDX0ZNVCAiKVxuIiwKKwkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwl9CisjZW5kaWYKKworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIWllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCSJmcmFtZSBmcm9tICIgTUFDX0ZNVAorCQkJIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorLyoKKwlpZihpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYOiBJRUVFODAyLjFYIEVQQU9MIGZyYW1lIVxuIik7CisJfQorKi8KKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCisjaWZkZWYgTk9UX1lFVAorCS8qIElmIElFRUUgODAyLjFYIGlzIHVzZWQsIGNoZWNrIHdoZXRoZXIgdGhlIHBvcnQgaXMgYXV0aG9yaXplZCB0byBzZW5kCisJICogdGhlIHJlY2VpdmVkIGZyYW1lLiAqLworCWlmIChpZWVlLT5pZWVlODAyXzF4ICYmIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJaWYgKGV0aGVydHlwZSA9PSBFVEhfUF9QQUUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlg6IElFRUUgODAyLjFYIGZyYW1lXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlpZiAoaWVlZS0+aG9zdGFwZCAmJiBpZWVlLT5hcGRldikgeworCQkJCS8qIFNlbmQgSUVFRSA4MDIuMVggZnJhbWVzIHRvIHRoZSB1c2VyCisJCQkJICogc3BhY2UgZGFlbW9uIGZvciBwcm9jZXNzaW5nICovCisJCQkJcHJpc20yX3J4XzgwMjExKGllZWUtPmFwZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQkJUFJJU00yX1JYX01HTVQpOworCQkJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQkJCWllZWUtPmFwZGV2c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZ290byByeF9leGl0OworCQkJfQorCQl9IGVsc2UgaWYgKCFmcmFtZV9hdXRob3JpemVkKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgZnJhbWUgZnJvbSAiCisJCQkgICAgICAgInVuYXV0aG9yaXplZCBwb3J0IChJRUVFIDgwMi4xWCk6ICIKKwkJCSAgICAgICAiZXRoZXJ0eXBlPTB4JTA0eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGV0aGVydHlwZSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9wcm9jZXNzX2RhdGFmcmFtZSkKKwl7CisJLy9BZGRlZCBmb3IgbWVzaCByeCBpbnRlcnJ1cHQuCisJCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCQlzdGF0dXMgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X3Byb2Nlc3NfZGF0YWZyYW1lKGllZWUsIHNrYiwgcnhfc3RhdHMpOworCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJCWlmKHN0YXR1cykKKy8vCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfcHJvY2Vzc19kYXRhZnJhbWUoaWVlZSwgc2tiLCByeF9zdGF0cykpCisJCQlnb3RvIHJ4X2V4aXQ7CisJCWVsc2UKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisjZW5kaWYKKworCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwlpZiAoc2tiLT5sZW4gLSBoZHJsZW4gPj0gOCAmJgorCSAgICAoKG1lbWNtcChwYXlsb2FkLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJICAgICAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkgICAgIG1lbWNtcChwYXlsb2FkLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuICsgU05BUF9TSVpFKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQl1MTYgbGVuOworCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCWxlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMiksICZsZW4sIDIpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAod2RzICYmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJgorCSAgICBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CisJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCisJCSAqIHRoZSBwYXlsb2FkICovCisJCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJICAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIEVUSF9BTEVOKTsKKwl9CisjZW5kaWYKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisjaWZkZWYgTk9UX1lFVAorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgaWVlZS0+YXAtPmJyaWRnZV9wYWNrZXRzKSB7CisJCWlmIChkc3RbMF0gJiAweDAxKSB7CisJCQkvKiBjb3B5IG11bHRpY2FzdCBmcmFtZSBib3RoIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZAorCQkJICogdG8gdGhlIHdpcmVsZXNzIG1lZGlhICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF9tdWx0aWNhc3QrKzsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyID09IE5VTEwpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBza2JfY2xvbmUgZmFpbGVkIGZvciAiCisJCQkJICAgICAgICJtdWx0aWNhc3QgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoaG9zdGFwX2lzX3N0YV9hc3NvYyhpZWVlLT5hcCwgZHN0KSkgeworCQkJLyogc2VuZCBmcmFtZSBkaXJlY3RseSB0byB0aGUgYXNzb2NpYXRlZCBTVEEgdXNpbmcKKwkJCSAqIHdpcmVsZXNzIG1lZGlhIGFuZCBub3QgcGFzc2luZyB0byBoaWdoZXIgbGF5ZXJzICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF91bmljYXN0Kys7CisJCQlza2IyID0gc2tiOworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChza2IyICE9IE5VTEwpIHsKKwkJLyogc2VuZCB0byB3aXJlbGVzcyBtZWRpYSAqLworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2IyLT5tYWMucmF3ID0gc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwkJLyogc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YSArIEVUSF9ITEVOOyAqLworCQlza2IyLT5kZXYgPSBkZXY7CisJCWRldl9xdWV1ZV94bWl0KHNrYjIpOworCX0KKworI2VuZGlmCisJaWYgKHNrYikgeworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KKworIHJ4X2V4aXQ6CisjaWZkZWYgTk9UX1lFVAorCWlmIChzdGEpCisJCWhvc3RhcF9oYW5kbGVfc3RhX3JlbGVhc2Uoc3RhKTsKKyNlbmRpZgorCXJldHVybiAxOworCisgcnhfZHJvcHBlZDoKKwlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJLyogUmV0dXJuaW5nIDAgaW5kaWNhdGVzIHRvIGNhbGxlciB0aGF0IHdlIGhhdmUgbm90IGhhbmRsZWQgdGhlIFNLQi0tCisJICogc28gaXQgaXMgc3RpbGwgYWxsb2NhdGVkIGFuZCBjYW4gYmUgdXNlZCBhZ2FpbiBieSB1bmRlcmx5aW5nCisJICogaGFyZHdhcmUgYXMgYSBETUEgdGFyZ2V0ICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitpbnQgaWVlZV9leHRfc2tiX3A4MDIxMV90b19ldGhlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRybGVuLCB1OCAqZHN0LCB1OCAqc3JjKQoreworCXU4ICpwYXlsb2FkOworCXUxNiBldGhlcnR5cGU7CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCisJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLworCWlmIChza2ItPmxlbiAtIGhkcmxlbiA+PSA4ICYmCisJICAgICgobWVtY21wKHBheWxvYWQsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkgICAgICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCSAgICAgbWVtY21wKHBheWxvYWQsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CisJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4gKyBTTkFQX1NJWkUpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCXUxNiBsZW47CisJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuKTsKKwkJbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCAyKSwgJmxlbiwgMik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisKKyNkZWZpbmUgTUdNVF9GUkFNRV9GSVhFRF9QQVJUX0xFTkdUSAkJMHgyNAorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwlpbnQgIEN1cnJTUworCSkKK3sKKwlpbnQgUmV0U1M7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJeworCQlSZXRTUyA9IDkwICsgKChDdXJyU1MgLSA3MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNDEgJiYgQ3VyclNTIDw9IDcwKQorCXsKKwkJUmV0U1MgPSA3OCArICgoQ3VyclNTIC0gNDApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDMxICYmIEN1cnJTUyA8PSA0MCkKKwl7CisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJeworCQlSZXRTUyA9IDU0ICsgKEN1cnJTUyAtIDIwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNSAmJiBDdXJyU1MgPD0gMjApCisJeworCQlSZXRTUyA9IDQyICsgKCgoQ3VyclNTIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSA0KQorCXsKKwkJUmV0U1MgPSAzNjsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMykKKwl7CisJCVJldFNTID0gMjc7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDIpCisJeworCQlSZXRTUyA9IDE4OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAxKQorCXsKKwkJUmV0U1MgPSA5OworCX0KKwllbHNlCisJeworCQlSZXRTUyA9IEN1cnJTUzsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiIyMjIyMgQWZ0ZXIgTWFwcGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwkvLyBTdGVwIDIuIFNtb290aGluZy4KKworCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiQkJCQkIEFmdGVyIFNtb290aGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwlyZXR1cm4gUmV0U1M7Cit9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwl1OCAqIGFkZHIyCispCit7CisjaWYgMAorCXUzMiBpID0gMDsKKwl1OCAqIHAgPSAodTgqKWluZm9fZWxlbWVudC0+ZGF0YTsKKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoIiVzIENvdW50cnkgSUU6IiwgbmV0d29yay0+c3NpZCk7CisJZm9yKGk9MDsgaTxpbmZvX2VsZW1lbnQtPmxlbjsgaSsrKQorCQlwcmludGsoIlx0JTIuMngiLCAqKHAraSkpOworCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisjZW5kaWYKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCXsKKwkJaWYoaW5mb19lbGVtZW50LT5sZW4hPSAwKQorCQl7CisJCQltZW1jcHkobmV0d29yay0+Q291bnRyeUllQnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IGluZm9fZWxlbWVudC0+bGVuOworCisJCQlpZighSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCXsKKwkJCQlEb3QxMWRfVXBkYXRlQ291bnRyeUllKGllZWUsIGFkZHIyLCBpbmZvX2VsZW1lbnQtPmxlbiwgaW5mb19lbGVtZW50LT5kYXRhKTsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIDA3MDMwNSwgcmNuamtvOiBJIHVwZGF0ZSBjb3VudHJ5IElFIHdhdGNoIGRvZyBoZXJlIGJlY2F1c2UKKwkJLy8gc29tZSBBUCAoZS5nLiBDaXNjbyAxMjQyKSBkb24ndCBpbmNsdWRlIGNvdW50cnkgSUUgaW4gdGhlaXIKKwkJLy8gcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJCS8vCisJCWlmKElTX0VRVUFMX0NJRV9TUkMoaWVlZSwgYWRkcjIpICkKKwkJeworCQkJVVBEQVRFX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKworfQorI2VuZGlmCisKK2ludAoraWVlZTgwMjExX1RyYW5zbGF0ZVRvRGJtKAorCXVuc2lnbmVkIGNoYXIgU2lnbmFsU3RyZW5ndGhJbmRleAkvLyAwLTEwMCBpbmRleC4KKwkpCit7CisJdW5zaWduZWQgY2hhciBTaWduYWxQb3dlcjsgLy8gaW4gZEJtLgorCisJLy8gVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4KKwlTaWduYWxQb3dlciA9IChpbnQpU2lnbmFsU3RyZW5ndGhJbmRleCAqIDcgLyAxMDsKKwlTaWduYWxQb3dlciAtPSA5NTsKKworCXJldHVybiBTaWduYWxQb3dlcjsKK30KK2lubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtfaW5pdCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwljaGFyIHJhdGVzX3N0cls2NF07CisJY2hhciAqcDsKKyNlbmRpZgorCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CisgCXUxNiBsZWZ0OworCXU4IGk7CisJc2hvcnQgb2Zmc2V0OworCXU4IGN1clJhdGUgPSAwLGhPcFJhdGUgPSAwLGN1clJhdGVfZXggPSAwOworCisJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLworCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKKwluZXR3b3JrLT5jYXBhYmlsaXR5ID0gYmVhY29uLT5jYXBhYmlsaXR5OworCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGJlYWNvbi0+dGltZV9zdGFtcFswXTsKKwluZXR3b3JrLT50aW1lX3N0YW1wWzFdID0gYmVhY29uLT50aW1lX3N0YW1wWzFdOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGJlYWNvbi0+YmVhY29uX2ludGVydmFsOworCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KKwluZXR3b3JrLT5saXN0ZW5faW50ZXJ2YWwgPSAweDBBOworCW5ldHdvcmstPnJhdGVzX2xlbiA9IG5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IDA7CisJbmV0d29yay0+bGFzdF9hc3NvY2lhdGUgPSAwOworCW5ldHdvcmstPnNzaWRfbGVuID0gMDsKKwluZXR3b3JrLT5mbGFncyA9IDA7CisJbmV0d29yay0+YXRpbV93aW5kb3cgPSAwOworCW5ldHdvcmstPlFvU19FbmFibGUgPSAwOworLy9ieSBhbXkgMDgwMzEyCisJbmV0d29yay0+SGlnaGVzdE9wZXJhUmF0ZSA9IDA7CisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwluZXR3b3JrLT5UdXJib19FbmFibGUgPSAwOworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IDA7CisJbWVtc2V0KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgMCwgTUFYX0lFX0xFTik7CisjZW5kaWYKKworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkgeworCQkvKiBmb3IgQSBiYW5kIChObyBEUyBpbmZvKSAqLworCQluZXR3b3JrLT5jaGFubmVsID0gc3RhdHMtPnJlY2VpdmVkX2NoYW5uZWw7CisJfSBlbHNlCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0NDSzsKKworIAluZXR3b3JrLT53cGFfaWVfbGVuID0gMDsKKyAJbmV0d29yay0+cnNuX2llX2xlbiA9IDA7CisKKyAJaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50OworCWxlZnQgPSBzdGF0cy0+bGVuIC0gKCh2b2lkICopaW5mb19lbGVtZW50IC0gKHZvaWQgKiliZWFjb24pOworCXdoaWxlIChsZWZ0ID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpKSB7CisJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVmdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlNDQU46IHBhcnNlIGZhaWxlZDogaW5mb19lbGVtZW50LT5sZW4gKyAyID4gbGVmdCA6IGluZm9fZWxlbWVudC0+bGVuKzI9JWQgbGVmdD0lZC5cbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpLAorCQkJCQkgICAgIGxlZnQpOworCQkJcmV0dXJuIDE7CisgICAgICAgICAgICAgICAJfQorCisJCXN3aXRjaCAoaW5mb19lbGVtZW50LT5pZCkgeworCQljYXNlIE1GSUVfVFlQRV9TU0lEOgorCQkJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKSkgeworCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5ldHdvcmstPnNzaWRfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAorCQkJCQkJKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKKyAgICAgICAgCQlpZiAobmV0d29yay0+c3NpZF9sZW4gPCBJV19FU1NJRF9NQVhfU0laRSkKKyAgICAgICAgICAgICAgICAJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCisJCQkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFIC0gbmV0d29yay0+c3NpZF9sZW4pOworCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1NTSUQ6ICclcycgbGVuPSVkLlxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQlwID0gcmF0ZXNfc3RyOworI2VuZGlmCisJCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisJCQkJY3VyUmF0ZSA9IG5ldHdvcmstPnJhdGVzW2ldICYgMHg3ZjsKKwkJCQlpZiggaE9wUmF0ZSA8IGN1clJhdGUgKQorCQkJCQloT3BSYXRlID0gY3VyUmF0ZTsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwgbmV0d29yay0+cmF0ZXNbaV0pOworI2VuZGlmCisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJCX5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JBVEVTOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVNfRVg6CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJcCA9IHJhdGVzX3N0cjsKKyNlbmRpZgorCQkJbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCBNQVhfUkFURVNfRVhfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzX2V4W2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworCQkJCWN1clJhdGVfZXggPSBuZXR3b3JrLT5yYXRlc19leFtpXSAmIDB4N2Y7CisJCQkJaWYoIGhPcFJhdGUgPCBjdXJSYXRlX2V4ICkKKwkJCQkJaE9wUmF0ZSA9IGN1clJhdGVfZXg7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKKyNlbmRpZgorCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCQl+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SQVRFU19FWDogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfZXhfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0RTX1NFVDoKKyAgCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9EU19TRVQ6ICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSk7CisJCQlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzI0R0haX0JBTkQpCisJCQkJbmV0d29yay0+Y2hhbm5lbCA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKKwkJCWJyZWFrOworCisJIAljYXNlIE1GSUVfVFlQRV9GSF9TRVQ6CisgIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRkhfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NGX1NFVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ0ZfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1RJTToKKworCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPCA0KQorCQkJCWJyZWFrOworCisJCQluZXR3b3JrLT5kdGltX3BlcmlvZCA9IGluZm9fZWxlbWVudC0+ZGF0YVsxXTsKKworCQkJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCQlicmVhazsKKyNpZiAwCisJCQluZXR3b3JrLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzdGF0cy0+bWFjX3RpbWVbMF07CisjZWxzZQorCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gamlmZmllczsKKyNlbmRpZgorCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzFdID0gc3RhdHMtPm1hY190aW1lWzFdOworCisJCQluZXR3b3JrLT5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9WQUxJRDsKKworCQkJaWYoaW5mb19lbGVtZW50LT5kYXRhWzBdICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+ZGF0YVsyXSAmIDEpCisJCQkJbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX01CQ0FTVDsKKworCQkJb2Zmc2V0ID0gKGluZm9fZWxlbWVudC0+ZGF0YVsyXSA+PiAxKSoyOworCisJCQkvL3ByaW50aygib2Zmc2V0MToleCBhaWQ6JXhcbiIsb2Zmc2V0LCBpZWVlLT5hc3NvY19pZCk7CisKKwkJCS8qIGFkZCBhbmQgbW9kaWZpZWQgZm9yIHBzIDIwMDguMS4yMiAqLworCQkJaWYoaWVlZS0+YXNzb2NfaWQgPCA4Km9mZnNldCB8fAorCQkJCWllZWUtPmFzc29jX2lkID4gOCoob2Zmc2V0ICsgaW5mb19lbGVtZW50LT5sZW4gLTMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW9mZnNldCA9IChpZWVlLT5hc3NvY19pZC84KSAtIG9mZnNldDsvLyArICgoYWlkICUgOCk/IDAgOiAxKSA7CisKKwkJLy8JcHJpbnRrKCJvZmZzZXQ6JXggZGF0YToleCwgdWNhc3Q6JWRcbiIsIG9mZnNldCwKKwkJCS8vCWluZm9fZWxlbWVudC0+ZGF0YVszK29mZnNldF0gLAorCQkJLy8JaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKTsKKworCQkJaWYoaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKSB7CisJCQkJbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX1VDQVNUOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0lCU1NfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NIQUxMRU5HRToKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ0hBTExFTkdFOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6CisJCQkvL25pYyBpcyA4N0IKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEpIHsKKwkJCQluZXR3b3JrLT53cGFfaWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKKwkJCQkJCQkgTUFYX1dQQV9JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53cGFfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkgICAgICAgbmV0d29yay0+d3BhX2llX2xlbik7CisJCQl9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA9PSA3ICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMikgeworCQkJCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDE7CisJCQl9CisjZW5kaWYKKwkJCWlmICgxID09IHN0YXRzLT5uaWNfdHlwZSkgey8vbmljIDg3CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA1ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDApIHsKKwkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIndtbSBpbmZvIHVwZGF0ZWQ6ICV4XG4iLCBpbmZvX2VsZW1lbnQtPmRhdGFbNl0pOworCQkJCS8vV01NIEluZm9ybWF0aW9uIEVsZW1lbnQKKwkJCQluZXR3b3JrLT53bW1faW5mbyA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQluZXR3b3JrLT5Rb1NfRW5hYmxlID0gMTsKKwkJCX0KKworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDggICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMSkgeworCQkJCS8vIE5vdCBjYXJlIGFib3V0IHZlcnNpb24gYXQgcHJlc2VudC4KKwkJCQkvL1dNTSBJbmZvcm1hdGlvbiBFbGVtZW50CisJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJ3bW0gaW5mbyZwYXJhbSB1cGRhdGVkOiAleFxuIiwgaW5mb19lbGVtZW50LT5kYXRhWzZdKTsKKwkJCQluZXR3b3JrLT53bW1faW5mbyA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQkvL1dNTSBQYXJhbWV0ZXIgRWxlbWVudAorCQkJCW1lbWNweShuZXR3b3JrLT53bW1fcGFyYW0sICh1OCAqKShpbmZvX2VsZW1lbnQtPmRhdGEgKyA4KSwoaW5mb19lbGVtZW50LT5sZW4gLSA4KSk7CisJCQkJbmV0d29yay0+UW9TX0VuYWJsZSA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SU046CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JTTjogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+cnNuX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkgTUFYX1dQQV9JRV9MRU4pOworCQkJbWVtY3B5KG5ldHdvcmstPnJzbl9pZSwgaW5mb19lbGVtZW50LAorCQkJICAgICAgIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQkJYnJlYWs7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQljYXNlIE1GSUVfVFlQRV9DT1VOVFJZOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DT1VOVFJZOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisvLwkJCXByaW50aygiPT09PT0+UmVjZWl2ZSA8JXM+IENvdW50cnkgSUVcbiIsbmV0d29yay0+c3NpZCk7CisJCQlpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKGllZWUsIGluZm9fZWxlbWVudCwgbmV0d29yaywgYmVhY29uLT5oZWFkZXIuYWRkcjIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJ1bnN1cHBvcnRlZCBJRSAlZFxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAJCX0KKworCQlsZWZ0IC09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsKKwkJCWluZm9fZWxlbWVudC0+bGVuOworCQlpbmZvX2VsZW1lbnQgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikKKyAgICAgICAgICAgICAgICAJJmluZm9fZWxlbWVudC0+ZGF0YVtpbmZvX2VsZW1lbnQtPmxlbl07CisgIAl9CisvL2J5IGFteSAwODAzMTIKKwluZXR3b3JrLT5IaWdoZXN0T3BlcmFSYXRlID0gaE9wUmF0ZTsKKy8vYnkgYW15IDA4MDMxMgorCW5ldHdvcmstPm1vZGUgPSAwOworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkKKwkJbmV0d29yay0+bW9kZSA9IElFRUVfQTsKKwllbHNlIHsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfT0ZETSkKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9HOworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19DQ0spCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfQjsKKwl9CisKKwlpZiAobmV0d29yay0+bW9kZSA9PSAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJGaWx0ZXJlZCBvdXQgJyVzICgiIE1BQ19GTVQgIiknICIKKwkJCQkgICAgICJuZXR3b3JrLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pKQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworI2lmIDAKKwlzdGF0cy0+c2lnbmFsID0gaWVlZTgwMjExX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKHN0YXRzLT5zaWduYWwpOworI2VuZGlmCisJc3RhdHMtPnNpZ25hbCA9IGllZWU4MDIxMV9UcmFuc2xhdGVUb0RibShzdGF0cy0+c2lnbmFsc3RyZW5ndGgpOworCS8vc3RhdHMtPm5vaXNlID0gc3RhdHMtPnNpZ25hbCAtIHN0YXRzLT5ub2lzZTsKKwlzdGF0cy0+bm9pc2UgPSBpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0oMTAwIC0gc3RhdHMtPnNpZ25hbHN0cmVuZ3RoKSAtIDI1OworCW1lbWNweSgmbmV0d29yay0+c3RhdHMsIHN0YXRzLCBzaXplb2YobmV0d29yay0+c3RhdHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSkKK3sKKwkvKiBBIG5ldHdvcmsgaXMgb25seSBhIGR1cGxpY2F0ZSBpZiB0aGUgY2hhbm5lbCwgQlNTSUQsIEVTU0lECisJICogYW5kIHRoZSBjYXBhYmlsaXR5IGZpZWxkIChpbiBwYXJ0aWN1bGFyIElCU1MgYW5kIEJTUykgYWxsIG1hdGNoLgorCSAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCisJICogYXMgb25lIG5ldHdvcmsgKi8KKwlyZXR1cm4gKCgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgIC8vWUosbW9kLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCS8vKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pICYmCisJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgorCQkhbWVtY21wKHNyYy0+YnNzaWQsIGRzdC0+YnNzaWQsIEVUSF9BTEVOKSAmJgorCQkoIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmIC8vWUosbW9kLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCS8vIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQorCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpKTsKK30KKworaW5saW5lIHZvaWQgdXBkYXRlX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYykKK3sKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHkgPSBzcmMtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2lnbmFsID0gMDsKKwl1bnNpZ25lZCBjaGFyIG5vaXNlID0gMDsKKyAgICAgICAgaWYoZHN0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gKGRzdC0+c3RhdHMuc2lnbmFsc3RyZW5ndGggKiA1ICsgc3JjLT5zdGF0cy5zaWduYWxzdHJlbmd0aCArIDUpLzY7CisgICAgICAgIH0KKwlzaWduYWwgPSBpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0ocXVhbGl0eSk7CisJLy9ub2lzZSA9IHNpZ25hbCAtIHNyYy0+c3RhdHMubm9pc2U7CisJaWYoZHN0LT5zdGF0cy5ub2lzZSA+IDApCisJCW5vaXNlID0gKGRzdC0+c3RhdHMubm9pc2UgKiA1ICsgc3JjLT5zdGF0cy5ub2lzZSkvNjsKKyAgICAgICAgLy9pZihzdHJjbXAoZHN0LT5zc2lkLCAibGlua3N5c19sem0wMDAiKSA9PSAwKQorLy8JcHJpbnRrKCJzc2lkOiVzLCBxdWFsaXR5OiVkLCBzaWduYWw6JWRcbiIsIGRzdC0+c3NpZCwgcXVhbGl0eSwgc2lnbmFsKTsKKwltZW1jcHkoJmRzdC0+c3RhdHMsICZzcmMtPnN0YXRzLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCWRzdC0+c3RhdHMuc2lnbmFsc3RyZW5ndGggPSBxdWFsaXR5OworCWRzdC0+c3RhdHMuc2lnbmFsID0gc2lnbmFsOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+c3RhdHMuc2lnbmFsIGlzICVkXG4iLGRzdC0+c3RhdHMuc2lnbmFsKTsKKwlkc3QtPnN0YXRzLm5vaXNlID0gbm9pc2U7CisKKworCWRzdC0+Y2FwYWJpbGl0eSA9IHNyYy0+Y2FwYWJpbGl0eTsKKwltZW1jcHkoZHN0LT5yYXRlcywgc3JjLT5yYXRlcywgc3JjLT5yYXRlc19sZW4pOworCWRzdC0+cmF0ZXNfbGVuID0gc3JjLT5yYXRlc19sZW47CisJbWVtY3B5KGRzdC0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXhfbGVuKTsKKwlkc3QtPnJhdGVzX2V4X2xlbiA9IHNyYy0+cmF0ZXNfZXhfbGVuOworCWRzdC0+SGlnaGVzdE9wZXJhUmF0ZT0gc3JjLT5IaWdoZXN0T3BlcmFSYXRlOworCS8vcHJpbnRrKCI9PT09PT09PT09PmluICVzOiBzcmMtPnNzaWQgaXMgJXMsY2hhbiBpcyAlZFxuIixfX0ZVTkNUSU9OX18sc3JjLT5zc2lkLHNyYy0+Y2hhbm5lbCk7CisKKwkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCWlmKHNyYy0+c3NpZF9sZW4gPiAwKQorCXsKKwkJLy9pZihzcmMtPnNzaWRfbGVuID09IDEzKQorCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT4+Pj4+Pj4+IERzdCBzc2lkOiAlcyBTcmMgc3NpZDogJXNcbiIsIGRzdC0+c3NpZCwgc3JjLT5zc2lkKTsKKwkJbWVtc2V0KGRzdC0+c3NpZCwgMCwgZHN0LT5zc2lkX2xlbik7CisJCWRzdC0+c3NpZF9sZW4gPSBzcmMtPnNzaWRfbGVuOworCQltZW1jcHkoZHN0LT5zc2lkLCBzcmMtPnNzaWQsIHNyYy0+c3NpZF9sZW4pOworCX0KKwkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKworCWRzdC0+Y2hhbm5lbCA9IHNyYy0+Y2hhbm5lbDsKKwlkc3QtPm1vZGUgPSBzcmMtPm1vZGU7CisJZHN0LT5mbGFncyA9IHNyYy0+ZmxhZ3M7CisJZHN0LT50aW1lX3N0YW1wWzBdID0gc3JjLT50aW1lX3N0YW1wWzBdOworCWRzdC0+dGltZV9zdGFtcFsxXSA9IHNyYy0+dGltZV9zdGFtcFsxXTsKKworCWRzdC0+YmVhY29uX2ludGVydmFsID0gc3JjLT5iZWFjb25faW50ZXJ2YWw7CisJZHN0LT5saXN0ZW5faW50ZXJ2YWwgPSBzcmMtPmxpc3Rlbl9pbnRlcnZhbDsKKwlkc3QtPmF0aW1fd2luZG93ID0gc3JjLT5hdGltX3dpbmRvdzsKKwlkc3QtPmR0aW1fcGVyaW9kID0gc3JjLT5kdGltX3BlcmlvZDsKKwlkc3QtPmR0aW1fZGF0YSA9IHNyYy0+ZHRpbV9kYXRhOworCWRzdC0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3JjLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF07CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMV0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKKy8vCXByaW50aygidXBkYXRlOiVzLCBkdGltX3BlcmlvZDoleCwgZHRpbV9kYXRhOiV4XG4iLCBzcmMtPnNzaWQsIHNyYy0+ZHRpbV9wZXJpb2QsIHNyYy0+ZHRpbV9kYXRhKTsKKwltZW1jcHkoZHN0LT53cGFfaWUsIHNyYy0+d3BhX2llLCBzcmMtPndwYV9pZV9sZW4pOworCWRzdC0+d3BhX2llX2xlbiA9IHNyYy0+d3BhX2llX2xlbjsKKwltZW1jcHkoZHN0LT5yc25faWUsIHNyYy0+cnNuX2llLCBzcmMtPnJzbl9pZV9sZW4pOworCWRzdC0+cnNuX2llX2xlbiA9IHNyYy0+cnNuX2llX2xlbjsKKworCWRzdC0+bGFzdF9zY2FubmVkID0gamlmZmllczsKKwkvKiBkc3QtPmxhc3RfYXNzb2NpYXRlIGlzIG5vdCBvdmVyd3JpdHRlbiAqLworLy8gZGlzYWJsZSBRb1MgcHJvY2VzcyBub3csIGFkZGVkIGJ5IERhdmlkIDIwMDYvNy8yNQorI2lmIDEKKwlkc3QtPndtbV9pbmZvID0gc3JjLT53bW1faW5mbzsgLy9zdXJlIHRvIGV4aXN0IGluIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmcmFtZS4KKy8qCisJaWYoKGRzdC0+d21tX2luZm9ec3JjLT53bW1faW5mbykmMHgwZikgey8vUGFyYW0gU2V0IENvdW50IGNoYW5nZSwgdXBkYXRlIFBhcmFtZXRlcgorCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgSUVFRTgwMjExX0FDX1BSQU1fTEVOKTsKKwl9CisqLworCWlmKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsyXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzFdLmFjX2FjaV9hY21fYWlmc24pIHsKKwkgIG1lbWNweShkc3QtPndtbV9wYXJhbSwgc3JjLT53bW1fcGFyYW0sIFdNRV9BQ19QUkFNX0xFTik7CisJfQorCWRzdC0+UW9TX0VuYWJsZSA9IHNyYy0+UW9TX0VuYWJsZTsKKyNlbHNlCisJZHN0LT5Rb1NfRW5hYmxlID0gMTsvL2ZvciBSdGw4MTg3IHNpbXVsYXRpb24KKyNlbmRpZgorCWRzdC0+U2lnbmFsU3RyZW5ndGggPSBzcmMtPlNpZ25hbFN0cmVuZ3RoOworI2lmZGVmIFRIT01BU19UVVJCTworCWRzdC0+VHVyYm9fRW5hYmxlID0gc3JjLT5UdXJib19FbmFibGU7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJZHN0LT5Db3VudHJ5SWVMZW4gPSBzcmMtPkNvdW50cnlJZUxlbjsKKwltZW1jcHkoZHN0LT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUxlbik7CisjZW5kaWYKK30KKworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldHdvcms7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCByZW5ldzsKKwl1OCB3bW1faW5mbzsKKwl1OCBpc19iZWFjb24gPSAoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKT8gMTowOyAgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCW1lbXNldCgmbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworLy9yegorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlXzEpIHsKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlXzEoaWVlZSwgYmVhY29uLCBzdGF0cyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAorCQkiJyVzJyAoIiBNQUNfRk1UICIpOiAlYyVjJWMlYyAlYyVjJWMlYy0lYyVjJWMlYyAlYyVjJWMlY1xuIiwKKwkJZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pLAorCQlNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDkpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDgpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDcpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDApKSA/ICcxJyA6ICcwJyk7CisjaWYgMAorCWlmKHN0cmNtcChlc2NhcGVfZXNzaWQoYmVhY29uLT5pbmZvX2VsZW1lbnQuZGF0YSwgYmVhY29uLT5pbmZvX2VsZW1lbnQubGVuKSwgInJ0bF9zb2Z0YXAiKSA9PSAwKQorCXsKKwkJaWYoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQorCQl7CisJCQl1MzIgaSA9IDAsIGxlbiA9IHN0YXRzLT5sZW47CisJCQl1OCAqIHAgPSAodTgqKWJlYWNvbjsKKwkJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJcHJpbnRrKCJydGxfc29mdGFwIEJlYWNvbjoiKTsKKwkJCWZvcihpPTA7IGk8bGVuOyBpKyspCisJCQkJcHJpbnRrKCJcdCUyLjJ4IiwgKihwK2kpKTsKKwkJCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoaWVlZTgwMjExX25ldHdvcmtfaW5pdChpZWVlLCBiZWFjb24sICZuZXR3b3JrLCBzdGF0cykpIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkRyb3BwZWQgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLAorCQkJCQkJICBpbmZvX2VsZW1lbnQtPmxlbiksCisJCQkJICAgICBNQUNfQVJHKGJlYWNvbi0+aGVhZGVyLmFkZHIzKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJLy8gRm9yIEFzdXMgRWVlUGMgcmVxdWVzdCwKKwkvLyAoMSkgaWYgd2lyZWxlc3MgYWRhcHRlciByZWNlaXZlIGdldCBhbnkgODAyLjExZCBjb3VudHJ5IGNvZGUgaW4gQVAgYmVhY29uLAorCS8vCSAgIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGZvbGxvdyB0aGUgY291bnRyeSBjb2RlLgorCS8vICgyKSAgSWYgdGhlcmUgaXMgbm8gYW55IGNvdW50cnkgY29kZSBpbiBiZWFjb24sCisJLy8gICAgICAgdGhlbiB3aXJlbGVzcyBhZGFwdGVyIHNob3VsZCBkbyBhY3RpdmUgc2NhbiBmcm9tIGNoMX4xMSBhbmQKKwkvLyAgICAgICBwYXNzaXZlIHNjYW4gZnJvbSBjaDEyfjE0CisJaWYoaWVlZS0+Ykdsb2JhbERvbWFpbikKKwl7CisJCWlmIChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKQorCQl7CisJCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQorCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCisJCQl7CisJCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKKwkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxMSkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBwcm9iZSByZXNwb25zZSBhdCBjaGFubmVsKCVkKS5cbiIsIG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQorCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCisJCQl7CisJCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKKwkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxNCkKKwkJCQl7CisJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBiZWFjb24gYXQgY2hhbm5lbCglZCkuXG4iLG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcworCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KKwkgKgorCSAqIE5PVEU6ICBUaGlzIHNlYXJjaCBpcyBkZWZpbml0ZWx5IG5vdCBvcHRpbWl6ZWQuICBPbmNlIGl0cyBkb2luZworCSAqICAgICAgICB0aGUgInJpZ2h0IHRoaW5nIiB3ZSdsbCBvcHRpbWl6ZSBpdCBmb3IgZWZmaWNpZW5jeSBpZgorCSAqICAgICAgICBuZWNlc3NhcnkgKi8KKworCS8qIFNlYXJjaCBmb3IgdGhpcyBlbnRyeSBpbiB0aGUgbGlzdCBhbmQgdXBkYXRlIGl0IGlmIGl0IGlzCisJICogYWxyZWFkeSB0aGVyZS4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpKSB7CisJCXdtbV9pbmZvID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQlpZihpc19iZWFjb24gPT0gMCkKKwkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIGllZWUtPmN1cnJlbnRfbmV0d29yay5mbGFncyk7CisJCWVsc2UgaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCWllZWUtPk51bVJ4QmNuSW5QZXJpb2QrKzsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisJCS8vcHJpbnRrKCI9PT09Pm5ldHdvcmsuc3NpZD0lcyBjdXJfc3NpZD0lc1xuIiwgbmV0d29yay5zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCXVwZGF0ZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQlpZiAoaXNfc2FtZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmssIGllZWUpKQorCQkJYnJlYWs7CisJCWlmICgob2xkZXN0ID09IE5VTEwpIHx8CisJCSAgICAodGFyZ2V0LT5sYXN0X3NjYW5uZWQgPCBvbGRlc3QtPmxhc3Rfc2Nhbm5lZCkpCisJCQlvbGRlc3QgPSB0YXJnZXQ7CisJfQorCisJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwlpZiAoJnRhcmdldC0+bGlzdCA9PSAmaWVlZS0+bmV0d29ya19saXN0KSB7CisJCWlmIChsaXN0X2VtcHR5KCZpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdCkpIHsKKwkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLworCQkJbGlzdF9kZWwoJm9sZGVzdC0+bGlzdCk7CisJCQl0YXJnZXQgPSBvbGRlc3Q7CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRXhwaXJlZCAnJXMnICgiIE1BQ19GTVQgIikgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCkpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJBZGRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay5zc2lkLAorCQkJCQkJICBuZXR3b3JrLnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcobmV0d29yay5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJbmV0d29yay5leHRfZW50cnkgPSB0YXJnZXQtPmV4dF9lbnRyeTsKKyNlbmRpZgorCQltZW1jcHkodGFyZ2V0LCAmbmV0d29yaywgc2l6ZW9mKCp0YXJnZXQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5saXN0LCAmaWVlZS0+bmV0d29ya19saXN0KTsKKwkJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsJm5ldHdvcmspOworCX0gZWxzZSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJVcGRhdGluZyAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZCh0YXJnZXQtPnNzaWQsCisJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisKKwkJLyogd2UgaGF2ZSBhbiBlbnRyeSBhbmQgd2UgYXJlIGdvaW5nIHRvIHVwZGF0ZSBpdC4gQnV0IHRoaXMgZW50cnkgbWF5CisJCSAqIGJlIGFscmVhZHkgZXhwaXJlZC4gSW4gdGhpcyBjYXNlIHdlIGRvIHRoZSBzYW1lIGFzIHdlIGZvdW5kIGEgbmV3CisJCSAqIG5ldCBhbmQgY2FsbCB0aGUgbmV3X25ldCBoYW5kbGVyCisJCSAqLworCQlyZW5ldyA9ICF0aW1lX2FmdGVyKHRhcmdldC0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCQlpZihpc19iZWFjb24gPT0gMCkKKwkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIHRhcmdldC0+ZmxhZ3MpOworCQkvL2lmKHN0cm5jbXAobmV0d29yay5zc2lkLCAibGlua3N5cy1jIiw5KSA9PSAwKQorCQkvLwlwcmludGsoIj09PT0+MiBuZXR3b3JrLnNzaWQ9JXMgRkxBRz0lZCB0YXJnZXQuc3NpZD0lcyBGTEFHPSVkXG4iLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuZmxhZ3MsIHRhcmdldC0+c3NpZCwgdGFyZ2V0LT5mbGFncyk7CisJCWlmKCgobmV0d29yay5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpID09IE5FVFdPUktfRU1QVFlfRVNTSUQpIFwKKwkJICAgICYmICgoKG5ldHdvcmsuc3NpZF9sZW4gPiAwKSAmJiAoc3RybmNtcCh0YXJnZXQtPnNzaWQsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkX2xlbikpKVwKKwkJICAgIHx8KChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gbmV0d29yay5zc2lkX2xlbikmJihzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pID09IDApJiYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykpKSkKKwkJCXJlbmV3ID0gMTsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOworCQlpZihyZW5ldyAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCZuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3J4X21ndChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlciwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIEJFQUNPTiAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkJlYWNvblxuIik7CisJCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXNwb25zZVxuIik7CisJCWllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCQkJaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisvL3J6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFBST0JFIFJFUVVFU1QgKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJQcm9iZSByZXF1ZXN0XG4iKTsKKwkJLy8vCisJCWlmKCBpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X29uX3Byb2JlX3JlcSApCisJCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X21ndF9vbl9wcm9iZV9yZXEoIGllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKiloZWFkZXIsIHN0YXRzKTsKKwkJYnJlYWs7CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisJfQorfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcnhfbWd0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX25ldHdvcmtfaW5pdCk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworRVhQT1JUX1NZTUJPTChpZWVlX2V4dF9za2JfcDgwMjExX3RvX2V0aGVyKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZmZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMCwwICsxLDQwMjkgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBGZXcgbGluZXMgbWlnaHQgYmUgc3RvbGVuIGZyb20gb3RoZXIgcGFydCBvZiB0aGUgaWVlZTgwMjExCisgKiBzdGFjay4gQ29weXJpZ2h0IHdobyBvd24gaXQncyBjb3B5cmlnaHQKKyAqCisgKiBXUEEgY29kZSBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodC4KKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCit1OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7CisJezB4MDAsMHgwRiwweEFDLDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKKwl7MHgwMCwweDBGLDB4QUMsMHgwMX0sIC8vV0VQLTQwICAgICAgICAgLy9SU05BIGRlZmF1bHQKKwl7MHgwMCwweDBGLDB4QUMsMHgwMn0sIC8vVEtJUCAgICAgICAgICAgLy9OT05FCQkvL3t1c2VkIGp1c3QgYXMgZGVmYXVsdH0KKwl7MHgwMCwweDBGLDB4QUMsMHgwM30sIC8vV1JBUC1oaXN0b3JpY2FsCisJezB4MDAsMHgwRiwweEFDLDB4MDR9LCAvL0NDTVAKKwl7MHgwMCwweDBGLDB4QUMsMHgwNX0sIC8vV0VQLTEwNAorfTsKKworc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KQoreworCXJldHVybiAoKG5ldC5yYXRlc19leF9sZW4gPiAwKSB8fCAobmV0LnJhdGVzX2xlbiA+IDQpKTsKK30KKworc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KQoreworCXJldHVybiAobmV0LmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7Cit9CisKKy8qIHJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBuZWVkZWQgZm9yIHBsZWFjaW5nIHRoZSBSQVRFIE1GSUUKKyAqIHRhZyBhbmQgdGhlIEVYVEVOREVEIFJBVEUgTUZJRSB0YWcgaWYgbmVlZGVkLgorICogSXQgZW5jbHVkZXMgdHdvIGJ5dGVzIHBlciB0YWcgZm9yIHRoZSB0YWcgaXRzZWxmIGFuZCBpdHMgbGVuCisgKi8KK3Vuc2lnbmVkIGludCBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSAwOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pCisJCXJhdGVfbGVuID0gSUVFRTgwMjExX0NDS19SQVRFX0xFTiArIDI7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisKKwkJcmF0ZV9sZW4gKz0gSUVFRTgwMjExX09GRE1fUkFURV9MRU4gKyAyOworCisJcmV0dXJuIHJhdGVfbGVuOworfQorCisvKiBwbGVhY2UgdGhlIE1GSUUgcmF0ZSwgdGFnIHRvIHRoZSBtZW1vcnkgKGRvdWJsZSkgcG9pbmVkLgorICogVGhlbiBpdCB1cGRhdGVzIHRoZSBwb2ludGVyIHNvIHRoYXQKKyAqIGl0IHBvaW50cyBhZnRlciB0aGUgbmV3IE1GSUUgdGFnIGFkZGVkLgorICovCit2b2lkIGllZWU4MDIxMV9NRklFX0JyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQoreworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFUzsKKwkJKnRhZysrID0gNDsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COworCX0KKworCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodCBzdXBwb3J0ICovCisJKnRhZ19wID0gdGFnOworfQorCit2b2lkIGllZWU4MDIxMV9NRklFX0dyYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQoreworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKworCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVNfRVg7CisJCSp0YWcrKyA9IDg7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworCisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKKwordm9pZCBpZWVlODAyMTFfV01NX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApIHsKKwl1OCAqdGFnID0gKnRhZ19wOworCisJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAorCSp0YWcrKyA9IDc7CisJKnRhZysrID0gMHgwMDsKKwkqdGFnKysgPSAweDUwOworCSp0YWcrKyA9IDB4ZjI7CisJKnRhZysrID0gMHgwMjsvLzUKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4MDE7CisjaWZkZWYgU1VQUE9SVF9VU1BECisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvICYgMHg4MCkgeworCQkqdGFnKysgPSAweDBmfE1BWF9TUF9MZW47CisJfSBlbHNlIHsKKwkJKnRhZysrID0gTUFYX1NQX0xlbjsKKwl9CisjZWxzZQorCSp0YWcrKyA9IE1BWF9TUF9MZW47CisjZW5kaWYKKwkqdGFnX3AgPSB0YWc7Cit9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KK3ZvaWQgaWVlZTgwMjExX1RVUkJPX0luZm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApIHsKKwl1OCAqdGFnID0gKnRhZ19wOworCisgICAgICAgICp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKKyAgICAgICAgKnRhZysrID0gNzsKKyAgICAgICAgKnRhZysrID0gMHgwMDsKKyAgICAgICAgKnRhZysrID0gMHhlMDsKKyAgICAgICAgKnRhZysrID0gMHg0YzsKKyAgICAgICAgKnRhZysrID0gMHgwMTsvLzUKKyAgICAgICAgKnRhZysrID0gMHgwMjsKKyAgICAgICAgKnRhZysrID0gMHgxMTsKKwkqdGFnKysgPSAweDAwOworCisJKnRhZ19wID0gdGFnOworCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworfQorI2VuZGlmCisKK3ZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuaDsKKwluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKzEpICUgTUdNVF9RVUVVRV9OVU07CisKKy8qCisgKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCisgKgorICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKKyAqCQlyZXR1cm4gLTE7CisgKi8KKwlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKKwlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOworCisJLy9yZXR1cm4gMDsKK30KKworc3RydWN0IHNrX2J1ZmYgKmRlcXVldWVfbWdtdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworCisJaWYoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKKworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaW5pdF9tZ210X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9IGllZWUtPm1nbXRfcXVldWVfaGVhZCA9IDA7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpOworCitpbmxpbmUgdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJhbSAwLCBubyBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJaWYoc2luZ2xlKXsKKwkJaWYoaWVlZS0+cXVldWVfc3RvcCl7CisKKwkJCWVucXVldWVfbWdtdChpZWVlLHNrYik7CisJCX1lbHNleworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldixpZWVlLT5iYXNpY19yYXRlKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKworaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisKKwlpZihzaW5nbGUpeworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLworCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCisJfWVsc2V7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2KTsKKworCX0KKy8vCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworfQorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCQkJdTgJYXNSc24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lICpkaXNhc3M7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1lKSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKKwlkaXNhc3MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOworCWRpc2Fzcy0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJZGlzYXNzLT5yZWFzb25jb2RlID0gYXNSc247CisJcmV0dXJuIHNrYjsKK30KK3ZvaWQKK1NlbmREaXNhc3NvY2lhdGlvbigKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgIHU4KiAgICAgICAgICAgICAgICAgICAgIGFzU3RhLAorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBhc1JzbgorKQoreworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIHNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKKyAgICAgICAgaWYgKHNrYil7CisgICAgICAgICAgICAgICAgc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKyAgICAgICAgICAgICAgICAvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworICAgICAgICB9Cit9CisKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGxlbixyYXRlX2xlbjsKKwl1OCAqdGFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICpyZXE7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJc2hvcnQgZXh0TW9yZSA9IDA7CisJaWYoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMSkKKwkJZXh0TW9yZSA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzEoaWVlZSk7CisjZW5kaWYKKworCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKworCXJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoIWV4dE1vcmUpCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4pOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwllbHNlCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbisxMjgpOyAvLyBNRVNISUQgKyBDQVAKKyNlbmRpZgorCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKKwl0YWcgKz0gbGVuOworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihleHRNb3JlKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8yKGllZWUsIHNrYiwgdGFnKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvLyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorLy92b2lkIGV4dF9pZWVlODAyMTFfc2VuZF9iZWFjb25fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorLy97CisvLwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgZXh0X3NlbmRfYmVhY29uX3dxKTsKKy8vI2Vsc2UKK3ZvaWQgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKy8vI2VuZGlmCisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOworCisJaWYgKHNrYil7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYmVhY29ucysrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisKKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7CisKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJaWYoaWVlZS0+YmVhY29uX3R4aW5nKQorCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGJlYWNvbiBzZW5kaW5nIVxuIik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJKE1TRUNTKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC01KSk7CisKKwkvL3NwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisJaWYoaWVlZS0+YmVhY29uX3R4aW5nKQorCQlhZGRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBfaWVlZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcV93aXRoX1NTSUQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKnNzaWQsIGludCBsZW5fc3NpZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXU4ICp0YWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlzaG9ydCBleHRNb3JlID0gMDsKKwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKQorCQlleHRNb3JlID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMShpZWVlKTsKKyNlbmRpZgorCisJbGVuID0gbGVuX3NzaWQ7CisKKwlyYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKCFleHRNb3JlKQorI2VuZGlmCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJZWxzZQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4rMTI4KTsgLy8gTUVTSElEICsgQ0FQCisjZW5kaWYKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkpOworCXJlcS0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOworCXJlcS0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRTogaXMgdGhpcyBPSyA/CisKKwltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjEsIDB4ZmYsIEVUSF9BTEVOKTsKKwltZW1jcHkocmVxLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjMsIDB4ZmYsIEVUSF9BTEVOKTsKKworCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYixsZW4rMityYXRlX2xlbik7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfU1NJRDsKKwkqdGFnKysgPSBsZW47CisJaWYobGVuKQorCXsKKwkJbWVtY3B5KHRhZywgc3NpZCwgbGVuKTsKKwkJdGFnICs9IGxlbjsKKwl9CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsJnRhZyk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoZXh0TW9yZSkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMihpZWVlLCBza2IsIHRhZyk7CisjZW5kaWYKKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxX3dpdGhfU1NJRChpZWVlLCBOVUxMLCAwKTsKKwllbHNlCisjZW5kaWYKKwlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVxKGllZWUpOworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCit2b2lkIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSl7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKKwl9Cit9CisKKy8qIHRoaXMgcGVyZm9ybXMgc3luY3JvIHNjYW4gYmxvY2tpbmcgdGhlIGNhbGxlciB1bnRpbCBhbGwgY2hhbm5lbHMKKyAqIGluIHRoZSBhbGxvd2VkIGNoYW5uZWwgbWFwIGhhcyBiZWVuIGNoZWNrZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gU3luYyBzY2FuXG4iKTsKKy8vCWR1bXBfY2hubF9tYXAoY2hhbm5lbF9tYXApOworCisJd2hpbGUoMSkKKwl7CisKKwkJZG97CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKwkJLyogdGhpcyBmdWN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKwkJICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisJCSAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKKwkJICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisJCSAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworCQkgKiAgICBJRUVFODAyMTFfTk9MSU5LIHVudGlsIHdlIGZvdW5kIGFuIGludGVyZXN0aW5nIGNlbGwuCisJCSAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKwkJICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKKwkJICogICAgc2Nhbm5pbmcKKwkJICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisJCSAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisJCSAqICAgIHRoYXQgd2UgYXJlIHN0aWxsIGxvZ2ljYWxseSBsaW5rZWQgKG5vdCBpbnRlcmVzdGVkIGluCisJCSAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorCQkgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFybHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisJCSAqICAgIG5vdCBmaWx0ZXIgUlggZnJhbWVzIGFuZCB0aGUgY2hhbm5lbCBpcyBjaGFuZ2luZy4KKwkJICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisJCSAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorCQkgKi8KKworCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCWdvdG8gb3V0OworCisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOworLy8JCXByaW50aygiPT09PT0+Y2hhbm5lbD0lZCAgICIsY2gpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCisjZW5kaWYKKwkJeworLy8JCQlwcmludGsoIj09PT1zZW5kIHByb2JlIHJlcXVlc3RcbiIpOworCQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisJCX0KKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKwkJICovCisJCWlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKwkJCWdvdG8gb3V0OworCisKKwkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwl9CitvdXQ6CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisjZW5kaWYKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGNoOworICAgICAgICB1bnNpZ25lZCBpbnQgd2F0Y2hfZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisgICAgICAgIGRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwljaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworLy8gICAgICAJaWYoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCisvLwl7CisKKy8vCQlwcmludGsoInN0b3Agc2NhbiBzeW5jXG4iKTsKKy8vICAgCQlnb3RvIG91dDsKKy8vICAJfQorLy8JcHJpbnRrKCI9PT09PT09aGg9PT09PT09PT09PT09PT0+aXBzIHNjYW5cbiIpOworICAgICAJd2hpbGUoMSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHRoaXMgZnVjdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCisgICAgICAgICAgICAgICAgICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisgICAgICAgICAgICAgICAgICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorICAgICAgICAgICAgICAgICAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQorICAgICAgICAgICAgICAgICAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworICAgICAgICAgICAgICAgICAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKyAgICAgICAgICAgICAgICAgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCisgICAgICAgICAgICAgICAgICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsIHNvIHdlIHN0b3AKKyAgICAgICAgICAgICAgICAgKiAgICBzY2FubmluZworICAgICAgICAgICAgICAgICAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgorICAgICAgICAgICAgICAgICAqICAgIFNvIHdlIHN3aXRjaCB0byBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisgICAgICAgICAgICAgICAgICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKyAgICAgICAgICAgICAgICAgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKKyAgICAgICAgICAgICAgICAgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFybHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisgICAgICAgICAgICAgICAgICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorICAgICAgICAgICAgICAgICAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjaworICAgICAgICAgICAgICAgICAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorICAgICAgICAgICAgICAgICAqLworCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJeworCQkJZ290byBvdXQ7CisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA+IDApCisjZW5kaWYKKwkJeworCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisvLwkJCXByaW50aygiPT09PT09PmNoYW5uZWw9JWQgICIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQl9CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCQl7CisvLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKyAgICAgICAgICAgICAgICB9CisJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKKyAgICAgICAgICAgICAgICAgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KKyAgICAgICAgICAgICAgICAgKi8KKy8vICAgICAgICAgICAgICAgIGlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwkJZG97CisJCQlpZiAod2F0Y2hfZG9nKysgPj0gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkvLwlpZiAoKyt3YXRjaF9kb2cgPj0gMTUpOy8vTUFYX0NIQU5ORUxfTlVNQkVSKSAgLy9ZSixtb2RpZmllZCwwODA2MzAKKwkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSVNQVhfQ0hBTk5FTF9OVU1CRVI7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKyAgICAgICAgfQorb3V0OgorCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworICAgCS8vaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7CisgICAJLy9pZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOworCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCisKKyNpZiAwCisvKiBjYWxsZWQgYm90aCBieSB3cSB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXNob3J0IHdhdGNoZG9nID0gMDsKKworCWRveworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisJCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKwkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJcmV0dXJuOyAvKiBubyBnb29kIGNoYW5zICovCisKKwl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisKKworCXNjaGVkdWxlX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7Cit9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfSVBTCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJc3RhdGljIHNob3J0IHdhdGNoZG9nID0gMDsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworI2VuZGlmCisvLwlwcmludGsoImllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EgRU5BQkxFX0lQU1xuIik7CisvLwlwcmludGsoImluICVzXG4iLF9fRlVOQ1RJT05fXyk7CisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCisJZG97CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0KKwkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpICUgTUFYX0NIQU5ORUxfTlVNQkVSOworCQlpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlnb3RvIG91dDsgLyogbm8gZ29vZCBjaGFucyAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorIAl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZWxzZQorIAl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKworCS8vcHJpbnRrKCJjdXJyZW50X25ldHdvcmsuY2hhbm5lbDolZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWlmIChpZWVlLT5zY2FubmluZyA9PSAwICkKKwl7CisJCXByaW50aygiZXJyb3Igb3V0LCBzY2FubmluZyA9IDBcbiIpOworCQlnb3RvIG91dDsKKwl9CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorI2VuZGlmCisJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworCisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCBJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJcmV0dXJuOworb3V0OgorCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJd2F0Y2hkb2cgPSAwOworCWllZWUtPnNjYW5uaW5nID0gMDsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisjZW5kaWYKKwlyZXR1cm47Cit9CisjZWxzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKworICAgICAgICBzaG9ydCB3YXRjaGRvZyA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKyNlbmRpZgorLy8gICAgICBwcmludGsoImVudGVyIHNjYW4gd3Esd2F0Y2hkb2cgaXMgJWRcbiIsd2F0Y2hkb2cpOworICAgICAgICBkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKyAgICAgICAgZG97CisgICAgICAgICAgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJSBNQVhfQ0hBTk5FTF9OVU1CRVI7CisgICAgICAgICAgICAgICAgaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisgICAgICAgIH13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbHNlCisgICAgICAgIH13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorCisvLyAgICAgIHByaW50aygiY3VycmVudF9uZXR3b3JrLmNoYW5uZWw6JWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKyAgICAgICAgaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJlcnJvciBvdXQsIHNjYW5uaW5nID0gMFxuIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorI2VuZGlmCisJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworCisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCBJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOworb3V0OgorCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisjZW5kaWYKK30KKworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fY2IodW5zaWduZWQgbG9uZyBfZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilfZGV2OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfc29mdG1hY19zY2FuKGllZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCisKK3ZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAxOworCWllZWU4MDIxMV9zZW5kX2JlYWNvbihpZWVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYmVhY29uc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCisJaWVlZS0+YmVhY29uX3R4aW5nID0gMDsKKyAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmJlYWNvbl90aW1lcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKK30KKworCit2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZihpZWVlLT5zdG9wX3NlbmRfYmVhY29ucykKKwkJaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMoaWVlZS0+ZGV2KTsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQorCQlpZWVlODAyMTFfYmVhY29uc19zdG9wKGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZihpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMpCisJCWllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKKwkJaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisvLwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPnNjYW5uaW5nID09IDEpeworCQlpZWVlLT5zY2FubmluZyA9IDA7CisJCS8vZGVsX3RpbWVyX3N5bmMoJmllZWUtPnNjYW5fdGltZXIpOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EpOworCX0KKworLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0b3Bfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKQorCQlpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oaWVlZSk7CisJZWxzZQorCQlpZWVlLT5zdG9wX3NjYW4oaWVlZS0+ZGV2KTsKK30KKworLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwl7CisJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCXsKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4peworCQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCkKKwkJeworCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOworCQkJLy9pZWVlODAyMTFfc29mdG1hY19zY2FuKGllZWUpOworCQkvLwlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKKwkJLy9jYXJlIHRoaXMsMTIwMywyMDA3LGJ5IGxhd3JlbmNlCisjaWYgMQorCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLDApOworI2VuZGlmCisJCX0KKwl9ZWxzZQorCQlpZWVlLT5zdGFydF9zY2FuKGllZWUtPmRldik7CisKK30KKworLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwl7CisJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCXsKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKyNlbmRpZgorCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKGllZWUpOworCWVsc2UKKwkJaWVlZS0+c2Nhbl9zeW5jcm8oaWVlZS0+ZGV2KTsKKworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKyBjaGFsbGVuZ2VsZW4pOworCisJaWYgKCFza2IpIHJldHVybiBOVUxMOworCisJYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikpOworCisJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BVVRIOworCWlmIChjaGFsbGVuZ2VsZW4pIGF1dGgtPmhlYWRlci5mcmFtZV9jdGwgfD0gSUVFRTgwMjExX0ZDVExfV0VQOworCisJYXV0aC0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMHgwMTNhOyAvL0ZJWE1FCisKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKworCWF1dGgtPmFsZ29yaXRobSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NpYXRlX3NlcSk7CisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc2tiOworCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX3Byb2JlX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCXU4ICp0YWc7CisJaW50IGJlYWNvbl9zaXplOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbl9idWY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZW5jcnlwdDsKKwlpbnQgYXRpbV9sZW4sZXJwX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJY2hhciAqc3NpZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkOworCWludCBzc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJaWYocmF0ZV9leF9sZW4gPiAwKSByYXRlX2V4X2xlbis9MjsKKworCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJCWF0aW1fbGVuID0gNDsKKwllbHNlCisJCWF0aW1fbGVuID0gMDsKKworCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKKwkJZXJwX2xlbiA9IDM7CisJZWxzZQorCQllcnBfbGVuID0gMDsKKworCWJlYWNvbl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UpKworCQlzc2lkX2xlbgorCQkrMyAvL2NoYW5uZWwKKwkJK3JhdGVfbGVuCisJCStyYXRlX2V4X2xlbgorCQkrYXRpbV9sZW4KKwkJK3dwYV9pZV9sZW4KKwkJK2VycF9sZW47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGJlYWNvbl9zaXplKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWJlYWNvbl9idWYgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSopIHNrYl9wdXQoc2tiLCBiZWFjb25fc2l6ZSk7CisKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwliZWFjb25fYnVmLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FCisJYmVhY29uX2J1Zi0+YmVhY29uX2ludGVydmFsID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7CisJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCisJCWNwdV90b19sZTE2KChiZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSk7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKwllbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYKKwkJKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikpIHx8IHdwYV9pZV9sZW4pOworCisJaWYgKGVuY3J5cHQpCisJCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisKKwliZWFjb25fYnVmLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApOworCisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmxlbiA9IHNzaWRfbGVuOworCisJdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50LmRhdGE7CisKKwltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7CisKKwl0YWcgKz0gc3NpZF9sZW47CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKKwkqKHRhZysrKSA9IHJhdGVfbGVuLTI7CisJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMscmF0ZV9sZW4tMik7CisJdGFnKz1yYXRlX2xlbi0yOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfRFNfU0VUOworCSoodGFnKyspID0gMTsKKwkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCisJaWYoYXRpbV9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKKwkJKih0YWcrKykgPSAyOworCQkqKCh1MTYqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisJCXRhZys9MjsKKwl9CisKKwlpZihlcnBfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfRVJQOworCQkqKHRhZysrKSA9IDE7CisJCSoodGFnKyspID0gMDsKKwl9CisKKwlpZihyYXRlX2V4X2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOworCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7CisJCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4LHJhdGVfZXhfbGVuLTIpOworCQl0YWcrPXJhdGVfZXhfbGVuLTI7CisJfQorCisJaWYgKHdwYV9pZV9sZW4pCisJeworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQl7Ly9hcyBXaW5kb3dzIHdpbGwgc2V0IHBhaXJ3aXNlIGtleSBzYW1lIGFzIHRoZSBncm91cCBrZXkgd2hpY2ggaXMgbm90IGFsbG93ZWQgaW4gTGludXgsIHNvIHNldCB0aGlzIGZvciBJT1QgaXNzdWUuIFdCIDIwMDguMDcuMDcKKwkJCW1lbWNweSgmaWVlZS0+d3BhX2llWzE0XSwgJmllZWUtPndwYV9pZVs4XSwgNCk7CisJCX0KKworCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCX0KKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworCXJldHVybiBza2I7Cit9CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9leHRfcHJvYmVfcmVzcF9ieV9uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0LCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKK3sKKwl1OCAqdGFnOworCWludCBiZWFjb25fc2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb25fYnVmOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVuY3J5cHQ7CisJaW50IGF0aW1fbGVuLGVycF9sZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfTsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJY2hhciAqc3NpZCA9IG5ldC0+c3NpZDsKKwlpbnQgc3NpZF9sZW4gPSBuZXQtPnNzaWRfbGVuOworCisJaW50IHJhdGVfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbisyOworCWludCByYXRlX2V4X2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW47CisJaWYocmF0ZV9leF9sZW4gPiAwKSByYXRlX2V4X2xlbis9MjsKKworCWlmKCBpZWVlLT5tZXNoU2Nhbk1vZGUmNCkKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwoaWVlZSk7CisJaWYoIGllZWUtPm1lc2hTY2FuTW9kZSY2KQorCXsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSk7CisjZWxzZQorCQlzY2hlZHVsZV90YXNrKCZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKyNlbmRpZgorCX0KKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKwkJYXRpbV9sZW4gPSA0OworCWVsc2UKKwkJYXRpbV9sZW4gPSAwOworCisJaWYoaWVlZTgwMjExX2lzXzU0ZygqbmV0KSkKKwkJZXJwX2xlbiA9IDM7CisJZWxzZQorCQllcnBfbGVuID0gMDsKKworCWJlYWNvbl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UpKworCQlzc2lkX2xlbgorCQkrMyAvL2NoYW5uZWwKKwkJK3JhdGVfbGVuCisJCStyYXRlX2V4X2xlbgorCQkrYXRpbV9sZW4KKwkJK2VycF9sZW47CisvL2IKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGJlYWNvbl9zaXplKzE5Nik7CisKKwlpZiAoIXNrYikKKyAJCXJldHVybiBOVUxMOworCisJYmVhY29uX2J1ZiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKikgc2tiX3B1dChza2IsIGJlYWNvbl9zaXplKTsKKworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUUKKworCWJlYWNvbl9idWYtPmJlYWNvbl9pbnRlcnZhbCA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOyAgLy8gdXNlIGN1cnJlbnRfbmV0d29yayBoZXJlCisJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpCisJCWNwdV90b19sZTE2KChiZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSk7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKwllbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYKKwkJKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikpfHx3cGFfaWVfbGVuKTsKKworCWlmIChlbmNyeXB0KQorCQliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKKworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5sZW4gPSBzc2lkX2xlbjsKKworCXRhZyA9ICh1OCopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5kYXRhOworCisJLy8gYnJvY2FkIGNhc3QgLyBwcm9iZSByc3AKKwlpZihtZW1jbXAoZGVzdCwgYnJvYWRjYXN0X2FkZHIsIEVUSF9BTEVOICkpCisJCW1lbWNweSh0YWcsIHNzaWQsIHNzaWRfbGVuKTsKKwllbHNlCisJCXNzaWRfbGVuPTA7CisKKwl0YWcgKz0gc3NpZF9sZW47CisKKy8vZ2V0X2Jzc3JhdGVfc2V0KHByaXYsIF9TVVBQT1JURURSQVRFU19JRV8sICZwYnNzcmF0ZSwgJmJzc3JhdGVfbGVuKTsKKy8vcGJ1ZiA9IHNldF9pZShwYnVmLCBfU1VQUE9SVEVEUkFURVNfSUVfLCBic3NyYXRlX2xlbiwgcGJzc3JhdGUsICZmcmxlbik7CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKKwkqKHRhZysrKSA9IHJhdGVfbGVuLTI7CisJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMscmF0ZV9sZW4tMik7CisJdGFnKz1yYXRlX2xlbi0yOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfRFNfU0VUOworCSoodGFnKyspID0gMTsKKwkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOyAgLy8gdXNlIGN1cnJlbnRfbmV0d29yayBoZXJlCisKKworCWlmKGF0aW1fbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7CisJCSoodGFnKyspID0gMjsKKwkJKigodTE2KikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOyAvLyB1c2UgY3VycmVudF9uZXR3b3JrIGhlcmUKKwkJdGFnKz0yOworCX0KKworCWlmKGVycF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9FUlA7CisJCSoodGFnKyspID0gMTsKKwkJKih0YWcrKykgPSAwOworCX0KKworCWlmKHJhdGVfZXhfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVNfRVg7CisJCSoodGFnKyspID0gcmF0ZV9leF9sZW4tMjsKKwkJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgscmF0ZV9leF9sZW4tMik7CisJCXRhZys9cmF0ZV9leF9sZW4tMjsKKwl9CisJaWYgKHdwYV9pZV9sZW4pCisJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKwlyZXR1cm4gc2tiOworfQorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9hc3NvY19yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4KiB0YWc7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jOworCXNob3J0IGVuY3J5cHQ7CisKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpICsgcmF0ZV9sZW47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlhc3NvYyA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSk7CisKKwlhc3NvYy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKworCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbHNlIGNyeXB0ID0gTlVMTDsKKworCWVuY3J5cHQgPSAoIGNyeXB0ICYmIGNyeXB0LT5vcHMpOworCisJaWYgKGVuY3J5cHQpCisJCWFzc29jLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCWFzc29jLT5zdGF0dXMgPSAwOworCWFzc29jLT5haWQgPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY19pZCk7CisJaWYgKGllZWUtPmFzc29jX2lkID09IDB4MjAwNykgaWVlZS0+YXNzb2NfaWQ9MDsKKwllbHNlIGllZWUtPmFzc29jX2lkKys7CisKKwl0YWcgPSAodTgqKSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2F1dGhfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSxpbnQgc3RhdHVzLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSsxKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYi0+bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopc2tiLT5kYXRhOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlhdXRoLT50cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KDIpOworCWF1dGgtPmFsZ29yaXRobSA9IGNwdV90b19sZTE2KFdMQU5fQVVUSF9PUEVOKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBkZXN0LCBFVEhfQUxFTik7CisjZWxzZQorCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKyNlbmRpZgorCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKTsKKwlyZXR1cm4gc2tiOworCisKK30KKworc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9udWxsX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsc2hvcnQgcHdyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIGhkcjsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKXNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCisJbWVtY3B5KGhkci0+YWRkcjEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CisJCUlFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMgfAorCQkocHdyID8gSUVFRTgwMjExX0ZDVExfUE06MCkpOworCisJcmV0dXJuIHNrYjsKKworCit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzcF90b19hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTgqIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hc3NvY19yZXNwKGllZWUsIGRlc3QpOworCisJaWYgKGJ1Zil7CisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNwX3RvX2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBzLCB1OCogZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2F1dGhfcmVzcChpZWVlLCBzLCBkZXN0KTsKKworCWlmIChidWYpeworCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzcF90b19wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKSB7CisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1Zik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKKwl1OCAqdGFnOworCS8vc2hvcnQgaW5mb19hZGRyID0gMDsKKwkvL2ludCBpOworCS8vdTE2IHN1aXRlX2NvdW50ID0gMDsKKwkvL3U4IHN1aXRfc2VsZWN0ID0gMDsKKwl1bnNpZ25lZCBpbnQgd3BhX2xlbiA9IGJlYWNvbi0+d3BhX2llX2xlbjsKKwkvL3N0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJLy91bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJLy91OCAqYnVmZjsKKwkvL3U4ICpwOworI2lmIDEKKwkvLyBmb3IgdGVzdGluZyBwdXJwb3NlCisJdW5zaWduZWQgaW50IHJzbl9sZW4gPSBiZWFjb24tPnJzbl9pZV9sZW47CisjZWxzZQorCXVuc2lnbmVkIGludCByc25fbGVuID0gYmVhY29uLT5yc25faWVfbGVuIC0gNDsKKyNlbmRpZgorCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKGllZWUpOworCXVuc2lnbmVkIGludCB3bW1faW5mb19sZW4gPSBiZWFjb24tPlFvU19FbmFibGU/OTowOworI2lmZGVmIFRIT01BU19UVVJCTworCXVuc2lnbmVkIGludCB0dXJib19pbmZvX2xlbiA9IGJlYWNvbi0+VHVyYm9fRW5hYmxlPzk6MDsKKyNlbmRpZgorCisJdTggIGVuY3J5X3Byb3RvID0gaWVlZS0+d3BheF90eXBlX25vdGlmeSAmIDB4ZmY7CisJLy91OCAgcGFpcndpc2VfdHlwZSA9IChpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID4+IDgpICYgMHhmZjsKKwkvL3U4ICBhdXRoZW5fdHlwZSA9IChpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID4+IDE2KSAmIDB4ZmY7CisKKwlpbnQgbGVuID0gMDsKKworCS8vWzBdIE5vdGlmeSB0eXBlIG9mIGVuY3J5cHRpb246IFdQQS9XUEEyCisJLy9bMV0gcGFpciB3aXNlIHR5cGUKKwkvL1syXSBhdXRoZW4gdHlwZQorCWlmKGllZWUtPndwYXhfdHlwZV9zZXQpIHsKKwkJaWYgKElFRUVfUFJPVE9fV1BBID09IGVuY3J5X3Byb3RvKSB7CisJCQlyc25fbGVuID0gMDsKKwkJfSBlbHNlIGlmIChJRUVFX1BST1RPX1JTTiA9PSBlbmNyeV9wcm90bykgeworCQkJd3BhX2xlbiA9IDA7CisJCX0KKwl9CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrCisJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAorCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgd3BhX2xlbgorCQkrIHJzbl9sZW4KKwkJKyB3bW1faW5mb19sZW4KKwkJKyB0dXJib19pbmZvX2xlbjsKKyNlbHNlCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrCisJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAorCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgd3BhX2xlbgorCQkrIHJzbl9sZW4KKwkJKyB3bW1faW5mb19sZW47CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyNTYpOyAvLyBzdGFubGV5CisJZWxzZQorI2VuZGlmCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkpOworCisKKwloZHItPmhlYWRlci5mcmFtZV9jdGwgPSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROworCWhkci0+aGVhZGVyLmR1cmF0aW9uX2lkPSAzNzsgLy9GSVhNRQorCW1lbWNweShoZHItPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShpZWVlLT5hcF9tYWNfYWRkciwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOy8vZm9yIEhXIHNlY3VyaXR5LCBKb2huCisKKwloZHItPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfQlNTKTsKKwlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXFfMSkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXFfMShoZHIpOworI2VuZGlmCisKKwloZHItPmxpc3Rlbl9pbnRlcnZhbCA9IDB4YTsgLy9GSVhNRQorCisJaGRyLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKKworCWhkci0+aW5mb19lbGVtZW50LmxlbiA9IGJlYWNvbi0+c3NpZF9sZW47CisJdGFnID0gc2tiX3B1dChza2IsIGJlYWNvbi0+c3NpZF9sZW4pOworCW1lbWNweSh0YWcsIGJlYWNvbi0+c3NpZCwgYmVhY29uLT5zc2lkX2xlbik7CisKKwl0YWcgPSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwkvL2FkZCByc249PTAgY29uZGl0aW9uIGZvciBhcCdzIG1peCBzZWN1cml0eSBtb2RlKHdwYSt3cGEyKSwgam9objIwMDcuOC45CisJLy9jaG9vc2UgQUVTIGVuY3J5cHRpb24gYXMgZGVmYXVsdCBhbGdvcml0aG0gd2hpbGUgdXNpbmcgbWl4ZWQgbW9kZQorI2lmIDAKKwlpZihyc25fbGVuID09IDApeworCisJCXRhZyA9IHNrYl9wdXQoc2tiLHdwYV9sZW4pOworCisJCWlmKHdwYV9sZW4pIHsKKworCisJCSAgLy97YWRkIGJ5IGRhdmlkLiAyMDA2LjguMzEKKwkJICAvL2ZpeCBsaW5rc3lzIGNvbXBhdGliaWxpdHkgYnVnCisJCSAgLy99CisJCSAgaWYod3BhX2xlbiA+IDI0KSB7Ly8yMisyLCBtZWFuIGluY2x1ZGUgdGhlIGNhcGFiaWxpdHkKKwkJCWJlYWNvbi0+d3BhX2llW3dwYV9sZW4gLSAyXSA9IDA7CisJCSAgfQorCQkvL211bHRpY2FzdCBjaXBoZXIgT1VJCisgICAgICAgICAgICAgICAgICBpZiggIGJlYWNvbi0+d3BhX2llWzExXT09MHgyICAgICAgKXsgLy8weDAwNTBmMjAyIGlzIHRoZSBvdWkgb2YgdGtpcAorICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAgYmVhY29uLT53cGFfaWVbMTFdPT0weDQgICAgICApey8vMHgwMDUwZjIwNCBpcyB0aGUgb3VpIG9mIGNjbXAKKyAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgfQorIAkJLy91bmljYXN0IGNpcGhlciBPVUkKKwkJICBpZigJYmVhY29uLT53cGFfaWVbMTRdPT0wCisJCQkmJiBiZWFjb24tPndwYV9pZVsxNV09PTB4NTAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE2XT09MHhmMgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTddPT0weDIgIAkpeyAvLzB4MDA1MGYyMDIgaXMgdGhlIG91aSBvZiB0a2lwCisgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCX0KKworICAgICAgICAgICAgICAgICAgZWxzZSBpZiggICBiZWFjb24tPndwYV9pZVsxNF09PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE1XT09MHg1MAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTZdPT0weGYyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxN109PTB4NCAgICAgICl7Ly8weDAwNTBmMjA0IGlzIHRoZSBvdWkgb2YgY2NtcAorICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworCQl9CisJCS8vaW5kaWNhdGUgdGhlIHdwYV9pZSBjb250ZW50IHRvIFdQQV9TVVBQTElDQU5UCisJCWJ1ZmYgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVgsIEdGUF9BVE9NSUMpOworCQltZW1zZXQoYnVmZiwgMCwgSVdfQ1VTVE9NX01BWCk7CisJCXA9YnVmZjsKKwkJcCArPSBzcHJpbnRmKHAsICJBU1NPQ0lORk8oUmVxSUVzPSIpOworCQlmb3IoaT0wO2k8d3BhX2xlbjtpKyspeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgYmVhY29uLT53cGFfaWVbaV0pOworCQl9CisJCXAgKz0gc3ByaW50ZihwLCAiKSIpOworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSApOworCQl3cnF1LmRhdGEubGVuZ3RoID0gcCAtIGJ1ZmY7CisKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZDVVNUT00sICZ3cnF1LCBidWZmKTsKKwkJICBtZW1jcHkodGFnLGJlYWNvbi0+d3BhX2llLHdwYV9sZW4pOworCQl9CisKKwl9CisKKwlpZihyc25fbGVuID4gMjIpIHsKKworCSAgCQkJCQlpZiggICAgIGJlYWNvbi0+cnNuX2llWzRdPT0weDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbNV09PTB4ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFjb24tPnJzbl9pZVs2XT09MHhhYyl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGJlYWNvbi0+cnNuX2llWzddKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYXVsdCBzdWl0ZSB0eXBlIGluIFJTTiBicm9hZGNhc3Qga2V5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAgICAgYmVhY29uLT5yc25faWVbMTBdPT0weDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbMTFdPT0weGYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbMTJdPT0weGFjKXsKKwkJCQlpZihiZWFjb24tPnJzbl9pZVs4XT09MSl7Ly9ub3QgbWl4ZWQgbW9kZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGJlYWNvbi0+cnNuX2llWzEzXSl7CisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyOgorICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgY2FzZSAweDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmF1bHQgc3VpdGUgdHlwZSBpbiBSU04gcGFpcndpc2Uga2V5XG4iKTsKKyAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KKwkJCQl9CisJCQkJZWxzZSBpZihiZWFjb24tPnJzbl9pZVs4XT09Mil7Ly9taXhlZCBtb2RlCisJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworCisJCXRhZyA9IHNrYl9wdXQoc2tiLDIyKTsKKwkJbWVtY3B5KHRhZywoYmVhY29uLT5yc25faWUgKyBpbmZvX2FkZHIpLDgpOworCQl0YWdbMV0gPSAgMjA7CisJCXRhZyArPSA4OworCQlpbmZvX2FkZHIgKz0gODsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJdGFnWzBdID0gMTsKKwkJCXRhZ1sxXSA9IDA7CisJCQl0YWcgKz0gMjsKKwkJCXN1aXRlX2NvdW50ID0gYmVhY29uLT5yc25faWVbaW5mb19hZGRyXSArIFwKKwkJCQkgICAgICAoYmVhY29uLT5yc25faWVbaW5mb19hZGRyICsgMV0gPDwgOCk7CisJCQlpbmZvX2FkZHIgKz0gMjsKKwkJCWlmKDEgPT0gc3VpdGVfY291bnQpIHsKKwkJCQltZW1jcHkodGFnLChiZWFjb24tPnJzbl9pZSArIGluZm9fYWRkciksNCk7CisJCQkJaW5mb19hZGRyICs9IDQ7CisJCQl9IGVsc2UgeworCQkJCS8vIGlmIHRoZSB3cGF4X3R5cGVfbm90aWZ5IGhhcyBiZWVuIHNldCBieSB0aGUgYXBwbGljYXRpb24sCisJCQkJLy8ganVzdCB1c2UgaXQsIG90aGVyd2lzZSBqdXN0IHVzZSB0aGUgZGVmYXVsdCBvbmUuCisJCQkJaWYoaWVlZS0+d3BheF90eXBlX3NldCkgeworCQkJCQlzdWl0X3NlbGVjdCA9ICgoMCA9PSBpKSA/IHBhaXJ3aXNlX3R5cGU6YXV0aGVuX3R5cGUpJjB4MGYgOworCQkJCQltZW1jcHkodGFnLHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlW3N1aXRfc2VsZWN0XSw0KTsKKwkJCQl9IGVsc2UgeworCQkJCQkvL2RlZmF1bHQgc2V0IGFzIGNjbXAsIG9yIG5vbmUgYXV0aGVudGljYXRpb24KKwkJCQkJaWYoaSA9PSAwKSB7CisJCQkJCQltZW1jcHkodGFnLHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzRdLDQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbWVtY3B5KHRhZyxyc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsyXSw0KTsKKwkJCQkJfQorCisJCQkJfQorCisJCQkJaW5mb19hZGRyICs9IChzdWl0ZV9jb3VudCAqIDQpOworCQkJfQorCQkJdGFnICs9IDQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKworCQl0YWdbMF0gPSAwOworCQl0YWdbMV0gPSBiZWFjb24tPnJzbl9pZVtpbmZvX2FkZHIrMV07CisKKwl9IGVsc2UgeworCQl0YWcgPSBza2JfcHV0KHNrYixyc25fbGVuKTsKKwkJaWYocnNuX2xlbikgeworCisKKwkJCWlmKCAJYmVhY29uLT5yc25faWVbNF09PTB4MCAmJgorCQkJCWJlYWNvbi0+cnNuX2llWzVdPT0weGYgJiYKKwkJCQliZWFjb24tPnJzbl9pZVs2XT09MHhhYyl7CisJCQkJc3dpdGNoKGJlYWNvbi0+cnNuX2llWzddKXsKKwkJCQkJY2FzZSAweDE6CisJCQkJCQlpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVA0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCQljYXNlIDB4MjoKKwkJCQkJCWllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAweDQ6CisgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDEwNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJcHJpbnRrKCJmYXVsdCBzdWl0ZSB0eXBlIGluIFJTTiBicm9hZGNhc3Qga2V5XG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAgICAgYmVhY29uLT5yc25faWVbMTBdPT0weDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbMTFdPT0weGYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbMTJdPT0weGFjKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmVhY29uLT5yc25faWVbOF09PTEpey8vbm90IG1peGVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYmVhY29uLT5yc25faWVbMTNdKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIHBhaXJ3aXNlIGtleVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJfQorCisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGJlYWNvbi0+cnNuX2llWzhdPT0yKXsvL21peGVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisJCQliZWFjb24tPnJzbl9pZVtyc25fbGVuIC0gMl0gPSAwOworCQkJbWVtY3B5KHRhZyxiZWFjb24tPnJzbl9pZSxyc25fbGVuKTsKKwkJfQorCX0KKyNlbHNlCisJdGFnID0gc2tiX3B1dChza2IsaWVlZS0+d3BhX2llX2xlbik7CisJbWVtY3B5KHRhZyxpZWVlLT53cGFfaWUsaWVlZS0+d3BhX2llX2xlbik7CisjZW5kaWYKKwl0YWcgPSBza2JfcHV0KHNrYix3bW1faW5mb19sZW4pOworCWlmKHdtbV9pbmZvX2xlbikgeworCSAgaWVlZTgwMjExX1dNTV9JbmZvKGllZWUsICZ0YWcpOworCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl0YWcgPSBza2JfcHV0KHNrYix0dXJib19pbmZvX2xlbik7CisgICAgICAgIGlmKHR1cmJvX2luZm9fbGVuKSB7CisgICAgICAgICAgICAgICAgaWVlZTgwMjExX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8yKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcV8yKGllZWUsIGJlYWNvbiwgc2tiKTsKKyNlbmRpZgorCisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJLyogZG9uJ3Qgc2NhbiwgYW5kIGF2b2lkIHRvIGhhdmUgdGhlIFJYIHBhdGggcG9zc2liaWx5CisJICogdHJ5IGFnYWluIHRvIGFzc29jaWF0ZS4gRXZlbiBkbyBub3QgcmVhY3QgdG8gQVVUSCBvcgorCSAqIEFTU09DIHJlc3BvbnNlLiBKdXN0IHdhaXQgZm9yIHRoZSByZXRyeSB3cSB0byBiZSBzY2hlZHVsZWQuCisJICogSGVyZSB3ZSB3aWxsIGNoZWNrIGlmIHRoZXJlIGFyZSBnb29kIG5ldHMgdG8gYXNzb2NpYXRlCisJICogd2l0aCwgc28gd2UgcmV0cnkgb3IganVzdCBnZXQgYmFjayB0byBOT19MSU5LIGFuZCBzY2FubmluZworCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gZmFpbGVkXG4iKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hdXRoX3JzKys7CisJfWVsc2V7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBc3NvY2lhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2Fzc19ycysrOworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX1JFVFJZOworCisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2IodW5zaWduZWQgbG9uZyBkZXYpCit7CisJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydCgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgZGV2KTsKK30KKworCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU3RvcHBpbmcgc2NhblxuIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CisJc2tiPWllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSApCXsKKwkJaWYoc2tiKQorCQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJcmV0dXJuOworCX1lbHNlCisjZW5kaWYKKwlpZiAoIXNrYil7CisKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwl9CisJZWxzZXsKKwkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgOworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJLy9wcmludGsoIi0tLVNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCS8vQlVHT04gd2hlbiB5b3UgdHJ5IHRvIGFkZF90aW1lciB0d2ljZSwgdXNpbmcgbW9kX3RpbWVyIG1heSBiZSBiZXR0ZXIsIGpvaG4wNzA5CisJCWlmKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOworCQkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQl9CisJCS8vSWYgY2FsbCBkZXZfa2ZyZWVfc2tiX2FueSxhIHdhcm5pbmcgd2lsbCBvY3VyLi4uLgorCQkvL0tFUk5FTDogYXNzZXJ0aW9uICghYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpKSBmYWlsZWQgYXQgbmV0L2NvcmUvZGV2LmMgKDE3MDgpCisJCS8vU28gLi4uIDEyMDQgYnkgbGF3cmVuY2UuCisJCS8vcHJpbnRrKCJcbkluICVzLGxpbmUgJWQgY2FsbCBrZnJlZSBza2IuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKwordm9pZCBpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKK3sKKwl1OCAqYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKy8vCWludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKworCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOworCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOworCQkqKGMrKykgPSBjaGxlbjsKKwkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CisKKwkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOworCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCS8vcHJpbnRrKCI9PT09PT09PT0+YWRkIHRpbWVyIGFnYWluLCB0byBjcmFzaFxuIik7CisJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOworCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorCWtmcmVlKGNoYWxsZW5nZSk7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisKKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9hc3NvY19yZXNwCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCwgdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0LCBpbnQgcGt0X3R5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCogdGFnOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKKwlzaG9ydCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMjU2KTsgLy8gc3RhbmxleQorCWVsc2UKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYXNzb2MgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKQorCQlza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpOworCisJYXNzb2MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihwa3RfdHlwZSk7CisKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8xKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0XzEoYXNzb2MpOworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVsc2UgY3J5cHQgPSBOVUxMOworCisJZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOworCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKworCWFzc29jLT5pbmZvX2VsZW1lbnQuaWQgPSAyMzA7IC8vIFN0YW5sZXksIGFuIHVudXNlZCBpZCAoanVzdCBhIGhvdCBmaXgpCisJYXNzb2MtPmluZm9fZWxlbWVudC5sZW4gPSAwOworCisJdGFnID0gKHU4Kikgc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXRfMikKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8yKGllZWUsIHBzdGF0LCBwa3RfdHlwZSwgc2tiKTsKKworCXJldHVybiBza2I7Cit9CisKKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxCit2b2lkIGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCwgdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0LCBpbnQgcGt0X3R5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldChpZWVlLCBkZXN0LCBzdGF0dXMsIHBzdGF0LCBwa3RfdHlwZSk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisvLyBiYXNlZCBvbiBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyCit2b2lkIGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0KQoreworCisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKworCS8vIHByaW50aygiQEBAQEAgaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yZXEgb24gY2hhbm5lbDogJWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7CisJc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEocHN0YXQsIGllZWUpOworCWlmIChza2IpCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwc3RhdCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciBleHRSZWFzb24pCit7CisJLy8gZG8gbm90aGluZworCS8vIHByaW50aygiQEBAQEAgaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvY1xuIik7CisJcmV0dXJuOworfQorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2Fzc19ycSsrOworCXNrYj1pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKGJlYWNvbiwgaWVlZSk7CisJaWYgKCFza2IpCisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJZWxzZXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwkJfQorCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOworCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKworCQlpZWVlLT5yYXRlID0gNTQwOworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOworCX1lbHNleworCQlpZWVlLT5yYXRlID0gMTEwOworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOworCX0KKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJICAvL2llZWUtPnNlcV9jdHJsW2ldID0gMDsKKwl9CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZFxuIik7CisKKwlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zY2FuKGllZWUpOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSA9IDE7CisJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShpZWVlKTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGV4dF9zdG9wX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwkgIGlmIChpZWVlLT5zY2FubmluZyA9PSAwKQorCXsKKwkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbAorCQkJCSYmICggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsKGllZWUpICkgKQorCQlyZXR1cm47CisJfQorCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCS8vIHByaW50aygiQEBAQEBAQEBAQCBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cVxuIik7CisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKworCS8vIHNldCBjaGFubmVsCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbCkKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwoaWVlZSkpOworCWVsc2UKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJLy8KKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9leHRfc2VuZF8xMXNfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisJI2Vsc2UKKwkJc2NoZWR1bGVfdGFzaygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKwkjZW5kaWYKKworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKK3sKKwl1OCB0bXBfc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKKwlpbnQgdG1wX3NzaWRfbGVuID0gMDsKKworCXNob3J0IGFwc2V0LHNzaWRzZXQsc3NpZGJyb2FkLGFwbWF0Y2gsc3NpZG1hdGNoOworCisJLyogd2UgYXJlIGludGVyZXN0ZWQgaW4gbmV3IG5ldyBvbmx5IGlmIHdlIGFyZSBub3QgYXNzb2NpYXRlZAorCSAqIGFuZCB3ZSBhcmUgbm90IGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcKKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKKwkJcmV0dXJuOworCisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyl7CisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgQVAgTUFDLCB3ZSBuZWVkIGFsc28gdGhlIGVzc2lkCisJCSAqIFRoaXMgY291bGQgYmUgb2J0YWluZWQgYnkgYmVhY29ucyBvciwgaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QKKwkJICogYnJvYWRjYXN0IGl0LCBpdCBjYW4gYmUgcHV0IG1hbnVhbGx5LgorCQkgKi8KKwkJYXBzZXQgPSBpZWVlLT53YXBfc2V0Oy8vKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHplcm8sRVRIX0FMRU4pIT0wICk7CisJCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsvL2llZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdICE9ICdcMCc7CisJCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF09PSAnXDAnKTsKKwkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTik9PTApOworCisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiAhPSBuZXQtPnNzaWRfbGVuKQorCQkJc3NpZG1hdGNoID0gMDsKKwkJZWxzZQorCQkJc3NpZG1hdGNoID0gKDA9PXN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbikpOworCisJCS8vcHJpbnRrKCJjdXI6ICVzLCAlZCwgbmV0OiVzLCAlZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKTsKKwkJLy9wcmludGsoImFwc2V0PSVkIGFwbWF0Y2g9JWQgc3NpZHNldD0lZCBzc2lkYnJvYWQ9JWQgc3NpZG1hdGNoPSVkXG4iLGFwc2V0LGFwbWF0Y2gsc3NpZHNldCxzc2lkYnJvYWQsc3NpZG1hdGNoKTsKKworCQlpZiAoCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIgc3VwcGx5ZWQgQU5ZIGVzc2lkCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkIGl0IGlzIE9LCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZCBjaGVjaCBpZiBlc3NpZCBtYXRjaAorCQkJICovCisJCQkJKCBhcHNldCAmJiBhcG1hdGNoICYmCisJCQkJICAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpICkgfHwKKwkJCQkvKiBpZiB0aGUgYXAgaXMgbm90IHNldCwgY2hlY2sgdGhhdCB0aGUgdXNlciBzZXQgdGhlIGJzc2lkCisJCQkJICogYW5kIHRoZSBuZXR3b3JrIGRvZXMgYnJhZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKKwkJCQkgKi8KKwkJCQkoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkKKwkJICAgKXsKKworCisJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkJCSAqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorCQkJICovCisJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJCQl9CisJCQltZW1jcHkoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0LCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHRtcF9zc2lkX2xlbjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzOiBjaGFubmVsIGlzICVkXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQkJfWVsc2V7CisJCQkJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKwkJCQkJaWVlZS0+cmF0ZSA9IDU0MDsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKKwkJCQl9ZWxzZXsKKwkJCQkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKKwkJCQl9CisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCQkJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCQkJfQorCisJCX0KKwl9CisKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCisJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQkJYnJlYWs7CisKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwgdGFyZ2V0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBhdXRoX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4KiogY2hhbGxlbmdlLCBpbnQgKmNobGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CisJdTggKnQ7CisJaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIixza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCSpjaGFsbGVuZ2UgPSBOVUxMOworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKKwlpZihza2ItPmxlbiA+IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKzMpKXsKKwkJdCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCQlpZigqKHQrKykgPT0gTUZJRV9UWVBFX0NIQUxMRU5HRSl7CisJCQkqY2hsZW4gPSAqKHQrKyk7CisJCQkqY2hhbGxlbmdlID0gKHU4KilrbWFsbG9jKCpjaGxlbiwgR0ZQX0FUT01JQyk7CisJCQltZW1jcHkoKmNoYWxsZW5nZSwgdCwgKmNobGVuKTsKKwkJfQorCX0KKworCXJldHVybiBjcHVfdG9fbGUxNihhLT5zdGF0dXMpOworCit9CisKKworaW50IGF1dGhfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCogZGVzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOworCisJaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIixza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCisJbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLCBFVEhfQUxFTik7CisKKwlpZiAobGUxNl90b19jcHUoYS0+YWxnb3JpdGhtKSAhPSBXTEFOX0FVVEhfT1BFTikKKwkJcmV0dXJuICBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHOworCisJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzaG9ydCBwcm9iZV9ycV9wYXJzZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnNyYykKK3sKKwl1OCAqdGFnOworCXU4ICpza2JlbmQ7CisJdTggKnNzaWQ9TlVMTDsKKwl1OCBzc2lkbGVuID0gMDsKKworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKmhlYWRlciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICopIHNrYi0+ZGF0YTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpCisJCXJldHVybiAtMTsgLyogY29ycnVwdGVkICovCisKKwltZW1jcHkoc3JjLGhlYWRlci0+YWRkcjIsIEVUSF9BTEVOKTsKKworCXNrYmVuZCA9ICh1OCopc2tiLT5kYXRhICsgc2tiLT5sZW47CisKKwl0YWcgPSBza2ItPmRhdGEgKyBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApOworCisJd2hpbGUgKHRhZysxIDwgc2tiZW5kKXsKKwkJaWYgKCp0YWcgPT0gMCl7CisJCQlzc2lkID0gdGFnKzI7CisJCQlzc2lkbGVuID0gKih0YWcrMSk7CisJCQlicmVhazsKKwkJfQorCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIGxlbiBmaWVsZCAqLworCQl0YWcgPSB0YWcgKyAqKHRhZyk7IC8qIHBvaW50IHRvIHRoZSBsYXN0IGRhdGEgYnl0ZSBvZiB0aGUgdGFnICovCisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbmV4dCB0YWcgKi8KKwl9CisKKwkvL0lFRUU4MDIxMURNRVNHKCJDYXJkIE1BQyBhZGRyZXNzIGlzICJNQUNTVFIsIE1BQzJTVFIoc3JjKSk7CisJaWYgKHNzaWRsZW4gPT0gMCkgcmV0dXJuIDE7CisKKwlpZiAoIXNzaWQpIHJldHVybiAxOyAvKiBzc2lkIG5vdCBmb3VuZCBpbiB0YWdnZWQgcGFyYW0gKi8KKwlyZXR1cm4gKCFzdHJuY21wKHNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBzc2lkbGVuKSk7CisKK30KKworaW50IGFzc29jX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICphOworCisJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKKworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiVkIFxuIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUqKSBza2ItPmRhdGE7CisKKwltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsRVRIX0FMRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGFzc29jX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIGludCAqYWlkKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmE7CisJaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKikgc2tiLT5kYXRhOworCSphaWQgPSBsZTE2X3RvX2NwdShhLT5haWQpICYgMHgzZmZmOworCXJldHVybiBsZTE2X3RvX2NwdShhLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9wcm9iZV9ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKworCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOworCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisJaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpeworCQkvL0lFRUU4MDIxMURNRVNHKCJXYXMgZm9yIG1lISIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CisJCWllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOworCX0KK30KKworaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9hdXRoX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGRlc3RbRVRIX0FMRU5dOworCWludCBzdGF0dXM7CisJLy9JRUVFODAyMTFETUVTRygiUnggcHJvYmUiKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnErKzsKKworCWlmICgoc3RhdHVzID0gYXV0aF9ycV9wYXJzZShza2IsIGRlc3QpKSE9IC0xKXsKKwkJaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChpZWVlLCBzdGF0dXMsIGRlc3QpOworCX0KKwkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOworCit9CisKKyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCisJdTggZGVzdFtFVEhfQUxFTl07CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfcnErKzsKKwlpZiAoYXNzb2NfcnFfcGFyc2Uoc2tiLGRlc3QpICE9IC0xKXsKKwkJaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoaWVlZSwgZGVzdCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyJOZXcgY2xpZW50IGFzc29jaWF0ZWQ6ICJNQUNfRk1UIlxuIiwgTUFDX0FSRyhkZXN0KSk7CisJLy9GSVhNRQorCSNpZiAwCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWFkZF9hc3NvY2lhdGUoaWVlZSxkZXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwkjZW5kaWYKK30KKworCisKK3ZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKK3sKKworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfbnVsbF9mdW5jKGllZWUsIHB3cik7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX3BzX21nbXRfeG1pdChidWYsIGllZWUpOworCit9CisKKworc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsIHUzMiAqdGltZV9sKQoreworI2lmIDAKKyAgICAgICAgaW50IHRpbWVvdXQgPSBpZWVlLT5wc190aW1lb3V0OworI2Vsc2UKKyAgICAgICAgaW50IHRpbWVvdXQgPSAwOworI2VuZGlmCisJdTggZHRpbTsKKwkvKmlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKworCQlyZXR1cm4gMDsKKwkqLworCWR0aW0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhOworCS8vcHJpbnRrKCJEVElNXG4iKTsKKworCWlmKCEoZHRpbSAmIElFRUU4MDIxMV9EVElNX1ZBTElEKSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKKworCS8vcHJpbnRrKCJWQUxJRFxuIik7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YSA9IElFRUU4MDIxMV9EVElNX0lOVkFMSUQ7CisKKwlpZihkdGltICYgKChJRUVFODAyMTFfRFRJTV9VQ0FTVCB8IElFRUU4MDIxMV9EVElNX01CQ0FTVCkmIGllZWUtPnBzKSkKKwkJcmV0dXJuIDI7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKworCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZigoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKSAmJgorCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCisJCXJldHVybiAwOworI2lmIDAKKwlpZih0aW1lX2wpeworCQkqdGltZV9sID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXQorCQkJKyAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbAorCQkJKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpICogMTAwMDsKKwl9CisjZWxzZQorCWlmKHRpbWVfbCl7CisJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCisJCQkrIE1TRUNTKChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKSk7CisJCQkvLyogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSk7CisJCQkvL3ByaW50aygiYmVhY29uX2ludGVydmFsOiV4LCBkdGltX3BlcmlvZDoleCwgdG90b2wgdG8gTXNlY3M6JXgsIEhaOiV4XG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QsIE1TRUNTKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkpKSwgSFopOworCX0KKworI2VuZGlmCisJaWYodGltZV9oKXsKKwkJKnRpbWVfaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMV07CisJCWlmKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKKwkJCSp0aW1lX2ggKz0gMTsKKwl9CisKKwlyZXR1cm4gMTsKKworCit9CisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1MzIgdGgsdGw7CisJc2hvcnQgc2xlZXA7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisKKwkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8CisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKXsKKworCQkvLyN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCisJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwl9CisKKwlzbGVlcCA9IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoaWVlZSwmdGgsICZ0bCk7CisvLwlwcmludGsoIj09PT4lcywlZFsyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZ10sIGllZWUtPnN0YV9zbGVlcCA9ICVkXG4iLF9fRlVOQ1RJT05fXywgc2xlZXAsaWVlZS0+c3RhX3NsZWVwKTsKKwkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLworCWlmKHNsZWVwID09IDApCisJCWdvdG8gb3V0OworCisJaWYoc2xlZXAgPT0gMSl7CisKKwkJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsdGgsdGwpOworCisJCWVsc2UgaWYoaWVlZS0+c3RhX3NsZWVwID09IDApeworCS8vCQlwcmludGsoInNlbmQgbnVsbCAxXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJCWlmKGllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KGllZWUtPmRldikpeworCisKKwkJCQlpZWVlLT5zdGFfc2xlZXAgPSAyOworCisJCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7CisKKwkJCQlpZWVlLT5wc190aCA9IHRoOworCQkJCWllZWUtPnBzX3RsID0gdGw7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJfQorCisKKwl9ZWxzZSBpZihzbGVlcCA9PSAyKXsKKy8vI3dhcm5pbmcgQ0hFQ0tfTE9DS19IRVJFCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkvLwlwcmludGsoInNlbmQgd2FrZXVwIHBhY2tldFxuIik7CisJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCkKK3sKKwlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7CisJCWlmKG5sKXsKKwkJLy8JcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOworCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQl9CisJCXJldHVybjsKKworCX0KKworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAxKQorCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOworCisJaWVlZS0+c3RhX3NsZWVwID0gMDsKKworCWlmKG5sKXsKKwkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKKwkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyxmbGFnczI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAyKXsKKwkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KKwkJaWYoc3VjY2Vzcyl7CisKKwkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+ICVzOjplbnRlciBzbGVlcCBzdGF0ZVxuIixfX0ZVTkNUSU9OX18pOworCQkJaWVlZS0+c3RhX3NsZWVwID0gMTsKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldixpZWVlLT5wc190aCxpZWVlLT5wc190bCk7CisJCX0KKwkJLyogaWYgdGhlIGNhcmQgcmVwb3J0IG5vdCBzdWNjZXNzIHdlIGNhbid0IGJlIHN1cmUgdGhlIEFQCisJCSAqIGhhcyBub3QgUlhlZCBzbyB3ZSBjYW4ndCBhc3N1bWUgdGhlIEFQIGJlbGlldmUgdXMgYXdha2UKKwkJICovCisJfQorCS8qIDIxMTEyMDA1IC0gdHggYWdhaW4gbnVsbCB3aXRob3V0IFBTIGJpdCBpZiBsb3N0ICovCisJZWxzZSB7CisKKwkJaWYoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2Vzcyl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCitpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKKwl1MTYgZXJyY29kZTsKKwl1OCogY2hhbGxlbmdlPU5VTEw7CisJaW50IGNobGVuPTA7CisJaW50IGFpZD0wOworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudDsKKworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm4gMDsKKworCWlmKGllZWUtPnN0YV9zbGVlcCB8fCAoaWVlZS0+cHMgIT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEICYmCisJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZpZWVlLT5wc190YXNrKTsKKworCWlmKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCAmJgorCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkgIT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKKwkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCisJCQkJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShza2IsICZhaWQpKSl7CisJCQkJCXUxNiBsZWZ0OworCisJCQkJCWllZWUtPnN0YXRlPUlFRUU4MDIxMV9MSU5LRUQ7CisJCQkJCWllZWUtPmFzc29jX2lkID0gYWlkOworCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19vaysrOworCisJCQkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAibmljX3R5cGUgPSAlcyIsIChyeF9zdGF0cy0+bmljX3R5cGUgPT0gMSk/InJ0bDgxODciOiJydGw4MTg3QiIpOworCQkJCQlpZigxID09IHJ4X3N0YXRzLT5uaWNfdHlwZSkgLy9jYXJkIHR5cGUgaXMgODE4NworCQkJCQl7CisJCQkJCQlnb3RvIGFzc29jaWF0ZV9jb21wbGV0ZTsKKwkJCQkJfQorCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKXNrYi0+ZGF0YTsKKwkJCQkJaW5mb19lbGVtZW50ID0gCSZhc3NvY19yZXNwLT5pbmZvX2VsZW1lbnQ7CisJCQkJCWxlZnQgPSBza2ItPmxlbiAtICgodm9pZCopaW5mb19lbGVtZW50IC0gKHZvaWQqKWFzc29jX3Jlc3ApOworCisJCQkJCXdoaWxlIChsZWZ0ID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpKSB7CisJCQkJCQlpZiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkcikgKyBpbmZvX2VsZW1lbnQtPmxlbiA+IGxlZnQpIHsKKwkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJbcmVdYXNzb2NpYXRlIHJlZXBvbnNlIGVycm9yISIpOworCQkJCQkJCXJldHVybiAxOworCQkJCQkJfQorCQkJCQkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7CisJCQkJCQkgIGNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6CisJCQkJCQkgICAgICAgICBJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLCBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQkJCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDggICYmCisJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyICYmCisJCQkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAxKSB7CisJCQkJCQkJICAgIC8vIE5vdCBjYXJlIGFib3V0IHZlcnNpb24gYXQgcHJlc2VudC4KKwkJCQkJCQkgICAgLy9XTU0gUGFyYW1ldGVyIEVsZW1lbnQKKwkJCQkJCQkgICAgbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1fcGFyYW0sKHU4KikoaW5mb19lbGVtZW50LT5kYXRhXAorCQkJCQkJCQkJCSAgICArIDgpLChpbmZvX2VsZW1lbnQtPmxlbiAtIDgpKTsKKworCQkJCQkgCSAgICAgICAgICAgIGlmICgoKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mb15pbmZvX2VsZW1lbnQtPmRhdGFbNl0pJiBcCisJCQkJCQkJCQkJICAgIDB4MGYpfHwoIWllZWUtPmluaXRfd21tcGFyYW1fZmxhZykpIHsKKwkJCQkJCSAgIAkgICAgICAvL3JlZnJlc2ggcGFyYW1ldGUgZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCisJCQkJCQkJICAgICAgLy8gdXBkYXRlIHRoZSByZWdpc3RlciBwYXJhbWV0ZXIgZm9yIGhhcmR3YXJlCisJCQkJCQkJICAgICAgaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsKKwkJCQkJCQkgICAgICBxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CisKKwkJCQkJCSAgICAgICAgICAgIH0KKwkJCQkJCSAgICAgICAgICAgIC8vdXBkYXRlIGluZm9fZWxlbWVudCBmb3IgY3VycmVudCBuZXR3b3JrCisJCQkJCQkgICAgICAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gID0gaW5mb19lbGVtZW50LT5kYXRhWzZdOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCSAgZGVmYXVsdDoKKwkJCQkJCQkvL25vdGhpbmcgdG8gZG8gYXQgcHJlc2VudCEhIQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlsZWZ0IC09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsKKwkJCQkJCQlpbmZvX2VsZW1lbnQtPmxlbjsKKwkJCQkJCWluZm9fZWxlbWVudCA9IChzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKQorCQkJCQkJCSZpbmZvX2VsZW1lbnQtPmRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworCQkJCQl9CisJCQkJCWlmKCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpIC8vbGVnYWN5IEFQLCByZXNldCB0aGUgQUNfeHhfcGFyYW0gcmVnaXN0ZXIKKwkJCQkJeworCQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwmaWVlZS0+d21tX3BhcmFtX3VwZGF0ZV93cSk7CisJCQkJCQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOy8vaW5kaWNhdGUgQUNfeHhfcGFyYW0gdXBhdGVkIHNpbmNlIGxhc3QgYXNzb2NpYXRlCisJCQkJCX0KK2Fzc29jaWF0ZV9jb21wbGV0ZToKKwkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShpZWVlKTsKKwkJCQl9ZWxzZXsKKwkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfZXJyKys7CisJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKAorCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJCQllcnJjb2RlKTsKKwkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJCQl9CisJCQl9CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkJZWxzZSBpZiAoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hc3NvY19yc3ApCisJCQl7CisJCQkJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hc3NvY19yc3AoaWVlZSwgc2tiKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUToKKworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCisJCQkJaWVlZTgwMjExX3J4X2Fzc29jX3JxKGllZWUsIHNrYik7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkJZWxzZSBpZiAoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hc3NvY19yZXEpCisJCQl7CisJCQkJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hc3NvY19yZXEoaWVlZSwgc2tiKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK3ByaW50aygiSUVFRTgwMjExX1NUWVBFX0FVVEhcbiIpOworCQkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hdXRoKQorCQkJaWYoIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9hdXRoKGllZWUsIHNrYiwgcnhfc3RhdHMpICk7CisjZW5kaWYKKwkJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSl7CisJCQkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisKKwkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZSIpOworCisJCQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKSkpeworCQkJCQkJCWlmKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpeworCQkJCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOworCQkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKKworCQkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOworCQkJCQkJCX1lbHNleworCQkJCQkJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CisJCQkJCQkJfQorCQkJCQkJfWVsc2V7CisJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOworCQkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiByZXNwb3NlIHN0YXR1cyBjb2RlIDB4JXgiLGVycmNvZGUpOworCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJCQkJCQl9CisKKwkJCQkJfWVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpeworCQkJCQkJaWVlZTgwMjExX3J4X2F1dGhfcnEoaWVlZSwgc2tiKTsKKwkJCQkJfQorCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKKworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlMpICYmCisJCQkJKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSAmJgorCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQorCisJCQkJaWVlZTgwMjExX3J4X3Byb2JlX3JxKGllZWUsIHNrYik7CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK3ByaW50aygiSUVFRTgwMjExX1NUWVBFX0RFQVVUSFxuIik7CisJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fZGVhdXRoKQorCQlpZiggaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2RlYXV0aChpZWVlLCBza2IsIHJ4X3N0YXRzKSApCTsKKyNlbmRpZgorCQkJLyogRklYTUUgZm9yIG5vdyByZXBlYXQgYWxsIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwkJCSogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KKwkJCSovCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJgorCQkJCShpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmCisJCQkJKCFtZW1jbXAoaGVhZGVyLT5hZGRyMixpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsRVRIX0FMRU4pKSl7CisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yZWFzc29jKys7CisKKwkJCQkvL25vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsgIC8vWUosZGVsLDA4MDgyOCwgZG8gbm90IG5vdGlmeSBvcyBoZXJlCisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJfQorCisJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAwOworfQorCisKKworLyogZm9sbG93aW5nIGFyZSBmb3IgYSBzaW1wbGllciBUWCBxdWV1ZSBtYW5hZ2VtZW50LgorICogSW5zdGVhZCBvZiB1c2luZyBuZXRpZl9bc3RvcC93YWtlXV9xdWV1ZSB0aGUgZHJpdmVyCisgKiB3aWxsIHVzZXMgdGhlc2UgdHdvIGZ1bmN0aW9uIChwbHVzIGEgcmVzZXQgb25lKSwgdGhhdAorICogd2lsbCBpbnRlcm5hbGx5IHVzZXMgdGhlIGtlcm5lbCBuZXRpZl8qIGFuZCB0YWtlcworICogY2FyZSBvZiB0aGUgaWVlZTgwMi4xMSBmcmFnbWVudGF0aW9uLgorICogU28gdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IHBlciB0aW1lIGFuZCBtaWdodAorICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnQgd2l0aG91dCB0YWtlIGNhcmUKKyAqIHRvIGhhdmUgZW5vdWdodCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCisgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiBlYWNoIGZyYWdtZW50IG5lZWQgaXQncyBvd24KKyAqIGRlc2NyaXB0b3IsIHRodXMganVzdCBrZWVwIGEgdG90YWwgZnJlZSBtZW1vcnkgPiB0aGFuCisgKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdHJlc2hvbGQgaXMgbm90IGVub3VnaHQuLiBJZiB0aGUKKyAqIGllZWU4MDIuMTEgc3RhY2sgcGFzc2VkIGEgVFhCIHN0cnVjdCB0aGVuIHlvdSBuZWVkZWQKKyAqIHRvIGtlZXAgTiBmcmVlIGRlc2NyaXB0b3JzIHdoZXJlCisgKiBOID0gTUFYX1BBQ0tFVF9TSVpFIC8gTUlOX0ZSQUdfVFJFU0hPTEQKKyAqIEluIHRoaXMgd2F5IHlvdSBuZWVkIGp1c3Qgb25lIGFuZCB0aGUgODAyLjExIHN0YWNrCisgKiB3aWxsIHRha2UgY2FyZSBvZiBidWZmZXJpbmcgZnJhZ21lbnRzIGFuZCBwYXNzIHRoZW0gdG8KKyAqIHRvIHRoZSBkcml2ZXIgbGF0ZXIsIHdoZW4gaXQgd2FrZXMgdGhlIHF1ZXVlLgorICovCisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgIGk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWludCByYXRlID0gaWVlZS0+cmF0ZTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCSNpZiAwCisJaWYoaWVlZS0+cXVldWVfc3RvcCl7CisJCUlFRUU4MDIxMURNRVNHKCJFRTogSUVFRSBoYXJkX3N0YXJ0X3htaXQgaW52b2tlZCB3aGVuIGtlcm5lbCBxdWV1ZSBzaG91bGQgYmUgc3RvcHBlZCIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7CisJCWllZWUtPmllZWVfc3RhdHMuc3d0eHN0b3ArKzsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQllcnIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWVlZS0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworCisKKwl0eGI9aWVlZTgwMjExX3NrYl90b190eGIoaWVlZSxza2IpOworCisKKwlpZih0eGI9PU5VTEwpeworCQlJRUVFODAyMTFETUVTRygiV1c6IElFRUUgc3RhY2sgZmFpbGVkIHRvIHByb3ZpZGUgdHhiIik7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZXJyID0gMTsKKwkJZ290byBleGl0OworCX0KKwkjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zb2Z0bWFjX3htaXRfZ2V0X3JhdGUgJiYgdHhiLT5ucl9mcmFncykKKwl7CisJCXJhdGUgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9nZXRfcmF0ZShpZWVlLCB0eGItPmZyYWdtZW50c1swXSk7CisJfQorI2VuZGlmCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcm0gMCwgbm8gdHggbWdtdCBsb2NrIHJlcXVpcmVkICovCisJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKKworCWZvcihpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykgeworCisJCWlmIChpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gdHhiOworCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKKwkJCWdvdG8gZXhpdDsKKwkJfWVsc2V7CisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAorCQkJCXR4Yi0+ZnJhZ21lbnRzW2ldLAorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJCQlpZWVlLT5kZXYsIHJhdGUpOworI2Vsc2UKKwkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7CisjZW5kaWYKKwkJCQkvLyhpKzEpPHR4Yi0+bnJfZnJhZ3MpOworCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWVlZS0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5mcmFnbWVudHNbaV0tPmxlbjsKKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJfQorCisJaWVlZTgwMjExX3R4Yl9mcmVlKHR4Yik7CisKKwlleGl0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKKy8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgYWNxdWlyZWQgKi8KK3ZvaWQgaWVlZTgwMjExX3Jlc3VtZV90eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IGllZWUtPnR4X3BlbmRpbmcuZnJhZzsgaSA8IGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFnczsgaSsrKSB7CisKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKKwkJCXJldHVybjsKKwkJfWVsc2V7CisKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKKwkJCQlpZWVlLT5kZXYsaWVlZS0+cmF0ZSk7CisJCQkJLy8oaSsxKTxpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3MpOworCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKKworCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJaW5pdF9tZ210X3F1ZXVlKGllZWUpOworCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4Yil7CisJCWllZWU4MDIxMV90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfd2FrZV9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpZiAoISBpZWVlLT5xdWV1ZV9zdG9wKSBnb3RvIGV4aXQ7CisKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKworCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKXsKKwkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKXsKKworCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKwkJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8vcHJpbnRrKEtFUk5fQUxFUlQgImllZWU4MDIxMV93YWtlX3F1ZXVlIFxuIik7CisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJfQorCX0KKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgaWVlZS0+dHhfcGVuZGluZy50eGIpCisJCWllZWU4MDIxMV9yZXN1bWVfdHgoaWVlZSk7CisKKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4YXdha2UrKzsKKwkJbmV0aWZfd2FrZV9xdWV1ZShpZWVlLT5kZXYpOworCX0KKworZXhpdCA6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisKKwlpZiAoISBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eHN0b3ArKzsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDE7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9yYW5kb21pemVfY2VsbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCWdldF9yYW5kb21fYnl0ZXMoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwkvKiBhbiBJQlNTIGNlbGwgYWRkcmVzcyBtdXN0IGhhdmUgdGhlIHR3byBsZXNzIHNpZ25pZmljYW50CisJICogYml0cyBvZiB0aGUgZmlyc3QgYnl0ZSA9IDIKKwkgKi8KKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gJj0gfjB4MDE7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdIHw9IDB4MDI7Cit9CisKKy8qIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgb25seSAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5hc3NvY19pZCA9IDE7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLAorCQkJSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQsCisJCQlJV19FU1NJRF9NQVhfU0laRSk7CisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworCX0KKworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZihpZWVlLT5yYXdfdHgpeworCisJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwl9Cit9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzdGFydF9pYnNzX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisKKwkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgorCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAorCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCisJICogQW55d2F5IHNvbWUgbW9zdCBzZXQgb3BlcmF0aW9ucyBzZXQgYSBmbGFnIHRvIHNwZWVkLXVwCisJICogKGFib3J0KSB0aGlzIHdxICh3aGVuIHN5bmNybyBzY2FubmluZykgYmVmb3JlIHNsZWVwaW5nCisJICogb24gdGhlIHNlbWFwaG9yZQorCSAqLworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworCX0KKworCS8qIGNoZWNrIGlmIHdlIGhhdmUgdGhpcyBjZWxsIGluIG91ciBuZXR3b3JrIGxpc3QgKi8KKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IDEwOworI2VuZGlmCisJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRoY2VkIHRvCisJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKKwkgKiBiZWluZyB2ZXJ5IGZldyB0aW1lIGluIG1hbmFnZWQgbW9kZSAoc28gdGhlIGNhcmQgaGF2ZSBoYWQgbm8KKwkgKiB0aW1lIHRvIHNjYW4gYWxsIHRoZSBjaGFucy4uKSBvciB3ZSBoYXZlIGp1c3QgcnVuIHVwIHRoZSBpZmFjZQorCSAqIGFmdGVyIHNldHRpbmcgYWQtaG9jIG1vZGUuIFNvIHdlIGhhdmUgdG8gZ2l2ZSBhbm90aGVyIHRyeS4uCisJICogSGVyZSwgaW4gaWJzcyBtb2RlLCBzaG91bGQgYmUgc2FmZSB0byBkbyB0aGlzIHdpdGhvdXQgZXh0cmEgY2FyZQorCSAqIChpbiBic3MgbW9kZSB3ZSBoYWQgdG8gbWFrZSBzdXJlIG5vLW9uZSB0cnllZCB0byBhc3NvY2lhdGUgd2hlbgorCSAqIHdlIGhhZCBqdXN0IGNoZWNrZWQgdGhlIGllZWUtPnN0YXRlIGFuZCB3ZSB3YXMgZ29pbmcgdG8gc3RhcnQgdGhlCisJICogc2NhbikgYmVhY2F1c2UgaW4gaWJzcyBtb2RlIHRoZSBpZWVlODAyMTFfbmV3X25ldCBmdW5jdGlvbiwgd2hlbgorCSAqIGZpbmRzIGEgZ29vZCBuZXQsIGp1c3Qgc2V0IHRoZSBpZWVlLT5zdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELAorCSAqIHNvLCBhdCB3b3JzdCwgd2Ugd2FzdGUgYSBiaXQgb2YgdGltZSB0byBpbml0aWF0ZSBhbiB1bm5lZWRlZCBzeW5jcm8KKwkgKiBzY2FuLCB0aGF0IHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgcm91bmQgYmVjYXVzZSBpdCBzZWVzIHRoZSBzdGF0ZQorCSAqIGFzc29jaWF0ZWQuCisJICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhpZWVlKTsKKworCS8qIHRoZSBuZXR3b3JrIGRlZmluaXRpdmVseSBpcyBub3QgaGVyZS4uIGNyZWF0ZSBhIG5ldyBjZWxsICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCQlwcmludGsoImNyZWF0aW5nIG5ldyBJQlNTIGNlbGxcbiIpOworCQlpZighaWVlZS0+d2FwX3NldCkKKwkJCWllZWU4MDIxMV9yYW5kb21pemVfY2VsbChpZWVlKTsKKworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDQ7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1swXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzFdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1szXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKKworCQl9ZWxzZQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDA7CisKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDg7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFswXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsxXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsyXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzRdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs1XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzddID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKworCQkJaWVlZS0+cmF0ZSA9IDU0MDsKKwkJfWVsc2V7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gMDsKKwkJCWllZWUtPnJhdGUgPSAxMTA7CisJCX0KKworCQkvLyBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbiBJQlNTIG1vZGUKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUgPSAwOworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyA9IDA7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CisJCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVDsKKworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhZnRlciBzZW5kaW5nIGJlYWNvbiBwYWNrZXQhXG4iKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnN0YXJ0X2lic3Nfd3EsIDEwMCk7Cit9CisKKy8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJLy8KKwkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKKwkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCisJLy8KKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCXsKKwkJaWYoISBpZWVlLT5iR2xvYmFsRG9tYWluKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZQorCSAqIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgorCSAqIGlmIG5vdCAod2UgYXJlIGRpc2Fzc29jaWF0ZWQgYW5kIHdlIGFyZSBub3QKKwkgKiBpbiBhc3NvY2lhdGluZyAvIGF1dGhlbnRpY2F0aW5nIHBoYXNlKSBzdGFydCB0aGUgYmFja2dyb3VuZCBzY2FubmluZy4KKwkgKi8KKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCS8qIGVuc3VyZSBuby1vbmUgc3RhcnQgYW4gYXNzb2NpYXRpbmcgcHJvY2VzcyAodGh1cyBzZXR0aW5nCisJICogdGhlIGllZWUtPnN0YXRlIHRvIGllZWU4MDIxMV9BU1NPQ0lBVElORykgd2hpbGUgd2UKKwkgKiBoYXZlIGp1c3QgY2hla2VkIGl0IGFuZCB3ZSBhcmUgZ29pbmcgdG8gZW5hYmxlIHNjYW4uCisJICogVGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2l0aAorCSAqIGxvY2sgaGVsZCAoZnJvbSBib3RoIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZAorCSAqIHRoZSByeCBwYXRoKSwgc28gd2UgY2Fubm90IGJlIGluIHRoZSBtaWRkbGUgb2Ygc3VjaCBmdW5jdGlvbgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKy8vI2lmZGVmIEVOQUJMRV9JUFMKKy8vCXByaW50aygic3RhcnQgYnNzIEVOQUJMRV9JUFNcbiIpOworLy8jZWxzZQorCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwl9CisvLyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworLyogY2FsbGVkIG9ubHkgaW4gdXNlcnNwYWNlIGNvbnRleHQgKi8KK3ZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpCisJCQlpZWVlODAyMTFfcmVzZXRfcXVldWUoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURvdDExZF9SZXNldChpZWVlKTsKKyNlbmRpZgorCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworfQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJZ290byBleGl0OworCWlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSkKKwkJZ290byBleGl0OworCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksKKwkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKKwkqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NkdXJlICh3ZSBnZXQgaGVyZSB3aXRoCisJKiBpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORykuCisJKiBXaGVuIHdlIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSyBpdCBpcyBwb3NzaWJsZQorCSogdGhhdCB0aGUgUlggcGF0aCBydW4gYW4gYXR0ZW1wdCB0byBhc3NvY2lhdGUsIGJ1dAorCSogYm90aCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyBhbmQgdGhlCisJKiBSWCBwYXRoIHdvcmtzIHdpdGggaWVlZS0+bG9jayBoZWxkIHNvIHRoZXJlIGFyZSBubworCSogcHJvYmxlbXMuIElmIHdlIGFyZSBzdGlsbCBkaXNhc3NvY2lhdGVkIHRoZW4gc3RhcnQgYSBzY2FuLgorCSogdGhlIGxvY2sgaGVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5vIG9uZSB0cnkgdG8gc3RhcnQKKwkqIGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aGVuIHdlIGhhdmUganVzdCBjaGVja2VkIHRoZQorCSogc3RhdGUgYW5kIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgc2Nhbi4KKwkqLworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5iZWlucmV0cnkgPSB0cnVlOworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKKwkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwl9CisJLy9ZSixhZGQsMDgwODI4LCBub3RpZnkgb3MgaGVyZQorCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJeworCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisJfQorCS8vWUosYWRkLDA4MDgyOCxlbmQKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbl8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdTggYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisvL3J6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfZ2V0X2JlYWNvbl9nZXRfcHJvYmVyc3AgKQorCQlza2IgPSBpZWVlLT5leHRfcGF0Y2hfZ2V0X2JlYWNvbl9nZXRfcHJvYmVyc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIsICYoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSk7CisJZWxzZQorCQlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVzcChpZWVlLCBicm9hZGNhc3RfYWRkcik7CisjZWxzZQorCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKyNlbmRpZgorLy8KKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwliID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiLT5kYXRhOworCWItPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKKworCXJldHVybiBza2I7CisKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKKworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKKwlpZighc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc3RvcF9wcm90b2NvbCkKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworLy9pZiBjYWxsIHF1ZXVlX2RlbGF5ZWRfd29yayxjYW4gY2FsbCB0aGlzLG9yIGRvIG5vdGhpbmcuLgorLy9lZGl0IGJ5IGxhd3JlbmNlLDIwMDcxMTE4CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisvLwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKy8vCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisjZW5kaWYKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJaWYoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkmJihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkgeworCQlTZW5kRGlzYXNzb2NpYXRpb24oaWVlZSxOVUxMLFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCk7CisJfQorCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c3RhcnRfaWJzc193cSk7CisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKworCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisgCWludCBpID0gMDsKKworCWlmIChpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKXsKKwkJZG97CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCXJldHVybjsgLyogbm8gY2hhbm5lbCBmb3VuZCAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbmRpZgorCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CisJfQorCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPT0gMCkKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisgICAgICAgCWZvcihpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkgIGllZWUtPmxhc3RfcnhzZXFfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCX0KKworCWllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDA7Ly9yZWluaXRpYWxpemUgQUNfeHhfUEFSQU0gcmVnaXN0ZXJzLgorCisKKwkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIE1BQyBvZiB0aGUgYWQtaG9jIGNlbGwgYW5kIHRoZW4KKwkgKiBzd2l0Y2ggdG8gbWFuYWdlZCBtb2RlLCBzaGFsbCB3ZSAgbWFrZSBzdXJlIHRoYXQgYXNzb2NpYXRpb24KKwkgKiBhdHRlbXB0cyBkb2VzIG5vdCBmYWlsIGp1c3QgYmVjYXVzZSB0aGUgdXNlciBwcm92aWRlIHRoZSBlc3NpZAorCSAqIGFuZCB0aGUgbmljIGlzIHN0aWxsIGNoZWNraW5nIGZvciB0aGUgQVAgTUFDID8/CisJICovCisJc3dpdGNoIChpZWVlLT5pd19tb2RlKSB7CisJCWNhc2UgSVdfTU9ERV9BVVRPOgorCQkJaWVlZS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQkvL25vdCBzZXQgYnJlYWsgaGVyZSBpbnRlbnRpb25seQorCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJaWVlZTgwMjExX3N0YXJ0X2lic3MoaWVlZSk7CisJCQlicmVhazsKKworCQljYXNlIElXX01PREVfTUFTVEVSOgorCQkJaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3MoaWVlZSk7CisJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShpZWVlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCQkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmXAorCQkJICAgIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wgJiZcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKSkgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKyNlbmRpZgorCQkJCS8vIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluCisJCQkJLy8gRVhURU5TSU9OIG1vZGUKKwkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSA9IDA7CisKKwkJCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDQ7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1swXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgXAorCQkJCQkgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMV0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1syXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzNdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKKwkJCQl9ZWxzZQorCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gMDsKKworCQkJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDg7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFswXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsxXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsyXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbM10gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs0XSA9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs1XSA9XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs2XSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbN10gPVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV81NE1COworCQkJCQlpZWVlLT5yYXRlID0gNTQwOworCQkJCX1lbHNleworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gMDsKKwkJCQkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAgIHNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJCQkJICAgaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCQkJICAgaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJCQkJLy8gaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCA4KTsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJCQkqLworCQkJCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGllZWUtPmRldi0+ZGV2X2FkZHIsXAorCQkJCSAgICAgIAkgRVRIX0FMRU4pOworCQkJCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisJCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJCQkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJaWVlZS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQkJaWVlZTgwMjExX3N0YXJ0X2JzcyhpZWVlKTsKKwkJCX0KKyNlbHNlCisJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CisKKyNlbmRpZgorCQkJYnJlYWs7CisJfQorfQorCisKKyNkZWZpbmUgRFJWX05BTUUgICJJZWVlODAyMTEiCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisJbWVtc2V0KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJICBpZWVlLT5zZXFfY3RybFtpXSA9IDA7CisJfQorCisJaWVlZS0+YXNzb2NfaWQgPSAwOworCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCWllZWUtPnNjYW5uaW5nID0gMDsKKwlpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzID0gMDsgLy9zbyBJRUVFMjEwMC1saWtlIGRyaXZlciBhcmUgaGFwcHkKKwlpZWVlLT53YXBfc2V0ID0gMDsKKwlpZWVlLT5zc2lkX3NldCA9IDA7CisJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CisJaWVlZS0+YmFzaWNfcmF0ZSA9IElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEU7CisJaWVlZS0+cmF0ZSA9IDM7CisvLyNpZmRlZiBFTkFCTEVfTFBTCisJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUOworLy8jZWxzZQorLy8JaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisvLyNlbmRpZgorCWllZWUtPnN0YV9zbGVlcCA9IDA7CisvL2J5IGFteQorCWllZWUtPmJJbmFjdGl2ZVBzID0gZmFsc2U7CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwlpZWVlLT5MaXN0ZW5JbnRlcnZhbCA9IDI7CisJaWVlZS0+TnVtUnhEYXRhSW5QZXJpb2QgPSAwOyAvL1lKLGFkZCwwODA4MjgKKwlpZWVlLT5OdW1SeEJjbkluUGVyaW9kID0gMDsgLy9ZSixhZGQsMDgwODI4CisJaWVlZS0+TnVtUnhPa1RvdGFsID0gMDsvLytieSBhbXkgMDgwMzEyCisJaWVlZS0+TnVtUnhVbmljYXN0ID0gMDsvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKKwlpZWVlLT5iSHdSYWRpb09mZiA9IGZhbHNlOworLy9ieSBhbXkKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWVlZS0+aXdfZXh0X21vZGUgPSA5OTk7CisjZW5kaWYKKworCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKKyNpZiAwCisJaW5pdF90aW1lcigmaWVlZS0+c2Nhbl90aW1lcik7CisJaWVlZS0+c2Nhbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWVlZTsKKwlpZWVlLT5zY2FuX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9jYjsKKyNlbmRpZgorCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKworCWluaXRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmFzc29jaWF0ZV90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2I7CisKKwlpbml0X3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOworCWllZWUtPmJlYWNvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGllZWU7CisJaWVlZS0+YmVhY29uX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiOworCisjaWZkZWYgUEZfU1lOQ1RIUkVBRAorCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSwwKTsKKyNlbHNlCisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApLy9hZGRlZCBieSBsYXdyZW5jZSwwNzA3MDIKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSwodm9pZCopIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EpOworCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSk7CisvLwlJTklUX1dPUksoJmllZWUtPndhdGNoX2RvZ193cSwodm9pZCopIGllZWU4MDIxMV93YXRjaF9kb2dfd3EpOworLy9hZGRlZCBieSBsYXdyZW5jZSwyMDA3MTExOAorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlJTklUX1dPUksoJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cSk7CisJLy9JTklUX1dPUksoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSwodm9pZCopIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0LGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cSk7CisjZW5kaWYgLy9fUlRMODE4N19FWFRfUEFUQ0hfCisjZWxzZQorCUlOSVRfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSwodm9pZCopIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCh2b2lkKikgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsKHZvaWQqKSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+d3hfc3luY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSxpZWVlKTsKKy8vCUlOSVRfV09SSygmaWVlZS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgaWVlZTgwMjExX3dhdGNoX2RvZ193cSxpZWVlKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc3RvcF9zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3EsaWVlZSk7CisJLy9JTklUX1dPUksoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSwodm9pZCopIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0LGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxLCh2b2lkKikgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cSxpZWVlKTsKKyNlbmRpZgorI2VuZGlmCisJc2VtYV9pbml0KCZpZWVlLT53eF9zZW0sIDEpOworCXNlbWFfaW5pdCgmaWVlZS0+c2Nhbl9zZW0sIDEpOworCisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPm1nbXRfdHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmJlYWNvbl9sb2NrKTsKKworCXRhc2tsZXRfaW5pdCgmaWVlZS0+cHNfdGFzaywKKwkgICAgICh2b2lkKCopKHVuc2lnbmVkIGxvbmcpKSBpZWVlODAyMTFfc3RhX3BzLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpaWVlZSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWllZWUtPnBEb3QxMWRJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfRE9UMTFEX0lORk8pLCBHRlBfQVRPTUlDKTsKKyNlbmRpZgorfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CisKKworCS8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPkdQSU9DaGFuZ2VSRldvcmtJdGVtKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5leHRfc3RvcF9zY2FuX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EpOworI2VuZGlmCisJZGVzdHJveV93b3JrcXVldWUoaWVlZS0+d3EpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihOVUxMICE9IGllZWUtPnBEb3QxMWRJbmZvKQorCQlrZnJlZShpZWVlLT5wRG90MTFkSW5mbyk7CisjZW5kaWYKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGFydCBvZiBXUEEgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHRoaXMgaXMgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKwkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgorCSAqIGludGVyZmFjZS4gKi8KKwlwcmludGsoIiVzIFdQQVxuIix2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwgaW50IHdwYV9pZV9sZW4pCit7CisJLyogbWFrZSBzdXJlIFdQQSBpcyBlbmFibGVkICovCisJaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgMSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY29tbWFuZCwgaW50IHJlYXNvbikKK3sKKworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBJRUVFX01MTUVfU1RBX0RFQVVUSDoKKwkJLy8gc2lsZW50bHkgaWdub3JlCisJCWJyZWFrOworCisJY2FzZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DOgorCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLCBjb21tYW5kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBsZW4pCit7CisJdTggKmJ1ZjsKKworCWlmIChwYXJhbS0+dS53cGFfaWUubGVuID4gTUFYX1dQQV9JRV9MRU4gfHwKKwkgICAgKHBhcmFtLT51LndwYV9pZS5sZW4gJiYgcGFyYW0tPnUud3BhX2llLmRhdGEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4pIHsKKwkJYnVmID0ga21hbGxvYyhwYXJhbS0+dS53cGFfaWUubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KGJ1ZiwgcGFyYW0tPnUud3BhX2llLmRhdGEsIHBhcmFtLT51LndwYV9pZS5sZW4pOworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBidWY7CisJCWllZWUtPndwYV9pZV9sZW4gPSBwYXJhbS0+dS53cGFfaWUubGVuOworCX0gZWxzZSB7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKworCWllZWU4MDIxMV93cGFfYXNzb2NfZnJhbWUoaWVlZSwgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBVVRIX0FMR19PUEVOX1NZU1RFTQkJCTB4MQorI2RlZmluZSBBVVRIX0FMR19TSEFSRURfS0VZCQkJMHgyCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9OworCWludCByZXQgPSAwOworCisJaWYgKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJCWllZWUtPm9wZW5fd2VwID0gMDsKKwl9IGVsc2UgeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47CisJCWllZWUtPm9wZW5fd2VwID0gMTsKKwl9CisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwllbHNlCisJCXJldCA9IC1FT1BOT1RTVVBQOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggbmFtZSwgdTMyIHZhbHVlKQoreworCWludCByZXQ9MDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChuYW1lKSB7CisJY2FzZSBJRUVFX1BBUkFNX1dQQV9FTkFCTEVEOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcz12YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRDogeworCQkvKiBIQUNLOgorCQkgKgorCQkgKiB3cGFfc3VwcGxpY2FudCBjYWxscyBzZXRfd3BhX2VuYWJsZWQgd2hlbiB0aGUgZHJpdmVyCisJCSAqIGlzIGxvYWRlZCBhbmQgdW5sb2FkZWQsIHJlZ2FyZGxlc3Mgb2YgaWYgV1BBIGlzIGJlaW5nCisJCSAqIHVzZWQuICBObyBvdGhlciBjYWxscyBhcmUgbWFkZSB3aGljaCBjYW4gYmUgdXNlZCB0bworCQkgKiBkZXRlcm1pbmUgaWYgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWQgb3Igbm90IHByaW9yIHRvCisJCSAqIGFzc29jaWF0aW9uIGJlaW5nIGV4cGVjdGVkLiAgSWYgZW5jcnlwdGlvbiBpcyBub3QgYmVpbmcKKwkJICogdXNlZCwgZHJvcF91bmVuY3J5cHRlZCBpcyBzZXQgdG8gZmFsc2UsIGVsc2UgdHJ1ZSAtLSB3ZQorCQkgKiBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBDQVBfUFJJVkFDWV9PTiBiaXQgc2hvdWxkCisJCSAqIGJlIHNldC4KKwkJICovCisJCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkJLmZsYWdzID0gU0VDX0VOQUJMRUQsCisJCQkuZW5hYmxlZCA9IHZhbHVlLAorCQl9OworIAkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCisJCSAqIGFyZSBzZXQgYnkgaXB3X3dwYV9zZXRfZW5jcnlwdGlvbi4KKwkJICovCisJCWlmICghdmFsdWUpIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJfQorCQllbHNlIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfQorCQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCWllZWUtPnByaXZhY3lfaW52b2tlZD12YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fQVVUSF9BTEdTOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3MoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9JRUVFXzgwMl8xWDoKKwkJaWVlZS0+aWVlZTgwMl8xeD12YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUOgorCQkvLyBhZGRlZCBmb3IgV1BBMiBtaXhlZCBtb2RlCisJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPndwYXggdmFsdWUgPSAleFxuIiwgdmFsdWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKwkJaWVlZS0+d3BheF90eXBlX3NldCA9IDE7CisJCWllZWUtPndwYXhfdHlwZV9ub3RpZnkgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrLGZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gV1BBIHBhcmFtOiAlZFxuIixuYW1lKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogaW1wbGVtZW50YXRpb24gYm9ycm93ZWQgZnJvbSBob3N0YXAgZHJpdmVyICovCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBhcmFtX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCS5mbGFncyA9IDAsCisJfTsKKworCXBhcmFtLT51LmNyeXB0LmVyciA9IDA7CisJcGFyYW0tPnUuY3J5cHQuYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOIC0gMV0gPSAnXDAnOworCisJaWYgKHBhcmFtX2xlbiAhPQorCSAgICAoaW50KSAoKGNoYXIgKikgcGFyYW0tPnUuY3J5cHQua2V5IC0gKGNoYXIgKikgcGFyYW0pICsKKwkgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbikgeworCQlwcmludGsoIkxlbiBtaXNtYXRjaCAlZCwgJWRcbiIsIHBhcmFtX2xlbiwKKwkJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwYXJhbS0+c3RhX2FkZHJbMF0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbMV0gPT0gMHhmZiAmJgorCSAgICBwYXJhbS0+c3RhX2FkZHJbMl0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbM10gPT0gMHhmZiAmJgorCSAgICBwYXJhbS0+c3RhX2FkZHJbNF0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbNV0gPT0gMHhmZikgeworCQlpZiAocGFyYW0tPnUuY3J5cHQuaWR4ID49IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNyeXB0ID0gJmllZWUtPmNyeXB0W3BhcmFtLT51LmNyeXB0LmlkeF07CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgPT0gMCkgeworCQlpZiAoY3J5cHQpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCS8vIEZJWE1FIEZJWE1FCisJCQkvL3NlYy5lbmNyeXB0ID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCXNlYy5lbmFibGVkID0gMTsKKy8vIEZJWE1FIEZJWE1FCisvLwlzZWMuZW5jcnlwdCA9IDE7CisJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOworCisJLyogSVBXIEhXIGNhbm5vdCBidWlsZCBUS0lQIE1JQywgaG9zdCBkZWNyeXB0aW9uIHN0aWxsIG5lZWRlZC4gKi8KKwlpZiAoIShpZWVlLT5ob3N0X2VuY3J5cHQgfHwgaWVlZS0+aG9zdF9kZWNyeXB0KSAmJgorCSAgICBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpKQorCQlnb3RvIHNraXBfaG9zdF9jcnlwdDsKKworCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCWlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3RraXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0KKwlpZiAob3BzID09IE5VTEwpIHsKKwkJcHJpbnRrKCJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwgcGFyYW0tPnUuY3J5cHQuYWxnKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEc7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworCQluZXdfY3J5cHQgPSAoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICopCisJCQlrbWFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9CisJCQkJbmV3X2NyeXB0LT5vcHMtPmluaXQocGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJaWYgKHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKwkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCisJCQkJICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbiwgcGFyYW0tPnUuY3J5cHQuc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJcHJpbnRrKCJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworIHNraXBfaG9zdF9jcnlwdDoKKwlpZiAocGFyYW0tPnUuY3J5cHQuc2V0X3R4KSB7CisJCWllZWUtPnR4X2tleWlkeCA9IHBhcmFtLT51LmNyeXB0LmlkeDsKKwkJc2VjLmFjdGl2ZV9rZXkgPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwl9IGVsc2UKKwkJc2VjLmZsYWdzICY9IH5TRUNfQUNUSVZFX0tFWTsKKworCWlmIChwYXJhbS0+dS5jcnlwdC5hbGcgIT0gTlVMTCkgeworCQltZW1jcHkoc2VjLmtleXNbcGFyYW0tPnUuY3J5cHQuaWR4XSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlzZWMua2V5X3NpemVzW3BhcmFtLT51LmNyeXB0LmlkeF0gPSBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwgcGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKKwkJfQorCX0KKyBkb25lOgorCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCisJLyogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKKwkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCisJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKKwkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0KGllZWUtPmRldikpIHsKKwkJcHJpbnRrKCJyZXNldF9wb3J0IGZhaWxlZFxuIik7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCkKK3sKKwlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CisJaW50IHJldD0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKKworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtID09IE5VTEwpeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCWtmcmVlKHBhcmFtKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChwYXJhbS0+Y21kKSB7CisKKwljYXNlIElFRUVfQ01EX1NFVF9XUEFfUEFSQU06CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3BhcmFtKGllZWUsIHBhcmFtLT51LndwYV9wYXJhbS5uYW1lLAorCQkJCQlwYXJhbS0+dS53cGFfcGFyYW0udmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9JRToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT046CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9NTE1FOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX21sbWUoaWVlZSwgcGFyYW0tPnUubWxtZS5jb21tYW5kLAorCQkJCSAgIHBhcmFtLT51Lm1sbWUucmVhc29uX2NvZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIixwYXJhbS0+Y21kKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPT0gMCAmJiBjb3B5X3RvX3VzZXIocC0+cG9pbnRlciwgcGFyYW0sIHAtPmxlbmd0aCkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlrZnJlZShwYXJhbSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoaWVlZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2JlYWNvbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93YWtlX3F1ZXVlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVzZXRfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfc2hvcnRzbG90KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2lzXzU0Zyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9wc190eF9hY2spOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKG5vdGlmeV93eF9hc3NvY19ldmVudCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyk7CitFWFBPUlRfU1lNQk9MKFNlbmREaXNhc3NvY2lhdGlvbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9kaXNhc3NvY2lhdGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X2lzc3VlX2Fzc29jX3JlcSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfaXNzdWVfZGlzYXNzb2MpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X2lzc3VlX2Fzc29jX3JzcCk7CitFWFBPUlRfU1lNQk9MKHNvZnRtYWNfbWdtdF94bWl0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9wcm9iZV9yZXNwX2J5X25ldCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3Bfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfc2VuZF8xMXNfYmVhY29uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3J4X2F1dGhfcnEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKTsKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiOGFlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTAsMCArMSw2MDIgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBTb21lIHBpZWNlcyBvZiBjb2RlIG1pZ2h0IGJlIHN0b2xlbiBmcm9tIGlwdzIxMDAgZHJpdmVyCisgKiBjb3B5cmlnaHQgb2Ygd2hvIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiBQUyB3eCBoYW5kbGVyIG1vc3RseSBzdG9sZW4gZnJvbSBob3N0YXAsIGNvcHlyaWdodCB3aG8KKyAqIG93biBpdCdzIGNvcHlyaWdodCA7LSkKKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKy8qIEZJWE1FOiBhZGQgQSBmcmVxcyAqLworCitjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW10gPSB7CisJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywKKwkyNDMyLCAyNDM3LCAyNDQyLCAyNDQ3LAorCTI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsCisJMjQ3MiwgMjQ4NAorfTsKKworCitpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IGl3X2ZyZXEgKmZ3cnEgPSAmIHdycXUtPmZyZXE7CisvLwlwcmludGsoImluICVzXG4iLF9fRlVOQ1RJT05fXyk7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpZiBzZXR0aW5nIGJ5IGZyZXEgY29udmVydCB0byBjaGFubmVsICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCQlpZiAoKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCAmJgorCQkgICAgIGZ3cnEtPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJCWludCBjID0gMDsKKworCQkJd2hpbGUgKChjIDwgMTQpICYmIChmICE9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2NdKSkKKwkJCQljKys7CisKKwkJCS8qIGhhY2sgdG8gZmFsbCB0aHJvdWdoICovCisJCQlmd3JxLT5lID0gMDsKKwkJCWZ3cnEtPm0gPSBjICsgMTsKKwkJfQorCX0KKworCWlmIChmd3JxLT5lID4gMCB8fCBmd3JxLT5tID4gMTQgfHwgZndycS0+bSA8IDEgKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCisJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KKworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQkJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCQkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKwkJCX0KKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlmd3JxLT5tID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisJZndycS0+ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgorCQlpZWVlLT53YXBfc2V0ID09IDApCisKKwkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwKKwkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9zZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQgPSAwOworCXU4IHplcm9bXSA9IHswLDAsMCwwLDAsMH07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNob3J0IGlmdXAgPSBpZWVlLT5wcm90b19zdGFydGVkOy8vZGV2LT5mbGFncyAmIElGRl9VUDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKKworCS8vcHJpbnRrKCI9PT09PT09U2V0IFdBUDoiKTsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8qIHVzZSBpZmNvbmZpZyBodyBldGhlciAqLworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0ZW1wLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCisJLyoganVzdCB0byBhdm9pZCB0byBnaXZlIGluY29uc2lzdGVudCBpbmZvcyBpbiB0aGUKKwkgKiBnZXQgd3ggbWV0aG9kLiBub3QgcmVhbGx5IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgdGVtcC0+c2FfZGF0YSwgRVRIX0FMRU4pOworCWllZWUtPndhcF9zZXQgPSBtZW1jbXAodGVtcC0+c2FfZGF0YSwgemVybyxFVEhfQUxFTikhPTA7CisJLy9wcmludGsoIiAleDoleDoleDoleDoleDoleFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFsxXSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMl0saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzNdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFs0XSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbNV0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSx1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJaW50IGxlbixyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gPT0gJ1wwJyB8fAorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPnNzaWRfc2V0ID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwl3cnF1LT5lc3NpZC5sZW5ndGggPSBsZW47CisJc3RybmNweShiLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGxlbik7CisJd3JxdS0+ZXNzaWQuZmxhZ3MgPSAxOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXUzMiB0YXJnZXRfcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWU7CisKKwkvL2FkZGVkIGJ5IGxpemhhb21pbmcgZm9yIGF1dG8gbW9kZQorCWlmKHRhcmdldF9yYXRlID09IC0xKXsKKwlpZWVlLT5yYXRlID0gMTEwOworCX0gZWxzZSB7CisJaWVlZS0+cmF0ZSA9IHRhcmdldF9yYXRlLzEwMDAwMDsKKwl9CisJLy9GSVhNRTogd2UgbWlnaHQgd2FudCB0byBsaW1pdCByYXRlIGFsc28gaW4gbWFuYWdlbWVudCBwcm90b2NvbHMuCisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXdycXUtPmJpdHJhdGUudmFsdWUgPSBpZWVlLT5yYXRlICogMTAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPm1vZGUgPT0gaWVlZS0+aXdfbW9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCisJCWllZWUtPmRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJfWVsc2V7CisJCWllZWUtPmRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKKwl9CisKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpeworCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKKwl9ZWxzZXsKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOworCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCit2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3eF9zeW5jX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorLy92b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCisvL3sKKwlzaG9ydCBjaGFuOworCisJY2hhbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORzsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCisJLy9ZSixhZGQsMDgwODI4LCBJbiBwcmV2ZW50IG9mIGxvc3NpbmcgcGluZyBwYWNrZXQgZHVyaW5nIHNjYW5uaW5nCisJLy9pZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCBmYWxzZSk7CisJLy9ZSixhZGQsMDgwODI4LGVuZAorCisJdXAoJmllZWUtPnd4X3NlbSk7CisKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJLy9ZSixhZGQsMDgwODI4CisJLy9JbiBwcmV2ZW50IG9mIGxvc3NpbmcgcGluZyBwYWNrZXQgZHVyaW5nIHNjYW5uaW5nCisJLy9pZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCB0cnVlKTsKKwkvL1lKLGFkZCwwODA4MjgsZW5kCisKKwlpZiAoIGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d3hfc3luY19zY2FuX3dxKTsKKwkJLyogaW50ZW50aW9uYWxseSBmb3JnZXQgdG8gdXAgc2VtICovCisJCXJldHVybiAwOworCX0KKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJaW50IHJldD0wLGxlbjsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CisKKwlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpeworCQlyZXQ9IC1FMkJJRzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcmV0PSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisKKwkvKiB0aGlzIGlzIGp1c3QgdG8gYmUgc3VyZSB0aGF0IHRoZSBHRVQgd3ggY2FsbGJhY2sKKwkgKiBoYXMgY29uc2lzdGVuIGluZm9zLiBub3QgbmVlZGVkIG90aGVyd2lzZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod3JxdS0+ZXNzaWQuZmxhZ3MgJiYgd3JxdS0+ZXNzaWQubGVuZ3RoKSB7CisvL1lKLG1vZGlmaWVkLDA4MDgxOQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8ICBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCWxlbiA9ICgod3JxdS0+ZXNzaWQubGVuZ3RoLTEpIDwgSVdfRVNTSURfTUFYX1NJWkUpID8gKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA6IElXX0VTU0lEX01BWF9TSVpFOworI2Vsc2UKKwkJbGVuID0gKHdycXUtPmVzc2lkLmxlbmd0aCA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgpIDogSVdfRVNTSURfTUFYX1NJWkU7CisjZW5kaWYKKwkJbWVtc2V0KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCAwLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4pOyAvL1lKLGFkZCwwODA4MTkKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbik7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IGxlbjsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworLy9ZSixtb2RpZmllZCwwODA4MTksZW5kCisKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJaWYobGVuID09IDApeworCQkJbWVtc2V0KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgMCwgRVRIX0FMRU4pOworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgPSAwOworCQl9CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCX0KKwllbHNleworCQlpZWVlLT5zc2lkX3NldCA9IDA7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID0gJ1wwJzsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gMDsKKwl9CisJLy9wcmludGsoIj09PT09PT09PT1zZXQgZXNzaWQgJXMhXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJd3JxdS0+bW9kZSA9IGllZWUtPml3X21vZGU7CisJcmV0dXJuIDA7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IGllZWUtPnJhd190eDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihlbmFibGUpCisJCWllZWUtPnJhd190eCA9IDE7CisJZWxzZQorCQlpZWVlLT5yYXdfdHggPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyJyYXcgVFggaXMgJXNcbiIsCisJICAgICAgaWVlZS0+cmF3X3R4ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwl7CisJCWlmKHByZXYgPT0gMCAmJiBpZWVlLT5yYXdfdHgpeworCQkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCX0KKworCQlpZihwcmV2ICYmIGllZWUtPnJhd190eCA9PSAxKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKwl9CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9uYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIjgwMi4xMSIpOworCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCQlzdHJjYXQod3JxdS0+bmFtZSwgImIiKTsKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCQlzdHJjYXQod3JxdS0+bmFtZSwgIi9nIik7CisJfWVsc2UgaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiZyIpOworCisJaWYoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpIHx8CisJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HKSkKKwkJc3RyY2F0KHdycXUtPm5hbWUsIiBsaW5rZWQiKTsKKwllbHNlIGlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGluay4uIik7CisKKworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgaXMgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCAqLworaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCisJaWYoCisJCSghaWVlZS0+c3RhX3dha2VfdXApIHx8CisJCSghaWVlZS0+cHNfcmVxdWVzdF90eF9hY2spIHx8CisJCSghaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUpIHx8CisJCSghaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkpKXsKKworCQlwcmludGsoIkVSUk9SLiBQUyBtb2RlIGlzIHRyeWllZCB0byBiZSB1c2UgYnV0XAorZHJpdmVyIG1pc3NlZCBhIGNhbGxiYWNrXG5cbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisKKwkJZ290byBleGl0OworCX0KKwlzd2l0Y2ggKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19VTklDQVNUOworCisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1QgfCBJRUVFODAyMTFfUFNfTUJDQVNUOworCQlicmVhazsKKworCWNhc2UgSVdfUE9XRVJfT046CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisKKwkJaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJcHJpbnRrKCJUaW1lb3V0ICVkXG4iLGllZWUtPnBzX3RpbWVvdXQpOworCX0KKworCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1BFUklPRCkgeworCisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIGV4aXQ7CisJCS8vd3JxLT52YWx1ZSAvIDEwMjQ7CisKKwl9CitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCl7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKworLy8JaWYgKCh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQl3cnF1LT5wb3dlci52YWx1ZSA9IGllZWUtPnBzX3RpbWVvdXQgKiAxMDAwOworLy8JfSBlbHNlIHsKKy8vCQlyZXQgPSAtRU9QTk9UU1VQUDsKKy8vCQlnb3RvIGV4aXQ7CisJCS8vd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCS8vd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QgKgorCQkvLwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICogMTAyNDsKKy8vCX0KKworCisJaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisJZWxzZQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lc3NpZCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfd2FwKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9uYW1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhMDY4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0wLDAgKzEsODI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworCisvKgorCisKKzgwMi4xMSBEYXRhIEZyYW1lCisKKworODAyLjExIGZyYW1lX2NvbnRvcmwgZm9yIGRhdGEgZnJhbWVzIC0gMiBieXRlcworICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitiaXRzIHwgMCAgfCAgMSAgfCAgMiAgfCAgMyAgfCAgNCAgfCAgNSAgfCAgNiAgfCAgNyAgfCAgOCAgfCAgOSAgfCAgYSAgfCAgYiAgfCAgYyAgfCAgZCAgfCAgZSAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAordmFsICB8IDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIHggIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIDAgIHwgIHggIHwgIHggIHwgIHggIHwgIHggIHwgIHggICB8CisgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKK2Rlc2MgfCBeLXZlci1eICB8ICBedHlwZS1eICB8ICBeLS0tLS1zdWJ0eXBlLS0tLS1eICB8IHRvICB8ZnJvbSB8bW9yZSB8cmV0cnl8IHB3ciB8bW9yZSB8d2VwICAgfAorICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgeD0wIGRhdGEseD0xIGRhdGErYWNrIHwgRFMgIHwgRFMgIHxmcmFnIHwgICAgIHwgbWdtIHxkYXRhIHwgICAgICB8CisgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis4MDIuMTEgRGF0YSBGcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAsLS0tLS0tLS0tICdjdHJsJyBleHBhbmRzIHRvID4tLS0tLS0tLS0tLScKKyAgICAgICAgICB8CisgICAgICAsLS0nLS0tLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgRnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8LS0tLS0tJworVG90YWw6IDI4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC0tLS0uLS0tLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIC4tICdGcmFtZSBkYXRhJyBleHBhbmRzIHRvIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgfAorICAgICAgIFYKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAxICAgfCAgMSAgIHwgICAgMSAgICB8ICAgIDMgICAgIHwgIDIgICB8ICAwLTIzMDQgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwKK0Rlc2MuIHwgU05BUCB8IFNOQVAgfCBDb250cm9sIHxFdGggVHVubmVsfCBUeXBlIHwgSVAgICAgICB8CisgICAgICB8IERTQVAgfCBTU0FQIHwgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8IFBhY2tldCAgfAorICAgICAgfCAweEFBIHwgMHhBQSB8MHgwMyAoVUkpfDB4MDAtMDAtRjh8ICAgICAgfCAgICAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8CitUb3RhbDogOCBub24tZGF0YSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0lQIFBhY2tldCcgZXhwYW5kcywgaWYgV0VQIGVuYWJsZWQsIHRvIDwtLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgNCAgfCAgIDAtMjI5NiAgfCAgNCAgfAorICAgICAgfC0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tfAorRGVzYy4gfCBJViAgfCBFbmNyeXB0ZWQgfCBJQ1YgfAorICAgICAgfCAgICAgfCBJUCBQYWNrZXQgfCAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMKKworCis4MDIuMyBFdGhlcm5ldCBEYXRhIEZyYW1lCisKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgICA2ICAgfCAgIDYgICB8ICAyICAgfCAgVmFyaWFibGUgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgRGVzdC4gfCBTb3VyY2V8IFR5cGUgfCBJUCBQYWNrZXQgfCAgZmNzIHwKKyAgICAgIHwgIE1BQyAgfCAgTUFDICB8ICAgICAgfCAgICAgICAgICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAxOCBub24tZGF0YSBieXRlcworCitJbiB0aGUgZXZlbnQgdGhhdCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgaW5jb21pbmcgcGF5bG9hZCBpcyBzcGxpdCBpbnRvCitOIHBhcnRzIG9mIHNpemUgaWVlZS0+ZnRzLiAgVGhlIGZpcnN0IGZyYWdtZW50IGNvbnRhaW5zIHRoZSBTTkFQIGhlYWRlciBhbmQgdGhlCityZW1haW5pbmcgcGFja2V0cyBhcmUganVzdCBkYXRhLgorCitJZiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQgcGF5bG9hZCBzaXplIGlzIHJlZHVjZWQgYnkgZW5vdWdoIHNwYWNlCit0byBhZGQgdGhlIHByZWZpeCBhbmQgcG9zdGZpeCAoSVYgYW5kIElDViB0b3RhbGxpbmcgOCBieXRlcyBpbiB0aGUgY2FzZSBvZiBXRVApCitTbyBpZiB5b3UgaGF2ZSAxNTAwIGJ5dGVzIG9mIHBheWxvYWQgd2l0aCBpZWVlLT5mdHMgc2V0IHRvIDUwMCB3aXRob3V0CitlbmNyeXB0aW9uIGl0IHdpbGwgdGFrZSAzIGZyYW1lcy4gIFdpdGggV0VQIGl0IHdpbGwgdGFrZSA0IGZyYW1lcyBhcyB0aGUKK3BheWxvYWQgb2YgZWFjaCBmcmFtZSBpcyByZWR1Y2VkIHRvIDQ5MiBieXRlcy4KKworKiBTS0IgdmlzdWFsaXphdGlvbgorKgorKiAgLC0gc2tiLT5kYXRhCisqIHwKKyogfCAgICBFVEhFUk5FVCBIRUFERVIgICAgICAgICwtPC0tIFBBWUxPQUQKKyogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDE0IGJ5dGVzIGZyb20gc2tiLT5kYXRhCisqIHwgIDIgYnl0ZXMgZm9yIFR5cGUgLS0+ICxULiB8ICAgICAoc2l6ZW9mIGV0aGhkcikKKyogfCAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyogfCwtRGVzdC4tLS4gLC0tU3JjLi0tLS4gfCB8IHwKKyogfCAgNiBieXRlc3wgfCA2IGJ5dGVzIHwgfCB8IHwKKyogdiAgICAgICAgIHwgfCAgICAgICAgIHwgfCB8IHwKKyogMCAgICAgICAgIHwgdiAgICAgICAxIHwgdiB8IHYgICAgICAgICAgIDIKKyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisqICAgICBeICAgICB8IF4gICAgICAgICB8IF4gfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCB8IHwKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwgYFQnIDwtLS0tIDIgYnl0ZXMgZm9yIFR5cGUKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwKKyogICAgIHwgICAgIHwgJy0tLVNOQVAtLScgPC0tLS0tLS0tIDYgYnl0ZXMgZm9yIFNOQVAKKyogICAgIHwgICAgIHwKKyogICAgIGAtSVYtLScgPC0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgYnl0ZXMgZm9yIElWIChXRVApCisqCisqICAgICAgU05BUCBIRUFERVIKKyoKKyovCisKK3N0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKK3N0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX3B1dF9zbmFwKHU4ICpkYXRhLCB1MTYgaF9wcm90bykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICpzbmFwOworCXU4ICpvdWk7CisKKwlzbmFwID0gKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKilkYXRhOworCXNuYXAtPmRzYXAgPSAweGFhOworCXNuYXAtPnNzYXAgPSAweGFhOworCXNuYXAtPmN0cmwgPSAweDAzOworCisJaWYgKGhfcHJvdG8gPT0gMHg4MTM3IHx8IGhfcHJvdG8gPT0gMHg4MGYzKQorCQlvdWkgPSBQODAyXzFIX09VSTsKKwllbHNlCisJCW91aSA9IFJGQzEwNDJfT1VJOworCXNuYXAtPm91aVswXSA9IG91aVswXTsKKwlzbmFwLT5vdWlbMV0gPSBvdWlbMV07CisJc25hcC0+b3VpWzJdID0gb3VpWzJdOworCisJKih1MTYgKikoZGF0YSArIFNOQVBfU0laRSkgPSBodG9ucyhoX3Byb3RvKTsKKworCXJldHVybiBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKK30KKworaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWludCByZXM7CisKKyAvKmFkZGVkIHRvIGNhcmUgYWJvdXQgbnVsbCBjcnlwdCBjb25kaXRpb24sIHRvIHNvbHZlIHRoYXQgc3lzdGVtIGhhbmdzIHdoZW4gc2hhcmVkIGtleXMgZXJyb3IqLworICAgICAgICBpZiAoIWNyeXB0IHx8ICFjcnlwdC0+b3BzKQorICAgICAgICByZXR1cm4gLTE7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZnJhZy0+ZGF0YTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgIlRYIHBhY2tldCB0byAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGVhZGVyLT5hZGRyMSkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwkvKiBUbyBlbmNyeXB0LCBmcmFtZSBmb3JtYXQgaXM6CisJICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykgKi8KKworCS8vIFBSOiBGSVhNRTogQ29waWVkIGZyb20gaG9zdGFwLiBDaGVjayBmcmFnbWVudGF0aW9uL01TRFUvTVBEVSBlbmNyeXB0aW9uLgorCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IDA7CisJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKwlpZiAocmVzID09IDAgJiYgY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOworCQlpZWVlLT5pZWVlX3N0YXRzLnR4X2Rpc2NhcmRzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKSB7CisJaW50IGk7CisJaWYgKHVubGlrZWx5KCF0eGIpKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykKKwkJaWYgKHR4Yi0+ZnJhZ21lbnRzW2ldKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaV0pOworCWtmcmVlKHR4Yik7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfYWxsb2NfdHhiKGludCBucl9mcmFncywgaW50IHR4Yl9zaXplLAorCQkJCQkgIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworCWludCBpOworCXR4YiA9IGttYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyAoc2l6ZW9mKHU4KikgKiBucl9mcmFncyksCisJCWdmcF9tYXNrKTsKKwlpZiAoIXR4YikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQodHhiLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpKTsKKwl0eGItPm5yX2ZyYWdzID0gbnJfZnJhZ3M7CisJdHhiLT5mcmFnX3NpemUgPSB0eGJfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXR4Yi0+ZnJhZ21lbnRzW2ldID0gZGV2X2FsbG9jX3NrYih0eGJfc2l6ZSk7CisJCWlmICh1bmxpa2VseSghdHhiLT5mcmFnbWVudHNbaV0pKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoaSAhPSBucl9mcmFncykpIHsKKwkJd2hpbGUgKGkgPj0gMCkKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ktLV0pOworCQlrZnJlZSh0eGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHR4YjsKK30KKworLy8gQ2xhc3NpZnkgdGhlIHRvLWJlIHNlbmQgZGF0YSBwYWNrZXQKKy8vIE5lZWQgdG8gYWNxdWlyZSB0aGUgc2VudCBxdWV1ZSBpbmRleC4KK3N0YXRpYyBpbnQKK2llZWU4MDIxMV9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisgIHN0cnVjdCBldGhlcl9oZWFkZXIgKmVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIqKXNrYi0+ZGF0YTsKKyAgdW5zaWduZWQgaW50IHdtZV9VUCA9IDA7CisKKyAgaWYoIW5ldHdvcmstPlFvU19FbmFibGUpIHsKKyAgICAgc2tiLT5wcmlvcml0eSA9IDA7CisgICAgIHJldHVybih3bWVfVVApOworICB9CisKKyAgaWYoZWgtPmV0aGVyX3R5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhFUlRZUEVfSVApKSB7CisgICAgY29uc3Qgc3RydWN0IGlwaGRyICppaCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmRhdGEgKyBcCisJCSAgICBzaXplb2Yoc3RydWN0IGV0aGVyX2hlYWRlcikpOworICAgIHdtZV9VUCA9IChpaC0+dG9zID4+IDUpJjB4MDc7CisgIH0gZWxzZSBpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7Ly92dGFnIHBhY2tldAorI2lmbmRlZiBWTEFOX1BSSV9TSElGVAorI2RlZmluZSBWTEFOX1BSSV9TSElGVCAgMTMgICAgICAgICAgICAgIC8qIFNoaWZ0IHRvIGZpbmQgVkxBTiB1c2VyIHByaW9yaXR5ICovCisjZGVmaW5lIFZMQU5fUFJJX01BU0sgICA3ICAgICAgICAgICAgICAgLyogTWFzayBmb3IgdXNlciBwcmlvcml0eSBiaXRzIGluIFZMQU4gKi8KKyNlbmRpZgorCXUzMiB0YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl3bWVfVVAgPSAodGFnID4+IFZMQU5fUFJJX1NISUZUKSAmIFZMQU5fUFJJX01BU0s7CisgIH0gZWxzZSBpZihFVEhfUF9QQUUgPT0gIG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pKSB7CisgICAgLy9wcmludGsoS0VSTl9XQVJOSU5HICJ0eXBlID0gbm9ybWFsIHBhY2tldFxuIik7CisgICAgd21lX1VQID0gNzsKKyAgfQorCisgIHNrYi0+cHJpb3JpdHkgPSB3bWVfVVA7CisgIHJldHVybih3bWVfVVApOworfQorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworLy8gYmFzZWQgb24gcGFydCBvZiBpZWVlODAyMTFfeG1pdC4gTWFpbmx5IGFsbG9jYXRlIHR4Yi4gaWVlZS0+bG9jayBpcyBoZWxkCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2V4dF9hbGxvY190eGIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciwgaW50IGhkcl9sZW4sIHU4IGlzUW9TLCB1MTYgKnBRT1NfY3RsLCBpbnQgaXNFbmNyeXB0LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0KQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNlbHNlCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkZXYtPnByaXY7CisjZW5kaWYKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHI7CisJaW50IGksIGJ5dGVzX3Blcl9mcmFnLCBucl9mcmFncywgYnl0ZXNfbGFzdF9mcmFnLCBmcmFnX3NpemU7CisJaW50IGV0aGVyX3R5cGU7CisJaW50IGJ5dGVzLCBRT1NfY3RsOworCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKKworCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJICogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisJLy8gaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisJLy8gaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkgfHwKKwkJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpKSB7CisJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJUU9TX2N0bCA9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJfQorCWVsc2UgeworCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJmZyYWdfc2l6ZSA9ICVkXG4iLCBmcmFnX3NpemUpOworCQlmcmFnX3NpemUgPSBpZWVlLT5mdHM7Ly9kZWZhdWx0OjM5MgorCQlRT1NfY3RsID0gMDsKKwl9CisKKwlpZihpc1FvUykgeworCQlRT1NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJKnBRT1NfY3RsID0gY3B1X3RvX2xlMTYoUU9TX2N0bCk7CisJfQorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiaGVhZGVyIHNpemUgPSAlZCwgUU9TX2N0bCA9ICV4XG4iLCBoZHJfbGVuLFFPU19jdGwpOworCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCisJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkgKiBldmVudHVhbGx5IGJlIGFmZml4ZWQgdG8gdGhpcyBmcmFnbWVudCAtLSBzbyB3ZSBtdXN0IGFjY291bnQgZm9yCisJICogaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJLy9ieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIChJRUVFODAyMTFfM0FERFJfTEVOICsgKGllZWUtPmN1cnJlbnRfbmV0d29yay0+UW9TX0VuYWJsZSA/IDI6MCkpOworCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKKwlpZiAoaWVlZS0+Y29uZmlnICYKKwkJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOworCisJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb25nIHByZS9wb3N0Zml4ICovCisJaWYgKGlzRW5jcnlwdCkKKwkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKKworCS8qIE51bWJlciBvZiBmcmFnbWVudHMgaXMgdGhlIHRvdGFsIGJ5dGVzX3Blcl9mcmFnIC8KKwkgKiBwYXlsb2FkX3Blcl9mcmFnbWVudCAqLworCW5yX2ZyYWdzID0gYnl0ZXMgLyBieXRlc19wZXJfZnJhZzsKKwlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOworCWlmIChieXRlc19sYXN0X2ZyYWcpCisJCW5yX2ZyYWdzKys7CisJZWxzZQorCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlc19wZXJfZnJhZzsKKworCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSByZXNlcnZlCisJICogYW5kIGZ1bGwgZnJhZ21lbnQgYnl0ZXMgKGJ5dGVzX3Blcl9mcmFnIGRvZXNuJ3QgaW5jbHVkZSBwcmVmaXgsCisJICogcG9zdGZpeCwgaGVhZGVyLCBGQ1MsIGV0Yy4pICovCisJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdHhiLT5lbmNyeXB0ZWQgPSBpc0VuY3J5cHQ7CisJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXNrYl9mcmFnID0gdHhiLT5mcmFnbWVudHNbaV07CisJCXNrYl9mcmFnLT5wcmlvcml0eSA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCQlpZiAoaXNFbmNyeXB0KQorCQkJc2tiX3Jlc2VydmUoc2tiX2ZyYWcsIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4pOworCisJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCW1lbWNweShmcmFnX2hkciwgKHZvaWQgKiloZWFkZXIsIGhkcl9sZW4pOworCisJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCisJCSAqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKKwkJCQkJaGVhZGVyLT5mcmFtZV9jdGwgfCBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOworCQkJYnl0ZXMgPSBieXRlc19wZXJfZnJhZzsKKworCQl9IGVsc2UgeworCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKwkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOworCQl9CisKKwkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IGkpOworCQkvL2ZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmw8PDQgfCBpKTsKKwkJLy8KKworCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJaWVlZTgwMjExX3B1dF9zbmFwKAorCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwgZXRoZXJfdHlwZSk7CisJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKwkJfQorCisJCW1lbWNweShza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIHNrYi0+ZGF0YSwgYnl0ZXMpOworCisJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLworCQlza2JfcHVsbChza2IsIGJ5dGVzKTsKKworCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbiBvcmRlcgorCQkgKiB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKwkJaWYgKGlzRW5jcnlwdCkKKwkJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJaWYgKGllZWUtPmNvbmZpZyAmCisJCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCXNrYl9wdXQoc2tiX2ZyYWcsIDQpOworCX0KKwkvLyBBZHZhbmNlIHNlcXVlbmNlIG51bWJlciBpbiBkYXRhIGZyYW1lLgorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUW9TIEVuYWxiZWQ/ICVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZT8iWSI6Ik4iKTsKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisJLy8gc3RhbmxleSwganVzdCBmb3IgZGVidWcKKy8qCit7CisJaW50IGo9MDsKKwlmb3Ioaj0wO2o8bnJfZnJhZ3M7aisrKQorCXsKKwkJCWludCBpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhiLT5mcmFnbWVudHNbal07CisJCQlwcmludGsoInNlbmQoJWQpOiAiLCBqKTsKKwkJCWZvciAoaT0wO2k8c2tiLT5sZW47aSsrKQorCQkJCXByaW50aygiJTAyWCAiLCBza2ItPmRhdGFbaV0mMHhmZik7CisJCQlwcmludGsoIlxuIik7CisJfQorfQorKi8KKworCXJldHVybiB0eGI7Cit9CisKKworLy8gYmFzZWQgb24gcGFydCBvZiBpZWVlODAyMTFfeG1pdC4gTWFpbmx5IGFsbG9jYXRlIHR4Yi4gaWVlZS0+bG9jayBpcyBoZWxkCisvLyBBc3N1bWUgbm8gZW5jcnlwdGlvbiwgbm8gRkNTIGNvbXB1dGluZworc3RydWN0IGllZWU4MDIxMV90eGIgKmllZWU4MDIxMV9leHRfcmV1c2VfdHhiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIsIGludCBoZHJfbGVuLCB1OCBpc1FvUywgdTE2ICpwUU9TX2N0bCwgaW50IGlzRW5jcnlwdCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCkKK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisjZWxzZQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGV2LT5wcml2OworI2VuZGlmCisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyOworCWludCBldGhlcl90eXBlOworCWludCBieXRlcywgUU9TX2N0bDsKKworCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpIHx8CisJCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIxKSkgeworCQlRT1NfY3RsID0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwl9CisJZWxzZSB7CisJCVFPU19jdGwgPSAwOworCX0KKworCWlmKGlzUW9TKSB7CisJCVFPU19jdGwgfD0gc2tiLT5wcmlvcml0eTsgLy9zZXQgaW4gdGhlIGllZWU4MDIxMV9jbGFzc2lmeQorCQkqcFFPU19jdGwgPSBjcHVfdG9fbGUxNihRT1NfY3RsKTsKKwl9CisKKwl0eGIgPSBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgc2l6ZW9mKHU4KiksIEdGUF9BVE9NSUMgKTsKKwlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0eGItPm5yX2ZyYWdzID0gMTsKKwl0eGItPmZyYWdfc2l6ZSA9IGJ5dGVzOworCXR4Yi0+ZW5jcnlwdGVkID0gaXNFbmNyeXB0OworCXR4Yi0+cGF5bG9hZF9zaXplID0gYnl0ZXM7CisKKwl0eGItPmZyYWdtZW50c1swXSA9IHNrYjsKKwlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQlza2JfcHVzaChza2IsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwgZXRoZXJfdHlwZSk7CisJZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2JfcHVzaChza2IsIGhkcl9sZW4pOworCW1lbWNweShmcmFnX2hkciwgKHZvaWQgKiloZWFkZXIsIGhkcl9sZW4pOworCWZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCAwKTsKKwlza2ItPnByaW9yaXR5ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisKKwkvLyBBZHZhbmNlIHNlcXVlbmNlIG51bWJlciBpbiBkYXRhIGZyYW1lLgorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUW9TIEVuYWxiZWQ/ICVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZT8iWSI6Ik4iKTsKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwlyZXR1cm4gdHhiOworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisvKiBTS0JzIGFyZSBhZGRlZCB0byB0aGUgaWVlZS0+dHhfcXVldWUuICovCitpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpmcmFnX2hkcjsKKwlpbnQgaSwgYnl0ZXNfcGVyX2ZyYWcsIG5yX2ZyYWdzLCBieXRlc19sYXN0X2ZyYWcsIGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZpZWVlLT5zdGF0czsKKwlpbnQgZXRoZXJfdHlwZSwgZW5jcnlwdDsKKwlpbnQgYnl0ZXMsIGZjLCBRT1NfY3RsLCBoZHJfbGVuOworCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaGRyIGhlYWRlciA9IHsgLyogRW5zdXJlIHplcm8gaW5pdGlhbGl6ZWQgKi8KKwkvLwkuZHVyYXRpb25faWQgPSAwLAorCS8vCS5zZXFfY3RsID0gMAorCS8vfTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgaGVhZGVyID0geyAvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLworCQkuZHVyYXRpb25faWQgPSAwLAorCQkuc2VxX2N0bCA9IDAsCisJCS5RT1NfY3RsID0gMAorCX07CisJdTggZGVzdFtFVEhfQUxFTl0sIHNyY1tFVEhfQUxFTl07CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJ1cHBlciBsYXllciBwYWNrZXQhXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgbm8gZHJpdmVyIGhhbmRsZXIgdG8gdGFrZSB0aGUgVFhCLCBkb250JyBib3RoZXIKKwkgKiBjcmVhdGluZyBpdC4uLiAqLworCWlmICgoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCAmJiAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKXx8CisJICAgKCghaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKwlpZWVlODAyMTFfY2xhc3NpZnkoc2tiLCZpZWVlLT5jdXJyZW50X25ldHdvcmspOworCWlmKGxpa2VseShpZWVlLT5yYXdfdHggPT0gMCkpeworCisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCS8vIG5vdGUsIHNrYi0+cHJpb3JpdHkgd2hpY2ggd2FzIHNldCBieSBpZWVlODAyMTFfY2xhc3NpZnksIGFuZCB1c2VkIGJ5IHBoeXNpY2FsIHR4CisJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV94bWl0KSkKKwkJeworCQkJdHhiID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV94bWl0KHNrYiwgZGV2KTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorI2VuZGlmCisKKwkJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCQllbmNyeXB0ID0gIShldGhlcl90eXBlID09IEVUSF9QX1BBRSAmJiBpZWVlLT5pZWVlODAyXzF4KSAmJgorCQkJaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHM7CisKKwkJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCAmJiBldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgeworCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJaWYgKGNyeXB0ICYmICFlbmNyeXB0ICYmIGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBTTkFQX1NJWkUgLSBzaXplb2YodTE2KSk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJUWDogSUVFRSA4MDIuMTEgRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwkJfQorCSNlbmRpZgorCisJCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwkJbWVtY3B5KCZkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZzcmMsIHNrYi0+ZGF0YStFVEhfQUxFTiwgRVRIX0FMRU4pOworCisJCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCS8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KKwkJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CisJCQlpZiAoZW5jcnlwdCkKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBIHwKKwkJCQkJSUVFRTgwMjExX0ZDVExfV0VQOworCQkJZWxzZQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChlbmNyeXB0KQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfREFUQSB8CisJCQkJCUlFRUU4MDIxMV9GQ1RMX1dFUDsKKwkJCWVsc2UKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEE7CisJCX0KKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOworCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IERBICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgJnNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsICZkZXN0LCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkvKiBub3QgRnJvbS9UbyBEUzogQWRkcjEgPSBEQSwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gQlNTSUQgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCX0KKwkvLwlwcmludGsoS0VSTl9XQVJOSU5HICJlc3NpZCBNQUMgYWRkcmVzcyBpcyAiTUFDX0ZNVCwgTUFDX0FSRygmaGVhZGVyLmFkZHIxKSk7CisJCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmYyk7CisJCS8vaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwkJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJCSogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisvLwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisvLwkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkgfHwKKwkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkgeworCQkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJUU9TX2N0bCA9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJCX0KKwkJZWxzZSB7CisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJmZyYWdfc2l6ZSA9ICVkXG4iLCBmcmFnX3NpemUpOworCQkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOy8vZGVmYXVsdDozOTIKKwkJCVFPU19jdGwgPSAwOworCQl9CisKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQl7CisJCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIDI7CisJCQlRT1NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJCWhlYWRlci5RT1NfY3RsID0gY3B1X3RvX2xlMTYoUU9TX2N0bCk7CisJCX0gZWxzZSB7CisJCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKKwkJfQorCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgImhlYWRlciBzaXplID0gJWQsIFFPU19jdGwgPSAleFxuIiwgaGRyX2xlbixRT1NfY3RsKTsKKwkJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkJKiB0aGlzIHN0YWNrIGlzIHByb3ZpZGluZyB0aGUgZnVsbCA4MDIuMTEgaGVhZGVyLCBvbmUgd2lsbAorCQkqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudCBmb3IKKwkJKiBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkJLy9ieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIChJRUVFODAyMTFfM0FERFJfTEVOICsgKGllZWUtPmN1cnJlbnRfbmV0d29yay0+UW9TX0VuYWJsZSA/IDI6MCkpOworCQlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47CisJCWlmIChpZWVlLT5jb25maWcgJgorCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gSUVFRTgwMjExX0ZDU19MRU47CisKKwkJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb25nIHByZS9wb3N0Zml4ICovCisJCWlmIChlbmNyeXB0KQorCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQkJY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CisKKwkJLyogTnVtYmVyIG9mIGZyYWdtZW50cyBpcyB0aGUgdG90YWwgYnl0ZXNfcGVyX2ZyYWcgLworCQkqIHBheWxvYWRfcGVyX2ZyYWdtZW50ICovCisJCW5yX2ZyYWdzID0gYnl0ZXMgLyBieXRlc19wZXJfZnJhZzsKKwkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXMgJSBieXRlc19wZXJfZnJhZzsKKwkJaWYgKGJ5dGVzX2xhc3RfZnJhZykKKwkJCW5yX2ZyYWdzKys7CisJCWVsc2UKKwkJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSByZXNlcnZlCisJCSogYW5kIGZ1bGwgZnJhZ21lbnQgYnl0ZXMgKGJ5dGVzX3Blcl9mcmFnIGRvZXNuJ3QgaW5jbHVkZSBwcmVmaXgsCisJCSogcG9zdGZpeCwgaGVhZGVyLCBGQ1MsIGV0Yy4pICovCisJCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIobnJfZnJhZ3MsIGZyYWdfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseSghdHhiKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJdHhiLT5lbmNyeXB0ZWQgPSBlbmNyeXB0OworCQl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOworCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisJCQlpZiAoZW5jcnlwdCkKKwkJCQlza2JfcmVzZXJ2ZShza2JfZnJhZywgY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbik7CisKKwkJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqKXNrYl9wdXQoc2tiX2ZyYWcsIGhkcl9sZW4pOworCQkJbWVtY3B5KGZyYWdfaGRyLCAmaGVhZGVyLCBoZHJfbGVuKTsKKworCQkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgZnJhZ21lbnQsIHRoZW4gYWRkIHRoZSBNT1JFRlJBR1MKKwkJCSogYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCisJCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCisJCQkJCWZjIHwgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKKwkJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IHRha2VzIHRoZSByZW1haW5pbmcgbGVuZ3RoICovCisJCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7CisJCQl9CisJCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQkJICAvLyBhZGQgMSBvbmx5IGluZGljYXRlIHRvIGNvcnJlc3BvbmRpbmcgc2VxIG51bWJlciBjb250cm9sIDIwMDYvNy8xMgorCQkJICBmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpKzFdPDw0IHwgaSk7CisJCQkgIC8vcHJpbnRrKEtFUk5fV0FSTklORyAic2tiLT5wcmlvcml0eSA9ICVkLCIsIHNrYi0+cHJpb3JpdHkpOworCQkJICAvL3ByaW50ayhLRVJOX1dBUk5JTkcgInR5cGU6JWQ6IHNlcSA9ICVkXG4iLFVQMkFDKHNrYi0+cHJpb3JpdHkpLGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpKzFdKTsKKwkJCX0gZWxzZSB7CisJCQkgIGZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCBpKTsKKwkJCX0KKwkJCS8vZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybDw8NCB8IGkpOworCQkJLy8KKworCQkJLyogUHV0IGEgU05BUCBoZWFkZXIgb24gdGhlIGZpcnN0IGZyYWdtZW50ICovCisJCQlpZiAoaSA9PSAwKSB7CisJCQkJaWVlZTgwMjExX3B1dF9zbmFwKAorCQkJCQlza2JfcHV0KHNrYl9mcmFnLCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksCisJCQkJCWV0aGVyX3R5cGUpOworCQkJCWJ5dGVzIC09IFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCQkJfQorCisJCQltZW1jcHkoc2tiX3B1dChza2JfZnJhZywgYnl0ZXMpLCBza2ItPmRhdGEsIGJ5dGVzKTsKKworCQkJLyogQWR2YW5jZSB0aGUgU0tCLi4uICovCisJCQlza2JfcHVsbChza2IsIGJ5dGVzKTsKKworCQkJLyogRW5jcnlwdGlvbiByb3V0aW5lIHdpbGwgbW92ZSB0aGUgaGVhZGVyIGZvcndhcmQgaW4gb3JkZXIKKwkJCSogdG8gaW5zZXJ0IHRoZSBJViBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisJCQlpZiAoZW5jcnlwdCkKKwkJCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2JfZnJhZywgaGRyX2xlbik7CisJCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQkJc2tiX3B1dChza2JfZnJhZywgNCk7CisJCX0KKwkJLy8gQWR2YW5jZSBzZXF1ZW5jZSBudW1iZXIgaW4gZGF0YSBmcmFtZS4KKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJRb1MgRW5hbGJlZD8gJXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlPyJZIjoiTiIpOworCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKKwkJICBpZiAoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPSAwOworCQkgIGVsc2UKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0rKzsKKwkJfSBlbHNlIHsKKyAgCQkgIGlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCQl9CisJCS8vLS0tCisJfWVsc2V7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7CisJCWlmKCF0eGIpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQl0eGItPmVuY3J5cHRlZCA9IDA7CisJCXR4Yi0+cGF5bG9hZF9zaXplID0gc2tiLT5sZW47CisJCW1lbWNweShza2JfcHV0KHR4Yi0+ZnJhZ21lbnRzWzBdLHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfQorCisgc3VjY2VzczoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCS8vIFNvbWV0aW1lcywgZXh0ZW5zaW9uIG1vZGUgY2FuIHJldXNlIHNrYiAoYnkgdHhiLT5mcmFnbWVudHNbMF0pCisJaWYoICEgKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiB0eGIgJiYgKHR4Yi0+ZnJhZ21lbnRzWzBdID09IHNrYikpICkKKyNlbmRpZgorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICh0eGIpIHsKKwkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpeworCQkJaWVlZTgwMjExX3NvZnRtYWNfeG1pdCh0eGIsIGllZWUpOworCQl9ZWxzZXsKKwkJCWlmICgoKmllZWUtPmhhcmRfc3RhcnRfeG1pdCkodHhiLCBkZXYpID09IDApIHsKKwkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCXN0YXRzLT50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJcmV0dXJuIDE7CisKK30KKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4Yl9mcmVlKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9hbGxvY190eGIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X2FsbG9jX3R4Yik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfcmV1c2VfdHhiKTsKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkOWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0wLDAgKzEsODg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCitzdGF0aWMgY29uc3QgY2hhciAqaWVlZTgwMjExX21vZGVzW10gPSB7CisJIj8iLCAiYSIsICJiIiwgImFiIiwgImciLCAiYWciLCAiYmciLCAiYWJnIgorfTsKKworI2lmZGVmIEZFRE9SQUNPUkVfOQorI2RlZmluZSBJTl9GRURPUkFDT1JFXzkgMQorI2Vsc2UKKyNkZWZpbmUgSU5fRkVET1JBQ09SRV85IDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CitzdGF0aWMgaW5saW5lIGNoYXIgKnJ0bDgxOHhfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvKQoreworCWNoYXIgY3VzdG9tW01BWF9DVVNUT01fTEVOXTsKKwljaGFyICpwOworCXN0cnVjdCBpd19ldmVudCBpd2U7CisJaW50IGksIGo7CisJdTggbWF4X3JhdGUsIHJhdGU7CisKKwkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCwgRVRIX0FMRU4pOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyNlbmRpZgorCisJLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLworCisJLyogQWRkIHRoZSBFU1NJRCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJLy9ZSixtb2RpZmllZCwwODA5MDMsZm9yIGhpZGRlbiBhcAorCS8vaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgeworCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA9PSAwKSB7CisJLy9ZSixtb2RpZmllZCwwODA5MDMsZW5kCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbmRpZgorCX0KKwkvL3ByaW50aygiRVNTSUQ6ICVzXG4iLG5ldHdvcmstPnNzaWQpOworCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLCBpZWVlODAyMTFfbW9kZXNbbmV0d29yay0+bW9kZV0pOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKKyNlbmRpZgorCisgICAgICAgIC8qIEFkZCBtb2RlICovCisgICAgICAgIGl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKyAgICAgICAgaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJgorCSAgICAoV0xBTl9DQVBBQklMSVRZX0JTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisjZW5kaWYKKwl9CisKKyAgICAgICAgLyogQWRkIGZyZXF1ZW5jeS9jaGFubmVsICovCisJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworLyoJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeShuZXR3b3JrLT5jaGFubmVsLCBuZXR3b3JrLT5tb2RlKTsKKwlpd2UudS5mcmVxLmUgPSAzOyAqLworCWl3ZS51LmZyZXEubSA9IG5ldHdvcmstPmNoYW5uZWw7CisJaXdlLnUuZnJlcS5lID0gMDsKKwlpd2UudS5mcmVxLmkgPSAwOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyNlbmRpZgorCisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZW5kaWYKKworCS8qIEFkZCBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgKi8KKwltYXhfcmF0ZSA9IDA7CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLCAiIFJhdGVzIChNYi9zKTogIik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47ICkgeworCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgorCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKKwkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7CisJCWVsc2UKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJfQorCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKKwkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisjZW5kaWYKKworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbmRpZgorCisJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCS8qIFRPRE86IEZpeCB0aGVzZSB2YWx1ZXMuLi4gKi8KKwlpZiAobmV0d29yay0+c3RhdHMuc2lnbmFsID09IDAgfHwgbmV0d29yay0+c3RhdHMucnNzaSA9PSAwKQorCXByaW50aygiPT09PT09PT0+c2lnbmFsOiVkLCByc3NpOiVkXG4iLCBuZXR3b3JrLT5zdGF0cy5zaWduYWwsIG5ldHdvcmstPnN0YXRzLnJzc2kpOworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKy8vCXByaW50aygiU0lHTkFMOiAlZCxSU1NJOiAlZCxOT0lTRTogJWRcbiIsbmV0d29yay0+c3RhdHMuc2lnbmFsLG5ldHdvcmstPnN0YXRzLnJzc2ksbmV0d29yay0+c3RhdHMubm9pc2UpOworCWl3ZS51LnF1YWwucXVhbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCWl3ZS51LnF1YWwubGV2ZWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJaXdlLnUucXVhbC51cGRhdGVkID0gNzsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisjZW5kaWYKKworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZW5kaWYKKworI2lmIDAKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKwkvLwlwcmludGsoIldQQSBJRVxuIik7CisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgIndwYV9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPndwYV9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+d3BhX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZW5kaWYKKwl9CisKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+cnNuX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKworCQl1OCAqcCA9IGJ1ZjsKKwkJcCArPSBzcHJpbnRmKHAsICJyc25faWU9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yc25faWVfbGVuOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIG5ldHdvcmstPnJzbl9pZVtpXSk7CisJCX0KKworCisjZWxzZQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgICAgICBpZiAobmV0d29yay0+d3BhX2llX2xlbikgeworCS8vCXByaW50aygid3BhX2llX2xlbjolZFxuIiwgbmV0d29yay0+d3BhX2llX2xlbik7CisgICAgICAgICAgICAgICAgY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIG5ldHdvcmstPndwYV9pZSwgbmV0d29yay0+d3BhX2llX2xlbik7CisgICAgICAgICAgICAgICAgaXdlLmNtZCA9IElXRVZHRU5JRTsKKyAgICAgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPndwYV9pZV9sZW47CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZWxzZQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGlmIChuZXR3b3JrLT5yc25faWVfbGVuKSB7CisJLy8JcHJpbnRrKCI9PT09PT5yc25faWVfbGVuOlxuIiwgbmV0d29yay0+cnNuX2llX2xlbik7CisJCSNpZiAwCisJCXsKKwkJCWludCBpOworCQkJZm9yIChpPTA7IGk8bmV0d29yay0+cnNuX2llX2xlbjsgaSsrKTsKKwkJCXByaW50aygiJTJ4ICIsIG5ldHdvcmstPnJzbl9pZVtpXSk7CisJCQlwcmludGsoIlxuIik7CisJCX0KKwkJI2VuZGlmCisgICAgICAgICAgICAgICAgY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIG5ldHdvcmstPnJzbl9pZSwgbmV0d29yay0+cnNuX2llX2xlbik7CisgICAgICAgICAgICAgICAgaXdlLmNtZCA9IElXRVZHRU5JRTsKKyAgICAgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPnJzbl9pZV9sZW47CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbmRpZgorCX0KKworI2VuZGlmCisKKwkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlwID0gY3VzdG9tOworCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCSAgICAgICIgTGFzdCBiZWFjb246ICVsdW1zIGFnbyIsIChqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbmRpZgorCisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKwljaGFyICpldiA9IGV4dHJhOworCWNoYXIgKnN0b3AgPSBldiArIHdycXUtPmRhdGEubGVuZ3RoOy8vSVdfU0NBTl9NQVhfREFUQTsKKwkvL2NoYXIgKnN0b3AgPSBldiArIElXX1NDQU5fTUFYX0RBVEE7CisJaW50IGkgPSAwOworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHZXR0aW5nIHNjYW5cbiIpOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKCFpZWVlLT5iSHdSYWRpb09mZikKKwl7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQkJaSsrOworCisJCQlpZigoc3RvcC1ldik8MjAwKQorCQkJeworCQkJCWVyciA9IC1FMkJJRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8CisJCQkgICAgdGltZV9hZnRlcihuZXR3b3JrLT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCisJCQl7CisJCQkJZXYgPSBydGw4MTh4X3RyYW5zbGF0ZV9zY2FuKGllZWUsIGV2LCBzdG9wLCBuZXR3b3JrLCBpbmZvKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlJRUVFODAyMTFfREVCVUdfU0NBTigKKwkJCQkJIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICgiCisJCQkJCU1BQ19GTVQgIiknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICAgICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCQkoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnd4X3NlbSk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBldiAtICBleHRyYTsKKwl3cnF1LT5kYXRhLmZsYWdzID0gMDsKKwlJRUVFODAyMTFfREVCVUdfV1goImV4aXQ6ICVkIG5ldHdvcmtzIHJldHVybmVkLlxuIiwgaSk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwCisJfTsKKwlpbnQgaSwga2V5LCBrZXlfcHJvdmlkZWQsIGxlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCUlFRUU4MDIxMV9ERUJVR19XWCgiU0VUX0VOQ09ERVxuIik7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCQlrZXlfcHJvdmlkZWQgPSAxOworCX0gZWxzZSB7CisJCWtleV9wcm92aWRlZCA9IDA7CisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKwl9CisKKwlJRUVFODAyMTFfREVCVUdfV1goIktleTogJWQgWyVzXVxuIiwga2V5LCBrZXlfcHJvdmlkZWQgPworCQkJICAgInByb3ZpZGVkIiA6ICJkZWZhdWx0Iik7CisKKwljcnlwdCA9ICZpZWVlLT5jcnlwdFtrZXldOworCisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJaWYgKGtleV9wcm92aWRlZCAmJiAqY3J5cHQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24gb24ga2V5ICVkLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJCX0gZWxzZQorCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOworCisJCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAorCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLworCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpIHsKKwkJCQlpZiAoa2V5X3Byb3ZpZGVkKQorCQkJCQlicmVhazsKKwkJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoCisJCQkJCWllZWUsICZpZWVlLT5jcnlwdFtpXSk7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSBXRVBfS0VZUykgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCX0KKworCQlnb3RvIGRvbmU7CisJfQorCisKKworCXNlYy5lbmFibGVkID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCisJICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgeworCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQorCQkgKiBvbiB0aGlzIGtleSAqLworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQkvKiB0YWtlIFdFUCBpbnRvIHVzZSAqLworCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7CisJCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQl9CisKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWxlbiA9IGVycS0+bGVuZ3RoIDw9IDUgPyA1IDogMTM7CisJCW1lbWNweShzZWMua2V5c1trZXldLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwkJaWYgKGxlbiA+IGVycS0+bGVuZ3RoKQorCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0gKyBlcnEtPmxlbmd0aCwgMCwKKwkJCSAgICAgICBsZW4gLSBlcnEtPmxlbmd0aCk7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gJyVzJyAoJWQ6JWQgYnl0ZXMpXG4iLAorCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCisJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CisJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKKyAJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgbGVuLCBOVUxMLAorCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CisJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOworCQkvKiBUaGlzIGVuc3VyZXMgYSBrZXkgd2lsbCBiZSBhY3RpdmF0ZWQgaWYgbm8ga2V5IGlzCisJCSAqIGV4cGxpY2l0ZWx5IHNldCAqLworCQlpZiAoa2V5ID09IHNlYy5hY3RpdmVfa2V5KQorCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7Ly9ieSB3YiAwODAzMTIKKwl9IGVsc2UgeworCQlsZW4gPSAoKmNyeXB0KS0+b3BzLT5nZXRfa2V5KHNlYy5rZXlzW2tleV0sIFdFUF9LRVlfTEVOLAorCQkJCQkgICAgIE5VTEwsICgqY3J5cHQpLT5wcml2KTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQkvKiBTZXQgYSBkZWZhdWx0IGtleSBvZiBhbGwgMCAqLworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQkJCSAgIGtleSk7CisJCQltZW1zZXQoc2VjLmtleXNba2V5XSwgMCwgMTMpOworCQkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCAxMywgTlVMTCwKKwkJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IDEzOworCQkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCX0KKworCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLworCQlpZiAoa2V5X3Byb3ZpZGVkKSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goCisJCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKwkJCXNlYy5hY3RpdmVfa2V5ID0ga2V5OworCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQl9CisJfQorCisgZG9uZToKKwlpZWVlLT5vcGVuX3dlcCA9ICEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKTsKKwlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOworCUlFRUU4MDIxMV9ERUJVR19XWCgiQXV0aDogJXNcbiIsIHNlYy5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gPworCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKKworCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgorCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJaW50IGxlbiwga2V5OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIkdFVF9FTkNPREVcbiIpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJfSBlbHNlCisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRba2V5XTsKKwllcnEtPmZsYWdzID0ga2V5ICsgMTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCkgeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIG9ubHkgV0VQIGlzIHN1cHBvcnRlZCB3aXRoIHdpcmVsZXNzIGV4dGVuc2lvbnMsIHNvIGp1c3QKKwkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkICovCisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShrZXlidWYsIFdFUF9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJZXJxLT5sZW5ndGggPSAobGVuID49IDAgPyBsZW4gOiAwKTsKKworCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisKKwlpZiAoaWVlZS0+b3Blbl93ZXApCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworICAgICAgICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgICAgIGludCBpLCBpZHgsIHJldCA9IDA7CisgICAgICAgIGludCBncm91cF9rZXkgPSAwOworICAgICAgICBjb25zdCBjaGFyICphbGcsICptb2R1bGU7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICB9OworCS8vcHJpbnRrKCI9PT09PT0+ZW5jb2RpbmcgZmxhZzoleCxleHQgZmxhZzoleCwgZXh0IGFsZzolZFxuIiwgZW5jb2RpbmctPmZsYWdzLGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CisgICAgICAgIGlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKyAgICAgICAgaWYgKGlkeCkgeworICAgICAgICAgICAgICAgIGlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWR4LS07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGlkeCA9IGllZWUtPnR4X2tleWlkeDsKKworICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworICAgICAgICAgICAgICAgIGNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisgICAgICAgICAgICAgICAgZ3JvdXBfa2V5ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzb21lIENpc2NvIEFQcyB1c2UgaWR4PjAgZm9yIHVuaWNhc3QgaW4gZHluYW1pYyBXRVAgKi8KKwkJLy9wcmludGsoIm5vdCBncm91cCBrZXksIGZsYWdzOiV4LCBleHQtPmFsZzolZFxuIiwgZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IDAgJiYgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHQgPSAmaWVlZS0+Y3J5cHRbaWR4XTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsvLyB8IFNFQ19FTkNSWVBUOworICAgICAgICBpZiAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgfHwKKyAgICAgICAgICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmICgqY3J5cHQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBXRVBfS0VZUykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jcnlwdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgfQorCQkvL3ByaW50aygiZGlzYWJsZWQ6IGZsYWc6JXhcbiIsIGVuY29kaW5nLT5mbGFncyk7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKwlzZWMuZW5hYmxlZCA9IDE7CisgICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOworI2lmIDAKKyAgICAgICAgaWYgKGdyb3VwX2tleSA/ICFpZWVlLT5ob3N0X21jX2RlY3J5cHQgOgorICAgICAgICAgICAgIShpZWVlLT5ob3N0X2VuY3J5cHQgfHwgaWVlZS0+aG9zdF9kZWNyeXB0IHx8CisgICAgICAgICAgICAgIGllZWUtPmhvc3RfZW5jcnlwdF9tc2R1KSkKKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfaG9zdF9jcnlwdDsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKGV4dC0+YWxnKSB7CisgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgYWxnID0gIldFUCI7CisgICAgICAgICAgICAgICAgbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF93ZXAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBhbGcgPSAiVEtJUCI7CisgICAgICAgICAgICAgICAgbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF90a2lwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgYWxnID0gIkNDTVAiOworICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfY2NtcCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorLy8JcHJpbnRrKCI4LTA5LTA4LTk9PT09PT4lcywgYWxnIG5hbWU6JXNcbiIsX19GVU5DVElPTl9fLCBhbGcpOworCisJIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworICAgICAgICBpZiAob3BzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0X21vZHVsZShtb2R1bGUpOworICAgICAgICAgICAgICAgIG9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworICAgICAgICB9CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7CisJCXByaW50aygiPT09PT09PT0+dW5rbm93biBjcnlwdG8gYWxnICVkXG4iLCBleHQtPmFsZyk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworICAgICAgICAgICAgICAgIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKyAgICAgICAgICAgICAgICBuZXdfY3J5cHQgPSBremFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdfY3J5cHQtPm9wcyA9IG9wczsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShuZXdfY3J5cHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNyeXB0ID0gbmV3X2NyeXB0OworCisgCX0KKworICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisgICAgICAgICAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoImtleSBzZXR0aW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyNpZiAxCisgLy9za2lwX2hvc3RfY3J5cHQ6CisJLy9wcmludGsoInNraXBfaG9zdF9jcnlwdDpleHRfZmxhZ3M6JXhcbiIsIGV4dC0+ZXh0X2ZsYWdzKTsKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisgICAgICAgICAgICAgICAgaWVlZS0+dHhfa2V5aWR4ID0gaWR4OworICAgICAgICAgICAgICAgIHNlYy5hY3RpdmVfa2V5ID0gaWR4OworICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc2VjLmtleXNbaWR4XSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgICAgICAgICAgICAgc2VjLmtleV9zaXplc1tpZHhdID0gZXh0LT5rZXlfbGVuOworICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSAoMSA8PCBpZHgpOworICAgICAgICAgICAgICAgIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19XRVA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1RLSVApIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAgc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBEb24ndCBzZXQgc2VjIGxldmVsIGZvciBncm91cCBrZXlzLiAqLworICAgICAgICAgICAgICAgIGlmIChncm91cF9rZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgJj0gflNFQ19MRVZFTDsKKyAgICAgICAgfQorI2VuZGlmCitkb25lOgorICAgICAgICBpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorICAgICAgICAgICAgICAgIGllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCisJIGlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKyAgICAgICAgICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorICAgICAgICAgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKyAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7Cit9CitpbnQgaWVlZTgwMjExX3d4X3NldF9tbG1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7CisvLwlwcmludGsoIlxuZGtnYWRmc2xrZGpnYWxza2RmPT09PT09PT09PT09PT09PiVzKCksIGNtZDoleFxuIiwgX19GVU5DVElPTl9fLCBtbG1lLT5jbWQpOworI2lmIDEKKwlzd2l0Y2ggKG1sbWUtPmNtZCkgeworICAgICAgICBjYXNlIElXX01MTUVfREVBVVRIOgorCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKKwkvLwlwcmludGsoImRpc2Fzc29jIG5vd1xuIik7CisJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CisJCWJyZWFrOworCSBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2F1dGgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworLyoKKwkgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisgICAgICAgICAgICAgICAgLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9CisqLworCS8vcHJpbnRrKCJzZXQgYXV0aDpmbGFnOiV4LCBkYXRhIHZhbHVlOiV4XG4iLCBkYXRhLT5mbGFncywgZGF0YS0+dmFsdWUpOworCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisgICAgICAgIGNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkgICAgIC8qbmVlZCB0byBzdXBwb3J0IHdwYTIgaGVyZSovCisJCS8vcHJpbnRrKCJ3cGEgdmVyc2lvbjoleFxuIiwgZGF0YS0+dmFsdWUpOworCQlicmVhazsKKyAgICAgICAgY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgICAgY2FzZSBJV19BVVRIX0tFWV9NR01UOgorICAgICAgICAgICAgICAgIC8qCisgKiAgICAgICAgICAgICAgICAgICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgdG8gY29udHJvbCB0aGVtIGludGVybmFsbHkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICAgICAgaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSBkYXRhLT52YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICAgICAgaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJaWVlZS0+b3Blbl93ZXAgPSAoZGF0YS0+dmFsdWUmSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pPzE6MDsKKwkJLy9wcmludGsoIm9wZW5fd2VwOiVkXG4iLCBpZWVlLT5vcGVuX3dlcCk7CisJCWJyZWFrOworCisjaWYgMQorCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJaWVlZS0+d3BhX2VuYWJsZWQgPSAoZGF0YS0+dmFsdWUpPzE6MDsKKwkJLy9wcmludGsoImVuYWxiZSB3cGE6JWRcbiIsIGllZWUtPndwYV9lbmFibGVkKTsKKwkJYnJlYWs7CisKKyNlbmRpZgorCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgICAgICBpZWVlLT5pZWVlODAyXzF4ID0gZGF0YS0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisJCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiAxCitpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbikKK3sKKyNpZiAwCisJcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXByaW50aygiJTJ4ICIsIGllW2ldJjB4ZmYpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJdTggKmJ1ZiA9IE5VTEw7CisKKwlpZiAobGVuPk1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpCisJeworCQlwcmludGsoInJldHVybiBlcnJvciBvdXQsIGxlbjolZFxuIiwgbGVuKTsKKwlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGVuKQorCXsKKwkJaWYgKGxlbiAhPSBpZVsxXSsyKXsKKwkJCXByaW50aygibGVuOiVkLCBpZTolZFxuIiwgbGVuLCBpZVsxXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkoYnVmLCBpZSwgbGVuKTsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gYnVmOworCQlpZWVlLT53cGFfaWVfbGVuID0gbGVuOworCX0KKwllbHNleworCQlpZiAoaWVlZS0+d3BhX2llKQorCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBOVUxMOworCQlpZWVlLT53cGFfaWVfbGVuID0gMDsKKwl9CisvLwlwcmludGsoIjw9PT09PW91dCAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIDA7CisKK30KKyNlbmRpZgorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2dlbl9pZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbWxtZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfYXV0aCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9lbmNvZGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMyMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaW50ZXJuYWwuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfQ1JZUFRPX0lOVEVSTkFMX0gKKyNkZWZpbmUgX0NSWVBUT19JTlRFUk5BTF9ICisKKworLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zb2Z0aXJxLmg+CisjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgaGVhZCwgbWVtYmVyKQkJCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCk7CQkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSwJXAorCQkgICAgIHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZF9yZXNjaGVkKHZvaWQpCit7CisJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCXNjaGVkdWxlKCk7CisJfQorfQorI2VuZGlmCisKK2V4dGVybiBlbnVtIGttX3R5cGUgY3J5cHRvX2ttX3R5cGVzW107CisKK3N0YXRpYyBpbmxpbmUgZW51bSBrbV90eXBlIGNyeXB0b19rbWFwX3R5cGUoaW50IG91dCkKK3sKKwlyZXR1cm4gY3J5cHRvX2ttX3R5cGVzWyhpbl9zb2Z0aXJxKCkgPyAyIDogMCkgKyBvdXRdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b19rbWFwKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3V0KQoreworCXJldHVybiBrbWFwX2F0b21pYyhwYWdlLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2t1bm1hcCh2b2lkICp2YWRkciwgaW50IG91dCkKK3sKKwlrdW5tYXBfYXRvbWljKHZhZGRyLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaWYgKCFpbl9zb2Z0aXJxKCkpCisJCWNvbmRfcmVzY2hlZCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuICh2b2lkICopJnRmbVsxXTsKK30KKworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworCisjaWZkZWYgQ09ORklHX0tNT0QKK3ZvaWQgY3J5cHRvX2FsZ19hdXRvbG9hZChjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKK2ludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCit7IH0KKyNlbmRpZgorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK2ludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKK3ZvaWQgY3J5cHRvX2V4aXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisjZW5kaWYJLyogX0NSWVBUT19JTlRFUk5BTF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL3J0bF9jcnlwdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQwY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gQ3J5cHRvYXBpLCBieSBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGZhc3Qubm8+CisgKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN6bCIbGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9MSU5VWF9DUllQVE9fSAorI2RlZmluZSBfTElOVVhfQ1JZUFRPX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNkZWZpbmUgY3J5cHRvX3JlZ2lzdGVyX2FsZyBjcnlwdG9fcmVnaXN0ZXJfYWxnX3J0bAorI2RlZmluZSBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcgY3J5cHRvX3VucmVnaXN0ZXJfYWxnX3J0bAorI2RlZmluZSBjcnlwdG9fYWxsb2NfdGZtIGNyeXB0b19hbGxvY190Zm1fcnRsCisjZGVmaW5lIGNyeXB0b19mcmVlX3RmbSBjcnlwdG9fZnJlZV90Zm1fcnRsCisjZGVmaW5lIGNyeXB0b19hbGdfYXZhaWxhYmxlIGNyeXB0b19hbGdfYXZhaWxhYmxlX3J0bAorCisvKgorICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KKyAqLworI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ESUdFU1QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDQKKworLyoKKyAqIFRyYW5zZm9ybSBtYXNrcyBhbmQgdmFsdWVzIChmb3IgY3J0X2ZsYWdzKS4KKyAqLworI2RlZmluZSBDUllQVE9fVEZNX01PREVfTUFTSwkJMHgwMDAwMDBmZgorI2RlZmluZSBDUllQVE9fVEZNX1JFUV9NQVNLCQkweDAwMGZmZjAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKKworI2RlZmluZSBDUllQVE9fVEZNX01PREVfRUNCCQkweDAwMDAwMDAxCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NGQgkJMHgwMDAwMDAwNAorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ1RSCQkweDAwMDAwMDA4CisKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4gICAJMHgwMDIwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEIAkweDAwNDAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4gCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0ZMQUdTIAkweDAxMDAwMDAwCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN0dWZmLgorICovCisjZGVmaW5lIENSWVBUT19VTlNQRUMJCQkwCisjZGVmaW5lIENSWVBUT19NQVhfQUxHX05BTUUJCTY0CisKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworLyoKKyAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKKyAqIHZpYSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCkgYW5kIGNyeXB0b191bnJlZ2lzdGVyX2FsZygpLgorICovCitzdHJ1Y3QgY2lwaGVyX2FsZyB7CisJdW5zaWduZWQgaW50IGNpYV9taW5fa2V5c2l6ZTsKKwl1bnNpZ25lZCBpbnQgY2lhX21heF9rZXlzaXplOworCWludCAoKmNpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKKwkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKKwl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworfTsKKworc3RydWN0IGRpZ2VzdF9hbGcgeworCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKKwl2b2lkICgqZGlhX2luaXQpKHZvaWQgKmN0eCk7CisJdm9pZCAoKmRpYV91cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOworCXZvaWQgKCpkaWFfZmluYWwpKHZvaWQgKmN0eCwgdTggKm91dCk7CisJaW50ICgqZGlhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworfTsKKworc3RydWN0IGNvbXByZXNzX2FsZyB7CisJaW50ICgqY29hX2luaXQpKHZvaWQgKmN0eCk7CisJdm9pZCAoKmNvYV9leGl0KSh2b2lkICpjdHgpOworCWludCAoKmNvYV9jb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CisJaW50ICgqY29hX2RlY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNyYV9jaXBoZXIJY3JhX3UuY2lwaGVyCisjZGVmaW5lIGNyYV9kaWdlc3QJY3JhX3UuZGlnZXN0CisjZGVmaW5lIGNyYV9jb21wcmVzcwljcmFfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKKwl1MzIgY3JhX2ZsYWdzOworCXVuc2lnbmVkIGludCBjcmFfYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBjcmFfY3R4c2l6ZTsKKwljb25zdCBjaGFyIGNyYV9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX2FsZyBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfYWxnIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX2FsZyBjb21wcmVzczsKKwl9IGNyYV91OworCisJc3RydWN0IG1vZHVsZSAqY3JhX21vZHVsZTsKK307CisKKy8qCisgKiBBbGdvcml0aG0gcmVnaXN0cmF0aW9uIGludGVyZmFjZS4KKyAqLworaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CitpbnQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOworCisvKgorICogQWxnb3JpdGhtIHF1ZXJ5IGludGVyZmFjZS4KKyAqLworaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncyk7CisKKy8qCisgKiBUcmFuc2Zvcm1zOiB1c2VyLWluc3RhbnRpYXRlZCBvYmplY3RzIHdoaWNoIGVuY2Fwc3VsYXRlIGFsZ29yaXRobXMKKyAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfdGZtKCkgYW5kCisgKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgorICovCitzdHJ1Y3QgY3J5cHRvX3RmbTsKKworc3RydWN0IGNpcGhlcl90Zm0geworCXZvaWQgKmNpdF9pdjsKKwl1bnNpZ25lZCBpbnQgY2l0X2l2c2l6ZTsKKwl1MzIgY2l0X21vZGU7CisJaW50ICgqY2l0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKKwlpbnQgKCpjaXRfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwlpbnQgKCpjaXRfZW5jcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOworCWludCAoKmNpdF9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9kZWNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJdm9pZCAoKmNpdF94b3JfYmxvY2spKHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworfTsKKworc3RydWN0IGRpZ2VzdF90Zm0geworCXZvaWQgKCpkaXRfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisJdm9pZCAoKmRpdF91cGRhdGUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOworCXZvaWQgKCpkaXRfZmluYWwpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpOworCXZvaWQgKCpkaXRfZGlnZXN0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKwlpbnQgKCpkaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQworCXZvaWQgKmRpdF9obWFjX2Jsb2NrOworI2VuZGlmCit9OworCitzdHJ1Y3QgY29tcHJlc3NfdGZtIHsKKwlpbnQgKCpjb3RfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CisJaW50ICgqY290X2RlY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworfTsKKworI2RlZmluZSBjcnRfY2lwaGVyCWNydF91LmNpcGhlcgorI2RlZmluZSBjcnRfZGlnZXN0CWNydF91LmRpZ2VzdAorI2RlZmluZSBjcnRfY29tcHJlc3MJY3J0X3UuY29tcHJlc3MKKworc3RydWN0IGNyeXB0b190Zm0geworCisJdTMyIGNydF9mbGFnczsKKworCXVuaW9uIHsKKwkJc3RydWN0IGNpcGhlcl90Zm0gY2lwaGVyOworCQlzdHJ1Y3QgZGlnZXN0X3RmbSBkaWdlc3Q7CisJCXN0cnVjdCBjb21wcmVzc190Zm0gY29tcHJlc3M7CisJfSBjcnRfdTsKKworCXN0cnVjdCBjcnlwdG9fYWxnICpfX2NydF9hbGc7Cit9OworCisvKgorICogVHJhbnNmb3JtIHVzZXIgaW50ZXJmYWNlLgorICovCisKKy8qCisgKiBjcnlwdG9fYWxsb2NfdGZtKCkgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGxvY2F0ZSBhbiBhbHJlYWR5IGxvYWRlZCBhbGdvcml0aG0uCisgKiBJZiB0aGF0IGZhaWxzIGFuZCB0aGUga2VybmVsIHN1cHBvcnRzIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMsIGl0CisgKiB3aWxsIHRoZW4gYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIG9mIHRoZSBzYW1lIG5hbWUgb3IgYWxpYXMuICBBIHJlZmNvdW50CisgKiBpcyBncmFiYmVkIG9uIHRoZSBhbGdvcml0aG0gd2hpY2ggaXMgdGhlbiBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyB0cmFuc2Zvcm0uCisgKgorICogY3J5cHRvX2ZyZWVfdGZtKCkgZnJlZXMgdXAgdGhlIHRyYW5zZm9ybSBhbmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLAorICogdGhlbiBkcm9wcyB0aGUgcmVmY291bnQgb24gdGhlIGFzc29jaWF0ZWQgYWxnb3JpdGhtLgorICovCitzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7Cit2b2lkIGNyeXB0b19mcmVlX3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKworLyoKKyAqIFRyYW5zZm9ybSBoZWxwZXJzIHdoaWNoIHF1ZXJ5IHRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobS4KKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19uYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfbmFtZTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19tb2RuYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCisJaWYgKGFsZy0+Y3JhX21vZHVsZSkKKwkJcmV0dXJuIGFsZy0+Y3JhX21vZHVsZS0+bmFtZTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19pdnNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYmxvY2tzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7Cit9CisKKy8qCisgKiBBUEkgd3JhcHBlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfaW5pdCh0Zm0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2cpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X3VwZGF0ZSh0Zm0sIHNnLCBuc2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9maW5hbCh0Zm0sIG91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2RpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfZGlnZXN0KHRmbSwgc2csIG5zZywgb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwlpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TWVM7CisJcmV0dXJuIHRmbS0+Y3J0X2RpZ2VzdC5kaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkodGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgc3JjLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJbWVtY3B5KGRzdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKKwlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2NvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfZGVjb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKK30KKworLyoKKyAqIEhNQUMgc3VwcG9ydC4KKyAqLworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQwordm9pZCBjcnlwdG9faG1hY19pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuKTsKK3ZvaWQgY3J5cHRvX2htYWNfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKK3ZvaWQgY3J5cHRvX2htYWNfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICprZXlsZW4sIHU4ICpvdXQpOwordm9pZCBjcnlwdG9faG1hYyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbiwKKyAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CisjZW5kaWYJLyogQ09ORklHX0NSWVBUT19ITUFDICovCisKKyNlbmRpZgkvKiBfTElOVVhfQ1JZUFRPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExX2NyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4YTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExX2NyeXB0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpZWVlODAyMTEgY3J5cHRvIG1vZHVsZS4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfQ1JZUFRfSAorI2RlZmluZSBJRUVFODAyMTFfQ1JZUFRfSAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGluaXQgbmV3IGNyeXB0byBjb250ZXh0IChlLmcuLCBhbGxvY2F0ZSBwcml2YXRlIGRhdGEgc3BhY2UsCisJICogc2VsZWN0IElWLCBldGMuKTsgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgb3IgcG9pbnRlciB0byBhbGxvY2F0ZWQKKwkgKiBwcml2YXRlIGRhdGEgb24gc3VjY2VzcyAqLworCXZvaWQgKiAoKmluaXQpKGludCBrZXlpZHgpOworCisJLyogZGVpbml0aWFsaXplIGNyeXB0byBjb250ZXh0IGFuZCBmcmVlIGFsbG9jYXRlZCBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICgqZGVpbml0KSh2b2lkICpwcml2KTsKKworCS8qIGVuY3J5cHQvZGVjcnlwdCByZXR1cm4gPCAwIG9uIGVycm9yIG9yID49IDAgb24gc3VjY2Vzcy4gVGhlIHJldHVybgorCSAqIHZhbHVlIGZyb20gZGVjcnlwdF9tcGR1IGlzIHBhc3NlZCBhcyB0aGUga2V5aWR4IHZhbHVlIGZvcgorCSAqIGRlY3J5cHRfbXNkdS4gc2tiIG11c3QgaGF2ZSBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tIGZvciB0aGUKKwkgKiBlbmNyeXB0aW9uOyBpZiBub3QsIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQ7IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKwkgKiBjYWxsZWQgZm9yIGFsbCBNUERVcyAoaS5lLiwgZnJhZ21lbnRzKS4KKwkgKi8KKwlpbnQgKCplbmNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKworCS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBmdWxsIE1TRFVzLCBpLmUuIGZ1bGwgZnJhbWVzLgorCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLworCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCisJCQkgICAgdm9pZCAqcHJpdik7CisKKwlpbnQgKCpzZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCWludCAoKmdldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisKKwkvKiBwcm9jZnMgaGFuZGxlciBmb3IgcHJpbnRpbmcgb3V0IGtleSBpbmZvcm1hdGlvbiBhbmQgcG9zc2libGUKKwkgKiBzdGF0aXN0aWNzICovCisJY2hhciAqICgqcHJpbnRfc3RhdHMpKGNoYXIgKnAsIHZvaWQgKnByaXYpOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgYnkgZW5jcnlwdGlvbjsgZW5jcnlwdCBidWYgaXMKKwkgKiBhbGxvY2F0ZWQgd2l0aCBleHRyYV9wcmVmaXhfbGVuIGJ5dGVzLCBjb3B5IG9mIGluX2J1ZiwgYW5kCisJICogZXh0cmFfcG9zdGZpeF9sZW47IGVuY3J5cHQgbmVlZCBub3QgdXNlIGFsbCB0aGlzIHNwYWNlLCBidXQKKwkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCBjb3JyZWN0CisJICogbGVuZ3RoIG11c3QgYmUgcmV0dXJuZWQgKi8KKwlpbnQgZXh0cmFfcHJlZml4X2xlbiwgZXh0cmFfcG9zdGZpeF9sZW47CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBkZWxheWVkIGRlbGV0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwl2b2lkICpwcml2OworCWF0b21pY190IHJlZmNudDsKK307CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitpbnQgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqLCBpbnQpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIxNWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCkBAIC0wLDAgKzEsNzYxIEBACisvKgorICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaWZuZGVmIFI4MTgwSAorI2RlZmluZSBSODE4MEgKKworCisjZGVmaW5lIFJUTDgxODBfTU9EVUxFX05BTUUgInJ0bDgxODAiCisjZGVmaW5lIERNRVNHKHgsYS4uLikgcHJpbnRrKEtFUk5fSU5GTyBSVEw4MTgwX01PRFVMRV9OQU1FICI6ICIgeCAiXG4iLCAjIyBhKQorI2RlZmluZSBETUVTR1coeCxhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFJUTDgxODBfTU9EVUxFX05BTUUgIjogV1c6IiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHRSh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBFRToiIHggIlxuIiwgIyMgYSkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkvL2ZvciBydG5sX2xvY2soKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8vIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPGFzbS9pby5oPgorLy8jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjZGVmaW5lIEVQUk9NXzkzYzQ2IDAKKyNkZWZpbmUgRVBST01fOTNjNTYgMQorCisjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCisKKyNkZWZpbmUgREVGQVVMVF9GUkFHX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKy8vI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDJVCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAwVQorI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBERUZBVUxUX0JFQUNPTklOVEVSVkFMIDB4NjRVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0VTU0lEICJSdGw4MTgwIgorCisjZGVmaW5lIERFRkFVTFRfU1NJRCAiIgorI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3CisjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3CisjZGVmaW5lIFBSSVNNX0hEUl9TSVpFIDY0CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKworI2RlZmluZSBNR05UX1FVRVVFCQkJCQkJMAorI2RlZmluZSBCS19RVUVVRQkJCQkJCTEKKyNkZWZpbmUgQkVfUVVFVUUJCQkJCQkyCisjZGVmaW5lIFZJX1FVRVVFCQkJCQkJMworI2RlZmluZSBWT19RVUVVRQkJCQkJCTQKKyNkZWZpbmUgSElHSF9RVUVVRQkJCQkJCTUKKyNkZWZpbmUgQkVBQ09OX1FVRVVFCQkJCQk2CisKKyNkZWZpbmUgTE9XX1FVRVVFCQkJCQkJQkVfUVVFVUUKKyNkZWZpbmUgTk9STUFMX1FVRVVFCQkJCQlNR05UX1FVRVVFCisKKyNkZWZpbmUgYVNpZnNUaW1lIAkxMAorCisjZGVmaW5lIHNDcmNMbmcgICAgICAgICA0CisjZGVmaW5lIHNBY2tDdHNMbmcJMTEyCQkvLyBiaXRzIGluIEFDSyBhbmQgQ1RTIGZyYW1lcworLy8rYnkgYW15IDA4MDMxMgorI2RlZmluZSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRAkzMDAKKwordHlwZWRlZiBlbnVtIF9XSVJFTEVTU19NT0RFIHsKKwlXSVJFTEVTU19NT0RFX1VOS05PV04gPSAweDAwLAorCVdJUkVMRVNTX01PREVfQSA9IDB4MDEsCisJV0lSRUxFU1NfTU9ERV9CID0gMHgwMiwKKwlXSVJFTEVTU19NT0RFX0cgPSAweDA0LAorCVdJUkVMRVNTX01PREVfQVVUTyA9IDB4MDgsCit9IFdJUkVMRVNTX01PREU7CisKK3R5cGVkZWYgZW51bSBfVkVSU0lPTl84MTg1eworCS8vIFJUTDgxODUKKwlWRVJTSU9OXzgxODVfVU5LTk9XTiwKKwlWRVJTSU9OXzgxODVfQywgLy8gQy1jdXQKKwlWRVJTSU9OXzgxODVfRCwgLy8gRC1jdXQKKwkvLyBSVEw4MTg1QgorCVZFUlNJT05fODE4NUJfQiwgLy8gQi1jdXQKKwlWRVJTSU9OXzgxODVCX0QsIC8vIEQtY3V0CisJVkVSU0lPTl84MTg1Ql9FLCAvLyBFLWN1dAorCS8vUlRMODE4N1MtUENJRQorCVZFUlNJT05fODE4N1NfQiwgLy8gQi1jdXQKKwlWRVJTSU9OXzgxODdTX0MsIC8vIEMtY3V0CisJVkVSU0lPTl84MTg3U19ELCAvLyBELWN1dAorCit9VkVSU0lPTl84MTg1LCpQVkVSU0lPTl84MTg1OwordHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKKwl1MTYgU0lGU19UaW1lcjsKKwl1MTYgRElGU19UaW1lcjsKKwl1MTYgU2xvdFRpbWVUaW1lcjsKKwl1MTYgRUlGU19UaW1lcjsKKwl1MTYgQ1dtaW5JbmRleDsKKwl1MTYgQ1dtYXhJbmRleDsKK30qUENIQU5ORUxfQUNDRVNTX1NFVFRJTkcsQ0hBTk5FTF9BQ0NFU1NfU0VUVElORzsKKwordHlwZWRlZiBlbnVteworICAgICAgICBOSUNfODE4NSA9IDEsCisgICAgICAgIE5JQ184MTg1QgorICAgICAgICB9IG5pY190OworCit0eXBlZGVmIHUzMiBBQ19DT0RJTkc7CisjZGVmaW5lIEFDMF9CRQkwCQkvLyBBQ0k6IDB4MDAJLy8gQmVzdCBFZmZvcnQKKyNkZWZpbmUgQUMxX0JLCTEJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCisjZGVmaW5lIEFDMl9WSQkyCQkvLyBBQ0k6IDB4MTAJLy8gVmlkZW8KKyNkZWZpbmUgQUMzX1ZPCTMJCS8vIEFDSTogMHgxMQkvLyBWb2ljZQorI2RlZmluZSBBQ19NQVgJNAkJLy8gTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsIGVudW0uCisKKy8vCisvLyBFQ1dtaW4vRUNXbWF4IGZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgorLy8KK3R5cGVkZWYJdW5pb24gX0VDV3sKKwl1OAljaGFyRGF0YTsKKwlzdHJ1Y3QKKwl7CisJCXU4CUVDV21pbjo0OworCQl1OAlFQ1dtYXg6NDsKKwl9ZjsJLy8gRmllbGQKK31FQ1csICpQRUNXOworCisvLworLy8gQUNJL0FJRlNOIEZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorLy8KK3R5cGVkZWYJdW5pb24gX0FDSV9BSUZTTnsKKwl1OAljaGFyRGF0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJQUlGU046NDsKKwkJdTgJQUNNOjE7CisJCXU4CUFDSToyOworCQl1OAlSZXNlcnZlZDoxOworCX1mOwkvLyBGaWVsZAorfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047CisKKy8vCisvLyBBQyBQYXJhbWV0ZXJzIFJlY29yZCBGb3JtYXQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisvLwordHlwZWRlZgl1bmlvbiBfQUNfUEFSQU17CisJdTMyCWxvbmdEYXRhOworCXU4CWNoYXJEYXRhWzRdOworCisJc3RydWN0CisJeworCQlBQ0lfQUlGU04JQWNpQWlmc247CisJCUVDVwkJRWN3OworCQl1MTYJCVRYT1BMaW1pdDsKKwl9ZjsJLy8gRmllbGQKK31BQ19QQVJBTSwgKlBBQ19QQVJBTTsKKworLyogaXQgaXMgYSB3cm9uZyBkZWZpbml0aW9uLiAteGlvbmctMjAwNi0xMS0xNwordHlwZWRlZiBzdHJ1Y3QgVGhyZWVXaXJlUmVnIHsKKwl1MTYJbG9uZ0RhdGE7CisJc3RydWN0IHsKKwkJdTgJZW5hYmxlQjsKKwkJdTgJZGF0YTsKKwkJdTgJY2xrOworCQl1OAlyZWFkX3dyaXRlOworCX0gc3RydWM7Cit9IFRocmVlV2lyZVJlZzsKKyovCisKK3R5cGVkZWYJdW5pb24gX1RocmVlV2lyZXsKKwlzdHJ1Y3QgX1RocmVlV2lyZVN0cnVjeworCQl1MTYJCWRhdGE6MTsKKwkJdTE2CQljbGs6MTsKKwkJdTE2CQllbmFibGVCOjE7CisJCXUxNgkJcmVhZF93cml0ZToxOworCQl1MTYJCXJlc3YxOjEyOworLy8JCXUyQnl0ZQlyZXN2MjoxNDsKKy8vCQl1MkJ5dGUJVGhyZWVXaXJlRW5hYmxlOjE7CisvLwkJdTJCeXRlCXJlc3YzOjE7CisJfXN0cnVjOworCXUxNgkJCWxvbmdEYXRhOworfVRocmVlV2lyZVJlZzsKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGJ1ZmZlcgoreworCXN0cnVjdCBidWZmZXIgKm5leHQ7CisJdTMyICpidWY7CisJZG1hX2FkZHJfdCBkbWE7Cit9IGJ1ZmZlcjsKKworLy9ZSixtb2RpZmllZCwwODA4MjgKK3R5cGVkZWYgc3RydWN0IFN0YXRzCit7CisJdW5zaWduZWQgbG9uZyB0eHJkdTsKKwl1bnNpZ25lZCBsb25nIHJ4cmR1OworCXVuc2lnbmVkIGxvbmcgcnhub2xhc3Q7CisJdW5zaWduZWQgbG9uZyByeG5vZGF0YTsKKy8vCXVuc2lnbmVkIGxvbmcgcnhyZXNldDsKKy8vCXVuc2lnbmVkIGxvbmcgcnh3cmthcm91bmQ7CisJdW5zaWduZWQgbG9uZyByeG5vcG9pbnRlcjsKKwl1bnNpZ25lZCBsb25nIHR4bnBlcnI7CisJdW5zaWduZWQgbG9uZyB0eHJlc3VtZWQ7CisJdW5zaWduZWQgbG9uZyByeGVycjsKKwl1bnNpZ25lZCBsb25nIHJ4b3ZlcmZsb3c7CisJdW5zaWduZWQgbG9uZyByeGludDsKKwl1bnNpZ25lZCBsb25nIHR4Ymtwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJlcG9raW5nOworCXVuc2lnbmVkIGxvbmcgdHhia3BlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlcGVycjsKKwl1bnNpZ25lZCBsb25nIHR4bnBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4aHBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4aHBlcnI7CisJdW5zaWduZWQgbG9uZyBpbnRzOworCXVuc2lnbmVkIGxvbmcgc2hpbnRzOworCXVuc2lnbmVkIGxvbmcgdHhvdmVyZmxvdzsKKwl1bnNpZ25lZCBsb25nIHJ4ZG1hZmFpbDsKKwl1bnNpZ25lZCBsb25nIHR4YmVhY29uOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CisJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGxwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhyZXRyeTsvL3JldHJ5IG51bWJlciAgdG9ueSAyMDA2MDYwMQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaW47Ly9jcmMgZXJyb3IgKDAtNTAwKQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtaWQ7Ly9jcmMgZXJyb3IgKDUwMC0xMDAwKQorCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtYXg7Ly9jcmMgZXJyb3IgKD4xMDAwKQorCXVuc2lnbmVkIGxvbmcgcnhpY3ZlcnI7Ly9JQ1YgZXJyb3IKK30gU3RhdHM7CisKKyNkZWZpbmUgTUFYX0xEX1NMT1RfTlVNIDEwCisjZGVmaW5lIEtFRVBfQUxJVkVfSU5URVJWQUwgCQkJCTIwIC8vIGluIHNlY29uZHMuCisjZGVmaW5lIENIRUNLX0ZPUl9IQU5HX1BFUklPRAkJCTIgLy9iZSBlcXVhbCB0byB3YXRjaGRvZyBjaGVjayB0aW1lCisjZGVmaW5lIERFRkFVTFRfS0VFUF9BTElWRV9MRVZFTAkJCTEKKyNkZWZpbmUgREVGQVVMVF9TTE9UX05VTQkJCQkJMgorI2RlZmluZSBQT1dFUl9QUk9GSUxFX0FDCQkJCQkwCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQkFUVEVSWQkJCTEKKwordHlwZWRlZiBzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QKK3sKKwl1MzIJCQkJUnhGcmFtZU51bVtNQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggRnJhbWUgLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MTYJCQkJU2xvdE51bTsJLy8gbnVtYmVyIG9mIENoZWNrRm9ySGFuZyBwZXJpb2QgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzLCBkZWZhdWx0IGlzIDIKKwl1MTYJCQkJU2xvdEluZGV4OworCisJdTMyCQkJCU51bVR4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCB0cmFuc21pdHRlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCisJdTMyCQkJCU51bVJ4T2tJblBlcmlvZDsgIC8vbnVtYmVyIG9mIHBhY2tldCByZWNlaXZlZCBkdXJpbmcgQ2hlY2tGb3JIYW5nCisKKwl1OAkJCQlJZGxlQ291bnQ7ICAgICAvLyAoS0VFUF9BTElWRV9JTlRFUlZBTCAvIENIRUNLX0ZPUl9IQU5HX1BFUklPRCkKKwl1MzIJCQkJTGFzdE51bVR4VW5pY2FzdDsKKwl1MzIJCQkJTGFzdE51bVJ4VW5pY2FzdDsKKworCWJvb2wJCQkJYkJ1c3lUcmFmZmljOyAgICAvL3doZW4gaXQgaXMgc2V0IHRvIDEsIFVJIGNhbm4ndCBzY2FuIGF0IHdpbGwuCit9bGlua19kZXRlY3RfdCwgKnBsaW5rX2RldGVjdF90OworCisvL1lKLG1vZGlmaWVkLDA4MDgyOCxlbmQKKworLy9ieSBhbXkgZm9yIGxlZAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTEVEIGN1c3RvbWl6YXRpb24uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYJZW51bSBfTEVEX1NUUkFURUdZXzgxODV7CisJU1dfTEVEX01PREUwLCAvLworCVNXX0xFRF9NT0RFMSwgLy8KKwlIV19MRUQsIC8vIEhXIGNvbnRyb2wgMiBMRURzLCBMRUQwIGFuZCBMRUQxICh0aGVyZSBhcmUgNCBkaWZmZXJlbnQgY29udHJvbCBtb2RlcykKK31MRURfU1RSQVRFR1lfODE4NSwgKlBMRURfU1RSQVRFR1lfODE4NTsKKy8vYnkgYW15IGZvciBsZWQKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCit0eXBlZGVmCWVudW0gX0xFRF9DVExfTU9ERXsKKwlMRURfQ1RMX1BPV0VSX09OID0gMSwKKwlMRURfQ1RMX0xJTksgPSAyLAorCUxFRF9DVExfTk9fTElOSyA9IDMsCisJTEVEX0NUTF9UWCA9IDQsCisJTEVEX0NUTF9SWCA9IDUsCisJTEVEX0NUTF9TSVRFX1NVUlZFWSA9IDYsCisJTEVEX0NUTF9QT1dFUl9PRkYgPSA3Cit9TEVEX0NUTF9NT0RFOworCit0eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCit7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9UlRfUkZfUE9XRVJfU1RBVEU7CisKK2VudW0JX1JlYXNvbkNvZGV7CisJdW5zcGVjX3JlYXNvbgk9IDB4MSwKKwlhdXRoX25vdF92YWxpZAk9IDB4MiwKKwlkZWF1dGhfbHZfc3MJPSAweDMsCisJaW5hY3Rpdml0eQkJPSAweDQsCisJYXBfb3ZlcmxvYWQJCT0gMHg1LAorCWNsYXNzMl9lcnIJCT0gMHg2LAorCWNsYXNzM19lcnIJCT0gMHg3LAorCWRpc2FzX2x2X3NzCQk9IDB4OCwKKwlhc29jX25vdF9hdXRoCT0gMHg5LAorCisJLy8tLS0tTUlDX0NIRUNLCisJbWljX2ZhaWx1cmUJCT0gMHhlLAorCS8vLS0tLUVORCBNSUNfQ0hFQ0sKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LgorCWludmFsaWRfSUUJCT0gMHgwZCwKKwlmb3VyX3dheV90bW91dAk9IDB4MGYsCisJdHdvX3dheV90bW91dAk9IDB4MTAsCisJSUVfZGlzbWF0Y2gJCT0gMHgxMSwKKwlpbnZhbGlkX0djaXBoZXIJPSAweDEyLAorCWludmFsaWRfUGNpcGhlcgk9IDB4MTMsCisJaW52YWxpZF9BS01QCT0gMHgxNCwKKwl1bnN1cF9SU05JRXZlciA9IDB4MTUsCisJaW52YWxpZF9SU05JRQk9IDB4MTYsCisJYXV0aF84MDJfMXhfZmFpbD0gMHgxNywKKwljaXBlcl9yZWplY3QJCT0gMHgxOCwKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0xNS4KKwlRb1NfdW5zcGVjCQk9IDB4MjAsCS8vIDMyCisJUUFQX2JhbmR3aWR0aAk9IDB4MjEsCS8vIDMzCisJcG9vcl9jb25kaXRpb24JPSAweDIyLAkvLyAzNAorCW5vX2ZhY2lsaXR5CQk9IDB4MjMsCS8vIDM1CisJCQkJCQkJLy8gV2hlcmUgaXMgMzY/Pz8KKwlyZXFfZGVjbGluZWQJPSAweDI1LAkvLyAzNworCWludmFsaWRfcGFyYW0JPSAweDI2LAkvLyAzOAorCXJlcV9ub3RfaG9ub3JlZD0gMHgyNywJLy8gMzkKKwlUU19ub3RfY3JlYXRlZAk9IDB4MkYsCS8vIDQ3CisJRExfbm90X2FsbG93ZWQJPSAweDMwLAkvLyA0OAorCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwJLy8gNDkKKwlkZXN0X25vdF9RU1RBCT0gMHgzMiwJLy8gNTAKK307Cit0eXBlZGVmCWVudW0gX1JUX1BTX01PREUKK3sKKwllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCisJZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KKwllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KK31SVF9QU19NT0RFOworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3R5cGVkZWYgc3RydWN0IHI4MTgwX3ByaXYKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXNob3J0IGVwcm9tdHlwZTsKKwlpbnQgaXJxOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CisKKyAgICAgICAgc2hvcnQgY2FyZF84MTg1OyAvKiBPOiBydGw4MTgwLCAxOnJ0bDgxODUgViBCL0MsIDI6cnRsODE4NSBWIEQsIDM6cnRsODE4NUIgKi8KKwlzaG9ydCBjYXJkXzgxODVfQnZlcnNpb247IC8qIGlmIFRDUiByZXBvcnRzIGNhcmQgViBCL0MgdGhpcyBkaXNjcmltaW5hdGVzICovCisJc2hvcnQgcGh5X3ZlcjsgLyogbWVhbmluZ2Z1bCBmb3IgcnRsODIyNSAxOkEgMjpCIDM6QyAqLworCXNob3J0IGVuYWJsZV9ncGlvMDsKKwllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0IvKnJ0bDgxODcqL31jYXJkX3R5cGU7CisJc2hvcnQgaHdfcGxjcF9sZW47CisJc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOyAvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKKworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJc3BpbmxvY2tfdCBpcnFfdGhfbG9jazsKKwlzcGlubG9ja190IHR4X2xvY2s7CisJc3BpbmxvY2tfdCBwc19sb2NrOworCXNwaW5sb2NrX3QgcmZfcHNfbG9jazsKKworCXUxNiBpcnFfbWFzazsKKwlzaG9ydCBpcnFfZW5hYmxlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNob3J0IGNoYW47CisJc2hvcnQgc2VuczsKKwlzaG9ydCBtYXhfc2VuczsKKwl1OCBjaHR4cHdyWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwl1OCBjaHR4cHdyX29mZG1bMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorCS8vdTggY2hhbGxvd1sxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisJdTggY2hhbm5lbF9wbGFuOyAgLy8gaXQncyB0aGUgY2hhbm5lbCBwbGFuIGluZGV4CisJc2hvcnQgdXA7CisJc2hvcnQgY3JjbW9uOyAvL2lmIDEgYWxsb3cgYmFkIGNyYyBmcmFtZSByZWNlcHRpb24gaW4gbW9uaXRvciBtb2RlCisJc2hvcnQgcHJpc21faGRyOworCisJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90aW1lcjsKKwkvKnNob3J0IHNjYW5wZW5kaW5nOworCXNob3J0IHN0b3BzY2FuOyovCisJc3BpbmxvY2tfdCBzY2FuX2xvY2s7CisJdTggYWN0aXZlX3Byb2JlOworCS8vdTggYWN0aXZlX3NjYW5fbnVtOworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgcmZfc3RhdGU7CisJc2hvcnQgaHdfd2VwOworCisJc2hvcnQgZGlncGh5OworCXNob3J0IGFudGI7CisJc2hvcnQgZGl2ZXJzaXR5OworCXU4IGNzX3RyZXNob2xkOworCXNob3J0IHJjcl9jc2Vuc2U7CisJc2hvcnQgcmZfY2hpcDsKKwl1MzIga2V5MFs0XTsKKwlzaG9ydCAoKnJmX3NldF9zZW5zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IHNlbnMpOworCXZvaWQgKCpyZl9zZXRfY2hhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJmX3NsZWVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfd2FrZXVwKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwkvL3Nob3J0IHJhdGU7CisJc2hvcnQgcHJvbWlzYzsKKwkvKnN0YXRzKi8KKwlzdHJ1Y3QgU3RhdHMgc3RhdHM7CisJc3RydWN0IF9saW5rX2RldGVjdF90IGxpbmtfZGV0ZWN0OyAgLy9ZSixhZGQsMDgwODI4CisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldjsKKworCS8qUlggc3R1ZmYqLworCXUzMiAqcnhyaW5nOworCXUzMiAqcnhyaW5ndGFpbDsKKwlkbWFfYWRkcl90IHJ4cmluZ2RtYTsKKwlzdHJ1Y3QgYnVmZmVyICpyeGJ1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyICpyeGJ1ZmZlcmhlYWQ7CisJaW50IHJ4cmluZ2NvdW50OworCXUxNiByeGJ1ZmZlcnNpemU7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCisJc2hvcnQgcnhfc2tiX2NvbXBsZXRlOworCisJdTMyIHJ4X3ByZXZsZW47CisKKwkvKlRYIHN0dWZmKi8KKy8qCisJdTMyICp0eGxwcmluZzsKKwl1MzIgKnR4aHByaW5nOworCXUzMiAqdHhucHJpbmc7CisJZG1hX2FkZHJfdCB0eGxwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4aHByaW5nZG1hOworCWRtYV9hZGRyX3QgdHhucHJpbmdkbWE7CisJdTMyICp0eGxwcmluZ3RhaWw7CisJdTMyICp0eGhwcmluZ3RhaWw7CisJdTMyICp0eG5wcmluZ3RhaWw7CisJdTMyICp0eGxwcmluZ2hlYWQ7CisJdTMyICp0eGhwcmluZ2hlYWQ7CisJdTMyICp0eG5wcmluZ2hlYWQ7CisJc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhucGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhscGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmc3RhaWw7CisqLworCXUzMiAqdHhtYXByaW5nOworCXUzMiAqdHhia3ByaW5nOworCXUzMiAqdHhiZXByaW5nOworCXUzMiAqdHh2aXByaW5nOworCXUzMiAqdHh2b3ByaW5nOworCXUzMiAqdHhocHJpbmc7CisJZG1hX2FkZHJfdCB0eG1hcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGJrcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGJlcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eHZpcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eHZvcHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eGhwcmluZ2RtYTsKKwl1MzIgKnR4bWFwcmluZ3RhaWw7CisJdTMyICp0eGJrcHJpbmd0YWlsOworCXUzMiAqdHhiZXByaW5ndGFpbDsKKwl1MzIgKnR4dmlwcmluZ3RhaWw7CisJdTMyICp0eHZvcHJpbmd0YWlsOworCXUzMiAqdHhocHJpbmd0YWlsOworCXUzMiAqdHhtYXByaW5naGVhZDsKKwl1MzIgKnR4YmtwcmluZ2hlYWQ7CisJdTMyICp0eGJlcHJpbmdoZWFkOworCXUzMiAqdHh2aXByaW5naGVhZDsKKwl1MzIgKnR4dm9wcmluZ2hlYWQ7CisJdTMyICp0eGhwcmluZ2hlYWQ7CisJc3RydWN0IGJ1ZmZlciAqdHhtYXBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmtwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHh2aXBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4dm9wYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eG1hcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4YmtwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhiZXBidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eHZpcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4dm9wYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnN0YWlsOworCisJaW50IHR4cmluZ2NvdW50OworCWludCB0eGJ1ZmZzaXplOworCS8vc3RydWN0IHR4X3BlbmRpbmdidWYgdHhucF9wZW5kaW5nOworCS8vc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90eF90YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKKwl1OCBkbWFfcG9sbF9tYXNrOworCS8vc2hvcnQgdHhfc3VzcGVuZDsKKworCS8qIGFkaG9jL21hc3RlciBtb2RlIHN0dWZmICovCisJdTMyICp0eGJlYWNvbnJpbmd0YWlsOworCWRtYV9hZGRyX3QgdHhiZWFjb25yaW5nZG1hOworCXUzMiAqdHhiZWFjb25yaW5nOworCWludCB0eGJlYWNvbmNvdW50OworCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlYWNvbmJ1ZnN0YWlsOworCS8vY2hhciAqbWFzdGVyX2Vzc2lkOworCS8vdTE2IG1hc3Rlcl9iZWFjb25pbnRlcnZhbDsKKwkvL3UzMiBtYXN0ZXJfYmVhY29uc2l6ZTsKKwkvL3UxNiBiZWFjb25faW50ZXJ2YWw7CisKKwl1OCByZXRyeV9kYXRhOworCXU4IHJldHJ5X3J0czsKKwl1MTYgcnRzOworCisvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJdTgJIFJlZ1RocmVlV2lyZU1vZGU7IC8vIFNlZSAiVGhyZWUgd2lyZSBtb2RlIiBkZWZpbmVkIGFib3ZlLCAyMDA2LjA1LjMxLCBieSByY25qa28uCisKKy8vYnkgYW15IGZvciBsZWQKKwlMRURfU1RSQVRFR1lfODE4NSBMZWRTdHJhdGVneTsKKy8vYnkgYW15IGZvciBsZWQKKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaF9kb2dfdGltZXI7CisJYm9vbCBiSW5hY3RpdmVQczsKKwlib29sIGJTd1JmUHJvY2Vzc2luZzsKKwlSVF9SRl9QT1dFUl9TVEFURQllSW5hY3RpdmVQb3dlclN0YXRlOworCVJUX1JGX1BPV0VSX1NUQVRFIGVSRlBvd2VyU3RhdGU7CisJdTMyIFJmT2ZmUmVhc29uOworCWJvb2wgUkZDaGFuZ2VJblByb2dyZXNzOworCWJvb2wgYkluSGN0VGVzdDsKKwlib29sIFNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7CisJdTggICBSRlByb2dUeXBlOworCWJvb2wgYkxlaXN1cmVQczsKKwlSVF9QU19NT0RFIGRvdDExUG93ZXJTYXZlTW9kZTsKKwkvL3UzMiBOdW1SeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4CisJLy91MzIgTnVtVHhPa0luUGVyaW9kOyAgIC8vWUosZGVsLDA4MDgyOAorCXU4ICAgVHhQb2xsaW5nVGltZXM7CisKKwlib29sCWJBcEJ1Zk91ckZyYW1lOy8vIFRSVUUgaWYgQVAgYnVmZmVyIG91ciB1bmljYXN0IGRhdGEgLCB3ZSB3aWxsIGtlZXAgZUF3YWtlIHVudGlsbCByZWNlaXZlIGRhdGEgb3IgdGltZW91dC4KKwl1OAlXYWl0QnVmRGF0YUJjbkNvdW50OworCXU4CVdhaXRCdWZEYXRhVGltZU91dDsKKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJdTggRUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5OworCWJvb2wgRUVQUk9NRGVmYXVsdEFudGVubmExOworCXU4IFJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbTsKKwlib29sIGJTd0FudGVubmFEaXZlcml0eTsKKwl1OCBSZWdEZWZhdWx0QW50ZW5uYTsKKwlib29sIGJEZWZhdWx0QW50ZW5uYTE7CisJdTggU2lnbmFsU3RyZW5ndGg7CisJbG9uZyBTdGF0c19TaWduYWxTdHJlbmd0aDsKKwlsb25nIExhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudDsgLy8gSW4gcGVyY2VudGFuZ2UsIHVzZWQgZm9yIHNtb290aGluZywgZS5nLiBNb3ZpbmcgQXZlcmFnZS4KKwl1OAkgU2lnbmFsUXVhbGl0eTsgLy8gaW4gMC0xMDAgaW5kZXguCisJbG9uZyBTdGF0c19TaWduYWxRdWFsaXR5OworCWxvbmcgUmVjdlNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisJbG9uZyBTdGF0c19SZWN2U2lnbmFsUG93ZXI7CisJdTgJIExhc3RSeFBrdEFudGVubmE7CS8vICtieSBhbXkgMDgwMzEyIEFudGVubiB3aGljaCByZWNlaXZlZCB0aGUgbGFzdGVkIHBhY2tldC4gMDogQXV4LCAxOk1haW4uIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjI1LgorCXUzMiBBZFJ4T2tDbnQ7CisJbG9uZyBBZFJ4U2lnbmFsU3RyZW5ndGg7CisJdTggQ3VyckFudGVubmFJbmRleDsJCQkvLyBJbmRleCB0byBjdXJyZW50IEFudGVubmEgKGJvdGggVHggYW5kIFJ4KS4KKwl1OCBBZFRpY2tDb3VudDsJCQkJLy8gVGltZXMgb2YgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgaGFwcGVuZWQuCisJdTggQWRDaGVja1BlcmlvZDsJCQkJLy8gIyBvZiBwZXJpb2QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIgdG8gY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBTVyBBbnRlbm5hIERpdmVyc2l0eS4KKwl1OCBBZE1pbkNoZWNrUGVyaW9kOwkJCS8vIE1pbiB2YWx1ZSBvZiBBZENoZWNrUGVyaW9kLgorCXU4IEFkTWF4Q2hlY2tQZXJpb2Q7CQkJLy8gTWF4IHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCisJbG9uZyBBZFJ4U3NUaHJlc2hvbGQ7CQkJLy8gU2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCB0byBzd2l0Y2ggYW50ZW5uYS4KKwlsb25nIEFkTWF4UnhTc1RocmVzaG9sZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRSeFNzVGhyZXNob2xkLgorCWJvb2wgYkFkU3dpdGNoZWRDaGVja2luZzsJCS8vIFRSVUUgaWYgd2Ugc2hhbGwgc2hhbGwgY2hlY2sgUnggc2lnbmFsIHN0cmVuZ3RoIGZvciBsYXN0IHRpbWUgc3dpdGNoaW5nIGFudGVubmEuCisJbG9uZyBBZFJ4U3NCZWZvcmVTd2l0Y2hlZDsJCS8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBiZWZvcmUgd2Ugc3dpdGhlZCBhbnRlbm5hLgorCXN0cnVjdCB0aW1lcl9saXN0IFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyOworLy9ieSBhbXkgZm9yIGFudGVubmEKKy8ve2J5IGFteSAwODAzMTIKKy8vCisJLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KKwkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKwkvLworCWJvb2wJCWJYdGFsQ2FsaWJyYXRpb247IC8vIENyeXN0YWwgY2FsaWJyYXRpb24uCisJdTgJCQlYdGFsQ2FsX1hpbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluLiAwfjcuNXBGCisJdTgJCQlYdGFsQ2FsX1hvdXQ7IC8vIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhvdXQuIDB+Ny41cEYKKwkvLworCS8vIFR4IHBvd2VyIHRyYWNraW5nIHdpdGggdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJYm9vbAkJYlR4UG93ZXJUcmFjazsgLy8gVHggUG93ZXIgdHJhY2tpbmcuCisJdTgJCQlUaGVybWFsTWV0ZXI7IC8vIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGluZGljYXRpb24uCisJLy8KKwkvLyBEeW5hbWljIEluaXRpYWwgR2FpbiBBZGp1c3RtZW50IE1lY2hhbmlzbS4gQWRkZWQgYnkgQnJ1Y2UsIDIwMDctMDItMTQuCisJLy8KKwlib29sCQkJCWJEaWdNZWNoYW5pc207IC8vIFRSVUUgaWYgRElHIGlzIGVuYWJsZWQsIEZBTFNFIG93LgorCWJvb2wJCQkJYlJlZ0hpZ2hQb3dlck1lY2hhbmlzbTsgLy8gRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiAwNjEwMTAsIGJ5IHJjbmprby4KKwl1MzIJCQkJCUZhbHNlQWxhcm1SZWdWYWx1ZTsKKwl1OAkJCQkJUmVnRGlnT2ZkbUZhVXBUaDsgLy8gVXBwZXIgdGhyZWhvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMgdXNlZCBpbiBESUcuCisJdTgJCQkJCURJR19OdW1iZXJGYWxsYmFja1ZvdGU7CisJdTgJCQkJCURJR19OdW1iZXJVcGdyYWRlVm90ZTsKKwkvLyBGb3IgSFcgYW50ZW5uYSBkaXZlcnNpdHksIGFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjMwLgorCXUzMgkJCUFkTWFpbkFudGVubmFSeE9rQ250OwkJLy8gTWFpbiBhbnRlbm5hIFJ4IE9LIGNvdW50LgorCXUzMgkJCUFkQXV4QW50ZW5uYVJ4T2tDbnQ7CQkvLyBBdXggYW50ZW5uYSBSeCBPSyBjb3VudC4KKwlib29sCQliSFdBZFN3aXRjaGVkOwkJCQkvLyBUUlVFIGlmIHdlIGhhcyBzd2l0Y2hlZCBkZWZhdWx0IGFudGVubmEgYnkgSFcgZXZhbHVhdGlvbi4KKwkvLyBSRiBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIHRocmVzaG9sZC4KKwl1OAkJCQkJUmVnSGlQd3JVcHBlclRoOworCXU4CQkJCQlSZWdIaVB3ckxvd2VyVGg7CisJLy8gUkYgUlNTSSBIaWdoIFBvd2VyIHVwcGVyL2xvd2VyIFRocmVzaG9sZC4KKwl1OAkJCQkJUmVnUlNTSUhpUHdyVXBwZXJUaDsKKwl1OAkJCQkJUmVnUlNTSUhpUHdyTG93ZXJUaDsKKwkvLyBDdXJyZW50IENDSyBSU1NJIHZhbHVlIHRvIGRldGVybWluZSBDQ0sgaGlnaCBwb3dlciwgYXNrZWQgYnkgU0QzIERaLCBieSBCcnVjZSwgMjAwNy0wNC0xMi4KKwl1OAkJCUN1ckNDS1JTU0k7CisJYm9vbCAgICAgICAgYkN1ckNDS1BrdDsKKwkvLworCS8vIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLiBBZGRlZCBieSBhbXksIDA4MDMxMi4KKwkvLworCWJvb2wJCQkJCWJUb1VwZGF0ZVR4UHdyOworCWxvbmcJCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRTUzsKKwlsb25nCQkJCQlVbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlcjsKKwl1OAkJCQkJCVJTU0k7CisJY2hhcgkJCQkJUnhQb3dlcjsKKwkgdTggSW5pdGlhbEdhaW47CisJIC8vRm9yIGFkanVzdCBEaWcgVGhyZXNoaG9sZCBkdXJpbmcgTGVnYWN5L0xlaXN1cmUgUG93ZXIgU2F2ZSBNb2RlCisJdTMyCQkJCURvemVQZXJpb2RJblBhc3QyU2VjOworCSAvLyBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgorCXU4CQkJCQlJbml0aWFsR2FpbkJhY2tVcDsKKwkgdTggUmVnQk1vZGVHYWluU3RhZ2U7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIHN0cnVjdCB0aW1lcl9saXN0IHJhdGVhZGFwdGVyX3RpbWVyOworCXUzMiAgICBSYXRlQWRhcHRpdmVQZXJpb2Q7CisJYm9vbCAgIGJFbmhhbmNlVHhQd3I7CisJYm9vbCAgIGJVcGRhdGVBUkZSOworCWludAkgICBGb3JjZWREYXRhUmF0ZTsgLy8gRm9yY2UgRGF0YSBSYXRlLiAwOiBBdXRvLCAweDAyOiAxTSB+IDB4NkM6IDU0TS4pCisJdTMyICAgICBOdW1UeFVuaWNhc3Q7IC8vWUosYWRkLDA4MDgyOCxmb3Iga2VlcCBhbGl2ZQorCXU4ICAgICAga2VlcEFsaXZlTGV2ZWw7IC8vWUosYWRkLDA4MDgyOCxmb3IgS2VlcEFsaXZlCisJdW5zaWduZWQgbG9uZyAJTnVtVHhPa1RvdGFsOworCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeUNudDsKKyAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RSZXRyeVJhdGU7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTGFzdFR4b2tDbnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RSeG9rQ250OworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5Q250OworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBMYXN0VHhPS0J5dGVzOworCXVuc2lnbmVkIGxvbmcgCQkgICAgTnVtVHhPa0J5dGVzVG90YWw7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0RmFpbFR4UmF0ZTsKKyAgICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlU1M7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsVHhSYXRlQ291bnQ7CisgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0VHhUaHJvdWdocHV0OworICAgICAgICAvL2ZvciB1cCByYXRlCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIGJUcnl1cGluZzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJUeFJhdGU7ICAgICAvL3RoZSByYXRlIGJlZm9yZSB1cAorICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclJldHJ5UmF0ZTsKKyAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeXVwaW5nQ291bnQ7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnlEb3duQ291bnRMb3dEYXRhOworICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudE5vRGF0YTsKKworICAgICAgICB1OCAgICAgICAgICAgICAgICAgIEN1cnJlbnRPcGVyYVJhdGU7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorLy8Jc2hvcnQgd3FfaHVycnl1cDsKKy8vCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaF9kb2dfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2lycV93cTsKKwlzaG9ydCBhY2tfdHhfdG9faWVlZTsKKworCXU4IFBvd2VyUHJvZmlsZTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwl1MzIgQ1NNZXRob2Q7CisJdTggY2NrX3R4cHdyX2Jhc2U7CisJdTggb2ZkbV90eHB3cl9iYXNlOworCXU4IGRtYV9wb2xsX3N0b3BfbWFzazsKKworCS8vdTggUmVnVGhyZWVXaXJlTW9kZTsKKwl1OCBNV0lFbmFibGU7CisJdTE2IFNob3J0UmV0cnlMaW1pdDsKKwl1MTYgTG9uZ1JldHJ5TGltaXQ7CisJdTE2IEVhcmx5UnhUaHJlc2hvbGQ7CisJdTMyIFRyYW5zbWl0Q29uZmlnOworCXUzMiBSZWNlaXZlQ29uZmlnOworCXUzMiBJbnRyTWFzazsKKworCXN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgIENoYW5uZWxBY2Nlc3NTZXR0aW5nOworI2VuZGlmCit9cjgxODBfcHJpdjsKKworI2RlZmluZSBNQU5BR0VfUFJJT1JJVFkgMAorI2RlZmluZSBCS19QUklPUklUWSAxCisjZGVmaW5lIEJFX1BSSU9SSVRZIDIKKyNkZWZpbmUgVklfUFJJT1JJVFkgMworI2RlZmluZSBWT19QUklPUklUWSA0CisjZGVmaW5lIEhJX1BSSU9SSVRZIDUKKyNkZWZpbmUgQkVBQ09OX1BSSU9SSVRZIDYKKworI2RlZmluZSBMT1dfUFJJT1JJVFkgVklfUFJJT1JJVFkKKyNkZWZpbmUgTk9STV9QUklPUklUWSBWT19QUklPUklUWQorLy9BQzJRdWV1ZSBtYXBwaW5nCisjZGVmaW5lIEFDMlEoX2FjKSAoKChfYWMpID09IFdNRV9BQ19WTykgPyBWT19QUklPUklUWSA6IFwKKwkJKChfYWMpID09IFdNRV9BQ19WSSkgPyBWSV9QUklPUklUWSA6IFwKKwkJKChfYWMpID09IFdNRV9BQ19CSykgPyBCS19QUklPUklUWSA6IFwKKwkJQkVfUFJJT1JJVFkpCisKK3Nob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCogc2tidWYsIGludCBsZW4saW50IHByaW9yaXR5LAorCXNob3J0IG1vcmVmcmFnLHNob3J0IGZyYWdkZXNjLGludCByYXRlKTsKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpIDsKK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTggeSk7Cit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUxNiB5KTsKK3ZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUzMiB5KTsKK3ZvaWQgZm9yY2VfcGNpX3Bvc3Rpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgcnRsODE4MF9ydHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE4MF9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHJ0bDgxODBfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTgwX3N0YXJ0X3NjYW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3N0YXJ0X3NjYW5uaW5nX3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc3RvcF9zY2FubmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9kaXNhc3NvY2lhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgZml4X3J4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc2V0X2FuYXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGEpOwordm9pZCBydGw4MTg1X3NldF9hbmFwYXJhbTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxODBfc2V0X2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9ub19od193ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBydGw4MTgwX0JTU19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfYmVhY29uX3J4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfY29udHR4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb250dHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTgwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcnRsODE4MF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgxODBfc2V0X21hc3Rlcl9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGNoYXIgKmVzc2lkKTsKK3ZvaWQgcnRsODE4MF91cGRhdGVfYmVhY29uX3NlY3VyaXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB3cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1OCBkYXRhKTsKK3ZvaWQgd3JpdGVfcGh5X2NjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgd3JpdGVfcGh5X29mZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Cit2b2lkIHJ0bDgxODVfdHhfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhbnQpOwordm9pZCBydGw4MTg1X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJQlNTX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJUFNFbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgSVBTTGVhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSk7Cit2b2lkIFVwZGF0ZUluaXRpYWxHYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworYm9vbCBTZXRBbnRlbm5hQ29uZmlnODdTRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAgRGVmYXVsdEFudCwgYm9vbCBiQW50RGl2ZXJzaXR5KTsKKworLy8jaWZkZWYgQ09ORklHX1JUTDgxODVCCit2b2lkIHJ0bDgxODViX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODViX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4NWJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTg1Yl9pcnFfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZml4X3R4X2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorLy8jZW5kaWYKK2Jvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBTdGF0ZVRvU2V0LCB1MzIgQ2hhbmdlU291cmNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NzExZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgY2FyZCBlZXByb20gKDkzYzQ2IG9yIDkzYzU2KSBwcm9ncmFtbWluZyByb3V0aW5lcywKKyAgIG1lbW9yeSBpcyBhZGRyZXNzZWQgYnkgMTYgYml0cyB3b3Jkcy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiCisKK3ZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQoreworCWlmKGJpdCkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCQkgICAgICAgKDE8PEVQUk9NX0NTX1NISUZUKSB8IFwKKwkJCSAgICAgICByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKSk7IC8vZW5hYmxlIEVQUk9NCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fQ1NfU0hJRlQpKTsgLy9kaXNhYmxlIEVQUk9NCisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKwordm9pZCBlcHJvbV9ja19jeWNsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKDE8PEVQUk9NX0NLX1NISUZUKSB8IHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpICZ+ICgxPDxFUFJPTV9DS19TSElGVCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCit2b2lkIGVwcm9tX3coc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBiaXQpCit7CisJaWYoYml0KQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgKDE8PEVQUk9NX1dfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRCkpOworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGUoZGV2LEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fV19TSElGVCkpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3Nob3J0IGVwcm9tX3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBiaXQ7CisKKwliaXQ9KHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpICYgKDE8PEVQUk9NX1JfU0hJRlQpICk7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKworCWlmKGJpdCkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBlcHJvbV9zZW5kX2JpdHNfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGJbXSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8bGVuOyBpKyspeworCQllcHJvbV93KGRldiwgYltpXSk7CisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJfQorfQorCisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCByZWFkX2NtZFtdPXsxLDEsMH07CisJc2hvcnQgYWRkcl9zdHJbOF07CisJaW50IGk7CisJaW50IGFkZHJfbGVuOworCXUzMiByZXQ7CisKKwlyZXQ9MDsKKyAgICAgICAgLy9lbmFibGUgRVBST00gcHJvZ3JhbW1pbmcKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfUFJPR1JBTTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYgKHByaXYtPmVwcm9tdHlwZT09RVBST01fOTNjNTYpeworCQlhZGRyX3N0cls3XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNl09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbNV09YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw2KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw3KTsKKwkJYWRkcl9sZW49ODsKKwl9ZWxzZXsKKwkJYWRkcl9zdHJbNV09YWRkciAmIDE7CisJCWFkZHJfc3RyWzRdPWFkZHIgJiAoMTw8MSk7CisJCWFkZHJfc3RyWzNdPWFkZHIgJiAoMTw8Mik7CisJCWFkZHJfc3RyWzJdPWFkZHIgJiAoMTw8Myk7CisJCWFkZHJfc3RyWzFdPWFkZHIgJiAoMTw8NCk7CisJCWFkZHJfc3RyWzBdPWFkZHIgJiAoMTw8NSk7CisJCWFkZHJfbGVuPTY7CisJfQorCWVwcm9tX2NzKGRldiwgMSk7CisJZXByb21fY2tfY3ljbGUoZGV2KTsKKwllcHJvbV9zZW5kX2JpdHNfc3RyaW5nKGRldiwgcmVhZF9jbWQsIDMpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCBhZGRyX3N0ciwgYWRkcl9sZW4pOworCisJLy9rZWVwIGNoaXAgcGluIEQgdG8gbG93IHN0YXRlIHdoaWxlIHJlYWRpbmcuCisJLy9JJ20gdW5zdXJlIGlmIGl0IGlzIG5lY2Vzc2FyeSwgYnV0IGFueXdheSBzaG91bGRuJ3QgaHVydAorCWVwcm9tX3coZGV2LCAwKTsKKworCWZvcihpPTA7aTwxNjtpKyspeworCQkvL2VlcHJvbSBuZWVkcyBhIGNsayBjeWNsZSBiZXR3ZWVuIHdyaXRpbmcgb3Bjb2RlJmFkcgorCQkvL2FuZCByZWFkaW5nIGRhdGEuIChlZXByb20gb3V0cyBhIGR1bW15IDApCisJCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJCXJldCB8PSAoZXByb21fcihkZXYpPDwoMTUtaSkpOworCX0KKworCWVwcm9tX2NzKGRldiwgMCk7CisJZXByb21fY2tfY3ljbGUoZGV2KTsKKworCS8vZGlzYWJsZSBFUFJPTSBwcm9ncmFtbWluZworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9OT1JNQUw8PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCkpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwXzkzY3g2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyOGE1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaApAQCAtMCwwICsxLDU5IEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLypUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMqLworLyptZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IFdPUkRTKi8KKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKworI2RlZmluZSBFUFJPTV9ERUxBWSAxMAorCisjZGVmaW5lIEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCAweGQKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkhXT1JEIDB4ZQorCisjZGVmaW5lIFJGQ0hJUElEIDB4NgorI2RlZmluZQlSRkNISVBJRF9JTlRFUlNJTCAxCisjZGVmaW5lCVJGQ0hJUElEX1JGTUQgMgorI2RlZmluZQlSRkNISVBJRF9QSElMSVBTIDMKKyNkZWZpbmUJUkZDSElQSURfTUFYSU0gNAorI2RlZmluZQlSRkNISVBJRF9HQ1QgNQorI2RlZmluZSBSRkNISVBJRF9SVEw4MjI1IDkKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgUkZfWkVCUkEyIDExCisjZGVmaW5lIEVQUk9NX1RYUFdfQkFTRSAweDA1CisjZGVmaW5lIFJGX1pFQlJBNCAxMgorI2VuZGlmCisjZGVmaW5lIFJGQ0hJUElEX1JUTDgyNTUgMHhhCisjZGVmaW5lIFJGX1BBUkFNIDB4MTkKKyNkZWZpbmUgUkZfUEFSQU1fRElHUEhZX1NISUZUIDAKKyNkZWZpbmUgUkZfUEFSQU1fQU5UQkRFRkFVTFRfU0hJRlQgMQorI2RlZmluZSBSRl9QQVJBTV9DQVJSSUVSU0VOU0VfU0hJRlQgMgorI2RlZmluZSBSRl9QQVJBTV9DQVJSSUVSU0VOU0VfTUFTSyAoMzw8MikKKyNkZWZpbmUgRU5FUkdZX1RSRVNIT0xEIDB4MTcKKyNkZWZpbmUgRVBST01fVkVSU0lPTiAweDFFCisjZGVmaW5lIE1BQ19BRFIgMHg3CisKKyNkZWZpbmUgQ0lTIDB4MTgKKworI2RlZmluZQlFUFJPTV9UWFBXX09GRE1fQ0gxXzIgMHgyMAorCisvLyNkZWZpbmUJRVBST01fVFhQV19DSDFfMiAweDEwCisjZGVmaW5lICBFUFJPTV9UWFBXX0NIMV8yIDB4MzAKKyNkZWZpbmUJRVBST01fVFhQV19DSDNfNCAweDExCisjZGVmaW5lCUVQUk9NX1RYUFdfQ0g1XzYgMHgxMgorI2RlZmluZQlFUFJPTV9UWFBXX0NIN184IDB4MTMKKyNkZWZpbmUJRVBST01fVFhQV19DSDlfMTAgMHgxNAorI2RlZmluZQlFUFJPTV9UWFBXX0NIMTFfMTIgMHgxNQorI2RlZmluZQlFUFJPTV9UWFBXX0NIMTNfMTQgMHgxNgorCit1MzIgZXByb21fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhZGRyKTsgLy9yZWFkcyBhIDE2IGJpdHMgd29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGY0ZGY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC0wLDAgKzEsNjgyOCBAQAorLyoKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTh4IHBjaSBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4xCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwKKyAgIFJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgUGFydHMgb2YgQkIvUkYgY29kZSBhcmUgZGVyaXZlZCBmcm9tIERhdmlkIFlvdW5nIHJ0bDgxODAgbmV0YnNkIGRyaXZlci4KKworICAgUlNTSSBjYWxjIGZ1bmN0aW9uIGZyb20gJ1RoZSBEZXVjZScKKworICAgU29tZSBpZGVhcyBib3Jyb3dlZCBmcm9tIHRoZSA4MTM5dG9vLmMgZHJpdmVyIGluY2x1ZGVkIGluIGxpbnV4IGtlcm5lbC4KKworICAgV2UgKEk/KSB3YW50IHRvIHRoYW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWNzIGFuZCBhbHNvIHRoZQorICAgTmRpc3dyYXBwZXIncyBwcm9qZWN0IEF1dGhvcnMuCisKKyAgIEEgYmlnIGJpZyB0aGFua3MgZ29lcyBhbHNvIHRvIFJlYWx0ZWsgY29ycC4gZm9yIHRoZWlyIGhlbHAgaW4gbXkgYXR0ZW1wdCB0bworICAgYWRkIFJUTDgxODUgYW5kIFJUTDgyMjUgc3VwcG9ydCwgYW5kIHRvIERhdmlkIFlvdW5nIGFsc28uCisqLworCisjaWYgMAorZG91YmxlIF9fZmxvYXRzaWRmIChpbnQgaSkgeyByZXR1cm4gaTsgfQordW5zaWduZWQgaW50IF9fZml4dW5zZGZzaSAoZG91YmxlIGQpIHsgcmV0dXJuIGQ7IH0KK2RvdWJsZSBfX2FkZGRmMyhkb3VibGUgYSwgZG91YmxlIGIpIHsgcmV0dXJuIGErYjsgfQorZG91YmxlIF9fYWRkc2YzKGZsb2F0IGEsIGZsb2F0IGIpIHsgcmV0dXJuIGErYjsgfQorZG91YmxlIF9fc3ViZGYzKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYS1iOyB9Citkb3VibGUgX19leHRlbmRzZmRmMihmbG9hdCBhKSB7cmV0dXJuIGE7fQorI2VuZGlmCisKKworI3VuZGVmIERFQlVHX1RYX0RFU0MyCisjdW5kZWYgUlhfRE9OVF9QQVNTX1VMCisjdW5kZWYgREVCVUdfRVBST00KKyN1bmRlZiBERUJVR19SWF9WRVJCT1NFCisjdW5kZWYgRFVNTVlfUlgKKyN1bmRlZiBERUJVR19aRVJPX1JYCisjdW5kZWYgREVCVUdfUlhfU0tCCisjdW5kZWYgREVCVUdfVFhfRlJBRworI3VuZGVmIERFQlVHX1JYX0ZSQUcKKyN1bmRlZiBERUJVR19UWF9GSUxMREVTQworI3VuZGVmIERFQlVHX1RYCisjdW5kZWYgREVCVUdfSVJRCisjdW5kZWYgREVCVUdfUlgKKyN1bmRlZiBERUJVR19SWEFMTE9DCisjdW5kZWYgREVCVUdfUkVHSVNURVJTCisjdW5kZWYgREVCVUdfUklORworI3VuZGVmIERFQlVHX0lSUV9UQVNLTEVUCisjdW5kZWYgREVCVUdfVFhfQUxMT0MKKyN1bmRlZiBERUJVR19UWF9ERVNDCisKKy8vI2RlZmluZSBERUJVR19UWAorLy8jZGVmaW5lIERFQlVHX1RYX0RFU0MyCisvLyNkZWZpbmUgREVCVUdfUlgKKy8vI2RlZmluZSBERUJVR19SWF9TS0IKKworLy8jZGVmaW5lIENPTkZJR19SVEw4MTgwX0lPX01BUAorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisvLyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorLy8jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfc2EyNDAwLmgiICAvKiBQSElMSVBTIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfbWF4MjgyMC5oIiAvKiBNQVhJTSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX2djdC5oIiAgICAgLyogR0NUIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODIyNS5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfcnRsODI1NS5oIiAvKiBSVEw4MjU1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIgICAvKiBDYXJkIEVFUFJPTSAqLworI2luY2x1ZGUgInI4MTgwX3d4LmgiCisjaW5jbHVkZSAicjgxODBfZG0uaCIKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisjaW5jbHVkZSAicjgxODBfcG0uaCIKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKy8vI2RlZmluZSBDT05GSUdfUlRMODE4MF9JT19NQVAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQkVMS0lOCisJI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JFTEtJTiAweDE3OTkKKyNlbmRpZgorI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0RMSU5LCisJI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RMSU5LIDB4MTE4NgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4MTgwX3BjaV9pZF90YmxbXSBfX2RldmluaXRkYXRhID0geworICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfUkVBTFRFSywKKy8vICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDgxODAsCisgICAgICAgICAgICAgICAgLmRldmljZSA9IDB4ODE5OSwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAwLAorICAgICAgICB9LAorI2lmIDAKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0JFTEtJTiwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHg2MDAxLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDEsCisgICAgICAgIH0sCisgICAgICAgIHsgICAgICAgLyogQmVsa2luIEY1RDYwMjAgdjMgKi8KKwkgICAgICAgIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0JFTEtJTiwKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHg2MDIwLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDIsCisgICAgICAgIH0sCisgICAgICAgIHsgICAgICAgLyogRC1MaW5rIERXTC02MTAgKi8KKyAgICAgICAgICAgICAgICAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ETElOSywKKyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHgzMzAwLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDMsCisgICAgICAgIH0sCisJeworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAorCQkuZGV2aWNlID0gMHg4MTg1LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IDQsCisJfSwKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZlbmRvciA9IDAsCisgICAgICAgICAgICAgICAgLmRldmljZSA9IDAsCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IDAsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IDAsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMCwKKyAgICAgICAgfQorfTsKKworCitzdGF0aWMgY2hhciogaWZuYW1lID0gIndsYW4lZCI7CitzdGF0aWMgaW50IGh3c2VxbnVtID0gMDsKKy8vc3RhdGljIGNoYXIqIGlmbmFtZSA9ICJhdGglZCI7CitzdGF0aWMgaW50IGh3d2VwID0gMDsKK3N0YXRpYyBpbnQgY2hhbm5lbHMgPSAweDNmZmY7CisKKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnRsODE4MF9wY2lfaWRfdGJsKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxODAgLyBSVEw4MTg1IFdpRmkgY2FyZHMiKTsKKworCisKKy8qCitNT0RVTEVfUEFSTShpZm5hbWUsICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKGRldm5hbWUsIiBOZXQgaW50ZXJmYWNlIG5hbWUsIHdsYW4lZD1kZWZhdWx0Iik7CisKK01PRFVMRV9QQVJNKGh3c2VxbnVtLCJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGh3c2VxbnVtLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSA4MDIuMTEgaGVhZGVyIHNlcXVlbmNlIG51bWJlcnMuIFplcm89ZGVmYXVsdCIpOworCitNT0RVTEVfUEFSTShod3dlcCwiaSIpOworTU9EVUxFX1BBUk1fREVTQyhod3dlcCwiIFRyeSB0byB1c2UgaGFyZHdhcmUgV0VQIHN1cHBvcnQuIFN0aWxsIGJyb2tlbiBhbmQgbm90IGF2YWlsYWJsZSBvbiBhbGwgY2FyZHMiKTsKKworTU9EVUxFX1BBUk0oY2hhbm5lbHMsImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsIiBDaGFubmVsIGJpdG1hc2sgZm9yIHNwZWNpZmljIGxvY2FsZXMuIE5ZSSIpOworKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCA5KQorbW9kdWxlX3BhcmFtKGlmbmFtZSwgY2hhcnAsIFNfSVJVR098U19JV1VTUiApOworbW9kdWxlX3BhcmFtKGh3c2VxbnVtLGludCwgU19JUlVHT3xTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShod3dlcCxpbnQsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oY2hhbm5lbHMsaW50LCBTX0lSVUdPfFNfSVdVU1IpOworI2Vsc2UKK01PRFVMRV9QQVJNKGlmbmFtZSwgInMiKTsKK01PRFVMRV9QQVJNKGh3c2VxbnVtLCJpIik7CitNT0RVTEVfUEFSTShod3dlcCwiaSIpOworTU9EVUxFX1BBUk0oY2hhbm5lbHMsImkiKTsKKyNlbmRpZgorCitNT0RVTEVfUEFSTV9ERVNDKGRldm5hbWUsIiBOZXQgaW50ZXJmYWNlIG5hbWUsIHdsYW4lZD1kZWZhdWx0Iik7CisvL01PRFVMRV9QQVJNX0RFU0MoZGV2bmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgYXRoJWQ9ZGVmYXVsdCIpOworTU9EVUxFX1BBUk1fREVTQyhod3NlcW51bSwiIFRyeSB0byB1c2UgaGFyZHdhcmUgODAyLjExIGhlYWRlciBzZXF1ZW5jZSBudW1iZXJzLiBaZXJvPWRlZmF1bHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHd3ZXAsIiBUcnkgdG8gdXNlIGhhcmR3YXJlIFdFUCBzdXBwb3J0LiBTdGlsbCBicm9rZW4gYW5kIG5vdCBhdmFpbGFibGUgb24gYWxsIGNhcmRzIik7CitNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxzLCIgQ2hhbm5lbCBiaXRtYXNrIGZvciBzcGVjaWZpYyBsb2NhbGVzLiBOWUkiKTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTgwX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxODBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK3N0YXRpYyB2b2lkIHJ0bDgxODBfc2h1dGRvd24gKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJZGV2LT5zdG9wKGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnRsODE4MF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IFJUTDgxODBfTU9EVUxFX05BTUUsCSAgICAgICAgICAvKiBEcml2ZXIgbmFtZSAgICovCisJLmlkX3RhYmxlCT0gcnRsODE4MF9wY2lfaWRfdGJsLAkgICAgICAgICAgLyogUENJX0lEIHRhYmxlICAqLworCS5wcm9iZQkJPSBydGw4MTgwX3BjaV9wcm9iZSwJICAgICAgICAgIC8qIHByb2JlIGZuICAgICAgKi8KKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0bDgxODBfcGNpX3JlbW92ZSksLyogcmVtb3ZlIGZuICAgICAqLworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisJLnN1c3BlbmQJPSBydGw4MTgwX3N1c3BlbmQsCSAgICAgICAgICAvKiBQTSBzdXNwZW5kIGZuICovCisJLnJlc3VtZQkJPSBydGw4MTgwX3Jlc3VtZSwgICAgICAgICAgICAgICAgIC8qIFBNIHJlc3VtZSBmbiAgKi8KKyNlbHNlCisJLnN1c3BlbmQJPSBOVUxMLAkJCSAgICAgICAgICAvKiBQTSBzdXNwZW5kIGZuICovCisJLnJlc3VtZSAgICAgIAk9IE5VTEwsCQkJICAgICAgICAgIC8qIFBNIHJlc3VtZSBmbiAgKi8KKyNlbmRpZgorCS5zaHV0ZG93bgk9IHJ0bDgxODBfc2h1dGRvd24sCit9OworCisKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gMHhmZiZpbmIoZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiBpbmwoZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTggeSkKK3sKKyAgICAgICAgb3V0Yih5JjB4ZmYsZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUxNiB5KQoreworICAgICAgICBvdXR3KHksZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MzIgeSkKK3sKKyAgICAgICAgb3V0bCh5LGRldi0+YmFzZV9hZGRyICt4KTsKK30KKworI2Vsc2UgLyogUlRMX0lPX01BUCAqLworCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gMHhmZiZyZWFkYigodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKK30KKwordTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gcmVhZGwoKHU4KilkZXYtPm1lbV9zdGFydCAreCk7Cit9CisKK3UxNiByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gcmVhZHcoKHU4KilkZXYtPm1lbV9zdGFydCAreCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTggeSkKK3sKKyAgICAgICAgd3JpdGViKHksKHU4KilkZXYtPm1lbV9zdGFydCAreCk7CisJdWRlbGF5KDIwKTsKK30KKwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpCit7CisgICAgICAgIHdyaXRlbCh5LCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworCXVkZWxheSgyMCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpCit7CisgICAgICAgIHdyaXRldyh5LCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworCXVkZWxheSgyMCk7Cit9CisKKyNlbmRpZiAvKiBSVExfSU9fTUFQICovCisKKworCisKKworaW5saW5lIHZvaWQgZm9yY2VfcGNpX3Bvc3Rpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZWFkX25pY19ieXRlKGRldixFUFJPTV9DTUQpOworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwltYigpOworI2VuZGlmCit9CisKKworaXJxcmV0dXJuX3QgcnRsODE4MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqbmV0ZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIHNldF9uaWNfcnhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBzZXRfbmljX3R4cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE4MF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc3RhcnRfdHhfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QUk9DRlMgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnRsODE4MF9wcm9jID0gTlVMTDsKKworc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSxuOworCisJaW50IG1heD0weGZmOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlmb3Iobj0wO248PW1heDspCisJeworCQkvL3ByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogICUyeCA+ICIsbik7CisKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCisJCS8vCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sIlxuIik7CisKKworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorCitpbnQgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSk7CisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfaHcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJLy9zdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworI2lmZGVmIAlDT05GSUdfUlRMODE4NUIKKworI2Vsc2UKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJOSUMgaW50OiAlbHVcbiIKKwkJIlRvdGFsIGludDogJWx1XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkiTFAgYXZhaWwgZGVzYyAlZFxuIgorCQkiTlAgYXZhaWwgZGVzYyAlZFxuIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJIkxQIHBoeXMgZG1hIGFkZHIgJXhcbiIKKwkJIkxQIE5JQyBwdHIgJXhcbiIKKwkJIkxQIHZpcnQgMzJiYXNlICV4XG4iCisJCSJMUCB2aXJ0IDMydGFpbCAleFxuIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJIk5QIHBoeXMgZG1hIGFkZHIgJXhcbiIKKwkJIk5QIE5JQyBwdHIgJXhcbiIKKwkJIk5QIHZpcnQgMzJiYXNlICV4XG4iCisJCSJOUCB2aXJ0IDMydGFpbCAleFxuIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJIkJQIHBoeXMgZG1hIGFkZHIgJXhcbiIKKwkJIkJQIE5JQyBwdHIgJXhcbiIKKwkJIkJQIHZpcnQgMzJiYXNlICV4XG4iCisJCSJCUCB2aXJ0IDMydGFpbCAleFxuIiwKKwkJcHJpdi0+c3RhdHMuaW50cywKKwkJcHJpdi0+c3RhdHMuc2hpbnRzLAorCQlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LExPV19QUklPUklUWSksCisJCWdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTk9STV9QUklPUklUWSksCisJCSh1MzIpcHJpdi0+dHh2aXByaW5nZG1hLAorCQlyZWFkX25pY19kd29yZChkZXYsVExQREEpLAorCQkodTMyKXByaXYtPnR4dmlwcmluZywKKwkJKHUzMilwcml2LT50eHZpcHJpbmd0YWlsLAorCQkodTMyKXByaXYtPnR4dm9wcmluZ2RtYSwKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFROUERBKSwKKwkJKHUzMilwcml2LT50eHZvcHJpbmcsCisJCSh1MzIpcHJpdi0+dHh2b3ByaW5ndGFpbCwKKwkJKHUzMilwcml2LT50eGJlYWNvbnJpbmdkbWEsCisJCXJlYWRfbmljX2R3b3JkKGRldixUQkRBKSwKKwkJKHUzMilwcml2LT50eGJlYWNvbnJpbmcsCisJCSh1MzIpcHJpdi0+dHhiZWFjb25yaW5ndGFpbCk7CisjZW5kaWYKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfcngoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJLyoJIlJYIGRlc2NyaXB0b3Igbm90IGF2YWlsYWJsZTogJWx1XG4iCisJCSJSWCBpbmNvbXBsZXRlIChtaXNzaW5nIGxhc3QgZGVzY3JpcHRvcik6ICVsdVxuIgorCQkiUlggbm90IGRhdGE6ICVsdVxuIgorCQkvLyJSWCBkZXNjcmlwdG9yIHBvaW50ZXIgcmVzZXQ6ICVsdVxuIgorCQkiUlggZGVzY3JpcHRvciBwb2ludGVyIGxvc3Q6ICVsdVxuIgorCQkvLyJSWCBwb2ludGVyIHdvcmthcm91bmQ6ICVsdVxuIgorCQkiUlggZXJyb3IgaW50OiAlbHVcbiIKKwkJIlJYIGZpZm8gb3ZlcmZsb3c6ICVsdVxuIgorCQkiUlggaW50OiAlbHVcbiIKKwkJIlJYIHBhY2tldDogJWx1XG4iCisJCSJSWCBieXRlczogJWx1XG4iCisJCSJSWCBETUEgZmFpbDogJWx1XG4iLAorCQlwcml2LT5zdGF0cy5yeHJkdSwKKwkJcHJpdi0+c3RhdHMucnhub2xhc3QsCisJCXByaXYtPnN0YXRzLnJ4bm9kYXRhLAorCQkvL3ByaXYtPnN0YXRzLnJ4cmVzZXQsCisJCXByaXYtPnN0YXRzLnJ4bm9wb2ludGVyLAorCQkvL3ByaXYtPnN0YXRzLnJ4d3JrYXJvdW5kLAorCQlwcml2LT5zdGF0cy5yeGVyciwKKwkJcHJpdi0+c3RhdHMucnhvdmVyZmxvdywKKwkJcHJpdi0+c3RhdHMucnhpbnQsCisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfcGFja2V0cywKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9ieXRlcywKKwkJcHJpdi0+c3RhdHMucnhkbWFmYWlsICAqLworCQkiUlggT0s6ICVsdVxuIgorCQkiUlggUmV0cnk6ICVsdVxuIgorCQkiUlggQ1JDIEVycm9yKDAtNTAwKTogJWx1XG4iCisJCSJSWCBDUkMgRXJyb3IoNTAwLTEwMDApOiAlbHVcbiIKKwkJIlJYIENSQyBFcnJvcig+MTAwMCk6ICVsdVxuIgorCQkiUlggSUNWIEVycm9yOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnJ4aW50LAorCQlwcml2LT5zdGF0cy5yeGVyciwKKwkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaW4sCisJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWlkLAorCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1heCwKKwkJcHJpdi0+c3RhdHMucnhpY3ZlcnIKKwkJKTsKKworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX2llZWUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJUWGVkIGFzc29jaWF0aW9uIHJlcXVlc3RzOiAldVxuIgorCQkiVFhlZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0czogJXVcbiIKKwkJIlJYZWQgc3VjY2Vzc2Z1bCBhc3NvY2lhdGlvbiByZXNwb25zZTogJXVcbiIKKwkJIlJYZWQgZmFpbGVkIGFzc29jaWF0aW9uIHJlc3BvbnNlOiAldVxuIgorCQkiUlhlZCBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlOiAldVxuIgorCQkiUlhlZCBmYWlsZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJBc3NvY2lhdGlvbiByZXF1ZXN0cyB3aXRob3V0IHJlc3BvbnNlOiAldVxuIgorCQkiQXV0aGVudGljYXRpb24gcmVxdWVzdHMgd2l0aG91dCByZXNwb25zZTogJXVcbiIKKwkJIlRYIHByb2JlIHJlc3BvbnNlOiAldVxuIgorCQkiUlggcHJvYmUgcmVxdWVzdDogJXVcbiIKKwkJIlRYIHByb2JlIHJlcXVlc3Q6ICVsdVxuIgorCQkiUlggYXV0aGVudGljYXRpb24gcmVxdWVzdHM6ICVsdVxuIgorCQkiUlggYXNzb2NpYXRpb24gcmVxdWVzdHM6ICVsdVxuIgorCQkiUmVhc3NvY2lhdGlvbnM6ICVsdVxuIiwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnR4X2FzcywKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnR4X2F1dCwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2Fzc19vaywKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2Fzc19lcnIsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hdXRfb2ssCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hdXRfZXJyLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuYXNzX25vcmVzcCwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLmF1dF9ub3Jlc3AsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy50eF9wcm9iZSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X3Byb2JlLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfcHJvYmVfcnEsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hdXRoX3JxLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXNzb2NfcnEsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yZWFzc29jKTsKKworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKyNpZiAwCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX2FwKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWFjX2h0YWJsZV90ICpsaXN0OworCWludCBpOworCWludCBsZW4gPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSKXsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiQ2FyZCBpcyBub3QgYWN0aW5nIGFzIEFQLi4uXG4iCisJCSk7CisJfWVsc2V7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIkxpc3Qgb2YgYXNzb2NpYXRlZCBTVEE6XG4iCisJCSk7CisKKwkJZm9yKGk9MDtpPE1BQ19IVEFCTEVfRU5UUlk7aSsrKQorCQkJZm9yIChsaXN0ID0gcHJpdi0+aWVlZTgwMjExLT5hc3NvY19odGFibGVbaV07IGxpc3QhPU5VTEw7IGxpc3QgPSBsaXN0LT5uZXh0KXsKKwkJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJCU1BQ1NUUiJcbiIsTUFDMlNUUihsaXN0LT5hZHIpKTsKKwkJCX0KKworCX0KKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfdHgoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisJdW5zaWduZWQgbG9uZyB0b3RhbE9LOworCisJdG90YWxPSz1wcml2LT5zdGF0cy50eG5wb2tpbnQrcHJpdi0+c3RhdHMudHhocG9raW50K3ByaXYtPnN0YXRzLnR4bHBva2ludDsKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJLyoJIlRYIG5vcm1hbCBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggbm9ybWFsIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBoaWdoIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBoaWdoIHByaW9yaXR5IGZhaWxlZCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggbG93IHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBsb3cgcHJpb3JpdHkgZmFpbGVkIGVycm9yIGludDogJWx1XG4iCisJCSJUWCBieXRlczogJWx1XG4iCisJCSJUWCBwYWNrZXRzOiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHJlc3VtZTogJWx1XG4iCisJCSJUWCBxdWV1ZSBzdG9wcGVkPzogJWRcbiIKKwkJIlRYIGZpZm8gb3ZlcmZsb3c6ICVsdVxuIgorCQkvLyJTVyBUWCBzdG9wOiAlbHVcbiIKKwkJLy8iU1cgVFggd2FrZTogJWx1XG4iCisJCSJUWCBiZWFjb246ICVsdVxuIgorCQkiVFggYmVhY29uIGFib3J0ZWQ6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMudHhucG9raW50LAorCQlwcml2LT5zdGF0cy50eG5wZXJyLAorCQlwcml2LT5zdGF0cy50eGhwb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4aHBlcnIsCisJCXByaXYtPnN0YXRzLnR4bHBva2ludCwKKwkJcHJpdi0+c3RhdHMudHhscGVyciwKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9ieXRlcywKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzLAorCQlwcml2LT5zdGF0cy50eHJlc3VtZWQsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdywKKwkJLy9wcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMuc3d0eHN0b3AsCisJCS8vcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnN3dHhhd2FrZSwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb24sCisJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyICAqLworCQkiVFggT0s6ICVsdVxuIgorCQkiVFggRXJyb3I6ICVsdVxuIgorCQkiVFggUmV0cnk6ICVsdVxuIgorCQkiVFggYmVhY29uIE9LOiAlbHVcbiIKKwkJIlRYIGJlYWNvbiBlcnJvcjogJWx1XG4iLAorCQl0b3RhbE9LLAorCQlwcml2LT5zdGF0cy50eG5wZXJyK3ByaXYtPnN0YXRzLnR4aHBlcnIrcHJpdi0+c3RhdHMudHhscGVyciwKKwkJcHJpdi0+c3RhdHMudHhyZXRyeSwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb24sCisJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyCisJKTsKKworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTgwX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworICAgICAgIHJldHVybiAmcHJpdi0+d3N0YXRzOworfQorI2VuZGlmCit2b2lkIHJ0bDgxODBfcHJvY19tb2R1bGVfaW5pdCh2b2lkKQoreworCURNRVNHKCJJbml0aWFsaXppbmcgcHJvYyBmaWxlc3lzdGVtIik7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorICAgICAgICBydGw4MTgwX3Byb2M9Y3JlYXRlX3Byb2NfZW50cnkoUlRMODE4MF9NT0RVTEVfTkFNRSwgU19JRkRJUiwgcHJvY19uZXQpOworI2Vsc2UKKyAgICAgICAgcnRsODE4MF9wcm9jPWNyZWF0ZV9wcm9jX2VudHJ5KFJUTDgxODBfTU9EVUxFX05BTUUsIFNfSUZESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKyNlbmRpZgorfQorCisKK3ZvaWQgcnRsODE4MF9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFJUTDgxODBfTU9EVUxFX05BTUUsIHByb2NfbmV0KTsKKyNlbHNlCisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFJUTDgxODBfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKKyNlbmRpZgorfQorCisKK3ZvaWQgcnRsODE4MF9wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJaWYgKHByaXYtPmRpcl9kZXYpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWh3IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy10eCIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtcngiLCBwcml2LT5kaXJfZGV2KTsKKy8vCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtaWVlZSIsIHByaXYtPmRpcl9kZXYpOworLy8JCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1hcCIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcnRsODE4MF9wcm9jKTsKKwkJcHJpdi0+ZGlyX2RldiA9IE5VTEw7CisJfQorfQorCisKK3ZvaWQgcnRsODE4MF9wcm9jX2luaXRfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5kaXJfZGV2ID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLAorCQkJCQkgIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwkJCQkJICBydGw4MTgwX3Byb2MpOworCWlmICghcHJpdi0+ZGlyX2RldikgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC9ydGw4MTgwLyVzXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLWh3IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfaHcsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy1od1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtcngiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19yeCwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLXJ4XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKworCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLXR4IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfdHgsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy10eFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisJI2lmIDAKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtaWVlZSIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2llZWUsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy1pZWVlXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKwkjZW5kaWYKKwkjaWYgMAorCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1hcCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2FwLCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtYXBcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCSNlbmRpZgorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVycywgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3JlZ2lzdGVyc1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1NSVNDIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBGSVhNRTogY2hlY2sgaWYgd2UgY2FuIHVzZSBzb21lIHN0YW5kYXJkIGFscmVhZHktZXhpc3RlbnQKKyAgZGF0YSB0eXBlK2Z1bmN0aW9ucyBpbiBrZXJuZWwKKyovCisKK3Nob3J0IGJ1ZmZlcl9hZGQoc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlciwgdTMyICpidWYsIGRtYV9hZGRyX3QgZG1hLAorCQlzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyaGVhZCkKK3sKKyNpZmRlZiBERUJVR19SSU5HCisJRE1FU0coImFkZGluZyBidWZmZXIgdG8gVFgvUlggc3RydWN0Iik7CisjZW5kaWYKKworICAgICAgICBzdHJ1Y3QgYnVmZmVyICp0bXA7CisKKwlpZighICpidWZmZXIpeworCisJCSpidWZmZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnVmZmVyKSxHRlBfS0VSTkVMKTsKKworCQlpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7CisJCQlETUVTR0UoIkZhaWxlZCB0byBrbWFsbG9jIGhlYWQgb2YgVFgvUlggc3RydWN0Iik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKCpidWZmZXIpLT5uZXh0PSpidWZmZXI7CisJCSgqYnVmZmVyKS0+YnVmPWJ1ZjsKKwkJKCpidWZmZXIpLT5kbWE9ZG1hOworCQlpZihidWZmZXJoZWFkICE9TlVMTCkKKwkJCSgqYnVmZmVyaGVhZCkgPSAoKmJ1ZmZlcik7CisJCXJldHVybiAwOworCX0KKwl0bXA9KmJ1ZmZlcjsKKworCXdoaWxlKHRtcC0+bmV4dCE9KCpidWZmZXIpKSB0bXA9dG1wLT5uZXh0OworCWlmICgodG1wLT5uZXh0PSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnVmZmVyKSxHRlBfS0VSTkVMKSkgPT0gTlVMTCl7CisJCURNRVNHRSgiRmFpbGVkIHRvIGttYWxsb2MgVFgvUlggc3RydWN0Iik7CisJCXJldHVybiAtMTsKKwl9CisJdG1wLT5uZXh0LT5idWY9YnVmOworCXRtcC0+bmV4dC0+ZG1hPWRtYTsKKwl0bXAtPm5leHQtPm5leHQ9KmJ1ZmZlcjsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgYnVmZmVyICoqYnVmZmVyLGludCBsZW4sc2hvcnQKK2NvbnNpc3RlbnQpCit7CisKKwlzdHJ1Y3QgYnVmZmVyICp0bXAsKm5leHQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2PXByaXYtPnBkZXY7CisJLy9pbnQgaTsKKworCWlmKCEgKmJ1ZmZlcikgcmV0dXJuOworCisJLypmb3IodG1wPSpidWZmZXI7IHRtcC0+bmV4dCAhPSAqYnVmZmVyOyB0bXA9dG1wLT5uZXh0KQorCisJKi8KKwl0bXA9KmJ1ZmZlcjsKKwlkb3sKKwkJbmV4dD10bXAtPm5leHQ7CisJCWlmKGNvbnNpc3RlbnQpeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LGxlbiwKKwkJCQkgICAgdG1wLT5idWYsdG1wLT5kbWEpOworCQl9ZWxzZXsKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgdG1wLT5kbWEsCisJCQlsZW4sUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWtmcmVlKHRtcC0+YnVmKTsKKwkJfQorCQlrZnJlZSh0bXApOworCQl0bXAgPSBuZXh0OworCX0KKwl3aGlsZShuZXh0ICE9ICpidWZmZXIpOworCisJKmJ1ZmZlcj1OVUxMOworfQorCisKK3ZvaWQgcHJpbnRfYnVmZmVyKHUzMiAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCXU4ICpidWYgPSh1OCopYnVmZmVyOworCisJcHJpbnRrKCJBU0NJSSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLGxlbik7CisKKwlmb3IoaT0wO2k8bGVuO2krKykKKwkJcHJpbnRrKCIlYyIsYnVmW2ldKTsKKworCXByaW50aygiXG5CSU5BUlkgQlVGRkVSIERVTVAgKGxlbjogJXgpOlxuIixsZW4pOworCisJZm9yKGk9MDtpPGxlbjtpKyspCisJCXByaW50aygiJTAyeCIsYnVmW2ldKTsKKworCXByaW50aygiXG4iKTsKK30KKworCitpbnQgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyKiB0YWlsOworCXUzMiogaGVhZDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwcmlvcml0eSl7CisJCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4bWFwcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHhtYXByaW5ndGFpbDsKKwkJCWJyZWFrOworCQljYXNlIEJLX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4YmtwcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHhia3ByaW5ndGFpbDsKKwkJCWJyZWFrOworCQljYXNlIEJFX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4YmVwcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHhiZXByaW5ndGFpbDsKKwkJCWJyZWFrOworCQljYXNlIFZJX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4dmlwcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHh2aXByaW5ndGFpbDsKKwkJCWJyZWFrOworCQljYXNlIFZPX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4dm9wcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHh2b3ByaW5ndGFpbDsKKwkJCWJyZWFrOworCQljYXNlIEhJX1BSSU9SSVRZOgorCQkJaGVhZCA9IHByaXYtPnR4aHByaW5naGVhZDsKKwkJCXRhaWwgPSBwcml2LT50eGhwcmluZ3RhaWw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvL0RNRVNHKCIleCAleCIsIGhlYWQsIHRhaWwpOworCisJLyogRklYTUUgRklYTUUgRklYTUUgRklYTUUgKi8KKworI2lmIDAKKwlpZiggaGVhZCA8PSB0YWlsICkgcmV0dXJuIHByaXYtPnR4cmluZ2NvdW50LTEgLSAodGFpbCAtIGhlYWQpLzg7CisJcmV0dXJuIChoZWFkIC0gdGFpbCkvOC80OworI2Vsc2UKKwlpZiggaGVhZCA8PSB0YWlsICkKKwkJcmV0ID0gcHJpdi0+dHhyaW5nY291bnQgLSAodGFpbCAtIGhlYWQpLzg7CisJZWxzZQorCQlyZXQgPSAoaGVhZCAtIHRhaWwpLzg7CisKKwlpZihyZXQgPiBwcml2LT50eHJpbmdjb3VudCApIERNRVNHKCJCVUciKTsKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CisKKworc2hvcnQgY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCByZXF1aXJlZGJ5dGUsIHJlcXVpcmVkOworCXJlcXVpcmVkYnl0ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEpOworCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKKwkJcmVxdWlyZWRieXRlICs9IDI7CisJfTsKKworCXJlcXVpcmVkID0gcmVxdWlyZWRieXRlIC8gKHByaXYtPnR4YnVmZnNpemUtNCk7CisJaWYgKHJlcXVpcmVkYnl0ZSAlIHByaXYtPnR4YnVmZnNpemUpIHJlcXVpcmVkKys7CisJLyogZm9yIG5vdyB3ZSBrZWVwIHR3byBmcmVlIGRlc2NyaXB0b3IgYXMgYSBzYWZldHkgYm91bmRhcnkKKwkgKiBiZXR3ZWVuIHRoZSB0YWlsIGFuZCB0aGUgaGVhZAorCSAqLworCisJcmV0dXJuIChyZXF1aXJlZCsyIDwgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixwcmlvcml0eSkpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IgZGVidWdpbmcgcHVycG9zZSAqLwordm9pZCBjaGVja190eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCit7CisJc3RhdGljIGludCBtYXhsb2cgPTM7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiogdG1wOworCXN0cnVjdCBidWZmZXIgKmJ1ZjsKKwlpbnQgaTsKKwlpbnQgbmljOworCXUzMiogdGFpbDsKKwl1MzIqIGhlYWQ7CisJdTMyKiBiZWdpbjsKKwl1MzIgbmljYmVnaW47CisJc3RydWN0IGJ1ZmZlciogYnVmZmVyOworCisJbWF4bG9nIC0tOworCWlmIChtYXhsb2cgPDAgKSByZXR1cm47CisKKwlzd2l0Y2gocHJpKSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eG1hcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4bWFwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4bWFwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eG1hcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhtYXByaW5nZG1hOworCQlicmVhazsKKworCisJY2FzZSBCS19QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4YmtwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhia3ByaW5nOworCQloZWFkID0gcHJpdi0+dHhia3ByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0JLUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHhia3BidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4YmtwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIEJFX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhiZXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eGJlcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGJlcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfQkVQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eGJlcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhiZXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZpcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dmlwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dmlwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WSVBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4dmlwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eHZpcHJpbmdkbWE7CisJCWJyZWFrOworCisKKwljYXNlIFZPX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHh2b3ByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eHZvcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eHZvcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfVk9QUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eHZvcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2b3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGhwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhocHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGhwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHhocGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhocHJpbmdkbWE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDsKKwkJYnJlYWs7CisJfQorCisJaWYoIXByaXYtPnR4dm9wYnVmcykKKwkJRE1FU0dFICgiTklDIFRYIGFjaywgYnV0IFRYIHF1ZXVlIGNvcnJ1cHRlZCEiKTsKKwllbHNleworCisJCWZvcihpPTAsYnVmPWJ1ZmZlciwgdG1wPWJlZ2luOworCQkJdG1wPGJlZ2luKyhwcml2LT50eHJpbmdjb3VudCkqODsKKwkJCXRtcCs9OCxidWY9YnVmLT5uZXh0LGkrKykKKworCQkJRE1FU0coIkJVRiVkICVzICV4ICVzLiBOZXh0IDogJXgiLGksCisJCQkgICAgICAqdG1wICYgKDE8PDMxKSA/ICJmaWxsZWQiIDogImVtcHR5IiwKKwkJCSAgICAgICooYnVmLT5idWYpLAorCQkJICAgICAgKnRtcCAmICgxPDwxNSk/ICJvayI6ICJlcnIiLCAqKHRtcCs0KSk7CisJfQorCisJRE1FU0coIm5pYyBhdCAlZCIsCisJCShuaWMtbmljYmVnaW4pIC8gOCAvNCk7CisJRE1FU0coInRhaWwgYXQgJWQiLCAoKGludCl0YWlsIC0gKGludCliZWdpbikgLzggLzQpOworCURNRVNHKCJoZWFkIGF0ICVkIiwgKChpbnQpaGVhZCAtIChpbnQpYmVnaW4pIC84IC80KTsKKwlETUVTRygiY2hlY2sgZnJlZSBkZXNjIHJldHVybnMgJWQiLCBjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixwcmkpKTsKKwlETUVTRygiZnJlZSBkZXNjIGlzICVkXG4iLCBnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LHByaSkpOworCS8vcnRsODE4MF9yZXNldChkZXYpOworCXJldHVybjsKK30KKworCisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2UgKi8KK3ZvaWQgY2hlY2tfcnhidWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyKiB0bXA7CisJc3RydWN0IGJ1ZmZlciAqYnVmOworCXU4IHJ4X2Rlc2Nfc2l6ZTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXJ4X2Rlc2Nfc2l6ZSA9IDg7CisjZWxzZQorCXJ4X2Rlc2Nfc2l6ZSA9IDQ7CisjZW5kaWYKKworCWlmKCFwcml2LT5yeGJ1ZmZlcikKKwkJRE1FU0dFICgiTklDIFJYIGFjaywgYnV0IFJYIHF1ZXVlIGNvcnJ1cHRlZCEiKTsKKworCWVsc2V7CisKKwkJZm9yKGJ1Zj1wcml2LT5yeGJ1ZmZlciwgdG1wPXByaXYtPnJ4cmluZzsKKwkJICAgIHRtcCA8IHByaXYtPnJ4cmluZysocHJpdi0+cnhyaW5nY291bnQpKnJ4X2Rlc2Nfc2l6ZTsKKwkJICAgIHRtcCs9cnhfZGVzY19zaXplLCBidWY9YnVmLT5uZXh0KQorCisJCQlETUVTRygiQlVGICVzICV4IiwKKwkJCSAgICAgICp0bXAgJiAoMTw8MzEpID8gImVtcHR5IiA6ICJmaWxsZWQiLAorCQkJICAgICAgKihidWYtPmJ1ZikpOworCX0KKworCXJldHVybjsKK30KKworCit2b2lkIGR1bXBfZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlmb3IoaT0wOyBpPDYzOyBpKyspCisJCURNRVNHKCJFRVBST00gYWRkciAleCA6ICV4IiwgaSwgZXByb21fcmVhZChkZXYsaSkpOworfQorCisKK3ZvaWQgcnRsODE4MF9kdW1wX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBuOworCWludCBtYXg9MHhmZjsKKworCURNRVNHKCJEdW1waW5nIE5JQyByZWdpc3RlciBtYXAiKTsKKworCWZvcihuPTA7bjw9bWF4OykKKwl7CisJCXByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQkJcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworCit2b2lkIGZpeF90eF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiAqdG1wOworCWludCBpOworI2lmZGVmIERFQlVHX1RYX0FMTE9DCisJRE1FU0coIkZJWElORyBUWCBGSUZPcyIpOworI2VuZGlmCisJZm9yICh0bXA9cHJpdi0+dHhtYXByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhia3ByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKykgeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKworCWZvciAodG1wPXByaXYtPnR4YmVwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKwlmb3IgKHRtcD1wcml2LT50eHZpcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKSB7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHh2b3ByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorCisJZm9yICh0bXA9cHJpdi0+dHhocHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCxpKyspeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKworCWZvciAodG1wPXByaXYtPnR4YmVhY29ucmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4YmVhY29uY291bnQ7CisJICAgICB0bXArPTgsIGkrKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7CisJfQorI2lmZGVmIERFQlVHX1RYX0FMTE9DCisJRE1FU0coIlRYIEZJRk9zIEZJWEVEIik7CisjZW5kaWYKKwlwcml2LT50eG1hcHJpbmd0YWlsID0gcHJpdi0+dHhtYXByaW5nOworCXByaXYtPnR4bWFwcmluZ2hlYWQgPSBwcml2LT50eG1hcHJpbmc7CisJcHJpdi0+dHhtYXBidWZzdGFpbCA9IHByaXYtPnR4bWFwYnVmczsKKworCXByaXYtPnR4YmtwcmluZ3RhaWwgPSBwcml2LT50eGJrcHJpbmc7CisJcHJpdi0+dHhia3ByaW5naGVhZCA9IHByaXYtPnR4YmtwcmluZzsKKwlwcml2LT50eGJrcGJ1ZnN0YWlsID0gcHJpdi0+dHhia3BidWZzOworCisJcHJpdi0+dHhiZXByaW5ndGFpbCA9IHByaXYtPnR4YmVwcmluZzsKKwlwcml2LT50eGJlcHJpbmdoZWFkID0gcHJpdi0+dHhiZXByaW5nOworCXByaXYtPnR4YmVwYnVmc3RhaWwgPSBwcml2LT50eGJlcGJ1ZnM7CisKKwlwcml2LT50eHZpcHJpbmd0YWlsID0gcHJpdi0+dHh2aXByaW5nOworCXByaXYtPnR4dmlwcmluZ2hlYWQgPSBwcml2LT50eHZpcHJpbmc7CisJcHJpdi0+dHh2aXBidWZzdGFpbCA9IHByaXYtPnR4dmlwYnVmczsKKworCXByaXYtPnR4dm9wcmluZ3RhaWwgPSBwcml2LT50eHZvcHJpbmc7CisJcHJpdi0+dHh2b3ByaW5naGVhZCA9IHByaXYtPnR4dm9wcmluZzsKKwlwcml2LT50eHZvcGJ1ZnN0YWlsID0gcHJpdi0+dHh2b3BidWZzOworCisJcHJpdi0+dHhocHJpbmd0YWlsID0gcHJpdi0+dHhocHJpbmc7CisJcHJpdi0+dHhocHJpbmdoZWFkID0gcHJpdi0+dHhocHJpbmc7CisJcHJpdi0+dHhocGJ1ZnN0YWlsID0gcHJpdi0+dHhocGJ1ZnM7CisKKwlwcml2LT50eGJlYWNvbnJpbmd0YWlsID0gcHJpdi0+dHhiZWFjb25yaW5nOworCXByaXYtPnR4YmVhY29uYnVmc3RhaWwgPSBwcml2LT50eGJlYWNvbmJ1ZnM7CisJc2V0X25pY190eHJpbmcoZGV2KTsKKworCWllZWU4MDIxMV9yZXNldF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCXByaXYtPmFja190eF90b19pZWVlID0gMDsKK30KKworCit2b2lkIGZpeF9yeF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiAqdG1wOworCXN0cnVjdCBidWZmZXIgKnJ4YnVmOworCXU4IHJ4X2Rlc2Nfc2l6ZTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXJ4X2Rlc2Nfc2l6ZSA9IDg7IC8vIDQqOCA9IDMyIGJ5dGVzCisjZWxzZQorCXJ4X2Rlc2Nfc2l6ZSA9IDQ7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JYQUxMT0MKKwlETUVTRygiRklYSU5HIFJYIEZJRk8iKTsKKwljaGVja19yeGJ1ZihkZXYpOworI2VuZGlmCisKKwlmb3IgKHRtcD1wcml2LT5yeHJpbmcsIHJ4YnVmPXByaXYtPnJ4YnVmZmVyaGVhZDsKKwkgICAgICh0bXAgPCAocHJpdi0+cnhyaW5nKSsocHJpdi0+cnhyaW5nY291bnQpKnJ4X2Rlc2Nfc2l6ZSk7CisJICAgICB0bXArPXJ4X2Rlc2Nfc2l6ZSxyeGJ1Zj1yeGJ1Zi0+bmV4dCl7CisJCSoodG1wKzIpID0gcnhidWYtPmRtYTsKKwkJKnRtcD0qdG1wICZ+IDB4ZmZmOworCQkqdG1wPSp0bXAgfCBwcml2LT5yeGJ1ZmZlcnNpemU7CisJCSp0bXAgfD0gKDE8PDMxKTsKKwl9CisKKyNpZmRlZiBERUJVR19SWEFMTE9DCisJRE1FU0coIlJYIEZJRk8gRklYRUQiKTsKKwljaGVja19yeGJ1ZihkZXYpOworI2VuZGlmCisKKwlwcml2LT5yeHJpbmd0YWlsPXByaXYtPnJ4cmluZzsKKwlwcml2LT5yeGJ1ZmZlcj1wcml2LT5yeGJ1ZmZlcmhlYWQ7CisJcHJpdi0+cnhfc2tiX2NvbXBsZXRlPTE7CisJc2V0X25pY19yeHJpbmcoZGV2KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSFcgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBjaGFyIFFVQUxJVFlfTUFQW10gPSB7CisgIDB4NjQsIDB4NjQsIDB4NjQsIDB4NjMsIDB4NjMsIDB4NjIsIDB4NjIsIDB4NjEsCisgIDB4NjEsIDB4NjAsIDB4NjAsIDB4NWYsIDB4NWYsIDB4NWUsIDB4NWQsIDB4NWMsCisgIDB4NWIsIDB4NWEsIDB4NTksIDB4NTcsIDB4NTYsIDB4NTQsIDB4NTIsIDB4NGYsCisgIDB4NGMsIDB4NDksIDB4NDUsIDB4NDEsIDB4M2MsIDB4MzcsIDB4MzEsIDB4MjksCisgIDB4MjQsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsIDB4MjIsCisgIDB4MjIsIDB4MjIsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjEsIDB4MjAsCisgIDB4MjAsIDB4MjAsIDB4MjAsIDB4MWYsIDB4MWYsIDB4MWUsIDB4MWUsIDB4MWUsCisgIDB4MWQsIDB4MWQsIDB4MWMsIDB4MWMsIDB4MWIsIDB4MWEsIDB4MTksIDB4MTksCisgIDB4MTgsIDB4MTcsIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTIsIDB4MTEsIDB4MGYsCisgIDB4MGUsIDB4MGMsIDB4MGEsIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDEsIDB4MDAKK307CisKK3Vuc2lnbmVkIGNoYXIgU1RSRU5HVEhfTUFQW10gPSB7CisgIDB4NjQsIDB4NjQsIDB4NjMsIDB4NjIsIDB4NjEsIDB4NjAsIDB4NWYsIDB4NWUsCisgIDB4NWQsIDB4NWMsIDB4NWIsIDB4NWEsIDB4NTcsIDB4NTQsIDB4NTIsIDB4NTAsCisgIDB4NGUsIDB4NGMsIDB4NGEsIDB4NDgsIDB4NDYsIDB4NDQsIDB4NDEsIDB4M2YsCisgIDB4M2MsIDB4M2EsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MWMsIDB4MWMsIDB4MWIsCisgIDB4MWIsIDB4MWEsIDB4MWEsIDB4MTksIDB4MTksIDB4MTgsIDB4MTgsIDB4MTcsCisgIDB4MTcsIDB4MTYsIDB4MTYsIDB4MTUsIDB4MTUsIDB4MTQsIDB4MTQsIDB4MTMsCisgIDB4MTMsIDB4MTIsIDB4MTIsIDB4MTEsIDB4MTEsIDB4MTAsIDB4MTAsIDB4MGYsCisgIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGMsIDB4MGMsIDB4MGIsCisgIDB4MGIsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksIDB4MDgsIDB4MDgsIDB4MDcsCisgIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDQsIDB4MDMsIDB4MDIsIDB4MDAKK307CisKK3ZvaWQgcnRsODE4MF9SU1NJX2NhbGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnJzc2ksIHU4ICpxdWFsKXsKKwkvL3ZvaWQgTWxtZV9VcGRhdGVSc3NpU1Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnJzc2ksIHU4ICpxdWFsKXsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHRlbXA7CisJdTMyIHRlbXAyOworCXUzMiB0ZW1wMzsKKwl1MzIgbHNiOworCXUzMiBxOworCXUzMiBvcmlnX3F1YWw7CisJdTggIF9yc3NpOworCisJcSA9ICpxdWFsOworCW9yaWdfcXVhbCA9ICpxdWFsOworCV9yc3NpID0gMDsgLy8gYXZvaWQgZ2NjIGNvbXBsYWlucy4uCisKKwlpZiAocSA8PSAweDRlKSB7CisJCXRlbXAgPSBRVUFMSVRZX01BUFtxXTsKKwl9IGVsc2UgeworCQlpZiggcSAmIDB4ODAgKSB7CisJCQl0ZW1wID0gMHgzMjsKKwkJfSBlbHNlIHsKKwkJCXRlbXAgPSAxOworCQl9CisJfQorCisJKnF1YWwgPSB0ZW1wOworCXRlbXAyID0gKnJzc2k7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCl7CisJY2FzZSBSRkNISVBJRF9SRk1EOgorCQlsc2IgPSB0ZW1wMiAmIDE7CisJCXRlbXAyICY9IDB4N2U7CisJCWlmICggIWxzYiB8fCAhKHRlbXAyIDw9IDB4M2MpICkgeworCQkJdGVtcDIgPSAweDY0OworCQl9IGVsc2UgeworCQkJdGVtcDIgPSAxMDAgKiB0ZW1wMiAvIDB4M2M7CisJCX0KKwkJKnJzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCV9yc3NpID0gdGVtcDIgJiAweGZmOworCQlicmVhazsKKwljYXNlIFJGQ0hJUElEX0lOVEVSU0lMOgorCQlsc2IgPSB0ZW1wMjsKKwkJdGVtcDIgJj0gMHhmZmZmZmZmZTsKKwkJdGVtcDIgKj0gMjUxOworCQl0ZW1wMyA9IHRlbXAyOworCQl0ZW1wMiA8PD0gNjsKKwkJdGVtcDMgKz0gdGVtcDI7CisJCXRlbXAzIDw8PSAxOworCQl0ZW1wMiA9IDB4NDk1MGRmOworCQl0ZW1wMiAtPSB0ZW1wMzsKKwkJbHNiICY9IDE7CisJCWlmICggdGVtcDIgPD0gMHgzZTAwMDAgKSB7CisJCQlpZiAoIHRlbXAyIDwgMHhmZmVmMDAwMCApCisJCQkJdGVtcDIgPSAweGZmZWYwMDAwOworCQl9IGVsc2UgeworCQkJdGVtcDIgPSAweDNlMDAwMDsKKwkJfQorCQlpZiAoICFsc2IgKSB7CisJCQl0ZW1wMiAtPSAweGYwMDAwOworCQl9IGVsc2UgeworCQkJdGVtcDIgKz0gMHhmMDAwMDsKKwkJfQorCisJCXRlbXAzID0gMHg0ZDAwMDA7CisJCXRlbXAzIC09IHRlbXAyOworCQl0ZW1wMyAqPSAxMDA7CisJCXRlbXAzID0gdGVtcDMgLyAweDZkOworCQl0ZW1wMyA+Pj0gMHgxMDsKKwkJX3Jzc2kgPSB0ZW1wMyAmIDB4ZmY7CisJCSpyc3NpID0gdGVtcDMgJiAweGZmOworCQlicmVhazsKKwljYXNlIFJGQ0hJUElEX0dDVDoKKwkgICAgICAgIGxzYiA9IHRlbXAyICYgMTsKKwkJdGVtcDIgJj0gMHg3ZTsKKwkJaWYgKCAhIGxzYiB8fCAhKHRlbXAyIDw9IDB4M2MpICl7CisJCQl0ZW1wMiA9IDB4NjQ7CisJCX0gZWxzZSB7CisJCQl0ZW1wMiA9ICgxMDAgKiB0ZW1wMikgLyAweDNjOworCQl9CisJCSpyc3NpID0gdGVtcDIgJiAweGZmOworCQlfcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBSRkNISVBJRF9QSElMSVBTOgorCQlpZiggb3JpZ19xdWFsIDw9IDB4NGUgKXsKKwkJCV9yc3NpID0gU1RSRU5HVEhfTUFQW29yaWdfcXVhbF07CisJCQkqcnNzaSA9IF9yc3NpOworCQl9IGVsc2UgeworCQkJb3JpZ19xdWFsIC09IDB4ODA7CisJCQlpZiAoICFvcmlnX3F1YWwgKXsKKwkJCQlfcnNzaSA9IDE7CisJCQkJKnJzc2kgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlfcnNzaSA9IDB4MzI7CisJCQkJKnJzc2kgPSAweDMyOworCQkJfQorCQl9CisJCWJyZWFrOworCisJLyogY2FzZSA0ICovCisJY2FzZSBSRkNISVBJRF9NQVhJTToKKwkJbHNiID0gdGVtcDIgJiAxOworCQl0ZW1wMiAmPSAweDdlOworCQl0ZW1wMiA+Pj0gMTsKKwkJdGVtcDIgKz0gMHg0MjsKKwkJaWYoIGxzYiAhPSAwICl7CisJCQl0ZW1wMiArPSAweGE7CisJCX0KKwkJKnJzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCV9yc3NpID0gdGVtcDIgJiAweGZmOworCQlicmVhazsKKwl9CisKKwlpZiAoIF9yc3NpIDwgMHg2NCApeworCQlpZiAoIF9yc3NpID09IDAgKSB7CisJCQkqcnNzaSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQkqcnNzaSA9IDB4NjQ7CisJfQorCisJcmV0dXJuOworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmlycV9lbmFibGVkID0gMTsKKy8qCisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEFfTUFTSyxJTlRBX1JYT0sgfCBJTlRBX1JYREVTQ0VSUiB8IElOVEFfUlhPVkVSRkxPVyB8XAorCUlOVEFfVFhPVkVSRkxPVyB8IElOVEFfSElQUklPUklUWURFU0NFUlIgfCBJTlRBX0hJUFJJT1JJVFlERVNDT0sgfFwKKwlJTlRBX05PUk1QUklPUklUWURFU0NFUlIgfCBJTlRBX05PUk1QUklPUklUWURFU0NPSyB8XAorCUlOVEFfTE9XUFJJT1JJVFlERVNDRVJSIHwgSU5UQV9MT1dQUklPUklUWURFU0NPSyB8IElOVEFfVElNRU9VVCk7CisqLworCXdyaXRlX25pY193b3JkKGRldixJTlRBX01BU0ssIHByaXYtPmlycV9tYXNrKTsKK30KKworCit2b2lkIHJ0bDgxODBfaXJxX2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LElNUiwwKTsKKyNlbHNlCisJd3JpdGVfbmljX3dvcmQoZGV2LElOVEFfTUFTSywwKTsKKyNlbmRpZgorCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJcHJpdi0+aXJxX2VuYWJsZWQgPSAwOworfQorCisKK3ZvaWQgcnRsODE4MF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBtb2RlKQoreworCXU4IGVjbWQ7CisJZWNtZD1yZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKTsKKwllY21kPWVjbWQgJn4gRVBST01fQ01EX09QRVJBVElOR19NT0RFX01BU0s7CisJZWNtZD1lY21kIHwgKG1vZGU8PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCk7CisJZWNtZD1lY21kICZ+ICgxPDxFUFJPTV9DU19TSElGVCk7CisJZWNtZD1lY21kICZ+ICgxPDxFUFJPTV9DS19TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsIGVjbWQpOworfQorCit2b2lkIHJ0bDgxODBfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIHJ0bDgxODBfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBtc3I7CisJdTMyIHJ4Y29uZjsKKworCW1zciAgPSByZWFkX25pY19ieXRlKGRldiwgTVNSKTsKKwltc3IgJj0gfiBNU1JfTElOS19NQVNLOworCisJcnhjb25mPXJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJbXNyIHw9IChNU1JfTElOS19BREhPQzw8TVNSX0xJTktfU0hJRlQpOworCQllbHNlIGlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQltc3IgfD0gKE1TUl9MSU5LX01BU1RFUjw8TVNSX0xJTktfU0hJRlQpOworCQllbHNlIGlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFOQUdFRDw8TVNSX0xJTktfU0hJRlQpOworCQllbHNlCisJCQltc3IgfD0gKE1TUl9MSU5LX05PTkU8PE1TUl9MSU5LX1NISUZUKTsKKwkJcnhjb25mIHw9ICgxPDxSWF9DSEVDS19CU1NJRF9TSElGVCk7CisKKwl9ZWxzZSB7CisJCW1zciB8PSAoTVNSX0xJTktfTk9ORTw8TVNSX0xJTktfU0hJRlQpOworCQlyeGNvbmYgJj0gfigxPDxSWF9DSEVDS19CU1NJRF9TSElGVCk7CisJfQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKworfQorCisKKwordm9pZCBydGw4MTgwX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoKGNoID4gMTQpIHx8IChjaCA8IDEpKQorCXsKKwkJcHJpbnRrKCJJbiAlczogSW52YWxpZCBjaG5hbmVsICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNoKTsKKwkJcmV0dXJuOworCX0KKworCXByaXYtPmNoYW49Y2g7CisJLy9wcmludGsoImluICVzOmNoYW5uZWwgaXMgJWRcbiIsX19GVU5DVElPTl9fLGNoKTsKKwlwcml2LT5yZl9zZXRfY2hhbihkZXYscHJpdi0+Y2hhbik7CisKK30KKworCit2b2lkIHJ0bDgxODBfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXUzMiByeGNvbmY7CisJLyogZm9yIG5vdyB3ZSBhY2NlcHQgZGF0YSwgbWFuYWdlbWVudCAmIGN0bCBmcmFtZSovCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnhjb25mPXJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFDX0ZJTFRFUl9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTU5HX0ZSQU1FX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0RBVEFfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQkNBU1RfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTUNBU1RfRlJBTUVfU0hJRlQpOworLy8Jcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9DUkNFUlJfRlJBTUVfU0hJRlQpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIERNRVNHICgiTklDIGluIHByb21pc2MgbW9kZSIpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCBcCisJICAgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCX1lbHNleworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCk7CisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwKQorCQkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9CisKKwkvKmlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki8KKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NUTF9GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfSUNWRVJSX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9QV1JfRlJBTUVfU0hJRlQpOworCX0KKworCWlmKCBwcml2LT5jcmNtb24gPT0gMSAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpeworCQlyeGNvbmYgPSByeGNvbmYgJn4gUlhfRklGT19USFJFU0hPTERfTUFTSzsKKwkJcnhjb25mID0gcnhjb25mIHwgKFJYX0ZJRk9fVEhSRVNIT0xEX05PTkU8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKTsKKwkvL30KKworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9BVVRPUkVTRVRQSFlfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQVhfUlhfRE1BX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKE1BWF9SWF9ETUFfMjA0ODw8TUFYX1JYX0RNQV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9PTkxZRVJMUEtUOworCisJcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOworCWlmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiB8PSAocHJpdi0+cmNyX2NzZW5zZTw8UkNSX0NTX1NISUZUKTsKKy8vCXJ4Y29uZiAmPX4gMHhmZmYwMDAwMDsKKy8vCXJ4Y29uZiB8PSAweDkwMTAwMDAwOy8vOTAxNGY3NmY7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKworCWZpeF9yeF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19SWAorCURNRVNHKCJyeGNvbmY6ICV4ICV4IixyeGNvbmYgLHJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKSk7CisjZW5kaWYKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfUlhfRU5BQkxFX1NISUZUKSk7CisKKwkvKiBJbiBydGw4MTM5IGRyaXZlciBzZWVtcyB0aGF0IERNQSB0aHJlc2hvbGQgaGFzIHRvIGJlIHdyaXR0ZW4KKwkgKiAgYWZ0ZXIgZW5hYmxpbmcgUlgsIHNvIHdlIHJld3JpdGUgUlhfQ09ORklHIHJlZ2lzdGVyCisJICovCisJLy9tZGVsYXkoMTAwKTsKKy8vCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CisKK30KKworCit2b2lkIHNldF9uaWNfdHhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4bWFwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhia3ByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0JFUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eGJlcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfVklQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4dmlwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHh2b3ByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4aHByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfQkVBQ09OX1JJTkdfQUREUiwgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKK30KKworCit2b2lkIHJ0bDgxODBfY29udHR4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB0eGNvbmY7CisJdHhjb25mID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19DT05USU5VRSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKK30KKworCit2b2lkIHJ0bDgxODBfY29udHR4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgdHhjb25mOworCXR4Y29uZiA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKK30KKworCit2b2lkIHJ0bDgxODBfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXU4IHR4X2FnY19jdGw7CisJdTggYnl0ZTsKKwl1MzIgdHhjb25mOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl0eGNvbmY9IHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKTsKKworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCisJCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixDV19DT05GKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKKwkJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDV19DT05GLCBieXRlKTsKKworCQl0eF9hZ2NfY3RsID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwpOworCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQpOworCQl0eF9hZ2NfY3RsIHw9KDE8PFRYX0FHQ19DVExfRkVFREJBQ0tfQU5UKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMLCB0eF9hZ2NfY3RsKTsKKwkJLyoKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAxKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4ZmUsIDB4MTApOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHg1ZSwgMHgwMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJKi8KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGVjLCAweDNmKTsgLyogRGlzYWJsZSBlYXJseSBUWCAqLworCX0KKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOworCisJfWVsc2V7CisKKwkJaWYoaHdzZXFudW0pCisJCQl0eGNvbmY9IHR4Y29uZiAmfiAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwkJZWxzZQorCQkJdHhjb25mPSB0eGNvbmYgfCAoMTw8VFhfQ09ORl9IRUFERVJfQVVUT0lDUkVNRU5UX1NISUZUKTsKKwl9CisKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX0RQUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1JUU1JFVFJZX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X2RhdGE8PFRYX0RQUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9ydHM8PFRYX1JUU1JFVFJZX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRYX05PQ1JDX1NISUZUKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCWlmKHByaXYtPmh3X3BsY3BfbGVuKQorCQkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9QTENQX0xFTjsKKwkJZWxzZQorCQkJdHhjb25mID0gdHhjb25mIHwgVENSX1BMQ1BfTEVOOworCX1lbHNleworCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1NBVDsKKwl9CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9NWERNQV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUQ1JfTVhETUFfMjA0ODw8VENSX01YRE1BX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfQ1dNSU47CisJdHhjb25mID0gdHhjb25mIHwgVENSX0RJU0NXOworCisvLwlpZihwcml2LT5pZWVlODAyMTEtPmh3X3dlcCkKKy8vCQl0eGNvbmY9dHhjb25mICZ+ICgxPDxUWF9OT0lDVl9TSElGVCk7CisvLwllbHNlCisJCXR4Y29uZj10eGNvbmYgfCAoMTw8VFhfTk9JQ1ZfU0hJRlQpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4Y29uZik7CisKKworCWZpeF90eF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19UWAorCURNRVNHKCJ0eGNvbmY6ICV4ICV4Iix0eGNvbmYscmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpKTsKKyNlbmRpZgorCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENNRCxjbWQgfCAoMTw8Q01EX1RYX0VOQUJMRV9TSElGVCkpOworCisvLwltZGVsYXkoMTAwKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKy8vCSNlbmRpZgorLyoKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0RNQV9QT0xMSU5HLCBwcml2LT5kbWFfcG9sbF9tYXNrKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKwkqLworfQorCisKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrICY9IH4oVFBQT0xMU1RPUF9CUSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX21hc2spOworI2Vsc2UKKwlwcml2LT5kbWFfcG9sbF9tYXNrICY9figxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorCisKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayB8PSBUUFBPTExTVE9QX0JROworCXdyaXRlX25pY19ieXRlKGRldixUUFBvbGxTdG9wLCBwcml2LT5kbWFfcG9sbF9zdG9wX21hc2spOworI2Vsc2UKKwlwcml2LT5kbWFfcG9sbF9tYXNrIHw9ICgxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCit9CisKKwordm9pZCBydGw4MTgwX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ01ELCBjbWQgJn4gXAorCQkgICAgICAgKCgxPDxDTURfUlhfRU5BQkxFX1NISUZUKXwoMTw8Q01EX1RYX0VOQUJMRV9TSElGVCkpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxMCk7CisJLyp3aGlsZSAocmVhZF9uaWNfYnl0ZShkZXYsQ01EKSAmICgxPDxDTURfUlhfRU5BQkxFX1NISUZUKSkKKwkgIHVkZWxheSgxMCk7CisJKi8KKworCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpCisJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7Cit9CisKKyNpZiAwCitpbnQgYWxsb2NfdHhfYmVhY29uX2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdTMyICp0bXA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+dHhiZWFjb25yaW5nID0gKHUzMiopcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwKKwkJCQkJICBzaXplb2YodTMyKSo4KmNvdW50LAorCQkJCQkgICZwcml2LT50eGJlYWNvbnJpbmdkbWEpOworCWlmICghcHJpdi0+dHhiZWFjb25yaW5nKSByZXR1cm4gLTE7CisJZm9yICh0bXA9cHJpdi0+dHhiZWFjb25yaW5nLGk9MDtpPGNvdW50O2krKyl7CisJCSp0bXAgPSAqdG1wICZ+ICgxPDwzMSk7IC8vIGRlc2NyaXB0b3IgZW1wdHksIG93bmVkIGJ5IHRoZSBkcnYKKwkJLyoKKwkJKih0bXArMikgPSAodTMyKWRtYV90bXA7CisJCSoodG1wKzMpID0gYnVmc2l6ZTsKKwkJKi8KKwkJaWYoaSsxPGNvdW50KQorCQkJKih0bXArNCkgPSAodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYSsoKGkrMSkqOCo0KTsKKwkJZWxzZQorCQkJKih0bXArNCkgPSAodTMyKXByaXYtPnR4YmVhY29ucmluZ2RtYTsKKworCQl0bXA9dG1wKzg7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3Nob3J0IGFsbG9jX3R4X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmc2l6ZSwgaW50IGNvdW50LAorCQkJIGludCBhZGRyKQoreworCWludCBpOworCXUzMiAqZGVzYzsKKwl1MzIgKnRtcDsKKwlkbWFfYWRkcl90IGRtYV9kZXNjLCBkbWFfdG1wOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisJdm9pZCAqYnVmOworCisJaWYoKGJ1ZnNpemUgJiAweGZmZikgIT0gYnVmc2l6ZSkgeworCQlETUVTR0UgKCJUWCBidWZmZXIgYWxsb2NhdGlvbiB0b28gbGFyZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlc2MgPSAodTMyKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJCQkgIHNpemVvZih1MzIpKjgqY291bnQrMjU2LCAmZG1hX2Rlc2MpOworCWlmKGRlc2M9PU5VTEwpIHJldHVybiAtMTsKKwlpZihkbWFfZGVzYyAmIDB4ZmYpeworCisJCS8qCisJCSAqIGRlc2NyaXB0b3IncyBidWZmZXIgbXVzdCBiZSAyNTYgYnl0ZSBhbGlnbmVkCisJCSAqIHdlIHNob3VsZG4ndCBiZSBoZXJlLCBzaW5jZSB3ZSBzZXQgRE1BIG1hc2sgIQorCQkgKi8KKwkJRE1FU0dXKCJGaXhpbmcgVFggYWxpZ25tZW50Iik7CisJCWRlc2MgPSAodTMyKikoKHU4KilkZXNjICsgMjU2KTsKKyNpZiAoZGVmaW5lZChDT05GSUdfSElHSE1FTTY0RykgfHwgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSkKKwkJZGVzYyA9ICh1MzIqKSgodTY0KWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTY0KWRtYV9kZXNjICZ+IDB4ZmYpOworI2Vsc2UKKwkJZGVzYyA9ICh1MzIqKSgodTMyKWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTMyKWRtYV9kZXNjICZ+IDB4ZmYpOworI2VuZGlmCisJfQorCXRtcD1kZXNjOworCWZvciAoaT0wO2k8Y291bnQ7aSsrKQorCXsKKwkJYnVmID0gKHZvaWQqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsYnVmc2l6ZSwmZG1hX3RtcCk7CisJCWlmIChidWYgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07CisKKwkJc3dpdGNoKGFkZHIpIHsKKyNpZiAwCisJCWNhc2UgVFhfTk9STVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eG5wYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0xPV1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGxwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhocGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBIUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eG1hcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJrcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfQkVQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZXBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfVklQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2aXBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4dm9wYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhocGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBIUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfQkVBQ09OX1JJTkdfQUREUjoKKwkJICAgICAgICBpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHhiZWFjb25idWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBCUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsgLy8gZGVzY3JpcHRvciBlbXB0eSwgb3duZWQgYnkgdGhlIGRydgorCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKih0bXArMykgPSBidWZzaXplOworCisJCWlmKGkrMTxjb3VudCkKKwkJCSoodG1wKzQpID0gKHUzMilkbWFfZGVzYysoKGkrMSkqOCo0KTsKKwkJZWxzZQorCQkJKih0bXArNCkgPSAodTMyKWRtYV9kZXNjOworCisJCXRtcD10bXArODsKKwl9CisKKwlzd2l0Y2goYWRkcikgeworCWNhc2UgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eG1hcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4bWFwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfQktQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4YmtwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhia3ByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhiZXByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJlcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eHZpcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4dmlwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfVk9QUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4dm9wcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHh2b3ByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eGhwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhocHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0JFQUNPTl9SSU5HX0FERFI6CisJCXByaXYtPnR4YmVhY29ucmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhiZWFjb25yaW5nPWRlc2M7CisJCWJyZWFrOworCisJfQorCisjaWZkZWYgREVCVUdfVFgKKwlETUVTRygiVHggZG1hIHBoeXNpY2FsIGFkZHJlc3M6ICV4IixkbWFfZGVzYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgZnJlZV90eF9kZXNjX3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwlpbnQgY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhtYXByaW5nLCBwcml2LT50eG1hcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4bWFwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhia3ByaW5nLCBwcml2LT50eGJrcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmtwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhiZXByaW5nLCBwcml2LT50eGJlcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmVwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHh2aXByaW5nLCBwcml2LT50eHZpcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4dmlwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHh2b3ByaW5nLCBwcml2LT50eHZvcHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4dm9wYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhocHJpbmcsIHByaXYtPnR4aHByaW5nZG1hKTsKKwlidWZmZXJfZnJlZShkZXYsJihwcml2LT50eGhwYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKKworCWNvdW50ID0gcHJpdi0+dHhiZWFjb25jb3VudDsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnR4YmVhY29ucmluZywgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKKwlidWZmZXJfZnJlZShkZXYsJihwcml2LT50eGJlYWNvbmJ1ZnMpLHByaXYtPnR4YnVmZnNpemUsMSk7Cit9CisKKyNpZiAwCit2b2lkIGZyZWVfYmVhY29uX2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBjb3VudCkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJlYWNvbnJpbmcsIHByaXYtPnR4YmVhY29ucmluZ2RtYSk7CisKKwlpZiAocHJpdi0+YmVhY29uX2J1ZikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LAorCQkJcHJpdi0+bWFzdGVyX2JlYWNvbnNpemUscHJpdi0+YmVhY29uX2J1Zixwcml2LT5iZWFjb25kbWFidWYpOworCit9CisjZW5kaWYKK3ZvaWQgZnJlZV9yeF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5wZGV2OworCisJaW50IGNvdW50ID0gcHJpdi0+cnhyaW5nY291bnQ7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnJ4cmluZywgcHJpdi0+cnhyaW5nZG1hKTsKKyNlbHNlCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo0KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT5yeHJpbmcsIHByaXYtPnJ4cmluZ2RtYSk7CisjZW5kaWYKKworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnJ4YnVmZmVyKSxwcml2LT5yeGJ1ZmZlcnNpemUsMCk7Cit9CisKKworc2hvcnQgYWxsb2NfcnhfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBidWZzaXplLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdTMyICpkZXNjOworCXUzMiAqdG1wOworCWRtYV9hZGRyX3QgZG1hX2Rlc2MsZG1hX3RtcDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY9cHJpdi0+cGRldjsKKwl2b2lkICpidWY7CisJdTggcnhfZGVzY19zaXplOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnhfZGVzY19zaXplID0gODsgLy8gNCo4ID0gMzIgYnl0ZXMKKyNlbHNlCisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCisJaWYoKGJ1ZnNpemUgJiAweGZmZikgIT0gYnVmc2l6ZSl7CisJCURNRVNHRSAoIlJYIGJ1ZmZlciBhbGxvY2F0aW9uIHRvbyBsYXJnZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGVzYyA9ICh1MzIqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsc2l6ZW9mKHUzMikqcnhfZGVzY19zaXplKmNvdW50KzI1NiwKKwkJCQkJICAmZG1hX2Rlc2MpOworCisJaWYoZG1hX2Rlc2MgJiAweGZmKXsKKworCQkvKgorCQkgKiBkZXNjcmlwdG9yJ3MgYnVmZmVyIG11c3QgYmUgMjU2IGJ5dGUgYWxpZ25lZAorCQkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIHNwZWNpZnkgdGhlIERNQSBtYXNrCisJCSAqLworCisJCURNRVNHVygiRml4aW5nIFJYIGFsaWdubWVudCIpOworCQlkZXNjID0gKHUzMiopKCh1OCopZGVzYyArIDI1Nik7CisjaWYgKGRlZmluZWQoQ09ORklHX0hJR0hNRU02NEcpIHx8IGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikpCisJCWRlc2MgPSAodTMyKikoKHU2NClkZXNjICZ+IDB4ZmYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTgqKWRtYV9kZXNjICsgMjU2KTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU2NClkbWFfZGVzYyAmfiAweGZmKTsKKyNlbHNlCisJCWRlc2MgPSAodTMyKikoKHUzMilkZXNjICZ+IDB4ZmYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTgqKWRtYV9kZXNjICsgMjU2KTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHUzMilkbWFfZGVzYyAmfiAweGZmKTsKKyNlbmRpZgorCX0KKworCXByaXYtPnJ4cmluZz1kZXNjOworCXByaXYtPnJ4cmluZ2RtYT1kbWFfZGVzYzsKKwl0bXA9ZGVzYzsKKworCWZvciAoaT0wO2k8Y291bnQ7aSsrKXsKKworCQlpZiAoKGJ1Zj0ga21hbGxvYyhidWZzaXplICogc2l6ZW9mKHU4KSxHRlBfQVRPTUlDKSkgPT0gTlVMTCl7CisJCQlETUVTR0UoIkZhaWxlZCB0byBrbWFsbG9jIFJYIGJ1ZmZlciIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZG1hX3RtcCA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsYnVmLGJ1ZnNpemUgKiBzaXplb2YodTgpLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworI2lmZGVmIERFQlVHX1pFUk9fUlgKKwkJaW50IGo7CisJCWZvcihqPTA7ajxidWZzaXplO2orKykgKCh1OCopYnVmKVtpXSA9IDA7CisjZW5kaWYKKworCQkvL2J1ZiA9ICh2b2lkKilwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LGJ1ZnNpemUsJmRtYV90bXApOworCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+cnhidWZmZXIpLCBidWYsZG1hX3RtcCwKKwkJCSAgICYocHJpdi0+cnhidWZmZXJoZWFkKSkpeworCQkJICAgRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIFJYIGJ1ZiIpOworCQkJICAgcmV0dXJuIC0xOworCQl9CisJCSp0bXAgPSAwOyAvL3plcm8gcGFkcyB0aGUgaGVhZGVyIG9mIHRoZSBkZXNjcmlwdG9yCisJCSp0bXAgPSAqdG1wIHwoIGJ1ZnNpemUmMHhmZmYpOworCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKnRtcCA9ICp0bXAgfCgxPDwzMSk7IC8vIGRlc2NyaXB0b3Igdm9pZCwgb3duZWQgYnkgdGhlIE5JQworCisjaWZkZWYgREVCVUdfUlhBTExPQworCQlETUVTRygiQWxsb2MgJXggc2l6ZSBidWZmZXIsIERNQSBtZW0gQCAleCwgdmlydHVhbCBtZW0gQCAleCIsCisJCSAgICAgICh1MzIpKGJ1ZnNpemUmMHhmZmYpLCAodTMyKWRtYV90bXAsICh1MzIpYnVmKTsKKyNlbmRpZgorCisJCXRtcD10bXArcnhfZGVzY19zaXplOworCX0KKworCSoodG1wLXJ4X2Rlc2Nfc2l6ZSkgPSAqKHRtcC1yeF9kZXNjX3NpemUpIHwgKDE8PDMwKTsgLy8gdGhpcyBpcyB0aGUgbGFzdCBkZXNjcmlwdG9yCisKKworI2lmZGVmIERFQlVHX1JYQUxMT0MKKwlETUVTRygiUlggRE1BIHBoeXNpY2FsIGFkZHJlc3M6ICV4IixkbWFfZGVzYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgc2V0X25pY19yeHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBwZ3JlZzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL3J0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCXBncmVnPXJlYWRfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCwgcGdyZWcgJn4gKDE8PFBHU0VMRUNUX1BHX1NISUZUKSk7CisKKwkvL3J0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJYUklOR19BRERSLHByaXYtPnJ4cmluZ2RtYSk7Cit9CisKKwordm9pZCBydGw4MTgwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy91MzIgdHhjb25mID0gMHg4MGUwMDcwNzsgLy9GSVhNRTogTWFrZSBtZSB1bmRlcnN0YW5kYWJsZQorCXU4IGNyOworCisJLy93cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKworCXJ0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKworCWNyPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJY3IgPSBjciAmIDI7CisJY3IgPSBjciB8ICgxPDxDTURfUlNUX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNyKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisKKwltZGVsYXkoMjAwKTsKKworCWlmKHJlYWRfbmljX2J5dGUoZGV2LENNRCkgJiAoMTw8Q01EX1JTVF9TSElGVCkpCisJCURNRVNHVygiQ2FyZCByZXNldCB0aW1lb3V0ISIpOworCWVsc2UKKwkJRE1FU0coIkNhcmQgc3VjY2Vzc2Z1bGx5IHJlc2V0Iik7CisKKy8vI2lmbmRlZiBDT05GSUdfUlRMODE4NUIKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTE9BRCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMjAwKTsKKy8vI2VuZGlmCit9CisKK2lubGluZSB1MTYgaWVlZXJhdGUycnRscmF0ZShpbnQgcmF0ZSkKK3sKKwlzd2l0Y2gocmF0ZSl7CisJY2FzZSAxMDoKKwlyZXR1cm4gMDsKKwljYXNlIDIwOgorCXJldHVybiAxOworCWNhc2UgNTU6CisJcmV0dXJuIDI7CisJY2FzZSAxMTA6CisJcmV0dXJuIDM7CisJY2FzZSA2MDoKKwlyZXR1cm4gNDsKKwljYXNlIDkwOgorCXJldHVybiA1OworCWNhc2UgMTIwOgorCXJldHVybiA2OworCWNhc2UgMTgwOgorCXJldHVybiA3OworCWNhc2UgMjQwOgorCXJldHVybiA4OworCWNhc2UgMzYwOgorCXJldHVybiA5OworCWNhc2UgNDgwOgorCXJldHVybiAxMDsKKwljYXNlIDU0MDoKKwlyZXR1cm4gMTE7CisJZGVmYXVsdDoKKwlyZXR1cm4gMzsKKworCX0KK30KKworc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLDIwLDU1LDExMCw2MCw5MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw3MjB9OworaW5saW5lIHUxNiBydGw4MTgwX3JhdGUycmF0ZShzaG9ydCByYXRlKQoreworCWlmIChyYXRlID4xMikgcmV0dXJuIDEwOworCXJldHVybiBydGxfcmF0ZVtyYXRlXTsKK30KK2lubGluZSB1OCBydGw4MTgwX0lzV2lyZWxlc3NCTW9kZSh1MTYgcmF0ZSkKK3sKKwlpZiggKChyYXRlIDw9IDExMCkgJiYgKHJhdGUgIT0gNjApICYmIChyYXRlICE9IDkwKSkgfHwgKHJhdGUgPT0gMjIwKSApCisJCXJldHVybiAxOworCWVsc2UgcmV0dXJuIDA7Cit9Cit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSk7Cit1MTYgQ29tcHV0ZVR4VGltZSgKKwl1MTYJCUZyYW1lTGVuZ3RoLAorCXUxNgkJRGF0YVJhdGUsCisJdTgJCWJNYW5hZ2VtZW50RnJhbWUsCisJdTgJCWJTaG9ydFByZWFtYmxlCispCit7CisJdTE2CUZyYW1lVGltZTsKKwl1MTYJTl9EQlBTOworCXUxNglDZWlsaW5nOworCisJaWYoIHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKERhdGFSYXRlKSApCisJeworCQlpZiggYk1hbmFnZW1lbnRGcmFtZSB8fCAhYlNob3J0UHJlYW1ibGUgfHwgRGF0YVJhdGUgPT0gMTAgKQorCQl7CS8vIGxvbmcgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDE0NCs0OCsoRnJhbWVMZW5ndGgqOC8oRGF0YVJhdGUvMTApKSk7CisJCX0KKwkJZWxzZQorCQl7CS8vIFNob3J0IHByZWFtYmxlCisJCQlGcmFtZVRpbWUgPSAodTE2KSg3MisyNCsoRnJhbWVMZW5ndGgqOC8oRGF0YVJhdGUvMTApKSk7CisJCX0KKwkJaWYoICggRnJhbWVMZW5ndGgqOCAlIChEYXRhUmF0ZS8xMCkgKSAhPSAwICkgLy9HZXQgdGhlIENlaWxsaW5nCisJCQkJRnJhbWVUaW1lICsrOworCX0gZWxzZSB7CS8vODAyLjExZyBEU1NTLU9GRE0gUExDUCBsZW5ndGggZmllbGQgY2FsY3VsYXRpb24uCisJCU5fREJQUyA9IE5fREJQU09mUmF0ZShEYXRhUmF0ZSk7CisJCUNlaWxpbmcgPSAoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgLyBOX0RCUFMKKwkJCQkrICgoKDE2ICsgOCpGcmFtZUxlbmd0aCArIDYpICUgTl9EQlBTKSA/IDEgOiAwKTsKKwkJRnJhbWVUaW1lID0gKHUxNikoMTYgKyA0ICsgNCpDZWlsaW5nICsgNik7CisJfQorCXJldHVybiBGcmFtZVRpbWU7Cit9Cit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSkKK3sKKwkgdTE2IE5fREJQUyA9IDI0OworCisJIHN3aXRjaChEYXRhUmF0ZSkKKwkgeworCSBjYXNlIDYwOgorCSAgTl9EQlBTID0gMjQ7CisJICBicmVhazsKKworCSBjYXNlIDkwOgorCSAgTl9EQlBTID0gMzY7CisJICBicmVhazsKKworCSBjYXNlIDEyMDoKKwkgIE5fREJQUyA9IDQ4OworCSAgYnJlYWs7CisKKwkgY2FzZSAxODA6CisJICBOX0RCUFMgPSA3MjsKKwkgIGJyZWFrOworCisJIGNhc2UgMjQwOgorCSAgTl9EQlBTID0gOTY7CisJICBicmVhazsKKworCSBjYXNlIDM2MDoKKwkgIE5fREJQUyA9IDE0NDsKKwkgIGJyZWFrOworCisJIGNhc2UgNDgwOgorCSAgTl9EQlBTID0gMTkyOworCSAgYnJlYWs7CisKKwkgY2FzZSA1NDA6CisJICBOX0RCUFMgPSAyMTY7CisJICBicmVhazsKKworCSBkZWZhdWx0OgorCSAgYnJlYWs7CisJIH0KKworCSByZXR1cm4gTl9EQlBTOworfQorCisvL3tieSBhbXkgMDgwMzEyCisvLworLy8JRGVzY3JpcHRpb246CisvLyAJRm9yIE5ldGdlYXIgY2FzZSwgdGhleSB3YW50IGdvb2QtbG9va2luZyBzaW5nYWwgc3RyZW5ndGguCisvLwkJMjAwNC4xMi4wNSwgYnkgcmNuamtvLgorLy8KK2xvbmcKK05ldGdlYXJTaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwlsb25nIExhc3RTUywKKwlsb25nIEN1cnJTUworCSkKK3sKKwlsb25nIFJldFNTOworCisJLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgorCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQorCXsKKwkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKKwl7CisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJeworCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQorCXsKKwkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQorCXsKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gNCkKKwl7CisJCVJldFNTID0gMzY7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDMpCisJeworCQlSZXRTUyA9IDI3OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAyKQorCXsKKwkJUmV0U1MgPSAxODsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMSkKKwl7CisJCVJldFNTID0gOTsKKwl9CisJZWxzZQorCXsKKwkJUmV0U1MgPSBDdXJyU1M7CisJfQorCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiMjIyMjIEFmdGVyIE1hcHBpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJLy8gU3RlcCAyLiBTbW9vdGhpbmcuCisJaWYoTGFzdFNTID4gMCkKKwl7CisJCVJldFNTID0gKChMYXN0U1MgKiA1KSArIChSZXRTUykrIDUpIC8gNjsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiJCQkJCQgQWZ0ZXIgU21vb3RoaW5nOiAgTGFzdFNTOiAlZCwgQ3VyclNTOiAlZCwgUmV0U1M6ICVkXG4iLCBMYXN0U1MsIEN1cnJTUywgUmV0U1MpKTsKKworCXJldHVybiBSZXRTUzsKK30KKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlUcmFuc2xhdGUgMC0xMDAgc2lnbmFsIHN0cmVuZ3RoIGluZGV4IGludG8gZEJtLgorLy8KK2xvbmcKK1RyYW5zbGF0ZVRvRGJtODE4NSgKKwl1OCBTaWduYWxTdHJlbmd0aEluZGV4CS8vIDAtMTAwIGluZGV4LgorCSkKK3sKKwlsb25nCVNpZ25hbFBvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCVNpZ25hbFBvd2VyID0gKGxvbmcpKChTaWduYWxTdHJlbmd0aEluZGV4ICsgMSkgPj4gMSk7CisJU2lnbmFsUG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gU2lnbmFsUG93ZXI7Cit9CisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUGVyZm9ybSBzaWduYWwgc21vb3RoaW5nIGZvciBkeW5hbWljIG1lY2hhbmlzbS4KKy8vCQlUaGlzIGlzIGRpZmZlcmVudCB3aXRoIFBlcmZvcm1TaWduYWxTbW9vdGhpbmc4MTg1IGluIHNtb290aGluZyBmb211bGEuCisvLwkJTm8gZHJhbWF0aWMgYWRqdXN0aW9uIGlzIGFwcGx5IGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lIGRlZ3JlZQorLy8JCW9mIGNvcnJlY3RuZXNzLiBQb3J0ZWQgZnJvbSA4MTg3Qi4KKy8vCTIwMDctMDItMjYsIGJ5IEJydWNlLgorLy8KK3ZvaWQKK1BlcmZvcm1VbmRlY29yYXRlZFNpZ25hbFNtb290aGluZzgxODUoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJYm9vbCAgICBiQ2NrUmF0ZQorCSkKK3sKKworCisJLy8gRGV0ZXJtaW4gdGhlIGN1cnJlbnQgcGFja2V0IGlzIENDSyByYXRlLgorCXByaXYtPmJDdXJDQ0tQa3QgPSBiQ2NrUmF0ZTsKKworCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+PSAwKQorCXsKKwkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gKCAocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTICogNSkgKyAocHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMCkgKSAvIDY7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoICogMTA7CisJfQorCisJcHJpdi0+VW5kZXJjb3JhdGVTbW9vdGhlZFJ4UG93ZXIgPSAoIChwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciAqIDUwKSArIChwcml2LT5SeFBvd2VyKiAxMSkpIC8gNjA7CisKKy8vCXByaW50aygiU29tbXRoaW5nIFNpZ25hbFN0ZXJuZ3RoICglZCkgPT4gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTICglZClcbiIsIHByaXYtPlNpZ25hbFN0cmVuZ3RoLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MpOworLy8JcHJpbnRrKCJTb21tdGhpbmcgUnhQb3dlciAoJWQpID0+IFVuZGVjb3JhdGVkUnhQb3dlciAoJWQpXG4iLCBwcml2LT5SeFBvd2VyLCBwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlcik7CisKKwkvL2lmKHByaXYtPkN1ckNDS1JTU0kgPj0gMCAmJiBiQ2NrUmF0ZSkKKwlpZihiQ2NrUmF0ZSkKKwl7CisJCXByaXYtPkN1ckNDS1JTU0kgPSBwcml2LT5SU1NJOworCX0KKwllbHNlCisJeworCQlwcml2LT5DdXJDQ0tSU1NJID0gMDsKKwl9CisKKwkvLyBCb3VuZGFyeSBjaGVja2luZy4KKwkvLyBUT0RPOiBUaGUgb3ZlcmZsb3cgY29uZGl0aW9uIGRvZXMgaGFwcGVuLCBpZiB3ZSB3YW50IHRvIGZpeCwKKwkvLyB3ZSBzaGFsbCByZWNhbGN1bGF0ZSB0aHJlc2hvbGRzIGZpcnN0LgorCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+IDEwMCkKKwl7CisvLwkJcHJpbnRrKCJVbmRlY29yYXRlZFNtb290aGVkU1MoJWQpIG92ZXJmbG93LCBTaWduYWxTdHJlbmd0aCglZClcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCX0KKwlpZihwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPCAwKQorCXsKKy8vCQlwcmludGsoIlVuZGVjb3JhdGVkU21vb3RoZWRTUyglZCkgdW5kZXJmbG93LCBTaWduYWxTdHJlbmd0aCglZClcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCX0KKworfQorCisvL2J5IGFteSAwODAzMTJ9CisKKy8qIFRoaXMgaXMgcm91Z2ggUlggaXNyIGhhbmRsaW5nIHJvdXRpbmUqLwordm9pZCBydGw4MTgwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICp0bXBfc2tiOworCisJLy9zdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNob3J0IGZpcnN0LGxhc3Q7CisJdTMyIGxlbjsKKwlpbnQgbGFzdGxlbjsKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHksIHNpZ25hbDsKKwl1OCByYXRlOworCS8vdTMyICpwcmlzbV9oZHI7CisJdTMyICp0bXAsKnRtcDI7CisJdTggcnhfZGVzY19zaXplOworCXU4IHBhZGRpbmc7CisJLy91MzIgY291bnQ9MDsKKwljaGFyIHJ4cG93ZXIgPSAwOworCXUzMiBSWEFHQyA9IDA7CisJbG9uZyBSeEFHQ19kQm0gPSAwOworCXU4CUxOQT0wLCBCQj0wOworCXU4IAlMTkFfZ2Fpbls0XT17MDIsIDE3LCAyOSwgMzl9OworCXU4ICBBbnRlbm5hID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOy8vYnkgYW15CisJdTE2IGZjLHR5cGU7CisJdTggYkh3RXJyb3IgPSAwLGJDUkMgPSAwLGJJQ1YgPSAwOworCS8vYkh3RXJyb3IgPSAwOworCS8vYkNSQyA9IDA7CisJLy9iSUNWID0gMDsKKwlib29sCWJDY2tSYXRlID0gZmFsc2U7CisJdTggICAgIFJTU0kgPSAwOworCWxvbmcJU2lnbmFsU3RyZW5ndGhJbmRleCA9IDA7Ly8rYnkgYW15IDA4MDMxMgorLy8JdTggU2lnbmFsU3RyZW5ndGggPSAwOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7CisJCS5zaWduYWwgPSAwLAorCQkubm9pc2UgPSAtOTgsCisJCS5yYXRlID0gMCwKKwkvLwkubWFjX3RpbWUgPSBqaWZmaWVzLAorCQkuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5ELAorCX07CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlzdGF0cy5uaWNfdHlwZSA9IE5JQ184MTg1QjsKKwlyeF9kZXNjX3NpemUgPSA4OworCisjZWxzZQorCXN0YXRzLm5pY190eXBlID0gTklDXzgxODU7CisJcnhfZGVzY19zaXplID0gNDsKKyNlbmRpZgorCS8vcHJpbnRrKCJyZWNlaXZlIGZyYW1lISVkXG4iLGNvdW50KyspOworCS8vaWYgKCFwcml2LT5yeGJ1ZmZlcikgRE1FU0cgKCJFRTogTklDIFJYIGFjaywgYnV0IFJYIHF1ZXVlIGNvcnJ1cHRlZCEiKTsKKwkvL2Vsc2UgeworCisJaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgxPDwzMSkpIHsKKworCQkvKiB3ZSBoYXZlIGdvdCBhbiBSWCBpbnQsIGJ1dCB0aGUgZGVzY3JpcHRvcgorCQkgKiB3ZSBhcmUgcG9pbnRpbmcgaXMgZW1wdHkqLworCisJCXByaXYtPnN0YXRzLnJ4bm9kYXRhKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkvKglpZiAoISAqKHByaXYtPnJ4cmluZykgJiAoMTw8MzEpKSB7CisKKwkJCXByaXYtPnN0YXRzLnJ4cmVzZXQrKzsKKwkJCXByaXYtPnJ4cmluZ3RhaWw9cHJpdi0+cnhyaW5nOworCQkJcHJpdi0+cnhidWZmZXI9cHJpdi0+cnhidWZmZXJoZWFkOworCisJCX1lbHNleyovCisKKwkJI2lmIDAKKwkJLyogTWF5YmUgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgTklDIGhhcyBza2lwcGVkIHNvbWUgZGVzY3JpcHRvcnMgb3IKKwkJICogaXQgaGFzIHJlc2V0IGl0cyBpbnRlcm5hbCBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJpbmcKKwkJICogd2Ugc2VhcmNoIGZvciB0aGUgZmlyc3QgZmlsbGVkIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcsIG9yIHdlIGJyZWFrCisJCSAqIHB1dHRpbmcgYWdhaW4gdGhlIHBvaW50ZXIgaW4gdGhlIG9sZCBsb2NhdGlvbiBpZiB3ZSBkbyBub3QgZm91bmQgYW55LgorCQkgKiBUaGlzIGlzIHF1aXRlIGRhbmdlcm91cywgd2hhdCBkb2VzIGhhcHBlbiBpZiB0aGUgbmljIHdyaXRlcworCQkgKiB0d28gZGVzY3JpcHRvciAoc2F5IEEgYW5kIEIpIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlIGRlc2NyaXB0b3IKKwkJICogQSBhbmQgd2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoZSBkZXNjcmlwdG9yIEIuLlRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZQorCQkgKiBpbnRlcnJ1cHQgd2FzIGR1bW15LCB0aGVyZSB3YXMgbm90IHJlYWxseSBmaWxsZWQgZGVzY3JpcHRvcnMgYW5kCisJCSAqIHRoZSBOSUMgZGlkbid0IGxvc2UgcG9pbnRlcgorCQkgKi8KKworCQkvL3ByaXYtPnN0YXRzLnJ4d3JrYXJvdW5kKys7CisKKwkJdG1wID0gcHJpdi0+cnhyaW5ndGFpbDsKKwkJd2hpbGUgKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MzEpKXsKKworCQkJcHJpdi0+cnhyaW5ndGFpbCs9NDsKKworCQkJaWYocHJpdi0+cnhyaW5ndGFpbCA+PQorCQkJCShwcml2LT5yeHJpbmcpKyhwcml2LT5yeHJpbmdjb3VudCApKjQpCisJCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisKKwkJCXByaXYtPnJ4YnVmZmVyPShwcml2LT5yeGJ1ZmZlci0+bmV4dCk7CisKKwkJCWlmKHByaXYtPnJ4cmluZ3RhaWwgPT0gdG1wICl7CisJCQkJLy9ETUVTRygiRUU6IENvdWxkIG5vdCBmaW5kIFJYIHBvaW50ZXIiKTsKKwkJCQlwcml2LT5zdGF0cy5yeG5vcG9pbnRlcisrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCSNlbHNlCisKKwkJdG1wMiA9IE5VTEw7CisJCXRtcCA9IHByaXYtPnJ4cmluZ3RhaWw7CisJCWRveworCQkJaWYodG1wID09IHByaXYtPnJ4cmluZykKKwkJCQkvL3RtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgKSpyeF9kZXNjX3NpemU7IHhpb25nLTIwMDYtMTEtMTUKKwkJCQl0bXAgID0gcHJpdi0+cnhyaW5nICsgKHByaXYtPnJ4cmluZ2NvdW50IC0gMSkqcnhfZGVzY19zaXplOworCQkJZWxzZQorCQkJCXRtcCAtPSByeF9kZXNjX3NpemU7CisKKwkJCWlmKCEgKCp0bXAgJiAoMTw8MzEpKSkKKwkJCQl0bXAyID0gdG1wOworCQl9d2hpbGUodG1wICE9IHByaXYtPnJ4cmluZyk7CisKKwkJaWYodG1wMikgcHJpdi0+cnhyaW5ndGFpbCA9IHRtcDI7CisJCSNlbmRpZgorCQkvL30KKwl9CisKKwkvKiB3aGlsZSB0aGVyZSBhcmUgZmlsbGVkIGRlc2NyaXB0b3JzICovCisJd2hpbGUoISgqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDMxKSkpeworCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI2KSkKKwkJCURNRVNHVygiUlggYnVmZmVyIG92ZXJmbG93Iik7CisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MTIpKQorCQkJcHJpdi0+c3RhdHMucnhpY3ZlcnIrKzsKKworCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI3KSl7CisJCQlwcml2LT5zdGF0cy5yeGRtYWZhaWwrKzsKKwkJCS8vRE1FU0coIkVFOiBSWCBETUEgRkFJTEVEIGF0IGJ1ZmZlciBwb2ludGVkIGJ5IGRlc2NyaXB0b3IgJXgiLCh1MzIpcHJpdi0+cnhyaW5ndGFpbCk7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocHJpdi0+cGRldiwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXItPmRtYSwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplICogXAorCQkJCSAgICBzaXplb2YodTgpLAorCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWZpcnN0ID0gKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwyOSkgPyAxOjA7CisJCWlmKGZpcnN0KSBwcml2LT5yeF9wcmV2bGVuPTA7CisKKwkJbGFzdCA9ICoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjgpID8gMTowOworCQlpZihsYXN0KXsKKwkJCWxhc3RsZW49KCgqcHJpdi0+cnhyaW5ndGFpbCkgJjB4ZmZmKTsKKworCQkJLyogaWYgdGhlIGxhc3QgZGVzY3JpcHRvciAodGhhdCBzaG91bGQKKwkJCSAqIHRlbGwgdXMgdGhlIHRvdGFsIHBhY2tldCBsZW4pIHRlbGwKKwkJCSAqIHVzIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIGRlc2NyaXB0b3JzCisJCQkgKiBsZW4gd2UgaGFkIHVudGlsIG5vdywgdGhlbiB0aGVyZSBpcyBzb21lCisJCQkgKiBwcm9ibGVtLi4KKwkJCSAqIHdvcmthcm91bmQgdG8gcHJldmVudCBrZXJuZWwgcGFuaWMKKwkJCSAqLworCQkJaWYobGFzdGxlbiA8IHByaXYtPnJ4X3ByZXZsZW4pCisJCQkJbGVuPTA7CisJCQllbHNlCisJCQkJbGVuPWxhc3RsZW4tcHJpdi0+cnhfcHJldmxlbjsKKworCQkJaWYoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwxMykpIHsKKy8vbGFzdGxlbj0oKCpwcml2LT5yeHJpbmd0YWlsKSAmMHhmZmYpOworCQkJCWlmICgoKihwcml2LT5yeHJpbmd0YWlsKSAmIDB4ZmZmKSA8NTAwKQorCQkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbisrOworCQkJCWVsc2UgaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpICYgMHgwZmZmKSA+MTAwMCkKKwkJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXgrKzsKKwkJCQllbHNlCisJCQkJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWlkKys7CisKKwkJCX0KKworCQl9ZWxzZXsKKwkJCWxlbiA9IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKwkJfQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCWlmKGZpcnN0ICYmIGxhc3QpIHsKKwkJCXBhZGRpbmcgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkmKDB4MDQwMDAwMDApKT4+MjY7CisJCX1lbHNlIGlmKGZpcnN0KSB7CisJCQlwYWRkaW5nID0gKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpJigweDA0MDAwMDAwKSk+PjI2OworCQkJaWYocGFkZGluZykgeworCQkJCWxlbiAtPSAyOworCQkJfQorCQl9ZWxzZSB7CisJCQlwYWRkaW5nID0gMDsKKwkJfQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOworI2VuZGlmCisjZW5kaWYKKwkJcHJpdi0+cnhfcHJldmxlbis9bGVuOworCisJCWlmKHByaXYtPnJ4X3ByZXZsZW4gPiBNQVhfRlJBR19USFJFU0hPTEQgKyAxMDApeworCQkJLyogSFcgaXMgcHJvYmFibHkgcGFzc2luZyBzZXZlcmFsIGJ1Z2d5IGZyYW1lcworCQkJKiB3aXRob3V0IEZEIG9yIExEIGZsYWcgc2V0LgorCQkJKiBUaHJvdyB0aGlzIGdhcmJhZ2UgYXdheSB0byBwcmV2ZW50IHNrYgorCQkJKiBtZW1vcnkgZXhhdXN0aW5nCisJCQkqLworCQkJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOworCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlID0gMTsKKwkJfQorCisjaWZkZWYgREVCVUdfUlhfRlJBRworCQlETUVTRygiSXRlcmF0aW9uLi4gbGVuICV4IixsZW4pOworCQlpZihmaXJzdCkgRE1FU0cgKCJGaXJzdCBkZXNjcmlwdG9yIik7CisJCWlmKGxhc3QpIERNRVNHKCJMYXN0IGRlc2NyaXB0b3IiKTsKKworI2VuZGlmCisjaWZkZWYgREVCVUdfUlhfVkVSQk9TRQorCQlwcmludF9idWZmZXIoIHByaXYtPnJ4YnVmZmVyLT5idWYsIGxlbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQlzaWduYWw9KHVuc2lnbmVkIGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSYgKDB4MDBmZjAwMDApKT4+MTYpOworCQlzaWduYWw9KHNpZ25hbCYweGZlKT4+MTsJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjYKKworCQlxdWFsaXR5PSh1bnNpZ25lZCBjaGFyKSgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweGZmKSk7CisKKwkJc3RhdHMubWFjX3RpbWVbMF0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMSk7CisJCXN0YXRzLm1hY190aW1lWzFdID0gKihwcml2LT5yeHJpbmd0YWlsKzIpOworCQlyeHBvd2VyID0oKGNoYXIpKCgoKihwcml2LT5yeHJpbmd0YWlsKzQpKSYgKDB4MDBmZjAwMDApKT4+MTYpKS8yIC0gNDI7CisJCVJTU0kgPSAoKHU4KSgoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkgJiAoMHgwMDAwZmYwMCkpPj4gOCkpICYgKDB4N2YpOworCisjZWxzZQorCQlzaWduYWw9KCgqKHByaXYtPnJ4cmluZ3RhaWwrMSkpJiAoMHhmZjAwMDApKT4+MTY7CisJCXNpZ25hbD0oc2lnbmFsJjB4ZmUpPj4xOwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNgorCisJCXF1YWxpdHk9KCgqKHByaXYtPnJ4cmluZ3RhaWwrMSkpICYgKDB4ZmYpKTsKKworCQlzdGF0cy5tYWNfdGltZVswXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsyKTsKKwkJc3RhdHMubWFjX3RpbWVbMV0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMyk7CisjZW5kaWYKKwkJcmF0ZT0oKCoocHJpdi0+cnhyaW5ndGFpbCkpICYKKwkJCSgoMTw8MjMpfCgxPDwyMil8KDE8PDIxKXwoMTw8MjApKSk+PjIwOworCisJCXN0YXRzLnJhdGUgPSBydGw4MTgwX3JhdGUycmF0ZShyYXRlKTsKKwkJLy9ETUVTRygiJWQiLHJhdGUpOworCQlBbnRlbm5hID0gKCgoKihwcml2LT5yeHJpbmd0YWlsICszKSkmICgweDAwMDA4MDAwKSkgPT0gMCApPyAwOjEgOworLy8JCXByaW50aygiaW4gcnRsODE4MF9yeCgpOkFudGVubmEgaXMgJWRcbiIsQW50ZW5uYSk7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorCQlpZighcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSkpCisJCXsgLy8gT0ZETSByYXRlLgorCisJCQlSeEFHQ19kQm0gPSByeHBvd2VyKzE7CS8vYmlhcworCQl9CisJCWVsc2UKKwkJeyAvLyBDQ0sgcmF0ZS4KKwkJCVJ4QUdDX2RCbSA9IHNpZ25hbDsvL2JpdCAwIGRpc2NhcmQKKworCQkJTE5BID0gKHU4KSAoUnhBR0NfZEJtICYgMHg2MCApID4+IDUgOyAvL2JpdCA2fiBiaXQgNQorCQkJQkIgID0gKHU4KSAoUnhBR0NfZEJtICYgMHgxRik7ICAvLyBiaXQgNCB+IGJpdCAwCisKKyAgIAkJCVJ4QUdDX2RCbSA9IC0oIExOQV9nYWluW0xOQV0gKyAoQkIgKjIpICk7IC8vUGluXzExYj0tKExOQV9nYWluK0JCX2dhaW4pIChkQm0pCisKKwkJCVJ4QUdDX2RCbSArPTQ7IC8vYmlhcworCQl9CisKKwkJaWYoUnhBR0NfZEJtICYgMHg4MCkgLy9hYnNvbHV0ZSB2YWx1ZQorICAgCQkJUlhBR0M9IH4oUnhBR0NfZEJtKSsxOworCQliQ2NrUmF0ZSA9IHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHN0YXRzLnJhdGUpOworCQkvLyBUcmFuc2xhdGUgUlhBR0MgaW50byAxLTEwMC4KKwkJaWYoIXJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHN0YXRzLnJhdGUpKQorCQl7IC8vIE9GRE0gcmF0ZS4KKwkJCWlmKFJYQUdDPjkwKQorCQkJCVJYQUdDPTkwOworCQkJZWxzZSBpZihSWEFHQzwyNSkKKwkJCQlSWEFHQz0yNTsKKwkJCVJYQUdDPSg5MC1SWEFHQykqMTAwLzY1OworCQl9CisJCWVsc2UKKwkJeyAvLyBDQ0sgcmF0ZS4KKwkJCWlmKFJYQUdDPjk1KQorCQkJCVJYQUdDPTk1OworCQkJZWxzZSBpZihSWEFHQzwzMCkKKwkJCQlSWEFHQz0zMDsKKwkJCVJYQUdDPSg5NS1SWEFHQykqMTAwLzY1OworCQl9CisJCXByaXYtPlNpZ25hbFN0cmVuZ3RoID0gKHU4KVJYQUdDOworCQlwcml2LT5SZWN2U2lnbmFsUG93ZXIgPSBSeEFHQ19kQm0gOyAgLy8gSXQgY2FuIHVzZSBkaXJlY3RseSBieSBTRDMgQ01MaW4KKwkJcHJpdi0+UnhQb3dlciA9IHJ4cG93ZXI7CisJCXByaXYtPlJTU0kgPSBSU1NJOworLy97YnkgYW15IDA4MDMxMgorCQkvLyBTUSB0cmFuc2xhdGlvbiBmb3JtdWxhciBpcyBwcm92aWRlZCBieSBTRDMgRFouIDIwMDYuMDYuMjcsIGJ5IHJjbmprby4KKwkJaWYocXVhbGl0eSA+PSAxMjcpCisJCQlxdWFsaXR5ID0gMTsvLzA7IC8vMCB3aWxsIGNhdXNlIGVwYyB0byBzaG93IHNpZ25hbCB6ZXJvICwgd2FsayBhcm91ZCBub3c7CisJCWVsc2UgaWYocXVhbGl0eSA8IDI3KQorCQkJcXVhbGl0eSA9IDEwMDsKKwkJZWxzZQorCQkJcXVhbGl0eSA9IDEyNyAtIHF1YWxpdHk7CisJCXByaXYtPlNpZ25hbFF1YWxpdHkgPSBxdWFsaXR5OworCQlpZighcHJpdi0+Y2FyZF84MTg1KQorCQkJcHJpbnRrKCJjaGVjayB5b3VyIGNhcmQgdHlwZVxuIik7CisKKwkJc3RhdHMuc2lnbmFsID0gKHU4KXF1YWxpdHk7Ly9wcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IHByaXYtPlNpZ25hbFN0cmVuZ3RoOworCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IFJYQUdDOworCQlpZihzdGF0cy5zaWduYWxzdHJlbmd0aCA+IDEwMCkKKwkJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gMTAwOworCQlzdGF0cy5zaWduYWxzdHJlbmd0aCA9IChzdGF0cy5zaWduYWxzdHJlbmd0aCAqIDcwKS8xMDAgKyAzMDsKKwkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PnJ4IDogUlhBR0MgaXMgJWQsc2lnbmFsc3RyZW5ndGggaXMgJWRcbiIsUlhBR0Msc3RhdHMuc2lnbmFsc3RyZW5ndGgpOworCQlzdGF0cy5yc3NpID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IHByaXYtPlNpZ25hbFF1YWxpdHk7CisJCXN0YXRzLm5vaXNlID0gcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAxMDAgLSBwcml2IC0+d3N0YXRzLnF1YWwucXVhbDsKKy8vYnkgYW15IDA4MDMxMn0KKwkJYkh3RXJyb3IgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSYgKDB4MDAwMDBmZmYpKSA9PSA0MDgwKXwgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkmICgweDA0MDAwMDAwKSkgIT0gMCApCisJCQl8ICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpJiAoMHgwODAwMDAwMCkpICE9IDAgKXwgKCgofigqKHByaXYtPnJ4cmluZ3RhaWwpKSkmICgweDEwMDAwMDAwKSkgIT0gMCApfCAoKCh+KCoocHJpdi0+cnhyaW5ndGFpbCkpKSYgKDB4MjAwMDAwMDApKSAhPSAwICk7CisJCWJDUkMgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDB4MDAwMDIwMDApKSA+PiAxMzsKKwkJYklDViA9ICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwMDAwMTAwMCkpID4+IDEyOworICAgICAgICAgICAgaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcHJpdi0+cnhidWZmZXItPmJ1ZjsKKwkJICAgIGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCSAgICAgICAgdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCisJCQlpZigoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCQkJCShlcU1hY0FkZHIocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpPyBoZHItPmFkZHIxIDogKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTICk/IGhkci0+YWRkcjIgOiBoZHItPmFkZHIzKSkKKwkJCQkgJiYgKCFiSHdFcnJvcikgJiYgKCFiQ1JDKSYmICghYklDVikpCisJCQl7CisvL2J5IGFteSAwODAzMTIKKwkJCQkvLyBQZXJmb3JtIHNpZ25hbCBzbW9vdGhpbmcgZm9yIGR5bmFtaWMgbWVjaGFuaXNtIG9uIGRlbWFuZC4KKwkJCQkvLyBUaGlzIGlzIGRpZmZlcmVudCB3aXRoIFBlcmZvcm1TaWduYWxTbW9vdGhpbmc4MTg1IGluIHNtb290aGluZyBmb211bGEuCisJCQkJLy8gTm8gZHJhbWF0aWMgYWRqdXN0aW9uIGlzIGFwcGx5IGJlY2F1c2UgZHluYW1pYyBtZWNoYW5pc20gbmVlZCBzb21lIGRlZ3JlZQorCQkJCS8vIG9mIGNvcnJlY3RuZXNzLiAyMDA3LjAxLjIzLCBieSBzaGllbiBjaGFuZy4KKwkJCQlQZXJmb3JtVW5kZWNvcmF0ZWRTaWduYWxTbW9vdGhpbmc4MTg1KHByaXYsYkNja1JhdGUpOworCQkJCS8vCisJCQkJLy8gRm9yIGdvb2QtbG9va2luZyBzaW5nYWwgc3RyZW5ndGguCisJCQkJLy8KKwkJCQlTaWduYWxTdHJlbmd0aEluZGV4ID0gTmV0Z2VhclNpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCQkJCQkJCQlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQsCisJCQkJCQkJCXByaXYtPlNpZ25hbFN0cmVuZ3RoKTsKKworCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCA9IFNpZ25hbFN0cmVuZ3RoSW5kZXg7CisJCQkJcHJpdi0+U3RhdHNfU2lnbmFsU3RyZW5ndGggPSBUcmFuc2xhdGVUb0RibTgxODUoKHU4KVNpZ25hbFN0cmVuZ3RoSW5kZXgpOworCQkvLworCQkvLyBXZSBuZWVkIG1vcmUgY29ycmVjdCBwb3dlciBvZiByZWNlaXZlZCBwYWNrZXRzIGFuZCB0aGUgICJTaWduYWxTdHJlbmd0aCIgb2YgUnhTdGF0cyBpcyBiZWF1dGlmaWVkLAorCQkvLyBzbyB3ZSByZWNvcmQgdGhlIGNvcnJlY3QgcG93ZXIgaGVyZS4KKwkJLy8KKwkJCQlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ID0obG9uZykgKHByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgKiA1ICsgKGxvbmcpcHJpdi0+U2lnbmFsUXVhbGl0eSArIDUpIC8gNjsKKwkJCQlwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgPSAobG9uZykocHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyICogNSArIHByaXYtPlJlY3ZTaWduYWxQb3dlciAtMSkgLyA2OworCisJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggYW50ZW5uYSB0aGF0IHJlY2VpdmVkIHRoZSBsYXN0ZWQgcGFja2V0LgorCQkJCXByaXYtPkxhc3RSeFBrdEFudGVubmEgPSBBbnRlbm5hID8gMSA6IDA7IC8vIDA6IGF1eCwgMTogbWFpbi4KKy8vYnkgYW15IDA4MDMxMgorCQkJICAgIFN3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1KGRldiwgcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCQkJfQorCisvL2J5IGFteSBmb3IgYW50ZW5uYQorCisKKworCisKKworI2lmbmRlZiBEVU1NWV9SWAorCQlpZihmaXJzdCl7CisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKwkJCQkvKiBzZWVtcyB0aGF0IEhXIHNvbWV0aW1lcyBmYWlscyB0byByZWljZXZlIGFuZAorCQkJCSAgIGRvZXNuJ3QgcHJvdmlkZSB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coImdvaW5nIHRvIGZyZWUgaW5jb21wbGV0ZSBza2IiKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisJCQkJcHJpdi0+c3RhdHMucnhub2xhc3QrKzsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZnJlZSBpbmNvbXBsZXRlIHNrYiBPSyIpOworI2VuZGlmCisJCQl9CisJCQkvKiBzdXBwb3J0IGZvciBwcmlzbSBoZWFkZXIgaGFzIGJlZW4gb3JpZ2luYWxseSBhZGRlZCBieSBDaHJpc3RpYW4gKi8KKwkJCWlmKHByaXYtPnByaXNtX2hkciAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKworI2lmIDAKKwkJCQlwcml2LT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyK1BSSVNNX0hEUl9TSVpFKTsKKwkJCQlpZighIHByaXYtPnJ4X3NrYikgZ290byBkcm9wOworCisJCQkJcHJpc21faGRyID0gKHUzMiopIHNrYl9wdXQocHJpdi0+cnhfc2tiLFBSSVNNX0hEUl9TSVpFKTsKKwkJCQlwcmlzbV9oZHJbMF09aHRvbmwoMHg4MDIxMTAwMSk7ICAgICAgICAvL3ZlcnNpb24KKwkJCQlwcmlzbV9oZHJbMV09aHRvbmwoMHg0MCk7ICAgICAgICAgICAgICAvL2xlbmd0aAorCQkJCXByaXNtX2hkclsyXT1odG9ubChzdGF0cy5tYWNfdGltZVsxXSk7ICAgIC8vbWFjdGltZSAoSElHSCkKKwkJCQlwcmlzbV9oZHJbM109aHRvbmwoc3RhdHMubWFjX3RpbWVbMF0pOyAgICAvL21hY3RpbWUgKExPVykKKwkJCQlyZHRzYyhwcmlzbV9oZHJbNV0sIHByaXNtX2hkcls0XSk7ICAgICAgICAgLy9ob3N0aW1lIChMT1crSElHSCkKKwkJCQlwcmlzbV9oZHJbNF09aHRvbmwocHJpc21faGRyWzRdKTsgICAgICAgICAgLy9CeXRlLU9yZGVyIGFlbmRlcm4KKwkJCQlwcmlzbV9oZHJbNV09aHRvbmwocHJpc21faGRyWzVdKTsgICAgICAgICAgLy9CeXRlLU9yZGVyIGFlbmRlcm4KKwkJCQlwcmlzbV9oZHJbNl09MHgwMDsgICAgICAgICAgICAgICAgICAgICAvL3BoeXR5cGUKKwkJCQlwcmlzbV9oZHJbN109aHRvbmwocHJpdi0+Y2hhbik7ICAgICAgICAvL2NoYW5uZWwKKwkJCQlwcmlzbV9oZHJbOF09aHRvbmwoc3RhdHMucmF0ZSk7ICAgICAgICAvL2RhdGFyYXRlCisJCQkJcHJpc21faGRyWzldPTB4MDA7ICAgICAgICAgICAgICAgICAgICAgLy9hbnRlbm5hCisJCQkJcHJpc21faGRyWzEwXT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9wcmlvcml0eQorCQkJCXByaXNtX2hkclsxMV09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vc3NpX3R5cGUKKwkJCQlwcmlzbV9oZHJbMTJdPWh0b25sKHN0YXRzLnNpZ25hbCk7ICAgICAvL3NzaV9zaWduYWwKKwkJCQlwcmlzbV9oZHJbMTNdPWh0b25sKHN0YXRzLm5vaXNlKTsgICAgICAvL3NzaV9ub2lzZQorCQkJCXByaXNtX2hkclsxNF09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vcHJlYW1ibGUKKwkJCQlwcmlzbV9oZHJbMTVdPTB4MDA7ICAgICAgICAgICAgICAgICAgICAvL2VuY29kaW5nCisKKyNlbmRpZgorCQkJfWVsc2V7CisJCQkJcHJpdi0+cnhfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMik7CisJCQkJaWYoICFwcml2LT5yeF9za2IpIGdvdG8gZHJvcDsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiQWxsb2MgaW5pdGlhbCBza2IgJXgiLGxlbisyKTsKKyNlbmRpZgorCQkJfQorCisJCQlwcml2LT5yeF9za2JfY29tcGxldGU9MDsKKwkJCXByaXYtPnJ4X3NrYi0+ZGV2PWRldjsKKwkJfWVsc2V7CisJCQkvKiBpZiB3ZSBhcmUgaGVyZSB3ZSBzaG91bGQgIGhhdmUgYWxyZWFkeSBSWGVkCisJCQkqIHRoZSBmaXJzdCBmcmFtZS4KKwkJCSogSWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSBza2IgaXMgbm90IGFsbG9jYXRlZCB0aGVuCisJCQkqIHdlIGhhdmUganVzdCB0aHJvdyBvdXQgZ2FyYmFnZSAoc2tiIG5vdCBhbGxvY2F0ZWQpCisJCQkqIGFuZCB3ZSBhcmUgc3RpbGwgcnhpbmcgZ2FyYmFnZS4uLi4KKwkJCSovCisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKworCQkJCXRtcF9za2I9IGRldl9hbGxvY19za2IocHJpdi0+cnhfc2tiLT5sZW4gK2xlbisyKTsKKworCQkJCWlmKCF0bXBfc2tiKSBnb3RvIGRyb3A7CisKKwkJCQl0bXBfc2tiLT5kZXY9ZGV2OworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJSZWFsbG9jIHNrYiAleCIsbGVuKzIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZ29pbmcgY29weSBwcmV2IGZyYWcgJXgiLHByaXYtPnJ4X3NrYi0+bGVuKTsKKyNlbmRpZgorCQkJCW1lbWNweShza2JfcHV0KHRtcF9za2IscHJpdi0+cnhfc2tiLT5sZW4pLAorCQkJCQlwcml2LT5yeF9za2ItPmRhdGEsCisJCQkJCXByaXYtPnJ4X3NrYi0+bGVuKTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygic2tiIGNvcHkgcHJldiBmcmFnIGNvbXBsZXRlIik7CisjZW5kaWYKKworCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coInByZXYgc2tiIGZyZWUgb2siKTsKKyNlbmRpZgorCisJCQkJcHJpdi0+cnhfc2tiPXRtcF9za2I7CisJCQl9CisJCX0KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJRE1FU0coImdvaW5nIHRvIGNvcHkgY3VycmVudCBwYXlsb2FkICV4IixsZW4pOworI2VuZGlmCisJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpIHsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJCWlmKHBhZGRpbmcpIHsKKwkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsbGVuKSwKKwkJCQkJKCgodW5zaWduZWQgY2hhciAqKXByaXYtPnJ4YnVmZmVyLT5idWYpICsgMiksbGVuKTsKKwkJCX0gZWxzZSB7CisjZW5kaWYKKwkJCQltZW1jcHkoc2tiX3B1dChwcml2LT5yeF9za2IsbGVuKSwKKwkJCQkJcHJpdi0+cnhidWZmZXItPmJ1ZixsZW4pOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQkJfQorI2VuZGlmCisJCX0KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJRE1FU0coImN1cnJlbnQgZnJhZ21lbnQgc2tiIGNvcHkgY29tcGxldGUiKTsKKyNlbmRpZgorCisJCWlmKGxhc3QgJiYgIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSl7CisKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCURNRVNHKCJHb3QgbGFzdCBmcmFnbWVudCIpOworI2VuZGlmCisKKwkJCWlmKHByaXYtPnJ4X3NrYi0+bGVuID4gNCkKKwkJCQlza2JfdHJpbShwcml2LT5yeF9za2IscHJpdi0+cnhfc2tiLT5sZW4tNCk7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQlETUVTRygieWFua2VkIG91dCBjcmMsIHBhc3NpbmcgdG8gdGhlIHVwcGVyIGxheWVyIik7CisjZW5kaWYKKworI2lmbmRlZiBSWF9ET05UX1BBU1NfVUwKKwkJCWlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLAorCQkJCQkgcHJpdi0+cnhfc2tiLCAmc3RhdHMpKXsKKyNpZmRlZiBERUJVR19SWAorCQkJCURNRVNHVygiUGFja2V0IG5vdCBjb25zdW1lZCIpOworI2VuZGlmCisjZW5kaWYgLy8gUlhfRE9OVF9QQVNTX1VMCisKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2IpOworI2lmbmRlZiBSWF9ET05UX1BBU1NfVUwKKwkJCX0KKyNlbmRpZgorI2lmZGVmIERFQlVHX1JYCisJCQllbHNleworCQkJCQlETUVTRygiUmN2IGZyYWciKTsKKwkJCX0KKyNlbmRpZgorCQkJcHJpdi0+cnhfc2tiX2NvbXBsZXRlPTE7CisJCX0KKworI2VuZGlmIC8vRFVNTVlfUlgKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocHJpdi0+cGRldiwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXItPmRtYSwKKwkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplICogXAorCQkJCSAgICBzaXplb2YodTgpLAorCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisKK2Ryb3A6IC8vIHRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgbm90IGVub3VnaHQgbWVtCisKKwkJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciAqLworCQkqKHByaXYtPnJ4cmluZ3RhaWwrMik9cHJpdi0+cnhidWZmZXItPmRtYTsKKwkJKihwcml2LT5yeHJpbmd0YWlsKT0qKHByaXYtPnJ4cmluZ3RhaWwpICZ+IDB4ZmZmOworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPQorCQkJKihwcml2LT5yeHJpbmd0YWlsKSB8IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPQorCQkJKihwcml2LT5yeHJpbmd0YWlsKSB8ICgxPDwzMSk7CisJCQkvL15lbXB0eSBkZXNjcmlwdG9yCisKKwkJCS8vd21iKCk7CisKKyNpZmRlZiBERUJVR19SWAorCQlETUVTRygiQ3VycmVudCBkZXNjcmlwdG9yOiAleCIsKHUzMilwcml2LT5yeHJpbmd0YWlsKTsKKyNlbmRpZgorCQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV9sb2NrLGZsYWdzKTsKKworCQlwcml2LT5yeHJpbmd0YWlsKz1yeF9kZXNjX3NpemU7CisJCWlmKHByaXYtPnJ4cmluZ3RhaWwgPj0KKwkJICAgKHByaXYtPnJ4cmluZykrKHByaXYtPnJ4cmluZ2NvdW50ICkqcnhfZGVzY19zaXplKQorCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisKKwkJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jayxmbGFncyk7CisKKworCQlwcml2LT5yeGJ1ZmZlcj0ocHJpdi0+cnhidWZmZXItPm5leHQpOworCisJfQorCisKKworLy8JaWYoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixwcmlvcml0eSkpCisvLwlpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHByaXYtPmllZWU4MDIxMSwgJnRtcCwgJnRtcDIpOworCisKKworfQorCisKK3ZvaWQgcnRsODE4MF9kbWFfa2ljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisvKgorCisJc3dpdGNoKHByaW9yaXR5KXsKKworCQljYXNlIExPV19QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX0xPV1BSSU9SSVRZX1NISUZUKSB8CisJCQkgICAgICAgIHByaXYtPmRtYV9wb2xsX21hc2spOworCQlicmVhazsKKworCQljYXNlIE5PUk1fUFJJT1JJVFk6CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLAorCQkgICAgICAgKDE8PCBUWF9ETUFfUE9MTElOR19OT1JNUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJCWNhc2UgSElfUFJJT1JJVFk6CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLAorCQkgICAgICAgKDE8PCBUWF9ETUFfUE9MTElOR19ISVBSSU9SSVRZX1NISUZUKSB8CisJCQkgICAgICAgIHByaXYtPmRtYV9wb2xsX21hc2spOworCQlicmVhazsKKworCX0KKyovCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9ETUFfUE9MTElORywKKwkJCSgxIDw8IChwcmlvcml0eSArIDEpKSB8IHByaXYtPmRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKK30KKworI2lmIDAKK3ZvaWQgcnRsODE4MF90eF9xdWV1ZXNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGRtYV9wb2xsX21hc2sgPSAoMTw8VFhfRE1BX1NUT1BfTE9XUFJJT1JJVFlfU0hJRlQpOworCWRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0hJUFJJT1JJVFlfU0hJRlQpOworCWRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX05PUk1QUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfQkVBQ09OX1NISUZUKTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxkbWFfcG9sbF9tYXNrKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgxODBfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgfD0gVFBQT0xMU1RPUF9BQ19WSVE7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcscHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZW5kaWYKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKworCit2b2lkIHJ0bDgxODBfZGF0YV9oYXJkX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmICBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgJj0gfihUUFBPTExTVE9QX0FDX1ZJUSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgJj0gfigxPDxUWF9ETUFfU1RPUF9MT1dQUklPUklUWV9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBUWCBkYXRhIGZyYW1lcyB3aGVuIHRoZSBpZWVlODAyMTEgc3RhY2sgcmVxdWlyZXMgdGhpcy4KKyAqIEl0IGNoZWNrcyBhbHNvIGlmIHdlIG5lZWQgdG8gc3RvcCB0aGUgaWVlZSB0eCBxdWV1ZSwgZXZlbnR1YWxseSBkbyBpdAorICovCit2b2lkIHJ0bDgxODBfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQKK3JhdGUpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBtb2RlOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCXNob3J0IG1vcmVmcmFnID0gKGgtPmZyYW1lX2N0bCkgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcHJpb3JpdHk7CisJLy9zdGF0aWMgaW50IGNvdW50ID0gMDsKKworCW1vZGUgPSBwcml2LT5pZWVlODAyMTEtPml3X21vZGU7CisKKwlyYXRlID0gaWVlZXJhdGUycnRscmF0ZShyYXRlKTsKKwkvKgorCSogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlcXVpcmUgbG9jayBiZWNhdXNlIHdlIG1ha2UKKwkqIHN1cmUgaXQncyBjYWxsZWQgd2l0aCB0aGUgdHhfbG9jayBhbHJlYWR5IGFjcXVpcmVkLgorCSogdGhpcyBjb21lIGZyb20gdGhlIGtlcm5lbCdzIGhhcmRfeG1pdCBjYWxsYmFjayAodHJvdWdodAorCSogdGhlIGllZWUgc3RhY2ssIG9yIGZyb20gdGhlIHRyeV93YWtlX3F1ZXVlIChhZ2FpbiB0cm91Z2h0CisJKiB0aGUgaWVlZSBzdGFjay4KKwkqLworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaW9yaXR5ID0gQUMyUShza2ItPnByaW9yaXR5KTsKKyNlbHNlCisJcHJpb3JpdHkgPSBMT1dfUFJJT1JJVFk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAicHJpb3JpdHkgPSAlZEAlZFxuIiwgcHJpb3JpdHksIGNvdW50KyspOworCWlmICghY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsIHByaW9yaXR5KSl7CisJCS8vRE1FU0coIkVycm9yOiBubyBkZXNjcmlwdG9yIGxlZnQgYnkgcHJldmlvdXMgVFggKGF2YWlsICVkKSAiLAorCQkvLwlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOworCQlETUVTR1coIkVycm9yOiBubyBkZXNjcmlwdG9yIGxlZnQgYnkgcHJldmlvdXMgVFggKGF2YWlsICVkKSAiLAorCQkJZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldiwgcHJpb3JpdHkpKTsKKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiBcbiIpOworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCX0KKwlydGw4MTgwX3R4KGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgcHJpb3JpdHksIG1vcmVmcmFnLDAscmF0ZSk7CisJaWYgKCFjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldiwgcHJpb3JpdHkpKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShwcml2LT5pZWVlODAyMTEpOworCisJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCit9CisKKy8qIFRoaXMgaXMgYSByb3VnaCBhdHRlbXB0IHRvIFRYIGEgZnJhbWUKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBpZWVlIDgwMjExIHN0YWNrIHRvIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICogSWYgdGhlIHJpbmcgaXMgZnVsbCBwYWNrZXQgYXJlIGRyb3BwZWQgKGZvciBkYXRhIGZyYW1lIHRoZSBxdWV1ZQorICogaXMgc3RvcHBlZCBiZWZvcmUgdGhpcyBjYW4gaGFwcGVuKS4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGJldHRlcgorICogaWYgdGhlIGRlc2NyaXB0b3JzIGFyZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtYW5hZ2VtZW50IGZyYW1lCisgKiB3ZSBpbnRlbmQgdG8gVFg6IGknbSB1bnN1cmUgd2hhdCB0aGUgSFcgZG9lcyBpZiBpdCB3aWxsIG5vdCBmb3VuZAorICogdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGRyb3BwZWQuLi4KKyAqIFNpbmNlIHF1ZXVlcyBmb3IgTWFuYWdlbWVudCBhbmQgRGF0YSBmcmFtZXMgYXJlIGRpZmZlcmVudCB3ZQorICogbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxvY2sgdGhhbiB0eF9sb2NrIChmb3IgZXhhbXBsZSBtZ210X3R4X2xvY2spCisgKi8KKy8qIHRoZXNlIGZ1bmN0aW9uIG1heSBsb29wcyBpZiBpbnZva2VkIHdpdGggMCBkZXNjcmlwdG9ycyBvciAwIGxlbiBidWZmZXIqLworaW50IHJ0bDgxODBfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW50IHByaW9yaXR5OworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpb3JpdHkgPSBNQU5BR0VfUFJJT1JJVFk7CisjZWxzZQorCXByaW9yaXR5ID0gTk9STV9QUklPUklUWTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCXJ0bDgxODBfdHgoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBwcmlvcml0eSwKKwkJMCwgMCxpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkpOworCisJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAwOworfQorCisvLyBsb25ncHJlIDE0NCs0OCBzaG9ydHByZSA3MisyNAordTE2IHJ0bDgxODBfbGVuMmR1cmF0aW9uKHUzMiBsZW4sIHNob3J0IHJhdGUsc2hvcnQqIGV4dCkKK3sKKwl1MTYgZHVyYXRpb247CisJdTE2IGRyaWZ0OworCSpleHQ9MDsKKworCXN3aXRjaChyYXRlKXsKKwljYXNlIDA6Ly8xbWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDI7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHgyOworCQlpZihkcmlmdCA9PTAgKSBicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwljYXNlIDE6Ly8ybWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDQ7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHg0OworCQlpZihkcmlmdCA9PTAgKSBicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwljYXNlIDI6IC8vNS41bWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weGI7CisJCWRyaWZ0ID0gKChsZW4rNCk8PDQpICUgMHhiOworCQlpZihkcmlmdCA9PTAgKQorCQkJYnJlYWs7CisJCWR1cmF0aW9uKys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwljYXNlIDM6Ly8xMW1icHMKKwkJKmV4dD0wOworCQlkdXJhdGlvbiA9ICgobGVuKzQpPDw0KSAvMHgxNjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDE2OworCQlpZihkcmlmdCA9PTAgKQorCQkJYnJlYWs7CisJCWR1cmF0aW9uKys7CisJCWlmKGRyaWZ0ID4gNikKKwkJCWJyZWFrOworCQkqZXh0PTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkdXJhdGlvbjsKK30KKworCit2b2lkIHJ0bDgxODBfcHJlcGFyZV9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl1MTYgd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmNuSXR2KTsKKwl3b3JkICY9IH5CY25JdHZfQmNuSXR2OyAvLyBjbGVhciBCY25fSXR2CisJd29yZCB8PSBjcHVfdG9fbGUxNihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOy8vMHg2NDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgd29yZCk7CisKKworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uKHByaXYtPmllZWU4MDIxMSk7CisJaWYoc2tiKXsKKwkJcnRsODE4MF90eChkZXYsc2tiLT5kYXRhLHNrYi0+bGVuLEJFQUNPTl9QUklPUklUWSwKKwkJCTAsMCxpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSkpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwkjaWYgMAorCS8vRE1FU0coInNpemUgJXgiLGxlbik7CisJaWYoKnRhaWwgJiAoMTw8MzEpKXsKKworCQkvL0RNRVNHKCJObyBtb3JlIGJlYWNvbiBUWCBkZXNjIik7CisJCXJldHVybiA7CisKKwl9CisJLy93aGlsZSghICp0YWlsICYgKDE8PDMxKSl7CisJCSp0YWlsPSAwOyAvLyB6ZXJvZXMgaGVhZGVyCisKKwkJKnRhaWwgPSAqdGFpbHwgKDE8PDI5KSA7IC8vZmlzdCBzZWdtZW50IG9mIHRoZSBwYWNrZXQKKwkJKnRhaWwgPSAoKnRhaWwpIHwgKDE8PDI4KTsgLy8gbGFzdCBzZWdtZW50CisJLy8JKnRhaWwgPSAqdGFpbCB8ICgxPDwxOCk7IC8vIHRoaXMgaXMgIGEgYmVhY29uIGZyYW1lCisJCSoodGFpbCszKT0qKHRhaWwrMykgJn4gMHhmZmY7CisJCSoodGFpbCszKT0qKHRhaWwrMykgfCBsZW47IC8vIGJ1ZmZlciBsZW5naHQKKwkJKnRhaWwgPSAqdGFpbCB8bGVuOworCQkvLyB6ZXJvZXMgdGhlIHNlY29uZCAzMi1iaXRzIGR3b3JkIG9mIHRoZSBkZXNjcmlwdG9yCisJCSoodGFpbCsxKT0gMDsKKwkJKnRhaWwgPSAqdGFpbCB8IChyYXRlIDw8IDI0KTsKKworCQkJZHVyYXRpb24gPSBydGw4MTgwX2xlbjJkdXJhdGlvbihsZW4scmF0ZSwmZXh0KTsKKworCQkqKHRhaWwrMSkgPSAqKHRhaWwrMSkgfCAoKGR1cmF0aW9uICYgMHg3ZmZmKTw8MTYpOworCisJCSp0YWlsID0gKnRhaWwgfCAoMTw8MzEpOworCQkvL14gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJCWlmKCh0YWlsIC0gYmVnaW4pLzggPT0gcHJpdi0+dHhiZWFjb25jb3VudC0xKQorCQkJdGFpbD1iZWdpbjsKKwkJZWxzZQorCQkJdGFpbD10YWlsKzg7CisJLy99CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiBkbyB0aGUgcmVhbCBkaXJ0eSB3b3JrOiBpdCBlbnF1ZXVlcyBhIFRYIGNvbW1hbmQKKyAqIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcgYnVmZmVyLCBjb3B5ZXMgdGhlIGZyYW1lIGluIGEgVFggYnVmZmVyCisgKiBhbmQga2lja3MgdGhlIE5JQyB0byBlbnN1cmUgaXQgZG9lcyB0aGUgRE1BIHRyYW5zZmVyLgorICovCitzaG9ydCBydGw4MTgwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4KiB0eGJ1ZiwgaW50IGxlbiwgaW50IHByaW9yaXR5LAorCQkgc2hvcnQgbW9yZWZyYWcsIHNob3J0IGRlc2NmcmFnLCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyICp0YWlsLCp0ZW1wX3RhaWw7CisJdTMyICpiZWdpbjsKKwl1MzIgKmJ1ZjsKKwlpbnQgaTsKKwlpbnQgcmVtYWluOworCWludCBidWZsZW47CisJaW50IGNvdW50OworCS8vdTE2CUFja0N0c1RpbWU7CisJLy91MTYJRnJhbWVUaW1lOworCXUxNiBkdXJhdGlvbjsKKwlzaG9ydCBleHQ7CisJc3RydWN0IGJ1ZmZlciogYnVmbGlzdDsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopdHhidWY7CisJdTggZGVzdFtFVEhfQUxFTl07CisJdTgJCQliVXNlU2hvcnRQcmVhbWJsZSA9IDA7CisJdTgJCQliQ1RTRW5hYmxlID0gMDsKKwl1OAkJCWJSVFNFbmFibGUgPSAwOworCS8vdTE2CQkJUlRTUmF0ZSA9IDIyOworCS8vdTgJCQlSZXRyeUxpbWl0ID0gMDsKKwl1MTYgCQkJRHVyYXRpb24gPSAwOworCXUxNgkJCVJ0c0R1ciA9IDA7CisJdTE2CQkJVGhpc0ZyYW1lVGltZSA9IDA7CisJdTE2CQkJVHhEZXNjRHVyYXRpb24gPSAwOworCXU4IAkJCW93bmJpdF9mbGFnID0gZmFsc2U7IC8vYWRkZWQgYnkgZGF2aWQgd29vIGZvciBzeW5jIFR4LCAyMDA3LjEyLjE0CisjZW5kaWYKKworCXN3aXRjaChwcmlvcml0eSkgeworCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4bWFwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4bWFwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBCS19QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJrcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJrcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJrcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhiZXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHhiZXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhiZXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIFZJX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4dmlwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4dmlwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4dmlwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBWT19QUklPUklUWToKKwkJdGFpbD1wcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eHZvcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eHZvcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhocHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGhwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4aHBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIEJFQUNPTl9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJlYWNvbnJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJlYWNvbnJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJlYWNvbmJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4YmVhY29uY291bnQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKyAJfQorCisJLy9wcmludGsoImluIHJ0bDgxODBfdHgoKTogcmF0ZSBpcyAlZFxuIixwcml2LT5pZWVlODAyMTEtPnJhdGUpOworI2lmIDEKKwkJbWVtY3B5KCZkZXN0LCBmcmFnX2hkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisJCQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpCisJCXsKKwkJCUR1cmF0aW9uID0gMDsKKwkJCVJ0c0R1ciA9IDA7CisJCQliUlRTRW5hYmxlID0gMDsKKwkJCWJDVFNFbmFibGUgPSAwOworCisJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lOworCQl9IGVsc2Ugey8vIFVuaWNhc3QgcGFja2V0CisJCQkvL3U4IEFja1JhdGU7CisJCQl1MTYgQWNrVGltZTsKKworCQkJLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwIGFsaXZlCisJCQlwcml2LT5OdW1UeFVuaWNhc3QrKzsKKworCQkJLy8gRmlndXJlIG91dCBBQ0sgcmF0ZSBhY2NvcmRpbmcgdG8gQlNTIGJhc2ljIHJhdGUgYW5kIFR4IHJhdGUsIDIwMDYuMDMuMDggYnkgcmNuamtvLgorCQkJLy9BY2tSYXRlID0gQ29tcHV0ZUFja1JhdGUoIHBNZ250SW5mby0+bUJyYXRlcywgKHUxQnl0ZSkocFRjYi0+RGF0YVJhdGUpICk7CisJCQkvLyBGaWd1cmUgb3V0IEFDSyB0aW1lIGFjY29yZGluZyB0byB0aGUgQWNrUmF0ZSBhbmQgYXNzdW1lIGxvbmcgcHJlYW1ibGUgaXMgdXNlZCBvbiByZWNlaXZlciwgMjAwNi4wMy4wOCwgYnkgcmNuamtvLgorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSggc0Fja0N0c0xuZy84LCBBY2tSYXRlLCBGQUxTRSwgRkFMU0UpOworCQkJLy9Gb3Igc2ltcGxpY2l0eSwganVzdCB1c2UgdGhlIDFNIGJhc2ljIHJhdGUKKwkJCS8vQWNrVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDU0MCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQlBY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsMCwgMCk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMixmYWxzZSwgZmFsc2UpOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKworCQkJaWYgKCAoKGxlbiArIHNDcmNMbmcpID4gcHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgKQorCQkJeyAvLyBSVFMvQ1RTLgorCQkJCXUxNiBSdHNUaW1lLCBDdHNUaW1lOworCQkJCS8vdTE2IEN0c1JhdGU7CisJCQkJYlJUU0VuYWJsZSA9IDE7CisJCQkJYkNUU0VuYWJsZSA9IDA7CisKKwkJCQkvLyBSYXRlIGFuZCB0aW1lIHJlcXVpcmVkIGZvciBSVFMuCisJCQkJUnRzVGltZSA9IENvbXB1dGVUeFRpbWUoIHNBY2tDdHNMbmcvOCxwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUsIDAsIDApOworCQkJCS8vIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIENUUy4KKwkJCQlDdHNUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgMTAsMCwgMCk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCisJCQkJLy8gRmlndXJlIG91dCB0aW1lIHJlcXVpcmVkIHRvIHRyYW5zbWl0IHRoaXMgZnJhbWUuCisJCQkJVGhpc0ZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgc0NyY0xuZywKKwkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAorCQkJCQkJMCwKKwkJCQkJCWJVc2VTaG9ydFByZWFtYmxlKTsKKworCQkJCS8vIFJUUy1DVFMtVGhpc0ZyYW1lLUFDSy4KKwkJCQlSdHNEdXIgPSBDdHNUaW1lICsgVGhpc0ZyYW1lVGltZSArIEFja1RpbWUgKyAzKmFTaWZzVGltZTsKKworCQkJCVR4RGVzY0R1cmF0aW9uID0gUnRzVGltZSArIFJ0c0R1cjsKKwkJCX0KKwkJCWVsc2Ugey8vIE5vcm1hbCBjYXNlLgorCQkJCWJDVFNFbmFibGUgPSAwOworCQkJCWJSVFNFbmFibGUgPSAwOworCQkJCVJ0c0R1ciA9IDA7CisKKwkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLCBydGw4MTgwX3JhdGUycmF0ZShyYXRlKSwgMCwgYlVzZVNob3J0UHJlYW1ibGUpOworCQkJCVR4RGVzY0R1cmF0aW9uID0gVGhpc0ZyYW1lVGltZSArIGFTaWZzVGltZSArIEFja1RpbWU7CisJCQl9CisKKwkJCWlmKCEoZnJhZ19oZHItPmZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpIHsgLy9ubyBtb3JlIGZyYWdtZW50CisJCQkJLy8gVGhpc0ZyYW1lLUFDSy4KKwkJCQlEdXJhdGlvbiA9IGFTaWZzVGltZSArIEFja1RpbWU7CisJCQl9IGVsc2UgeyAvLyBPbmUgb3IgbW9yZSBmcmFnbWVudHMgcmVtYWluZWQuCisJCQkJdTE2IE5leHRGcmFnVGltZTsKKwkJCQlOZXh0RnJhZ1RpbWUgPSBDb21wdXRlVHhUaW1lKCBsZW4gKyBzQ3JjTG5nLCAvL3ByZXRlbmQgZm9sbG93aW5nIHBhY2tldCBsZW5ndGggZXF1YWwgY3VycmVudCBwYWNrZXQKKwkJCQkJCXJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLAorCQkJCQkJMCwKKwkJCQkJCWJVc2VTaG9ydFByZWFtYmxlICk7CisKKwkJCQkvL1RoaXNGcmFnLUFDay1OZXh0RnJhZy1BQ0suCisJCQkJRHVyYXRpb24gPSBOZXh0RnJhZ1RpbWUgKyAzKmFTaWZzVGltZSArIDIqQWNrVGltZTsKKwkJCX0KKworCQl9IC8vIEVuZCBvZiBVbmljYXN0IHBhY2tldAorCisJCWZyYWdfaGRyLT5kdXJhdGlvbl9pZCA9IER1cmF0aW9uOworI2VuZGlmCisKKwlidWZsZW49cHJpdi0+dHhidWZmc2l6ZTsKKwlyZW1haW49bGVuOworCXRlbXBfdGFpbCA9IHRhaWw7CisvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+YnVmbGVuID0gJWQsIHJlbWFpbiA9ICVkIVxuIiwgYnVmbGVuLHJlbWFpbik7CisJd2hpbGUocmVtYWluIT0wKXsKKyNpZmRlZiBERUJVR19UWF9GUkFHCisJCURNRVNHKCJUWCBpdGVyYXRpb24iKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX1RYCisJCURNRVNHKCJUWDogZmlsbGluZyBkZXNjcmlwdG9yICV4IiwodTMyKXRhaWwpOworI2VuZGlmCisJCW1iKCk7CisJCWlmKCFidWZsaXN0KXsKKwkJCURNRVNHRSgiVFggYnVmZmVyIGVycm9yLCBjYW5ub3QgVFggZnJhbWVzLiBwcmkgJWQuIiwgcHJpb3JpdHkpOworCQkJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlidWY9YnVmbGlzdC0+YnVmOworCisJCWlmKCAoKnRhaWwgJiAoMTw8MzEpKSAmJiAocHJpb3JpdHkgIT0gQkVBQ09OX1BSSU9SSVRZKSl7CisKKwkJCQlETUVTR1coIk5vIG1vcmUgVFggZGVzYywgcmV0dXJuaW5nICV4IG9mICV4IiwKKwkJCQlyZW1haW4sbGVuKTsKKwkJCQlwcml2LT5zdGF0cy50eHJkdSsrOworI2lmZGVmIERFQlVHX1RYX0RFU0MKKwkJCQljaGVja190eF9yaW5nKGRldixwcmlvcml0eSk7CisJCQkvLwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkvLwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworI2VuZGlmCisJCQkvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCQkJcmV0dXJuIHJlbWFpbjsKKworCQl9CisKKwkJKnRhaWw9IDA7IC8vIHplcm9lcyBoZWFkZXIKKwkJKih0YWlsKzEpID0gMDsKKwkJKih0YWlsKzMpID0gMDsKKwkJKih0YWlsKzUpID0gMDsKKwkJKih0YWlsKzYpID0gMDsKKwkJKih0YWlsKzcpID0gMDsKKworCQlpZihwcml2LT5jYXJkXzgxODUpeworCQkJLy9GSVhNRTogdGhpcyBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IEhXIGVuY3J5cHRpb24gcGFyYW1ldGVycy4KKwkJCSp0YWlsIHw9ICgxPDwxNSk7IC8vbm8gZW5jcnlwdAorLy8JCQkqdGFpbCB8PSAoMTw8MzApOyAvL3JhaXNlIGludCB3aGVuIGNvbXBsZXRlZAorCQl9CisJLy8JKnRhaWwgPSAqdGFpbCB8ICgxPDwxNik7CisJCWlmKHJlbWFpbj09bGVuICYmICFkZXNjZnJhZykgeworCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsJLy9hZGRlZCBieSBkYXZpZCB3b28sMjAwNy4xMi4xNAorI2lmZGVmIERFQlVHX1RYX0ZSQUcKKwkJCURNRVNHKCJGaXJzdCBkZXNjcmlwdG9yIik7CisjZW5kaWYKKwkJCSp0YWlsID0gKnRhaWx8ICgxPDwyOSkgOyAvL2Zpc3Qgc2VnbWVudCBvZiB0aGUgcGFja2V0CisJCQkqdGFpbCA9ICp0YWlsIHwobGVuKTsKKwkJfSBlbHNlIHsKKwkJCW93bmJpdF9mbGFnID0gdHJ1ZTsKKwkJfQorCisJCWZvcihpPTA7aTxidWZsZW4mJiByZW1haW4gPjA7aSsrLHJlbWFpbi0tKXsKKwkJCSgodTgqKWJ1ZilbaV09dHhidWZbaV07IC8vY29weSBkYXRhIGludG8gZGVzY3JpcHRvciBwb2ludGVkIERNQWJsZSBidWZmZXIKKwkJCWlmKHJlbWFpbiA9PSA0ICYmIGkrNCA+PSBidWZsZW4pIGJyZWFrOworCQkJLyogZW5zdXJlIHRoZSBsYXN0IGRlc2MgaGFzIGF0IGxlYXN0IDQgYnl0ZXMgcGF5bG9hZCAqLworCisJCX0KKwkJdHhidWYgPSB0eGJ1ZiArIGk7CisJCSoodGFpbCszKT0qKHRhaWwrMykgJn4gMHhmZmY7CisJCSoodGFpbCszKT0qKHRhaWwrMykgfCBpOyAvLyBidWZmZXIgbGVuZ2h0CisJCS8vIFVzZSBzaG9ydCBwcmVhbWJsZSBvciBub3QKKwkJaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkmV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCQkJaWYgKHByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZT09MSAmJiByYXRlIT0wKQkvLyAgc2hvcnQgbW9kZSBub3csIG5vdCBsb25nIQorCQkJLy8JKnRhaWwgfD0gKDE8PDE2KTsJCQkJLy8gZW5hYmxlIHNob3J0IHByZWFtYmxlIG1vZGUuCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJaWYoYkNUU0VuYWJsZSkgeworCQkJKnRhaWwgfD0gKDE8PDE4KTsKKwkJfQorCisJCWlmKGJSVFNFbmFibGUpIC8vcnRzIGVuYWJsZQorCQl7CisJCQkqdGFpbCB8PSAoKGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk8PDE5KTsvL1JUUyBSQVRFCisJCQkqdGFpbCB8PSAoMTw8MjMpOy8vcnRzIGVuYWJsZQorCQkJKih0YWlsKzEpIHw9KFJ0c0R1ciYweGZmZmYpOy8vUlRTIER1cmF0aW9uCisJCX0KKwkJKih0YWlsKzMpIHw9ICgoVHhEZXNjRHVyYXRpb24mMHhmZmZmKTw8MTYpOyAvL0RVUkFUSU9OCisvLwkgICAgICAgICoodGFpbCszKSB8PSAoMHhlNjw8MTYpOworICAgICAgICAJKih0YWlsKzUpIHw9ICgxMTw8OCk7Ly8ocHJpdi0+cmV0cnlfZGF0YTw8OCk7IC8vcmV0cnkgbGltIDsKKyNlbHNlCisJCS8vVXNlIFJUUyBvciBub3QKKyNpZmRlZiBDT05GSUdfUlRMODE4N0IKKwkJaWYgKCAobGVuPnByaXYtPnJ0cykgJiYgcHJpdi0+cnRzICYmIHByaW9yaXR5IT1NQU5BR0VfUFJJT1JJVFkpeworI2Vsc2UKKwkJaWYgKCAobGVuPnByaXYtPnJ0cykgJiYgcHJpdi0+cnRzICYmIHByaW9yaXR5PT1MT1dfUFJJT1JJVFkpeworI2VuZGlmCisJCQkqdGFpbCB8PSAoMTw8MjMpOwkvL2VuYWxiZSBSVFMgZnVuY3Rpb24KKwkJCSp0YWlsIHw9ICgwPDwxOSk7CS8vdXNlIDFNIGJwcyBzZW5kIFJUUyBwYWNrZXQKKwkJCUFja0N0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQlGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIDQsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCAqdGFpbCYoMTw8MTYpKTsKKwkJCS8vIFJUUy9DVFMgdGltZSBpcyBjYWxjdWxhdGUgYXMgZm9sbG93CisJCQlkdXJhdGlvbiA9IEZyYW1lVGltZSArIDMqMTAgKyAyKkFja0N0c1RpbWU7CS8vMTB1cyBpcyB0aGUgU2lmc1RpbWU7CisJCQkqKHRhaWwrMSkgfD0gZHVyYXRpb247IAkvL05lZWQgdG8gZWRpdCBoZXJlISAgLS0tLWhpa2FydQorCQl9ZWxzZXsKKwkJCSoodGFpbCsxKT0gMDsgLy8gemVyb2VzIHRoZSBzZWNvbmQgMzItYml0cyBkd29yZCBvZiB0aGUgZGVzY3JpcHRvcgorCQl9CisjZW5kaWYKKworCQkqdGFpbCA9ICp0YWlsIHwgKChyYXRlJjB4ZikgPDwgMjQpOworCQkvL0RNRVNHKCJyYXRlICVkIixyYXRlKTsKKworCQlpZihwcml2LT5jYXJkXzgxODUpeworCisJCQkjaWYgMAorCQkJKih0YWlsKzUpJj0gfigxPDwyNCk7IC8qIHR4IGFudCAwICovCisKKwkJCSoodGFpbCs1KSAmPSB+KDE8PDIzKTsgLyogcmFuZG9tIHR4IGFnYyAyMy0xNiAqLworCQkJKih0YWlsKzUpIHw9ICgxPDwyMil8KDE8PDIxKXwoMTw8MjApfCgxPDwxOSl8KDE8PDE4KXwoMTw8MTcpfCgxPDwxNik7CisKKwkJCSoodGFpbCs1KSAmPQorfigoMTw8MTUpfCgxPDwxNCl8KDE8PDEzKXwoMTw8MTIpfCgxPDwxMSl8KDE8PDEwKXwoMTw8OSl8KDE8PDgpKTsKKwkJCSoodGFpbCs1KSB8PSAoNzw8OCk7IC8vIE1heCByZXRyeSBsaW1pdAorCisJCQkqKHRhaWwrNSkgJj0gfigoMTw8Nyl8KDE8PDYpfCgxPDw1KXwoMTw8NCl8KDE8PDMpfCgxPDwyKXwoMTw8MSl8KDE8PDApKTsKKwkJCSoodGFpbCs1KSB8PSAoODw8NCk7IC8vIE1heCBjb250ZW50aW9uIHdpbmRvdworCQkJKih0YWlsKzYpIHw9IDQ7IC8vIE1pbiBjb250ZW50aW9uIHdpbmRvdworCQkJI2VuZGlmCisgICAgICAgICAgIC8vICAgIAkqKHRhaWwrNSkgPSAwOworCQl9CisKKwkJLyogaHdfcGxjcF9sZW4gaXMgbm90IHVzZWQgZm9yIHJ0bDgxODAgY2hpcCAqLworCQkvKiBGSVhNRSAqLworCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMCB8fCAhcHJpdi0+aHdfcGxjcF9sZW4peworCisJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbiwKKwkJCQlyYXRlLCZleHQpOworCisKKyNpZmRlZiBERUJVR19UWAorCQkJRE1FU0coIlBMQ1AgZHVyYXRpb24gJWQiLGR1cmF0aW9uICk7CisJCQkvL0RNRVNHKCJkcmlmdCAlZCIsZHJpZnQpOworCQkJRE1FU0coImV4dGVuc2lvbiAlcyIsIChleHQ9PTEpID8gIm9uIjoib2ZmIik7CisjZW5kaWYKKwkJCSoodGFpbCsxKSA9ICoodGFpbCsxKSB8ICgoZHVyYXRpb24gJiAweDdmZmYpPDwxNik7CisJCQlpZihleHQpICoodGFpbCsxKSA9ICoodGFpbCsxKSB8KDE8PDMxKTsgLy9wbGNwIGxlbmd0aCBleHRlbnNpb24KKwkJfQorCisJCWlmKG1vcmVmcmFnKSAqdGFpbCA9ICgqdGFpbCkgfCAoMTw8MTcpOyAvLyBtb3JlIGZyYWdtZW50CisJCWlmKCFyZW1haW4pICp0YWlsID0gKCp0YWlsKSB8ICgxPDwyOCk7IC8vIGxhc3Qgc2VnbWVudCBvZiBmcmFtZQorCisjaWZkZWYgREVCVUdfVFhfRlJBRworCQlpZighcmVtYWluKURNRVNHKCJMYXN0IGRlc2NyaXB0b3IiKTsKKwkJaWYobW9yZWZyYWcpRE1FU0coIk1vcmUgZnJhZyIpOworI2VuZGlmCisgICAgICAgICAgICAgICAqKHRhaWwrNSkgPSAqKHRhaWwrNSl8KDI8PDI3KTsKKyAgICAgICAgICAgICAgICAqKHRhaWwrNykgPSAqKHRhaWwrNyl8KDE8PDQpOworCisJCXdtYigpOworCQlpZihvd25iaXRfZmxhZykKKwkJeworCQkJKnRhaWwgPSAqdGFpbCB8ICgxPDwzMSk7IC8vIGRlc2NyaXB0b3IgcmVhZHkgdG8gYmUgdHhlZAorCQl9CisKKyNpZmRlZiBERUJVR19UWF9ERVNDMgorICAgICAgICAgICAgICAgIHByaW50aygidHggZGVzYyBpczpcbiIpOworCQlETUVTRygiJTh4ICU4eCAlOHggJTh4ICU4eCAlOHggJTh4ICU4eCIsIHRhaWxbMF0sIHRhaWxbMV0sIHRhaWxbMl0sIHRhaWxbM10sCisJCQl0YWlsWzRdLCB0YWlsWzVdLCB0YWlsWzZdLCB0YWlsWzddKTsKKyNlbmRpZgorCisJCWlmKCh0YWlsIC0gYmVnaW4pLzggPT0gY291bnQtMSkKKwkJCXRhaWw9YmVnaW47CisKKwkJZWxzZQorCQkJdGFpbD10YWlsKzg7CisKKwkJYnVmbGlzdD1idWZsaXN0LT5uZXh0OworCisJCW1iKCk7CisKKwkJc3dpdGNoKHByaW9yaXR5KSB7CisJCQljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJCQlwcml2LT50eG1hcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhtYXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIEJLX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4YmtwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eGJrcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQkVfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhiZXByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4YmVwYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWSV9QUklPUklUWToKKwkJCQlwcml2LT50eHZpcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHh2aXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIFZPX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4dm9wcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eHZvcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSElfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhocHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhocGJ1ZnN0YWlsID0gYnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCRUFDT05fUFJJT1JJVFk6CisJCQkJLyogdGhlIEhXIHNlZW1zIHRvIGJlIGhhcHB5IHdpdGggdGhlIDFzdAorCQkJCSAqIGRlc2NyaXB0b3IgZmlsbGVkIGFuZCB0aGUgMm5kIGVtcHR5Li4uCisJCQkJICogU28gYWx3YXlzIHVwZGF0ZSBkZXNjcmlwdG9yIDEgYW5kIG5ldmVyCisJCQkJICogdG91Y2ggMm5kCisJCQkJICovCisJCQkvLwlwcml2LT50eGJlYWNvbnJpbmd0YWlsPXRhaWw7CisJCQkvLwlwcml2LT50eGJlYWNvbmJ1ZnN0YWlsPWJ1Zmxpc3Q7CisKKwkJCQlicmVhazsKKworCQl9CisKKwkJLy9ydGw4MTgwX2RtYV9raWNrKGRldixwcmlvcml0eSk7CisJfQorCSp0ZW1wX3RhaWwgPSAqdGVtcF90YWlsIHwgKDE8PDMxKTsgLy8gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJcnRsODE4MF9kbWFfa2ljayhkZXYscHJpb3JpdHkpOworCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKKworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxODBfcHJpdiAqIHByaXYpOworCisKK3ZvaWQgcnRsODE4MF9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7CisvLwlydGw4MTgwX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlydGw4MTgwX3VwZGF0ZV9tc3IoZGV2KTsKKworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEJTU0lELCgodTMyKiluZXQtPmJzc2lkKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LEJTU0lEKzQsKCh1MTYqKW5ldC0+YnNzaWQpWzJdKTsKKworCisJYmVhY29uX2ludGVydmFsICA9IHJlYWRfbmljX2R3b3JkKGRldixCRUFDT05fSU5URVJWQUwpOworCWJlYWNvbl9pbnRlcnZhbCAmPSB+IEJFQUNPTl9JTlRFUlZBTF9NQVNLOworCWJlYWNvbl9pbnRlcnZhbCB8PSBuZXQtPmJlYWNvbl9pbnRlcnZhbDsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBCRUFDT05fSU5URVJWQUwsIGJlYWNvbl9pbnRlcnZhbCk7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKKworCS8qCisJdTE2IGF0aW0gPSByZWFkX25pY19kd29yZChkZXYsQVRJTSk7CisJdTE2ID0gdTE2ICZ+IEFUSU1fTUFTSzsKKwl1MTYgPSB1MTYgfCBiZWFjb24tPmF0aW07CisJKi8KKyNpZiAwCisJaWYgKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSB7CisJCWlmIChwcml2LT5od193ZXApIHsKKwkJCURNRVNHKCJFbmFibGluZyBoYXJkd2FyZSBXRVAgc3VwcG9ydCIpOworCQkJcnRsODE4MF9zZXRfaHdfd2VwKGRldik7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdD0wOworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MDsKKwkJfQorI2lmbmRlZiBDT05GSUdfSUVFRTgwMjExX05PV0VQCisJCWVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQ9MTsKKwkJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0PTE7CisJCX0KKyNlbmRpZgorCX0KKyNpZm5kZWYgQ09ORklHX0lFRUU4MDIxMV9OT1dFUAorCWVsc2V7CisJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0PTA7CisJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0PTA7CisJfQorI2VuZGlmCisjZW5kaWYKKworCisJaWYocHJpdi0+Y2FyZF84MTg1KQorCQlydGw4MTgwX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKworfQorCit2b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpeworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT4lc1xuIixfX0ZVTkNUSU9OX18pOworCXdyaXRlX25pY19ieXRlKGRldixDT05GSUc0LHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzQpfENPTkZJRzRfUFdSTUdUKTsKKwlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDE7Cit9CisKK3Nob3J0IHJ0bDgxODBfaXNfdHhfcXVldWVfZW1wdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyKiBkOworCisJZm9yIChkID0gcHJpdi0+dHhtYXByaW5nOworCQlkIDwgcHJpdi0+dHhtYXByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eGJrcHJpbmc7CisJCWQgPCBwcml2LT50eGJrcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4YmVwcmluZzsKKwkJZCA8IHByaXYtPnR4YmVwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHh2aXByaW5nOworCQlkIDwgcHJpdi0+dHh2aXByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eHZvcHJpbmc7CisJCWQgPCBwcml2LT50eHZvcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4aHByaW5nOworCQlkIDwgcHJpdi0+dHhocHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKy8qIEZJWE1FIEZJWE1FIDVtc2VjcyBpcyByYW5kb20gKi8KKyNkZWZpbmUgSFdfV0FLRV9ERUxBWSA1CisKK3ZvaWQgcnRsODE4MF9od193YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworCS8vRE1FU0coIldha2VuIHVwISIpOworCXdyaXRlX25pY19ieXRlKGRldixDT05GSUc0LHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzQpJn5DT05GSUc0X1BXUk1HVCk7CisKKwlpZihwcml2LT5yZl93YWtldXApCisJCXByaXYtPnJmX3dha2V1cChkZXYpOworLy8JbWRlbGF5KEhXX1dBS0VfREVMQVkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworfQorCit2b2lkIHJ0bDgxODBfaHdfc2xlZXBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisgICAgICAgLy9ETUVTRygiU2xlZXAhIik7CisKKyAgICAgICAgaWYocHJpdi0+cmZfc2xlZXApCisgICAgICAgICAgICAgICAgcHJpdi0+cmZfc2xlZXAoZGV2KTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7Cit9CisKKwordm9pZCBydGw4MTgwX2h3X3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aCwgdTMyIHRsKQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJdTMyIHJiID0gamlmZmllczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworCisJLyogV3JpdGluZyBIVyByZWdpc3RlciB3aXRoIDAgZXF1YWxzIHRvIGRpc2FibGUKKwkgKiB0aGUgdGltZXIsIHRoYXQgaXMgbm90IHJlYWxseSB3aGF0IHdlIHdhbnQKKwkgKi8KKwl0bCAtPSBNU0VDUyg0KzE2KzcpOworCisJLy9pZih0bCA9PSAwKSB0bCA9IDE7CisKKwkvKiBGSVhNRSBIQUNLIEZJWE1FIEhBQ0sgKi8KKy8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJLy9tZGVsYXkoMSk7CisKKy8vCXJiID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZUUik7CisKKwkvKiBJZiB0aGUgaW50ZXJ2YWwgaW4gd2l0Y2ggd2UgYXJlIHJlcXVlc3RlZCB0byBzbGVlcCBpcyB0b28KKwkgKiBzaG9ydCB0aGVuIGdpdmUgdXAgYW5kIHJlbWFpbiBhd2FrZQorCSAqLworCWlmKCgodGw+PXJiKSYmICh0bC1yYikgPD0gTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKQorCQl8fCgocmI+dGwpJiYgKHJiLXRsKSA8IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisJCXByaW50aygidG9vIHNob3J0IHRvIHNsZWVwXG4iKTsKKwkJcmV0dXJuOworCX0KKworLy8Jd3JpdGVfbmljX2R3b3JkKGRldiwgVGltZXJJbnQsIHRsKTsKKy8vCXJiID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZUUik7CisJeworCQl1MzIgdG1wID0gKHRsPnJiKT8odGwtcmIpOihyYi10bCk7CisJLy8JaWYgKHRsPHJiKQorCisJCS8vbHptLGFkZCwwODA4MjgKKwkJcHJpdi0+RG96ZVBlcmlvZEluUGFzdDJTZWMgKz0gamlmZmllc190b19tc2Vjcyh0bXApOworCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsIHRtcCk7IC8vYXMgdGwgbWF5IGJlIGxlc3MgdGhhbiByYgorCX0KKwkvKiBpZiB3ZSBzdXNwZWN0IHRoZSBUaW1lckludCBpcyBnb25lIGJleW9uZCB0bAorCSAqIHdoaWxlIHNldHRpbmcgaXQsIHRoZW4gZ2l2ZSB1cAorCSAqLworI2lmIDEKKwlpZigoKHRsID4gcmIpICYmICgodGwtcmIpID4gTVNFQ1MoTUFYX1NMRUVQX1RJTUUpKSl8fAorCQkoKHRsIDwgcmIpICYmICgocmItdGwpID4gTVNFQ1MoTUFYX1NMRUVQX1RJTUUpKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKy8vCWlmKHByaXYtPnJmX3NsZWVwKQorLy8JCXByaXYtPnJmX3NsZWVwKGRldik7CisKKwlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworfQorCisKKy8vdm9pZCBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCAqYWNfcGFyYW0pCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICogd29yaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2Usd21tX3BhcmFtX3VwZGF0ZV93cSk7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiopKGllZWUtPnByaXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKwl1OCAqYWNfcGFyYW0gPSAodTggKikoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9wYXJhbSk7CisJdTggbW9kZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlOworCUFDX0NPRElORwllQUNJOworCUFDX1BBUkFNCUFjUGFyYW07CisJUEFDX1BBUkFNCXBBY1BhcmFtOworCXU4IGk7CisKKyNpZm5kZWYgQ09ORklHX1JUTDgxODVCCisgICAgICAgIC8vZm9yIGxlZ2FjeSA4MTg1IGtlZXAgdGhlIFBBUkFNIHVuY2hhbmdlLgorCXJldHVybjsKKyNlbHNlCisJaWYoIWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKXsKKwkJLy9sZWdhY3kgYWNfeHhfcGFyYW0gdXBkYXRlCisJCUFjUGFyYW0ubG9uZ0RhdGEgPSAwOworCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BSUZTTiA9IDI7IC8vIEZvbGxvdyA4MDIuMTEgRElGUy4KKwkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNNID0gMDsKKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21pbiA9IDM7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtaW4uCisJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtYXggPSA3OyAvLyBGb2xsb3cgODAyLjExIENXbWF4LgorCQlBY1BhcmFtLmYuVFhPUExpbWl0ID0gMDsKKwkJZm9yKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspeworCQkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUNJID0gKHU4KWVBQ0k7CisJCQl7CisJCQkJdTgJCXUxYkFJRlM7CisJCQkJdTMyCQl1NGJBY1BhcmFtOworCQkJCXBBY1BhcmFtID0gKFBBQ19QQVJBTSkoJkFjUGFyYW0pOworCQkJCS8vIFJldHJpdmUgcGFyYW10ZXJzIHRvIHVkcGF0ZS4KKwkJCQl1MWJBSUZTID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqKCgobW9kZSZJRUVFX0cpID09IElFRUVfRyk/OToyMCkgKyBhU2lmc1RpbWU7CisJCQkJdTRiQWNQYXJhbSA9ICgoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpPDxBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8CisJCQkJCSAgICAgICgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWF4KSk8PEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKKwkJCQkJICAgICAgKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtaW4pKTw8QUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpfAorCQkJCQkgICAgICAgKCgodTMyKXUxYkFJRlMpIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisJCQkJc3dpdGNoKGVBQ0kpeworCQkJCQljYXNlIEFDMV9CSzoKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JLX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzJfVkk6CisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZPX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXRId1JlZzgxODUoKTppbnZhbGlkIEFDSTogJWQhXG4iLCBlQUNJKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCisJZm9yKGkgPSAwOyBpIDwgQUNfTUFYOyBpKyspeworCQkvL0FjUGFyYW0ubG9uZ0RhdGEgPSAwOworCQlwQWNQYXJhbSA9IChBQ19QQVJBTSAqIClhY19wYXJhbTsKKwkJeworCQkJQUNfQ09ESU5HCWVBQ0k7CisJCQl1OAkJdTFiQUlGUzsKKwkJCXUzMgkJdTRiQWNQYXJhbTsKKworCQkJLy8gUmV0cml2ZSBwYXJhbXRlcnMgdG8gdWRwYXRlLgorCQkJZUFDSSA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUNJOworCQkJLy9Nb2RlIEcvQTogc2xvdFRpbWVUaW1lciA9IDk7IE1vZGUgQjogMjAKKwkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICogKCgobW9kZSZJRUVFX0cpID09IElFRUVfRyk/OToyMCkgKyBhU2lmc1RpbWU7CisJCQl1NGJBY1BhcmFtID0gKAkoKCh1MzIpKHBBY1BhcmFtLT5mLlRYT1BMaW1pdCkpIDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKQl8CisJCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWF4KSkgPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpCXwKKwkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtaW4pKSA8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCkJfAorCQkJCQkoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCQkJc3dpdGNoKGVBQ0kpeworCQkJCWNhc2UgQUMxX0JLOgorCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQzBfQkU6CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDMl9WSToKKwkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLCBlQUNJKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYWNfcGFyYW0gKz0gKHNpemVvZihBQ19QQVJBTSkpOworCX0KKyNlbmRpZgorfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3R4X2lycV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF90eF9pcnFfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisvL3ZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgdm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3ZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfd2F0Y2hfZG9nX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX3dhdGNoX2RvZ193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfaHdfc2xlZXBfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfc3dfYW50ZW5uYV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF9zd19hbnRlbm5hX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisgdm9pZCBydGw4MTgwX3dhdGNoX2RvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgd2F0Y2hfZG9nX2FkYXB0aXZlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgICBzdHJ1Y3QgcjgxODBfcHJpdiogcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOworLy8JRE1FU0coIi0tLS0+d2F0Y2hfZG9nX2FkYXB0aXZlKClcbiIpOworCWlmKCFwcml2LT51cCkKKwl7CisJCURNRVNHKCI8LS0tLXdhdGNoX2RvZ19hZGFwdGl2ZSgpOmRyaXZlciBpcyBub3QgdXAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworICAvLyAgICAgIHF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EpOworLy97YnkgYW15IDA4MDMxMgorI2lmIDEKKwkvLyBUeCBIaWdoIFBvd2VyIE1lY2hhbmlzbS4KKyNpZmRlZiBISUdIX1BPV0VSCisJaWYoQ2hlY2tIaWdoUG93ZXIoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkpCisJeworCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIFR4IFBvd2VyIFRyYWNraW5nIG9uIDg3U0UuCisjaWZkZWYgVFhfVFJBQ0sKKwkvL2lmKCBwcml2LT5iVHhQb3dlclRyYWNrICkJLy9sem0gbW9kIDA4MDgyNgorCWlmKCBDaGVja1R4UHdyVHJhY2tpbmcoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkpOworCQlUeFB3clRyYWNraW5nODdTRSgoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKKyNlbmRpZgorI2VuZGlmCisKKwkvLyBQZXJmb3JtIERJRyBpbW1lZGlhdGVseS4KKyNpZmRlZiBTV19ESUcKKwlpZihDaGVja0RpZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKSA9PSB0cnVlKQorCXsKKwkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisJfQorI2VuZGlmCisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMn0KKyAgIAlydGw4MTgwX3dhdGNoX2RvZygoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKKworCisJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtKTsKKworICAgCXByaXYtPndhdGNoX2RvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSk7CisJYWRkX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworLy8gICAgICAgIERNRVNHKCI8LS0tLXdhdGNoX2RvZ19hZGFwdGl2ZSgpXG4iKTsKK30KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKworc3RhdGljIENIQU5ORUxfTElTVCBDaGFubmVsUGxhbltdID0geworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDE5fSwgIAkJLy9GQ0MKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sICAgICAgICAgICAgICAgICAgICAJCQkJLy9JQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0VUU0kKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAgIC8vU3BhaW4uIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0ZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sOX0sCQkJCQkJLy9NS0sKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LCAzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8vTUtLMQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLy9Jc3JhZWwuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNCwzOCw0Miw0Nn0sMTd9LAkJCS8vIEZvciAxMWEgLCBURUxFQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LDE0fSwgIC8vRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSAvL3dvcmxkIHdpZGUgMTM6IGNoMX5jaDExIGFjdGl2ZSBzY2FuLCBjaDEyfjEzIHBhc3NpdmUgLy9sem0gYWRkIDA4MDgyNgorfTsKKworc3RhdGljIHZvaWQgcnRsODE4MF9zZXRfY2hhbm5lbF9tYXAodTggY2hhbm5lbF9wbGFuLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKworCS8vbHptIGFkZCAwODA4MjYKKwlpZWVlLT5NaW5QYXNzaXZlQ2hubE51bT1NQVhfQ0hBTk5FTF9OVU1CRVIrMTsKKwlpZWVlLT5JYnNzU3RhcnRDaG5sPTA7CisKKwlzd2l0Y2ggKGNoYW5uZWxfcGxhbikKKwl7CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZDQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfSUM6CisJCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1NQQUlOOgorCQljYXNlIENPVU5UUllfQ09ERV9GUkFOQ0U6CisJCWNhc2UgQ09VTlRSWV9DT0RFX01LSzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLMToKKwkJY2FzZSBDT1VOVFJZX0NPREVfSVNSQUVMOgorCQljYXNlIENPVU5UUllfQ09ERV9URUxFQzoKKwkJeworCQkJRG90MTFkX0luaXQoaWVlZSk7CisJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gZmFsc2U7CisJCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW4gIT0gMCl7CisJCQkJLy8gQ2xlYXIgb2xkIGNoYW5uZWwgbWFwCisJCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7CisJCQkJLy8gU2V0IG5ldyBjaGFubmVsIG1hcAorCQkJCWZvciAoaT0wO2k8Q2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW47aSsrKQorCQkJCXsKKwkJCQkJaWYoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldIDw9IDE0KQorCQkJCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV1dID0gMTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOOgorCQl7CisJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmJFbmFibGVkID0gMDsKKwkJCURvdDExZF9SZXNldChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWDovL2x6bSBhZGQgMDgwODI2CisJCXsKKwkJaWVlZS0+TWluUGFzc2l2ZUNobmxOdW09MTI7CisJCWllZWUtPklic3NTdGFydENobmw9IDEwOworCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlEb3QxMWRfSW5pdChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSBmYWxzZTsKKwkJCW1lbXNldChHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCAwLCBzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOworCQkJZm9yIChpPTE7aTw9MTQ7aSsrKQorCQkJeworCQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbaV0gPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKworLy9ZSixhZGQsMDgwODI4CitzdGF0aWMgdm9pZCBydGw4MTgwX3N0YXRpc3RpY3NfaW5pdChzdHJ1Y3QgU3RhdHMgKnBzdGF0cykKK3sKKwltZW1zZXQocHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IFN0YXRzKSk7Cit9CitzdGF0aWMgdm9pZCBydGw4MTgwX2xpbmtfZGV0ZWN0X2luaXQocGxpbmtfZGV0ZWN0X3QgcGxpbmtfZGV0ZWN0KQoreworCW1lbXNldChwbGlua19kZXRlY3QsIDAsIHNpemVvZihsaW5rX2RldGVjdF90KSk7CisJcGxpbmtfZGV0ZWN0LT5TbG90TnVtID0gREVGQVVMVF9TTE9UX05VTTsKK30KKy8vWUosYWRkLDA4MDgyOCxlbmQKKworc2hvcnQgcnRsODE4MF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiB3b3JkOworCXUxNiB2ZXJzaW9uOworCXU4IGh3X3ZlcnNpb247CisJLy91OCBjb25maWczOworCXUzMiB1c1ZhbHVlOworCXUxNiB0bXB1MTY7CisJaW50IGksIGo7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaWYgMAorCWZvcihpPTA7aTwweEZGO2krKykgeworCQlpZihpJTE2ID09IDApCisJCQlwcmludGsoIlxuWyV4XTogIiwgaS8xNik7CisJCXByaW50aygiXHQlNC40eCIsIGVwcm9tX3JlYWQoZGV2LGkpKTsKKwl9CisjZW5kaWYKKwlwcml2LT5jaGFubmVsX3BsYW4gPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX0NPVU5UUllfQ09ERT4+MSkgJiAweEZGOworCWlmKHByaXYtPmNoYW5uZWxfcGxhbiA+IENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOKXsKKwkJcHJpbnRrKCJydGw4MTgwX2luaXQ6RXJyb3IgY2hhbm5lbCBwbGFuISBTZXQgdG8gZGVmYXVsdC5cbiIpOworCQlwcml2LT5jaGFubmVsX3BsYW4gPSAwOworCX0KKwkvL3ByaXYtPmNoYW5uZWxfcGxhbiA9IDk7ICAvL0dsb2JhbCBEb21haW4KKworCURNRVNHKCJDaGFubmVsIHBsYW4gaXMgJWRcbiIscHJpdi0+Y2hhbm5lbF9wbGFuKTsKKwlydGw4MTgwX3NldF9jaGFubmVsX21hcChwcml2LT5jaGFubmVsX3BsYW4sIHByaXYtPmllZWU4MDIxMSk7CisjZWxzZQorCWludCBjaDsKKwkvL1NldCBEZWZhdWx0IENoYW5uZWwgUGxhbgorCWlmKCFjaGFubmVscyl7CisJCURNRVNHKCJObyBjaGFubmVscywgYWJvcnRpbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKwljaD1jaGFubmVsczsKKwlwcml2LT5jaGFubmVsX3BsYW4gPSAwOy8vaGlrYXJ1CisJIC8vIHNldCBjaGFubmVscyAxLi4xNCBhbGxvd2VkIGluIGdpdmVuIGxvY2FsZQorCWZvciAoaT0xOyBpPD0xNDsgaSsrKSB7CisJCShwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwKVtpXSA9ICh1OCkoY2ggJiAweDAxKTsKKwkJY2ggPj49IDE7CisJfQorI2VuZGlmCisKKwkvL21lbWNweShwcml2LT5zdGF0cywwLHNpemVvZihzdHJ1Y3QgU3RhdHMpKTsKKworCS8vRklYTUU6IHRoZXNlIGNvbnN0YW50cyBhcmUgcGxhY2VkIGluIGEgYmFkIHBsZWFjZS4KKwlwcml2LT50eGJ1ZmZzaXplID0gMjA0ODsvLzEwMjQ7CisJcHJpdi0+dHhyaW5nY291bnQgPSAzMjsvLzMyOworCXByaXYtPnJ4YnVmZmVyc2l6ZSA9IDIwNDg7Ly8xMDI0OworCXByaXYtPnJ4cmluZ2NvdW50ID0gNjQ7Ly8zMjsKKwlwcml2LT50eGJlYWNvbmNvdW50ID0gMjsKKwlwcml2LT5yeF9za2JfY29tcGxldGUgPSAxOworCS8vcHJpdi0+dHhucF9wZW5kaW5nLmlzcGVuZGluZz0wOworCS8qIF5eIHRoZSBTS0IgZG9lcyBub3QgY29udGFpbnQgYSBwYXJ0aWFsIFJYZWQKKwkgKiBwYWNrZXQgKGlzIGVtcHR5KQorCSAqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXByaXYtPlJlZ1RocmVlV2lyZU1vZGUgPSBIV19USFJFRV9XSVJFX1NJOworI2Vsc2UKKyAgICAgICAgcHJpdi0+UmVnVGhyZWVXaXJlTW9kZSA9IFNXX1RIUkVFX1dJUkU7CisjZW5kaWYKKyNlbmRpZgorCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IGZhbHNlOworCXByaXYtPlJGUHJvZ1R5cGUgPSAwOworCXByaXYtPmJJbkhjdFRlc3QgPSBmYWxzZTsKKworCXByaXYtPmlycV9lbmFibGVkPTA7CisKKy8vWUosbW9kaWZpZWQsMDgwODI4CisjaWYgMAorCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbD0wOworCXByaXYtPnN0YXRzLnR4cmR1PTA7CisJcHJpdi0+c3RhdHMucnhyZHU9MDsKKwlwcml2LT5zdGF0cy5yeG5vbGFzdD0wOworCXByaXYtPnN0YXRzLnJ4bm9kYXRhPTA7CisJLy9wcml2LT5zdGF0cy5yeHJlc2V0PTA7CisJLy9wcml2LT5zdGF0cy5yeHdya2Fyb3VuZD0wOworCXByaXYtPnN0YXRzLnJ4bm9wb2ludGVyPTA7CisJcHJpdi0+c3RhdHMudHhucGVycj0wOworCXByaXYtPnN0YXRzLnR4cmVzdW1lZD0wOworCXByaXYtPnN0YXRzLnJ4ZXJyPTA7CisJcHJpdi0+c3RhdHMucnhvdmVyZmxvdz0wOworCXByaXYtPnN0YXRzLnJ4aW50PTA7CisJcHJpdi0+c3RhdHMudHhucG9raW50PTA7CisJcHJpdi0+c3RhdHMudHhocG9raW50PTA7CisJcHJpdi0+c3RhdHMudHhocGVycj0wOworCXByaXYtPnN0YXRzLmludHM9MDsKKwlwcml2LT5zdGF0cy5zaGludHM9MDsKKwlwcml2LT5zdGF0cy50eG92ZXJmbG93PTA7CisJcHJpdi0+c3RhdHMudHhiZWFjb249MDsKKwlwcml2LT5zdGF0cy50eGJlYWNvbmVycj0wOworCXByaXYtPnN0YXRzLnR4bHBlcnI9MDsKKwlwcml2LT5zdGF0cy50eGxwb2tpbnQ9MDsKKwlwcml2LT5zdGF0cy50eHJldHJ5PTA7Ly90b255IDIwMDYwNjAxCisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaW49MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZD0wOworCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWF4PTA7CisJcHJpdi0+c3RhdHMucnhpY3ZlcnI9MDsKKyNlbHNlCisJcnRsODE4MF9zdGF0aXN0aWNzX2luaXQoJnByaXYtPnN0YXRzKTsKKwlydGw4MTgwX2xpbmtfZGV0ZWN0X2luaXQoJnByaXYtPmxpbmtfZGV0ZWN0KTsKKyNlbmRpZgorLy9ZSixtb2RpZmllZCwwODA4MjgsZW5kCisKKworCXByaXYtPmFja190eF90b19pZWVlID0gMDsKKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSBERUZBVUxUX0JFQUNPTklOVEVSVkFMOworCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2ZlYXR1cmVzICA9IElFRUVfU09GVE1BQ19TQ0FOIHwKKwkJSUVFRV9TT0ZUTUFDX0FTU09DSUFURSB8IElFRUVfU09GVE1BQ19QUk9CRVJRIHwKKwkJSUVFRV9TT0ZUTUFDX1BST0JFUlMgfCBJRUVFX1NPRlRNQUNfVFhfUVVFVUU7CisJcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5yYXRlID0gMTEwOyAvLzExIG1icHMKKwlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gPSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQgPSAxOworCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0ID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPnN0YV93YWtlX3VwID0gcnRsODE4MF9od193YWtldXA7CisJcHJpdi0+aWVlZTgwMjExLT5wc19yZXF1ZXN0X3R4X2FjayA9IHJ0bDgxODBfcnFfdHhfYWNrOworCXByaXYtPmllZWU4MDIxMS0+ZW50ZXJfc2xlZXBfc3RhdGUgPSBydGw4MTgwX2h3X3NsZWVwOworCXByaXYtPmllZWU4MDIxMS0+cHNfaXNfcXVldWVfZW1wdHkgPSBydGw4MTgwX2lzX3R4X3F1ZXVlX2VtcHR5OworCisJcHJpdi0+aHdfd2VwID0gaHd3ZXA7CisJcHJpdi0+cHJpc21faGRyPTA7CisJcHJpdi0+ZGV2PWRldjsKKwlwcml2LT5yZXRyeV9ydHMgPSBERUZBVUxUX1JFVFJZX1JUUzsKKwlwcml2LT5yZXRyeV9kYXRhID0gREVGQVVMVF9SRVRSWV9EQVRBOworCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IGZhbHNlOworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5SRlByb2dUeXBlID0gMDsKKwlwcml2LT5iSW5IY3RUZXN0ID0gZmFsc2U7CisJcHJpdi0+YkluYWN0aXZlUHMgPSB0cnVlOy8vZmFsc2U7CisJcHJpdi0+aWVlZTgwMjExLT5iSW5hY3RpdmVQcyA9IHByaXYtPmJJbmFjdGl2ZVBzOworCXByaXYtPmJTd1JmUHJvY2Vzc2luZyA9IGZhbHNlOworCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPZmY7CisJcHJpdi0+UmZPZmZSZWFzb24gPSAwOworCXByaXYtPkxlZFN0cmF0ZWd5ID0gU1dfTEVEX01PREUwOworCS8vcHJpdi0+TnVtUnhPa0luUGVyaW9kID0gMDsgIC8vWUosZGVsLDA4MDgyOAorCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kID0gMDsgIC8vWUosZGVsLDA4MDgyOAorCXByaXYtPlR4UG9sbGluZ1RpbWVzID0gMDsvL2x6bSBhZGQgMDgwODI2CisJcHJpdi0+YkxlaXN1cmVQcyA9IHRydWU7CisJcHJpdi0+ZG90MTFQb3dlclNhdmVNb2RlID0gZUFjdGl2ZTsKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJcHJpdi0+QWRNaW5DaGVja1BlcmlvZCA9IDU7CisJcHJpdi0+QWRNYXhDaGVja1BlcmlvZCA9IDEwOworLy8gTG93ZXIgc2lnbmFsIHN0cmVuZ3RoIHRocmVzaG9sZCB0byBmaXQgdGhlIEhXIHBhcnRpY2lwYXRpb24gaW4gYW50ZW5uYSBkaXZlcnNpdHkuICtieSBhbXkgMDgwMzEyCisJcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkID0gMzA7Ly82MC0+MzAKKwlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAyMDsvLzUwLT4yMAorCXByaXYtPkFkQ2hlY2tQZXJpb2QgPSBwcml2LT5BZE1pbkNoZWNrUGVyaW9kOworCXByaXYtPkFkVGlja0NvdW50ID0gMDsKKwlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPSAtMTsKKwlwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPSAwOworCXByaXYtPlJlZ0RlZmF1bHRBbnRlbm5hID0gMDsKKwlwcml2LT5TaWduYWxTdHJlbmd0aCA9IDA7CisJcHJpdi0+QWRSeE9rQ250ID0gMDsKKwlwcml2LT5DdXJyQW50ZW5uYUluZGV4ID0gMDsKKwlwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCA9IDA7CisJaW5pdF90aW1lcigmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOworCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2s7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorLy97YnkgYW15IDA4MDMxMgorCXByaXYtPmJEaWdNZWNoYW5pc20gPSAxOworCXByaXYtPkluaXRpYWxHYWluID0gNjsKKwlwcml2LT5iWHRhbENhbGlicmF0aW9uID0gZmFsc2U7CisJcHJpdi0+WHRhbENhbF9YaW4gPSAwOworCXByaXYtPlh0YWxDYWxfWG91dCA9IDA7CisJcHJpdi0+YlR4UG93ZXJUcmFjayA9IGZhbHNlOworCXByaXYtPlRoZXJtYWxNZXRlciA9IDA7CisJcHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlID0gMDsKKwlwcml2LT5SZWdEaWdPZmRtRmFVcFRoID0gMHhjOyAvLyBVcHBlciB0aHJlaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcyB1c2VkIGluIERJRy4KKwlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID0gMDsKKwlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGUgPSAwOworCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCA9IDA7CisJcHJpdi0+U3RhdHNfU2lnbmFsU3RyZW5ndGggPSAwOworCXByaXYtPkxhc3RSeFBrdEFudGVubmEgPSAwOworCXByaXYtPlNpZ25hbFF1YWxpdHkgPSAwOyAvLyBpbiAwLTEwMCBpbmRleC4KKwlwcml2LT5TdGF0c19TaWduYWxRdWFsaXR5ID0gMDsKKwlwcml2LT5SZWN2U2lnbmFsUG93ZXIgPSAwOyAvLyBpbiBkQm0uCisJcHJpdi0+U3RhdHNfUmVjdlNpZ25hbFBvd2VyID0gMDsKKwlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCA9IDA7CisJcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCA9IDA7CisJcHJpdi0+YkhXQWRTd2l0Y2hlZCA9IGZhbHNlOworCXByaXYtPmJSZWdIaWdoUG93ZXJNZWNoYW5pc20gPSB0cnVlOworCXByaXYtPlJlZ0hpUHdyVXBwZXJUaCA9IDc3OworCXByaXYtPlJlZ0hpUHdyTG93ZXJUaCA9IDc1OworCXByaXYtPlJlZ1JTU0lIaVB3clVwcGVyVGggPSA3MDsKKwlwcml2LT5SZWdSU1NJSGlQd3JMb3dlclRoID0gMjA7CisJcHJpdi0+YkN1ckNDS1BrdCA9IGZhbHNlOworCXByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA9IC0xOworCXByaXYtPmJUb1VwZGF0ZVR4UHdyID0gZmFsc2U7CisJcHJpdi0+Q3VyQ0NLUlNTSSA9IDA7CisJcHJpdi0+UnhQb3dlciA9IDA7CisJcHJpdi0+UlNTSSA9IDA7CisJLy9ZSixhZGQsMDgwODI4CisJcHJpdi0+TnVtVHhPa1RvdGFsID0gMDsKKwlwcml2LT5OdW1UeFVuaWNhc3QgPSAwOworCXByaXYtPmtlZXBBbGl2ZUxldmVsID0gREVGQVVMVF9LRUVQX0FMSVZFX0xFVkVMOworCXByaXYtPlBvd2VyUHJvZmlsZSA9IFBPV0VSX1BST0ZJTEVfQUM7CisJLy9ZSixhZGQsMDgwODI4LGVuZAorLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKyAgICBwcml2LT5DdXJyUmV0cnlDbnQ9MDsKKyAgICBwcml2LT5MYXN0UmV0cnlDbnQ9MDsKKyAgICBwcml2LT5MYXN0VHhva0NudD0wOworICAgIHByaXYtPkxhc3RSeG9rQ250PTA7CisgICAgcHJpdi0+TGFzdFJldHJ5UmF0ZT0wOworICAgIHByaXYtPmJUcnl1cGluZz0wOworICAgIHByaXYtPkN1cnJUeFJhdGU9MDsKKyAgICBwcml2LT5DdXJyUmV0cnlSYXRlPTA7CisgICAgcHJpdi0+VHJ5dXBpbmdDb3VudD0wOworICAgIHByaXYtPlRyeXVwaW5nQ291bnROb0RhdGE9MDsKKyAgICBwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhPTA7CisgICAgcHJpdi0+TGFzdFR4T0tCeXRlcz0wOworICAgIHByaXYtPkxhc3RGYWlsVHhSYXRlPTA7CisgICAgcHJpdi0+TGFzdEZhaWxUeFJhdGVTUz0wOworICAgIHByaXYtPkZhaWxUeFJhdGVDb3VudD0wOworICAgIHByaXYtPkxhc3RUeFRocm91Z2hwdXQ9MDsKKyAgICBwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbD0wOworCXByaXYtPkZvcmNlZERhdGFSYXRlID0gMDsKKwlwcml2LT5SZWdCTW9kZUdhaW5TdGFnZSA9IDE7CisKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisJcHJpdi0+cHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMTowOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5pcnFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV90aF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnBzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5yZl9wc19sb2NrKTsKKwlzZW1hX2luaXQoJnByaXYtPnd4X3NlbSwxKTsKKwlzZW1hX2luaXQoJnByaXYtPnJmX3N0YXRlLDEpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dxLCh2b2lkKikgcnRsODE4MF9yZXN0YXJ0X3dxKTsKKwlJTklUX1dPUksoJnByaXYtPnR4X2lycV93cSwodm9pZCopIHJ0bDgxODBfdHhfaXJxX3dxKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsKHZvaWQqKSBydGw4MTgwX2h3X3dha2V1cF93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EsKHZvaWQqKSBydGw4MTgwX2h3X3NsZWVwX3dxKTsKKwkvL0lOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndhdGNoX2RvZ193cSwodm9pZCopIHJ0bDgxODBfd2F0Y2hfZG9nX3dxKTsKKwkvL0lOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnN3X2FudGVubmFfd3EsKHZvaWQqKSBydGw4MTgwX3N3X2FudGVubmFfd3EpOworCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT53bW1fcGFyYW1fdXBkYXRlX3dxLCh2b2lkKikgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EsKHZvaWQqKXJ0bDgxODBfcmF0ZV9hZGFwdGVyKTsvLytieSBhbXkgMDgwMzEyCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxLCh2b2lkKilydGw4MTgwX2h3X2RpZ193cSk7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxLCh2b2lkKilydGw4MTgwX3R4X3B3X3dxKTsvLytieSBhbXkgMDgwMzEyCisKKwkvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+R1BJT0NoYW5nZVJGV29ya0l0ZW0sKHZvaWQqKSBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKTsKKyNlbHNlCisJSU5JVF9XT1JLKCZwcml2LT5yZXNldF93cSwodm9pZCopIHJ0bDgxODBfcmVzdGFydF93cSxkZXYpOworCUlOSVRfV09SSygmcHJpdi0+dHhfaXJxX3dxLCh2b2lkKikgcnRsODE4MF90eF9pcnFfd3EsZGV2KTsKKwkvL0lOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBydGw4MTgwX3dhdGNoX2RvZ193cSxkZXYpOworCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsKHZvaWQqKSBydGw4MTgwX2h3X3dha2V1cF93cSxkZXYpOworCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od19zbGVlcF93cSwodm9pZCopIHJ0bDgxODBfaHdfc2xlZXBfd3EsZGV2KTsKKwkvL0lOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5zd19hbnRlbm5hX3dxLCh2b2lkKikgcnRsODE4MF9zd19hbnRlbm5hX3dxLGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPndtbV9wYXJhbV91cGRhdGVfd3EsKHZvaWQqKSBydGw4MTgwX3dtbV9wYXJhbV91cGRhdGUscHJpdi0+aWVlZTgwMjExKTsKKyAgICBJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxLCh2b2lkKilydGw4MTgwX3JhdGVfYWRhcHRlcixkZXYpOy8vK2J5IGFteSAwODAzMTIKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxLCh2b2lkKilydGw4MTgwX2h3X2RpZ193cSxkZXYpOy8vK2J5IGFteSAwODAzMTIKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+dHhfcHdfd3EsKHZvaWQqKXJ0bDgxODBfdHhfcHdfd3EsZGV2KTsvLytieSBhbXkgMDgwMzEyCisKKwkvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtLCh2b2lkKikgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjaywgcHJpdi0+aWVlZTgwMjExKTsKKyNlbmRpZgorCS8vSU5JVF9XT1JLKCZwcml2LT5yZXNldF93cSwodm9pZCopIHJ0bDgxODBfcmVzdGFydF93cSxkZXYpOworCisJdGFza2xldF9pbml0KCZwcml2LT5pcnFfcnhfdGFza2xldCwKKwkJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSkgcnRsODE4MF9pcnFfcnhfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwcml2KTsKKy8vYnkgYW15CisgICAgaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT53YXRjaF9kb2dfdGltZXIuZnVuY3Rpb24gPSB3YXRjaF9kb2dfYWRhcHRpdmU7CisvL2J5IGFteQorCisvL3tieSBhbXkgMDgwMzEyCisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorICAgIGluaXRfdGltZXIoJnByaXYtPnJhdGVhZGFwdGVyX3RpbWVyKTsKKyAgICAgICAgcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKyAgICAgICAgcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIuZnVuY3Rpb24gPSB0aW1lcl9yYXRlX2FkYXB0aXZlOworCQlwcml2LT5SYXRlQWRhcHRpdmVQZXJpb2Q9IFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9EOworCQlwcml2LT5iRW5oYW5jZVR4UHdyPWZhbHNlOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKy8vYnkgYW15IDA4MDMxMn0KKwkvL3ByaXYtPmllZWU4MDIxMS0+ZnVuYyA9CisJLy8Ja21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZWxwZXJfZnVuY3Rpb25zKSxHRlBfS0VSTkVMKTsKKwkvL21lbXNldChwcml2LT5pZWVlODAyMTEtPmZ1bmMsIDAsCisJICAvLyAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGVscGVyX2Z1bmN0aW9ucykpOworCisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxODBfaGFyZF9zdGFydF94bWl0OworCXByaXYtPmllZWU4MDIxMS0+c2V0X2NoYW4gPSBydGw4MTgwX3NldF9jaGFuOworCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UgPSBydGw4MTgwX2xpbmtfY2hhbmdlOworCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxODBfaGFyZF9kYXRhX3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfc3RvcCA9IHJ0bDgxODBfZGF0YV9oYXJkX3N0b3A7CisJcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfcmVzdW1lID0gcnRsODE4MF9kYXRhX2hhcmRfcmVzdW1lOworCisgICAgICAgIHByaXYtPmllZWU4MDIxMS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsKKworCXByaXYtPmllZWU4MDIxMS0+c3RhcnRfc2VuZF9iZWFjb25zID0gcnRsODE4MF9zdGFydF90eF9iZWFjb247CisJcHJpdi0+aWVlZTgwMjExLT5zdG9wX3NlbmRfYmVhY29ucyA9IHJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGU7CisJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpdi0+TVdJRW5hYmxlID0gMDsKKworCXByaXYtPlNob3J0UmV0cnlMaW1pdCA9IDc7CisJcHJpdi0+TG9uZ1JldHJ5TGltaXQgPSA3OworCXByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPSA3OworCisJcHJpdi0+Q1NNZXRob2QgPSAoMHgwMSA8PCAyOSk7CisKKwlwcml2LT5UcmFuc21pdENvbmZpZwk9CisJCQkJCQkJCQkxPDxUQ1JfRHVyUHJvY01vZGVfT0ZGU0VUIHwJCS8vZm9yIFJUTDgxODVCLCBkdXJhdGlvbiBzZXR0aW5nIGJ5IEhXCisJCQkJCQkJCQkoNzw8VENSX01YRE1BX09GRlNFVCkgfAkvLyBNYXggRE1BIEJ1cnN0IFNpemUgcGVyIFR4IERNQSBCdXJzdCwgNzogcmVzZXJ2aWVkLgorCQkJCQkJCQkJKHByaXYtPlNob3J0UmV0cnlMaW1pdDw8VENSX1NSTF9PRkZTRVQpIHwJLy8gU2hvcnQgcmV0cnkgbGltaXQKKwkJCQkJCQkJCShwcml2LT5Mb25nUmV0cnlMaW1pdDw8VENSX0xSTF9PRkZTRVQpIHwJLy8gTG9uZyByZXRyeSBsaW1pdAorCQkJCQkJCQkJKDAgPyBUQ1JfU0FUIDogMCk7CS8vIEZBTFNFOiBIVyBwcm92aWVzIFBMQ1AgbGVuZ3RoIGFuZCBMRU5HRVhULCBUVVJFOiBTVyBwcm9pdmVkcyB0aGVtCisKKwlwcml2LT5SZWNlaXZlQ29uZmlnCT0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5DU01ldGhvZCB8CisjZW5kaWYKKy8vCQkJCQkJCQlSQ1JfRU5NQVJQIHwKKwkJCQkJCQkJUkNSX0FNRiB8IFJDUl9BREYgfAkJCQkvL2FjY2VwdCBtYW5hZ2VtZW50L2RhdGEKKwkJCQkJCQkJUkNSX0FDRiB8CQkJCQkJLy9hY2NlcHQgY29udHJvbCBmcmFtZSBmb3IgU1cgQVAgbmVlZHMgUFMtcG9sbCwgMjAwNS4wNy4wNywgYnkgcmNuamtvLgorCQkJCQkJCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJCS8vYWNjZXB0IEJDL01DL1VDCisJCQkJCQkJCS8vUkNSX0FJQ1YgfCBSQ1JfQUNSQzMyIHwgCQkvL2FjY2VwdCBJQ1YvQ1JDIGVycm9yIHBhY2tldAorCQkJCQkJCQkoNzw8UkNSX01YRE1BX09GRlNFVCkgfCAvLyBNYXggRE1BIEJ1cnN0IFNpemUgcGVyIFJ4IERNQSBCdXJzdCwgNzogdW5saW1pdGVkLgorCQkJCQkJCQkocHJpdi0+RWFybHlSeFRocmVzaG9sZDw8UkNSX0ZJRk9fT0ZGU0VUKSB8IC8vIFJ4IEZJRk8gVGhyZXNob2xkLCA3OiBObyBSeCB0aHJlc2hvbGQuCisJCQkJCQkJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkID09IDcgPyBSQ1JfT05MWUVSTFBLVDowKTsKKworCXByaXYtPkludHJNYXNrCQk9IElNUl9UTUdET0sgfCBJTVJfVEJERVIgfCBJTVJfVEhQREVSIHwKKwkJCQkJCQkJSU1SX1RIUERFUiB8IElNUl9USFBET0sgfAorCQkJCQkJCQlJTVJfVFZPREVSIHwgSU1SX1RWT0RPSyB8CisJCQkJCQkJCUlNUl9UVklERVIgfCBJTVJfVFZJRE9LIHwKKwkJCQkJCQkJSU1SX1RCRURFUiB8IElNUl9UQkVET0sgfAorCQkJCQkJCQlJTVJfVEJLREVSIHwgSU1SX1RCS0RPSyB8CisJCQkJCQkJCUlNUl9SRFUgfAkJCQkJCS8vIFRvIGhhbmRsZSB0aGUgZGVmcmFnbWVudGF0aW9uIG5vdCBlbm91Z2ggUnggZGVzY3JpcHRvcnMgY2FzZS4gQW5uaWUsIDIwMDYtMDMtMjcuCisJCQkJCQkJCUlNUl9SRVIgfCBJTVJfUk9LIHwKKwkJCQkJCQkJSU1SX1JRb1NPSzsgLy8gPE5PVEU+IFJPSyBhbmQgUlFvU09LIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIHNvLCB3ZSBtdXN0IGhhbmRsZSBSUW9TT0sgaW50ZXJydXB0IHRvIHJlY2VpdmUgUW9TIGZyYW1lcywgMjAwNS4xMi4wOSwgYnkgcmNuamtvLgorCisJcHJpdi0+SW5pdGlhbEdhaW4gPSA2OworI2VuZGlmCisKKwlod192ZXJzaW9uID0oIHJlYWRfbmljX2R3b3JkKGRldiwgVENSKSAmIFRDUl9IV1ZFUklEX01BU0spPj5UQ1JfSFdWRVJJRF9TSElGVDsKKworCXN3aXRjaCAoaHdfdmVyc2lvbil7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCWNhc2UgSFdfVkVSSURfUjgxODVCX0I6CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Y2FyZF84MTg1ID0gVkVSU0lPTl84MTg3U19DOworCQkgICAgICAgIERNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODdTRSBiL2ciKTsKKwkJCXByaXYtPnBoeV92ZXIgPSAyOworCQkJYnJlYWs7CisjZWxzZQorCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4NUIgYi9nIik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAzOworCQkJcHJpdi0+cGh5X3ZlciA9IDI7CisJCQlicmVhazsKKyNlbmRpZgorI2VuZGlmCisJCWNhc2UgSFdfVkVSSURfUjgxODVfQUJDOgorCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4NSBiL2ciKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDE7CisJCQkvKiB5b3Ugc2hvdWxkIG5vdCBmaW5kIGEgY2FyZCB3aXRoIDgyMjUgUEhZIHZlciA8IEMqLworCQkJcHJpdi0+cGh5X3ZlciA9IDI7CisJCQlicmVhazsKKworCQljYXNlIEhXX1ZFUklEX1I4MTg1X0Q6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg1IGIvZyAoVi4gRCkiKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDI7CisJCQkvKiB5b3Ugc2hvdWxkIG5vdCBmaW5kIGEgY2FyZCB3aXRoIDgyMjUgUEhZIHZlciA8IEMqLworCQkJcHJpdi0+cGh5X3ZlciA9IDI7CisJCQlicmVhazsKKworCQljYXNlIEhXX1ZFUklEX1I4MTgwX0FCQ0Q6CisJCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwIik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBIV19WRVJJRF9SODE4MF9GOgorCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4MCAodi4gRikiKTsKKwkJCXByaXYtPmNhcmRfODE4NSA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRE1FU0dXKCJNQUMgY2hpcCBub3QgcmVjb2duaXplZDogdmVyc2lvbiAleC4gQXNzdW1pbmcgUlRMODE4MCIsaHdfdmVyc2lvbik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAwOworCQkJYnJlYWs7CisJfQorCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047CisJCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7CisJfQorCS8qIHlvdSBzaG91bGQgbm90IGZvdW5kIGFueSA4MTg1IFZlciBCIENhcmQgKi8KKwlwcml2LT5jYXJkXzgxODVfQnZlcnNpb24gPSAwOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIGp1c3QgZm9yIHN5bmMgODUKKwlwcml2LT5jYXJkX3R5cGUgPSBQQ0k7CisgICAgICAgIERNRVNHKCJUaGlzIGlzIGEgUENJIE5JQyIpOworI2Vsc2UKKwljb25maWczID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCWlmKGNvbmZpZzMgJiAweDgpeworCQlwcml2LT5jYXJkX3R5cGUgPSBDQVJEQlVTOworCQlETUVTRygiVGhpcyBpcyBhIENBUkRCVVMgTklDIik7CisJfQorCWVsc2UgaWYoIGNvbmZpZzMgJiAweDQpeworCQlwcml2LT5jYXJkX3R5cGUgPSBNSU5JUENJOworCQlETUVTRygiVGhpcyBpcyBhIE1JTkktUENJIE5JQyIpOworCX1lbHNleworCQlwcml2LT5jYXJkX3R5cGUgPSBQQ0k7CisJCURNRVNHKCJUaGlzIGlzIGEgUENJIE5JQyIpOworCX0KKyNlbmRpZgorI2VuZGlmCisJcHJpdi0+ZW5hYmxlX2dwaW8wID0gMDsKKworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9TV19SRVZEX09GRlNFVCk7CisJRE1FU0coInVzVmFsdWUgaXMgMHgleFxuIix1c1ZhbHVlKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8zUmVhZCBBbnRlbm5hRGl2ZXJzaXR5CisJLy8gU1cgQW50ZW5uYSBEaXZlcnNpdHkuCisJaWYoCSh1c1ZhbHVlICYgRUVQUk9NX1NXX0FEX01BU0spICE9IEVFUFJPTV9TV19BRF9FTkFCTEUgKQorCXsKKwkJcHJpdi0+RUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5ID0gZmFsc2U7CisJCS8vcHJpbnRrKCJFRVBST00gRGlzYWJsZSBTVyBBbnRlbm5hIERpdmVyc2l0eVxuIik7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPkVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eSA9IHRydWU7CisJCS8vcHJpbnRrKCJFRVBST00gRW5hYmxlIFNXIEFudGVubmEgRGl2ZXJzaXR5XG4iKTsKKwl9CisJLy8gRGVmYXVsdCBBbnRlbm5hIHRvIHVzZS4KKwlpZiggKHVzVmFsdWUgJiBFRVBST01fREVGX0FOVF9NQVNLKSAhPSBFRVBST01fREVGX0FOVF8xICkKKwl7CisJCXByaXYtPkVFUFJPTURlZmF1bHRBbnRlbm5hMSA9IGZhbHNlOworCQkvL3ByaW50aygiRUVQUk9NIERlZmF1bHQgQW50ZW5uYSAwXG4iKTsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+RUVQUk9NRGVmYXVsdEFudGVubmExID0gdHJ1ZTsKKwkJLy9wcmludGsoIkVFUFJPTSBEZWZhdWx0IEFudGVubmEgMVxuIik7CisJfQorCisJLy8KKwkvLyBBbnRlbm5hIGRpdmVyc2l0eSBtZWNoYW5pc20uIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjExLjA1LgorCS8vCisJaWYoIHByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9PSAwICkgLy8gQXV0bworCXsvLyAwOiBkZWZhdWx0IGZyb20gRUVQUk9NLgorCQlwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgPSBwcml2LT5FRVBST01Td0FudGVubmFEaXZlcnNpdHk7CisJfQorCWVsc2UKKwl7Ly8gMTpkaXNhYmxlIGFudGVubmEgZGl2ZXJzaXR5LCAyOiBlbmFibGUgYW50ZW5uYSBkaXZlcnNpdHkuCisJCXByaXYtPmJTd0FudGVubmFEaXZlcml0eSA9ICgocHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID09IDEpPyBmYWxzZSA6IHRydWUpOworCX0KKwkvL3ByaW50aygiYlN3QW50ZW5uYURpdmVyaXR5ID0gJWRcbiIsIHByaXYtPmJTd0FudGVubmFEaXZlcml0eSk7CisKKworCS8vCisJLy8gRGVmYXVsdCBhbnRlbm5hIHNldHRpbmdzLiBBZGRlZCBieSBSb2dlciwgMjAwNy4xMS4wNS4KKwkvLworCWlmKCBwcml2LT5SZWdEZWZhdWx0QW50ZW5uYSA9PSAwKQorCXsvLyAwOiBkZWZhdWx0IGZyb20gRUVQUk9NLgorCQlwcml2LT5iRGVmYXVsdEFudGVubmExID0gcHJpdi0+RUVQUk9NRGVmYXVsdEFudGVubmExOworCX0KKwllbHNlCisJey8vIDE6IG1haW4sIDI6IGF1eC4KKwkJcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSA9ICgocHJpdi0+UmVnRGVmYXVsdEFudGVubmE9PSAyKSA/IHRydWUgOiBmYWxzZSk7CisJfQorCS8vcHJpbnRrKCJiRGVmYXVsdEFudGVubmExID0gJWRcbiIsIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEpOworI2VuZGlmCisjZW5kaWYKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJLyogcnRsODE4NSBjYW4gY2FsYyBwbGNwIGxlbiBpbiBIVy4qLworCXByaXYtPmh3X3BsY3BfbGVuID0gMTsKKworCXByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZSA9IDI7CisJLyp0aGUgZWVwcm9tIHR5cGUgaXMgc3RvcmVkIGluIFJDUiByZWdpc3RlciBiaXQgIzYgKi8KKwlpZiAoUkNSXzkzNTZTRUwgJiByZWFkX25pY19kd29yZChkZXYsIFJDUikpeworCQlwcml2LT5lcHJvbXR5cGU9RVBST01fOTNjNTY7CisJCS8vRE1FU0coIlJlcG9ydGVkIEVFUFJPTSBjaGlwIGlzIGEgOTNjNTYgKDJLYml0KSIpOworCX1lbHNleworCQlwcml2LT5lcHJvbXR5cGU9RVBST01fOTNjNDY7CisJCS8vRE1FU0coIlJlcG9ydGVkIEVFUFJPTSBjaGlwIGlzIGEgOTNjNDYgKDFLYml0KSIpOworCX0KKworCWRldi0+Z2V0X3N0YXRzID0gcnRsODE4MF9zdGF0czsKKworCWRldi0+ZGV2X2FkZHJbMF09ZXByb21fcmVhZChkZXYsTUFDX0FEUikgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMV09KGVwcm9tX3JlYWQoZGV2LE1BQ19BRFIpICYgMHhmZjAwKT4+ODsKKwlkZXYtPmRldl9hZGRyWzJdPWVwcm9tX3JlYWQoZGV2LE1BQ19BRFIrMSkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbM109KGVwcm9tX3JlYWQoZGV2LE1BQ19BRFIrMSkgJiAweGZmMDApPj44OworCWRldi0+ZGV2X2FkZHJbNF09ZXByb21fcmVhZChkZXYsTUFDX0FEUisyKSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcls1XT0oZXByb21fcmVhZChkZXYsTUFDX0FEUisyKSAmIDB4ZmYwMCk+Pjg7CisJLy9ETUVTRygiQ2FyZCBNQUMgYWRkcmVzcyBpcyAiTUFDX0ZNVCwgTUFDX0FSRyhkZXYtPmRldl9hZGRyKSk7CisKKworCWZvcihpPTEsaj0wOyBpPDE0OyBpKz0yLGorKyl7CisKKwkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfQ0gxXzIgKyBqKTsKKwkJcHJpdi0+Y2h0eHB3cltpXT13b3JkICYgMHhmZjsKKwkJcHJpdi0+Y2h0eHB3cltpKzFdPSh3b3JkICYgMHhmZjAwKT4+ODsKKyNpZmRlZiBERUJVR19FUFJPTQorCQlETUVTRygidHggd29yZCAleDoleCIsaix3b3JkKTsKKwkJRE1FU0coImNoICVkIHB3ciAleCIsaSxwcml2LT5jaHR4cHdyW2ldKTsKKwkJRE1FU0coImNoICVkIHB3ciAleCIsaSsxLHByaXYtPmNodHhwd3JbaSsxXSk7CisjZW5kaWYKKwl9CisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJZm9yKGk9MSxqPTA7IGk8MTQ7IGkrPTIsaisrKXsKKworCQkJd29yZCA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX1RYUFdfT0ZETV9DSDFfMiArIGopOworCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2ldPXdvcmQgJiAweGZmOworCQkJcHJpdi0+Y2h0eHB3cl9vZmRtW2krMV09KHdvcmQgJiAweGZmMDApPj44OworI2lmZGVmIERFQlVHX0VQUk9NCisJCQlETUVTRygib2ZkbSB0eCB3b3JkICV4OiV4IixqLHdvcmQpOworCQkJRE1FU0coIm9mZG0gY2ggJWQgcHdyICV4IixpLHByaXYtPmNodHhwd3Jfb2ZkbVtpXSk7CisJCQlETUVTRygib2ZkbSBjaCAlZCBwd3IgJXgiLGkrMSxwcml2LT5jaHR4cHdyX29mZG1baSsxXSk7CisjZW5kaWYKKwkJfQorCX0KKy8ve2J5IGFteSAwODAzMTIKKwkvLzNSZWFkIGNyeXN0YWwgY2FsaWJ0cmF0aW9uIGFuZCB0aGVybWFsIG1ldGVyIGluZGljYXRpb24gb24gODdTRS4KKworCS8vIEJ5IFNEMyBTWSdzIHJlcXVlc3QuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCisJdG1wdTE2ID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9SU1Y+PjEpOworCisJLy9wcmludGsoIlJlYWRBZGFwdGVySW5mbzgxODUoKTogRUVQUk9NX1JTViglMDR4KVxuIiwgdG1wdTE2KTsKKworCQkvLyBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4gYW5kIFhvdXQgcmVzcC4KKwkJcHJpdi0+WHRhbENhbF9Yb3V0ID0gdG1wdTE2ICYgRUVQUk9NX1hUQUxfQ0FMX1hPVVRfTUFTSzsgLy8gMH43LjVwRgorCQlwcml2LT5YdGFsQ2FsX1hpbiA9ICh0bXB1MTYgJiBFRVBST01fWFRBTF9DQUxfWElOX01BU0spPj40OyAvLyAwfjcuNXBGCisJCWlmKCh0bXB1MTYgJiBFRVBST01fWFRBTF9DQUxfRU5BQkxFKT4+MTIpCisJCQlwcml2LT5iWHRhbENhbGlicmF0aW9uID0gdHJ1ZTsKKworCQkvLyBUaGVybWFsIG1ldGVyIHJlZmVyZW5jZSBpbmRpY2F0aW9uLgorCQlwcml2LT5UaGVybWFsTWV0ZXIgPSAgKHU4KSgodG1wdTE2ICYgRUVQUk9NX1RIRVJNQUxfTUVURVJfTUFTSyk+PjgpOworCQlpZigodG1wdTE2ICYgRUVQUk9NX1RIRVJNQUxfTUVURVJfRU5BQkxFKT4+MTMpCisJCQlwcml2LT5iVHhQb3dlclRyYWNrID0gdHJ1ZTsKKworLy9ieSBhbXkgMDgwMzEyfQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXdvcmQgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9UWFBXX0JBU0UpOworCXByaXYtPmNja190eHB3cl9iYXNlID0gd29yZCAmIDB4ZjsKKwlwcml2LT5vZmRtX3R4cHdyX2Jhc2UgPSAod29yZD4+NCkgJiAweGY7CisjZW5kaWYKKworCXZlcnNpb24gPSBlcHJvbV9yZWFkKGRldixFUFJPTV9WRVJTSU9OKTsKKwlETUVTRygiRUVQUk9NIHZlcnNpb24gJXgiLHZlcnNpb24pOworCWlmKCAoIXByaXYtPmNhcmRfODE4NSkgJiYgdmVyc2lvbiA8IDB4MDEwMSl7CisJCURNRVNHICgiRUVQUk9NIHZlcnNpb24gdG9vIG9sZCwgYXNzdW1pbmcgZGVmYXVsdHMiKTsKKwkJRE1FU0cgKCJJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSAqcGxhc2UqIHNlbmQgeW91ciBcCitETUVTRyBvdXRwdXQgdG8gYW5kcmVhbXJsQHRpc2NhbGkuaXQgVEhBTktTIik7CisJCXByaXYtPmRpZ3BoeT0xOworCQlwcml2LT5hbnRiPTA7CisJCXByaXYtPmRpdmVyc2l0eT0xOworCQlwcml2LT5jc190cmVzaG9sZD0weGM7CisJCXByaXYtPnJjcl9jc2Vuc2U9MTsKKwkJcHJpdi0+cmZfY2hpcD1SRkNISVBJRF9QSElMSVBTOworCX1lbHNleworCQlpZighcHJpdi0+Y2FyZF84MTg1KXsKKwkJCXU4IHJmcGFyYW0gPSBlcHJvbV9yZWFkKGRldixSRl9QQVJBTSk7CisJCQlETUVTRygiUmZQYXJhbTogJXgiLHJmcGFyYW0pOworCisJCQlwcml2LT5kaWdwaHkgPSByZnBhcmFtICYgKDE8PFJGX1BBUkFNX0RJR1BIWV9TSElGVCkgPyAwOjE7CisJCQlwcml2LT5hbnRiID0gIHJmcGFyYW0gJiAoMTw8UkZfUEFSQU1fQU5UQkRFRkFVTFRfU0hJRlQpID8gMTowOworCisJCQlwcml2LT5yY3JfY3NlbnNlID0gKHJmcGFyYW0gJiBSRl9QQVJBTV9DQVJSSUVSU0VOU0VfTUFTSykgPj4KKwkJCQkJUkZfUEFSQU1fQ0FSUklFUlNFTlNFX1NISUZUOworCisJCQlwcml2LT5kaXZlcnNpdHkgPQorCQkJCShyZWFkX25pY19ieXRlKGRldixDT05GSUcyKSYoMTw8Q09ORklHMl9BTlRFTk5BX1NISUZUKSkgPyAxOjA7CisJCX1lbHNleworCQkJcHJpdi0+cmNyX2NzZW5zZSA9IDM7CisJCX0KKworCQlwcml2LT5jc190cmVzaG9sZCA9IChlcHJvbV9yZWFkKGRldixFTkVSR1lfVFJFU0hPTEQpJjB4ZmYwMCkgPj44OworCisJCXByaXYtPnJmX2NoaXAgPSAweGZmICYgZXByb21fcmVhZChkZXYsUkZDSElQSUQpOworCX0KKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwlwcml2LT5yZl9jaGlwID0gUkZfWkVCUkE0OworCXByaXYtPnJmX3NsZWVwID0gcnRsODIyNXo0X3JmX3NsZWVwOworCXByaXYtPnJmX3dha2V1cCA9IHJ0bDgyMjV6NF9yZl93YWtldXA7CisjZWxzZQorICAgICAgICBwcml2LT5yZl9jaGlwID0gUkZfWkVCUkEyOworI2VuZGlmCisJLy9ETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIFJlYWx0ZWsgODIyNXoyIik7CisJLy9ETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCS8vRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTU0ZVTC9VTlNVQ0NFU1NGVUwgVE8gUmVhbHRlayEiKTsKKworCXByaXYtPnJmX2Nsb3NlID0gcnRsODIyNXoyX3JmX2Nsb3NlOworCXByaXYtPnJmX2luaXQgPSBydGw4MjI1ejJfcmZfaW5pdDsKKwlwcml2LT5yZl9zZXRfY2hhbiA9IHJ0bDgyMjV6Ml9yZl9zZXRfY2hhbjsKKwlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CisJLy9wcml2LT5yZl9zbGVlcCA9IHJ0bDgyMjVfcmZfc2xlZXA7CisJLy9wcml2LT5yZl93YWtldXAgPSBydGw4MjI1X3JmX3dha2V1cDsKKworI2Vsc2UKKwkvKiBjaGVjayBSRiBmcm9udGVuZCBjaGlwc2V0ICovCisJc3dpdGNoIChwcml2LT5yZl9jaGlwKSB7CisKKwkJY2FzZSBSRkNISVBJRF9SVEw4MjI1OgorCisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCQlETUVTRygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIFJlYWx0ZWsgODIyNSIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCURNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwkJCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTUy9JTlNVQ0NFU1MgVE8gYW5kcmVhbXJsQHRpc2NhbGkuaXQiKTsKKworCQkJcHJpdi0+cmZfY2xvc2UgPSBydGw4MjI1X3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IHJ0bDgyMjVfcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODIyNV9yZl9zZXRfY2hhbjsKKwkJCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKKwkJCXByaXYtPnJmX3NsZWVwID0gcnRsODIyNV9yZl9zbGVlcDsKKwkJCXByaXYtPnJmX3dha2V1cCA9IHJ0bDgyMjVfcmZfd2FrZXVwOworCisJCX1lbHNleworCQkJRE1FU0dXKCJEZXRlY3RlZCBSVEw4MjI1IHJhZGlvIG9uIGEgY2FyZCByZWNvZ25pemVkIGFzIFJUTDgxODAiKTsKKwkJCURNRVNHVygiVGhpcyBjb3VsZCBub3QgYmUuLi4gc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4uIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9SVEw4MjU1OgorCQlpZihwcml2LT5jYXJkXzgxODUpeworCQkJRE1FU0coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBSZWFsdGVrIDgyNTUiKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJCQlETUVTR1coIioqUExFQVNFKiogUkVQT1JUIFNVQ0NFU1MvSU5TVUNDRVNTIFRPIGFuZHJlYW1ybEB0aXNjYWxpLml0Iik7CisKKwkJCXByaXYtPnJmX2Nsb3NlID0gcnRsODI1NV9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBydGw4MjU1X3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IHJ0bDgyNTVfcmZfc2V0X2NoYW47CisJCQlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CisJCQlwcml2LT5yZl9zbGVlcCA9IE5VTEw7CisJCQlwcml2LT5yZl93YWtldXAgPSBOVUxMOworCisJCX1lbHNleworCQkJRE1FU0dXKCJEZXRlY3RlZCBSVEw4MjU1IHJhZGlvIG9uIGEgY2FyZCByZWNvZ25pemVkIGFzIFJUTDgxODAiKTsKKwkJCURNRVNHVygiVGhpcyBjb3VsZCBub3QgYmUuLi4gc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4uIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIFJGQ0hJUElEX0lOVEVSU0lMOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgSW50ZXJzaWwuIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBOTyBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZDSElQSURfUkZNRDoKKwkJCURNRVNHVygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IFJGTUQuIik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBOTyBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZDSElQSURfR0NUOgorCQkJRE1FU0dXKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgR0NULiIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCURNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwkJCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTUy9JTlNVQ0NFU1MgVE8gYW5kcmVhbXJsQHRpc2NhbGkuaXQiKTsKKwkJCXByaXYtPnJmX2Nsb3NlID0gZ2N0X3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IGdjdF9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBnY3RfcmZfc2V0X2NoYW47CisJCQlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CisJCQlwcml2LT5yZl9zbGVlcCA9IE5VTEw7CisJCQlwcml2LT5yZl93YWtldXAgPSBOVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9NQVhJTToKKwkJCURNRVNHVygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IE1BWElNLiIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkJCURNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwkJCURNRVNHVygiKipQTEVBU0UqKiBSRVBPUlQgU1VDQ0VTUy9JTlNVQ0NFU1MgVE8gYW5kcmVhbXJsQHRpc2NhbGkuaXQiKTsKKwkJCXByaXYtPnJmX2Nsb3NlID0gbWF4aW1fcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gbWF4aW1fcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gbWF4aW1fcmZfc2V0X2NoYW47CisJCQlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CisJCQlwcml2LT5yZl9zbGVlcCA9IE5VTEw7CisJCQlwcml2LT5yZl93YWtldXAgPSBOVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRkNISVBJRF9QSElMSVBTOgorCQkJRE1FU0coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBQaGlsaXBzLiIpOworCQkJRE1FU0coIk9LISBQaGlsaXBzIFNBMjQwMCByYWRpbyBjaGlwc2V0IGlzIHN1cHBvcnRlZC4iKTsKKwkJCXByaXYtPnJmX2Nsb3NlID0gc2EyNDAwX3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IHNhMjQwMF9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBzYTI0MDBfcmZfc2V0X2NoYW47CisJCQlwcml2LT5yZl9zZXRfc2VucyA9IHNhMjQwMF9yZl9zZXRfc2VuczsKKwkJCXByaXYtPnNlbnMgPSBTQTI0MDBfUkZfREVGX1NFTlM7IC8qIGRlZmF1bHQgc2Vuc2l0aXZpdHkgKi8KKwkJCXByaXYtPm1heF9zZW5zID0gU0EyNDAwX1JGX01BWF9TRU5TOyAvKiBtYXhpbXVtIHNlbnNpdGl2aXR5ICovCisJCQlwcml2LT5yZl9zbGVlcCA9IE5VTEw7CisJCQlwcml2LT5yZl93YWtldXAgPSBOVUxMOworCisJCQlpZihwcml2LT5kaWdwaHkpeworCQkJCURNRVNHVygiRGlnaXRhbCBQSFkgZm91bmQiKTsKKwkJCQlETUVTR1coIlBoaWxpcHMgRElHSVRBTCBQSFkgaXMgdW50ZXN0ZWQhICpQbGVhc2UqXAorCXJlcG9ydCBzdWNjZXNzL2ZhaWx1cmUgdG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiIpOworCQkJfWVsc2V7CisJCQkJRE1FU0cgKCJBbmFsb2cgUEhZIGZvdW5kIik7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlETUVTR1coIlVua25vd24gUkYgbW9kdWxlICV4Iixwcml2LT5yZl9jaGlwKTsKKwkJCURNRVNHVygiRXhpdGluZy4uLiIpOworCQkJcmV0dXJuIC0xOworCisJfQorI2VuZGlmCisKKworCWlmKCFwcml2LT5jYXJkXzgxODUpeworCQlpZihwcml2LT5hbnRiKQorCQkJRE1FU0cgKCJBbnRlbm5hIEIgaXMgZGVmYXVsdCBhbnRlbm5hIik7CisJCWVsc2UKKwkJCURNRVNHICgiQW50ZW5uYSBBIGlzIGRlZmF1bHQgYW50ZW5uYSIpOworCisJCWlmKHByaXYtPmRpdmVyc2l0eSkKKwkJCURNRVNHICgiQW50ZW5uYSBkaXZlcnNpdHkgaXMgZW5hYmxlZCIpOworCQllbHNlCisJCQlETUVTRygiQW50ZW5uYSBkaXZlcnNpdHkgaXMgZGlzYWJsZWQiKTsKKworCQlETUVTRygiQ2FycmllciBzZW5zZSAlZCIscHJpdi0+cmNyX2NzZW5zZSk7CisJfQorCisJaWYgKDAhPWFsbG9jX3J4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnJ4YnVmZmVyc2l6ZSwgcHJpdi0+cnhyaW5nY291bnQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfVklQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJICBUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhiZWFjb25jb3VudCwKKwkJCQkgIFRYX0JFQUNPTl9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCisJLy9wcml2LT5iZWFjb25fYnVmPU5VTEw7CisKKwlpZighcHJpdi0+Y2FyZF84MTg1KXsKKworCQlpZihyZWFkX25pY19ieXRlKGRldiwgQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVA0MF9TSElGVCkpCisJCQlETUVTRyAoIjQwLWJpdCBXRVAgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7CisJCWVsc2UKKwkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7CisKKwkJaWYocmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMCkgJiAoMTw8Q09ORklHMF9XRVAxMDRfU0hJRlQpKQorCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKKwkJZWxzZQorCQkJRE1FU0cgKCIxMDQtYml0IFdFUCBpcyBOT1Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7CisJfQorI2lmICFkZWZpbmVkKFNBX1NISVJRKQorICAgICAgICBpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilydGw4MTgwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSl7CisjZWxzZQorICAgICAgICBpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilydGw4MTgwX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSl7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBETUVTR0UoIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkIixkZXYtPmlycSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCX1lbHNleworCQlwcml2LT5pcnE9ZGV2LT5pcnE7CisJCURNRVNHKCJJUlEgJWQiLGRldi0+aXJxKTsKKwl9CisKKyNpZmRlZiBERUJVR19FUFJPTQorCWR1bXBfZXByb20oZGV2KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKK30KKworCit2b2lkIHJ0bDgxODBfbm9faHdfd2VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwl7CisJCXU4IHNlY3VyaXR5OworCisJCXNlY3VyaXR5ICA9IHJlYWRfbmljX2J5dGUoZGV2LCBTRUNVUklUWSk7CisJCXNlY3VyaXR5ICY9figxPDxTRUNVUklUWV9XRVBfVFhfRU5BQkxFX1NISUZUKTsKKwkJc2VjdXJpdHkgJj1+KDE8PFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQpOworCisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDVVJJVFksIHNlY3VyaXR5KTsKKworCX1lbHNleworCisJCS8vRklYTUUhISEKKwl9CisJLyoKKwkgIHdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORixyZWFkX25pY19kd29yZChkZXYsVFhfQ09ORikgfAorCSAgKDE8PFRYX05PSUNWX1NISUZUKSApOworCSovCisvLwlwcml2LT5pZWVlODAyMTEtPmh3X3dlcD0wOworfQorCisKK3ZvaWQgcnRsODE4MF9zZXRfaHdfd2VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IHBncmVnOworCXU4IHNlY3VyaXR5OworCXUzMiBrZXkwX3dvcmQ0OworCisJcGdyZWc9cmVhZF9uaWNfYnl0ZShkZXYsIFBHU0VMRUNUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBHU0VMRUNULCBwZ3JlZyAmfiAoMTw8UEdTRUxFQ1RfUEdfU0hJRlQpKTsKKworCWtleTBfd29yZDQgPSByZWFkX25pY19kd29yZChkZXYsIEtFWTArNCs0KzQpOworCWtleTBfd29yZDQgJj0gfiAweGZmOworCWtleTBfd29yZDQgfD0gcHJpdi0+a2V5MFszXSYgMHhmZjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEtFWTAsKHByaXYtPmtleTBbMF0pKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEtFWTArNCwocHJpdi0+a2V5MFsxXSkpOworCXdyaXRlX25pY19kd29yZChkZXYsS0VZMCs0KzQsKHByaXYtPmtleTBbMl0pKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEtFWTArNCs0KzQsKGtleTBfd29yZDQpKTsKKworCS8qCisJICBUWF9DT05GLHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKSAmfigxPDxUWF9OT0lDVl9TSElGVCkpOworCSovCisKKwlzZWN1cml0eSAgPSByZWFkX25pY19ieXRlKGRldixTRUNVUklUWSk7CisJc2VjdXJpdHkgfD0gKDE8PFNFQ1VSSVRZX1dFUF9UWF9FTkFCTEVfU0hJRlQpOworCXNlY3VyaXR5IHw9ICgxPDxTRUNVUklUWV9XRVBfUlhfRU5BQkxFX1NISUZUKTsKKwlzZWN1cml0eSAmPSB+IFNFQ1VSSVRZX0VOQ1JZUF9NQVNLOworCXNlY3VyaXR5IHw9IChTRUNVUklUWV9FTkNSWVBfMTA0PDxTRUNVUklUWV9FTkNSWVBfU0hJRlQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBTRUNVUklUWSwgc2VjdXJpdHkpOworCisJRE1FU0coImtleSAleCAleCAleCAleCIscmVhZF9uaWNfZHdvcmQoZGV2LEtFWTArNCs0KzQpLAorCSAgICAgIHJlYWRfbmljX2R3b3JkKGRldixLRVkwKzQrNCkscmVhZF9uaWNfZHdvcmQoZGV2LEtFWTArNCksCisJICAgICAgcmVhZF9uaWNfZHdvcmQoZGV2LEtFWTApKTsKKworCS8vcHJpdi0+aWVlZTgwMjExLT5od193ZXA9MTsKK30KKworCit2b2lkIHJ0bDgxODVfcmZfcGluc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKy8vCXUxNiB0bXA7CisvLwl0bXAgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHgxZmZmKTsvLyB8IHRtcCk7CisvLwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSw3IHwgdG1wKTsKK30KKworCit2b2lkIHJ0bDgxODVfc2V0X2FuYXBhcmFtMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYSkKK3sKKwl1OCBjb25mMzsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCWNvbmYzID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgY29uZjMgfCAoMTw8Q09ORklHM19BTkFQQVJBTV9XX1NISUZUKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0yLCBhKTsKKworCWNvbmYzID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgY29uZjMgJn4oMTw8Q09ORklHM19BTkFQQVJBTV9XX1NISUZUKSk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCit9CisKKwordm9pZCBydGw4MTgwX3NldF9hbmFwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYSkKK3sKKwl1OCBjb25mMzsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKworCWNvbmYzID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgY29uZjMgfCAoMTw8Q09ORklHM19BTkFQQVJBTV9XX1NISUZUKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0sIGEpOworCisJY29uZjMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBjb25mMyAmfigxPDxDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQpKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7Cit9CisKKwordm9pZCBydGw4MTg1X3R4X2FudGVubmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYW50KQoreworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfQU5URU5OQSwgYW50KTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKK30KKworCit2b2lkIHJ0bDgxODVfd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpCit7CisJLy91OCBwaHlyOworCXUzMiBwaHl3OworCS8vaW50IGk7CisKKwlhZHIgfD0gMHg4MDsKKworCXBoeXc9ICgoZGF0YTw8OCkgfCBhZHIpOworI2lmIDAKKworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIHBoeXcpOworCisJLy9yZWFkX25pY19kd29yZChkZXYsIFBIWV9BRFIpOworCWZvcihpPTA7aTwxMDtpKyspeworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCAweGZmZmZmZjdmICYgcGh5dyk7CisJCXBoeXIgPSByZWFkX25pY19ieXRlKGRldiwgUEhZX1JFQUQpOworCQlpZihwaHlyID09IChkYXRhJjB4ZmYpKSBicmVhazsKKworCX0KKyNlbHNlCisJLy8gTm90ZSB0aGF0LCB3ZSBtdXN0IHdyaXRlIDB4ZmY3YyBhZnRlciAweDdkLTB4N2YgdG8gd3JpdGUgQkIgcmVnaXN0ZXIuCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdmLCAoKHBoeXcgJiAweGZmMDAwMDAwKSA+PiAyNCkpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZSwgKChwaHl3ICYgMHgwMGZmMDAwMCkgPj4gMTYpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2QsICgocGh5dyAmIDB4MDAwMGZmMDApID4+IDgpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2MsICgocGh5dyAmIDB4MDAwMDAwZmYpICkpOworI2VuZGlmCisJLyogdGhpcyBpcyBvayB0byBmYWlsIHdoZW4gd2Ugd3JpdGUgQUdDIHRhYmxlLiBjaGVjayBmb3IgQUdDIHRhYmxlIG1pZ2h0IGJlCisJICogZG9uZSBieSBtYXNraW5nIHdpdGggMHg3ZiBpbnN0ZWFkIG9mIDB4ZmYKKwkgKi8KKwkvL2lmKHBoeXIgIT0gKGRhdGEmMHhmZikpIERNRVNHVygiUGh5IHdyaXRlIHRpbWVvdXQgJXggJXggJXgiLCBwaHlyLCBkYXRhLGFkcik7Cit9CisKKworaW5saW5lIHZvaWQgd3JpdGVfcGh5X29mZG0gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpCit7CisJZGF0YSA9IGRhdGEgJiAweGZmOworCXJ0bDgxODVfd3JpdGVfcGh5KGRldiwgYWRyLCBkYXRhKTsKK30KKworCit2b2lkIHdyaXRlX3BoeV9jY2sgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpCit7CisJZGF0YSA9IGRhdGEgJiAweGZmOworCXJ0bDgxODVfd3JpdGVfcGh5KGRldiwgYWRyLCBkYXRhIHwgMHgxMDAwMCk7Cit9CisKKworLyogNzAqMyA9IDIxMCBtcworICogSSBob3BlIHRoaXMgaXMgZW5vdWd0aAorICovCisjZGVmaW5lIE1BWF9QSFkgNzAKK3ZvaWQgd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTggZGF0YSkKK3sKKwl1MzIgcGh5OworCWludCBpOworCisJcGh5ID0gMHhmZjAwMDA7CisJcGh5IHw9IGFkcjsKKwlwaHkgfD0gMHg4MDsgLyogdGhpcyBzaG91bGQgZW5hYmxlIHdyaXRpbmcgKi8KKwlwaHkgfD0gKGRhdGE8PDgpOworCisJLy9QSFlfQURSLCBQSFlfUiBhbmQgUEhZX1cgIGFyZSBjb250aWcgYW5kIHRyZWF0ZWQgYXMgb25lIGR3b3JkCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLCBwaHkpOworCisJcGh5PSAweGZmZmYwMDsKKwlwaHkgfD0gYWRyOworCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLCBwaHkpOworCWZvcihpPTA7aTxNQVhfUEhZO2krKyl7CisJCXBoeT1yZWFkX25pY19kd29yZChkZXYsUEhZX0FEUik7CisJCXBoeT0gcGh5ICYgMHhmZjAwMDA7CisJCXBoeT0gcGh5ID4+IDE2OworCQlpZihwaHkgPT0gZGF0YSl7IC8vU1VDQ0VTUyEKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQltZGVsYXkoMyk7IC8vcmFuZG9tIHZhbHVlCisjaWZkZWYgREVCVUdfQkIKKwkJCURNRVNHKCJQaHkgd3IgJXgsJXgiLGFkcixkYXRhKTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9ZWxzZXsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQltZGVsYXkoMyk7IC8vcmFuZG9tIHZhbHVlCisJCX0KKwl9CisJRE1FU0dXICgiUGh5IHdyaXRpbmcgJXggJXggZmFpbGVkISIsIGFkcixkYXRhKTsKK30KKwordm9pZCBydGw4MTg1X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJdTE2IHdvcmQ7CisJaW50IGJhc2ljX3JhdGUsbWluX3JyX3JhdGUsbWF4X3JyX3JhdGU7CisKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vaWYgKGllZWU4MDIxMV9pc181NGcocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspICYmCisvLwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwliYXNpY19yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgyNDApOworCW1pbl9ycl9yYXRlID0gaWVlZXJhdGUycnRscmF0ZSg2MCk7CisJbWF4X3JyX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDI0MCk7CisKKy8vCisvLwl9ZWxzZXsKKy8vCQliYXNpY19yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgyMCk7CisvLwkJbWluX3JyX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDEwKTsKKy8vCQltYXhfcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMTEwKTsKKy8vCX0KKworCXdyaXRlX25pY19ieXRlKGRldiwgUkVTUF9SQVRFLAorCQkJbWF4X3JyX3JhdGU8PE1BWF9SRVNQX1JBVEVfU0hJRlR8IG1pbl9ycl9yYXRlPDxNSU5fUkVTUF9SQVRFX1NISUZUKTsKKworCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJSU1IpOworCXdvcmQgJj0gfkJSU1JfTUJSXzgxODU7CisKKworCWZvcihpPTA7aTw9YmFzaWNfcmF0ZTtpKyspCisJCXdvcmQgfD0gKDE8PGkpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCB3b3JkKTsKKwkvL0RNRVNHKCJSUjoleCBCUlNSOiAleCIsIHJlYWRfbmljX2J5dGUoZGV2LFJFU1BfUkFURSkscmVhZF9uaWNfd29yZChkZXYsQlJTUikpOworfQorCisKKwordm9pZCBydGw4MTgwX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBhbmFwYXJhbTsKKwl1MTYgd29yZDsKKwl1OCBjb25maWczOworLy8JaW50IGk7CisKKwlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJcnRsODE4MF9yZXNldChkZXYpOworCisJLyogc2VlbXMgdGhhdCAweGZmZmYgb3IgMHhhZmZmIHdpbGwgY2F1c2UKKwkgKiBIVyBpbnRlcnJ1cHQgbGluZSBjcmFzaAorCSAqLworCisJLy9wcml2LT5pcnFfbWFzayA9IDB4YWZmZjsKKy8vCXByaXYtPmlycV9tYXNrID0gMHg0ZmNmOworCisJLyogZW5hYmxlIGJlYWNvbiB0aW1lb3V0LCBiZWFjb24gVFggb2sgYW5kIGVycgorCSAqIExQIHR4IG9rIGFuZCBlcnIsIEhQIFRYIG9rIGFuZCBlcnIsIE5QIFRYIG9rIGFuZCBlcnIsCisJICogUlggb2sgYW5kIEVSUiwgYW5kIEdQIHRpbWVyICovCisJcHJpdi0+aXJxX21hc2sgPSAweDZmY2Y7CisKKwlwcml2LT5kbWFfcG9sbF9tYXNrID0gMDsKKworCXJ0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoZGV2KTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEQlVTICl7CisJCWNvbmZpZzM9cmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHMyxjb25maWczIHwgQ09ORklHM19GdW5jUmVnRW4pOworCQl3cml0ZV9uaWNfd29yZChkZXYsRkVNUiwgRkVNUl9JTlRSIHwgRkVNUl9XS1VQIHwgRkVNUl9HV0FLRSB8CisJCQlyZWFkX25pY193b3JkKGRldiwgRkVNUikpOworCX0KKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgTUFDMCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIE1BQzQsICgodTMyKilkZXYtPmRldl9hZGRyKVsxXSAmIDB4ZmZmZiApOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCXJ0bDgxODBfdXBkYXRlX21zcihkZXYpOworCisJaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCWFuYXBhcmFtICA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCk7CisJCWFuYXBhcmFtIHw9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX0FOQVBBUkFNX0FERFJIV09SRCk8PDE2OworCisJCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7CisJfQorCS8qIFRoZXNlIG1pZ2h0IGJlIHVubmVjZXNzYXJ5IHNpbmNlIHdlIGRvIGluIHJ4X2VuYWJsZSAvIHR4X2VuYWJsZSAqLworCWZpeF9yeF9maWZvKGRldik7CisJZml4X3R4X2ZpZm8oZGV2KTsKKwkvKnNldF9uaWNfcnhyaW5nKGRldik7CisJICBzZXRfbmljX3R4cmluZyhkZXYpOyovCisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisKKwkvKgorCSAgIFRoZSBmb2xsb3dpbmcgaXMgdmVyeSBzdHJhbmdlLiBzZWVtcyB0byBiZSB0aGF0IDEgbWVhbnMgdGVzdCBtb2RlLAorCSAgIGJ1dCB3ZSBuZWVkIHRvIGFja25vbHdsZWRnZXMgdGhlIG5pYyB3aGVuIGEgcGFja2V0IGlzIHJlYWR5CisJICAgYWx0b3VnaHQgd2Ugc2V0IGl0IHRvIDAKKwkqLworCisJd3JpdGVfbmljX2J5dGUoZGV2LAorCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMikgJn5cCisJCSAgICAgICAoMTw8Q09ORklHMl9ETUFfUE9MTElOR19NT0RFX1NISUZUKSk7CisJLy9edGhlIG5pYyBpc24ndCBpbiB0ZXN0IG1vZGUKKwlpZihwcml2LT5jYXJkXzgxODUpCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsCisJCSAgICAgICBDT05GSUcyLCByZWFkX25pY19ieXRlKGRldixDT05GSUcyKXwoMTw8NCkpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LElOVF9USU1FT1VULDApOworI2lmZGVmIERFQlVHX1JFR0lTVEVSUworCXJ0bDgxODBfZHVtcF9yZWcoZGV2KTsKKyNlbmRpZgorCisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwl7CisJCS8qCisJCWV4cGVyaW1lbnRhbCAtIHRoaXMgbWlnaHQgYmUgbmVlZGVkIHRvIGNhbGlicmF0ZSBBR0MsCisJCWFueXdheSBpdCBzaG91bGRuJ3QgaHVydAorCQkqLworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzUsCisJCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSkgfCAoMTw8QUdDUkVTRVRfU0hJRlQpKTsKKwkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpOworCQl1ZGVsYXkoMTUpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzUsCisJCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSkgJn4gKDE8PEFHQ1JFU0VUX1NISUZUKSk7CisJfWVsc2V7CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBXUEFfQ09ORklHLCAwKTsKKwkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRFU1RSLCAweGQpOworCX0KKworCXJ0bDgxODBfbm9faHdfd2VwKGRldik7CisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlydGw4MTg1X3NldF9yYXRlKGRldik7CisJCXdyaXRlX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSywgMHg4MSk7CisJLy8Jd3JpdGVfbmljX2J5dGUoZGV2LCAweGRmLCAweDE1KTsKKwl9ZWxzZXsKKwkJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisJCXdvcmQgJj0gfkJSU1JfTUJSOworCQl3b3JkICY9IH5CUlNSX0JQTENQOworCQl3b3JkIHw9IGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKTsKKy8vYnkgYW15CisgICAgICAgICAgICAgIHdvcmQgfD0gMHgwZjsKKy8vYnkgYW15CisJCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgd29yZCk7CisJfQorCisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSxyZWFkX25pY19ieXRlKGRldiwgR1BfRU5BQkxFKSAmIH4oMTw8NikpOworCisJCS8vRklYTUUgY2ZnIDMgQ2xrUnVuIGVuYWJsZSAtIGlzbid0IGl0IFJlYWRPbmx5ID8KKwkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHMywgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpCit8KDE8PENPTkZJRzNfQ0xLUlVOX1NISUZUKSk7CisJCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCX0KKworCXByaXYtPnJmX2luaXQoZGV2KTsKKworCWlmKHByaXYtPnJmX3NldF9zZW5zICE9IE5VTEwpCisJCXByaXYtPnJmX3NldF9zZW5zKGRldixwcml2LT5zZW5zKTsKKwlydGw4MTgwX2lycV9lbmFibGUoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJLypETUVTRyAoImxmcmVlICVkIixnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LExPV19QUklPUklUWSkpOworCisJRE1FU0cgKCJuZnJlZSAlZCIsZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixOT1JNX1BSSU9SSVRZKSk7CisKKwlETUVTRyAoImhmcmVlICVkIixnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LEhJX1BSSU9SSVRZKSk7CisJaWYoY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsTk9STV9QUklPUklUWSkpIERNRVNHKCJOT1JNIE9LIik7CisJaWYoY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsSElfUFJJT1JJVFkpKSBETUVTRygiSEkgT0siKTsKKwlpZihjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixMT1dfUFJJT1JJVFkpKSBETUVTRygiTE9XIE9LIik7Ki8KK30KKworCisKKy8qIHRoaXMgY29uZmlndXJlcyByZWdpc3RlcnMgZm9yIGJlYWNvbiB0eCBhbmQgZW5hYmxlcyBpdCB2aWEKKyAqIHJ0bDgxODBfYmVhY29uX3R4X2VuYWJsZSgpLiBydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKCkgbWlnaHQKKyAqIGJlIHVzZWQgdG8gc3RvcCBiZWFjb24gdHJhbnNtaXNzaW9uCisgKi8KK3ZvaWQgcnRsODE4MF9zdGFydF90eF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgd29yZDsKKy8vCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKKwlETUVTRygiRW5hYmxpbmcgYmVhY29uIFRYIik7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4NDIsMHhlNik7Ly8gVENSCisvLwlzZXRfbmljX3R4cmluZyhkZXYpOworLy8JZml4X3R4X2ZpZm8oZGV2KTsKKwlydGw4MTgwX3ByZXBhcmVfYmVhY29uKGRldik7CisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCXJ0bDgxODBfYmVhY29uX3R4X2VuYWJsZShkZXYpOworI2lmIDAKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwweDlkLDB4MjApOyAvL0RNQSBQb2xsCisJLy93cml0ZV9uaWNfd29yZChkZXYsMHg3YSwwKTsKKwkvL3dyaXRlX25pY193b3JkKGRldiwweDdhLDB4ODAwMCk7CisKKyNpZiAwCisJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmNuSXR2KTsKKwl3b3JkICY9IH5CY25JdHZfQmNuSXR2OyAvLyBjbGVhciBCY25fSXR2CisJd29yZCB8PSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ly8weDY0OworCXdyaXRlX25pY193b3JkKGRldiwgQmNuSXR2LCB3b3JkKTsKKyNlbmRpZgorI2VuZGlmCisJd29yZCA9IHJlYWRfbmljX3dvcmQoZGV2LCBBdGltV25kKSAmfiBBdGltV25kX0F0aW1XbmQ7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBBdGltV25kLHdvcmQpOy8vIHdvcmQgfD0KKy8vcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCisJd29yZCAgPSByZWFkX25pY193b3JkKGRldiwgQmludHJJdHYpOworCXdvcmQgJj0gfkJpbnRySXR2X0JpbnRySXR2OworCXdvcmQgfD0gMTAwMDsvKnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqCisJCSgocHJpdi0+dHhiZWFjb25jb3VudCA+IDEpPyhwcml2LT50eGJlYWNvbmNvdW50LTEpOjEpOworCS8vIEZJWE1FOiBjaGVjayBpZiBjb3JyZWN0IF5eIHdvcmtlZCB3aXRoIDB4M2U4OworCSovCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCaW50ckl0diwgd29yZCk7CisKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworLy8JcnRsODE4MF9iZWFjb25fdHhfZW5hYmxlKGRldik7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisgICAgICAgIHJ0bDgxODViX2lycV9lbmFibGUoZGV2KTsKKyNlbHNlCisJcnRsODE4MF9pcnFfZW5hYmxlKGRldik7CisjZW5kaWYKKwkvKiBWViAhISEhISEhISEhIFZWKi8KKwkvKgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwweDlkLDB4MDApOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworKi8KKy8vCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTkVUIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxODBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gJnByaXYtPmllZWU4MDIxMS0+c3RhdHM7Cit9CisvLworLy8gQ2hhbmdlIGN1cnJlbnQgYW5kIGRlZmF1bHQgcHJlYW1ibGUgbW9kZS4KKy8vIDIwMDUuMDEuMDYsIGJ5IHJjbmprby4KKy8vCitib29sCitNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKAorCXN0cnVjdCByODE4MF9wcml2ICpwcml2LAorCVJUX1BTX01PREUJCXJ0UHNNb2RlCispCit7CisKKwkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBjaGFuZ2UgcG93ZXIgc2F2ZSBtb2RlIG9uIElCU1MgbW9kZS4KKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwl7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvLworCS8vIDxSSl9OT1RFPiBJZiB3ZSBtYWtlIEhXIHRvIGZpbGwgdXAgdGhlIFB3ck1ndCBiaXQgZm9yIHVzLAorCS8vIHNvbWUgQVAgd2lsbCBub3QgcmVzcG9uc2UgdG8gb3VyIG1nbnQgZnJhbWVzIHdpdGggUHdyTWd0IGJpdCBzZXQsCisJLy8gZS5nLiBjYW5ub3QgYXNzb2NpYXRlIHRoZSBBUC4KKwkvLyBTbyBJIGNvbW1lbnRlZCBvdXQgaXQuIDIwMDUuMDIuMTYsIGJ5IHJjbmprby4KKwkvLworLy8JLy8gQ2hhbmdlIGRldmljZSdzIHBvd2VyIHNhdmUgbW9kZS4KKy8vCUFkYXB0ZXItPkhhbEZ1bmMuU2V0UFNNb2RlSGFuZGxlciggQWRhcHRlciwgcnRQc01vZGUgKTsKKworCS8vIFVwZGF0ZSBwb3dlciBzYXZlIG1vZGUgY29uZmlndXJlZC4KKy8vCXByaXYtPmRvdDExUG93ZXJTYXZlTW9kZSA9IHJ0UHNNb2RlOworCXByaXYtPmllZWU4MDIxMS0+cHMgPSBydFBzTW9kZTsKKwkvLyBEZXRlcm1pbmUgTGlzdGVuSW50ZXJ2YWwuCisjaWYgMAorCWlmKHByaXYtPmRvdDExUG93ZXJTYXZlTW9kZSA9PSBlTWF4UHMpCisJeworCQlwcml2LT5pZWVlODAyMTEtPkxpc3RlbkludGVydmFsID0gMTA7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPmllZWU4MDIxMS0+TGlzdGVuSW50ZXJ2YWwgPSAyOworCX0KKyNlbmRpZgorCXJldHVybiB0cnVlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMZWlzdXJlIFBvd2VyIFNhdmUgaW4gbGlua2VkIHN0YXRlLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJRW50ZXIgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLgorLy8KK3ZvaWQKK0xlaXN1cmVQU0VudGVyKAorCXN0cnVjdCByODE4MF9wcml2ICpwcml2CisJKQoreworCWlmIChwcml2LT5iTGVpc3VyZVBzKQorCXsKKwkJaWYgKHByaXYtPmllZWU4MDIxMS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKQorCQl7CisJCQkvL3ByaW50aygiLS0tLUVudGVyIFBTXG4iKTsKKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUocHJpdiwgSUVFRTgwMjExX1BTX01CQ0FTVHxJRUVFODAyMTFfUFNfVU5JQ0FTVCk7Ly9JRUVFODAyMTFfUFNfRU5BQkxFCisJCX0KKwl9Cit9CisKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCUxlYXZlIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4KKy8vCit2b2lkCitMZWlzdXJlUFNMZWF2ZSgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdgorCSkKK3sKKwlpZiAocHJpdi0+YkxlaXN1cmVQcykKKwl7CisJCWlmIChwcml2LT5pZWVlODAyMTEtPnBzICE9IElFRUU4MDIxMV9QU19ESVNBQkxFRCkKKwkJeworCQkJLy9wcmludGsoIi0tLS1MZWF2ZSBQU1xuIik7CisJCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsIElFRUU4MDIxMV9QU19ESVNBQkxFRCk7CisJCX0KKwl9Cit9CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3dha2V1cF93cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHdhdGNoX2RvZ193cSk7CisvLwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQorLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3YXRjaF9kb2dfd3EpOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSxod193YWtldXBfd3EpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisjZWxzZQordm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCisvLwlwcmludGsoImRldiBpcyAlZFxuIixkZXYpOworLy8JcHJpbnRrKCImKiYoXiooJigmPT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcnRsODE4MF9od193YWtldXAoZGV2KTsKKworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisvLyAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCB3YXRjaF9kb2dfd3EpOworLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfc2xlZXBfd3EpOworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKworICAgICAgICBydGw4MTgwX2h3X3NsZWVwX2Rvd24oZGV2KTsKK30KKworLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKK3N0YXRpYyB2b2lkIE1nbnRMaW5rS2VlcEFsaXZlKHN0cnVjdCByODE4MF9wcml2ICpwcml2ICkKK3sKKwlpZiAocHJpdi0+a2VlcEFsaXZlTGV2ZWwgPT0gMCkKKwkJcmV0dXJuOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJLy8KKwkJLy8gS2VlcC1BbGl2ZS4KKwkJLy8KKwkJLy9wcmludGsoIkxhc3RUeDolZCBUeDolZCBMYXN0Ung6JWQgUng6JWxkIElkbGU6JWRcbiIscHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCxwcml2LT5OdW1UeFVuaWNhc3QsIHByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QsIHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0LCBwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQpOworCisJCWlmICggKHByaXYtPmtlZXBBbGl2ZUxldmVsPT0gMikgfHwKKwkJCShwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID09IHByaXYtPk51bVR4VW5pY2FzdCAmJgorCQkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCA9PSBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdCApCisJCQkpCisJCXsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCsrOworCisJCQkvLworCQkJLy8gU2VuZCBhIEtlZXAtQWxpdmUgcGFja2V0IHBhY2tldCB0byBBUCBpZiB3ZSBoYWQgYmVlbiBpZGxlIGZvciBhIHdoaWxlLgorCQkJLy8KKwkJCWlmKHByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA+PSAoKEtFRVBfQUxJVkVfSU5URVJWQUwgLyBDSEVDS19GT1JfSEFOR19QRVJJT0QpLTEpICkKKwkJCXsKKwkJCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPSAwOworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHByaXYtPmllZWU4MDIxMSwgZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID0gMDsKKwkJfQorCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID0gcHJpdi0+TnVtVHhVbmljYXN0OworCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0ID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3Q7CisJfQorfQorLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUsZW5kCisKK3N0YXRpYyB1OCByZWFkX2FjYWRhcHRlcl9maWxlKGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgcnRsODE4MF93YXRjaF9kb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbCBiRW50ZXJQUyA9IGZhbHNlOworCWJvb2wgYkJ1c3lUcmFmZmljID0gZmFsc2U7CisJdTMyIFRvdGFsUnhOdW0gPSAwOworCXUxNiBTbG90SW5kZXggPSAwOworCXUxNiBpID0gMDsKKyNpZmRlZiBFTkFCTEVfSVBTCisJaWYocHJpdi0+aWVlZTgwMjExLT5hY3RzY2FubmluZyA9PSBmYWxzZSl7CisJCWlmKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgJiYgKHByaXYtPmllZWU4MDIxMS0+YmVpbnJldHJ5ID09IGZhbHNlKSAmJiAocHJpdi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPbikpeworCQkJSVBTRW50ZXIoZGV2KTsKKwkJfQorCX0KKyNlbmRpZgorCS8vWUosYWRkLDA4MDgyOCxmb3IgbGluayBzdGF0ZSBjaGVjaworCWlmKChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpeworCQlTbG90SW5kZXggPSAocHJpdi0+bGlua19kZXRlY3QuU2xvdEluZGV4KyspICUgcHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsKKwkJcHJpdi0+bGlua19kZXRlY3QuUnhGcmFtZU51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCArIHByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZDsKKwkJZm9yKCBpPTA7IGk8cHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsgaSsrICkKKwkJCVRvdGFsUnhOdW0rPSBwcml2LT5saW5rX2RldGVjdC5SeEZyYW1lTnVtW2ldOworCQkvL3ByaW50aygiJiYmJiY9PT0gVG90YWxSeE51bSA9ICVkXG4iLCBUb3RhbFJ4TnVtKTsKKwkJaWYoVG90YWxSeE51bSA9PSAwKXsKKwkJCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQl9CisJfQorCisJLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKKwlNZ250TGlua0tlZXBBbGl2ZShwcml2KTsKKworCS8vWUosYWRkLDA4MDgyOCxmb3IgTFBTCisjaWZkZWYgRU5BQkxFX0xQUworCWlmKHByaXYtPlBvd2VyUHJvZmlsZSA9PSBQT1dFUl9QUk9GSUxFX0JBVFRFUlkgKQorCXsKKwkJLy9UdXJuIG9uIExlaXN1cmVQUyBvbiBiYXR0ZXJ5IHBvd2VyCisJCS8vcHJpbnRrKCIhISEhIU9uIGJhdHRlcnkgcG93ZXJcbiIpOworCQlwcml2LT5iTGVpc3VyZVBzID0gdHJ1ZTsKKwl9CisJZWxzZSBpZihwcml2LT5Qb3dlclByb2ZpbGUgPT0gUE9XRVJfUFJPRklMRV9BQyApCisJeworCQkvLyBUdXJuIG9mZiBMZWlzdXJlUFMgb24gQUMgcG93ZXIKKwkJLy9wcmludGsoIi0tLS1PbiBBQyBwb3dlclxuIik7CisJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQlwcml2LT5iTGVpc3VyZVBzPSBmYWxzZTsKKwl9CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgRU5BQkxFX0xQUworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCWlmKAlwcml2LT5OdW1SeE9rSW5QZXJpb2Q+IDY2NiB8fAorCQkJcHJpdi0+TnVtVHhPa0luUGVyaW9kID4gNjY2ICkgeworCQkJYkJ1c3lUcmFmZmljID0gdHJ1ZTsKKwkJfQorCQlpZigocHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGEgKyBwcml2LT5OdW1UeE9rSW5QZXJpb2QpPDgpIHsKKwkJCWJFbnRlclBTPSB0cnVlOworCQl9CisJCWlmKGJFbnRlclBTKSB7CisJCQlMZWlzdXJlUFNFbnRlcihwcml2KTsKKwkJfQorCQllbHNlIHsKKwkJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQl9CisJfQorCWVsc2UJeworCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwl9CisjZW5kaWYKKwlwcml2LT5OdW1SeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPk51bVR4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGEgPSAwOworI2Vsc2UKKyNpZmRlZiBFTkFCTEVfTFBTCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZDsKKwkJLy9wcmludGsoIlR4T2s9JWQgUnhPaz0lZFxuIiwgcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kLCBwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QpOworCQlpZigJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kPiA2NjYgfHwKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZD4gNjY2ICkgeworCQkJYkJ1c3lUcmFmZmljID0gdHJ1ZTsKKwkJfQorCQlpZigoKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCArIHByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCkgPiA4KQorCQkJfHwgKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA+IDIpKSB7CisJCQliRW50ZXJQUz0gZmFsc2U7CisJCX0KKwkJZWxzZSB7CisJCQliRW50ZXJQUz0gdHJ1ZTsKKwkJfQorCisJCWlmKGJFbnRlclBTKSB7CisJCQlMZWlzdXJlUFNFbnRlcihwcml2KTsKKwkJfQorCQllbHNlIHsKKwkJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQl9CisJfQorCWVsc2V7CisJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCX0KKyNlbmRpZgorCXByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKKwlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kID0gMDsKKyNlbmRpZgorfQoraW50IF9ydGw4MTgwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vaW50IGk7CisKKwlwcml2LT51cD0xOworCisJRE1FU0coIkJyaW5naW5nIHVwIGlmYWNlIik7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnRsODE4NWJfYWRhcHRlcl9zdGFydChkZXYpOworCXJ0bDgxODViX3J4X2VuYWJsZShkZXYpOworCXJ0bDgxODViX3R4X2VuYWJsZShkZXYpOworI2Vsc2UKKwlydGw4MTgwX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlydGw4MTgwX3J4X2VuYWJsZShkZXYpOworCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfSVBTCisJaWYocHJpdi0+YkluYWN0aXZlUHMpeworCQlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUlQU0xlYXZlKGRldik7CisJfQorI2VuZGlmCisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBSQVRFX0FEQVBUCisgICAgICAgdGltZXJfcmF0ZV9hZGFwdGl2ZSgodW5zaWduZWQgbG9uZylkZXYpOworI2VuZGlmCisvL2J5IGFteSAwODAzMTIKKwl3YXRjaF9kb2dfYWRhcHRpdmUoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKyNpZmRlZiBTV19BTlRFCisgICAgICAgIGlmKHByaXYtPmJTd0FudGVubmFEaXZlcml0eSkKKwkJCVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soZGV2KTsKKyNlbmRpZgorLy8JSVBTRW50ZXIoZGV2KTsKKwlpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisvLwlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT247CisvLwlwcmludGsoIlxuLS0tLS0tLS1TdGFydCBxdWV1ZV93b3JrOkdQSU9DaGFuZ2VSRldvcmtJdGVtIik7CisvLwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSwxMDAwKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBydGw4MTgwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gcnRsODE4MF91cChkZXYpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworCitpbnQgcnRsODE4MF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAxKSByZXR1cm4gLTE7CisKKwlyZXR1cm4gX3J0bDgxODBfdXAoZGV2KTsKK30KKworCitpbnQgcnRsODE4MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGw4MTgwX2Rvd24oZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IHJ0bDgxODBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gLTE7CisKKwlwcml2LT51cD0wOworCisJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCS8qIEZJWE1FICovCisJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCS8vY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EpOworLy97YnkgYW15IDA4MDMxMgorICAgIGRlbF90aW1lcl9zeW5jKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7CisgICAgY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EpOworLy9ieSBhbXkgMDgwMzEyfQorCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKKwlTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoZGV2LGVSZk9mZik7CisJLy9pZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJbWVtc2V0KCYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspLDAsc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCXJldHVybiAwOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCByZXNldF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlydGw4MTgwX2NvbW1pdChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7Cit9CisKK3ZvaWQgcnRsODE4MF9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vcnRsODE4MF9jb21taXQoZGV2KTsKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy9ETUVTRygiVFhUSU1FT1VUIik7Cit9CisKKwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gOworLy8rYnkgYW15IDA4MDMxMgorCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCS8vY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EpOworLy97YnkgYW15IDA4MDMxMgorLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKyAgICBkZWxfdGltZXJfc3luYygmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOworICAgIGNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxKTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOworCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwlydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCV9ydGw4MTgwX3VwKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgcjgxODBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCBwcm9taXNjOworCisJLy9kb3duKCZwcml2LT53eF9zZW0pOworCisJcHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMTowOworCisJaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzYykKKwkJcnRsODE4MF9yZXN0YXJ0KGRldik7CisKKwlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKKworCS8vdXAoJnByaXYtPnd4X3NlbSk7Cit9CisKKyNpZiAwCisvKiB0aGlzIGlzIGNhbGxlZCBieSB0aGUga2VybmVsIHdoZW4gaXQgbmVlZHMgdG8gVFggYSA4MDIuMyBlbmNhcHN1bGF0ZWQgZnJhbWUqLworaW50IHJ0bDgxODBfODAyM19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCXJldCA9IGllZWU4MDIxMV9yODE4MF84MDIzX2hhcmRzdGFydHhtaXQoc2tiLHByaXYtPmllZWU4MDIxMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitpbnQgcjgxODBfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJbWVtY3B5KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAocHJpdi0+dXApIHsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXJ0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLworaW50IHJ0bDgxODBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJaW50IHJldD0tMTsKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHByaXYtPmllZWU4MDIxMSwgJndycS0+dS5kYXRhKTsKKwkJcmV0dXJuIHJldDsKKworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QQ0kgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxODBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2PSBOVUxMOworCS8vdTggKnB0cjsKKwl1OCB1bml0ID0gMDsKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCXVuc2lnbmVkIGxvbmcgcGlvX3N0YXJ0LCBwaW9fbGVuLCBwaW9fZmxhZ3M7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgcG1lbV9zdGFydCwgcG1lbV9sZW4sIHBtZW1fZmxhZ3M7CisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworCURNRVNHKCJDb25maWd1cmluZyBjaGlwIHJlc291cmNlcyIpOworCisJaWYoIHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KSApeworCQlETUVTRygiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCS8vcGNpX3NldF93bWkocGRldik7CisJcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZjAwVUxMKTsKKwlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwweGZmZmZmZjAwVUxMKTsKKwlkZXYgPSBhbGxvY19pZWVlODAyMTEoc2l6ZW9mKHN0cnVjdCByODE4MF9wcml2KSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCXByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmllZWU4MDIxMSA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyNlbmRpZgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCW1lbXNldChwcml2LDAsc2l6ZW9mKHN0cnVjdCByODE4MF9wcml2KSk7CisJcHJpdi0+cGRldj1wZGV2OworCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKworCXBpb19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJcGlvX2xlbiA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApOworCXBpb19mbGFncyA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMCk7CisKKyAgICAgIAlpZiAoIShwaW9fZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgeworCQlETUVTRygicmVnaW9uICMwIG5vdCBhIFBJTyByZXNvdXJjZSwgYWJvcnRpbmciKTsKKwkJZ290byBmYWlsOworCX0KKworCS8vRE1FU0coIklPIHNwYWNlIEAgMHglMDhseCIsIHBpb19zdGFydCApOworCWlmKCAhIHJlcXVlc3RfcmVnaW9uKCBwaW9fc3RhcnQsIHBpb19sZW4sIFJUTDgxODBfTU9EVUxFX05BTUUgKSApeworCQlETUVTRygicmVxdWVzdF9yZWdpb24gZmFpbGVkISIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaW9hZGRyID0gcGlvX3N0YXJ0OworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOyAvLyBkZXZpY2UgSS9PIGFkZHJlc3MKKworI2Vsc2UKKworCXBtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJcG1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXBtZW1fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDEpOworCisJaWYgKCEocG1lbV9mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlETUVTRygicmVnaW9uICMxIG5vdCBhIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvL0RNRVNHKCJNZW1vcnkgbWFwcGVkIHNwYWNlIEAgMHglMDhseCAiLCBwbWVtX3N0YXJ0KTsKKwlpZiggISByZXF1ZXN0X21lbV9yZWdpb24ocG1lbV9zdGFydCwgcG1lbV9sZW4sIFJUTDgxODBfTU9EVUxFX05BTUUpKSB7CisJCURNRVNHKCJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkISIpOworCQlnb3RvIGZhaWw7CisJfQorCisKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUoIHBtZW1fc3RhcnQsIHBtZW1fbGVuKTsKKwlpZiggaW9hZGRyID09ICh1bnNpZ25lZCBsb25nKU5VTEwgKXsKKwkJRE1FU0coImlvcmVtYXAgZmFpbGVkISIpOworCSAgICAgICAvLyByZWxlYXNlX21lbV9yZWdpb24oIHBtZW1fc3RhcnQsIHBtZW1fbGVuICk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJZGV2LT5tZW1fc3RhcnQgPSBpb2FkZHI7IC8vIHNoYXJlZCBtZW0gc3RhcnQKKwlkZXYtPm1lbV9lbmQgPSBpb2FkZHIgKyBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOyAvLyBzaGFyZWQgbWVtIGVuZAorCisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCS8vcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgcHRyKTsKKwkvL3BjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDA1LCAoKnB0cikgJiAofjB4MDQpKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDA1LCAmdW5pdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsIHVuaXQgJiAofjB4MDQpKTsKKyNlbmRpZgorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJpdi0+aXJxID0gMDsKKworCWRldi0+b3BlbiA9IHJ0bDgxODBfb3BlbjsKKwlkZXYtPnN0b3AgPSBydGw4MTgwX2Nsb3NlOworCS8vZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpZWVlODAyMTFfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTgwX3Jlc3RhcnQ7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZyODE4MF93eF9oYW5kbGVyc19kZWY7CisJZGV2LT5kb19pb2N0bCA9IHJ0bDgxODBfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSByODE4MF9zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gcjgxODBfc2V0X21hY19hZHI7CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnI4MTgwX3d4X2hhbmRsZXJzX2RlZjsKKyNlbmRpZgorCisJZGV2LT50eXBlPUFSUEhSRF9FVEhFUjsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFoqMzsgLy9hZGRlZCBieSBkYXZpZCB3b28sIDIwMDcuMTIuMTMKKworCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSkgPCAwKXsKKyAgICAgICAgICAgICAgICBETUVTRygiT29wczogZGV2bmFtZSBhbHJlYWR5IHRha2VuISBUcnlpbmcgd2xhbiUlZC4uLlxuIik7CisJCWlmbmFtZSA9ICJ3bGFuJWQiOworCS8vCWlmbmFtZSA9ICJhdGglZCI7CisJCWRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKTsKKyAgICAgICAgfQorCisKKwlpZihydGw4MTgwX2luaXQoZGV2KSE9MCl7CisJCURNRVNHKCJJbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlydGw4MTgwX3Byb2NfaW5pdF9vbmUoZGV2KTsKKworCURNRVNHKCJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDE6CisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKworCWlmKCBkZXYtPmJhc2VfYWRkciAhPSAwICl7CisKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsCisJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgKTsKKwl9CisjZWxzZQorCWlmKCBkZXYtPm1lbV9zdGFydCAhPSAodW5zaWduZWQgbG9uZylOVUxMICl7CisJCWlvdW5tYXAoICh2b2lkICopZGV2LT5tZW1fc3RhcnQgKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgKTsKKwl9CisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworCitmYWlsOgorCWlmKGRldil7CisKKwkJaWYgKHByaXYtPmlycSkgeworCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlkZXYtPmlycT0wOworCQl9CisJCWZyZWVfaWVlZTgwMjExKGRldik7CisJfQorCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJRE1FU0coIndsYW4gZHJpdmVyIGxvYWQgZmFpbGVkXG4iKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE4MF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisgCWlmKGRldil7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCQlwcml2PWllZWU4MDIxMV9wcml2KGRldik7CisKKwkJcnRsODE4MF9wcm9jX3JlbW92ZV9vbmUoZGV2KTsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXByaXYtPnJmX2Nsb3NlKGRldik7CisJCXJ0bDgxODBfcmVzZXQoZGV2KTsKKwkJLy9ydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCS8vcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCQltZGVsYXkoMTApOworCQkvL3dyaXRlX25pY193b3JkKGRldixJTlRBLHJlYWRfbmljX3dvcmQoZGV2LElOVEEpKTsKKwkJLy9mb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkvL21kZWxheSgxMCk7CisKKwkJaWYocHJpdi0+aXJxKXsKKworCQkJRE1FU0coIkZyZWVpbmcgaXJxICVkIixkZXYtPmlycSk7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCXByaXYtPmlycT0wOworCisJCX0KKworCQlmcmVlX3J4X2Rlc2NfcmluZyhkZXYpOworCQlmcmVlX3R4X2Rlc2NfcmluZ3MoZGV2KTsKKwkvLwlmcmVlX2JlYWNvbl9kZXNjX3JpbmcoZGV2LHByaXYtPnR4YmVhY29uY291bnQpOworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKKwkJaWYoIGRldi0+YmFzZV9hZGRyICE9IDAgKXsKKworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsCisJCQkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgKTsKKwkJfQorI2Vsc2UKKwkJaWYoIGRldi0+bWVtX3N0YXJ0ICE9ICh1bnNpZ25lZCBsb25nKU5VTEwgKXsKKwkJCWlvdW5tYXAoICh2b2lkICopZGV2LT5tZW1fc3RhcnQgKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbiggcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSApOworCQl9CisjZW5kaWYgLyplbmQgI2lmZGVmIFJUTF9JT19NQVAqLworCisJCWZyZWVfaWVlZTgwMjExKGRldik7CisJfQorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCURNRVNHKCJ3bGFuIGRyaXZlciByZW1vdmVkXG4iKTsKK30KKworCisvKiBmdW4gd2l0aCB0aGUgYnVpbHQtaW4gaWVlZTgwMjExIHN0YWNrLi4uICovCitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgcnRsODE4MF9wY2lfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9faW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiXG5MaW51eCBrZXJuZWwgZHJpdmVyIGZvciBSVEw4MTgwIFwKKy8gUlRMODE4NSBiYXNlZCBXTEFOIGNhcmRzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgQW5kcmVhIE1lcmVsbG9cbiIpOworCURNRVNHKCJJbml0aWFsaXppbmcgbW9kdWxlIik7CisJRE1FU0coIldpcmVsZXNzIGV4dGVuc2lvbnMgdmVyc2lvbiAlZCIsIFdJUkVMRVNTX0VYVCk7CisJcnRsODE4MF9wcm9jX21vZHVsZV9pbml0KCk7CisKKyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpKQorICAgICAgaWYoMCE9cGNpX21vZHVsZV9pbml0KCZydGw4MTgwX3BjaV9kcml2ZXIpKQorI2Vsc2UKKyAgICAgIGlmKDAhPXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxODBfcGNpX2RyaXZlcikpCisjZW5kaWYKKwkvL2lmKDAhPXBjaV9tb2R1bGVfaW5pdCgmcnRsODE4MF9wY2lfZHJpdmVyKSkKKwl7CisJCURNRVNHKCJObyBkZXZpY2UgZm91bmQiKTsKKwkJLypwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZydGw4MTgwX3BjaV9kcml2ZXIpOyovCisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRsODE4MF9wY2lfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZydGw4MTgwX3BjaV9kcml2ZXIpOworCXJ0bDgxODBfcHJvY19tb2R1bGVfcmVtb3ZlKCk7CisJaWVlZTgwMjExX2NyeXB0b19kZWluaXQoKTsKKwlpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCgpOworCWllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KCk7CisJaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCgpOworCURNRVNHKCJFeGl0aW5nIik7Cit9CisKKwordm9pZCBydGw4MTgwX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBlbm91Z2hfZGVzYzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixwcmkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYoZW5vdWdoX2Rlc2MpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1JUlEgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBydGw4MTgwX3R4X2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpLHNob3J0IGVycm9yKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXUzMiAqdGFpbDsgLy90YWlsIHZpcnR1YWwgYWRkcgorCXUzMiAqaGVhZDsgLy9oZWFkIHZpcnR1YWwgYWRkcgorCXUzMiAqYmVnaW47Ly9zdGFydCBvZiByaW5nIHZpcnR1YWwgYWRkcgorCXUzMiAqbmljdjsgLy9uaWMgcG9pbnRlciB2aXJ0dWFsIGFkZHIKKy8vCXUzMiAqdHhkdjsgLy9wYWNrZXQganVzdCBUWGVkCisJdTMyIG5pYzsgLy9uaWMgcG9pbnRlciBwaHlzaWNhbCBhZGRyCisJdTMyIG5pY2JlZ2luOy8vIHN0YXJ0IG9mIHJpbmcgcGh5c2ljYWwgYWRkcgorLy8Jc2hvcnQgdHhlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJLyogcGh5c2ljYWwgYWRkciBhcmUgb2sgb24gMzIgYml0cyBzaW5jZSB3ZSBzZXQgRE1BIG1hc2sqLworCisJaW50IG9mZnM7CisJaW50IGosaTsKKwlpbnQgaGQ7CisJaWYgKGVycm9yKSBwcml2LT5zdGF0cy50eHJldHJ5Kys7IC8vdG9ueSAyMDA2MDYwMQorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCXN3aXRjaChwcmkpIHsKKwljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhtYXByaW5nOworCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhtYXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQktfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJrcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmtwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmtwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CS1BSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhia3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmVwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmVwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhiZXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZpcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dmlwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dmlwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WSVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2aXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dm9wcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dm9wcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WT1BSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2b3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGhwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhocHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGhwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eGhwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCQlyZXR1cm4gOworCX0KKy8qCURNRVNHKCIleCAlcyAleCAleCIsKChpbnQpbmljICYgMHhmZmYpLzgvNCwKKwkqKHByaXYtPnR4bnByaW5nICsgKChpbnQpbmljJjB4ZmZmKS80LzgpICYgKDE8PDMxKSA/ICJmaWxsZWQiIDogImVtcHR5IiwKKwkocHJpdi0+dHhucHJpbmd0YWlsIC0gcHJpdi0+dHhucHJpbmcpLzgsKHByaXYtPnR4bnByaW5naGVhZCAtCitwcml2LT50eG5wcmluZykvOCk7CisqLworCS8vbmljdiA9ICh1MzIqKSAoKG5pYyAtIG5pY2JlZ2luKSArIChpbnQpYmVnaW4pOworCW5pY3YgPSAodTMyKikgKChuaWMgLSBuaWNiZWdpbikgKyAodTgqKWJlZ2luKTsKKwlpZigoaGVhZCA8PSB0YWlsICYmIChuaWN2ID4gdGFpbCB8fCBuaWN2IDwgaGVhZCkpIHx8CisJCShoZWFkID4gdGFpbCAmJiAobmljdiA+IHRhaWwgJiYgbmljdiA8IGhlYWQpKSl7CisKKwkJCURNRVNHVygibmljIGhhcyBsb3N0IHBvaW50ZXIiKTsKKyNpZmRlZiBERUJVR19UWF9ERVNDCisJCQkvL2NoZWNrX3R4X3JpbmcoZGV2LE5PUk1fUFJJT1JJVFkpOworCQkJY2hlY2tfdHhfcmluZyhkZXYscHJpKTsKKyNlbmRpZgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKwkJCXJ0bDgxODBfcmVzdGFydChkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkvKiB3ZSBjaGVjayBhbGwgdGhlIGRlc2NyaXB0b3JzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRoZSBuaWMsCisJICogYnV0IG5vdCB0aGUgY3VycmVubHkgcG9pbnRlZCBieSB0aGUgbmljICh0aGUgbmV4dCB0byBiZSB0eGVkKQorCSAqIGFuZCB0aGUgcHJldmlvdXMgb2YgdGhlIHBvaW50ZWQgKG1pZ2h0IGJlIGluIHByb2Nlc3MgPz8pCisJKi8KKwkvL2lmIChoZWFkID09IG5pYykgcmV0dXJuOworCS8vRE1FU0coIiV4ICV4IixoZWFkLG5pYyk7CisJb2ZmcyA9IChuaWMgLSBuaWNiZWdpbik7CisJLy9ETUVTRygiJXggJXggJXgiLG5pYyAsKHUzMiluaWNiZWdpbiwgKGludCluaWMgLW5pY2JlZ2luKTsKKworCW9mZnMgPSBvZmZzIC8gOCAvNDsKKworCWhkID0gKGhlYWQgLSBiZWdpbikgLzg7CisKKwlpZihvZmZzID49IGhkKQorCQlqID0gb2ZmcyAtIGhkOworCWVsc2UKKwkJaiA9IG9mZnMgKyAocHJpdi0+dHhyaW5nY291bnQgLTEgLWhkKTsKKwkvLwlqPSBwcml2LT50eHJpbmdjb3VudCAtMS0gKGhkIC0gb2Zmcyk7CisKKwlqLT0yOworCWlmKGo8MCkgaj0wOworCisKKwlmb3IoaT0wO2k8ajtpKyspCisJeworLy8JCXByaW50aygiKysrKysrKysrKysrK2NoZWNrIHN0YXR1cyBkZXNjXG4iKTsKKwkJaWYoKCpoZWFkKSAmICgxPDwzMSkpCisJCQlicmVhazsKKwkJaWYoKCgqaGVhZCkmKDB4MTAwMDAwMDApKSAhPSAwKXsKKy8vCQkJcHJpbnRrKCIrKysrKysrKysrKysrK2xhc3QgZGVzYyxyZXRyeSBjb3VudCBpcyAlZFxuIiwoKCpoZWFkKSAmICgweDAwMDAwMGZmKSkpOworCQkJcHJpdi0+Q3VyclJldHJ5Q250ICs9ICh1MTYpKCgqaGVhZCkgJiAoMHgwMDAwMDBmZikpOworI2lmIDEKKwkJCWlmKCFlcnJvcikKKwkJCXsKKwkJCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKy8vCQkJCXByaW50aygiTnVtVHhPa1RvdGFsIGlzICVkXG4iLHByaXYtPk51bVR4T2tUb3RhbCsrKTsKKwkJCX0KKyNlbmRpZgorCQkJLy8JcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3JldHJ5X2NvdW50IGlzICVkXG4iLF9fRlVOQ1RJT05fXywoKCpoZWFkKSAmICgweDAwMDAwMGZmKSkpOworCQl9CisJCWlmKCFlcnJvcil7CisJCQlwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbCArPSAoKihoZWFkKzMpKSAmICgweDAwMDAwZmZmKTsKKwkJfQorLy8JCXByaW50aygiaW4gZnVuY3Rpb24gJXM6Y3Vycl90eG9rYnl0ZV9jb3VudCBpcyAlZFxuIixfX0ZVTkNUSU9OX18sKCooaGVhZCszKSkgJiAoMHgwMDAwMGZmZikpOworCQkqaGVhZCA9ICpoZWFkICZ+ICgxPDwzMSk7CisKKwkJaWYoKGhlYWQgLSBiZWdpbikvOCA9PSBwcml2LT50eHJpbmdjb3VudC0xKQorCQkJaGVhZD1iZWdpbjsKKworCQllbHNlCisJCQloZWFkKz04OworCX0KKyNpZiAwCisJaWYobmljdiA9PSBiZWdpbikKKwkJdHhkdiA9IGJlZ2luICsgKHByaXYtPnR4cmluZ2NvdW50IC0xKSo4OworCWVsc2UKKwkJdHhkdiA9IG5pY3YgLSA4OworCisJdHhlZCA9ICEodHhkdlswXSAmKDE8PDMxKSk7CisKKwlpZih0eGVkKXsKKwkJaWYoISh0eGR2WzBdICYgKDE8PDE1KSkpIGVycm9yID0gMTsKKwkJLy9pZighKHR4ZHZbMF0gJiAoMTw8MzApKSkgZXJyb3IgPSAxOworCQlpZihlcnJvcilETUVTRygiJXgiLHR4ZHZbMF0pOworIAl9CisjZW5kaWYKKwkvL0RNRVNHKCIleCIsdHhkdlswXSk7CisJLyogdGhlIGhlYWQgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGxhc3QgY2VydGFpbmx5IFRYZWQKKwkgKiAob3IgYXQgbGVhc3QgcHJvY2Vzc2VkIGJ5IHRoZSBuaWMpIHBhY2tldC4KKwkgKiBUaGUgZHJpdmVyIHRha2UgZm9yY2VmdWxseSBvd25pbmcgb2YgYWxsIHRoZXNlIHBhY2tldHMKKwkgKiBJZiB0aGUgcGFja2V0IHByZXZpb3VzIG9mIHRoZSBuaWMgcG9pbnRlciBoYXMgYmVlbgorCSAqIHByb2Nlc3NlZCB0aGlzIGRvZXNuJ3QgbWF0dGVyOiBpdCB3aWxsIGJlIGNoZWNrZWQKKwkgKiBoZXJlIGF0IHRoZSBuZXh0IHJvdW5kLiBBbnl3YXkgaWYgbm8gbW9yZSBwYWNrZXQgYXJlCisJICogVFhlZCBubyBtZW1vcnkgbGVhayBvY2NvdXIgYXQgYWxsLgorCSAqLworCisJc3dpdGNoKHByaSkgeworCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQlwcml2LT50eG1hcHJpbmdoZWFkID0gaGVhZDsKKwkJCS8vcHJpbnRrKCIxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiBwcmlvcml0eSBjaGVjayFcbiIpOworCQlpZihwcml2LT5hY2tfdHhfdG9faWVlZSl7CisJCQkJLy8gdHJ5IHRvIGltcGxlbWVudCBwb3dlci1zYXZlIG1vZGUgMjAwOC4xLjIyCisJCS8vCXByaW50aygiMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gcHJpb3JpdHkgY2hlY2shXG4iKTsKKyNpZiAxCisJCQlpZihydGw4MTgwX2lzX3R4X3F1ZXVlX2VtcHR5KGRldikpeworCQkJLy8JcHJpbnRrKCJ0eCBxdWV1ZSBlbXB0eSwgYWZ0ZXIgc2VuZCBudWxsIHNsZWVwIHBhY2tldCwgdHJ5IHRvIHNsZWVwICFcbiIpOworCQkJCXByaXYtPmFja190eF90b19pZWVlID0gMDsKKwkJCQlpZWVlODAyMTFfcHNfdHhfYWNrKHByaXYtPmllZWU4MDIxMSwhZXJyb3IpOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQlwcml2LT50eGJrcHJpbmdoZWFkID0gaGVhZDsKKwkJYnJlYWs7CisKKwljYXNlIEJFX1BSSU9SSVRZOgorCQlwcml2LT50eGJlcHJpbmdoZWFkID0gaGVhZDsKKwkJYnJlYWs7CisKKwljYXNlIFZJX1BSSU9SSVRZOgorCQlwcml2LT50eHZpcHJpbmdoZWFkID0gaGVhZDsKKwkJYnJlYWs7CisKKwljYXNlIFZPX1BSSU9SSVRZOgorCQlwcml2LT50eHZvcHJpbmdoZWFkID0gaGVhZDsKKwkJYnJlYWs7CisKKwljYXNlIEhJX1BSSU9SSVRZOgorCQlwcml2LT50eGhwcmluZ2hlYWQgPSBoZWFkOworCQlicmVhazsKKwl9CisKKwkvKkRNRVNHKCIleCAleCAleCIsIChwcml2LT50eG5wcmluZ2hlYWQgLSBwcml2LT50eG5wcmluZykgLzggLAorCQkocHJpdi0+dHhucHJpbmd0YWlsIC0gcHJpdi0+dHhucHJpbmcpIC84LAorCQlvZmZzICk7CisJKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZyk7CisKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF90eF9pcnFfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTgwX3ByaXYsIHJlc2V0X3dxKTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd2F0Y2hfZG9nX3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF90eF9pcnFfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCXJ0bDgxODBfdHhfaXNyKGRldixNQU5BR0VfUFJJT1JJVFksMCk7Cit9CitpcnFyZXR1cm5fdCBydGw4MTgwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpuZXRkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbmV0ZGV2OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnRhOworCisJLyogV2Ugc2hvdWxkIHJldHVybiBJUlFfTk9ORSwgYnV0IGZvciBub3cgbGV0IG1lIGtlZXAgdGhpcyAqLworCWlmKHByaXYtPmlycV9lbmFibGVkID09IDApIHJldHVybiBJUlFfSEFORExFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkvL0lTUjogNGJ5dGVzCisJaW50YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgSVNSKTsvLyAmIHByaXYtPkludHJNYXNrOworCXdyaXRlX25pY19kd29yZChkZXYsSVNSLGludGEpOyAvLyByZXNldCBpbnQgc2l0dWF0aW9uCisjZWxzZQorCWludGEgPSByZWFkX25pY193b3JkKGRldixJTlRBKSAmIHByaXYtPmlycV9tYXNrOworCXdyaXRlX25pY193b3JkKGRldixJTlRBLGludGEpOyAvLyByZXNldCBpbnQgc2l0dWF0aW9uCisjZW5kaWYKKworCXByaXYtPnN0YXRzLnNoaW50cysrOworCisJLy9ETUVTRygiRW50ZXIgaW50ZXJydXB0LCBJU1IgdmFsdWUgPSAweCUwOHgiLCBpbnRhKTsKKworCWlmKCFpbnRhKXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJLyoKKwkgICBtb3N0IHByb2JhYmx5IHdlIGNhbiBzYWZlbHkgcmV0dXJuIElSUV9OT05FLAorCSAgIGJ1dCBmb3Igbm93IGlzIGJldHRlciB0byBhdm9pZCBwcm9ibGVtcworCSovCisJfQorCisJaWYoaW50YSA9PSAweGZmZmYpeworCQkJLyogSFcgZGlzYXBwYXJlZCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXByaXYtPnN0YXRzLmludHMrKzsKKyNpZmRlZiBERUJVR19JUlEKKwlETUVTRygiTklDIGlycSAleCIsaW50YSk7CisjZW5kaWYKKwkvL3ByaXYtPmlycXBlbmRpbmcgPSBpbnRhOworCisKKwlpZighbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmKGludGEgJiBJU1JfVGltZU91dCl7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFRpbWVySW50LCAwKTsKKwkJLy9ETUVTRygiPT09PT09PT09PT09PT09PT0+d2FraW5nIHVwIik7CisvLwkJcnRsODE4MF9od193YWtldXAoZGV2KTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RCRE9LKXsKKwkJcHJpdi0+c3RhdHMudHhiZWFjb24rKzsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RCREVSKXsKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIrKzsKKwl9CisKKwlpZihpbnRhICAmIElNUl9UTUdET0sgKSB7CisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixNQU5BR0VfUFJJT1JJVFksMCk7CisvLwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnR4X2lycV93cSk7CisKKwl9CisKKwlpZihpbnRhICYgSVNSX1RIUERFUil7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBoaWdoIHByaW9yaXR5IEVSUiIpOworI2VuZGlmCisJCXByaXYtPnN0YXRzLnR4aHBlcnIrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LEhJX1BSSU9SSVRZLDEpOworCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworCX0KKworCWlmKGludGEgJiBJU1JfVEhQRE9LKXsgLy9IaWdoIHByaW9yaXR5IHR4IG9rCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0cgKCJUWCBoaWdoIHByaW9yaXR5IE9LIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCXByaXYtPnN0YXRzLnR4aHBva2ludCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsSElfUFJJT1JJVFksMCk7CisJfQorCisJaWYoaW50YSAmIElTUl9SRVIpIHsKKwkJcHJpdi0+c3RhdHMucnhlcnIrKzsKKyNpZmRlZiBERUJVR19SWAorCQlETUVTR1coIlJYIGVycm9yIGludCIpOworI2VuZGlmCisJfQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCWlmKGludGEgJiBJU1JfVEJLREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIEJLX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4YmtwZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBia3AgZXJyb3IgaW50Iik7CisjZW5kaWYKKwkJLy90YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdHhfdGFza2xldCk7CisJCXJ0bDgxODBfdHhfaXNyKGRldixCS19QUklPUklUWSwxKTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RCRURFUil7IC8vY29ycmVzcG9uZGluZyB0byBCRV9QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGJlcGVycisrOworCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggYmVwIGVycm9yIGludCIpOworI2VuZGlmCisJCXJ0bDgxODBfdHhfaXNyKGRldixCRV9QUklPUklUWSwxKTsKKwkJLy90YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdHhfdGFza2xldCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CisJfQorI2VuZGlmCisJaWYoaW50YSAmIElTUl9UTlBERVIpeyAvL2NvcnJlc3BvbmRpbmcgdG8gVk9fUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhucGVycisrOworCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggbnAgZXJyb3IgaW50Iik7CisjZW5kaWYKKwkJLy90YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdHhfdGFza2xldCk7CisJCXJ0bDgxODBfdHhfaXNyKGRldixOT1JNX1BSSU9SSVRZLDEpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgTk9STV9QUklPUklUWSk7CisjZW5kaWYKKwl9CisKKwlpZihpbnRhICYgSVNSX1RMUERFUil7IC8vY29ycmVzcG9uZGluZyB0byBWSV9QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGxwZXJyKys7CisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBscCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQlydGw4MTgwX3R4X2lzcihkZXYsTE9XX1BSSU9SSVRZLDEpOworCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIExPV19QUklPUklUWSk7CisJfQorCisJaWYoaW50YSAmIElTUl9ST0speworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHKCJGcmFtZSBhcnJpdmVkICEiKTsKKyNlbmRpZgorCQkvL3ByaXYtPk51bVJ4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPnN0YXRzLnJ4aW50Kys7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JRb1NPSyApeworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHKCJRb1MgRnJhbWUgYXJyaXZlZCAhIik7CisjZW5kaWYKKwkJLy9wcml2LT5OdW1SeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5zdGF0cy5yeGludCsrOworCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJfQorCWlmKGludGEgJiBJU1JfQmNuSW50KSB7CisJCS8vRE1FU0coIlByZXBhcmluZyBCZWFjb25zIik7CisJCXJ0bDgxODBfcHJlcGFyZV9iZWFjb24oZGV2KTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1JEVSl7CisvLyNpZmRlZiBERUJVR19SWAorCQlETUVTR1coIk5vIFJYIGRlc2NyaXB0b3IgYXZhaWxhYmxlIik7CisJCXByaXYtPnN0YXRzLnJ4cmR1Kys7CisvLyNlbmRpZgorCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJCS8qcXVldWVfd29yayhwcml2LT53b3JrcXVldWUgLCZwcml2LT5yZXN0YXJ0X3dvcmspOyovCisKKwl9CisJaWYoaW50YSAmIElTUl9SWEZPVlcpeworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHVygiUlggZmlmbyBvdmVyZmxvdyIpOworI2VuZGlmCisJCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3crKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCQkvL3F1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlICwmcHJpdi0+cmVzdGFydF93b3JrKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RYRk9WVykgcHJpdi0+c3RhdHMudHhvdmVyZmxvdysrOworCisJaWYoaW50YSAmIElTUl9UTlBET0speyAvL05vcm1hbCBwcmlvcml0eSB0eCBvaworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHICgiVFggbm9ybWFsIHByaW9yaXR5IE9LIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCS8vCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cysrOworCQlwcml2LT5zdGF0cy50eG5wb2tpbnQrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LE5PUk1fUFJJT1JJVFksMCk7CisJfQorCisJaWYoaW50YSAmIElTUl9UTFBET0speyAvL0xvdyBwcmlvcml0eSB0eCBvaworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHICgiVFggbG93IHByaW9yaXR5IE9LIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCS8vCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cysrOworCQlwcml2LT5zdGF0cy50eGxwb2tpbnQrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LExPV19QUklPUklUWSwwKTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIExPV19QUklPUklUWSk7CisJfQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJaWYoaW50YSAmIElTUl9UQktET0speyAvL2NvcnJlc3BvbmRpbmcgdG8gQktfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhia3Bva2ludCsrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggYmsgcHJpb3JpdHkgb2siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJLX1BSSU9SSVRZLDApOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOworCX0KKworCWlmKGludGEgJiBJU1JfVEJFRE9LKXsgLy9jb3JyZXNwb25kaW5nIHRvIEJFX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4YmVwZXJyKys7CisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0dXKCJUWCBiZSBwcmlvcml0eSBvayIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQlydGw4MTgwX3R4X2lzcihkZXYsQkVfUFJJT1JJVFksMCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CisJfQorI2VuZGlmCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKwordm9pZCBydGw4MTgwX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE4MF9wcml2KiBwcml2KQoreworLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKKworLyoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV9sb2NrLCBmbGFncyk7CisJcHJpdi0+aXJxX21hc2sgJj1+SU1SX1JPSzsKKwlwcml2LT5pcnFfbWFzayAmPX5JTVJfUkRVOworCisJcnRsODE4MF9pcnFfZW5hYmxlKHByaXYtPmRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKyovCisJcnRsODE4MF9yeChwcml2LT5kZXYpOworCisvKglzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5pcnFfbWFzayB8PSBJTVJfUk9LOworCXByaXYtPmlycV9tYXNrIHw9IElNUl9SRFU7CisJcnRsODE4MF9pcnFfZW5hYmxlKHByaXYtPmRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKyovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitsaXpoYW9taW5nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJGIHBvd2VyIG9uL3Bvd2VyIG9mZiAtLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8vc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIEdQSU9DaGFuZ2VSRldvcmtJdGVtLndvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2Vsc2UKK3ZvaWQgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCisJLy91MTYgdG1wMmJ5dGU7CisJdTggYnRQU1I7CisJdTggYnRDb25maWcwOworCVJUX1JGX1BPV0VSX1NUQVRFCWVSZlBvd2VyU3RhdGVUb1NldDsKKwlib29sIAliQWN0dWFsbHlTZXQ9ZmFsc2U7CisKKwljaGFyICphcmd2WzNdOworICAgICAgICBzdGF0aWMgY2hhciAqUmFkaW9Qb3dlclBhdGggPSAiL2V0Yy9hY3BpL2V2ZW50cy9SYWRpb1Bvd2VyLnNoIjsKKyAgICAgICAgc3RhdGljIGNoYXIgKmVudnBbXSA9IHsiSE9NRT0vIiwgIlRFUk09bGludXgiLCAiUEFUSD0vdXNyL2JpbjovYmluIiwgTlVMTH07CisJc3RhdGljIGludCByZWFkZl9jb3VudCA9IDA7CisJLy9wcmludGsoIj09PT09PT09PT09PT4lcyBpbiBcbiIsIF9fZnVuY19fKTsKKworI2lmZGVmIEVOQUJMRV9MUFMKKwlpZihyZWFkZl9jb3VudCAlIDEwID09IDApCisJCXByaXYtPlBvd2VyUHJvZmlsZSA9IHJlYWRfYWNhZGFwdGVyX2ZpbGUoIi9wcm9jL2FjcGkvYWNfYWRhcHRlci9BQzAvc3RhdGUiKTsKKworCXJlYWRmX2NvdW50ID0gKHJlYWRmX2NvdW50KzEpJTB4ZmZmZjsKKyNlbmRpZgorI2lmIDAKKwlpZihwcml2LT51cCA9PSAwKS8vZHJpdmVyIHN0b3BwZWQKKwkJeworCQkJcHJpbnRrKCJcbkRvIG5vdGhpbmcuLi4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJZWxzZQorI2VuZGlmCisJCXsKKwkJCS8vIFdlIHNob3VsZCB0dXJuIG9mZiBMRUQgYmVmb3JlIHBvbGxpbmcgRkY1MVs0XS4KKworCQkJLy9UdXJuIG9mZiBMRUQuCisJCQlidFBTUiA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChidFBTUiAmIH5CSVQzKSk7CisKKwkJCS8vSXQgbmVlZCB0byBkZWxheSA0dXMgc3VnZ2VzdGVkIGJ5IEpvbmcsIDIwMDgtMDEtMTYKKwkJCXVkZWxheSg0KTsKKworCQkJLy9IVyByYWRpbyBPbi9PZmYgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBGRjUxWzRdKGNvbmZpZzApCisJCQlidENvbmZpZzAgPSBidFBTUiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUcwKTsKKworCQkJLy9UdXJuIG9uIExFRC4KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCBidFBTUnwgQklUMyk7CisKKwkJCWVSZlBvd2VyU3RhdGVUb1NldCA9IChidENvbmZpZzAgJiBCSVQ0KSA/ICBlUmZPbiA6IGVSZk9mZjsKKworCQkJaWYoKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPbikpCisJCQl7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9IGZhbHNlOworCQkJCWJBY3R1YWxseVNldCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKChwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IGZhbHNlKSAmJiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9mZikpCisJCQl7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9IHRydWU7CisJCQkJYkFjdHVhbGx5U2V0ID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYoYkFjdHVhbGx5U2V0KQorCQkJeworCQkJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZQb3dlclN0YXRlVG9TZXQsIFJGX0NIQU5HRV9CWV9IVyk7CisKKwkJCQkvKiBUbyB1cGRhdGUgdGhlIFVJIHN0YXR1cyBmb3IgUG93ZXIgc3RhdHVzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMV0gPSAiUkZPRkYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoIXByaXYtPlJmT2ZmUmVhc29uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlsxXSA9ICJSRk9OIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGFyZ3ZbMV0gPSAiUkZPRkYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0gPSBSYWRpb1Bvd2VyUGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndlsyXSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VybW9kZWhlbHBlcihSYWRpb1Bvd2VyUGF0aCxhcmd2LGVudnAsMSk7CisJCQl9CisKKwkJfQorCit9CisKK3N0YXRpYyB1OCByZWFkX2FjYWRhcHRlcl9maWxlKGNoYXIgKmZpbGVuYW1lKQoreworLy8jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorI2lmIDAKKwlpbnQgZmQ7CisJY2hhciBidWZbMV07CisJY2hhciByZXRbNTBdOworCWludCBpID0gMDsKKwlpbnQgbiA9IDA7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCisJZmQgPSBzeXNfb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIDApOworCWlmIChmZCA+PSAwKSB7CisJCXdoaWxlIChzeXNfcmVhZChmZCwgYnVmLCAxKSA9PSAxKQorCQl7CisJCQlpKys7CisJCQlpZihpPjEwKQorCQkJeworCQkJCWlmKGJ1ZlswXSE9JyAnKQorCQkJCXsKKwkJCQkJcmV0W25dPWJ1ZlswXTsKKwkJCQkJbisrOworCQkJCX0KKwkJCX0KKwkJfQorCQlzeXNfY2xvc2UoZmQpOworCX0KKwlyZXRbbl09J1wwJzsKKy8vCXByaW50aygiJXMgXG4iLCByZXQpOworCXNldF9mcyhvbGRfZnMpOworCisJaWYoc3RybmNtcChyZXQsICJvZmYtbGluZSIsOCkgPT0gMCkKKwl7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIGluaXQgLyBleGl0IHN0dWJzIC0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfaW5pdChydGw4MTgwX3BjaV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChydGw4MTgwX3BjaV9tb2R1bGVfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJkYzExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCkBAIC0wLDAgKzEsMTcyNSBAQAorLy8jaW5jbHVkZSAicjgxODAuaCINCisjaW5jbHVkZSAicjgxODBfZG0uaCINCisjaW5jbHVkZSAicjgxODBfaHcuaCINCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCINCisvL3tieSBhbXkgMDgwMzEyDQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJUmV0dXJuIFRSVUUgaWYgd2Ugc2hhbGwgcGVyZm9ybSBIaWdoIFBvd2VyIE1lY2FobmlzbSwgRkFMU0Ugb3RoZXJ3aXNlLgkNCisvLw0KKy8vK2J5IGFteSAwODAzMTINCisjZGVmaW5lIFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9EICAgICAgMzAwDQorDQorYm9vbCBDaGVja0hpZ2hQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsNCisNCisJaWYoIXByaXYtPmJSZWdIaWdoUG93ZXJNZWNoYW5pc20pDQorCXsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkJDQorCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcpDQorCXsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVXBkYXRlIFR4IHBvd2VyIGxldmVsIGlmIG5lY2Vzc2FyeS4NCisvLwkJU2VlIGFsc28gRG9SeEhpZ2hQb3dlcigpIGFuZCBTZXRUeFBvd2VyTGV2ZWw4MTg1KCkgZm9yIHJlZmVyZW5jZS4NCisvLw0KKy8vCU5vdGU6DQorLy8JCVRoZSByZWFzb24gd2h5IHdlIHVkcGF0ZSBUeCBwb3dlciBsZXZlbCBoZXJlIGluc3RlYWQgb2YgRG9SeEhpZ2hQb3dlcigpIA0KKy8vCQlpcyB0aGUgbnVtYmVyIG9mIElPIHRvIGNoYW5nZSBUeCBwb3dlciBpcyBtdWNoIG1vcmUgdGhhbiBjaGFuZSBUUiBzd2l0Y2ggDQorLy8JCWFuZCB0aGV5IGFyZSByZWxhdGVkIHRvIE9GRE0gYW5kIE1BQyByZWdpc3RlcnMuIA0KKy8vCQlTbywgd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgaXQgc28gZnJlcXVlbnRseSBpbiBwZXItUnggcGFja2V0IGJhc2UuIA0KKy8vDQordm9pZA0KK0RvVHhIaWdoUG93ZXIoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKwl1MTYJCQlIaVB3clVwcGVyVGggPSAwOw0KKwl1MTYJCQlIaVB3ckxvd2VyVGggPSAwOw0KKwl1OAkJCVJTU0lIaVB3clVwcGVyVGg7DQorCXU4CQkJUlNTSUhpUHdyTG93ZXJUaDsNCisJdTgJCQl1MWJUbXA7DQorCWNoYXIJCQlPZmRtVHhQd3JJZHgsIENja1R4UHdySWR4Ow0KKw0KKwkvL3ByaW50aygiLS0tLT4gRG9UeEhpZ2hQb3dlcigpXG4iKTsNCisNCisJSGlQd3JVcHBlclRoID0gcHJpdi0+UmVnSGlQd3JVcHBlclRoOw0KKwlIaVB3ckxvd2VyVGggPSBwcml2LT5SZWdIaVB3ckxvd2VyVGg7CQkJCQkJDQorCQ0KKwlIaVB3clVwcGVyVGggPSBIaVB3clVwcGVyVGggKiAxMDsNCisJSGlQd3JMb3dlclRoID0gSGlQd3JMb3dlclRoICogMTA7DQorCVJTU0lIaVB3clVwcGVyVGggPSBwcml2LT5SZWdSU1NJSGlQd3JVcHBlclRoOw0KKwlSU1NJSGlQd3JMb3dlclRoID0gcHJpdi0+UmVnUlNTSUhpUHdyTG93ZXJUaDsNCisNCisJLy9sem0gYWRkIDA4MDgyNg0KKwlPZmRtVHhQd3JJZHggID0gcHJpdi0+Y2h0eHB3cl9vZmRtW3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdOyANCisJQ2NrVHhQd3JJZHggID0gcHJpdi0+Y2h0eHB3cltwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXTsgDQorDQorCS8vCXByaW50aygiRG9UeEhpZ2hQb3dlcigpIC0gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOiVkLCBDdXJDQ0tSU1NJID0gJWQgLCBiQ3VyQ0NLUGt0PSAlZCBcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgcHJpdi0+Q3VyQ0NLUlNTSSwgcHJpdi0+YkN1ckNDS1BrdCApOw0KKwkNCisJaWYoKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA+IEhpUHdyVXBwZXJUaCkgfHwNCisJCShwcml2LT5iQ3VyQ0NLUGt0ICYmIChwcml2LT5DdXJDQ0tSU1NJID4gUlNTSUhpUHdyVXBwZXJUaCkpKQ0KKwl7DQorCQkvLyBTdGV2ZW5sIHN1Z2dlc3RlZCB0aGF0IGRlZ3JhZGUgOGRibSBpbiBoaWdoIHBvd2VyIHNhdGUuIDIwMDctMTItMDQgSXNhaWFoIA0KKwkJDQorCS8vCXByaW50aygiPT09PT0+RG9UeEhpZ2hQb3dlcigpIC0gSGlnaCBQb3dlciAtIFVuZGVjb3JhdGVkU21vb3RoZWRTUzolZCwgIEhpUHdyVXBwZXJUaCA9ICVkIFxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBIaVB3clVwcGVyVGggKTsNCisJCXByaXYtPmJUb1VwZGF0ZVR4UHdyID0gdHJ1ZTsNCisJCXUxYlRtcD0gcmVhZF9uaWNfYnl0ZShkZXYsIENDS19UWEFHQyk7DQorDQorCQkvLyBJZiBpdCBuZXZlciBlbnRlciBIaWdoIFBvd2VyLg0KKwkJaWYoIENja1R4UHdySWR4ID09IHUxYlRtcCkNCisJCXsNCisJCXUxYlRtcCA9ICh1MWJUbXAgPiAxNikgPyAodTFiVG1wIC0xNik6IDA7ICAvLyA4ZGJtDQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgdTFiVG1wKTsNCisNCisJCXUxYlRtcD0gcmVhZF9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MpOw0KKwkJdTFiVG1wID0gKHUxYlRtcCA+IDE2KSA/ICh1MWJUbXAgLTE2KTogMDsgIC8vIDhkYm0NCisJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiVG1wKTsNCisJCX0NCisJCQ0KKwl9DQorCWVsc2UgaWYoKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA8IEhpUHdyTG93ZXJUaCkgJiYNCisJCSghcHJpdi0+YkN1ckNDS1BrdCB8fCBwcml2LT5DdXJDQ0tSU1NJIDwgUlNTSUhpUHdyTG93ZXJUaCkpDQorCXsNCisJLy8JIHByaW50aygiRG9UeEhpZ2hQb3dlcigpIC0gbG93ZXIgUG93ZXIgLSBVbmRlY29yYXRlZFNtb290aGVkU1M6JWQsICBIaVB3clVwcGVyVGggPSAlZCBcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgSGlQd3JMb3dlclRoICk7DQorCQlpZihwcml2LT5iVG9VcGRhdGVUeFB3cikNCisJCXsNCisJCQlwcml2LT5iVG9VcGRhdGVUeFB3ciA9IGZhbHNlOw0KKwkJCS8vU0QzIHJlcXVpcmVkLg0KKwkJCXUxYlRtcD0gcmVhZF9uaWNfYnl0ZShkZXYsIENDS19UWEFHQyk7CQkJDQorCQkJaWYodTFiVG1wIDwgQ2NrVHhQd3JJZHgpDQorCQkJew0KKwkJCS8vdTFiVG1wID0gKCh1MWJUbXArMTYpID4gMzUpID8gMzU6ICh1MWJUbXArMTYpOyAgLy8gOGRibQ0KKwkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIHUxYlRtcCk7DQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIENja1R4UHdySWR4KTsNCisJCQl9DQorDQorCQkJdTFiVG1wPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorCQkJaWYodTFiVG1wIDwgT2ZkbVR4UHdySWR4KQ0KKwkJCXsNCisJCQkvL3UxYlRtcCA9ICgodTFiVG1wKzE2KSA+IDM1KSA/IDM1OiAodTFiVG1wKzE2KTsgIC8vIDhkYm0NCisJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiVG1wKTsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIE9mZG1UeFB3cklkeCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8vcHJpbnRrKCI8LS0tLSBEb1R4SGlnaFBvd2VyKClcbiIpOw0KK30NCisNCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlDYWxsYmFjayBmdW5jdGlvbiBvZiBVcGRhdGVUeFBvd2VyV29ya0l0ZW0uDQorLy8JCUJlY2F1c2Ugb2Ygc29tZSBldmVudCBoYXBwZW5kLCBlLmcuIENDWCBUUEMsIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLCANCisvLwkJV2UgdXBkYXRlIFR4IHBvd2VyIG9mIGN1cnJlbnQgY2hhbm5lbCBhZ2Fpbi4gDQorLy8NCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQ0KK3ZvaWQgcnRsODE4MF90eF9wd193cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQ0KK3sNCisvLyAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCB3YXRjaF9kb2dfd3EpOw0KKy8vICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikNCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd2F0Y2hfZG9nX3dxKTsNCisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsNCisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLHR4X3B3X3dxKTsNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfdHhfcHdfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorCS8vIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisjZW5kaWYNCisNCisvLwlwcmludGsoIi0tLS0+IFVwZGF0ZVR4UG93ZXJXb3JrSXRlbUNhbGxiYWNrKClcbiIpOw0KKwkNCisJRG9UeEhpZ2hQb3dlcihkZXYpOwkNCisJDQorLy8JcHJpbnRrKCI8LS0tLSBVcGRhdGVUeFBvd2VyV29ya0l0ZW1DYWxsYmFjaygpXG4iKTsNCit9DQorDQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJUmV0dXJuIFRSVUUgaWYgd2Ugc2hhbGwgcGVyZm9ybSBESUcgTWVjYWhuaXNtLCBGQUxTRSBvdGhlcndpc2UuCQ0KKy8vDQorYm9vbA0KK0NoZWNrRGlnKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7DQorDQorCWlmKCFwcml2LT5iRGlnTWVjaGFuaXNtKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwkvL2lmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPCAzNikgLy8gU2NoZWR1bGUgRGlnIHVuZGVyIGFsbCBPRkRNIHJhdGVzLiBCeSBCcnVjZSwgMjAwNy0wNi0wMS4NCisJaWYoKHByaXYtPmllZWU4MDIxMS0+cmF0ZS81KSA8IDM2KSAvLyBTY2hlZHVsZSBEaWcgdW5kZXIgYWxsIE9GRE0gcmF0ZXMuIEJ5IEJydWNlLCAyMDA3LTA2LTAxLg0KKwkJcmV0dXJuIGZhbHNlOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJSW1wbGVtZW50YXRpb24gb2YgRElHIGZvciBaZWJyYSBhbmQgWmVicmEyLgkNCisvLw0KK3ZvaWQNCitESUdfWmVicmEoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKwl1MTYJCQlDQ0tGYWxzZUFsYXJtLCBPRkRNRmFsc2VBbGFybTsNCisJdTE2CQkJT2ZkbUZBMSwgT2ZkbUZBMjsNCisJaW50CQkJSW5pdGlhbEdhaW5TdGVwID0gNzsgLy8gVGhlIG51bWJlciBvZiBpbml0aWFsIGdhaW4gc3RhZ2VzLg0KKwlpbnQJCQlMb3dlc3RHYWluU3RhZ2UgPSA0OyAvLyBUaGUgY2FwYWJsZSBsb3dlc3Qgc3RhZ2Ugb2YgcGVyZm9ybWluZyBkaWcgd29ya2l0ZW0uDQorCXUzMiAJCQlBd2FrZVBlcmlvZEluMlNlYz0wOw0KKw0KKwkvL3ByaW50aygiLS0tLS0tLS0tPiBESUdfWmVicmEoKVxuIik7DQorDQorCUNDS0ZhbHNlQWxhcm0gPSAodTE2KShwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgJiAweDAwMDBmZmZmKTsNCisJT0ZETUZhbHNlQWxhcm0gPSAodTE2KSgocHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlID4+IDE2KSAmIDB4MDAwMGZmZmYpOw0KKwlPZmRtRkExID0gIDB4MTU7DQorCU9mZG1GQTIgPSAoKHUxNikocHJpdi0+UmVnRGlnT2ZkbUZhVXBUaCkpIDw8IDg7DQorDQorLy8JcHJpbnRrKCJESUcqKioqKioqKioqQ0NLIEZhbHNlIEFsYXJtOiAlI1ggXG4iLENDS0ZhbHNlQWxhcm0pOw0KKy8vCXByaW50aygiRElHKioqKioqKioqKk9GRE0gRmFsc2UgQWxhcm06ICUjWCBcbiIsT0ZETUZhbHNlQWxhcm0pOw0KKw0KKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBpbml0aWFsIGdhaW4gc3RlcHMgaXMgZGlmZmVyZW50LCBieSBCcnVjZSwgMjAwNy0wNC0xMy4NCisJaWYgKHByaXYtPkluaXRpYWxHYWluID09IDAgKSAvL2F1dG9ESUcNCisJeyAvLyBBZHZpc2VkIGZyb20gU0QzIERaDQorCQlwcml2LT5Jbml0aWFsR2FpbiA9IDQ7IC8vIEluIDg3QiwgbTc0ZEJtIG1lYW5zIFN0YXRlIDQgKG04MmRCbSkNCisJfQ0KKwkvL2lmKHBIYWxEYXRhLT5WZXJzaW9uSUQgIT0gVkVSU0lPTl84MTg3Ql9CKQ0KKwl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoNCisJCU9mZG1GQTEgPSAgMHgyMDsNCisJfQ0KKwkNCisjaWYgMSAvL2x6bSByZXNlcnZlZCAwODA4MjYNCisJQXdha2VQZXJpb2RJbjJTZWMgPSAoMjAwMC1wcml2IC0+RG96ZVBlcmlvZEluUGFzdDJTZWMpOw0KKwkvL3ByaW50aygiJiYmIERvemVQZXJpb2Q9JWQgQXdha2VQZXJpb2Q9JWRcbiIsIHByaXYtPkRvemVQZXJpb2RJblBhc3QyU2VjLCBBd2FrZVBlcmlvZEluMlNlYyk7DQorCXByaXYgLT5Eb3plUGVyaW9kSW5QYXN0MlNlYz0wOw0KKwkNCisJaWYoQXdha2VQZXJpb2RJbjJTZWMpDQorCXsJDQorCQkvL1JUX1RSQUNFKENPTVBfRElHLCBEQkdfVFJBQ0UsICgiRElHOiBBd2FrZVBlcmlvZEluMlNlYyglZCkgLSBGQVRoKDB4JVggLCAweCVYKSAtPiIsQXdha2VQZXJpb2RJbjJTZWMsIE9mZG1GQTEsIE9mZG1GQTIpKTsNCisJCS8vIGFkanVlc3QgRElHIHRocmVzaG9sZC4NCisJCU9mZG1GQTEgPSAgKHUxNikoKE9mZG1GQTEqQXdha2VQZXJpb2RJbjJTZWMpICAvIDIwMDApIDsgIAkNCisJCU9mZG1GQTIgPSAgKHUxNikoKE9mZG1GQTIqQXdha2VQZXJpb2RJbjJTZWMpICAvIDIwMDApIDsNCisJCS8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19UUkFDRSwgKCIoIDB4JVggLCAweCVYKVxuIiwgT2ZkbUZBMSwgT2ZkbUZBMikpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJOy8vUlRfVFJBQ0UoQ09NUF9ESUcsIERCR19XQVJOSU5HLCAoIkVSUk9SISEgIEF3YWtlUGVyaW9kSW4yU2VjIHNob3VsZCBub3QgYmUgWkVSTyEhXG4iKSk7DQorCX0NCisjZW5kaWYNCisNCisJSW5pdGlhbEdhaW5TdGVwID0gODsNCisJTG93ZXN0R2FpblN0YWdlID0gcHJpdi0+UmVnQk1vZGVHYWluU3RhZ2U7IC8vIExvd2VzdCBnYWluIHN0YWdlLg0KKw0KKwlpZiAoT0ZETUZhbHNlQWxhcm0gPiBPZmRtRkExKQ0KKwl7DQorCQlpZiAoT0ZETUZhbHNlQWxhcm0gPiBPZmRtRkEyKQ0KKwkJew0KKwkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUrKzsNCisJCQlpZiAocHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSA+MSkNCisJCQl7DQorCQkJCS8vc2VyaW91cyBPRkRNICBGYWxzZSBBbGFybSwgbmVlZCBmYWxsYmFjaw0KKwkJCQlpZiAocHJpdi0+SW5pdGlhbEdhaW4gPCBJbml0aWFsR2FpblN0ZXApDQorCQkJCXsNCisJCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJCXByaXYtPkluaXRpYWxHYWluID0gKHByaXYtPkluaXRpYWxHYWluICsgMSk7DQorLy8JCQkJCXByaW50aygiRElHKioqKioqKioqKk9GRE0gRmFsc2UgQWxhcm06ICUjWCwgIE9mZG1GQTE6ICUjWCwgT2ZkbUZBMjogJSNYXG4iLCBPRkRNRmFsc2VBbGFybSwgT2ZkbUZBMSwgT2ZkbUZBMik7DQorLy8JCQkJCXByaW50aygiRElHKysrKysrKyBmYWxsYmFjayBPRkRNOiVkIFxuIiwgcHJpdi0+SW5pdGlhbEdhaW4pOw0KKwkJCQkJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsgDQorCQkJCX0NCisJCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSA9IDA7DQorCQkJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT0wOw0KKwkJCX0NCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpZiAocHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSkNCisJCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZS0tOw0KKwkJfQ0KKwkJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlPTA7CQkNCisJfQ0KKwllbHNlCQ0KKwl7DQorCQlpZiAocHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSkNCisJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlLS07DQorCQlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGUrKzsNCisNCisJCWlmIChwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGU+OSkNCisJCXsNCisJCQlpZiAocHJpdi0+SW5pdGlhbEdhaW4gPiBMb3dlc3RHYWluU3RhZ2UpIC8vIEluIDg3QiwgbTc4ZEJtIG1lYW5zIFN0YXRlIDQgKG04NjRkQm0pDQorCQkJew0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47DQorDQorCQkJCXByaXYtPkluaXRpYWxHYWluID0gKHByaXYtPkluaXRpYWxHYWluIC0gMSk7DQorLy8JCQkJcHJpbnRrKCJESUcqKioqKioqKioqT0ZETSBGYWxzZSBBbGFybTogJSNYLCAgT2ZkbUZBMTogJSNYLCBPZmRtRkEyOiAlI1hcbiIsIE9GRE1GYWxzZUFsYXJtLCBPZmRtRkExLCBPZmRtRkEyKTsNCisvLwkJCQlwcmludGsoIkRJRy0tLS0tLS0tLSBVcGdyYWRlIE9GRE06JWQgXG4iLCBwcml2LT5Jbml0aWFsR2Fpbik7DQorCQkJCVVwZGF0ZUluaXRpYWxHYWluKGRldik7IA0KKwkJCX0NCisJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlID0gMDsNCisJCQlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGU9MDsNCisJCX0NCisJfQ0KKw0KKy8vCXByaW50aygiRElHKysrKysrKyBPRkRNOiVkXG4iLCBwcml2LT5Jbml0aWFsR2Fpbik7CQ0KKwkvL3ByaW50aygiPC0tLS0tLS0tLSBESUdfWmVicmEoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCURpc3BhdGNoIERJRyBpbXBsZW1lbnRhdGlvbiBhY2NvcmRpbmcgdG8gUkYuIAkNCisvLw0KK3ZvaWQNCitEeW5hbWljSW5pdEdhaW4oDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkNCisJew0KKwkJY2FzZSBSRl9aRUJSQTI6ICAvLyBbQW5uaWVXb3JrYXJvdW5kXSBGb3IgWmVicmEyLCAyMDA1LTA4LTAxLg0KKwkJY2FzZSBSRl9aRUJSQTQ6DQorCQkJRElHX1plYnJhKCBkZXYgKTsNCisJCQlicmVhazsNCisJCQ0KKwkJZGVmYXVsdDoNCisJCQlwcmludGsoIkR5bmFtaWNJbml0R2FpbigpOiB1bmtub3duIFJGQ2hpcElEKCVkKSAhISFcbiIsIHByaXYtPnJmX2NoaXApOw0KKwkJCWJyZWFrOw0KKwl9DQorfQ0KKw0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpDQordm9pZCBydGw4MTgwX2h3X2RpZ193cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQ0KK3sNCisvLyAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCB3YXRjaF9kb2dfd3EpOw0KKy8vICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikNCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd2F0Y2hfZG9nX3dxKTsNCisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsNCisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLGh3X2RpZ193cSk7DQorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2Ow0KKyNlbHNlDQordm9pZCBydGw4MTgwX2h3X2RpZ193cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisJDQorI2VuZGlmDQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisJLy8gUmVhZCBDQ0sgYW5kIE9GRE0gRmFsc2UgQWxhcm0uDQorCXByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ0NLX0ZBTFNFX0FMQVJNKTsNCisJDQorDQorCS8vIEFkanVzdCBJbml0aWFsIEdhaW4gZHluYW1pY2FsbHkuDQorCUR5bmFtaWNJbml0R2FpbihkZXYpOw0KKwkNCit9DQorDQoraW50DQorSW5jbHVkZWRJblN1cHBvcnRlZFJhdGVzKA0KKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgICAgICAgKnByaXYsDQorICAgICAgICB1OCAgICAgICAgICAgICAgVHhSYXRlICApDQorew0KKyAgICB1OCByYXRlX2xlbjsNCisgICAgICAgIHU4IHJhdGVfZXhfbGVuOw0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgUmF0ZU1hc2sgPSAweDdGOw0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgaWR4Ow0KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgRm91bmQgPSAwOw0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgTmFpdmVUeFJhdGUgPSBUeFJhdGUmUmF0ZU1hc2s7DQorDQorICAgIHJhdGVfbGVuID0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuOw0KKyAgICAgICAgcmF0ZV9leF9sZW4gPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW47DQorICAgICAgICBmb3IoIGlkeD0wOyBpZHg8IHJhdGVfbGVuOyBpZHgrKyApDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmKCAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbaWR4XSAmIFJhdGVNYXNrKSA9PSBOYWl2ZVR4UmF0ZSApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9yYXRlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIGZvciggaWR4PTA7IGlkeDwgcmF0ZV9leF9sZW47IGlkeCsrICkNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaWYoIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFtpZHhdICYgUmF0ZU1hc2spID09IE5haXZlVHhSYXRlICkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3JhdGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGb3VuZDsNCisgICAgICAgIGZvdW5kX3JhdGU6DQorICAgICAgICByZXR1cm4gRm91bmQ7DQorfQ0KKw0KKy8vDQorLy8gICAgICBEZXNjcmlwdGlvbjoNCisvLyAgICAgICAgICAgICAgR2V0IHRoZSBUeCByYXRlIG9uZSBkZWdyZWUgdXAgZm9ybSB0aGUgaW5wdXQgcmF0ZSBpbiB0aGUgc3VwcG9ydGVkIHJhdGVzLg0KKy8vICAgICAgICAgICAgICBSZXR1cm4gdGhlIHVwZ3JhZGUgcmF0ZSBpZiBpdCBpcyBzdWNjZXNzZWQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGlucHV0IHJhdGUuDQorLy8gICAgICBCeSBCcnVjZSwgMjAwNy0wNi0wNS4NCisvLyANCit1OA0KK0dldFVwZ3JhZGVUeFJhdGUoDQorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LA0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlDQorICAgICAgICApDQorew0KKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgVXBSYXRlOw0KKw0KKyAgICAgICAgLy8gVXBncmFkZSAxIGRlZ3JlZS4NCisgICAgICAgIHN3aXRjaChyYXRlKQ0KKyAgICAgICAgew0KKyAgICAgICAgY2FzZSAxMDg6IC8vIFVwIHRvIDU0TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMTA4Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgOTY6IC8vIFVwIHRvIDU0TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMTA4Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNzI6IC8vIFVwIHRvIDQ4TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gOTY7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA0ODogLy8gVXAgdG8gMzZNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSA3MjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDM2OiAvLyBVcCB0byAyNE1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDQ4Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMjI6IC8vIFVwIHRvIDE4TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMzY7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAxMTogLy8gVXAgdG8gMTFNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAyMjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDQ6IC8vIFVwIHRvIDUuNU1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDExOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMjogLy8gVXAgdG8gMk1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDQ7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgcHJpbnRrKCJHZXRVcGdyYWRlVHhSYXRlKCk6IElucHV0IFR4IFJhdGUoJWQpIGlzIHVuZGVmaW5lZCFcbiIsIHJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSByYXRlIGlzIHZhbGlkLg0KKyAgICAgICAgaWYoSW5jbHVkZWRJblN1cHBvcnRlZFJhdGVzKHByaXYsIFVwUmF0ZSkpDQorICAgICAgICB7DQorLy8gICAgICAgICAgICAgIHByaW50aygiR2V0VXBncmFkZVR4UmF0ZSgpOiBHZXRVcGdyYWRlIFR4IHJhdGUoJWQpIGZyb20gJWQgIVxuIiwgVXBSYXRlLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFVwUmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy9wcmludGsoIkdldFVwZ3JhZGVUeFJhdGUoKTogVHggcmF0ZSAoJWQpIGlzIG5vdCBpbiBzdXBwb3J0ZWQgcmF0ZXNcbiIsIFVwUmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJhdGU7DQorfQ0KKy8vDQorLy8gICAgICBEZXNjcmlwdGlvbjoNCisvLyAgICAgICAgICAgICAgR2V0IHRoZSBUeCByYXRlIG9uZSBkZWdyZWUgZG93biBmb3JtIHRoZSBpbnB1dCByYXRlIGluIHRoZSBzdXBwb3J0ZWQgcmF0ZXMuDQorLy8gICAgICAgICAgICAgIFJldHVybiB0aGUgZGVncmFkZSByYXRlIGlmIGl0IGlzIHN1Y2Nlc3NlZCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgaW5wdXQgcmF0ZS4NCisvLyAgICAgIEJ5IEJydWNlLCAyMDA3LTA2LTA1Lg0KKy8vIA0KK3U4DQorR2V0RGVncmFkZVR4UmF0ZSgNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsDQorICAgICAgICB1OCAgICAgICAgIHJhdGUNCisgICAgICAgICkNCit7DQorICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICBEb3duUmF0ZTsNCisNCisgICAgICAgIC8vIFVwZ3JhZGUgMSBkZWdyZWUuDQorICAgICAgICBzd2l0Y2gocmF0ZSkNCisgICAgICAgIHsNCisgICAgICAgIGNhc2UgMTA4OiAvLyBEb3duIHRvIDQ4TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSA5NjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDk2OiAvLyBEb3duIHRvIDM2TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSA3MjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDcyOiAvLyBEb3duIHRvIDI0TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSA0ODsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDQ4OiAvLyBEb3duIHRvIDE4TWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAzNjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDM2OiAvLyBEb3duIHRvIDExTWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAyMjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDIyOiAvLyBEb3duIHRvIDUuNU1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gMTE7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAxMTogLy8gRG93biB0byAyTWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSA0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDogLy8gRG93biB0byAxTWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMjogLy8gRG93biB0byAxTWJwcy4NCisgICAgICAgICAgICAgICAgRG93blJhdGUgPSAyOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHByaW50aygiR2V0RGVncmFkZVR4UmF0ZSgpOiBJbnB1dCBUeCBSYXRlKCVkKSBpcyB1bmRlZmluZWQhXG4iLCByYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhdGU7DQorICAgICAgICB9DQorICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmF0ZSBpcyB2YWxpZC4NCisgICAgICAgIGlmKEluY2x1ZGVkSW5TdXBwb3J0ZWRSYXRlcyhwcml2LCBEb3duUmF0ZSkpDQorICAgICAgICB7DQorLy8gICAgICAgICAgICAgIHByaW50aygiR2V0RGVncmFkZVR4UmF0ZSgpOiBHZXREZWdyYWRlIFR4IHJhdGUoJWQpIGZyb20gJWQhXG4iLCBEb3duUmF0ZSwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBEb3duUmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy9wcmludGsoIkdldERlZ3JhZGVUeFJhdGUoKTogVHggcmF0ZSAoJWQpIGlzIG5vdCBpbiBzdXBwb3J0ZWQgcmF0ZXNcbiIsIERvd25SYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhdGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmF0ZTsNCit9DQorLy8NCisvLyAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgc3BlY2lmaWVkIGRhdGEgcmF0ZSBpcyANCisvLyAgICAgIENDSyByYXRlLg0KKy8vICAgICAgMjAwNS4wMS4yNSwgYnkgcmNuamtvLg0KKy8vDQorYm9vbA0KK01nbnRJc0Nja1JhdGUoDQorICAgICAgICB1MTYgICAgIHJhdGUNCisgICAgICAgICkNCit7DQorICAgICAgICBib29sIGJSZXR1cm4gPSBmYWxzZTsNCisNCisgICAgICAgIGlmKChyYXRlIDw9IDIyKSAmJiAocmF0ZSAhPSAxMikgJiYgKHJhdGUgIT0gMTgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICBiUmV0dXJuID0gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBiUmV0dXJuOw0KK30NCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVR4IFBvd2VyIHRyYWNraW5nIG1lY2hhbmlzbSByb3V0aW5lIG9uIDg3U0UuDQorLy8gCUNyZWF0ZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuDQorLy8NCit2b2lkDQorVHhQd3JUcmFja2luZzg3U0UoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCispDQorewkJDQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJdTgJdG1wdTFCeXRlLCBDdXJyZW50VGhlcm1hbCwgSWR4OwkNCisJY2hhcglDY2tUeFB3cklkeCwgT2ZkbVR4UHdySWR4OwkNCisJLy91MzIJdTRiUmZSZWc7DQorCQ0KKwl0bXB1MUJ5dGUgPSByZWFkX25pY19ieXRlKGRldiwgRU5fTFBGX0NBTCk7DQorCUN1cnJlbnRUaGVybWFsID0gKHRtcHUxQnl0ZSAmIDB4ZjApPj40OyAvL1sgNzo0XTogdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLg0KKwlDdXJyZW50VGhlcm1hbCA9IChDdXJyZW50VGhlcm1hbD4weDBjKT8gMHgwYzpDdXJyZW50VGhlcm1hbDsvL2x6bSBhZGQgMDgwODI2DQorDQorCS8vcHJpbnRrKCJUeFB3clRyYWNraW5nODdTRSgpOiBDdXJyZW50VGhlcm1hbCglZClcbiIsIEN1cnJlbnRUaGVybWFsKTsNCisJDQorCWlmKCBDdXJyZW50VGhlcm1hbCAhPSBwcml2LT5UaGVybWFsTWV0ZXIpDQorCXsJDQorLy8JCXByaW50aygiVHhQd3JUcmFja2luZzg3U0UoKTogVGhlcm1hbCBtZXRlciBjaGFuZ2VkISEhXG4iKTsNCisNCisJCS8vIFVwZGF0ZSBUeCBQb3dlciBsZXZlbCBvbiBlYWNoIGNoYW5uZWwuDQorCQlmb3IoSWR4ID0gMTsgSWR4PDE1OyBJZHgrKykNCisJCXsJCQkNCisJCQlDY2tUeFB3cklkeCA9IHByaXYtPmNodHhwd3JbSWR4XTsNCisJCQlPZmRtVHhQd3JJZHggPSBwcml2LT5jaHR4cHdyX29mZG1bSWR4XTsJCQkNCisJCQkNCisJCQlpZiggQ3VycmVudFRoZXJtYWwgPiBwcml2LT5UaGVybWFsTWV0ZXIgKQ0KKwkJCXsgLy8gaGlnaGVyIHRoZXJtYWwgbWV0ZXIuCQkNCisJCQkJQ2NrVHhQd3JJZHggKz0gKEN1cnJlbnRUaGVybWFsIC0gcHJpdi0+VGhlcm1hbE1ldGVyKSoyOw0KKwkJCQlPZmRtVHhQd3JJZHggKz0gKEN1cnJlbnRUaGVybWFsIC0gcHJpdi0+VGhlcm1hbE1ldGVyKSoyOw0KKwkJCQ0KKwkJCQlpZihDY2tUeFB3cklkeCA+MzUpDQorCQkJCQlDY2tUeFB3cklkeCA9IDM1OyAvLyBGb3JjZSBUeFBvd2VyIHRvIG1heGltYWwgaW5kZXguDQorCQkJCWlmKE9mZG1UeFB3cklkeCA+MzUpDQorCQkJCQlPZmRtVHhQd3JJZHggPSAzNTsJCQkJDQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7IC8vIGxvd2VyIHRoZXJtYWwgbWV0ZXIuCQkJCQ0KKwkJCQlDY2tUeFB3cklkeCAtPSAocHJpdi0+VGhlcm1hbE1ldGVyIC0gQ3VycmVudFRoZXJtYWwpKjI7DQorCQkJCU9mZG1UeFB3cklkeCAtPSAocHJpdi0+VGhlcm1hbE1ldGVyIC0gQ3VycmVudFRoZXJtYWwpKjI7DQorDQorCQkJCWlmKENja1R4UHdySWR4IDwwKQ0KKwkJCQkJQ2NrVHhQd3JJZHggPSAwOwkJDQorCQkJCWlmKE9mZG1UeFB3cklkeCA8MCkNCisJCQkJCU9mZG1UeFB3cklkeCA9IDA7CQkJCQ0KKwkJCX0JCQkJCQ0KKwkJCQ0KKwkJCS8vIFVwZGF0ZSBUeFBvd2VyIGxldmVsIG9uIENDSyBhbmQgT0ZETSByZXNwLg0KKwkJCXByaXYtPmNodHhwd3JbSWR4XSA9IENja1R4UHdySWR4Ow0KKwkJCXByaXYtPmNodHhwd3Jfb2ZkbVtJZHhdID0gT2ZkbVR4UHdySWR4OwkJCQkNCisJCX0JDQorDQorCQkvLyBVcGRhdGUgVHhQb3dlciBsZXZlbCBpbW1lZGlhdGVseS4NCisJCXJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsNCisJfQkNCisJcHJpdi0+VGhlcm1hbE1ldGVyID0gQ3VycmVudFRoZXJtYWw7CQkJCQkNCit9DQordm9pZA0KK1N0YVJhdGVBZGFwdGl2ZTg3U0UoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwl1bnNpZ25lZCBsb25nIAkJCUN1cnJUeG9rQ250Ow0KKwl1MTYJCQlDdXJyUmV0cnlDbnQ7DQorCXUxNgkJCUN1cnJSZXRyeVJhdGU7DQorCS8vdTE2CQkJaSxpZHg7DQorCXVuc2lnbmVkIGxvbmcgICAgICAgCUN1cnJSeG9rQ250Ow0KKwlib29sCQkJYlRyeVVwID0gZmFsc2U7DQorCWJvb2wJCQliVHJ5RG93biA9IGZhbHNlOw0KKwl1OAkJCVRyeVVwVGggPSAxOw0KKwl1OAkJCVRyeURvd25UaCA9IDI7DQorCXUzMgkJCVR4VGhyb3VnaHB1dDsNCisJbG9uZwkJQ3VyclNpZ25hbFN0cmVuZ3RoOw0KKwlib29sCQliVXBkYXRlSW5pdGlhbEdhaW4gPSBmYWxzZTsNCisgICAgCXU4CQkJdTFiT2ZkbT0wLCB1MWJDY2sgPSAwOw0KKwljaGFyCQlPZmRtVHhQd3JJZHgsIENja1R4UHdySWR4OwkNCisNCisJcHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kPSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRDsNCisNCisNCisJQ3VyclJldHJ5Q250CT0gcHJpdi0+Q3VyclJldHJ5Q250Ow0KKwlDdXJyVHhva0NudAk9IHByaXYtPk51bVR4T2tUb3RhbCAtIHByaXYtPkxhc3RUeG9rQ250Ow0KKwlDdXJyUnhva0NudAk9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhPa1RvdGFsIC0gcHJpdi0+TGFzdFJ4b2tDbnQ7DQorCUN1cnJTaWduYWxTdHJlbmd0aCA9IHByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlcjsNCisJVHhUaHJvdWdocHV0ID0gKHUzMikocHJpdi0+TnVtVHhPa0J5dGVzVG90YWwgLSBwcml2LT5MYXN0VHhPS0J5dGVzKTsNCisJcHJpdi0+TGFzdFR4T0tCeXRlcyA9IHByaXYtPk51bVR4T2tCeXRlc1RvdGFsOw0KKwlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gcHJpdi0+aWVlZTgwMjExLT5yYXRlLzU7DQorCS8vcHJpbnRrKCJwcml2LT5DdXJyZW50T3BlcmFSYXRlIGlzICVkXG4iLHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKwkvLzIgQ29tcHV0ZSByZXRyeSByYXRpby4NCisJaWYgKEN1cnJUeG9rQ250PjApDQorCXsNCisJCUN1cnJSZXRyeVJhdGUgPSAodTE2KShDdXJyUmV0cnlDbnQqMTAwL0N1cnJUeG9rQ250KTsNCisJfQ0KKwllbHNlDQorCXsgLy8gSXQgbWF5IGJlIHNlcmlvdXMgcmV0cnkuIFRvIGRpc3Rpbmd1aXNoIHNlcmlvdXMgcmV0cnkgb3Igbm8gcGFja2V0cyBtb2RpZmllZCBieSBCcnVjZQ0KKwkJQ3VyclJldHJ5UmF0ZSA9ICh1MTYpKEN1cnJSZXRyeUNudCoxMDAvMSk7DQorCX0NCisNCisNCisJLy8NCisJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMDEuMDIuDQorCS8vIEZvciBkZWJ1ZyBpbmZvcm1hdGlvbi4NCisJLy8NCisJLy9wcmludGsoIlxuKDEpIHBIYWxEYXRhLT5MYXN0UmV0cnlSYXRlOiAlZCBcbiIscHJpdi0+TGFzdFJldHJ5UmF0ZSk7DQorCS8vcHJpbnRrKCIoMikgUmV0cnlDbnQgPSAlZCAgXG4iLCBDdXJyUmV0cnlDbnQpOwkNCisJLy9wcmludGsoIigzKSBUeG9rQ250ID0gJWQgXG4iLCBDdXJyVHhva0NudCk7DQorCS8vcHJpbnRrKCIoNCkgQ3VyclJldHJ5UmF0ZSA9ICVkIFxuIiwgQ3VyclJldHJ5UmF0ZSk7CQ0KKwkvL3ByaW50aygiKDUpIEN1cnJTaWduYWxTdHJlbmd0aCA9ICVkIFxuIixDdXJyU2lnbmFsU3RyZW5ndGgpOw0KKwkvL3ByaW50aygiKDYpIFR4VGhyb3VnaHB1dCBpcyAlZFxuIixUeFRocm91Z2hwdXQpOw0KKwkvL3ByaW50aygicHJpdi0+TnVtVHhPa0J5dGVzVG90YWwgaXMgJWRcbiIscHJpdi0+TnVtVHhPa0J5dGVzVG90YWwpOwkJDQorDQorCXByaXYtPkxhc3RSZXRyeUNudCA9IHByaXYtPkN1cnJSZXRyeUNudDsNCisJcHJpdi0+TGFzdFR4b2tDbnQgPSBwcml2LT5OdW1UeE9rVG90YWw7DQorCXByaXYtPkxhc3RSeG9rQ250ID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeE9rVG90YWw7DQorCXByaXYtPkN1cnJSZXRyeUNudCA9IDA7DQorDQorCS8vMk5vIFR4IHBhY2tldHMsIHJldHVybiB0byBpbml0X3JhdGUgb3Igbm90Pw0KKwlpZiAoQ3VyclJldHJ5UmF0ZT09MCAmJiBDdXJyVHhva0NudCA9PSAwKQ0KKwl7CQ0KKwkJLy8NCisJCS8vQWZ0ZXIgOSAoMzAqMzAwbXMpIHNlY29uZHMgaW4gdGhpcyBjb25kaXRpb24sIHdlIHRyeSB0byByYWlzZSByYXRlLg0KKwkJLy8NCisJCXByaXYtPlRyeXVwaW5nQ291bnROb0RhdGErKzsNCisJCQ0KKy8vCQlwcmludGsoIk5vIFR4IHBhY2tldHMsIFRyeXVwaW5nQ291bnROb0RhdGEoJWQpXG4iLCBwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhKTsNCisJCS8vW1RSQyBEZWxsIExhYl0gRXh0ZW5kIHJhaXNlZCBwZXJpb2QgZnJvbSA0LjVzZWMgdG8gOXNlYywgSXNhaWFoIDIwMDgtMDItMTUgMTg6MDAgDQorCQlpZiAocHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YT4zMCkNCisJCXsNCisJCQlwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhID0gMDsNCisJCSAJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9IEdldFVwZ3JhZGVUeFJhdGUoZGV2LCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsJCQ0KKwkJCS8vIFJlc2V0IEZhaWwgUmVjb3JkDQorCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGUgPSAwOw0KKwkJCXByaXYtPkxhc3RGYWlsVHhSYXRlU1MgPSAtMjAwOw0KKwkJCXByaXYtPkZhaWxUeFJhdGVDb3VudCA9IDA7DQorCQl9DQorCQlnb3RvIFNldEluaXRpYWxHYWluOw0KKwl9DQorICAgICAgICBlbHNlDQorCXsNCisJCXByaXYtPlRyeXVwaW5nQ291bnROb0RhdGE9MDsgLy9SZXNldCB0cnlpbmcgdXAgdGltZXMuDQorCX0NCisNCisNCisJLy8NCisJLy8gRm9yIE5ldGdlYXIgY2FzZSwgSSBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIHNpZ25hbCBzdHJlbmd0aCBlc3RpbWF0aW9uLA0KKwkvLyB3aGljaCBjYW4gcmVzdWx0cyBpbiBsb3dlciByYXRlIHRvIHRyYW5zbWl0IHdoZW4gc2FtcGxlIGlzIE5PVCBlbm91Z2ggKGUuZy4gUElORyByZXF1ZXN0KS4gIA0KKwkvLyAyMDA3LjA0LjA5LCBieSBSb2dlci4JDQorCS8vCQ0KKw0KKwkvLw0KKwkvLyBSZXN0cnVjdHVyZSByYXRlIGFkYXB0aXZlIGFzIHRoZSBmb2xsb3dpbmcgbWFpbiBzdGFnZXM6DQorCS8vICgxKSBBZGQgcmV0cnkgdGhyZXNob2xkIGluIDU0TSB1cGdyYWRpbmcgY29uZGl0aW9uIHdpdGggc2lnbmFsIHN0cmVuZ3RoLg0KKwkvLyAoMikgQWRkIHRoZSBtZWNoYW5pc20gdG8gZGVncmFkZSB0byBDQ0sgcmF0ZSBhY2NvcmRpbmcgdG8gc2lnbmFsIHN0cmVuZ3RoIA0KKwkvLwkJYW5kIHJldHJ5IHJhdGUuDQorCS8vICgzKSBSZW1vdmUgYWxsIEluaXRpYWwgR2FpbiBVcGRhdGVzIG92ZXIgT0ZETSByYXRlLiBUbyBhdm9pZCB0aGUgY29tcGxpY2F0ZWQgDQorCS8vCQlzaXR1YXRpb24sIEluaXRpYWwgR2FpbiBVcGRhdGUgaXMgdXBvbiBvbiBESUcgbWVjaGFuaXNtIGV4Y2VwdCBDQ0sgcmF0ZS4NCisJLy8gKDQpIEFkZCB0aGUgbWVoYW5pc20gb2YgdHJ5aW5nIHRvIHVwZ3JhZGUgdHggcmF0ZS4NCisJLy8gKDUpIFJlY29yZCB0aGUgaW5mb3JtYXRpb24gb2YgdXBwaW5nIHR4IHJhdGUgdG8gYXZvaWQgdHJ5aW5nIHVwcGluZyB0eCByYXRlIGNvbnN0YW50bHkuDQorCS8vIEJ5IEJydWNlLCAyMDA3LTA2LTA1Lg0KKwkvLwkNCisJLy8NCisNCisJLy8gMTFNYnBzIG9yIDM2TWJwcw0KKwkvLyBDaGVjayBtb3JlIHRpbWVzIGluIHRoZXNlIHJhdGUoa2V5IHJhdGVzKS4NCisJLy8NCisJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyMiB8fCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDcyKQ0KKwl7IA0KKwkJVHJ5VXBUaCArPSA5Ow0KKwl9DQorCS8vDQorCS8vIExldCB0aGVzZSByYXRlcyBkb3duIG1vcmUgZGlmZmljdWx0Lg0KKwkvLw0KKwlpZihNZ250SXNDY2tSYXRlKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpIHx8IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMzYpDQorCXsNCisJCQlUcnlEb3duVGggKz0gMTsNCisJfQ0KKw0KKwkvLzEgQWRqdXN0IFJhdGUuDQorCWlmIChwcml2LT5iVHJ5dXBpbmcgPT0gdHJ1ZSkNCisJewkNCisJCS8vMiBGb3IgVGVzdCBVcGdyYWRpbmcgbWVjaGFuaXNtDQorCQkvLyBOb3RlOg0KKwkJLy8gCVNvbWV0aW1lcyB0aGUgdGhyb3VnaHB1dCBpcyB1cG9uIG9uIHRoZSBjYXBhYmlsaXR5IGJ3dHdlZW4gdGhlIEFQIGFuZCBOSUMsDQorCQkvLyAJdGh1cyB0aGUgbG93IGRhdGEgcmF0ZSBkb2VzIG5vdCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZS4NCisJCS8vIAlXZSByYW5kb21seSB1cGdyYWRlIHRoZSBkYXRhIHJhdGUgYW5kIGNoZWNrIGlmIHRoZSByZXRyeSByYXRlIGlzIGltcHJvdmVkLg0KKwkJDQorCQkvLyBVcGdyYWRpbmcgcmF0ZSBkaWQgbm90IGltcHJvdmUgdGhlIHJldHJ5IHJhdGUsIGZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCByYXRlLg0KKwkJaWYgKCAoQ3VyclJldHJ5UmF0ZSA+IDI1KSAmJiBUeFRocm91Z2hwdXQgPCBwcml2LT5MYXN0VHhUaHJvdWdocHV0KQ0KKwkJew0KKwkJCS8vTm90IG5lY2Vzc2FyeSByYWlzaW5nIHJhdGUsIGZhbGwgYmFjayByYXRlLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCQkvL3ByaW50aygiY2FzZTEtMTogTm90IG5lY2Vzc2FyeSByYWlzaW5nIHJhdGUsIGZhbGwgYmFjayByYXRlLi4uLlxuIik7DQorCQkJLy9wcmludGsoImNhc2UxLTE6IHBNZ250SW5mby0+Q3VycmVudE9wZXJhUmF0ZSA9JWQsIFR4VGhyb3VnaHB1dCA9ICVkLCBMYXN0VGhyb3VnaHB1dCA9ICVkXG4iLA0KKwkJCS8vCQlwcml2LT5DdXJyZW50T3BlcmFSYXRlLCBUeFRocm91Z2hwdXQsIHByaXYtPkxhc3RUeFRocm91Z2hwdXQpOwkJCQ0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXByaXYtPmJUcnl1cGluZyA9IGZhbHNlOw0KKwkJfQ0KKwl9CQ0KKwllbHNlIGlmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtNDcgJiYgKEN1cnJSZXRyeVJhdGUgPCA1MCkpDQorCXsNCisJCS8vMkZvciBIaWdoIFBvd2VyDQorCQkvLw0KKwkJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMDQuMDkuDQorCQkvLyBSZXR1cm4gdG8gaGlnaGVzdCBkYXRhIHJhdGUsIGlmIHNpZ25hbCBzdHJlbmd0aCBpcyBnb29kIGVub3VnaC4NCisJCS8vIFNpZ25hbFN0cmVuZ3RoIHRocmVzaG9sZCgtNTBkYm0pIGlzIGZvciBSVEw4MTg2Lg0KKwkJLy8gUmV2aXNlIFNpZ25hbFN0cmVuZ3RoIHRocmVzaG9sZCB0byAtNTFkYm0uCQ0KKwkJLy8NCisJCS8vIEFsc28gbmVlZCB0byBjaGVjayByZXRyeSByYXRlIGZvciBzYWZldHksIGJ5IEJydWNlLCAyMDA3LTA2LTA1Lg0KKwkJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSAhPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5IaWdoZXN0T3BlcmFSYXRlICkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJCS8vIFVwZ3JhZGUgVHggUmF0ZSBkaXJlY3RseS4NCisJCQlwcml2LT5Ucnl1cGluZ0NvdW50ICs9IFRyeVVwVGg7DQorCQl9DQorLy8JCXByaW50aygiY2FzZTI6IFN0YVJhdGVBZGFwdGl2ZTg3U0U6IFBvd2VyKCVkKSBpcyBoaWdoIGVub3VnaCEhLiBcbiIsIEN1cnJTaWduYWxTdHJlbmd0aCk7CQkJDQorCQkJCQkNCisJfQ0KKwllbHNlIGlmKEN1cnJUeG9rQ250ID4gOSAmJiBDdXJyVHhva0NudDwgMTAwICYmIEN1cnJSZXRyeVJhdGUgPj0gNjAwKSANCisJew0KKwkJLy8yIEZvciBTZXJpb3VzIFJldHJ5DQorCQkvLw0KKwkJLy8gVHJhZmZpYyBpcyBub3QgYnVzeSBidXQgb3VyIFR4IHJldHJ5IGlzIHNlcmlvdXMuIA0KKwkJLy8NCisJCWJUcnlEb3duID0gdHJ1ZTsNCisJCS8vIExldCBSYXRlIE1lY2hhbmlzbSB0byBkZWdyYWRlIHR4IHJhdGUgZGlyZWN0bHkuDQorCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisvLwkJcHJpbnRrKCJjYXNlMzogUkE6IFR4IFJldHJ5IGlzIHNlcmlvdXMuIERlZ3JhZGUgVHggUmF0ZSB0byAlZCBkaXJlY3RseS4uLlxuIiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDEwOCApDQorCXsNCisJCS8vMkZvciA1NE1icHMNCisJCS8vIEFpciBMaW5rDQorCQlpZiAoIChDdXJyUmV0cnlSYXRlPjI2KSYmKHByaXYtPkxhc3RSZXRyeVJhdGU+MjUpKQ0KKy8vCQlpZiAoIChDdXJyUmV0cnlSYXRlPjQwKSYmKHByaXYtPkxhc3RSZXRyeVJhdGU+MzkpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDQ4TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQkvLyBDYWJsZSBMaW5rDQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU+MTcpJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4xNikgJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC03MikpIA0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU+MTcpJiYocHJpdi0+TGFzdFJldHJ5UmF0ZT4xNikgJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC03MikpDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgNDhNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtNzUpKSAvL2NhYmxlIGxpbmsNCisJCXsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlNC0tLTU0TSBcbiIpOwkNCisNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA5NiApDQorCXsNCisJCS8vMkZvciA0OE1icHMNCisJCS8vQWlyIExpbmsNCisJCWlmICggKChDdXJyUmV0cnlSYXRlPjQ4KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT40NykpKQ0KKy8vCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT42NSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NjQpKSkNCisNCisJCXsJDQorCQkJLy9Eb3duIHRvIHJhdGUgMzZNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vQ2FibGUgTGluaw0KKwkJZWxzZSBpZiAoICgoQ3VyclJldHJ5UmF0ZT4yMSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+MjApKSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTc0KSkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSAzNk1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNTAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKy8vCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA3MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDgpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDgpICkgLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDI4KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw4KSApIA0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQl9DQorDQorCQlpZihiVHJ5RG93biAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTc1KSkNCisJCXsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlNS0tLTQ4TSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA3MiApDQorCXsNCisJCS8vMkZvciAzNk1icHMNCisJCWlmICggKEN1cnJSZXRyeVJhdGU+NDMpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjQxKSkgDQorLy8JCWlmICggKEN1cnJSZXRyeVJhdGU+NjApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjU5KSkNCisJCXsJDQorCQkJLy9Eb3duIHRvIHJhdGUgMjRNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDUwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisvLwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNzAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwxNSkgJiYgIChwcml2LT5MYXN0UmV0cnlSYXRlPDE2KSkgLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDM1KSAmJiAgKHByaXYtPkxhc3RSZXRyeVJhdGU8MzYpKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQl9DQorDQorCQlpZihiVHJ5RG93biAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTgwKSkNCisJCXsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlNi0tLTM2TSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA0OCApDQorCXsNCisJCS8vMkZvciAyNE1icHMNCisJCS8vIEFpciBMaW5rDQorCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT42MykgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NjIpKSkNCisvLwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+ODMpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjgyKSkpDQorCQl7CQ0KKwkJCS8vRG93biB0byByYXRlIDE4TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQkvL0NhYmxlIExpbmsNCisJCWVsc2UgaWYgKCAoKEN1cnJSZXRyeVJhdGU+MzMpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjMyKSkgJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC04MikgKQ0KKy8vCQkgZWxzZSBpZiAoICgoQ3VyclJldHJ5UmF0ZT41MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NDkpKSAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTgyKSApDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgMThNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDUwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisvLwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNzAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKw0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisgIAkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDIwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTwyMSkpIC8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw0MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8NDEpKQ0KKwkJewkNCisJCQliVHJ5VXAgPSB0cnVlOwkNCisJCX0NCisNCisJCWlmKGJUcnlEb3duICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPCAtODIpKQ0KKwkJew0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgKz0gVHJ5RG93blRoOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U3LS0tMjRNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDM2ICkNCisJew0KKwkJLy8yRm9yIDE4TWJwcw0KKwkJLy8gb3JpZ2luYWwgKDEwOSwgMTA5KSANCisJCS8vW1RSQyBEZWxsIExhYl0gKDkwLCA5MSksIElzYWlhaCAyMDA4LTAyLTE4IDIzOjI0DQorCQkvLwkJCSAgICAgKDg1LCA4NiksIElzYWlhaCAyMDA4LTAyLTE4IDI0OjAwDQorCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT44NSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+ODYpKSkNCisvLwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+MTE1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4xMTYpKSkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSAxMU1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJLy9bVFJDIERlbGwgTGFiXSAgSXNhaWFoIDIwMDgtMDItMTggMjM6MjQNCisJCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDUwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisvLwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNzAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwyMikgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8MjMpKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8NDIpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDQzKSkNCisJCXsJDQorCQkJYlRyeVVwID0gdHJ1ZTsJDQorCQl9DQorCQkvL3ByaW50aygiY2FzZTgtLS0xOE0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMjIgKQ0KKwl7DQorCQkvLzJGb3IgMTFNYnBzDQorCQlpZiAoQ3VyclJldHJ5UmF0ZT45NSkNCisvLwkJaWYgKEN1cnJSZXRyeVJhdGU+MTU1KQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwyOSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPDMwKSApLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDQ5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8NTApICkNCisJCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCQl9DQorCQkvL3ByaW50aygiY2FzZTktLS0xMU0gXG4iKTsJDQorCQl9CQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAxMSApDQorCXsNCisJCS8vMkZvciA1LjVNYnBzDQorCQlpZiAoQ3VyclJldHJ5UmF0ZT4xNDkpIA0KKy8vCQlpZiAoQ3VyclJldHJ5UmF0ZT4xODkpDQorCQl7CQ0KKwkJCWJUcnlEb3duID0gdHJ1ZTsJCQkNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw2MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPCA2NSkpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw4MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPCA4NSkpDQorDQorCQkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQkJfQkJDQorCQkvL3ByaW50aygiY2FzZTEwLS0tNS41TSBcbiIpOwkNCisJCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNCApDQorCXsNCisJCS8vMkZvciAyIE1icHMNCisJCWlmKChDdXJyUmV0cnlSYXRlPjk5KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT45OSkpDQorLy8JCWlmKChDdXJyUmV0cnlSYXRlPjE5OSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+MTk5KSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7CQkJDQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGUgPCA2NSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPCA3MCkpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZSA8IDg1KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZSA8IDkwKSkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2UxMS0tLTJNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDIgKQ0KKwl7DQorCQkvLzJGb3IgMSBNYnBzDQorCQlpZiggKEN1cnJSZXRyeVJhdGU8NzApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDc1KSkNCisvLwkJaWYoIChDdXJyUmV0cnlSYXRlPDkwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw5NSkpDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlMTItLS0xTSBcbiIpOwkNCisJfQ0KKw0KKwlpZihiVHJ5VXAgJiYgYlRyeURvd24pDQorICAgIAlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3QigpOiBUeCBSYXRlIHRyaWVkIHVwcGluZyBhbmQgZG93bmluZyBzaW11bHRhbmVvdXNseSFcbiIpOw0KKwkJCQkNCisJLy8xIFRlc3QgVXBncmFkaW5nIFR4IFJhdGUNCisJLy8gU29tZXRpbWVzIHRoZSBjYXVzZSBvZiB0aGUgbG93IHRocm91Z2hwdXQgKGhpZ2ggcmV0cnkgcmF0ZSkgaXMgdGhlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgQVAgYW5kIE5JQy4NCisJLy8gVG8gdGVzdCBpZiB0aGUgdXBwZXIgcmF0ZSBtYXkgY2F1c2UgbG93ZXIgcmV0cnkgcmF0ZSwgdGhpcyBtZWNoYW5pc20gcmFuZG9tbHkgb2NjdXJzIHRvIHRlc3QgdXBncmFkaW5nIHR4IHJhdGUuDQorCWlmKCFiVHJ5VXAgJiYgIWJUcnlEb3duICYmIChwcml2LT5Ucnl1cGluZ0NvdW50ID09IDApICYmIChwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID09IDApDQorCQkmJiBwcml2LT5DdXJyZW50T3BlcmFSYXRlICE9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLkhpZ2hlc3RPcGVyYVJhdGUgJiYgcHJpdi0+RmFpbFR4UmF0ZUNvdW50IDwgMikNCisJew0KKwkJaWYoamlmZmllcyUgKEN1cnJSZXRyeVJhdGUgKyAxMDEpID09IDApDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsJDQorCQkJcHJpdi0+YlRyeXVwaW5nID0gdHJ1ZTsNCisJCQkvL3ByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdTRSgpOiBSYW5kb21seSB0cnkgdXBncmFkaW5nLi4uXG4iKTsNCisJCX0NCisJfQ0KKw0KKwkvLzEgUmF0ZSBNZWNoYW5pc20NCisJaWYoYlRyeVVwKQ0KKwl7DQorCQlwcml2LT5Ucnl1cGluZ0NvdW50Kys7DQorCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID0gMDsNCisJCQkNCisJCXsNCisvLwkJCXByaW50aygiVVA6IHBIYWxEYXRhLT5Ucnl1cGluZ0NvdW50ID0gJWRcbiIsIHByaXYtPlRyeXVwaW5nQ291bnQpOw0KKy8vCQkJcHJpbnRrKCJVUDogVHJ5VXBUaCglZCkrIChGYWlsVHhSYXRlQ291bnQoJWQpKV4yID0lZFxuIiwgDQorLy8JCQkJVHJ5VXBUaCwgcHJpdi0+RmFpbFR4UmF0ZUNvdW50LCAoVHJ5VXBUaCArIHByaXYtPkZhaWxUeFJhdGVDb3VudCAqIHByaXYtPkZhaWxUeFJhdGVDb3VudCkgKTsNCisvLwkJCXByaW50aygiVVA6IHBIYWxEYXRhLT5iVHJ5dXBpbmc9JWRcbiIsICBwcml2LT5iVHJ5dXBpbmcpOw0KKw0KKwkJfQ0KKwkJDQorCQkvLw0KKwkJLy8gQ2hlY2sgbW9yZSB0aW1lcyBpZiB3ZSBuZWVkIHRvIHVwZ3JhZGUgaW5kZWVkLg0KKwkJLy8gQmVjYXVzZSB0aGUgbGFyZ2VzdCB2YWx1ZSBvZiBwSGFsRGF0YS0+VHJ5dXBpbmdDb3VudCBpcyAweEZGRkYgYW5kIA0KKwkJLy8gdGhlIGxhcmdlc3QgdmFsdWUgb2YgcEhhbERhdGEtPkZhaWxUeFJhdGVDb3VudCBpcyAweDE0LA0KKwkJLy8gdGhpcyBjb25kaXRpb24gd2lsbCBiZSBzYXRpc2ZpZWQgYXQgbW9zdCBldmVyeSAyIG1pbi4NCisJCS8vDQorDQorCQlpZigocHJpdi0+VHJ5dXBpbmdDb3VudCA+IChUcnlVcFRoICsgcHJpdi0+RmFpbFR4UmF0ZUNvdW50ICogcHJpdi0+RmFpbFR4UmF0ZUNvdW50KSkgfHwNCisJCQkoQ3VyclNpZ25hbFN0cmVuZ3RoID4gcHJpdi0+TGFzdEZhaWxUeFJhdGVTUykgfHwgcHJpdi0+YlRyeXVwaW5nKQ0KKwkJew0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnQgPSAwOw0KKwkJCS8vIA0KKwkJCS8vIFdoZW4gdHJhbnNmZXJpbmcgZnJvbSBDQ0sgdG8gT0ZETSwgRElHIGlzIGFuIGltcG9ydGFudCBpc3N1ZS4NCisJCQkvLw0KKwkJCWlmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMjIpDQorCQkJCWJVcGRhdGVJbml0aWFsR2FpbiA9IHRydWU7DQorDQorCQkJLy8gVGhlIGRpZmZlcmVuY2UgaW4gdGhyb3VnaHB1dCBiZXR3ZWVuIDQ4TWJwcyBhbmQgMzZNYnBzIGlzIDhNLg0KKwkJCS8vIFNvLCB3ZSBtdXN0IGJlIGNhcmVmdWxseSBpbiB0aGlzIHJhdGUgc2NhbGUuIElzYWlhaCAyMDA4LTAyLTE1Lg0KKwkJCS8vDQorCQkJaWYoICAoKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNzIpIHx8IChwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDQ4KSB8fCAocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAzNikpICYmDQorCQkJCShwcml2LT5GYWlsVHhSYXRlQ291bnQgPiAyKSApDQorCQkJCXByaXYtPlJhdGVBZGFwdGl2ZVBlcmlvZD0gKFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9ELzIpOw0KKwkJCQ0KKwkJCS8vICgxKVRvIGF2b2lkIHVwZ3JhZGUgZnJlcXVlbnRseSB0byB0aGUgZmFpbCB0eCByYXRlLCBhZGQgdGhlIEZhaWxUeFJhdGVDb3VudCBpbnRvIHRoZSB0aHJlc2hvbGQuDQorCQkJLy8gKDIpSWYgdGhlIHNpZ25hbCBzdHJlbmd0aCBpcyBpbmNyZWFzZWQsIGl0IG1heSBiZSBhYmxlIHRvIHVwZ3JhZGUuDQorDQorCQkJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9IEdldFVwZ3JhZGVUeFJhdGUoZGV2LCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisvLwkJCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdTRSgpOiBVcGdyYWRlIFR4IFJhdGUgdG8gJWRcbiIsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKw0KKwkJCS8vW1RSQyBEZWxsIExhYl0gQnlwYXNzIDEyLzkvNiwgSXNhaWFoIDIwMDgtMDItMTggMjA6MDAgDQorCQkJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PTM2KQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9dHJ1ZTsNCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBBUkZSLCAweDBGOEYpOyAvL2J5cGFzcyAxMi85LzYNCisvLwkJCQlwcmludGsoIlVQOiBBUkZSPTB4RjhGXG4iKTsNCisJCQl9DQorCQkJZWxzZSBpZihwcml2LT5iVXBkYXRlQVJGUikNCisJCQl7DQorCQkJCXByaXYtPmJVcGRhdGVBUkZSPWZhbHNlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEZGRik7IC8vc2V0IDFNIH4gNTRNYnBzLg0KKy8vCQkJCXByaW50aygiVVA6IEFSRlI9MHhGRkZcbiIpOw0KKwkJCX0NCisJCQkJDQorCQkJLy8gVXBkYXRlIEZhaWwgVHggcmF0ZSBhbmQgY291bnQuDQorCQkJaWYocHJpdi0+TGFzdEZhaWxUeFJhdGUgIT0gcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkNCisJCQl7DQorCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlID0gcHJpdi0+Q3VycmVudE9wZXJhUmF0ZTsNCisJCQkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID0gMDsNCisJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IC0yMDA7IC8vIFNldCBsb3dlc3QgcG93ZXIuDQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UNCisJewkNCisJCWlmKHByaXYtPlRyeXVwaW5nQ291bnQgPiAwKQ0KKwkJCXByaXYtPlRyeXVwaW5nQ291bnQgLS07DQorCX0NCisJDQorCWlmKGJUcnlEb3duKQ0KKwl7DQorCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhKys7DQorCQlwcml2LT5Ucnl1cGluZ0NvdW50ID0gMDsNCisJCXsNCisvLwkJCXByaW50aygiRE46IHBIYWxEYXRhLT5UcnlEb3duQ291bnRMb3dEYXRhID0gJWRcbiIscHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSk7DQorLy8JCQlwcmludGsoIkROOiBUcnlEb3duVGggPSVkXG4iLCBUcnlEb3duVGgpOw0KKy8vCQkJcHJpbnRrKCJETjogcEhhbERhdGEtPmJUcnl1cGluZz0lZFxuIiwgIHByaXYtPmJUcnl1cGluZyk7DQorCQl9DQorCQkJCQkJDQorCQkvL0NoZWNrIGlmIFR4IHJhdGUgY2FuIGJlIGRlZ3JhZGVkIG9yIFRlc3QgdHJ5aW5nIHVwZ3JhZGluZyBzaG91bGQgZmFsbGJhY2suDQorCQlpZihwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID4gVHJ5RG93blRoIHx8IHByaXYtPmJUcnl1cGluZykNCisJCXsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID0gMDsNCisJCQlwcml2LT5iVHJ5dXBpbmcgPSBmYWxzZTsNCisJCQkvLyBVcGRhdGUgZmFpbCBpbmZvcm1hdGlvbi4NCisJCQlpZihwcml2LT5MYXN0RmFpbFR4UmF0ZSA9PSBwcml2LT5DdXJyZW50T3BlcmFSYXRlKQ0KKwkJCXsNCisJCQkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50ICsrOw0KKwkJCQkvLyBSZWNvcmQgdGhlIFR4IGZhaWwgcmF0ZSBzaWduYWwgc3RyZW5ndGguDQorCQkJCWlmKEN1cnJTaWduYWxTdHJlbmd0aCA+IHByaXYtPkxhc3RGYWlsVHhSYXRlU1MpDQorCQkJCXsNCisJCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlU1MgPSBDdXJyU2lnbmFsU3RyZW5ndGg7DQorCQkJCX0NCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGUgPSBwcml2LT5DdXJyZW50T3BlcmFSYXRlOw0KKwkJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgPSAxOw0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZVNTID0gQ3VyclNpZ25hbFN0cmVuZ3RoOw0KKwkJCX0NCisJCQlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gR2V0RGVncmFkZVR4UmF0ZShkZXYsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKw0KKwkJCS8vIFJlZHVjZSBjaGFyaW90IHRyYWluaW5nIHRpbWUgYXQgd2VhayBzaWduYWwgc3RyZW5ndGggc2l0dWF0aW9uLiBTRDMgRUQgZGVtYW5kLiANCisJCQkvL1tUUkMgRGVsbCBMYWJdIFJldmlzZSBTaWduYWwgVGhyZXNob2xkIGZyb20gLTc1IHRvIC04MCAsIElzYWlhaCAyMDA4LTAyLTE4IDIwOjAwIA0KKwkJCWlmKCAoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTgwKSAmJiAocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA+IDcyICkpDQorCQkJew0KKwkJCQlwcml2LT5DdXJyZW50T3BlcmFSYXRlID0gNzI7DQorLy8JCQkJcHJpbnRrKCJETjogd2VhayBzaWduYWwgc3RyZW5ndGggKCVkKSwgZGVncmFkZSB0byAzNk1icHNcbiIsIEN1cnJTaWduYWxTdHJlbmd0aCk7DQorCQkJfQ0KKw0KKwkJCS8vW1RSQyBEZWxsIExhYl0gQnlwYXNzIDEyLzkvNiwgSXNhaWFoIDIwMDgtMDItMTggMjA6MDAgDQorCQkJaWYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PTM2KQ0KKwkJCXsNCisJCQkJcHJpdi0+YlVwZGF0ZUFSRlI9dHJ1ZTsNCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBBUkZSLCAweDBGOEYpOyAvL2J5cGFzcyAxMi85LzYNCisvLwkJCQlwcmludGsoIkROOiBBUkZSPTB4RjhGXG4iKTsNCisJCQl9DQorCQkJZWxzZSBpZihwcml2LT5iVXBkYXRlQVJGUikNCisJCQl7DQorCQkJCXByaXYtPmJVcGRhdGVBUkZSPWZhbHNlOw0KKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEFSRlIsIDB4MEZGRik7IC8vc2V0IDFNIH4gNTRNYnBzLg0KKy8vCQkJCXByaW50aygiRE46IEFSRlI9MHhGRkZcbiIpOw0KKwkJCX0NCisJCQkJDQorCQkJLy8NCisJCQkvLyBXaGVuIGl0IGlzIENDSyByYXRlLCBpdCBtYXkgbmVlZCB0byB1cGRhdGUgaW5pdGlhbCBnYWluIHRvIHJlY2VpdmUgbG93ZXIgcG93ZXIgcGFja2V0cy4NCisJCQkvLw0KKwkJCWlmKE1nbnRJc0Nja1JhdGUocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkpDQorCQkJew0KKwkJCQliVXBkYXRlSW5pdGlhbEdhaW4gPSB0cnVlOw0KKwkJCX0NCisvLwkJCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdTRSgpOiBEZWdyYWRlIFR4IFJhdGUgdG8gJWRcbiIsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKwkJfQ0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYocHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA+IDApDQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSAtLTsNCisJfQ0KKwkJCQ0KKwkvLyBLZWVwIHRoZSBUeCBmYWlsIHJhdGUgY291bnQgdG8gZXF1YWwgdG8gMHgxNSBhdCBtb3N0Lg0KKwkvLyBSZWR1Y2UgdGhlIGZhaWwgY291bnQgYXQgbGVhc3QgdG8gMTAgc2VjIGlmIHR4IHJhdGUgaXMgdGVuZGluZyBzdGFibGUuDQorCWlmKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+PSAweDE1IHx8IA0KKwkJKCFiVHJ5VXAgJiYgIWJUcnlEb3duICYmIHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPT0gMCAmJiBwcml2LT5Ucnl1cGluZ0NvdW50ICYmIHByaXYtPkZhaWxUeFJhdGVDb3VudCA+IDB4NikpDQorCXsNCisJCXByaXYtPkZhaWxUeFJhdGVDb3VudCAtLTsNCisJfQkJDQorDQorDQorCU9mZG1UeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyX29mZG1bcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKwlDY2tUeFB3cklkeCAgPSBwcml2LT5jaHR4cHdyW3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdOyANCisJDQorCS8vW1RSQyBEZWxsIExhYl0gTWFjMHg5ZSBpbmNyZWFzZSAyIGxldmVsIGluIDM2TX4xOE0gc2l0dWF0aW9uLCBJc2FpYWggMjAwOC0wMi0xOCAyNDowMCANCisJaWYoKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPCA5NikgJiYocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA+IDIyKSkNCisJew0KKwkJdTFiQ2NrID0gcmVhZF9uaWNfYnl0ZShkZXYsIENDS19UWEFHQyk7DQorCQl1MWJPZmRtID0gcmVhZF9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MpOw0KKw0KKwkJLy8gY2FzZSAxOiBOZXZlciBlbnRlciBIaWdoIHBvd2VyDQorCQlpZih1MWJDY2sgPT0gQ2NrVHhQd3JJZHggKQ0KKwkJew0KKwkJCWlmKHUxYk9mZG0gIT0gKE9mZG1UeFB3cklkeCsyKSApDQorCQkJew0KKwkJCXByaXYtPmJFbmhhbmNlVHhQd3I9IHRydWU7DQorCQkJdTFiT2ZkbSA9ICgodTFiT2ZkbSsyKSA+IDM1KSA/IDM1OiAodTFiT2ZkbSsyKTsNCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYk9mZG0pOw0KKy8vCQkJcHJpbnRrKCJFbmhhbmNlIE9GRE1fVFhBR0MgOiArKysrKyB1MWJPZmRtPSAweCV4XG4iLCB1MWJPZmRtKTsNCisJCQl9DQorCQl9DQorCQkvLyBjYXNlIDI6IGVudGVyIGhpZ2ggcG93ZXINCisJCWVsc2UgaWYodTFiQ2NrIDwgQ2NrVHhQd3JJZHgpDQorCQl7DQorCQkJaWYoIXByaXYtPmJFbmhhbmNlVHhQd3IpDQorCQkJew0KKwkJCQlwcml2LT5iRW5oYW5jZVR4UHdyPSB0cnVlOw0KKwkJCQl1MWJPZmRtID0gKCh1MWJPZmRtKzIpID4gMzUpID8gMzU6ICh1MWJPZmRtKzIpOw0KKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYk9mZG0pOw0KKwkJCQkvL1JUX1RSQUNFKENPTVBfUkFURSwgREJHX1RSQUNFLCAoIkVuaGFuY2UgT0ZETV9UWEFHQygyKSA6ICsrKysrIHUxYk9mZG09IDB4JXhcbiIsIHUxYk9mZG0pKTsNCisJCQl9DQorCQl9DQorCX0NCisJZWxzZSBpZihwcml2LT5iRW5oYW5jZVR4UHdyKSAgLy81NC80OC8xMS81LjUvMi8xDQorCXsNCisJCXUxYkNjayA9IHJlYWRfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MpOw0KKwkJdTFiT2ZkbSA9IHJlYWRfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDKTsNCisNCisJCS8vIGNhc2UgMTogTmV2ZXIgZW50ZXIgSGlnaCBwb3dlcg0KKwkJaWYodTFiQ2NrID09IENja1R4UHdySWR4ICkNCisJCXsNCisJCXByaXYtPmJFbmhhbmNlVHhQd3I9IGZhbHNlOw0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCBPZmRtVHhQd3JJZHgpOw0KKwkJLy9wcmludGsoIlJlY292ZXIgT0ZETV9UWEFHQyA6ID09PT09IHUxYk9mZG09IDB4JXhcbiIsIE9mZG1UeFB3cklkeCk7DQorCQl9DQorCQkvLyBjYXNlIDI6IGVudGVyIGhpZ2ggcG93ZXINCisJCWVsc2UgaWYodTFiQ2NrIDwgQ2NrVHhQd3JJZHgpDQorCQl7DQorCQkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gZmFsc2U7DQorCQkJdTFiT2ZkbSA9ICgodTFiT2ZkbS0yKSA+IDApID8gKHUxYk9mZG0tMik6IDA7DQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJPZmRtKTsNCisJCQkvL1JUX1RSQUNFKENPTVBfUkFURSwgREJHX1RSQUNFLCAoIlJlY292ZXIgT0ZETV9UWEFHQygyKTogPT09PT0gdTFiT2ZkbT0gMHgleFxuIiwgdTFiT2ZkbSkpOw0KKw0KKwkJfQ0KKwl9DQorDQorCS8vDQorCS8vIFdlIG5lZWQgdXBkYXRlIGluaXRpYWwgZ2FpbiB3aGVuIHdlIHNldCB0eCByYXRlICJmcm9tIE9GRE0gdG8gQ0NLIiBvcg0KKwkvLyAiZnJvbSBDQ0sgdG8gT0ZETSIuIA0KKwkvLw0KK1NldEluaXRpYWxHYWluOg0KKwlpZihiVXBkYXRlSW5pdGlhbEdhaW4pDQorCXsNCisJCWlmKE1nbnRJc0Nja1JhdGUocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkpIC8vIENDSw0KKwkJew0KKwkJCWlmKHByaXYtPkluaXRpYWxHYWluID4gcHJpdi0+UmVnQk1vZGVHYWluU3RhZ2UpDQorCQkJew0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47DQorDQorCQkJCWlmKEN1cnJTaWduYWxTdHJlbmd0aCA8IC04NSkgLy8gTG93IHBvd2VyLCBPRkRNIFsweDE3XSA9IDI2Lg0KKwkJCQl7DQorCQkJCQkvL1NEMyBTWXMgc3VnZ2VzdCB0aGF0IEN1cnJTaWduYWxTdHJlbmd0aCA8IC02NSwgb2ZkbSAweDE3PTI2Lg0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSBwcml2LT5SZWdCTW9kZUdhaW5TdGFnZTsNCisJCQkJfQ0KKwkJCQllbHNlIGlmKHByaXYtPkluaXRpYWxHYWluID4gcHJpdi0+UmVnQk1vZGVHYWluU3RhZ2UgKyAxKQ0KKwkJCQl7DQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiAtPSAyOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW4gLS07DQorCQkJCX0NCisJCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IHVwZGF0ZSBpbml0X2dhaW4gdG8gaW5kZXggJWQgZm9yIGRhdGUgcmF0ZSAlZFxuIixwcml2LT5Jbml0aWFsR2FpbiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7CQkJDQorCQkJCVVwZGF0ZUluaXRpYWxHYWluKGRldik7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSAvLyBPRkRNDQorCQl7CQkJDQorCQkJaWYocHJpdi0+SW5pdGlhbEdhaW4gPCA0KQ0KKwkJCXsNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOw0KKw0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbiArKzsNCisJCQkJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N1NFKCk6IHVwZGF0ZSBpbml0X2dhaW4gdG8gaW5kZXggJWQgZm9yIGRhdGUgcmF0ZSAlZFxuIixwcml2LT5Jbml0aWFsR2FpbiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7CQkJDQorCQkJCVVwZGF0ZUluaXRpYWxHYWluKGRldik7DQorCQkJfQkJCQkJDQorCQl9DQorCX0NCisNCisJLy9SZWNvcmQgdGhlIHJlbGF0ZWQgaW5mbw0KKwlwcml2LT5MYXN0UmV0cnlSYXRlID0gQ3VyclJldHJ5UmF0ZTsNCisJcHJpdi0+TGFzdFR4VGhyb3VnaHB1dCA9IFR4VGhyb3VnaHB1dDsNCisJcHJpdi0+aWVlZTgwMjExLT5yYXRlID0gcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSAqIDU7DQorfQ0KKw0KKyNlbmRpZg0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj1LRVJORUxfVkVSU0lPTigyLDYsMjApDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQ0KK3sNCisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yayxzdHJ1Y3QgZGVsYXllZF93b3JrLHdvcmspOw0KKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UscmF0ZV9hZGFwdGVyX3dxKTsNCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKw0KKyNlbmRpZg0KKyAgICAgICAgLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorLy8gICAgRE1FU0coIi0tLS0+cnRsODE4MF9yYXRlX2FkYXB0ZXIiKTsNCisgICAgICAgIFN0YVJhdGVBZGFwdGl2ZTg3U0UoZGV2KTsNCisvLyAgIERNRVNHKCI8LS0tLXJ0bDgxODBfcmF0ZV9hZGFwdGVyIik7DQorfQ0KK3ZvaWQgdGltZXJfcmF0ZV9hZGFwdGl2ZSh1bnNpZ25lZCBsb25nIGRhdGEpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiogcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpOw0KKwkvL0RNRVNHKCItLS0tPnRpbWVyX3JhdGVfYWRhcHRpdmUoKVxuIik7DQorCWlmKCFwcml2LT51cCkNCisJew0KKy8vCQlETUVTRygiPC0tLS10aW1lcl9yYXRlX2FkYXB0aXZlKCk6ZHJpdmVyIGlzIG5vdCB1cCFcbiIpOw0KKwkJcmV0dXJuOw0KKwl9DQorCWlmKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIpDQorCQkJJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYNCisJCQkocHJpdi0+Rm9yY2VkRGF0YVJhdGUgPT0gMCkgKQ0KKwl7DQorLy8JRE1FU0coInRpbWVyX3JhdGVfYWRhcHRpdmUoKTpzY2hlZHVsZSByYXRlX2FkYXB0ZXJfd3FcbiIpOw0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICh2b2lkICopJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxKTsNCisvLwkJU3RhUmF0ZUFkYXB0aXZlODdTRSgoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsNCisjZW5kaWYNCisJfQ0KKwlwcml2LT5yYXRlYWRhcHRlcl90aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHByaXYtPlJhdGVBZGFwdGl2ZVBlcmlvZCk7DQorCWFkZF90aW1lcigmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOw0KKwkvL0RNRVNHKCI8LS0tLXRpbWVyX3JhdGVfYWRhcHRpdmUoKVxuIik7DQorfQ0KKy8vYnkgYW15IDA4MDMxMn0NCit2b2lkDQorU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODUoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIA0KKwl1OCBTaWduYWxTdHJlbmd0aA0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorDQorLy8JcHJpbnRrKCIrU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODU6IFJ4U3M6ICVkXG4iLCBTaWduYWxTdHJlbmd0aCk7DQorDQorCXByaXYtPkFkUnhPa0NudCsrOw0KKw0KKwlpZiggcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoICE9IC0xKQ0KKwl7DQorCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPSAoKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCo3KSArIChTaWduYWxTdHJlbmd0aCozKSkgLyAxMDsNCisJfQ0KKwllbHNlDQorCXsgLy8gSW5pdGlhbGl6YXRpb24gY2FzZS4NCisJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA9IFNpZ25hbFN0cmVuZ3RoOw0KKwl9DQorLy97K2J5IGFteSAwODAzMTINCisJaWYoIHByaXYtPkxhc3RSeFBrdEFudGVubmEgKSAvL01haW4gYW50ZW5uYS4JDQorCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCsrOwkNCisJZWxzZQkgLy8gQXV4IGFudGVubmEuDQorCQlwcml2LT5BZEF1eEFudGVubmFSeE9rQ250Kys7DQorLy8rYnkgYW15IDA4MDMxMg0KKy8vCXByaW50aygiLVN3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1OiBBZFJ4T2tDbnQ6ICVkIEFkUnhTaWduYWxTdHJlbmd0aDogJWRcbiIsIHByaXYtPkFkUnhPa0NudCwgcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoKTsNCit9DQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJQ2hhbmdlIEFudGVubmEgU3dpdGNoLg0KKy8vDQorYm9vbA0KK1NldEFudGVubmE4MTg1KA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LA0KKwl1OAkJdTFiQW50ZW5uYUluZGV4DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJYm9vbCBiQW50ZW5uYVN3aXRjaGVkID0gZmFsc2U7DQorDQorLy8JcHJpbnRrKCIrU2V0QW50ZW5uYTgxODUoKTogQW50ZW5uYSBpcyBzd2l0Y2hpbmcgdG86ICVkIFxuIiwgdTFiQW50ZW5uYUluZGV4KTsNCisNCisJc3dpdGNoKHUxYkFudGVubmFJbmRleCkNCisJew0KKwljYXNlIDA6DQorCQlzd2l0Y2gocHJpdi0+cmZfY2hpcCkNCisJCXsNCisJCWNhc2UgUkZfWkVCUkEyOg0KKwkJY2FzZSBSRl9aRUJSQTQ6DQorI2lmZGVmIENPTkZJR19SVEw4MTg1Qg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmENCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7IA0KKwkJCS8vYmFzZSBiYW5kDQorCQkJd3JpdGVfcGh5X2NjayhkZXYsMHgxMSwgMHg5Yik7IC8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4NCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLg0KKw0KKyNlbHNlDQorCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmENCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7IA0KKwkJCS8vYmFzZSBiYW5kDQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OWIpOyAvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuDQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4NCisjZW5kaWYNCisjZW5kaWYNCisNCisJCQliQW50ZW5uYVN3aXRjaGVkID0gdHJ1ZTsNCisJCQlicmVhazsNCisNCisJCWRlZmF1bHQ6DQorCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlicmVhazsNCisNCisJY2FzZSAxOg0KKwkJc3dpdGNoKHByaXYtPnJmX2NoaXApDQorCQl7DQorCQljYXNlIFJGX1pFQlJBMjoNCisJCWNhc2UgUkZfWkVCUkE0Og0KKyNpZmRlZiBDT05GSUdfUlRMODE4NUINCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmENCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7IA0KKwkJCS8vYmFzZSBiYW5kDQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuDQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4NCisjZWxzZQ0KKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmENCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7IA0KKwkJCS8vYmFzZSBiYW5kDQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4YmIpOyAvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuDQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDU0KTsgLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4NCisjZW5kaWYNCisjZW5kaWYNCisNCisJCQliQW50ZW5uYVN3aXRjaGVkID0gdHJ1ZTsNCisJCQlicmVhazsNCisNCisJCWRlZmF1bHQ6DQorCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlicmVhazsNCisNCisJZGVmYXVsdDoNCisJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biB1MWJBbnRlbm5hSW5kZXgoJWQpXG4iLCB1MWJBbnRlbm5hSW5kZXgpOw0KKwkJYnJlYWs7DQorCX0NCisNCisJaWYoYkFudGVubmFTd2l0Y2hlZCkNCisJew0KKwkJcHJpdi0+Q3VyckFudGVubmFJbmRleCA9IHUxYkFudGVubmFJbmRleDsNCisJfQ0KKw0KKy8vCXByaW50aygiLVNldEFudGVubmE4MTg1KCk6IHJldHVybiAoJSNYKVxuIiwgYkFudGVubmFTd2l0Y2hlZCk7DQorDQorCXJldHVybiBiQW50ZW5uYVN3aXRjaGVkOw0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlUb2dnbGUgQW50ZW5uYSBzd2l0Y2guDQorLy8NCitib29sDQorU3dpdGNoQW50ZW5uYSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorDQorCWJvb2wJCWJSZXN1bHQ7DQorDQorCWlmKHByaXYtPkN1cnJBbnRlbm5hSW5kZXggPT0gMCkNCisJew0KKyNpZiAwLy9sem0gZGVsIDA4MDgyNg0KKy8vYnkgYW15IDA4MDMxMg0KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TDQorCQlpZihwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpDQorCQkJYlJlc3VsdCA9IFNldEFudGVubmFDb25maWc4N1NFKGRldiwgMSwgdHJ1ZSk7DQorCQllbHNlCQkJDQorI2VuZGlmDQorI2VuZGlmDQorCQkJYlJlc3VsdCA9IFNldEFudGVubmE4MTg1KGRldiwgMSk7DQorLy9ieSBhbXkgMDgwMzEyDQorLy8JCXByaW50aygiU3dpdGNoQW50ZW5uYSgpOiBzd2l0Y2hpbmcgdG8gYW50ZW5uYSAxIC4uLi4uLlxuIik7DQorLy8JCWJSZXN1bHQgPSBTZXRBbnRlbm5hODE4NShkZXYsIDEpOy8vLWJ5IGFteSAwODAzMTINCisJfQ0KKwllbHNlDQorCXsNCisjaWYgMC8vbHptIGRlbCAwODA4MjYNCisvL2J5IGFteSAwODAzMTINCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKwkJaWYocHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KQ0KKwkJCWJSZXN1bHQgPSBTZXRBbnRlbm5hQ29uZmlnODdTRShkZXYsIDAsIHRydWUpOw0KKwkJZWxzZQkNCisjZW5kaWYNCisjZW5kaWYNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAwKTsNCisvL2J5IGFteSAwODAzMTINCisvLwkJcHJpbnRrKCJTd2l0Y2hBbnRlbm5hKCk6IHN3aXRjaGluZyB0byBhbnRlbm5hIDAgLi4uLi4uXG4iKTsNCisvLwkJYlJlc3VsdCA9IFNldEFudGVubmE4MTg1KGRldiwgMCk7Ly8tYnkgYW15IDA4MDMxMg0KKwl9DQorDQorCXJldHVybiBiUmVzdWx0Ow0KK30NCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlFbmdpbmUgb2YgU1cgQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtLg0KKy8vCQlTaW5jZSA4MTg3IGhhcyBubyBUeCBwYXJ0IGluZm9ybWF0aW9uLCANCisvLwkJdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBvbmx5IGRlcGVuZGVuZCBvbiBSeCBwYXJ0IGluZm9ybWF0aW9uLiANCisvLw0KKy8vCTIwMDYuMDQuMTcsIGJ5IHJjbmprby4NCisvLw0KK3ZvaWQNCitTd0FudGVubmFEaXZlcnNpdHkoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlib29sICAgYlN3Q2hlY2tTUz1mYWxzZTsNCisvLwlwcmludGsoIitTd0FudGVubmFEaXZlcnNpdHkoKTogQ3VyckFudGVubmFJbmRleDogJWRcbiIsIHByaXYtPkN1cnJBbnRlbm5hSW5kZXgpOw0KKy8vCXByaW50aygiQWRUaWNrQ291bnQgaXMgJWRcbiIscHJpdi0+QWRUaWNrQ291bnQpOw0KKy8vYnkgYW15IDA4MDMxMg0KKwlpZihiU3dDaGVja1NTKQ0KKwl7DQorCQlwcml2LT5BZFRpY2tDb3VudCsrOw0KKwkNCisJCXByaW50aygiKDEpIEFkVGlja0NvdW50OiAlZCwgQWRDaGVja1BlcmlvZDogJWRcbiIsIA0KKwkJCXByaXYtPkFkVGlja0NvdW50LCBwcml2LT5BZENoZWNrUGVyaW9kKTsNCisJCXByaW50aygiKDIpIEFkUnhTaWduYWxTdHJlbmd0aDogJWxkLCBBZFJ4U3NUaHJlc2hvbGQ6ICVsZFxuIiwgDQorCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpOw0KKwl9DQorLy8JcHJpdi0+QWRUaWNrQ291bnQrKzsvLy1ieSBhbXkgMDgwMzEyDQorCQ0KKwkvLyBDYXNlIDEuIE5vIExpbmsuDQorCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkNCisJew0KKwkvLwlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBDYXNlIDEuIE5vIExpbmsuXG4iKTsNCisNCisJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsNCisJCS8vIEkgc3dpdGNoIGFudGVubmEgaGVyZSB0byBwcmV2ZW50IGFueSBvbmUgb2YgYW50ZW5uYSBpcyBicm9rZW4gYmVmb3JlIGxpbmsgZXN0YWJsaXNoZWQsIDIwMDYuMDQuMTgsIGJ5IHJjbmprby4uDQorCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCX0NCisJLy8gQ2FzZSAyLiBMaW5rZWQgYnV0IG5vIHBhY2tldCByZWNlaXZlZC4NCisJZWxzZSBpZihwcml2LT5BZFJ4T2tDbnQgPT0gMCkNCisJew0KKwkvLwlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBDYXNlIDIuIExpbmtlZCBidXQgbm8gcGFja2V0IHJlY2VpdmVkLlxuIik7DQorDQorCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7DQorCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCX0NCisJLy8gQ2FzZSAzLiBFdmFsdWF0ZSBsYXN0IGFudGVubmEgc3dpdGNoIGFjdGlvbiBhbmQgdW5kbyBpdCBpZiBuZWNlc3NhcnkuDQorCWVsc2UgaWYocHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9PSB0cnVlKQ0KKwl7DQorCS8vCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgMy4gRXZhbHVhdGUgbGFzdCBhbnRlbm5hIHN3aXRjaCBhY3Rpb24uXG4iKTsNCisNCisJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsNCisNCisJCS8vIEFkanVzdCBSeCBzaWduYWwgc3RyZW5ndGggdGhyZWFzaG9sZC4NCisJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IChwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggKyBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCkgLyAyOw0KKw0KKwkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCA+IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgPwkNCisJCQkJCXByaXYtPkFkTWF4UnhTc1RocmVzaG9sZDogcHJpdi0+QWRSeFNzVGhyZXNob2xkOw0KKwkJaWYocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoIDwgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpDQorCQl7IC8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBpcyBub3QgaW1wcm92ZWQgYWZ0ZXIgd2Ugc3d0aWNoZWQgYW50ZW5uYS4gPT4gU3dpY2ggYmFjay4NCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IFJ4IFNpZ25hbCBTdHJlbmd0aCBpcyBub3QgaW1wcm92ZWQsIEN1cnJSeFNzOiAlZCwgTGFzdFJ4U3M6ICVkXG4iLCANCisvLwkJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKTsNCisvL2J5IGFteSAwODAzMTINCisJCQkvLyBJbmNyZWFzZSBBbnRlbm5hIERpdmVyc2l0eSBjaGVja2luZyBwZXJpb2QgZHVlIHRvIGJhZCBkZWNpc2lvbi4NCisJCQlwcml2LT5BZENoZWNrUGVyaW9kICo9IDI7DQorLy9ieSBhbXkgMDgwMzEyDQorCQkJLy8gSW5jcmVhc2UgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kLg0KKwkJCWlmKHByaXYtPkFkQ2hlY2tQZXJpb2QgPiBwcml2LT5BZE1heENoZWNrUGVyaW9kKQ0KKwkJCQlwcml2LT5BZENoZWNrUGVyaW9kID0gcHJpdi0+QWRNYXhDaGVja1BlcmlvZDsNCisJDQorCQkJLy8gV3JvbmcgZGVjZWlzaW9uID0+IHN3aXRjaCBiYWNrLg0KKwkJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJCX0NCisJCWVsc2UNCisJCXsgLy8gUnggU2lnbmFsIFN0cmVuZ3RoIGlzIGltcHJvdmVkLiANCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IFJ4IFNpZ25hbCBTdHJlbmd0aCBpcyBpbXByb3ZlZCwgQ3VyclJ4U3M6ICVkLCBMYXN0UnhTczogJWRcbiIsIA0KKy8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpOw0KKw0KKwkJCS8vIFJlc2V0IEFudGVubmEgRGl2ZXJzaXR5IGNoZWNraW5nIHBlcmlvZCB0byBpdHMgbWluIHZhbHVlLg0KKwkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgPSBwcml2LT5BZE1pbkNoZWNrUGVyaW9kOw0KKwkJfQ0KKw0KKy8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBBZFJ4U3NUaHJlc2hvbGQ6ICVkLCBBZENoZWNrUGVyaW9kOiAlZFxuIiwNCisvLwkJCXByaXYtPkFkUnhTc1RocmVzaG9sZCwgcHJpdi0+QWRDaGVja1BlcmlvZCk7DQorCX0NCisJLy8gQ2FzZSA0LiBFdmFsdWF0ZSBpZiB3ZSBzaGFsbCBzd2l0Y2ggYW50ZW5uYSBub3cuDQorCS8vIENhdXNlIFRhYmxlIFNwZWVkIGlzIHZlcnkgZmFzdCBpbiBUUkMgRGVsbCBMYWIsIHdlIGNoZWNrIGl0IGV2ZXJ5IHRpbWUuIA0KKwllbHNlLy8gaWYocHJpdi0+QWRUaWNrQ291bnQgPj0gcHJpdi0+QWRDaGVja1BlcmlvZCkvLy1ieSBhbXkgMDgwMzEyDQorCXsNCisvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQ2FzZSA0LiBFdmFsdWF0ZSBpZiB3ZSBzaGFsbCBzd2l0Y2ggYW50ZW5uYSBub3cuXG4iKTsNCisNCisJCXByaXYtPkFkVGlja0NvdW50ID0gMDsNCisNCisJCS8vDQorCQkvLyA8Um9nZXJfTm90ZXM+IFdlIGV2YWx1YXRlIFJ4T2sgY291bnRzIGZvciBlYWNoIGFudGVubmEgZmlyc3QgYW5kIHRoYW4gDQorCQkvLyBldmFsdWF0ZSBzaWduYWwgc3RyZW5ndGguIA0KKwkJLy8gVGhlIGZvbGxvd2luZyBvcGVyYXRpb24gY2FuIG92ZXJjb21lIHRoZSBkaXNhYmlsaXR5IG9mIENDQSBvbiBib3RoIHR3byBhbnRlbm5hcw0KKwkJLy8gV2hlbiBzaWduYWwgc3RyZW5ndGggd2FzIGV4dHJlbWVseSBsb3cgb3IgaGlnaC4NCisJCS8vIDIwMDguMDEuMzAuDQorCQkvLyANCisJCQ0KKwkJLy8NCisJCS8vIEV2YWx1YXRlIFJ4T2sgY291bnQgZnJvbSBlYWNoIGFudGVubmEgaWYgd2Ugc2hhbGwgc3dpdGNoIGRlZmF1bHQgYW50ZW5uYSBub3cuDQorCQkvLyBBZGRlZCBieSBSb2dlciwgMjAwOC4wMi4yMS4NCisvL3tieSBhbXkgMDgwMzEyDQorCQlpZigocHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQgPCBwcml2LT5BZEF1eEFudGVubmFSeE9rQ250KSANCisJCQkmJiAocHJpdi0+Q3VyckFudGVubmFJbmRleCA9PSAwKSkNCisJCXsgLy8gV2Ugc2V0IE1haW4gYW50ZW5uYSBhcyBkZWZhdWx0IGJ1dCBSeE9rIGNvdW50IHdhcyBsZXNzIHRoYW4gQXV4IG9uZXMuDQorDQorCS8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBNYWluIGFudGVubmEgUnhPSyBpcyBwb29yLCBBZE1haW5BbnRlbm5hUnhPa0NudDogJWQsIEFkQXV4QW50ZW5uYVJ4T2tDbnQ6ICVkXG4iLCANCisJLy8JCQlwcml2LT5BZE1haW5BbnRlbm5hUnhPa0NudCwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCk7DQorCQkJDQorCQkJLy8gU3dpdGNoIHRvIEF1eCBhbnRlbm5hLg0KKwkJCVN3aXRjaEFudGVubmEoZGV2KTsJDQorCQkJcHJpdi0+YkhXQWRTd2l0Y2hlZCA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmKChwcml2LT5BZEF1eEFudGVubmFSeE9rQ250IDwgcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQpIA0KKwkJCSYmIChwcml2LT5DdXJyQW50ZW5uYUluZGV4ID09IDEpKQ0KKwkJeyAvLyBXZSBzZXQgQXV4IGFudGVubmEgYXMgZGVmYXVsdCBidXQgUnhPayBjb3VudCB3YXMgbGVzcyB0aGFuIE1haW4gb25lcy4NCisNCisJLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IEF1eCBhbnRlbm5hIFJ4T0sgaXMgcG9vciwgQWRNYWluQW50ZW5uYVJ4T2tDbnQ6ICVkLCBBZEF1eEFudGVubmFSeE9rQ250OiAlZFxuIiwgDQorCS8vCQkJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQsIHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQpOw0KKwkJCQ0KKwkJCS8vIFN3aXRjaCB0byBNYWluIGFudGVubmEuDQorCQkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwkJCXByaXYtPmJIV0FkU3dpdGNoZWQgPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJey8vIERlZmF1bHQgYW50ZW5uYSBpcyBiZXR0ZXIuDQorDQorCS8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBEZWZhdWx0IGFudGVubmEgaXMgYmV0dGVyLiwgQWRNYWluQW50ZW5uYVJ4T2tDbnQ6ICVkLCBBZEF1eEFudGVubmFSeE9rQ250OiAlZFxuIiwgDQorCS8vCQkJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQsIHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQpOw0KKw0KKwkJCS8vIFN0aWxsIG5lZWQgdG8gY2hlY2sgY3VycmVudCBzaWduYWwgc3RyZW5ndGguDQorCQkJcHJpdi0+YkhXQWRTd2l0Y2hlZCA9IGZhbHNlOwkNCisJCX0NCisJCS8vDQorCQkvLyA8Um9nZXJfTm90ZXM+IFdlIGV2YWx1YXRlIFJ4IHNpZ25hbCBzdHJlbmd0aCBPTkxZIHdoZW4gZGVmYXVsdCBhbnRlbm5hIA0KKwkJLy8gZGlkbid0IGNoYW5nZWQgYnkgSFcgZXZhbHVhdGlvbi4gDQorCQkvLyAyMDA4LjAyLjI3Lg0KKwkJLy8NCisJCS8vIFtUUkMgRGVsbCBMYWJdIFNpZ25hbFN0cmVuZ3RoIGlzIGluYWNjdXJhY3kuIElzYWlhaCAyMDA4LTAzLTA1IA0KKwkJLy8gRm9yIGV4YW1wbGUsIFRocm91Z2hwdXQgb2YgYXV4IGlzIGJldHRlciB0aGFuIG1haW4gYW50ZW5uYShhYm91dCAxME0gdi5zIDJNKSwgDQorCQkvLyBidXQgQWRSeFNpZ25hbFN0cmVuZ3RoIGlzIGxlc3MgdGhhbiBtYWluLiANCisJCS8vIE91ciBndWVzcyBpcyB0aGF0IG1haW4gYW50ZW5uYSBoYXZlIGxvd2VyIHRocm91Z2hwdXQgYW5kIGdldCBtYW55IGNoYW5nZSANCisJCS8vIHRvIHJlY2VpdmUgbW9yZSBDQ0sgcGFja2V0cyhleC5CZWFjb24pIHdoaWNoIGhhdmUgc3Ryb25nZXIgU2lnbmFsU3RyZW5ndGguDQorCQkvLw0KKwkJaWYoICghcHJpdi0+YkhXQWRTd2l0Y2hlZCkgJiYgKGJTd0NoZWNrU1MpKQ0KKwkJew0KKy8vYnkgYW15IDA4MDMxMn0NCisJCS8vIEV2YWx1YXRlIFJ4IHNpZ25hbCBzdHJlbmd0aCBpZiB3ZSBzaGFsbCBzd2l0Y2ggYW50ZW5uYSBub3cuDQorCQlpZihwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpDQorCQl7IC8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBpcyB3ZWFrID0+IFN3aXRjaCBBbnRlbm5hLg0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogUnggU2lnbmFsIFN0cmVuZ3RoIGlzIHdlYWssIEN1cnJSeFNzOiAlZCwgUnhTc1RocmVzaG9sZDogJWRcbiIsIA0KKy8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKTsJDQorDQorCQkJcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQgPSBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGg7IA0KKwkJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSB0cnVlOw0KKw0KKwkJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJCX0NCisJCWVsc2UNCisJCXsgLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGlzIE9LLiANCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IFJ4IFNpZ25hbCBTdHJlbmd0aCBpcyBPSywgQ3VyclJ4U3M6ICVkLCBSeFNzVGhyZXNob2xkOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpOw0KKw0KKwkJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsNCisJCQkvLyBJbmNyZWFzZSBSeCBzaWduYWwgc3RyZW5ndGggdGhyZWFzaG9sZCBpZiBuZWNlc3NhcnkuDQorCQkJaWYoCShwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPiAocHJpdi0+QWRSeFNzVGhyZXNob2xkICsgMTApKSAmJiAvLyBTaWduYWwgaXMgbXVjaCBzdHJvbmdlciB0aGFuIGN1cnJlbnQgdGhyZXNob2xkDQorCQkJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA8PSBwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQpIC8vIEN1cnJlbnQgdGhyZWhvbGQgaXMgbm90IHlldCByZWFjaCB1cHBlciBsaW1pdC4NCisJCQl7DQorCQkJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgKyBwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgpIC8gMjsNCisJCQkJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gKHByaXYtPkFkUnhTc1RocmVzaG9sZCA+IHByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCkgPw0KKwkJCQkJCQkJCQkJCXByaXYtPkFkTWF4UnhTc1RocmVzaG9sZDogcHJpdi0+QWRSeFNzVGhyZXNob2xkOy8vK2J5IGFteSAwODAzMTINCisJCQl9DQorDQorCQkJLy8gUmVkdWNlIEFudGVubmEgRGl2ZXJzaXR5IGNoZWNraW5nIHBlcmlvZCBpZiBwb3NzaWJsZS4gDQorCQkJaWYoIHByaXYtPkFkQ2hlY2tQZXJpb2QgPiBwcml2LT5BZE1pbkNoZWNrUGVyaW9kICkNCisJCQl7DQorCQkJCXByaXYtPkFkQ2hlY2tQZXJpb2QgLz0gMjsgDQorCQkJfQ0KKwkJfQ0KKwkJfQ0KKwl9DQorLy9ieSBhbXkgMDgwMzEyDQorCS8vIFJlc2V0IGFudGVubmEgZGl2ZXJzaXR5IFJ4IHJlbGF0ZWQgc3RhdGlzdGljcy4NCisJcHJpdi0+QWRSeE9rQ250ID0gMDsNCisJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQgPSAwOw0KKwlwcml2LT5BZEF1eEFudGVubmFSeE9rQ250ID0gMDsNCisvL2J5IGFteSAwODAzMTINCisNCisvLwlwcml2LT5BZFJ4T2tDbnQgPSAwOy8vLWJ5IGFteSAwODAzMTINCisNCisvLwlwcmludGsoIi1Td0FudGVubmFEaXZlcnNpdHkoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVJldHVybiBUUlVFIGlmIHdlIHNoYWxsIHBlcmZvcm0gVHggUG93ZXIgVHJhY2tpbmcgTWVjYWhuaXNtLCBGQUxTRSBvdGhlcndpc2UuCQ0KKy8vDQorYm9vbA0KK0NoZWNrVHhQd3JUcmFja2luZygJc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisJaWYoIXByaXYtPmJUeFBvd2VyVHJhY2spDQorCXsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKy8vbHptIHJlc2VydmVkIDA4MDgyNg0KKwkvL2lmKHByaXYtPmJTY2FuSW5Qcm9ncmVzcykNCisJLy97DQorCS8vCXJldHVybiBmYWxzZTsNCisJLy99DQorDQorCS8vaWYgODdTRSBpcyBpbiBIaWdoIFBvd2VyICwgZG9uJ3QgZG8gVHggUG93ZXIgVHJhY2tpbmcuIGFza2VkIGJ5IFNEMyBFRC4gMjAwOC0wOC0wOCBJc2FpYWggDQorCWlmKHByaXYtPmJUb1VwZGF0ZVR4UHdyKQ0KKwl7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJCQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gb2YgU1cgQW50ZW5uYSBEaXZlcnNpdHkuDQorLy8NCit2b2lkDQorU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjaygNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7DQorCQ0KKwkvL3ByaW50aygiK1N3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soKVxuIik7DQorDQorCS8vDQorCS8vIFdlIGRvIE5PVCBuZWVkIHRvIHN3aXRjaCBhbnRlbm5hIHdoaWxlIFJGIGlzIG9mZi4NCisJLy8gMjAwNy4wNS4wOSwgYWRkZWQgYnkgUm9nZXIuDQorCS8vDQorCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOw0KKwlkb3sNCisJCWlmIChydFN0YXRlID09IGVSZk9mZikNCisJCXsJDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyIC0gUkYgaXMgT0ZGLlxuIik7DQorCQkJYnJlYWs7DQorCQl9ICAJDQorCQllbHNlIGlmIChydFN0YXRlID09IGVSZlNsZWVwKQ0KKwkJewkNCisJCQkvLyBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgRGlzYWJsZSBQTEwgc2l0dWF0aW9uLg0KKwkJCS8vUlRfVFJBQ0UoKENPTVBfUkZ8Q09NUF9BTlRFTk5BKSwgREJHX0xPVUQsICgiU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjaygpOiBSRiBpcyBTbGVlcCA9PiBza2lwIGl0XG4iKSk7DQorCQkJYnJlYWs7DQorCQl9ICANCisJCVN3QW50ZW5uYURpdmVyc2l0eShkZXYpOw0KKw0KKwl9d2hpbGUoZmFsc2UpOw0KKw0KKwlpZihwcml2LT51cCkNCisJew0KKwkJcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhBTlRFTk5BX0RJVkVSU0lUWV9USU1FUl9QRVJJT0QpOw0KKwkJYWRkX3RpbWVyKCZwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lcik7DQorCX0NCisNCisJLy9wcmludGsoIi1Td0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKClcbiIpOw0KK30NCisNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlOTJmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uaApAQCAtMCwwICsxLDQxIEBACisjaWZuZGVmIFI4MTgwX0RNX0ggDQorI2RlZmluZSBSODE4MF9ETV9IDQorDQorI2luY2x1ZGUgInI4MTgwLmgiDQorLy8jaW5jbHVkZSAicjgxODBfaHcuaCINCisvLyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIg0KK3ZvaWQgU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggU2lnbmFsU3RyZW5ndGgpOw0KK2Jvb2wgU2V0QW50ZW5uYTgxODUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJdTggdTFiQW50ZW5uYUluZGV4KTsNCitib29sIFN3aXRjaEFudGVubmEoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KK3ZvaWQgU3dBbnRlbm5hRGl2ZXJzaXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYJKTsNCit2b2lkIFN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorYm9vbCBDaGVja0RpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCitib29sIENoZWNrSGlnaFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpDQordm9pZCBydGw4MTgwX2h3X2RpZ193cSAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9od19kaWdfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2VuZGlmDQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfdHhfcHdfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfdHhfcHdfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2VuZGlmDQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspOw0KKw0KKyNlbHNlDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisNCisjZW5kaWYNCit2b2lkIFR4UHdyVHJhY2tpbmc4N1NFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KK2Jvb2wgQ2hlY2tUeFB3clRyYWNraW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj1LRVJORUxfVkVSU0lPTigyLDYsMjApDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKTsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorI2VuZGlmDQordm9pZCB0aW1lcl9yYXRlX2FkYXB0aXZlKHVuc2lnbmVkIGxvbmcgZGF0YSk7DQorDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjYjQyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIEdDVCByYWRpbyBmcm9udGVuZCBwcm9ncmFtbWluZyByb3V0aW5lcy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgQ29kZSBmcm9tIFJ0dzgxODAgTmV0QlNEIGRyaXZlciBieSBEYXZpZCBZb3VuZyBoYXMgYmVlbiByZWFsbHkgdXNlZnVsIHRvCisgICB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzIGFuZCBnZXRzIHNvbWUgaWRlYXMKKworICAgQ29kZSBmcm9tIHJ0bDgxODEgcHJvamVjdCBoYXMgYmVlbiB1c2VmdWwgdG8gbWUgdG8gdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgU29tZSBjb2RlIGZyb20gJ0RldWNlJyB3b3JrCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfZ2N0LmgiCisKKworLy8jZGVmaW5lIERFQlVHX0dDVAorCisvKiB0aGUgZm9sbG93aW5nIGV4cGVyaW1lbnQgYXJlIGp1c3QgZXhwZXJpbWVudHMuCisgKiB0aGlzIG1lYW5zIGlmIHlvdSBlbmFibGUgdGhlbSB5b3UgY2FuIGhhdmUgZXZlcnkga2luZAorICogb2YgcmVzdWx0LCBpbmNsdWRlZCBkYW1hZ2UgdGhlIFJGIGNoaXAsIHNvIGRvbid0CisgKiB0b3VjaCB0aGVtIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKyAqIEluIGFueSBjYXNlLCBpZiB5b3UgZG8gaXQsIGRvIGF0IHlvdXIgb3duIHJpc2sKKyAqLworCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQxICAvL2ltcHJvdmUgUlggc2Vuc2l2aXR5CisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDIKKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UMyAgLy9pcHJvdmUgYSBiaXQgUlggc2lnbmFsIHF1YWxpdHkgPworCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQ0IC8vbWF5YmUgc29sdmUgc29tZSBicm9rZW5lc3Mgd2l0aCBleHBlcmltZW50MSA/CisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDUKKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UNiAgLy9ub3QgZ29vZAorCisKK3UzMiBnY3RfY2hhbltdID0geworCTB4MCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDAsIC8vMQorCTB4MSwgLy8yCisJMHgyLCAvLzMKKwkweDMsIC8vNAorCTB4NCwgLy81CisJMHg1LCAvLzYKKwkweDYsIC8vNworCTB4NywgLy84CisJMHg4LCAvLzkKKwkweDksIC8vMTAKKwkweGEsIC8vMTEKKwkweGIsIC8vMTIKKwkweGMsIC8vMTMKKwkweGQsIC8vMTQKK307CisKK2ludCBnY3RfZW5jb2RlWzE2XSA9IHsKKwkwLCA4LCA0LCAweEMsCisJMiwgMHhBLCA2LCAweEUsCisJMSwgOSwgNSwgMHhELAorCTMsIDB4QiwgNywgMHhGCit9OworCit2b2lkIGdjdF9yZl9zdGFiaWxpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgzKTsgLy9mb3Igbm93IHVzZSBhIGdyZWF0IHZhbHVlLi4gd2UgbWF5IG9wdGltaXplIGluIGZ1dHVyZQorfQorCisKK3ZvaWQgd3JpdGVfZ2N0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHBoeV9jb25maWc7CisKKwlwaHlfY29uZmlnID0gIGdjdF9lbmNvZGVbKGRhdGEgJiAweGYwMCkgPj4gOF07CisJcGh5X2NvbmZpZyB8PSBnY3RfZW5jb2RlWyhkYXRhICYgMHhmMCkgPj4gNCBdIDw8IDQ7CisJcGh5X2NvbmZpZyB8PSBnY3RfZW5jb2RlWyhkYXRhICYgMHhmKSAgICAgICBdIDw8IDg7CisJcGh5X2NvbmZpZyB8PSBnY3RfZW5jb2RlWyhhZHIgPj4gMSkgJiAweGYgICBdIDw8IDEyOworCXBoeV9jb25maWcgfD0gICAgICAgICAgICAoYWRyICYgMSApICAgICAgICAgICA8PCAxNjsKKwlwaHlfY29uZmlnIHw9IGdjdF9lbmNvZGVbKGRhdGEgJiAweGYwMDApPj4xMl0gPDwgMjQ7CisKKwlwaHlfY29uZmlnIHw9IDB4OTAwMDAwMDA7IC8vIE1BQyB3aWxsIGJhbmcgYml0cyB0byB0aGUgY2hpcAorCisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcscGh5X2NvbmZpZyk7CisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIldyaXRpbmcgR0NUOiAleCAoYWRyICV4KSIscGh5X2NvbmZpZyxhZHIpOworI2VuZGlmCisJZ2N0X3JmX3N0YWJpbGl6ZShkZXYpOworfQorCisKKwordm9pZCBnY3Rfd3JpdGVfcGh5X2FudGVubmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYW50OworCisJYW50ID0gR0NUX0FOVEVOTkE7CisJaWYocHJpdi0+YW50YikgLypkZWZhdWx0IGFudGVubmEgaXMgYW50ZW5uYSBCICovCisJCWFudCB8PSBCQl9BTlRFTk5BX0I7CisJaWYoY2ggPT0gMTQpCisJCWFudCB8PSBCQl9BTlRBVFRFTl9DSEFOMTQ7CisJd3JpdGVfcGh5KGRldiwweDEwLGFudCk7CisJLy9ETUVTRygiQkIgYW50ZW5uYSAleCAiLGFudCk7Cit9CisKKwordm9pZCBnY3RfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0eHB3ID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXUzMiBjaGFuID0gZ2N0X2NoYW5bY2hdOworCisJLy93cml0ZV9waHkoZGV2LDMsdHhwdyk7CisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIkdjdCBzZXQgY2hhbm5lbCIpOworI2VuZGlmCisJLyogc2V0IFRYIHBvd2VyICovCisJd3JpdGVfZ2N0KGRldiwweDE1LDApOworIAl3cml0ZV9nY3QoZGV2LDYsIHR4cHcpOworCXdyaXRlX2djdChkZXYsMHgxNSwgMHgxMCk7CisJd3JpdGVfZ2N0KGRldiwweDE1LDApOworCisJLypzZXQgZnJlcXVlbmN5Ki8KKwl3cml0ZV9nY3QoZGV2LDcsIDApOworICAgICAgCXdyaXRlX2djdChkZXYsMHhCLCBjaGFuKTsKKyAgICAgIAl3cml0ZV9nY3QoZGV2LDcsIDB4MTAwMCk7CisKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IHNldCBjaGFubmVsID4gd3JpdGUgcGh5IGFudGVubmEiKTsKKyNlbmRpZgorCisKKwlnY3Rfd3JpdGVfcGh5X2FudGVubmEoZGV2LGNoKTsKKworfQorCisKK3ZvaWQgZ2N0X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIGFuYXBhcmFtOworCisJYW5hcGFyYW0gPSByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pOworCWFuYXBhcmFtICY9IDB4MDAwZmZmZmY7CisJYW5hcGFyYW0gfD0gMHgzZjkwMDAwMDsKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIGFuYXBhcmFtKTsKKworCXdyaXRlX2djdChkZXYsIDB4NywgMCk7CisJd3JpdGVfZ2N0KGRldiwgMHgxZiwgMHg0NSk7CisJd3JpdGVfZ2N0KGRldiwgMHgxZiwgMHg1KTsKKwl3cml0ZV9nY3QoZGV2LCAweDAsIDB4OGU0KTsKK30KKworCit2b2lkIGdjdF9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vdTMyIGFuYXBhcmFtOworCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUEhZX0RFTEFZLDB4Nik7CS8vdGhpcyBpcyBnZW5lcmFsCisJd3JpdGVfbmljX2J5dGUoZGV2LENBUlJJRVJfU0VOU0VfQ09VTlRFUiwweDRjKTsgLy90aGlzIGlzIGdlbmVyYWwKKworCS8vRE1FU0coIiV4IiwgcmVhZF9uaWNfZHdvcmQoZGV2LEFOQVBBUkFNKSk7CisJLyogd2Ugc2hvdWxkIHNldCBhbmFwYXJtIGhlcmUqLworCS8vcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKworCXdyaXRlX2djdChkZXYsMHgxZiwwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NDApOworCXdyaXRlX2djdChkZXYsMHgxZiwweDYwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MSk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NjEpOworCXdyaXRlX2djdChkZXYsMHgwLDB4YWU0KTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHgxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg0MSk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NjEpOworCXdyaXRlX2djdChkZXYsMHgxLDB4MWEyMyk7CisJd3JpdGVfZ2N0KGRldiwweDIsMHg0OTcxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MywweDQxZGUpOworCXdyaXRlX2djdChkZXYsMHg0LDB4MmQ4MCk7CisjaWZkZWYgR0NUX0VYUEVSSU1FTlQxCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4MTApOyAgLy8gZnJvbSB6eWRhcyBkcml2ZXIuIHNlbnMrIGJ1dCBxdWl0ZSBzbG93CisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4MWYpOyAgLy9nb29kKyAoc29tZXdoYXQgc3RhYmxlLCBiZXR0ZXIgc2VucywgcGVyZm9ybWFuY2UgZGVjZW50KQorCXdyaXRlX2djdChkZXYsMHg1LDB4Njg1Zik7ICAvL2dvb2QgcGVyZm9ybWFuY2VzLCBub3Qgc3VyZSBzZW5zIGlzIHJlYWxseSBzbyBiZWV0ZXIKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4Njg3Zik7ICAvL2dvb2QgcGVyZm9ybWFuY2VzLCBtYXliZSBzZW5zIGlzIG5vdCBpbXByb3ZlZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODlmKTsgIC8vbGlrZSBhYm92ZQorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODVlKTsgIC8vYmFkCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4ZmYpOyAgLy9nb29kKyAoc29tZXdoYXQgc3RhYmxlLCBiZXR0ZXIgc2Vucyg/KSwgcGVyZm9ybWFuY2UgZGVjZW50KQorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2OGYwKTsgIC8vYmFkCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDZjZmYpOyAgLy9zZW5zKyBidXQgbm90IHNvIGdvb2QKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NmRmZik7ICAvL3NlbnMrLGFwcGFyZW50ZWx5IHZlcnkgZ29vZCBidXQgYnJva2VuCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY1ZmYpOyAgLy9zZW5zKyxnb29kCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDc4ZmYpOyAgLy9zZW5zICsgYnV0IGFsbW9zdCBicm9rZW4KKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NzgxMCk7ICAvLy0gLy9zbmVzICsgYnV0IGJyb2tlbgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3ODFmKTsgIC8vLS0gLy9zZW5zICsKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NzhmMCk7ICAvL2xvdyBzZW5zCisjZWxzZQorCXdyaXRlX2djdChkZXYsMHg1LDB4NjFmZik7ICAgLy9iZXN0IHBlcmZvcm1hbmNlIGJ1dCB3ZWFrIHNlbnNpdGl2aXR5CisjZW5kaWYKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDIKKwl3cml0ZV9nY3QoZGV2LDB4NiwweGUpOworI2Vsc2UKKwl3cml0ZV9nY3QoZGV2LDB4NiwweDApOworI2VuZGlmCisJd3JpdGVfZ2N0KGRldiwweDcsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4OCwweDc1MzMpOworCXdyaXRlX2djdChkZXYsMHg5LDB4YzQwMSk7CisJd3JpdGVfZ2N0KGRldiwweGEsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4YywweDFjNyk7CisJd3JpdGVfZ2N0KGRldiwweGQsMHgyOWQzKTsKKwl3cml0ZV9nY3QoZGV2LDB4ZSwweDJlOCk7CisJd3JpdGVfZ2N0KGRldiwweDEwLDB4MTkyKTsKKyNpZmRlZiBHQ1RfRVhQRVJJTUVOVDMKKwl3cml0ZV9nY3QoZGV2LDB4MTEsMHgyNDYpOworI2Vsc2UKKwl3cml0ZV9nY3QoZGV2LDB4MTEsMHgyNDgpOworI2VuZGlmCisJd3JpdGVfZ2N0KGRldiwweDEyLDB4MCk7CisJd3JpdGVfZ2N0KGRldiwweDEzLDB4MjBjNCk7CisjaWZkZWYgR0NUX0VYUEVSSU1FTlQ0CisJd3JpdGVfZ2N0KGRldiwweDE0LDB4ZjQ4OCk7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHgxNCwweGY0ZmMpOworI2VuZGlmCisjaWZkZWYgR0NUX0VYUEVSSU1FTlQ1CisJd3JpdGVfZ2N0KGRldiwweDE1LDB4YjE1Mik7CisjZWxzZQorCXdyaXRlX2djdChkZXYsMHgxNSwweDApOworI2VuZGlmCisjaWZkZWYgR0NUX0VYUEVSSU1FTlQ2CisJd3JpdGVfZ2N0KGRldiwweDFlLDB4MSk7CisjZW5kaWYKKwl3cml0ZV9nY3QoZGV2LDB4MTYsMHgxNTAwKTsKKworCXdyaXRlX2djdChkZXYsMHg3LDB4MTAwMCk7CisJLyp3cml0ZV9nY3QoZGV2LDB4MTUsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4NiwweDE1KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHg4KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHgwKTsKKyovCisJd3JpdGVfcGh5KGRldiwwLDB4YTgpOworCisvKgl3cml0ZV9nY3QoZGV2LDB4MTUsMHgwKTsKKwl3cml0ZV9nY3QoZGV2LDB4NiwweDEyKTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHg4KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHgwKTsKKyovCisJd3JpdGVfcGh5KGRldiwzLDB4MCk7CisJd3JpdGVfcGh5KGRldiw0LDB4YzApOyAvKiBsbmEgZGV0Ki8KKwl3cml0ZV9waHkoZGV2LDUsMHg5MCk7CisJd3JpdGVfcGh5KGRldiw2LDB4MWUpOworCXdyaXRlX3BoeShkZXYsNywweDY0KTsKKworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJHY3QgaW5pdD4gd3JpdGUgcGh5IGFudGVubmEiKTsKKyNlbmRpZgorCisJZ2N0X3dyaXRlX3BoeV9hbnRlbm5hKGRldixwcml2LT5jaGFuKTsKKworCXdyaXRlX3BoeShkZXYsMHgxMSwweDg4KTsKKwlpZighcHJpdi0+ZGl2ZXJzaXR5KQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHhjMCk7CisJZWxzZQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHg0MCk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTMsMHg5MCB8IHByaXYtPmNzX3RyZXNob2xkICk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTksMHgwKTsKKwl3cml0ZV9waHkoZGV2LDB4MWEsMHhhMCk7CisJd3JpdGVfcGh5KGRldiwweDFiLDB4NDQpOworCisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIkdjdCBpbml0ID4gc2V0IGNoYW5uZWwyIik7CisjZW5kaWYKKworCWdjdF9yZl9zZXRfY2hhbihkZXYscHJpdi0+Y2hhbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk2NWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuaApAQCAtMCwwICsxLDI1IEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjIwCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNkZWZpbmUgR0NUX0FOVEVOTkEgMHhBMworCisKKy8vIHdlIHVzZSB0aGUgdW50b3VjaGVkIGVlcHJvbSB2YWx1ZS0gY3Jvc3MgeW91ciBmaW5nZXIgOy0pCisjZGVmaW5lIEdDVF9BTkFQQVJBTV9QV1IxX09OID8/CisjZGVmaW5lIEdDVF9BTkFQQVJBTV9QV1IwX09OID8/CisKKworCit2b2lkIGdjdF9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBnY3RfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CisKK3ZvaWQgZ2N0X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ody5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzg5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2h3LmgKQEAgLTAsMCArMSw5NTYgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKwlvZmZpY2lhbCBSZWFsdGVrIGRyaXZlci4KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisJZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzCisJMjEwMCBHUEwgZHJpdmVyLgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cworCWFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLyogTWFyaXVzeiBNYXR1c3playBhZGRlZCBmdWxsIHJlZ2lzdGVycyBkZWZpbml0aW9uIHdpdGggUmVhbHRlaydzIG5hbWUgKi8KKworLyogdGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgcnRsODE4MCBNQUMgY29udHJvbGxlciAqLworI2lmbmRlZiBSODE4MF9IVworI2RlZmluZSBSODE4MF9IVworCisjZGVmaW5lIENPTkZJR19SVEw4MTg1QiAgLy9zdXBwb3J0IGZvciBydGw4MTg1QiwgeGlvbmctMjAwNi0xMS0xNQorI2RlZmluZSBDT05GSUdfUlRMODE4WF9TCisKKyNkZWZpbmUgQklUMAkweDAwMDAwMDAxCisjZGVmaW5lIEJJVDEJMHgwMDAwMDAwMgorI2RlZmluZSBCSVQyCTB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMwkweDAwMDAwMDA4CisjZGVmaW5lIEJJVDQJMHgwMDAwMDAxMAorI2RlZmluZSBCSVQ1CTB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNgkweDAwMDAwMDQwCisjZGVmaW5lIEJJVDcJMHgwMDAwMDA4MAorI2RlZmluZSBCSVQ4CTB4MDAwMDAxMDAKKyNkZWZpbmUgQklUOQkweDAwMDAwMjAwCisjZGVmaW5lIEJJVDEwCTB4MDAwMDA0MDAKKyNkZWZpbmUgQklUMTEJMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMgkweDAwMDAxMDAwCisjZGVmaW5lIEJJVDEzCTB4MDAwMDIwMDAKKyNkZWZpbmUgQklUMTQJMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxNQkweDAwMDA4MDAwCisjZGVmaW5lIEJJVDE2CTB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTcJMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOAkweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE5CTB4MDAwODAwMDAKKyNkZWZpbmUgQklUMjAJMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMQkweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIyCTB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjMJMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNAkweDAxMDAwMDAwCisjZGVmaW5lIEJJVDI1CTB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjYJMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNwkweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI4CTB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVDMxCTB4ODAwMDAwMDAKKworI2RlZmluZSBNQVhfU0xFRVBfVElNRSAoMTAwMDApCisjZGVmaW5lIE1JTl9TTEVFUF9USU1FICg1MCkKKworI2RlZmluZSBCQl9BTlRBVFRFTl9DSEFOMTQJMHgwYworI2RlZmluZSBCQl9BTlRFTk5BX0IgMHg0MAorCisjZGVmaW5lIEJCX0hPU1RfQkFORyAoMTw8MzApCisjZGVmaW5lIEJCX0hPU1RfQkFOR19FTiAoMTw8MikKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0NMSyAoMTw8MSkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0RBVEEJIDEKKworI2RlZmluZSBBTkFQQVJBTV9UWERBQ09GRl9TSElGVCAyNworI2RlZmluZSBBTkFQQVJBTV9QV1IwX01BU0sgKCgxPDwzMCl8KDE8PDI5KXwoMTw8MjgpKQorI2RlZmluZSBBTkFQQVJBTV9QV1IwX1NISUZUIDI4CisjZGVmaW5lIEFOQVBBUkFNX1BXUjFfTUFTSyAoKDE8PDI2KXwoMTw8MjUpfCgxPDwyNCl8KDE8PDIzKXwoMTw8MjIpfCgxPDwyMSl8KDE8PDIwKSkKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMV9TSElGVCAyMAorCisjZGVmaW5lIE1BQzAgMAorI2RlZmluZSBNQUMxIDEKKyNkZWZpbmUgTUFDMiAyCisjZGVmaW5lIE1BQzMgMworI2RlZmluZSBNQUM0IDQKKyNkZWZpbmUgTUFDNSA1CisjZGVmaW5lIENNRCAweDM3CisjZGVmaW5lIENNRF9SU1RfU0hJRlQgNAorI2RlZmluZSBDTURfUkVTRVJWRURfTUFTSyAoKDE8PDEpIHwgKDE8PDUpIHwgKDE8PDYpIHwgKDE8PDcpKQorI2RlZmluZSBDTURfUlhfRU5BQkxFX1NISUZUIDMKKyNkZWZpbmUgQ01EX1RYX0VOQUJMRV9TSElGVCAyCisKKyNkZWZpbmUgRVBST01fQ01EIDB4NTAKKyNkZWZpbmUgRVBST01fQ01EX1JFU0VSVkVEX01BU0sgKCgxPDw1KXwoMTw8NCkpCisjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCA2CisjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLICgoMTw8Nyl8KDE8PDYpKQorI2RlZmluZSBFUFJPTV9DTURfQ09ORklHIDB4MworI2RlZmluZSBFUFJPTV9DTURfTk9STUFMIDAKKyNkZWZpbmUgRVBST01fQ01EX0xPQUQgMQorI2RlZmluZSBFUFJPTV9DTURfUFJPR1JBTSAyCisjZGVmaW5lIEVQUk9NX0NTX1NISUZUIDMKKyNkZWZpbmUgRVBST01fQ0tfU0hJRlQgMgorI2RlZmluZSBFUFJPTV9XX1NISUZUIDEKKyNkZWZpbmUgRVBST01fUl9TSElGVCAwCisjZGVmaW5lIENPTkZJRzJfRE1BX1BPTExJTkdfTU9ERV9TSElGVCAzCisjZGVmaW5lIElOVEEgMHgzZQorI2RlZmluZSBJTlRBX1RYT1ZFUkZMT1cgKDE8PDE1KQorI2RlZmluZSBJTlRBX1RJTUVPVVQgKDE8PDE0KQorI2RlZmluZSBJTlRBX0JFQUNPTlRJTUVPVVQgKDE8PDEzKQorI2RlZmluZSBJTlRBX0FUSU0gKDE8PDEyKQorI2RlZmluZSBJTlRBX0JFQUNPTkRFU0NFUlIgKDE8PDExKQorI2RlZmluZSBJTlRBX0JFQUNPTkRFU0NPSyAoMTw8MTApCisjZGVmaW5lIElOVEFfSElQUklPUklUWURFU0NFUlIgKDE8PDkpCisjZGVmaW5lIElOVEFfSElQUklPUklUWURFU0NPSyAoMTw8OCkKKyNkZWZpbmUgSU5UQV9OT1JNUFJJT1JJVFlERVNDRVJSICgxPDw3KQorI2RlZmluZSBJTlRBX05PUk1QUklPUklUWURFU0NPSyAoMTw8NikKKyNkZWZpbmUgSU5UQV9SWE9WRVJGTE9XICgxPDw1KQorI2RlZmluZSBJTlRBX1JYREVTQ0VSUiAoMTw8NCkKKyNkZWZpbmUgSU5UQV9MT1dQUklPUklUWURFU0NFUlIgKDE8PDMpCisjZGVmaW5lIElOVEFfTE9XUFJJT1JJVFlERVNDT0sgKDE8PDIpCisjZGVmaW5lIElOVEFfUlhDUkNFUlIgKDE8PDEpCisjZGVmaW5lIElOVEFfUlhPSyAoMSkKKyNkZWZpbmUgSU5UQV9NQVNLIDB4M2MKKyNkZWZpbmUgUlhSSU5HX0FERFIgMHhlNCAvLyBwYWdlIDAKKyNkZWZpbmUgUEdTRUxFQ1QgMHg1ZQorI2RlZmluZSBQR1NFTEVDVF9QR19TSElGVCAwCisjZGVmaW5lIFJYX0NPTkYgMHg0NAorI2RlZmluZSBNQUNfRklMVEVSX01BU0sgKCgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw1KSB8IFwKKygxPDwxMikgfCAoMTw8MTgpIHwgKDE8PDE5KSB8ICgxPDwyMCkgfCAoMTw8MjEpIHwgKDE8PDIyKSB8ICgxPDwyMykpCisjZGVmaW5lIFJYX0NIRUNLX0JTU0lEX1NISUZUIDIzCisjZGVmaW5lIEFDQ0VQVF9QV1JfRlJBTUVfU0hJRlQgMjIKKyNkZWZpbmUgQUNDRVBUX01OR19GUkFNRV9TSElGVCAyMAorI2RlZmluZSBBQ0NFUFRfQ1RMX0ZSQU1FX1NISUZUIDE5CisjZGVmaW5lIEFDQ0VQVF9EQVRBX0ZSQU1FX1NISUZUIDE4CisjZGVmaW5lIEFDQ0VQVF9JQ1ZFUlJfRlJBTUVfU0hJRlQgMTIKKyNkZWZpbmUgQUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCA1CisjZGVmaW5lIEFDQ0VQVF9CQ0FTVF9GUkFNRV9TSElGVCAzCisjZGVmaW5lIEFDQ0VQVF9NQ0FTVF9GUkFNRV9TSElGVCAyCisjZGVmaW5lIEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQgMAorI2RlZmluZSBBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUIDEKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfTUFTSyAoKDE8PDEzKSB8ICgxPDwxNCkgfCAoMTw8MTUpKQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF9TSElGVCAxMworI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF8xMjggMworI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF8yNTYgNAorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF81MTIgNQorI2RlZmluZSBSWF9GSUZPX1RIUkVTSE9MRF8xMDI0IDYKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfTk9ORSA3CisjZGVmaW5lIFJYX0FVVE9SRVNFVFBIWV9TSElGVCAyOAorI2RlZmluZSBFUFJPTV9UWVBFX1NISUZUIDYKKyNkZWZpbmUgVFhfQ09ORiAweDQwCisjZGVmaW5lIFRYX0NPTkZfSEVBREVSX0FVVE9JQ1JFTUVOVF9TSElGVCAzMAorI2RlZmluZSBUWF9MT09QQkFDS19TSElGVCAxNworI2RlZmluZSBUWF9MT09QQkFDS19NQUMgMQorI2RlZmluZSBUWF9MT09QQkFDS19CQVNFQkFORCAyCisjZGVmaW5lIFRYX0xPT1BCQUNLX05PTkUgMAorI2RlZmluZSBUWF9MT09QQkFDS19DT05USU5VRSAzCisjZGVmaW5lIFRYX0xPT1BCQUNLX01BU0sgKCgxPDwxNyl8KDE8PDE4KSkKKyNkZWZpbmUgVFhfRFBSRVRSWV9TSElGVCAwCisjZGVmaW5lIFI4MTgwX01BWF9SRVRSWSAyNTUKKyNkZWZpbmUgVFhfUlRTUkVUUllfU0hJRlQgOAorI2RlZmluZSBUWF9OT0lDVl9TSElGVCAxOQorI2RlZmluZSBUWF9OT0NSQ19TSElGVCAxNgorI2RlZmluZSBUWF9ETUFfUE9MTElORyAweGQ5CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX0JFQUNPTl9TSElGVCA3CisjZGVmaW5lIFRYX0RNQV9QT0xMSU5HX0hJUFJJT1JJVFlfU0hJRlQgNgorI2RlZmluZSBUWF9ETUFfUE9MTElOR19OT1JNUFJJT1JJVFlfU0hJRlQgNQorI2RlZmluZSBUWF9ETUFfUE9MTElOR19MT1dQUklPUklUWV9TSElGVCA0CisjZGVmaW5lIFRYX0RNQV9TVE9QX0JFQUNPTl9TSElGVCAzCisjZGVmaW5lIFRYX0RNQV9TVE9QX0hJUFJJT1JJVFlfU0hJRlQgMgorI2RlZmluZSBUWF9ETUFfU1RPUF9OT1JNUFJJT1JJVFlfU0hJRlQgMQorI2RlZmluZSBUWF9ETUFfU1RPUF9MT1dQUklPUklUWV9TSElGVCAwCisjZGVmaW5lIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUiAweDBDCisjZGVmaW5lIFRYX0JLUFJJT1JJVFlfUklOR19BRERSIDB4MTAKKyNkZWZpbmUgVFhfQkVQUklPUklUWV9SSU5HX0FERFIgMHgxNAorI2RlZmluZSBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUiAweDIwCisjZGVmaW5lIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSIDB4MjQKKyNkZWZpbmUgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUiAweDI4CisvL0FDX1ZJIGFuZCBMb3cgcHJpb3JpdHkgc2hhcmUgdGhlIHNhbmUgcXVldWUKKyNkZWZpbmUgVFhfTE9XUFJJT1JJVFlfUklOR19BRERSIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSCisvL0FDX1ZPIGFuZCBOb3JtIHByaW9yaXR5IHNoYXJlIHRoZSBzYW1lIHF1ZXVlCisjZGVmaW5lIFRYX05PUk1QUklPUklUWV9SSU5HX0FERFIgVFhfVk9QUklPUklUWV9SSU5HX0FERFIKKworI2RlZmluZSBNQVhfUlhfRE1BX01BU0sgKCgxPDw4KSB8ICgxPDw5KSB8ICgxPDwxMCkpCisjZGVmaW5lIE1BWF9SWF9ETUFfMjA0OCA3CisjZGVmaW5lIE1BWF9SWF9ETUFfMTAyNAk2CisjZGVmaW5lIE1BWF9SWF9ETUFfU0hJRlQgMTAKKyNkZWZpbmUgSU5UX1RJTUVPVVQgMHg0OAorI2RlZmluZSBDT05GSUczX0NMS1JVTl9TSElGVCAyCisjZGVmaW5lIENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCA2CisjZGVmaW5lIEFOQVBBUkFNIDB4NTQKKyNkZWZpbmUgQkVBQ09OX0lOVEVSVkFMIDB4NzAKKyNkZWZpbmUgQkVBQ09OX0lOVEVSVkFMX01BU0sgKCgxPDwwKXwoMTw8MSl8KDE8PDIpfCgxPDwzKXwoMTw8NCl8KDE8PDUpfCBcCisoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSkpCisjZGVmaW5lIEFUSU1fTUFTSyAoKDE8PDApfCgxPDwxKXwoMTw8Mil8KDE8PDMpfCgxPDw0KXwoMTw8NSl8KDE8PDYpfCgxPDw3KXwgXAorKDE8PDgpfCgxPDw5KSkKKyNkZWZpbmUgQVRJTSAweDcyCisjZGVmaW5lIEVQUk9NX0NTX1NISUZUIDMKKyNkZWZpbmUgRVBST01fQ0tfU0hJRlQgMgorI2RlZmluZSBQSFlfREVMQVkgMHg3OAorI2RlZmluZSBQSFlfQ09ORklHIDB4ODAKKyNkZWZpbmUgUEhZX0FEUiAweDdjCisjZGVmaW5lIFBIWV9SRUFEIDB4N2UKKyNkZWZpbmUgQ0FSUklFUl9TRU5TRV9DT1VOVEVSIDB4NzkgLy9ieXRlCisjZGVmaW5lIFNFQ1VSSVRZIDB4NWYgLy8xMjA5IHRoaXMgaXMgc3RoIHdyb25nCisjZGVmaW5lIFNFQ1VSSVRZX1dFUF9UWF9FTkFCTEVfU0hJRlQgMQorI2RlZmluZSBTRUNVUklUWV9XRVBfUlhfRU5BQkxFX1NISUZUIDAKKyNkZWZpbmUgU0VDVVJJVFlfRU5DUllQXzEwNCAxCisjZGVmaW5lIFNFQ1VSSVRZX0VOQ1JZUF9TSElGVCA0CisjZGVmaW5lIFNFQ1VSSVRZX0VOQ1JZUF9NQVNLICgoMTw8NCl8KDE8PDUpKQorI2RlZmluZSBLRVkwIDB4OTAgIC8vMTIwOSB0aGlzIGlzIHN0aCB3cm9uZworI2RlZmluZSBDT05GSUcyX0FOVEVOTkFfU0hJRlQgNgorI2RlZmluZSBUWF9CRUFDT05fUklOR19BRERSIDB4NGMKKyNkZWZpbmUgQ09ORklHMF9XRVA0MF9TSElGVCA3CisjZGVmaW5lIENPTkZJRzBfV0VQMTA0X1NISUZUIDYKKyNkZWZpbmUgQUdDUkVTRVRfU0hJRlQgNQorCisKKworLyoKKyAqIE9wZXJhdGlvbmFsIHJlZ2lzdGVycyBvZmZzZXRzIGluIFBDSSAoSS9PKSBzcGFjZS4KKyAqIFJlYWxUZWsgbmFtZXMgYXJlIHVzZWQuCisgKi8KKworI2RlZmluZSBJRFIwIDB4MDAwMAorI2RlZmluZSBJRFIxIDB4MDAwMQorI2RlZmluZSBJRFIyIDB4MDAwMgorI2RlZmluZSBJRFIzIDB4MDAwMworI2RlZmluZSBJRFI0IDB4MDAwNAorI2RlZmluZSBJRFI1IDB4MDAwNQorCisvKiAweDAwMDYgLSAweDAwMDcgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIE1BUjAgMHgwMDA4CisjZGVmaW5lIE1BUjEgMHgwMDA5CisjZGVmaW5lIE1BUjIgMHgwMDBBCisjZGVmaW5lIE1BUjMgMHgwMDBCCisjZGVmaW5lIE1BUjQgMHgwMDBDCisjZGVmaW5lIE1BUjUgMHgwMDBECisjZGVmaW5lIE1BUjYgMHgwMDBFCisjZGVmaW5lIE1BUjcgMHgwMDBGCisKKy8qIDB4MDAxMCAtIDB4MDAxNyAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgVFNGVFIgMHgwMDE4CisjZGVmaW5lIFRTRlRSX0VORCAweDAwMUYKKworI2RlZmluZSBUTFBEQSAweDAwMjAKKyNkZWZpbmUgVExQREFfRU5EIDB4MDAyMworI2RlZmluZSBUTlBEQSAweDAwMjQKKyNkZWZpbmUgVE5QREFfRU5EIDB4MDAyNworI2RlZmluZSBUSFBEQSAweDAwMjgKKyNkZWZpbmUgVEhQREFfRU5EIDB4MDAyQgorCisjZGVmaW5lIEJTU0lEIDB4MDAyRQorI2RlZmluZSBCU1NJRF9FTkQgMHgwMDMzCisKKyNkZWZpbmUgQ1IgMHgwMDM3CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgUkZfU1dfQ09ORklHCSAgICAgICAgMHg4CQkJLy8gc3RvcmUgZGF0YSB3aGljaCBpcyB0cmFuc21pdHRlZCB0byBSRiBmb3IgZHJpdmVyCisjZGVmaW5lIFJGX1NXX0NGR19TSQkJQklUMQorI2RlZmluZSBQSUZTCQkJMHgyQwkJCS8vIFBDRiBJbnRlckZyYW1lIFNwYWNpbmcgVGltZXIgU2V0dGluZy4KKyNkZWZpbmUgRUlGUwkJCTB4MkQJCQkvLyBFeHRlbmRlZCBJbnRlckZyYW1lIFNwYWNlIFRpbWVyLCBpbiB1bml0IG9mIDQgdXMuCisKKyNkZWZpbmUgQlJTUgkJCTB4MzQJCQkvLyBCYXNpYyByYXRlIHNldAorCisjZGVmaW5lIElNUiAweDAwNkMKKyNkZWZpbmUgSVNSIDB4MDAzQworI2Vsc2UKKyNkZWZpbmUgQlJTUiAweDAwMkMKKyNkZWZpbmUgQlJTUl9FTkQgMHgwMDJECisKKy8qIDB4MDAzNCAtIDB4MDAzNCAtIHJlc2VydmVkICovCisjZGVmaW5lIEVJRlMgMHgwMDM1CisKKyNkZWZpbmUgSU1SIDB4MDAzQworI2RlZmluZSBJTVJfRU5EIDB4MDAzRAorI2RlZmluZSBJU1IgMHgwMDNFCisjZGVmaW5lIElTUl9FTkQgMHgwMDNGCisjZW5kaWYKKworI2RlZmluZSBUQ1IgMHgwMDQwCisjZGVmaW5lIFRDUl9FTkQgMHgwMDQzCisKKyNkZWZpbmUgUkNSIDB4MDA0NAorI2RlZmluZSBSQ1JfRU5EIDB4MDA0NworCisjZGVmaW5lIFRpbWVySW50IDB4MDA0OAorI2RlZmluZSBUaW1lckludF9FTkQgMHgwMDRCCisKKyNkZWZpbmUgVEJEQSAweDAwNEMKKyNkZWZpbmUgVEJEQV9FTkQgMHgwMDRGCisKKyNkZWZpbmUgQ1I5MzQ2IDB4MDA1MAorCisjZGVmaW5lIENPTkZJRzAgMHgwMDUxCisjZGVmaW5lIENPTkZJRzEgMHgwMDUyCisjZGVmaW5lIENPTkZJRzIgMHgwMDUzCisKKyNkZWZpbmUgQU5BX1BBUk0gMHgwMDU0CisjZGVmaW5lIEFOQV9QQVJNX0VORCAweDB4MDA1NworCisjZGVmaW5lIE1TUiAweDAwNTgKKworI2RlZmluZSBDT05GSUczIDB4MDA1OQorI2RlZmluZSBDT05GSUc0IDB4MDA1QQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBTRDMgc3p1eWl0YXNpOiBNYWMweDU3PSBDQyAtPiBCMCBNYWMweDYwPSBEMSAtPiBDNgorCS8vIE1hYzB4NjAgPSAweDAwMDAwNEM2IHBvd2VyIHNhdmUgcGFyYW1ldGVycworCSNkZWZpbmUgQU5BUEFSTV9BU0lDX09OICAgIDB4QjAwNTREMDAKKwkjZGVmaW5lIEFOQVBBUk0yX0FTSUNfT04gIDB4MDAwMDA0QzYKKworCSNkZWZpbmUgQU5BUEFSTV9PTiBBTkFQQVJNX0FTSUNfT04KKwkjZGVmaW5lIEFOQVBBUk0yX09OIEFOQVBBUk0yX0FTSUNfT04KKyNlbHNlCisJLy8gU0QzIENNTGluOgorCSNkZWZpbmUgQU5BUEFSTV9BU0lDX09OICAgIDB4NDUwOTA2NTgKKwkjZGVmaW5lIEFOQVBBUk0yX0FTSUNfT04gIDB4NzI3ZjNmNTIKKworCSNkZWZpbmUgQU5BUEFSTV9PTiBBTkFQQVJNX0FTSUNfT04KKwkjZGVmaW5lIEFOQVBBUk0yX09OIEFOQVBBUk0yX0FTSUNfT04KKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVEVTVFIgMHgwMDVCCisKKy8qIDB4MDA1QyAtIDB4MDA1RCAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgUFNSIDB4MDA1RQorCisvKiAweDAwNjAgLSAweDAwNkYgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIEJjbkl0diAweDAwNzAKKyNkZWZpbmUgQmNuSXR2X0VORCAweDAwNzEKKworI2RlZmluZSBBdGltV25kIDB4MDA3MgorI2RlZmluZSBBdGltV25kX0VORCAweDAwNzMKKworI2RlZmluZSBCaW50ckl0diAweDAwNzQKKyNkZWZpbmUgQmludHJJdHZfRU5EIDB4MDA3NQorCisjZGVmaW5lIEF0aW10ckl0diAweDAwNzYKKyNkZWZpbmUgQXRpbXRySXR2X0VORCAweDAwNzcKKworI2RlZmluZSBQaHlEZWxheSAweDAwNzgKKworI2RlZmluZSBDUkNvdW50IDB4MDA3OQorCisvKiAweDAwN0EgLSAweDAwN0IgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIFBoeUFkZHIgMHgwMDdDCisjZGVmaW5lIFBoeURhdGFXIDB4MDA3RAorI2RlZmluZSBQaHlEYXRhUiAweDAwN0UKKworI2RlZmluZSBQaHlDRkcgMHgwMDgwCisjZGVmaW5lIFBoeUNGR19FTkQgMHgwMDgzCisKKy8qIGZvbGxvd2luZyBhcmUgZm9yIHJ0bDgxODUgKi8KKyNkZWZpbmUgUkZQaW5zT3V0cHV0IDB4ODAKKyNkZWZpbmUgUkZQaW5zRW5hYmxlIDB4ODIKKyNkZWZpbmUgUkZfVElNSU5HIDB4OGMKKyNkZWZpbmUgUkZQaW5zU2VsZWN0IDB4ODQKKyNkZWZpbmUgQU5BUEFSQU0yIDB4NjAKKyNkZWZpbmUgUkZfUEFSQSAweDg4CisjZGVmaW5lIFJGUGluc0lucHV0IDB4ODYKKyNkZWZpbmUgR1BfRU5BQkxFIDB4OTAKKyNkZWZpbmUgR1BJTyAweDkxCisjZGVmaW5lIFNXX0NPTlRST0xfR1BJTyAweDQwMAorI2RlZmluZSBUWF9BTlRFTk5BIDB4OWYKKyNkZWZpbmUgVFhfR0FJTl9PRkRNIDB4OWUKKyNkZWZpbmUgVFhfR0FJTl9DQ0sgMHg5ZAorI2RlZmluZSBXUEFfQ09ORklHIDB4YjAKKyNkZWZpbmUgVFhfQUdDX0NUTCAweDljCisjZGVmaW5lIFRYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQgMAorI2RlZmluZSBUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9BTlRTRUxfU0hJRlQgMQorI2RlZmluZSBUWF9BR0NfQ1RMX0ZFRURCQUNLX0FOVCAyCisjZGVmaW5lIFJFU1BfUkFURSAweDM0CisjZGVmaW5lIFNJRlMgMHhiNAorI2RlZmluZSBESUZTIDB4YjUKKworI2RlZmluZSBTTE9UIDB4YjYKKyNkZWZpbmUgQ1dfQ09ORiAweGJjCisjZGVmaW5lIENXX0NPTkZfUEVSUEFDS0VUX1JFVFJZX1NISUZUIDEKKyNkZWZpbmUgQ1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQgMAorI2RlZmluZSBDV19WQUwgMHhiZAorI2RlZmluZSBNQVhfUkVTUF9SQVRFX1NISUZUIDQKKyNkZWZpbmUgTUlOX1JFU1BfUkFURV9TSElGVCAwCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0sgMHhiZQorLyoKKyAqICAweDAwODQgLSAweDAwRDMgaXMgc2VsZWN0ZWQgdG8gcGFnZSAxIHdoZW4gUFNFbiBiaXQgKGJpdDAsIFBTUikKKyAqICBpcyBzZXQgdG8gMQorICovCisKKyNkZWZpbmUgV2FrZXVwMCAweDAwODQKKyNkZWZpbmUgV2FrZXVwMF9FTkQgMHgwMDhCCisKKyNkZWZpbmUgV2FrZXVwMSAweDAwOEMKKyNkZWZpbmUgV2FrZXVwMV9FTkQgMHgwMDkzCisKKyNkZWZpbmUgV2FrZXVwMkxEIDB4MDA5NAorI2RlZmluZSBXYWtldXAyTERfRU5EIDB4MDA5QgorI2RlZmluZSBXYWtldXAySEQgMHgwMDlDCisjZGVmaW5lIFdha2V1cDJIRF9FTkQgMHgwMEEzCisKKyNkZWZpbmUgV2FrZXVwM0xEIDB4MDBBNAorI2RlZmluZSBXYWtldXAzTERfRU5EIDB4MDBBQgorI2RlZmluZSBXYWtldXAzSEQgMHgwMEFDCisjZGVmaW5lIFdha2V1cDNIRF9FTkQgMHgwMEIzCisKKyNkZWZpbmUgV2FrZXVwNExEIDB4MDBCNAorI2RlZmluZSBXYWtldXA0TERfRU5EIDB4MDBCQgorI2RlZmluZSBXYWtldXA0SEQgMHgwMEJDCisjZGVmaW5lIFdha2V1cDRIRF9FTkQgMHgwMEMzCisKKyNkZWZpbmUgQ1JDMCAweDAwQzQKKyNkZWZpbmUgQ1JDMF9FTkQgMHgwMEM1CisjZGVmaW5lIENSQzEgMHgwMEM2CisjZGVmaW5lIENSQzFfRU5EIDB4MDBDNworI2RlZmluZSBDUkMyIDB4MDBDOAorI2RlZmluZSBDUkMyX0VORCAweDAwQzkKKyNkZWZpbmUgQ1JDMyAweDAwQ0EKKyNkZWZpbmUgQ1JDM19FTkQgMHgwMENCCisjZGVmaW5lIENSQzQgMHgwMENDCisjZGVmaW5lIENSQzRfRU5EIDB4MDBDRAorCisvKiAweDAwQ0UgLSAweDAwRDMgLSByZXNlcnZlZCAqLworCisKKworLyoKKyAqICAweDAwODQgLSAweDAwRDMgaXMgc2VsZWN0ZWQgdG8gcGFnZSAwIHdoZW4gUFNFbiBiaXQgKGJpdDAsIFBTUikKKyAqICBpcyBzZXQgdG8gMAorICovCisKKy8qIDB4MDA4NCAtIDB4MDA4RiAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgREswIDB4MDA5MAorI2RlZmluZSBESzBfRU5EIDB4MDA5RgorI2RlZmluZSBESzEgMHgwMEEwCisjZGVmaW5lIERLMV9FTkQgMHgwMEFGCisjZGVmaW5lIERLMiAweDAwQjAKKyNkZWZpbmUgREsyX0VORCAweDAwQkYKKyNkZWZpbmUgREszIDB4MDBDMAorI2RlZmluZSBESzNfRU5EIDB4MDBDRgorCisvKiAweDAwRDAgLSAweDAwRDMgLSByZXNlcnZlZCAqLworCisKKworCisKKy8qIDB4MDBENCAtIDB4MDBENyAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgQ09ORklHNSAweDAwRDgKKworI2RlZmluZSBUUFBvbGwgMHgwMEQ5CisKKy8qIDB4MDBEQSAtIDB4MDBEQiAtIHJlc2VydmVkICovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZGVmaW5lIFBIWVBSCQkJMHhEQQkJCS8vMHhEQSAtIDB4MEIgUEhZIFBhcmFtZXRlciBSZWdpc3Rlci4KKyNlbmRpZgorCisjZGVmaW5lIENXUiAweDAwREMKKyNkZWZpbmUgQ1dSX0VORCAweDAwREQKKworI2RlZmluZSBSZXRyeUNUUiAweDAwREUKKworLyogMHgwMERGIC0gMHgwMEUzIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBSRFNBUiAweDAwRTQKKyNkZWZpbmUgUkRTQVJfRU5EIDB4MDBFNworCisvKiAweDAwRTggLSAweDAwRUYgLSByZXNlcnZlZCAqLworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgTEVEX0NPTlRST0wJCTB4RUQKKyNlbmRpZgorCisjZGVmaW5lIEZFUiAweDAwRjAKKyNkZWZpbmUgRkVSX0VORCAweDAwRjMKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBGRU1SCQkJMHgxRDQJLy8gRnVuY3Rpb24gRXZlbnQgTWFzayByZWdpc3RlcgorI2Vsc2UKKyNkZWZpbmUgRkVNUiAweDAwRjQKKyNkZWZpbmUgRkVNUl9FTkQgMHgwMEY3CisjZW5kaWYKKworI2RlZmluZSBGUFNSIDB4MDBGOAorI2RlZmluZSBGUFNSX0VORCAweDAwRkIKKworI2RlZmluZSBGRkVSIDB4MDBGQworI2RlZmluZSBGRkVSX0VORCAweDAwRkYKKworCisKKy8qCisgKiBCaXRtYXNrcyBmb3Igc3BlY2lmaWMgcmVnaXN0ZXIgZnVuY3Rpb25zLgorICogTmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcmVnaXN0ZXIgbmFtZSBhbmQgZnVuY3Rpb24gbmFtZS4KKyAqCisgKiA8UkVHSVNURVI+XzxGVU5DVElPTj5bPGJpdD5dCisgKgorICogdGhpcyBsZWFkcyB0byBzb21lIGF3a3dhcmQgbmFtZXMuLi4KKyAqLworCisjZGVmaW5lIEJSU1JfQlBMQ1AgICgoMTw8IDgpKQorI2RlZmluZSBCUlNSX01CUiAgICAoKDE8PCAxKXwoMTw8IDApKQorI2RlZmluZSBCUlNSX01CUl84MTg1ICgoMTw8IDExKXwoMTw8IDEwKXwoMTw8IDkpfCgxPDwgOCl8KDE8PCA3KXwoMTw8IDYpfCgxPDwgNSl8KDE8PCA0KXwoMTw8IDMpfCgxPDwgMil8KDE8PCAxKXwoMTw8IDApKQorI2RlZmluZSBCUlNSX01CUjAgICAoKDE8PCAwKSkKKyNkZWZpbmUgQlJTUl9NQlIxICAgKCgxPDwgMSkpCisKKyNkZWZpbmUgQ1JfUlNUICAgICAgKCgxPDwgNCkpCisjZGVmaW5lIENSX1JFICAgICAgICgoMTw8IDMpKQorI2RlZmluZSBDUl9URSAgICAgICAoKDE8PCAyKSkKKyNkZWZpbmUgQ1JfTXVsUlcgICAgKCgxPDwgMCkpCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgSU1SX0RvdDExaEludAkoKDE8PCAyNSkpCQkJLy8gODAyLjExaCBNZWFzdXJlbWVudCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX0JjbkRtYUludAkoKDE8PCAyNCkpCQkJLy8gQmVhY29uIERNQSBJbnRlcnJ1cHQgLy8gV2hhdCBkaWZmZXJlbmN0IGJldHdlZW4gQmNuRG1hSW50IGFuZCBCY25JbnQ/Pz8KKyNkZWZpbmUgSU1SX1dha2VJbnQJCSgoMTw8IDIzKSkJCQkvLyBXYWtlIFVwIEludGVycnVwdAorI2RlZmluZSBJTVJfVFhGT1ZXCQkoKDE8PCAyMikpCQkJLy8gVHggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RpbWVPdXQxCSgoMTw8IDIxKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMQorI2RlZmluZSBJTVJfQmNuSW50CQkoKDE8PCAyMCkpCQkJLy8gQmVhY29uIFRpbWUgb3V0IEludGVycnVwdAorI2RlZmluZSBJTVJfQVRJTUludAkJKCgxPDwgMTkpKQkJCS8vIEFUSU0gVGltZSBPdXQgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQkRFUgkJKCgxPDwgMTgpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJET0sJCSgoMTw8IDE3KSkJCQkvLyBUeCBCZWFjb24gRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RIUERFUgkJKCgxPDwgMTYpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RIUERPSwkJKCgxPDwgMTUpKQkJCS8vIFR4IEhpZ2ggUHJpb3JpdHkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWT0RFUgkJKCgxPDwgMTQpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UVk9ET0sJCSgoMTw8IDEzKSkJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfRk9WVwkJKCgxPDwgMTIpKQkJCS8vIFJ4IEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisjZGVmaW5lIElNUl9SRFUJCQkoKDE8PCAxMSkpCQkJLy8gUnggRGVzY3JpcHRvciBVbmF2YWlsYWJsZSBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RWSURFUgkJKCgxPDwgMTApKQkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UVklET0sJCSgoMTw8IDkpKQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JFUgkJCSgoMTw8IDgpKQkJLy8gUnggRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9ST0sJCQkoKDE8PCA3KSkJCS8vIFJlY2VpdmUgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQkVERVIJCSgoMTw8IDYpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQkVET0sJCSgoMTw8IDUpKQkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQktERVIJCSgoMTw8IDQpKQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCS0RPSwkJKCgxPDwgMykpCQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1JRb1NPSwkJKCgxPDwgMikpCQkvLyBSeCBRb1MgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UaW1lT3V0MgkoKDE8PCAxKSkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAyCisjZGVmaW5lIElNUl9UaW1lT3V0MwkoKDE8PCAwKSkJCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMworI2RlZmluZSBJTVJfVE1HRE9LICAgICAgKCgxPDwzMCkpCisjZGVmaW5lIElTUl9Eb3QxMWhJbnQJKCgxPDwgMjUpKQkJCS8vIDgwMi4xMWggTWVhc3VyZW1lbnQgSW50ZXJydXB0CisjZGVmaW5lIElTUl9CY25EbWFJbnQJKCgxPDwgMjQpKQkJCS8vIEJlYWNvbiBETUEgSW50ZXJydXB0IC8vIFdoYXQgZGlmZmVyZW5jdCBiZXR3ZWVuIEJjbkRtYUludCBhbmQgQmNuSW50Pz8/CisjZGVmaW5lIElTUl9XYWtlSW50CQkoKDE8PCAyMykpCQkJLy8gV2FrZSBVcCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RYRk9WVwkJKCgxPDwgMjIpKQkJCS8vIFR4IEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UaW1lT3V0MQkoKDE8PCAyMSkpCQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDEKKyNkZWZpbmUgSVNSX0JjbkludAkJKCgxPDwgMjApKQkJCS8vIEJlYWNvbiBUaW1lIG91dCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX0FUSU1JbnQJCSgoMTw8IDE5KSkJCQkvLyBBVElNIFRpbWUgT3V0IEludGVycnVwdAorI2RlZmluZSBJU1JfVEJERVIJCSgoMTw8IDE4KSkJCQkvLyBUeCBCZWFjb24gRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCRE9LCQkoKDE8PCAxNykpCQkJLy8gVHggQmVhY29uIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9USFBERVIJCSgoMTw8IDE2KSkJCQkvLyBUeCBIaWdoIFByaW9yaXR5IERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9USFBET0sJCSgoMTw8IDE1KSkJCQkvLyBUeCBIaWdoIFByaW9yaXR5IERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVk9ERVIJCSgoMTw8IDE0KSkJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVFZPRE9LCQkoKDE8PCAxMykpCQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX0ZPVlcJCSgoMTw8IDEyKSkJCQkvLyBSeCBGSUZPIE92ZXJmbG93IEludGVycnVwdAorI2RlZmluZSBJU1JfUkRVCQkJKCgxPDwgMTEpKQkJCS8vIFJ4IERlc2NyaXB0b3IgVW5hdmFpbGFibGUgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UVklERVIJCSgoMTw8IDEwKSkJCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVFZJRE9LCQkoKDE8PCA5KSkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9SRVIJCQkoKDE8PCA4KSkJCS8vIFJ4IEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfUk9LCQkJKCgxPDwgNykpCQkvLyBSZWNlaXZlIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJFREVSCQkoKDE8PCA2KSkJCQkvLyBUeCBBQ19CRSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJFRE9LCQkoKDE8PCA1KSkJCQkvLyBUeCBBQ19CRSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJLREVSCQkoKDE8PCA0KSkJCS8vIFR4IEFDX0JLIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQktET0sJCSgoMTw8IDMpKQkJCS8vIFR4IEFDX0JLIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9SUW9TT0sJCSgoMTw8IDIpKQkJLy8gUnggUW9TIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfVGltZU91dDIJKCgxPDwgMSkpCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMgorI2RlZmluZSBJU1JfVGltZU91dDMJKCgxPDwgMCkpCQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDMKKworLy90aGVzZSBkZWZpbml0aW9uIGlzIHVzZWQgZm9yIFR4L1J4IHRlc3QgdGVtcG9yYXJpbHkKKyNkZWZpbmUgSVNSX1RMUERFUiAgSVNSX1RWSURFUgorI2RlZmluZSBJU1JfVExQRE9LICBJU1JfVFZJRE9LCisjZGVmaW5lIElTUl9UTlBERVIgIElTUl9UVk9ERVIKKyNkZWZpbmUgSVNSX1ROUERPSyAgSVNSX1RWT0RPSworI2RlZmluZSBJU1JfVGltZU91dCBJU1JfVGltZU91dDEKKyNkZWZpbmUgSVNSX1JYRk9WVyBJU1JfRk9WVworCisjZWxzZQorI2RlZmluZSBJTVJfVFhGT1ZXICAoKDE8PDE1KSkKKyNkZWZpbmUgSU1SX1RpbWVPdXQgKCgxPDwxNCkpCisjZGVmaW5lIElNUl9CY25JbnQgICgoMTw8MTMpKQorI2RlZmluZSBJTVJfQVRJTUludCAoKDE8PDEyKSkKKyNkZWZpbmUgSU1SX1RCREVSICAgKCgxPDwxMSkpCisjZGVmaW5lIElNUl9UQkRPSyAgICgoMTw8MTApKQorI2RlZmluZSBJTVJfVEhQREVSICAoKDE8PCA5KSkKKyNkZWZpbmUgSU1SX1RIUERPSyAgKCgxPDwgOCkpCisjZGVmaW5lIElNUl9UTlBERVIgICgoMTw8IDcpKQorI2RlZmluZSBJTVJfVE5QRE9LICAoKDE8PCA2KSkKKyNkZWZpbmUgSU1SX1JYRk9WVyAgKCgxPDwgNSkpCisjZGVmaW5lIElNUl9SRFUgICAgICgoMTw8IDQpKQorI2RlZmluZSBJTVJfVExQREVSICAoKDE8PCAzKSkKKyNkZWZpbmUgSU1SX1RMUERPSyAgKCgxPDwgMikpCisjZGVmaW5lIElNUl9SRVIgICAgICgoMTw8IDEpKQorI2RlZmluZSBJTVJfUk9LICAgICAoKDE8PCAwKSkKKworI2RlZmluZSBJU1JfVFhGT1ZXICAoKDE8PDE1KSkKKyNkZWZpbmUgSVNSX1RpbWVPdXQgKCgxPDwxNCkpCisjZGVmaW5lIElTUl9CY25JbnQgICgoMTw8MTMpKQorI2RlZmluZSBJU1JfQVRJTUludCAoKDE8PDEyKSkKKyNkZWZpbmUgSVNSX1RCREVSICAgKCgxPDwxMSkpCisjZGVmaW5lIElTUl9UQkRPSyAgICgoMTw8MTApKQorI2RlZmluZSBJU1JfVEhQREVSICAoKDE8PCA5KSkKKyNkZWZpbmUgSVNSX1RIUERPSyAgKCgxPDwgOCkpCisjZGVmaW5lIElTUl9UTlBERVIgICgoMTw8IDcpKQorI2RlZmluZSBJU1JfVE5QRE9LICAoKDE8PCA2KSkKKyNkZWZpbmUgSVNSX1JYRk9WVyAgKCgxPDwgNSkpCisjZGVmaW5lIElTUl9SRFUgICAgICgoMTw8IDQpKQorI2RlZmluZSBJU1JfVExQREVSICAoKDE8PCAzKSkKKyNkZWZpbmUgSVNSX1RMUERPSyAgKCgxPDwgMikpCisjZGVmaW5lIElTUl9SRVIgICAgICgoMTw8IDEpKQorI2RlZmluZSBJU1JfUk9LICAgICAoKDE8PCAwKSkKKyNlbmRpZgorCisjZGVmaW5lIEhXX1ZFUklEX1I4MTgwX0YgMworI2RlZmluZSBIV19WRVJJRF9SODE4MF9BQkNEIDIKKyNkZWZpbmUgSFdfVkVSSURfUjgxODVfQUJDIDQKKyNkZWZpbmUgSFdfVkVSSURfUjgxODVfRCA1CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjZGVmaW5lIEhXX1ZFUklEX1I4MTg1Ql9CIDYKKyNlbmRpZgorCisjZGVmaW5lIFRDUl9DV01JTiAgICgoMTw8MzEpKQorI2RlZmluZSBUQ1JfU1dTRVEgICAoKDE8PDMwKSkKKyNkZWZpbmUgVENSX0hXVkVSSURfTUFTSyAoKDE8PDI3KXwoMTw8MjYpfCgxPDwyNSkpCisjZGVmaW5lIFRDUl9IV1ZFUklEX1NISUZUIDI1CisjZGVmaW5lIFRDUl9TQVQgICAgICgoMTw8MjQpKQorI2RlZmluZSBUQ1JfUExDUF9MRU4gVENSX1NBVCAvLyBydGw4MTgwCisjZGVmaW5lIFRDUl9NWERNQV9NQVNLICAgKCgxPDwyMyl8KDE8PDIyKXwoMTw8MjEpKQorI2RlZmluZSBUQ1JfTVhETUFfMTAyNCA2CisjZGVmaW5lIFRDUl9NWERNQV8yMDQ4IDcKKyNkZWZpbmUgVENSX01YRE1BX1NISUZUICAyMQorI2RlZmluZSBUQ1JfRElTQ1cgICAoKDE8PDIwKSkKKyNkZWZpbmUgVENSX0lDViAgICAgKCgxPDwxOSkpCisjZGVmaW5lIFRDUl9MQksgICAgICgoMTw8MTgpfCgxPDwxNykpCisjZGVmaW5lIFRDUl9MQksxICAgICgoMTw8MTgpKQorI2RlZmluZSBUQ1JfTEJLMCAgICAoKDE8PDE3KSkKKyNkZWZpbmUgVENSX0NSQyAgICAgKCgxPDwxNikpCisjZGVmaW5lIFRDUl9EUFJFVFJZX01BU0sgICAoKDE8PDE1KXwoMTw8MTQpfCgxPDwxMyl8KDE8PDEyKXwoMTw8MTEpfCgxPDwxMCl8KDE8PDkpfCgxPDw4KSkKKyNkZWZpbmUgVENSX1JUU1JFVFJZX01BU0sgICAoKDE8PDApfCgxPDwxKXwoMTw8Mil8KDE8PDMpfCgxPDw0KXwoMTw8NSl8KDE8PDYpfCgxPDw3KSkKKyNkZWZpbmUgVENSX1BST0JFX05PVElNRVNUQU1QX1NISUZUIDI5IC8vcnRsODE4NQorCisjZGVmaW5lIFJDUl9PTkxZRVJMUEtUICgoMTw8MzEpKQorI2RlZmluZSBSQ1JfQ1NfU0hJRlQgICAyOQorI2RlZmluZSBSQ1JfQ1NfTUFTSyAgICAoKDE8PDMwKSB8ICgxPDwyOSkpCisjZGVmaW5lIFJDUl9FTk1BUlAgICAgICgoMTw8MjgpKQorI2RlZmluZSBSQ1JfQ0JTU0lEICAgICAoKDE8PDIzKSkKKyNkZWZpbmUgUkNSX0FQV1JNR1QgICAgKCgxPDwyMikpCisjZGVmaW5lIFJDUl9BREQzICAgICAgICgoMTw8MjEpKQorI2RlZmluZSBSQ1JfQU1GICAgICAgICAoKDE8PDIwKSkKKyNkZWZpbmUgUkNSX0FDRiAgICAgICAgKCgxPDwxOSkpCisjZGVmaW5lIFJDUl9BREYgICAgICAgICgoMTw8MTgpKQorI2RlZmluZSBSQ1JfUlhGVEggICAgICAoKDE8PDE1KXwoMTw8MTQpfCgxPDwxMykpCisjZGVmaW5lIFJDUl9SWEZUSDIgICAgICgoMTw8MTUpKQorI2RlZmluZSBSQ1JfUlhGVEgxICAgICAoKDE8PDE0KSkKKyNkZWZpbmUgUkNSX1JYRlRIMCAgICAgKCgxPDwxMykpCisjZGVmaW5lIFJDUl9BSUNWICAgICAgICgoMTw8MTIpKQorI2RlZmluZSBSQ1JfTVhETUEgICAgICAoKDE8PDEwKXwoMTw8IDkpfCgxPDwgOCkpCisjZGVmaW5lIFJDUl9NWERNQTIgICAgICgoMTw8MTApKQorI2RlZmluZSBSQ1JfTVhETUExICAgICAoKDE8PCA5KSkKKyNkZWZpbmUgUkNSX01YRE1BMCAgICAgKCgxPDwgOCkpCisjZGVmaW5lIFJDUl85MzU2U0VMICAgICgoMTw8IDYpKQorI2RlZmluZSBSQ1JfQUNSQzMyICAgICAoKDE8PCA1KSkKKyNkZWZpbmUgUkNSX0FCICAgICAgICAgKCgxPDwgMykpCisjZGVmaW5lIFJDUl9BTSAgICAgICAgICgoMTw8IDIpKQorI2RlZmluZSBSQ1JfQVBNICAgICAgICAoKDE8PCAxKSkKKyNkZWZpbmUgUkNSX0FBUCAgICAgICAgKCgxPDwgMCkpCisKKyNkZWZpbmUgQ1I5MzQ2X0VFTSAgICAgKCgxPDw3KXwoMTw8NikpCisjZGVmaW5lIENSOTM0Nl9FRU0xICAgICgoMTw8NykpCisjZGVmaW5lIENSOTM0Nl9FRU0wICAgICgoMTw8NikpCisjZGVmaW5lIENSOTM0Nl9FRUNTICAgICgoMTw8MykpCisjZGVmaW5lIENSOTM0Nl9FRVNLICAgICgoMTw8MikpCisjZGVmaW5lIENSOTM0Nl9FRUQxICAgICgoMTw8MSkpCisjZGVmaW5lIENSOTM0Nl9FRUQwICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHMF9XRVAxMDQgICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzBfTEVER1BPX0VuICAoKDE8PDQpKQorI2RlZmluZSBDT05GSUcwX0F1eF9TdGF0dXMgKCgxPDwzKSkKKyNkZWZpbmUgQ09ORklHMF9HTCAgICAgICAgICgoMTw8MSl8KDE8PDApKQorI2RlZmluZSBDT05GSUcwX0dMMSAgICAgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHMF9HTDAgICAgICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHMV9MRURTICAgICAgICgoMTw8Nyl8KDE8PDYpKQorI2RlZmluZSBDT05GSUcxX0xFRFMxICAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHMV9MRURTMCAgICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzFfTFdBQ1QgICAgICAoKDE8PDQpKQorI2RlZmluZSBDT05GSUcxX01FTU1BUCAgICAgKCgxPDwzKSkKKyNkZWZpbmUgQ09ORklHMV9JT01BUCAgICAgICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzFfVlBEICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUcxX1BNRW4gICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUcyX0xDSyAgICAgICAgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHMl9BTlQgICAgICAgICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzJfRFBTICAgICAgICAoKDE8PDMpKQorI2RlZmluZSBDT05GSUcyX1BBUEVfc2lnbiAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHMl9QQVBFX3RpbWUgICgoMTw8MSl8KDE8PDApKQorI2RlZmluZSBDT05GSUcyX1BBUEVfdGltZTEgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHMl9QQVBFX3RpbWUwICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHM19HTlRTZWwgICAgICgoMTw8NykpCisjZGVmaW5lIENPTkZJRzNfUEFSTV9FbiAgICAoKDE8PDYpKQorI2RlZmluZSBDT05GSUczX01hZ2ljICAgICAgKCgxPDw1KSkKKyNkZWZpbmUgQ09ORklHM19DYXJkQl9FbiAgICgoMTw8MykpCisjZGVmaW5lIENPTkZJRzNfQ0xLUlVOX0VuICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUczX0Z1bmNSZWdFbiAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHM19GQnRiRW4gICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHNF9WQ09QRE4gICAgICgoMTw8NykpCisjZGVmaW5lIENPTkZJRzRfUFdST0ZGICAgICAoKDE8PDYpKQorI2RlZmluZSBDT05GSUc0X1BXUk1HVCAgICAgKCgxPDw1KSkKKyNkZWZpbmUgQ09ORklHNF9MV1BNRSAgICAgICgoMTw8NCkpCisjZGVmaW5lIENPTkZJRzRfTFdQVE4gICAgICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUc0X1JGVFlQRSAgICAgKCgxPDwxKXwoMTw8MCkpCisjZGVmaW5lIENPTkZJRzRfUkZUWVBFMSAgICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUc0X1JGVFlQRTAgICAgKCgxPDwwKSkKKworI2RlZmluZSBDT05GSUc1X1RYX0ZJRk9fT0sgKCgxPDw3KSkKKyNkZWZpbmUgQ09ORklHNV9SWF9GSUZPX09LICgoMTw8NikpCisjZGVmaW5lIENPTkZJRzVfQ0FMT04gICAgICAoKDE8PDUpKQorI2RlZmluZSBDT05GSUc1X0VBQ1BJICAgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHNV9MQU5XYWtlICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzVfUE1FX1NUUyAgICAoKDE8PDApKQorCisjZGVmaW5lIE1TUl9MSU5LX01BU0sgICAgICAoKDE8PDIpfCgxPDwzKSkKKyNkZWZpbmUgTVNSX0xJTktfTUFOQUdFRCAgIDIKKyNkZWZpbmUgTVNSX0xJTktfTk9ORSAgICAgIDAKKyNkZWZpbmUgTVNSX0xJTktfU0hJRlQgICAgIDIKKyNkZWZpbmUgTVNSX0xJTktfQURIT0MgICAgIDEKKyNkZWZpbmUgTVNSX0xJTktfTUFTVEVSICAgIDMKKworI2RlZmluZSBQU1JfR1BPICAgICAgICAgICAgKCgxPDw3KSkKKyNkZWZpbmUgUFNSX0dQSSAgICAgICAgICAgICgoMTw8NikpCisjZGVmaW5lIFBTUl9MRURHUE8xICAgICAgICAoKDE8PDUpKQorI2RlZmluZSBQU1JfTEVER1BPMCAgICAgICAgKCgxPDw0KSkKKyNkZWZpbmUgUFNSX1VXRiAgICAgICAgICAgICgoMTw8MSkpCisjZGVmaW5lIFBTUl9QU0VuICAgICAgICAgICAoKDE8PDApKQorCisjZGVmaW5lIFNDUl9LTSAgICAgICAgICAgICAoKDE8PDUpfCgxPDw0KSkKKyNkZWZpbmUgU0NSX0tNMSAgICAgICAgICAgICgoMTw8NSkpCisjZGVmaW5lIFNDUl9LTTAgICAgICAgICAgICAoKDE8PDQpKQorI2RlZmluZSBTQ1JfVFhTRUNPTiAgICAgICAgKCgxPDwxKSkKKyNkZWZpbmUgU0NSX1JYU0VDT04gICAgICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQmNuSXR2X0Jjbkl0diAgICAgICgweDAxRkYpCisKKyNkZWZpbmUgQXRpbVduZF9BdGltV25kICAgICgweDAxRkYpCisKKyNkZWZpbmUgQmludHJJdHZfQmludHJJdHYgICgweDAxRkYpCisKKyNkZWZpbmUgQXRpbXRySXR2X0F0aW10ckl0diAoMHgwMUZGKQorCisjZGVmaW5lIFBoeURlbGF5X1BoeURlbGF5ICAoKDE8PDIpfCgxPDwxKXwoMTw8MCkpCisKKyNkZWZpbmUgVFBQb2xsX0JRICAgICgoMTw8NykpCisjZGVmaW5lIFRQUG9sbF9IUFEgICAoKDE8PDYpKQorI2RlZmluZSBUUFBvbGxfTlBRICAgKCgxPDw1KSkKKyNkZWZpbmUgVFBQb2xsX0xQUSAgICgoMTw8NCkpCisjZGVmaW5lIFRQUG9sbF9TQlEgICAoKDE8PDMpKQorI2RlZmluZSBUUFBvbGxfU0hQUSAgKCgxPDwyKSkKKyNkZWZpbmUgVFBQb2xsX1NOUFEgICgoMTw8MSkpCisjZGVmaW5lIFRQUG9sbF9TTFBRICAoKDE8PDApKQorCisjZGVmaW5lIENXUl9DVyAgICAgICAoMHgwMUZGKQorCisjZGVmaW5lIEZFUl9JTlRSICAgICAoKDE8PDE1KSkKKyNkZWZpbmUgRkVSX0dXQUtFICAgICgoMTw8IDQpKQorCisjZGVmaW5lIEZFTVJfSU5UUiAgICAoKDE8PDE1KSkKKyNkZWZpbmUgRkVNUl9XS1VQICAgICgoMTw8MTQpKQorI2RlZmluZSBGRU1SX0dXQUtFICAgKCgxPDwgNCkpCisKKyNkZWZpbmUgRlBTUl9JTlRSICAgICgoMTw8MTUpKQorI2RlZmluZSBGUFNSX0dXQUtFICAgKCgxPDwgNCkpCisKKyNkZWZpbmUgRkZFUl9JTlRSICAgICgoMTw8MTUpKQorI2RlZmluZSBGRkVSX0dXQUtFICAgKCgxPDwgNCkpCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKy8vIFRocmVlIHdpcmUgbW9kZS4KKyNkZWZpbmUgU1dfVEhSRUVfV0lSRQkJCTAKKyNkZWZpbmUgSFdfVEhSRUVfV0lSRQkJCTIKKy8vUlRMODE4N1MgYnkgYW15CisjZGVmaW5lIEhXX1RIUkVFX1dJUkVfUEkJCTUKKyNkZWZpbmUgSFdfVEhSRUVfV0lSRV9TSQkJNgorLy9ieSBhbXkKKyNkZWZpbmUgVENSX0xSTF9PRkZTRVQJCTAKKyNkZWZpbmUgVENSX1NSTF9PRkZTRVQJCTgKKyNkZWZpbmUgVENSX01YRE1BX09GRlNFVAkyMQorI2RlZmluZSBUQ1JfRElTUmVxUXNpemVfT0ZGU0VUCQkyOAorI2RlZmluZSBUQ1JfRHVyUHJvY01vZGVfT0ZGU0VUCQkzMAorCisjZGVmaW5lIFJDUl9NWERNQV9PRkZTRVQJCQkJOAorI2RlZmluZSBSQ1JfRklGT19PRkZTRVQJCQkJCTEzCisKKyNkZWZpbmUgVE1HRFMJCQkweDBDCQkJLy8gVHggTWFuYWdlbWVudCBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVEJLRFMJCQkweDEwCQkJLy8gVHggQUNfQksgRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFRCRURTCQkJMHgxNAkJCS8vIFR4IEFDX0JFIERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUTFBEUwkJCTB4MjAJCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVE5QRFMJCQkweDI0CQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFRIUERTCQkJMHgyOAkJCS8vIFR4IEhpZ24gUHJpb3JpdHkgRGVzY3JpcHRvciBBZGRyZXNzCisKKyNkZWZpbmUgVEJEUwkJCTB4NGMJCQkvLyBCZWFjb24gZGVzY3JpcHRvciBxdWV1ZSBzdGFydCBhZGRyZXNzCisKKyNkZWZpbmUgUkRTQQkJCTB4RTQJCQkvLyBSZWNlaXZlIGRlc2NyaXB0b3IgcXVldWUgc3RhcnQgYWRkcmVzcworCisjZGVmaW5lIEFja1RpbWVPdXRSZWcJMHg3OQkJLy8gQUNLIHRpbWVvdXQgcmVnaXN0ZXIsIGluIHVuaXQgb2YgNCB1cy4KKworI2RlZmluZSBSRlRpbWluZwkJCTB4OEMKKworI2RlZmluZSBUUFBvbGxTdG9wIAkJMHg5MworCisjZGVmaW5lIFRYQUdDX0NUTAkJMHg5QwkJCS8vIDxSSl9UT0RPXzgxODVCPiBUWF9BR0NfQ09OVFJPTCAoMHg5QyBzZWVtcyBiZSByZW1vdmVkIGF0IDgxODVCLCBzZWUgcDM3KS4KKyNkZWZpbmUgQ0NLX1RYQUdDCQkweDlECisjZGVmaW5lIE9GRE1fVFhBR0MJCTB4OUUKKyNkZWZpbmUgQU5UU0VMCQkJMHg5RgorCisjZGVmaW5lIEFDTV9DT05UUk9MICAgICAgICAgICAgIDB4MDBCRiAgICAgIC8vIEFDTSBDb250cm9sIFJlZ2lzdGUKKworI2RlZmluZSBSVEw4MTg1Ql9WRVJfUkVHICAgIDB4RTEKKworI2RlZmluZQlJbnRNaWcJCQkweEUyCQkJLy8gSW50ZXJydXB0IE1pZ3JhdGlvbiAoMHhFMiB+IDB4RTMpCisKKyNkZWZpbmUgVElEX0FDX01BUAkJMHhFOAkJCS8vIFRJRCB0byBBQyBNYXBwaW5nIFJlZ2lzdGVyCisKKyNkZWZpbmUgQU5BUEFSQU0zCQkweEVFCQkJLy8gPFJKX1RPRE9fODE4NUI+IEhvdyB0byB1c2UgaXQ/CisKKyNkZWZpbmUgQUNfVk9fUEFSQU0JCTB4RjAJCQkvLyBBQ19WTyBQYXJhbWV0ZXJzIFJlY29yZAorI2RlZmluZSBBQ19WSV9QQVJBTQkJMHhGNAkJCS8vIEFDX1ZJIFBhcmFtZXRlcnMgUmVjb3JkCisjZGVmaW5lIEFDX0JFX1BBUkFNCQkweEY4CQkJLy8gQUNfQkUgUGFyYW1ldGVycyBSZWNvcmQKKyNkZWZpbmUgQUNfQktfUEFSQU0JCTB4RkMJCQkvLyBBQ19CSyBQYXJhbWV0ZXJzIFJlY29yZAorCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2RlZmluZSBCY25UaW1pbmdBZGp1c3QJMHgxNkEJCQkvLyBCZWFjb24gVGltaW5nIEFkanVzdCBSZWdpc3Rlci4KKyNkZWZpbmUgR1BJT0N0cmwJCQkweDE2QgkJCS8vIEdQSU8gQ29udHJvbCBSZWdpc3Rlci4KKyNkZWZpbmUgUFNCeUdDCQkJMHgxODAJCQkvLyAweDE4MCAtIDB4MTgzIFBvd2VyIFNhdmluZyBieSBHYXRlZCBDbG9jay4KKyNlbmRpZgorI2RlZmluZSBBUkZSCQkJMHgxRTAJLy8gQXV0byBSYXRlIEZhbGxiYWNrIFJlZ2lzdGVyICgweDFlMCB+IDB4MWUyKQorCisjZGVmaW5lIFJGU1dfQ1RSTAkJCTB4MjcyCS8vIDB4MjcyLTB4MjczLgorI2RlZmluZSBTV18zV19EQjAJCQkweDI3NAkvLyBTb2Z0d2FyZSAzLXdpcmUgZGF0YSBidWZmZXIgYml0IDMxfjAuCisjZGVmaW5lIFNXXzNXX0RCMQkJCTB4Mjc4CS8vIFNvZnR3YXJlIDMtd2lyZSBkYXRhIGJ1ZmZlciBiaXQgNjN+MzIuCisjZGVmaW5lIFNXXzNXX0NNRDAJCQkweDI3QwkvLyBTb2Z0d2FyZSAzLXdpcmUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIuCisjZGVmaW5lIFNXXzNXX0NNRDEJCQkweDI3RAkvLyBTb2Z0d2FyZSAzLXdpcmUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIuCisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZGVmaW5lIFBJX0RBVEFfUkVBRAkJMFgzNjAJLy8gMHgzNjAgLSAweDM2MSAgUGFyYWxsZWwgSW50ZXJmYWNlIERhdGEgUmVnaXN0ZXIuCisjZGVmaW5lIFNJX0RBVEFfUkVBRAkJMHgzNjIJLy8gMHgzNjIgLSAweDM2MyAgU2VyaWFsIEludGVyZmFjZSBEYXRhIFJlZ2lzdGVyLgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4NUIgVFBQb2xsIGJpdHMgCQkJCShvZmZzZXQgMHhkOSwgMSBieXRlKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRQUE9MTF9CUQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFRQUE9MTF9IUFEJCQkoMHgwMSA8PCA2KQorI2RlZmluZSBUUFBPTExfQUNfVk9RCQkoMHgwMSA8PCA1KQorI2RlZmluZSBUUFBPTExfQUNfVklRCQkoMHgwMSA8PCA0KQorI2RlZmluZSBUUFBPTExfQUNfQkVRCQkoMHgwMSA8PCAzKQorI2RlZmluZSBUUFBPTExfQUNfQktRCQkoMHgwMSA8PCAyKQorI2RlZmluZSBUUFBPTExfQUNfTUdRCQkoMHgwMSA8PCAxKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODVCIFRQUG9sbFN0b3AgYml0cyAJCQkJKG9mZnNldCAweDkzLCAxIGJ5dGUpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVFBQT0xMU1RPUF9CUQkJCSgweDAxIDw8IDcpCisjZGVmaW5lIFRQUE9MTFNUT1BfSFBRCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19WT1EJCSgweDAxIDw8IDUpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfVklRCQkoMHgwMSA8PCA0KQorI2RlZmluZSBUUFBPTExTVE9QX0FDX0JFUQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19CS1EJCSgweDAxIDw8IDIpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfTUdRCQkoMHgwMSA8PCAxKQorCisKKyNkZWZpbmUgTVNSX0xJTktfRU5FRENBCSAgICgxPDw0KQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODdCIEFDX1hYX1BBUkFNIGJpdHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkJMTYKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQJCQkxMgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVAkJCTgKKyNkZWZpbmUgQUNfUEFSQU1fQUlGU19PRkZTRVQJCQkwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4N0IgQUNNX0NPTlRST0wgYml0cwkJCQkJCShPZmZzZXQgMHhCRiwgMSBCeXRlKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFZPUV9BQ01fRU4JCQkJKDB4MDEgPDwgNykgLy9CSVQ3CisjZGVmaW5lIFZJUV9BQ01fRU4JCQkJKDB4MDEgPDwgNikgLy9CSVQ2CisjZGVmaW5lIEJFUV9BQ01fRU4JCQkJKDB4MDEgPDwgNSkgLy9CSVQ1CisjZGVmaW5lIEFDTV9IV19FTgkJCQkoMHgwMSA8PCA0KSAvL0JJVDQKKyNkZWZpbmUgVFhPUFNFTAkJCQkJKDB4MDEgPDwgMykgLy9CSVQzCisjZGVmaW5lIFZPUV9BQ01fQ1RMCQkJCSgweDAxIDw8IDIpIC8vQklUMiAvLyBTZXQgdG8gMSB3aGVuIEFDX1ZPIHVzZWQgdGltZSByZWFjaGVzIG9yIGV4Y2VlZHMgdGhlIGFkbWl0dGVkIHRpbWUKKyNkZWZpbmUgVklRX0FDTV9DVEwJCQkJKDB4MDEgPDwgMSkgLy9CSVQxIC8vIFNldCB0byAxIHdoZW4gQUNfVkkgdXNlZCB0aW1lIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgYWRtaXR0ZWQgdGltZQorI2RlZmluZSBCRVFfQUNNX0NUTAkJCQkoMHgwMSA8PCAwKSAvL0JJVDAgLy8gU2V0IHRvIDEgd2hlbiBBQ19CRSB1c2VkIHRpbWUgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBhZG1pdHRlZCB0aW1lCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBTV18zV19DTUQgYml0cwkJCQkJKE9mZnNldCAweDI3Qy0weDI3RCwgMTZiaXQpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgU1dfM1dfQ01EMF9IT0xECQkoKDE8PCA3KSkKKyNkZWZpbmUgU1dfM1dfQ01EMV9SRQkJIAkoKDE8PCAwKSkgLy8gQklUOAorI2RlZmluZSBTV18zV19DTUQxX1dFCQkoKDE8PCAxKSkgLy8gQklUOQorI2RlZmluZSBTV18zV19DTUQxX0RPTkUJCSgoMTw8IDIpKSAvLyBCSVQxMAorCisjZGVmaW5lIEJCX0hPU1RfQkFOR19SVyAJKDE8PDMpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4NUIgUkFURV9GQUxMQkFDS19DVEwgYml0cwkJCQkoT2Zmc2V0IDB4QkUsIDhiaXQpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfRU5BQkxFCQkJCSgoMTw8IDcpKQorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9FTkFCTEVfUlRTQ1RTCQkoKDE8PCA2KSkKKy8vIEF1dG8gcmF0ZSBmYWxsYmFjayBwZXIgMl5uIHJldHJ5LgorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAwCTB4MDAKKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMQkweDAxCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDIJMHgwMgorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAzCTB4MDMKKworCisjZGVmaW5lIFJUTDgyMjV6Ml9BTkFQQVJBTV9PRkYJMHg1NTQ4MDY1OAorI2RlZmluZSBSVEw4MjI1ejJfQU5BUEFSQU0yX09GRgkweDcyMDAzZjcwCisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorI2RlZmluZSBSRl9DSEFOR0VfQllfU1cgQklUMzEKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXIEJJVDMwCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9QUyBCSVQyOQorI2RlZmluZSBSRl9DSEFOR0VfQllfSVBTIEJJVDI4CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgRUVQUk9NX1NXX1JFVkRfT0ZGU0VUIDB4M2YKKy8vIEJJVFs4LTldIGlzIGZvciBTVyBBbnRlbm5hIERpdmVyc2l0eS4gT25seSB0aGUgdmFsdWUgRUVQUk9NX1NXX0FEX0VOQUJMRSBtZWFucyBlbmFibGUsIG90aGVyIHZhbHVlcyBhcmUgZGlhYmxlLgorI2RlZmluZSBFRVBST01fU1dfQURfTUFTSwkJCTB4MDMwMAorI2RlZmluZSBFRVBST01fU1dfQURfRU5BQkxFCQkJMHgwMTAwCisKKy8vIEJJVFsxMC0xMV0gZGV0ZXJtaW5lIGlmIEFudGVubmEgMSBpcyB0aGUgRGVmYXVsdCBBbnRlbm5hLiBPbmx5IHRoZSB2YWx1ZSBFRVBST01fREVGX0FOVF8xIG1lYW5zIFRSVUUsIG90aGVyIHZhbHVlcyBhcmUgRkFMU0UuCisjZGVmaW5lIEVFUFJPTV9ERUZfQU5UX01BU0sJCQkweDBDMDAKKyNkZWZpbmUgRUVQUk9NX0RFRl9BTlRfMQkJCTB4MDQwMAorLy9ieSBhbXkgZm9yIGFudGVubmEKKy8ve2J5IGFteSAwODAzMTIKKy8vMHg3QywgMHg3RCBDcnlzdGFsIGNhbGlicmF0aW9uIGFuZCBUeCBQb3dlciB0cmFja2luZyBtZWNoYW5pc20uIEFkZGVkIGJ5IFJvZ2VyLiAyMDA3LjEyLjEwLgorI2RlZmluZSBFRVBST01fUlNWCQkJCQkJMHg3QworI2RlZmluZSBFRVBST01fWFRBTF9DQUxfTUFTSwkJCTB4MDBGRgkvLyAweDdDWzc6MF0sIENyeXN0YWwgY2FsaWJyYXRpb24gbWFzay4KKyNkZWZpbmUgRUVQUk9NX1hUQUxfQ0FMX1hPVVRfTUFTSwkweDBGCS8vIDB4N0NbMzowXSwgQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWG91dC4KKyNkZWZpbmUgRUVQUk9NX1hUQUxfQ0FMX1hJTl9NQVNLCQkweEYwCS8vIDB4N0NbNzo0XSwgQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluLgorI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUl9NQVNLCTB4MEYwMAkvLyAweDdEWzM6MF0sIFRoZXJtYWwgbWV0ZXIgcmVmZXJlbmNlIGxldmVsLgorI2RlZmluZSBFRVBST01fWFRBTF9DQUxfRU5BQkxFCQkweDEwMDAJLy8gMHg3RFs0XSwgQ3J5c3RhbCBjYWxpYnJhdGlvbiBlbmFibGVkL2Rpc2FibGVkIEJJVC4KKyNkZWZpbmUgRUVQUk9NX1RIRVJNQUxfTUVURVJfRU5BQkxFCTB4MjAwMAkvLyAweDdEWzVdLCBUaGVybWFsIG1ldGVyIGVuYWJsZWQvZGlzYWJsZWQgQklULgorI2RlZmluZSBFRVBST01fQ0lEX1JTVkQxCQkJCTB4M0YKKyNkZWZpbmUgRU5fTFBGX0NBTAkJCTB4MjM4CS8vIEVuYWJsZSBMUEYgQ2FsaWJyYXRpb24uCisjZGVmaW5lIFBXUl9NRVRFUl9FTgkJQklUMQorLy8gPFJKX1RPRE9fODE4NUI+IHdoZXJlIGFyZSBmYWxzZSBhbGFybSBjb3VudGVycyBpbiA4MTg1Qj8KKyNkZWZpbmUgQ0NLX0ZBTFNFX0FMQVJNCQkweEQwCisjZGVmaW5lIE9GRE1fRkFMU0VfQUxBUk0JMHhEMgorLy9ieSBhbXkgMDgwMzEyfQorCisvL1lKLGFkZCBmb3IgQ291bnRyeSBJRSwgMDgwNjMwCisjZGVmaW5lIEVFUFJPTV9DT1VOVFJZX0NPREUgIDB4MkUKKy8vWUosYWRkLDA4MDYzMCxlbmQKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMDg0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5jCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICAgVGhpcyBmaWxlcyBjb250YWlucyBNQVhJTSBNQVgyODIwIHJhZGlvIGZyb250ZW5kIHByb2dyYW1taW5nIHJvdXRpbmVzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBOZXRCU0QgcnRsODE4MCBkcml2ZXIgZnJvbSBEYXZlIFlvdW5nIGhhcyBiZWVuIHJlYWxseSB1c2VmdWwgdG8KKyAgIHVuZGVyc3RhbmQgaG93IHRvIHByb2dyYW0gdGhlIE1BWElNIHJhZGlvLiBUaGFua3MgYSBsb3QhISEKKworICAgJ1RoZSBEZXVjZScgdGVzdGVkIHRoaXMgYW5kIGZpeGVkIHNvbWUgYnVncy4KKworICAgQ29kZSBmcm9tIHJ0bDgxODEgcHJvamVjdCBoYXMgYmVlbiB1c2VmdWwgdG8gbWUgdG8gdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9tYXgyODIwLmgiCisKKworLy8jZGVmaW5lIERFQlVHX01BWElNCisKK3UzMiBtYXhpbV9jaGFuW10gPSB7CisJMCwJLy9kdW1teSBjaGFubmVsIDAKKwkxMiwgLy8xCisJMTcsIC8vMgorCTIyLCAvLzMKKwkyNywgLy80CisJMzIsIC8vNQorCTM3LCAvLzYKKwk0MiwgLy83CisJNDcsIC8vOAorCTUyLCAvLzkKKwk1NywgLy8xMAorCTYyLCAvLzExCisJNjcsIC8vMTIKKwk3MiwgLy8xMworCTg0LCAvLzE0Cit9OworCisjaWYgMAorLyogbWF4aW0gZXhwZWN0cyA0IGJpdCBhZGRyZXNzIE1TRiwgdGhlbiAxMiBiaXQgZGF0YSBNU0YqLwordm9pZCB3cml0ZV9tYXhpbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGFkciwgdTMyIGRhdGEpCit7CisKKwlpbnQgc2hpZnQ7CisJc2hvcnQgYml0OworCXUxNiB3b3JkOworCisJYWRyID0gYWRyICYweGY7CisJd29yZCA9ICh1MTYpZGF0YSAmIDB4ZmZmOworCXdvcmQgfD0gKGFkcjw8MTIpOworCS8qd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IEJCX0hPU1RfQkFOR19FTik7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgxKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCBCQl9IT1NUX0JBTkdfRU4gfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDEpOworCSovCisKKwkvKiBNQVgyODIwIHdpbGwgc2FtcGxlIGRhdGEgb24gcmlzaW5nIGVkZ2Ugb2YgY2xvY2sgKi8KKwlmb3Ioc2hpZnQgPSAxNTtzaGlmdCA+PTA7IHNoaWZ0LS0peworCQliaXQgPSB3b3JkPj5zaGlmdCAmIDE7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKSk7CisKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCQltZGVsYXkoMik7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8CisJCShiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKSB8IEJCX0hPU1RfQkFOR19DTEspOyAvKiBzYW1wbGUgZGF0YSAqLworCisJCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwkJbWRlbGF5KDEpOworCisJCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfAorCQkoYml0PDxCQl9IT1NUX0JBTkdfREFUQSkpOworCisJCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwkJbWRlbGF5KDIpOworCisJfQorCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCAoYml0PDxCQl9IT1NUX0JBTkdfREFUQSl8CisJCQkJCUJCX0hPU1RfQkFOR19FTik7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgyKTsKKworCS8qIFRoZSBzaGlmdCByZWdpc3RlciBmaWxsIGZsdXNoIHRvIHRoZSByZXF1ZXN0ZWQgcmVnaXN0ZXIgdGhlCisJICogbGFzdCAxMiBiaXRzIGRhdGEgc2hpZnRlZCBpbgorCSAqLworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCAoYml0PDxCQl9IT1NUX0JBTkdfREFUQSl8CisJCQkJCUJCX0hPU1RfQkFOR19FTiB8IEJCX0hPU1RfQkFOR19DTEspOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpfAorCQkJCQlCQl9IT1NUX0JBTkdfRU4pOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMik7CisKKworI2lmZGVmIERFQlVHX01BWElNCisJRE1FU0coIldyaXRpbmcgbWF4aW06ICV4IChhZHIgJXgpIixwaHlfY29uZmlnLGFkcik7CisjZW5kaWYKKworfQorI2VuZGlmCisKK3ZvaWQgd3JpdGVfbWF4aW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBhZHIsIHUzMiBkYXRhKSB7CisJdTMyIHRlbXA7CisJdGVtcCA9ICAweDkwICsgKGRhdGEgJiAweGYpOworCXRlbXAgPDw9IDE2OworCXRlbXAgKz0gYWRyOworCXRlbXAgPDw9IDg7CisJdGVtcCArPSAoZGF0YSA+PiA0KSAmIDB4ZmY7CisjaWZkZWYgREVCVUdfTUFYSU0KKwlETUVTRygid3JpdGVfbWF4aW06ICUwOHgiLCB0ZW1wKTsKKyNlbmRpZgorCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9DT05GSUcsIHRlbXApOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworfQorCisKK3ZvaWQgbWF4aW1fd3JpdGVfcGh5X2FudGVubmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYW50OworCisJYW50ID0gTUFYSU1fQU5URU5OQTsKKwlpZihwcml2LT5hbnRiKSAvKmRlZmF1bHQgYW50ZW5uYSBpcyBhbnRlbm5hIEIgKi8KKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKwlpZihjaCA9PSAxNCkKKwkJYW50IHw9IEJCX0FOVEFUVEVOX0NIQU4xNDsKKwl3cml0ZV9waHkoZGV2LDB4MTAsYW50KTsKKwkvL0RNRVNHKCJCQiBhbnRlbm5hICV4ICIsYW50KTsKK30KKworCit2b2lkIG1heGltX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdHhwdyA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1MzIgY2hhbiA9IG1heGltX2NoYW5bY2hdOworCisJLypXaGlsZSBwaGlsaXBzIFNBMjQwMCBkcml2ZSB0aGUgUEEgYmlhcworCSAqc2VlbXMgdGhhdCBmb3IgTUFYSU0gd2UgZGVsZWdhdGUgdGhpcworCSAqdG8gdGhlIEJCCisJICovCisKKwkvL3dyaXRlX21heGltKGRldiw1LHR4cHcpOworCXdyaXRlX3BoeShkZXYsMyx0eHB3KTsKKworCW1heGltX3dyaXRlX3BoeV9hbnRlbm5hKGRldixjaCk7CisJd3JpdGVfbWF4aW0oZGV2LDMsY2hhbik7Cit9CisKKwordm9pZCBtYXhpbV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3BoeShkZXYsIDMsIDB4OCk7CisJd3JpdGVfbWF4aW0oZGV2LCAxLCAwKTsKK30KKworCit2b2lkIG1heGltX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFuYXBhcmFtOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFBIWV9ERUxBWSwweDYpOwkvL3RoaXMgaXMgZ2VuZXJhbAorCXdyaXRlX25pY19ieXRlKGRldixDQVJSSUVSX1NFTlNFX0NPVU5URVIsMHg0Yyk7IC8vdGhpcyBpcyBnZW5lcmFsCisKKwkvKnRoZXNlIGFyZSBtYXhpbSBzcGVjaWZpYyovCisJYW5hcGFyYW0gPSByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn4gKEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUKTsKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+QU5BUEFSQU1fUFdSMV9NQVNLOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IwX01BU0s7CisJYW5hcGFyYW0gfD0gKE1BWElNX0FOQVBBUkFNX1BXUjFfT048PEFOQVBBUkFNX1BXUjFfU0hJRlQpOworCWFuYXBhcmFtIHw9IChNQVhJTV9BTkFQQVJBTV9QV1IwX09OPDxBTkFQQVJBTV9QV1IwX1NISUZUKTsKKworCS8vcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKworCS8qIE1BWElNIGZyb20gbmV0YnNkIGRyaXZlciAqLworCisJd3JpdGVfbWF4aW0oZGV2LDAsIDcpOyAvKiB0ZXN0IG1vZGUgYXMgaW5kaWNhdGVkIGluIGRhdGFzaGVldCovCisJd3JpdGVfbWF4aW0oZGV2LDEsIDB4MWUpOyAvKiBlbmFibGUgcmVnaXN0ZXIqLworCXdyaXRlX21heGltKGRldiwyLCAxKTsgLyogc3ludCByZWdpc3RlciAqLworCisKKwltYXhpbV9yZl9zZXRfY2hhbihkZXYscHJpdi0+Y2hhbik7CisKKwl3cml0ZV9tYXhpbShkZXYsNCwgMHgzMTMpOyAvKiByeCByZWdpc3RlciovCisKKwkvKiBQQSBpcyBkcml2ZW4gZGlyZWN0bHkgYnkgdGhlIEJCLCB3ZSBrZWVwIHRoZSBNQVhJTSBiaWFzCisJICogYXQgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGJvdWJ0IHRoYSBwbGVhY2luZyBpdCB0byBsb3dlcgorCSAqIHZhbHVlcyBtYXkgaW50cm9kdWNlIHNvbWUgZnVydGhlciBhdHRlbnVhdGlvbiBzb21ld2hlcmUuLgorCSAqLworCisJd3JpdGVfbWF4aW0oZGV2LDUsIDB4Zik7CisKKworCS8qYmFzZWJhbmQgY29uZmlndXJhdGlvbiovCisJd3JpdGVfcGh5KGRldiwwLDB4ODgpOyAvL3N5czEKKwl3cml0ZV9waHkoZGV2LDMsMHg4KTsgLy90eGFnYworCXdyaXRlX3BoeShkZXYsNCwweGY4KTsgLy8gbG5hZGV0CisJd3JpdGVfcGh5KGRldiw1LDB4OTApOyAvLyBpZmFnY2luaXQKKwl3cml0ZV9waHkoZGV2LDYsMHgxYSk7IC8vIGlmYWdjbGltaXQKKwl3cml0ZV9waHkoZGV2LDcsMHg2NCk7IC8vIGlmYWdjZGV0CisKKwkvKlNob3VsZCBiZSBkb25lIHNvbWV0aGluZyBtb3JlIGhlcmU/PyovCisKKwltYXhpbV93cml0ZV9waHlfYW50ZW5uYShkZXYscHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHkoZGV2LDB4MTEsMHg4OCk7IC8vdHJsCisJaWYocHJpdi0+ZGl2ZXJzaXR5KQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHhjNyk7CisJZWxzZQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHg0Nyk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTMsMHg5Yik7CisKKwl3cml0ZV9waHkoZGV2LDB4MTksMHgwKTsgLy9DSEVTVExJTQorCXdyaXRlX3BoeShkZXYsMHgxYSwweDlmKTsgLy9DSFNRTElNCisKKwltYXhpbV9yZl9zZXRfY2hhbihkZXYscHJpdi0+Y2hhbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNGZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuaApAQCAtMCwwICsxLDIxIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2RlZmluZSBNQVhJTV9BTlRFTk5BIDB4YjMKKyNkZWZpbmUgTUFYSU1fQU5BUEFSQU1fUFdSMV9PTiAweDgKKyNkZWZpbmUgTUFYSU1fQU5BUEFSQU1fUFdSMF9PTiAweDAKKworCit2b2lkIG1heGltX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIG1heGltX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworCit2b2lkIG1heGltX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTFiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAgIFBvd2VyIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHJvdXRpbmVzLgorICAgV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorICAgVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIGxhdGVyIHdvcmsgYW5kCisgICBkb2VzIG5vdCBkbyBhbnl0aGluZyB1c2VmdWwuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisKKworI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcG0uaCIKKyNpbmNsdWRlICJyODE4MC5oIgorCitpbnQgcnRsODE4MF9zYXZlX3N0YXRlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUpCit7CisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAicjgxODAgc2F2ZSBzdGF0ZSBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCitpbnQgcnRsODE4MF9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXRfcGNpX3N1c3BlbmQ7CisKKwlkZXYtPnN0b3AoZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworb3V0X3BjaV9zdXNwZW5kOgorCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYscGNpX2Nob29zZV9zdGF0ZShwZGV2LHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydGw4MTgwX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCXUzMiB2YWw7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZihlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCisJCXJldHVybiBlcnI7CisJfQorCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCS8qCisJICogU3VzcGVuZC9SZXN1bWUgcmVzZXRzIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSwgc28gd2UgaGF2ZSB0bworCSAqIHJlLWRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAgUENJIFR4IHJldHJpZXMKKwkgKiBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlLiBwY2lfcmVzdG9yZV9zdGF0ZSB3b24ndCBoZWxwCisJICogaGVyZSBzaW5jZSBpdCBvbmx5IHJlc3RvcmVzIHRoZSBmaXJzdCA2NCBieXRlcyBwY2kgY29uZmlnIGhlYWRlci4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7CisJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOworCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXQ7CisKKwlkZXYtPm9wZW4oZGV2KTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKKworaW50IHJ0bDgxODBfZW5hYmxlX3dha2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSkKK3sKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCBlbmFibGUgd2FrZSBjYWxsIChzdGF0ZSAldSwgZW5hYmxlICVkKS5cbiIsCisJICAgICAgIHN0YXRlLCBlbmFibGUpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCisKKyNlbmRpZiAvL0NPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1OGIzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgICAgICBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKwlXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisJVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIGxhdGVyIHdvcmsgYW5kCisJZG9lcyBub3QgZG8gYW55dGhpbmcgdXNlZnVsLgorCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisKKyNpZm5kZWYgUjgxODBfUE1fSAorI2RlZmluZSBSODE4MF9QTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitpbnQgcnRsODE4MF9zYXZlX3N0YXRlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUpOworaW50IHJ0bDgxODBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2ludCBydGw4MTgwX2VuYWJsZV93YWtlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUsIGludCBlbmFibGUpOworCisjZW5kaWYgLy9SODE4MF9QTV9ICisKKyNlbmRpZiAvLyBDT05GSUdfUlRMODE4MF9QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmVkMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmMKQEAgLTAsMCArMSw5MzMgQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyMjUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisKKworI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcnRsODIyNS5oIgorCisKK3U4IHJ0bDgyMjVfZ2FpbltdPXsKKwkweDIzLDB4ODgsMHg3YywweGE1LC8vIC04MmRibQorCTB4MjMsMHg4OCwweDdjLDB4YjUsLy8gLTgyZGJtCisJMHgyMywweDg4LDB4N2MsMHhjNSwvLyAtODJkYm0KKwkweDMzLDB4ODAsMHg3OSwweGM1LC8vIC03OGRibQorCTB4NDMsMHg3OCwweDc2LDB4YzUsLy8gLTc0ZGJtCisJMHg1MywweDYwLDB4NzMsMHhjNSwvLyAtNzBkYm0KKwkweDYzLDB4NTgsMHg3MCwweGM1LC8vIC02NmRibQorfTsKKworI2lmIDAKK3U4IHJ0bDgyMjVfaW5pdF9nYWluW109eworCS8vMHgwMCwweDAwLDB4MDAsMHgwMCwvLzB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgzMywweDgwLDB4NmMsMHhjNSwvLzB4MDAsMHg0OSwweDA2LDB4YjUsLy9HYWluID0gMCB+IC03OGRibQorCTB4NDMsMHg3OCwweDY5LDB4YzUsLy8weDAwLDB4NDUsMHgwNiwweGIxLC8vR2FpbiA9IDEgfiAtNzRkYm0KKwkweDUzLDB4NjAsMHg2NiwweGM1LC8vMHgwMCwweDQxLDB4MDYsMHhhYiwvL0dhaW4gPSAyIH4gLTcwZGJtCisJMHg2MywweDU4LDB4NjMsMHhjNSwvLzB4MDAsMHgzZCwweDA2LDB4YTUsLy9HYWluID0gMyB+IC02NmRibQorCTB4NzMsMHg1MCwweDYyLDB4YzUsLy8weDAwLDB4MzksMHgwNiwweGExLC8vR2FpbiA9IDQgfiAtNjJkYm0KKwkweDgzLDB4NDMsMHg2MSwweGM1LC8vMHgwMCwweDM1LDB4MDYsMHg5YiwvL0dhaW4gPSA1IH4gLTU4ZGJtCisJMHg5MywweDM4LDB4NWEsMHhjNSwvLzB4MDAsMHgzMSwweDA2LDB4OTksLy9HYWluID0gNiB+IC01NGRibQorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKK3UzMiBydGw4MjI1X2NoYW5bXSA9eworICAgICAgICAgICAgICAwLAorCQkweDAwODAsIC8vY2gxCisJCTB4MDEwMCwgLy9jaDIKKwkJMHgwMTgwLCAvL2NoMworCQkweDAyMDAsIC8vY2g0CisJCTB4MDI4MCwKKwkJMHgwMzAwLAorCQkweDAzODAsCisJCTB4MDQwMCwKKwkJMHgwNDgwLAorCQkweDA1MDAsCisJCTB4MDU4MCwKKwkJMHgwNjAwLAorCQkweDA2ODAsCisJCTB4MDc0QSwgLy9jaDE0Cit9OworI2Vsc2UKK3UzMiBydGw4MjI1X2NoYW5bXSA9IHsKKwkwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MDg1YywgLy8xCisJMHgwOGRjLCAvLzIKKwkweDA5NWMsIC8vMworCTB4MDlkYywgLy80CisJMHgwYTVjLCAvLzUKKwkweDBhZGMsIC8vNgorCTB4MGI1YywgLy83CisJMHgwYmRjLCAvLzgKKwkweDBjNWMsIC8vOQorCTB4MGNkYywgLy8xMAorCTB4MGQ1YywgLy8xMQorCTB4MGRkYywgLy8xMgorCTB4MGU1YywgLy8xMworCS8vMHgwZjVjLCAvLzE0CisJMHgwZjcyLCAvLyAxNAorfTsKKyNlbmRpZgorCit1MTYgcnRsODIyNWJjZF9yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDA3OWEsIDB4MDc5YiwgMHgwNzljLCAweDA3OWQsCisJMHgwN2EwLCAweDA3YTEsIDB4MDdhMiwgMHgwN2EzLCAweDA3YTQsIDB4MDdhNSwgMHgwN2E4LCAweDA3YTksCisJMHgwN2FhLCAweDA3YWIsIDB4MDdhYywgMHgwN2FkLCAweDA3YjAsIDB4MDdiMSwgMHgwN2IyLCAweDA3YjMsCisJMHgwN2I0LCAweDA3YjUsIDB4MDdiOCwgMHgwN2I5LCAweDA3YmEsIDB4MDdiYiwgMHgwN2JiCisKK307CisKKworI2lmIDAKK3UxNiBydGw4MjI1YmNfcnhnYWluW109eworCTB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywgMHgwNDA0LCAweDA0MDUsIDB4MDQwOCwgMHgwNDA5LAorCTB4MDQwYSwgMHgwNDBiLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDU0MCwgMHgwNTQxLAorCTB4MDU0MiwgMHgwNTQzLCAweDA1NDQsIDB4MDU0NSwgMHgwNTgwLCAweDA1ODEsIDB4MDU4MiwgMHgwNTgzLAorCTB4MDU4NCwgMHgwNTg1LCAweDA1ODgsIDB4MDU4OSwgMHgwNThhLCAweDA1OGIsIDB4MDY0MywgMHgwNjQ0LAorCTB4MDY0NSwgMHgwNjgwLCAweDA2ODEsIDB4MDY4MiwgMHgwNjgzLCAweDA2ODQsIDB4MDY4NSwgMHgwNjg4LAorCTB4MDY4OSwgMHgwNjhhLCAweDA2OGIsIDB4MDY4YywgMHgwNzQyLCAweDA3NDMsIDB4MDc0NCwgMHgwNzQ1LAorCTB4MDc4MCwgMHgwNzgxLCAweDA3ODIsIDB4MDc4MywgMHgwNzg0LCAweDA3ODUsIDB4MDc4OCwgMHgwNzg5LAorCTB4MDc4YSwgMHgwNzhiLCAweDA3OGMsIDB4MDc4ZCwgMHgwNzkwLCAweDA3OTEsIDB4MDc5MiwgMHgwNzkzLAorCTB4MDc5NCwgMHgwNzk1LCAweDA3OTgsIDB4MDc5OSwgMHgwMzlhLCAweDAzOWIsIDB4MDM5YywgMHgwMzlkLAorCTB4MDNhMCwgMHgwM2ExLCAweDAzYTIsIDB4MDNhMywgMHgwM2E0LCAweDAzYTUsIDB4MDNhOCwgMHgwM2E5LAorCTB4MDNhYSwgMHgwM2FiLCAweDAzYWMsIDB4MDNhZCwgMHgwM2IwLCAweDAzYjEsIDB4MDNiMiwgMHgwM2IzLAorCTB4MDNiNCwgMHgwM2I1LCAweDAzYjgsIDB4MDNiOSwgMHgwM2JhLCAweDAzYmIsIDB4MDNiYgorCit9OworCisKK3UxNiBydGw4MjI1YV9yeGdhaW5bXT17CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA4LCAweDA0MDksCisJMHgwNDBhLCAweDA0MGIsIDB4MDUwMiwgMHgwNTAzLCAweDA1MDQsIDB4MDUwNSwgMHgwNTQwLCAweDA1NDEsCisJMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1ODAsIDB4MDU4MSwgMHgwNTgyLCAweDA1ODMsCisJMHgwNTg0LCAweDA1ODUsIDB4MDU4OCwgMHgwNTg5LCAweDA1OGEsIDB4MDU4YiwgMHgwNjQzLCAweDA2NDQsCisJMHgwNjQ1LCAweDA2ODAsIDB4MDY4MSwgMHgwNjgyLCAweDA2ODMsIDB4MDY4NCwgMHgwNjg1LCAweDA2ODgsCisJMHgwNjg5LCAweDA2OGEsIDB4MDY4YiwgMHgwNjhjLCAweDA3NDIsIDB4MDc0MywgMHgwNzQ0LCAweDA3NDUsCisJMHgwNzgwLCAweDA3ODEsIDB4MDc4MiwgMHgwNzgzLCAweDA3ODQsIDB4MDc4NSwgMHgwNzg4LCAweDA3ODksCisJMHgwNzhhLCAweDA3OGIsIDB4MDc4YywgMHgwNzhkLCAweDA3OTAsIDB4MDc5MSwgMHgwNzkyLCAweDA3OTMsCisJMHgwNzk0LCAweDA3OTUsIDB4MDc5OCwgMHgwNzk5LCAweDA3OWEsIDB4MDc5YiwgMHgwNzljLCAweDA3OWQsCisJMHgwN2EwLCAweDA3YTEsIDB4MDdhMiwgMHgwN2EzLCAweDA3YTQsIDB4MDdhNSwgMHgwN2E4LCAweDA3YTksCisJMHgwN2FhLCAweDA3YWIsIDB4MDdhYywgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsCisJMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkCit9OworI2VuZGlmCisKK3U4IHJ0bDgyMjVfYWdjW109eworCTB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDlkLDB4OWMsMHg5YiwweDlhLDB4OTksMHg5OCwweDk3LDB4OTYsCisJMHg5NSwweDk0LDB4OTMsMHg5MiwweDkxLDB4OTAsMHg4ZiwweDhlLDB4OGQsMHg4YywweDhiLDB4OGEsMHg4OSwweDg4LDB4ODcsMHg4NiwKKwkweDg1LDB4ODQsMHg4MywweDgyLDB4ODEsMHg4MCwweDNmLDB4M2UsMHgzZCwweDNjLDB4M2IsMHgzYSwweDM5LDB4MzgsMHgzNywweDM2LAorCTB4MzUsMHgzNCwweDMzLDB4MzIsMHgzMSwweDMwLDB4MmYsMHgyZSwweDJkLDB4MmMsMHgyYiwweDJhLDB4MjksMHgyOCwweDI3LDB4MjYsCisJMHgyNSwweDI0LDB4MjMsMHgyMiwweDIxLDB4MjAsMHgxZiwweDFlLDB4MWQsMHgxYywweDFiLDB4MWEsMHgxOSwweDE4LDB4MTcsMHgxNiwKKwkweDE1LDB4MTQsMHgxMywweDEyLDB4MTEsMHgxMCwweDBmLDB4MGUsMHgwZCwweDBjLDB4MGIsMHgwYSwweDA5LDB4MDgsMHgwNywweDA2LAorCTB4MDUsMHgwNCwweDAzLDB4MDIsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisJMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKK307CisKKwordTggcnRsODIyNV90eF9nYWluX2Nja19vZmRtW109eworCTB4MDIsMHgwNiwweDBlLDB4MWUsMHgzZSwweDdlCit9OworCisKK3U4IHJ0bDgyMjVfdHhfcG93ZXJfb2ZkbVtdPXsKKwkweDgwLDB4OTAsMHhhMiwweGI1LDB4Y2IsMHhlNAorfTsKKworCit1OCBydGw4MjI1X3R4X3Bvd2VyX2Nja19jaDE0W109eworCTB4MTgsMHgxNywweDE1LDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDFiLDB4MWEsMHgxNywweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgxZiwweDFlLDB4MWEsMHgwZiwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MjIsMHgyMSwweDFkLDB4MTEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDI2LDB4MjUsMHgyMSwweDEzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgyYiwweDJhLDB4MjUsMHgxNSwweDAwLDB4MDAsMHgwMCwweDAwCit9OworCisKK3U4IHJ0bDgyMjVfdHhfcG93ZXJfY2NrW109eworCTB4MTgsMHgxNywweDE1LDB4MTEsMHgwYywweDA4LDB4MDQsMHgwMiwKKwkweDFiLDB4MWEsMHgxNywweDEzLDB4MGUsMHgwOSwweDA0LDB4MDIsCisJMHgxZiwweDFlLDB4MWEsMHgxNSwweDEwLDB4MGEsMHgwNSwweDAyLAorCTB4MjIsMHgyMSwweDFkLDB4MTgsMHgxMSwweDBiLDB4MDYsMHgwMiwKKwkweDI2LDB4MjUsMHgyMSwweDFiLDB4MTQsMHgwZCwweDA2LDB4MDMsCisJMHgyYiwweDJhLDB4MjUsMHgxZSwweDE2LDB4MGUsMHgwNywweDAzCit9OworCisKK3ZvaWQgcnRsODIyNV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0XSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAxXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAyXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAzXSk7Cit9CisjaWYgMAorCit2b2lkIHJ0bDgyMjVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgyNyk7CisJZWxzZQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MzcpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4Nik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogNCArIDNdKTsKKwkvL3J0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgZ2Fpbik7Cit9CisjZW5kaWYKKworCit2b2lkIHdyaXRlX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MTYgZGF0YSkKK3sKKwlpbnQgaTsKKwl1MTYgb3V0LHNlbGVjdDsKKwl1OCBiaXQ7CisJdTMyIGJhbmdkYXRhID0gKGRhdGEgPDwgNCkgfCAoYWRyICYgMHhmKTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlvdXQgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KSAmIDB4ZmZmMzsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCisJZm9yKGk9MTU7IGk+PTA7aS0tKXsKKworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisKKwkJaS0tOworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisKKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gNCA6IEJCX0hPU1RfQkFOR19FTikpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQltZGVsYXkoMik7CisJZWxzZQorCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7Cit9CisKK3ZvaWQgcnRsODIyNV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4MWYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT0ZGKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PRkYpOworfQorCit2b2lkIHJ0bDgyMjVfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBHYWluSWR4OworCWludCBHYWluU2V0dGluZzsKKwlpbnQgaTsKKwl1OCBwb3dlcjsKKwl1OCAqY2NrX3Bvd2VyX3RhYmxlOworCXU4IG1heF9jY2tfcG93ZXJfbGV2ZWw7CisJdTggbWF4X29mZG1fcG93ZXJfbGV2ZWw7CisJdTggbWluX29mZG1fcG93ZXJfbGV2ZWw7CisJdTggY2NrX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXU4IG9mZG1fcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cl9vZmRtW2NoXTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQltYXhfY2NrX3Bvd2VyX2xldmVsID0gMTE7CisJCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMjU7IC8vICAxMiAtPiAyNQorCQltaW5fb2ZkbV9wb3dlcl9sZXZlbCA9IDEwOworCX1lbHNleworCQltYXhfY2NrX3Bvd2VyX2xldmVsID0gMzU7CisJCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMzU7CisJCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMDsKKwl9CisJLyogQ0NLIHBvd2VyIHNldHRpbmcgKi8KKwlpZihjY2tfcG93ZXJfbGV2ZWwgPiBtYXhfY2NrX3Bvd2VyX2xldmVsKQorCQljY2tfcG93ZXJfbGV2ZWwgPSBtYXhfY2NrX3Bvd2VyX2xldmVsOworCUdhaW5JZHg9Y2NrX3Bvd2VyX2xldmVsICUgNjsKKwlHYWluU2V0dGluZz1jY2tfcG93ZXJfbGV2ZWwgLyA2OworCisJaWYoY2ggPT0gMTQpCisJCWNja19wb3dlcl90YWJsZSA9IHJ0bDgyMjVfdHhfcG93ZXJfY2NrX2NoMTQ7CisJZWxzZQorCQljY2tfcG93ZXJfdGFibGUgPSBydGw4MjI1X3R4X3Bvd2VyX2NjazsKKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uICl7CisJCS8qVmVyIEIqLworLy8JCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9DQ0ssIHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtHYWluU2V0dGluZ10pOworLy8JfWVsc2V7CisJCS8qVmVyIEMgLSBEICovCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX0NDSywgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW0dhaW5TZXR0aW5nXT4+MSk7CisvLwl9CisKKwlmb3IoaT0wO2k8ODtpKyspeworCisJCXBvd2VyID0gY2NrX3Bvd2VyX3RhYmxlW0dhaW5JZHggKiA4ICsgaV07CisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0ICsgaSwgcG93ZXIpOworCX0KKworCS8qIEZJWE1FIElzIHRoaXMgZGVsYXkgcmVhbGx5IG5lZWRlZWQgPyAqLworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJLyogT0ZETSBwb3dlciBzZXR0aW5nICovCisvLyAgT2xkOgorLy8JaWYob2ZkbV9wb3dlcl9sZXZlbCA+IG1heF9vZmRtX3Bvd2VyX2xldmVsKQorLy8JCW9mZG1fcG93ZXJfbGV2ZWwgPSAzNTsKKy8vCW9mZG1fcG93ZXJfbGV2ZWwgKz0gbWluX29mZG1fcG93ZXJfbGV2ZWw7CisvLyAgTGF0ZXN0OgorCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiAobWF4X29mZG1fcG93ZXJfbGV2ZWwgLSBtaW5fb2ZkbV9wb3dlcl9sZXZlbCkpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwllbHNlCisJCW9mZG1fcG93ZXJfbGV2ZWwgKz0gbWluX29mZG1fcG93ZXJfbGV2ZWw7CisJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IDM1KQorCQlvZmRtX3Bvd2VyX2xldmVsID0gMzU7CisvLworCisJR2FpbklkeD1vZmRtX3Bvd2VyX2xldmVsICUgNjsKKwlHYWluU2V0dGluZz1vZmRtX3Bvd2VyX2xldmVsIC8gNjsKKyNpZiAxCisvLwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldixSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDIsMHg0Mik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw2LDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsOCwwKTsKKy8vCX0KKyNlbmRpZgorLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKXsKKy8vCQkvKlZlciBCKi8KKy8vCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fT0ZETSwgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW0dhaW5TZXR0aW5nXSk7CisvLwl9ZWxzZXsKKwkJLypWZXIgQyAtIEQgKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fT0ZETSwgcnRsODIyNV90eF9nYWluX2Nja19vZmRtW0dhaW5TZXR0aW5nXT4+MSk7CisvLwl9CisKKworCXBvd2VyID0gcnRsODIyNV90eF9wb3dlcl9vZmRtW0dhaW5JZHhdOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDUsIHBvd2VyKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NywgcG93ZXIpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DT05UUk9MLDQpOworfQorI2lmIDAKKy8qIHN3aXRjaCBiZXR3ZWVuIG1vZGUgQiBhbmQgRyAqLwordm9pZCBydGw4MjI1X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IG1vZGViKQoreworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgKG1vZGViID8gMHgwIDogMHg0MCkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgKG1vZGViID8gMHgwIDogMHg0MCkpOworfQorI2VuZGlmCit2b2lkIHJ0bDgyMjVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IGdzZXQgPSAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWU4MDIxMV9pc181NGcocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKSB8fAorCQlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SOworCisJcnRsODIyNV9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaCk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hdKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEwKTsKKworCS8vIEEgbW9kZSBzaWZzIDB4NDQsIGRpZnMgMzQtMTQsIHNsb3QgOSwgZWlmcyAyMywgY3dtIDMsIGN3TSA3LCBjdHN0b3NlbGYgMHgxMAorCWlmKGdzZXQpeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0lGUywweDIyKTsvLyBTSUZTOiAweDIyCisJCXdyaXRlX25pY19ieXRlKGRldixESUZTLDB4MTQpOyAvL0RJRlM6IDIwCisJCS8vd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMjApOyAvL0RJRlM6IDIwCisJfWVsc2V7CisJCXdyaXRlX25pY19ieXRlKGRldixTSUZTLDB4NDQpOy8vIFNJRlM6IDB4MjIKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsNTAgLSAxNCk7IC8vRElGUzogMzYKKwl9CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWU4MDIxMV9pc19zaG9ydHNsb3QocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDkpOyAvL1NMT1Q6IDkKKworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHgxNCk7IC8vU0xPVDogMjAgKDB4MTQpCisKKworCWlmKGdzZXQpeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsRUlGUyw4MSk7Ly85MSAtIDIwKTsgLy8gRUlGUzogOTEgKDB4NUIpCisJCXdyaXRlX25pY19ieXRlKGRldixDV19WQUwsMHg3Myk7IC8vQ1cgVkFMVUU6IDB4MzcKKwkJLy9ETUVTRygidXNpbmcgRyBuZXQgcGFyYW1zIik7CisJfWVsc2V7CisJCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDgxKTsgLy8gRUlGUzogOTEgKDB4NUIpCisJCXdyaXRlX25pY19ieXRlKGRldixDV19WQUwsMHhhNSk7IC8vQ1cgVkFMVUU6IDB4MzcKKwkJLy9ETUVTRygidXNpbmcgQiBuZXQgcGFyYW1zIik7CisJfQorCisKK30KKwordm9pZCBydGw4MjI1X2hvc3RfcGNpX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHg0ODApOworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisJLy9pZihwcml2LT5jYXJkXzgxODUgPT0gMiAmJiBwcml2LT5lbmFibGVfZ3BpbzAgKSAvKiB2ZXJzaW9uIEQgKi8KKwkvL3dyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDg4KTsKKwkvL2Vsc2UKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4OCB8IFNXX0NPTlRST0xfR1BJTyk7IC8qIDB4NDg4IHwgU1dfQ09OVFJPTF9HUElPICovCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSwgMCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgyMDApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBHUF9FTkFCTEUsIDB4ZmYgJiAofigxPDw2KSkpOyAvKiBiaXQgNiBpcyBmb3IgUkYgb24vb2ZmIGRldGVjdGlvbiAqLworCisKK30KKwordm9pZCBydGw4MjI1X2hvc3RfdXNiX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkjaWYgMAorCXdyaXRlX25pY19ieXRlKGRldixSRlBpbnNTZWxlY3QrMSwwKTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUElPLDApOworCisJd3JpdGVfbmljX2J5dGVfRShkZXYsMHg1MyxyZWFkX25pY19ieXRlX0UoZGV2LDB4NTMpIHwgKDE8PDcpKTsKKworCXdyaXRlX25pY19ieXRlKGRldixSRlBpbnNTZWxlY3QrMSw0KTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUElPLDB4MjApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQX0VOQUJMRSwwKTsKKworCisJLyogQ29uZmlnIEJCICYgUkYgKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHg4MCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4MCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHg4MCk7CisKKworCW1kZWxheSgxMDApOworCisJbWRlbGF5KDEwMDApOworI2VuZGlmCisKK30KKwordm9pZCBydGw4MjI1X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcnRsODIyNShkZXYsMHg0LDB4ZGZmKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fU0xFRVApOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX1NMRUVQKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworfQorCit2b2lkIHJ0bDgyMjVfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcnRsODIyNShkZXYsMHg0LDB4OWZmKTsKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworfQorCit2b2lkIHJ0bDgyMjVfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzaG9ydCBjaGFubmVsID0gMTsKKwl1MTYgYnJzcjsKKworCXByaXYtPmNoYW4gPSBjaGFubmVsOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJcnRsODIyNV9ob3N0X3VzYl9pbml0KGRldik7CisJZWxzZQorCQlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHgwMDBhODAwOCk7CisKKwlicnNyID0gcmVhZF9uaWNfd29yZChkZXYsIEJSU1IpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweGZmZmYpOworCisJI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7LyogdmVyc2lvbiBDIG9yIEIgKi8KKwkJaWYocHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKSAgLyogdmVyc2lvbiBCKi8KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4NDQpOworCQllbHNlICAgIC8qIHZlcnNpb24gQyAqLworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCX1lbHNleyAvKiB2ZXJzaW9uIEQgKi8KKwkJaWYocHJpdi0+ZW5hYmxlX2dwaW8wKQorCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgyMDEwMDA0NCk7CisJCWVsc2UgLyogYWxzbyBVU0IgKi8KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQ0KTsKKwl9CisJI2VuZGlmCisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0NCk7CisKKwkjaWYgMSAgLy8wLT4xCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgMHg0NCk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCSNlbmRpZgorCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCQltZGVsYXkoMTAwMCk7CisJfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHg2Nyk7IG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MSwgMHhmZTApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDMsIDB4NDQxKTsgbWRlbGF5KDEpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHg0ODYpOworCWVsc2UKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHg4YmUpOworCisJbWRlbGF5KDEpOworCisKKwkjaWYgMAorCX1lbHNlIGlmKHByaXYtPnBoeV92ZXIgPT0gMSl7CisJCS8qIHZlcnNpb24gQSAqLworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGJjMCArIDIpOworCX1lbHNleworCSNlbmRpZgorCS8qIHZlcnNpb24gQiAmIEMgKi8KKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YmMwKTsKKwllbHNlIGlmKHByaXYtPmNhcmRfdHlwZSA9PSBNSU5JUENJKQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGJjMCArIDMgKyg2PDwzKSk7CisJZWxzZQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGJjMCArICg2PDwzKSk7CisKKwkgbWRlbGF5KDEpOworLy8JfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NiwgMHhhZTYpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKT8gMHg4MmEgOiBydGw4MjI1X2NoYW5bY2hhbm5lbF0pKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDgsIDB4MWYpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OSwgMHgzMzQpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YSwgMHhmZDQpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YiwgMHgzOTEpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YywgMHg1MCk7ICBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGQsIDB4NmRiKTsgICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhlLCAweDI5KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGYsIDB4OTE0KTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQkvL2ZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxMDApOworCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4YzRkKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgyMDApOworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKworCS8vCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxMDApOworCisJfS8vRW5kIG9mIGlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJLyogRklYTUUhISBydGw4MTg3IHdlIGhhdmUgdG8gY2hlY2sgaWYgY2FsaWJyYXJpb24KKwkgKiBpcyBzdWNjZXNzZnVsIGFuZCBldmVudHVhbGx5IGNhbC4gYWdhaW4gKHJlcGVhdAorCSAqIHRoZSB0d28gd3JpdGUgb24gcmVnIDIpCisJKi8KKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCisJbWRlbGF5KDEwMCk7IC8vMjAwIGZvciA4MTg3CisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpIC8qIG1heWJlIG5vdCBuZWVkZWQgZXZlbiBmb3IgODE4NSAqLworLy8Jd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MTI3KTsKKworCWZvcihpPTA7aTw5NTtpKyspeworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgxLCAodTgpKGkrMSkpOworCisJCSNpZiAwCisJCWlmKHByaXYtPnBoeV92ZXIgPT0gMSkKKwkJCS8qIHZlcnNpb24gQSAqLworCQkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNWFfcnhnYWluW2ldKTsKKwkJZWxzZQorCQkjZW5kaWYKKwkJLyogdmVyc2lvbiBCICYgQyAmIEQqLworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIHJ0bDgyMjViY2RfcnhnYWluW2ldKTsKKwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDI3KTsKKworCisvLwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDdkKTsKKy8vCisvLwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKy8vCQltZGVsYXkoMTAwKTsKKy8vCisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JLy99CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDIyZik7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwlmb3IoaT0wO2k8MTI4O2krKyl7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCBydGw4MjI1X2FnY1tpXSk7CisKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgKHU4KWkrIDB4ODApOworCisJCW1kZWxheSgxKTsKKwl9CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDEpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEsIDB4Mik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKT8gMHg0MiA6IDB4NjIpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgzLCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDQsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NSwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDgsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDksIDB4ZmUpOyBtZGVsYXkoMSk7CisKKwkjaWYgMAorCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg5KTsKKwl9ZWxzZXsKKwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKXsKKwkJCS8qIFZlciBCCisJCQkqIG1heWJlIGxhdGVyIHZlcnNpb24gY2FuIGFjY2VwdCB0aGlzIGFsc28/CisJCQkqLworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4Nik7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4NmYpOworCQl9ZWxzZXsKKwkjZW5kaWYKKwkJCS8qIHZlciBDICYgRCAqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDkpOyBtZGVsYXkoMSk7CisKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisJLy8JfQorCS8vfQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDgwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGMsIDB4MSk7bWRlbGF5KDEpOworCisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4ZCwgMHgzMyk7IC8vIDw+CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZSwgMHhkMyk7bWRlbGF5KDEpOworCisKKwkjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxKXsKKwkJaWYocHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOy8qdmVyIEIqLworCQllbHNlCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyOCk7Lyp2ZXIgQyovCisJfWVsc2V7CisJI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MzgpO21kZWxheSgxKTsKKy8qdmVyIEQgJiA4MTg3Ki8KKy8vCX0KKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHgwNCk7Lyp2ZXIgQiovCisvLwllbHNlCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEwLCAweDg0KTttZGVsYXkoMSk7CisvKnZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDA2KTttZGVsYXkoMSk7CisvKmFnYyByZXNwIHRpbWUgNzAwKi8KKworCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMil7CisJLyogVmVyIEQgJiA4MTg3Ki8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MjApO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgyMCk7bWRlbGF5KDEpOworCisjaWYgMAorCX1lbHNleworCQkvKiBWZXIgQiAmIEMqLworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgwKTsKKwl9CisjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsgbWRlbGF5KDEpOworCisvLwlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTttZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgMHgxOSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWEsIDB4MjApOyBtZGVsYXkoMSk7CisKKy8vCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisvLwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHg2Nik7IC8qIFZlciBCICovCisvLwkJZWxzZQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHg3Nik7bWRlbGF5KDEpOworIC8qIFZlciBDICYgRCAqLyAvL0ZJWE1FOk1BWUJFIG5vdCBuZWVkZWQKKy8vCX0KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYywgMHg0KTttZGVsYXkoMSk7CisKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEpeworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24peworCQkJLyp2ZXIgQiovCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTUpOworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDU1KTsKKwkJfWVsc2V7CisJCQkvKnZlciBDKi8KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5MCk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4MzQpOworCisJCX0KKwl9ZWxzZXsKKyNlbmRpZgorCQkvKnZlciBEICYgODE4NyovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDk1KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NzUpOwltZGVsYXkoMSk7CisKKy8vCX0KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMCwgMHgxZik7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDI3KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjIsIDB4MTYpO21kZWxheSgxKTsKKworLy8JaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg0Myk7IC8vRklYTUUgbWF5YmUgbm90IG5lZWRlZCAvLyA8PgorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDQ2KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgyMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7CisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDA4KTsgLyogVmVyIEIuIG1pZ2h0IHdvcmsgYWxzbyBmbyB2ZXIgQyZEID8qLworCWVsc2UKKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7IG1kZWxheSgxKTsKKy8qIFZlciBDICYgRCAmIDgxODcqLworCisJLy8gPD4gU2V0IGluaXQuIGdhaW4gdG8gbTc0ZEJtLgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg0Myk7CSBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDc2KTsJIG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIDB4YzUpOwkgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg3OCk7CSBtZGVsYXkoMSk7CisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpOworCS8vCXJ0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgMSk7IC8qIEZJWE1FIHRoaXMgJzInIGlzIHJhbmRvbSAqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MCwgMHg5OCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgzLCAweDIwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4N2UpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NSwgMHgxMik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGZjKTsgbWRlbGF5KDEpOworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDcsIDB4ZDgpOyAvKiBWZXIgQiAqLworCWVsc2UKKyNlbmRpZgorCXdyaXRlX3BoeV9jY2soZGV2LCAweDcsIDB4NzgpO21kZWxheSgxKTsKKyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDgsIDB4MmUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg5YjogMHg5MykpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOyBtZGVsYXkoMSk7CisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4OTgpOyAvKiBWZXIgQiAqLworCWVsc2UKKyNlbmRpZgorCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxOSwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYSwgMHhhMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOyAvKiBDQ0sgQ2FycmllciBTZW5zZSBUaHJlc2hvbGQgKi8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDhkKTttZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQyLCAweDE1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ0LCAweDFmKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ1LCAweDFlKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDFhKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ3LCAweDE1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ4LCAweDEwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweGEpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4NSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YiwgMHgyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRjLCAweDUpO21kZWxheSgxKTsKKworCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDViLCAweDBkKTsgbWRlbGF5KDEpOworCisKKworLy8gPD4KKy8vCS8vIFRFU1RSIDB4YiA4MTg3CisvLwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Myk7Ly8gJiAweGZiKTsKKy8vCisvLwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAweDYyKTsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NiwgMHgwKTsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHgwKTsKKy8vCS8vfQorCisJcnRsODIyNV9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaGFubmVsKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDliKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHhkYiBmb3IgQiAqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4MTAgZm9yIEIgKi8KKworCXJ0bDgxODVfdHhfYW50ZW5uYShkZXYsIDB4Myk7IC8qIFRYIGFudCBBLCAweDAgZm9yIEIgKi8KKworCS8qIHN3aXRjaCB0byBoaWdoLXNwZWVkIDMtd2lyZQorCSAqIGxhc3QgZGlnaXQuIDIgZm9yIGJvdGggY2NrIGFuZCBvZmRtCisJICovCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7CisJZWxzZXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxNWMwMDAwMik7CisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKwl9CisKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisvLwlydGw4MjI1X3NldF9nYWluKGRldiwgNCk7IC8qIEZJWE1FIHRoaXMgJzEnIGlzIHJhbmRvbSAqLyAvLyA8PgorLy8JIHJ0bDgyMjVfc2V0X21vZGUoZGV2LCAxKTsgLyogRklYTUUgc3RhcnQgaW4gQiBtb2RlICovIC8vIDw+CisvLworLy8JLyogbWFrZSBzdXJlIGlzIHdha2VuIHVwISAqLworLy8Jd3JpdGVfcnRsODIyNShkZXYsMHg0LCAweDlmZik7CisvLwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT04pOworCisJcnRsODIyNV9yZl9zZXRfY2hhbihkZXYsIHByaXYtPmNoYW4pOworCisJd3JpdGVfbmljX3dvcmQoZGV2LEJSU1IsYnJzcik7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4ZGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyMjUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjaW5jbHVkZSAicjgxODAuaCIKKworI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX09OICAweGEwMDAwYjU5CisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU1fT0ZGIDB4YTAwYmViNTkKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTTJfT0ZGIDB4ODQwZGVjMTEKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTTJfT04gIDB4ODYwZGVjMTEKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTV9TTEVFUCAweGEwMGJhYjU5CisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU0yX1NMRUVQIDB4ODQwZGVjMTEKKworI2lmZGVmIENPTkZJR19SVEw4MTg1Qgordm9pZCBydGw4MjI1ejJfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNXoyX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOwordm9pZCBydGw4MjI1ejJfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgcnRsODIyNV9ob3N0X3BjaV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1X2hvc3RfdXNiX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKTsKK3ZvaWQgUkZfV3JpdGVSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggb2Zmc2V0LCB1MzIJZGF0YSk7Cit1MzIgUkZfUmVhZFJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBvZmZzZXQpOworI2VuZGlmCit2b2lkIHJ0bDgyMjVfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKK3ZvaWQgcnRsODIyNV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNV9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNV9yZl93YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgbW9kZSk7Cit2b2lkIHJ0bDgxODBfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgbW9kZSk7Citib29sIFNldFplYnJhUkZQb3dlclN0YXRlODE4NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFJUX1JGX1BPV0VSX1NUQVRFICBlUkZQb3dlclN0YXRlKTsKK3ZvaWQgcnRsODIyNXo0X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjI1ejRfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE1NzRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpAQCAtMCwwICsxLDE1ODcgQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyMjUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisKK2V4dGVybiB1OCBydGw4MjI1X2FnY1tdOworCitleHRlcm4gdTMyIHJ0bDgyMjVfY2hhbltdOworCisvLzIwMDUuMTEuMTYKK3U4IHJ0bDgyMjV6Ml90aHJlc2hvbGRbXT17CisgICAgICAgIDB4OGQsIDB4OGQsIDB4OGQsIDB4OGQsIDB4OWQsIDB4YWQsIDB4YmQsCit9OworCisvLyAgICAgIDB4ZCAweDE5IDB4MWIgMHgyMQordTggcnRsODIyNXoyX2dhaW5fYmdbXT17CisJMHgyMywgMHgxNSwgMHhhNSwgLy8gLTgyLTFkYm0KKyAgICAgICAgMHgyMywgMHgxNSwgMHhiNSwgLy8gLTgyLTJkYm0KKyAgICAgICAgMHgyMywgMHgxNSwgMHhjNSwgLy8gLTgyLTNkYm0KKyAgICAgICAgMHgzMywgMHgxNSwgMHhjNSwgLy8gLTc4ZGJtCisgICAgICAgIDB4NDMsIDB4MTUsIDB4YzUsIC8vIC03NGRibQorICAgICAgICAweDUzLCAweDE1LCAweGM1LCAvLyAtNzBkYm0KKyAgICAgICAgMHg2MywgMHgxNSwgMHhjNSwgLy8gLTY2ZGJtCit9OworCit1OCBydGw4MjI1ejJfZ2Fpbl9hW109eworCTB4MTMsMHgyNywweDVhLC8vLDB4MzcsLy8gLTgyZGJtCisJMHgyMywweDIzLDB4NTgsLy8sMHgzNywvLyAtODJkYm0KKwkweDMzLDB4MWYsMHg1NiwvLywweDM3LC8vIC04MmRibQorCTB4NDMsMHgxYiwweDU0LC8vLDB4MzcsLy8gLTc4ZGJtCisJMHg1MywweDE3LDB4NTEsLy8sMHgzNywvLyAtNzRkYm0KKwkweDYzLDB4MjQsMHg0ZiwvLywweDM3LC8vIC03MGRibQorCTB4NzMsMHgwZiwweDRjLC8vLDB4MzcsLy8gLTY2ZGJtCit9OworI2lmIDAKK3UzMiBydGw4MjI1X2NoYW5bXSA9IHsKKwkwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MDg1YywgLy8xCisJMHgwOGRjLCAvLzIKKwkweDA5NWMsIC8vMworCTB4MDlkYywgLy80CisJMHgwYTVjLCAvLzUKKwkweDBhZGMsIC8vNgorCTB4MGI1YywgLy83CisJMHgwYmRjLCAvLzgKKwkweDBjNWMsIC8vOQorCTB4MGNkYywgLy8xMAorCTB4MGQ1YywgLy8xMQorCTB4MGRkYywgLy8xMgorCTB4MGU1YywgLy8xMworCS8vMHgwZjVjLCAvLzE0CisJMHgwZjcyLCAvLyAxNAorfTsKKyNlbmRpZgorCisvLy0KK3UxNiBydGw4MjI1ejJfcnhnYWluW109eworCTB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywgMHgwNDA0LCAweDA0MDUsIDB4MDQwOCwgMHgwNDA5LAorCTB4MDQwYSwgMHgwNDBiLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDU0MCwgMHgwNTQxLAorCTB4MDU0MiwgMHgwNTQzLCAweDA1NDQsIDB4MDU0NSwgMHgwNTgwLCAweDA1ODEsIDB4MDU4MiwgMHgwNTgzLAorCTB4MDU4NCwgMHgwNTg1LCAweDA1ODgsIDB4MDU4OSwgMHgwNThhLCAweDA1OGIsIDB4MDY0MywgMHgwNjQ0LAorCTB4MDY0NSwgMHgwNjgwLCAweDA2ODEsIDB4MDY4MiwgMHgwNjgzLCAweDA2ODQsIDB4MDY4NSwgMHgwNjg4LAorCTB4MDY4OSwgMHgwNjhhLCAweDA2OGIsIDB4MDY4YywgMHgwNzQyLCAweDA3NDMsIDB4MDc0NCwgMHgwNzQ1LAorCTB4MDc4MCwgMHgwNzgxLCAweDA3ODIsIDB4MDc4MywgMHgwNzg0LCAweDA3ODUsIDB4MDc4OCwgMHgwNzg5LAorCTB4MDc4YSwgMHgwNzhiLCAweDA3OGMsIDB4MDc4ZCwgMHgwNzkwLCAweDA3OTEsIDB4MDc5MiwgMHgwNzkzLAorCTB4MDc5NCwgMHgwNzk1LCAweDA3OTgsIDB4MDc5OSwgMHgwNzlhLCAweDA3OWIsIDB4MDc5YywgMHgwNzlkLAorCTB4MDdhMCwgMHgwN2ExLCAweDA3YTIsIDB4MDdhMywgMHgwN2E0LCAweDA3YTUsIDB4MDdhOCwgMHgwN2E5LAorCTB4MDNhYSwgMHgwM2FiLCAweDAzYWMsIDB4MDNhZCwgMHgwM2IwLCAweDAzYjEsIDB4MDNiMiwgMHgwM2IzLAorCTB4MDNiNCwgMHgwM2I1LCAweDAzYjgsIDB4MDNiOSwgMHgwM2JhLCAweDAzYmIsIDB4MDNiYgorCit9OworCisvLzIwMDUuMTEuMTYsCit1OCBaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HW109eworICAgICAgICAweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwKKyAgICAgICAgMHgwNiwweDA3LDB4MDgsMHgwOSwweDBhLDB4MGIsCisgICAgICAgIDB4MGMsMHgwZCwweDBlLDB4MGYsMHgxMCwweDExLAorICAgICAgICAweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywKKyAgICAgICAgMHgxOCwweDE5LDB4MWEsMHgxYiwweDFjLDB4MWQsCisgICAgICAgIDB4MWUsMHgxZiwweDIwLDB4MjEsMHgyMiwweDIzLAorfTsKKworI2lmIDAKKy8vLQordTggcnRsODIyNV9hZ2NbXT17CisJMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWQsMHg5YywweDliLDB4OWEsMHg5OSwweDk4LDB4OTcsMHg5NiwKKwkweDk1LDB4OTQsMHg5MywweDkyLDB4OTEsMHg5MCwweDhmLDB4OGUsMHg4ZCwweDhjLDB4OGIsMHg4YSwweDg5LDB4ODgsMHg4NywweDg2LAorCTB4ODUsMHg4NCwweDgzLDB4ODIsMHg4MSwweDgwLDB4M2YsMHgzZSwweDNkLDB4M2MsMHgzYiwweDNhLDB4MzksMHgzOCwweDM3LDB4MzYsCisJMHgzNSwweDM0LDB4MzMsMHgzMiwweDMxLDB4MzAsMHgyZiwweDJlLDB4MmQsMHgyYywweDJiLDB4MmEsMHgyOSwweDI4LDB4MjcsMHgyNiwKKwkweDI1LDB4MjQsMHgyMywweDIyLDB4MjEsMHgyMCwweDFmLDB4MWUsMHgxZCwweDFjLDB4MWIsMHgxYSwweDE5LDB4MTgsMHgxNywweDE2LAorCTB4MTUsMHgxNCwweDEzLDB4MTIsMHgxMSwweDEwLDB4MGYsMHgwZSwweDBkLDB4MGMsMHgwYiwweDBhLDB4MDksMHgwOCwweDA3LDB4MDYsCisJMHgwNSwweDA0LDB4MDMsMHgwMiwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKKwkweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorfTsKKyNlbmRpZgorLyoKKyBmcm9tIDAgdG8gMHgyMwordTggcnRsODIyNV90eF9nYWluX2Nja19vZmRtW109eworCTB4MDIsMHgwNiwweDBlLDB4MWUsMHgzZSwweDdlCit9OworKi8KKworLy8tCit1OCBydGw4MjI1ejJfdHhfcG93ZXJfb2ZkbVtdPXsKKwkweDQyLDB4MDAsMHg0MCwweDAwLDB4NDAKK307CisKKworLy8tCit1OCBydGw4MjI1ejJfdHhfcG93ZXJfY2NrX2NoMTRbXT17CisJMHgzNiwweDM1LDB4MmUsMHgxYiwweDAwLDB4MDAsMHgwMCwweDAwCit9OworCisKKy8vLQordTggcnRsODIyNXoyX3R4X3Bvd2VyX2Nja1tdPXsKKwkweDM2LDB4MzUsMHgyZSwweDI1LDB4MWMsMHgxMiwweDA5LDB4MDQKK307CisKKwordm9pZCBydGw4MjI1ejJfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKwl1OCogcnRsODIyNV9nYWluOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXU4IG1vZGUgPSBwcml2LT5pZWVlODAyMTEtPm1vZGU7CisKKwlpZihtb2RlID09IElFRUVfQiB8fCBtb2RlID09IElFRUVfRykKKwkJcnRsODIyNV9nYWluID0gcnRsODIyNXoyX2dhaW5fYmc7CisJZWxzZQorCQlydGw4MjI1X2dhaW4gPSBydGw4MjI1ejJfZ2Fpbl9hOworCisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2FpbltnYWluICogM10pOworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDE5LCBydGw4MjI1X2dhaW5bZ2FpbiAqIDMgKyAxXSk7CisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDJdKTsKKyAgICAgICAgLy8yMDA1LjExLjE3LCBieSBjaC1oc3UKKyAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweDBiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDNdKTsKKyAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDMgKyAxXSk7CisgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluW2dhaW4gKiAzICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgzNyk7CisKK30KKworI2lmIDAKKwordm9pZCBydGw4MjI1X3NldF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGdhaW4pCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSAyKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MjcpOworCWVsc2UKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDM3KTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDYpOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4OCk7CisJZWxzZQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0XSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAxXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAyXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAzXSk7CisJLy9ydGw4MjI1X3NldF9nYWluX3VzYihkZXYsIGdhaW4pOworfQorI2VuZGlmCisKK3UzMiByZWFkX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKQoreworCXUzMiBkYXRhMldyaXRlID0gKCh1MzIpKGFkciAmIDB4MWYpKSA8PCAyNzsKKwl1MzIgZGF0YVJlYWQ7CisJdTMyIG1hc2s7CisJdTE2IG92YWwsb3ZhbDIsb3ZhbDMsdG1wOworLy8JVGhyZWVXaXJlUmVnIHR3cmVnOworLy8JVGhyZWVXaXJlUmVnIHRkYXRhOworCWludCBpOworCXNob3J0IGJpdCwgcnc7CisKKwl1OCB3TGVuZ3RoID0gNjsKKwl1OCByTGVuZ3RoID0gMTI7CisJdTggbG93MmhpZ2ggPSAwOworCisJb3ZhbCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpOworCW92YWwyID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSk7CisJb3ZhbDMgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAob3ZhbDJ8MHhmKSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIChvdmFsM3wweGYpKTsKKworCWRhdGFSZWFkID0gMDsKKworCW92YWwgJj0gfjB4ZjsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsIHwgQkJfSE9TVF9CQU5HX0VOICk7IHVkZWxheSg0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsICk7IHVkZWxheSg1KTsKKworCXJ3ID0gMDsKKworCW1hc2sgPSAobG93MmhpZ2gpID8gMHgwMSA6ICgoKHUzMikweDAxKTw8KDMyLTEpKTsKKwlmb3IoaSA9IDA7IGkgPCB3TGVuZ3RoLzI7IGkrKykKKwl7CisJCWJpdCA9ICgoZGF0YTJXcml0ZSZtYXNrKSAhPSAwKSA/IDEgOiAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0fG92YWwgfCBydyk7IHVkZWxheSgxKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0fG92YWwgfCBCQl9IT1NUX0JBTkdfQ0xLIHwgcncpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXR8b3ZhbCB8IEJCX0hPU1RfQkFOR19DTEsgfCBydyk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKTogKG1hc2s+PjEpOworCisJCWlmKGkgPT0gMikKKwkJeworCQkJcncgPSBCQl9IT1NUX0JBTkdfUlc7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0fG92YWwgfCBCQl9IT1NUX0JBTkdfQ0xLIHwgcncpOyB1ZGVsYXkoMik7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0fG92YWwgfCBydyk7IHVkZWxheSgyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYml0ID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMTogMDsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbHxiaXR8cnd8IEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfGJpdHxyd3wgQkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbHwgYml0IHxydyk7IHVkZWxheSgxKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKSA6IChtYXNrPj4xKTsKKwl9CisKKwkvL3R3cmVnLnN0cnVjLmNsayA9IDA7CisJLy90d3JlZy5zdHJ1Yy5kYXRhID0gMDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgcnd8b3ZhbCk7IHVkZWxheSgyKTsKKwltYXNrID0gKGxvdzJoaWdoKSA/IDB4MDEgOiAoKCh1MzIpMHgwMSkgPDwgKDEyLTEpKTsKKworCS8vIFdlIG11c3Qgc2V0IGRhdGEgcGluIHRvIEhXIGNvbnRyb2xlZCwgb3RoZXJ3aXNlIFJGIGNhbid0IGRyaXZlciBpdCBhbmQKKwkvLyB2YWx1ZSBSRiByZWdpc3RlciB3b24ndCBiZSBhYmxlIHRvIHJlYWQgYmFjayBwcm9wZXJseS4gMjAwNi4wNi4xMywgYnkgcmNuamtvLgorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAob3ZhbDIgJiAofjB4MDEpKSk7CisKKwlmb3IoaSA9IDA7IGkgPCByTGVuZ3RoOyBpKyspCisJeworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgcnd8b3ZhbCk7IHVkZWxheSgxKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgcnd8b3ZhbHxCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgcnd8b3ZhbHxCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgcnd8b3ZhbHxCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCQl0bXAgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zSW5wdXQpOworCisJCWRhdGFSZWFkIHw9ICh0bXAgJiBCQl9IT1NUX0JBTkdfQ0xLID8gbWFzayA6IDApOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAocnd8b3ZhbCkpOyB1ZGVsYXkoMik7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSkgOiAobWFzaz4+MSk7CisJfQorCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIEJCX0hPU1RfQkFOR19FTnxCQl9IT1NUX0JBTkdfUld8b3ZhbCk7IHVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCBvdmFsMik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIG92YWwzKTsgICAvLyBTZXQgVG8gU1cgU3dpdGNoCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4M2EwKTsKKworCXJldHVybiBkYXRhUmVhZDsKKworfQorI2lmIDAKK3ZvaWQgd3JpdGVfcnRsODIyNShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKQoreworCWludCBpOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGEgPSAoZGF0YSA8PCA0KSB8IChhZHIgJiAweGYpOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCW91dCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpICYgMHhmZmYzOworCisJd3JpdGVfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSwKKwkJKHJlYWRfbmljX3dvcmQoZGV2LFJGUGluc0VuYWJsZSkgfCAweDcpKTsKKworCXNlbGVjdCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IDB4NyB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOICk7Ly98IDB4MWZmZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisKKwlmb3IoaT0xNTsgaT49MDtpLS0peworCisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQlpLS07CisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKworCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyA0IDogQkJfSE9TVF9CQU5HX0VOKSk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCW1kZWxheSgyKTsKKwllbHNlCisJCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKK30KKworI2VuZGlmCitzaG9ydCBydGw4MjI1X2lzX1ZfejIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCB2ejIgPSAxOworCS8vaW50IGk7CisJLyogc3cgdG8gcmVnIHBnIDEgKi8KKwkvL3dyaXRlX3J0bDgyMjUoZGV2LCAwLCAweDFiNyk7CisJLy93cml0ZV9ydGw4MjI1KGRldiwgMCwgMHgwYjcpOworCisJLyogcmVnIDggcGcgMSA9IDIzKi8KKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlJGIFJpZ2lzdGVyczpcbiIpOworI2lmIDAKKwlmb3IoaSA9IDA7IGkgPD0gMHhmOyBpKyspCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiUwOHgsIiwgcmVhZF9ydGw4MjI1KGRldiwgaSkpOworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAicmVnWzldQHBnMSA9IDB4JXhcbiIsIHJlYWRfcnRsODIyNShkZXYsIDB4MEYpKTsKKworLy8JcHJpbnRrKEtFUk5fV0FSTklORyAiUkY6XG4iKTsKKyNlbmRpZgorCWlmKCByZWFkX3J0bDgyMjUoZGV2LCA4KSAhPSAweDU4OCkKKwkJdnoyID0gMDsKKworCWVsc2UJLyogcmVnIDkgcGcgMSA9IDI0ICovCisJCWlmKCByZWFkX3J0bDgyMjUoZGV2LCA5KSAhPSAweDcwMCkKKwkJCXZ6MiA9IDA7CisKKwkvKiBzdyBiYWNrIHRvIHBnIDAgKi8KKwl3cml0ZV9ydGw4MjI1KGRldiwgMCwgMHhiNyk7CisKKwlyZXR1cm4gdnoyOworCit9CisKKyNpZiAwCit2b2lkIHJ0bDgyMjVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDFmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09GRik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT0ZGKTsKK30KKyNlbmRpZgorI2lmIDAKK3Nob3J0IHJ0bDgyMjVfcmZfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgc2VucykKK3sKKwlpZiAoc2VucyA8MCB8fCBzZW5zID4gNikgcmV0dXJuIC0xOworCisJaWYoc2VucyA+IDQpCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDBjLCAweDg1MCk7CisJZWxzZQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgwYywgMHg1MCk7CisKKwlzZW5zPSA2LXNlbnM7CisJcnRsODIyNV9zZXRfZ2FpbihkZXYsIHNlbnMpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIHJ0bDgyMjVfdGhyZXNob2xkW3NlbnNdKTsKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmCisKKwordm9pZCBydGw4MjI1ejJfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgxZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNXoyX0FOQVBBUkFNX09GRik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNXoyX0FOQVBBUkFNMl9PRkYpOworfQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCU1hcCBkQm0gaW50byBUeCBwb3dlciBpbmRleCBhY2NvcmRpbmcgdG8KKy8vCQljdXJyZW50IEhXIG1vZGVsLCBmb3IgZXhhbXBsZSwgUkYgYW5kIFBBLCBhbmQKKy8vCQljdXJyZW50IHdpcmVsZXNzIG1vZGUuCisvLworczgKK0RibVRvVHhQd3JJZHgoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYsCisJV0lSRUxFU1NfTU9ERQlXaXJlbGVzc01vZGUsCisJczMyCQkJUG93ZXJJbkRibQorCSkKK3sKKyAJYm9vbCBiVXNlRGVmYXVsdCA9IHRydWU7CisJczggVHhQd3JJZHggPSAwOworCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vCisJLy8gMDcxMDExLCBTRDMgU1k6CisJLy8gT0ZETSBQb3dlciBpbiBkQm0gPSBJbmRleCAqIDAuNSArIDAKKwkvLyBDQ0sgUG93ZXIgaW4gZEJtID0gSW5kZXggKiAwLjI1ICsgMTMKKwkvLworCWlmKHByaXYtPmNhcmRfODE4NSA+PSBWRVJTSU9OXzgxODdTX0IpCisJeworCQlzMzIgdG1wID0gMDsKKworCQlpZihXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKQorCQl7CisJCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQkJdG1wID0gKDIgKiBQb3dlckluRGJtKTsKKworCQkJaWYodG1wIDwgMCkKKwkJCQlUeFB3cklkeCA9IDA7CisJCQllbHNlIGlmKHRtcCA+IDQwKSAvLyA0MCBtZWFucyAyMCBkQm0uCisJCQkJVHhQd3JJZHggPSA0MDsKKwkJCWVsc2UKKwkJCQlUeFB3cklkeCA9IChzOCl0bXA7CisJCX0KKwkJZWxzZSBpZihXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKQorCQl7CisJCQliVXNlRGVmYXVsdCA9IGZhbHNlOworCQkJdG1wID0gKDQgKiBQb3dlckluRGJtKSAtIDUyOworCisJCQlpZih0bXAgPCAwKQorCQkJCVR4UHdySWR4ID0gMDsKKwkJCWVsc2UgaWYodG1wID4gMjgpIC8vIDI4IG1lYW5zIDIwIGRCbS4KKwkJCQlUeFB3cklkeCA9IDI4OworCQkJZWxzZQorCQkJCVR4UHdySWR4ID0gKHM4KXRtcDsKKwkJfQorCX0KKyNlbmRpZgorCisJLy8KKwkvLyBUUlVFIGlmIHdlIHdhbnQgdG8gdXNlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KKwkvLyBXZSBzaGFsbCBzZXQgaXQgdG8gRkFMU0Ugd2hlbiB3ZSBoYXZlIGV4YWN0IHRyYW5zbGF0aW9uIGZvcm11bGFyCisJLy8gZm9yIHRhcmdldCBJQy4gMDcwNjIyLCBieSByY25qa28uCisJLy8KKwlpZihiVXNlRGVmYXVsdCkKKwl7CisJCWlmKFBvd2VySW5EYm0gPCAwKQorCQkJVHhQd3JJZHggPSAwOworCQllbHNlIGlmKFBvd2VySW5EYm0gPiAzNSkKKwkJCVR4UHdySWR4ID0gMzU7CisJCWVsc2UKKwkJCVR4UHdySWR4ID0gKHU4KVBvd2VySW5EYm07CisJfQorCisJcmV0dXJuIFR4UHdySWR4OworfQorI2VuZGlmCisKK3ZvaWQgcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKy8vCWludCBHYWluSWR4OworLy8JaW50IEdhaW5TZXR0aW5nOworCS8vaW50IGk7CisJLy91OCBwb3dlcjsKKwkvL3U4ICpjY2tfcG93ZXJfdGFibGU7CisJdTggbWF4X2Nja19wb3dlcl9sZXZlbDsKKwkvL3U4IG1pbl9jY2tfcG93ZXJfbGV2ZWw7CisJdTggbWF4X29mZG1fcG93ZXJfbGV2ZWw7CisJdTggbWluX29mZG1fcG93ZXJfbGV2ZWw7CisvLwl1OCBjY2tfcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07Ly8tYnkgYW15IDA4MDMxMgorLy8JdTggb2ZkbV9wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdOy8vLWJ5IGFteSAwODAzMTIKKwljaGFyIGNja19wb3dlcl9sZXZlbCA9IChjaGFyKSgweGZmICYgcHJpdi0+Y2h0eHB3cltjaF0pOy8vK2J5IGFteSAwODAzMTIKKwljaGFyIG9mZG1fcG93ZXJfbGV2ZWwgPSAoY2hhcikoMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF0pOy8vK2J5IGFteSAwODAzMTIKKyNpZiAwCisJLy8KKwkvLyBDQ1ggMiBTMzEsIEFQIGNvbnRyb2wgb2YgY2xpZW50IHRyYW5zbWl0IHBvd2VyOgorCS8vIDEuIFdlIHNoYWxsIG5vdCBleGNlZWQgQ2VsbCBQb3dlciBMaW1pdCBhcyBwb3NzaWJsZSBhcyB3ZSBjYW4uCisJLy8gMi4gVG9sZXJhbmNlIGlzICsvLSA1ZEIuCisJLy8gMy4gODAyLjExaCBQb3dlciBDb250cmFpbnQgdGFrZXMgaGlnaGVyIHByZWNlZGVuY2Ugb3ZlciBDQ1ggQ2VsbCBQb3dlciBMaW1pdC4KKwkvLworCS8vIFRPRE86CisJLy8gMS4gODAyLjExaCBwb3dlciBjb250cmFpbnQKKwkvLworCS8vIDA3MTAxMSwgYnkgcmNuamtvLgorCS8vCisJaWYoCXByaXYtPk9wTW9kZSA9PSBSVF9PUF9NT0RFX0lORlJBU1RSVUNUVVJFICYmCisJCXByaXYtPmJXaXRoQ2N4Q2VsbFB3ciAmJgorCQljaCA9PSBwcml2LT5kb3QxMUN1cnJlbnRDaGFubmVsTnVtYmVyKQorCXsKKwkJdTggQ2NrQ2VsbFB3cklkeCA9IERibVRvVHhQd3JJZHgoZGV2LCBXSVJFTEVTU19NT0RFX0IsIHBNZ250SW5mby0+Q2N4Q2VsbFB3cik7CisJCXU4IE9mZG1DZWxsUHdySWR4ID0gRGJtVG9UeFB3cklkeChkZXYsIFdJUkVMRVNTX01PREVfRywgcE1nbnRJbmZvLT5DY3hDZWxsUHdyKTsKKworCQlwcmludGsoIkNDWCBDZWxsIExpbWl0OiAlZCBkQm0gPT4gQ0NLIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkJcHJpdi0+Q2N4Q2VsbFB3ciwgQ2NrQ2VsbFB3cklkeCwgT2ZkbUNlbGxQd3JJZHgpOworCQlwcmludGsoIkVFUFJPTSBjaGFubmVsKCVkKSA9PiBDQ0sgVHggcG93ZXIgaW5kZXg6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwKKwkJCWNoYW5uZWwsIENja1R4UHdySWR4LCBPZmRtVHhQd3JJZHgpOworCisJCWlmKGNja19wb3dlcl9sZXZlbCA+IENja0NlbGxQd3JJZHgpCisJCQljY2tfcG93ZXJfbGV2ZWwgPSBDY2tDZWxsUHdySWR4OworCQlpZihvZmRtX3Bvd2VyX2xldmVsID4gT2ZkbUNlbGxQd3JJZHgpCisJCQlvZmRtX3Bvd2VyX2xldmVsID0gT2ZkbUNlbGxQd3JJZHg7CisKKwkJcHJpbnRrKCJBbHRlcmVkIENDSyBUeCBwb3dlciBpbmRleCA6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwKKwkJCUNja1R4UHdySWR4LCBPZmRtVHhQd3JJZHgpOworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKHByaXYtPmllZWU4MDIxMSkgJiYKKwkJSVNfRE9UMTFEX1NUQVRFX0RPTkUocHJpdi0+aWVlZTgwMjExKSApCisJeworCQkvL1BSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpOworCQl1OCBNYXhUeFB3ckluRGJtID0gRE9UMTFEX0dldE1heFR4UHdySW5EYm0ocHJpdi0+aWVlZTgwMjExLCBjaCk7CisJCXU4IENja01heFB3cklkeCA9IERibVRvVHhQd3JJZHgocHJpdiwgV0lSRUxFU1NfTU9ERV9CLCBNYXhUeFB3ckluRGJtKTsKKwkJdTggT2ZkbU1heFB3cklkeCA9IERibVRvVHhQd3JJZHgocHJpdiwgV0lSRUxFU1NfTU9ERV9HLCBNYXhUeFB3ckluRGJtKTsKKworCQkvL3ByaW50aygiTWF4IFR4IFBvd2VyIGRCbSAoJWQpID0+IENDSyBUeCBwb3dlciBpbmRleCA6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwgTWF4VHhQd3JJbkRibSwgQ2NrTWF4UHdySWR4LCBPZmRtTWF4UHdySWR4KTsKKworCQkvL3ByaW50aygiRUVQUk9NIGNoYW5uZWwoJWQpID0+IENDSyBUeCBwb3dlciBpbmRleDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAorCQkvLwljaCwgY2NrX3Bvd2VyX2xldmVsLCBvZmRtX3Bvd2VyX2xldmVsKTsKKworCQlpZihjY2tfcG93ZXJfbGV2ZWwgPiBDY2tNYXhQd3JJZHgpCisJCQljY2tfcG93ZXJfbGV2ZWwgPSBDY2tNYXhQd3JJZHg7CisJCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiBPZmRtTWF4UHdySWR4KQorCQkJb2ZkbV9wb3dlcl9sZXZlbCA9IE9mZG1NYXhQd3JJZHg7CisJfQorCisJLy9wcml2LT5DdXJyZW50Q2NrVHhQd3JJZHggPSBjY2tfcG93ZXJfbGV2ZWw7CisJLy9wcml2LT5DdXJyZW50T2ZkbVR4UHdySWR4ID0gb2ZkbV9wb3dlcl9sZXZlbDsKKyNlbmRpZgorCisJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDE1OworCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMjU7IC8vICAxMiAtPiAyNQorCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMTA7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisKKwlpZihjY2tfcG93ZXJfbGV2ZWwgPiAzNSkKKwl7CisJCWNja19wb3dlcl9sZXZlbCA9IDM1OworCX0KKwkvLworCS8vIFNldCB1cCBDQ0sgVFhBR0MuIHN1Z2dlc3RlZCBieSBTRDMgU1kuCisJLy8KKyAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgKFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbKHU4KWNja19wb3dlcl9sZXZlbF0pICk7CisgICAgICAgLy9wcmludGsoIkNDSyBUWCBwb3dlciBpcyAleFxuIiwgKFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbY2NrX3Bvd2VyX2xldmVsXSkpOworICAgICAgIGZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworI2Vsc2UKKworCS8qIENDSyBwb3dlciBzZXR0aW5nICovCisJaWYoY2NrX3Bvd2VyX2xldmVsID4gbWF4X2Nja19wb3dlcl9sZXZlbCkKKwkJY2NrX3Bvd2VyX2xldmVsID0gbWF4X2Nja19wb3dlcl9sZXZlbDsKKworCWNja19wb3dlcl9sZXZlbCArPSBwcml2LT5jY2tfdHhwd3JfYmFzZTsKKworCWlmKGNja19wb3dlcl9sZXZlbCA+IDM1KQorCQljY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKworCWlmKGNoID09IDE0KQorCQljY2tfcG93ZXJfdGFibGUgPSBydGw4MjI1ejJfdHhfcG93ZXJfY2NrX2NoMTQ7CisJZWxzZQorCQljY2tfcG93ZXJfdGFibGUgPSBydGw4MjI1ejJfdHhfcG93ZXJfY2NrOworCisKKwlmb3IoaT0wO2k8ODtpKyspeworCisJCXBvd2VyID0gY2NrX3Bvd2VyX3RhYmxlW2ldOworCQl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCArIGksIHBvd2VyKTsKKwl9CisKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9DQ0ssIHBvd2VyKTsKKwkvLzIwMDUuMTEuMTcsCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbKHU4KWNja19wb3dlcl9sZXZlbF0pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisjZW5kaWYKKyNlbmRpZgorCS8qIE9GRE0gcG93ZXIgc2V0dGluZyAqLworLy8gIE9sZDoKKy8vCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiBtYXhfb2ZkbV9wb3dlcl9sZXZlbCkKKy8vCQlvZmRtX3Bvd2VyX2xldmVsID0gMzU7CisvLwlvZmRtX3Bvd2VyX2xldmVsICs9IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworLy8gIExhdGVzdDoKKy8qCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiAobWF4X29mZG1fcG93ZXJfbGV2ZWwgLSBtaW5fb2ZkbV9wb3dlcl9sZXZlbCkpCisJCW9mZG1fcG93ZXJfbGV2ZWwgPSBtYXhfb2ZkbV9wb3dlcl9sZXZlbDsKKwllbHNlCisJCW9mZG1fcG93ZXJfbGV2ZWwgKz0gbWluX29mZG1fcG93ZXJfbGV2ZWw7CisKKwlvZmRtX3Bvd2VyX2xldmVsICs9IHByaXYtPm9mZG1fdHhwd3JfYmFzZTsKKyovCisJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IDM1KQorCQlvZmRtX3Bvd2VyX2xldmVsID0gMzU7CisKKy8vCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsUlRMODIyNV9BTkFQQVJBTTJfT04pOworCisJLy9ydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBBTkFQQVJNMl9BU0lDX09OKTsKKworCWlmIChwcml2LT51cCA9PSAwKSB7CisJCS8vbXVzdCBhZGQgdGhlc2UgZm9yIHJ0bDgxODVCIGRvd24sIHhpb25nLTIwMDYtMTEtMjEKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDIsMHg0Mik7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw1LDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsNiwweDQwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDcsMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw4LDB4NDApOworCX0KKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX09GRE0sIG9mZG1fcG93ZXJfbGV2ZWwpOworCS8vMjAwNS4xMS4xNywKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisgICAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpb2ZkbV9wb3dlcl9sZXZlbF0pOworI2Vsc2UKKyAgICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCBaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HWyh1OClvZmRtX3Bvd2VyX2xldmVsXSoyKTsKKyNlbmRpZgorICAgICAgICBpZihvZmRtX3Bvd2VyX2xldmVsPD0xMSkKKyAgICAgICAgeworLy8gICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNWM4Nyk7CisvLyAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1Yzg5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDcsMHg1Yyk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA5LDB4NWMpOworICAgICAgICB9CisJaWYob2ZkbV9wb3dlcl9sZXZlbDw9MTcpCisgICAgICAgIHsKKy8vICAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1NDg3KTsKKy8vICAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1NDg5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDcsMHg1NCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA5LDB4NTQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDUwODcpOworLy8gICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDUwODkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwNywweDUwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDksMHg1MCk7CisgICAgICAgIH0KKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworfQorI2lmIDAKKy8qIHN3aXRjaCBiZXR3ZWVuIG1vZGUgQiBhbmQgRyAqLwordm9pZCBydGw4MjI1X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IG1vZGViKQoreworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgKG1vZGViID8gMHgwIDogMHg0MCkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgKG1vZGViID8gMHgwIDogMHg0MCkpOworfQorI2VuZGlmCisKK3ZvaWQgcnRsODIyNXoyX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworLyoKKwlzaG9ydCBnc2V0ID0gKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlODAyMTFfaXNfNTRnKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkgfHwKKwkJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUjsKKyovCisJcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKKworCVJGX1dyaXRlUmVnKGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hdKTsKKworCS8vWUosYWRkLDA4MDgyOCwgaWYgc2V0IGNoYW5uZWwgZmFpbGVkLCB3cml0ZSBhZ2FpbgorCWlmKChSRl9SZWFkUmVnKGRldiwgMHg3KSAmIDB4MEY4MCkgIT0gcnRsODIyNV9jaGFuW2NoXSkKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hdKTsKKwl9CisKKwltZGVsYXkoMSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxMCk7CisvL2RlbGV0ZWQgYnkgRGF2aWQgOiAyMDA2LzgvOQorI2lmIDAKKwl3cml0ZV9uaWNfYnl0ZShkZXYsU0lGUywweDIyKTsvLyBTSUZTOiAweDIyCisKKwlpZihnc2V0KQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUywyMCk7IC8vRElGUzogMjAKKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldixESUZTLDB4MjQpOyAvL0RJRlM6IDM2CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4OSk7IC8vU0xPVDogOQorCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDE0KTsgLy9TTE9UOiAyMCAoMHgxNCkKKworCisJaWYoZ3NldCl7CisJCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDkxIC0gMjApOyAvLyBFSUZTOiA5MSAoMHg1QikKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENXX1ZBTCwweDczKTsgLy9DVyBWQUxVRTogMHgzNworCQkvL0RNRVNHKCJ1c2luZyBHIG5ldCBwYXJhbXMiKTsKKwl9ZWxzZXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsOTEgLSAweDI0KTsgLy8gRUlGUzogOTEgKDB4NUIpCisJCXdyaXRlX25pY19ieXRlKGRldixDV19WQUwsMHhhNSk7IC8vQ1cgVkFMVUU6IDB4MzcKKwkJLy9ETUVTRygidXNpbmcgQiBuZXQgcGFyYW1zIik7CisJfQorI2VuZGlmCisKK30KKyNpZiAwCit2b2lkIHJ0bDgyMjVfaG9zdF9wY2lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDQ4MCk7CisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwkvL2lmKHByaXYtPmNhcmRfODE4NSA9PSAyICYmIHByaXYtPmVuYWJsZV9ncGlvMCApIC8qIHZlcnNpb24gRCAqLworCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODgpOworCS8vZWxzZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDg4IHwgU1dfQ09OVFJPTF9HUElPKTsgLyogMHg0ODggfCBTV19DT05UUk9MX0dQSU8gKi8KKworCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLCAwKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDIwMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEdQX0VOQUJMRSwgMHhmZiAmICh+KDE8PDYpKSk7IC8qIGJpdCA2IGlzIGZvciBSRiBvbi9vZmYgZGV0ZWN0aW9uICovCisKKworfQorCit2b2lkIHJ0bDgyMjVfaG9zdF91c2JfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX25pY19ieXRlKGRldixSRlBpbnNTZWxlY3QrMSwwKTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUElPLDApOworCisJd3JpdGVfbmljX2J5dGVfRShkZXYsMHg1MyxyZWFkX25pY19ieXRlX0UoZGV2LDB4NTMpIHwgKDE8PDcpKTsKKworCXdyaXRlX25pY19ieXRlKGRldixSRlBpbnNTZWxlY3QrMSw0KTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUElPLDB4MjApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LEdQX0VOQUJMRSwwKTsKKworCisJLyogQ29uZmlnIEJCICYgUkYgKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHg4MCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4MCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHg4MCk7CisKKworCW1kZWxheSgxMDApOworCisJbWRlbGF5KDEwMDApOworCit9CisjZW5kaWYKK3ZvaWQgcnRsODIyNXoyX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGk7CisJc2hvcnQgY2hhbm5lbCA9IDE7CisJdTE2CWJyc3I7CisJdTMyCWRhdGEsYWRkcjsKKworCXByaXYtPmNoYW4gPSBjaGFubmVsOworCisvLwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjVfQU5BUEFSQU1fT04pOworCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQlydGw4MjI1X2hvc3RfdXNiX2luaXQoZGV2KTsKKwllbHNlCisJCXJ0bDgyMjVfaG9zdF9wY2lfaW5pdChkZXYpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGE4MDA4KTsKKworCWJyc3IgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4ZmZmZik7CisKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQ0KTsKKworCSNpZiAxICAvLzAtPjEKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAweDQ0KTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisJI2VuZGlmCisKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworLy8JCW1kZWxheSgxMDAwKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MmJmKTsgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgxLCAweGVlMCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MywgMHg0NDEpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4OGMzKTttZGVsYXkoMSk7CisKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhjNzIpO21kZWxheSgxKTsKKy8vCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDYsIDB4ZTYpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKT8gMHg4MmEgOiBydGw4MjI1X2NoYW5bY2hhbm5lbF0pKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDgsIDB4M2YpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4OSwgMHgzMzUpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YSwgMHg5ZDQpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YiwgMHg3YmIpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4YywgMHg4NTApOyAgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhkLCAweGNkZik7ICAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZSwgMHgyYik7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhmLCAweDExNCk7CisKKworCW1kZWxheSgxMDApOworCisKKwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpIC8qIG1heWJlIG5vdCBuZWVkZWQgZXZlbiBmb3IgODE4NSAqLworLy8Jd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4MWI3KTsKKworCWZvcihpPTA7aTw5NTtpKyspeworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgxLCAodTgpKGkrMSkpOworCisJCSNpZiAwCisJCWlmKHByaXYtPnBoeV92ZXIgPT0gMSkKKwkJCS8qIHZlcnNpb24gQSAqLworCQkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgcnRsODIyNWFfcnhnYWluW2ldKTsKKwkJZWxzZQorCQkjZW5kaWYKKwkJLyogdmVyc2lvbiBCICYgQyAmIEQqLworCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIHJ0bDgyMjV6Ml9yeGdhaW5baV0pOworCX0KKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgzLCAweDgwKTsKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweDQpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHhiNyk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweGM0ZCk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkvLwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMjAwKTsKKworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisKKwkvLwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMTAwKTsKKworCX0vL0VuZCBvZiBpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCS8qIEZJWE1FISEgcnRsODE4NyB3ZSBoYXZlIHRvIGNoZWNrIGlmIGNhbGlicmFyaW9uCisJICogaXMgc3VjY2Vzc2Z1bCBhbmQgZXZlbnR1YWxseSBjYWwuIGFnYWluIChyZXBlYXQKKwkgKiB0aGUgdHdvIHdyaXRlIG9uIHJlZyAyKQorCSovCisJLy8gQ2hlY2sgZm9yIGNhbGlicmF0aW9uIHN0YXR1cywgMjAwNS4xMS4xNywKKyAgICAgICAgZGF0YSA9IHJlYWRfcnRsODIyNShkZXYsIDYpOworICAgICAgICBpZiAoIShkYXRhJjB4MDAwMDAwODApKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVfcnRsODIyNShkZXYsIDB4MDIsIDB4MGM0ZCk7CisgICAgICAgICAgICAgICAgZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsgbWRlbGF5KDIwMCk7CisgICAgICAgICAgICAgICAgd3JpdGVfcnRsODIyNShkZXYsIDB4MDIsIDB4MDQ0ZCk7CisgICAgICAgICAgICAgICAgZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsgbWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWRfcnRsODIyNShkZXYsIDYpOworICAgICAgICAgICAgICAgIGlmICghKGRhdGEmMHgwMDAwMDA4MCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNRVNHVygiUkYgQ2FsaWJyYXRpb24gRmFpbGVkISEhIVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwkvL2ZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisKKwltZGVsYXkoMjAwKTsgLy8yMDAgZm9yIDgxODcKKworCisvLwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDdkKTsKKy8vCisvLwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKy8vCQltZGVsYXkoMTAwKTsKKy8vCisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworLy8JLy99CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDJiZik7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisJLy9zZXQgdXAgWkVCUkEgQUdDIHRhYmxlLCAyMDA1LjExLjE3LAorICAgICAgICBmb3IoaT0wO2k8MTI4O2krKyl7CisgICAgICAgICAgICAgICAgZGF0YSA9IHJ0bDgyMjVfYWdjW2ldOworCisgICAgICAgICAgICAgICAgYWRkciA9IGkgKyAweDgwOyAvL2VuYWJsZSB3cml0aW5nIEFHQyB0YWJsZQorICAgICAgICAgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCBkYXRhKTsKKworICAgICAgICAgICAgICAgIG1kZWxheSgxKTsKKyAgICAgICAgICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgYWRkcik7CisKKyAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIH0KKyNpZiAwCisJZm9yKGk9MDtpPDEyODtpKyspeworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgcnRsODIyNV9hZ2NbaV0pOworCisJCW1kZWxheSgxKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsICh1OClpKyAweDgwKTsKKworCQltZGVsYXkoMSk7CisJfQorI2VuZGlmCisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDEpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEsIDB4Mik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKT8gMHg0MiA6IDB4NjIpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgzLCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDQsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NSwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDgsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDksIDB4ZmUpOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg4KTsgbWRlbGF5KDEpOworCisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCS8vCX0KKwkvL30KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg4MCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhjLCAweDEpO21kZWxheSgxKTsKKworCisJLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhkLCAweDQzKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhlLCAweGQzKTttZGVsYXkoMSk7CisKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEpeworCQlpZihwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7Lyp2ZXIgQiovCisJCWVsc2UKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDI4KTsvKnZlciBDKi8KKwl9ZWxzZXsKKwkjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgzOCk7bWRlbGF5KDEpOworLyp2ZXIgRCAmIDgxODcqLworLy8JfQorCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEwLCAweDA0KTsvKnZlciBCKi8KKy8vCWVsc2UKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4ODQpO21kZWxheSgxKTsKKy8qdmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDcpO21kZWxheSgxKTsKKy8qYWdjIHJlc3AgdGltZSA3MDAqLworCisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAyKXsKKwkvKiBWZXIgRCAmIDgxODcqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDIwKTttZGVsYXkoMSk7CisKKyNpZiAwCisJfWVsc2V7CisJCS8qIFZlciBCICYgQyovCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDApOworCX0KKyNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDApOyBtZGVsYXkoMSk7CisKKy8vCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpO21kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE5LCAweDE5KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4MTUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYywgMHg0KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIDB4YzUpO21kZWxheSgxKTsgLy8yMDA1LjExLjE3LAorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDk1KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NzUpOwltZGVsYXkoMSk7CisKKy8vCX0KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMCwgMHgxZik7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDE3KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjIsIDB4MTYpO21kZWxheSgxKTsKKworLy8JaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIDB4ODApO21kZWxheSgxKTsgLy9GSVhNRSBtYXliZSBub3QgbmVlZGVkIC8vIDw+CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NDYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDAwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHg5MCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7IG1kZWxheSgxKTsKKworCisJLy8gPD4gU2V0IGluaXQuIGdhaW4gdG8gbTc0ZEJtLgorCisJcnRsODIyNXoyX3NldF9nYWluKGRldiw0KTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDAsIDB4OTgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MywgMHgyMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDdlKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDUsIDB4MTIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NiwgMHhmYyk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDcsIDB4NzgpO21kZWxheSgxKTsKKyAvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDgsIDB4MmUpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMHg5YjogMHg5MykpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOyBtZGVsYXkoMSk7CisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTMsIDB4OTgpOyAvKiBWZXIgQiAqLworCWVsc2UKKyNlbmRpZgorCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxOSwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYSwgMHhhMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOyAvKiBDQ0sgQ2FycmllciBTZW5zZSBUaHJlc2hvbGQgKi8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDhkKTttZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQyLCAweDE1KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsgbWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCwgMHgzNik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NSwgMHgzNSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NiwgMHgyZSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NywgMHgyNSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0OCwgMHgxYyk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0OSwgMHgxMik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YSwgMHg5KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRiLCAweDQpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGMsIDB4NSk7bWRlbGF5KDEpOworCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NWIsIDB4MGQpOyBtZGVsYXkoMSk7CisKKworCisvLyA8PgorLy8JLy8gVEVTVFIgMHhiIDgxODcKKy8vCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDkzKTsvLyAmIDB4ZmIpOworLy8KKy8vCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsIDB4NjIpOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDApOworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDApOworLy8JLy99CisKKwlydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKGRldiwgY2hhbm5lbCk7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworICAgICAgICB3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4ZGIgZm9yIEIgKi8KKyNlbHNlCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OWIpOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweGRiIGZvciBCICovCisjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweDEwIGZvciBCICovCisKKwlydGw4MTg1X3R4X2FudGVubmEoZGV2LCAweDMpOyAvKiBUWCBhbnQgQSwgMHgwIGZvciBCICovCisKKwkvKiBzd2l0Y2ggdG8gaGlnaC1zcGVlZCAzLXdpcmUKKwkgKiBsYXN0IGRpZ2l0LiAyIGZvciBib3RoIGNjayBhbmQgb2ZkbQorCSAqLworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOworCWVsc2V7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MTVjMDAwMDIpOworCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisJfQorCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorLy8JcnRsODIyNV9zZXRfZ2FpbihkZXYsIDQpOyAvKiBGSVhNRSB0aGlzICcxJyBpcyByYW5kb20gKi8gLy8gPD4KKy8vCSBydGw4MjI1X3NldF9tb2RlKGRldiwgMSk7IC8qIEZJWE1FIHN0YXJ0IGluIEIgbW9kZSAqLyAvLyA8PgorLy8KKy8vCS8qIG1ha2Ugc3VyZSBpcyB3YWtlbiB1cCEgKi8KKy8vCXdyaXRlX3J0bDgyMjUoZGV2LDB4NCwgMHg5ZmYpOworLy8JcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKy8vCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKworCXJ0bDgyMjVfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCS8vd3JpdGVfbmljX3dvcmQoZGV2LEJSU1IsYnJzcik7CisKKwkvL3J0bDgyMjV6Ml9yZl9zZXRfbW9kZShkZXYpOworfQorCit2b2lkIHJ0bDgyMjV6Ml9yZl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBJRUVFX0EpCisJeworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweDE4NjUpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDg0KTsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweGE4MDA4KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDYpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg5OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDcpOworCisJCXJ0bDgyMjV6Ml9zZXRfZ2FpbihkZXYsNCk7CisKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTUsIDB4NDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNywgMHg0MCk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwweDEwMDAwMDAwKTsKKwl9ZWxzZXsKKworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweDE4NjQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDQ0KTsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweGE4MDA4KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDYpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg5OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDcpOworCisJCXJ0bDgyMjV6Ml9zZXRfZ2FpbihkZXYsNCk7CisKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTUsIDB4NDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxNywgMHg0MCk7CisKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwweDA0MDAwMDAyKTsKKwl9Cit9CisKKy8vbHptIG1vZCAwODA4MjYKKy8vI2RlZmluZSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QiA2NAorLy8jZGVmaW5lIE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFIAk1CisjZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCIAkJMjAKKyNkZWZpbmUgTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UgCQkJMTAKKyNkZWZpbmUgTFBTX01BWF9TTEVFUF9XQUlUSU5HX1RJTUVTXzg3U0UgCTUKKworYm9vbAorU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJUlRfUkZfUE9XRVJfU1RBVEUJZVJGUG93ZXJTdGF0ZQorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQlidENSOTM0NiwgYnRDb25maWczOworCWJvb2wgYkFjdGlvbkFsbG93ZWQ9IHRydWUsIGJUdXJuT2ZmQkIgPSB0cnVlOy8vbHptIG1vZCAwODA4MjYKKwkvL3UzMgkJCURXb3JkQ29udGVudDsKKwl1OAkJCXUxYlRtcDsKKwlpbnQJCQlpOworCS8vdTE2CQkJdTJiVEZQQyA9IDA7CisJYm9vbAkJYlJlc3VsdCA9IHRydWU7CisJdTgJCQlRdWV1ZUlEOworCisJaWYocHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9PSB0cnVlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gdHJ1ZTsKKworCS8vIGVuYWJsZSBFRU0wIGFuZCBFRU0xIGluIDkzNDZDUgorCWJ0Q1I5MzQ2ID0gcmVhZF9uaWNfYnl0ZShkZXYsIENSOTM0Nik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIChidENSOTM0NnwweEMwKSApOworCS8vIGVuYWJsZSBQQVJNX0VuIGluIENvbmZpZzMKKwlidENvbmZpZzMgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAoYnRDb25maWczfENPTkZJRzNfUEFSTV9FbikgKTsKKworCXN3aXRjaCggcHJpdi0+cmZfY2hpcCApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCQlzd2l0Y2goIGVSRlBvd2VyU3RhdGUgKQorCQl7CisJCWNhc2UgZVJmT246CisJCQlSRl9Xcml0ZVJlZyhkZXYsMHg0LDB4OUZGKTsKKworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0sIEFOQVBBUk1fT04pOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0yLCBBTkFQQVJNMl9PTik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHNCwgcHJpdi0+UkZQcm9nVHlwZSk7CisKKwkJCS8vRm9sbG93IDg3QiwgSXNhaWFoIDIwMDctMDQtMjcKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiVG1wICYgKH4oQklUNXxCSVQ2KSkpICk7Ly8gMDcwMTI0IFNEMSBBbGV4OiB0dXJuIG9uIENDSyBhbmQgT0ZETS4KKwkJCWJyZWFrOworCisJCWNhc2UgZVJmU2xlZXA6CisJCQlicmVhazsKKworCQljYXNlIGVSZk9mZjoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQliUmVzdWx0ID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkZfWkVCUkE0OgorCQlzd2l0Y2goIGVSRlBvd2VyU3RhdGUgKQorCQl7CisJCWNhc2UgZVJmT246CisJCQkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1wb3dlciBvbkBqaWZmaWVzOiVkXG4iLGppZmZpZXMpOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEVDKTsKKworCQkJLy90dXJuIG9uIEFGRQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweDAwKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg2MiwgMHgwMCk7CisKKwkJCS8vbHptIG1vZCAwODA4MjYKKwkJCS8vdHVybiBvbiBSRgorCQkJLy9SRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDlmKTsgLy9tZGVsYXkoMSk7CisJCQkvL1JGX1dyaXRlUmVnKGRldiwgMHg0LCAweDA5NzIpOyAvL21kZWxheSgxKTsKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwOWYpOyB1ZGVsYXkoNTAwKTsKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDA5NzIpOyB1ZGVsYXkoNTAwKTsKKwkJCS8vdHVybiBvbiBSRiBhZ2Fpbiwgc3VnZ2VzdGVkIGJ5IFNEMyBzdGV2ZW5sLgorCQkJUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDA5Zik7IHVkZWxheSg1MDApOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDk3Mik7IHVkZWxheSg1MDApOworCisJCQkvL3R1cm4gb24gQkIKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg0MDkwKTsgLy9vZmRtIDEwPTAwCisvLwkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4NDA5Mik7IC8vb2ZkbSAxMj0wMAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTAsMHg0MCk7CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMiwweDQwKTsKKwkJCS8vQXZvaWQgcG93ZXIgZG93biBhdCBpbml0IHRpbWUuCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsIHByaXYtPlJGUHJvZ1R5cGUpOworCisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYlRtcCAmICh+KEJJVDV8QklUNikpKSApOworCisJCQlicmVhazsKKworCQljYXNlIGVSZlNsZWVwOgorCQkJLy8gTWFrZSBzdXJlIEJ1c3lRdWV1ZSBpcyBlbXB0eSBiZWZvciB0dXJuIG9mZiBSRkUgcHdvZXIuCisJCQkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1wb3dlciBzbGVlcEBqaWZmaWVzOiVkXG4iLGppZmZpZXMpOworCisJCQlmb3IoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgNjsgKQorCQkJeworCQkJCWlmKGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsUXVldWVJRCkgPT0gcHJpdi0+dHhyaW5nY291bnQpCisJCQkJeworCQkJCQlRdWV1ZUlEKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNpZiAwCQkvL3Jlc2VydmVkIGFteQorCQkJCWVsc2UgaWYocHJpdi0+TmRpc0FkYXB0ZXIuQ3VycmVudFBvd2VyU3RhdGUgIT0gTmRpc0RldmljZVN0YXRlRDApCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwgKCJlUmZTbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPTAgYnV0IGxvd2VyIHBvd2VyIHN0YXRlIVxuIiwgKHBNZ250SW5mby0+VHhQb2xsaW5nVGltZXMrMSksIFF1ZXVlSUQpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisJCQkJZWxzZS8vbHptIG1vZCAwODA4MjYKKwkJCQl7CisJCQkJCXByaXYtPlR4UG9sbGluZ1RpbWVzICsrOworCQkJCQlpZihwcml2LT5UeFBvbGxpbmdUaW1lcyA+PSBMUFNfTUFYX1NMRUVQX1dBSVRJTkdfVElNRVNfODdTRSkKKwkJCQkJCXsKKwkJCQkJCQkvL1JUX1RSQUNFKENPTVBfUE9XRVIsIERCR19XQVJOSU5HLCAoIlxuXG5cbiBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODVCKCk6ZVJmU2xlZXA6ICAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9IDAgISEhXG5cblxuIiwgTFBTX01BWF9TTEVFUF9XQUlUSU5HX1RJTUVTXzg3U0UsIFF1ZXVlSUQpKTsKKwkJCQkJCQliQWN0aW9uQWxsb3dlZD1mYWxzZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl1ZGVsYXkoMTApOyAgLy8gV2luZG93cyBtYXkgZGVsYXkgM34xNm1zIGFjdHVhbGx5LgorCQkJCQkJCS8vUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiZVJmU2xlZXA6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGJlZm9yZSBkb3plIVxuIiwgKHBNZ250SW5mby0+VHhQb2xsaW5nVGltZXMpLCBRdWV1ZUlEKSk7CisJCQkJCQl9CisJCQkJfQorCisJCQkJLy9sem0gZGVsIDA4MDgyNgorCQkJCS8vaWYoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QikKKwkJCQkvL3sKKwkJCQkJLy9wcmludGsoIlxuXG5cbiBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODVCKCk6ICVkIHRpbWVzIEJ1c3lRdWV1ZVslZF0gIT0gMCAhISFcblxuXG4iLCBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QiwgUXVldWVJRCk7CisJCQkJCS8vYnJlYWs7CisJCQkJLy99CisJCQl9CisKKwkJCWlmKGJBY3Rpb25BbGxvd2VkKS8vbHptIGFkZCAwODA4MjYKKwkJCXsKKwkJCQkvL3R1cm4gb2ZmIEJCIFJYSVEgbWF0cml4IHRvIGN1dCBvZmYgcnggc2lnbmFsCisvLwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDAwOTApOyAvL29mZG0gMTA9MDAKKy8vCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5Mik7IC8vb2ZkbSAxMj0wMAorCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEwLDB4MDApOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEyLDB4MDApOworCQkJCS8vdHVybiBvZmYgUkYKKwkJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwMDAwKTsgLy9tZGVsYXkoMSk7CisJCQkJUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDAwMCk7IC8vbWRlbGF5KDEpOworCQkJCS8vdHVybiBvZmYgQUZFIGV4Y2VwdCBQTEwKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NjIsIDB4ZmYpOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhlYyk7CisvLwkJCQltZGVsYXkoMTApOworCisjaWYgMQorCQkJCW1kZWxheSgxKTsKKwkJCQl7CisJCQkJCWludCBpID0gMDsKKwkJCQkJd2hpbGUgKHRydWUpCisJCQkJCXsKKwkJCQkJCXU4IHRtcDI0RiA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0Zik7CisJCQkJCQlpZiAoKHRtcDI0RiA9PSAweDAxKSB8fCAodG1wMjRGID09IDB4MDkpKQorCQkJCQkJeworCQkJCQkJCWJUdXJuT2ZmQkIgPSB0cnVlOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZS8vbHptIG1vZCAwODA4MjYKKwkJCQkJCXsKKwkJCQkJCQl1ZGVsYXkoMTApOworCQkJCQkJCWkrKzsKKwkJCQkJCQlwcml2LT5UeFBvbGxpbmdUaW1lcysrOworCisJCQkJCQkJaWYocHJpdi0+VHhQb2xsaW5nVGltZXMgPj0gTFBTX01BWF9TTEVFUF9XQUlUSU5HX1RJTUVTXzg3U0UpCisJCQkJCQkJeworCQkJCQkJCQkvL1JUX1RSQUNFKENPTVBfUE9XRVIsIERCR19XQVJOSU5HLCAoIlxuXG5cbiBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODVCKCk6IGVSZk9mZjogJWQgdGltZXMgUnggTWFjMHgyNEY9MHgleCAhISFcblxuXG4iLCBpLCB1MWJUbXAyNEYpKTsKKwkJCQkJCQkJYlR1cm5PZmZCQj1mYWxzZTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXVkZWxheSgxMCk7Ly8gV2luZG93cyBtYXkgZGVsYXkgM34xNm1zIGFjdHVhbGx5LgorCQkJCQkJCQkvL1JUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCgiKCVkKWVSZlNsZWVwLSB1MWJUbXAyNEY9IDB4JVhcbiIsIGksIHUxYlRtcDI0RikpOworCisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvL2x6bSBkZWwgMDgwODI2CisJCQkJCQkvL2lmIChpID4gTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UpCisJCQkJCQkvLwlicmVhazsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCWlmIChiVHVybk9mZkJCKS8vbHptIG1vZCAwODA4MjYKKwkJCQl7CisJCQkJLy90dXJuIG9mZiBCQgorCQkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0RSk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYlRtcHxCSVQ1fEJJVDYpKTsKKworCQkJCS8vdHVybiBvZmYgQUZFIFBMTAorCQkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweGVjKTsKKwkJCQkvL3dyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBlYyk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweEZDKTsgIC8vW0VDU10gRkMtPiBFQy0+RkMsIGFza2VkIGJ5IFNEMyBTdGV2ZW5sCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEZDKTsvL1tFQ1NdIEZDLT4gRUMtPkZDLCBhc2tlZCBieSBTRDMgU3RldmVubAorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgZVJmT2ZmOgorCQkJLy8gTWFrZSBzdXJlIEJ1c3lRdWV1ZSBpcyBlbXB0eSBiZWZvciB0dXJuIG9mZiBSRkUgcHdvZXIuCisJCQkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1wb3dlciBvZmZAamlmZmllczolZFxuIixqaWZmaWVzKTsKKwkJCWZvcihRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCA2OyApCisJCQl7CisJCQkJaWYoZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixRdWV1ZUlEKSA9PSBwcml2LT50eHJpbmdjb3VudCkKKwkJCQl7CisJCQkJCVF1ZXVlSUQrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2lmIDAKKwkJCQllbHNlIGlmKEFkYXB0ZXItPk5kaXNBZGFwdGVyLkN1cnJlbnRQb3dlclN0YXRlICE9IE5kaXNEZXZpY2VTdGF0ZUQwKQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPTAgYnV0IGxvd2VyIHBvd2VyIHN0YXRlIVxuIiwgKGkrMSksIFF1ZXVlSUQpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJaSsrOworCQkJCX0KKworCQkJCWlmKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIpCisJCQkJeworCQkJCQkvL3ByaW50aygiXG5cblxuIFNldFplYnJhUkZQb3dlclN0YXRlODE4NUIoKTogJWQgdGltZXMgQnVzeVF1ZXVlWyVkXSAhPSAwICEhIVxuXG5cbiIsIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCLCBRdWV1ZUlEKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvL3R1cm4gb2ZmIEJCIFJYSVEgbWF0cml4IHRvIGN1dCBvZmYgcnggc2lnbmFsCisvLwkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MDA5MCk7IC8vb2ZkbSAxMD0wMAorLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDAwOTIpOyAvL29mZG0gMTI9MDAKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEwLDB4MDApOworCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTIsMHgwMCk7CisJCQkvL3R1cm4gb2ZmIFJGCisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwMDAwKTsgLy9tZGVsYXkoMSk7CisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDAwKTsgLy9tZGVsYXkoMSk7CisJCQkvL3R1cm4gb2ZmIEFGRSBleGNlcHQgUExMCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NjIsIDB4ZmYpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweGVjKTsKKy8vCQkJbWRlbGF5KDEwKTsKKyNpZiAxCisJCQltZGVsYXkoMSk7CisJCQl7CisJCQkJaW50IGkgPSAwOworCQkJCXdoaWxlICh0cnVlKQorCQkJCXsKKwkJCQkJdTggdG1wMjRGID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRmKTsKKwkJCQkJaWYgKCh0bXAyNEYgPT0gMHgwMSkgfHwgKHRtcDI0RiA9PSAweDA5KSkKKwkJCQkJeworCQkJCQkJYlR1cm5PZmZCQiA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWJUdXJuT2ZmQkIgPSBmYWxzZTsKKwkJCQkJCXVkZWxheSgxMCk7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQkJaWYgKGkgPiBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJaWYgKGJUdXJuT2ZmQkIpLy9sem0gbW9kIDA4MDgyNgorCQkJeworCisJCQkvL3R1cm4gb2ZmIEJCCisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYlRtcHxCSVQ1fEJJVDYpKTsKKwkJCS8vdHVybiBvZmYgQUZFIFBMTCAoODBNKQorCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworCQkJLy93cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwZWMpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweEZDKTsgLy9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBGQyk7IC8vW0VDU10gRkMtPiBFQy0+RkMsIGFza2VkIGJ5IFNEMyBTdGV2ZW5sCisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQliUmVzdWx0ID0gZmFsc2U7CisJCQlwcmludGsoIlNldFplYnJhUkZQb3dlclN0YXRlODE4NSgpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCS8vIGRpc2FibGUgUEFSTV9FbiBpbiBDb25maWczCisJYnRDb25maWczICY9IH4oQ09ORklHM19QQVJNX0VuKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGJ0Q29uZmlnMyk7CisJLy8gZGlzYWJsZSBFRU0wIGFuZCBFRU0xIGluIDkzNDZDUgorCWJ0Q1I5MzQ2ICY9IH4oMHhDMCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIGJ0Q1I5MzQ2KTsKKworCWlmKGJSZXN1bHQgJiYgYkFjdGlvbkFsbG93ZWQpLy9sem0gbW9kIDA4MDgyNgorCXsKKwkJLy8gVXBkYXRlIGN1cnJlbnQgUkYgc3RhdGUgdmFyaWFibGUuCisJCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUkZQb3dlclN0YXRlOworI2lmIDAKKwkJc3dpdGNoKHByaXYtPmVSRlBvd2VyU3RhdGUpCisJCXsKKwkJY2FzZSBlUmZPZmY6CisJCQkvLworCQkJLy9JZiBSZiBvZmYgcmVhc29uIGlzIGZyb20gSVBTLCBMZWQgc2hvdWxkIGJsaW5rIHdpdGggbm8gbGluaywgYnkgTWFkZGVzdCAwNzEwMTUKKwkJCS8vCisJCQlpZihwcml2LT5SZk9mZlJlYXNvbj09UkZfQ0hBTkdFX0JZX0lQUyApCisJCQl7CisJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLExFRF9DVExfTk9fTElOSyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVHVybiBvZmYgTEVEIGlmIFJGIGlzIG5vdCBPTi4KKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfUE9XRVJfT0ZGKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgZVJmT246CisJCQkvLyBUdXJuIG9uIFJGIHdlIGFyZSBzdGlsbCBsaW5rZWQsIHdoaWNoIG1pZ2h0IGhhcHBlbiB3aGVuCisJCQkvLyB3ZSBxdWlja2x5IHR1cm4gb2ZmIGFuZCBvbiBIVyBSRi4gMjAwNi4wNS4xMiwgYnkgcmNuamtvLgorCQkJaWYoIHBNZ250SW5mby0+Yk1lZGlhQ29ubmVjdCA9PSBUUlVFICkKKwkJCXsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfTElOSyk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLy8gZG8gbm90aGluZy4KKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCX0KKworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCXJldHVybiAoYlJlc3VsdCAmJiBiQWN0aW9uQWxsb3dlZCkgOworfQordm9pZCBydGw4MjI1ejRfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvLworCS8vIFR1cm4gb2ZmIFJGIHBvd2VyLgorCS8vCisJLy9wcmludGsoIj09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZTbGVlcCwgUkZfQ0hBTkdFX0JZX1BTKTsKKwkvL21kZWxheSgyKTsJLy9GSVhNRQorfQordm9pZCBydGw4MjI1ejRfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy8KKwkvLyBUdXJuIG9uIFJGIHBvd2VyLgorCS8vCisJLy9wcmludGsoIj09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPbiwgUkZfQ0hBTkdFX0JZX1BTKTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjI0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuYwpAQCAtMCwwICsxLDE4MzggQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjZGVmaW5lIEJBTkRfQSAxCisjZGVmaW5lIEJBTkRfQkcgMgorCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3J0bDgyNTUuaCIKKwordTMyIHJ0bDgyNTVfY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgxMywgLy8xCisJMHgxMTUsIC8vMgorCTB4MjE3LCAvLzMKKwkweDIxOSwgLy80CisJMHgzMWIsIC8vNQorCTB4NDFkLCAvLzYKKwkweDQxZiwgLy83CisJMHg2MjEsIC8vOAorCTB4NjIzLCAvLzkKKwkweDYyNSwgLy8xMAorCTB4NjI3LCAvLzExCisJMHg4MjksIC8vMTIKKwkweDgyYiwgLy8xMworCTB4OTJmLCAvLyAxNAorfTsKKworc3RhdGljIHNob3J0IHJ0bDgyNTVfZ2Fpbl8yR1tdPXsKKwkweDMzLCAweDE3LCAweDdjLCAweGM1LC8vLTc4CisJMHg0MywgMHgxNywgMHg3YSwgMHhjNSwvLy03NAorCTB4NTMsIDB4MTcsIDB4NzgsIDB4YzUsLy8tNzAKKwkweDYzLCAweDE3LCAweDc2LCAweGM1LC8vLTY2Cit9OworCisKK3N0YXRpYyBzaG9ydCBydGw4MjU1X2FnY1tdPXsKKwkweDEsIDB4MSwgMHgxLCAweDEsIDB4MSwgICAgICAgICAweDEsIDB4MSwgMHgxLCAweDEsIDB4MSwKKworCTB4MSwgMHgxLCAweDIsIDB4MiwgMHgzLCAgICAgICAgIDB4MywgMHg0LCAweDQsIDB4NSwgMHg1LAorCTB4NiwgMHg2LCAweDcsIDB4NywgMHg4LCAgICAgICAgIDB4OCwgMHg5LCAweDksIDB4YSwgMHhhLAorCTB4YiwgMHhiLCAweGMsIDB4YywgMHhkLCAgICAgICAgIDB4ZCwgMHhlLCAweGUsIDB4ZiwgMHhmLAorCisJMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgICAgMHgxMiwgMHgxMywgMHgxMywgMHgxNCwgMHgxNCwKKwkweDE1LCAweDE1LCAweDE2LCAweDE2LCAweDE3LCAgICAweDE3LCAweDE4LCAweDE4LCAweDE5LCAweDE5LAorCTB4MWEsIDB4MWEsIDB4MWIsIDB4MWIsIDB4MWMsICAgIDB4MWMsIDB4MWQsIDB4MWQsIDB4MWUsIDB4MWUsCisJMHgxZiwgMHgxZiwKKworCTB4MjAsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjIsICAgIDB4MjIsIDB4MjMsIDB4MjMsIDB4MjQsIDB4MjQsCisJMHgyNSwgMHgyNSwgMHgyNiwgMHgyNiwgMHgyNywgICAgMHgyNywgMHgyOCwgMHgyOCwgMHgyOSwgMHgyOSwKKwkweDJhLCAweDJhLAorCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgICAgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwKKwkweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLCAgICAweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLAorCTB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsICAgIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYQorCit9OworCit2b2lkIHJ0bDgyNTVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjU1X2dhaW5fMkdbZ2FpbiAqIDRdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDFdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNCArIDNdKTsKKwkvL3J0bDgyMjVfc2V0X2dhaW5fdXNiKGRldiwgZ2Fpbik7Cit9CisKK3ZvaWQgd3JpdGVfcnRsODI1NV9yZWcwYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZDEsIHUzMiBkMiwgdTMyIGQzLCB1MzIgZDQsCit1MzIgZDUsIHUzMiBkNiwgdTMyIGQ3LCB1MzIgZDgsIHUzMiBkOSwgdTMyIGQxMCkKK3sKKwlpbnQgaSxqOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGE7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCW91dCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpICYgMHhmZmYzOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJZm9yKGo9MDtqPDEwO2orKykKKwl7CisJCXN3aXRjaChqKQorCQl7CisJCQljYXNlIDk6CisJCQliYW5nZGF0YSA9IGQxMCB8IDB4MGM7CisJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCWJhbmdkYXRhID0gZDk7CisJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCWJhbmdkYXRhID0gZDg7CisJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCWJhbmdkYXRhID0gZDc7CisJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCWJhbmdkYXRhID0gZDY7CisJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCWJhbmdkYXRhID0gZDU7CisJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCWJhbmdkYXRhID0gZDQ7CisJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCWJhbmdkYXRhID0gZDM7CisJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCWJhbmdkYXRhID0gZDI7CisJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCWJhbmdkYXRhID0gZDE7CisJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQliYW5nZGF0YT0weGJhZGMwZGU7IC8qIGF2b2lkIGdjYyBjb21wbGFpbnRzICovCisJCQlicmVhazsKKwkJfQorCisJCWZvcihpPTMxOyBpPj0wO2ktLSl7CisKKwkJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCXVkZWxheSgxKTsKKwkJLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQkJaS0tOworCQkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkvLwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCX0KKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKy8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCBTV19DT05UUk9MX0dQSU8pOworLy8JcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCit9CisKK3ZvaWQgd3JpdGVfcnRsODI1NShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUxNiBkYXRhKQoreworCWludCBpOworCXUxNiBvdXQsc2VsZWN0OworCXU4IGJpdDsKKwl1MzIgYmFuZ2RhdGEgPSAoZGF0YSA8PCA0KSB8IChhZHIgJiAweGYpOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4gKTsvL3wgMHgxZmZmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKworCWZvcihpPTE1OyBpPj0wO2ktLSl7CisKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJaS0tOworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCX0KKworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgU1dfQ09OVFJPTF9HUElPKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKK30KKwordm9pZCBydGw4MjU1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PRkYpOworLy8JcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT0ZGKTsKK30KKwordm9pZCBydGw4MjU1X1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl1OCBjY2tfcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTggb2ZkbV9wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBvZmRtX3Bvd2VyX2xldmVsKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBjY2tfcG93ZXJfbGV2ZWwpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ09OVFJPTCw0KTsKK30KKyNpZiAwCisvKiBzd2l0Y2ggYmV0d2VlbiBtb2RlIEIgYW5kIEcgKi8KK3ZvaWQgcnRsODI1NV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBtb2RlYikKK3sKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgyNTVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJLy93cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bMV0pOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDUsIDB4NjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDYsIHJ0bDgyNTVfY2hhbltjaF0pOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDcsIDB4N2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nik7CisKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKy8vCXJ0bDgyMjVfc2V0X21vZGVfQihkZXYpOworCisJcnRsODI1NV9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaCk7CisJLyogRklYTUUgRklYTUUgRklYTUUgKi8KKworCSNpZiAwCisJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMHhlKTsgLy9ESUZTCisJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHgxNCk7IC8vU0xPVAorCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDB4NWIpOyAvLyBFSUZTCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsMHhiYywwKTsgLy9DVyBDT05GSUcKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHhiZCwweGE0KTsgLy9DVyBWQUxVRQorCS8vd3JpdGVfbmljX2J5dGUoZGV2LFRYX0FHQ19DT05UUk9MLDQpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCAweDlkLDcpOworLy9BcHIgMjAgMTM6MjU6MDMgbG9jYWxob3N0IGtlcm5lbDogdzguIDQwOWQ8LTcgIC8vIENDSyBBR0MKKwkvKndyaXRlX25pY193b3JkKGRldiwweDg0LDB4NDg4KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MSwweDNlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MCwweDMwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsMHg4NCwweDQ4OCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OTEsMHgzZSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LDB4OTAsMHgyMCk7CisJKi8KKwkvL21kZWxheSgxMDApOworCSNlbmRpZgorfQorCit2b2lkIHJ0bDgyNTVfaW5pdF9CR2JhbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4N2NmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWMwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTg3Y2UsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhYzAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxOGJkZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4YmJmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MThiOWYsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODNkZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4M2NmLCAweDI3LAorCQkweDkyNDAyYWNjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTgzYWYsIDB4MjcsCisJCTB4OTI0MDJhY2MsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwODNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA4M2M3LCAweDI3LAorCQkweDkyNDAyYWQwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzZDcsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhZDQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBiKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0M2M3LCAweDI3LAorCQkweDkyNDAyYWQ4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzYTcsIDB4MjcsCisJCTB4OTI0MDJhZDgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDM4NywgMHgyNywKKwkJMHg5MjQwMmFhOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBlKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MWM3LCAweDI3LAorCQkweDkyNDAyYWE4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxYTcsIDB4MjcsCisJCTB4OTI0MDJhYWMsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE4NywgMHgyNywKKwkJMHg5MjQwMmFhYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDExKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTg2LCAweDgwMDAwMDI3LAorCQkweDkyNDAyYWIwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxODYsIDB4MjcsCisJCTB4OTI0MDJhYjAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE0NiwgMHgyNywKKwkJMHg5MjQwMmFiNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTI2LCAweDI3LAorCQkweDkyNDAyYWI0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDYsIDB4MjcsCisJCTB4OTI0MDJhYjgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNSwgMHgyNywKKwkJMHg5MjQwMmFiOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTA0LCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTg4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDQsIDB4MjcsCisJCTB4OTI0MDJhODgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDA0NCwgMHgyNywKKwkJMHg5MjQwMmE4YywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFhKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDI0LCAweDI3LAorCQkweDkyNDAyYThjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDQsIDB4MjcsCisJCTB4OTI0MDJhOTAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMSwgMHgyNywKKwkJMHg5MjQwMmE5MCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFkKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTk0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4MjcsCisJCTB4OTI0MDJhOTQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAyMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE5OCwgMHhmODAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDIwLCAweDI3LAorCQkweDkyNDAyYTk4LCAweGY4MDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNjgsIDB4ZjAwMDksIDB4MTAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2OCwgMHhmMDAwOSwgMHgyMDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIzKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTZjLCAweGYwMDA5LCAweDMwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNmMsIDB4ZjAwMDksIDB4NDAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE3MCwgMHhmMDAwOSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI2KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDMxLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYTcwLCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTEsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhNzQsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHhjMDAwMDAyNywKKwkJMHg5MjQwMmE3NCwgMHhmMDAxMSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI5KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTc4LCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNzgsIDB4ZjAwMTEsIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0OCwgMHhmMDAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJjKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTQ4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNGMsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0YywgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJmKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTUwLCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1NCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1OCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEyOCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2EpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2IpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2MpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2QpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2UpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMDAsIDB4ZjgwMTEsIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgzNTM5LCAweDcwMDAwYzAzLCAweGZlZjQ2MTc4LCAweDQwODAwMCwgMHg0MDMzMDcsCisJCTB4OTI0ZjgwYzAsIDB4Zjk1NWMsIDB4ODQwMCwgMHg0MjkyMDAsIDB4MWNlMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MWM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDQ3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDk4Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NSwgMHg2NSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NiwgMHgxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NywgMHg3Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg4LCAweDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OSwgMHhjZTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGIsIDB4MWM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhkLCAweGQ3Zik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4ZSwgMHgzNjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGEsIDB4ZDU2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhhLCAweGQ1Nyk7CisJbWRlbGF5KDIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhkLCAweGQ3ZSk7CisKK30KKworCit2b2lkIHJ0bDgyNTVfc2V0X2JhbmRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYmFuZCkKK3sKKwlpZihiYW5kICE9IEJBTkRfQSl7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDg4LCAweDAwMTAwMDQwKTsKKworCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7CisKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDhjLCAweDAwMDgyMjA1KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGI0LCAweDY2KTsKKwl9Cit9CisKK3ZvaWQgcnRsODI1NV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCXUxNiBicnNyOworLy8Jc2hvcnQgY2hhbm5lbCAvKj0gcHJpdi0+Y2hhbiovID0gMTsKKwlwcml2LT5jaGFuID0gMTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDgwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4MCB8IFNXX0NPTlRST0xfR1BJTyk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4ODApOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBTV19DT05UUk9MX0dQSU8pOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGY4MDBmKTsKKworCWJyc3IgPSByZWFkX25pY193b3JkKGRldiwgQlJTUik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MmMsIDB4ZmZmZik7CisKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODI1NV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODI1NV9BTkFQQVJBTTJfT04pOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxMWMwMDAwMik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0MCk7CisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwlydGw4MjU1X2luaXRfQkdiYW5kKGRldik7CisJcnRsODI1NV9zZXRfYmFuZF9wYXJhbShkZXYsQkFORF9CRyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwLCAweDk4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgzLCAweDIwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDJlKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg1LCAweDEyKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGZjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweGQ4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHhkMyk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4ODgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7IC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFiLCAweDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQwLCAweDg2KTsgLyogQ0NLIENhcnJpZXIgU2Vuc2UgVGhyZXNob2xkICovCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOyAvKiBFbmVyZ3kgVGhyZXNob2xkICovCisJLy93cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHg4KTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgVEVTVFIsMHg4KTsKKworCWZvcihpPTA7aTwxMjg7aSsrKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDRiLCBydGw4MjU1X2FnY1tpXSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0YSwgKHU4KWkrIDB4ODApOworCX0KKworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAsIDB4MSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEsIDB4Mik7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsIDB4NDMpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgzLCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg2LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NywgMHgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDksIDB4ZmUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhiLCAweDgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YywgMHgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZCwgMHg0Myk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGUsIDB4ZDMpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDM4KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4NCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDA2KTsvKmFnYyByZXNwIHRpbWUgNzAwKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MjApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MjUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYSwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDdhKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWMsIDB4ODQpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDc1KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjAsIDB4MWYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgxNyk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIyLCAweDE2KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIDB4NzApOyAvL0ZJWE1FIG1heWJlIG5vdCBuZWVkZWQKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4NzApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4MTApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHg4OCk7CisKKworCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOyAvL0JBTkQgREVQRU5ELgorLy8Jd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgxNWMwMDAwMik7IC8vQkFORCBERVBFTkQuCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDE4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHgxOCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NiwgMHhkYyk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MmIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ1LCAweDJiKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NiwgMHgyNSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MTUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ4LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ5LCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRhLCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRiLCAweDApOworLy8Jd3JpdGVfcGh5X2NjayhkZXYsIDB4NGMsIDB4NSk7CisjaWYgMAorCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDlkKTsgLyogRW5lcmd5IFRocmVzaG9sZCAqLworCS8vIFRFU1RSIDB4YiA4MTg3CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOy8vICYgMHhmYik7CisjZW5kaWYKKwkvL3J0bDgyNTVfc2V0X2dhaW4oZGV2LCAxKTsgLyogRklYTUUgdGhpcyAnMScgaXMgcmFuZG9tICovCisKKwlydGw4MjU1X1NldFRYUG93ZXJMZXZlbChkZXYsIHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMgfDB4NCk7IC8qIFJ4IGFudCBCLCAweGQzIGZvciBBICovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgLyogUnggYW50IEIsIDB4MTAgZm9yIEEgKi8KKworCXJ0bDgxODVfdHhfYW50ZW5uYShkZXYsIDB4Myk7IC8qIFRYIGFudCBCLCAweDAgZm9yIEEqLworCS8qIG1ha2Ugc3VyZSBpcyB3YWtlbiB1cCEgKi8KKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyNTVfQU5BUEFSQU1fT04pOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyNTVfQU5BUEFSQU0yX09OKTsKKworCXJ0bDgyNTVfc2V0X2JhbmRfcGFyYW0oZGV2LEJBTkRfQkcpOworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCisJcnRsODI1NV9zZXRfZ2FpbihkZXYsIDQpOworCS8vcnRsODI1NV9zZXRfZW5lcmd5X3RocmVzaG9sZChkZXYpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCAweDlkKTsKKwlydGw4MjU1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIGJyc3IpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDRjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyNTUuaApAQCAtMCwwICsxLDE5IEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjU1CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2RlZmluZSBSVEw4MjU1X0FOQVBBUkFNX09OIDB4YTAwMDBiNTkKKyNkZWZpbmUgUlRMODI1NV9BTkFQQVJBTTJfT04gMHg4NDBjZjMxMQorCisKK3ZvaWQgcnRsODI1NV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MjU1X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOwordm9pZCBydGw4MjU1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0OTU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgICBUaGlzIGZpbGVzIGNvbnRhaW5zIFBISUxJUFMgU0EyNDAwIHJhZGlvIGZyb250ZW5kIHByb2dyYW1taW5nIHJvdXRpbmVzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBDb2RlIGF0IGh0dHA6Ly9jaGUub2pjdGVjaC5jb20vfmR5b3VuZy9ydHcvIGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0bworICAgdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgQ29kZSBmcm9tIHJ0bDgxODEgcHJvamVjdCBoYXMgYmVlbiB1c2VmdWwgdG8gbWUgdG8gdW5kZXJzdGFuZCBzb21lIHRoaW5ncy4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKworI2luY2x1ZGUgInI4MTgwLmgiCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9zYTI0MDAuaCIKKworCisvLyNkZWZpbmUgREVCVUdfU0EyNDAwCisKK3UzMiBzYTI0MDBfY2hhbltdID0geworCTB4MCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDAwMDk2YywgLy8xCisJMHgwODA5NzAsIC8vMgorCTB4MTAwOTc0LCAvLzMKKwkweDE4MDk3OCwgLy80CisJMHgwMDA5ODAsIC8vNQorCTB4MDgwOTg0LCAvLzYKKwkweDEwMDk4OCwgLy83CisJMHgxODA5OGMsIC8vOAorCTB4MDAwOTk0LCAvLzkKKwkweDA4MDk5OCwgLy8xMAorCTB4MTAwOTljLCAvLzExCisJMHgxODA5YTAsIC8vMTIKKwkweDAwMDlhOCwgLy8xMworCTB4MDAwOWI0LCAvLzE0Cit9OworCisKK3ZvaWQgcmZfc3RhYmlsaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMyk7IC8vZm9yIG5vdyB1c2UgYSBncmVhdCB2YWx1ZS4uIHdlIG1heSBvcHRpbWl6ZSBpbiBmdXR1cmUKK30KKworCit2b2lkIHdyaXRlX3NhMjQwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGFkciwgdTMyIGRhdGEpCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHBoeV9jb25maWc7CisKKyAgICAgICAgLy8gcGhpbGlwcyBzYTI0MDAgZXhwZWN0cyAyNCBiaXRzIGRhdGEKKworCS8qaWYoYWRyID09IDQgJiYgcHJpdi0+ZGlncGh5KXsKKwkJcGh5X2NvbmZpZz0weDYwMDAwMDAwOworCX1lbHNleworCQlwaHlfY29uZmlnPTB4YjAwMDAwMDA7CisJfSovCisKKwlwaHlfY29uZmlnID0gMHhiMDAwMDAwMDsgLy8gTUFDIHdpbGwgYmFuZyBiaXRzIHRvIHRoZSBzYTI0MDAKKworCXBoeV9jb25maWcgfD0gKCgodTMyKShhZHImMHhmKSk8PCAyNCk7CisJcGh5X2NvbmZpZyB8PSAoZGF0YSAmIDB4ZmZmZmZmKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcscGh5X2NvbmZpZyk7CisjaWZkZWYgREVCVUdfU0EyNDAwCisJRE1FU0coIldyaXRpbmcgc2EyNDAwOiAleCAoYWRyICV4KSIscGh5X2NvbmZpZyxhZHIpOworI2VuZGlmCisJcmZfc3RhYmlsaXplKGRldik7Cit9CisKKworCit2b2lkIHNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhbnQ7CisKKwlhbnQgPSBTQTI0MDBfQU5URU5OQTsKKwlpZihwcml2LT5hbnRiKSAvKmRlZmF1bHQgYW50ZW5uYSBpcyBhbnRlbm5hIEIgKi8KKwkJYW50IHw9IEJCX0FOVEVOTkFfQjsKKwlpZihjaCA9PSAxNCkKKwkJYW50IHw9IEJCX0FOVEFUVEVOX0NIQU4xNDsKKwl3cml0ZV9waHkoZGV2LDB4MTAsYW50KTsKKwkvL0RNRVNHKCJCQiBhbnRlbm5hICV4ICIsYW50KTsKK30KKworCisvKiBmcm9tIHRoZSBydGw4MTgxIGVtYmVkZGVkIGRyaXZlciAqLworc2hvcnQgc2EyNDAwX3JmX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHNlbnMpCit7CisJdTggZmluZXR1bmUgPSAwOworCWlmICgoc2VucyA+IDg1KSB8fCAoc2VucyA8IDU0KSkgcmV0dXJuIC0xOworCisJd3JpdGVfc2EyNDAwKGRldiw1LDB4MWRmYiB8IChzZW5zLTU0KSA8PCAxNSB8KGZpbmV0dW5lPDwyMCkpOyAgLy8gQUdDCTB4YzlkZmIKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdHhwdyA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1MzIgY2hhbiA9IHNhMjQwMF9jaGFuW2NoXTsKKworCXdyaXRlX3NhMjQwMChkZXYsNyx0eHB3KTsKKwkvL3dyaXRlX3BoeShkZXYsMHgxMCwweGQxKTsKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LGNoKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDAsY2hhbik7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKK30KKworCit2b2lkIHNhMjQwMF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3NhMjQwMChkZXYsIDQsIDApOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIGFuYXBhcmFtOworCXU4IGZpcmRhYzsKKworCXdyaXRlX25pY19ieXRlKGRldixQSFlfREVMQVksMHg2KTsJLy90aGlzIGlzIGdlbmVyYWwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ0FSUklFUl9TRU5TRV9DT1VOVEVSLDB4NGMpOyAvL3RoaXMgaXMgZ2VuZXJhbAorCisJLyp0aGVzZSBhcmUgcGhpbGlwcyBzYTI0MDAgc3BlY2lmaWMqLworCWFuYXBhcmFtID0gcmVhZF9uaWNfZHdvcmQoZGV2LEFOQVBBUkFNKTsKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+ICgxPDxBTkFQQVJBTV9UWERBQ09GRl9TSElGVCk7CisKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+QU5BUEFSQU1fUFdSMV9NQVNLOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IwX01BU0s7CisJaWYocHJpdi0+ZGlncGh5KXsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9ESUdfQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJCWFuYXBhcmFtIHw9IChTQTI0MDBfQU5BUEFSQU1fUFdSMF9PTjw8QU5BUEFSQU1fUFdSMF9TSElGVCk7CisJfWVsc2V7CisJCWFuYXBhcmFtIHw9IChTQTI0MDBfQU5BX0FOQVBBUkFNX1BXUjFfT048PEFOQVBBUkFNX1BXUjFfU0hJRlQpOworCX0KKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7CisKKwlmaXJkYWMgPSAocHJpdi0+ZGlncGh5KSA/ICgxPDxTQTI0MDBfUkVHNF9GSVJEQUNfU0hJRlQpIDogMDsKKwl3cml0ZV9zYTI0MDAoZGV2LDAsc2EyNDAwX2NoYW5bcHJpdi0+Y2hhbl0pOworCXdyaXRlX3NhMjQwMChkZXYsMSwweGJiNTApOworCXdyaXRlX3NhMjQwMChkZXYsMiwweDgwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDMsMCk7CisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDAgfCBmaXJkYWMpOworCXdyaXRlX3NhMjQwMChkZXYsNSwweGM5ZGZiKTsgIC8vIEFHQworCXdyaXRlX3NhMjQwMChkZXYsNCwweDE5MzQ4IHwgZmlyZGFjKTsgIC8vY2FsaWJyYXRlcyBWQ08KKworCWlmKHByaXYtPmRpZ3BoeSkKKwkJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzOGMpOyAvKj8/PyovCisKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MCB8IGZpcmRhYyk7CisKKwl3cml0ZV9zYTI0MDAoZGV2LDAsc2EyNDAwX2NoYW5bcHJpdi0+Y2hhbl0pOworCXdyaXRlX3NhMjQwMChkZXYsMSwweGJiNTApOworCXdyaXRlX3NhMjQwMChkZXYsMiwweDgwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDMsMCk7CisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDQgfCBmaXJkYWMpOyAvL2NhbGlicmF0ZXMgZmlsdGVyCisKKwkvKiBuZXcgZnJvbSBydGw4MTgwIGVtYmVkZGVkIGRyaXZlciAocnRsODE4MSBwcm9qZWN0KSAqLworCXdyaXRlX3NhMjQwMChkZXYsNiwweDEzZmYgfCAoMTw8MjMpKTsgLy8gTUFOUlgKKwl3cml0ZV9zYTI0MDAoZGV2LDgsMCk7IC8vVkNPCisKKwlpZighcHJpdi0+ZGlncGh5KQorCXsKKwkJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBhbmFwYXJhbSB8IFwKKwkJCQkgICAgICgxPDxBTkFQQVJBTV9UWERBQ09GRl9TSElGVCkpOworCisJCXJ0bDgxODBfY29udHR4X2VuYWJsZShkZXYpOworCisJCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzNDEpOyAvLyBjYWxpYnJhdGVzIERDCisKKwkJLyogYSA1dXMgc2xlZXAgaXMgcmVxdWlyZWQgaGVyZSwKKwkJICAgd2UgcmVseSBvbiB0aGUgM21zIGRlbGF5IGludHJvZHVjZWQgaW4gd3JpdGVfc2EyNDAwCisJCSovCisJCXdyaXRlX3NhMjQwMChkZXYsIDQsIDB4MTkzNDUpOworCQkvKiBhIDIwdXMgc2xlZXAgaXMgcmVxdWlyZWQgaGVyZSwKKwkJICAgd2UgcmVseSBvbiB0aGUgM21zIGRlbGF5IGludHJvZHVjZWQgaW4gd3JpdGVfc2EyNDAwCisJCSovCisJCXJ0bDgxODBfY29udHR4X2Rpc2FibGUoZGV2KTsKKworCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIGFuYXBhcmFtKTsKKwl9CisJLyogZW5kIG5ldyAqLworCisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDEgfCBmaXJkYWMgKTsgLy9SVFggTU9ERQorCisJLy8gU2V0IHR4IHBvd2VyIGxldmVsICE/CisKKworCS8qYmFzZWJhbmQgY29uZmlndXJhdGlvbiovCisJd3JpdGVfcGh5KGRldiwwLDB4OTgpOworCXdyaXRlX3BoeShkZXYsMywweDM4KTsKKwl3cml0ZV9waHkoZGV2LDQsMHhlMCk7CisJd3JpdGVfcGh5KGRldiw1LDB4OTApOworCXdyaXRlX3BoeShkZXYsNiwweDFhKTsKKwl3cml0ZV9waHkoZGV2LDcsMHg2NCk7CisKKwkvKlNob3VsZCBiZSBkb25lIHNvbWV0aGluZyBtb3JlIGhlcmU/PyovCisKKwlzYTI0MDBfd3JpdGVfcGh5X2FudGVubmEoZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5KGRldiwweDExLDB4ODApOworCWlmKHByaXYtPmRpdmVyc2l0eSkKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4YzcpOworCWVsc2UKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4NDcpOworCisJd3JpdGVfcGh5KGRldiwweDEzLDB4OTAgfCBwcml2LT5jc190cmVzaG9sZCApOworCisJd3JpdGVfcGh5KGRldiwweDE5LDB4MCk7CisJd3JpdGVfcGh5KGRldiwweDFhLDB4YTApOworCisJc2EyNDAwX3JmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2E2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuNworCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjZGVmaW5lIFNBMjQwMF9BTlRFTk5BIDB4OTEKKyNkZWZpbmUgU0EyNDAwX0RJR19BTkFQQVJBTV9QV1IxX09OIDB4OAorI2RlZmluZSBTQTI0MDBfQU5BX0FOQVBBUkFNX1BXUjFfT04gMHgyOAorI2RlZmluZSBTQTI0MDBfQU5BUEFSQU1fUFdSMF9PTiAweDMKKworI2RlZmluZSBTQTI0MDBfUkZfTUFYX1NFTlMgODUKKyNkZWZpbmUgU0EyNDAwX1JGX0RFRl9TRU5TIDgwCisKKyNkZWZpbmUgU0EyNDAwX1JFRzRfRklSREFDX1NISUZUIDcKKwordm9pZCBzYTI0MDBfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgc2EyNDAwX3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworc2hvcnQgc2EyNDAwX3JmX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7Cit2b2lkIHNhMjQwMF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdhYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCkBAIC0wLDAgKzEsMTY0NCBAQAorLyoKKyAgIFRoaXMgZmlsZSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQKKyAgIG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKy8vI2RlZmluZSBSQVRFX0NPVU5UIDQKK3UzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCisJNjAwMDAwMCw5MDAwMDAwLDEyMDAwMDAwLDE4MDAwMDAwLDI0MDAwMDAwLDM2MDAwMDAwLDQ4MDAwMDAwLDU0MDAwMDAwfTsKKworI2RlZmluZSBSQVRFX0NPVU5UIChzaXplb2YocnRsODE4MF9yYXRlcykvc2l6ZW9mKHJ0bDgxODBfcmF0ZXNbMF0pKQorCitzdGF0aWMgQ0hBTk5FTF9MSVNUIERlZmF1bHRDaGFubmVsUGxhbltdID0geworLy8Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNH0sMTR9LAkJCS8vRGVmYXVsdCBjaGFubmVsIHBsYW4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwxOX0sICAJCS8vRkNDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgICAvL1NwYWluLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9GcmFuY2UuIENoYW5nZSB0byBFVFNJLgorCXt7MTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDl9LAkJCQkJCS8vTUtLCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwgMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwvL01LSzEKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8vSXNyYWVsLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzQsMzgsNDIsNDZ9LDE3fSwJCQkvLyBGb3IgMTFhICwgVEVMRUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0JCQkJCS8vRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNgorfTsKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7Cit9CisKKworaW50IHI4MTgwX3d4X3NldF9rZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJfQorCisKKy8qCWkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpIDwgMSB8fCBpID4gNCkKKyovCisKKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisKKwkJLy9pbnQgbGVuID0gZXJxLT5sZW5ndGggPD0gNSA/IDUgOiAxMzsKKworCQl1MzIqIHRrZXk9ICh1MzIqKSBrZXk7CisJCXByaXYtPmtleTBbMF0gPSB0a2V5WzBdOworCQlwcml2LT5rZXkwWzFdID0gdGtleVsxXTsKKwkJcHJpdi0+a2V5MFsyXSA9IHRrZXlbMl07CisJCXByaXYtPmtleTBbM10gPSB0a2V5WzNdICYweGZmOworCQlETUVTRygiU2V0dGluZyB3ZXAga2V5IHRvICV4ICV4ICV4ICV4IiwKKwkJICAgICAgdGtleVswXSx0a2V5WzFdLHRrZXlbMl0sdGtleVszXSk7CisJCXJ0bDgxODBfc2V0X2h3X3dlcChkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9iZWFjb25pbnRlcnZhbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgKnBhcm1zID0gKGludCAqKWI7CisJaW50IGJpID0gcGFybXNbMF07CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJRE1FU0coInNldHRpbmcgYmVhY29uIGludGVydmFsIHRvICV4IixiaSk7CisKKwlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw9Ymk7CisJcnRsODE4MF9jb21taXQoZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9tb2RlKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9yYXRlKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXRlKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2NyY21vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBwcml2LT5jcmNtb247CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKGVuYWJsZSkKKwkJcHJpdi0+Y3JjbW9uPTE7CisJZWxzZQorCQlwcml2LT5jcmNtb249MDsKKworCURNRVNHKCJiYWQgQ1JDIGluIG1vbml0b3IgbW9kZSBhcmUgJXMiLAorCSAgICAgIHByaXYtPmNyY21vbiA/ICJhY2NlcHRlZCIgOiAicmVqZWN0ZWQiKTsKKworCWlmKHByZXYgIT0gcHJpdi0+Y3JjbW9uICYmIHByaXYtPnVwKXsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXJ0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworI2lmZGVmIEVOQUJMRV9JUFMKKy8vCXByaW50aygic2V0IG1vZGUgRU5BQkxFX0lQU1xuIik7CisJaWYocHJpdi0+YkluYWN0aXZlUHMpeworCQlpZih3cnF1LT5tb2RlID09IElXX01PREVfQURIT0MpCisJCQlJUFNMZWF2ZShkZXYpOworCX0KKyNlbmRpZgorCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJLy9ydGw4MTgwX2NvbW1pdChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKK3N0cnVjdCAgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEKK3sKKyAgICAgICAgLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCisgICAgICAgIF9fdTMyICAgICAgICAgICB0aHJvdWdocHV0OyAgICAgLyogVG8gZ2l2ZSBhbiBpZGVhLi4uICovCisgICAgICAgIC8qIEluIHRoZW9yeSB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgbWF4aW11bSBiZW5jaG1hcmtlZAorICAgICAgICAgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKyAgICAgICAgICogYml0IHJhdGUgaXMgbWVhbmluZ2xlc3MgKG92ZXJoZWFkIGFuIGNvKSB0byBlc3RpbWF0ZSBob3cKKyAgICAgICAgICogZmFzdCB0aGUgY29ubmVjdGlvbiB3aWxsIGdvIGFuZCBwaWNrIHRoZSBmYXN0ZXN0IG9uZS4KKyAgICAgICAgICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisgICAgICAgICAqLworCisgICAgICAgIC8qIE5XSUQgKG9yIGRvbWFpbiBpZCkgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIG1pbl9ud2lkOyAgICAgICAvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisgICAgICAgIF9fdTMyICAgICAgICAgICBtYXhfbndpZDsgICAgICAgLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCisgICAgICAgIC8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIG9sZF9udW1fY2hhbm5lbHM7CisgICAgICAgIF9fdTggICAgICAgICAgICBvbGRfbnVtX2ZyZXF1ZW5jeTsKKworICAgICAgICAvKiBTY2FuIGNhcGFiaWxpdGllcyAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgc2Nhbl9jYXBhOworfTsKKy8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKworc3RhdGljIGludCBydGw4MTgwX3d4X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHZhbDsKKwlpbnQgaTsKKwkvL3N0cnVjdCBpd19yYW5nZV93aXRoX3NjYW5fY2FwYSogdG1wID0gKHN0cnVjdCBpd19yYW5nZV93aXRoX3NjYW5fY2FwYSopcmFuZ2U7IC8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogTGV0J3MgdHJ5IHRvIGtlZXAgdGhpcyBzdHJ1Y3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4KKwkgKiBsaW51eC9pbmNsdWRlL3dpcmVsZXNzLmgKKwkgKi8KKworCS8qIFRPRE86IFNlZSB3aGF0IHZhbHVlcyB3ZSBjYW4gc2V0LCBhbmQgcmVtb3ZlIHRoZSBvbmVzIHdlIGNhbid0CisJICogc2V0LCBvciBmaWxsIHRoZW0gd2l0aCBzb21lIGRlZmF1bHQgZGF0YS4KKwkgKi8KKworCS8qIH41IE1iL3MgcmVhbCAoODAyLjExYikgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDUgKiAxMDAwICogMTAwMDsKKworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWluX253aWQ7CS8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKwkvLyBUT0RPOiBOb3QgdXNlZCBpbiA4MDIuMTFiPworLy8JcmFuZ2UtPm1heF9ud2lkOwkvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKyAgICAgICAgLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworLy8JcmFuZ2UtPm9sZF9udW1fY2hhbm5lbHM7CisvLwlyYW5nZS0+b2xkX251bV9mcmVxdWVuY3k7CisvLwlyYW5nZS0+b2xkX2ZyZXFbNl07IC8qIEZpbGxlciB0byBrZWVwICJ2ZXJzaW9uIiBhdCB0aGUgc2FtZSBvZmZzZXQgKi8KKwlpZihwcml2LT5yZl9zZXRfc2VucyAhPSBOVUxMKQorCQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSBwcml2LT5tYXhfc2VuczsJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCByYW5nZSAqLworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJLyogVE9ETzogRmluZCByZWFsIG1heCBSU1NJIGFuZCBzdGljayBoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAtOTg7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA5MjsgLyogPiA4JSBtaXNzZWQgYmVhY29ucyBpcyAnYmFkJyAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2wgdmFsdWUgZm9yIFJTU0kgKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBSQVRFX0NPVU5UOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQgJiYgaSA8IElXX01BWF9CSVRSQVRFUzsgaSsrKSB7CisJCXJhbmdlLT5iaXRyYXRlW2ldID0gcnRsODE4MF9yYXRlc1tpXTsKKwl9CisKKwlyYW5nZS0+bWluX2ZyYWcgPSBNSU5fRlJBR19USFJFU0hPTEQ7CisJcmFuZ2UtPm1heF9mcmFnID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCisJcmFuZ2UtPnBtX2NhcGEgPSAwOworCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTY7CisKKy8vCXJhbmdlLT5yZXRyeV9jYXBhOwkvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworLy8JcmFuZ2UtPnJldHJ5X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KKy8vCXJhbmdlLT5yX3RpbWVfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaWZlICovCisvLwlyYW5nZS0+bWluX3JldHJ5OwkvKiBNaW5pbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWF4X3JldHJ5OwkvKiBNYXhpbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWluX3JfdGltZTsJLyogTWluaW1hbCByZXRyeSBsaWZldGltZSAqLworLy8JcmFuZ2UtPm1heF9yX3RpbWU7CS8qIE1heGltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKworICAgICAgICByYW5nZS0+bnVtX2NoYW5uZWxzID0gMTQ7CisKKwlmb3IgKGkgPSAwLCB2YWwgPSAwOyBpIDwgMTQ7IGkrKykgeworCisJCS8vIEluY2x1ZGUgb25seSBsZWdhbCBmcmVxdWVuY2llcyBmb3Igc29tZSBjb3VudHJpZXMKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmICgoR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwKVtpKzFdKSB7CisjZWxzZQorCQlpZiAoKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbmRpZgorCQkgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaV0gKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQkJdmFsKys7CisJCX0gZWxzZSB7CisJCQkvLyBGSVhNRTogZG8gd2UgbmVlZCB0byBzZXQgYW55dGhpbmcgZm9yIGNoYW5uZWxzCisJCQkvLyB3ZSBkb24ndCB1c2UgPworCQl9CisKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCWJyZWFrOworCX0KKworCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworCisJLy90bXAtPnNjYW5fY2FwYSA9IDB4MDE7IC8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisvL1lKLGFkZCwwODA4MTksIGZvciBoaWRkZW4gYXAKKwkvL3ByaW50aygiPT0qJiomKiY9PT4lcyBpblxuIiwgX19mdW5jX18pOworCS8vcHJpbnRrKCI9KiYqJiomKj09PT5mbGFnOiV4LCAleFxuIiwgd3JxdS0+ZGF0YS5mbGFncywgSVdfU0NBTl9USElTX0VTU0lEKTsKKwlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkKKwl7CisJCXN0cnVjdCBpd19zY2FuX3JlcSogcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSopYjsKKwkJaWYgKHJlcS0+ZXNzaWRfbGVuKQorCQl7CisJCQkvL3ByaW50aygiPT0qKiYqJiomKio9PT0+c2NhbiBzZXQgc3NpZDolc1xuIiwgcmVxLT5lc3NpZCk7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSByZXEtPmVzc2lkX2xlbjsKKwkJCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgcmVxLT5lc3NpZCwgcmVxLT5lc3NpZF9sZW4pOworCQkJLy9wcmludGsoIj09PT09Pm5ldHdvcmsgc3NpZDolc1xuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQpOworCQl9CisJfQorLy9ZSixhZGQsMDgwODE5LCBmb3IgaGlkZGVuIGFwLCBlbmQKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYocHJpdi0+dXApeworI2lmZGVmIEVOQUJMRV9JUFMKKy8vCQlwcmludGsoInNldCBzY2FuIEVOQUJMRV9JUFNcbiIpOworCQlwcml2LT5pZWVlODAyMTEtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWYocHJpdi0+YkluYWN0aXZlUHMgJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpeworCQkJSVBTTGVhdmUoZGV2KTsKKy8vCQkJZG93bigmcHJpdi0+aWVlZTgwMjExLT53eF9zZW0pOworCisvLwkJCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEocHJpdi0+aWVlZTgwMjExLT5wcm90b19zdGFydGVkKSl7CisvLwkJCQlyZXQgPSAtMTsKKy8vCQkJCXVwKCZwcml2LT5pZWVlODAyMTEtPnd4X3NlbSk7CisvLwkJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKy8vCQkJCXJldHVybiByZXQ7CisvLwkJCX0KKworCS8vCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+d3hfc3luY19zY2FuX3dxKTsKKwkJLy9wcmludGsoInN0YXJ0IHNjYW49PT09PT09PT09PT09PT09PT09PT09PT09PT09PlxuIik7CisJCWllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhwcml2LT5pZWVlODAyMTEpOworLy9pZWVlODAyMTFfc3RhcnRfc2Nhbihwcml2LT5pZWVlODAyMTEpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKy8vCQkJdXAoJnByaXYtPmllZWU4MDIxMS0+d3hfc2VtKTsKKwkJCXJldCA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJCS8vWUosYWRkLDA4MDgyOCwgcHJldmVudCBzY2FuIGluIEJ1c3lUcmFmZmljCisJCQkvL0ZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIGxhc3Qgc2NhbiB0aW1lCisJCQlpZiAoKHByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYykgJiYgKHRydWUpKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJcHJpbnRrKCJOb3cgdHJhZmZpYyBpcyBidXN5LCBwbGVhc2UgdHJ5IGxhdGVyIVxuIik7CisJCQl9CisJCQllbHNlCisJCQkvL1lKLGFkZCwwODA4MjgsIHByZXZlbnQgc2NhbiBpbiBCdXN5VHJhZmZpYyxlbmQKKwkJCQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKwkJfQorCX0KKwllbHNlCisJCXJldCA9IC0xOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZihwcml2LT51cCkKKwkJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9zY2FuKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisJZWxzZQorCQlyZXQgPSAtMTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCByZXQ7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisjaWZkZWYgRU5BQkxFX0lQUworCS8vcHJpbnRrKCJzZXQgZXNzaWQgRU5BQkxFX0lQU1xuIik7CisJaWYocHJpdi0+YkluYWN0aXZlUHMpCisJCUlQU0xlYXZlKGRldik7CisjZW5kaWYKKy8vCXByaW50aygiaGFoYTpzZXQgZXNzaWQgJXMgZXNzaWRfbGVuID0gJWQgZXNzaWRfZmxncyA9ICVkXG4iLGIsICB3cnF1LT5lc3NpZC5sZW5ndGgsIHdycXUtPmVzc2lkLmZsYWdzKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZnJlcShwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9uYW1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCisJCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IHdycXUtPmZyYWcudmFsdWUgJiB+MHgxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzOworCXdycXUtPmZyYWcuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPmZyYWcuZGlzYWJsZWQgPSAod3JxdS0+ZnJhZy52YWx1ZSA9PSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLGF3cnEsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZihwcml2LT5od193ZXApIHJldCA9IHI4MTgwX3d4X3NldF9rZXkoZGV2LGluZm8sd3JxdSxrZXkpOworCWVsc2V7CisJCURNRVNHKCJTZXR0aW5nIFNXIHdlcCBrZXkiKTsKKwkJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxrZXkpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwga2V5KTsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKyAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXM9KGludCopcDsKKwlpbnQgbW9kZT1wYXJtc1swXTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IG1vZGU7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBhZGRlZCBieSBjaHJpc3RpYW4gKi8KKy8qCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9tb25pdG9yX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCisgaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7CisKKyAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCAqcGFybXM9KGludCopcDsKKwlpbnQgbW9kZT1wYXJtc1swXTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpIHJldHVybiAtMTsKKyAgCXByaXYtPnByaXNtX2hkciA9IG1vZGU7CisJaWYoIW1vZGUpZGV2LT50eXBlPUFSUEhSRF9JRUVFODAyMTE7CisJZWxzZSBkZXYtPnR5cGU9QVJQSFJEX0lFRUU4MDIxMV9QUklTTTsKKwlETUVTRygidXNpbmcgJXMgUlggZW5jYXAiLCBtb2RlID8gIkFWUyI6IjgwMjExIik7CisJcmV0dXJuIDA7CisKK30KKyovCisvL29mICAgICAgICAgcjgxODBfd3hfc2V0X21vbml0b3JfdHlwZQorLyogZW5kIGFkZGVkIGNocmlzdGlhbiAqLworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKKwkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICghKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElNSVQpKXsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmKHdycXUtPnJldHJ5LnZhbHVlID4gUjgxODBfTUFYX1JFVFJZKXsKKwkJZXJyPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQlwcml2LT5yZXRyeV9ydHMgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKworCX1lbHNlIHsKKwkJcHJpdi0+cmV0cnlfZGF0YSA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3Igbm9uIFJUUy9DVFMgZGF0YSB0byAlZCIsIHdycXUtPnJldHJ5LnZhbHVlKTsKKwl9CisKKwkvKiBGSVhNRSAhCisJICogV2UgbWlnaHQgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRoZSBUWCBjb25maWcgcmVnaXN0ZXIKKwkgKiBvciB0byByZXN0YXJ0IGp1c3QgdGhlIChSKVRYIHByb2Nlc3MuCisJICogSSdtIHVuc3VyZSBpZiB3aG9sZSByZXNldCBpcyByZWFsbHkgbmVlZGVkCisJICovCisKKyAJcnRsODE4MF9jb21taXQoZGV2KTsKKwkvKgorCWlmKHByaXYtPnVwKXsKKwkJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCQlydGw4MTgwX3J4X2VuYWJsZShkZXYpOworCQlydGw4MTgwX3R4X2VuYWJsZShkZXYpOworCisJfQorCSovCitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOyAvKiBjYW4ndCBiZSBkaXNhYmxlZCAqLworCisJaWYgKCh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09CisJICAgIElXX1JFVFJZX0xJRkVUSU1FKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUICYgSVdfUkVUUllfTUFYOworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPnJldHJ5X3J0czsKKwl9IGVsc2UgeworCQl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUICYgSVdfUkVUUllfTUlOOworCQl3cnF1LT5yZXRyeS52YWx1ZSA9IHByaXYtPnJldHJ5X2RhdGE7CisJfQorCS8vRE1FU0coInJldHVybmluZyAlZCIsd3JxdS0+cmV0cnkudmFsdWUpOworCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpCisJCXJldHVybiAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJd3JxdS0+c2Vucy52YWx1ZSA9IHByaXYtPnNlbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlzaG9ydCBlcnIgPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCS8vRE1FU0coImF0dGVtcHQgdG8gc2V0IHNlbnNpdml0eSB0byAlZGRiIix3cnF1LT5zZW5zLnZhbHVlKTsKKwlpZihwcml2LT5yZl9zZXRfc2VucyA9PSBOVUxMKSB7CisJCWVycj0gLTE7IC8qIHdlIGhhdmUgbm90IHRoaXMgc3VwcG9ydCBmb3IgdGhpcyByYWRpbyAqLworCQlnb3RvIGV4aXQ7CisJfQorCWlmKHByaXYtPnJmX3NldF9zZW5zKGRldiwgd3JxdS0+c2Vucy52YWx1ZSkgPT0gMCkKKwkJcHJpdi0+c2VucyA9IHdycXUtPnNlbnMudmFsdWU7CisJZWxzZQorCQllcnI9IC1FSU5WQUw7CisKK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcmF3dHgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCByODE4MF93eF9nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaW50aygiPT4+Pj4+Pj4+Pj49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5zZXQgcG93ZXI6JWQsJWQhXG4iLHdycXUtPnBvd2VyLmRpc2FibGVkLCB3cnF1LT5wb3dlci5mbGFncyk7CisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkPT0wKSB7CisJCXdycXUtPnBvd2VyLmZsYWdzfD1JV19QT1dFUl9BTExfUjsKKwkJd3JxdS0+cG93ZXIuZmxhZ3N8PUlXX1BPV0VSX1RJTUVPVVQ7CisJCXdycXUtPnBvd2VyLnZhbHVlID0xMDAwOworCX0KKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKHdycXUtPnJ0cy5kaXNhYmxlZCkKKwkJcHJpdi0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCWVsc2UgeworCQlpZiAod3JxdS0+cnRzLnZhbHVlIDwgTUlOX1JUU19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPnJ0cy52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpdi0+cnRzID0gd3JxdS0+cnRzLnZhbHVlOworCX0KKworCXJldHVybiAwOworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisKKwl3cnF1LT5ydHMudmFsdWUgPSBwcml2LT5ydHM7CisJd3JxdS0+cnRzLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5ydHMuZGlzYWJsZWQgPSAod3JxdS0+cnRzLnZhbHVlID09IDApOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGR1bW15KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJcmV0dXJuIC0xOworfQorCisvKgorc3RhdGljIGludCByODE4MF93eF9nZXRfcHNtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKHByaXYpIHsKKwkJaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkJaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKSB7CisJCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJKigodW5zaWduZWQgaW50ICopZXh0cmEpID0gSVdfUE9XRVJfVElNRU9VVDsKKyAJaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJCSooKHVuc2lnbmVkIGludCAqKWV4dHJhKSB8PSBJV19QT1dFUl9BTExfUjsKKwkJZWxzZQorCQkJKigodW5zaWduZWQgaW50ICopZXh0cmEpIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3BzbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKyovCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCisJc3RyY3B5KGV4dHJhLCAiODAyLjExIik7CisJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgeworCQlzdHJjYXQoZXh0cmEsICJiIik7CisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQkJc3RyY2F0KGV4dHJhLCAiL2ciKTsKKwl9IGVsc2UgaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCXN0cmNhdChleHRyYSwgImciKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7CisJaW50IHJldCA9IDA7CisJaW50IG1vZHVsYXRpb24gPSAwLCBtb2RlID0gMDsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYgKCpwYXJhbSA9PSAxKSB7CisJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9COworCXByaW50ayhLRVJOX0lORk8gIkIgbW9kZSFcbiIpOworCX0gZWxzZSBpZiAoKnBhcmFtID09IDIpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9HOworCXByaW50ayhLRVJOX0lORk8gIkcgbW9kZSFcbiIpOworCX0gZWxzZSBpZiAoKnBhcmFtID09IDMpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJCW1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKKwkJbW9kZSA9IElFRUVfQnxJRUVFX0c7CisJcHJpbnRrKEtFUk5fSU5GTyAiQi9HIG1vZGUhXG4iKTsKKwl9CisKKwlpZihpZWVlLT5wcm90b19zdGFydGVkKSB7CisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCQlpZWVlLT5tb2RlID0gbW9kZTsKKwkJaWVlZS0+bW9kdWxhdGlvbiA9IG1vZHVsYXRpb247CisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9IGVsc2UgeworCQlpZWVlLT5tb2RlID0gbW9kZTsKKwkJaWVlZS0+bW9kdWxhdGlvbiA9IG1vZHVsYXRpb247CisvLwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3ByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisKKworCSpleHRyYSA9IChjaGFyKSBwcml2LT5wbGNwX3ByZWFtYmxlX21vZGU7IAkvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYgKCpleHRyYTwwfHwqZXh0cmE+MikKKwkJcmV0ID0gLTE7CisJZWxzZQorCQlwcml2LT5wbGNwX3ByZWFtYmxlX21vZGUgPSAqKChzaG9ydCAqKWV4dHJhKSA7CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfc2lnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjUKKwkqKChpbnQgKilleHRyYSkgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsvL2ZvciBpbnRlcmZhY2UgdGVzdCAsaXQgc2hvdWxkIGJlIHRoZSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsKKworCisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zaWdxdWFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmsgPSAmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCS8vIE1vZGlmeSBieSBoaWthcnUgNi41CisJKigoaW50ICopZXh0cmEpID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbDsvL2ZvciBpbnRlcmZhY2UgdGVzdCAsaXQgc2hvdWxkIGJlIHRoZSBwcml2LT53c3RhdHMucXVhbC5xdWFsOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfcmVzZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID1pZWVlODAyMTFfcHJpdihkZXYpOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcml2LT5zdGF0cy50eHJkdSA9IDA7CisJcHJpdi0+c3RhdHMucnhyZHUgPSAwOworCXByaXYtPnN0YXRzLnJ4bm9sYXN0ID0gMDsKKwlwcml2LT5zdGF0cy5yeG5vZGF0YSA9IDA7CisJcHJpdi0+c3RhdHMucnhub3BvaW50ZXIgPSAwOworCXByaXYtPnN0YXRzLnR4bnBlcnIgPSAwOworCXByaXYtPnN0YXRzLnR4cmVzdW1lZCA9IDA7CisJcHJpdi0+c3RhdHMucnhlcnIgPSAwOworCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3cgPSAwOworCXByaXYtPnN0YXRzLnJ4aW50ID0gMDsKKworCXByaXYtPnN0YXRzLnR4bnBva2ludCA9IDA7CisJcHJpdi0+c3RhdHMudHhocG9raW50ID0gMDsKKwlwcml2LT5zdGF0cy50eGhwZXJyID0gMDsKKwlwcml2LT5zdGF0cy5pbnRzID0gMDsKKwlwcml2LT5zdGF0cy5zaGludHMgPSAwOworCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3cgPSAwOworCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCA9IDA7CisJcHJpdi0+c3RhdHMudHhiZWFjb24gPSAwOworCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyID0gMDsKKwlwcml2LT5zdGF0cy50eGxwb2tpbnQgPSAwOworCXByaXYtPnN0YXRzLnR4bHBlcnIgPSAwOworCXByaXYtPnN0YXRzLnR4cmV0cnkgPTA7Ly8yMDA2MDYwMQorCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluPTA7CisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQ9MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1heD0wOworCXByaXYtPnN0YXRzLnJ4aWN2ZXJyPTA7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3JhZGlvX29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaXYtPnJmX3dha2V1cChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3JhZGlvX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlwcml2LT5yZl9zbGVlcChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKKworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfY2hhbm5lbHBsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJKmV4dHJhID0gcHJpdi0+Y2hhbm5lbF9wbGFuOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9jaGFubmVscGxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopZXh0cmE7CisJaW50IGk7CisJcHJpbnRrKCItLS0tLWluIGZ1biAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYgKERlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5MZW4gIT0gMCl7CisJCXByaXYgLT5jaGFubmVsX3BsYW4gPSAqdmFsOworCQkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXAKKwkJZm9yIChpPTE7aTw9TUFYX0NIQU5ORUxfTlVNQkVSO2krKykKKwkJeworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJCUdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcFtpXSA9IDA7CisjZWxzZQorCQkJcHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcFtpXSA9IDA7CisjZW5kaWYKKwkJfQorCQkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwCisJCWZvciAoaT0xO2k8PURlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5MZW47aSsrKQorCQl7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQkJR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwW0RlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5DaGFubmVsW2ktMV1dID0gMTsKKyNlbHNlCisJCQlwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwW0RlZmF1bHRDaGFubmVsUGxhblsqdmFsXS5DaGFubmVsW2ktMV1dID0gMTsKKyNlbmRpZgorCQl9CisJfQorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlzdHJjcHkoZXh0cmEsICIxMDIwLjA4MDgiKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvL2FkZGVkIGJ5IGFteSAwODA4MTgKKy8vcmVjZWl2ZSBkYXRhcmF0ZSBmcm9tIHVzZXIgdHlwaW5nIHZhbGlkIHJhdGUgaXMgZnJvbSAyIHRvIDEwOCAoMSAtIDU0TSksIGlmIGlucHV0IDAsIHJldHVybiB0byBub3JtYWwgcmF0ZSBhZGFwdGl2ZS4KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2ZvcmNlcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggZm9yY2VyYXRlID0gKmV4dHJhOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByaW50aygiPT09PT09PT09PT09PT0+JXMoKTogZm9yY2VyYXRlIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxmb3JjZXJhdGUpOworCWlmKChmb3JjZXJhdGUgPT0gMikgfHwgKGZvcmNlcmF0ZSA9PSA0KSB8fCAoZm9yY2VyYXRlID09IDExKSB8fCAoZm9yY2VyYXRlID09IDIyKSB8fCAoZm9yY2VyYXRlID09IDEyKSB8fAorCQkoZm9yY2VyYXRlID09IDE4KSB8fCAoZm9yY2VyYXRlID09IDI0KSB8fCAoZm9yY2VyYXRlID09IDM2KSB8fCAoZm9yY2VyYXRlID09IDQ4KSB8fCAoZm9yY2VyYXRlID09IDcyKSB8fAorCQkoZm9yY2VyYXRlID09IDk2KSB8fCAoZm9yY2VyYXRlID09IDEwOCkpCisJeworCQlwcml2LT5Gb3JjZWREYXRhUmF0ZSA9IDE7CisJCXByaXYtPmllZWU4MDIxMS0+cmF0ZSA9IGZvcmNlcmF0ZSAqIDU7CisJfQorCWVsc2UgaWYoZm9yY2VyYXRlID09IDApCisJeworCQlwcml2LT5Gb3JjZWREYXRhUmF0ZSA9IDA7CisJCXByaW50aygiT0shIHJldHVybiByYXRlIGFkYXB0aXZlXG4iKTsKKwl9CisJZWxzZQorCQlwcmludGsoIkVSUjogd3JvbmcgcmF0ZVxuIik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2VuY19leHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vcHJpbnRrKCI9PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWludCByZXQ9MDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0PTA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9hdXRoKHByaXYtPmllZWU4MDIxMSwgaW5mbywgZGF0YSwgZXh0cmEpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8vcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpbnQgcmV0PTA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZiAxCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9tbG1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworI2VuZGlmCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKy8vCXByaW50aygiPT09PT4lcygpLCBsZW46JWRcbiIsIF9fRlVOQ1RJT05fXywgZGF0YS0+bGVuZ3RoKTsKKwlpbnQgcmV0PTA7CisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZiAxCisgICAgICAgIHJldCA9IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHByaXYtPmllZWU4MDIxMSwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7CisjZW5kaWYKKyAgICAgICAgdXAoJnByaXYtPnd4X3NlbSk7CisJLy9wcmludGsoIjw9PT09PT0lcygpLCByZXQ6JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKworCit9CitzdGF0aWMgaXdfaGFuZGxlciByODE4MF93eF9oYW5kbGVyc1tdID0KK3sKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisgICAgICAgIHI4MTgwX3d4X2dldF9uYW1lLCAgIAkgIC8qIFNJT0NHSVdOQU1FICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworICAgICAgICByODE4MF93eF9zZXRfZnJlcSwgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAgICAgIHI4MTgwX3d4X2dldF9mcmVxLCAgICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X21vZGUsICAgICAgICAvKiBTSU9DU0lXTU9ERSAqLworICAgICAgICByODE4MF93eF9nZXRfbW9kZSwgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAgICAgIHI4MTgwX3d4X3NldF9zZW5zLCAgICAgICAgLyogU0lPQ1NJV1NFTlMgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3NlbnMsICAgICAgICAvKiBTSU9DR0lXU0VOUyAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworICAgICAgICBydGw4MTgwX3d4X2dldF9yYW5nZSwJICAvKiBTSU9DR0lXUkFOR0UgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1dJV1RIUlNQWSAqLworICAgICAgICByODE4MF93eF9zZXRfd2FwLCAgICAgIAkgIC8qIFNJT0NTSVdBUCAqLworICAgICAgICByODE4MF93eF9nZXRfd2FwLCAgICAgICAgIC8qIFNJT0NHSVdBUCAqLworCXI4MTgwX3d4X3NldF9tbG1lLCAgICAgICAgLyogU0lPQ1NJV01MTUUqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUExJU1QgLS0gZGVwcmljYXRlZCAqLworICAgICAgICByODE4MF93eF9zZXRfc2NhbiwgICAgICAgIC8qIFNJT0NTSVdTQ0FOICovCisgICAgICAgIHI4MTgwX3d4X2dldF9zY2FuLCAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DR0lXRVNTSUQgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTklDS04gKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICByODE4MF93eF9zZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCisgICAgICAgIHI4MTgwX3d4X2dldF9yYXRlLCAgICAgICAgLyogU0lPQ0dJV1JBVEUgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3J0cywgICAgICAgICAvKiBTSU9DU0lXUlRTICovCisgICAgICAgIHI4MTgwX3d4X2dldF9ydHMsICAgICAgICAgLyogU0lPQ0dJV1JUUyAqLworICAgICAgICByODE4MF93eF9zZXRfZnJhZywgICAgICAgIC8qIFNJT0NTSVdGUkFHICovCisgICAgICAgIHI4MTgwX3d4X2dldF9mcmFnLCAgICAgICAgLyogU0lPQ0dJV0ZSQUcgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVFhQT1cgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3JldHJ5LCAgICAgICAvKiBTSU9DU0lXUkVUUlkgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3JldHJ5LCAgICAgICAvKiBTSU9DR0lXUkVUUlkgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X2VuYywgICAgICAgICAvKiBTSU9DU0lXRU5DT0RFICovCisgICAgICAgIHI4MTgwX3d4X2dldF9lbmMsICAgICAgICAgLyogU0lPQ0dJV0VOQ09ERSAqLworICAgICAgICByODE4MF93eF9zZXRfcG93ZXIsICAgICAgIC8qIFNJT0NTSVdQT1dFUiAqLworICAgICAgICByODE4MF93eF9nZXRfcG93ZXIsICAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLworICAgICAgICBOVUxMLAkJCSAgLyotLS1ob2xlLS0tKi8KKwlOVUxMLCAJCQkgIC8qLS0taG9sZS0tLSovCisJcjgxODBfd3hfc2V0X2dlbl9pZSwgICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KKwlOVUxMLCAJCQkgIC8qIFNJT0NTSVdHRU5JRSAqLworCXI4MTgwX3d4X3NldF9hdXRoLAkgIC8qIFNJT0NTSVdBVVRIICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQVVUSCAqLworCXI4MTgwX3d4X3NldF9lbmNfZXh0LCAJICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAJICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJTlVMTCwgCQkJIC8qIFNJT0NTSVdQTUtTQSAqLworCU5VTEwsIAkJCSAgLyotLS1ob2xlLS0tKi8KK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgcjgxODBfcHJpdmF0ZV9hcmdzW10gPSB7CisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDAsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmFkY3JjIgorCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweDEsCisJCTAsIDAsICJkdW1teSIKKworCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDIsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYmVhY29uaW50IgorCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweDMsCisJCTAsIDAsICJkdW1teSIKKworCX0sCisJLyogYWRkZWQgYnkgY2hyaXN0aWFuICovCisJLy97CisJLy8JU0lPQ0lXRklSU1RQUklWICsgMHgyLAorCS8vCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicHJpc21oZHIiCisJLy99LAorCS8qIGVuZCBhZGRlZCBieSBjaHJpc3RpYW4gKi8KKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhY3RpdmVzY2FuIgorCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4NSwKKwkJMCwgMCwgImR1bW15IgorCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyYXd0eCIKKworCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweDcsCisJCTAsIDAsICJkdW1teSIKKworCX0sCisvLwl7CisvLwkJU0lPQ0lXRklSU1RQUklWICsgMHg1LAorLy8JCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cHNtb2RlIgorLy8JfSwKKy8vCXsKKy8vCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisvLwkJSVdfUFJJVl9TSVpFX0ZJWEVELCAwLCAic2V0cHNtb2RlIgorLy8JfSwKKy8vc2V0L2dldCBtb2RlIGhhdmUgYmVlbiByZWFsaXplZCBpbiBwdWJsaWMgaGFuZGxlcnMKKworCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg4LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldGl3bW9kZSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg5LAorCQkwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMyLCAiZ2V0aXdtb2RlIgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweEEsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cHJlYW1ibGUiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4QiwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRwcmVhbWJsZSIKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHhDLAorCQkwLCAwLCAiZHVtbXkiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4RCwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRyc3NpIgorCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweEUsCisJCTAsIDAsICJkdW1teSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhGLAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGxpbmtxdWFsIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxMCwKKwkJMCwgMCwgInJlc2V0c3RhdHMiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDExLAorCQkwLDAsICJkdW1teSIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTIsCisJCTAsIDAsICJyYWRpb29uIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxMywKKwkJMCwgMCwgInJhZGlvb2ZmIgorIAl9LAorIAl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTQsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0Y2hhbm5lbCIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTUsCisJCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0Y2hhbm5lbCIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTYsCisJCTAsMCwgImR1bW15IgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxNywKKwkJMCxJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDMyLCAiZ2V0dmVyc2lvbiIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTgsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cmF0ZSIKKwl9LAorfTsKKworCitzdGF0aWMgaXdfaGFuZGxlciByODE4MF9wcml2YXRlX2hhbmRsZXJbXSA9IHsKKwlyODE4MF93eF9zZXRfY3JjbW9uLCAgIC8qU0lPQ0lXU0VDT05EUFJJViovCisJZHVtbXksCisJcjgxODBfd3hfc2V0X2JlYWNvbmludGVydmFsLAorCWR1bW15LAorCS8vcjgxODBfd3hfc2V0X21vbml0b3JfdHlwZSwKKwlyODE4MF93eF9zZXRfc2Nhbl90eXBlLAorCWR1bW15LAorCXI4MTgwX3d4X3NldF9yYXd0eCwKKwlkdW1teSwKKwlyODE4MF93eF9zZXRfaXdtb2RlLAorCXI4MTgwX3d4X2dldF9pd21vZGUsCisJcjgxODBfd3hfc2V0X3ByZWFtYmxlLAorCXI4MTgwX3d4X2dldF9wcmVhbWJsZSwKKwlkdW1teSwKKwlyODE4MF93eF9nZXRfc2lnbGV2ZWwsCisJZHVtbXksCisJcjgxODBfd3hfZ2V0X3NpZ3F1YWwsCisJcjgxODBfd3hfcmVzZXRfc3RhdHMsCisJZHVtbXksLy9yODE4MF93eF9nZXRfc3RhdHMKKwlyODE4MF93eF9yYWRpb19vbiwKKwlyODE4MF93eF9yYWRpb19vZmYsCisJcjgxODBfd3hfc2V0X2NoYW5uZWxwbGFuLAorCXI4MTgwX3d4X2dldF9jaGFubmVscGxhbiwKKwlkdW1teSwKKwlyODE4MF93eF9nZXRfdmVyc2lvbiwKKwlyODE4MF93eF9zZXRfZm9yY2VyYXRlLAorfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworc3RhdGljIGlubGluZSBpbnQgaXNfc2FtZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisgICAgICAgIC8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgRVNTSUQKKyAgICAgICAgICogYW5kIHRoZSBjYXBhYmlsaXR5IGZpZWxkIChpbiBwYXJ0aWN1bGFyIElCU1MgYW5kIEJTUykgYWxsIG1hdGNoLgorICAgICAgICAgKiBXZSB0cmVhdCBhbGwgPGhpZGRlbj4gd2l0aCB0aGUgc2FtZSBCU1NJRCBhbmQgY2hhbm5lbAorICAgICAgICAgKiBhcyBvbmUgbmV0d29yayAqLworICAgICAgICByZXR1cm4gKCgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKXx8KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmICAvL1lKLG1vZCwgMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJCS8vKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pICYmCisJCQkoc3JjLT5jaGFubmVsID09IGRzdC0+Y2hhbm5lbCkgJiYKKwkJCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCisJCQkoIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbil8fChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJiAgLy9ZSixtb2QsIDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCQkvLyFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pICYmCisJCQkoKHNyYy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA9PQorCQkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKKwkJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykgPT0KKwkJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSkpOworfQorCisvL1dCIG1vZGVmaWVkIHRvIHNob3cgc2lnbmFsIHRvIEdVSSBvbiAxOC0wMS0yMDA4CitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTgwX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyogd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwkvL3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayogdGFyZ2V0ID0gTlVMTDsKKwlpbnQgdG1wX2xldmVsID0gMDsKKwlpbnQgdG1wX3F1YWwgPSAwOworCWludCB0bXBfbm9pc2UgPSAwOworCS8vdW5zaWduZWQgbG9uZyBmbGFnOworCisJaWYgKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCXdzdGF0cy0+cXVhbC5xdWFsID0gMDsKKwkJd3N0YXRzLT5xdWFsLmxldmVsID0gMDsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gMDsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisJCXJldHVybiB3c3RhdHM7CisJfQorI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpCisJeworCQlpZiAoaXNfc2FtZV9uZXR3b3JrKHRhcmdldCwgJmllZWUtPmN1cnJlbnRfbmV0d29yaywgaWVlZSkpCisJCXsKKwkJCXByaW50aygiaXQncyBzYW1lIG5ldHdvcms6JXNcbiIsIHRhcmdldC0+c3NpZCk7CisjaWYgMAorCQkJaWYgKCF0bXBfbGV2ZWwpCisJCQl7CisJCQkJdG1wX2xldmVsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKKwkJCQl0bXBfcXVhbCA9IHRhcmdldC0+c3RhdHMuc2lnbmFsOworCQkJfQorCQkJZWxzZQorCQkJeworCisJCQkJdG1wX2xldmVsID0gKDE1KnRtcF9sZXZlbCArIHRhcmdldC0+c3RhdHMuc2lnbmFsc3RyZW5ndGgpLzE2OworCQkJCXRtcF9xdWFsID0gKDE1KnRtcF9xdWFsICsgdGFyZ2V0LT5zdGF0cy5zaWduYWwpLzE2OworCQkJfQorI2Vsc2UKKwkJCXRtcF9sZXZlbCA9IHRhcmdldC0+c3RhdHMuc2lnbmFsOworCQkJdG1wX3F1YWwgPSB0YXJnZXQtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCQkJdG1wX25vaXNlID0gdGFyZ2V0LT5zdGF0cy5ub2lzZTsKKwkJCXByaW50aygibGV2ZWw6JWQsIHF1YWw6JWQsIG5vaXNlOiVkXG4iLCB0bXBfbGV2ZWwsIHRtcF9xdWFsLCB0bXBfbm9pc2UpOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFnKTsKKyNlbmRpZgorCXRtcF9sZXZlbCA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMuc2lnbmFsOworCXRtcF9xdWFsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKKwl0bXBfbm9pc2UgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLm5vaXNlOworCS8vcHJpbnRrKCJsZXZlbDolZCwgcXVhbDolZCwgbm9pc2U6JWRcbiIsIHRtcF9sZXZlbCwgdG1wX3F1YWwsIHRtcF9ub2lzZSk7CisKKy8vCXByaW50aygibGV2ZWw6JWRcbiIsIHRtcF9sZXZlbCk7CisJd3N0YXRzLT5xdWFsLmxldmVsID0gdG1wX2xldmVsOworCXdzdGF0cy0+cXVhbC5xdWFsID0gdG1wX3F1YWw7CisJd3N0YXRzLT5xdWFsLm5vaXNlID0gdG1wX25vaXNlOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRHwgSVdfUVVBTF9EQk07CisJcmV0dXJuIHdzdGF0czsKK30KKyNlbmRpZgorCisKK3N0cnVjdCBpd19oYW5kbGVyX2RlZiAgcjgxODBfd3hfaGFuZGxlcnNfZGVmPXsKKwkuc3RhbmRhcmQgPSByODE4MF93eF9oYW5kbGVycywKKwkubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHI4MTgwX3d4X2hhbmRsZXJzKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZSA9IHI4MTgwX3ByaXZhdGVfaGFuZGxlciwKKwkubnVtX3ByaXZhdGUgPSBzaXplb2YocjgxODBfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKyAJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YocjgxODBfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCisJLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopcjgxODBfcHJpdmF0ZV9hcmdzLAorfTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwYTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guaApAQCAtMCwwICsxLDIxIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyIC0gdiAwLjMKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLyogdGhpcyBmaWxlICh3aWxsKSBjb250YWlucyB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMqLworCisjaWZuZGVmIFI4MTgwX1dYX0gKKyNkZWZpbmUgUjgxODBfV1hfSAorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCitleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIHI4MTgwX3d4X2hhbmRsZXJzX2RlZjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ODVhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYwpAQCAtMCwwICsxLDMzNDIgQEAKKy8qKysKK0NvcHlyaWdodCAoYykgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK01vZHVsZSBOYW1lOgorIAlyODE4NWJfaW5pdC5jCisKK0Fic3RyYWN0OgorIAlIYXJkd2FyZSBJbml0aWFsaXphdGlvbiBhbmQgSGFyZHdhcmUgSU8gZm9yIFJUTDgxODVCCisKK01ham9yIENoYW5nZSBIaXN0b3J5OgorCVdoZW4gICAgICAgIFdobyAgICAgIFdoYXQKKwktLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkyMDA2LTExLTE1ICAgIFhpb25nCQlDcmVhdGVkCisKK05vdGVzOgorCVRoaXMgZmlsZSBpcyBwb3J0ZWQgZnJvbSBSVEw4MTg1QiBXaW5kb3dzIGRyaXZlci4KKworCistLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1JbmNsdWRlIEZpbGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIiAgLyogUEhJTElQUyBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX21heDI4MjAuaCIgLyogTUFYSU0gUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9nY3QuaCIgICAgIC8qIEdDVCBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX3J0bDgyMjUuaCIgLyogUlRMODIyNSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX3J0bDgyNTUuaCIgLyogUlRMODI1NSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiICAgLyogQ2FyZCBFRVBST00gKi8KKyNpbmNsdWRlICJyODE4MF93eC5oIgorCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKyNpbmNsdWRlICJyODE4MF9wbS5oIgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCisvLyNkZWZpbmUgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKKyNkZWZpbmUgVENfM1dfUE9MTF9NQVhfVFJZX0NOVCA1CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworc3RhdGljIHU4IE1BQ19SRUdfVEFCTEVbXVsyXT17CisgICAgICAgICAgICAgICAgICAgICAgICAvL1BBR0EgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MzQoQlJTUiksIDB4QkUoUkFURV9GQUxMQkFDS19DVEwpLCAweDFFMChBUkZSKSB3b3VsZCBzZXQgaW4gSHdDb25maWd1cmVSVEw4MTg1KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MjcyKFJGU1dfQ1RSTCksIDB4MUNFKEFFU01TS19RQykgc2V0IGluIEluaXRpYWxpemVBZGFwdGVyODE4NSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgxRjB+MHgxRjggIHNldCBpbiBNYWNDb25maWdfODVCQVNJQygpCisgICAgICAgICAgICAgICAgICAgICAgICB7MHgwOCwgMHhhZX0sIHsweDBhLCAweDcyfSwgezB4NWIsIDB4NDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ODQsIDB4ODh9LCB7MHg4NSwgMHgyNH0sIHsweDg4LCAweDU0fSwgezB4OGIsIDB4Yjh9LCB7MHg4YywgMHgwM30sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4ZCwgMHg0MH0sIHsweDhlLCAweDAwfSwgezB4OGYsIDB4MDB9LCB7MHg1YiwgMHgxOH0sIHsweDkxLCAweDAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDk0LCAweDBGfSwgezB4OTUsIDB4MzJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OTYsIDB4MDB9LCB7MHg5NywgMHgwN30sIHsweGI0LCAweDIyfSwgezB4ZGIsIDB4MDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZjAsIDB4MzJ9LCB7MHhmMSwgMHgzMn0sIHsweGYyLCAweDAwfSwgezB4ZjMsIDB4MDB9LCB7MHhmNCwgMHgzMn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmNSwgMHg0M30sIHsweGY2LCAweDAwfSwgezB4ZjcsIDB4MDB9LCB7MHhmOCwgMHg0Nn0sIHsweGY5LCAweGE0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGZhLCAweDAwfSwgezB4ZmIsIDB4MDB9LCB7MHhmYywgMHg5Nn0sIHsweGZkLCAweGE0fSwgezB4ZmUsIDB4MDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZmYsIDB4MDB9LAorCisgICAgICAgICAgICAgICAgICAgICAgICAvL1BBR0UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBGbGV4dHJvbmljcyBzeXN0ZW0gTG9nbyBQQ0lIQ1QgZmFpbHVyZToKKwkJCS8vIDB4MUM0fjB4MUNEIHNldCBuby16ZXJvIHZhbHVlIHRvIGF2b2lkIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIDB4NDVbN109MQorICAgICAgICAgICAgICAgICAgICAgICAgezB4NWUsIDB4MDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NTgsIDB4MDB9LCB7MHg1OSwgMHgwMH0sIHsweDVhLCAweDA0fSwgezB4NWIsIDB4MDB9LCB7MHg2MCwgMHgyNH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg2MSwgMHg5N30sIHsweDYyLCAweEYwfSwgezB4NjMsIDB4MDl9LCB7MHg4MCwgMHgwRn0sIHsweDgxLCAweEZGfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDgyLCAweEZGfSwgezB4ODMsIDB4MDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4QzQsIDB4MjJ9LCB7MHhDNSwgMHgyMn0sIHsweEM2LCAweDIyfSwgezB4QzcsIDB4MjJ9LCB7MHhDOCwgMHgyMn0sIC8vbHptIGFkZCAwODA4MjYKKwkJCXsweEM5LCAweDIyfSwgezB4Q0EsIDB4MjJ9LCB7MHhDQiwgMHgyMn0sIHsweENDLCAweDIyfSwgezB4Q0QsIDB4MjJ9LC8vbHptIGFkZCAwODA4MjYKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGUyLCAweDAwfSwKKworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1BBR0UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDVlLCAweDAyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDBjLCAweDA0fSwgezB4NGMsIDB4MzB9LCB7MHg0ZCwgMHgwOH0sIHsweDUwLCAweDA1fSwgezB4NTEsIDB4ZjV9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NTIsIDB4MDR9LCB7MHg1MywgMHhhMH0sIHsweDU0LCAweGZmfSwgezB4NTUsIDB4ZmZ9LCB7MHg1NiwgMHhmZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1NywgMHhmZn0sIHsweDU4LCAweDA4fSwgezB4NTksIDB4MDh9LCB7MHg1YSwgMHgwOH0sIHsweDViLCAweDA4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDYwLCAweDA4fSwgezB4NjEsIDB4MDh9LCB7MHg2MiwgMHgwOH0sIHsweDYzLCAweDA4fSwgezB4NjQsIDB4MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OGMsIDB4M2Z9LCB7MHg4ZCwgMHgzZn0sIHsweDhlLCAweDNmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDhmLCAweDNmfSwgezB4YzQsIDB4ZmZ9LCB7MHhjNSwgMHhmZn0sIHsweGM2LCAweGZmfSwgezB4YzcsIDB4ZmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4YzgsIDB4MDB9LCB7MHhjOSwgMHgwMH0sIHsweGNhLCAweDgwfSwgezB4Y2IsIDB4MDB9LAorCisgICAgICAgICAgICAgICAgICAgICAgICAvL1BBR0EgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDVlLCAweDAwfSx7MHg5ZiwgMHgwM30KKyAgICAgICAgICAgICAgICB9OworCisKK3N0YXRpYyB1OCAgWkVCUkFfQUdDW109eworCQkJMCwKKwkJCTB4N0UsMHg3RSwweDdFLDB4N0UsMHg3RCwweDdDLDB4N0IsMHg3QSwweDc5LDB4NzgsMHg3NywweDc2LDB4NzUsMHg3NCwweDczLDB4NzIsCisJCQkweDcxLDB4NzAsMHg2RiwweDZFLDB4NkQsMHg2QywweDZCLDB4NkEsMHg2OSwweDY4LDB4NjcsMHg2NiwweDY1LDB4NjQsMHg2MywweDYyLAorCQkJMHg0OCwweDQ3LDB4NDYsMHg0NSwweDQ0LDB4MjksMHgyOCwweDI3LDB4MjYsMHgyNSwweDI0LDB4MjMsMHgyMiwweDIxLDB4MDgsMHgwNywKKwkJCTB4MDYsMHgwNSwweDA0LDB4MDMsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJCQkweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNSwweDE2LAorCQkJMHgxNywweDE3LDB4MTgsMHgxOCwweDE5LDB4MWEsMHgxYSwweDFiLDB4MWIsMHgxYywweDFjLDB4MWQsMHgxZCwweDFkLDB4MWUsMHgxZSwKKwkJCTB4MWYsMHgxZiwweDFmLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMSwweDIxLDB4MjEsMHgyMiwweDIyLDB4MjIsMHgyMywweDIzLDB4MjQsCisJCQkweDI0LDB4MjUsMHgyNSwweDI1LDB4MjYsMHgyNiwweDI3LDB4MjcsMHgyRiwweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYsMHgyRiwweDJGCisJCQl9OworCitzdGF0aWMgdTMyIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbXT17CisJCQkweDAwOTYsMHgwMDc2LDB4MDA1NiwweDAwMzYsMHgwMDE2LDB4MDFmNiwweDAxZDYsMHgwMWI2LAorCQkJMHgwMTk2LDB4MDE3NiwweDAwRjcsMHgwMEQ3LDB4MDBCNywweDAwOTcsMHgwMDc3LDB4MDA1NywKKwkJCTB4MDAzNywweDAwRkIsMHgwMERCLDB4MDBCQiwweDAwRkYsMHgwMEUzLDB4MDBDMywweDAwQTMsCisJCQkweDAwODMsMHgwMDYzLDB4MDA0MywweDAwMjMsMHgwMDAzLDB4MDFFMywweDAxQzMsMHgwMUEzLAorCQkJMHgwMTgzLDB4MDE2MywweDAxNDMsMHgwMTIzLDB4MDEwMworCX07CisKK3N0YXRpYyB1OCBPRkRNX0NPTkZJR1tdPXsKKwkJCS8vIE9GRE0gcmVnMHgwNls3OjBdPTB4RkY6IEVuYWJsZSBwb3dlciBzYXZpbmcgbW9kZSBpbiBSWAorCQkJLy8gT0ZETSByZWcweDNDWzRdPTEnYjE6IEVuYWJsZSBSWCBwb3dlciBzYXZpbmcgbW9kZQorCQkJLy8gb2ZkbSAweDNhID0gMHg3YiAsKG9yaWdpbmFsIDogMHhmYikgRm9yIEVDUyBzaGllbGRpbmcgcm9vbSBUUCB0ZXN0CisKKwkJCS8vIDB4MDAKKwkJCTB4MTAsIDB4MEYsIDB4MEEsIDB4MEMsIDB4MTQsIDB4RkEsIDB4RkYsIDB4NTAsCisJCQkweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDVDLCAweDAwLCAweDAwLAorCQkJLy8gMHgxMAorCQkJMHg0MCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgyNiwKKwkJCTB4MzIsIDB4MzMsIDB4MDYsIDB4QTUsIDB4NkYsIDB4NTUsIDB4QzgsIDB4QkIsCisJCQkvLyAweDIwCisJCQkweDBBLCAweEUxLCAweDJDLCAweDRBLCAweDg2LCAweDgzLCAweDM0LCAweDAwLAorCQkJMHg0RiwgMHgyNCwgMHg2RiwgMHhDMiwgMHgwMywgMHg0MCwgMHg4MCwgMHgwMCwKKwkJCS8vIDB4MzAKKwkJCTB4QzAsIDB4QzEsIDB4NTgsIDB4RjEsIDB4MDAsIDB4QzQsIDB4OTAsIDB4M2UsCisJCQkweEQ4LCAweDNDLCAweDdCLCAweDEwLCAweDEwCisJCX07CisjZWxzZQorIHN0YXRpYyB1OCBNQUNfUkVHX1RBQkxFW11bMl09eworCQkJLy9QQUdBIDA6CisJCQl7MHhmMCwgMHgzMn0sIHsweGYxLCAweDMyfSwgezB4ZjIsIDB4MDB9LCB7MHhmMywgMHgwMH0sIHsweGY0LCAweDMyfSwKKwkJCXsweGY1LCAweDQzfSwgezB4ZjYsIDB4MDB9LCB7MHhmNywgMHgwMH0sIHsweGY4LCAweDQ2fSwgezB4ZjksIDB4YTR9LAorCQkJezB4ZmEsIDB4MDB9LCB7MHhmYiwgMHgwMH0sIHsweGZjLCAweDk2fSwgezB4ZmQsIDB4YTR9LCB7MHhmZSwgMHgwMH0sCisJCQl7MHhmZiwgMHgwMH0sCisKKwkJCS8vUEFHRSAxOgorCQkJezB4NWUsIDB4MDF9LAorCQkJezB4NTgsIDB4NGJ9LCB7MHg1OSwgMHgwMH0sIHsweDVhLCAweDRifSwgezB4NWIsIDB4MDB9LCB7MHg2MCwgMHg0Yn0sCisJCQl7MHg2MSwgMHgwOX0sIHsweDYyLCAweDRifSwgezB4NjMsIDB4MDl9LCB7MHhjZSwgMHgwZn0sIHsweGNmLCAweDAwfSwKKwkJCXsweGUwLCAweGZmfSwgezB4ZTEsIDB4MGZ9LCB7MHhlMiwgMHgwMH0sIHsweGYwLCAweDRlfSwgezB4ZjEsIDB4MDF9LAorCQkJezB4ZjIsIDB4MDJ9LCB7MHhmMywgMHgwM30sIHsweGY0LCAweDA0fSwgezB4ZjUsIDB4MDV9LCB7MHhmNiwgMHgwNn0sCisJCQl7MHhmNywgMHgwN30sIHsweGY4LCAweDA4fSwKKworCisJCQkvL1BBR0UgMjoKKwkJCXsweDVlLCAweDAyfSwKKwkJCXsweDBjLCAweDA0fSwgezB4MjEsIDB4NjF9LCB7MHgyMiwgMHg2OH0sIHsweDIzLCAweDZmfSwgezB4MjQsIDB4NzZ9LAorCQkJezB4MjUsIDB4N2R9LCB7MHgyNiwgMHg4NH0sIHsweDI3LCAweDhkfSwgezB4NGQsIDB4MDh9LCB7MHg0ZSwgMHgwMH0sCisJCQl7MHg1MCwgMHgwNX0sIHsweDUxLCAweGY1fSwgezB4NTIsIDB4MDR9LCB7MHg1MywgMHhhMH0sIHsweDU0LCAweDFmfSwKKwkJCXsweDU1LCAweDIzfSwgezB4NTYsIDB4NDV9LCB7MHg1NywgMHg2N30sIHsweDU4LCAweDA4fSwgezB4NTksIDB4MDh9LAorCQkJezB4NWEsIDB4MDh9LCB7MHg1YiwgMHgwOH0sIHsweDYwLCAweDA4fSwgezB4NjEsIDB4MDh9LCB7MHg2MiwgMHgwOH0sCisJCQl7MHg2MywgMHgwOH0sIHsweDY0LCAweGNmfSwgezB4NzIsIDB4NTZ9LCB7MHg3MywgMHg5YX0sCisKKwkJCS8vUEFHQSAwOgorCQkJezB4NWUsIDB4MDB9LAorCQkJezB4MzQsIDB4ZmZ9LCB7MHgzNSwgMHgwZn0sIHsweDViLCAweDQwfSwgezB4ODQsIDB4ODh9LCB7MHg4NSwgMHgyNH0sCisJCQl7MHg4OCwgMHg1NH0sIHsweDhiLCAweGI4fSwgezB4OGMsIDB4MDd9LCB7MHg4ZCwgMHgwMH0sIHsweDk0LCAweDFifSwKKwkJCXsweDk1LCAweDEyfSwgezB4OTYsIDB4MDB9LCB7MHg5NywgMHgwNn0sIHsweDlkLCAweDFhfSwgezB4OWYsIDB4MTB9LAorCQkJezB4YjQsIDB4MjJ9LCB7MHhiZSwgMHg4MH0sIHsweGRiLCAweDAwfSwgezB4ZWUsIDB4MDB9LCB7MHg1YiwgMHg0Mn0sCisJCQl7MHg5MSwgMHgwM30sCisKKwkJCS8vUEFHRSAyOgorCQkJezB4NWUsIDB4MDJ9LAorCQkJezB4NGMsIDB4MDN9LAorCisJCQkvL1BBR0UgMDoKKwkJCXsweDVlLCAweDAwfSwKKworCQkJLy9QQUdFIDM6CisJCQl7MHg1ZSwgMHgwM30sCisJCQl7MHg5ZiwgMHgwMH0sCisKKwkJCS8vUEFHRSAwOgorCQkJezB4NWUsIDB4MDB9LAorCQkJezB4OGMsIDB4MDF9LCB7MHg4ZCwgMHgxMH0sezB4OGUsIDB4MDh9LCB7MHg4ZiwgMHgwMH0KKwkJfTsKKworCitzdGF0aWMgdTggIFpFQlJBX0FHQ1tdPXsKKwkwLAorCTB4NWUsMHg1ZSwweDVlLDB4NWUsMHg1ZCwweDViLDB4NTksMHg1NywweDU1LDB4NTMsMHg1MSwweDRmLDB4NGQsMHg0YiwweDQ5LDB4NDcsCisJMHg0NSwweDQzLDB4NDEsMHgzZiwweDNkLDB4M2IsMHgzOSwweDM3LDB4MzUsMHgzMywweDMxLDB4MmYsMHgyZCwweDJiLDB4MjksMHgyNywKKwkweDI1LDB4MjMsMHgyMSwweDFmLDB4MWQsMHgxYiwweDE5LDB4MTcsMHgxNSwweDEzLDB4MTEsMHgwZiwweDBkLDB4MGIsMHgwOSwweDA3LAorCTB4MDUsMHgwMywweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisJMHgxOSwweDE5LDB4MTksMHgwMTksMHgxOSwweDE5LDB4MTksMHgxOSwweDE5LDB4MTksMHgxZSwweDFmLDB4MjAsMHgyMSwweDIxLDB4MjIsCisJMHgyMywweDI0LDB4MjQsMHgyNSwweDI1LDB4MjYsMHgyNiwweDI3LDB4MjcsMHgyOCwweDI4LDB4MjgsMHgyOSwweDJhLDB4MmEsMHgyYiwKKwkweDJiLDB4MmIsMHgyYywweDJjLDB4MmMsMHgyZCwweDJkLDB4MmQsMHgyZSwweDJlLDB4MmYsMHgzMCwweDMxLDB4MzEsMHgzMSwweDMxLAorCTB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEKKwl9OworCitzdGF0aWMgdTMyIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbXT17CisJMCwKKwkweDA0MDAsMHgwNDAxLDB4MDQwMiwweDA0MDMsMHgwNDA0LDB4MDQwNSwweDA0MDgsMHgwNDA5LAorCTB4MDQwYSwweDA0MGIsMHgwNTAyLDB4MDUwMywweDA1MDQsMHgwNTA1LDB4MDU0MCwweDA1NDEsCisJMHgwNTQyLDB4MDU0MywweDA1NDQsMHgwNTQ1LDB4MDU4MCwweDA1ODEsMHgwNTgyLDB4MDU4MywKKwkweDA1ODQsMHgwNTg1LDB4MDU4OCwweDA1ODksMHgwNThhLDB4MDU4YiwweDA2NDMsMHgwNjQ0LAorCTB4MDY0NSwweDA2ODAsMHgwNjgxLDB4MDY4MiwweDA2ODMsMHgwNjg0LDB4MDY4NSwweDA2ODgsCisJMHgwNjg5LDB4MDY4YSwweDA2OGIsMHgwNjhjLDB4MDc0MiwweDA3NDMsMHgwNzQ0LDB4MDc0NSwKKwkweDA3ODAsMHgwNzgxLDB4MDc4MiwweDA3ODMsMHgwNzg0LDB4MDc4NSwweDA3ODgsMHgwNzg5LAorCTB4MDc4YSwweDA3OGIsMHgwNzhjLDB4MDc4ZCwweDA3OTAsMHgwNzkxLDB4MDc5MiwweDA3OTMsCisJMHgwNzk0LDB4MDc5NSwweDA3OTgsMHgwNzk5LDB4MDc5YSwweDA3OWIsMHgwNzljLDB4MDc5ZCwKKwkweDA3YTAsMHgwN2ExLDB4MDdhMiwweDA3YTMsMHgwN2E0LDB4MDdhNSwweDA3YTgsMHgwN2E5LAorCTB4MDNhYSwweDAzYWIsMHgwM2FjLDB4MDNhZCwweDAzYjAsMHgwM2IxLDB4MDNiMiwweDAzYjMsCisJMHgwM2I0LDB4MDNiNSwweDAzYjgsMHgwM2I5LDB4MDNiYSwweDAzYmIsMHgwM2JiCit9OworCisvLyAyMDA2LjA3LjEzLCBTRDMgc3p1eWl0YXNpOgorLy8JT0ZETS4weDAzPTB4MEMgKG9yaWdpbmFsIGlzIDB4MEYpCisvLyBVc2UgdGhlIG5ldyBTRDMgZ2l2ZW4gcGFyYW0sIGJ5IHNoaWVuIGNoYW5nLCAyMDA2LjA3LjE0CitzdGF0aWMgdTggT0ZETV9DT05GSUdbXT17CisJMHgxMCwgMHgwZCwgMHgwMSwgMHgwQywgMHgxNCwgMHhmYiwgMHgwZiwgMHg2MCwgMHgwMCwgMHg2MCwKKwkweDAwLCAweDAwLCAweDAwLCAweDVjLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4YTgsIDB4NDYsIDB4YjIsIDB4MzMsIDB4MDcsIDB4YTUsIDB4NmYsIDB4NTUsCisJMHhjOCwgMHhiMywgMHgwYSwgMHhlMSwgMHgxYywgMHg4YSwgMHhiNiwgMHg4MywgMHgzNCwgMHgwZiwKKwkweDRmLCAweDIzLCAweDZmLCAweGMyLCAweDZiLCAweDQwLCAweDgwLCAweDAwLCAweGMwLCAweGMxLAorCTB4NTgsIDB4ZjEsIDB4MDAsIDB4ZTQsIDB4OTAsIDB4M2UsIDB4NmQsIDB4M2MsIDB4ZmYsIDB4MDcKK307CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgKiBIYXJkd2FyZSBJTworICAqIHRoZSBjb2RlIGlzIHBvcnRlZCBmcm9tIFdpbmRvd3Mgc291cmNlIGNvZGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQKK1BsYXRmb3JtSU9Xcml0ZTFCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQsCisJdTgJCWRhdGEKKwkpCit7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCXdyaXRlX25pY19ieXRlKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwlyZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0KTsgLy8gVG8gbWFrZSBzdXJlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIDIwMDUuMTEuMDksIGJ5IHJjbmprby4KKworI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIG9mZnNldCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChvZmZzZXQgJiAweGZmKSwgZGF0YSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1dyaXRlMUJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCit9CisKK3ZvaWQKK1BsYXRmb3JtSU9Xcml0ZTJCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQsCisJdTE2CQlkYXRhCisJKQoreworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwl3cml0ZV9uaWNfd29yZChkZXYsIG9mZnNldCwgZGF0YSk7CisJcmVhZF9uaWNfd29yZChkZXYsIG9mZnNldCk7IC8vIFRvIG1ha2Ugc3VyZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCAyMDA1LjExLjA5LCBieSByY25qa28uCisKKworI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQl3cml0ZV9uaWNfd29yZChkZXYsIG9mZnNldCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSwgZGF0YSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1dyaXRlMkJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCit9Cit1OCBQbGF0Zm9ybUlPUmVhZDFCeXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBvZmZzZXQpOworCit2b2lkCitQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0LAorCXUzMgkJZGF0YQorCSkKK3sKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisvL3tieSBhbXkgMDgwMzEyCitpZiAob2Zmc2V0ID09IFBoeUFkZHIpCisJey8vRm9yIEJhc2UgQmFuZCBjb25maWd1cmF0aW9uLgorCQl1bnNpZ25lZCBjaGFyCWNtZEJ5dGU7CisJCXVuc2lnbmVkIGxvbmcJZGF0YUJ5dGVzOworCQl1bnNpZ25lZCBjaGFyCWlkeDsKKwkJdTgJdTFiVG1wOworCisJCWNtZEJ5dGUgPSAodTgpKGRhdGEgJiAweDAwMDAwMGZmKTsKKwkJZGF0YUJ5dGVzID0gZGF0YT4+ODsKKworCQkvLworCQkvLyAwNzEwMTAsIHJjbmprbzoKKwkJLy8gVGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgb25seSBCQiByZWFkL3dyaXRlIHJhY2UgY29uZGl0aW9uLgorCQkvLyBBc3N1bXB0aW9uOgorCQkvLyAxLiBXZSBhc3N1bWUgTk8gb25lIHdpbGwgYWNjZXNzIEJCIGF0IERJUlFMLCBvdGhlcndpc2UsIHN5c3RlbSB3aWxsIGNyYXNoIGZvcgorCQkvLyBhY3F1aXJpbmcgdGhlIHNwaW5sb2NrIGluIHN1Y2ggY29udGV4dC4KKwkJLy8gMi4gUGxhdGZvcm1JT1dyaXRlNEJ5dGUoKSBNVVNUIE5PVCBiZSByZWN1cnNpdmUuCisJCS8vCisvLwkJTmRpc0FjcXVpcmVTcGluTG9jayggJihwRGV2aWNlLT5Jb1NwaW5Mb2NrKSApOworCisJCWZvcihpZHggPSAwOyBpZHggPCAzMDsgaWR4KyspCisJCXsgLy8gTWFrZSBzdXJlIGNvbW1hbmQgYml0IGlzIGNsZWFyIGJlZm9yZSBhY2Nlc3MgaXQuCisJCQl1MWJUbXAgPSBQbGF0Zm9ybUlPUmVhZDFCeXRlKGRldiwgUGh5QWRkcik7CisJCQlpZigodTFiVG1wICYgQklUNykgPT0gMCkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQltZGVsYXkoMTApOworCQl9CisKKwkJZm9yKGlkeD0wOyBpZHggPCAzOyBpZHgrKykKKwkJeworCQkJUGxhdGZvcm1JT1dyaXRlMUJ5dGUoZGV2LG9mZnNldCsxK2lkeCwoKHU4KikmZGF0YUJ5dGVzKVtpZHhdICk7CisJCX0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBvZmZzZXQsIGNtZEJ5dGUpOworCisvLwkJTmRpc1JlbGVhc2VTcGluTG9jayggJihwRGV2aWNlLT5Jb1NwaW5Mb2NrKSApOworCX0KKy8vYnkgYW15IDA4MDMxMn0KKwllbHNleworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBvZmZzZXQsIGRhdGEpOworCQlyZWFkX25pY19kd29yZChkZXYsIG9mZnNldCk7IC8vIFRvIG1ha2Ugc3VyZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCAyMDA1LjExLjA5LCBieSByY25qa28uCisJfQorI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQl3cml0ZV9uaWNfd29yZChkZXYsIG9mZnNldCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAob2Zmc2V0ICYgMHhmZiksIGRhdGEpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9Xcml0ZTRCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorfQorCit1OAorUGxhdGZvcm1JT1JlYWQxQnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0CisJKQoreworCXU4CWRhdGEgPSAwOworCisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCWRhdGEgPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0KTsKKworI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQlkYXRhID0gcmVhZF9uaWNfYnl0ZShkZXYsIG9mZnNldCk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQlkYXRhID0gcmVhZF9uaWNfYnl0ZShkZXYsIChvZmZzZXQgJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1JlYWQxQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCXJldHVybiBkYXRhOworfQorCit1MTYKK1BsYXRmb3JtSU9SZWFkMkJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldAorCSkKK3sKKwl1MTYJZGF0YSA9IDA7CisKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJZGF0YSA9IHJlYWRfbmljX3dvcmQoZGV2LCBvZmZzZXQpOworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCWRhdGEgPSByZWFkX25pY193b3JkKGRldiwgb2Zmc2V0KTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8vIFBhZ2UgMQorCWNhc2UgMjogLy8gUGFnZSAyCisJY2FzZSAzOiAvLyBQYWdlIDMKKwkJeworCQkJdTggcHNyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoKHBzciAmIDB4ZmMpIHwgKHU4KVBhZ2UpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgTi4KKwkJCWRhdGEgPSByZWFkX25pY193b3JkKGRldiwgKG9mZnNldCAmIDB4ZmYpKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPUmVhZDJCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKK3UzMgorUGxhdGZvcm1JT1JlYWQ0Qnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0CisJKQoreworCXUzMglkYXRhID0gMDsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwlkYXRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBvZmZzZXQpOworCisjZWxzZSAvLyBQb3J0IElPCisJdTMyIFBhZ2UgPSAob2Zmc2V0ID4+IDgpOworCisJc3dpdGNoKFBhZ2UpCisJeworCWNhc2UgMDogLy8gUGFnZSAwCisJCWRhdGEgPSByZWFkX25pY19kd29yZChkZXYsIG9mZnNldCk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQlkYXRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCAob2Zmc2V0ICYgMHhmZikpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9SZWFkNEJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYXG4iLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCXJldHVybiBkYXRhOworfQorCit2b2lkCitTZXRPdXRwdXRFbmFibGVPZlJmUGlucygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGQ0hJUElEX1JUTDgyMjU6CisJY2FzZSBSRl9aRUJSQTI6CisJY2FzZSBSRl9aRUJSQTQ6CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDFiZmYpOworCQkvL3dyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAweDFmZmYpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQKK1pFQlJBX1JGU2VyaWFsV3JpdGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCQlkYXRhMldyaXRlLAorCXU4CQkJdG90YWxMZW5ndGgsCisJdTgJCQlsb3cyaGlnaAorCSkKK3sKKwlUaHJlZVdpcmVSZWcJCXR3cmVnOworCWludCAJCQkJaTsKKwl1MTYJCQkJb3ZhbCxvdmFsMixvdmFsMzsKKwl1MzIJCQkJbWFzazsKKwl1MTYJCQkJVXNob3J0QnVmZmVyOworCisJdTgJCQl1MWJUbXA7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIFJUTDgxODdTIEhTU0kgUmVhZC9Xcml0ZSBGdW5jdGlvbgorCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcpOworCXUxYlRtcCB8PSAgIFJGX1NXX0NGR19TSTsgICAvL3JlZzA4WzFdPTEgU2VyaWFsIEludGVyZmFjZShTSSkKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRywgdTFiVG1wKTsKKyNlbmRpZgorCVVzaG9ydEJ1ZmZlciA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpOworCW92YWwgPSBVc2hvcnRCdWZmZXIgJiAweGZmZjg7IC8vIFdlIHNoYWxsIGNsZWFyIGJpdDAsIDEsIDIgZmlyc3QsIDIwMDUuMTAuMjgsIGJ5IHJjbmprby4KKworCW92YWwyID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSk7CisJb3ZhbDMgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCS8vIDxSSl9OT1RFPiAzLXdpcmUgc2hvdWxkIGJlIGNvbnRyb2xlZCBieSBIVyB3aGVuIHdlIGZpbmlzaCBTVyAzLXdpcmUgcHJvZ3JhbW1pbmcuIDIwMDUuMDguMTAsIGJ5IHJjbmprby4KKwlvdmFsMyAmPSAweGZmZjg7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgKG92YWwyfDB4MDAwNykpOyAvLyBTZXQgVG8gT3V0cHV0IEVuYWJsZQorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAob3ZhbDN8MHgwMDA3KSk7IC8vIFNldCBUbyBTVyBTd2l0Y2gKKwl1ZGVsYXkoMTApOworCisJLy8gQWRkIHRoaXMgdG8gYXZvaWQgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIDMtd2lyZSBjb25mbGljdC4KKwkvLyAyMDA1LjAzLjAxLCBieSByY25qa28uCisJdHdyZWcubG9uZ0RhdGEgPSAwOworCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAxOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOyAvLyBTZXQgU0lfRU4gKFJGTEUpCisJdWRlbGF5KDIpOworCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOyAvLyBDbGVhciBTSV9FTiAoUkZMRSkKKwl1ZGVsYXkoMTApOworCisJbWFzayA9IChsb3cyaGlnaCk/MHgwMTooKHUzMikweDAxPDwodG90YWxMZW5ndGgtMSkpOworCisJZm9yKGk9MDsgaTx0b3RhbExlbmd0aC8yOyBpKyspCisJeworCQl0d3JlZy5zdHJ1Yy5kYXRhID0gKChkYXRhMldyaXRlJm1hc2spIT0wKSA/IDEgOiAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJdHdyZWcuc3RydWMuY2xrID0gMTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCisJCW1hc2sgPSAobG93MmhpZ2gpPyhtYXNrPDwxKToobWFzaz4+MSk7CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykhPTApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJdHdyZWcuc3RydWMuY2xrID0gMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCW1hc2sgPSAobG93MmhpZ2gpPyhtYXNrPDwxKToobWFzaz4+MSk7CisJfQorCisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDE7CisJdHdyZWcuc3RydWMuY2xrID0gMDsKKwl0d3JlZy5zdHJ1Yy5kYXRhID0gMDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdmFsfDB4MDAwNCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIG92YWwzfDB4MDAwMCk7CisKKwlTZXRPdXRwdXRFbmFibGVPZlJmUGlucyhkZXYpOworfQorLy9ieSBhbXkKKworCitpbnQKK0h3SFNTSVRocmVlV2lyZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJKnBEYXRhQnVmLAorCXU4CQkJbkRhdGFCdWZCaXRDbnQsCisJaW50CQkJYlNJLAorCWludAkJCWJXcml0ZQorCSkKK3sKKwlpbnQJYlJlc3VsdCA9IDE7CisJdTgJVHJ5Q250OworCXU4CXUxYlRtcDsKKworCWRvCisJeworCQkvLyBDaGVjayBpZiBXRSBhbmQgUkUgYXJlIGNsZWFyZWQuCisJCWZvcihUcnlDbnQgPSAwOyBUcnlDbnQgPCBUQ18zV19QT0xMX01BWF9UUllfQ05UOyBUcnlDbnQrKykKKwkJeworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEpOworCQkJaWYoICh1MWJUbXAgJiAoU1dfM1dfQ01EMV9SRXxTV18zV19DTUQxX1dFKSkgPT0gMCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmIChUcnlDbnQgPT0gVENfM1dfUE9MTF9NQVhfVFJZX0NOVCkKKwkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBDbWRSZWc6ICUjWCBSRXxXRSBiaXRzIGFyZSBub3QgY2xlYXIhIVxuIiwgdTFiVG1wKTsKKworCQkvLyBSVEw4MTg3UyBIU1NJIFJlYWQvV3JpdGUgRnVuY3Rpb24KKwkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRyk7CisKKwkJaWYoYlNJKQorCQl7CisJCQl1MWJUbXAgfD0gICBSRl9TV19DRkdfU0k7ICAgLy9yZWcwOFsxXT0xIFNlcmlhbCBJbnRlcmZhY2UoU0kpCisJCX1lbHNlCisJCXsKKwkJCXUxYlRtcCAmPSB+UkZfU1dfQ0ZHX1NJOyAgLy9yZWcwOFsxXT0wIFBhcmFsbGVsIEludGVyZmFjZShQSSkKKwkJfQorCisJCXdyaXRlX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHLCB1MWJUbXApOworCisJCWlmKGJTSSkKKwkJeworCQkJLy8gam9uZzogSFcgU0kgcmVhZCBtdXN0IHNldCByZWc4NFszXT0wLgorCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJGUGluc1NlbGVjdCk7CisJCQl1MWJUbXAgJj0gfkJJVDM7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJGUGluc1NlbGVjdCwgdTFiVG1wICk7CisJCX0KKwkgCS8vIEZpbGwgdXAgZGF0YSBidWZmZXIgZm9yIHdyaXRlIG9wZXJhdGlvbi4KKworCQlpZihiV3JpdGUpCisJCXsKKwkJCWlmKG5EYXRhQnVmQml0Q250ID09IDE2KQorCQkJeworCQkJCXdyaXRlX25pY193b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MTYqKXBEYXRhQnVmKSk7CisJCQl9CisJCQllbHNlIGlmKG5EYXRhQnVmQml0Q250ID09IDY0KSAgLy8gUlRMODE4N1Mgc2hvdWxkbid0IGVudGVyIHRoaXMgY2FzZQorCQkJeworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTMyKilwRGF0YUJ1ZikpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFNXXzNXX0RCMSwgKigodTMyKikocERhdGFCdWYgKyA0KSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWludCBpZHg7CisJCQkJaW50IEJ5dGVDbnQgPSBuRGF0YUJ1ZkJpdENudCAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCIlZFxuIixuRGF0YUJ1ZkJpdENudCk7CisJCQkJaWYgKChuRGF0YUJ1ZkJpdENudCAlIDgpICE9IDApCisJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOCEhIVxuIiwKKwkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCSAgICAgICBpZiAobkRhdGFCdWZCaXRDbnQgPiA2NCkKKwkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCA8PSA2NCEhIVxuIiwKKwkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCQlmb3IoaWR4ID0gMDsgaWR4IDwgQnl0ZUNudDsgaWR4KyspCisJCQkJeworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChTV18zV19EQjAraWR4KSwgKihwRGF0YUJ1ZitpZHgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQkJLy9yZWFkCisJCXsKKwkJCWlmKGJTSSkKKwkJCXsKKwkJCQkvLyBTSSAtIHJlZzI3NFszOjBdIDogUkYgcmVnaXN0ZXIncyBBZGRyZXNzCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBTV18zV19EQjAsICooKHUxNiopcERhdGFCdWYpICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gUEkgLSByZWcyNzRbMTU6MTJdIDogUkYgcmVnaXN0ZXIncyBBZGRyZXNzCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBTV18zV19EQjAsICgqKCh1MTYqKXBEYXRhQnVmKSkgPDwgMTIpOworCQkJfQorCQl9CisKKwkJLy8gU2V0IHVwIGNvbW1hbmQ6IFdFIG9yIFJFLgorCQlpZihiV3JpdGUpCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9XRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIFNXXzNXX0NNRDFfUkUpOworCQl9CisKKwkJLy8gQ2hlY2sgaWYgRE9ORSBpcyBzZXQuCisJCWZvcihUcnlDbnQgPSAwOyBUcnlDbnQgPCBUQ18zV19QT0xMX01BWF9UUllfQ05UOyBUcnlDbnQrKykKKwkJeworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEpOworCQkJaWYoICAodTFiVG1wICYgU1dfM1dfQ01EMV9ET05FKSAhPSAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIDApOworCisJCS8vIFJlYWQgYmFjayBkYXRhIGZvciByZWFkIG9wZXJhdGlvbi4KKwkJaWYoYldyaXRlID09IDApCisJCXsKKwkJCWlmKGJTSSkKKwkJCXsKKwkJCQkvL1NlcmlhbCBJbnRlcmZhY2UgOiByZWczNjNfMzYyWzExOjBdCisJCQkJKigodTE2KilwRGF0YUJ1ZikgPSByZWFkX25pY193b3JkKGRldiwgU0lfREFUQV9SRUFEKSA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy9QYXJhbGxlbCBJbnRlcmZhY2UgOiByZWczNjFfMzYwWzExOjBdCisJCQkJKigodTE2KilwRGF0YUJ1ZikgPSByZWFkX25pY193b3JkKGRldiwgUElfREFUQV9SRUFEKTsKKwkJCX0KKworCQkJKigodTE2KilwRGF0YUJ1ZikgJj0gMHgwRkZGOworCQl9CisKKwl9d2hpbGUoMCk7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKy8vYnkgYW15CisKK2ludAorSHdUaHJlZVdpcmUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCSpwRGF0YUJ1ZiwKKwl1OAkJCW5EYXRhQnVmQml0Q250LAorCWludAkJCWJIb2xkLAorCWludAkJCWJXcml0ZQorCSkKK3sKKwlpbnQJYlJlc3VsdCA9IDE7CisJdTgJVHJ5Q250OworCXU4CXUxYlRtcDsKKworCWRvCisJeworCQkvLyBDaGVjayBpZiBXRSBhbmQgUkUgYXJlIGNsZWFyZWQuCisJCWZvcihUcnlDbnQgPSAwOyBUcnlDbnQgPCBUQ18zV19QT0xMX01BWF9UUllfQ05UOyBUcnlDbnQrKykKKwkJeworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEpOworCQkJaWYoICh1MWJUbXAgJiAoU1dfM1dfQ01EMV9SRXxTV18zV19DTUQxX1dFKSkgPT0gMCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmIChUcnlDbnQgPT0gVENfM1dfUE9MTF9NQVhfVFJZX0NOVCkKKwkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBDbWRSZWc6ICUjWCBSRXxXRSBiaXRzIGFyZSBub3QgY2xlYXIhIVxuIiwgdTFiVG1wKTsKKworCQkvLyBGaWxsIHVwIGRhdGEgYnVmZmVyIGZvciB3cml0ZSBvcGVyYXRpb24uCisJCWlmKG5EYXRhQnVmQml0Q250ID09IDE2KQorCQl7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTE2ICopcERhdGFCdWYpKTsKKwkJfQorCQllbHNlIGlmKG5EYXRhQnVmQml0Q250ID09IDY0KQorCQl7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjAsICooKHUzMiAqKXBEYXRhQnVmKSk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjEsICooKHUzMiAqKShwRGF0YUJ1ZiArIDQpKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgaWR4OworCQkJaW50IEJ5dGVDbnQgPSBuRGF0YUJ1ZkJpdENudCAvIDg7CisKKwkJCWlmICgobkRhdGFCdWZCaXRDbnQgJSA4KSAhPSAwKQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDghISFcbiIsCisJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQlpZiAobkRhdGFCdWZCaXRDbnQgPiA2NCkKKwkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCA8PSA2NCEhIVxuIiwKKwkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCWZvcihpZHggPSAwOyBpZHggPCBCeXRlQ250OyBpZHgrKykKKwkJCXsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChTV18zV19EQjAraWR4KSwgKihwRGF0YUJ1ZitpZHgpKTsKKwkJCX0KKwkJfQorCisJCS8vIEZpbGwgdXAgbGVuZ3RoIGZpZWxkLgorCQl1MWJUbXAgPSAodTgpKG5EYXRhQnVmQml0Q250IC0gMSk7IC8vIE51bWJlciBvZiBiaXRzIC0gMS4KKwkJaWYoYkhvbGQpCisJCQl1MWJUbXAgfD0gU1dfM1dfQ01EMF9IT0xEOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDAsIHUxYlRtcCk7CisKKwkJLy8gU2V0IHVwIGNvbW1hbmQ6IFdFIG9yIFJFLgorCQlpZihiV3JpdGUpCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSwgU1dfM1dfQ01EMV9XRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIFNXXzNXX0NNRDFfUkUpOworCQl9CisKKwkJLy8gQ2hlY2sgaWYgV0UgYW5kIFJFIGFyZSBjbGVhcmVkIGFuZCBET05FIGlzIHNldC4KKwkJZm9yKFRyeUNudCA9IDA7IFRyeUNudCA8IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQ7IFRyeUNudCsrKQorCQl7CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgU1dfM1dfQ01EMSk7CisJCQlpZiggKHUxYlRtcCAmIChTV18zV19DTUQxX1JFfFNXXzNXX0NNRDFfV0UpKSA9PSAwICYmCisJCQkJKHUxYlRtcCAmIFNXXzNXX0NNRDFfRE9ORSkgIT0gMCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisJCWlmKFRyeUNudCA9PSBUQ18zV19QT0xMX01BWF9UUllfQ05UKQorCQl7CisJCQkvL1JUX0FTU0VSVChUcnlDbnQgIT0gVENfM1dfUE9MTF9NQVhfVFJZX0NOVCwKKwkJCS8vCSgiSHdUaHJlZVdpcmUoKTogQ21kUmVnOiAlI1ggUkV8V0UgYml0cyBhcmUgbm90IGNsZWFyIG9yIERPTkUgaXMgbm90IHNldCEhXG4iLCB1MWJUbXApKTsKKwkJCS8vIFdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IHdjY2h1OiBjbGVhciBXRSBoZXJlLiAyMDA2LjA3LjA3LCBieSByY25qa28uCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIDApOworCQl9CisKKwkJLy8gUmVhZCBiYWNrIGRhdGEgZm9yIHJlYWQgb3BlcmF0aW9uLgorCQkvLyA8UkpfVE9ETz4gSSBhbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3Qgb3V0cHV0IGZvcm1hdCBvZiBhIHJlYWQgb3BlcmF0aW9uLgorCQlpZihiV3JpdGUgPT0gMCkKKwkJeworCQkJaWYobkRhdGFCdWZCaXRDbnQgPT0gMTYpCisJCQl7CisJCQkJKigodTE2ICopcERhdGFCdWYpID0gcmVhZF9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCk7CisJCQl9CisJCQllbHNlIGlmKG5EYXRhQnVmQml0Q250ID09IDY0KQorCQkJeworCQkJCSooKHUzMiAqKXBEYXRhQnVmKSA9IHJlYWRfbmljX2R3b3JkKGRldiwgU1dfM1dfREIwKTsKKwkJCQkqKCh1MzIgKikocERhdGFCdWYgKyA0KSkgPSByZWFkX25pY19kd29yZChkZXYsIFNXXzNXX0RCMSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50IGlkeDsKKwkJCQlpbnQgQnl0ZUNudCA9IG5EYXRhQnVmQml0Q250IC8gODsKKworCQkJCWlmICgobkRhdGFCdWZCaXRDbnQgJSA4KSAhPSAwKQorCQkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA4ISEhXG4iLAorCQkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCQlpZiAobkRhdGFCdWZCaXRDbnQgPiA2NCkKKwkJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgPD0gNjQhISFcbiIsCisJCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJCWZvcihpZHggPSAwOyBpZHggPCBCeXRlQ250OyBpZHgrKykKKwkJCQl7CisJCQkJCSoocERhdGFCdWYraWR4KSA9IHJlYWRfbmljX2J5dGUoZGV2LCAoU1dfM1dfREIwK2lkeCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfXdoaWxlKDApOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKKwordm9pZAorUkZfV3JpdGVSZWcoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJb2Zmc2V0LAorCXUzMgkJZGF0YQorCSkKK3sKKwkvL1JGUmVnCQkJcmVnOworCXUzMgkJCWRhdGEyV3JpdGU7CisJdTgJCQlsZW47CisJdTgJCQlsb3cyaGlnaDsKKwkvL3UzMgkJCVJGX1JlYWQgPSAwOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZDSElQSURfUlRMODIyNToKKwljYXNlIFJGX1pFQlJBMjoJCS8vIEFubmllIDIwMDYtMDUtMTIuCisJY2FzZSBSRl9aRUJSQTQ6ICAgICAgICAvL2J5IGFteQorCQlzd2l0Y2gocHJpdi0+UmVnVGhyZWVXaXJlTW9kZSkKKwkJeworCQljYXNlIFNXX1RIUkVFX1dJUkU6CisJCQl7IC8vIFBlcmZvcm0gU1cgMy13aXJlIHByb2dyYW1taW5nIGJ5IGRyaXZlci4KKwkJCQlkYXRhMldyaXRlID0gKGRhdGEgPDwgNCkgfCAodTMyKShvZmZzZXQgJiAweDBmKTsKKwkJCQlsZW4gPSAxNjsKKwkJCQlsb3cyaGlnaCA9IDA7CisJCQkJWkVCUkFfUkZTZXJpYWxXcml0ZShkZXYsIGRhdGEyV3JpdGUsIGxlbiwgbG93MmhpZ2gpOworICAgICAgIAkJCX0KKwkJCWJyZWFrOworCisgCQljYXNlIEhXX1RIUkVFX1dJUkU6CisJCQl7IC8vIFB1cmUgSFcgMy13aXJlLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworCQkJCUh3VGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCAqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQlsZW4sCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkwLAkJCQkJLy8gYkhvbGQsCisJCQkJCTEpOwkJCQkJLy8gYldyaXRlCisgICAgICAgICAJCX0KKwkJCWJyZWFrOworICAjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCQkJY2FzZSBIV19USFJFRV9XSVJFX1BJOiAvL1BhcmFsbGVsIEludGVyZmFjZQorCQkJeyAvLyBQdXJlIEhXIDMtd2lyZS4KKwkJCQlkYXRhMldyaXRlID0gKGRhdGEgPDwgNCkgfCAodTMyKShvZmZzZXQgJiAweDBmKTsKKwkJCQlsZW4gPSAxNjsKKwkJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQkJZGV2LAorCQkJCQkJKHU4KikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJCWxlbiwJCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJCTAsIAkJCQkJLy8gYlNJCisJCQkJCQkxKTsgCQkJCQkvLyBiV3JpdGUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiMzMzMzNcbiIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgSFdfVEhSRUVfV0lSRV9TSTogLy9TZXJpYWwgSW50ZXJmYWNlCisJCQl7IC8vIFB1cmUgSFcgMy13aXJlLgorCQkJCWRhdGEyV3JpdGUgPSAoZGF0YSA8PCA0KSB8ICh1MzIpKG9mZnNldCAmIDB4MGYpOworCQkJCWxlbiA9IDE2OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiIGVudGVyICBaRUJSQV9SRlNlcmlhbFdyaXRlXG4gIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93MmhpZ2ggPSAwOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFQlJBX1JGU2VyaWFsV3JpdGUoZGV2LCBkYXRhMldyaXRlLCBsZW4sIGxvdzJoaWdoKTsKKworCQkJCUh3SFNTSVRocmVlV2lyZSgKKwkJCQkJZGV2LAorCQkJCQkodTgqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQlsZW4sCQkJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCTEsIAkJCQkJLy8gYlNJCisJCQkJCTEpOyAJCQkJCS8vIGJXcml0ZQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiIGV4aXQgWkVCUkFfUkZTZXJpYWxXcml0ZVxuICIpOworCQkJfQorCQkJYnJlYWs7CisgICNlbmRpZgorCisKKwkJZGVmYXVsdDoKKwkJCURNRVNHRSgiUkZfV3JpdGVSZWcoKTogaW52YWxpZCBSZWdUaHJlZVdpcmVNb2RlKCVkKSAhISEiLCBwcml2LT5SZWdUaHJlZVdpcmVNb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRE1FU0dFKCJSRl9Xcml0ZVJlZygpOiB1bmtub3duIFJGQ2hpcElEOiAlI1giLCBwcml2LT5yZl9jaGlwKTsKKwkJYnJlYWs7CisJfQorfQorCisKK3ZvaWQKK1pFQlJBX1JGU2VyaWFsUmVhZCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJZGF0YTJXcml0ZSwKKwl1OAkJd0xlbmd0aCwKKwl1MzIJCSpkYXRhMlJlYWQsCisJdTgJCXJMZW5ndGgsCisJdTgJCWxvdzJoaWdoCisJKQoreworCVRocmVlV2lyZVJlZwl0d3JlZzsKKwlpbnQJCQkJaTsKKwl1MTYJCQlvdmFsLG92YWwyLG92YWwzLHRtcCwgd1JlZzgwOworCXUzMgkJCW1hc2s7CisJdTgJCQl1MWJUbXA7CisJVGhyZWVXaXJlUmVnCXRkYXRhOworCS8vUEhBTF9EQVRBXzgxODcJcEhhbERhdGEgPSBHZXRIYWxEYXRhODE4NyhwQWRhcHRlcik7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXsgLy8gUlRMODE4N1MgSFNTSSBSZWFkL1dyaXRlIEZ1bmN0aW9uCisJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcpOworCQl1MWJUbXAgfD0gICBSRl9TV19DRkdfU0k7ICAgLy9yZWcwOFsxXT0xIFNlcmlhbCBJbnRlcmZhY2UoU0kpCisJCXdyaXRlX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHLCB1MWJUbXApOworCX0KKyNlbmRpZgorCisJd1JlZzgwID0gb3ZhbCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQpOworCW92YWwyID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSk7CisJb3ZhbDMgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCBvdmFsMnwweGYpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBvdmFsM3wweGYpOworCisJKmRhdGEyUmVhZCA9IDA7CisKKwkvLyBXZSBtdXN0IGNsZWFyIEJJVDAtMyBoZXJlLCBvdGhlcndpc2UsCisJLy8gU1dfRW5hbGJlIHdpbGwgYmUgdHJ1ZSB3aGVuIHdlIGZpcnN0IGNhbGwgWkVCUkFfUkZTZXJpYWxSZWFkKCkgYWZ0ZXIgODE4N01QVkMgb3BlbiwKKwkvLyB3aGljaCB3aWxsIGNhdXNlIHRoZSB2YWx1ZSByZWFkIGJlY29tZSAwLiAyMDA1LjA0LjExLCBieSByY25qa28uCisJb3ZhbCAmPSB+MHhmOworCisJLy8gQXZvaWQgY29sbGlzaW9uIHdpdGggaGFyZHdhcmUgdGhyZWUtd2lyZS4KKwl0d3JlZy5sb25nRGF0YSA9IDA7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDE7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoNCk7CisKKwl0d3JlZy5sb25nRGF0YSA9IDA7CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDA7CisJdHdyZWcuc3RydWMuY2xrID0gMDsKKwl0d3JlZy5zdHJ1Yy5yZWFkX3dyaXRlID0gMDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSg1KTsKKworCW1hc2sgPSAobG93MmhpZ2gpID8gMHgwMSA6ICgodTMyKTB4MDE8PCgzMi0xKSk7CisJZm9yKGkgPSAwOyBpIDwgd0xlbmd0aC8yOyBpKyspCisJeworCQl0d3JlZy5zdHJ1Yy5kYXRhID0gKChkYXRhMldyaXRlJm1hc2spICE9IDApID8gMSA6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDEpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAxOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSk6IChtYXNrPj4xKTsKKworCQlpZihpID09IDIpCisJCXsKKwkJCS8vIENvbW1lbnRlZCBvdXQgYnkgSmFja2llLCAyMDA0LjA4LjI2LiA8UkpfTk9URT4gV2UgbXVzdCBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyBmb3Igd2UgY2Fubm90IHB1bGwgZG93biBWQ09QRE4gZHVyaW5nIFJGIFNlcmFpbCBSZWFkLgorCQkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNFbmFibGUsIDB4ZSk7ICAgICAvLyB0dXJuIG9mZiBkYXRhIGVuYWJsZQorCQkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNTZWxlY3QsIDB4ZSk7CisKKwkJCXR3cmVnLnN0cnVjLnJlYWRfd3JpdGU9MTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQkJdHdyZWcuc3RydWMuY2xrID0gMDsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQkJYnJlYWs7CisJCX0KKwkJdHdyZWcuc3RydWMuZGF0YSA9ICgoZGF0YTJXcml0ZSZtYXNrKSAhPSAwKSA/IDE6IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgxKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKSA6IChtYXNrPj4xKTsKKwl9CisKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLmRhdGEgPSAwOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCW1hc2sgPSAobG93MmhpZ2gpID8gMHgwMSA6ICgodTMyKTB4MDEgPDwgKDEyLTEpKTsKKworCS8vCisJLy8gMDYxMDE2LCBieSByY25qa286CisJLy8gV2UgbXVzdCBzZXQgZGF0YSBwaW4gdG8gSFcgY29udHJvbGVkLCBvdGhlcndpc2UgUkYgY2FuJ3QgZHJpdmVyIGl0IGFuZAorCS8vIHZhbHVlIFJGIHJlZ2lzdGVyIHdvbid0IGJlIGFibGUgdG8gcmVhZCBiYWNrIHByb3Blcmx5LgorCS8vCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsICggKChvdmFsMnwweDBFKSAmICh+MHgwMSkpKSApOworCisJZm9yKGkgPSAwOyBpIDwgckxlbmd0aDsgaSsrKQorCXsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMSk7CisJCXR3cmVnLnN0cnVjLmNsayA9IDE7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXRtcCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNJbnB1dCk7CisJCXRkYXRhLmxvbmdEYXRhID0gdG1wOworCQkqZGF0YTJSZWFkIHw9IHRkYXRhLnN0cnVjLmNsayA/IG1hc2sgOiAwOworCisJCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCXR3cmVnLnN0cnVjLmRhdGEgPSAwOworCXR3cmVnLnN0cnVjLnJlYWRfd3JpdGUgPSAxOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNFbmFibGUsIG92YWwyfDB4OCk7ICAgLy8gU2V0IFRvIE91dHB1dCBFbmFibGUKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgb3ZhbDIpOyAgIC8vIFNldCBUbyBPdXRwdXQgRW5hYmxlLCA8UkpfTk9URT4gV2UgY2Fubm90IGVuYWJsZSBCSVQzIGhlcmUsIG90aGVyd2lzZSwgd2Ugd2lsbCBmYWlsZWQgdG8gc3dpdGNoIGNoYW5uZWwuIDIwMDUuMDQuMTIuCisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNFbmFibGUsIDB4MWJmZik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIG92YWwzKTsgICAvLyBTZXQgVG8gU1cgU3dpdGNoCisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNTZWxlY3QsIDB4MDQ4OCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4M2EwKTsKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUocEFkYXB0ZXIsIFJGUGluc091dHB1dCwgMHgwNDgwKTsKK30KKworCit1MzIKK1JGX1JlYWRSZWcoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJb2Zmc2V0CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIJCQlkYXRhMldyaXRlOworCXU4CQkJd2xlbjsKKwl1OAkJCXJsZW47CisJdTgJCQlsb3cyaGlnaDsKKwl1MzIJCQlkYXRhUmVhZDsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGQ0hJUElEX1JUTDgyMjU6CisJY2FzZSBSRl9aRUJSQTI6CisJY2FzZSBSRl9aRUJSQTQ6CisJCXN3aXRjaChwcml2LT5SZWdUaHJlZVdpcmVNb2RlKQorCQl7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCQkJY2FzZSBIV19USFJFRV9XSVJFX1BJOiAvLyBGb3IgODdTICBQYXJhbGxlbCBJbnRlcmZhY2UuCisJCQl7CisJCQkJZGF0YTJXcml0ZSA9ICgodTMyKShvZmZzZXQmMHgwZikpOworCQkJCXdsZW49MTY7CisJCQkJSHdIU1NJVGhyZWVXaXJlKAorCQkJCQlkZXYsCisJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCXdsZW4sCQkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMCwgCQkJCQkvLyBiU0kKKwkJCQkJMCk7IAkJCQkJLy8gYldyaXRlCisJCQkJZGF0YVJlYWQ9IGRhdGEyV3JpdGU7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBIV19USFJFRV9XSVJFX1NJOiAvLyBGb3IgODdTIFNlcmlhbCBJbnRlcmZhY2UuCisJCQl7CisJCQkJZGF0YTJXcml0ZSA9ICgodTMyKShvZmZzZXQmMHgwZikpIDsKKwkJCQl3bGVuPTE2OworCQkJCUh3SFNTSVRocmVlV2lyZSgKKwkJCQkJZGV2LAorCQkJCQkodTgqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQl3bGVuLAkJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCTEsIAkJCQkJLy8gYlNJCisJCQkJCTAJCQkJCS8vIGJXcml0ZQorCQkJCQkpOworCQkJCWRhdGFSZWFkPSBkYXRhMldyaXRlOworCQkJfQorCQkJYnJlYWs7CisKKyNlbmRpZgorCQkJLy8gUGVyZm9ybSBTVyAzLXdpcmUgcHJvZ3JhbW1pbmcgYnkgZHJpdmVyLgorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlkYXRhMldyaXRlID0gKCh1MzIpKG9mZnNldCYweDFmKSkgPDwgMjc7IC8vIEZvciBaZWJyYSBFLWN1dC4gMjAwNS4wNC4xMSwgYnkgcmNuamtvLgorCQkJCXdsZW4gPSA2OworCQkJCXJsZW4gPSAxMjsKKwkJCQlsb3cyaGlnaCA9IDA7CisJCQkJWkVCUkFfUkZTZXJpYWxSZWFkKGRldiwgZGF0YTJXcml0ZSwgd2xlbiwmZGF0YVJlYWQscmxlbiwgbG93MmhpZ2gpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YVJlYWQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZGF0YVJlYWQ7Cit9CisKKworLy8gYnkgT3dlbiBvbiAwNC8wNy8xNCBmb3Igd3JpdGluZyBCQiByZWdpc3RlciBzdWNjZXNzZnVsbHkKK3ZvaWQKK1dyaXRlQkJQb3J0VWNoYXIoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCURhdGEKKwkpCit7CisJLy91OAlUaW1lb3V0Q291bnRlcjsKKwl1OAlSZWdpc3RlckNvbnRlbnQ7CisJdTgJVUNoYXJEYXRhOworCisJVUNoYXJEYXRhID0gKHU4KSgoRGF0YSAmIDB4MDAwMGZmMDApID4+IDgpOworCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgUGh5QWRkciwgRGF0YSk7CisJLy9mb3IoVGltZW91dENvdW50ZXIgPSAxMDsgVGltZW91dENvdW50ZXIgPiAwOyBUaW1lb3V0Q291bnRlci0tKQorCXsKKwkJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCBQaHlBZGRyLCBEYXRhICYgMHhmZmZmZmY3Zik7CisJCVJlZ2lzdGVyQ29udGVudCA9IFBsYXRmb3JtSU9SZWFkMUJ5dGUoZGV2LCBQaHlEYXRhUik7CisJCS8vaWYoVUNoYXJEYXRhID09IFJlZ2lzdGVyQ29udGVudCkKKwkJLy8JYnJlYWs7CisJfQorfQorCit1OAorUmVhZEJCUG9ydFVjaGFyKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlhZGRyCisJKQoreworCS8vdTgJVGltZW91dENvdW50ZXI7CisJdTgJUmVnaXN0ZXJDb250ZW50OworCisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCBQaHlBZGRyLCBhZGRyICYgMHhmZmZmZmY3Zik7CisJUmVnaXN0ZXJDb250ZW50ID0gUGxhdGZvcm1JT1JlYWQxQnl0ZShkZXYsIFBoeURhdGFSKTsKKworCXJldHVybiBSZWdpc3RlckNvbnRlbnQ7Cit9CisvL3tieSBhbXkgMDgwMzEyCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVBlcmZvcm0gQW50ZW5uYSBzZXR0aW5ncyB3aXRoIGFudGVubmEgZGl2ZXJzaXR5IG9uIDg3U0UuCisvLyAgICBDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA4LjAxLjI1LgorLy8KK2Jvb2wKK1NldEFudGVubmFDb25maWc4N1NFKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQlEZWZhdWx0QW50LAkJLy8gMDogTWFpbiwgMTogQXV4LgorCWJvb2wJCWJBbnREaXZlcnNpdHkgCS8vIDE6RW5hYmxlLCAwOiBEaXNhYmxlLgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sICAgYkFudGVubmFTd2l0Y2hlZCA9IHRydWU7CisKKwkvL3ByaW50aygiU2V0QW50ZW5uYUNvbmZpZzg3U0UoKTogRGVmYXVsdEFudCglZCksIGJBbnREaXZlcnNpdHkoJWQpXG4iLCBEZWZhdWx0QW50LCBiQW50RGl2ZXJzaXR5KTsKKworCS8vIFRocmVzaG9sZCBmb3IgYW50ZW5uYSBkaXZlcnNpdHkuCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisKKwlpZiggYkFudERpdmVyc2l0eSApICAvLyAgRW5hYmxlIEFudGVubmEgRGl2ZXJzaXR5LgorCXsKKwkJaWYoIERlZmF1bHRBbnQgPT0gMSApICAvLyBhdXggYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gUmVnMTEgOiBiYgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4YzcpOyAvLyBSZWcwMSA6IGM3CisKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MEQsIDB4NTQpOyAgIC8vIFJlZzBkIDogNTQKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhiMik7ICAvLyBSZWcxOCA6IGIyCisJCX0KKwkJZWxzZSAvLyAgdXNlIG1haW4gYW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCQkJLy9iYXNlIGJhbmQKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgLy8gUmVnMTEgOiA5YgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4YzcpOyAvLyBSZWcwMSA6IGM3CisKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAgIC8vIFJlZzBkIDogNWMKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhiMik7ICAvLyBSZWcxOCA6IGIyCisJCX0KKwl9CisJZWxzZSAgIC8vIERpc2FibGUgQW50ZW5uYSBEaXZlcnNpdHkuCisJeworCQlpZiggRGVmYXVsdEFudCA9PSAxICkgLy8gYXV4IEFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweDQ3KTsgLy8gUmVnMDEgOiA0NworCisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBELCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJCWVsc2UgLy8gbWFpbiBBbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgLy8gUmVnMTEgOiA5YgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4NDcpOyAvLyBSZWcwMSA6IDQ3CisKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MEQsIDB4NWMpOyAgIC8vIFJlZzBkIDogNWMKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHgzMik7ICAvLyBSZWcxOCA6IDMyCisJCX0KKwl9CisJcHJpdi0+Q3VyckFudGVubmFJbmRleCA9IERlZmF1bHRBbnQ7IC8vIFVwZGF0ZSBkZWZhdWx0IHNldHRpbmdzLgorCXJldHVybgliQW50ZW5uYVN3aXRjaGVkOworfQorI2VuZGlmCisvL2J5IGFteSAwODAzMTIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24uCisgICogdGhlIGNvZGUgaXMgcG9ydGVkIGZyb20gV2luZG93cyBzb3VyY2UgY29kZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZAorWkVCUkFfQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIJCQlpOworCXUzMglhZGRyLGRhdGE7CisJdTMyCXU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUsIHU0YlJGMjMsIHU0YlJGMjQ7CisgICAgICAgdTgJCQl1MWIyNEU7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gODdTX1BDSUUgOjogUkFESU9DRkcuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKwkvLyBQYWdlMSA6IHJlZzE2LXJlZzMwCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxM2YpOwkJCW1kZWxheSgxKTsgLy8gc3dpdGNoIHRvIHBhZ2UxCisJdTRiUkYyMz0gUkZfUmVhZFJlZyhkZXYsIDB4MDgpOwkJCW1kZWxheSgxKTsKKwl1NGJSRjI0PSBSRl9SZWFkUmVnKGRldiwgMHgwOSk7CQkJbWRlbGF5KDEpOworCisJaWYgKHU0YlJGMjM9PTB4ODE4ICYmIHU0YlJGMjQ9PTB4NzBDICYmIHByaXYtPmNhcmRfODE4NSA9PSBWRVJTSU9OXzgxODdTX0MpCisJCXByaXYtPmNhcmRfODE4NSA9IFZFUlNJT05fODE4N1NfRDsKKworCS8vIFBhZ2UwIDogcmVnMC1yZWcxNQorCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDAzZik7CQkJbWRlbGF5KDEpOy8vMQorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDlmKTsgICAgICAJbWRlbGF5KDEpOy8vIDEKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgMHgwNmUwKTsJCQltZGVsYXkoMSk7CisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwMDRjKTsJCQltZGVsYXkoMSk7Ly8yCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwNGQpOwkJCW1kZWxheSgxKTsvLyAyCisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwMDAwKTsJCQltZGVsYXkoMSk7Ly8zCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDA3ZjEpOwkJCW1kZWxheSgxKTsvLyAzCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDk3NSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwYzcyKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDBhZTYpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDBjYSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwOCwgMHgwZTFjKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA5LCAweDAyZjApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGEsIDB4MDlkMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYiwgMHgwMWJhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA2NDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDhkZik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwMDIwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAweDA5OTApOwkJCW1kZWxheSgxKTsKKworCisJLy8gUGFnZTEgOiByZWcxNi1yZWczMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTNmKTsJCQltZGVsYXkoMSk7CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDgwNik7CQkJbWRlbGF5KDEpOworCisJaWYocHJpdi0+Y2FyZF84MTg1IDwgVkVSU0lPTl84MTg3U19DKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzZjcpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1YWIpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwYzEpOwkJCW1kZWxheSgxKTsKKwl9CisJZWxzZQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDAzYTcpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1OWIpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwODEpOwkJCW1kZWxheSgxKTsKKwl9CisKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMUEwKTsJCQltZGVsYXkoMSk7CisvLyBEb24ndCB3cml0ZSBSRjIzL1JGMjQgdG8gbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiA4N1MgQyBjdXQgYW5kIEQgY3V0LiBhc2tlZCBieSBTRDMgc3RldmVubC4KKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwOCwgMHgwNTk3KTsJCQltZGVsYXkoMSk7CisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDksIDB4MDUwYSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwMDAxKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBiLCAweDA0MTgpOwkJCW1kZWxheSgxKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSBWRVJTSU9OXzgxODdTX0QpCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MGZiZSk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDAwOCk7CQkJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDgwNyk7CQkJbWRlbGF5KDEpOyAvLyBSWCBMTyBidWZmZXIKKwl9CisJZWxzZQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDBmYmUpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwMDgpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDA4MDYpOwkJCW1kZWxheSgxKTsgLy8gUlggTE8gYnVmZmVyCisJfQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAweDBhY2MpOwkJCW1kZWxheSgxKTsKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxN2YpOwkJCW1kZWxheSgxKTsvLzYKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDFkNyk7CQkJbWRlbGF5KDEpOy8vIDYKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwZTAwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDBlNTApOwkJCW1kZWxheSgxKTsKKwlmb3IoaT0wO2k8PTM2O2krKykKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgaSk7ICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbaV0pOyBtZGVsYXkoMSk7CisJCS8vRGJnUHJpbnQoIlJGIC0gMHgleCA9IDB4JXgiLCBpLCBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW2ldKTsKKwl9CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDIwMyk7CQkJbWRlbGF5KDEpOyAJLy8vIDIwMywgMzQzCisJLy9SRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDMwMCk7CQkJbWRlbGF5KDEpOwkvLyA0MDAKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDIwMCk7CQkJbWRlbGF5KDEpOwkvLyA0MDAKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTM3KTsJCQltZGVsYXkoMSk7CS8vIHN3aXRjaCB0byByZWcxNi1yZWczMCwgYW5kIEhTU0kgZGlzYWJsZSAxMzcKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwOWJlKTsJCQltZGVsYXkoMSk7CS8vIDcKKwkvL1JGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwN2JlKTsJCQltZGVsYXkoMSk7CisJLy9tZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDAwOCk7CQkJbWRlbGF5KDEpOwkvLyBaNCBzeW50aGVzaXplciBsb29wIGZpbHRlciBzZXR0aW5nLCAzOTIKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDAzNyk7CQkJbWRlbGF5KDEpOwkvLyBzd2l0Y2ggdG8gcmVnMC1yZWcxNSwgYW5kIEhTU0kgZGlzYWJsZQorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwMTYwKTsJCQltZGVsYXkoMSk7IAkvLyBDQkMgb24sIFR4IFJ4IGRpc2FibGUsIEhpZ2ggZ2FpbgorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMDgwKTsJCQltZGVsYXkoMSk7CS8vIFo0IHNldHRlZCBjaGFubmVsIDEKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDg4RCk7CQkJbWRlbGF5KDEpOwkvLyBMQyBjYWxpYnJhdGlvbgorCW1kZWxheSgyMDApOyAJLy8gRGVheSAyMDAgbXMuIC8vMHhmZAorCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDEzNyk7CQkJbWRlbGF5KDEpOwkvLyBzd2l0Y2ggdG8gcmVnMTYtcmVnMzAgMTM3LCBhbmQgSFNTSSBkaXNhYmxlIDEzNworCW1kZWxheSgxMCk7IAkvLyBEZWF5IDEwIG1zLiAvLzB4ZmQKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMDAwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAxODApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDIyMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwM0UwKTsJCQltZGVsYXkoMSk7CisKKwkvLyBEQUMgY2FsaWJyYXRpb24gb2ZmIDIwMDcwNzAyCisJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwYzEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGEsIDB4MDAwMSk7CQkJbWRlbGF5KDEpOworLy97YnkgYW15IDA4MDMxMgorCS8vIEZvciBjcnlzdGFsIGNhbGlicmF0aW9uLCBhZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKwlpZiggcHJpdi0+Ylh0YWxDYWxpYnJhdGlvbiApIC8vIHJlZyAzMC4KKwl7IC8vIGVuYWJsZSBjcnlzdGFsIGNhbGlicmF0aW9uLgorCQkvLyBSRiBSZWdbMzBdLCAoMSlYaW46WzEyOjldLCBYb3V0Ols4OjVdLCAgYWRkcls0OjBdLgorCQkvLyAoMilQQSBQd3IgZGVsYXkgdGltZXJbMTU6MTRdLCBkZWZhdWx0OiAyLjR1cywgc2V0IEJJVDE1PTAKKwkJLy8gKDMpUkYgc2lnbmFsIG9uL29mZiB3aGVuIGNhbGlicmF0aW9uWzEzXSwgZGVmYXVsdDogb24sIHNldCBCSVQxMz0wLgorCQkvLyBTbyB3ZSBzaG91bGQgbWludXMgNCBCSVRzIG9mZnNldC4KKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAocHJpdi0+WHRhbENhbF9YaW48PDUpfChwcml2LT5YdGFsQ2FsX1hvdXQ8PDEpfEJJVDExfEJJVDkpOwkJCW1kZWxheSgxKTsKKwkJcHJpbnRrKCJaRUJSQV9Db25maWdfODVCQVNJQ19IYXJkQ29kZSgpOiAoJTAyeClcbiIsCisJCQkJKHByaXYtPlh0YWxDYWxfWGluPDw1KSB8IChwcml2LT5YdGFsQ2FsX1hvdXQ8PDEpIHwgQklUMTF8IEJJVDkpOworCX0KKwllbHNlCisJeyAvLyB1c2luZyBkZWZhdWx0IHZhbHVlLiBYaW49NiwgWG91dD02LgorCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MGFjYyk7CQkJbWRlbGF5KDEpOworCX0KKy8vYnkgYW15IDA4MDMxMgorLy8JUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAweDBhY2MpOwkJCW1kZWxheSgxKTsgIC8vLWJ5IGFteSAwODAzMTIKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMGJmKTsJCQltZGVsYXkoMSk7IC8vIHN3aXRjaCB0byByZWcwLXJlZzE1LCBhbmQgSFNTSSBlbmFibGUKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDlmKTsJCQltZGVsYXkoMSk7IC8vIFJ4IEJCIHN0YXJ0IGNhbGlicmF0aW9uLCAwMGMvLy1lZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDhkZik7CQkJbWRlbGF5KDEpOyAvLyBSeCBCQiBzdGFydCBjYWxpYnJhdGlvbiwgMDBjLy8rZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDAwNGQpOwkJCW1kZWxheSgxKTsgLy8gdGVtcGVyYXR1cmUgbWV0ZXIgb2ZmCisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDA5NzUpOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZQorCW1kZWxheSgxMCk7CS8vIERlYXkgMTAgbXMuIC8vMHhmZQorCW1kZWxheSgxMCk7CS8vIERlYXkgMTAgbXMuIC8vMHhmZQorCW1kZWxheSgxMCk7CS8vIERlYXkgMTAgbXMuIC8vMHhmZQorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTk3KTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwOWYpOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCisjaWYgMC8vLWVkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTk3KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1YWIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDA5Rik7CQkJbWRlbGF5KDEpOworI2VuZGlmCisJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCAweDAwMDApOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwMDAwKTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKwkvL3Bvd2VyIHNhdmUgcGFyYW1ldGVycy4KKwl1MWIyNEUgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOworCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWIyNEUgJiAofihCSVQ1fEJJVDYpKSkpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENDS0NPTkYuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoJW1BPV0VSIFNBVkVdIFBvd2VyIFNhdmluZyBQYXJhbWV0ZXJzIGJ5IGpvbmcuIDIwMDctMTEtMjcKKwkgICAJQ0NLIHJlZzB4MDBbN109MSdiMSA6cG93ZXIgc2F2aW5nIGZvciBUWCAoZGVmYXVsdCkKKwkJQ0NLIHJlZzB4MDBbNl09MSdiMTogcG93ZXIgc2F2aW5nIGZvciBSWCAoZGVmYXVsdCkKKwkJQ0NLIHJlZzB4MDZbNF09MSdiMTogdHVybiBvZmYgY2hhbm5lbCBlc3RpbWF0aW9uIHJlbGF0ZWQgY2lyY3VpdHMgaWYgbm90IGRvaW5nIGNoYW5uZWwgZXN0aW1hdGlvbi4KKwkJQ0NLIHJlZzB4MDZbM109MSdiMTogdHVybiBvZmYgdW51c2VkIGNpcmN1aXRzIGJlZm9yZSBjY2EgPSAxCisJCUNDSyByZWcweDA2WzJdPTEnYjE6IHR1cm4gb2ZmIGNjaydzIGNpcmN1aXQgaWYgbWFjcnN0ID0wCisJKi8KKyNpZiAwCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwYzg4MCk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwMWM4Nik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwNzg5MCk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwZDBhZSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwMDZhZik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHgwMTAwNDY4MSk7CisjZW5kaWYKKwl3cml0ZV9waHlfY2NrKGRldiwweDAwLDB4YzgpOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MDYsMHgxYyk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgxMCwweDc4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDJlLDB4ZDApOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MmYsMHgwNik7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgwMSwweDQ2KTsKKworCS8vIHBvd2VyIGNvbnRyb2wKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgMHgxMCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCAweDFCKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisjZWxzZQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBSQURJT0NGRy5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDBiNyk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgMHgwZWUwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDA0NGQpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDQ0MSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwOGMzKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDBjNzIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBlNik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwODJhKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA4LCAweDAwM2YpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDksIDB4MDMzNSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYSwgMHgwOWQ0KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBiLCAweDA3YmIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MDg1MCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwY2RmKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDAwMmIpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGYsIDB4MDExNCk7CQkJbWRlbGF5KDEpOworCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxYjcpOwkJCW1kZWxheSgxKTsKKworCisJZm9yKGk9MTtpPD05NTtpKyspCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIGkpOwltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7IG1kZWxheSgxKTsKKwkJLy9EYmdQcmludCgiUkYgLSAweCV4ID0gMHgleCIsIGksIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbaV0pOworCX0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwMDgwKTsJCQltZGVsYXkoMSk7IAkvLyB3cml0ZSByZWcgMTgKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDAwNCk7CQkJbWRlbGF5KDEpOwkvLyB3cml0ZSByZWcgMjAKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDBiNyk7CQkJbWRlbGF5KDEpOwkvLyBzd2l0Y2ggdG8gcmVnMC1yZWcxNQorCS8vMHhmZAorCS8vMHhmZAorCS8vMHhmZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwYzRkKTsJCQltZGVsYXkoMSk7CisJbWRlbGF5KDEwMCk7CS8vIERlYXkgMTAwIG1zLiAvLzB4ZmUKKwltZGVsYXkoMTAwKTsJLy8gRGVheSAxMDAgbXMuIC8vMHhmZQorCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwNDRkKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAyYmYpOwkJCW1kZWxheSgxKTsJLy8weDAwMmYgZGlzYWJsZSA2dXMgY29ybmVyIGNoYW5nZSwgIDA2Zi0tPiBlbmFibGUKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDQ0tDT05GLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBGb2xsb3cgV01BQyBSVEw4MjI1X0NvbmZpZygpCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gcG93ZXIgY29udHJvbAorCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAweDAzKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIDB4MDcpOworCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIE9GRE0gQkJQIHNldHVwCisvLwlTZXRPdXRwdXRFbmFibGVPZlJmUGlucyhkZXYpOy8vYnkgYW15CisjZW5kaWYKKworCisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQUdDLnR4dAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8JUGxhdGZvcm1JT1dyaXRlNEJ5dGUoIGRldiwgUGh5QWRkciwgMHgwMDAwMTI4MCk7CS8vIEFubmllLCAyMDA2LTA1LTA1CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAwLCAweDEyKTsKKwkvL1dyaXRlQkJQb3J0VWNoYXIoZGV2LCAweDAwMDAxMjgwKTsKKworCWZvciAoaT0wOyBpPDEyODsgaSsrKQorCXsKKwkJLy9EYmdQcmludCgiQUdDIC0gWyV4KzFdID0gMHgleFxuIiwgaSwgWkVCUkFfQUdDW2krMV0pOworCisJCWRhdGEgPSBaRUJSQV9BR0NbaSsxXTsKKwkJZGF0YSA9IGRhdGEgPDwgODsKKwkJZGF0YSA9IGRhdGEgfCAweDAwMDAwMDhGOworCisJCWFkZHIgPSBpICsgMHg4MDsgLy9lbmFibGUgd3JpdGluZyBBR0MgdGFibGUKKwkJYWRkciA9IGFkZHIgPDwgODsKKwkJYWRkciA9IGFkZHIgfCAweDAwMDAwMDhFOworCisJCVdyaXRlQkJQb3J0VWNoYXIoZGV2LCBkYXRhKTsKKwkJV3JpdGVCQlBvcnRVY2hhcihkZXYsIGFkZHIpOworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwgMHgwMDAwMDA4RSk7CisJfQorCisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoIGRldiwgUGh5QWRkciwgMHgwMDAwMTA4MCk7CS8vIEFubmllLCAyMDA2LTA1LTA1CisJLy9Xcml0ZUJCUG9ydFVjaGFyKGRldiwgMHgwMDAwMTA4MCk7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gT0ZETUNPTkYuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJZm9yKGk9MDsgaTw2MDsgaSsrKQorCXsKKwkJdTRiUmVnT2Zmc2V0PWk7CisJCXU0YlJlZ1ZhbHVlPU9GRE1fQ09ORklHW2ldOworCisJCS8vRGJnUHJpbnQoIk9GRE0gLSAweCV4ID0gMHgleFxuIiwgdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSk7CisKKwkJV3JpdGVCQlBvcnRVY2hhcihkZXYsCisJCQkJCQkoMHgwMDAwMDA4MCB8CisJCQkJCQkodTRiUmVnT2Zmc2V0ICYgMHg3ZikgfAorCQkJCQkJKCh1NGJSZWdWYWx1ZSAmIDB4ZmYpIDw8IDgpKSk7CisJfQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy9ieSBhbXkgZm9yIGFudGVubmEKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL3tieSBhbXkgMDgwMzEyCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIENvbmZpZyBTdy9IdyAgQ29tYmluYXRpb25hbCBBbnRlbm5hIERpdmVyc2l0eS4gQWRkZWQgYnkgUm9nZXIsIDIwMDguMDIuMjYuCisJU2V0QW50ZW5uYUNvbmZpZzg3U0UoZGV2LCBwcml2LT5iRGVmYXVsdEFudGVubmExLCBwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpOworI2VuZGlmCisvL2J5IGFteSAwODAzMTJ9CisjaWYgMAorCS8vIENvbmZpZyBTdy9IdyAgQW50ZW5uYSBEaXZlcnNpdHkKKwlpZiggcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ICkgIC8vICBVc2UgU1crSHcgQW50ZW5uYSBEaXZlcnNpdHkKKwl7CisJCWlmKCBwcml2LT5iRGVmYXVsdEFudGVubmExID09IHRydWUgKSAgLy8gYXV4IGFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBSZWcxMSA6IGJiCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweGM3KTsgLy8gUmVnMDEgOiBjNworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1NCk7ICAgLy8gUmVnMGQgOiA1NAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCQllbHNlIC8vICBtYWluIGFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKwkJCS8vYmFzZSBiYW5kCisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IC8vIFJlZzExIDogOWIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MDEsIDB4YzcpOyAvLyBSZWcwMSA6IGM3CisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgICAvLyBSZWcwZCA6IDVjCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4YjIpOyAgLy8gUmVnMTggOiBiMgorCQl9CisJfQorCWVsc2UgICAvLyBEaXNhYmxlIEFudGVubmEgRGl2ZXJzaXR5CisJeworCQlpZiggcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSA9PSB0cnVlICkgLy8gYXV4IEFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBSZWcxMSA6IGJiCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweDQ3KTsgLy8gUmVnMDEgOiA0NworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1NCk7ICAgLy8gUmVnMGQgOiA1NAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDMyKTsgIC8vIFJlZzE4IDogMzIKKwkJfQorCQllbHNlIC8vIG1haW4gQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweDQ3KTsgLy8gUmVnMDEgOiA0NworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDMyKTsgIC8vIFJlZzE4IDogMzIKKwkJfQorCX0KKyNlbmRpZgorLy9ieSBhbXkgZm9yIGFudGVubmEKK30KKworCit2b2lkCitVcGRhdGVJbml0aWFsR2FpbigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3Vuc2lnbmVkIGNoYXIqIElHVGFibGU7CisJLy91OAkJCURJR19DdXJyZW50SW5pdGlhbEdhaW4gPSA0OworCS8vdW5zaWduZWQgY2hhciB1MVRtcDsKKworCS8vbHptIGFkZCAwODA4MjYKKwlpZihwcml2LT5lUkZQb3dlclN0YXRlICE9IGVSZk9uKQorCXsKKwkJLy9Eb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgorCQkvL1JUX1RSQUNFKENPTVBfRElHLCBEQkdfTE9VRCwgKCJVcGRhdGVJbml0aWFsR2FpbiAtIHBIYWxEYXRhLT5lUkZQb3dlclN0YXRlIT1lUmZPblxuIikpOworCQkvLyBCYWNrIHRvIHRoZSBvcmlnaW5hbCBzdGF0ZQorCQlwcml2LT5Jbml0aWFsR2Fpbj0gcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisjaWYgMAorCWNhc2UgUkZfWkVCUkEyOgorCQkvLyBEeW5hbWljIHNldCBpbml0aWFsIGdhaW4sIGJ5IHNoaWVuIGNoYW5nLCAyMDA2LjA3LjE0CisJCXN3aXRjaChwcml2LT5Jbml0aWFsR2FpbikKKwkJeworCQkJY2FzZSAxOiAvL204NjFkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAxOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ODZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZhODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy9tODYyZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMjogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDg2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6IC8vbTg2M2RCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDM6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg5NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OiAvL204NjRkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA0OiAtNzggZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4YTZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNTogLy9tODJkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA1OiAtNzQgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgzNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4YTZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNjogLy9tNzhkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA2OiAtNzAgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg0Njk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4YTZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNzogLy9tNzRkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA3OiAtNjYgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg1Njk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4YTZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CS8vTVAKKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAxOiAtODIgZEJtIChkZWZhdWx0KVxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ODZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZhODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFJGX1pFQlJBNDoKKwkJLy8gRHluYW1pYyBzZXQgaW5pdGlhbCBnYWluLCBmb2xsb3cgODdCCisJCXN3aXRjaChwcml2LT5Jbml0aWFsR2FpbikKKwkJeworCQkJY2FzZSAxOiAvL204NjFkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMTogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHgyNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZhKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6IC8vbTg2MmRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAyOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDM2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmEpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy9tODYzZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDM6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MzYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYik7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA0OiAvL204NjRkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNDogLTc4IGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZiKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDU6IC8vbTgyZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDU6IC03NCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDk2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYik7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA2OiAvL203OGRCbQorCQkJCS8vRE1FU0cgKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNjogLTcwIGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg1Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4OTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZjKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDc6IC8vbTc0ZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDc6IC02NiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweGE2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYyk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA4OgorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA4OlxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDY2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHhiNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmMpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKworCQkJZGVmYXVsdDoJLy9NUAorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAxOiAtODIgZEJtIChkZWZhdWx0KVxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDI2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmEpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKworCWRlZmF1bHQ6CisJCURNRVNHKCJVcGRhdGVJbml0aWFsR2FpbigpOiB1bmtub3duIFJGQ2hpcElEOiAlI1hcbiIsIHByaXYtPnJmX2NoaXApOworCQlicmVhazsKKwl9Cit9CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVR4IFBvd2VyIHRyYWNraW5nIG1lY2hhbmlzbSByb3V0aW5lIG9uIDg3U0UuCisvLyAJQ3JlYXRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKy8vCit2b2lkCitJbml0VHhQd3JUcmFja2luZzg3U0UoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorKQoreworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMgl1NGJSZlJlZzsKKworCXU0YlJmUmVnID0gUkZfUmVhZFJlZyhkZXYsIDB4MDIpOworCisJLy8gRW5hYmxlIFRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbi4KKwkvL3ByaW50aygiSW5pdFR4UHdyVHJhY2tpbmc4N1NFKCk6IEVuYWJsZSB0aGVybWFsIG1ldGVyIGluZGljYXRpb24sIFdyaXRlIFJGWzB4MDJdID0gJSN4IiwgdTRiUmZSZWd8UFdSX01FVEVSX0VOKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIHU0YlJmUmVnfFBXUl9NRVRFUl9FTik7CQkJbWRlbGF5KDEpOworfQorCisjZW5kaWYKK3ZvaWQKK1BoeUNvbmZpZzgxODUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldiwgUkNSLCBwcml2LT5SZWNlaXZlQ29uZmlnKTsKKwkgICBwcml2LT5SRlByb2dUeXBlID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzQpICYgMHgwMzsKKyAgICAgCS8vIFJGIGNvbmZpZworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJWkVCUkFfQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoIGRldik7CisJCWJyZWFrOworCX0KKy8ve2J5IGFteSAwODAzMTIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gU2V0IGRlZmF1bHQgaW5pdGlhbCBnYWluIHN0YXRlIHRvIDQsIGFwcHJvdmVkIGJ5IFNEMyBEWiwgYnkgQnJ1Y2UsIDIwMDctMDYtMDYuCisJaWYocHJpdi0+YkRpZ01lY2hhbmlzbSkKKwl7CisJCWlmKHByaXYtPkluaXRpYWxHYWluID09IDApCisJCQlwcml2LT5Jbml0aWFsR2FpbiA9IDQ7CisJCS8vcHJpbnRrKCJQaHlDb25maWc4MTg1KCk6IERJRyBpcyBlbmFibGVkLCBzZXQgZGVmYXVsdCBpbml0aWFsIGdhaW4gaW5kZXggdG8gJWRcbiIsIHByaXYtPkluaXRpYWxHYWluKTsKKwl9CisKKwkvLworCS8vIEVuYWJsZSB0aGVybWFsIG1ldGVyIGluZGljYXRpb24gdG8gaW1wbGVtZW50IFR4UG93ZXIgdHJhY2tpbmcgb24gODdTRS4KKwkvLyBXZSBpbml0aWFsaXplIHRoZXJtYWwgbWV0ZXIgaGVyZSB0byBhdm9pZCB1bnN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbi4KKwkvLyBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKwkvLworCWlmKHByaXYtPmJUeFBvd2VyVHJhY2spCisJCUluaXRUeFB3clRyYWNraW5nODdTRShkZXYpOworCisjZW5kaWYKKy8vYnkgYW15IDA4MDMxMn0KKwlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47CisJVXBkYXRlSW5pdGlhbEdhaW4oZGV2KTsKKworCXJldHVybjsKK30KKworCisKKwordm9pZAorSHdDb25maWd1cmVSVEw4MTg1KAorCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJCSkKK3sKKwkvL1JUTDgxODVfVE9ETzogRGV0ZXJtaW5lIFJldHJ5bGltaXQsIFR4QUdDLCBBdXRvUmF0ZUZhbGxiYWNrIGNvbnRyb2wuCisvLwl1OAkJYlVOSVZFUlNBTF9DT05UUk9MX1JMID0gMTsKKyAgICAgICAgdTggICAgICAgICAgICAgIGJVTklWRVJTQUxfQ09OVFJPTF9STCA9IDA7CisKKwl1OAkJYlVOSVZFUlNBTF9DT05UUk9MX0FHQyA9IDE7CisJdTgJCWJVTklWRVJTQUxfQ09OVFJPTF9BTlQgPSAxOworCXU4CQliQVVUT19SQVRFX0ZBTExCQUNLX0NUTCA9IDE7CisJdTgJCXZhbDg7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKyAgICAgIAkvL2lmKElTX1dJUkVMRVNTX01PREVfQShkZXYpIHx8IElTX1dJUkVMRVNTX01PREVfRyhkZXYpKQorLy97YnkgYW15IDA4MDMxMglpZigoaWVlZS0+bW9kZSA9PSBJRUVFX0cpfHwoaWVlZS0+bW9kZSA9PSBJRUVFX0EpKQorLy8JeworLy8JCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHhmZmZmKTsKKy8vCX0KKy8vCWVsc2UKKy8vCXsKKy8vCQl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4MDAwZik7CisvLwl9CisvL2J5IGFteSAwODAzMTJ9CisgICAgICAgIHdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHgwZmZmKTsKKwkvLyBSZXRyeSBsaW1pdAorCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgQ1dfQ09ORik7CisKKwlpZihiVU5JVkVSU0FMX0NPTlRST0xfUkwpCisJCXZhbDggPSB2YWw4ICYgMHhmZDsKKwllbHNlCisJCXZhbDggPSB2YWw4IHwgMHgwMjsKKworCXdyaXRlX25pY19ieXRlKGRldiwgQ1dfQ09ORiwgdmFsOCk7CisKKwkvLyBUeCBBR0MKKwl2YWw4ID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYQUdDX0NUTCk7CisJaWYoYlVOSVZFUlNBTF9DT05UUk9MX0FHQykKKwl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCAxMjgpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIDEyOCk7CisJCXZhbDggPSB2YWw4ICYgMHhmZTsKKwl9CisJZWxzZQorCXsKKwkJdmFsOCA9IHZhbDggfCAweDAxIDsKKwl9CisKKworCXdyaXRlX25pY19ieXRlKGRldiwgVFhBR0NfQ1RMLCB2YWw4KTsKKworCS8vIFR4IEFudGVubmEgaW5jbHVkaW5nIEZlZWRiYWNrIGNvbnRyb2wKKwl2YWw4ID0gcmVhZF9uaWNfYnl0ZShkZXYsIFRYQUdDX0NUTCApOworCisJaWYoYlVOSVZFUlNBTF9DT05UUk9MX0FOVCkKKwl7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKwkJdmFsOCA9IHZhbDggJiAweGZkOworCX0KKwllbHNlCisJeworCQl2YWw4ID0gdmFsOCAmICh2YWw4fDB4MDIpOyAvL3hpb25nLTIwMDYtMTEtMTUKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYQUdDX0NUTCwgdmFsOCk7CisKKwkvLyBBdXRvIFJhdGUgZmFsbGJhY2sgY29udHJvbAorCXZhbDggPSByZWFkX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSyk7CisJdmFsOCAmPSAweDdjOworCWlmKCBiQVVUT19SQVRFX0ZBTExCQUNLX0NUTCApCisJeworCQl2YWw4IHw9IFJBVEVfRkFMTEJBQ0tfQ1RMX0VOQUJMRSB8IFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDE7CisKKwkJLy8gPFJKX1RPRE9fODE4NUI+IFdlIHNoYWxsIHNldCB1cCB0aGUgQVJGUiBhY2NvcmRpbmcgdG8gdXNlcidzIHNldHRpbmcuCisJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCBBUkZSLCAweDBmZmYpOyAvLyBzZXQgMU0gfiA1NE0KKy8vYnkgYW15CisjaWYgMAorCQlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIEFSRlIsIDB4MGZmZik7IAkvLyBzZXQgMU0gfiA1NE0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkgICAgICAgIC8vIEFhZGRlZCBieSBSb2dlciwgMjAwNy4xMS4xNS4KKwkgICAgICAgIFBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgQVJGUiwgMHgwZmZmKTsgLy9zZXQgMU0gfiA1NE1icHMuCisjZWxzZQorCQlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIEFSRlIsIDB4MGMwMCk7IC8vc2V0IDQ4TWJwcywgNTRNYnBzLgorICAgICAgICAgICAgICAgIC8vIEJ5IFNEMyBzenV5aSdzIHJlcXVlc3QuIGJ5IFJvZ2VyLCAyMDA3LjAzLjI2LgorI2VuZGlmCisvL2J5IGFteQorCX0KKwllbHNlCisJeworCX0KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIHZhbDgpOworfQorCisKKworc3RhdGljIHZvaWQKK01hY0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gTUFDUkVHLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCWludAkJCW5MaW5lc1JlYWQgPSAwOworCisJdTMyCXU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUsdTRiUGFnZUluZGV4ID0gMDsKKwlpbnQJaTsKKworCW5MaW5lc1JlYWQ9c2l6ZW9mKE1BQ19SRUdfVEFCTEUpLzI7CisKKwlmb3IoaSA9IDA7IGkgPCBuTGluZXNSZWFkOyBpKyspICAvL25MaW5lc1JlYWQ9MTAxCisJeworCQl1NGJSZWdPZmZzZXQ9TUFDX1JFR19UQUJMRVtpXVswXTsKKwkJdTRiUmVnVmFsdWU9TUFDX1JFR19UQUJMRVtpXVsxXTsKKworICAgICAgICAgICAgICAgIGlmKHU0YlJlZ09mZnNldCA9PSAweDVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTRiUGFnZUluZGV4ID0gdTRiUmVnVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHU0YlJlZ09mZnNldCB8PSAodTRiUGFnZUluZGV4IDw8IDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJNQUMgLSAweCV4ID0gMHgleFxuIiwgdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgdTRiUmVnT2Zmc2V0LCAodTgpdTRiUmVnVmFsdWUpOworCX0KKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK30KKworCisKK3N0YXRpYyB2b2lkCitNYWNDb25maWdfODVCQVNJQygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisgICAgICAgdTgJCQl1MURBOworCU1hY0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKGRldik7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIEZvbGxvdyBUSURfQUNfTUFQIG9mIFdNYWMuCisJd3JpdGVfbmljX3dvcmQoZGV2LCBUSURfQUNfTUFQLCAweGZhNTApOworCisJLy8gSW50ZXJydXB0IE1pZ3JhdGlvbiwgSm9uZyBzdWdnZXN0ZWQgd2UgdXNlIHNldCAweDAwMDAgZmlyc3QsIDIwMDUuMTIuMTQsIGJ5IHJjbmprby4KKwl3cml0ZV9uaWNfd29yZChkZXYsIEludE1pZywgMHgwMDAwKTsKKworCS8vIFByZXZlbnQgVFBDIHRvIGNhdXNlIENSQyBlcnJvci4gQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDYtMTAuCisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCAweDFGMCwgMHgwMDAwMDAwMCk7CisJUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCAweDFGNCwgMHgwMDAwMDAwMCk7CisJUGxhdGZvcm1JT1dyaXRlMUJ5dGUoZGV2LCAweDFGOCwgMHgwMCk7CisKKwkvLyBBc2tlZCBmb3IgYnkgU0QzIENNIExpbiwgMjAwNi4wNi4yNywgYnkgcmNuamtvLgorCS8vUGxhdGZvcm1JT1dyaXRlNEJ5dGUoZGV2LCBSRlRpbWluZywgMHgwMDAwNDAwMSk7CisvL2J5IGFteQorI2lmIDAKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRlRpbWluZywgMHgwMDAwNDAwMSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gcG93ZXIgc2F2ZSBwYXJhbWV0ZXIgYmFzZWQgb24gIjg3U0UgcG93ZXIgc2F2ZSBwYXJhbWV0ZXJzIDIwMDcxMTI3LmRvYyIsIGFzIGZvbGxvdy4KKworCS8vRW5hYmxlIERBMTAgVFggcG93ZXIgc2F2aW5nCisJdTFEQSA9IHJlYWRfbmljX2J5dGUoZGV2LCBQSFlQUik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQSFlQUiwgKHUxREEgfCBCSVQyKSApOworCisJLy9QT1dFUjoKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzYwLCAweDEwMDApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNjIsIDB4MTAwMCk7CisKKwkvLyBBRkUuCisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3MCwgMHgwNTYwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzcyLCAweDA1NjApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzQsIDB4MERBNCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3NiwgMHgwREE0KTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4Mzc4LCAweDA1NjApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0EsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMEVDKTsKKy8vCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0UsIDB4MDBGRSk7Ly8tZWR3YXJkCisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3RSwgMHgwMEVDKTsvLytlZHdhcmQKKyNlbHNlCisgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldiwgUkZUaW1pbmcsIDB4MDAwMDQwMDMpOworI2VuZGlmCisgICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwweDAxKTsKKy8vYnkgYW15CisKK30KKworCisKKwordTgKK0dldFN1cHBvcnRlZFdpcmVsZXNzTW9kZTgxODUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorKQoreworCXU4CQkJYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSAwOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGX1pFQlJBMjoKKwljYXNlIFJGX1pFQlJBNDoKKwkJYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSAoV0lSRUxFU1NfTU9ERV9CIHwgV0lSRUxFU1NfTU9ERV9HKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCWJyZWFrOworCX0KKworCXJldHVybiBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZTsKK30KKwordm9pZAorQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlXSVJFTEVTU19NT0RFCQkJV2lyZWxlc3NNb2RlLAorCVBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HCUNobmxBY2Nlc3NTZXR0aW5nCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlBQ19DT0RJTkcJZUFDSTsKKwlBQ19QQVJBTQlBY1BhcmFtOworCS8vUFNUQV9RT1MJcFN0YVFvcyA9IEFkYXB0ZXItPk1nbnRJbmZvLnBTdGFRb3M7CisJdTgJYkZvbGxvd0xlZ2FjeVNldHRpbmcgPSAwOworCXU4ICAgdTFiQUlGUzsKKworCS8vCisJLy8gPFJKX1RPRE9fODE4NUI+CisJLy8gVE9ETzogV2Ugc3RpbGwgZG9uJ3Qga25vdyBob3cgdG8gc2V0IHVwIHRoZXNlIHJlZ2lzdGVycywganVzdCBmb2xsb3cgV01BQyB0bworCS8vIHZlcmlmeSA4MTg1QiBGUEFHLgorCS8vCisJLy8gPFJKX1RPRE9fODE4NUI+CisJLy8gSm9uZyBzYWlkIENXbWluL0NXbWF4IHJlZ2lzdGVyIGFyZSBub3QgZnVuY3Rpb25hbCBpbiA4MTg1QiwKKwkvLyBzbyB3ZSBzaGFsbCBmaWxsIGNoYW5uZWwgYWNjZXNzIHJlYWx0ZWQgcmVnaXN0ZXIgaW50byBBQyBwYXJhbWV0ZXIgcmVnaXN0ZXJzLAorCS8vIGV2ZW4gaW4gblFCc3MuCisJLy8KKwlDaG5sQWNjZXNzU2V0dGluZy0+U0lGU19UaW1lciA9IDB4MjI7IC8vIFN1Z2dlc3RlZCBieSBKb25nLCAyMDA1LjEyLjA4LgorCUNobmxBY2Nlc3NTZXR0aW5nLT5ESUZTX1RpbWVyID0gMHgxQzsgLy8gMjAwNi4wNi4wMiwgYnkgcmNuamtvLgorCUNobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyID0gOTsgLy8gMjAwNi4wNi4wMiwgYnkgcmNuamtvLgorCUNobmxBY2Nlc3NTZXR0aW5nLT5FSUZTX1RpbWVyID0gMHg1QjsgLy8gU3VnZ2VzdGVkIGJ5IHdjY2h1LCBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFSUZTIHJlZ2lzdGVyLCAyMDA1LjEyLjA4LgorCUNobmxBY2Nlc3NTZXR0aW5nLT5DV21pbkluZGV4ID0gMzsgLy8gMjAwNi4wNi4wMiwgYnkgcmNuamtvLgorCUNobmxBY2Nlc3NTZXR0aW5nLT5DV21heEluZGV4ID0gNzsgLy8gMjAwNi4wNi4wMiwgYnkgcmNuamtvLgorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBTSUZTLCBDaG5sQWNjZXNzU2V0dGluZy0+U0lGU19UaW1lcik7CisJLy9BZGFwdGVyLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlciggQWRhcHRlciwgSFdfVkFSX1NMT1RfVElNRSwgJkNobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyICk7CS8vIFJld3JpdGVkIGZyb20gZGlyZWN0bHkgdXNlIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoKSwgYnkgQW5uaWUsIDIwMDYtMDMtMjkuCisJd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9ULCBDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lcik7CS8vIFJld3JpdGVkIGZyb20gZGlyZWN0bHkgdXNlIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoKSwgYnkgQW5uaWUsIDIwMDYtMDMtMjkuCisKKwl1MWJBSUZTID0gYVNpZnNUaW1lICsgKDIgKiBDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciApOworCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDX1ZPX1BBUkFNLCB1MWJBSUZTKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfVklfUEFSQU0sIHUxYkFJRlMpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ19CRV9QQVJBTSwgdTFiQUlGUyk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDX0JLX1BBUkFNLCB1MWJBSUZTKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgRUlGUywgQ2hubEFjY2Vzc1NldHRpbmctPkVJRlNfVGltZXIpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBBY2tUaW1lT3V0UmVnLCAweDVCKTsgLy8gPFJKX0VYUFJfUU9TPiBTdWdnZXN0ZWQgYnkgd2NjaHUsIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIEVJRlMgcmVnaXN0ZXIsIDIwMDUuMTIuMDguCisKKyNpZmRlZiBUT0RPCisJLy8gPFJKX1RPRE9fTk9XXzgxODVCPiBVcGRhdGUgRUNXbWluL0VDV21heCwgQUlGUywgVFhPUCBMaW1pdCBvZiBlYWNoIEFDIHRvIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IFNQRUMuCisJaWYoIHBTdGFRb3MtPkN1cnJlbnRRb3NNb2RlID4gUU9TX0RJU0FCTEUgKQorCXsgLy8gUW9TIG1vZGUuCisJCWlmKHBTdGFRb3MtPlFCc3NXaXJlbGVzc01vZGUgPT0gV2lyZWxlc3NNb2RlKQorCQl7CisJCQkvLyBGb2xsb3cgQUMgUGFyYW1ldGVycyBvZiB0aGUgUUJTUy4KKwkJCWZvcihlQUNJID0gMDsgZUFDSSA8IEFDX01BWDsgZUFDSSsrKQorCQkJeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKEFkYXB0ZXIsIEhXX1ZBUl9BQ19QQVJBTSwgKHB1MUJ5dGUpKCYocFN0YVFvcy0+V01NUGFyYW1FbGUuQWNQYXJhbVtlQUNJXSkpICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBGb2xsb3cgRGVmYXVsdCBXTU0gQUMgUGFyYW1ldGVycy4KKwkJCWJGb2xsb3dMZWdhY3lTZXR0aW5nID0gMTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYKKwl7IC8vIExlZ2FjeSA4MDIuMTEuCisJCWJGb2xsb3dMZWdhY3lTZXR0aW5nID0gMTsKKworCX0KKworCS8vIHRoaXMgc2V0dGluZyBpcyBjb3BpZWQgZnJvbSBydGw4MTg3Qi4gIHhpb25nLTIwMDYtMTEtMTMKKwlpZihiRm9sbG93TGVnYWN5U2V0dGluZykKKwl7CisKKworCQkvLworCQkvLyBGb2xsb3cgODAyLjExIHNlZXRpbmcgdG8gQUMgcGFyYW1ldGVyLCBhbGwgQUMgc2hhbGwgdXNlIHRoZSBzYW1lIHBhcmFtZXRlci4KKwkJLy8gMjAwNS4xMi4wMSwgYnkgcmNuamtvLgorCQkvLworCQlBY1BhcmFtLmxvbmdEYXRhID0gMDsKKwkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUlGU04gPSAyOyAvLyBGb2xsb3cgODAyLjExIERJRlMuCisJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFDTSA9IDA7CisJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtaW4gPSBDaG5sQWNjZXNzU2V0dGluZy0+Q1dtaW5JbmRleDsgLy8gRm9sbG93IDgwMi4xMSBDV21pbi4KKwkJQWNQYXJhbS5mLkVjdy5mLkVDV21heCA9IENobmxBY2Nlc3NTZXR0aW5nLT5DV21heEluZGV4OyAvLyBGb2xsb3cgODAyLjExIENXbWF4LgorCQlBY1BhcmFtLmYuVFhPUExpbWl0ID0gMDsKKworCQkvL2x6bSByZXNlcnZlZCAwODA4MjYKKyNpZiAxCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJCS8vIEZvciB0dXJibyBtb2RlIHNldHRpbmcuIHBvcnQgZnJvbSA4N0IgYnkgSXNhaWFoIDIwMDgtMDgtMDEKKwkJaWYoIGllZWUtPmN1cnJlbnRfbmV0d29yay5UdXJib19FbmFibGUgPT0gMSApCisJCQlBY1BhcmFtLmYuVFhPUExpbWl0ID0gMHgwMUZGOworI2VuZGlmCisJCS8vIEZvciA4N1NFIHdpdGggSW50ZWwgNDk2NSAgQWQtSG9jIG1vZGUgaGF2ZSBwb29yIHRocm91Z2hwdXQgKDE5TUIpCisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQlBY1BhcmFtLmYuVFhPUExpbWl0ID0gMHgwMDIwOworI2VuZGlmCisKKwkJZm9yKGVBQ0kgPSAwOyBlQUNJIDwgQUNfTUFYOyBlQUNJKyspCisJCXsKKwkJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFDSSA9ICh1OCllQUNJOworCQkJeworCQkJCVBBQ19QQVJBTQlwQWNQYXJhbSA9IChQQUNfUEFSQU0pKCZBY1BhcmFtKTsKKwkJCQlBQ19DT0RJTkcJZUFDSTsKKwkJCQl1OAkJdTFiQUlGUzsKKwkJCQl1MzIJCXU0YkFjUGFyYW07CisKKwkJCQkvLyBSZXRyaXZlIHBhcmFtdGVycyB0byB1ZHBhdGUuCisJCQkJZUFDSSA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUNJOworCQkJCXUxYkFJRlMgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFJRlNOICogQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgKyBhU2lmc1RpbWU7CisJCQkJdTRiQWNQYXJhbSA9ICgJKCgodTMyKShwQWNQYXJhbS0+Zi5UWE9QTGltaXQpKSA8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCkJfAorCQkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtYXgpKSA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCkJfAorCQkJCQkJKCgodTMyKShwQWNQYXJhbS0+Zi5FY3cuZi5FQ1dtaW4pKSA8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCkJfAorCQkJCQkJKCgodTMyKXUxYkFJRlMpIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisKKwkJCQlzd2l0Y2goZUFDSSkKKwkJCQl7CisJCQkJCWNhc2UgQUMxX0JLOgorCQkJCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMF9CRToKKwkJCQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQkVfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzJfVkk6CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJRE1FU0dXKCAiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLCBlQUNJKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIENlaGNrIEFDTSBiaXQuCisJCQkJLy8gSWYgaXQgaXMgc2V0LCBpbW1lZGlhdGVseSBzZXQgQUNNIGNvbnRyb2wgYml0IHRvIGRvd25ncmFkaW5nIEFDIGZvciBwYXNzaW5nIFdNTSB0ZXN0cGxhbi4gQW5uaWUsIDIwMDUtMTItMTMuCisJCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDTV9DT05UUk9MLCBwQWNQYXJhbS0+Zi5BY2lBaWZzbik7CisJCQkJeworCQkJCQlQQUNJX0FJRlNOCXBBY2lBaWZzbiA9IChQQUNJX0FJRlNOKSgmcEFjUGFyYW0tPmYuQWNpQWlmc24pOworCQkJCQlBQ19DT0RJTkcJZUFDSSA9IHBBY2lBaWZzbi0+Zi5BQ0k7CisKKwkJCQkJLy9tb2RpZmllZCBKb3NlcGgKKwkJCQkJLy9mb3IgODE4N0IgQXN5bklPUmVhZCBpc3N1ZQorI2lmZGVmIFRPRE8KKwkJCQkJdTgJQWNtQ3RybCA9IHBIYWxEYXRhLT5BY21Db250cm9sOworI2Vsc2UKKwkJCQkJdTgJQWNtQ3RybCA9IDA7CisjZW5kaWYKKwkJCQkJaWYoIHBBY2lBaWZzbi0+Zi5BQ00gKQorCQkJCQl7IC8vIEFDTSBiaXQgaXMgMS4KKwkJCQkJCXN3aXRjaChlQUNJKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQUMwX0JFOgorCQkJCQkJCQlBY21DdHJsIHw9IChCRVFfQUNNX0VOfEJFUV9BQ01fQ1RMfEFDTV9IV19FTik7CS8vIG9yIDB4MjEKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCQkJQWNtQ3RybCB8PSAoVklRX0FDTV9FTnxWSVFfQUNNX0NUTHxBQ01fSFdfRU4pOwkvLyBvciAweDQyCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBQzNfVk86CisJCQkJCQkJCUFjbUN0cmwgfD0gKFZPUV9BQ01fRU58Vk9RX0FDTV9DVEx8QUNNX0hXX0VOKTsJLy8gb3IgMHg4NAorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURNRVNHVygiU2V0SHdSZWc4MTg1KCk6IFtIV19WQVJfQUNNX0NUUkxdIEFDTSBzZXQgZmFpbGVkOiBlQUNJIGlzICVkXG4iLCBlQUNJICk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDAuCisJCQkJCQlzd2l0Y2goZUFDSSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIEFDMF9CRToKKwkJCQkJCQkJQWNtQ3RybCAmPSAoICh+QkVRX0FDTV9FTikgJiAofkJFUV9BQ01fQ1RMKSAmICh+QUNNX0hXX0VOKSApOwkvLyBhbmQgMHhERQorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQkJCQlBY21DdHJsICY9ICggKH5WSVFfQUNNX0VOKSAmICh+VklRX0FDTV9DVEwpICYgKH5BQ01fSFdfRU4pICk7CS8vIGFuZCAweEJECisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBQzNfVk86CisJCQkJCQkJCUFjbUN0cmwgJj0gKCAoflZPUV9BQ01fRU4pICYgKH5WT1FfQUNNX0NUTCkgJiAofkFDTV9IV19FTikgKTsJLy8gYW5kIDB4N0IKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiU2V0SHdSZWc4MTg1KCk6IFtIV19WQVJfQUNNX0NUUkxdIFdyaXRlIDB4JVhcbiIsIEFjbUN0cmwpOworCisjaWZkZWYgVE9fRE8KKwkJCQkJcEhhbERhdGEtPkFjbUNvbnRyb2wgPSBBY21DdHJsOworI2VuZGlmCisJCQkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ01fQ09OVFJPTCwgQWNtQ3RybCk7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgQUNNX0NPTlRST0wsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCisKKwl9Cit9CisKK3ZvaWQKK0FjdFNldFdpcmVsZXNzTW9kZTgxODUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCQlidFdpcmVsZXNzTW9kZQorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy9QTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmKEFkYXB0ZXItPk1nbnRJbmZvKTsKKwl1OAlidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSA9IEdldFN1cHBvcnRlZFdpcmVsZXNzTW9kZTgxODUoZGV2KTsKKworCWlmKCAoYnRXaXJlbGVzc01vZGUgJiBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSkgPT0gMCApCisJeyAvLyBEb24ndCBzd2l0Y2ggdG8gdW5zdXBwb3J0ZWQgd2lyZWxlc3MgbW9kZSwgMjAwNi4wMi4xNSwgYnkgcmNuamtvLgorCQlETUVTR1coIkFjdFNldFdpcmVsZXNzTW9kZTgxODUoKTogV2lyZWxlc3NNb2RlKCVkKSBpcyBub3Qgc3VwcG9ydGVkICglZCkhXG4iLAorCQkJYnRXaXJlbGVzc01vZGUsIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDEuIEFzc2lnbiB3aXJlbGVzcyBtb2RlIHRvIHN3dGljaCBpZiBuZWNlc3NhcnkuCisJaWYgKGJ0V2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQVVUTykKKwl7CisJCWlmKChidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfQSkpCisJCXsKKwkJCWJ0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9BOworCQl9CisJCWVsc2UgaWYoKGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9HKSkKKwkJeworCQkJYnRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisJCX0KKwkJZWxzZSBpZigoYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0IpKQorCQl7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURNRVNHVygiQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgpOiBObyB2YWxpZCB3aXJlbGVzcyBtb2RlIHN1cHBvcnRlZCwgYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUoJXgpISEhXG4iLAorCQkJCQkgYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUpOworCQkJYnRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwl9CisKKworCS8vIDIuIFN3dGljaCBiYW5kOiBSRiBvciBCQiBzcGVjaWZpYyBhY3Rpb25zLAorCS8vIGZvciBleGFtcGxlLCByZWZyZXNoIHRhYmxlcyBpbiBvbWM4MjU1LCBvciBjaGFuZ2UgaW5pdGlhbCBnYWluIGlmIG5lY2Vzc2FyeS4KKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRl9aRUJSQTI6CisJY2FzZSBSRl9aRUJSQTQ6CisJCXsKKwkJCS8vIE5vdGhpbmcgdG8gZG8gZm9yIFplYnJhIHRvIHN3aXRjaCBiYW5kLgorCQkJLy8gVXBkYXRlIGN1cnJlbnQgd2lyZWxlc3MgbW9kZSBpZiB3ZSBzd3RpY2ggdG8gc3BlY2lmaWVkIGJhbmQgc3VjY2Vzc2Z1bGx5LgorCQkJaWVlZS0+bW9kZSA9IChXSVJFTEVTU19NT0RFKWJ0V2lyZWxlc3NNb2RlOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRE1FU0dXKCJBY3RTZXRXaXJlbGVzc01vZGU4MTg1KCk6IHVuc3VwcG9ydGVkIFJGOiAweCVYICEhIVxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCWJyZWFrOworCX0KKworCS8vIDMuIENoYW5nZSByZWxhdGVkIHNldHRpbmcuCisJaWYoIGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9BICl7CisJCURNRVNHKCJXSVJFTEVTU19NT0RFX0FcbiIpOworCX0KKwllbHNlIGlmKCBpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfQiApeworCQlETUVTRygiV0lSRUxFU1NfTU9ERV9CXG4iKTsKKwl9CisJZWxzZSBpZiggaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0cgKXsKKwkJRE1FU0coIldJUkVMRVNTX01PREVfR1xuIik7CisJfQorCisJQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoIGRldiwgaWVlZS0+bW9kZSwgJnByaXYtPkNoYW5uZWxBY2Nlc3NTZXR0aW5nKTsKK30KKwordm9pZCBydGw4MTg1Yl9pcnFfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+aXJxX2VuYWJsZWQgPSAxOworCXdyaXRlX25pY19kd29yZChkZXYsIElNUiwgcHJpdi0+SW50ck1hc2spOworfQorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3ZvaWQKK0RydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUxNgkJCXJlYXNvbgorCSkKK3sKKwkvL3ByaW50aygiPT0+IERydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbigpXG4iKTsKKworCS8vIG5vdGhpbmcgaXMgbmVlZGVkIGFmdGVyIGRpc2Fzc29jaWF0aW9uIHJlcXVlc3QuCisKKwkvL3ByaW50aygiPD09IERydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbigpXG4iKTsKK30KK3ZvaWQKK01nbnREaXNjb25uZWN0SUJTUygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CispCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CQkJaTsKKworCS8vcHJpbnRrKCJYWFhYWFhYWFhYIE1nbnREaXNjb25uZWN0IElCU1NcbiIpOworCisJRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKGRldiwgdW5zcGVjX3JlYXNvbik7CisKKy8vCVBsYXRmb3JtWmVyb01lbW9yeSggcE1nbnRJbmZvLT5Cc3NpZCwgNiApOworCWZvcihpPTA7aTw2O2krKykgIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkW2ldID0gMHg1NTsKKworCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCisJLy9TdG9wIEJlYWNvbi4KKworCS8vIFZpc3RhIGFkZCBhIEFkaG9jIHByb2ZpbGUsIEhXIHJhZGlvIG9mZiB1bnRpbGwgT0lEX0RPVDExX1JFU0VUX1JFUVVFU1QKKwkvLyBEcml2ZXIgd291bGQgc2V0IE1TUj1OT19MSU5LLCB0aGVuIEhXIFJhZGlvIE9OLCBNZ250UXVldWUgU3R1Y2suCisJLy8gQmVjYXVzZSBCY24gRE1BIGlzbid0IGNvbXBsZXRlLCBtZ250IHF1ZXVlIHdvdWxkIHN0dWNrIHVudGlsIEJjbiBwYWNrZXQgc2VuZC4KKworCS8vIERpc2FibGUgQmVhY29uIFF1ZXVlIE93biBiaXQsIHN1Z2dlc3RlZCBieSBqb25nCisvLwlBZGFwdGVyLT5IYWxGdW5jLlNldFR4RGVzY09XTkhhbmRsZXIoQWRhcHRlciwgQkVBQ09OX1FVRVVFLCAwLCAwKTsKKwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMocHJpdi0+aWVlZTgwMjExKTsKKworCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UoZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQocHJpdi0+aWVlZTgwMjExKTsKKworCS8vIFN0b3AgU1cgQmVhY29uLlVzZSBodyBiZWFjb24gc28gZG8gbm90IG5lZWQgdG8gZG8gc28uYnkgYW15CisjaWYgMAorCWlmKHBNZ250SW5mby0+YkVuYWJsZVN3QmVhY29uVGltZXIpCisJeworCQkvLyBTd0JlYWNvblRpbWVyIHdpbGwgc3RvcCBpZiBwTWdudEluZm8tPm1JYnNzPT1GQUxTRSwgc2VlIFN3QmVhY29uQ2FsbGJhY2soKSBmb3IgZGV0YWlscy4KKy8vIGNvbW1lbnQgb3V0IGJ5IGhhaWNoLCAyMDA3LjEwLjAxCisvLyNpZiBERVZfQlVTX1RZUEU9PVVTQl9JTlRFUkZBQ0UKKwkJUGxhdGZvcm1DYW5jZWxUaW1lciggQWRhcHRlciwgJnBNZ250SW5mby0+U3dCZWFjb25UaW1lcik7CisvLyNlbmRpZgorCX0KKyNlbmRpZgorCisvLwkJTWdudEluZGljYXRlTWVkaWFTdGF0dXMoIEFkYXB0ZXIsIFJUX01FRElBX0RJU0NPTk5FQ1QsIEdFTkVSQUxfSU5ESUNBVEUgKTsKKworfQordm9pZAorTWxtZURpc2Fzc29jaWF0ZVJlcXVlc3QoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCoJCQlhc1N0YSwKKwl1OAkJCWFzUnNuCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBpOworCisJU2VuZERpc2Fzc29jaWF0aW9uKHByaXYtPmllZWU4MDIxMSwgYXNTdGEsIGFzUnNuICk7CisKKwlpZiggbWVtY21wKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBhc1N0YSwgNiApID09IDAgKXsKKwkJLy9TaHVDaGVuIFRPRE86IGNoYW5nZSBtZWRpYSBzdGF0dXMuCisJCS8vU2h1Q2hlbiBUT0RPOiBXaGF0IHRvIGRvIHdoZW4gZGlzYXNzb2NpYXRlLgorCQlEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oZGV2LCB1bnNwZWNfcmVhc29uKTsKKworCisJLy8JcE1nbnRJbmZvLT5Bc29jVGltZXN0YW1wID0gMDsKKwkJZm9yKGk9MDtpPDY7aSsrKSAgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV0gPSAweDIyOworLy8JCXBNZ250SW5mby0+bUJyYXRlcy5MZW5ndGggPSAwOworLy8JCUFkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKCBBZGFwdGVyLCBIV19WQVJfQkFTSUNfUkFURSwgKHB1MUJ5dGUpKCZwTWdudEluZm8tPm1CcmF0ZXMpICk7CisKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShwcml2LT5pZWVlODAyMTEpOworCisKKwl9CisKK30KKwordm9pZAorTWdudERpc2Nvbm5lY3RBUCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJYXNSc24KKykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKy8vCisvLyBDb21tZW50ZWQgb3V0IGJ5IHJjbmprbywgMjAwNS4wMS4yNzoKKy8vIEkgbW92ZSBTZWNDbGVhckFsbEtleXMoKSB0byBNZ250QWN0U2V0XzgwMl8xMV9ESVNBU1NPQ0lBVEUoKS4KKy8vCisvLwkvLzIwMDQvMDkvMTUsIGtjd3UsIHRoZSBrZXkgc2hvdWxkIGJlIGNsZWFyZWQsIG9yIHRoZSBuZXcgaGFuZHNoYWtpbmcgd2lsbCBub3Qgc3VjY2VzcworLy8JU2VjQ2xlYXJBbGxLZXlzKEFkYXB0ZXIpOworCisJLy8gSW4gV1BBIFdQQTIgbmVlZCB0byBDbGVhciBhbGwga2V5IC4uLiBiZWNhdXNlIG5ldyBrZXkgd2lsbCBzZXQgYWZ0ZXIgbmV3IGhhbmRzaGFraW5nLgorI2lmZGVmIFRPRE8KKwlpZiggICBwTWdudEluZm8tPlNlY3VyaXR5SW5mby5BdXRoTW9kZSA+IFJUXzgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCB8fAorCQkocE1nbnRJbmZvLT5iQVBTdXBvcnRDQ0tNICYmIHBNZ250SW5mby0+YkNDWDgwMjF4ZW5hYmxlKSApICAvLyBJbiBDQ0tNIG1vZGUgd2lsbCBDbGVhciBrZXkKKwl7CisJCVNlY0NsZWFyQWxsS2V5cyhBZGFwdGVyKTsKKwkJUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELCgiPT09PT09PkNDS00gY2xlYXIga2V5Li4uIikpCisJfQorI2VuZGlmCisJLy8gMjAwNC4xMC4xMSwgYnkgcmNuamtvLgorCS8vTWxtZURpc2Fzc29jaWF0ZVJlcXVlc3QoIEFkYXB0ZXIsIHBNZ250SW5mby0+QnNzaWQsIGRpc2FzX2x2X3NzICk7CisJTWxtZURpc2Fzc29jaWF0ZVJlcXVlc3QoIGRldiwgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGFzUnNuICk7CisKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKy8vCXBNZ250SW5mby0+QXNvY1RpbWVzdGFtcCA9IDA7Cit9Citib29sCitNZ250RGlzY29ubmVjdCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJYXNSc24KKykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy8KKwkvLyBTY2hlZHVsZSBhbiB3b3JraXRlbSB0byB3YWtlIHVwIGZvciBwcyBtb2RlLCAwNzAxMDksIGJ5IHJjbmprby4KKwkvLworI2lmZGVmIFRPRE8KKwlpZihwTWdudEluZm8tPm1Qc3MgIT0gZUF3YWtlKQorCXsKKwkJLy8KKwkJLy8gVXNpbmcgQXdrYWVUaW1lciB0byBwcmV2ZW50IG1pc21hdGNoIHBzIHN0YXRlLgorCQkvLyBJbiB0aGUgdGltZXIgdGhlIHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIFJGIGlzIGJlaW5nIGF3b2tlIG9yIG5vdC4gQnkgQnJ1Y2UsIDIwMDctMTAtMzEuCisJCS8vCisJCS8vIFBsYXRmb3JtU2NoZWR1bGVXb3JrSXRlbSggJihwTWdudEluZm8tPkF3YWtlV29ya0l0ZW0pICk7CisJCVBsYXRmb3JtU2V0VGltZXIoIEFkYXB0ZXIsICYocE1nbnRJbmZvLT5Bd2FrZVRpbWVyKSwgMCApOworCX0KKyNlbmRpZgorCisJLy8gSW5kaWNhdGlvbiBvZiBkaXNhc3NvY2lhdGlvbiBldmVudC4KKwkvL0RydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbihBZGFwdGVyLCBhc1Jzbik7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUocHJpdi0+aWVlZTgwMjExKSkKKwkJRG90MTFkX1Jlc2V0KHByaXYtPmllZWU4MDIxMSk7CisjZW5kaWYKKwkvLyBJbiBhZGhvYyBtb2RlLCB1cGRhdGUgYmVhY29uIGZyYW1lLgorCWlmKCBwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgKQorCXsKKwkJaWYoIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DICkKKwkJeworLy8JCQlSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELCAoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdElCU1NcbiIpKTsKKwkJCS8vcHJpbnRrKCJNZ250RGlzY29ubmVjdCgpID09PT4gTWdudERpc2Nvbm5lY3RJQlNTXG4iKTsKKwkJCU1nbnREaXNjb25uZWN0SUJTUyhkZXYpOworCQl9CisJCWlmKCBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSApCisJCXsKKwkJCS8vIFdlIGNsZWFyIGtleSBoZXJlIGluc3RlYWQgb2YgTWdudERpc2Nvbm5lY3RBUCgpIGJlY2F1c2UgdGhhdAorCQkJLy8gTWdudEFjdFNldF84MDJfMTFfRElTQVNTT0NJQVRFKCkgaXMgYW4gaW50ZXJmYWNlIGNhbGxlZCBieSBPUywKKwkJCS8vIGUuZy4gT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUgaW4gV2luZG93cyB3aGlsZSBhcyBNZ250RGlzY29ubmVjdEFQKCkgaXMKKwkJCS8vIHVzZWQgdG8gaGFuZGxlIGRpc2Fzc29jaWF0aW9uIHJlbGF0ZWQgdGhpbmdzIHRvIEFQLCBlLmcuIHNlbmQgRGlzYXNzb2MKKwkJCS8vIGZyYW1lIHRvIEFQLiAgMjAwNS4wMS4yNywgYnkgcmNuamtvLgorLy8JCQlTZWNDbGVhckFsbEtleXMoQWRhcHRlcik7CisKKy8vCQkJUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwgKCJNZ250RGlzY29ubmVjdCgpID09PT4gTWdudERpc2Nvbm5lY3RBUFxuIikpOworCQkJLy9wcmludGsoIk1nbnREaXNjb25uZWN0KCkgPT09PiBNZ250RGlzY29ubmVjdEFQXG4iKTsKKwkJCU1nbnREaXNjb25uZWN0QVAoZGV2LCBhc1Jzbik7CisJCX0KKworCQkvLyBJbmlkaWNhdGUgRGlzY29ubmVjdCwgMjAwNS4wMi4yMywgYnkgcmNuamtvLgorLy8JCU1nbnRJbmRpY2F0ZU1lZGlhU3RhdHVzKCBBZGFwdGVyLCBSVF9NRURJQV9ESVNDT05ORUNULCBHRU5FUkFMX0lORElDQVRFKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlDaGFuZyBSRiBQb3dlciBTdGF0ZS4KKy8vCQlOb3RlIHRoYXQsIG9ubHkgTWdudEFjdFNldF9SRl9TdGF0ZSgpIGlzIGFsbG93ZWQgdG8gc2V0IEhXX1ZBUl9SRl9TVEFURS4KKy8vCisvLwlBc3N1bXB0aW9uOgorLy8JCVBBU1NJVkUgTEVWRUwuCisvLworYm9vbAorU2V0UkZQb3dlclN0YXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJUlRfUkZfUE9XRVJfU1RBVEUJZVJGUG93ZXJTdGF0ZQorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbAkJCWJSZXN1bHQgPSBmYWxzZTsKKworLy8JcHJpbnRrKCItLS0tLS0tLS0+IFNldFJGUG93ZXJTdGF0ZSgpOiBlUkZQb3dlclN0YXRlKCVkKVxuIiwgZVJGUG93ZXJTdGF0ZSk7CisJaWYoZVJGUG93ZXJTdGF0ZSA9PSBwcml2LT5lUkZQb3dlclN0YXRlKQorCXsKKy8vCQlwcmludGsoIjwtLS0tLS0tLS0gU2V0UkZQb3dlclN0YXRlKCk6IGRpc2NhcmQgdGhlIHJlcXVlc3QgZm9yIGVSRlBvd2VyU3RhdGUoJWQpIGlzIHRoZSBzYW1lLlxuIiwgZVJGUG93ZXJTdGF0ZSk7CisJCXJldHVybiBiUmVzdWx0OworCX0KKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl9aRUJSQTI6CisJCWNhc2UgUkZfWkVCUkE0OgorCQkJIGJSZXN1bHQgPSBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoZGV2LCBlUkZQb3dlclN0YXRlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIlNldFJGUG93ZXJTdGF0ZTgxODUoKTogdW5rbm93biBSRkNoaXBJRDogMHglWCEhIVxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCQlicmVhazs7Cit9CisvLwlwcmludGsoIjwtLS0tLS0tLS0gU2V0UkZQb3dlclN0YXRlKCk6IGJSZXN1bHQoJWQpXG4iLCBiUmVzdWx0KTsKKworCXJldHVybiBiUmVzdWx0OworfQordm9pZAorSGFsRW5hYmxlUng4MTg1RHVtbXkoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKK30KK3ZvaWQKK0hhbERpc2FibGVSeDgxODVEdW1teSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworfQorCitib29sCitNZ250QWN0U2V0X1JGX1N0YXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJUlRfUkZfUE9XRVJfU1RBVEUJU3RhdGVUb1NldCwKKwl1MzIJQ2hhbmdlU291cmNlCisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sCQkJCWJBY3Rpb25BbGxvd2VkID0gZmFsc2U7CisJYm9vbAkJCQliQ29ubmVjdEJ5U1NJRCA9IGZhbHNlOworCVJUX1JGX1BPV0VSX1NUQVRFIAlydFN0YXRlOworCXUxNgkJCQlSRldhaXRDb3VudGVyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisvLwkgcHJpbnRrKCI9PT0+TWdudEFjdFNldF9SRl9TdGF0ZSgpOiBTdGF0ZVRvU2V0KCVkKSwgQ2hhbmdlU291cmNlKDB4JXgpXG4iLFN0YXRlVG9TZXQsIENoYW5nZVNvdXJjZSk7CisJLy8KKwkvLyBQcmV2ZW50IHRoZSByYWNlIGNvbmRpdGlvbiBvZiBSRiBzdGF0ZSBjaGFuZ2UuIEJ5IEJydWNlLCAyMDA3LTExLTI4LgorCS8vIE9ubHkgb25lIHRocmVhZCBjYW4gY2hhbmdlIHRoZSBSRiBzdGF0ZSBhdCBvbmUgdGltZSwgYW5kIG90aGVycyBzaG91bGQgd2FpdCB0byBiZSBleGVjdXRlZC4KKwkvLworI2lmIDEKKwl3aGlsZSh0cnVlKQorCXsKKy8vCQlkb3duKCZwcml2LT5yZl9zdGF0ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLGZsYWcpOworCQlpZihwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpCisJCXsKKy8vCQkJcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT5oYWhhMTExMTExMTExXG4iKTsKKy8vCQkJdXAoJnByaXYtPnJmX3N0YXRlKTsKKy8vCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsICgiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBSRiBDaGFuZ2UgaW4gcHJvZ3Jlc3MhIFdhaXQgdG8gc2V0Li5TdGF0ZVRvU2V0KCVkKS5cbiIsIFN0YXRlVG9TZXQpKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJCQkvLyBTZXQgUkYgYWZ0ZXIgdGhlIHByZXZpb3VzIGFjdGlvbiBpcyBkb25lLgorCQkJd2hpbGUocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKQorCQkJeworCQkJCVJGV2FpdENvdW50ZXIgKys7CisvLwkJCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfTE9VRCwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgMSBtcyAoJWQgdGltZXMpLi4uXG4iLCBSRldhaXRDb3VudGVyKSk7CisJCQkJdWRlbGF5KDEwMDApOyAvLyAxIG1zCisKKwkJCQkvLyBXYWl0IHRvbyBsb25nLCByZXR1cm4gRkFMU0UgdG8gYXZvaWQgdG8gYmUgc3R1Y2sgaGVyZS4KKwkJCQlpZihSRldhaXRDb3VudGVyID4gMTAwMCkgLy8gMXNlYworCQkJCXsKKy8vCQkJCQlSVF9BU1NFUlQoRkFMU0UsICgiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IHRvbyBsb2duIHRvIHNldCBSRlxuIikpOworCQkJCQlwcmludGsoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCB0b28gbG9uZyB0byBzZXQgUkZcbiIpOworCQkJCQkvLyBUT0RPOiBSZXNldCBSRiBzdGF0ZT8KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKy8vCQkJcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT0+aGFoYTJcbiIpOworCQkJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTsKKy8vCQkJdXAoJnByaXYtPnJmX3N0YXRlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssZmxhZyk7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOworCisKKwlzd2l0Y2goU3RhdGVUb1NldCkKKwl7CisJY2FzZSBlUmZPbjoKKwkJLy8KKwkJLy8gVHVybiBPbiBSRiBubyBtYXR0ZXIgdGhlIElQUyBzZXR0aW5nIGJlY2F1c2Ugd2UgbmVlZCB0byB1cGRhdGUgdGhlIFJGIHN0YXRlIHRvIE5kaXMgdW5kZXIgVmlzdGEsIG9yCisJCS8vIHRoZSBXaW5kb3dzIGRvZXMgbm90IGFsbG93IHRoZSBkcml2ZXIgdG8gcGVyZm9ybSBzaXRlIHN1cnZleSBhbnkgbW9yZS4gQnkgQnJ1Y2UsIDIwMDctMTAtMDIuCisJCS8vCisJCXByaXYtPlJmT2ZmUmVhc29uICY9ICh+Q2hhbmdlU291cmNlKTsKKworCQlpZighIHByaXYtPlJmT2ZmUmVhc29uKQorCQl7CisJCQlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CisJCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisKKwkJCWlmKHJ0U3RhdGUgPT0gZVJmT2ZmICYmIENoYW5nZVNvdXJjZSA+PVJGX0NIQU5HRV9CWV9IVyAmJiAhcHJpdi0+YkluSGN0VGVzdCkKKwkJCXsKKwkJCQliQ29ubmVjdEJ5U1NJRCA9IHRydWU7CisJCQl9CisJCX0KKwkJZWxzZQorLy8JCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfTE9VRCwgKCJNZ250QWN0U2V0X1JGX1N0YXRlIC0gZVJmb24gcmVqZWN0IHBNZ250SW5mby0+UmZPZmZSZWFzb249IDB4JXgsIENoYW5nZVNvdXJjZT0weCVYXG4iLCBwTWdudEluZm8tPlJmT2ZmUmVhc29uLCBDaGFuZ2VTb3VyY2UpKTsKKwkJCTsKKwkJYnJlYWs7CisKKwljYXNlIGVSZk9mZjoKKwkJIC8vIDA3MDEyNSwgcmNuamtvOiB3ZSBhbHdheXMga2VlcCBjb25uZWN0ZWQgaW4gQVAgbW9kZS4KKworCQkJaWYgKHByaXYtPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX0lQUykKKwkJCXsKKwkJCQkvLworCQkJCS8vIDA2MDgwOCwgQW5uaWU6CisJCQkJLy8gRGlzY29ubmVjdCB0byBjdXJyZW50IEJTUyB3aGVuIHJhZGlvIG9mZi4gQXNrZWQgYnkgUXVhblRhLgorCQkJCS8vCisKKwkJCQkvLworCQkJCS8vIENhbGxpbmcgTWdudERpc2Nvbm5lY3QoKSBpbnN0ZWFkIG9mIE1nbnRBY3RTZXRfODAyXzExX0RJU0FTU09DSUFURSgpLAorCQkJCS8vIGJlY2F1c2Ugd2UgZG8gTk9UIG5lZWQgdG8gc2V0IHNzaWQgdG8gZHVtbXkgb25lcy4KKwkJCQkvLyBSZXZpc2VkIGJ5IFJvZ2VyLCAyMDA3LjEyLjA0LgorCQkJCS8vCisJCQkJTWdudERpc2Nvbm5lY3QoIGRldiwgZGlzYXNfbHZfc3MgKTsKKworCQkJCS8vIENsZWFyIGNvbnRlbnQgb2YgYnNzRGVzY1tdIGFuZCBic3NEZXNjNFF1ZXJ5W10gdG8gYXZvaWQgcmVwb3J0aW5nIG9sZCBic3MgdG8gVUkuCisJCQkJLy8gMjAwNy4wNS4yOCwgYnkgc2hpZW4gY2hhbmcuCisvLwkJCQlQbGF0Zm9ybVplcm9NZW1vcnkoIHBNZ250SW5mby0+YnNzRGVzYywgc2l6ZW9mKFJUX1dMQU5fQlNTKSpNQVhfQlNTX0RFU0MgKTsKKy8vCQkJCXBNZ250SW5mby0+TnVtQnNzRGVzYyA9IDA7CisvLwkJCQlQbGF0Zm9ybVplcm9NZW1vcnkoIHBNZ250SW5mby0+YnNzRGVzYzRRdWVyeSwgc2l6ZW9mKFJUX1dMQU5fQlNTKSpNQVhfQlNTX0RFU0MgKTsKKy8vCQkJCXBNZ250SW5mby0+TnVtQnNzRGVzYzRRdWVyeSA9IDA7CisJCQl9CisKKworCisJCXByaXYtPlJmT2ZmUmVhc29uIHw9IENoYW5nZVNvdXJjZTsKKwkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgZVJmU2xlZXA6CisJCXByaXYtPlJmT2ZmUmVhc29uIHw9IENoYW5nZVNvdXJjZTsKKwkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmKGJBY3Rpb25BbGxvd2VkKQorCXsKKy8vCQlSVF9UUkFDRShDT01QX1JGLCBEQkdfTE9VRCwgKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyBhbGxvd2VkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwgU3RhdGVUb1NldCwgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbikpOworICAgICAgICAgICAgICAgIC8vIENvbmZpZyBIVyB0byB0aGUgc3BlY2lmaWVkIG1vZGUuCisvLwkJcHJpbnRrKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyBhbGxvd2VkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwgU3RhdGVUb1NldCwgcHJpdi0+UmZPZmZSZWFzb24pOworCQlTZXRSRlBvd2VyU3RhdGUoZGV2LCBTdGF0ZVRvU2V0KTsKKworCQkvLyBUdXJuIG9uIFJGLgorCQlpZihTdGF0ZVRvU2V0ID09IGVSZk9uKQorCQl7CisJCQlIYWxFbmFibGVSeDgxODVEdW1teShkZXYpOworCQkJaWYoYkNvbm5lY3RCeVNTSUQpCisJCQl7CisJCQkvLyBieSBhbXkgbm90IHN1cHBvcnRlZAorLy8JCQkJTWdudEFjdFNldF84MDJfMTFfU1NJRChBZGFwdGVyLCBBZGFwdGVyLT5NZ250SW5mby5Tc2lkLk9jdGV0LCBBZGFwdGVyLT5NZ250SW5mby5Tc2lkLkxlbmd0aCwgVFJVRSApOworCQkJfQorCQl9CisJCS8vIFR1cm4gb2ZmIFJGLgorCQllbHNlIGlmKFN0YXRlVG9TZXQgPT0gZVJmT2ZmKQorCQl7CisJCQlIYWxEaXNhYmxlUng4MTg1RHVtbXkoZGV2KTsKKwkJfQorCX0KKwllbHNlCisJeworCS8vCXByaW50aygiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBBY3Rpb24gaXMgcmVqZWN0ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBDaGFuZ2VTb3VyY2UoJSNYKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwgU3RhdGVUb1NldCwgQ2hhbmdlU291cmNlLCBwcml2LT5SZk9mZlJlYXNvbik7CisJfQorCisJLy8gUmVsZWFzZSBSRiBzcGlubG9jaworLy8JZG93bigmcHJpdi0+cmZfc3RhdGUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLGZsYWcpOworCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IGZhbHNlOworLy8JdXAoJnByaXYtPnJmX3N0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLGZsYWcpOworLy8JcHJpbnRrKCI8PT09TWdudEFjdFNldF9SRl9TdGF0ZSgpXG4iKTsKKwlyZXR1cm4gYkFjdGlvbkFsbG93ZWQ7Cit9Cit2b2lkCitJbmFjdGl2ZVBvd2VyU2F2ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3U4IGluZGV4ID0gMDsKKworCS8vCisJLy8gVGhpcyBmbGFnICJiU3dSZlByb2Nlc3NpbmciLCBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBJUFMgcHJvY2VkdXJlLCBzaG91bGQgYmUgc2V0IGlmIHRoZSBJUFMgd29ya2l0ZW0KKwkvLyBpcyByZWFsbHkgc2NoZWR1bGVkLgorCS8vIFRoZSBvbGQgY29kZSwgc2V0cyB0aGlzIGZsYWcgYmVmb3JlIHNjaGVkdWxpbmcgdGhlIElQUyB3b3JraXRlbSBhbmQgaG93ZXZlciwgYXQgdGhlIHNhbWUgdGltZSB0aGUKKwkvLyBwcmV2aW91cyBJUFMgd29ya2l0ZW0gZGlkIG5vdCBlbmQgeWV0LCBmYWlscyB0byBzY2hlZHVsZSB0aGUgY3VycmVudCB3b3JraXRlbS4gVGh1cywgYlN3UmZQcm9jZXNzaW5nCisJLy8gYmxvY2tzIHRoZSBJUFMgcHJvY2VkdXJlIG9mIHN3aXRjaGluZyBSRi4KKwkvLyBCeSBCcnVjZSwgMjAwNy0xMi0yNS4KKwkvLworCXByaXYtPmJTd1JmUHJvY2Vzc2luZyA9IHRydWU7CisKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSwgUkZfQ0hBTkdFX0JZX0lQUyk7CisKKwkvLworCS8vIFRvIHNvbHZlIENBTSB2YWx1ZXMgbWlzcyBpbiBSRiBPRkYsIHJld3JpdGUgQ0FNIHZhbHVlcyBhZnRlciBSRiBPTi4gQnkgQnJ1Y2UsIDIwMDctMDktMjAuCisJLy8KKyNpZiAwCisJd2hpbGUoIGluZGV4IDwgNCApCisJeworCQlpZiggKCBwTWdudEluZm8tPlNlY3VyaXR5SW5mby5QYWlyd2lzZUVuY0FsZ29yaXRobSA9PSBXRVAxMDRfRW5jcnlwdGlvbiApIHx8CisJCQkocE1nbnRJbmZvLT5TZWN1cml0eUluZm8uUGFpcndpc2VFbmNBbGdvcml0aG0gPT0gV0VQNDBfRW5jcnlwdGlvbikgKQorCQl7CisJCQlpZiggcE1nbnRJbmZvLT5TZWN1cml0eUluZm8uS2V5TGVuW2luZGV4XSAhPSAwKQorCQkJcEFkYXB0ZXItPkhhbEZ1bmMuU2V0S2V5SGFuZGxlcihwQWRhcHRlciwgaW5kZXgsIDAsIEZBTFNFLCBwTWdudEluZm8tPlNlY3VyaXR5SW5mby5QYWlyd2lzZUVuY0FsZ29yaXRobSwgVFJVRSwgRkFMU0UpOworCisJCX0KKwkJaW5kZXgrKzsKKwl9CisjZW5kaWYKKwlwcml2LT5iU3dSZlByb2Nlc3NpbmcgPSBmYWxzZTsKK30KKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCUVudGVyIHRoZSBpbmFjdGl2ZSBwb3dlciBzYXZlIG1vZGUuIFJGIHdpbGwgYmUgb2ZmCisvLwkyMDA3LjA4LjE3LCBieSBzaGllbiBjaGFuZy4KKy8vCit2b2lkCitJUFNFbnRlcigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+ZW50ZXIgSVBTXG4iKTsKKwlpZiAocHJpdi0+YkluYWN0aXZlUHMpCisJeworCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKKworCQkvLworCQkvLyBBZGRlZCBieSBCcnVjZSwgMjAwNy0xMi0yNS4KKwkJLy8gRG8gbm90IGVudGVyIElQUyBpbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisJCS8vICgxKSBSRiBpcyBhbHJlYWR5IE9GRiBvciBTbGVlcAorCQkvLyAoMikgYlN3UmZQcm9jZXNzaW5nIChpbmRpY2F0ZXMgdGhlIElQUyBpcyBzdGlsbCB1bmRlciBnb2luZykKKwkJLy8gKDMpIENvbm5lY3R0ZWQgKG9ubHkgZGlzY29ubmVjdGVkIGNhbiB0cmlnZ2VyIElQUykKKwkJLy8gKDQpIElCU1MgKHNlbmQgQmVhY29uKQorCQkvLyAoNSkgQVAgbW9kZSAoc2VuZCBCZWFjb24pCisJCS8vCisJCWlmIChydFN0YXRlID09IGVSZk9uICYmICFwcml2LT5iU3dSZlByb2Nlc3NpbmcKKwkJCSYmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgKSkKKwkJeworCS8vCQlwcmludGsoIklQU0VudGVyKCk6IFR1cm4gb2ZmIFJGLlxuIik7CisJCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gZVJmT2ZmOworCQkJSW5hY3RpdmVQb3dlclNhdmUoZGV2KTsKKwkJfQorCX0KKy8vCXByaW50aygicHJpdi0+ZVJGUG93ZXJTdGF0ZSBpcyAlZFxuIixwcml2LT5lUkZQb3dlclN0YXRlKTsKK30KK3ZvaWQKK0lQU0xlYXZlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCVJUX1JGX1BPV0VSX1NUQVRFIHJ0U3RhdGU7CisJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PmxlYXZlIElQU1xuIik7CisJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKQorCXsKKwkJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CisJCWlmICgocnRTdGF0ZSA9PSBlUmZPZmYgfHwgcnRTdGF0ZSA9PSBlUmZTbGVlcCkgJiYgKCFwcml2LT5iU3dSZlByb2Nlc3NpbmcpICYmIHByaXYtPlJmT2ZmUmVhc29uIDw9IFJGX0NIQU5HRV9CWV9JUFMpCisJCXsKKy8vCQkJcHJpbnRrKCJJUFNMZWF2ZSgpOiBUdXJuIG9uIFJGLlxuIik7CisJCQlwcml2LT5lSW5hY3RpdmVQb3dlclN0YXRlID0gZVJmT247CisJCQlJbmFjdGl2ZVBvd2VyU2F2ZShkZXYpOworCQl9CisJfQorLy8JcHJpbnRrKCJwcml2LT5lUkZQb3dlclN0YXRlIGlzICVkXG4iLHByaXYtPmVSRlBvd2VyU3RhdGUpOworfQorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3ZvaWQgcnRsODE4NWJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCisJdTggU3VwcG9ydGVkV2lyZWxlc3NNb2RlOworCXU4CQkJSW5pdFdpcmVsZXNzTW9kZTsKKwl1OAkJCWJJbnZhbGlkV2lyZWxlc3NNb2RlID0gMDsKKwkvL2ludCBpOworCXU4IHRtcHU4OworICAgIAkvL3U4IHUxdG1wLHUydG1wOworCXU4IGJ0Q1I5MzQ2OworCXU4IFRtcFUxYjsKKwl1OCBidFBTUjsKKworCS8vcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworLy97YnkgYW15IDA4MDMxMgorCXdyaXRlX25pY19ieXRlKGRldiwweDI0ZSwgKEJJVDV8QklUNnxCSVQwKSk7CisvL2J5IGFteSAwODAzMTJ9CisJcnRsODE4MF9yZXNldChkZXYpOworCisJcHJpdi0+ZG1hX3BvbGxfbWFzayA9IDA7CisJcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrID0gMDsKKworCS8vcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShkZXYpOworCisJSHdDb25maWd1cmVSVEw4MTg1KGRldik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOworCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzFdICYgMHhmZmZmICk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgcmVhZF9uaWNfYnl0ZShkZXYsIE1TUikgJiAweGYzKTsJLy8gZGVmYXVsdCBuZXR3b3JrIHR5cGUgdG8gJ05vCUxpbmsnCisKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQlJTUiwgMHgwKTsJCS8vIFNldCBCUlNSPSAxTQorCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCY25JdHYsIDEwMCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBBdGltV25kLCAyKTsKKworCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShkZXYsIEZFTVIsIDB4RkZGRik7CisJUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBGRU1SLCAweEZGRkYpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBXUEFfQ09ORklHLCAwKTsKKworCU1hY0NvbmZpZ184NUJBU0lDKGRldik7CisKKwkvLyBPdmVycmlkZSB0aGUgUkZTV19DVFJMIChNQUMgb2Zmc2V0IDB4MjcyLTB4MjczKSwgMjAwNi4wNi4wNywgYnkgcmNuamtvLgorCS8vIEJUX0RFTU9fQk9BUkQgdHlwZQorCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgUkZTV19DVFJMLCAweDU2OWEpOworLy9ieSBhbXkKKy8vI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkJLy8gZm9yIGpvbmcgcmVxdWlyZWQKKy8vCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgUkZTV19DVFJMLCAweDlhNTYpOworLy8jZW5kaWYKKy8vYnkgYW15CisJLy9CVF9RQV9CT0FSRAorCS8vUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBSRlNXX0NUUkwsIDB4OWE1Nik7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU2V0IHVwIFBIWSByZWxhdGVkLgorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBFbmFibGUgQ29uZmlnMy5QQVJBTV9FbiB0byByZXZpc2UgQW5hYVBhcm0uCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIDB4YzApOwkvLyBlbmFibGUgY29uZmlnIHJlZ2lzdGVyIHdyaXRlCisvL2J5IGFteQorCXRtcHU4ID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsICh0bXB1OCB8Q09ORklHM19QQVJNX0VuKSApOworI2Vsc2UKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsICh0bXB1OCB8Q09ORklHM19QQVJNX0VuIHwgQ09ORklHM19DTEtSVU5fRW4pICk7CisjZW5kaWYKKy8vYnkgYW15CisJLy8gVHVybiBvbiBBbmFsb2cgcG93ZXIuCisJLy8gQXNrZWQgZm9yIGJ5IFdpbGxpYW0sIG90aGVyd2lzZSwgTUFDIDMtd2lyZSBjYW4ndCB3b3JrLCAyMDA2LjA2LjI3LCBieSByY25qa28uCisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0yLCBBTkFQQVJNMl9BU0lDX09OKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgQU5BUEFSTV9BU0lDX09OKTsKKy8vYnkgYW15CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCXdyaXRlX25pY193b3JkKGRldiwgQU5BUEFSQU0zLCAweDAwMTApOworI2Vsc2UKKyAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgQU5BUEFSQU0zLCAweDAwKTsKKyNlbmRpZgorLy9ieSBhbXkKKworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgdG1wdTgpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAweDAwKTsKKy8ve2J5IGFteSAwODAzMTIgZm9yIGxlZAorCS8vIGVuYWJsZSBFRU0wIGFuZCBFRU0xIGluIDkzNDZDUgorCWJ0Q1I5MzQ2ID0gcmVhZF9uaWNfYnl0ZShkZXYsIENSOTM0Nik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIChidENSOTM0NnwweEMwKSApOworCisJLy8gQiBjdXQgdXNlIExFRDEgdG8gY29udHJvbCBIVyBSRiBvbi9vZmYKKwlUbXBVMWIgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSk7CisJVG1wVTFiID0gVG1wVTFiICYgfkJJVDM7CisJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzUsIFRtcFUxYik7CisKKwkvLyBkaXNhYmxlIEVFTTAgYW5kIEVFTTEgaW4gOTM0NkNSCisJYnRDUjkzNDYgJj0gfigweEMwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgYnRDUjkzNDYpOworCisJLy9FbmFibGUgTGVkIChzdWdnZXN0ZWQgYnkgSm9uZykKKwkvLyBCLWN1dCBSRiBSYWRpbyBvbi9vZmYgIDVlWzNdPTAKKwlidFBTUiA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoYnRQU1IgfCBCSVQzKSk7CisvL2J5IGFteSAwODAzMTIgZm9yIGxlZH0KKwkvLyBzZXR1cCBpbml0aWFsIHRpbWluZyBmb3IgUkZFLgorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDA0ODApOworCVNldE91dHB1dEVuYWJsZU9mUmZQaW5zKGRldik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4MjQ4OCk7CisKKwkvLyBQSFkgY29uZmlnLgorCVBoeUNvbmZpZzgxODUoZGV2KTsKKworCS8vIFdlIGFzc3VtZSBSZWdXaXJlbGVzc01vZGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUsCisJLy8gaG93ZXZlciwgd2UgaGFzIHRvIHZhbGlkYXRlIHRoZSB3aXJlbGVzcyBtb2RlIGhlcmUgYW5kIHByb3ZpZGUgYSByZWFzb25ibGUKKwkvLyBpbml0aWFsaXplZCB2YWx1ZSBpZiBuZWNlc3NhcnkuIDIwMDUuMDEuMTMsIGJ5IHJjbmprby4KKwlTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSBHZXRTdXBwb3J0ZWRXaXJlbGVzc01vZGU4MTg1KGRldik7CisJaWYoCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQikgJiYKKwkJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9HKSAmJgorCQkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0EpICYmCisJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQVVUTykpCisJeyAvLyBJdCBzaG91bGQgYmUgb25lIG9mIEIsIEcsIEEsIG9yIEFVVE8uCisJCWJJbnZhbGlkV2lyZWxlc3NNb2RlID0gMTsKKwl9CisJZWxzZQorCXsgLy8gT25lIG9mIEIsIEcsIEEsIG9yIEFVVE8uCisJCS8vIENoZWNrIGlmIHRoZSB3aXJlbGVzcyBtb2RlIGlzIHN1cHBvcnRlZCBieSBSRi4KKwkJaWYoIChpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQVVUTykgJiYKKwkJCShpZWVlLT5tb2RlICYgU3VwcG9ydGVkV2lyZWxlc3NNb2RlKSA9PSAwICkKKwkJeworCQkJYkludmFsaWRXaXJlbGVzc01vZGUgPSAxOworCQl9CisJfQorCisJaWYoYkludmFsaWRXaXJlbGVzc01vZGUgfHwgaWVlZS0+bW9kZT09V0lSRUxFU1NfTU9ERV9BVVRPKQorCXsgLy8gQXV0byBvciBvdGhlciBpbnZhbGlkIHZhbHVlLgorCQkvLyBBc3NpZ25lIGEgd2lyZWxlc3MgbW9kZSB0byBpbml0aWFsaXplLgorCQlpZigoU3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9BKSkKKwkJeworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQTsKKwkJfQorCQllbHNlIGlmKChTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0cpKQorCQl7CisJCQlJbml0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCQl9CisJCWVsc2UgaWYoKFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfQikpCisJCXsKKwkJCUluaXRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwkJZWxzZQorCQl7CisJCQlETUVTR1coIkluaXRpYWxpemVBZGFwdGVyODE4NSgpOiBObyB2YWxpZCB3aXJlbGVzcyBtb2RlIHN1cHBvcnRlZCwgU3VwcG9ydGVkV2lyZWxlc3NNb2RlKCV4KSEhIVxuIiwKKwkJCQkgU3VwcG9ydGVkV2lyZWxlc3NNb2RlKTsKKwkJCUluaXRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKworCQkvLyBJbml0aWFsaXplIFJlZ1dpcmVsZXNzTW9kZSBpZiBpdCBpcyBub3QgYSB2YWxpZCBvbmUuCisJCWlmKGJJbnZhbGlkV2lyZWxlc3NNb2RlKQorCQl7CisJCQlpZWVlLT5tb2RlID0gKFdJUkVMRVNTX01PREUpSW5pdFdpcmVsZXNzTW9kZTsKKwkJfQorCX0KKwllbHNlCisJeyAvLyBPbmUgb2YgQiwgRywgQS4KKwkJSW5pdFdpcmVsZXNzTW9kZSA9IGllZWUtPm1vZGU7CisJfQorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKyNpZmRlZiBFTkFCTEVfSVBTCisvLwlwcmludGsoImluaXRpYWxpemUgRU5BQkxFX0lQU1xuIik7CisJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwlwcml2LT5SZk9mZlJlYXNvbiA9IDA7CisJeworCS8vCXUzMiB0bXAyOworCS8vCXUzMiB0bXAgPSBqaWZmaWVzOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT24sIDApOworCS8vCXRtcDIgPSBqaWZmaWVzOworCS8vCXByaW50aygicmYgb24gY29zdCBqaWZmaWVzOiVseFxuIiwgKHRtcDItdG1wKSoxMDAwL0haKTsKKwl9CisvLwlEcnZJRkluZGljYXRlQ3VycmVudFBoeVN0YXR1cyhwcml2KTsKKwkJLy8KKwkJLy8gSWYgaW5hY3RpdmUgcG93ZXIgbW9kZSBpcyBlbmFibGVkLCBkaXNhYmxlIHJmIHdoaWxlIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZS4KKwkJLy8gMjAwNy4wNy4xNiwgYnkgc2hpZW4gY2hhbmcuCisJCS8vCisJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKQorCXsKKwkvLwl1MzIgdG1wMjsKKwkvLwl1MzIgdG1wID0gamlmZmllczsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsZVJmT2ZmLCBSRl9DSEFOR0VfQllfSVBTKTsKKwkvLwl0bXAyID0gamlmZmllczsKKwkvLwlwcmludGsoInJmIG9mZiBjb3N0IGppZmZpZXM6JWx4XG4iLCAodG1wMi10bXApKjEwMDAvSFopOworCisJfQorI2VuZGlmCisvLwlJUFNFbnRlcihkZXYpOworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKyNpZmRlZiBUT0RPCisJLy8gVHVybiBvZmYgUkYgaWYgbmVjZXNzYXJ5LiAyMDA1LjA4LjIzLCBieSByY25qa28uCisJLy8gV2Ugc2hhbGwgdHVybiBvZmYgUkYgYWZ0ZXIgc2V0dGluZyBDTURSLCBvdGhlcndpc2UsCisJLy8gUkYgd2lsbCBiZSB0dXJubmVkIG9uIGFmdGVyIHdlIGVuYWJsZSBNQUMgVHgvUnguCisJaWYoQWRhcHRlci0+TWdudEluZm8uUmVnUmZPZmYgPT0gVFJVRSkKKwl7CisJCVNldFJGUG93ZXJTdGF0ZTgxODUoQWRhcHRlciwgUkZfT0ZGKTsKKwl9CisJZWxzZQorCXsKKwkJU2V0UkZQb3dlclN0YXRlODE4NShBZGFwdGVyLCBSRl9PTik7CisJfQorI2VuZGlmCisKKy8qICAgLy90aGVzZSBpcyBlcXVhbCB3aXRoIGFib3ZlIFRPRE8uCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIDB4YzApOwkvLyBlbmFibGUgY29uZmlnIHJlZ2lzdGVyIHdyaXRlCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMykgfCBDT05GSUczX1BBUk1fRW4pOworCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDlGRik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0yLCBBTkFQQVJNMl9BU0lDX09OKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBTkFQQVJBTSwgQU5BUEFSTV9BU0lDX09OKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIChyZWFkX25pY19ieXRlKGRldiwgQ09ORklHMykmKH5DT05GSUczX1BBUk1fRW4pKSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIDB4MDApOworKi8KKworCUFjdFNldFdpcmVsZXNzTW9kZTgxODUoZGV2LCAodTgpKEluaXRXaXJlbGVzc01vZGUpKTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXJ0bDgxODViX2lycV9lbmFibGUoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyB9CisKKwordm9pZCBydGw4MTg1Yl9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJLy91MzIgcnhjb25mOworCS8qIGZvciBub3cgd2UgYWNjZXB0IGRhdGEsIG1hbmFnZW1lbnQgJiBjdGwgZnJhbWUqLworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZiAwCisJcnhjb25mPXJlYWRfbmljX2R3b3JkKGRldixSWF9DT05GKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFDX0ZJTFRFUl9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTU5HX0ZSQU1FX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0RBVEFfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQkNBU1RfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTUNBU1RfRlJBTUVfU0hJRlQpOworLy8Jcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9DUkNFUlJfRlJBTUVfU0hJRlQpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIERNRVNHICgiTklDIGluIHByb21pc2MgbW9kZSIpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCBcCisJICAgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCX1lbHNleworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCk7CisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwKQorCQkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9CisKKwkvKmlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki8KKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NUTF9GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfSUNWRVJSX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9QV1JfRlJBTUVfU0hJRlQpOworCX0KKworCWlmKCBwcml2LT5jcmNtb24gPT0gMSAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpeworCQlyeGNvbmYgPSByeGNvbmYgJn4gUlhfRklGT19USFJFU0hPTERfTUFTSzsKKwkJcnhjb25mID0gcnhjb25mIHwgKFJYX0ZJRk9fVEhSRVNIT0xEX05PTkU8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKTsKKwkvL30KKworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9BVVRPUkVTRVRQSFlfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQVhfUlhfRE1BX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKE1BWF9SWF9ETUFfMjA0ODw8TUFYX1JYX0RNQV9TSElGVCk7CisKKwkvL2lmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9PTkxZRVJMUEtUOworCisJcnhjb25mID0gcnhjb25mICZ+IFJDUl9DU19NQVNLOworCWlmKCFwcml2LT5jYXJkXzgxODUpCisJCXJ4Y29uZiB8PSAocHJpdi0+cmNyX2NzZW5zZTw8UkNSX0NTX1NISUZUKTsKKy8vCXJ4Y29uZiAmPX4gMHhmZmYwMDAwMDsKKy8vCXJ4Y29uZiB8PSAweDkwMTAwMDAwOy8vOTAxNGY3NmY7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKyNlbmRpZgorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgRE1FU0cgKCJOSUMgaW4gcHJvbWlzYyBtb2RlIik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCSAgIAlwcml2LT5SZWNlaXZlQ29uZmlnID0gcHJpdi0+UmVjZWl2ZUNvbmZpZyAmICh+UkNSX0FQTSk7CisJCXByaXYtPlJlY2VpdmVDb25maWcgPSBwcml2LT5SZWNlaXZlQ29uZmlnIHwgUkNSX0FBUDsKKwl9CisKKwkvKmlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0NIRUNLX0JTU0lEX1NISUZUKTsKKwl9Ki8KKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlwcml2LT5SZWNlaXZlQ29uZmlnID0gcHJpdi0+UmVjZWl2ZUNvbmZpZyB8IFJDUl9BQ0YgfCBSQ1JfQVBXUk1HVCB8IFJDUl9BSUNWOworCX0KKworCWlmKCBwcml2LT5jcmNtb24gPT0gMSAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlwcml2LT5SZWNlaXZlQ29uZmlnID0gcHJpdi0+UmVjZWl2ZUNvbmZpZyB8IFJDUl9BQ1JDMzI7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHByaXYtPlJlY2VpdmVDb25maWcpOworCisJZml4X3J4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1JYCisJRE1FU0coInJ4Y29uZjogJXggJXgiLHByaXYtPlJlY2VpdmVDb25maWcgLHJlYWRfbmljX2R3b3JkKGRldixSQ1IpKTsKKyNlbmRpZgorCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY21kIHwgKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpKTsKKworfQorCit2b2lkIHJ0bDgxODViX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGNtZDsKKwkvL3U4IHR4X2FnY19jdGw7CisJdTggYnl0ZTsKKwkvL3UzMiB0eGNvbmY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWYgMAorCXR4Y29uZj0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKworCQlieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsQ1dfQ09ORik7CisJCWJ5dGUgJj0gfigxPDxDV19DT05GX1BFUlBBQ0tFVF9DV19TSElGVCk7CisJCWJ5dGUgJj0gfigxPDxDV19DT05GX1BFUlBBQ0tFVF9SRVRSWV9TSElGVCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQ1dfQ09ORiwgYnl0ZSk7CisKKwkJdHhfYWdjX2N0bCA9IHJlYWRfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMKTsKKwkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQpOworCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfQU5UU0VMX1NISUZUKTsKKwkJdHhfYWdjX2N0bCB8PSgxPDxUWF9BR0NfQ1RMX0ZFRURCQUNLX0FOVCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCwgdHhfYWdjX2N0bCk7CisJCS8qCisJCXdyaXRlX25pY193b3JkKGRldiwgMHg1ZSwgMHgwMSk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweGZlLCAweDEwKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4NWUsIDB4MDApOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCSovCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhlYywgMHgzZik7IC8qIERpc2FibGUgZWFybHkgVFggKi8KKwl9CisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCisJCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VENSX1BST0JFX05PVElNRVNUQU1QX1NISUZUKTsKKworCX1lbHNleworCisJCWlmKGh3c2VxbnVtKQorCQkJdHhjb25mPSB0eGNvbmYgJn4gKDE8PFRYX0NPTkZfSEVBREVSX0FVVE9JQ1JFTUVOVF9TSElGVCk7CisJCWVsc2UKKwkJCXR4Y29uZj0gdHhjb25mIHwgKDE8PFRYX0NPTkZfSEVBREVSX0FVVE9JQ1JFTUVOVF9TSElGVCk7CisJfQorCisJdHhjb25mID0gdHhjb25mICZ+IFRYX0xPT1BCQUNLX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRYX0xPT1BCQUNLX05PTkUgPDxUWF9MT09QQkFDS19TSElGVCk7CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9EUFJFVFJZX01BU0s7CisJdHhjb25mID0gdHhjb25mICZ+IFRDUl9SVFNSRVRSWV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChwcml2LT5yZXRyeV9kYXRhPDxUWF9EUFJFVFJZX1NISUZUKTsKKwl0eGNvbmYgPSB0eGNvbmYgfCAocHJpdi0+cmV0cnlfcnRzPDxUWF9SVFNSRVRSWV9TSElGVCk7CisJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUWF9OT0NSQ19TSElGVCk7CisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCQlpZihwcml2LT5od19wbGNwX2xlbikKKwkJCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfUExDUF9MRU47CisJCWVsc2UKKwkJCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9QTENQX0xFTjsKKwl9ZWxzZXsKKwkJdHhjb25mID0gdHhjb25mICZ+IFRDUl9TQVQ7CisJfQorCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfTVhETUFfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAoVENSX01YRE1BXzIwNDg8PFRDUl9NWERNQV9TSElGVCk7CisJdHhjb25mID0gdHhjb25mIHwgVENSX0NXTUlOOworCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9ESVNDVzsKKworLy8JaWYocHJpdi0+aWVlZTgwMjExLT5od193ZXApCisvLwkJdHhjb25mPXR4Y29uZiAmfiAoMTw8VFhfTk9JQ1ZfU0hJRlQpOworLy8JZWxzZQorCQl0eGNvbmY9dHhjb25mIHwgKDE8PFRYX05PSUNWX1NISUZUKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworI2VuZGlmCisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUQ1IsIHByaXYtPlRyYW5zbWl0Q29uZmlnKTsKKwlieXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIE1TUik7CisJYnl0ZSB8PSBNU1JfTElOS19FTkVEQ0E7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIGJ5dGUpOworCisJZml4X3R4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1RYCisJRE1FU0coInR4Y29uZjogJXggJXgiLHByaXYtPlRyYW5zbWl0Q29uZmlnLHJlYWRfbmljX2R3b3JkKGRldixUQ1IpKTsKKyNlbmRpZgorCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LENNRCxjbWQgfCAoMTw8Q01EX1RYX0VOQUJMRV9TSElGVCkpOworCisJLy93cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKworCisvKgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfRE1BX1BPTExJTkcsIHByaXYtPmRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCSovCit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmggYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKaW5kZXggMGQ1ZGMyNC4uYThlYTU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaApAQCAtNDEsNiArNDEsNDAgQEAKICNpZm5kZWYgX19TTElDX0RSSVZFUl9IX18KICNkZWZpbmUgX19TTElDX0RSSVZFUl9IX18KIAorLyogZmlybXdhcmUgc3R1ZmYgKi8KKyNkZWZpbmUgT0FTSVNfVUNPREVfVkVSU19TVFJJTkcJIjEuMiIKKyNkZWZpbmUgT0FTSVNfVUNPREVfVkVSU19EQVRFICAJIjIwMDYvMDMvMjcgMTU6MTA6MzciCisjZGVmaW5lIE9BU0lTX1VDT0RFX0hPU1RJRl9JRCAgCTMKKworc3RhdGljIHMzMiBPTnVtU2VjdGlvbnMgPSAweDI7CitzdGF0aWMgdTMyIE9TZWN0aW9uU2l6ZVtdID0geworCTB4MDAwMDQwMDAsIDB4MDAwMTAwMDAsCit9OworCitzdGF0aWMgdTMyIE9TZWN0aW9uU3RhcnRbXSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDA4MDAwLAorfTsKKworI2RlZmluZSBNT0pBVkVfVUNPREVfVkVSU19TVFJJTkcJIjEuMiIKKyNkZWZpbmUgTU9KQVZFX1VDT0RFX1ZFUlNfREFURSAgCSIyMDA2LzAzLzI3IDE1OjEyOjIyIgorI2RlZmluZSBNT0pBVkVfVUNPREVfSE9TVElGX0lEICAJMworCitzdGF0aWMgczMyIE1OdW1TZWN0aW9ucyA9IDB4MjsKK3N0YXRpYyB1MzIgTVNlY3Rpb25TaXplW10gPQoreworCTB4MDAwMDgwMDAsIDB4MDAwMTAwMDAsCit9OworCitzdGF0aWMgdTMyIE1TZWN0aW9uU3RhcnRbXSA9Cit7CisJMHgwMDAwMDAwMCwgMHgwMDAwODAwMCwKK307CisKKyNkZWZpbmUgR0JfUkNWVUNPREVfVkVSU19TVFJJTkcJIjEuMiIKKyNkZWZpbmUgR0JfUkNWVUNPREVfVkVSU19EQVRFICAJIjIwMDYvMDMvMjcgMTU6MTI6MTUiCitzdGF0aWMgdTMyIE9hc2lzUmN2VUNvZGVMZW4gPSA1MTI7CitzdGF0aWMgdTMyIEdCUmN2VUNvZGVMZW4gPSA1MTI7CisjZGVmaW5lIFNFQ1RJT05fU0laRSA2NTUzNgogCiBzdHJ1Y3Qgc2xpY19zcGlubG9jayB7CiAJc3BpbmxvY2tfdAlsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCmluZGV4IDAwMzkwMzYuLmJmN2RhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKQEAgLTk0LDYgKzk0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CkBAIC0xMDUsMTUgKzEwNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSAic2xpY2luYy5oIgotI2luY2x1ZGUgImdiZG93bmxvYWQuaCIKLSNpbmNsdWRlICJnYnJjdnVjb2RlLmgiCi0jaW5jbHVkZSAib2FzaXNyY3Z1Y29kZS5oIgotCi0jaWZkZWYgREVCVUdfTUlDUk9DT0RFCi0jaW5jbHVkZSAib2FzaXNkYmdkb3dubG9hZC5oIgotI2Vsc2UKLSNpbmNsdWRlICJvYXNpc2Rvd25sb2FkLmgiCi0jZW5kaWYKIAogI2lmIFNMSUNfRFVNUF9FTkFCTEVECiAjaW5jbHVkZSAic2xpY2R1bXAuaCIKQEAgLTMyMyw3ICszMTUsNyBAQAogCWluZGV4LCBwc2xpY19oYW5kbGUsIGFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcywgcHNsaWNfaGFuZGxlLT5uZXh0KTsqLwogCWFkYXB0ZXItPnBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKQogCQkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSAqKSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSwKIAkJCQkJJmFkYXB0ZXItPgogCQkJCQlwaHlzX3NobWVtKTsKIC8qCkBAIC0xNDMxLDcgKzE0MjMsNyBAQAogCQlEQkdfTVNHKCJhZGFwdGVyWyVwXSBwb3J0ICVkIHBzaG1lbVslcF0gRnJlZVNobWVtICIsCiAJCQlhZGFwdGVyLCBhZGFwdGVyLT5wb3J0LCAodm9pZCAqKSBhZGFwdGVyLT5wc2htZW0pOwogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtICopLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAogCQkJCSAgICBhZGFwdGVyLT5wc2htZW0sIGFkYXB0ZXItPnBoeXNfc2htZW0pOwogCQlhZGFwdGVyLT5wc2htZW0gPSBOVUxMOwogCQlhZGFwdGVyLT5waHlzX3NobWVtID0gKGRtYV9hZGRyX3QpIE5VTEw7CkBAIC0yMTg2LDYgKzIxNzgsOSBAQAogCiBzdGF0aWMgaW50IHNsaWNfY2FyZF9kb3dubG9hZF9nYnJjdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IGNoYXIgKmZpbGUgPSAiIjsKKwlpbnQgcmV0OwogCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCXUzMiBjb2RlYWRkcjsKIAl1bnNpZ25lZCBjaGFyICppbnN0cnVjdGlvbiA9IE5VTEw7CkBAIC0yMTkzLDEyICsyMTg4LDMyIEBACiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7CiAJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCWluc3RydWN0aW9uID0gKHVuc2lnbmVkIGNoYXIgKikmT2FzaXNSY3ZVQ29kZVswXTsKLQkJcmN2dWNvZGVsZW4gPSBPYXNpc1JjdlVDb2RlTGVuOworCQlmaWxlID0gIm9hc2lzX3Jjdi5iaW4iOwogCQlicmVhazsKIAljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJaW5zdHJ1Y3Rpb24gPSAodW5zaWduZWQgY2hhciAqKSZHQlJjdlVDb2RlWzBdOwotCQlyY3Z1Y29kZWxlbiA9IEdCUmN2VUNvZGVMZW47CisJCWZpbGUgPSAiZ2JfcmN2LmJpbiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGUsICZhZGFwdGVyLT5wY2lkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNMSUNPU1M6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJlICVzXG4iLCBmaWxlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbnN0cnVjdGlvbiA9ICh1bnNpZ25lZCBjaGFyICopZnctPmRhdGE7CisJcmN2dWNvZGVsZW4gPSBmdy0+c2l6ZTsKKwlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7CisJY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6CisJCWlmIChyY3Z1Y29kZWxlbiAhPSBPYXNpc1JjdlVDb2RlTGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgorCQlpZiAocmN2dWNvZGVsZW4gIT0gR0JSY3ZVQ29kZUxlbikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBU1NFUlQoMCk7CkBAIC0yMjI1LDEzICsyMjQwLDE2IEBACiAJfQogCiAJLyogZG93bmxvYWQgZmluaXNoZWQgKi8KKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlXUklURV9SRUcoc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsIFNMSUNfUkNWV0NTX0ZJTklTSCwgRkxVU0gpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2xpY19jYXJkX2Rvd25sb2FkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogeworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3QgY2hhciAqZmlsZSA9ICIiOworCWludCByZXQ7CiAJdTMyIHNlY3Rpb247CiAJaW50IHRoaXNzZWN0aW9uc2l6ZTsKIAlpbnQgY29kZWFkZHI7CkBAIC0yMjU1LDYgKzIyNzMsNyBAQAogCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgogLyogICAgICBEQkdfTVNHICgic2xpY29zczogJXMgZGV2aWQ9PVNMSUNfMkdCX0RFVklDRV9JRCBzZWN0aW9uc1sleF1cbiIsCiAJX19mdW5jX18sICh1aW50KSBPTnVtU2VjdGlvbnMpOyAqLworCQlmaWxlID0gInNsaWNfb2FzaXMuYmluIjsKIAkJbnVtc2VjdHMgPSBPTnVtU2VjdGlvbnM7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1zZWN0czsgaSsrKSB7CiAJCQlzZWN0c2l6ZVtpXSA9IE9TZWN0aW9uU2l6ZVtpXTsKQEAgLTIyNjQsNiArMjI4Myw3IEBACiAJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6CiAvKiAgICAgICAgICAgICAgREJHX01TRyAoInNsaWNvc3M6ICVzIGRldmlkPT1TTElDXzFHQl9ERVZJQ0VfSUQgc2VjdGlvbnNbJXhdXG4iLAogCQlfX2Z1bmNfXywgKHVpbnQpIE1OdW1TZWN0aW9ucyk7ICovCisJCWZpbGUgPSAic2xpY19tb2phdmUuYmluIjsKIAkJbnVtc2VjdHMgPSBNTnVtU2VjdGlvbnM7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1zZWN0czsgaSsrKSB7CiAJCQlzZWN0c2l6ZVtpXSA9IE1TZWN0aW9uU2l6ZVtpXTsKQEAgLTIyNzQsMjYgKzIyOTQsMzMgQEAKIAkJQVNTRVJUKDApOwogCQlicmVhazsKIAl9CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGUsICZhZGFwdGVyLT5wY2lkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNMSUNPU1M6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJlICVzXG4iLCBmaWxlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlBU1NFUlQobnVtc2VjdHMgPD0gMyk7CiAKIAlmb3IgKHNlY3Rpb24gPSAwOyBzZWN0aW9uIDwgbnVtc2VjdHM7IHNlY3Rpb24rKykgewogCQlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7CiAJCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopICZPYXNpc1VDb2RlW3NlY3Rpb25dWzBdOworCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopKGZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqCisJCQkJCQkJCXNlY3Rpb24pKTsKIAkJCWJhc2VhZGRyZXNzID0gc2VjdHN0YXJ0W3NlY3Rpb25dOwogCQkJdGhpc3NlY3Rpb25zaXplID0gc2VjdHNpemVbc2VjdGlvbl0gPj4gMzsKIAkJCWxhc3RpbnN0cnVjdCA9Ci0JCQkgICAgKHUzMiAqKSAmT2FzaXNVQ29kZVtzZWN0aW9uXVtzZWN0c2l6ZVtzZWN0aW9uXSAtCi0JCQkJCQkJICAgICA4XTsKKwkJCSAgICAodTMyICopKGZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqIHNlY3Rpb24pICsKKwkJCQkJc2VjdHNpemVbc2VjdGlvbl0gLSA4KTsKIAkJCWJyZWFrOwogCQljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJCWluc3RydWN0aW9uID0gKHUzMiAqKSAmTW9qYXZlVUNvZGVbc2VjdGlvbl1bMF07CisJCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbikpOwogCQkJYmFzZWFkZHJlc3MgPSBzZWN0c3RhcnRbc2VjdGlvbl07CiAJCQl0aGlzc2VjdGlvbnNpemUgPSBzZWN0c2l6ZVtzZWN0aW9uXSA+PiAzOwogCQkJbGFzdGluc3RydWN0ID0KLQkJCSAgICAodTMyICopICZNb2phdmVVQ29kZVtzZWN0aW9uXVtzZWN0c2l6ZVtzZWN0aW9uXQotCQkJCQkJCSAgICAgIC0gOF07CisJCQkgICAgKHUzMiAqKShmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKiBzZWN0aW9uKSArCisJCQkJCXNlY3RzaXplW3NlY3Rpb25dIC0gOCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUFTU0VSVCgwKTsKQEAgLTIzMjksMTAgKzIzNTYsMTIgQEAKIAlmb3IgKHNlY3Rpb24gPSAwOyBzZWN0aW9uIDwgbnVtc2VjdHM7IHNlY3Rpb24rKykgewogCQlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7CiAJCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgotCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopJk9hc2lzVUNvZGVbc2VjdGlvbl1bMF07CisJCQlpbnN0cnVjdGlvbiA9ICh1MzIgKilmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKgorCQkJCQkJCQlzZWN0aW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJCWluc3RydWN0aW9uID0gKHUzMiAqKSZNb2phdmVVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKWZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqCisJCQkJCQkJCXNlY3Rpb24pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlBU1NFUlQoMCk7CkBAIC0yMzc0LDEzICsyNDAzLDEzIEBACiAJCQkJICAgIHRoaXNzZWN0aW9uc2l6ZVsleF0gZmFpbHVyZVsleF1cbiIsCiAJCQkJICAgICBfX2Z1bmNfXywgY29kZWFkZHIsIHRoaXNzZWN0aW9uc2l6ZSwKIAkJCQkgICAgIGZhaWx1cmUpOwotCisJCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCX0KIAl9CiAvKiAgICBEQkdfTVNHICgic2xpY29zczogQ29tcGFyZSBkb25lXG4iKTsqLwotCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJLyogRXZlcnl0aGluZyBPSywga2ljayBvZmYgdGhlIGNhcmQgKi8KIAltZGVsYXkoMTApOwogCVdSSVRFX1JFRyhzbGljX3JlZ3MtPnNsaWNfd2NzLCBTTElDX1dDU19TVEFSVCwgRkxVU0gpOwpAQCAtMjgzMiw5ICsyODYxLDggQEAKIAl9CiAJaWYgKCFwaHlzY2FyZCkgewogCQkvKiBubyBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGZvciB0aGlzIHBoeXNpY2FsIGNhcmQgeWV0ICovCi0JCXBoeXNjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBoeXNjYXJkICopLCBHRlBfQVRPTUlDKTsKKwkJcGh5c2NhcmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5c2NhcmQpLCBHRlBfQVRPTUlDKTsKIAkJQVNTRVJUKHBoeXNjYXJkKTsKLQkJbWVtc2V0KHBoeXNjYXJkLCAwLCBzaXplb2Yoc3RydWN0IHBoeXNjYXJkICopKTsKIAogCQlEQkdfTVNHCiAJCSAgICAoIlxuJXMgQWxsb2NhdGUgYSBQSFlTSUNBTGNhcmQ6XG4gICAgUEhZU0lDQUxfQ2FyZFslcF1cblwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9SRUFETUUKaW5kZXggZDUxNGQxOC4uZTQyZjM0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9SRUFETUUKQEAgLTIsOCArMiw2IEBACiBOb24tQWNjZWxlcmF0ZWQgMTBHYmUgbmV0d29yayBkcml2ZXIuCiAKIFRPRE86Ci0JLSBsaW5kZW50IHRoZSBjb2RlCi0JLSByZW1vdmUgdHlwZWRlZnMKIAktIHJlbW92ZSB3cmFwcGVycwogCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwogCS0gbmV3IGZ1bmN0aW9uYWxpdHkgdGhhdCB0aGUgY2FyZCBuZWVkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuYyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmMKaW5kZXggNTI3MmExOC4uMWUwY2ZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jCkBAIC04MCwxMyArODAsMTMgQEAKICNpbmNsdWRlICJzeGdwaHljb2RlLmgiCiAjaW5jbHVkZSAic2FoYXJhZGJnZG93bmxvYWQuaCIKIAotc3RhdGljIGludCBzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgU2l6ZSwKLQkJCQkgICAgICBTWEdfQlVGRkVSX1RZUEUgQnVmZmVyVHlwZSk7Ci1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwgdm9pZCAqUmN2QmxvY2ssCitzdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBTaXplLAorCQkJCSAgICAgIGVudW0gU1hHX0JVRkZFUl9UWVBFIEJ1ZmZlclR5cGUpOworc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3JjdmJsb2NrX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHZvaWQgKlJjdkJsb2NrLAogCQkJCQkgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgdTMyIExlbmd0aCk7Ci1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJCQkgICAgIFBTWEdfU0NBVFRFUl9HQVRIRVIgU3hnU2dsLAorc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJICAgICBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2wsCiAJCQkJCSAgICAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MsCiAJCQkJCSAgICAgdTMyIExlbmd0aCk7CiAKQEAgLTk2LDE3ICs5NiwxNyBAQAogc3RhdGljIGludCBzeGdfZW50cnlfaGFsdChwX25ldF9kZXZpY2UgZGV2KTsKIHN0YXRpYyBpbnQgc3hnX2lvY3RsKHBfbmV0X2RldmljZSBkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIGludCBzeGdfc2VuZF9wYWNrZXRzKHN0cnVjdCBza19idWZmICpza2IsIHBfbmV0X2RldmljZSBkZXYpOwotc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHBfYWRhcHRlcl90IGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIHZvaWQgc3hnX2R1bWJfc2dsKFBTQ0FUVEVSX0dBVEhFUl9MSVNUIHBTZ2wsIFBTWEdfU0NBVFRFUl9HQVRIRVIgU3hnU2dsKTsKK3N0YXRpYyBpbnQgc3hnX3RyYW5zbWl0X3BhY2tldChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIHN4Z19kdW1iX3NnbChzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCAqcFNnbCwgc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiAqU3hnU2dsKTsKIAotc3RhdGljIHZvaWQgc3hnX2hhbmRsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgaW50IHN4Z19wcm9jZXNzX2lzcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgTWVzc2FnZUlkKTsKLXN0YXRpYyB1MzIgc3hnX3Byb2Nlc3NfZXZlbnRfcXVldWUocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIFJzc0lkKTsKLXN0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9zbG93X3NlbmQocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnN4Z19zbG93X3JlY2VpdmUocF9hZGFwdGVyX3QgYWRhcHRlciwgUFNYR19FVkVOVCBFdmVudCk7Ci1zdGF0aWMgdm9pZCBzeGdfcHJvY2Vzc19yY3ZfZXJyb3IocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIEVycm9yU3RhdHVzKTsKLXN0YXRpYyBib29sIHN4Z19tYWNfZmlsdGVyKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkgICBwX2V0aGVyX2hlYWRlciBFdGhlckhkciwgdXNob3J0IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBzeGdfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpOworc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgUnNzSWQpOworc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX3Nsb3dfc2VuZChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgU1hHX0VWRU5UICpFdmVudCk7CitzdGF0aWMgdm9pZCBzeGdfcHJvY2Vzc19yY3ZfZXJyb3Ioc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIEVycm9yU3RhdHVzKTsKK3N0YXRpYyBib29sIHN4Z19tYWNfZmlsdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkgICBzdHJ1Y3QgZXRoZXJfaGVhZGVyICpFdGhlckhkciwgdXNob3J0IGxlbmd0aCk7CiAKICNpZiBTTElDX0dFVF9TVEFUU19FTkFCTEVECiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN4Z19nZXRfc3RhdHMocF9uZXRfZGV2aWNlIGRldik7CkBAIC0xMTksMjIgKzExOSwyMiBAQAogc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9saXN0KHBfbmV0X2RldmljZSBkZXYpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHN4Z19hZGFwdGVyX3NldF9od2FkZHIocF9hZGFwdGVyX3QgYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfYWRhcHRlcl9zZXRfaHdhZGRyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOwogCi1zdGF0aWMgdm9pZCBzeGdfdW5tYXBfbW1pb19zcGFjZShwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z191bm1hcF9tbWlvX3NwYWNlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOwogCi1zdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2FkYXB0ZXIocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfc3RvY2tfcmN2X2J1ZmZlcnMocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfZGVzY3JpcHRvcl9ibG9ja3MocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19zdG9ja19yY3ZfYnVmZmVycyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9kZXNjcmlwdG9yX2Jsb2NrcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJCQkgICB1bnNpZ25lZCBjaGFyIEluZGV4KTsKLXN0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfbGluayhwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyBpbnQgc3hnX3BoeV9pbml0KHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgU1hHX0xJTktfU1RBVEUgc3hnX2dldF9saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlciwgU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKTsKLXN0YXRpYyBpbnQgc3hnX3dyaXRlX21kaW9fcmVnKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2xpbmsoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgaW50IHN4Z19waHlfaW5pdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19saW5rX2V2ZW50KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIGVudW0gU1hHX0xJTktfU1RBVEUgc3hnX2dldF9saW5rX3N0YXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2xpbmtfc3RhdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpOworc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCSAgICAgIHUzMiBEZXZBZGRyLCB1MzIgUmVnQWRkciwgdTMyIFZhbHVlKTsKLXN0YXRpYyBpbnQgc3hnX3JlYWRfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX3JlYWRfbWRpb19yZWcoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCSAgICAgdTMyIERldkFkZHIsIHUzMiBSZWdBZGRyLCB1MzIgKnBWYWx1ZSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3hnX2ZpcnN0X2luaXQgPSAxOwpAQCAtMTQ1LDcgKzE0NSw3IEBACiBzdGF0aWMgaW50IGRlYnVnID0gLTE7CiBzdGF0aWMgcF9uZXRfZGV2aWNlIGhlYWRfbmV0ZGV2aWNlID0gTlVMTDsKIAotc3RhdGljIHN4Z2Jhc2VfZHJpdmVyX3Qgc3hnX2dsb2JhbCA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3hnYmFzZV9kcml2ZXJfdCBzeGdfZ2xvYmFsID0gewogCS5keW5hbWljX2ludGFnZyA9IDEsCiB9Owogc3RhdGljIGludCBpbnRhZ2dfZGVsYXkgPSAxMDA7CkBAIC0xODYsNyArMTg2LDcgQEAKIAkJbWIoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN4Z19yZWc2NF93cml0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCB2b2lkIF9faW9tZW0gKnJlZywKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeGdfcmVnNjRfd3JpdGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdm9pZCBfX2lvbWVtICpyZWcsCiAJCQkJICAgdTY0IHZhbHVlLCB1MzIgY3B1KQogewogCXUzMiB2YWx1ZV9oaWdoID0gKHUzMikgKHZhbHVlID4+IDMyKTsKQEAgLTIwOSw3ICsyMDksNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc3hnX2RiZ19tYWNhZGRycyhwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2RiZ19tYWNhZGRycyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCURCR19FUlJPUigiICAoJXMpIGN1cnIgJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlhcbiIsCiAJCSAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBhZGFwdGVyLT5jdXJybWFjYWRkclswXSwKQEAgLTIyNSwxMiArMjI1LDEyIEBACiB9CiAKIC8qIFNYRyBHbG9iYWxzICovCi1zdGF0aWMgU1hHX0RSSVZFUiBTeGdEcml2ZXI7CitzdGF0aWMgc3RydWN0IFNYR19EUklWRVIgU3hnRHJpdmVyOwogCiAjaWZkZWYgIEFUS0RCRwotc3RhdGljIHN4Z190cmFjZV9idWZmZXJfdCBMU3hnVHJhY2VCdWZmZXI7CitzdGF0aWMgc3RydWN0IHN4Z190cmFjZV9idWZmZXJfdCBMU3hnVHJhY2VCdWZmZXI7CiAjZW5kaWYgLyogQVRLREJHICovCi1zdGF0aWMgc3hnX3RyYWNlX2J1ZmZlcl90ICpTeGdUcmFjZUJ1ZmZlciA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN4Z190cmFjZV9idWZmZXJfdCAqU3hnVHJhY2VCdWZmZXIgPSBOVUxMOwogCiAvKgogICogc3hnX2Rvd25sb2FkX21pY3JvY29kZQpAQCAtMjQ0LDkgKzI0NCw5IEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgYm9vbCBzeGdfZG93bmxvYWRfbWljcm9jb2RlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIFNYR19VQ09ERV9TRUwgVWNvZGVTZWwpCitzdGF0aWMgYm9vbCBzeGdfZG93bmxvYWRfbWljcm9jb2RlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGVudW0gU1hHX1VDT0RFX1NFTCBVY29kZVNlbCkKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBTZWN0aW9uOwogCXUzMiBUaGlzU2VjdGlvblNpemU7CiAJdTMyICpJbnN0cnVjdGlvbiA9IE5VTEw7CkBAIC00MTYsMTMgKzQxNiwxMyBAQAogICogUmV0dXJuCiAgKglpbnQKICAqLwotc3RhdGljIGludCBzeGdfYWxsb2NhdGVfcmVzb3VyY2VzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9yZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiBpOwogCXUzMiBSc3NJZHMsIElzckNvdW50OwotLyogICAgICBQU1hHX1hNVF9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbXRSaW5nOyAqLwotLyogICAgICBQU1hHX1JDVl9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSY3ZSaW5nOyAqLworLyogICAgICBzdHJ1Y3QgU1hHX1hNVF9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWG10UmluZzsgKi8KKy8qICAgICAgc3RydWN0IFNYR19SQ1ZfUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJjdlJpbmc7ICovCiAKIAlEQkdfRVJST1IoIiVzIEVOVEVSXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTQ2MSwxMyArNDYxLDEzIEBACiAKIAlmb3IgKDs7KSB7CiAJCURCR19FUlJPUigiJXMgQWxsb2NhdGUgWG10UmluZ3Mgc2l6ZVsleF1cbiIsIF9fZnVuY19fLAotCQkJICAodW5zaWduZWQgaW50KShzaXplb2YoU1hHX1hNVF9SSU5HKSAqIDEpKTsKKwkJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKHN0cnVjdCBTWEdfWE1UX1JJTkcpICogMSkpOwogCiAJCS8qIFN0YXJ0IHdpdGggYmlnIGl0ZW1zIGZpcnN0IC0gcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZ3MuICBBdCB0aGUgbW9tZW50ICovCiAJCS8qIEknbSBnb2luZyB0byBrZWVwIHRoZSByaW5nIHNpemUgZml4ZWQgYW5kIGFkanVzdCB0aGUgbnVtYmVyIG9mICovCiAJCS8qIFRDQnMgaWYgd2UgZmFpbC4gIExhdGVyIHdlIG1pZ2h0IGNvbnNpZGVyIHJlZHVjaW5nIHRoZSByaW5nIHNpemUgYXMgd2VsbC4uICovCiAJCWFkYXB0ZXItPlhtdFJpbmdzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkJCSBzaXplb2YoU1hHX1hNVF9SSU5HKSAqCisJCQkJCQkJIHNpemVvZihzdHJ1Y3QgU1hHX1hNVF9SSU5HKSAqCiAJCQkJCQkJIDEsCiAJCQkJCQkJICZhZGFwdGVyLT5QWG10UmluZ3MpOwogCQlEQkdfRVJST1IoIiVzIFhtdFJpbmdzWyVwXVxuIiwgX19mdW5jX18sIGFkYXB0ZXItPlhtdFJpbmdzKTsKQEAgLTQ3NSwzMyArNDc1LDMzIEBACiAJCWlmICghYWRhcHRlci0+WG10UmluZ3MpIHsKIAkJCWdvdG8gcGVyX3RjYl9hbGxvY2F0aW9uX2ZhaWxlZDsKIAkJfQotCQltZW1zZXQoYWRhcHRlci0+WG10UmluZ3MsIDAsIHNpemVvZihTWEdfWE1UX1JJTkcpICogMSk7CisJCW1lbXNldChhZGFwdGVyLT5YbXRSaW5ncywgMCwgc2l6ZW9mKHN0cnVjdCBTWEdfWE1UX1JJTkcpICogMSk7CiAKIAkJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBSY3ZSaW5ncyBzaXplWyV4XVxuIiwgX19mdW5jX18sCi0JCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihTWEdfUkNWX1JJTkcpICogMSkpOworCQkJICAodW5zaWduZWQgaW50KShzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiAxKSk7CiAJCWFkYXB0ZXItPlJjdlJpbmdzID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJIHNpemVvZihTWEdfUkNWX1JJTkcpICogMSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9SSU5HKSAqIDEsCiAJCQkJCSAmYWRhcHRlci0+UFJjdlJpbmdzKTsKIAkJREJHX0VSUk9SKCIlcyBSY3ZSaW5nc1slcF1cbiIsIF9fZnVuY19fLCBhZGFwdGVyLT5SY3ZSaW5ncyk7CiAJCWlmICghYWRhcHRlci0+UmN2UmluZ3MpIHsKIAkJCWdvdG8gcGVyX3RjYl9hbGxvY2F0aW9uX2ZhaWxlZDsKIAkJfQotCQltZW1zZXQoYWRhcHRlci0+UmN2UmluZ3MsIDAsIHNpemVvZihTWEdfUkNWX1JJTkcpICogMSk7CisJCW1lbXNldChhZGFwdGVyLT5SY3ZSaW5ncywgMCwgc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX1JJTkcpICogMSk7CiAJCWJyZWFrOwogCiAJICAgICAgcGVyX3RjYl9hbGxvY2F0aW9uX2ZhaWxlZDoKIAkJLyogYW4gYWxsb2NhdGlvbiBmYWlsZWQuICBGcmVlIGFueSBzdWNjZXNzZnVsIGFsbG9jYXRpb25zLiAqLwogCQlpZiAoYWRhcHRlci0+WG10UmluZ3MpIHsKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkgICAgc2l6ZW9mKFNYR19YTVRfUklORykgKiA0MDk2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBTWEdfWE1UX1JJTkcpICogNDA5NiwKIAkJCQkJICAgIGFkYXB0ZXItPlhtdFJpbmdzLAogCQkJCQkgICAgYWRhcHRlci0+UFhtdFJpbmdzKTsKIAkJCWFkYXB0ZXItPlhtdFJpbmdzID0gTlVMTDsKIAkJfQogCQlpZiAoYWRhcHRlci0+UmN2UmluZ3MpIHsKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQkgICAgc2l6ZW9mKFNYR19SQ1ZfUklORykgKiA0MDk2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX1JJTkcpICogNDA5NiwKIAkJCQkJICAgIGFkYXB0ZXItPlJjdlJpbmdzLAogCQkJCQkgICAgYWRhcHRlci0+UFJjdlJpbmdzKTsKIAkJCWFkYXB0ZXItPlJjdlJpbmdzID0gTlVMTDsKQEAgLTUxNyw3ICs1MTcsNyBAQAogCS8qIFNhbml0eSBjaGVjayByZWNlaXZlIGRhdGEgc3RydWN0dXJlIGZvcm1hdCAqLwogCUFTU0VSVCgoYWRhcHRlci0+UmVjZWl2ZUJ1ZmZlclNpemUgPT0gU1hHX1JDVl9EQVRBX0JVRkZFUl9TSVpFKSB8fAogCSAgICAgICAoYWRhcHRlci0+UmVjZWl2ZUJ1ZmZlclNpemUgPT0gU1hHX1JDVl9KVU1CT19CVUZGRVJfU0laRSkpOwotCUFTU0VSVChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSA9PQorCUFTU0VSVChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykgPT0KIAkgICAgICAgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX1NJWkUpOwogCiAJLyogQWxsb2NhdGUgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuICBXZSBhbGxvY2F0ZSBhIGJsb2NrIG9mIGJ1ZmZlcnMgYW5kICovCkBAIC01MzksMTEgKzUzOSwxMSBAQAogCX0KIAogCURCR19FUlJPUigiJXMgQWxsb2NhdGUgRXZlbnRSaW5ncyBzaXplWyV4XVxuIiwgX19mdW5jX18sCi0JCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcykpOworCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKSk7CiAKIAkvKiBBbGxvY2F0ZSBldmVudCBxdWV1ZXMuICovCiAJYWRhcHRlci0+RXZlbnRSaW5ncyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJCSAgIHNpemVvZihTWEdfRVZFTlRfUklORykgKgorCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBTWEdfRVZFTlRfUklORykgKgogCQkJCQkJICAgUnNzSWRzLAogCQkJCQkJICAgJmFkYXB0ZXItPlBFdmVudFJpbmdzKTsKIApAQCAtNTU0LDcgKzU1NCw3IEBACiAJCXN0YXR1cyA9IFNUQVRVU19SRVNPVVJDRVM7CiAJCWdvdG8gcGVyX3RjYl9hbGxvY2F0aW9uX2ZhaWxlZDsKIAl9Ci0JbWVtc2V0KGFkYXB0ZXItPkV2ZW50UmluZ3MsIDAsIHNpemVvZihTWEdfRVZFTlRfUklORykgKiBSc3NJZHMpOworCW1lbXNldChhZGFwdGVyLT5FdmVudFJpbmdzLCAwLCBzaXplb2Yoc3RydWN0IFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcyk7CiAKIAlEQkdfRVJST1IoIiVzIEFsbG9jYXRlIElTUiBzaXplWyV4XVxuIiwgX19mdW5jX18sIElzckNvdW50KTsKIAkvKiBBbGxvY2F0ZSBJU1IgKi8KQEAgLTYyOCw3ICs2MjgsNyBAQAogCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb24gPSAwOwogCWludCBlcnI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXI7CiAJdm9pZCBfX2lvbWVtICptZW1tYXBwZWRfaW9hZGRyOwogCXUzMiBzdGF0dXMgPSAwOwogCXVsb25nIG1taW9fc3RhcnQgPSAwOwpAQCAtNjgxLDcgKzY4MSw3IEBACiAJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKIAogCURCR19FUlJPUigiY2FsbCBhbGxvY19ldGhlcmRldlxuIik7Ci0JbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKGFkYXB0ZXJfdCkpOworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYWRhcHRlcl90KSk7CiAJaWYgKCFuZXRkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2V4aXRfc3hnX3Byb2JlOwpAQCAtODcxLDcgKzg3MSw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZS4KICAqLwotc3RhdGljIHZvaWQgc3hnX2Rpc2FibGVfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJEaXNJbnRyIiwKIAkJICBhZGFwdGVyLCBhZGFwdGVyLT5JbnRlcnJ1cHRzRW5hYmxlZCwgMCwgMCk7CkBAIC05MDIsNyArOTAyLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdm9pZCBzeGdfZW5hYmxlX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJFbkludHIiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPkludGVycnVwdHNFbmFibGVkLCAwLCAwKTsKQEAgLTkzNSw3ICs5MzUsNyBAQAogc3RhdGljIGlycXJldHVybl90IHN4Z19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXBfbmV0X2RldmljZSBkZXYgPSAocF9uZXRfZGV2aWNlKSBkZXZfaWQ7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIC8qICAgICAgdTMyICAgICAgICAgICAgICAgICBDcHVNYXNrID0gMCwgaTsgKi8KIAogCWFkYXB0ZXItPlN0YXRzLk51bUludHMrKzsKQEAgLTk2Myw4ICs5NjMsOCBAQAogCQlmb3IgKGkgPSAwOwogCQkgICAgIGkgPCBhZGFwdGVyLT5Sc3NTeXN0ZW1JbmZvLT5Qcm9jZXNzb3JJbmZvLlJzc0NwdUNvdW50OwogCQkgICAgIGkrKykgewotCQkJUFNYR19FVkVOVF9SSU5HIEV2ZW50UmluZyA9ICZhZGFwdGVyLT5FdmVudFJpbmdzW2ldOwotCQkJUFNYR19FVkVOVCBFdmVudCA9CisJCQlzdHJ1Y3QgWEdfRVZFTlRfUklORyAqRXZlbnRSaW5nID0gJmFkYXB0ZXItPkV2ZW50UmluZ3NbaV07CisJCQlzdHJ1Y3QgU1hHX0VWRU5UICpFdmVudCA9CiAJCQkgICAgJkV2ZW50UmluZy0+UmluZ1thZGFwdGVyLT5OZXh0RXZlbnRbaV1dOwogCQkJdW5zaWduZWQgY2hhciBDcHUgPQogCQkJICAgIGFkYXB0ZXItPlJzc1N5c3RlbUluZm8tPlJzc0lkVG9DcHVbaV07CkBAIC05OTIsNyArOTkyLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogLyogICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgUnNzSWQgICA9IDA7ICovCiAJdTMyIE5ld0lzcjsKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZQogICovCi1zdGF0aWMgaW50IHN4Z19wcm9jZXNzX2lzcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgTWVzc2FnZUlkKQorc3RhdGljIGludCBzeGdfcHJvY2Vzc19pc3Ioc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIE1lc3NhZ2VJZCkKIHsKIAl1MzIgSXNyID0gYWRhcHRlci0+SXNyQ29weVtNZXNzYWdlSWRdOwogCXUzMiBOZXdJc3IgPSAwOwpAQCAtMTE1MywxMCArMTE1MywxMCBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUuCiAgKi8KLXN0YXRpYyB1MzIgc3hnX3Byb2Nlc3NfZXZlbnRfcXVldWUocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIFJzc0lkKQorc3RhdGljIHUzMiBzeGdfcHJvY2Vzc19ldmVudF9xdWV1ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgUnNzSWQpCiB7Ci0JUFNYR19FVkVOVF9SSU5HIEV2ZW50UmluZyA9ICZhZGFwdGVyLT5FdmVudFJpbmdzW1Jzc0lkXTsKLQlQU1hHX0VWRU5UIEV2ZW50ID0gJkV2ZW50UmluZy0+UmluZ1thZGFwdGVyLT5OZXh0RXZlbnRbUnNzSWRdXTsKKwlzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcgKkV2ZW50UmluZyA9ICZhZGFwdGVyLT5FdmVudFJpbmdzW1Jzc0lkXTsKKwlzdHJ1Y3QgU1hHX0VWRU5UICpFdmVudCA9ICZFdmVudFJpbmctPlJpbmdbYWRhcHRlci0+TmV4dEV2ZW50W1Jzc0lkXV07CiAJdTMyIEV2ZW50c1Byb2Nlc3NlZCA9IDAsIEJhdGNoZXMgPSAwOwogCXUzMiBudW1fc2ticyA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTExNjQsNyArMTE2NCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnByZXZfc2tiID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqSW5kaWNhdGlvbkxpc3RbU1hHX1JDVl9BUlJBWVNJWkVdOwogCXUzMiBJbmRleDsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKlJjdkRhdGFCdWZmZXJIZHI7CiAjZW5kaWYKIAl1MzIgUmV0dXJuU3RhdHVzID0gMDsKIApAQCAtMTI5MywxMiArMTI5MywxMiBAQAogICogUmV0dXJuCiAgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9zbG93X3NlbmQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9zbG93X3NlbmQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX1hNVF9SSU5HIFhtdFJpbmcgPSAmYWRhcHRlci0+WG10UmluZ3NbMF07Ci0JUFNYR19SSU5HX0lORk8gWG10UmluZ0luZm8gPSAmYWRhcHRlci0+WG10UmluZ1plcm9JbmZvOworCXN0cnVjdCBTWEdfWE1UX1JJTkcgKlhtdFJpbmcgPSAmYWRhcHRlci0+WG10UmluZ3NbMF07CisJc3RydWN0IFNYR19SSU5HX0lORk8gKlhtdFJpbmdJbmZvID0gJmFkYXB0ZXItPlhtdFJpbmdaZXJvSW5mbzsKIAl1MzIgKkNvbnRleHRUeXBlOwotCVBTWEdfQ01EIFhtdENtZDsKKwlzdHJ1Y3QgU1hHX0NNRCAqWG10Q21kOwogCiAJLyogTk9URSAtIFRoaXMgbG9jayBpcyBkcm9wcGVkIGFuZCByZWdyYWJiZWQgaW4gdGhpcyBsb29wLiAqLwogCS8qIFRoaXMgbWVhbnMgdHdvIGRpZmZlcmVudCBwcm9jZXNzb3JzIGNhbiBib3RoIGJlIHJ1bm5pbmcgKi8KQEAgLTEzNTksMTIgKzEzNTksMTIgQEAKICAqIFJldHVybgogICoJIHNrYgogICovCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnN4Z19zbG93X3JlY2VpdmUocF9hZGFwdGVyX3QgYWRhcHRlciwgUFNYR19FVkVOVCBFdmVudCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc3hnX3Nsb3dfcmVjZWl2ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgU1hHX0VWRU5UICpFdmVudCkKIHsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKlJjdkRhdGFCdWZmZXJIZHI7CiAJc3RydWN0IHNrX2J1ZmYgKlBhY2tldDsKIAotCVJjdkRhdGFCdWZmZXJIZHIgPSAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSBFdmVudC0+SG9zdEhhbmRsZTsKKwlSY3ZEYXRhQnVmZmVySGRyID0gKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIEV2ZW50LT5Ib3N0SGFuZGxlOwogCUFTU0VSVChSY3ZEYXRhQnVmZmVySGRyKTsKIAlBU1NFUlQoUmN2RGF0YUJ1ZmZlckhkci0+U3RhdGUgPT0gU1hHX0JVRkZFUl9PTkNBUkQpOwogCUFTU0VSVChTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OKFJjdkRhdGFCdWZmZXJIZHIpID09CkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogCX0KICNpZiBYWFhUT0RPCQkJLyogVkxBTiBzdHVmZiAqLwogCS8qIElmIHRoZXJlJ3MgYSBWTEFOIHRhZywgZXh0cmFjdCBpdCBhbmQgdmFsaWRhdGUgaXQgKi8KLQlpZiAoKChwX2V0aGVyX2hlYWRlcikgKFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkcikpKS0+CisJaWYgKCgoc3RydWN0IGV0aGVyX2hlYWRlciopIChTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OKFJjdkRhdGFCdWZmZXJIZHIpKSktPgogCSAgICBFdGhlclR5cGUgPT0gRVRIRVJUWVBFX1ZMQU4pIHsKIAkJaWYgKFN4Z0V4dHJhY3RWbGFuSGVhZGVyKGFkYXB0ZXIsIFJjdkRhdGFCdWZmZXJIZHIsIEV2ZW50KSAhPQogCQkgICAgU1RBVFVTX1NVQ0NFU1MpIHsKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAJLyogKi8KIAkvKiBEdW1iLW5pYyBmcmFtZS4gIFNlZSBpZiBpdCBwYXNzZXMgb3VyIG1hYyBmaWx0ZXIgYW5kIHVwZGF0ZSBzdGF0cyAqLwogCS8qICovCi0JaWYgKCFzeGdfbWFjX2ZpbHRlcihhZGFwdGVyLCAocF9ldGhlcl9oZWFkZXIpCisJaWYgKCFzeGdfbWFjX2ZpbHRlcihhZGFwdGVyLCAoc3RydWN0IGV0aGVyX2hlYWRlciopCiAJCQkgICAgU1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTihSY3ZEYXRhQnVmZmVySGRyKSwKIAkJCSAgICBFdmVudC0+TGVuZ3RoKSkgewogCQlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJSY3ZGaWx0ciIsCkBAIC0xNDU2LDcgKzE0NTYsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX3Byb2Nlc3NfcmN2X2Vycm9yKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBFcnJvclN0YXR1cykKK3N0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpCiB7CiAJdTMyIEVycm9yOwogCkBAIC0xNTM1LDcgKzE1MzUsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCVRSVUUgaWYgdGhlIGZyYW1lIGlzIHRvIGJlIGFsbG93ZWQKICAqLwotc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIocF9hZGFwdGVyX3QgYWRhcHRlciwgcF9ldGhlcl9oZWFkZXIgRXRoZXJIZHIsCitzdGF0aWMgYm9vbCBzeGdfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3QgZXRoZXJfaGVhZGVyICpFdGhlckhkciwKIAkJCSAgIHVzaG9ydCBsZW5ndGgpCiB7CiAJYm9vbCBFcXVhbEFkZHI7CkBAIC0xNTYwLDcgKzE1NjAsNyBAQAogCQkJCXJldHVybiAoVFJVRSk7CiAJCQl9CiAJCQlpZiAoYWRhcHRlci0+TWFjRmlsdGVyICYgTUFDX01DQVNUKSB7Ci0JCQkJUFNYR19NVUxUSUNBU1RfQUREUkVTUyBNdWx0aWNhc3RBZGRycyA9CisJCQkJc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUyAqTXVsdGljYXN0QWRkcnMgPQogCQkJCSAgICBhZGFwdGVyLT5NdWx0aWNhc3RBZGRyczsKIAkJCQl3aGlsZSAoTXVsdGljYXN0QWRkcnMpIHsKIAkJCQkJRVRIRVJfRVFfQUREUihNdWx0aWNhc3RBZGRycy0+QWRkcmVzcywKQEAgLTE2MDAsNyArMTYwMCw3IEBACiAJcmV0dXJuIChGQUxTRSk7CiB9CiAKLXN0YXRpYyBpbnQgc3hnX3JlZ2lzdGVyX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfcmVnaXN0ZXJfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJaWYgKCFhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCkgewogCQlpbnQgcmV0dmFsOwpAQCAtMTYzNSw3ICsxNjM1LDcgQEAKIAlyZXR1cm4gKFNUQVRVU19TVUNDRVNTKTsKIH0KIAotc3RhdGljIHZvaWQgc3hnX2RlcmVnaXN0ZXJfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfZGVyZWdpc3Rlcl9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlEQkdfRVJST1IoInN4ZzogJXMgRU5URVIgYWRhcHRlclslcF1cbiIsIF9fZnVuY19fLCBhZGFwdGVyKTsKICNpZiBYWFhUT0RPCkBAIC0xNjYxLDcgKzE2NjEsNyBAQAogICogIFBlcmZvcm0gaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHNsaWMgaW50ZXJmYWNlLgogICoKICAqLwotc3RhdGljIGludCBzeGdfaWZfaW5pdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfaWZfaW5pdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCXBfbmV0X2RldmljZSBkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJaW50IHN0YXR1cyA9IDA7CkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogCiBzdGF0aWMgaW50IHN4Z19lbnRyeV9vcGVuKHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgc3RhdHVzOwogCiAJQVNTRVJUKGFkYXB0ZXIpOwpAQCAtMTc3Nyw3ICsxNzc3LDcgQEAKIAlwX25ldF9kZXZpY2UgZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7CiAJdTMyIG1taW9fc3RhcnQgPSAwOwogCXVuc2lnbmVkIGludCBtbWlvX2xlbiA9IDA7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAogCUFTU0VSVChhZGFwdGVyKTsKIAlEQkdfRVJST1IoInN4ZzogJXMgRU5URVIgZGV2WyVwXSBhZGFwdGVyWyVwXVxuIiwgX19mdW5jX18sIGRldiwKQEAgLTE4MDUsNyArMTgwNSw3IEBACiAKIHN0YXRpYyBpbnQgc3hnX2VudHJ5X2hhbHQocF9uZXRfZGV2aWNlIGRldikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN4Z19nbG9iYWwuZHJpdmVyX2xvY2ssIHN4Z19nbG9iYWwuZmxhZ3MpOwogCURCR19FUlJPUigic3hnOiAlcyAoJXMpIEVOVEVSXG4iLCBfX2Z1bmNfXywgZGV2LT5uYW1lKTsKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NTTElDU0VUSU5UQUdHOgogCQl7Ci0vKiAgICAgICAgICAgICAgICAgICAgICBwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOyAqLworLyogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7ICovCiAJCQl1MzIgZGF0YVs3XTsKIAkJCXUzMiBpbnRhZ2c7CiAKQEAgLTE4NjgsNyArMTg2OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc3hnX3NlbmRfcGFja2V0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwX25ldF9kZXZpY2UgZGV2KQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAJdTMyIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCiAJREJHX0VSUk9SKCJzeGc6ICVzIEVOVEVSIHN4Z19zZW5kX3BhY2tldHMgc2tiWyVwXVxuIiwgX19mdW5jX18sCkBAIC0xOTM0LDEwICsxOTM0LDEwIEBACiAgKiBSZXR1cm4gLQogICogCQlTVEFUVVMgb2Ygc2VuZAogICovCi1zdGF0aWMgaW50IHN4Z190cmFuc21pdF9wYWNrZXQocF9hZGFwdGVyX3QgYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgc3hnX3RyYW5zbWl0X3BhY2tldChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCVBTQ0FUVEVSX0dBVEhFUl9MSVNUIHBTZ2w7Ci0JUFNYR19TQ0FUVEVSX0dBVEhFUiBTeGdTZ2w7CisJc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2w7CisJc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiAqU3hnU2dsOwogCXZvaWQgKlNnbEJ1ZmZlcjsKIAl1MzIgU2dsQnVmZmVyTGVuZ3RoOwogCkBAIC0xOTgwLDE0ICsxOTgwLDE0IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZS4KICAqLwotc3RhdGljIHZvaWQgc3hnX2R1bWJfc2dsKFBTQ0FUVEVSX0dBVEhFUl9MSVNUIHBTZ2wsIFBTWEdfU0NBVFRFUl9HQVRIRVIgU3hnU2dsKQorc3RhdGljIHZvaWQgc3hnX2R1bWJfc2dsKHN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUICpwU2dsLCBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2wpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IFN4Z1NnbC0+YWRhcHRlcjsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gU3hnU2dsLT5hZGFwdGVyOwogCXN0cnVjdCBza19idWZmICpza2IgPSBTeGdTZ2wtPkR1bWJQYWNrZXQ7CiAJLyogRm9yIG5vdywgYWxsIGR1bWItbmljIHNlbmRzIGdvIG9uIFJTUyBxdWV1ZSB6ZXJvICovCi0JUFNYR19YTVRfUklORyBYbXRSaW5nID0gJmFkYXB0ZXItPlhtdFJpbmdzWzBdOwotCVBTWEdfUklOR19JTkZPIFhtdFJpbmdJbmZvID0gJmFkYXB0ZXItPlhtdFJpbmdaZXJvSW5mbzsKLQlQU1hHX0NNRCBYbXRDbWQgPSBOVUxMOworCXN0cnVjdCBTWEdfWE1UX1JJTkcgKlhtdFJpbmcgPSAmYWRhcHRlci0+WG10UmluZ3NbMF07CisJc3RydWN0IFNYR19SSU5HX0lORk8gKlhtdFJpbmdJbmZvID0gJmFkYXB0ZXItPlhtdFJpbmdaZXJvSW5mbzsKKwlzdHJ1Y3QgU1hHX0NNRCAqWG10Q21kID0gTlVMTDsKIC8qICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4ID0gMDsgKi8KIAl1MzIgRGF0YUxlbmd0aCA9IHNrYi0+bGVuOwogLyogIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmTGVuOyAqLwpAQCAtMjExNyw5ICsyMTE3LDkgQEAKICAqIFJldHVybgogICoJc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfbGluayhwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JUFNYR19IV19SRUdTIEh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKIAl1MzIgVmFsdWU7CiAJdTMyIENvbmZpZ0RhdGE7CiAJdTMyIE1heEZyYW1lOwpAQCAtMjI3NCwxMCArMjI3NCwxMCBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfcGh5X2luaXQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX3BoeV9pbml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJdTMyIFZhbHVlOwotCVBQSFlfVUNPREUgcDsKKwlzdHJ1Y3QgUEhZX1VDT0RFICpwOwogCWludCBzdGF0dXM7CiAKIAlEQkdfRVJST1IoIkVOVEVSICVzXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMzIyLDEwICsyMzIyLDEwIEBACiAgKiBSZXR1cm4KICAqCU5vbmUKICAqLwotc3RhdGljIHZvaWQgc3hnX2xpbmtfZXZlbnQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19saW5rX2V2ZW50KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JUFNYR19IV19SRUdTIEh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKLQlTWEdfTElOS19TVEFURSBMaW5rU3RhdGU7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJZW51bSBTWEdfTElOS19TVEFURSBMaW5rU3RhdGU7CiAJaW50IHN0YXR1czsKIAl1MzIgVmFsdWU7CiAKQEAgLTIzNzksNyArMjM3OSw3IEBACiAgKiBSZXR1cm4KICAqCUxpbmsgU3RhdGUKICAqLwotc3RhdGljIFNYR19MSU5LX1NUQVRFIHN4Z19nZXRfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGVudW0gU1hHX0xJTktfU1RBVEUgc3hnX2dldF9saW5rX3N0YXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJaW50IHN0YXR1czsKIAl1MzIgVmFsdWU7CkBAIC0yNDMzLDggKzI0MzMsOCBAQAogCXJldHVybiAoU1hHX0xJTktfRE9XTik7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19pbmRpY2F0ZV9saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJICAgIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSkKK3N0YXRpYyB2b2lkIHN4Z19pbmRpY2F0ZV9saW5rX3N0YXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgIGVudW0gU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQogewogCWlmIChhZGFwdGVyLT5MaW5rU3RhdGUgPT0gU1hHX0xJTktfVVApIHsKIAkJREJHX0VSUk9SKCIlczogTElOSyBub3cgVVAsIGNhbGwgbmV0aWZfc3RhcnRfcXVldWVcbiIsCkBAIC0yNDYwLDcgKzI0NjAsNyBAQAogICogUmV0dXJuCiAgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSkKK3N0YXRpYyB2b2lkIHN4Z19saW5rX3N0YXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGVudW0gU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9JTVBPUlRBTlQsICJMbmtJTkRDVCIsCiAJCSAgYWRhcHRlciwgTGlua1N0YXRlLCBhZGFwdGVyLT5MaW5rU3RhdGUsIGFkYXB0ZXItPlN0YXRlKTsKQEAgLTI0OTgsMTAgKzI0OTgsMTAgQEAKICAqIFJldHVybgogICoJc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3dyaXRlX21kaW9fcmVnKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgaW50IHN4Z193cml0ZV9tZGlvX3JlZyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJICAgICAgdTMyIERldkFkZHIsIHUzMiBSZWdBZGRyLCB1MzIgVmFsdWUpCiB7Ci0JUFNYR19IV19SRUdTIEh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKIAl1MzIgQWRkck9wOwkJLyogQWRkcmVzcyBvcGVyYXRpb24gKHdyaXR0ZW4gdG8gTUlJTSBmaWVsZCByZWcpICovCiAJdTMyIFdyaXRlT3A7CQkvKiBXcml0ZSBvcGVyYXRpb24gKHdyaXR0ZW4gdG8gTUlJTSBmaWVsZCByZWcpICovCiAJdTMyIENtZDsJCS8qIENvbW1hbmQgKHdyaXR0ZW4gdG8gTUlJTSBjb21tYW5kIHJlZykgKi8KQEAgLTI1ODgsMTAgKzI1ODgsMTAgQEAKICAqIFJldHVybgogICoJc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3JlYWRfbWRpb19yZWcocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyBpbnQgc3hnX3JlYWRfbWRpb19yZWcoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCSAgICAgdTMyIERldkFkZHIsIHUzMiBSZWdBZGRyLCB1MzIgKnBWYWx1ZSkKIHsKLQlQU1hHX0hXX1JFR1MgSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOwogCXUzMiBBZGRyT3A7CQkvKiBBZGRyZXNzIG9wZXJhdGlvbiAod3JpdHRlbiB0byBNSUlNIGZpZWxkIHJlZykgKi8KIAl1MzIgUmVhZE9wOwkJLyogUmVhZCBvcGVyYXRpb24gKHdyaXR0ZW4gdG8gTUlJTSBmaWVsZCByZWcpICovCiAJdTMyIENtZDsJCS8qIENvbW1hbmQgKHdyaXR0ZW4gdG8gTUlJTSBjb21tYW5kIHJlZykgKi8KQEAgLTI3MzUsOSArMjczNSw5IEBACiAJcmV0dXJuIChtYWNoYXNoKTsKIH0KIAotc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9tYXNrKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X21hc2soc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlQU1hHX1VDT0RFX1JFR1Mgc3hnX3JlZ3MgPSBhZGFwdGVyLT5VY29kZVJlZ3M7CisJc3RydWN0IFNYR19VQ09ERV9SRUdTICpzeGdfcmVncyA9IGFkYXB0ZXItPlVjb2RlUmVnczsKIAogCURCR19FUlJPUigiJXMgRU5URVIgKCVzKSBtYWNvcHRzWyV4XSBtYXNrWyVsbHhdXG4iLCBfX2Z1bmNfXywKIAkJICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpYWRhcHRlci0+TWFjRmlsdGVyLApAQCAtMjc3NSw3ICsyNzc1LDcgQEAKICAqICBBbGxvY2F0ZSBhIG1jYXN0X2FkZHJlc3Mgc3RydWN0dXJlIHRvIGhvbGQgdGhlIG11bHRpY2FzdCBhZGRyZXNzLgogICogIExpbmsgaXQgaW4uCiAgKi8KLXN0YXRpYyBpbnQgc3hnX21jYXN0X2FkZF9saXN0KHBfYWRhcHRlcl90IGFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCitzdGF0aWMgaW50IHN4Z19tY2FzdF9hZGRfbGlzdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBjaGFyICphZGRyZXNzKQogewogCXBfbWNhc3RfYWRkcmVzc190IG1jYWRkciwgbWxpc3Q7CiAJYm9vbCBlcXVhbGFkZHI7CkBAIC0yODAzLDcgKzI4MDMsNyBAQAogCXJldHVybiAoU1RBVFVTX1NVQ0NFU1MpOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2JpdChwX2FkYXB0ZXJfdCBhZGFwdGVyLCBjaGFyICphZGRyZXNzKQorc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9iaXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgY2hhciAqYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBjaGFyIGNyY3BvbHk7CiAKQEAgLTI4MjEsNyArMjgyMSw3IEBACiAKIHN0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfbGlzdChwX25ldF9kZXZpY2UgZGV2KQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAJaW50IHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCWludCBpOwogCWNoYXIgKmFkZHJlc3NlczsKQEAgLTI4NzYsNyArMjg3Niw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2UocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z191bm1hcF9tbWlvX3NwYWNlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAjaWYgTElOVVhfRlJFRVNfQURBUFRFUl9SRVNPVVJDRVMKIC8qICAgICAgaWYgKGFkYXB0ZXItPlJlZ3MpIHsgKi8KQEAgLTI4OTYsNyArMjg5Niw3IEBACiAgKiBSZXR1cm4KICAqCW5vbmUKICAqLwotdm9pZCBTeGdGcmVlUmVzb3VyY2VzKHBfYWRhcHRlcl90IGFkYXB0ZXIpCit2b2lkIFN4Z0ZyZWVSZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAl1MzIgUnNzSWRzLCBJc3JDb3VudDsKIAlQVENQX09CSkVDVCBUY3BPYmplY3Q7CkBAIC0yOTI0LDcgKzI5MjQsNyBAQAogCS8qIEZyZWUgZXZlbnQgcXVldWVzLiAqLwogCWlmIChhZGFwdGVyLT5FdmVudFJpbmdzKSB7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2YoU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcywKIAkJCQkgICAgYWRhcHRlci0+RXZlbnRSaW5ncywgYWRhcHRlci0+UEV2ZW50UmluZ3MpOwogCX0KIAlpZiAoYWRhcHRlci0+SXNyKSB7CkBAIC0yOTkxLDcgKzI5OTEsNyBAQAogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGNvbXBsZXRlZC4KICAqCiAgKiBBcmd1bWVudHMgLQotICoJcF9hZGFwdGVyX3QgICAgCS0gT3VyIGFkYXB0ZXIgc3RydWN0dXJlCisgKglzdHJ1Y3QgYWRhcHRlcl90ICogICAJLSBPdXIgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCVZpcnR1YWxBZGRyZXNzCS0gTWVtb3J5IHZpcnR1YWwgYWRkcmVzcwogICoJUGh5c2ljYWxBZGRyZXNzCS0gTWVtb3J5IHBoeXNpY2FsIGFkZHJlc3MKICAqCUxlbmd0aAkJLSBMZW5ndGggb2YgbWVtb3J5IGFsbG9jYXRlZCAob3IgMCkKQEAgLTMwMDAsMTAgKzMwMDAsMTAgQEAKICAqIFJldHVybgogICoJTm9uZS4KICAqLwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkgIHZvaWQgKlZpcnR1YWxBZGRyZXNzLAogCQkJCSAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MsCi0JCQkJICB1MzIgTGVuZ3RoLCBTWEdfQlVGRkVSX1RZUEUgQ29udGV4dCkKKwkJCQkgIHUzMiBMZW5ndGgsIGVudW0gU1hHX0JVRkZFUl9UWVBFIENvbnRleHQpCiB7CiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiQWxsb2NDbXAiLAogCQkgIGFkYXB0ZXIsIFZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIENvbnRleHQpOwpAQCAtMzAxOCw3ICszMDE4LDcgQEAKIAkJCQkJICAgICAgIFBoeXNpY2FsQWRkcmVzcywgTGVuZ3RoKTsKIAkJYnJlYWs7CiAJY2FzZSBTWEdfQlVGRkVSX1RZUEVfU0dMOgotCQlzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShhZGFwdGVyLCAoUFNYR19TQ0FUVEVSX0dBVEhFUikKKwkJc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUoYWRhcHRlciwgKHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIqKQogCQkJCQkJIFZpcnR1YWxBZGRyZXNzLAogCQkJCQkJIFBoeXNpY2FsQWRkcmVzcywgTGVuZ3RoKTsKIAkJYnJlYWs7CkBAIC0zMDM5LDggKzMwMzksOCBAQAogICogUmV0dXJuCiAgKglpbnQKICAqLwotc3RhdGljIGludCBzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJCSAgICAgIHUzMiBTaXplLCBTWEdfQlVGRkVSX1RZUEUgQnVmZmVyVHlwZSkKK3N0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkgICAgICB1MzIgU2l6ZSwgZW51bSBTWEdfQlVGRkVSX1RZUEUgQnVmZmVyVHlwZSkKIHsKIAlpbnQgc3RhdHVzOwogCXZvaWQgKkJ1ZmZlcjsKQEAgLTMwOTEsNyArMzA5MSw3IEBACiAgKiBSZXR1cm4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9yY3ZibG9ja19jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3JjdmJsb2NrX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkJCSAgIHZvaWQgKlJjdkJsb2NrLAogCQkJCQkgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcywKIAkJCQkJICAgdTMyIExlbmd0aCkKQEAgLTMwOTksMTEgKzMwOTksMTEgQEAKIAl1MzIgaTsKIAl1MzIgQnVmZmVyU2l6ZSA9IGFkYXB0ZXItPlJlY2VpdmVCdWZmZXJTaXplOwogCXU2NCBQYWRkcjsKLQlQU1hHX1JDVl9CTE9DS19IRFIgUmN2QmxvY2tIZHI7CisJc3RydWN0IFNYR19SQ1ZfQkxPQ0tfSERSICpSY3ZCbG9ja0hkcjsKIAl1bnNpZ25lZCBjaGFyICpSY3ZEYXRhQnVmZmVyOwotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOwotCVBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgUmN2RGVzY3JpcHRvckJsb2NrOwotCVBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIFJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKlJjdkRhdGFCdWZmZXJIZHI7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyAqUmN2RGVzY3JpcHRvckJsb2NrOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSICpSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CiAKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJBbFJjdkJsayIsCiAJCSAgYWRhcHRlciwgUmN2QmxvY2ssIExlbmd0aCwgMCk7CkBAIC0zMTI5LDcgKzMxMjksNyBAQAogCQkgICAgIGkrKywgUGFkZHIgKz0gQnVmZmVyU2l6ZSwgUmN2RGF0YUJ1ZmZlciArPSBCdWZmZXJTaXplKSB7CiAJCQkvKiAqLwogCQkJUmN2RGF0YUJ1ZmZlckhkciA9Ci0JCQkgICAgKFBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUikgKFJjdkRhdGFCdWZmZXIgKworCQkJICAgIChzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIqKSAoUmN2RGF0YUJ1ZmZlciArCiAJCQkJCQkJU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFJfT0ZGU0VUCiAJCQkJCQkJKEJ1ZmZlclNpemUpKTsKIAkJCVJjdkRhdGFCdWZmZXJIZHItPlZpcnR1YWxBZGRyZXNzID0gUmN2RGF0YUJ1ZmZlcjsKQEAgLTMxNDcsNyArMzE0Nyw3IEBACiAJLyogUGxhY2UgdGhpcyBlbnRpcmUgYmxvY2sgb2YgbWVtb3J5IG9uIHRoZSBBbGxSY3ZCbG9ja3MgcXVldWUgc28gaXQgY2FuIGJlICovCiAJLyogZnJlZSBsYXRlciAqLwogCVJjdkJsb2NrSGRyID0KLQkgICAgKFBTWEdfUkNWX0JMT0NLX0hEUikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKworCSAgICAoc3RydWN0IFNYR19SQ1ZfQkxPQ0tfSERSKikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKwogCQkJCSAgU1hHX1JDVl9CTE9DS19IRFJfT0ZGU0VUKEJ1ZmZlclNpemUpKTsKIAlSY3ZCbG9ja0hkci0+VmlydHVhbEFkZHJlc3MgPSBSY3ZCbG9jazsKIAlSY3ZCbG9ja0hkci0+UGh5c2ljYWxBZGRyZXNzID0gUGh5c2ljYWxBZGRyZXNzOwpAQCAtMzE2MSw3ICszMTYxLDcgQEAKIAlmb3IgKGkgPSAwLCBQYWRkciA9IFBoeXNpY2FsQWRkcmVzczsKIAkgICAgIGkgPCBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSzsKIAkgICAgIGkrKywgUGFkZHIgKz0gQnVmZmVyU2l6ZSwgUmN2RGF0YUJ1ZmZlciArPSBCdWZmZXJTaXplKSB7Ci0JCVJjdkRhdGFCdWZmZXJIZHIgPSAoUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKSAoUmN2RGF0YUJ1ZmZlciArCisJCVJjdkRhdGFCdWZmZXJIZHIgPSAoc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKikgKFJjdkRhdGFCdWZmZXIgKwogCQkJCQkJCSAgICAgICBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQKIAkJCQkJCQkgICAgICAgKEJ1ZmZlclNpemUpKTsKIAkJc3Bpbl9sb2NrKCZhZGFwdGVyLT5SY3ZRTG9jayk7CkBAIC0zMTcxLDExICszMTcxLDExIEBACiAKIAkvKiBMb2NhdGUgdGhlIGRlc2NyaXB0b3IgYmxvY2sgYW5kIHB1dCBpdCBvbiBhIHNlcGFyYXRlIGZyZWUgcXVldWUgKi8KIAlSY3ZEZXNjcmlwdG9yQmxvY2sgPQotCSAgICAoUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKworCSAgICAoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyopICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKIAkJCQkJIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19PRkZTRVQKIAkJCQkJIChCdWZmZXJTaXplKSk7CiAJUmN2RGVzY3JpcHRvckJsb2NrSGRyID0KLQkgICAgKFBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCisJICAgIChzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiopICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKIAkJCQkJICAgICBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSX09GRlNFVAogCQkJCQkgICAgIChCdWZmZXJTaXplKSk7CiAJUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5WaXJ0dWFsQWRkcmVzcyA9IFJjdkRlc2NyaXB0b3JCbG9jazsKQEAgLTMxOTMsNyArMzE5Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSzsKIAkJICAgICBpKyssIFJjdkRhdGFCdWZmZXIgKz0gQnVmZmVyU2l6ZSkgewogCQkJUmN2RGF0YUJ1ZmZlckhkciA9Ci0JCQkgICAgKFBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUikgKFJjdkRhdGFCdWZmZXIgKworCQkJICAgIChzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIqKSAoUmN2RGF0YUJ1ZmZlciArCiAJCQkJCQkJU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFJfT0ZGU0VUCiAJCQkJCQkJKEJ1ZmZlclNpemUpKTsKIAkJCVNYR19GUkVFX1JDVl9QQUNLRVQoUmN2RGF0YUJ1ZmZlckhkcik7CkBAIC0zMjIwLDggKzMyMjAsOCBAQAogICogUmV0dXJuCiAgKgogICovCi1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfc2dsX2J1ZmZlcl9jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJCQkgICAgIFBTWEdfU0NBVFRFUl9HQVRIRVIgU3hnU2dsLAorc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCQkJICAgICBzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSICpTeGdTZ2wsCiAJCQkJCSAgICAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MsCiAJCQkJCSAgICAgdTMyIExlbmd0aCkKIHsKQEAgLTMyMjksNyArMzIyOSw3IEBACiAJCSAgYWRhcHRlciwgU3hnU2dsLCBMZW5ndGgsIDApOwogCXNwaW5fbG9jaygmYWRhcHRlci0+U2dsUUxvY2spOwogCWFkYXB0ZXItPkFsbFNnbEJ1ZmZlckNvdW50Kys7Ci0JbWVtc2V0KFN4Z1NnbCwgMCwgc2l6ZW9mKFNYR19TQ0FUVEVSX0dBVEhFUikpOworCW1lbXNldChTeGdTZ2wsIDAsIHNpemVvZihzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSKikpOwogCVN4Z1NnbC0+UGh5c2ljYWxBZGRyZXNzID0gUGh5c2ljYWxBZGRyZXNzOwkvKiAqUGh5c2ljYWxBZGRyZXNzOyAqLwogCVN4Z1NnbC0+YWRhcHRlciA9IGFkYXB0ZXI7CS8qIEluaXRpYWxpemUgYmFja3BvaW50ZXIgb25jZSAqLwogCUluc2VydFRhaWxMaXN0KCZhZGFwdGVyLT5BbGxTZ2xCdWZmZXJzLCAmU3hnU2dsLT5BbGxMaXN0KTsKQEAgLTMyNDMsMTQgKzMyNDMsMTQgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRlbXBfbWFjX2FkZHJlc3NbNl0gPQogICAgIHsgMHgwMCwgMHhhYiwgMHhjZCwgMHhlZiwgMHgxMiwgMHg2OSB9OwogCi1zdGF0aWMgdm9pZCBzeGdfYWRhcHRlcl9zZXRfaHdhZGRyKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfYWRhcHRlcl9zZXRfaHdhZGRyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAvKiAgREJHX0VSUk9SICgiJXMgRU5URVIgY2FyZC0+Y29uZmlnX3NldFsleF0gcG9ydFslZF0gcGh5c3BvcnRbJWRdIGZ1bmN0I1slZF1cbiIsIF9fZnVuY19fLCAqLwogLyogICAgICAgICAgICAgY2FyZC0+Y29uZmlnX3NldCwgYWRhcHRlci0+cG9ydCwgYWRhcHRlci0+cGh5c3BvcnQsIGFkYXB0ZXItPmZ1bmN0aW9ubnVtYmVyKTsgKi8KIC8qICovCiAvKiAgc3hnX2RiZ19tYWNhZGRycyhhZGFwdGVyKTsgKi8KIAotCW1lbWNweShhZGFwdGVyLT5tYWNhZGRyLCB0ZW1wX21hY19hZGRyZXNzLCBzaXplb2YoU1hHX0NPTkZJR19NQUMpKTsKKwltZW1jcHkoYWRhcHRlci0+bWFjYWRkciwgdGVtcF9tYWNfYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBTWEdfQ09ORklHX01BQykpOwogLyogICAgICBEQkdfRVJST1IgKCIlcyBBRlRFUiBjb3B5aW5nIGZyb20gY29uZmlnLm1hY2luZm8gaW50byBjdXJybWFjYWRkclxuIiwgX19mdW5jX18pOyAqLwogLyogICAgICBzeGdfZGJnX21hY2FkZHJzKGFkYXB0ZXIpOyAqLwogCWlmICghKGFkYXB0ZXItPmN1cnJtYWNhZGRyWzBdIHx8CkBAIC0zMjcxLDcgKzMyNzEsNyBAQAogI2lmIFhYWFRPRE8KIHN0YXRpYyBpbnQgc3hnX21hY19zZXRfYWRkcmVzcyhwX25ldF9kZXZpY2UgZGV2LCB2b2lkICpwdHIpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwdHI7CiAKIAlEQkdfRVJST1IoIiVzIEVOVEVSICglcylcbiIsIF9fZnVuY19fLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOwpAQCAtMzMxMyw3ICszMzEzLDcgQEAKICAqIFJldHVybgogICoJaW50CiAgKi8KLXN0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfYWRhcHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJdTMyIFJzc0lkcywgSXNyQ291bnQ7CiAJdTMyIGk7CkBAIC0zMzI3LDcgKzMzMjcsNyBAQAogCiAJLyogU2FuaXR5IGNoZWNrIFNYR19VQ09ERV9SRUdTIHN0cnVjdHVyZSBkZWZpbml0aW9uIHRvICovCiAJLyogbWFrZSBzdXJlIHRoZSBsZW5ndGggaXMgY29ycmVjdCAqLwotCUFTU0VSVChzaXplb2YoU1hHX1VDT0RFX1JFR1MpID09IFNYR19SRUdJU1RFUl9TSVpFX1BFUl9DUFUpOworCUFTU0VSVChzaXplb2Yoc3RydWN0IFNYR19VQ09ERV9SRUdTKSA9PSBTWEdfUkVHSVNURVJfU0laRV9QRVJfQ1BVKTsKIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogCVNYR19ESVNBQkxFX0FMTF9JTlRFUlJVUFRTKGFkYXB0ZXIpOwpAQCAtMzQxMiwxNiArMzQxMiwxNiBAQAogICogUmV0dXJuCiAgKglzdGF0dXMKICAqLwotc3RhdGljIGludCBzeGdfZmlsbF9kZXNjcmlwdG9yX2Jsb2NrKHBfYWRhcHRlcl90IGFkYXB0ZXIsCi0JCQkJICAgICBQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUgotCQkJCSAgICAgUmN2RGVzY3JpcHRvckJsb2NrSGRyKQorc3RhdGljIGludCBzeGdfZmlsbF9kZXNjcmlwdG9yX2Jsb2NrKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUgorCQkJCSAgICAgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcikKIHsKIAl1MzIgaTsKLQlQU1hHX1JJTkdfSU5GTyBSY3ZSaW5nSW5mbyA9ICZhZGFwdGVyLT5SY3ZSaW5nWmVyb0luZm87Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBSY3ZEZXNjcmlwdG9yQmxvY2s7Ci0JUFNYR19DTUQgUmluZ0Rlc2NyaXB0b3JDbWQ7Ci0JUFNYR19SQ1ZfUklORyBSaW5nWmVybyA9ICZhZGFwdGVyLT5SY3ZSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqUmN2UmluZ0luZm8gPSAmYWRhcHRlci0+UmN2UmluZ1plcm9JbmZvOworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLICpSY3ZEZXNjcmlwdG9yQmxvY2s7CisJc3RydWN0IFNYR19DTUQgKlJpbmdEZXNjcmlwdG9yQ21kOworCXN0cnVjdCBTWEdfUkNWX1JJTkcgKlJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOwogCiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiRmlsQmxrIiwKIAkJICBhZGFwdGVyLCBhZGFwdGVyLT5SY3ZCdWZmZXJzT25DYXJkLApAQCAtMzQ0Miw3ICszNDQyLDcgQEAKIAlBU1NFUlQoUmluZ0Rlc2NyaXB0b3JDbWQpOwogCVJjdkRlc2NyaXB0b3JCbG9ja0hkci0+U3RhdGUgPSBTWEdfQlVGRkVSX09OQ0FSRDsKIAlSY3ZEZXNjcmlwdG9yQmxvY2sgPQotCSAgICAoUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykgUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5WaXJ0dWFsQWRkcmVzczsKKwkgICAgKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sqKSBSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzOwogCiAJLyogRmlsbCBpbiB0aGUgZGVzY3JpcHRvciBibG9jayAqLwogCWZvciAoaSA9IDA7IGkgPCBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSzsgaSsrKSB7CkBAIC0zNDg0LDkgKzM0ODQsOSBAQAogICogUmV0dXJuCiAgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19zdG9ja19yY3ZfYnVmZmVycyhwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgUmN2RGVzY3JpcHRvckJsb2NrSGRyOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSICpSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CiAKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJTdG9ja0J1ZiIsCiAJCSAgYWRhcHRlciwgYWRhcHRlci0+UmN2QnVmZmVyc09uQ2FyZCwKQEAgLTM1MDYsMTQgKzM1MDYsMTQgQEAKIAkvKiBOb3cgZ3JhYiB0aGUgUmN2UUxvY2sgbG9jayBhbmQgcHJvY2VlZCAqLwogCXNwaW5fbG9jaygmYWRhcHRlci0+UmN2UUxvY2spOwogCXdoaWxlIChhZGFwdGVyLT5SY3ZCdWZmZXJzT25DYXJkIDwgU1hHX1JDVl9EQVRBX0JVRkZFUlMpIHsKLQkJUExJU1RfRU5UUlkgX3BsZTsKKwkJc3RydWN0IExJU1RfRU5UUlkgKl9wbGU7CiAKIAkJLyogR2V0IGEgZGVzY3JpcHRvciBibG9jayAqLwogCQlSY3ZEZXNjcmlwdG9yQmxvY2tIZHIgPSBOVUxMOwogCQlpZiAoYWRhcHRlci0+RnJlZVJjdkJsb2NrQ291bnQpIHsKIAkJCV9wbGUgPSBSZW1vdmVIZWFkTGlzdCgmYWRhcHRlci0+RnJlZVJjdkJsb2Nrcyk7CiAJCQlSY3ZEZXNjcmlwdG9yQmxvY2tIZHIgPQotCQkJICAgIGNvbnRhaW5lcl9vZihfcGxlLCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSLAorCQkJICAgIGNvbnRhaW5lcl9vZihfcGxlLCBzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiwKIAkJCQkJIEZyZWVMaXN0KTsKIAkJCWFkYXB0ZXItPkZyZWVSY3ZCbG9ja0NvdW50LS07CiAJCQlSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlN0YXRlID0gU1hHX0JVRkZFUl9CVVNZOwpAQCAtMzU1MCwxMyArMzU1MCwxMyBAQAogICogUmV0dXJuCiAgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9kZXNjcmlwdG9yX2Jsb2NrcyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkJCSAgIHVuc2lnbmVkIGNoYXIgSW5kZXgpCiB7Ci0JUFNYR19SQ1ZfUklORyBSaW5nWmVybyA9ICZhZGFwdGVyLT5SY3ZSaW5nc1swXTsKLQlQU1hHX1JJTkdfSU5GTyBSY3ZSaW5nSW5mbyA9ICZhZGFwdGVyLT5SY3ZSaW5nWmVyb0luZm87Ci0JUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgUmN2RGVzY3JpcHRvckJsb2NrSGRyOwotCVBTWEdfQ01EIFJpbmdEZXNjcmlwdG9yQ21kOworCXN0cnVjdCBTWEdfUkNWX1JJTkcgKlJpbmdaZXJvID0gJmFkYXB0ZXItPlJjdlJpbmdzWzBdOworCXN0cnVjdCBTWEdfUklOR19JTkZPICpSY3ZSaW5nSW5mbyA9ICZhZGFwdGVyLT5SY3ZSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgKlJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKKwlzdHJ1Y3QgU1hHX0NNRCAqUmluZ0Rlc2NyaXB0b3JDbWQ7CiAKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfTk9JU1ksICJDbXBSQmxrcyIsCiAJCSAgYWRhcHRlciwgSW5kZXgsIFJjdlJpbmdJbmZvLT5IZWFkLCBSY3ZSaW5nSW5mby0+VGFpbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuaAppbmRleCA4NDRjYTU2Li42NTNjZjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNkZWZpbmUgcF9uZXRfZGV2aWNlIHN0cnVjdCBuZXRfZGV2aWNlICoKIC8vIFNYR19TVEFUUyAtIFByb2JhYmx5IG1vdmUgdGhlc2UgdG8gc29tZXBsYWNlIHdoZXJlCiAvLyB0aGUgc2xpY3N0YXQgKHN4Z3N0YXQ/KSBwcm9ncmFtIGNhbiBnZXQgdGhlbS4KLXR5cGVkZWYgc3RydWN0IF9TWEdfU1RBVFMgeworc3RydWN0IFNYR19TVEFUUyB7CiAJLy8gWG10CiAJdTMyCQkJCVhtdE5CTDsJCQkJLy8gT2ZmbG9hZCBzZW5kIE5CTCBjb3VudAogCXU2NAkJCQlEdW1iWG10Qnl0ZXM7CQkvLyBEdW1ibmljIHNlbmQgYnl0ZXMKQEAgLTEwOSw3ICsxMDksNyBAQAogCXU2NAkJCQlMaW5rQ3JjOwkJCS8vIFNYR19SQ1ZfU1RBVFVTX0xJTktfQ1JDOgogCXU2NAkJCQlMaW5rT2Zsb3c7CQkJLy8gU1hHX1JDVl9TVEFUVVNfTElOS19PRkxPVzoKIAl1NjQJCQkJTGlua1VmbG93OwkJCS8vIFNYR19SQ1ZfU1RBVFVTX0xJTktfVUZMT1c6Ci19IFNYR19TVEFUUywgKlBTWEdfU1RBVFM7Cit9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTUsMTIgKzIxNSwxMiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTk9URSAtIExvY2sgbXVzdCBiZSBoZWxkIHdpdGggUkNWIG1hY3JvcwogI2RlZmluZSBTWEdfR0VUX1JDVl9EQVRBX0JVRkZFUihfcEFkYXB0LCBfSGRyKSB7CQkJCQkJCQlcCi0JUExJU1RfRU5UUlkgICAgIAkJCQlfcGxlOwkJCQkJCQkJCQlcCisJc3RydWN0IExJU1RfRU5UUlkgICAgIAkJCQkqX3BsZTsJCQkJCQkJCQkJXAogCV9IZHIgPSBOVUxMOwkJCQkJCQkJCQkJCQkJCQlcCiAJaWYoKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVyQ291bnQpIHsJCQkJCQkJCQkJCVwKIAkJQVNTRVJUKCEoSXNMaXN0RW1wdHkoJihfcEFkYXB0KS0+RnJlZVJjdkJ1ZmZlcnMpKSk7CQkJCQkJXAogCQlfcGxlID0gUmVtb3ZlSGVhZExpc3QoJihfcEFkYXB0KS0+RnJlZVJjdkJ1ZmZlcnMpOwkgICAgCQkJCVwKLQkJKF9IZHIpID0gY29udGFpbmVyX29mKF9wbGUsIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSLCBGcmVlTGlzdCk7CSAgICAgICAgXAorCQkoX0hkcikgPSBjb250YWluZXJfb2YoX3BsZSwgc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSLCBGcmVlTGlzdCk7CSAgICAgICAgXAogCQkoX3BBZGFwdCktPkZyZWVSY3ZCdWZmZXJDb3VudC0tOwkJCQkJCQkJCQlcCiAJCUFTU0VSVCgoX0hkciktPlN0YXRlID09IFNYR19CVUZGRVJfRlJFRSk7CQkJCQkJCQlcCiAJfQkJCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC0yNjMsMTIgKzI2MywxMiBAQAogLy8gdW50aWwgYWZ0ZXIgdGhhdC4gIFdlJ3JlIGRlYWxpbmcgd2l0aCByb3VuZCBudW1iZXJzIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgdG8sCiAvLyBhbmQgbm90IGdyYWJiaW5nIGl0IGF2b2lkcyBhIHBvc3NpYmxlIGRvdWJsZS10cmlwLgogI2RlZmluZSBTWEdfR0VUX1NHTF9CVUZGRVIoX3BBZGFwdCwgX1NnbCkgewkJCQlcCi0JUExJU1RfRU5UUlkgX3BsZTsJCQkJCQlcCisJc3RydWN0IExJU1RfRU5UUlkgKl9wbGU7CQkJCQkJXAogCWlmICgoX3BBZGFwdC0+RnJlZVNnbEJ1ZmZlckNvdW50IDwgU1hHX01JTl9TR0xfQlVGRkVSUykgJiYJXAogCSAgIChfcEFkYXB0LT5BbGxTZ2xCdWZmZXJDb3VudCA8IFNYR19NQVhfU0dMX0JVRkZFUlMpICYmCVwKIAkgICAoX3BBZGFwdC0+QWxsb2NhdGlvbnNQZW5kaW5nID09IDApKSB7CQkJXAogCQlzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShfcEFkYXB0LAkJCVwKLQkJCShzaXplb2YoU1hHX1NDQVRURVJfR0FUSEVSKSArIFNYR19TR0xfQlVGX1NJWkUpLFwKKwkJCShzaXplb2Yoc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUikgKyBTWEdfU0dMX0JVRl9TSVpFKSxcCiAJCQlTWEdfQlVGRkVSX1RZUEVfU0dMKTsJCQkJXAogCX0JCQkJCQkJCVwKIAlfU2dsID0gTlVMTDsJCQkJCQkJXApAQCAtMjc2LDcgKzI3Niw3IEBACiAJaWYoKF9wQWRhcHQpLT5GcmVlU2dsQnVmZmVyQ291bnQpIHsJCQkJXAogCQlBU1NFUlQoIShJc0xpc3RFbXB0eSgmKF9wQWRhcHQpLT5GcmVlU2dsQnVmZmVycykpKTsJXAogCQlfcGxlID0gUmVtb3ZlSGVhZExpc3QoJihfcEFkYXB0KS0+RnJlZVNnbEJ1ZmZlcnMpOwlcCi0JCShfU2dsKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBTWEdfU0NBVFRFUl9HQVRIRVIsIEZyZWVMaXN0KTsgXAorCQkoX1NnbCkgPSBjb250YWluZXJfb2YoX3BsZSwgc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiwgRnJlZUxpc3QpOyBcCiAgICAgICAgICAgICAoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJDb3VudC0tOwkJCQlcCiAJCUFTU0VSVCgoX1NnbCktPlN0YXRlID09IFNYR19CVUZGRVJfRlJFRSk7CQlcCiAJCShfU2dsKS0+U3RhdGUgPSBTWEdfQlVGRkVSX0JVU1k7CQkJXApAQCAtMjg5LDE3ICsyODksMTcgQEAKIC8vIFNYR19NVUxUSUNBU1RfQUREUkVTUwogLy8KIC8vIExpbmtlZCBsaXN0IG9mIG11bHRpY2FzdCBhZGRyZXNzZXMuCi10eXBlZGVmIHN0cnVjdCBfU1hHX01VTFRJQ0FTVF9BRERSRVNTIHsKK3N0cnVjdCBTWEdfTVVMVElDQVNUX0FERFJFU1MgewogCXVuc2lnbmVkIGNoYXIJCQkJCQkJQWRkcmVzc1s2XTsKLQlzdHJ1Y3QgX1NYR19NVUxUSUNBU1RfQUREUkVTUwkqTmV4dDsKLX0gU1hHX01VTFRJQ0FTVF9BRERSRVNTLCAqUFNYR19NVUxUSUNBU1RfQUREUkVTUzsKKwlzdHJ1Y3QgU1hHX01VTFRJQ0FTVF9BRERSRVNTCSpOZXh0OworfTsKIAogLy8gU3RydWN0dXJlIHRvIG1haW50YWluIGNoaW1uZXkgc2VuZCBhbmQgcmVjZWl2ZSBidWZmZXIgcXVldWVzLgogLy8gVGhpcyBzdHJ1Y3R1cmUgbWFpbnRhaW5zIE5FVF9CVUZGRVJfTElTVCBxdWV1ZXMgdGhhdCBhcmUKIC8vIGdpdmVuIHRvIHVzIHZpYSB0aGUgQ2hpbW5leSBNaW5pcG9ydFRjcE9mZmxvYWRTZW5kIGFuZAogLy8gTWluaXBvcnRUY3BPZmZsb2FkUmVjZWl2ZSByb3V0aW5lcy4gIFRoaXMgc3RydWN0dXJlIERPRVMgTk9UCiAvLyBtYW5hZ2Ugb3VyIGRhdGEgYnVmZmVyIHF1ZXVlCi10eXBlZGVmIHN0cnVjdCBfU1hHX0JVRkZFUl9RVUVVRSB7CitzdHJ1Y3QgU1hHX0JVRkZFUl9RVUVVRSB7CiAJdTMyCQkJCQkJVHlwZTsJCQkvLyBTbG93IG9yIGZhc3QgLSBTZWUgYmVsb3cKIAl1MzIJCQkJCQlEaXJlY3Rpb247CQkvLyBYbXQgb3IgUmN2CiAJdTMyCQkJCQkJQnl0ZXM7CQkJLy8gQnl0ZSBjb3VudApAQCAtMzA3LDcgKzMwNyw3IEBACiAJdTMyICogICAgICAgIAkJCVRhaWw7CQkJLy8gU2VuZCBxdWV1ZSB0YWlsCiAvLwlQTkVUX0JVRkZFUl9MSVNUCQkJTmV4dE5CTDsJCS8vIFNob3J0IGN1dCAtIG5leHQgTkJMCiAvLwlQTkVUX0JVRkZFUgkJCQkJTmV4dE5COwkJCS8vIFNob3J0IGN1dCAtIG5leHQgTkIKLX0gU1hHX0JVRkZFUl9RVUVVRSwgKlBTWEdfQlVGRkVSX1FVRVVFOworfTsKIAogI2RlZmluZQkJU1hHX1NMT1dfU0VORF9CVUZGRVIJMAogI2RlZmluZQkJU1hHX0ZBU1RfU0VORF9CVUZGRVIJMQpAQCAtMzM1LDcgKzMzNSw3IEBACiAKIC8vIEFkYXB0ZXIgc3RhdGVzIC0gVGhlc2Ugc3RhdGVzIGNsb3NlbHkgbWF0Y2ggdGhlIGFkYXB0ZXIgc3RhdGVzCiAvLyBkb2N1bWVudGVkIGluIHRoZSBEREsgKHdpdGggYSBmZXcgZXhjZXB0aW9ucykuCi10eXBlZGVmIGVudW0gX1NYR19TVEFURSB7CitlbnVtIFNYR19TVEFURSB7CiAJU1hHX1NUQVRFX0lOSVRJQUxJWklORywJCQkvLyBJbml0aWFsaXppbmcKIAlTWEdfU1RBVEVfQk9PVERJQUcsCQkJCS8vIEJvb3QtRGlhZ25vc3RpYyBtb2RlCiAJU1hHX1NUQVRFX1BBVVNJTkcsCQkJCS8vIFBhdXNpbmcKQEAgLTM0NywyNCArMzQ3LDI0IEBACiAJU1hHX1NUQVRFX0hBTFRJTkcsCQkJCS8vIEhhbHRpbmcKIAlTWEdfU1RBVEVfSEFMVEVELAkJCQkvLyBEb3duIG9yIG5vdC1pbml0aWFsaXplZAogCVNYR19TVEFURV9TSFVURE9XTgkJCQkvLyBzaHV0ZG93bgotfSBTWEdfU1RBVEUsICpQU1hHX1NUQVRFOworfTsKIAogLy8gTGluayBzdGF0ZQotdHlwZWRlZiBlbnVtIF9TWEdfTElOS19TVEFURSB7CitlbnVtIFNYR19MSU5LX1NUQVRFIHsKIAlTWEdfTElOS19ET1dOLAogCVNYR19MSU5LX1VQCi19IFNYR19MSU5LX1NUQVRFLCAqUFNYR19MSU5LX1NUQVRFOworfTsKIAogLy8gTGluayBpbml0aWFsaXphdGlvbiB0aW1lb3V0IGluIDEwMHVzIHVuaXRzCiAjZGVmaW5lIFNYR19MSU5LX1RJTUVPVVQJMTAwMDAwCQkvLyAxMCBTZWNvbmRzIC0gUkVEVUNFIQogCiAKIC8vIE1pY3JvY29kZSBmaWxlIHNlbGVjdGlvbiBjb2RlcwotdHlwZWRlZiBlbnVtIF9TWEdfVUNPREVfU0VMIHsKK2VudW0gU1hHX1VDT0RFX1NFTCB7CiAJU1hHX1VDT0RFX1NBSEFSQSwJCQkJLy8gU2FoYXJhIHVjb2RlCiAJU1hHX1VDT0RFX1NESUFHQ1BVLAkJCQkvLyBTYWhhcmEgQ1BVIGRpYWdub3N0aWMgdWNvZGUKIAlTWEdfVUNPREVfU0RJQUdTWVMJCQkJLy8gU2FoYXJhIHN5c3RlbSBkaWFnbm9zdGljIHVjb2RlCi19IFNYR19VQ09ERV9TRUw7Cit9OwogCiAKICNkZWZpbmUgU1hHX0RJU0FCTEVfQUxMX0lOVEVSUlVQVFMoX3BhZGFwdCkgc3hnX2Rpc2FibGVfaW50ZXJydXB0KF9wYWRhcHQpCkBAIC0zODQsMTAgKzM4NCwxMCBAQAogLy8KIC8vIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeGcgZHJpdmVyLiAgVGhlcmUgaXMgb25seQogLy8gb25lIG9mIHRoZXNlLCBhbmQgaXQgaXMgZGVmaW5lZCBhcyBhIGdsb2JhbC4KLXR5cGVkZWYgc3RydWN0IF9TWEdfRFJJVkVSIHsKLQlzdHJ1Y3QgX2FkYXB0ZXJfdAkqQWRhcHRlcnM7CQkvLyBMaW5rZWQgbGlzdCBvZiBhZGFwdGVycworc3RydWN0IFNYR19EUklWRVIgeworCXN0cnVjdCBhZGFwdGVyX3QJKkFkYXB0ZXJzOwkJLy8gTGlua2VkIGxpc3Qgb2YgYWRhcHRlcnMKIAl1c2hvcnQJCQkJQWRhcHRlcklEOwkJLy8gTWFpbnRhaW4gdW5pcXVlIGFkYXB0ZXIgSUQKLX0gU1hHX0RSSVZFUiwgKlBTWEdfRFJJVkVSOworfTsKIAogI2lmZGVmIFNUQVRVU19TVUNDRVNTCiAjdW5kZWYgU1RBVFVTX1NVQ0NFU1MKQEAgLTQxNiwxMSArNDE2LDEwIEBACiAjZGVmaW5lIE1JTihhLCBiKSAoKHUzMikoYSkgPCAodTMyKShiKSA/IChhKSA6IChiKSkKICNkZWZpbmUgTUFYKGEsIGIpICgodTMyKShhKSA+ICh1MzIpKGIpID8gKGEpIDogKGIpKQogCi10eXBlZGVmIHN0cnVjdCBfbWNhc3RfYWRkcmVzc190Ci17CitzdHJ1Y3QgbWNhc3RfYWRkcmVzc190IHsKICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1s2XTsKLSAgICBzdHJ1Y3QgX21jYXN0X2FkZHJlc3NfdCAgICpuZXh0OwotfSAgbWNhc3RfYWRkcmVzc190LCAqcF9tY2FzdF9hZGRyZXNzX3Q7CisgICAgc3RydWN0IG1jYXN0X2FkZHJlc3NfdCAgICpuZXh0OworfTsKIAogI2RlZmluZSBDQVJEX0RPV04gICAgICAgIDB4MDAwMDAwMDAKICNkZWZpbmUgQ0FSRF9VUCAgICAgICAgICAweDAwMDAwMDAxCkBAIC00NzIsNDEgKzQ3MSwzNyBAQAogI2RlZmluZSBTTElDX0NBUkRfU1RBVEUoeCkgICAgKCh4PT1DQVJEX1VQKSA/ICJVUCIgOiAiRG93biIpCiAKIAotdHlwZWRlZiBzdHJ1Y3QgX2V0aGVyX2hlYWRlcgoteworc3RydWN0IGV0aGVyX2hlYWRlciB7CiAgICAgdW5zaWduZWQgY2hhciAgICBldGhlcl9kaG9zdFs2XTsKICAgICB1bnNpZ25lZCBjaGFyICAgIGV0aGVyX3Nob3N0WzZdOwogICAgIHVzaG9ydCAgIGV0aGVyX3R5cGU7Ci19IGV0aGVyX2hlYWRlciwgKnBfZXRoZXJfaGVhZGVyOworfTsKIAogCiAjZGVmaW5lIE5VTV9DRkdfU1BBQ0VTICAgICAgMgogI2RlZmluZSBOVU1fQ0ZHX1JFR1MgICAgICAgIDY0CiAKLXR5cGVkZWYgc3RydWN0IF9waHlzY2FyZF90Ci17Ci0gICAgc3RydWN0IF9hZGFwdGVyX3QgICphZGFwdGVyW1NMSUNfTUFYX1BPUlRTXTsKLSAgICBzdHJ1Y3QgX3BoeXNjYXJkX3QgKm5leHQ7CitzdHJ1Y3QgcGh5c2NhcmRfdCB7CisgICAgc3RydWN0IGFkYXB0ZXJfdCAgKmFkYXB0ZXJbU0xJQ19NQVhfUE9SVFNdOworICAgIHN0cnVjdCBwaHlzY2FyZF90ICpuZXh0OwogICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBhZGFwdGVyc19hbGxvY2Q7Ci19IHBoeXNjYXJkX3QsICpwX3BoeXNjYXJkX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfc3hnYmFzZV9kcml2ZXIKLXsKK3N0cnVjdCBzeGdiYXNlX2RyaXZlcl90IHsKIAlzcGlubG9ja190CWRyaXZlcl9sb2NrOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CS8qIGlycXNhdmUgZm9yIHNwaW5sb2NrICovCiAJdTMyCQludW1fc3hnX2NhcmRzOwogCXUzMgkJbnVtX3N4Z19wb3J0czsKIAl1MzIJCW51bV9zeGdfcG9ydHNfYWN0aXZlOwogCXUzMgkJZHluYW1pY19pbnRhZ2c7Ci0JcF9waHlzY2FyZF90CXBoeXNfY2FyZDsKLX0gc3hnYmFzZV9kcml2ZXJfdDsKKwlzdHJ1Y3QgcGh5c2NhcmRfdAkqcGh5c19jYXJkOworfTsKIAogCi10eXBlZGVmIHN0cnVjdCBfYWRhcHRlcl90Ci17CitzdHJ1Y3QgYWRhcHRlcl90IHsKIAl2b2lkICogICAgICAgICAgICAgICBpZnA7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIHBvcnQ7Ci0JcF9waHlzY2FyZF90ICAgICAgICBwaHlzY2FyZDsKKwlzdHJ1Y3QgcGh5c2NhcmRfdCAgICAgICAgKnBoeXNjYXJkOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBwaHlzcG9ydDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY2FyZGluZGV4OwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBjYXJkX3NpemU7CkBAIC01NDQsNyArNTM5LDcgQEAKIAl1MzIgICAgICAgICAgICAgbWFjb3B0czsKIAl1c2hvcnQgICAgICAgICAgICAgIGRldmZsYWdzX3ByZXY7CiAJdTY0ICAgICAgICAgICAgIG1jYXN0bWFzazsKLQlwX21jYXN0X2FkZHJlc3NfdCAgIG1jYXN0YWRkcnM7CisJc3RydWN0IG1jYXN0X2FkZHJlc3NfdCAgICptY2FzdGFkZHJzOwogCXN0cnVjdCB0aW1lcl9saXN0ICAgcGluZ3RpbWVyOwogCXUzMiAgICAgICAgICAgICBwaW5ndGltZXJzZXQ7CiAJc3RydWN0IHRpbWVyX2xpc3QgICBzdGF0c3RpbWVyOwpAQCAtNTgwLDExICs1NzUsMTEgQEAKIAl1MzIgICAgICAgICAgICAgaW50YWdnX3BlcmlvZDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAl1MzIgKgkJCQkJTWluaXBvcnRIYW5kbGU7CQkvLyBPdXIgbWluaXBvcnQgaGFuZGxlCi0JU1hHX1NUQVRFCQkJCQlTdGF0ZTsJCQkJLy8gQWRhcHRlciBzdGF0ZQotCVNYR19MSU5LX1NUQVRFCQkJCUxpbmtTdGF0ZTsJCQkvLyBMaW5rIHN0YXRlCisJZW51bSBTWEdfU1RBVEUJCQkJCVN0YXRlOwkJCQkvLyBBZGFwdGVyIHN0YXRlCisJZW51bSBTWEdfTElOS19TVEFURQkJCQlMaW5rU3RhdGU7CQkJLy8gTGluayBzdGF0ZQogCXU2NAkJCQkJCUxpbmtTcGVlZDsJCQkvLyBMaW5rIFNwZWVkCiAJdTMyCQkJCQkJUG93ZXJTdGF0ZTsJCQkvLyBORElTIHBvd2VyIHN0YXRlCi0Jc3RydWN0IF9hZGFwdGVyX3QgICAJCSpOZXh0OwkJCQkvLyBMaW5rZWQgbGlzdAorCXN0cnVjdCBhZGFwdGVyX3QgICAJCSpOZXh0OwkJCQkvLyBMaW5rZWQgbGlzdAogCXVzaG9ydAkJCQkJCUFkYXB0ZXJJRDsJCQkvLyAxLi5uCiAJdW5zaWduZWQgY2hhcgkJCQkJCU1hY0FkZHJbNl07CQkJLy8gT3VyIHBlcm1hbmVudCBIVyBtYWMgYWRkcmVzcwogCXVuc2lnbmVkIGNoYXIJCQkJCQlDdXJyTWFjQWRkcls2XTsJCS8vIE91ciBDdXJyZW50IG1hYyBhZGRyZXNzCkBAIC01OTIsMTYgKzU4NywxNiBAQAogCXBfbmV0X2RldmljZSAgICAgICAgICAgICAgICBuZXh0X25ldGRldmljZTsKIAlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICogcGNpZGV2OwogCi0JUFNYR19NVUxUSUNBU1RfQUREUkVTUwkJTXVsdGljYXN0QWRkcnM7CQkvLyBNdWx0aWNhc3QgbGlzdAorCXN0cnVjdCBTWEdfTVVMVElDQVNUX0FERFJFU1MJCSpNdWx0aWNhc3RBZGRyczsJCS8vIE11bHRpY2FzdCBsaXN0CiAJdTY0ICAgICAJCQkJTXVsdGljYXN0TWFzazsJCS8vIE11bHRpY2FzdCBtYXNrCiAJdTMyICoJCQkJCUludGVycnVwdEhhbmRsZTsJLy8gUmVnaXN0ZXIgSW50ZXJydXB0IGhhbmRsZQogCXUzMgkJCQkJCUludGVycnVwdExldmVsOwkJLy8gRnJvbSBSZXNvdXJjZSBsaXN0CiAJdTMyCQkJCQkJSW50ZXJydXB0VmVjdG9yOwkvLyBGcm9tIFJlc291cmNlIGxpc3QKIAlzcGlubG9ja190CUFkYXB0ZXJMb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIGFkYXB0ZXIgcm91dGluZXMgKi8KIAlzcGlubG9ja190CUJpdDY0UmVnTG9jazsJLyogRm9yIHdyaXRpbmcgNjQtYml0IGFkZHJlc3NlcyAqLwotCVBTWEdfSFdfUkVHUwkJCQlId1JlZ3M7CQkJCS8vIFNhaGFyYSBIVyBSZWdpc3RlciBNZW1vcnkgKEJBUjAvMSkKLQlQU1hHX1VDT0RFX1JFR1MJCQkJVWNvZGVSZWdzOwkJCS8vIE1pY3JvY29kZSBSZWdpc3RlciBNZW1vcnkgKEJBUjIvMykKLQlQU1hHX1RDQl9SRUdTCQkJCVRjYlJlZ3M7CQkJLy8gU2FtZSBhcyBVY29kZSByZWdzIC0gU2VlIHN4Z2h3LmgKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MJCQkqSHdSZWdzOwkJCQkvLyBTYWhhcmEgSFcgUmVnaXN0ZXIgTWVtb3J5IChCQVIwLzEpCisJc3RydWN0IFNYR19VQ09ERV9SRUdTCQkJKlVjb2RlUmVnczsJCQkvLyBNaWNyb2NvZGUgUmVnaXN0ZXIgTWVtb3J5IChCQVIyLzMpCisJc3RydWN0IFNYR19UQ0JfUkVHUwkJCSpUY2JSZWdzOwkJCS8vIFNhbWUgYXMgVWNvZGUgcmVncyAtIFNlZSBzeGdody5oCiAJdXNob3J0CQkJCQkJUmVzZXREcGNDb3VudDsJCS8vIEZvciB0aW1lb3V0CiAJdXNob3J0CQkJCQkJUnNzRHBjQ291bnQ7CQkvLyBGb3IgdGltZW91dAogCXVzaG9ydAkJCQkJCVZlbmRvcklEOwkJCS8vIFZlbmRvciBJRApAQCAtNjEzLDI1ICs2MDgsMjUgQEAKIAl1MzIgKgkJCQkJQnVmZmVyUG9vbEhhbmRsZTsJLy8gVXNlZCB3aXRoIE5ESVMgNS4yIG9ubHkuICBEb24ndCBpZmRlZiBvdXQKIAl1MzIJCQkJCQlNYWNGaWx0ZXI7CQkJLy8gTkRJUyBNQUMgRmlsdGVyCiAJdXNob3J0CQkJCQkJSXBJZDsJCQkJLy8gRm9yIHNsb3dwYXRoCi0JUFNYR19FVkVOVF9SSU5HCQkJCUV2ZW50UmluZ3M7CQkJLy8gSG9zdCBldmVudCByaW5ncy4gIDEvQ1BVIHRvIDE2IG1heAorCXN0cnVjdCBTWEdfRVZFTlRfUklORwkJCSpFdmVudFJpbmdzOwkJCS8vIEhvc3QgZXZlbnQgcmluZ3MuICAxL0NQVSB0byAxNiBtYXgKIAlkbWFfYWRkcl90ICAgICAgICAgICAgICAJUEV2ZW50UmluZ3M7CQkvLyBQaHlzaWNhbCBhZGRyZXNzCiAJdTMyCQkJCQkJTmV4dEV2ZW50W1NYR19NQVhfUlNTXTsJLy8gQ3VycmVudCBsb2NhdGlvbiBpbiByaW5nCiAJZG1hX2FkZHJfdCAgICAgICAgICAJCVBUY2JCdWZmZXJzOwkJLy8gVENCIEJ1ZmZlcnMgLSBwaHlzaWNhbCBhZGRyZXNzCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUFRjYkNvbXBCdWZmZXJzOwkvLyBUQ0IgQ29tcG9zaXRlIEJ1ZmZlcnMgLSBwaHlzIGFkZHIKLQlQU1hHX1hNVF9SSU5HCQkJCVhtdFJpbmdzOwkJCS8vIFRyYW5zbWl0IHJpbmdzCisJc3RydWN0IFNYR19YTVRfUklORwkJCQkqWG10UmluZ3M7CQkJLy8gVHJhbnNtaXQgcmluZ3MKIAlkbWFfYWRkcl90CQkgICAgICAgICAgICBQWG10UmluZ3M7CQkJLy8gVHJhbnNtaXQgcmluZ3MgLSBwaHlzaWNhbCBhZGRyZXNzCi0JU1hHX1JJTkdfSU5GTwkJCQlYbXRSaW5nWmVyb0luZm87CS8vIFRyYW5zbWl0IHJpbmcgMCBpbmZvCisJc3RydWN0IFNYR19SSU5HX0lORk8JCQkJWG10UmluZ1plcm9JbmZvOwkvLyBUcmFuc21pdCByaW5nIDAgaW5mbwogCXNwaW5sb2NrX3QJWG10WmVyb0xvY2s7CS8qIFRyYW5zbWl0IHJpbmcgMCBsb2NrICovCiAJdTMyICoJCQkJCVhtdFJpbmdaZXJvSW5kZXg7CS8vIFNoYXJlZCBYTVQgcmluZyAwIGluZGV4CiAJZG1hX2FkZHJfdCAgICAgICAgICAJCVBYbXRSaW5nWmVyb0luZGV4OwkvLyBTaGFyZWQgWE1UIHJpbmcgMCBpbmRleCAtIHBoeXNpY2FsCi0JTElTVF9FTlRSWQkJCQkJRnJlZVByb3RvY29sSGVhZGVyczsvLyBGcmVlIHByb3RvY29sIGhlYWRlcnMKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVByb3RvY29sSGVhZGVyczsvLyBGcmVlIHByb3RvY29sIGhlYWRlcnMKIAl1MzIJCQkJCQlGcmVlUHJvdG9IZHJDb3VudDsJLy8gQ291bnQKIAl2b2lkICoJCQkJCQlQcm90b2NvbEhlYWRlcnM7CS8vIEJsb2NrIG9mIHByb3RvY29sIGhlYWRlcgogCWRtYV9hZGRyX3QJICAgICAgICAgICAgCVBQcm90b2NvbEhlYWRlcnM7CS8vIEJsb2NrIG9mIHByb3RvY29sIGhlYWRlcnMgLSBwaHlzCiAKLQlQU1hHX1JDVl9SSU5HCQkJCVJjdlJpbmdzOwkJCS8vIFJlY2VpdmUgcmluZ3MKKwlzdHJ1Y3QgU1hHX1JDVl9SSU5HCQkqUmN2UmluZ3M7CQkJLy8gUmVjZWl2ZSByaW5ncwogCWRtYV9hZGRyX3QJICAgICAgICAgICAgCVBSY3ZSaW5nczsJCQkvLyBSZWNlaXZlIHJpbmdzIC0gcGh5c2ljYWwgYWRkcmVzcwotCVNYR19SSU5HX0lORk8JCQkJUmN2UmluZ1plcm9JbmZvOwkvLyBSZWNlaXZlIHJpbmcgMCBpbmZvCisJc3RydWN0IFNYR19SSU5HX0lORk8JCQkJUmN2UmluZ1plcm9JbmZvOwkvLyBSZWNlaXZlIHJpbmcgMCBpbmZvCiAKIAl1MzIgKgkJCQkJSXNyOwkJCQkvLyBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCiAJZG1hX2FkZHJfdAkgICAgICAgICAgICAJUElzcjsJCQkJLy8gSVNSIC0gcGh5c2ljYWwgYWRkcmVzcwpAQCAtNjQ1LDkgKzY0MCw5IEBACiAJdTMyCQkJCQkJSGFzaEluZm9ybWF0aW9uOwogCS8vIFJlY2VpdmUgYnVmZmVyIHF1ZXVlcwogCXNwaW5sb2NrX3QJUmN2UUxvY2s7CS8qIFJlY2VpdmUgUXVldWUgTG9jayAqLwotCUxJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCdWZmZXJzOwkJLy8gRnJlZSBTWEdfREFUQV9CVUZGRVIgcXVldWUKLQlMSVNUX0VOVFJZCQkJCQlGcmVlUmN2QmxvY2tzOwkJLy8gRnJlZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgUQotCUxJU1RfRU5UUlkJCQkJCUFsbFJjdkJsb2NrczsJCS8vIEFsbCBTWEdfUkNWX0JMT0NLcworCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlGcmVlUmN2QnVmZmVyczsJCS8vIEZyZWUgU1hHX0RBVEFfQlVGRkVSIHF1ZXVlCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUZyZWVSY3ZCbG9ja3M7CQkvLyBGcmVlIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyBRCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUFsbFJjdkJsb2NrczsJCS8vIEFsbCBTWEdfUkNWX0JMT0NLcwogCXVzaG9ydAkJCQkJCUZyZWVSY3ZCdWZmZXJDb3VudDsJLy8gTnVtYmVyIG9mIGZyZWUgcmN2IGRhdGEgYnVmZmVycwogCXVzaG9ydAkJCQkJCUZyZWVSY3ZCbG9ja0NvdW50OwkvLyAjIG9mIGZyZWUgcmN2IGRlc2NyaXB0b3IgYmxvY2tzCiAJdXNob3J0CQkJCQkJQWxsUmN2QmxvY2tDb3VudDsJLy8gTnVtYmVyIG9mIHRvdGFsIHJlY2VpdmUgYmxvY2tzCkBAIC02NTYsOCArNjUxLDggQEAKIAl1MzIJCQkJCQlSY3ZCdWZmZXJzT25DYXJkOwkvLyBTWEdfREFUQV9CVUZGRVJTIG93bmVkIGJ5IGNhcmQKIAkvLyBTR0wgYnVmZmVycwogCXNwaW5sb2NrX3QJU2dsUUxvY2s7CS8qIFNHTCBRdWV1ZSBMb2NrICovCi0JTElTVF9FTlRSWQkJCQkJRnJlZVNnbEJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19TQ0FUVEVSX0dBVEhFUgotCUxJU1RfRU5UUlkJCQkJCUFsbFNnbEJ1ZmZlcnM7CQkvLyBBbGwgU1hHX1NDQVRURVJfR0FUSEVSCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUZyZWVTZ2xCdWZmZXJzOwkJLy8gRnJlZSBTWEdfU0NBVFRFUl9HQVRIRVIKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJQWxsU2dsQnVmZmVyczsJCS8vIEFsbCBTWEdfU0NBVFRFUl9HQVRIRVIKIAl1c2hvcnQJCQkJCQlGcmVlU2dsQnVmZmVyQ291bnQ7CS8vIE51bWJlciBvZiBmcmVlIFNHTCBidWZmZXJzCiAJdXNob3J0CQkJCQkJQWxsU2dsQnVmZmVyQ291bnQ7CS8vIE51bWJlciBvZiB0b3RhbCBTR0wgYnVmZmVycwogCXUzMgkJCQkJCUN1cnJlbnRUaW1lOwkJLy8gVGljayBjb3VudApAQCAtNjc5LDcgKzY3NCw3IEBACiAJLy8gU3RhdHMKIAl1MzIJCQkJCQlQZW5kaW5nUmN2Q291bnQ7CS8vIE91dHN0YW5kaW5nIHJjdiBpbmRpY2F0aW9ucwogCXUzMgkJCQkJCVBlbmRpbmdYbXRDb3VudDsJLy8gT3V0c3RhbmRpbmcgc2VuZCByZXF1ZXN0cwotCVNYR19TVEFUUwkJCQkJU3RhdHM7CQkJCS8vIFN0YXRpc3RpY3MKKwlzdHJ1Y3QgU1hHX1NUQVRTCQkJCVN0YXRzOwkJCQkvLyBTdGF0aXN0aWNzCiAJdTMyCQkJCQkJUmVhc3NCdWZzOwkJCS8vIE51bWJlciBvZiByZWFzc2VtYmx5IGJ1ZmZlcnMKIAkvLyBDYXJkIENyYXNoIEluZm8KIAl1c2hvcnQJCQkJCQlDcmFzaExvY2F0aW9uOwkJLy8gTWljcm9jb2RlIGNyYXNoIGxvY2F0aW9uCkBAIC03MDgsNyArNzAzLDcgQEAKIAkvLwlkbWFfYWRkcl90CQlQRHVtcEJ1ZmZlcjsJCS8vIFBoeXNpY2FsIGFkZHJlc3MKIAkvLyNlbmRpZiAvLyBTWEdfRkFJTFVSRV9EVU1QCiAKLX0gYWRhcHRlcl90LCAqcF9hZGFwdGVyX3Q7Cit9OwogCiAjaWYgU0xJQ19EVU1QX0VOQUJMRUQKICNkZWZpbmUgU0xJQ19EVU1QX1JFUVVFU1RFRCAgICAgIDEKQEAgLTcyMSwxMCArNzE2LDEwIEBACiAgKiBzdHJ1Y3R1cmUgaXMgd3JpdHRlbiBvdXQgdG8gdGhlIGNhcmQncyBTUkFNIHdoZW4gdGhlIG1pY3JvY29kZSBwYW5pYydzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgX3NsaWNfY3Jhc2hfaW5mbyB7CitzdHJ1Y3Qgc2xpY19jcmFzaF9pbmZvIHsKICAgICB1c2hvcnQgIGNwdV9pZDsKICAgICB1c2hvcnQgIGNyYXNoX3BjOwotfSBzbGljX2NyYXNoX2luZm8sICpwX3NsaWNfY3Jhc2hfaW5mbzsKK307CiAKICNkZWZpbmUgQ1JBU0hfSU5GT19PRkZTRVQgICAweDE1NUMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdfb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnX29zLmgKaW5kZXggMDExODI2OC4uNmQzZjIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdfb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oCkBAIC00NCwxMCArNDQsMTAgQEAKICNkZWZpbmUgRkFMU0UJKDApCiAjZGVmaW5lIFRSVUUJKDEpCiAKLXR5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZIHsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgKm5sZV9mbGluazsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgKm5sZV9ibGluazsKLX0gbGlzdF9lbnRyeSwgTElTVF9FTlRSWSwgKlBMSVNUX0VOVFJZOworc3RydWN0IExJU1RfRU5UUlkgeworCXN0cnVjdCBMSVNUX0VOVFJZICpubGVfZmxpbms7CisJc3RydWN0IExJU1RfRU5UUlkgKm5sZV9ibGluazsKK307CiAKICNkZWZpbmUgSW5pdGlhbGl6ZUxpc3RIZWFkKGwpICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKGwpLT5ubGVfZmxpbmsgPSAobCktPm5sZV9ibGluayA9IChsKQpAQCAtNjgsMTAgKzY4LDEwIEBACiAKIC8qIFRoZXNlIHR3byBoYXZlIHRvIGJlIGlubGluZWQgc2luY2UgdGhleSByZXR1cm4gdGhpbmdzLiAqLwogCi1zdGF0aWMgX19pbmxpbmUgUExJU1RfRU5UUlkgUmVtb3ZlSGVhZExpc3QobGlzdF9lbnRyeSAqIGwpCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IExJU1RfRU5UUlkgKlJlbW92ZUhlYWRMaXN0KHN0cnVjdCBMSVNUX0VOVFJZICpsKQogewotCWxpc3RfZW50cnkgKmY7Ci0JbGlzdF9lbnRyeSAqZTsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqZjsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqZTsKIAogCWUgPSBsLT5ubGVfZmxpbms7CiAJZiA9IGUtPm5sZV9mbGluazsKQEAgLTgxLDEwICs4MSwxMCBAQAogCXJldHVybiAoZSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBQTElTVF9FTlRSWSBSZW1vdmVUYWlsTGlzdChsaXN0X2VudHJ5ICogbCkKK3N0YXRpYyBfX2lubGluZSBzdHJ1Y3QgTElTVF9FTlRSWSAqUmVtb3ZlVGFpbExpc3Qoc3RydWN0IExJU1RfRU5UUlkgKmwpCiB7Ci0JbGlzdF9lbnRyeSAqYjsKLQlsaXN0X2VudHJ5ICplOworCXN0cnVjdCBMSVNUX0VOVFJZICpiOworCXN0cnVjdCBMSVNUX0VOVFJZICplOwogCiAJZSA9IGwtPm5sZV9ibGluazsKIAliID0gZS0+bmxlX2JsaW5rOwpAQCAtOTYsNyArOTYsNyBAQAogCiAjZGVmaW5lIEluc2VydFRhaWxMaXN0KGwsIGUpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGlzdF9lbnRyeSAgICAgICAgICAgICAgKmI7ICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IExJU1RfRU5UUlkgICAgICAgKmI7ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgYiA9IChsKS0+bmxlX2JsaW5rOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgKGUpLT5ubGVfZmxpbmsgPSAobCk7ICAgICAgICAgICBcCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogI2RlZmluZSBJbnNlcnRIZWFkTGlzdChsLCBlKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGxpc3RfZW50cnkgICAgICAgICAgICAgICpmOyAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBMSVNUX0VOVFJZICAgICAgICpmOyAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIGYgPSAobCktPm5sZV9mbGluazsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIChlKS0+bmxlX2ZsaW5rID0gZjsgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdkYmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnZGJnLmgKaW5kZXggNDUyMmI4ZC4uYmI1OGRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdkYmcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oCkBAIC04Niw3ICs4Niw3IEBACiAgKiBuZWVkcyBvZiB0aGUgdHJhY2UgZW50cnkuICBUeXBpY2FsbHkgdGhleSBhcmUgZnVuY3Rpb24gY2FsbAogICogcGFyYW1ldGVycy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgX3RyYWNlX2VudHJ5X3Mgeworc3RydWN0IHRyYWNlX2VudHJ5X3QgewogICAgICAgICBjaGFyICAgICAgbmFtZVs4XTsgICAgICAgIC8qIDggY2hhcmFjdGVyIG5hbWUgLSBsaWtlICdzJ2knbSdiJ2EncidjJ3YnICovCiAgICAgICAgIHUzMiAgIHRpbWU7ICAgICAgICAgICAvKiBDdXJyZW50IGNsb2NrIHRpYyAqLwogICAgICAgICB1bnNpZ25lZCBjaGFyICAgICBjcHU7ICAgICAgICAgICAgLyogQ3VycmVudCBDUFUgKi8KQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgICAgdTMyICAgYXJnMjsgICAgICAgICAgIC8qIENhbGxlciBhcmcyICovCiAgICAgICAgIHUzMiAgIGFyZzM7ICAgICAgICAgICAvKiBDYWxsZXIgYXJnMyAqLwogICAgICAgICB1MzIgICBhcmc0OyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzQgKi8KLX0gdHJhY2VfZW50cnlfdCwgKnB0cmFjZV9lbnRyeV90OworfTsKIAogLyoKICAqIERyaXZlciB0eXBlcyBmb3IgZHJpdmVyIGZpZWxkIGluIHRyYWNlX2VudHJ5X3QKQEAgLTEwOCwxNCArMTA4LDEzIEBACiAKICNkZWZpbmUgVFJBQ0VfRU5UUklFUyAgIDEwMjQKIAotdHlwZWRlZiBzdHJ1Y3QgX3N4Z190cmFjZV9idWZmZXJfdAoteworc3RydWN0IHN4Z190cmFjZV9idWZmZXJfdCB7CiAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBhaWQgZm9yIHdpbmRiZyBleHRlbnNpb24gKi8KICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBpbjsgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIHRvIGFkZCAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIGxldmVsOyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBUcmFjZSBsZXZlbCAqLwogCXNwaW5sb2NrX3QJbG9jazsgICAgICAgICAgICAgICAgICAvKiBGb3IgTVAgdHJhY2luZyAqLwotICAgICAgICB0cmFjZV9lbnRyeV90ICAgICAgICAgICBlbnRyaWVzW1RSQUNFX0VOVFJJRVNdOy8qIFRoZSBjaXJjdWxhciBidWZmZXIgKi8KLX0gc3hnX3RyYWNlX2J1ZmZlcl90OworICAgICAgICBzdHJ1Y3QgdHJhY2VfZW50cnlfdCAgICAgICAgICAgZW50cmllc1tUUkFDRV9FTlRSSUVTXTsvKiBUaGUgY2lyY3VsYXIgYnVmZmVyICovCit9OwogCiAvKgogICogVGhlIHRyYWNlIGxldmVscwpAQCAtMTM3LDcgKzEzNiw3IEBACiAjaWYgQVRLX1RSQUNFX0VOQUJMRUQKICNkZWZpbmUgU1hHX1RSQUNFX0lOSVQoYnVmZmVyLCB0bGV2ZWwpCQkJCVwKIHsJCQkJCQkJCVwKLQltZW1zZXQoKGJ1ZmZlciksIDAsIHNpemVvZihzeGdfdHJhY2VfYnVmZmVyX3QpKTsJXAorCW1lbXNldCgoYnVmZmVyKSwgMCwgc2l6ZW9mKHN0cnVjdCBzeGdfdHJhY2VfYnVmZmVyX3QpKTsJXAogCShidWZmZXIpLT5sZXZlbCA9ICh0bGV2ZWwpOwkJCQlcCiAJKGJ1ZmZlciktPnNpemUgPSBUUkFDRV9FTlRSSUVTOwkJCQlcCiAJc3Bpbl9sb2NrX2luaXQoJihidWZmZXIpLT5sb2NrKTsJCQlcCkBAIC0xNTQsNyArMTUzLDcgQEAKICAgICAgICAgaWYgKChidWZmZXIpICYmICgoYnVmZmVyKS0+bGV2ZWwgPj0gKHRsZXZlbCkpKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICB0cmFjZV9pcnFsID0gMDsgICAgLyogPz8/Pz8/IEZJWCBUSElTICAqLyAgICBcCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHB0cmFjZV9lbnRyeV90ICB0cmFjZV9lbnRyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RydWN0IHRyYWNlX2VudHJ5X3QJKnRyYWNlX2VudHJ5OwkJCQlcCiAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHRpbWV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmKGJ1ZmZlciktPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaGlmLmgKaW5kZXggODhiZmZiYS4uYTRlOTQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oCkBAIC0xMiw3ICsxMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVUNPREUgUmVnaXN0ZXJzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfVUNPREVfUkVHUyB7CitzdHJ1Y3QgU1hHX1VDT0RFX1JFR1MgewogCS8vIEFkZHJlc3MgMCAtIDB4M0YgPSBDb21tYW5kIGNvZGVzIDAtMTUgZm9yIFRDQiAwLiAgRXhjb2RlIDAKIAl1MzIgSWNyOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMCAtIEludCBjb250cm9sCiAJdTMyIFJzdmRSZWcxOwkJLy8gQ29kZSA9IDEgLSBUT0UgLU5BCkBAIC0xMjcsNyArMTI3LDcgQEAKIAkvLyBiYXNlLiAgQXMgZXh0ZW5kZWQgY29kZXMgYXJlIGFkZGVkLCByZWR1Y2UgdGhlIGZpcnN0IGFycmF5IHZhbHVlIGluCiAJLy8gdGhlIGZvbGxvd2luZyBmaWVsZAogCXUzMiBQYWRUb05leHRDcHVbOTRdWzE2XTsJLy8gOTQgPSAxMjggLSAzNCAoMzQgPSBFeGNvZGVzIDAgLSAzMykKLX0gU1hHX1VDT0RFX1JFR1MsICpQU1hHX1VDT0RFX1JFR1M7Cit9OwogCiAvLyBJbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAoMCkgdmFsdWVzCiAjZGVmaW5lIFNYR19JQ1JfRElTQUJMRQkJCQkJMHgwMDAwMDAwMApAQCAtMTY5LDcgKzE2OSw3IEBACiAgKiBpcyBoYXBwZW5pbmcgaXMgdGhhdCB0aGVzZSByZWdpc3RlcnMgb2NjdXB5IHRoZSAiUGFkRXhbMTVdIiBhcmVhcyBpbiB0aGUKICAqIFNYR19VQ09ERV9SRUdTIGRlZmluaXRpb24gYWJvdmUKICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19UQ0JfUkVHUyB7CitzdHJ1Y3QgU1hHX1RDQl9SRUdTIHsKIAl1MzIgRXhDb2RlOwkJLyogRXh0ZW5kZWQgY29kZXMgLSBzZWUgU1hHX1VDT0RFX1JFR1MgKi8KIAl1MzIgWG10OwkJLyogQ29kZSA9IDEgLSAjIG9mIFhtdCBkZXNjcmlwdG9ycyBhZGRlZCB0byByaW5nICovCiAJdTMyIFJjdjsJCS8qIENvZGUgPSAyIC0gIyBvZiBSY3YgZGVzY3JpcHRvcnMgYWRkZWQgdG8gcmluZyAqLwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJdTMyIFJzdmQ0OwkJLyogQ29kZSA9IDcgLSBUT0UgTkEgKi8KIAl1MzIgUnN2ZDU7CQkvKiBDb2RlID0gOCAtIFRPRSBOQSAqLwogCXUzMiBQYWRbN107CQkvKiBDb2RlcyA4LTE1IC0gTm90IHVzZWQuICovCi19IFNYR19UQ0JfUkVHUywgKlBTWEdfVENCX1JFR1M7Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJU1IgRm9ybWF0CkBAIC0yNzIsNyArMjcyLDcgQEAKICAqCiAgKi8KICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19FVkVOVCB7CitzdHJ1Y3QgU1hHX0VWRU5UIHsKIAl1MzIgUGFkWzFdOwkJLy8gbm90IHVzZWQKIAl1MzIgU25kVW5hOwkJLy8gU25kVW5hIHZhbHVlCiAJdTMyIFJlc2lkOwkJLy8gcmVjZWl2ZSBNREwgcmVzaWQKQEAgLTI5NCw3ICsyOTQsNyBAQAogCXVuc2lnbmVkIGNoYXIgQ29kZTsJLy8gRXZlbnQgY29kZQogCXVuc2lnbmVkIGNoYXIgQ29tbWFuZEluZGV4OwkvLyBOZXcgcmluZyBpbmRleAogCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvLyBFdmVudCBzdGF0dXMKLX0gU1hHX0VWRU5ULCAqUFNYR19FVkVOVDsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAvLyBFdmVudCBjb2RlIGRlZmluaXRpb25zCkBAIC0zMjEsOSArMzIxLDkgQEAKICNkZWZpbmUgRVZFTlRfUklOR19CQVRDSAkxNgkvLyBIYW5kIGVudHJpZXMgYmFjayAxNiBhdCBhIHRpbWUuCiAjZGVmaW5lIEVWRU5UX0JBVENIX0xJTUlUCTI1NgkvLyBTdG9wIHByb2Nlc3NpbmcgZXZlbnRzIGFmdGVyIDI1NiAoMTYgKiAxNikKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19FVkVOVF9SSU5HIHsKLQlTWEdfRVZFTlQgUmluZ1tFVkVOVF9SSU5HX1NJWkVdOwotfSBTWEdfRVZFTlRfUklORywgKlBTWEdfRVZFTlRfUklORzsKK3N0cnVjdCBTWEdfRVZFTlRfUklORyB7CisJc3RydWN0IFNYR19FVkVOVCBSaW5nW0VWRU5UX1JJTkdfU0laRV07Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDAwLDEyICs0MDAsMTIgQEAKICNkZWZpbmUgU1hHX01BWF9FTlRSSUVTICAgICA0MDk2CiAKIC8vIFN0cnVjdHVyZSBhbmQgbWFjcm9zIHRvIG1hbmFnZSBhIHJpbmcKLXR5cGVkZWYgc3RydWN0IF9TWEdfUklOR19JTkZPIHsKK3N0cnVjdCBTWEdfUklOR19JTkZPIHsKIAl1bnNpZ25lZCBjaGFyIEhlYWQ7CS8vIFdoZXJlIHdlIGFkZCBlbnRyaWVzIC0gTm90ZSB1bnNpZ25lZCBjaGFyOlJJTkdfU0laRQogCXVuc2lnbmVkIGNoYXIgVGFpbDsJLy8gV2hlcmUgd2UgcHVsbCBvZmYgY29tcGxldGVkIGVudHJpZXMKIAl1c2hvcnQgU2l6ZTsJCS8vIFJpbmcgc2l6ZSAtIE11c3QgYmUgbXVsdGlwbGUgb2YgMgogCXZvaWQgKkNvbnRleHRbU1hHX01BWF9SSU5HX1NJWkVdOwkvLyBTaGFkb3cgcmluZwotfSBTWEdfUklOR19JTkZPLCAqUFNYR19SSU5HX0lORk87Cit9OwogCiAjZGVmaW5lIFNYR19JTklUSUFMSVpFX1JJTkcoX3JpbmcsIF9zaXplKSB7CQkJCQkJCVwKIAkoX3JpbmcpLkhlYWQgPSAwOwkJCQkJCQkJCQkJCVwKQEAgLTQ4MSw3ICs0ODEsNyBAQAogICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjgJCTB4MWMKICAqLwogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfU1hHX0NNRCB7CitzdHJ1Y3QgU1hHX0NNRCB7CiAJZG1hX2FkZHJfdCBTZ2w7CQkvLyBQaHlzaWNhbCBhZGRyZXNzIG9mIFNHTAogCXVuaW9uIHsKIAkJc3RydWN0IHsKQEAgLTUxOCwxNCArNTE4LDE0IEBACiAJCQl1bnNpZ25lZCBjaGFyIE5vdFVzZWQ7CiAJCX0gU3RhdHVzOwogCX07Ci19IFNYR19DTUQsICpQU1hHX0NNRDsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9WTEFOX0hEUiB7CitzdHJ1Y3QgVkxBTl9IRFIgewogCXVzaG9ydCBWbGFuVGNpOwogCXVzaG9ydCBWbGFuVHBpZDsKLX0gVkxBTl9IRFIsICpQVkxBTl9IRFI7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLyoKQEAgLTU2NCwyMiArNTY0LDIyIEBACiAjZGVmaW5lIFNYR19TTE9XQ01EX0NTVU1fVENQCQkweDAyCS8vIENoZWNrc3VtIFRDUAogI2RlZmluZSBTWEdfU0xPV0NNRF9MU08JCQkJMHgwNAkvLyBMYXJnZSBzZWdtZW50IHNlbmQKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19YTVRfUklORyB7Ci0JU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfWE1UX1JJTkdfU0laRV07Ci19IFNYR19YTVRfUklORywgKlBTWEdfWE1UX1JJTkc7CitzdHJ1Y3QgU1hHX1hNVF9SSU5HIHsKKwlzdHJ1Y3QgU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfWE1UX1JJTkdfU0laRV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9SSU5HIHsKLQlTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19SQ1ZfUklOR19TSVpFXTsKLX0gU1hHX1JDVl9SSU5HLCAqUFNYR19SQ1ZfUklORzsKK3N0cnVjdCBTWEdfUkNWX1JJTkcgeworCXN0cnVjdCBTWEdfQ01EIERlc2NyaXB0b3JzW1NYR19SQ1ZfUklOR19TSVpFXTsKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNoYXJlIG1lbW9yeSBidWZmZXIgdHlwZXMgLSBVc2VkIHRvIGlkZW50aWZ5IGFzeW5jaHJvbm91cwogICogc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKK2VudW0gU1hHX0JVRkZFUl9UWVBFIHsKIAlTWEdfQlVGRkVSX1RZUEVfUkNWLAkvLyBSZWNlaXZlIGJ1ZmZlcgogCVNYR19CVUZGRVJfVFlQRV9TR0wJLy8gU0dMIGJ1ZmZlcgotfSBTWEdfQlVGRkVSX1RZUEU7Cit9OwogCiAvLyBTdGF0ZSBmb3IgU1hHIGJ1ZmZlcnMKICNkZWZpbmUgU1hHX0JVRkZFUl9GUkVFCQkweDAxCkBAIC02NzAsMTkgKzY3MCwxOSBAQAogI2RlZmluZSBTWEdfTUFYX1JDVl9CTE9DS1MJCQkJMTI4CS8vID0gMTYzODQgcmVjZWl2ZSBidWZmZXJzCiAKIC8vIFJlY2VpdmUgYnVmZmVyIGhlYWRlcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHsKK3N0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB7CiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzCiAJLy8gTm90ZSAtIERPIE5PVCBVU0UgdGhlIFZpcnR1YWxBZGRyZXNzIGZpZWxkIHRvIGxvY2F0ZSBkYXRhLgogCS8vIFVzZSB0aGUgc3hnLmg6U1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTiBtYWNybyBpbnN0ZWFkLgogCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiBidWZmZXIKLQlMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGJ1ZmZlcnMKLQlzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpOZXh0OwkvLyBGYXN0cGF0aCBkYXRhIGJ1ZmZlciBxdWV1ZQorCXN0cnVjdCBMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGJ1ZmZlcnMKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKk5leHQ7CS8vIEZhc3RwYXRoIGRhdGEgYnVmZmVyIHF1ZXVlCiAJdTMyIFNpemU7CQkvLyBCdWZmZXIgc2l6ZQogCXUzMiBCeXRlT2Zmc2V0OwkJLy8gU2VlIFNYR19SRVNUT1JFX01ETF9PRkZTRVQKIAl1bnNpZ25lZCBjaGFyIFN0YXRlOwkvLyBTZWUgU1hHX0JVRkZFUiBzdGF0ZSBhYm92ZQogCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvLyBFdmVudCBzdGF0dXMgKHRvIGxvZyBQVVNIKQogCXN0cnVjdCBza19idWZmICpza2I7CS8vIERvdWJsZSBtYXBwZWQgKG5ibCBhbmQgcGt0KQotfSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiwgKlBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUjsKK307CiAKIC8vIFN4Z1Nsb3dSZWNlaXZlIHVzZXMgdGhlIFBBQ0tFVCAoc2tiKSBjb250YWluZWQKIC8vIGluIHRoZSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB3aGVuIGluZGljYXRpbmcgZHVtYi1uaWMgZGF0YQpAQCAtNjkzLDQyICs2OTMsNDMgQEAKICNkZWZpbmUgU1hHX1JDVl9KVU1CT19CVUZGRVJfU0laRQkJMTAyNDAJLy8ganVtYm8gPSAxMGsgaW5jbHVkaW5nIEhEUgogCiAvLyBSZWNlaXZlIGRhdGEgZGVzY3JpcHRvcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9ERVNDUklQVE9SIHsKK3N0cnVjdCBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiB7CiAJdW5pb24gewogCQlzdHJ1Y3Qgc2tfYnVmZiAqVmlydHVhbEFkZHJlc3M7CS8vIEhvc3QgaGFuZGxlCiAJCXU2NCBGb3JjZVRvOEJ5dGVzOwkvLyBGb3JjZSB4ODYgdG8gOC1ieXRlIGJvdW5kYXJ5CiAJfTsKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsKLX0gU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IsICpQU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1I7Cit9OwogCiAvLyBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sKICNkZWZpbmUgU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0sJCTEyOAogI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRQkJMjA0OAkvLyBGb3Igc2FuaXR5IGNoZWNrCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIHsKLQlTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiBEZXNjcmlwdG9yc1tTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DS107Ci19IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSywgKlBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0s7CisKK3N0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgeworCXN0cnVjdCBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiBEZXNjcmlwdG9yc1tTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DS107Cit9OwogCiAvLyBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sgaGVhZGVyCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiB7CitzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiB7CiAJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIDJrIGJ1ZmZlcgogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyAuLmFuZCBpdCdzIHBoeXNpY2FsIGFkZHJlc3MKLQlMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGRlc2NyaXB0b3IgYmxvY2tzCisJc3RydWN0IExJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgZGVzY3JpcHRvciBibG9ja3MKIAl1bnNpZ25lZCBjaGFyIFN0YXRlOwkvLyBTZWUgU1hHX0JVRkZFUiBzdGF0ZSBhYm92ZQotfSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSLCAqUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFI7Cit9OwogCiAvLyBSZWNlaXZlIGJsb2NrIGhlYWRlcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfQkxPQ0tfSERSIHsKK3N0cnVjdCBTWEdfUkNWX0JMT0NLX0hEUiB7CiAJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIHZpcnR1YWwgbWVtb3J5CiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIC4uYW5kIGl0J3MgcGh5c2ljYWwgYWRkcmVzcwotCUxJU1RfRU5UUlkgQWxsTGlzdDsJLy8gUXVldWUgb2YgYWxsIFNYR19SQ1ZfQkxPQ0tTCi19IFNYR19SQ1ZfQkxPQ0tfSERSLCAqUFNYR19SQ1ZfQkxPQ0tfSERSOworCXN0cnVjdCBMSVNUX0VOVFJZIEFsbExpc3Q7CS8vIFF1ZXVlIG9mIGFsbCBTWEdfUkNWX0JMT0NLUworfTsKIAogLy8gTWFjcm9zIHRvIGRldGVybWluZSBkYXRhIHN0cnVjdHVyZSBvZmZzZXRzIGludG8gcmVjZWl2ZSBibG9jawogI2RlZmluZSBTWEdfUkNWX0JMT0NLX1NJWkUoX0J1ZmZlcnNpemUpIAkJCQkJXAogCSgoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKSArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkgICAgICAgICAgICAgICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkgICAgICAgICAgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfQkxPQ0tfSERSKSkpCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpKSAgICAgICAgICArCQlcCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfQkxPQ0tfSERSKSkpCiAjZGVmaW5lIFNYR19SQ1ZfQlVGRkVSX0RBVEFfU0laRShfQnVmZmVyc2l6ZSkJCQkJXAogCSgoX0J1ZmZlcnNpemUpIC0gU1hHX1JDVl9EQVRBX0hEUl9TSVpFKQogI2RlZmluZSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCQkJXApAQCAtNzM3LDE4ICs3MzgsMTggQEAKIAkoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKQogI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJXAogCSgoKF9CdWZmZXJzaXplKSAqIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLKSArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkpCisJIChzaXplb2Yoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpKQogI2RlZmluZSBTWEdfUkNWX0JMT0NLX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCQkJCVwKIAkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikpKQorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSAgICAgICAgICAgICAgKwkJXAorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkpCiAKIC8vIFVzZSB0aGUgbWluaXBvcnQgcmVzZXJ2ZWQgcG9ydGlvbiBvZiB0aGUgTkJMIHRvIGxvY2F0ZQogLy8gb3VyIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHN0cnVjdHVyZS4KLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX05CTF9SRVNFUlZFRCB7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7CitzdHJ1Y3QgU1hHX1JDVl9OQkxfUkVTRVJWRUQgeworCXN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqUmN2RGF0YUJ1ZmZlckhkcjsKIAl2b2lkICpBdmFpbGFibGU7Ci19IFNYR19SQ1ZfTkJMX1JFU0VSVkVELCAqUFNYR19SQ1ZfTkJMX1JFU0VSVkVEOworfTsKIAogI2RlZmluZSBTWEdfUkNWX05CTF9CVUZGRVJfSERSKF9OQkwpICgoKFBTWEdfUkNWX05CTF9SRVNFUlZFRClORVRfQlVGRkVSX0xJU1RfTUlOSVBPUlRfUkVTRVJWRUQoX05CTCkpLT5SY3ZEYXRhQnVmZmVySGRyKQogCkBAIC03NjAsMTEgKzc2MSwxMSBAQAogI2RlZmluZSBTWEdfTUFYX1NHTF9CVUZGRVJTCQkJMTYzODQJLy8gTWF4aW11bSB0byBhbGxvY2F0ZSAobm90ZSBBREFQVDp1c2hvcnQpCiAKIC8vIFNlbGYgaWRlbnRpZnlpbmcgc3RydWN0dXJlIHR5cGUKLXR5cGVkZWYgZW51bSBfU1hHX1NHTF9UWVBFIHsKK2VudW0gU1hHX1NHTF9UWVBFIHsKIAlTWEdfU0dMX0RVTUIsCQkvLyBEdW1iIE5JQyBTR0wKIAlTWEdfU0dMX1NMT1csCQkvLyBTbG93cGF0aCBwcm90b2NvbCBoZWFkZXIgLSBzZWUgYmVsb3cKIAlTWEdfU0dMX0NISU1ORVkJCS8vIENoaW1uZXkgb2ZmbG9hZCBTR0wKLX0gU1hHX1NHTF9UWVBFLCBQU1hHX1NHTF9UWVBFOworfTsKIAogLy8gTm90ZSAtIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBpcyBNaWNyb3NvZnQgc3BlY2lmaWMKIC8vCkBAIC03OTgsNDEgKzc5OSw0MSBAQAogLy8gdG8gdGhlIGNhcmQgZGlyZWN0bHkuICBGb3IgeDg2IHN5c3RlbXMgd2UgbXVzdCByZWNvbnN0cnVjdAogLy8gdGhlIFNHTC4gIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgYW4geDY0CiAvLyBmb3JtYXR0ZWQgU0dMIGVudHJ5Ci10eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0Ugeworc3RydWN0IFNYR19YNjRfU0dFIHsKIAlkbWE2NF9hZGRyX3QgQWRkcmVzczsJLy8gc2FtZSBhcyB3ZG0uaAogCXUzMiBMZW5ndGg7CQkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIENvbXBpbGVyUGFkOwkvLyBUaGUgY29tcGlsZXIgcGFkcyB0byA4LWJ5dGVzCiAJdTY0IFJlc2VydmVkOwkJLy8gdTMyICogaW4gd2RtLmguICBGb3JjZSB0byA4IGJ5dGVzCi19IFNYR19YNjRfU0dFLCAqUFNYR19YNjRfU0dFOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworc3RydWN0IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgewogCWRtYTY0X2FkZHJfdCBBZGRyZXNzOwkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIExlbmd0aDsJCS8vIHNhbWUgYXMgd2RtLmgKIAl1MzIgQ29tcGlsZXJQYWQ7CS8vIFRoZSBjb21waWxlciBwYWRzIHRvIDgtYnl0ZXMKIAl1NjQgUmVzZXJ2ZWQ7CQkvLyB1MzIgKiBpbiB3ZG0uaC4gIEZvcmNlIHRvIDggYnl0ZXMKLX0gU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCwgKlBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NDQVRURVJfR0FUSEVSX0xJU1Qgeworc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgewogCXUzMiBOdW1iZXJPZkVsZW1lbnRzOwogCXUzMiAqUmVzZXJ2ZWQ7Ci0JU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCBFbGVtZW50c1tdOwotfSBTQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFNDQVRURVJfR0FUSEVSX0xJU1Q7CisJc3RydWN0IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbXTsKK307CiAKIC8vIFRoZSBjYXJkIGRvZXNuJ3QgY2FyZSBhYm91dCBhbnl0aGluZyBleGNlcHQgZWxlbWVudHMsIHNvCiAvLyB3ZSBjYW4gbGVhdmUgdGhlIHUzMiAqIHJlc2VydmVkIGZpZWxkIGFsb25lIGluIHRoZSBmb2xsb3dpbmcKIC8vIFNHTCBzdHJ1Y3R1cmUuICBCdXQgcmVkZWZpbmUgZnJvbSB3ZG0uaDpTQ0FUVEVSX0dBVEhFUl9MSVNUIHNvCiAvLyB3ZSBjYW4gc3BlY2lmeSBTWEdfWDY0X1NHRSBhbmQgZGVmaW5lIGEgZml4ZWQgbnVtYmVyIG9mIGVsZW1lbnRzCi10eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0wgeworc3RydWN0IFNYR19YNjRfU0dMIHsKIAl1MzIgTnVtYmVyT2ZFbGVtZW50czsKIAl1MzIgKlJlc2VydmVkOwotCVNYR19YNjRfU0dFIEVsZW1lbnRzW1NYR19TR0xfRU5UUklFU107Ci19IFNYR19YNjRfU0dMLCAqUFNYR19YNjRfU0dMOworCXN0cnVjdCBTWEdfWDY0X1NHRSBFbGVtZW50c1tTWEdfU0dMX0VOVFJJRVNdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19TQ0FUVEVSX0dBVEhFUiB7Ci0JU1hHX1NHTF9UWVBFIFR5cGU7CS8vIEZJUlNUISBEdW1iLW5pYyBvciBvZmZsb2FkCitzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSIHsKKwllbnVtIFNYR19TR0xfVFlQRSBUeXBlOwkvLyBGSVJTVCEgRHVtYi1uaWMgb3Igb2ZmbG9hZAogCXZvaWQgKmFkYXB0ZXI7CQkvLyBCYWNrIHBvaW50ZXIgdG8gYWRhcHRlcgotCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcwotCUxJU1RfRU5UUlkgQWxsTGlzdDsJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKKwlzdHJ1Y3QgTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBTWEdfU0NBVFRFUl9HQVRIRVIgYmxvY2tzCisJc3RydWN0IExJU1RfRU5UUlkgQWxsTGlzdDsJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gcGh5c2ljYWwgYWRkcmVzcwogCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCiAJdW5zaWduZWQgY2hhciBDbWRJbmRleDsJLy8gQ29tbWFuZCByaW5nIGluZGV4CkBAIC04NDAsMTggKzg0MSwxOCBAQAogCXUzMiBEaXJlY3Rpb247CQkvLyBGb3IgYXN5bmNocm9ub3VzIGNvbXBsZXRpb25zCiAJdTMyIEN1ck9mZnNldDsJCS8vIEN1cnJlbnQgU0dMIG9mZnNldAogCXUzMiBTZ2xSZWY7CQkvLyBTR0wgcmVmZXJlbmNlIGNvdW50Ci0JVkxBTl9IRFIgVmxhblRhZzsJLy8gVkxBTiB0YWcgdG8gYmUgaW5zZXJ0ZWQgaW50byBTR0wKLQlQU0NBVFRFUl9HQVRIRVJfTElTVCBwU2dsOwkvLyBTR0wgQWRkci4gUG9zc2libHkgJlNnbAotCVNYR19YNjRfU0dMIFNnbDsJLy8gU0dMIGhhbmRlZCB0byBjYXJkCi19IFNYR19TQ0FUVEVSX0dBVEhFUiwgKlBTWEdfU0NBVFRFUl9HQVRIRVI7CisJc3RydWN0IFZMQU5fSERSIFZsYW5UYWc7CS8vIFZMQU4gdGFnIHRvIGJlIGluc2VydGVkIGludG8gU0dMCisJc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2w7CS8vIFNHTCBBZGRyLiBQb3NzaWJseSAmU2dsCisJc3RydWN0IFNYR19YNjRfU0dMIFNnbDsJLy8gU0dMIGhhbmRlZCB0byBjYXJkCit9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogI2RlZmluZSBTWEdfU0dMX0JVRkZFUihfU3hnU2dsKQkJKCZfU3hnU2dsLT5TZ2wpCi0jZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQlzaXplb2YoU1hHX1g2NF9TR0wpCisjZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQlzaXplb2Yoc3RydWN0IFNYR19YNjRfU0dMKQogI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2KQogLy8gRm9yY2UgTkRJUyB0byBnaXZlIHVzIGl0J3Mgb3duIGJ1ZmZlciBzbyB3ZSBjYW4gcmVmb3JtYXQgdG8gb3VyIG93bgogI2RlZmluZSBTWEdfU0dMX0JVRkZFUihfU3hnU2dsKQkJTlVMTAogI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJMAogI2Vsc2UKLVN0b3AgQ29tcGlsYXRpb247CisjZXJyb3Igc3RhZ2luZzogc3hnOiBkcml2ZXIgaXMgZm9yIFg4NiBvbmx5IQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmgKaW5kZXggMjIyMmFlOS4uYjBlZmZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaHcuaApAQCAtNDgsNyArNDgsNyBAQAogI2RlZmluZSBTWEdfSFdSRUdfTUVNU0laRQkweDQwMDAJCS8vIDE2awogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9TWEdfSFdfUkVHUyB7CitzdHJ1Y3QgU1hHX0hXX1JFR1MgewogCXUzMgkJUmVzZXQ7CQkJCS8vIFdyaXRlIDB4ZGVhZCB0byBpbnZva2Ugc29mdCByZXNldAogCXUzMgkJUGFkMTsJCQkJLy8gTm8gcmVnaXN0ZXIgZGVmaW5lZCBhdCBvZmZzZXQgNAogCXUzMgkJSW50ZXJydXB0TWFzazA7CQkvLyBEZWFzc2VydCBsZWdhY3kgaW50ZXJydXB0IG9uIGZ1bmN0aW9uIDAKQEAgLTExMyw3ICsxMTMsNyBAQAogCXUzMgkJU29mdHdhcmVbMTkyMF07CQkvLyAweDIwMCAtIDB4MjAwMCAtIFNvZnR3YXJlIGRlZmluZWQgKG5vdCB1c2VkKQogCXUzMgkJTXNpeFRhYmxlWzEwMjRdOwkvLyAweDIwMDAgLSAweDMwMDAgLSBNU0lYIFRhYmxlCiAJdTMyCQlNc2l4Qml0QXJyYXlbMTAyNF07CS8vIDB4MzAwMCAtIDB4NDAwMCAtIE1TSVggUGVuZGluZyBCaXQgQXJyYXkKLX0gU1hHX0hXX1JFR1MsICpQU1hHX0hXX1JFR1M7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLy8gTWljcm9jb2RlIEFkZHJlc3MgRmxhZ3MKQEAgLTUxOSwxMCArNTE5LDEwIEBACiAjZGVmaW5lCVhTX0xBTkVfQUxJR04JCQkweDEwMDAJCQkvLyBYUyB0cmFuc21pdCBsYW5lcyBhbGlnbmVkCiAKIC8vIFBIWSBNaWNyb2NvZGUgZG93bmxvYWQgZGF0YSBzdHJ1Y3R1cmUKLXR5cGVkZWYgc3RydWN0IF9QSFlfVUNPREUgeworc3RydWN0IFBIWV9VQ09ERSB7CiAJdXNob3J0CUFkZHI7CiAJdXNob3J0CURhdGE7Ci19IFBIWV9VQ09ERSwgKlBQSFlfVUNPREU7Cit9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTM3LDcgKzUzNyw3IEBACiAvLyBhbGwgY29tbWFuZHMgLSBzZWUgdGhlIFNhaGFyYSBzcGVjIGZvciBkZXRhaWxzLiAgTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGlzCiAvLyBvbmx5IHZhbGlkIHdoZW4gY29tcGlsZWQgb24gYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmUuCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9YTVRfREVTQyB7CitzdHJ1Y3QgWE1UX0RFU0MgewogCXVzaG9ydAlYbXRMZW47CQkJLy8gd29yZCAwLCBiaXRzIFsxNTowXSAtICB0cmFuc21pdCBsZW5ndGgKIAl1bnNpZ25lZCBjaGFyCVhtdEN0bDsJCQkvLyB3b3JkIDAsIGJpdHMgWzIzOjE2XSAtIHRyYW5zbWl0IGNvbnRyb2wgYnl0ZQogCXVuc2lnbmVkIGNoYXIJQ21kOwkJCS8vIHdvcmQgMCwgYml0cyBbMzE6MjRdIC0gdHJhbnNtaXQgY29tbWFuZCBwbHVzIG1pc2MuCkBAIC01NTEsNyArNTUxLDcgQEAKIAl1MzIJUnN2ZDM7CQkJLy8gd29yZCA1LCBiaXRzIFszMTowXSAtICBQQUQKIAl1MzIJUnN2ZDQ7CQkgICAgLy8gd29yZCA2LCBiaXRzIFszMTowXSAtICBQQUQKIAl1MzIJUnN2ZDU7CQkgICAgLy8gd29yZCA3LCBiaXRzIFszMTowXSAtICBQQUQKLX0gWE1UX0RFU0MsICpQWE1UX0RFU0M7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLy8gWE1UX0RFU0MgQ21kIGJ5dGUgZGVmaW5pdGlvbnMKQEAgLTYwMCw3ICs2MDAsNyBAQAogLy8gRm9ybWF0IG9mIHRoZSAxOCBieXRlIFJlY2VpdmUgQnVmZmVyIHJldHVybmVkIGJ5IHRoZQogLy8gUmVjZWl2ZSBTZXF1ZW5jZXIgZm9yIHJlY2VpdmVkIHBhY2tldHMKICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1JDVl9CVUZfSERSIHsKK3N0cnVjdCBSQ1ZfQlVGX0hEUiB7CiAJdTMyCVN0YXR1czsJCQkJLy8gU3RhdHVzIHdvcmQgZnJvbSBSY3YgU2VxIFBhcnNlcgogCXVzaG9ydAlMZW5ndGg7CQkJCS8vIFJjdiBwYWNrZXQgYnl0ZSBjb3VudAogCXVuaW9uIHsKQEAgLTYxNSw3ICs2MTUsNyBAQAogCXVuc2lnbmVkIGNoYXIJSXBIZHJPZmZzZXQ7CQkvLyBJUCBoZWFkZXIgb2Zmc2V0IGludG8gcGFja2V0CiAJdTMyCVRwekhhc2g7CQkJLy8gVG9lcGxpdHogaGFzaAogCXVzaG9ydAlSZXNlcnZlZDsJCQkvLyBSZXNlcnZlZAotfSBSQ1ZfQlVGX0hEUiwgKlBSQ1ZfQlVGX0hEUjsKK307CiAjcHJhZ21hIHBhY2socG9wKQogCiAKQEAgLTY2NSwyOCArNjY1LDI4IEBACiAjcHJhZ21hIHBhY2socHVzaCwgMSkKIAogLyogKi8KLXR5cGVkZWYgc3RydWN0IF9IV19DRkdfREFUQSB7CitzdHJ1Y3QgSFdfQ0ZHX0RBVEEgewogCXVzaG9ydAkJQWRkcjsKIAl1bmlvbiB7CiAJCXVzaG9ydAlEYXRhOwogCQl1c2hvcnQJQ2hlY2tzdW07CiAJfTsKLX0gSFdfQ0ZHX0RBVEEsICpQSFdfQ0ZHX0RBVEE7Cit9OwogCiAvKiAqLwotI2RlZmluZQlOVU1fSFdfQ0ZHX0VOVFJJRVMJKCgxMjgvc2l6ZW9mKEhXX0NGR19EQVRBKSkgLSA0KQorI2RlZmluZQlOVU1fSFdfQ0ZHX0VOVFJJRVMJKCgxMjgvc2l6ZW9mKHN0cnVjdCBIV19DRkdfREFUQSkpIC0gNCkKIAogLyogTUFDIGFkZHJlc3MgKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfQ09ORklHX01BQyB7CitzdHJ1Y3QgU1hHX0NPTkZJR19NQUMgewogCXVuc2lnbmVkIGNoYXIJCU1hY0FkZHJbNl07CQkJLyogTUFDIEFkZHJlc3MgKi8KLX0gU1hHX0NPTkZJR19NQUMsICpQU1hHX0NPTkZJR19NQUM7Cit9OwogCiAvKiAqLwotdHlwZWRlZiBzdHJ1Y3QgX0FUS19GUlUgeworc3RydWN0IEFUS19GUlUgewogCXVuc2lnbmVkIGNoYXIJCVBhcnROdW1bNl07CiAJdW5zaWduZWQgY2hhcgkJUmV2aXNpb25bMl07CiAJdW5zaWduZWQgY2hhcgkJU2VyaWFsWzE0XTsKLX0gQVRLX0ZSVSwgKlBBVEtfRlJVOworfTsKIAogLyogT0VNIEZSVSBGb3JtYXQgdHlwZXMgKi8KICNkZWZpbmUJQVRLX0ZSVV9GT1JNQVQJCTB4MDAwMApAQCAtNjk4LDI0ICs2OTgsMjQgQEAKICNkZWZpbmUgTk9fRlJVX0ZPUk1BVAkJMHhGRkZGCiAKIC8qIEVFUFJPTS9GbGFzaCBGb3JtYXQgKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfQ09ORklHIHsKK3N0cnVjdCBTWEdfQ09ORklHIHsKIAkvKiAqLwogCS8qIFNlY3Rpb24gMSAoMTI4IGJ5dGVzKSAqLwogCS8qICovCiAJdXNob3J0CQkJTWFnaWNXb3JkOwkJCS8qIEVFUFJPTS9GTEFTSCBNYWdpYyBjb2RlICdBNUE1JyAqLwogCXVzaG9ydAkJCVNwaUNsa3M7CQkJLyogU1BJIGJ1cyBjbG9jayBkaXZpZGVycyAqLwotCUhXX0NGR19EQVRBCQlId0NmZ1tOVU1fSFdfQ0ZHX0VOVFJJRVNdOworCXN0cnVjdCBIV19DRkdfREFUQQkJSHdDZmdbTlVNX0hXX0NGR19FTlRSSUVTXTsKIAkvKiAqLwogCS8qICovCiAJLyogKi8KIAl1c2hvcnQJCQlWZXJzaW9uOwkJCS8qIEVFUFJPTSBmb3JtYXQgdmVyc2lvbiAqLwotCVNYR19DT05GSUdfTUFDCU1hY0FkZHJbNF07CQkJLyogc3BhY2UgZm9yIDQgTUFDIGFkZHJlc3NlcyAqLwotCUFUS19GUlUJCQlBdGtGcnU7CQkJCS8qIEZSVSBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBTWEdfQ09ORklHX01BQwlNYWNBZGRyWzRdOwkJCS8qIHNwYWNlIGZvciA0IE1BQyBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgQVRLX0ZSVQkJCUF0a0ZydTsJCQkJLyogRlJVIGluZm9ybWF0aW9uICovCiAJdXNob3J0CQkJT2VtRnJ1Rm9ybWF0OwkJLyogT0VNIEZSVSBmb3JtYXQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJCQlPZW1GcnVbNzZdOwkJCS8qIE9FTSBGUlUgaW5mb3JtYXRpb24gKG9wdGlvbmFsKSAqLwogCXVzaG9ydAkJCUNoZWNrc3VtOwkJCS8qIENoZWNrc3VtIG9mIHNlY3Rpb24gMiAqLwogCS8qIENTIGluZm8gWFhYVE9ETyAqLwotfSBTWEdfQ09ORklHLCAqUFNYR19DT05GSUc7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hncGh5Y29kZS5oCmluZGV4IDhkYmFlZGEuLjE2N2YzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hncGh5Y29kZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hncGh5Y29kZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAvKgogICogRG93bmxvYWQgZm9yIEFFTDIwMDVDIFBIWSB3aXRoIFNSL0xSIHRyYW5zY2VpdmVyICgxMEdCQVNFLVNSIG9yIDEwR0JBU0UtTFIpCiAgKi8KLXN0YXRpYyBQSFlfVUNPREUgUGh5VWNvZGVbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgUEhZX1VDT0RFIFBoeVVjb2RlW10gPSB7CiAJLyoKIAkgKiBOT1RFOiAgQW4gYWRkcmVzcyBvZiAwIGlzIGEgc3BlY2lhbCBjYXNlLiAgV2hlbiB0aGUgZG93bmxvYWQgcm91dGluZQogCSAqIHNlZXMgYW4gYWRkcmVzcyBvZiAwLCBpdCBkb2VzIG5vdCB3cml0ZSB0byB0aGUgUEhZLiAgSW5zdGVhZCwgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCmluZGV4IGY1NDFhM2EuLjAyMmQwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaApAQCAtOTEsNSArOTEsNSBAQAogdm9pZCBzdHViX2VucXVldWVfcmV0X3VubGluayhzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKiwgX191MzIsIF9fdTMyKTsKIAogLyogc3R1Yl9tYWluLmMgKi8KLWludCBtYXRjaF9idXNpZChjaGFyICpidXNpZCk7CitpbnQgbWF0Y2hfYnVzaWQoY29uc3QgY2hhciAqYnVzaWQpOwogdm9pZCBzdHViX2RldmljZV9jbGVhbnVwX3VyYnMoc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggZWU0NTVhMC4uMWUzMjBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTM4OSw3ICszODksNyBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwogCXN0cnVjdCBzdHViX2RldmljZSAqc2RldiA9IE5VTEw7Ci0JY2hhciAqdWRldl9idXNpZCA9IGludGVyZmFjZS0+ZGV2LnBhcmVudC0+YnVzX2lkOworCWNvbnN0IGNoYXIgKnVkZXZfYnVzaWQgPSBkZXZfbmFtZShpbnRlcmZhY2UtPmRldi5wYXJlbnQpOwogCWludCBlcnIgPSAwOwogCiAJZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJFbnRlclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKaW5kZXggYzY2NWQ3Zi4uMDVlNGM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYwpAQCAtNDAsMTEgKzQwLDEyIEBACiAgKiByZW1vdGUgaG9zdC4KICAqLwogI2RlZmluZSBNQVhfQlVTSUQgMTYKLXN0YXRpYyBjaGFyIGJ1c2lkX3RhYmxlW01BWF9CVVNJRF1bQlVTX0lEX1NJWkVdOworI2RlZmluZSBCVVNJRF9TSVpFIDIwCitzdGF0aWMgY2hhciBidXNpZF90YWJsZVtNQVhfQlVTSURdW0JVU0lEX1NJWkVdOwogc3RhdGljIHNwaW5sb2NrX3QgYnVzaWRfdGFibGVfbG9jazsKIAogCi1pbnQgbWF0Y2hfYnVzaWQoY2hhciAqYnVzaWQpCitpbnQgbWF0Y2hfYnVzaWQoY29uc3QgY2hhciAqYnVzaWQpCiB7CiAJaW50IGk7CiAKQEAgLTUyLDcgKzUzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVTSUQ7IGkrKykKIAkJaWYgKGJ1c2lkX3RhYmxlW2ldWzBdKQotCQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTX0lEX1NJWkUpKSB7CisJCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKSkgewogCQkJCS8qIGFscmVhZHkgcmVnaXN0ZXJkICovCiAJCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJCXJldHVybiAwOwpAQCAtOTIsNyArOTMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQogCQlpZiAoIWJ1c2lkX3RhYmxlW2ldWzBdKSB7Ci0JCQlzdHJuY3B5KGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTX0lEX1NJWkUpOworCQkJc3RybmNweShidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU0lEX1NJWkUpOwogCQkJc3Bpbl91bmxvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEwOSw5ICsxMTAsOSBAQAogCXNwaW5fbG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCi0JCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU19JRF9TSVpFKSkgeworCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKSkgewogCQkJLyogZm91bmQgKi8KLQkJCW1lbXNldChidXNpZF90YWJsZVtpXSwgMCwgQlVTX0lEX1NJWkUpOworCQkJbWVtc2V0KGJ1c2lkX3RhYmxlW2ldLCAwLCBCVVNJRF9TSVpFKTsKIAkJCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMjUsMTkgKzEyNiwxOSBAQAogCQlzaXplX3QgY291bnQpCiB7CiAJaW50IGxlbjsKLQljaGFyIGJ1c2lkW0JVU19JRF9TSVpFXTsKKwljaGFyIGJ1c2lkW0JVU0lEX1NJWkVdOwogCiAJaWYgKGNvdW50IDwgNSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBzdHJubGVuKCkgZG9lcyBub3QgaW5jbHVkZSBcMCAqLwotCWxlbiA9IHN0cm5sZW4oYnVmICsgNCwgQlVTX0lEX1NJWkUpOworCWxlbiA9IHN0cm5sZW4oYnVmICsgNCwgQlVTSURfU0laRSk7CiAKIAkvKiBidXNpZCBuZWVkcyB0byBpbmNsdWRlIFwwIHRlcm1pbmF0aW9uICovCi0JaWYgKCEobGVuIDwgQlVTX0lEX1NJWkUpKQorCWlmICghKGxlbiA8IEJVU0lEX1NJWkUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN0cm5jcHkoYnVzaWQsIGJ1ZiArIDQsIEJVU19JRF9TSVpFKTsKKwlzdHJuY3B5KGJ1c2lkLCBidWYgKyA0LCBCVVNJRF9TSVpFKTsKIAogCiAJaWYgKCFzdHJuY21wKGJ1ZiwgImFkZCAiLCA0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKaW5kZXggMzZjZTg5OC4uMmViNjEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkgKiBBIHVzZXIgbWF5IG5lZWQgdG8gc2V0IGEgc3BlY2lhbCBjb25maWd1cmF0aW9uIHZhbHVlIGJlZm9yZQogCSAqIGV4cG9ydGluZyB0aGUgZGV2aWNlLgogCSAqLwotCXVpbmZvKCJzZXRfY29uZmlndXJhdGlvbiAoJWQpIHRvICVzXG4iLCBjb25maWcsIHVyYi0+ZGV2LT5kZXYuYnVzX2lkKTsKKwl1aW5mbygic2V0X2NvbmZpZ3VyYXRpb24gKCVkKSB0byAlc1xuIiwgY29uZmlnLCBkZXZfbmFtZSgmdXJiLT5kZXYtPmRldikpOwogCXVpbmZvKCJidXQsIHNraXAhXG4iKTsKIAogCXJldHVybiAwOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJdmFsdWUgPSBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSk7CiAJaW5kZXggPSBsZTE2X3RvX2NwdShyZXEtPndJbmRleCk7CiAKLQl1aW5mbygicmVzZXRfZGV2aWNlIChwb3J0ICVkKSB0byAlc1xuIiwgaW5kZXgsIHVyYi0+ZGV2LT5kZXYuYnVzX2lkKTsKKwl1aW5mbygicmVzZXRfZGV2aWNlIChwb3J0ICVkKSB0byAlc1xuIiwgaW5kZXgsIGRldl9uYW1lKCZ1cmItPmRldi0+ZGV2KSk7CiAKIAkvKiBhbGwgaW50ZXJmYWNlcyBzaG91bGQgYmUgb3duZWQgYnkgdXNiaXAgZHJpdmVyLCBzbyBqdXN0IHJlc2V0IGl0LiAgKi8KIAlyZXQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVyYi0+ZGV2LCBOVUxMKTsKQEAgLTIzNCw4ICsyMzQsNiBAQAogc3RhdGljIGludCBzdHViX3JlY3ZfY21kX3VubGluayhzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYsCiAJCQkJCQlzdHJ1Y3QgdXNiaXBfaGVhZGVyICpwZHUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdGhlYWQgPSAmc2Rldi0+cHJpdl9pbml0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3RydWN0IHN0dWJfcHJpdiAqcHJpdjsKQEAgLTI0Myw4ICsyNDEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZXYtPnByaXZfbG9jaywgZmxhZ3MpOwogCi0JZm9yIChwdHIgPSBsaXN0aGVhZC0+bmV4dDsgcHRyICE9IGxpc3RoZWFkOyBwdHIgPSBwdHItPm5leHQpIHsKLQkJcHJpdiA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3Qgc3R1Yl9wcml2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByaXYsICZzZGV2LT5wcml2X2luaXQsIGxpc3QpIHsKIAkJaWYgKHByaXYtPnNlcW51bSA9PSBwZHUtPnUuY21kX3VubGluay5zZXFudW0pIHsKIAkJCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCmluZGV4IGQ1NTYzY2QuLjc4MDU4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYwpAQCAtNTQsNyArNTQsNiBAQAogLyoqCiAgKiBzdHViX2NvbXBsZXRlIC0gY29tcGxldGlvbiBoYW5kbGVyIG9mIGEgdXNiaXAgdXJiCiAgKiBAdXJiOiBwb2ludGVyIHRvIHRoZSB1cmIgY29tcGxldGVkCi0gKiBAcmVnczoKICAqCiAgKiBXaGVuIGEgdXJiIGhhcyBjb21wbGV0ZWQsIHRoZSBVU0IgY29yZSBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiBtb3N0bHkgaW4KICAqIHRoZSBpbnRlcnJ1cHQgY29udGV4dC4gVG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgYSB1cmIsIHRoZSBjb21wbGV0ZWQgdXJiIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCmluZGV4IDViNWEyZTMuLmY2OWNhMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGhjZC4KIAkgKiBPdXIgcHJpdmF0ZSBkYXRhIGlzIGFsc28gYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkuCiAJICovCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnZoY2lfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmdmhjaV9oY19kcml2ZXIsICZwZGV2LT5kZXYsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAlpZiAoIWhjZCkgewogCQl1ZXJyKCJjcmVhdGUgaGNkIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKaW5kZXggMjRjMjg1MS4uMGZkMzNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCkBAIC02MCw3ICs2MCw3IEBACiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDN1ICUwOHggIiwKIAkJCQkJdmRldi0+c3BlZWQsIHZkZXYtPmRldmlkKTsKIAkJCW91dCArPSBzcHJpbnRmKG91dCwgIiUxNnAgIiwgdmRldi0+dWQudGNwX3NvY2tldCk7Ci0JCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyIsIHZkZXYtPnVkZXYtPmRldi5idXNfaWQpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMiLCBkZXZfbmFtZSgmdmRldi0+dWRldi0+ZGV2KSk7CiAKIAkJfSBlbHNlCiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwMDAgMDAwIDAwMCAwMDAwMDAwMDAwMDAwMDAwIDAtMCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcKaW5kZXggNDI1MjE5ZS4uOTQwNDYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnCkBAIC0xLDcgKzEsMTEgQEAKIGNvbmZpZyBXMzVVTkQKLQl0cmlzdGF0ZSAiV2luYm9uZCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOXzgwMjExICYmIFVTQiAmJiBFWFBFUklNRU5UQUwgJiYgITRLU1RBQ0tTCisJdHJpc3RhdGUgIklTODlDMzUgV0xBTiBVU0IgZHJpdmVyIgorCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IgJiYgRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQotCSAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGRyaXZlciBmb3Igd2luYm9uZCB3aWZpIGNhcmQgb24gc29tZSBLb2hqaW5zaGEgbm90ZWJvb2tzCi0JICBDaGVjayBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avd2luYm9uZHBvcnQvIGZvciBuZXcgdmVyc2lvbgorCSAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgV2luYm9uZCBXSUZJIGNhcmQuCisKKwkgIEhhcmR3YXJlIGlzIHByZXNlbnQgaW4gc29tZSBLb2hqaW5zaGEgc3Vibm90ZWJvb2tzLCBhbmQgaW4gc29tZQorCSAgc3RhbmQtYWxvbmUgVVNCIG1vZHVsZXMuIENoaXBzZXQgbmFtZSBzZWVtcyB0byBiZSB3ODljMzVkLgorCisJICBDaGVjayBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avd2luYm9uZHBvcnQvIGZvciBuZXcgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKaW5kZXggMjljOThiZi4uYjQ5Yzk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKQEAgLTEsMTUgKzEsMTQgQEAKLQlEUklWRVJfRElSPS4vbGludXgKLQotdzM1dW5kLW9ianMgOj0gJChEUklWRVJfRElSKS93YnVzYi5vICQoRFJJVkVSX0RJUikvd2IzNXJlZy5vICQoRFJJVkVSX0RJUikvd2IzNXJ4Lm8gJChEUklWRVJfRElSKS93YjM1dHgubyBcCi0JbWRzLm8gXAotCW1sbWV0eHJ4Lm8gXAotCW10by5vCVwKK3czNXVuZC1vYmpzIDo9CQkJXAorCW1kcy5vCQkJXAorCW1sbWV0eHJ4Lm8JCVwKKwltdG8ubwkJCVwKIAlwaHlfY2FsaWJyYXRpb24ubwlcCiAJcmVnLm8JCQlcCi0Jcnhpc3IubwkJCVwKLQlzbWVfYXBpLm8JCVwKKwl3YjM1cmVnLm8JCVwKKwl3YjM1cngubwkJXAorCXdiMzV0eC5vCQlcCiAJd2JoYWwubwkJCVwKLQl3YmxpbnV4Lm8JCVwKKwl3YnVzYi5vCQkJXAogCiAKIG9iai0kKENPTkZJR19XMzVVTkQpICs9IHczNXVuZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9hZGFwdGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9hZGFwdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTcwMWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYWRhcHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8KLS8vIEFEQVBURVIuSCAtCi0vLyBXaW5kb3dzIE5ESVMgZ2xvYmFsIHZhcmlhYmxlICdBZGFwdGVyJyB0eXBlZGVmCi0vLwotI2RlZmluZSBNQVhfQU5TSV9TVFJJTkcJCTQwCi10eXBlZGVmIHN0cnVjdCBXQjMyX0FEQVBURVIKLXsKLQl1MzIgQWRhcHRlckluZGV4OyAvLyAyMDA2MDcwMy40IEFkZCBmb3IgdXNpbmcgcEFkYXB0ZXJDb250ZXh0IGdsb2JhbCBBZGFwdGVyIHBvaW50Ci0KLQlXQl9MT0NBTERFU0NSSVBUCXNMb2NhbFBhcmE7CQkvLyBNeXNlbGYgY29ubmVjdGVkIHBhcmFtZXRlcnMKLQlQV0JfQlNTREVTQ1JJUFRJT04JYXNCU1NEZXNjcmlwdEVsZW1lbnQ7Ci0KLQlNTE1FX0ZSQU1FCQlzTWxtZUZyYW1lOwkJLy8gY29ubmVjdCB0byBwZWVyU1RBIHBhcmFtZXRlcnMKLQotCU1UT19QQVJBTUVURVJTCQlzTXRvUGFyYTsgLy8gTVRPX3N0cnVjdCAuLi4KLQlod19kYXRhX3QJCQlzSHdEYXRhOyAvL0ZvciBIQUwKLQlNRFMJCQkJCU1kczsKLQotCVdCTElOVVgJCVdiTGludXg7Ci0gICAgICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzIGl3X3N0YXRzOwotCi0JdTgJTGlua05hbWVbTUFYX0FOU0lfU1RSSU5HXTsKLX0gV0IzMl9BREFQVEVSLCBBREFQVEVSLCAqUFdCMzJfQURBUFRFUiwgKlBBREFQVEVSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmgKaW5kZXggMDEzMTgzMS4uYTQzM2I1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3NfZi5oCkBAIC0xLDU5ICsxLDYzIEBACisjaWZuZGVmIF9fV0lOQk9ORF9CU1NfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9CU1NfRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0cnVjdCBQTUtJRF9JbmZvcm1hdGlvbl9FbGVtZW50OworCiAvLwogLy8gQlNTIGRlc2NyaXB0b3IgRGF0YUJhc2UgbWFuYWdlbWVudCBnbG9iYWwgZnVuY3Rpb24KIC8vCiAKLXZvaWQgdkJTU2Rlc2NyaXB0aW9uSW5pdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2QlNTZm91bmRMaXN0KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci11OCBib0NoYW5GaWx0ZXIoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCBDaGFuTm8pOwotdTE2IHdCU1NhbGxvY2F0ZUVudHJ5KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci11MTYgd0JTU0dldEVudHJ5KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZTaW1wbGVIb3VzZUtlZXBpbmcoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXUxNiB3QlNTaG91c2VLZWVwaW5nKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIENsZWFyQlNTZGVzY3B0KFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IGkpOwotdTE2IHdCU1NmaW5kQnNzSUQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqcGJCc3NpZCk7Ci11MTYgd0JTU2ZpbmREZWRpY2F0ZUNhbmRpZGF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU3NpZCwgdTggKnBiQnNzaWQpOwotdTE2IHdCU1NmaW5kTUFDYWRkcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIpOwotdTE2IHdCU1NzZWFyY2hNQUNhZGRyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKnBiTWFjQWRkciwgdTggYmFuZCk7Ci11MTYgd0JTU2FkZFNjYW5EYXRhKFBXQjMyX0FEQVBURVIsIHUxNiwgcHNSWERBVEEpOwotdTE2IHdCU1NVcGRhdGVTY2FuRGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiB3QnNzSWR4LCBwc1JYREFUQSBwc1JjdkRhdGEpOwotdTE2IHdCU1NjcmVhdGVJQlNTZGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEpOwotdm9pZCBEZXNpcmVkUmF0ZTJCU1NkZXNjcmlwdG9yKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSwKK3ZvaWQgdkJTU2Rlc2NyaXB0aW9uSW5pdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgdkJTU2ZvdW5kTGlzdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3U4IGJvQ2hhbkZpbHRlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCBDaGFuTm8pOwordTE2IHdCU1NhbGxvY2F0ZUVudHJ5KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordTE2IHdCU1NHZXRFbnRyeShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgdlNpbXBsZUhvdXNlS2VlcGluZyhzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3UxNiB3QlNTaG91c2VLZWVwaW5nKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCBDbGVhckJTU2Rlc2NwdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYgaSk7Cit1MTYgd0JTU2ZpbmRCc3NJRChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqcGJCc3NpZCk7Cit1MTYgd0JTU2ZpbmREZWRpY2F0ZUNhbmRpZGF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NzaWQsIHU4ICpwYkJzc2lkKTsKK3UxNiB3QlNTZmluZE1BQ2FkZHIoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKnBiTWFjQWRkcik7Cit1MTYgd0JTU3NlYXJjaE1BQ2FkZHIoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKnBiTWFjQWRkciwgdTggYmFuZCk7Cit1MTYgd0JTU2FkZFNjYW5EYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqLCB1MTYsIHBzUlhEQVRBKTsKK3UxNiB3QlNTVXBkYXRlU2NhbkRhdGEoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IHdCc3NJZHgsIHBzUlhEQVRBIHBzUmN2RGF0YSk7Cit1MTYgd0JTU2NyZWF0ZUlCU1NkYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEpOwordm9pZCBEZXNpcmVkUmF0ZTJCU1NkZXNjcmlwdG9yKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEsCiAJCQkJCQkJIHU4ICpwQmFzaWNSYXRlU2V0LCB1OCBCYXNpY1JhdGVDb3VudCwKIAkJCQkJCQkgdTggKnBPcGVyYXRpb25SYXRlU2V0LCB1OCBPcGVyYXRpb25SYXRlQ291bnQpOwotdm9pZCBEZXNpcmVkUmF0ZTJJbmZvRWxlbWVudChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4CSphZGRyLCB1MTYgKmlGaWxkT2Zmc2V0LAordm9pZCBEZXNpcmVkUmF0ZTJJbmZvRWxlbWVudChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OAkqYWRkciwgdTE2ICppRmlsZE9mZnNldCwKIAkJCQkJCQkgdTggKnBCYXNpY1JhdGVTZXQsIHU4IEJhc2ljUmF0ZUNvdW50LAogCQkJCQkJCSB1OCAqcE9wZXJhdGlvblJhdGVTZXQsIHU4IE9wZXJhdGlvblJhdGVDb3VudCk7Ci12b2lkIEJTU0FkZElCU1NkYXRhKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSk7Cit2b2lkIEJTU0FkZElCU1NkYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEpOwogdW5zaWduZWQgY2hhciBib0NtcE1hY0FkZHIoIHU4ICosIHU4ICopOwogdW5zaWduZWQgY2hhciBib0NtcFNTSUQoc3RydWN0IFNTSURfRWxlbWVudCAqcHNTU0lEMSwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTU0lEMik7Ci11MTYgd0JTU2ZpbmRTU0lEKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkKTsKLXUxNiB3Um9hbWluZ1F1ZXJ5KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZSYXRlVG9CaXRtYXAoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgaW5kZXgpOwotdTggYlJhdGVUb0JpdG1hcEluZGV4KFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggYlJhdGUpOwordTE2IHdCU1NmaW5kU1NJRChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NzaWQpOwordTE2IHdSb2FtaW5nUXVlcnkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIHZSYXRlVG9CaXRtYXAoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IGluZGV4KTsKK3U4IGJSYXRlVG9CaXRtYXBJbmRleChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCBiUmF0ZSk7CiB1OCBiQml0bWFwVG9SYXRlKHU4IGkpOwotdW5zaWduZWQgY2hhciBib0lzRVJQc3RhKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IGkpOwotdW5zaWduZWQgY2hhciBib0NoZWNrQ29ubmVjdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdW5zaWduZWQgY2hhciBib0NoZWNrU2lnbmFsKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIEFkZElCU1NJZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSApOy8vYWRkZWQgYnkgd3MgZm9yIFdQQV9Ob25lMDYvMDEvMDQKLXZvaWQgQnNzU2NhblVwVG9EYXRlKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIEJzc1VwVG9EYXRlKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Cit1bnNpZ25lZCBjaGFyIGJvSXNFUlBzdGEoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IGkpOwordW5zaWduZWQgY2hhciBib0NoZWNrQ29ubmVjdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3Vuc2lnbmVkIGNoYXIgYm9DaGVja1NpZ25hbChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgQWRkSUJTU0llKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsUFdCX0JTU0RFU0NSSVBUSU9OIHBzRGVzRGF0YSApOy8vYWRkZWQgYnkgd3MgZm9yIFdQQV9Ob25lMDYvMDEvMDQKK3ZvaWQgQnNzU2NhblVwVG9EYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCBCc3NVcFRvRGF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKIHZvaWQgUmF0ZVNvcnQodTggKlJhdGVBcnJheSwgdTggbnVtLCB1OCBtb2RlKTsKLXZvaWQgUmF0ZVJlU29ydEZvclNSYXRlKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKlJhdGVBcnJheSwgdTggbnVtKTsKLXZvaWQgQXNzZW1ibGVfSUUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgd0Jzc0lkeCk7Ci12b2lkIFNldE1heFR4UmF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwordm9pZCBSYXRlUmVTb3J0Rm9yU1JhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKlJhdGVBcnJheSwgdTggbnVtKTsKK3ZvaWQgQXNzZW1ibGVfSUUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IHdCc3NJZHgpOwordm9pZCBTZXRNYXhUeFJhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7CiAKLXZvaWQgQ3JlYXRlV3BhSUUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYqIGlGaWxkT2Zmc2V0LCB1OCAqbXNnLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKK3ZvaWQgQ3JlYXRlV3BhSUUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCiAJCQkJIHN0cnVjdCBBc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkqIG1zZ0JvZHksIHUxNiBpTVNpbmRleCk7IC8vYWRkZWQgYnkgV1MgMDUvMTQvMDUKIAogI2lmZGVmIF9XUEEyXwotdm9pZCBDcmVhdGVSc25JRShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiogaUZpbGRPZmZzZXQsIHU4ICptc2csIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAordm9pZCBDcmVhdGVSc25JRShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1MTYqIGlGaWxkT2Zmc2V0LCB1OCAqbXNnLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKIAkJCQkgc3RydWN0IEFzc29jaWF0aW9uX1JlcXVlc3RfRnJhbWVfQm9keSogbXNnQm9keSwgdTE2IGlNU2luZGV4KTsvL2FkZGVkIGJ5IFdTIDA1LzE0LzA1CiAKLXUxNiBTZWFyY2hQbWtpZChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAordTE2IFNlYXJjaFBta2lkKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAogCQkJCSAgIHN0cnVjdCBQTUtJRF9JbmZvcm1hdGlvbl9FbGVtZW50ICogQXNzb1JlcV9QTUtJRCApOwogI2VuZGlmCiAKLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3Nkc2NwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaAppbmRleCA5NzE1MGEyLi4zYTcxZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3Nkc2NwdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmgKQEAgLTEsMyArMSwxMSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfQlNTRFNDUFRfSAorI2RlZmluZSBfX1dJTkJPTkRfQlNTRFNDUFRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1kc19zLmgiCisjaW5jbHVkZSAibWxtZV9zLmgiCisKIC8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIC8vCWJzc2RzY3B0LmMKIC8vCQlCU1MgZGVzY3JpcHRvciBkYXRhIGJhc2UKQEAgLTc4LDggKzg2LDggQEAKICAgICB1MTYJCXdTdGF0ZTsJCQkvLyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3lzdGVtCiAJdTE2CQl3SW5kZXg7CQkJLy8gVEhJUyBCU1MgZWxlbWVudCBlbnRyeSBpbmRleAogCi0Jdm9pZCoJcHNBZGFwdGVyOwkJLy8gcG9pbnRlciB0byBUSElTIEFkYXB0ZXIKLQlPU19USU1FUgluVGltZXI7ICAvLyBNTE1FIHRpbWVyCisJdm9pZCoJcHNhZGFwdGVyOwkJLy8gcG9pbnRlciB0byBUSElTIGFkYXB0ZXIKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsgIC8vIE1MTUUgdGltZXIKIAogICAgIC8vIEF1dGhlbnRpY2F0aW9uCiAgICAgdTE2CQl3QXV0aEFsZ287ICAgICAgLy8gcGVlciBNQUMgTUxNRSB1c2UgQXV0aCBhbGdvcml0aG0sIGRlZmF1bHQgT1BFTl9BVVRICkBAIC0xNDgsOSArMTU2LDkgQEAKIAogfSBXQl9CU1NERVNDUklQVElPTiwgKlBXQl9CU1NERVNDUklQVElPTjsKIAotI2RlZmluZSB3QlNTQ29ubmVjdGVkU1RBKEFkYXB0ZXIpICAgICAgICAgICAgIFwKLSAgICAoKHUxNikoQWRhcHRlciktPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4KQorI2RlZmluZSB3QlNTQ29ubmVjdGVkU1RBKGFkYXB0ZXIpICAgICAgICAgICAgIFwKKyAgICAoKHUxNikoYWRhcHRlciktPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4KQogCi0jZGVmaW5lIHBzQlNTKGkpCQkJKCYoQWRhcHRlci0+YXNCU1NEZXNjcmlwdEVsZW1lbnRbKGkpXSkpCisjZGVmaW5lIHBzQlNTKGkpCQkJKCYoYWRhcHRlci0+YXNCU1NEZXNjcmlwdEVsZW1lbnRbKGkpXSkpCiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDk2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb21tb24uaApAQCAtMCwwICsxLDI3IEBACisvLworLy8gY29tbW9uLmgKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE9TIGRlcGVuZGFudCBkZWZpbml0aW9uIGFuZCBmdW5jdGlvbi4KKy8vIEV2ZXJ5IE9TIGhhcyB0aGlzIGZpbGUgaW5kaXZpZHVhbC4KKy8vCisKKyNkZWZpbmUgRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIF9BICkKKworI2lmbmRlZiBDT01NT05fREVGCisjZGVmaW5lIENPTU1PTl9ERUYKKworLy8jZGVmaW5lIERFQlVHX0VOQUJMRUQgIDEKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ29tbW9uIGZ1bmN0aW9uIGRlZmluaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgREVCVUdfRU5BQkxFRAorI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MJNgorI2lmZGVmIERFQlVHX0VOQUJMRUQKKyNkZWZpbmUgV0JERUJVRyggX00gKQlwcmludGsgX00KKyNlbHNlCisjZGVmaW5lIFdCREVCVUcoIF9NICkJMAorI2VuZGlmCisKKyNlbmRpZiAvLyBDT01NT05fREVGCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE0MmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX19XSU5CT05EX0NPUkVfSAorI2RlZmluZSBfX1dJTkJPTkRfQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiYnNzZHNjcHQuaCIKKyNpbmNsdWRlICJtdG8uaCIKKyNpbmNsdWRlICJ3YmhhbF9zLmgiCisKKyNkZWZpbmUgV0JMSU5VWF9QQUNLRVRfQVJSQVlfU0laRSAoRVRIRVJORVRfVFhfREVTQ1JJUFRPUlMqNCkKKworI2RlZmluZSBXQl9NQVhfTElOS19OQU1FX0xFTiA0MAorCitzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgeworCXUzMiBhZGFwdGVySW5kZXg7CS8vIDIwMDYwNzAzLjQgQWRkIGZvciB1c2luZyBwYWRhcHRlckNvbnRleHQgZ2xvYmFsIGFkYXB0ZXIgcG9pbnQKKworCVdCX0xPQ0FMREVTQ1JJUFQgc0xvY2FsUGFyYTsJLy8gTXlzZWxmIGNvbm5lY3RlZCBwYXJhbWV0ZXJzCisJUFdCX0JTU0RFU0NSSVBUSU9OIGFzQlNTRGVzY3JpcHRFbGVtZW50OworCisJTUxNRV9GUkFNRSBzTWxtZUZyYW1lOwkvLyBjb25uZWN0IHRvIHBlZXJTVEEgcGFyYW1ldGVycworCisJTVRPX1BBUkFNRVRFUlMgc010b1BhcmE7CS8vIE1UT19zdHJ1Y3QgLi4uCisJaHdfZGF0YV90IHNId0RhdGE7CS8vRm9yIEhBTAorCU1EUyBNZHM7CisKKwlzcGlubG9ja190IFNwaW5Mb2NrOworCisJYXRvbWljX3QgVGhyZWFkQ291bnQ7CisKKwl1MzIgUnhCeXRlQ291bnQ7CisJdTMyIFR4Qnl0ZUNvdW50OworCisJc3RydWN0IHNrX2J1ZmYgKnBhY2tldF9yZXR1cm47CisJczMyIG5ldGlmX3N0YXRlX3N0b3A7CS8vIDE6IHN0b3AgIDA6IG5vcm1hbAorCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3X3N0YXRzOworCisJdTggTGlua05hbWVbV0JfTUFYX0xJTktfTkFNRV9MRU5dOworCisJYm9vbCBlbmFibGVkOworfTsKKworI2VuZGlmIC8qIF9fV0lOQk9ORF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2RzX3RraXAuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2RzX3RraXAuaAppbmRleCA2ODQxZDY2Li45YzVjNGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9kc190a2lwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oCkBAIC0xLDMgKzEsOCBAQAorI2lmbmRlZiBfX1dJTkJPTkRfRFNfVEtJUF9ICisjZGVmaW5lIF9fV0lOQk9ORF9EU19US0lQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCiAjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAogICAgICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCkBAIC0yNiw4ICszMSw3IEBACiB9IHRraXBfdDsKIAogLy92b2lkIF9hcHBlbmRfZGF0YSggdTggKnBEYXRhLCB1MTYgc2l6ZSwgdGtpcF90ICpwICk7Ci12b2lkIE1kc19NaWNHZXQoICB2b2lkKiBBZGFwdGVyLCAgdm9pZCogcFJ4TGF5ZXIxLCAgdTggKnBLZXksICB1OCAqcE1pYyApOwotdm9pZCBNZHNfTWljRmlsbCggIHZvaWQqIEFkYXB0ZXIsICB2b2lkKiBwRGVzLCAgdTggKlhtaXRCdWZBZGRyZXNzICk7Cit2b2lkIE1kc19NaWNHZXQoICB2b2lkKiBhZGFwdGVyLCAgdm9pZCogcFJ4TGF5ZXIxLCAgdTggKnBLZXksICB1OCAqcE1pYyApOwordm9pZCBNZHNfTWljRmlsbCggIHZvaWQqIGFkYXB0ZXIsICB2b2lkKiBwRGVzLCAgdTggKlhtaXRCdWZBZGRyZXNzICk7CiAKLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9nbF84MDIxMS5oCmluZGV4IDE4MDZkODEuLjVhMjQ0YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZ2xfODAyMTEuaApAQCAtMSw3ICsxLDggQEAKLQogI2lmbmRlZiBfX0dMXzgwMjExX0hfXwogI2RlZmluZSBfX0dMXzgwMjExX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoqKioqKioqKioqKioqKioqKiBDT05TVEFOVCBBTkQgTUFDUk8gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEJTUyBUeXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJhODZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vCi0vLyBjb21tb24uaAotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgT1MgZGVwZW5kYW50IGRlZmluaXRpb24gYW5kIGZ1bmN0aW9uLgotLy8gRXZlcnkgT1MgaGFzIHRoaXMgZmlsZSBpbmRpdmlkdWFsLgotLy8KLQotI2RlZmluZSBEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggX0EgKQotCi0jaWZuZGVmIENPTU1PTl9ERUYKLSNkZWZpbmUgQ09NTU9OX0RFRgotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAvL25lZWQgZm9yIGtlcm5lbCBhbGVydAotI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8vbWVtb3J5IGFsbG9jYXRlCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ly9uZWVkIGZvciBpbml0IGFuZCBleGl0IG1vZHVsZXMgbWFyY28KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLQotLy8jZGVmaW5lIERFQlVHX0VOQUJMRUQgIDEKLQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDb21tb24gdHlwZSBkZWZpbml0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgSUdOT1JFICAgICAgMgotI2RlZmluZQlTVUNDRVNTICAgICAxCi0jZGVmaW5lCUZBSUxVUkUgICAgIDAKLQotCi0jaWZuZGVmIHRydWUKLSNkZWZpbmUgdHJ1ZSAgICAgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgZmFsc2UKLSNkZWZpbmUgZmFsc2UgICAgICAgMAotI2VuZGlmCi0KLS8vIFBENDMgMjAwMjExMDgKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgICAgICAxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICAgICAwCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUVVNfTUVESUFfQ09OTkVDVCAxCi0jZGVmaW5lIFNUQVRVU19NRURJQV9ESVNDT05ORUNUIDAKLQotI2lmbmRlZiBCSVQKLSNkZWZpbmUgQklUKHgpICAgICAgICAgICAgICAgICAgKDEgPDwgKHgpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHVyYiAqIFBVUkI7Ci0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDb21tb24gZnVuY3Rpb24gZGVmaW5pdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2lmbmRlZiBhYnMKLSNkZWZpbmUgYWJzKF9UKQkJCQkJCQkoKF9UKSA8IDAgPyAtX1QgOiBfVCkKLSNlbmRpZgotI2RlZmluZSBERUJVR19FTkFCTEVECi0jZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2Ci0jaWZkZWYgREVCVUdfRU5BQkxFRAotI2RlZmluZSBXQkRFQlVHKCBfTSApCXByaW50ayBfTQotI2Vsc2UKLSNkZWZpbmUgV0JERUJVRyggX00gKQkwCi0jZW5kaWYKLQotI2RlZmluZSBPU19ESVNDT05ORUNURUQJMAotI2RlZmluZSBPU19DT05ORUNURUQJMQotCi0KLSNkZWZpbmUgT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQotI2RlZmluZSBPU19QTUtJRF9TVEFUVVNfRVZFTlQoIF9BICkKLQotCi0vKiBVZmYsIG5vLCBsb25ncyBhcmUgbm90IGF0b21pYyBvbiBhbGwgYXJjaGl0ZWN0dXJlcyBMaW51eAotICogc3VwcG9ydHMuIFRoaXMgc2hvdWxkIHJlYWxseSB1c2UgYXRvbWljX3QgKi8KLQotI2RlZmluZSBPU19BVE9NSUMJCQl1MzIKLSNkZWZpbmUgT1NfQVRPTUlDX1JFQUQoIF9BLCBfViApCV9WCi0jZGVmaW5lIE9TX0FUT01JQ19JTkMoIF9BLCBfViApCQlFbmNhcEF0b21pY0luYyggX0EsICh2b2lkKilfViApCi0jZGVmaW5lIE9TX0FUT01JQ19ERUMoIF9BLCBfViApCQlFbmNhcEF0b21pY0RlYyggX0EsICh2b2lkKilfViApCi0jZGVmaW5lIE9TX01FTU9SWV9DTEVBUiggX0EsIF9TICkJbWVtc2V0KCAodTggKilfQSwwLF9TKQotI2RlZmluZSBPU19NRU1PUllfQ09NUEFSRSggX0EsIF9CLCBfUyApCShtZW1jbXAoX0EsX0IsX1MpPyAwIDogMSkgLy8gRGVmaW5pdGlvbiBpcyByZXZlcnNlIHdpdGggTmRpcyAxOiB0aGUgc2FtZSAwOiBkaWZmZXJlbnQKLQotI2RlZmluZSBPU19USU1FUglzdHJ1Y3QgdGltZXJfbGlzdAotI2RlZmluZSBPU19USU1FUl9JTklUSUFMKCBfVCwgX0YsIF9QICkJCQlcCi17CQkJCQkJCVwKLQlpbml0X3RpbWVyKCBfVCApOwkJCQlcCi0JKF9UKS0+ZnVuY3Rpb24gPSAodm9pZCAqKV9GIyNfMWE7CQlcCi0JKF9UKS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKV9QOwkJCVwKLX0KLQotLy8gX1MgOiBNaWxsaXNlY29uZAotLy8gMjAwNjA0MjAgQXQgbGVhc3QgMSBsYXJnZSB0aGFuIGppZmZpZXMKLSNkZWZpbmUgT1NfVElNRVJfU0VUKCBfVCwgX1MgKQkJCQkJXAotewkJCQkJCQkJXAotCShfVCktPmV4cGlyZXMgPSBqaWZmaWVzICsgKChfUypIWis5OTkpLzEwMDApO1wKLQlhZGRfdGltZXIoIF9UICk7CQkJCQlcCi19Ci0jZGVmaW5lIE9TX1RJTUVSX0NBTkNFTCggX1QsIF9CICkJCWRlbF90aW1lcl9zeW5jKCBfVCApCi0jZGVmaW5lIE9TX1RJTUVSX0dFVF9TWVNfVElNRSggX1QgKQkJKCpfVD1qaWZmaWVzKQotCi0KLSNlbmRpZiAvLyBDT01NT05fREVGCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3N5c2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvc3lzZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NmQ2M2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvc3lzZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0KLQotLy8KLS8vIFdpbmJvbmQgV0xBTiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBkZWZpbmVzCi0vLwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQ3VycmVudCBkaXJlY3RvcnkgaXMgTGludXgKLS8vIFRoZSBkZWZpbml0aW9uIFdCX0xJTlVYIGlzIGEga2V5d29yZCBmb3IgdGhpcyBPUwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpZm5kZWYgU1lTX0RFRl9ICi0jZGVmaW5lIFNZU19ERUZfSAotI2RlZmluZSBXQl9MSU5VWAotI2RlZmluZSBXQl9MSU5VWF9XUEFfUFNLCi0KLQotLy8jZGVmaW5lIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi0jZGVmaW5lIF9VU0VfRkFMTEJBQ0tfUkFURV8KLS8vI2RlZmluZSBBTlRESVZfREVGQVVMVF9PTgotCi0jZGVmaW5lIF9XUEEyXwkvLyAyMDA2MTEyMiBJdCdzIG5lZWRlZCBmb3IgY3VycmVudCBMaW51eCBkcml2ZXIKLQotCi0jaWZuZGVmIF9XUEFfUFNLX0RFQlVHCi0jdW5kZWYgIF9XUEFfUFNLX0RFQlVHCi0jZW5kaWYKLQotLy8gZGVidWcgcHJpbnQgb3B0aW9ucywgbWFyayB3aGF0IGRlYnVnIHlvdSBkb24ndCBuZWVkCi0KLSNpZmRlZiBGVUxMX0RFQlVHCi0jZGVmaW5lIF9QRV9TVEFURV9EVU1QXwotI2RlZmluZSBfUEVfVFhfRFVNUF8KLSNkZWZpbmUgX1BFX1JYX0RVTVBfCi0jZGVmaW5lIF9QRV9PSURfRFVNUF8KLSNkZWZpbmUgX1BFX0RUT19EVU1QXwotI2RlZmluZSBfUEVfUkVHX0RVTVBfCi0jZGVmaW5lIF9QRV9VU0JfSU5JX0RVTVBfCi0jZW5kaWYKLQotCi0KLSNpbmNsdWRlICJjb21tb24uaCIJLy8gSW5kaXZpZHVhbCBmaWxlIGRlcGVuZHMgb24gT1MKLQotI2luY2x1ZGUgIi4uL3diMzVfdmVyLmgiCi0jaW5jbHVkZSAiLi4vbWFjX3N0cnVjdHVyZXMuaCIKLSNpbmNsdWRlICIuLi9kc190a2lwLmgiCi0jaW5jbHVkZSAiLi4vbG9jYWxwYXJhLmgiCi0jaW5jbHVkZSAiLi4vc21lX3MuaCIKLSNpbmNsdWRlICIuLi9zY2FuX3MuaCIKLSNpbmNsdWRlICIuLi9tZHNfcy5oIgotI2luY2x1ZGUgIi4uL21sbWVfcy5oIgotI2luY2x1ZGUgIi4uL2Jzc2RzY3B0LmgiCi0jaW5jbHVkZSAiLi4vc21lX2FwaS5oIgotI2luY2x1ZGUgIi4uL2dsXzgwMjExLmgiCi0jaW5jbHVkZSAiLi4vbXRvLmgiCi0jaW5jbHVkZSAiLi4vd2JsaW51eF9zLmgiCi0jaW5jbHVkZSAiLi4vd2JoYWxfcy5oIgotCi0KLSNpbmNsdWRlICIuLi9hZGFwdGVyLmgiCi0KLSNpbmNsdWRlICIuLi9tbG1lX21pYi5oIgotI2luY2x1ZGUgIi4uL21kc19mLmgiCi0jaW5jbHVkZSAiLi4vYnNzX2YuaCIKLSNpbmNsdWRlICIuLi9tbG1ldHhyeF9mLmgiCi0jaW5jbHVkZSAiLi4vbXRvX2YuaCIKLSNpbmNsdWRlICIuLi93YmhhbF9mLmgiCi0jaW5jbHVkZSAiLi4vd2JsaW51eF9mLmgiCi0vLyBLZXJuZWwgVGltZXIgcmVzb2x1dGlvbiwgTkRJUyBpcyAxMG1zLCAxMDAwMHVzCi0jZGVmaW5lIE1JTl9USU1FT1VUX1ZBTAkoMTApIC8vbXMKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNmRiNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotI2luY2x1ZGUgInN5c2RlZi5oIgotCi1leHRlcm4gdm9pZCBwaHlfY2FsaWJyYXRpb25fd2luYm9uZChod19kYXRhX3QgKnBod19kYXRhLCB1MzIgZnJlcXVlbmN5KTsKLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIFJlZ2lzdGVyTm8gOiBzdGFydCBiYXNlCi0vLyBwUmVnaXN0ZXJEYXRhIDogZGF0YSBwb2ludAotLy8gTnVtYmVyT2ZEYXRhIDogbnVtYmVyIG9mIHJlZ2lzdGVyIGRhdGEKLS8vIEZsYWcgOiBBVVRPX0lOQ1JFTUVOVCAtIFJlZ2lzdGVyTm8gd2lsbCBhdXRvIGluY3JlbWVudCA0Ci0vLwkJICBOT19JTkNSRU1FTlQgLSBGdW5jdGlvbiB3aWxsIHdyaXRlIGRhdGEgaW50byB0aGUgc2FtZSByZWdpc3RlcgotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19CdXJzdFdyaXRlKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiAqIHBSZWdpc3RlckRhdGEsIHU4IE51bWJlck9mRGF0YSwgdTggRmxhZykKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBVUkIJCXBVcmIgPSBOVUxMOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlID0gTlVMTDsKLQl1MTYJCVVyYlNpemU7Ci0Jc3RydWN0ICAgICAgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLQl1MTYJCWksIERhdGFTaXplID0gTnVtYmVyT2ZEYXRhKjQ7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIFRyeWluZyB0byB1c2UgYnVyc3Qgd3JpdGUgZnVuY3Rpb24gaWYgdXNlIG5ldyBoYXJkd2FyZQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIERhdGFTaXplICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQyggKHZvaWQqICopJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmKCBwVXJiICYmIHBSZWdRdWV1ZSApIHsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAyOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCi0JCXBSZWdRdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOwotCQlwUmVnUXVldWUtPnBCdWZmZXIgPSAodTMyICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJbWVtY3B5KCBwUmVnUXVldWUtPnBCdWZmZXIsIHBSZWdpc3RlckRhdGEsIERhdGFTaXplICk7Ci0JCS8vdGhlIGZ1bmN0aW9uIGZvciByZXZlcnNpbmcgcmVnaXN0ZXIgZGF0YSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgotCQlmb3IoIGk9MDsgaTxOdW1iZXJPZkRhdGEgOyBpKysgKQotCQkJcFJlZ1F1ZXVlLT5wQnVmZmVyW2ldID0gY3B1X3RvX2xlMzIoIHBSZWdRdWV1ZS0+cEJ1ZmZlcltpXSApOwotCi0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkgKyBEYXRhU2l6ZSk7Ci0JCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0U7Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDQ7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KCBGbGFnICk7IC8vIDA6IFJlZ2lzdGVyIG51bWJlciBhdXRvLWluY3JlbWVudCwgMTogTm8gYXV0byBpbmNyZW1lbnQKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KCBSZWdpc3Rlck5vICk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoIERhdGFTaXplICk7Ci0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCi0JCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmIChwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwpCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKLQotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJaWYgKHBSZWdRdWV1ZSkKLQkJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0gICByZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQKLVdiMzVSZWdfVXBkYXRlKHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlzd2l0Y2ggKFJlZ2lzdGVyTm8pIHsKLQljYXNlIDB4M2IwOiBwV2IzNVJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgzYmM6IHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg0MDA6IHBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDA6IHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MDQ6IHBXYjM1UmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODA4OiBwV2IzNVJlZy0+TTA4X011bHRpY2FzdEFkZHJlc3MyID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyNDogcFdiMzVSZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyODogcFdiMzVSZWctPk0yOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgyYzogcFdiMzVSZWctPk0yQ19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgzODogcFdiMzVSZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0MDogcFdiMzVSZWctPk00MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0NDogcFdiMzVSZWctPk00NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0ODogcFdiMzVSZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg0YzogcFdiMzVSZWctPk00Q19NYWNTdGF0dXMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODYwOiBwV2IzNVJlZy0+TTYwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODY4OiBwV2IzNVJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODcwOiBwV2IzNVJlZy0+TTcwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODc0OiBwV2IzNVJlZy0+TTc0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODc4OiBwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3QzogcFdiMzVSZWctPk03Q19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4MDogcFdiMzVSZWctPk04MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4NDogcFdiMzVSZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg4ODogcFdiMzVSZWctPk04OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg5ODogcFdiMzVSZWctPk05OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMGM6IHBXYjM1UmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMmM6IHBXYjM1UmVnLT5CQjJDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwMzA6IHBXYjM1UmVnLT5CQjMwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwM2M6IHBXYjM1UmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNDg6IHBXYjM1UmVnLT5CQjQ4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNGM6IHBXYjM1UmVnLT5CQjRDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTA6IHBXYjM1UmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTQ6IHBXYjM1UmVnLT5CQjU0ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNTg6IHBXYjM1UmVnLT5CQjU4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNWM6IHBXYjM1UmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDEwNjA6IHBXYjM1UmVnLT5CQjYwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JfQotfQotCi0vLyBUUlVFICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQotLy8gRkFMU0UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCWludCByZXQgPSAtMTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMTsKLQotCS8vIDIwMDYwNzE3LjUgV2FpdCB1bnRpbCBFUDBWTSBzdG9wCi0Jd2hpbGUgKHBXYjM1UmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKQotCQlPU19TTEVFUCgxMDAwMCk7Ci0KLQkvLyBTeW5jIElvQ2FsbERyaXZlcgotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZSggcEh3RGF0YS0+V2JVc2IudWRldiwgMCApLAotCQkJICAgICAgIDB4MDMsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX09VVCwKLQkJCSAgICAgICAweDAsUmVnaXN0ZXJObywgJlJlZ2lzdGVyVmFsdWUsIDQsIEhaKjEwMCApOwotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMDsKLQotCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQkjaWZkZWYgX1BFX1JFR19EVU1QXwotCQlXQkRFQlVHKCgiRVAwIFdyaXRlIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKLQkJI2VuZGlmCi0KLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwotCVBVUkIJCXBVcmIgPSBOVUxMOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlID0gTlVMTDsKLQl1MTYJCVVyYlNpemU7Ci0KLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQyggKHZvaWQqICopJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmIChwVXJiICYmIHBSZWdRdWV1ZSkgewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKLQkJcFJlZ1F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IEZBTFNFOwotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKLQkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQotCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOwotCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOwotCi0JCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCi0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCi0JCXNwaW5fbG9ja19pcnEoJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYgKHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCkKLQkJCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwUmVnUXVldWU7Ci0JCWVsc2UKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdC0+TmV4dCA9IHBSZWdRdWV1ZTsKLQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gcFJlZ1F1ZXVlOwotCi0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKHBVcmIpOwotCQlrZnJlZShwUmVnUXVldWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0vL1RoaXMgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggYSB1c2VyIGRlZmluZWQgdmFsdWUuIFdoZW4gaXQgY29tcGxldGVzLAotLy90aGlzIHZhbHVlIGlzIHVzZWZ1bC4gRm9yIGV4YW1wbGUsIGhhbF9zZXRfY3VycmVudF9jaGFubmVsIHdpbGwgdXNlIGl0LgotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyIFJlZ2lzdGVyVmFsdWUsCi0JCQkJczggKnBWYWx1ZSwgczggTGVuKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0Jc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0JUFVSQgkJcFVyYiA9IE5VTEw7Ci0JUFJFR19RVUVVRQlwUmVnUXVldWUgPSBOVUxMOwotCXUxNgkJVXJiU2l6ZTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVXJiU2l6ZSA9IHNpemVvZihSRUdfUVVFVUUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOwotCU9TX01FTU9SWV9BTExPQygodm9pZCogKikgJnBSZWdRdWV1ZSwgVXJiU2l6ZSApOwotCXBVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmIChwVXJiICYmIHBSZWdRdWV1ZSkgewotCQlwUmVnUXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKLQkJLy9OT1RFIDogVXNlcnMgbXVzdCBndWFyYW50ZWUgdGhlIHNpemUgb2YgdmFsdWUgd2lsbCBub3QgZXhjZWVkIHRoZSBidWZmZXIgc2l6ZS4KLQkJbWVtY3B5KHBSZWdRdWV1ZS0+UkVTRVJWRUQsIHBWYWx1ZSwgTGVuKTsKLQkJcFJlZ1F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IFRSVUU7Ci0JCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcFJlZ1F1ZXVlICsgc2l6ZW9mKFJFR19RVUVVRSkpOwotCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfT1VUIHxVU0JfUkVDSVBfREVWSUNFOwotCQlkci0+YlJlcXVlc3QgPSAweDAzOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCi0JCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOwotCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoUmVnaXN0ZXJObyk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoNCk7Ci0KLQkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKLQkJcFJlZ1F1ZXVlLT5OZXh0ID0gTlVMTDsKLQkJcFJlZ1F1ZXVlLT5wVXNiUmVxID0gZHI7Ci0JCXBSZWdRdWV1ZS0+cFVyYiA9IHBVcmI7Ci0JCXNwaW5fbG9ja19pcnEgKCZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmKCBwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwgKQotCQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBSZWdRdWV1ZTsKLQkJZWxzZQotCQkJcFdiMzVSZWctPnBSZWdMYXN0LT5OZXh0ID0gcFJlZ1F1ZXVlOwotCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBwUmVnUXVldWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxICggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQkvLyBTdGFydCBFUDBWTQotCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCi11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JdTMyICoJcGx0bXAgPSBwUmVnaXN0ZXJWYWx1ZTsKLQlpbnQgcmV0ID0gLTE7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIFJlYWQgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXNiIG1lc3NhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXBXYjM1UmVnLT5TeW5jSW9QYXVzZSA9IDE7Ci0KLQkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAotCXdoaWxlIChwV2IzNVJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKLQkJT1NfU0xFRVAoMTAwMDApOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDApLAotCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCi0JCQkgICAgICAgMHgwLCBSZWdpc3Rlck5vLCBwbHRtcCwgNCwgSFoqMTAwICk7Ci0KLQkqcFJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMigqcGx0bXApOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQotCVdiMzVSZWdfVXBkYXRlKCBwSHdEYXRhLCBSZWdpc3Rlck5vLCAqcFJlZ2lzdGVyVmFsdWUgKTsKLQlwV2IzNVJlZy0+U3luY0lvUGF1c2UgPSAwOwotCi0JV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOwotCi0JaWYgKHJldCA8IDApIHsKLQkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJV0JERUJVRygoIkVQMCBSZWFkIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKLQkJI2VuZGlmCi0KLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLS8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCi11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1JlYWQocGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgIHUzMiAqIHBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiBkcjsKLQlQVVJCCQlwVXJiOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCXUxNgkJVXJiU2l6ZTsKLQotCS8vIE1vZHVsZSBzaHV0ZG93bgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gdXBkYXRlIHRoZSB2YXJpYWJsZSBieSBzZW5kIFVyYiB0byByZWFkIHJlZ2lzdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKLQlPU19NRU1PUllfQUxMT0MoICh2b2lkKiAqKSZwUmVnUXVldWUsIFVyYlNpemUgKTsKLQlwVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiggcFVyYiAmJiBwUmVnUXVldWUgKQotCXsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAwOy8vIHJlYWQgcmVnaXN0ZXIKLQkJcFJlZ1F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87Ci0JCXBSZWdRdWV1ZS0+cEJ1ZmZlciA9IHBSZWdpc3RlclZhbHVlOwotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU47Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDE7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7Ci0JCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiAoUmVnaXN0ZXJObyk7Ci0JCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYgKDQpOwotCi0JCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCi0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCQlzcGluX2xvY2tfaXJxICggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYoIHBXYjM1UmVnLT5wUmVnRmlyc3QgPT0gTlVMTCApCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOwotCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCWlmIChwVXJiKQotCQkJdXNiX2ZyZWVfdXJiKCBwVXJiICk7Ci0JCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLQotdm9pZAotV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmIChPU19BVE9NSUNfSU5DKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCkgPT0gMSkgewotCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCApOwotfQotCi12b2lkCi1XYjM1UmVnX0VQMFZNKHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQVVJCCQlwVXJiOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwotCXUzMiAqCQlwQnVmZmVyOwotCWludAkJCXJldCA9IC0xOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQlpZiAocFdiMzVSZWctPlN5bmNJb1BhdXNlKQotCQlnb3RvIGNsZWFudXA7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIEdldCB0aGUgcmVnaXN0ZXIgZGF0YSBhbmQgc2VuZCB0byBVU0IgdGhyb3VnaCBJcnAKLQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JaWYgKCFwUmVnUXVldWUpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIEdldCBhbiBVcmIsIHNlbmQgaXQKLQlwVXJiID0gKFBVUkIpcFJlZ1F1ZXVlLT5wVXJiOwotCi0JZHIgPSBwUmVnUXVldWUtPnBVc2JSZXE7Ci0JcFVyYiA9IHBSZWdRdWV1ZS0+cFVyYjsKLQlwQnVmZmVyID0gcFJlZ1F1ZXVlLT5wQnVmZmVyOwotCWlmIChwUmVnUXVldWUtPkRJUkVDVCA9PSAxKSAvLyBvdXRwdXQKLQkJcEJ1ZmZlciA9ICZwUmVnUXVldWUtPlZBTFVFOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICBSRUdfRElSRUNUSU9OKHBId0RhdGEtPldiVXNiLnVkZXYscFJlZ1F1ZXVlKSwKLQkJCSAgICAgICh1OCAqKWRyLHBCdWZmZXIsY3B1X3RvX2xlMTYoZHItPndMZW5ndGgpLAotCQkJICAgICAgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZSwgKHZvaWQqKXBId0RhdGEpOwotCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQotCXJldCA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0KLQlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJV0JERUJVRygoIkVQMCBJcnAgc2VuZGluZyBlcnJvclxuIikpOwotI2VuZGlmCi0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlyZXR1cm47Ci0KLSBjbGVhbnVwOgotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UmVnLT5SZWdGaXJlQ291bnQgKTsKLX0KLQotCi12b2lkCi1XYjM1UmVnX0VQMFZNX2NvbXBsZXRlKFBVUkIgcFVyYikKLXsKLQlwaHdfZGF0YV90ICBwSHdEYXRhID0gKHBod19kYXRhX3QpcFVyYi0+Y29udGV4dDsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1UmVnLT5FUDBWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIHsgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQotCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSZWctPlJlZ0ZpcmVDb3VudCApOwotCX0gZWxzZSB7Ci0JCS8vIENvbXBsZXRlIHRvIHNlbmQsIHJlbW92ZSB0aGUgVVJCIGZyb20gdGhlIGZpcnN0Ci0JCXNwaW5fbG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0JCWlmIChwUmVnUXVldWUgPT0gcFdiMzVSZWctPnBSZWdMYXN0KQotCQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gTlVMTDsKLQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBXYjM1UmVnLT5wUmVnRmlyc3QtPk5leHQ7Ci0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQlpZiAocFdiMzVSZWctPkVQMFZNX3N0YXR1cykgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJCVdCREVCVUcoKCJFUDAgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7Ci0JCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcFdiMzVSZWctPkVQMFZNX3N0YXR1cyApOwotI2VuZGlmCi0JCQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwotCQl9IGVsc2UgewotCQkJLy8gU3VjY2Vzcy4gVXBkYXRlIHRoZSByZXN1bHQKLQotCQkJLy8gU3RhcnQgdGhlIG5leHQgc2VuZAotCQkJV2IzNVJlZ19FUDBWTShwSHdEYXRhKTsKLQkJfQotCi0gICAJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JfQotCi0JdXNiX2ZyZWVfdXJiKHBVcmIpOwotfQotCi0KLXZvaWQKLVdiMzVSZWdfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQVVJCCQlwVXJiOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlOwotCi0KLQlVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZShwSHdEYXRhKTsKLQotCS8vIFdhaXQgZm9yIFJlZyBvcGVyYXRpb24gY29tcGxldGVkCi0JZG8gewotCQlPU19TTEVFUCgxMDAwMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKLQl9IHdoaWxlIChwV2IzNVJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCk7Ci0JT1NfU0xFRVAoMTAwMDApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYgotCi0JLy8gUmVsZWFzZSBhbGwgdGhlIGRhdGEgaW4gUmVnUXVldWUKLQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0Jd2hpbGUgKHBSZWdRdWV1ZSkgewotCQlpZiAocFJlZ1F1ZXVlID09IHBXYjM1UmVnLT5wUmVnTGFzdCkKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdCA9IE5VTEw7Ci0JCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0LT5OZXh0OwotCi0JCXBVcmIgPSBwUmVnUXVldWUtPnBVcmI7Ci0JCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQkJaWYgKHBVcmIpIHsKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkjaWZkZWYgX1BFX1JFR19EVU1QXwotCQkJV0JERUJVRygoIkVQMCBxdWV1ZSByZWxlYXNlIGVycm9yXG4iKSk7Ci0JCQkjZW5kaWYKLQkJfQotCQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCXBSZWdRdWV1ZSA9IHBXYjM1UmVnLT5wUmVnRmlyc3Q7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRoZSBmdW5jdGlvbiBjYW4gYmUgcnVuIGluIHBhc3NpdmUtbGV2ZWwgb25seS4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWc9JnBId0RhdGEtPldiMzVSZWc7Ci0JdTMyIGx0bXA7Ci0JdTMyIFNvZnR3YXJlU2V0LCBWQ09fdHJpbSwgVHhWZ2EsIFJlZ2lvbl9TY2FuSW50ZXJ2YWw7Ci0KLQkvLyBTcGluIGxvY2sgaXMgYWNxdWlyZWQgZm9yIHJlYWQgYW5kIHdyaXRlIElSUCBjb21tYW5kCi0Jc3Bpbl9sb2NrX2luaXQoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkvLyBHZXR0aW5nIFJGIG1vZHVsZSB0eXBlIGZyb20gRUVQUk9NIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgwZDAwMDAgKTsgLy8gU3RhcnQgRUVQUk9NIGFjY2VzcyArIFJlYWQgKyBhZGRyZXNzKDB4MGQpCi0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmbHRtcCApOwotCi0JLy9VcGRhdGUgUkYgbW9kdWxlIHR5cGUgYW5kIGRldGVybWluZSB0aGUgUEhZIHR5cGUgYnkgaW5mIG9yIEVFUFJPTQotCXBXYjM1UmVnLT5FRVBST01QaHlUeXBlID0gKHU4KSggbHRtcCAmIDB4ZmYgKTsKLQkvLyAwIFYgTUFYMjgyNSwgMSBWIE1BWDI4MjcsIDIgViBNQVgyODI4LCAzIFYgTUFYMjgyOQotCS8vIDE2ViBBTDIyMzAsIDE3IC0gQUw3MjMwLCAxOCAtIEFMMjIzMFMKLQkvLyAzMiBSZXNlcnZlZAotCS8vIDMzIC0gVzg5UkYyNDIoVHhWR0EgMH4xOSksIDM0IC0gVzg5UkYyNDIoVHhWR0EgMH4zNCkKLQlpZiAocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgIT0gUkZfREVDSURFX0JZX0lORikgewotCQlpZiggKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjUpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNykJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI4KQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjkpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fVjEpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzApCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzBTKSAgICB8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV83MjMwKQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX1dCXzI0MikJCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfV0JfMjQyXzEpKQotCQkJcEh3RGF0YS0+cGh5X3R5cGUgPSBwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZTsKLQl9Ci0KLQkvLyBQb3dlciBPbiBwcm9jZWR1cmUgcnVubmluZy4gVGhlIHJlbGF0aXZlIHBhcmFtZXRlciB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gcGh5X3R5cGUKLQlVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCBwSHdEYXRhICk7Ci0KLQkvLyBSZWFkaW5nIE1BQyBhZGRyZXNzCi0JVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoIHBId0RhdGEgKTsKLQotCS8vIFJlYWQgVkNPIHRyaW0gZm9yIFJGIHBhcmFtZXRlcgotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMDAwMDAgKTsKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZWQ09fdHJpbSApOwotCi0JLy8gUmVhZCBBbnRlbm5hIE9uL09mZiBvZiBzb2Z0d2FyZSBmbGFnCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIxMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlNvZnR3YXJlU2V0ICk7Ci0KLQkvLyBSZWFkIFRYVkdBCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODEwMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlR4VmdhICk7Ci0KLQkvLyBHZXQgU2NhbiBpbnRlcnZhbCBzZXR0aW5nIGZyb20gRUVQUk9NIG9mZnNldCAweDFjCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODFkMDAwMCApOwotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlJlZ2lvbl9TY2FuSW50ZXJ2YWwgKTsKLQotCS8vIFVwZGF0ZSBFdGhlcm5ldCBhZGRyZXNzCi0JbWVtY3B5KCBwSHdEYXRhLT5DdXJyZW50TWFjQWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgRVRIX0xFTkdUSF9PRl9BRERSRVNTICk7Ci0KLQkvLyBVcGRhdGUgc29mdHdhcmUgdmFyaWFibGUKLQlwSHdEYXRhLT5Tb2Z0d2FyZVNldCA9ICh1MTYpKFNvZnR3YXJlU2V0ICYgMHhmZmZmKTsKLQlUeFZnYSAmPSAweDAwMDAwMGZmOwotCXBId0RhdGEtPlBvd2VySW5kZXhGcm9tRUVQUk9NID0gKHU4KVR4VmdhOwotCXBId0RhdGEtPlZDT190cmltID0gKHU4KVZDT190cmltICYgMHhmZjsKLQlpZiAocEh3RGF0YS0+VkNPX3RyaW0gPT0gMHhmZikKLQkJcEh3RGF0YS0+VkNPX3RyaW0gPSAweDI4OwotCi0JcFdiMzVSZWctPkVFUFJPTVJlZ2lvbiA9ICh1OCkoUmVnaW9uX1NjYW5JbnRlcnZhbD4+OCk7IC8vIDIwMDYwNzIwCi0JaWYoIHBXYjM1UmVnLT5FRVBST01SZWdpb248MSB8fCBwV2IzNVJlZy0+RUVQUk9NUmVnaW9uPjYgKQotCQlwV2IzNVJlZy0+RUVQUk9NUmVnaW9uID0gUkVHSU9OX0FVVE87Ci0KLQkvL0ZvciBHZXQgVHggVkdBIGZyb20gRUVQUk9NIDIwMDYwMzE1LjUgbW92ZSBoZXJlCi0JR2V0VHhWZ2FGcm9tRUVQUk9NKCBwSHdEYXRhICk7Ci0KLQkvLyBTZXQgU2NhbiBJbnRlcnZhbAotCXBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWwgJiAweGZmKSAqIDEwOwotCWlmICgocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9PSAyNTUwKSB8fCAocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA8IDEwKSkgLy8gSXMgZGVmYXVsdCBzZXR0aW5nIDB4ZmYgKiAxMAotCQlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gU0NBTl9NQVhfQ0hOTF9USU1FOwotCi0JLy8gSW5pdGlhbCByZWdpc3RlcgotCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKLQotCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIHdyaXRlLCBtdXN0IHdhaXQgdW50aWwgY29tcGxldGUKLQotCVdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKHBId0RhdGEpOwotCi0JTXh4X2luaXRpYWwocEh3RGF0YSk7Ci0JRHh4X2luaXRpYWwocEh3RGF0YSk7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBUUlVFOyAvLyBJbml0aWFsIGZhaWwKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENhcmRDb21wdXRlQ3JjIC0tCi0vLwotLy8gIERlc2NyaXB0aW9uOgotLy8gICAgUnVucyB0aGUgQVVUT0RJTiBJSSBDUkMgYWxnb3JpdGhtIG9uIGJ1ZmZlciBCdWZmZXIgb2YgbGVuZ3RoLCBMZW5ndGguCi0vLwotLy8gIEFyZ3VtZW50czoKLS8vICAgIEJ1ZmZlciAtIHRoZSBpbnB1dCBidWZmZXIKLS8vICAgIExlbmd0aCAtIHRoZSBsZW5ndGggb2YgQnVmZmVyCi0vLwotLy8gIFJldHVybiBWYWx1ZToKLS8vICAgIFRoZSAzMi1iaXQgQ1JDIHZhbHVlLgotLy8KLS8vICBOb3RlOgotLy8gICAgVGhpcyBpcyBhZGFwdGVkIGZyb20gdGhlIGNvbW1lbnRzIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZQotLy8gICAgdmVyc2lvbiBpbiBfR0VOUkVRLkFTTSBvZiB0aGUgRFdCIE5FMTAwMC8yMDAwIGRyaXZlci4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdTMyCi1DYXJkQ29tcHV0ZUNyYyh1OCAqIEJ1ZmZlciwgdTMyIExlbmd0aCkKLXsKLSAgICB1MzIgQ3JjLCBDYXJyeTsKLSAgICB1MzIgIGksIGo7Ci0gICAgdTggQ3VyQnl0ZTsKLQotICAgIENyYyA9IDB4ZmZmZmZmZmY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTGVuZ3RoOyBpKyspIHsKLQotICAgICAgICBDdXJCeXRlID0gQnVmZmVyW2ldOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQotICAgICAgICAgICAgQ2FycnkgICAgID0gKChDcmMgJiAweDgwMDAwMDAwKSA/IDEgOiAwKSBeIChDdXJCeXRlICYgMHgwMSk7Ci0gICAgICAgICAgICBDcmMgICAgIDw8PSAxOwotICAgICAgICAgICAgQ3VyQnl0ZSA+Pj0gMTsKLQotICAgICAgICAgICAgaWYgKENhcnJ5KSB7Ci0gICAgICAgICAgICAgICAgQ3JjID0oQ3JjIF4gMHgwNGMxMWRiNikgfCBDYXJyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBDcmM7Ci19Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEJpdFJldmVyc2UgLS0KLS8vICAgUmV2ZXJzZSB0aGUgYml0cyBpbiB0aGUgaW5wdXQgYXJndW1lbnQsIGR3RGF0YSwgd2hpY2ggaXMKLS8vICAgcmVnYXJkZWQgYXMgYSBzdHJpbmcgb2YgYml0cyB3aXRoIHRoZSBsZW5ndGgsIERhdGFMZW5ndGguCi0vLwotLy8gQXJndW1lbnRzOgotLy8gICBkd0RhdGEgICAgIDoKLS8vICAgRGF0YUxlbmd0aCA6Ci0vLwotLy8gUmV0dXJuOgotLy8gICBUaGUgY29udmVydGVkIHZhbHVlLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXUzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCkKLXsKLQl1MzIgICBIYWxmTGVuZ3RoLCBpLCBqOwotCXUzMiAgIEJpdEEsIEJpdEI7Ci0KLQlpZiAoIERhdGFMZW5ndGggPD0gMCkgICAgICAgcmV0dXJuIDA7ICAgLy8gTm8gY29udmVyc2lvbiBpcyBkb25lLgotCWR3RGF0YSA9IGR3RGF0YSAmICgweGZmZmZmZmZmID4+ICgzMiAtIERhdGFMZW5ndGgpKTsKLQotCUhhbGZMZW5ndGggPSBEYXRhTGVuZ3RoIC8gMjsKLQlmb3IgKCBpID0gMCwgaiA9IERhdGFMZW5ndGgtMSA7IGkgPCBIYWxmTGVuZ3RoOyBpKyssIGotLSkKLQl7Ci0JCUJpdEEgPSBHZXRCaXQoIGR3RGF0YSwgaSk7Ci0JCUJpdEIgPSBHZXRCaXQoIGR3RGF0YSwgaik7Ci0JCWlmIChCaXRBICYmICFCaXRCKSB7Ci0JCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBpKTsKLQkJCWR3RGF0YSA9IFNldEJpdCggZHdEYXRhLCBqKTsKLQkJfSBlbHNlIGlmICghQml0QSAmJiBCaXRCKSB7Ci0JCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaSk7Ci0JCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBqKTsKLQkJfSBlbHNlCi0JCXsKLQkJCS8vIERvIG5vdGhpbmcgc2luY2UgdGhlc2UgdHdvIGJpdHMgYXJlIG9mIHRoZSBzYXZlIHZhbHVlcy4KLQkJfQotCX0KLQotCXJldHVybiBkd0RhdGE7Ci19Ci0KLXZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCXUzMiBCQjNjLCBCQjU0OwotCi0JaWYgKChwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDIpIHx8Ci0JCShwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDJfMSkpIHsKLQkJcGh5X2NhbGlicmF0aW9uX3dpbmJvbmQgKCBwSHdEYXRhLCAyNDEyICk7IC8vIFN5bmMgb3BlcmF0aW9uCi0JCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTAzYywgJkJCM2MgKTsKLQkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgxMDU0LCAmQkI1NCApOwotCi0JCXBId0RhdGEtPkJCM2NfY2FsID0gQkIzYzsKLQkJcEh3RGF0YS0+QkI1NF9jYWwgPSBCQjU0OwotCi0JCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKLQkJQkJQcm9jZXNzb3JfaW5pdGlhbChwSHdEYXRhKTsgLy8gQXN5bmMgb3BlcmF0aW9uCi0KLQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTAzYywgQkIzYyApOwotCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDU0LCBCQjU0ICk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDZjZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFV4eF9SZWFkRXRoZXJuZXRBZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIER4eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIE14eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFJGU3ludGhlc2l6ZXJfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotLy92b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHM4IENoYW5uZWwgKTsKLXZvaWQgUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCApOwotdm9pZCBCQlByb2Nlc3Nvcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIEJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MTMuMQotLy92b2lkIFJGX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MjYuNS5jIEFkZAotdTggUkZTeW50aGVzaXplcl9TZXRQb3dlckluZGV4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUG93ZXJJbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjVQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRBaXJvaGEyMjMwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhNzIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldFdpbmJvbmQyNDJQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdm9pZCBHZXRUeFZnYUZyb21FRVBST00oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgRUVQUk9NVHhWZ2FBZGp1c3QoICBwaHdfZGF0YV90IHBId0RhdGEgKTsgLy8gMjAwNjA2MTkuNSBBZGQKLQotI2RlZmluZSBSRldyaXRlQ29udHJvbERhdGEoIF9BLCBfViApIFdiMzVSZWdfV3JpdGUoIF9BLCAweDA4NjQsIF9WICkKLQotdm9pZCBXYjM1UmVnX2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotdW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWQoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggIHBod19kYXRhX3QgcEh3RGF0YSwKLQkJCQkJCQkJIHUxNiBSZWdpc3Rlck5vLAotCQkJCQkJCQkgdTMyIFJlZ2lzdGVyVmFsdWUsCi0JCQkJCQkJCSBzOCAqcFZhbHVlLAotCQkJCQkJCQkgczggTGVuKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19CdXJzdFdyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgKiBwUmVnaXN0ZXJEYXRhLCAgdTggTnVtYmVyT2ZEYXRhLCAgdTggRmxhZyApOwotCi12b2lkIFdiMzVSZWdfRVAwVk0oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlKCAgUFVSQiBwVXJiICk7Ci0KLXUzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCk7Ci0KLXZvaWQgQ2FyZEdldE11bHRpY2FzdEJpdCggICB1OCBBZGRyZXNzW01BQ19BRERSX0xFTkdUSF0sICB1OCAqQnl0ZSwgIHU4ICpWYWx1ZSApOwotdTMyIENhcmRDb21wdXRlQ3JjKCAgdTggKiBCdWZmZXIsICB1MzIgTGVuZ3RoICk7Ci0KLXZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVJlZ19VcGRhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIGFkanVzdF9UWFZHQV9mb3JfaXFfbWFnKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzNWI5My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLyoKLQkJCQlIQUwgc2V0dGluZyBmdW5jdGlvbgotCi0JCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJfFV4eHwgCXxEeHh8CXxNeHh8CXxCQnwJfFJGfAotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQl8CQkJCQl8Ci0JCVdiMzVSZWdfUmVhZAkJV2IzNVJlZ19Xcml0ZQotCi0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlXYlVzYl9DYWxsVVNCREFTeW5jCQkJCQlzdXBwbGllZCBCeSBXYlVzYiBtb2R1bGUKLSovCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jZGVmaW5lICAgICBHZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSAmICgweDAwMDAwMDAxIDw8IGkpKQotI2RlZmluZSAgICAgU2V0Qml0KCBkd0RhdGEsIGkpICAgICAgKCBkd0RhdGEgfCAoMHgwMDAwMDAwMSA8PCBpKSkKLSNkZWZpbmUgICAgIENsZWFyQml0KCBkd0RhdGEsIGkpICAgICggZHdEYXRhICYgfigweDAwMDAwMDAxIDw8IGkpKQotCi0jZGVmaW5lCQlJR05PUkVfSU5DUkVNRU5UCTAKLSNkZWZpbmUJCUFVVE9fSU5DUkVNRU5UCQkwCi0jZGVmaW5lCQlOT19JTkNSRU1FTlQJCTEKLSNkZWZpbmUgUkVHX0RJUkVDVElPTihfeCxfeSkgICAoKF95KS0+RElSRUNUID09MCA/IHVzYl9yY3ZjdHJscGlwZShfeCwwKSA6IHVzYl9zbmRjdHJscGlwZShfeCwwKSkKLSNkZWZpbmUgUkVHX0JVRl9TSVpFKF94KSAgICAgICAoKF94KS0+YlJlcXVlc3Q9PSAweDA0ID8gY3B1X3RvX2xlMTYoKF94KS0+d0xlbmd0aCkgOiA0KQotCi0vLyAyMDA2MDYxMy4yIEFkZCB0aGUgZm9sbG93IGRlZmluaXRpb24KLSNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MDAzMzQ0N2MKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIJCTB4MEEwMEZFRkYKLSNkZWZpbmUgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MDAzMzJDMUIKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcJCTB4MEEwMEZFRkYKLQotCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyOTIzMTUJLy9iYWNrb2ZmICAyZEIKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExQgkJMHgwODAwRkVGRgkvL2JhY2tvZmYgIDJkQgotLy8jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDAyMDFCMTEJLy9iYWNrb2ZmICA0ZEIKLS8vI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA2MDBGRjAwCS8vYmFja29mZiAgNGRCCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcJCTB4MDA0NTNCMjQKLSNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExRwkJMHgwRTAwRkVGRgotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGVmYXVsdCBzZXR0aW5nIGZvciBNeHgKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIERFRkFVTFRfQ1dNSU4JCQkJCTMxCQkvLyhNMkMpIENXbWluLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMzEuCi0jZGVmaW5lIERFRkFVTFRfQ1dNQVgJCQkJCTEwMjMJLy8oTTJDKSBDV21heC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTEwMjMuCi0jZGVmaW5lIERFRkFVTFRfQUlECQkJCQkJMQkJLy8oTTM0KSBBSUQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMS0yMDA3LgotCi0jaWZkZWYgX1VTRV9GQUxMQkFDS19SQVRFXwotI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJCTIJCS8vKE0zOCkgYXMgbmFtZWQKLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBhcyBuYW1lZAotI2VuZGlmCi0KLSNkZWZpbmUgREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIExvbmdSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCi0jZGVmaW5lIERFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgU2hvcnRSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCi0jZGVmaW5lIERFRkFVTFRfUElGU1QJCQkJCTI1CQkvLyhNM0MpIFBJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX0VJRlNUCQkJCQkzNTQJCS8vKE0zQykgRUlGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTA0ODU3NS4KLSNkZWZpbmUgREVGQVVMVF9ESUZTVAkJCQkJNDUJCS8vKE0zQykgRElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfU0lGU1QJCQkJCTUJCS8vKE0zQykgU0lGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfT1NJRlNUCQkJCQkxMAkJLy8oTTNDKSBPcmlnaW5hbCBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KLSNkZWZpbmUgREVGQVVMVF9BVElNV0QJCQkJCTAJCS8vKE00MCkgQVRJTSBXaW5kb3cuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9TTE9UX1RJTUUJCQkJMjAJCS8vKE00MCkgKCQpIFNsb3RUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMjU1LgotI2RlZmluZSBERUZBVUxUX01BWF9UWF9NU0RVX0xJRkVfVElNRQk1MTIJLy8oTTQ0KSBNYXhUeE1TRFVMaWZlVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTQyOTQ5NjcyOTUuCi0jZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMCQkJNTAwCQkvLyhNNDgpIEJlYWNvbiBJbnRlcnZhbC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX1BST0JFX0RFTEFZX1RJTUUJCTIwMAkJLy8oTTQ4KSBQcm9iZSBEZWxheSBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTgkJMAkJLy8oTTRDKQotI2RlZmluZSBERUZBVUxUX01BQ19QT1dFUl9TVEFURQkJCTIJCS8vKE00QykgMjogTUFDIGF0IHBvd2VyIGFjdGl2ZQotI2RlZmluZSBERUZBVUxUX0RUSU1fQUxFUlRfVElNRQkJCTAKLQotCi10eXBlZGVmIHN0cnVjdCBfUkVHX1FVRVVFCi17Ci0gICAgc3RydWN0ICB1cmIgKnBVcmI7Ci0Jdm9pZCoJcFVzYlJlcTsKLQl2b2lkKglOZXh0OwotCXVuaW9uCi0JewotCQl1MzIJVkFMVUU7Ci0JCXUzMiAqCXBCdWZmZXI7Ci0JfTsKLQl1OAlSRVNFUlZFRFs0XTsvLyBzcGFjZSByZXNlcnZlZCBmb3IgY29tbXVuaWNhdGlvbgotCi0gICAgdTE2CUlOREVYOyAvLyBGb3Igc3RvcmluZyB0aGUgcmVnaXN0ZXIgaW5kZXgKLSAgICB1OAlSRVNFUlZFRF9WQUxJRDsJLy9JbmRpY2F0ZSB3aGV0aGVyIHRoZSBSRVNFUlZFRCBzcGFjZSBpcyB2YWxpZCBhdCB0aGlzIGNvbW1hbmQuCi0JdTgJRElSRUNUOyAvLyAwOkluICAgMTpPdXQKLQotfSBSRUdfUVVFVUUsICpQUkVHX1FVRVVFOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUFYX1NRM19GSUxURVJfU0laRQkJNQotdHlwZWRlZiBzdHJ1Y3QgX1dCMzVSRUcKLXsKLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBSZWdpc3RlciBCYW5rIGJhY2t1cAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXUzMglVMUIwOwkJCS8vYml0MTYgcmVjb3JkIHRoZSBoL3cgcmFkaW8gb24vb2ZmIHN0YXR1cwotCXUzMglVMUJDX0xFRENvbmZpZ3VyZTsKLQl1MzIJRDAwX0RtYUNvbnRyb2w7Ci0JdTMyCU0wMF9NYWNDb250cm9sOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXUzMglNMDRfTXVsdGljYXN0QWRkcmVzczE7Ci0JCQl1MzIJTTA4X011bHRpY2FzdEFkZHJlc3MyOwotCQl9OwotCQl1OAkJTXVsdGljYXN0WzhdOwkvLyBjb250ZW50cyBvZiBjYXJkIG11bHRpY2FzdCByZWdpc3RlcnMKLQl9OwotCi0JdTMyCU0yNF9NYWNDb250cm9sOwotCXUzMglNMjhfTWFjQ29udHJvbDsKLQl1MzIJTTJDX01hY0NvbnRyb2w7Ci0JdTMyCU0zOF9NYWNDb250cm9sOwotCXUzMglNM0NfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTQwX01hY0NvbnRyb2w7Ci0JdTMyCU00NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNDhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTRDX01hY1N0YXR1czsKLQl1MzIJTTYwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU02OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNzBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTc0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU03OF9FUlBJbmZvcm1hdGlvbjsvLzkzMDIwNi4yLmIKLQl1MzIJTTdDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU04MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNODRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTg4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU05OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCi0JLy9bMjAwNDA3MjIgV0tdCi0JLy9CYXNlYmFuZCByZWdpc3RlcgotCXUzMglCQjBDOwkvLyBVc2VkIGZvciBMTkEgY2FsY3VsYXRpb24KLQl1MzIJQkIyQzsJLy8KLQl1MzIJQkIzMDsJLy8xMWIgYWNxdWlzaXRpb24gY29udHJvbCByZWdpc3RlcgotCXUzMglCQjNDOwotCXUzMglCQjQ4OwkvLyAyMDA1MTIyMS4xLmEgMjAwNjA2MTMuMSBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQotCXUzMglCQjRDOwkvLyAyMDA2MDYxMy4xICBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQotCXUzMglCQjUwOwkvL21vZGUgY29udHJvbCByZWdpc3RlcgotCXUzMglCQjU0OwotCXUzMiAJQkI1ODsJLy9JUV9BTFBIQQotCXUzMglCQjVDOwkvLyBGb3IgdGVzdAotCXUzMglCQjYwOwkvLyBmb3IgV1RPIHJlYWQgdmFsdWUKLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFZNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tCi0Jc3BpbmxvY2tfdAlFUDBWTV9zcGluX2xvY2s7IC8vIDRCCi0JdTMyCSAgICAgICAgRVAwVk1fc3RhdHVzOy8vJCQKLQlQUkVHX1FVRVVFCSAgICBwUmVnRmlyc3Q7Ci0JUFJFR19RVUVVRQkgICAgcFJlZ0xhc3Q7Ci0JT1NfQVRPTUlDICAgICAgIFJlZ0ZpcmVDb3VudDsKLQotCS8vIEhhcmR3YXJlIHN0YXR1cwotCXU4CUVQMHZtX3N0YXRlOwotCXU4CW1hY19wb3dlcl9zYXZlOwotCXU4CUVFUFJPTVBoeVR5cGU7IC8vIDAgfiAxNSBmb3IgTWF4aW0gKDAgxIRWIE1BWDI4MjUsIDEgxIRWIE1BWDI4MjcsIDIgxIRWIE1BWDI4MjgsIDMgxIRWIE1BWDI4MjkpLAotCQkJCQkJICAgLy8gMTYgfiAzMSBmb3IgQWlyb2hhICgxNiDEhFYgQUwyMjMwLCAxMSAtIEFMNzIzMCkKLQkJCQkJCSAgIC8vIDMyIH4gUmVzZXJ2ZWQKLQkJCQkJCSAgIC8vIDMzIH4gNDcgRm9yIFdCMjQyICggMzMgLSBXQjI0MiwgMzQgLSBXQjI0MiB3aXRoIG5ldyBUeHZnYSAwLjUgZGIgc3RlcCkKLQkJCQkJCSAgIC8vIDQ4IH4gMjU1IEFSRSBSRVNFUlZFRC4KLQl1OAlFRVBST01SZWdpb247CS8vUmVnaW9uIHNldHRpbmcgaW4gRUVQUk9NCi0KLQl1MzIJU3luY0lvUGF1c2U7IC8vIElmIHVzZXIgdXNlIHRoZSBTeW5jIElvIHRvIGFjY2VzcyBIdywgdGhlbiBwYXVzZSB0aGUgYXN5bmMgYWNjZXNzCi0KLQl1OAlMTkFWYWx1ZVs0XTsgLy9UYWJsZSBmb3Igc3BlZWQgdXAgcnVubmluZwotCXUzMglTUTNfZmlsdGVyW01BWF9TUTNfRklMVEVSX1NJWkVdOwotCXUzMglTUTNfaW5kZXg7Ci0KLX0gV0IzNVJFRywgKlBXQjM1UkVHOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjlmNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgV2IzNVJ4LmMKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBQcm9jZXNzaW5nIHRoZSBSeCBtZXNzYWdlIGZyb20gZG93biBsYXllcgotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0KLXZvaWQgV2IzNVJ4X3N0YXJ0KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIHRoZSBXYjM1UngoKSBmdW5jdGlvbgotCWlmIChPU19BVE9NSUNfSU5DKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKSA9PSAxKSB7Ci0JCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVJ4KHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmVlbnRyYWluCi12b2lkIFdiMzVSeCggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSWAlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1OCAqCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JUFVSQglwVXJiID0gKFBVUkIpcFdiMzVSeC0+UnhVcmI7Ci0JaW50CXJldHY7Ci0JdTMyCVJ4QnVmZmVySWQ7Ci0KLQkvLwotCS8vIElzc3VpbmcgVVJCCi0JLy8KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1UngtPnJ4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLyBHZXQgUnhCdWZmZXIncyBJRAotCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeEJ1ZmZlcklkOwotCWlmICghcFdiMzVSeC0+UnhPd25lcltSeEJ1ZmZlcklkXSkgewotCQkvLyBJdCdzIGltcG9zc2libGUgdG8gcnVuIGhlcmUuCi0JCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJV0JERUJVRygoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKSk7Ci0JCSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIFVwZGF0ZSBidWZmZXIgcG9pbnQsIHRoZW4gc3RhcnQgdG8gYnVsa2luIHRoZSBkYXRhIGZyb20gVVNCCi0JcFdiMzVSeC0+UnhCdWZmZXJJZCsrOwotCXBXYjM1UngtPlJ4QnVmZmVySWQgJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOwotCi0JcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQgPSBSeEJ1ZmZlcklkOwotCi0JaWYgKDEgIT0gT1NfTUVNT1JZX0FMTE9DKCh2b2lkKiAqKSZwV2IzNVJ4LT5wRFJ4LCBNQVhfVVNCX1JYX0JVRkZFUikpIHsKLQkJcHJpbnRrKCJ3MzV1bmQ6IFJ4IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgIHVzYl9yY3ZidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAzKSwKLQkJCSAgcFJ4QnVmZmVyQWRkcmVzcywgTUFYX1VTQl9SWF9CVUZGRVIsCi0JCQkgIFdiMzVSeF9Db21wbGV0ZSwgcEh3RGF0YSk7Ci0KLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0KLQlyZXR2ID0gd2JfdXNiX3N1Ym1pdF91cmIocFVyYik7Ci0KLQlpZiAocmV0diAhPSAwKSB7Ci0JCXByaW50aygiUnggVVJCIHNlbmRpbmcgZXJyb3JcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlyZXR1cm47Ci0KLWVycm9yOgotCS8vIFZNIHN0b3AKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIgKTsKLX0KLQotdm9pZCBXYjM1UnhfQ29tcGxldGUoUFVSQiBwVXJiKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9IHBVcmItPmNvbnRleHQ7Ci0JUFdCMzVSWAkJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0JdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKLQl1MzIJCVNpemVDaGVjazsKLQl1MTYJCUJ1bGtMZW5ndGg7Ci0JdTMyCQlSeEJ1ZmZlcklkOwotCVIwMF9ERVNDUklQVE9SIAlSMDA7Ci0KLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0JcFdiMzVSeC0+RVAzVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOy8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAotCi0JUnhCdWZmZXJJZCA9IHBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkOwotCi0JcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7Ci0JQnVsa0xlbmd0aCA9ICh1MTYpcFVyYi0+YWN0dWFsX2xlbmd0aDsKLQotCS8vIFRoZSBJUlAgaXMgY29tcGxldGVkCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZAotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1UngtPnJ4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLyBTdGFydCB0byBwcm9jZXNzIHRoZSBkYXRhIG9ubHkgaW4gc3VjY2Vzc2Z1bCBjb25kaXRpb24KLQlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAwOyAvLyBTZXQgdGhlIG93bmVyIHRvIGRyaXZlcgotCVIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7Ci0KLQkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAotCWlmIChwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgIT0gMCkgewotCQkjaWZkZWYgX1BFX1VTQl9TVEFURV9EVU1QXwotCQlXQkRFQlVHKCgiRVAzIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOwotCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcFdiMzVSeC0+RVAzVk1fc3RhdHVzICk7Ci0JCSNlbmRpZgotCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLy8gMjAwNjAyMjAgRm9yIHJlY292ZXJpbmcuIGNoZWNrIGlmIG9wZXJhdGluZyBpbiBzaW5nbGUgVVNCIG1vZGUKLQlpZiAoIUhBTF9VU0JfTU9ERV9CVVJTVChwSHdEYXRhKSkgewotCQlTaXplQ2hlY2sgPSBSMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsgIC8vMjAwNjA5MjYgYW5zb24ncyBlbmRpYW4KLQkJaWYgKChTaXplQ2hlY2sgJiAweDAzKSA+IDApCi0JCQlTaXplQ2hlY2sgLT0gNDsKLQkJU2l6ZUNoZWNrID0gKFNpemVDaGVjayArIDMpICYgfjB4MDM7Ci0JCVNpemVDaGVjayArPSAxMjsgLy8gOCArIDQgYmFkYmVlZgotCQlpZiAoKEJ1bGtMZW5ndGggPiAxNjAwKSB8fAotCQkJKFNpemVDaGVjayA+IDE2MDApIHx8Ci0JCQkoQnVsa0xlbmd0aCAhPSBTaXplQ2hlY2spIHx8Ci0JCQkoQnVsa0xlbmd0aCA9PSAwKSkgeyAvLyBBZGQgZm9yIGZhaWwgVXJiCi0JCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOwotCQl9Ci0JfQotCi0JLy8gSW5kaWNhdGluZyB0aGUgcmVjZWl2aW5nIGRhdGEKLQlwV2IzNVJ4LT5CeXRlUmVjZWl2ZWQgKz0gQnVsa0xlbmd0aDsKLQlwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXSA9IEJ1bGtMZW5ndGg7Ci0KLQlpZiAoIXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkKLQkJV2IzNVJ4X2luZGljYXRlKHBId0RhdGEpOwotCi0Ja2ZyZWUocFdiMzVSeC0+cERSeCk7Ci0JLy8gRG8gdGhlIG5leHQgcmVjZWl2ZQotCVdiMzVSeChwSHdEYXRhKTsKLQlyZXR1cm47Ci0KLWVycm9yOgotCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7IC8vIFNldCB0aGUgb3duZXIgdG8gaGFyZHdhcmUKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSeC0+UnhGaXJlQ291bnRlciApOwotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVSeF9pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gSW5pdGlhbCB0aGUgQnVmZmVyIFF1ZXVlCi0JV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoIHBId0RhdGEgKTsKLQotCXBXYjM1UngtPlJ4VXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlyZXR1cm4gKCEhcFdiMzVSeC0+UnhVcmIpOwotfQotCi12b2lkIFdiMzVSeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCi0JLy8gQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuCi0JaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKLQkJdXNiX3VubGlua191cmIoIHBXYjM1UngtPlJ4VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVSeF9kZXN0cm95IHRvIGZyZWUgdGhlbQotCQkjaWZkZWYgX1BFX1JYX0RVTVBfCi0JCVdCREVCVUcoKCJFUDMgUnggc3RvcFxuIikpOwotCQkjZW5kaWYKLQl9Ci19Ci0KLS8vIE5lZWRzIHByb2Nlc3MgY29udGV4dAotdm9pZCBXYjM1UnhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQotCWRvIHsKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCi0JfSB3aGlsZSAocFdiMzVSeC0+RVAzdm1fc3RhdGUgIT0gVk1fU1RPUCk7Ci0JT1NfU0xFRVAoMTAwMDApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBleGl0IDk0MDYyMy4xLmIKLQotCWlmIChwV2IzNVJ4LT5SeFVyYikKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVJ4LT5SeFVyYiApOwotCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQlXQkRFQlVHKCgiV2IzNVJ4X2Rlc3Ryb3kgT0tcbiIpKTsKLQkjZW5kaWYKLX0KLQotdm9pZCBXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1MzIJaTsKLQotCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCA9IDA7Ci0JcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggPSAwOwotCXBXYjM1UngtPlJ4QnVmZmVySWQgPSAwOwotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKLQotCS8vIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLgotCWZvciggaT0wOyBpPE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrICkKLQkJcFdiMzVSeC0+UnhPd25lcltpXSA9IDE7Ci19Ci0KLXZvaWQgV2IzNVJ4X2FkanVzdChQREVTQ1JJUFRPUiBwUnhEZXMpCi17Ci0JdTMyICoJcFJ4QnVmZmVyQWRkcmVzczsKLQl1MzIJRGVjcnlwdGlvbk1ldGhvZDsKLQl1MzIJaTsKLQl1MTYJQnVmZmVyU2l6ZTsKLQotCURlY3J5cHRpb25NZXRob2QgPSBwUnhEZXMtPlIwMS5SMDFfZGVjcnlwdGlvbl9tZXRob2Q7Ci0JcFJ4QnVmZmVyQWRkcmVzcyA9IHBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF07Ci0JQnVmZmVyU2l6ZSA9IHBSeERlcy0+YnVmZmVyX3NpemVbMF07Ci0KLQkvLyBBZGp1c3QgdGhlIGxhc3QgcGFydCBvZiBkYXRhLiBPbmx5IGRhdGEgbGVmdAotCUJ1ZmZlclNpemUgLT0gNDsgLy8gRm9yIENSQy0zMgotCWlmIChEZWNyeXB0aW9uTWV0aG9kKQotCQlCdWZmZXJTaXplIC09IDQ7Ci0JaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMykgLy8gRm9yIENDTVAKLQkJQnVmZmVyU2l6ZSAtPSA0OwotCi0JLy8gQWRqdXN0IHRoZSBJViBmaWVsZCB3aGljaCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCBJQ1YgZmllbGQuCi0JaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMSkgLy8gRm9yIFdFUAotCXsKLQkJZm9yKCBpPTY7IGk+MDsgaS0tICkKLQkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMV07Ci0JCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMTsKLQkJQnVmZmVyU2l6ZSAtPSA0OyAvLyA0IGJ5dGUgZm9yIElWCi0JfQotCWVsc2UgaWYoIERlY3J5cHRpb25NZXRob2QgKSAvLyBGb3IgVEtJUCBhbmQgQ0NNUAotCXsKLQkJZm9yIChpPTc7IGk+MTsgaS0tKQotCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0yXTsKLQkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAyOy8vVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUKLQkJQnVmZmVyU2l6ZSAtPSA4OyAvLyA4IGJ5dGUgZm9yIElWICsgSUNWCi0JfQotCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOwotfQotCi1leHRlcm4gdm9pZCBwYWNrZXRfY2FtZShjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSk7Ci0KLQotdTE2IFdiMzVSeF9pbmRpY2F0ZShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JREVTQ1JJUFRPUglSeERlczsKLQlQV0IzNVJYCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCXU4ICoJCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JdTE2CQlQYWNrZXRTaXplOwotCXUxNgkJc3RtcCwgQnVmZmVyU2l6ZSwgc3RtcDIgPSAwOwotCXUzMgkJUnhCdWZmZXJJZDsKLQotCS8vIE9ubHkgb25lIHRocmVhZCBiZSBhbGxvd2VkIHRvIHJ1biBpbnRvIHRoZSBmb2xsb3dpbmcKLQlkbyB7Ci0JCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleDsKLQkJaWYgKHBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkgLy9Pd25lciBieSBWTQotCQkJYnJlYWs7Ci0KLQkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXgrKzsKLQkJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOwotCi0JCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwotCQlCdWZmZXJTaXplID0gcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF07Ci0KLQkJLy8gUGFyc2UgdGhlIGJ1bGtpbiBidWZmZXIKLQkJd2hpbGUgKEJ1ZmZlclNpemUgPj0gNCkgewotCQkJaWYgKChjcHVfdG9fbGUzMigqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpICYgMHgwZmZmZmZmZikgPT0gUlhfRU5EX1RBRykgLy9JcyBlbmRpbmc/IDkyMTAwMi45LmEKLQkJCQlicmVhazsKLQotCQkJLy8gR2V0IHRoZSBSMDAgUjAxIGZpcnN0Ci0JCQlSeERlcy5SMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOwotCQkJUGFja2V0U2l6ZSA9ICh1MTYpUnhEZXMuUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7Ci0JCQlSeERlcy5SMDEudmFsdWUgPSBsZTMyX3RvX2NwdSgqKCh1MzIgKikocFJ4QnVmZmVyQWRkcmVzcys0KSkpOwotCQkJLy8gRm9yIG5ldyBETUEgNGsKLQkJCWlmICgoUGFja2V0U2l6ZSAmIDB4MDMpID4gMCkKLQkJCQlQYWNrZXRTaXplIC09IDQ7Ci0KLQkJCS8vIEJhc2ljIGNoZWNrIGZvciBSeCBsZW5ndGguIElzIGxlbmd0aCB2YWxpZD8KLQkJCWlmIChQYWNrZXRTaXplID4gTUFYX1BBQ0tFVF9TSVpFKSB7Ci0JCQkJI2lmZGVmIF9QRV9SWF9EVU1QXwotCQkJCVdCREVCVUcoKCJTZXJpb3VzIEVSUk9SIDogUnggZGF0YSBzaXplIHRvbyBsb25nLCBzaXplID0lZFxuIiwgUGFja2V0U2l6ZSkpOwotCQkJCSNlbmRpZgotCi0JCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCQkJCXBXYjM1UngtPkVwM0Vycm9yQ291bnQyKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFN0YXJ0IHRvIHByb2Nlc3MgUnggYnVmZmVyCi0vLwkJCVJ4RGVzLkRlc2NyaXB0b3JfSUQgPSBSeEJ1ZmZlcklkOyAvLyBEdWUgdG8gc3luY2hyb25vdXMgaW5kaWNhdGUsIHRoZSBmaWVsZCBkb2Vzbid0IG5lY2Vzc2FyeSB0byB1c2UuCi0JCQlCdWZmZXJTaXplIC09IDg7IC8vc3VidHJhY3QgOCBieXRlIGZvciAzNSdzIFVTQiBoZWFkZXIgbGVuZ3RoCi0JCQlwUnhCdWZmZXJBZGRyZXNzICs9IDg7Ci0KLQkJCVJ4RGVzLmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzczsKLQkJCVJ4RGVzLmJ1ZmZlcl9zaXplWzBdID0gUGFja2V0U2l6ZTsKLQkJCVJ4RGVzLmJ1ZmZlcl9udW1iZXIgPSAxOwotCQkJUnhEZXMuYnVmZmVyX3N0YXJ0X2luZGV4ID0gMDsKLQkJCVJ4RGVzLmJ1ZmZlcl90b3RhbF9zaXplID0gUnhEZXMuYnVmZmVyX3NpemVbMF07Ci0JCQlXYjM1UnhfYWRqdXN0KCZSeERlcyk7Ci0KLQkJCXBhY2tldF9jYW1lKHBSeEJ1ZmZlckFkZHJlc3MsIFBhY2tldFNpemUpOwotCi0JCQkvLyBNb3ZlIFJ4QnVmZmVyIHBvaW50IHRvIHRoZSBuZXh0Ci0JCQlzdG1wID0gUGFja2V0U2l6ZSArIDM7Ci0JCQlzdG1wICY9IH4weDAzOyAvLyA0biBhbGlnbm1lbnQKLQkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gc3RtcDsKLQkJCUJ1ZmZlclNpemUgLT0gc3RtcDsKLQkJCXN0bXAyICs9IHN0bXA7Ci0JCX0KLQotCQkvLyBSZWNsYWltIHJlc291cmNlCi0JCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7Ci0JfSB3aGlsZShUUlVFKTsKLQotCXJldHVybiBzdG1wMjsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhM2U3My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZAkJV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXVuc2lnbmVkIGNoYXIJCVdiMzVSeF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZAkJV2IzNVJ4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXUxNgkJV2IzNVJ4X2luZGljYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfYWRqdXN0KCAgUERFU0NSSVBUT1IgcFJ4RGVzICk7Ci12b2lkCQlXYjM1Unhfc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotdm9pZAkJV2IzNVJ4KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkCQlXYjM1UnhfQ29tcGxldGUoICBQVVJCIHBVcmIgKTsKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGMyNjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gd2IzNXJ4LmggLS0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBEZWZpbml0aW9uIGZvciB0aGlzIG1vZHVsZSB1c2VkCi0jZGVmaW5lIE1BWF9VU0JfUlhfQlVGRkVSCTQwOTYJLy8gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSA0MDk2IDkzMTEzMC40LmYKLQotI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIJRVRIRVJORVRfUlhfREVTQ1JJUFRPUlMJCS8vIE1heGltdW0gMjU0LCAyNTUgaXMgUkVTRVJWRUQgSUQKLSNkZWZpbmUgUlhfSU5URVJGQUNFCQkJCTAJLy8gSW50ZXJmYWNlIDEKLSNkZWZpbmUgUlhfUElQRQkJCQkJCTIJLy8gUGlwZSAzCi0jZGVmaW5lIE1BWF9QQUNLRVRfU0laRQkJCQkxNjAwIC8vMTU2OAkvLyA4ICsgMTUzMiArIDQgKyAyNChJViBFSVYgTUlDIElDViBDUkMpIGZvciBjaGVjayBETUEgZGF0YSA5MzExMzAuNC5nCi0jZGVmaW5lIFJYX0VORF9UQUcJCQkJCTB4MGJhZGJlZWYKLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXR5cGVkZWYgc3RydWN0IF9XQjM1UlgKLXsKLQl1MzIJCQlCeXRlUmVjZWl2ZWQ7Ly8gRm9yIGNhbGN1bGF0aW5nIHRocm91Z2hwdXQgb2YgQnVsa0luCi0JT1NfQVRPTUlDCQlSeEZpcmVDb3VudGVyOy8vIERvZXMgV2IzNVJ4IG1vZHVsZSBmaXJlPwotCi0JdTgJUnhCdWZmZXJbIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiBdWyAoKE1BWF9VU0JfUlhfQlVGRkVSKzMpICYgfjB4MDMgKSBdOwotCXUxNglSeEJ1ZmZlclNpemVbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzEpICYgfjB4MDEpIF07Ci0JdTgJUnhPd25lclsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMykgJiB+MHgwMyApIF07Ly9Pd25lcnNoaXAgb2YgYnVmZmVyICAwOiBTVyAxOkhXCi0KLQl1MzIJUnhQcm9jZXNzSW5kZXg7Ly9UaGUgbmV4dCBpbmRleCB0byBwcm9jZXNzCi0JdTMyCVJ4QnVmZmVySWQ7Ci0JdTMyCUVQM3ZtX3N0YXRlOwotCi0JdTMyCXJ4X2hhbHQ7IC8vIEZvciBWTSBzdG9wcGluZwotCi0JdTE2CU1vcmVEYXRhU2l6ZTsKLQl1MTYJUGFja2V0U2l6ZTsKLQotCXUzMglDdXJyZW50UnhCdWZmZXJJZDsgLy8gRm9yIGNvbXBsZXRlIHJvdXRpbmUgdXNhZ2UKLQl1MzIJUngzVXJiQ2FuY2VsOwotCi0JdTMyCUxhc3RSMTsgLy8gRm9yIFJTU0kgcmVwb3J0aW5nCi0Jc3RydWN0IHVyYiAqCQkJCVJ4VXJiOwotCXUzMgkJRXAzRXJyb3JDb3VudDI7IC8vIDIwMDYwNjI1LjEgVXNiZCBmb3IgUnggRE1BIGVycm9yIGNvdW50Ci0KLQlpbnQJCUVQM1ZNX3N0YXR1czsKLQl1OCAqCXBEUng7Ci0KLX0gV0IzNVJYLCAqUFdCMzVSWDsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlkNTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIFdiMzVUeC5jCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgUHJvY2Vzc2luZyB0aGUgVHggbWVzc2FnZSBhbmQgcHV0IGludG8gZG93biBsYXllcgotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0KLXVuc2lnbmVkIGNoYXIKLVdiMzVUeF9nZXRfdHhfYnVmZmVyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKipwQnVmZmVyKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkqcEJ1ZmZlciA9IHBXYjM1VHgtPlR4QnVmZmVyWzBdOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIFdiMzVUeF9zdGFydChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgotCWlmIChPU19BVE9NSUNfSU5DKHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKSA9PSAxKSB7Ci0JCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVR4KHBId0RhdGEpOwotCX0gZWxzZQotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlciApOwotfQotCi0KLXZvaWQgV2IzNVR4KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQlQQURBUFRFUglBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLQl1OAkJKnBUeEJ1ZmZlckFkZHJlc3M7Ci0JUE1EUwkJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0Jc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4NFVyYjsKLQlpbnQgICAgICAgICAJcmV0djsKLQl1MzIJCVNlbmRJbmRleDsKLQotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKLQkJZ290byBjbGVhbnVwOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIE93bmVyc2hpcCBjaGVja2luZwotCVNlbmRJbmRleCA9IHBXYjM1VHgtPlR4U2VuZEluZGV4OwotCWlmICghcE1kcy0+VHhPd25lcltTZW5kSW5kZXhdKSAvL05vIG1vcmUgZGF0YSBuZWVkIHRvIGJlIHNlbnQsIHJldHVybiBpbW1lZGlhdGVseQotCQlnb3RvIGNsZWFudXA7Ci0KLQlwVHhCdWZmZXJBZGRyZXNzID0gcFdiMzVUeC0+VHhCdWZmZXJbU2VuZEluZGV4XTsKLQkvLwotCS8vIElzc3VpbmcgVVJCCi0JLy8KLQl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICB1c2Jfc25kYnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgNCksCi0JCQkgIHBUeEJ1ZmZlckFkZHJlc3MsIHBNZHMtPlR4QnVmZmVyU2l6ZVsgU2VuZEluZGV4IF0sCi0JCQkgIFdiMzVUeF9jb21wbGV0ZSwgcEh3RGF0YSk7Ci0KLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0diA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0JaWYgKHJldHY8MCkgewotCQlwcmludGsoIkVQNCBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvLyBDaGVjayBpZiBkcml2ZXIgbmVlZHMgaXNzdWUgSXJwIGZvciBFUDIKLQlwV2IzNVR4LT5UeEZpbGxDb3VudCArPSBwTWRzLT5UeENvdW50SW5CdWZmZXJbU2VuZEluZGV4XTsKLQlpZiAocFdiMzVUeC0+VHhGaWxsQ291bnQgPiAxMikKLQkJV2IzNVR4X0VQMlZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0KLQlwV2IzNVR4LT5CeXRlVHJhbnNmZXIgKz0gcE1kcy0+VHhCdWZmZXJTaXplW1NlbmRJbmRleF07Ci0JcmV0dXJuOwotCi0gY2xlYW51cDoKLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIgKTsKLX0KLQotCi12b2lkIFdiMzVUeF9jb21wbGV0ZShzdHJ1Y3QgdXJiICogcFVyYikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSBwVXJiLT5jb250ZXh0OwotCVBBREFQVEVSCUFkYXB0ZXIgPSAoUEFEQVBURVIpcEh3RGF0YS0+QWRhcHRlcjsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQlQTURTCQlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQotCXByaW50aygid2IzNTogdHggY29tcGxldGVcbiIpOwotCS8vIFZhcmlhYmxlIHNldHRpbmcKLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQlwV2IzNVR4LT5FUDRWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7IC8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAotCXBNZHMtPlR4T3duZXJbIHBXYjM1VHgtPlR4U2VuZEluZGV4IF0gPSAwOy8vIFNldCB0aGUgb3duZXIuIEZyZWUgdGhlIG93bmVyIGJpdCBhbHdheXMuCi0JcFdiMzVUeC0+VHhTZW5kSW5kZXgrKzsKLQlwV2IzNVR4LT5UeFNlbmRJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0Ci0JaWYgKHBXYjM1VHgtPkVQNFZNX3N0YXR1cyAhPSAwKSB7Ci0JCXByaW50aygiVVJCIHN1Ym1pc3Npb24gZmFpbGVkXG4iKTsKLQkJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOwotCQlnb3RvIGVycm9yOwotCX0KLQotCU1kc19UeChBZGFwdGVyKTsKLQlXYjM1VHgocEh3RGF0YSk7Ci0JcmV0dXJuOwotCi1lcnJvcjoKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlciApOwotCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKLX0KLQotdm9pZCBXYjM1VHhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCXBXYjM1VHgtPlR4U2VuZEluZGV4ID0gMDsKLQlwV2IzNVR4LT50eF9oYWx0ID0gMDsKLX0KLQotdW5zaWduZWQgY2hhciBXYjM1VHhfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCXBXYjM1VHgtPlR4NFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKCFwV2IzNVR4LT5UeDRVcmIpCi0JCXJldHVybiBGQUxTRTsKLQotCXBXYjM1VHgtPlR4MlVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYgKCFwV2IzNVR4LT5UeDJVcmIpCi0JewotCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIFdiMzVUeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgVHJwIG9mIEVQMgotCWlmIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQotCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiRVAyIFR4IHN0b3BcbiIpKTsKLQkjZW5kaWYKLQotCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIElycCBvZiBFUDQKLQlpZiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgPT0gVk1fUlVOTklORykKLQkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4NFVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIkVQNCBUeCBzdG9wXG4iKSk7Ci0JI2VuZGlmCi19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIFdiMzVUeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gV2FpdCBmb3IgVk0gc3RvcAotCWRvIHsKLQkJT1NfU0xFRVAoMTAwMDApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQotCX0gd2hpbGUoIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSAhPSBWTV9TVE9QKSAmJiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgIT0gVk1fU1RPUCkgKTsKLQlPU19TTEVFUCgxMDAwMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCi0KLQlpZiAocFdiMzVUeC0+VHg0VXJiKQotCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOwotCi0JaWYgKHBXYjM1VHgtPlR4MlVyYikKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsKLQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlXQkRFQlVHKCgiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpKTsKLQkjZW5kaWYKLX0KLQotdm9pZCBXYjM1VHhfQ3VycmVudFRpbWUocGh3X2RhdGFfdCBwSHdEYXRhLCB1MzIgVGltZUNvdW50KQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0JdW5zaWduZWQgY2hhciBUcmlnZ2VyID0gRkFMU0U7Ci0KLQlpZiAocFdiMzVUeC0+VHhUaW1lciA+IFRpbWVDb3VudCkKLQkJVHJpZ2dlciA9IFRSVUU7Ci0JZWxzZSBpZiAoVGltZUNvdW50ID4gKHBXYjM1VHgtPlR4VGltZXIrNTAwKSkKLQkJVHJpZ2dlciA9IFRSVUU7Ci0KLQlpZiAoVHJpZ2dlcikgewotCQlwV2IzNVR4LT5UeFRpbWVyID0gVGltZUNvdW50OwotCQlXYjM1VHhfRVAyVk1fc3RhcnQoIHBId0RhdGEgKTsKLQl9Ci19Ci0KLXZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIGZ1bmN0aW9uCi0JaWYgKE9TX0FUT01JQ19JTkMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICkgPT0gMSkgewotCQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JCVdiMzVUeF9FUDJWTSggcEh3RGF0YSApOwotCX0KLQllbHNlCi0JCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICk7Ci19Ci0KLQotdm9pZCBXYjM1VHhfRVAyVk0ocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0Jc3RydWN0IHVyYiAqCXBVcmIgPSAoc3RydWN0IHVyYiAqKXBXYjM1VHgtPlR4MlVyYjsKLQl1MzIgKglwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOwotCWludAkJcmV0djsKLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAocFdiMzVUeC0+dHhfaGFsdCkKLQkJZ290byBlcnJvcjsKLQotCS8vCi0JLy8gSXNzdWluZyBVUkIKLQkvLwotCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsMiksCi0JCQkgIHBsdG1wLCBNQVhfSU5URVJSVVBUX0xFTkdUSCwgV2IzNVR4X0VQMlZNX2NvbXBsZXRlLCBwSHdEYXRhLCAzMik7Ci0KLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0diA9IHdiX3VzYl9zdWJtaXRfdXJiKCBwVXJiICk7Ci0KLQlpZiAocmV0diA8IDApIHsKLQkJI2lmZGVmIF9QRV9UWF9EVU1QXwotCQlXQkRFQlVHKCgiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKSk7Ci0JCSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybjsKLWVycm9yOgotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKLQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCApOwotfQotCi0KLXZvaWQgV2IzNVR4X0VQMlZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9IHBVcmItPmNvbnRleHQ7Ci0JVDAyX0RFU0NSSVBUT1IJVDAyLCBUU1RBVFVTOwotCVBBREFQVEVSCUFkYXB0ZXIgPSAoUEFEQVBURVIpcEh3RGF0YS0+QWRhcHRlcjsKLQlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQl1MzIgKgkJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKLQl1MzIJCWk7Ci0JdTE2CQlJbnRlcnJ1cHRJbkxlbmd0aDsKLQotCi0JLy8gVmFyaWFibGUgc2V0dGluZwotCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1VHgtPkVQMlZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKLQotCS8vIEZvciBMaW51eCAyLjQuIEludGVycnVwdCB3aWxsIGFsd2F5cyB0cmlnZ2VyCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvL1RoZSBVcmIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0Ci0JaWYgKHBXYjM1VHgtPkVQMlZNX3N0YXR1cyAhPSAwKSB7Ci0JCVdCREVCVUcoKCJFUDIgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7Ci0JCXBXYjM1VHgtPkVQMnZtX3N0YXRlPSBWTV9TVE9QOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIFVwZGF0ZSB0aGUgVHggcmVzdWx0Ci0JSW50ZXJydXB0SW5MZW5ndGggPSBwVXJiLT5hY3R1YWxfbGVuZ3RoOwotCS8vIE1vZGlmeSBmb3IgbWluaW11bSBtZW1vcnkgYWNjZXNzIGFuZCBEV09SRCBhbGlnbm1lbnQuCi0JVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbMF0pID4+IDg7IC8vIFszMTo4XSAtPiBbMjQ6MF0KLQlJbnRlcnJ1cHRJbkxlbmd0aCAtPSAxOy8vIDIwMDUxMjIxLjEuYyBNb2RpZnkgdGhlIGZvbGxvdyBmb3IgbW9yZSBzdGFibGUKLQlJbnRlcnJ1cHRJbkxlbmd0aCA+Pj0gMjsgLy8gSW50ZXJydXB0SW5MZW5ndGgvNAotCWZvciAoaSA9IDE7IGkgPD0gSW50ZXJydXB0SW5MZW5ndGg7IGkrKykgewotCQlUMDIudmFsdWUgfD0gKChjcHVfdG9fbGUzMihwbHRtcFtpXSkgJiAweGZmKSA8PCAyNCk7Ci0KLQkJVFNUQVRVUy52YWx1ZSA9IFQwMi52YWx1ZTsgIC8vMjAwNjEwMDkgYW5zb24ncyBlbmRpYW4KLQkJTWRzX1NlbmRDb21wbGV0ZSggQWRhcHRlciwgJlRTVEFUVVMgKTsKLQkJVDAyLnZhbHVlID0gY3B1X3RvX2xlMzIocGx0bXBbaV0pID4+IDg7Ci0JfQotCi0JcmV0dXJuOwotZXJyb3I6Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQgKTsKLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdiMTI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKAkgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVUeF9nZXRfdHhfYnVmZmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKipwQnVmZmVyICk7Ci0KLXZvaWQgV2IzNVR4X0VQMlZNKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9FUDJWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfRVAyVk1fY29tcGxldGUoICBQVVJCIHB1cmIgKTsKLQotdm9pZCBXYjM1VHhfc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9jb21wbGV0ZSggIFBVUkIgcHVyYiApOwotdm9pZCBXYjM1VHhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApOwotCi12b2lkIFdiMzVUeF9DdXJyZW50VGltZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBUaW1lQ291bnQgKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0MzI1Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIElTODlDMzUgVHggcmVsYXRlZCBkZWZpbml0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBUWF9JTlRFUkZBQ0UJCQkwCS8vIEludGVyZmFjZSAxCi0jZGVmaW5lIFRYX1BJUEUJCQkJCTMJLy8gZW5kcG9pbnQgNAotI2RlZmluZSBUWF9JTlRFUlJVUFQJCQkxCS8vIGVuZHBvaW50IDIKLSNkZWZpbmUgTUFYX0lOVEVSUlVQVF9MRU5HVEgJNjQJLy8gSXQgbXVzdCBiZSA2NCBmb3IgRVAyIGhhcmR3YXJlCi0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi10eXBlZGVmIHN0cnVjdCBfV0IzNVRYCi17Ci0JLy8gRm9yIFR4IGJ1ZmZlcgotCXU4CVR4QnVmZmVyWyBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIgXVsgTUFYX1VTQl9UWF9CVUZGRVIgXTsKLQotCS8vIEZvciBJbnRlcnJ1cHQgcGlwZQotCXU4CUVQMl9idWZbTUFYX0lOVEVSUlVQVF9MRU5HVEhdOwotCi0JT1NfQVRPTUlDCVR4UmVzdWx0Q291bnQ7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQMiA5MzExMzAuNC5tCi0JT1NfQVRPTUlDCVR4RmlyZUNvdW50ZXI7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQNCA5MzExMzAuNC5uCi0JdTMyCQkJQnl0ZVRyYW5zZmVyOwotCi0JdTMyCSAgICBUeFNlbmRJbmRleDsvLyBUaGUgbmV4dCBpbmRleCBvZiBNZHMgYXJyYXkgdG8gYmUgc2VudAotCXUzMgkgICAgRVAydm1fc3RhdGU7IC8vIGZvciBFUDJ2bSBzdGF0ZQotCXUzMgkgICAgRVA0dm1fc3RhdGU7IC8vIGZvciBFUDR2bSBzdGF0ZQotCXUzMgkgICAgdHhfaGFsdDsgLy8gU3RvcHBpbmcgVk0KLQotCXN0cnVjdCB1cmIgKgkJCQlUeDRVcmI7Ci0Jc3RydWN0IHVyYiAqCQkJCVR4MlVyYjsKLQotCWludAkJRVAyVk1fc3RhdHVzOwotCWludAkJRVA0Vk1fc3RhdHVzOwotCi0JdTMyCVR4RmlsbENvdW50OyAvLyAyMDA2MDkyOAotCXUzMglUeFRpbWVyOyAvLyAyMDA2MDkyOCBBZGQgaWYgc2VuZGluZyBwYWNrZXQgbm90IGdyZWF0IHRoYW4gMTMKLQotfSBXQjM1VFgsICpQV0IzNVRYOwotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWNhOWI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KLSAqCi0gKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyLgotICovCi0jaW5jbHVkZSAic3lzZGVmLmgiCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2IzNV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0Je1VTQl9ERVZJQ0UoMHgwNDE2LCAweDAwMzUpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwMSl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjA2KX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMTcpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMCl9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjMzKX0sCi0Je1VTQl9ERVZJQ0UoMHgxMTMxLCAweDIwMzUpfSwKLQl7IDAsIH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB3YjM1X3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSB3YnNvZnRfcmF0ZXNbXSA9IHsKLQl7IC5iaXRyYXRlID0gMTAsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHdic29mdF9jaGFubmVsc1tdID0gewotCXsgLmNlbnRlcl9mcmVxID0gMjQxMn0sCi19OwotCi1pbnQgd2Jzb2Z0X2VuYWJsZWQ7Ci1zdHJ1Y3QgaWVlZTgwMjExX2h3ICpteV9kZXY7Ci1QQURBUFRFUiBteV9hZGFwdGVyOwotCi1zdGF0aWMgaW50IHdic29mdF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfYWRkIGludGVyZmFjZSBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKLXsKLQlwcmludGsoIndic29mdF9yZW1vdmUgaW50ZXJmYWNlIGNhbGxlZFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdic29mdF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9nZXRfdHhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdic29mdF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCQkgICAgIGludCBtY19jb3VudCwgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCi17Ci0JdW5zaWduZWQgaW50IGJpdF9uciwgbmV3X2ZsYWdzOwotCXUzMiBtY19maWx0ZXJbMl07Ci0JaW50IGk7Ci0KLQluZXdfZmxhZ3MgPSAwOwotCi0JaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykgewotCQluZXdfZmxhZ3MgfD0gRklGX1BST01JU0NfSU5fQlNTOwotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKLQl9IGVsc2UgaWYgKCgqdG90YWxfZmxhZ3MgJiBGSUZfQUxMTVVMVEkpIHx8IChtY19jb3VudCA+IDMyKSkgewotCQluZXdfZmxhZ3MgfD0gRklGX0FMTE1VTFRJOwotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKLQl9IGVsc2UgewotCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykgewotCQkJaWYgKCFtY2xpc3QpCi0JCQkJYnJlYWs7Ci0JCQlwcmludGsoIlNob3VsZCBjYWxsIGV0aGVyX2NyYyBoZXJlXG4iKTsKLQkJCS8vYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKLQkJCWJpdF9uciA9IDA7Ci0KLQkJCWJpdF9uciAmPSAweDNGOwotCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7Ci0JCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7Ci0JCX0KLQl9Ci0KLQlkZXYtPmZsYWdzICY9IH5JRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTOwotCi0JKnRvdGFsX2ZsYWdzID0gbmV3X2ZsYWdzOwotfQotCi1zdGF0aWMgaW50IHdic29mdF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JY2hhciAqYnVmZmVyID0ga21hbGxvYyhza2ItPmxlbiwgR0ZQX0FUT01JQyk7Ci0JcHJpbnRrKCJTZW5kaW5nIGZyYW1lICVkIGJ5dGVzXG4iLCBza2ItPmxlbik7Ci0JbWVtY3B5KGJ1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JaWYgKDEgPT0gTUxNRVNlbmRGcmFtZShteV9hZGFwdGVyLCBidWZmZXIsIHNrYi0+bGVuLCBGUkFNRV9UWVBFXzgwMl8xMV9NQU5BR0VNRU5UKSkKLQkJcHJpbnRrKCJmcmFtZSBzZW50IG9rICglZCBieXRlcyk/XG4iLCBza2ItPmxlbik7Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLX0KLQotCi1zdGF0aWMgaW50IHdic29mdF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCi17Ci0Jd2Jzb2Z0X2VuYWJsZWQgPSAxOwotCXByaW50aygid2Jzb2Z0X3N0YXJ0IGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZikKLXsKLQlDaGFuSW5mbyBjaDsKLQlwcmludGsoIndic29mdF9jb25maWcgY2FsbGVkXG4iKTsKLQotCWNoLmJhbmQgPSAxOwotCWNoLkNoYW5ObyA9IDE7CS8qIFNob3VsZCB1c2UgY2hhbm5lbF9udW0sIG9yIHNvbWV0aGluZywgYXMgdGhhdCBpcyBhbHJlYWR5IHByZS10cmFuc2xhdGVkICovCi0KLQotCWhhbF9zZXRfY3VycmVudF9jaGFubmVsKCZteV9hZGFwdGVyLT5zSHdEYXRhLCBjaCk7Ci0JaGFsX3NldF9iZWFjb25fcGVyaW9kKCZteV9hZGFwdGVyLT5zSHdEYXRhLCBjb25mLT5iZWFjb25faW50KTsKLS8vCWhhbF9zZXRfY2FwX2luZm8oJm15X2FkYXB0ZXItPnNId0RhdGEsID8/ICk7Ci0vLyBoYWxfc2V0X3NzaWQocGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKiBwc3NpZCwgIHU4IHNzaWRfbGVuKTsgPz8KLQloYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoJm15X2FkYXB0ZXItPnNId0RhdGEsIDEpOwotCWhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9hY2NlcHRfYmVhY29uKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMSk7Ci0JaGFsX3NldF9yYWRpb19tb2RlKCZteV9hZGFwdGVyLT5zSHdEYXRhLCAgMCk7Ci0JLy9oYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKQotCS8vaGFsX3NldF9yZl9wb3dlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4IFBvd2VySW5kZXgpCi0KLQotLy8JaGFsX3N0YXJ0X2JzcygmbXlfYWRhcHRlci0+c0h3RGF0YSwgV0xBTl9CU1NUWVBFX0lORlJBU1RSVUNUVVJFKTsJPz8KLQotLy92b2lkIGhhbF9zZXRfcmF0ZXMocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqIHBic3NfcmF0ZXMsCi0vLwkJICAgdTggbGVuZ3RoLCB1bnNpZ25lZCBjaGFyIGJhc2ljX3JhdGVfc2V0KQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2NvbmYgKmNvbmYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfY29uZmlnX2ludGVyZmFjZSBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTY0IHdic29mdF9nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKLXsKLQlwcmludGsoIndic29mdF9nZXRfdHNmIGNhbGxlZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyB3YnNvZnRfb3BzID0gewotCS50eAkJCT0gd2Jzb2Z0X3R4LAotCS5zdGFydAkJCT0gd2Jzb2Z0X3N0YXJ0LAkJLyogU3RhcnQgY2FuIGJlIHByZXR0eSBtdWNoIGVtcHR5IGFzIHdlIGRvIFdiV0xhbkluaXRpYWxpemUoKSBkdXJpbmcgcHJvYmU/ICovCi0JLnN0b3AJCQk9IHdic29mdF9zdG9wLAotCS5hZGRfaW50ZXJmYWNlCQk9IHdic29mdF9hZGRfaW50ZXJmYWNlLAotCS5yZW1vdmVfaW50ZXJmYWNlCT0gd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNvbmZpZwkJCT0gd2Jzb2Z0X2NvbmZpZywKLQkuY29uZmlnX2ludGVyZmFjZQk9IHdic29mdF9jb25maWdfaW50ZXJmYWNlLAotCS5jb25maWd1cmVfZmlsdGVyCT0gd2Jzb2Z0X2NvbmZpZ3VyZV9maWx0ZXIsCi0JLmdldF9zdGF0cwkJPSB3YnNvZnRfZ2V0X3N0YXRzLAotCS5nZXRfdHhfc3RhdHMJCT0gd2Jzb2Z0X2dldF90eF9zdGF0cywKLQkuZ2V0X3RzZgkJPSB3YnNvZnRfZ2V0X3RzZiwKLS8vIGNvbmZfdHg6IGhhbF9zZXRfY3dtaW4oKS9oYWxfc2V0X2N3bWF4OwotfTsKLQotc3RydWN0IHdic29mdF9wcml2IHsKLX07Ci0KLQotLy8gVXNiIGtlcm5lbCBzdWJzeXN0ZW0gd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIG5ldyBkZXZpY2UgaXMgcGx1Z2dlZCBpbnRvLgotaW50IHdiMzVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSkKLXsKLQlQQURBUFRFUglBZGFwdGVyOwotCVBXQkxJTlVYCXBXYkxpbnV4OwotCVBXQlVTQgkJcFdiVXNiOwotICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLQlpbnQJcmV0ID0gLTE7Ci0JdTMyCWx0bXA7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCi0JdXNiX2dldF9kZXYodWRldik7Ci0KLQlwcmludGsoIlt3MzV1bmRdd2IzNV9wcm9iZSAtPlxuIik7Ci0KLQkvLyAyMDA2MDYzMC4yIENoZWNrIHRoZSBkZXZpY2UgaWYgaXQgYWxyZWFkeSBiZSBvcGVuZWQKLQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKCB1ZGV2LCAwICksCi0JCQkgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAotCQkJICAgICAgMHgwLCAweDQwMCwgJmx0bXAsIDQsIEhaKjEwMCApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JbHRtcCA9IGNwdV90b19sZTMyKGx0bXApOwotCWlmIChsdG1wKSAgLy8gSXMgYWxyZWFkeSBpbml0aWFsaXplZD8KLQkJZ290byBlcnJvcjsKLQotCUFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihBREFQVEVSKSwgR0ZQX0tFUk5FTCk7Ci0KLQlteV9hZGFwdGVyID0gQWRhcHRlcjsKLQlwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXBXYlVzYiA9ICZBZGFwdGVyLT5zSHdEYXRhLldiVXNiOwotCXBXYlVzYi0+dWRldiA9IHVkZXY7Ci0KLSAgICAgICAgaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0gICAgICAgIGVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQotCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpIHsKLQkJcHJpbnRrKCJbdzM1dW5kXSBXb3JraW5nIG9uIFVTQiAyLjBcbiIpOwotCQlwV2JVc2ItPklzVXNiMjAgPSAxOwotCX0KLQotCWlmICghV2JXTGFuSW5pdGlhbGl6ZShBZGFwdGVyKSkgewotCQlwcmludGsoIlt3MzV1bmRdV2JXTGFuSW5pdGlhbGl6ZSBmYWlsXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQl7Ci0JCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdjsKLQkJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OwotCQlzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOwotCQlpbnQgcmVzOwotCi0JCWRldiA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnByaXYpLCAmd2Jzb2Z0X29wcyk7Ci0KLQkJaWYgKCFkZXYpIHsKLQkJCXByaW50aygidzM1dW5kOiBpZWVlODAyMTEgYWxsb2MgZmFpbGVkXG4iICk7Ci0JCQlCVUcoKTsKLQkJfQotCi0JCW15X2RldiA9IGRldjsKLQotCQlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZ1ZGV2LT5kZXYpOwotCQl7Ci0JCQlwaHdfZGF0YV90IHBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQkJCXVuc2lnbmVkIGNoYXIJCWRldl9hZGRyW01BWF9BRERSX0xFTl07Ci0JCQloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKHBId0RhdGEsIGRldl9hZGRyKTsKLQkJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGRldiwgZGV2X2FkZHIpOwotCQl9Ci0KLQotCQlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gMTI7CS8qIEZJWE1FICovCi0JCWRldi0+ZmxhZ3MgPSAwOwotCi0JCWRldi0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDEwMDA7Ci0vLwkJZGV2LT5tYXhfcnNzaSA9IDEwMDsKLQotCQlkZXYtPnF1ZXVlcyA9IDE7Ci0KLQkJYmFuZC5jaGFubmVscyA9IHdic29mdF9jaGFubmVsczsKLQkJYmFuZC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRSh3YnNvZnRfY2hhbm5lbHMpOwotCQliYW5kLmJpdHJhdGVzID0gd2Jzb2Z0X3JhdGVzOwotCQliYW5kLm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKHdic29mdF9yYXRlcyk7Ci0KLQkJZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYmFuZDsKLSNpZiAwCi0JCXdic29mdF9tb2Rlc1swXS5udW1fY2hhbm5lbHMgPSAxOwotCQl3YnNvZnRfbW9kZXNbMF0uY2hhbm5lbHMgPSB3YnNvZnRfY2hhbm5lbHM7Ci0JCXdic29mdF9tb2Rlc1swXS5tb2RlID0gTU9ERV9JRUVFODAyMTFCOwotCQl3YnNvZnRfbW9kZXNbMF0ubnVtX3JhdGVzID0gQVJSQVlfU0laRSh3YnNvZnRfcmF0ZXMpOwotCQl3YnNvZnRfbW9kZXNbMF0ucmF0ZXMgPSB3YnNvZnRfcmF0ZXM7Ci0KLQkJcmVzID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3bW9kZShkZXYsICZ3YnNvZnRfbW9kZXNbMF0pOwotCQlCVUdfT04ocmVzKTsKLSNlbmRpZgotCi0JCXJlcyA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhkZXYpOwotCQlCVUdfT04ocmVzKTsKLQl9Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKCBpbnRmLCBBZGFwdGVyICk7Ci0KLQlwcmludGsoIlt3MzV1bmRdIF9wcm9iZSBPS1xuIik7Ci0JcmV0dXJuIDA7Ci1lcnJvcjoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotdm9pZCBwYWNrZXRfY2FtZShjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cyA9IHswfTsKLQotCWlmICghd2Jzb2Z0X2VuYWJsZWQpCi0JCXJldHVybjsKLQotCXNrYiA9IGRldl9hbGxvY19za2IoUGFja2V0U2l6ZSk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcGFja2V0LCBGSVhNRVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoc2tiX3B1dChza2IsIFBhY2tldFNpemUpLAotCSAgICAgICBwUnhCdWZmZXJBZGRyZXNzLAotCSAgICAgICBQYWNrZXRTaXplKTsKLQotLyoKLQlyeF9zdGF0dXMucmF0ZSA9IDEwOwotCXJ4X3N0YXR1cy5jaGFubmVsID0gMTsKLQlyeF9zdGF0dXMuZnJlcSA9IDEyMzQ1OwotCXJ4X3N0YXR1cy5waHltb2RlID0gTU9ERV9JRUVFODAyMTFCOwotKi8KLQotCWllZWU4MDIxMV9yeF9pcnFzYWZlKG15X2Rldiwgc2tiLCAmcnhfc3RhdHVzKTsKLX0KLQotdW5zaWduZWQgY2hhcgotV2JVc2JfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLQotdm9pZAotV2JVc2JfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci19Ci0KLWludCB3YjM1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQkvKiBuZXRkZXZfcHJpdigpIG9yIG5ldGRldi0+bWxfcHJpdiBzaG91bGQgcmVmZXJlbmNlIHRvIHRoZSBhZGRyZXNzIG9mCi0JICogcHJpdmF0ZSBkYXRhKFBBREFQVEVSKS4gSXQgZGVwZW5kcyBvbiB3aGV0aGVyIHByaXZhdGUgZGF0YSBtZW1vcnkgaXMKLQkgKiBhbGxvY2F0ZWQgd2hlbiBhbGxvY19uZXRkZXYoKS4KLQkgKi8KLQlQQURBUFRFUiBBZGFwdGVyID0gKFBBREFQVEVSKW5ldGRldl9wcml2KG5ldGRldik7Ci0JcGh3X2RhdGFfdCBwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0KLSAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKLQotCS8vVE9ETyA6IHB1dCBoZXJlIHRlbXBvcmFyaWx5Ci0JaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KHBId0RhdGEsIDEpOyAvLyBvcGVuIGFjY2VwdCBicm9hZGNhc3QKLQotCXJldHVybiAwOwotfQotCi1pbnQgd2IzNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB3YjM1X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0JUFdCTElOVVggcFdiTGludXg7Ci0JUEFEQVBURVIgQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQotICAgICAgICBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCi0JLy8gQ2FyZCByZW1vdmUKLQlXYldsYW5IYWx0KEFkYXB0ZXIpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3YjM1X2RyaXZlciA9IHsKLQkubmFtZQkJPSAidzM1dW5kIiwKLQkuaWRfdGFibGUJPSB3YjM1X3RhYmxlLAotCS5wcm9iZQkJPSB3YjM1X3Byb2JlLAotCS5kaXNjb25uZWN0CT0gd2IzNV9kaXNjb25uZWN0LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd2IzNV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHVzYl9yZWdpc3Rlcigmd2IzNV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgd2IzNV9leGl0KHZvaWQpCi17Ci0JdXNiX2RlcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQod2IzNV9pbml0KTsKLW1vZHVsZV9leGl0KHdiMzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTI5ZTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2JfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0vLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICB3YnVzYl9mLmgKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBMaW51eCBkcml2ZXIuCi0vLwotLy8gIEF1dGhvcjoKLS8vCi0vLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0KLWludCB3YjM1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1pbnQgd2IzNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXVuc2lnbmVkIGNoYXIgV2JVc2JfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpOwotdm9pZCBXYlVzYl9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSk7Ci11bnNpZ25lZCBjaGFyIFdiV0xhbkluaXRpYWxpemUoUEFEQVBURVIgQWRhcHRlcik7Ci0jZGVmaW5lCVdiVXNiX1N0b3AoIF9BICkKLQotaW50IHdiMzVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKTsKLXZvaWQgd2IzNV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLQotCi0jZGVmaW5lIHdiX3VzYl9zdWJtaXRfdXJiKF9BKSB1c2Jfc3VibWl0X3VyYihfQSwgR0ZQX0FUT01JQykKLSNkZWZpbmUgd2JfdXNiX2FsbG9jX3VyYihfQSkgdXNiX2FsbG9jX3VyYihfQSwgR0ZQX0FUT01JQykKLQotI2RlZmluZSBXYlVzYl9DaGVja0ZvckhhbmcoIF9QICkKLSNkZWZpbmUgV2JVc2JfRGV0ZWN0U3RhcnQoIF9QLCBfSSApCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2Jfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2Jfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxZDUzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotLy8gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgd2J1c2Jfcy5oCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgTGludXggZHJpdmVyLgotLy8KLS8vICBBdXRob3I6Ci0vLwotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi0jZGVmaW5lIE9TX1NMRUVQKCBfTVQgKQl7IHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKLQkJCSAgc2NoZWR1bGVfdGltZW91dCggX01UKkhaLzEwMDAwMDAgKTsgfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgUldfQ09OVEVYVCAtLQotLy8KLS8vICBVc2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgaW8gaXJwcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXR5cGVkZWYgc3RydWN0IF9SV19DT05URVhUCi17Ci0Jdm9pZCoJCQlwSHdEYXRhOwotCVBVUkIJCQlwVXJiOwotCXZvaWQqCQkJcENhbGxCYWNrRnVuY3Rpb25QYXJhbWV0ZXI7Ci19IFJXX0NPTlRFWFQsICpQUldfQ09OVEVYVDsKLQotCi0KLQotI2RlZmluZSBEUklWRVJfQVVUSE9SICJPcmlnaW5hbCBieTogSmVmZiBMZWU8WVlfTGVlQGlzc2MuY29tLnR3PiBBZGFwdGVkIHRvIDIuNi54IGJ5IENvc3RhbnRpbm8gTGVhbmRybyAoUnhhcnQgRGVza3RvcCkgPGxlX2Nvc3RhbnRpbm9AcGl4YXJ0YXJnZW50aW5hLmNvbS5hcj4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAgIklTODlDMzUgODAyLjExYmcgV0xBTiBVU0IgRHJpdmVyIgotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1dCVVNCIHsKLQl1MzIJSXNVc2IyMDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQl1MzIJRGV0ZWN0Q291bnQ7Ci19IFdCVVNCLCAqUFdCVVNCOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAppbmRleCAyNjhjZjkxLi42MDdiYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9sb2NhbHBhcmEuaApAQCAtMSw2ICsxLDEyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9MT0NBTFBBUkFfSAorI2RlZmluZSBfX1dJTkJPTkRfTE9DQUxQQVJBX0gKKwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBMb2NhbFBhcmEuaCAtCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCisKIC8vRGVmaW5lIHRoZSBsb2NhbCBhYmlsaXR5CiAKICNkZWZpbmUgTE9DQUxfREVGQVVMVF9CRUFDT05fUEVSSU9ECQkJMTAwCQkvL21zCkBAIC0yNSw3ICszMSw3IEBACiAjZGVmaW5lIExPQ0FMX1VOS05PV05fNV9DSEFOTkVMX05VTQkJCTM0CS8vbm90IGluY2x1ZGUgMTY1CiAKIAotI2RlZmluZSBwc0xPQ0FMCQkJKCYoQWRhcHRlci0+c0xvY2FsUGFyYSkpCisjZGVmaW5lIHBzTE9DQUwJCQkoJihhZGFwdGVyLT5zTG9jYWxQYXJhKSkKIAogI2RlZmluZSBNT0RFXzgwMl8xMV9CRwkJCTAKICNkZWZpbmUgTU9ERV84MDJfMTFfQQkJCTEKQEAgLTE0Myw3ICsxNDksNiBAQAogCiAgICAgLy8vLyBwb3dlci1zYXZlIHZhcmlhYmxlcwogICAgIHU4ICAJCSAgCWlQb3dlclNhdmVNb2RlOyAgICAgLy8gMCBpbmRpY2F0ZXMgaXQgaXMgb24sIDEgaW5kaWNhdGVzIGl0IGlzIG9mZgotCXU4CQkJU2h1dERvd25lZDsKIAl1OAkJCUFUSU1tb2RlOwogCXU4CQkJRXhjbHVkZVVuZW5jcnlwdGVkOwogCkBAIC0yNzIsNCArMjc3LDQgQEAKIAogfSBXQl9MT0NBTERFU0NSSVBULCAqUFdCX0xPQ0FMREVTQ1JJUFQ7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAppbmRleCAwMzFkMmNiLi4wZDE2MTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpZm5kZWYgX01BQ19TdHJ1Y3R1cmVzX0hfCiAjZGVmaW5lIF9NQUNfU3RydWN0dXJlc19IXwogCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTb21lIG1pc2NlbGxhbmVvdXMgZGVmaW5pdGlvbnMKQEAgLTExNSwxMCArMTE2LDYgQEAKICNkZWZpbmUgV0xBTl9NQVhfUEFJUldJU0VfQ0lQSEVSX1NVSVRFX0NPVU5UICAgICgodTE2KSA2KQogI2RlZmluZSBXTEFOX01BWF9BVVRIX0tFWV9NR1RfU1VJVEVfTElTVF9DT1VOVCAgKCh1MTYpIDIpCiAKLSNpZmRlZiBXQl9MSU5VWAotI2RlZmluZSBVTkFMSUdORUQKLSNlbmRpZgotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiB0eXBlZGVmIGVudW0gZW51bV9Qb3dlck1hbmFnZW1lbnRNb2RlCiB7CkBAIC00NjQsNyArNDYxLDcgQEAKIHsKIAl1OAkJCQkJRWxlbWVudF9JRDsKIAl1OAkJCQkJTGVuZ3RoOwotCVVOQUxJR05FRCBTVUlURV9TRUxFQ1RPUglPdWlXUEFBZGRpdGlvbmFsOy8vV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEKKwlTVUlURV9TRUxFQ1RPUglPdWlXUEFBZGRpdGlvbmFsOy8vV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEKIAl1MTYJCQkJCVZlcnNpb247CiAJU1VJVEVfU0VMRUNUT1IJCUdyb3VwS2V5U3VpdGU7CiAJdTE2CQkJCQlQYWlyd2lzZUtleVN1aXRlQ291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCmluZGV4IGYxZGU4MTMuLmU0MzE0MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCkBAIC0xLDQ0NSArMSwzOSBAQAorI2luY2x1ZGUgImRzX3RraXAuaCIKKyNpbmNsdWRlICJnbF84MDIxMS5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAibWxtZXR4cnhfZi5oIgorI2luY2x1ZGUgIm10b19mLmgiCiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXZvaWQKLU1kc19yZXNldF9kZXNjcmlwdG9yKFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JUE1EUyBwTWRzID0gJkFkYXB0ZXItPk1kczsKLQotCXBNZHMtPlR4UGF1c2UgPSAwOwotCXBNZHMtPlR4VGhyZWFkQ291bnQgPSAwOwotCXBNZHMtPlR4RmlsbEluZGV4ID0gMDsKLQlwTWRzLT5UeERlc0luZGV4ID0gMDsKLQlwTWRzLT5TY2FuVHhQYXVzZSA9IDA7Ci0JbWVtc2V0KHBNZHMtPlR4T3duZXIsIDAsICgoTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSICsgMykgJiB+MHgwMykpOwotfQorI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKIAogdW5zaWduZWQgY2hhcgotTWRzX2luaXRpYWwoUEFEQVBURVIgQWRhcHRlcikKK01kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpCiB7Ci0JUE1EUyBwTWRzID0gJkFkYXB0ZXItPk1kczsKKwlQTURTIHBNZHMgPSAmYWRhcHRlci0+TWRzOwogCi0JcE1kcy0+VHhQYXVzZSA9IEZBTFNFOworCXBNZHMtPlR4UGF1c2UgPSBmYWxzZTsKIAlwTWRzLT5UeFJUU1RocmVzaG9sZCA9IERFRkFVTFRfUlRTVGhyZXNob2xkOwogCXBNZHMtPlR4RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsKIAotCXZSeFRpbWVySW5pdChBZGFwdGVyKTsvL2ZvciBXUEEgY291bnRlcm1lYXN1cmUKLQotCXJldHVybiBoYWxfZ2V0X3R4X2J1ZmZlciggJkFkYXB0ZXItPnNId0RhdGEsICZwTWRzLT5wVHhCdWZmZXIgKTsKKwlyZXR1cm4gaGFsX2dldF90eF9idWZmZXIoICZhZGFwdGVyLT5zSHdEYXRhLCAmcE1kcy0+cFR4QnVmZmVyICk7CiB9CiAKIHZvaWQKLU1kc19EZXN0cm95KFBBREFQVEVSIEFkYXB0ZXIpCitNZHNfRGVzdHJveShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKQogewotCXZSeFRpbWVyU3RvcChBZGFwdGVyKTsKIH0KIAotdm9pZAotTWRzX1R4KFBBREFQVEVSIEFkYXB0ZXIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JUE1EUwkJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JREVTQ1JJUFRPUglUeERlczsKLQlQREVTQ1JJUFRPUglwVHhEZXMgPSAmVHhEZXM7Ci0JdTgJCSpYbWl0QnVmQWRkcmVzczsKLQl1MTYJCVhtaXRCdWZTaXplLCBQYWNrZXRTaXplLCBzdG1wLCBDdXJyZW50U2l6ZSwgRnJhZ21lbnRUaHJlc2hvbGQ7Ci0JdTgJCUZpbGxJbmRleCwgVHhEZXNJbmRleCwgRnJhZ21lbnRDb3VudCwgRmlsbENvdW50OwotCXVuc2lnbmVkIGNoYXIJQnVmZmVyRmlsbGVkID0gRkFMU0UsIE1JQ0FkZCA9IDA7Ci0KLQotCWlmIChwTWRzLT5UeFBhdXNlKQotCQlyZXR1cm47Ci0JaWYgKCFoYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkpCi0JCXJldHVybjsKLQotCS8vT25seSBvbmUgdGhyZWFkIGNhbiBiZSBydW4gaGVyZQotCWlmICghT1NfQVRPTUlDX0lOQyggQWRhcHRlciwgJnBNZHMtPlR4VGhyZWFkQ291bnQpID09IDEpCi0JCWdvdG8gY2xlYW51cDsKLQotCS8vIFN0YXJ0IHRvIGZpbGwgdGhlIGRhdGEKLQlkbyB7Ci0JCUZpbGxJbmRleCA9IHBNZHMtPlR4RmlsbEluZGV4OwotCQlpZiAocE1kcy0+VHhPd25lcltGaWxsSW5kZXhdKSB7IC8vIElzIG93bmVkIGJ5IHNvZnR3YXJlIDA6WWVzIDE6Tm8KLSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJCVdCREVCVUcoKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKSk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0KLQkJWG1pdEJ1ZkFkZHJlc3MgPSBwTWRzLT5wVHhCdWZmZXIgKyAoTUFYX1VTQl9UWF9CVUZGRVIgKiBGaWxsSW5kZXgpOyAvL0dldCBidWZmZXIKLQkJWG1pdEJ1ZlNpemUgPSAwOwotCQlGaWxsQ291bnQgPSAwOwotCQlkbyB7Ci0JCQlQYWNrZXRTaXplID0gQWRhcHRlci0+c01sbWVGcmFtZS5sZW47Ci0JCQlpZiAoIVBhY2tldFNpemUpCi0JCQkJYnJlYWs7Ci0KLQkJCS8vRm9yIENoZWNrIHRoZSBidWZmZXIgcmVzb3VyY2UKLQkJCUZyYWdtZW50VGhyZXNob2xkID0gQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQ7Ci0JCQkvLzkzMTEzMC41LmIKLQkJCUZyYWdtZW50Q291bnQgPSBQYWNrZXRTaXplL0ZyYWdtZW50VGhyZXNob2xkICsgMTsKLQkJCXN0bXAgPSBQYWNrZXRTaXplICsgRnJhZ21lbnRDb3VudCozMiArIDg7Ly85MzExMzAuNS5jIDg6TUlDCi0JCQlpZiAoKFhtaXRCdWZTaXplICsgc3RtcCkgPj0gTUFYX1VTQl9UWF9CVUZGRVIpIHsKLQkJCQlwcmludGsoIltNZHNfVHhdIEV4Y2VzcyBtYXggdHggYnVmZmVyLlxuIik7Ci0JCQkJYnJlYWs7IC8vIGJ1ZmZlciBpcyBub3QgZW5vdWdoCi0JCQl9Ci0KLQotCQkJLy8KLQkJCS8vIFN0YXJ0IHRyYW5zbWl0dGluZwotCQkJLy8KLQkJCUJ1ZmZlckZpbGxlZCA9IFRSVUU7Ci0KLQkJCS8qIExlYXZlcyBmaXJzdCB1OCBpbnRhY3QgKi8KLQkJCW1lbXNldCgodTggKilwVHhEZXMgKyAxLCAwLCBzaXplb2YoREVTQ1JJUFRPUikgLSAxKTsKLQotCQkJVHhEZXNJbmRleCA9IHBNZHMtPlR4RGVzSW5kZXg7Ly9HZXQgdGhlIGN1cnJlbnQgSUQKLQkJCXBUeERlcy0+RGVzY3JpcHRvcl9JRCA9IFR4RGVzSW5kZXg7Ci0JCQlwTWRzLT5UeERlc0Zyb21bIFR4RGVzSW5kZXggXSA9IDI7Ly9TdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBvZiBzb3VyY2UgY29tbWluZyBmcm9tCi0JCQlwTWRzLT5UeERlc0luZGV4Kys7Ci0JCQlwTWRzLT5UeERlc0luZGV4ICU9IE1BWF9VU0JfVFhfREVTQ1JJUFRPUjsKLQotCQkJTUxNRV9HZXROZXh0UGFja2V0KCBBZGFwdGVyLCBwVHhEZXMgKTsKLQotCQkJLy8gQ29weSBoZWFkZXIuIDhieXRlIFVTQiArIDI0Ynl0ZSA4MDIuMTFIZHIuIFNldCBUeFJhdGUsIFByZWFtYmxlIHR5cGUKLQkJCU1kc19IZWFkZXJDb3B5KCBBZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7Ci0KLQkJCS8vIEZvciBzcGVlZCB1cCBLZXkgc2V0dGluZwotCQkJaWYgKHBUeERlcy0+RWFwRml4KSB7Ci0jaWZkZWYgX1BFX1RYX0RVTVBfCi0JCQkJV0JERUJVRygoIjM1OiBFUEEgNHRoIGZyYW1lIGRldGVjdGVkLiBTaXplID0gJWRcbiIsIFBhY2tldFNpemUpKTsKLSNlbmRpZgotCQkJCXBId0RhdGEtPklzS2V5UHJlU2V0ID0gMTsKLQkJCX0KLQotCQkJLy8gQ29weSAoZnJhZ21lbnQpIGZyYW1lIGJvZHksIGFuZCBzZXQgVVNCLCA4MDIuMTEgaGRyIGZsYWcKLQkJCUN1cnJlbnRTaXplID0gTWRzX0JvZHlDb3B5KEFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MpOwotCi0JCQkvLyBTZXQgUlRTL0NUUyBhbmQgTm9ybWFsIGR1cmF0aW9uIGZpZWxkIGludG8gYnVmZmVyCi0JCQlNZHNfRHVyYXRpb25TZXQoQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7Ci0KLQkJCS8vCi0JCQkvLyBDYWxjdWxhdGlvbiBNSUMgZnJvbSBidWZmZXIgd2hpY2ggbWF5YmUgZnJhZ21lbnQsIHRoZW4gZmlsbCBpbnRvIHRlbXBvcmFyeSBhZGRyZXNzIDggYnl0ZQotCQkJLy8gOTMxMTMwLjUuZQotCQkJaWYgKE1JQ0FkZCkKLQkJCQlNZHNfTWljRmlsbCggQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyApOwotCi0JCQkvL1NoaWZ0IHRvIHRoZSBuZXh0IGFkZHJlc3MKLQkJCVhtaXRCdWZTaXplICs9IEN1cnJlbnRTaXplOwotCQkJWG1pdEJ1ZkFkZHJlc3MgKz0gQ3VycmVudFNpemU7Ci0KLSNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotCQkJaWYgKChYbWl0QnVmQWRkcmVzc1sgRE9UXzExX0RBX09GRlNFVCs4IF0gJiAweGZjKSAhPSBNQUNfU1VCVFlQRV9NTkdNTlRfUFJPQkVfUkVRVUVTVCkgLy8gKzggZm9yIFVTQiBoZHIKLSNlbmRpZgotCQkJCXBNZHMtPlR4VG9nZ2xlID0gVFJVRTsKLQotCQkJLy8gR2V0IHBhY2tldCB0byB0cmFuc21pdCBjb21wbGV0ZWQsIDE6VEVTVFNUQSAyOk1MTUUgMzogTmRpcyBkYXRhCi0JCQlNTE1FX1NlbmRDb21wbGV0ZShBZGFwdGVyLCAwLCBUUlVFKTsKLQotCQkJLy8gU29mdHdhcmUgVFNDIGNvdW50IDIwMDYwMjE0Ci0JCQlwTWRzLT5UeFRzYysrOwotCQkJaWYgKHBNZHMtPlR4VHNjID09IDApCi0JCQkJcE1kcy0+VHhUc2NfMisrOwotCi0JCQlGaWxsQ291bnQrKzsgLy8gMjAwNjA5MjgKLQkJfSB3aGlsZSAoSEFMX1VTQl9NT0RFX0JVUlNUKHBId0RhdGEpKTsgLy8gRW5kIG9mIG11bHRpcGxlIE1TRFUgY29weSBsb29wLiBGQUxTRSA9IHNpbmdsZSBUUlVFID0gbXVsdGlwbGUgc2VuZGluZwotCi0JCS8vIE1vdmUgdG8gdGhlIG5leHQgb25lLCBpZiBuZWNlc3NhcnkKLQkJaWYgKEJ1ZmZlckZpbGxlZCkgewotCQkJLy8gc2l6ZSBzZXR0aW5nCi0JCQlwTWRzLT5UeEJ1ZmZlclNpemVbIEZpbGxJbmRleCBdID0gWG1pdEJ1ZlNpemU7Ci0KLQkJCS8vIDIwMDYwOTI4IHNldCBUeCBjb3VudAotCQkJcE1kcy0+VHhDb3VudEluQnVmZmVyW0ZpbGxJbmRleF0gPSBGaWxsQ291bnQ7Ci0KLQkJCS8vIFNldCBvd25lciBmbGFnCi0JCQlwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0gPSAxOwotCi0JCQlwTWRzLT5UeEZpbGxJbmRleCsrOwotCQkJcE1kcy0+VHhGaWxsSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOwotCQkJQnVmZmVyRmlsbGVkID0gRkFMU0U7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFQYWNrZXRTaXplKSAvLyBObyBtb3JlIHBrIGZvciB0cmFuc21pdHRpbmcKLQkJCWJyZWFrOwotCi0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU3RhcnQgdG8gc2VuZCBieSBsb3dlciBtb2R1bGUKLQkvLwotCWlmICghcEh3RGF0YS0+SXNLZXlQcmVTZXQpCi0JCVdiMzVUeF9zdGFydChwSHdEYXRhKTsKLQotIGNsZWFudXA6Ci0JT1NfQVRPTUlDX0RFQyggQWRhcHRlciwgJnBNZHMtPlR4VGhyZWFkQ291bnQgKTsKLX0KLQotdm9pZAotTWRzX1NlbmRDb21wbGV0ZShQQURBUFRFUiBBZGFwdGVyLCBQVDAyX0RFU0NSSVBUT1IgcFQwMikKLXsKLQlQTURTCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCXBod19kYXRhX3QJcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCXU4CVBhY2tldElkID0gKHU4KXBUMDItPlQwMl9UeF9Qa3RJRDsKLQl1bnNpZ25lZCBjaGFyCVNlbmRPSyA9IFRSVUU7Ci0JdTgJUmV0cnlDb3VudCwgVHhSYXRlOwotCi0JaWYgKHBUMDItPlQwMl9JZ25vcmVSZXN1bHQpIC8vIERvbid0IGNhcmUgdGhlIHJlc3VsdAotCQlyZXR1cm47Ci0JaWYgKHBUMDItPlQwMl9Jc0xhc3RNcGR1KSB7Ci0JCS8vVE9ETzogRFRPIC0tIGdldCB0aGUgcmV0cnkgY291bnQgYW5kIGZyYWdtZW50IGNvdW50Ci0JCS8vIFR4IHJhdGUKLQkJVHhSYXRlID0gcE1kcy0+VHhSYXRlWyBQYWNrZXRJZCBdWyAwIF07Ci0JCVJldHJ5Q291bnQgPSAodTgpcFQwMi0+VDAyX01QRFVfQ250OwotCQlpZiAocFQwMi0+dmFsdWUgJiBGTEFHX0VSUk9SX1RYX01BU0spIHsKLQkJCVNlbmRPSyA9IEZBTFNFOwotCi0JCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0IHx8IHBUMDItPlQwMl9vdXRfb2ZfTWF4VHhNU0RVTGlmdFRpbWUpIHsKLQkJCQkvL3JldHJ5IGVycm9yCi0JCQkJcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ICs9IChSZXRyeUNvdW50KzEpOwotCQkJCS8vW2ZvciB0eCBkZWJ1Z10KLQkJCQlpZiAoUmV0cnlDb3VudDw3KQotCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OwotCQkJCWVsc2UKLQkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKLQkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCQkJV0JERUJVRygoImR0b190eF9yZXRyeV9jb3VudCA9JWRcbiIsIHBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCkpOwotCQkJCSNlbmRpZgotCQkJCU1UT19TZXRUeENvdW50KEFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7Ci0JCQl9Ci0JCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKLQotCQkJLy9bZm9yIHR4IGRlYnVnXQotCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydF9kdWVfdG9fVEJUVCkKLQkJCQlwSHdEYXRhLT50eF9UQlRUX3N0YXJ0X2NvdW50Kys7Ci0JCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X3dpdGhvdXRfZW5jcnlwdGlvbl9kdWVfdG9fd2VwX29uX2ZhbHNlKQotCQkJCXBId0RhdGEtPnR4X1dlcE9uX2ZhbHNlX2NvdW50Kys7Ci0JCQlpZiAocFQwMi0+VDAyX2Rpc2NhcmRfZHVlX3RvX251bGxfd2VwX2tleSkKLQkJCQlwSHdEYXRhLT50eF9OdWxsX2tleV9jb3VudCsrOwotCQl9IGVsc2UgewotCQkJaWYgKHBUMDItPlQwMl9lZmZlY3RpdmVfdHJhbnNtaXNzaW9uX3JhdGUpCi0JCQkJcEh3RGF0YS0+dHhfRVRSX2NvdW50Kys7Ci0JCQlNVE9fU2V0VHhDb3VudChBZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOwotCQl9Ci0KLQkJLy8gQ2xlYXIgc2VuZCByZXN1bHQgYnVmZmVyCi0JCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdID0gMDsKLQl9IGVsc2UKLQkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gfD0gKCh1MTYpKHBUMDItPnZhbHVlICYgMHgwZmZmZikpOwotfQotCi12b2lkCi1NZHNfSGVhZGVyQ29weShQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQotewotCVBNRFMJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JdTgJKnNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1swXTsvLzkzMTEzMC41LmcKLQlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKLQlQVDAxX0RFU0NSSVBUT1IJcFQwMTsKLQl1MTYJc3RtcDsKLQl1OAlpLCBjdG1wMSwgY3RtcDIsIGN0bXBmOwotCXUxNglGcmFnbWVudFRocmVzaG9sZCA9IENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xEOwotCi0KLQlzdG1wID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7Ci0JLy8KLQkvLyBTZXQgVVNCIGhlYWRlciA4IGJ5dGUKLQkvLwotCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKVRhcmdldEJ1ZmZlcjsKLQlUYXJnZXRCdWZmZXIgKz0gNDsKLQlwVDAxID0gKFBUMDFfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7Ci0JVGFyZ2V0QnVmZmVyICs9IDQ7Ci0KLQlwVDAwLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKLQlwVDAxLT52YWx1ZSA9IDA7Ly8gQ2xlYXIKLQotCXBUMDAtPlQwMF90eF9wYWNrZXRfaWQgPSBwRGVzLT5EZXNjcmlwdG9yX0lEOy8vIFNldCBwYWNrZXQgSUQKLQlwVDAwLT5UMDBfaGVhZGVyX2xlbmd0aCA9IDI0Oy8vIFNldCBoZWFkZXIgbGVuZ3RoCi0JcFQwMS0+VDAxX3JldHJ5X2Fib3J0X2ViYWJsZSA9IDE7Ly85MjEwMTMgOTMxMTMwLjUuaAotCi0JLy8gS2V5IElEIHNldHVwCi0JcFQwMS0+VDAxX3dlcF9pZCA9IDA7Ci0KLQlGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOwkvL0RvIG5vdCBmcmFnbWVudAotCS8vIENvcHkgZnVsbCBkYXRhLCB0aGUgMSdzdCBidWZmZXIgY29udGFpbiBhbGwgdGhlIGRhdGEgOTMxMTMwLjUuagotCW1lbWNweSggVGFyZ2V0QnVmZmVyLCBzcmNfYnVmZmVyLCBET1RfMTFfTUFDX0hFQURFUl9TSVpFICk7Ly8gQ29weSBoZWFkZXIKLQlwRGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHNyY19idWZmZXIgKyBET1RfMTFfTUFDX0hFQURFUl9TSVpFOwotCXBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplIC09IERPVF8xMV9NQUNfSEVBREVSX1NJWkU7Ci0JcERlcy0+YnVmZmVyX3NpemVbMF0gPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKLQotCS8vIFNldCBmcmFnbWVudCB0aHJlc2hvbGQKLQlGcmFnbWVudFRocmVzaG9sZCAtPSAoRE9UXzExX01BQ19IRUFERVJfU0laRSArIDQpOwotCXBEZXMtPkZyYWdtZW50VGhyZXNob2xkID0gRnJhZ21lbnRUaHJlc2hvbGQ7Ci0KLQkvLyBTZXQgbW9yZSBmcmFnIGJpdAotCVRhcmdldEJ1ZmZlclsxXSB8PSAweDA0Oy8vIFNldCBtb3JlIGZyYWcgYml0Ci0KLQkvLwotCS8vIFNldCB0eCByYXRlCi0JLy8KLQlzdG1wID0gKih1MTYgKikoVGFyZ2V0QnVmZmVyKzMwKTsgLy8gMm4gYWxpZ25tZW50IGFkZHJlc3MKLQotCS8vVXNlIGJhc2ljIHJhdGUKLQljdG1wMSA9IGN0bXBmID0gQ1VSUkVOVF9UWF9SQVRFX0ZPUl9NTkc7Ci0KLQlwRGVzLT5UeFJhdGUgPSBjdG1wMTsKLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIlR4IHJhdGUgPSV4XG4iLCBjdG1wMSkpOwotCSNlbmRpZgotCi0JcFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9IChjdG1wMSUzKSA/IDAgOiAxOwotCi0JZm9yKCBpPTA7IGk8MjsgaSsrICkgewotCQlpZiggaSA9PSAxICkKLQkJCWN0bXAxID0gY3RtcGY7Ci0KLQkJcE1kcy0+VHhSYXRlW3BEZXMtPkRlc2NyaXB0b3JfSURdW2ldID0gY3RtcDE7IC8vIGJhY2t1cCB0aGUgdGEgcmF0ZSBhbmQgZmFsbCBiYWNrIHJhdGUKLQotCQlpZiggY3RtcDEgPT0gMTA4KSBjdG1wMiA9IDc7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDk2ICkgY3RtcDIgPSA2OyAvLyBSYXRlIGNvbnZlcnQgZm9yIFVTQgotCQllbHNlIGlmKCBjdG1wMSA9PSA3MiApIGN0bXAyID0gNTsKLQkJZWxzZSBpZiggY3RtcDEgPT0gNDggKSBjdG1wMiA9IDQ7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDM2ICkgY3RtcDIgPSAzOwotCQllbHNlIGlmKCBjdG1wMSA9PSAyNCApIGN0bXAyID0gMjsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMTggKSBjdG1wMiA9IDE7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDEyICkgY3RtcDIgPSAwOwotCQllbHNlIGlmKCBjdG1wMSA9PSAyMiApIGN0bXAyID0gMzsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMTEgKSBjdG1wMiA9IDI7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDQgICkgY3RtcDIgPSAxOwotCQllbHNlIGN0bXAyID0gMDsgLy8gaWYoIGN0bXAxID09IDIgICkgb3IgZGVmYXVsdAotCi0JCWlmKCBpID09IDAgKQotCQkJcFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPSBjdG1wMjsKLQkJZWxzZQotCQkJcFQwMS0+VDAxX2ZhbGxfYmFja19yYXRlID0gY3RtcDI7Ci0JfQotCi0JLy8KLQkvLyBTZXQgcHJlYW1ibGUgdHlwZQotCS8vCi0JaWYgKChwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID09IDApICYmIChwVDAxLT5UMDFfdHJhbnNtaXRfcmF0ZSA9PSAwKSkJLy8gUkFURV8xTQotCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgV0xBTl9QUkVBTUJMRV9UWVBFX0xPTkc7Ci0JZWxzZQotCQlwRGVzLT5QcmVhbWJsZU1vZGUgPSAgQ1VSUkVOVF9QUkVBTUJMRV9NT0RFOwotCXBUMDEtPlQwMV9wbGNwX2hlYWRlcl9sZW5ndGggPSBwRGVzLT5QcmVhbWJsZU1vZGU7CS8vIFNldCBwcmVhbWJsZQotCi19Ci0KLS8vIFRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIDRuIHNpemUgb2YgdXNiIHBrCi11MTYKLU1kc19Cb2R5Q29weShQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQotewotCVBUMDBfREVTQ1JJUFRPUglwVDAwOwotCVBNRFMJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0JdTgJKmJ1ZmZlcjsKLQl1OAkqc3JjX2J1ZmZlcjsKLQl1OAkqcGN0bXA7Ci0JdTE2CVNpemUgPSAwOwotCXUxNglTaXplTGVmdCwgQ29weVNpemUsIENvcHlMZWZ0LCBzdG1wOwotCXU4CWJ1Zl9pbmRleCwgRnJhZ21lbnRDb3VudCA9IDA7Ci0KLQotCS8vIENvcHkgZnJhZ21lbnQgYm9keQotCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlcjsgLy8gc2hpZnQgOEIgdXNiICsgMjRCIDgwMi4xMQotCVNpemVMZWZ0ID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7Ci0JYnVmX2luZGV4ID0gcERlcy0+YnVmZmVyX3N0YXJ0X2luZGV4OwotCi0JcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOwotCXdoaWxlIChTaXplTGVmdCkgewotCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7Ci0JCUNvcHlTaXplID0gU2l6ZUxlZnQ7Ci0JCWlmIChTaXplTGVmdCA+IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkKSB7Ci0JCQlDb3B5U2l6ZSA9IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkOwotCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgQ29weVNpemU7Ly9TZXQgVVNCIGxlbmd0aAotCQl9IGVsc2UKLQkJCXBUMDAtPlQwMF9mcmFtZV9sZW5ndGggPSAyNCArIFNpemVMZWZ0Oy8vU2V0IFVTQiBsZW5ndGgKLQotCQlTaXplTGVmdCAtPSBDb3B5U2l6ZTsKLQotCQkvLyAxIEJ5dGUgb3BlcmF0aW9uCi0JCXBjdG1wID0gKHU4ICopKCBidWZmZXIgKyA4ICsgRE9UXzExX1NFUVVFTkNFX09GRlNFVCApOwotCQkqcGN0bXAgJj0gMHhmMDsKLQkJKnBjdG1wIHw9IEZyYWdtZW50Q291bnQ7Ly85MzExMzAuNS5tCi0JCWlmKCAhRnJhZ21lbnRDb3VudCApCi0JCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDE7Ci0KLQkJYnVmZmVyICs9IDMyOyAvLyA4QiB1c2IgKyAyNEIgODAyLjExIGhlYWRlcgotCQlTaXplICs9IDMyOwotCi0JCS8vIENvcHkgaW50byBidWZmZXIKLQkJc3RtcCA9IENvcHlTaXplICsgMzsKLQkJc3RtcCAmPSB+MHgwMzsvLzRuIEFsaWdubWVudAotCQlTaXplICs9IHN0bXA7Ly8gQ3VycmVudCA0biBvZmZzZXQgb2YgbXBkdQotCi0JCXdoaWxlIChDb3B5U2l6ZSkgewotCQkJLy8gQ29weSBib2R5Ci0JCQlzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKLQkJCUNvcHlMZWZ0ID0gQ29weVNpemU7Ci0JCQlpZiAoQ29weVNpemUgPj0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSkgewotCQkJCUNvcHlMZWZ0ID0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XTsKLQotCQkJCS8vIEdldCB0aGUgbmV4dCBidWZmZXIgb2YgZGVzY3JpcHRvcgotCQkJCWJ1Zl9pbmRleCsrOwotCQkJCWJ1Zl9pbmRleCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7Ci0JCQl9IGVsc2UgewotCQkJCXU4CSpwY3RtcCA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF07Ci0JCQkJcGN0bXAgKz0gQ29weVNpemU7Ci0JCQkJcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XSA9IHBjdG1wOwotCQkJCXBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF0gLT0gQ29weVNpemU7Ci0JCQl9Ci0KLQkJCW1lbWNweShidWZmZXIsIHNyY19idWZmZXIsIENvcHlMZWZ0KTsKLQkJCWJ1ZmZlciArPSBDb3B5TGVmdDsKLQkJCUNvcHlTaXplIC09IENvcHlMZWZ0OwotCQl9Ci0KLQkJLy8gOTMxMTMwLjUubgotCQlpZiAocE1kcy0+TWljQWRkKSB7Ci0JCQlpZiAoIVNpemVMZWZ0KSB7Ci0JCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSBwTWRzLT5NaWNBZGQ7Ci0JCQkJcE1kcy0+TWljV3JpdGVTaXplWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBwTWRzLT5NaWNBZGQ7Ci0JCQkJcE1kcy0+TWljQWRkID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYoIFNpemVMZWZ0IDwgOCApIC8vOTMxMTMwLjUucAotCQkJewotCQkJCXBNZHMtPk1pY0FkZCA9IFNpemVMZWZ0OwotCQkJCXBNZHMtPk1pY1dyaXRlQWRkcmVzc1sgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gYnVmZmVyIC0gKCA4IC0gU2l6ZUxlZnQgKTsKLQkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IDggLSBTaXplTGVmdDsKLQkJCQlwTWRzLT5NaWNXcml0ZUluZGV4Kys7Ci0JCQl9Ci0JCX0KLQotCQkvLyBEb2VzIGl0IG5lZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBoZWFkZXIgZm9yIG5leHQgbXBkdT8KLQkJaWYgKFNpemVMZWZ0KSB7Ci0JCQlidWZmZXIgPSBUYXJnZXRCdWZmZXIgKyBTaXplOyAvLyBHZXQgdGhlIG5leHQgNG4gc3RhcnQgYWRkcmVzcwotCQkJbWVtY3B5KCBidWZmZXIsIFRhcmdldEJ1ZmZlciwgMzIgKTsvL0NvcHkgOEIgVVNCICsyNEIgODAyLjExCi0JCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7Ci0JCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDA7Ci0JCX0KLQotCQlGcmFnbWVudENvdW50Kys7Ci0JfQotCi0JcFQwMC0+VDAwX2xhc3RfbXBkdSA9IDE7Ci0JcFQwMC0+VDAwX0lzTGFzdE1wZHUgPSAxOwotCWJ1ZmZlciA9ICh1OCAqKXBUMDAgKyA4OyAvLyArOCBmb3IgVVNCIGhkcgotCWJ1ZmZlclsxXSAmPSB+MHgwNDsgLy8gQ2xlYXIgbW9yZSBmcmFnIGJpdCBvZiA4MDIuMTEgZnJhbWUgY29udHJvbAotCXBEZXMtPkZyYWdtZW50Q291bnQgPSBGcmFnbWVudENvdW50OyAvLyBVcGRhdGUgdGhlIGNvcnJlY3QgZnJhZ21lbnQgbnVtYmVyCi0JcmV0dXJuIFNpemU7Ci19Ci0KLQotdm9pZAotTWRzX0R1cmF0aW9uU2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqYnVmZmVyICkKK3N0YXRpYyB2b2lkIE1kc19EdXJhdGlvblNldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKmJ1ZmZlcikKIHsKIAlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKIAlQVDAxX0RFU0NSSVBUT1IJcFQwMTsKIAl1MTYJRHVyYXRpb24sIE5leHRCb2R5TGVuLCBPZmZzZXRTaXplOwogCXU4CVJhdGUsIGk7Ci0JdW5zaWduZWQgY2hhcglDVFNfb24gPSBGQUxTRSwgUlRTX29uID0gRkFMU0U7CisJdW5zaWduZWQgY2hhcglDVFNfb24gPSBmYWxzZSwgUlRTX29uID0gZmFsc2U7CiAJUFQwMF9ERVNDUklQVE9SIHBOZXh0VDAwOwogCXUxNiBCb2R5TGVuID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJvR3JvdXBBZGRyID0gRkFMU0U7Ci0KKwl1bnNpZ25lZCBjaGFyIGJvR3JvdXBBZGRyID0gZmFsc2U7CiAKIAlPZmZzZXRTaXplID0gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQgKyAzMiArIDM7CiAJT2Zmc2V0U2l6ZSAmPSB+MHgwMzsKQEAgLTQ1Miw3ICs0Niw3IEBACiAJcE5leHRUMDAgPSAoUFQwMF9ERVNDUklQVE9SKShidWZmZXIrT2Zmc2V0U2l6ZSk7CiAKIAlpZiggYnVmZmVyWyBET1RfMTFfREFfT0ZGU0VUKzggXSAmIDB4MSApIC8vICs4IGZvciBVU0IgaGRyCi0JCWJvR3JvdXBBZGRyID0gVFJVRTsKKwkJYm9Hcm91cEFkZHIgPSB0cnVlOwogCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJLy8gU2V0IFJUUy9DVFMgbWVjaGFuaXNtCkBAIC00NjcsMTMgKzYxLDEzIEBACiAJCUJvZHlMZW4gKz0gNDsJLy9DUkMKIAogCQlpZiggQm9keUxlbiA+PSBDVVJSRU5UX1JUU19USFJFU0hPTEQgKQotCQkJUlRTX29uID0gVFJVRTsgLy8gVXNpbmcgUlRTCisJCQlSVFNfb24gPSB0cnVlOyAvLyBVc2luZyBSVFMKIAkJZWxzZQogCQl7CiAJCQlpZiggcFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSApIC8vIElzIHVzaW5nIE9GRE0KIAkJCXsKIAkJCQlpZiggQ1VSUkVOVF9QUk9URUNUX01FQ0hBTklTTSApIC8vIElzIHVzaW5nIHByb3RlY3QKLQkJCQkJQ1RTX29uID0gVFJVRTsgLy8gVXNpbmcgQ1RTCisJCQkJCUNUU19vbiA9IHRydWU7IC8vIFVzaW5nIENUUwogCQkJfQogCQl9CiAJfQpAQCAtNjI0LDkgKzIxOCwzOTQgQEAKIAogfQogCi12b2lkIE1EU19FdGhlcm5ldFBhY2tldFJlY2VpdmUoICBQQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSApCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJuIHRoZSA0biBzaXplIG9mIHVzYiBwaworc3RhdGljIHUxNiBNZHNfQm9keUNvcHkoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzLCB1OCAqVGFyZ2V0QnVmZmVyKQogewotCQlPU19SRUNFSVZFX1BBQ0tFVF9JTkRJQ0FURSggQWRhcHRlciwgcFJ4TGF5ZXIxICk7CisJUFQwMF9ERVNDUklQVE9SCXBUMDA7CisJUE1EUwlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwl1OAkqYnVmZmVyOworCXU4CSpzcmNfYnVmZmVyOworCXU4CSpwY3RtcDsKKwl1MTYJU2l6ZSA9IDA7CisJdTE2CVNpemVMZWZ0LCBDb3B5U2l6ZSwgQ29weUxlZnQsIHN0bXA7CisJdTgJYnVmX2luZGV4LCBGcmFnbWVudENvdW50ID0gMDsKKworCisJLy8gQ29weSBmcmFnbWVudCBib2R5CisJYnVmZmVyID0gVGFyZ2V0QnVmZmVyOyAvLyBzaGlmdCA4QiB1c2IgKyAyNEIgODAyLjExCisJU2l6ZUxlZnQgPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKKwlidWZfaW5kZXggPSBwRGVzLT5idWZmZXJfc3RhcnRfaW5kZXg7CisKKwlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7CisJd2hpbGUgKFNpemVMZWZ0KSB7CisJCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKKwkJQ29weVNpemUgPSBTaXplTGVmdDsKKwkJaWYgKFNpemVMZWZ0ID4gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQpIHsKKwkJCUNvcHlTaXplID0gcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQ7CisJCQlwVDAwLT5UMDBfZnJhbWVfbGVuZ3RoID0gMjQgKyBDb3B5U2l6ZTsvL1NldCBVU0IgbGVuZ3RoCisJCX0gZWxzZQorCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgU2l6ZUxlZnQ7Ly9TZXQgVVNCIGxlbmd0aAorCisJCVNpemVMZWZ0IC09IENvcHlTaXplOworCisJCS8vIDEgQnl0ZSBvcGVyYXRpb24KKwkJcGN0bXAgPSAodTggKikoIGJ1ZmZlciArIDggKyBET1RfMTFfU0VRVUVOQ0VfT0ZGU0VUICk7CisJCSpwY3RtcCAmPSAweGYwOworCQkqcGN0bXAgfD0gRnJhZ21lbnRDb3VudDsvLzkzMTEzMC41Lm0KKwkJaWYoICFGcmFnbWVudENvdW50ICkKKwkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMTsKKworCQlidWZmZXIgKz0gMzI7IC8vIDhCIHVzYiArIDI0QiA4MDIuMTEgaGVhZGVyCisJCVNpemUgKz0gMzI7CisKKwkJLy8gQ29weSBpbnRvIGJ1ZmZlcgorCQlzdG1wID0gQ29weVNpemUgKyAzOworCQlzdG1wICY9IH4weDAzOy8vNG4gQWxpZ25tZW50CisJCVNpemUgKz0gc3RtcDsvLyBDdXJyZW50IDRuIG9mZnNldCBvZiBtcGR1CisKKwkJd2hpbGUgKENvcHlTaXplKSB7CisJCQkvLyBDb3B5IGJvZHkKKwkJCXNyY19idWZmZXIgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdOworCQkJQ29weUxlZnQgPSBDb3B5U2l6ZTsKKwkJCWlmIChDb3B5U2l6ZSA+PSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdKSB7CisJCQkJQ29weUxlZnQgPSBwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdOworCisJCQkJLy8gR2V0IHRoZSBuZXh0IGJ1ZmZlciBvZiBkZXNjcmlwdG9yCisJCQkJYnVmX2luZGV4Kys7CisJCQkJYnVmX2luZGV4ICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKKwkJCX0gZWxzZSB7CisJCQkJdTgJKnBjdG1wID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKKwkJCQlwY3RtcCArPSBDb3B5U2l6ZTsKKwkJCQlwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdID0gcGN0bXA7CisJCQkJcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSAtPSBDb3B5U2l6ZTsKKwkJCX0KKworCQkJbWVtY3B5KGJ1ZmZlciwgc3JjX2J1ZmZlciwgQ29weUxlZnQpOworCQkJYnVmZmVyICs9IENvcHlMZWZ0OworCQkJQ29weVNpemUgLT0gQ29weUxlZnQ7CisJCX0KKworCQkvLyA5MzExMzAuNS5uCisJCWlmIChwTWRzLT5NaWNBZGQpIHsKKwkJCWlmICghU2l6ZUxlZnQpIHsKKwkJCQlwTWRzLT5NaWNXcml0ZUFkZHJlc3NbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IGJ1ZmZlciAtIHBNZHMtPk1pY0FkZDsKKwkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IHBNZHMtPk1pY0FkZDsKKwkJCQlwTWRzLT5NaWNBZGQgPSAwOworCQkJfQorCQkJZWxzZSBpZiggU2l6ZUxlZnQgPCA4ICkgLy85MzExMzAuNS5wCisJCQl7CisJCQkJcE1kcy0+TWljQWRkID0gU2l6ZUxlZnQ7CisJCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSAoIDggLSBTaXplTGVmdCApOworCQkJCXBNZHMtPk1pY1dyaXRlU2l6ZVsgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gOCAtIFNpemVMZWZ0OworCQkJCXBNZHMtPk1pY1dyaXRlSW5kZXgrKzsKKwkJCX0KKwkJfQorCisJCS8vIERvZXMgaXQgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbmV3IGhlYWRlciBmb3IgbmV4dCBtcGR1PworCQlpZiAoU2l6ZUxlZnQpIHsKKwkJCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlciArIFNpemU7IC8vIEdldCB0aGUgbmV4dCA0biBzdGFydCBhZGRyZXNzCisJCQltZW1jcHkoIGJ1ZmZlciwgVGFyZ2V0QnVmZmVyLCAzMiApOy8vQ29weSA4QiBVU0IgKzI0QiA4MDIuMTEKKwkJCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKKwkJCXBUMDAtPlQwMF9maXJzdF9tcGR1ID0gMDsKKwkJfQorCisJCUZyYWdtZW50Q291bnQrKzsKKwl9CisKKwlwVDAwLT5UMDBfbGFzdF9tcGR1ID0gMTsKKwlwVDAwLT5UMDBfSXNMYXN0TXBkdSA9IDE7CisJYnVmZmVyID0gKHU4ICopcFQwMCArIDg7IC8vICs4IGZvciBVU0IgaGRyCisJYnVmZmVyWzFdICY9IH4weDA0OyAvLyBDbGVhciBtb3JlIGZyYWcgYml0IG9mIDgwMi4xMSBmcmFtZSBjb250cm9sCisJcERlcy0+RnJhZ21lbnRDb3VudCA9IEZyYWdtZW50Q291bnQ7IC8vIFVwZGF0ZSB0aGUgY29ycmVjdCBmcmFnbWVudCBudW1iZXIKKwlyZXR1cm4gU2l6ZTsKIH0KIAorc3RhdGljIHZvaWQgTWRzX0hlYWRlckNvcHkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUERFU0NSSVBUT1IgcERlcywgdTggKlRhcmdldEJ1ZmZlcikKK3sKKwlQTURTCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXU4CSpzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbMF07Ly85MzExMzAuNS5nCisJUFQwMF9ERVNDUklQVE9SCXBUMDA7CisJUFQwMV9ERVNDUklQVE9SCXBUMDE7CisJdTE2CXN0bXA7CisJdTgJaSwgY3RtcDEsIGN0bXAyLCBjdG1wZjsKKwl1MTYJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKIAorCisJc3RtcCA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOworCS8vCisJLy8gU2V0IFVTQiBoZWFkZXIgOCBieXRlCisJLy8KKwlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7CisJVGFyZ2V0QnVmZmVyICs9IDQ7CisJcFQwMSA9IChQVDAxX0RFU0NSSVBUT1IpVGFyZ2V0QnVmZmVyOworCVRhcmdldEJ1ZmZlciArPSA0OworCisJcFQwMC0+dmFsdWUgPSAwOy8vIENsZWFyCisJcFQwMS0+dmFsdWUgPSAwOy8vIENsZWFyCisKKwlwVDAwLT5UMDBfdHhfcGFja2V0X2lkID0gcERlcy0+RGVzY3JpcHRvcl9JRDsvLyBTZXQgcGFja2V0IElECisJcFQwMC0+VDAwX2hlYWRlcl9sZW5ndGggPSAyNDsvLyBTZXQgaGVhZGVyIGxlbmd0aAorCXBUMDEtPlQwMV9yZXRyeV9hYm9ydF9lYmFibGUgPSAxOy8vOTIxMDEzIDkzMTEzMC41LmgKKworCS8vIEtleSBJRCBzZXR1cAorCXBUMDEtPlQwMV93ZXBfaWQgPSAwOworCisJRnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsJLy9EbyBub3QgZnJhZ21lbnQKKwkvLyBDb3B5IGZ1bGwgZGF0YSwgdGhlIDEnc3QgYnVmZmVyIGNvbnRhaW4gYWxsIHRoZSBkYXRhIDkzMTEzMC41LmoKKwltZW1jcHkoIFRhcmdldEJ1ZmZlciwgc3JjX2J1ZmZlciwgRE9UXzExX01BQ19IRUFERVJfU0laRSApOy8vIENvcHkgaGVhZGVyCisJcERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBzcmNfYnVmZmVyICsgRE9UXzExX01BQ19IRUFERVJfU0laRTsKKwlwRGVzLT5idWZmZXJfdG90YWxfc2l6ZSAtPSBET1RfMTFfTUFDX0hFQURFUl9TSVpFOworCXBEZXMtPmJ1ZmZlcl9zaXplWzBdID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7CisKKwkvLyBTZXQgZnJhZ21lbnQgdGhyZXNob2xkCisJRnJhZ21lbnRUaHJlc2hvbGQgLT0gKERPVF8xMV9NQUNfSEVBREVSX1NJWkUgKyA0KTsKKwlwRGVzLT5GcmFnbWVudFRocmVzaG9sZCA9IEZyYWdtZW50VGhyZXNob2xkOworCisJLy8gU2V0IG1vcmUgZnJhZyBiaXQKKwlUYXJnZXRCdWZmZXJbMV0gfD0gMHgwNDsvLyBTZXQgbW9yZSBmcmFnIGJpdAorCisJLy8KKwkvLyBTZXQgdHggcmF0ZQorCS8vCisJc3RtcCA9ICoodTE2ICopKFRhcmdldEJ1ZmZlciszMCk7IC8vIDJuIGFsaWdubWVudCBhZGRyZXNzCisKKwkvL1VzZSBiYXNpYyByYXRlCisJY3RtcDEgPSBjdG1wZiA9IENVUlJFTlRfVFhfUkFURV9GT1JfTU5HOworCisJcERlcy0+VHhSYXRlID0gY3RtcDE7CisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJUeCByYXRlID0leFxuIiwgY3RtcDEpKTsKKwkjZW5kaWYKKworCXBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPSAoY3RtcDElMykgPyAwIDogMTsKKworCWZvciggaT0wOyBpPDI7IGkrKyApIHsKKwkJaWYoIGkgPT0gMSApCisJCQljdG1wMSA9IGN0bXBmOworCisJCXBNZHMtPlR4UmF0ZVtwRGVzLT5EZXNjcmlwdG9yX0lEXVtpXSA9IGN0bXAxOyAvLyBiYWNrdXAgdGhlIHRhIHJhdGUgYW5kIGZhbGwgYmFjayByYXRlCisKKwkJaWYoIGN0bXAxID09IDEwOCkgY3RtcDIgPSA3OworCQllbHNlIGlmKCBjdG1wMSA9PSA5NiApIGN0bXAyID0gNjsgLy8gUmF0ZSBjb252ZXJ0IGZvciBVU0IKKwkJZWxzZSBpZiggY3RtcDEgPT0gNzIgKSBjdG1wMiA9IDU7CisJCWVsc2UgaWYoIGN0bXAxID09IDQ4ICkgY3RtcDIgPSA0OworCQllbHNlIGlmKCBjdG1wMSA9PSAzNiApIGN0bXAyID0gMzsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMjQgKSBjdG1wMiA9IDI7CisJCWVsc2UgaWYoIGN0bXAxID09IDE4ICkgY3RtcDIgPSAxOworCQllbHNlIGlmKCBjdG1wMSA9PSAxMiApIGN0bXAyID0gMDsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMjIgKSBjdG1wMiA9IDM7CisJCWVsc2UgaWYoIGN0bXAxID09IDExICkgY3RtcDIgPSAyOworCQllbHNlIGlmKCBjdG1wMSA9PSA0ICApIGN0bXAyID0gMTsKKwkJZWxzZSBjdG1wMiA9IDA7IC8vIGlmKCBjdG1wMSA9PSAyICApIG9yIGRlZmF1bHQKKworCQlpZiggaSA9PSAwICkKKwkJCXBUMDEtPlQwMV90cmFuc21pdF9yYXRlID0gY3RtcDI7CisJCWVsc2UKKwkJCXBUMDEtPlQwMV9mYWxsX2JhY2tfcmF0ZSA9IGN0bXAyOworCX0KKworCS8vCisJLy8gU2V0IHByZWFtYmxlIHR5cGUKKwkvLworCWlmICgocFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9PSAwKSAmJiAocFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPT0gMCkpCS8vIFJBVEVfMU0KKwkJcERlcy0+UHJlYW1ibGVNb2RlID0gIFdMQU5fUFJFQU1CTEVfVFlQRV9MT05HOworCWVsc2UKKwkJcERlcy0+UHJlYW1ibGVNb2RlID0gIENVUlJFTlRfUFJFQU1CTEVfTU9ERTsKKwlwVDAxLT5UMDFfcGxjcF9oZWFkZXJfbGVuZ3RoID0gcERlcy0+UHJlYW1ibGVNb2RlOwkvLyBTZXQgcHJlYW1ibGUKKworfQorCit2b2lkCitNZHNfVHgoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQTURTCQlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwlERVNDUklQVE9SCVR4RGVzOworCVBERVNDUklQVE9SCXBUeERlcyA9ICZUeERlczsKKwl1OAkJKlhtaXRCdWZBZGRyZXNzOworCXUxNgkJWG1pdEJ1ZlNpemUsIFBhY2tldFNpemUsIHN0bXAsIEN1cnJlbnRTaXplLCBGcmFnbWVudFRocmVzaG9sZDsKKwl1OAkJRmlsbEluZGV4LCBUeERlc0luZGV4LCBGcmFnbWVudENvdW50LCBGaWxsQ291bnQ7CisJdW5zaWduZWQgY2hhcglCdWZmZXJGaWxsZWQgPSBmYWxzZSwgTUlDQWRkID0gMDsKKworCisJaWYgKHBNZHMtPlR4UGF1c2UpCisJCXJldHVybjsKKwlpZiAoIWhhbF9kcml2ZXJfaW5pdF9PSyhwSHdEYXRhKSkKKwkJcmV0dXJuOworCisJLy9Pbmx5IG9uZSB0aHJlYWQgY2FuIGJlIHJ1biBoZXJlCisJaWYgKCFhdG9taWNfaW5jX3JldHVybigmcE1kcy0+VHhUaHJlYWRDb3VudCkgPT0gMSkKKwkJZ290byBjbGVhbnVwOworCisJLy8gU3RhcnQgdG8gZmlsbCB0aGUgZGF0YQorCWRvIHsKKwkJRmlsbEluZGV4ID0gcE1kcy0+VHhGaWxsSW5kZXg7CisJCWlmIChwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0pIHsgLy8gSXMgb3duZWQgYnkgc29mdHdhcmUgMDpZZXMgMTpObworI2lmZGVmIF9QRV9UWF9EVU1QXworCQkJV0JERUJVRygoIltNZHNfVHhdIFR4IE93bmVyIGlzIEgvVy5cbiIpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlYbWl0QnVmQWRkcmVzcyA9IHBNZHMtPnBUeEJ1ZmZlciArIChNQVhfVVNCX1RYX0JVRkZFUiAqIEZpbGxJbmRleCk7IC8vR2V0IGJ1ZmZlcgorCQlYbWl0QnVmU2l6ZSA9IDA7CisJCUZpbGxDb3VudCA9IDA7CisJCWRvIHsKKwkJCVBhY2tldFNpemUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKKwkJCWlmICghUGFja2V0U2l6ZSkKKwkJCQlicmVhazsKKworCQkJLy9Gb3IgQ2hlY2sgdGhlIGJ1ZmZlciByZXNvdXJjZQorCQkJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKKwkJCS8vOTMxMTMwLjUuYgorCQkJRnJhZ21lbnRDb3VudCA9IFBhY2tldFNpemUvRnJhZ21lbnRUaHJlc2hvbGQgKyAxOworCQkJc3RtcCA9IFBhY2tldFNpemUgKyBGcmFnbWVudENvdW50KjMyICsgODsvLzkzMTEzMC41LmMgODpNSUMKKwkJCWlmICgoWG1pdEJ1ZlNpemUgKyBzdG1wKSA+PSBNQVhfVVNCX1RYX0JVRkZFUikgeworCQkJCXByaW50aygiW01kc19UeF0gRXhjZXNzIG1heCB0eCBidWZmZXIuXG4iKTsKKwkJCQlicmVhazsgLy8gYnVmZmVyIGlzIG5vdCBlbm91Z2gKKwkJCX0KKworCisJCQkvLworCQkJLy8gU3RhcnQgdHJhbnNtaXR0aW5nCisJCQkvLworCQkJQnVmZmVyRmlsbGVkID0gdHJ1ZTsKKworCQkJLyogTGVhdmVzIGZpcnN0IHU4IGludGFjdCAqLworCQkJbWVtc2V0KCh1OCAqKXBUeERlcyArIDEsIDAsIHNpemVvZihERVNDUklQVE9SKSAtIDEpOworCisJCQlUeERlc0luZGV4ID0gcE1kcy0+VHhEZXNJbmRleDsvL0dldCB0aGUgY3VycmVudCBJRAorCQkJcFR4RGVzLT5EZXNjcmlwdG9yX0lEID0gVHhEZXNJbmRleDsKKwkJCXBNZHMtPlR4RGVzRnJvbVsgVHhEZXNJbmRleCBdID0gMjsvL1N0b3JpbmcgdGhlIGluZm9ybWF0aW9uIG9mIHNvdXJjZSBjb21taW5nIGZyb20KKwkJCXBNZHMtPlR4RGVzSW5kZXgrKzsKKwkJCXBNZHMtPlR4RGVzSW5kZXggJT0gTUFYX1VTQl9UWF9ERVNDUklQVE9SOworCisJCQlNTE1FX0dldE5leHRQYWNrZXQoIGFkYXB0ZXIsIHBUeERlcyApOworCisJCQkvLyBDb3B5IGhlYWRlci4gOGJ5dGUgVVNCICsgMjRieXRlIDgwMi4xMUhkci4gU2V0IFR4UmF0ZSwgUHJlYW1ibGUgdHlwZQorCQkJTWRzX0hlYWRlckNvcHkoIGFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MgKTsKKworCQkJLy8gRm9yIHNwZWVkIHVwIEtleSBzZXR0aW5nCisJCQlpZiAocFR4RGVzLT5FYXBGaXgpIHsKKyNpZmRlZiBfUEVfVFhfRFVNUF8KKwkJCQlXQkRFQlVHKCgiMzU6IEVQQSA0dGggZnJhbWUgZGV0ZWN0ZWQuIFNpemUgPSAlZFxuIiwgUGFja2V0U2l6ZSkpOworI2VuZGlmCisJCQkJcEh3RGF0YS0+SXNLZXlQcmVTZXQgPSAxOworCQkJfQorCisJCQkvLyBDb3B5IChmcmFnbWVudCkgZnJhbWUgYm9keSwgYW5kIHNldCBVU0IsIDgwMi4xMSBoZHIgZmxhZworCQkJQ3VycmVudFNpemUgPSBNZHNfQm9keUNvcHkoYWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7CisKKwkJCS8vIFNldCBSVFMvQ1RTIGFuZCBOb3JtYWwgZHVyYXRpb24gZmllbGQgaW50byBidWZmZXIKKwkJCU1kc19EdXJhdGlvblNldChhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzKTsKKworCQkJLy8KKwkJCS8vIENhbGN1bGF0aW9uIE1JQyBmcm9tIGJ1ZmZlciB3aGljaCBtYXliZSBmcmFnbWVudCwgdGhlbiBmaWxsIGludG8gdGVtcG9yYXJ5IGFkZHJlc3MgOCBieXRlCisJCQkvLyA5MzExMzAuNS5lCisJCQlpZiAoTUlDQWRkKQorCQkJCU1kc19NaWNGaWxsKCBhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7CisKKwkJCS8vU2hpZnQgdG8gdGhlIG5leHQgYWRkcmVzcworCQkJWG1pdEJ1ZlNpemUgKz0gQ3VycmVudFNpemU7CisJCQlYbWl0QnVmQWRkcmVzcyArPSBDdXJyZW50U2l6ZTsKKworI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCisJCQlpZiAoKFhtaXRCdWZBZGRyZXNzWyBET1RfMTFfREFfT0ZGU0VUKzggXSAmIDB4ZmMpICE9IE1BQ19TVUJUWVBFX01OR01OVF9QUk9CRV9SRVFVRVNUKSAvLyArOCBmb3IgVVNCIGhkcgorI2VuZGlmCisJCQkJcE1kcy0+VHhUb2dnbGUgPSB0cnVlOworCisJCQkvLyBHZXQgcGFja2V0IHRvIHRyYW5zbWl0IGNvbXBsZXRlZCwgMTpURVNUU1RBIDI6TUxNRSAzOiBOZGlzIGRhdGEKKwkJCU1MTUVfU2VuZENvbXBsZXRlKGFkYXB0ZXIsIDAsIHRydWUpOworCisJCQkvLyBTb2Z0d2FyZSBUU0MgY291bnQgMjAwNjAyMTQKKwkJCXBNZHMtPlR4VHNjKys7CisJCQlpZiAocE1kcy0+VHhUc2MgPT0gMCkKKwkJCQlwTWRzLT5UeFRzY18yKys7CisKKwkJCUZpbGxDb3VudCsrOyAvLyAyMDA2MDkyOAorCQl9IHdoaWxlIChIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpOyAvLyBFbmQgb2YgbXVsdGlwbGUgTVNEVSBjb3B5IGxvb3AuIGZhbHNlID0gc2luZ2xlIHRydWUgPSBtdWx0aXBsZSBzZW5kaW5nCisKKwkJLy8gTW92ZSB0byB0aGUgbmV4dCBvbmUsIGlmIG5lY2Vzc2FyeQorCQlpZiAoQnVmZmVyRmlsbGVkKSB7CisJCQkvLyBzaXplIHNldHRpbmcKKwkJCXBNZHMtPlR4QnVmZmVyU2l6ZVsgRmlsbEluZGV4IF0gPSBYbWl0QnVmU2l6ZTsKKworCQkJLy8gMjAwNjA5Mjggc2V0IFR4IGNvdW50CisJCQlwTWRzLT5UeENvdW50SW5CdWZmZXJbRmlsbEluZGV4XSA9IEZpbGxDb3VudDsKKworCQkJLy8gU2V0IG93bmVyIGZsYWcKKwkJCXBNZHMtPlR4T3duZXJbRmlsbEluZGV4XSA9IDE7CisKKwkJCXBNZHMtPlR4RmlsbEluZGV4Kys7CisJCQlwTWRzLT5UeEZpbGxJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7CisJCQlCdWZmZXJGaWxsZWQgPSBmYWxzZTsKKwkJfSBlbHNlCisJCQlicmVhazsKKworCQlpZiAoIVBhY2tldFNpemUpIC8vIE5vIG1vcmUgcGsgZm9yIHRyYW5zbWl0dGluZworCQkJYnJlYWs7CisKKwl9IHdoaWxlKHRydWUpOworCisJLy8KKwkvLyBTdGFydCB0byBzZW5kIGJ5IGxvd2VyIG1vZHVsZQorCS8vCisJaWYgKCFwSHdEYXRhLT5Jc0tleVByZVNldCkKKwkJV2IzNVR4X3N0YXJ0KGFkYXB0ZXIpOworCisgY2xlYW51cDoKKwlhdG9taWNfZGVjKCZwTWRzLT5UeFRocmVhZENvdW50KTsKK30KKwordm9pZAorTWRzX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQVDAyX0RFU0NSSVBUT1IgcFQwMikKK3sKKwlQTURTCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCXU4CVBhY2tldElkID0gKHU4KXBUMDItPlQwMl9UeF9Qa3RJRDsKKwl1bnNpZ25lZCBjaGFyCVNlbmRPSyA9IHRydWU7CisJdTgJUmV0cnlDb3VudCwgVHhSYXRlOworCisJaWYgKHBUMDItPlQwMl9JZ25vcmVSZXN1bHQpIC8vIERvbid0IGNhcmUgdGhlIHJlc3VsdAorCQlyZXR1cm47CisJaWYgKHBUMDItPlQwMl9Jc0xhc3RNcGR1KSB7CisJCS8vVE9ETzogRFRPIC0tIGdldCB0aGUgcmV0cnkgY291bnQgYW5kIGZyYWdtZW50IGNvdW50CisJCS8vIFR4IHJhdGUKKwkJVHhSYXRlID0gcE1kcy0+VHhSYXRlWyBQYWNrZXRJZCBdWyAwIF07CisJCVJldHJ5Q291bnQgPSAodTgpcFQwMi0+VDAyX01QRFVfQ250OworCQlpZiAocFQwMi0+dmFsdWUgJiBGTEFHX0VSUk9SX1RYX01BU0spIHsKKwkJCVNlbmRPSyA9IGZhbHNlOworCisJCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X2Fib3J0IHx8IHBUMDItPlQwMl9vdXRfb2ZfTWF4VHhNU0RVTGlmdFRpbWUpIHsKKwkJCQkvL3JldHJ5IGVycm9yCisJCQkJcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ICs9IChSZXRyeUNvdW50KzEpOworCQkJCS8vW2ZvciB0eCBkZWJ1Z10KKwkJCQlpZiAoUmV0cnlDb3VudDw3KQorCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OworCQkJCWVsc2UKKwkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKKwkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCisJCQkJV0JERUJVRygoImR0b190eF9yZXRyeV9jb3VudCA9JWRcbiIsIHBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCkpOworCQkJCSNlbmRpZgorCQkJCU1UT19TZXRUeENvdW50KGFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7CisJCQl9CisJCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKKworCQkJLy9bZm9yIHR4IGRlYnVnXQorCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydF9kdWVfdG9fVEJUVCkKKwkJCQlwSHdEYXRhLT50eF9UQlRUX3N0YXJ0X2NvdW50Kys7CisJCQlpZiAocFQwMi0+VDAyX3RyYW5zbWl0X3dpdGhvdXRfZW5jcnlwdGlvbl9kdWVfdG9fd2VwX29uX2ZhbHNlKQorCQkJCXBId0RhdGEtPnR4X1dlcE9uX2ZhbHNlX2NvdW50Kys7CisJCQlpZiAocFQwMi0+VDAyX2Rpc2NhcmRfZHVlX3RvX251bGxfd2VwX2tleSkKKwkJCQlwSHdEYXRhLT50eF9OdWxsX2tleV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJaWYgKHBUMDItPlQwMl9lZmZlY3RpdmVfdHJhbnNtaXNzaW9uX3JhdGUpCisJCQkJcEh3RGF0YS0+dHhfRVRSX2NvdW50Kys7CisJCQlNVE9fU2V0VHhDb3VudChhZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOworCQl9CisKKwkJLy8gQ2xlYXIgc2VuZCByZXN1bHQgYnVmZmVyCisJCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdID0gMDsKKwl9IGVsc2UKKwkJcE1kcy0+VHhSZXN1bHRbIFBhY2tldElkIF0gfD0gKCh1MTYpKHBUMDItPnZhbHVlICYgMHgwZmZmZikpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKaW5kZXggN2E2ODJkNC4uZWUwZjEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCkBAIC0xLDMzICsxLDIzIEBACi11bnNpZ25lZCBjaGFyIE1kc19pbml0aWFsKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNZHNfRGVzdHJveSggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgTWRzX1R4KCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNZHNfSGVhZGVyQ29weSggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKlRhcmdldEJ1ZmZlciApOwotdTE2IE1kc19Cb2R5Q29weSggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKlRhcmdldEJ1ZmZlciApOwotdm9pZCBNZHNfRHVyYXRpb25TZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpUYXJnZXRCdWZmZXIgKTsKLXZvaWQgTWRzX1NlbmRDb21wbGV0ZSggIFBBREFQVEVSIEFkYXB0ZXIsICBQVDAyX0RFU0NSSVBUT1IgcFQwMiApOwotdm9pZCBNZHNfTXBkdVByb2Nlc3MoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcFJ4RGVzICk7Ci12b2lkIE1kc19yZXNldF9kZXNjcmlwdG9yKCAgUEFEQVBURVIgQWRhcHRlciApOworI2lmbmRlZiBfX1dJTkJPTkRfTURTX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfTURTX0ZfSAorCisjaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgImNvcmUuaCIKKwordW5zaWduZWQgY2hhciBNZHNfaW5pdGlhbCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNZHNfRGVzdHJveSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNZHNfVHgoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgKTsKK3ZvaWQgTWRzX1NlbmRDb21wbGV0ZSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBUMDJfREVTQ1JJUFRPUiBwVDAyICk7Cit2b2lkIE1kc19NcGR1UHJvY2VzcyggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBERVNDUklQVE9SIHBSeERlcyApOwogZXh0ZXJuIHZvaWQgRGF0YURtcCh1OCAqcGRhdGEsIHUzMiBsZW4sIHUzMiBvZmZzZXQpOwogCi0KLXZvaWQgdlJ4VGltZXJJbml0KFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZSeFRpbWVyU3RhcnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSk7Ci12b2lkIFJ4VGltZXJIYW5kbGVyXzFhKCBQQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdlJ4VGltZXJTdG9wKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci12b2lkIFJ4VGltZXJIYW5kbGVyKCB2b2lkKgkJCVN5c3RlbVNwZWNpZmljMSwKLQkJCQkJICAgUFdCMzJfQURBUFRFUiAJQWRhcHRlciwKLQkJCQkJICAgdm9pZCoJCQlTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJCSAgIHZvaWQqCQkJU3lzdGVtU3BlY2lmaWMzKTsKLQotCiAvLyBGb3IgQXN5bmNocm9ub3VzIGluZGljYXRpbmcuIFRoZSByb3V0aW5lIGNvbGxvY2F0ZXMgd2l0aCBVU0IuCi12b2lkIE1kc19Nc2R1UHJvY2VzcyggIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEsICB1OCBTbG90SW5kZXgpOwordm9pZCBNZHNfTXNkdVByb2Nlc3MoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxLCAgdTggU2xvdEluZGV4KTsKIAogLy8gRm9yIGRhdGEgZnJhbWUgc2VuZGluZyAyMDA2MDgwMgotdTE2IE1EU19HZXRQYWNrZXRTaXplKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBNRFNfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIE1EU19HZXROZXh0UGFja2V0Q29tcGxldGUoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdm9pZCBNRFNfU2VuZFJlc3VsdCggIFBBREFQVEVSIEFkYXB0ZXIsICB1OCBQYWNrZXRJZCwgIHVuc2lnbmVkIGNoYXIgU2VuZE9LICk7Ci12b2lkIE1EU19FdGhlcm5ldFBhY2tldFJlY2VpdmUoICBQQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSApOwordTE2IE1EU19HZXRQYWNrZXRTaXplKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyICk7Cit2b2lkIE1EU19HZXROZXh0UGFja2V0KCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwordm9pZCBNRFNfR2V0TmV4dFBhY2tldENvbXBsZXRlKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwordm9pZCBNRFNfU2VuZFJlc3VsdCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIHU4IFBhY2tldElkLCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCmluZGV4IDlkZjJlMDkuLmViZjYxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaApAQCAtMSw5ICsxLDE5IEBACisjaWZuZGVmIF9fV0lOQk9ORF9NRFNfSAorI2RlZmluZSBfX1dJTkJPTkRfTURTX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorI2luY2x1ZGUgInNjYW5fcy5oIgorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogI2RlZmluZSBNQVhfVVNCX1RYX0RFU0NSSVBUT1IJCTE1CQkvLyBJUzg5QzM1IGFiaWxpdHkKICNkZWZpbmUgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSCTQJCS8vIFZpcnR1YWwgcHJlLWJ1ZmZlciBudW1iZXIgb2YgTUFYX1VTQl9UWF9CVUZGRVIKICNkZWZpbmUgTUFYX1VTQl9UWF9CVUZGRVIJCQk0MDk2CS8vIElTODlDMzUgYWJpbGl0eSA0biBhbGlnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIGhhcmR3YXJlCiAKLSNkZWZpbmUgTURTX0VWRU5UX0lORElDQVRFKCBfQSwgX0IsIF9GICkJT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQogI2RlZmluZSBBVVRIX1JFUVVFU1RfUEFJUldJU0VfRVJST1IJCQkwCQkvLyBfRiBmbGFnIHNldHRpbmcKICNkZWZpbmUgQVVUSF9SRVFVRVNUX0dST1VQX0VSUk9SCQkJMQkJLy8gX0YgZmxhZyBzZXR0aW5nCiAKQEAgLTIxLDIwICszMSwxOSBAQAogI2RlZmluZSBDVVJSRU5UX1BBSVJXSVNFX0tFWQkJCXBzU01FLT50eF9taWNfa2V5CiAjZGVmaW5lIENVUlJFTlRfR1JPVVBfS0VZCQkJCXBzU01FLT5ncm91cF90eF9taWNfa2V5CiAjZGVmaW5lIENVUlJFTlRfRU5DUllQVF9TVEFUVVMJCQlwc1NNRS0+ZW5jcnlwdF9zdGF0dXMKLSNkZWZpbmUgQ1VSUkVOVF9XRVBfSUQJCQkJCUFkYXB0ZXItPnNTbWVQYXJhLl9kb3QxMVdFUERlZmF1bHRLZXlJRAotI2RlZmluZSBDVVJSRU5UX0NPTlRST0xfUE9SVF9CTE9DSwkJKCBwc1NNRS0+d3BhX29rIT0xIHx8IChBZGFwdGVyLT5NZHMuYm9Db3VudGVyTWVhc3VyZUJsb2NrPT0xICYmIChDVVJSRU5UX0VOQ1JZUFRfU1RBVFVTPT1FTkNSWVBUX1RLSVApKSApCi0jZGVmaW5lIENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xECQkoQWRhcHRlci0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgJiB+MHgxKQorI2RlZmluZSBDVVJSRU5UX1dFUF9JRAkJCQkJYWRhcHRlci0+c1NtZVBhcmEuX2RvdDExV0VQRGVmYXVsdEtleUlECisjZGVmaW5lIENVUlJFTlRfQ09OVFJPTF9QT1JUX0JMT0NLCQkoIHBzU01FLT53cGFfb2shPTEgfHwgKGFkYXB0ZXItPk1kcy5ib0NvdW50ZXJNZWFzdXJlQmxvY2s9PTEgJiYgKENVUlJFTlRfRU5DUllQVF9TVEFUVVM9PUVOQ1JZUFRfVEtJUCkpICkKKyNkZWZpbmUgQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQJCShhZGFwdGVyLT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCAmIH4weDEpCiAjZGVmaW5lIENVUlJFTlRfUFJFQU1CTEVfTU9ERQkJCXBzTE9DQUwtPmJvU2hvcnRQcmVhbWJsZT9XTEFOX1BSRUFNQkxFX1RZUEVfU0hPUlQ6V0xBTl9QUkVBTUJMRV9UWVBFX0xPTkcKLSNkZWZpbmUgQ1VSUkVOVF9MSU5LX09OCQkJCQlPU19MSU5LX1NUQVRVUwotI2RlZmluZSBDVVJSRU5UX1RYX1JBVEUJCQkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZQotI2RlZmluZSBDVVJSRU5UX0ZBTExfQkFDS19UWF9SQVRFCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeEZhbGxiYWNrUmF0ZQotI2RlZmluZSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORwkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZUZvck1uZworI2RlZmluZSBDVVJSRU5UX1RYX1JBVEUJCQkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZQorI2RlZmluZSBDVVJSRU5UX0ZBTExfQkFDS19UWF9SQVRFCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeEZhbGxiYWNrUmF0ZQorI2RlZmluZSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORwkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuQ3VycmVudFR4UmF0ZUZvck1uZwogI2RlZmluZSBDVVJSRU5UX1BST1RFQ1RfTUVDSEFOSVNNCQlwc0xPQ0FMLT5ib1Byb3RlY3RNZWNoYW5pc20KLSNkZWZpbmUgQ1VSUkVOVF9SVFNfVEhSRVNIT0xECQkJQWRhcHRlci0+TWRzLlR4UlRTVGhyZXNob2xkCisjZGVmaW5lIENVUlJFTlRfUlRTX1RIUkVTSE9MRAkJCWFkYXB0ZXItPk1kcy5UeFJUU1RocmVzaG9sZAogCi0jZGVmaW5lIE1JQl9HU19YTUlUX09LX0lOQwkJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfT0srKwotI2RlZmluZSBNSUJfR1NfUkNWX09LX0lOQwkJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1JDVl9PSysrCi0jZGVmaW5lIE1JQl9HU19YTUlUX0VSUk9SX0lOQwkJCUFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfWE1JVF9FUlJPUgorI2RlZmluZSBNSUJfR1NfWE1JVF9PS19JTkMJCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5HU19YTUlUX09LKysKKyNkZWZpbmUgTUlCX0dTX1JDVl9PS19JTkMJCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5HU19SQ1ZfT0srKworI2RlZmluZSBNSUJfR1NfWE1JVF9FUlJPUl9JTkMJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfRVJST1IKIAogLy8tLS0tLS0tLS0tIFRYIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjZGVmaW5lIEVUSEVSTkVUX1RYX0RFU0NSSVBUT1JTICAgICAgICAgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSCkBAIC05Niw5ICsxMDUsOSBAQAogCXU4CVNjYW5UeFBhdXNlOwkvL2RhdGEgVHggcGF1c2UgYmVjYXVzZSB0aGUgc2Nhbm5pbmcgaXMgcHJvZ3Jlc3NpbmcsIGJ1dCBwcm9iZSByZXF1ZXN0IFR4IHdvbid0LgogCXU4CVR4UGF1c2U7Ly9Gb3IgcGF1c2UgdGhlIE1kc19UeCBtb2R1bHQKIAotCU9TX0FUT01JQwlUeFRocmVhZENvdW50Oy8vRm9yIHRocmVhZCBjb3VudGluZyA5MzExMzAuNC52CisJYXRvbWljX3QJVHhUaHJlYWRDb3VudDsvL0ZvciB0aHJlYWQgY291bnRpbmcgOTMxMTMwLjQudgogLy85NTAzMDEgZGVsZXRlIGR1ZSB0byBIVwotLy8JT1NfQVRPTUlDCVR4Q29uY3VycmVudENvdW50Oy8vOTMxMTMwLjQudworLy8JYXRvbWljX3QJVHhDb25jdXJyZW50Q291bnQ7Ly85MzExMzAuNC53CiAKIAl1MTYJVHhSZXN1bHRbICgoTUFYX1VTQl9UWF9ERVNDUklQVE9SICsgMSkgJiB+MHgwMSkgXTsvL0NvbGxlY3QgdGhlIHNlbmRpbmcgcmVzdWx0IG9mIE1wZHUKIApAQCAtMTMzLDkgKzE0Miw2IEBACiAJdTgJCWJvQ291bnRlck1lYXN1cmVCbG9jazsKIAl1OAkJcmVzZXJ2ZWRfNFsyXTsKIAotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJblRpbWVyOwotCiAJdTMyCVR4VHNjOyAvLyAyMDA2MDIxNAogCXUzMglUeFRzY18yOyAvLyAyMDA2MDIxNAogCkBAIC0xODAsNCArMTg2LDQgQEAKIAogfVJYTEFZRVIxLCAqIFBSWExBWUVSMTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oCmluZGV4IDg5NzU5NzMuLmNhODkyMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9taWIuaApAQCAtMjIsMTUgKzIyLDE1IEBACiAvLyAgIFNldCB0aGUgZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgdmFsdWUuCiAvLwogLy8gQXJndW1lbnRzOgotLy8gICBBZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCisvLyAgIGFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KIC8vICAgRXhVbmVuY3J5cHRlZCAgLSB1bnNpZ25lZCBjaGFyIHR5cGUuIFRoZSB2YWx1ZSB0byBiZSBzZXQuCiAvLwogLy8gUmV0dXJuIHZhbHVlczoKIC8vICAgTm9uZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FU2V0RXhjbHVkZVVuZW5jcnlwdGVkKEFkYXB0ZXIsIEV4VW5lbmNyeXB0ZWQpICAgICBcCisjZGVmaW5lIE1MTUVTZXRFeGNsdWRlVW5lbmNyeXB0ZWQoYWRhcHRlciwgRXhVbmVuY3J5cHRlZCkgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoQWRhcHRlciktPnNMb2NhbFBhcmEuRXhjbHVkZVVuZW5jcnlwdGVkID0gRXhVbmVuY3J5cHRlZDsgICAgICAgICAgICAgXAorICAgIChhZGFwdGVyKS0+c0xvY2FsUGFyYS5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBFeFVuZW5jcnlwdGVkOyAgICAgICAgICAgICBcCiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDAsMTIgKzQwLDEyIEBACiAvLyAgIEdldCB0aGUgZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgdmFsdWUuCiAvLwogLy8gQXJndW1lbnRzOgotLy8gICBBZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCisvLyAgIGFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KIC8vCiAvLyBSZXR1cm4gdmFsdWVzOgogLy8gICB1bnNpZ25lZCBjaGFyIHR5cGUuIFRoZSBjdXJyZW50IGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1MTUVHZXRFeGNsdWRlVW5lbmNyeXB0ZWQoQWRhcHRlcikgKCh1bnNpZ25lZCBjaGFyKSAoQWRhcHRlciktPnNMb2NhbFBhcmEuRXhjbHVkZVVuZW5jcnlwdGVkKQorI2RlZmluZSBNTE1FR2V0RXhjbHVkZVVuZW5jcnlwdGVkKGFkYXB0ZXIpICgodW5zaWduZWQgY2hhcikgKGFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCkKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBNTE1FU2V0TWF4UmVjZWl2ZUxpZmVUaW1lIC0tCkBAIC01NCwxNSArNTQsMTUgQEAKIC8vICAgU2V0IHRoZSBkb3QxMU1heFJlY2VpdmVMaWZlVGltZSB2YWx1ZS4KIC8vCiAvLyBBcmd1bWVudHM6Ci0vLyAgIEFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KKy8vICAgYWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgogLy8gICBSZWNlaXZlTGlmZVRpbWUtIHUzMiB0eXBlLiBUaGUgdmFsdWUgdG8gYmUgc2V0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIE5vbmUuCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUxNRVNldE1heFJlY2VpdmVMaWZlVGltZShBZGFwdGVyLCBSZWNlaXZlTGlmZVRpbWUpICAgIFwKKyNkZWZpbmUgTUxNRVNldE1heFJlY2VpdmVMaWZlVGltZShhZGFwdGVyLCBSZWNlaXZlTGlmZVRpbWUpICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKEFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUgPSBSZWNlaXZlTGlmZVRpbWU7ICAgICAgICAgICAgICAgIFwKKyAgICAoYWRhcHRlciktPk1kcy5NYXhSZWNlaXZlVGltZSA9IFJlY2VpdmVMaWZlVGltZTsgICAgICAgICAgICAgICAgXAogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTcyLDEyICs3MiwxMiBAQAogLy8gICBHZXQgdGhlIGRvdDExTWF4UmVjZWl2ZUxpZmVUaW1lIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLwogLy8gUmV0dXJuIHZhbHVlczoKIC8vICAgdTMyIHR5cGUuIFRoZSBjdXJyZW50IGRvdDExTWF4UmVjZWl2ZUxpZmVUaW1lIHZhbHVlLgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1MTUVHZXRNYXhSZWNlaXZlTGlmZVRpbWUoQWRhcHRlcikgKCh1MzIpIChBZGFwdGVyKS0+TWRzLk1heFJlY2VpdmVUaW1lKQorI2RlZmluZSBNTE1FR2V0TWF4UmVjZWl2ZUxpZmVUaW1lKGFkYXB0ZXIpICgodTMyKSAoYWRhcHRlciktPk1kcy5NYXhSZWNlaXZlVGltZSkKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9zLmgKaW5kZXggMDM5ZmQ0MC4uZWExMjY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9zLmgKQEAgLTEsMyArMSwxMiBAQAorI2lmbmRlZiBfX1dJTkJPTkRfTUxNRV9ICisjZGVmaW5lIF9fV0lOQk9ORF9NTE1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCisjaW5jbHVkZSAibWRzX3MuaCIKKwogLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogLy8JTWxtZS5oCiAvLwkJRGVmaW5lIHRoZSByZWxhdGVkIGRlZmluaXRpb25zIG9mIE1MTUUgbW9kdWxlCkBAIC0xOTIsNCArMjAxLDQgQEAKIAogfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBSWERBVEEsICpwc1JYREFUQTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jCmluZGV4IGU4NTMzYjhkMS4uMDc4MDJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jCkBAIC0xNywxMTMgKzE3LDU2IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICNpbmNsdWRlICJvc19jb21tb24uaCIKIAotdm9pZCBNTE1FUmVzZXRUeFJ4KFBXQjMyX0FEQVBURVIgQWRhcHRlcikKLXsKLQlzMzIgICAgIGk7Ci0KLQkvLyBSZXNldCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gTURTIGFuZCBNTE1FCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykKLQkJQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBGQUxTRTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9SWF9NTVBEVTsgaSsrKQotCQlBZGFwdGVyLT5zTWxtZUZyYW1lLlNhdmVSeEJ1ZlNsb3RJblVzZVtpXSA9IEZBTFNFOwotCi0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtUnhNTVBEVUluTUxNRSAgID0gMDsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1SeE1NUERVRGlzY2FyZGVkID0gMDsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1SeE1NUERVICAgICAgICAgID0gMDsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVRGlzY2FyZGVkID0gMDsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVICAgICAgICAgID0gMDsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQ0NBYnVzeSAgICA9IEZBTFNFOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuaVBvd2VyU2F2ZU1vZGUgICAgID0gUFdSX0FDVElWRTsgICAgIC8vIFBvd2VyIGFjdGl2ZQotfQorI2luY2x1ZGUgIm1kc19mLmgiCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vCUZ1bmN0aW9uOgotLy8gICAgTUxNRUdldE1NUERVQnVmZmVyKCkKLS8vCi0vLwlEZXNjcmlwdGlvbjoKLS8vICAgIFJldHVybiB0aGUgcG9pbnRlciB0byBhbiBhdmFpbGFibGUgZGF0YSBidWZmZXIgd2l0aAotLy8gICAgdGhlIHNpemUgTUFYX01NUERVX1NJWkUgZm9yIGEgTU1QRFUuCi0vLwotLy8gIEFyZ3VtZW50czoKLS8vICAgIEFkYXB0ZXIgICAtIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KLS8vCi0vLwlSZXR1cm4gdmFsdWU6Ci0vLyAgICBOVUxMICAgICA6IE5vIGF2YWlsYWJsZSBkYXRhIGJ1ZmZlciBhdmFpbGFibGUKLS8vICAgIE90aGVyd2lzZTogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyogRklYTUU6IFNob3VsZCB0aGlzIGp1c3QgYmUgcmVwbGFjZWQgd2l0aCBrbWFsbG9jKCkgYW5kIGtmcmVlKCk/ICovCi11OCAqTUxNRUdldE1NUERVQnVmZmVyKFBXQjMyX0FEQVBURVIgQWRhcHRlcikKLXsKLQlzMzIgaTsKLQl1OCAqcmV0dXJuVmFsOwotCi0JZm9yIChpID0gMDsgaTwgTUFYX05VTV9UWF9NTVBEVTsgaSsrKSB7Ci0JCWlmIChBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9PSBGQUxTRSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA+PSBNQVhfTlVNX1RYX01NUERVKSByZXR1cm4gTlVMTDsKLQotCXJldHVyblZhbCA9ICh1OCAqKSYoQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVW2ldKTsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IFRSVUU7Ci0KLQlyZXR1cm4gcmV0dXJuVmFsOwotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11OCBNTE1FU2VuZEZyYW1lKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKnBNTVBEVSwgdTE2IGxlbiwgdTggRGF0YVR5cGUpCit1OCBNTE1FU2VuZEZyYW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwTU1QRFUsIHUxNiBsZW4sIHU4IERhdGFUeXBlKQogLyoJRGF0YVR5cGUgOiBGUkFNRV9UWVBFXzgwMl8xMV9NQU5BR0VNRU5ULCBGUkFNRV9UWVBFXzgwMl8xMV9NQU5BR0VNRU5UX0NIQUxMRU5HRSwKIAkJCQlGUkFNRV9UWVBFXzgwMl8xMV9EQVRBICovCiB7Ci0JaWYgKEFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgIT0gUEFDS0VUX0ZSRUVfVE9fVVNFKSB7Ci0JCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFVEaXNjYXJkZWQrKzsKLQkJcmV0dXJuIEZBTFNFOworCWlmIChhZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkICE9IFBBQ0tFVF9GUkVFX1RPX1VTRSkgeworCQlhZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVRGlzY2FyZGVkKys7CisJCXJldHVybiBmYWxzZTsKIAl9Ci0JQWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9DT01FX0ZST01fTUxNRTsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkID0gUEFDS0VUX0NPTUVfRlJPTV9NTE1FOwogCiAJLy8gS2VlcCBpbmZvcm1hdGlvbiBmb3Igc2VuZGluZwotCUFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVID0gcE1NUERVOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUuRGF0YVR5cGUgPSBEYXRhVHlwZTsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSA9IHBNTVBEVTsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlID0gRGF0YVR5cGU7CiAJLy8gbGVuIG11c3QgYmUgdGhlIGxhc3Qgc2V0dGluZyBkdWUgdG8gUVVFUllfU0laRV9TRUNPTkQgb2YgTWRzCi0JQWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSBsZW47Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVSsrOworCWFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gbGVuOworCWFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFUrKzsKIAogCS8vIEgvVyB3aWxsIGVudGVyIHBvd2VyIHNhdmUgYnkgc2V0IHRoZSByZWdpc3Rlci4gUy9XIGRvbid0IHNlbmQgbnVsbCBmcmFtZQogCS8vd2l0aCBQV1JNZ3QgYml0IGVuYmxlZCB0byBlbnRlciBwb3dlciBzYXZlIG5vdy4KIAogCS8vIFRyYW5zbWl0IE5ESVMgcGFja2V0Ci0JTWRzX1R4KEFkYXB0ZXIpOwotCXJldHVybiBUUlVFOworCU1kc19UeChhZGFwdGVyKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZAotTUxNRV9HZXROZXh0UGFja2V0KFBBREFQVEVSIEFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMpCit2b2lkIE1MTUVfR2V0TmV4dFBhY2tldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIFBERVNDUklQVE9SIGRlc2MpCiB7Ci0jZGVmaW5lIERFU0NSSVBUT1JfQUREX0JVRkZFUiggX0QsIF9BLCBfUyApIFwKLXtcCi0JX0QtPkludGVybmFsVXNlZCA9IF9ELT5idWZmZXJfc3RhcnRfaW5kZXggKyBfRC0+YnVmZmVyX251bWJlcjsgXAotCV9ELT5JbnRlcm5hbFVzZWQgJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOyBcCi0JX0QtPmJ1ZmZlcl9hZGRyZXNzWyBfRC0+SW50ZXJuYWxVc2VkIF0gPSBfQTsgXAotCV9ELT5idWZmZXJfc2l6ZVsgX0QtPkludGVybmFsVXNlZCBdID0gX1M7IFwKLQlfRC0+YnVmZmVyX3RvdGFsX3NpemUgKz0gX1M7IFwKLQlfRC0+YnVmZmVyX251bWJlcisrO1wKKwlkZXNjLT5JbnRlcm5hbFVzZWQgPSBkZXNjLT5idWZmZXJfc3RhcnRfaW5kZXggKyBkZXNjLT5idWZmZXJfbnVtYmVyOworCWRlc2MtPkludGVybmFsVXNlZCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7CisJZGVzYy0+YnVmZmVyX2FkZHJlc3NbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVOworCWRlc2MtPmJ1ZmZlcl9zaXplW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKKwlkZXNjLT5idWZmZXJfdG90YWxfc2l6ZSArPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKKwlkZXNjLT5idWZmZXJfbnVtYmVyKys7CisJZGVzYy0+VHlwZSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUuRGF0YVR5cGU7CiB9CiAKLQlERVNDUklQVE9SX0FERF9CVUZGRVIoIHBEZXMsIEFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVLCBBZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiApOwotCXBEZXMtPlR5cGUgPSBBZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlOwotfQotCi12b2lkIE1MTUVmcmVlTU1QRFVCdWZmZXIoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzOCAqcERhdGEpCitzdGF0aWMgdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgczggKnBEYXRhKQogewogCWludCBpOwogCiAJLy8gUmVjbGFpbSB0aGUgZGF0YSBidWZmZXIKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UWF9NTVBEVTsgaSsrKSB7Ci0JCWlmIChwRGF0YSA9PSAoczggKikmKEFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSkpCisJCWlmIChwRGF0YSA9PSAoczggKikmKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSkpCiAJCQlicmVhazsKIAl9Ci0JaWYgKEFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldKQotCQlBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IEZBTFNFOworCWlmIChhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKKwkJYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBmYWxzZTsKIAllbHNlICB7CiAJCS8vIFNvbWV0aGluZyB3cm9uZwogCQkvLyBQRDQzIEFkZCBkZWJ1ZyBjb2RlIGhlcmU/Pz8KQEAgLTEzMSwxOSArNzQsMTkgQEAKIH0KIAogdm9pZAotTUxNRV9TZW5kQ29tcGxldGUoUEFEQVBURVIgQWRhcHRlciwgdTggUGFja2V0SUQsIHVuc2lnbmVkIGNoYXIgU2VuZE9LKQorTUxNRV9TZW5kQ29tcGxldGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggUGFja2V0SUQsIHVuc2lnbmVkIGNoYXIgU2VuZE9LKQogewogCU1MTUVfVFhDQUxMQkFDSwlUeENhbGxiYWNrOwogCiAgICAgLy8gUmVjbGFpbSB0aGUgZGF0YSBidWZmZXIKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IDA7Ci0JTUxNRWZyZWVNTVBEVUJ1ZmZlciggQWRhcHRlciwgQWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUgKTsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IDA7CisJTUxNRWZyZWVNTVBEVUJ1ZmZlciggYWRhcHRlciwgYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUgKTsKIAogCiAJVHhDYWxsYmFjay5iUmVzdWx0ID0gTUxNRV9TVUNDRVNTOwogCiAJLy8gUmV0dXJuIHJlc291cmNlCi0JQWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9GUkVFX1RPX1VTRTsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkID0gUEFDS0VUX0ZSRUVfVE9fVVNFOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaAppbmRleCAyNGNkNWYzLi41ZjA1YTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCkBAIC04LDMyICs4LDI1IEBACiAjaWZuZGVmIF9NTE1FVFhSWF9ICiAjZGVmaW5lIF9NTE1FVFhSWF9ICiAKKyNpbmNsdWRlICJjb3JlLmgiCisKIHZvaWQKIE1MTUVQcm9jVGhyZWFkKAotICAgICBQV0IzMl9BREFQVEVSICAgIEFkYXB0ZXIKKyAgICAgc3RydWN0IHdic29mdF9wcml2ICogICAgYWRhcHRlcgogCSk7CiAKLXZvaWQgTUxNRVJlc2V0VHhSeCggUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLQotdTggKgotTUxNRUdldE1NUERVQnVmZmVyKAotICAgICBQV0IzMl9BREFQVEVSICAgIEFkYXB0ZXIKLSAgICk7Ci0KLXZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlciggUFdCMzJfQURBUFRFUiBBZGFwdGVyLCAgczggKiBwRGF0YSk7Ci0KLXZvaWQgTUxNRV9HZXROZXh0UGFja2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKLXU4IE1MTUVTZW5kRnJhbWUoIFBXQjMyX0FEQVBURVIgQWRhcHRlciwKK3ZvaWQgTUxNRV9HZXROZXh0UGFja2V0KCAgc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKK3U4IE1MTUVTZW5kRnJhbWUoIHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsCiAJCQkJCXU4CSpwTU1QRFUsCiAJCQkJCXUxNglsZW4sCiAJCQkJCSB1OAlEYXRhVHlwZSk7CiAKIHZvaWQKLU1MTUVfU2VuZENvbXBsZXRlKCAgUFdCMzJfQURBUFRFUiBBZGFwdGVyLCAgdTggUGFja2V0SUQsICB1bnNpZ25lZCBjaGFyIFNlbmRPSyApOworTUxNRV9TZW5kQ29tcGxldGUoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCAgdTggUGFja2V0SUQsICB1bnNpZ25lZCBjaGFyIFNlbmRPSyApOwogCiB2b2lkCiBNTE1FUmN2RnJhbWUoCi0gICAgIFBXQjMyX0FEQVBURVIgICAgQWRhcHRlciwKKyAgICAgc3RydWN0IHdic29mdF9wcml2ICogICAgYWRhcHRlciwKICAgICAgUFJYQlVGRkVSICAgICAgICBwUnhCdWZmZXJBcnJheSwKICAgICAgdTggICAgICAgICAgICBOdW1PZkJ1ZmZlciwKICAgICAgdTggICAgICAgICAgICBSZXR1cm5TbG90SW5kZXgKQEAgLTQxLDExICszNCwxMSBAQAogCiB2b2lkCiBNTE1FUmV0dXJuUGFja2V0KAotICAgICBQV0IzMl9BREFQVEVSICAgIEFkYXB0ZXIsCisgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqICAgIGFkYXB0ZXIsCiAgICAgIHU4ICogICAgICAgICAgcFJ4QnVmZXIKICAgICk7CiAjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLXM4IFNlbmRCQ051bGxEYXRhKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IHdJZHgpOworczggU2VuZEJDTnVsbERhdGEoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IHdJZHgpOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uYwppbmRleCAyZWY2MGU1Li5kZTExYTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uYwpAQCAtMjMsMTAgKzIzLDEyIEBACiAKIC8vIExBMjAwNDAyMTBfRFRPIGtldmluCiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCisjaW5jbHVkZSAic21lX2FwaS5oIgorI2luY2x1ZGUgImdsXzgwMjExLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgogCiAvLyBEZWNsYXJlIFNRMyB0byByYXRlIGFuZCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCB0YWJsZQogLy8gRGVjbGFyZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZHMgdGFibGUKLSNkZWZpbmUgTVRPX01BWF9TUTNfTEVWRUxTICAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIE1UT19NQVhfRlJBR19USF9MRVZFTFMgICAgICAgICAgICAgICAgICA1CiAjZGVmaW5lIE1UT19NQVhfREFUQV9SQVRFX0xFVkVMUyAgICAgICAgICAgICAgICAxMgogCkBAIC0zNSwxODEgKzM3LDE1IEBACiAgICAgMjU2LCAzODQsIDUxMiwgNzY4LCAxNTM2CiB9OwogCi11OCAgTVRPX1NRM19MZXZlbFtNVE9fTUFYX1NRM19MRVZFTFNdID0KLXsKLSAgICAwLCAyNiwgMzAsIDMyLCAzNCwgMzUsIDM3LCA0MiwgNDQsIDQ2LCA1NCwgNjIsIDc4LCA4MQotfTsKLXU4ICBNVE9fU1EzdG9SYXRlW01UT19NQVhfU1EzX0xFVkVMU10gPQotewotICAgIDAsIDEsIDEsIDIsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQotfTsKLXU4ICBNVE9fU1EzdG9GcmFnW01UT19NQVhfU1EzX0xFVkVMU10gPQotewotICAgIDAsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQKLX07Ci0KLS8vIE9uZSBFeGNoYW5nZSBUaW1lIHRhYmxlCi0vLwotdTE2IE1UT19PbmVfRXhjaGFuZ2VfVGltZV9UYmxfbFtNVE9fTUFYX0ZSQUdfVEhfTEVWRUxTXVtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLSAgICB7IDI1NTQsIDE0NzQsICA4MjIsICAgIDAsICAgIDAsICA2MzYsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9LAotICAgIHsgMzU3OCwgMTk4NiwgMTAwOSwgICAgMCwgICAgMCwgIDcyOSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0sCi0gICAgeyA0NjAyLCAyNDk4LCAxMTk1LCAgICAwLCAgICAwLCAgODIyLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7IDY2NTAsIDM1MjIsIDE1NjcsICAgIDAsICAgIDAsIDEwMDksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9LAotICAgIHsxMjc5NCwgNjU5NCwgMjY4NCwgICAgMCwgICAgMCwgMTU2NywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0KLX07Ci0KLXUxNiBNVE9fT25lX0V4Y2hhbmdlX1RpbWVfVGJsX3NbTVRPX01BWF9GUkFHX1RIX0xFVkVMU11bTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17Ci0gICAgeyAgICAwLCAxMjgyLCAgNjMwLCAgNDA0LCAgMjg4LCAgNDQ0LCAgMjMyLCAgMTcyLCAgMTQ0LCAgMTE2LCAgMTAwLCAgIDk2fSwKLSAgICB7ICAgIDAsIDE3OTQsICA4MTcsICA1NzIsICA0MDAsICA1MzcsICAzMTYsICAyMjgsICAxODgsICAxNDQsICAxMjQsICAxMTZ9LAotICAgIHsgICAgMCwgMjMwNiwgMTAwMywgIDc0NCwgIDUxNiwgIDYzMCwgIDQwMCwgIDI4OCwgIDIyOCwgIDE3MiwgIDE0NCwgIDEzNn0sCi0gICAgeyAgICAwLCAzMzMwLCAxMzc1LCAxMDg0LCAgNzQ0LCAgODE3LCAgNTcyLCAgNDAwLCAgMzE2LCAgMjI4LCAgMTg4LCAgMTcyfSwKLSAgICB7ICAgIDAsIDY0MDIsIDI0OTIsIDIxMDgsIDE0MjQsIDEzNzUsIDEwODQsICA3NDAsICA1NzIsICA0MDAsICAzMTYsICAyODR9Ci19OwotCi0jZGVmaW5lIE1UT19PTkVfRVhDSEFOR0VfVElNRShwcmVhbWJsZV90eXBlLCBmcmFnX3RoX2x2bCwgZGF0YV9yYXRlX2x2bCkgXAotICAgICAgICAgICAgKHByZWFtYmxlX3R5cGUpID8gICBNVE9fT25lX0V4Y2hhbmdlX1RpbWVfVGJsX3NbZnJhZ190aF9sdmxdW2RhdGFfcmF0ZV9sdmxdIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9fT25lX0V4Y2hhbmdlX1RpbWVfVGJsX2xbZnJhZ190aF9sdmxdW2RhdGFfcmF0ZV9sdmxdCi0KIC8vIERlY2xhcmUgZGF0YSByYXRlIHRhYmxlCiAvL1RoZSBmb2xsb3dpbmcgdGFibGUgd2lsbCBiZSBjaGFuZ2VkIGF0IGFueXRpbWUgaWYgdGhlIG9wcmF0aW9uIHJhdGUgc3VwcG9ydGVkIGJ5IEFQIGRvbid0CiAvL21hdGNoIHRoZSB0YWJsZQotdTggIE1UT19EYXRhX1JhdGVfVGJsW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQoteworc3RhdGljIHU4IE1UT19EYXRhX1JhdGVfVGJsW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPSB7CiAgICAgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4CiB9OwogCi0vL1RoZSBTdGFyZGFyZF9EYXRhX1JhdGVfVGJsIGFuZCBMZXZlbDJQZXJUYmwgdGFibGUgaXMgdXNlZCB0byBpbmRpcmVjdGx5IHJldHJlaXZlIFBFUgotLy9pbmZvcm1hdGlvbiBmcm9tIFJhdGVfUEVSX1RCTAotLy9UaGUgZGVmYXVsdCBzZXR0aW5ncyBpcyBBUCBjYW4gc3VwcG9ydCBmdWxsIHJhdGUgc2V0Lgotc3RhdGljIHU4ICBTdGFyZGFyZF9EYXRhX1JhdGVfVGJsW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQotewotCTIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOAotfTsKLXN0YXRpYyB1OCAgTGV2ZWwyUGVyVGJsW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQotewotCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQotfTsKLS8vSG93IG1hbnkga2luZCBvZiB0eCByYXRlIGNhbiBiZSBzdXBwb3J0ZWQgYnkgQVAKLS8vRFRPIHdpbGwgY2hhbmdlIFJhdGUgYmV0d2VlbiBNVE9fRGF0YV9SYXRlX1RibFswXSBhbmQgTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwtMV0KLXN0YXRpYyB1OCAgTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgPSBNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFM7Ci0vL1Ntb290aGVkIFBFUiB0YWJsZSBmb3IgZWFjaCBkaWZmZXJlbnQgUkFURSBiYXNlZCBvbiBwYWNrZXQgbGVuZ3RoIG9mIDE1MTQKLXN0YXRpYyBpbnQgUmF0ZV9QRVJfVEJMWzkxXVtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0gewotLy8gICAgICAgIDFNICAgIDJNICAgIDUuNU0gIDExTSAgIDZNICAgIDlNICAgIDEyTSAgICAgMThNICAgIDI0TSAgICAzNk0gICAgNDhNICAgNTRNCi0vKiAwJSAgKi97IDkzLCAgIDE3NywgIDQyMCwgIDUzOCwgIDY5MCwgIDc3NCwgIDEwMDEsICAxNDAxLCAgMTc2OCwgIDIzNTgsICAyODM4LCAgMzAzOX0sCi0vKiAxJSAgKi97IDkyLCAgIDE3NiwgIDQxNiwgIDUzMywgIDY4MywgIDc2NywgIDk5MiwgICAxMzg5LCAgMTc1MiwgIDIzMzYsICAyODExLCAgMzAxMH0sCi0vKiAyJSAgKi97IDkxLCAgIDE3NCwgIDQxMiwgIDUyOCwgIDY3NSwgIDc2MCwgIDk4MywgICAxMzc2LCAgMTczNSwgIDIzMTMsICAyNzgzLCAgMjk3OX0sCi0vKiAzJSAgKi97IDkwLCAgIDE3MiwgIDQwNywgIDUyMywgIDY2NywgIDc1MywgIDk3MywgICAxMzYzLCAgMTcxOSwgIDIyOTAsICAyNzU1LCAgMjk0OH0sCi0vKiA0JSAgKi97IDkwLCAgIDE3MCwgIDQwMywgIDUxOCwgIDY1OSwgIDc0NiwgIDk2NCwgICAxMzUwLCAgMTcwMSwgIDIyNjYsICAyNzI2LCAgMjkxNn0sCi0vKiA1JSAgKi97IDg5LCAgIDE2OSwgIDM5OCwgIDUxMiwgIDY1MSwgIDczOCwgIDk1NCwgICAxMzM2LCAgMTY4NCwgIDIyNDIsICAyNjk2LCAgMjg4NH0sCi0vKiA2JSAgKi97IDg4LCAgIDE2NywgIDM5NCwgIDUwNywgIDY0MywgIDczMSwgIDk0NCwgICAxMzIyLCAgMTY2NiwgIDIyMTcsICAyNjY1LCAgMjg1MX0sCi0vKiA3JSAgKi97IDg3LCAgIDE2NSwgIDM4OSwgIDUwMiwgIDYzNSwgIDcyMywgIDkzNSwgICAxMzA4LCAgMTY0OCwgIDIxOTIsICAyNjM0LCAgMjgxN30sCi0vKiA4JSAgKi97IDg2LCAgIDE2MywgIDM4NCwgIDQ5NywgIDYyNiwgIDcxNiwgIDkyNCwgICAxMjk0LCAgMTYyOSwgIDIxNjYsICAyNjAyLCAgMjc4Mn0sCi0vKiA5JSAgKi97IDg1LCAgIDE2MSwgIDM4MCwgIDQ5MSwgIDYxOCwgIDcwOCwgIDkxNCwgICAxMjc5LCAgMTYxMSwgIDIxNDAsICAyNTcwLCAgMjc0N30sCi0vKiAxMCUgKi97IDg0LCAgIDE2MCwgIDM3NSwgIDQ4NiwgIDYwOSwgIDcwMCwgIDkwNCwgICAxMjY1LCAgMTU5MSwgIDIxMTMsICAyNTM3LCAgMjcxMX0sCi0vKiAxMSUgKi97IDgzLCAgIDE1OCwgIDM3MCwgIDQ4MCwgIDYwMCwgIDY5MiwgIDg5NCwgICAxMjUwLCAgMTU3MiwgIDIwODYsICAyNTAzLCAgMjY3NX0sCi0vKiAxMiUgKi97IDgyLCAgIDE1NiwgIDM2NSwgIDQ3NSwgIDU5MiwgIDY4NCwgIDg4MywgICAxMjM0LCAgMTU1MiwgIDIwNTksICAyNDY5LCAgMjYzOH0sCi0vKiAxMyUgKi97IDgxLCAgIDE1NCwgIDM2MCwgIDQ2OSwgIDU4MywgIDY3NiwgIDg3MiwgICAxMjE5LCAgMTUzMiwgIDIwMzEsICAyNDM1LCAgMjYwMH0sCi0vKiAxNCUgKi97IDgwLCAgIDE1MiwgIDM1NSwgIDQ2NCwgIDU3NCwgIDY2OCwgIDg2MiwgICAxMjA0LCAgMTUxMiwgIDIwMDMsICAyNDAwLCAgMjU2Mn0sCi0vKiAxNSUgKi97IDc5LCAgIDE1MCwgIDM1MCwgIDQ1OCwgIDU2NSwgIDY2MCwgIDg1MSwgICAxMTg4LCAgMTQ5MiwgIDE5NzQsICAyMzY1LCAgMjUyNH0sCi0vKiAxNiUgKi97IDc4LCAgIDE0OCwgIDM0NSwgIDQ1MywgIDU1NiwgIDY1MiwgIDg0MCwgICAxMTcyLCAgMTQ3MSwgIDE5NDUsICAyMzI5LCAgMjQ4NX0sCi0vKiAxNyUgKi97IDc3LCAgIDE0NiwgIDM0MCwgIDQ0NywgIDU0NywgIDY0MywgIDgyOSwgICAxMTU2LCAgMTQ1MCwgIDE5MTYsICAyMjkzLCAgMjQ0Nn0sCi0vKiAxOCUgKi97IDc2LCAgIDE0NCwgIDMzNSwgIDQ0MSwgIDUzOCwgIDYzNSwgIDgxOCwgICAxMTQwLCAgMTQyOSwgIDE4ODcsICAyMjU2LCAgMjQwNn0sCi0vKiAxOSUgKi97IDc1LCAgIDE0MywgIDMzMCwgIDQzNiwgIDUyOSwgIDYyNywgIDgwNywgICAxMTI0LCAgMTQwOCwgIDE4NTcsICAyMjE5LCAgMjM2Nn0sCi0vKiAyMCUgKi97IDc0LCAgIDE0MSwgIDMyNSwgIDQzMCwgIDUyMCwgIDYxOCwgIDc5NSwgICAxMTA3LCAgMTM4NiwgIDE4MjcsICAyMTgyLCAgMjMyNn0sCi0vKiAyMSUgKi97IDczLCAgIDEzOSwgIDMyMCwgIDQyNCwgIDUxMCwgIDYxMCwgIDc4NCwgICAxMDkxLCAgMTM2NSwgIDE3OTcsICAyMTQ1LCAgMjI4NX0sCi0vKiAyMiUgKi97IDcyLCAgIDEzNywgIDMxNCwgIDQxOCwgIDUwMSwgIDYwMSwgIDc3MiwgICAxMDc0LCAgMTM0MywgIDE3NjYsICAyMTA3LCAgMjI0NH0sCi0vKiAyMyUgKi97IDcxLCAgIDEzNSwgIDMwOSwgIDQxMiwgIDQ5MiwgIDU5MiwgIDc2MSwgICAxMDU3LCAgMTMyMSwgIDE3MzYsICAyMDY5LCAgMjIwM30sCi0vKiAyNCUgKi97IDcwLCAgIDEzMywgIDMwNCwgIDQwNywgIDQ4MiwgIDU4NCwgIDc0OSwgICAxMDQwLCAgMTI5OSwgIDE3MDUsICAyMDMxLCAgMjE2MX0sCi0vKiAyNSUgKi97IDY5LCAgIDEzMSwgIDI5OSwgIDQwMSwgIDQ3MywgIDU3NSwgIDczOCwgICAxMDIzLCAgMTI3NywgIDE2NzQsICAxOTkyLCAgMjEyMH0sCi0vKiAyNiUgKi97IDY4LCAgIDEyOSwgIDI5MywgIDM5NSwgIDQ2NCwgIDU2NiwgIDcyNiwgICAxMDA2LCAgMTI1NCwgIDE2NDIsICAxOTUzLCAgMjA3OH0sCi0vKiAyNyUgKi97IDY3LCAgIDEyNywgIDI4OCwgIDM4OSwgIDQ1NCwgIDU1NywgIDcxNCwgICA5ODksICAgMTIzMiwgIDE2MTEsICAxOTE1LCAgMjAzNX0sCi0vKiAyOCUgKi97IDY2LCAgIDEyNSwgIDI4MywgIDM4MywgIDQ0NSwgIDU0OSwgIDcwMywgICA5NzIsICAgMTIwOSwgIDE1NzksICAxODc2LCAgMTk5M30sCi0vKiAyOSUgKi97IDY1LCAgIDEyMywgIDI3OCwgIDM3NywgIDQzNiwgIDU0MCwgIDY5MSwgICA5NTUsICAgMTE4NywgIDE1NDgsICAxODM2LCAgMTk1MX0sCi0vKiAzMCUgKi97IDY0LCAgIDEyMSwgIDI3MiwgIDM3MSwgIDQyNiwgIDUzMSwgIDY3OSwgICA5MzcsICAgMTE2NCwgIDE1MTYsICAxNzk3LCAgMTkwOH0sCi0vKiAzMSUgKi97IDYzLCAgIDExOSwgIDI2NywgIDM2NSwgIDQxNywgIDUyMiwgIDY2NywgICA5MjAsICAgMTE0MSwgIDE0ODQsICAxNzU4LCAgMTg2Nn0sCi0vKiAzMiUgKi97IDYyLCAgIDExNywgIDI2MiwgIDM1OSwgIDQwNywgIDUxMywgIDY1NSwgICA5MDIsICAgMTExOCwgIDE0NTMsICAxNzE5LCAgMTgyM30sCi0vKiAzMyUgKi97IDYxLCAgIDExNSwgIDI1NiwgIDM1MywgIDM5OCwgIDUwNCwgIDY0MywgICA4ODUsICAgMTA5NSwgIDE0MjEsICAxNjc5LCAgMTc4MX0sCi0vKiAzNCUgKi97IDYwLCAgIDExMywgIDI1MSwgIDM0NywgIDM4OSwgIDQ5NSwgIDYzMSwgICA4NjcsICAgMTA3MiwgIDEzODksICAxNjQwLCAgMTczOH0sCi0vKiAzNSUgKi97IDU5LCAgIDExMSwgIDI0NiwgIDM0MSwgIDM3OSwgIDQ4NiwgIDYxOSwgICA4NTAsICAgMTA0OSwgIDEzNTcsICAxNjAwLCAgMTY5NX0sCi0vKiAzNiUgKi97IDU4LCAgIDEwOCwgIDI0MCwgIDMzNSwgIDM3MCwgIDQ3NywgIDYwNywgICA4MzIsICAgMTAyNywgIDEzMjUsICAxNTYxLCAgMTY1M30sCi0vKiAzNyUgKi97IDU3LCAgIDEwNiwgIDIzNSwgIDMyOSwgIDM2MSwgIDQ2OCwgIDU5NSwgICA4MTUsICAgMTAwNCwgIDEyOTMsICAxNTIyLCAgMTYxMH0sCi0vKiAzOCUgKi97IDU2LCAgIDEwNCwgIDIzMCwgIDMyMywgIDM1MSwgIDQ1OSwgIDU4NCwgICA3OTcsICAgOTgxLCAgIDEyNjEsICAxNDgzLCAgMTU2OH0sCi0vKiAzOSUgKi97IDU1LCAgIDEwMiwgIDIyNCwgIDMxNywgIDM0MiwgIDQ1MCwgIDU3MiwgICA3ODAsICAgOTU4LCAgIDEyMzAsICAxNDQzLCAgMTUyNn0sCi0vKiA0MCUgKi97IDU0LCAgIDEwMCwgIDIxOSwgIDMxMSwgIDMzMywgIDQ0MSwgIDU2MCwgICA3NjIsICAgOTM1LCAgIDExOTgsICAxNDA0LCAgMTQ4NH0sCi0vKiA0MSUgKi97IDUzLCAgIDk4LCAgIDIxNCwgIDMwNSwgIDMyNCwgIDQzMiwgIDU0OCwgICA3NDQsICAgOTEyLCAgIDExNjYsICAxMzY2LCAgMTQ0Mn0sCi0vKiA0MiUgKi97IDUyLCAgIDk2LCAgIDIwOSwgIDI5OSwgIDMxNSwgIDQyMywgIDUzNiwgICA3MjcsICAgODg5LCAgIDExMzUsICAxMzI3LCAgMTQwMH0sCi0vKiA0MyUgKi97IDUxLCAgIDk0LCAgIDIwMywgIDI5MywgIDMwNiwgIDQxNCwgIDUyNCwgICA3MDksICAgODY2LCAgIDExMDQsICAxMjg5LCAgMTM1OH0sCi0vKiA0NCUgKi97IDUwLCAgIDkyLCAgIDE5OCwgIDI4NywgIDI5NywgIDQwNSwgIDUxMiwgICA2OTIsICAgODQ0LCAgIDEwNzIsICAxMjUwLCAgMTMxN30sCi0vKiA0NSUgKi97IDQ5LCAgIDkwLCAgIDE5MywgIDI4MSwgIDI4OCwgIDM5NiwgIDUwMCwgICA2NzUsICAgODIxLCAgIDEwNDEsICAxMjEyLCAgMTI3Nn0sCi0vKiA0NiUgKi97IDQ4LCAgIDg4LCAgIDE4OCwgIDI3NSwgIDI3OSwgIDM4NywgIDQ4OCwgICA2NTcsICAgNzk5LCAgIDEwMTEsICAxMTc0LCAgMTIzNn0sCi0vKiA0NyUgKi97IDQ3LCAgIDg2LCAgIDE4MywgIDI2OSwgIDI3MSwgIDM3OCwgIDQ3NiwgICA2NDAsICAgNzc3LCAgIDk4MCwgICAxMTM3LCAgMTE5NX0sCi0vKiA0OCUgKi97IDQ2LCAgIDg0LCAgIDE3OCwgIDI2MiwgIDI2MiwgIDM2OSwgIDQ2NCwgICA2MjMsICAgNzU0LCAgIDk0OSwgICAxMTAwLCAgMTE1NX0sCi0vKiA0OSUgKi97IDQ1LCAgIDgyLCAgIDE3MywgIDI1NiwgIDI1NCwgIDM2MCwgIDQ1MiwgICA2MDYsICAgNzMyLCAgIDkxOSwgICAxMDYzLCAgMTExNn0sCi0vKiA1MCUgKi97IDQ0LCAgIDgwLCAgIDE2OCwgIDI1MSwgIDI0NSwgIDM1MSwgIDQ0MSwgICA1ODksICAgNzEwLCAgIDg4OSwgICAxMDI2LCAgMTA3Nn0sCi0vKiA1MSUgKi97IDQzLCAgIDc4LCAgIDE2MywgIDI0NSwgIDIzNywgIDM0MiwgIDQyOSwgICA1NzIsICAgNjg5LCAgIDg2MCwgICA5OTAsICAgMTAzOH0sCi0vKiA1MiUgKi97IDQyLCAgIDc2LCAgIDE1OCwgIDIzOSwgIDIyOCwgIDMzMywgIDQxNywgICA1NTUsICAgNjY3LCAgIDgzMCwgICA5NTUsICAgOTk5fSwKLS8qIDUzJSAqL3sgNDEsICAgNzQsICAgMTUzLCAgMjMzLCAgMjIwLCAgMzI0LCAgNDA2LCAgIDUzOCwgICA2NDUsICAgODAxLCAgIDkxOSwgICA5NjF9LAotLyogNTQlICoveyA0MCwgICA3MiwgICAxNDgsICAyMjcsICAyMTIsICAzMTUsICAzOTQsICAgNTIyLCAgIDYyNCwgICA3NzMsICAgODg0LCAgIDkyNH0sCi0vKiA1NSUgKi97IDM5LCAgIDcwLCAgIDE0MywgIDIyMSwgIDIwNCwgIDMwNywgIDM4MywgICA1MDUsICAgNjAzLCAgIDc0NCwgICA4NTAsICAgODg3fSwKLS8qIDU2JSAqL3sgMzgsICAgNjgsICAgMTM4LCAgMjE1LCAgMTk2LCAgMjk4LCAgMzcxLCAgIDQ4OSwgICA1ODIsICAgNzE2LCAgIDgxNiwgICA4NTF9LAotLyogNTclICoveyAzNywgICA2NywgICAxMzQsICAyMDksICAxODksICAyODksICAzNjAsICAgNDczLCAgIDU2MiwgICA2ODgsICAgNzgzLCAgIDgxNX0sCi0vKiA1OCUgKi97IDM2LCAgIDY1LCAgIDEyOSwgIDIwMywgIDE4MSwgIDI4MSwgIDM0OSwgICA0NTcsICAgNTQxLCAgIDY2MSwgICA3NTAsICAgNzgwfSwKLS8qIDU5JSAqL3sgMzUsICAgNjMsICAgMTI0LCAgMTk3LCAgMTc0LCAgMjcyLCAgMzM4LCAgIDQ0MSwgICA1MjEsICAgNjM0LCAgIDcxNywgICA3NDV9LAotLyogNjAlICoveyAzNCwgICA2MSwgICAxMjAsICAxOTIsICAxNjYsICAyNjQsICAzMjcsICAgNDI1LCAgIDUwMSwgICA2MDgsICAgNjg2LCAgIDcxMn0sCi0vKiA2MSUgKi97IDMzLCAgIDU5LCAgIDExNSwgIDE4NiwgIDE1OSwgIDI1NSwgIDMxNiwgICA0MDksICAgNDgyLCAgIDU4MiwgICA2NTUsICAgNjc4fSwKLS8qIDYyJSAqL3sgMzIsICAgNTcsICAgMTExLCAgMTgwLCAgMTUyLCAgMjQ3LCAgMzA1LCAgIDM5NCwgICA0NjIsICAgNTU2LCAgIDYyNCwgICA2NDZ9LAotLyogNjMlICoveyAzMSwgICA1NSwgICAxMDcsICAxNzQsICAxNDUsICAyMzgsICAyOTQsICAgMzc5LCAgIDQ0MywgICA1MzEsICAgNTk0LCAgIDYxNH0sCi0vKiA2NCUgKi97IDMwLCAgIDUzLCAgIDEwMiwgIDE2OSwgIDEzOCwgIDIzMCwgIDI4MywgICAzNjQsICAgNDI1LCAgIDUwNiwgICA1NjUsICAgNTgzfSwKLS8qIDY1JSAqL3sgMjksICAgNTIsICAgOTgsICAgMTYzLCAgMTMyLCAgMjIyLCAgMjczLCAgIDM0OSwgICA0MDYsICAgNDgyLCAgIDUzNiwgICA1NTN9LAotLyogNjYlICoveyAyOCwgICA1MCwgICA5NCwgICAxNTgsICAxMjUsICAyMTQsICAyNjIsICAgMzM0LCAgIDM4OCwgICA0NTksICAgNTA4LCAgIDUyM30sCi0vKiA2NyUgKi97IDI3LCAgIDQ4LCAgIDkwLCAgIDE1MiwgIDExOSwgIDIwNiwgIDI1MiwgICAzMjAsICAgMzcwLCAgIDQzNiwgICA0ODEsICAgNDk1fSwKLS8qIDY4JSAqL3sgMjYsICAgNDYsICAgODYsICAgMTQ3LCAgMTEzLCAgMTk4LCAgMjQyLCAgIDMwNiwgICAzNTMsICAgNDEzLCAgIDQ1NSwgICA0Njd9LAotLyogNjklICoveyAyNiwgICA0NCwgICA4MiwgICAxNDEsICAxMDcsICAxOTAsICAyMzEsICAgMjkyLCAgIDMzNiwgICAzOTEsICAgNDI5LCAgIDQ0MH0sCi0vKiA3MCUgKi97IDI1LCAgIDQzLCAgIDc4LCAgIDEzNiwgIDEwMSwgIDE4MiwgIDIyMSwgICAyNzgsICAgMzE5LCAgIDM3MCwgICA0MDUsICAgNDE0fSwKLS8qIDcxJSAqL3sgMjQsICAgNDEsICAgNzQsICAgMTMwLCAgOTUsICAgMTc0LCAgMjEyLCAgIDI2NSwgICAzMDMsICAgMzUwLCAgIDM4MSwgICAzODl9LAotLyogNzIlICoveyAyMywgICAzOSwgICA3MSwgICAxMjUsICA5MCwgICAxNjcsICAyMDIsICAgMjUyLCAgIDI4NywgICAzMjksICAgMzU4LCAgIDM2NX0sCi0vKiA3MyUgKi97IDIyLCAgIDM3LCAgIDY3LCAgIDExOSwgIDg1LCAgIDE1OSwgIDE5MiwgICAyMzksICAgMjcxLCAgIDMxMCwgICAzMzUsICAgMzQyfSwKLS8qIDc0JSAqL3sgMjEsICAgMzYsICAgNjMsICAgMTE0LCAgODAsICAgMTUxLCAgMTgzLCAgIDIyNiwgICAyNTYsICAgMjkxLCAgIDMxNCwgICAzMjB9LAotLyogNzUlICoveyAyMCwgICAzNCwgICA2MCwgICAxMDksICA3NSwgICAxNDQsICAxNzQsICAgMjE0LCAgIDI0MSwgICAyNzMsICAgMjk0LCAgIDI5OH0sCi0vKiA3NiUgKi97IDE5LCAgIDMyLCAgIDU3LCAgIDEwNCwgIDcwLCAgIDEzNywgIDE2NCwgICAyMDIsICAgMjI3LCAgIDI1NiwgICAyNzQsICAgMjc4fSwKLS8qIDc3JSAqL3sgMTgsICAgMzEsICAgNTMsICAgOTksICAgNjYsICAgMTMwLCAgMTU1LCAgIDE5MCwgICAyMTMsICAgMjM5LCAgIDI1NiwgICAyNTl9LAotLyogNzglICoveyAxNywgICAyOSwgICA1MCwgICA5NCwgICA2MiwgICAxMjIsICAxNDYsICAgMTc4LCAgIDIwMCwgICAyMjMsICAgMjM4LCAgIDI0MX0sCi0vKiA3OSUgKi97IDE2LCAgIDI4LCAgIDQ3LCAgIDg5LCAgIDU4LCAgIDExNSwgIDEzOCwgICAxNjcsICAgMTg3LCAgIDIwOCwgICAyMjIsICAgMjI1fSwKLS8qIDgwJSAqL3sgMTYsICAgMjYsICAgNDQsICAgODQsICAgNTQsICAgMTA5LCAgMTI5LCAgIDE1NiwgICAxNzUsICAgMTk0LCAgIDIwNiwgICAyMDl9LAotLyogODElICoveyAxNSwgICAyNCwgICA0MSwgICA3OSwgICA1MCwgICAxMDIsICAxMjEsICAgMTQ2LCAgIDE2MywgICAxODAsICAgMTkyLCAgIDE5NH0sCi0vKiA4MiUgKi97IDE0LCAgIDIzLCAgIDM5LCAgIDc0LCAgIDQ3LCAgIDk1LCAgIDExMywgICAxMzYsICAgMTUxLCAgIDE2NywgICAxNzgsICAgMTgxfSwKLS8qIDgzJSAqL3sgMTMsICAgMjEsICAgMzYsICAgNjksICAgNDQsICAgODksICAgMTA1LCAgIDEyNiwgICAxNDAsICAgMTU1LCAgIDE2NiwgICAxNjl9LAotLyogODQlICoveyAxMiwgICAyMCwgICAzMywgICA2NCwgICA0MSwgICA4MiwgICA5NywgICAgMTE2LCAgIDEzMCwgICAxNDQsICAgMTU1LCAgIDE1OH0sCi0vKiA4NSUgKi97IDExLCAgIDE5LCAgIDMxLCAgIDYwLCAgIDM5LCAgIDc2LCAgIDg5LCAgICAxMDcsICAgMTIwLCAgIDEzNCwgICAxNDUsICAgMTQ5fSwKLS8qIDg2JSAqL3sgMTEsICAgMTcsICAgMjksICAgNTUsICAgMzYsICAgNzAsICAgODIsICAgIDk4LCAgICAxMTAsICAgMTI1LCAgIDEzNiwgICAxNDB9LAotLyogODclICoveyAxMCwgICAxNiwgICAyNiwgICA1MSwgICAzNCwgICA2NCwgICA3NSwgICAgOTAsICAgIDEwMiwgICAxMTYsICAgMTI4LCAgIDEzM30sCi0vKiA4OCUgKi97IDksICAgIDE0LCAgIDI0LCAgIDQ2LCAgIDMyLCAgIDU4LCAgIDY4LCAgICA4MSwgICAgOTMsICAgIDEwOCwgICAxMjEsICAgMTI4fSwKLS8qIDg5JSAqL3sgOCwgICAgMTMsICAgMjIsICAgNDIsICAgMzEsICAgNTIsICAgNjEsICAgIDc0LCAgICA4NiwgICAgMTAyLCAgIDExNiwgICAxMjR9LAotLyogOTAlICoveyA3LCAgICAxMiwgICAyMSwgICAzNywgICAyOSwgICA0NiwgICA1NCwgICAgNjYsICAgIDc5LCAgICA5NiwgICAgMTEyLCAgIDEyMX0KLX07Ci0KLSNkZWZpbmUgUlNTSUJVRl9OVU0gMTAKLSNkZWZpbmUgUlNTSTJSQVRFX1NJWkUgOQotCi1zdGF0aWMgVFhSRVRSWV9SRUMgVHhSYXRlUmVjPXtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFMgLSAxLCAwfTsgICAvL25ldyByZWNvcmQ9PlR4UmF0ZVJlYwotc3RhdGljIGludCBUeFJldHJ5UmF0ZTsKLS8vc3RhdGljIGludCBTUTMsIEJTU19QS19DTlQsIE5JRExFU0xPVCwgU0xPVF9DTlQsIElOVEVSRl9DTlQsIEdBUF9DTlQsIERTX0VWTTsKLXN0YXRpYyBzMzIgUlNTSUJ1ZltSU1NJQlVGX05VTV09ey03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MH07Ci1zdGF0aWMgczMyIFJTU0lTbW9vdGhlZD0tNzAwOwotc3RhdGljIGludCBSU1NJQnVmSW5kZXg9MDsKLXN0YXRpYyB1OCBtYXhfcnNzaV9yYXRlOwotc3RhdGljIGludCByYXRlX3RibFsxM10gPSB7MCwxLDIsNSwxMSw2LDksMTIsMTgsMjQsMzYsNDgsNTR9OwotLy9bV0tDSEVOXXN0YXRpYyBjb3JlX2RhdGFfdCAqcE1UT2NvcmVfZGF0YT1OVUxMOwotCiBzdGF0aWMgaW50IFRvdGFsVHhQa3QgPSAwOwogc3RhdGljIGludCBUb3RhbFR4UGt0UmV0cnkgPSAwOwotc3RhdGljIGludCBUeFBrdFBlckFudFszXSA9IHswLDAsMH07Ci1zdGF0aWMgaW50IFJYUlNTSUFOVFszXSA9ey03MCwtNzAsLTcwfTsKLXN0YXRpYyBpbnQgVHhQa3RSZXRyeVBlckFudFszXSA9IHswLDAsMH07Ci0vL3N0YXRpYyBpbnQgVHhEb21pbmF0ZUZsYWc9RkFMU0U7Ci1zdGF0aWMgdTggb2xkX2FudGVubmFbNF09ezEgLDAgLDEgLDB9Owogc3RhdGljIGludCByZXRyeXJhdGVfcmVjW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU107Ly90aGlzIHJlY29yZCB0aGUgcmV0cnkgcmF0ZSBhdCBkaWZmZXJlbnQgZGF0YSByYXRlCiAKIHN0YXRpYyBpbnQgUGVyaW9kVG90YWxUeFBrdCA9IDA7CkBAIC0yMjEsMTI4ICs1NywxNCBAQAogCXU4ICBUeFJhdGU7CiB9UlNTSTJSQVRFOwogCi1zdGF0aWMgUlNTSTJSQVRFIFJTU0kyUmF0ZVRibFtSU1NJMlJBVEVfU0laRV0gPQotewotCXstNzQwLCAxMDh9LCAgLy8gNTRNCi0Jey03NjAsIDk2fSwgIC8vIDQ4TQotCXstODIwLCA3Mn0sICAvLyAzNk0KLQl7LTg1MCwgNDh9LCAgLy8gMjRNCi0Jey04NzAsIDM2fSwgIC8vIDE4TQotCXstODkwLCAyNH0sICAvLyAxMk0KLQl7LTkwMCwgMTJ9LCAgLy8gNk0KLQl7LTkyMCwgMTF9LCAvLyA1LjVNCi0Jey05NTAsIDR9LCAvLyAyTQotfTsKLXN0YXRpYyB1OCB1bnRvZ2dsZWNvdW50Owotc3RhdGljIHU4IGxhc3RfcmF0ZV9hbnQ7IC8vdGhpcyBpcyB1c2VkIGZvciBhbnRlbm5hIGJhY2tvZmYtaGgKLQotdTgJYm9TcGFyc2VUeFRyYWZmaWMgPSBGQUxTRTsKK3N0YXRpYyB1OCBib1NwYXJzZVR4VHJhZmZpYyA9IGZhbHNlOwogCiB2b2lkIE1UT19Jbml0KE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgQW50ZW5uYVRvZ2dsZUluaXRpYXRvcihNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIEFudGVubmFUb2dnbGVTdGF0ZShNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIFR4UHdyQ29udHJvbChNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIEdldEZyZXNoQW50ZW5uYURhdGEoTVRPX0ZVTkNfSU5QVVQpOwogdm9pZCBUeFJhdGVSZWR1Y3Rpb25DdHJsKE1UT19GVU5DX0lOUFVUKTsKIC8qKiAxLjEuMzEuMTAwMCBUdXJibyBtb2RpZnkgKi8KLS8vdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKGludCB0eXBlKTsKLXZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShNVE9fRlVOQ19JTlBVVCwgdTggKnBSYXRlQXJyYXksIHU4IEFycmF5U2l6ZSk7CiB2b2lkIE1UT19TZXRUeENvdW50KE1UT19GVU5DX0lOUFVULCB1OCB0MCwgdTggaW5kZXgpOwogdm9pZCBNVE9fVHhGYWlsZWQoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBTbW9vdGhSU1NJKHMzMiBuZXdfcnNzaSk7CiB2b2lkIGhhbF9nZXRfZHRvX3BhcmEoTVRPX0ZVTkNfSU5QVVQsIGNoYXIgKmJ1ZmZlcik7Ci11OCBDYWxjTmV3UmF0ZShNVE9fRlVOQ19JTlBVVCwgdTggb2xkX3JhdGUsIHUzMiByZXRyeV9jbnQsIHUzMiB0eF9mcmFnX2NudCk7Ci11OCBHZXRNYXhSYXRlTGV2ZWxGcm9tUlNTSSh2b2lkKTsKLXU4IE1UT19HZXRUeEZhbGxiYWNrUmF0ZShNVE9fRlVOQ19JTlBVVCk7Ci1pbnQgRGl2aWRlKGludCBhLCBpbnQgYik7Ci12b2lkIG11bHRpYWdjKE1UT19GVU5DX0lOUFVULCB1OCBoaWdoX2dhaW5fbW9kZSk7Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgTVRPX0luaXQgLS0KLS8vCi0vLyAgRGVzY3JpcHRpb246Ci0vLyAgICBTZXQgRFRPIFR4IFJhdGUgU2NvcGUgYmVjYXVzZSBkaWZmZXJlbnQgQVAgY291bGQgaGF2ZSBkaWZmZXJlbnQgUmF0ZSBzZXQuCi0vLyAgICBBZnRlciBvdXIgc3RhaW9uIGpvaW4gd2l0aCBBUCwgTE0gY29yZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplCi0vLyAgICBUeCBSYXRlIHRhYmxlLgotLy8KLS8vICBBcmd1bWVudHM6Ci0vLyAgICBwUmF0ZUFycmF5ICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgVHggUmF0ZSBBcnJheSBieSB0aGUgZm9sbG93aW5nIG9yZGVyCi0vLyAgICAgICAgICAgICAgICAgICAgLSAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgKLS8vICAgICAgICAgICAgICAgICAgICAtIERUTyB3b24ndCBjaGVjayB3aGV0aGVyIHJhdGUgb3JkZXIgaXMgaW52YWxpZCBvciBub3QKLS8vICAgIEFycmF5U2l6ZSAgICAgICAtIFRoZSBhcnJheSBzaXplIHRvIGluZGljYXRlIGhvdyBtYW55IHR4IHJhdGUgd2UgY2FuIGNob29zZQotLy8KLS8vICBzYW1wbGUgY29kZToKLS8vCXsKLS8vCQl1OCBSYXRlQXJyYXlbNF0gPSB7MiwgNCwgMTEsIDIyfTsKLS8vCQlNVE9fU2V0RFRPUmF0ZVJhbmdlKFJhdGVBcnJheSwgNCk7Ci0vLwl9Ci0vLwotLy8gIFJldHVybiBWYWx1ZToKLS8vICAgIE5vbmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKE1UT19GVU5DX0lOUFVULHU4ICpwUmF0ZUFycmF5LCB1OCBBcnJheVNpemUpCi17Ci0JdTgJaSwgaj0wOwotCi0JZm9yKGk9MDtpPEFycmF5U2l6ZTtpKyspCi0JewotCQlpZihwUmF0ZUFycmF5W2ldID09IDIyKQotCQkJYnJlYWs7Ci0JfQotCWlmKGkgPCBBcnJheVNpemUpIC8vd2UgbmVlZCBhZGp1c3QgdGhlIG9yZGVyIG9mIHJhdGUgbGlzdCBiZWNhdXNlIDExTWJwcyByYXRlIGV4aXN0cwotCXsKLQkJZm9yKDtpPjA7aS0tKQotCQl7Ci0JCQlpZihwUmF0ZUFycmF5W2ktMV0gPD0gMTEpCi0JCQkJYnJlYWs7Ci0JCQlwUmF0ZUFycmF5W2ldID0gcFJhdGVBcnJheVtpLTFdOwotCQl9Ci0JCXBSYXRlQXJyYXlbaV0gPSAyMjsKLQkJTVRPX09GRE1fUkFURV9MRVZFTCgpID0gaTsKLQl9Ci0JZWxzZQotCXsKLQkJZm9yKGk9MDsgaTxBcnJheVNpemU7IGkrKykKLQkJewotCQkJaWYgKHBSYXRlQXJyYXlbaV0gPj0gMTIpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJTVRPX09GRE1fUkFURV9MRVZFTCgpID0gaTsKLQl9Ci0KLQlmb3IoaT0wO2k8QXJyYXlTaXplO2krKykKLQl7Ci0JCU1UT19EYXRhX1JhdGVfVGJsW2ldID0gcFJhdGVBcnJheVtpXTsKLQkJZm9yKDtqPE1UT19NQVhfREFUQV9SQVRFX0xFVkVMUztqKyspCi0JCXsKLQkJCWlmKFN0YXJkYXJkX0RhdGFfUmF0ZV9UYmxbal0gPT0gcFJhdGVBcnJheVtpXSkKLQkJCQlicmVhazsKLQkJfQotCQlMZXZlbDJQZXJUYmxbaV0gPSBqOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW01UT106T3AgUmF0ZVslZF06ICVkXG4iLGksIE1UT19EYXRhX1JhdGVfVGJsW2ldKSk7Ci0JCSNlbmRpZgotCX0KLQlNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCA9IEFycmF5U2l6ZTsKLQlpZiggTVRPX0RBVEEoKS5SYXRlUG9saWN5ICkgLy8gMCBtZWFucyB0aGF0IG5vIHJlZ2lzdHJ5IHNldHRpbmcKLQl7Ci0JCWlmKCBNVE9fREFUQSgpLlJhdGVQb2xpY3kgPT0gMSApCi0JCQlUeFJhdGVSZWMudHhfcmF0ZSA9IDA7CS8vYXNjZW50Ci0JCWVsc2UKLQkJCVR4UmF0ZVJlYy50eF9yYXRlID0gTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgLTEgOwkvL2Rlc2NlbnQKLQl9Ci0JZWxzZQotCXsKLQkJaWYoIE1UT19JTklUVFhSQVRFX01PREUgKQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSAwOwkvL2FzY2VudAotCQllbHNlCi0JCQlUeFJhdGVSZWMudHhfcmF0ZSA9IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0xIDsJLy9kZXNjZW50Ci0JfQotCVR4UmF0ZVJlYy50eF9yZXRyeV9yYXRlID0gMDsKLQkvL3NldCBkZWZhdWx0IHJhdGUgZm9yIGluaXRpYWwgdXNlCi0JTVRPX1JBVEVfTEVWRUwoKSA9IFR4UmF0ZVJlYy50eF9yYXRlOwotCU1UT19GQUxMQkFDS19SQVRFX0xFVkVMKCkgPSBNVE9fUkFURV9MRVZFTCgpOwotfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gIE1UT19Jbml0IC0tCkBAIC0zNTMsNyArNzUsNyBAQAogLy8gICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZCBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uLgogLy8KIC8vICBBcmd1bWVudHM6Ci0vLyAgICBBZGFwdGVyICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgTWluaXBvcnQgQWRhcHRlciBDb250ZXh0CisvLyAgICBhZGFwdGVyICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgTWluaXBvcnQgYWRhcHRlciBDb250ZXh0CiAvLwogLy8gIFJldHVybiBWYWx1ZToKIC8vICAgIE5vbmUKQEAgLTM5Myw4ICsxMTUsOCBAQAogICAgIE1UT19TUV9BTlQoMCkgICAgICAgPSAwOwogICAgIE1UT19TUV9BTlQoMSkgICAgICAgPSAwOwogICAgIE1UT19BTlRfRElWRVJTSVRZKCkgPSBNVE9fQU5URU5OQV9ESVZFUlNJVFlfT047Ci0gICAgLy9DYXJkU2V0X0FudGVubmFEaXZlcnNpdHkoQWRhcHRlciwgTVRPX0FOVF9ESVZFUlNJVFkoKSk7Ci0gICAgLy9QTE1FU2V0QW50ZW5uYURpdmVyc2l0eSggQWRhcHRlciwgTVRPX0FOVF9ESVZFUlNJVFkoKSk7CisgICAgLy9DYXJkU2V0X0FudGVubmFEaXZlcnNpdHkoYWRhcHRlciwgTVRPX0FOVF9ESVZFUlNJVFkoKSk7CisgICAgLy9QTE1FU2V0QW50ZW5uYURpdmVyc2l0eSggYWRhcHRlciwgTVRPX0FOVF9ESVZFUlNJVFkoKSk7CiAKICAgICBNVE9fQUdJTkdfVElNRU9VVCgpID0gMDsvL01UT19UTVJfQUdJTkcoKSAvIE1UT19UTVJfUEVSSU9ESUMoKTsKIApAQCAtNDAyLDcgKzEyNCw2IEBACiAgICAgLy8KICAgICAvL01UT19SQVRFX0xFVkVMKCkgICAgICAgICAgICA9IDEwOwogICAgIE1UT19SQVRFX0xFVkVMKCkgICAgICAgICAgICA9IDA7Ci0JTVRPX0ZBTExCQUNLX1JBVEVfTEVWRUwoKQk9IE1UT19SQVRFX0xFVkVMKCk7CiAgICAgTVRPX0ZSQUdfVEhfTEVWRUwoKSAgICAgICAgID0gNDsKICAgICAvKiogMS4xLjIzLjEwMDAgVHVyYm8gbW9kaWZ5IGZyb20gLTEgdG8gKzEKIAlNVE9fUlRTX1RIUkVTSE9MRCgpICAgICAgICAgPSBNVE9fRlJBR19USCgpIC0gMTsKQEAgLTQ3MCw2NjkgKzE5MSw2IEBACiAJTVRPX0RBVEEoKS5SU1NJX2xvdyA9IC02MDsKIH0KIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotc3RhdGljIHUzMiBEVE9fUnhfSW5mb1sxM11bM107Ci1zdGF0aWMgdTMyIERUT19SeENSQ0ZhaWxfSW5mb1sxM11bM107Ci1zdGF0aWMgdTMyIEFudGVubmFUb2dnbGVCa29mZlRpbWVyPTU7Ci10eXBlZGVmIHN0cnVjdHsKLQlpbnQgUnhSYXRlOwotCWludCBSeFJhdGVQa3RzOwotCWludCBpbmRleDsKLX1SWFJBVEVfQU5UOwotUlhSQVRFX0FOVCBSeFJhdGVQZWFrQW50WzNdOwotCi0jZGVmaW5lIEFOVDAgICAgMAotI2RlZmluZSBBTlQxICAgIDEKLSNkZWZpbmUgT0xEX0FOVCAyCi0KLXZvaWQgU2VhcmNoUGVha1J4UmF0ZShpbnQgaW5kZXgpCi17Ci0JaW50IGk7Ci0JUnhSYXRlUGVha0FudFtpbmRleF0uUnhSYXRlUGt0cz0wOwotCS8vRmluZCBvdXQgdGhlIGJlc3QgcnggcmF0ZSB3aGljaCBpcyB1c2VkIG9uIGRpZmZlcmVudCBhbnRlbm5hCi0JZm9yKGk9MTtpPDEzO2krKykKLQl7Ci0JCWlmKERUT19SeF9JbmZvW2ldW2luZGV4XSA+ICh1MzIpIFJ4UmF0ZVBlYWtBbnRbaW5kZXhdLlJ4UmF0ZVBrdHMpCi0JCXsKLQkJCVJ4UmF0ZVBlYWtBbnRbaW5kZXhdLlJ4UmF0ZVBrdHMgPSBEVE9fUnhfSW5mb1tpXVtpbmRleF07Ci0JCQlSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGUgPSByYXRlX3RibFtpXTsKLQkJCVJ4UmF0ZVBlYWtBbnRbaW5kZXhdLmluZGV4ID0gaTsKLQkJfQotCX0KLX0KLQotdm9pZCBSZXNldERUT19SeEluZm8oaW50IGluZGV4LCBNVE9fRlVOQ19JTlBVVCkKLXsKLQlpbnQgaTsKLQotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIlJlc2V0RFRPcnhcbiIpKTsKLQkjZW5kaWYKLQotCWZvcihpPTA7aTwxMztpKyspCi0JCURUT19SeF9JbmZvW2ldW2luZGV4XSA9IE1UT19IQUwoKS0+cnhfb2tfY291bnRbaV07Ci0KLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhDUkNGYWlsX0luZm9baV1baW5kZXhdID0gTVRPX0hBTCgpLT5yeF9lcnJfY291bnRbaV07Ci0KLQlUb3RhbFR4UGt0ID0gMDsKLQlUb3RhbFR4UGt0UmV0cnkgPSAwOwotfQotCi12b2lkIEdldERUT19SeEluZm8oaW50IGluZGV4LCBNVE9fRlVOQ19JTlBVVCkKLXsKLQlpbnQgaTsKLQotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIkdldERUT3J4XG4iKSk7Ci0JI2VuZGlmCi0KLQkvL1BERUJVRygoIltNVE9dOkRUT19SeF9JbmZvWyVkXT0lZCwgcnhfb2tfY291bnQ9JWRcbiIsIGluZGV4LCBEVE9fUnhfSW5mb1swXVtpbmRleF0sIHBod19kYXRhLT5yeF9va19jb3VudFswXSkpOwotCWZvcihpPTA7aTwxMztpKyspCi0JCURUT19SeF9JbmZvW2ldW2luZGV4XSA9IGFicyhNVE9fSEFMKCktPnJ4X29rX2NvdW50W2ldIC0gRFRPX1J4X0luZm9baV1baW5kZXhdKTsKLQlpZihEVE9fUnhfSW5mb1swXVtpbmRleF09PTApIERUT19SeF9JbmZvWzBdW2luZGV4XSA9IDE7Ci0KLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhDUkNGYWlsX0luZm9baV1baW5kZXhdID0gTVRPX0hBTCgpLT5yeF9lcnJfY291bnRbaV0gLSBEVE9fUnhDUkNGYWlsX0luZm9baV1baW5kZXhdOwotCi0JVHhQa3RQZXJBbnRbaW5kZXhdID0gVG90YWxUeFBrdDsKLQlUeFBrdFJldHJ5UGVyQW50W2luZGV4XSA9IFRvdGFsVHhQa3RSZXRyeTsKLQlUb3RhbFR4UGt0ID0gMDsKLQlUb3RhbFR4UGt0UmV0cnkgPSAwOwotfQotCi12b2lkIE91dHB1dERlYnVnSW5mbyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKQotewotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltISERUT106VG90YWwgUnggKCVkKVx0XHQoJWQpIFxuICIsIERUT19SeF9JbmZvWzBdW2luZGV4MV0sIERUT19SeF9JbmZvWzBdW2luZGV4Ml0pKTsKLSAgICBXQkRFQlVHKCgiW0hIRFRPXTpSRUNFSVZFIFJTU0k6ICglZClcdFx0KCVkKSBcbiAiLCBSWFJTU0lBTlRbaW5kZXgxXSwgUlhSU1NJQU5UW2luZGV4Ml0pKTsKLQlXQkRFQlVHKCgiW0hIRFRPXTpUWCBwYWNrZXQgY29ycmVjdCByYXRlOiAoJWQpJSVcdFx0KCVkKSUlIFxuICIsRGl2aWRlKFR4UGt0UGVyQW50W2luZGV4MV0qMTAwLFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgxXSksIERpdmlkZShUeFBrdFBlckFudFtpbmRleDJdKjEwMCxUeFBrdFJldHJ5UGVyQW50W2luZGV4Ml0pKSk7Ci0JI2VuZGlmCi0JewotCQlpbnQgdG1wMSwgdG1wMjsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltISERUT106VG90YWwgVHggKCVkKVx0XHQoJWQpIFxuICIsIFR4UGt0UGVyQW50W2luZGV4MV0sIFR4UGt0UGVyQW50W2luZGV4Ml0pKTsKLQkJV0JERUJVRygoIltISERUT106VG90YWwgVHggcmV0cnkgKCVkKVx0XHQoJWQpIFxuICIsIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgxXSwgVHhQa3RSZXRyeVBlckFudFtpbmRleDJdKSk7Ci0JCSNlbmRpZgotCQl0bXAxID0gVHhQa3RQZXJBbnRbaW5kZXgxXSArIERUT19SeF9JbmZvWzBdW2luZGV4MV07Ci0JCXRtcDIgPSBUeFBrdFBlckFudFtpbmRleDJdICsgRFRPX1J4X0luZm9bMF1baW5kZXgyXTsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltISERUT106VG90YWwgVHgrUlggKCVkKVx0XHQoJWQpIFxuICIsIHRtcDEsIHRtcDIpKTsKLQkJI2VuZGlmCi0JfQotfQotCi11bnNpZ25lZCBjaGFyIFR4RG9taW5hdGUoaW50IGluZGV4KQotewotCWludCB0bXA7Ci0KLQl0bXAgPSBUeFBrdFBlckFudFtpbmRleF0gKyBEVE9fUnhfSW5mb1swXVtpbmRleF07Ci0KLQlpZihEaXZpZGUoVHhQa3RQZXJBbnRbaW5kZXhdKjEwMCwgdG1wKSA+IDQwKQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotdW5zaWduZWQgY2hhciBDbXBUeFJldHJ5UmF0ZShpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKQotewotCWludCB0eF9yZXRyeV9yYXRlMSwgdHhfcmV0cnlfcmF0ZTI7Ci0JdHhfcmV0cnlfcmF0ZTEgPSBEaXZpZGUoKFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgxXSAtIFR4UGt0UGVyQW50W2luZGV4MV0pKjEwMCwgVHhQa3RSZXRyeVBlckFudFtpbmRleDFdKTsKLQl0eF9yZXRyeV9yYXRlMiA9IERpdmlkZSgoVHhQa3RSZXRyeVBlckFudFtpbmRleDJdIC0gVHhQa3RQZXJBbnRbaW5kZXgyXSkqMTAwLCBUeFBrdFJldHJ5UGVyQW50W2luZGV4Ml0pOwotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltNVE9dOlR4UmV0cnkgQW50MDogKCVkJSUpICBBbnQxOiAoJWQlJSkgXG4gIiwgdHhfcmV0cnlfcmF0ZTEsIHR4X3JldHJ5X3JhdGUyKSk7Ci0JI2VuZGlmCi0KLQlpZih0eF9yZXRyeV9yYXRlMSA+IHR4X3JldHJ5X3JhdGUyKQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBHZXRGcmVzaEFudGVubmFEYXRhKE1UT19GVU5DX0lOUFVUKQotewotICAgIHU4ICAgICAgeDsKLQotCXggPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSk7Ci0JLy9oYWxfZ2V0X2Jzc19wa19jbnQoTVRPX0hBTCgpKTsKLQkvL2hhbF9nZXRfZXN0X3NxMyhNVE9fSEFMKCksIDEpOwotCW9sZF9hbnRlbm5hWzBdID0geDsKLQkvL2lmIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIGZvciB0aW1lcgotCVJlc2V0RFRPX1J4SW5mbyh4LCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQlpZihBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcikKLQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyLS07Ci0JaWYgKGFicyhsYXN0X3JhdGVfYW50LU1UT19SQVRFX0xFVkVMKCkpPjEpICAvL2JhY2tvZmYgdGltZXIgcmVzZXQKLQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MDsKLQotCWlmIChNVE9fQU5UX0RJVkVSU0lUWSgpICE9IE1UT19BTlRFTk5BX0RJVkVSU0lUWV9PTiB8fAotCQlNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSAhPSAxKQotCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTE7Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW0hIRFRPXToqKmxhc3QgZGF0YSByYXRlPSVkLG5vdyBkYXRhIHJhdGU9JWQqKmFudGVubmEgdG9nZ2xlIHRpbWVyPSVkIixsYXN0X3JhdGVfYW50LE1UT19SQVRFX0xFVkVMKCksQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXIpKTsKLQkjZW5kaWYKLQlsYXN0X3JhdGVfYW50PU1UT19SQVRFX0xFVkVMKCk7Ci0JaWYoQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9PTApCi0JewotCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfV0FJVDA7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOj09PXN0YXRlIGlzIHN0YXJ0aW5nPT1mb3IgYW50ZW5uYSB0b2dnbGU9PT0iKSk7Ci0JCSNlbmRpZgotCX0KLQllbHNlCi0JCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9JRExFOwotCi0JaWYgKChNVE9fQkFDS09GRl9UTVIoKSE9MCkmJihNVE9fUkFURV9MRVZFTCgpPk1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0gMykpCi0JewotCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfSURMRTsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltISERUT106PT09dGhlIGRhdGEgcmF0ZSBpcyAlZCAoZ29vZClhbmQgd2lsbCBub3QgdG9vZ2xlICA9PT0iLE1UT19EQVRBX1JBVEUoKT4+MSkpOwotCQkjZW5kaWYKLQl9Ci0KLQotfQotCi1pbnQgV0JfUENSWzJdOyAvL3BhY2tldCBjb3JyZWN0IHJhdGUKLQotdm9pZCBBbnRlbm5hVG9nZ2xlU3RhdGUoTVRPX0ZVTkNfSU5QVVQpCi17Ci0gICAgaW50IGRlY2lkZWFudGZsYWcgPSAwOwotCXU4ICAgICAgeDsKLQlzMzIgICAgIHJzc2k7Ci0KLQlpZihNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSAhPSAxKQotCQlyZXR1cm47Ci0JeCA9IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIoTVRPX0hBTCgpKTsKLQlzd2l0Y2goTVRPX1RPR0dMRV9TVEFURSgpKQotCXsKLQotCSAgIC8vTWlzc2luZy4uLi4uCi0JICAgY2FzZSBUT0dHTEVfU1RBVEVfSURMRToKLQkgY2FzZSBUT0dHTEVfU1RBVEVfQktPRkY6Ci0JICAgICAgICAgICAgIGJyZWFrOzsKLQotCQljYXNlIFRPR0dMRV9TVEFURV9XQUlUMDovLz09PT09PT09Ci0JICAgICAgICAgICAgICAgR2V0RFRPX1J4SW5mbyh4LCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0JCQlSWFJTU0lBTlRbeF0gPSByc3NpOwotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dICoqd2FpdDA9PT09IENvbGxlY3RpbmcgQW50JWQtLXJzc2k9JWRcbiIsIHgsUlhSU1NJQU5UW3hdKSk7Ci0JCQkjZW5kaWYKLQotCQkJLy9jaGFuZ2UgYW50ZW5uYSBhbmQgcmVzZXQgdGhlIGRhdGEgYXQgY2hhbmdlZCBhbnRlbm5hCi0JCQl4ID0gKH54KSAmIDB4MDE7Ci0JCQlNVE9fQU5UX1NFTCgpID0geDsKLQkJCWhhbF9zZXRfYW50ZW5uYV9udW1iZXIoTVRPX0hBTCgpLCBNVE9fQU5UX1NFTCgpKTsKLQkJCUxPQ0FMX0FOVEVOTkFfTk8oKSA9IHg7Ci0KLQkJCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9XQUlUMTsvL2dvIHRvIHdhaXQxCi0JCQlSZXNldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JCQlicmVhazsKLQkJY2FzZSBUT0dHTEVfU1RBVEVfV0FJVDE6Ly89PT09PXdhaXQxCi0JCQkvL01UT19DTlRfQU5UKHgpID0gaGFsX2dldF9ic3NfcGtfY250KE1UT19IQUwoKSk7Ci0JCQkvL1JYUlNTSUFOVFt4XSA9IGhhbF9nZXRfcnNzaShNVE9fSEFMKCkpOwotCQkJc21lX2dldF9yc3NpKE1UT19GVU5DX0lOUFVUX0RBVEEsICZyc3NpKTsKLQkJCVJYUlNTSUFOVFt4XSA9IHJzc2k7Ci0JCQlHZXREVE9fUnhJbmZvKHgsIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dICoqd2FpdDE9PT09IENvbGxlY3RpbmcgQW50JWQtLXJzc2k9JWRcbiIsIHgsUlhSU1NJQU5UW3hdKSk7Ci0JCQkjZW5kaWYKLQkJCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9NQUtFREVTSVNJT047Ci0JCQlicmVhazsKLQkJY2FzZSBUT0dHTEVfU1RBVEVfTUFLRURFU0lTSU9OOgotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dOkFudC0tMC0tLS0tLS0tLS0tLS0tLS0tMS0tLVxuIikpOwotCQkJT3V0cHV0RGVidWdJbmZvKEFOVDAsQU5UMSk7Ci0JCQkjZW5kaWYKLQkJCS8vUERFQlVHKCgiW0hIRFRPXSAqKmRlY2lzaW9uPT09PVxuICIpKTsKLQotCQkJLy89PT09PWZvbGxvd2luZyBpcyB0aGUgZGVjaXNpb24gcHJvZHVyY2UKLQkJCS8vCi0JCQkvLyAgICBmaXJzdDogY29tcGFyZSB0aGUgcnNzaSBpZiBkaWZmZXJlbmNlID4xMAotCQkJLy8gICAgICAgICAgIHNlbGVjdCB0aGUgbGFyZ2VyIG9uZQotCQkJLy8gICAgICAgICAgICxvdGhlcnMgZ28gdG8gc2Vjb25kCi0JCQkvLyAgICBzZWNvbmQ6IGNvbWFwcmUgdGhlIHR4K3J4IHBhY2tldCBjb3VudCBpZiBkaWZmZXJlbmNlID4xMDAKLQkJCS8vICAgICAgICAgICAgdXNlIGxhcmdlciB0b3RhbCBwYWNrZXRzIGFudGVubmEKLQkJCS8vICAgIHRoaXJkOjpjb21wYXJlIHRoZSB0eCBQRVIgaWYgcGFja2V0cz4yMAotCQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkaWZmZXJlbmNlID41JSB1c2luZyB0aGUgYmlnZ2VyIG9uZQotCQkJLy8KLQkJCS8vICAgIGZvdXJ0aDpjb21wYXJlIHRoZSBSWCBQRVIgaWYgcGFja2V0cz4yMAotCQkJLy8gICAgICAgICAgICAgICAgICAgIGlmIFBFUiBkaWZmZXJlbmNlIDw1JQotCQkJLy8gICAgICAgICAgICAgICAgICAgdXNpbmcgb2xkIGFudGVubmEKLQkJCS8vCi0JCQkvLwotCQkJaWYgKGFicyhSWFJTU0lBTlRbQU5UMF0tUlhSU1NJQU5UW0FOVDFdKSA+IE1UT1BBUkFfUlNTSV9USF9GT1JfQU5URElWKCkpLy89PT09cnNzaV90aAotCQkJewotCQkJCWlmIChSWFJTU0lBTlRbQU5UMF0+UlhSU1NJQU5UW0FOVDFdKQotCQkJCXsKLQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQkJCQl9Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiU2VsZWN0IGFudGVubmEgYnkgUlNTSVxuIikpOwotCQkJCSNlbmRpZgotCQkJfQotCQkJZWxzZSBpZiAgKGFicyhUeFBrdFBlckFudFtBTlQwXSArIERUT19SeF9JbmZvWzBdW0FOVDBdLVR4UGt0UGVyQW50W0FOVDFdLURUT19SeF9JbmZvWzBdW0FOVDFdKTw1MCkvLz09PT09dG90YWwgcGFja2V0X3RoCi0JCQl7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiVG90YWwgdHgvcnggaXMgY2xvc2VcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlpZiAoVHhEb21pbmF0ZShBTlQwKSAmJiBUeERvbWluYXRlKEFOVDEpKQotCQkJCXsKLQkJCQkJaWYgKChUeFBrdFBlckFudFtBTlQwXT4xMCkgJiYgKFR4UGt0UGVyQW50W0FOVDFdPjEwKSkvLz09PT10eCBwYWNrZXRfdGgKLQkJCQkJewotCQkJCQkJV0JfUENSW0FOVDBdPURpdmlkZShUeFBrdFBlckFudFtBTlQwXSoxMDAsVHhQa3RSZXRyeVBlckFudFtBTlQwXSk7Ci0JCQkJCQlXQl9QQ1JbQU5UMV09RGl2aWRlKFR4UGt0UGVyQW50W0FOVDFdKjEwMCxUeFBrdFJldHJ5UGVyQW50W0FOVDFdKTsKLQkJCQkJCWlmIChhYnMoV0JfUENSW0FOVDBdLVdCX1BDUltBTlQxXSk+NSkvLyB0eCBQRVJfdGgKLQkJCQkJCXsKLQkJCQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCQkJCVdCREVCVUcoKCJEZWNpZGUgYnkgVHggY29ycmVjdCByYXRlXG4iKSk7Ci0JCQkJCQkJI2VuZGlmCi0JCQkJCQkJaWYgKFdCX1BDUltBTlQwXT5XQl9QQ1JbQU5UMV0pCi0JCQkJCQkJewotCQkJCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQwOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQxOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCQkJdW50b2dnbGVjb3VudCsrOwotCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWRlY2lkZWFudGZsYWc9MDsKLQkJCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoRFRPX1J4X0luZm9bMF1bQU5UMF0+MTApJiYoRFRPX1J4X0luZm9bMF1bQU5UMV0+MTApKS8vcnggcGFja2V0IHRoCi0JCQkJewotCQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCQlXQkRFQlVHKCgiRGVjaWRlIGJ5IFJ4XG4iKSk7Ci0JCQkJCSNlbmRpZgotCQkJCQlpZiAoYWJzKERUT19SeF9JbmZvWzBdW0FOVDBdIC0gRFRPX1J4X0luZm9bMF1bQU5UMV0pPjUwKQotCQkJCQl7Ci0JCQkJCQlpZiAoRFRPX1J4X0luZm9bMF1bQU5UMF0gPiBEVE9fUnhfSW5mb1swXVtBTlQxXSkKLQkJCQkJCXsKLQkJCQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQxOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJZGVjaWRlYW50ZmxhZz0wOwotCQkJCQkJdW50b2dnbGVjb3VudCsrOwotCQkJCQkJTVRPX0FOVF9NQUMoKSA9IG9sZF9hbnRlbm5hWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWRlY2lkZWFudGZsYWc9MDsKLQkJCQkJTVRPX0FOVF9NQUMoKSA9IG9sZF9hbnRlbm5hWzBdOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKChUeFBrdFBlckFudFtBTlQwXStEVE9fUnhfSW5mb1swXVtBTlQwXSk+KFR4UGt0UGVyQW50W0FOVDFdK0RUT19SeF9JbmZvWzBdW0FOVDFdKSkvL3VzZSBtb3JlIHBhY2tla3RzCi0JCQl7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiZGVjaWRlIGJ5IHRvdGFsIHR4L3J4IDogQU5UIDBcbiIpKTsKLQkJCQkjZW5kaWYKLQotCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQlNVE9fQU5UX01BQygpID0gQU5UMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCJkZWNpZGUgYnkgdG90YWwgdHgvcnggOiBBTlQgMVxuIikpOwotCQkJCSNlbmRpZgotCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQotCQkJfQotCQkJLy90aGlzIGlzIGZvcmNlIGFudCB0b2dnbGUKLQkJCWlmIChkZWNpZGVhbnRmbGFnPT0xKQotCQkJCXVudG9nZ2xlY291bnQ9MDsKLQotCQkJdW50b2dnbGVjb3VudD11bnRvZ2dsZWNvdW50JTQ7Ci0JCQlpZiAodW50b2dnbGVjb3VudD09MykgLy9jaGFuZ2UgYW50ZW5uYQotCQkJCU1UT19BTlRfTUFDKCkgPSAoKH5vbGRfYW50ZW5uYVswXSkgJiAweDEpOwotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dOj09PT09PT09PT09PT09PT09PXVudG9nZ2xlLWNvdW50PSVkIix1bnRvZ2dsZWNvdW50KSk7Ci0JCQkjZW5kaWYKLQotCi0KLQotCQkJLy9QREVCVUcoKCJbSEhEVE9dICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipEVE8gRU5BQkxFPSVkIixNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSkpOwotCQkJaWYoTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgPT0gMSkKLQkJCXsKLQkJCQkJTVRPX0FOVF9TRUwoKSA9IE1UT19BTlRfTUFDKCk7Ci0JCQkJCWhhbF9zZXRfYW50ZW5uYV9udW1iZXIoTVRPX0hBTCgpLCBNVE9fQU5UX1NFTCgpKTsKLQkJCQkJTE9DQUxfQU5URU5OQV9OTygpID0gTVRPX0FOVF9TRUwoKTsKLQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJV0JERUJVRygoIltISERUT10gPT1kZWNpc2lvbj09KioqKioqKmFudGZsYWc9JWQqKioqKioqKioqKioqKioqKipzZWxlY3RlZCBhbnRlbm5hPSVkXG4iLGRlY2lkZWFudGZsYWcsTVRPX0FOVF9TRUwoKSkpOwotCQkJCQkjZW5kaWYKLQkJCX0KLQkJCWlmIChkZWNpZGVhbnRmbGFnKQotCQkJewotCQkJCW9sZF9hbnRlbm5hWzNdPW9sZF9hbnRlbm5hWzJdOy8vc3RvcmUgYW50ZW5uYSBpbmZvCi0JCQkJb2xkX2FudGVubmFbMl09b2xkX2FudGVubmFbMV07Ci0JCQkJb2xkX2FudGVubmFbMV09b2xkX2FudGVubmFbMF07Ci0JCQkJb2xkX2FudGVubmFbMF09IE1UT19BTlRfTUFDKCk7Ci0JCQl9Ci0JCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJV0JERUJVRygoIltISERUT106KipvbGQgYW50ZW5uYT1bJWRdWyVkXVslZF1bJWRdXG4iLG9sZF9hbnRlbm5hWzBdLG9sZF9hbnRlbm5hWzFdLG9sZF9hbnRlbm5hWzJdLG9sZF9hbnRlbm5hWzNdKSk7Ci0JCQkjZW5kaWYKLQkJCWlmIChvbGRfYW50ZW5uYVswXSE9b2xkX2FudGVubmFbMV0pCi0JCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MDsKLQkJCWVsc2UgaWYgKG9sZF9hbnRlbm5hWzFdIT1vbGRfYW50ZW5uYVsyXSkKLQkJCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0xOwotCQkJZWxzZSBpZiAob2xkX2FudGVubmFbMl0hPW9sZF9hbnRlbm5hWzNdKQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTI7Ci0JCQllbHNlCi0JCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9NDsKLQotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dOioqYmFjayBvZmYgdGltZXI9JWQiLEFudGVubmFUb2dnbGVCa29mZlRpbWVyKSk7Ci0JCQkjZW5kaWYKLQotCQkJUmVzZXREVE9fUnhJbmZvKE1UT19BTlRfTUFDKCksIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCQkJaWYgKEFudGVubmFUb2dnbGVCa29mZlRpbWVyPT0wICYmIGRlY2lkZWFudGZsYWcpCi0JCQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX1dBSVQwOwotCQkJZWxzZQotCQkJCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9JRExFOwotCQkJYnJlYWs7Ci0JfQotCi19Ci0KLXZvaWQgbXVsdGlhZ2MoTVRPX0ZVTkNfSU5QVVQsIHU4IGhpZ2hfZ2Fpbl9tb2RlICkKLXsKLQlzMzIJCXJzc2k7Ci0JaHdfZGF0YV90CSpwSHdEYXRhID0gTVRPX0hBTCgpOwotCi0Jc21lX2dldF9yc3NpKE1UT19GVU5DX0lOUFVUX0RBVEEsICZyc3NpKTsKLQotCWlmKCAoUkZfV0JfMjQyID09IHBId0RhdGEtPnBoeV90eXBlKSB8fAotCQkoUkZfV0JfMjQyXzEgPT0gcEh3RGF0YS0+cGh5X3R5cGUpICkgLy8gMjAwNjA2MTkuNSBBZGQKLQl7Ci0JCWlmIChoaWdoX2dhaW5fbW9kZT09MSkKLQkJewotCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MjIzMCk7Ci0JCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA2QzQzNDQwKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAwQywgMHhGMkYzMjIzMiApOyAvLyA5NDA5MTYgMHhmOGY1MjIzMCApOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDIwLCAweDA0Y2IzNDQwICk7IC8vIDk0MDkxNSAweDA2QzQzNDQwCi0JCX0KLQkJZWxzZSBpZiAoaGlnaF9nYWluX21vZGU9PTApCi0JCXsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4RUVFRTAwMEQpOwotCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNmM0MTQ0MCk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMEMsIDB4RUVFRTAwMEQgKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAyMCwgMHgwNGNiMTQ0MCApOyAvLyA5NDA5MTUgMHgwNmM0MTQ0MAotCQl9Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9BR0NdICoqcnNzaT0lZCwgaGlnaCBnYWluIG1vZGU9JWQiLCByc3NpLCBoaWdoX2dhaW5fbW9kZSkpOwotCQkjZW5kaWYKLQl9Ci19Ci0KLXZvaWQgVHhQd3JDb250cm9sKE1UT19GVU5DX0lOUFVUKQotewotICAgIHMzMiAgICAgcnNzaTsKLQlod19kYXRhX3QJKnBId0RhdGEgPSBNVE9fSEFMKCk7Ci0KLQlzbWVfZ2V0X3Jzc2koTVRPX0ZVTkNfSU5QVVRfREFUQSwgJnJzc2kpOwotCWlmKCAoUkZfV0JfMjQyID09IHBId0RhdGEtPnBoeV90eXBlKSB8fAotCQkoUkZfV0JfMjQyXzEgPT0gcEh3RGF0YS0+cGh5X3R5cGUpICkgLy8gMjAwNjA2MTkuNSBBZGQKLQl7Ci0JCXN0YXRpYyB1OCBoaWdoX2dhaW5fbW9kZTsgLy90aGlzIGlzIGZvciB3aW5ib25kIFJGIHN3aXRjaCBMTkEKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VzaW5nIGRpZmZlcmVudCByZWdpc3RlciBzZXR0aW5nCi0KLQkJaWYgKGhpZ2hfZ2Fpbl9tb2RlPT0xKQotCQl7Ci0JCQlpZiggcnNzaSA+IE1UT19EQVRBKCkuUlNTSV9oaWdoICkKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUyMjMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQxNjQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0wOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTE4MzApOwotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDU1NDNFNDApOwotCQkJCWhpZ2hfZ2Fpbl9tb2RlPTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAvL2lmIChoaWdoX2dhaW5fbW9kZT09MCkKLQkJewotCQkJaWYoIHJzc2kgPCBNVE9fREFUQSgpLlJTU0lfbG93ICkKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUxODMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQzRTQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0xOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTIyMzApOwotCQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDU1NDE2NDApOwotCQkJCWhpZ2hfZ2Fpbl9tb2RlPTA7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBbHdheXMgaGlnaCBnYWluIDIwMDUxMDE0LiBVc2luZyB0aGUgaW5pdGlhbCB2YWx1ZSBvbmx5LgotCQltdWx0aWFnYyhNVE9fRlVOQ19JTlBVVF9EQVRBLCBoaWdoX2dhaW5fbW9kZSk7Ci0JfQotfQotCi0KLXU4IENhbGNOZXdSYXRlKE1UT19GVU5DX0lOUFVULCB1OCBvbGRfcmF0ZSwgdTMyIHJldHJ5X2NudCwgdTMyIHR4X2ZyYWdfY250KQotewotCWludCBpOwotCXU4IG5ld19yYXRlOwotICAgIHUzMiByZXRyeV9yYXRlOwotCWludCBUeFRocm91cHV0MSwgVHhUaHJvdXB1dDIsIFR4VGhyb3VwdXQzLCBCZXN0VGhyb3VwaHQ7Ci0KLQlpZih0eF9mcmFnX2NudCA8IE1UT1BBUkFfVFhDT1VOVF9USF9GT1JfQ0FMQ19SQVRFKCkpIC8vdG9vIGZldyBwYWNrZXRzIHRyYW5zbWl0Ci0JewotCQlyZXR1cm4gMHhmZjsKLQl9Ci0JcmV0cnlfcmF0ZSA9IERpdmlkZShyZXRyeV9jbnQgKiAxMDAsIHR4X2ZyYWdfY250KTsKLQotCWlmKHJldHJ5X3JhdGUgPiA5MCkgcmV0cnlfcmF0ZSA9IDkwOyAvL2Fsd2F5cyB0cnVuY2F0ZSB0byA5MCUgZHVlIHRvIGxvb2t1cCB0YWJsZSBzaXplCi0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiIyMjIyMgQ3VycmVudCBsZXZlbCA9JWQsIFJldHJ5IGNvdW50ID0lZCwgRnJhZyBjb3VudCA9JWRcbiIsCi0JCQkJCQlvbGRfcmF0ZSwgcmV0cnlfY250LCB0eF9mcmFnX2NudCkpOwotCVdCREVCVUcoKCIqIyMqIFJldHJ5IHJhdGUgPSVkLCB0aHJvdWdocHV0ID0lZFxuIiwKLQkJCQkJCXJldHJ5X3JhdGUsIFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtvbGRfcmF0ZV0pKTsKLQlXQkRFQlVHKCgiVHhSYXRlUmVjLnR4X3JhdGUgPSVkLCBSZXRyeSByYXRlID0gJWQsIHRocm91Z2hwdXQgPSAlZFxuIiwKLQkJCQkJCVR4UmF0ZVJlYy50eF9yYXRlLCBUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZSwKLQkJCQkJCVJhdGVfUEVSX1RCTFtUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW1R4UmF0ZVJlYy50eF9yYXRlXV0pKTsKLQlXQkRFQlVHKCgib2xkX3JhdGUtMSA9JWQsIFJldHJ5IHJhdGUgPSAlZCwgdGhyb3VnaHB1dCA9ICVkXG4iLAotCQkJCQkJb2xkX3JhdGUtMSwgcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXSwKLQkJCQkJCVJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlLTFdXVtvbGRfcmF0ZS0xXSkpOwotCVdCREVCVUcoKCJvbGRfcmF0ZSsxID0lZCwgUmV0cnkgcmF0ZSA9ICVkLCB0aHJvdWdocHV0ID0gJWRcbiIsCi0JCQkJCQlvbGRfcmF0ZSsxLCByZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdLAotCQkJCQkJUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW29sZF9yYXRlKzFdKSk7Ci0JI2VuZGlmCi0KLQkvL2ZvbGxvd2luZyBpcyBmb3IgcmVjb3JkIHRoZSByZXRyeSByYXRlIGF0IHRoZSBkaWZmZXJlbnQgZGF0YSByYXRlCi0JaWYgKGFicyhyZXRyeV9yYXRlLXJldHJ5cmF0ZV9yZWNbb2xkX3JhdGVdKTw1MCkvLy0tLXRoZSBwZXIgVEgKLQkJcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZV0gPSByZXRyeV9yYXRlOyAvL3VwZGF0ZSByZXRyeSByYXRlCi0JZWxzZQotCXsKLQkJZm9yIChpPTA7aTxNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbDtpKyspIC8vcmVzZXQgYWxsIHJldHJ5IHJhdGUKLQkJCXJldHJ5cmF0ZV9yZWNbaV09MDsKLQkJcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZV0gPSByZXRyeV9yYXRlOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiUmVzZXQgcmV0cnkgcmF0ZSB0YWJsZVxuIikpOwotCQkjZW5kaWYKLQl9Ci0KLQlpZihUeFJhdGVSZWMudHhfcmF0ZSA+IG9sZF9yYXRlKSAgIC8vRGVjcmVhc2UgVHggUmF0ZQotCXsKLQkJVHhUaHJvdXB1dDEgPSBSYXRlX1BFUl9UQkxbVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtUeFJhdGVSZWMudHhfcmF0ZV1dOwotCQlUeFRocm91cHV0MiA9IFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGVdXTsKLQkJaWYoVHhUaHJvdXB1dDEgPiBUeFRocm91cHV0MikKLQkJewotCQkJbmV3X3JhdGUgPSBUeFJhdGVSZWMudHhfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQyOwotCQl9Ci0JCWlmKChvbGRfcmF0ZSA+IDApICYmKHJldHJ5X3JhdGU+TVRPUEFSQV9UWFJBVEVfREVDX1RIKCkpKSAgIC8vTWluIFJhdGUKLQkJewotCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlLTFdXTsKLQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJewotCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgLSAxOwotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIi0tLS0tLS0tXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDM7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSBpZihUeFJhdGVSZWMudHhfcmF0ZSA8IG9sZF9yYXRlKSAgLy9JbmNyZWFzZSBUeCBSYXRlCi0JewotCQlUeFRocm91cHV0MSA9IFJhdGVfUEVSX1RCTFtUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW1R4UmF0ZVJlYy50eF9yYXRlXV07Ci0JCVR4VGhyb3VwdXQyID0gUmF0ZV9QRVJfVEJMW3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtvbGRfcmF0ZV1dOwotCQlpZihUeFRocm91cHV0MSA+IFR4VGhyb3VwdXQyKQotCQl7Ci0JCQluZXdfcmF0ZSA9IFR4UmF0ZVJlYy50eF9yYXRlOwotCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluZXdfcmF0ZSA9IG9sZF9yYXRlOwotCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDI7Ci0JCX0KLQkJaWYgKChvbGRfcmF0ZSA8IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0gMSkmJihyZXRyeV9yYXRlPE1UT1BBUkFfVFhSQVRFX0lOQ19USCgpKSkKLQkJewotCQkJLy9UeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJaWYgKHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0gPiBNVE9QQVJBX1RYUkVUUllSQVRFX1JFRFVDRSgpKQotCQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0tTVRPUEFSQV9UWFJFVFJZUkFURV9SRURVQ0UoKV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCWVsc2UKLQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJaWYoQmVzdFRocm91cGh0IDwgVHhUaHJvdXB1dDMpCi0JCQl7Ci0JCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZSArIDE7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiKysrKysrKysrK1xuIikpOwotCQkJCSNlbmRpZgotCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgIC8vVHggUmF0ZSBubyBjaGFuZ2UKLQl7Ci0JCVR4VGhyb3VwdXQyID0gUmF0ZV9QRVJfVEJMW3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtvbGRfcmF0ZV1dOwotCQluZXdfcmF0ZSA9IG9sZF9yYXRlOwotCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MjsKLQotCQlpZiAocmV0cnlfcmF0ZSA8TVRPUEFSQV9UWFJBVEVfRVFfVEgoKSkgICAgLy90aCBmb3IgY2hhbmdlIGhpZ2hlciByYXRlCi0JCXsKLQkJCWlmKG9sZF9yYXRlIDwgTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgLSAxKQotCQkJewotCQkJCS8vVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCQlpZiAocmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXSA+IE1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCkpCi0JCQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0tTVRPUEFSQV9UWFJFVFJZUkFURV9SRURVQ0UoKV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCQllbHNlCi0JCQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQkJaWYoQmVzdFRocm91cGh0IDwgVHhUaHJvdXB1dDMpCi0JCQkJewotCQkJCQluZXdfcmF0ZSA9IG9sZF9yYXRlICsgMTsKLQkJCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDM7Ci0JCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJCVdCREVCVUcoKCI9KysrKysrKysrK1xuIikpOwotCQkJCQkjZW5kaWYKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQlpZihvbGRfcmF0ZSA+IDApICAgLy9NaW4gUmF0ZQotCQl7Ci0JCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlLTFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUtMV1dOwotCQkJaWYoQmVzdFRocm91cGh0IDwgVHhUaHJvdXB1dDMpCi0JCQl7Ci0JCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZSAtIDE7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiPS0tLS0tLS0tXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIUxPQ0FMX0lTX0lCU1NfTU9ERSgpKQotCXsKLQltYXhfcnNzaV9yYXRlID0gR2V0TWF4UmF0ZUxldmVsRnJvbVJTU0koKTsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbTVRPXTpSU1NJMlJhdGU9JWRcbiIsIE1UT19EYXRhX1JhdGVfVGJsW21heF9yc3NpX3JhdGVdKSk7Ci0JI2VuZGlmCi0JaWYobmV3X3JhdGUgPiBtYXhfcnNzaV9yYXRlKQotCQluZXdfcmF0ZSA9IG1heF9yc3NpX3JhdGU7Ci0JfQotCi0JLy9zYXZlIG5ldyByYXRlOwotCVR4UmF0ZVJlYy50eF9yYXRlID0gb2xkX3JhdGU7Ci0JVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGUgPSAodTgpIHJldHJ5X3JhdGU7Ci0JVHhSZXRyeVJhdGUgPSByZXRyeV9yYXRlOwotCXJldHVybiBuZXdfcmF0ZTsKLX0KLQotdm9pZCBTbW9vdGhSU1NJKHMzMiBuZXdfcnNzaSkKLXsKLQlSU1NJU21vb3RoZWQgPSBSU1NJU21vb3RoZWQgKyBuZXdfcnNzaSAtIFJTU0lCdWZbUlNTSUJ1ZkluZGV4XTsKLQlSU1NJQnVmW1JTU0lCdWZJbmRleF0gPSBuZXdfcnNzaTsKLQlSU1NJQnVmSW5kZXggPSAoUlNTSUJ1ZkluZGV4ICsgMSkgJSAxMDsKLX0KLQotdTggR2V0TWF4UmF0ZUxldmVsRnJvbVJTU0kodm9pZCkKLXsKLQl1OCBpOwotCXU4IFR4UmF0ZTsKLQotCWZvcihpPTA7aTxSU1NJMlJBVEVfU0laRTtpKyspCi0JewotCQlpZihSU1NJU21vb3RoZWQgPiBSU1NJMlJhdGVUYmxbaV0uUlNTSSkKLQkJCWJyZWFrOwotCX0KLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbTVRPXTpSU1NJPSVkXG4iLCBEaXZpZGUoUlNTSVNtb290aGVkLCAxMCkpKTsKLQkjZW5kaWYKLQlpZihpIDwgUlNTSTJSQVRFX1NJWkUpCi0JCVR4UmF0ZSA9IFJTU0kyUmF0ZVRibFtpXS5UeFJhdGU7Ci0JZWxzZQotCQlUeFJhdGUgPSAyOyAgLy9kaXZpZGVkIGJ5IDIgPSAxTWJwcwotCi0JZm9yKGk9TVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwtMTtpPjA7aS0tKQotCXsKLQkJaWYoVHhSYXRlID49TVRPX0RhdGFfUmF0ZV9UYmxbaV0pCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIGk7Ci19Ci0KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyAgRGVzY3JpcHRpb246CiAvLyAgICAgIElmIHdlIGVuYWJsZSBEVE8sIHdlIHdpbGwgaWdub3JlIHRoZSB0eCBjb3VudCB3aXRoIGRpZmZlcmVudCB0eCByYXRlIGZyb20KQEAgLTExOTQsMzYgKzI1MiwzIEBACiAJUGVyaW9kVG90YWxUeFBrdCArKzsKIAlQZXJpb2RUb3RhbFR4UGt0UmV0cnkgKz0gKGluZGV4KzEpOwogfQotCi11OCBNVE9fR2V0VHhGYWxsYmFja1JhdGUoTVRPX0ZVTkNfSU5QVVQpCi17Ci0JcmV0dXJuIE1UT19EQVRBX0ZBTExCQUNLX1JBVEUoKTsKLX0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIE1UT19UeEZhaWxlZCAtLQotLy8KLS8vICBEZXNjcmlwdGlvbjoKLS8vICAgIEZhaWx1cmUgb2YgdHJhbnNtaXR0aW5nIGEgcGFja2V0IGluZGljYXRlcyB0aGF0IGNlcnRhaW4gTVRPIHBhcm1ldGVycwotLy8gICAgbWF5IG5lZWQgdG8gYmUgYWRqdXN0ZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gTklDIGp1c3QgZmFpbGVkCi0vLyAgICB0byB0cmFuc21pdCBhIHBhY2tldCBvciB3aGVuIE1TRFVMaWZlVGltZSBleHBpcmVkLgotLy8KLS8vICBBcmd1bWVudHM6Ci0vLyAgICBBZGFwdGVyICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0vLwotLy8gIFJldHVybiBWYWx1ZToKLS8vICAgIE5vbmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBNVE9fVHhGYWlsZWQoTVRPX0ZVTkNfSU5QVVQpCi17Ci0JcmV0dXJuOwotfQotCi1pbnQgRGl2aWRlKGludCBhLCBpbnQgYikKLXsKLQlpZiAoYj09MCkgYj0xOwotCXJldHVybiBhL2I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uaAppbmRleCBmNDc5MzZmLi4wZDM3NzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uaApAQCAtMTEsNiArMTEsOCBAQAogI2lmbmRlZiBfX01UT19IX18KICNkZWZpbmUgX19NVE9fSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAjZGVmaW5lIE1UT19ERUZBVUxUX1RIX0NOVCAgICAgICAgICAgICAgNQogI2RlZmluZSBNVE9fREVGQVVMVF9USF9TUTMgICAgICAgICAgICAgIDExMiAgLy9PTEQgSVMgMTMgcmVmZXJlbmNlIEpvaG5YdQogI2RlZmluZSBNVE9fREVGQVVMVF9USF9JRExFX1NMT1QgICAgICAgIDE1CkBAIC0xMjksMTcgKzEzMSwxNyBAQAogfSBNVE9fUEFSQU1FVEVSUywgKlBNVE9fUEFSQU1FVEVSUzsKIAogCi0jZGVmaW5lIE1UT19GVU5DX0lOUFVUICAgICAgICAgICAgICBQV0IzMl9BREFQVEVSCUFkYXB0ZXIKLSNkZWZpbmUgTVRPX0ZVTkNfSU5QVVRfREFUQSAgICAgICAgIEFkYXB0ZXIKLSNkZWZpbmUgTVRPX0RBVEEoKSAgICAgICAgICAgICAgICAgIChBZGFwdGVyLT5zTXRvUGFyYSkKLSNkZWZpbmUgTVRPX0hBTCgpICAgICAgICAgICAgICAgICAgICgmQWRhcHRlci0+c0h3RGF0YSkKKyNkZWZpbmUgTVRPX0ZVTkNfSU5QVVQgICAgICAgICAgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqCWFkYXB0ZXIKKyNkZWZpbmUgTVRPX0ZVTkNfSU5QVVRfREFUQSAgICAgICAgIGFkYXB0ZXIKKyNkZWZpbmUgTVRPX0RBVEEoKSAgICAgICAgICAgICAgICAgIChhZGFwdGVyLT5zTXRvUGFyYSkKKyNkZWZpbmUgTVRPX0hBTCgpICAgICAgICAgICAgICAgICAgICgmYWRhcHRlci0+c0h3RGF0YSkKICNkZWZpbmUgTVRPX1NFVF9QUkVBTUJMRV9UWVBFKHgpICAgIC8vIDIwMDQwNTExIFR1cmJvIG1hcmsgTE1fUFJFQU1CTEVfVFlQRSgmcGNvcmVfZGF0YS0+bG1fZGF0YSkgPSAoeCkKLSNkZWZpbmUgTVRPX0VOQUJMRQkJCQkJKEFkYXB0ZXItPnNMb2NhbFBhcmEuVHhSYXRlTW9kZSA9PSBSQVRFX0FVVE8pCi0jZGVmaW5lIE1UT19UWFBPV0VSX0ZST01fRUVQUk9NCQkoQWRhcHRlci0+c0h3RGF0YS5Qb3dlckluZGV4RnJvbUVFUFJPTSkKLSNkZWZpbmUgTE9DQUxfQU5URU5OQV9OTygpCQkJKEFkYXB0ZXItPnNMb2NhbFBhcmEuYkFudGVubmFObykKLSNkZWZpbmUgTE9DQUxfSVNfQ09OTkVDVEVEKCkJCShBZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleCAhPSAwKQotI2RlZmluZSBMT0NBTF9JU19JQlNTX01PREUoKQkJKEFkYXB0ZXItPmFzQlNTRGVzY3JpcHRFbGVtZW50W0FkYXB0ZXItPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4XS5iQnNzVHlwZSA9PSBJQlNTX05FVCkKLSNkZWZpbmUgTVRPX0lOSVRUWFJBVEVfTU9ERQkJCShBZGFwdGVyLT5zSHdEYXRhLlNvZnR3YXJlU2V0JjB4MikJLy9iaXQgMQorI2RlZmluZSBNVE9fRU5BQkxFCQkJCQkoYWRhcHRlci0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID09IFJBVEVfQVVUTykKKyNkZWZpbmUgTVRPX1RYUE9XRVJfRlJPTV9FRVBST00JCShhZGFwdGVyLT5zSHdEYXRhLlBvd2VySW5kZXhGcm9tRUVQUk9NKQorI2RlZmluZSBMT0NBTF9BTlRFTk5BX05PKCkJCQkoYWRhcHRlci0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vKQorI2RlZmluZSBMT0NBTF9JU19DT05ORUNURUQoKQkJKGFkYXB0ZXItPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4ICE9IDApCisjZGVmaW5lIExPQ0FMX0lTX0lCU1NfTU9ERSgpCQkoYWRhcHRlci0+YXNCU1NEZXNjcmlwdEVsZW1lbnRbYWRhcHRlci0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXhdLmJCc3NUeXBlID09IElCU1NfTkVUKQorI2RlZmluZSBNVE9fSU5JVFRYUkFURV9NT0RFCQkJKGFkYXB0ZXItPnNId0RhdGEuU29mdHdhcmVTZXQmMHgyKQkvL2JpdCAxCiAvLyAyMDA0MDUxMCBUdXJibyBhZGQKICNkZWZpbmUgTVRPX1RNUl9DTlQoKSAgICAgICAgICAgICAgIE1UT19EQVRBKCkuVG1yQ250CiAjZGVmaW5lIE1UT19UT0dHTEVfU1RBVEUoKSAgICAgICAgICBNVE9fREFUQSgpLlRvZ2dsZVN0YXRlCkBAIC0xNTcsNyArMTU5LDcgQEAKICNkZWZpbmUgTVRPX1RNUl9QRVJJT0RJQygpICAgICAgICAgIE1UT19EQVRBKCkuVG1yX1BlcmlvZGljCiAKICNkZWZpbmUgTVRPX1BPV0VSX0NIQU5HRV9FTkFCTEUoKSAgIE1UT19EQVRBKCkuUG93ZXJDaGFuZ2VFbmFibGUKLSNkZWZpbmUgTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIEFkYXB0ZXItPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5CisjZGVmaW5lIE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpICBhZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eQogI2RlZmluZSBNVE9fQU5UX01BQygpICAgICAgICAgICAgICAgTVRPX0RBVEEoKS5BbnRfbWFjCiAjZGVmaW5lIE1UT19BTlRfRElWRVJTSVRZKCkgICAgICAgICBNVE9fREFUQSgpLkFudF9kaXYKICNkZWZpbmUgTVRPX0NDQV9NT0RFKCkgICAgICAgICAgICAgIE1UT19EQVRBKCkuQ0NBX01vZGUKQEAgLTE2Niw3ICsxNjgsNiBAQAogI2RlZmluZSBNVE9fUFJFQU1CTEVfQ0hBTkdFX0VOQUJMRSgpICAgICAgICAgTVRPX0RBVEEoKS5QcmVhbWJsZUNoYW5nZUVuYWJsZQogCiAjZGVmaW5lIE1UT19SQVRFX0xFVkVMKCkgICAgICAgICAgICBNVE9fREFUQSgpLkRhdGFSYXRlTGV2ZWwKLSNkZWZpbmUgTVRPX0ZBTExCQUNLX1JBVEVfTEVWRUwoKQlNVE9fREFUQSgpLkZhbGxiYWNrUmF0ZUxldmVsCiAjZGVmaW5lIE1UT19PRkRNX1JBVEVfTEVWRUwoKQkJTVRPX0RBVEEoKS5PZmRtUmF0ZUxldmVsCiAjZGVmaW5lIE1UT19SQVRFX0NIQU5HRV9FTkFCTEUoKSAgICBNVE9fREFUQSgpLkRhdGFSYXRlQ2hhbmdlRW5hYmxlCiAjZGVmaW5lIE1UT19GUkFHX1RIX0xFVkVMKCkgICAgICAgICBNVE9fREFUQSgpLkZyYWdUaHJlc2hvbGRMZXZlbApAQCAtMTk5LDExICsyMDAsOSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi1leHRlcm4gdTggICBNVE9fRGF0YV9SYXRlX1RibFtdOwogZXh0ZXJuIHUxNiAgTVRPX0ZyYWdfVGhfVGJsW107CiAKICNkZWZpbmUgTVRPX0RBVEFfUkFURSgpICAgICAgICAgIE1UT19EYXRhX1JhdGVfVGJsW01UT19SQVRFX0xFVkVMKCldCi0jZGVmaW5lIE1UT19EQVRBX0ZBTExCQUNLX1JBVEUoKSBNVE9fRGF0YV9SYXRlX1RibFtNVE9fRkFMTEJBQ0tfUkFURV9MRVZFTCgpXQkvL25leHQgbGV2ZWwKICNkZWZpbmUgTVRPX0ZSQUdfVEgoKSAgICAgICAgICAgIE1UT19GcmFnX1RoX1RibFtNVE9fRlJBR19USF9MRVZFTCgpXQogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG9fZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaAppbmRleCAzMGIzZGYyLi44MWY1OTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG9fZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210b19mLmgKQEAgLTEsNyArMSwxMyBAQAotZXh0ZXJuIHZvaWQgTVRPX0luaXQoUFdCMzJfQURBUFRFUik7Ci1leHRlcm4gdm9pZCBNVE9fUGVyaW9kaWNUaW1lckV4cGlyZWQoUFdCMzJfQURBUFRFUik7Ci1leHRlcm4gdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKFBXQjMyX0FEQVBURVIsIHU4ICosIHU4KTsKKyNpZm5kZWYgX19XSU5CT05EX01UT19GX0gKKyNkZWZpbmUgX19XSU5CT05EX01UT19GX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKworZXh0ZXJuIHZvaWQgTVRPX0luaXQoc3RydWN0IHdic29mdF9wcml2ICopOworZXh0ZXJuIHZvaWQgTVRPX1BlcmlvZGljVGltZXJFeHBpcmVkKHN0cnVjdCB3YnNvZnRfcHJpdiAqKTsKK2V4dGVybiB2b2lkIE1UT19TZXREVE9SYXRlUmFuZ2Uoc3RydWN0IHdic29mdF9wcml2ICosIHU4ICosIHU4KTsKIGV4dGVybiB1OCBNVE9fR2V0VHhSYXRlKE1UT19GVU5DX0lOUFVULCB1MzIgZnBkdV9sZW4pOwogZXh0ZXJuIHU4IE1UT19HZXRUeEZhbGxiYWNrUmF0ZShNVE9fRlVOQ19JTlBVVCk7CiBleHRlcm4gdm9pZCBNVE9fU2V0VHhDb3VudChNVE9fRlVOQ19JTlBVVCwgdTggdDAsIHU4IGluZGV4KTsKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL29zX2NvbW1vbi5oCmluZGV4IGUyNGZmNDEuLjJjMjc2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL29zX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL29zX2NvbW1vbi5oCkBAIC0xLDIgKzEsMiBAQAotI2luY2x1ZGUgImxpbnV4L3N5c2RlZi5oIgorI2luY2x1ZGUgInN5c2RlZi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5jCmluZGV4IDI3MmE2NTAuLjY3ODI1NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5jCkBAIC0xMiw2ICsxMiw3IEBACiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJvc19jb21tb24uaCIKICNpbmNsdWRlICJwaHlfY2FsaWJyYXRpb24uaCIKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKiBERUJVRyBDT05TVEFOVCBBTkQgTUFDUk8gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzEsNyArNDMyLDYgQEAKIAogCXZhbCB8PSBNQVNLX0FEQ19EQ19DQUxfU1RSOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCB2YWwpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7IC8vICpNVVNUKiB3YWl0IGZvciBhIHdoaWxlCiAKIAkvLyBlLiBUaGUgcmVzdWx0IGFyZSBzaG93biBpbiAiYWRjX2RjX2NhbF9pWzg6MF0gYW5kIGFkY19kY19jYWxfcVs4OjBdIgogI2lmZGVmIF9ERUJVRwpAQCAtNTIyLDcgKzUyMiw2IEBACiAJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwyfCgyPDwyKSk7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCAmcmVnX2RjX2NhbmNlbCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwpAQCAtNTM2LDcgKzUzNSw2IEBACiAJCXJlZ19kY19jYW5jZWwgJj0gfigweDAzRkYpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMiwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQyID0gMHglMDhYXG4iLCB2YWwpKTsKQEAgLTU1Miw3ICs1NTAsNiBAQAogCQlyZWdfZGNfY2FuY2VsIHw9ICgxIDw8IENBTkNFTF9EQ19JX1NISUZUKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDIsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMiA9IDB4JTA4WFxuIiwgdmFsKSk7CkBAIC02MDAsNyArNTk3LDYgQEAKIAlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0NBTElCX1NUQVJUOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTY1MSw3ICs2NDcsNiBAQAogCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8Myk7CiAJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCAmcmVnX2RjX2NhbmNlbCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwpAQCAtNjY1LDExICs2NjAsOSBAQAogCQlyZWdfZGNfY2FuY2VsICY9IH4oMHgwMDFGKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDIsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMiA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaXFjYWxfaW1hZ2VfaSA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQlpcWNhbF9pbWFnZV9xID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTY4MiwxMSArNjc1LDkgQEAKIAkJcmVnX2RjX2NhbmNlbCB8PSAoMSA8PCBDQU5DRUxfRENfUV9TSElGVCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWlxY2FsX2ltYWdlX2kgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfaW1hZ2VfcSA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC03MzIsNyArNzIzLDYgQEAKIAlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0NBTElCX1NUQVJUOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiB9CiAKIC8vMjAwNjA2MTIuMS5hIDIwMDYwNzE4LjEgTW9kaWZ5CkBAIC03OTIsMTIgKzc4MiwxMCBAQAogCQkJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwweDAyfDI8PDIpOwogCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCS8vIGIuCiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCWlxY2FsX3RvbmVfaTAgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJCWlxY2FsX3RvbmVfcTAgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtODEzLDcgKzgwMSw2IEBACiAJCQlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0NBTElCX1NUQVJUOwogCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCS8vIGQuIFNldCBpcWNhbF9tb2RlWzE6MF0gdG8gMHgzIGFuZCBzZXQgImNhbGliX3N0YXJ0IiB0byAweDEgdG8KIAkJCS8vICAgIGVuYWJsZSAiSVEgYWxpYnJhdGlvbiBNb2RlIElJIgpAQCAtODIzLDEyICs4MTAsMTAgQEAKIAkJCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MHgwMyk7CiAJCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQkJLy8gZS4KIAkJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDEgPSAweCUwOFhcbiIsIHZhbCkpOwotCQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQkJaXFjYWxfdG9uZV9pID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCQlpcWNhbF90b25lX3EgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtMTA3NSw3ICsxMDYwLDcgQEAKIAkvLzsgW0JCLWNoaXBdOiBDYWxpYnJhdGlvbiAoNmgpLiBDYWN1bGF0ZSBUWC1wYXRoIElRIGltYmFsYW5jZSBhbmQgc2V0dGluZyBUWCBwYXRoIElRIGNvbXBlbnNhdGlvbiB0YWJsZQogCS8vcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAzLCAoMzw8MjQpfDB4MDI1NTg2KTsKIAotCU9TX1NMRUVQKDMwMDAwKTsgLy8gMjAwNjA2MTIuMS5hIDMwbXMgZGVsYXkuIEFkZCB0aGUgZm9sbG93IDIgbGluZXMKKwltc2xlZXAoMzApOyAvLyAyMDA2MDYxMi4xLmEgMzBtcyBkZWxheS4gQWRkIHRoZSBmb2xsb3cgMiBsaW5lcwogCS8vVG8gYWRqdXN0IFRYVkdBIHRvIGZpdCBpcV9tYWdfMCByYW5nZSBmcm9tIDEyNTAgfiAxNzUwCiAJYWRqdXN0X1RYVkdBX2Zvcl9pcV9tYWcoIHBod19kYXRhICk7CiAKQEAgLTEyODIsMTMgKzEyNjcsMTEgQEAKIAkJaWYoICFod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCkgKS8vMjAwNjA3MTguMSBtb2RpZnkKIAkJCXJldHVybiAwOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCXJlZ19tb2RlX2N0cmwgJj0gfk1BU0tfSVFDQUxfTU9ERTsKIAkJcmVnX21vZGVfY3RybCB8PSAoTUFTS19DQUxJQl9TVEFSVHwweDEpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7ICAvL1Nob3VsZCBiZSByZWFkIG91dCBhZnRlciA0NTB1cwogCiAJCS8vIGMuCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwpAQCAtMTY5NywxMSArMTY4MCwxMCBAQAogCQlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICgoNTw8MjQpfGN1cnJlbnRfdHh2Z2EpICk7CiAJCXBod19kYXRhLT50eHZnYV9zZXR0aW5nX2Zvcl9jYWwgPSBjdXJyZW50X3R4dmdhOwogCi0JCS8vcGFfc3RhbGxfZXhlY3V0aW9uKDMwMDAwKTsvL1NsZWVwKDMwKTsKLQkJT1NfU0xFRVAoMzAwMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJbXNsZWVwKDMwKTsgLy8gMjAwNjA2MTIuMS5hCiAKIAkJaWYoICFod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgJnJlZ19tb2RlX2N0cmwpICkgLy8gMjAwNjA3MTguMSBtb2RpZnkKLQkJCXJldHVybiBGQUxTRTsKKwkJCXJldHVybiBmYWxzZTsKIAogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHJlYWQpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7CiAKQEAgLTE3MTQsMTkgKzE2OTYsMTUgQEAKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCi0JCS8vcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKLQkJT1NfU0xFRVAoMSk7IC8vIDIwMDYwNjEyLjEuYQorCQl1ZGVsYXkoMSk7IC8vIDIwMDYwNjEyLjEuYQogCi0JCS8vcGFfc3RhbGxfZXhlY3V0aW9uKDMwMCk7Ly9TbGVlcCgzMCk7Ci0JCU9TX1NMRUVQKDMwMCk7IC8vIDIwMDYwNjEyLjEuYQorCQl1ZGVsYXkoMzAwKTsgLy8gMjAwNjA2MTIuMS5hCiAKIAkJLy8gYi4KIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDEgPSAweCUwOFhcbiIsIHZhbCkpOwotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbihVUyk7Ci0JCS8vcGFfc3RhbGxfZXhlY3V0aW9uKDMwMCk7Ly9TbGVlcCgzMCk7Ci0JCU9TX1NMRUVQKDMwMCk7IC8vIDIwMDYwNjEyLjEuYQorCQl1ZGVsYXkoMzAwKTsgLy8gMjAwNjA2MTIuMS5hCiAKIAkJaXFjYWxfdG9uZV9pMCA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQlpcWNhbF90b25lX3EwID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTE3NTAsOSArMTcyOCw5IEBACiAJfQogCiAJaWYoIGlxX21hZ18wX3R4Pj03MDAgJiYgaXFfbWFnXzBfdHg8PTE3NTAgKQotCQlyZXR1cm4gVFJVRTsKKwkJcmV0dXJuIHRydWU7CiAJZWxzZQotCQlyZXR1cm4gRkFMU0U7CisJCXJldHVybiBmYWxzZTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCmluZGV4IGI2YTY1ZDMuLjAzYjgyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCkBAIC0xLDMgKzEsOCBAQAorI2lmbmRlZiBfX1dJTkJPTkRfUEhZX0NBTElCUkFUSU9OX0gKKyNkZWZpbmUgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICisKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCisKIC8vIDIwMDMxMjI5IFR1cmJvIGFkZAogI2RlZmluZSBSRUdfQUdDX0NUUkwxICAgICAgICAgICAgICAgMHgxMDAwCiAjZGVmaW5lIFJFR19BR0NfQ1RSTDIgICAgICAgICAgICAgICAweDEwMDQKQEAgLTk5LDMgKzEwNCw0IEBACiB2b2lkIHBoeV9zZXRfcmZfZGF0YSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBpbmRleCwgIHUzMiB2YWx1ZSApOwogI2RlZmluZSBwaHlfaW5pdF9yZiggX0EgKQkvL1JGU3ludGhlc2l6ZXJfaW5pdGlhbCggX0EgKQogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcmVnLmMKaW5kZXggNTdhZjViOC4uY2QyMTI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcmVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcmVnLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIE9yaWdpbmFsIFBoeS5oCkBAIC05NzYsOSArOTc3LDkgQEAKIAogCQkvLyAyMDA2MDUxMS4xIEZpeCB0aGUgZm9sbG93aW5nIDQgc3RlcHMgZm9yIFJ4IG9mIFJGIDIyMzAgaW5pdGlhbCBmYWlsCiAJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4ODAgKTsvLyByZWd1bGF0b3Igb24gb25seQotCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweGI4ICk7Ly8gUkVHX09OIFJGX1JTVE4gb24sIGFuZAotCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCiAJCWx0bXAgPSAweDQ5Njg7CiAJCWlmKCAocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyKSB8fApAQCAtOTg4LDEyICs5ODksMTIgQEAKIAogCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweGEwICk7Ly8gUExMX1BEIFJFRl9QRCBzZXQgdG8gMAogCi0JCU9TX1NMRUVQKDIwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQltc2xlZXAoMjApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAJCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNkMCwgJmx0bXAgKTsKIAkJbG9vcCA9IDUwMDsgLy8gV2FpdCBmb3IgNSBzZWNvbmQgMjAwNjExMDEKIAkJd2hpbGUoICEobHRtcCAmIDB4MjApICYmIGxvb3AtLSApCiAJCXsKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCQkJaWYoICFXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzZDAsICZsdG1wICkgKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMDAyLDcgKzEwMDMsNyBAQAogCX0KIAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjAsIDEgKTsvLyBSZXNldCBoYXJkd2FyZSBmaXJzdAotCU9TX1NMRUVQKDEwMDAwKTsgLy8gQWRkIHRoaXMgMjAwNTEyMjEuMS5iCisJbXNsZWVwKDEwKTsgLy8gQWRkIHRoaXMgMjAwNTEyMjEuMS5iCiAKIAkvLyBTZXQgYnVyc3Qgd3JpdGUgZGVsYXkKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Y4LCAweDdmZiApOwpAQCAtMTE2NywyMyArMTE2OCwyMyBAQAogCQkJLy8gMjAwNjA1MTEuMSAtLS0gTW9kaWZ5aW5nIHRoZSBmb2xsb3cgc3RlcCBmb3IgUnggaXNzdWUtLS0tLS0tLS0tLS0tLS0tLQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwNzw8MjApfDB4RTE2OEUsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDEwMDAwKTsKKwkJCW1zbGVlcCgxMCk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoIGFsMjIzMF9yZl9kYXRhWzddLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgxMDAwMCk7CisJCQltc2xlZXAoMTApOwogCiAJCWNhc2UgUkZfQUlST0hBXzIyMzBTOiAvLyAyMDA2MDQyMCBBZGQgdGhpcwogCiAJCQkvLyAyMDA2MDUxMS4xIC0tLSBNb2RpZnlpbmcgdGhlIGZvbGxvdyBzdGVwIGZvciBSeCBpc3N1ZS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweDgwICk7Ly8gcmVndWxhdG9yIG9uIG9ubHkKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweGEwICk7Ly8gUExMX1BEIFJFRl9QRCBzZXQgdG8gMAotCQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCQltc2xlZXAoMTApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCiAKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZDQsIDB4ZTAgKTsvLyBNTEtfRU4KIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjAsIDEgKTsvLyBSZXNldCBoYXJkd2FyZSBmaXJzdAotCQkJT1NfU0xFRVAoMTAwMDApOyAvLyBBZGQgdGhpcyAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgogCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCQkJLy8gVGhlIGZvbGxvdyBjb2RlIGRvZXNuJ3QgdXNlIHRoZSBidXJzdC13cml0ZSBtb2RlCkBAIC0xMTkxLDMwICsxMTkyLDMwIEBACiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUEwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CiAKLQkJCWx0bXAgPSBwSHdEYXRhLT5XYjM1UmVnLkJCNUMgJiAweGZmZmZmMDAwOworCQkJbHRtcCA9IHBId0RhdGEtPnJlZy5CQjVDICYgMHhmZmZmZjAwMDsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIGx0bXAgKTsKLQkJCXBId0RhdGEtPldiMzVSZWcuQkI1MCB8PSAweDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsvLzIwMDYwMzE1LjEgbW9kaWZ5Ci0gICAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5XYjM1UmVnLkJCNTApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQlwSHdEYXRhLT5yZWcuQkI1MCB8PSAweDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsvLzIwMDYwMzE1LjEgbW9kaWZ5CisJICAgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5yZWcuQkI1MCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAweDBGLCAoMHgwRjw8MjApIHwgMHhGMDFCMCk7IC8vQWN0aXZhdGUgRmlsdGVyIENhbC4KIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDIwKSB8IDB4RjAxQjAsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMHgwRiwgKDB4MEY8PDIwKSB8IDB4RjAxZTApOyAvL0FjdGl2YXRlIFRYIERDQwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjApIHwgMHhGMDFFMCwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAweDBGLCAoMHgwRjw8MjApIHwgMHhGMDFBMCk7IC8vUmVzb3RyZSBJbml0aWFsIFNldHRpbmcKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDIwKSB8IDB4RjAxQTAsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKIAogLy8JCQkvL0ZvcmNlIFRYSShRKVAoTikgdG8gbm9ybWFsIGNvbnRyb2wKLQkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIHBId0RhdGEtPldiMzVSZWcuQkI1QyApOwotCQkJcEh3RGF0YS0+V2IzNVJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsKLSAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPldiMzVSZWcuQkI1MCk7CisJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5yZWcuQkI1QyApOworCQkJcEh3RGF0YS0+cmVnLkJCNTAgJj0gfjB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOworICAgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBSRl9BSVJPSEFfNzIzMDoKQEAgLTEyMjksMTYgKzEyMzAsMTYgQEAKIAkJCS8vMi40R0h6CiAJCQkvL2x0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgxQUJBOEY7CiAJCQkvL1diMzVSZWdfV3JpdGVTeW5jIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJLy9PU19TTEVFUCgxMDAwKTsgLy8gU2xlZXAgMSBtcworCQkJLy9tc2xlZXAoMSk7IC8vIFNsZWVwIDEgbXMKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHg5QUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgzQUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgxQUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy81R0h6CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDAwICk7CkBAIC0xMjUxLDcgKzEyNTIsNyBAQAogCQkJLy8gV3JpdGUgdG8gcmVnaXN0ZXIuIG51bWJlciBtdXN0IGxlc3MgYW5kIGVxdWFsIHRoYW4gMTYKIAkJCWZvciggaT0wOyBpPG51bWJlcjsgaSsrICkKIAkJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBwbHRtcFtpXSApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwODAgKTsKIAkJCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KQEAgLTEyNjIsMTMgKzEyNjMsMTMgQEAKIAkJCS8vV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDlBQkE4RjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDNBQkE4RjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDEyQkFDRjsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL1diMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwODAgKTsKIAkJCS8vV0JERUJVRygoIiogUExMX09OICAgIGhpZ2hcbiIpKTsKQEAgLTEyODAsMjEgKzEyODEsMjEgQEAKIAkJCS8vCiAJCQkvLyA7IFZlcnNpb24gMS4zQiByZXZpc2lvbiBpdGVtczogZm9yIEZBNTk3NkEgLCBPY3RvYmVyIDMsIDIwMDUgYnkgSFRIbwogCQkJLy8KLQkJCWx0bXAgPSBwSHdEYXRhLT5XYjM1UmVnLkJCNUMgJiAweGZmZmZmMDAwOworCQkJbHRtcCA9IHBId0RhdGEtPnJlZy5CQjVDICYgMHhmZmZmZjAwMDsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIGx0bXAgKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTgsIDAgKTsKLQkJCXBId0RhdGEtPldiMzVSZWcuQkI1MCB8PSAweDM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOy8vMjAwNjA2MzAKLQkgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKKwkJCXBId0RhdGEtPnJlZy5CQjUwIHw9IDB4MzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDYzMAorCQkgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5yZWcuQkI1MCk7CiAKIAkJCS8vLS0tLS0gQ2FsaWJyYXRpb24gKDEpLiBWQ08gZnJlcXVlbmN5IGNhbGlicmF0aW9uCiAJCQkvL0NhbGlicmF0aW9uICgxYS4wKS4gU3ludGhlc2l6ZXIgcmVzZXQgKEhUSG8gY29ycmVjdGVkIDIwMDUvMDUvMTApCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyNCkgfCAweDAwMTAxRSwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDUwMDAgKTsgLy8gU2xlZXAgNW1zCisJCQltc2xlZXAoNSk7IC8vIFNsZWVwIDVtcwogCQkJLy9DYWxpYnJhdGlvbiAoMWEpLiBWQ08gZnJlcXVlbmN5IGNhbGlicmF0aW9uIG1vZGUgOyB3YWl0aW5nIDJtc2VjIFZDTyBjYWxpYnJhdGlvbiB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZFNjljMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDIwMDAgKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCiAJCQkvLy0tLS0tIENhbGlicmF0aW9uICgyKS4gVFggYmFzZWJhbmQgR20tQyBmaWx0ZXIgYXV0by10dW5pbmcKIAkJCS8vQ2FsaWJyYXRpb24gKDJhKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCkBAIC0xMzA5LDcgKzEzMTAsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoMmMpLiB0dXJuLW9uIFRYIEdtLUMgZmlsdGVyIGF1dG8tdHVuaW5nCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZDRUJDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDE1MCApOyAvLyBTbGVlcCAxNTAgdXMKKwkJCXVkZWxheSgxNTApOyAvLyBTbGVlcCAxNTAgdXMKIAkJCS8vdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEY4RUJDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTMyNyw3ICsxMzI4LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDNjKS4gdHVybi1vbiBSWCBHbS1DIGZpbHRlciBhdXRvLXR1bmluZwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAxNTAgKTsgLy8gU2xlZXAgMTUwIHVzCisJCQl1ZGVsYXkoMTUwKTsgLy8gU2xlZXAgMTUwIHVzCiAJCQkvL0NhbGlicmF0aW9uICgzZSkuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzMzYsNyArMTMzNyw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg0YSkuIFRYIExPIGxlYWthZ2UgY2FsaWJyYXRpb24KIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkQ2QkMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggMTUwICk7IC8vIFNsZWVwIDE1MCB1cworCQkJdWRlbGF5KDE1MCk7IC8vIFNsZWVwIDE1MCB1cwogCiAJCQkvLy0tLS0tIENhbGlicmF0aW9uICg1KS4gUlggREMgb2Zmc2V0IGNhbGlicmF0aW9uCiAJCQkvL0NhbGlicmF0aW9uICg1YSkuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbCBhbmQgc2V0IHRvIFJYIFNXIERDIGNhbGlyYXRpb24gbW9kZQpAQCAtMTM1Myw3ICsxMzU0LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDVkKS4gdHVybiBvbiBSWCBEQyBvZmZzZXQgY2FsIGZ1bmN0aW9uOyBhbmQgd2FpdGluZyAyIG1zZWMgY2FsIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkY2REMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgyMDAwKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCQkJLy9DYWxpYnJhdGlvbiAoNWYpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzY1LDcgKzEzNjYsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNWQpLiB0dXJuIG9uIFJYIERDIG9mZnNldCBjYWwgZnVuY3Rpb247IGFuZCB3YWl0aW5nIDIgbXNlYyBjYWwgdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRjZEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDIwMDApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAJCQkvL0NhbGlicmF0aW9uICg1ZikuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzNzcsNyArMTM3OCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM4OSw3ICsxMzkwLDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDVkKS4gdHVybiBvbiBSWCBEQyBvZmZzZXQgY2FsIGZ1bmN0aW9uOyBhbmQgd2FpdGluZyAyIG1zZWMgY2FsIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkY2REMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgyMDAwKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCQkJLy9DYWxpYnJhdGlvbiAoNWYpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzk5LDMwICsxNDAwLDMwIEBACiAKIAkJCS8vOyAtLS0tLSBDYWxpYnJhdGlvbiAoNykuIFN3aXRjaCBSRiBjaGlwIHRvIG5vcm1hbCBtb2RlCiAJCQkvLzB4MDAgMHhGODYxMDAgOyAzRTE4NCAgIDsgU3dpdGNoIFJGIGNoaXAgdG8gbm9ybWFsIG1vZGUKLS8vCQkJT1NfU0xFRVAoMTAwMDApOyAvLyBAQCAyMDA2MDcyMQorLy8JCQltc2xlZXAoMTApOyAvLyBAQCAyMDA2MDcyMQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGODYxMDAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOyAvLyBTbGVlcCA1IG1zCisJCQltc2xlZXAoNSk7IC8vIFNsZWVwIDUgbXMKIAogLy8JCQkvL3dyaXRlIGJhY2sKLS8vCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgcEh3RGF0YS0+V2IzNVJlZy5CQjVDICk7Ci0vLwkJCXBId0RhdGEtPldiMzVSZWcuQkI1MCAmPSB+MHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7IC8vIDIwMDYwMzE1LjEgZml4Ci0vLyAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5XYjM1UmVnLkJCNTApOwotLy8JCQlPU19TTEVFUCgxMDAwKTsgLy8gU2xlZXAgMSBtcworLy8JCQlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDEwNWMsIHBId0RhdGEtPnJlZy5CQjVDKTsKKy8vCQkJcEh3RGF0YS0+cmVnLkJCNTAgJj0gfjB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOyAvLyAyMDA2MDMxNS4xIGZpeAorLy8JCSAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPnJlZy5CQjUwKTsKKy8vCQkJbXNsZWVwKDEpOyAvLyBTbGVlcCAxIG1zCiAJCQlicmVhazsKIAl9CiB9CiAKIHZvaWQgQkJQcm9jZXNzb3JfQUw3MjMwXzI0MDAoICBwaHdfZGF0YV90IHBId0RhdGEpCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCXBsdG1wWzEyXTsKIAogCXBsdG1wWzBdID0gMHgxNkE4MzM3QTsgLy8gMHgxNmE1MjE1ZjsgLy8gMHgxMDAwIEFHQ19DdHJsMQogCXBsdG1wWzFdID0gMHg5QUZGOUFBNjsgLy8gMHg5YWZmOWNhNjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCXBsdG1wWzNdID0gMHhGRkY3MjAzMTsgLy8gMHhGZkZmMjEzODsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCXBXYjM1UmVnLT5CQjBDID0gMHhGRkY3MjAzMTsKKwlyZWctPkJCMEMgPSAweEZGRjcyMDMxOwogCXBsdG1wWzRdID0gMHgwRmFjRENDNTsgLy8gMHgxMDEwIEFHQ19DdHJsNSAvLyAyMDA1MDkyNyAweDBGYWNEQ0I3CiAJcGx0bXBbNV0gPSAweDAwQ0FBMzMzOyAvLyAweDAwZWFhMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJcGx0bXBbNl0gPSAweEYyMjExMTExOyAvLyAweDExMTExMTExOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNDMxLDI1ICsxNDMyLDI1IEBACiAJcGx0bXBbOV0gPSAweEE4MDAyQTc5OyAvLyAweGE5MDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCXBsdG1wWzEwXSA9IDB4NDAwMDA1Mjg7IC8vIDIwMDUwOTI3IDB4NDAwMDAyMjgKIAlwbHRtcFsxMV0gPSAweDIzMkQ3RjMwOyAvLyAweDIzNDU3ZjMwOy8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JcFdiMzVSZWctPkJCMkMgPSAweDIzMkQ3RjMwOworCXJlZy0+QkIyQyA9IDB4MjMyRDdGMzA7CiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCXBsdG1wWzBdID0gMHgwMDAwMmM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJjNTQ7CisJcmVnLT5CQjMwID0gMHgwMDAwMmM1NDsKIAlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNl0gPSAweDAwMzMyQzFCOyAvLyAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCXBsdG1wWzddID0gMHgwQTAwRkVGRjsgLy8gMHgwRTAwRkVGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs4XSA9IDB4MkIxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQlwV2IzNVJlZy0+QkI1MCA9IDB4MkIxMDYyMDg7CisJcmVnLT5CQjUwID0gMHgyQjEwNjIwODsKIAlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCXBsdG1wWzEwXSA9IDB4NTI1MjQyNDI7IC8vIDB4NjQ2NDUyNTI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKKwlyZWctPkJCNTggPSAweDUyNTI0MjQyOwogCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNDU3LDE0ICsxNDU4LDE0IEBACiAKIHZvaWQgQkJQcm9jZXNzb3JfQUw3MjMwXzUwMDAoICBwaHdfZGF0YV90IHBId0RhdGEpCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCXBsdG1wWzEyXTsKIAogCXBsdG1wWzBdID0gMHgxNkFBNjY3ODsgLy8gMHgxMDAwIEFHQ19DdHJsMQogCXBsdG1wWzFdID0gMHg5QUZGQTBCMjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCXBsdG1wWzNdID0gMHhFRkZGMjMzRTsgLy8gMHgxMDBjIEFHQ19DdHJsNAotCXBXYjM1UmVnLT5CQjBDID0gMHhFRkZGMjMzRTsKKwlyZWctPkJCMEMgPSAweEVGRkYyMzNFOwogCXBsdG1wWzRdID0gMHgwRmFjRENDNTsgLy8gMHgxMDEwIEFHQ19DdHJsNSAvLyAyMDA1MDkyNyAweDBGYWNEQ0I3CiAJcGx0bXBbNV0gPSAweDAwQ0FBMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJcGx0bXBbNl0gPSAweEYyNDMyMTExOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNDczLDI0ICsxNDc0LDI0IEBACiAJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCXBsdG1wWzEwXSA9IDB4NDAwMDA1Mjg7IC8vIDIwMDUwOTI3IDB4NDAwMDAyMjgKIAlwbHRtcFsxMV0gPSAweDIzMkZERjMwOy8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JcFdiMzVSZWctPkJCMkMgPSAweDIzMkZERjMwOworCXJlZy0+QkIyQyA9IDB4MjMyRkRGMzA7CiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCXBsdG1wWzBdID0gMHg4MDAwMkM3QzsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKIAlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNl0gPSAweDAwMzMyQzFCOyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCXBsdG1wWzddID0gMHgwQTAwRkVGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs4XSA9IDB4MkIxMDcyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQlwV2IzNVJlZy0+QkI1MCA9IDB4MkIxMDcyMDg7CisJcmVnLT5CQjUwID0gMHgyQjEwNzIwODsKIAlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCXBsdG1wWzEwXSA9IDB4NTI1MjQyNDI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKKwlyZWctPkJCNTggPSAweDUyNTI0MjQyOwogCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNTExLDcgKzE1MTIsNyBAQAogdm9pZAogQkJQcm9jZXNzb3JfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAJdTMyCWksIHBsdG1wWzEyXTsKIAogICAgIHN3aXRjaCggcEh3RGF0YS0+cGh5X3R5cGUgKQpAQCAtMTUyMiw3ICsxNTIzLDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5QUZGQUVBNDsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1RDAwQTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RUZGRjFBMzQ7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhFRkZGMUEzNDsKKwkJCXJlZy0+QkIwQyA9IDB4RUZGRjFBMzQ7CiAJCQlwbHRtcFs0XSA9IDB4MEZBQkUwQjc7IC8vIDB4MTAxMCBBR0NfQ3RybDUKIAkJCXBsdG1wWzVdID0gMHgwMENBQTMzMjsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCQkJcGx0bXBbNl0gPSAweEY2NjMyMTExOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNTMxLDI1ICsxNTMyLDI1IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAocEh3RGF0YS0+cGh5X3R5cGU9PTMpID8gMHg0MDAwMGEyOCA6IDB4NDAwMDAyMjg7IC8vIDB4MTAyOCBNQVhJTV8zMzEoYjMxPTApICsgV0JSRl9WMShiMTE9MSkgOiBNQVhJTV8zMzEoYjMxPTApICsgV0JSRl9WMihiMTE9MCkKIAkJCXBsdG1wWzExXSA9IDB4MjMyRkRGMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyRkRGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMkZERjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUI2Qzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzddID0gMHgwRTAwRkVGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwODsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjA4OworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwODsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg2NDY0NjQ2NDsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CisJCQlyZWctPkJCNTggPSAweDY0NjQ2NDY0OwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTU2OCw3ICsxNTY5LDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWVhNDsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4ZWZmZjFhMzQ7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhlZmZmMWEzNDsKKwkJCXJlZy0+QkIwQyA9IDB4ZWZmZjFhMzQ7CiAJCQlwbHRtcFs0XSA9IDB4MGZhYmUwYjc7IC8vIDB4MTAxMCBBR0NfQ3RybDUKIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMjsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCQkJcGx0bXBbNl0gPSAweGY2NjMyMTExOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNTc3LDI1ICsxNTc4LDI1IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAweDQwMDAwMTI4OyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFsxMV0gPSAweDIzMmZkZjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMmZkZjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCNkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs3XSA9IDB4MEQwMEZERkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwODsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NjQ2NDY0NjQ7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ2NDY0OworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKIAkJCXBsdG1wWzExXSA9IDB4QUEyOEMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE2MDgsNyArMTYwOSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFlYTQ7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweGY0ZmYxNjMyOyAvLyAweGVmZmYxYTM0OyAvLyAweDEwMGMgQUdDX0N0cmw0IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhmNGZmMTYzMjsgLy8gMHhlZmZmMWEzNDsgTW9kaWZ5IGZvciAzMydzIDEuMC45NQorCQkJcmVnLT5CQjBDID0gMHhmNGZmMTYzMjsgLy8gMHhlZmZmMWEzNDsgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbNF0gPSAweDBmYWJlMGI3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzI7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhmODYzMjExMjsgLy8gMHhmNjYzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CkBAIC0xNjE3LDI1ICsxNjE4LDI1IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAweDQwMDAwMTI4OyBtb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFsxMV0gPSAweDIzMmZkZjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMmZkZjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDViMmM4NzY5OyAvLyAweDVCNkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gMHgwMDJjMjYxNzsgLy8gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbN10gPSAweDA4MDBmZWZmOyAvLyAweDBEMDBGREZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlciBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1CiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwODsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NjQ2NDRhNGE7IC8vIDB4NjQ2NDY0NjQ7IC8vIDB4MTA1OCBJUV9BbHBoYSBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Ci0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CisJCQlyZWctPkJCNTggPSAweDY0NjQ2NDY0OwogCQkJcGx0bXBbMTFdID0gMHhBQTI4QzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTY0OCw3ICsxNjQ5LDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWZiMjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RkZGZDIwM2M7IC8vIDB4RkZGYjIwM2E7IC8vIDB4MTAwYyBBR0NfQ3RybDQgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgotCQkJcFdiMzVSZWctPkJCMEMgPSAweEZGRmQyMDNjOworCQkJcmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKIAkJCXBsdG1wWzRdID0gMFgwRkJGRENjNTsgLy8gMFgwRkJGRENBMDsgLy8gMHgxMDEwIEFHQ19DdHJsNSAvLzB4MEZCMkUwQjcgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDAwY2FhMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzZdID0gMFhGNjYzMjExMTsgLy8gMFhGMTYzMjExMjsgLy8gMHgxMDE4IEFHQ19DdHJsNwkJLy8weGY2NjMyMTEyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KQEAgLTE2NTcsMjcgKzE2NTgsMjcgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDBYNDAwMDA1Mjg7CQkJCQkJCS8vMHg0MDAwMDIyOAogCQkJcGx0bXBbMTFdID0gMHgyMzJkZkYzMDsgLy8gMHgyMzJBOUYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwJLy8weDIzMmE5NzMwCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyZGZGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAkvLzB4NUI2Qzg3NjkKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKIAkJCXBsdG1wWzddID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgorCQkJcmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjAwOyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjAwOwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDUyNTI0MjQyOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKKwkJCXJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNjkwLDcgKzE2OTEsNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZmIyOyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhGRkZkMjAzYzsgLy8gMHhGRkZiMjAzYTsgLy8gMHgxMDBjIEFHQ19DdHJsNCBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCi0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RkZGZDIwM2M7CisJCQlyZWctPkJCMEMgPSAweEZGRmQyMDNjOwogCQkJcGx0bXBbNF0gPSAwWDBGQkZEQ2M1OyAvLyAwWDBGQkZEQ0EwOyAvLyAweDEwMTAgQUdDX0N0cmw1IC8vMHgwRkIyRTBCNyBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzI7IC8vIDB4MDBjYWEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgogCQkJcGx0bXBbNl0gPSAwWEY2NjMyMTExOyAvLyAwWEYxNjMyMTEyOyAvLyAweDEwMTggQUdDX0N0cmw3CQkvLzB4ZjY2MzIxMTIgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgpAQCAtMTY5OSwyNyArMTcwMCwyNyBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMFg0MDAwMDUyODsJCQkJCQkJLy8weDQwMDAwMjI4CiAJCQlwbHRtcFsxMV0gPSAweDIzMmRmRjMwOyAvLyAweDIzMkE5RjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAkvLzB4MjMyYTk3MzAKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJkZkYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZGZGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCS8vMHg1QjZDODc2OQogCQkJcGx0bXBbM10gPSAweDAwMDAwMDAwOyAvLyAweDEwM2MgMTFhIFRYIExTIGZpbHRlcgotCQkJcFdiMzVSZWctPkJCM0MgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDUxMjIxIGNoMTQgMjAwNjA2MTMuMgorCQkJcmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDUxMjIxIGNoMTQgMjAwNjA2MTMuMgogCQkJcGx0bXBbN10gPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNjA2MTMuMQorCQkJcmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDYwNjEzLjEKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwMDsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjAwOworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg1MjUyMzIzMjsgLy8gMjAwNjA0MTkgMHg1MjUyNDI0MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjMyMzI7IC8vIDIwMDYwNDE5IDB4NTI1MjQyNDI7CisJCQlyZWctPkJCNTggPSAweDUyNTIzMjMyOyAvLyAyMDA2MDQxOSAweDUyNTI0MjQyOwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTczMiw3ICsxNzMzLDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWZiMjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RkZGYjIwM2E7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQkJCXBXYjM1UmVnLT5CQjBjID0gMHhGRkZiMjAzYTsKKwkJCXJlZy0+QkIwYyA9IDB4RkZGYjIwM2E7CiAJCQlwbHRtcFs0XSA9IDB4MEZCRkRDQjc7IC8vIDB4MTAxMCBBR0NfQ3RybDUKIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCQkJcGx0bXBbNl0gPSAweGY2NjMyMTEyOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNzQxLDI1ICsxNzQyLDI1IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAweDQwMDAwMjI4OwogCQkJcGx0bXBbMTFdID0gMHgyMzJBOUYzMDsvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMmMgPSAweDIzMkE5RjMwOworCQkJcmVnLT5CQjJjID0gMHgyMzJBOUYzMDsKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNjID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzYyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs3XSA9IDB4MEUwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDA7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NjQ2NDUyNTI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ1MjUyOworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NTI1MjsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAqLwpAQCAtMTc3NSw3ICsxNzc2LDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5QUZGOUFCQTsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1RDAwQTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RUVFOTFDMzI7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhFRUU5MUMzMjsKKwkJCXJlZy0+QkIwQyA9IDB4RUVFOTFDMzI7CiAJCQlwbHRtcFs0XSA9IDB4MEZBQ0RDQzU7IC8vIDB4MTAxMCBBR0NfQ3RybDUKIAkJCXBsdG1wWzVdID0gMHgwMDBBQTM0NDsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCQkJcGx0bXBbNl0gPSAweDIyMjIyMjIxOyAvLyAweDEwMTggQUdDX0N0cmw3CkBAIC0xNzg0LDI3ICsxNzg1LDI3IEBACiAJCQlwbHRtcFs5XSA9IDB4QTkwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAweDEwMjgKIAkJCXBsdG1wWzExXSA9IDB4MjM0NTdGMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjM0NTdGMzA7CisJCQlyZWctPkJCMkMgPSAweDIzNDU3RjMwOwogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCQkJcGx0bXBbM10gPSBwSHdEYXRhLT5CQjNjX2NhbDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gcEh3RGF0YS0+QkIzY19jYWw7CisJCQlyZWctPkJCM0MgPSBwSHdEYXRhLT5CQjNjX2NhbDsKIAkJCXBsdG1wWzRdID0gMHgwMDAwM0YyOTsgLy8gMHgxMDQwIDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzVdID0gMHgwRUZFRkJGRTsgLy8gMHgxMDQ0IDExYSBUWCBMUyBmaWx0ZXIKIAkJCXBsdG1wWzZdID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgogCQkJcGx0bXBbN10gPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgorCQkJcmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwODsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CiAJCQlwbHRtcFs5XSA9IHBId0RhdGEtPkJCNTRfY2FsOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gcEh3RGF0YS0+QkI1NF9jYWw7CisJCQlyZWctPkJCNTQgPSBwSHdEYXRhLT5CQjU0X2NhbDsKIAkJCXBsdG1wWzEwXSA9IDB4NTI1MjMxMzE7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDUyNTIzMTMxOworCQkJcmVnLT5CQjU4ID0gMHg1MjUyMzEzMTsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDIwMDYwODI1IDB4QUEyQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE4MTMsMTQgKzE4MTQsMTQgQEAKICAgICB9CiAKIAkvLyBGaWxsIHRoZSBMTkEgdGFibGUKLQlwV2IzNVJlZy0+TE5BVmFsdWVbMF0gPSAodTgpKHBXYjM1UmVnLT5CQjBDICYgMHhmZik7Ci0JcFdiMzVSZWctPkxOQVZhbHVlWzFdID0gMDsKLQlwV2IzNVJlZy0+TE5BVmFsdWVbMl0gPSAodTgpKChwV2IzNVJlZy0+QkIwQyAmIDB4ZmYwMCk+PjgpOwotCXBXYjM1UmVnLT5MTkFWYWx1ZVszXSA9IDA7CisJcmVnLT5MTkFWYWx1ZVswXSA9ICh1OCkocmVnLT5CQjBDICYgMHhmZik7CisJcmVnLT5MTkFWYWx1ZVsxXSA9IDA7CisJcmVnLT5MTkFWYWx1ZVsyXSA9ICh1OCkoKHJlZy0+QkIwQyAmIDB4ZmYwMCk+PjgpOworCXJlZy0+TE5BVmFsdWVbM10gPSAwOwogCiAJLy8gRmlsbCBTUTMgdGFibGUKIAlmb3IoIGk9MDsgaTxNQVhfU1EzX0ZJTFRFUl9TSVpFOyBpKysgKQotCQlwV2IzNVJlZy0+U1EzX2ZpbHRlcltpXSA9IDB4MmY7IC8vIGhhbGYgb2YgQml0IDAgfiA2CisJCXJlZy0+U1EzX2ZpbHRlcltpXSA9IDB4MmY7IC8vIGhhbGYgb2YgQml0IDAgfiA2CiB9CiAKIHZvaWQgc2V0X3R4X3Bvd2VyX3Blcl9jaGFubmVsX21heDI4MjkoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBDaGFubmVsKQpAQCAtMTkwMyw3ICsxOTA0LDcgQEAKIHZvaWQKIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIENoYW5uZWwgKQogewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglwbHRtcFsxNl07IC8vIFRoZSAxNiBpcyB0aGUgbWF4aW11bSBjYXBhYmlsaXR5IG9mIGhhcmR3YXJlCiAJdTMyCWNvdW50LCBsdG1wOwogCXU4CWksIGosIG51bWJlcjsKQEAgLTIwOTAsNDAgKzIwOTEsNDAgQEAKIAlpZiggQ2hhbm5lbC5iYW5kIDw9IEJBTkRfVFlQRV9PRkRNXzI0ICkKIAl7CiAgICAgICAgIC8vIEJCOiBzZWxlY3QgMi40IEdIeiwgYml0WzEyLTExXT0wMAotCQlwV2IzNVJlZy0+QkI1MCAmPSB+KEJJVCgxMSl8QklUKDEyKSk7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA1MCwgcFdiMzVSZWctPkJCNTAgKTsgLy8gTU9ERV9DdHJsCisJCXJlZy0+QkI1MCAmPSB+KEJJVCgxMSl8QklUKDEyKSk7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA1MCwgcmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAogICAgICAgICAvLyBNQUM6IHNlbGVjdCAyLjQgR0h6LCBiaXRbNV09MAotCQlwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICY9IH5CSVQoNSk7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOworCQlyZWctPk03OF9FUlBJbmZvcm1hdGlvbiAmPSB+QklUKDUpOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICk7CiAgICAgICAgIC8vIGVuYWJsZSAxMWIgQmFzZWJhbmQKLQkJcFdiMzVSZWctPkJCMzAgJj0gfkJJVCgzMSk7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcFdiMzVSZWctPkJCMzAgKTsKKwkJcmVnLT5CQjMwICY9IH5CSVQoMzEpOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHJlZy0+QkIzMCApOwogCX0KIAllbHNlIGlmKCAoQ2hhbm5lbC5iYW5kID09IEJBTkRfVFlQRV9PRkRNXzUpICkKIAl7CiAgICAgICAgIC8vIEJCOiBzZWxlY3QgNSBHSHoKLQkJcFdiMzVSZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOworCQlyZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOwogCQlpZiAoQ2hhbm5lbC5DaGFuTm8gPD02NCApCi0JCQlwV2IzNVJlZy0+QkI1MCB8PSBCSVQoMTIpOwkJCQkvLyAxMC01LjI1R0h6CisJCQlyZWctPkJCNTAgfD0gQklUKDEyKTsJCQkJLy8gMTAtNS4yNUdIegogCQllbHNlIGlmICgoQ2hhbm5lbC5DaGFuTm8gPj0gMTAwKSAmJiAoQ2hhbm5lbC5DaGFuTm8gPD0gMTI0KSkKLQkJCXBXYjM1UmVnLT5CQjUwIHw9IEJJVCgxMSk7CQkJCS8vIDAxLTUuNDhHSHoKKwkJCXJlZy0+QkI1MCB8PSBCSVQoMTEpOwkJCQkvLyAwMS01LjQ4R0h6CiAJCWVsc2UgaWYgKChDaGFubmVsLkNoYW5ObyA+PTEyOCkgJiYgKENoYW5uZWwuQ2hhbk5vIDw9IDE2MSkpCi0JCQlwV2IzNVJlZy0+QkI1MCB8PSAoQklUKDEyKXxCSVQoMTEpKTsJLy8gMTEtNS43NzVHSHoKKwkJCXJlZy0+QkI1MCB8PSAoQklUKDEyKXxCSVQoMTEpKTsJLy8gMTEtNS43NzVHSHoKIAkJZWxzZQkvL0NoYW4gMTg0IH4gMTk2IHdpbGwgdXNlIGJpdFsxMi0xMV0gPSAxMCBpbiB2ZXJzaW9uIHNoLXNyYy0xLjIuMjUKLQkJCXBXYjM1UmVnLT5CQjUwIHw9IEJJVCgxMik7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA1MCwgcFdiMzVSZWctPkJCNTAgKTsgLy8gTU9ERV9DdHJsCisJCQlyZWctPkJCNTAgfD0gQklUKDEyKTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDUwLCByZWctPkJCNTAgKTsgLy8gTU9ERV9DdHJsCiAKIAkJLy8oMSkgTTc4IHNob3VsZCBhbHdheSB1c2UgMi40RyBzZXR0aW5nIHdoZW4gdXNpbmcgUkZfQUlST0hBXzcyMzAKIAkJLy8oMikgQkIzMCBoYXMgYmVlbiB1cGRhdGVkIHByZXZpb3VzbHkuCiAJCWlmIChwSHdEYXRhLT5waHlfdHlwZSAhPSBSRl9BSVJPSEFfNzIzMCkKIAkJewogICAgIAkgICAgLy8gTUFDOiBzZWxlY3QgNSBHSHosIGJpdFs1XT0xCi0JCQlwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uIHw9IEJJVCg1KTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOworCQkJcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gfD0gQklUKDUpOworCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCByZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOwogCiAgICAgCSAgICAvLyBkaXNhYmxlIDExYiBCYXNlYmFuZAotCQkJcFdiMzVSZWctPkJCMzAgfD0gQklUKDMxKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcFdiMzVSZWctPkJCMzAgKTsKKwkJCXJlZy0+QkIzMCB8PSBCSVQoMzEpOworCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDMwLCByZWctPkJCMzAgKTsKIAkJfQogCX0KIH0KQEAgLTIzMTMsMjEgKzIzMTQsMjEgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIHZvaWQgRHh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCiAJLy8gT2xkIElDOlNpbmdsZSBtb2RlIG9ubHkuCiAJLy8gTmV3IElDOiBvcGVyYXRpb24gZGVjaWRlIGJ5IFNvZnR3YXJlIHNldCBiaXRbNF0uIDE6bXVsdGlwbGUgMDogc2luZ2xlCi0JcFdiMzVSZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwNDsJLy9UeG9uLCBSeG9uLCBtdWx0aXBsZSBSeCBmb3IgbmV3IDRrIERNQQorCXJlZy0+RDAwX0RtYUNvbnRyb2wgPSAweGMwMDAwMDA0OwkvL1R4b24sIFJ4b24sIG11bHRpcGxlIFJ4IGZvciBuZXcgNGsgRE1BCiAJCQkJCQkJCQkJCS8vVHhvbiwgUnhvbiwgc2luZ2xlIFJ4IGZvciBvbGQgOGsgQVNJQwogCWlmKCAhSEFMX1VTQl9NT0RFX0JVUlNUKCBwSHdEYXRhICkgKQotCQlwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgPSAweGMwMDAwMDAwOy8vVHhvbiwgUnhvbiwgc2luZ2xlIFJ4IGZvciBuZXcgNGsgRE1BCisJCXJlZy0+RDAwX0RtYUNvbnRyb2wgPSAweGMwMDAwMDAwOy8vVHhvbiwgUnhvbiwgc2luZ2xlIFJ4IGZvciBuZXcgNGsgRE1BCiAKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwNDAwLCBwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgKTsKKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwNDAwLCByZWctPkQwMF9EbWFDb250cm9sICk7CiB9CiAKIHZvaWQgTXh4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMgkJdG1wOwogCXUzMgkJcGx0bXBbMTFdOwogCXUxNglpOwpAQCAtMjMzOSwyMyArMjM0MCwyMyBAQAogCiAJLy8gTTAwIGJpdCBzZXQKICNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCA9IDA7IC8vIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBzb2Z0d2FyZQorCXJlZy0+TTAwX01hY0NvbnRyb2wgPSAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgc29mdHdhcmUKICNlbHNlCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sID0gMHg4MDAwMDAwMDsgLy8gU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IGhhcmR3YXJlCisJcmVnLT5NMDBfTWFjQ29udHJvbCA9IDB4ODAwMDAwMDA7IC8vIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBoYXJkd2FyZQogI2VuZGlmCiAKIAkvLyBNMjQgZGlzYWJsZSBlbnRlciBwb3dlciBzYXZlLCBCQiBSeE9uIGFuZCBlbmFibGUgTkFWIGF0dGFjawotCXBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCA9IDB4MDgwNDAwNDI7Ci0JcGx0bXBbMF0gPSBwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2w7CisJcmVnLT5NMjRfTWFjQ29udHJvbCA9IDB4MDgwNDAwNDI7CisJcGx0bXBbMF0gPSByZWctPk0yNF9NYWNDb250cm9sOwogCiAJcGx0bXBbMV0gPSAwOyAvLyBTa2lwIE0yOCwgYmVjYXVzZSBubyBpbml0aWFsaXplIHZhbHVlIGlzIHJlcXVpcmVkLgogCiAJLy8gTTJDIENXbWluIGFuZCBDV21heCBzZXR0aW5nCiAJcEh3RGF0YS0+Y3dtaW4gPSBERUZBVUxUX0NXTUlOOwogCXBId0RhdGEtPmN3bWF4ID0gREVGQVVMVF9DV01BWDsKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgPSBERUZBVUxUX0NXTUlOIDw8IDEwOwotCXBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCB8PSBERUZBVUxUX0NXTUFYOwotCXBsdG1wWzJdID0gcFdiMzVSZWctPk0yQ19NYWNDb250cm9sOworCXJlZy0+TTJDX01hY0NvbnRyb2wgPSBERUZBVUxUX0NXTUlOIDw8IDEwOworCXJlZy0+TTJDX01hY0NvbnRyb2wgfD0gREVGQVVMVF9DV01BWDsKKwlwbHRtcFsyXSA9IHJlZy0+TTJDX01hY0NvbnRyb2w7CiAKIAkvLyBNMzAgQlNTSUQKIAlwbHRtcFszXSA9ICoodTMyICopcEh3RGF0YS0+YnNzaWQ7CkBAIC0yMzY3LDM1ICsyMzY4LDM1IEBACiAJcGx0bXBbNF0gPSB0bXA7CiAKIAkvLyBNMzgKLQlwV2IzNVJlZy0+TTM4X01hY0NvbnRyb2wgPSAoREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUPDw4KSB8IChERUZBVUxUX0xPTkdfUkVUUllfTElNSVQgPDwgNCkgfCBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUOwotCXBsdG1wWzVdID0gcFdiMzVSZWctPk0zOF9NYWNDb250cm9sOworCXJlZy0+TTM4X01hY0NvbnRyb2wgPSAoREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUPDw4KSB8IChERUZBVUxUX0xPTkdfUkVUUllfTElNSVQgPDwgNCkgfCBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUOworCXBsdG1wWzVdID0gcmVnLT5NMzhfTWFjQ29udHJvbDsKIAogCS8vIE0zQwogCXRtcCA9IChERUZBVUxUX1BJRlNUIDw8IDI2KSB8IChERUZBVUxUX0VJRlNUIDw8IDE2KSB8IChERUZBVUxUX0RJRlNUIDw8IDgpIHwgKERFRkFVTFRfU0lGU1QgPDwgNCkgfCBERUZBVUxUX09TSUZTVCA7Ci0JcFdiMzVSZWctPk0zQ19NYWNDb250cm9sID0gdG1wOworCXJlZy0+TTNDX01hY0NvbnRyb2wgPSB0bXA7CiAJcGx0bXBbNl0gPSB0bXA7CiAKIAkvLyBNNDAKIAlwSHdEYXRhLT5zbG90X3RpbWVfc2VsZWN0ID0gREVGQVVMVF9TTE9UX1RJTUU7CiAJdG1wID0gKERFRkFVTFRfQVRJTVdEIDw8IDE2KSB8IERFRkFVTFRfU0xPVF9USU1FOwotCXBXYjM1UmVnLT5NNDBfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk00MF9NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzddID0gdG1wOwogCiAJLy8gTTQ0CiAJdG1wID0gREVGQVVMVF9NQVhfVFhfTVNEVV9MSUZFX1RJTUUgPDwgMTA7IC8vICoxMDI0Ci0JcFdiMzVSZWctPk00NF9NYWNDb250cm9sID0gdG1wOworCXJlZy0+TTQ0X01hY0NvbnRyb2wgPSB0bXA7CiAJcGx0bXBbOF0gPSB0bXA7CiAKIAkvLyBNNDgKIAlwSHdEYXRhLT5CZWFjb25QZXJpb2QgPSBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTDsKIAlwSHdEYXRhLT5Qcm9iZURlbGF5ID0gREVGQVVMVF9QUk9CRV9ERUxBWV9USU1FOwogCXRtcCA9IChERUZBVUxUX0JFQUNPTl9JTlRFUlZBTCA8PCAxNikgfCBERUZBVUxUX1BST0JFX0RFTEFZX1RJTUU7Ci0JcFdiMzVSZWctPk00OF9NYWNDb250cm9sID0gdG1wOworCXJlZy0+TTQ4X01hY0NvbnRyb2wgPSB0bXA7CiAJcGx0bXBbOV0gPSB0bXA7CiAKIAkvL000QwotCXBXYjM1UmVnLT5NNENfTWFjU3RhdHVzID0gKERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTiA8PCAzMCkgfCAoREVGQVVMVF9NQUNfUE9XRVJfU1RBVEUgPDwgMjgpIHwgKERFRkFVTFRfRFRJTV9BTEVSVF9USU1FIDw8IDI0KTsKLQlwbHRtcFsxMF0gPSBwV2IzNVJlZy0+TTRDX01hY1N0YXR1czsKKwlyZWctPk00Q19NYWNTdGF0dXMgPSAoREVGQVVMVF9QUk9UT0NPTF9WRVJTSU9OIDw8IDMwKSB8IChERUZBVUxUX01BQ19QT1dFUl9TVEFURSA8PCAyOCkgfCAoREVGQVVMVF9EVElNX0FMRVJUX1RJTUUgPDwgMjQpOworCXBsdG1wWzEwXSA9IHJlZy0+TTRDX01hY1N0YXR1czsKIAogCS8vIEJ1cnN0IHdyaXRlCiAJLy9XYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MDgyNCwgcGx0bXAsIDExLCBBVVRPX0lOQ1JFTUVOVCApOwpAQCAtMjQwNCwxNSArMjQwNSwxNSBAQAogCiAJLy8gTTYwCiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2MCwgMHgxMjQ4MTI0OCApOwotCXBXYjM1UmVnLT5NNjBfTWFjQ29udHJvbCA9IDB4MTI0ODEyNDg7CisJcmVnLT5NNjBfTWFjQ29udHJvbCA9IDB4MTI0ODEyNDg7CiAKIAkvLyBNNjgKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY4LCAweDAwMDUwOTAwICk7IC8vIDIwMDUxMDE4IDB4MDAwRjBGMDAgKTsgLy8gOTQwOTMwIDB4MDAxMzEzMDAKLQlwV2IzNVJlZy0+TTY4X01hY0NvbnRyb2wgPSAweDAwMDUwOTAwOworCXJlZy0+TTY4X01hY0NvbnRyb2wgPSAweDAwMDUwOTAwOwogCiAJLy8gTTk4CiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg5OCwgMHhmZmZmODg4OCApOwotCXBXYjM1UmVnLT5NOThfTWFjQ29udHJvbCA9IDB4ZmZmZjg4ODg7CisJcmVnLT5NOThfTWFjQ29udHJvbCA9IDB4ZmZmZjg4ODg7CiB9CiAKIApAQCAtMjYyMCw3ICsyNjIxLDcgQEAKIAogdm9pZCBCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICkgLy8gMjAwNjA2MTMuMQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXVuc2lnbmVkIGNoYXIJCUlzMTFiUmF0ZTsKIAogCUlzMTFiUmF0ZSA9IChyYXRlICUgNikgPyAxIDogMDsKQEAgLTI2MzAsOCArMjYzMSw4IEBACiAJCWNhc2UgUkZfQUlST0hBXzIyMzBTOiAvLyAyMDA2MDQyMCBBZGQgdGhpcwogCQkJaWYoIElzMTFiUmF0ZSApCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQikgJiYKLQkJCQkJKHBXYjM1UmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFCKSApCisJCQkJaWYoIChyZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIpICkKIAkJCQl7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIgKTsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDRjLCBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQiApOwpAQCAtMjYzOSw4ICsyNjQwLDggQEAKIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQlpZiggKHBXYjM1UmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcpICkKKwkJCQlpZiggKHJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRykgJiYKKwkJCQkJKHJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRykgKQogCQkJCXsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDQ4LCBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRyApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9BTDIyMzBfMTFHICk7CkBAIC0yNjUxLDIyICsyNjUyLDIyIEBACiAJCWNhc2UgUkZfV0JfMjQyOiAvLyAyMDA2MDYyMyBUaGUgZml4IG9ubHkgZm9yIG9sZCBUeFZHQSBzZXR0aW5nCiAJCQlpZiggSXMxMWJSYXRlICkKIAkJCXsKLQkJCQlpZiggKHBXYjM1UmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIpICYmCi0JCQkJCShwV2IzNVJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCKSApCisJCQkJaWYoIChyZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX1dCMjQyXzExQikgJiYKKwkJCQkJKHJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCKSApCiAJCQkJewotCQkJCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUI7Ci0JCQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQjsKKwkJCQkJcmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExQjsKKwkJCQkJcmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQjsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDQ4LCBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCICk7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0YywgQkI0Q19ERUZBVUxUX1dCMjQyXzExQiApOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKLQkJCQlpZiggKHBXYjM1UmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcpICYmCi0JCQkJCShwV2IzNVJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHKSApCisJCQkJaWYoIChyZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRykgJiYKKwkJCQkJKHJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHKSApCiAJCQkJewotCQkJCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7Ci0JCQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsKKwkJCQkJcmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsKKwkJCQkJcmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDQ4LCBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHICk7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0YywgQkI0Q19ERUZBVUxUX1dCMjQyXzExRyApOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3J4aXNyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yeGlzci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGU5NDJjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3J4aXNyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXZvaWQgdlJ4VGltZXJJbml0KFBXQjMyX0FEQVBURVIgQWRhcHRlcikKLXsKLQlPU19USU1FUl9JTklUSUFMKCYoQWRhcHRlci0+TWRzLm5UaW1lciksICh2b2lkKikgUnhUaW1lckhhbmRsZXIsICh2b2lkKikgQWRhcHRlcik7Ci19Ci0KLXZvaWQgdlJ4VGltZXJTdGFydChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIGludCB0aW1lb3V0X3ZhbHVlKQotewotCWlmICh0aW1lb3V0X3ZhbHVlPE1JTl9USU1FT1VUX1ZBTCkKLQkJdGltZW91dF92YWx1ZT1NSU5fVElNRU9VVF9WQUw7Ci0KLQlPU19USU1FUl9TRVQoICYoQWRhcHRlci0+TWRzLm5UaW1lciksIHRpbWVvdXRfdmFsdWUgKTsKLX0KLQotdm9pZCB2UnhUaW1lclN0b3AoUFdCMzJfQURBUFRFUiBBZGFwdGVyKQotewotCU9TX1RJTUVSX0NBTkNFTCggJihBZGFwdGVyLT5NZHMublRpbWVyKSwgMCApOwotfQotCi12b2lkIFJ4VGltZXJIYW5kbGVyXzFhKCBQQURBUFRFUiBBZGFwdGVyKQotewotCVJ4VGltZXJIYW5kbGVyKE5VTEwsIEFkYXB0ZXIsIE5VTEwsIE5VTEwpOwotfQotCi12b2lkIFJ4VGltZXJIYW5kbGVyKHZvaWQqIFN5c3RlbVNwZWNpZmljMSwgUFdCMzJfQURBUFRFUiBBZGFwdGVyLAotCQkgICAgdm9pZCogU3lzdGVtU3BlY2lmaWMyLCB2b2lkKiBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JV0FSTl9PTigxKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc2Nhbl9zLmgKaW5kZXggMWQxYjBjNC4uNzc1YmI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc2Nhbl9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc2Nhbl9zLmgKQEAgLTEsMyArMSw5IEBACisjaWZuZGVmIF9fV0lOQk9ORF9TQ0FOX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfU0NBTl9TX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAibG9jYWxwYXJhLmgiCisKIC8vCiAvLyBTQ0FOIHRhc2sgZ2xvYmFsIENPTlNUQU5UUywgU1RSVUNUVVJFUywgdmFyaWFibGVzCiAvLwpAQCAtNjIsOCArNjgsNyBAQAogCXU4CQkJCWJvQ0NBYnVzeTsJCQkJCS8vIFdiOiBIV01BQyBDQ0EgYnVzeSBzdGF0dXMKIAl1OAkJCQlyZXNlcnZlZF8yOwogCi0JLy9ORElTX01JTklQT1JUX1RJTUVSCW5UaW1lcjsKLQlPU19USU1FUgkJCW5UaW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAogCXUzMgkJCQlTY2FuVGltZVN0YW1wOwkJCS8vSW5jcmVhc2UgMSBwZXIgYmFja2dyb3VuZCBzY2FuKDEgbWludXRlKQogCXUzMgkJCQlCc3NUaW1lU3RhbXA7CQkJLy9JbmNyZWFzZSAxIHBlciBjb25uZWN0IHN0YXR1cyBjaGVjawpAQCAtNzgsOSArODMsOSBAQAogCiB9IFNDQU5fUEFSQU1FVEVSUywgKnBzU0NBTl9QQVJBTUVURVJTOwogCi0vLyBFbmNhcHN1bGF0ZSAnQWRhcHRlcicgZGF0YSBzdHJ1Y3R1cmUKLSNkZWZpbmUgcHNTQ0FOCQkJKCYoQWRhcHRlci0+c1NjYW5QYXJhKSkKLSNkZWZpbmUgcHNTQ0FOUkVRCQkJKCYoQWRhcHRlci0+c1NjYW5QYXJhLnNTY2FuUmVxKSkKKy8vIEVuY2Fwc3VsYXRlICdhZGFwdGVyJyBkYXRhIHN0cnVjdHVyZQorI2RlZmluZSBwc1NDQU4JCQkoJihhZGFwdGVyLT5zU2NhblBhcmEpKQorI2RlZmluZSBwc1NDQU5SRVEJCQkoJihhZGFwdGVyLT5zU2NhblBhcmEuc1NjYW5SZXEpKQogCiAvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAvLwlzY2FuLmgKQEAgLTEwOSw3ICsxMTQsOCBAQAogCiAvLyBzdGF0aWMgZnVuY3Rpb25zCiAKLS8vc3RhdGljIHZvaWQgU2NhblRpbWVySGFuZGxlcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RhcnQoUFdCMzJfQURBUFRFUglBZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSk7Ci0vL3N0YXRpYyB2b2lkIHZTY2FuVGltZXJTdG9wKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7CisvL3N0YXRpYyB2b2lkIFNjYW5UaW1lckhhbmRsZXIoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7CisvL3N0YXRpYyB2b2lkIHZTY2FuVGltZXJTdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKglhZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSk7CisvL3N0YXRpYyB2b2lkIHZTY2FuVGltZXJTdG9wKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwogCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjOTY3My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc21lX2FwaS5jCi0vLwotLy8gQ29weXJpZ2h0KEMpIDIwMDIgV2luYm9uZCBFbGVjdHJvbmljcyBDb3JwLgotLy8KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi1zOCBzbWVfZ2V0X3Jzc2kodm9pZCAqcGNvcmVfZGF0YSwgczMyICpwcnNzaSkKLXsKLSAgICAgICBCVUcoKTsKLSAgICAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuaAppbmRleCA3NDVlYjM3Li4xODhhMjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5oCkBAIC0xMyw2ICsxMywxMCBAQAogI2lmbmRlZiBfX1NNRV9BUElfSF9fCiAjZGVmaW5lIF9fU01FX0FQSV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKwogLyoqKioqKioqKioqKioqKioqKiBJTkNMVURFIEZJTEVTIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvLyNpbmNsdWRlICJHTFxnbF9jb3JlLmgiCiAKQEAgLTUyLDkgKzU2LDYgQEAKIHM4IHNtZV9nZXRfcnRzX3RocmVzaG9sZCh2b2lkICpwY29yZV9kYXRhLCB1MzIgKnB0aHJlc2hvbGQpOwogczggc21lX3NldF9ydHNfdGhyZXNob2xkKHZvaWQgKnBjb3JlX2RhdGEsIHUzMiB0aHJlc2hvbGQpOwogCi0vLyBPSURfODAyXzExX1JTU0kKLXM4IHNtZV9nZXRfcnNzaSh2b2lkICpwY29yZV9kYXRhLCBzMzIgKnByc3NpKTsKLQogLy8gT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCiBzOCBzbWVfZ2V0X2JlYWNvbl9wZXJpb2Qodm9pZCAqcGNvcmVfZGF0YSwgdTE2ICpwYmVhY29uX3BlcmlvZCk7CiBzOCBzbWVfc2V0X2JlYWNvbl9wZXJpb2Qodm9pZCAqcGNvcmVfZGF0YSwgdTE2IGJlYWNvbl9wZXJpb2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmgKaW5kZXggZGZkMmZiYy4uMWJkMTE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfcy5oCkBAIC0xLDMgKzEsMTEgQEAKKyNpZm5kZWYgX19XSU5CT05EX1NNRV9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1NNRV9TX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorI2luY2x1ZGUgImxvY2FscGFyYS5oIgorCiAvLwogLy8gU01FX1MuSCAtCiAvLyBTTUUgdGFzayBnbG9iYWwgQ09OU1RBTlRTLCBTVFJVQ1RVUkVTLCB2YXJpYWJsZXMKQEAgLTEwNiw4ICsxMTQsNyBAQAogCXU4CQkJCWJEZXNpcmVkUG93ZXJTYXZlOwogCiAJLy8gU01FIHRpbWVyIGFuZCB0aW1lb3V0IHZhbHVlCi0JLy9ORElTX01JTklQT1JUX1RJTUVSCW5UaW1lcjsKLQlPU19USU1FUgkJCW5UaW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAogCXU4CQkJCWJvSW5UaW1lckhhbmRsZXI7CiAJdTggCQkJCWJvQXV0aFJldHJ5QWN0aXZlOwpAQCAtMTk2LDkgKzIwMyw5IEBACiAKIH0gU01FX1BBUkFNRVRFUlMsICpQU01FX1BBUkFNRVRFUlM7CiAKLSNkZWZpbmUgcHNTTUUJCQkoJihBZGFwdGVyLT5zU21lUGFyYSkpCisjZGVmaW5lIHBzU01FCQkJKCYoYWRhcHRlci0+c1NtZVBhcmEpKQogCi0jZGVmaW5lIHdTTUVHZXRDdXJyZW50U1RBU3RhdGUoQWRhcHRlcikJCSgodTE2KShBZGFwdGVyKS0+c1NtZVBhcmEud1N0YXRlKQorI2RlZmluZSB3U01FR2V0Q3VycmVudFNUQVN0YXRlKGFkYXB0ZXIpCQkoKHUxNikoYWRhcHRlciktPnNTbWVQYXJhLndTdGF0ZSkKIAogCiAKQEAgLTIyNiwzICsyMzMsNCBAQAogCiAvLyBTdGF0aWMgZnVuY3Rpb24KIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zeXNkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MWI5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zeXNkZWYuaApAQCAtMCwwICsxLDQwIEBACisKKworLy8KKy8vIFdpbmJvbmQgV0xBTiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBkZWZpbmVzCisvLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gQ3VycmVudCBkaXJlY3RvcnkgaXMgTGludXgKKy8vIFRoZSBkZWZpbml0aW9uIFdCX0xJTlVYIGlzIGEga2V5d29yZCBmb3IgdGhpcyBPUworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpZm5kZWYgU1lTX0RFRl9ICisjZGVmaW5lIFNZU19ERUZfSAorI2RlZmluZSBXQl9MSU5VWAorI2RlZmluZSBXQl9MSU5VWF9XUEFfUFNLCisKKworLy8jZGVmaW5lIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCisjZGVmaW5lIF9VU0VfRkFMTEJBQ0tfUkFURV8KKy8vI2RlZmluZSBBTlRESVZfREVGQVVMVF9PTgorCisjZGVmaW5lIF9XUEEyXwkvLyAyMDA2MTEyMiBJdCdzIG5lZWRlZCBmb3IgY3VycmVudCBMaW51eCBkcml2ZXIKKworCisjaWZuZGVmIF9XUEFfUFNLX0RFQlVHCisjdW5kZWYgIF9XUEFfUFNLX0RFQlVHCisjZW5kaWYKKworLy8gZGVidWcgcHJpbnQgb3B0aW9ucywgbWFyayB3aGF0IGRlYnVnIHlvdSBkb24ndCBuZWVkCisKKyNpZmRlZiBGVUxMX0RFQlVHCisjZGVmaW5lIF9QRV9TVEFURV9EVU1QXworI2RlZmluZSBfUEVfVFhfRFVNUF8KKyNkZWZpbmUgX1BFX1JYX0RVTVBfCisjZGVmaW5lIF9QRV9PSURfRFVNUF8KKyNkZWZpbmUgX1BFX0RUT19EVU1QXworI2RlZmluZSBfUEVfUkVHX0RVTVBfCisjZGVmaW5lIF9QRV9VU0JfSU5JX0RVTVBfCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0YjNmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwpAQCAtMCwwICsxLDc0NyBAQAorI2luY2x1ZGUgInN5c2RlZi5oIgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKK2V4dGVybiB2b2lkIHBoeV9jYWxpYnJhdGlvbl93aW5ib25kKGh3X2RhdGFfdCAqcGh3X2RhdGEsIHUzMiBmcmVxdWVuY3kpOworCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAorLy8gUmVnaXN0ZXJObyA6IHN0YXJ0IGJhc2UKKy8vIHBSZWdpc3RlckRhdGEgOiBkYXRhIHBvaW50CisvLyBOdW1iZXJPZkRhdGEgOiBudW1iZXIgb2YgcmVnaXN0ZXIgZGF0YQorLy8gRmxhZyA6IEFVVE9fSU5DUkVNRU5UIC0gUmVnaXN0ZXJObyB3aWxsIGF1dG8gaW5jcmVtZW50IDQKKy8vCQkgIE5PX0lOQ1JFTUVOVCAtIEZ1bmN0aW9uIHdpbGwgd3JpdGUgZGF0YSBpbnRvIHRoZSBzYW1lIHJlZ2lzdGVyCit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX0J1cnN0V3JpdGUocGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyICogcFJlZ2lzdGVyRGF0YSwgdTggTnVtYmVyT2ZEYXRhLCB1OCBGbGFnKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXJiCSp1cmIgPSBOVUxMOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlID0gTlVMTDsKKwl1MTYJCVVyYlNpemU7CisJc3RydWN0ICAgICAgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwl1MTYJCWksIERhdGFTaXplID0gTnVtYmVyT2ZEYXRhKjQ7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIFRyeWluZyB0byB1c2UgYnVyc3Qgd3JpdGUgZnVuY3Rpb24gaWYgdXNlIG5ldyBoYXJkd2FyZQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIERhdGFTaXplICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOworCXJlZ19xdWV1ZSA9IGt6YWxsb2MoVXJiU2l6ZSwgR0ZQX0FUT01JQyk7CisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiggdXJiICYmIHJlZ19xdWV1ZSApIHsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAyOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPnBCdWZmZXIgPSAodTMyICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJbWVtY3B5KCByZWdfcXVldWUtPnBCdWZmZXIsIHBSZWdpc3RlckRhdGEsIERhdGFTaXplICk7CisJCS8vdGhlIGZ1bmN0aW9uIGZvciByZXZlcnNpbmcgcmVnaXN0ZXIgZGF0YSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorCQlmb3IoIGk9MDsgaTxOdW1iZXJPZkRhdGEgOyBpKysgKQorCQkJcmVnX3F1ZXVlLT5wQnVmZmVyW2ldID0gY3B1X3RvX2xlMzIoIHJlZ19xdWV1ZS0+cEJ1ZmZlcltpXSApOworCisJCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcmVnX3F1ZXVlICsgc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBEYXRhU2l6ZSk7CisJCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJCWRyLT5iUmVxdWVzdCA9IDB4MDQ7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KCBGbGFnICk7IC8vIDA6IFJlZ2lzdGVyIG51bWJlciBhdXRvLWluY3JlbWVudCwgMTogTm8gYXV0byBpbmNyZW1lbnQKKwkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KCBSZWdpc3Rlck5vICk7CisJCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoIERhdGFTaXplICk7CisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKworCQlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYgKHJlZy0+cmVnX2ZpcnN0ID09IE5VTEwpCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHVyYikKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQlpZiAocmVnX3F1ZXVlKQorCQkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKyAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZAorV2IzNVJlZ19VcGRhdGUocGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3dpdGNoIChSZWdpc3Rlck5vKSB7CisJY2FzZSAweDNiMDogcmVnLT5VMUIwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDNiYzogcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg0MDA6IHJlZy0+RDAwX0RtYUNvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODAwOiByZWctPk0wMF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgwNDogcmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODA4OiByZWctPk0wOF9NdWx0aWNhc3RBZGRyZXNzMiA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MjQ6IHJlZy0+TTI0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODI4OiByZWctPk0yOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgyYzogcmVnLT5NMkNfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Mzg6IHJlZy0+TTM4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODQwOiByZWctPk00MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0NDogcmVnLT5NNDRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NDg6IHJlZy0+TTQ4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODRjOiByZWctPk00Q19NYWNTdGF0dXMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODYwOiByZWctPk02MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg2ODogcmVnLT5NNjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NzA6IHJlZy0+TTcwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODc0OiByZWctPk03NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3ODogcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODdDOiByZWctPk03Q19NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg4MDogcmVnLT5NODBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4ODQ6IHJlZy0+TTg0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODg4OiByZWctPk04OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg5ODogcmVnLT5NOThfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDBjOiByZWctPkJCMEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAyYzogcmVnLT5CQjJDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwMzA6IHJlZy0+QkIzMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDNjOiByZWctPkJCM0MgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA0ODogcmVnLT5CQjQ4ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNGM6IHJlZy0+QkI0QyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDUwOiByZWctPkJCNTAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1NDogcmVnLT5CQjU0ID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNTg6IHJlZy0+QkI1OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDVjOiByZWctPkJCNUMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA2MDogcmVnLT5CQjYwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJfQorfQorCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAordW5zaWduZWQgY2hhcgorV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJaW50IHJldCA9IC0xOworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlSZWdpc3RlclZhbHVlID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7CisKKwkvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIGJ5IHNlbmQgdXNiIG1lc3NhZ2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlyZWctPlN5bmNJb1BhdXNlID0gMTsKKworCS8vIDIwMDYwNzE3LjUgV2FpdCB1bnRpbCBFUDBWTSBzdG9wCisJd2hpbGUgKHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKKwkJbXNsZWVwKDEwKTsKKworCS8vIFN5bmMgSW9DYWxsRHJpdmVyCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZSggcEh3RGF0YS0+V2JVc2IudWRldiwgMCApLAorCQkJICAgICAgIDB4MDMsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX09VVCwKKwkJCSAgICAgICAweDAsUmVnaXN0ZXJObywgJlJlZ2lzdGVyVmFsdWUsIDQsIEhaKjEwMCApOworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOworCXJlZy0+U3luY0lvUGF1c2UgPSAwOworCisJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKKworCWlmIChyZXQgPCAwKSB7CisJCSNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCVdCREVCVUcoKCJFUDAgV3JpdGUgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIikpOworCQkjZW5kaWYKKworCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7IC8vIDIwMDYwNzA0LjIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAordW5zaWduZWQgY2hhcgorV2IzNVJlZ19Xcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwlzdHJ1Y3QgdXJiCSp1cmIgPSBOVUxMOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlID0gTlVMTDsKKwl1MTYJCVVyYlNpemU7CisKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVXJiU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOworCXJlZ19xdWV1ZSA9IGt6YWxsb2MoVXJiU2l6ZSwgR0ZQX0FUT01JQyk7CisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAodXJiICYmIHJlZ19xdWV1ZSkgeworCQlyZWdfcXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKKwkJcmVnX3F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87CisJCXJlZ19xdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKKwkJcmVnX3F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IGZhbHNlOworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKKwkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQorCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKKwkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOworCisJCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKworCQlzcGluX2xvY2tfaXJxKCZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiAocmVnLT5yZWdfZmlyc3QgPT0gTlVMTCkKKwkJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnX3F1ZXVlOworCQllbHNlCisJCQlyZWctPnJlZ19sYXN0LT5OZXh0ID0gcmVnX3F1ZXVlOworCQlyZWctPnJlZ19sYXN0ID0gcmVnX3F1ZXVlOworCisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJLy8gU3RhcnQgRVAwVk0KKwkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodXJiKQorCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8vVGhpcyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgd2l0aCBhIHVzZXIgZGVmaW5lZCB2YWx1ZS4gV2hlbiBpdCBjb21wbGV0ZXMsCisvL3RoaXMgdmFsdWUgaXMgdXNlZnVsLiBGb3IgZXhhbXBsZSwgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwgd2lsbCB1c2UgaXQuCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAordW5zaWduZWQgY2hhcgorV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKCBwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCB1MzIgUmVnaXN0ZXJWYWx1ZSwKKwkJCQlzOCAqcFZhbHVlLCBzOCBMZW4pCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOworCXN0cnVjdCB1cmIJKnVyYiA9IE5VTEw7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWUgPSBOVUxMOworCXUxNgkJVXJiU2l6ZTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVyYiByZXF1ZXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVXJiU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOworCXJlZ19xdWV1ZSA9IGt6YWxsb2MoVXJiU2l6ZSwgR0ZQX0FUT01JQyk7CisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAodXJiICYmIHJlZ19xdWV1ZSkgeworCQlyZWdfcXVldWUtPkRJUkVDVCA9IDE7Ly8gYnVyc3Qgd3JpdGUgcmVnaXN0ZXIKKwkJcmVnX3F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87CisJCXJlZ19xdWV1ZS0+VkFMVUUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKKwkJLy9OT1RFIDogVXNlcnMgbXVzdCBndWFyYW50ZWUgdGhlIHNpemUgb2YgdmFsdWUgd2lsbCBub3QgZXhjZWVkIHRoZSBidWZmZXIgc2l6ZS4KKwkJbWVtY3B5KHJlZ19xdWV1ZS0+UkVTRVJWRUQsIHBWYWx1ZSwgTGVuKTsKKwkJcmVnX3F1ZXVlLT5SRVNFUlZFRF9WQUxJRCA9IHRydWU7CisJCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcmVnX3F1ZXVlICsgc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkpOworCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9ESVJfT1VUIHxVU0JfUkVDSVBfREVWSUNFOworCQlkci0+YlJlcXVlc3QgPSAweDAzOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCisJCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOworCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoUmVnaXN0ZXJObyk7CisJCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoNCk7CisKKwkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKKwkJcmVnX3F1ZXVlLT5OZXh0ID0gTlVMTDsKKwkJcmVnX3F1ZXVlLT5wVXNiUmVxID0gZHI7CisJCXJlZ19xdWV1ZS0+dXJiID0gdXJiOworCQlzcGluX2xvY2tfaXJxICgmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYoIHJlZy0+cmVnX2ZpcnN0ID09IE5VTEwgKQorCQkJcmVnLT5yZWdfZmlyc3QgPSByZWdfcXVldWU7CisJCWVsc2UKKwkJCXJlZy0+cmVnX2xhc3QtPk5leHQgPSByZWdfcXVldWU7CisJCXJlZy0+cmVnX2xhc3QgPSByZWdfcXVldWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxICggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJLy8gU3RhcnQgRVAwVk0KKwkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHVyYikKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShyZWdfcXVldWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAorLy8gcFJlZ2lzdGVyVmFsdWUgOiBJdCBtdXN0IGJlIGEgcmVzaWRlbnQgYnVmZmVyIGR1ZSB0byBhc3luY2hyb25vdXMgcmVhZCByZWdpc3Rlci4KK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfUmVhZFN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXUzMiAqCXBsdG1wID0gcFJlZ2lzdGVyVmFsdWU7CisJaW50IHJldCA9IC0xOworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyBSZWFkIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlyZWctPlN5bmNJb1BhdXNlID0gMTsKKworCS8vIDIwMDYwNzE3LjUgV2FpdCB1bnRpbCBFUDBWTSBzdG9wCisJd2hpbGUgKHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKKwkJbXNsZWVwKDEwKTsKKworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCXJldCA9IHVzYl9jb250cm9sX21zZyggcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgICAgICB1c2JfcmN2Y3RybHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMCksCisJCQkgICAgICAgMHgwMSwgVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTiwKKwkJCSAgICAgICAweDAsIFJlZ2lzdGVyTm8sIHBsdG1wLCA0LCBIWioxMDAgKTsKKworCSpwUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKCpwbHRtcCk7CisKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKworCVdiMzVSZWdfVXBkYXRlKCBwSHdEYXRhLCBSZWdpc3Rlck5vLCAqcFJlZ2lzdGVyVmFsdWUgKTsKKwlyZWctPlN5bmNJb1BhdXNlID0gMDsKKworCVdiMzVSZWdfRVAwVk1fc3RhcnQoIHBId0RhdGEgKTsKKworCWlmIChyZXQgPCAwKSB7CisJCSNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCVdCREVCVUcoKCJFUDAgUmVhZCByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKSk7CisJCSNlbmRpZgorCisJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsgLy8gMjAwNjA3MDQuMgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8vIHRydWUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5CisvLyBmYWxzZSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0CisvLyBwUmVnaXN0ZXJWYWx1ZSA6IEl0IG11c3QgYmUgYSByZXNpZGVudCBidWZmZXIgZHVlIHRvIGFzeW5jaHJvbm91cyByZWFkIHJlZ2lzdGVyLgordW5zaWduZWQgY2hhcgorV2IzNVJlZ19SZWFkKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiBkcjsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWU7CisJdTE2CQlVcmJTaXplOworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyB1cGRhdGUgdGhlIHZhcmlhYmxlIGJ5IHNlbmQgVXJiIHRvIHJlYWQgcmVnaXN0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVXJiU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpOworCXJlZ19xdWV1ZSA9IGt6YWxsb2MoVXJiU2l6ZSwgR0ZQX0FUT01JQyk7CisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiggdXJiICYmIHJlZ19xdWV1ZSApCisJeworCQlyZWdfcXVldWUtPkRJUkVDVCA9IDA7Ly8gcmVhZCByZWdpc3RlcgorCQlyZWdfcXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKKwkJcmVnX3F1ZXVlLT5wQnVmZmVyID0gcFJlZ2lzdGVyVmFsdWU7CisJCWRyID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoKHU4ICopcmVnX3F1ZXVlICsgc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkpOworCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTjsKKwkJZHItPmJSZXF1ZXN0ID0gMHgwMTsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQorCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKKwkJZHItPndJbmRleCA9IGNwdV90b19sZTE2IChSZWdpc3Rlck5vKTsKKwkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNiAoNCk7CisKKwkJLy8gRW50ZXIgdGhlIHNlbmRpbmcgcXVldWUKKwkJcmVnX3F1ZXVlLT5OZXh0ID0gTlVMTDsKKwkJcmVnX3F1ZXVlLT5wVXNiUmVxID0gZHI7CisJCXJlZ19xdWV1ZS0+dXJiID0gdXJiOworCQlzcGluX2xvY2tfaXJxICggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmKCByZWctPnJlZ19maXJzdCA9PSBOVUxMICkKKwkJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnX3F1ZXVlOworCQllbHNlCisJCQlyZWctPnJlZ19sYXN0LT5OZXh0ID0gcmVnX3F1ZXVlOworCQlyZWctPnJlZ19sYXN0ID0gcmVnX3F1ZXVlOworCisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJLy8gU3RhcnQgRVAwVk0KKwkJV2IzNVJlZ19FUDBWTV9zdGFydCggcEh3RGF0YSApOworCisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIoIHVyYiApOworCQlrZnJlZShyZWdfcXVldWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisKK3ZvaWQKK1diMzVSZWdfRVAwVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmIChhdG9taWNfaW5jX3JldHVybigmcmVnLT5SZWdGaXJlQ291bnQpID09IDEpIHsKKwkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJCVdiMzVSZWdfRVAwVk0ocEh3RGF0YSk7CisJfSBlbHNlCisJCWF0b21pY19kZWMoJnJlZy0+UmVnRmlyZUNvdW50KTsKK30KKwordm9pZAorV2IzNVJlZ19FUDBWTShwaHdfZGF0YV90IHBId0RhdGEgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7CisJdTMyICoJCXBCdWZmZXI7CisJaW50CQkJcmV0ID0gLTE7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWU7CisKKworCWlmIChyZWctPlN5bmNJb1BhdXNlKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCWdvdG8gY2xlYW51cDsKKworCS8vIEdldCB0aGUgcmVnaXN0ZXIgZGF0YSBhbmQgc2VuZCB0byBVU0IgdGhyb3VnaCBJcnAKKwlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwlyZWdfcXVldWUgPSByZWctPnJlZ19maXJzdDsKKwlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJaWYgKCFyZWdfcXVldWUpCisJCWdvdG8gY2xlYW51cDsKKworCS8vIEdldCBhbiBVcmIsIHNlbmQgaXQKKwl1cmIgPSAoc3RydWN0IHVyYiAqKXJlZ19xdWV1ZS0+dXJiOworCisJZHIgPSByZWdfcXVldWUtPnBVc2JSZXE7CisJdXJiID0gcmVnX3F1ZXVlLT51cmI7CisJcEJ1ZmZlciA9IHJlZ19xdWV1ZS0+cEJ1ZmZlcjsKKwlpZiAocmVnX3F1ZXVlLT5ESVJFQ1QgPT0gMSkgLy8gb3V0cHV0CisJCXBCdWZmZXIgPSAmcmVnX3F1ZXVlLT5WQUxVRTsKKworCXVzYl9maWxsX2NvbnRyb2xfdXJiKCB1cmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgICAgICBSRUdfRElSRUNUSU9OKHBId0RhdGEtPldiVXNiLnVkZXYscmVnX3F1ZXVlKSwKKwkJCSAgICAgICh1OCAqKWRyLHBCdWZmZXIsY3B1X3RvX2xlMTYoZHItPndMZW5ndGgpLAorCQkJICAgICAgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZSwgKHZvaWQqKXBId0RhdGEpOworCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJaWYgKHJldCA8IDApIHsKKyNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCVdCREVCVUcoKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpKTsKKyNlbmRpZgorCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0dXJuOworCisgY2xlYW51cDoKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZyZWctPlJlZ0ZpcmVDb3VudCk7Cit9CisKKwordm9pZAorV2IzNVJlZ19FUDBWTV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJcGh3X2RhdGFfdCAgcEh3RGF0YSA9IChwaHdfZGF0YV90KXVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWU7CisKKworCS8vIFZhcmlhYmxlIHNldHRpbmcKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCXJlZy0+RVAwVk1fc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIHsgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCQlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKwkJYXRvbWljX2RlYygmcmVnLT5SZWdGaXJlQ291bnQpOworCX0gZWxzZSB7CisJCS8vIENvbXBsZXRlIHRvIHNlbmQsIHJlbW92ZSB0aGUgVVJCIGZyb20gdGhlIGZpcnN0CisJCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlyZWdfcXVldWUgPSByZWctPnJlZ19maXJzdDsKKwkJaWYgKHJlZ19xdWV1ZSA9PSByZWctPnJlZ19sYXN0KQorCQkJcmVnLT5yZWdfbGFzdCA9IE5VTEw7CisJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnLT5yZWdfZmlyc3QtPk5leHQ7CisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJaWYgKHJlZy0+RVAwVk1fc3RhdHVzKSB7CisjaWZkZWYgX1BFX1JFR19EVU1QXworCQkJV0JERUJVRygoIkVQMCBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKKwkJCURlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCByZWctPkVQMFZNX3N0YXR1cyApOworI2VuZGlmCisJCQlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKwkJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8vIFN1Y2Nlc3MuIFVwZGF0ZSB0aGUgcmVzdWx0CisKKwkJCS8vIFN0YXJ0IHRoZSBuZXh0IHNlbmQKKwkJCVdiMzVSZWdfRVAwVk0ocEh3RGF0YSk7CisJCX0KKworICAgCQlrZnJlZShyZWdfcXVldWUpOworCX0KKworCXVzYl9mcmVlX3VyYih1cmIpOworfQorCisKK3ZvaWQKK1diMzVSZWdfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB1cmIJKnVyYjsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZTsKKworCisJVXh4X3Bvd2VyX29mZl9wcm9jZWR1cmUocEh3RGF0YSk7CisKKwkvLyBXYWl0IGZvciBSZWcgb3BlcmF0aW9uIGNvbXBsZXRlZAorCWRvIHsKKwkJbXNsZWVwKDEwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQorCX0gd2hpbGUgKHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCk7CisJbXNsZWVwKDEwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmIKKworCS8vIFJlbGVhc2UgYWxsIHRoZSBkYXRhIGluIFJlZ1F1ZXVlCisJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJd2hpbGUgKHJlZ19xdWV1ZSkgeworCQlpZiAocmVnX3F1ZXVlID09IHJlZy0+cmVnX2xhc3QpCisJCQlyZWctPnJlZ19sYXN0ID0gTlVMTDsKKwkJcmVnLT5yZWdfZmlyc3QgPSByZWctPnJlZ19maXJzdC0+TmV4dDsKKworCQl1cmIgPSByZWdfcXVldWUtPnVyYjsKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYgKHVyYikgeworCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCQlrZnJlZShyZWdfcXVldWUpOworCQl9IGVsc2UgeworCQkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJCVdCREVCVUcoKCJFUDAgcXVldWUgcmVsZWFzZSBlcnJvclxuIikpOworCQkJI2VuZGlmCisJCX0KKwkJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisKKwkJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJfQorCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaGUgZnVuY3Rpb24gY2FuIGJlIHJ1biBpbiBwYXNzaXZlLWxldmVsIG9ubHkuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhciBXYjM1UmVnX2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnPSZwSHdEYXRhLT5yZWc7CisJdTMyIGx0bXA7CisJdTMyIFNvZnR3YXJlU2V0LCBWQ09fdHJpbSwgVHhWZ2EsIFJlZ2lvbl9TY2FuSW50ZXJ2YWw7CisKKwkvLyBTcGluIGxvY2sgaXMgYWNxdWlyZWQgZm9yIHJlYWQgYW5kIHdyaXRlIElSUCBjb21tYW5kCisJc3Bpbl9sb2NrX2luaXQoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJLy8gR2V0dGluZyBSRiBtb2R1bGUgdHlwZSBmcm9tIEVFUFJPTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MGQwMDAwICk7IC8vIFN0YXJ0IEVFUFJPTSBhY2Nlc3MgKyBSZWFkICsgYWRkcmVzcygweDBkKQorCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJmx0bXAgKTsKKworCS8vVXBkYXRlIFJGIG1vZHVsZSB0eXBlIGFuZCBkZXRlcm1pbmUgdGhlIFBIWSB0eXBlIGJ5IGluZiBvciBFRVBST00KKwlyZWctPkVFUFJPTVBoeVR5cGUgPSAodTgpKCBsdG1wICYgMHhmZiApOworCS8vIDAgViBNQVgyODI1LCAxIFYgTUFYMjgyNywgMiBWIE1BWDI4MjgsIDMgViBNQVgyODI5CisJLy8gMTZWIEFMMjIzMCwgMTcgLSBBTDcyMzAsIDE4IC0gQUwyMjMwUworCS8vIDMyIFJlc2VydmVkCisJLy8gMzMgLSBXODlSRjI0MihUeFZHQSAwfjE5KSwgMzQgLSBXODlSRjI0MihUeFZHQSAwfjM0KQorCWlmIChyZWctPkVFUFJPTVBoeVR5cGUgIT0gUkZfREVDSURFX0JZX0lORikgeworCQlpZiggKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI1KQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI3KQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI4KQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI5KQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV9WMSkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzIyMzApCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV8yMjMwUykgICAgfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfQUlST0hBXzcyMzApCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX1dCXzI0MikJCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX1dCXzI0Ml8xKSkKKwkJCXBId0RhdGEtPnBoeV90eXBlID0gcmVnLT5FRVBST01QaHlUeXBlOworCX0KKworCS8vIFBvd2VyIE9uIHByb2NlZHVyZSBydW5uaW5nLiBUaGUgcmVsYXRpdmUgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IGFjY29yZGluZyB0byBwaHlfdHlwZQorCVV4eF9wb3dlcl9vbl9wcm9jZWR1cmUoIHBId0RhdGEgKTsKKworCS8vIFJlYWRpbmcgTUFDIGFkZHJlc3MKKwlVeHhfUmVhZEV0aGVybmV0QWRkcmVzcyggcEh3RGF0YSApOworCisJLy8gUmVhZCBWQ08gdHJpbSBmb3IgUkYgcGFyYW1ldGVyCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIwMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlZDT190cmltICk7CisKKwkvLyBSZWFkIEFudGVubmEgT24vT2ZmIG9mIHNvZnR3YXJlIGZsYWcKKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MjEwMDAwICk7CisJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmU29mdHdhcmVTZXQgKTsKKworCS8vIFJlYWQgVFhWR0EKKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MTAwMDAwICk7CisJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmVHhWZ2EgKTsKKworCS8vIEdldCBTY2FuIGludGVydmFsIHNldHRpbmcgZnJvbSBFRVBST00gb2Zmc2V0IDB4MWMKKwlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MWQwMDAwICk7CisJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmUmVnaW9uX1NjYW5JbnRlcnZhbCApOworCisJLy8gVXBkYXRlIEV0aGVybmV0IGFkZHJlc3MKKwltZW1jcHkoIHBId0RhdGEtPkN1cnJlbnRNYWNBZGRyZXNzLCBwSHdEYXRhLT5QZXJtYW5lbnRNYWNBZGRyZXNzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MgKTsKKworCS8vIFVwZGF0ZSBzb2Z0d2FyZSB2YXJpYWJsZQorCXBId0RhdGEtPlNvZnR3YXJlU2V0ID0gKHUxNikoU29mdHdhcmVTZXQgJiAweGZmZmYpOworCVR4VmdhICY9IDB4MDAwMDAwZmY7CisJcEh3RGF0YS0+UG93ZXJJbmRleEZyb21FRVBST00gPSAodTgpVHhWZ2E7CisJcEh3RGF0YS0+VkNPX3RyaW0gPSAodTgpVkNPX3RyaW0gJiAweGZmOworCWlmIChwSHdEYXRhLT5WQ09fdHJpbSA9PSAweGZmKQorCQlwSHdEYXRhLT5WQ09fdHJpbSA9IDB4Mjg7CisKKwlyZWctPkVFUFJPTVJlZ2lvbiA9ICh1OCkoUmVnaW9uX1NjYW5JbnRlcnZhbD4+OCk7IC8vIDIwMDYwNzIwCisJaWYoIHJlZy0+RUVQUk9NUmVnaW9uPDEgfHwgcmVnLT5FRVBST01SZWdpb24+NiApCisJCXJlZy0+RUVQUk9NUmVnaW9uID0gUkVHSU9OX0FVVE87CisKKwkvL0ZvciBHZXQgVHggVkdBIGZyb20gRUVQUk9NIDIwMDYwMzE1LjUgbW92ZSBoZXJlCisJR2V0VHhWZ2FGcm9tRUVQUk9NKCBwSHdEYXRhICk7CisKKwkvLyBTZXQgU2NhbiBJbnRlcnZhbAorCXBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWwgJiAweGZmKSAqIDEwOworCWlmICgocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9PSAyNTUwKSB8fCAocEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA8IDEwKSkgLy8gSXMgZGVmYXVsdCBzZXR0aW5nIDB4ZmYgKiAxMAorCQlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gU0NBTl9NQVhfQ0hOTF9USU1FOworCisJLy8gSW5pdGlhbCByZWdpc3RlcgorCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKKworCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIHdyaXRlLCBtdXN0IHdhaXQgdW50aWwgY29tcGxldGUKKworCVdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKHBId0RhdGEpOworCisJTXh4X2luaXRpYWwocEh3RGF0YSk7CisJRHh4X2luaXRpYWwocEh3RGF0YSk7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOyAvLyBJbml0aWFsIGZhaWwKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENhcmRDb21wdXRlQ3JjIC0tCisvLworLy8gIERlc2NyaXB0aW9uOgorLy8gICAgUnVucyB0aGUgQVVUT0RJTiBJSSBDUkMgYWxnb3JpdGhtIG9uIGJ1ZmZlciBCdWZmZXIgb2YgbGVuZ3RoLCBMZW5ndGguCisvLworLy8gIEFyZ3VtZW50czoKKy8vICAgIEJ1ZmZlciAtIHRoZSBpbnB1dCBidWZmZXIKKy8vICAgIExlbmd0aCAtIHRoZSBsZW5ndGggb2YgQnVmZmVyCisvLworLy8gIFJldHVybiBWYWx1ZToKKy8vICAgIFRoZSAzMi1iaXQgQ1JDIHZhbHVlLgorLy8KKy8vICBOb3RlOgorLy8gICAgVGhpcyBpcyBhZGFwdGVkIGZyb20gdGhlIGNvbW1lbnRzIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZQorLy8gICAgdmVyc2lvbiBpbiBfR0VOUkVRLkFTTSBvZiB0aGUgRFdCIE5FMTAwMC8yMDAwIGRyaXZlci4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordTMyCitDYXJkQ29tcHV0ZUNyYyh1OCAqIEJ1ZmZlciwgdTMyIExlbmd0aCkKK3sKKyAgICB1MzIgQ3JjLCBDYXJyeTsKKyAgICB1MzIgIGksIGo7CisgICAgdTggQ3VyQnl0ZTsKKworICAgIENyYyA9IDB4ZmZmZmZmZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTGVuZ3RoOyBpKyspIHsKKworICAgICAgICBDdXJCeXRlID0gQnVmZmVyW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKworICAgICAgICAgICAgQ2FycnkgICAgID0gKChDcmMgJiAweDgwMDAwMDAwKSA/IDEgOiAwKSBeIChDdXJCeXRlICYgMHgwMSk7CisgICAgICAgICAgICBDcmMgICAgIDw8PSAxOworICAgICAgICAgICAgQ3VyQnl0ZSA+Pj0gMTsKKworICAgICAgICAgICAgaWYgKENhcnJ5KSB7CisgICAgICAgICAgICAgICAgQ3JjID0oQ3JjIF4gMHgwNGMxMWRiNikgfCBDYXJyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDcmM7Cit9CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJpdFJldmVyc2UgLS0KKy8vICAgUmV2ZXJzZSB0aGUgYml0cyBpbiB0aGUgaW5wdXQgYXJndW1lbnQsIGR3RGF0YSwgd2hpY2ggaXMKKy8vICAgcmVnYXJkZWQgYXMgYSBzdHJpbmcgb2YgYml0cyB3aXRoIHRoZSBsZW5ndGgsIERhdGFMZW5ndGguCisvLworLy8gQXJndW1lbnRzOgorLy8gICBkd0RhdGEgICAgIDoKKy8vICAgRGF0YUxlbmd0aCA6CisvLworLy8gUmV0dXJuOgorLy8gICBUaGUgY29udmVydGVkIHZhbHVlLgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3UzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCkKK3sKKwl1MzIgICBIYWxmTGVuZ3RoLCBpLCBqOworCXUzMiAgIEJpdEEsIEJpdEI7CisKKwlpZiAoIERhdGFMZW5ndGggPD0gMCkgICAgICAgcmV0dXJuIDA7ICAgLy8gTm8gY29udmVyc2lvbiBpcyBkb25lLgorCWR3RGF0YSA9IGR3RGF0YSAmICgweGZmZmZmZmZmID4+ICgzMiAtIERhdGFMZW5ndGgpKTsKKworCUhhbGZMZW5ndGggPSBEYXRhTGVuZ3RoIC8gMjsKKwlmb3IgKCBpID0gMCwgaiA9IERhdGFMZW5ndGgtMSA7IGkgPCBIYWxmTGVuZ3RoOyBpKyssIGotLSkKKwl7CisJCUJpdEEgPSBHZXRCaXQoIGR3RGF0YSwgaSk7CisJCUJpdEIgPSBHZXRCaXQoIGR3RGF0YSwgaik7CisJCWlmIChCaXRBICYmICFCaXRCKSB7CisJCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBpKTsKKwkJCWR3RGF0YSA9IFNldEJpdCggZHdEYXRhLCBqKTsKKwkJfSBlbHNlIGlmICghQml0QSAmJiBCaXRCKSB7CisJCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaSk7CisJCQlkd0RhdGEgPSBDbGVhckJpdCggZHdEYXRhLCBqKTsKKwkJfSBlbHNlCisJCXsKKwkJCS8vIERvIG5vdGhpbmcgc2luY2UgdGhlc2UgdHdvIGJpdHMgYXJlIG9mIHRoZSBzYXZlIHZhbHVlcy4KKwkJfQorCX0KKworCXJldHVybiBkd0RhdGE7Cit9CisKK3ZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKQoreworCXUzMiBCQjNjLCBCQjU0OworCisJaWYgKChwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDIpIHx8CisJCShwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9XQl8yNDJfMSkpIHsKKwkJcGh5X2NhbGlicmF0aW9uX3dpbmJvbmQgKCBwSHdEYXRhLCAyNDEyICk7IC8vIFN5bmMgb3BlcmF0aW9uCisJCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTAzYywgJkJCM2MgKTsKKwkJV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgxMDU0LCAmQkI1NCApOworCisJCXBId0RhdGEtPkJCM2NfY2FsID0gQkIzYzsKKwkJcEh3RGF0YS0+QkI1NF9jYWwgPSBCQjU0OworCisJCVJGU3ludGhlc2l6ZXJfaW5pdGlhbChwSHdEYXRhKTsKKwkJQkJQcm9jZXNzb3JfaW5pdGlhbChwSHdEYXRhKTsgLy8gQXN5bmMgb3BlcmF0aW9uCisKKwkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTAzYywgQkIzYyApOworCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDU0LCBCQjU0ICk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3MjE1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfZi5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVSRUdfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAorCisjaW5jbHVkZSAid2JoYWxfcy5oIgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFV4eF9SZWFkRXRoZXJuZXRBZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIER4eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIE14eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFJGU3ludGhlc2l6ZXJfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOworLy92b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHM4IENoYW5uZWwgKTsKK3ZvaWQgUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCApOwordm9pZCBCQlByb2Nlc3Nvcl9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIEJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MTMuMQorLy92b2lkIFJGX1JhdGVDaGFuZ2luZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHJhdGUgKTsgLy8gMjAwNjA2MjYuNS5jIEFkZAordTggUkZTeW50aGVzaXplcl9TZXRQb3dlckluZGV4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUG93ZXJJbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjhfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfMjRQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjdfNTBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRNYXhpbTI4MjVQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRBaXJvaGEyMjMwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhNzIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldFdpbmJvbmQyNDJQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordm9pZCBHZXRUeFZnYUZyb21FRVBST00oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgRUVQUk9NVHhWZ2FBZGp1c3QoICBwaHdfZGF0YV90IHBId0RhdGEgKTsgLy8gMjAwNjA2MTkuNSBBZGQKKworI2RlZmluZSBSRldyaXRlQ29udHJvbERhdGEoIF9BLCBfViApIFdiMzVSZWdfV3JpdGUoIF9BLCAweDA4NjQsIF9WICkKKwordm9pZCBXYjM1UmVnX2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKKwordW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWQoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBXYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19Xcml0ZVN5bmMoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggIHBod19kYXRhX3QgcEh3RGF0YSwKKwkJCQkJCQkJIHUxNiBSZWdpc3Rlck5vLAorCQkJCQkJCQkgdTMyIFJlZ2lzdGVyVmFsdWUsCisJCQkJCQkJCSBzOCAqcFZhbHVlLAorCQkJCQkJCQkgczggTGVuKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19CdXJzdFdyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgKiBwUmVnaXN0ZXJEYXRhLCAgdTggTnVtYmVyT2ZEYXRhLCAgdTggRmxhZyApOworCit2b2lkIFdiMzVSZWdfRVAwVk0oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgV2IzNVJlZ19FUDBWTV9zdGFydCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYik7CisKK3UzMiBCaXRSZXZlcnNlKCB1MzIgZHdEYXRhLCB1MzIgRGF0YUxlbmd0aCk7CisKK3ZvaWQgQ2FyZEdldE11bHRpY2FzdEJpdCggICB1OCBBZGRyZXNzW01BQ19BRERSX0xFTkdUSF0sICB1OCAqQnl0ZSwgIHU4ICpWYWx1ZSApOwordTMyIENhcmRDb21wdXRlQ3JjKCAgdTggKiBCdWZmZXIsICB1MzIgTGVuZ3RoICk7CisKK3ZvaWQgV2IzNVJlZ19waHlfY2FsaWJyYXRpb24oICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgV2IzNVJlZ19VcGRhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIGFkanVzdF9UWFZHQV9mb3JfaXFfbWFnKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVmNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVSRUdfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1UkVHX1NfSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qCisJCQkJSEFMIHNldHRpbmcgZnVuY3Rpb24KKworCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCXxVeHh8IAl8RHh4fAl8TXh4fAl8QkJ8CXxSRnwKKwkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJfAkJCQkJfAorCQlXYjM1UmVnX1JlYWQJCVdiMzVSZWdfV3JpdGUKKworCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJV2JVc2JfQ2FsbFVTQkRBU3luYwkJCQkJc3VwcGxpZWQgQnkgV2JVc2IgbW9kdWxlCisqLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSAgICAgR2V0Qml0KCBkd0RhdGEsIGkpICAgICAgKCBkd0RhdGEgJiAoMHgwMDAwMDAwMSA8PCBpKSkKKyNkZWZpbmUgICAgIFNldEJpdCggZHdEYXRhLCBpKSAgICAgICggZHdEYXRhIHwgKDB4MDAwMDAwMDEgPDwgaSkpCisjZGVmaW5lICAgICBDbGVhckJpdCggZHdEYXRhLCBpKSAgICAoIGR3RGF0YSAmIH4oMHgwMDAwMDAwMSA8PCBpKSkKKworI2RlZmluZQkJSUdOT1JFX0lOQ1JFTUVOVAkwCisjZGVmaW5lCQlBVVRPX0lOQ1JFTUVOVAkJMAorI2RlZmluZQkJTk9fSU5DUkVNRU5UCQkxCisjZGVmaW5lIFJFR19ESVJFQ1RJT04oX3gsX3kpICAgKChfeSktPkRJUkVDVCA9PTAgPyB1c2JfcmN2Y3RybHBpcGUoX3gsMCkgOiB1c2Jfc25kY3RybHBpcGUoX3gsMCkpCisjZGVmaW5lIFJFR19CVUZfU0laRShfeCkgICAgICAgKChfeCktPmJSZXF1ZXN0PT0gMHgwNCA/IGNwdV90b19sZTE2KChfeCktPndMZW5ndGgpIDogNCkKKworLy8gMjAwNjA2MTMuMiBBZGQgdGhlIGZvbGxvdyBkZWZpbml0aW9uCisjZGVmaW5lIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCCQkweDAwMzM0NDdjCisjZGVmaW5lIEJCNENfREVGQVVMVF9BTDIyMzBfMTFCCQkweDBBMDBGRUZGCisjZGVmaW5lIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHCQkweDAwMzMyQzFCCisjZGVmaW5lIEJCNENfREVGQVVMVF9BTDIyMzBfMTFHCQkweDBBMDBGRUZGCisKKworI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCCQkweDAwMjkyMzE1CS8vYmFja29mZiAgMmRCCisjZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDgwMEZFRkYJLy9iYWNrb2ZmICAyZEIKKy8vI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCCQkweDAwMjAxQjExCS8vYmFja29mZiAgNGRCCisvLyNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExQgkJMHgwNjAwRkYwMAkvL2JhY2tvZmYgIDRkQgorI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHCQkweDAwNDUzQjI0CisjZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUcJCTB4MEUwMEZFRkYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlZmF1bHQgc2V0dGluZyBmb3IgTXh4CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBERUZBVUxUX0NXTUlOCQkJCQkzMQkJLy8oTTJDKSBDV21pbi4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTMxLgorI2RlZmluZSBERUZBVUxUX0NXTUFYCQkJCQkxMDIzCS8vKE0yQykgQ1dtYXguIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDIzLgorI2RlZmluZSBERUZBVUxUX0FJRAkJCQkJCTEJCS8vKE0zNCkgQUlELiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDEtMjAwNy4KKworI2lmZGVmIF9VU0VfRkFMTEJBQ0tfUkFURV8KKyNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCQkyCQkvLyhNMzgpIGFzIG5hbWVkCisjZWxzZQorI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgYXMgbmFtZWQKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfTE9OR19SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBMb25nUmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgorI2RlZmluZSBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIFNob3J0UmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgorI2RlZmluZSBERUZBVUxUX1BJRlNUCQkJCQkyNQkJLy8oTTNDKSBQSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9FSUZTVAkJCQkJMzU0CQkvLyhNM0MpIEVJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTEwNDg1NzUuCisjZGVmaW5lIERFRkFVTFRfRElGU1QJCQkJCTQ1CQkvLyhNM0MpIERJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX1NJRlNUCQkJCQk1CQkvLyhNM0MpIFNJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX09TSUZTVAkJCQkJMTAJCS8vKE0zQykgT3JpZ2luYWwgU0lGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCisjZGVmaW5lIERFRkFVTFRfQVRJTVdECQkJCQkwCQkvLyhNNDApIEFUSU0gV2luZG93LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfU0xPVF9USU1FCQkJCTIwCQkvLyhNNDApICgkKSBTbG90VGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTI1NS4KKyNkZWZpbmUgREVGQVVMVF9NQVhfVFhfTVNEVV9MSUZFX1RJTUUJNTEyCS8vKE00NCkgTWF4VHhNU0RVTGlmZVRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC00Mjk0OTY3Mjk1LgorI2RlZmluZSBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTAkJCTUwMAkJLy8oTTQ4KSBCZWFjb24gSW50ZXJ2YWwuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9QUk9CRV9ERUxBWV9USU1FCQkyMDAJCS8vKE00OCkgUHJvYmUgRGVsYXkgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX1BST1RPQ09MX1ZFUlNJT04JCTAJCS8vKE00QykKKyNkZWZpbmUgREVGQVVMVF9NQUNfUE9XRVJfU1RBVEUJCQkyCQkvLyhNNEMpIDI6IE1BQyBhdCBwb3dlciBhY3RpdmUKKyNkZWZpbmUgREVGQVVMVF9EVElNX0FMRVJUX1RJTUUJCQkwCisKKworc3RydWN0IHdiMzVfcmVnX3F1ZXVlIHsKKwlzdHJ1Y3QgdXJiIAkqdXJiOworCXZvaWQJCSpwVXNiUmVxOworCXZvaWQJCSpOZXh0OworCXVuaW9uIHsKKwkJdTMyCVZBTFVFOworCQl1MzIJKnBCdWZmZXI7CisJfTsKKwl1OAkJUkVTRVJWRURbNF07IC8vIHNwYWNlIHJlc2VydmVkIGZvciBjb21tdW5pY2F0aW9uCisJdTE2CQlJTkRFWDsgLy8gRm9yIHN0b3JpbmcgdGhlIHJlZ2lzdGVyIGluZGV4CisJdTgJCVJFU0VSVkVEX1ZBTElEOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBSRVNFUlZFRCBzcGFjZSBpcyB2YWxpZCBhdCB0aGlzIGNvbW1hbmQuCisJdTgJCURJUkVDVDsgLy8gMDpJbiAgIDE6T3V0Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTUFYX1NRM19GSUxURVJfU0laRQkJNQorc3RydWN0IHdiMzVfcmVnIHsKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBSZWdpc3RlciBCYW5rIGJhY2t1cAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXUzMglVMUIwOwkJCS8vYml0MTYgcmVjb3JkIHRoZSBoL3cgcmFkaW8gb24vb2ZmIHN0YXR1cworCXUzMglVMUJDX0xFRENvbmZpZ3VyZTsKKwl1MzIJRDAwX0RtYUNvbnRyb2w7CisJdTMyCU0wMF9NYWNDb250cm9sOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMglNMDRfTXVsdGljYXN0QWRkcmVzczE7CisJCQl1MzIJTTA4X011bHRpY2FzdEFkZHJlc3MyOworCQl9OworCQl1OAkJTXVsdGljYXN0WzhdOwkvLyBjb250ZW50cyBvZiBjYXJkIG11bHRpY2FzdCByZWdpc3RlcnMKKwl9OworCisJdTMyCU0yNF9NYWNDb250cm9sOworCXUzMglNMjhfTWFjQ29udHJvbDsKKwl1MzIJTTJDX01hY0NvbnRyb2w7CisJdTMyCU0zOF9NYWNDb250cm9sOworCXUzMglNM0NfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTQwX01hY0NvbnRyb2w7CisJdTMyCU00NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNDhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTRDX01hY1N0YXR1czsKKwl1MzIJTTYwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU02OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNzBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTc0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU03OF9FUlBJbmZvcm1hdGlvbjsvLzkzMDIwNi4yLmIKKwl1MzIJTTdDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU04MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNODRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTg4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU05OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCisJLy9bMjAwNDA3MjIgV0tdCisJLy9CYXNlYmFuZCByZWdpc3RlcgorCXUzMglCQjBDOwkvLyBVc2VkIGZvciBMTkEgY2FsY3VsYXRpb24KKwl1MzIJQkIyQzsJLy8KKwl1MzIJQkIzMDsJLy8xMWIgYWNxdWlzaXRpb24gY29udHJvbCByZWdpc3RlcgorCXUzMglCQjNDOworCXUzMglCQjQ4OwkvLyAyMDA1MTIyMS4xLmEgMjAwNjA2MTMuMSBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQorCXUzMglCQjRDOwkvLyAyMDA2MDYxMy4xICBGaXggT0JXIGlzc3VlIG9mIDExYi8xMWcgcmF0ZQorCXUzMglCQjUwOwkvL21vZGUgY29udHJvbCByZWdpc3RlcgorCXUzMglCQjU0OworCXUzMiAJQkI1ODsJLy9JUV9BTFBIQQorCXUzMglCQjVDOwkvLyBGb3IgdGVzdAorCXUzMglCQjYwOwkvLyBmb3IgV1RPIHJlYWQgdmFsdWUKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFZNCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tCisJc3BpbmxvY2tfdAlFUDBWTV9zcGluX2xvY2s7IC8vIDRCCisJdTMyCSAgICAgICAgRVAwVk1fc3RhdHVzOy8vJCQKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19maXJzdDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19sYXN0OworCWF0b21pY190ICAgICAgIFJlZ0ZpcmVDb3VudDsKKworCS8vIEhhcmR3YXJlIHN0YXR1cworCXU4CUVQMHZtX3N0YXRlOworCXU4CW1hY19wb3dlcl9zYXZlOworCXU4CUVFUFJPTVBoeVR5cGU7IC8vIDAgfiAxNSBmb3IgTWF4aW0gKDAgxIRWIE1BWDI4MjUsIDEgxIRWIE1BWDI4MjcsIDIgxIRWIE1BWDI4MjgsIDMgxIRWIE1BWDI4MjkpLAorCQkJCQkJICAgLy8gMTYgfiAzMSBmb3IgQWlyb2hhICgxNiDEhFYgQUwyMjMwLCAxMSAtIEFMNzIzMCkKKwkJCQkJCSAgIC8vIDMyIH4gUmVzZXJ2ZWQKKwkJCQkJCSAgIC8vIDMzIH4gNDcgRm9yIFdCMjQyICggMzMgLSBXQjI0MiwgMzQgLSBXQjI0MiB3aXRoIG5ldyBUeHZnYSAwLjUgZGIgc3RlcCkKKwkJCQkJCSAgIC8vIDQ4IH4gMjU1IEFSRSBSRVNFUlZFRC4KKwl1OAlFRVBST01SZWdpb247CS8vUmVnaW9uIHNldHRpbmcgaW4gRUVQUk9NCisKKwl1MzIJU3luY0lvUGF1c2U7IC8vIElmIHVzZXIgdXNlIHRoZSBTeW5jIElvIHRvIGFjY2VzcyBIdywgdGhlbiBwYXVzZSB0aGUgYXN5bmMgYWNjZXNzCisKKwl1OAlMTkFWYWx1ZVs0XTsgLy9UYWJsZSBmb3Igc3BlZWQgdXAgcnVubmluZworCXUzMglTUTNfZmlsdGVyW01BWF9TUTNfRklMVEVSX1NJWkVdOworCXUzMglTUTNfaW5kZXg7CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhiNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgorLy8KKy8vICBNb2R1bGUgTmFtZToKKy8vICAgIFdiMzVSeC5jCisvLworLy8gIEFic3RyYWN0OgorLy8gICAgUHJvY2Vzc2luZyB0aGUgUnggbWVzc2FnZSBmcm9tIGRvd24gbGF5ZXIKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJzeXNkZWYuaCIKKyNpbmNsdWRlICJ3YjM1cnhfZi5oIgorCitzdGF0aWMgdm9pZCBwYWNrZXRfY2FtZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywgaW50IFBhY2tldFNpemUpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7MH07CisKKwlpZiAoIXByaXYtPmVuYWJsZWQpCisJCXJldHVybjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoUGFja2V0U2l6ZSk7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcGFja2V0LCBGSVhNRVxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChza2IsIFBhY2tldFNpemUpLAorCSAgICAgICBwUnhCdWZmZXJBZGRyZXNzLAorCSAgICAgICBQYWNrZXRTaXplKTsKKworLyoKKwlyeF9zdGF0dXMucmF0ZSA9IDEwOworCXJ4X3N0YXR1cy5jaGFubmVsID0gMTsKKwlyeF9zdGF0dXMuZnJlcSA9IDEyMzQ1OworCXJ4X3N0YXR1cy5waHltb2RlID0gTU9ERV9JRUVFODAyMTFCOworKi8KKworCWllZWU4MDIxMV9yeF9pcnFzYWZlKGh3LCBza2IsICZyeF9zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBXYjM1UnhfYWRqdXN0KFBERVNDUklQVE9SIHBSeERlcykKK3sKKwl1MzIgKglwUnhCdWZmZXJBZGRyZXNzOworCXUzMglEZWNyeXB0aW9uTWV0aG9kOworCXUzMglpOworCXUxNglCdWZmZXJTaXplOworCisJRGVjcnlwdGlvbk1ldGhvZCA9IHBSeERlcy0+UjAxLlIwMV9kZWNyeXB0aW9uX21ldGhvZDsKKwlwUnhCdWZmZXJBZGRyZXNzID0gcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXTsKKwlCdWZmZXJTaXplID0gcFJ4RGVzLT5idWZmZXJfc2l6ZVswXTsKKworCS8vIEFkanVzdCB0aGUgbGFzdCBwYXJ0IG9mIGRhdGEuIE9ubHkgZGF0YSBsZWZ0CisJQnVmZmVyU2l6ZSAtPSA0OyAvLyBGb3IgQ1JDLTMyCisJaWYgKERlY3J5cHRpb25NZXRob2QpCisJCUJ1ZmZlclNpemUgLT0gNDsKKwlpZiAoRGVjcnlwdGlvbk1ldGhvZCA9PSAzKSAvLyBGb3IgQ0NNUAorCQlCdWZmZXJTaXplIC09IDQ7CisKKwkvLyBBZGp1c3QgdGhlIElWIGZpZWxkIHdoaWNoIGFmdGVyIDgwMi4xMSBoZWFkZXIgYW5kIElDViBmaWVsZC4KKwlpZiAoRGVjcnlwdGlvbk1ldGhvZCA9PSAxKSAvLyBGb3IgV0VQCisJeworCQlmb3IoIGk9NjsgaT4wOyBpLS0gKQorCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0xXTsKKwkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAxOworCQlCdWZmZXJTaXplIC09IDQ7IC8vIDQgYnl0ZSBmb3IgSVYKKwl9CisJZWxzZSBpZiggRGVjcnlwdGlvbk1ldGhvZCApIC8vIEZvciBUS0lQIGFuZCBDQ01QCisJeworCQlmb3IgKGk9NzsgaT4xOyBpLS0pCisJCQlwUnhCdWZmZXJBZGRyZXNzW2ldID0gcFJ4QnVmZmVyQWRkcmVzc1tpLTJdOworCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDI7Ly9VcGRhdGUgdGhlIGRlc2NyaXB0b3IsIHNoaWZ0IDggYnl0ZQorCQlCdWZmZXJTaXplIC09IDg7IC8vIDggYnl0ZSBmb3IgSVYgKyBJQ1YKKwl9CisJcFJ4RGVzLT5idWZmZXJfc2l6ZVswXSA9IEJ1ZmZlclNpemU7Cit9CisKK3N0YXRpYyB1MTYgV2IzNVJ4X2luZGljYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCURFU0NSSVBUT1IJUnhEZXM7CisJUFdCMzVSWAlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKwl1OCAqCQlwUnhCdWZmZXJBZGRyZXNzOworCXUxNgkJUGFja2V0U2l6ZTsKKwl1MTYJCXN0bXAsIEJ1ZmZlclNpemUsIHN0bXAyID0gMDsKKwl1MzIJCVJ4QnVmZmVySWQ7CisKKwkvLyBPbmx5IG9uZSB0aHJlYWQgYmUgYWxsb3dlZCB0byBydW4gaW50byB0aGUgZm9sbG93aW5nCisJZG8geworCQlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXg7CisJCWlmIChwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0pIC8vT3duZXIgYnkgVk0KKwkJCWJyZWFrOworCisJCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4Kys7CisJCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4ICU9IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsKKworCQlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKKwkJQnVmZmVyU2l6ZSA9IHBXYjM1UngtPlJ4QnVmZmVyU2l6ZVsgUnhCdWZmZXJJZCBdOworCisJCS8vIFBhcnNlIHRoZSBidWxraW4gYnVmZmVyCisJCXdoaWxlIChCdWZmZXJTaXplID49IDQpIHsKKwkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09IFJYX0VORF9UQUcpIC8vSXMgZW5kaW5nPyA5MjEwMDIuOS5hCisJCQkJYnJlYWs7CisKKwkJCS8vIEdldCB0aGUgUjAwIFIwMSBmaXJzdAorCQkJUnhEZXMuUjAwLnZhbHVlID0gbGUzMl90b19jcHUoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKTsKKwkJCVBhY2tldFNpemUgPSAodTE2KVJ4RGVzLlIwMC5SMDBfcmVjZWl2ZV9ieXRlX2NvdW50OworCQkJUnhEZXMuUjAxLnZhbHVlID0gbGUzMl90b19jcHUoKigodTMyICopKHBSeEJ1ZmZlckFkZHJlc3MrNCkpKTsKKwkJCS8vIEZvciBuZXcgRE1BIDRrCisJCQlpZiAoKFBhY2tldFNpemUgJiAweDAzKSA+IDApCisJCQkJUGFja2V0U2l6ZSAtPSA0OworCisJCQkvLyBCYXNpYyBjaGVjayBmb3IgUnggbGVuZ3RoLiBJcyBsZW5ndGggdmFsaWQ/CisJCQlpZiAoUGFja2V0U2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgeworCQkJCSNpZmRlZiBfUEVfUlhfRFVNUF8KKwkJCQlXQkRFQlVHKCgiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpKTsKKwkJCQkjZW5kaWYKKworCQkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwkJCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBTdGFydCB0byBwcm9jZXNzIFJ4IGJ1ZmZlcgorLy8JCQlSeERlcy5EZXNjcmlwdG9yX0lEID0gUnhCdWZmZXJJZDsgLy8gRHVlIHRvIHN5bmNocm9ub3VzIGluZGljYXRlLCB0aGUgZmllbGQgZG9lc24ndCBuZWNlc3NhcnkgdG8gdXNlLgorCQkJQnVmZmVyU2l6ZSAtPSA4OyAvL3N1YnRyYWN0IDggYnl0ZSBmb3IgMzUncyBVU0IgaGVhZGVyIGxlbmd0aAorCQkJcFJ4QnVmZmVyQWRkcmVzcyArPSA4OworCisJCQlSeERlcy5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3M7CisJCQlSeERlcy5idWZmZXJfc2l6ZVswXSA9IFBhY2tldFNpemU7CisJCQlSeERlcy5idWZmZXJfbnVtYmVyID0gMTsKKwkJCVJ4RGVzLmJ1ZmZlcl9zdGFydF9pbmRleCA9IDA7CisJCQlSeERlcy5idWZmZXJfdG90YWxfc2l6ZSA9IFJ4RGVzLmJ1ZmZlcl9zaXplWzBdOworCQkJV2IzNVJ4X2FkanVzdCgmUnhEZXMpOworCisJCQlwYWNrZXRfY2FtZShodywgcFJ4QnVmZmVyQWRkcmVzcywgUGFja2V0U2l6ZSk7CisKKwkJCS8vIE1vdmUgUnhCdWZmZXIgcG9pbnQgdG8gdGhlIG5leHQKKwkJCXN0bXAgPSBQYWNrZXRTaXplICsgMzsKKwkJCXN0bXAgJj0gfjB4MDM7IC8vIDRuIGFsaWdubWVudAorCQkJcFJ4QnVmZmVyQWRkcmVzcyArPSBzdG1wOworCQkJQnVmZmVyU2l6ZSAtPSBzdG1wOworCQkJc3RtcDIgKz0gc3RtcDsKKwkJfQorCisJCS8vIFJlY2xhaW0gcmVzb3VyY2UKKwkJcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMTsKKwl9IHdoaWxlICh0cnVlKTsKKworCXJldHVybiBzdG1wMjsKK30KKworc3RhdGljIHZvaWQgV2IzNVJ4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworc3RhdGljIHZvaWQgV2IzNVJ4X0NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlQV0IzNVJYCQlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKwl1OCAqCQlwUnhCdWZmZXJBZGRyZXNzOworCXUzMgkJU2l6ZUNoZWNrOworCXUxNgkJQnVsa0xlbmd0aDsKKwl1MzIJCVJ4QnVmZmVySWQ7CisJUjAwX0RFU0NSSVBUT1IgCVIwMDsKKworCS8vIFZhcmlhYmxlIHNldHRpbmcKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKwlwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgPSB1cmItPnN0YXR1czsvL1N0b3JlIHRoZSBsYXN0IHJlc3VsdCBvZiBJcnAKKworCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5DdXJyZW50UnhCdWZmZXJJZDsKKworCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OworCUJ1bGtMZW5ndGggPSAodTE2KXVyYi0+YWN0dWFsX2xlbmd0aDsKKworCS8vIFRoZSBJUlAgaXMgY29tcGxldGVkCisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZAorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvLyBTdGFydCB0byBwcm9jZXNzIHRoZSBkYXRhIG9ubHkgaW4gc3VjY2Vzc2Z1bCBjb25kaXRpb24KKwlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAwOyAvLyBTZXQgdGhlIG93bmVyIHRvIGRyaXZlcgorCVIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7CisKKwkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAorCWlmIChwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgIT0gMCkgeworCQkjaWZkZWYgX1BFX1VTQl9TVEFURV9EVU1QXworCQlXQkRFQlVHKCgiRVAzIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOworCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcFdiMzVSeC0+RVAzVk1fc3RhdHVzICk7CisJCSNlbmRpZgorCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLy8gMjAwNjAyMjAgRm9yIHJlY292ZXJpbmcuIGNoZWNrIGlmIG9wZXJhdGluZyBpbiBzaW5nbGUgVVNCIG1vZGUKKwlpZiAoIUhBTF9VU0JfTU9ERV9CVVJTVChwSHdEYXRhKSkgeworCQlTaXplQ2hlY2sgPSBSMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsgIC8vMjAwNjA5MjYgYW5zb24ncyBlbmRpYW4KKwkJaWYgKChTaXplQ2hlY2sgJiAweDAzKSA+IDApCisJCQlTaXplQ2hlY2sgLT0gNDsKKwkJU2l6ZUNoZWNrID0gKFNpemVDaGVjayArIDMpICYgfjB4MDM7CisJCVNpemVDaGVjayArPSAxMjsgLy8gOCArIDQgYmFkYmVlZgorCQlpZiAoKEJ1bGtMZW5ndGggPiAxNjAwKSB8fAorCQkJKFNpemVDaGVjayA+IDE2MDApIHx8CisJCQkoQnVsa0xlbmd0aCAhPSBTaXplQ2hlY2spIHx8CisJCQkoQnVsa0xlbmd0aCA9PSAwKSkgeyAvLyBBZGQgZm9yIGZhaWwgVXJiCisJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOworCQl9CisJfQorCisJLy8gSW5kaWNhdGluZyB0aGUgcmVjZWl2aW5nIGRhdGEKKwlwV2IzNVJ4LT5CeXRlUmVjZWl2ZWQgKz0gQnVsa0xlbmd0aDsKKwlwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXSA9IEJ1bGtMZW5ndGg7CisKKwlpZiAoIXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSkKKwkJV2IzNVJ4X2luZGljYXRlKGh3KTsKKworCWtmcmVlKHBXYjM1UngtPnBEUngpOworCS8vIERvIHRoZSBuZXh0IHJlY2VpdmUKKwlXYjM1UngoaHcpOworCXJldHVybjsKKworZXJyb3I6CisJcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMTsgLy8gU2V0IHRoZSBvd25lciB0byBoYXJkd2FyZQorCWF0b21pY19kZWMoJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpOworCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmVlbnRyYWluCitzdGF0aWMgdm9pZCBXYjM1Ungoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJUFdCMzVSWAlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKwl1OCAqCXBSeEJ1ZmZlckFkZHJlc3M7CisJc3RydWN0IHVyYiAqdXJiID0gcFdiMzVSeC0+UnhVcmI7CisJaW50CXJldHY7CisJdTMyCVJ4QnVmZmVySWQ7CisKKwkvLworCS8vIElzc3VpbmcgVVJCCisJLy8KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvLyBHZXQgUnhCdWZmZXIncyBJRAorCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5SeEJ1ZmZlcklkOworCWlmICghcFdiMzVSeC0+UnhPd25lcltSeEJ1ZmZlcklkXSkgeworCQkvLyBJdCdzIGltcG9zc2libGUgdG8gcnVuIGhlcmUuCisJCSNpZmRlZiBfUEVfUlhfRFVNUF8KKwkJV0JERUJVRygoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKSk7CisJCSNlbmRpZgorCQlnb3RvIGVycm9yOworCX0KKworCS8vIFVwZGF0ZSBidWZmZXIgcG9pbnQsIHRoZW4gc3RhcnQgdG8gYnVsa2luIHRoZSBkYXRhIGZyb20gVVNCCisJcFdiMzVSeC0+UnhCdWZmZXJJZCsrOworCXBXYjM1UngtPlJ4QnVmZmVySWQgJT0gTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOworCisJcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQgPSBSeEJ1ZmZlcklkOworCisJcFdiMzVSeC0+cERSeCA9IGt6YWxsb2MoTUFYX1VTQl9SWF9CVUZGRVIsIEdGUF9BVE9NSUMpOworCWlmICghcFdiMzVSeC0+cERSeCkgeworCQlwcmludGsoInczNXVuZDogUnggbWVtb3J5IGFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OworCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMyksCisJCQkgIHBSeEJ1ZmZlckFkZHJlc3MsIE1BWF9VU0JfUlhfQlVGRkVSLAorCQkJICBXYjM1UnhfQ29tcGxldGUsIGh3KTsKKworCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fUlVOTklORzsKKworCXJldHYgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJaWYgKHJldHYgIT0gMCkgeworCQlwcmludGsoIlJ4IFVSQiBzZW5kaW5nIGVycm9yXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcmV0dXJuOworCitlcnJvcjoKKwkvLyBWTSBzdG9wCisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCWF0b21pY19kZWMoJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpOworfQorCit2b2lkIFdiMzVSeF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCisJLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIHRoZSBXYjM1UngoKSBmdW5jdGlvbgorCWlmIChhdG9taWNfaW5jX3JldHVybigmcFdiMzVSeC0+UnhGaXJlQ291bnRlcikgPT0gMSkgeworCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJCVdiMzVSeChodyk7CisJfSBlbHNlCisJCWF0b21pY19kZWMoJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N0YXRpYyB2b2lkIFdiMzVSeF9yZXNldF9kZXNjcmlwdG9yKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCXUzMglpOworCisJcFdiMzVSeC0+Qnl0ZVJlY2VpdmVkID0gMDsKKwlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCA9IDA7CisJcFdiMzVSeC0+UnhCdWZmZXJJZCA9IDA7CisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCXBXYjM1UngtPnJ4X2hhbHQgPSAwOworCisJLy8gSW5pdGlhbCB0aGUgUXVldWUuIFRoZSBsYXN0IGJ1ZmZlciBpcyByZXNlcnZlZCBmb3IgdXNlZCBpZiB0aGUgUnggcmVzb3VyY2UgaXMgdW5hdmFpbGFibGUuCisJZm9yKCBpPTA7IGk8TUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSOyBpKysgKQorCQlwV2IzNVJ4LT5SeE93bmVyW2ldID0gMTsKK30KKwordW5zaWduZWQgY2hhciBXYjM1UnhfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKworCS8vIEluaXRpYWwgdGhlIEJ1ZmZlciBRdWV1ZQorCVdiMzVSeF9yZXNldF9kZXNjcmlwdG9yKCBwSHdEYXRhICk7CisKKwlwV2IzNVJ4LT5SeFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJcmV0dXJuICghIXBXYjM1UngtPlJ4VXJiKTsKK30KKwordm9pZCBXYjM1Unhfc3RvcChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKworCS8vIENhbmNlbGluZyB0aGUgSXJwIGlmIGFscmVhZHkgc2VuZHMgaXQgb3V0LgorCWlmIChwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKSB7CisJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVJ4LT5SeFVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0KKwkJI2lmZGVmIF9QRV9SWF9EVU1QXworCQlXQkRFQlVHKCgiRVAzIFJ4IHN0b3BcbiIpKTsKKwkJI2VuZGlmCisJfQorfQorCisvLyBOZWVkcyBwcm9jZXNzIGNvbnRleHQKK3ZvaWQgV2IzNVJ4X2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwlkbyB7CisJCW1zbGVlcCgxMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKKwl9IHdoaWxlIChwV2IzNVJ4LT5FUDN2bV9zdGF0ZSAhPSBWTV9TVE9QKTsKKwltc2xlZXAoMTApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBleGl0IDk0MDYyMy4xLmIKKworCWlmIChwV2IzNVJ4LT5SeFVyYikKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVJ4LT5SeFVyYiApOworCSNpZmRlZiBfUEVfUlhfRFVNUF8KKwlXQkRFQlVHKCgiV2IzNVJ4X2Rlc3Ryb3kgT0tcbiIpKTsKKwkjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MzA0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0IzNVJYX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJYX0ZfSAorCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSAid2JoYWxfcy5oIgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1bnNpZ25lZCBjaGFyCQlXYjM1UnhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZAkJV2IzNVJ4X2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQJCVdiMzVSeF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkCQlXYjM1Unhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODM1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gd2IzNXJ4LmggLS0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBEZWZpbml0aW9uIGZvciB0aGlzIG1vZHVsZSB1c2VkCisjZGVmaW5lIE1BWF9VU0JfUlhfQlVGRkVSCTQwOTYJLy8gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSA0MDk2IDkzMTEzMC40LmYKKworI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIJRVRIRVJORVRfUlhfREVTQ1JJUFRPUlMJCS8vIE1heGltdW0gMjU0LCAyNTUgaXMgUkVTRVJWRUQgSUQKKyNkZWZpbmUgUlhfSU5URVJGQUNFCQkJCTAJLy8gSW50ZXJmYWNlIDEKKyNkZWZpbmUgUlhfUElQRQkJCQkJCTIJLy8gUGlwZSAzCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRQkJCQkxNjAwIC8vMTU2OAkvLyA4ICsgMTUzMiArIDQgKyAyNChJViBFSVYgTUlDIElDViBDUkMpIGZvciBjaGVjayBETUEgZGF0YSA5MzExMzAuNC5nCisjZGVmaW5lIFJYX0VORF9UQUcJCQkJCTB4MGJhZGJlZWYKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3R5cGVkZWYgc3RydWN0IF9XQjM1UlgKK3sKKwl1MzIJCQlCeXRlUmVjZWl2ZWQ7Ly8gRm9yIGNhbGN1bGF0aW5nIHRocm91Z2hwdXQgb2YgQnVsa0luCisJYXRvbWljX3QJCVJ4RmlyZUNvdW50ZXI7Ly8gRG9lcyBXYjM1UnggbW9kdWxlIGZpcmU/CisKKwl1OAlSeEJ1ZmZlclsgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSIF1bICgoTUFYX1VTQl9SWF9CVUZGRVIrMykgJiB+MHgwMyApIF07CisJdTE2CVJ4QnVmZmVyU2l6ZVsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMSkgJiB+MHgwMSkgXTsKKwl1OAlSeE93bmVyWyAoKE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiszKSAmIH4weDAzICkgXTsvL093bmVyc2hpcCBvZiBidWZmZXIgIDA6IFNXIDE6SFcKKworCXUzMglSeFByb2Nlc3NJbmRleDsvL1RoZSBuZXh0IGluZGV4IHRvIHByb2Nlc3MKKwl1MzIJUnhCdWZmZXJJZDsKKwl1MzIJRVAzdm1fc3RhdGU7CisKKwl1MzIJcnhfaGFsdDsgLy8gRm9yIFZNIHN0b3BwaW5nCisKKwl1MTYJTW9yZURhdGFTaXplOworCXUxNglQYWNrZXRTaXplOworCisJdTMyCUN1cnJlbnRSeEJ1ZmZlcklkOyAvLyBGb3IgY29tcGxldGUgcm91dGluZSB1c2FnZQorCXUzMglSeDNVcmJDYW5jZWw7CisKKwl1MzIJTGFzdFIxOyAvLyBGb3IgUlNTSSByZXBvcnRpbmcKKwlzdHJ1Y3QgdXJiICoJCQkJUnhVcmI7CisJdTMyCQlFcDNFcnJvckNvdW50MjsgLy8gMjAwNjA2MjUuMSBVc2JkIGZvciBSeCBETUEgZXJyb3IgY291bnQKKworCWludAkJRVAzVk1fc3RhdHVzOworCXU4ICoJcERSeDsKKworfSBXQjM1UlgsICpQV0IzNVJYOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliNDQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eC5jCkBAIC0wLDAgKzEsMzA1IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KKy8vCisvLyAgTW9kdWxlIE5hbWU6CisvLyAgICBXYjM1VHguYworLy8KKy8vICBBYnN0cmFjdDoKKy8vICAgIFByb2Nlc3NpbmcgdGhlIFR4IG1lc3NhZ2UgYW5kIHB1dCBpbnRvIGRvd24gbGF5ZXIKKy8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgIndiMzV0eF9mLmgiCisjaW5jbHVkZSAibWRzX2YuaCIKKyNpbmNsdWRlICJzeXNkZWYuaCIKKwordW5zaWduZWQgY2hhcgorV2IzNVR4X2dldF90eF9idWZmZXIocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqKnBCdWZmZXIpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCSpwQnVmZmVyID0gcFdiMzVUeC0+VHhCdWZmZXJbMF07CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVUeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOworCitzdGF0aWMgdm9pZCBXYjM1VHhfY29tcGxldGUoc3RydWN0IHVyYiAqIHBVcmIpCit7CisJc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyID0gcFVyYi0+Y29udGV4dDsKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYCQlwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwlQTURTCQlwTWRzID0gJmFkYXB0ZXItPk1kczsKKworCXByaW50aygid2IzNTogdHggY29tcGxldGVcbiIpOworCS8vIFZhcmlhYmxlIHNldHRpbmcKKwlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKwlwV2IzNVR4LT5FUDRWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7IC8vU3RvcmUgdGhlIGxhc3QgcmVzdWx0IG9mIElycAorCXBNZHMtPlR4T3duZXJbIHBXYjM1VHgtPlR4U2VuZEluZGV4IF0gPSAwOy8vIFNldCB0aGUgb3duZXIuIEZyZWUgdGhlIG93bmVyIGJpdCBhbHdheXMuCisJcFdiMzVUeC0+VHhTZW5kSW5kZXgrKzsKKwlwV2IzNVR4LT5UeFNlbmRJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0CisJaWYgKHBXYjM1VHgtPkVQNFZNX3N0YXR1cyAhPSAwKSB7CisJCXByaW50aygiVVJCIHN1Ym1pc3Npb24gZmFpbGVkXG4iKTsKKwkJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOworCQlnb3RvIGVycm9yOworCX0KKworCU1kc19UeChhZGFwdGVyKTsKKwlXYjM1VHgoYWRhcHRlcik7CisJcmV0dXJuOworCitlcnJvcjoKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKTsKKwlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVUeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJdTgJCSpwVHhCdWZmZXJBZGRyZXNzOworCVBNRFMJCXBNZHMgPSAmYWRhcHRlci0+TWRzOworCXN0cnVjdCB1cmIgKglwVXJiID0gKHN0cnVjdCB1cmIgKilwV2IzNVR4LT5UeDRVcmI7CisJaW50ICAgICAgICAgCXJldHY7CisJdTMyCQlTZW5kSW5kZXg7CisKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChwV2IzNVR4LT50eF9oYWx0KQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBPd25lcnNoaXAgY2hlY2tpbmcKKwlTZW5kSW5kZXggPSBwV2IzNVR4LT5UeFNlbmRJbmRleDsKKwlpZiAoIXBNZHMtPlR4T3duZXJbU2VuZEluZGV4XSkgLy9ObyBtb3JlIGRhdGEgbmVlZCB0byBiZSBzZW50LCByZXR1cm4gaW1tZWRpYXRlbHkKKwkJZ290byBjbGVhbnVwOworCisJcFR4QnVmZmVyQWRkcmVzcyA9IHBXYjM1VHgtPlR4QnVmZmVyW1NlbmRJbmRleF07CisJLy8KKwkvLyBJc3N1aW5nIFVSQgorCS8vCisJdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDQpLAorCQkJICBwVHhCdWZmZXJBZGRyZXNzLCBwTWRzLT5UeEJ1ZmZlclNpemVbIFNlbmRJbmRleCBdLAorCQkJICBXYjM1VHhfY29tcGxldGUsIGFkYXB0ZXIpOworCisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCXJldHYgPSB1c2Jfc3VibWl0X3VyYihwVXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0djwwKSB7CisJCXByaW50aygiRVA0IFR4IElycCBzZW5kaW5nIGVycm9yXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8vIENoZWNrIGlmIGRyaXZlciBuZWVkcyBpc3N1ZSBJcnAgZm9yIEVQMgorCXBXYjM1VHgtPlR4RmlsbENvdW50ICs9IHBNZHMtPlR4Q291bnRJbkJ1ZmZlcltTZW5kSW5kZXhdOworCWlmIChwV2IzNVR4LT5UeEZpbGxDb3VudCA+IDEyKQorCQlXYjM1VHhfRVAyVk1fc3RhcnQoYWRhcHRlcik7CisKKwlwV2IzNVR4LT5CeXRlVHJhbnNmZXIgKz0gcE1kcy0+VHhCdWZmZXJTaXplW1NlbmRJbmRleF07CisJcmV0dXJuOworCisgY2xlYW51cDoKKwlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7CisJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhGaXJlQ291bnRlcik7Cit9CisKK3ZvaWQgV2IzNVR4X3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJLy8gQWxsb3cgb25seSBvbmUgdGhyZWFkIHRvIHJ1biBpbnRvIGZ1bmN0aW9uCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKSA9PSAxKSB7CisJCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwkJV2IzNVR4KGFkYXB0ZXIpOworCX0gZWxzZQorCQlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeEZpcmVDb3VudGVyKTsKK30KKwordW5zaWduZWQgY2hhciBXYjM1VHhfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCXBXYjM1VHgtPlR4NFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFwV2IzNVR4LT5UeDRVcmIpCisJCXJldHVybiBmYWxzZTsKKworCXBXYjM1VHgtPlR4MlVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFwV2IzNVR4LT5UeDJVcmIpCisJeworCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIFdiMzVUeF9zdG9wKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgVHJwIG9mIEVQMgorCWlmIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQorCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQorCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwlXQkRFQlVHKCgiRVAyIFR4IHN0b3BcbiIpKTsKKwkjZW5kaWYKKworCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIElycCBvZiBFUDQKKwlpZiAocFdiMzVUeC0+RVA0dm1fc3RhdGUgPT0gVk1fUlVOTklORykKKwkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4NFVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KKwkjaWZkZWYgX1BFX1RYX0RVTVBfCisJV0JERUJVRygoIkVQNCBUeCBzdG9wXG4iKSk7CisJI2VuZGlmCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit2b2lkIFdiMzVUeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCisJLy8gV2FpdCBmb3IgVk0gc3RvcAorCWRvIHsKKwkJbXNsZWVwKDEwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKKwl9IHdoaWxlKCAocFdiMzVUeC0+RVAydm1fc3RhdGUgIT0gVk1fU1RPUCkgJiYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlICE9IFZNX1NUT1ApICk7CisJbXNsZWVwKDEwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmIKKworCWlmIChwV2IzNVR4LT5UeDRVcmIpCisJCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7CisKKwlpZiAocFdiMzVUeC0+VHgyVXJiKQorCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4MlVyYiApOworCisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJXYjM1VHhfZGVzdHJveSBPS1xuIikpOworCSNlbmRpZgorfQorCit2b2lkIFdiMzVUeF9DdXJyZW50VGltZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHUzMiBUaW1lQ291bnQpCit7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwl1bnNpZ25lZCBjaGFyIFRyaWdnZXIgPSBmYWxzZTsKKworCWlmIChwV2IzNVR4LT5UeFRpbWVyID4gVGltZUNvdW50KQorCQlUcmlnZ2VyID0gdHJ1ZTsKKwllbHNlIGlmIChUaW1lQ291bnQgPiAocFdiMzVUeC0+VHhUaW1lcis1MDApKQorCQlUcmlnZ2VyID0gdHJ1ZTsKKworCWlmIChUcmlnZ2VyKSB7CisJCXBXYjM1VHgtPlR4VGltZXIgPSBUaW1lQ291bnQ7CisJCVdiMzVUeF9FUDJWTV9zdGFydChhZGFwdGVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVUeF9FUDJWTShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOworCitzdGF0aWMgdm9pZCBXYjM1VHhfRVAyVk1fY29tcGxldGUoc3RydWN0IHVyYiAqIHBVcmIpCit7CisJc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyID0gcFVyYi0+Y29udGV4dDsKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlUMDJfREVTQ1JJUFRPUglUMDIsIFRTVEFUVVM7CisJUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJdTMyICoJCXBsdG1wID0gKHUzMiAqKXBXYjM1VHgtPkVQMl9idWY7CisJdTMyCQlpOworCXUxNgkJSW50ZXJydXB0SW5MZW5ndGg7CisKKworCS8vIFZhcmlhYmxlIHNldHRpbmcKKwlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKwlwV2IzNVR4LT5FUDJWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBGb3IgTGludXggMi40LiBJbnRlcnJ1cHQgd2lsbCBhbHdheXMgdHJpZ2dlcgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVR4LT50eF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy9UaGUgVXJiIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAorCWlmIChwV2IzNVR4LT5FUDJWTV9zdGF0dXMgIT0gMCkgeworCQlXQkRFQlVHKCgiRVAyIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOworCQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZT0gVk1fU1RPUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvLyBVcGRhdGUgdGhlIFR4IHJlc3VsdAorCUludGVycnVwdEluTGVuZ3RoID0gcFVyYi0+YWN0dWFsX2xlbmd0aDsKKwkvLyBNb2RpZnkgZm9yIG1pbmltdW0gbWVtb3J5IGFjY2VzcyBhbmQgRFdPUkQgYWxpZ25tZW50LgorCVQwMi52YWx1ZSA9IGNwdV90b19sZTMyKHBsdG1wWzBdKSA+PiA4OyAvLyBbMzE6OF0gLT4gWzI0OjBdCisJSW50ZXJydXB0SW5MZW5ndGggLT0gMTsvLyAyMDA1MTIyMS4xLmMgTW9kaWZ5IHRoZSBmb2xsb3cgZm9yIG1vcmUgc3RhYmxlCisJSW50ZXJydXB0SW5MZW5ndGggPj49IDI7IC8vIEludGVycnVwdEluTGVuZ3RoLzQKKwlmb3IgKGkgPSAxOyBpIDw9IEludGVycnVwdEluTGVuZ3RoOyBpKyspIHsKKwkJVDAyLnZhbHVlIHw9ICgoY3B1X3RvX2xlMzIocGx0bXBbaV0pICYgMHhmZikgPDwgMjQpOworCisJCVRTVEFUVVMudmFsdWUgPSBUMDIudmFsdWU7ICAvLzIwMDYxMDA5IGFuc29uJ3MgZW5kaWFuCisJCU1kc19TZW5kQ29tcGxldGUoIGFkYXB0ZXIsICZUU1RBVFVTICk7CisJCVQwMi52YWx1ZSA9IGNwdV90b19sZTMyKHBsdG1wW2ldKSA+PiA4OworCX0KKworCXJldHVybjsKK2Vycm9yOgorCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQpOworCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKK30KKworc3RhdGljIHZvaWQgV2IzNVR4X0VQMlZNKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKK3sKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXN0cnVjdCB1cmIgKglwVXJiID0gKHN0cnVjdCB1cmIgKilwV2IzNVR4LT5UeDJVcmI7CisJdTMyICoJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKKwlpbnQJCXJldHY7CisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvLworCS8vIElzc3VpbmcgVVJCCisJLy8KKwl1c2JfZmlsbF9pbnRfdXJiKCBwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LCB1c2JfcmN2aW50cGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LDIpLAorCQkJICBwbHRtcCwgTUFYX0lOVEVSUlVQVF9MRU5HVEgsIFdiMzVUeF9FUDJWTV9jb21wbGV0ZSwgYWRhcHRlciwgMzIpOworCisJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCXJldHYgPSB1c2Jfc3VibWl0X3VyYihwVXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXR2IDwgMCkgeworCQkjaWZkZWYgX1BFX1RYX0RVTVBfCisJCVdCREVCVUcoKCJFUDIgVHggSXJwIHNlbmRpbmcgZXJyb3JcbiIpKTsKKwkJI2VuZGlmCisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuOworZXJyb3I6CisJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9TVE9QOworCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQpOworfQorCit2b2lkIFdiMzVUeF9FUDJWTV9zdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgorCWlmIChhdG9taWNfaW5jX3JldHVybigmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCkgPT0gMSkgeworCQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJCVdiMzVUeF9FUDJWTShhZGFwdGVyKTsKKwl9CisJZWxzZQorCQlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjJmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVUWF9GX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVUWF9GX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Vuc2lnbmVkIGNoYXIgV2IzNVR4X2luaXRpYWwoCSBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgV2IzNVR4X2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVR4X2dldF90eF9idWZmZXIoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqKnBCdWZmZXIgKTsKKwordm9pZCBXYjM1VHhfRVAyVk1fc3RhcnQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKKwordm9pZCBXYjM1VHhfc3RhcnQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKK3ZvaWQgV2IzNVR4X3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKKwordm9pZCBXYjM1VHhfQ3VycmVudFRpbWUoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgdTMyIFRpbWVDb3VudCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2MDI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9zLmgKQEAgLTAsMCArMSw0OSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0IzNV9UWF9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVfVFhfU19ICisKKyNpbmNsdWRlICJtZHNfcy5oIgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSVM4OUMzNSBUeCByZWxhdGVkIGRlZmluaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIFRYX0lOVEVSRkFDRQkJCTAJLy8gSW50ZXJmYWNlIDEKKyNkZWZpbmUgVFhfUElQRQkJCQkJMwkvLyBlbmRwb2ludCA0CisjZGVmaW5lIFRYX0lOVEVSUlVQVAkJCTEJLy8gZW5kcG9pbnQgMgorI2RlZmluZSBNQVhfSU5URVJSVVBUX0xFTkdUSAk2NAkvLyBJdCBtdXN0IGJlIDY0IGZvciBFUDIgaGFyZHdhcmUKKworCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCB2YXJpYWJsZSBmb3IgbW9kdWxlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK3R5cGVkZWYgc3RydWN0IF9XQjM1VFgKK3sKKwkvLyBGb3IgVHggYnVmZmVyCisJdTgJVHhCdWZmZXJbIE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUiBdWyBNQVhfVVNCX1RYX0JVRkZFUiBdOworCisJLy8gRm9yIEludGVycnVwdCBwaXBlCisJdTgJRVAyX2J1ZltNQVhfSU5URVJSVVBUX0xFTkdUSF07CisKKwlhdG9taWNfdAlUeFJlc3VsdENvdW50Oy8vIEZvciB0aHJlYWQgY29udHJvbCBvZiBFUDIgOTMxMTMwLjQubQorCWF0b21pY190CVR4RmlyZUNvdW50ZXI7Ly8gRm9yIHRocmVhZCBjb250cm9sIG9mIEVQNCA5MzExMzAuNC5uCisJdTMyCQkJQnl0ZVRyYW5zZmVyOworCisJdTMyCSAgICBUeFNlbmRJbmRleDsvLyBUaGUgbmV4dCBpbmRleCBvZiBNZHMgYXJyYXkgdG8gYmUgc2VudAorCXUzMgkgICAgRVAydm1fc3RhdGU7IC8vIGZvciBFUDJ2bSBzdGF0ZQorCXUzMgkgICAgRVA0dm1fc3RhdGU7IC8vIGZvciBFUDR2bSBzdGF0ZQorCXUzMgkgICAgdHhfaGFsdDsgLy8gU3RvcHBpbmcgVk0KKworCXN0cnVjdCB1cmIgKgkJCQlUeDRVcmI7CisJc3RydWN0IHVyYiAqCQkJCVR4MlVyYjsKKworCWludAkJRVAyVk1fc3RhdHVzOworCWludAkJRVA0Vk1fc3RhdHVzOworCisJdTMyCVR4RmlsbENvdW50OyAvLyAyMDA2MDkyOAorCXUzMglUeFRpbWVyOyAvLyAyMDA2MDkyOCBBZGQgaWYgc2VuZGluZyBwYWNrZXQgbm90IGdyZWF0IHRoYW4gMTMKKworfSBXQjM1VFgsICpQV0IzNVRYOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jCmluZGV4IDVkNjhlY2UuLjhhOWQyMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuYwpAQCAtMSwxMSArMSw2IEBACiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCi0KLXZvaWQgaGFsX2dldF9ldGhlcm5ldF9hZGRyZXNzKCBwaHdfZGF0YV90IHBId0RhdGEsIHU4ICpjdXJyZW50X2FkZHJlc3MgKQotewotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCW1lbWNweSggY3VycmVudF9hZGRyZXNzLCBwSHdEYXRhLT5DdXJyZW50TWFjQWRkcmVzcywgRVRIX0xFTkdUSF9PRl9BRERSRVNTICk7Ci19CisjaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndibGludXhfZi5oIgogCiB2b2lkIGhhbF9zZXRfZXRoZXJuZXRfYWRkcmVzcyggcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqY3VycmVudF9hZGRyZXNzICkKIHsKQEAgLTI4LDQyMyArMjMsMTEgQEAKIAltZW1jcHkoIHBldGhlcm5ldF9hZGRyZXNzLCBwSHdEYXRhLT5QZXJtYW5lbnRNYWNBZGRyZXNzLCA2ICk7CiB9CiAKLXU4IGhhbF9pbml0X2hhcmR3YXJlKHBod19kYXRhX3QgcEh3RGF0YSwgUFdCMzJfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIHZvaWQgaGFsX2xlZF9jb250cm9sKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQl1MTYgU29mdHdhcmVTZXQ7Ci0JcEh3RGF0YS0+QWRhcHRlciA9IEFkYXB0ZXI7Ci0KLQkvLyBJbml0aWFsIHRoZSB2YXJpYWJsZQotCXBId0RhdGEtPk1heFJlY2VpdmVMaWZlVGltZSA9IERFRkFVTFRfTVNEVV9MSUZFX1RJTUU7IC8vIFNldHRpbmcgUnggbWF4aW11bSBNU0RVIGxpZmUgdGltZQotCXBId0RhdGEtPkZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7IC8vIFNldHRpbmcgZGVmYXVsdCBmcmFnbWVudCB0aHJlc2hvbGQKLQotCWlmIChXYlVzYl9pbml0aWFsKHBId0RhdGEpKSB7Ci0JCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDE7Ci0JCWlmKCBXYjM1UmVnX2luaXRpYWwocEh3RGF0YSkpIHsKLQkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDI7Ci0JCQlpZiAoV2IzNVR4X2luaXRpYWwocEh3RGF0YSkpIHsKLQkJCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAzOwotCQkJCWlmIChXYjM1UnhfaW5pdGlhbChwSHdEYXRhKSkgewotCQkJCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSA0OwotCQkJCQlPU19USU1FUl9JTklUSUFMKCAmcEh3RGF0YS0+TEVEVGltZXIsIGhhbF9sZWRfY29udHJvbCwgcEh3RGF0YSApOwotCQkJCQlPU19USU1FUl9TRVQoICZwSHdEYXRhLT5MRURUaW1lciwgMTAwMCApOyAvLyAyMDA2MDYyMwotCi0JCQkJCS8vCi0JCQkJCS8vIEZvciByZXN0cmljdCB0byB2ZW5kb3IncyBoYXJkd2FyZQotCQkJCQkvLwotCQkJCQlTb2Z0d2FyZVNldCA9IGhhbF9zb2Z0d2FyZV9zZXQoIHBId0RhdGEgKTsKLQotCQkJCQkjaWZkZWYgVmVuZG9yMgotCQkJCQkvLyBUcnkgdG8gbWFrZSBzdXJlIHRoZSBFRVBST00gY29udGFpbgotCQkJCQlTb2Z0d2FyZVNldCA+Pj0gODsKLQkJCQkJaWYoIFNvZnR3YXJlU2V0ICE9IDB4ODIgKQotCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQkjZW5kaWYKLQotCQkJCQlXYjM1Unhfc3RhcnQoIHBId0RhdGEgKTsKLQkJCQkJV2IzNVR4X0VQMlZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0KLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwotCXJldHVybiBGQUxTRTsKLX0KLQotCi12b2lkIGhhbF9oYWx0KHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCAqcHBhX2RhdGEpCi17Ci0Jc3dpdGNoKCBwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgKQotCXsKLQkJY2FzZSA0OgotCQljYXNlIDM6IE9TX1RJTUVSX0NBTkNFTCggJnBId0RhdGEtPkxFRFRpbWVyLCAmY2FuY2VsICk7Ci0JCQlPU19TTEVFUCgxMDAwMDApOyAvLyBXYWl0IGZvciBUaW1lciBEUEMgZXhpdCA5NDA2MjMuMgotCQkJV2IzNVJ4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgUngKLQkJY2FzZSAyOiBXYjM1VHhfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBUeAotCQljYXNlIDE6IFdiMzVSZWdfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBXYjM1IFJlZ2lzc3RlciByZXNvdXJjZXMKLQkJCQlXYlVzYl9kZXN0cm95KCBwSHdEYXRhICk7Ly8gUmVsZWFzZSB0aGUgV2JVc2IKLQl9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfcmF0ZXMocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqcGJzc19yYXRlcywKLQkJICAgdTggbGVuZ3RoLCB1bnNpZ25lZCBjaGFyIGJhc2ljX3JhdGVfc2V0KQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JdTMyCQl0bXAsIHRtcDE7Ci0JdTgJCVJhdGVbMTJdPXsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07Ci0JdTgJCVN1cHBvcnRlZFJhdGVbMTZdOwotCXU4CQlpLCBqLCBrLCBDb3VudDEsIENvdW50MiwgQnl0ZTsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCWlmIChiYXNpY19yYXRlX3NldCkgewotCQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJj0gfjB4MDAwZmZmMDA7Ci0JCXRtcDEgPSAweDAwMDAwMTAwOwotCX0gZWxzZSB7Ci0JCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHhmZmYwMDAwMDsKLQkJdG1wMSA9IDB4MDAxMDAwMDA7Ci0JfQotCi0JdG1wID0gMDsKLQlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQlCeXRlID0gcGJzc19yYXRlc1tpXSAmIDB4N2Y7Ci0JCWZvciAoaj0wOyBqPDEyOyBqKyspIHsKLQkJCWlmKCBCeXRlID09IFJhdGVbal0gKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPCAxMikKLQkJCXRtcCB8PSAodG1wMTw8aik7Ci0JfQotCi0JcFdiMzVSZWctPk0yOF9NYWNDb250cm9sIHw9IHRtcDsKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MjgsIHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCApOwotCi0JLy8gOTMwMjA2LjIuYyBNNzggc2V0dGluZwotCWogPSBrID0gQ291bnQxID0gQ291bnQyID0gMDsKLQltZW1zZXQoIFN1cHBvcnRlZFJhdGUsIDAsIDE2ICk7Ci0JdG1wID0gMHgwMDEwMDAwMDsKLQl0bXAxID0gMHgwMDAwMDEwMDsKLQlmb3IgKGk9MDsgaTwxMjsgaSsrKSB7IC8vIEdldCB0aGUgc3VwcG9ydGVkIHJhdGUKLQkJaWYgKHRtcCAmIHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCkgewotCQkJU3VwcG9ydGVkUmF0ZVtqXSA9IFJhdGVbaV07Ci0KLQkJCWlmICh0bXAxICYgcFdiMzVSZWctPk0yOF9NYWNDb250cm9sKQotCQkJCVN1cHBvcnRlZFJhdGVbal0gfD0gMHg4MDsKLQotCQkJaWYgKGspCi0JCQkJQ291bnQyKys7Ci0JCQllbHNlCi0JCQkJQ291bnQxKys7Ci0KLQkJCWorKzsKLQkJfQotCi0JCWlmIChpPT00ICYmIGs9PTApIHsKLQkJCWlmKCAhKHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCAmIDB4MDAwZmYwMDApICkgLy8gaWYgYmFzaWMgcmF0ZSBpbiAxMWcgZG9tYWluKQotCQkJewotCQkJCWsgPSAxOwotCQkJCWogPSA4OwotCQkJfQotCQl9Ci0KLQkJdG1wIDw8PSAxOwotCQl0bXAxIDw8PSAxOwotCX0KLQotCS8vIEZpbGwgZGF0YSBpbnRvIHN1cHBvcnQgcmF0ZSB1bnRpbCBidWZmZXIgZnVsbAotCS8vLS0tMjAwNjA5MjYgYWRkIGJ5IGFuc29uJ3MgZW5kaWFuCi0JZm9yIChpPTA7IGk8NDsgaSsrKQotCQkqKHUzMiAqKShTdXBwb3J0ZWRSYXRlKyhpPDwyKSkgPSBjcHVfdG9fbGUzMiggKih1MzIgKikoU3VwcG9ydGVkUmF0ZSsoaTw8MikpICk7Ci0JLy8tLS0gZW5kIDIwMDYwOTI2IGFkZCBieSBhbnNvbidzIGVuZGlhbgotCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwweDA4N2MsICh1MzIgKilTdXBwb3J0ZWRSYXRlLCA0LCBBVVRPX0lOQ1JFTUVOVCApOwotCXBXYjM1UmVnLT5NN0NfTWFjQ29udHJvbCA9ICgodTMyICopU3VwcG9ydGVkUmF0ZSlbMF07Ci0JcFdiMzVSZWctPk04MF9NYWNDb250cm9sID0gKCh1MzIgKilTdXBwb3J0ZWRSYXRlKVsxXTsKLQlwV2IzNVJlZy0+TTg0X01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzJdOwotCXBXYjM1UmVnLT5NODhfTWFjQ29udHJvbCA9ICgodTMyICopU3VwcG9ydGVkUmF0ZSlbM107Ci0KLQkvLyBGaWxsIGxlbmd0aAotCXRtcCA9IENvdW50MTw8MjggfCBDb3VudDI8PDI0OwotCXBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gJj0gfjB4ZmYwMDAwMDA7Ci0JcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiB8PSB0bXA7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCBwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICk7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9iZWFjb25fcGVyaW9kKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGJlYWNvbl9wZXJpb2QgKQotewotCXUzMgl0bXA7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlwSHdEYXRhLT5CZWFjb25QZXJpb2QgPSBiZWFjb25fcGVyaW9kOwotCXRtcCA9IHBId0RhdGEtPkJlYWNvblBlcmlvZCA8PCAxNjsKLQl0bXAgfD0gcEh3RGF0YS0+UHJvYmVEZWxheTsKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NDgsIHRtcCApOwotfQotCi0KLXZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkKLQkJcmV0dXJuOwotCi0JcHJpbnRrKCJHb2luZyB0byBjaGFubmVsOiAlZC8lZFxuIiwgY2hhbm5lbC5iYW5kLCBjaGFubmVsLkNoYW5Obyk7Ci0KLQlSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoIHBId0RhdGEsIGNoYW5uZWwgKTsvLyBTd2l0Y2ggY2hhbm5lbAotCXBId0RhdGEtPkNoYW5uZWwgPSBjaGFubmVsLkNoYW5ObzsKLQlwSHdEYXRhLT5iYW5kID0gY2hhbm5lbC5iYW5kOwotCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlXQkRFQlVHKCgiU2V0IGNoYW5uZWwgaXMgJWQsIGJhbmQgPSVkXG4iLCBwSHdEYXRhLT5DaGFubmVsLCBwSHdEYXRhLT5iYW5kKSk7Ci0JI2VuZGlmCi0JcFdiMzVSZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmOyAvLyBDbGVhbiBjaGFubmVsIGluZm9ybWF0aW9uIGZpZWxkCi0JcFdiMzVSZWctPk0yOF9NYWNDb250cm9sIHw9IGNoYW5uZWwuQ2hhbk5vOwotCVdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcEh3RGF0YSwgMHgwODI4LCBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wsCi0JCQkJCShzOCAqKSZjaGFubmVsLCBzaXplb2YoQ2hhbkluZm8pKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApCi17Ci0JaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoIHBId0RhdGEsIGNoYW5uZWwgKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9nZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gKmNoYW5uZWwgKQotewotCWNoYW5uZWwtPkNoYW5ObyA9IHBId0RhdGEtPkNoYW5uZWw7Ci0JY2hhbm5lbC0+YmFuZCA9IHBId0RhdGEtPmJhbmQ7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDIwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQotCWlmIChlbmFibGUpCi0JCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotfQotCi0vL2ZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbiwgd2UgbmVlZCB0byBhY2NlcHQgYnJvYWRjYXN0IHBhY2tldHMgdG8gYmUgcmVjZWl2ZWQgdGVtcG9yYXJ5Lgotdm9pZCBoYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cyggcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIHJldHVybjsKLQlpZiAoZW5hYmxlKSB7Ci0JCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAwNDAwMDAwOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotCX0gZWxzZSB7Ci0JCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCY9fjB4MDA0MDAwMDA7Ci0JCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci0JfQotfQotCi12b2lkIGhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwMTAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCWlmIChlbmFibGUpICBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMTAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci19Ci0KLXZvaWQgaGFsX3NldF9hY2NlcHRfYmVhY29uKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JLy8gMjAwNDAxMDggZGVidWcKLQlpZiggIWVuYWJsZSApLy9EdWUgdG8gU01FIGFuZCBNTE1FIGFyZSBub3Qgc3VpdGFibGUgZm9yIDM1Ci0JCXJldHVybjsKLQotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwNDAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCWlmKCBlbmFibGUgKQotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwNDAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfbXVsdGljYXN0X2FkZHJlc3MoIHBod19kYXRhX3QgcEh3RGF0YSwgdTggKmFkZHJlc3MsIHU4IG51bWJlciApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQl1OAkJQnl0ZSwgQml0OwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JLy9FcmFzZXMgYW5kIHJlZmlsbHMgdGhlIGNhcmQgbXVsdGljYXN0IHJlZ2lzdGVycy4gVXNlZCB3aGVuIGFuIGFkZHJlc3MKLQkvLyAgICBoYXMgYmVlbiBkZWxldGVkIGFuZCBhbGwgYml0cyBtdXN0IGJlIHJlY29tcHV0ZWQuCi0JcFdiMzVSZWctPk0wNF9NdWx0aWNhc3RBZGRyZXNzMSA9IDA7Ci0JcFdiMzVSZWctPk0wOF9NdWx0aWNhc3RBZGRyZXNzMiA9IDA7Ci0KLQl3aGlsZSggbnVtYmVyICkKLQl7Ci0JCW51bWJlci0tOwotCQlDYXJkR2V0TXVsdGljYXN0Qml0KCAoYWRkcmVzcysobnVtYmVyKkVUSF9MRU5HVEhfT0ZfQUREUkVTUykpLCAmQnl0ZSwgJkJpdCk7Ci0JCXBXYjM1UmVnLT5NdWx0aWNhc3RbQnl0ZV0gfD0gQml0OwotCX0KLQotCS8vIFVwZGF0aW5nIHJlZ2lzdGVyCi0JV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDA4MDQsICh1MzIgKilwV2IzNVJlZy0+TXVsdGljYXN0LCAyLCBBVVRPX0lOQ1JFTUVOVCApOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXU4IGhhbF9nZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybiAwOwotCi0JaWYoIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCAmIDB4MDQwMDAwMDAgKQotCQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBjaGFyIGhhbF9yZXNldF9oYXJkd2FyZSggcGh3X2RhdGFfdCBwSHdEYXRhLCB2b2lkKiBwcGEgKQotewotCS8vIE5vdCBpbXBsZW1lbnQgeWV0Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQgaGFsX3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlwSHdEYXRhLT5XYjM1UngucnhfaGFsdCA9IDE7Ci0JV2IzNVJ4X3N0b3AoIHBId0RhdGEgKTsKLQotCXBId0RhdGEtPldiMzVUeC50eF9oYWx0ID0gMTsKLQlXYjM1VHhfc3RvcCggcEh3RGF0YSApOwotCi0JcFdiMzVSZWctPkQwMF9EbWFDb250cm9sICY9IH4weGMwMDAwMDAwOy8vVHggT2ZmLCBSeCBPZmYKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA0MDAsIHBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCApOwotCi0JV2JVc2JfU3RvcCggcEh3RGF0YSApOyAvLyAyMDA1MTIzMCBBZGQuNAotfQotCi11bnNpZ25lZCBjaGFyIGhhbF9pZGxlKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVBXQlVTQglwV2JVc2IgPSAmcEh3RGF0YS0+V2JVc2I7Ci0KLQlpZiggIXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICYmICggcFdiVXNiLT5EZXRlY3RDb3VudCB8fCBwV2IzNVJlZy0+RVAwdm1fc3RhdGUhPVZNX1NUT1AgKSApCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9jd21pbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4CWN3aW5fbWluICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcEh3RGF0YS0+Y3dtaW4gPSBjd2luX21pbjsKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgJj0gfjB4N2MwMDsJLy9iaXQgMTAgfiAxNAotCXBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCB8PSAocEh3RGF0YS0+Y3dtaW48PDEwKTsKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MmMsIHBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCApOwotfQotCi1zMzIgaGFsX2dldF9yc3NpKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyICpIYWxSc3NpQXJyeSwgIHU4IENvdW50ICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVIwMV9ERVNDUklQVE9SCXIwMTsKLQlzMzIgbHRtcCA9IDAsIHRtcDsKLQl1OAlpOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuIC0yMDA7Ci0JaWYoIENvdW50ID4gTUFYX0FDQ19SU1NJX0NPVU5UICkgLy8gQmVjYXVzZSB0aGUgVFMgbWF5IHVzZSB0aGlzIGZ1bnRpb24KLQkJQ291bnQgPSBNQVhfQUNDX1JTU0lfQ09VTlQ7Ci0KLQkvLyBSU1NJID0gQzEgKyBDMiAqIChhZ2Nfc3RhdGVbNzowXSArIG9mZnNldF9tYXAobG5hX3N0YXRlWzE6MF0pKQotCS8vIEMxID0gLTE5NSwgQzIgPSAwLjY2ID0gODUvMTI4Ci0JZm9yIChpPTA7IGk8Q291bnQ7IGkrKykKLQl7Ci0JCXIwMS52YWx1ZSA9IEhhbFJzc2lBcnJ5W2ldOwotCQl0bXAgPSAoKCggcjAxLlIwMV9BR0Nfc3RhdGUgKyBwV2IzNVJlZy0+TE5BVmFsdWVbcjAxLlIwMV9MTkFfc3RhdGVdKSAqIDg1ICkgPj43ICkgLSAxOTU7Ci0JCWx0bXAgKz0gdG1wOwotCX0KLQlsdG1wIC89IENvdW50OwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMCApIGx0bXAgLT0gNTsgLy8gMTA7Ci0JaWYoIHBId0RhdGEtPnBoeV90eXBlID09IFJGX0FJUk9IQV8yMjMwUyApIGx0bXAgLT0gNTsgLy8gMTA7IDIwMDYwNDIwIEFkZCB0aGlzCi0KLQkvL2lmKCBsdG1wIDwgLTIwMCApIGx0bXAgPSAtMjAwOwotCWlmKCBsdG1wIDwgLTExMCApIGx0bXAgPSAtMTEwOy8vIDEuMC4yNC4wIEZvciBOSlJDCi0KLQlyZXR1cm4gbHRtcDsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotczMyIGhhbF9nZXRfcnNzaV9ic3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgaWR4LCAgdTggQ291bnQgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUjAxX0RFU0NSSVBUT1IJcjAxOwotCXMzMiBsdG1wID0gMCwgdG1wOwotCXU4CWksIGo7Ci0JUEFEQVBURVIJQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0vLwl1MzIgKkhhbFJzc2lBcnJ5ID0gcHNCU1MoaWR4KS0+SGFsUnNzaTsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybiAtMjAwOwotCWlmKCBDb3VudCA+IE1BWF9BQ0NfUlNTSV9DT1VOVCApIC8vIEJlY2F1c2UgdGhlIFRTIG1heSB1c2UgdGhpcyBmdW50aW9uCi0JCUNvdW50ID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCi0JLy8gUlNTSSA9IEMxICsgQzIgKiAoYWdjX3N0YXRlWzc6MF0gKyBvZmZzZXRfbWFwKGxuYV9zdGF0ZVsxOjBdKSkKLQkvLyBDMSA9IC0xOTUsIEMyID0gMC42NiA9IDg1LzEyOAotI2lmIDAKLQlmb3IgKGk9MDsgaTxDb3VudDsgaSsrKQotCXsKLQkJcjAxLnZhbHVlID0gSGFsUnNzaUFycnlbaV07Ci0JCXRtcCA9ICgoKCByMDEuUjAxX0FHQ19zdGF0ZSArIHBXYjM1UmVnLT5MTkFWYWx1ZVtyMDEuUjAxX0xOQV9zdGF0ZV0pICogODUgKSA+PjcgKSAtIDE5NTsKLQkJbHRtcCArPSB0bXA7Ci0JfQotI2Vsc2UKLQlpZiAocHNCU1MoaWR4KS0+SGFsUnNzaUluZGV4ID09IDApCi0JCXBzQlNTKGlkeCktPkhhbFJzc2lJbmRleCA9IE1BWF9BQ0NfUlNTSV9DT1VOVDsKLQlqID0gKHU4KXBzQlNTKGlkeCktPkhhbFJzc2lJbmRleC0xOwotCi0JZm9yIChpPTA7IGk8Q291bnQ7IGkrKykKLQl7Ci0JCXIwMS52YWx1ZSA9IHBzQlNTKGlkeCktPkhhbFJzc2lbal07Ci0JCXRtcCA9ICgoKCByMDEuUjAxX0FHQ19zdGF0ZSArIHBXYjM1UmVnLT5MTkFWYWx1ZVtyMDEuUjAxX0xOQV9zdGF0ZV0pICogODUgKSA+PjcgKSAtIDE5NTsKLQkJbHRtcCArPSB0bXA7Ci0JCWlmIChqID09IDApCi0JCXsKLQkJCWogPSBNQVhfQUNDX1JTU0lfQ09VTlQ7Ci0JCX0KLQkJai0tOwotCX0KLSNlbmRpZgotCWx0bXAgLz0gQ291bnQ7Ci0JaWYoIHBId0RhdGEtPnBoeV90eXBlID09IFJGX0FJUk9IQV8yMjMwICkgbHRtcCAtPSA1OyAvLyAxMDsKLQlpZiggcEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfQUlST0hBXzIyMzBTICkgbHRtcCAtPSA1OyAvLyAxMDsgMjAwNjA0MjAgQWRkIHRoaXMKLQotCS8vaWYoIGx0bXAgPCAtMjAwICkgbHRtcCA9IC0yMDA7Ci0JaWYoIGx0bXAgPCAtMTEwICkgbHRtcCA9IC0xMTA7Ly8gMS4wLjI0LjAgRm9yIE5KUkMKLQotCXJldHVybiBsdG1wOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfbGVkX2NvbnRyb2xfMWEoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCWhhbF9sZWRfY29udHJvbCggTlVMTCwgcEh3RGF0YSwgTlVMTCwgTlVMTCApOwotfQotCi12b2lkIGhhbF9sZWRfY29udHJvbCggIHZvaWQqIFMxLCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdm9pZCogUzMsICB2b2lkKiBTNCApCi17Ci0JUEFEQVBURVIJQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgPSAoc3RydWN0IHdic29mdF9wcml2ICopIGRhdGE7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglMRURTZXQgPSAocEh3RGF0YS0+U29mdHdhcmVTZXQgJiBIQUxfTEVEX1NFVF9NQVNLKSA+PiBIQUxfTEVEX1NFVF9TSElGVDsKIAl1OAlMRURncmF5WzIwXSA9IHsgMCwzLDQsNiw4LDEwLDExLDEyLDEzLDE0LDE1LDE0LDEzLDEyLDExLDEwLDgsNiw0LDIgfTsKIAl1OAlMRURncmF5MlszMF0gPSB7IDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTUsMTQsMTMsMTIsMTEsMTAsOSw4IH07CkBAIC00ODcsMjEgKzcwLDIxIEBACiAJCQl9CiAJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcrKzsKIAotCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlID0gbHRtcDsKKwkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBsdG1wOwogCQkJaWYoIExFRFNldCAhPSA3ICkgLy8gT25seSAxMTEgbW9kZSBoYXMgMiBMRURzIG9uIFBDQi4KIAkJCXsKLQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gKGx0bXAgJjB4ZmYpPDw4OyAvLyBDb3B5IExFRCByZXN1bHQgdG8gZWFjaCBMRUQgY29udHJvbCByZWdpc3RlcgotCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZjAwKT4+ODsKKwkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IChsdG1wICYweGZmKTw8ODsgLy8gQ29weSBMRUQgcmVzdWx0IHRvIGVhY2ggTEVEIGNvbnRyb2wgcmVnaXN0ZXIKKwkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IChsdG1wICYweGZmMDApPj44OwogCQkJfQotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQl9CiAJfQogCWVsc2UgaWYoIHBId0RhdGEtPkN1cnJlbnRSYWRpb1N3IHx8IHBId0RhdGEtPkN1cnJlbnRSYWRpb0h3ICkgLy8gSWYgcmFkaW8gb2ZmCiAJewotCQlpZiggcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMDEwICkKKwkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMTAgKQogCQl7Ci0JCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAxMDsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMTA7CisJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJfQogCX0KIAllbHNlCkBAIC01MTYsMTUgKzk5LDE1IEBACiAJCQkJCXsKIAkJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPT0gMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT24KKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9uCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMTsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CiAJCQkJCQllbHNlCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDA7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQpAQCAtNTMyLDIwICsxMTUsMjAgQEAKIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvL1R1cm4gT2ZmIExFRF8wCi0JCQkJCQlpZiggcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCApCisJCQkJCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQllbHNlCiAJCQkJewogCQkJCQkvLyBUdXJuIE9uIExFRF8wCi0JCQkJCWlmKCAocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgPT0gMCApCisJCQkJCWlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQogCQkJCQl7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNTU4LDE2ICsxNDEsMTYgQEAKIAkJCQkJewogCQkJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyA9PSAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4ZjsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4ZjsKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9uCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMTsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CiAJCQkJCQllbHNlCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDFmOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDA7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQpAQCAtNTc1LDI2ICsxNTgsMjYgQEAKIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvLyAyMDA2MDkwMSBHcmF5IGJsaW5raW5nIGlmIGluIGRpc2Nvbm5lY3Qgc3RhdGUgYW5kIG5vdCBzY2FubmluZwotCQkJCQkJbHRtcCA9IHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZTsKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxZjsKKwkJCQkJCWx0bXAgPSByZWctPlUxQkNfTEVEQ29uZmlndXJlOworCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxZjsKIAkJCQkJCWlmKCBMRURncmF5MlsocEh3RGF0YS0+TEVEX0JsaW5raW5nJTMwKV0gKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSBMRURncmF5MlsgKHBId0RhdGEtPkxFRF9CbGlua2luZyUzMCkgXTsKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSBMRURncmF5MlsgKHBId0RhdGEtPkxFRF9CbGlua2luZyUzMCkgXTsKIAkJCQkJCX0KIAkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZysrOwotCQkJCQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAhPSBsdG1wICkKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICE9IGx0bXAgKQorCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCVRpbWVJbnRlcnZhbCA9IDEwMDsKIAkJCQkJfQogCQkJCX0KIAkJCQllbHNlCiAJCQkJewogCQkJCQkvLyBUdXJuIE9uIExFRF8wCi0JCQkJCWlmKCAocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgPT0gMCApCisJCQkJCWlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQogCQkJCQl7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgorCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9mZgogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNjA3LDE1ICsxOTAsMTUgQEAKIAkJCQkJewogCQkJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyA9PSAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMTsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CiAJCQkJCQllbHNlCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMDA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPZmYKIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KQEAgLTYyMyw1NyArMjA2LDU3IEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy9UdXJuIE9mZiBMRURfMQotCQkJCQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAwMCApCisJCQkJCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAwMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMDA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPZmYKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCQllbHNlCiAJCQkJewogCQkJCQkvLyBJcyB0cmFuc21pdHRpbmcvcmVjZWl2aW5nID8/Ci0JCQkJCWlmKCAoT1NfQ1VSUkVOVF9SWF9CWVRFKCBBZGFwdGVyICkgIT0gcEh3RGF0YS0+UnhCeXRlQ291bnRMYXN0ICkgfHwKLQkJCQkJCShPU19DVVJSRU5UX1RYX0JZVEUoIEFkYXB0ZXIgKSAhPSBwSHdEYXRhLT5UeEJ5dGVDb3VudExhc3QgKSApCisJCQkJCWlmKCAoYWRhcHRlci0+UnhCeXRlQ291bnQgIT0gcEh3RGF0YS0+UnhCeXRlQ291bnRMYXN0ICkgfHwKKwkJCQkJCShhZGFwdGVyLT5UeEJ5dGVDb3VudCAhPSBwSHdEYXRhLT5UeEJ5dGVDb3VudExhc3QgKSApCiAJCQkJCXsKLQkJCQkJCWlmKCAocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDMwMDAgKQorCQkJCQkJaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDMwMDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDMwMDA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MzAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KIAkJCQkJCX0KIAogCQkJCQkJLy8gVXBkYXRlIHZhcmlhYmxlCi0JCQkJCQlwSHdEYXRhLT5SeEJ5dGVDb3VudExhc3QgPSBPU19DVVJSRU5UX1JYX0JZVEUoIEFkYXB0ZXIgKTsKLQkJCQkJCXBId0RhdGEtPlR4Qnl0ZUNvdW50TGFzdCA9IE9TX0NVUlJFTlRfVFhfQllURSggQWRhcHRlciApOworCQkJCQkJcEh3RGF0YS0+UnhCeXRlQ291bnRMYXN0ID0gYWRhcHRlci0+UnhCeXRlQ291bnQ7CisJCQkJCQlwSHdEYXRhLT5UeEJ5dGVDb3VudExhc3QgPSBhZGFwdGVyLT5UeEJ5dGVDb3VudDsKIAkJCQkJCVRpbWVJbnRlcnZhbCA9IDIwMDsKIAkJCQkJfQogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCS8vIFR1cm4gT24gTEVEXzEgYW5kIGJsaW5raW5nIGlmIHRyYW5zbWl0dGluZy9yZWNlaXZpbmcKLQkJCQkJCSBpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgxMDAwICkKKwkJCQkJCSBpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MTAwMCApCiAJCQkJCQkgewotCQkJCQkJCSBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MzAwMDsKLQkJCQkJCQkgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTAwMDsKLQkJCQkJCQkgV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT24KKwkJCQkJCQkgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgzMDAwOworCQkJCQkJCSByZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTAwMDsKKwkJCQkJCQkgV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCiAJCQkJCQkgfQogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OiAvLyBEZWZhdWx0IHNldHRpbmcuIDIgTEVEIGJlIHBsYWNlZCBvbiBQQ0IuIExFRF8wOiBMaW5rIE9uIExFRF8xIEFjdGl2ZQotCQkJCWlmKCAocFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDMwMDAgKQorCQkJCWlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKIAkJCQl7Ci0JCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDMwMDA7Ly8gTEVEXzEgaXMgYWx3YXlzIG9uIGFuZCBldmVudCBlbmFibGUKLQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDMwMDA7Ly8gTEVEXzEgaXMgYWx3YXlzIG9uIGFuZCBldmVudCBlbmFibGUKKwkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCQkJfQogCiAJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyApCiAJCQkJewogCQkJCQkvLyBHcmF5IGJsaW5raW5nCi0JCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgwZjsKLQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSBMRURncmF5WyAocEh3RGF0YS0+TEVEX0JsaW5raW5nLTEpJTIwIF07Ci0JCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSBMRURncmF5WyAocEh3RGF0YS0+TEVEX0JsaW5raW5nLTEpJTIwIF07CisJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCiAJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyArPSAyOwogCQkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nIDwgNDAgKQpAQCAtNjgxLDI4ICsyNjQsMjggQEAKIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOyAvLyBTdG9wIGJsaW5raW5nCi0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgwZjsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KIAogCQkJCWlmKCBwSHdEYXRhLT5MRURfTGlua09uICkKIAkJCQl7Ci0JCQkJCWlmKCAhKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApICkgLy8gQ2hlY2sgdGhlIExFRF8wCisJCQkJCWlmKCAhKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSApIC8vIENoZWNrIHRoZSBMRURfMAogCQkJCQl7CiAJCQkJCQkvL1RyeSB0byB0dXJuIE9OIExFRF8wIGFmdGVyIGdyYXkgYmxpbmtpbmcKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwogCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMTsgLy9TdGFydCBibGlua2luZwogCQkJCQkJVGltZUludGVydmFsID0gNTA7CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKLQkJCQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAgKSAvLyBDaGVjayB0aGUgTEVEXzAKKwkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkgLy8gQ2hlY2sgdGhlIExFRF8wCiAJCQkJCXsKLQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKLQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOworCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC03MjAsODQgKzMwMywyNDAgQEAKIAl9CiAKIAlwSHdEYXRhLT50aW1lX2NvdW50ICs9IFRpbWVJbnRlcnZhbDsKLQlXYjM1VHhfQ3VycmVudFRpbWUoIHBId0RhdGEsIHBId0RhdGEtPnRpbWVfY291bnQgKTsgLy8gMjAwNjA5MjggYWRkCi0JT1NfVElNRVJfU0VUKCAmcEh3RGF0YS0+TEVEVGltZXIsIFRpbWVJbnRlcnZhbCApOyAvLyAyMDA2MDYyMy4xCisJV2IzNVR4X0N1cnJlbnRUaW1lKGFkYXB0ZXIsIHBId0RhdGEtPnRpbWVfY291bnQpOyAvLyAyMDA2MDkyOCBhZGQKKwlwSHdEYXRhLT5MRURUaW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVGltZUludGVydmFsKTsKKwlhZGRfdGltZXIoJnBId0RhdGEtPkxFRFRpbWVyKTsKK30KKwordTggaGFsX2luaXRfaGFyZHdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJdTE2IFNvZnR3YXJlU2V0OworCisJLy8gSW5pdGlhbCB0aGUgdmFyaWFibGUKKwlwSHdEYXRhLT5NYXhSZWNlaXZlTGlmZVRpbWUgPSBERUZBVUxUX01TRFVfTElGRV9USU1FOyAvLyBTZXR0aW5nIFJ4IG1heGltdW0gTVNEVSBsaWZlIHRpbWUKKwlwSHdEYXRhLT5GcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOyAvLyBTZXR0aW5nIGRlZmF1bHQgZnJhZ21lbnQgdGhyZXNob2xkCisKKwlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAxOworCWlmKCBXYjM1UmVnX2luaXRpYWwocEh3RGF0YSkpIHsKKwkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMjsKKwkJaWYgKFdiMzVUeF9pbml0aWFsKHBId0RhdGEpKSB7CisJCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAzOworCQkJaWYgKFdiMzVSeF9pbml0aWFsKHBId0RhdGEpKSB7CisJCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gNDsKKwkJCQlpbml0X3RpbWVyKCZwSHdEYXRhLT5MRURUaW1lcik7CisJCQkJcEh3RGF0YS0+TEVEVGltZXIuZnVuY3Rpb24gPSBoYWxfbGVkX2NvbnRyb2w7CisJCQkJcEh3RGF0YS0+TEVEVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwcml2OworCQkJCXBId0RhdGEtPkxFRFRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwkJCQlhZGRfdGltZXIoJnBId0RhdGEtPkxFRFRpbWVyKTsKKworCQkJCS8vCisJCQkJLy8gRm9yIHJlc3RyaWN0IHRvIHZlbmRvcidzIGhhcmR3YXJlCisJCQkJLy8KKwkJCQlTb2Z0d2FyZVNldCA9IGhhbF9zb2Z0d2FyZV9zZXQoIHBId0RhdGEgKTsKKworCQkJCSNpZmRlZiBWZW5kb3IyCisJCQkJLy8gVHJ5IHRvIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGNvbnRhaW4KKwkJCQlTb2Z0d2FyZVNldCA+Pj0gODsKKwkJCQlpZiggU29mdHdhcmVTZXQgIT0gMHg4MiApCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkjZW5kaWYKKworCQkJCVdiMzVSeF9zdGFydChodyk7CisJCQkJV2IzNVR4X0VQMlZNX3N0YXJ0KHByaXYpOworCisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7CisJcmV0dXJuIGZhbHNlOwogfQogCiAKK3ZvaWQgaGFsX2hhbHQocGh3X2RhdGFfdCBwSHdEYXRhLCB2b2lkICpwcGFfZGF0YSkKK3sKKwlzd2l0Y2goIHBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSApCisJeworCQljYXNlIDQ6CisJCWNhc2UgMzogZGVsX3RpbWVyX3N5bmMoJnBId0RhdGEtPkxFRFRpbWVyKTsKKwkJCW1zbGVlcCgxMDApOyAvLyBXYWl0IGZvciBUaW1lciBEUEMgZXhpdCA5NDA2MjMuMgorCQkJV2IzNVJ4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgUngKKwkJY2FzZSAyOiBXYjM1VHhfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBUeAorCQljYXNlIDE6IFdiMzVSZWdfZGVzdHJveSggcEh3RGF0YSApOyAvLyBSZWxlYXNlIHRoZSBXYjM1IFJlZ2lzc3RlciByZXNvdXJjZXMKKwl9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIGhhbF9zZXRfYmVhY29uX3BlcmlvZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBiZWFjb25fcGVyaW9kICkKK3sKKwl1MzIJdG1wOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOworCisJcEh3RGF0YS0+QmVhY29uUGVyaW9kID0gYmVhY29uX3BlcmlvZDsKKwl0bXAgPSBwSHdEYXRhLT5CZWFjb25QZXJpb2QgPDwgMTY7CisJdG1wIHw9IHBId0RhdGEtPlByb2JlRGVsYXk7CisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODQ4LCB0bXAgKTsKK30KKworCitzdGF0aWMgdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApCisJCXJldHVybjsKKworCXByaW50aygiR29pbmcgdG8gY2hhbm5lbDogJWQvJWRcbiIsIGNoYW5uZWwuYmFuZCwgY2hhbm5lbC5DaGFuTm8pOworCisJUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCBwSHdEYXRhLCBjaGFubmVsICk7Ly8gU3dpdGNoIGNoYW5uZWwKKwlwSHdEYXRhLT5DaGFubmVsID0gY2hhbm5lbC5DaGFuTm87CisJcEh3RGF0YS0+YmFuZCA9IGNoYW5uZWwuYmFuZDsKKwkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCisJV0JERUJVRygoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwgcEh3RGF0YS0+YmFuZCkpOworCSNlbmRpZgorCXJlZy0+TTI4X01hY0NvbnRyb2wgJj0gfjB4ZmY7IC8vIENsZWFuIGNoYW5uZWwgaW5mb3JtYXRpb24gZmllbGQKKwlyZWctPk0yOF9NYWNDb250cm9sIHw9IGNoYW5uZWwuQ2hhbk5vOworCVdiMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcEh3RGF0YSwgMHgwODI4LCByZWctPk0yOF9NYWNDb250cm9sLAorCQkJCQkoczggKikmY2hhbm5lbCwgc2l6ZW9mKENoYW5JbmZvKSk7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKQoreworCWhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCBwSHdEYXRhLCBjaGFubmVsICk7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBoYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCXJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDIwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKworCWlmIChlbmFibGUpCisJCXJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMjAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7Cit9CisKKy8vZm9yIHdlcCBrZXkgZXJyb3IgZGV0ZWN0aW9uLCB3ZSBuZWVkIHRvIGFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyB0byBiZSByZWNlaXZlZCB0ZW1wb3JhcnkuCit2b2lkIGhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzKCBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSByZXR1cm47CisJaWYgKGVuYWJsZSkgeworCQlyZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDA0MDAwMDA7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworCX0gZWxzZSB7CisJCXJlZy0+TTAwX01hY0NvbnRyb2wmPX4weDAwNDAwMDAwOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKKwl9Cit9CisKK3ZvaWQgaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CisKKwlyZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAxMDAwMDAwOy8vVGhlIEhXIHZhbHVlCisJaWYgKGVuYWJsZSkgIHJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMTAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworfQorCit2b2lkIGhhbF9zZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOworCisJLy8gMjAwNDAxMDggZGVidWcKKwlpZiggIWVuYWJsZSApLy9EdWUgdG8gU01FIGFuZCBNTE1FIGFyZSBub3Qgc3VpdGFibGUgZm9yIDM1CisJCXJldHVybjsKKworCXJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKwlpZiggZW5hYmxlICkKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDA0MDAwMDAwOy8vVGhlIEhXIHZhbHVlCisKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgaGFsX3N0b3AoICBwaHdfZGF0YV90IHBId0RhdGEgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCXBId0RhdGEtPldiMzVSeC5yeF9oYWx0ID0gMTsKKwlXYjM1Unhfc3RvcCggcEh3RGF0YSApOworCisJcEh3RGF0YS0+V2IzNVR4LnR4X2hhbHQgPSAxOworCVdiMzVUeF9zdG9wKCBwSHdEYXRhICk7CisKKwlyZWctPkQwMF9EbWFDb250cm9sICY9IH4weGMwMDAwMDAwOy8vVHggT2ZmLCBSeCBPZmYKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA0MDAsIHJlZy0+RDAwX0RtYUNvbnRyb2wgKTsKK30KKwordW5zaWduZWQgY2hhciBoYWxfaWRsZShwaHdfZGF0YV90IHBId0RhdGEpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCVBXQlVTQglwV2JVc2IgPSAmcEh3RGF0YS0+V2JVc2I7CisKKwlpZiggIXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICYmICggcFdiVXNiLT5EZXRlY3RDb3VudCB8fCByZWctPkVQMHZtX3N0YXRlIT1WTV9TVE9QICkgKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGhhbF9zZXRfcGh5X3R5cGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBQaHlUeXBlICkKIHsKIAlwSHdEYXRhLT5waHlfdHlwZSA9IFBoeVR5cGU7CiB9CiAKLXZvaWQgaGFsX2dldF9waHlfdHlwZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpQaHlUeXBlICkKLXsKLQkqUGh5VHlwZSA9IHBId0RhdGEtPnBoeV90eXBlOwotfQotCi12b2lkIGhhbF9yZXNldF9jb3VudGVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQgPSAwOwotCXBId0RhdGEtPmR0b190eF9mcmFnX2NvdW50ID0gMDsKLQltZW1zZXQoIHBId0RhdGEtPnR4X3JldHJ5X2NvdW50LCAwLCA4KTsKLX0KLQogdm9pZCBoYWxfc2V0X3JhZGlvX21vZGUoIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgcmFkaW9fb2ZmKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCiAJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwogCiAJaWYgKHJhZGlvX29mZikJLy9kaXNhYmxlIEJhc2ViYW5kIHJlY2VpdmUgb2ZmCiAJewogCQlwSHdEYXRhLT5DdXJyZW50UmFkaW9TdyA9IDE7IC8vIG9mZgotCQlwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgJj0gMHhmZmZmZmZiZjsKKwkJcmVnLT5NMjRfTWFjQ29udHJvbCAmPSAweGZmZmZmZmJmOwogCX0KIAllbHNlCiAJewogCQlwSHdEYXRhLT5DdXJyZW50UmFkaW9TdyA9IDA7IC8vIG9uCi0JCXBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCB8PSAweDAwMDAwMDQwOworCQlyZWctPk0yNF9NYWNDb250cm9sIHw9IDB4MDAwMDAwNDA7CiAJfQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgyNCwgcFdiMzVSZWctPk0yNF9NYWNDb250cm9sICk7CisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODI0LCByZWctPk0yNF9NYWNDb250cm9sICk7CiB9CiAKIHU4IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCi0JaWYgKChwV2IzNVJlZy0+QkIyQyAmIEJJVCgxMSkpID09IDApCisJaWYgKChyZWctPkJCMkMgJiBCSVQoMTEpKSA9PSAwKQogCQlyZXR1cm4gMDsKIAllbHNlCiAJCXJldHVybiAxOwogfQogCi12b2lkIGhhbF9zZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IG51bWJlciApCi17Ci0KLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYgKG51bWJlciA9PSAxKSB7Ci0JCXBXYjM1UmVnLT5CQjJDIHw9IEJJVCgxMSk7Ci0JfSBlbHNlIHsKLQkJcFdiMzVSZWctPkJCMkMgJj0gfkJJVCgxMSk7Ci0JfQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAyYywgcFdiMzVSZWctPkJCMkMgKTsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlXQkRFQlVHKCgiQ3VycmVudCBhbnRlbm5hIG51bWJlciA6ICVkXG4iLCBudW1iZXIpKTsKLSNlbmRpZgotfQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vMCA6IHJhZGlvIG9uOyAxOiByYWRpbyBvZmYKIHU4IGhhbF9nZXRfaHdfcmFkaW9fb2ZmKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAogCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybiAxOwogCiAJLy9yZWFkIHRoZSBiaXQxNiBvZiByZWdpc3RlciBVMUIwCi0JV2IzNVJlZ19SZWFkKCBwSHdEYXRhLCAweDNiMCwgJnBXYjM1UmVnLT5VMUIwICk7Ci0JaWYgKChwV2IzNVJlZy0+VTFCMCAmIDB4MDAwMTAwMDApKSB7CisJV2IzNVJlZ19SZWFkKCBwSHdEYXRhLCAweDNiMCwgJnJlZy0+VTFCMCApOworCWlmICgocmVnLT5VMUIwICYgMHgwMDAxMDAwMCkpIHsKIAkJcEh3RGF0YS0+Q3VycmVudFJhZGlvSHcgPSAxOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgewpAQCAtODIzLDU2ICs1NjIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaGFsX3NjYW5fc3RhdHVzX2luZGljYXRlKHBod19kYXRhX3QgcEh3RGF0YSwgdW5zaWduZWQgY2hhciBJc09uUHJvZ3Jlc3MpCi17Ci0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCXBId0RhdGEtPkxFRF9TY2FubmluZyA9IElzT25Qcm9ncmVzcyA/IDEgOiAwOwotfQotCi12b2lkIGhhbF9zeXN0ZW1fcG93ZXJfY2hhbmdlKHBod19kYXRhX3QgcEh3RGF0YSwgdTMyIFBvd2VyU3RhdGUpCi17Ci0JaWYoIFBvd2VyU3RhdGUgIT0gMCApCi0JewotCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7Ci0JCWlmKCBwSHdEYXRhLT5XYlVzYi5Jc1VzYjIwICkKLQkJCWhhbF9zdG9wKCBwSHdEYXRhICk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCAhcEh3RGF0YS0+V2JVc2IuSXNVc2IyMCApCi0JCQloYWxfc3RvcCggcEh3RGF0YSApOwotCX0KLX0KLQotdm9pZCBoYWxfc3VycHJpc2VfcmVtb3ZlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQQURBUFRFUiBBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLQlpZiAoT1NfQVRPTUlDX0lOQyggQWRhcHRlciwgJnBId0RhdGEtPlN1cnByaXNlUmVtb3ZlQ291bnQgKSA9PSAxKSB7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJV0JERUJVRygoIkNhbGxpbmcgaGFsX3N1cnByaXNlX3JlbW92ZVxuIikpOwotCQkjZW5kaWYKLQkJT1NfU1RPUCggQWRhcHRlciApOwotCX0KLX0KLQotdm9pZCBoYWxfcmF0ZV9jaGFuZ2UoICBwaHdfZGF0YV90IHBId0RhdGEgKSAvLyBOb3RpZnkgdGhlIEhBTCByYXRlIGlzIGNoYW5naW5nIDIwMDYwNjEzLjEKLXsKLQlQQURBUFRFUglBZGFwdGVyID0gcEh3RGF0YS0+QWRhcHRlcjsKLQl1OAkJcmF0ZSA9IENVUlJFTlRfVFhfUkFURTsKLQotCUJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyggcEh3RGF0YSwgcmF0ZSApOwotfQotCiB2b2lkIGhhbF9zZXRfcmZfcG93ZXIocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBQb3dlckluZGV4KQogewogCVJGU3ludGhlc2l6ZXJfU2V0UG93ZXJJbmRleCggcEh3RGF0YSwgUG93ZXJJbmRleCApOwogfQotCi11bnNpZ25lZCBjaGFyIGhhbF9zZXRfTEVEKHBod19kYXRhX3QgcEh3RGF0YSwgdTMyIE1vZGUpIC8vIDIwMDYxMTA4IGZvciBXUFMgbGVkIGNvbnRyb2wKLXsKLQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwotCXBId0RhdGEtPkxFRF9jb250cm9sID0gTW9kZTsKLQlPU19USU1FUl9TRVQoICZwSHdEYXRhLT5MRURUaW1lciwgMTAgKTsgLy8gMjAwNjA2MjMKLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCmluZGV4IGVhOTUzMWEuLmU4MDVmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKQEAgLTEsMjUgKzEsMTkgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBEZXZpY2UgcmVsYXRlZCBpbmNsdWRlCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2lmZGVmIFdCX0xJTlVYCi0JI2luY2x1ZGUgImxpbnV4L3didXNiX2YuaCIKLQkjaW5jbHVkZSAibGludXgvd2IzNXJlZ19mLmgiCi0JI2luY2x1ZGUgImxpbnV4L3diMzV0eF9mLmgiCi0JI2luY2x1ZGUgImxpbnV4L3diMzVyeF9mLmgiCi0jZWxzZQotCSNpbmNsdWRlICJ3YnVzYl9mLmgiCi0JI2luY2x1ZGUgIndiMzVyZWdfZi5oIgotCSNpbmNsdWRlICJ3YjM1dHhfZi5oIgotCSNpbmNsdWRlICJ3YjM1cnhfZi5oIgotI2VuZGlmCisjaW5jbHVkZSAid2IzNXJlZ19mLmgiCisjaW5jbHVkZSAid2IzNXR4X2YuaCIKKyNpbmNsdWRlICJ3YjM1cnhfZi5oIgorCisjaW5jbHVkZSAiY29yZS5oIgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRnVuY3Rpb24gZGVjbGFyYXRpb24KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiB2b2lkIGhhbF9yZW1vdmVfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqcG1hY19hZGRyICk7CiB2b2lkIGhhbF9yZW1vdmVfZGVmYXVsdF9rZXkoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgaW5kZXggKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9tYXBwaW5nX2tleSggIHBod19kYXRhX3QgQWRhcHRlciwgIHU4ICpwbWFjX2FkZHIsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9zZXRfZGVmYXVsdF9rZXkoICBwaHdfZGF0YV90IEFkYXB0ZXIsICB1OCBpbmRleCwgIHU4IG51bGxfa2V5LCAgdTggd2VwX29uLCAgdTggKnB0eF90c2MsICB1OCAqcHJ4X3RzYywgIHU4IGtleV90eXBlLCAgdTgga2V5X2xlbiwgIHU4ICpwa2V5X2RhdGEgKTsKK3Vuc2lnbmVkIGNoYXIgaGFsX3NldF9tYXBwaW5nX2tleSggIHBod19kYXRhX3QgYWRhcHRlciwgIHU4ICpwbWFjX2FkZHIsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfZGVmYXVsdF9rZXkoICBwaHdfZGF0YV90IGFkYXB0ZXIsICB1OCBpbmRleCwgIHU4IG51bGxfa2V5LCAgdTggd2VwX29uLCAgdTggKnB0eF90c2MsICB1OCAqcHJ4X3RzYywgIHU4IGtleV90eXBlLCAgdTgga2V5X2xlbiwgIHU4ICpwa2V5X2RhdGEgKTsKIHZvaWQgaGFsX2NsZWFyX2FsbF9kZWZhdWx0X2tleSggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfY2xlYXJfYWxsX2dyb3VwX2tleSggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfY2xlYXJfYWxsX21hcHBpbmdfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CkBAIC0yNywxNCArMjEsMTEgQEAKIHZvaWQgaGFsX2dldF9ldGhlcm5ldF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKmN1cnJlbnRfYWRkcmVzcyApOwogdm9pZCBoYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqY3VycmVudF9hZGRyZXNzICk7CiB2b2lkIGhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqcGV0aGVybmV0X2FkZHJlc3MgKTsKLXVuc2lnbmVkIGNoYXIgaGFsX2luaXRfaGFyZHdhcmUoICBwaHdfZGF0YV90IHBId0RhdGEsICBQQURBUFRFUiBBZGFwdGVyICk7Cit1OCBoYWxfaW5pdF9oYXJkd2FyZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiB2b2lkIGhhbF9zZXRfcG93ZXJfc2F2ZV9tb2RlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdW5zaWduZWQgY2hhciBwb3dlcl9zYXZlLCAgdW5zaWduZWQgY2hhciB3YWtldXAsICB1bnNpZ25lZCBjaGFyIGR0aW0gKTsKIHZvaWQgaGFsX2dldF9wb3dlcl9zYXZlX21vZGUoICBwaHdfZGF0YV90IHBId0RhdGEsICAgdTggKnBpbl9wd3Jfc2F2ZSApOwogdm9pZCBoYWxfc2V0X3Nsb3RfdGltZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IHR5cGUgKTsKICNkZWZpbmUgaGFsX3NldF9hdGltX3dpbmRvdyggX0EsIF9BVE0gKQotdm9pZCBoYWxfc2V0X3JhdGVzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBic3NfcmF0ZXMsICB1OCBsZW5ndGgsICB1bnNpZ25lZCBjaGFyIGJhc2ljX3JhdGVfc2V0ICk7Ci0jZGVmaW5lIGhhbF9zZXRfYmFzaWNfcmF0ZXMoIF9BLCBfUiwgX0wgKSBoYWxfc2V0X3JhdGVzKCBfQSwgX1IsIF9MLCBUUlVFICkKLSNkZWZpbmUgaGFsX3NldF9vcF9yYXRlcyggX0EsIF9SLCBfTCApIGhhbF9zZXRfcmF0ZXMoIF9BLCBfUiwgX0wsIEZBTFNFICkKIHZvaWQgaGFsX3N0YXJ0X2JzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IG1hY19vcF9tb2RlICk7CiB2b2lkIGhhbF9qb2luX3JlcXVlc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBic3NfdHlwZSApOyAvLyAwOkJTUyBTVEEgMTpJQlNTIFNUQS8vCiB2b2lkIGhhbF9zdG9wX3N5bmNfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CkBAIC00NywzOSArMzgsMjUgQEAKIHZvaWQgaGFsX3NldF9jYXBfaW5mbyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBjYXBhYmlsaXR5X2luZm8gKTsKIHZvaWQgaGFsX3NldF9zc2lkKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBzc2lkLCAgdTggc3NpZF9sZW4gKTsKIHZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICk7Ci12b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApOwotdm9pZCBoYWxfZ2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvICpjaGFubmVsICk7CiB2b2lkIGhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApOwogdm9pZCBoYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKTsKIHZvaWQgaGFsX3NldF9hY2NlcHRfYmVhY29uKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICk7Ci12b2lkIGhhbF9zZXRfbXVsdGljYXN0X2FkZHJlc3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqYWRkcmVzcywgIHU4IG51bWJlciApOwotdTggaGFsX2dldF9hY2NlcHRfYmVhY29uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9oYWx0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB2b2lkICpwcGFfZGF0YSApOwogdm9pZCBoYWxfc3RhcnRfdHgwKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9zZXRfcGh5X3R5cGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBQaHlUeXBlICk7Ci12b2lkIGhhbF9nZXRfcGh5X3R5cGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqUGh5VHlwZSApOwotdW5zaWduZWQgY2hhciBoYWxfcmVzZXRfaGFyZHdhcmUoICBwaHdfZGF0YV90IHBId0RhdGEsICB2b2lkKiBwcGEgKTsKLXZvaWQgaGFsX3NldF9jd21pbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4CWN3aW5fbWluICk7CiAjZGVmaW5lIGhhbF9nZXRfY3dtaW4oIF9BICkgKCAoX0EpLT5jd21pbiApCiB2b2lkIGhhbF9zZXRfY3dtYXgoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgY3dpbl9tYXggKTsKICNkZWZpbmUgaGFsX2dldF9jd21heCggX0EgKSAoIChfQSktPmN3bWF4ICkKIHZvaWQgaGFsX3NldF9yc25fd3BhKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyICogUlNOX0lFX0JpdG1hcCAsIHUzMiAqIFJTTl9PVUlfdHlwZSAsIHVuc2lnbmVkIGNoYXIgYkRlc2lyZWRBdXRoTW9kZSk7Ci0vL3MzMiBoYWxfZ2V0X3Jzc2koICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgSGFsUnNzaSApOwotczMyIGhhbF9nZXRfcnNzaSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiAqSGFsUnNzaUFycnksICB1OCBDb3VudCApOwotczMyIGhhbF9nZXRfcnNzaV9ic3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgaWR4LCAgdTggQ291bnQgKTsKIHZvaWQgaGFsX3NldF9jb25uZWN0X2luZm8oICBwaHdfZGF0YV90IHBId0RhdGEsICB1bnNpZ25lZCBjaGFyIGJvQ29ubmVjdCApOwogdTggaGFsX2dldF9lc3Rfc3EzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggQ291bnQgKTsKLXZvaWQgaGFsX2xlZF9jb250cm9sXzFhKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIGhhbF9sZWRfY29udHJvbCggIHZvaWQqIFMxLCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdm9pZCogUzMsICB2b2lkKiBTNCApOwogdm9pZCBoYWxfc2V0X3JmX3Bvd2VyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUG93ZXJJbmRleCApOyAvLyAyMDA2MDYyMSBNb2RpZnkKLXZvaWQgaGFsX3Jlc2V0X2NvdW50ZXIoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX3NldF9yYWRpb19tb2RlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdW5zaWduZWQgY2hhciBib1ZhbHVlKTsKIHZvaWQgaGFsX2Rlc2NyaXB0b3JfaW5kaWNhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICBQREVTQ1JJUFRPUiBwRGVzICk7CiB1OCBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIGhhbF9zZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IG51bWJlciApOwogdTMyIGhhbF9nZXRfYnNzX3BrX2NudCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotI2RlZmluZSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTSggX0EgKSAoIChfQSktPldiMzVSZWcuRUVQUk9NUmVnaW9uICkKKyNkZWZpbmUgaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIF9BICkgKCAoX0EpLT5yZWcuRUVQUk9NUmVnaW9uICkKIHZvaWQgaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMJCSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSk7CiAjZGVmaW5lIGhhbF9nZXRfdHhfYnVmZmVyKCBfQSwgX0IgKSBXYjM1VHhfZ2V0X3R4X2J1ZmZlciggX0EsIF9CICkKIHU4IGhhbF9nZXRfaHdfcmFkaW9fb2ZmCQkJKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CkBAIC04OCwyMCArNjUsMTMgQEAKICNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfaGlnaCggX0EgKSAoX0EtPlJTU0lfaGlnaCkKICNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfbG93KCBfQSApIChfQS0+UlNTSV9sb3cpCiAjZGVmaW5lIGhhbF9zY2FuX2ludGVydmFsKCBfQSApCQkoX0EtPlNjYW5fSW50ZXJ2YWwpCi12b2lkIGhhbF9zY2FuX3N0YXR1c19pbmRpY2F0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgdTggc3RhdHVzKTsJLy8gMDogY29tcGxldGUsIDE6IGluIHByb2dyZXNzCi12b2lkIGhhbF9zeXN0ZW1fcG93ZXJfY2hhbmdlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1MzIgUG93ZXJTdGF0ZSApOyAvLyAyMDA1MTIzMCAtPUQwIDE9RDEgLi4KLXZvaWQgaGFsX3N1cnByaXNlX3JlbW92ZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwogCiAjZGVmaW5lIFBIWV9ERUJVRyggbXNnLCBhcmdzLi4uICkKIAotCi0KLXZvaWQgaGFsX3JhdGVfY2hhbmdlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7IC8vIE5vdGlmeSB0aGUgSEFMIHJhdGUgaXMgY2hhbmdpbmcgMjAwNjA2MTMuMQogdW5zaWduZWQgY2hhciBoYWxfZ2V0X2R4eF9yZWcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgbnVtYmVyLCAgdTMyICogcFZhbHVlICk7CiB1bnNpZ25lZCBjaGFyIGhhbF9zZXRfZHh4X3JlZyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBudW1iZXIsICB1MzIgdmFsdWUgKTsKICNkZWZpbmUgaGFsX2dldF90aW1lX2NvdW50KCBfUCApCShfUC0+dGltZV9jb3VudC8xMCkJLy8gcmV0dXJuIDEwMG1zIGNvdW50CiAjZGVmaW5lIGhhbF9kZXRlY3RfZXJyb3IoIF9QICkJCShfUC0+V2JVc2IuRGV0ZWN0Q291bnQpCi11bnNpZ25lZCBjaGFyIGhhbF9zZXRfTEVEKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIE1vZGUgKTsgLy8gMjAwNjExMDggZm9yIFdQUyBsZWQgY29udHJvbAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFRoZSBmb2xsb3cgZnVuY3Rpb24gaXMgdW51c2VkIGZvciBJUzg5QzM1CkBAIC0xMTMsNyArODMsNiBAQAogI2RlZmluZSBoYWxfaWJzc19kaXNjb25uZWN0KF9BKSBoYWxfc3RvcF9zeW5jX2JzcyhfQSkKICNkZWZpbmUgaGFsX2pvaW5fcmVxdWVzdF9zdG9wKF9BKQogdW5zaWduZWQgY2hhcgloYWxfaWRsZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotI2RlZmluZSBwYV9zdGFsbF9leGVjdXRpb24oIF9BICkJLy9PU19TTEVFUCggMSApCiAjZGVmaW5lIGh3X2dldF9jeHhfcmVnKCBfQSwgX0IsIF9DICkKICNkZWZpbmUgaHdfc2V0X2N4eF9yZWcoIF9BLCBfQiwgX0MgKQogI2RlZmluZSBod19nZXRfZHh4X3JlZyggX0EsIF9CLCBfQyApCWhhbF9nZXRfZHh4X3JlZyggX0EsIF9CLCAodTMyICopX0MgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCmluZGV4IDJlZTNmMGYuLjI3NmQyYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmgKQEAgLTEsMyArMSwxMCBAQAorI2lmbmRlZiBfX1dJTkJPTkRfV0JIQUxfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9XQkhBTF9TX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKwogLy9bMjAwNDA3MjIgV0tdCiAjZGVmaW5lIEhBTF9MRURfU0VUX01BU0sJCTB4MDAxYwkvLzIwMDYwOTAxIEV4dGVuZAogI2RlZmluZSBIQUxfTEVEX1NFVF9TSElGVAkJMgpAQCAtNDE1LDEwICs0MjIsMTAgQEAKIC8vIERldmljZSByZWxhdGVkIGluY2x1ZGUKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpbmNsdWRlICJsaW51eC93YnVzYl9zLmgiCi0jaW5jbHVkZSAibGludXgvd2IzNXJlZ19zLmgiCi0jaW5jbHVkZSAibGludXgvd2IzNXR4X3MuaCIKLSNpbmNsdWRlICJsaW51eC93YjM1cnhfcy5oIgorI2luY2x1ZGUgIndidXNiX3MuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX3MuaCIKKyNpbmNsdWRlICJ3YjM1dHhfcy5oIgorI2luY2x1ZGUgIndiMzVyeF9zLmgiCiAKIAogLy8gRm9yIEhhbCB1c2luZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQ0MiwxNiArNDQ5LDYgQEAKIAl1MzIJRnJhZ0NvdW50OwogCXUzMglETUFGaXg7IC8vVjFfRE1BX0ZJWCBUaGUgdmFyaWFibGUgY2FuIGJlIHJlbW92ZWQgaWYgZHJpdmVyIHdhbnQgdG8gc2F2ZSBtZW0gc3BhY2UgZm9yIFYyLgogCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBGb3IgVVNCIGRyaXZlciwgaGFsIG5lZWQgbW9yZSB2YXJpYWJsZXMuIER1ZSB0bwotCS8vCTEuIE5ESVMtV0RNIG9wZXJhdGlvbgotCS8vCTIuIFRoZSBTTUUsIE1MTUUgYW5kIE9MRCBNRFMgbmVlZCBBZGFwdGVyIHN0cnVjdHVyZSwgYnV0IHRoZSBkcml2ZXIgdW5kZXIgSEFMIGRvZXNuJ3QKLQkvLwkJaGF2ZSB0aGF0IHBhcmFtZXRlciB3aGVuIHJlY2VpdmluZyBhbmQgaW5kaWNhdGluZyBwYWNrZXQuCi0JLy8JCVRoZSBNRFMgbXVzdCBpbnB1dCB0aGUgQWRhcHRlciBwb2ludGVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIGhhbF9pbml0X2hhcmR3YXJlLgotCS8vCQlUaGUgZnVuY3Rpb24gdXNhZ2UgaXMgZGlmZmVyZW50IHRoYW4gUENJIGRyaXZlci4KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXZvaWQqIEFkYXB0ZXI7Ci0KIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJLy8gRGVmaW5pdGlvbiBmb3IgTUFDIGFkZHJlc3MKIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MDYsMTEgKzUwMywxMSBAQAogCS8vIFZhcmlhYmxlIGZvciBlYWNoIG1vZHVsZQogCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJV0JVU0IJCVdiVXNiOyAvLyBOZWVkIFdiVXNiLmgKLQlXQjM1UkVHCQlXYjM1UmVnOyAvLyBOZWVkIFdiMzVSZWcuaAorCXN0cnVjdCB3YjM1X3JlZwlyZWc7IC8vIE5lZWQgV2IzNVJlZy5oCiAJV0IzNVRYCQlXYjM1VHg7IC8vIE5lZWQgV2IzNVR4LmgKIAlXQjM1UlgJCVdiMzVSeDsgLy8gTmVlZCBXYjM1UnguaAogCi0JT1NfVElNRVIJTEVEVGltZXI7Ly8gRm9yIExFRAorCXN0cnVjdCB0aW1lcl9saXN0CUxFRFRpbWVyOy8vIEZvciBMRUQKIAogCXUzMgkJTEVEcG9pbnQ7Ly8gRm9yIExFRAogCkBAIC01NzAsNyArNTY3LDcgQEAKIAl1MzIJCVJ4Qnl0ZUNvdW50TGFzdDsKIAl1MzIJCVR4Qnl0ZUNvdW50TGFzdDsKIAotCXMzMgkJU3VycHJpc2VSZW1vdmVDb3VudDsKKwlhdG9taWNfdAlTdXJwcmlzZVJlbW92ZUNvdW50OwogCiAJLy8gRm9yIGdsb2JhbCB0aW1lcgogCXUzMgkJdGltZV9jb3VudDsvL1RJQ0tfVElNRV8xMDBtcyAxID0gMTAwbXMKQEAgLTYxMiw0ICs2MDksNCBAQAogCXUzMiAgIE51bVJhdGU1NE07CiB9IEhBTF9SQVRFLCAqUEhBTF9SQVRFOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ0NWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNSBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICB3YmxpbnV4LmMKLS8vCi0vLyAgQWJzdHJhY3Q6Ci0vLyAgICBMaW51eCByZWxlYXRlZCByb3V0aW5lcwotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi11MzIKLVdCTElOVVhfTWVtb3J5QWxsb2Modm9pZCogKlZpcnR1YWxBZGRyZXNzLCB1MzIgTGVuZ3RoKQotewotCSpWaXJ0dWFsQWRkcmVzcyA9IGt6YWxsb2MoIExlbmd0aCwgR0ZQX0FUT01JQyApOyAvL0dGUF9LRVJORUwgaXMgbm90IHN1aXRhYmxlCi0KLQlpZiAoKlZpcnR1YWxBZGRyZXNzID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi1zMzIKLUVuY2FwQXRvbWljSW5jKFBBREFQVEVSIEFkYXB0ZXIsIHZvaWQqIHBBdG9taWMpCi17Ci0JUFdCTElOVVggcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQl1MzIJbHRtcDsKLQl1MzIgKglwbHRtcCA9ICh1MzIgKilwQXRvbWljOwotCXNwaW5fbG9ja19pcnEoICZwV2JMaW51eC0+QXRvbWljU3BpbkxvY2sgKTsKLQkoKnBsdG1wKSsrOwotCWx0bXAgPSAoKnBsdG1wKTsKLQlzcGluX3VubG9ja19pcnEoICZwV2JMaW51eC0+QXRvbWljU3BpbkxvY2sgKTsKLQlyZXR1cm4gbHRtcDsKLX0KLQotczMyCi1FbmNhcEF0b21pY0RlYyhQQURBUFRFUiBBZGFwdGVyLCB2b2lkKiBwQXRvbWljKQotewotCVBXQkxJTlVYIHBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0JdTMyCWx0bXA7Ci0JdTMyICoJcGx0bXAgPSAodTMyICopcEF0b21pYzsKLQlzcGluX2xvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JKCpwbHRtcCktLTsKLQlsdG1wID0gKCpwbHRtcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JcmV0dXJuIGx0bXA7Ci19Ci0KLXVuc2lnbmVkIGNoYXIKLVdCTElOVVhfSW5pdGlhbChQQURBUFRFUiBBZGFwdGVyKQotewotCVBXQkxJTlVYIHBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0KLQlzcGluX2xvY2tfaW5pdCggJnBXYkxpbnV4LT5TcGluTG9jayApOwotCXNwaW5fbG9ja19pbml0KCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLXZvaWQKLVdCTGludXhfUmVjZWl2ZVBhY2tldChQQURBUFRFUiBBZGFwdGVyLCBQUlhMQVlFUjEgcFJ4TGF5ZXIxKQotewotCUJVRygpOwotfQotCi0KLXZvaWQKLVdCTElOVVhfR2V0TmV4dFBhY2tldChQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcykKLXsKLQlCVUcoKTsKLX0KLQotdm9pZAotV0JMSU5VWF9HZXROZXh0UGFja2V0Q29tcGxldGVkKFBBREFQVEVSIEFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMpCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQKLVdCTElOVVhfRGVzdHJveShQQURBUFRFUiBBZGFwdGVyKQotewotCVdCTElOVVhfc3RvcCggQWRhcHRlciApOwotI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCi0JV0JERUJVRygoIlt3MzV1bmRdIHVucmVnaXN0ZXJfbmV0ZGV2IVxuIikpOwotI2VuZGlmCi19Ci0KLXZvaWQKLVdCTElOVVhfc3RvcCggIFBBREFQVEVSIEFkYXB0ZXIgKQotewotCVBXQkxJTlVYCXBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBTa2I7Ci0KLQlpZiAoT1NfQVRPTUlDX0lOQyggQWRhcHRlciwgJnBXYkxpbnV4LT5UaHJlYWRDb3VudCApID09IDEpIHsKLQkJLy8gU2h1dGRvd24gbW9kdWxlIGltbWVkaWF0ZWx5Ci0JCXBXYkxpbnV4LT5zaHV0ZG93biA9IDE7Ci0KLQkJd2hpbGUgKHBXYkxpbnV4LT5za2JfYXJyYXlbIHBXYkxpbnV4LT5za2JfR2V0SW5kZXggXSkgewotCQkJLy8gVHJ5aW5nIHRvIGZyZWUgdGhlIHVuLXNlbmRpbmcgcGFja2V0Ci0JCQlwU2tiID0gcFdiTGludXgtPnNrYl9hcnJheVsgcFdiTGludXgtPnNrYl9HZXRJbmRleCBdOwotCQkJcFdiTGludXgtPnNrYl9hcnJheVsgcFdiTGludXgtPnNrYl9HZXRJbmRleCBdID0gTlVMTDsKLQkJCWlmKCBpbl9pcnEoKSApCi0JCQkJZGV2X2tmcmVlX3NrYl9pcnEoIHBTa2IgKTsKLQkJCWVsc2UKLQkJCQlkZXZfa2ZyZWVfc2tiKCBwU2tiICk7Ci0KLQkJCXBXYkxpbnV4LT5za2JfR2V0SW5kZXgrKzsKLQkJCXBXYkxpbnV4LT5za2JfR2V0SW5kZXggJT0gV0JMSU5VWF9QQUNLRVRfQVJSQVlfU0laRTsKLQkJfQotCi0jaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCVdCREVCVUcoKCAiW3czNXVuZF0gU0tCX1JFTEVBU0UgT0tcbiIgKSk7Ci0jZW5kaWYKLQl9Ci0KLQlPU19BVE9NSUNfREVDKCBBZGFwdGVyLCAmcFdiTGludXgtPlRocmVhZENvdW50ICk7Ci19Ci0KLXZvaWQKLVdiV2xhbkhhbHQoICBQQURBUFRFUiBBZGFwdGVyICkKLXsKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUFkYXB0ZXItPnNMb2NhbFBhcmEuU2h1dERvd25lZCA9IFRSVUU7Ci0KLQlNZHNfRGVzdHJveSggQWRhcHRlciApOwotCi0JLy8gVHVybiBvZmYgUnggYW5kIFR4IGhhcmR3YXJlIGFiaWxpdHkKLQloYWxfc3RvcCggJkFkYXB0ZXItPnNId0RhdGEgKTsKLSNpZmRlZiBfUEVfVVNCX0lOSV9EVU1QXwotCVdCREVCVUcoKCJbdzM1dW5kXSBIYWxfc3RvcCBPLksuXG4iKSk7Ci0jZW5kaWYKLQlPU19TTEVFUCgxMDAwMDApOy8vIFdhaXRpbmcgSXJwIGNvbXBsZXRlZAotCi0JLy8gRGVzdHJveSB0aGUgTkRJUyBtb2R1bGUKLQlXQkxJTlVYX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQotCS8vIEhhbHQgdGhlIEhBTAotCWhhbF9oYWx0KCZBZGFwdGVyLT5zSHdEYXRhLCBOVUxMKTsKLX0KLQotdW5zaWduZWQgY2hhcgotV2JXTGFuSW5pdGlhbGl6ZShQQURBUFRFUiBBZGFwdGVyKQotewotCXBod19kYXRhX3QJcEh3RGF0YTsKLQl1OAkJKnBNYWNBZGRyOwotCXU4CQkqcE1hY0FkZHIyOwotCXUzMgkJSW5pdFN0ZXAgPSAwOwotCXU4CQlFRVBST01fcmVnaW9uOwotCXU4CQlId1JhZGlvT2ZmOwotCi0JLy8KLQkvLyBTZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIExpbnV4Ci0JLy8KLQlBZGFwdGVyLT5zTG9jYWxQYXJhLnJlZ2lvbl9JTkYgPSBSRUdJT05fQVVUTzsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlR4UmF0ZU1vZGUgPSBSQVRFX0FVVE87Ci0JcHNMT0NBTC0+Yk1hY09wZXJhdGlvbk1vZGUgPSBNT0RFXzgwMl8xMV9CRzsJLy8gQi9HIG1vZGUKLQlBZGFwdGVyLT5NZHMuVHhSVFNUaHJlc2hvbGQgPSBERUZBVUxUX1JUU1RocmVzaG9sZDsKLQlBZGFwdGVyLT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOwotCWhhbF9zZXRfcGh5X3R5cGUoICZBZGFwdGVyLT5zSHdEYXRhLCBSRl9XQl8yNDJfMSApOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuTVRVc2l6ZSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRTsKLQlwc0xPQ0FMLT5iUHJlYW1ibGVNb2RlID0gQVVUT19NT0RFOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Td1JhZGlvT2ZmID0gRkFMU0U7Ci0JcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCWhhbF9zZXRfcGh5X3R5cGUoIHBId0RhdGEsIFJGX0RFQ0lERV9CWV9JTkYgKTsKLQotCS8vCi0JLy8gSW5pdGlhbCBlYWNoIG1vZHVsZSBhbmQgdmFyaWFibGUKLQkvLwotCWlmICghV0JMSU5VWF9Jbml0aWFsKEFkYXB0ZXIpKSB7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQkJV0JERUJVRygoIlt3MzV1bmRdV0JORElTIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIikpOwotI2VuZGlmCi0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLy8gSW5pdGlhbCBTb2Z0d2FyZSB2YXJpYWJsZQotCUFkYXB0ZXItPnNMb2NhbFBhcmEuU2h1dERvd25lZCA9IEZBTFNFOwotCi0JLy9hZGRlZCBieSB3cyBmb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24KLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJXZXBLZXlFcnJvcj0gRkFMU0U7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5iVG9TZWxmUGFja2V0UmVjZWl2ZWQgPSBGQUxTRTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLldlcEtleURldGVjdFRpbWVyQ291bnQ9IDIgKiAxMDA7IC8vLyAyIHNlY29uZHMKLQotCS8vIEluaXRpYWwgVVNCIGhhbAotCUluaXRTdGVwID0gMTsKLQlwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JaWYgKCFoYWxfaW5pdF9oYXJkd2FyZShwSHdEYXRhLCBBZGFwdGVyKSkKLQkJZ290byBlcnJvcjsKLQotCUVFUFJPTV9yZWdpb24gPSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTSggcEh3RGF0YSApOwotCWlmIChFRVBST01fcmVnaW9uICE9IFJFR0lPTl9BVVRPKQotCQlwc0xPQ0FMLT5yZWdpb24gPSBFRVBST01fcmVnaW9uOwotCWVsc2UgewotCQlpZiAocHNMT0NBTC0+cmVnaW9uX0lORiAhPSBSRUdJT05fQVVUTykKLQkJCXBzTE9DQUwtPnJlZ2lvbiA9IHBzTE9DQUwtPnJlZ2lvbl9JTkY7Ci0JCWVsc2UKLQkJCXBzTE9DQUwtPnJlZ2lvbiA9IFJFR0lPTl9VU0E7CS8vZGVmYXVsdCBzZXR0aW5nCi0JfQotCi0JLy8gR2V0IFNvZnR3YXJlIHNldHRpbmcgZmxhZyBmcm9tIGhhbAotCUFkYXB0ZXItPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5ID0gRkFMU0U7Ci0JaWYgKGhhbF9zb2Z0d2FyZV9zZXQocEh3RGF0YSkgJiAweDAwMDAwMDAxKQotCQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eSA9IFRSVUU7Ci0KLQkvLwotCS8vIEZvciBUUyBtb2R1bGUKLQkvLwotCUluaXRTdGVwID0gMjsKLQotCS8vIEZvciBNRFMgbW9kdWxlCi0JSW5pdFN0ZXAgPSAzOwotCU1kc19pbml0aWFsKEFkYXB0ZXIpOwotCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBJbml0aWFsaXplIHRoZSBTTUUsIFNDQU4sIE1MTUUsIFJPQU0KLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCUluaXRTdGVwID0gNDsKLQlJbml0U3RlcCA9IDU7Ci0JSW5pdFN0ZXAgPSA2OwotCi0JLy8gSWYgbm8gdXNlci1kZWZpbmVkIGFkZHJlc3MgaW4gdGhlIHJlZ2lzdHJ5LCB1c2UgdGhlIGFkZHJlc3NzICJidXJuZWQiIG9uIHRoZSBOSUMgaW5zdGVhZC4KLQlwTWFjQWRkciA9IEFkYXB0ZXItPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3M7Ci0JcE1hY0FkZHIyID0gQWRhcHRlci0+c0xvY2FsUGFyYS5QZXJtYW5lbnRBZGRyZXNzOwotCWhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MoIHBId0RhdGEsIEFkYXB0ZXItPnNMb2NhbFBhcmEuUGVybWFuZW50QWRkcmVzcyApOy8vIFJlYWRpbmcgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIEVFUFJPTQotCWlmIChPU19NRU1PUllfQ09NUEFSRShwTWFjQWRkciwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIE1BQ19BRERSX0xFTkdUSCApKSAvLyBJcyBlcXVhbAotCXsKLQkJbWVtY3B5KCBwTWFjQWRkciwgcE1hY0FkZHIyLCBNQUNfQUREUl9MRU5HVEggKTsKLQl9IGVsc2UgewotCQkvLyBTZXQgdGhlIHVzZXIgZGVmaW5lIE1BQyBhZGRyZXNzCi0JCWhhbF9zZXRfZXRoZXJuZXRfYWRkcmVzcyggcEh3RGF0YSwgQWRhcHRlci0+c0xvY2FsUGFyYS5UaGlzTWFjQWRkcmVzcyApOwotCX0KLQotCS8vZ2V0IGN1cnJlbnQgYW50ZW5uYQotCXBzTE9DQUwtPmJBbnRlbm5hTm8gPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHBId0RhdGEpOwotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCVdCREVCVUcoKCJEcml2ZXIgaW5pdCwgYW50ZW5uYSBubyA9ICVkXG4iLCBwc0xPQ0FMLT5iQW50ZW5uYU5vKSk7Ci0jZW5kaWYKLQloYWxfZ2V0X2h3X3JhZGlvX29mZiggcEh3RGF0YSApOwotCi0JLy8gV2FpdGluZyBmb3IgSEFMIHNldHRpbmcgT0sKLQl3aGlsZSAoIWhhbF9pZGxlKHBId0RhdGEpKQotCQlPU19TTEVFUCgxMDAwMCk7Ci0KLQlNVE9fSW5pdChBZGFwdGVyKTsKLQotCUh3UmFkaW9PZmYgPSBoYWxfZ2V0X2h3X3JhZGlvX29mZiggcEh3RGF0YSApOwotCXBzTE9DQUwtPlJhZGlvT2ZmU3RhdHVzLmJvSHdSYWRpb09mZiA9ICEhSHdSYWRpb09mZjsKLQotCWhhbF9zZXRfcmFkaW9fbW9kZSggcEh3RGF0YSwgKHVuc2lnbmVkIGNoYXIpKHBzTE9DQUwtPlJhZGlvT2ZmU3RhdHVzLmJvU3dSYWRpb09mZiB8fCBwc0xPQ0FMLT5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYpICk7Ci0KLQloYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkgPSAxOyAvLyBOb3RpZnkgaGFsIHRoYXQgdGhlIGRyaXZlciBpcyByZWFkeSBub3cuCi0JLy9zZXQgYSB0eCBwb3dlciBmb3IgcmVmZXJlbmNlLi4uLi4KLS8vCXNtZV9zZXRfdHhfcG93ZXJfbGV2ZWwoQWRhcHRlciwgMTIpOwlGSVhNRT8KLQlyZXR1cm4gVFJVRTsKLQotZXJyb3I6Ci0Jc3dpdGNoIChJbml0U3RlcCkgewotCWNhc2UgNToKLQljYXNlIDQ6Ci0JY2FzZSAzOiBNZHNfRGVzdHJveSggQWRhcHRlciApOwotCWNhc2UgMjoKLQljYXNlIDE6IFdCTElOVVhfRGVzdHJveSggQWRhcHRlciApOwotCQloYWxfaGFsdCggcEh3RGF0YSwgTlVMTCApOwotCWNhc2UgMDogYnJlYWs7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi12b2lkIFdCTElOVVhfQ29ubmVjdFN0YXR1cyhQQURBUFRFUiBBZGFwdGVyLCB1MzIgZmxhZykKLXsKLQlQV0JMSU5VWAlwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCi0JcFdiTGludXgtPkxpbmtTdGF0dXMgPSBmbGFnOyAvLyBPU19ESVNDT05ORUNURUQJb3IgIE9TX0NPTk5FQ1RFRAotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfZi5oCmluZGV4IDY4MjQwYzUuLjg2OGU4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfZi5oCkBAIC0xLDIzICsxLDE2IEBACisjaWZuZGVmIF9fV0JMSU5VWF9GX0gKKyNkZWZpbmUgX19XQkxJTlVYX0ZfSAorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIm1kc19zLmgiCisKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCiAvLwogLy8gd2JsaW51eF9mLmgKIC8vCi11MzIgV0JMSU5VWF9NZW1vcnlBbGxvYyggIHZvaWQqICpWaXJ0dWFsQWRkcmVzcywgIHUzMiBMZW5ndGggKTsKLXMzMiBFbmNhcEF0b21pY0luYyggIFBBREFQVEVSIEFkYXB0ZXIsICB2b2lkKiBwQXRvbWljICk7Ci1zMzIgRW5jYXBBdG9taWNEZWMoICBQQURBUFRFUiBBZGFwdGVyLCAgdm9pZCogcEF0b21pYyApOwotdm9pZCBXQkxpbnV4X1JlY2VpdmVQYWNrZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSApOwotdW5zaWduZWQgY2hhciBXQkxJTlVYX0luaXRpYWwoICBQQURBUFRFUiBBZGFwdGVyICk7CiBpbnQgd2IzNV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKLXZvaWQgV0JMSU5VWF9HZXROZXh0UGFja2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKLXZvaWQgV0JMSU5VWF9HZXROZXh0UGFja2V0Q29tcGxldGVkKCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKLXZvaWQgV0JMSU5VWF9zdG9wKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBXQkxJTlVYX0Rlc3Ryb3koICBQQURBUFRFUiBBZGFwdGVyICk7CiB2b2lkIHdiMzVfc2V0X211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOwogc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB3YjM1X25ldGRldl9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiApOwotdm9pZCBXQkxJTlVYX3N0b3AoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIFdiV2xhbkhhbHQoICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIFdCTElOVVhfQ29ubmVjdFN0YXR1cyggIFBBREFQVEVSIEFkYXB0ZXIsICB1MzIgZmxhZyApOwogCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDJiYjQzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHdibGludXhfcy5oCi0vLwotI2RlZmluZSBPU19NRU1PUllfQUxMT0MoIF9WLCBfUyApCVdCTElOVVhfTWVtb3J5QWxsb2MoIF9WLCBfUyApCi0jZGVmaW5lIE9TX0xJTktfU1RBVFVTCQkJKEFkYXB0ZXItPldiTGludXguTGlua1N0YXR1cyA9PSBPU19DT05ORUNURUQpCi0jZGVmaW5lIE9TX1NFVF9TSFVURE9XTiggX0EgKQkJX0EtPldiTGludXguc2h1dGRvd249MQotI2RlZmluZSBPU19TRVRfUkVTVU1FKCBfQSApCQlfQS0+V2JMaW51eC5zaHV0ZG93bj0wCi0jZGVmaW5lIE9TX0NPTk5FQ1RfU1RBVFVTX0lORElDQVRFKCBfQSwgX0YgKQkJV0JMSU5VWF9Db25uZWN0U3RhdHVzKCBfQSwgX0YgKQotI2RlZmluZSBPU19ESVNDT05ORUNURUQJMAotI2RlZmluZSBPU19DT05ORUNURUQJMQotI2RlZmluZSBPU19TVE9QKCBfQSApCVdCTElOVVhfc3RvcCggX0EgKQotCi0jZGVmaW5lIE9TX0NVUlJFTlRfUlhfQllURSggX0EgKQkJX0EtPldiTGludXguUnhCeXRlQ291bnQKLSNkZWZpbmUgT1NfQ1VSUkVOVF9UWF9CWVRFKCBfQSApCQlfQS0+V2JMaW51eC5UeEJ5dGVDb3VudAotI2RlZmluZSBPU19FVkVOVF9JTkRJQ0FURSggX0EsIF9CLCBfRiApCi0jZGVmaW5lIE9TX1BNS0lEX1NUQVRVU19FVkVOVCggX0EgKQotI2RlZmluZSBPU19SRUNFSVZFX1BBQ0tFVF9JTkRJQ0FURSggX0EsIF9EICkJCVdCTGludXhfUmVjZWl2ZVBhY2tldCggX0EsIF9EICkKLSNkZWZpbmUgT1NfUkVDRUlWRV84MDJfMVhfUEFDS0VUX0lORElDQVRFKCBfQSwgX0QgKQlFQVBfUmVjZWl2ZVBhY2tldCggX0EsIF9EICkKLSNkZWZpbmUgT1NfR0VUX1BBQ0tFVCggX0EsIF9EICkJCQkJV0JMSU5VWF9HZXROZXh0UGFja2V0KCBfQSwgX0QgKQotI2RlZmluZSBPU19HRVRfUEFDS0VUX0NPTVBMRVRFKCBfQSwgX0QgKQlXQkxJTlVYX0dldE5leHRQYWNrZXRDb21wbGV0ZWQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX1NFTkRfUkVTVUxUKCBfQSwgX0lELCBfUiApCi0KLSNkZWZpbmUgV0JMSU5VWF9QQUNLRVRfQVJSQVlfU0laRQkoRVRIRVJORVRfVFhfREVTQ1JJUFRPUlMqNCkKLQotdHlwZWRlZiBzdHJ1Y3QgX1dCTElOVVgKLXsKLQlzcGlubG9ja190CUF0b21pY1NwaW5Mb2NrOwotCXNwaW5sb2NrX3QJU3BpbkxvY2s7Ci0JdTMyCXNodXRkb3duOwotCi0JT1NfQVRPTUlDCVRocmVhZENvdW50OwotCi0JdTMyCUxpbmtTdGF0dXM7CQkvLyBPU19ESVNDT05ORUNURUQgb3IgT1NfQ09OTkVDVEVECi0KLQl1MzIJUnhCeXRlQ291bnQ7Ci0JdTMyCVR4Qnl0ZUNvdW50OwotCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYl9hcnJheVsgV0JMSU5VWF9QQUNLRVRfQVJSQVlfU0laRSBdOwotCXN0cnVjdCBza19idWZmICpwYWNrZXRfcmV0dXJuOwotCXMzMglza2JfU2V0SW5kZXg7Ci0JczMyCXNrYl9HZXRJbmRleDsKLQlzMzIJbmV0aWZfc3RhdGVfc3RvcDsgLy8gMTogc3RvcCAgMDogbm9ybWFsCi19IFdCTElOVVgsICpQV0JMSU5VWDsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDAzZjlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqCisgKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyLgorICovCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAibWRzX2YuaCIKKyNpbmNsdWRlICJtbG1ldHhyeF9mLmgiCisjaW5jbHVkZSAibXRvX2YuaCIKKyNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JsaW51eF9mLmgiCisKK01PRFVMRV9BVVRIT1IoIk9yaWdpbmFsIGJ5OiBKZWZmIExlZTxZWV9MZWVAaXNzYy5jb20udHc+IEFkYXB0ZWQgdG8gMi42LnggYnkgQ29zdGFudGlubyBMZWFuZHJvIChSeGFydCBEZXNrdG9wKSA8bGVfY29zdGFudGlub0BwaXhhcnRhcmdlbnRpbmEuY29tLmFyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUzg5QzM1IDgwMi4xMWJnIFdMQU4gVVNCIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMSIpOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2IzNV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1VTQl9ERVZJQ0UoMHgwNDE2LCAweDAwMzUpfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwMSl9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjA2KX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMTcpfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMCl9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjMzKX0sCisJe1VTQl9ERVZJQ0UoMHgxMTMxLCAweDIwMzUpfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB3YjM1X3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSB3YnNvZnRfcmF0ZXNbXSA9IHsKKwl7IC5iaXRyYXRlID0gMTAsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHdic29mdF9jaGFubmVsc1tdID0geworCXsgLmNlbnRlcl9mcmVxID0gMjQxMn0sCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCB3YnNvZnRfYmFuZF8yR0h6ID0geworCS5jaGFubmVscwk9IHdic29mdF9jaGFubmVscywKKwkubl9jaGFubmVscwk9IEFSUkFZX1NJWkUod2Jzb2Z0X2NoYW5uZWxzKSwKKwkuYml0cmF0ZXMJPSB3YnNvZnRfcmF0ZXMsCisJLm5fYml0cmF0ZXMJPSBBUlJBWV9TSVpFKHdic29mdF9yYXRlcyksCit9OworCitzdGF0aWMgaW50IHdic29mdF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJcHJpbnRrKCJ3YnNvZnRfYWRkIGludGVyZmFjZSBjYWxsZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YnNvZnRfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlwcmludGsoIndic29mdF9yZW1vdmUgaW50ZXJmYWNlIGNhbGxlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdic29mdF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IHdic29mdF9nZXRfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdic29mdF9nZXRfdHhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9zdGF0cyAqc3RhdHMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdic29mdF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKKwkJCQkgICAgIGludCBtY19jb3VudCwgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3QpCit7CisJdW5zaWduZWQgaW50IGJpdF9uciwgbmV3X2ZsYWdzOworCXUzMiBtY19maWx0ZXJbMl07CisJaW50IGk7CisKKwluZXdfZmxhZ3MgPSAwOworCisJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykgeworCQluZXdfZmxhZ3MgfD0gRklGX1BST01JU0NfSU5fQlNTOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKKwl9IGVsc2UgaWYgKCgqdG90YWxfZmxhZ3MgJiBGSUZfQUxMTVVMVEkpIHx8IChtY19jb3VudCA+IDMyKSkgeworCQluZXdfZmxhZ3MgfD0gRklGX0FMTE1VTFRJOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSB+MDsKKwl9IGVsc2UgeworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykgeworCQkJaWYgKCFtY2xpc3QpCisJCQkJYnJlYWs7CisJCQlwcmludGsoIlNob3VsZCBjYWxsIGV0aGVyX2NyYyBoZXJlXG4iKTsKKwkJCS8vYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKwkJCWJpdF9uciA9IDA7CisKKwkJCWJpdF9uciAmPSAweDNGOworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7CisJCX0KKwl9CisKKwlkZXYtPmZsYWdzICY9IH5JRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTOworCisJKnRvdGFsX2ZsYWdzID0gbmV3X2ZsYWdzOworfQorCitzdGF0aWMgaW50IHdic29mdF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJTUxNRVNlbmRGcmFtZShwcml2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBGUkFNRV9UWVBFXzgwMl8xMV9NQU5BR0VNRU5UKTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKworc3RhdGljIGludCB3YnNvZnRfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCXByaXYtPmVuYWJsZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Jzb2Z0X2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmZGV2LT5jb25mOworCUNoYW5JbmZvIGNoOworCisJcHJpbnRrKCJ3YnNvZnRfY29uZmlnIGNhbGxlZFxuIik7CisKKwljaC5iYW5kID0gMTsKKwljaC5DaGFuTm8gPSAxOwkvKiBTaG91bGQgdXNlIGNoYW5uZWxfbnVtLCBvciBzb21ldGhpbmcsIGFzIHRoYXQgaXMgYWxyZWFkeSBwcmUtdHJhbnNsYXRlZCAqLworCisKKwloYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCgmcHJpdi0+c0h3RGF0YSwgY2gpOworCWhhbF9zZXRfYmVhY29uX3BlcmlvZCgmcHJpdi0+c0h3RGF0YSwgY29uZi0+YmVhY29uX2ludCk7CisvLwloYWxfc2V0X2NhcF9pbmZvKCZwcml2LT5zSHdEYXRhLCA/PyApOworLy8gaGFsX3NldF9zc2lkKHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICogcHNzaWQsICB1OCBzc2lkX2xlbik7ID8/CisJaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCZwcml2LT5zSHdEYXRhLCAxKTsKKwloYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cygmcHJpdi0+c0h3RGF0YSwgIDEpOworCWhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCgmcHJpdi0+c0h3RGF0YSwgIDEpOworCWhhbF9zZXRfYWNjZXB0X2JlYWNvbigmcHJpdi0+c0h3RGF0YSwgIDEpOworCWhhbF9zZXRfcmFkaW9fbW9kZSgmcHJpdi0+c0h3RGF0YSwgIDApOworCS8vaGFsX3NldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSwgdTggbnVtYmVyICkKKwkvL2hhbF9zZXRfcmZfcG93ZXIocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBQb3dlckluZGV4KQorCisKKy8vCWhhbF9zdGFydF9ic3MoJnByaXYtPnNId0RhdGEsIFdMQU5fQlNTVFlQRV9JTkZSQVNUUlVDVFVSRSk7CT8/CisKKy8vdm9pZCBoYWxfc2V0X3JhdGVzKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKiBwYnNzX3JhdGVzLAorLy8JCSAgIHU4IGxlbmd0aCwgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCkKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdic29mdF9jb25maWdfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQoreworCXByaW50aygid2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2UgY2FsbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCB3YnNvZnRfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJcHJpbnRrKCJ3YnNvZnRfZ2V0X3RzZiBjYWxsZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgd2Jzb2Z0X29wcyA9IHsKKwkudHgJCQk9IHdic29mdF90eCwKKwkuc3RhcnQJCQk9IHdic29mdF9zdGFydCwJCS8qIFN0YXJ0IGNhbiBiZSBwcmV0dHkgbXVjaCBlbXB0eSBhcyB3ZSBkbyB3YjM1X2h3X2luaXQoKSBkdXJpbmcgcHJvYmU/ICovCisJLnN0b3AJCQk9IHdic29mdF9zdG9wLAorCS5hZGRfaW50ZXJmYWNlCQk9IHdic29mdF9hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlCT0gd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2UsCisJLmNvbmZpZwkJCT0gd2Jzb2Z0X2NvbmZpZywKKwkuY29uZmlnX2ludGVyZmFjZQk9IHdic29mdF9jb25maWdfaW50ZXJmYWNlLAorCS5jb25maWd1cmVfZmlsdGVyCT0gd2Jzb2Z0X2NvbmZpZ3VyZV9maWx0ZXIsCisJLmdldF9zdGF0cwkJPSB3YnNvZnRfZ2V0X3N0YXRzLAorCS5nZXRfdHhfc3RhdHMJCT0gd2Jzb2Z0X2dldF90eF9zdGF0cywKKwkuZ2V0X3RzZgkJPSB3YnNvZnRfZ2V0X3RzZiwKKy8vIGNvbmZfdHg6IGhhbF9zZXRfY3dtaW4oKS9oYWxfc2V0X2N3bWF4OworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2IzNV9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QJcEh3RGF0YTsKKwl1OAkJKnBNYWNBZGRyOworCXU4CQkqcE1hY0FkZHIyOworCXUzMgkJSW5pdFN0ZXAgPSAwOworCXU4CQlFRVBST01fcmVnaW9uOworCXU4CQlId1JhZGlvT2ZmOworCisJLy8KKwkvLyBTZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIExpbnV4CisJLy8KKwlwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbl9JTkYgPSBSRUdJT05fQVVUTzsKKwlwcml2LT5zTG9jYWxQYXJhLlR4UmF0ZU1vZGUgPSBSQVRFX0FVVE87CisJcHJpdi0+c0xvY2FsUGFyYS5iTWFjT3BlcmF0aW9uTW9kZSA9IE1PREVfODAyXzExX0JHOwkvLyBCL0cgbW9kZQorCXByaXYtPk1kcy5UeFJUU1RocmVzaG9sZCA9IERFRkFVTFRfUlRTVGhyZXNob2xkOworCXByaXYtPk1kcy5UeEZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7CisJaGFsX3NldF9waHlfdHlwZSggJnByaXYtPnNId0RhdGEsIFJGX1dCXzI0Ml8xICk7CisJcHJpdi0+c0xvY2FsUGFyYS5NVFVzaXplID0gTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFOworCXByaXYtPnNMb2NhbFBhcmEuYlByZWFtYmxlTW9kZSA9IEFVVE9fTU9ERTsKKwlwcml2LT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvU3dSYWRpb09mZiA9IGZhbHNlOworCXBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwloYWxfc2V0X3BoeV90eXBlKCBwSHdEYXRhLCBSRl9ERUNJREVfQllfSU5GICk7CisKKwkvL2FkZGVkIGJ5IHdzIGZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbgorCXByaXYtPnNMb2NhbFBhcmEuYldlcEtleUVycm9yPSBmYWxzZTsKKwlwcml2LT5zTG9jYWxQYXJhLmJUb1NlbGZQYWNrZXRSZWNlaXZlZCA9IGZhbHNlOworCXByaXYtPnNMb2NhbFBhcmEuV2VwS2V5RGV0ZWN0VGltZXJDb3VudD0gMiAqIDEwMDsgLy8vIDIgc2Vjb25kcworCisJLy8gSW5pdGlhbCBVU0IgaGFsCisJSW5pdFN0ZXAgPSAxOworCXBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlpZiAoIWhhbF9pbml0X2hhcmR3YXJlKGh3KSkKKwkJZ290byBlcnJvcjsKKworCUVFUFJPTV9yZWdpb24gPSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTSggcEh3RGF0YSApOworCWlmIChFRVBST01fcmVnaW9uICE9IFJFR0lPTl9BVVRPKQorCQlwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbiA9IEVFUFJPTV9yZWdpb247CisJZWxzZSB7CisJCWlmIChwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbl9JTkYgIT0gUkVHSU9OX0FVVE8pCisJCQlwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbiA9IHByaXYtPnNMb2NhbFBhcmEucmVnaW9uX0lORjsKKwkJZWxzZQorCQkJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb24gPSBSRUdJT05fVVNBOwkvL2RlZmF1bHQgc2V0dGluZworCX0KKworCS8vIEdldCBTb2Z0d2FyZSBzZXR0aW5nIGZsYWcgZnJvbSBoYWwKKwlwcml2LT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eSA9IGZhbHNlOworCWlmIChoYWxfc29mdHdhcmVfc2V0KHBId0RhdGEpICYgMHgwMDAwMDAwMSkKKwkJcHJpdi0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSB0cnVlOworCisJLy8KKwkvLyBGb3IgVFMgbW9kdWxlCisJLy8KKwlJbml0U3RlcCA9IDI7CisKKwkvLyBGb3IgTURTIG1vZHVsZQorCUluaXRTdGVwID0gMzsKKwlNZHNfaW5pdGlhbChwcml2KTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5pdGlhbGl6ZSB0aGUgU01FLCBTQ0FOLCBNTE1FLCBST0FNCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlJbml0U3RlcCA9IDQ7CisJSW5pdFN0ZXAgPSA1OworCUluaXRTdGVwID0gNjsKKworCS8vIElmIG5vIHVzZXItZGVmaW5lZCBhZGRyZXNzIGluIHRoZSByZWdpc3RyeSwgdXNlIHRoZSBhZGRyZXNzcyAiYnVybmVkIiBvbiB0aGUgTklDIGluc3RlYWQuCisJcE1hY0FkZHIgPSBwcml2LT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzOworCXBNYWNBZGRyMiA9IHByaXYtPnNMb2NhbFBhcmEuUGVybWFuZW50QWRkcmVzczsKKwloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKCBwSHdEYXRhLCBwcml2LT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3MgKTsvLyBSZWFkaW5nIGV0aGVybmV0IGFkZHJlc3MgZnJvbSBFRVBST00KKwlpZiAobWVtY21wKHBNYWNBZGRyLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgTUFDX0FERFJfTEVOR1RIKSA9PSAwKQorCQltZW1jcHkocE1hY0FkZHIsIHBNYWNBZGRyMiwgTUFDX0FERFJfTEVOR1RIKTsKKwllbHNlIHsKKwkJLy8gU2V0IHRoZSB1c2VyIGRlZmluZSBNQUMgYWRkcmVzcworCQloYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MocEh3RGF0YSwgcHJpdi0+c0xvY2FsUGFyYS5UaGlzTWFjQWRkcmVzcyk7CisJfQorCisJLy9nZXQgY3VycmVudCBhbnRlbm5hCisJcHJpdi0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihwSHdEYXRhKTsKKyNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KKwlXQkRFQlVHKCgiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHNMT0NBTC0+YkFudGVubmFObykpOworI2VuZGlmCisJaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKKworCS8vIFdhaXRpbmcgZm9yIEhBTCBzZXR0aW5nIE9LCisJd2hpbGUgKCFoYWxfaWRsZShwSHdEYXRhKSkKKwkJbXNsZWVwKDEwKTsKKworCU1UT19Jbml0KHByaXYpOworCisJSHdSYWRpb09mZiA9IGhhbF9nZXRfaHdfcmFkaW9fb2ZmKCBwSHdEYXRhICk7CisJcHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYgPSAhIUh3UmFkaW9PZmY7CisKKwloYWxfc2V0X3JhZGlvX21vZGUoIHBId0RhdGEsICh1bnNpZ25lZCBjaGFyKShwcml2LT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvU3dSYWRpb09mZiB8fCBwcml2LT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvSHdSYWRpb09mZikgKTsKKworCWhhbF9kcml2ZXJfaW5pdF9PSyhwSHdEYXRhKSA9IDE7IC8vIE5vdGlmeSBoYWwgdGhhdCB0aGUgZHJpdmVyIGlzIHJlYWR5IG5vdy4KKwkvL3NldCBhIHR4IHBvd2VyIGZvciByZWZlcmVuY2UuLi4uLgorLy8Jc21lX3NldF90eF9wb3dlcl9sZXZlbChwcml2LCAxMik7CUZJWE1FPworCXJldHVybiB0cnVlOworCitlcnJvcjoKKwlzd2l0Y2ggKEluaXRTdGVwKSB7CisJY2FzZSA1OgorCWNhc2UgNDoKKwljYXNlIDM6IE1kc19EZXN0cm95KCBwcml2ICk7CisJY2FzZSAyOgorCWNhc2UgMTogaGFsX2hhbHQoIHBId0RhdGEsIE5VTEwgKTsKKwljYXNlIDA6IGJyZWFrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCB3YjM1X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpCit7CisJUFdCVVNCCQlwV2JVc2I7CisgICAgICAgIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXUzMglsdG1wOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OworCWludCBlcnI7CisKKwl1c2JfZ2V0X2Rldih1ZGV2KTsKKworCS8vIDIwMDYwNjMwLjIgQ2hlY2sgdGhlIGRldmljZSBpZiBpdCBhbHJlYWR5IGJlIG9wZW5lZAorCWVyciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUoIHVkZXYsIDAgKSwKKwkJCSAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCisJCQkgICAgICAweDAsIDB4NDAwLCAmbHRtcCwgNCwgSFoqMTAwICk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCWx0bXAgPSBjcHVfdG9fbGUzMihsdG1wKTsKKwlpZiAobHRtcCkgeyAgLy8gSXMgYWxyZWFkeSBpbml0aWFsaXplZD8KKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCWRldiA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnByaXYpLCAmd2Jzb2Z0X29wcyk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyb3I7CisKKwlwcml2ID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPlNwaW5Mb2NrKTsKKworCXBXYlVzYiA9ICZwcml2LT5zSHdEYXRhLldiVXNiOworCXBXYlVzYi0+dWRldiA9IHVkZXY7CisKKyAgICAgICAgaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisgICAgICAgIGVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpIHsKKwkJcHJpbnRrKCJbdzM1dW5kXSBXb3JraW5nIG9uIFVTQiAyLjBcbiIpOworCQlwV2JVc2ItPklzVXNiMjAgPSAxOworCX0KKworCWlmICghd2IzNV9od19pbml0KGRldikpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9mcmVlX2h3OworCX0KKworCVNFVF9JRUVFODAyMTFfREVWKGRldiwgJnVkZXYtPmRldik7CisJeworCQlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwkJdW5zaWduZWQgY2hhcgkJZGV2X2FkZHJbTUFYX0FERFJfTEVOXTsKKwkJaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyhwSHdEYXRhLCBkZXZfYWRkcik7CisJCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKGRldiwgZGV2X2FkZHIpOworCX0KKworCWRldi0+ZXh0cmFfdHhfaGVhZHJvb20gPSAxMjsJLyogRklYTUUgKi8KKwlkZXYtPmZsYWdzID0gMDsKKworCWRldi0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDEwMDA7CisJZGV2LT5xdWV1ZXMgPSAxOworCisJZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmd2Jzb2Z0X2JhbmRfMkdIejsKKworCWVyciA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZnJlZV9odzsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcHJpdik7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9odzoKKwlpZWVlODAyMTFfZnJlZV9odyhkZXYpOworZXJyb3I6CisJdXNiX3B1dF9kZXYodWRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgd2IzNV9od19oYWx0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKK3sKKwlNZHNfRGVzdHJveSggYWRhcHRlciApOworCisJLy8gVHVybiBvZmYgUnggYW5kIFR4IGhhcmR3YXJlIGFiaWxpdHkKKwloYWxfc3RvcCggJmFkYXB0ZXItPnNId0RhdGEgKTsKKyNpZmRlZiBfUEVfVVNCX0lOSV9EVU1QXworCVdCREVCVUcoKCJbdzM1dW5kXSBIYWxfc3RvcCBPLksuXG4iKSk7CisjZW5kaWYKKwltc2xlZXAoMTAwKTsvLyBXYWl0aW5nIElycCBjb21wbGV0ZWQKKworCS8vIEhhbHQgdGhlIEhBTAorCWhhbF9oYWx0KCZhZGFwdGVyLT5zSHdEYXRhLCBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZCB3YjM1X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXdiMzVfaHdfaGFsdChwcml2KTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3YjM1X2RyaXZlciA9IHsKKwkubmFtZQkJPSAidzM1dW5kIiwKKwkuaWRfdGFibGUJPSB3YjM1X3RhYmxlLAorCS5wcm9iZQkJPSB3YjM1X3Byb2JlLAorCS5kaXNjb25uZWN0CT0gd2IzNV9kaXNjb25uZWN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2IzNV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmd2IzNV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2IzNV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQod2IzNV9pbml0KTsKK21vZHVsZV9leGl0KHdiMzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlOTM2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiX3MuaApAQCAtMCwwICsxLDM3IEBACisvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKy8vIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgorLy8KKy8vICBNb2R1bGUgTmFtZToKKy8vICAgIHdidXNiX3MuaAorLy8KKy8vICBBYnN0cmFjdDoKKy8vICAgIExpbnV4IGRyaXZlci4KKy8vCisvLyAgQXV0aG9yOgorLy8KKy8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKworI2lmbmRlZiBfX1dJTkJPTkRfV0JVU0JfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9XQlVTQl9TX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUldfQ09OVEVYVCAtLQorLy8KKy8vICBVc2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgaW8gaXJwcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IF9SV19DT05URVhUCit7CisJdm9pZCoJCQlwSHdEYXRhOworCXN0cnVjdCB1cmIJCSp1cmI7CisJdm9pZCoJCQlwQ2FsbEJhY2tGdW5jdGlvblBhcmFtZXRlcjsKK30gUldfQ09OVEVYVCwgKlBSV19DT05URVhUOworCit0eXBlZGVmIHN0cnVjdCBfV0JVU0IgeworCXUzMglJc1VzYjIwOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXUzMglEZXRlY3RDb3VudDsKK30gV0JVU0IsICpQV0JVU0I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKaW5kZXggMjQyNWQ4Ni4uOTk1OWI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCkBAIC0xLDkgKzEsOSBAQAogY29uZmlnIFBSSVNNMl9VU0IKLQl0cmlzdGF0ZSAiUHJpc20yLjUgVVNCIGRyaXZlciIKLQlkZXBlbmRzIG9uIFdMQU5fODAyMTEgJiYgVVNCCisJdHJpc3RhdGUgIlByaXNtMi41LzMgVVNCIGRyaXZlciIKKwlkZXBlbmRzIG9uIFdMQU5fODAyMTEgJiYgVVNCICYmIFdJUkVMRVNTX0VYVAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgdGhlIHdsYW4tbmcgcHJpc20gMi41IFVTQiBkcml2ZXIgZm9yIGEgd2lkZSByYW5nZSBvZgorCSAgVGhpcyBpcyB0aGUgd2xhbi1uZyBwcmlzbSAyLjUvMyBVU0IgZHJpdmVyIGZvciBhIHdpZGUgcmFuZ2Ugb2YKIAkgIG9sZCBVU0Igd2lyZWxlc3MgZGV2aWNlcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9NYWtlZmlsZQppbmRleCA3NzdiNTExLi41ZWRhYzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9NYWtlZmlsZQpAQCAtMSw3ICsxLDYgQEAKIG9iai0kKENPTkZJR19QUklTTTJfVVNCKSArPSBwcmlzbTJfdXNiLm8KLW9iai0kKENPTkZJR19QUklTTTJfVVNCKSArPSBwODAyMTEubwogCi1wODAyMTEtb2JqcyA6PSBwODAyMTFtb2QubyBcCitwcmlzbTJfdXNiLW9ianMgOj0gcHJpc20ydXNiLm8gXAogCQlwODAyMTFjb252Lm8gXAogCQlwODAyMTFyZXEubyBcCiAJCXA4MDIxMXdlcC5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL1JFQURNRQppbmRleCBmNTBlNGViLi45YzEwZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvUkVBRE1FCkBAIC0zLDYgKzMsNSBAQAogCS0gc3BhcnNlIHdhcm5pbmdzCiAJLSBMaW5kZW50IGNsZWFudXBzCiAJLSBtb3ZlIHRvIHVzZSB0aGUgaW4ta2VybmVsIHdpcmVsZXNzIHN0YWNrCi0JLSBwb3NzaWJsZSBlbmFibGUgdGhlIHBjbWNpYSBhbmQgcGNpIHBvcnRpb25zIG9mIHRoZSBkcml2ZXIKIAogUGxlYXNlIHNlbmQgYWxsIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZjNmZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDE4ICswLDAgQEAKLS8qIHNyYy9wcmlzbTIvZHJpdmVyL2hmYTM4NHguYwotKgotKiBJbXBsZW1lbnRzIHRoZSBmdW5jdGlvbnMgb2YgdGhlIEludGVyc2lsIGhmYTM4NHggTUFDCi0qCi0qIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIGxpbnV4LXdsYW4KLSoKLSogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwotKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0qCi0qICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCi0qICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKLSogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKLSogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKLSogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0qICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCi0qICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKLSogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcwotKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQotKiBtYWRlIGRpcmVjdGx5IHRvOgotKgotKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgotKiBpbmZvQGxpbnV4LXdsYW4uY29tCi0qIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKLSogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHByaXNtMi9oZmEzODR4Ci0qIDgwMi4xMSBNQUMgaGFyZHdhcmUgYW5kIGZpcm13YXJlIGhvc3QgaW50ZXJmYWNlLgotKgotKiBUaGUgZnVuY3Rpb25zIGNhbiBiZSBjb25zaWRlcmVkIHRvIHJlcHJlc2VudCBzZXZlcmFsIGxldmVscyBvZgotKiBhYnN0cmFjdGlvbi4gIFRoZSBsb3dlc3QgbGV2ZWwgZnVuY3Rpb25zIGFyZSBzaW1wbHkgQy1jYWxsYWJsZSB3cmFwcGVycwotKiBhcm91bmQgdGhlIHJlZ2lzdGVyIGFjY2Vzc2VzLiAgVGhlIG5leHQgaGlnaGVyIGxldmVsIHJlcHJlc2VudHMgQy1jYWxsYWJsZQotKiBwcmlzbTIgQVBJIGZ1bmN0aW9ucyB0aGF0IG1hdGNoIHRoZSBJbnRlcnNpbCBkb2N1bWVudGF0aW9uIGFzIGNsb3NlbHkKLSogYXMgaXMgcmVhc29uYWJsZS4gIFRoZSBuZXh0IGhpZ2hlciBsYXllciBpbXBsZW1lbnRzIGNvbW1vbiBzZXF1ZW5jZXMKLSogb2YgaW52b2thdGlvbnMgb2YgdGhlIEFQSSBsYXllciAoZS5nLiB3cml0ZSB0byBiYXAsIGZvbGxvd2VkIGJ5IGNtZCkuCi0qCi0qIENvbW1vbiBzZXF1ZW5jZXM6Ci0qIGhmYTM4NHhfZHJ2cl94eHgJSGlnaGVzdCBsZXZlbCBhYnN0cmFjdGlvbnMgcHJvdmlkZWQgYnkgdGhlCi0qCQkJaGZhMzg0eCBjb2RlLiAgVGhleSBhcmUgZHJpdmVyIGRlZmluZWQgd3JhcHBlcnMKLSoJCQlmb3IgY29tbW9uIHNlcXVlbmNlcy4gIFRoZXNlIGZ1bmN0aW9ucyBnZW5lcmFsbHkKLSoJCQl1c2UgdGhlIHNlcnZpY2VzIG9mIHRoZSBsb3dlciBsZXZlbHMuCi0qCi0qIGhmYTM4NHhfZHJ2cl94eHhjb25maWcgIEFuIGV4YW1wbGUgb2YgdGhlIGRydnIgbGV2ZWwgYWJzdHJhY3Rpb24uIFRoZXNlCi0qCQkJZnVuY3Rpb25zIGFyZSB3cmFwcGVycyBmb3IgdGhlIFJJRCBnZXQvc2V0Ci0qCQkJc2VxdWVuY2UuIFRoZXkgCWNhbGwgY29weV9bdG98ZnJvbV1fYmFwKCkgYW5kCi0qCQkJY21kX2FjY2VzcygpLglUaGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiB0aGUKLSoJCQlSSURzIGFuZCBidWZmZXJzIHdpdGhvdXQgdmFsaWRhdGlvbi4gIFRoZSBjYWxsZXIKLSoJCQlpcyByZXNwb25zaWJsZSBmb3IgdGhhdC4KLSoKLSogQVBJIHdyYXBwZXIgZnVuY3Rpb25zOgotKiBoZmEzODR4X2NtZF94eHgJZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGYvdyBjb21tYW5kcy4KLSoJCQlUaGUgZnVuY3Rpb24gYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gZWFjaCBjb21tYW5kCi0qCQkJYXJndW1lbnQsIGV2ZW4gY29tbWFuZCBhcmd1bWVudHMgdGhhdCBnZXQgcGFja2VkCi0qCQkJaW50byBzaW5nbGUgcmVnaXN0ZXJzLiAgVGhlc2UgZnVuY3Rpb25zIF9qdXN0XwotKgkJCWlzc3VlIHRoZSBjb21tYW5kIGJ5IHNldHRpbmcgdGhlIGNtZC9wYXJtIHJlZ3MKLSoJCQkmIHJlYWRpbmcgdGhlIHN0YXR1cy9yZXNwIHJlZ3MuICBBZGRpdGlvbmFsCi0qCQkJYWN0aXZpdGllcyByZXF1aXJlZCB0byBmdWxseSB1c2UgYSBjb21tYW5kCi0qCQkJKHJlYWQvd3JpdGUgZnJvbS90byBiYXAsIGdldC9zZXQgaW50IHN0YXR1cyBldGMuKQotKgkJCWFyZSBpbXBsZW1lbnRlZCBzZXBhcmF0ZWx5LiAgVGhpbmsgb2YgdGhlc2UgYXMKLSoJCQlDLWNhbGxhYmxlIHByaXNtMiBjb21tYW5kcy4KLSoKLSogTG93ZXN0IExheWVyIEZ1bmN0aW9uczoKLSogaGZhMzg0eF9kb2NtZF94eHgJVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgc2VxdWVuY2UgcmVxdWlyZWQKLSoJCQl0byBpc3N1ZSBhbnkgcHJpc20yIGNvbW1hbmQuICBQcmltYXJpbHkgdXNlZCBieSB0aGUKLSoJCQloZmEzODR4X2NtZF94eHggZnVuY3Rpb25zLgotKgotKiBoZmEzODR4X2JhcF94eHgJQkFQIHJlYWQvd3JpdGUgYWNjZXNzIGZ1bmN0aW9ucy4KLSoJCQlOb3RlOiB3ZSB1c3VhbGx5IHVzZSBCQVAwIGZvciBub24taW50ZXJydXB0IGNvbnRleHQKLSoJCQkgYW5kIEJBUDEgZm9yIGludGVycnVwdCBjb250ZXh0LgotKgotKiBoZmEzODR4X2RsX3h4eAlkb3dubG9hZCByZWxhdGVkIGZ1bmN0aW9ucy4KLSoKLSogRHJpdmVyIFN0YXRlIElzc3VlczoKLSogTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gcGFpcnMgb2YgZnVuY3Rpb25zIHRoYXQgbWFuYWdlIHRoZQotKiAnaW5pdGlhbGl6ZWQnIGFuZCAncnVubmluZycgc3RhdGVzIG9mIHRoZSBody9NQUMgY29tYm8uICBUaGUgZm91cgotKiBmdW5jdGlvbnMgYXJlIGNyZWF0ZSgpLCBkZXN0cm95KCksIHN0YXJ0KCksIGFuZCBzdG9wKCkuICBjcmVhdGUoKQotKiBzZXRzIHVwIHRoZSBkYXRhIHN0cnVjdHVyZXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgaGZhMzg0eF8qCi0qIGZ1bmN0aW9ucyBhbmQgZGVzdHJveSgpIGNsZWFucyB0aGVtIHVwLiAgVGhlIHN0YXJ0KCkgZnVuY3Rpb24gZ2V0cwotKiB0aGUgYWN0dWFsIGhhcmR3YXJlIHJ1bm5pbmcgYW5kIGVuYWJsZXMgdGhlIGludGVycnVwdHMuICBUaGUgc3RvcCgpCi0qIGZ1bmN0aW9uIHNodXRzIHRoZSBoYXJkd2FyZSBkb3duLiAgVGhlIHNlcXVlbmNlIHNob3VsZCBiZToKLSogY3JlYXRlKCkKLSogIC4KLSogIC4gIFNlbGYgY29udGFpbmVkIHRlc3Qgcm91dGluZXMgY2FuIHJ1biBoZXJlLCBwYXJ0aWN1bGFybHkKLSogIC4gIGNvcmVyZXNldCgpIGFuZCB0ZXN0X2hvc3RpZigpLgotKiAgLgotKiBzdGFydCgpCi0qICAuCi0qICAuICBEbyBpbnRlcmVzdGluZyB0aGluZ3Mgdy8gdGhlIGhhcmR3YXJlCi0qICAuCi0qIHN0b3AoKQotKiBkZXN0cm95KCkKLSoKLSogTm90ZSB0aGF0IGRlc3Ryb3koKSBjYW4gYmUgY2FsbGVkIHdpdGhvdXQgY2FsbGluZyBzdG9wKCkgZmlyc3QuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBTeXN0ZW0gSW5jbHVkZXMgKi8KLSNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNlbmRpZgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTMpICkKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLSNlbmRpZgotCi0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKSkKLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKLQotLy8gWFhYWCAjZGVmaW5lIENNRF9JUlEKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIFByb2plY3QgSW5jbHVkZXMgKi8KLQotI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCi0jaW5jbHVkZSAicDgwMjExaGRyLmgiCi0jaW5jbHVkZSAicDgwMjExbWdtdC5oIgotI2luY2x1ZGUgInA4MDIxMWNvbnYuaCIKLSNpbmNsdWRlICJwODAyMTFtc2cuaCIKLSNpbmNsdWRlICJwODAyMTFuZXRkZXYuaCIKLSNpbmNsdWRlICJwODAyMTFyZXEuaCIKLSNpbmNsdWRlICJwODAyMTFtZXRhZGVmLmgiCi0jaW5jbHVkZSAicDgwMjExbWV0YXN0cnVjdC5oIgotI2luY2x1ZGUgImhmYTM4NHguaCIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBDb25zdGFudHMgKi8KLQotc3RhdGljIGNvbnN0IFVJTlQxNiBjcmMxNnRhYlsyNTZdID0KLXsKLQkweDAwMDAsIDB4YzBjMSwgMHhjMTgxLCAweDAxNDAsIDB4YzMwMSwgMHgwM2MwLCAweDAyODAsIDB4YzI0MSwKLQkweGM2MDEsIDB4MDZjMCwgMHgwNzgwLCAweGM3NDEsIDB4MDUwMCwgMHhjNWMxLCAweGM0ODEsIDB4MDQ0MCwKLQkweGNjMDEsIDB4MGNjMCwgMHgwZDgwLCAweGNkNDEsIDB4MGYwMCwgMHhjZmMxLCAweGNlODEsIDB4MGU0MCwKLQkweDBhMDAsIDB4Y2FjMSwgMHhjYjgxLCAweDBiNDAsIDB4YzkwMSwgMHgwOWMwLCAweDA4ODAsIDB4Yzg0MSwKLQkweGQ4MDEsIDB4MThjMCwgMHgxOTgwLCAweGQ5NDEsIDB4MWIwMCwgMHhkYmMxLCAweGRhODEsIDB4MWE0MCwKLQkweDFlMDAsIDB4ZGVjMSwgMHhkZjgxLCAweDFmNDAsIDB4ZGQwMSwgMHgxZGMwLCAweDFjODAsIDB4ZGM0MSwKLQkweDE0MDAsIDB4ZDRjMSwgMHhkNTgxLCAweDE1NDAsIDB4ZDcwMSwgMHgxN2MwLCAweDE2ODAsIDB4ZDY0MSwKLQkweGQyMDEsIDB4MTJjMCwgMHgxMzgwLCAweGQzNDEsIDB4MTEwMCwgMHhkMWMxLCAweGQwODEsIDB4MTA0MCwKLQkweGYwMDEsIDB4MzBjMCwgMHgzMTgwLCAweGYxNDEsIDB4MzMwMCwgMHhmM2MxLCAweGYyODEsIDB4MzI0MCwKLQkweDM2MDAsIDB4ZjZjMSwgMHhmNzgxLCAweDM3NDAsIDB4ZjUwMSwgMHgzNWMwLCAweDM0ODAsIDB4ZjQ0MSwKLQkweDNjMDAsIDB4ZmNjMSwgMHhmZDgxLCAweDNkNDAsIDB4ZmYwMSwgMHgzZmMwLCAweDNlODAsIDB4ZmU0MSwKLQkweGZhMDEsIDB4M2FjMCwgMHgzYjgwLCAweGZiNDEsIDB4MzkwMCwgMHhmOWMxLCAweGY4ODEsIDB4Mzg0MCwKLQkweDI4MDAsIDB4ZThjMSwgMHhlOTgxLCAweDI5NDAsIDB4ZWIwMSwgMHgyYmMwLCAweDJhODAsIDB4ZWE0MSwKLQkweGVlMDEsIDB4MmVjMCwgMHgyZjgwLCAweGVmNDEsIDB4MmQwMCwgMHhlZGMxLCAweGVjODEsIDB4MmM0MCwKLQkweGU0MDEsIDB4MjRjMCwgMHgyNTgwLCAweGU1NDEsIDB4MjcwMCwgMHhlN2MxLCAweGU2ODEsIDB4MjY0MCwKLQkweDIyMDAsIDB4ZTJjMSwgMHhlMzgxLCAweDIzNDAsIDB4ZTEwMSwgMHgyMWMwLCAweDIwODAsIDB4ZTA0MSwKLQkweGEwMDEsIDB4NjBjMCwgMHg2MTgwLCAweGExNDEsIDB4NjMwMCwgMHhhM2MxLCAweGEyODEsIDB4NjI0MCwKLQkweDY2MDAsIDB4YTZjMSwgMHhhNzgxLCAweDY3NDAsIDB4YTUwMSwgMHg2NWMwLCAweDY0ODAsIDB4YTQ0MSwKLQkweDZjMDAsIDB4YWNjMSwgMHhhZDgxLCAweDZkNDAsIDB4YWYwMSwgMHg2ZmMwLCAweDZlODAsIDB4YWU0MSwKLQkweGFhMDEsIDB4NmFjMCwgMHg2YjgwLCAweGFiNDEsIDB4NjkwMCwgMHhhOWMxLCAweGE4ODEsIDB4Njg0MCwKLQkweDc4MDAsIDB4YjhjMSwgMHhiOTgxLCAweDc5NDAsIDB4YmIwMSwgMHg3YmMwLCAweDdhODAsIDB4YmE0MSwKLQkweGJlMDEsIDB4N2VjMCwgMHg3ZjgwLCAweGJmNDEsIDB4N2QwMCwgMHhiZGMxLCAweGJjODEsIDB4N2M0MCwKLQkweGI0MDEsIDB4NzRjMCwgMHg3NTgwLCAweGI1NDEsIDB4NzcwMCwgMHhiN2MxLCAweGI2ODEsIDB4NzY0MCwKLQkweDcyMDAsIDB4YjJjMSwgMHhiMzgxLCAweDczNDAsIDB4YjEwMSwgMHg3MWMwLCAweDcwODAsIDB4YjA0MSwKLQkweDUwMDAsIDB4OTBjMSwgMHg5MTgxLCAweDUxNDAsIDB4OTMwMSwgMHg1M2MwLCAweDUyODAsIDB4OTI0MSwKLQkweDk2MDEsIDB4NTZjMCwgMHg1NzgwLCAweDk3NDEsIDB4NTUwMCwgMHg5NWMxLCAweDk0ODEsIDB4NTQ0MCwKLQkweDljMDEsIDB4NWNjMCwgMHg1ZDgwLCAweDlkNDEsIDB4NWYwMCwgMHg5ZmMxLCAweDllODEsIDB4NWU0MCwKLQkweDVhMDAsIDB4OWFjMSwgMHg5YjgxLCAweDViNDAsIDB4OTkwMSwgMHg1OWMwLCAweDU4ODAsIDB4OTg0MSwKLQkweDg4MDEsIDB4NDhjMCwgMHg0OTgwLCAweDg5NDEsIDB4NGIwMCwgMHg4YmMxLCAweDhhODEsIDB4NGE0MCwKLQkweDRlMDAsIDB4OGVjMSwgMHg4ZjgxLCAweDRmNDAsIDB4OGQwMSwgMHg0ZGMwLCAweDRjODAsIDB4OGM0MSwKLQkweDQ0MDAsIDB4ODRjMSwgMHg4NTgxLCAweDQ1NDAsIDB4ODcwMSwgMHg0N2MwLCAweDQ2ODAsIDB4ODY0MSwKLQkweDgyMDEsIDB4NDJjMCwgMHg0MzgwLCAweDgzNDEsIDB4NDEwMCwgMHg4MWMxLCAweDgwODEsIDB4NDA0MAotfTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIE1hY3JvcyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgVHlwZXMgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwotZXh0ZXJuIGludCBwcmlzbTJfZGVidWc7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfZHRpbSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfaW5mZHJvcCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi1zdGF0aWMgdm9pZCAgICAgaGZhMzg0eF9iYXBfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfdHgod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0KLSNpZmRlZiBDTURfSVJRCi1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9jbWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLSNlbmRpZgotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfcnhtb25pdG9yKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQlVSU5UMTYgcnhmaWQsIGhmYTM4NHhfcnhfZnJhbWVfdCAqcnhkZXNjKTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2FsbG9jKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0KLXN0YXRpYyBpbnQgaGZhMzg0eF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKTsKLQotc3RhdGljIGludCBoZmEzODR4X2RsX2RvY21kX3dhaXQoIGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpOwotCi1zdGF0aWMgVUlOVDE2Ci1oZmEzODR4X21rY3JjMTYoVUlOVDggKnAsIGludCBsZW4pOwotCi1pbnQgaGZhMzg0eF9jb3B5X3RvX2JhcDQoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJIHZvaWQgKmJ1ZiwgVUlOVCBsZW4sIHZvaWQqIGJ1ZjIsIFVJTlQgbGVuMiwKLQkJCSB2b2lkICpidWYzLCBVSU5UIGxlbjMsIHZvaWQqIGJ1ZjQsIFVJTlQgbGVuNCk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwotCi1zdGF0aWMgVUlOVDE2Ci10eGZpZF9xdWV1ZV9lbXB0eShoZmEzODR4X3QgKmh3KQotewotCXJldHVybiAoaHctPnR4ZmlkX2hlYWQgPT0gaHctPnR4ZmlkX3RhaWwpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBVSU5UMTYKLXR4ZmlkX3F1ZXVlX3JlbW92ZShoZmEzODR4X3QgKmh3KQotewotCVVJTlQxNiByZXN1bHQ9IDA7Ci0KLQlpZiAodHhmaWRfcXVldWVfZW1wdHkoaHcpKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDMsInF1ZXVlIGVtcHR5LlxuIik7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gaHctPnR4ZmlkX3F1ZXVlW2h3LT50eGZpZF9oZWFkXTsKLQkJaHctPnR4ZmlkX2hlYWQgPSAoaHctPnR4ZmlkX2hlYWQgKyAxKSAlIGh3LT50eGZpZF9OOwotCX0KLQotCXJldHVybiAoVUlOVDE2KXJlc3VsdDsKLX0KLQotc3RhdGljIElOVDE2Ci10eGZpZF9xdWV1ZV9hZGQoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCkKLXsKLQlJTlQxNiByZXN1bHQgPSAwOwotCi0JaWYgKGh3LT50eGZpZF9oZWFkID09ICgoaHctPnR4ZmlkX3RhaWwgKyAxKSAlIGh3LT50eGZpZF9OKSkgewotCQlyZXN1bHQgPSAtMTsKLQkJV0xBTl9MT0dfREVCVUcoMywicXVldWUgZnVsbC5cbiIpOwotCX0gZWxzZSB7Ci0JCWh3LT50eGZpZF9xdWV1ZVtody0+dHhmaWRfdGFpbF0gPSB2YWw7Ci0JCXJlc3VsdCA9IGh3LT50eGZpZF90YWlsOwotCQlody0+dHhmaWRfdGFpbCA9IChody0+dHhmaWRfdGFpbCArIDEpICUgaHctPnR4ZmlkX047Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY3JlYXRlCi0qCi0qIEluaXRpYWxpemVzIHRoZSBoZmEzODR4X3QgZGF0YSBzdHJ1Y3R1cmUgZm9yIHVzZS4gIE5vdGUgdGhpcwotKiBkb2VzIF9ub3RfIGludGlhbGl6ZSB0aGUgYWN0dWFsIGhhcmR3YXJlLCBqdXN0IHRoZSBkYXRhIHN0cnVjdHVyZXMKLSogd2UgdXNlIHRvIGtlZXAgdHJhY2sgb2YgaXRzIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWlycQkJZGV2aWNlIGlycSBudW1iZXIKLSoJaW9iYXNlCQlbcGNtY2lhXSBpL28gYmFzZSBhZGRyZXNzIGZvciByZWdpc3RlciBhY2Nlc3MKLSoJCQlbcGNpXSB6ZXJvCi0qCQkJW3BseF0gaS9vIGJhc2UgYWRkcmVzcyBmb3IgcmVnaXN0ZXIgYWNjZXNzCi0qCW1lbWJhc2UJCVtwY21jaWFdIHBjbWNpYV9jcyAibGluayIgcG9pbnRlcgotKgkJCVtwY2ldIG1lbW9yeSBiYXNlIGFkZHJlc3MgZm9yIHJlZ2lzdGVyIGFjY2VzcwotKgkJCVtwbHhdIG1lbW9yeSBiYXNlIGFkZHJlc3MgZm9yIGNhcmQgYXR0cmlidXRlIG1lbW9yeQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGhmYTM4NHhfY3JlYXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQgaXJxLCBVSU5UMzIgaW9iYXNlLAotCQkgICAgVUlOVDggX19pb21lbSAqbWVtYmFzZSkKLXsKLQlEQkZFTlRFUjsKLQltZW1zZXQoaHcsIDAsIHNpemVvZihoZmEzODR4X3QpKTsKLQlody0+aXJxID0gaXJxOwotCWh3LT5pb2Jhc2UgPSBpb2Jhc2U7Ci0JaHctPm1lbWJhc2UgPSBtZW1iYXNlOwotCXNwaW5fbG9ja19pbml0KCYoaHctPmNtZGxvY2spKTsKLQotCS8qIEJBUCBzZXR1cCAqLwotIAlzcGluX2xvY2tfaW5pdCgmKGh3LT5iYXBsb2NrKSk7Ci0JdGFza2xldF9pbml0KCZody0+YmFwX3Rhc2tsZXQsCi0JCSAgICAgaGZhMzg0eF9iYXBfdGFza2xldCwKLQkJICAgICAodW5zaWduZWQgbG9uZykgaHcpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmaHctPmNtZHEpOwotCXNlbWFfaW5pdCgmaHctPmluZm9maWRfc2VtLCAxKTsKLQotICAgICAgICBody0+dHhmaWRfaGVhZCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF90YWlsID0gMDsKLSAgICAgICAgaHctPnR4ZmlkX04gPSBIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYOwotICAgICAgICBtZW1zZXQoaHctPnR4ZmlkX3F1ZXVlLCAwLCBzaXplb2YoaHctPnR4ZmlkX3F1ZXVlKSk7Ci0KLQlody0+aXNyYW0xNiA9IDE7Ci0KLQkvKiBJbml0IHRoZSBhdXRoIHF1ZXVlIGhlYWQgKi8KLQlza2JfcXVldWVfaGVhZF9pbml0KCZody0+YXV0aHEpOwotCi0JSU5JVF9XT1JLMigmaHctPmxpbmtfYmgsIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKTsKLQotICAgICAgICBJTklUX1dPUksyKCZody0+Y29tbXNxdWFsX2JoLCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKTsKLQotCWluaXRfdGltZXIoJmh3LT5jb21tc3F1YWxfdGltZXIpOwotCWh3LT5jb21tc3F1YWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBodzsKLQlody0+Y29tbXNxdWFsX3RpbWVyLmZ1bmN0aW9uID0gcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lcjsKLQotCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQ7Ci0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9JTklUOwotCi0JREJGRVhJVDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZGVzdHJveQotKgotKiBQYXJ0bmVyIHRvIGhmYTM4NHhfY3JlYXRlKCkuICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCB0aGUgaHcKLSogc3RydWN0dXJlIHNvIHRoYXQgaXQgY2FuIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgdXNpbmcgYSBzaW1wbGUKLSoga2ZyZWUuICBDdXJyZW50bHksIHRoaXMgZnVuY3Rpb24gaXMganVzdCBhIHBsYWNlaG9sZGVyLiAgSWYsIGF0IHNvbWUKLSogcG9pbnQgaW4gdGhlIGZ1dHVyZSwgYW4gaHcgaW4gdGhlICdzaHV0ZG93bicgc3RhdGUgcmVxdWlyZXMgYSAnZGVlcCcKLSoga2ZyZWUsIHRoaXMgaXMgd2hlcmUgaXQgc2hvdWxkIGJlIGRvbmUuICBOb3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbgotKiBpcyBjYWxsZWQgb24gYSBfcnVubmluZ18gaHcgc3RydWN0dXJlLCB0aGUgZHJ2cl9zdG9wKCkgZnVuY3Rpb24gaXMKLSogY2FsbGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcsIHRoaXMgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gZmFpbC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotaGZhMzg0eF9kZXN0cm95KCBoZmEzODR4X3QgKmh3KQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICggaHctPnN0YXRlID09IEhGQTM4NHhfU1RBVEVfUlVOTklORyApIHsKLQkJaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwotCX0KLQlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX1BSRUlOSVQ7Ci0KLQlpZiAoaHctPnNjYW5yZXN1bHRzKSB7Ci0JCWtmcmVlKGh3LT5zY2FucmVzdWx0cyk7Ci0JCWh3LT5zY2FucmVzdWx0cyA9IE5VTEw7Ci0JfQotCi0gICAgICAgIC8qIE5vdyB0byBjbGVhbiBvdXQgdGhlIGF1dGggcXVldWUgKi8KLSAgICAgICAgd2hpbGUgKCAoc2tiID0gc2tiX2RlcXVldWUoJmh3LT5hdXRocSkpICkgewotICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZ2V0Y29uZmlnCi0qCi0qIFBlcmZvcm1zIHRoZSBzZXF1ZW5jZSBuZWNlc3NhcnkgdG8gcmVhZCBhIGNvbmZpZy9pbmZvIGl0ZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmlkCQljb25maWcvaW5mbyByZWNvcmQgaWQgKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJaG9zdCBzaWRlIHJlY29yZCBidWZmZXIuICBVcG9uIHJldHVybiBpdCB3aWxsCi0qCQkJY29udGFpbiB0aGUgYm9keSBwb3J0aW9uIG9mIHRoZSByZWNvcmQgKG1pbnVzIHRoZQotKgkJCVJJRCBhbmQgbGVuKS4KLSoJbGVuCQlidWZmZXIgbGVuZ3RoIChpbiBieXRlcywgc2hvdWxkIG1hdGNoIHJlY29yZCBsZW5ndGgpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCS1FTk9EQVRBIAlsZW5ndGggbWlzbWF0Y2ggYmV0d2VlbiBhcmd1bWVudCBhbmQgcmV0cmlldmVkCi0qCQkJcmVjb3JkLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQotewotCWludCAJCXJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hY2Nlc3MoIGh3LCAwLCByaWQsIGJ1ZiwgbGVuKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3NldGNvbmZpZwotKgotKiBQZXJmb3JtcyB0aGUgc2VxdWVuY2UgbmVjZXNzYXJ5IHRvIHdyaXRlIGEgY29uZmlnL2luZm8gaXRlbS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyaWQJCWNvbmZpZy9pbmZvIHJlY29yZCBpZCAoaW4gaG9zdCBvcmRlcikKLSoJYnVmCQlob3N0IHNpZGUgcmVjb3JkIGJ1ZmZlcgotKglsZW4JCWJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQotewotCWludAkJcmVzdWx0ID0gMDsKLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2FjY2VzcyggaHcsIDEsIHJpZCwgYnVmLCBsZW4pOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmVhZHBkYQotKgotKiBQZXJmb3JtcyB0aGUgc2VxdWVuY2UgdG8gcmVhZCB0aGUgUERBIHNwYWNlLiAgTm90ZSB0aGVyZSBpcyBubwotKiBkcnZyX3dyaXRlcGRhKCkgZnVuY3Rpb24uICBXcml0aW5nIGEgUERBIGlzCi0qIGdlbmVyYWxseSBpbXBsZW1lbnRlZCBieSBhIGNhbGxpbmcgY29tcG9uZW50IHZpYSBjYWxscyB0bwotKiBjbWRfZG93bmxvYWQgYW5kIHdyaXRpbmcgdG8gdGhlIGZsYXNoIGRvd25sb2FkIGJ1ZmZlciB2aWEgdGhlCi0qIGF1eCByZWdzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWJ1ZgkJYnVmZmVyIHRvIHN0b3JlIFBEQSBpbgotKglsZW4JCWJ1ZmZlciBsZW5ndGgKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoJLUVUSU1FT1VUCXRpbW91dCB3YWl0aW5nIGZvciB0aGUgY21kIHJlZ3MgdG8gYmVjb21lCi0qCQkJYXZhaWxhYmxlLCBvciB3YWl0aW5nIGZvciB0aGUgY29udHJvbCByZWcKLSoJCQl0byBpbmRpY2F0ZSB0aGUgQXV4IHBvcnQgaXMgZW5hYmxlZC4KLSoJLUVOT0RBVEEJdGhlIGJ1ZmZlciBkb2VzIE5PVCBjb250YWluIGEgdmFsaWQgUERBLgotKgkJCUVpdGhlciB0aGUgY2FyZCBQREEgaXMgYmFkLCBvciB0aGUgYXV4ZGF0YQotKgkJCXJlYWRzIGFyZSBnaXZpbmcgdXMgZ2FyYmFnZS4KLQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgb3Igbm9uLWNhcmQgaW50ZXJydXB0LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQkqcGRhID0gYnVmOwotCWludAkJcGRhb2sgPSAwOwotCWludAkJbW9yZXBkcnMgPSAxOwotCWludAkJY3VycnBkciA9IDA7CS8qIHdvcmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHBkciAqLwotCWludAkJaTsKLQlVSU5UMTYJCXBkcmxlbjsJCS8qIHBkciBsZW5ndGggaW4gYnl0ZXMsIGhvc3Qgb3JkZXIgKi8KLQlVSU5UMTYJCXBkcmNvZGU7CS8qIHBkciBjb2RlLCBob3N0IG9yZGVyICovCi0JVUlOVDE2CQljcmM7Ci0JVUlOVDE2CQlwZGFjcmM7Ci0Jc3RydWN0IHBkYWxvYyB7Ci0JCVVJTlQzMgljYXJkYWRkcjsKLQkJVUlOVDE2CWF1eGN0bDsKLQl9IHBkYWxvY1tdID0KLQl7Ci0JCXsgSEZBMzg0Ml9QREFfQkFTRSwJCUhGQTM4NHhfQVVYX0NUTF9OVn0sCi0JCXsgSEZBMzg0Ml9QREFfQkFTRSwJCUhGQTM4NHhfQVVYX0NUTF9FWFREU30sCi0JCXsgSEZBMzg0MV9QREFfQkFTRSwJCUhGQTM4NHhfQVVYX0NUTF9OVn0sCi0JCXsgSEZBMzg0MV9QREFfQkFTRSwJCUhGQTM4NHhfQVVYX0NUTF9FWFREU30sCi0JCXsgSEZBMzg0MV9QREFfQk9HVVNfQkFTRSwJSEZBMzg0eF9BVVhfQ1RMX05WfQotCX07Ci0KLQlEQkZFTlRFUjsKLQkvKiBDaGVjayBmb3IgYXV4IGF2YWlsYWJsZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDApOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLCJhdXhfZW5hYmxlKCkgZmFpbGVkLiByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIFJlYWQgdGhlIHBkYSBmcm9tIGVhY2gga25vd24gYWRkcmVzcy4gICovCi0JZm9yICggaSA9IDA7IGkgPCAoc2l6ZW9mKHBkYWxvYykvc2l6ZW9mKHBkYWxvY1swXSkpOyBpKyspIHsKLQkJV0xBTl9MT0dfREVCVUcoIDMsICJDaGVja2luZyBQREFAKDB4JTA4eCwlcylcbiIsCi0JCQlwZGFsb2NbaV0uY2FyZGFkZHIsCi0JCQlwZGFsb2NbaV0uYXV4Y3RsID09IEhGQTM4NHhfQVVYX0NUTF9OViA/Ci0JCQkiQ1RMX05WIiA6ICJDVExfRVhURFMiKTsKLQotCQkvKiBDb3B5IGJ1ZnNpemUgYnl0ZXMgZnJvbSBvdXIgY3VycmVudCBwZGFsb2MgKi8KLQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LAotCQkJcGRhbG9jW2ldLmNhcmRhZGRyLAotCQkJcGRhbG9jW2ldLmF1eGN0bCwKLQkJCWJ1ZiwKLQkJCWxlbik7Ci0KLQkJLyogVGVzdCBmb3IgZ2FyYmFnZSAqLwotCQkvKiBUcmF2ZXJzZSB0aGUgUERSIGxpc3QgTG9va2luZyBmb3IgUERBLUVORCAqLwotCQlwZGFvayA9IDE7CS8qIGludGlhbGx5IGFzc3VtZSBnb29kICovCi0JCW1vcmVwZHJzID0gMTsKLQkJY3VycnBkciA9IDA7Ci0JCXdoaWxlICggcGRhb2sgJiYgbW9yZXBkcnMgKSB7Ci0JCQlwZHJsZW4gPSBoZmEzODR4Mmhvc3RfMTYocGRhW2N1cnJwZHJdKSAqIDI7Ci0JCQlwZHJjb2RlID0gaGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyKzFdKTsKLQotCQkJLyogVGVzdCBmb3IgY29tcGxldGlvbiBhdCBFTkQgcmVjb3JkICovCi0JCQlpZiAoIHBkcmNvZGUgPT0gSEZBMzg0eF9QRFJfRU5EX09GX1BEQSApIHsKLQkJCQlpZiAoIHBkcmxlbiA9PSA0ICkgewotCQkJCQltb3JlcGRycyA9IDA7Ci0JCQkJCS8qIENhbGN1bGF0ZSBDUkMtMTYgYW5kIGNvbXBhcmUgdG8gUERBCi0JCQkJCSAqIHZhbHVlLiAgTm90ZSB0aGUgYWRkaXRpb24gb2YgMiB3b3JkcwotCQkJCQkgKiBmb3IgRU5EUkVDLmxlbiBhbmQgRU5EUkVDLmNvZGUKLQkJCQkJICogZmllbGRzLgotCQkJCQkgKi8KLQkJCQkJY3JjID0gaGZhMzg0eF9ta2NyYzE2KCAoVUlOVDgqKXBkYSwKLQkJCQkJCShjdXJycGRyICsgMikgKiBzaXplb2YoVUlOVDE2KSk7Ci0JCQkJCXBkYWNyYyA9aGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyKzJdKTsKLQkJCQkJaWYgKCBjcmMgIT0gcGRhY3JjICkgewotCQkJCQkJV0xBTl9MT0dfREVCVUcoMywKLQkJCQkJCSJQREEgY3JjIGZhaWxlZDoiCi0JCQkJCQkiY2FsY19jcmM9MHglMDR4LCIKLQkJCQkJCSJwZHJfY3JjPTB4JTA0eC5cbiIsCi0JCQkJCQljcmMsIHBkYWNyYyk7Ci0JCQkJCQlwZGFvayA9IDA7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlXTEFOX0xPR19ERUJVRygzLAotCQkJCQkiRU5EIHJlY29yZCBkZXRlY3RlZCB3LyAiCi0JCQkJCSJsZW4oJWQpICE9IDIsIGFzc3VtaW5nIGJhZCBQREFcbiIsCi0JCQkJCXBkcmxlbik7Ci0JCQkJCXBkYW9rID0gMDsKLQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogVGVzdCB0aGUgcmVjb3JkIGxlbmd0aCAqLwotCQkJaWYgKCBwZHJsZW4gPiBIRkEzODR4X1BEUl9MRU5fTUFYIHx8IHBkcmxlbiA9PSAwKSB7Ci0JCQkJV0xBTl9MT0dfREVCVUcoMywKLQkJCQkJInBkcmxlbiBmb3IgYWRkcmVzcyAjJWQgIgotCQkJCQkiYXQgJSN4OiUjeDolZFxuIiwKLQkJCQkJaSwgcGRhbG9jW2ldLmNhcmRhZGRyLAotCQkJCQlwZGFsb2NbaV0uYXV4Y3RsLCBwZHJsZW4pOwotCQkJCVdMQU5fTE9HX0RFQlVHKDMsInBkcmxlbiBpbnZhbGlkPSVkXG4iLAotCQkJCQlwZHJsZW4pOwotCQkJCXBkYW9rID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogTW92ZSB0byB0aGUgbmV4dCBwZHIgKi8KLQkJCWlmICggbW9yZXBkcnMgKSB7Ci0JCQkJLyogbm90ZSB0aGUgYWNjZXNzIHRvIHBkYVtdLCB3ZSBuZWVkIHdvcmRzICovCi0JCQkJY3VycnBkciArPSBoZmEzODR4Mmhvc3RfMTYocGRhW2N1cnJwZHJdKSArIDE7Ci0JCQkJaWYgKGN1cnJwZHIqc2l6ZW9mKFVJTlQxNikgPiBsZW4pIHsKLQkJCQkJV0xBTl9MT0dfREVCVUcoMywKLQkJCQkJIkRpZG4ndCBmaW5kIFBEQV9FTkQgaW4gYnVmZmVyLCAiCi0JCQkJCSJ0cnlpbmcgbmV4dCBsb2NhdGlvbi5cbiIpOwotCQkJCQlwZGFvayA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIHBkYW9rICkgewotCQkJV0xBTl9MT0dfSU5GTygKLQkJCQkiUERBIFJlYWQgZnJvbSAweCUwOHggaW4gJXMgc3BhY2UuXG4iLAotCQkJCXBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCQlwZGFsb2NbaV0uYXV4Y3RsID09IDAgPyAiRVhURFMiIDoKLQkJCQlwZGFsb2NbaV0uYXV4Y3RsID09IDEgPyAiTlYiIDoKLQkJCQlwZGFsb2NbaV0uYXV4Y3RsID09IDIgPyAiUEhZIiA6Ci0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAzID8gIklDU1JBTSIgOgotCQkJCSI8Ym9ndXMgYXV4Y3RsPiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVzdWx0ID0gcGRhb2sgPyAwIDogLUVOT0RBVEE7Ci0KLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMywiRmFpbHVyZTogcGRhIGlzIG5vdCBva2F5XG4iKTsKLQl9Ci0KLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIG1rcGRhX2NyYwotKgotKiBDYWxjdWxhdGVzIHRoZSBDUkMxNiBmb3IgdGhlIGdpdmVuIFBEQSBhbmQgaW5zZXJ0cyB0aGUgdmFsdWUKLSogaW50byB0aGUgZW5kIHJlY29yZC4KLSoKLSogQXJndW1lbnRzOgotKglwZGEJcHRyIHRvIHRoZSBQREEgZGF0YSBzdHJ1Y3R1cmUuCi0qCi0qIFJldHVybnM6Ci0qCTAJLSBzdWNjZXNzCi0qCX4wCS0gZmFpbHVyZSAocHJvYmFibHkgYW4gZXJybm8pCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBVSU5UMTYKLWhmYTM4NHhfbWtjcmMxNihVSU5UOCAqcCwgaW50IGxlbikKLXsKLQlVSU5UMTYJY3JjID0gMDsKLQlVSU5UOAkqbGltID0gcCArIGxlbjsKLQotCXdoaWxlIChwIDwgbGltKSB7Ci0JCWNyYyA9IChjcmMgPj4gOCApIF4gY3JjMTZ0YWJbKGNyYyAmIDB4ZmYpIF4gKnArK107Ci0JfQotCi0JcmV0dXJuIGNyYzsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZQotKgotKiBCZWdpbnMgdGhlIHJhbSBkb3dubG9hZCBzdGF0ZS4gIENoZWNrcyB0byBzZWUgdGhhdCB3ZSdyZSBub3QKLSogYWxyZWFkeSBpbiBhIGRvd25sb2FkIHN0YXRlIGFuZCB0aGF0IGEgcG9ydCBpc24ndCBlbmFibGVkLgotKiBTZXRzIHRoZSBkb3dubG9hZCBzdGF0ZSBhbmQgY2FsbHMgY21kX2Rvd25sb2FkIHdpdGggdGhlCi0qIEVOQUJMRV9WT0xBVElMRSBzdWJjb21tYW5kIGFuZCB0aGUgZXhlYWRkciBhcmd1bWVudC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglleGVhZGRyCQl0aGUgY2FyZCBleGVjdXRpb24gYWRkcmVzcyB0aGF0IHdpbGwgYmUKLSogICAgICAgICAgICAgICAgICAgICAgIGp1bXBlZCB0byB3aGVuIHJhbWRsX2Rpc2FibGUoKSBpcyBjYWxsZWQKLSoJCQkoaG9zdCBvcmRlcikuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZXhlYWRkcikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQlsb3dhZGRyOwotCVVJTlQxNgkJaGlhZGRyOwotCWludAkJaTsKLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IGEgcG9ydCBpc24ndCBhY3RpdmUgKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfUE9SVElEX01BWDsgaSsrKSB7Ci0JCWlmICggaHctPnBvcnRfZW5hYmxlZFtpXSApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsIkNhbid0IGRvd25sb2FkIHdpdGggYSBwb3J0IGVuYWJsZWQuXG4iKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IGluIGEgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9ESVNBQkxFRCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwiRG93bmxvYWQgc3RhdGUgbm90IGRpc2FibGVkLlxuIik7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBBcmUgd2Ugc3VwcG9zZWQgdG8gZ28gaW50byBnZW5lc2lzIG1vZGU/ICovCi0JaWYgKGV4ZWFkZHIgPT0gMHgzZjAwMDApIHsKLQkJVUlOVDE2IGluaXRzZXFbMl0gPSB7IDB4ZTEwMCwgMHhmZmExIH07Ci0JCVVJTlQxNiByZWFkYnVmWzJdOwotCQlVSU5UOCBoY3IgPSAweDBmOyAvKiBEZWZhdWx0IHRvIHgxNiBTUkFNICovCi0JCWh3LT5pc3JhbTE2ID0gMTsKLQotCQlXTEFOX0xPR19ERUJVRygxLCAiRHJvcHBpbmcgaW50byBHZW5lc2lzIG1vZGVcbiIpOwotCi0JCS8qIElzc3VlIGNhcmQgcmVzZXQgYW5kIGVuYWJsZSBhdXggcG9ydCAqLwotCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCSAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQloZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAxKTsKLQotCQkvKiBHZW5lc2lzIHNldCAqLwotCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCSAgICBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOwotCi0JCWhmYTM4NHhfY29yZXJlc2V0KGh3LCBwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJICBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgaGNyKTsKLQotCQkvKiBWYWxpZGF0ZSBtZW1vcnkgY29uZmlnICovCi0JCWhmYTM4NHhfY29weV90b19hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJICAgIGluaXRzZXEsIHNpemVvZihpbml0c2VxKSk7Ci0JCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkgICAgcmVhZGJ1Ziwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJV0xBTl9IRVhfRFVNUCgzLCAicmVhZGJhY2siLCByZWFkYnVmLCBzaXplb2YocmVhZGJ1ZikpOwotCi0JCWlmIChtZW1jbXAoaW5pdHNlcSwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKSkgewotCQkJaGNyID0gMHgxZjsgLyogeDggU1JBTSAqLwotCQkJaHctPmlzcmFtMTYgPSAwOwotCi0JCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJCWhmYTM4NHhfY29yZXJlc2V0KGh3LCBwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJCSAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIGhjcik7Ci0KLQkJCWhmYTM4NHhfY29weV90b19hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJCSAgICBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOwotCQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQkgICAgcmVhZGJ1Ziwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJCVdMQU5fSEVYX0RVTVAoMiwgInJlYWRiYWNrIiwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKTsKLQotCQkJaWYgKG1lbWNtcChpbml0c2VxLCByZWFkYnVmLCBzaXplb2YocmVhZGJ1ZikpKSB7Ci0JCQkJV0xBTl9MT0dfRVJST1IoIkdlbmVzaXMgbW9kZSBmYWlsZWRcbiIpOwotCQkJCXJlc3VsdCA9IC0xOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJfQotCi0JCS8qIE5vdyB3ZSdyZSBpbiBnZW5lc2lzIG1vZGUgKi8KLQkJaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfR0VORVNJUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFJldHJpZXZlIHRoZSBidWZmZXIgbG9jJnNpemUgYW5kIHRpbWVvdXQgKi8KLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUiwKLQkJCQkmKGh3LT5idWZpbmZvKSwgc2l6ZW9mKGh3LT5idWZpbmZvKSkpICkgewotCQlnb3RvIGRvbmU7Ci0JfQotCWh3LT5idWZpbmZvLnBhZ2UgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ucGFnZSk7Ci0JaHctPmJ1ZmluZm8ub2Zmc2V0ID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLm9mZnNldCk7Ci0JaHctPmJ1ZmluZm8ubGVuID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLmxlbik7Ci0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9NQVhMT0FEVElNRSwKLQkJCQkmKGh3LT5kbHRpbWVvdXQpKSkgKSB7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaHctPmRsdGltZW91dCA9IGhmYTM4NHgyaG9zdF8xNihody0+ZGx0aW1lb3V0KTsKLQotCS8qIEVuYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKSkgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsIkF1eCBlbmFibGUgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQ2FsbCB0aGUgZG93bmxvYWQoMSxhZGRyKSBmdW5jdGlvbiAqLwotCWxvd2FkZHIgPSBIRkEzODR4X0FERFJfQ01EX01LT0ZGKGV4ZWFkZHIpOwotCWhpYWRkciA9ICBIRkEzODR4X0FERFJfQ01EX01LUEFHRShleGVhZGRyKTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX1JBTSwKLQkJCWxvd2FkZHIsIGhpYWRkciwgMCk7Ci0JaWYgKCByZXN1bHQgPT0gMCkgewotCQkvKiBTZXQgdGhlIGRvd25sb2FkIHN0YXRlICovCi0JCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQ7Ci0JfSBlbHNlIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwiY21kX2Rvd25sb2FkKDB4JTA0eCwgMHglMDR4KSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsCi0JCQkJbG93YWRkcixoaWFkZHIsIHJlc3VsdCk7Ci0JCS8qIERpc2FibGUgIHRoZSBhdXggcG9ydCAqLwotCQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0JfQotCi0gZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9yYW1kbF9kaXNhYmxlCi0qCi0qIEVuZHMgdGhlIHJhbSBkb3dubG9hZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpCi17Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBhbHJlYWR5IGluIHRoZSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRCApICYmCi0JICAgICAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9HRU5FU0lTICkgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChody0+ZGxzdGF0ZSA9PSBIRkEzODR4X0RMU1RBVEVfR0VORVNJUykgewotCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCSAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsCi0JCQkJICBody0+aXNyYW0xNiA/IDB4MDc6IDB4MTcpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogRGlzYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQloZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFLCAwLCAwICwgMCk7Ci0KLSBkb25lOgotCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEOwotCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZQotKgotKiBQZXJmb3JtcyBhIFJBTSBkb3dubG9hZCBvZiBhIGNodW5rIG9mIGRhdGEuIEZpcnN0IGNoZWNrcyB0byBzZWUKLSogdGhhdCB3ZSdyZSBpbiB0aGUgUkFNIGRvd25sb2FkIHN0YXRlLCB0aGVuIHVzZXMgdGhlIGF1eCBmdW5jdGlvbnMKLSogdG8gMSkgY29weSB0aGUgZGF0YSwgMikgcmVhZGJhY2sgYW5kIGNvbXBhcmUuICBUaGUgZG93bmxvYWQKLSogc3RhdGUgaXMgdW5hZmZlY3RlZC4gIFdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB1c2luZwotKiB0aGlzIGZ1bmN0aW9uLCBjYWxsIGRydnJfcmFtZGxfZGlzYWJsZSgpIHRvIGVuZCB0aGUgZG93bmxvYWQgc3RhdGUKLSogYW5kIHJlc3RhcnQgdGhlIE1BQy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglkYWRkcgkJQ2FyZCBhZGRyZXNzIHRvIHdyaXRlIHRvLiAoaG9zdCBvcmRlcikKLSoJYnVmCQlQdHIgdG8gZGF0YSB0byB3cml0ZS4KLSoJbGVuCQlMZW5ndGggb2YgZGF0YSAoaG9zdCBvcmRlcikuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBkYWRkciwgdm9pZCogYnVmLCBVSU5UMzIgbGVuKQotewotCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UOAkJKnZlcmJ1ZjsKLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IHdlJ3JlIGluIHRoZSByYW0gZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQgKSAmJgotCSAgICAgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfR0VORVNJUyApICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlXTEFOX0xPR19JTkZPKCJXcml0aW5nICVkIGJ5dGVzIHRvIHJhbSBAMHglMDZ4XG4iLCBsZW4sIGRhZGRyKTsKLSNpZiAwCi1XTEFOX0hFWF9EVU1QKDEsICJkbGRhdGEiLCBidWYsIGxlbik7Ci0jZW5kaWYKLQkvKiBDb3B5IHRoZSBkYXRhIHZpYSB0aGUgYXV4IHBvcnQgKi8KLQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCBkYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLCBidWYsIGxlbik7Ci0KLQkvKiBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB2ZXJpZnkgKi8KLQl2ZXJidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZlcmJ1ZiA9PSBOVUxMICkgcmV0dXJuIDE7Ci0KLQkvKiBSZWFkIGJhY2sgYW5kIGNvbXBhcmUgKi8KLQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsIGRhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIHZlcmJ1ZiwgbGVuKTsKLQotCWlmICggbWVtY21wKGJ1ZiwgdmVyYnVmLCBsZW4pICkgewotCQlXTEFOX0xPR19ERUJVRygxLCJyYW1kbCB2ZXJpZnkgZmFpbGVkIVxuIik7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfQotCi0Ja2ZyZWVfcyh2ZXJidWYsIGxlbik7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZmxhc2hkbF9lbmFibGUKLSoKLSogQmVnaW5zIHRoZSBmbGFzaCBkb3dubG9hZCBzdGF0ZS4gIENoZWNrcyB0byBzZWUgdGhhdCB3ZSdyZSBub3QKLSogYWxyZWFkeSBpbiBhIGRvd25sb2FkIHN0YXRlIGFuZCB0aGF0IGEgcG9ydCBpc24ndCBlbmFibGVkLgotKiBTZXRzIHRoZSBkb3dubG9hZCBzdGF0ZSBhbmQgcmV0cmlldmVzIHRoZSBmbGFzaCBkb3dubG9hZAotKiBidWZmZXIgbG9jYXRpb24sIGJ1ZmZlciBzaXplLCBhbmQgdGltZW91dCBsZW5ndGguCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZmxhc2hkbF9lbmFibGUoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JaW50CQlpOwotCi0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCBhIHBvcnQgaXNuJ3QgYWN0aXZlICovCi0JZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X1BPUlRJRF9NQVg7IGkrKykgewotCQlpZiAoIGh3LT5wb3J0X2VuYWJsZWRbaV0gKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJjYWxsZWQgd2hlbiBwb3J0IGVuYWJsZWQuXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBub3QgYWxyZWFkeSBpbiBhIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfRElTQUJMRUQgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJldHJpZXZlIHRoZSBidWZmZXIgbG9jJnNpemUgYW5kIHRpbWVvdXQgKi8KLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUiwKLQkJCQkmKGh3LT5idWZpbmZvKSwgc2l6ZW9mKGh3LT5idWZpbmZvKSkpICkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlody0+YnVmaW5mby5wYWdlID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLnBhZ2UpOwotCWh3LT5idWZpbmZvLm9mZnNldCA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5vZmZzZXQpOwotCWh3LT5idWZpbmZvLmxlbiA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5sZW4pOwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUsCi0JCQkJJihody0+ZGx0aW1lb3V0KSkpICkgewotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlody0+ZGx0aW1lb3V0ID0gaGZhMzg0eDJob3N0XzE2KGh3LT5kbHRpbWVvdXQpOwotCi0JLyogRW5hYmxlIHRoZSBhdXggcG9ydCAqLwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaHcsIDApKSApIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9GTEFTSEVOQUJMRUQ7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlCi0qCi0qIEVuZHMgdGhlIGZsYXNoIGRvd25sb2FkIHN0YXRlLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBjYXVzZSB0aGUgTUFDCi0qIGZpcm13YXJlIHRvIHJlc3RhcnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpCi17Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBhbHJlYWR5IGluIHRoZSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRCApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogVGhlcmUgaXNuJ3QgbXVjaCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCwgc28gSSBkb24ndCAqLwotCS8qICBib3RoZXIgIHcvIHRoZSByZXR1cm4gdmFsdWUgKi8KLQloZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFLCAwLCAwICwgMCk7Ci0JaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfRElTQUJMRUQ7Ci0KLQkvKiBEaXNhYmxlIHRoZSBhdXggcG9ydCAqLwotCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlCi0qCi0qIFBlcmZvcm1zIGEgRkxBU0ggZG93bmxvYWQgb2YgYSBjaHVuayBvZiBkYXRhLiBGaXJzdCBjaGVja3MgdG8gc2VlCi0qIHRoYXQgd2UncmUgaW4gdGhlIEZMQVNIIGRvd25sb2FkIHN0YXRlLCB0aGVuIHNldHMgdGhlIGRvd25sb2FkCi0qIG1vZGUsIHVzZXMgdGhlIGF1eCBmdW5jdGlvbnMgdG8gMSkgY29weSB0aGUgZGF0YSB0byB0aGUgZmxhc2gKLSogYnVmZmVyLCAyKSBzZXRzIHRoZSBkb3dubG9hZCAnd3JpdGUgZmxhc2gnIG1vZGUsIDMpIHJlYWRiYWNrIGFuZAotKiBjb21wYXJlLiAgTGF0aGVyIHJpbnNlLCByZXBlYXQgYXMgbWFueSB0aW1lcyBhbiBuZWNlc3NhcnkgdG8gZ2V0Ci0qIGFsbCB0aGUgZ2l2ZW4gZGF0YSBpbnRvIGZsYXNoLgotKiBXaGVuIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdXNpbmcgdGhpcyBmdW5jdGlvbiAocG9zc2libHkKLSogcmVwZWF0ZWRseSksIGNhbGwgZHJ2cl9mbGFzaGRsX2Rpc2FibGUoKSB0byBlbmQgdGhlIGRvd25sb2FkIHN0YXRlCi0qIGFuZCByZXN0YXJ0IHRoZSBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZGFkZHIJCUNhcmQgYWRkcmVzcyB0byB3cml0ZSB0by4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJUHRyIHRvIGRhdGEgdG8gd3JpdGUuCi0qCWxlbgkJTGVuZ3RoIG9mIGRhdGEgKGhvc3Qgb3JkZXIpLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBkYWRkciwgdm9pZCogYnVmLCBVSU5UMzIgbGVuKQotewotCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UOAkJKnZlcmJ1ZjsKLQlVSU5UMzIJCWRsYnVmYWRkcjsKLQlVSU5UMzIJCWN1cnJsZW47Ci0JVUlOVDMyCQljdXJyZGFkZHI7Ci0JVUlOVDE2CQlkZXN0bG87Ci0JVUlOVDE2CQlkZXN0aGk7Ci0JaW50CQlud3JpdGVzOwotCWludAkJaTsKLQotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgaW4gdGhlIGZsYXNoIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfRkxBU0hFTkFCTEVEICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlXTEFOX0xPR19JTkZPKCJEb3dubG9hZCAlZCBieXRlcyB0byBmbGFzaCBAMHglMDZ4XG4iLCBsZW4sIGRhZGRyKTsKLQotCS8qIE5lZWQgYSBmbGF0IGFkZHJlc3MgZm9yIGFyaXRobWV0aWMgKi8KLQlkbGJ1ZmFkZHIgPSBIRkEzODR4X0FERFJfQVVYX01LRkxBVCgKLQkJCWh3LT5idWZpbmZvLnBhZ2UsCi0JCQlody0+YnVmaW5mby5vZmZzZXQpOwotCXZlcmJ1ZiA9IGttYWxsb2MoaHctPmJ1ZmluZm8ubGVuLCBHRlBfS0VSTkVMKTsKLQotI2lmIDAKLVdMQU5fTE9HX1dBUk5JTkcoImRsYnVmQDB4JTA2bHggbGVuPSVkIHRvPSVkXG4iLCBkbGJ1ZmFkZHIsIGh3LT5idWZpbmZvLmxlbiwgaHctPmRsdGltZW91dCk7Ci0jZW5kaWYKLQkvKiBGaWd1cmUgb3V0IGhvdyBtYW55IHRpbWVzIHRvIHRvIHRoZSBmbGFzaCBwcm9nICovCi0JbndyaXRlcyA9IGxlbiAvIGh3LT5idWZpbmZvLmxlbjsKLQlud3JpdGVzICs9IChsZW4gJSBody0+YnVmaW5mby5sZW4pID8gMSA6IDA7Ci0KLQlpZiAoIHZlcmJ1ZiA9PSBOVUxMICkgewotCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGZsYXNoIHZlcmlmeSBidWZmZXJcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogRm9yIGVhY2ggKi8KLQlmb3IgKCBpID0gMDsgaSA8IG53cml0ZXM7IGkrKykgewotCQkvKiBHZXQgdGhlIGRlc3QgYWRkcmVzcyBhbmQgbGVuICovCi0JCWN1cnJsZW4gPSAobGVuIC0gKGh3LT5idWZpbmZvLmxlbiAqIGkpKSA+IGh3LT5idWZpbmZvLmxlbiA/Ci0JCQkJaHctPmJ1ZmluZm8ubGVuIDoKLQkJCQkobGVuIC0gKGh3LT5idWZpbmZvLmxlbiAqIGkpKTsKLQkJY3VycmRhZGRyID0gZGFkZHIgKyAoaHctPmJ1ZmluZm8ubGVuICogaSk7Ci0JCWRlc3RsbyA9IEhGQTM4NHhfQUREUl9DTURfTUtPRkYoY3VycmRhZGRyKTsKLQkJZGVzdGhpID0gSEZBMzg0eF9BRERSX0NNRF9NS1BBR0UoY3VycmRhZGRyKTsKLQkJV0xBTl9MT0dfSU5GTygiV3JpdGluZyAlZCBieXRlcyB0byBmbGFzaCBAMHglMDZ4XG4iLCBjdXJybGVuLCBjdXJyZGFkZHIpOwotI2lmIDAKLVdMQU5fSEVYX0RVTVAoMSwgImRsZGF0YSIsIGJ1ZisoaHctPmJ1ZmluZm8ubGVuKmkpLCBjdXJybGVuKTsKLSNlbmRpZgotCQkvKiBTZXQgdGhlIGRvd25sb2FkIG1vZGUgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfTlYsCi0JCQkJZGVzdGxvLCBkZXN0aGksIGN1cnJsZW4pOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJkb3dubG9hZChOVixsbz0leCxoaT0leCxsZW49JXgpICIKLQkJCQkiY21kIGZhaWxlZCwgcmVzdWx0PSVkLiBBYm9ydGluZyBkL2xcbiIsCi0JCQkJZGVzdGxvLCBkZXN0aGksIGN1cnJsZW4sIHJlc3VsdCk7Ci0JCQlnb3RvIGV4aXRfcHJvYzsKLQkJfQotCQkvKiBjb3B5IHRoZSBkYXRhIHRvIHRoZSBmbGFzaCBidWZmZXIgKi8KLQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgZGxidWZhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJCWJ1ZisoaHctPmJ1ZmluZm8ubGVuKmkpLCBjdXJybGVuKTsKLQkJLyogc2V0IHRoZSBkb3dubG9hZCAnd3JpdGUgZmxhc2gnIG1vZGUgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfTlZXUklURSwgMCwwLDApOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSJkb3dubG9hZChOVldSSVRFLGxvPSV4LGhpPSV4LGxlbj0leCkgIgotCQkJCSJjbWQgZmFpbGVkLCByZXN1bHQ9JWQuIEFib3J0aW5nIGQvbFxuIiwKLQkJCQlkZXN0bG8sIGRlc3RoaSwgY3VycmxlbiwgcmVzdWx0KTsKLQkJCWdvdG8gZXhpdF9wcm9jOwotCQl9Ci0JCS8qIHJlYWRiYWNrIGFuZCBjb21wYXJlLCBpZiBmYWlsLi4uYmFpbCAqLwotCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsCi0JCQkJY3VycmRhZGRyLCBIRkEzODR4X0FVWF9DVExfTlYsCi0JCQkJdmVyYnVmLCBjdXJybGVuKTsKLQotCQlpZiAoIG1lbWNtcChidWYrKGh3LT5idWZpbmZvLmxlbippKSwgdmVyYnVmLCBjdXJybGVuKSApIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi1leGl0X3Byb2M6Ci0gICAgICAgICAvKiBET0ghIFRoaXMga2ZyZWUncyBmb3IgeW91IE1hcmsgOi0pIE15IGZvcmVoZWFkIGh1cnRzLi4uICovCi0gICAgICAgICBrZnJlZSh2ZXJidWYpOwotCi0JLyogTGVhdmUgdGhlIGZpcm13YXJlIGluIHRoZSAncG9zdC1wcm9nJyBtb2RlLiAgZmxhc2hkbF9kaXNhYmxlIHdpbGwgKi8KLQkvKiAgYWN0dWFsbHkgZGlzYWJsZSBwcm9ncmFtbWluZyBtb2RlLiAgUmVtZW1iZXIsIHRoYXQgd2lsbCBjYXVzZSB0aGUgKi8KLQkvKiAgdGhlIGZpcm13YXJlIHRvIGVmZmVjdGl2ZWx5IHJlc2V0IGl0c2VsZi4gKi8KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZQotKgotKiBJc3N1ZXMgdGhlIGluaXRpYWxpemUgY29tbWFuZCBhbmQgc2V0cyB0aGUgaHctPnN0YXRlIGJhc2VkCi0qIG9uIHRoZSByZXN1bHQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IGk7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQkvKiB3ZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIGR1cmluZyB0aGUgcmVzZXQgKi8KLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9JTlRFTik7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4ZmZmZiwgSEZBMzg0eF9FVkFDSyk7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURDT0RFX0lOSVQ7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlpZiAoIHJlc3VsdCA9PSAwICkgewotCQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfTlVNUE9SVFNfTUFYOyBpKyspIHsKLQkJCWh3LT5wb3J0X2VuYWJsZWRbaV0gPSAwOwotCQl9Ci0JfQotCi0gICAgICAgIGh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQ7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcwotKgotKiBTZW5kIGEgY29tbXRhbGxpZXMgaW5xdWlyeSB0byB0aGUgTUFDLiAgTm90ZSB0aGF0IHRoaXMgaXMgYW4gYXN5bmMKLSogY2FsbCB0aGF0IHdpbGwgcmVzdWx0IGluIGFuIGluZm8gZnJhbWUgYXJyaXZpbmcgc29tZXRpbWUgbGF0ZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJemVybwkJc3VjY2Vzcy4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcyggaGZhMzg0eF90ICpodyApCi17Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCWludCByZXN1bHQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRENPREVfSU5ROwotCWNtZC5wYXJtMCA9IEhGQTM4NHhfSVRfQ09NTVRBTExJRVM7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZW5hYmxlCi0qCi0qIElzc3VlcyB0aGUgZW5hYmxlIGNvbW1hbmQgdG8gZW5hYmxlIGNvbW11bmljYXRpb25zIG9uIG9uZSBvZgotKiB0aGUgTUFDcyAncG9ydHMnLiAgT25seSBtYWNwb3J0IDAgaXMgdmFsaWQgIGZvciBzdGF0aW9ucy4KLSogQVBzIG1heSBhbHNvIGVuYWJsZSBtYWNwb3J0cyAxLTYuICBPbmx5IHBvcnRzIHRoYXQgYXJlIGN1cnJlbnRseQotKiBkaXNhYmxlZCBtYXkgYmUgZW5hYmxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltYWNwb3J0CQlNQUMgcG9ydCBudW1iZXIKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0KLQlEQkZFTlRFUjsKLQlpZiAoKCFody0+aXNhcCAmJiBtYWNwb3J0ICE9IDApIHx8Ci0JICAgIChody0+aXNhcCAmJiAhKG1hY3BvcnQgPD0gSEZBMzg0eF9QT1JUSURfTUFYKSkgfHwKLQkgICAgKGh3LT5wb3J0X2VuYWJsZWRbbWFjcG9ydF0pICl7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZW5hYmxlKGh3LCBtYWNwb3J0KTsKLQkJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJCWh3LT5wb3J0X2VuYWJsZWRbbWFjcG9ydF0gPSAxOwotCQl9Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfZW5hYmxlCi0qCi0qIElzc3VlcyB0aGUgdGhlIGVuYWJsZSBjb21tYW5kIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBvbiBvbmUgb2YgdGhlCi0qIE1BQ3MgJ3BvcnRzJy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltYWNwb3J0CQlNQUMgcG9ydCBudW1iZXIKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRU5BQkxFKSB8Ci0JCSAgSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQobWFjcG9ydCk7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9kaXNhYmxlCi0qCi0qIElzc3VlcyB0aGUgZGlzYWJsZSBjb21tYW5kIHRvIHN0b3AgY29tbXVuaWNhdGlvbnMgb24gb25lIG9mCi0qIHRoZSBNQUNzICdwb3J0cycuICBPbmx5IG1hY3BvcnQgMCBpcyB2YWxpZCAgZm9yIHN0YXRpb25zLgotKiBBUHMgbWF5IGFsc28gZGlzYWJsZSBtYWNwb3J0cyAxLTYuICBPbmx5IHBvcnRzIHRoYXQgaGF2ZSBiZWVuCi0qIHByZXZpb3VzbHkgZW5hYmxlZCBtYXkgYmUgZGlzYWJsZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0KLQlEQkZFTlRFUjsKLQlpZiAoKCFody0+aXNhcCAmJiBtYWNwb3J0ICE9IDApIHx8Ci0JICAgIChody0+aXNhcCAmJiAhKG1hY3BvcnQgPD0gSEZBMzg0eF9QT1JUSURfTUFYKSkgfHwKLQkgICAgIShody0+cG9ydF9lbmFibGVkW21hY3BvcnRdKSApewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rpc2FibGUoaHcsIG1hY3BvcnQpOwotCQlpZiAoIHJlc3VsdCA9PSAwICkgewotCQkJaHctPnBvcnRfZW5hYmxlZFttYWNwb3J0XSA9IDA7Ci0JCX0KLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9kaXNhYmxlCi0qCi0qIElzc3VlcyB0aGUgY29tbWFuZCB0byBkaXNhYmxlIGEgcG9ydC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltYWNwb3J0CQlNQUMgcG9ydCBudW1iZXIgKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFKSB8Ci0JCSAgSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQobWFjcG9ydCk7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2RpYWdub3NlCi0qCi0qIElzc3VlcyB0aGUgZGlhZ25vc2UgY29tbWFuZCB0byB0ZXN0IHRoZTogcmVnaXN0ZXIgaW50ZXJmYWNlLAotKiBNQUMgY29udHJvbGxlciAoaW5jbHVkaW5nIGxvb3BiYWNrKSwgRXh0ZXJuYWwgUkFNLCBOb24tdm9sYXRpbGUKLSogbWVtb3J5IGludGVncml0eSwgYW5kIHN5bnRoZXNpemVycy4gIEZvbGxvd2luZyBleGVjdXRpb24gb2YgdGhpcwotKiBjb21tYW5kLCBNQUMvZmlybXdhcmUgYXJlIGluIHRoZSAnaW5pdGlhbCBzdGF0ZScuICBUaGVyZWZvcmUsCi0qIHRoZSBJbml0aWFsaXplIGNvbW1hbmQgc2hvdWxkIGJlIGlzc3VlZCBhZnRlciBzdWNjZXNzZnVsCi0qIGNvbXBsZXRpb24gb2YgdGhpcyBjb21tYW5kLiAgVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQKLSogd2hlbiB0aGUgTUFDIGlzIGluIHRoZSAnY29tbXVuaWNhdGlvbiBkaXNhYmxlZCcgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBESUFHX1BBVFRFUk5BICgoVUlOVDE2KTB4YWFhYSkKLSNkZWZpbmUgRElBR19QQVRURVJOQiAoKFVJTlQxNikweDU1NTUpCi0KLWludCBoZmEzODR4X2NtZF9kaWFnbm9zZShoZmEzODR4X3QgKmh3KQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ESUFHKTsKLQljbWQucGFybTAgPSBESUFHX1BBVFRFUk5BOwotCWNtZC5wYXJtMSA9IERJQUdfUEFUVEVSTkI7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYWxsb2NhdGUKLSoKLSogSXNzdWVzIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGluc3RydWN0aW5nIHRoZSBmaXJtd2FyZSB0byBhbGxvY2F0ZQotKiBhICdmcmFtZSBzdHJ1Y3R1cmUgYnVmZmVyJyBpbiBNQUMgY29udHJvbGxlciBSQU0uICBUaGlzIGNvbW1hbmQKLSogZG9lcyBub3QgcHJvdmlkZSB0aGUgcmVzdWx0LCBpdCBvbmx5IGluaXRpYXRlcyBvbmUgb2YgdGhlIGYvdydzCi0qIGFzeW5jaHJvbm91cyBwcm9jZXNzZXMgdG8gY29uc3RydWN0IHRoZSBidWZmZXIuICBXaGVuIHRoZQotKiBhbGxvY2F0aW9uIGlzIGNvbXBsZXRlLCBpdCB3aWxsIGJlIGluZGljYXRlZCB2aWEgdGhlIEFsbG9jCi0qIGJpdCBpbiB0aGUgRXZTdGF0IHJlZ2lzdGVyIGFuZCB0aGUgRklEIGlkZW50aWZ5aW5nIHRoZSBhbGxvY2F0ZWQKLSogc3BhY2Ugd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgQWxsb2NGSUQgcmVnaXN0ZXIuICBTb21lIGNhcmUKLSogc2hvdWxkIGJlIHRha2VuIHdoZW4gd2FpdGluZyBmb3IgdGhlIEFsbG9jIGV2ZW50LiAgSWYgYSBUeCBvcgotKiBOb3RpZnkgY29tbWFuZCB3LyBSZWNsYWltIGhhcyBiZWVuIHByZXZpb3VzbHkgZXhlY3V0ZWQsIGl0J3MKLSogcG9zc2libGUgdGhlIGZpcnN0IEFsbG9jIGV2ZW50IGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQKLSogd2lsbCBiZSBmb3IgdGhlIHJlY2xhaW1lZCBidWZmZXIgYW5kIG5vdCB0aGUgb25lIHlvdSBhc2tlZCBmb3IuCi0qIFRoaXMgY2FzZSBtdXN0IGJlIGhhbmRsZWQgaW4gdGhlIEFsbG9jIGV2ZW50IGhhbmRsZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbGVuCQlhbGxvY2F0aW9uIGxlbmd0aCwgbXVzdCBiZSBhbiBldmVuIHZhbHVlCi0qCQkJaW4gdGhlIHJhbmdlIFs0LTI0MDBdLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBsZW4pCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIChsZW4gJSAyKSB8fAotCSAgICAgbGVuIDwgSEZBMzg0eF9DTURfQUxMT0NfTEVOX01JTiB8fAotCSAgICAgbGVuID4gSEZBMzg0eF9DTURfQUxMT0NfTEVOX01BWCApIHsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0FMTE9DKTsKLQkJY21kLnBhcm0wID0gbGVuOwotCQljbWQucGFybTEgPSAwOwotCQljbWQucGFybTIgPSAwOwotCi0JCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX3RyYW5zbWl0Ci0qCi0qIEluc3RydWN0cyB0aGUgZmlybXdhcmUgdG8gdHJhbnNtaXQgYSBmcmFtZSBwcmV2aW91c2x5IGNvcGllZAotKiB0byBhIGdpdmVuIGJ1ZmZlci4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSwgdGhlIFR4Ci0qIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlIFR4IG9yIFR4RXhjIGV2ZW50cyAoaWYgdGhlIGZyYW1lCi0qIGNvbnRyb2wgYml0cyBhcmUgc2V0KS4gIFRoZSByZWNsYWltIGFyZ3VtZW50IHNwZWNpZmllcyBpZiB0aGUKLSogRklEIHBhc3NlZCB3aWxsIGJlIHVzZWQgYnkgdGhlIGYvdyB0eCBwcm9jZXNzIG9yIHJldHVybmVkIGZvcgotKiB1c2Ugdy8gYW5vdGhlciB0cmFuc21pdCBjb21tYW5kLiAgSWYgcmVjbGFpbSBpcyBzZXQsIGV4cGVjdCBhbgotKiBBbGxvYyBldmVudCBzaWduYWxsaW5nIHRoZSBhdmFpbGliaWxpdHkgb2YgdGhlIEZJRCBmb3IgcmV1c2UuCi0qCi0qIE5PVEU6IGh3LT5jbWRsb2NrIE1VU1QgQkUgSEVMRCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIQotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJlY2xhaW0JCVswfDFdIGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBGSUQgd2lsbAotKgkJCWJlIGhhbmRlZCBiYWNrICh2aWEgQWxsb2MgZXZlbnQpIGZvciByZXVzZS4KLSoJCQkoaG9zdCBvcmRlcikKLSoJcW9zCQlbMC0zXSBWYWx1ZSB0byBwdXQgaW4gdGhlIFFvUyBmaWVsZCBvZiB0aGUKLSoJCQl0eCBjb21tYW5kLCBpZGVudGlmaWVzIGEgcXVldWUgdG8gcGxhY2UgdGhlCi0qCQkJb3V0Z29pbmcgZnJhbWUgaW4uCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCWZpZAkJRklEIG9mIGJ1ZmZlciBjb250YWluaW5nIHRoZSBmcmFtZSB0aGF0IHdhcwotKgkJCXByZXZpb3VzbHkgY29waWVkIHRvIE1BQyBtZW1vcnkgdmlhIHRoZSBiYXAuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKglody0+cmVzcDAgd2lsbCBjb250YWluIHRoZSBGSUQgYmVpbmcgdXNlZCBieSBhc3luYyB0eAotKglwcm9jZXNzLiAgSWYgcmVjbGFpbT09MCwgcmVzcDAgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZmlkCi0qCWFyZ3VtZW50LiAgSWYgcmVjbGFpbT09MSwgcmVzcDAgd2lsbCBiZSB0aGUgZGlmZmVyZW50IGFuZAotKglpcyB0aGUgdmFsdWUgdG8gd2F0Y2ggZm9yIGluIHRoZSBUeHxUeEV4YyB0byBpbmRpY2F0ZSBjb21wbGV0aW9uCi0qCW9mIHRoZSBmcmFtZSBwYXNzZWQgaW4gZmlkLgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF90cmFuc21pdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IHFvcywgVUlOVDE2IGZpZCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX1RYKSB8Ci0JCUhGQTM4NHhfQ01EX1JFQ0xfU0VUKHJlY2xhaW0pIHwKLQkJSEZBMzg0eF9DTURfUU9TX1NFVChxb3MpOwotCWNtZC5wYXJtMCA9IGZpZDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9jbGVhcnBlcnNpc3QKLSoKLSogSW5zdHJ1Y3RzIHRoZSBmaXJtd2FyZSB0byBjbGVhciB0aGUgcGVyc2lzdGVuY2UgYml0IGluIGEgZ2l2ZW4KLSogRklELiAgVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB0ZWxsaW5nIHRoZSBmaXJtd2FyZSB0byBkcm9wIHRoZQotKiBwZXJzaXN0ZW50IGZyYW1lLiAgVGhlIEZJRCBtdXN0IGJlIG9uZSB0aGF0IHdhcyBwcmV2aW91c2x5IHVzZWQKLSogdG8gdHJhbnNtaXQgYSBQUlNUIGZyYW1lLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWZpZAkJRklEIG9mIHRoZSBwZXJzaXN0ZW50IGZyYW1lIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0NMUlBSU1QpOwotCWNtZC5wYXJtMCA9IGZpZDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9ub3RpZnkKLSoKLSogU2VuZHMgYW4gaW5mbyBmcmFtZSB0byB0aGUgZmlybXdhcmUgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yCi0qIG9mIHRoZSBmL3cgYXN5bmNoIHByb2Nlc3Nlcy4gIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBNQUMKLSogaXMgaW4gdGhlIGVuYWJsZWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmVjbGFpbQkJWzB8MV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIEZJRCB3aWxsCi0qCQkJYmUgaGFuZGVkIGJhY2sgKHZpYSBBbGxvYyBldmVudCkgZm9yIHJldXNlLgotKgkJCShob3N0IG9yZGVyKQotKglmaWQJCUZJRCBvZiBidWZmZXIgY29udGFpbmluZyB0aGUgZnJhbWUgdGhhdCB3YXMKLSoJCQlwcmV2aW91c2x5IGNvcGllZCB0byBNQUMgbWVtb3J5IHZpYSB0aGUgYmFwLgotKgkJCShob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJaHctPnJlc3AwIHdpbGwgY29udGFpbiB0aGUgRklEIGJlaW5nIHVzZWQgYnkgYXN5bmMgbm90aWZ5Ci0qCXByb2Nlc3MuICBJZiByZWNsYWltPT0wLCByZXNwMCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBmaWQKLSoJYXJndW1lbnQuICBJZiByZWNsYWltPT0xLCByZXNwMCB3aWxsIGJlIHRoZSBkaWZmZXJlbnQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX25vdGlmeShoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IGZpZCwKLQkJICAgICAgIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX05PVElGWSkgfAotCQlIRkEzODR4X0NNRF9SRUNMX1NFVChyZWNsYWltKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLSAgICAgICAgLyogQ29weSB0aGUgcmVjb3JkIHRvIEZJRCAqLwotICAgICAgICByZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwKGh3LCBIRkEzODR4X0JBUF9QUk9DLCBody0+aW5mb2ZpZCwgMCwgYnVmLCBsZW4pOwotICAgICAgICBpZiAoIHJlc3VsdCApIHsKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfdG9fYmFwKCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaHctPmluZm9maWQsIGxlbiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQotIGZhaWxlZDoKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLSNpZiAwCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfaW5xdWlyeQotKgotKiBSZXF1ZXN0cyBhbiBpbmZvIGZyYW1lIGZyb20gdGhlIGZpcm13YXJlLiAgVGhlIGluZm8gZnJhbWUgd2lsbAotKiBiZSBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBJbmZvIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWZpZAkJRklEIG9mIHRoZSBpbmZvIGZyYW1lIHJlcXVlc3RlZC4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF9jbWRfaW5xdWlyeShoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9JTlEpOwotCWNtZC5wYXJtMCA9IGZpZDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYWNjZXNzCi0qCi0qIFJlcXVlc3RzIHRoYXQgYSBnaXZlbiByZWNvcmQgYmUgY29waWVkIHRvL2Zyb20gdGhlIHJlY29yZAotKiBidWZmZXIuICBJZiB3ZSdyZSB3cml0aW5nIGZyb20gdGhlIHJlY29yZCBidWZmZXIsIHRoZSBjb250ZW50cwotKiBtdXN0IHByZXZpb3VzbHkgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHJlY29yZCBidWZmZXIgdmlhIHRoZQotKiBiYXAuICBJZiB3ZSdyZSByZWFkaW5nIGludG8gdGhlIHJlY29yZCBidWZmZXIsIHRoZSByZWNvcmQgY2FuCi0qIGJlIHJlYWQgb3V0IG9mIHRoZSByZWNvcmQgYnVmZmVyIGFmdGVyIHRoaXMgY2FsbC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgl3cml0ZQkJWzB8MV0gY29weSB0aGUgcmVjb3JkIGJ1ZmZlciB0byB0aGUgZ2l2ZW4KLSoJCQljb25maWd1cmF0aW9uIHJlY29yZC4gKGhvc3Qgb3JkZXIpCi0qCXJpZAkJUklEIG9mIHRoZSByZWNvcmQgdG8gcmVhZC93cml0ZS4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJaG9zdCBzaWRlIHJlY29yZCBidWZmZXIuICBVcG9uIHJldHVybiBpdCB3aWxsCi0qCQkJY29udGFpbiB0aGUgYm9keSBwb3J0aW9uIG9mIHRoZSByZWNvcmQgKG1pbnVzIHRoZQotKgkJCVJJRCBhbmQgbGVuKS4KLSoJbGVuCQlidWZmZXIgbGVuZ3RoIChpbiBieXRlcywgc2hvdWxkIG1hdGNoIHJlY29yZCBsZW5ndGgpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgVUlOVDE2IHdyaXRlLCBVSU5UMTYgcmlkLAotCQkgICAgICAgdm9pZCogYnVmLCBVSU5UMTYgbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQloZmEzODR4X3JlY190CXJlYzsKLQotCURCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0JLyogVGhpcyBzaG91bGQgTk9UIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCEgKi8KLQlpZiAoaW5faXJxKCkpIHsKLQkJV0xBTl9MT0dfRVJST1IoIktyYXAsIGluIEludGVycnVwdCBjb250ZXh0ISIpOwotI2lmZGVmIFdMQU5fSU5DTFVERV9ERUJVRwotCQlCVUcoKTsKLSNlbmRpZgotCX0KLSNlbmRpZgotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JaWYgKHdyaXRlKSB7Ci0JCXJlYy5yaWQgPSBob3N0MmhmYTM4NHhfMTYocmlkKTsKLQkJcmVjLnJlY2xlbiA9IGhvc3QyaGZhMzg0eF8xNigobGVuLzIpICsgMSk7IC8qIG5vdGUgY29udmVyc2lvbiB0byB3b3JkcywgKzEgZm9yIHJpZCBmaWVsZCAqLwotCQkvKiB3cml0ZSB0aGUgcmVjb3JkICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXA0KCBodywgSEZBMzg0eF9CQVBfUFJPQywgcmlkLCAwLAotCQkJCQkgICAgICAgJnJlYywgc2l6ZW9mKHJlYyksCi0JCQkJCSAgICAgICBidWYsIGxlbiwKLQkJCQkJICAgICAgIE5VTEwsIDAsIE5VTEwsIDApOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDMsIkZhaWx1cmUgd3JpdGluZyByZWNvcmQgaGVhZGVyK2RhdGFcbiIpOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQl9Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0FDQ0VTUykgfAotCQlIRkEzODR4X0NNRF9XUklURV9TRVQod3JpdGUpOwotCWNtZC5wYXJtMCA9IHJpZDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigiQ2FsbCB0byBoZmEzODR4X2RvY21kX3dhaXQgZmFpbGVkICglZCAlZClcbiIsCi0JCQkJcmVzdWx0LCBjbWQucmVzdWx0LnJlc3AwKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmICghd3JpdGUpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywgSEZBMzg0eF9CQVBfUFJPQywgcmlkLCAwLCAmcmVjLCBzaXplb2YocmVjKSk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfREVCVUcoMywiQ2FsbCB0byBoZmEzODR4X2NvcHlfZnJvbV9iYXAgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCS8qIFZhbGlkYXRlIHRoZSByZWNvcmQgbGVuZ3RoICovCi0JCWlmICggKChoZmEzODR4Mmhvc3RfMTYocmVjLnJlY2xlbiktMSkqMikgIT0gbGVuICkgeyAgLyogbm90ZSBib2R5IGxlbiBjYWxjdWxhdGlvbiBpbiBieXRlcyAqLwotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlJJRCBsZW4gbWlzbWF0Y2gsIHJpZD0weCUwNHggaGxlbj0lZCBmd2xlbj0lZFxuIiwKLQkJCQkJcmlkLCBsZW4sIChoZmEzODR4Mmhvc3RfMTYocmVjLnJlY2xlbiktMSkqMik7Ci0JCQlyZXN1bHQgPSAtRU5PREFUQTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsIEhGQTM4NHhfQkFQX1BST0MsIHJpZCwgc2l6ZW9mKHJlYyksIGJ1ZiwgbGVuKTsKLQotCX0KLQotIGZhaWw6Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX21vbml0b3IKLSoKLSogRW5hYmxlcyB0aGUgJ21vbml0b3IgbW9kZScgb2YgdGhlIE1BQy4gIEhlcmUncyB0aGUgZGVzY3JpcHRpb24gb2YKLSogbW9uaXRvciBtb2RlIHRoYXQgSSd2ZSByZWNlaXZlZCB0aHVzIGZhcjoKLSoKLSogICJUaGUgIm1vbml0b3IgbW9kZSIgb2Ygb3BlcmF0aW9uIGlzIHRoYXQgdGhlIE1BQyBwYXNzZXMgYWxsCi0qICBmcmFtZXMgZm9yIHdoaWNoIHRoZSBQTENQIGNoZWNrcyBhcmUgY29ycmVjdC4gQWxsIHJlY2VpdmVkCi0qICBNUERVcyBhcmUgcGFzc2VkIHRvIHRoZSBob3N0IHdpdGggTUFDIFBvcnQgPSA3LCB3aXRoIGEKLSogIHJlY2VpdmUgc3RhdHVzIG9mIGdvb2QsIEZDUyBlcnJvciwgb3IgdW5kZWNyeXB0YWJsZS4gUGFzc2luZwotKiAgY2VydGFpbiBNUERVcyBpcyBhIHZpb2xhdGlvbiBvZiB0aGUgODAyLjExIHN0YW5kYXJkLCBidXQgdXNlZnVsCi0qICBmb3IgYSBkZWJ1Z2dpbmcgdG9vbC4iICBOb3JtYWwgY29tbXVuaWNhdGlvbiBpcyBub3QgcG9zc2libGUKLSogIHdoaWxlIG1vbml0b3IgbW9kZSBpcyBlbmFibGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWVuYWJsZQkJYSBjb2RlICgweDBifDB4MGYpIHRoYXQgZW5hYmxlcy9kaXNhYmxlcwotKgkJCW1vbml0b3IgbW9kZS4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBlbmFibGUpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX01PTklUT1IpIHwKLQkJSEZBMzg0eF9DTURfQUlORk9fU0VUKGVuYWJsZSk7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2Rvd25sb2FkCi0qCi0qIFNldHMgdGhlIGNvbnRyb2xzIGZvciB0aGUgTUFDIGNvbnRyb2xsZXIgY29kZS9kYXRhIGRvd25sb2FkCi0qIHByb2Nlc3MuICBUaGUgYXJndW1lbnRzIHNldCB0aGUgbW9kZSBhbmQgYWRkcmVzcyBhc3NvY2lhdGVkCi0qIHdpdGggYSBkb3dubG9hZC4gIE5vdGUgdGhhdCB0aGUgYXV4IHJlZ2lzdGVycyBzaG91bGQgYmUgZW5hYmxlZAotKiBwcmlvciB0byBzZXR0aW5nIG9uZSBvZiB0aGUgZG93bmxvYWQgZW5hYmxlIG1vZGVzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1vZGUJCTAgLSBEaXNhYmxlIHByb2dyYW1taW5nIGFuZCBiZWdpbiBjb2RlIGV4ZWMKLSoJCQkxIC0gRW5hYmxlIHZvbGF0aWxlIG1lbSBwcm9ncmFtbWluZwotKgkJCTIgLSBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbSBwcm9ncmFtbWluZwotKgkJCTMgLSBQcm9ncmFtIG5vbi12b2xhdGlsZSBzZWN0aW9uIGZyb20gTlYgZG93bmxvYWQKLSoJCQkgICAgYnVmZmVyLgotKgkJCShob3N0IG9yZGVyKQotKglsb3dhZGRyCi0qCWhpZ2hhZGRyCUZvciBtb2RlIDEsIHNldHMgdGhlIGhpZ2ggJiBsb3cgb3JkZXIgYml0cyBvZgotKgkJCXRoZSAiZGVzdGluYXRpb24gYWRkcmVzcyIuICBUaGlzIGFkZHJlc3Mgd2lsbCBiZQotKgkJCXRoZSBleGVjdXRpb24gc3RhcnQgYWRkcmVzcyB3aGVuIGRvd25sb2FkIGlzCi0qCQkJc3Vic2VxdWVudGx5IGRpc2FibGVkLgotKgkJCUZvciBtb2RlIDIsIHNldHMgdGhlIGhpZ2ggJiBsb3cgb3JkZXIgYml0cyBvZgotKgkJCXRoZSBkZXN0aW5hdGlvbiBpbiBOViByYW0uCi0qCQkJRm9yIG1vZGVzIDAgJiAzLCBzaG91bGQgYmUgemVyby4gKGhvc3Qgb3JkZXIpCi0qCQkJTk9URTogdGhlc2UgYWRkcmVzcyBhcmdzIGFyZSBpbiBDTUQgZm9ybWF0Ci0qCWNvZGVsZW4JCUxlbmd0aCBvZiB0aGUgZGF0YSB0byB3cml0ZSBpbiBtb2RlIDIsCi0qCQkJemVybyBvdGhlcndpc2UuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywgVUlOVDE2IG1vZGUsIFVJTlQxNiBsb3dhZGRyLAotCQkJCVVJTlQxNiBoaWdoYWRkciwgVUlOVDE2IGNvZGVsZW4pCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0RPV05MRCkgfAotCQlIRkEzODR4X0NNRF9QUk9HTU9ERV9TRVQobW9kZSk7Ci0JY21kLnBhcm0wID0gbG93YWRkcjsKLQljbWQucGFybTEgPSBoaWdoYWRkcjsKLQljbWQucGFybTIgPSBjb2RlbGVuOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kbF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9hdXhfZW5hYmxlCi0qCi0qIEdvZXMgdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBlbmFibGluZyB0aGUgYXV4aWxhcnkgcG9ydC4gIFRoaXMKLSogaXMgbmVjZXNzYXJ5IHByaW9yIHRvIHJhdyByZWFkcy93cml0ZXMgdG8gY2FyZCBkYXRhIHNwYWNlLgotKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSBjYXJkIGRhdGEgc3BhY2UgaXMgb25seSB1c2VkIGZvciBkb3dubG9hZGluZwotKiBjb2RlIGFuZCBkZWJ1Z2dpbmcuCi0qIE5vdGUgdGhhdCBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBiZWZvcmUgYXR0ZW1wdGluZwotKiBhIGRvd25sb2FkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXQpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShoZmEzODR4X3QgKmh3LCBpbnQgZm9yY2UpCi17Ci0JaW50CQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JVUlOVDMyCQlyZXRyaWVzX3JlbWFpbmluZzsKLQlVSU5UMTYJCXJlZzsKLQlVSU5UCQlhdXhlbl9taXJyb3IgPSBody0+YXV4ZW47Ci0KLQlEQkZFTlRFUjsKLQotCS8qIENoZWNrIGZvciBleGlzdGluZyBlbmFibGUgKi8KLQlpZiAoIGh3LT5hdXhlbiApIHsKLQkJaHctPmF1eGVuKys7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGFjcXVpcmUgdGhlIGxvY2sgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSggJihody0+Y21kbG9jayksIGZsYWdzKTsKLQkvKiB3YWl0IGZvciBjbWQgcmVnaXN0ZXIgYnVzeSBiaXQgdG8gY2xlYXIgKi8KLQlyZXRyaWVzX3JlbWFpbmluZyA9IDEwMDAwMDsKLQlkbyB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCXdoaWxlIChIRkEzODR4X0NNRF9JU0JVU1kocmVnKSAmJiAtLXJldHJpZXNfcmVtYWluaW5nKTsKLQlpZiAocmV0cmllc19yZW1haW5pbmcgIT0gMCkgewotCQkvKiBidXN5IGJpdCBjbGVhciwgaXQncyBPSyB0byB3cml0ZSB0byBQYXJhbVggcmVncyAqLwotCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9BVVhQVzAsCi0JCQlIRkEzODR4X1BBUkFNMCk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0FVWFBXMSwKLQkJCUhGQTM4NHhfUEFSQU0xKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQVVYUFcyLAotCQkJSEZBMzg0eF9QQVJBTTIpOwotCi0JCS8qIFNldCB0aGUgYXV4IGVuYWJsZSBpbiB0aGUgQ29udHJvbCByZWdpc3RlciAqLwotCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9DT05UUk9MX0FVWF9ET0VOQUJMRSwKLQkJCUhGQTM4NHhfQ09OVFJPTCk7Ci0KLQkJLyogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJcmV0cmllc19yZW1haW5pbmcgPSAxMDAwMDA7Ci0JCWRvIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0wpOwotCQkJdWRlbGF5KDEwKTsKLQkJfQotCQl3aGlsZSAoICgocmVnICYgKEJJVDE0fEJJVDE1KSkgIT0gSEZBMzg0eF9DT05UUk9MX0FVWF9JU0VOQUJMRUQpICYmCi0JCQktLXJldHJpZXNfcmVtYWluaW5nICk7Ci0JCWlmIChyZXRyaWVzX3JlbWFpbmluZyAhPSAwKSB7Ci0JCQlyZXN1bHQgPSAwOwotCQkJaHctPmF1eGVuKys7Ci0JCX0KLQl9Ci0KLQkvKiBGb3JjZSBpdCBlbmFibGVkIGV2ZW4gaWYgdGhlIGNvbW1hbmQgZmFpbGVkLCBpZiB0b2xkLi4gKi8KLQlpZiAoKGh3LT5hdXhlbiA9PSBhdXhlbl9taXJyb3IpICYmIGZvcmNlKQotCQlody0+YXV4ZW4rKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICYoaHctPmNtZGxvY2spLCBmbGFncyk7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9hdXhfZGlzYWJsZQotKgotKiBHb2VzIHRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgZGlzYWJsaW5nIHRoZSBhdXhpbGFyeSBwb3J0Ci0qIGVuYWJsZWQgd2l0aCBhdXhfZW5hYmxlKCkuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dCkKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9hdXhfZGlzYWJsZShoZmEzODR4X3QgKmh3KQotewotCWludAkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQl1bnNpZ25lZCBsb25nICAgdGltZW91dDsKLQlVSU5UMTYJCXJlZyA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIFNlZSBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgZW5hYmxlICovCi0JaWYgKGh3LT5hdXhlbikgaHctPmF1eGVuLS07Ci0JaWYgKGh3LT5hdXhlbikgcmV0dXJuIDA7Ci0KLQkvKiBDbGVhciB0aGUgYXV4IGVuYWJsZSBpbiB0aGUgQ29udHJvbCByZWdpc3RlciAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X1BBUkFNMCk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfUEFSQU0xKTsKLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9QQVJBTTIpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0xfQVVYX0RPRElTQUJMRSwKLQkJSEZBMzg0eF9DT05UUk9MKTsKLQotCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAxKkhaOwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0wpOwotCXdoaWxlICggKChyZWcgJiAoQklUMTR8QklUMTUpKSAhPSBIRkEzODR4X0NPTlRST0xfQVVYX0lTRElTQUJMRUQpICYmCi0JCXRpbWVfYmVmb3JlKGppZmZpZXMsdGltZW91dCkgKXsKLQkJdWRlbGF5KDEwKTsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTCk7Ci0JfQotCWlmICgocmVnICYgKEJJVDE0fEJJVDE1KSkgPT0gSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVEICkgewotCQlyZXN1bHQgPSAwOwotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbG93X2xldmVsCi0qCi0qIFdyaXRlIHRlc3QgY29tbWFuZHMgdG8gdGhlIGNhcmQuICBTb21lIHRlc3QgY29tbWFuZHMgZG9uJ3QgbWFrZQotKiBzZW5zZSB3aXRob3V0IHByaW9yIHNldC11cC4gIEZvciBleGFtcGxlLCBjb250aW5vdXMgVFggaXNuJ3QgdmVyeQotKiB1c2VmdWwgdW50aWwgeW91IHNldCB0aGUgY2hhbm5lbC4gIFRoYXQgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgcHJvY2VzcyB0aHJlYWQKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwoaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCkKLXsKLQlpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQlEQkZFTlRFUjsKLQotCS8qIERvIGkgbmVlZCBhIGhvc3QyaGZhLi4uIGNvbnZlcnNpb24gPyAqLwotI2lmIDAKLQlwcmludGsoS0VSTl9JTkZPICIlI3ggJSN4ICUjeCAlI3hcbiIsIGNtZC0+Y21kLCBjbWQtPnBhcm0wLCBjbWQtPnBhcm0xLCBjbWQtPnBhcm0yKTsKLSNlbmRpZgotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIFRPRE86IGRldGVybWluZSBpZiB0aGVzZSB3aWxsIGV2ZXIgYmUgbmVlZGVkICovCi0jaWYgMAotaW50IGhmYTM4NHhfY21kX3JlYWRtaWYoaGZhMzg0eF90ICpodykKLXsKLQlEQkZFTlRFUjsKLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLWludCBoZmEzODR4X2NtZF93cml0ZW1pZihoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfcmVhZAotKgotKiBSZWFkIG1taSByZWdpc3RlcnMuICBtbWkgaXMgaW50ZXJzaWwtc3BlYWsgZm9yIHRoZSBiYXNlYmFuZAotKiBwcm9jZXNzb3IgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgICAgICBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIHJlZ2lzdGVyICAgICAgICBUaGUgdGVzdCByZWdpc3RlciB0byBiZSBhY2Nlc3NlZCAobXVzdCBiZSBldmVuICMpLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgICAgICAgICAgc3VjY2VzcwotKiAgICAgICA+MCAgICAgICAgICAgICAgZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qICAgICAgIDwwICAgICAgICAgICAgICBkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfbW1pX3JlYWQoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHIsIFVJTlQzMiAqcmVzcCkKLXsKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0gICAgICAgIERCRkVOVEVSOwotCWNtZC5jbWQgPSAoVUlOVDE2KSAweDMwOwotCWNtZC5wYXJtMCA9IChVSU5UMTYpIGFkZHI7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0gICAgICAgIC8qIERvIGkgbmVlZCBhIGhvc3QyaGZhLi4uIGNvbnZlcnNpb24gPyAqLwotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCSpyZXNwID0gKFVJTlQzMikgY21kLnJlc3VsdC5yZXNwMDsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX21taV93cml0ZQotKgotKiBSZWFkIG1taSByZWdpc3RlcnMuICBtbWkgaXMgaW50ZXJzaWwtc3BlYWsgZm9yIHRoZSBiYXNlYmFuZAotKiBwcm9jZXNzb3IgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgICAgICBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIGFkZHIgICAgICAgICAgICBUaGUgdGVzdCByZWdpc3RlciB0byBiZSBhY2Nlc3NlZCAobXVzdCBiZSBldmVuICMpLgotKiAgICAgICBkYXRhICAgICAgICAgICAgVGhlIGRhdGEgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgICAgICAgICAgc3VjY2VzcwotKiAgICAgICA+MCAgICAgICAgICAgICAgZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qICAgICAgIDwwICAgICAgICAgICAgICBkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50Ci1oZmEzODR4X2RydnJfbW1pX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyLCBVSU5UMzIgZGF0YSkKLXsKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0gICAgICAgIERCRkVOVEVSOwotCWNtZC5jbWQgPSAoVUlOVDE2KSAweDMxOwotCWNtZC5wYXJtMCA9IChVSU5UMTYpIGFkZHI7Ci0JY21kLnBhcm0xID0gKFVJTlQxNikgZGF0YTsKLQljbWQucGFybTIgPSAwOwotCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsIm1taSB3cml0ZSA6IGFkZHIgPSAweCUwOHhcbiIsIGFkZHIpOwotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBkYXRhID0gMHglMDh4XG4iLCBkYXRhKTsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBUT0RPOiBkZXRlcm1pbmUgaWYgdGhlc2Ugd2lsbCBldmVyIGJlIG5lZWRlZCAqLwotI2lmIDAKLWludCBoZmEzODR4X2NtZF9yZWFkbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0gICAgICAgIERCRkVOVEVSOwotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgaGZhMzg0eF9jbWRfd3JpdGVtaWYoaGZhMzg0eF90ICpodykKLXsKLSAgICAgICAgREJGRU5URVI7Ci0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jb3B5X2Zyb21fYmFwCi0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgZnJvbSB0aGUgTUFDIGNvbnRyb2xsZXIgbWVtb3J5IHZpYQotKiBvbmUgc2V0IG9mIEJBUCByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJYmFwCQlbMHwxXSB3aGljaCBCQVAgdG8gdXNlCi0qCWlkCQlGSUQgb3IgUklELCBkZXN0aW5lZCBmb3IgdGhlIHNlbGVjdCByZWdpc3RlciAoaG9zdCBvcmRlcikKLSoJb2Zmc2V0CQlBbiBfZXZlbl8gb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmb3IgdGhlIGdpdmVuCi0qCQkJRklEL1JJRC4gIFdlIGhhdmVuJ3QgdGhlIG1lYW5zIHRvIHZhbGlkYXRlIHRoaXMsCi0qCQkJc28gYmUgY2FyZWZ1bC4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJcHRyIHRvIGFycmF5IG9mIGJ5dGVzCi0qCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgaW4gYnl0ZXMKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSB2YWx1ZSBvZiBvZmZzZXQgcmVnLgotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY29weV9mcm9tX2JhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgYmFwLCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQsCi0JCQkJdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7Ci0JVUlOVDgJCSpkID0gKFVJTlQ4KilidWY7Ci0JVUlOVAkJc2VsZWN0cmVnOwotCVVJTlQJCW9mZnNldHJlZzsKLQlVSU5UCQlkYXRhcmVnOwotCVVJTlQJCWk7Ci0JVUlOVDE2CQlyZWcgPSAwOwotCi0JREJGRU5URVI7Ci0KLQkvKiBWYWxpZGF0ZSBiYXAsIG9mZnNldCwgYnVmLCBhbmQgbGVuICovCi0JaWYgKCAoYmFwID4gMSkgfHwKLQkgICAgIChvZmZzZXQgPiBIRkEzODR4X0JBUF9PRkZTRVRfTUFYKSB8fAotCSAgICAgKG9mZnNldCAlIDIpIHx8Ci0JICAgICAoYnVmID09IE5VTEwpIHx8Ci0JICAgICAobGVuID4gSEZBMzg0eF9CQVBfREFUQUxFTl9NQVgpICl7Ci0JICAgICAJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlzZWxlY3RyZWcgPSAoYmFwID09IDEpID8gIEhGQTM4NHhfU0VMRUNUMSA6IEhGQTM4NHhfU0VMRUNUMCA7Ci0JCW9mZnNldHJlZyA9IChiYXAgPT0gMSkgPyAgSEZBMzg0eF9PRkZTRVQxIDogSEZBMzg0eF9PRkZTRVQwIDsKLQkJZGF0YXJlZyA9ICAgKGJhcCA9PSAxKSA/ICBIRkEzODR4X0RBVEExIDogSEZBMzg0eF9EQVRBMCA7Ci0KLQkJLyogT2J0YWluIGxvY2sgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0KLQkJLyogV3JpdGUgaWQgdG8gc2VsZWN0IHJlZyAqLwotCQloZmEzODR4X3NldHJlZyhodywgaWQsIHNlbGVjdHJlZyk7Ci0JCS8qIFdyaXRlIG9mZnNldCB0byBvZmZzZXQgcmVnICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBvZmZzZXQsIG9mZnNldHJlZyk7Ci0JCS8qIFdhaXQgZm9yIG9mZnNldFtidXN5XSB0byBjbGVhciAoc2VlIEJBUF9USU1FT1VUKSAqLwotCQlpID0gMDsKLQkJZG8gewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIG9mZnNldHJlZyk7Ci0JCQlpZiAoIGkgPiAwICkgdWRlbGF5KDEwKTsKLQkJCWkrKzsKLQkJfSB3aGlsZSAoIGkgPCBwcmlzbTJfYmFwX3RpbWVvdXQgJiYgSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHJlZykpOwotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1BDSSkKLQkJLyogUmVsZWFzZSBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0jZW5kaWYKLQotCQlpZiAoIEhGQTM4NHhfT0ZGU0VUX0lTQlVTWShyZWcpICl7Ci0JCQkvKiBJZiB0aW1lb3V0LCByZXR1cm4gLUVUSU1FRE9VVCAqLwotCQkJcmVzdWx0ID0gcmVnOwotCQl9IGVsc2UgaWYgKCBIRkEzODR4X09GRlNFVF9JU0VSUihyZWcpICl7Ci0JCQkvKiBJZiBvZmZzZXRbZXJyXSA9PSAxLCByZXR1cm4gLUVJTlZBTCAqLwotCQkJcmVzdWx0ID0gcmVnOwotCQl9IGVsc2UgewotCQkJLyogUmVhZCBldmVuKGxlbikgYnVmIGNvbnRlbnRzIGZyb20gZGF0YSByZWcgKi8KLQkJCWZvciAoIGkgPSAwOyBpIDwgKGxlbiAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJKihVSU5UMTYqKSgmKGRbaV0pKSA9Ci0JCQkJCWhmYTM4NHhfZ2V0cmVnX25vc3dhcChodywgZGF0YXJlZyk7Ci0JCQl9Ci0JCQkvKiBJZiBsZW4gb2RkLCBoYW5kbGUgbGFzdCBieXRlICovCi0JCQlpZiAoIGxlbiAlIDIgKXsKLQkJCQlyZWcgPSBoZmEzODR4X2dldHJlZ19ub3N3YXAoaHcsIGRhdGFyZWcpOwotCQkJCWRbbGVuLTFdID0gKChVSU5UOCopKCZyZWcpKVswXTsKLQkJCX0KLQkJfQotCi0JCS8qIEFjY29yZGluZyB0byBJbnRlcnNpbCBlcnJhdGEgZGF0ZWQgOS8xNi8wMjoKLQotCQkiSW4gUFJJU00gUENJIE1BQyBob3N0IGludGVyZmFjZSwgaWYgYm90aCBCQVBzIGFyZSBjb25jdXJyZW50bHkKLQkJIHJlcXVlc2luZyBtZW1vcnkgYWNjZXNzLCBib3RoIHdpbGwgYWNjZXB0IHRoZSBBY2suICAgVGhlcmUgaXMgbm8KLQkJIGZpcm13YXJlIHdvcmthcm91bmQgcG9zc2libGUuICBUbyBwcmV2ZW50IEJBUCBhY2Nlc3MgZmFpbHVyZXMgb3IKLQkJIGhhbmcgY29uZGl0aW9ucyB0aGUgaG9zdCBNVVNUIE5PVCBhY2Nlc3MgYm90aCBCQVBzIGluIHN1Y2Vzc2lvbgotCQkgdW5sZXNzIGF0IGxlYXN0IDV1cyBlbGFwc2VzIGJldHdlZW4gYWNjZXNzZXMuICBUaGUgc2FmZXN0IGNob2ljZQotCQkgaXMgdG8gVVNFIE9OTFkgT05FIEJBUCBmb3IgYWxsIGRhdGEgbW92ZW1lbnQgb3BlcmF0aW9ucy4iCi0KLQkJIFdoYXQgdGhpcyBtZWFuczoKLQotCQkgV2UgaGF2ZSB0byBzZXJpYWxpemUgQUxMIEJBUCBhY2Nlc3NlcywgYW5kIGZ1cnRoZXJtb3JlLCBhZGQgYSA1dXMKLQkJIGRlbGF5IGFmdGVyIGFjY2VzcyBpZiB3ZSdyZSB1c2luZyBhIFBDSSBwbGF0Zm9ybS4KLQotCQkgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIGxvY2sgb3V0IGludGVycnVwdHMgdGhyb3Vnb3V0Ci0JCSB0aGUgZW50aXJlIEJBUCBjb3B5LgotCi0JCSBJdCByZW1haW5zIHRvIGJlIHNlZW4gaWYgIkJBUCBhY2Nlc3MiIG1lYW5zICJCQVAgc2V0dXAiIG9yIHRoZSBtb3JlCi0JCSBsaXRlcmFsIGRlZmluaXRpb24gb2YgImNvcHlpbmcgZGF0YSBiYWNrIGFuZCBmb3J0aCIgIEknbSBlcnJpbmcgZm9yCi0JCSB0aGUgbGF0dGVyLCBzYWZlciBkZWZpbml0aW9uLiAgLS0gU0xQLgotCi0JCSovCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0JCXVkZWxheSg1KTsKLQkJLyogUmVsZWFzZSBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0jZW5kaWYKLQotCX0KLQotCWlmIChyZXN1bHQpIHsKLQkgIFdMQU5fTE9HX0RFQlVHKDEsCi0JCQkgICJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQkgIHJlZywgbGVuLCByZXN1bHQpOwotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY29weV90b19iYXAKLSoKLSogQ29waWVzIGEgY29sbGVjdGlvbiBvZiBieXRlcyB0byB0aGUgTUFDIGNvbnRyb2xsZXIgbWVtb3J5IHZpYQotKiBvbmUgc2V0IG9mIEJBUCByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJYmFwCQlbMHwxXSB3aGljaCBCQVAgdG8gdXNlCi0qCWlkCQlGSUQgb3IgUklELCBkZXN0aW5lZCBmb3IgdGhlIHNlbGVjdCByZWdpc3RlciAoaG9zdCBvcmRlcikKLSoJb2Zmc2V0CQlBbiBfZXZlbl8gb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmb3IgdGhlIGdpdmVuCi0qCQkJRklEL1JJRC4gIFdlIGhhdmVuJ3QgdGhlIG1lYW5zIHRvIHZhbGlkYXRlIHRoaXMsCi0qCQkJc28gYmUgY2FyZWZ1bC4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJcHRyIHRvIGFycmF5IG9mIGJ5dGVzCi0qCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgKGluIGJ5dGVzKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIHZhbHVlIG9mIG9mZnNldCByZWcuCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jb3B5X3RvX2JhcChoZmEzODR4X3QgKmh3LCBVSU5UMTYgYmFwLCBVSU5UMTYgaWQsIFVJTlQxNiBvZmZzZXQsCi0JCQkJdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlyZXR1cm4gaGZhMzg0eF9jb3B5X3RvX2JhcDQoaHcsIGJhcCwgaWQsIG9mZnNldCwgYnVmLCBsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDApOwotfQotCi1pbnQgaGZhMzg0eF9jb3B5X3RvX2JhcDQoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJIHZvaWQgKmJ1ZiwgVUlOVCBsZW4xLCB2b2lkKiBidWYyLCBVSU5UIGxlbjIsCi0JCQkgdm9pZCAqYnVmMywgVUlOVCBsZW4zLCB2b2lkICpidWY0LCBVSU5UIGxlbjQpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOwotCVVJTlQ4CQkqZDsKLQlVSU5UCQlzZWxlY3RyZWc7Ci0JVUlOVAkJb2Zmc2V0cmVnOwotCVVJTlQJCWRhdGFyZWc7Ci0JVUlOVAkJaTsKLQlVSU5UMTYJCXJlZzsKLQotCURCRkVOVEVSOwotCi0vLwlwcmludGsoS0VSTl9ERUJVRyAiY3RiMSAlZCBpZCAlMDR4IG8gJWQgJWQgJWQgJWQgJWRcbiIsIGJhcCwgaWQsIG9mZnNldCwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCk7Ci0KLQkvKiBWYWxpZGF0ZSBiYXAsIG9mZnNldCwgYnVmLCBhbmQgbGVuICovCi0JaWYgKCAoYmFwID4gMSkgfHwKLQkgICAgIChvZmZzZXQgPiBIRkEzODR4X0JBUF9PRkZTRVRfTUFYKSB8fAotCSAgICAgKG9mZnNldCAlIDIpIHx8Ci0JICAgICAoYnVmID09IE5VTEwpIHx8Ci0JICAgICAobGVuMStsZW4yK2xlbjMrbGVuNCA+IEhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYKSApewotCSAgICAgCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJc2VsZWN0cmVnID0gKGJhcCA9PSAxKSA/IEhGQTM4NHhfU0VMRUNUMSA6IEhGQTM4NHhfU0VMRUNUMDsKLQkJb2Zmc2V0cmVnID0gKGJhcCA9PSAxKSA/IEhGQTM4NHhfT0ZGU0VUMSA6IEhGQTM4NHhfT0ZGU0VUMDsKLQkJZGF0YXJlZyA9ICAgKGJhcCA9PSAxKSA/IEhGQTM4NHhfREFUQTEgICA6IEhGQTM4NHhfREFUQTA7Ci0JCS8qIE9idGFpbiBsb2NrICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotCi0JCS8qIFdyaXRlIGlkIHRvIHNlbGVjdCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGlkLCBzZWxlY3RyZWcpOwotCQl1ZGVsYXkoMTApOwotCQkvKiBXcml0ZSBvZmZzZXQgdG8gb2Zmc2V0IHJlZyAqLwotCQloZmEzODR4X3NldHJlZyhodywgb2Zmc2V0LCBvZmZzZXRyZWcpOwotCQkvKiBXYWl0IGZvciBvZmZzZXRbYnVzeV0gdG8gY2xlYXIgKHNlZSBCQVBfVElNRU9VVCkgKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBvZmZzZXRyZWcpOwotCQkJaWYgKCBpID4gMCApIHVkZWxheSgxMCk7Ci0JCQlpKys7Ci0JCX0gd2hpbGUgKCBpIDwgcHJpc20yX2JhcF90aW1lb3V0ICYmIEhGQTM4NHhfT0ZGU0VUX0lTQlVTWShyZWcpKTsKLQotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1BDSSkKLQkJLyogUmVsZWFzZSBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0jZW5kaWYKLQotCQlpZiAoIEhGQTM4NHhfT0ZGU0VUX0lTQlVTWShyZWcpICl7Ci0JCQkvKiBJZiB0aW1lb3V0LCByZXR1cm4gcmVnICovCi0JCQlyZXN1bHQgPSByZWc7Ci0JCX0gZWxzZSBpZiAoIEhGQTM4NHhfT0ZGU0VUX0lTRVJSKHJlZykgKXsKLQkJCS8qIElmIG9mZnNldFtlcnJdID09IDEsIHJldHVybiByZWcgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIHsKLQkJCWQgPSAoVUlOVDgqKWJ1ZjsKLQkJCS8qIFdyaXRlIGV2ZW4obGVuMSkgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQlmb3IgKCBpID0gMDsgaSA8IChsZW4xICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsCi0JCQkJCSooVUlOVDE2KikoJihkW2ldKSksIGRhdGFyZWcpOwotCQkJfQotCQkJaWYgKGxlbjEgJiAxKSB7Ci0JCQkJVUlOVDE2IGRhdGE7Ci0JCQkJVUlOVDggKmIgPSAoVUlOVDggKikgJmRhdGE7Ci0JCQkJYlswXSA9IGRbbGVuMS0xXTsKLQkJCQlpZiAoYnVmMiAhPSBOVUxMKSB7Ci0JCQkJCWQgPSAoVUlOVDgqKWJ1ZjI7Ci0JCQkJCWJbMV0gPSBkWzBdOwotCQkJCQlsZW4yLS07Ci0JCQkJCWJ1ZjIrKzsKLQkJCQl9Ci0JCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCBkYXRhLCBkYXRhcmVnKTsKLQkJCX0KLQkJCWlmICgoYnVmMiAhPSBOVUxMKSAmJiAobGVuMiA+IDApKSB7Ci0JCQkJLyogV3JpdGUgZXZlbihsZW4yKSBidWYgY29udGVudHMgdG8gZGF0YSByZWcgKi8KLQkJCQlkID0gKFVJTlQ4KilidWYyOwotCQkJCWZvciAoIGkgPSAwOyBpIDwgKGxlbjIgJiAweGZmZmUpOyBpKz0yICkgewotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsICooVUlOVDE2KikoJihkW2ldKSksIGRhdGFyZWcpOwotCQkJCX0KLQkJCQlpZiAobGVuMiAmIDEpIHsKLQkJCQkJVUlOVDE2IGRhdGE7Ci0JCQkJCVVJTlQ4ICpiID0gKFVJTlQ4ICopICZkYXRhOwotCQkJCQliWzBdID0gZFtsZW4yLTFdOwotCQkJCQlpZiAoYnVmMyAhPSBOVUxMKSB7Ci0JCQkJCQlkID0gKFVJTlQ4KilidWYzOwotCQkJCQkJYlsxXSA9IGRbMF07Ci0JCQkJCQlsZW4zLS07Ci0JCQkJCQlidWYzKys7Ci0JCQkJCX0KLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCBkYXRhLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoYnVmMyAhPSBOVUxMKSAmJiAobGVuMyA+IDApKSB7Ci0JCQkJLyogV3JpdGUgZXZlbihsZW4zKSBidWYgY29udGVudHMgdG8gZGF0YSByZWcgKi8KLQkJCQlkID0gKFVJTlQ4KilidWYzOwotCQkJCWZvciAoIGkgPSAwOyBpIDwgKGxlbjMgJiAweGZmZmUpOyBpKz0yICkgewotCQkJCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsICooVUlOVDE2KikoJihkW2ldKSksIGRhdGFyZWcpOwotCQkJCX0KLQkJCQlpZiAobGVuMyAmIDEpIHsKLQkJCQkJVUlOVDE2IGRhdGE7Ci0JCQkJCVVJTlQ4ICpiID0gKFVJTlQ4ICopICZkYXRhOwotCQkJCQliWzBdID0gZFtsZW4zLTFdOwotCQkJCQlpZiAoYnVmNCAhPSBOVUxMKSB7Ci0JCQkJCQlkID0gKFVJTlQ4KilidWY0OwotCQkJCQkJYlsxXSA9IGRbMF07Ci0JCQkJCQlsZW40LS07Ci0JCQkJCQlidWY0Kys7Ci0JCQkJCX0KLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCBkYXRhLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKGJ1ZjQgIT0gTlVMTCkgJiYgKGxlbjQgPiAwKSkgewotCQkJCS8qIFdyaXRlIGV2ZW4obGVuNCkgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQkJZCA9IChVSU5UOCopYnVmNDsKLQkJCQlmb3IgKCBpID0gMDsgaSA8IChsZW40ICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCAqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQkJaWYgKGxlbjQgJiAxKSB7Ci0JCQkJCVVJTlQxNiBkYXRhOwotCQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQkJYlswXSA9IGRbbGVuNC0xXTsKLQkJCQkJYlsxXSA9IDA7Ci0KLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCBkYXRhLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQl9Ci0vLwkJCXByaW50ayhLRVJOX0RFQlVHICJjdGIyICVkIGlkICUwNHggbyAlZCAlZCAlZCAlZCAlZFxuIiwgYmFwLCBpZCwgb2Zmc2V0LCBsZW4xLCBsZW4yLCBsZW4zLCBsZW40KTsKLQotCQl9Ci0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0JCXVkZWxheSg1KTsKLQkJLyogUmVsZWFzZSBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICYoaHctPmJhcGxvY2spLCBmbGFncyk7Ci0jZW5kaWYKLQotCX0KLQotCWlmIChyZXN1bHQpCi0JCVdMQU5fTE9HX0VSUk9SKCJjb3B5X3RvX2JhcCgpIGZhaWxlZC5cbiIpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfZnJvbV9hdXgKLSoKLSogQ29waWVzIGEgY29sbGVjdGlvbiBvZiBieXRlcyBmcm9tIHRoZSBjb250cm9sbGVyIG1lbW9yeS4gIFRoZQotKiBBdXhpbGlhcnkgcG9ydCBNVVNUIGJlIGVuYWJsZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotKiBXZSBfbWlnaHRfIGJlIGluIGEgZG93bmxvYWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJY2FyZGFkZHIJYWRkcmVzcyBpbiBoZmEzODR4IGRhdGEgc3BhY2UgdG8gcmVhZAotKglhdXhjdGwJCWFkZHJlc3Mgc3BhY2Ugc2VsZWN0Ci0qCWJ1ZgkJcHRyIHRvIGRlc3RpbmF0aW9uIGhvc3QgYnVmZmVyCi0qCWxlbgkJbGVuZ3RoIG9mIGRhdGEgdG8gdHJhbnNmZXIgKGluIGJ5dGVzKQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJYnVmIGNvbnRhaW5zIHRoZSBkYXRhIGNvcGllZAotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1oZmEzODR4X2NvcHlfZnJvbV9hdXgoCi0JaGZhMzg0eF90ICpodywgVUlOVDMyIGNhcmRhZGRyLCBVSU5UMzIgYXV4Y3RsLCB2b2lkICpidWYsIFVJTlQgbGVuKQotewotCVVJTlQxNgkJY3VycnBhZ2U7Ci0JVUlOVDE2CQljdXJyb2Zmc2V0OwotCVVJTlQJCWkgPSAwOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoICEoaHctPmF1eGVuKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJBdHRlbXB0IHRvIHJlYWQgMHglMDR4IHdoZW4gYXV4IG5vdCBlbmFibGVkXG4iLAotCQkJY2FyZGFkZHIpOwotCQlyZXR1cm47Ci0KLQl9Ci0JLyogQnVpbGQgYXBwcm9wcmlhdGUgYXV4IHBhZ2UgYW5kIG9mZnNldCAqLwotCWN1cnJwYWdlID0gSEZBMzg0eF9BVVhfTUtQQUdFKGNhcmRhZGRyKTsKLQljdXJyb2Zmc2V0ID0gSEZBMzg0eF9BVVhfTUtPRkYoY2FyZGFkZHIsIGF1eGN0bCk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJyb2Zmc2V0LCBIRkEzODR4X0FVWE9GRlNFVCk7Ci0JdWRlbGF5KDUpOwkvKiBiZWF0ICovCi0KLQkvKiByZWFkIHRoZSBkYXRhICovCi0Jd2hpbGUgKCBpIDwgbGVuKSB7Ci0JCSooKFVJTlQxNiopKGJ1ZitpKSkgPSBoZmEzODR4X2dldHJlZ19ub3N3YXAoaHcsIEhGQTM4NHhfQVVYREFUQSk7Ci0JCWkrPTI7Ci0JCWN1cnJvZmZzZXQrPTI7Ci0JCWlmICggKGN1cnJvZmZzZXQmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykgPgotCQkJSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYICkgewotCQkJY3VycnBhZ2UrKzsKLQkJCWN1cnJvZmZzZXQgPSAwOwotCQkJY3Vycm9mZnNldCA9IEhGQTM4NHhfQVVYX01LT0ZGKGN1cnJvZmZzZXQsIGF1eGN0bCk7Ci0JCQloZmEzODR4X3NldHJlZyhodywgY3VycnBhZ2UsIEhGQTM4NHhfQVVYUEFHRSk7Ci0JCQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCQkJdWRlbGF5KDUpOwkvKiBiZWF0ICovCi0JCX0KLQl9Ci0JLyogTWFrZSBzdXJlIHRoZSBhdXhjdGwgYml0cyBhcmUgY2xlYXIgKi8KLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCURCRkVYSVQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY29weV90b19hdXgKLSoKLSogQ29waWVzIGEgY29sbGVjdGlvbiBvZiBieXRlcyB0byB0aGUgY29udHJvbGxlciBtZW1vcnkuICBUaGUKLSogQXV4aWxpYXJ5IHBvcnQgTVVTVCBiZSBlbmFibGVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSogV2UgX21pZ2h0XyBiZSBpbiBhIGRvd25sb2FkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWNhcmRhZGRyCWFkZHJlc3MgaW4gaGZhMzg0eCBkYXRhIHNwYWNlIHRvIHJlYWQKLSoJYXV4Y3RsCQlhZGRyZXNzIHNwYWNlIHNlbGVjdAotKglidWYJCXB0ciB0byBkZXN0aW5hdGlvbiBob3N0IGJ1ZmZlcgotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCUNvbnRyb2xsZXIgbWVtb3J5IG5vdyBjb250YWlucyBhIGNvcHkgb2YgYnVmCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWhmYTM4NHhfY29weV90b19hdXgoCi0JaGZhMzg0eF90ICpodywgVUlOVDMyIGNhcmRhZGRyLCBVSU5UMzIgYXV4Y3RsLCB2b2lkICpidWYsIFVJTlQgbGVuKQotewotCVVJTlQxNgkJY3VycnBhZ2U7Ci0JVUlOVDE2CQljdXJyb2Zmc2V0OwotCVVJTlQJCWkgPSAwOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoICEoaHctPmF1eGVuKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJBdHRlbXB0IHRvIHJlYWQgMHglMDR4IHdoZW4gYXV4IG5vdCBlbmFibGVkXG4iLAotCQkJY2FyZGFkZHIpOwotCQlyZXR1cm47Ci0KLQl9Ci0JLyogQnVpbGQgYXBwcm9wcmlhdGUgYXV4IHBhZ2UgYW5kIG9mZnNldCAqLwotCWN1cnJwYWdlID0gSEZBMzg0eF9BVVhfTUtQQUdFKGNhcmRhZGRyKTsKLQljdXJyb2Zmc2V0ID0gSEZBMzg0eF9BVVhfTUtPRkYoY2FyZGFkZHIsIGF1eGN0bCk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJyb2Zmc2V0LCBIRkEzODR4X0FVWE9GRlNFVCk7Ci0JdWRlbGF5KDUpOwkvKiBiZWF0ICovCi0KLQkvKiB3cml0ZSB0aGUgZGF0YSAqLwotCXdoaWxlICggaSA8IGxlbikgewotCQloZmEzODR4X3NldHJlZ19ub3N3YXAoaHcsCi0JCQkqKChVSU5UMTYqKShidWYraSkpLCBIRkEzODR4X0FVWERBVEEpOwotCQlpKz0yOwotCQljdXJyb2Zmc2V0Kz0yOwotCQlpZiAoIGN1cnJvZmZzZXQgPiBIRkEzODR4X0FERFJfQVVYX09GRl9NQVggKSB7Ci0JCQljdXJycGFnZSsrOwotCQkJY3Vycm9mZnNldCA9IDA7Ci0JCQloZmEzODR4X3NldHJlZyhodywgY3VycnBhZ2UsIEhGQTM4NHhfQVVYUEFHRSk7Ci0JCQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCQkJdWRlbGF5KDUpOwkvKiBiZWF0ICovCi0JCX0KLQl9Ci0JREJGRVhJVDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfd2FpdAotKgotKiBXYWl0cyBmb3IgYXZhaWxhYmlsaXR5IG9mIHRoZSBDb21tYW5kIHJlZ2lzdGVyLCB0aGVuCi0qIGlzc3VlcyB0aGUgZ2l2ZW4gY29tbWFuZC4gIFRoZW4gcG9sbHMgdGhlIEV2c3RhdCByZWdpc3RlcgotKiB3YWl0aW5nIGZvciBjb21tYW5kIGNvbXBsZXRpb24uICBUaW1lb3V0cyBzaG91bGRuJ3QgYmUKLSogcG9zc2libGUgc2luY2Ugd2UncmUgcHJldmVudGluZyBvdmVybGFwcGluZyBjb21tYW5kcyBhbmQgYWxsCi0qIGNvbW1hbmRzIHNob3VsZCBiZSBjbGVhcmVkIGFuZCBhY2tub3dsZWRnZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBjbWQgICAgICAgICAgICAgY21kIHN0cnVjdHVyZS4gIEluY2x1ZGVzIGFsbCBhcmd1bWVudHMgYW5kIHJlc3VsdAotKiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwb2ludHMuICBBbGwgaW4gaG9zdCBvcmRlci4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgktRVRJTUVET1VUCXRpbWVkIG91dCB3YWl0aW5nIGZvciByZWdpc3RlciByZWFkeSBvcgotKgkJCWNvbW1hbmQgY29tcGxldGlvbgotKgk+MAkJY29tbWFuZCBpbmRpY2F0ZWQgZXJyb3IsIFN0YXR1cyBhbmQgUmVzcDAtMiBhcmUKLSoJCQlpbiBodyBzdHJ1Y3R1cmUuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCkKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JVUlOVDE2CQlyZWcgPSAwOwotCVVJTlQxNiAgICAgICAgICBjb3VudGVyOwotCi0JREJGRU5URVI7Ci0KLQlody0+Y21kZmxhZyA9IDA7Ci0JaHctPmNtZGRhdGEgPSBjbWQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgYnVzeSBiaXQgdG8gY2xlYXIgKi8KLQljb3VudGVyID0gMDsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCXdoaWxlICggSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYKLQkJKGNvdW50ZXIgPCAxMCkpIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQkJY291bnRlcisrOwotCQl1ZGVsYXkoMTApOwotCX0KLQotCWlmIChIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQlXTEFOX0xPR19FUlJPUigiaGZhMzg0eF9jbWQgdGltZW91dCgxKSwgcmVnPTB4JTBoeC5cbiIsIHJlZyk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlpZiAoIUhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCS8qIGJ1c3kgYml0IGNsZWFyLCB3cml0ZSBjb21tYW5kICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0wLCBIRkEzODR4X1BBUkFNMCk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0xLCBIRkEzODR4X1BBUkFNMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0yLCBIRkEzODR4X1BBUkFNMik7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPmNtZCwgSEZBMzg0eF9DTUQpOwotCi0jaWZkZWYgQ01EX0lSUQotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMiwwKSkKLQkJd2hpbGUgKCEgaHctPmNtZGZsYWcpCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZody0+Y21kcSk7Ci0jZWxzZQotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaHctPmNtZHEsIGh3LT5jbWRmbGFnKTsKLSNlbmRpZgotCQlyZXN1bHQgPSBIRkEzODR4X1NUQVRVU19SRVNVTFRfR0VUKGNtZC0+c3RhdHVzKTsKLSNlbHNlIC8vIENNRF9JUlEKLQkJLyogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJY291bnRlciA9IDA7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCS8qIEluaXRpYWxpemF0aW9uIGlzIHRoZSBwcm9ibGVtLiAgSXQgdGFrZXMgYWJvdXQKLSAgICAgICAgICAgICAgICAgICAxMDBtcy4gIm5vcm1hbCIgY29tbWFuZHMgYXJlIHR5cGljYWxseSBpcyBhYm91dAotICAgICAgICAgICAgICAgICAgIDIwMC00MDAgdXMgKEkndmUgbmV2ZXIgc2VlbiBsZXNzIHRoYW4gMjAwKS4gIExvbmdlcgotICAgICAgICAgICAgICAgICAgIGlzIGJldHRlciBzbyB0aGF0IHdlJ3JlIG5vdCBoYW1tZXJpbmcgdGhlIGJ1cy4gKi8KLQkJd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSAmJgotCQkJKGNvdW50ZXIgPCA1MDAwKSkgewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJCWNvdW50ZXIrKzsKLQkJCXVkZWxheSgyMDApOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0NNRChyZWcpICkgewotCQkJcmVzdWx0ID0gMDsKLQkJCWNtZC0+cmVzdWx0LnN0YXR1cyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1NUQVRVUyk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AwKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AxID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDEpOwotCQkJY21kLT5yZXN1bHQucmVzcDIgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19DTUQsCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCQlyZXN1bHQgPSBIRkEzODR4X1NUQVRVU19SRVNVTFRfR0VUKGNtZC0+cmVzdWx0LnN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiaGZhMzg0eF9jbWQgdGltZW91dCgyKSwgcmVnPTB4JTBoeC5cbiIsIHJlZyk7Ci0JCX0KLSNlbmRpZiAgLyogQ01EX0lSUSAqLwotCX0KLQotIGZhaWxlZDoKLQlody0+Y21kZmxhZyA9IDA7Ci0JaHctPmNtZGRhdGEgPSBOVUxMOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RsX2RvY21kX3dhaXQKLSoKLSogV2FpdHMgZm9yIGF2YWlsYWJpbGl0eSBvZiB0aGUgQ29tbWFuZCByZWdpc3RlciwgdGhlbgotKiBpc3N1ZXMgdGhlIGdpdmVuIGNvbW1hbmQuICBUaGVuIHBvbGxzIHRoZSBFdnN0YXQgcmVnaXN0ZXIKLSogd2FpdGluZyBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAgVGltZW91dHMgc2hvdWxkbid0IGJlCi0qIHBvc3NpYmxlIHNpbmNlIHdlJ3JlIHByZXZlbnRpbmcgb3ZlcmxhcHBpbmcgY29tbWFuZHMgYW5kIGFsbAotKiBjb21tYW5kcyBzaG91bGQgYmUgY2xlYXJlZCBhbmQgYWNrbm93bGVkZ2VkLgotKgotKiBUaGlzIHJvdXRpbmUgaXMgb25seSB1c2VkIGZvciBkb3dubG9hZHMuICBTaW5jZSBpdCBkb2Vzbid0IGxvY2sgb3V0Ci0qIGludGVycnVwdHMgdGhlIHN5c3RlbSByZXNwb25zZSBpcyBtdWNoIGJldHRlci4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQlkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIGNtZCAgICAgICAgICAgICBjbWQgc3RydWN0dXJlLiAgSW5jbHVkZXMgYWxsIGFyZ3VtZW50cyBhbmQgcmVzdWx0Ci0qICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHBvaW50cy4gIEFsbCBpbiBob3N0IG9yZGVyLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCS1FVElNRURPVVQJdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlZ2lzdGVyIHJlYWR5IG9yCi0qCQkJY29tbWFuZCBjb21wbGV0aW9uCi0qCT4wCQljb21tYW5kIGluZGljYXRlZCBlcnJvciwgU3RhdHVzIGFuZCBSZXNwMC0yIGFyZQotKgkJCWluIGh3IHN0cnVjdHVyZS4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF9kbF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKQotewotCWludAkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7Ci0JVUlOVDE2CQlyZWcgPSAwOwotCi0JREJGRU5URVI7Ci0JLyogd2FpdCBmb3IgdGhlIGJ1c3kgYml0IHRvIGNsZWFyICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAxKkhaOwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0Jd2hpbGUgKCBIRkEzODR4X0NNRF9JU0JVU1kocmVnKSAmJiB0aW1lX2JlZm9yZSggamlmZmllcywgdGltZW91dCkgKSB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmIChIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQlXTEFOX0xPR19XQVJOSU5HKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgY21kIHJlZ2lzdGVyLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWlmICghSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJLyogYnVzeSBiaXQgY2xlYXIsIHdyaXRlIGNvbW1hbmQgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTAsIEhGQTM4NHhfUEFSQU0wKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTEsIEhGQTM4NHhfUEFSQU0xKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+cGFybTIsIEhGQTM4NHhfUEFSQU0yKTsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGNtZC0+Y21kLCBIRkEzODR4X0NNRCk7Ci0KLQkJLyogTm93IHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJaWYgKCAoSEZBMzg0eF9DTURfQ01EQ09ERV9HRVQoY21kLT5jbWQpID09IEhGQTM4NHhfQ01EQ09ERV9ET1dOTEQpICkgewotCQkJLyogZGx0aW1lb3V0IGlzIGluIG1zICovCi0JCQl0aW1lb3V0ID0gKCgoVUlOVDMyKWh3LT5kbHRpbWVvdXQpIC8gMTAwMFVMKSAqIEhaOwotCQkJaWYgKCB0aW1lb3V0ID4gMCApIHsKLQkJCQl0aW1lb3V0ICs9IGppZmZpZXM7Ci0JCQl9IGVsc2UgewotCQkJCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQkJfQotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQl3aGlsZSAoICFIRkEzODR4X0VWU1RBVF9JU0NNRChyZWcpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGltZW91dCkgKSB7Ci0JCQl1ZGVsYXkoMTAwKTsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCX0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0NNRChyZWcpICkgewotCQkJcmVzdWx0ID0gMDsKLQkJCWNtZC0+cmVzdWx0LnN0YXR1cyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1NUQVRVUyk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AwKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AxID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDEpOwotCQkJY21kLT5yZXN1bHQucmVzcDIgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19DTUQsIEhGQTM4NHhfRVZBQ0spOwotCQkJcmVzdWx0ID0gSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVChjbWQtPnJlc3VsdC5zdGF0dXMpOwotCQl9Ci0JfQotCi1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3N0YXJ0Ci0qCi0qIElzc3VlcyB0aGUgTUFDIGluaXRpYWxpemUgY29tbWFuZCwgc2V0cyB1cCBzb21lIGRhdGEgc3RydWN0dXJlcywKLSogYW5kIGVuYWJsZXMgdGhlIGludGVycnVwdHMuICBBZnRlciB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcywgdGhlCi0qIGxvdy1sZXZlbCBzdHVmZiBzaG91bGQgYmUgcmVhZHkgZm9yIGFueS9hbGwgY29tbWFuZHMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCQlyZWc7Ci0JaW50CQkJaTsKLQlpbnQJCQlqOwotCURCRkVOVEVSOwotCi0JLyogY2FsbCBpbml0aWFsaXplICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJJbml0aWFsaXplIGNvbW1hbmQgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIG1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgYW55IGxheWFib3V0IGV2ZW50cyBjbGVhcmVkICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfSU5URU4pOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZBQ0spOwotCi0gICAgICAgIGh3LT50eGZpZF9oZWFkID0gMDsKLSAgICAgICAgaHctPnR4ZmlkX3RhaWwgPSAwOwotICAgICAgICBody0+dHhmaWRfTiA9IEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVg7Ci0gICAgICAgIG1lbXNldChody0+dHhmaWRfcXVldWUsIDAsIHNpemVvZihody0+dHhmaWRfcXVldWUpKTsKLQotCS8qIEFsbG9jYXRlIHR4IGFuZCBub3RpZnkgRklEcyAqLwotCS8qIEZpcnN0LCB0eCAqLwotCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWC0xOyBpKyspIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWxsb2NhdGUoaHcsIEhGQTM4NHhfRFJWUl9UWEJVRl9NQVgpOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJBbGxvY2F0ZSh0eCkgY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCWogPSAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQkJdWRlbGF5KDEwKTsKLQkJCWorKzsKLQkJfSB3aGlsZSAoICFIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHJlZykgJiYgaiA8IDUwKTsgLyogNTAgaXMgdGltZW91dCAqLwotCQlpZiAoIGogPj0gNTAgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV2YWxsb2ModHgpLlxuIik7Ci0JCQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQUxMT0NGSUQpOwotCi0JCXR4ZmlkX3F1ZXVlX2FkZChodywgcmVnKTsKLQotCQlXTEFOX0xPR19ERUJVRyg0LCJody0+dHhmaWRfcXVldWVbJWRdPTB4JTA0eFxuIixpLHJlZyk7Ci0KLQkJcmVnID0gSEZBMzg0eF9FVkFDS19BTExPQ19TRVQoMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCByZWcsIEhGQTM4NHhfRVZBQ0spOwotCi0JfQotCi0JLyogTm93LCB0aGUgaW5mbyBmcmFtZSBmaWQgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hbGxvY2F0ZShodywgSEZBMzg0eF9JTkZPRlJNX01BWExFTik7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJBbGxvY2F0ZSh0eCkgY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWkgPSAwOwotCWRvIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJdWRlbGF5KDEwKTsKLQkJaSsrOwotCX0gd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNBTExPQyhyZWcpICYmIGkgPCA1MCk7IC8qIDUwIGlzIHRpbWVvdXQgKi8KLQlpZiAoIGkgPj0gNTAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgZXZhbGxvYyhpbmZvKS5cbiIpOwotCQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaHctPmluZm9maWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9BTExPQ0ZJRCk7Ci0JcmVnID0gSEZBMzg0eF9FVkFDS19BTExPQ19TRVQoMSk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIHJlZywgSEZBMzg0eF9FVkFDSyk7Ci0JV0xBTl9MT0dfREVCVUcoNCwiaHctPmluZm9maWQ9MHglMDR4XG4iLCBody0+aW5mb2ZpZCk7Ci0KLQkvKiBTZXQgc3dzdXBwb3J0IHJlZ3MgdG8gbWFnaWMgIyBmb3IgY2FyZCBwcmVzZW5jZSBkZXRlY3Rpb24gKi8KLQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9EUlZSX01BR0lDLCBIRkEzODR4X1NXU1VQUE9SVDApOwotCi0JLyogTm93IGVuYWJsZSB0aGUgaW50ZXJydXB0cyBhbmQgc2V0IHRoZSBydW5uaW5nIHN0YXRlICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4ZmZmZiwgSEZBMzg0eF9FVlNUQVQpOwotCWhmYTM4NHhfZXZlbnRzX2FsbChodyk7Ci0KLQlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX1JVTk5JTkc7Ci0KLQlnb3RvIGRvbmU7Ci1mYWlsZWQ6Ci0JV0xBTl9MT0dfRVJST1IoIkZhaWxlZCwgcmVzdWx0PSVkXG4iLCByZXN1bHQpOwotZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9zdG9wCi0qCi0qIElzc3VlcyB0aGUgaW5pdGlhbGl6ZSBjb21tYW5kIHRvIGxlYXZlIHVzIGluIHRoZSAncmVzZXQnIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQlpbnQgaTsKLQlEQkZFTlRFUjsKLQotCWRlbF90aW1lcl9zeW5jKCZody0+Y29tbXNxdWFsX3RpbWVyKTsKLQotCWlmICggaHctPndsYW5kZXYtPmh3cmVtb3ZlZCApIHsKLQkJLyogb25seSBmbHVzaCB3aGVuIHdlJ3JlIHNodXR0aW5nIGRvd24gZm9yIGdvb2QgKi8KLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQl9Ci0KLQlpZiAoaHctPnN0YXRlID09IEhGQTM4NHhfU1RBVEVfUlVOTklORykgewotCQkvKgotCQkgKiBTZW5kIHRoZSBNQUMgaW5pdGlhbGl6ZSBjbWQuCi0JCSAqLwotCQloZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKLQotCQkvKgotCQkgKiBNYWtlIGFic29sdXRlbHkgc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgYW55Ci0JCSAqIGxheWFib3V0IGV2ZW50cyBjbGVhcmVkCi0JCSAqLwotCQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9JTlRFTik7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZBQ0spOwotCX0KLQotCXRhc2tsZXRfa2lsbCgmaHctPmJhcF90YXNrbGV0KTsKLQotCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQ7Ci0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9JTklUOwotCi0JLyogQ2xlYXIgYWxsIHRoZSBwb3J0IHN0YXR1cyAqLwotCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9OVU1QT1JUU19NQVg7IGkrKykgewotCQlody0+cG9ydF9lbmFibGVkW2ldID0gMDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl90eGZyYW1lCi0qCi0qIFRha2VzIGEgZnJhbWUgZnJvbSBwcmlzbTJzdGEgYW5kIHF1ZXVlcyBpdCBmb3IgdHJhbnNtaXNzaW9uLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXNrYgkJcGFja2V0IGJ1ZmZlciBzdHJ1Y3QuICBDb250YWlucyBhbiA4MDIuMTEKLSoJCQlkYXRhIGZyYW1lLgotKiAgICAgICBwODAyMTFfaGRyICAgICAgcG9pbnRzIHRvIHRoZSA4MDIuMTEgaGVhZGVyIGZvciB0aGUgcGFja2V0LgotKiBSZXR1cm5zOgotKgkwCQlTdWNjZXNzIGFuZCBtb3JlIGJ1ZmZzIGF2YWlsYWJsZQotKgkxCQlTdWNjZXNzIGJ1dCBubyBtb3JlIGJ1ZmZzCi0qCTIJCUFsbG9jYXRpb24gZmFpbHVyZQotKgkzCQlNQUMgVHggY29tbWFuZCBmYWlsZWQKLSoJNAkJQnVmZmVyIGZ1bGwgb3IgcXVldWUgYnVzeQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCkKLXsKLQloZmEzODR4X3R4X2ZyYW1lX3QJdHhkZXNjOwotCVVJTlQxNgkJCW1hY3EgPSAwOwotCVVJTlQxNgkJCWZpZDsKLQlpbnQJCQlyZXN1bHQ7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEJ1aWxkIFR4IGZyYW1lIHN0cnVjdHVyZSAqLwotCS8qIFNldCB1cCB0aGUgY29udHJvbCBmaWVsZCAqLwotCW1lbXNldCgmdHhkZXNjLCAwLCBzaXplb2YodHhkZXNjKSk7Ci0KLS8qIFR4IGNvbXBsZXRlIGFuZCBUeCBleGNlcHRpb24gZGlzYWJsZSBwZXIgZGxlYWNoLiAgTWlnaHQgYmUgY2F1c2luZwotICogYnVmIGRlcGxldGlvbgotICovCi0jZGVmaW5lIERPQk9USCAxCi0jaWYgRE9CT1RICi0JdHhkZXNjLnR4X2NvbnRyb2wgPQotCQlIRkEzODR4X1RYX01BQ1BPUlRfU0VUKDApIHwgSEZBMzg0eF9UWF9TVFJVQ1RZUEVfU0VUKDEpIHwKLQkJSEZBMzg0eF9UWF9UWEVYX1NFVCgxKSB8IEhGQTM4NHhfVFhfVFhPS19TRVQoMSk7Ci0jZWxpZiBET0VYQwotCXR4ZGVzYy50eF9jb250cm9sID0KLQkJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCgwKSB8IEhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCgxKSB8Ci0JCUhGQTM4NHhfVFhfVFhFWF9TRVQoMSkgfCBIRkEzODR4X1RYX1RYT0tfU0VUKDApOwotI2Vsc2UKLQl0eGRlc2MudHhfY29udHJvbCA9Ci0JCUhGQTM4NHhfVFhfTUFDUE9SVF9TRVQoMCkgfCBIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQoMSkgfAotCQlIRkEzODR4X1RYX1RYRVhfU0VUKDApIHwgSEZBMzg0eF9UWF9UWE9LX1NFVCgwKTsKLSNlbmRpZgotCi0JLyogaWYgd2UncmUgdXNpbmcgaG9zdCBXRVAsIGluY3JlYXNlIHNpemUgYnkgSVYrSUNWICovCi0JaWYgKHA4MDIxMV93ZXAtPmRhdGEpIHsKLQkJdHhkZXNjLmRhdGFfbGVuID0gaG9zdDJoZmEzODR4XzE2KHNrYi0+bGVuKzgpOwotCQkvLwkJdHhkZXNjLnR4X2NvbnRyb2wgfD0gSEZBMzg0eF9UWF9OT0VOQ1JZUFRfU0VUKDEpOwotCX0gZWxzZSB7Ci0JCXR4ZGVzYy5kYXRhX2xlbiA9ICBob3N0MmhmYTM4NHhfMTYoc2tiLT5sZW4pOwotCX0KLQotCXR4ZGVzYy50eF9jb250cm9sID0gaG9zdDJoZmEzODR4XzE2KHR4ZGVzYy50eF9jb250cm9sKTsKLQkvKiBjb3B5IHRoZSBoZWFkZXIgb3ZlciB0byB0aGUgdHhkZXNjICovCi0JbWVtY3B5KCYodHhkZXNjLmZyYW1lX2NvbnRyb2wpLCBwODAyMTFfaGRyLCBzaXplb2YocDgwMjExX2hkcl90KSk7Ci0KLQkvKiBTaW5jZSB0YnVzeSBpcyBzZXQgd2hlbmV2ZXIgdGhlIHN0YWNrIGlzIGVtcHR5LCB0aGVyZSBzaG91bGQKLQkgKiBhbHdheXMgYmUgc29tZXRoaW5nIG9uIHRoZSBzdGFjayBpZiB3ZSBnZXQgdG8gdGhpcyBwb2ludC4KLQkgKiBbTVNNXTogTk9UIFRSVUUhISEhISBzbyBJIGFkZGVkIHRoZSB0ZXN0IG9mIGZpZCBiZWxvdy4KLQkgKi8KLQotCS8qIEFsbG9jYXRlIEZJRCAqLwotCi0JZmlkID0gdHhmaWRfcXVldWVfcmVtb3ZlKGh3KTsKLQotCWlmICggZmlkID09IDAgKSB7IC8qIHN0YWNrIG9yIHF1ZXVlIHdhcyBlbXB0eSAqLwotCQlyZXR1cm4gNDsKLQl9Ci0KLQkvKiBub3cgbGV0J3MgZ2V0IHRoZSBjbWRsb2NrICovCi0Jc3Bpbl9sb2NrKCZody0+Y21kbG9jayk7Ci0KLQkvKiBDb3B5IGRlc2NyaXB0b3IrcGF5bG9hZCB0byBGSUQgKi8KLSAgICAgICAgaWYgKHA4MDIxMV93ZXAtPmRhdGEpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcDQoaHcsIEhGQTM4NHhfQkFQX1BST0MsIGZpZCwgMCwKLQkJCQkJICAgICAgJnR4ZGVzYywgc2l6ZW9mKHR4ZGVzYyksCi0JCQkJCSAgICAgIHA4MDIxMV93ZXAtPml2LCBzaXplb2YocDgwMjExX3dlcC0+aXYpLAotCQkJCQkgICAgICBwODAyMTFfd2VwLT5kYXRhLCBza2ItPmxlbiwKLQkJCQkJICAgICAgcDgwMjExX3dlcC0+aWN2LCBzaXplb2YocDgwMjExX3dlcC0+aWN2KSk7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcDQoaHcsIEhGQTM4NHhfQkFQX1BST0MsIGZpZCwgMCwKLQkJCQkJICAgICAgJnR4ZGVzYywgc2l6ZW9mKHR4ZGVzYyksCi0JCQkJCSAgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJCSAgICAgIE5VTEwsIDAsIE5VTEwsIDApOwotCX0KLQotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfdG9fYmFwKCUwNHgsICVkLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCWZpZCwKLQkJIAlzaXplb2YodHhkZXNjKSwKLQkgCQlza2ItPmxlbiwKLQkJCXJlc3VsdCk7Ci0KLQkJLyogcHV0IHRoZSBmaWQgYmFjayBpbiB0aGUgcXVldWUgKi8KLQkJdHhmaWRfcXVldWVfYWRkKGh3LCBmaWQpOwotCi0JCXJlc3VsdCA9IDM7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIElzc3VlIFR4IGNvbW1hbmQgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF90cmFuc21pdChodywgSEZBMzg0eF9UWENNRF9SRUNMLCBtYWNxLCBmaWQpOwotCi0JaWYgKCByZXN1bHQgIT0gMCApIHsKLQkJdHhmaWRfcXVldWVfYWRkKGh3LCBmaWQpOwotCi0JCVdMQU5fTE9HX0RFQlVHKDEsImNtZF90eCglMDR4KSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwKLQkJCWZpZCwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gMzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogaW5kaWNhdGUgd2UgaGF2ZW4ndCBhbnkgYnVmZmVycywgaW50X2FsbG9jIHdpbGwgY2xlYXIgKi8KLQlyZXN1bHQgPSB0eGZpZF9xdWV1ZV9lbXB0eShodyk7Ci1mYWlsZWQ6Ci0KLQlzcGluX3VubG9jaygmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRlcnJ1cHQKLSoKLSogRHJpdmVyIGludGVycnVwdCBoYW5kbGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWlycQkJaXJxIG51bWJlcgotKglkZXZfaWQJCXBvaW50ZXIgdG8gdGhlIGRldmljZQotKglyZWdzCQlyZWdpc3RlcnMKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCU1heSByZXN1bHQgaW4gYSBmcmFtZSBiZWluZyBwYXNzZWQgdXAgdGhlIHN0YWNrIG9yIGFuIGluZm8KLSoJZnJhbWUgYmVpbmcgaGFuZGxlZC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglVbW1tLCBjb3VsZCBpdCBiZSBpbnRlcnJ1cHQ/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWlycXJldHVybl90IGhmYTM4NHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTKQotewotCWludAkJCXJlZzsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopZGV2X2lkOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlpbnQJCQlldl9yZWFkID0gMDsKLQlEQkZFTlRFUjsKLQotCWlmICghd2xhbmRldiB8fCB3bGFuZGV2LT5od3JlbW92ZWQpCi0JCXJldHVybiBJUlFfTk9ORTsgIC8qIE5vdCBtdWNoIHdlIGNhbiBkbyB3L28gaGFyZHdhcmUgKi8KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0JaWYgKGh3LT5pb2Jhc2UgPT0gMCkgIC8qIFhYWCBGSVhNRSBQcm9wZXJseSAqLwotCQlyZXR1cm4gSVJRX05PTkU7Ci0jZW5kaWYKLQotCWZvciAoOztldl9yZWFkKyspIHsKLQkJaWYgKGV2X3JlYWQgPj0gcHJpc20yX2lycV9ldnJlYWRfbWF4KQotCQkJYnJlYWs7Ci0KLQkJLyogQ2hlY2sgc3dzdXBwb3J0IHJlZyBtYWdpYyAjIGZvciBjYXJkIHByZXNlbmNlICovCi0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1NXU1VQUE9SVDApOwotCQlpZiAoIHJlZyAhPSBIRkEzODR4X0RSVlJfTUFHSUMpIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDIsICJpcnE9JWQsIG5vIG1hZ2ljLiAgQ2FyZCByZW1vdmVkPy5cbiIsIGlycSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHJlYWQgdGhlIEV2U3RhdCByZWdpc3RlciBmb3IgaW50ZXJydXB0IGVuYWJsZWQgZXZlbnRzICovCi0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0KLQkJLyogQU5EIHdpdGggdGhlIGVuYWJsZWQgaW50ZXJydXB0cyAqLwotCQlyZWcgJj0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfSU5URU4pOwotCi0JCS8qIEhhbmRsZSB0aGUgZXZlbnRzICovCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNXVEVSUihyZWcpICl7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCSJFcnJvcjogV1RFUlIgaW50ZXJydXB0IHJlY2VpdmVkICh1bmhhbmRsZWQpLlxuIik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19XVEVSUl9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTSU5GRFJPUChyZWcpICl7Ci0JCQloZmEzODR4X2ludF9pbmZkcm9wKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfSU5GRFJPUF9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQotCQlpZiAoSEZBMzg0eF9FVlNUQVRfSVNCQVBfT1AocmVnKSkgewotCQkJLyogRGlzYWJsZSB0aGUgQkFQIGludGVycnVwdHMgKi8KLQkJCWhmYTM4NHhfZXZlbnRzX25vYmFwKGh3KTsKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmh3LT5iYXBfdGFza2xldCk7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTQUxMT0MocmVnKSApewotCQkJaGZhMzg0eF9pbnRfYWxsb2Mod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19BTExPQ19TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTRFRJTShyZWcpICl7Ci0JCQloZmEzODR4X2ludF9kdGltKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfRFRJTV9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLSNpZmRlZiBDTURfSVJRCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSApewotCQkJaGZhMzg0eF9pbnRfY21kKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01EX1NFVCgxKSwKLQkJCQkgICAgICAgSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLSNlbmRpZgotCi0JCS8qIGFsbG93IHRoZSBldnN0YXQgdG8gYmUgdXBkYXRlZCBhZnRlciB0aGUgZXZhY2sgKi8KLQkJdWRlbGF5KDIwKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotI2lmZGVmIENNRF9JUlEKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9jbWQKLSoKLSogSGFuZGxlcyBjb21tYW5kIGNvbXBsZXRpb24gZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGhmYTM4NHhfaW50X2NtZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCURCRkVOVEVSOwotCi0JLy8gY2hlY2sgdG8gbWFrZSBzdXJlIGl0J3MgdGhlIHJpZ2h0IGNvbW1hbmQ/Ci0JaWYgKGh3LT5jbWRkYXRhKSB7Ci0JCWh3LT5jbWRkYXRhLT5zdGF0dXMgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TVEFUVVMpOwotCQlody0+Y21kZGF0YS0+cmVzcDAgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMCk7Ci0JCWh3LT5jbWRkYXRhLT5yZXNwMSA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AxKTsKLQkJaHctPmNtZGRhdGEtPnJlc3AyID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDIpOwotCX0KLQlody0+Y21kZmxhZyA9IDE7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ1bS4gaW50X2NtZFxuIik7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh3LT5jbWRxKTsKLQotCS8vIFhYWFggcGVyZm9ybSBhIGJhcCBjb3B5IHRvbz8KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9kdGltCi0qCi0qIEhhbmRsZXMgdGhlIERUSU0gZWFybHkgd2FybmluZyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2R0aW0od2xhbmRldmljZV90ICp3bGFuZGV2KQotewotI2lmIDAKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0jZW5kaWYKLQlEQkZFTlRFUjsKLQlwcmlzbTJzdGFfZXZfZHRpbSh3bGFuZGV2KTsKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfaW5mZHJvcAotKgotKiBIYW5kbGVzIHRoZSBJbmZEcm9wIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfaW5mZHJvcCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0jaWYgMAotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLSNlbmRpZgotCURCRkVOVEVSOwotCXByaXNtMnN0YV9ldl9pbmZkcm9wKHdsYW5kZXYpOwotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9pbmZvCi0qCi0qIEhhbmRsZXMgdGhlIEluZm8gZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXRhc2tsZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXJlZzsKLQloZmEzODR4X0luZkZyYW1lX3QJaW5mOwotCWludAkJCXJlc3VsdDsKLQlEQkZFTlRFUjsKLQkvKiBSZXRyaWV2ZSB0aGUgRklEICovCi0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfSU5GT0ZJRCk7Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgbGVuZ3RoICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKCBodywKLQkJSEZBMzg0eF9CQVBfSU5ULCByZWcsIDAsICZpbmYuZnJhbWVsZW4sIHNpemVvZihVSU5UMTYpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlyZWcsIHNpemVvZihpbmYpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaW5mLmZyYW1lbGVuID0gaGZhMzg0eDJob3N0XzE2KGluZi5mcmFtZWxlbik7Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgcmVzdCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsCi0JCUhGQTM4NHhfQkFQX0lOVCwgcmVnLCBzaXplb2YoVUlOVDE2KSwKLQkJJihpbmYuaW5mb3R5cGUpLCBpbmYuZnJhbWVsZW4gKiBzaXplb2YoVUlOVDE2KSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJcmVnLCBzaXplb2YoaW5mKSwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JcHJpc20yc3RhX2V2X2luZm8od2xhbmRldiwgJmluZik7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X3R4ZXhjCi0qCi0qIEhhbmRsZXMgdGhlIFR4RXhjIGV2ZW50LiAgQSBUcmFuc21pdCBFeGNlcHRpb24gZXZlbnQgaW5kaWNhdGVzCi0qIHRoYXQgdGhlIE1BQydzIFRYIHByb2Nlc3Mgd2FzIHVuc3VjY2Vzc2Z1bCAtIHNvIHRoZSBwYWNrZXQgZGlkCi0qIG5vdCBnZXQgdHJhbnNtaXR0ZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXRhc2tsZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJZmlkOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0JLyogQ29sbGVjdCB0aGUgc3RhdHVzIGFuZCBkaXNwbGF5ICovCi0JZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfVFhDT01QTEZJRCk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LCBIRkEzODR4X0JBUF9JTlQsIGZpZCwgMCwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCWZpZCwgc2l6ZW9mKHN0YXR1cyksIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlzdGF0dXMgPSBoZmEzODR4Mmhvc3RfMTYoc3RhdHVzKTsKLQlwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldiwgc3RhdHVzKTsKLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfdHgKLSoKLSogSGFuZGxlcyB0aGUgVHggZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXRhc2tsZXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfdHgod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlmaWQ7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCWludAkJCXJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0JZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfVFhDT01QTEZJRCk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9jb3B5X2Zyb21fYmFwKGh3LCBIRkEzODR4X0JBUF9JTlQsIGZpZCwgMCwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCWZpZCwgc2l6ZW9mKHN0YXR1cyksIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlzdGF0dXMgPSBoZmEzODR4Mmhvc3RfMTYoc3RhdHVzKTsKLQlwcmlzbTJzdGFfZXZfdHgod2xhbmRldiwgc3RhdHVzKTsKLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X3J4Ci0qCi0qIEhhbmRsZXMgdGhlIFJ4IGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJcnhmaWQ7Ci0JaGZhMzg0eF9yeF9mcmFtZV90CXJ4ZGVzYzsKLQlpbnQJCQlyZXN1bHQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgaGRybGVuOwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIGZjOwotCXA4MDIxMV9yeG1ldGFfdAkqcnhtZXRhOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpza2IgPSBOVUxMOwotCVVJTlQ4ICpkYXRhcDsKLQotCURCRkVOVEVSOwotCi0JLyogR2V0IHRoZSBGSUQgKi8KLQlyeGZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JYRklEKTsKLQkvKiBHZXQgdGhlIGRlc2NyaXB0b3IgKGluY2x1ZGluZyBoZWFkZXJzKSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywKLQkJCUhGQTM4NHhfQkFQX0lOVCwKLQkJCXJ4ZmlkLAotCQkJMCwKLQkJCSZyeGRlc2MsCi0JCQlzaXplb2YocnhkZXNjKSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsICVkLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCXJ4ZmlkLAotCQkJMCwKLQkJCXNpemVvZihyeGRlc2MpLAotCQkJcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIEJ5dGUgb3JkZXIgY29udmVydCBvbmNlIHVwIGZyb250LiAqLwotCXJ4ZGVzYy5zdGF0dXMgPQloZmEzODR4Mmhvc3RfMTYocnhkZXNjLnN0YXR1cyk7Ci0JcnhkZXNjLnRpbWUgPQloZmEzODR4Mmhvc3RfMzIocnhkZXNjLnRpbWUpOwotCi0JLyogZHJvcCBlcnJvcnMgYW5kIHdoYXRub3QgaW4gcHJvbWlzYyBtb2RlICovCi0JaWYgKCggd2xhbmRldi0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgJiYKLQkgICAgKEhGQTM4NHhfUlhTVEFUVVNfSVNGQ1NFUlIocnhkZXNjLnN0YXR1cykgfHwKLQkgICAgIEhGQTM4NHhfUlhTVEFUVVNfSVNVTkRFQ1IocnhkZXNjLnN0YXR1cykpKQotCSAgZ290byBkb25lOwotCi0JLyogTm93IGhhbmRsZSBmcmFtZSBiYXNlZCBvbiBwb3J0IyAqLwotCXN3aXRjaCggSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVChyeGRlc2Muc3RhdHVzKSApCi0JewotCWNhc2UgMDoKLQotCQlmYyA9IGllZWUyaG9zdDE2KHJ4ZGVzYy5mcmFtZV9jb250cm9sKTsKLQotCQkvKiBJZiBleGNsdWRlIGFuZCB3ZSByZWNlaXZlIGFuIHVuZW5jcnlwdGVkLCBkcm9wIGl0ICovCi0JCWlmICggKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkgJiYKLQkJICAgICAhV0xBTl9HRVRfRkNfSVNXRVAoZmMpKSB7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQloZHJsZW4gPSBwODAyMTFfaGVhZGVybGVuKGZjKTsKLQotCQkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyLCBub3RlIENSQyAoYWthIEZDUykuIHBiYWxsb2MgKi8KLQkJLyogYXNzdW1lcyB0aGVyZSBuZWVkcyB0byBiZSBzcGFjZSBmb3Igb25lICovCi0JCXNrYiA9IGRldl9hbGxvY19za2IoaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy5kYXRhX2xlbikgKyBoZHJsZW4gKyBXTEFOX0NSQ19MRU4gKyAyKTsgLyogYSBsaXR0bGUgZXh0cmEgKi8KLQotCQlpZiAoICEgc2tiICkgewotCQkJV0xBTl9MT0dfRVJST1IoImFsbG9jX3NrYiBmYWlsZWQuXG4iKTsKLQkJCWdvdG8gZG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0KLQkJc2tiLT5kZXYgPSB3bGFuZGV2LT5uZXRkZXY7Ci0KLQkJLyogdGhlb3JldGljYWxseSBhbGlnbiB0aGUgSVAgaGVhZGVyIG9uIGEgMzItYml0IHdvcmQuICovCi0JCWlmICggaGRybGVuID09IFdMQU5fSERSX0E0X0xFTiApCi0JCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCi0JCS8qIENvcHkgdGhlIDgwMi4xMSBoZHIgdG8gdGhlIGJ1ZmZlciAqLwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBXTEFOX0hEUl9BM19MRU4pOwotCQltZW1jcHkoZGF0YXAsICZyeGRlc2MuZnJhbWVfY29udHJvbCwgV0xBTl9IRFJfQTNfTEVOKTsKLQotCQkvKiBTbmFnIHRoZSBBNCBhZGRyZXNzIGlmIHByZXNlbnQgKi8KLQkJaWYgKGhkcmxlbiA9PSBXTEFOX0hEUl9BNF9MRU4pIHsKLQkJCWRhdGFwID0gc2tiX3B1dChza2IsIFdMQU5fQUREUl9MRU4pOwotCQkJbWVtY3B5KGRhdGFwLCAmcnhkZXNjLmFkZHJlc3M0LCBXTEFOX0hEUl9BM19MRU4pOwotCQl9Ci0KLQkJLyogd2UgY2FuIGNvbnZlcnQgdGhlIGRhdGFfbGVuIGFzIHdlIHBhc3NlZCB0aGUgb3JpZ2luYWwgb24gKi8KLQkJcnhkZXNjLmRhdGFfbGVuID0gaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy5kYXRhX2xlbik7Ci0KLQkJLyogQ29weSB0aGUgcGF5bG9hZCBkYXRhIHRvIHRoZSBidWZmZXIgKi8KLQkJaWYgKCByeGRlc2MuZGF0YV9sZW4gPiAwICkgewotCQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgcnhkZXNjLmRhdGFfbGVuKTsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywKLQkJCQlIRkEzODR4X0JBUF9JTlQsIHJ4ZmlkLCBIRkEzODR4X1JYX0RBVEFfT0ZGLAotCQkJCWRhdGFwLCByeGRlc2MuZGF0YV9sZW4pOwotCQkJaWYgKCByZXN1bHQgKSB7Ci0JCQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAlZCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQkJCXJ4ZmlkLAotCQkJCQlIRkEzODR4X1JYX0RBVEFfT0ZGLAotCQkJCQlyeGRlc2MuZGF0YV9sZW4sCi0JCQkJCXJlc3VsdCk7Ci0JCQkJZ290byBmYWlsZWQ7Ci0JCQl9Ci0JCX0KLQkJLyogdGhlIHByaXNtMiBjYXJkcyBkb24ndCByZXR1cm4gdGhlIEZDUyAqLwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBXTEFOX0NSQ19MRU4pOwotCQltZW1zZXQgKGRhdGFwLCAweGZmLCBXTEFOX0NSQ19MRU4pOwotCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCi0JCS8qIEF0dGFjaCB0aGUgcnhtZXRhLCBzZXQgc29tZSBzdHVmZiAqLwotCQlwODAyMTFza2JfcnhtZXRhX2F0dGFjaCh3bGFuZGV2LCBza2IpOwotCQlyeG1ldGEgPSBQODAyMTFTS0JfUlhNRVRBKHNrYik7Ci0JCXJ4bWV0YS0+bWFjdGltZSA9IHJ4ZGVzYy50aW1lOwotCQlyeG1ldGEtPnJ4cmF0ZSA9IHJ4ZGVzYy5yYXRlOwotCQlyeG1ldGEtPnNpZ25hbCA9IHJ4ZGVzYy5zaWduYWwgLSBody0+ZGJtYWRqdXN0OwotCQlyeG1ldGEtPm5vaXNlID0gcnhkZXNjLnNpbGVuY2UgLSBody0+ZGJtYWRqdXN0OwotCi0JCXByaXNtMnN0YV9ldl9yeCh3bGFuZGV2LCBza2IpOwotCQlnb3RvIGRvbmU7Ci0JY2FzZSA3OgotCi0gICAgICAgIAlpZiAoICEgSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUihyeGRlc2Muc3RhdHVzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldiwgcnhmaWQsICZyeGRlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygzLCJSZWNlaXZlZCBtb25pdG9yIGZyYW1lOiBGQ1NlcnIgc2V0XG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0JCWdvdG8gZG9uZTsKLQotCWRlZmF1bHQ6Ci0KLQkJV0xBTl9MT0dfV0FSTklORygiUmVjZWl2ZWQgZnJhbWUgb24gdW5zdXBwb3J0ZWQgcG9ydD0lZFxuIiwKLQkJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQocnhkZXNjLnN0YXR1cykgKTsKLQkJZ290byBkb25lOwotCX0KLQotIGZhaWxlZDoKLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9yeG1vbml0b3IKLSoKLSogSGVscGVyIGZ1bmN0aW9uIGZvciBpbnRfcnguICBIYW5kbGVzIG1vbml0b3IgZnJhbWVzLgotKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgc3BhY2UgZm9yIHRoZSBGQ1MgYW5kIHNldHMgaXQKLSogdG8gMHhmZmZmZmZmZi4gIFRoZSBoZmEzODR4IGRvZXNuJ3QgZ2l2ZSB1cyB0aGUgRkNTIHZhbHVlIGJ1dCB0aGUKLSogaGlnaGVyIGxheWVycyBleHBlY3QgaXQuICAweGZmZmZmZmZmIGlzIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlCi0qIHRoZSBGQ1MgaXMgYm9ndXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCXJ4ZmlkCQlyZWNlaXZlZCBGSUQKLSoJcnhkZXNjCQlyeCBkZXNjcmlwdG9yIHJlYWQgZnJvbSBjYXJkIGluIGludF9yeAotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJQWxsb2NhdGVzIGFuIHNrYiBhbmQgcGFzc2VzIGl0IHVwIHZpYSB0aGUgUEZfUEFDS0VUIGludGVyZmFjZS4KLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfcnhtb25pdG9yKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiByeGZpZCwKLQkJCQkgICBoZmEzODR4X3J4X2ZyYW1lX3QgKnJ4ZGVzYykKLXsKLQloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQJCQkJaGRybGVuID0gMDsKLQlVSU5UCQkJCWRhdGFsZW4gPSAwOwotCVVJTlQJCQkJc2tibGVuID0gMDsKLQlVSU5UCQkJCXRydW5jYXRlZCA9IDA7Ci0JVUlOVDgJCQkJKmRhdGFwOwotCVVJTlQxNgkJCQlmYzsKLQlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7Ci0KLQlEQkZFTlRFUjsKLQkvKiBEb24ndCBmb3JnZXQgdGhlIHN0YXR1cywgdGltZSwgYW5kIGRhdGFfbGVuIGZpZWxkcyBhcmUgaW4gaG9zdCBvcmRlciAqLwotCS8qIEZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgZnJhbWUgaXMgKi8KLQlmYyA9IGllZWUyaG9zdDE2KHJ4ZGVzYy0+ZnJhbWVfY29udHJvbCk7Ci0JaGRybGVuID0gcDgwMjExX2hlYWRlcmxlbihmYyk7Ci0JZGF0YWxlbiA9IGhmYTM4NHgyaG9zdF8xNihyeGRlc2MtPmRhdGFfbGVuKTsKLQotCS8qIEFsbG9jYXRlIGFuIGluZCBtZXNzYWdlK2ZyYW1lc2l6ZSBza2IgKi8KLQlza2JsZW4gPSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSArCi0JCWhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47Ci0KLQkvKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLwotCWlmICggc2tibGVuID4KLQkJKHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKLQkJV0xBTl9IRFJfQTRfTEVOICsgV0xBTl9EQVRBX01BWExFTiArIFdMQU5fQ1JDX0xFTikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsICJvdmVybGVuIGZybTogbGVuPSVkXG4iLAotCQkJc2tibGVuIC0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkpOwotCX0KLQotCWlmICggKHNrYiA9IGRldl9hbGxvY19za2Ioc2tibGVuKSkgPT0gTlVMTCApIHsKLQkJV0xBTl9MT0dfRVJST1IoImFsbG9jX3NrYiBmYWlsZWQgdHJ5aW5nIHRvIGFsbG9jYXRlICVkIGJ5dGVzXG4iLCBza2JsZW4pOwotCQlyZXR1cm47Ci0JfQotCi0JLyogb25seSBwcmVwZW5kIHRoZSBwcmlzbSBoZWFkZXIgaWYgaW4gdGhlIHJpZ2h0IG1vZGUgKi8KLQlpZiAoKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSAmJgotCSAgICAoaHctPnNuaWZmaGRyID09IDApKSB7Ci0JCXA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdAkqbXNnOwotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSk7Ci0JCW1zZyA9IChwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QqKSBkYXRhcDsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIG1lbWJlcnMgKi8KLQkJbXNnLT5tc2djb2RlID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKLQkJbXNnLT5tc2dsZW4gPSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KTsKLQkJc3RyY3B5KG1zZy0+ZGV2bmFtZSwgd2xhbmRldi0+bmFtZSk7Ci0KLQkJbXNnLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOwotCQltc2ctPmhvc3R0aW1lLnN0YXR1cyA9IDA7Ci0JCW1zZy0+aG9zdHRpbWUubGVuID0gNDsKLQkJbXNnLT5ob3N0dGltZS5kYXRhID0gamlmZmllczsKLQotCQltc2ctPm1hY3RpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lOwotCQltc2ctPm1hY3RpbWUuc3RhdHVzID0gMDsKLQkJbXNnLT5tYWN0aW1lLmxlbiA9IDQ7Ci0JCW1zZy0+bWFjdGltZS5kYXRhID0gcnhkZXNjLT50aW1lICogMTAwMDsKLQotCQltc2ctPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOwotCQltc2ctPmNoYW5uZWwuc3RhdHVzID0gMDsKLQkJbXNnLT5jaGFubmVsLmxlbiA9IDQ7Ci0JCW1zZy0+Y2hhbm5lbC5kYXRhID0gaHctPnNuaWZmX2NoYW5uZWw7Ci0KLQkJbXNnLT5yc3NpLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaTsKLQkJbXNnLT5yc3NpLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCW1zZy0+cnNzaS5sZW4gPSA0OwotCQltc2ctPnJzc2kuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zcS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxOwotCQltc2ctPnNxLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCW1zZy0+c3EubGVuID0gNDsKLQkJbXNnLT5zcS5kYXRhID0gMDsKLQotCQltc2ctPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKLQkJbXNnLT5zaWduYWwuc3RhdHVzID0gMDsKLQkJbXNnLT5zaWduYWwubGVuID0gNDsKLQkJbXNnLT5zaWduYWwuZGF0YSA9IHJ4ZGVzYy0+c2lnbmFsOwotCi0JCW1zZy0+bm9pc2UuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZTsKLQkJbXNnLT5ub2lzZS5zdGF0dXMgPSAwOwotCQltc2ctPm5vaXNlLmxlbiA9IDQ7Ci0JCW1zZy0+bm9pc2UuZGF0YSA9IHJ4ZGVzYy0+c2lsZW5jZTsKLQotCQltc2ctPnJhdGUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlOwotCQltc2ctPnJhdGUuc3RhdHVzID0gMDsKLQkJbXNnLT5yYXRlLmxlbiA9IDQ7Ci0JCW1zZy0+cmF0ZS5kYXRhID0gcnhkZXNjLT5yYXRlIC8gNTsgLyogc2V0IHRvIDgwMi4xMSB1bml0cyAqLwotCi0JCW1zZy0+aXN0eC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHg7Ci0JCW1zZy0+aXN0eC5zdGF0dXMgPSAwOwotCQltc2ctPmlzdHgubGVuID0gNDsKLQkJbXNnLT5pc3R4LmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCi0JCW1zZy0+ZnJtbGVuLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuOwotCQltc2ctPmZybWxlbi5zdGF0dXMgPSAwOwotCQltc2ctPmZybWxlbi5sZW4gPSA0OwotCQltc2ctPmZybWxlbi5kYXRhID0gaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKLQl9IGVsc2UgaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKLQkJICAgKGh3LT5zbmlmZmhkciAhPSAwKSkgewotCQlwODAyMTFfY2FwaGRyX3QJCSpjYXBoZHI7Ci0JCS8qIFRoZSBORVcgaGVhZGVyIGZvcm1hdCEgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwotCQljYXBoZHIgPSAocDgwMjExX2NhcGhkcl90KikgZGF0YXA7Ci0KLQkJY2FwaGRyLT52ZXJzaW9uID0JaHRvbmwoUDgwMjExQ0FQVFVSRV9WRVJTSU9OKTsKLQkJY2FwaGRyLT5sZW5ndGggPQlodG9ubChzaXplb2YocDgwMjExX2NhcGhkcl90KSk7Ci0JCWNhcGhkci0+bWFjdGltZSA9CV9fY3B1X3RvX2JlNjQocnhkZXNjLT50aW1lKTsKLQkJY2FwaGRyLT5ob3N0dGltZSA9CV9fY3B1X3RvX2JlNjQoamlmZmllcyk7Ci0JCWNhcGhkci0+cGh5dHlwZSA9CWh0b25sKDQpOyAvKiBkc3NfZG90MTFfYiAqLwotCQljYXBoZHItPmNoYW5uZWwgPQlodG9ubChody0+c25pZmZfY2hhbm5lbCk7Ci0JCWNhcGhkci0+ZGF0YXJhdGUgPQlodG9ubChyeGRlc2MtPnJhdGUpOwotCQljYXBoZHItPmFudGVubmEgPQlodG9ubCgwKTsgLyogdW5rbm93biAqLwotCQljYXBoZHItPnByaW9yaXR5ID0JaHRvbmwoMCk7IC8qIHVua25vd24gKi8KLQkJY2FwaGRyLT5zc2lfdHlwZSA9CWh0b25sKDMpOyAvKiByc3NpX3JhdyAqLwotCQljYXBoZHItPnNzaV9zaWduYWwgPQlodG9ubChyeGRlc2MtPnNpZ25hbCk7Ci0JCWNhcGhkci0+c3NpX25vaXNlID0JaHRvbmwocnhkZXNjLT5zaWxlbmNlKTsKLQkJY2FwaGRyLT5wcmVhbWJsZSA9CWh0b25sKDApOyAvKiB1bmtub3duICovCi0JCWNhcGhkci0+ZW5jb2RpbmcgPQlodG9ubCgxKTsgLyogY2NrICovCi0JfQotCS8qIENvcHkgdGhlIDgwMi4xMSBoZWFkZXIgdG8gdGhlIHNrYiAoY3RsIGZyYW1lcyBtYXkgYmUgbGVzcyB0aGFuIGEgZnVsbCBoZWFkZXIpICovCi0JZGF0YXAgPSBza2JfcHV0KHNrYiwgaGRybGVuKTsKLQltZW1jcHkoIGRhdGFwLCAmKHJ4ZGVzYy0+ZnJhbWVfY29udHJvbCksIGhkcmxlbik7Ci0KLQkvKiBJZiBhbnksIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgY2FyZCB0byB0aGUgc2tiICovCi0JaWYgKCBkYXRhbGVuID4gMCApCi0JewotCQkvKiBUcnVuY2F0ZSB0aGUgcGFja2V0IGlmIHRoZSB1c2VyIHdhbnRzIHVzIHRvICovCi0JCVVJTlQJZGF0YXJlYWQgPSBkYXRhbGVuOwotCQlpZihody0+c25pZmZfdHJ1bmNhdGUgPiAwICYmIGRhdGFyZWFkID4gaHctPnNuaWZmX3RydW5jYXRlKSB7Ci0JCQlkYXRhcmVhZCA9IGh3LT5zbmlmZl90cnVuY2F0ZTsKLQkJCXRydW5jYXRlZCA9IDE7Ci0JCX0KLQotCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBkYXRhcmVhZCk7Ci0JCWhmYTM4NHhfY29weV9mcm9tX2JhcChodywKLQkJCUhGQTM4NHhfQkFQX0lOVCwgcnhmaWQsIEhGQTM4NHhfUlhfREFUQV9PRkYsCi0JCQlkYXRhcCwgZGF0YXJlYWQpOwotCi0JCS8qIGNoZWNrIGZvciB1bmVuY3J5cHRlZCBzdHVmZiBpZiBXRVAgYml0IHNldC4gKi8KLQkJaWYgKCooZGF0YXAgLSBoZHJsZW4gKyAxKSAmIDB4NDApIC8vIHdlcCBzZXQKLQkJICBpZiAoKCooZGF0YXApID09IDB4YWEpICYmICgqKGRhdGFwKzEpID09IDB4YWEpKQotCQkgICAgKihkYXRhcCAtIGhkcmxlbiArIDEpICY9IDB4YmY7IC8vIGNsZWFyIHdlcDsgaXQncyB0aGUgODAyLjIgaGVhZGVyIQotCX0KLQotCWlmICghdHJ1bmNhdGVkICYmIGh3LT5zbmlmZl9mY3MpIHsKLQkJLyogU2V0IHRoZSBGQ1MgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9DUkNfTEVOKTsKLQkJbWVtc2V0KCBkYXRhcCwgMHhmZiwgV0xBTl9DUkNfTEVOKTsKLQl9Ci0KLQkvKiBwYXNzIGl0IGJhY2sgdXAgKi8KLQlwcmlzbTJzdGFfZXZfcngod2xhbmRldiwgc2tiKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfYWxsb2MKLSoKLSogSGFuZGxlcyB0aGUgQWxsb2MgZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCWZpZDsKLQlJTlQxNgkJCXJlc3VsdDsKLQotCURCRkVOVEVSOwotCi0JLyogSGFuZGxlIHRoZSByZWNsYWltZWQgRklEICovCi0JLyogICBjb2xsZWN0IHRoZSBGSUQgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sgKi8KLQlmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9BTExPQ0ZJRCk7Ci0KLQlpZiAoIGZpZCAhPSBody0+aW5mb2ZpZCApIHsgLyogSXQncyBhIHRyYW5zbWl0IGZpZCAqLwotCQlXTEFOX0xPR19ERUJVRyg1LCAiaW50X2FsbG9jKCUjeClcbiIsIGZpZCk7Ci0JCXJlc3VsdCA9IHR4ZmlkX3F1ZXVlX2FkZChodywgZmlkKTsKLQkJaWYgKHJlc3VsdCAhPSAtMSkgewotCQkJcHJpc20yc3RhX2V2X2FsbG9jKHdsYW5kZXYpOwotCQkJV0xBTl9MT0dfREVCVUcoNSwgInFfYWRkLlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlXTEFOX0xPR19ERUJVRyg1LCAicV9mdWxsLlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiB1bmxvY2sgdGhlIGluZm8gZmlkICovCi0JCXVwKCZody0+aW5mb2ZpZF9zZW0pOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfaGFuZG92ZXIKLSoKLSogU2VuZHMgYSBoYW5kb3ZlciBub3RpZmljYXRpb24gdG8gdGhlIE1BQy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglhZGRyCQlhZGRyZXNzIG9mIHN0YXRpb24gdGhhdCdzIGxlZnQKLSoKLSogUmV0dXJuczoKLSoJemVybwkJc3VjY2Vzcy4KLSoJLUVSRVNUQVJUU1lTCXJlY2VpdmVkIHNpZ25hbCB3aGlsZSB3YWl0aW5nIGZvciBzZW1hcGhvcmUuCi0qCS1FSU8JCWZhaWxlZCB0byB3cml0ZSB0byBiYXAsIG9yIGZhaWxlZCBpbiBjbWQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCwgTk9URTogdGhpcyBjYWxsIG1heSBibG9jayBvbiBhIHNlbWFwaG9yZSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9oYW5kb3ZlciggaGZhMzg0eF90ICpodywgVUlOVDggKmFkZHIpCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLSAgICAgICAgaGZhMzg0eF9IYW5kb3ZlckFkZHJfdCAgcmVjOwotICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgICAgIERCRkVOVEVSOwotCi0JLyogQWNxdWlyZSB0aGUgaW5mb2ZpZCAqLwotCWlmICggZG93bl9pbnRlcnJ1cHRpYmxlKCZody0+aW5mb2ZpZF9zZW0pICkgewotCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotICAgICAgICAvKiBTZXQgdXAgdGhlIHJlY29yZCAqLwotICAgICAgICBsZW4gPSBzaXplb2YoaGZhMzg0eF9IYW5kb3ZlckFkZHJfdCk7Ci0gICAgICAgIHJlYy5mcmFtZWxlbiA9IGhvc3QyaGZhMzg0eF8xNihsZW4vMiAtIDEpOwotICAgICAgICByZWMuaW5mb3R5cGUgPSBob3N0MmhmYTM4NHhfMTYoSEZBMzg0eF9JVF9IQU5ET1ZFUkFERFIpOwotICAgICAgICBtZW1jcHkocmVjLmhhbmRvdmVyX2FkZHIsIGFkZHIsIHNpemVvZihyZWMuaGFuZG92ZXJfYWRkcikpOwotCi0gICAgICAgIC8qIElzc3VlIHRoZSBjb21tYW5kICovCi0gICAgICAgIHJlc3VsdCA9IGhmYTM4NHhfY21kX25vdGlmeShodywgMSwgaHctPmluZm9maWQsICZyZWMsIGxlbik7Ci0KLSAgICAgICAgaWYgKCByZXN1bHQgIT0gMCApIHsKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJjbWRfbm90aWZ5KCUwNHgpIGZhaWxlZCwgcmVzdWx0PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pbmZvZmlkLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0KLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgaGZhMzg0eF90eF90aW1lb3V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX1dBUk5JTkcoIkltcGxlbWVudCBtZS5cbiIpOwotCi0JREJGRVhJVDsKLX0KLQotLyogSGFuZGxlcyBhbGwgInJ4IiBCQVAgb3BlcmF0aW9ucyAqLwotc3RhdGljIHZvaWQgICAgIGhmYTM4NHhfYmFwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopIGRhdGE7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gaHctPndsYW5kZXY7Ci0JaW50IGNvdW50ZXIgPSBwcmlzbTJfaXJxX2V2cmVhZF9tYXg7Ci0JaW50CQkJcmVnOwotCi0JREJGRU5URVI7Ci0KLQl3aGlsZSAoY291bnRlci0tID4gMCkgewotCQkvKiBHZXQgaW50ZXJydXB0IHJlZ2lzdGVyICovCi0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0KLQkJaWYgKChyZWcgPT0gMHhmZmZmKSB8fAotCQkgICAgIShyZWcgJiBIRkEzODR4X0lOVF9CQVBfT1ApKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNJTkZPKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2luZm8od2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19JTkZPX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTVFhFWEMocmVnKSApewotCQkJaGZhMzg0eF9pbnRfdHhleGMod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19UWEVYQ19TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU1RYKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X3R4KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfVFhfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNSWChyZWcpICl7Ci0JCQloZmEzODR4X2ludF9yeCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX1JYX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCX0KLQotCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCi0JaGZhMzg0eF9ldmVudHNfYWxsKGh3KTsKLQotCURCRkVYSVQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKaW5kZXggMGRmYjhjZS4uOWI3NDY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaApAQCAtNjMsMTggKzYzLDE4IEBACiAKIC8qLS0tLS0tIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLSBNaW5zICYgTWF4cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUlOCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUFYCSgoVUlOVDE2KTI0MDApCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9EQVRBTEVOX01BWAkJKChVSU5UMTYpNDA5NikKLSNkZWZpbmUJCUhGQTM4NHhfQkFQX09GRlNFVF9NQVgJCSgoVUlOVDE2KTQwOTYpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRJRF9NQVgJCSgoVUlOVDE2KTcpCi0jZGVmaW5lCQlIRkEzODR4X05VTVBPUlRTX01BWAkJKChVSU5UMTYpKEhGQTM4NHhfUE9SVElEX01BWCsxKSkKLSNkZWZpbmUJCUhGQTM4NHhfUERSX0xFTl9NQVgJCSgoVUlOVDE2KTUxMikJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUERBX1JFQ1NfTUFYCQkoKFVJTlQxNikyMDApCS8qIGEgZ3Vlc3MgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUERBX0xFTl9NQVgJCSgoVUlOVDE2KTEwMjQpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCi0jZGVmaW5lCQlIRkEzODR4X1NDQU5SRVNVTFRfTUFYCQkoKFVJTlQxNikzMSkKLSNkZWZpbmUJCUhGQTM4NHhfSFNDQU5SRVNVTFRfTUFYCQkoKFVJTlQxNikzMSkKLSNkZWZpbmUJCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWAkoKFVJTlQxNikxNikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NSU4JKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NQVgJKCh1MTYpMjQwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYCQkoKHUxNik0MDk2KQorI2RlZmluZQkJSEZBMzg0eF9CQVBfT0ZGU0VUX01BWAkJKCh1MTYpNDA5NikKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVElEX01BWAkJKCh1MTYpNykKKyNkZWZpbmUJCUhGQTM4NHhfTlVNUE9SVFNfTUFYCQkoKHUxNikoSEZBMzg0eF9QT1JUSURfTUFYKzEpKQorI2RlZmluZQkJSEZBMzg0eF9QRFJfTEVOX01BWAkJKCh1MTYpNTEyKQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEZBMzg0eF9QREFfUkVDU19NQVgJCSgodTE2KTIwMCkJLyogYSBndWVzcyAqLworI2RlZmluZQkJSEZBMzg0eF9QREFfTEVOX01BWAkJKCh1MTYpMTAyNCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhGQTM4NHhfU0NBTlJFU1VMVF9NQVgJCSgodTE2KTMxKQorI2RlZmluZQkJSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVgJCSgodTE2KTMxKQorI2RlZmluZQkJSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYCSgodTE2KTE2KQogI2RlZmluZQkJSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWAkoMTApCiAjZGVmaW5lCQlIRkEzODR4X0RSVlJfVFhCVUZfTUFYCQkoc2l6ZW9mKGhmYTM4NHhfdHhfZnJhbWVfdCkgKyBcCiAJCQkJCQlXTEFOX0RBVEFfTUFYTEVOIC0gXApAQCAtODgsNDIgKzg4LDQyIEBACiAjZGVmaW5lCQlIRkEzODR4X1VTQl9SV01FTV9NQVhMRU4JMjA0OAogCiAvKi0tLSBTdXBwb3J0IENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9QUk9DCQkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfQkFQX0lOVAkJCQkoKFVJTlQxNikxKQotI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9JQlNTCQkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfQlNTCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfV0RTCQkJKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfUFNVRURPSUJTUwkJKChVSU5UMTYpMykKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfSE9TVEFQICAgIAkJKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfUFJJVklOVk9LRUQJCSgoVUlOVDE2KUJJVDApCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0VYQ0xVREUJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfVFhDUllQVAkoKFVJTlQxNilCSVQ0KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1JYQ1JZUFQJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUxMT1dfTUlYRUQgCSgoVUlOVDE2KUJJVDExKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDEJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX0lOVEVSVkFMMTAJCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX0lOVEVSVkFMNTAJCSgoVUlOVDE2KUJJVDYpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX0lOVEVSVkFMMTAwCQkoKFVJTlQxNikoQklUNSB8IEJJVDYpKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19GSVJNV0FSRV9XUEEgIAkJKChVSU5UMTYpQklUOCkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSE9TVF9NSUMgICAgICAJCSgoVUlOVDE2KUJJVDkpCi0jZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0ZXU0NBTl9GV1JPQU0JCSgoVUlOVDE2KTEpCi0jZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0ZXU0NBTl9IT1NUUk9BTQkoKFVJTlQxNikyKQotI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9IT1NUU0NBTl9IT1NUUk9BTQkoKFVJTlQxNikzKQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0RJU0FCTEVECQkoKFVJTlQxNikxKQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0lOSVRTUkNICQkoKFVJTlQxNikyKQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fSUJTUwkJKChVSU5UMTYpMykKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX0VTUwkJKChVSU5UMTYpNCkKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19PT1JfRVNTCQkoKFVJTlQxNik1KQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fV0RTCQkoKFVJTlQxNik2KQotI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0hPU1RBUAkJKChVSU5UMTYpOCkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8yCQkJKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF81ZG90NQkJCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMTEJCQkoKFVJTlQxNik4KQorI2RlZmluZQkJSEZBMzg0eF9CQVBfUFJPQwkJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X0JBUF9pbnQJCQkJKCh1MTYpMSkKKyNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfSUJTUwkJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0JTUwkJCSgodTE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1dEUwkJCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1BTVUVET0lCU1MJCSgodTE2KTMpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0hPU1RBUCAgICAJCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX1BSSVZJTlZPS0VECQkoKHUxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19FWENMVURFCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1RYQ1JZUFQJKCh1MTYpQklUNCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9SWENSWVBUCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FMTE9XX01JWEVEIAkoKHUxNilCSVQxMSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUwxCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9pbnRFUlZBTDEwCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9pbnRFUlZBTDUwCQkoKHUxNilCSVQ2KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9pbnRFUlZBTDEwMAkJKCh1MTYpKEJJVDUgfCBCSVQ2KSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRklSTVdBUkVfV1BBICAJCSgodTE2KUJJVDgpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0hPU1RfTUlDICAgICAgCQkoKHUxNilCSVQ5KQorI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fRldST0FNCQkoKHUxNikxKQorI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fSE9TVFJPQU0JKCh1MTYpMikKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0JKCh1MTYpMykKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19ESVNBQkxFRAkJKCh1MTYpMSkKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19JTklUU1JDSAkJKCh1MTYpMikKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX0lCU1MJCSgodTE2KTMpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9FU1MJCSgodTE2KTQpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfT09SX0VTUwkJKCh1MTYpNSkKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX1dEUwkJKCh1MTYpNikKKyNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19IT1NUQVAJCSgodTE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgodTE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKCh1MTYpOCkKIAogLyotLS0gSnVzdCBzb21lIHN5bWJvbGljIG5hbWVzIGZvciBsZWdpYmlsaXR5IC0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9UWENNRF9OT1JFQ0wJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1RYQ01EX1JFQ0wJCSgoVUlOVDE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1RYQ01EX05PUkVDTAkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfVFhDTURfUkVDTAkJKCh1MTYpMSkKIAogLyotLS0gTUFDIEludGVybmFsIG1lbW9yeSBjb25zdGFudHMgYW5kIG1hY3JvcyAtLS0tLS0qLwogLyogbWFza3MgYW5kIG1hY3JvcyB1c2VkIHRvIG1hbmlwdWxhdGUgTUFDIGludGVybmFsIG1lbW9yeSBhZGRyZXNzZXMuICovCkBAIC0xNDAsNyArMTQwLDcgQEAKICAqLwogCiAvKiBIYW5keSBjb25zdGFudCAqLwotI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYCSgoVUlOVDE2KTB4MDA3ZikKKyNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWAkoKHUxNikweDAwN2YpCiAKIC8qIE1hc2sgYml0cyBmb3IgZGlzY2FyZGluZyB1bndhbnRlZCBwaWVjZXMgaW4gYSBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9GTEFUX0FVWF9QQUdFX01BU0sJKDB4MDA3ZmZmODApCkBAIC0xNTgsMjUgKzE1OCwyNSBAQAogCiAvKiBNYWtlIGEgMzItYml0IGZsYXQgYWRkcmVzcyBmcm9tIEFVWCBmb3JtYXQgMTYtYml0IHBhZ2UgYW5kIG9mZnNldCAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS0ZMQVQocCxvKQlcCi0JCSgoKFVJTlQzMikoKChVSU5UMTYpKHApKSZIRkEzODR4X0FERFJfQVVYX1BBR0VfTUFTSykpIDw8NykgfCBcCi0JCSgoVUlOVDMyKSgoKFVJTlQxNikobykpJkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spKQorCQkoKCh1MzIpKCgodTE2KShwKSkmSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PDcpIHwgXAorCQkoKHUzMikoKCh1MTYpKG8pKSZIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSkKIAogLyogTWFrZSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgZnJvbSBDTUQgZm9ybWF0IDE2LWJpdCBwYWdlIGFuZCBvZmZzZXQgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtGTEFUKHAsbykJXAotCQkoKChVSU5UMzIpKCgoVUlOVDE2KShwKSkmSEZBMzg0eF9BRERSX0NNRF9QQUdFX01BU0spKSA8PDE2KSB8IFwKLQkJKChVSU5UMzIpKCgoVUlOVDE2KShvKSkmSEZBMzg0eF9BRERSX0NNRF9PRkZfTUFTSykpCisJCSgoKHUzMikoKCh1MTYpKHApKSZIRkEzODR4X0FERFJfQ01EX1BBR0VfTUFTSykpIDw8MTYpIHwgXAorCQkoKHUzMikoKCh1MTYpKG8pKSZIRkEzODR4X0FERFJfQ01EX09GRl9NQVNLKSkKIAogLyogTWFrZSBBVVggZm9ybWF0IG9mZnNldCBhbmQgcGFnZSBmcm9tIGEgMzItYml0IGZsYXQgYWRkcmVzcyAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS1BBR0UoZikgXAotCQkoKFVJTlQxNikoKCgoVUlOVDMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQVVYX1BBR0VfTUFTSyk+PjcpKQorCQkoKHUxNikoKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQVVYX1BBR0VfTUFTSyk+PjcpKQogI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS09GRihmKSBcCi0JCSgoVUlOVDE2KSgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9PRkZfTUFTSykpCisJCSgodTE2KSgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9PRkZfTUFTSykpCiAKIC8qIE1ha2UgQ01EIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGYpIFwKLQkJKChVSU5UMTYpKCgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spPj4xNikpCisJCSgodTE2KSgoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfUEFHRV9NQVNLKT4+MTYpKQogI2RlZmluZQkJSEZBMzg0eF9BRERSX0NNRF9NS09GRihmKSBcCi0JCSgoVUlOVDE2KSgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9PRkZfTUFTSykpCisJCSgodTE2KSgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9PRkZfTUFTSykpCiAKIC8qLS0tIEF1eCByZWdpc3RlciBtYXNrcy90ZXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFNvbWUgb2YgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIEFVWCBvZmZzZXQgcmVnaXN0ZXIgYXJlIHVzZWQgdG8gKi8KQEAgLTE4OCw3ICsxODgsNyBAQAogCiAvKiBNYWtlIEFVWCByZWdpc3RlciBvZmZzZXQgYW5kIHBhZ2UgdmFsdWVzIGZyb20gYSBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQVVYX01LT0ZGKGYsIGMpIFwKLQkoSEZBMzg0eF9BRERSX0FVWF9NS09GRihmKSB8ICgoKFVJTlQxNikoYykpPDwxMikpCisJKEhGQTM4NHhfQUREUl9BVVhfTUtPRkYoZikgfCAoKCh1MTYpKGMpKTw8MTIpKQogI2RlZmluZQkJSEZBMzg0eF9BVVhfTUtQQUdFKGYpCUhGQTM4NHhfQUREUl9BVVhfTUtQQUdFKGYpCiAKIApAQCAtMjA1LDQwICsyMDUsNiBAQAogI2RlZmluZQkJSEZBMzg0eF9ETFNUQVRFX0ZMQVNIV1JJVEVQRU5ESU5HCTQKICNkZWZpbmUJCUhGQTM4NHhfRExTVEFURV9HRU5FU0lTIAkJNQogCi0vKi0tLSBSZWdpc3RlciBJL08gb2Zmc2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQotI2RlZmluZQkJSEZBMzg0eF9DTURfT0ZGCQkJKDB4MDApCi0jZGVmaW5lCQlIRkEzODR4X1BBUkFNMF9PRkYJCSgweDAyKQotI2RlZmluZQkJSEZBMzg0eF9QQVJBTTFfT0ZGCQkoMHgwNCkKLSNkZWZpbmUJCUhGQTM4NHhfUEFSQU0yX09GRgkJKDB4MDYpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19PRkYJCSgweDA4KQotI2RlZmluZQkJSEZBMzg0eF9SRVNQMF9PRkYJCSgweDBBKQotI2RlZmluZQkJSEZBMzg0eF9SRVNQMV9PRkYJCSgweDBDKQotI2RlZmluZQkJSEZBMzg0eF9SRVNQMl9PRkYJCSgweDBFKQotI2RlZmluZQkJSEZBMzg0eF9JTkZPRklEX09GRgkJKDB4MTApCi0jZGVmaW5lCQlIRkEzODR4X1JYRklEX09GRgkJKDB4MjApCi0jZGVmaW5lCQlIRkEzODR4X0FMTE9DRklEX09GRgkJKDB4MjIpCi0jZGVmaW5lCQlIRkEzODR4X1RYQ09NUExGSURfT0ZGCQkoMHgyNCkKLSNkZWZpbmUJCUhGQTM4NHhfU0VMRUNUMF9PRkYJCSgweDE4KQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQwX09GRgkJKDB4MUMpCi0jZGVmaW5lCQlIRkEzODR4X0RBVEEwX09GRgkJKDB4MzYpCi0jZGVmaW5lCQlIRkEzODR4X1NFTEVDVDFfT0ZGCQkoMHgxQSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMV9PRkYJCSgweDFFKQotI2RlZmluZQkJSEZBMzg0eF9EQVRBMV9PRkYJCSgweDM4KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfT0ZGCQkoMHgzMCkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fT0ZGCQkoMHgzMikKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfT0ZGCQkoMHgzNCkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9PRkYJCSgweDE0KQotI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgkJKDB4MjgpCi0jZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDFfT0ZGCQkoMHgyQSkKLSNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMl9PRkYJCSgweDJDKQotI2RlZmluZQkJSEZBMzg0eF9BVVhQQUdFX09GRgkJKDB4M0EpCi0jZGVmaW5lCQlIRkEzODR4X0FVWE9GRlNFVF9PRkYJCSgweDNDKQotI2RlZmluZQkJSEZBMzg0eF9BVVhEQVRBX09GRgkJKDB4M0UpCi0KLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSB8fCBXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKLQogI2RlZmluZQkJSEZBMzg0eF9DTURfT0ZGCQkJKDB4MDApCiAjZGVmaW5lCQlIRkEzODR4X1BBUkFNMF9PRkYJCSgweDA0KQogI2RlZmluZQkJSEZBMzg0eF9QQVJBTTFfT0ZGCQkoMHgwOCkKQEAgLTI1OCw3ICsyMjQsNyBAQAogI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQxX09GRgkJKDB4M2MpCiAjZGVmaW5lCQlIRkEzODR4X0RBVEExX09GRgkJKDB4NzApCiAjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9PRkYJCSgweDYwKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9PRkYJCSgweDY0KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9PRkYJCSgweDY0KQogI2RlZmluZQkJSEZBMzg0eF9FVkFDS19PRkYJCSgweDY4KQogI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX09GRgkJKDB4MjgpCiAjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDBfT0ZGCQkoMHg1MCkKQEAgLTI3OSw5NCArMjQ1LDkyIEBACiAjZGVmaW5lCQlIRkEzODR4X1BDSV9NMV9MRU5fT0ZGCQkoMHhhOCkKICNkZWZpbmUJCUhGQTM4NHhfUENJX00xX0NUTF9PRkYJCSgweGFjKQogCi0jZW5kaWYKLQogLyotLS0gUmVnaXN0ZXIgRmllbGQgTWFza3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURfQlVTWQkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GTwkJKChVSU5UMTYpKEJJVDE0IHwgQklUMTMgfCBCSVQxMiB8IEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUCQkoKFVJTlQxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMCQkoKFVJTlQxNilCSVQ4KQotI2RlZmluZQkJSEZBMzg0eF9DTURfV1JJVEUJCSgoVUlOVDE2KUJJVDgpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERQkJKChVSU5UMTYpKEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREUJCSgoVUlOVDE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQlVTWQkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GTwkJKCh1MTYpKEJJVDE0IHwgQklUMTMgfCBCSVQxMiB8IEJJVDExIHwgQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUCQkoKHUxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMCQkoKHUxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9DTURfV1JJVEUJCSgodTE2KUJJVDgpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9QUk9HTU9ERQkJKCh1MTYpKEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREUJCSgodTE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQogCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFQJCSgoVUlOVDE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERQkJKChVSU5UMTYpKEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxIHwgQklUMCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFQJCSgodTE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERQkJKCh1MTYpKEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxIHwgQklUMCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0JVU1kJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfRVJSCQkoKFVJTlQxNilCSVQxNCkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYJCSgoVUlOVDE2KShCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDggfCBCSVQ3IHwgQklUNiB8IEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0JVU1kJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfRVJSCQkoKHUxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYJCSgodTE2KShCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDggfCBCSVQ3IHwgQklUNiB8IEJJVDUgfCBCSVQ0IHwgQklUMyB8IEJJVDIgfCBCSVQxKSkKIAotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVElDSwkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9XVEVSUgkJKChVSU5UMTYpQklUMTQpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORk8JCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9EVElNCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQ01ECQkoKFVJTlQxNilCSVQ0KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQUxMT0MJCSgoVUlOVDE2KUJJVDMpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWEVYQwkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfUlgJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9USUNLCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1dURVJSCQkoKHUxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORkRST1AJCSgodTE2KUJJVDEzKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GTwkJKCh1MTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0RUSU0JCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9DTUQJCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9BTExPQwkJKCh1MTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYRVhDCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFgJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9SWAkJKCh1MTYpQklUMCkKIAotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfSU5UX0JBUF9PUCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEMpCisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9pbnRfQkFQX09QICAgICAgICAgICAoSEZBMzg0eF9FVlNUQVRfSU5GT3xIRkEzODR4X0VWU1RBVF9SWHxIRkEzODR4X0VWU1RBVF9UWHxIRkEzODR4X0VWU1RBVF9UWEVYQykKIAotI2RlZmluZSAgICAgICAgIEhGQTM4NHhfSU5UX05PUk1BTCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEN8SEZBMzg0eF9FVlNUQVRfSU5GRFJPUHxIRkEzODR4X0VWU1RBVF9BTExPQ3xIRkEzODR4X0VWU1RBVF9EVElNKQorI2RlZmluZSAgICAgICAgIEhGQTM4NHhfaW50X05PUk1BTCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEN8SEZBMzg0eF9FVlNUQVRfSU5GRFJPUHxIRkEzODR4X0VWU1RBVF9BTExPQ3xIRkEzODR4X0VWU1RBVF9EVElNKQogCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RJQ0sJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9XVEVSUgkJKChVSU5UMTYpQklUMTQpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lORkRST1AJCSgoVUlOVDE2KUJJVDEzKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZPCQkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9EVElNCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9DTUQJCSgoVUlOVDE2KUJJVDQpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0FMTE9DCQkoKFVJTlQxNilCSVQzKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9UWEVYQwkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFgJCSgoVUlOVDE2KUJJVDEpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1JYCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9USUNLCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fV1RFUlIJCSgodTE2KUJJVDE0KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JTkZEUk9QCQkoKHUxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GTwkJKCh1MTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fRFRJTQkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQ01ECQkoKHUxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9BTExPQwkJKCh1MTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVFhFWEMJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9SWAkJKCh1MTYpQklUMCkKIAotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19USUNLCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GTwkJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQ01ECQkoKFVJTlQxNilCSVQ0KQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19BTExPQwkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhFWEMJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19SWAkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDSwkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSCQkoKHUxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GRFJPUAkJKCh1MTYpQklUMTMpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORk8JCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU0JCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0NNRAkJKCh1MTYpQklUNCkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQUxMT0MJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYRVhDCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWAkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfUlgJCSgodTE2KUJJVDApCiAKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTgkJKChVSU5UMTYpKEJJVDE1IHwgQklUMTQpKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOCQkoKHUxNikoQklUMTUgfCBCSVQxNCkpCiAKIAogLyotLS0gQ29tbWFuZCBDb2RlIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLSBDb250cm9sbGVyIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTklUCQkoKFVJTlQxNikweDAwKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0VOQUJMRQkJKChVSU5UMTYpMHgwMSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFCQkoKFVJTlQxNikweDAyKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJQUcJCSgoVUlOVDE2KTB4MDMpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfSU5JVAkJKCh1MTYpMHgwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9FTkFCTEUJCSgodTE2KTB4MDEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElTQUJMRQkJKCh1MTYpMHgwMikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESUFHCQkoKHUxNikweDAzKQogCiAvKi0tLSBCdWZmZXIgTWdtdCBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQUxMT0MJCSgoVUlOVDE2KTB4MEEpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfVFgJCSgoVUlOVDE2KTB4MEIpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQ0xSUFJTVAkJKChVSU5UMTYpMHgxMikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BTExPQwkJKCh1MTYpMHgwQSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9UWAkJKCh1MTYpMHgwQikKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9DTFJQUlNUCQkoKHUxNikweDEyKQogCiAvKi0tLSBSZWd1bGF0ZSBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfTk9USUZZCQkoKFVJTlQxNikweDEwKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOUQkJKChVSU5UMTYpMHgxMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9OT1RJRlkJCSgodTE2KTB4MTApCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfSU5RCQkoKHUxNikweDExKQogCiAvKi0tLSBDb25maWd1cmUgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FDQ0VTUwkJKChVSU5UMTYpMHgyMSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ET1dOTEQJCSgoVUlOVDE2KTB4MjIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQUNDRVNTCQkoKHUxNikweDIxKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RPV05MRAkJKCh1MTYpMHgyMikKIAogLyotLS0gRGVidWdnaW5nIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgCUhGQTM4NHhfQ01EQ09ERV9NT05JVE9SCQkoKFVJTlQxNikoMHgzOCkpCi0jZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRU5BQkxFCQkoKFVJTlQxNikoMHgwYikpCi0jZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRElTQUJMRQkJKChVSU5UMTYpKDB4MGYpKQorI2RlZmluZSAJSEZBMzg0eF9DTURDT0RFX01PTklUT1IJCSgodTE2KSgweDM4KSkKKyNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9FTkFCTEUJCSgodTE2KSgweDBiKSkKKyNkZWZpbmUJCUhGQTM4NHhfTU9OSVRPUl9ESVNBQkxFCQkoKHUxNikoMHgwZikpCiAKIC8qLS0tIFJlc3VsdCBDb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1NVQ0NFU1MJCQkoKFVJTlQxNikoMHgwMCkpCi0jZGVmaW5lCQlIRkEzODR4X0NBUkRfRkFJTAkJKChVSU5UMTYpKDB4MDEpKQotI2RlZmluZQkJSEZBMzg0eF9OT19CVUZGCQkJKChVSU5UMTYpKDB4MDUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfRVJSCQkJKChVSU5UMTYpKDB4N0YpKQorI2RlZmluZQkJSEZBMzg0eF9TVUNDRVNTCQkJKCh1MTYpKDB4MDApKQorI2RlZmluZQkJSEZBMzg0eF9DQVJEX0ZBSUwJCSgodTE2KSgweDAxKSkKKyNkZWZpbmUJCUhGQTM4NHhfTk9fQlVGRgkJCSgodTE2KSgweDA1KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0VSUgkJCSgodTE2KSgweDdGKSkKIAogLyotLS0gUHJvZ3JhbW1pbmcgTW9kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlNT0RFIDA6IERpc2FibGUgcHJvZ3JhbW1pbmcKQEAgLTM3NCw0OCArMzM4LDQ4IEBACiAJTU9ERSAyOiBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZwogCU1PREUgMzogUHJvZ3JhbSBub24tdm9sYXRpbGUgbWVtb3J5IHNlY3Rpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfRElTQUJMRQkoKFVJTlQxNikweDAwKQotI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9SQU0JCSgoVUlOVDE2KTB4MDEpCi0jZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WCQkoKFVJTlQxNikweDAyKQotI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVldSSVRFCSgoVUlOVDE2KTB4MDMpCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUJKCh1MTYpMHgwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfUkFNCQkoKHUxNikweDAxKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVgkJKCh1MTYpMHgwMikKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlZXUklURQkoKHUxNikweDAzKQogCiAvKi0tLSBBVVggcmVnaXN0ZXIgZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQVVYUFcwCQkJKChVSU5UMTYpMHhmZTAxKQotI2RlZmluZQkJSEZBMzg0eF9BVVhQVzEJCQkoKFVJTlQxNikweGRjMjMpCi0jZGVmaW5lCQlIRkEzODR4X0FVWFBXMgkJCSgoVUlOVDE2KTB4YmE0NSkKKyNkZWZpbmUJCUhGQTM4NHhfQVVYUFcwCQkJKCh1MTYpMHhmZTAxKQorI2RlZmluZQkJSEZBMzg0eF9BVVhQVzEJCQkoKHUxNikweGRjMjMpCisjZGVmaW5lCQlIRkEzODR4X0FVWFBXMgkJCSgodTE2KTB4YmE0NSkKIAotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVECSgoVUlOVDE2KTB4MDAwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNFTkFCTEVECSgoVUlOVDE2KTB4YzAwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9FTkFCTEUJKChVSU5UMTYpMHg4MDAwKQotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9ET0RJU0FCTEUJKChVSU5UMTYpMHg0MDAwKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVECSgodTE2KTB4MDAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNFTkFCTEVECSgodTE2KTB4YzAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9FTkFCTEUJKCh1MTYpMHg4MDAwKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWF9ET0RJU0FCTEUJKCh1MTYpMHg0MDAwKQogCiAvKi0tLSBSZWNvcmQgSUQgQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUJCSgoVUlOVDE2KTB4RkMwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIJKChVSU5UMTYpMHhGQzAxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQJKChVSU5UMTYpMHhGQzAyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTAkoKFVJTlQxNikweEZDMDMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lECQkoKFVJTlQxNikweEZDMDQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOCSgoVUlOVDE2KTB4RkMwNSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNZU1NDQUxFCQkoKFVJTlQxNikweEZDMDYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOCSgoVUlOVDE2KTB4RkMwNykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIJCSgoVUlOVDE2KTB4RkMwOCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRAkoKFVJTlQxNikweEZDMDkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVQUwkJKChVSU5UMTYpMHhGQzBBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlgJKChVSU5UMTYpMHhGQzBCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVIJKChVSU5UMTYpMHhGQzBDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSCSgoVUlOVDE2KTB4RkMwRCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUUJCSgoVUlOVDE2KTB4RkMwRSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIJKChVSU5UMTYpMHhGQzEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjEJCSgoVUlOVDE2KTB4RkMxMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIyCQkoKFVJTlQxNikweEZDMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMwkJKChVSU5UMTYpMHhGQzEzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjQJCSgoVUlOVDE2KTB4RkMxNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI1CQkoKFVJTlQxNikweEZDMTUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNgkJKChVSU5UMTYpMHhGQzE2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkYJKChVSU5UMTYpMHhGQzE3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUJCSgodTE2KTB4RkMwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIJKCh1MTYpMHhGQzAxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQJKCh1MTYpMHhGQzAyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTAkoKHUxNikweEZDMDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lECQkoKHUxNikweEZDMDQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05BVElNV0lOCSgodTE2KTB4RkMwNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNZU1NDQUxFCQkoKHUxNikweEZDMDYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOCSgodTE2KTB4RkMwNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIJCSgodTE2KTB4RkMwOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNRU5BQkxFRAkoKHUxNikweEZDMDkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVQUwkJKCh1MTYpMHhGQzBBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTVVMVElDQVNUUlgJKCh1MTYpMHhGQzBCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVIJKCh1MTYpMHhGQzBDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSCSgodTE2KTB4RkMwRCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk5BTUUJCSgodTE2KTB4RkMwRSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIJKCh1MTYpMHhGQzEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjEJCSgodTE2KTB4RkMxMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIyCQkoKHUxNikweEZDMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMwkJKCh1MTYpMHhGQzEzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjQJCSgodTE2KTB4RkMxNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI1CQkoKHUxNikweEZDMTUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNgkJKCh1MTYpMHhGQzE2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkYJKCh1MTYpMHhGQzE3KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRCBsZW5ndGhzOiBOZXR3b3JrIFBhcmFtcywgU3RhdGljIENvbmZpZyBFbnRpdGllcwpAQCAtNDIzLDYyICszODcsNjIgQEAKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVE9ETzogZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGVzZSAqLwotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEVfTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOCSgoVUlOVDE2KTM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTF9MRU4JKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOCSgoVUlOVDE2KTM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTl9MRU4JKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNZU1NDQUxFX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFJfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRURfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVQU19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUhPTEREVVJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FX0xFTgkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMV9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIyX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjNfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNF9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI1X0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjZfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0xFTiAoKFVJTlQxNilzaXplb2YoVUlOVDE2KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEVfTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOCSgodTE2KTM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTF9MRU4JKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOCSgodTE2KTM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTl9MRU4JKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNZU1NDQUxFX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFJfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRURfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVQU19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUhPTEREVVJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FX0xFTgkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMV9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIyX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjNfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNF9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI1X0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjZfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0xFTiAoKHUxNilzaXplb2YodTE2KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKHUxNikwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9HUk9VUEFERFIJCSgoVUlOVDE2KTB4RkM4MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1MJCSgoVUlOVDE2KTB4RkM4MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gJCSgoVUlOVDE2KTB4RkM4MikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSAkJKChVSU5UMTYpMHhGQzgzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTAkJKChVSU5UMTYpMHhGQzg0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREUJCSgoVUlOVDE2KTB4RkM4NSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwCQkoKFVJTlQxNikweEZDOTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMQkJKChVSU5UMTYpMHhGQzkxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDIJCSgoVUlOVDE2KTB4RkM5MikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzCQkoKFVJTlQxNikweEZDOTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINAkJKChVSU5UMTYpMHhGQzk0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDUJCSgoVUlOVDE2KTB4RkM5NSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2CQkoKFVJTlQxNikweEZDOTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gwCQkoKFVJTlQxNikweEZDOTcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxCQkoKFVJTlQxNikweEZDOTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gyCQkoKFVJTlQxNikweEZDOTkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gzCQkoKFVJTlQxNikweEZDOUEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0CQkoKFVJTlQxNikweEZDOUIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g1CQkoKFVJTlQxNikweEZDOUMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g2CQkoKFVJTlQxNikweEZDOUQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMAkJKChVSU5UMTYpMHhGQzlFKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDEJCSgoVUlOVDE2KTB4RkM5RikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwyCQkoKFVJTlQxNikweEZDQTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMwkJKChVSU5UMTYpMHhGQ0ExKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDQJCSgoVUlOVDE2KTB4RkNBMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw1CQkoKFVJTlQxNikweEZDQTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNgkJKChVSU5UMTYpMHhGQ0E0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfR1JPVVBBRERSCQkoKHUxNikweEZDODApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTCQkoKHUxNikweEZDODEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNICQkoKHUxNikweEZDODIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gJCSgodTE2KTB4RkM4MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwJCSgodTE2KTB4RkM4NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFCQkoKHUxNikweEZDODUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMAkJKCh1MTYpMHhGQzkwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDEJCSgodTE2KTB4RkM5MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyCQkoKHUxNikweEZDOTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMwkJKCh1MTYpMHhGQzkzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDQJCSgodTE2KTB4RkM5NCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1CQkoKHUxNikweEZDOTUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINgkJKCh1MTYpMHhGQzk2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMAkJKCh1MTYpMHhGQzk3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMQkJKCh1MTYpMHhGQzk4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMgkJKCh1MTYpMHhGQzk5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMwkJKCh1MTYpMHhGQzlBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINAkJKCh1MTYpMHhGQzlCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINQkJKCh1MTYpMHhGQzlDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINgkJKCh1MTYpMHhGQzlEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAJCSgodTE2KTB4RkM5RSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxCQkoKHUxNikweEZDOUYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMgkJKCh1MTYpMHhGQ0EwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDMJCSgodTE2KTB4RkNBMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0CQkoKHUxNikweEZDQTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNQkJKCh1MTYpMHhGQ0EzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDYJCSgodTE2KTB4RkNBNCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSUQgTGVuZ3RoczogTmV0d29yayBQYXJhbSwgRHluYW1pYyBDb25maWcgRW50aXRpZXMKQEAgLTQ4NiwyOTYgKzQ1MCwyOTYgQEAKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVE9ETzogZmlsbCBpbiB0aGUgcmVzdCBvZiB0aGVzZSAqLwotI2RlZmluZQkJSEZBMzg0eF9SSURfR1JPVVBBRERSX0xFTgkoKFVJTlQxNikxNiAqIFdMQU5fQUREUl9MRU4pCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVExfTEVOCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERV9MRU4JKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDFfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDRfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDFfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gyX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIM19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDRfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g1X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDFfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDRfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2X0xFTgkoKFVJTlQxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfR1JPVVBBRERSX0xFTgkoKHUxNikxNiAqIFdMQU5fQUREUl9MRU4pCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVExfTEVOCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERV9MRU4JKCh1MTYpMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDFfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDRfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDFfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gyX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIM19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDRfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g1X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDFfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDRfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2X0xFTgkoKHUxNikwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRHM6IEJlaGF2aW9yIFBhcmFtZXRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0lUSUNLVElNRQkJKChVSU5UMTYpMHhGQ0UwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FCQkoKHUxNikweEZDRTApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEIExlbmd0aHM6IEJlaGF2aW9yIFBhcmFtZXRlcnMKICAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUVfTEVOCSgoVUlOVDE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUVfTEVOCSgodTE2KTIpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEczogTklDIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRQkJKChVSU5UMTYpMHhGRDAwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIJKChVSU5UMTYpMHhGRDAxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFkJCSgoVUlOVDE2KTB4RkQwMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMDMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTCSgoVUlOVDE2KTB4RkQwNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUgkoKFVJTlQxNikweEZEMEEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWQkJKChVSU5UMTYpMHhGRDBCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQwQykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMEQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVAkJKChVSU5UMTYpMHhGRDEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlMJKChVSU5UMTYpMHhGRDExKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVEVNUFRZUEUJCSgoVUlOVDE2KTB4RkQxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NJUwkJCSgoVUlOVDE2KTB4RkQxMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUlERU5USVRZCQkoKFVJTlQxNikweEZEMjApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDIxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMjIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFfQ0ZJQUNUUkFOR0VTCSgoVUlOVDE2KTB4RkQyMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0JVSUxEU0VRCQkoKFVJTlQxNikweEZGRkUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GV0lECQkoKFVJTlQxNikweEZGRkYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRQkJKCh1MTYpMHhGRDAwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIJKCh1MTYpMHhGRDAxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFkJCSgodTE2KTB4RkQwMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFCQkoKHUxNikweEZEMDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTCSgodTE2KTB4RkQwNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUgkoKHUxNikweEZEMEEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWQkJKCh1MTYpMHhGRDBCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UJCSgodTE2KTB4RkQwQykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFCQkoKHUxNikweEZEMEQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVAkJKCh1MTYpMHhGRDEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlMJKCh1MTYpMHhGRDExKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVEVNUFRZUEUJCSgodTE2KTB4RkQxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NJUwkJCSgodTE2KTB4RkQxMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUlERU5USVRZCQkoKHUxNikweEZEMjApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRQkJKCh1MTYpMHhGRDIxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUwkoKHUxNikweEZEMjIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFfQ0ZJQUNUUkFOR0VTCSgodTE2KTB4RkQyMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0JVSUxEU0VRCQkoKHUxNikweEZGRkUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GV0lECQkoKHUxNikweEZGRkYpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEIExlbmd0aHM6IE5JQyBJbmZvcm1hdGlvbgogICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWExPQURUSU1FX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfZG93bmxvYWRidWZmZXJfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOCQkoKFVJTlQxNikxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ0lERU5USVRZX0xFTgkJKChVSU5UMTYpOCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1RfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlNfTEVOCSgoVUlOVDE2KTEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVEVNUFRZUEVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0lTX0xFTgkJCSgoVUlOVDE2KTQ4MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUlERU5USVRZX0xFTgkJKChVSU5UMTYpOCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQVNVUFJBTkdFX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRklBQ1RSQU5HRVNfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFUzJfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0JVSUxEU0VRX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfQnVpbGRTZXFfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GV0lEX0xFTgkJCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0ZXSURfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFlfTEVOCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFU19MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTgkJKCh1MTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4JCSgodTE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRV9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TX0xFTgkoKHUxNikxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NJU19MRU4JCQkoKHUxNik0ODApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWV9MRU4JCSgodTE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJQUNUUkFOR0VTX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVMyX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X0J1aWxkU2VxX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRF9MRU4JCQkoKHUxNilzaXplb2YoaGZhMzg0eF9GV0lEX3QpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTCQkoKFVJTlQxNikweEZENDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRAkJKChVSU5UMTYpMHhGRDQxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lECSgoVUlOVDE2KTB4RkQ0MikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWQkoKFVJTlQxNikweEZENDMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFCSgoVUlOVDE2KTB4RkQ0NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05JTlQJKChVSU5UMTYpMHhGRDQ1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNICSgoVUlOVDE2KTB4RkQ0NikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRQkoKFVJTlQxNikweEZENDcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVQJKChVSU5UMTYpMHhGRDQ4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVQJKChVSU5UMTYpMHhGRDQ5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRQkoKFVJTlQxNikweEZENEEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FCSgoVUlOVDE2KTB4RkQ0QikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEUJCSgoVUlOVDE2KTB4RkQ0QykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TCSgoVUlOVDE2KTB4RkQ0RCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAJKChVSU5UMTYpMHhGRDRGKQotI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZCSgoVUlOVDE2KTB4RkQ1MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxCSgoVUlOVDE2KTB4RkQ4MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyCSgoVUlOVDE2KTB4RkQ4MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzCSgoVUlOVDE2KTB4RkQ4MikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0CSgoVUlOVDE2KTB4RkQ4MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1CSgoVUlOVDE2KTB4RkQ4NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2CSgoVUlOVDE2KTB4RkQ4NSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1MJKChVSU5UMTYpMHhGRDg2KQotLy8gI2RlZmluZQlIRkEzODR4X1JJRF9QQ0ZJTkZPCQkoKFVJTlQxNikweEZEODcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVTVUxUUyAgICAgICAJKChVSU5UMTYpMHhGRDg4KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0hPU1RTQ0FOUkVTVUxUUyAgIAkoKFVJTlQxNikweEZEODkpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRJT05VU0VECSgoVUlOVDE2KTB4RkQ4QSkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVGQUlMVVJFICAJKChVSU5UMTYpMHhGRDhEKSAvLyAxLjguMAorI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVUwkJKCh1MTYpMHhGRDQwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNTSUQJCSgodTE2KTB4RkQ0MSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRAkoKHUxNikweEZENDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFkJKCh1MTYpMHhGRDQzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURQkoKHUxNikweEZENDQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQkNOaW50CSgodTE2KTB4RkQ0NSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSAkoKHUxNikweEZENDYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUUJKCh1MTYpMHhGRDQ3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlUCSgodTE2KTB4RkQ0OCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlUCSgodTE2KTB4RkQ0OSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFRYTElGRVRJTUUJKCh1MTYpMHhGRDRBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRQkoKHUxNikweEZENEIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRlBPTExBQkxFCQkoKHUxNikweEZENEMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNUwkoKHUxNikweEZENEQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QCSgodTE2KTB4RkQ0RikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWQkoKHUxNikweEZENTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMQkoKHUxNikweEZEODApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMgkoKHUxNikweEZEODEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMwkoKHUxNikweEZEODIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNAkoKHUxNikweEZEODMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNQkoKHUxNikweEZEODQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNgkoKHUxNikweEZEODUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTCSgodTE2KTB4RkQ4NikKKy8vICNkZWZpbmUJSEZBMzg0eF9SSURfUENGSU5GTwkJKCh1MTYpMHhGRDg3KQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFU1VMVFMgICAgICAgCSgodTE2KTB4RkQ4OCkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTlJFU1VMVFMgICAJKCh1MTYpMHhGRDg5KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FUSU9OVVNFRAkoKHUxNikweEZEOEEpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFRkFJTFVSRSAgCSgodTE2KTB4RkQ4RCkgLy8gMS44LjAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEIExlbmd0aHM6ICBNQUMgSW5mb3JtYXRpb24KICAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lEX0xFTgkJKChVSU5UMTYpMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSURfTEVOCQkoKFVJTlQxNilXTEFOX0JTU0lEX0xFTikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2NvbW1zcXVhbGl0eV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTklOVF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFDVVJTQ0FMRVRIUkVTSF9MRU4JKChVSU5UMTYpMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNU19MRU4JCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0X0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1X0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2X0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1NfTEVOCQkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUENGSU5GT19MRU4JCQkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfUENGSW5mb19kYXRhX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1RfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUX0xFTgkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVNfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNTSURfTEVOCQkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRF9MRU4JCSgodTE2KVdMQU5fQlNTSURfTEVOKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfY29tbXNxdWFsaXR5X3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5X3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQkNOaW50X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQUNVUlNDQUxFVEhSRVNIX0xFTgkoKHUxNikxMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FQQ1VSU0NBTEVUSFJFU0hfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlUX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlUX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFRYTElGRVRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRlBPTExBQkxFX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TX0xFTgkJKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVBfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTFfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTJfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTNfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTRfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTZfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTU19MRU4JCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QQ0ZJTkZPX0xFTgkJCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVF9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVEVTVEFfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1RfTEVOCSgodTE2KXNpemVvZihoZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhX3QpKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEczogIE1vZGVtIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QSFlUWVBFCQkoKFVJTlQxNikweEZEQzApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTAkoKFVJTlQxNikweEZEQzEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURQkoKFVJTlQxNikweEZEQzIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFCQkoKFVJTlQxNikweEZEQzMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVMJKChVSU5UMTYpMHhGREM2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfTEZPU1RBVFVTICAgICAgICAgICAoKFVJTlQxNikweEZEQzcpIC8vIDEuNy4xCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QSFlUWVBFCQkoKHUxNikweEZEQzApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTAkoKHUxNikweEZEQzEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURQkoKHUxNikweEZEQzIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFCQkoKHUxNikweEZEQzMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVMJKCh1MTYpMHhGREM2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTEZPU1RBVFVTICAgICAgICAgICAoKHUxNikweEZEQzcpIC8vIDEuNy4xCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTW9kZW0gSW5mb3JtYXRpb24KICAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QSFlUWVBFX0xFTgkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NDQU1PREVfTEVOCQkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFU19MRU4JKChVSU5UMTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QSFlUWVBFX0xFTgkJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NDQU1PREVfTEVOCQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFU19MRU4JKCh1MTYpMTApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFQSSBFTkhBTkNFTUVOVFMgKE5PVCBBTFJFQURZIElNUExFTUVOVEVEKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlECSgoVUlOVDE2KTB4RkMyMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwCSgoVUlOVDE2KTB4RkMyNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxCSgoVUlOVDE2KTB4RkMyNSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyCSgoVUlOVDE2KTB4RkMyNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzCSgoVUlOVDE2KTB4RkMyNykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUEZMQUdTCQkoKFVJTlQxNikweEZDMjgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBLRVlNQVBUQUJMRQkoKFVJTlQxNikweEZDMjkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTgkoKFVJTlQxNikweEZDMkEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhBU1NPQ1NUQVRJT05TCSgoVUlOVDE2KTB4RkMyQikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRYQ09OVFJPTAkoKFVJTlQxNikweEZDMkMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERQkoKFVJTlQxNikweEZDMkQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZIT1NUQVVUSEFTU09DCSgoVUlOVDE2KTB4RkMyRSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlJDVkNSQ0VSUk9SCSgoVUlOVDE2KTB4RkMzMCkKLS8vICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1NTElGRQkJKChVSU5UMTYpMHhGQzMxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQUxUUkVUUllDTlQJKChVSU5UMTYpMHhGQzMyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQJCSgoVUlOVDE2KTB4RkMzMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GTwkoKFVJTlQxNikweEZDMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVEFQQ0ZJTkZPCSgoVUlOVDE2KTB4RkMzNSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBSSU9SSVRZUVVTQUdFCSgoVUlOVDE2KTB4RkMzNykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRJTUNUUkwJCSgoVUlOVDE2KTB4RkM0MCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRISVJUWTJUQUxMWQkoKFVJTlQxNikweEZDNDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFTkhTRUNVUklUWQkoKFVJTlQxNikweEZDNDMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZEQk1BREpVU1QgIAkoKFVJTlQxNikweEZDNDYpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBREFUQSAgICAgICAJKChVSU5UMTYpMHhGQzQ4KSAvLyAxLjcuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJPUE9HQVRJT05ERUxBWQkoKFVJTlQxNikweEZDNDkpIC8vIDEuNy42Ci0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFCSgoVUlOVDE2KTB4RkNCMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkVYQ0xPTkdQUkVBTUJMRQkoKFVJTlQxNikweEZDQjEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVAkoKFVJTlQxNikweEZDQjIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTCSgoVUlOVDE2KTB4RkNCMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNVUFBSQVRFUwkoKFVJTlQxNikweEZDQjQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZGQUxMQkFDS0NUUkwJKChVSU5UMTYpMHhGQ0I1KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWVNUQVRVUyAgIAkoKFVJTlQxNikweEZDQjYpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfV0VQS0VZTUFQSU5ERVggCSgoVUlOVDE2KTB4RkNCNykgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9CUk9BRENBU1RLRVlJRCAJKChVSU5UMTYpMHhGQ0I4KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0VOVFNFQ0ZMQUdFWUlEIAkoKFVJTlQxNikweEZDQjkpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUEFTU0lWRVNDQU5DVFJMCSgoVUlOVDE2KTB4RkNCQSkgLy8gTkVXIFNUQQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBSEFORExJTkcJKChVSU5UMTYpMHhGQ0JCKSAvLyAxLjcuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfTURDQ09OVFJPTCAgICAgICAgCSgoVUlOVDE2KTB4RkNCQykgLy8gMS43LjAvMS40LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPVU5UUlkgICAgICAgIAkoKFVJTlQxNikweEZDQkQpIC8vIDEuNy4wLzEuNC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFBPV0VSTUFYICAgICAgICAJKChVSU5UMTYpMHhGQ0JFKSAvLyAxLjcuMC8xLjQuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTEZPRU5CTEVEICAgICAgCSgoVUlOVDE2KTB4RkNCRikgLy8gMS42LjMKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9DQVBJTkZPICAgICAgICAgICAgICgoVUlOVDE2KTB4RkNDMCkgLy8gMS43LjAvMS4zLjcKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MSVNURU5JTlRFUlZBTCAgICAgICgoVUlOVDE2KTB4RkNDMSkgLy8gMS43LjAvMS4zLjcKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVZFUlNJVFlFTkFCTEVEICAgICgoVUlOVDE2KTB4RkNDMikgLy8gMS43LjAvMS4zLjcKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MRURfQ09OVFJPTCAgICAgICAgICgoVUlOVDE2KTB4RkNDNCkgLy8gMS43LjYKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9IRk9fREVMQVkgICAgICAgICAgICgoVUlOVDE2KTB4RkNDNSkgLy8gMS43LjYKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVNTQUxPV0VEQlNTSUQgICAgICgoVUlOVDE2KTB4RkNDNikgLy8gMS44LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUCQkoKFVJTlQxNikweEZDRTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVAkJKChVSU5UMTYpMHhGQ0UyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBCSgoVUlOVDE2KTB4RkNFMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVAkoKFVJTlQxNikweEZDRTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTiAgICAgICAgICAJKChVSU5UMTYpMHhGQ0U1KSAvLyBORVcgU1RBCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVTVEEJKChVSU5UMTYpMHhGQ0U2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlECSgodTE2KTB4RkMyMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwCSgodTE2KTB4RkMyNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxCSgodTE2KTB4RkMyNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyCSgodTE2KTB4RkMyNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzCSgodTE2KTB4RkMyNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUEZMQUdTCQkoKHUxNikweEZDMjgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBLRVlNQVBUQUJMRQkoKHUxNikweEZDMjkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTgkoKHUxNikweEZDMkEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhBU1NPQ1NUQVRJT05TCSgodTE2KTB4RkMyQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRYQ09OVFJPTAkoKHUxNikweEZDMkMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERQkoKHUxNikweEZDMkQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZIT1NUQVVUSEFTU09DCSgodTE2KTB4RkMyRSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlJDVkNSQ0VSUk9SCSgodTE2KTB4RkMzMCkKKy8vICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1NTElGRQkJKCh1MTYpMHhGQzMxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQUxUUkVUUllDTlQJKCh1MTYpMHhGQzMyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBCQ05pbnQJCSgodTE2KTB4RkMzMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GTwkoKHUxNikweEZDMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVEFQQ0ZJTkZPCSgodTE2KTB4RkMzNSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBSSU9SSVRZUVVTQUdFCSgodTE2KTB4RkMzNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRJTUNUUkwJCSgodTE2KTB4RkM0MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlRISVJUWTJUQUxMWQkoKHUxNikweEZDNDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFTkhTRUNVUklUWQkoKHUxNikweEZDNDMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZEQk1BREpVU1QgIAkoKHUxNikweEZDNDYpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBREFUQSAgICAgICAJKCh1MTYpMHhGQzQ4KSAvLyAxLjcuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJPUE9HQVRJT05ERUxBWQkoKHUxNikweEZDNDkpIC8vIDEuNy42CisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFCSgodTE2KTB4RkNCMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkVYQ0xPTkdQUkVBTUJMRQkoKHUxNikweEZDQjEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVAkoKHUxNikweEZDQjIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTCSgodTE2KTB4RkNCMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlNVUFBSQVRFUwkoKHUxNikweEZDQjQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZGQUxMQkFDS0NUUkwJKCh1MTYpMHhGQ0I1KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWVNUQVRVUyAgIAkoKHUxNikweEZDQjYpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfV0VQS0VZTUFQSU5ERVggCSgodTE2KTB4RkNCNykgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9CUk9BRENBU1RLRVlJRCAJKCh1MTYpMHhGQ0I4KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0VOVFNFQ0ZMQUdFWUlEIAkoKHUxNikweEZDQjkpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUEFTU0lWRVNDQU5DVFJMCSgodTE2KTB4RkNCQSkgLy8gTkVXIFNUQQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV1BBSEFORExJTkcJKCh1MTYpMHhGQ0JCKSAvLyAxLjcuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfTURDQ09OVFJPTCAgICAgICAgCSgodTE2KTB4RkNCQykgLy8gMS43LjAvMS40LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPVU5UUlkgICAgICAgIAkoKHUxNikweEZDQkQpIC8vIDEuNy4wLzEuNC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFBPV0VSTUFYICAgICAgICAJKCh1MTYpMHhGQ0JFKSAvLyAxLjcuMC8xLjQuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTEZPRU5CTEVEICAgICAgCSgodTE2KTB4RkNCRikgLy8gMS42LjMKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9DQVBJTkZPICAgICAgICAgICAgICgodTE2KTB4RkNDMCkgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MSVNURU5pbnRFUlZBTCAgICAgICgodTE2KTB4RkNDMSkgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVZFUlNJVFlFTkFCTEVEICAgICgodTE2KTB4RkNDMikgLy8gMS43LjAvMS4zLjcKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9MRURfQ09OVFJPTCAgICAgICAgICgodTE2KTB4RkNDNCkgLy8gMS43LjYKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9IRk9fREVMQVkgICAgICAgICAgICgodTE2KTB4RkNDNSkgLy8gMS43LjYKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X1JJRF9ESVNTQUxPV0VEQlNTSUQgICAgICgodTE2KTB4RkNDNikgLy8gMS44LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUCQkoKHUxNikweEZDRTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVAkJKCh1MTYpMHhGQ0UyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBCSgodTE2KTB4RkNFMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVAkoKHUxNikweEZDRTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTiAgICAgICAgICAJKCh1MTYpMHhGQ0U1KSAvLyBORVcgU1RBCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BU1NPQ0lBVEVTVEEJKCh1MTYpMHhGQ0U2KQogCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQMTI4REVGQVVMVEtFWV9MRU4JKChVSU5UMTYpMTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTgkJKChVSU5UMTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVAxMjhERUZBVUxUS0VZX0xFTgkoKHUxNikxNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBSSU9RVVNBR0VfTEVOCQkoKHUxNik0KQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUEQgUmVjb3JkIGNvZGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIEhGQTM4NHhfUERSX1BDQl9QQVJUTlVNCQkoKFVJTlQxNikweDAwMDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1BEQVZFUgkJKChVSU5UMTYpMHgwMDAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfU0VSSUFMCQkoKFVJTlQxNikweDAwMDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01LS19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDA0KQotI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfUkFNU0laRQkJKChVSU5UMTYpMHgwMDA1KQotI2RlZmluZSBIRkEzODR4X1BEUl9NRklTVVBSQU5HRQkJKChVSU5UMTYpMHgwMDA2KQotI2RlZmluZSBIRkEzODR4X1BEUl9DRklTVVBSQU5HRQkJKChVSU5UMTYpMHgwMDA3KQotI2RlZmluZSBIRkEzODR4X1BEUl9OSUNJRAkJKChVSU5UMTYpMHgwMDA4KQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1JFRkRBQ19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDEwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1ZHREFDX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwMjApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfTEVWRUxfQ09NUF9NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDMwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX01PREVNX1RSSU1EQUNfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDA0MCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9DT1JFR0FfSEFDSwkJKChVSU5UMTYpMHgwMGZmKQotI2RlZmluZSBIRkEzODR4X1BEUl9NQUNfQUREUkVTUwkJKChVSU5UMTYpMHgwMTAxKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX01LS19DQUxMTkFNRQkoKFVJTlQxNikweDAxMDIpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1JFR0RPTUFJTgkJKChVSU5UMTYpMHgwMTAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9BTExPV0VEX0NIQU5ORUwJKChVSU5UMTYpMHgwMTA0KQotI2RlZmluZSBIRkEzODR4X1BEUl9ERUZBVUxUX0NIQU5ORUwJKChVSU5UMTYpMHgwMTA1KQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1BSSVZBQ1lfT1BUSU9OCSgoVUlOVDE2KTB4MDEwNikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVEVNUFRZUEUJCSgoVUlOVDE2KTB4MDEwNykKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfU0VUVVAJKChVSU5UMTYpMHgwMTEwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1ZHREFDX1NFVFVQCQkoKFVJTlQxNikweDAxMjApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfTEVWRUxfQ09NUF9TRVRVUAkoKFVJTlQxNikweDAxMzApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfVFJJTURBQ19TRVRVUAkoKFVJTlQxNikweDAxNDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX0lGUl9TRVRUSU5HCQkoKFVJTlQxNikweDAyMDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX1JGUl9TRVRUSU5HCQkoKFVJTlQxNikweDAyMDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQkFTRUxJTkUJKChVSU5UMTYpMHgwMjAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX1NIQURPVwkoKFVJTlQxNikweDAyMDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfSUZSRgkoKFVJTlQxNikweDAyMDQpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQ0hDQUxTUAkoKFVJTlQxNikweDAzMDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQ0hDQUxJCSgoVUlOVDE2KTB4MDMwMSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUFYX1RYX1BPV0VSICAJKChVSU5UMTYpMHgwMzAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9NQVNURVJfQ0hBTl9MSVNUCSgoVUlOVDE2KTB4MDMwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfMzg0Ml9OSUNfQ09ORklHCSgoVUlOVDE2KTB4MDQwMCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX0lECQkoKFVJTlQxNikweDA0MDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9JRAkJKChVSU5UMTYpMHgwNDAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUZDT05GCQkoKFVJTlQxNikweDA0MDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9QTUNPTkYJCSgoVUlOVDE2KTB4MDQwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUkZFTlJHWQkJKChVSU5UMTYpMHgwNDA2KQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfUE9XRVJfVFlQRSAgICAgICgoVUlOVDE2KTB4MDQwNykKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9VTktOT1dONDA4CQkoKFVJTlQxNikweDA0MDgpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9NQVhfUE9XRVIJKChVSU5UMTYpMHgwNDA5KQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFOVUZBQ1RVUkVSCSgoVUlOVDE2KTB4MDQxMCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BST0RVQ1QgIAkoKFVJTlQxNikweDA0MTEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0FOVF9ESVZFUlNJVFkgICAJKChVSU5UMTYpMHgwNDEyKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRk9fREVMQVkgICAgICAgCSgoVUlOVDE2KTB4MDQxMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfU0NBTEVfVEhSRVNIIAkoKFVJTlQxNikweDA0MTQpCisjZGVmaW5lIEhGQTM4NHhfUERSX1BDQl9QQVJUTlVNCQkoKHUxNikweDAwMDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX1BEQVZFUgkJKCh1MTYpMHgwMDAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfU0VSSUFMCQkoKHUxNikweDAwMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSX01LS19NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfUkFNU0laRQkJKCh1MTYpMHgwMDA1KQorI2RlZmluZSBIRkEzODR4X1BEUl9NRklTVVBSQU5HRQkJKCh1MTYpMHgwMDA2KQorI2RlZmluZSBIRkEzODR4X1BEUl9DRklTVVBSQU5HRQkJKCh1MTYpMHgwMDA3KQorI2RlZmluZSBIRkEzODR4X1BEUl9OSUNJRAkJKCh1MTYpMHgwMDA4KQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1JFRkRBQ19NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDEwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1ZHREFDX01FQVNVUkVNRU5UUwkoKHUxNikweDAwMjApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfTEVWRUxfQ09NUF9NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDMwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX01PREVNX1RSSU1EQUNfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDA0MCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9DT1JFR0FfSEFDSwkJKCh1MTYpMHgwMGZmKQorI2RlZmluZSBIRkEzODR4X1BEUl9NQUNfQUREUkVTUwkJKCh1MTYpMHgwMTAxKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX01LS19DQUxMTkFNRQkoKHUxNikweDAxMDIpCisjZGVmaW5lIEhGQTM4NHhfUERSX1JFR0RPTUFJTgkJKCh1MTYpMHgwMTAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9BTExPV0VEX0NIQU5ORUwJKCh1MTYpMHgwMTA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9ERUZBVUxUX0NIQU5ORUwJKCh1MTYpMHgwMTA1KQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1BSSVZBQ1lfT1BUSU9OCSgodTE2KTB4MDEwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVEVNUFRZUEUJCSgodTE2KTB4MDEwNykKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfU0VUVVAJKCh1MTYpMHgwMTEwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1ZHREFDX1NFVFVQCQkoKHUxNikweDAxMjApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfTEVWRUxfQ09NUF9TRVRVUAkoKHUxNikweDAxMzApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVFJJTURBQ19TRVRVUAkoKHUxNikweDAxNDApCisjZGVmaW5lIEhGQTM4NHhfUERSX0lGUl9TRVRUSU5HCQkoKHUxNikweDAyMDApCisjZGVmaW5lIEhGQTM4NHhfUERSX1JGUl9TRVRUSU5HCQkoKHUxNikweDAyMDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQkFTRUxJTkUJKCh1MTYpMHgwMjAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX1NIQURPVwkoKHUxNikweDAyMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfSUZSRgkoKHUxNikweDAyMDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQ0hDQUxTUAkoKHUxNikweDAzMDApCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfQ0hDQUxJCSgodTE2KTB4MDMwMSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFYX1RYX1BPV0VSICAJKCh1MTYpMHgwMzAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9NQVNURVJfQ0hBTl9MSVNUCSgodTE2KTB4MDMwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfMzg0Ml9OSUNfQ09ORklHCSgodTE2KTB4MDQwMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX0lECQkoKHUxNikweDA0MDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9JRAkJKCh1MTYpMHgwNDAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUZDT05GCQkoKHUxNikweDA0MDMpCisjZGVmaW5lIEhGQTM4NHhfUERSX1BDSV9QTUNPTkYJCSgodTE2KTB4MDQwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUkZFTlJHWQkJKCh1MTYpMHgwNDA2KQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfUE9XRVJfVFlQRSAgICAgICgodTE2KTB4MDQwNykKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9VTktOT1dONDA4CQkoKHUxNikweDA0MDgpCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9NQVhfUE9XRVIJKCh1MTYpMHgwNDA5KQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFOVUZBQ1RVUkVSCSgodTE2KTB4MDQxMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BST0RVQ1QgIAkoKHUxNikweDA0MTEpCisjZGVmaW5lIEhGQTM4NHhfUERSX0FOVF9ESVZFUlNJVFkgICAJKCh1MTYpMHgwNDEyKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRk9fREVMQVkgICAgICAgCSgodTE2KTB4MDQxMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfU0NBTEVfVEhSRVNIIAkoKHUxNikweDA0MTQpCiAKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9NQU5GX1RFU1RTUAkoKFVJTlQxNikweDA5MDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUSQkoKFVJTlQxNikweDA5MDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX0VORF9PRl9QREEJCSgoVUlOVDE2KTB4MDAwMCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9NQU5GX1RFU1RTUAkoKHUxNikweDA5MDApCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUSQkoKHUxNikweDA5MDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX0VORF9PRl9QREEJCSgodTE2KTB4MDAwMCkKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtODAyLDcgKzc2Niw3IEBACiAjZGVmaW5lCQlIRkEzODR4X09GRlNFVDEJCUhGQTM4NHhfT0ZGU0VUMV9PRkYKICNkZWZpbmUJCUhGQTM4NHhfREFUQTEJCUhGQTM4NHhfREFUQTFfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0VWU1RBVAkJSEZBMzg0eF9FVlNUQVRfT0ZGCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOCQlIRkEzODR4X0lOVEVOX09GRgorI2RlZmluZQkJSEZBMzg0eF9pbnRFTgkJSEZBMzg0eF9JTlRFTl9PRkYKICNkZWZpbmUJCUhGQTM4NHhfRVZBQ0sJCUhGQTM4NHhfRVZBQ0tfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0NPTlRST0wJCUhGQTM4NHhfQ09OVFJPTF9PRkYKICNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMAlIRkEzODR4X1NXU1VQUE9SVDBfT0ZGCkBAIC04MTcsOTYgKzc4MSw5NiBAQAogCiAvKi0tLSBSZWdpc3RlciBUZXN0L0dldC9TZXQgRmllbGQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTQlVTWSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNil2YWx1ZSkgJiBIRkEzODR4X0NNRF9CVVNZKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfQUlORk8pID4+IDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKQkJKChVSU5UMTYpKChVSU5UMTYpKHZhbHVlKSA8PCA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlRfR0VUKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9NQUNQT1JUKSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9JU1JFQ0wodmFsdWUpCQkoKFVJTlQxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1JFQ0wpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1JFQ0xfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1FPU19HRVQodmFsdWUpCQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpJigoVUlOVDE2KTB4MzAwMCkpID4+IDEyKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1FPU19TRVQodmFsdWUpCQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEyKSAmIDB4MzAwMCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9JU1dSSVRFKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9XUklURSkpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfV1JJVEVfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKChVSU5UMTYpdmFsdWUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfR0VUKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9QUk9HTU9ERSkpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfU0VUKHZhbHVlKQkJKChVSU5UMTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKChVSU5UMTYpdmFsdWUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERV9HRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0NNRF9DTURDT0RFKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfU0VUKHZhbHVlKQkJKChVSU5UMTYpKHZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0lTQlVTWSh2YWx1ZSkJCSgodTE2KSgoKHUxNil2YWx1ZSkgJiBIRkEzODR4X0NNRF9CVVNZKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX0dFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfQUlORk8pID4+IDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKQkJKCh1MTYpKCh1MTYpKHZhbHVlKSA8PCA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX01BQ1BPUlRfR0VUKHZhbHVlKQkJKCh1MTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9NQUNQT1JUKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU1JFQ0wodmFsdWUpCQkoKHUxNikoSEZBMzg0eF9DTURfQUlORk9fR0VUKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX1JFQ0wpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1JFQ0xfU0VUKHZhbHVlKQkJKCh1MTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKHZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1FPU19HRVQodmFsdWUpCQkoKHUxNikoKCgodTE2KSh2YWx1ZSkpJigodTE2KTB4MzAwMCkpID4+IDEyKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1FPU19TRVQodmFsdWUpCQkoKHUxNikoKCgodTE2KSh2YWx1ZSkpIDw8IDEyKSAmIDB4MzAwMCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU1dSSVRFKHZhbHVlKQkJKCh1MTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9XUklURSkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfV1JJVEVfU0VUKHZhbHVlKQkJKCh1MTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKCh1MTYpdmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfR0VUKHZhbHVlKQkJKCh1MTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9QUk9HTU9ERSkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREVfU0VUKHZhbHVlKQkJKCh1MTYpSEZBMzg0eF9DTURfQUlORk9fU0VUKCh1MTYpdmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfQ01EQ09ERV9HRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0NNRF9DTURDT0RFKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfU0VUKHZhbHVlKQkJKCh1MTYpKHZhbHVlKSkKIAotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX1JFU1VMVCkgPj4gOCkpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfU0VUKHZhbHVlKQkoKChVSU5UMTYpKHZhbHVlKSkgPDwgOCkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfR0VUKHZhbHVlKQkoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19DTURDT0RFKQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9TRVQodmFsdWUpCSgoVUlOVDE2KSh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfR0VUKHZhbHVlKQkoKHUxNikoKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9TVEFUVVNfUkVTVUxUKSA+PiA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVF9TRVQodmFsdWUpCSgoKHUxNikodmFsdWUpKSA8PCA4KQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9HRVQodmFsdWUpCSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX0NNRENPREUpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFX1NFVCh2YWx1ZSkJKCh1MTYpKHZhbHVlKSkKIAotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNCVVNZKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfQlVTWSkpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9JU0VSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0VSUikpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfREFUQU9GRikpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGX1NFVCh2YWx1ZSkJKChVSU5UMTYpKHZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTQlVTWSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0JVU1kpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNFUlIodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9FUlIpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9HRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYpKQorI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9TRVQodmFsdWUpCSgodTE2KSh2YWx1ZSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RJQ0spKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1dURVJSKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GRFJPUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORkRST1ApKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GTykpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0RUSU0odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9EVElNKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQ01EKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQ01EKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTQUxMT0ModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9BTExPQykpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFhFWEMpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTUlgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9SWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RJQ0sodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9USUNLKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTV1RFUlIodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9XVEVSUikpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORkRST1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZEUk9QKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GTyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORk8pKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNEVElNKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfRFRJTSkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0NNRCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0NNRCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQUxMT0MpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWEVYQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYRVhDKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1JYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfUlgpKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0JBUF9PUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5UX0JBUF9PUCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0JBUF9PUCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfaW50X0JBUF9PUCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNUSUNLKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9USUNLKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVElDS19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTUpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1dURVJSKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9XVEVSUikpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1dURVJSX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTSU5GRFJPUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fSU5GRFJPUCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lORkRST1BfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTMpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0lORk8odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORk8pKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA3KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNEVElNKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9EVElNKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fRFRJTV9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNSkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTQ01EKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9DTUQpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9DTURfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDQpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0FMTE9DKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9BTExPQykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0FMTE9DX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAzKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNUWEVYQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVFhFWEMpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9UWEVYQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMikpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTVFgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1JYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9SWCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1JYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNUSUNLKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9USUNLKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVElDS19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTUpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1dURVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9XVEVSUikpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1dURVJSX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTSU5GRFJPUCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fSU5GRFJPUCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lORkRST1BfU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTMpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0lORk8odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORk8pKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JTkZPX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA3KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNEVElNKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9EVElNKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fRFRJTV9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNSkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTQ01EKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9DTUQpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9DTURfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDQpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0FMTE9DKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9BTExPQykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0FMTE9DX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAzKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNUWEVYQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVFhFWEMpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9UWEVYQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMikpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTVFgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVFhfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1JYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9SWCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1JYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RJQ0sodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RJQ0spKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19USUNLX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTV1RFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1dURVJSKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfV1RFUlJfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE0KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNJTkZEUk9QKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19JTkZEUk9QKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GRFJPUF9TRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxMykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GTyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GTykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORk9fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDcpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0RUSU0odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0RUSU0pKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19EVElNX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA1KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNDTUQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0NNRCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0NNRF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQUxMT0ModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0FMTE9DKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDMpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RYRVhDKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19UWEVYQykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYRVhDX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAyKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFgpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTUlgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1JYKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfUlhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDApKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RJQ0sodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RJQ0spKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19USUNLX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTV1RFUlIodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1dURVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfV1RFUlJfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNJTkZEUk9QKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19JTkZEUk9QKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GRFJPUF9TRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxMykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GTyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GTykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORk9fU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDcpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0RUSU0odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0RUSU0pKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19EVElNX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA1KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNDTUQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0NNRCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0NNRF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQUxMT0ModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0FMTE9DKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDMpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1RYRVhDKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19UWEVYQykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYRVhDX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAyKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFgpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTUlgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1JYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfUlhfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDApKQogCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTQpKQotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpID4+IDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9TRVQodmFsdWUpCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fR0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPj4gMTQpKQogCiAvKiBCeXRlIE9yZGVyICovCiAjaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBoZmEzODR4Mmhvc3RfMTYobikJKF9fbGUxNl90b19jcHUoKFVJTlQxNikobikpKQotI2RlZmluZSBoZmEzODR4Mmhvc3RfMzIobikJKF9fbGUzMl90b19jcHUoKFVJTlQzMikobikpKQotI2RlZmluZSBob3N0MmhmYTM4NHhfMTYobikJKF9fY3B1X3RvX2xlMTYoKFVJTlQxNikobikpKQotI2RlZmluZSBob3N0MmhmYTM4NHhfMzIobikJKF9fY3B1X3RvX2xlMzIoKFVJTlQzMikobikpKQorI2RlZmluZSBoZmEzODR4Mmhvc3RfMTYobikJKF9fbGUxNl90b19jcHUoKHUxNikobikpKQorI2RlZmluZSBoZmEzODR4Mmhvc3RfMzIobikJKF9fbGUzMl90b19jcHUoKHUzMikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMTYobikJKF9fY3B1X3RvX2xlMTYoKHUxNikobikpKQorI2RlZmluZSBob3N0MmhmYTM4NHhfMzIobikJKF9fY3B1X3RvX2xlMzIoKHUzMikobikpKQogI2VuZGlmCiAKIC8qIEhvc3QgTWFpbnRhaW5lZCBTdGF0ZSBJbmZvICovCkBAIC05MjcsMTQgKzg5MSwxNCBAQAogLyogQ29tbW9ubHkgdXNlZCBiYXNpYyB0eXBlcyAqLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyCiB7Ci0JVUlOVDE2CWxlbjsKLQlVSU5UOAlkYXRhWzBdOworCXUxNglsZW47CisJdTgJZGF0YVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9ieXRlc3RyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyCiB7Ci0JVUlOVDE2CWxlbjsKLQlVSU5UOAlkYXRhWzMyXTsKKwl1MTYJbGVuOworCXU4CWRhdGFbMzJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2J5dGVzdHIzMl90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05NDYsMTEyICs5MTAsMTEyIEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcmVjb3JkCiB7Ci0JVUlOVDE2CXJlY2xlbjsKLQlVSU5UMTYJcmlkOworCXUxNglyZWNsZW47CisJdTE2CXJpZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yZWNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yZWNvcmQxNgogewotCVVJTlQxNglyZWNsZW47Ci0JVUlOVDE2CXJpZDsKLQlVSU5UMTYJdmFsOworCXUxNglyZWNsZW47CisJdTE2CXJpZDsKKwl1MTYJdmFsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3JlYzE2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcmVjb3JkMzIKIHsKLQlVSU5UMTYJcmVjbGVuOwotCVVJTlQxNglyaWQ7Ci0JVUlOVDMyCXZhbDsKKwl1MTYJcmVjbGVuOworCXUxNglyaWQ7CisJdTMyCXZhbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yZWMzMjsKIAogLyotLSBIYXJkd2FyZS9GaXJtd2FyZSBDb21wb25lbnQgSW5mb3JtYXRpb24gLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudAogewotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJbWFqb3I7Ci0JVUlOVDE2CW1pbm9yOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJbWFqb3I7CisJdTE2CW1pbm9yOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NvbXBpZGVudF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NhcGxldmVsCiB7Ci0JVUlOVDE2CXJvbGU7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNglib3R0b207Ci0JVUlOVDE2CXRvcDsKKwl1MTYJcm9sZTsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CWJvdHRvbTsKKwl1MTYJdG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NhcGxldmVsX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBvcnRUeXBlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUG9ydFR5cGUKIHsKLQlVSU5UMTYJY25mUG9ydFR5cGU7CisJdTE2CWNuZlBvcnRUeXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBvcnRUeXBlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bk1BQ0FkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25NQUNBZGRyZXNzCiB7Ci0JVUlOVDgJY25mT3duTUFDQWRkcmVzc1s2XTsKKwl1OAljbmZPd25NQUNBZGRyZXNzWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bk1BQ0FkZHJlc3NfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mRGVzaXJlZFNTSUQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZEZXNpcmVkU1NJRAogewotCVVJTlQ4CWNuZkRlc2lyZWRTU0lEWzM0XTsKKwl1OAljbmZEZXNpcmVkU1NJRFszNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mRGVzaXJlZFNTSURfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duQ2hhbm5lbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bkNoYW5uZWwKIHsKLQlVSU5UMTYJY25mT3duQ2hhbm5lbDsKKwl1MTYJY25mT3duQ2hhbm5lbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25DaGFubmVsX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93blNTSUQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25TU0lECiB7Ci0JVUlOVDgJY25mT3duU1NJRFszNF07CisJdTgJY25mT3duU1NJRFszNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duU1NJRF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25BVElNV2luZG93IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duQVRJTVdpbmRvdwogewotCVVJTlQxNgljbmZPd25BVElNV2luZG93OworCXUxNgljbmZPd25BVElNV2luZG93OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bkFUSU1XaW5kb3dfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mU3lzdGVtU2NhbGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZTeXN0ZW1TY2FsZQogewotCVVJTlQxNgljbmZTeXN0ZW1TY2FsZTsKKwl1MTYJY25mU3lzdGVtU2NhbGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mU3lzdGVtU2NhbGVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mTWF4RGF0YUxlbmd0aCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk1heERhdGFMZW5ndGgKIHsKLQlVSU5UMTYJY25mTWF4RGF0YUxlbmd0aDsKKwl1MTYJY25mTWF4RGF0YUxlbmd0aDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZNYXhEYXRhTGVuZ3RoX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZldEU0FkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZXRFNBZGRyZXNzCiB7Ci0JVUlOVDgJY25mV0RTQWRkcmVzc1s2XTsKKwl1OAljbmZXRFNBZGRyZXNzWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZldEU0FkZHJlc3NfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUE1FbmFibGVkIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mUE1FbmFibGVkCiB7Ci0JVUlOVDE2CWNuZlBNRW5hYmxlZDsKKwl1MTYJY25mUE1FbmFibGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlBNRW5hYmxlZF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUVQUyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBNRVBTCiB7Ci0JVUlOVDE2CWNuZlBNRVBTOworCXUxNgljbmZQTUVQUzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQTUVQU190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZNdWx0aWNhc3RSZWNlaXZlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTXVsdGljYXN0UmVjZWl2ZQogewotCVVJTlQxNgljbmZNdWx0aWNhc3RSZWNlaXZlOworCXUxNgljbmZNdWx0aWNhc3RSZWNlaXZlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk11bHRpY2FzdFJlY2VpdmVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mQXV0aGVudGljYXRpb24gLS0qLwpAQCAtMTA2MiwzNyArMTAyNiwzNyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mTWF4U2xlZXBEdXJhdGlvbiAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk1heFNsZWVwRHVyYXRpb24KIHsKLQlVSU5UMTYJY25mTWF4U2xlZXBEdXJhdGlvbjsKKwl1MTYJY25mTWF4U2xlZXBEdXJhdGlvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZNYXhTbGVlcER1cmF0aW9uX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBNSG9sZG92ZXJEdXJhdGlvbiAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBNSG9sZG92ZXJEdXJhdGlvbgogewotCVVJTlQxNgljbmZQTUhvbGRvdmVyRHVyYXRpb247CisJdTE2CWNuZlBNSG9sZG92ZXJEdXJhdGlvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQTUhvbGRvdmVyRHVyYXRpb25fdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duTmFtZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bk5hbWUKIHsKLQlVSU5UOAljbmZPd25OYW1lWzM0XTsKKwl1OAljbmZPd25OYW1lWzM0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25OYW1lX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkRUSU1QZXJpb2QgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25EVElNUGVyaW9kCiB7Ci0JVUlOVDE2CWNuZk93bkRUSU1QZXJpb2Q7CisJdTE2CWNuZk93bkRUSU1QZXJpb2Q7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duRFRJTVBlcmlvZF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZXRFNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mV0RTQWRkcmVzc04KIHsKLQlVSU5UOAljbmZXRFNBZGRyZXNzWzZdOworCXU4CWNuZldEU0FkZHJlc3NbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mV0RTQWRkcmVzc05fdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mTXVsdGljYXN0UE1CdWZmZXJpbmcgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZwogewotCVVJTlQxNgljbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZzsKKwl1MTYJY25mTXVsdGljYXN0UE1CdWZmZXJpbmc7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTXVsdGljYXN0UE1CdWZmZXJpbmdfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwMywxMyArMTA2NywxMyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogR3JvdXBBZGRyZXNzZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Hcm91cEFkZHJlc3NlcwogewotCVVJTlQ4CU1BQ0FkZHJlc3NbMTZdWzZdOworCXU4CU1BQ0FkZHJlc3NbMTZdWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0dyb3VwQWRkcmVzc2VzX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IENyZWF0ZUlCU1MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DcmVhdGVJQlNTCiB7Ci0JVUlOVDE2CUNyZWF0ZUlCU1M7CisJdTE2CUNyZWF0ZUlCU1M7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3JlYXRlSUJTU190OwogCiAjZGVmaW5lIEhGQTM4NHhfQ1JFQVRFSUJTU19KT0lOQ1JFQVRFSUJTUyAgICAgICAgICAwCkBAIC0xMTIwLDg3ICsxMDg0LDg3IEBACiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBGcmFnbWVudGF0aW9uVGhyZXNob2xkIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfRnJhZ21lbnRhdGlvblRocmVzaG9sZAogewotCVVJTlQxNglGcmFnbWVudGF0aW9uVGhyZXNob2xkOworCXUxNglGcmFnbWVudGF0aW9uVGhyZXNob2xkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0ZyYWdtZW50YXRpb25UaHJlc2hvbGRfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogUlRTVGhyZXNob2xkIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUlRTVGhyZXNob2xkCiB7Ci0JVUlOVDE2CVJUU1RocmVzaG9sZDsKKwl1MTYJUlRTVGhyZXNob2xkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1JUU1RocmVzaG9sZF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBUeFJhdGVDb250cm9sIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfVHhSYXRlQ29udHJvbAogewotCVVJTlQxNglUeFJhdGVDb250cm9sOworCXUxNglUeFJhdGVDb250cm9sOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1R4UmF0ZUNvbnRyb2xfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogUHJvbWlzY3VvdXNNb2RlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUHJvbWlzY3VvdXNNb2RlCiB7Ci0JVUlOVDE2CVByb21pc2N1b3VzTW9kZTsKKwl1MTYJUHJvbWlzY3VvdXNNb2RlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1Byb21pc2N1b3VzTW9kZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YQogewotCVVJTlQxNgljaGFubmVsTGlzdDsKLQlVSU5UMTYJdHhSYXRlOworCXUxNgljaGFubmVsTGlzdDsKKwl1MTYJdHhSYXRlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSG9zdFNjYW5SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YQogewotCVVJTlQxNgljaGFubmVsTGlzdDsKLQlVSU5UMTYJdHhSYXRlOworCXUxNgljaGFubmVsTGlzdDsKKwl1MTYJdHhSYXRlOwogCWhmYTM4NHhfYnl0ZXN0cjMyX3Qgc3NpZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBKb2luUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YQogewotCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKLQlVSU5UMTYJY2hhbm5lbDsKKwl1OAlic3NpZFtXTEFOX0JTU0lEX0xFTl07CisJdTE2CWNoYW5uZWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBhdXRoZW50aWNhdGVTdGF0aW9uIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGEKIHsKLQlVSU5UOAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDE2CWFsZ29yaXRobTsKKwl1OAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCXUxNglzdGF0dXM7CisJdTE2CWFsZ29yaXRobTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogYXNzb2NpYXRlU3RhdGlvbiAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYXNzb2NpYXRlU3RhdGlvbl9kYXRhCiB7Ci0JVUlOVDgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNgl0eXBlOworCXU4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07CisJdTE2CXN0YXR1czsKKwl1MTYJdHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9hc3NvY2lhdGVTdGF0aW9uX2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogQ2hhbm5lbEluZm9SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YQogewotCVVJTlQxNgljaGFubmVsTGlzdDsKLQlVSU5UMTYJY2hhbm5lbER3ZWxsVGltZTsKKwl1MTYJY2hhbm5lbExpc3Q7CisJdTE2CWNoYW5uZWxEd2VsbFRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogV0VQS2V5TWFwcGluZyAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfV0VQS2V5TWFwcGluZwogewotCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CWtleV9pbmRleDsKLQlVSU5UOCAJa2V5WzE2XTsKLQlVSU5UOCAJbWljX3RyYW5zbWl0X2tleVs0XTsKLQlVSU5UOCAJbWljX3JlY2VpdmVfa2V5WzRdOworCXU4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07CisJdTE2CWtleV9pbmRleDsKKwl1OCAJa2V5WzE2XTsKKwl1OCAJbWljX3RyYW5zbWl0X2tleVs0XTsKKwl1OCAJbWljX3JlY2VpdmVfa2V5WzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1dFUEtleU1hcHBpbmdfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogV1BBRGF0YSAgICAgICAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfV1BBRGF0YQogewotCVVJTlQxNglkYXRhbGVuOwotICAgICAgICBVSU5UOCAJZGF0YVswXTsgLy8gbWF4IDgwCisJdTE2CWRhdGFsZW47CisgICAgICAgIHU4IAlkYXRhWzBdOyAvLyBtYXggODAKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9XUEFEYXRhX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMTAsNyArMTE3NCw3IEBACiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBUaWNrVGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1RpY2tUaW1lCiB7Ci0JVUlOVDE2CVRpY2tUaW1lOworCXUxNglUaWNrVGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9UaWNrVGltZV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjIwLDE0NiArMTE4NCwxNDYgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNYXhMb2FkVGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01heExvYWRUaW1lCiB7Ci0JVUlOVDE2CU1heExvYWRUaW1lOworCXUxNglNYXhMb2FkVGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhMb2FkVGltZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRG93bkxvYWRCdWZmZXIgLS0qLwogLyogTk9URTogVGhlIHBhZ2UgYW5kIG9mZnNldCBhcmUgaW4gQVVYIGZvcm1hdCAqLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcgogewotCVVJTlQxNglwYWdlOwotCVVJTlQxNglvZmZzZXQ7Ci0JVUlOVDE2CWxlbjsKKwl1MTYJcGFnZTsKKwl1MTYJb2Zmc2V0OworCXUxNglsZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfZG93bmxvYWRidWZmZXJfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBSSUlkZW50aXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFJJSWRlbnRpdHkKIHsKLQlVSU5UMTYJUFJJQ29tcElEOwotCVVJTlQxNglQUklWYXJpYW50OwotCVVJTlQxNglQUklNYWpvclZlcnNpb247Ci0JVUlOVDE2CVBSSU1pbm9yVmVyc2lvbjsKKwl1MTYJUFJJQ29tcElEOworCXUxNglQUklWYXJpYW50OworCXUxNglQUklNYWpvclZlcnNpb247CisJdTE2CVBSSU1pbm9yVmVyc2lvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QUklJZGVudGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUFJJU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QUklTdXBSYW5nZQogewotCVVJTlQxNglQUklSb2xlOwotCVVJTlQxNglQUklJRDsKLQlVSU5UMTYJUFJJVmFyaWFudDsKLQlVSU5UMTYJUFJJQm90dG9tOwotCVVJTlQxNglQUklUb3A7CisJdTE2CVBSSVJvbGU7CisJdTE2CVBSSUlEOworCXUxNglQUklWYXJpYW50OworCXUxNglQUklCb3R0b207CisJdTE2CVBSSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QUklTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0ZJQWN0UmFuZ2VzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0ZJQWN0UmFuZ2VzCiB7Ci0JVUlOVDE2CUNGSVJvbGU7Ci0JVUlOVDE2CUNGSUlEOwotCVVJTlQxNglDRklWYXJpYW50OwotCVVJTlQxNglDRklCb3R0b207Ci0JVUlOVDE2CUNGSVRvcDsKKwl1MTYJQ0ZJUm9sZTsKKwl1MTYJQ0ZJSUQ7CisJdTE2CUNGSVZhcmlhbnQ7CisJdTE2CUNGSUJvdHRvbTsKKwl1MTYJQ0ZJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NGSUFjdFJhbmdlc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTklDU2VyaWFsTnVtYmVyIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTklDU2VyaWFsTnVtYmVyCiB7Ci0JVUlOVDgJTklDU2VyaWFsTnVtYmVyWzEyXTsKKwl1OAlOSUNTZXJpYWxOdW1iZXJbMTJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X05JQ1NlcmlhbE51bWJlcl90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTklDSWRlbnRpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9OSUNJZGVudGl0eQogewotCVVJTlQxNglOSUNDb21wSUQ7Ci0JVUlOVDE2CU5JQ1ZhcmlhbnQ7Ci0JVUlOVDE2CU5JQ01ham9yVmVyc2lvbjsKLQlVSU5UMTYJTklDTWlub3JWZXJzaW9uOworCXUxNglOSUNDb21wSUQ7CisJdTE2CU5JQ1ZhcmlhbnQ7CisJdTE2CU5JQ01ham9yVmVyc2lvbjsKKwl1MTYJTklDTWlub3JWZXJzaW9uOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X05JQ0lkZW50aXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNRklTdXBSYW5nZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01GSVN1cFJhbmdlCiB7Ci0JVUlOVDE2CU1GSVJvbGU7Ci0JVUlOVDE2CU1GSUlEOwotCVVJTlQxNglNRklWYXJpYW50OwotCVVJTlQxNglNRklCb3R0b207Ci0JVUlOVDE2CU1GSVRvcDsKKwl1MTYJTUZJUm9sZTsKKwl1MTYJTUZJSUQ7CisJdTE2CU1GSVZhcmlhbnQ7CisJdTE2CU1GSUJvdHRvbTsKKwl1MTYJTUZJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01GSVN1cFJhbmdlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDRklTdXBSYW5nZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NGSVN1cFJhbmdlCiB7Ci0JVUlOVDE2CUNGSVJvbGU7Ci0JVUlOVDE2CUNGSUlEOwotCVVJTlQxNglDRklWYXJpYW50OwotCVVJTlQxNglDRklCb3R0b207Ci0JVUlOVDE2CUNGSVRvcDsKKwl1MTYJQ0ZJUm9sZTsKKwl1MTYJQ0ZJSUQ7CisJdTE2CUNGSVZhcmlhbnQ7CisJdTE2CUNGSUJvdHRvbTsKKwl1MTYJQ0ZJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NGSVN1cFJhbmdlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBCVUlMRFNFUTpCdWlsZFNlcSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0J1aWxkU2VxIHsKLQlVSU5UMTYJcHJpbWFyeTsKLQlVSU5UMTYJc2Vjb25kYXJ5OworCXUxNglwcmltYXJ5OworCXUxNglzZWNvbmRhcnk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQnVpbGRTZXFfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEZXSUQgLS0qLwogI2RlZmluZSBIRkEzODR4X0ZXSURfTEVOCTE0CiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0ZXSUQgewotCVVJTlQ4CXByaW1hcnlbSEZBMzg0eF9GV0lEX0xFTl07Ci0JVUlOVDgJc2Vjb25kYXJ5W0hGQTM4NHhfRldJRF9MRU5dOworCXU4CXByaW1hcnlbSEZBMzg0eF9GV0lEX0xFTl07CisJdTgJc2Vjb25kYXJ5W0hGQTM4NHhfRldJRF9MRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0ZXSURfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENoYW5uZWxMaXN0IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hhbm5lbExpc3QKIHsKLQlVSU5UMTYJQ2hhbm5lbExpc3Q7CisJdTE2CUNoYW5uZWxMaXN0OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoYW5uZWxMaXN0X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBSZWd1bGF0b3J5RG9tYWlucyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1JlZ3VsYXRvcnlEb21haW5zCiB7Ci0JVUlOVDgJUmVndWxhdG9yeURvbWFpbnNbMTJdOworCXU4CVJlZ3VsYXRvcnlEb21haW5zWzEyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9SZWd1bGF0b3J5RG9tYWluc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogVGVtcFR5cGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UZW1wVHlwZQogewotCVVJTlQxNglUZW1wVHlwZTsKKwl1MTYJVGVtcFR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVGVtcFR5cGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENJUyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NJUwogewotCVVJTlQ4CUNJU1s0ODBdOworCXU4CUNJU1s0ODBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NJU190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU1RBSWRlbnRpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TVEFJZGVudGl0eQogewotCVVJTlQxNglTVEFDb21wSUQ7Ci0JVUlOVDE2CVNUQVZhcmlhbnQ7Ci0JVUlOVDE2CVNUQU1ham9yVmVyc2lvbjsKLQlVSU5UMTYJU1RBTWlub3JWZXJzaW9uOworCXUxNglTVEFDb21wSUQ7CisJdTE2CVNUQVZhcmlhbnQ7CisJdTE2CVNUQU1ham9yVmVyc2lvbjsKKwl1MTYJU1RBTWlub3JWZXJzaW9uOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NUQUlkZW50aXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTVEFTdXBSYW5nZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NUQVN1cFJhbmdlCiB7Ci0JVUlOVDE2CVNUQVJvbGU7Ci0JVUlOVDE2CVNUQUlEOwotCVVJTlQxNglTVEFWYXJpYW50OwotCVVJTlQxNglTVEFCb3R0b207Ci0JVUlOVDE2CVNUQVRvcDsKKwl1MTYJU1RBUm9sZTsKKwl1MTYJU1RBSUQ7CisJdTE2CVNUQVZhcmlhbnQ7CisJdTE2CVNUQUJvdHRvbTsKKwl1MTYJU1RBVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NUQVN1cFJhbmdlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNRklBY3RSYW5nZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NRklBY3RSYW5nZXMKIHsKLQlVSU5UMTYJTUZJUm9sZTsKLQlVSU5UMTYJTUZJSUQ7Ci0JVUlOVDE2CU1GSVZhcmlhbnQ7Ci0JVUlOVDE2CU1GSUJvdHRvbTsKLQlVSU5UMTYJTUZJVG9wOworCXUxNglNRklSb2xlOworCXUxNglNRklJRDsKKwl1MTYJTUZJVmFyaWFudDsKKwl1MTYJTUZJQm90dG9tOworCXUxNglNRklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTUZJQWN0UmFuZ2VzX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNjksMTQ1ICsxMzMzLDE0NSBAQAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBvcnRTdGF0dXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qb3J0U3RhdHVzCiB7Ci0JVUlOVDE2CVBvcnRTdGF0dXM7CisJdTE2CVBvcnRTdGF0dXM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUG9ydFN0YXR1c190OwogCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19ESVNBQkxFRAkoKFVJTlQxNikxKQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfU0VBUkNISU5HCSgoVUlOVDE2KTIpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0lCU1MJKChVSU5UMTYpMykKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fRVNTCSgoVUlOVDE2KTQpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19PVVRPRlJBTkdFCSgoVUlOVDE2KTUpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX1dEUwkoKFVJTlQxNik2KQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfRElTQUJMRUQJKCh1MTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX1NFQVJDSElORwkoKHUxNikyKQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgodTE2KTMpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0VTUwkoKHUxNik0KQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfT1VUT0ZSQU5HRQkoKHUxNik1KQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9XRFMJKCh1MTYpNikKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRTU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFNTSUQKIHsKLQlVSU5UOAlDdXJyZW50U1NJRFszNF07CisJdTgJQ3VycmVudFNTSURbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRTU0lEX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50QlNTSUQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50QlNTSUQKIHsKLQlVSU5UOAlDdXJyZW50QlNTSURbNl07CisJdTgJQ3VycmVudEJTU0lEWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRCU1NJRF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogY29tbXNxdWFsaXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY29tbXNxdWFsaXR5CiB7Ci0JVUlOVDE2CUNRX2N1cnJCU1M7Ci0JVUlOVDE2CUFTTF9jdXJyQlNTOwotCVVJTlQxNglBTkxfY3VyckZDOworCXUxNglDUV9jdXJyQlNTOworCXUxNglBU0xfY3VyckJTUzsKKwl1MTYJQU5MX2N1cnJGQzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jb21tc3F1YWxpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGRtYmNvbW1zcXVhbGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eQogewotCVVJTlQxNglDUWRibV9jdXJyQlNTOwotCVVJTlQxNglBU0xkYm1fY3VyckJTUzsKLQlVSU5UMTYJQU5MZGJtX2N1cnJGQzsKKwl1MTYJQ1FkYm1fY3VyckJTUzsKKwl1MTYJQVNMZGJtX2N1cnJCU1M7CisJdTE2CUFOTGRibV9jdXJyRkM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50VHhSYXRlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFR4UmF0ZQogewotCVVJTlQxNglDdXJyZW50VHhSYXRlOworCXUxNglDdXJyZW50VHhSYXRlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRUeFJhdGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRCZWFjb25JbnRlcnZhbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRCZWFjb25JbnRlcnZhbAogewotCVVJTlQxNglDdXJyZW50QmVhY29uSW50ZXJ2YWw7CisJdTE2CUN1cnJlbnRCZWFjb25JbnRlcnZhbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50QmVhY29uSW50ZXJ2YWxfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRTY2FsZVRocmVzaG9sZHMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50U2NhbGVUaHJlc2hvbGRzCiB7Ci0JVUlOVDE2CUVuZXJneURldGVjdFRocmVzaG9sZDsKLQlVSU5UMTYJQ2FycmllckRldGVjdFRocmVzaG9sZDsKLQlVSU5UMTYJRGVmZXJEZXRlY3RUaHJlc2hvbGQ7Ci0JVUlOVDE2CUNlbGxTZWFyY2hUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KLQlVSU5UMTYJRGVhZFNwb3RUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KKwl1MTYJRW5lcmd5RGV0ZWN0VGhyZXNob2xkOworCXUxNglDYXJyaWVyRGV0ZWN0VGhyZXNob2xkOworCXUxNglEZWZlckRldGVjdFRocmVzaG9sZDsKKwl1MTYJQ2VsbFNlYXJjaFRocmVzaG9sZDsgLyogU3RhdGlvbnMgb25seSAqLworCXUxNglEZWFkU3BvdFRocmVzaG9sZDsgLyogU3RhdGlvbnMgb25seSAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRTY2FsZVRocmVzaG9sZHNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFByb3RvY29sUnNwVGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1Byb3RvY29sUnNwVGltZQogewotCVVJTlQxNglQcm90b2NvbFJzcFRpbWU7CisJdTE2CVByb3RvY29sUnNwVGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Qcm90b2NvbFJzcFRpbWVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFNob3J0UmV0cnlMaW1pdCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1Nob3J0UmV0cnlMaW1pdAogewotCVVJTlQxNglTaG9ydFJldHJ5TGltaXQ7CisJdTE2CVNob3J0UmV0cnlMaW1pdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TaG9ydFJldHJ5TGltaXRfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IExvbmdSZXRyeUxpbWl0IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTG9uZ1JldHJ5TGltaXQKIHsKLQlVSU5UMTYJTG9uZ1JldHJ5TGltaXQ7CisJdTE2CUxvbmdSZXRyeUxpbWl0OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xvbmdSZXRyeUxpbWl0X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNYXhUcmFuc21pdExpZmV0aW1lIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTWF4VHJhbnNtaXRMaWZldGltZQogewotCVVJTlQxNglNYXhUcmFuc21pdExpZmV0aW1lOworCXUxNglNYXhUcmFuc21pdExpZmV0aW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01heFRyYW5zbWl0TGlmZXRpbWVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE1heFJlY2VpdmVMaWZldGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01heFJlY2VpdmVMaWZldGltZQogewotCVVJTlQxNglNYXhSZWNlaXZlTGlmZXRpbWU7CisJdTE2CU1heFJlY2VpdmVMaWZldGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhSZWNlaXZlTGlmZXRpbWVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENGUG9sbGFibGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DRlBvbGxhYmxlCiB7Ci0JVUlOVDE2CUNGUG9sbGFibGU7CisJdTE2CUNGUG9sbGFibGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0ZQb2xsYWJsZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQXV0aGVudGljYXRpb25BbGdvcml0aG1zIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zCiB7Ci0JVUlOVDE2CUF1dGhlbnRpY2F0aW9uVHlwZTsKLQlVSU5UMTYJVHlwZUVuYWJsZWQ7CisJdTE2CUF1dGhlbnRpY2F0aW9uVHlwZTsKKwl1MTYJVHlwZUVuYWJsZWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMKIChkYXRhIG9ubHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXNfZGF0YQogewotCVVJTlQxNglBdXRoZW50aWNhdGlvblR5cGU7Ci0JVUlOVDE2CVR5cGVFbmFibGVkOworCXUxNglBdXRoZW50aWNhdGlvblR5cGU7CisJdTE2CVR5cGVFbmFibGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc19kYXRhX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQKIHsKLQlVSU5UMTYJUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkOworCXUxNglQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBPd25NQUNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfT3duTUFDQWRkcmVzcwogewotCVVJTlQ4CU93bk1BQ0FkZHJlc3NbNl07CisJdTgJT3duTUFDQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Pd25NQUNBZGRyZXNzX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQQ0ZJbmZvIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUENGSW5mbwogewotCVVJTlQxNglNZWRpdW1PY2N1cGFuY3lMaW1pdDsKLQlVSU5UMTYJQ0ZQUGVyaW9kOwotCVVJTlQxNglDRlBNYXhEdXJhdGlvbjsKLQlVSU5UMTYJQ0ZQRmxhZ3M7CisJdTE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OworCXUxNglDRlBQZXJpb2Q7CisJdTE2CUNGUE1heER1cmF0aW9uOworCXUxNglDRlBGbGFnczsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QQ0ZJbmZvX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQQ0ZJbmZvIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QQ0ZJbmZvX2RhdGEKIHsKLQlVSU5UMTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7Ci0JVUlOVDE2CUNGUFBlcmlvZDsKLQlVSU5UMTYJQ0ZQTWF4RHVyYXRpb247Ci0JVUlOVDE2CUNGUEZsYWdzOworCXUxNglNZWRpdW1PY2N1cGFuY3lMaW1pdDsKKwl1MTYJQ0ZQUGVyaW9kOworCXUxNglDRlBNYXhEdXJhdGlvbjsKKwl1MTYJQ0ZQRmxhZ3M7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUENGSW5mb19kYXRhX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1MTcsMzkgKzE0ODEsMzkgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQSFlUeXBlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUEhZVHlwZQogewotCVVJTlQxNglQSFlUeXBlOworCXUxNglQSFlUeXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BIWVR5cGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEN1cnJlbnRDaGFubmVsIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudENoYW5uZWwKIHsKLQlVSU5UMTYJQ3VycmVudENoYW5uZWw7CisJdTE2CUN1cnJlbnRDaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0N1cnJlbnRDaGFubmVsX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50UG93ZXJTdGF0ZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRQb3dlclN0YXRlCiB7Ci0JVUlOVDE2CUN1cnJlbnRQb3dlclN0YXRlOworCXUxNglDdXJyZW50UG93ZXJTdGF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50UG93ZXJTdGF0ZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0NBTW9kZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NDQU1vZGUKIHsKLQlVSU5UMTYJQ0NBTW9kZTsKKwl1MTYJQ0NBTW9kZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DQ0FNb2RlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTdXBwb3J0ZWREYXRhUmF0ZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TdXBwb3J0ZWREYXRhUmF0ZXMKIHsKLQlVSU5UOAlTdXBwb3J0ZWREYXRhUmF0ZXNbMTBdOworCXU4CVN1cHBvcnRlZERhdGFSYXRlc1sxMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU3VwcG9ydGVkRGF0YVJhdGVzX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBMRk9TdGF0dXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9MRk9TdGF0dXMKIHsKLQlVSU5UMTYgIFRlc3RSZXN1bHRzOwotCVVJTlQxNiAgTEZPUmVzdWx0OwotCVVJTlQxNiAgVlJIRk9SZXN1bHQ7CisJdTE2ICBUZXN0UmVzdWx0czsKKwl1MTYgIExGT1Jlc3VsdDsKKwl1MTYgIFZSSEZPUmVzdWx0OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xGT1N0YXR1c190OwogCiAjZGVmaW5lIEhGQTM4NHhfVEVTVFJFU1VMVF9BTExQQVNTRUQgICAgQklUMApAQCAtMTU2MSwxMSArMTUyNSwxMSBAQAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IExFRENvbnRyb2wgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9MRURDb250cm9sCiB7Ci0JVUlOVDE2ICBzZWFyY2hpbmdfb247Ci0JVUlOVDE2ICBzZWFyY2hpbmdfb2ZmOwotCVVJTlQxNiAgYXNzb2Nfb247Ci0JVUlOVDE2ICBhc3NvY19vZmY7Ci0JVUlOVDE2ICBhY3Rpdml0eTsKKwl1MTYgIHNlYXJjaGluZ19vbjsKKwl1MTYgIHNlYXJjaGluZ19vZmY7CisJdTE2ICBhc3NvY19vbjsKKwl1MTYgIGFzc29jX29mZjsKKwl1MTYgIGFjdGl2aXR5OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xFRENvbnRyb2xfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU3NiwzMiArMTU0MCwzMiBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29udHJvbCBJbmZvIChvZmZzZXQgNDQtNTEpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NUQVRVU19PRkYJCQkoKFVJTlQxNikweDQ0KQotI2RlZmluZQkJSEZBMzg0eF9GRF9USU1FX09GRgkJCSgoVUlOVDE2KTB4NDYpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NXU1VQUE9SVF9PRkYJCSgoVUlOVDE2KTB4NEEpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NJTEVOQ0VfT0ZGCQkJKChVSU5UMTYpMHg0QSkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU0lHTkFMX09GRgkJCSgoVUlOVDE2KTB4NEIpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1JBVEVfT0ZGCQkJKChVSU5UMTYpMHg0QykKLSNkZWZpbmUJCUhGQTM4NHhfRkRfUlhGTE9XX09GRgkJCSgoVUlOVDE2KTB4NEQpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1JFU0VSVkVEX09GRgkJCSgoVUlOVDE2KTB4NEUpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1RYQ09OVFJPTF9PRkYJCSgoVUlOVDE2KTB4NTApCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NUQVRVU19PRkYJCQkoKHUxNikweDQ0KQorI2RlZmluZQkJSEZBMzg0eF9GRF9USU1FX09GRgkJCSgodTE2KTB4NDYpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NXU1VQUE9SVF9PRkYJCSgodTE2KTB4NEEpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NJTEVOQ0VfT0ZGCQkJKCh1MTYpMHg0QSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU0lHTkFMX09GRgkJCSgodTE2KTB4NEIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1JBVEVfT0ZGCQkJKCh1MTYpMHg0QykKKyNkZWZpbmUJCUhGQTM4NHhfRkRfUlhGTE9XX09GRgkJCSgodTE2KTB4NEQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1JFU0VSVkVEX09GRgkJCSgodTE2KTB4NEUpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1RYQ09OVFJPTF9PRkYJCSgodTE2KTB4NTApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA4MDIuMTEgSGVhZGVyIChvZmZzZXQgNTItNkIpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0ZSQU1FQ09OVFJPTF9PRkYJCSgoVUlOVDE2KTB4NTIpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0RVUkFUSU9OSURfT0ZGCQkoKFVJTlQxNikweDU0KQotI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTMV9PRkYJCQkoKFVJTlQxNikweDU2KQotI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTMl9PRkYJCQkoKFVJTlQxNikweDVDKQotI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTM19PRkYJCQkoKFVJTlQxNikweDYyKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TRVFDT05UUk9MX09GRgkJKChVSU5UMTYpMHg2OCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzRfT0ZGCQkJKChVSU5UMTYpMHg2QSkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfREFUQUxFTl9PRkYJCQkoKFVJTlQxNikweDcwKQorI2RlZmluZQkJSEZBMzg0eF9GRF9GUkFNRUNPTlRST0xfT0ZGCQkoKHUxNikweDUyKQorI2RlZmluZQkJSEZBMzg0eF9GRF9EVVJBVElPTklEX09GRgkJKCh1MTYpMHg1NCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzFfT0ZGCQkJKCh1MTYpMHg1NikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzJfT0ZGCQkJKCh1MTYpMHg1QykKKyNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzNfT0ZGCQkJKCh1MTYpMHg2MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU0VRQ09OVFJPTF9PRkYJCSgodTE2KTB4NjgpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1M0X09GRgkJCSgodTE2KTB4NkEpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5fT0ZGCQkJKCh1MTYpMHg3MCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDgwMi4zIEhlYWRlciAob2Zmc2V0IDcyLTdGKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9GRF9ERVNUQUREUkVTU19PRkYJCSgoVUlOVDE2KTB4NzIpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NSQ0FERFJFU1NfT0ZGCQkoKFVJTlQxNikweDc4KQotI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOR1RIX09GRgkJKChVSU5UMTYpMHg3RSkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfREVTVEFERFJFU1NfT0ZGCQkoKHUxNikweDcyKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TUkNBRERSRVNTX09GRgkJKCh1MTYpMHg3OCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfREFUQUxFTkdUSF9PRkYJCSgodTE2KTB4N0UpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZSQU1FIFNUUlVDVFVSRVM6IENvbW11bmljYXRpb24gRnJhbWVzCkBAIC0xNjExLDY3ICsxNTc1LDY3IEBACiAvKi0tIENvbW11bmljYXRpb24gRnJhbWU6IFRyYW5zbWl0IEZyYW1lIFN0cnVjdHVyZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lCiB7Ci0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMTYJcmVzZXJ2ZWQxOwotCVVJTlQxNglyZXNlcnZlZDI7Ci0JVUlOVDMyCXN3X3N1cHBvcnQ7Ci0JVUlOVDgJdHhfcmV0cnljb3VudDsKLQlVSU5UOCAgIHR4X3JhdGU7Ci0JVUlOVDE2CXR4X2NvbnRyb2w7CisJdTE2CXN0YXR1czsKKwl1MTYJcmVzZXJ2ZWQxOworCXUxNglyZXNlcnZlZDI7CisJdTMyCXN3X3N1cHBvcnQ7CisJdTgJdHhfcmV0cnljb3VudDsKKwl1OCAgIHR4X3JhdGU7CisJdTE2CXR4X2NvbnRyb2w7CiAKIAkvKi0tIDgwMi4xMSBIZWFkZXIgSW5mb3JtYXRpb24gLS0qLwogCi0JVUlOVDE2CWZyYW1lX2NvbnRyb2w7Ci0JVUlOVDE2CWR1cmF0aW9uX2lkOwotCVVJTlQ4CWFkZHJlc3MxWzZdOwotCVVJTlQ4CWFkZHJlc3MyWzZdOwotCVVJTlQ4CWFkZHJlc3MzWzZdOwotCVVJTlQxNglzZXF1ZW5jZV9jb250cm9sOwotCVVJTlQ4CWFkZHJlc3M0WzZdOwotCVVJTlQxNglkYXRhX2xlbjsgLyogbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKwl1MTYJZnJhbWVfY29udHJvbDsKKwl1MTYJZHVyYXRpb25faWQ7CisJdTgJYWRkcmVzczFbNl07CisJdTgJYWRkcmVzczJbNl07CisJdTgJYWRkcmVzczNbNl07CisJdTE2CXNlcXVlbmNlX2NvbnRyb2w7CisJdTgJYWRkcmVzczRbNl07CisJdTE2CWRhdGFfbGVuOyAvKiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAqLwogCiAJLyotLSA4MDIuMyBIZWFkZXIgSW5mb3JtYXRpb24gLS0qLwogCi0JVUlOVDgJZGVzdF9hZGRyWzZdOwotCVVJTlQ4CXNyY19hZGRyWzZdOwotCVVJTlQxNglkYXRhX2xlbmd0aDsgLyogYmlnIGVuZGlhbiBmb3JtYXQgKi8KKwl1OAlkZXN0X2FkZHJbNl07CisJdTgJc3JjX2FkZHJbNl07CisJdTE2CWRhdGFfbGVuZ3RoOyAvKiBiaWcgZW5kaWFuIGZvcm1hdCAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3R4X2ZyYW1lX3Q7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21tdW5pY2F0aW9uIEZyYW1lczogRmllbGQgTWFza3MgZm9yIFRyYW5zbWl0IEZyYW1lcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLSBTdGF0dXMgRmllbGQgLS0qLwotI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIJCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSCQkoKFVJTlQxNilCSVQzKQotI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19ESVNDT04JCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUgkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSCQkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUgkJKCh1MTYpQklUMykKKyNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OCQkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUgkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIJCSgodTE2KUJJVDApCiAvKi0tIFRyYW5zbWl0IENvbnRyb2wgRmllbGQgLS0qLwotI2RlZmluZQkJSEZBMzg0eF9UWF9DRlBPTEwJCQkoKFVJTlQxNilCSVQxMikKLSNkZWZpbmUJCUhGQTM4NHhfVFhfUFJTVAkJCQkoKFVJTlQxNilCSVQxMSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhfTUFDUE9SVAkJCSgoVUlOVDE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhfTk9FTkNSWVBUCQkJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfVFhfUkVUUllTVFJBVAkJCSgoVUlOVDE2KShCSVQ2IHwgQklUNSkpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1NUUlVDVFlQRQkJCSgoVUlOVDE2KShCSVQ0IHwgQklUMykpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1RYRVgJCQkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfVFhfVFhPSwkJCQkoKFVJTlQxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9UWF9DRlBPTEwJCQkoKHUxNilCSVQxMikKKyNkZWZpbmUJCUhGQTM4NHhfVFhfUFJTVAkJCQkoKHUxNilCSVQxMSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfTUFDUE9SVAkJCSgodTE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfTk9FTkNSWVBUCQkJKCh1MTYpQklUNykKKyNkZWZpbmUJCUhGQTM4NHhfVFhfUkVUUllTVFJBVAkJCSgodTE2KShCSVQ2IHwgQklUNSkpCisjZGVmaW5lCQlIRkEzODR4X1RYX1NUUlVDVFlQRQkJCSgodTE2KShCSVQ0IHwgQklUMykpCisjZGVmaW5lCQlIRkEzODR4X1RYX1RYRVgJCQkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfVFhfVFhPSwkJCQkoKHUxNilCSVQxKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFRyYW5zbWl0IEZyYW1lcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLSBTdGF0dXMgRmllbGQgLS0qLwogI2RlZmluZSBIRkEzODR4X1RYU1RBVFVTX0lTRVJST1IodikJXAotCSgoKFVJTlQxNikodikpJlwKKwkoKCh1MTYpKHYpKSZcCiAJKEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSfEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUnxcCiAJSEZBMzg0eF9UWFNUQVRVU19ESVNDT058SEZBMzg0eF9UWFNUQVRVU19BR0VERVJSfFwKIAlIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSKSkKIAotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUNLRVJSKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIpKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRk9STUVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUikpCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNESVNDT04odikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0RJU0NPTikpCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNBR0VERVJSKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSKSkKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU1JFVFJZRVJSKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNBQ0tFUlIodikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0FDS0VSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNGT1JNRVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0RJU0NPTih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfRElTQ09OKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FHRURFUlIodikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTUkVUUllFUlIodikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSKSkKIAotI2RlZmluZQlIRkEzODR4X1RYX0dFVCh2LG0scykJCSgoKChVSU5UMTYpKHYpKSYoKFVJTlQxNikobSkpKT4+KChVSU5UMTYpKHMpKSkKLSNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodixtLHMpCQkoKCgoVUlOVDE2KSh2KSk8PCgoVUlOVDE2KShzKSkpJigoVUlOVDE2KShtKSkpCisjZGVmaW5lCUhGQTM4NHhfVFhfR0VUKHYsbSxzKQkJKCgoKHUxNikodikpJigodTE2KShtKSkpPj4oKHUxNikocykpKQorI2RlZmluZQlIRkEzODR4X1RYX1NFVCh2LG0scykJCSgoKCh1MTYpKHYpKTw8KCh1MTYpKHMpKSkmKCh1MTYpKG0pKSkKIAogI2RlZmluZQlIRkEzODR4X1RYX0NGUE9MTF9HRVQodikJSEZBMzg0eF9UWF9HRVQodiwgSEZBMzg0eF9UWF9DRlBPTEwsMTIpCiAjZGVmaW5lCUhGQTM4NHhfVFhfQ0ZQT0xMX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX0NGUE9MTCwxMikKQEAgLTE2OTYsNzAgKzE2NjAsNzAgQEAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUKIHsKIAkvKi0tIE1BQyByeCBkZXNjcmlwdG9yIChoZmEzODR4IGJ5dGUgb3JkZXIpIC0tKi8KLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQzMgl0aW1lOwotCVVJTlQ4CXNpbGVuY2U7Ci0JVUlOVDgJc2lnbmFsOwotCVVJTlQ4CXJhdGU7Ci0JVUlOVDgJcnhfZmxvdzsKLQlVSU5UMTYJcmVzZXJ2ZWQxOwotCVVJTlQxNglyZXNlcnZlZDI7CisJdTE2CXN0YXR1czsKKwl1MzIJdGltZTsKKwl1OAlzaWxlbmNlOworCXU4CXNpZ25hbDsKKwl1OAlyYXRlOworCXU4CXJ4X2Zsb3c7CisJdTE2CXJlc2VydmVkMTsKKwl1MTYJcmVzZXJ2ZWQyOwogCiAJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uICg4MDIuMTEgYnl0ZSBvcmRlcikgLS0qLwotCVVJTlQxNglmcmFtZV9jb250cm9sOwotCVVJTlQxNglkdXJhdGlvbl9pZDsKLQlVSU5UOAlhZGRyZXNzMVs2XTsKLQlVSU5UOAlhZGRyZXNzMls2XTsKLQlVSU5UOAlhZGRyZXNzM1s2XTsKLQlVSU5UMTYJc2VxdWVuY2VfY29udHJvbDsKLQlVSU5UOAlhZGRyZXNzNFs2XTsKLQlVSU5UMTYJZGF0YV9sZW47IC8qIGhmYTM4NHggKGxpdHRsZSBlbmRpYW4pIGZvcm1hdCAqLworCXUxNglmcmFtZV9jb250cm9sOworCXUxNglkdXJhdGlvbl9pZDsKKwl1OAlhZGRyZXNzMVs2XTsKKwl1OAlhZGRyZXNzMls2XTsKKwl1OAlhZGRyZXNzM1s2XTsKKwl1MTYJc2VxdWVuY2VfY29udHJvbDsKKwl1OAlhZGRyZXNzNFs2XTsKKwl1MTYJZGF0YV9sZW47IC8qIGhmYTM4NHggKGxpdHRsZSBlbmRpYW4pIGZvcm1hdCAqLwogCiAJLyotLSA4MDIuMyBIZWFkZXIgSW5mb3JtYXRpb24gLS0qLwotCVVJTlQ4CWRlc3RfYWRkcls2XTsKLQlVSU5UOAlzcmNfYWRkcls2XTsKLQlVSU5UMTYJZGF0YV9sZW5ndGg7IC8qIElFRUU/IChiaWcgZW5kaWFuKSBmb3JtYXQgKi8KKwl1OAlkZXN0X2FkZHJbNl07CisJdTgJc3JjX2FkZHJbNl07CisJdTE2CWRhdGFfbGVuZ3RoOyAvKiBJRUVFPyAoYmlnIGVuZGlhbikgZm9ybWF0ICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcnhfZnJhbWVfdDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgUmVjZWl2ZSBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0gT2Zmc2V0cyAtLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfTEVOX09GRgkJCSgoVUlOVDE2KTQ0KQotI2RlZmluZQkJSEZBMzg0eF9SWF84MDIxMUhEUl9PRkYJCQkoKFVJTlQxNikxNCkKLSNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9PRkYJCQkoKFVJTlQxNik2MCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9MRU5fT0ZGCQkJKCh1MTYpNDQpCisjZGVmaW5lCQlIRkEzODR4X1JYXzgwMjExSERSX09GRgkJCSgodTE2KTE0KQorI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX09GRgkJCSgodTE2KTYwKQogCiAvKi0tIFN0YXR1cyBGaWVsZHMgLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFCQkoKFVJTlQxNikoQklUMTUgfCBCSVQxNCB8IEJJVDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVAkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IJCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIJCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFCQkoKHUxNikoQklUMTUgfCBCSVQxNCB8IEJJVDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVAkJKCh1MTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IJCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIJCQkoKHUxNilCSVQwKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFJlY2VpdmUgRnJhbWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfR0VUKHZhbHVlKQkoKFVJTlQxNikoKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFKSA+PiAxMykpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTMpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVCkgPj4gOCkpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgOCkpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTVU5ERUNSKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX1VOREVDUikpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUikpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfR0VUKHZhbHVlKQkoKHUxNikoKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFKSA+PiAxMykpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01TR1RZUEVfU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTMpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVCkgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgOCkpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTVU5ERUNSKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX1VOREVDUikpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUikpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgRlJBTUUgU1RSVUNUVVJFUzogSW5mb3JtYXRpb24gVHlwZXMgYW5kIEluZm9ybWF0aW9uIEZyYW1lIFN0cnVjdHVyZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFR5cGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSQUREUgkJCSgoVUlOVDE2KTB4RjAwMFVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkRFQVVUSEFERFJFU1MJKChVSU5UMTYpMHhGMDAxVUwpLy9BUCAxLjMuNwotI2RlZmluZQkJSEZBMzg0eF9JVF9DT01NVEFMTElFUwkJCSgoVUlOVDE2KTB4RjEwMFVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9TQ0FOUkVTVUxUUwkJCSgoVUlOVDE2KTB4RjEwMVVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9DSElORk9SRVNVTFRTCQkoKFVJTlQxNikweEYxMDJVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfSE9TVFNDQU5SRVNVTFRTCQkoKFVJTlQxNikweEYxMDNVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfTElOS1NUQVRVUwkJCSgoVUlOVDE2KTB4RjIwMFVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1NUQVRVUwkJCSgoVUlOVDE2KTB4RjIwMVVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9BVVRIUkVRCQkJKChVSU5UMTYpMHhGMjAyVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX1BTVVNFUkNOVAkJCSgoVUlOVDE2KTB4RjIwM1VMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9LRVlJRENIQU5HRUQJCQkoKFVJTlQxNikweEYyMDRVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NSRVEgICAgCQkJKChVSU5UMTYpMHhGMjA1VUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX01JQ0ZBSUxVUkUgIAkJCSgoVUlOVDE2KTB4RjIwNlVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkFERFIJCQkoKHUxNikweEYwMDBVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJERUFVVEhBRERSRVNTCSgodTE2KTB4RjAwMVVMKS8vQVAgMS4zLjcKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQ09NTVRBTExJRVMJCQkoKHUxNikweEYxMDBVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfU0NBTlJFU1VMVFMJCQkoKHUxNikweEYxMDFVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQ0hJTkZPUkVTVUxUUwkJKCh1MTYpMHhGMTAyVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0hPU1RTQ0FOUkVTVUxUUwkJKCh1MTYpMHhGMTAzVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0xJTktTVEFUVVMJCQkoKHUxNikweEYyMDBVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NTVEFUVVMJCQkoKHUxNikweEYyMDFVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfQVVUSFJFUQkJCSgodTE2KTB4RjIwMlVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9QU1VTRVJDTlQJCQkoKHUxNikweEYyMDNVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfS0VZSURDSEFOR0VECQkJKCh1MTYpMHhGMjA0VUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DUkVRICAgIAkJCSgodTE2KTB4RjIwNVVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9NSUNGQUlMVVJFICAJCQkoKHUxNikweEYyMDZVTCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gRnJhbWVzIFN0cnVjdHVyZXMKQEAgLTE3NjksODAgKzE3MzMsODAgQEAKIC8qLS0gIE5vdGlmaWNhdGlvbiBGcmFtZSxNQUMgTWdtdDogSGFuZG92ZXIgQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hhbmRvdmVyQWRkcgogewotCVVJTlQxNglmcmFtZWxlbjsKLQlVSU5UMTYJaW5mb3R5cGU7Ci0JVUlOVDgJaGFuZG92ZXJfYWRkcltXTEFOX0JTU0lEX0xFTl07CisJdTE2CWZyYW1lbGVuOworCXUxNglpbmZvdHlwZTsKKwl1OAloYW5kb3Zlcl9hZGRyW1dMQU5fQlNTSURfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9IYW5kb3ZlckFkZHJfdDsKIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IENvbW11bmljYXRpb24gVGFsbGllcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMTYKIHsKLQlVSU5UMTYJdHh1bmljYXN0ZnJhbWVzOwotCVVJTlQxNgl0eG11bHRpY2FzdGZyYW1lczsKLQlVSU5UMTYJdHhmcmFnbWVudHM7Ci0JVUlOVDE2CXR4dW5pY2FzdG9jdGV0czsKLQlVSU5UMTYJdHhtdWx0aWNhc3RvY3RldHM7Ci0JVUlOVDE2CXR4ZGVmZXJyZWR0cmFuczsKLQlVSU5UMTYJdHhzaW5nbGVyZXRyeWZyYW1lczsKLQlVSU5UMTYJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOwotCVVJTlQxNgl0eHJldHJ5bGltaXRleGNlZWRlZDsKLQlVSU5UMTYJdHhkaXNjYXJkczsKLQlVSU5UMTYJcnh1bmljYXN0ZnJhbWVzOwotCVVJTlQxNglyeG11bHRpY2FzdGZyYW1lczsKLQlVSU5UMTYJcnhmcmFnbWVudHM7Ci0JVUlOVDE2CXJ4dW5pY2FzdG9jdGV0czsKLQlVSU5UMTYJcnhtdWx0aWNhc3RvY3RldHM7Ci0JVUlOVDE2CXJ4ZmNzZXJyb3JzOwotCVVJTlQxNglyeGRpc2NhcmRzbm9idWZmZXI7Ci0JVUlOVDE2CXR4ZGlzY2FyZHN3cm9uZ3NhOwotCVVJTlQxNglyeGRpc2NhcmRzd2VwdW5kZWNyOwotCVVJTlQxNglyeG1zZ2lubXNnZnJhZzsKLQlVSU5UMTYJcnhtc2dpbmJhZG1zZ2ZyYWc7CisJdTE2CXR4dW5pY2FzdGZyYW1lczsKKwl1MTYJdHhtdWx0aWNhc3RmcmFtZXM7CisJdTE2CXR4ZnJhZ21lbnRzOworCXUxNgl0eHVuaWNhc3RvY3RldHM7CisJdTE2CXR4bXVsdGljYXN0b2N0ZXRzOworCXUxNgl0eGRlZmVycmVkdHJhbnM7CisJdTE2CXR4c2luZ2xlcmV0cnlmcmFtZXM7CisJdTE2CXR4bXVsdGlwbGVyZXRyeWZyYW1lczsKKwl1MTYJdHhyZXRyeWxpbWl0ZXhjZWVkZWQ7CisJdTE2CXR4ZGlzY2FyZHM7CisJdTE2CXJ4dW5pY2FzdGZyYW1lczsKKwl1MTYJcnhtdWx0aWNhc3RmcmFtZXM7CisJdTE2CXJ4ZnJhZ21lbnRzOworCXUxNglyeHVuaWNhc3RvY3RldHM7CisJdTE2CXJ4bXVsdGljYXN0b2N0ZXRzOworCXUxNglyeGZjc2Vycm9yczsKKwl1MTYJcnhkaXNjYXJkc25vYnVmZmVyOworCXUxNgl0eGRpc2NhcmRzd3JvbmdzYTsKKwl1MTYJcnhkaXNjYXJkc3dlcHVuZGVjcjsKKwl1MTYJcnhtc2dpbm1zZ2ZyYWc7CisJdTE2CXJ4bXNnaW5iYWRtc2dmcmFnOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NvbW1UYWxsaWVzMTZfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyCiB7Ci0JVUlOVDMyCXR4dW5pY2FzdGZyYW1lczsKLQlVSU5UMzIJdHhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXR4ZnJhZ21lbnRzOwotCVVJTlQzMgl0eHVuaWNhc3RvY3RldHM7Ci0JVUlOVDMyCXR4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQzMgl0eGRlZmVycmVkdHJhbnM7Ci0JVUlOVDMyCXR4c2luZ2xlcmV0cnlmcmFtZXM7Ci0JVUlOVDMyCXR4bXVsdGlwbGVyZXRyeWZyYW1lczsKLQlVSU5UMzIJdHhyZXRyeWxpbWl0ZXhjZWVkZWQ7Ci0JVUlOVDMyCXR4ZGlzY2FyZHM7Ci0JVUlOVDMyCXJ4dW5pY2FzdGZyYW1lczsKLQlVSU5UMzIJcnhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXJ4ZnJhZ21lbnRzOwotCVVJTlQzMglyeHVuaWNhc3RvY3RldHM7Ci0JVUlOVDMyCXJ4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQzMglyeGZjc2Vycm9yczsKLQlVSU5UMzIJcnhkaXNjYXJkc25vYnVmZmVyOwotCVVJTlQzMgl0eGRpc2NhcmRzd3JvbmdzYTsKLQlVSU5UMzIJcnhkaXNjYXJkc3dlcHVuZGVjcjsKLQlVSU5UMzIJcnhtc2dpbm1zZ2ZyYWc7Ci0JVUlOVDMyCXJ4bXNnaW5iYWRtc2dmcmFnOworCXUzMgl0eHVuaWNhc3RmcmFtZXM7CisJdTMyCXR4bXVsdGljYXN0ZnJhbWVzOworCXUzMgl0eGZyYWdtZW50czsKKwl1MzIJdHh1bmljYXN0b2N0ZXRzOworCXUzMgl0eG11bHRpY2FzdG9jdGV0czsKKwl1MzIJdHhkZWZlcnJlZHRyYW5zOworCXUzMgl0eHNpbmdsZXJldHJ5ZnJhbWVzOworCXUzMgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7CisJdTMyCXR4cmV0cnlsaW1pdGV4Y2VlZGVkOworCXUzMgl0eGRpc2NhcmRzOworCXUzMglyeHVuaWNhc3RmcmFtZXM7CisJdTMyCXJ4bXVsdGljYXN0ZnJhbWVzOworCXUzMglyeGZyYWdtZW50czsKKwl1MzIJcnh1bmljYXN0b2N0ZXRzOworCXUzMglyeG11bHRpY2FzdG9jdGV0czsKKwl1MzIJcnhmY3NlcnJvcnM7CisJdTMyCXJ4ZGlzY2FyZHNub2J1ZmZlcjsKKwl1MzIJdHhkaXNjYXJkc3dyb25nc2E7CisJdTMyCXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7CisJdTMyCXJ4bXNnaW5tc2dmcmFnOworCXUzMglyeG1zZ2luYmFkbXNnZnJhZzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Db21tVGFsbGllczMyX3Q7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBTY2FuIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHRTdWIKIHsKLQlVSU5UMTYJY2hpZDsKLQlVSU5UMTYJYW5sOwotCVVJTlQxNglzbDsKLQlVSU5UOAlic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JVUlOVDE2CWJjbmludDsKLQlVSU5UMTYJY2FwaW5mbzsKKwl1MTYJY2hpZDsKKwl1MTYJYW5sOworCXUxNglzbDsKKwl1OAlic3NpZFtXTEFOX0JTU0lEX0xFTl07CisJdTE2CWJjbmludDsKKwl1MTYJY2FwaW5mbzsKIAloZmEzODR4X2J5dGVzdHIzMl90CXNzaWQ7Ci0JVUlOVDgJc3VwcHJhdGVzWzEwXTsgLyogODAyLjExIGluZm8gZWxlbWVudCAqLwotCVVJTlQxNglwcm9iZXJlc3BfcmF0ZTsKKwl1OAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCisJdTE2CXByb2JlcmVzcF9yYXRlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NjYW5SZXN1bHRTdWJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0CiB7Ci0JVUlOVDE2CXJzdmQ7Ci0JVUlOVDE2CXNjYW5yZWFzb247CisJdTE2CXJzdmQ7CisJdTE2CXNjYW5yZWFzb247CiAJaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3QKIAkJcmVzdWx0W0hGQTM4NHhfU0NBTlJFU1VMVF9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1NjYW5SZXN1bHRfdDsKQEAgLTE4NTAsMTAgKzE4MTQsMTAgQEAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBDaEluZm8gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViCiB7Ci0JVUlOVDE2CWNoaWQ7Ci0JVUlOVDE2CWFubDsKLQlVSU5UMTYJcG5sOwotCVVJTlQxNglhY3RpdmU7CisJdTE2CWNoaWQ7CisJdTE2CWFubDsKKwl1MTYJcG5sOworCXUxNglhY3RpdmU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3Q7CiAKICNkZWZpbmUgSEZBMzg0eF9DSElORk9SRVNVTFRfQlNTQUNUSVZFCUJJVDAKQEAgLTE4NjEsNyArMTgyNSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0CiB7Ci0JVUlOVDE2CXNjYW5jaGFubmVsczsKKwl1MTYJc2NhbmNoYW5uZWxzOwogCWhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3QKIAkJcmVzdWx0W0hGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ2hJbmZvUmVzdWx0X3Q7CkBAIC0xODY5LDc1ICsxODMzLDc1IEBACiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogSG9zdCBTY2FuIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViCiB7Ci0JVUlOVDE2CWNoaWQ7Ci0JVUlOVDE2CWFubDsKLQlVSU5UMTYJc2w7Ci0JVUlOVDgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwotCVVJTlQxNgliY25pbnQ7Ci0JVUlOVDE2CWNhcGluZm87CisJdTE2CWNoaWQ7CisJdTE2CWFubDsKKwl1MTYJc2w7CisJdTgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXUxNgliY25pbnQ7CisJdTE2CWNhcGluZm87CiAJaGZhMzg0eF9ieXRlc3RyMzJfdAlzc2lkOwotCVVJTlQ4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KLQlVSU5UMTYJcHJvYmVyZXNwX3JhdGU7Ci0JVUlOVDE2CWF0aW07CisJdTgJc3VwcHJhdGVzWzEwXTsgLyogODAyLjExIGluZm8gZWxlbWVudCAqLworCXUxNglwcm9iZXJlc3BfcmF0ZTsKKwl1MTYJYXRpbTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0CiB7Ci0JVUlOVDE2CW5yZXN1bHQ7Ci0JVUlOVDE2CXJzdmQ7CisJdTE2CW5yZXN1bHQ7CisJdTE2CXJzdmQ7CiAJaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90CiAJCXJlc3VsdFtIRkEzODR4X0hTQ0FOUkVTVUxUX01BWF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSFNjYW5SZXN1bHRfdDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBMaW5rU3RhdHVzIC0tKi8KIAotI2RlZmluZSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVECSgoVUlOVDE2KTApCi0jZGVmaW5lIEhGQTM4NHhfTElOS19DT05ORUNURUQJCSgoVUlOVDE2KTEpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19ESVNDT05ORUNURUQJKChVSU5UMTYpMikKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0NIQU5HRQkJKChVSU5UMTYpMykKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX09VVE9GUkFOR0UJKChVSU5UMTYpNCkKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0lOUkFOR0UJCSgoVUlOVDE2KTUpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BU1NPQ0ZBSUwJCSgoVUlOVDE2KTYpCisjZGVmaW5lIEhGQTM4NHhfTElOS19OT1RDT05ORUNURUQJKCh1MTYpMCkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRAkJKCh1MTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0RJU0NPTk5FQ1RFRAkoKHUxNikyKQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfQ0hBTkdFCQkoKHUxNikzKQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfT1VUT0ZSQU5HRQkoKHUxNik0KQorI2RlZmluZSBIRkEzODR4X0xJTktfQVBfSU5SQU5HRQkJKCh1MTYpNSkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FTU09DRkFJTAkJKCh1MTYpNikKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9MaW5rU3RhdHVzCiB7Ci0JVUlOVDE2CWxpbmtzdGF0dXM7CisJdTE2CWxpbmtzdGF0dXM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTGlua1N0YXR1c190OwogCiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXNzb2NpYXRpb25TdGF0dXMgKC0tKi8KIAotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1NUQUFTU09DCSgoVUlOVDE2KTEpCi0jZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfUkVBU1NPQwkoKFVJTlQxNikyKQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0RJU0FTU09DCSgoVUlOVDE2KTMpCi0jZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVNTT0NGQUlMCSgoVUlOVDE2KTQpCi0jZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVVUSEZBSUwJKChVSU5UMTYpNSkKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19TVEFBU1NPQwkoKHUxNikxKQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1JFQVNTT0MJKCh1MTYpMikKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19ESVNBU1NPQwkoKHUxNikzKQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FTU09DRkFJTAkoKHUxNik0KQorI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FVVEhGQUlMCSgodTE2KTUpCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXNzb2NTdGF0dXMKIHsKLQlVSU5UMTYJYXNzb2NzdGF0dXM7Ci0JVUlOVDgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07CisJdTE2CWFzc29jc3RhdHVzOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOwogCS8qIG9sZF9hcF9hZGRyIGlzIG9ubHkgdmFsaWQgaWYgYXNzb2NzdGF0dXMgPT0gMiAqLwotCVVJTlQ4CW9sZF9hcF9hZGRyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglyZWFzb247Ci0JVUlOVDE2CXJlc2VydmVkOworCXU4CW9sZF9hcF9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglyZWFzb247CisJdTE2CXJlc2VydmVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0Fzc29jU3RhdHVzX3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXV0aFJlcXVlc3QgKEFQIE9ubHkpIC0tKi8KIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9BdXRoUmVxdWVzdAogewotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglhbGdvcml0aG07CisJdTgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07CisJdTE2CWFsZ29yaXRobTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9BdXRoUmVxX3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXNzb2NSZXF1ZXN0IChBUCBPbmx5KSAtLSovCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXNzb2NSZXF1ZXN0CiB7Ci0JVUlOVDgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXR5cGU7Ci0JVUlOVDggICB3cGFfZGF0YVs4MF07CisJdTgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07CisJdTE2CXR5cGU7CisJdTggICB3cGFfZGF0YVs4MF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXNzb2NSZXFfdDsKIAogCkBAIC0xOTQ4LDIxICsxOTEyLDIxIEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTWljRmFpbHVyZQogewotCVVJTlQ4CXNlbmRlcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlkZXN0W1dMQU5fQUREUl9MRU5dOworCXU4CXNlbmRlcltXTEFOX0FERFJfTEVOXTsKKwl1OAlkZXN0W1dMQU5fQUREUl9MRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01pY0ZhaWx1cmVfdDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBQU1VzZXJDb3VudCAoQVAgT25seSkgLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BTVXNlckNvdW50CiB7Ci0JVUlOVDE2CXVzZXJjbnQ7CisJdTE2CXVzZXJjbnQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFNVc2VyQ291bnRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQKIHsKLQlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJa2V5aWQ7CisJdTgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07CisJdTE2CWtleWlkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0tleUlEQ2hhbmdlZF90OwogCiAvKi0tICBDb2xsZWN0aW9uIG9mIGFsbCBJbmYgZnJhbWVzIC0tLS0tLS0tLS0tLS0tLSovCkBAIC0xOTgxLDEyICsxOTQ1LDExIEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUKIHsKLQlVSU5UMTYJCQlmcmFtZWxlbjsKLQlVSU5UMTYJCQlpbmZvdHlwZTsKKwl1MTYJCQlmcmFtZWxlbjsKKwl1MTYJCQlpbmZvdHlwZTsKIAloZmEzODR4X2luZm9kYXRhX3QJaW5mbzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9JbmZGcmFtZV90OwogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVVNCIFBhY2tldCBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMDIwLDQ2ICsxOTgzLDQ2IEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHsKIAloZmEzODR4X3R4X2ZyYW1lX3QJZGVzYzsKLQlVSU5UOAkJCWRhdGFbV0xBTl9EQVRBX01BWExFTl07CisJdTgJCQlkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl90eGZybV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9jbWRyZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWNtZDsKLQlVSU5UMTYJCXBhcm0wOwotCVVJTlQxNgkJcGFybTE7Ci0JVUlOVDE2CQlwYXJtMjsKLQlVSU5UOAkJcGFkWzU0XTsKKwl1MTYJCXR5cGU7CisJdTE2CQljbWQ7CisJdTE2CQlwYXJtMDsKKwl1MTYJCXBhcm0xOworCXUxNgkJcGFybTI7CisJdTgJCXBhZFs1NF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2NtZHJlcV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlyaWQ7Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJcmlkOworCXU4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl93cmlkcmVxX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCXJpZDsKLQlVSU5UOAkJcGFkWzU4XTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlyaWQ7CisJdTgJCXBhZFs1OF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3JyaWRyZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfd21lbXJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJb2Zmc2V0OwotCVVJTlQxNgkJcGFnZTsKLQlVSU5UOAkJZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCW9mZnNldDsKKwl1MTYJCXBhZ2U7CisJdTgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfd21lbXJlcV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlvZmZzZXQ7Ci0JVUlOVDE2CQlwYWdlOwotCVVJTlQ4CQlwYWRbNTZdOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCW9mZnNldDsKKwl1MTYJCXBhZ2U7CisJdTgJCXBhZFs1Nl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3JtZW1yZXFfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjA2Nyw1NCArMjAzMCw1NCBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSB7CiAJaGZhMzg0eF9yeF9mcmFtZV90CWRlc2M7Ci0JVUlOVDgJCQlkYXRhW1dMQU5fREFUQV9NQVhMRU5dOworCXU4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfcnhmcm1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7Ci0JVUlOVDE2CQkJdHlwZTsKKwl1MTYJCQl0eXBlOwogCWhmYTM4NHhfSW5mRnJhbWVfdAlpbmZvOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9pbmZvZnJtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCXJlc3AwOwotCVVJTlQxNgkJcmVzcDE7Ci0JVUlOVDE2CQlyZXNwMjsKKwl1MTYJCXR5cGU7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlyZXNwMDsKKwl1MTYJCXJlc3AxOworCXUxNgkJcmVzcDI7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2NtZHJlc3BfdDsKIAogdHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd3JpZHJlc3BfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3AgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCXJpZDsKLQlVSU5UOAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlyaWQ7CisJdTgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3JyaWRyZXNwX3Q7CiAKIHR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dtZW1yZXNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfcm1lbXJlc3BfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfYnVmYXZhaWwgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX2J1ZmF2YWlsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2Vycm9yIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQllcnJvcnR5cGU7CisJdTE2CQl0eXBlOworCXUxNgkJZXJyb3J0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9lcnJvcl90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVW5pb25zIGZvciBwYWNrYWdpbmcgYWxsIHRoZSBrbm93biBwYWNrZXQgdHlwZXMgdG9nZXRoZXIgKi8KIAogdHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYm91dCB7Ci0JVUlOVDE2CQkJdHlwZTsKKwl1MTYJCQl0eXBlOwogCWhmYTM4NHhfdXNiX3R4ZnJtX3QJdHhmcm07CiAJaGZhMzg0eF91c2JfY21kcmVxX3QJY21kcmVxOwogCWhmYTM4NHhfdXNiX3dyaWRyZXFfdAl3cmlkcmVxOwpAQCAtMjEyNCw3ICsyMDg3LDcgQEAKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JvdXRfdDsKIAogdHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYmluIHsKLQlVSU5UMTYJCQl0eXBlOworCXUxNgkJCXR5cGU7CiAJaGZhMzg0eF91c2Jfcnhmcm1fdAlyeGZybTsKIAloZmEzODR4X3VzYl90eGZybV90CXR4ZnJtOwogCWhmYTM4NHhfdXNiX2luZm9mcm1fdAlpbmZvZnJtOwpAQCAtMjEzNSwyOCArMjA5OCwyNiBAQAogCWhmYTM4NHhfdXNiX3JtZW1yZXNwX3QJcm1lbXJlc3A7CiAJaGZhMzg0eF91c2JfYnVmYXZhaWxfdAlidWZhdmFpbDsKIAloZmEzODR4X3VzYl9lcnJvcl90CXVzYmVycm9yOwotCVVJTlQ4CQkJYm9ndXNwYWRbMzAwMF07CisJdTgJCQlib2d1c3BhZFszMDAwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jpbl90OwogCi0jZW5kaWYgLyogV0xBTl9VU0IgKi8KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUEQgcmVjb3JkIHN0cnVjdHVyZXMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtCiB7Ci0JVUlOVDgJbnVtWzhdOworCXU4CW51bVs4XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcGNiX3BhcnRudW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtCiB7Ci0JVUlOVDgJbnVtWzhdOworCXU4CW51bVs4XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwKIHsKLQlVSU5UOAludW1bMTJdOworCXU4CW51bVsxMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY19zZXJpYWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50cwpAQCAtMjE4MCwxNzAgKzIxNDEsMTcwIEBACiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplCiB7Ci0JVUlOVDgJc2l6ZVsxMl07IC8qIHVuaXRzIG9mIEtCICovCisJdTgJc2l6ZVsxMl07IC8qIHVuaXRzIG9mIEtCICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY19yYW1zaXplX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21maXN1cHJhbmdlCiB7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNglib3R0b207Ci0JVUlOVDE2CXRvcDsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CWJvdHRvbTsKKwl1MTYJdG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZQogewotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJYm90dG9tOwotCVVJTlQxNgl0b3A7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNglib3R0b207CisJdTE2CXRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2VfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljaWQKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CW1ham9yOwotCVVJTlQxNgltaW5vcjsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CW1ham9yOworCXUxNgltaW5vcjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljaWRfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzCiB7Ci0JVUlOVDE2CXZhbHVlWzBdOworCXUxNgl2YWx1ZVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50c190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHMKIHsKLQlVSU5UMTYJdmFsdWVbMF07CisJdTE2CXZhbHVlWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9tZWFzdXJlbWVudHMKIHsKLQlVSU5UMTYJdmFsdWVbMF07CisJdTE2CXZhbHVlWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9sZXZlbF9jb21wY19tZWFzdXJlbWVudHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWFjX2FkZHJlc3MKIHsKLQlVSU5UOAlhZGRyWzZdOworCXU4CWFkZHJbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZQogewotCVVJTlQ4CWNhbGxuYW1lWzhdOworCXU4CWNhbGxuYW1lWzhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVnZG9tYWluCiB7Ci0JVUlOVDE2CW51bWRvbWFpbnM7Ci0JVUlOVDE2CWRvbWFpbls1XTsKKwl1MTYJbnVtZG9tYWluczsKKwl1MTYJZG9tYWluWzVdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9yZWdkb21haW5fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsCiB7Ci0JVUlOVDE2CWNoX2JpdG1hcDsKKwl1MTYJY2hfYml0bWFwOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsCiB7Ci0JVUlOVDE2CWNoYW5uZWw7CisJdTE2CWNoYW5uZWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbgogewotCVVJTlQxNglhdmFpbGFibGU7CisJdTE2CWF2YWlsYWJsZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb25fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUKIHsKLQlVSU5UMTYJdHlwZTsKKwl1MTYJdHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdGVtcHR5cGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwCiB7Ci0JVUlOVDE2CWNoX3ZhbHVlWzE0XTsKKwl1MTYJY2hfdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXBfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXAKIHsKLQlVSU5UMTYJY2hfdmFsdWVbMTRdOworCXUxNgljaF92YWx1ZVsxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXAKIHsKLQlVSU5UMTYJY2hfdmFsdWVbMTRdOworCXUxNgljaF92YWx1ZVsxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXBfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cAogewotCVVJTlQxNgl0cmltaWRhYzsKLQlVSU5UMTYJdHJpbXFkYWM7CisJdTE2CXRyaW1pZGFjOworCXUxNgl0cmltcWRhYzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZwogewotCVVJTlQxNgl2YWx1ZVszXTsKKwl1MTYJdmFsdWVbM107CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nCiB7Ci0JVUlOVDE2CXZhbHVlWzNdOworCXUxNgl2YWx1ZVszXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmZyX3NldHRpbmdfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZQogewotCVVJTlQxNgl2YWx1ZVs1MF07CisJdTE2CXZhbHVlWzUwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvdwogewotCVVJTlQzMgl2YWx1ZVszMl07CisJdTMyCXZhbHVlWzMyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3dfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmCiB7Ci0JVUlOVDMyCXZhbHVlWzIwXTsKKwl1MzIJdmFsdWVbMjBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmZfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwCiB7Ci0JVUlOVDE2CXZhbHVlWzE0XTsKKwl1MTYJdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3BfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGkKIHsKLQlVSU5UMTYJdmFsdWVbMTddOworCXUxNgl2YWx1ZVsxN107CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbmljX2NvbmZpZwogewotCVVJTlQxNgljb25maWdfYml0bWFwOworCXUxNgljb25maWdfYml0bWFwOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfY29uZmlnX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmb19kZWxheQogewotCVVJTlQ4ICAgaGZvX2RlbGF5OworCXU4ICAgaGZvX2RlbGF5OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2hmb19kZWxheV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwCiB7Ci0JVUlOVDE2CXZhbHVlWzMwXTsKKwl1MTYJdmFsdWVbMzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aQogewotCVVJTlQxNgl2YWx1ZVszMF07CisJdTE2CXZhbHVlWzMwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZW5kX29mX3BkYQogewotCVVJTlQxNgljcmM7CisJdTE2CWNyYzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfZW5kX29mX3BkYV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3BkcmVjCiB7Ci0JVUlOVDE2CWxlbjsgLyogaW4gd29yZHMgKi8KLQlVSU5UMTYJY29kZTsKKwl1MTYJbGVuOyAvKiBpbiB3b3JkcyAqLworCXUxNgljb2RlOwogCXVuaW9uIHBkciB7CiAJaGZhMzg0eF9wZHJfcGNiX3BhcnRudW1fdAlwY2JfcGFydG51bTsKIAloZmEzODR4X3Bkcl9wY2JfdHJhY2VudW1fdAlwY2JfdHJhY2VudW07CkBAIC0yMzkxLDE0ICsyMzUyLDEyIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3N0YXR1c3Jlc3VsdAogewotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDE2CXJlc3AwOwotCVVJTlQxNglyZXNwMTsKLQlVSU5UMTYJcmVzcDI7CisJdTE2CXN0YXR1czsKKwl1MTYJcmVzcDA7CisJdTE2CXJlc3AxOworCXUxNglyZXNwMjsKIH0gaGZhMzg0eF9jbWRyZXN1bHRfdDsKIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKLQogLyogVVNCIENvbnRyb2wgRXhjaGFuZ2UgKENUTFgpOgogICogIEEgcXVldWUgb2YgdGhlIHN0cnVjdHVyZSBiZWxvdyBpcyBtYWludGFpbmVkIGZvciBhbGwgb2YgdGhlCiAgKiAgUmVxdWVzdC9SZXNwb25zZSB0eXBlIFVTQiBwYWNrZXRzIHN1cHBvcnRlZCBieSBQcmlzbTIuCkBAIC0yNDExLDkgKzIzNzAsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQKIHsKLQlVSU5UMTYJCXJpZDsKKwl1MTYJCXJpZDsKIAljb25zdCB2b2lkCSpyaWRkYXRhOwotCVVJTlQJCXJpZGRhdGFfbGVuOworCXVuc2lnbmVkIGludAkJcmlkZGF0YV9sZW47CiB9IGhmYTM4NHhfcnJpZHJlc3VsdF90OwogCiBlbnVtIGN0bHhfc3RhdGUgewpAQCAtMjQ2NywyMSArMjQyNiwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJY29tcGxldGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJlYXBhYmxlOwogfSBoZmEzODR4X3VzYmN0bHhxX3Q7Ci0jZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhNDg0eF9tZXRhY21kCiB7Ci0JVUlOVDE2CQljbWQ7CisJdTE2CQljbWQ7CiAKLQlVSU5UMTYgICAgICAgICAgcGFybTA7Ci0JVUlOVDE2ICAgICAgICAgIHBhcm0xOwotCVVJTlQxNiAgICAgICAgICBwYXJtMjsKLQotI2lmIDAgLy9YWFggY21kIGlycSBzdHVmZgotCVVJTlQxNiAgICAgICAgICBidWxraWQ7ICAgICAgICAgLyogd2hhdCBSSUQvRklEIHRvIGNvcHkgZG93bi4gKi8KLQlpbnQgICAgICAgICAgICAgYnVsa2xlbjsgICAgICAgIC8qIGhvdyBtdWNoIHRvIGNvcHkgZnJvbSBCQVAgKi8KLSAgICAgICAgY2hhciAgICAgICAgICAgICpidWxrZGF0YTsgICAgICAvKiBBbmQgdG8gd2hlcmU/ICovCi0jZW5kaWYKKwl1MTYgICAgICAgICAgcGFybTA7CisJdTE2ICAgICAgICAgIHBhcm0xOworCXUxNiAgICAgICAgICBwYXJtMjsKIAogCWhmYTM4NHhfY21kcmVzdWx0X3QgcmVzdWx0OwogfSBoZmEzODR4X21ldGFjbWRfdDsKQEAgLTI1MDcsMjggKzI0NTksMjIgQEAKIC8qIFhYWCBUaGVzZSBhcmUgZ29pbmcgYXdheSBBU0FQICovCiB0eXBlZGVmIHN0cnVjdCBwcmlzbTJzdGFfYXV0aGxpc3QKIHsKLQlVSU5UCWNudDsKLQlVSU5UOAlhZGRyW1dMQU5fQVVUSF9NQVhdW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWFzc29jW1dMQU5fQVVUSF9NQVhdOworCXVuc2lnbmVkIGludAljbnQ7CisJdTgJYWRkcltXTEFOX0FVVEhfTUFYXVtXTEFOX0FERFJfTEVOXTsKKwl1OAlhc3NvY1tXTEFOX0FVVEhfTUFYXTsKIH0gcHJpc20yc3RhX2F1dGhsaXN0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0CiB7Ci0JVUlOVAltb2RpZnk7Ci0JVUlOVAljbnQ7Ci0JVUlOVDgJYWRkcltXTEFOX0FDQ0VTU19NQVhdW1dMQU5fQUREUl9MRU5dOwotCVVJTlQJY250MTsKLQlVSU5UOAlhZGRyMVtXTEFOX0FDQ0VTU19NQVhdW1dMQU5fQUREUl9MRU5dOworCXVuc2lnbmVkIGludAltb2RpZnk7CisJdW5zaWduZWQgaW50CWNudDsKKwl1OAlhZGRyW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07CisJdW5zaWduZWQgaW50CWNudDE7CisJdTgJYWRkcjFbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKIH0gcHJpc20yc3RhX2FjY2Vzc2xpc3RfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eAogewotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQkvKiBSZXNvdXJjZSBjb25maWcgKi8KLQlVSU5UMzIJCQlpb2Jhc2U7Ci0JY2hhcgkJCV9faW9tZW0gKm1lbWJhc2U7Ci0JVUlOVDMyCQkJaXJxOwotI2Vsc2UKIAkvKiBVU0Igc3VwcG9ydCBkYXRhICovCiAJc3RydWN0IHVzYl9kZXZpY2UJKnVzYjsKIAlzdHJ1Y3QgdXJiCQlyeF91cmI7CkBAIC0yNTYwLDE2ICsyNTA2LDYgQEAKIAogCWludCAgICAgICAgICAgICAgICAgICAgIGVuZHBfaW47CiAJaW50ICAgICAgICAgICAgICAgICAgICAgZW5kcF9vdXQ7Ci0jZW5kaWYgLyogIVVTQiAqLwotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldjsKLSNlbHNlCi0JZGV2X2xpbmtfdAkqbGluazsKLSNlbmRpZgotCWRldl9ub2RlX3QJbm9kZTsKLSNlbmRpZgogCiAJaW50ICAgICAgICAgICAgICAgICAgICAgc25pZmZfZmNzOwogCWludCAgICAgICAgICAgICAgICAgICAgIHNuaWZmX2NoYW5uZWw7CkBAIC0yNTc5LDM2ICsyNTE1LDE0IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgY21kcTsJICAgICAgICAvKiB3YWl0IHF1ZXVlIGl0c2VsZiAqLwogCiAJLyogQ29udHJvbGxlciBzdGF0ZSAqLwotCVVJTlQzMgkJc3RhdGU7Ci0JVUlOVDMyCQlpc2FwOwotCVVJTlQ4CQlwb3J0X2VuYWJsZWRbSEZBMzg0eF9OVU1QT1JUU19NQVhdOwotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQlVSU5UCQlhdXhlbjsKLQlVSU5UICAgICAgICAgICAgaXNyYW0xNjsKLSNlbmRpZiAvKiAhVVNCICovCisJdTMyCQlzdGF0ZTsKKwl1MzIJCWlzYXA7CisJdTgJCXBvcnRfZW5hYmxlZFtIRkEzODR4X05VTVBPUlRTX01BWF07CiAKIAkvKiBEb3dubG9hZCBzdXBwb3J0ICovCi0JVUlOVAkJCQlkbHN0YXRlOworCXVuc2lnbmVkIGludAkJCQlkbHN0YXRlOwogCWhmYTM4NHhfZG93bmxvYWRidWZmZXJfdAlidWZpbmZvOwotCVVJTlQxNgkJCQlkbHRpbWVvdXQ7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0Jc3BpbmxvY2tfdAljbWRsb2NrOwotCXZvbGF0aWxlIGludCAgICBjbWRmbGFnOyAgICAgICAgLyogd2FpdCBxdWV1ZSBmbGFnICovCi0JaGZhMzg0eF9tZXRhY21kX3QgKmNtZGRhdGE7ICAgICAgLyogZm9yIG91ciBhc3luYyBjYWxsYmFjayAqLwotCi0JLyogQkFQIHN1cHBvcnQgKi8KLQlzcGlubG9ja190CWJhcGxvY2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgYmFwX3Rhc2tsZXQ7Ci0KLQkvKiBNQUMgYnVmZmVyIGlkcyAqLwotICAgICAgICBVSU5UMTYgICAgICAgICAgdHhmaWRfaGVhZDsKLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX3RhaWw7Ci0gICAgICAgIFVJTlQgICAgICAgICAgICB0eGZpZF9OOwotICAgICAgICBVSU5UMTYgICAgICAgICAgdHhmaWRfcXVldWVbSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWF07Ci0JVUlOVDE2CQkJaW5mb2ZpZDsKLQlzdHJ1Y3Qgc2VtYXBob3JlCWluZm9maWRfc2VtOwotI2VuZGlmIC8qICFVU0IgKi8KKwl1MTYJCQkJZGx0aW1lb3V0OwogCiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZmxhZzsgICAgLyogdG8gc2lnbmFsIHNjYW4gY29tbGV0ZSAqLwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbl9hcDsgICAgICAgIC8qIGFyZSB3ZSBqb2luZWQgdG8gYSBzcGVjaWZpYyBhcCAqLwpAQCAtMjYyMywzMSArMjUzNywzMCBAQAogCWhmYTM4NHhfY29tbXNxdWFsaXR5X3QgIHF1YWw7CiAJc3RydWN0IHRpbWVyX2xpc3QJY29tbXNxdWFsX3RpbWVyOwogCi0JVUlOVDE2IGxpbmtfc3RhdHVzOwotCVVJTlQxNiBsaW5rX3N0YXR1c19uZXc7CisJdTE2IGxpbmtfc3RhdHVzOworCXUxNiBsaW5rX3N0YXR1c19uZXc7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAgICAgICAgYXV0aHE7CiAKIAkvKiBBbmQgaGVyZSB3ZSBoYXZlIHN0dWZmIHRoYXQgdXNlZCB0byBiZSBpbiBwcml2ICovCiAKIAkvKiBTdGF0ZSB2YXJpYWJsZXMgKi8KLQlVSU5UCQlwcmVzbmlmZl9wb3J0X3R5cGU7Ci0JVUlOVDE2CQlwcmVzbmlmZl93ZXBmbGFnczsKLQlVSU5UMzIJCWRvdDExX2Rlc2lyZWRfYnNzX3R5cGU7Ci0JaW50CQlhcDsJLyogQVAgZmxhZzogMCAtIFN0YXRpb24sIDEgLSBBY2Nlc3MgUG9pbnQuICovCisJdW5zaWduZWQgaW50CQlwcmVzbmlmZl9wb3J0X3R5cGU7CisJdTE2CQlwcmVzbmlmZl93ZXBmbGFnczsKKwl1MzIJCWRvdDExX2Rlc2lyZWRfYnNzX3R5cGU7CiAKIAlpbnQgICAgICAgICAgICAgZGJtYWRqdXN0OwogCiAJLyogR3JvdXAgQWRkcmVzc2VzIC0gcmlnaHQgbm93LCB0aGVyZSBhcmUgdXAgdG8gYSB0b3RhbAogCW9mIE1BWF9HUlBfQUREUiBncm91cCBhZGRyZXNzZXMgKi8KLQlVSU5UOAkJZG90MTFfZ3JwX2FkZHJbTUFYX0dSUF9BRERSXVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UCQlkb3QxMV9ncnBjbnQ7CisJdTgJCWRvdDExX2dycF9hZGRyW01BWF9HUlBfQUREUl1bV0xBTl9BRERSX0xFTl07CisJdW5zaWduZWQgaW50CQlkb3QxMV9ncnBjbnQ7CiAKIAkvKiBDb21wb25lbnQgSWRlbnRpdGllcyAqLwogCWhmYTM4NHhfY29tcGlkZW50X3QJaWRlbnRfbmljOwogCWhmYTM4NHhfY29tcGlkZW50X3QJaWRlbnRfcHJpX2Z3OwogCWhmYTM4NHhfY29tcGlkZW50X3QJaWRlbnRfc3RhX2Z3OwogCWhmYTM4NHhfY29tcGlkZW50X3QJaWRlbnRfYXBfZnc7Ci0JVUlOVDE2CQkJbW1fbW9kczsKKwl1MTYJCQltbV9tb2RzOwogCiAJLyogU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZXMgKi8KIAloZmEzODR4X2NhcGxldmVsX3QJY2FwX3N1cF9tZmk7CkBAIC0yNjYzLDE0ICsyNTc2LDE0IEBACiAJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9hY3RfYXBfY2ZpOyAgLyogYXAgZi93IHRvIGNvbnRyb2xsZXIgaW50ZXJmYWNlICovCiAJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9hY3RfYXBfbWZpOyAgLyogYXAgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLwogCi0JVUlOVDMyCQkJcHN1c2VyY291bnQ7ICAvKiBQb3dlciBzYXZlIHVzZXIgY291bnQuICovCisJdTMyCQkJcHN1c2VyY291bnQ7ICAvKiBQb3dlciBzYXZlIHVzZXIgY291bnQuICovCiAJaGZhMzg0eF9Db21tVGFsbGllczMyX3QJdGFsbGllczsgICAgICAvKiBDb21tdW5pY2F0aW9uIHRhbGxpZXMuICovCi0JVUlOVDgJCQljb21tZW50W1dMQU5fQ09NTUVOVF9NQVgrMV07IC8qIFVzZXIgY29tbWVudCAqLworCXU4CQkJY29tbWVudFtXTEFOX0NPTU1FTlRfTUFYKzFdOyAvKiBVc2VyIGNvbW1lbnQgKi8KIAogCS8qIENoYW5uZWwgSW5mbyByZXF1ZXN0IHJlc3VsdHMgKEFQIG9ubHkpICovCiAJc3RydWN0IHsKIAkJYXRvbWljX3QJCWRvbmU7Ci0JCVVJTlQ4CQkJY291bnQ7CisJCXU4CQkJY291bnQ7CiAJCWhmYTM4NHhfQ2hJbmZvUmVzdWx0X3QJcmVzdWx0czsKIAl9IGNoYW5uZWxfaW5mbzsKIApAQCAtMjY3OCw3ICsyNTkxLDcgQEAKIAogCiAgICAgICAgIHByaXNtMnN0YV9hdXRobGlzdF90CWF1dGhsaXN0OyAgICAgLyogQXV0aGVudGljYXRlZCBzdGF0aW9uIGxpc3QuICovCi0JVUlOVAkJCWFjY2Vzc21vZGU7ICAgLyogQWNjZXNzIG1vZGUuICovCisJdW5zaWduZWQgaW50CQkJYWNjZXNzbW9kZTsgICAvKiBBY2Nlc3MgbW9kZS4gKi8KICAgICAgICAgcHJpc20yc3RhX2FjY2Vzc2xpc3RfdAlhbGxvdzsgICAgICAgIC8qIEFsbG93ZWQgc3RhdGlvbiBsaXN0LiAqLwogICAgICAgICBwcmlzbTJzdGFfYWNjZXNzbGlzdF90CWRlbnk7ICAgICAgICAgLyogRGVuaWVkIHN0YXRpb24gbGlzdC4gKi8KIApAQCAtMjY4NywyNCArMjYwMCwxMyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKIHZvaWQKIGhmYTM4NHhfY3JlYXRlKAogCWhmYTM4NHhfdCAqaHcsCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYik7Ci0jZWxzZQotdm9pZAotaGZhMzg0eF9jcmVhdGUoCi0JaGZhMzg0eF90ICpodywKLQlVSU5UIGlycSwKLQlVSU5UMzIgaW9iYXNlLAotCVVJTlQ4IF9faW9tZW0gKm1lbWJhc2UpOwotI2VuZGlmCiAKIHZvaWQgaGZhMzg0eF9kZXN0cm95KGhmYTM4NHhfdCAqaHcpOwogCi1pcnFyZXR1cm5fdAotaGZhMzg0eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1MpOwogaW50CiBoZmEzODR4X2NvcmVyZXNldCggaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpOwogaW50CkBAIC0yNzEyLDExNiArMjYxNCwxMDUgQEAKIGludAogaGZhMzg0eF9kcnZyX2NvbW10YWxsaWVzKCBoZmEzODR4X3QgKmh3KTsKIGludAotaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwogaW50Ci1oZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2hmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwogaW50CiBoZmEzODR4X2RydnJfZmxhc2hkbF9lbmFibGUoaGZhMzg0eF90ICpodyk7CiBpbnQKIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBkYWRkciwgdm9pZCogYnVmLCBVSU5UMzIgbGVuKTsKK2hmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCogYnVmLCB1MzIgbGVuKTsKIGludAotaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogaW50Ci1oZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIFVJTlQ4ICphZGRyKTsKK2hmYTM4NHhfZHJ2cl9oYW5kb3ZlciggaGZhMzg0eF90ICpodywgdTggKmFkZHIpOwogaW50CiBoZmEzODR4X2RydnJfaG9zdHNjYW5yZXN1bHRzKCBoZmEzODR4X3QgKmh3KTsKIGludAogaGZhMzg0eF9kcnZyX2xvd19sZXZlbChoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKTsKIGludAotaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyZXNzLCBVSU5UMzIgKnJlc3VsdCk7CitoZmEzODR4X2RydnJfbW1pX3JlYWQoaGZhMzg0eF90ICpodywgdTMyIGFkZHJlc3MsIHUzMiAqcmVzdWx0KTsKIGludAotaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkcmVzcywgVUlOVDMyIGRhdGEpOworaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgYWRkcmVzcywgdTMyIGRhdGEpOwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBleGVhZGRyKTsKK2hmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgdTMyIGV4ZWFkZHIpOwogaW50CiBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KTsKIGludAotaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBkYWRkciwgdm9pZCogYnVmLCBVSU5UMzIgbGVuKTsKK2hmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQqIGJ1ZiwgdTMyIGxlbik7CiBpbnQKLWhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pOworaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKIGludAogaGZhMzg0eF9kcnZyX3NjYW5yZXN1bHRzKCBoZmEzODR4X3QgKmh3KTsKIAogaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbik7CitoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqdmFsKQoraGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnZhbCkKIHsKIAlpbnQJCXJlc3VsdCA9IDA7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZihVSU5UMTYpKTsKKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKHUxNikpOwogCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCSooKFVJTlQxNiopdmFsKSA9IGhmYTM4NHgyaG9zdF8xNigqKChVSU5UMTYqKXZhbCkpOworCQkqKCh1MTYqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMTYoKigodTE2Kil2YWwpKTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9nZXRjb25maWczMihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICp2YWwpCitoZmEzODR4X2RydnJfZ2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqdmFsKQogewogCWludAkJcmVzdWx0ID0gMDsKIAotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YoVUlOVDMyKSk7CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZih1MzIpKTsKIAlpZiAoIHJlc3VsdCA9PSAwICkgewotCQkqKChVSU5UMzIqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMzIoKigoVUlOVDMyKil2YWwpKTsKKwkJKigodTMyKil2YWwpID0gaGZhMzg0eDJob3N0XzMyKCooKHUzMiopdmFsKSk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMTYgdmFsKQoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7Ci0JVUlOVDE2IHZhbHVlID0gaG9zdDJoZmEzODR4XzE2KHZhbCk7CisJdTE2IHZhbHVlID0gaG9zdDJoZmEzODR4XzE2KHZhbCk7CiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWczMihoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMzIgdmFsKQoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUzMiB2YWwpCiB7Ci0JVUlOVDMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CisJdTMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIH0KIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKIGludAogaGZhMzg0eF9kcnZyX2dldGNvbmZpZ19hc3luYyhoZmEzODR4X3QgICAgICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiAgICAgICAgcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2ICAgICAgICByaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnVzZXJjYl9kYXRhKTsKIAogaW50CiBoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuLAotCQkJICAgICB2b2lkICpwdHIxLCB2b2lkICpwdHIyKQotewotICAgICAgICAgKHZvaWQpcHRyMTsKLSAgICAgICAgICh2b2lkKXB0cjI7Ci0gICAgICAgICByZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgcmlkLCBidWYsIGxlbik7Ci19Ci0jZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNl9hc3luYyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMTYgdmFsKQoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2X2FzeW5jKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7Ci0JVUlOVDE2IHZhbHVlID0gaG9zdDJoZmEzODR4XzE2KHZhbCk7CisJdTE2IHZhbHVlID0gaG9zdDJoZmEzODR4XzE2KHZhbCk7CiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpLAogCQkJCQkgICAgTlVMTCAsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyX2FzeW5jKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIFVJTlQzMiB2YWwpCitoZmEzODR4X2RydnJfc2V0Y29uZmlnMzJfYXN5bmMoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTMyIHZhbCkKIHsKLQlVSU5UMzIgdmFsdWUgPSBob3N0MmhmYTM4NHhfMzIodmFsKTsKKwl1MzIgdmFsdWUgPSBob3N0MmhmYTM4NHhfMzIodmFsKTsKIAlyZXR1cm4gaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhodywgcmlkLCAmdmFsdWUsIHNpemVvZih2YWx1ZSksCiAJCQkJCSAgICBOVUxMICwgTlVMTCk7CiB9CkBAIC0yODM5LDMyICsyNzMwLDI4IEBACiBpbnQKIGhmYTM4NHhfY21kX2luaXRpYWxpemUoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwogaW50Ci1oZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2hmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwogaW50CiBoZmEzODR4X2NtZF9kaWFnbm9zZShoZmEzODR4X3QgKmh3KTsKIGludAotaGZhMzg0eF9jbWRfYWxsb2NhdGUoaGZhMzg0eF90ICpodywgVUlOVDE2IGxlbik7CitoZmEzODR4X2NtZF9hbGxvY2F0ZShoZmEzODR4X3QgKmh3LCB1MTYgbGVuKTsKIGludAotaGZhMzg0eF9jbWRfdHJhbnNtaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBxb3MsIFVJTlQxNiBmaWQpOworaGZhMzg0eF9jbWRfdHJhbnNtaXQoaGZhMzg0eF90ICpodywgdTE2IHJlY2xhaW0sIHUxNiBxb3MsIHUxNiBmaWQpOwogaW50Ci1oZmEzODR4X2NtZF9jbGVhcnBlcnNpc3QoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCk7CitoZmEzODR4X2NtZF9jbGVhcnBlcnNpc3QoaGZhMzg0eF90ICpodywgdTE2IGZpZCk7CiBpbnQKLWhmYTM4NHhfY21kX25vdGlmeShoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmVjbGFpbSwgVUlOVDE2IGZpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKK2hmYTM4NHhfY21kX2FjY2VzcyhoZmEzODR4X3QgKmh3LCB1MTYgd3JpdGUsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CiBpbnQKLWhmYTM4NHhfY21kX2lucXVpcmUoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCk7Ci1pbnQKLWhmYTM4NHhfY21kX2FjY2VzcyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgd3JpdGUsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbik7Ci1pbnQKLWhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgVUlOVDE2IGVuYWJsZSk7CitoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIHUxNiBlbmFibGUpOwogaW50CiBoZmEzODR4X2NtZF9kb3dubG9hZCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQxNiBtb2RlLAotCVVJTlQxNiBsb3dhZGRyLAotCVVJTlQxNiBoaWdoYWRkciwKLQlVSU5UMTYgY29kZWxlbik7CisJdTE2IG1vZGUsCisJdTE2IGxvd2FkZHIsCisJdTE2IGhpZ2hhZGRyLAorCXUxNiBjb2RlbGVuKTsKIGludAogaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShoZmEzODR4X3QgKmh3LCBpbnQgZm9yY2UpOwogaW50CkBAIC0yODcyLDE5NiArMjc1OSwzNCBAQAogaW50CiBoZmEzODR4X2NvcHlfZnJvbV9iYXAoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMTYJYmFwLAotCVVJTlQxNglpZCwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNgliYXAsCisJdTE2CWlkLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIGludAogaGZhMzg0eF9jb3B5X3RvX2JhcCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQxNgliYXAsCi0JVUlOVDE2CWlkLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CWJhcCwKKwl1MTYJaWQsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpidWYsCi0JVUlOVAlsZW4pOworCXVuc2lnbmVkIGludAlsZW4pOwogdm9pZAogaGZhMzg0eF9jb3B5X2Zyb21fYXV4KAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDMyCWNhcmRhZGRyLAotCVVJTlQzMglhdXhjdGwsCisJdTMyCWNhcmRhZGRyLAorCXUzMglhdXhjdGwsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIHZvaWQKIGhmYTM4NHhfY29weV90b19hdXgoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMzIJY2FyZGFkZHIsCi0JVUlOVDMyCWF1eGN0bCwKKwl1MzIJY2FyZGFkZHIsCisJdTMyCWF1eGN0bCwKIAl2b2lkCSpidWYsCi0JVUlOVAlsZW4pOworCXVuc2lnbmVkIGludAlsZW4pOwogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCi0vKgotICAgSEZBMzg0eCBpcyBhIExJVFRMRSBFTkRJQU4gcGFydC4KLQotICAgdGhlIGdldC9zZXRyZWcgZnVuY3Rpb25zIGltcGxpY2l0bHkgYnl0ZS1zd2FwIHRoZSBkYXRhIHRvIExFLgotICAgdGhlIF9ub3N3YXAgdmFyaWFudHMgZG8gbm90IHBlcmZvcm0gYSBieXRlLXN3YXAgb24gdGhlIGRhdGEuCi0qLwotCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UIHJlZyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19oZmEzODR4X3NldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZyk7Ci0KLXN0YXRpYyBpbmxpbmUgVUlOVDE2Ci1fX2hmYTM4NHhfZ2V0cmVnX25vc3dhcChoZmEzODR4X3QgKmh3LCBVSU5UIHJlZyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19oZmEzODR4X3NldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpOwotCi0jaWZkZWYgUkVWRVJTRV9FTkRJQU4KLSNkZWZpbmUgaGZhMzg0eF9nZXRyZWcgX19oZmEzODR4X2dldHJlZ19ub3N3YXAKLSNkZWZpbmUgaGZhMzg0eF9zZXRyZWcgX19oZmEzODR4X3NldHJlZ19ub3N3YXAKLSNkZWZpbmUgaGZhMzg0eF9nZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9nZXRyZWcKLSNkZWZpbmUgaGZhMzg0eF9zZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9zZXRyZWcKLSNlbHNlCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnIF9faGZhMzg0eF9nZXRyZWcKLSNkZWZpbmUgaGZhMzg0eF9zZXRyZWcgX19oZmEzODR4X3NldHJlZwotI2RlZmluZSBoZmEzODR4X2dldHJlZ19ub3N3YXAgX19oZmEzODR4X2dldHJlZ19ub3N3YXAKLSNkZWZpbmUgaGZhMzg0eF9zZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9zZXRyZWdfbm9zd2FwCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZ2V0cmVnCi0qCi0qIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKLSogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgotKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIGluIEhPU1QgT1JERVIhISEhISEKLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgIE1BQyBwYXJ0IHN0cnVjdHVyZQotKiAgICAgICByZWcgICAgICAgIFJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKLSoKLSogUmV0dXJuczoKLSogICAgICAgVmFsdWUgZnJvbSB0aGUgcmVnaXN0ZXIgaW4gSE9TVCBPUkRFUiEhISEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGlubGluZSBVSU5UMTYKLV9faGZhMzg0eF9nZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVCByZWcpCi17Ci0vKglwcmludGsoS0VSTl9ERUJVRyAiUmVhZGluZyBmcm9tIDB4JTB4XG4iLCBody0+bWVtYmFzZSArIHJlZyk7ICovCi0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQlyZXR1cm4gd2xhbl9pbndfbGUxNl90b19jcHUoaHctPmlvYmFzZStyZWcpOwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCXJldHVybiBfX2xlMTZfdG9fY3B1KHJlYWR3KGh3LT5tZW1iYXNlICsgcmVnKSk7Ci0jZW5kaWYKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfc2V0cmVnCi0qCi0qIFNldCB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSogTk9URTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSB2YWx1ZSBpcyBpbiBIT1NUIE9SREVSISEhISEhCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcJTUFDIHBhcnQgc3RydWN0dXJlCi0qCXZhbAlWYWx1ZSwgaW4gSE9TVCBPUkRFUiEhLCB0byBwdXQgaW4gdGhlIHJlZ2lzdGVyCi0qICAgICAgIHJlZwlSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIE5vdGhpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGlubGluZSB2b2lkCi1fX2hmYTM4NHhfc2V0cmVnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKQotewotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0Jd2xhbl9vdXR3X2NwdV90b19sZTE2KCB2YWwsIGh3LT5pb2Jhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQl3cml0ZXcoX19jcHVfdG9fbGUxNih2YWwpLCBody0+bWVtYmFzZSArIHJlZyk7Ci0JcmV0dXJuOwotI2VuZGlmCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZ2V0cmVnX25vc3dhcAotKgotKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgIE1BQyBwYXJ0IHN0cnVjdHVyZQotKiAgICAgICByZWcgICAgICAgIFJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKLSoKLSogUmV0dXJuczoKLSogICAgICAgVmFsdWUgZnJvbSB0aGUgcmVnaXN0ZXIuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgVUlOVDE2Ci1fX2hmYTM4NHhfZ2V0cmVnX25vc3dhcChoZmEzODR4X3QgKmh3LCBVSU5UIHJlZykKLXsKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCXJldHVybiB3bGFuX2ludyhody0+aW9iYXNlK3JlZyk7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0JcmV0dXJuIHJlYWR3KGh3LT5tZW1iYXNlICsgcmVnKTsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X3NldHJlZ19ub3N3YXAKLSoKLSogU2V0IHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlIE1BQyByZWdpc3RlcnMuICBEb25lIGhlcmUKLSogYmVjYXVzZSBkaWZmZXJlbnQgUFJJU00yIE1BQyBwYXJ0cyB1c2UgZGlmZmVyZW50IGJ1c2VzIGFuZCBzdWNoLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3CU1BQyBwYXJ0IHN0cnVjdHVyZQotKgl2YWwJVmFsdWUgdG8gcHV0IGluIHRoZSByZWdpc3RlcgotKiAgICAgICByZWcJUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQotKgotKiBSZXR1cm5zOgotKiAgICAgICBOb3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19oZmEzODR4X3NldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpCi17Ci0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQl3bGFuX291dHcoIHZhbCwgaHctPmlvYmFzZSArIHJlZyk7Ci0JcmV0dXJuOwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCXdyaXRldyh2YWwsIGh3LT5tZW1iYXNlICsgcmVnKTsKLQlyZXR1cm47Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9ldmVudHNfYWxsKGhmYTM4NHhfdCAqaHcpCi17Ci0JaGZhMzg0eF9zZXRyZWcoaHcsCi0JCSAgICAgICBIRkEzODR4X0lOVF9OT1JNQUwKLSNpZmRlZiBDTURfSVJRCi0JCSAgICAgICB8IEhGQTM4NHhfSU5URU5fQ01EX1NFVCgxKQotI2VuZGlmCi0JCSAgICAgICAsCi0JCSAgICAgICBIRkEzODR4X0lOVEVOKTsKLQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGZhMzg0eF9ldmVudHNfbm9iYXAoaGZhMzg0eF90ICpodykKLXsKLQloZmEzODR4X3NldHJlZyhodywKLQkJICAgICAgICAoSEZBMzg0eF9JTlRfTk9STUFMICYgfkhGQTM4NHhfSU5UX0JBUF9PUCkKLSNpZmRlZiBDTURfSVJRCi0JCSAgICAgICB8IEhGQTM4NHhfSU5URU5fQ01EX1NFVCgxKQotI2VuZGlmCi0JCSAgICAgICAsCi0JCSAgICAgICBIRkEzODR4X0lOVEVOKTsKLQotfQotCi0jZW5kaWYgLyogV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAgLyogX0hGQTM4NHhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKaW5kZXggZGIwYzUwMi4uOGE3NWI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCkBAIC0xMTQsOSArMTE0LDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTEzNiw2MyArMTMzLDcgQEAKIAogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0jZXJyb3IgIlRoaXMgZmlsZSBpcyBzcGVjaWZpYyB0byBVU0IiCi0jZW5kaWYKLQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotc3RhdGljIGludAotd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBjb21wbGV0aW9uICp4KQotewotICBpbnQgcmV0ID0gMDsKLQotICBtaWdodF9zbGVlcCgpOwotCi0gIHNwaW5fbG9ja19pcnEoJngtPndhaXQubG9jayk7Ci0gIGlmICgheC0+ZG9uZSkgewotICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0gICAgd2FpdC5mbGFncyB8PSBXUV9GTEFHX0VYQ0xVU0lWRTsKLSAgICBfX2FkZF93YWl0X3F1ZXVlX3RhaWwoJngtPndhaXQsICZ3YWl0KTsKLSAgICBkbyB7Ci0gICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLSAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOwotICAgICAgICBfX3JlbW92ZV93YWl0X3F1ZXVlKCZ4LT53YWl0LCAmd2FpdCk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgICAgfQotICAgICAgX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotICAgICAgc3Bpbl91bmxvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotICAgICAgc2NoZWR1bGUoKTsKLSAgICAgIHNwaW5fbG9ja19pcnEoJngtPndhaXQubG9jayk7Ci0gICAgfSB3aGlsZSAoIXgtPmRvbmUpOwotICAgIF9fcmVtb3ZlX3dhaXRfcXVldWUoJngtPndhaXQsICZ3YWl0KTsKLSAgfQotICB4LT5kb25lLS07Ci1vdXQ6Ci0gIHNwaW5fdW5sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKLQotICByZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjkpCi1zdGF0aWMgdm9pZAotdXNiX2luaXRfdXJiKHN0cnVjdCB1cmIgKnVyYikKLXsKLQltZW1zZXQodXJiLCAwLCBzaXplb2YoKnVyYikpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkgLyogdHVuZSBtZSEgKi8KLQl1cmItPmNvdW50ID0gKGF0b21pY190KUFUT01JQ19JTklUKDEpOwotI2VuZGlmCi0Jc3Bpbl9sb2NrX2luaXQoJnVyYi0+bG9jayk7Ci19Ci0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkgLyogdHVuZSBtZSEgKi8KLSMgIGRlZmluZSBTVUJNSVRfVVJCKHUsZikgIHVzYl9zdWJtaXRfdXJiKHUsZikKLSNlbHNlCi0jICBkZWZpbmUgU1VCTUlUX1VSQih1LGYpICB1c2Jfc3VibWl0X3VyYih1KQotI2VuZGlmCisjZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgdXNiX3N1Ym1pdF91cmIodSxmKQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwpAQCAtMjU3LDIxICsxOTgsMTIgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogQ2FsbGJhY2tzICovCi0jaWZkZWYgVVJCX09OTFlfQ0FMTEJBQ0sKIHN0YXRpYyB2b2lkCiBoZmEzODR4X3VzYm91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQKIGhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQKIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKLSNlbHNlCi1zdGF0aWMgdm9pZAotaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZAotaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotc3RhdGljIHZvaWQKLWhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQKIGhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pOwpAQCAtMzU4LDkgKzI5MCw5IEBACiBoZmEzODR4X2RvcnJpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSk7CkBAIC0zNjksOSArMzAxLDkgQEAKIGhmYTM4NHhfZG93cmlkKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcmlkLAorCXUxNglyaWQsCiAJdm9pZAkqcmlkZGF0YSwKLQlVSU5UCXJpZGRhdGFsZW4sCisJdW5zaWduZWQgaW50CXJpZGRhdGFsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKTsKQEAgLTM4MCwxMCArMzEyLDEwIEBACiBoZmEzODR4X2Rvcm1lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwpAQCAtMzkyLDE2ICszMjQsMTYgQEAKIGhmYTM4NHhfZG93bWVtKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcGFnZSwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNglwYWdlLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqZGF0YSwKLQlVSU5UCWxlbiwKKwl1bnNpZ25lZCBpbnQJbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSk7CiAKIHN0YXRpYyBpbnQKLWhmYTM4NHhfaXNnb29kX3BkcmNvZGUoVUlOVDE2IHBkcmNvZGUpOworaGZhMzg0eF9pc2dvb2RfcGRyY29kZSh1MTYgcGRyY29kZSk7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwpAQCAtNDM1LDE3ICszNjcsMTcgQEAKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnBpcGU9MHglMDh4XG4iLCB1cmItPnBpcGUpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+c3RhdHVzPTB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dHJhbnNmZXJfZmxhZ3M9MHglMDh4XG4iLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKLQlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2J1ZmZlcj0weCUwOHhcbiIsIChVSU5UKXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2J1ZmZlcj0weCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aD0weCUwOHhcbiIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5hY3R1YWxfbGVuZ3RoPTB4JTA4eFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmJhbmR3aWR0aD0weCUwOHhcbiIsIHVyYi0+YmFuZHdpZHRoKTsKLQlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnNldHVwX3BhY2tldChjdGwpPTB4JTA4eFxuIiwgKFVJTlQpdXJiLT5zZXR1cF9wYWNrZXQpOworCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+c2V0dXBfcGFja2V0KGN0bCk9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+c2V0dXBfcGFja2V0KTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnN0YXJ0X2ZyYW1lKGlzby9pcnEpPTB4JTA4eFxuIiwgdXJiLT5zdGFydF9mcmFtZSk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5pbnRlcnZhbChpcnEpPTB4JTA4eFxuIiwgdXJiLT5pbnRlcnZhbCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5lcnJvcl9jb3VudChpc28pPTB4JTA4eFxuIiwgdXJiLT5lcnJvcl9jb3VudCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT50aW1lb3V0PTB4JTA4eFxuIiwgdXJiLT50aW1lb3V0KTsKLQlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmNvbnRleHQ9MHglMDh4XG4iLCAoVUlOVCl1cmItPmNvbnRleHQpOwotCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+Y29tcGxldGU9MHglMDh4XG4iLCAoVUlOVCl1cmItPmNvbXBsZXRlKTsKKwlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmNvbnRleHQ9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+Y29udGV4dCk7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb21wbGV0ZT0weCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpdXJiLT5jb21wbGV0ZSk7CiB9CiAjZW5kaWYKIApAQCAtNjUyLDcgKzU4NCw3IEBACiAKIAkvKiBSZXN1bWUgdHJhbnNtaXR0aW5nLiAqLwogCWlmICggdGVzdF9hbmRfY2xlYXJfYml0KFdPUktfVFhfUkVTVU1FLCAmaHctPnVzYl9mbGFncykgKSB7Ci0JCXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKGh3LT53bGFuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShody0+d2xhbmRldi0+bmV0ZGV2KTsKIAl9CiAKIAlEQkZFWElUOwpAQCAtNzExLDggKzY0Myw4IEBACiAJdGFza2xldF9pbml0KCZody0+Y29tcGxldGlvbl9iaCwKIAkgICAgICAgICAgICAgaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRpb25fdGFzaywKIAkgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaHcpOwotCUlOSVRfV09SSzIoJmh3LT5saW5rX2JoLCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcik7Ci0JSU5JVF9XT1JLMigmaHctPnVzYl93b3JrLCBoZmEzODR4X3VzYl9kZWZlcik7CisJSU5JVF9XT1JLKCZody0+bGlua19iaCwgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIpOworCUlOSVRfV09SSygmaHctPnVzYl93b3JrLCBoZmEzODR4X3VzYl9kZWZlcik7CiAKIAlpbml0X3RpbWVyKCZody0+dGhyb3R0bGUpOwogCWh3LT50aHJvdHRsZS5mdW5jdGlvbiA9IGhmYTM4NHhfdXNiX3Rocm90dGxlZm47CkBAIC03MzMsNyArNjY1LDcgQEAKIAlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwogCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfSU5JVDsKIAotICAgICAgICBJTklUX1dPUksyKCZody0+Y29tbXNxdWFsX2JoLCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKTsKKyAgICAgICAgSU5JVF9XT1JLKCZody0+Y29tbXNxdWFsX2JoLCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKTsKIAlpbml0X3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyKTsKIAlody0+Y29tbXNxdWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHc7CiAJaHctPmNvbW1zcXVhbF90aW1lci5mdW5jdGlvbiA9IHByaXNtMnN0YV9jb21tc3F1YWxfdGltZXI7CkBAIC04ODgsNyArODIwLDcgQEAKIAogCWNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QJKnJyaWRyZXNwOwogCXZvaWQJCQkqcmlkZGF0YTsKLQlVSU5UCQkJcmlkZGF0YWxlbjsKKwl1bnNpZ25lZCBpbnQJCQlyaWRkYXRhbGVuOwogfTsKIHR5cGVkZWYgc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IgdXNiY3RseF9ycmlkX2NvbXBsZXRvcl90OwogCkBAIC05MTksNyArODUxLDcgQEAKIGluaXRfcnJpZF9jb21wbGV0b3IodXNiY3RseF9ycmlkX2NvbXBsZXRvcl90ICpjb21wbGV0b3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwLAogICAgICAgICAgICAgICAgICAgICB2b2lkICpyaWRkYXRhLAotICAgICAgICAgICAgICAgICAgICBVSU5UIHJpZGRhdGFsZW4pCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCWNvbXBsZXRvci0+aGVhZC5jb21wbGV0ZSA9IHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfZm47CiAJY29tcGxldG9yLT5ycmlkcmVzcCA9IHJyaWRyZXNwOwpAQCAtOTUyLDcgKzg4NCw3IEBACiAKICAgICAgICAgY29uc3QgaGZhMzg0eF91c2Jfcm1lbXJlc3BfdCAgKnJtZW1yZXNwOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YTsKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKIH07CiB0eXBlZGVmIHN0cnVjdCB1c2JjdGx4X3JtZW1fY29tcGxldG9yIHVzYmN0bHhfcm1lbV9jb21wbGV0b3JfdDsKIApAQCAtOTY5LDcgKzkwMSw3IEBACiBpbml0X3JtZW1fY29tcGxldG9yKHVzYmN0bHhfcm1lbV9jb21wbGV0b3JfdCAqY29tcGxldG9yLAogICAgICAgICAgICAgICAgICAgICBoZmEzODR4X3VzYl9ybWVtcmVzcF90ICpybWVtcmVzcCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgVUlOVCBsZW4pCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJY29tcGxldG9yLT5oZWFkLmNvbXBsZXRlID0gdXNiY3RseF9ybWVtX2NvbXBsZXRvcl9mbjsKIAljb21wbGV0b3ItPnJtZW1yZXNwID0gcm1lbXJlc3A7CkBAIC0xMDgwLDcgKzEwMTIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JyaWRfd2FpdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4pCitoZmEzODR4X2RvcnJpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2RvcnJpZChodywgRE9XQUlULAogCSAgICAgICAgICAgICAgICAgICAgICByaWQsIHJpZGRhdGEsIHJpZGRhdGFsZW4sCkBAIC0xMDg5LDcgKzEwMjEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3JyaWRfYXN5bmMoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByaWQsIHZvaWQgKnJpZGRhdGEsIFVJTlQgcmlkZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTExMDAsNyArMTAzMiw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd3JpZF93YWl0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnJpZGRhdGEsIFVJTlQgcmlkZGF0YWxlbikKK2hmYTM4NHhfZG93cmlkX3dhaXQoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkKGh3LCBET1dBSVQsCiAJICAgICAgICAgICAgICAgICAgICAgIHJpZCwgcmlkZGF0YSwgcmlkZGF0YWxlbiwKQEAgLTExMDksNyArMTA0MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvd3JpZF9hc3luYyhoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgVUlOVCByaWRkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4sCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAgICAgICAgICAgICAgICAgICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtMTEyMSw3ICsxMDUzLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG9ybWVtX3dhaXQoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHBhZ2UsIFVJTlQxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIFVJTlQgbGVuKQorICAgICAgICAgICAgICAgICAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JtZW0oaHcsIERPV0FJVCwKIAkgICAgICAgICAgICAgICAgICAgICAgcGFnZSwgb2Zmc2V0LCBkYXRhLCBsZW4sCkBAIC0xMTMwLDcgKzEwNjIsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3JtZW1fYXN5bmMoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBwYWdlLCBVSU5UMTYgb2Zmc2V0LCB2b2lkICpkYXRhLCBVSU5UIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHUxNiBwYWdlLCB1MTYgb2Zmc2V0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLAogICAgICAgICAgICAgICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTExNDMsMTAgKzEwNzUsMTAgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvd21lbV93YWl0KAogICAgICAgICBoZmEzODR4X3QgKmh3LAotICAgICAgICBVSU5UMTYgIHBhZ2UsCi0gICAgICAgIFVJTlQxNiAgb2Zmc2V0LAorICAgICAgICB1MTYgIHBhZ2UsCisgICAgICAgIHUxNiAgb2Zmc2V0LAogICAgICAgICB2b2lkICAgICpkYXRhLAotICAgICAgICBVSU5UICAgIGxlbikKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3dtZW0oaHcsIERPV0FJVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLCBvZmZzZXQsIGRhdGEsIGxlbiwKQEAgLTExNTYsMTAgKzEwODgsMTAgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvd21lbV9hc3luYygKICAgICAgICAgaGZhMzg0eF90ICpodywKLSAgICAgICAgVUlOVDE2ICBwYWdlLAotICAgICAgICBVSU5UMTYgIG9mZnNldCwKKyAgICAgICAgdTE2ICBwYWdlLAorICAgICAgICB1MTYgIG9mZnNldCwKICAgICAgICAgdm9pZCAgICAqZGF0YSwKLSAgICAgICAgVUlOVCAgICBsZW4sCisgICAgICAgIHVuc2lnbmVkIGludCAgICBsZW4sCiAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgIHZvaWQgICAgKnVzZXJjYl9kYXRhKQpAQCAtMTI0Niw3ICsxMTc4LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAJaGZhMzg0eF9tZXRhY21kX3QgY21kOwpAQCAtMTI4Niw3ICsxMjE4LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTEzMDUsOTUgKzEyMzcsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX25vdGlmeQotKgotKiBTZW5kcyBhbiBpbmZvIGZyYW1lIHRvIHRoZSBmaXJtd2FyZSB0byBhbHRlciB0aGUgYmVoYXZpb3IKLSogb2YgdGhlIGYvdyBhc3luY2ggcHJvY2Vzc2VzLiAgQ2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIE1BQwotKiBpcyBpbiB0aGUgZW5hYmxlZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyZWNsYWltCQlbMHwxXSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gRklEIHdpbGwKLSoJCQliZSBoYW5kZWQgYmFjayAodmlhIEFsbG9jIGV2ZW50KSBmb3IgcmV1c2UuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCWZpZAkJRklEIG9mIGJ1ZmZlciBjb250YWluaW5nIHRoZSBmcmFtZSB0aGF0IHdhcwotKgkJCXByZXZpb3VzbHkgY29waWVkIHRvIE1BQyBtZW1vcnkgdmlhIHRoZSBiYXAuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKglody0+cmVzcDAgd2lsbCBjb250YWluIHRoZSBGSUQgYmVpbmcgdXNlZCBieSBhc3luYyBub3RpZnkKLSoJcHJvY2Vzcy4gIElmIHJlY2xhaW09PTAsIHJlc3AwIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGZpZAotKglhcmd1bWVudC4gIElmIHJlY2xhaW09PTEsIHJlc3AwIHdpbGwgYmUgdGhlIGRpZmZlcmVudC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9ub3RpZnkoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBmaWQsCi0JCSAgICAgICB2b2lkICpidWYsIFVJTlQxNiBsZW4pCi17Ci0jaWYgMAotCWludAlyZXN1bHQgPSAwOwotCVVJTlQxNgljbWQ7Ci0JREJGRU5URVI7Ci0JY21kID0JSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX05PVElGWSkgfAotCQlIRkEzODR4X0NNRF9SRUNMX1NFVChyZWNsYWltKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIGNtZCk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLXJldHVybiAwOwotfQotCi0KLSNpZiAwCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfaW5xdWlyeQotKgotKiBSZXF1ZXN0cyBhbiBpbmZvIGZyYW1lIGZyb20gdGhlIGZpcm13YXJlLiAgVGhlIGluZm8gZnJhbWUgd2lsbAotKiBiZSBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHkgdmlhIHRoZSBJbmZvIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWZpZAkJRklEIG9mIHRoZSBpbmZvIGZyYW1lIHJlcXVlc3RlZC4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2lucXVpcnkoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfSU5RKTsKLQljbWQucGFybTAgPSAwOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZW5kaWYKLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogaGZhMzg0eF9jbWRfbW9uaXRvcgogKgpAQCAtMTQyMyw3ICsxMjY2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBlbmFibGUpCitpbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCB1MTYgZW5hYmxlKQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTE0ODEsOCArMTMyNCw4IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywgVUlOVDE2IG1vZGUsIFVJTlQxNiBsb3dhZGRyLAotCQkJCVVJTlQxNiBoaWdoYWRkciwgVUlOVDE2IGNvZGVsZW4pCitpbnQgaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywgdTE2IG1vZGUsIHUxNiBsb3dhZGRyLAorCQkJCXUxNiBoaWdoYWRkciwgdTE2IGNvZGVsZW4pCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAJaGZhMzg0eF9tZXRhY21kX3QgY21kOwpAQCAtMTUzMiw3ICsxMzc1LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZAogaGZhMzg0eF9jb3B5X2Zyb21fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKKwloZmEzODR4X3QgKmh3LCB1MzIgY2FyZGFkZHIsIHUzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlEQkZFTlRFUjsKIAlXTEFOX0xPR19FUlJPUigibm90IHVzZWQgaW4gVVNCLlxuIik7CkBAIC0xNTY2LDcgKzE0MDksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCiBoZmEzODR4X2NvcHlfdG9fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKKwloZmEzODR4X3QgKmh3LCB1MzIgY2FyZGFkZHIsIHUzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlEQkZFTlRFUjsKIAlXTEFOX0xPR19FUlJPUigibm90IHVzZWQgaW4gVVNCLlxuIik7CkBAIC0xNTk5LDc4ICsxNDQyLDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKIHsKLSNpZiAwCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlzdHJ1Y3QgdXNiX2RldmljZQkqcGFyZW50ID0gaHctPnVzYi0+cGFyZW50OwotCWludAkJCWk7Ci0JaW50CQkJcG9ydCA9IC0xOwotI2VuZGlmCi0jZW5kaWYKIAlpbnQgCQkJcmVzdWx0ID0gMDsKIAotCi0jZGVmaW5lIFAyX1VTQl9SVF9QT1JUCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfT1RIRVIpCi0jZGVmaW5lIFAyX1VTQl9GRUFUX1JFU0VUCTQKLSNkZWZpbmUgUDJfVVNCX0ZFQVRfQ19SRVNFVAkyMAotCiAJREJGRU5URVI7CiAKLSNpZiAwCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQkvKiBGaW5kIHRoZSBodWIgcG9ydCAqLwotCWZvciAoIGkgPSAwOyBpIDwgcGFyZW50LT5tYXhjaGlsZDsgaSsrKSB7Ci0JCWlmIChwYXJlbnQtPmNoaWxkcmVuW2ldID09IGh3LT51c2IpIHsKLQkJCXBvcnQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHBvcnQgPCAwKSByZXR1cm4gLUVOT0VOVDsKLQotCS8qIFNldCBhbmQgY2xlYXIgdGhlIHJlc2V0ICovCi0JdXNiX2NvbnRyb2xfbXNnKHBhcmVudCwgdXNiX3NuZGN0cmxwaXBlKHBhcmVudCwgMCksCi0JCVVTQl9SRVFfU0VUX0ZFQVRVUkUsIFAyX1VTQl9SVF9QT1JULCBQMl9VU0JfRkVBVF9SRVNFVCwKLQkJcG9ydCsxLCBOVUxMLCAwLCAxKkhaKTsKLQl3YWl0X21zKGhvbGR0aW1lKTsKLQl1c2JfY29udHJvbF9tc2cocGFyZW50LCB1c2Jfc25kY3RybHBpcGUocGFyZW50LCAwKSwKLQkJVVNCX1JFUV9DTEVBUl9GRUFUVVJFLCBQMl9VU0JfUlRfUE9SVCwgUDJfVVNCX0ZFQVRfQ19SRVNFVCwKLQkJcG9ydCsxLCBOVUxMLCAwLCAxKkhaKTsKLQl3YWl0X21zKHNldHRsZXRpbWUpOwotCi0JLyogU2V0IHRoZSBkZXZpY2UgYWRkcmVzcyAqLwotCXJlc3VsdD11c2Jfc2V0X2FkZHJlc3MoaHctPnVzYik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJV0xBTl9MT0dfRVJST1IoInJlc2V0X3VzYmRldjogRGV2IG5vdCBhY2NlcHRpbmcgYWRkcmVzcywgIgotCQkJInJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQkJY2xlYXJfYml0KGh3LT51c2ItPmRldm51bSwgJmh3LT51c2ItPmJ1cy0+ZGV2bWFwLmRldmljZW1hcCk7Ci0JCWh3LT51c2ItPmRldm51bSA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qIExldCB0aGUgYWRkcmVzcyBzZXR0bGUgKi8KLQl3YWl0X21zKDIwKTsKLQotCS8qIEFzc3VtZSB3ZSdyZSByZXVzaW5nIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIGRhdGEgKi8KLQotCS8qIFNldCB0aGUgY29uZmlndXJhdGlvbi4gKi8KLQlXTEFOX0xPR19ERUJVRygzLCAiU2V0dGluZyBDb25maWd1cmF0aW9uICVkXG4iLAotCQlody0+dXNiLT5jb25maWdbMF0uYkNvbmZpZ3VyYXRpb25WYWx1ZSk7Ci0JcmVzdWx0PXVzYl9zZXRfY29uZmlndXJhdGlvbihody0+dXNiLCBody0+dXNiLT5jb25maWdbMF0uYkNvbmZpZ3VyYXRpb25WYWx1ZSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJ1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsCi0JCQkJcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQkvKiBMZXQgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGxlICovCi0Jd2FpdF9tcygyMCk7Ci0KLSBkb25lOgotI2Vsc2UKLQlyZXN1bHQ9dXNiX3Jlc2V0X2RldmljZShody0+dXNiKTsKLQlpZihyZXN1bHQ8MCkgewotCQlXTEFOX0xPR19FUlJPUigidXNiX3Jlc2V0X2RldmljZSgpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIixyZXN1bHQpOwotCX0KLSNlbmRpZgotI2VuZGlmCi0KIAlyZXN1bHQ9dXNiX3Jlc2V0X2RldmljZShody0+dXNiKTsKIAlpZihyZXN1bHQ8MCkgewogCQlXTEFOX0xPR19FUlJPUigidXNiX3Jlc2V0X2RldmljZSgpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIixyZXN1bHQpOwpAQCAtMTkyNSw5ICsxNzAwLDkgQEAKIGhmYTM4NHhfZG9ycmlkKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcmlkLAorCXUxNglyaWQsCiAJdm9pZAkqcmlkZGF0YSwKLQlVSU5UCXJpZGRhdGFsZW4sCisJdW5zaWduZWQgaW50CXJpZGRhdGFsZW4sCiAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSkKQEAgLTIwMTEsOSArMTc4Niw5IEBACiBoZmEzODR4X2Rvd3JpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSkKQEAgLTIxMDQsMTAgKzE4NzksMTAgQEAKIGhmYTM4NHhfZG9ybWVtKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcGFnZSwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNglwYWdlLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqZGF0YSwKLQlVSU5UCWxlbiwKKwl1bnNpZ25lZCBpbnQJbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSkKQEAgLTIyMDUsMTAgKzE5ODAsMTAgQEAKIGhmYTM4NHhfZG93bWVtKAogCWhmYTM4NHhfdCAqaHcsCiAJQ01EX01PREUgbW9kZSwKLQlVSU5UMTYJcGFnZSwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNglwYWdlLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqZGF0YSwKLQlVSU5UCWxlbiwKKwl1bnNpZ25lZCBpbnQJbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSkKQEAgLTIzMjUsNyArMjEwMCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50CXJlc3VsdCA9IDA7CiAKQEAgLTIzNjcsNyArMjE0Miw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCkBAIC0yNTIwLDIyICsyMjk1LDIyIEBACiBpbnQKIGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKAogCWhmYTM4NHhfdAkqaHcsCi0JVUlOVDMyCQlkYWRkciwKKwl1MzIJCWRhZGRyLAogCXZvaWQJCSpidWYsCi0JVUlOVDMyCQlsZW4pCisJdTMyCQlsZW4pCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCVVJTlQzMgkJZGxidWZhZGRyOworCXUzMgkJZGxidWZhZGRyOwogCWludAkJbmJ1cm5zOwotCVVJTlQzMgkJYnVybmxlbjsKLQlVSU5UMzIJCWJ1cm5kYWRkcjsKLQlVSU5UMTYJCWJ1cm5sbzsKLQlVSU5UMTYJCWJ1cm5oaTsKKwl1MzIJCWJ1cm5sZW47CisJdTMyCQlidXJuZGFkZHI7CisJdTE2CQlidXJubG87CisJdTE2CQlidXJuaGk7CiAJaW50CQlud3JpdGVzOwotCVVJTlQ4CQkqd3JpdGVidWY7Ci0JVUlOVDE2CQl3cml0ZXBhZ2U7Ci0JVUlOVDE2CQl3cml0ZW9mZnNldDsKLQlVSU5UMzIJCXdyaXRlbGVuOworCXU4CQkqd3JpdGVidWY7CisJdTE2CQl3cml0ZXBhZ2U7CisJdTE2CQl3cml0ZW9mZnNldDsKKwl1MzIJCXdyaXRlbGVuOwogCWludAkJaTsKIAlpbnQJCWo7CiAKQEAgLTI2ODYsNyArMjQ2MSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pCiB7CiAJaW50IAkJCXJlc3VsdDsKIAlEQkZFTlRFUjsKQEAgLTI3MjcsNyArMjUwMiw3IEBACiBpbnQKIGhmYTM4NHhfZHJ2cl9nZXRjb25maWdfYXN5bmMoCiAgICAgICAgICBoZmEzODR4X3QgICAgICAgICAgICAgICAqaHcsCi0gICAgICAgICBVSU5UMTYgICAgICAgICAgICAgICAgICByaWQsCisgICAgICAgICB1MTYgICAgICAgICAgICAgICAgICByaWQsCiAgICAgICAgICBjdGx4X3VzZXJjYl90ICAgICAgICAgICB1c2VyY2IsCiAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdXNlcmNiX2RhdGEpCiB7CkBAIC0yNzYxLDkgKzI1MzYsOSBAQAogaW50CiBoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKAogICAgICAgICAgaGZhMzg0eF90ICAgICAgICpodywKLSAgICAgICAgIFVJTlQxNiAgICAgICAgICByaWQsCisgICAgICAgICB1MTYgICAgICAgICAgcmlkLAogICAgICAgICAgdm9pZCAgICAgICAgICAgICpidWYsCi0gICAgICAgICBVSU5UMTYgICAgICAgICAgbGVuLAorICAgICAgICAgdTE2ICAgICAgICAgIGxlbiwKICAgICAgICAgIGN0bHhfdXNlcmNiX3QgICB1c2VyY2IsCiAgICAgICAgICB2b2lkICAgICAgICAgICAgKnVzZXJjYl9kYXRhKQogewpAQCAtMjc5MCw3ICsyNTY1LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIFVJTlQ4ICphZGRyKQoraW50IGhmYTM4NHhfZHJ2cl9oYW5kb3ZlciggaGZhMzg0eF90ICpodywgdTggKmFkZHIpCiB7CiAgICAgICAgIERCRkVOVEVSOwogCVdMQU5fTE9HX0VSUk9SKCJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBVU0IhXG4iKTsKQEAgLTI4MjQsODggKzI1OTksNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX21taV9yZWFkCi0qCi0qIFJlYWQgbW1pIHJlZ2lzdGVycy4gIG1taSBpcyBpbnRlcnNpbC1zcGVhayBmb3IgdGhlIGJhc2ViYW5kCi0qIHByb2Nlc3NvciByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICAgICAgIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgcmVnaXN0ZXIgICAgICAgIFRoZSB0ZXN0IHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkIChtdXN0IGJlIGV2ZW4gIykuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCi0qICAgICAgID4wICAgICAgICAgICAgICBmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSogICAgICAgPDAgICAgICAgICAgICAgIGRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyLCBVSU5UMzIgKnJlc3ApCi17Ci0jaWYgMAotICAgICAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgVUlOVDE2ICBjbWRfY29kZSA9IChVSU5UMTYpIDB4MzA7Ci0gICAgICAgIFVJTlQxNiBwYXJhbSA9IChVSU5UMTYpIGFkZHI7Ci0gICAgICAgIERCRkVOVEVSOwotCi0gICAgICAgIC8qIERvIGkgbmVlZCBhIGhvc3QyaGZhLi4uIGNvbnZlcnNpb24gPyAqLwotICAgICAgICByZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIGNtZF9jb2RlKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotI2VuZGlmCi1yZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBhZGRyICAgICAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSogICAgICAgZGF0YSAgICAgICAgICAgIFRoZSBkYXRhIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3Rlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50Ci1oZmEzODR4X2RydnJfbW1pX3dyaXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyLCBVSU5UMzIgZGF0YSkKLXsKLSNpZiAwCi0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICBVSU5UMTYgIGNtZF9jb2RlID0gKFVJTlQxNikgMHgzMTsKLSAgICAgICAgVUlOVDE2IHBhcmFtMCA9IChVSU5UMTYpIGFkZHI7Ci0gICAgICAgIFVJTlQxNiBwYXJhbTEgPSAoVUlOVDE2KSBkYXRhOwotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBhZGRyID0gMHglMDhseFxuIiwgYWRkcik7Ci0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsIm1taSB3cml0ZSA6IGRhdGEgPSAweCUwOGx4XG4iLCBkYXRhKTsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWRfY29kZSk7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGhmYTM4NHhfZHJ2cl9yYW1kbF9kaXNhYmxlCiAqCiAqIEVuZHMgdGhlIHJhbSBkb3dubG9hZCBzdGF0ZS4KQEAgLTI5NjksMTEgKzI2NjIsMTEgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGV4ZWFkZHIpCitoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUzMiBleGVhZGRyKQogewogCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCWxvd2FkZHI7Ci0JVUlOVDE2CQloaWFkZHI7CisJdTE2CQlsb3dhZGRyOworCXUxNgkJaGlhZGRyOwogCWludAkJaTsKIAlEQkZFTlRFUjsKIAkvKiBDaGVjayB0aGF0IGEgcG9ydCBpc24ndCBhY3RpdmUgKi8KQEAgLTMwNDQsMTYgKzI3MzcsMTYgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbikKK2hmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQqIGJ1ZiwgdTMyIGxlbikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7CiAJaW50CQlud3JpdGVzOwotCVVJTlQ4CQkqZGF0YSA9IGJ1ZjsKKwl1OAkJKmRhdGEgPSBidWY7CiAJaW50CQlpOwotCVVJTlQzMgkJY3VycmFkZHI7Ci0JVUlOVDE2CQljdXJycGFnZTsKLQlVSU5UMTYJCWN1cnJvZmZzZXQ7Ci0JVUlOVDE2CQljdXJybGVuOworCXUzMgkJY3VycmFkZHI7CisJdTE2CQljdXJycGFnZTsKKwl1MTYJCWN1cnJvZmZzZXQ7CisJdTE2CQljdXJybGVuOwogCURCRkVOVEVSOwogCS8qIENoZWNrIHRoYXQgd2UncmUgaW4gdGhlIHJhbSBkb3dubG9hZCBzdGF0ZSAqLwogCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQgKSB7CkBAIC0zMTI1LDIxICsyODE4LDIxIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyBvciBub24tY2FyZCBpbnRlcnJ1cHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIFVJTlQgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQkqcGRhID0gYnVmOworCXUxNgkJKnBkYSA9IGJ1ZjsKIAlpbnQJCXBkYW9rID0gMDsKIAlpbnQJCW1vcmVwZHJzID0gMTsKIAlpbnQJCWN1cnJwZHIgPSAwOwkvKiB3b3JkIG9mZnNldCBvZiB0aGUgY3VycmVudCBwZHIgKi8KIAlzaXplX3QJCWk7Ci0JVUlOVDE2CQlwZHJsZW47CQkvKiBwZHIgbGVuZ3RoIGluIGJ5dGVzLCBob3N0IG9yZGVyICovCi0JVUlOVDE2CQlwZHJjb2RlOwkvKiBwZHIgY29kZSwgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJY3VycnBhZ2U7Ci0JVUlOVDE2CQljdXJyb2Zmc2V0OworCXUxNgkJcGRybGVuOwkJLyogcGRyIGxlbmd0aCBpbiBieXRlcywgaG9zdCBvcmRlciAqLworCXUxNgkJcGRyY29kZTsJLyogcGRyIGNvZGUsIGhvc3Qgb3JkZXIgKi8KKwl1MTYJCWN1cnJwYWdlOworCXUxNgkJY3Vycm9mZnNldDsKIAlzdHJ1Y3QgcGRhbG9jIHsKLQkJVUlOVDMyCWNhcmRhZGRyOwotCQlVSU5UMTYJYXV4Y3RsOworCQl1MzIJY2FyZGFkZHI7CisJCXUxNglhdXhjdGw7CiAJfSBwZGFsb2NbXSA9CiAJewogCQl7IEhGQTM4NDJfUERBX0JBU0UsCQkwfSwKQEAgLTMyNDMsNyArMjkzNiw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkX3dhaXQoaHcsIHJpZCwgYnVmLCBsZW4pOwogfQpAQCAtMzI2NywxOSArMjk2MCwzOCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiBpbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KGhmYTM4NHhfdCAqaHcpCiB7Ci0JaW50CQlyZXN1bHQ7CisJaW50CQlyZXN1bHQsIHJlc3VsdDEsIHJlc3VsdDI7CisJdTE2CQlzdGF0dXM7CiAJREJGRU5URVI7CiAKIAltaWdodF9zbGVlcCgpOwogCi0JaWYgKHVzYl9jbGVhcl9oYWx0KGh3LT51c2IsIGh3LT5lbmRwX2luKSkgeworCS8qIENsZWFyIGVuZHBvaW50IHN0YWxscyAtIGJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIGVuZHBvaW50CisJICogaXMgc2hvd2luZyBhIHN0YWxsIHN0YXR1cy4gU29tZSBwcmlzbTIgY2FyZHMgc2VlbSB0byBiZWhhdmUKKwkgKiBiYWRseSBpZiBhIGNsZWFyX2hhbHQgaXMgY2FsbGVkIHdoZW4gdGhlIGVuZHBvaW50IGlzIGFscmVhZHkKKwkgKiBvaworCSAqLworCXJlc3VsdCA9IHVzYl9nZXRfc3RhdHVzKGh3LT51c2IsIFVTQl9SRUNJUF9FTkRQT0lOVCwgaHctPmVuZHBfaW4sICZzdGF0dXMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVdMQU5fTE9HX0VSUk9SKAorCQkJIkNhbm5vdCBnZXQgYnVsayBpbiBlbmRwb2ludCBzdGF0dXMuXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoKHN0YXR1cyA9PSAxKSAmJiB1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9pbikpIHsKIAkJV0xBTl9MT0dfRVJST1IoCiAJCQkiRmFpbGVkIHRvIHJlc2V0IGJ1bGsgaW4gZW5kcG9pbnQuXG4iKTsKIAl9CiAKLQlpZiAodXNiX2NsZWFyX2hhbHQoaHctPnVzYiwgaHctPmVuZHBfb3V0KSkgeworCXJlc3VsdCA9IHVzYl9nZXRfc3RhdHVzKGh3LT51c2IsIFVTQl9SRUNJUF9FTkRQT0lOVCwgaHctPmVuZHBfb3V0LCAmc3RhdHVzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlXTEFOX0xPR19FUlJPUigKKwkJCSJDYW5ub3QgZ2V0IGJ1bGsgb3V0IGVuZHBvaW50IHN0YXR1cy5cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmICgoc3RhdHVzID09IDEpICYmIHVzYl9jbGVhcl9oYWx0KGh3LT51c2IsIGh3LT5lbmRwX291dCkpIHsKIAkJV0xBTl9MT0dfRVJST1IoCiAJCQkiRmFpbGVkIHRvIHJlc2V0IGJ1bGsgb3V0IGVuZHBvaW50LlxuIik7CiAJfQpAQCAtMzI5NiwxNCArMzAwOCwzNyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JLyogY2FsbCBpbml0aWFsaXplICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCXVzYl9raWxsX3VyYigmaHctPnJ4X3VyYik7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJImNtZF9pbml0aWFsaXplKCkgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCi0JCQlyZXN1bHQpOwotCQlnb3RvIGRvbmU7CisJLyogQ2FsbCBpbml0aWFsaXplIHR3aWNlLCB3aXRoIGEgMSBzZWNvbmQgc2xlZXAgaW4gYmV0d2Vlbi4KKwkgKiBUaGlzIGlzIGEgbmFzdHkgd29yay1hcm91bmQgc2luY2UgbWFueSBwcmlzbTIgY2FyZHMgc2VlbSB0bworCSAqIG5lZWQgdGltZSB0byBzZXR0bGUgYWZ0ZXIgYW4gaW5pdCBmcm9tIGNvbGQuIFRoZSBzZWNvbmQKKwkgKiBjYWxsIHRvIGluaXRpYWxpemUgaW4gdGhlb3J5IGlzIG5vdCBuZWNlc3NhcnkgLSBidXQgd2UgY2FsbAorCSAqIGl0IGFueXdheSBhcyBhIGRvdWJsZSBpbnN1cmFuY2UgcG9saWN5OgorCSAqIDEpIElmIHRoZSBmaXJzdCBpbml0IHNob3VsZCBmYWlsLCB0aGUgc2Vjb25kIG1heSB3ZWxsIHN1Y2NlZWQKKwkgKiAgICBhbmQgdGhlIGNhcmQgY2FuIHN0aWxsIGJlIHVzZWQKKwkgKiAyKSBJdCBoZWxwcyBlbnN1cmVzIGFsbCBpcyB3ZWxsIHdpdGggdGhlIGNhcmQgYWZ0ZXIgdGhlIGZpcnN0CisJICogICAgaW5pdCBhbmQgc2V0dGxlIHRpbWUuCisJICovCisJcmVzdWx0MSA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOworCW1zbGVlcCgxMDAwKTsKKwlyZXN1bHQgPSByZXN1bHQyID0gaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7CisJaWYgKHJlc3VsdDEgIT0gMCkgeworCQlpZiAocmVzdWx0MiAhPSAwKSB7CisJCQlXTEFOX0xPR19FUlJPUigKKwkJCQkiY21kX2luaXRpYWxpemUoKSBmYWlsZWQgb24gdHdvIGF0dGVtcHRzLCByZXN1bHRzICVkIGFuZCAlZFxuIiwKKwkJCQlyZXN1bHQxLCByZXN1bHQyKTsKKwkJCXVzYl9raWxsX3VyYigmaHctPnJ4X3VyYik7CisJCQlnb3RvIGRvbmU7CisJCX0gZWxzZSB7CisJCQlXTEFOX0xPR19ERUJVRygwLCAiRmlyc3QgY21kX2luaXRpYWxpemUoKSBmYWlsZWQgKHJlc3VsdCAlZCksXG4iLAorCQkJCXJlc3VsdDEpOworCQkJV0xBTl9MT0dfREVCVUcoMCwgImJ1dCBzZWNvbmQgYXR0ZW1wdCBzdWNjZWVkZWQuIEFsbCBzaG91bGQgYmUgb2tcbiIpOworCQl9CisJfSBlbHNlIGlmIChyZXN1bHQyICE9IDApIHsKKwkJV0xBTl9MT0dfV0FSTklORygKKwkJCSJGaXJzdCBjbWRfaW5pdGlhbGl6ZSgpIHN1Y2NlZWRlZCwgYnV0IHNlY29uZCBhdHRlbXB0IGZhaWxlZCAocmVzdWx0PSVkKVxuIiwKKwkJCXJlc3VsdDIpOworCQlXTEFOX0xPR19XQVJOSU5HKCJNb3N0IGxpa2VseSB0aGUgY2FyZCB3aWxsIGJlIGZ1bmN0aW9uYWxcbiIpOworCQkJZ290byBkb25lOwogCX0KIAogCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfUlVOTklORzsKQEAgLTM4NDksMTEgKzM1ODQsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgVVJCX09OTFlfQ0FMTEJBQ0sKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotI2Vsc2UKLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLSNlbmRpZgogewogCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CiAJaGZhMzg0eF90CQkqaHc7CkBAIC0zODYxLDcgKzM1OTIsNyBAQAogCXN0cnVjdCBza19idWZmICAgICAgICAgICpza2IgPSBOVUxMOwogCWludAkJCXJlc3VsdDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICB1cmJfc3RhdHVzOwotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAogCWVudW0gVVNCSU5fQUNUSU9OIHsKIAkJSEFORExFLApAQCAtMzg3Myw3ICszNjA0LDcgQEAKIAogCWlmICggIXdsYW5kZXYgfHwKIAkgICAgICF3bGFuZGV2LT5uZXRkZXYgfHwKLQkgICAgICFuZXRpZl9kZXZpY2VfcHJlc2VudCh3bGFuZGV2LT5uZXRkZXYpICkKKwkgICAgIHdsYW5kZXYtPmh3cmVtb3ZlZCApCiAJCWdvdG8gZXhpdDsKIAogCWh3ID0gd2xhbmRldi0+cHJpdjsKQEAgLTQwODgsNyArMzgxOSw3IEBACiAJCWlmICh1bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhodywgY3RseCkgPT0gMCkKIAkJCXJ1bl9xdWV1ZSA9IDE7CiAJfSBlbHNlIHsKLQkJY29uc3QgVUlOVDE2IGludHlwZSA9ICh1c2Jpbi0+dHlwZSZ+aG9zdDJoZmEzODR4XzE2KDB4ODAwMCkpOworCQljb25zdCB1MTYgaW50eXBlID0gKHVzYmluLT50eXBlJn5ob3N0MmhmYTM4NHhfMTYoMHg4MDAwKSk7CiAKIAkJLyoKIAkJICogQ2hlY2sgdGhhdCBvdXIgbWVzc2FnZSBpcyB3aGF0IHdlJ3JlIGV4cGVjdGluZyAuLi4KQEAgLTQxNjgsNyArMzg5OSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pCiB7Ci0JVUlOVDE2CQkJc3RhdHVzOworCXUxNgkJCXN0YXR1czsKIAlEQkZFTlRFUjsKIAogCXN0YXR1cyA9IGhmYTM4NHgyaG9zdF8xNih1c2Jpbi0+dHlwZSk7IC8qIHllYWggSSBrbm93IGl0IHNheXMgdHlwZS4uLiovCkBAIC00MjA4LDggKzM5MzksOCBAQAogCWhmYTM4NHhfdCAgICAgICAgICAgICAgICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaGRybGVuOwogCXA4MDIxMV9yeG1ldGFfdCAgICAgICAgICpyeG1ldGE7Ci0JVUlOVDE2ICAgICAgICAgICAgICAgICAgZGF0YV9sZW47Ci0JVUlOVDE2ICAgICAgICAgICAgICAgICAgZmM7CisJdTE2ICAgICAgICAgICAgICAgICAgZGF0YV9sZW47CisJdTE2ICAgICAgICAgICAgICAgICAgZmM7CiAKIAlEQkZFTlRFUjsKIApAQCAtNDMxNSwxMiArNDA0NiwxMSBAQAogc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfcnhtb25pdG9yKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiX3J4ZnJtX3QgKnJ4ZnJtKQogewogCWhmYTM4NHhfcnhfZnJhbWVfdCAgICAgICAgICAgICAgKnJ4ZGVzYyA9ICYocnhmcm0tPmRlc2MpOwotCVVJTlQJCQkJaGRybGVuID0gMDsKLQlVSU5UCQkJCWRhdGFsZW4gPSAwOwotCVVJTlQJCQkJc2tibGVuID0gMDsKLQlwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QJKm1zZzsKLQlVSU5UOAkJCQkqZGF0YXA7Ci0JVUlOVDE2CQkJCWZjOworCXVuc2lnbmVkIGludAkJCQloZHJsZW4gPSAwOworCXVuc2lnbmVkIGludAkJCQlkYXRhbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQJCQkJc2tibGVuID0gMDsKKwl1OAkJCQkqZGF0YXA7CisJdTE2CQkJCWZjOwogCXN0cnVjdCBza19idWZmCQkJKnNrYjsKIAloZmEzODR4X3QJCSAgICAgICAgKmh3ID0gd2xhbmRldi0+cHJpdjsKIApAQCAtNDMzMywxNSArNDA2MywxNSBAQAogCWRhdGFsZW4gPSBoZmEzODR4Mmhvc3RfMTYocnhkZXNjLT5kYXRhX2xlbik7CiAKIAkvKiBBbGxvY2F0ZSBhbiBpbmQgbWVzc2FnZStmcmFtZXNpemUgc2tiICovCi0Jc2tibGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkgKworCXNrYmxlbiA9IHNpemVvZihwODAyMTFfY2FwaGRyX3QpICsKIAkJaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKIAogCS8qIHNhbml0eSBjaGVjayB0aGUgbGVuZ3RoICovCiAJaWYgKCBza2JsZW4gPgotCQkoc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkgKwotCQlXTEFOX0hEUl9BNF9MRU4gKyBXTEFOX0RBVEFfTUFYTEVOICsgV0xBTl9DUkNfTEVOKSApIHsKKwkgICAgIChzaXplb2YocDgwMjExX2NhcGhkcl90KSArCisJICAgICAgV0xBTl9IRFJfQTRfTEVOICsgV0xBTl9EQVRBX01BWExFTiArIFdMQU5fQ1JDX0xFTikgKSB7CiAJCVdMQU5fTE9HX0RFQlVHKDEsICJvdmVybGVuIGZybTogbGVuPSV6ZFxuIiwKLQkJCXNrYmxlbiAtIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKKwkJCSAgICAgICBza2JsZW4gLSBzaXplb2YocDgwMjExX2NhcGhkcl90KSk7CiAJfQogCiAJaWYgKCAoc2tiID0gZGV2X2FsbG9jX3NrYihza2JsZW4pKSA9PSBOVUxMICkgewpAQCAtNDM1MSw2NiArNDA4MSw3IEBACiAKIAkvKiBvbmx5IHByZXBlbmQgdGhlIHByaXNtIGhlYWRlciBpZiBpbiB0aGUgcmlnaHQgbW9kZSAqLwogCWlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JICAgIChody0+c25pZmZoZHIgPT0gMCkpIHsKLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkpOwotCQltc2cgPSAocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KikgZGF0YXA7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBtZW1iZXJzICovCi0JCW1zZy0+bXNnY29kZSA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07Ci0JCW1zZy0+bXNnbGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCk7Ci0JCXN0cmNweShtc2ctPmRldm5hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JCW1zZy0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKLQkJbXNnLT5ob3N0dGltZS5zdGF0dXMgPSAwOwotCQltc2ctPmhvc3R0aW1lLmxlbiA9IDQ7Ci0JCW1zZy0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7Ci0KLQkJbXNnLT5tYWN0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZTsKLQkJbXNnLT5tYWN0aW1lLnN0YXR1cyA9IDA7Ci0JCW1zZy0+bWFjdGltZS5sZW4gPSA0OwotCQltc2ctPm1hY3RpbWUuZGF0YSA9IHJ4ZGVzYy0+dGltZTsKLQotCQltc2ctPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOwotCQltc2ctPmNoYW5uZWwuc3RhdHVzID0gMDsKLQkJbXNnLT5jaGFubmVsLmxlbiA9IDQ7Ci0JCW1zZy0+Y2hhbm5lbC5kYXRhID0gaHctPnNuaWZmX2NoYW5uZWw7Ci0KLQkJbXNnLT5yc3NpLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaTsKLQkJbXNnLT5yc3NpLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCW1zZy0+cnNzaS5sZW4gPSA0OwotCQltc2ctPnJzc2kuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zcS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxOwotCQltc2ctPnNxLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCW1zZy0+c3EubGVuID0gNDsKLQkJbXNnLT5zcS5kYXRhID0gMDsKLQotCQltc2ctPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKLQkJbXNnLT5zaWduYWwuc3RhdHVzID0gMDsKLQkJbXNnLT5zaWduYWwubGVuID0gNDsKLQkJbXNnLT5zaWduYWwuZGF0YSA9IHJ4ZGVzYy0+c2lnbmFsOwotCi0JCW1zZy0+bm9pc2UuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZTsKLQkJbXNnLT5ub2lzZS5zdGF0dXMgPSAwOwotCQltc2ctPm5vaXNlLmxlbiA9IDQ7Ci0JCW1zZy0+bm9pc2UuZGF0YSA9IHJ4ZGVzYy0+c2lsZW5jZTsKLQotCQltc2ctPnJhdGUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlOwotCQltc2ctPnJhdGUuc3RhdHVzID0gMDsKLQkJbXNnLT5yYXRlLmxlbiA9IDQ7Ci0JCW1zZy0+cmF0ZS5kYXRhID0gcnhkZXNjLT5yYXRlIC8gNTsgLyogc2V0IHRvIDgwMi4xMSB1bml0cyAqLwotCi0JCW1zZy0+aXN0eC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHg7Ci0JCW1zZy0+aXN0eC5zdGF0dXMgPSAwOwotCQltc2ctPmlzdHgubGVuID0gNDsKLQkJbXNnLT5pc3R4LmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCi0JCW1zZy0+ZnJtbGVuLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuOwotCQltc2ctPmZybWxlbi5zdGF0dXMgPSAwOwotCQltc2ctPmZybWxlbi5sZW4gPSA0OwotCQltc2ctPmZybWxlbi5kYXRhID0gaGRybGVuICsgZGF0YWxlbiArIFdMQU5fQ1JDX0xFTjsKLQl9IGVsc2UgaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKLQkJICAgKGh3LT5zbmlmZmhkciAhPSAwKSkgeworCSAgICAoaHctPnNuaWZmaGRyICE9IDApKSB7CiAJCXA4MDIxMV9jYXBoZHJfdAkJKmNhcGhkcjsKIAkJLyogVGhlIE5FVyBoZWFkZXIgZm9ybWF0ISAqLwogCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBzaXplb2YocDgwMjExX2NhcGhkcl90KSk7CkBAIC00NTA4LDExICs0MTc5LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYm91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCi0jZWxzZQotc3RhdGljIHZvaWQgaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLSNlbmRpZgogewogCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CiAJaGZhMzg0eF91c2JvdXRfdAkqdXNib3V0ID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC00NTg5LDExICs0MjU2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKiBpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZCBoZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotI2Vsc2UKLXN0YXRpYyB2b2lkIGhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotI2VuZGlmCiB7CiAJaGZhMzg0eF90CSpodyA9IHVyYi0+Y29udGV4dDsKIAlpbnQgICAgICAgICAgICAgZGVsZXRlX3Jlc3B0aW1lciA9IDA7CkBAIC00OTY5LDcgKzQ2MzIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQKLWhmYTM4NHhfaXNnb29kX3BkcmNvZGUoVUlOVDE2IHBkcmNvZGUpCitoZmEzODR4X2lzZ29vZF9wZHJjb2RlKHUxNiBwZHJjb2RlKQogewogCXN3aXRjaChwZHJjb2RlKSB7CiAJY2FzZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCmluZGV4IDY4MTIxYjkuLmRmYzdiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKQEAgLTUyLDEwICs1Miw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogU3lzdGVtIEluY2x1ZGVzICovCiAKLSNkZWZpbmUgX19OT19WRVJTSU9OX18JCS8qIHByZXZlbnQgdGhlIHN0YXRpYyBkZWZpbml0aW9uICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNzAsNyArNjYsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xMDAsOCArOTUsOCBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwogCi1zdGF0aWMgVUlOVDgJb3VpX3JmYzEwNDJbXSA9IHsweDAwLCAweDAwLCAweDAwfTsKLXN0YXRpYyBVSU5UOAlvdWlfODAyMWhbXSA9IHsweDAwLCAweDAwLCAweGY4fTsKK3N0YXRpYyB1OAlvdWlfcmZjMTA0MltdID0gezB4MDAsIDB4MDAsIDB4MDB9Oworc3RhdGljIHU4CW91aV84MDIxaFtdID0gezB4MDAsIDB4MDAsIDB4Zjh9OwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCkBAIC0xMzUsMTEgKzEzMCwxMSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgc2tiX2V0aGVyX3RvX3A4MDIxMSggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLCBwODAyMTFfbWV0YXdlcF90ICpwODAyMTFfd2VwKQoraW50IHNrYl9ldGhlcl90b19wODAyMTEoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGV0aGNvbnYsIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCkKIHsKIAotCVVJTlQxNiAgICAgICAgICBmYzsKLQlVSU5UMTYgICAgICAgICAgcHJvdG87CisJdTE2ICAgICAgICAgIGZjOworCXUxNiAgICAgICAgICBwcm90bzsKIAl3bGFuX2V0aGhkcl90ICAgZV9oZHI7CiAJd2xhbl9sbGNfdCAgICAgICplX2xsYzsKIAl3bGFuX3NuYXBfdCAgICAgKmVfc25hcDsKQEAgLTI5OCwxNCArMjkzLDE0IEBACiAqIENhbGwgY29udGV4dDoKICoJTWF5IGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgb3Igbm9uLWludGVycnVwdCBjb250ZXh0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBza2JfcDgwMjExX3RvX2V0aGVyKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHNrYl9wODAyMTFfdG9fZXRoZXIoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGV0aGNvbnYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJbmV0ZGV2aWNlX3QgICAgICpuZXRkZXYgPSB3bGFuZGV2LT5uZXRkZXY7Ci0JVUlOVDE2ICAgICAgICAgIGZjOwotCVVJTlQgICAgICAgICAgICBwYXlsb2FkX2xlbmd0aDsKLQlVSU5UICAgICAgICAgICAgcGF5bG9hZF9vZmZzZXQ7Ci0JVUlOVDgJCWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwotCVVJTlQ4CQlzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKKwl1MTYgICAgICAgICAgZmM7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGg7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcGF5bG9hZF9vZmZzZXQ7CisJdTgJCWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXU4CQlzYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKIAlwODAyMTFfaGRyX3QgICAgKndfaGRyOwogCXdsYW5fZXRoaGRyX3QgICAqZV9oZHI7CiAJd2xhbl9sbGNfdCAgICAgICplX2xsYzsKQEAgLTMzMywxMSArMzI4LDExIEBACiAJCW1lbWNweShzYWRkciwgd19oZHItPmEzLmEyLCBXTEFOX0VUSEFERFJfTEVOKTsKIAl9IGVsc2UgewogCQlwYXlsb2FkX29mZnNldCA9IFdMQU5fSERSX0E0X0xFTjsKLQkJcGF5bG9hZF9sZW5ndGggLT0gKCBXTEFOX0hEUl9BNF9MRU4gLSBXTEFOX0hEUl9BM19MRU4gKTsKLQkJaWYgKHBheWxvYWRfbGVuZ3RoIDwgMCApIHsKKwkJaWYgKHBheWxvYWRfbGVuZ3RoIDwgV0xBTl9IRFJfQTRfTEVOIC0gV0xBTl9IRFJfQTNfTEVOKSB7CiAJCQlXTEFOX0xPR19FUlJPUigiQTQgZnJhbWUgdG9vIHNob3J0IVxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQorCQlwYXlsb2FkX2xlbmd0aCAtPSAoV0xBTl9IRFJfQTRfTEVOIC0gV0xBTl9IRFJfQTNfTEVOKTsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTQuYTMsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hNC5hNCwgV0xBTl9FVEhBRERSX0xFTik7CiAJfQpAQCAtNDk3LDggKzQ5MiwxNiBAQAogCiAJfQogCisgICAgICAgIC8qCisgICAgICAgICAqIE5vdGUgdGhhdCBldGhfdHlwZV90cmFucygpIGV4cGVjdHMgYW4gc2tiIHcvIHNrYi0+ZGF0YSBwb2ludGluZworICAgICAgICAgKiBhdCB0aGUgTUFDIGhlYWRlciwgaXQgdGhlbiBzZXRzIHRoZSBmb2xsb3dpbmcgc2tiIG1lbWJlcnM6CisgICAgICAgICAqIHNrYi0+bWFjX2hlYWRlciwKKyAgICAgICAgICogc2tiLT5kYXRhLCBhbmQKKyAgICAgICAgICogc2tiLT5wa3RfdHlwZS4KKyAgICAgICAgICogSXQgdGhlbiBfcmV0dXJuc18gdGhlIHZhbHVlIHRoYXQgX3dlJ3JlXyBzdXBwb3NlZCB0byBzdHVmZiBpbgorICAgICAgICAgKiBza2ItPnByb3RvY29sLiAgVGhpcyBpcyBudXRzLgorICAgICAgICAgKi8KIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKICAgICAgICAgLyogamtyaWVnbDogcHJvY2VzcyBzaWduYWwgYW5kIG5vaXNlIGFzIHNldCBpbiBoZmEzODR4X2ludF9yeCgpICovCiAJLyogamtyaWVnbDogb25seSBwcm9jZXNzIHNpZ25hbC9ub2lzZSBpZiByZXF1ZXN0ZWQgYnkgaXdzcHkgKi8KQEAgLTUyOCw3ICs1MzEsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcDgwMjExX3N0dF9maW5kcHJvdG8oVUlOVDE2IHByb3RvKQoraW50IHA4MDIxMV9zdHRfZmluZHByb3RvKHUxNiBwcm90bykKIHsKIAkvKiBBbHdheXMgcmV0dXJuIGZvdW5kIGZvciBub3cuICBUaGlzIGlzIHRoZSBiZWhhdmlvciB1c2VkIGJ5IHRoZSAqLwogCS8qICBab29tIFdpbjk1IGRyaXZlciB3aGVuIDgwMi4xaCBtb2RlIGlzIHNlbGVjdGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKaW5kZXggM2Y1YWI1N2MuLjUzOGU5YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKQEAgLTg2LDIyICs4NiwyMiBAQAogewogCXN0cnVjdCB3bGFuZGV2aWNlCSp3bGFuZGV2OwogCi0JVUlOVDY0CW1hY3RpbWU7CS8qIEhpLXJleiBNQUMtc3VwcGxpZWQgdGltZSB2YWx1ZSAqLwotCVVJTlQ2NAlob3N0dGltZTsJLyogQmVzdC1yZXogaG9zdCBzdXBwbGllZCB0aW1lIHZhbHVlICovCisJdTY0CW1hY3RpbWU7CS8qIEhpLXJleiBNQUMtc3VwcGxpZWQgdGltZSB2YWx1ZSAqLworCXU2NAlob3N0dGltZTsJLyogQmVzdC1yZXogaG9zdCBzdXBwbGllZCB0aW1lIHZhbHVlICovCiAKLQlVSU5UCXJ4cmF0ZTsJCS8qIFJlY2VpdmUgZGF0YSByYXRlIGluIDEwMGticHMgKi8KLQlVSU5UCXByaW9yaXR5OwkvKiAwLTE1LCAwPWNvbnRlbnRpb24sIDY9Q0YgKi8KLQlJTlQJc2lnbmFsOwkJLyogQW4gU1NJLCBzZWUgcDgwMjExbmV0ZGV2LmggKi8KLQlJTlQJbm9pc2U7CQkvKiBBbiBTU0ksIHNlZSBwODAyMTFuZXRkZXYuaCAqLwotCVVJTlQJY2hhbm5lbDsJLyogUmVjZWl2ZSBjaGFubmVsIChtb3N0bHkgZm9yIHNuaWZzKSAqLwotCVVJTlQJcHJlYW1ibGU7CS8qIFA4MDIxMUVOVU1fcHJlYW1ibGV0eXBlXyogKi8KLQlVSU5UCWVuY29kaW5nOwkvKiBQODAyMTFFTlVNX2VuY29kaW5nXyogKi8KKwl1bnNpZ25lZCBpbnQJcnhyYXRlOwkJLyogUmVjZWl2ZSBkYXRhIHJhdGUgaW4gMTAwa2JwcyAqLworCXVuc2lnbmVkIGludAlwcmlvcml0eTsJLyogMC0xNSwgMD1jb250ZW50aW9uLCA2PUNGICovCisJaW50CXNpZ25hbDsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCisJaW50CW5vaXNlOwkJLyogQW4gU1NJLCBzZWUgcDgwMjExbmV0ZGV2LmggKi8KKwl1bnNpZ25lZCBpbnQJY2hhbm5lbDsJLyogUmVjZWl2ZSBjaGFubmVsIChtb3N0bHkgZm9yIHNuaWZzKSAqLworCXVuc2lnbmVkIGludAlwcmVhbWJsZTsJLyogUDgwMjExRU5VTV9wcmVhbWJsZXR5cGVfKiAqLworCXVuc2lnbmVkIGludAllbmNvZGluZzsJLyogUDgwMjExRU5VTV9lbmNvZGluZ18qICovCiAKIH0gcDgwMjExX3J4bWV0YV90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfZnJtbWV0YQogewotCVVJTlQJCQltYWdpYzsKKwl1bnNpZ25lZCBpbnQJCQltYWdpYzsKIAlwODAyMTFfcnhtZXRhX3QJCSpyeDsKIH0gcDgwMjExX2ZybW1ldGFfdDsKIApAQCAtMTE3LDIwICsxMTcsMjAgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2NhcGhkcgogewotCVVJTlQzMgkJdmVyc2lvbjsKLQlVSU5UMzIJCWxlbmd0aDsKLQlVSU5UNjQJCW1hY3RpbWU7Ci0JVUlOVDY0CQlob3N0dGltZTsKLQlVSU5UMzIJCXBoeXR5cGU7Ci0JVUlOVDMyCQljaGFubmVsOwotCVVJTlQzMgkJZGF0YXJhdGU7Ci0JVUlOVDMyCQlhbnRlbm5hOwotCVVJTlQzMgkJcHJpb3JpdHk7Ci0JVUlOVDMyCQlzc2lfdHlwZTsKLQlJTlQzMgkJc3NpX3NpZ25hbDsKLQlJTlQzMgkJc3NpX25vaXNlOwotCVVJTlQzMgkJcHJlYW1ibGU7Ci0JVUlOVDMyCQllbmNvZGluZzsKKwl1MzIJCXZlcnNpb247CisJdTMyCQlsZW5ndGg7CisJdTY0CQltYWN0aW1lOworCXU2NAkJaG9zdHRpbWU7CisJdTMyCQlwaHl0eXBlOworCXUzMgkJY2hhbm5lbDsKKwl1MzIJCWRhdGFyYXRlOworCXUzMgkJYW50ZW5uYTsKKwl1MzIJCXByaW9yaXR5OworCXUzMgkJc3NpX3R5cGU7CisJczMyCQlzc2lfc2lnbmFsOworCXMzMgkJc3NpX25vaXNlOworCXUzMgkJcHJlYW1ibGU7CisJdTMyCQllbmNvZGluZzsKIH0gcDgwMjExX2NhcGhkcl90OwogCiAvKiBidWZmZXIgZnJlZSBtZXRob2QgcG9pbnRlciB0eXBlICovCkBAIC0xMzgsMzEgKzEzOCwzMSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfbWV0YXdlcCB7CiAJdm9pZCAgKmRhdGE7Ci0JVUlOVDggaXZbNF07Ci0JVUlOVDggaWN2WzRdOworCXU4IGl2WzRdOworCXU4IGljdls0XTsKIH0gcDgwMjExX21ldGF3ZXBfdDsKIAogLyogbG9jYWwgZXRoZXIgaGVhZGVyIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZXRoaGRyCiB7Ci0JVUlOVDgJZGFkZHJbV0xBTl9FVEhBRERSX0xFTl07Ci0JVUlOVDgJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07Ci0JVUlOVDE2CXR5cGU7CisJdTgJZGFkZHJbV0xBTl9FVEhBRERSX0xFTl07CisJdTgJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5fZXRoaGRyX3Q7CiAKIC8qIGxvY2FsIGxsYyBoZWFkZXIgdHlwZSAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9sbGMKIHsKLQlVSU5UOAlkc2FwOwotCVVJTlQ4CXNzYXA7Ci0JVUlOVDgJY3RsOworCXU4CWRzYXA7CisJdTgJc3NhcDsKKwl1OAljdGw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5fbGxjX3Q7CiAKIC8qIGxvY2FsIHNuYXAgaGVhZGVyIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fc25hcAogewotCVVJTlQ4CW91aVtXTEFOX0lFRUVfT1VJX0xFTl07Ci0JVUlOVDE2CXR5cGU7CisJdTgJb3VpW1dMQU5fSUVFRV9PVUlfTEVOXTsKKwl1MTYJdHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9zbmFwX3Q7CiAKIC8qIENpcmN1bGFyIGluY2x1ZGUgdHJpY2sgKi8KQEAgLTE3NCwxMyArMTc0LDEzIEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLypGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAotaW50IHNrYl9wODAyMTFfdG9fZXRoZXIoIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwKK2ludCBza2JfcDgwMjExX3RvX2V0aGVyKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGV0aGNvbnYsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgc2tiX2V0aGVyX3RvX3A4MDIxMSggc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIFVJTlQzMiBldGhjb252LAoraW50IHNrYl9ldGhlcl90b19wODAyMTEoIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsCiAJCQkgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCApOwogCi1pbnQgcDgwMjExX3N0dF9maW5kcHJvdG8oVUlOVDE2IHByb3RvKTsKLWludCBwODAyMTFfc3R0X2FkZHByb3RvKFVJTlQxNiBwcm90byk7CitpbnQgcDgwMjExX3N0dF9maW5kcHJvdG8odTE2IHByb3RvKTsKK2ludCBwODAyMTFfc3R0X2FkZHByb3RvKHUxNiBwcm90byk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFoZHIuaAppbmRleCBiN2IwODcyLi43MmYxMmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFoZHIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFoZHIuaApAQCAtMTY2LDI5ICsxNjYsMjkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0ZDX0ZTVFlQRShXTEFOX0ZTVFlQRV9SVFMpICk7ICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZSBXTEFOX0dFVF9GQ19QVkVSKG4pCSAoKChVSU5UMTYpKG4pKSAmIChCSVQwIHwgQklUMSkpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikgCSgoKChVSU5UMTYpKG4pKSAmIChCSVQ4KSkgPj4gOCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfRlJPTURTKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQ5KSkgPj4gOSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRUZSQUcobikgKCgoKFVJTlQxNikobikpICYgKEJJVDEwKSkgPj4gMTApCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxMSkpID4+IDExKQotI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikJKCgoKFVJTlQxNikobikpICYgKEJJVDEyKSkgPj4gMTIpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKChVSU5UMTYpKG4pKSAmIChCSVQxMykpID4+IDEzKQotI2RlZmluZSBXTEFOX0dFVF9GQ19JU1dFUChuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTQpKSA+PiAxNCkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfT1JERVIobikJKCgoKFVJTlQxNikobikpICYgKEJJVDE1KSkgPj4gMTUpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1BWRVIobikJICgoKHUxNikobikpICYgKEJJVDAgfCBCSVQxKSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlRZUEUobikJKCgoKHUxNikobikpICYgKEJJVDIgfCBCSVQzKSkgPj4gMikKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlNUWVBFKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQ0fEJJVDV8QklUNnxCSVQ3KSkgPj4gNCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfVE9EUyhuKSAJKCgoKHUxNikobikpICYgKEJJVDgpKSA+PiA4KQorI2RlZmluZSBXTEFOX0dFVF9GQ19GUk9NRFMobikJKCgoKHUxNikobikpICYgKEJJVDkpKSA+PiA5KQorI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFRlJBRyhuKSAoKCgodTE2KShuKSkgJiAoQklUMTApKSA+PiAxMCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfUkVUUlkobikJKCgoKHUxNikobikpICYgKEJJVDExKSkgPj4gMTEpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1BXUk1HVChuKQkoKCgodTE2KShuKSkgJiAoQklUMTIpKSA+PiAxMikKKyNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRURBVEEobikgKCgoKHUxNikobikpICYgKEJJVDEzKSkgPj4gMTMpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0lTV0VQKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQxNCkpID4+IDE0KQorI2RlZmluZSBXTEFOX0dFVF9GQ19PUkRFUihuKQkoKCgodTE2KShuKSkgJiAoQklUMTUpKSA+PiAxNSkKIAotI2RlZmluZSBXTEFOX1NFVF9GQ19QVkVSKG4pCSgoVUlOVDE2KShuKSkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfRlRZUEUobikJKCgoVUlOVDE2KShuKSkgPDwgMikKLSNkZWZpbmUgV0xBTl9TRVRfRkNfRlNUWVBFKG4pCSgoKFVJTlQxNikobikpIDw8IDQpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX1RPRFMobikgCSgoKFVJTlQxNikobikpIDw8IDgpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZST01EUyhuKQkoKChVSU5UMTYpKG4pKSA8PCA5KQotI2RlZmluZSBXTEFOX1NFVF9GQ19NT1JFRlJBRyhuKSAoKChVSU5UMTYpKG4pKSA8PCAxMCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUkVUUlkobikJKCgoVUlOVDE2KShuKSkgPDwgMTEpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX1BXUk1HVChuKQkoKChVSU5UMTYpKG4pKSA8PCAxMikKLSNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRURBVEEobikgKCgoVUlOVDE2KShuKSkgPDwgMTMpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0lTV0VQKG4pCSgoKFVJTlQxNikobikpIDw8IDE0KQotI2RlZmluZSBXTEFOX1NFVF9GQ19PUkRFUihuKQkoKChVSU5UMTYpKG4pKSA8PCAxNSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfUFZFUihuKQkoKHUxNikobikpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZUWVBFKG4pCSgoKHUxNikobikpIDw8IDIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKQkoKCh1MTYpKG4pKSA8PCA0KQorI2RlZmluZSBXTEFOX1NFVF9GQ19UT0RTKG4pIAkoKCh1MTYpKG4pKSA8PCA4KQorI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikJKCgodTE2KShuKSkgPDwgOSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRUZSQUcobikgKCgodTE2KShuKSkgPDwgMTApCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1JFVFJZKG4pCSgoKHUxNikobikpIDw8IDExKQorI2RlZmluZSBXTEFOX1NFVF9GQ19QV1JNR1QobikJKCgodTE2KShuKSkgPDwgMTIpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKHUxNikobikpIDw8IDEzKQorI2RlZmluZSBXTEFOX1NFVF9GQ19JU1dFUChuKQkoKCh1MTYpKG4pKSA8PCAxNCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfT1JERVIobikJKCgodTE2KShuKSkgPDwgMTUpCiAKIC8qLS0tIER1cmF0aW9uIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIE1hY3JvcyB0byBnZXQvc2V0IHRoZSBiaXRmaWVsZHMgb2YgdGhlIER1cmF0aW9uIEZpZWxkICAgICAgKi8KQEAgLTIwMSw0NSArMjAxLDQ1IEBACiAvKiBNYWNyb3MgdG8gZ2V0L3NldCB0aGUgYml0ZmllbGRzIG9mIHRoZSBTZXF1ZW5jZSBDb250cm9sICAgICovCiAvKiBGaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkdOVU0obikgKCgoVUlOVDE2KShuKSkgJiAoQklUMHxCSVQxfEJJVDJ8QklUMykpCi0jZGVmaW5lIFdMQU5fR0VUX1NFUV9TRVFOVU0obikgKCgoKFVJTlQxNikobikpICYgKH4oQklUMHxCSVQxfEJJVDJ8QklUMykpKSA+PiA0KQorI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJHTlVNKG4pICgoKHUxNikobikpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKCh1MTYpKG4pKSAmICh+KEJJVDB8QklUMXxCSVQyfEJJVDMpKSkgPj4gNCkKIAogLyotLS0gRGF0YSBwdHIgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ3JlYXRlcyBhIFVJTlQ4KiB0byB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgZnJhbWUgICAgICAgICAgICAqLworLyogQ3JlYXRlcyBhIHU4KiB0byB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgZnJhbWUgICAgICAgICAgICAqLwogLyogQXNzdW1lcyB5b3UncmUgcGFzc2luZyBpbiBhIHB0ciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZHIqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBXTEFOX0hEUl9BM19EQVRBUChwKSAoKChVSU5UOCopKHApKSArIFdMQU5fSERSX0EzX0xFTikKLSNkZWZpbmUgV0xBTl9IRFJfQTRfREFUQVAocCkgKCgoVUlOVDgqKShwKSkgKyBXTEFOX0hEUl9BNF9MRU4pCisjZGVmaW5lIFdMQU5fSERSX0EzX0RBVEFQKHApICgoKHU4KikocCkpICsgV0xBTl9IRFJfQTNfTEVOKQorI2RlZmluZSBXTEFOX0hEUl9BNF9EQVRBUChwKSAoKCh1OCopKHApKSArIFdMQU5fSERSX0E0X0xFTikKIAotI2RlZmluZSBET1QxMV9SQVRFNV9JU0JBU0lDX0dFVChyKSAgICAgKCgoVUlOVDgpKHIpKSAmIEJJVDcpCisjZGVmaW5lIERPVDExX1JBVEU1X0lTQkFTSUNfR0VUKHIpICAgICAoKCh1OCkocikpICYgQklUNykKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFR5cGVzICovCiAKIC8qIEJTUyBUaW1lc3RhbXAgKi8KLXR5cGVkZWYgVUlOVDggd2xhbl9ic3NfdHNfdFtXTEFOX0JTU19UU19MRU5dOwordHlwZWRlZiB1OCB3bGFuX2Jzc190c190W1dMQU5fQlNTX1RTX0xFTl07CiAKIC8qIEdlbmVyaWMgODAyLjExIEhlYWRlciB0eXBlcyAqLwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfaGRyX2EzCiB7Ci0JVUlOVDE2CWZjOwotCVVJTlQxNglkdXI7Ci0JVUlOVDgJYTFbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTNbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXNlcTsKKwl1MTYJZmM7CisJdTE2CWR1cjsKKwl1OAlhMVtXTEFOX0FERFJfTEVOXTsKKwl1OAlhMltXTEFOX0FERFJfTEVOXTsKKwl1OAlhM1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc2VxOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFfaGRyX2EzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9oZHJfYTQKIHsKLQlVSU5UMTYJZmM7Ci0JVUlOVDE2CWR1cjsKLQlVSU5UOAlhMVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhMltXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhM1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJc2VxOwotCVVJTlQ4CWE0W1dMQU5fQUREUl9MRU5dOworCXUxNglmYzsKKwl1MTYJZHVyOworCXU4CWExW1dMQU5fQUREUl9MRU5dOworCXU4CWEyW1dMQU5fQUREUl9MRU5dOworCXU4CWEzW1dMQU5fQUREUl9MRU5dOworCXUxNglzZXE7CisJdTgJYTRbV0xBTl9BRERSX0xFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMV9oZHJfYTRfdDsKIAogdHlwZWRlZiB1bmlvbiBwODAyMTFfaGRyCkBAIC0yNzEsOSArMjcxLDkgQEAKICNkZWZpbmUgV0xBTl9GQ1NfTEVOCQkJNAogCiAvKiBmdGNsIGluIEhPU1Qgb3JkZXIgKi8KLWlubGluZSBzdGF0aWMgVUlOVDE2IHA4MDIxMV9oZWFkZXJsZW4oVUlOVDE2IGZjdGwpCitpbmxpbmUgc3RhdGljIHUxNiBwODAyMTFfaGVhZGVybGVuKHUxNiBmY3RsKQogewotCVVJTlQxNiBoZHJsZW4gPSAwOworCXUxNiBoZHJsZW4gPSAwOwogCiAJc3dpdGNoICggV0xBTl9HRVRfRkNfRlRZUEUoZmN0bCkgKSB7CiAJY2FzZSBXTEFOX0ZUWVBFX01HTVQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaAppbmRleCAyNWIyZWE4Li5hZDY3YjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmgKQEAgLTEwNiw5ICsxMDYsOSBAQAogewogCWNoYXIgCW5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CiAJY2FkZHJfdCBkYXRhOwotCVVJTlQzMgltYWdpYzsKLQlVSU5UMTYJbGVuOwotCVVJTlQzMglyZXN1bHQ7CisJdTMyCW1hZ2ljOworCXUxNglsZW47CisJdTMyCXJlc3VsdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaW9jdGxfcmVxX3Q7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oCmluZGV4IDVjYjNmNWEuLjhiNjFlNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmgKQEAgLTkwLDcgKzkwLDcgQEAKICNkZWZpbmUgTUtNSUJNRVRBU0laRShuYW1lKQkJcDgwMjExbWV0YV8gIyMgbWliICMjIF8gIyMgbmFtZSAjIyBfICMjIHNpemUKICNkZWZpbmUgTUtHUlBNRVRBU0laRShuYW1lKQkJcDgwMjExbWV0YV8gIyMgZ3JwICMjIF8gIyMgbmFtZSAjIyBfICMjIHNpemUKIAotI2RlZmluZSBHRVRNRVRBU0laRShhcHRyKQkJKCoqKChVSU5UMzIqKikoYXB0cikpKQorI2RlZmluZSBHRVRNRVRBU0laRShhcHRyKQkJKCoqKCh1MzIqKikoYXB0cikpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVGhlIGZvbGxvd2luZyBpZmRlZiBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcgZGVmaW5lczogKi8KQEAgLTExNCwxNCArMTE0LDE0IEBACiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtZXRhCiB7CiAJY2hhcgkJCSpuYW1lOwkJLyogZGF0YSBpdGVtIG5hbWUgKi8KLQlVSU5UMzIJCQlkaWQ7CQkvKiBwYXJ0aWFsIGRpZCAqLwotCVVJTlQzMgkJCWZsYWdzOwkJLyogc2V0IG9mIHZhcmlvdXMgZmxhZyBiaXRzICovCi0JVUlOVDMyCQkJbWluOwkJLyogbWluIHZhbHVlIG9mIGEgQk9VTkRFRElOVCAqLwotCVVJTlQzMgkJCW1heDsJCS8qIG1heCB2YWx1ZSBvZiBhIEJPVU5ERURJTlQgKi8KKwl1MzIJCQlkaWQ7CQkvKiBwYXJ0aWFsIGRpZCAqLworCXUzMgkJCWZsYWdzOwkJLyogc2V0IG9mIHZhcmlvdXMgZmxhZyBiaXRzICovCisJdTMyCQkJbWluOwkJLyogbWluIHZhbHVlIG9mIGEgQk9VTkRFRGludCAqLworCXUzMgkJCW1heDsJCS8qIG1heCB2YWx1ZSBvZiBhIEJPVU5ERURpbnQgKi8KIAotCVVJTlQzMgkJCW1heGxlbjsJCS8qIG1heGxlbiBvZiBhIE9DVEVUU1RSIG9yIERJU1BMQVlTVFIgKi8KLQlVSU5UMzIJCQltaW5sZW47CQkvKiBtaW5sZW4gb2YgYSBPQ1RFVFNUUiBvciBESVNQTEFZU1RSICovCi0JcDgwMjExZW51bV90CQkqZW51bXB0cjsJLyogcHRyIHRvIHRoZSBlbnVtIHR5cGUgZm9yIEVOVU1JTlQgKi8KKwl1MzIJCQltYXhsZW47CQkvKiBtYXhsZW4gb2YgYSBPQ1RFVFNUUiBvciBESVNQTEFZU1RSICovCisJdTMyCQkJbWlubGVuOwkJLyogbWlubGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLworCXA4MDIxMWVudW1fdAkJKmVudW1wdHI7CS8qIHB0ciB0byB0aGUgZW51bSB0eXBlIGZvciBFTlVNaW50ICovCiAJcDgwMjExX3RvdGV4dF90CQl0b3RleHRwdHI7CS8qIHB0ciB0byB0b3RleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwogCXA4MDIxMV9mcm9tdGV4dF90CWZyb210ZXh0cHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KIAlwODAyMTFfdmFsaWRfdAkJdmFsaWRmdW5wdHI7CS8qIHB0ciB0byB0b3RleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwpAQCAtMTUwLDIwICsxNTAsMjAgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qICovCi1VSU5UMzIgcDgwMjExX3RleHQyZGlkKGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIGNoYXIgKmNhdG5hbWUsIGNoYXIgKmdycG5hbWUsIGNoYXIgKml0ZW1uYW1lKTsKLVVJTlQzMiBwODAyMTFfdGV4dDJjYXRkaWQoY2F0bGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwotVUlOVDMyIHA4MDIxMV90ZXh0MmdycGRpZChncnBsaXN0aXRlbV90ICpsaXN0LCBjaGFyICpuYW1lICk7Ci1VSU5UMzIgcDgwMjExX3RleHQyaXRlbWRpZChwODAyMTFtZXRhX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9kaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9jYXRkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9ncnBkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9pdGVtZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1jYXRsaXN0aXRlbV90ICpwODAyMTFfZGlkMmNhdCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotZ3JwbGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJncnAoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLXA4MDIxMW1ldGFfdCAqcDgwMjExX2RpZDJpdGVtKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExaXRlbV9tYXhkYXRhbGVuKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX21ldGFuYW1lMmRpZChzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBjaGFyICppdGVtbmFtZSk7Ci1VSU5UMzIgcDgwMjExaXRlbV9nZXRvZmZzZXQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQgKTsKK3UzMiBwODAyMTFfdGV4dDJkaWQoY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgY2hhciAqY2F0bmFtZSwgY2hhciAqZ3JwbmFtZSwgY2hhciAqaXRlbW5hbWUpOwordTMyIHA4MDIxMV90ZXh0MmNhdGRpZChjYXRsaXN0aXRlbV90ICpsaXN0LCBjaGFyICpuYW1lICk7Cit1MzIgcDgwMjExX3RleHQyZ3JwZGlkKGdycGxpc3RpdGVtX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKK3UzMiBwODAyMTFfdGV4dDJpdGVtZGlkKHA4MDIxMW1ldGFfdCAqbGlzdCwgY2hhciAqbmFtZSApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2RpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2NhdGRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2dycGRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2l0ZW1kaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK2NhdGxpc3RpdGVtX3QgKnA4MDIxMV9kaWQyY2F0KCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7CitncnBsaXN0aXRlbV90ICpwODAyMTFfZGlkMmdycCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOworcDgwMjExbWV0YV90ICpwODAyMTFfZGlkMml0ZW0oIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFpdGVtX21heGRhdGFsZW4oIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfbWV0YW5hbWUyZGlkKHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIGNoYXIgKml0ZW1uYW1lKTsKK3UzMiBwODAyMTFpdGVtX2dldG9mZnNldCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCApOwogaW50IHA4MDIxMWl0ZW1fZ2V0dHlwZShwODAyMTFtZXRhX3QgKm1ldGEpOwogCiAjZW5kaWYgLyogX1A4MDIxMU1FVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCmluZGV4IDJjN2Y0MzUuLmNlNGZkZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKQEAgLTcyLDI1ICs3Miw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdF9wb3dlcm1nbXRtb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdF93YWtldXAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210X3JlY2VpdmVkdGltcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9zY2FuIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCkBAIC0zMDEsMjExICsyODIsNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNDApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYnNzaWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9qb2luZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfcGVlcnN0YWFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX2F1dGhlbnRpY2F0aW9udHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfYXV0aGVudGljYXRpb25mYWlsdXJldGltZW91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfcGVlcnN0YWFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfcmVhc29uY29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9hc3NvY2lhdGVmYWlsdXJldGltZW91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfY2Zwb2xsYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfY2Zwb2xscmVxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9wcml2YWN5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9saXN0ZW5pbnRlcnZhbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX25ld2FwYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfcmVhc3NvY2lhdGVmYWlsdXJldGltZW91dCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfY2Zwb2xsYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfY2Zwb2xscmVxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9wcml2YWN5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9saXN0ZW5pbnRlcnZhbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTEpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGVfcmVhc29uY29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTIpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVzZXRfc2V0ZGVmYXVsdG1pYiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVzZXRfbWFjYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVzZXRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfZG90MTFyZXFfc3RhcnQgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxMykpCkBAIC03OTUsMTQ3ICs1NzEsOCBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfY2F0X2xueGluZCBcCi0JCQlQODAyMTFESURfTUtTRUNUSU9OKDQpCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm0gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3JvYW0gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSkKLSNkZWZpbmUgRElEbXNnX2xueGluZF9yb2FtX3JlYXNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1zZ19jYXRfcDJyZXEgXAogCQkJUDgwMjExRElEX01LU0VDVElPTig1KQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9ic3NpZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX3NzaWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fY2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9hdXRodHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1zZ19wMnJlcV9yZWFkcGRhIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikpCkBAIC05NDcsMTYyICs1ODQsNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfcmVhZGNpcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtc2dfcDJyZXFfcmVhZGNpc19jaXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfcmVhZGNpc19yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfc3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfc3RhdGVfZW5hYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfc3RhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9hZGRyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9sZW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX2RhdGEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV9hZGRyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfbGVuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfZGF0YSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfY29tbWFuZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcGFyYW0wIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9wYXJhbTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3BhcmFtMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcmVzcDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3AxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9yZXNwMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF90ZXN0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdGVzdHBhcmFtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9zdGF0dXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Jlc3AwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9yZXNwMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzcDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3JlYWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkX2FkZHIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3JlYWRfdmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3JlYWRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfd3JpdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfd3JpdGVfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlX2RhdGEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV93cml0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1zZ19wMnJlcV9yYW1kbF9zdGF0ZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDExKSkKQEAgLTExNjcsMjI0ICs2NDgsOCBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxNCkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21tX3N0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTUpKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1fc3RhdGVfZW5hYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbV9zdGF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9kdW1wX3N0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTYpKQotI2RlZmluZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZV9sZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm8gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fY2hhbm5lbGxpc3QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19jaGFubmVsZHdlbGx0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX251bWNoaW5mbyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19jaGFubmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19hdmdub2lzZWxldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19wZWFrbm9pc2VsZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfYnNzYWN0aXZlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c19wY2ZhY3RpdmUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2VuYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE5KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2VuYWJsZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfZG90MTFzbXQgXAogCQkJUDgwMjExRElEX01LU0VDVElPTigxKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfcDgwMjExVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X3A4MDIxMVRhYmxlX3A4MDIxMV9pZnN0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVN0YXRpb25JRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMU1lZGl1bU9jY3VwYW5jeUxpbWl0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQb2xsYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUFBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUE1heER1cmF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25SZXNwb25zZVRpbWVPdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFQb3dlck1hbmFnZW1lbnRNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZFNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEZXNpcmVkQlNTVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFPcGVyYXRpb25hbFJhdGVTZXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQmVhY29uUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURUSU1QZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXNzb2NpYXRpb25SZXNwb25zZVRpbWVPdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGlzYXNzb2NpYXRlUmVhc29uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURpc2Fzc29jaWF0ZVN0YXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVhdXRoZW50aWNhdGVSZWFzb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVhdXRoZW50aWNhdGVTdGF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0ZUZhaWxTdGF0dXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXV0aGVudGljYXRlRmFpbFN0YXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxYzAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQpAQCAtMTQwNCwyNSArNjY5LDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0luZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdBZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdXRVBPbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nVmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSkKQEAgLTE0MzQsMzEgKzY4MCwxOSBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBLZXlNYXBwaW5nTGVuZ3RoIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQSUNWRXJyb3JDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUEV4Y2x1ZGVkQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2RvdDExbWFjIFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oMikKICNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxKSkKICNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNQUNBZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIChQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKQEAgLTE0NzYsMzI5ICs3MTAsMTggQEAKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFJlY2VpdmVMaWZldGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWFudWZhY3R1cmVySUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVByb2R1Y3RJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRmFpbGVkQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmV0cnlDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aXBsZVJldHJ5Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRnJhbWVEdXBsaWNhdGVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNTdWNjZXNzQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUlRTRmFpbHVyZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUFDS0ZhaWx1cmVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSZWNlaXZlZEZyYWdtZW50Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRkNTRXJyb3JDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExVHJhbnNtaXR0ZWRGcmFtZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFXRVBVbmRlY3J5cHRhYmxlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI1KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI4KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjkpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzIpIHwgMHgxYzAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9kb3QxMXBoeSBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDMpCiAjZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExUEhZVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ3VycmVudFJlZ0RvbWFpbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExVGVtcFR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUNoYW5uZWxBZ2lsaXR5UHJlc2VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ2hhbm5lbEFnaWxpdHlFbmFibGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFByZWFtYmxlRW5hYmxlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFDdXJyZW50VHhBbnRlbm5hIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExRGl2ZXJzaXR5U3VwcG9ydCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRSeEFudGVubmEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExTnVtYmVyU3VwcG9ydGVkUG93ZXJMZXZlbHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUhvcFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbE51bWJlciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMU1heER3ZWxsVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnREd2VsbFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50U2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFBhdHRlcm4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE4MDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LR1JPVVAoMykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkpCkBAIC0xODA2LDk3ICs3MjksNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDQ0FNb2RlU3VwcG9ydGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENDQU1vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFFRFRocmVzaG9sZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVPcHRpb25JbXBsZW1lbnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMVBCQ0NPcHRpb25JbXBsZW1lbnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nVGltZXJNYXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dDb3VudE1heCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWluIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nQ291bnRNaW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlX2RvdDExUmVnRG9tYWluc1N1cHBvcnRJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0VmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMUFudGVubmFMaXN0SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFR4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExU3VwcG9ydGVkUnhBbnRlbm5hIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFEaXZlcnNpdHlTZWxlY3Rpb25SeCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhWYWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTQwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfbG54IFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNCkKICNkZWZpbmUgRElEbWliX2xueF9sbnhDb25maWdUYWJsZSBcCkBAIC0xOTA4LDU3ICs3NDAsNiBAQAogCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfcDIgXAogCQkJUDgwMjExRElEX01LU0VDVElPTig1KQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMk1NVHggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkVhcmx5QmVhY29uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJSZWNlaXZlZEZyYW1lU3RhdGlzdGljcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbXVuaWNhdGlvblRhbGxpZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkF1dGhlbnRpY2F0ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFzc29jaWF0ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMlBvd2VyU2F2ZVVzZXJDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbWVudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzQWxsb3cgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NEZW55IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQ2hhbm5lbEluZm9SZXN1bHRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpYyBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQpAQCAtMTk2Niw1NTkgKzc0NywxMSBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25NQUNBZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRGVzaXJlZFNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25DaGFubmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duU1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkFUSU1XaW5kb3cgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTeXN0ZW1TY2FsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heERhdGFMZW5ndGggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1FbmFibGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNRVBTIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk11bHRpY2FzdFJlY2VpdmUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4U2xlZXBEdXJhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUhvbGRvdmVyRHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duTmFtZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25EVElNUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk11bHRpY2FzdFBNQnVmZmVyaW5nIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXlJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDA4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNikgfCAweDA4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNykgfCAweDA4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOCkgfCAweDA4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBGbGFncyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBdXRoZW50aWNhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhBc3NvY2lhdGVkU3RhdGlvbnMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVHhDb250cm9sIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJvYW1pbmdNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkhvc3RBdXRoZW50aWNhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZSY3ZDcmNFcnJvciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBbHRSZXRyeUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkJlYWNvbkludGVydmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1lZGl1bU9jY3VwYW5jeUxpbWl0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDM4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUFBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBNYXhEdXJhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBGbGFncyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTVEFQQ0ZJbmZvIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlByaW9yaXR5UVVzYWdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRJTUN0cmwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVGhpcnR5MlRhbGx5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkVuaFNlY3VyaXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlNob3J0UHJlYW1ibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDcpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRXhjbHVkZUxvbmdQcmVhbWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0OCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBdXRoZW50aWNhdGlvblJzcFRPIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkJhc2ljUmF0ZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3VwcG9ydGVkUmF0ZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNTEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pYyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyQ3JlYXRlSUJTUyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlByb21pc2N1b3VzTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJCZWhhdmlvciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQotI2RlZmluZSBESURtaWJfcDJfcDJCZWhhdmlvcl9wMlRpY2tUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkpCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMk1heExvYWRUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJQYWdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJPZmZzZXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlckxlbmd0aCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlBSSUlkZW50aXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyUFJJU3VwUmFuZ2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJDRklBY3RSYW5nZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJOSUNTZXJpYWxOdW1iZXIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJOSUNJZGVudGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMk1GSVN1cFJhbmdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkNGSVN1cFJhbmdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkNoYW5uZWxMaXN0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlJlZ3VsYXRvcnlEb21haW5zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlRlbXBUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlNUQUlkZW50aXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlNUQVN1cFJhbmdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMk1GSUFjdFJhbmdlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTVEFDRklBY3RSYW5nZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyQnVpbGRTZXF1ZW5jZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJQcmltYXJ5RldJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTZWNvbmRhcnlGV0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlRlcnRpYXJ5RldJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfcDJfcDJNQUMgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyUG9ydFN0YXR1cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5Q1EgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlBU0wgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlBTkwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlDUSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUFTTCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBTkwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50QmVhY29uSW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyU3RhQ3VycmVudFNjYWxlVGhyZXNob2xkcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJBUEN1cnJlbnRTY2FsZVRocmVzaG9sZHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyUHJvdG9jb2xSc3BUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlNob3J0UmV0cnlMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJMb25nUmV0cnlMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJNYXhUcmFuc21pdExpZmV0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMk1heFJlY2VpdmVMaWZldGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDRlBvbGxhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyT3duTUFDQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMlBIWVR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMkN1cnJlbnRDaGFubmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50UG93ZXJTdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyQ0NBTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyU3VwcG9ydGVkRGF0YVJhdGVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJUeFBvd2VyTWF4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1pYi5oCmluZGV4IDE5ODY3ZmQuLjljZDcyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbWliLmgKQEAgLTkzLDcgKzkzLDcgQEAKIC8qIGNhdGVnb3J5IG1ldGFkYXRhIGxpc3QgKi8KIAogZXh0ZXJuIGNhdGxpc3RpdGVtX3QgbWliX2NhdGxpc3RbXTsKLWV4dGVybiBVSU5UMzIgbWliX2NhdGxpc3Rfc2l6ZTsKK2V4dGVybiB1MzIgbWliX2NhdGxpc3Rfc2l6ZTsKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1zZy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1zZy5oCmluZGV4IDRkNmRmY2MuLjZlNjU5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbXNnLmgKQEAgLTkzLDcgKzkzLDcgQEAKIC8qIGNhdGVnb3J5IG1ldGFkYXRhIGxpc3QgKi8KIAogZXh0ZXJuIGNhdGxpc3RpdGVtX3QgbXNnX2NhdGxpc3RbXTsKLWV4dGVybiBVSU5UMzIgbXNnX2NhdGxpc3Rfc2l6ZTsKK2V4dGVybiB1MzIgbXNnX2NhdGxpc3Rfc2l6ZTsKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCmluZGV4IDcxNWY0YjIuLmQyMjU4YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKQEAgLTUwLDQ3ICs1MCwzNiBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0CiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VuazM5Ml90CW1pYmF0dHJpYnV0ZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX21pYmdldF90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0CiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VuazM5Ml90CW1pYmF0dHJpYnV0ZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfcG93ZXJtZ210Ci17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcG93ZXJtZ210bW9kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAl3YWtldXAJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVjZWl2ZWR0aW1zCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfcG93ZXJtZ210X3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc3R5cGUJOwogCXA4MDIxMWl0ZW1fcHN0cjZfdAlic3NpZAk7Ci0JVUlOVDgJcGFkXzBDWzFdCTsKKwl1OAlwYWRfMENbMV0JOwogCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzFEWzNdCTsKKwl1OAlwYWRfMURbM10JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJc2NhbnR5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcHJvYmVkZWxheQk7CiAJcDgwMjExaXRlbV9wc3RyMTRfdAljaGFubmVsbGlzdAk7Ci0JVUlOVDgJcGFkXzJDWzFdCTsKKwl1OAlwYWRfMkNbMV0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbWluY2hhbm5lbHRpbWUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbWF4Y2hhbm5lbHRpbWUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CkBAIC0xMDAsMTcgKzg5LDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYnNzaW5kZXgJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlzaWduYWwJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbm9pc2UJOwogCXA4MDIxMWl0ZW1fcHN0cjZfdAlic3NpZAk7Ci0JVUlOVDgJcGFkXzNDWzFdCTsKKwl1OAlwYWRfM0NbMV0JOwogCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzREWzNdCTsKKwl1OAlwYWRfNERbM10JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYnNzdHlwZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAliZWFjb25wZXJpb2QJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZHRpbXBlcmlvZAk7CkBAIC0xNDcsMTE1ICsxMzYsMTMgQEAKIAlwODAyMTFpdGVtX3VpbnQzMl90CXN1cHByYXRlOAk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHNfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2pvaW4KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CWJzc2lkCTsKLQlVSU5UOAlwYWRfNUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJam9pbmZhaWx1cmV0aW1lb3V0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU2CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTcJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlOAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU3CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTgJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9qb2luX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfNkNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aGVudGljYXRpb250eXBlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGhlbnRpY2F0aW9uZmFpbHVyZXRpbWVvdXQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9hdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzdDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbmNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzhDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFzc29jaWF0ZWZhaWx1cmV0aW1lb3V0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbGFibGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2Zwb2xscmVxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXByaXZhY3kJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGlzdGVuaW50ZXJ2YWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAluZXdhcGFkZHJlc3MJOwotCVVJTlQ4CXBhZF85Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzc29jaWF0ZWZhaWx1cmV0aW1lb3V0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbGFibGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2Zwb2xscmVxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXByaXZhY3kJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGlzdGVuaW50ZXJ2YWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzEwQ1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9yZXNldAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXNldGRlZmF1bHRtaWIJOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAltYWNhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTFDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfcmVzZXRfdDsKLQogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0CiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF8xMkRbM10JOworCXU4CXBhZF8xMkRbM10JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYnNzdHlwZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAliZWFjb25wZXJpb2QJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZHRpbXBlcmlvZAk7CkBAIC0yODgsNzIgKzE3NSwyMCBAQAogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydF90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfYXV0aGVudGljYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzEzQ1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdXRoZW50aWNhdGlvbnR5cGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMWluZF9kZWF1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xNENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uY29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9kZWF1dGhlbnRpY2F0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE1Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhaWQJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMWluZF9yZWFzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xNkNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWlkCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJb2xkYXBhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTdDWzFdCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX3JlYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMWluZF9kaXNhc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMThDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbmNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfZGlzYXNzb2NpYXRlX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlpZnN0YXRlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmYKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWwJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcHJpc21oZWFkZXIJOwpAQCAtMzY2LDkgKzIwMSw5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWRlY3J5cHQJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5jcnlwdAk7CkBAIC0zNzYsOSArMjExLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlkYm0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbGluawk7CkBAIC0zODgsMTczICsyMjMsMjkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbgogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMTlEWzNdCTsKKwl1OAlwYWRfMTlEWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGh0eXBlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm0KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlob3N0dGltZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAltYWN0aW1lCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcnNzaQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlzcQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlzaWduYWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbm9pc2UJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmF0ZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlpc3R4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWZybWxlbgk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2xueGluZF9yb2FtCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueGluZF9yb2FtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9qb2luCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlic3NpZAk7Ci0JVUlOVDgJcGFkXzIwQ1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU3CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTgJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU4CTsKLQlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF8yMURbM10JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY2hhbm5lbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdXRodHlwZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2pvaW5fdDsKLQogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdW5rMTAyNF90CXBkYQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX3JlYWRwZGFfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRjaXMKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91bmsxMDI0X3QJY2lzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfcmVhZGNpc190OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfc3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfcmVhZAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdAlkYXRhCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlsZW4JOwotCXA4MDIxMWl0ZW1fdW5rMTAyNF90CWRhdGEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9sb3dfbGV2ZWwKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljb21tYW5kCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBhcmFtMAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwYXJhbTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGFyYW0yCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AwCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfbG93X2xldmVsX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV90ZXN0X2NvbW1hbmQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAl0ZXN0Y29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAl0ZXN0cGFyYW0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlzdGF0dXMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDAJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzcDIJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9tbWlfcmVhZAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJdmFsdWUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9tbWlfcmVhZF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbW1pX3dyaXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlkYXRhCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfbW1pX3dyaXRlX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF9zdGF0ZQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZXhlYWRkcgk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKQEAgLTU2Miw5ICsyNTMsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlsZW4JOwogCXA4MDIxMWl0ZW1fdW5rNDA5Nl90CWRhdGEJOwpAQCAtNTczLDcyICsyNjQsMjIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZQogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWxlbgk7CiAJcDgwMjExaXRlbV91bms0MDk2X3QJZGF0YQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX21tX3N0YXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfbW1fc3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2R1bXBfc3RhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlsZXZlbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2R1bXBfc3RhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mbwotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWxsaXN0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWxkd2VsbHRpbWUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAludW1jaGluZm8JOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0cwotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdmdub2lzZWxldmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBlYWtub2lzZWxldmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJzc2FjdGl2ZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwY2ZhY3RpdmUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2VuYWJsZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfZW5hYmxlX3Q7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCmluZGV4IGJkNGMxNjI5Li42Y2MxNmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZ210LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCkBAIC0xNzIsMTQgKzE3MiwxNCBAQAogLyogTm90ZTogVGhlc2Ugb2Zmc2V0cyBhcmUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lIGRhdGEgICAgICAgKi8KIAogI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfVFMJCQkwCi0jZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9CQ05fSU5UCQkJOAorI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfQkNOX2ludAkJCTgKICNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX0NBUElORk8JCQkxMAogI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfU1NJRAkJCTEyCiAKICNkZWZpbmUgV0xBTl9ESVNBU1NPQ19PRkZfUkVBU09OCQkwCiAKICNkZWZpbmUgV0xBTl9BU1NPQ1JFUV9PRkZfQ0FQX0lORk8JCTAKLSNkZWZpbmUgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX0lOVAkJMgorI2RlZmluZSBXTEFOX0FTU09DUkVRX09GRl9MSVNURU5faW50CQkyCiAjZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX1NTSUQJCQk0CiAKICNkZWZpbmUgV0xBTl9BU1NPQ1JFU1BfT0ZGX0NBUF9JTkZPCQkwCkBAIC0xODgsNyArMTg4LDcgQEAKICNkZWZpbmUgV0xBTl9BU1NPQ1JFU1BfT0ZGX1NVUFBfUkFURVMJCTYKIAogI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX0NBUF9JTkZPCQkwCi0jZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfTElTVEVOX0lOVAkJMgorI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9pbnQJCTIKICNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9DVVJSX0FQCQk0CiAjZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfU1NJRAkJMTAKIApAQCAtMjAwLDcgKzIwMCw3IEBACiAjZGVmaW5lIFdMQU5fUFJPQkVSRVFfT0ZGX1NTSUQJCQkwCiAKICNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX1RTCQkJMAotI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX0lOVAkJOAorI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfQkNOX2ludAkJOAogI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfQ0FQX0lORk8JCTEwCiAjZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9TU0lECQkJMTIKIApAQCAtMjQ1LDgyICsyNDUsODIgQEAKIAogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZQogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47CisJdTgJZWlkOworCXU4CWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV90OwogCiAvKi0tIFNlcnZpY2UgU2V0IElkZW50aXR5IChTU0lEKSAgLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9zc2lkCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAlzc2lkWzFdOyAgLyogbWF5IGJlIHplcm8sIHB0cnMgbWF5IG92ZXJsYXAgKi8KKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CXNzaWRbMV07ICAvKiBtYXkgYmUgemVybywgcHRycyBtYXkgb3ZlcmxhcCAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3NzaWRfdDsKIAogLyotLSBTdXBwb3J0ZWQgUmF0ZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfc3VwcF9yYXRlcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJcmF0ZXNbMV07ICAvKiBoYWQgYmV0dGVyIGJlIGF0IExFQVNUIG9uZSEgKi8KKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CXJhdGVzWzFdOyAgLyogaGFkIGJldHRlciBiZSBhdCBMRUFTVCBvbmUhICovCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfc3VwcF9yYXRlc190OwogCiAvKi0tIEZIIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9maF9wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDE2CWR3ZWxsOwotCVVJTlQ4CWhvcHNldDsKLQlVSU5UOAlob3BwYXR0ZXJuOwotCVVJTlQ4CWhvcGluZGV4OworCXU4CWVpZDsKKwl1OAlsZW47CisJdTE2CWR3ZWxsOworCXU4CWhvcHNldDsKKwl1OAlob3BwYXR0ZXJuOworCXU4CWhvcGluZGV4OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2ZoX3Bhcm1zX3Q7CiAKIC8qLS0gRFMgUGFyYW1ldGVyIFNldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX2RzX3Bhcm1zCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAljdXJyX2NoOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJY3Vycl9jaDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9kc19wYXJtc190OwogCiAvKi0tIENGIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX2NmX3Bhcm1zCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAljZnBfY250OwotCVVJTlQ4CWNmcF9wZXJpb2Q7Ci0JVUlOVDE2CWNmcF9tYXhkdXI7Ci0JVUlOVDE2CWNmcF9kdXJyZW1haW5pbmc7CisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAljZnBfY250OworCXU4CWNmcF9wZXJpb2Q7CisJdTE2CWNmcF9tYXhkdXI7CisJdTE2CWNmcF9kdXJyZW1haW5pbmc7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfY2ZfcGFybXNfdDsKIAogLyotLSBUSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfdGltCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UOAlkdGltX2NudDsKLQlVSU5UOAlkdGltX3BlcmlvZDsKLQlVSU5UOAliaXRtYXBfY3RsOwotCVVJTlQ4CXZpcnRfYm1bMV07CisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAlkdGltX2NudDsKKwl1OAlkdGltX3BlcmlvZDsKKwl1OAliaXRtYXBfY3RsOworCXU4CXZpcnRfYm1bMV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfdGltX3Q7CiAKIC8qLS0gSUJTUyBQYXJhbWV0ZXIgU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX2lic3NfcGFybXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQxNglhdGltX3dpbjsKKwl1OAllaWQ7CisJdTgJbGVuOworCXUxNglhdGltX3dpbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9pYnNzX3Bhcm1zX3Q7CiAKIC8qLS0gQ2hhbGxlbmdlIFRleHQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX2NoYWxsZW5nZQogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJY2hhbGxlbmdlWzFdOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJY2hhbGxlbmdlWzFdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2NoYWxsZW5nZV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzI5LDkgKzMyOSw5IEBACiAvKiBwcm90b3R5cGUgc3RydWN0dXJlLCBhbGwgbWdtdCBmcmFtZSB0eXBlcyB3aWxsIHN0YXJ0IHdpdGggdGhlc2UgbWVtYmVycyAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9tZ210CiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47CS8qIERPRVMgTk9UIGluY2x1ZGUgQ1JDICEhISEqLwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsJLyogRE9FUyBOT1QgaW5jbHVkZSBDUkMgISEhISovCisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwpAQCAtMzQyLDE2ICszNDIsMTYgQEAKIC8qLS0gQmVhY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2JlYWNvbgogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQ2NAkJCSp0czsKLQlVSU5UMTYJCQkqYmNuX2ludDsKLQlVSU5UMTYJCQkqY2FwX2luZm87CisJdTY0CQkJKnRzOworCXUxNgkJCSpiY25faW50OworCXUxNgkJCSpjYXBfaW5mbzsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zc2lkX3QJCSpzc2lkOwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwpAQCAtMzY3LDkgKzM2Nyw5IEBACiAvKi0tIElCU1MgQVRJTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9pYnNzYXRpbQogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4KgkJCWJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OCoJCQlidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CkBAIC0zODQsMTQgKzM4NCwxNCBAQAogLyotLSBEaXNhc3NvY2lhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfZGlzYXNzb2MKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqcmVhc29uOworCXUxNgkJCSpyZWFzb247CiAKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAKQEAgLTQwMCwxNSArNDAwLDE1IEBACiAvKi0tIEFzc29jaWF0aW9uIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3JlcQogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4KgkJCWJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OCoJCQlidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKLQlVSU5UMTYJCQkqbGlzdGVuX2ludDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKmxpc3Rlbl9pbnQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3NpZF90CQkqc3NpZDsKIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKQEAgLTQxOCwxNiArNDE4LDE2IEBACiAvKi0tIEFzc29jaWF0aW9uIFJlc3BvbnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hc3NvY3Jlc3AKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKnN0YXR1czsKLQlVSU5UMTYJCQkqYWlkOworCXUxNgkJCSpjYXBfaW5mbzsKKwl1MTYJCQkqc3RhdHVzOworCXUxNgkJCSphaWQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwogCkBAIC00MzYsMTYgKzQzNiwxNiBAQAogLyotLSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcmVhc3NvY3JlcQogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKLQlVSU5UMTYJCQkqbGlzdGVuX2ludDsKLQlVSU5UOAkJCSpjdXJyX2FwOworCXUxNgkJCSpjYXBfaW5mbzsKKwl1MTYJCQkqbGlzdGVuX2ludDsKKwl1OAkJCSpjdXJyX2FwOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC00NTUsMTYgKzQ1NSwxNiBAQAogLyotLSBSZWFzc29jaWF0aW9uIFJlc3BvbnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcmVhc3NvY3Jlc3AKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKnN0YXR1czsKLQlVSU5UMTYJCQkqYWlkOworCXUxNgkJCSpjYXBfaW5mbzsKKwl1MTYJCQkqc3RhdHVzOworCXUxNgkJCSphaWQ7CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwogCkBAIC00NzMsOSArNDczLDkgQEAKIC8qLS0gUHJvYmUgUmVxdWVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3Byb2JlcmVxCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKQEAgLTQ4OSwxNiArNDg5LDE2IEBACiAvKi0tIFByb2JlIFJlc3BvbnNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlc3AKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UNjQJCQkqdHM7Ci0JVUlOVDE2CQkJKmJjbl9pbnQ7Ci0JVUlOVDE2CQkJKmNhcF9pbmZvOworCXU2NAkJCSp0czsKKwl1MTYJCQkqYmNuX2ludDsKKwl1MTYJCQkqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3NpZF90CQkqc3NpZDsKIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKQEAgLTUxMSwxNiArNTExLDE2IEBACiAvKi0tIEF1dGhlbnRpY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9hdXRoZW4KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqYXV0aF9hbGc7Ci0JVUlOVDE2CQkJKmF1dGhfc2VxOwotCVVJTlQxNgkJCSpzdGF0dXM7CisJdTE2CQkJKmF1dGhfYWxnOworCXUxNgkJCSphdXRoX3NlcTsKKwl1MTYJCQkqc3RhdHVzOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX2NoYWxsZW5nZV90CSpjaGFsbGVuZ2U7CiAKQEAgLTUyOSwxNCArNTI5LDE0IEBACiAvKi0tIERlYXV0aGVuaWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2RlYXV0aGVuCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKnJlYXNvbjsKKwl1MTYJCQkqcmVhc29uOwogCiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtb2QuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMzZjYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qIHNyYy9wODAyMTEvcDgwMjExbW9kLmMKLSoKLSogTW9kdWxlIGVudHJ5IGFuZCBleGl0IGZvciBwODAyMTEKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwODAyMTEubyBlbnRyeSBhbmQgZXhpdCBwb2ludHMgZGVmaW5lZCBmb3IgbGludXgKLSoga2VybmVsIG1vZHVsZXMuCi0qCi0qIE5vdGVzOgotKiAtIGFsbCBtb2R1bGUgcGFyYW1ldGVycyBmb3IgIHA4MDIxMS5vIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogU3lzdGVtIEluY2x1ZGVzICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDI1KSkKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLQotI2luY2x1ZGUgInZlcnNpb24uaCIKLSNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogUHJvamVjdCBJbmNsdWRlcyAqLwotCi0jaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKLSNpbmNsdWRlICJwODAyMTFoZHIuaCIKLSNpbmNsdWRlICJwODAyMTFtZ210LmgiCi0jaW5jbHVkZSAicDgwMjExY29udi5oIgotI2luY2x1ZGUgInA4MDIxMW1zZy5oIgotI2luY2x1ZGUgInA4MDIxMW5ldGRldi5oIgotI2luY2x1ZGUgInA4MDIxMXJlcS5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgQ29uc3RhbnRzICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIE1hY3JvcyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBUeXBlcyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KLQotc3RhdGljIGNoYXIgKnZlcnNpb24gPSAicDgwMjExLm86ICIgV0xBTl9SRUxFQVNFOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAtLU1vZHVsZSBQYXJhbWV0ZXJzICovCi0KLWludCB3bGFuX3dhdGNoZG9nID0gNTAwMDsKLW1vZHVsZV9wYXJhbSh3bGFuX3dhdGNoZG9nLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh3bGFuX3dhdGNoZG9nLCAidHJhbnNtaXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiKTsKLQotaW50IHdsYW5fd2V4dF93cml0ZSA9IDA7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTIKLW1vZHVsZV9wYXJhbSh3bGFuX3dleHRfd3JpdGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2V4dF93cml0ZSwgImVuYWJsZSB3cml0ZSB3aXJlbGVzcyBleHRlbnNpb25zIik7Ci0jZW5kaWYKLQotI2lmZGVmIFdMQU5fSU5DTFVERV9ERUJVRwotaW50IHdsYW5fZGVidWc9MDsKLW1vZHVsZV9wYXJhbSh3bGFuX2RlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh3bGFuX2RlYnVnLCAicDgwMjExIGRlYnVnIGxldmVsIik7Ci0jZW5kaWYKLQotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCi0KLWludAlpbml0X21vZHVsZSh2b2lkKTsKLXZvaWQJY2xlYW51cF9tb2R1bGUodm9pZCk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaW5pdF9tb2R1bGUKLSoKLSogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIGNhbGxlZCBvbmNlIGF0IG1vZHVsZSBsb2FkIHRpbWUuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKgkwCS0gc3VjY2VzcwotKgl+MAktIGZhaWx1cmUsIG1vZHVsZSBpcyB1bmxvYWRlZC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKglUT0RPOiBkZWZpbmUKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAoaW5zbW9kIG9yIG1vZHByb2JlKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLSAgICAgICAgREJGRU5URVI7Ci0KLSNpZiAwCi0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgKCVzKSBMb2FkZWRcbiIsIHZlcnNpb24sIFdMQU5fQlVJTERfREFURSk7Ci0jZW5kaWYKLQotCXA4MDIxMW5ldGRldl9zdGFydHVwKCk7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1ZyhOVUxMLCBXTEFOX0hPVFBMVUdfU1RBUlRVUCk7Ci0jZW5kaWYKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogY2xlYW51cF9tb2R1bGUKLSoKLSogQ2FsbGVkIGF0IG1vZHVsZSB1bmxvYWQgdGltZS4gIFRoaXMgaXMgb3VyIGxhc3QgY2hhbmNlIHRvCi0qIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglUT0RPOiBkZWZpbmUKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0gICAgICAgIERCRkVOVEVSOwotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1ZyhOVUxMLCBXTEFOX0hPVFBMVUdfU0hVVERPV04pOwotI2VuZGlmCi0JcDgwMjExbmV0ZGV2X3NodXRkb3duKCk7Ci0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiJXMgVW5sb2FkZWRcbiIsIHZlcnNpb24pOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybjsKLX0KLQotRVhQT1JUX1NZTUJPTChwODAyMTFuZXRkZXZfaHdyZW1vdmVkKTsKLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfd2xhbmRldik7Ci1FWFBPUlRfU1lNQk9MKHA4MDIxMW5ldGRldl9yeCk7Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfd2xhbmRldik7Ci1FWFBPUlRfU1lNQk9MKHdsYW5fc2V0dXApOwotRVhQT1JUX1NZTUJPTCh3bGFuX3Vuc2V0dXApOwotRVhQT1JUX1NZTUJPTChwODAyMTFfc3VzcGVuZCk7Ci1FWFBPUlRfU1lNQk9MKHA4MDIxMV9yZXN1bWUpOwotCi1FWFBPUlRfU1lNQk9MKHA4MDIxMXNrYl9mcmVlKTsKLUVYUE9SVF9TWU1CT0wocDgwMjExc2tiX3J4bWV0YV9hdHRhY2gpOwotCi1FWFBPUlRfU1lNQk9MKHA4MDIxMXdleHRfZXZlbnRfYXNzb2NpYXRlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCmluZGV4IGMxNGU5ZmIuLjNhNTc1ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1zZy5oCkBAIC03OCwxNyArNzgsMTcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnCiB7Ci0JVUlOVDMyCW1zZ2NvZGU7Ci0JVUlOVDMyCW1zZ2xlbjsKLQlVSU5UOAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworCXUzMgltc2djb2RlOworCXUzMgltc2dsZW47CisJdTgJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ2QKIHsKLQlVSU5UMzIJbXNnY29kZTsKLQlVSU5UMzIJbXNnbGVuOwotCVVJTlQ4CWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JVUlOVDgJYXJnc1swXTsKKwl1MzIJbXNnY29kZTsKKwl1MzIJbXNnbGVuOworCXU4CWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisJdTgJYXJnc1swXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnZF90OwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwppbmRleCAyYjcwNWVhLi41OWU1YWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtNzksMTUgKzc5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2VuZGlmCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAjaW5jbHVkZSAicDgwMjExdHlwZXMuaCIKICNpbmNsdWRlICJwODAyMTFoZHIuaCIKQEAgLTExMSwxNSArMTA4LDYgQEAKIC8qIExvY2FsIFR5cGVzICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBfX05PX1ZFUlNJT05fXwkJLyogcHJldmVudCB0aGUgc3RhdGljIGRlZmluaXRpb24gKi8KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jX3A4MDIxMTsKLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKIC8qIFN1cHBvcnQgZnVuY3Rpb25zICovCkBAIC0xMzUsNzUgKzEyMywyNiBAQAogc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2RvX2lvY3RsKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3MobmV0ZGV2aWNlX3QgKmRldiwgdm9pZCAqYWRkcik7CiBzdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQobmV0ZGV2aWNlX3QgKm5ldGRldik7Ci1zdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgZmMpOworc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3AoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IGZjKTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50Ci1wODAyMTFuZXRkZXZfcHJvY19yZWFkKAotCWNoYXIJKnBhZ2UsCi0JY2hhcgkqKnN0YXJ0LAotCW9mZl90CW9mZnNldCwKLQlpbnQJY291bnQsCi0JaW50CSplb2YsCi0Jdm9pZAkqZGF0YSk7CitpbnQgd2xhbl93YXRjaGRvZyA9IDUwMDA7Cittb2R1bGVfcGFyYW0od2xhbl93YXRjaGRvZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2xhbl93YXRjaGRvZywgInRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7CisKK2ludCB3bGFuX3dleHRfd3JpdGUgPSAxOworbW9kdWxlX3BhcmFtKHdsYW5fd2V4dF93cml0ZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2xhbl93ZXh0X3dyaXRlLCAiZW5hYmxlIHdyaXRlIHdpcmVsZXNzIGV4dGVuc2lvbnMiKTsKKworI2lmZGVmIFdMQU5fSU5DTFVERV9ERUJVRworaW50IHdsYW5fZGVidWc9MDsKK21vZHVsZV9wYXJhbSh3bGFuX2RlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3bGFuX2RlYnVnLCAicDgwMjExIGRlYnVnIGxldmVsIik7CiAjZW5kaWYKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwODAyMTFrbmV0ZGV2X3N0YXJ0dXAKLSoKLSogSW5pdGlhbGl6ZSB0aGUgd2xhbmRldmljZS9uZXRkZXZpY2UgcGFydCBvZiA4MDIuMTEgc2VydmljZXMgYXQKLSogbG9hZCB0aW1lLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHA4MDIxMW5ldGRldl9zdGFydHVwKHZvaWQpCi17Ci0JREJGRU5URVI7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWlmIChpbml0X25ldC5wcm9jX25ldCAhPSBOVUxMKSB7Ci0JCXByb2NfcDgwMjExID0gY3JlYXRlX3Byb2NfZW50cnkoCi0JCQkJInA4MDIxMSIsCi0JCQkJKFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPKSwKLQkJCQlpbml0X25ldC5wcm9jX25ldCk7Ci0JfQotI2VuZGlmCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwODAyMTFrbmV0ZGV2X3NodXRkb3duCi0qCi0qIFNodXRkb3duIHRoZSB3bGFuZGV2aWNlL25ldGRldmljZSBwYXJ0IG9mIDgwMi4xMSBzZXJ2aWNlcyBhdAotKiB1bmxvYWQgdGltZS4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotcDgwMjExbmV0ZGV2X3NodXRkb3duKHZvaWQpCi17Ci0JREJGRU5URVI7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAocHJvY19wODAyMTEgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgicDgwMjExIiwgaW5pdF9uZXQucHJvY19uZXQpOwotCX0KLSNlbmRpZgotCURCRkVYSVQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwODAyMTFrbmV0ZGV2X2luaXQKICoKICogSW5pdCBtZXRob2QgZm9yIGEgTGludXggbmV0ZGV2aWNlLiAgQ2FsbGVkIGluIHJlc3BvbnNlIHRvCkBAIC0yODUsMTAgKzIyNCw3IEBACiAJaWYgKCB3bGFuZGV2LT5vcGVuICE9IE5VTEwpIHsKIAkJcmVzdWx0ID0gd2xhbmRldi0+b3Blbih3bGFuZGV2KTsKIAkJaWYgKCByZXN1bHQgPT0gMCApIHsKLSNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMyw0MykgKQotCQkJbmV0ZGV2LT5pbnRlcnJ1cHQgPSAwOwotI2VuZGlmCi0JCQlwODAyMTFuZXRkZXZfc3RhcnRfcXVldWUod2xhbmRldik7CisJCQluZXRpZl9zdGFydF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCQkJd2xhbmRldi0+c3RhdGUgPSBXTEFOX0RFVklDRV9PUEVOOwogCQl9CiAJfSBlbHNlIHsKQEAgLTMyMyw3ICsyNTksNyBAQAogCQlyZXN1bHQgPSB3bGFuZGV2LT5jbG9zZSh3bGFuZGV2KTsKIAl9CiAKLQlwODAyMTFuZXRkZXZfc3RvcF9xdWV1ZSh3bGFuZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJd2xhbmRldi0+c3RhdGUgPSBXTEFOX0RFVklDRV9DTE9TRUQ7CiAKIAlEQkZFWElUOwpAQCAtMzc2LDcgKzMxMiw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJbmV0ZGV2aWNlX3QgICAgICpkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CiAJcDgwMjExX2hkcl9hM190ICpoZHI7Ci0JVUlOVDE2IGZjOworCXUxNiBmYzsKIAogICAgICAgICBEQkZFTlRFUjsKIApAQCAtNDc4LDE1ICs0MTQsNiBAQAogCW1lbXNldCgmcDgwMjExX2hkciwgMCwgc2l6ZW9mKHA4MDIxMV9oZHJfdCkpOwogCW1lbXNldCgmcDgwMjExX3dlcCwgMCwgc2l6ZW9mKHA4MDIxMV9tZXRhd2VwX3QpKTsKIAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQlpZiAoIHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQqKSYobmV0ZGV2LT50YnVzeSkpICE9IDAgKSB7Ci0JCS8qIFdlJ3ZlIGJlZW4gY2FsbGVkIHcvIHRidXN5IHNldCwgaGFzIHRoZSB0eCAqLwotCQkvKiBwYXRoIHN0YWxsZWQ/ICAgKi8KLQkJV0xBTl9MT0dfREVCVUcoMSwgImNhbGxlZCB3aGVuIHRidXN5IHNldFxuIik7Ci0JCXJlc3VsdCA9IDE7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLSNlbHNlCiAJaWYgKCBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldikgKSB7CiAJCVdMQU5fTE9HX0RFQlVHKDEsICJjYWxsZWQgd2hlbiBxdWV1ZSBzdG9wcGVkLlxuIik7CiAJCXJlc3VsdCA9IDE7CkBAIC00OTUsMTIgKzQyMiw2IEBACiAKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKLQkvKiBObyB0aW1lb3V0IGhhbmRsaW5nIGhlcmUsIDIuMy4zOCsga2VybmVscyBjYWxsIHRoZQotCSAqIHRpbWVvdXQgZnVuY3Rpb24gZGlyZWN0bHkuCi0JICogVE9ETzogQWRkIHRpbWVvdXQgaGFuZGxpbmcuCi0JKi8KLSNlbmRpZgotCiAJLyogQ2hlY2sgdG8gc2VlIHRoYXQgYSB2YWxpZCBtb2RlIGlzIHNldCAqLwogCXN3aXRjaCggd2xhbmRldi0+bWFjbW9kZSApIHsKIAljYXNlIFdMQU5fTUFDTU9ERV9JQlNTX1NUQToKQEAgLTUxMyw3ICs0MzQsNyBAQAogCQkgKiBUT0RPOiB3ZSBuZWVkIGEgc2FuZXIgd2F5IHRvIGhhbmRsZSB0aGlzCiAJCSAqLwogCQlpZihza2ItPnByb3RvY29sICE9IEVUSF9QXzgwMjExX1JBVykgewotCQkJcDgwMjExbmV0ZGV2X3N0YXJ0X3F1ZXVlKHdsYW5kZXYpOworCQkJbmV0aWZfc3RhcnRfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAkJCVdMQU5fTE9HX05PVElDRSgKIAkJCQkiVHggYXR0ZW1wdCBwcmlvciB0byBhc3NvY2lhdGlvbiwgZnJhbWUgZHJvcHBlZC5cbiIpOwogCQkJd2xhbmRldi0+bGludXhfc3RhdHMudHhfZHJvcHBlZCsrOwpAQCAtNTU3LDcgKzQ3OCw3IEBACiAJaWYgKCB0eHJlc3VsdCA9PSAwKSB7CiAJCS8qIHN1Y2Nlc3MgYW5kIG1vcmUgYnVmICovCiAJCS8qIGF2YWlsLCByZTogaHdfdHhkYXRhICovCi0JCXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKHdsYW5kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJCXJlc3VsdCA9IDA7CiAJfSBlbHNlIGlmICggdHhyZXN1bHQgPT0gMSApIHsKIAkJLyogc3VjY2Vzcywgbm8gbW9yZSBhdmFpbCAqLwpAQCAtNjE5LDcgKzU0MCw3IEBACiAKIHN0YXRpYyBpbnQgcDgwMjExbmV0ZGV2X2V0aHRvb2wod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCiB7Ci0JVUlOVDMyIGV0aGNtZDsKKwl1MzIgZXRoY21kOwogCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKIAlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YTsKIApAQCAtNjg2LDcgKzYwNyw3IEBACiAqCQktRUZBVUxUIG1lbW9yeSBmYXVsdCBjb3B5aW5nIG1zZyBmcm9tIHVzZXIgYnVmZmVyCiAqCQktRU5PTUVNIHVuYWJsZSB0byBhbGxvY2F0ZSBrZXJuZWwgbXNnIGJ1ZmZlcgogKgkJLUVOT1NZUwliYWQgbWFnaWMsIGl0IHRoZSBjbWQgcmVhbGx5IGZvciB1cz8KLSoJCS1FSU5UUglzbGVlcGluZyBvbiBjbWQsIGF3YWtlbmVkIGJ5IHNpZ25hbCwgY21kIGNhbmNlbGxlZC4KKyoJCS1FaW50UglzbGVlcGluZyBvbiBjbWQsIGF3YWtlbmVkIGJ5IHNpZ25hbCwgY21kIGNhbmNlbGxlZC4KICoKICogQ2FsbCBDb250ZXh0OgogKglQcm9jZXNzIHRocmVhZCAoaW9jdGwgY2FsbGVyKS4gIFRPRE86IFNNUCBzdXBwb3J0IG1heSByZXF1aXJlCkBAIC02OTcsMjEgKzYxOCwxMSBAQAogCWludAkJCXJlc3VsdCA9IDA7CiAJcDgwMjExaW9jdGxfcmVxX3QJKnJlcSA9IChwODAyMTFpb2N0bF9yZXFfdCopaWZyOwogCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0JVUlOVDgJCQkqbXNnYnVmOworCXU4CQkJKm1zZ2J1ZjsKIAlEQkZFTlRFUjsKIAogCVdMQU5fTE9HX0RFQlVHKDIsICJyeCdkIGlvY3RsLCBjbWQ9JWQsIGxlbj0lZFxuIiwgY21kLCByZXEtPmxlbik7CiAKLSNpZiBXSVJFTEVTU19FWFQgPCAxMwotCS8qIElzIHRoaXMgYSB3aXJlbGVzcyBleHRlbnNpb25zIGlvY3RsPyAqLwotCWlmICgoY21kID49IFNJT0NJV0ZJUlNUKSAmJiAoY21kIDw9IFNJT0NJV0xBU1QpKSB7Ci0JCWlmICgocmVzdWx0ID0gcDgwMjExd2V4dF9zdXBwb3J0X2lvY3RsKGRldiwgaWZyLCBjbWQpKQotCQkgICAgIT0gKC1FT1BOT1RTVVBQKSkgewotCQkJZ290byBiYWlsOwotCQl9Ci0JfQotI2VuZGlmCi0KICNpZmRlZiBTSU9DRVRIVE9PTAogCWlmIChjbWQgPT0gU0lPQ0VUSFRPT0wpIHsKIAkJcmVzdWx0ID0gcDgwMjExbmV0ZGV2X2V0aHRvb2wod2xhbmRldiwgKHZvaWQgX191c2VyICopIGlmci0+aWZyX2RhdGEpOwpAQCAtNzkyLDE1ICs3MDMsOSBAQAogCiAJREJGRU5URVI7CiAJLyogSWYgd2UncmUgcnVubmluZywgd2UgZG9uJ3QgYWxsb3cgTUFDIGFkZHJlc3MgY2hhbmdlcyAqLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQlpZiAoIGRldi0+c3RhcnQpIHsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0jZWxzZQogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0jZW5kaWYKIAogCS8qIFNldCB1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzLiAqLwogCW1pYmF0dHIgPSAmZG90MTFyZXEubWliYXR0cmlidXRlOwpAQCAtODMzLDcgKzczOCw3IEBACiAJcmVzdWx0Y29kZS0+ZGF0YSA9IDA7CiAKIAkvKiBub3cgZmlyZSB0aGUgcmVxdWVzdCAqLwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3QoZGV2LT5tbF9wcml2LCAoVUlOVDggKikmZG90MTFyZXEpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3QoZGV2LT5tbF9wcml2LCAodTggKikmZG90MTFyZXEpOwogCiAJLyogSWYgdGhlIHJlcXVlc3Qgd2Fzbid0IHN1Y2Nlc3NmdWwsIHJlcG9ydCBhbiBlcnJvciBhbmQgZG9uJ3QKIAkgKiBjaGFuZ2UgdGhlIG5ldGRldiBhZGRyZXNzCkBAIC05MDksMTMgKzgxNCwxMSBAQAogCQkgICAgICh1bnNpZ25lZCBsb25nKXdsYW5kZXYpOwogCiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN0cnVjdCBkZXZpY2UgKi8KLQlkZXYgPSBrbWFsbG9jKHNpemVvZihuZXRkZXZpY2VfdCksIEdGUF9BVE9NSUMpOworCWRldiA9IGFsbG9jX25ldGRldigwLCJ3bGFuJWQiLGV0aGVyX3NldHVwKTsKIAlpZiAoIGRldiA9PSBOVUxMICkgewogCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIGFsbG9jIG5ldGRldi5cbiIpOwogCQlyZXN1bHQgPSAxOwogCX0gZWxzZSB7Ci0JCW1lbXNldCggZGV2LCAwLCBzaXplb2YobmV0ZGV2aWNlX3QpKTsKLQkJZXRoZXJfc2V0dXAoZGV2KTsKIAkJd2xhbmRldi0+bmV0ZGV2ID0gZGV2OwogCQlkZXYtPm1sX3ByaXYgPSB3bGFuZGV2OwogCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9CXA4MDIxMWtuZXRkZXZfaGFyZF9zdGFydF94bWl0OwpAQCAtOTMwLDIxICs4MzMsMTIgQEAKIAkJZGV2LT5vcGVuID0JCXA4MDIxMWtuZXRkZXZfb3BlbjsKIAkJZGV2LT5zdG9wID0JCXA4MDIxMWtuZXRkZXZfc3RvcDsKIAotI2lmZGVmIENPTkZJR19ORVRfV0lSRUxFU1MKLSNpZiAoKFdJUkVMRVNTX0VYVCA8IDE3KSAmJiAoV0lSRUxFU1NfRVhUIDwgMjEpKQorI2lmIChXSVJFTEVTU19FWFQgPCAyMSkKIAkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBwODAyMTF3ZXh0X2dldF93aXJlbGVzc19zdGF0czsKICNlbmRpZgotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiAJCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKLSNlbmRpZgotI2VuZGlmCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0JCWRldi0+dGJ1c3kgPSAxOwotCQlkZXYtPnN0YXJ0ID0gMDsKLSNlbHNlCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLSNlbmRpZgogI2lmZGVmIEhBVkVfQ0hBTkdFX01UVQogCQlkZXYtPmNoYW5nZV9tdHUgPSB3bGFuX2NoYW5nZV9tdHU7CiAjZW5kaWYKQEAgLTEwMjcsNDQgKzkyMSwxMiBAQAogaW50IHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KQogewogCWludAkJaSA9IDA7Ci0JbmV0ZGV2aWNlX3QJKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKIAogCURCRkVOVEVSOwogCi0JaSA9IGRldl9hbGxvY19uYW1lKHdsYW5kZXYtPm5ldGRldiwgIndsYW4lZCIpOwotCWlmIChpID49IDApIHsKLQkJaSA9IHJlZ2lzdGVyX25ldGRldih3bGFuZGV2LT5uZXRkZXYpOwotCX0KLQlpZiAoaSAhPSAwKSB7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApICkKLQlkZXYtPm5hbWUgPSB3bGFuZGV2LT5uYW1lOwotI2Vsc2UKLQlzdHJjcHkod2xhbmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAocHJvY19wODAyMTEpIHsKLQkJd2xhbmRldi0+cHJvY2RpciA9IHByb2NfbWtkaXIod2xhbmRldi0+bmFtZSwgcHJvY19wODAyMTEpOwotCQlpZiAoIHdsYW5kZXYtPnByb2NkaXIgKQotCQkJd2xhbmRldi0+cHJvY3dsYW5kZXYgPQotCQkJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIndsYW5kZXYiLCAwLAotCQkJCQkJICAgICAgIHdsYW5kZXYtPnByb2NkaXIsCi0JCQkJCQkgICAgICAgcDgwMjExbmV0ZGV2X3Byb2NfcmVhZCwKLQkJCQkJCSAgICAgICB3bGFuZGV2KTsKLQkJaWYgKHdsYW5kZXYtPm5zZF9wcm9jX3JlYWQpCi0JCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJuc2QiLCAwLAotCQkJCQkgICAgICAgd2xhbmRldi0+cHJvY2RpciwKLQkJCQkJICAgICAgIHdsYW5kZXYtPm5zZF9wcm9jX3JlYWQsCi0JCQkJCSAgICAgICB3bGFuZGV2KTsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1JFR0lTVEVSKTsKLSNlbmRpZgorCWkgPSByZWdpc3Rlcl9uZXRkZXYod2xhbmRldi0+bmV0ZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CiAKIAlEQkZFWElUOwogCXJldHVybiAwOwpAQCAtMTA5NCwyMiArOTU2LDYgQEAKIAogCURCRkVOVEVSOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2LCBXTEFOX0hPVFBMVUdfUkVNT1ZFKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAoIHdsYW5kZXYtPnByb2N3bGFuZGV2ICkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgid2xhbmRldiIsIHdsYW5kZXYtPnByb2NkaXIpOwotCX0KLQlpZiAoIHdsYW5kZXYtPm5zZF9wcm9jX3JlYWQgKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJuc2QiLCB3bGFuZGV2LT5wcm9jZGlyKTsKLQl9Ci0JaWYgKHdsYW5kZXYtPnByb2NkaXIpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkod2xhbmRldi0+bmFtZSwgcHJvY19wODAyMTEpOwotCX0KLSNlbmRpZgotCiAJdW5yZWdpc3Rlcl9uZXRkZXYod2xhbmRldi0+bmV0ZGV2KTsKIAogCS8qIE5vdyB0byBjbGVhbiBvdXQgdGhlIHJ4IHF1ZXVlICovCkBAIC0xMTIxLDc2ICs5NjcsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcm9jX3JlYWQKLSoKLSogUmVhZCBmdW5jdGlvbiBmb3IgL3Byb2MvbmV0L3A4MDIxMS88ZGV2aWNlPi93bGFuZGV2Ci0qCi0qIEFyZ3VtZW50czoKLSoJYnVmCi0qCXN0YXJ0Ci0qCW9mZnNldAotKgljb3VudAotKgllb2YKLSoJZGF0YQotKiBSZXR1cm5zOgotKgl6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KLSogQ2FsbCBDb250ZXh0OgotKglDYW4gYmUgZWl0aGVyIGludGVycnVwdCBvciBub3QuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLXA4MDIxMW5ldGRldl9wcm9jX3JlYWQoCi0JY2hhcgkqcGFnZSwKLQljaGFyCSoqc3RhcnQsCi0Jb2ZmX3QJb2Zmc2V0LAotCWludAljb3VudCwKLQlpbnQJKmVvZiwKLQl2b2lkCSpkYXRhKQotewotCWNoYXIJICpwID0gcGFnZTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSAod2xhbmRldmljZV90ICopIGRhdGE7Ci0KLQlEQkZFTlRFUjsKLQlpZiAob2Zmc2V0ICE9IDApIHsKLQkJKmVvZiA9IDE7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwICs9IHNwcmludGYocCwgInA4MDIxMSB2ZXJzaW9uOiAlcyAoJXMpXG5cbiIsCi0JCSAgICAgV0xBTl9SRUxFQVNFLCBXTEFOX0JVSUxEX0RBVEUpOwotCXAgKz0gc3ByaW50ZihwLCAibmFtZSAgICAgICA6ICVzXG4iLCB3bGFuZGV2LT5uYW1lKTsKLQlwICs9IHNwcmludGYocCwgIm5zZCBuYW1lICAgOiAlc1xuIiwgd2xhbmRldi0+bnNkbmFtZSk7Ci0JcCArPSBzcHJpbnRmKHAsICJhZGRyZXNzICAgIDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkclswXSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkclsxXSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkclsyXSwKLQkJICAgICB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzNdLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzRdLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyWzVdKTsKLQlwICs9IHNwcmludGYocCwgIm5zZCBjYXBzICAgOiAlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfSEFSRFdBUkVXRVApID8gIndlcF9odyAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX1RJRURXRVApID8gIndlcF90aWVkICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfTk9IT1NUV0VQKSA/ICJ3ZXBfaHdfb25seSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX1BCQ0MpID8gInBiY2MgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9TSE9SVF9QUkVBTUJMRSkgPyAic2hvcnRfcHJlYW1ibGUgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9BR0lMSVRZKSA/ICJhZ2lsaXR5ICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfQVBfUkVUUkFOU01JVCkgPyAiYXBfcmV0cmFuc21pdCAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0hXRlJBR01FTlQpID8gImh3X2ZyYWcgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9BVVRPSk9JTikgPyAiYXV0b2pvaW4gIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9OT1NDQU4pID8gIiIgOiAic2NhbiAiKTsKLQotCi0JcCArPSBzcHJpbnRmKHAsICJic3NpZCAgICAgIDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgd2xhbmRldi0+YnNzaWRbMF0sIHdsYW5kZXYtPmJzc2lkWzFdLCB3bGFuZGV2LT5ic3NpZFsyXSwKLQkJICAgICB3bGFuZGV2LT5ic3NpZFszXSwgd2xhbmRldi0+YnNzaWRbNF0sIHdsYW5kZXYtPmJzc2lkWzVdKTsKLQotCXAgKz0gc3ByaW50ZihwLCAiRW5hYmxlZCAgICA6ICVzJXNcbiIsCi0JCSAgICAgKHdsYW5kZXYtPnNob3J0cHJlYW1ibGUpID8gInNob3J0X3ByZWFtYmxlICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpID8gInByaXZhY3kiIDogIiIpOwotCi0KLSBleGl0OgotCURCRkVYSVQ7Ci0JcmV0dXJuIChwIC0gcGFnZSk7Ci19Ci0jZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHA4MDIxMW5ldGRldl9od3JlbW92ZWQKQEAgLTEyMjcsNyArMTAwMyw3IEBACiAJREJGRU5URVI7CiAJd2xhbmRldi0+aHdyZW1vdmVkID0gMTsKIAlpZiAoIHdsYW5kZXYtPnN0YXRlID09IFdMQU5fREVWSUNFX09QRU4pIHsKLQkJcDgwMjExbmV0ZGV2X3N0b3BfcXVldWUod2xhbmRldik7CisJCW5ldGlmX3N0b3BfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAl9CiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKHdsYW5kZXYtPm5ldGRldik7CkBAIC0xMjU3LDEwICsxMDMzLDEwIEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBmYykKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBmYykKIHsKLQlVSU5UMTYJZnR5cGU7Ci0JVUlOVDE2CWZzdHlwZTsKKwl1MTYJZnR5cGU7CisJdTE2CWZzdHlwZTsKIAlpbnQJZHJvcCA9IDA7CiAJLyogQ2xhc3NpZnkgZnJhbWUsIGluY3JlbWVudCBjb3VudGVyICovCiAJZnR5cGUgPSBXTEFOX0dFVF9GQ19GVFlQRShmYyk7CkBAIC0xNDE2LDc1ICsxMTkyLDYgQEAKIAlyZXR1cm4gZHJvcDsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0vKiBOb3RpZnkgdXNlcnNwYWNlIHdoZW4gYSBuZXRkZXZpY2UgZXZlbnQgb2NjdXJzLAotICogYnkgcnVubmluZyAnL3NiaW4vaG90cGx1ZyBuZXQnIHdpdGggY2VydGFpbgotICogZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldC4KLSAqLwotaW50IHA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgY2hhciAqYWN0aW9uKQotewotICAgICAgICBjaGFyICphcmd2WzNdLCAqZW52cFs3XSwgaWZuYW1lWzEyICsgSUZOQU1TSVpdLCBhY3Rpb25fc3RyWzMyXTsKLQljaGFyIG5zZG5hbWVbMzJdLCB3bGFuX3dleHRbMzJdOwotICAgICAgICBpbnQgaTsKLQotCWlmICh3bGFuZGV2KSB7Ci0JCXNwcmludGYoaWZuYW1lLCAiSU5URVJGQUNFPSVzIiwgd2xhbmRldi0+bmFtZSk7Ci0JCXNwcmludGYobnNkbmFtZSwgIk5TRE5BTUU9JXMiLCB3bGFuZGV2LT5uc2RuYW1lKTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKGlmbmFtZSwgIklOVEVSRkFDRT1udWxsIik7Ci0JCXNwcmludGYobnNkbmFtZSwgIk5TRE5BTUU9bnVsbCIpOwotCX0KLQotCXNwcmludGYod2xhbl93ZXh0LCAiV0xBTl9XRVhUPSVzIiwgd2xhbl93ZXh0X3dyaXRlID8gInkiIDogIiIpOwotICAgICAgICBzcHJpbnRmKGFjdGlvbl9zdHIsICJBQ1RJT049JXMiLCBhY3Rpb24pOwotCi0gICAgICAgIGkgPSAwOwotICAgICAgICBhcmd2W2krK10gPSBob3RwbHVnX3BhdGg7Ci0gICAgICAgIGFyZ3ZbaSsrXSA9ICJ3bGFuIjsKLSAgICAgICAgYXJndltpXSA9IE5VTEw7Ci0KLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIC8qIG1pbmltYWwgY29tbWFuZCBlbnZpcm9ubWVudCAqLwotICAgICAgICBlbnZwIFtpKytdID0gIkhPTUU9LyI7Ci0gICAgICAgIGVudnAgW2krK10gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7Ci0gICAgICAgIGVudnAgW2krK10gPSBpZm5hbWU7Ci0gICAgICAgIGVudnAgW2krK10gPSBhY3Rpb25fc3RyOwotICAgICAgICBlbnZwIFtpKytdID0gbnNkbmFtZTsKLSAgICAgICAgZW52cCBbaSsrXSA9IHdsYW5fd2V4dDsKLSAgICAgICAgZW52cCBbaV0gPSBOVUxMOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2MikpCi0gICAgICAgIHJldHVybiBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3YgWzBdLCBhcmd2LCBlbnZwKTsKLSNlbHNlCi0gICAgICAgIHJldHVybiBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3YgWzBdLCBhcmd2LCBlbnZwLCAwKTsKLSNlbmRpZgotfQotCi0jZW5kaWYKLQotCi12b2lkICAgIHA4MDIxMV9zdXNwZW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1NVU1BFTkQpOwotI2VuZGlmCi0KLQlEQkZFWElUOwotfQotCi12b2lkICAgIHA4MDIxMV9yZXN1bWUod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCURCRkVOVEVSOwotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUcKLQlwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2LCBXTEFOX0hPVFBMVUdfUkVTVU1FKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLX0KLQogc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KCBuZXRkZXZpY2VfdCAqbmV0ZGV2KQogewogCXdsYW5kZXZpY2VfdAkqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKQEAgLTE0OTUsNyArMTIwMiw3IEBACiAJfSBlbHNlIHsKIAkJV0xBTl9MT0dfV0FSTklORygiSW1wbGVtZW50IHR4X3RpbWVvdXQgZm9yICVzXG4iLAogCQkJCSB3bGFuZGV2LT5uc2RuYW1lKTsKLQkJcDgwMjExbmV0ZGV2X3dha2VfcXVldWUod2xhbmRldik7CisJCW5ldGlmX3dha2VfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAl9CiAKIAlEQkZFWElUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAppbmRleCA5YjJlMGNkLi45NDAxNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaApAQCAtMTEzLDU0ICsxMTMsNDggQEAKIC8qIFJlY2VpdmVkIGZyYW1lIHN0YXRpc3RpY3MgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1yeF90CiB7Ci0JVUlOVDMyCW1nbXQ7Ci0JVUlOVDMyCWFzc29jcmVxOwotCVVJTlQzMglhc3NvY3Jlc3A7Ci0JVUlOVDMyCXJlYXNzb2NyZXE7Ci0JVUlOVDMyCXJlYXNzb2NyZXNwOwotCVVJTlQzMglwcm9iZXJlcTsKLQlVSU5UMzIJcHJvYmVyZXNwOwotCVVJTlQzMgliZWFjb247Ci0JVUlOVDMyCWF0aW07Ci0JVUlOVDMyCWRpc2Fzc29jOwotCVVJTlQzMglhdXRoZW47Ci0JVUlOVDMyCWRlYXV0aGVuOwotCVVJTlQzMgltZ210X3Vua25vd247Ci0JVUlOVDMyCWN0bDsKLQlVSU5UMzIJcHNwb2xsOwotCVVJTlQzMglydHM7Ci0JVUlOVDMyCWN0czsKLQlVSU5UMzIJYWNrOwotCVVJTlQzMgljZmVuZDsKLQlVSU5UMzIJY2ZlbmRjZmFjazsKLQlVSU5UMzIJY3RsX3Vua25vd247Ci0JVUlOVDMyCWRhdGE7Ci0JVUlOVDMyCWRhdGFvbmx5OwotCVVJTlQzMglkYXRhX2NmYWNrOwotCVVJTlQzMglkYXRhX2NmcG9sbDsKLQlVSU5UMzIJZGF0YV9fY2ZhY2tfY2Zwb2xsOwotCVVJTlQzMgludWxsOwotCVVJTlQzMgljZmFjazsKLQlVSU5UMzIJY2Zwb2xsOwotCVVJTlQzMgljZmFja19jZnBvbGw7Ci0JVUlOVDMyCWRhdGFfdW5rbm93bjsKLQlVSU5UMzIgIGRlY3J5cHQ7Ci0JVUlOVDMyICBkZWNyeXB0X2VycjsKKwl1MzIJbWdtdDsKKwl1MzIJYXNzb2NyZXE7CisJdTMyCWFzc29jcmVzcDsKKwl1MzIJcmVhc3NvY3JlcTsKKwl1MzIJcmVhc3NvY3Jlc3A7CisJdTMyCXByb2JlcmVxOworCXUzMglwcm9iZXJlc3A7CisJdTMyCWJlYWNvbjsKKwl1MzIJYXRpbTsKKwl1MzIJZGlzYXNzb2M7CisJdTMyCWF1dGhlbjsKKwl1MzIJZGVhdXRoZW47CisJdTMyCW1nbXRfdW5rbm93bjsKKwl1MzIJY3RsOworCXUzMglwc3BvbGw7CisJdTMyCXJ0czsKKwl1MzIJY3RzOworCXUzMglhY2s7CisJdTMyCWNmZW5kOworCXUzMgljZmVuZGNmYWNrOworCXUzMgljdGxfdW5rbm93bjsKKwl1MzIJZGF0YTsKKwl1MzIJZGF0YW9ubHk7CisJdTMyCWRhdGFfY2ZhY2s7CisJdTMyCWRhdGFfY2Zwb2xsOworCXUzMglkYXRhX19jZmFja19jZnBvbGw7CisJdTMyCW51bGw7CisJdTMyCWNmYWNrOworCXUzMgljZnBvbGw7CisJdTMyCWNmYWNrX2NmcG9sbDsKKwl1MzIJZGF0YV91bmtub3duOworCXUzMiAgZGVjcnlwdDsKKwl1MzIgIGRlY3J5cHRfZXJyOwogfSBwODAyMTFfZnJtcnhfdDsKIAotI2lmZGVmIFdJUkVMRVNTX0VYVAogLyogY2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcyAqLwogc3RydWN0IGl3X3N0YXRpc3RpY3MqIHA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzKG5ldGRldmljZV90ICpkZXYpOwogLyogd2lyZWxlc3MgZXh0ZW5zaW9ucycgaW9jdGxzICovCiBpbnQgcDgwMjExd2V4dF9zdXBwb3J0X2lvY3RsKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwODAyMTF3ZXh0X2hhbmRsZXJfZGVmOwotI2VuZGlmCi0KIGludCBwODAyMTF3ZXh0X2V2ZW50X2Fzc29jaWF0ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIGludCBhc3NvYyk7CiAKLSNlbmRpZiAvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCi0KIC8qIFdFUCBzdHVmZiAqLwogI2RlZmluZSBOVU1fV0VQS0VZUyA0CiAjZGVmaW5lIE1BWF9LRVlMRU4gMzIKQEAgLTE4NCwxOCArMTc4LDE4IEBACiAJY2hhcgkJbmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsgLyogRGV2IG5hbWUsIGZyb20gcmVnaXN0ZXJfd2xhbmRldigpKi8KIAljaGFyCQkqbnNkbmFtZTsKIAotCVVJTlQzMiAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogRGV2aWNlIEkvRiBzdGF0ZSAob3Blbi9jbG9zZWQpICovCi0JVUlOVDMyCQltc2RzdGF0ZTsJLyogc3RhdGUgb2YgdW5kZXJseWluZyBkcml2ZXIgKi8KLQlVSU5UMzIJCWh3cmVtb3ZlZDsJLyogSGFzIHRoZSBodyBiZWVuIHlhbmtlZCBvdXQ/ICovCisJdTMyICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBEZXZpY2UgSS9GIHN0YXRlIChvcGVuL2Nsb3NlZCkgKi8KKwl1MzIJCW1zZHN0YXRlOwkvKiBzdGF0ZSBvZiB1bmRlcmx5aW5nIGRyaXZlciAqLworCXUzMgkJaHdyZW1vdmVkOwkvKiBIYXMgdGhlIGh3IGJlZW4geWFua2VkIG91dD8gKi8KIAogCS8qIEhhcmR3YXJlIGNvbmZpZyAqLwotCVVJTlQJCWlycTsKLQlVSU5UCQlpb2Jhc2U7Ci0JVUlOVAkJbWVtYmFzZTsKLQlVSU5UMzIgICAgICAgICAgbnNkY2FwczsgIC8qIE5TRCBDYXBhYmlsaXRpZXMgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJCWlycTsKKwl1bnNpZ25lZCBpbnQJCWlvYmFzZTsKKwl1bnNpZ25lZCBpbnQJCW1lbWJhc2U7CisJdTMyICAgICAgICAgIG5zZGNhcHM7ICAvKiBOU0QgQ2FwYWJpbGl0aWVzIGZsYWdzICovCiAKIAkvKiBDb25maWcgdmFycyAqLwotCVVJTlQJCWV0aGNvbnY7CisJdW5zaWduZWQgaW50CQlldGhjb252OwogCiAJLyogZGV2aWNlIG1ldGhvZHMgKGluaXQgYnkgTVNELCB1c2VkIGJ5IHA4MDIxMSAqLwogCWludAkJKCpvcGVuKShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CkBAIC0yMDcsMjAgKzIwMSwxNSBAQAogCQkJCQkgICAgICBuZXRkZXZpY2VfdCAqZGV2KTsKIAl2b2lkCQkoKnR4X3RpbWVvdXQpKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaW50ICAgICAgICAgICAgICgqbnNkX3Byb2NfcmVhZCkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwgaW50CSplb2YsIHZvaWQgKmRhdGEpOwotI2VuZGlmCi0KIAkvKiA4MDIuMTEgU3RhdGUgKi8KLQlVSU5UOAkJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXU4CQlic3NpZFtXTEFOX0JTU0lEX0xFTl07CiAJcDgwMjExcHN0cjMyX3QJc3NpZDsKLQlVSU5UMzIJCW1hY21vZGU7CisJdTMyCQltYWNtb2RlOwogCWludCAgICAgICAgICAgICBsaW5rc3RhdHVzOwotCWludCAgICAgICAgICAgICBzaG9ydHByZWFtYmxlOyAgLyogQyBib29sICovCiAKIAkvKiBXRVAgU3RhdGUgKi8KLQlVSU5UOCB3ZXBfa2V5c1tOVU1fV0VQS0VZU11bTUFYX0tFWUxFTl07Ci0JVUlOVDggd2VwX2tleWxlbnNbTlVNX1dFUEtFWVNdOworCXU4IHdlcF9rZXlzW05VTV9XRVBLRVlTXVtNQVhfS0VZTEVOXTsKKwl1OCB3ZXBfa2V5bGVuc1tOVU1fV0VQS0VZU107CiAJaW50ICAgaG9zdHdlcDsKIAogCS8qIFJlcXVlc3QvQ29uZmlybSBpL2Ygc3RhdGUgKHVzZWQgYnkgcDgwMjExKSAqLwpAQCAtMjMyLDEyICsyMjEsNiBAQAogCW5ldGRldmljZV90CQkqbmV0ZGV2OwkvKiBwdHIgdG8gbGludXggbmV0ZGV2aWNlICovCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbGludXhfc3RhdHM7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCS8qIFByb2NmcyBzdXBwb3J0ICovCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5CSpwcm9jZGlyOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY3dsYW5kZXY7Ci0jZW5kaWYKLQogCS8qIFJ4IGJvdHRvbSBoYWxmICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXJ4X2JoOwogCkBAIC0yNDYsMjkgKzIyOSwxOCBAQAogCS8qIDgwMi4xMSBkZXZpY2Ugc3RhdGlzdGljcyAqLwogCXN0cnVjdCBwODAyMTFfZnJtcnhfdAlyeDsKIAotLyogY29tcGF0aWJpbGl0eSB0byB3aXJlbGVzcyBleHRlbnNpb25zICovCi0jaWZkZWYgV0lSRUxFU1NfRVhUCiAJc3RydWN0IGl3X3N0YXRpc3RpY3MJd3N0YXRzOwogCiAJLyogamtyaWVnbDogaXdzcHkgZmllbGRzICovCi0gICAgICAgIFVJTlQ4CQkJc3B5X251bWJlcjsKKyAgICAgICAgdTgJCQlzcHlfbnVtYmVyOwogICAgICAgICBjaGFyCQkJc3B5X2FkZHJlc3NbSVdfTUFYX1NQWV1bRVRIX0FMRU5dOwogICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAgICAgICBzcHlfc3RhdFtJV19NQVhfU1BZXTsKLQotI2VuZGlmCi0KIH0gd2xhbmRldmljZV90OwogCiAvKiBXRVAgc3R1ZmYgKi8KLWludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIFVJTlQ4KiBrZXksIGludCBrZXlsZW4pOwotaW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KTsKLWludCB3ZXBfZW5jcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICpidWYsIFVJTlQ4ICpkc3QsIFVJTlQzMiBsZW4sIGludCBrZXludW0sIFVJTlQ4ICppdiwgVUlOVDggKmljdik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBFeHRlcm5zICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KK2ludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIHU4KiBrZXksIGludCBrZXlsZW4pOworaW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgdTggKml2LCB1OCAqaWN2KTsKK2ludCB3ZXBfZW5jcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHU4ICpkc3QsIHUzMiBsZW4sIGludCBrZXludW0sIHU4ICppdiwgdTggKmljdik7CiAKIHZvaWQJcDgwMjExbmV0ZGV2X3N0YXJ0dXAodm9pZCk7CiB2b2lkCXA4MDIxMW5ldGRldl9zaHV0ZG93bih2b2lkKTsKQEAgLTI3OCw1OSArMjUwLDUgQEAKIGludAl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KTsKIHZvaWQJcDgwMjExbmV0ZGV2X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXZvaWQgICAgcDgwMjExX3N1c3BlbmQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXZvaWQgICAgcDgwMjExX3Jlc3VtZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1wODAyMTFuZXRkZXZfc3RvcF9xdWV1ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaWYgKCAhd2xhbmRldiApIHJldHVybjsKLQlpZiAoICF3bGFuZGV2LT5uZXRkZXYgKSByZXR1cm47Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCXdsYW5kZXYtPm5ldGRldi0+dGJ1c3kgPSAxOwotCXdsYW5kZXYtPm5ldGRldi0+c3RhcnQgPSAwOwotI2Vsc2UKLQluZXRpZl9zdG9wX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1wODAyMTFuZXRkZXZfc3RhcnRfcXVldWUod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWlmICggIXdsYW5kZXYgKSByZXR1cm47Ci0JaWYgKCAhd2xhbmRldi0+bmV0ZGV2ICkgcmV0dXJuOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQl3bGFuZGV2LT5uZXRkZXYtPnRidXN5ID0gMDsKLQl3bGFuZGV2LT5uZXRkZXYtPnN0YXJ0ID0gMTsKLSNlbHNlCi0JbmV0aWZfc3RhcnRfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlpZiAoICF3bGFuZGV2ICkgcmV0dXJuOwotCWlmICggIXdsYW5kZXYtPm5ldGRldiApIHJldHVybjsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0Jd2xhbmRldi0+bmV0ZGV2LT50YnVzeSA9IDA7Ci0JbWFya19iaChORVRfQkgpOwotI2Vsc2UKLQluZXRpZl93YWtlX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0jZGVmaW5lIFdMQU5fSE9UUExVR19SRUdJU1RFUiAicmVnaXN0ZXIiCi0jZGVmaW5lIFdMQU5fSE9UUExVR19SRU1PVkUgICAicmVtb3ZlIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfU1RBUlRVUCAgInN0YXJ0dXAiCi0jZGVmaW5lIFdMQU5fSE9UUExVR19TSFVURE9XTiAic2h1dGRvd24iCi0jZGVmaW5lIFdMQU5fSE9UUExVR19TVVNQRU5EICJzdXNwZW5kIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfUkVTVU1FICJyZXN1bWUiCi1pbnQgcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldmljZV90ICp3bGFuZGV2LCBjaGFyICphY3Rpb24pOwotI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwppbmRleCAwMjMzYWJlLi42ZTIwYmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwpAQCAtNTQsNyArNTQsNiBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNjgsNyArNjcsNiBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0xMjYsNyArMTI0LDcgQEAKICoJUG90ZW50aWFsbHkgYmxvY2tzIHRoZSBjYWxsZXIsIHNvIGl0J3MgYSBnb29kIGlkZWEgdG8KICoJbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcDgwMjExcmVxX2RvcmVxdWVzdCggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqbXNnYnVmKQoraW50IHA4MDIxMXJlcV9kb3JlcXVlc3QoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKm1zZ2J1ZikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7CiAJcDgwMjExbXNnX3QJKm1zZyA9IChwODAyMTFtc2dfdCopbXNnYnVmOwpAQCAtMjI0LDM4ICsyMjIsMTEgQEAKIHsKIAlwODAyMTFpdGVtZF90ICAgKm1pYml0ZW0gPSAocDgwMjExaXRlbWRfdCAqKSBtaWJfbXNnLT5taWJhdHRyaWJ1dGUuZGF0YTsKIAlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgbWliaXRlbS0+ZGF0YTsKLQlVSU5UOCAqa2V5ID0gbWliaXRlbS0+ZGF0YSArIHNpemVvZihwODAyMTFwc3RyZF90KTsKKwl1OCAqa2V5ID0gbWliaXRlbS0+ZGF0YSArIHNpemVvZihwODAyMTFwc3RyZF90KTsKIAogCURCRkVOVEVSOwogCiAJc3dpdGNoIChtaWJpdGVtLT5kaWQpIHsKLQljYXNlIERJRG1pYl9kb3QxMXNtdF9wODAyMTFUYWJsZV9wODAyMTFfaWZzdGF0ZTogewotCQlVSU5UMzIgKmRhdGEgPSAoVUlOVDMyICopIG1pYml0ZW0tPmRhdGE7Ci0JCWlmIChpc2dldCkKLQkJCXN3aXRjaCAod2xhbmRldi0+bXNkc3RhdGUpIHsKLQkJCWNhc2UgV0xBTl9NU0RfSFdQUkVTRU5UOgotCQkJCSpkYXRhID0gUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdMQU5fTVNEX0ZXTE9BRDoKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1faWZzdGF0ZV9md2xvYWQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdMQU5fTVNEX1JVTk5JTkc6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZW5hYmxlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1faWZzdGF0ZV9lbmFibGU7Ci0JCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRQcmVhbWJsZUVuYWJsZWQ6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOwotCi0JCWlmIChpc2dldCkKLQkJCSpkYXRhID0gd2xhbmRldi0+c2hvcnRwcmVhbWJsZTsKLQkJZWxzZQotCQkJd2xhbmRldi0+c2hvcnRwcmVhbWJsZSA9ICpkYXRhOwotCQlicmVhazsKLQl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA6IHsKIAkJaWYgKCFpc2dldCkKIAkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDAsIGtleSwgcHN0ci0+bGVuKTsKQEAgLTI3Nyw3ICsyNDgsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQ6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CiAKIAkJaWYgKGlzZ2V0KSB7CiAJCQkqZGF0YSA9IHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0RFRkFVTFRLRVlfTUFTSzsKQEAgLTI4OSw3ICsyNjAsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZDogewotCQlVSU5UMzIgKmRhdGEgPSAoVUlOVDMyICopIG1pYml0ZW0tPmRhdGE7CisJCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKIAogCQlpZiAoaXNnZXQpIHsKIAkJCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9QUklWQUNZSU5WT0tFRCkKQEAgLTMwNCw3ICsyNzUsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQ6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CiAKIAkJaWYgKGlzZ2V0KSB7CiAJCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAppbmRleCA1NGFiZGNlLi40OTdhNGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaApAQCAtNjMsNiArNjMsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwogCi1pbnQJcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICptc2didWYpOworaW50CXA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqbXNnYnVmKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAppbmRleCA4MTFiMGNlLi41YmU2NzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKQEAgLTgwLDEzICs4MCwxMyBAQAogCiAjZGVmaW5lIFA4MDIxMV9UWVBFX09DVEVUU1RSCQkxCS8qIHBhc2NhbCBhcnJheSBvZiBieXRlcyAqLwogI2RlZmluZSBQODAyMTFfVFlQRV9ESVNQTEFZU1RSCQkyCS8qIHBhc2NhbCBhcnJheSBvZiBieXRlcyBjb250YWluaW5nIGFzY2lpICovCi0jZGVmaW5lIFA4MDIxMV9UWVBFX0lOVAkJCTQJLyogVUlOVDMyIG1pbiBhbmQgbWF4IGxpbWl0ZWQgYnkgMzIgYml0cyAqLwotI2RlZmluZSBQODAyMTFfVFlQRV9FTlVNSU5UCQk1CS8qIFVJTlQzMiBob2xkaW5nIGEgbnVtZXJpYworI2RlZmluZSBQODAyMTFfVFlQRV9pbnQJCQk0CS8qIHUzMiBtaW4gYW5kIG1heCBsaW1pdGVkIGJ5IDMyIGJpdHMgKi8KKyNkZWZpbmUgUDgwMjExX1RZUEVfRU5VTWludAkJNQkvKiB1MzIgaG9sZGluZyBhIG51bWVyaWMKIAkJCQkJCSAgIGNvZGUgdGhhdCBjYW4gYmUgbWFwcGVkCiAJCQkJCQkgICB0byBhIHRleHR1YWwgbmFtZSAqLwogI2RlZmluZSBQODAyMTFfVFlQRV9VTktEQVRBCQk2CS8qIERhdGEgaXRlbSBjb250YWluaW5nIGFuCiAJCQkJCQkgICB1bmtub3duIGRhdGEgdHlwZSAqLwotI2RlZmluZSBQODAyMTFfVFlQRV9JTlRBUlJBWQkJNwkvKiBBcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMuICovCisjZGVmaW5lIFA4MDIxMV9UWVBFX2ludEFSUkFZCQk3CS8qIEFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfQklUQVJSQVkJCTgJLyogQXJyYXkgb2YgYml0cy4gKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfTUFDQVJSQVkJCTkJLyogQXJyYXkgb2YgTUFDIGFkZHJlc3Nlcy4gKi8KIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJCQkJCS8qIGlzIGEgRElELUxFTi1EQVRBIHRyaXBsZSAqLwogCQkJCQkvKiB3aXRoIGEgbWF4IHNpemUgb2YgNCs0KzM4NCAqLwogCi0jZGVmaW5lIFA4MDIxMV9TRVRfSU5UKGl0ZW0sIHZhbHVlKSBkbyB7IFwKKyNkZWZpbmUgUDgwMjExX1NFVF9pbnQoaXRlbSwgdmFsdWUpIGRvIHsgXAogCShpdGVtKS5kYXRhICAgPSAodmFsdWUpOyBcCiAJKGl0ZW0pLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsgXAogCX0gd2hpbGUoMCkKQEAgLTI3OSw5ICsyNzksOSBAQAogCiAjZGVmaW5lIFA4MDIxMUlURU1fU0VURkxBR1MocSwgciwgYykJKCBxIHwgciB8IGMgKQogCi0jZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVSVJFRChmbGFncykJKCgoVUlOVDMyKShmbGFncyAmIElTUkVRVUlSRUQpKSA+PiAzMSApCi0jZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVRVNUKGZsYWdzKQkoKChVSU5UMzIpKGZsYWdzICYgSVNSRVFVRVNUKSkgPj4gMzAgKQotI2RlZmluZSBQODAyMTFJVEVNX0lTQ09ORklSTShmbGFncykJKCgoVUlOVDMyKShmbGFncyAmIElTQ09ORklSTSkpID4+IDI5ICkKKyNkZWZpbmUgUDgwMjExSVRFTV9JU1JFUVVJUkVEKGZsYWdzKQkoKCh1MzIpKGZsYWdzICYgSVNSRVFVSVJFRCkpID4+IDMxICkKKyNkZWZpbmUgUDgwMjExSVRFTV9JU1JFUVVFU1QoZmxhZ3MpCSgoKHUzMikoZmxhZ3MgJiBJU1JFUVVFU1QpKSA+PiAzMCApCisjZGVmaW5lIFA4MDIxMUlURU1fSVNDT05GSVJNKGZsYWdzKQkoKCh1MzIpKGZsYWdzICYgSVNDT05GSVJNKSkgPj4gMjkgKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVGhlIGZvbGxvd2luZyBtYWNybyBjcmVhdGVzIGEgbmFtZSBmb3IgYW4gZW51bSAqLwpAQCAtMzIwLDcgKzMyMCw3IEBACiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX0FDQ0VTUyAJCSgweDAwMDAwMDAzVUwpCiAKIAotI2RlZmluZSBQODAyMTFESURfTUsoYSxtLGwpCSgoKChVSU5UMzIpKGEpKSAmIChtKSkgPDwgKGwpKQorI2RlZmluZSBQODAyMTFESURfTUsoYSxtLGwpCSgoKCh1MzIpKGEpKSAmIChtKSkgPDwgKGwpKQogCiAjZGVmaW5lIFA4MDIxMURJRF9NS1NFQ1RJT04oYSkJUDgwMjExRElEX01LKGEsIFwKIAkJCQkJUDgwMjExRElEX01BU0tfU0VDVElPTiwgXApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJCQkJCQkoYSkgKQogCiAKLSNkZWZpbmUgUDgwMjExRElEX0dFVChhLG0sbCkJKCgoKFVJTlQzMikoYSkpID4+IChsKSkgJiAobSkpCisjZGVmaW5lIFA4MDIxMURJRF9HRVQoYSxtLGwpCSgoKCh1MzIpKGEpKSA+PiAobCkpICYgKG0pKQogCiAjZGVmaW5lIFA4MDIxMURJRF9TRUNUSU9OKGEpCVA4MDIxMURJRF9HRVQoYSwgXAogCQkJCQlQODAyMTFESURfTUFTS19TRUNUSU9OLCBcCkBAIC0zNzMsMTcgKzM3MywxNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgdHlwZXMgYXJlIHVzZWQgZm9yIHRoZSByZXByZXNlbmF0aW9uICovCi0vKiAgb2YgRU5VTUlOVCB0eXBlIG1ldGFkYXRhLiAqLworLyogIG9mIEVOVU1pbnQgdHlwZSBtZXRhZGF0YS4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExZW51bXBhaXIKIHsKLQlVSU5UMzIJCQl2YWw7CisJdTMyCQkJdmFsOwogCWNoYXIJCQkqbmFtZTsKIH0gcDgwMjExZW51bXBhaXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExZW51bQogewotCUlOVAkJCW5pdGVtczsKKwlpbnQJCQluaXRlbXM7CiAJcDgwMjExZW51bXBhaXJfdAkqbGlzdDsKIH0gcDgwMjExZW51bV90OwogCkBAIC0zOTQsMTM3ICszOTQsMTM3IEBACiAvKiBUZW1wbGF0ZSBwYXNjYWwgc3RyaW5nICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyCiB7Ci0JVUlOVDgJCWxlbjsKKwl1OAkJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHJkCiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVswXTsKKwl1OAkJbGVuOworCXU4CQlkYXRhWzBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyZF90OwogCiAvKiBNYXhpbXVtIHBhc2NhbCBzdHJpbmcgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIyNTUKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSMjU1XTsKKwl1OAkJbGVuOworCXU4CQlkYXRhW01BWExFTl9QU1RSMjU1XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cjI1NV90OwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBtYWNhZGRyZXNzIGFuZCBic3NpZCAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjYKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSNl07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fUFNUUjZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFwc3RyNl90OwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBjaGFubmVsIGxpc3QgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIxNAogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbTUFYTEVOX1BTVFIxNF07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fUFNUUjE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cjE0X3Q7CiAKIC8qIHBhc2NhbCBzdHJpbmcgZm9yIHNzaWQgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIzMgogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbTUFYTEVOX1BTVFIzMl07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fUFNUUjMyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cjMyX3Q7CiAKIC8qIE1BQyBhZGRyZXNzIGFycmF5ICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtYWNhcnJheQogewotCVVJTlQzMgkJY250OwotCVVJTlQ4CQlkYXRhWzFdW01BWExFTl9QU1RSNl07CisJdTMyCQljbnQ7CisJdTgJCWRhdGFbMV1bTUFYTEVOX1BTVFI2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbWFjYXJyYXlfdDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fdDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlIHcvIGRhdGEgaXRlbSAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbWQKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UOAkJZGF0YVswXTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1OAkJZGF0YVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbWRfdDsKIAotLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIElOVCwgQk9VTkRFRElOVCwgRU5VTUlOVCAqLworLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIGludCwgQk9VTkRFRElOVCwgRU5VTUlOVCAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UMzIJCWRhdGE7CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTMyCQlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3VpbnQzMl90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKIAlwODAyMTFwc3RyNl90CWRhdGE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fcHN0cjZfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIxNAogewotCVVJTlQzMgkJCWRpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJbGVuOworCXUzMgkJCWRpZDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJbGVuOwogCXA4MDIxMXBzdHIxNF90CQlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHIxNF90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyCiB7Ci0JVUlOVDMyCQkJZGlkOwotCVVJTlQxNgkJCXN0YXR1czsKLQlVSU5UMTYJCQlsZW47CisJdTMyCQkJZGlkOworCXUxNgkJCXN0YXR1czsKKwl1MTYJCQlsZW47CiAJcDgwMjExcHN0cjMyX3QJCWRhdGE7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1fcHN0cjMyX3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMjU1CiB7Ci0JVUlOVDMyCQkJZGlkOwotCVVJTlQxNgkJCXN0YXR1czsKLQlVSU5UMTYJCQlsZW47CisJdTMyCQkJZGlkOworCXUxNgkJCXN0YXR1czsKKwl1MTYJCQlsZW47CiAJcDgwMjExcHN0cjI1NV90CQlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHIyNTVfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyAzOTIsIG5hbWVseSBtaWIgaXRlbXMgKi8KIHR5cGVkZWYgc3RydWN0ICBwODAyMTFpdGVtX3VuazM5MgogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9NSUJBVFRSSUJVVEVdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhW01BWExFTl9NSUJBVFRSSUJVVEVdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3VuazM5Ml90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDEwMjUsIG5hbWVseSBwMiBwZGFzICovCiB0eXBlZGVmIHN0cnVjdCAgcDgwMjExaXRlbV91bmsxMDI0CiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDgJCWRhdGFbMTAyNF07CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTgJCWRhdGFbMTAyNF07CiB9ICBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3VuazEwMjRfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyA0MDk2LCBuYW1lbHkgcDIgZG93bmxvYWQgY2h1bmtzICovCiB0eXBlZGVmIHN0cnVjdCAgcDgwMjExaXRlbV91bms0MDk2CiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDgJCWRhdGFbNDA5Nl07CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTgJCWRhdGFbNDA5Nl07CiB9ICBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3VuazQwOTZfdDsKIAogc3RydWN0IGNhdGxpc3RpdGVtOwpAQCAtNTM0LDkgKzUzNCw5IEBACiAvKiAgbWV0YWRhdGEgaXRlbXMuICBTb21lIGNvbXBvbmVudHMgbWF5IGNob29zZSB0byB1c2UgbW9yZSwgKi8KIC8qICBsZXNzIG9yIGRpZmZlcmVudCBtZXRhZGF0YSBpdGVtcy4gKi8KIAotdHlwZWRlZiB2b2lkICgqcDgwMjExX3RvdGV4dF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIFVJTlQzMiBkaWQsIFVJTlQ4KiBpdGVtYnVmLCBjaGFyICp0ZXh0YnVmKTsKLXR5cGVkZWYgdm9pZCAoKnA4MDIxMV9mcm9tdGV4dF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIFVJTlQzMiBkaWQsIFVJTlQ4KiBpdGVtYnVmLCBjaGFyICp0ZXh0YnVmKTsKLXR5cGVkZWYgVUlOVDMyICgqcDgwMjExX3ZhbGlkX3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgVUlOVDMyIGRpZCwgVUlOVDgqIGl0ZW1idWYpOwordHlwZWRlZiB2b2lkICgqcDgwMjExX3RvdGV4dF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIHUzMiBkaWQsIHU4KiBpdGVtYnVmLCBjaGFyICp0ZXh0YnVmKTsKK3R5cGVkZWYgdm9pZCAoKnA4MDIxMV9mcm9tdGV4dF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIHUzMiBkaWQsIHU4KiBpdGVtYnVmLCBjaGFyICp0ZXh0YnVmKTsKK3R5cGVkZWYgdTMyICgqcDgwMjExX3ZhbGlkX3QpKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKiwgdTMyIGRpZCwgdTgqIGl0ZW1idWYpOwogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC01NzUsOCArNTc1LDggQEAKIC8qIFRoZSBmb2xsb3dpbmcgZGVjbGFyZSBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aCB0aGUgKi8KIC8qICBwODAyMTFlbnVtX3QgdHlwZS4gKi8KIAotVUlOVDMyIHA4MDIxMWVudW1fdGV4dDJpbnQocDgwMjExZW51bV90ICplcCwgY2hhciAqdGV4dCk7Ci1VSU5UMzIgcDgwMjExZW51bV9pbnQydGV4dChwODAyMTFlbnVtX3QgKmVwLCBVSU5UMzIgdmFsLCBjaGFyICp0ZXh0KTsKK3UzMiBwODAyMTFlbnVtX3RleHQyaW50KHA4MDIxMWVudW1fdCAqZXAsIGNoYXIgKnRleHQpOwordTMyIHA4MDIxMWVudW1faW50MnRleHQocDgwMjExZW51bV90ICplcCwgdTMyIHZhbCwgY2hhciAqdGV4dCk7CiB2b2lkIHA4MDIxMV9lcnJvcjJ0ZXh0KGludCBlcnJfY29kZSwgY2hhciAqZXJyX3N0cik7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC01OTEsODUgKzU5MSw4NSBAQAogCiAvKi0tIERJU1BMQVlTVFIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIHBzdHIgPT0+IGNzdHIgKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGNzdHIgPT0+IHBzdHIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhIGRpc3BsYXlzdHIgYmluYXJ5IHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAvKi0tIE9DVEVUU1RSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIHBzdHIgPT0+ICJ4eDp4eDouLi4uIiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiAieHg6eHg6Li4uLiIgPT0+IHBzdHIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfb2N0ZXRzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGFuIG9jdGV0c3RyIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCi0vKi0tIElOVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFVJTlQzMiA9PT4gJWQgKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKi0tIGludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHUzMiA9PT4gJWQgKi8KK3ZvaWQgcDgwMjExX3RvdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qICVkID09PiBVSU5UMzIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qICVkID09PiB1MzIgKi8KK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYW4gaW50J3MgYmluYXJ5IHZhbHVlIChhbHdheXMgc3VjY2Vzc2Z1bCkgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCi0vKi0tIEVOVU1JTlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFVJTlQzMiA9PT4gPHZhbHVlbmFtZT4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyotLSBFTlVNaW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB1MzIgPT0+IDx2YWx1ZW5hbWU+ICovCit2b2lkIHA4MDIxMV90b3RleHRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotLyogPHZhbHVlbmFtZT4gPT0+IFVJTlQzMiAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qIDx2YWx1ZW5hbWU+ID09PiB1MzIgKi8KK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGVudW0ncyBiaW5hcnkgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKLS8qLS0gSU5UQVJSQVkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogVUlOVDMyW10gPT4gJWQsJWQsJWQsLi4uICovCi12b2lkIHA4MDIxMV90b3RleHRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKi0tIGludEFSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHUzMltdID0+ICVkLCVkLCVkLC4uLiAqLwordm9pZCBwODAyMTFfdG90ZXh0X2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi0vKiAlZCwlZCwlZCwuLi4gPT0+IFVJTlQzMltdICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qICVkLCVkLCVkLC4uLiA9PT4gdTMyW10gKi8KK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBpbnRlZ2VyIGFycmF5J3MgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogLyotLSBCSVRBUlJBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzIgPT0+ICVkLCVkLCVkLC4uLiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyogdTMyID09PiAlZCwlZCwlZCwuLi4gKi8KK3ZvaWQgcDgwMjExX3RvdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotLyogJWQsJWQsJWQsLi4uID09PiBVSU5UMzIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyogJWQsJWQsJWQsLi4uID09PiB1MzIgKi8KK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhIGJpdCBhcnJheSdzIHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gTUFDQVJSQVkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwODAyMTFfdG90ZXh0X21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X21hY2FycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhIE1BQyBhZGRyZXNzIGFycmF5J3MgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogLyotLSBNSUJBVFRSSVVCVEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIDxtaWJ2YWx1ZT4gPT0+IDx0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGlkZW50aWZpZWQgaW4gTUlCIG1ldGFkYXRhPiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKLXZvaWQgcDgwMjExX3RvdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV90b3RleHRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogCiAvKiA8dGV4dHVhbCByZXByZXNlbnRhdGlvbiBpZGVudGlmaWVkIGluIE1JQiBtZXRhZGF0YT4gPT0+IDxtaWJ2YWx1ZT4gKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKLXZvaWQgcDgwMjExX2Zyb210ZXh0X3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBtaWJpdGVtJ3MgYmluYXJ5IHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAjZW5kaWYgLyogX1A4MDIxMVRZUEVTX0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwppbmRleCAxMWE1MGM3Li40NmEyYTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwpAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAvLyAjZGVmaW5lIFdFUF9ERUJVRwpAQCAtNzMsNyArNzIsNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIENvbnN0YW50cyAqLwogCi0jZGVmaW5lIFNTV0FQKGEsYikge1VJTlQ4IHRtcCA9IHNbYV07IHNbYV0gPSBzW2JdOyBzW2JdID0gdG1wO30KKyNkZWZpbmUgU1NXQVAoYSxiKSB7dTggdG1wID0gc1thXTsgc1thXSA9IHNbYl07IHNbYl0gPSB0bXA7fQogI2RlZmluZSBXRVBfS0VZKHgpICAgICAgICgoKHgpICYgMHhDMCkgPj4gNikKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTg3LDcgKzg2LDcgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KIAotc3RhdGljIGNvbnN0IFVJTlQzMiB3ZXBfY3JjMzJfdGFibGVbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgd2VwX2NyYzMyX3RhYmxlWzI1Nl0gPSB7CiAgICAgICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKICAgICAgICAgMHg3MDZhZjQ4ZkwsIDB4ZTk2M2E1MzVMLCAweDllNjQ5NWEzTCwgMHgwZWRiODgzMkwsIDB4NzlkY2I4YTRMLAogICAgICAgICAweGUwZDVlOTFlTCwgMHg5N2QyZDk4OEwsIDB4MDliNjRjMmJMLCAweDdlYjE3Y2JkTCwgMHhlN2I4MmQwN0wsCkBAIC0xNTAsNyArMTQ5LDcgQEAKIAogLyoga2V5bGVuIGluIGJ5dGVzISAqLwogCi1pbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCBVSU5UOCoga2V5LCBpbnQga2V5bGVuKQoraW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgdTgqIGtleSwgaW50IGtleWxlbikKIHsKIAlpZiAoa2V5bGVuIDwgMCkgIHJldHVybiAtMTsKIAlpZiAoa2V5bGVuID49IE1BWF9LRVlMRU4pIHJldHVybiAtMTsKQEAgLTE3MywxMSArMTcyLDExIEBACiAgIDQtYnl0ZSBJViBhdCBzdGFydCBvZiBidWZmZXIsIDQtYnl0ZSBJQ1YgYXQgZW5kIG9mIGJ1ZmZlci4KICAgaWYgc3VjY2Vzc2Z1bCwgYnVmIHN0YXJ0IGlzIHBheWxvYWQgYmVnaW4sIGxlbmd0aCAtPSA4OwogICovCi1pbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqYnVmLCBVSU5UMzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLCBVSU5UOCAqaXYsIFVJTlQ4ICppY3YpCitpbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLCB1OCAqaXYsIHU4ICppY3YpCiB7Ci0JVUlOVDMyIGksIGosIGssIGNyYywga2V5bGVuOwotCVVJTlQ4IHNbMjU2XSwga2V5WzY0XSwgY19jcmNbNF07Ci0JVUlOVDgga2V5aWR4OworCXUzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKKwl1OCBzWzI1Nl0sIGtleVs2NF0sIGNfY3JjWzRdOworCXU4IGtleWlkeDsKIAogCS8qIE5lZWRzIHRvIGJlIGF0IGxlYXN0IDggYnl0ZXMgb2YgcGF5bG9hZCAqLwogCWlmIChsZW4gPD0gMCkgcmV0dXJuIC0xOwpAQCAtMjQ1LDEwICsyNDQsMTAgQEAKIH0KIAogLyogZW5jcnlwdHMgaW4tcGxhY2UuICovCi1pbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqYnVmLCBVSU5UOCAqZHN0LCBVSU5UMzIgbGVuLCBpbnQga2V5bnVtLCBVSU5UOCAqaXYsIFVJTlQ4ICppY3YpCitpbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLCB1OCAqaXYsIHU4ICppY3YpCiB7Ci0JVUlOVDMyIGksIGosIGssIGNyYywga2V5bGVuOwotCVVJTlQ4IHNbMjU2XSwga2V5WzY0XTsKKwl1MzIgaSwgaiwgaywgY3JjLCBrZXlsZW47CisJdTggc1syNTZdLCBrZXlbNjRdOwogCiAJLyogbm8gcG9pbnQgaW4gV0VQcGluZyBhbiBlbXB0eSBmcmFtZSAqLwogCWlmIChsZW4gPD0gMCkgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jCmluZGV4IGIyYzllYTIuLjBkNTcwZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMKQEAgLTM4LDcgKzM4LDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDcsOSArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTU4LDcgKzU1LDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAogI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCkBAIC03OCwxMCArNzQsOCBAQAogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2Vzc2lkKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKTsKLS8qIGNvbXBhdGliaWxpdHkgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIFdJUkVMRVNTX0VYVAogCi1zdGF0aWMgVUlOVDggcDgwMjExX21oel90b19jaGFubmVsKFVJTlQxNiBtaHopCitzdGF0aWMgdTggcDgwMjExX21oel90b19jaGFubmVsKHUxNiBtaHopCiB7CiAJaWYgKG1oeiA+PSA1MDAwKSB7CiAJCXJldHVybiAoKG1oeiAtIDUwMDApIC8gNSk7CkBAIC05Nyw3ICs5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBVSU5UMTYgcDgwMjExX2NoYW5uZWxfdG9fbWh6KFVJTlQ4IGNoLCBpbnQgZG90MTFhKQorc3RhdGljIHUxNiBwODAyMTFfY2hhbm5lbF90b19taHoodTggY2gsIGludCBkb3QxMWEpCiB7CiAKIAlpZiAoY2ggPT0gMCkKQEAgLTEyOCw3ICsxMjIsNyBAQAogCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCiAJMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NAogfTsKLSNkZWZpbmUgTlVNX0NIQU5ORUxTIChzaXplb2YocDgwMjExd2V4dF9jaGFubmVsX2ZyZXEpIC8gc2l6ZW9mKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxWzBdKSkKKyNkZWZpbmUgTlVNX0NIQU5ORUxTIEFSUkFZX1NJWkUocDgwMjExd2V4dF9jaGFubmVsX2ZyZXEpCiAKIC8qIHN0ZWFsIGEgc3BhcmUgYml0IHRvIHN0b3JlIHRoZSBzaGFyZWQvb3BlbnN5c3RlbXMgc3RhdGUuIHNob3VsZCBkZWZhdWx0IHRvIG9wZW4gaWYgbm90IHNldCAqLwogI2RlZmluZSBIT1NUV0VQX1NIQVJFREtFWSBCSVQzCkBAIC0xNDcsNyArMTQxLDcgQEAKIAogCiAKLXN0YXRpYyBpbnQgcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgZGlkLCBVSU5UMzIgZGF0YSkKK3N0YXRpYyBpbnQgcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZGlkLCB1MzIgZGF0YSkKIHsKIAlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QJbXNnOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJCW1pYml0ZW07CkBAIC0xNTksNyArMTUzLDcgQEAKIAltaWJpdGVtLmRpZCA9IGRpZDsKIAltaWJpdGVtLmRhdGEgPSBkYXRhOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJREJGRVhJVDsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjAwLDcgKzE5NCw3IEBACiAJbWVtY3B5KG1zZy5zc2lkLmRhdGEuZGF0YSwgc3NpZCwgZGF0YS5sZW5ndGgpOwogCW1zZy5zc2lkLmRhdGEubGVuID0gZGF0YS5sZW5ndGg7CiAKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMjQ1LDIwICsyMzksMTQgQEAKIAl3c3RhdHMtPnF1YWwubGV2ZWwgPSBxdWFsaXR5LmxldmVsLmRhdGE7ICAvKiBpbnN0YW50IHNpZ25hbCBsZXZlbCAqLwogCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHF1YWxpdHkubm9pc2UuZGF0YTsgIC8qIGluc3RhbnQgbm9pc2UgbGV2ZWwgKi8KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDE4CiAJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07Ci0jZWxzZQotCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKLSNlbmRpZgogCXdzdGF0cy0+ZGlzY2FyZC5jb2RlID0gd2xhbmRldi0+cnguZGVjcnlwdF9lcnI7CiAJd3N0YXRzLT5kaXNjYXJkLm53aWQgPSAwOwogCXdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMDsKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDExCiAJd3N0YXRzLT5kaXNjYXJkLmZyYWdtZW50ID0gMDsgIC8vIGluY29tcGxldGUgZnJhZ21lbnRzCiAJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMgPSAwOyAgIC8vIHR4IHJldHJpZXMuCiAJd3N0YXRzLT5taXNzLmJlYWNvbiA9IDA7Ci0jZW5kaWYKIAogCURCRkVYSVQ7CiAKQEAgLTMxMiw3ICszMDAsNyBAQAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMzYyLDcgKzM1MCw3IEBACiAJCW1pYml0ZW0uZGF0YSA9IHA4MDIxMV9taHpfdG9fY2hhbm5lbChmcmVxLT5tKTsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMzc0LDggKzM2Miw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDgKLQogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd21vZGUobmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCkBAIC00NDcsMTQgKzQzMywxMSBAQAogCX0KIAogCS8qIFNldCBPcGVyYXRpb24gbW9kZSB0byB0aGUgUE9SVCBUWVBFIFJJRCAqLwotCi0jd2FybmluZyAiZ2V0IHJpZCBvZiBwMm1pYiBoZXJlIgotCiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUG9ydFR5cGU7CiAJbWliaXRlbS5kYXRhID0gKCptb2RlID09IElXX01PREVfQURIT0MpID8gMCA6IDE7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KQogCQllcnIgPSAtRUZBVUxUOwpAQCAtNDc5LDEyICs0NjIsOSBAQAogCWRhdGEtPmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOwogCW1lbXNldChyYW5nZSwwLHNpemVvZigqcmFuZ2UpKTsKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDkKIAlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwogCS8vIFhYWCB3aGF0IGFib3V0IG1pbi9tYXhfcG1wLCBtaW4vbWF4X3BtdCwgZXRjLgotI2VuZGlmCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMAogCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwogCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDEzOwogCkBAIC00OTIsMTYgKzQ3MiwxMyBAQAogCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwogCXJhbmdlLT5taW5fcmV0cnkgPSAwOwogCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDE2CiAgICAgICAgIHJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwgIC8vbW9kZS9mcmVxL3NzaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKICAgICAgICAgcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsgIC8vZW5jb2RlCiAgICAgICAgIHJhbmdlLT5ldmVudF9jYXBhWzRdID0gKElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWUVVBTCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19FVkVOVF9DQVBBX01BU0soSVdFVkNVU1RPTSkgKTsKLSNlbmRpZgogCiAJcmFuZ2UtPm51bV9jaGFubmVscyA9IE5VTV9DSEFOTkVMUzsKIApAQCAtNTQzLDcgKzUyMCw2IEBACiAJREJGRVhJVDsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3YXAobmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtNTYxLDcgKzUzNyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPiA4CiBzdGF0aWMgaW50IHA4MDIxMXdleHRfZ2l3ZW5jb2RlKG5ldGRldmljZV90ICpkZXYsCiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQpAQCAtNTcyLDEwICs1NDcsMTMgQEAKIAogCURCRkVOVEVSOwogCisJaSA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJZXJxLT5mbGFncyA9IDA7CisKIAlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpCi0JCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKIAllbHNlCi0JCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCiAJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkKIAkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKQEAgLTYxMyw3ICs1OTEsNiBAQAogCiAJaW50IGVyciA9IDA7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaW50IGVuYWJsZSA9IDA7CiAJaW50IGk7CiAKIAlEQkZFTlRFUjsKQEAgLTYzMiwyMyArNjA5LDIzIEBACiAJCWVsc2UKIAkJCWktLTsKIAotCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsIGkpOworCQkvKiBTZXQgY3VycmVudCBrZXkgbnVtYmVyIG9ubHkgaWYgbm8ga2V5cyBhcmUgZ2l2ZW4gKi8KKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpIHsKKwkJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwgaSk7CiAKLQkJaWYgKHJlc3VsdCkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQllbHNlIHsKLQkJCWVuYWJsZSA9IDE7CisJCQlpZiAocmVzdWx0KSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CiAJCX0KIAotCX0KLQllbHNlIHsKLQkJLy8gRG8gbm90IHRoaW5nIHdoZW4gbm8gS2V5IEluZGV4CisJfSBlbHNlIHsKKwkJLy8gVXNlIGRlZmF1bHRrZXkgaWYgbm8gS2V5IEluZGV4CisJCWkgPSB3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9ERUZBVUxUS0VZX01BU0s7CiAJfQogCiAJLyogQ2hlY2sgaWYgdGhlcmUgaXMgbm8ga2V5IGluZm9ybWF0aW9uIGluIHRoZSBpd2NvbmZpZyByZXF1ZXN0ICovCi0JaWYoKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpID09IDAgJiYgZW5hYmxlID09IDEpIHsKKwlpZigoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkgPT0gMCApIHsKIAogCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkgKiBJZiB0aGVyZSBpcyBXRVAgS2V5IGZvciBzZXR0aW5nLCBjaGVjayB0aGUgS2V5IEluZm9ybWF0aW9uCkBAIC02OTAsNyArNjY3LDcgQEAKIAogCQkJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwogCQkJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZwc3RyLCBzaXplb2YocHN0cikpOwotCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKQEAgLTcwMyw4ICs2ODAsNyBAQAogCS8qIENoZWNrIHRoZSBQcml2YWN5SW52b2tlZCBmbGFnICovCiAJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKIAkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQsIFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UpOwotCX0KLQllbHNlIGlmKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0VOQUJMRUQpIHx8IGVuYWJsZSA9PSAxKSB7CisJfSBlbHNlIHsKIAkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQsIFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSk7CiAJfQogCkBAIC03MTMsNyArNjg5LDEzIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKiBDaGVjayB0aGUgRXhjbHVkZVVuZW5jcnlwdGVkIGZsYWcgKi8KKwkvKiAgVGhlICBzZWN1cml0eSAgbW9kZSAgbWF5ICBiZSBvcGVuIG9yIHJlc3RyaWN0ZWQsIGFuZCBpdHMgbWVhbmluZworCSAgICBkZXBlbmRzIG9uIHRoZSBjYXJkIHVzZWQuIFdpdGggIG1vc3QgIGNhcmRzLCAgaW4gIG9wZW4gIG1vZGUgIG5vCisJICAgIGF1dGhlbnRpY2F0aW9uICBpcyAgdXNlZCAgYW5kICB0aGUgIGNhcmQgIG1heSAgYWxzbyAgYWNjZXB0IG5vbi0KKwkgICAgZW5jcnlwdGVkIHNlc3Npb25zLCB3aGVyZWFzIGluIHJlc3RyaWN0ZWQgIG1vZGUgIG9ubHkgIGVuY3J5cHRlZAorCSAgICBzZXNzaW9ucyAgYXJlICBhY2NlcHRlZCAgYW5kIHRoZSBjYXJkIHdpbGwgdXNlIGF1dGhlbnRpY2F0aW9uIGlmCisJICAgIGF2YWlsYWJsZS4KKwkqLwogCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHsKIAkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLCBQODAyMTFFTlVNX3RydXRoX3RydWUpOwogCX0KQEAgLTc5OCw3ICs3ODAsNyBAQAogCW1zZy5zc2lkLmRhdGEubGVuID0gbGVuZ3RoOwogCiAJV0xBTl9MT0dfREVCVUcoMSwiYXV0b2pvaW5fc3NpZCBmb3IgJXMgXG4iLGVzc2lkKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJhdXRvam9pbl9zc2lkICVkXG4iLHJlc3VsdCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC04NTAsNyArODMyLDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtODYzLDEwICs4NDUsMTAgQEAKIAlycnEtPmRpc2FibGVkID0gMDsKIAlycnEtPnZhbHVlID0gMDsKIAotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKFVJTlQxNikxKQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKChVSU5UMTYpNCkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgoVUlOVDE2KTgpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgodTE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKCh1MTYpOCkKIAogCXN3aXRjaCAobWliaXRlbS5kYXRhKSB7CiAJY2FzZSBIRkEzODR4X1JBVEVCSVRfMToKQEAgLTkwNCw3ICs4ODYsNyBAQAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtOTQ4LDcgKzkzMCw3IEBACiAJCW1pYml0ZW0uZGF0YSA9IHJ0cy0+dmFsdWU7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTk3NSw3ICs5NTcsNyBAQAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEwMTksNyArMTAwMSw3IEBACiAJCW1pYml0ZW0uZGF0YSA9IGZyYWctPnZhbHVlOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDMxLDEwICsxMDEzLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLQotI2lmIFdJUkVMRVNTX0VYVCA+IDEwCi0KICNpZm5kZWYgSVdfUkVUUllfTE9ORwogI2RlZmluZSBJV19SRVRSWV9MT05HIElXX1JFVFJZX01BWAogI2VuZGlmCkBAIC0xMDUyLDcgKzEwMzAsNyBAQAogCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgICAgbXNnOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7Ci0JVUlOVDE2IHNob3J0cmV0cnksIGxvbmdyZXRyeSwgbGlmZXRpbWU7CisJdTE2IHNob3J0cmV0cnksIGxvbmdyZXRyeSwgbGlmZXRpbWU7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTA2MCw3ICsxMDM4LDcgQEAKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRSZXRyeUxpbWl0OwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDc0LDcgKzEwNTIsNyBAQAogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFMb25nUmV0cnlMaW1pdDsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTA4OCw3ICsxMDY2LDcgQEAKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4VHJhbnNtaXRNU0RVTGlmZXRpbWU7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTExNTEsNyArMTEyOSw3IEBACiAJCW1pYml0ZW0uZGF0YSA9ICBycnEtPnZhbHVlIC89IDEwMjQ7CiAKIAkJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQllcnIgPSAtRUZBVUxUOwpAQCAtMTE2Myw3ICsxMTQxLDcgQEAKIAkJCW1pYml0ZW0uZGF0YSA9IHJycS0+dmFsdWU7CiAKIAkJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQkJaWYgKHJlc3VsdCkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTc2LDcgKzExNTQsNyBAQAogCQkJbWliaXRlbS5kYXRhID0gcnJxLT52YWx1ZTsKIAogCQkJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKQEAgLTExOTEsOSArMTE2OSw2IEBACiAKIH0KIAotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCi0KLSNpZiBXSVJFTEVTU19FWFQgPiA5CiBzdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3dHhwb3cobmV0ZGV2aWNlX3QgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKQEAgLTEyMTIsMjIgKzExODcsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKLQotICAgICAgICBzd2l0Y2ggKHJycS0+dmFsdWUpIHsKLQotICAgICAgICAgIGNhc2UgMSA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMTsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyIDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwyOyBicmVhazsKLSAgICAgICAgICBjYXNlIDMgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDM7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNCA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNDsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA1IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw1OyBicmVhazsKLSAgICAgICAgICBjYXNlIDYgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDY7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNyA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNzsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4OyBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDg7IGJyZWFrOwotCX0KLQorCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbDsKKwlpZiAocnJxLT5maXhlZCA9PSAwKQorCSAgbWliaXRlbS5kYXRhID0gMzA7CisJZWxzZQorCSAgbWliaXRlbS5kYXRhID0gcnJxLT52YWx1ZTsKICAgICAgICAgbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotICAgICAgICByZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisgICAgICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgZXJyID0gLUVGQVVMVDsKQEAgLTEyNTUsNyArMTIyMSw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMjc1LDcgKzEyNDEsNiBAQAogCURCRkVYSVQ7CiAJcmV0dXJuIGVycjsKIH0KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA5ICovCiAKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9zaXdzcHkobmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTEzNzMsNyArMTMzOCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEzCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3c2NhbihuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKnNycSwgY2hhciAqZXh0cmEpCkBAIC0xNDA5LDcgKzEzNzMsNyBAQAogCW1zZy5tYXhjaGFubmVsdGltZS5kYXRhID0gMjUwOwogCW1zZy5taW5jaGFubmVsdGltZS5kYXRhID0gMjAwOwogCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAlpZiAocmVzdWx0KQogCQllcnIgPSBwcmlzbTJfcmVzdWx0MmVyciAobXNnLnJlc3VsdGNvZGUuZGF0YSk7CiAKQEAgLTE1MjAsNyArMTQ4NCw3IEBACiAJCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0czsKIAkJbXNnLmJzc2luZGV4LmRhdGEgPSBpOwogCi0JCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCQlpZiAoKHJlc3VsdCAhPSAwKSB8fAogCQkgICAgKG1zZy5yZXN1bHRjb2RlLmRhdGEgIT0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3MpKSB7CiAJCQlicmVhazsKQEAgLTE1NDAsMTIgKzE1MDQsMTAgQEAKIAlEQkZFWElUOwogCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLy9leHRyYSB3aXJlbGVzcyBleHRlbnNpb25zIHN0dWZmIHRvIHN1cHBvcnQgTmV0d29ya01hbmFnZXIgKEkgaG9wZSkKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDE3CiAvKiBTSU9DU0lXRU5DT0RFRVhUICovCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfc2V0X2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCkBAIC0xNTgwLDcgKzE1NDIsNyBAQAogCiAKICAgaWYgKCBleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSApIHsKLSAgICBpZiAoICEgZXh0LT5hbGcgJiBJV19FTkNPREVfQUxHX1dFUCkgeworICAgIGlmICghKGV4dC0+YWxnICYgSVdfRU5DT0RFX0FMR19XRVApKSB7CiAgICAgICBXTEFOX0xPR19ERUJVRygxLCJhc2tlZCB0byBzZXQgYSBub24gd2VwIGtleSA6KCIpOwogICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTYxNSw3ICsxNTc3LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBtc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7Ci0gICAgcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LChVSU5UOCopJm1zZyk7CisgICAgcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCh1OCopJm1zZyk7CiAgICAgV0xBTl9MT0dfREVCVUcoMSwicmVzdWx0ICglZClcbiIscmVzdWx0KTsKICAgfQogICByZXR1cm4gcmVzdWx0OwpAQCAtMTc2MywyNiArMTcyNSw2IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLQotI2VuZGlmCi0KLQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0KLQotLyoKLXR5cGVkZWYgaW50ICgqaXdfaGFuZGxlcikobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotKi8KLQotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCiBzdGF0aWMgaXdfaGFuZGxlciBwODAyMTF3ZXh0X2hhbmRsZXJzW10gPSAgewogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd2NvbW1pdCwJCS8qIFNJT0NTSVdDT01NSVQgKi8KIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXduYW1lLAkJLyogU0lPQ0dJV05BTUUgKi8KQEAgLTE4MDgsMTMgKzE3NTAsOCBAQAogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2FwLCAgICAgICAgIAkJLyogU0lPQ0dJV0FQICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAJCS8qIFNJT0NHSVdBUExJU1QgKi8KLSNpZiBXSVJFTEVTU19FWFQgPiAxMwotCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd3NjYW4sCQkJLyogU0lPQ1NJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdzY2FuLAkJCS8qIFNJT0NHSVdTQ0FOICovCi0jZWxzZSAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBudWxsICovCQkvKiBTSU9DU0lXU0NBTiAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkvKiBudWxsICovCQkvKiBTSU9DR0lXU0NBTiAqLwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3c2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3c2NhbiwJCS8qIFNJT0NHSVdTQ0FOICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfc2l3ZXNzaWQsICAJCS8qIFNJT0NTSVdFU1NJRCAqLwogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd2Vzc2lkLCAgICAgIAkJLyogU0lPQ0dJV0VTU0lEICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAJCS8qIFNJT0NTSVdOSUNLTiAqLwpAQCAtMTgzNSw5ICsxNzcyLDcgQEAKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdlbmNvZGUsICAJCS8qIFNJT0NHSVdFTkNPREUgKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgIAkJLyogU0lPQ1NJV1BPV0VSICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgCQkvKiBTSU9DR0lXUE9XRVIgKi8KLSNpZiBXSVJFTEVTU19FWFQgPiAxNwogLyogV1BBIG9wZXJhdGlvbnMgKi8KLQogCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KIAkoaXdfaGFuZGxlcikgTlVMTCwgLyogU0lPQ1NJV0dFTklFCXNldCBnZW5lcmljIElFICovCkBAIC0xODQ4LDE3MCArMTc4MywxOCBAQAogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3NldF9lbmNvZGVleHQsIC8qIFNJT0NTSVdFTkNPREVFWFQgIHNldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9nZXRfZW5jb2RlZXh0LCAvKiBTSU9DR0lXRU5DT0RFRVhUICBnZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsIC8qIFNJT0NTSVdQTUtTQQlQTUtTQSBjYWNoZSBvcGVyYXRpb24gKi8KLSNlbmRpZgogfTsKIAogc3RydWN0IGl3X2hhbmRsZXJfZGVmIHA4MDIxMXdleHRfaGFuZGxlcl9kZWYgPSB7Ci0JLm51bV9zdGFuZGFyZCA9IHNpemVvZihwODAyMTF3ZXh0X2hhbmRsZXJzKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3N0YW5kYXJkID0gQVJSQVlfU0laRShwODAyMTF3ZXh0X2hhbmRsZXJzKSwKIAkubnVtX3ByaXZhdGUgPSAwLAogCS5udW1fcHJpdmF0ZV9hcmdzID0gMCwKICAgICAgICAgLnN0YW5kYXJkID0gcDgwMjExd2V4dF9oYW5kbGVycywKIAkucHJpdmF0ZSA9IE5VTEwsCiAJLnByaXZhdGVfYXJncyA9IE5VTEwsCi0jaWYgV0lSRUxFU1NfRVhUID4gMTYKIAkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMKLSNlbmRpZgogfTsKIAotI2VuZGlmCi0KLS8qIHdpcmVsZXNzIGV4dGVuc2lvbnMnIGlvY3RscyAqLwotaW50IHA4MDIxMXdleHRfc3VwcG9ydF9pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKLXsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7Ci0KLSNpZiBXSVJFTEVTU19FWFQgPCAxMwotCXN0cnVjdCBpd3JlcSAqaXdyID0gKHN0cnVjdCBpd3JlcSopaWZyOwotI2VuZGlmCi0KLQlwODAyMTFpdGVtX3VpbnQzMl90ICAgICAgICAgICAgIG1pYml0ZW07Ci0JaW50IGVyciA9IDA7Ci0KLQlEQkZFTlRFUjsKLQotCW1pYml0ZW0uc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JaWYgKCB3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HICkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JV0xBTl9MT0dfREVCVUcoMSwgIlJlY2VpdmVkIHdpcmVsZXNzIGV4dGVuc2lvbiBpb2N0bCAjJWQuXG4iLCBjbWQpOwotCi0Jc3dpdGNoIChjbWQpIHsKLSNpZiBXSVJFTEVTU19FWFQgPCAxMwotCWNhc2UgU0lPQ1NJV05BTUU6ICAvKiB1bnVzZWQgICovCi0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV05BTUU6IC8qIGdldCBuYW1lID09IHdpcmVsZXNzIHByb3RvY29sICovCi0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXduYW1lKGRldiwgTlVMTCwgKGNoYXIgKikgJml3ci0+dSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ1NJV05XSUQ6Ci0JY2FzZSBTSU9DR0lXTldJRDoKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DU0lXRlJFUTogLyogc2V0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X3Npd2ZyZXEoZGV2LCBOVUxMLCAmKGl3ci0+dS5mcmVxKSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV0ZSRVE6IC8qIGdldCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXdmcmVxKGRldiwgTlVMTCwgJihpd3ItPnUuZnJlcSksIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NTSVdSQU5HRToKLQljYXNlIFNJT0NTSVdQUklWOgotCWNhc2UgU0lPQ1NJV0FQOiAvKiBzZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKEJTU0lEKSAqLwotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV0FQOgkvKiBnZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKEJTU0lEKSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3YXAoZGV2LCBOVUxMLCAmKGl3ci0+dS5hcF9hZGRyKSwgTlVMTCk7Ci0JCWJyZWFrOwotCi0jaWYgV0lSRUxFU1NfRVhUID4gOAotCWNhc2UgU0lPQ1NJV01PREU6IC8qIHNldCBvcGVyYXRpb24gbW9kZSAqLwotCWNhc2UgU0lPQ1NJV0VTU0lEOiAvKiBzZXQgU1NJRCAobmV0d29yayBuYW1lKSAqLwotCWNhc2UgU0lPQ1NJV1JBVEU6IC8qIHNldCBkZWZhdWx0IGJpdCByYXRlIChicHMpICovCi0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXTU9ERTogLyogZ2V0IG9wZXJhdGlvbiBtb2RlICovCi0JCWVyciA9IHA4MDIxMXdleHRfZ2l3bW9kZShkZXYsIE5VTEwsICZpd3ItPnUubW9kZSwgTlVMTCk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXTklDS046IC8qIGdldCBub2RlIG5hbWUvbmlja25hbWUgKi8KLQljYXNlIFNJT0NHSVdFU1NJRDogLyogZ2V0IFNTSUQgKi8KLQkJaWYoaXdyLT51LmVzc2lkLnBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKLQkJCW1lbXNldChzc2lkLCAwLCBzaXplb2Yoc3NpZCkpOwotCi0JCQllcnIgPSBwODAyMTF3ZXh0X2dpd2Vzc2lkKGRldiwgTlVMTCwgJml3ci0+dS5lc3NpZCwgc3NpZCk7Ci0JCQlpZihjb3B5X3RvX3VzZXIoaXdyLT51LmVzc2lkLnBvaW50ZXIsIHNzaWQsIHNpemVvZihzc2lkKSkpCi0JCQkJZXJyID0gKC1FRkFVTFQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1JBVEU6Ci0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXdyYXRlKGRldiwgTlVMTCwgJml3ci0+dS5iaXRyYXRlLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXUlRTOgotCQllcnIgPSBwODAyMTF3ZXh0X2dpd3J0cyhkZXYsIE5VTEwsICZpd3ItPnUucnRzLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXRlJBRzoKLQkJZXJyID0gcDgwMjExd2V4dF9naXdmcmFnKGRldiwgTlVMTCwgJml3ci0+dS5ydHMsIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdFTkNPREU6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCWVyciA9IC1FUEVSTTsKLQkJZWxzZSBpZiAoaXdyLT51LmVuY29kaW5nLnBvaW50ZXIpIHsKLQkJCWNoYXIga2V5YnVmW01BWF9LRVlMRU5dOwotCQkJZXJyID0gcDgwMjExd2V4dF9naXdlbmNvZGUoZGV2LCBOVUxMLAotCQkJCQkJICAgICAmaXdyLT51LmVuY29kaW5nLCBrZXlidWYpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihpd3ItPnUuZW5jb2RpbmcucG9pbnRlciwga2V5YnVmLAotCQkJCQkgaXdyLT51LmVuY29kaW5nLmxlbmd0aCkpCi0JCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNJT0NHSVdBUExJU1Q6Ci0JY2FzZSBTSU9DU0lXUlRTOgotCWNhc2UgU0lPQ1NJV0ZSQUc6Ci0JY2FzZSBTSU9DU0lXU0VOUzoKLQljYXNlIFNJT0NHSVdTRU5TOgotCWNhc2UgU0lPQ1NJV05JQ0tOOiAvKiBzZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCi0JY2FzZSBTSU9DU0lXRU5DT0RFOiAvKiBzZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCi0JY2FzZSBTSU9DU0lXU1BZOgotCWNhc2UgU0lPQ0dJV1NQWToKLQljYXNlIFNJT0NTSVdQT1dFUjoKLQljYXNlIFNJT0NHSVdQT1dFUjoKLQljYXNlIFNJT0NHSVdQUklWOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSQU5HRToKLQkJaWYoaXdyLT51LmRhdGEucG9pbnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmFuZ2UgcmFuZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd3JhbmdlKGRldiwgTlVMTCwgJml3ci0+dS5kYXRhLAotCQkJCQkJICAoY2hhciAqKSAmcmFuZ2UpOwotCQkJLyogUHVzaCB0aGF0IHVwIHRvIHRoZSBjYWxsZXIgKi8KLQkJCWlmIChjb3B5X3RvX3VzZXIoaXdyLT51LmRhdGEucG9pbnRlciwgJnJhbmdlLCBzaXplb2YocmFuZ2UpKSkKLQkJCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLSNpZiBXSVJFTEVTU19FWFQgPiA5Ci0JY2FzZSBTSU9DU0lXVFhQT1c6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1RYUE9XOgotCQllcnIgPSBwODAyMTF3ZXh0X2dpd3R4cG93KGRldiwgTlVMTCwgJml3ci0+dS50eHBvd2VyLCBOVUxMKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOSAqLwotI2lmIFdJUkVMRVNTX0VYVCA+IDEwCi0JY2FzZSBTSU9DU0lXUkVUUlk6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1JFVFJZOgotCQllcnIgPSBwODAyMTF3ZXh0X2dpd3JldHJ5KGRldiwgTlVMTCwgJml3ci0+dS5yZXRyeSwgTlVMTCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCi0KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KLQotCWRlZmF1bHQ6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCX0KLQotIGV4aXQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gKGVycik7Ci19CiAKIGludCBwODAyMTF3ZXh0X2V2ZW50X2Fzc29jaWF0ZWQod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQgYXNzb2MpCiB7CkBAIC0yMDE5LDcgKzE4MDIsNiBAQAogCiAgICAgICAgIERCRkVOVEVSOwogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTMKICAgICAgICAgLyogU2VuZCB0aGUgYXNzb2NpYXRpb24gc3RhdGUgZmlyc3QgKi8KICAgICAgICAgZGF0YS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKICAgICAgICAgaWYgKGFzc29jKSB7CkBAIC0yMDM0LDE1ICsxODE2LDEyIEBACiAgICAgICAgIGlmICghYXNzb2MpIGdvdG8gZG9uZTsKIAogICAgICAgICAvLyBYWFggc2VuZCBhc3NvY2lhdGlvbiBkYXRhLCBsaWtlIElFcywgZXRjIGV0Yy4KLSNlbmRpZgorCiAgZG9uZToKICAgICAgICAgREJGRVhJVDsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKIAotI2VuZGlmIC8qIGNvbXBhdGliaWxpdHkgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotCi0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9jcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NlNTY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9jcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NyArMCwwIEBACi0jZGVmaW5lIFdMQU5fSE9TVElGIFdMQU5fUENNQ0lBCi0jaW5jbHVkZSAiaGZhMzg0eC5jIgotI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKLSNpbmNsdWRlICJwcmlzbTJtaWIuYyIKLSNpbmNsdWRlICJwcmlzbTJzdGEuYyIKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIxKSApCi0jaWYgKFdMQU5fQ1BVX0ZBTUlMWSA9PSBXTEFOX0l4ODYpCi0jaWZuZGVmIENPTkZJR19JU0EKLSN3YXJuaW5nICJZb3UgbWF5IG5lZWQgdG8gZW5hYmxlIElTQSBzdXBwb3J0IGluIHlvdXIga2VybmVsLiIKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLXN0YXRpYyB1X2ludAlpcnFfbWFzayA9IDB4ZGViODsJCS8qIEludGVycnVwdCBtYXNrICovCi1zdGF0aWMgaW50CWlycV9saXN0WzRdID0geyAtMSB9OwkJLyogSW50ZXJydXB0IGxpc3QgKi8KLSNlbmRpZgotc3RhdGljIHVfaW50CXByaXNtMl9pZ25vcmV2Y2M9MTsJCS8qIEJvb2xlYW4sIGlmIHNldCwgd2UKLQkJCQkJCSAqIGlnbm9yZSB3aGF0IHRoZSBWY2MKLQkJCQkJCSAqIGlzIHNldCB0byBhbmQgd2hhdCB0aGUgQ0lTCi0JCQkJCQkgKiBzYXlzLgotCQkJCQkJICovCi1tb2R1bGVfcGFyYW0oIHByaXNtMl9pZ25vcmV2Y2MsIGludCwgMDY0NCk7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVSU0lPTigyLDYsOSkpCi1zdGF0aWMgaW50IG51bWxpc3QgPSA0OwotbW9kdWxlX3BhcmFtX2FycmF5KGlycV9saXN0LCBpbnQsIG51bWxpc3QsIDA0NDQpOwotI2Vsc2UKLW1vZHVsZV9wYXJhbV9hcnJheShpcnFfbGlzdCwgaW50LCBOVUxMLCAwNDQ0KTsKLSNlbmRpZgotbW9kdWxlX3BhcmFtKCBpcnFfbWFzaywgaW50LCAwNjQ0KTsKLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQotc3RhdGljIGludCBwcmlzbTJfY3Nfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldik7Ci1zdGF0aWMgaW50IHByaXNtMl9jc19yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIHZvaWQgcHJpc20yX2NzX3JlbW92ZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldik7Ci1zdGF0aWMgaW50IHByaXNtMl9jc19wcm9iZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldik7Ci0jZWxzZQotZGV2X2xpbmtfdAkqcHJpc20yc3RhX2F0dGFjaCh2b2lkKTsKLXN0YXRpYyB2b2lkCXByaXNtMnN0YV9kZXRhY2goZGV2X2xpbmtfdCAqbGluayk7Ci1zdGF0aWMgdm9pZAlwcmlzbTJzdGFfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOwotc3RhdGljIHZvaWQJcHJpc20yc3RhX3JlbGVhc2UodV9sb25nIGFyZyk7Ci1zdGF0aWMgaW50IAlwcmlzbTJzdGFfZXZlbnQgKGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKLQotc3RhdGljIGRldl9saW5rX3QJKmRldl9saXN0ID0gTlVMTDsJLyogaGVhZCBvZiBpbnN0YW5jZSBsaXN0ICovCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGNzX2Vycm9yCi0qCi0qIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgY2FyZCBzZXJ2aWNlcyBlcnJvciBtZXNzYWdlcy4KLSoKLSogQXJndW1lbnRzOgotKgloYW5kbGUJY2xpZW50IGhhbmRsZSBpZGVudGlmeWluZyB0aGlzIENTIGNsaWVudAotKglmdW5jCUNTIGZ1bmN0aW9uIG51bWJlciB0aGF0IGdlbmVyYXRlZCB0aGUgZXJyb3IKLSoJcmV0CUNTIGZ1bmN0aW9uIHJldHVybiBjb2RlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBjc19lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpbnQgZnVuYywgaW50IHJldCkKLXsKLSNpZiAoZGVmaW5lZChDU19SRUxFQVNFX0NPREUpICYmIChDU19SRUxFQVNFX0NPREUgPCAweDI5MTEpKQotCUNhcmRTZXJ2aWNlcyhSZXBvcnRFcnJvciwgZGV2X2luZm8sICh2b2lkICopZnVuYywgKHZvaWQgKilyZXQpOwotI2Vsc2UKLQllcnJvcl9pbmZvX3QgZXJyID0geyBmdW5jLCByZXQgfTsKLQlwY21jaWFfcmVwb3J0X2Vycm9yKGhhbmRsZSwgJmVycik7Ci0jZW5kaWYKLX0KLSNlbHNlIC8vIGtlcm5lbF92ZXJzaW9uCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTIpCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgcHJpc20yX2NzX2lkc1tdID0gewotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJTlRFUlNJTCIsICAiSEZBMzg0eC9JRUVFIiwgMHg3NGM1ZTQwZCwgMHhkYjQ3MmExOCksIC8vIEludGVyc2lsIFBSSVNNMiBSZWZlcmVuY2UgRGVzaWduIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzOCwgMHgwMDAyKSwgLy8gQ29tcGFxIFdMMTAwLzIwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyOGEsIDB4MDAwMiksIC8vIENvbXBhcSBpUGFxIEhOVy0xMDAgMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjUwLCAweDAwMDIpLCAvLyBTYW1zdW5nIFNXTDIwMDAtTiAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwMiksIC8vIFotQ29tIFhJMzAwIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJab29tQWlyIDExTWJwcyBIaWdoIiwgICJSYXRlIHdpcmVsZXNzIE5ldHdvcmtpbmciLCAweDI3M2ZlM2RiLCAweDMyYTFlYWVlKSwgLy8gWm9vbUFpciA0MTAwIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiSW5zdGFudCBXaXJlbGVzcyAiLCAgIiBOZXR3b3JrIFBDIENBUkQiLCAgIlZlcnNpb24gMDEuMDIiLCAweDExZDkwMWFmLCAweDZlOWJkOTI2LCAweDRiNzRiYWEwKSwgLy8gTGlua3N5cyBXUEMxMSAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkFkZHRyb24iLCAgIkFXUC0xMDAgV2lyZWxlc3MgUENNQ0lBIiwgICJWZXJzaW9uIDAxLjAyIiwgMHhlNmVjNTJjZSwgMHg4NjQ5YWYyLCAweDRiNzRiYWEwKSwgLy8gQWRkdHJvbiBBV1AtMTAwIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiRCIsICAiTGluayBEV0wtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAweDcxYjE4NTg5LCAweGI2ZjFiMGFiLCAweDRiNzRiYWEwKSwgLy8gRC1MaW5rIERXTC02NTAgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJTTUMiLCAgIlNNQzI2MzJXIiwgICJWZXJzaW9uIDAxLjAyIiwgMHhjNGY4YjE4YiwgMHg0NzRhMWYyYSwgMHg0Yjc0YmFhMCksIC8vIFNNQyAyNjMyVyAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJJbnRlcnNpbCIsICAiUFJJU00gMl81IFBDTUNJQSBBREFQVEVSIiwgICJJU0wzNzMwMFAiLCAgIkV2YWwtUmV2QSIsIDB4NGI4MDFhMTcsIDB4NjM0NWEwYmYsIDB4YzkwNDlhMzksIDB4YzIzYWRjMGUpLCAvLyBCcm9NYXggRnJlZXBvcnQgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAyLjUpCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJVLlMuIFJvYm90aWNzIiwgICJJRUVFIDgwMi4xMWIgUEMtQ0FSRCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4YzdiOGRmOWQsIDB4MTcwMGQwODcsIDB4NGI3NGJhYTApLCAvLyBVLlMuIFJvYm90aWNzIElFRUUgODAyLjExYiBQQy1DQVJECi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRpZ2l0YWwgRGF0YSBDb21tdW5pY2F0aW9ucyIsICAiV1BDLTAxMDAiLCAweGZkZDczNDcwLCAweGUwYjZmMTQ2KSwgLy8gTGV2ZWwtT25lIFdQQy0wMTAwCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDE2MTIpLCAvLyBCcm9tYXggT0VNIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMi41KQotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI3NCwgMHgxNjEzKSwgLy8gQnJvbWF4IE9FTSAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDMpCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgICJXaXJlbGVzcyBMQU4gUENDLTExIiwgMHg1MjYxNDQwZiwgMHhhNjQwNTU4NCksIC8vIGNvcmVnYSBLLksuIFdpcmVsZXNzIExBTiBQQ0MtMTEKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAgIldpcmVsZXNzIExBTiBQQ0NBLTExIiwgMHg1MjYxNDQwZiwgMHhkZjYxMTVmOSksIC8vIGNvcmVnYSBLLksuIFdpcmVsZXNzIExBTiBQQ0NBLTExCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhjMDAxLCAweDAwMDgpLCAvLyBDT05URUMgRkxFWFNDQU4vRlgtRERTMTEwLVBDQwotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQTEFORVgiLCAgIkdlb1dhdmUvR1ctTlMxMTAiLCAweDIwOWY0MGFiLCAweDQ2MjYzMTc4KSwgLy8gUExBTkVYIEdlb1dhdmUvR1ctTlMxMTAKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk9FTSIsICAiUFJJU00yIElFRUUgODAyLjExIFBDLUNhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAweGZlYTU0YzkwLCAweDQ4ZjJiZGQ2LCAweDRiNzRiYWEwKSwgLy8gQW1iaWNvbSBXTDExMDAgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJMZUFydGVyeSIsICAiU1lOQ0JZQUlSIDExTWJwcyBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsIDB4N2UzYjMyNmEsIDB4NDk4OTNlOTIsIDB4NGI3NGJhYTApLCAvLyBMZUFydGVyeSBTWU5DQllBSVIgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi1QQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxZmYsIDB4MDAwOCksIC8vIEludGVybWVjIE1vYmlsZUxBTiAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk5FVEdFQVIgTUE0MDEgV2lyZWxlc3MgUEMiLCAgIkNhcmQiLCAgIlZlcnNpb24gMDEuMDAiLCAweGEzNzQzNGU5LCAweDk3NjJlOGYxLCAweGE1N2FkYjhjKSwgLy8gTkVUR0VBUiBNQTQwMSAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkludGVyc2lsIiwgICJQUklTTSBGcmVlZG9tIFBDTUNJQSBBZGFwdGVyIiwgICJJU0wzNzEwMFAiLCAgIkV2YWwtUmV2QSIsIDB4NGI4MDFhMTcsIDB4ZjIyMmVjMmQsIDB4NjMwZDUyYjIsIDB4YzIzYWRjMGUpLCAvLyBJbnRlcnNpbCBQUklTTSBGcmVlZG9tIDExbWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJPVEMiLCAgIldpcmVsZXNzIEFpckVaWSAyNDExLVBDQyBXTEFOIENhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAweDRhYzQ0Mjg3LCAweDIzNWE2YmVkLCAweDRiNzRiYWEwKSwgLy8gT1RDIFdpcmVsZXNzIEFpckVaWSAyNDExLVBDQyAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIjgwMi4xMSIsICAiMTFNYnBzIFdpcmVsZXNzIExBTiBDYXJkIiwgICJ2MDhDMSIsICAiIiAgICwgMHhiNjdhNjEwZSwgMHg2NTVhYTdiNywgMHgyNjRiNDUxYSwgMHgwKSwgLy8gRHluYWxpbmsgTDExSERUIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhjMjUwLCAweDAwMDIpLCAvLyBEeW5hbGluayBMMTFIRFQgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUFJPWElNIiwgICJSYW5nZUxBTi1EUy9MQU4gUEMgQ0FSRCIsIDB4YzY1MzZhNWUsIDB4M2YzNTc5N2QpLCAvLyBQUk9YSU0gUmFuZ2VMQU4tRFMvTEFOIFBDIENBUkQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJBQ1RJT05URUMiLCAgIlBSSVNNIFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgICIwMzgxIiwgICJSZXZBIiwgMHgzOTMwODlkYSwgMHhhNzFlNjlkNSwgMHg5MDQ3MWZhOSwgMHg1N2E2NjE5NCksIC8vIEFDVElPTlRFQyBQUklTTSBXaXJlbGVzcyBMQU4gUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MTY2OCwgMHgwMTAxKSwgLy8gQUNUSU9OVEVDIFBSSVNNIFdpcmVsZXNzIExBTiBQQyBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIjNDb20iLCAgIjNDUldFNzM3QSBBaXJDb25uZWN0IFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgMHg0MTI0MGU1YiwgMHg1NjAxMGFmMyksIC8vIDNDb20gQWlyQ29ubmVjdCAzQ1JXRTczN0EKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiM0NvbSIsICAiM0NSV0U3NzdBIEFpckNvbm5lY3QgV2lyZWxlc3MgTEFOIFBDSSBDYXJkIiAgLCAweDQxMjQwZTViLCAweGFmYzdjMzNlKSwgLy8gM0NvbSBBaXJDb25uZWN0IDNDUldFNzc3QQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBU1VTIiwgICI4MDJfMTFiX1BDX0NBUkRfMjUiLCAweDc4ZmMwNmVlLCAweGRiOWFhODQyKSwgLy8gQVNVUyBXTC0xMDAgODAyLjExYiBXTEFOICBQQyBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFTVVMiLCAgIjgwMl8xMUJfQ0ZfQ0FSRF8yNSIsIDB4NzhmYzA2ZWUsIDB4NDVhNTBjMWUpLCAvLyBBU1VTIFdMLTExMCA4MDIuMTFiIFdMQU4gQ0YgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCVUZGQUxPIiwgICJXTEktQ0YtUzExRyIsIDB4MmRlY2VjZTMsIDB4ODIwNjdjMTgpLCAvLyBCVUZGQUxPIFdMSS1DRi1TMTFHIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiVGhlIExpbmtzeXMgR3JvdXAsIEluYy4iLCAiV2lyZWxlc3MgTmV0d29yayBDRiBDYXJkIiwgIklTTDM3MzAwUCIsICJSZXZBIiwgMHhhNWY0NzJjMiwgMHg5YzA1NTk4ZCwgMHhjOTA0OWEzOSwgMHg1N2E2NjE5NCksIC8vIExpbmtzeXMgV0NGMTEgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAyLjUpCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiTGlua3N5cyIsICAiV2lyZWxlc3MgQ29tcGFjdEZsYXNoIENhcmQiLCAgIiIsICAiIiwgMHg3MzNjYzgxLCAweGM1MmYzOTUsIDB4MCwgMHgwKSwgLy8gTGlua3N5cyBXQ0YxMiAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDMpCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjhhLCAweDA2NzMpLCAvLyBMaW5rc3lzIFdDRjEyIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMykKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJORVRHRUFSIE1BNDAxUkEgV2lyZWxlc3MgUEMiLCAgIkNhcmQiLCAgIklTTDM3MzAwUCIsICAiRXZhbC1SZXZBIiwgMHgzMDY0NjdmLCAweDk3NjJlOGYxLCAweGM5MDQ5YTM5LCAweGMyM2FkYzBlKSwgLy8gTkVUR0VBUiBNQTQwMVJBIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDUpLCAvLyBELUxpbmsgRENGLTY2MFcgIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDJkMiwgMHgwMDAxKSwgLy8gTWljcm9zb2Z0IFdpcmVsZXNzIE5vdGVib29rIEFkYXB0ZXIgTU4tNTIwCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDg5LCAweDAwMDIpLCAvLyBBbnlQb2ludChUTSkgV2lyZWxlc3MgSUkgUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkQiLCAgIkxpbmsgRFJDLTY1MCAxMU1icHMgV0xBTiBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgICIiICwgMHg3MWIxODU4OSwgMHhmMTQ0ZTNhYywgMHg0Yjc0YmFhMCwgMHgwKSwgLy8gRC1MaW5rIERSQy02NTAgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDkwMDUsIDB4MDAyMSksIC8vIEFkYXB0ZWMgQVdOLTgwMzAKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwMGIsIDB4NzExMCksIC8vIEQtTGluayBEV0wtNjUwIHJldiBQIDgwMi4xMWIgV0xBTiBjYXJkCi0JLy8gUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiRC1MaW5rIiwgICJEV0wtNjUwIFdpcmVsZXNzIFBDIENhcmQgUmV2UCIsICAiSVNMMzcxMDFQLTEwIiwgICJBMyIsIDB4MWE0MjRhMWMsIDB4NmVhNTc2MzIsIDB4ZGQ5N2EyNmIsIDB4NTZiMjFmNTIpLCAvLyBELUxpbmsgRFdMLTY1MCByZXYgUCA4MDIuMTFiIFdMQU4gY2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiSU5URVJTSUwiLCAgICJJLUdBVEUgMTFNIFBDIENhcmQgLyBQQyBDYXJkIHBsdXMiLCAgIlZlcnNpb24gMDEuMDIiLCAweDc0YzVlNDBkLCAweDgzMDRmZjc3LCAweDRiNzRiYWEwKSwgLy8gSS1HYXRlIDExTSBQQyBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiQkVOUSIsICAiQVdMMTAwIFBDTUNJQSBBREFQVEVSIiwgICJJU0wzNzMwMFAiLCAgIkV2YWwtUmV2QSIsIDB4MzVkYWRjNzQsIDB4MWY3ZmVkYiwgMHhjOTA0OWEzOSwgMHhjMjNhZGMwZSksIC8vIGJlblEgQVdMMTAwIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDczMDApLCAvLyBiZW5RIEFXTDEwMCA4MDIuMTFiIFdMQU4gQ2FyZAotCS8vIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIklOVEVSU0lMIiwgMHg3NGM1ZTQwZCksIC8vIEludGVyc2lsIFByaXNtIDIgY2FyZAotCS8vIFBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwgLy8gSW50ZXJzaWwgUHJpc20gMiBjYXJkCi0KLQlQQ01DSUFfREVWSUNFX05VTEwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBwcmlzbTJfY3NfaWRzKTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcHJpc20yX2NzX2RyaXZlciA9IHsKLQkuZHJ2ID0gewotCQkubmFtZSA9ICJwcmlzbTJfY3MiLAotCX0sCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQotCS5zdXNwZW5kID0gcHJpc20yX2NzX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHByaXNtMl9jc19yZXN1bWUsCi0JLnJlbW92ZSA9IHByaXNtMl9jc19yZW1vdmUsCi0JLnByb2JlID0gcHJpc20yX2NzX3Byb2JlLAotCS5pZF90YWJsZSA9IHByaXNtMl9jc19pZHMsCi0jZWxzZQotCS5hdHRhY2ggPSBwcmlzbTJzdGFfYXR0YWNoLAotCS5kZXRhY2ggPSBwcmlzbTJzdGFfZGV0YWNoLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikKLQkuaWRfdGFibGUgPSBwcmlzbTJfY3NfaWRzLAotCS5ldmVudCA9ICBwcmlzbTJzdGFfZXZlbnQsCi0jZW5kaWYgLy8gPiAyLjYuMTIKLSNlbmRpZiAvLyA8PSAyLjYuMTUKLX07Ci0jZW5kaWYgLyoga2VybmVsX3ZlcnNpb24gKi8KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKLSNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAotZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDRkdfQ0hFQ0soZm4sIHJldGYpIFwKLWRvIHsgaW50IHJldCA9IChyZXRmKTsgXAotaWYgKHJldCAhPSAwKSB7IFwKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwgIkNhcmRTZXJ2aWNlcygiICNmbiAiKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsgXAotICAgICAgICBjc19lcnJvcihwZGV2LCBmbiwgcmV0KTsgXAotICAgICAgICBnb3RvIG5leHRfZW50cnk7IFwKLX0gXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIHZvaWQgcHJpc20yX2NzX3JlbW92ZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd2xhbmRldmljZSAgKndsYW5kZXY7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTcpCi0gICAgICAgIGRldl9saW5rX3QgKmxpbmsgPSBkZXZfdG9faW5zdGFuY2UocGRldik7Ci0jZW5kaWYKLQotCURCRkVOVEVSOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXdsYW5kZXYgPSBwZGV2LT5wcml2OwotI2Vsc2UKLQl3bGFuZGV2ID0gbGluay0+cHJpdjsKLSNlbmRpZgotCi0JaWYgKHdsYW5kZXYpIHsKLQkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0JCWlmICh3bGFuZGV2LT5wcml2KSB7Ci0JCQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQkJCXdsYW5kZXYtPnByaXYgPSBOVUxMOwotCQkJaWYgKGh3KSB7Ci0JCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCQlrZnJlZShodyk7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUod2xhbmRldik7Ci0JfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXBkZXYtPnByaXYgPSBOVUxMOwotICAgICAgICBwY21jaWFfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0jZWxzZQotICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JICAgICAgICBpZiAobGluay0+d2luKQotCQkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7Ci0JCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLQkJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKLQkJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKLQkJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKLQkJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOwotCi0JCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOwotCX0KLQotCWxpbmstPnByaXYgPSBOVUxMOwotCWtmcmVlKGxpbmspOwotI2VuZGlmCi0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBwcmlzbTJfY3Nfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd2xhbmRldmljZSAgKndsYW5kZXY7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTcpCi0gICAgICAgIGRldl9saW5rX3QgKmxpbmsgPSBkZXZfdG9faW5zdGFuY2UocGRldik7Ci0jZW5kaWYKLQotCURCRkVOVEVSOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXdsYW5kZXYgPSBwZGV2LT5wcml2OwotCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLSNlbHNlCi0Jd2xhbmRldiA9IGxpbmstPnByaXY7Ci0KLSAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7Ci0gICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7Ci0JfQotI2VuZGlmCi0KLQlEQkZFWElUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yX2NzX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd2xhbmRldmljZSAgKndsYW5kZXY7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTcpCi0gICAgICAgIGRldl9saW5rX3QgKmxpbmsgPSBkZXZfdG9faW5zdGFuY2UocGRldik7Ci0jZW5kaWYKLQotCURCRkVOVEVSOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXdsYW5kZXYgPSBwZGV2LT5wcml2OwotCS8vIFhYWCBkbyBzb21ldGhpbmcgaGVyZT8KLSNlbHNlCi0Jd2xhbmRldiA9IGxpbmstPnByaXY7Ci0gICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKLSAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotICAgICAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7Ci0JCS8vIFhYWCBkbyBzb21ldGhpbmcgaGVyZT8KLQl9Ci0jZW5kaWYKLQotCi0JREJGRVhJVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByaXNtMl9jc19wcm9iZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldikKLXsKLQlpbnQgcnZhbCA9IDA7Ci0Jc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdCAqaHcgPSBOVUxMOwotCi0gICAgICAgIGNvbmZpZ19pbmZvX3Qgc29ja2V0Y29uZjsKLSAgICAgICAgY2lzcGFyc2VfdCAqcGFyc2UgPSBOVUxMOwotCXR1cGxlX3QgdHVwbGU7Ci0JdWludDhfdAlidWZbNjRdOwotICAgICAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7Ci0gICAgICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotCWRldl9saW5rX3QgKmxpbms7Ci0jZW5kaWYKLQotCURCRkVOVEVSOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCS8qIFNldCB1cCBpbnRlcnJ1cHQgdHlwZSAqLwotICAgICAgICBwZGV2LT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKLSNlbHNlCi0gICAgICAgIGxpbmsgPSBrbWFsbG9jKHNpemVvZihkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmIChsaW5rID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIG1lbXNldChsaW5rLCAwLCBzaXplb2YoZGV2X2xpbmtfdCkpOwotCi0gICAgICAgIGxpbmstPmNvbmYuVmNjID0gMzM7Ci0gICAgICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwotCi0gICAgICAgIGxpbmstPmhhbmRsZSA9IHBkZXY7Ci0gICAgICAgIHBkZXYtPmluc3RhbmNlID0gbGluazsKLSAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7Ci0KLSNlbmRpZgotCi0JLy8gVkNDIGNyYXA/Ci0gICAgICAgIHBhcnNlID0ga21hbGxvYyhzaXplb2YoY2lzcGFyc2VfdCksIEdGUF9LRVJORUwpOwotCi0Jd2xhbmRldiA9IGNyZWF0ZV93bGFuKCk7Ci0JaWYgKCF3bGFuZGV2IHx8ICFwYXJzZSkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBkZXZfaW5mbyk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcnZhbCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IHN0cnVjdCBmb3Igbm93ICovCi0JaGZhMzg0eF9jcmVhdGUoaHcsIDAsIDAsIE5VTEwpOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlody0+cGRldiA9IHBkZXY7Ci0JcGRldi0+cHJpdiA9IHdsYW5kZXY7Ci0jZWxzZQotCWh3LT5saW5rID0gbGluazsKLQlsaW5rLT5wcml2ID0gd2xhbmRldjsKLSNlbmRpZgotCi0gICAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgICAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotICAgICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocGRldiwgJnR1cGxlKSk7Ci0gICAgICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUocGRldiwgJnR1cGxlLCBwYXJzZSkpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLSAgICAgICAgcGRldi0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotICAgICAgICBwZGV2LT5jb25mLlByZXNlbnQgPSBwYXJzZS0+Y29uZmlnLnJtYXNrWzBdOwotI2Vsc2UKLSAgICAgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotICAgICAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS0+Y29uZmlnLnJtYXNrWzBdOwotCi0JbGluay0+Y29uZi5WY2MgPSBzb2NrZXRjb25mLlZjYzsKLSNlbmRpZgotICAgICAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKLSAgICAgICAgICAgICAgICAgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8ocGRldiwgJnNvY2tldGNvbmYpKTsKLQotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUocGRldiwgJnR1cGxlKSk7Ci0gICAgICAgIGZvciAoOzspIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS0+Y2Z0YWJsZV9lbnRyeSk7Ci0gICAgICAgICAgICAgICAgQ0ZHX0NIRUNLKEdldFR1cGxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwZGV2LCAmdHVwbGUpKTsKLSAgICAgICAgICAgICAgICBDRkdfQ0hFQ0soUGFyc2VUdXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbWNpYV9wYXJzZV90dXBsZShwZGV2LCAmdHVwbGUsIHBhcnNlKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZmx0ID0gKmNmZzsKLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT5pbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X2VudHJ5OwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLSAgICAgICAgICAgICAgICBwZGV2LT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLwotICAgICAgICAgICAgICAgIGlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYtPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCi0gICAgICAgICAgICAgICAgLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCi0gICAgICAgICAgICAgICAgaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2NrZXRjb25mLlZjYyAhPSBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwICYmICFwcmlzbTJfaWdub3JldmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICIgIFZjYyBtaXNtYXRjaCAtIHNraXBwaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGlzIGVudHJ5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X2VudHJ5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAgJiYgIXByaXNtMl9pZ25vcmV2Y2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwgIiAgVmNjIChkZWZhdWx0KSBtaXNtYXRjaCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBza2lwcGluZyB0aGlzIGVudHJ5XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0X2VudHJ5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjZmctPnZwcDEucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYtPmNvbmYuVnBwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLlZwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZW5kaWYKLQkJfQotCi0JCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwotCQkvKiBIQUNLOiBkdWUgdG8gYSBiYWQgQ0lTLi4uLndlIEFMV0FZUyBuZWVkIGFuIGludGVycnVwdCAqLwotCQkvKiBpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCQlwZGV2LT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotI2Vsc2UKLQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLSNlbmRpZgotCi0JCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkJcGRldi0+aW8uTnVtUG9ydHMxID0gcGRldi0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCXBkZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJcGRldi0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCXBkZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlwZGV2LT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlpZiAgKCBwZGV2LT5pby5CYXNlUG9ydDEgIT0gMCApIHsKLQkJCQlXTEFOX0xPR19XQVJOSU5HKAotCQkJCSJCcmFpbiBkYW1hZ2VkIENJUzogaGFyZCBjb2RlZCBpb2Jhc2U9IgotCQkJCSIweCV4LCB0cnkgbGV0dGluZyBwY21jaWFfY3MgZGVjaWRlLi4uXG4iLAotCQkJCXBkZXYtPmlvLkJhc2VQb3J0MSApOwotCQkJCXBkZXYtPmlvLkJhc2VQb3J0MSA9IDA7Ci0JCQl9Ci0JCQlwZGV2LT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlwZGV2LT5pby5BdHRyaWJ1dGVzMiA9IHBkZXYtPmlvLkF0dHJpYnV0ZXMxOwotCQkJCXBkZXYtPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlwZGV2LT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJfQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlDRkdfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhwZGV2LCAmcGRldi0+aW8pKTsKLSNlbHNlCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJaWYgICggbGluay0+aW8uQmFzZVBvcnQxICE9IDAgKSB7Ci0JCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiQnJhaW4gZGFtYWdlZCBDSVM6IGhhcmQgY29kZWQgaW9iYXNlPSIKLQkJCQkiMHgleCwgdHJ5IGxldHRpbmcgcGNtY2lhX2NzIGRlY2lkZS4uLlxuIiwKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgKTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSAwOwotCQkJfQotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJQ0ZHX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJmxpbmstPmlvKSk7Ci0jZW5kaWYKLQkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLwotCQlicmVhazsKLQotCW5leHRfZW50cnk6Ci0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCWRmbHQgPSAqY2ZnOwotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShwZGV2LCAmdHVwbGUpKTsKLQotCX0KLQotCS8qIExldCBwY21jaWEga25vdyB0aGUgZGV2aWNlIG5hbWUgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcGRldi0+ZGV2X25vZGUgPSAmaHctPm5vZGU7Ci0jZWxzZQotCWxpbmstPmRldiA9ICZody0+bm9kZTsKLSNlbmRpZgotCi0JLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlIGFuZCBnZXQgYXNzaWduZWQgYSBuYW1lICovCi0JU0VUX01PRFVMRV9PV05FUih3bGFuZGV2LT5uZXRkZXYpOwotCVNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgICZoYW5kbGVfdG9fZGV2KHBkZXYpKTsKLQlpZiAocmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwKSB7Ci0JCVdMQU5fTE9HX05PVElDRSgicHJpc20yc3RhX2NzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCXN0cmNweShody0+bm9kZS5kZXZfbmFtZSwgd2xhbmRldi0+bmFtZSk7Ci0KLQkvKiBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhICovCi0JLyogaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlICovCi0JLyogaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JaWYgKHBkZXYtPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgewotCQlwZGV2LT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7Ci0JCXBkZXYtPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwotCQlwZGV2LT5pcnEuSGFuZGxlciA9IGhmYTM4NHhfaW50ZXJydXB0OwotCQlwZGV2LT5pcnEuSW5zdGFuY2UgPSB3bGFuZGV2OwotCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEocGRldiwgJnBkZXYtPmlycSkpOwotCX0KLSNlbHNlCi0JaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkgewotCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7Ci0JCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwotCQlsaW5rLT5pcnEuSGFuZGxlciA9IGhmYTM4NHhfaW50ZXJydXB0OwotCQlsaW5rLT5pcnEuSW5zdGFuY2UgPSB3bGFuZGV2OwotCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEocGRldiwgJmxpbmstPmlycSkpOwotCX0KLSNlbmRpZgotCi0JLyogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAgKi8KLQkvKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlICovCi0JLyogY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4gKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24ocGRldiwgJnBkZXYtPmNvbmYpKTsKLSNlbHNlCi0JQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24ocGRldiwgJmxpbmstPmNvbmYpKTsKLSNlbmRpZgotCi0JLyogRmlsbCB0aGUgbmV0ZGV2aWNlIHdpdGggdGhpcyBpbmZvICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXdsYW5kZXYtPm5ldGRldi0+aXJxID0gcGRldi0+aXJxLkFzc2lnbmVkSVJROwotCXdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyID0gcGRldi0+aW8uQmFzZVBvcnQxOwotI2Vsc2UKLQl3bGFuZGV2LT5uZXRkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKLQl3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKLSNlbmRpZgotCi0JLyogQW5kIHRoZSByZXN0IG9mIHRoZSBodyBzdHJ1Y3R1cmUgKi8KLQlody0+aXJxID0gd2xhbmRldi0+bmV0ZGV2LT5pcnE7Ci0JaHctPmlvYmFzZSA9IHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7Ci0JbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKLSNlbmRpZgotCi0JLyogQW5kIG5vdyB3ZSdyZSBkb25lISAqLwotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JZ290byBkb25lOwotCi0gY3NfZmFpbGVkOgotICAgICAgICBjc19lcnJvcihwZGV2LCBsYXN0X2ZuLCBsYXN0X3JldCk7Ci0KLWZhaWxlZDoKLQkvLyB3bGFuZGV2LCBodywgZXRjIGV0Yy4uCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXBkZXYtPnByaXYgPSBOVUxMOwotI2Vsc2UKLQlwZGV2LT5pbnN0YW5jZSA9IE5VTEw7Ci0JaWYgKGxpbmspIHsKLQkJbGluay0+cHJpdiA9IE5VTEw7Ci0JCWtmcmVlKGxpbmspOwotCX0KLSNlbmRpZgotCWlmICh3bGFuZGV2KSB7Ci0JCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQkJaWYgKHdsYW5kZXYtPnByaXYpIHsKLQkJCWh3ID0gd2xhbmRldi0+cHJpdjsKLQkJCXdsYW5kZXYtPnByaXYgPSBOVUxMOwotCQkJaWYgKGh3KSB7Ci0JCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCQlrZnJlZShodyk7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUod2xhbmRldik7Ci0JfQotCi1kb25lOgotCWlmIChwYXJzZSkga2ZyZWUocGFyc2UpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcnZhbDsKLX0KLSNlbHNlICAvLyA8PSAyLjYuMTUKLSNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAotZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDRkdfQ0hFQ0soZm4sIHJldGYpIFwKLWRvIHsgaW50IHJldCA9IChyZXRmKTsgXAotaWYgKHJldCAhPSAwKSB7IFwKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwgIkNhcmRTZXJ2aWNlcygiICNmbiAiKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsgXAotICAgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGZuLCByZXQpOyBcCi0gICAgICAgIGdvdG8gbmV4dF9lbnRyeTsgXAotfSBcCi19IHdoaWxlICgwKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX2F0dGFjaAotKgotKiBIYWxmIG9mIHRoZSBhdHRhY2gvZGV0YWNoIHBhaXIuICBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBkZXZpY2UKLSogaW5zdGFuY2Ugd2l0aCBDYXJkIFNlcnZpY2VzLiAgSW4gdGhpcyBjYXNlLCBpdCBhbHNvIGNyZWF0ZXMgdGhlCi0qIHdsYW5kZXYgc3RydWN0dXJlIGFuZCBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuICBUaGVzZSBhcmUKLSogbGlua2VkIHRvIHRoZSBkZXZpY2UgaW5zdGFuY2UgdmlhIGl0cyBwcml2IG1lbWJlci4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCUEgdmFsaWQgcHRyIHRvIGRldl9saW5rX3Qgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkIChpbnNtb2QvaW5pdF9tb2R1bGUvcmVnaXN0ZXJfcGNjYXJkX2RyaXZlcikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZGV2X2xpbmtfdCAqcHJpc20yc3RhX2F0dGFjaCh2b2lkKQotewotCWNsaWVudF9yZWdfdAkJY2xpZW50X3JlZzsKLQlpbnQJCQlyZXN1bHQ7Ci0JZGV2X2xpbmtfdAkJKmxpbmsgPSBOVUxMOwotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdAkJKmh3ID0gTlVMTDsKLQotCURCRkVOVEVSOwotCi0JLyogQWxsb2Mgb3VyIHN0cnVjdHVyZXMgKi8KLQlsaW5rID0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWxpbmsgfHwgKCh3bGFuZGV2ID0gY3JlYXRlX3dsYW4oKSkgPT0gTlVMTCkpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JLyogQ2xlYXIgYWxsIHRoZSBzdHJ1Y3RzICovCi0JbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaHcgc3RydWN0IGZvciBub3cgKi8KLQloZmEzODR4X2NyZWF0ZShodywgMCwgMCwgTlVMTCk7Ci0JaHctPndsYW5kZXYgPSB3bGFuZGV2OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgUEMgY2FyZCBkZXZpY2Ugb2JqZWN0LiAqLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0JaW5pdF90aW1lcigmbGluay0+cmVsZWFzZSk7Ci0JbGluay0+cmVsZWFzZS5mdW5jdGlvbiA9ICZwcmlzbTJzdGFfcmVsZWFzZTsKLQlsaW5rLT5yZWxlYXNlLmRhdGEgPSAodV9sb25nKWxpbms7Ci0jZW5kaWYKLQlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKLQlsaW5rLT5wcml2ID0gd2xhbmRldjsKLSNpZiAoZGVmaW5lZChDU19SRUxFQVNFX0NPREUpICYmIChDU19SRUxFQVNFX0NPREUgPCAweDI5MTEpKQotCWxpbmstPmlycS5JbnN0YW5jZSA9IHdsYW5kZXY7Ci0jZW5kaWYKLQotCS8qIExpbmsgaW4gdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyICovCi0JbGluay0+bmV4dCA9IGRldl9saXN0OwotCWRldl9saXN0ID0gbGluazsKLQotCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLwotCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotCWNsaWVudF9yZWcuQXR0cmlidXRlcyA9IElORk9fSU9fQ0xJRU5UIHwgSU5GT19DQVJEX1NIQVJFOwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSApCi0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwcmlzbTJzdGFfZXZlbnQ7Ci0jZW5kaWYKLQotCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKLQljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwotCi0JcmVzdWx0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJlc3VsdCk7Ci0JCXByaXNtMnN0YV9kZXRhY2gobGluayk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWdvdG8gZG9uZTsKLQotIGZhaWxlZDoKLQlpZiAobGluaykJa2ZyZWUobGluayk7Ci0JaWYgKHdsYW5kZXYpCWtmcmVlKHdsYW5kZXYpOwotCWlmIChodykJCWtmcmVlKGh3KTsKLQlsaW5rID0gTlVMTDsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gbGluazsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX2RldGFjaAotKgotKiBSZW1vdmUgb25lIG9mIHRoZSBkZXZpY2UgaW5zdGFuY2VzIG1hbmFnZWQgYnkgdGhpcyBkcml2ZXIuCi0qICAgU2VhcmNoIHRoZSBsaXN0IGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UsCi0qICAgY2hlY2sgb3VyIGZsYWdzIGZvciBhIHdhaXRpbmcgdGltZXInZCByZWxlYXNlIGNhbGwKLSogICBjYWxsIHJlbGVhc2UKLSogICBEZXJlZ2lzdGVyIHRoZSBpbnN0YW5jZSB3aXRoIENhcmQgU2VydmljZXMKLSogICAobmV0ZGV2aWNlKSB1bnJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZS4KLSogICB1bmxpbmsgdGhlIGluc3RhbmNlIGZyb20gdGhlIGxpc3QKLSogICBmcmVlIHRoZSBsaW5rLCBwcml2LCBhbmQgcHJpdi0+cHJpdiBtZW1vcnkKLSogTm90ZTogdGhlIGRldl9saXN0IHZhcmlhYmxlIGlzIGEgZHJpdmVyIHNjb3BlZCBzdGF0aWMgdXNlZCB0bwotKgltYWludGFpbiBhIGxpc3Qgb2YgZGV2aWNlIGluc3RhbmNlcyBtYW5hZ2VkIGJ5IHRoaXMKLSoJZHJpdmVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWxpbmsJcHRyIHRvIHRoZSBpbnN0YW5jZSB0byBkZXRhY2gKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCXRoZSBsaW5rIHN0cnVjdHVyZSBpcyBnb25lLCB0aGUgbmV0ZGV2aWNlIGlzIGdvbmUKLSoKLSogQ2FsbCBjb250ZXh0OgotKglNaWdodCBiZSBpbnRlcnJ1cHQsIGRvbid0IGJsb2NrLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMnN0YV9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKLXsKLQlkZXZfbGlua190CQkqKmxpbmtwOwotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0JaGZhMzg0eF90CQkqaHc7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIExvY2F0ZSBwcmV2IGRldmljZSBzdHJ1Y3R1cmUgKi8KLQlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KSB7Ci0JCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7Ci0JfQotCi0JaWYgKCpsaW5rcCAhPSBOVUxMKSB7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLQkJdW5zaWduZWQgbG9uZwlmbGFnczsKLQkJLyogR2V0IHJpZCBvZiBhbnkgdGltZXInZCByZWxlYXNlIGNhbGwgKi8KLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotCQlpZiAobGluay0+c3RhdGUgJiBERVZfUkVMRUFTRV9QRU5ESU5HKSB7Ci0JCQlkZWxfdGltZXJfc3luYygmbGluay0+cmVsZWFzZSk7Ci0JCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1JFTEVBU0VfUEVORElORzsKLQkJfQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLSNlbmRpZgotCi0JCS8qIElmIGxpbmsgc2F5cyB3ZSdyZSBzdGlsbCBjb25maWcnZCwgY2FsbCByZWxlYXNlICovCi0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLQkJCXByaXNtMnN0YV9yZWxlYXNlKCh1X2xvbmcpbGluayk7Ci0JCQlpZiAobGluay0+c3RhdGUgJiBERVZfU1RBTEVfQ09ORklHKSB7Ci0JCQkJbGluay0+c3RhdGUgfD0gREVWX1NUQUxFX0xJTks7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLyogVGVsbCBDYXJkIFNlcnZpY2VzIHdlJ3JlIG5vdCBhcm91bmQgYW55IG1vcmUgKi8KLQkJaWYgKGxpbmstPmhhbmRsZSkgewotCQkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7Ci0JCX0KLQotCQkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCi0JCSpsaW5rcCA9IGxpbmstPm5leHQ7Ci0JCWlmICggbGluay0+cHJpdiAhPSBOVUxMICkgewotCQkJd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWxpbmstPnByaXY7Ci0JCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCQkJaWYgKGxpbmstPmRldiAhPSBOVUxMKSB7Ci0JCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQkJfQotCQkJd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCQkJaWYgKHdsYW5kZXYtPnByaXYpIHsKLQkJCQlodyA9IHdsYW5kZXYtPnByaXY7Ci0JCQkJd2xhbmRldi0+cHJpdiA9IE5VTEw7Ci0JCQkJaWYgKGh3KSB7Ci0JCQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQkJCWtmcmVlKGh3KTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaW5rLT5wcml2ID0gTlVMTDsKLQkJCWtmcmVlKHdsYW5kZXYpOwotCQl9Ci0JCWtmcmVlKGxpbmspOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX2NvbmZpZwotKgotKiBIYWxmIG9mIHRoZSBjb25maWcvcmVsZWFzZSBwYWlyLiAgVXN1YWxseSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KLSogYSBjYXJkIGluc2VydGlvbiBldmVudC4gIEF0IHRoaXMgcG9pbnQsIHdlIF9rbm93XyB0aGVyZSdzIHNvbWUKLSogcGh5c2ljYWwgZGV2aWNlIHByZXNlbnQuICBUaGF0IG1lYW5zIHdlIGNhbiBzdGFydCBwb2tpbmcgYXJvdW5kCi0qIGF0IHRoZSBDSVMgYW5kIGF0IGFueSBkZXZpY2Ugc3BlY2lmaWMgY29uZmlnIGRhdGEgd2Ugd2FudC4KLSoKLSogTm90ZSB0aGUgZ290b3MgYW5kIHRoZSBtYWNyb3MuICBJIHJlY29kZWQgdGhpcyBvbmNlIHdpdGhvdXQKLSogdGhlbSwgYW5kIGl0IGdvdCBpbmNyZWRpYmx5IHVnbHkuICBJdCdzIGFjdHVhbGx5IHNpbXBsZXIgd2l0aAotKiB0aGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWxpbmsJdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIGNyZWF0ZWQgaW4gYXR0YWNoIHRoYXQKLSoJCXJlcHJlc2VudHMgdGhpcyBkZXZpY2UgaW5zdGFuY2UuCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglSZXNvdXJjZXMgKGlycSwgaW8sIG1lbSkgYXJlIGFsbG9jYXRlZAotKglUaGUgcGNtY2lhIGRldl9saW5rLT5ub2RlLT5uYW1lIGlzIHNldAotKgkoRm9yIG5ldGNhcmRzKSBUaGUgZGV2aWNlIHN0cnVjdHVyZSBpcyBmaW5pc2hlZCBhbmQsCi0qCSAgbW9zdCBpbXBvcnRhbnRseSwgcmVnaXN0ZXJlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGVyZQotKgkgIGlzIG5vdyBhIF9uYW1lZF8gZGV2aWNlIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZnJvbQotKgkgIHVzZXJsYW5kLgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCU1heSBiZSBjYWxsZWQgZnJvbSBhIHRpbWVyLiAgRG9uJ3QgYmxvY2shCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAotZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDRkdfQ0hFQ0soZm4sIHJldGYpIFwKLWRvIHsgaW50IHJldCA9IChyZXRmKTsgXAotaWYgKHJldCAhPSAwKSB7IFwKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwgIkNhcmRTZXJ2aWNlcygiICNmbiAiKSByZXR1cm5lZCAlZFxuIiwgcmV0KTsgXAotICAgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGZuLCByZXQpOyBcCi0gICAgICAgIGdvdG8gbmV4dF9lbnRyeTsgXAotfSBcCi19IHdoaWxlICgwKQotCi12b2lkIHByaXNtMnN0YV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKLXsKLQljbGllbnRfaGFuZGxlX3QJCWhhbmRsZTsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdCAgICAgICAgICAgICAgICpodzsKLQlpbnQJCQlsYXN0X2ZuOwotCWludAkJCWxhc3RfcmV0OwotCXR1cGxlX3QJCQl0dXBsZTsKLQljaXNwYXJzZV90CQlwYXJzZTsKLQljb25maWdfaW5mb190CQlzb2NrZXRjb25mOwotCVVJTlQ4CQkJYnVmWzY0XTsKLQlpbnQJCQltaW5WY2MgPSAwOwotCWludAkJCW1heFZjYyA9IDA7Ci0JY2lzdHBsX2NmdGFibGVfZW50cnlfdAlkZmx0ID0geyAwIH07Ci0KLQlEQkZFTlRFUjsKLQotCWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopbGluay0+cHJpdjsKLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQkvKiBDb2xsZWN0IHRoZSBjb25maWcgcmVnaXN0ZXIgaW5mbyAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOwotCi0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCi0JLyogQ29uZmlndXJlIGNhcmQgKi8KLQlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOwotCi0JLyogQWNxdWlyZSB0aGUgY3VycmVudCBzb2NrZXQgY29uZmlnIChuZWVkIFZjYyBzZXR0aW5nKSAqLwotCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsICZzb2NrZXRjb25mKSk7Ci0KLQkvKiBMb29wIHRocm91Z2ggdGhlIGNvbmZpZyB0YWJsZSBlbnRyaWVzIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgd29ya3MgKi8KLQkvKiBBc3N1bWVzIGEgY29tcGxldGUgYW5kIHZhbGlkIENJUyAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKLQl3aGlsZSAoMSkgewotCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOwotCQlDRkdfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKLQkJQ0ZHX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7Ci0KLQkJaWYgKGNmZy0+aW5kZXggPT0gMCkgZ290byBuZXh0X2VudHJ5OwotCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKLQotCQkvKiBMZXRzIHByaW50IG91dCB0aGUgVmNjIHRoYXQgdGhlIGNvbnRyb2xsZXIrcGNtY2lhLWNzIHNldAotCQkgKiBmb3IgdXMsIGNhdXNlIHRoYXQncyB3aGF0IHdlJ3JlIGdvaW5nIHRvIHVzZS4KLQkJICovCi0JCVdMQU5fTE9HX0RFQlVHKDEsIkluaXRpYWwgVmNjPSVkLzEwdlxuIiwgc29ja2V0Y29uZi5WY2MpOwotCQlpZiAocHJpc20yX2lnbm9yZXZjYykgewotCQkJbGluay0+Y29uZi5WY2MgPSBzb2NrZXRjb25mLlZjYzsKLQkJCWdvdG8gc2tpcHZjYzsKLQkJfQotCi0JCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLwotCQkvKiBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJWY2Mgb2J0YWluZWQgZnJvbSBjdXJ0dXBsLlZOT01cbiIpOwotCQkJbWluVmNjID0gbWF4VmNjID0KLQkJCQljZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJWY2Mgc2V0IGZyb20gZGZsdC5WTk9NXG4iKTsKLQkJCW1pblZjYyA9IG1heFZjYyA9Ci0JCQkJZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOwotCQl9IGVsc2UgaWYgKChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTUFYKSkgJiYKLQkJCSAgIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTUlOKSkgKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIHNldCBmcm9tIGN1cnR1cGwoVk1JTixWTUFYKVxuIik7CQkJbWluVmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNSU5dLzEwMDAwOwotCQkJbWF4VmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNQVhdLzEwMDAwOwotCQl9IGVsc2UgaWYgKChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTUFYKSkgJiYKLQkJCSAgIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTUlOKSkgKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIHNldCBmcm9tIGRmbHQoVk1JTixWTUFYKVxuIik7Ci0JCQltaW5WY2MgPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk1JTl0vMTAwMDA7Ci0JCQltYXhWY2MgPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk1BWF0vMTAwMDA7Ci0JCX0KLQotCQlpZiAoIHNvY2tldGNvbmYuVmNjID49IG1pblZjYyAmJiBzb2NrZXRjb25mLlZjYyA8PSBtYXhWY2MpIHsKLQkJCWxpbmstPmNvbmYuVmNjID0gc29ja2V0Y29uZi5WY2M7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBbTVNNXTogTm90ZSB0aGF0IEkndmUgZ2l2ZW4gdXAgdHJ5aW5nIHRvIGNoYW5nZQotCQkJICogdGhlIFZjYyBpZiBhIGNoYW5nZSBpcyBpbmRpY2F0ZWQuICBJdCBzZWVtcyB0aGUKLQkJCSAqIHN5c3RlbSZzb2NrZXRjb250cm9sbGVyJmNhcmQgdmVuZG9ycyBjYW4ndCBzZWVtCi0JCQkgKiB0byBnZXQgaXQgcmlnaHQsIHNvIEknbSB0aXJlZCBvZiB0cnlpbmcgdG8gaGFjawotCQkJICogbXkgd2F5IGFyb3VuZCBpdC4gIHBjbWNpYS1jcyBkb2VzIGl0cyBiZXN0IHVzaW5nCi0JCQkgKiB0aGUgdm9sdGFnZSBzZW5zZSBwaW5zIGJ1dCBzb21ldGltZXMgdGhlIGNvbnRyb2xsZXIKLQkJCSAqIGxpZXMuICBUaGVuLCBldmVuIGlmIHdlIGhhdmUgYSBnb29kIHJlYWQgb24gdGhlIFZTCi0JCQkgKiBwaW5zLCBzb21lIHN5c3RlbSBkZXNpZ25zIHdpbGwgc2lsZW50bHkgaWdub3JlIG91cgotCQkJICogcmVxdWVzdHMgdG8gc2V0IHRoZSB2b2x0YWdlLiAgQWRkaXRpb25hbGx5LCBzb21lCi0JCQkgKiB2ZW5kb3JzIGhhdmUgMy4zdiBpbmRpY2F0ZWQgb24gdGhlaXIgc2Vuc2UgcGlucywKLQkJCSAqIGJ1dCA1diBzcGVjaWZpZWQgaW4gdGhlIENJUyBvciB2aWNlLXZlcnNhLiAgSSd2ZQotCQkJICogaGFkIGl0LiAgTXkgb25seSByZWNvbW1lbmRhdGlvbiBpcyAibGV0IHRoZSBidXllcgotCQkJICogYmV3YXJlIi4gIFlvdXIgc3lzdGVtIG1pZ2h0IHN1cHBseSA1diB0byBhIDN2IGNhcmQKLQkJCSAqIChwb3NzaWJseSBjYXVzaW5nIGRhbWFnZSkgb3IgYSAzdiBjYXBhYmxlIHN5c3RlbQotCQkJICogbWlnaHQgc3VwcGx5IDV2IHRvIGEgM3YgY2FwYWJsZSBjYXJkICh3YXN0aW5nCi0JCQkgKiBwcmVjaW91cyBiYXR0ZXJ5IGxpZmUpLgotCQkJICogTXkgb25seSByZWNvbW1lbmRhdGlvbiAoaWYgeW91IGNhcmUpIGlzIHRvIGdldAotCQkJICogeW91cnNlbGYgYW4gZXh0ZW5kZXIgY2FyZCAoSSBkb24ndCBrbm93IHdoZXJlLCBJCi0JCQkgKiBoYXZlIG9ubHkgb25lIG15c2VsZikgYW5kIGEgbWV0ZXIgYW5kIHRlc3QgaXQgZm9yCi0JCQkgKiB5b3Vyc2VsZi4KLQkJCSAqLwotCQkJZ290byBuZXh0X2VudHJ5OwotCQl9Ci1za2lwdmNjOgotCQlXTEFOX0xPR19ERUJVRygxLCAibGluay0+Y29uZi5WY2M9JWRcbiIsIGxpbmstPmNvbmYuVmNjKTsKLQotCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KLQkJLyogSEFDSzogZHVlIHRvIGEgYmFkIENJUy4uLi53ZSBBTFdBWVMgbmVlZCBhbiBpbnRlcnJ1cHQgKi8KLQkJLyogaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKSAqLwotCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLQkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKLQkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKLQkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKLQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7Ci0JCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7Ci0JCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7Ci0JCQlpZiAgKCBsaW5rLT5pby5CYXNlUG9ydDEgIT0gMCApIHsKLQkJCQlXTEFOX0xPR19XQVJOSU5HKAotCQkJCSJCcmFpbiBkYW1hZ2VkIENJUzogaGFyZCBjb2RlZCBpb2Jhc2U9IgotCQkJCSIweCV4LCB0cnkgbGV0dGluZyBwY21jaWFfY3MgZGVjaWRlLi4uXG4iLAotCQkJCWxpbmstPmlvLkJhc2VQb3J0MSApOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IDA7Ci0JCQl9Ci0JCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKLQkJCWlmIChpby0+bndpbiA+IDEpIHsKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOwotCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKLQkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKLQkJCX0KLQkJfQotCi0JCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCUNGR19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSk7Ci0KLQkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLwotCQlicmVhazsKLQotbmV4dF9lbnRyeToKLQkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQotCQkJZGZsdCA9ICpjZmc7Ci0JCUNTX0NIRUNLKEdldE5leHRUdXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhICovCi0JLyogaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlICovCi0JLyogaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4gKi8KLQlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQotCXsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi0JCWludAkJCWk7Ci0JCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9JTkZPMl9WQUxJRCB8IElSUV9MRVZFTF9JRDsKLQkJaWYgKGlycV9saXN0WzBdID09IC0xKQotCQkJbGluay0+aXJxLklSUUluZm8yID0gaXJxX21hc2s7Ci0JCWVsc2UKLQkJCWZvciAoaT0wOyBpPDQ7IGkrKykKLQkJCQlsaW5rLT5pcnEuSVJRSW5mbzIgfD0gMSA8PCBpcnFfbGlzdFtpXTsKLSNlbHNlCi0JCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKLSNlbmRpZgotCQlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKLQkJbGluay0+aXJxLkhhbmRsZXIgPSBoZmEzODR4X2ludGVycnVwdDsKLQkJbGluay0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLQkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOwotCX0KLQotCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwICovCi0JLyogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZSAqLwotCS8qIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuICovCi0JQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOwotCi0JLyogRmlsbCB0aGUgbmV0ZGV2aWNlIHdpdGggdGhpcyBpbmZvICovCi0Jd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7Ci0KLQkvKiBSZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCi0JV0xBTl9MT0dfSU5GTygiJXM6IGluZGV4IDB4JTAyeDogVmNjICVkLiVkIiwKLQkJZGV2X2luZm8sIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCi0JCWxpbmstPmNvbmYuVmNjLzEwLCBsaW5rLT5jb25mLlZjYyUxMCk7Ci0JaWYgKGxpbmstPmNvbmYuVnBwMSkKLQkJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwMS8xMCwgbGluay0+Y29uZi5WcHAxJTEwKTsKLQlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQotCQlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMxKQotCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKLQlpZiAobGluay0+aW8uTnVtUG9ydHMyKQotCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsIGxpbmstPmlvLkJhc2VQb3J0MitsaW5rLT5pby5OdW1Qb3J0czItMSk7Ci0JcHJpbnRrKCJcbiIpOwotCi0JbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKLQotCS8qIExldCBwY21jaWEga25vdyB0aGUgZGV2aWNlIG5hbWUgKi8KLQlsaW5rLT5kZXYgPSAmaHctPm5vZGU7Ci0KLQkvKiBSZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgYW5kIGdldCBhc3NpZ25lZCBhIG5hbWUgKi8KLQlTRVRfTU9EVUxFX09XTkVSKHdsYW5kZXYtPm5ldGRldik7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICAmaGFuZGxlX3RvX2RldihsaW5rLT5oYW5kbGUpKTsKLSNlbmRpZgotCWlmIChyZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDApIHsKLQkJV0xBTl9MT0dfTk9USUNFKCJwcmlzbTJzdGFfY3M6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0Jc3RyY3B5KGh3LT5ub2RlLmRldl9uYW1lLCB3bGFuZGV2LT5uYW1lKTsKLQotCS8qIEFueSBkZXZpY2UgY3VzdG9tIGNvbmZpZy9xdWVyeSBzdHVmZiBzaG91bGQgYmUgZG9uZSBoZXJlICovCi0JLyogRm9yIGEgbmV0ZGV2aWNlLCB3ZSBzaG91bGQgYXQgbGVhc3QgZ3JhYiB0aGUgbWFjIGFkZHJlc3MgKi8KLQotCXJldHVybjsKLWNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKLQlXTEFOX0xPR19FUlJPUigiTmV4dFR1cGxlIGZhaWx1cmU/IEl0J3MgcHJvYmFibHkgYSBWY2MgbWlzbWF0Y2guXG4iKTsKLQotZmFpbGVkOgotCXByaXNtMnN0YV9yZWxlYXNlKCh1X2xvbmcpbGluayk7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX3JlbGVhc2UKLSoKLSogSGFsZiBvZiB0aGUgY29uZmlnL3JlbGVhc2UgcGFpci4gIFVzdWFsbHkgY2FsbGVkIGluIHJlc3BvbnNlIHRvCi0qIGEgY2FyZCBlamVjdGlvbiBldmVudC4gIENoZWNrcyB0byBtYWtlIHN1cmUgbm8gaGlnaGVyIGxheWVycwotKiBhcmUgc3RpbGwgKG9yIHRoaW5rIHRoZXkgYXJlKSB1c2luZyB0aGUgY2FyZCB2aWEgdGhlIGxpbmstPm9wZW4KLSogZmllbGQuCi0qCi0qIE5PVEU6IERvbid0IGZvcmdldCB0byBpbmNyZW1lbnQgdGhlIGxpbmstPm9wZW4gdmFyaWFibGUgaW4gdGhlCi0qICBkZXZpY2Vfb3BlbiBtZXRob2QsIGFuZCBkZWNyZW1lbnQgaXQgaW4gdGhlIGRldmljZV9jbG9zZQotKiAgbWV0aG9kLgotKgotKiBBcmd1bWVudHM6Ci0qCWFyZwlhIGdlbmVyaWMgMzIgYml0IHZhcmlhYmxlLiAgSXQncyB0aGUgdmFsdWUgdGhhdAotKgkJd2UgYXNzaWduZWQgdG8gbGluay0+cmVsZWFzZS5kYXRhIGluIHN0YV9hdHRhY2goKS4KLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCUFsbCByZXNvdXJjZXMgc2hvdWxkIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgZnVuY3Rpb24KLSoJZXhlY3V0ZXMgYW5kIGZpbmRzIHRoZSBkZXZpY2UgIW9wZW4uCi0qCi0qIENhbGwgY29udGV4dDoKLSoJUG9zc2libHkgaW4gYSB0aW1lciBjb250ZXh0LiAgRG9uJ3QgZG8gYW55dGhpbmcgdGhhdCdsbAotKglibG9jay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfcmVsZWFzZSh1X2xvbmcgYXJnKQotewotICAgICAgICBkZXZfbGlua190CSpsaW5rID0gKGRldl9saW5rX3QgKilhcmc7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEZpcnN0IHRoaW5nIHdlIHNob3VsZCBkbyBpcyBnZXQgdGhlIE1TRCBiYWNrIHRvIHRoZQotCSAqIEhXUFJFU0VOVCBzdGF0ZS4gIEkuZS4gZXZlcnl0aGluZyBxdWllc2NlbnQuCi0JICovCi0JcHJpc20yc3RhX2lmc3RhdGUobGluay0+cHJpdiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCi0gICAgICAgIGlmIChsaW5rLT5vcGVuKSB7Ci0JCS8qIFRPRE86IEkgZG9uJ3QgdGhpbmsgd2UncmUgZXZlbiB1c2luZyB0aGlzIGJpdCBvZiBjb2RlCi0JCSAqIGFuZCBJIGRvbid0IHRoaW5rIGl0J3MgaHVydGluZyB1cyBhdCB0aGUgbW9tZW50LgotCQkgKi8KLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLAotCQkJInByaXNtMnN0YV9jczogcmVsZWFzZSBwb3N0cG9uZWQsICclcycgc3RpbGwgb3BlblxuIiwKLQkJCWxpbmstPmRldi0+ZGV2X25hbWUpOwotICAgICAgICAgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVEFMRV9DT05GSUc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwotICAgICAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7Ci0gICAgICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOwotCi0gICAgICAgIGxpbmstPnN0YXRlICY9IH4oREVWX0NPTkZJRyB8IERFVl9SRUxFQVNFX1BFTkRJTkcpOwotCi0JREJGRVhJVDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9ldmVudAotKgotKiBIYW5kbGVyIGZvciBjYXJkIHNlcnZpY2VzIGV2ZW50cy4KLSoKLSogQXJndW1lbnRzOgotKglldmVudAkJVGhlIGV2ZW50IGNvZGUKLSoJcHJpb3JpdHkJaGkvbG93IC0gUkVNT1ZBTCBpcyB0aGUgb25seSBoaQotKglhcmdzCQlwdHIgdG8gY2FyZCBzZXJ2aWNlcyBzdHJ1Y3QgY29udGFpbmluZyBpbmZvIGFib3V0Ci0qCQkJcGNtY2lhIHN0YXR1cwotKgotKiBSZXR1cm5zOgotKglaZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJQm90aCBpbnRlcnJ1cHQgYW5kIHByb2Nlc3MgdGhyZWFkLCBkZXBlbmRzIG9uIHRoZSBldmVudC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotcHJpc20yc3RhX2V2ZW50ICgKLQlldmVudF90IGV2ZW50LAotCWludCBwcmlvcml0eSwKLQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlkZXZfbGlua190CQkqbGluayA9IChkZXZfbGlua190ICopIGFyZ3MtPmNsaWVudF9kYXRhOwotCXdsYW5kZXZpY2VfdAkJKndsYW5kZXYgPSAod2xhbmRldmljZV90KilsaW5rLT5wcml2OwotCWhmYTM4NHhfdAkJKmh3ID0gTlVMTDsKLQotCURCRkVOVEVSOwotCi0JaWYgKHdsYW5kZXYpIGh3ID0gd2xhbmRldi0+cHJpdjsKLQotCXN3aXRjaCAoZXZlbnQpCi0JewotCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIElOU0VSVElPTlxuIik7Ci0JCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOwotCQlwcmlzbTJzdGFfY29uZmlnKGxpbmspOwotCQlpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpKSB7Ci0JCQl3bGFuZGV2LT5uZXRkZXYtPmlycSA9IDA7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IEluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIsIGRldl9pbmZvKTsKLQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdGQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBGaWxsIGluIHRoZSByZXN0IG9mIHRoZSBodyBzdHJ1Y3QgKi8KLQkJaHctPmlycSA9IHdsYW5kZXYtPm5ldGRldi0+aXJxOwotCQlody0+aW9iYXNlID0gd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHI7Ci0JCWh3LT5saW5rID0gbGluazsKLQotCQlpZiAocHJpc20yX2RvcmVzZXQpIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAotCQkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJCWlmICggcmVzdWx0ICkgewotCQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCQkiY29yZXJlc2V0KCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLAotCQkJCQlyZXN1bHQpOwotCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdGQUlMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLSNpZiAwCi0JCS8qCi0JCSAqIFRPRE86IHRlc3RfaG9zdGlmKCkgbm90IGltcGxlbWVudGVkIHlldC4KLQkJICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfdGVzdF9ob3N0aWYoaHcpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCSJ0ZXN0X2hvc3RpZigpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdGQUlMOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgUkVNT1ZBTFxuIik7Ci0JCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKLQotCQlpZiAod2xhbmRldikgewotCQkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQkJfQotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKLQkJewotCQkJbGluay0+cmVsZWFzZS5leHBpcmVzID0gamlmZmllcyArIChIWi8yMCk7Ci0JCQlhZGRfdGltZXIoJmxpbmstPnJlbGVhc2UpOwotCQl9Ci0jZW5kaWYKLQkJYnJlYWs7Ci0JY2FzZSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBSRVNFVF9SRVFVRVNUXG4iKTsKLQkJV0xBTl9MT0dfTk9USUNFKAotCQkJInByaXNtMiBjYXJkIHJlc2V0IG5vdCBzdXBwb3J0ZWQgIgotCQkJImR1ZSB0byBwb3N0LXJlc2V0IHVzZXIgbW9kZSBjb25maWd1cmF0aW9uICIKLQkJCSJyZXF1aXJlbWVudHMuXG4iKTsKLQkJV0xBTl9MT0dfTk9USUNFKAotCQkJIiAgRnJvbSB1c2VyIG1vZGUsIHVzZSAiCi0JCQkiJ2NhcmRjdGwgc3VzcGVuZDtjYXJkY3RsIHJlc3VtZScgIgotCQkJImluc3RlYWQuXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKLQljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6Ci0JCVdMQU5fTE9HX1dBUk5JTkcoIlJ4J2QgQ1NfRVZFTlRfUkVTRVRfeHh4LCBzaG91bGQgbm90ICIKLQkJCSJiZSBwb3NzaWJsZSBzaW5jZSBSRVNFVF9SRVFVRVNUIHdhcyBkZW5pZWQuXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIFNVU1BFTkRcbiIpOwotCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKLQkJewotCQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIFJFU1VNRVxuIik7Ci0JCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOyAgLyogbm9vbmUgZWxzZSBkb2VzIGFudGhpbmcgd2l0aCB0aGUgcmV0dXJuIHZhbHVlICovCi19Ci0jZW5kaWYgLy8gPD0gMi42LjE1Ci0KLQotCi1pbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCWNvbmZfcmVnX3QJcmVnOwotCVVJTlQ4CQljb3JzYXZlOwotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfREVCVUcoMywgIkRvaW5nIHJlc2V0IHZpYSBDYXJkU2VydmljZXMoKS5cbiIpOwotCi0JLyogQ29sbGVjdCBDT1IgKi8KLQlyZWcuRnVuY3Rpb24gPSAwOwotCXJlZy5BY3Rpb24gPSBDU19SRUFEOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHctPnBkZXYsICZyZWcpOwotI2Vsc2UKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoCi0JCQlody0+bGluay0+aGFuZGxlLAotCQkJJnJlZyk7Ci0jZW5kaWYKLQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJIjowOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfUkVBRCkgZmFpbGVkLCIKLQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotCX0KLQljb3JzYXZlID0gcmVnLlZhbHVlOwotCi0JLyogV3JpdGUgcmVzZXQgYml0IChCSVQ3KSAqLwotCXJlZy5WYWx1ZSB8PSBCSVQ3OwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJaHctPmxpbmstPmhhbmRsZSwKLQkJCSZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MTogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JfQotCi0JLyogSG9sZCBmb3IgaG9sZHRpbWUgKi8KLQltZGVsYXkoaG9sZHRpbWUpOwotCi0JaWYgKGdlbmVzaXMpIHsKLQkJcmVnLlZhbHVlID0gZ2VuZXNpczsKLQkJcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NDU1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHctPnBkZXYsICZyZWcpOwotI2Vsc2UKLQkJcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJCSAgICAgIGh3LT5saW5rLT5oYW5kbGUsCi0JCQkJICAgICAgJnJlZyk7Ci0jZW5kaWYKLQkJaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIjoxOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfV1JJVEUpIGZhaWxlZCwiCi0JCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQl9Ci0JfQotCi0JLyogSG9sZCBmb3IgaG9sZHRpbWUgKi8KLQltZGVsYXkoaG9sZHRpbWUpOwotCi0JLyogQ2xlYXIgcmVzZXQgYml0ICovCi0JcmVnLlZhbHVlICY9IH5CSVQ3OwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJCSAgICAgIGh3LT5saW5rLT5oYW5kbGUsCi0JCQkJICAgICAgJnJlZyk7Ci0jZW5kaWYKLQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJIjoyOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfV1JJVEUpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFdhaXQgZm9yIHNldHRsZXRpbWUgKi8KLQltZGVsYXkoc2V0dGxldGltZSk7Ci0KLQkvKiBTZXQgbm9uLXJlc2V0IGJpdHMgYmFjayB3aGF0IHRoZXkgd2VyZSAqLwotCXJlZy5WYWx1ZSA9IGNvcnNhdmU7Ci0JcmVnLkFjdGlvbiA9IENTX1dSSVRFOwotCXJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaHctPnBkZXYsICZyZWcpOwotI2Vsc2UKLQlyZXN1bHQgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoCi0JCQkJICAgICAgaHctPmxpbmstPmhhbmRsZSwKLQkJCQkgICAgICAmcmVnKTsKLSNlbmRpZgotCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiOjI6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19XUklURSkgZmFpbGVkLCIKLQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBwcmlzbTJjc19pbml0KHZvaWQpCi17Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0Jc2VydmluZm9fdAlzZXJ2OwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoIiVzIExvYWRlZFxuIiwgdmVyc2lvbik7Ci0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiZGV2X2luZm8gaXM6ICVzXG4iLCBkZXZfaW5mbyk7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKLQlwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbygmc2Vydik7Ci0JaWYgKCBzZXJ2LlJldmlzaW9uICE9IENTX1JFTEVBU0VfQ09ERSApCi0JewotCQlwcmludGsoS0VSTl9OT1RJQ0UiJXM6IENhcmRTZXJ2aWNlcyByZWxlYXNlIGRvZXMgbm90IG1hdGNoIVxuIiwgZGV2X2luZm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogVGhpcyBjYWxsIHdpbGwgcmVzdWx0IGluIGEgY2FsbCB0byBwcmlzbTJzdGFfYXR0YWNoICovCi0JLyogICBhbmQgZXZlbnR1YWxseSBwcmlzbTJzdGFfZGV0YWNoICovCi0JcmVnaXN0ZXJfcGNjYXJkX2RyaXZlciggJmRldl9pbmZvLCAmcHJpc20yc3RhX2F0dGFjaCwgJnByaXNtMnN0YV9kZXRhY2gpOwotI2Vsc2UKLQlwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfY3NfZHJpdmVyKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHByaXNtMmNzX2NsZWFudXAodm9pZCkKLXsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKLSAgICAgICAgZGV2X2xpbmtfdCAqbGluayA9IGRldl9saXN0OwotICAgICAgICBkZXZfbGlua190ICpubGluazsKLSAgICAgICAgREJGRU5URVI7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKSApCi0JZm9yIChsaW5rPWRldl9saXN0OyBsaW5rICE9IE5VTEw7IGxpbmsgPSBubGluaykgewotCQlubGluayA9IGxpbmstPm5leHQ7Ci0JCWlmICggbGluay0+c3RhdGUgJiBERVZfQ09ORklHICkgewotCQkJcHJpc20yc3RhX3JlbGVhc2UoKHVfbG9uZylsaW5rKTsKLQkJfQotCQlwcmlzbTJzdGFfZGV0YWNoKGxpbmspOyAvKiByZW1lbWJlciBkZXRhY2goKSBmcmVlcyBsaW5rICovCi0JfQotI2VuZGlmCi0KLQl1bnJlZ2lzdGVyX3BjY2FyZF9kcml2ZXIoICZkZXZfaW5mbyk7Ci0jZWxzZQotCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc20yX2NzX2RyaXZlcik7Ci0jZW5kaWYKLQotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIFVubG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KHByaXNtMmNzX2luaXQpOwotbW9kdWxlX2V4aXQocHJpc20yY3NfY2xlYW51cCk7Ci0KLSNlbmRpZiAvLyBNT0RVTEUKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUzMmRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0jZGVmaW5lIFdMQU5fSE9TVElGIFdMQU5fUENJCi0jaW5jbHVkZSAiaGZhMzg0eC5jIgotI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKLSNpbmNsdWRlICJwcmlzbTJtaWIuYyIKLSNpbmNsdWRlICJwcmlzbTJzdGEuYyIKLQotI2RlZmluZSBQQ0lfU0laRQkJMHgxMDAwCQkvKiBNZW1vcnkgc2l6ZSAtIDRLIGJ5dGVzICovCi0KLS8qIElTTDM4NzRBIDExTWIvcyBXTEFOIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUENJVkVORE9SX0lOVEVSU0lMCTB4MTI2MFVMCi0jZGVmaW5lIFBDSURFVklDRV9JU0wzODc0CTB4Mzg3M1VMIC8qIFtNU01dIHllYWggSSBrbm93Li4udGhlIElEIHNheXMKLQkJCQkJICAgIDM4NzMuIFRydXN0IG1lLCBpdCdzIGEgMzg3NC4gKi8KLQotLyogU2Ftc3VuZyBTV0wtMjIxMFAgMTFNYi9zIFdMQU4gY29udHJvbGxlciAodXNlcyBJU0wzODc0QSkgKi8KLSNkZWZpbmUgUENJVkVORE9SX1NBTVNVTkcgICAgICAweDE2N2RVTAotI2RlZmluZSBQQ0lERVZJQ0VfU1dMXzIyMTBQICAgIDB4YTAwMFVMCi0KLSNkZWZpbmUgUENJVkVORE9SX05FVEdFQVIgICAgICAweDEzODVVTCAvKiBmb3IgTUEzMTEgKi8KLQotLyogUENJIENsYXNzICYgU3ViLUNsYXNzIGNvZGUsIE5ldHdvcmstJ090aGVyIGNvbnRyb2xsZXInICovCi0jZGVmaW5lIFBDSV9DTEFTU19ORVRXT1JLX09USEVSUyAweDI4MAotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcHJvYmVfcGNpCi0qCi0qIFByb2JlIHJvdXRpbmUgY2FsbGVkIHdoZW4gYSBQQ0kgZGV2aWNlIHcvIG1hdGNoaW5nIElEIGlzIGZvdW5kLgotKiBUaGUgSVNMMzg3NCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwOgotKiAgIEJBUjA6IFByaXNtMi54IHJlZ2lzdGVycyBtZW1vcnkgbWFwcGVkLCBzaXplPTRrCi0qIEhlcmUncyB0aGUgc2VxdWVuY2U6Ci0qICAgLSBBbGxvY2F0ZSB0aGUgUENJIHJlc291cmNlcy4KLSogICAtIFJlYWQgdGhlIFBDTUNJQSBhdHRyaWJ1dGUgbWVtb3J5IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgV0xBTiBjYXJkCi0qICAgLSBSZXNldCB0aGUgTUFDCi0qICAgLSBJbml0aWFsaXplIHRoZSBuZXRkZXYgYW5kIHdsYW4gZGF0YQotKiAgIC0gSW5pdGlhbGl6ZSB0aGUgTUFDCi0qCi0qIEFyZ3VtZW50czoKLSoJcGRldgkJcHRyIHRvIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5mbyBhYm91dAotKgkJCXBjaSBjb25maWd1cmF0aW9uLgotKglpZAkJcHRyIHRvIHRoZSBkZXZpY2UgaWQgZW50cnkgdGhhdCBtYXRjaGVkIHRoaXMgZGV2aWNlLgotKgotKiBSZXR1cm5zOgotKgl6ZXJvCQktIHN1Y2Nlc3MKLSoJbmVnYXRpdmUJLSBmYWlsZWQKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1wcmlzbTJzdGFfcHJvYmVfcGNpKAotCXN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQJCXJlc3VsdDsKLQlwaHlzX3QJCXBoeW1lbSA9IDA7Ci0Jdm9pZAkJX19pb21lbSAqbWVtID0gTlVMTDsKLSAgICAgICAgd2xhbmRldmljZV90ICAgICp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QJKmh3ID0gTlVMTDsKLQotCURCRkVOVEVSOwotCi0JLyogRW5hYmxlIHRoZSBwY2kgZGV2aWNlICovCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBGaWd1cmUgb3V0IG91ciByZXNvdXJjZXMgKi8KLQlwaHltZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0KLSAgICAgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGh5bWVtLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLCAiUHJpc20yIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTI6IENhbm5vdCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uXG4iKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotICAgICAgICB9Ci0KLQltZW0gPSBpb3JlbWFwKHBoeW1lbSwgUENJX1NJWkUpOwotCWlmICggbWVtID09IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogaW9yZW1hcCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIExvZyB0aGUgZGV2aWNlICovCi0gICAgICAgIFdMQU5fTE9HX0lORk8oIkEgUHJpc20yLjUgUENJIGRldmljZSBmb3VuZCwgIgotCQkicGh5bWVtOjB4JWxseCwgaXJxOiVkLCBtZW06MHglcFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaHltZW0sIHBkZXYtPmlycSwgbWVtKTsKLQotCWlmICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTZXR1cCBuZXRkZXZpY2UncyBhYmlsaXR5IHRvIHJlcG9ydCByZXNvdXJjZXMKLQkgKiBOb3RlOiB0aGUgbmV0ZGV2aWNlIHdhcyBhbGxvY2F0ZWQgYnkgd2xhbl9zZXR1cCgpCi0JICovCi0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+aXJxID0gcGRldi0+aXJxOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBtZW07Ci0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+bWVtX2VuZCA9IHdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0ICsKLQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KLSAgICAgICAgaGZhMzg0eF9jcmVhdGUoaHcsIHdsYW5kZXYtPm5ldGRldi0+aXJxLCAwLCBtZW0pOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIFJlZ2lzdGVyIHRoZSB3bGFuZGV2LCB0aGlzIGdldHMgdXMgYSBuYW1lIGFuZCByZWdpc3RlcnMgdGhlCi0JICogbGludXggbmV0ZGV2aWNlLgotCSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSAgICAgICBTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYocGRldi0+ZGV2KSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotICAgICAgICB9Ci0KLSNpZiAwCi0JLyogVE9ETzogTW92ZSB0aGlzIGFuZCBhbiBpcnEgdGVzdCBpbnRvIGFuIGhmYTM4NHhfdGVzdGlmKCkgcm91dGluZS4KLQkgKi8KLQlvdXR3KFBSSVNNMlNUQV9NQUdJQywgSEZBMzg0eF9TV1NVUFBPUlQod2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIpKTsKLQlyZWc9aW53KCBIRkEzODR4X1NXU1VQUE9SVCh3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcikpOwotCWlmICggcmVnICE9IFBSSVNNMlNUQV9NQUdJQyApIHsKLQkJV0xBTl9MT0dfRVJST1IoIk1BQyByZWdpc3RlciBhY2Nlc3MgdGVzdCBmYWlsZWQhXG4iKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLSNlbmRpZgotCi0JLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KLQlpZiAocHJpc20yX2RvcmVzZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCi0JCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQotICAgICAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgd2xhbmRldik7Ci0KLQkvKiBTaG91bGRuJ3QgYWN0dWFsbHkgaG9vayB1cCB0aGUgSVJRIHVudGlsIHdlCi0JICogX2tub3dfIHRoaW5ncyBhcmUgYWxyaWdodC4gIEEgdGVzdCByb3V0aW5lIHdvdWxkIGhlbHAuCi0JICovCi0gICAgICAgCXJlcXVlc3RfaXJxKHdsYW5kZXYtPm5ldGRldi0+aXJxLCBoZmEzODR4X2ludGVycnVwdCwKLQkJU0FfU0hJUlEsIHdsYW5kZXYtPm5hbWUsIHdsYW5kZXYpOwotCi0Jd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0KLQlyZXN1bHQgPSAwOwotCWdvdG8gZG9uZTsKLQotIGZhaWw6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0gICAgICAgIGlmIChtZW0pICAgICAgICBpb3VubWFwKG1lbSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0gZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwcmlzbTJzdGFfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLSAgICAgICAJd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQloZmEzODR4X3QJKmh3OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0KLQkvKiByZXNldCBoYXJkd2FyZSAqLwotCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotICAgICAgICBpZiAocGRldi0+aXJxKQotCQlmcmVlX2lycShwZGV2LT5pcnEsIHdsYW5kZXYpOwotCi0JdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCi0JLyogZnJlZSBsb2NhbCBzdHVmZiAqLwotCWlmIChodykgewotCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQlrZnJlZShodyk7Ci0JfQotCi0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQpOwotCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlrZnJlZSh3bGFuZGV2KTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkX3RibFtdID0gewotCXsKLQkJUENJVkVORE9SX0lOVEVSU0lMLCBQQ0lERVZJQ0VfSVNMMzg3NCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkludGVyc2lsIFByaXNtMi41IElTTDM4NzQgMTFNYi9zIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsKLQkJUENJVkVORE9SX0lOVEVSU0lMLCAweDM4NzIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJJbnRlcnNpbCBQcmlzbTIuNSBJU0wzODcyIDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgUENJVkVORE9SX1NBTVNVTkcsIFBDSURFVklDRV9TV0xfMjIxMFAsCi0gICAgICAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgIC8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykiU2Ftc3VuZyBNYWdpY0xBTiBTV0wtMjIxMFAgMTFNYi9zIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsgLyogZm9yIE5ldEdlYXIgTUEzMTEgKi8KLQkJUENJVkVORE9SX05FVEdFQVIsIDB4Mzg3MiwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIk5ldGdlYXIgTUEzMTEgV0xBTiBDb250cm9sbGVyIgotCX0sCi0JewotCQkwLCAwLCAwLCAwLCAwLCAwLCAwCi0JfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZF90YmwpOwotCi0vKiBGdW5jdGlvbiBkZWNsYXJlZCBoZXJlIGJlY2F1c2Ugb2YgcHRyIHJlZmVyZW5jZSBiZWxvdyAqLwotc3RhdGljIGludCAgX19kZXZpbml0IHByaXNtMnN0YV9wcm9iZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkICBfX2RldmV4aXQgcHJpc20yc3RhX3JlbW92ZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJpc20yX3BjaV9kcnZfaWQgPSB7Ci0gICAgICAgIC5uYW1lID0gInByaXNtMl9wY2kiLAotICAgICAgICAuaWRfdGFibGUgPSBwY2lfaWRfdGJsLAotICAgICAgICAucHJvYmUgPSBwcmlzbTJzdGFfcHJvYmVfcGNpLAotICAgICAgICAucmVtb3ZlID0gcHJpc20yc3RhX3JlbW92ZV9wY2ksCi0jaWZkZWYgQ09ORklHX1BNCi0gICAgICAgIC5zdXNwZW5kID0gcHJpc20yc3RhX3N1c3BlbmRfcGNpLAotICAgICAgICAucmVzdW1lID0gcHJpc20yc3RhX3Jlc3VtZV9wY2ksCi0jZW5kaWYKLX07Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20ycGNpX2luaXQodm9pZCkKLXsKLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnByaXNtMl9wY2lfZHJ2X2lkKTsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJwY2lfY2xlYW51cCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc20yX3BjaV9kcnZfaWQpOwotfTsKLQotbW9kdWxlX2luaXQocHJpc20ycGNpX2luaXQpOwotbW9kdWxlX2V4aXQocHJpc20ycGNpX2NsZWFudXApOwotCi0jZW5kaWYKLQotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQotewotCWludAkJcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7Ci0JVUlOVDE2CXJlZzsKLQlEQkZFTlRFUjsKLQotCS8qIEFzc2VydCByZXNldCBhbmQgd2FpdCBhd2hpbGUKLQkgKiAobm90ZTogdGhlc2UgZGVsYXlzIGFyZSBfcmVhbGx5XyBsb25nLCBidXQgdGhleSBhcHBlYXIgdG8gYmUKLQkgKiAgICAgICAgbmVjZXNzYXJ5LikKLQkgKi8KLQloZmEzODR4X3NldHJlZyhodywgMHhjNSwgSEZBMzg0eF9QQ0lDT1IpOwotCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovNDsKLQl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgdWRlbGF5KDUpOwotCi0JaWYgKGdlbmVzaXMpIHsKLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGdlbmVzaXMsIEhGQTM4NHhfUENJSENSKTsKLQkJdGltZW91dCA9IGppZmZpZXMgKyBIWi80OwotCQl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgdWRlbGF5KDUpOwotCX0KLQotCS8qIENsZWFyIHRoZSByZXNldCBhbmQgd2FpdCBzb21lIG1vcmUKLQkgKi8KLQloZmEzODR4X3NldHJlZyhodywgMHg0NSwgSEZBMzg0eF9QQ0lDT1IpOwotCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovMjsKLQl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgdWRlbGF5KDUpOwotCi0JLyogV2FpdCBmb3IgZi93IHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uIChDTUQ6QlVTWSA9PSAwKQotCSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgMipIWjsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCXdoaWxlICggSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYgdGltZV9iZWZvcmUoIGppZmZpZXMsIHRpbWVvdXQpICkgewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQl1ZGVsYXkoMTApOwotCX0KLQlpZiAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJV0xBTl9MT0dfV0FSTklORygiY29yZXJlc2V0OiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgY21kIHJlZ2lzdGVyLlxuIik7Ci0JCXJlc3VsdD0xOwotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGx4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGx4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDQ0M2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BseC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLSNkZWZpbmUgV0xBTl9IT1NUSUYgV0xBTl9QTFgKLSNpbmNsdWRlICJoZmEzODR4LmMiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5jIgotI2luY2x1ZGUgInByaXNtMm1pYi5jIgotI2luY2x1ZGUgInByaXNtMnN0YS5jIgotCi0jZGVmaW5lIFBMWF9BVFRSX1NJWkUJMHgxMDAwCS8qIEF0dHJpYnV0ZSBtZW1vcnkgc2l6ZSAtIDRLIGJ5dGVzICovCi0jZGVmaW5lIENPUl9PRkZTRVQJMHgzZTAJLyogQ09SIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KLSNkZWZpbmUgQ09SX1ZBTFVFCTB4NDEJLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpcnEgaW4gbGV2ZWwgdHJpZ2dlciAqLwotI2RlZmluZSBQTFhfSU5UQ1NSCTB4NGMJLyogSW50ZXJydXB0IENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQTFhfSU5UQ1NSX0lOVEVOICgxPDw2KSAvKiBJbnRlcnJ1cHQgRW5hYmxlIGJpdCAqLwotI2RlZmluZSBQTFhfTUlOX0FUVFJfTEVOIDUxMiAgICAvKiBhdCBsZWFzdCAyIHggMjU2IGlzIG5lZWRlZCBmb3IgQ0lTICovCi0KLS8qIDNDb20gM0NSVzc3N0EgKFBMWCkgYm9hcmQgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SXzNDT00gICAgICAgMHgxMEI3Ci0jZGVmaW5lIFBDSURFVklDRV9BSVJDT05ORUNUIDB4Nzc3MAotCi0vKiBFdW1pdGNvbSBQQ0kgV0wxMTAwMCBQQ0kgQWRhcHRlciAoUExYKSBib2FyZCBkZXZpY2UrdmVuZG9yIElEICovCi0jZGVmaW5lIFBDSVZFTkRPUl9FVU1JVENPTQkweDE2MzhVTAotI2RlZmluZSBQQ0lERVZJQ0VfV0wxMTAwMAkweDExMDBVTAotCi0vKiBHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgUENJIEFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZSBQQ0lWRU5ET1JfR0xPQkFMU1VOCTB4MTZhYlVMCi0jZGVmaW5lIFBDSURFVklDRV9HTDI0MTEwUAkweDExMDFVTAotI2RlZmluZSBQQ0lERVZJQ0VfR0wyNDExMFBfQUxUCTB4MTEwMlVMCi0KLS8qIE5ldGdlYXIgTUEzMDEgUENJIEFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZSBQQ0lWRU5ET1JfTkVUR0VBUgkweDEzODVVTAotI2RlZmluZSBQQ0lERVZJQ0VfTUEzMDEJCTB4NDEwMFVMCi0KLS8qIFVTIFJvYm90aWNzIFVTUjI0MTAgUENJIEFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZQlQQ0lWRU5ET1JfVVNST0JPVElDUyAgICAweDE2ZWNVTAotI2RlZmluZSBQQ0lERVZJQ0VfVVNSMjQxMCAgICAgICAweDM2ODVVTAotCi0vKiBMaW5rc3lzIFdQQzExIGNhcmQgd2l0aCB0aGUgV0RUMTEgYWRhcHRlciAoUExYKSBib2FyZCBkZXZpY2UrdmVuZG9yIElEICovCi0jZGVmaW5lCVBDSVZFTkRPUl9MaW5rc3lzICAgICAgIDB4MTZhYlVMCi0jZGVmaW5lIFBDSURFVklDRV9XcGMxMVdkdDExICAgIDB4MTEwMlVMCi0KLS8qIE5hdGlvbmFsIERhdGFjb21tIENvcnAgU09IT3dhcmUgTmV0Ymxhc3RlciBJSSBQQ0kgKi8KLSNkZWZpbmUgUENJVkVORE9SX05EQwkgICAgICAgIDB4MTVlOFVMCi0jZGVmaW5lIFBDSURFVklDRV9OQ1AxMzBfUExYIAkweDAxMzBVTAotI2RlZmluZSBQQ0lERVZJQ0VfTkNQMTMwX0FTSUMJMHgwMTMxVUwKLQotLyogTkRDIE5DUDEzMF9QTFggaXMgYWxzbyBzb2xkIGJ5IENvcmVnYS4gVGhlaXIgbmFtZSBpcyBDR1dMUENJQTExICovCi0jZGVmaW5lIFBDSVZFTkRPUl9DT1JFR0EgICAgICAgUENJVkVORE9SX05EQwotI2RlZmluZSBQQ0lERVZJQ0VfQ0dXTFBDSUExMSAgIFBDSURFVklDRV9OQ1AxMzBfUExYCi0KLS8qIFBDSSBDbGFzcyAmIFN1Yi1DbGFzcyBjb2RlLCBOZXR3b3JrLSdPdGhlciBjb250cm9sbGVyJyAqLwotI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUlMgMHgyODAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9wcm9iZV9wbHgKLSoKLSogUHJvYmUgcm91dGluZSBjYWxsZWQgd2hlbiBhIFBDSSBkZXZpY2Ugdy8gbWF0Y2hpbmcgSUQgaXMgZm91bmQuCi0qIFRoaXMgUExYIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGZvbGxvd2luZyBtYXA6Ci0qICAgQkFSMDogVW51c2VkCi0qICAgQkFSMTogPz8/PwotKiAgIEJBUjI6IFBDTUNJQSBhdHRyaWJ1dGUgbWVtb3J5Ci0qICAgQkFSMzogUENNQ0lBIGkvbyBzcGFjZQotKiBIZXJlJ3MgdGhlIHNlcXVlbmNlOgotKiAgIC0gQWxsb2NhdGUgdGhlIFBDSSByZXNvdXJjZXMuCi0qICAgLSBSZWFkIHRoZSBQQ01DSUEgYXR0cmlidXRlIG1lbW9yeSB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIFdMQU4gY2FyZAotKiAgIC0gUmVzZXQgdGhlIE1BQyB1c2luZyB0aGUgUENNQ0lBIENPUgotKiAgIC0gSW5pdGlhbGl6ZSB0aGUgbmV0ZGV2IGFuZCB3bGFuIGRhdGEKLSogICAtIEluaXRpYWxpemUgdGhlIE1BQwotKgotKiBBcmd1bWVudHM6Ci0qCXBkZXYJCXB0ciB0byBwY2kgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSoJCQlwY2kgY29uZmlndXJhdGlvbi4KLSoJaWQJCXB0ciB0byB0aGUgZGV2aWNlIGlkIGVudHJ5IHRoYXQgbWF0Y2hlZCB0aGlzIGRldmljZS4KLSoKLSogUmV0dXJuczoKLSoJemVybwkJLSBzdWNjZXNzCi0qCW5lZ2F0aXZlCS0gZmFpbGVkCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotcHJpc20yc3RhX3Byb2JlX3BseCgKLQlzdHJ1Y3QgcGNpX2RldgkJCSpwZGV2LAotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkCSppZCkKLXsKLQlpbnQJCXJlc3VsdDsKLSAgICAgICAgcGh5c190CXBjY2FyZF9pb2FkZHI7Ci0JcGh5c190ICBwY2NhcmRfYXR0cl9tZW07Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICBwY2NhcmRfYXR0cl9sZW47Ci0Jdm9pZCBfX2lvbWVtICphdHRyX21lbSA9IE5VTEw7Ci0JVUlOVDMyCQlwbHhfYWRkcjsKLSAgICAgICAgd2xhbmRldmljZV90ICAgICp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QJKmh3ID0gTlVMTDsKLQlpbnQJCXJlZzsKLSAgICAgICAgdTMyCQlyZWdpYzsKLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBUTUM3MTYwIGJvYXJkcyBhcmUgc3BlY2lhbCAqLwotCWlmICgocGRldi0+dmVuZG9yID09IFBDSVZFTkRPUl9OREMpICYmCi0JICAgIChwZGV2LT5kZXZpY2UgPT0gUENJREVWSUNFX05DUDEzMF9BU0lDKSkgewotCQl1bnNpZ25lZCBsb25nIGRlbGF5OwotCi0JCXBjY2FyZF9hdHRyX21lbSA9IDA7Ci0JCXBjY2FyZF9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0KLQkJb3V0YigweDQ1LCBwY2NhcmRfaW9hZGRyKTsKLQkJZGVsYXkgPSBqaWZmaWVzICsgMSpIWjsKLQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlbGF5KSk7Ci0KLQkJaWYgKGluYihwY2NhcmRfaW9hZGRyKSAhPSAweDQ1KSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiSW5pdGlhbGl6ZSB0aGUgVE1DNzE2MCBmYWlsZWQuICgweCV4KVxuIiwgaW5iKHBjY2FyZF9pb2FkZHIpKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJcGNjYXJkX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKLQkJcHJpc20yX2RvcmVzZXQgPSAwOwotCi0JCVdMQU5fTE9HX0lORk8oIk5EQyBOQ1AxMzAgd2l0aCBUTUM3MTYoQVNJQykgUENJIGludGVyZmFjZSBkZXZpY2UgZm91bmQgYXQgaW86MHgleCwgaXJxOiVkXG4iLCBwY2NhcmRfaW9hZGRyLCBwZGV2LT5pcnEpOwotCQlnb3RvIGluaXQ7Ci0JfQotCi0JLyogQ29sbGVjdCB0aGUgcmVzb3VyY2UgcmVxdWlyZW1lbnRzICovCi0JcGNjYXJkX2F0dHJfbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOwotCXBjY2FyZF9hdHRyX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMik7Ci0gICAgICAgIGlmIChwY2NhcmRfYXR0cl9sZW4gPCBQTFhfTUlOX0FUVFJfTEVOKQotCQlyZXR1cm4gLUVJTzsKLQotCXBjY2FyZF9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7Ci0KLQkvKiBiam9lcm46IFdlIG5lZWQgdG8gdGVsbCB0aGUgY2FyZCB0byBlbmFibGUgaW50ZXJydXB0cywgaW4KLQkgKiBjYXNlIHRoZSBzZXJpYWwgZXByb20gZGlkbid0IGRvIHRoaXMgYWxyZWFkeS4gU2VlIHRoZQotCSAqIFBMWDkwNTIgZGF0YSBib29rLCBwOC0xIGFuZCA4LTI0IGZvciByZWZlcmVuY2UuCi0JICogW01TTV06IFRoaXMgYml0IG9mIGNvZGUgY2FtZSBmcm9tIHRoZSBvcmlub2NvX2NzIGRyaXZlci4KLQkgKi8KLQlwbHhfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKLQotCXJlZ2ljID0gMDsKLQlyZWdpYyA9IGlubChwbHhfYWRkcitQTFhfSU5UQ1NSKTsKLQlpZihyZWdpYyAmIFBMWF9JTlRDU1JfSU5URU4pIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSIlczogTG9jYWwgSW50ZXJydXB0IGFscmVhZHkgZW5hYmxlZFxuIiwgZGV2X2luZm8pOwotCX0gZWxzZSB7Ci0JCXJlZ2ljIHw9IFBMWF9JTlRDU1JfSU5URU47Ci0JCW91dGwocmVnaWMsIHBseF9hZGRyK1BMWF9JTlRDU1IpOwotCQlyZWdpYyA9IGlubChwbHhfYWRkcitQTFhfSU5UQ1NSKTsKLQkJaWYoIShyZWdpYyAmIFBMWF9JTlRDU1JfSU5URU4pKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IENvdWxkbid0IGVuYWJsZSBMb2NhbCBJbnRlcnJ1cHRzXG4iLAotCQkJCWRldl9pbmZvKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCi0JLyogVGhlc2UgYXNzaWdubWVudHMgYXJlIGhlcmUgaW4gY2FzZSBvZiBmdXR1cmUgbWFwcGluZ3MgZm9yCi0JICogaW8gc3BhY2UgYW5kIGlycSB0aGF0IG1pZ2h0IGJlIHNpbWlsYXIgdG8gaW9yZW1hcAotCSAqLwotICAgICAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2NhcmRfYXR0cl9tZW0sIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMiksICJQcmlzbTIiKSkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IENvdWxkbid0IHJlc2VydmUgUENJIG1lbW9yeSByZWdpb25cbiIsIGRldl9pbmZvKTsKLQkJcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLQotCWF0dHJfbWVtID0gaW9yZW1hcChwY2NhcmRfYXR0cl9tZW0sIHBjY2FyZF9hdHRyX2xlbik7Ci0KLQlXTEFOX0xPR19JTkZPKCJBIFBMWCBQQ0kvUENNQ0lBIGludGVyZmFjZSBkZXZpY2UgZm91bmQsICIKLQkJInBoeW1lbToweCVsbHgsIHBoeWlvPTB4JXgsIGlycTolZCwgIgotCQkibWVtOiAweCVseFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2NhcmRfYXR0cl9tZW0sIHBjY2FyZF9pb2FkZHIsIHBkZXYtPmlycSwKLQkJKHVuc2lnbmVkIGxvbmcpYXR0cl9tZW0pOwotCi0JLyogVmVyaWZ5IHdoZXRoZXIgUEMgY2FyZCBpcyBwcmVzZW50LgotCSAqIFtNU01dIFRoaXMgbmVlZHMgaW1wcm92ZW1lbnQsIHRoZSByaWdodCB0aGluZyB0byBkbyBpcwotCSAqIHByb2JhYmx5IHRvIHdhbGsgdGhlIENJUyBsb29raW5nIGZvciB0aGUgdmVuZG9yIGFuZCBwcm9kdWN0Ci0JICogSURzLiAgSXQgd291bGQgYmUgbmljZSBpZiB0aGlzIGNvdWxkIGJlIHRpZWQgaW4gd2l0aCB0aGUKLQkgKiBldGMvcGNtY2lhL3dsYW4tbmcuY29uZiBmaWxlLiAgQW55IHZvbHVudGVlcnM/ICA7LSkKLQkgKi8KLQlpZiAoCi0JcmVhZGIoYXR0cl9tZW0gKyAwKSAhPSAweDAxIHx8IHJlYWRiKGF0dHJfbWVtICsgMikgIT0gMHgwMyB8fAotCXJlYWRiKGF0dHJfbWVtICsgNCkgIT0gMHgwMCB8fCByZWFkYihhdHRyX21lbSArIDYpICE9IDB4MDAgfHwKLQlyZWFkYihhdHRyX21lbSArIDgpICE9IDB4RkYgfHwgcmVhZGIoYXR0cl9tZW0gKyAxMCkgIT0gMHgxNyB8fAotCXJlYWRiKGF0dHJfbWVtICsgMTIpICE9IDB4MDQgfHwgcmVhZGIoYXR0cl9tZW0gKyAxNCkgIT0gMHg2NykgewotCQlXTEFOX0xPR19FUlJPUigiUHJpc20yIFBDIGNhcmQgQ0lTIGlzIGludmFsaWQuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLSAgICAgICAgV0xBTl9MT0dfSU5GTygiQSBQQ01DSUEgV0xBTiBhZGFwdGVyIHdhcyBmb3VuZC5cbiIpOwotCi0gICAgICAgIC8qIFdyaXRlIENPUiB0byBlbmFibGUgUEMgY2FyZCAqLwotCXdyaXRlYihDT1JfVkFMVUUsIGF0dHJfbWVtICsgQ09SX09GRlNFVCk7Ci0JcmVnID0gcmVhZGIoYXR0cl9tZW0gKyBDT1JfT0ZGU0VUKTsKLQotIGluaXQ6Ci0KLQkvKgotCSAqIE5vdyBkbyBldmVyeXRoaW5nIHRoZSBzYW1lIGFzIGEgUENJIGRldmljZQotCSAqIFtNU01dIFRPRE86IFdlIGNvdWxkIHByb2JhYmx5IGZhY3RvciB0aGlzIG91dCBvZiBwY21jaWEvcGNpL3BseAotCSAqIGFuZCBwZXJoYXBzIHVzYi4gIFBlcmhhcHMgYSB0YXNrIGZvciBhbm90aGVyIGRheS4uLi4uLi4KLQkgKi8KLQotCWlmICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBTZXR1cCBuZXRkZXZpY2UncyBhYmlsaXR5IHRvIHJlcG9ydCByZXNvdXJjZXMKLQkgKiBOb3RlOiB0aGUgbmV0ZGV2aWNlIHdhcyBhbGxvY2F0ZWQgYnkgd2xhbl9zZXR1cCgpCi0JICovCi0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+aXJxID0gcGRldi0+aXJxOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkciA9IHBjY2FyZF9pb2FkZHI7Ci0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpYXR0cl9tZW07Ci0gICAgICAgIHdsYW5kZXYtPm5ldGRldi0+bWVtX2VuZCA9ICh1bnNpZ25lZCBsb25nKWF0dHJfbWVtICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KLSAgICAgICAgaGZhMzg0eF9jcmVhdGUoaHcsIHdsYW5kZXYtPm5ldGRldi0+aXJxLCBwY2NhcmRfaW9hZGRyLCBhdHRyX21lbSk7Ci0JaHctPndsYW5kZXYgPSB3bGFuZGV2OwotCi0JLyogUmVnaXN0ZXIgdGhlIHdsYW5kZXYsIHRoaXMgZ2V0cyB1cyBhIG5hbWUgYW5kIHJlZ2lzdGVycyB0aGUKLQkgKiBsaW51eCBuZXRkZXZpY2UuCi0JICovCi0JU0VUX01PRFVMRV9PV05FUih3bGFuZGV2LT5uZXRkZXYpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotICAgICAgIFNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgJihwZGV2LT5kZXYpKTsKLSNlbmRpZgotICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi0jaWYgMAotCS8qIFRPRE86IE1vdmUgdGhpcyBhbmQgYW4gaXJxIHRlc3QgaW50byBhbiBoZmEzODR4X3Rlc3RpZigpIHJvdXRpbmUuCi0JICovCi0Jb3V0dyhQUklTTTJTVEFfTUFHSUMsIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JcmVnPWludyggSEZBMzg0eF9TV1NVUFBPUlQod2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIpKTsKLQlpZiAoIHJlZyAhPSBQUklTTTJTVEFfTUFHSUMgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJNQUMgcmVnaXN0ZXIgYWNjZXNzIHRlc3QgZmFpbGVkIVxuIik7Ci0gCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0jZW5kaWYKLQotCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCi0JaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAotCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogaGZhMzg0eF9jb3JlcmVzZXQoKSBmYWlsZWQuXG4iLAotCQkJCWRldl9pbmZvKTsKLQkJCXJlc3VsdCA9IC1FSU87Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCX0KLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCB3bGFuZGV2KTsKLQotCS8qIFNob3VsZG4ndCBhY3R1YWxseSBob29rIHVwIHRoZSBJUlEgdW50aWwgd2UKLQkgKiBfa25vd18gdGhpbmdzIGFyZSBhbHJpZ2h0LiAgQSB0ZXN0IHJvdXRpbmUgd291bGQgaGVscC4KLQkgKi8KLSAgICAgICAJcmVxdWVzdF9pcnEod2xhbmRldi0+bmV0ZGV2LT5pcnEsIGhmYTM4NHhfaW50ZXJydXB0LAotCQlTQV9TSElSUSwgd2xhbmRldi0+bmFtZSwgd2xhbmRldik7Ci0KLQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQotCXJlc3VsdCA9IDA7Ci0KLQlnb3RvIGRvbmU7Ci0KLSBmYWlsZWQ6Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JaWYgKHdsYW5kZXYpCWtmcmVlKHdsYW5kZXYpOwotCWlmIChodykJCWtmcmVlKGh3KTsKLSAgICAgICAgaWYgKGF0dHJfbWVtKSAgICAgICAgaW91bm1hcChhdHRyX21lbSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLSAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0gZG9uZToKLQlEQkZFWElUOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgcHJpc20yc3RhX3JlbW92ZV9wbHgoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0gICAgICAgCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0JaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0KLQkvKiByZXNldCBoYXJkd2FyZSAqLwotCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotICAgICAgICBpZiAocGRldi0+aXJxKQotCQlmcmVlX2lycShwZGV2LT5pcnEsIHdsYW5kZXYpOwotCi0JdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCi0JLyogZnJlZSBsb2NhbCBzdHVmZiAqLwotCWlmIChodykgewotCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQlrZnJlZShodyk7Ci0JfQotCi0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQpOwotCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlrZnJlZSh3bGFuZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBseF9pZF90YmxbXSA9IHsKLQl7Ci0JCVBDSVZFTkRPUl9FVU1JVENPTSwgUENJREVWSUNFX1dMMTEwMDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJFdW1pdGNvbSBXTDExMDAwIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9HTE9CQUxTVU4sIFBDSURFVklDRV9HTDI0MTEwUCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfR0xPQkFMU1VOLCBQQ0lERVZJQ0VfR0wyNDExMFBfQUxULAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9ORVRHRUFSLCBQQ0lERVZJQ0VfTUEzMDEsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX1VTUk9CT1RJQ1MsIFBDSURFVklDRV9VU1IyNDEwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiVVMgUm9ib3RpY3MgVVNSMjQxMCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfTGlua3N5cywgUENJREVWSUNFX1dwYzExV2R0MTEsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJMaW5rc3lzIFdQQzExIHdpdGggV0RUMTEgUENJKFBMWCkgYWRhcHRlciIKLQl9LAotCXsKLQkgICAgICAgIFBDSVZFTkRPUl9OREMsIFBDSURFVklDRV9OQ1AxMzBfUExYLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTkRDIE5ldGJsYXN0ZXIgSUkgUENJKFBMWCkiCi0JfSwKLQl7Ci0JICAgICAgICBQQ0lWRU5ET1JfTkRDLCBQQ0lERVZJQ0VfTkNQMTMwX0FTSUMsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJOREMgTmV0Ymxhc3RlciBJSSBQQ0koVE1DNzE2MCkiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl8zQ09NLCBQQ0lERVZJQ0VfQUlSQ09OTkVDVCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIjNDb20gQWlyQ29ubmVjdCBQQ0kgODAyLjExYiAxMU1iL3MgV0xBTiBDb250cm9sbGVyIgotCX0sCi0JewotCQkwLCAwLCAwLCAwLCAwLCAwLCAwCi0JfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBseF9pZF90YmwpOwotCi0vKiBGdW5jdGlvbiBkZWNsYXJlZCBoZXJlIGJlY2F1c2Ugb2YgcHRyIHJlZmVyZW5jZSBiZWxvdyAqLwotc3RhdGljIGludCBfX2RldmluaXQgcHJpc20yc3RhX3Byb2JlX3BseChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOwotc3RhdGljIHZvaWQgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGx4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHByaXNtMl9wbHhfZHJ2X2lkID0gewotICAgICAgICAubmFtZSA9ICJwcmlzbTJfcGx4IiwKLSAgICAgICAgLmlkX3RhYmxlID0gcGx4X2lkX3RibCwKLSAgICAgICAgLnByb2JlID0gcHJpc20yc3RhX3Byb2JlX3BseCwKLSAgICAgICAgLnJlbW92ZSA9IHByaXNtMnN0YV9yZW1vdmVfcGx4LAotI2lmZGVmIENPTkZJR19QTQotICAgICAgICAuc3VzcGVuZCA9IHByaXNtMnN0YV9zdXNwZW5kX3BjaSwKLSAgICAgICAgLnJlc3VtZSA9IHByaXNtMnN0YV9yZXN1bWVfcGNpLAotI2VuZGlmCi19OwotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IHByaXNtMnBseF9pbml0KHZvaWQpCi17Ci0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiJXMgTG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTJfcGx4X2Rydl9pZCk7Ci19OwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ycGx4X2NsZWFudXAodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9wbHhfZHJ2X2lkKTsKLX07Ci0KLW1vZHVsZV9pbml0KHByaXNtMnBseF9pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMnBseF9jbGVhbnVwKTsKLQotI2VuZGlmIC8vIE1PRFVMRQotCi0KLWludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0KLSNkZWZpbmUgQ09SX09GRlNFVAkweDNlMAkvKiBDT1IgYXR0cmlidXRlIG9mZnNldCBvZiBQcmlzbTIgUEMgY2FyZCAqLwotI2RlZmluZSBDT1JfVkFMVUUJMHg0MQkvKiBFbmFibGUgUEMgY2FyZCB3aXRoIGlycSBpbiBsZXZlbCB0cmlnZ2VyICovCi0KLSNkZWZpbmUgSENSX09GRlNFVAkweDNlMgkvKiBIQ1IgYXR0cmlidXRlIG9mZnNldCBvZiBQcmlzbTIgUEMgY2FyZCAqLwotCi0JVUlOVDgJCWNvcnNhdmU7Ci0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19ERUJVRygzLCAiRG9pbmcgcmVzZXQgdmlhIGRpcmVjdCBDT1IgYWNjZXNzLlxuIik7Ci0KLQkvKiBDb2xsZWN0IENPUiAqLwotCWNvcnNhdmUgPSByZWFkYihody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCS8qIFdyaXRlIHJlc2V0IGJpdCAoQklUNykgKi8KLQl3cml0ZWIoY29yc2F2ZSB8IEJJVDcsIGh3LT5tZW1iYXNlICsgQ09SX09GRlNFVCk7Ci0JLyogSG9sZCBmb3IgaG9sZHRpbWUgKi8KLQltZGVsYXkoaG9sZHRpbWUpOwotCi0JaWYgKGdlbmVzaXMpIHsKLQkJd3JpdGViKGdlbmVzaXMsIGh3LT5tZW1iYXNlICsgSENSX09GRlNFVCk7Ci0JCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JCW1kZWxheShob2xkdGltZSk7Ci0JfQotCi0JLyogQ2xlYXIgcmVzZXQgYml0ICovCi0Jd3JpdGViKGNvcnNhdmUgJiB+QklUNywgaHctPm1lbWJhc2UgKyBDT1JfT0ZGU0VUKTsKLQkvKiBXYWl0IGZvciBzZXR0bGV0aW1lICovCi0JbWRlbGF5KHNldHRsZXRpbWUpOwotCS8qIFNldCBub24tcmVzZXQgYml0cyBiYWNrIHdoYXQgdGhleSB3ZXJlICovCi0Jd3JpdGViKGNvcnNhdmUsIGh3LT5tZW1iYXNlICsgQ09SX09GRlNFVCk7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3VzYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDViZTIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl91c2IuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0jZGVmaW5lIFdMQU5fSE9TVElGIFdMQU5fVVNCCi0jaW5jbHVkZSAiaGZhMzg0eF91c2IuYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2Vycm9yICJwcmlzbTJfdXNiIHJlcXVpcmVzIGF0IGxlYXN0IGEgMi40Lngga2VybmVsISIKLSNlbmRpZgotCi0jZGVmaW5lIFBSSVNNX1VTQl9ERVZJQ0UodmlkLCBwaWQsIG5hbWUpIFwKLSAgICAgICAgICAgVVNCX0RFVklDRSh2aWQsIHBpZCksICBcCi0gICAgICAgICAgIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSBuYW1lCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfcHJpc21fdGJsW10gPSB7Ci0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGJiLCAweDA5MjIsICJJT0RhdGEgQWlyUG9ydCBXTi1CMTEvVVNCUyIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMiwgIkNvcmVnYSBXaXJlbGVzcyBMQU4gVVNCIFN0aWNrLTExIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDlhYSwgMHgzNjQyLCAiUHJpc20yLnggMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MDgsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MjEsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzYsICJMaW5rc3lzIFdVU0IxMXYzLjAgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTIsICJMaW5rc3lzIFdVU0IxMXYyLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTMsICJMaW5rc3lzIFdVU0IxMnYxLjEgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjdjLCAweDEwMjIsICJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDlmLCAweDAwMzMsICJDb21wYXEvSW50ZWwgVzEwMCBQUk8vV2lyZWxlc3MgMTFNYnBzIG11bHRpcG9ydCBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMTYsICJNZWxjbyBXTEktVVNCLVMxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDhkZSwgMHg3YTAxLCAiUFJJU00yNSBJRUVFIDgwMi4xMSBNaW5pIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4ODA4NiwgMHgxMTExLCAiSW50ZWwgUFJPL1dpcmVsZXNzIDIwMTFCIExBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBkOGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0NWUsIDB4MDA2ZSwgIk1pY3Jvc29mdCBNTjUxMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA5NjcsIDB4MDIwNCwgIkFjZXIgV2FycGxpbmsgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDIsICJaLUNvbSA3MjUvNzI2IFByaXNtMi41IFVTQi9VU0IgSW50ZWdyYXRlZCIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBjZGUsIDB4MDAwNSwgIlotQ29tIFhsNzM1IFdpcmVsZXNzIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHg0MTNjLCAweDgxMDAsICJEZWxsIFRydWVNb2JpbGUgMTE4MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMSwgIkFMTE5FVCAwMTkzIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGIzYiwgMHgxNjAyLCAiWnlYRUwgWnlBSVIgQjIwMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBiYWYsIDB4MDBlYiwgIlVTUm9ib3RpY3MgVVNSMTEyMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDAyNywgIk1lbGNvIFdMSS1VU0ItS1MxMUcgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKLSAgICAgICAge1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGYxLCAweDMwMDksICJKVkMgTVAtWFA3MjUwIEJ1aWx0aW4gVVNCIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA4NDYsIDB4NDExMCwgIk5ldEdlYXIgTUExMTEiKX0sCi0gICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDNmMywgMHgwMDIwLCAiQWRhcHRlYyBBV04tODAyMCBVU0IgV0xBTiBBZGFwdGVyIil9LAotLy8Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYWNlLCAweDEyMDEsICJaeURBUyBaRDEyMDEgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJBU1VTLVdMMTQwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MjAwMSwgMHgzNzAwLCAiRFdMLTEyMiBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMiwgIkRXTC0xMjAgUmV2IEYgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHg1MGMyLCAweDQwMTMsICJBdmVyYXRlYyBVU0IgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MmMwMiwgMHgxNGVhLCAiUGxhbmV4IEdXLVVTMTFIIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDE2OGIsICJBaXJ2YXN0IFBSSVNNMyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAzLCAiVC1TaW51cyAxMTEgVVNCIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDI4MjEsIDB4MzMwMCwgIkhhd2tpbmcgSGlnaERCIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDQ0LCAiTWVsY28gV0xJLVVTQi1LQjExIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDYxMDYsICJST1BFWCBGcmVlTGFuIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDQwMTcsICJQaGVlbmV0IFdMLTUwM0lBIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmIyLCAweDAzMDIsICJBbWJpdCBNaWNyb3N5c3RlbXMgQ29ycC4iKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHg5MDE2LCAweDE4MmQsICJTaXRlY29tIFdMLTAyMiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDU0MywgMHgwZjAxLCAiVmlld1NvbmljIEFpcnN5bmMgVVNCIEFkYXB0ZXIgMTFNYnBzIChQcmlzbTIuNSkiKX0sCi0JeyAvKiB0ZXJtaW5hdG9yICovIH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfcHJpc21fdGJsKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9wcm9iZV91c2IKLSoKLSogUHJvYmUgcm91dGluZSBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0Ci0qCWlmbnVtCQlpbnRlcmZhY2UgbnVtYmVyIGJlaW5nIG9mZmVyZWQKLSoKLSogUmV0dXJuczoKLSoJTlVMTAkJLSB3ZSdyZSBub3QgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UKLSoJbm9uLU5VTEwJLSB3ZSBhcmUgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UgYW5kCi0qCQkJICB0aGlzIGlzIGEgcHRyIHRvIHRoZSBkYXRhIHdlIHdhbnQgYmFjawotKgkJCSAgd2hlbiBkaXNjb25uZWN0IGlzIGNhbGxlZC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCUknbSBub3Qgc3VyZSwgYXNzdW1lIGl0J3MgaW50ZXJydXB0LgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCAqcHJpc20yc3RhX3Byb2JlX3VzYigKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCXVuc2lnbmVkIGludCBpZm51bSwKLQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi0jZWxzZQotc3RhdGljIGludCBwcmlzbTJzdGFfcHJvYmVfdXNiKAotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCi0JY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQotI2VuZGlmCi17Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0jZWxzZQotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7Ci0jZW5kaWYKLQotCXdsYW5kZXZpY2VfdAkqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CSpodyA9IE5VTEw7Ci0JaW50ICAgICAgICAgICAgICByZXN1bHQgPSAwOwotCi0JREJGRU5URVI7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCWludGVyZmFjZSA9ICZkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2lmbnVtXTsKLSNlbHNlCi0JZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwotI2VuZGlmCi0KLQotCWlmICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgaHcgZGF0YSAqLwotCWhmYTM4NHhfY3JlYXRlKGh3LCBkZXYpOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIFJlZ2lzdGVyIHRoZSB3bGFuZGV2LCB0aGlzIGdldHMgdXMgYSBuYW1lIGFuZCByZWdpc3RlcnMgdGhlCi0JICogbGludXggbmV0ZGV2aWNlLgotCSAqLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotCVNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgJihpbnRlcmZhY2UtPmRldikpOwotI2VuZGlmCi0gICAgICAgIGlmICggcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0KLQkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwotCWlmIChwcmlzbTJfZG9yZXNldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBoZmEzODR4X2NvcmVyZXNldCgpIGZhaWxlZC5cbiIsCi0JCQkJZGV2X2luZm8pOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQl9Ci0KLSNpZm5kZWYgTkVXX01PRFVMRV9DT0RFCi0JdXNiX2luY19kZXZfdXNlKGRldik7Ci0jZW5kaWYKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkpCi0JdXNiX2dldF9kZXYoZGV2KTsKLSNlbmRpZgotCi0Jd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0KLQlnb3RvIGRvbmU7Ci0KLSBmYWlsZWQ6Ci0JaWYgKHdsYW5kZXYpCWtmcmVlKHdsYW5kZXYpOwotCWlmIChodykJCWtmcmVlKGh3KTsKLQl3bGFuZGV2ID0gTlVMTDsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JcmV0dXJuIHdsYW5kZXY7Ci0jZWxzZQotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCB3bGFuZGV2KTsKLQlyZXR1cm4gcmVzdWx0OwotI2VuZGlmCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYgotKgotKiBDYWxsZWQgd2hlbiBhIGRldmljZSBwcmV2aW91c2x5IGNsYWltZWQgYnkgcHJvYmUgaXMgcmVtb3ZlZAotKiBmcm9tIHRoZSBVU0IuCi0qCi0qIEFyZ3VtZW50czoKLSoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0Ci0qCXB0cgkJcHRyIHJldHVybmVkIGJ5IHByb2JlKCkgd2hlbiB0aGUgZGV2aWNlCi0qICAgICAgICAgICAgICAgICAgICAgICB3YXMgY2xhaW1lZC4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdAotcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKnB0cikKLSNlbHNlCi1zdGF0aWMgdm9pZAotcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCi0jZW5kaWYKLXsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotI2Vsc2UKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopcHRyOwotI2VuZGlmCi0KLSAgICAgICAgREJGRU5URVI7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0jZW5kaWYKLQotCWlmICggd2xhbmRldiAhPSBOVUxMICkgewotCQlMSVNUX0hFQUQoY2xlYW5saXN0KTsKLQkJc3RydWN0IGxpc3RfaGVhZAkqZW50cnk7Ci0JCXN0cnVjdCBsaXN0X2hlYWQJKnRlbXA7Ci0JCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQotCQlpZiAoIWh3KQotCQkJZ290byBleGl0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwotCi0JCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5yZWFwYWJsZSwgJmNsZWFubGlzdCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5jb21wbGV0aW5nLCAmY2xlYW5saXN0KTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLnBlbmRpbmcsICZjbGVhbmxpc3QpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuYWN0aXZlLCAmY2xlYW5saXN0KTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwotCi0JCS8qIFRoZXJlJ3Mgbm8gaGFyZHdhcmUgdG8gc2h1dGRvd24sIGJ1dCB0aGUgZHJpdmVyCi0JCSAqIG1pZ2h0IGhhdmUgc29tZSB0YXNrcyBvciB0YXNrbGV0cyB0aGF0IG11c3QgYmUKLQkJICogc3RvcHBlZCBiZWZvcmUgd2UgY2FuIHRlYXIgZXZlcnl0aGluZyBkb3duLgotCQkgKi8KLQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCi0JCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT50aHJvdHRsZSk7Ci0JCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXF0aW1lcik7Ci0JCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXNwdGltZXIpOwotCi0JCS8qIFVubGluayBhbGwgdGhlIFVSQnMuIFRoaXMgInJlbW92ZXMgdGhlIHdoZWVscyIKLQkJICogZnJvbSB0aGUgZW50aXJlIENUTFggaGFuZGxpbmcgbWVjaGFuaXNtLgotCQkgKi8KLQkJdXNiX2tpbGxfdXJiKCZody0+cnhfdXJiKTsKLQkJdXNiX2tpbGxfdXJiKCZody0+dHhfdXJiKTsKLQkJdXNiX2tpbGxfdXJiKCZody0+Y3RseF91cmIpOwotCi0JCXRhc2tsZXRfa2lsbCgmaHctPmNvbXBsZXRpb25fYmgpOwotCQl0YXNrbGV0X2tpbGwoJmh3LT5yZWFwZXJfYmgpOwotCi0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KLQkJLyogTm93IHdlIGNvbXBsZXRlIGFueSBvdXRzdGFuZGluZyBjb21tYW5kcwotCQkgKiBhbmQgdGVsbCBldmVyeW9uZSB3aG8gaXMgd2FpdGluZyBmb3IgdGhlaXIKLQkJICogcmVzcG9uc2VzIHRoYXQgd2UgaGF2ZSBzaHV0IGRvd24uCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2xlYW5saXN0KSB7Ci0JCQloZmEzODR4X3VzYmN0bHhfdAkqY3RseDsKLQotCQkJY3RseCA9IGxpc3RfZW50cnkoZW50cnksIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKLQkJCWNvbXBsZXRlKCZjdGx4LT5kb25lKTsKLQkJfQotCi0JCS8qIEdpdmUgYW55IG91dHN0YW5kaW5nIHN5bmNocm9ub3VzIGNvbW1hbmRzCi0JCSAqIGEgY2hhbmNlIHRvIGNvbXBsZXRlLiBBbGwgdGhleSBuZWVkIHRvIGRvCi0JCSAqIGlzICJ3YWtlIHVwIiwgc28gdGhhdCdzIGVhc3kuCi0JCSAqIChJJ2QgbGlrZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgcmVhbGx5LikKLQkJICovCi0JCW1zbGVlcCgxMDApOwotCi0JCS8qIE5vdyBkZWxldGUgdGhlIENUTFhzLCBiZWNhdXNlIG5vLW9uZSBlbHNlIGNhbiBub3cuICovCi0JCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdGVtcCwgJmNsZWFubGlzdCkgewotCQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7Ci0KLQkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7Ci0JCQlrZnJlZShjdGx4KTsKLQkJfQotCi0JCS8qIFVuaG9vayB0aGUgd2xhbmRldiAqLwotCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQotI2lmbmRlZiBORVdfTU9EVUxFX0NPREUKLQkJdXNiX2RlY19kZXZfdXNlKGh3LT51c2IpOwotI2VuZGlmCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpKQotCQl1c2JfcHV0X2Rldihody0+dXNiKTsKLSNlbmRpZgotCi0JCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCWtmcmVlKGh3KTsKLQotCQlrZnJlZSh3bGFuZGV2KTsKLQl9Ci0KLSBleGl0OgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwotI2VuZGlmCi0JREJGRVhJVDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcHJpc20yX3VzYl9kcml2ZXIgPSB7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwxOSkpICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTYpKQotCS5vd25lciA9IFRISVNfTU9EVUxFLAotI2VuZGlmCi0JLm5hbWUgPSAicHJpc20yX3VzYiIsCi0JLnByb2JlID0gcHJpc20yc3RhX3Byb2JlX3VzYiwKLQkuZGlzY29ubmVjdCA9IHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYiwKLQkuaWRfdGFibGUgPSB1c2JfcHJpc21fdGJsLAotCS8qIGZvcHMsIG1pbm9yPyAqLwotfTsKLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBwcmlzbTJ1c2JfaW5pdCh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoIiVzIExvYWRlZFxuIiwgdmVyc2lvbik7Ci0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiZGV2X2luZm8gaXM6ICVzXG4iLCBkZXZfaW5mbyk7Ci0KLQkvKiBUaGlzIGNhbGwgd2lsbCByZXN1bHQgaW4gY2FsbHMgdG8gcHJpc20yc3RhX3Byb2JlX3VzYi4gKi8KLQlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwcmlzbTJfdXNiX2RyaXZlcik7Ci0KLQlEQkZFWElUOwotfTsKLQotc3RhdGljIHZvaWQgX19leGl0IHByaXNtMnVzYl9jbGVhbnVwKHZvaWQpCi17Ci0gICAgICAgIERCRkVOVEVSOwotCi0JdXNiX2RlcmVnaXN0ZXIoJnByaXNtMl91c2JfZHJpdmVyKTsKLQotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIFVubG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQotCURCRkVYSVQ7Ci19OwotCi1tb2R1bGVfaW5pdChwcmlzbTJ1c2JfaW5pdCk7Ci1tb2R1bGVfZXhpdChwcmlzbTJ1c2JfY2xlYW51cCk7Ci0KLSNlbmRpZiAvLyBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwppbmRleCBjOTc1MDI1Li5mMTcyN2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCkBAIC02MSwxMCArNjEsNiBAQAogLyogU3lzdGVtIEluY2x1ZGVzICovCiAjZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNzksMTkgKzc1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLSNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKQEAgLTEwOSw4OSArOTMsMTIgQEAKICNpbmNsdWRlICJoZmEzODR4LmgiCiAjaW5jbHVkZSAicHJpc20ybWdtdC5oIgogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgQ29uc3RhbnRzICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIE1hY3JvcyAqLwotCiAvKiBDb252ZXJ0cyA4MDIuMTEgZm9ybWF0IHJhdGUgc3BlY2lmaWNhdGlvbnMgdG8gcHJpc20yICovCiAjZGVmaW5lIHA4MDIxMXJhdGVfdG9fcDJiaXQobikJKCgoKG4pJn5CSVQ3KSA9PSAyKSA/IEJJVDAgOiBcCiAJCQkJICgoKG4pJn5CSVQ3KSA9PSA0KSA/IEJJVDEgOiBcCiAJCQkJICgoKG4pJn5CSVQ3KSA9PSAxMSkgPyBCSVQyIDogXAogCQkJCSAoKChuKSZ+QklUNykgPT0gMjIpID8gQklUMyA6IDApCiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBUeXBlcyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcG93ZXJtZ210Ci0qCi0qIFNldCB0aGUgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBvZiB0aGlzIHN0YXRpb24ncyBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9wb3dlcm1nbXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfcG93ZXJtZ210X3QJKm1zZyA9IG1zZ3A7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKgotCQkgKiBTZXQgQ05GUE1FTkFCTEVEIChvbiBvciBvZmYpCi0JCSAqIFNldCBDTkZNVUxUSUNBU1RSWCAoaWYgUE0gb24sIG90aGVyd2lzZSBjbGVhcikKLQkJICogU3BvdXQgYSBub3RpY2Ugc3RhdGluZyB0aGF0IFNsZWVwRHVyYXRpb24gYW5kCi0JCSAqIEhvbGRvdmVyRHVyYXRpb24gYW5kIFBNRVBTIGFsc28gaGF2ZSBhbiBpbXBhY3QuCi0JCSAqLwotCQkvKiBQb3dlcm1nbXQgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciBTVEEgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBQb3dlcm1nbXQgaXMgbmV2ZXIgc3VwcG9ydGVkIGZvciBBUCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9zY2FuCiAqCkBAIC0yMjEsNyArMTI4LDcgQEAKIAlpbnQgCQkJcmVzdWx0ID0gMDsKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fdAkqbXNnID0gbXNncDsKLSAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcm9hbWluZ21vZGUsIHdvcmQ7CisgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgIHJvYW1pbmdtb2RlLCB3b3JkOwogCWludCAgICAgICAgICAgICAgICAgICAgIGksIHRpbWVvdXQ7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgaXN0bXBlbmFibGUgPSAwOwogCkBAIC0yMjksMTMgKzEzNiw2IEBACiAKIAlEQkZFTlRFUjsKIAotICAgICAgICBpZiAoaHctPmFwKSB7Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfRVJST1IoIlByaXNtMiBpbiBBUCBtb2RlIGNhbm5vdCBwZXJmb3JtIHNjYW5zLlxuIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIGdhdGVrZWVwZXIgY2hlY2sgKi8KICAgICAgICAgaWYgKEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTihody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsCkBAIC0yOTYsNyArMTk2LDcgQEAKICAgICAgICAgLyogc2V0IHVwIHRoZSBjaGFubmVsIGxpc3QgKi8KICAgICAgICAgd29yZCA9IDA7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPmNoYW5uZWxsaXN0LmRhdGEubGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBVSU5UOCBjaGFubmVsID0gbXNnLT5jaGFubmVsbGlzdC5kYXRhLmRhdGFbaV07CisgICAgICAgICAgICAgICAgdTggY2hhbm5lbCA9IG1zZy0+Y2hhbm5lbGxpc3QuZGF0YS5kYXRhW2ldOwogICAgICAgICAgICAgICAgIGlmIChjaGFubmVsID4gMTQpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgMSBpcyBCSVQwIC4uLiBjaGFubmVsIDE0IGlzIEJJVDEzICovCiAgICAgICAgICAgICAgICAgd29yZCB8PSAoMSA8PCAoY2hhbm5lbC0xKSk7CkBAIC0zMTcsNyArMjE3LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAlpZiAod29yZCA9PSBIRkEzODR4X1BPUlRTVEFUVVNfRElTQUJMRUQpIHsKLQkJVUlOVDE2IHdvcmRidWZbMTddOworCQl1MTYgd29yZGJ1ZlsxN107CiAKIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LAogCQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsCkBAIC00ODAsMTIgKzM4MCw2IEBACiAKIAlyZXEtPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCi0JaWYgKGh3LT5hcCkgewotCQlyZXN1bHQgPSAxOwotCQlyZXEtPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQlnb3RvIGV4aXQ7Ci0JfQotCiAJaWYgKCEgaHctPnNjYW5yZXN1bHRzKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJkb3QxMXJlcV9zY2FuX3Jlc3VsdHMgY2FuIG9ubHkgYmUgdXNlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgZG90MTFyZXFfc2Nhbi5cbiIpOwogCQlyZXN1bHQgPSAyOwpAQCAtNjEyLDU2NyArNTA2LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2pvaW4KLSoKLSogSm9pbiBhIEJTUyB3aG9zZSBCU1MgZGVzY3JpcHRpb24gd2FzIHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aAotKiBhIHNjYW4uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2pvaW5fdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBUT0RPOiBJbXBsZW1lbnQgYWZ0ZXIgc2NhbiAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBieSBBUHMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcDJfam9pbgotKgotKiBKb2luIGEgc3BlY2lmaWMgQlNTCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9wMl9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2pvaW5fdAkqbXNnID0gbXNncDsKLQlVSU5UMTYJCQlyZWc7Ci0JcDgwMjExcHN0cmRfdAkJKnBzdHI7Ci0JVUlOVDgJCQlieXRlYnVmWzI1Nl07Ci0JaGZhMzg0eF9ieXRlc3RyX3QJKnAyYnl0ZXN0ciA9IChoZmEzODR4X2J5dGVzdHJfdCopYnl0ZWJ1ZjsKLSAgICAgICAgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QJam9pbnJlcTsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9OT05FOwotCi0JCS8qKiogU1RBVElPTiAqKiovCi0JCS8qIFNldCB0aGUgUG9ydFR5cGUgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCQkvKiBlc3MgcG9ydCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAxKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBQb3J0IFR5cGVcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIGF1dGggdHlwZSAqLwotCQlpZiAoIG1zZy0+YXV0aHR5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2F1dGhhbGdfc2hhcmVka2V5ICkgewotCQkJcmVnID0gSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9TSEFSRURLRVk7Ci0JCX0gZWxzZSB7Ci0JCQlyZWcgPSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX09QRU5TWVNURU07Ci0JCX0KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTiwgcmVnKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBBdXRoZW50aWNhdGlvblxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIFR1cm4gb2ZmIGFsbCByb2FtaW5nICovCi0JCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsIDMpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gVHVybiBvZmYgUm9hbWluZ1xuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIEJhc2ljIHJhdGVzICovCi0gICAgICAgICAgICAgICAgcmVnID0gMDsKLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTEuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyA9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUxLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTIuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTMuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTUuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTYuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTguZGF0YSk7Ci0JCX0KLQkJaWYoIHJlZyA9PSAwKQotCQkJIHJlZyA9IDB4MDM7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUywgcmVnKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBiYXNpY3JhdGVzPSVkLlxuIiwgcmVnKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogT3BlcmF0aW9uYWwgcmF0ZXMgKHN1cHByYXRlcyBhbmQgdHhyYXRlY29udHJvbCkgKi8KLQkJcmVnID0gMDsKLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTEuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyA9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUxLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTIuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTMuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTUuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTYuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNi5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTguZGF0YSk7Ci0JCX0KLQkJaWYoIHJlZyA9PSAwKQotCQkJIHJlZyA9IDB4MGY7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCByZWcpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHN1cHByYXRlcz0lZC5cbiIsIHJlZyk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0gCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgdHhyYXRlcz0lZC5cbiIsIHJlZyk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIFNldCB0aGUgc3NpZCAqLwotCQltZW1zZXQoYnl0ZWJ1ZiwgMCwgMjU2KTsKLQkJcHN0ciA9IChwODAyMTFwc3RyZF90KikmKG1zZy0+c3NpZC5kYXRhKTsKLQkJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZygKLQkJCWh3LCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwKLQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTik7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgU1NJRFxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9lbmFibGUoaHcsIDApOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJFbmFibGUgbWFjcG9ydCBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIEZpbGwgaW4gdGhlIGpvaW4gcmVxdWVzdCAqLwotCQlqb2lucmVxLmNoYW5uZWwgPSBtc2ctPmNoYW5uZWwuZGF0YTsKLQkJbWVtY3B5KCBqb2lucmVxLmJzc2lkLCAoKHVuc2lnbmVkIGNoYXIgKikgJm1zZy0+YnNzaWQuZGF0YSkgKyAxLCBXTEFOX0JTU0lEX0xFTik7Ci0JCWh3LT5qb2lucmVxID0gam9pbnJlcTsKLQkJaHctPmpvaW5fYXAgPSAxOwotCi0JCS8qIFNlbmQgdGhlIGpvaW4gcmVxdWVzdCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywKLQkJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNULAotCQkJJmpvaW5yZXEsIEhGQTM4NHhfUklEX0pPSU5SRVFVRVNUX0xFTik7Ci0gICAgICAgICAgICAgICAgaWYocmVzdWx0ICE9IDApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJKb2luIHJlcXVlc3QgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBieSBBUHMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLSAgICAgICAgZ290byBkb25lOwotZmFpbGVkOgotCVdMQU5fTE9HX0RFQlVHKDEsICJGYWlsZWQgdG8gc2V0IGEgY29uZmlnIG9wdGlvbiwgcmVzdWx0PSVkXG4iLCByZXN1bHQpOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ludmFsaWRfcGFyYW1ldGVyczsKLQotZG9uZToKLSAgICAgICAgcmVzdWx0ID0gMDsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hdXRoZW50aWNhdGUKLSoKLSogU3RhdGlvbiBzaG91bGQgYmUgYmVnaW4gYW4gYXV0aGVudGljYXRpb24gZXhjaGFuZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXRoZW50aWNhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogRGVjaWRlIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kbGUgdGhpcyBvbmUgdy8gUHJpc20yICovCi0JCS8qICAgICAgIEl0IGNvdWxkIGJlIGVudGVydGFpbmluZyBzaW5jZSBQcmlzbTIgZG9lc24ndCBoYXZlICAqLwotCQkvKiAgICAgICBhbiBleHBsaWNpdCB3YXkgdG8gY29udHJvbCB0aGlzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIGJ5IEFQcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9kZWF1dGhlbnRpY2F0ZQotKgotKiBTZW5kIGEgZGVhdXRoZW50aWNhdGUgbm90aWZpY2F0aW9uLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZGVhdXRoZW50aWNhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBUT0RPOiBEZWNpZGUgaG93IHdlJ3JlIGdvaW5nIHRvIGhhbmRsZSB0aGlzIG9uZSB3LyBQcmlzbTIgKi8KLQkJLyogICAgICAgSXQgY291bGQgYmUgZW50ZXJ0YWluaW5nIHNpbmNlIFByaXNtMiBkb2Vzbid0IGhhdmUgICovCi0JCS8qICAgICAgIGFuIGV4cGxpY2l0IHdheSB0byBjb250cm9sIHRoaXMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQkJaGZhMzg0eF9kcnZyX2hhbmRvdmVyKGh3LCBtc2ctPnBlZXJzdGFhZGRyZXNzLmRhdGEuZGF0YSk7Ci0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2Fzc29jaWF0ZQotKgotKiBBc3NvY2lhdGUgd2l0aCBhbiBFU1MuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQlwODAyMTFtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLSNpZiAwCi0JCS8qIFNldCB0aGUgVHhSYXRlcyAqLwotCQlyZWcgPSAweDAwMGY7Ci0JCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgcmVnKTsKLSNlbmRpZgotCi0JCS8qIFNldCB0aGUgUG9ydFR5cGUgKi8KLQkJLyogZXNzIHBvcnQgKi8KLQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMSk7Ci0KLQkJLyogRW5hYmxlIHRoZSBQb3J0ICovCi0JCWhmYTM4NHhfZHJ2cl9lbmFibGUoaHcsIDApOwotCi0JCS8qIFNldCB0aGUgcmVzdWx0Y29kZSAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIG9uIEFQICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3JlYXNzb2NpYXRlCi0qCi0qIFJlbmV3IGFzc29jaWF0aW9uIGJlY2F1c2Ugb2YgYSBCU1MgY2hhbmdlLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmVhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBUT0RPOiBOb3Qgc3VwcG9ydGVkIHlldC4uLm5vdCBzdXJlIGhvdyB3ZSdyZSBnb2luZyB0byBkbyBpdCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBvbiBBUCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUKLSoKLSogU2VuZCBhIGRpc2Fzc29jaWF0aW9uIG5vdGlmaWNhdGlvbi4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2Rpc2Fzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBUT0RPOiBOb3Qgc3VwcG9ydGVkIHlldC4uLm5vdCBzdXJlIGhvdyB0byBkbyBpdCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCQloZmEzODR4X2RydnJfaGFuZG92ZXIoaHcsIG1zZy0+cGVlcnN0YWFkZHJlc3MuZGF0YS5kYXRhKTsKLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcmVzZXQKLSoKLSogUmVzZXQgdGhlIE1BQyBhbmQgTVNELiAgVGhlIHA4MDIxMSBsYXllciBoYXMgaXQncyBvd24gaGFuZGxpbmcKLSogdGhhdCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgZnVuY3Rpb24uCi0qIFByb2NlZHVyZToKLSogICAtIGRpc2FibGUgc3lzdGVtIGludGVycnVwdHMgPz8KLSogICAtIGRpc2FibGUgTUFDIGludGVycnVwdHMKLSogICAtIHJlc3RvcmUgc3lzdGVtIGludGVycnVwdHMKLSogICAtIGlzc3VlIHRoZSBNQUMgaW5pdGlhbGl6ZSBjb21tYW5kCi0qICAgLSBjbGVhciBhbnkgTVNEIGxldmVsIHN0YXRlIChpbmNsdWRpbmcgdGltZXJzLCBxdWV1ZWQgZXZlbnRzLAotKiAgICAgZXRjLikuICBOb3RlIHRoYXQgaWYgd2UncmUgcmVtb3ZpbmcgdGltZXInZC9xdWV1ZSBldmVudHMsIHdlIG1heQotKiAgICAgbmVlZCB0byBoYXZlIHJlbWFpbmVkIGluIHRoZSBzeXN0ZW0gaW50ZXJydXB0IGRpc2FibGVkIHN0YXRlLgotKiAgICAgV2Ugc2hvdWxkIGJlIGxlZnQgaW4gdGhlIHNhbWUgc3RhdGUgdGhhdCB3ZSdyZSBpbiBmb2xsb3dpbmcKLSogICAgIGRyaXZlciBpbml0aWFsaXphdGlvbi4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIsIE1BWSBCRSBOVUxMISBmb3IgYSBkcml2ZXIgbG9jYWwKLSoJCQljYWxsLgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQsIGNvbW1vbmx5IHdsYW5jdGwsIGJ1dCBtaWdodCBiZSBybW1vZC9wY2lfY2xvc2UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3Jlc2V0X3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQkvKgotCSAqIFRoaXMgaXMgc3VwcG9ydGVkIG9uIGJvdGggQVAgYW5kIFNUQSBhbmQgaXQncyBub3QgYWxsb3dlZAotCSAqIHRvIGZhaWwuCi0JICovCi0JaWYgKCBtc2dwICkgewotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCQlXTEFOX0xPR19JTkZPKCJkb3QxMXJlcV9yZXNldDogdGhlIG1hY2FkZHJlc3MgYW5kICIKLQkJCSJzZXRkZWZhdWx0bWliIGFyZ3VtZW50cyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkLlxuIik7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHRoZSBNU0QgbXVzdCBiZSBpbiB0aGUgTVNEUlVOTklORyBzdGF0ZQotCSAqIHRoZXJlZm9yZSwgd2UgbXVzdCBzdG9wIGFuZCB0aGVuIHJlc3RhcnQgdGhlIGh3L01BQyBjb21iby4KLQkgKi8KLQloZmEzODR4X2RydnJfc3RvcChodyk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3N0YXJ0KGh3KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJV0xBTl9MT0dfRVJST1IoImRvdDExcmVxX3Jlc2V0OiBJbml0aWFsaXplIGNvbW1hbmQgZmFpbGVkLCIKLQkJCQkiIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gZnJvbSBoZXJlLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfc3RhcnQKICoKQEAgLTExOTksMTAgKzUzMiw5IEBACiAJcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0X3QJKm1zZyA9IG1zZ3A7CiAKIAlwODAyMTFwc3RyZF90CQkqcHN0cjsKLQlVSU5UOAkJCWJ5dGVidWZbODBdOworCXU4CQkJYnl0ZWJ1Zls4MF07CiAJaGZhMzg0eF9ieXRlc3RyX3QJKnAyYnl0ZXN0ciA9IChoZmEzODR4X2J5dGVzdHJfdCopYnl0ZWJ1ZjsKLQloZmEzODR4X1BDRkluZm9fZGF0YV90CSpwY2ZpbmZvID0gKGhmYTM4NHhfUENGSW5mb19kYXRhX3QqKWJ5dGVidWY7Ci0JVUlOVDE2CQkJd29yZDsKKwl1MTYJCQl3b3JkOwogCURCRkVOVEVSOwogCiAJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9OT05FOwpAQCAtMTIxMCwxNzAgKzU0Miw0NSBAQAogCS8qIFNldCB0aGUgU1NJRCAqLwogCW1lbWNweSgmd2xhbmRldi0+c3NpZCwgJm1zZy0+c3NpZC5kYXRhLCBzaXplb2YobXNnLT5zc2lkLmRhdGEpKTsKIAotCWlmICghaHctPmFwKSB7Ci0JCS8qKiogQURIT0MgSUJTUyAqKiovCi0JCS8qIHNlZSBpZiBjdXJyZW50IGYvdyBpcyBsZXNzIHRoYW4gOGMzICovCi0JCWlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKLQkJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLAotCQkJCQkgICAgIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCkgPAotCQkgICAgSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKDAsOCwzKSkgewotCQkJLyogQWQtSG9jIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgb24gUHJpc20yICovCi0JCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0gIAkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCQkvKiBTZXQgdGhlIFJFUVVJUkVEIGNvbmZpZyBpdGVtcyAqLwotCQkvKiBTU0lEICovCi0JCXBzdHIgPSAocDgwMjExcHN0cmRfdCopJihtc2ctPnNzaWQuZGF0YSk7Ci0JCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZPV05TU0lELAotCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZPd25TU0lEXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwKLQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IENuZkRlc2lyZWRTU0lEXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogYnNzdHlwZSAtIHdlIHVzZSB0aGUgZGVmYXVsdCBpbiB0aGUgYXAgZmlybXdhcmUgKi8KLQkJLyogSUJTUyBwb3J0ICovCi0JCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDApOwotCi0JCS8qIGJlYWNvbiBwZXJpb2QgKi8KLQkJd29yZCA9IG1zZy0+YmVhY29ucGVyaW9kLmRhdGE7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQsIHdvcmQpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJlYWNvbiBwZXJpb2Q9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogZHNjaGFubmVsICovCi0JCXdvcmQgPSBtc2ctPmRzY2hhbm5lbC5kYXRhOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwsIHdvcmQpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGNoYW5uZWw9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCS8qIEJhc2ljIHJhdGVzICovCi0JCXdvcmQgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMS5kYXRhKTsKLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTIuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTIuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTMuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTQuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTUuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTUuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTYuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTcuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTguc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTguZGF0YSk7Ci0JCX0KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBiYXNpY3JhdGVzPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIE9wZXJhdGlvbmFsIHJhdGVzIChzdXBwcmF0ZXMgYW5kIHR4cmF0ZWNvbnRyb2wpICovCi0JCXdvcmQgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMS5kYXRhKTsKLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTIuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTIuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTMuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTQuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTUuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTUuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTYuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTcuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTguc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXdvcmQgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTguZGF0YSk7Ci0JCX0KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMsIHdvcmQpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHN1cHByYXRlcz0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCB0eHJhdGVzPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIFNldCB0aGUgbWFjbW9kZSBzbyB0aGUgZnJhbWUgc2V0dXAgY29kZSBrbm93cyB3aGF0IHRvIGRvICovCi0JCWlmICggbXNnLT5ic3N0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9ic3N0eXBlX2luZGVwZW5kZW50ICkgewotCQkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9JQlNTX1NUQTsKLQkJCS8qIGxldHMgZXh0ZW5kIHRoZSBkYXRhIGxlbmd0aCBhIGJpdCAqLwotCQkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOLCAyMzA0KTsKLQkJfQotCi0JCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRW5hYmxlIG1hY3BvcnQgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCisJLyoqKiBBREhPQyBJQlNTICoqKi8KKwkvKiBzZWUgaWYgY3VycmVudCBmL3cgaXMgbGVzcyB0aGFuIDhjMyAqLworCWlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKKwkJCQkgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsCisJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpIDwKKwkgICAgSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKDAsOCwzKSkgeworCQkvKiBBZC1Ib2Mgbm90IHF1aXRlIHN1cHBvcnRlZCBvbiBQcmlzbTIgKi8KKwkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKKwkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKIAkJZ290byBkb25lOwogCX0KIAotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQogCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CiAKLQkvKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCwgaWYgQlNTdHlwZT1pbmZyYSBpcyB0aGUgdGVydGlhcnkgbG9hZGVkPyAqLwotCWlmICggbXNnLT5ic3N0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9ic3N0eXBlX2luZGVwZW5kZW50ICkgewotCQlXTEFOX0xPR19FUlJPUigiQVAgZHJpdmVyIGNhbm5vdCBjcmVhdGUgSUJTUy5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9IGVsc2UgaWYgKCBody0+Y2FwX3N1cF9zdGEuaWQgIT0gNSkgewotCQlXTEFOX0xPR19FUlJPUigiQVAgZHJpdmVyIGZhaWxlZCB0byBkZXRlY3QgQVAgZmlybXdhcmUuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCisJLyoqKiBTVEFUSU9OICoqKi8KIAkvKiBTZXQgdGhlIFJFUVVJUkVEIGNvbmZpZyBpdGVtcyAqLwogCS8qIFNTSUQgKi8KIAlwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSYobXNnLT5zc2lkLmRhdGEpOwogCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7CiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORk9XTlNTSUQsCi0JCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4pOworCQkJCQkgYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4pOwogCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBTU0lELCByZXN1bHQ9MHglMDR4XG4iLCByZXN1bHQpOworCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZPd25TU0lEXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwKKwkJCQkJIGJ5dGVidWYsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTik7CisJaWYgKCByZXN1bHQgKSB7CisJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IENuZkRlc2lyZWRTU0lEXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJLyogYnNzdHlwZSAtIHdlIHVzZSB0aGUgZGVmYXVsdCBpbiB0aGUgYXAgZmlybXdhcmUgKi8KKwkvKiBJQlNTIHBvcnQgKi8KKwloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAwKTsKIAogCS8qIGJlYWNvbiBwZXJpb2QgKi8KIAl3b3JkID0gbXNnLT5iZWFjb25wZXJpb2QuZGF0YTsKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCB3b3JkKTsKKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFQQkNOaW50LCB3b3JkKTsKIAlpZiAoIHJlc3VsdCApIHsKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmVhY29uIHBlcmlvZD0lZC5cbiIsIHdvcmQpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTE0NDMsOTggKzY1MCwyMCBAQAogCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBzdXBwcmF0ZXM9JWQuXG4iLCB3b3JkKTsKIAkJZ290byBmYWlsZWQ7CiAJfQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAsIHdvcmQpOworCisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCB3b3JkKTsKIAlpZiAoIHJlc3VsdCApIHsKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgdHhyYXRlcz0lZC5cbiIsIHdvcmQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQkvKiBpYnNzYXRpbXdpbmRvdyAqLwotCWlmIChtc2ctPmlic3NhdGltd2luZG93LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2spIHsKLQkJV0xBTl9MT0dfSU5GTygicHJpc20ybWdtdF9zdGFydDogYXRpbXdpbmRvdyBub3QgdXNlZCBpbiAiCi0JCQkgICAgICAgIkluZnJhc3RydWN0dXJlIG1vZGUsIGlnbm9yZWQuXG4iKTsKLQl9Ci0KLQkvKiBEVElNIHBlcmlvZCAqLwotCXdvcmQgPSBtc2ctPmR0aW1wZXJpb2QuZGF0YTsKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORk9XTkRUSU1QRVIsIHdvcmQpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBkdGltIHBlcmlvZD0lZC5cbiIsIHdvcmQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBwcm9iZWRlbGF5ICovCi0JaWYgKG1zZy0+cHJvYmVkZWxheS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCVdMQU5fTE9HX0lORk8oInByaXNtMm1nbXRfc3RhcnQ6IHByb2JlZGVsYXkgbm90ICIKLQkJCSAgICAgICAic3VwcG9ydGVkIGluIHByaXNtMiwgaWdub3JlZC5cbiIpOwotCX0KLQotCS8qIGNmcG9sbGFibGUsIGNmcG9sbHJlcSwgY2ZwcGVyaW9kLCBjZnBtYXhkdXJhdGlvbiAqLwotCWlmIChtc2ctPmNmcG9sbGFibGUuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUgJiYKLQkgICAgbXNnLT5jZnBvbGxyZXEuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJjZnBvbGxhYmxlPWNmcG9sbHJlcT10cnVlIGlzIGlsbGVnYWwuXG4iKTsKLQkJcmVzdWx0ID0gLTE7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIHJlYWQgdGhlIFBDRkluZm8gYW5kIHVwZGF0ZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywKLQkJCQkJcGNmaW5mbywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTik7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0lORk8oInByaXNtMm1nbXRfc3RhcnQ6IHJlYWQocGNmaW5mbykgZmFpbGVkLCAiCi0JCQkJImFzc3VtZSBpdCdzICIKLQkJCQkibm90IHN1cHBvcnRlZCwgcGNmIHNldHRpbmdzIGlnbm9yZWQuXG4iKTsKLQkJZ290byBwY2Zfc2tpcDsKLQl9Ci0JaWYgKChtc2ctPmNmcG9sbGFibGUuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlICYmCi0JICAgICBtc2ctPmNmcG9sbHJlcS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UpICkgewotCSAgICAJcGNmaW5mby0+TWVkaXVtT2NjdXBhbmN5TGltaXQgPSAwOwotCQlwY2ZpbmZvLT5DRlBQZXJpb2QgPSAwOwotCQlwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbiA9IDA7Ci0JCXBjZmluZm8tPkNGUEZsYWdzICY9IGhvc3QyaGZhMzg0eF8xNigoVUlOVDE2KX5CSVQwKTsKLQotCQlpZiAoIG1zZy0+Y2ZwcGVyaW9kLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgfHwKLQkJICAgICBtc2ctPmNmcG1heGR1cmF0aW9uLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlXTEFOX0xPR19XQVJOSU5HKAotCQkJCSJTZXR0aW5nIGNmcHBlcmlvZCBvciBjZnBtYXhkdXJhdGlvbiB3aGVuICIKLQkJCQkiY2Zwb2xsYWJsZSBhbmQgY2ZyZXEgYXJlIGZhbHNlIGlzIHBvaW50bGVzcy5cbiIpOwotCQl9Ci0JfQotCWlmICgobXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlIHx8Ci0JICAgICBtc2ctPmNmcG9sbHJlcS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgKSB7Ci0JCWlmICggbXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSB7Ci0JCQlwY2ZpbmZvLT5DRlBGbGFncyB8PSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNilCSVQwKTsKLQkJfQotCi0JCWlmICggbXNnLT5jZnBwZXJpb2Quc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vaykgewotCQkJcGNmaW5mby0+Q0ZQUGVyaW9kID0gbXNnLT5jZnBwZXJpb2QuZGF0YTsKLQkJCXBjZmluZm8tPkNGUFBlcmlvZCA9IGhvc3QyaGZhMzg0eF8xNihwY2ZpbmZvLT5DRlBQZXJpb2QpOwotCQl9Ci0KLQkJaWYgKCBtc2ctPmNmcG1heGR1cmF0aW9uLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2spIHsKLQkJCXBjZmluZm8tPkNGUE1heER1cmF0aW9uID0gbXNnLT5jZnBtYXhkdXJhdGlvbi5kYXRhOwotCQkJcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb24gPSBob3N0MmhmYTM4NHhfMTYocGNmaW5mby0+Q0ZQTWF4RHVyYXRpb24pOwotCQkJcGNmaW5mby0+TWVkaXVtT2NjdXBhbmN5TGltaXQgPSBwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbjsKLQkJfQotCX0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sCi0JCQkJCXBjZmluZm8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigid3JpdGUocGNmaW5mbykgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotcGNmX3NraXA6CiAJLyogU2V0IHRoZSBtYWNtb2RlIHNvIHRoZSBmcmFtZSBzZXR1cCBjb2RlIGtub3dzIHdoYXQgdG8gZG8gKi8KLQlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmZyYXN0cnVjdHVyZSApIHsKLQkJd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9FU1NfQVA7CisJaWYgKCBtc2ctPmJzc3R5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5kZXBlbmRlbnQgKSB7CisJCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfSUJTU19TVEE7CiAJCS8qIGxldHMgZXh0ZW5kIHRoZSBkYXRhIGxlbmd0aCBhIGJpdCAqLwogCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4sIDIzMDQpOwogCX0KIAotCS8qIFNldCB0aGUgQlNTSUQgdG8gdGhlIHNhbWUgYXMgb3VyIE1BQyAqLwotCW1lbWNweSggd2xhbmRldi0+YnNzaWQsIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHIsIFdMQU5fQlNTSURfTEVOKTsKLQogCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9lbmFibGUoaHcsIDApOwogCWlmICggcmVzdWx0ICkgewpAQCAtMTU1Niw4MCArNjg1LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2VuYWJsZQotKgotKiBTdGFydCBhIEJTUy4gIEFueSBzdGF0aW9uIGNhbiBkbyB0aGlzIGZvciBJQlNTLCBvbmx5IEFQIGZvciBFU1MuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9lbmFibGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9lbmFibGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCWlmICghaHctPmFwKSB7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQotCQkvKiBBZC1Ib2Mgbm90IHF1aXRlIHN1cHBvcnRlZCBvbiBQcmlzbTIgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQkvKiBJcyB0aGUgdGVydGlhcnkgbG9hZGVkPyAqLwotCWlmICggaHctPmNhcF9zdXBfc3RhLmlkICE9IDUpIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFQIGRyaXZlciBmYWlsZWQgdG8gZGV0ZWN0IEFQIGZpcm13YXJlLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIFNldCB0aGUgbWFjbW9kZSBzbyB0aGUgZnJhbWUgc2V0dXAgY29kZSBrbm93cyB3aGF0IHRvIGRvICovCi0Jd2xhbmRldi0+bWFjbW9kZSA9IFdMQU5fTUFDTU9ERV9FU1NfQVA7Ci0KLQkvKiBTZXQgdGhlIEJTU0lEIHRvIHRoZSBzYW1lIGFzIG91ciBNQUMgKi8KLQltZW1jcHkoIHdsYW5kZXYtPmJzc2lkLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyLCBXTEFOX0JTU0lEX0xFTik7Ci0KLQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkVuYWJsZSBtYWNwb3J0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCWdvdG8gZG9uZTsKLWZhaWxlZDoKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7Ci0KLWRvbmU6Ci0JcmVzdWx0ID0gMDsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWdtdF9yZWFkcGRhCiAqCkBAIC0xNjk2LDQwMiArNzUxLDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcmVhZGNpcwotKgotKiBDb2xsZWN0IHRoZSBDSVMgZGF0YSBhbmQgcHV0IGl0IGluIHRoZSBtZXNzYWdlLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZWFkY2lzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQJCQlyZXN1bHQ7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9yZWFkY2lzX3QJKm1zZyA9IG1zZ3A7Ci0KLQlEQkZFTlRFUjsKLQotICAgICAgICBtZW1zZXQobXNnLT5jaXMuZGF0YSwgMCwgc2l6ZW9mKG1zZy0+Y2lzLmRhdGEpKTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NJUywKLQkJCQkJbXNnLT5jaXMuZGF0YSwgSEZBMzg0eF9SSURfQ0lTX0xFTik7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0lORk8oInByaXNtMm1nbXRfcmVhZGNpczogcmVhZChjaXMpIGZhaWxlZC5cbiIpOwotCQltc2ctPmNpcy5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwotCi0JCX0KLQllbHNlIHsKLQkJbXNnLT5jaXMuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCQl9Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXV4cG9ydF9zdGF0ZQotKgotKiBFbmFibGVzL0Rpc2FibGVzIHRoZSBjYXJkJ3MgYXV4aWxpYXJ5IHBvcnQuICBTaG91bGQgYmUgY2FsbGVkCi0qIGJlZm9yZSBhbmQgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBhdXhwb3J0X3JlYWQoKS9hdXhwb3J0X3dyaXRlKCkKLSogY2FsbHMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1eHBvcnRfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCXA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX3QJKm1zZyA9IG1zZ3A7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQlpZiAobXNnLT5lbmFibGUuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpIHsKLQkJaWYgKCBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKSApIHsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7Ci0JCX0gZWxzZSB7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCQl9Ci0JfSBlbHNlIHsKLQkJaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCX0KLQotI2Vsc2UgLyogIVVTQiAqLwotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCi0jZW5kaWYgLyogV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IgKi8KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXV4cG9ydF9yZWFkCi0qCi0qIENvcGllcyBkYXRhIGZyb20gdGhlIGNhcmQgdXNpbmcgdGhlIGF1eHBvcnQuICBUaGUgYXV4cG9ydCBtdXN0Ci0qIGhhdmUgcHJldmlvdXNseSBiZWVuIGVuYWJsZWQuICBOb3RlOiB0aGlzIGlzIG5vdCB0aGUgd2F5IHRvCi0qIGRvIGRvd25sb2Fkcywgc2VlIHRoZSBbcmFtfGZsYXNoXWRsIGZ1bmN0aW9ucy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF9yZWFkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7Ci0JVUlOVDMyCQkJbWF4bGVuID0gc2l6ZW9mKG1zZy0+ZGF0YS5kYXRhKTsKLQlEQkZFTlRFUjsKLQotCWlmICggaHctPmF1eGVuICkgewotCQlhZGRyID0gbXNnLT5hZGRyLmRhdGE7Ci0JCWxlbiA9IG1zZy0+bGVuLmRhdGE7Ci0JCWJ1ZiA9IG1zZy0+ZGF0YS5kYXRhOwotCQlpZiAoIGxlbiA8PSBtYXhsZW4gKSB7ICAvKiBtYXggcmVhZC93cml0ZSBzaXplICovCi0JCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsIGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywgYnVmLCBsZW4pOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJfSBlbHNlIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsIkF0dGVtcHQgdG8gcmVhZCA+IG1heGxlbiBmcm9tIGF1eHBvcnQuXG4iKTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3JlZnVzZWQ7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3JlZnVzZWQ7Ci0JfQotCW1zZy0+ZGF0YS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfRVJST1IoInByaXNtMm1nbXRfYXV4cG9ydF9yZWFkOiBOb3Qgc3VwcG9ydGVkIG9uIFVTQi5cbiIpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUKLSoKLSogQ29waWVzIGRhdGEgdG8gdGhlIGNhcmQgdXNpbmcgdGhlIGF1eHBvcnQuICBUaGUgYXV4cG9ydCBtdXN0Ci0qIGhhdmUgcHJldmlvdXNseSBiZWVuIGVuYWJsZWQuICBOb3RlOiB0aGlzIGlzIG5vdCB0aGUgd2F5IHRvCi0qIGRvIGRvd25sb2Fkcywgc2VlIHRoZSBbcmFtfGZsYXNoXWRsIGZ1bmN0aW9ucy4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV90CSptc2cgPSBtc2dwOwotCVVJTlQzMgkJCWFkZHI7Ci0JVUlOVDMyCQkJbGVuOwotCVVJTlQ4KgkJCWJ1ZjsKLQlVSU5UMzIJCQltYXhsZW4gPSBzaXplb2YobXNnLT5kYXRhLmRhdGEpOwotCURCRkVOVEVSOwotCi0JaWYgKCBody0+YXV4ZW4gKSB7Ci0JCWFkZHIgPSBtc2ctPmFkZHIuZGF0YTsKLQkJbGVuID0gbXNnLT5sZW4uZGF0YTsKLQkJYnVmID0gbXNnLT5kYXRhLmRhdGE7Ci0JCWlmICggbGVuIDw9IG1heGxlbiApIHsgIC8qIG1heCByZWFkL3dyaXRlIHNpemUgKi8KLQkJCWhmYTM4NHhfY29weV90b19hdXgoaHcsIGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywgYnVmLCBsZW4pOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfREVCVUcoMSwiQXR0ZW1wdCB0byB3cml0ZSA+IG1heGxlbiBmcm9tIGF1eHBvcnQuXG4iKTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3JlZnVzZWQ7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3JlZnVzZWQ7Ci0JfQotCW1zZy0+ZGF0YS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCURCRkVOVEVSOwotCVdMQU5fTE9HX0VSUk9SKCJwcmlzbTJtZ210X2F1eHBvcnRfcmVhZDogTm90IHN1cHBvcnRlZCBvbiBVU0IuXG4iKTsKLQlEQkZFWElUOwotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2xvd19sZXZlbAotKgotKiBQdXRzIHRoZSBjYXJkIGludG8gdGhlIGRlc2lyZWQgdGVzdCBtb2RlLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHdsYW5kZXYgICAgICAgICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgbXNncCAgICAgICAgICAgIHB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgc3VjY2VzcyBhbmQgZG9uZQotKiAgICAgICA8MCAgICAgIHN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKiAgICAgICA+MCAgICAgIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9sb3dfbGV2ZWwod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLSAgICAgICAgcDgwMjExbXNnX3AycmVxX2xvd19sZXZlbF90ICAgICAqbXNnID0gbXNncDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0gICAgICAgIERCRkVOVEVSOwotCi0gICAgICAgIG1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLSAgICAgICAgLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0JY21kLmNtZCA9IChVSU5UMTYpIG1zZy0+Y29tbWFuZC5kYXRhOwotCWNtZC5wYXJtMCA9IChVSU5UMTYpIG1zZy0+cGFyYW0wLmRhdGE7Ci0JY21kLnBhcm0xID0gKFVJTlQxNikgbXNnLT5wYXJhbTEuZGF0YTsKLQljbWQucGFybTIgPSAoVUlOVDE2KSBtc2ctPnBhcmFtMi5kYXRhOwotCi0gICAgICAgIGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwoaHcsJmNtZCk7Ci0KLSAgICAgICAgbXNnLT5yZXNwMC5kYXRhID0gKFVJTlQzMikgY21kLnJlc3VsdC5yZXNwMDsKLSAgICAgICAgbXNnLT5yZXNwMS5kYXRhID0gKFVJTlQzMikgY21kLnJlc3VsdC5yZXNwMTsKLSAgICAgICAgbXNnLT5yZXNwMi5kYXRhID0gKFVJTlQzMikgY21kLnJlc3VsdC5yZXNwMjsKLQotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF90ZXN0X2NvbW1hbmQKLSoKLSogUHV0cyB0aGUgY2FyZCBpbnRvIHRoZSBkZXNpcmVkIHRlc3QgbW9kZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfdGVzdF9jb21tYW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX3Rlc3RfY29tbWFuZF90CSptc2cgPSBtc2dwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotICAgICAgICBEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSAoKFVJTlQxNikgbXNnLT50ZXN0Y29kZS5kYXRhKSA8PCA4IHwgMHgzODsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBtc2ctPnRlc3RwYXJhbS5kYXRhOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotICAgICAgICAvKiBjYWxsIHNvbWUgcm91dGluZSB0byBleGVjdXRlIHRoZSB0ZXN0IGNvbW1hbmQgKi8KLQotICAgICAgICBoZmEzODR4X2RydnJfbG93X2xldmVsKGh3LCZjbWQpOwotCi0gICAgICAgIG1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLSAgICAgICAgbXNnLT5zdGF0dXMuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnN0YXR1cy5kYXRhID0gY21kLnJlc3VsdC5zdGF0dXM7Ci0gICAgICAgIG1zZy0+cmVzcDAuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3AwLmRhdGEgPSBjbWQucmVzdWx0LnJlc3AwOwotICAgICAgICBtc2ctPnJlc3AxLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5yZXNwMS5kYXRhID0gY21kLnJlc3VsdC5yZXNwMTsKLSAgICAgICAgbXNnLT5yZXNwMi5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+cmVzcDIuZGF0YSA9IGNtZC5yZXN1bHQucmVzcDI7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X21taV9yZWFkCi0qCi0qIFJlYWQgZnJvbSBvbmUgb2YgdGhlIE1NSSByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X21taV9yZWFkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX21taV9yZWFkX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyIHJlc3AgPSAwOwotCi0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0KLQloZmEzODR4X2RydnJfbW1pX3JlYWQoaHcsIG1zZy0+YWRkci5kYXRhLCAmcmVzcCk7Ci0KLQkvKiBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyAiYXJjaGl0ZWN0dXJhbGx5IiBjb3JyZWN0LCBidXQgaXQKLSAgICAgICAgICAgaXMgZXhwZWRpZW50LiAqLwotCi0JbXNnLT52YWx1ZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT52YWx1ZS5kYXRhID0gcmVzcDsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfbW1pX3dyaXRlCi0qCi0qIFdyaXRlIGEgZGF0YSB2YWx1ZSB0byBvbmUgb2YgdGhlIE1NSSByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X21taV93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9tbWlfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQkvKiBjYWxsIHNvbWUgcm91dGluZSB0byBleGVjdXRlIHRoZSB0ZXN0IGNvbW1hbmQgKi8KLQotCWhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaHcsIG1zZy0+YWRkci5kYXRhLCBtc2ctPmRhdGEuZGF0YSk7Ci0KLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfcmFtZGxfc3RhdGUKICoKICogRXN0YWJsaXNoZXMgdGhlIGJlZ2lubmluZy9lbmQgb2YgYSBjYXJkIFJBTSBkb3dubG9hZCBzZXNzaW9uLgpAQCAtMjE3OSw5ICs4MzgsOSBAQAogewogCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTMyCQkJYWRkcjsKKwl1MzIJCQlsZW47CisJdTgJCQkqYnVmOwogCURCRkVOVEVSOwogCiAJaWYgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX0ZXTE9BRCkgewpAQCAtMjMxOSw5ICs5NzgsOSBAQAogewogCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZV90CSptc2cgPSBtc2dwOwotCVVJTlQzMgkJCWFkZHI7Ci0JVUlOVDMyCQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MzIJCQlhZGRyOworCXUzMgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJREJGRU5URVI7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CkBAIC0yMzYxLDI0NyArMTAyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZHVtcF9zdGF0ZQotKgotKiBEdW1wcyB0aGUgZHJpdmVyJ3MgYW5kIGhhcmR3YXJlJ3MgY3VycmVudCBzdGF0ZSB2aWEgdGhlIGtlcm5lbAotKiBsb2cgYXQgS0VSTl9OT1RJQ0UgbGV2ZWwuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2R1bXBfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCXA4MDIxMW1zZ19wMnJlcV9kdW1wX3N0YXRlX3QJKm1zZyA9IG1zZ3A7Ci0JaW50CQkJCXJlc3VsdCA9IDA7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCQlhdXhidWZbMTVdOwotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfTk9USUNFKCJwcmlzbTIgZHJpdmVyIGFuZCBoYXJkd2FyZSBzdGF0ZTpcbiIpOwotCWlmICAoIChyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKSkgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJhdXhfZW5hYmxlIGZhaWxlZCwgcmVzdWx0PSVkXG4iLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LAotCQkweDAxZTIsCi0JCUhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJYXV4YnVmLAotCQlzaXplb2YoYXV4YnVmKSk7Ci0JaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCVdMQU5fTE9HX05PVElDRSgiICBjbWFjOiBGcmVlQmxvY2tzPSVkXG4iLCBhdXhidWZbNV0pOwotCVdMQU5fTE9HX05PVElDRSgiICBjbWFjOiBJbnRFbj0weCUwMnggRXZTdGF0PTB4JTAyeFxuIiwKLQkJaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfSU5URU4pLAotCQloZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpKTsKLQotCSNpZmRlZiBVU0VfRklEX1NUQUNLCi0JV0xBTl9MT0dfTk9USUNFKCIgIGRydnI6IHR4ZmlkX3RvcD0lZCBzdGFja3NpemU9JWRcbiIsCi0JCWh3LT50eGZpZF90b3AsSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWCk7Ci0JI2Vsc2UKLQlXTEFOX0xPR19OT1RJQ0UoIiAgZHJ2cjogdHhmaWRfaGVhZD0lZCB0eGZpZF90YWlsPSVkIHR4ZmlkX049JWRcbiIsCi0JCWh3LT50eGZpZF9oZWFkLCBody0+dHhmaWRfdGFpbCwgaHctPnR4ZmlkX04pOwotCSNlbmRpZgotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0jZWxzZSAvKiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpICovCi0KLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQlnb3RvIGZhaWxlZDsKLQotI2VuZGlmIC8qIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikgKi8KLQotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvCi0qCi0qIElzc3VlcyBhIENoYW5uZWxJbmZvUmVxdWVzdC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3QJKm1zZz1tc2dwOwotCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaW50CQkJCXJlc3VsdCwgaSwgbj0wOwotCVVJTlQxNgkJCQljaGFubmVsX21hc2s9MDsKLQloZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhX3QJY2hpbmZvcmVxOwotCS8vIHVuc2lnbmVkIGxvbmcgCQkJbm93OwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogTm90IHN1cHBvcnRlZCBpbiBTVEEgZi93ICovCi0JCVA4MDIxMV9TRVRfSU5UKG1zZy0+cmVzdWx0Y29kZSwgUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0jZGVmaW5lIENISU5GT19USU1FT1VUIDIKLQotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cmVzdWx0Y29kZSwgUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3MpOwotCi0JLyogc2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBjaGFubmVsbGlzdCA9IGFsbCBjaGFubmVscyAqLwotCWlmICghbXNnLT5jaGFubmVsbGlzdC5kYXRhKSB7Ci0JCVA4MDIxMV9TRVRfSU5UKG1zZy0+Y2hhbm5lbGxpc3QsIDB4MDAwMDdGRkUpOwotCX0KLQkvKiBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIGNoYW5uZWxkd2VsbHRpbWUgPSAxMDAgbXMgKi8KLQlpZiAoIW1zZy0+Y2hhbm5lbGR3ZWxsdGltZS5kYXRhKSB7Ci0JCVA4MDIxMV9TRVRfSU5UKG1zZy0+Y2hhbm5lbGR3ZWxsdGltZSwgMTAwKTsKLQl9Ci0JY2hhbm5lbF9tYXNrID0gKFVJTlQxNikgKG1zZy0+Y2hhbm5lbGxpc3QuZGF0YSA+PiAxKTsKLQlmb3IgKGk9MCwgbj0wOyBpIDwgMTQ7IGkrKykgewotCQlpZiAoY2hhbm5lbF9tYXNrICYgKDE8PGkpKSB7Ci0JCQluKys7Ci0JCX0KLQl9Ci0JUDgwMjExX1NFVF9JTlQobXNnLT5udW1jaGluZm8sIG4pOwotCWNoaW5mb3JlcS5jaGFubmVsTGlzdCA9IGhvc3QyaGZhMzg0eF8xNihjaGFubmVsX21hc2spOwotCWNoaW5mb3JlcS5jaGFubmVsRHdlbGxUaW1lID0gaG9zdDJoZmEzODR4XzE2KG1zZy0+Y2hhbm5lbGR3ZWxsdGltZS5kYXRhKTsKLQotCWF0b21pY19zZXQoJmh3LT5jaGFubmVsX2luZm8uZG9uZSwgMSk7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNULAotCQkJCQkgJmNoaW5mb3JlcSwgSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUX0xFTik7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJzZXRjb25maWcoQ0hBTk5FTElORk9SRVFVRVNUKSBmYWlsZWQuIHJlc3VsdD0lZFxuIiwKLQkJCQlyZXN1bHQpOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qCi0Jbm93ID0gamlmZmllczsKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmh3LT5jaGFubmVsX2luZm8uZG9uZSkgIT0gMSkgewotCQlpZiAoKGppZmZpZXMgLSBub3cpID4gQ0hJTkZPX1RJTUVPVVQqSFopIHsKLQkJCVdMQU5fTE9HX05PVElDRSgiQ2hhbm5lbEluZm8gcmVzdWx0cyBub3QgcmVjZWl2ZWQgaW4gJWQgc2Vjb25kcywgYWJvcnRpbmcuXG4iLAotCQkJCQlDSElORk9fVElNRU9VVCk7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV90aW1lb3V0OwotCQkJZ290byBkb25lOwotCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZV90aW1lb3V0KEhaLzQpOwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQl9Ci0JKi8KLQotZG9uZToKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2NoYW5uZWxfaW5mb19yZXN1bHRzCi0qCi0qIFJldHVybnMgcmVxdWlyZWQgQ2hhbm5lbEluZm8gcmVzdWx0LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9jaGFubmVsX2luZm9fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQotCXA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0c190CSptc2c9bXNncDsKLQlpbnQJCQkJcmVzdWx0PTA7Ci0JaW50CQljaGFubmVsOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogTm90IHN1cHBvcnRlZCBpbiBTVEEgZi93ICovCi0JCVA4MDIxMV9TRVRfSU5UKG1zZy0+cmVzdWx0Y29kZSwgUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0Jc3dpdGNoIChhdG9taWNfcmVhZCgmaHctPmNoYW5uZWxfaW5mby5kb25lKSkgewotCWNhc2UgMDogbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCWdvdG8gZG9uZTsKLQljYXNlIDE6IG1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2luY29tcGxldGVfaXRlbWRhdGE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzKTsKLQljaGFubmVsPW1zZy0+Y2hhbm5lbC5kYXRhLTE7Ci0KLQlpZiAoY2hhbm5lbCA8IDAgfHwgISAoaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnNjYW5jaGFubmVscyAmIDE8PGNoYW5uZWwpICkgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JV0xBTl9MT0dfREVCVUcoMiwgImNoaW5mb19yZXN1bHRzOiBjaGFubmVsICVkLCBhdmcvcGVhayBsZXZlbD0lZC8lZCBkQiwgYWN0aXZlPSVkXG4iLAotCQkJY2hhbm5lbCsxLAotCQkJaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hbmwsCi0JCQlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLnBubCwKLQkJCWh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYWN0aXZlCi0JCSk7Ci0JUDgwMjExX1NFVF9JTlQobXNnLT5hdmdub2lzZWxldmVsLCBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFubCk7Ci0JUDgwMjExX1NFVF9JTlQobXNnLT5wZWFrbm9pc2VsZXZlbCwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5wbmwpOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+YnNzYWN0aXZlLCBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFjdGl2ZSAmCi0JCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQotICAgICAgICAgICAgICAgID8gUDgwMjExRU5VTV90cnV0aF90cnVlCi0gICAgICAgICAgICAgICAgOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKSA7Ci0JUDgwMjExX1NFVF9JTlQobXNnLT5wY2ZhY3RpdmUsIGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYWN0aXZlICYKLQkJSEZBMzg0eF9DSElORk9SRVNVTFRfUENGQUNUSVZFCi0gICAgICAgICAgICAgICAgPyBQODAyMTFFTlVNX3RydXRoX3RydWUKLSAgICAgICAgICAgICAgICA6IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UpIDsKLQotZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfYXV0b2pvaW4KICoKQEAgLTI2MjUsMTEgKzEwNDMsMTEgQEAKIHsKIAloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCAJCQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJCXJlZzsKLQlVSU5UMTYJCQlwb3J0X3R5cGU7CisJdTE2CQkJcmVnOworCXUxNgkJCXBvcnRfdHlwZTsKIAlwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luX3QJKm1zZyA9IG1zZ3A7CiAJcDgwMjExcHN0cmRfdAkJKnBzdHI7Ci0JVUlOVDgJCQlieXRlYnVmWzI1Nl07CisJdTgJCQlieXRlYnVmWzI1Nl07CiAJaGZhMzg0eF9ieXRlc3RyX3QJKnAyYnl0ZXN0ciA9IChoZmEzODR4X2J5dGVzdHJfdCopYnl0ZWJ1ZjsKIAlEQkZFTlRFUjsKIApAQCAtMjYzOCwxNiArMTA1Niw2IEBACiAJLyogU2V0IHRoZSBTU0lEICovCiAJbWVtY3B5KCZ3bGFuZGV2LT5zc2lkLCAmbXNnLT5zc2lkLmRhdGEsIHNpemVvZihtc2ctPnNzaWQuZGF0YSkpOwogCi0JaWYgKGh3LT5hcCkgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgb24gQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBkb25lOwotCX0KLQogCS8qIERpc2FibGUgdGhlIFBvcnQgKi8KIAloZmEzODR4X2RydnJfZGlzYWJsZShodywgMCk7CiAKQEAgLTI2OTksNyArMTEwNyw2IEBACiAJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwogCi1kb25lOgogCURCRkVYSVQ7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI3MzAsNyArMTEzNyw3IEBACiAJcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmZfdAkqbXNnID0gbXNncDsKIAogCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJd29yZDsKKwl1MTYJCQl3b3JkOwogCiAJREJGRU5URVI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaAppbmRleCA3MzNmZDk5Li5jYWY4MDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCkBAIC03MywxMCArNzMsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIFN0YXRpYyB2YXJpYWJsZSBleHRlcm5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi1leHRlcm4gaW50ICAgICAgcHJpc20yX2JhcF90aW1lb3V0OwotZXh0ZXJuIGludAlwcmlzbTJfaXJxX2V2cmVhZF9tYXg7Ci0jZW5kaWYKIGV4dGVybiBpbnQJcHJpc20yX2RlYnVnOwogZXh0ZXJuIGludCAgICAgIHByaXNtMl9yZXNldF9ob2xkdGltZTsKIGV4dGVybiBpbnQgICAgICBwcmlzbTJfcmVzZXRfc2V0dGxldGltZTsKQEAgLTg0LDggKzgwLDggQEAKIC8qLS0tIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1VSU5UMzIKLXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGlmc3RhdGUpOwordTMyCitwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBpZnN0YXRlKTsKIAogdm9pZAogcHJpc20yc3RhX2V2X2R0aW0od2xhbmRldmljZV90ICp3bGFuZGV2KTsKQEAgLTk0LDQ3ICs5MCwyNCBAQAogdm9pZAogcHJpc20yc3RhX2V2X2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7CiB2b2lkCi1wcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgc3RhdHVzKTsKK3ByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpOwogdm9pZAotcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHN0YXR1cyk7CitwcmlzbTJzdGFfZXZfdHgod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKTsKIHZvaWQKIHByaXNtMnN0YV9ldl9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZAogcHJpc20yc3RhX2V2X2FsbG9jKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiAKLQogaW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcG93ZXJtZ210KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9zY2FuKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3AyX2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2F1dGhlbnRpY2F0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZGVhdXRoZW50aWNhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2Fzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmVhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2Rpc2Fzc29jaWF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmVzZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3N0YXJ0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF93bGFuc25pZmYod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3JlYWRwZGEod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JlYWRjaXMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2F1eHBvcnRfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXV4cG9ydF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfbG93X2xldmVsKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF90ZXN0X2NvbW1hbmQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X21taV9yZWFkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9tbWlfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X3JhbWRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfZmxhc2hkbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfbW1fc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2R1bXBfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2VuYWJsZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9jaGFubmVsX2luZm9fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfYXV0b2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0MiwzMSArMTE1LDMxIEBACiAqIFByaXNtMiBkYXRhIHR5cGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogYnl0ZSBhcmVhIGNvbnZlcnNpb24gZnVuY3Rpb25zKi8KLXZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKFVJTlQ4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Ci12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pOwordm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKK3ZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbik7CiAKIC8qIGJ5dGUgc3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zKi8KIHZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIoaGZhMzg0eF9ieXRlc3RyX3QgKmJ5dGVzdHIsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwogdm9pZCBwcmlzbTJtZ210X2J5dGVzdHIycHN0cihoZmEzODR4X2J5dGVzdHJfdCAqYnl0ZXN0ciwgcDgwMjExcHN0cmRfdCAqcHN0cik7CiAKIC8qIGludGVnZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KLXZvaWQgcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KFVJTlQxNiAqcHJpc20yaW50LCBVSU5UMzIgKndsYW5pbnQpOwotdm9pZCBwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQoVUlOVDE2ICpwcmlzbTJpbnQsIFVJTlQzMiAqd2xhbmludCk7Cit2b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh1MTYgKnByaXNtMmludCwgdTMyICp3bGFuaW50KTsKK3ZvaWQgcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KHUxNiAqcHJpc20yaW50LCB1MzIgKndsYW5pbnQpOwogCiAvKiBlbnVtZXJhdGVkIGludGVnZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KLXZvaWQgcHJpc20ybWdtdF9wcmlzbTJlbnVtMnA4MDIxMWVudW0oVUlOVDE2ICpwcmlzbTJlbnVtLCBVSU5UMzIgKndsYW5lbnVtLCBVSU5UMTYgcmlkKTsKLXZvaWQgcHJpc20ybWdtdF9wODAyMTFlbnVtMnByaXNtMmVudW0oVUlOVDE2ICpwcmlzbTJlbnVtLCBVSU5UMzIgKndsYW5lbnVtLCBVSU5UMTYgcmlkKTsKK3ZvaWQgcHJpc20ybWdtdF9wcmlzbTJlbnVtMnA4MDIxMWVudW0odTE2ICpwcmlzbTJlbnVtLCB1MzIgKndsYW5lbnVtLCB1MTYgcmlkKTsKK3ZvaWQgcHJpc20ybWdtdF9wODAyMTFlbnVtMnByaXNtMmVudW0odTE2ICpwcmlzbTJlbnVtLCB1MzIgKndsYW5lbnVtLCB1MTYgcmlkKTsKIAogLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgYSBiaXQgYXJlYSB0by9mcm9tIGFuIE9wZXJhdGlvbmFsIFJhdGUgU2V0ICovCi12b2lkIHByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldChVSU5UMTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwotdm9pZCBwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQoVUlOVDE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKK3ZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KHUxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Cit2b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwogCiAvKiBmdW5jdGlvbnMgdG8gY29udmVydCBHcm91cCBBZGRyZXNzZXMgKi8KLXZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcihVSU5UMzIgZGlkLAordm9pZCBwcmlzbTJtZ210X2dldF9ncnBhZGRyKHUzMiBkaWQsCiAJcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpwcml2ICk7Ci1pbnQgcHJpc20ybWdtdF9zZXRfZ3JwYWRkcihVSU5UMzIgZGlkLAotCVVJTlQ4ICpwcmlzbTJidWYsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdiApOwotaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoIFVJTlQzMiBkaWQgKTsKK2ludCBwcmlzbTJtZ210X3NldF9ncnBhZGRyKHUzMiBkaWQsCisJdTggKnByaXNtMmJ1ZiwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpwcml2ICk7CitpbnQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleCggdTMyIGRpZCApOwogCiB2b2lkIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKaW5kZXggZWFjMDZmNy4uNTM5YzQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKQEAgLTU0LDkgKzU0LDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTY5LDI2ICs2Niw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLSNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgotCi0vLyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0vLyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgotLy8jZW5kaWYKLS8vCi0vLyNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpKQotLy8jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLS8vZW5kaWYKLQotLy8jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotLy8jZW5kaWYKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KQEAgLTExMiwxOCArOTAsMTcgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBUeXBlcyAqLwogCi0jZGVmaW5lICBGX0FQICAgICAgICAgMHgxICAgICAgICAvKiBNSUIgaXMgc3VwcG9ydGVkIG9uIEFjY2VzcyBQb2ludHMuICovCi0jZGVmaW5lICBGX1NUQSAgICAgICAgMHgyICAgICAgICAvKiBNSUIgaXMgc3VwcG9ydGVkIG9uIHN0YXRpb25zLiAqLwotI2RlZmluZSAgRl9SRUFEICAgICAgIDB4NCAgICAgICAgLyogTUlCIG1heSBiZSByZWFkLiAqLwotI2RlZmluZSAgRl9XUklURSAgICAgIDB4OCAgICAgICAgLyogTUlCIG1heSBiZSB3cml0dGVuLiAqLworI2RlZmluZSAgRl9TVEEgICAgICAgIDB4MSAgICAgICAgLyogTUlCIGlzIHN1cHBvcnRlZCBvbiBzdGF0aW9ucy4gKi8KKyNkZWZpbmUgIEZfUkVBRCAgICAgICAweDIgICAgICAgIC8qIE1JQiBtYXkgYmUgcmVhZC4gKi8KKyNkZWZpbmUgIEZfV1JJVEUgICAgICAweDQgICAgICAgIC8qIE1JQiBtYXkgYmUgd3JpdHRlbi4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgbWlicmVjCiB7Ci0gICAgVUlOVDMyICAgZGlkOwotICAgIFVJTlQxNiAgIGZsYWc7Ci0gICAgVUlOVDE2ICAgcGFybTE7Ci0gICAgVUlOVDE2ICAgcGFybTI7Ci0gICAgVUlOVDE2ICAgcGFybTM7CisgICAgdTMyICAgZGlkOworICAgIHUxNiAgIGZsYWc7CisgICAgdTE2ICAgcGFybTE7CisgICAgdTE2ICAgcGFybTI7CisgICAgdTE2ICAgcGFybTM7CiAgICAgaW50ICAgICAgKCpmdW5jKShzdHJ1Y3QgbWlicmVjICAgICAgICAgICAgICAgICptaWIsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAogICAgICAgICAgICAgICAgICAgICAgd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKQEAgLTEzNSwxNCArMTEyLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAotc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyKAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTE1OSwzOCArMTI4LDYgQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzJhcnJheSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyb2Zmc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl90cnV0aCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfcHJlYW1ibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZsYWcoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMTk5LDIyICsxMzYsNiBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3JlZ3VsYXRvcnlkb21haW5zKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTIyMywxNCArMTQ0LDYgQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wb3dlcm1hbmFnZW1lbnQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTI1NSw0NiArMTY4LDYgQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2dyb3VwYWRkcmVzcygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfZndpZCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXV0aGFsZygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdigKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0zMDMsNDE0ICsxNzYsNzggQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hdXRobGlzdCgKLWhmYTM4NHhfdCAgICAgICpodywKLXByaXNtMnN0YV9hdXRobGlzdF90ICAqbGlzdCk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc21vZGUoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1VSU5UMzIgICAgICAgICAgICBtb2RlKTsKLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzYWxsb3coCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1wODAyMTFtYWNhcnJheV90ICAqbWFjYXJyYXkpOwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KTsKLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1VSU5UOCAgICAgICAgICAgICAqYWRkcik7Ci0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KIAogc3RhdGljIG1pYnJlY190IG1pYnRhYltdID0gewogCiAgICAgLyogZG90MTFzbXQgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExU3RhdGlvbklELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUiwgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMU1lZGl1bU9jY3VwYW5jeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBvbGxhYmxlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NGUE9MTEFCTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBNYXhEdXJhdGlvbiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25SZXNwb25zZVRpbWVPdXQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFVVEhSU1BUSU1FT1VULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVByaXZhY3lPcHRpb25JbXBsZW1lbnRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFQb3dlck1hbmFnZW1lbnRNb2RlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3Bvd2VybWFuYWdlbWVudCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZFNTSUQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZEJTU1R5cGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMU9wZXJhdGlvbmFsUmF0ZVNldCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFPcGVyYXRpb25hbFJhdGVTZXQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQmVhY29uUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURUSU1QZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUFzc29jaWF0aW9uUmVzcG9uc2VUaW1lT3V0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTEsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0yLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG01LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICA1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgNiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUxLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUyLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgNCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU1LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU2LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgNiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTEsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMiwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBGTEFHUywgSEZBMzg0eF9XRVBGTEFHU19QUklWSU5WT0tFRCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZSUQsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUEZMQUdTLCBIRkEzODR4X1dFUEZMQUdTX0VYQ0xVREUsIDAsCiAgICAgICAgICAgcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZCB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFByZWFtYmxlRW5hYmxlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNIT1JUUFJFQU1CTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByZWFtYmxlIH0sCiAKICAgICAvKiBkb3QxMW1hYyBNSUIncyAqLwogCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1BQ0FkZHJlc3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUiwgSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4sIDAsCiAgICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkLAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFSVFNUaHJlc2hvbGQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UmV0cnlMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlULCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTG9uZ1JldHJ5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlULCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFGcmFnbWVudGF0aW9uVGhyZXNob2xkLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFRyYW5zbWl0TVNEVUxpZmV0aW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWF4UmVjZWl2ZUxpZmV0aW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M2LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczgsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTAsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE1LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTYsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE4LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIxLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjIsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI3LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjgsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMwLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCiAKICAgICAvKiBkb3QxMXBoeSBNSUIncyAqLwogCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVBIWVR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BIWVRZUEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFUZW1wVHlwZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVEVNUFRZUEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWwsCiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWwsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMLCAwLCAwLAorICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgSEZBMzg0eF9SSURfVFhQT1dFUk1BWCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q0NBTW9kZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0NBTU9ERSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMlRhYmxlIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyTU1UeCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyRWFybHlCZWFjb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgQklUNywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXBwY2ZpbmZvZmxhZyB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJSZWNlaXZlZEZyYW1lU3RhdGlzdGljcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJDb21tdW5pY2F0aW9uVGFsbGllcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBdXRoZW50aWNhdGVkLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBc3NvY2lhdGVkLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJQb3dlclNhdmVVc2VyQ291bnQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW1lbnQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc01vZGUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NBbGxvdywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0RlbnksCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJDaGFubmVsSW5mb1Jlc3VsdHMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCiAKICAgICAvKiBwMlN0YXRpYyBNSUIncyAqLwogCkBAIC03MTgsNTY1ICsyNTUsMTMgQEAKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duTUFDQWRkcmVzcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZEZXNpcmVkU1NJRCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25DaGFubmVsLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25TU0lELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOU1NJRCwgSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQVRJTVdpbmRvdywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTeXN0ZW1TY2FsZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNZU1NDQUxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heERhdGFMZW5ndGgsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFIsIEhGQTM4NHhfUklEX0NORldEU0FERFJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVuYWJsZWQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBNRU5BQkxFRCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNRVBTLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQTUVQUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk11bHRpY2FzdFJlY2VpdmUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4U2xlZXBEdXJhdGlvbiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTUFYU0xFRVBEVVIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1Ib2xkb3ZlckR1cmF0aW9uLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQTUhPTEREVVIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duTmFtZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk5BTUUsIEhGQTM4NHhfUklEX0NORk9XTk5BTUVfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkRUSU1QZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFIxLCBIRkEzODR4X1JJRF9DTkZXRFNBRERSMV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFIyLCBIRkEzODR4X1JJRF9DTkZXRFNBRERSMl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3MzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFIzLCBIRkEzODR4X1JJRF9DTkZXRFNBRERSM19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFI0LCBIRkEzODR4X1JJRF9DTkZXRFNBRERSNF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFI1LCBIRkEzODR4X1JJRF9DTkZXRFNBRERSNV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldEU0FkZHJlc3M2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldEU0FERFI2LCBIRkEzODR4X1JJRF9DTkZXRFNBRERSNl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk11bHRpY2FzdFBNQnVmZmVyaW5nLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleUlELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlELCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkwLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkxLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkyLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXkzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUEZsYWdzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhBc3NvY2lhdGVkU3RhdGlvbnMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTUFYQVNTT0NTVEFUSU9OUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUeENvbnRyb2wsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZUWENPTlRST0wsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUm9hbWluZ01vZGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkhvc3RBdXRoZW50aWNhdGlvbiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZIT1NUQVVUSEFTU09DLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUmN2Q3JjRXJyb3IsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZSQ1ZDUkNFUlJPUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBbHRSZXRyeUNvdW50LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQUxUUkVUUllDTlQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQmVhY29uSW50ZXJ2YWwsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBCQ05JTlQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWVkaXVtT2NjdXBhbmN5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUFBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQTWF4RHVyYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUEZsYWdzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMywKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTVEFQQ0ZJbmZvLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTVEFQQ0ZJTkZPLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlByaW9yaXR5UVVzYWdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUFJJT1JJVFlRVVNBR0UsIEhGQTM4NHhfUklEX0NORlBSSU9RVVNBR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVElNQ3RybCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlRJTUNUUkwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVGhpcnR5MlRhbGx5LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GVEhJUlRZMlRBTExZLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRW5oU2VjdXJpdHksCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GRU5IU0VDVVJJVFksIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU2hvcnRQcmVhbWJsZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNIT1JUUFJFQU1CTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByZWFtYmxlIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZFeGNsdWRlTG9uZ1ByZWFtYmxlLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkVYQ0xPTkdQUkVBTUJMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkF1dGhlbnRpY2F0aW9uUnNwVE8sCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFVVEhSU1BUSU1FT1VULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkJhc2ljUmF0ZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZCQVNJQ1JBVEVTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlN1cHBvcnRlZFJhdGVzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLQotICAgIC8qIHAyRHluYW1pYyBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyQ3JlYXRlSUJTUywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1JFQVRFSUJTUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNILCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlByb21pc2N1b3VzTW9kZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJPTUlTQ01PREUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDAsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNINCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDYsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQwLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNINCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0g1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wwLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMNCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEw2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLQotICAgIC8qIHAyQmVoYXZpb3IgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyQmVoYXZpb3JfcDJUaWNrVGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0lUSUNLVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMk5JQyBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJNYXhMb2FkVGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJQYWdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUiwgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyT2Zmc2V0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUiwgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyTGVuZ3RoLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUiwgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlBSSUlkZW50aXR5LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklJREVOVElUWSwgSEZBMzg0eF9SSURfUFJJSURFTlRJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyUFJJU3VwUmFuZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSVNVUFJBTkdFLCBIRkEzODR4X1JJRF9QUklTVVBSQU5HRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJDRklBY3RSYW5nZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSV9DRklBQ1RSQU5HRVMsIEhGQTM4NHhfUklEX0NGSUFDVFJBTkdFU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJCdWlsZFNlcXVlbmNlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9CVUlMRFNFUSwgSEZBMzg0eF9SSURfQlVJTERTRVFfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyUHJpbWFyeUZXSUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2Z3aWQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlNlY29uZGFyeUZXSUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2Z3aWQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlRlcnRpYXJ5RldJRCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2Z3aWQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMk5JQ1NlcmlhbE51bWJlciwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSLCBIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJOSUNJZGVudGl0eSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTklDSURFTlRJVFksIEhGQTM4NHhfUklEX05JQ0lERU5USVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMk1GSVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NRklTVVBSQU5HRSwgSEZBMzg0eF9SSURfTUZJU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQ0ZJU3VwUmFuZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NGSVNVUFJBTkdFLCBIRkEzODR4X1JJRF9DRklTVVBSQU5HRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJDaGFubmVsTGlzdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0hBTk5FTExJU1QsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyUmVndWxhdG9yeURvbWFpbnMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TLCBIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3JlZ3VsYXRvcnlkb21haW5zIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJUZW1wVHlwZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVEVNUFRZUEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyU1RBSWRlbnRpdHksCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQUlERU5USVRZLCBIRkEzODR4X1JJRF9TVEFJREVOVElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTVEFTdXBSYW5nZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU1RBU1VQUkFOR0UsIEhGQTM4NHhfUklEX1NUQVNVUFJBTkdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMk1GSUFjdFJhbmdlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUywgSEZBMzg0eF9SSURfTUZJQUNUUkFOR0VTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlNUQUNGSUFjdFJhbmdlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUywgSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTMl9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCiAKICAgICAvKiBwMk1BQyBNSUIncyAqLwogCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJQb3J0U3RhdHVzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BPUlRTVEFUVVMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFNTSUQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFNTSUQsIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50QlNTSUQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lELCBIRkEzODR4X1JJRF9DVVJSRU5UQlNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5Q1EsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUFTTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QU5MLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5Q1EsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUFTTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5QU5MLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCiAgICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlLAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJlYWNvbkludGVydmFsLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UQkNOSU5ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlN0YUN1cnJlbnRTY2FsZVRocmVzaG9sZHMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNILCBIRkEzODR4X1JJRF9TVEFDVVJTQ0FMRVRIUkVTSF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJBUEN1cnJlbnRTY2FsZVRocmVzaG9sZHMsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UU0NBTEVUSFJFU0gsIEhGQTM4NHhfUklEX0FQQ1VSU0NBTEVUSFJFU0hfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyUHJvdG9jb2xSc3BUaW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyU2hvcnRSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyTG9uZ1JldHJ5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMk1heFRyYW5zbWl0TGlmZXRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01BWFRYTElGRVRJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyTWF4UmVjZWl2ZUxpZmV0aW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNGUG9sbGFibGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0FVVEhBTEdPUklUSE1TLCBIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyT3duTUFDQWRkcmVzcywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1MsIEhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1NfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0KLSAgICAvKiBwMk1vZGVtIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyUEhZVHlwZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUEhZVFlQRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMkN1cnJlbnRDaGFubmVsLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMkN1cnJlbnRQb3dlclN0YXRlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UUE9XRVJTVEFURSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMkNDQU1vZGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NDQU1PREUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJUeFBvd2VyTWF4LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhQT1dFUk1BWCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhQT1dFUk1BWCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMlN1cHBvcnRlZERhdGFSYXRlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTLCBIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKIAogICAgIC8qIEFuZCBmaW5hbGx5LCBsbnggbWlicyAqLwogICAgIHsgRElEbWliX2xueF9sbnhDb25maWdUYWJsZV9sbnhSU05BSUUsCkBAIC0xMjg1LDk0ICsyNzAsNiBAQAogICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCiAgICAgeyAwLCAwLCAwLCAwLCAwLCBOVUxMfX07CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlc2UgTUlCJ3MgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lOgotCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUNoYW5uZWxBZ2lsaXR5UHJlc2VudAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eUVuYWJsZWQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMVBCQ0NPcHRpb25JbXBsZW1lbnRlZAotRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlX2RvdDExUmVnRG9tYWluc1N1cHBvcnRJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFZhbHVlCi1ESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VmFsdWUKLQotRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlX2RvdDExUmVnRG9tYWluc1N1cHBvcnRWYWx1ZQotVE9ETzogbmVlZCB0byBpbnZlc3RpZ2F0ZSB3aHkgd2xhbiBoYXMgdGhpcyBhcyBlbnVtZXJhdGVkIGFuZCBQcmlzbTIgaGFzIHRoaXMKLSAgICAgIGFzIGJ0eWUgc3RyLgotCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFTaG9ydFByZWFtYmxlT3B0aW9uSW1wbGVtZW50ZWQKLVRPRE86IEZpbmQgb3V0IHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG51bWJlcihzKSBmb3IgaWRlbnRpZnlpbmcKLSAgICAgIHdoZXRoZXIgdGhlIGZpcm13YXJlIGlzIGNhcGFibGUgb2Ygc2hvcnQgcHJlYW1ibGUuIFRSVUUgb3IgRkFMU0UKLSAgICAgIHdpbGwgYmUgcmV0dXJuZWQgYmFzZWQgb24gdGhlIHZlcnNpb24gb2YgdGhlIGZpcm13YXJlLgotCi1XRVAgS2V5IG1hcHBpbmdzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhlIGYvdy4KLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nSW5kZXgKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nQWRkcmVzcwotRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdXRVBPbgotRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdWYWx1ZQotRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0xlbmd0aAotCi1UT0RPOiBpbXBsZW1lbnQgY291bnRlcnMuCi1ESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBJQ1ZFcnJvckNvdW50Ci1ESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBFeGNsdWRlZENvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRmFpbGVkQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSZXRyeUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGlwbGVSZXRyeUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExRnJhbWVEdXBsaWNhdGVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJUU1N1Y2Nlc3NDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJUU0ZhaWx1cmVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUFDS0ZhaWx1cmVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJlY2VpdmVkRnJhZ21lbnRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZDU0Vycm9yQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFUcmFuc21pdHRlZEZyYW1lQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFXRVBVbmRlY3J5cHRhYmxlQ291bnQKLQotVE9ETzogaW1wbGVtZW50IHNhbmUgdmFsdWVzIGZvciB0aGVzZS4KLURJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTWFudWZhY3R1cmVySUQKLURJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUHJvZHVjdElECi0KLU5vdCB0b28gd29ycmllZCBhYm91dCB0aGVzZSBhdCB0aGUgbW9tZW50LgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExQ3VycmVudFR4QW50ZW5uYQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExRGl2ZXJzaXR5U3VwcG9ydAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExQ3VycmVudFJ4QW50ZW5uYQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExTnVtYmVyU3VwcG9ydGVkUG93ZXJMZXZlbHMKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDIKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDMKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDUKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDYKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDcKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWwKLQotVW1tbSwgRkggYW5kIElSIGRvbid0IGFwcGx5Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFIb3BUaW1lCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbE51bWJlcgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExTWF4RHdlbGxUaW1lCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50RHdlbGxUaW1lCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50U2V0Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50UGF0dGVybgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDQ0FNb2RlU3VwcG9ydGVkCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFFRFRocmVzaG9sZAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nVGltZXJNYXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWF4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dUaW1lck1pbgotRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nQ291bnRNaW4KLQotV2UganVzdCBkb24ndCBoYXZlIGVub3VnaCBhbnRlbm5hcyByaWdodCBub3cgdG8gd29ycnkgYWJvdXQgdGhpcy4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExQW50ZW5uYUxpc3RJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFTdXBwb3J0ZWRUeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExU3VwcG9ydGVkUnhBbnRlbm5hCi1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMURpdmVyc2l0eVNlbGVjdGlvblJ4Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwogCkBAIC0xNDAxLDcgKzI5OCw4IEBACiAJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludAkJCXJlc3VsdCwgaXNnZXQ7CiAJbWlicmVjX3QJCSptaWI7Ci0JVUlOVDE2CQkJd2hpY2g7CisKKwl1MTYJCQl3aGljaDsKIAogCXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdAkqbXNnID0gbXNncDsKIAlwODAyMTFpdGVtZF90CQkJKm1pYml0ZW07CkBAIC0xNDE1LDcgKzMxMyw3IEBACiAJKiogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gQWNjZXNzIFBvaW50IG9yIGEgc3RhdGlvbi4KIAkqLwogCi0Jd2hpY2ggPSBody0+YXAgPyBGX0FQIDogRl9TVEE7CisJd2hpY2ggPSBGX1NUQTsKIAogCS8qCiAJKiogRmluZCB0aGUgTUlCIGluIHRoZSBNSUIgdGFibGUuICBOb3RlIHRoYXQgYSBNSUIgbWF5IGJlIGluIHRoZQpAQCAtMTQ5MSw1OSArMzg5LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIKLSoKLSogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgc3RyaW5nLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVzdHIycHN0cigKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgICAgICByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAgICAgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQloZmEzODR4X2J5dGVzdHJfdCAgKnAyYnl0ZXN0ciA9IChoZmEzODR4X2J5dGVzdHJfdCopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCBieXRlYnVmLCBtaWItPnBhcm0yKTsKLQkJcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIocDJieXRlc3RyLCBwc3RyKTsKLQl9IGVsc2UgewotCQltZW1zZXQoYnl0ZWJ1ZiwgMCwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIGJ5dGVidWYsIG1pYi0+cGFybTIpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cgogKgogKiBHZXQvc2V0IHBzdHIgZGF0YSB0by9mcm9tIGEgYnl0ZSBhcmVhLgpAQCAtMTU3OCwxMyArNDIzLDEzIEBACiB7CiAJaW50ICAgICAgICAgICAgcmVzdWx0OwogCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOworCXU4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwogCiAJREJGRU5URVI7CiAKIAlpZiAoaXNnZXQpIHsKIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgYnl0ZWJ1ZiwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihieXRlYnVmLCBwc3RyLAltaWItPnBhcm0yKTsKKwkJcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKGJ5dGVidWYsIHBzdHIsIG1pYi0+cGFybTIpOwogCX0gZWxzZSB7CiAJCW1lbXNldChieXRlYnVmLCAwLCBtaWItPnBhcm0yKTsKIAkJcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKGJ5dGVidWYsIHBzdHIpOwpAQCAtMTYyOSw5ICs0NzQsOSBAQAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKIHsKIAlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKKwl1MzIgICp1aW50MzIgPSAodTMyKikgZGF0YTsKKwl1OCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOworCXUxNiAgKndvcmRidWYgPSAodTE2KikgYnl0ZWJ1ZjsKIAogCURCRkVOVEVSOwogCkBAIC0xNjU0LDE3OCArNDk5LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl91aW50MzJhcnJheQotKgotKiBHZXQvc2V0IGFuIGFycmF5IG9mIHVpbnQzMiBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMmFycmF5KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiAqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCWludCAgICAgaSwgY250OwotCi0JREJGRU5URVI7Ci0KLQljbnQgPSBtaWItPnBhcm0yIC8gc2l6ZW9mKFVJTlQxNik7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKLQkJCXByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh3b3JkYnVmK2ksIHVpbnQzMitpKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCQlwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQod29yZGJ1ZitpLCB1aW50MzIraSk7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3VpbnQzMm9mZnNldAotKgotKiBHZXQvc2V0IGEgc2luZ2xlIGVsZW1lbnQgaW4gYW4gYXJyYXkgb2YgdWludDMyIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBFbGVtZW50IGluZGV4LgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzJvZmZzZXQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlVSU5UMTYgIGNudDsKLQotCURCRkVOVEVSOwotCi0JY250ID0gbWliLT5wYXJtMiAvIHNpemVvZihVSU5UMTYpOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCWlmIChpc2dldCkgewotCQkJaWYgKG1pYi0+cGFybTMgPCBjbnQpCi0JCQkJcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KHdvcmRidWYrbWliLT5wYXJtMywgdWludDMyKTsKLQkJCWVsc2UKLQkJCQkqdWludDMyID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlmIChtaWItPnBhcm0zIDwgY250KSB7Ci0JCQkJcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KHdvcmRidWYrbWliLT5wYXJtMywgdWludDMyKTsKLQkJCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQkJCX0KLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdHJ1dGgKLSoKLSogR2V0L3NldCB0cnV0aCBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfdHJ1dGgoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgd29yZGJ1Zik7Ci0JCSp1aW50MzIgPSAoKndvcmRidWYpID8KLQkJCQlQODAyMTFFTlVNX3RydXRoX3RydWUgOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCX0gZWxzZSB7Ci0JCSp3b3JkYnVmID0gKCgqdWludDMyKSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpID8gMSA6IDA7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgKndvcmRidWYpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfZmxhZwogKgogKiBHZXQvc2V0IGEgZmxhZy4KQEAgLTE4NTksMTAgKzUzMiwxMCBAQAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKIHsKIAlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlVSU5UMzIgIGZsYWdzOworCXUzMiAgKnVpbnQzMiA9ICh1MzIqKSBkYXRhOworCXU4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CisJdTE2ICAqd29yZGJ1ZiA9ICh1MTYqKSBieXRlYnVmOworCXUzMiAgZmxhZ3M7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTg5MywxMjEgKzU2Niw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfYXBwY2ZpbmZvZmxhZwotKgotKiBHZXQvc2V0IGEgc2luZ2xlIGZsYWcgaW4gdGhlIEFQUENGSU5GTyByZWNvcmQuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgQml0IHRvIGdldC9zZXQuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXBwY2ZpbmZvZmxhZygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCVVJTlQxNiAgd29yZDsKLQotCURCRkVOVEVSOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQlpZiAocmVzdWx0ID09IDApIHsKLQkJaWYgKGlzZ2V0KSB7Ci0JCQkqdWludDMyID0gKGhmYTM4NHgyaG9zdF8xNih3b3JkYnVmWzNdKSAmIG1pYi0+cGFybTEpID8KLQkJCQlQODAyMTFFTlVNX3RydXRoX3RydWUgOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQl9IGVsc2UgewotCQkJd29yZCA9IGhmYTM4NHgyaG9zdF8xNih3b3JkYnVmWzNdKTsKLQkJCXdvcmQgPSAoKCp1aW50MzIpID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgPwotCQkJCSh3b3JkIHwgbWliLT5wYXJtMSkgOiAod29yZCAmIH5taWItPnBhcm0xKTsKLQkJCXdvcmRidWZbM10gPSBob3N0MmhmYTM4NHhfMTYod29yZCk7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sCi0JCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4pOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucwotKgotKiBHZXQgcmVndWxhdG9yeSBkb21haW4gZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgIHJlc3VsdDsKLQlVSU5UMzIgICAgICAgICBjbnQ7Ci0JcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAgICAgICAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JcmVzdWx0ID0gMDsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQkJcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KHdvcmRidWYsICZjbnQpOwotCQlwc3RyLT5sZW4gPSAoVUlOVDgpIGNudDsKLQkJbWVtY3B5KHBzdHItPmRhdGEsICZ3b3JkYnVmWzFdLCBwc3RyLT5sZW4pOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleQogKgogKiBHZXQvc2V0IFdFUCBkZWZhdWx0IGtleXMuCkBAIC0yMDQyLDggKzYwMCw4IEBACiB7CiAJaW50ICAgICAgICAgICAgcmVzdWx0OwogCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgICAgICAgIGxlbjsKKwl1OCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1MTYgICAgICAgICBsZW47CiAKIAlEQkZFTlRFUjsKIApAQCAtMjA2MiwxMTQgKzYyMCw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50Ci0qCi0qIEdldC9zZXQgODAyLjExIHBvd2VyIG1hbmFnZW1lbnQgdmFsdWUuICBOb3RlIHRoYXQgdGhpcyBpcyBkZWZpbmVkIGRpZmZlcmVudGx5Ci0qIGJ5IDgwMi4xMSBhbmQgUHJpc20yOgotKgotKiAgICAgICBNZWFuaW5nICAgICA4MDIuMTEgICAgICAgUHJpc20yCi0qICAgICAgICBhY3RpdmUgICAgICAgMSAgICAgICAgICAgZmFsc2UKLSogICAgICBwb3dlcnNhdmUgICAgICAyICAgICAgICAgICB0cnVlCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wb3dlcm1hbmFnZW1lbnQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UMzIgIHZhbHVlOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gcHJpc20ybWliX3VpbnQzMihtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCAmdmFsdWUpOwotCQkqdWludDMyID0gKHZhbHVlID09IDApID8gMSA6IDI7Ci0JfSBlbHNlIHsKLQkJdmFsdWUgPSAoKCp1aW50MzIpID09IDEpID8gMCA6IDE7Ci0JCXJlc3VsdCA9IHByaXNtMm1pYl91aW50MzIobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgJnZhbHVlKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByZWFtYmxlCi0qCi0qIEdldC9zZXQgUHJpc20yIHNob3J0IHByZWFtYmxlCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9wcmVhbWJsZSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCVVJTlQ4ICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKLQkJKnVpbnQzMiA9ICp3b3JkYnVmOwotCX0gZWxzZSB7Ci0JCSp3b3JkYnVmID0gKnVpbnQzMjsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCAqd29yZGJ1Zik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1pYl9wcml2YWN5aW52b2tlZAogKgogKiBHZXQvc2V0IHRoZSBkb3QxMVByaXZhY3lJbnZva2VkIHZhbHVlLgpAQCAtMjI5Niw3ICs3NDYsNyBAQAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKIHsKIAlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKKwl1MzIgICp1aW50MzIgPSAodTMyKikgZGF0YTsKIAogCURCRkVOVEVSOwogCkBAIC0yMzE1LDM0OSArNzY1LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQKLSoKLSogR2V0L3NldCB0aGUgb3BlcmF0aW9uYWwgcmF0ZSBzZXQuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgICAgICAgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwotCQlwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQod29yZGJ1ZiwgcHN0cik7Ci0JfSBlbHNlIHsKLQkJcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KHdvcmRidWYsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsICp3b3JkYnVmKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMsICp3b3JkYnVmKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2dyb3VwYWRkcmVzcwotKgotKiBHZXQvc2V0IHRoZSBkb3QxMUdyb3VwQWRkcmVzc2VzVGFibGUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICBsZW47Ci0KLQlEQkZFTlRFUjsKLQotCS8qIFRPRE86IGZpeCB0aGlzLiAgZi93IGRvZXNuJ3Qgc3VwcG9ydCBtY2FzdCBmaWx0ZXJzICovCi0KLQlpZiAoaXNnZXQpIHsKLQkJcHJpc20ybWdtdF9nZXRfZ3JwYWRkcihtaWItPmRpZCwgcHN0ciwgaHcpOwotCQlyZXR1cm4oMCk7Ci0JfQotCi0JcmVzdWx0ID0gcHJpc20ybWdtdF9zZXRfZ3JwYWRkcihtaWItPmRpZCwgYnl0ZWJ1ZiwgcHN0ciwgaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQlyZXR1cm4ocmVzdWx0KTsKLQl9Ci0KLQlpZiAoaHctPmRvdDExX2dycGNudCA8PSBNQVhfUFJJU00yX0dSUF9BRERSKSB7Ci0JCWxlbiA9IGh3LT5kb3QxMV9ncnBjbnQgKiBXTEFOX0FERFJfTEVOOwotCQltZW1jcHkoYnl0ZWJ1ZiwgaHctPmRvdDExX2dycF9hZGRyWzBdLCBsZW4pOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9HUk9VUEFERFIsIGJ5dGVidWYsIGxlbik7Ci0KLQkJLyoKLQkJKiogVHVybiBvZmYgcHJvbWlzY3VvdXMgbW9kZSBpZiBjb3VudCBpcyBlcXVhbCB0byBNQVguICBXZSBtYXkKLQkJKiogaGF2ZSBiZWVuIGF0IGEgaGlnaGVyIGNvdW50IGluIHByb21pc2N1b3VzIG1vZGUgYW5kIG5lZWQgdG8KLQkJKiogdHVybiBpdCBvZmYuCi0JCSovCi0KLQkJLyogYnV0IG9ubHkgaWYgd2UncmUgbm90IGFscmVhZHkgaW4gcHJvbWlzYyBtb2RlLiA6KSAqLwotCQlpZiAoKGh3LT5kb3QxMV9ncnBjbnQgPT0gTUFYX1BSSVNNMl9HUlBfQUREUikgJiYKLQkJICAgICEoIHdsYW5kZXYtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJICAgICBIRkEzODR4X1JJRF9QUk9NSVNDTU9ERSwgMCk7Ci0JCX0KLQl9IGVsc2UgewotCi0JCS8qCi0JCSoqIENsZWFyIGdyb3VwIGFkZHJlc3NlcyBpbiBjYXJkIGFuZCBzZXQgdG8gcHJvbWlzY3VvdXMgbW9kZS4KLQkJKi8KLQotCQltZW1zZXQoYnl0ZWJ1ZiwgMCwgc2l6ZW9mKGJ5dGVidWYpKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfR1JPVVBBRERSLAotCQkJCQkJYnl0ZWJ1ZiwgMCk7Ci0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LAotCQkJCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERSwgMSk7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2Z3aWQKLSoKLSogR2V0IHRoZSBmaXJtd2FyZSBJRC4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9md2lkKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgIHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSBkYXRhOwotCWhmYTM4NHhfRldJRF90ICBmd2lkOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfRldJRCwKLQkJCQkJCSZmd2lkLCBIRkEzODR4X1JJRF9GV0lEX0xFTik7Ci0JCWlmIChtaWItPmRpZCA9PSBESURtaWJfcDJfcDJOSUNfcDJQcmltYXJ5RldJRCkgewotCQkJZndpZC5wcmltYXJ5W0hGQTM4NHhfRldJRF9MRU4gLSAxXSA9ICdcMCc7Ci0JCQlwc3RyLT5sZW4gPSBzdHJsZW4oZndpZC5wcmltYXJ5KTsKLQkJCW1lbWNweShwc3RyLT5kYXRhLCBmd2lkLnByaW1hcnksIHBzdHItPmxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlmd2lkLnNlY29uZGFyeVtIRkEzODR4X0ZXSURfTEVOIC0gMV0gPSAnXDAnOwotCQkJcHN0ci0+bGVuID0gc3RybGVuKGZ3aWQuc2Vjb25kYXJ5KTsKLQkJCW1lbWNweShwc3RyLT5kYXRhLCBmd2lkLnNlY29uZGFyeSwgcHN0ci0+bGVuKTsKLQkJfQotCX0gZWxzZQotCQlyZXN1bHQgPSAwOyAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfYXV0aGFsZwotKgotKiBHZXQgdmFsdWVzIGZyb20gdGhlIEF1aHRlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFRhYmxlIGluZGV4ICgxLTYpLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQotCURCRkVOVEVSOwotCi0JLyogTVNNOiBwa3ggc3VwcGxpZWQgY29kZSB0aGF0ICBjb2RlIHF1ZXJpZXMgUklEIEZENEQuLi4uYnV0IHRoZSBmL3cncwotICAgICAgICAgKiAgcmVzdWx0cyBhcmUgYm9ndXMuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBzaW11bGF0ZSB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICogIHJlc3VsdHMgaGVyZSBpbiB0aGUgZHJpdmVyIGJhc2VkIG9uIG91ciBrbm93bGVkZ2Ugb2YgZXhpc3RpbmcgTUFDCi0gICAgICAgICAqICBmZWF0dXJlcy4gIFRoYXQncyB0aGUgd2hvbGUgcG9pbnQgYmVoaW5kIHRoaXMgdWdseSBmdW5jdGlvbi4KLSAgICAgICAgICovCi0KLQlpZiAoaXNnZXQpIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJc3dpdGNoIChtaWItPnBhcm0xKSB7Ci0JCQljYXNlIDE6IC8qIE9wZW4gU3lzdGVtICovCi0JCQkJKnVpbnQzMiA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOiAvKiBTaGFyZWRLZXkgKi8KLQkJCQkqdWludDMyID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJKnVpbnQzMiA9IDA7Ci0JCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKDApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2F1dGhhbGdlbmFibGUKLSoKLSogR2V0L3NldCB0aGUgZW5hYmxlIHZhbHVlcyBmcm9tIHRoZSBBdWh0ZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBUYWJsZSBpbmRleCAoMS02KS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0KLQlpbnQgICAgIGluZGV4OwotCVVJTlQxNiAgY25mX2F1dGg7Ci0JVUlOVDE2CW1hc2s7Ci0KLQlEQkZFTlRFUjsKLQotCWluZGV4ID0gbWliLT5wYXJtMSAtIDE7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoIGh3LAotCQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sICZjbmZfYXV0aCk7Ci0JV0xBTl9MT0dfREVCVUcoMiwiY25mQXV0aGVudGljYXRpb24wPSVkLCBpbmRleD0lZFxuIiwgY25mX2F1dGgsIGluZGV4KTsKLQotCWlmIChpc2dldCkgewotCQlpZiAoIGluZGV4ID09IDAgfHwgaW5kZXggPT0gMSApIHsKLQkJCSp1aW50MzIgPSAoY25mX2F1dGggJiAoMTw8aW5kZXgpKSA/Ci0JCQkJUDgwMjExRU5VTV90cnV0aF90cnVlOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQl9IGVsc2UgewotCQkJKnVpbnQzMiA9IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCBpbmRleCA9PSAwIHx8IGluZGV4ID09IDEgKSB7Ci0JCQltYXNrID0gMSA8PCBpbmRleDsKLQkJCWlmICgqdWludDMyPT1QODAyMTFFTlVNX3RydXRoX3RydWUgKSB7Ci0JCQkJY25mX2F1dGggfD0gbWFzazsKLQkJCX0gZWxzZSB7Ci0JCQkJY25mX2F1dGggJj0gfm1hc2s7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoIGh3LAotCQkJCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTiwgY25mX2F1dGgpOwotCQkJV0xBTl9MT0dfREVCVUcoMiwiY25mQXV0aGVudGljYXRpb246PSVkXG4iLCBjbmZfYXV0aCk7Ci0JCQlpZiAoIHJlc3VsdCApIHsKLQkJCQlXTEFOX0xPR19ERUJVRygxLCJVbmFibGUgdG8gc2V0IHAyY25mQXV0aGVudGljYXRpb24gdG8gJWRcbiIsIGNuZl9hdXRoKTsKLQkJCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwotCQkJfQotCQl9IGVsc2UgewotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfcHJpdgogKgogKiBHZXQvc2V0IHZhbHVlcyBpbiB0aGUgInByaXYiIGRhdGEgc3RydWN0dXJlLgpAQCAtMjY5MCwyMTggKzc5NywxOCBAQAogcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAogdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKIHsKLQlVSU5UMzIgICAgICAgICAgICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7CiAJcDgwMjExcHN0cmRfdCAgICAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIGRhdGE7Ci0JcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5ID0gKHA4MDIxMW1hY2FycmF5X3QgKikgZGF0YTsKIAotCWludCAgaSwgY250LCByZXN1bHQsIGRvbmU7Ci0KLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgb2xkOwotCi0JLyoKLQkqKiAidGVzdCIgaXMgYSBsb3QgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IGJ1dCB3aG8gY2FyZXM/ICAuLi5hcyBsb25nIGFzCi0JKiogaXQgaXMgbG9uZyBlbm91Z2ghCi0JKi8KLQotCVVJTlQ4ICB0ZXN0W3NpemVvZih3bGFuZGV2LT5yeCkgKyBzaXplb2YoaHctPnRhbGxpZXMpXTsKKwlpbnQgIHJlc3VsdDsKIAogCURCRkVOVEVSOwogCiAJc3dpdGNoIChtaWItPmRpZCkgewotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJSZWNlaXZlZEZyYW1lU3RhdGlzdGljczoKLQotCQkvKgotCQkqKiBOb3RlOiBUaGUgdmFsdWVzIGluIHRoaXMgcmVjb3JkIGFyZSBjaGFuZ2VkIGJ5IHRoZQotCQkqKiBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0JCSoqIHRvIGJlIHN0YWJsZSB3aGlsZSB0aGV5IGFyZSBiZWluZyBjb3BpZWQuICBIb3dldmVyLAotCQkqKiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCB0YWtlIHByaW9yaXR5IG92ZXIgdGhpcwotCQkqKiBjb2RlLiAgSGVuY2UsIGlmIHRoZSBzYW1lIHZhbHVlcyBhcmUgY29waWVkIHR3aWNlLAotCQkqKiB0aGVuIHdlIGFyZSBlbnN1cmVkIHRoYXQgdGhlIHZhbHVlcyBoYXZlIG5vdCBiZWVuCi0JCSoqIGNoYW5nZWQuICBJZiB0aGV5IGhhdmUsIHRoZW4ganVzdCB0cnkgYWdhaW4uICBEb24ndAotCQkqKiB0cnkgbW9yZSB0aGFuIDEwIHRpbWVzLi4uaWYgd2Ugc3RpbGwgaGF2ZW4ndCBnb3QgaXQsCi0JCSoqIHRoZW4gdGhlIHZhbHVlcyB3ZSBkbyBoYXZlIGFyZSBwcm9iYWJseSBnb29kIGVub3VnaC4KLQkJKiogVGhpcyBzY2hlbWUgZm9yIGNvcHlpbmcgdmFsdWVzIGlzIHVzZWQgaW4gb3JkZXIgdG8KLQkJKiogcHJldmVudCBoYXZpbmcgdG8gYmxvY2sgdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWxlCi0JCSoqIHdlIGNvcHkgdGhlIHZhbHVlcy4KLQkJKi8KLQotCQlpZiAoaXNnZXQpCi0JCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCW1lbWNweShkYXRhLCAmd2xhbmRldi0+cngsIHNpemVvZih3bGFuZGV2LT5yeCkpOwotCQkJCW1lbWNweSh0ZXN0LCAmd2xhbmRldi0+cngsIHNpemVvZih3bGFuZGV2LT5yeCkpOwotCQkJCWlmIChtZW1jbXAoZGF0YSwgdGVzdCwgc2l6ZW9mKHdsYW5kZXYtPnJ4KSkgPT0gMCkgYnJlYWs7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbXVuaWNhdGlvblRhbGxpZXM6Ci0KLQkJLyoKLQkJKiogTm90ZTogVGhlIHZhbHVlcyBpbiB0aGlzIHJlY29yZCBhcmUgY2hhbmdlZCBieSB0aGUKLQkJKiogaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZ3VhcmFudGVlZAotCQkqKiB0byBiZSBzdGFibGUgd2hpbGUgdGhleSBhcmUgYmVpbmcgY29waWVkLiAgU2VlIHRoZQotCQkqKiBub3RlIGFib3ZlIGFib3V0IGNvcHlpbmcgdmFsdWVzLgotCQkqLwotCi0JCWlmIChpc2dldCkgewotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2NvbW10YWxsaWVzKGh3KTsKLQotCQkJLyogPz8/Pz8/IFdlIG5lZWQgdG8gd2FpdCBhIGJpdCBoZXJlIGZvciB0aGUgKi8KLQkJCS8qICAgdGFsbGllcyB0byBnZXQgdXBkYXRlZC4gPz8/Pz8/ICovCi0JCQkvKiBNU006IFRPRE86IFRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBpcyB0bwotCQkJICogICAgICBhZGQgYSAiY29tbXRhbGxpZSIgd2FpdCBxdWV1ZSB0byB0aGUKLQkJCSAqICAgICAgcHJpdiBzdHJ1Y3R1cmUgdGhhdCBnZXRzIHJ1biBldmVyeSB0aW1lCi0JCQkgKiAgICAgIHdlIHJlY2VpdmUgYSBjb21tdGFsbHkgaW5mbyBmcmFtZS4KLQkJCSAqICAgICAgVGhpcyBwcm9jZXNzIHdvdWxkIHNsZWVwIG9uIHRoYXQKLQkJCSAqICAgICAgcXVldWUgYW5kIGdldCBhd2FrZW5lZCB3aGVuIHRoZQotCQkJICogICAgICB0aGUgcmVxdWVzdGVkIGluZm8gZnJhbWUgYXJyaXZlcy4KLQkJCSAqICAgICAgRG9uJ3QgaGF2ZSB0aW1lIHRvIGRvIGFuZCB0ZXN0IHRoaXMKLQkJCSAqICAgICAgcmlnaHQgbm93LgotCQkJICovCi0KLQkJCS8qIFVnaCwgdGhpcyBpcyBuYXN0eS4gKi8KLQkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJbWVtY3B5KGRhdGEsCi0JCQkJICAgICAgICZody0+dGFsbGllcywKLQkJCQkgICAgICAgc2l6ZW9mKGh3LT50YWxsaWVzKSk7Ci0JCQkJbWVtY3B5KHRlc3QsCi0JCQkJICAgICAgICZody0+dGFsbGllcywKLQkJCQkgICAgICAgc2l6ZW9mKGh3LT50YWxsaWVzKSk7Ci0JCQkJaWYgKCBtZW1jbXAoZGF0YSwKLQkJCQkJICAgIHRlc3QsCi0JCQkJCSAgICBzaXplb2YoaHctPnRhbGxpZXMpKSA9PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkF1dGhlbnRpY2F0ZWQ6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkJCW1hY2FycmF5LT5jbnQgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykgewotCQkJCWlmICghb2xkLmFzc29jW2ldKSB7Ci0JCQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YVttYWNhcnJheS0+Y250XSwgb2xkLmFkZHJbaV0sIFdMQU5fQUREUl9MRU4pOwotCQkJCQltYWNhcnJheS0+Y250Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQXNzb2NpYXRlZDoKLQotCQlpZiAoaXNnZXQpIHsKLQkJCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQkJbWFjYXJyYXktPmNudCA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKSB7Ci0JCQkJaWYgKG9sZC5hc3NvY1tpXSkgewotCQkJCQltZW1jcHkobWFjYXJyYXktPmRhdGFbbWFjYXJyYXktPmNudF0sIG9sZC5hZGRyW2ldLCBXTEFOX0FERFJfTEVOKTsKLQkJCQkJbWFjYXJyYXktPmNudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMlBvd2VyU2F2ZVVzZXJDb3VudDoKLQotCQlpZiAoaXNnZXQpCi0JCQkqdWludDMyID0gaHctPnBzdXNlcmNvdW50OwotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW1lbnQ6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlwc3RyLT5sZW4gPSBzdHJsZW4oaHctPmNvbW1lbnQpOwotCQkJbWVtY3B5KHBzdHItPmRhdGEsIGh3LT5jb21tZW50LCBwc3RyLT5sZW4pOwotCQl9IGVsc2UgewotCQkJY250ID0gcHN0ci0+bGVuOwotCQkJaWYgKGNudCA8IDApIGNudCA9IDA7Ci0JCQlpZiAoY250ID49IHNpemVvZihody0+Y29tbWVudCkpCi0JCQkJY250ID0gc2l6ZW9mKGh3LT5jb21tZW50KS0xOwotCQkJbWVtY3B5KGh3LT5jb21tZW50LCBwc3RyLT5kYXRhLCBjbnQpOwotCQkJcHN0ci0+ZGF0YVtjbnRdID0gJ1wwJzsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc01vZGU6Ci0KLQkJaWYgKGlzZ2V0KQotCQkJKnVpbnQzMiA9IGh3LT5hY2Nlc3Ntb2RlOwotCQllbHNlCi0JCQlwcmlzbTJtaWJfcHJpdl9hY2Nlc3Ntb2RlKGh3LCAqdWludDMyKTsKLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NBbGxvdzoKLQotCQlpZiAoaXNnZXQpIHsKLQkJCW1hY2FycmF5LT5jbnQgPSBody0+YWxsb3cuY250OwotCQkJbWVtY3B5KG1hY2FycmF5LT5kYXRhLCBody0+YWxsb3cuYWRkciwKLQkJCSAgICAgICBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCQl9IGVsc2UgewotCQkJcHJpc20ybWliX3ByaXZfYWNjZXNzYWxsb3coaHcsIG1hY2FycmF5KTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0Rlbnk6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQltYWNhcnJheS0+Y250ID0gaHctPmRlbnkuY250OwotCQkJbWVtY3B5KG1hY2FycmF5LT5kYXRhLCBody0+ZGVueS5hZGRyLAotCQkJICAgICAgIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55KGh3LCBtYWNhcnJheSk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJDaGFubmVsSW5mb1Jlc3VsdHM6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlkb25lID0gYXRvbWljX3JlYWQoJmh3LT5jaGFubmVsX2luZm8uZG9uZSk7Ci0JCQlpZiAoZG9uZSA9PSAwKSB7Ci0JCQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZG9uZSA9PSAxKSB7Ci0JCQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfaW5jb21wbGV0ZV9pdGVtZGF0YTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyssIHVpbnQzMiArPSA1KSB7Ci0JCQkJdWludDMyWzBdID0gaSsxOwotCQkJCXVpbnQzMlsxXSA9IGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbaV0uYW5sOwotCQkJCXVpbnQzMlsyXSA9IGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbaV0ucG5sOwotCQkJCXVpbnQzMlszXSA9IChody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLmFjdGl2ZSAmIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRSkgPyAxIDogMDsKLQkJCQl1aW50MzJbNF0gPSAoaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtpXS5hY3RpdmUgJiBIRkEzODR4X0NISU5GT1JFU1VMVF9QQ0ZBQ1RJVkUpID8gMSA6IDA7Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZEJTU1R5cGU6Ci0KLQkJaWYgKGlzZ2V0KQotCQkJKnVpbnQzMiA9IGh3LT5kb3QxMV9kZXNpcmVkX2Jzc190eXBlOwotCQllbHNlCi0JCQlody0+ZG90MTFfZGVzaXJlZF9ic3NfdHlwZSA9ICp1aW50MzI7Ci0KLQkJYnJlYWs7Ci0KIAljYXNlIERJRG1pYl9sbnhfbG54Q29uZmlnVGFibGVfbG54UlNOQUlFOiB7CiAJCWhmYTM4NHhfV1BBRGF0YV90IHdwYTsKIAkJaWYgKGlzZ2V0KSB7CiAJCQloZmEzODR4X2RydnJfZ2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GV1BBREFUQSwKLQkJCQkJCShVSU5UOCAqKSAmd3BhLCBzaXplb2Yod3BhKSk7CisJCQkJCQkodTggKikgJndwYSwgc2l6ZW9mKHdwYSkpOwogCQkJcHN0ci0+bGVuID0gaGZhMzg0eDJob3N0XzE2KHdwYS5kYXRhbGVuKTsKIAkJCW1lbWNweShwc3RyLT5kYXRhLCB3cGEuZGF0YSwgcHN0ci0+bGVuKTsKIAkJfSBlbHNlIHsKQEAgLTI5MDksNyArODE2LDcgQEAKIAkJCW1lbWNweSh3cGEuZGF0YSwgcHN0ci0+ZGF0YSwgcHN0ci0+bGVuKTsKIAogCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GV1BBREFUQSwKLQkJCQkoVUlOVDggKikgJndwYSwgc2l6ZW9mKHdwYSkpOworCQkJCSh1OCAqKSAmd3BhLCBzaXplb2Yod3BhKSk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMjkyMiwzNDUgKzgyOSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hdXRobGlzdAotKgotKiBHZXQgYSBjb3B5IG9mIHRoZSBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgbGlzdCAgICAgTGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoCi1oZmEzODR4X3QgICAgICAgICAgICAgKmh3LAotcHJpc20yc3RhX2F1dGhsaXN0X3QgICpsaXN0KQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICB0ZXN0OwotCWludCAgICAgICAgICAgICAgICAgICBpOwotCi0JREJGRU5URVI7Ci0KLQkvKgotCSoqIE5vdGU6IFRoZSB2YWx1ZXMgaW4gdGhpcyByZWNvcmQgYXJlIGNoYW5nZWQgYnkgdGhlIGludGVycnVwdAotCSoqIGhhbmRsZXIgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUgd2hpbGUKLQkqKiB0aGV5IGFyZSBiZWluZyBjb3BpZWQuICBIb3dldmVyLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAotCSoqIHRha2UgcHJpb3JpdHkgb3ZlciB0aGlzIGNvZGUuICBIZW5jZSwgaWYgdGhlIHNhbWUgdmFsdWVzIGFyZQotCSoqIGNvcGllZCB0d2ljZSwgdGhlbiB3ZSBhcmUgZW5zdXJlZCB0aGF0IHRoZSB2YWx1ZXMgaGF2ZSBub3QKLQkqKiBiZWVuIGNoYW5nZWQuICBJZiB0aGV5IGhhdmUsIHRoZW4ganVzdCB0cnkgYWdhaW4uICBEb24ndCB0cnkKLQkqKiBtb3JlIHRoYW4gMTAgdGltZXMuLi50aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zIGlzCi0JKiogdW5saWtlbHkgdG8gYmUgY2hhbmdpbmcgZnJlcXVlbnRseSBlbm91Z2ggdGhhdCB3ZSBjYW4ndCBnZXQKLQkqKiBhIHNuYXBzaG90IGluIDEwIHRyaWVzLiAgRG9uJ3QgdHJ5IG1vcmUgdGhhbiB0aGlzIHNvIHRoYXQgd2UKLQkqKiBkb24ndCByaXNrIGxvY2tpbmctdXAgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lLiAgSWYgd2Ugc3RpbGwKLQkqKiBoYXZlbid0IGdvdCB0aGUgc25hcHNob3QsIHRoZW4gZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBhbmQKLQkqKiByZXR1cm4gYW4gZW1wdHkgbGlzdCAoc2luY2UgdGhpcyBpcyB0aGUgb25seSB2YWxpZCBsaXN0IHRoYXQKLQkqKiB3ZSBjYW4gZ3VhcmVudGVlKS4gIFRoaXMgc2NoZW1lIGZvciBjb3B5aW5nIHZhbHVlcyBpcyB1c2VkIGluCi0JKiogb3JkZXIgdG8gcHJldmVudCBoYXZpbmcgdG8gYmxvY2sgdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWxlCi0JKiogd2UgY29weSB0aGUgdmFsdWVzLgotCSovCi0KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQltZW1jcHkobGlzdCwgJmh3LT5hdXRobGlzdCwgc2l6ZW9mKHByaXNtMnN0YV9hdXRobGlzdF90KSk7Ci0JCW1lbWNweSgmdGVzdCwgJmh3LT5hdXRobGlzdCwgc2l6ZW9mKHByaXNtMnN0YV9hdXRobGlzdF90KSk7Ci0JCWlmIChtZW1jbXAobGlzdCwgJnRlc3QsIHNpemVvZihwcmlzbTJzdGFfYXV0aGxpc3RfdCkpID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA+PSAxMCkgewotCQlsaXN0LT5jbnQgPSAwOwotCQlXTEFOX0xPR19FUlJPUigiQ291bGQgbm90IG9idGFpbiBzbmFwc2hvdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLlxuIik7Ci0JCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZQotKgotKiBTZXQgdGhlIEFjY2VzcyBNb2RlLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtb2RlICAgICBOZXcgYWNjZXNzIG1vZGUuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3Ntb2RlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDMyICAgICAgICAgICAgbW9kZSkKLXsKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgb2xkOwotCWludCAgICAgICAgICAgICAgICAgICBpLCBqLCBkZWF1dGg7Ci0JVUlOVDggICAgICAgICAgICAgICAgICphZGRyOwotCi0JREJGRU5URVI7Ci0KLQkvKgotCSoqIElmIHRoZSBtb2RlIGlzIG5vdCBjaGFuZ2luZyBvciBpdCBpcyBjaGFuZ2luZyB0byAiQWxsIiwgdGhlbiBpdCdzCi0JKiogb2theSB0byBnbyBhaGVhZCB3aXRob3V0IGEgbG90IG9mIG1lc3NpbmcgYXJvdW5kLiAgT3RoZXJ3aXNlLCB0aGUKLQkqKiBhY2Nlc3MgbW9kZSBpcyBjaGFuZ2luZyBpbiBhIHdheSB0aGF0IG1heSBsZWF2ZSBzb21lIHN0YXRpb25zCi0JKiogYXV0aGVudGljYXRlZCB3aGljaCBzaG91bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQuICBJdCB3aWxsIGJlCi0JKiogbmVjZXNzYXJ5IHRvIGRlLWF1dGhlbnRpY2F0ZSB0aGVzZSBzdGF0aW9ucy4KLQkqLwotCi0JaWYgKG1vZGUgPT0gV0xBTl9BQ0NFU1NfQUxMIHx8IG1vZGUgPT0gaHctPmFjY2Vzc21vZGUpIHsKLQkJaHctPmFjY2Vzc21vZGUgPSBtb2RlOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkqKiBTd2l0Y2ggdG8gdGhlIG5ldyBhY2Nlc3MgbW9kZS4gIE9uY2UgdGhpcyBpcyBkb25lLCB0aGVuIHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyICh3aGljaCB1c2VzIHRoaXMgdmFsdWUpIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYXV0aGVudGljYXRpbmcKLQkqKiBBRERJVElPTkFMIHN0YXRpb25zIHdoaWNoIHNob3VsZCBub3QgYmUgYXV0aGVudGljYXRlZC4gIFRoZW4gZ2V0IGEKLQkqKiBjb3B5IG9mIHRoZSBjdXJyZW50IGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy4KLQkqLwotCi0JaHctPmFjY2Vzc21vZGUgPSBtb2RlOwotCi0JcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JLyoKLQkqKiBOb3cgZ28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMgKHNvbWUKLQkqKiBvZiB3aGljaCBtaWdodCBkZS1hdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB3aGlsZSB3ZSBhcmUgcHJvY2Vzc2luZyBpdAotCSoqIGJ1dCB0aGF0IGlzIG9rYXkpLiAgQW55IHN0YXRpb24gd2hpY2ggbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIGFjY2VzcwotCSoqIG1vZGUsIG11c3QgYmUgZGUtYXV0aGVudGljYXRlZC4KLQkqLwotCi0JZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykgewotCQlhZGRyID0gb2xkLmFkZHJbaV07Ci0KLQkJaWYgKG1vZGUgPT0gV0xBTl9BQ0NFU1NfTk9ORSkKLQkJCWRlYXV0aCA9IDE7Ci0JCWVsc2UgewotCQkJaWYgKG1vZGUgPT0gV0xBTl9BQ0NFU1NfQUxMT1cpIHsKLQkJCQlmb3IgKGogPSAwOyBqIDwgaHctPmFsbG93LmNudDsgaisrKQotCQkJCQlpZiAobWVtY21wKGFkZHIsIGh3LT5hbGxvdy5hZGRyW2pdLAotCQkJCQkJCVdMQU5fQUREUl9MRU4pID09IDApCi0JCQkJCQlicmVhazsKLQkJCQlkZWF1dGggPSAoaiA+PSBody0+YWxsb3cuY250KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChqID0gMDsgaiA8IGh3LT5kZW55LmNudDsgaisrKQotCQkJCQlpZiAobWVtY21wKGFkZHIsIGh3LT5kZW55LmFkZHJbal0sCi0JCQkJCQkJV0xBTl9BRERSX0xFTikgPT0gMCkKLQkJCQkJCWJyZWFrOwotCQkJCWRlYXV0aCA9IChqIDwgaHctPmRlbnkuY250KTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZWF1dGgpIHByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKGh3LCBhZGRyKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93Ci0qCi0qIENoYW5nZSB0aGUgbGlzdCBvZiBhbGxvd2VkIE1BQyBhZGRyZXNzZXMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgcHJpdiAgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbWFjYXJyYXkgIE5ldyBhcnJheSBvZiBNQUMgYWRkcmVzc2VzLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzYWxsb3coCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1wODAyMTFtYWNhcnJheV90ICAqbWFjYXJyYXkpCi17Ci0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaSwgajsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBDaGFuZ2UgdGhlIGFjY2VzcyBsaXN0LiAgTm90ZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgYmUgaW4KLQkqKiB0aGUgbWlkZGxlIG9mIHVzaW5nIHRoZSBhY2Nlc3MgbGlzdCEhISAgU2luY2UgdGhlIGludGVycnVwdCBoYW5kbGVyCi0JKiogd2lsbAlhbHdheXMgaGF2ZSBwcmlvcml0eSBvdmVyIHRoaXMgcHJvY2VzcyBhbmQgdGhpcyBpcyB0aGUgb25seQotCSoqIHByb2Nlc3MgdGhhdCB3aWxsIG1vZGlmeSB0aGUgbGlzdCwgdGhpcyBwcm9ibGVtIGNhbiBiZSBoYW5kbGVkIGFzCi0JKiogZm9sbG93czoKLQkqKgotCSoqICAgIDEuIFNldCB0aGUgIm1vZGlmeSIgZmxhZy4KLQkqKiAgICAyLiBDaGFuZ2UgdGhlIGZpcnN0IGNvcHkgb2YgdGhlIGxpc3QuCi0JKiogICAgMy4gQ2xlYXIgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgNC4gQ2hhbmdlIHRoZSBiYWNrdXAgY29weSBvZiB0aGUgbGlzdC4KLQkqKgotCSoqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGNoZWNrIHRoZSAibW9kaWZ5IiBmbGFnLiAgSWYgTk9UIHNldCwgdGhlbgotCSoqIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0IGlzIHZhbGlkIGFuZCBtYXkgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlCi0JKiogZmlyc3QgY29weSBpcyBiZWluZyBjaGFuZ2VkIGJ1dCB0aGUgYmFja3VwIGNvcHkgaXMgdmFsaWQgYW5kIG1heSBiZQotCSoqIHVzZWQuICBEb2luZyB0aGluZ3MgdGhpcyB3YXkgcHJldmVudHMgaGF2aW5nIHRvIGhhdmUgdGhlIGludGVycnVwdAotCSoqIGhhbmRsZXIgYmxvY2sgd2hpbGUgdGhlIGxpc3QgaXMgYmVpbmcgdXBkYXRlZC4KLQkqLwotCi0JaHctPmFsbG93Lm1vZGlmeSA9IDE7Ci0KLQlody0+YWxsb3cuY250ID0gbWFjYXJyYXktPmNudDsKLQltZW1jcHkoaHctPmFsbG93LmFkZHIsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JaHctPmFsbG93Lm1vZGlmeSA9IDA7Ci0KLQlody0+YWxsb3cuY250MSA9IG1hY2FycmF5LT5jbnQ7Ci0JbWVtY3B5KGh3LT5hbGxvdy5hZGRyMSwgbWFjYXJyYXktPmRhdGEsIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0KLQkvKgotCSoqIElmIHRoZSBjdXJyZW50IGFjY2VzcyBtb2RlIGlzICJBbGxvdyIsIHRoZW4gY2hhbmdpbmcgdGhlIGFjY2VzcwotCSoqIGxpc3QgbWF5IGxlYXZlIHNvbWUgc3RhdGlvbnMgYXV0aGVudGljYXRlZCB3aGljaCBzaG91bGQgbm90IGJlCi0JKiogYXV0aGVudGljYXRlZC4gIEl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGRlLWF1dGhlbnRpY2F0ZSB0aGVzZQotCSoqIHN0YXRpb25zLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGEgbG90IG9mIGZ1c3MuCi0JKi8KLQotCWlmIChody0+YWNjZXNzbW9kZSA9PSBXTEFOX0FDQ0VTU19BTExPVykgewotCi0JCS8qCi0JCSoqIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucyAoc29tZSBvZgotCQkqKiB3aGljaCBtaWdodCBkZS1hdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB3aGlsZSB3ZSBhcmUKLQkJKiogcHJvY2Vzc2luZyBpdCBidXQgdGhhdCBpcyBva2F5KS4gIEFueSBzdGF0aW9uIHdoaWNoIGlzCi0JCSoqIG5vIGxvbmdlciBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHN0YXRpb25zLCBtdXN0IGJlCi0JCSoqIGRlLWF1dGhlbnRpY2F0ZWQuCi0JCSovCi0KLQkJcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJCWZvciAoaiA9IDA7IGogPCBody0+YWxsb3cuY250OyBqKyspCi0JCQkJaWYgKG1lbWNtcChvbGQuYWRkcltpXSwgaHctPmFsbG93LmFkZHJbal0sCi0JCQkJCQkJV0xBTl9BRERSX0xFTikgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQlpZiAoaiA+PSBody0+YWxsb3cuY250KQotCQkJCXByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKGh3LCBvbGQuYWRkcltpXSk7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2FjY2Vzc2RlbnkKLSoKLSogQ2hhbmdlIHRoZSBsaXN0IG9mIGRlbmllZCBNQUMgYWRkcmVzc2VzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1hY2FycmF5ICBOZXcgYXJyYXkgb2YgTUFDIGFkZHJlc3Nlcy4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2RlbnkoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1wODAyMTFtYWNhcnJheV90ICAqbWFjYXJyYXkpCi17Ci0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaSwgajsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBDaGFuZ2UgdGhlIGFjY2VzcyBsaXN0LiAgTm90ZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBtYXkgYmUgaW4KLQkqKiB0aGUgbWlkZGxlIG9mIHVzaW5nIHRoZSBhY2Nlc3MgbGlzdCEhISAgU2luY2UgdGhlIGludGVycnVwdCBoYW5kbGVyCi0JKiogd2lsbCBhbHdheXMgaGF2ZSBwcmlvcml0eSBvdmVyIHRoaXMgcHJvY2VzcyBhbmQgdGhpcyBpcyB0aGUgb25seQotCSoqIHByb2Nlc3MgdGhhdCB3aWxsIG1vZGlmeSB0aGUgbGlzdCwgdGhpcyBwcm9ibGVtIGNhbiBiZSBoYW5kbGVkIGFzCi0JKiogZm9sbG93czoKLQkqKgotCSoqICAgIDEuIFNldCB0aGUgIm1vZGlmeSIgZmxhZy4KLQkqKiAgICAyLiBDaGFuZ2UgdGhlIGZpcnN0IGNvcHkgb2YgdGhlIGxpc3QuCi0JKiogICAgMy4gQ2xlYXIgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgNC4gQ2hhbmdlIHRoZSBiYWNrdXAgY29weSBvZiB0aGUgbGlzdC4KLQkqKgotCSoqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGNoZWNrIHRoZSAibW9kaWZ5IiBmbGFnLiAgSWYgTk9UIHNldCwgdGhlbgotCSoqIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0IGlzIHZhbGlkIGFuZCBtYXkgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlCi0JKiogZmlyc3QgY29weSBpcyBiZWluZyBjaGFuZ2VkIGJ1dCB0aGUgYmFja3VwIGNvcHkgaXMgdmFsaWQgYW5kIG1heSBiZQotCSoqIHVzZWQuICBEb2luZyB0aGluZ3MgdGhpcyB3YXkgcHJldmVudHMgaGF2aW5nIHRvIGhhdmUgdGhlIGludGVycnVwdAotCSoqIGhhbmRsZXIgYmxvY2sgd2hpbGUgdGhlIGxpc3QgaXMgYmVpbmcgdXBkYXRlZC4KLQkqLwotCi0JaHctPmRlbnkubW9kaWZ5ID0gMTsKLQotCWh3LT5kZW55LmNudCA9IG1hY2FycmF5LT5jbnQ7Ci0JbWVtY3B5KGh3LT5kZW55LmFkZHIsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JaHctPmRlbnkubW9kaWZ5ID0gMDsKLQotCWh3LT5kZW55LmNudDEgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+ZGVueS5hZGRyMSwgbWFjYXJyYXktPmRhdGEsIG1hY2FycmF5LT5jbnQqV0xBTl9BRERSX0xFTik7Ci0KLQkvKgotCSoqIElmIHRoZSBjdXJyZW50IGFjY2VzcyBtb2RlIGlzICJEZW55IiwgdGhlbiBjaGFuZ2luZyB0aGUgYWNjZXNzCi0JKiogbGlzdCBtYXkgbGVhdmUgc29tZSBzdGF0aW9ucyBhdXRoZW50aWNhdGVkIHdoaWNoIHNob3VsZCBub3QgYmUKLQkqKiBhdXRoZW50aWNhdGVkLiAgSXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gZGUtYXV0aGVudGljYXRlIHRoZXNlCi0JKiogc3RhdGlvbnMuICBPdGhlcndpc2UsIHRoZSBsaXN0IGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgYSBsb3Qgb2YgZnVzcy4KLQkqLwotCi0JaWYgKGh3LT5hY2Nlc3Ntb2RlID09IFdMQU5fQUNDRVNTX0RFTlkpIHsKLQotCQkvKgotCQkqKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMgKHNvbWUgb2YKLQkJKiogd2hpY2ggbWlnaHQgZGUtYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgd2hpbGUgd2UgYXJlCi0JCSoqIHByb2Nlc3NpbmcgaXQgYnV0IHRoYXQgaXMgb2theSkuICBBbnkgc3RhdGlvbiB3aGljaCBpcwotCQkqKiBub3cgaW4gdGhlIGxpc3Qgb2YgZGVuaWVkIHN0YXRpb25zLCBtdXN0IGJlIGRlLWF1dGhlbnRpY2F0ZWQuCi0JCSovCi0KLQkJcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspCi0JCQlmb3IgKGogPSAwOyBqIDwgaHctPmRlbnkuY250OyBqKyspCi0JCQkJaWYgKG1lbWNtcChvbGQuYWRkcltpXSwgaHctPmRlbnkuYWRkcltqXSwKLQkJCQkJCQkgV0xBTl9BRERSX0xFTikgPT0gMCkgewotCQkJCQlwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZShodywgb2xkLmFkZHJbaV0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZQotKgotKiBEZS1hdXRoZW50aWNhdGUgYSBzdGF0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IHNlbmRpbmcgYSBIYW5kb3ZlckFkZHJlc3MKLSogaW5mb3JtYXRpb24gZnJhbWUgdG8gdGhlIGZpcm13YXJlLiAgVGhpcyBzaG91bGQgd29yaywgYWNjb3JkaW5nIHRvCi0qIEludGVyc2lsLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBhZGRyICAgICBNQUMgYWRkcmVzcyBvZiBzdGF0aW9uIHRvIGJlIGRlLWF1dGhlbnRpY2F0ZWQuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLVVJTlQ4ICAgICAgICAgICAgICphZGRyKQotewotCURCRkVOVEVSOwotCWhmYTM4NHhfZHJ2cl9oYW5kb3ZlcihodywgYWRkcik7Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyCiAqCiAqIENvbnZlcnQgdGhlIHBzdHIgZGF0YSBpbiB0aGUgV0xBTiBtZXNzYWdlIHN0cnVjdHVyZSBpbnRvIGFuIGhmYTM4NHgKQEAgLTMyNzksNyArODQ3LDcgQEAKIHsKIAlEQkZFTlRFUjsKIAotCWJ5dGVzdHItPmxlbiA9IGhvc3QyaGZhMzg0eF8xNigoVUlOVDE2KShwc3RyLT5sZW4pKTsKKwlieXRlc3RyLT5sZW4gPSBob3N0MmhmYTM4NHhfMTYoKHUxNikocHN0ci0+bGVuKSk7CiAJbWVtY3B5KGJ5dGVzdHItPmRhdGEsIHBzdHItPmRhdGEsIHBzdHItPmxlbik7CiAJREJGRVhJVDsKIH0KQEAgLTMzMDAsNyArODY4LDcgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlYXJlYShVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCit2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlYXJlYSh1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCiB7CiAJREJGRU5URVI7CiAKQEAgLTMzMjgsNyArODk2LDcgQEAKIHsKIAlEQkZFTlRFUjsKIAotCXBzdHItPmxlbiA9IChVSU5UOCkoaGZhMzg0eDJob3N0XzE2KChVSU5UMTYpKGJ5dGVzdHItPmxlbikpKTsKKwlwc3RyLT5sZW4gPSAodTgpKGhmYTM4NHgyaG9zdF8xNigodTE2KShieXRlc3RyLT5sZW4pKSk7CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVzdHItPmRhdGEsIHBzdHItPmxlbik7CiAJREJGRVhJVDsKIH0KQEAgLTMzNDksMTEgKzkxNywxMSBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKFVJTlQ4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbikKK3ZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbikKIHsKIAlEQkZFTlRFUjsKIAotCXBzdHItPmxlbiA9IChVSU5UOClsZW47CisJcHN0ci0+bGVuID0gKHU4KWxlbjsKIAltZW1jcHkocHN0ci0+ZGF0YSwgYnl0ZWFyZWEsIGxlbik7CiAJREJGRVhJVDsKIH0KQEAgLTMzNzMsMTEgKzk0MSwxMSBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgcHJpc20ybWdtdF9wcmlzbTJpbnQycDgwMjExaW50KFVJTlQxNiAqcHJpc20yaW50LCBVSU5UMzIgKndsYW5pbnQpCit2b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh1MTYgKnByaXNtMmludCwgdTMyICp3bGFuaW50KQogewogCURCRkVOVEVSOwogCi0JKndsYW5pbnQgPSAoVUlOVDMyKWhmYTM4NHgyaG9zdF8xNigqcHJpc20yaW50KTsKKwkqd2xhbmludCA9ICh1MzIpaGZhMzg0eDJob3N0XzE2KCpwcmlzbTJpbnQpOwogCURCRkVYSVQ7CiB9CiAKQEAgLTMzOTYsMTEgKzk2NCwxMSBAQAogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KFVJTlQxNiAqcHJpc20yaW50LCBVSU5UMzIgKndsYW5pbnQpCit2b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh1MTYgKnByaXNtMmludCwgdTMyICp3bGFuaW50KQogewogCURCRkVOVEVSOwogCi0JKnByaXNtMmludCA9IGhvc3QyaGZhMzg0eF8xNigoVUlOVDE2KSgqd2xhbmludCkpOworCSpwcmlzbTJpbnQgPSBob3N0MmhmYTM4NHhfMTYoKHUxNikoKndsYW5pbnQpKTsKIAlEQkZFWElUOwogfQogCkBAIC0zNDE5LDcgKzk4Nyw3IEBACiAqCU5vdGhpbmcKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X3ByaXNtMmVudW0ycDgwMjExZW51bShVSU5UMTYgKnByaXNtMmVudW0sIFVJTlQzMiAqd2xhbmVudW0sIFVJTlQxNiByaWQpCit2b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCkKIHsKIAlEQkZFTlRFUjsKIApAQCAtMzQ0NSw3ICsxMDEzLDcgQEAKICoJTm90aGluZwogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCkKK3ZvaWQgcHJpc20ybWdtdF9wODAyMTFlbnVtMnByaXNtMmVudW0odTE2ICpwcmlzbTJlbnVtLCB1MzIgKndsYW5lbnVtLCB1MTYgcmlkKQogewogCURCRkVOVEVSOwogCkBAIC0zNDcxLDEwICsxMDM5LDEwIEBACiAqCU5vdGhpbmcKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQoVUlOVDE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKQordm9pZCBwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQodTE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKQogewotCVVJTlQ4CWxlbjsKLQlVSU5UOAkqZGF0YXJhdGU7CisJdTgJbGVuOworCXU4CSpkYXRhcmF0ZTsKIAogCURCRkVOVEVSOwogCkBAIC0zNDgzLDI5ICsxMDUxLDI5IEBACiAKICAJLyogMSBNYnBzICovCiAJaWYgKCBCSVQwICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpMjsKKwkJbGVuICs9ICh1OCkxOworCQkqZGF0YXJhdGUgPSAodTgpMjsKIAkJZGF0YXJhdGUrKzsKIAl9CiAKICAJLyogMiBNYnBzICovCiAJaWYgKCBCSVQxICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpNDsKKwkJbGVuICs9ICh1OCkxOworCQkqZGF0YXJhdGUgPSAodTgpNDsKIAkJZGF0YXJhdGUrKzsKIAl9CiAKICAJLyogNS41IE1icHMgKi8KIAlpZiAoIEJJVDIgJiAoKnJhdGUpICkgewotCQlsZW4gKz0gKFVJTlQ4KTE7Ci0JCSpkYXRhcmF0ZSA9IChVSU5UOCkxMTsKKwkJbGVuICs9ICh1OCkxOworCQkqZGF0YXJhdGUgPSAodTgpMTE7CiAJCWRhdGFyYXRlKys7CiAJfQogCiAgCS8qIDExIE1icHMgKi8KIAlpZiAoIEJJVDMgJiAoKnJhdGUpICkgewotCQlsZW4gKz0gKFVJTlQ4KTE7Ci0JCSpkYXRhcmF0ZSA9IChVSU5UOCkyMjsKKwkJbGVuICs9ICh1OCkxOworCQkqZGF0YXJhdGUgPSAodTgpMjI7CiAJCWRhdGFyYXRlKys7CiAJfQogCkBAIC0zNTMwLDkgKzEwOTgsOSBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKK3ZvaWQgcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KHUxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKIHsKLQlVSU5UOAkqZGF0YXJhdGU7CisJdTgJKmRhdGFyYXRlOwogCWludAlpOwogCiAJREJGRU5URVI7CkBAIC0zNTY1LDIzMyArMTEzMywzIEBACiAJREJGRVhJVDsKIAlyZXR1cm47CiB9Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9nZXRfZ3JwYWRkcgotKgotKiBSZXRyaWV2ZXMgYSBwYXJ0aWN1bGFyIGdyb3VwIGFkZHJlc3MgZnJvbSB0aGUgbGlzdCBvZgotKiBncm91cCBhZGRyZXNzZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJZGlkCQltaWJpdGVtIGRpZAotKglwc3RyCQl3bGFuIG9jdGV0IHN0cmluZwotKglwcml2CQlwcmlzbTIgZHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIoVUlOVDMyIGRpZCwgcDgwMjExcHN0cmRfdCAqcHN0ciwKLQloZmEzODR4X3QgKmh3ICkKLXsKLQlpbnQJaW5kZXg7Ci0KLQlEQkZFTlRFUjsKLQotCWluZGV4ID0gcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleChkaWQpOwotCi0JaWYgKCBpbmRleCA+PSAwICkgewotCQlwc3RyLT5sZW4gPSBXTEFOX0FERFJfTEVOOwotCQltZW1jcHkocHN0ci0+ZGF0YSwgaHctPmRvdDExX2dycF9hZGRyW2luZGV4XSwKLQkJCVdMQU5fQUREUl9MRU4pOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfc2V0X2dycGFkZHIKLSoKLSogQ29udmVydCB0aGUgd2xhbiBvY3RldCBzdHJpbmcgaW50byBhbiBoZmEzODR4IGJpdCBhcmVhLgotKgotKiBBcmd1bWVudHM6Ci0qCWRpZAkJbWliaXRlbSBkaWQKLSoJYnVmCi0qCWdyb3VwcwotKgotKiBSZXR1cm5zOgotKgkwCVN1Y2Nlc3MKLSoJITAJRXJyb3IKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIoVUlOVDMyIGRpZCwgVUlOVDggKnByaXNtMmJ1ZiwKLQlwODAyMTFwc3RyZF90ICpwc3RyLCBoZmEzODR4X3QgKmh3ICkKLXsKLQlVSU5UOAlub19hZGRyW1dMQU5fQUREUl9MRU5dOwotCWludAlpbmRleDsKLQotCURCRkVOVEVSOwotCi0JbWVtc2V0KG5vX2FkZHIsIDAsIFdMQU5fQUREUl9MRU4pOwotCWlmIChtZW1jbXAobm9fYWRkciwgcHN0ci0+ZGF0YSwgV0xBTl9BRERSX0xFTikgIT0gMCkgewotCi0JCS8qCi0JCSoqIFRoZSBhZGRyZXNzIGlzIE5PVCAwIHNvIHdlIGFyZSAiYWRkaW5nIiBhbiBhZGRyZXNzIHRvIHRoZQotCQkqKiBncm91cCBhZGRyZXNzIGxpc3QuICBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlbid0IHRyeWluZwotCQkqKiB0byBhZGQgbW9yZSB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGdyb3VwCi0JCSoqIGFkZHJlc3NlcyBpbiB0aGUgbGlzdC4gIFRoZSBuZXcgYWRkcmVzcyBpcyBhZGRlZCB0byB0aGUKLQkJKiogZW5kIG9mIHRoZSBsaXN0IHJlZ2FyZGxlc3Mgb2YgdGhlIERJRCB1c2VkIHRvIGFkZCB0aGUKLQkJKiogYWRkcmVzcy4KLQkJKi8KLQotCQlpZiAoaHctPmRvdDExX2dycGNudCA+PSBNQVhfR1JQX0FERFIpIHJldHVybigtMSk7Ci0KLQkJbWVtY3B5KGh3LT5kb3QxMV9ncnBfYWRkcltody0+ZG90MTFfZ3JwY250XSwgcHN0ci0+ZGF0YSwKLQkJCQkJCQkJIFdMQU5fQUREUl9MRU4pOwotCQlody0+ZG90MTFfZ3JwY250ICs9IDE7Ci0JfSBlbHNlIHsKLQotCQkvKgotCQkqKiBUaGUgYWRkcmVzcyBpcyAwLiAgSW50ZXJwcmV0IHRoaXMgYXMgImRlbGV0aW5nIiBhbiBhZGRyZXNzCi0JCSoqIGZyb20gdGhlIGdyb3VwIGFkZHJlc3MgbGlzdC4gIEdldCB0aGUgYWRkcmVzcyBpbmRleCBmcm9tCi0JCSoqIHRoZSBESUQuICBJZiB0aGlzIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdXNlZCBhZGRyZXNzZXMsCi0JCSoqIHRoZW4gZGVsZXRlIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBieSBzaGlmdGluZyBhbGwgZm9sbG93aW5nCi0JCSoqIGFkZHJlc3NlcyBkb3duLiAgVGhlbiBjbGVhciB0aGUgbGFzdCBhZGRyZXNzICh3aGljaCBzaG91bGQKLQkJKiogbm93IGJlIHVudXNlZCkuICBJZiB0aGUgYWRkcmVzcyBpbmRleCBpcyBOT1Qgd2l0aGluIHRoZQotCQkqKiByYW5nZSBvZiB1c2VkIGFkZHJlc3NlcywgdGhlbiBqdXN0IGlnbm9yZSB0aGUgYWRkcmVzcy4KLQkJKi8KLQotCQlpbmRleCA9IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoZGlkKTsKLQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBody0+ZG90MTFfZ3JwY250KSB7Ci0JCQlody0+ZG90MTFfZ3JwY250IC09IDE7Ci0JCQltZW1tb3ZlKGh3LT5kb3QxMV9ncnBfYWRkcltpbmRleF0sCi0JCQkJaHctPmRvdDExX2dycF9hZGRyW2luZGV4ICsgMV0sCi0JCQkJKChody0+ZG90MTFfZ3JwY250KS1pbmRleCkgKiBXTEFOX0FERFJfTEVOKTsKLQkJCW1lbXNldChody0+ZG90MTFfZ3JwX2FkZHJbaHctPmRvdDExX2dycGNudF0sIDAsCi0JCQkJCQkJCSBXTEFOX0FERFJfTEVOKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKDApOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4Ci0qCi0qIEdldHMgdGhlIGluZGV4IGluIHRoZSBncm91cCBhZGRyZXNzIGxpc3QgYmFzZWQgb24gdGhlIGRpZC4KLSoKLSogQXJndW1lbnRzOgotKglkaWQJCW1pYml0ZW0gZGlkCi0qCi0qIFJldHVybnM6Ci0qCT49IDAJSWYgdmFsaWQgZGlkCi0qCTwgMAlJZiBub3QgdmFsaWQgZGlkCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KCBVSU5UMzIgZGlkICkKLXsKLQlpbnQJaW5kZXg7Ci0KLQlEQkZFTlRFUjsKLQotCWluZGV4ID0gLTE7Ci0KLQlzd2l0Y2ggKGRpZCkgewotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOgotCQlpbmRleCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOgotCQlpbmRleCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzOgotCQlpbmRleCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M0OgotCQlpbmRleCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M1OgotCQlpbmRleCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M2OgotCQlpbmRleCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M3OgotCQlpbmRleCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M4OgotCQlpbmRleCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M5OgotCQlpbmRleCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMDoKLQkJaW5kZXggPSA5OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTE6Ci0JCWluZGV4ID0gMTA7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMjoKLQkJaW5kZXggPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEzOgotCQlpbmRleCA9IDEyOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTQ6Ci0JCWluZGV4ID0gMTM7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNToKLQkJaW5kZXggPSAxNDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE2OgotCQlpbmRleCA9IDE1OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTc6Ci0JCWluZGV4ID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxODoKLQkJaW5kZXggPSAxNzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE5OgotCQlpbmRleCA9IDE4OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjA6Ci0JCWluZGV4ID0gMTk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMToKLQkJaW5kZXggPSAyMDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIyOgotCQlpbmRleCA9IDIxOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjM6Ci0JCWluZGV4ID0gMjI7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNDoKLQkJaW5kZXggPSAyMzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI1OgotCQlpbmRleCA9IDI0OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjY6Ci0JCWluZGV4ID0gMjU7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNzoKLQkJaW5kZXggPSAyNjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI4OgotCQlpbmRleCA9IDI3OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjk6Ci0JCWluZGV4ID0gMjg7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMDoKLQkJaW5kZXggPSAyOTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMxOgotCQlpbmRleCA9IDMwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzI6Ci0JCWluZGV4ID0gMzE7Ci0JCWJyZWFrOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIGluZGV4OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwppbmRleCAxOGFhMTVmLi5iMjc5Yzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwpAQCAtNTQsMTYgKzU0LDkgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyNSkpCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNzEsMzQgKzY0LDE1IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgotI2Vsc2UKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCi0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKSkKLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNlbmRpZgotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwogCkBAIC0xMjYsMzQgKzEwMCw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl9jcyIKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkKLSNkZWZpbmUgRFJJVkVSX1NVRkZJWAkiX3BseCIKLXR5cGVkZWYgY2hhciogZGV2X2luZm9fdDsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLSNkZWZpbmUgRFJJVkVSX1NVRkZJWAkiX3BjaSIKLXR5cGVkZWYgY2hhciogZGV2X2luZm9fdDsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKLSNkZWZpbmUgRFJJVkVSX1NVRkZJWAkiX3VzYiIKLXR5cGVkZWYgY2hhciogZGV2X2luZm9fdDsKLSNlbHNlCi0jZXJyb3IgIkhPU1RJRiB1bnN1cHBvcnRlZCBvciB1bmRlZmluZWQhIgotI2VuZGlmCi0KLXN0YXRpYyBjaGFyCQkqdmVyc2lvbiA9ICJwcmlzbTIiIERSSVZFUl9TVUZGSVggIi5vOiAiIFdMQU5fUkVMRUFTRTsKLXN0YXRpYyBkZXZfaW5mb190CWRldl9pbmZvID0gInByaXNtMiIgRFJJVkVSX1NVRkZJWDsKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCB8fCBXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3N1c3BlbmRfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBwcmlzbTJzdGFfcmVzdW1lX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCi0jZW5kaWYgLyogV0xBTl9QQ0kgKi8KK3N0YXRpYyBjaGFyICpkZXZfaW5mbyA9ICJwcmlzbTJfdXNiIjsKIAogc3RhdGljIHdsYW5kZXZpY2VfdCAqY3JlYXRlX3dsYW4odm9pZCk7CiAKQEAgLTE2MywxNiArMTEwLDcgQEAKIGludCAgICAgIHByaXNtMl9yZXNldF9ob2xkdGltZT0zMDsJLyogUmVzZXQgaG9sZCB0aW1lIGluIG1zICovCiBpbnQJIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lPTEwMDsJLyogUmVzZXQgc2V0dGxlIHRpbWUgaW4gbXMgKi8KIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKIHN0YXRpYyBpbnQJcHJpc20yX2RvcmVzZXQ9MDsJCS8qIERvIGEgcmVzZXQgYXQgaW5pdD8gKi8KLSNlbHNlCi1zdGF0aWMgaW50ICAgICAgcHJpc20yX2RvcmVzZXQ9MTsJCS8qIERvIGEgcmVzZXQgYXQgaW5pdD8gKi8KLWludCAgICAgICAgICAgICBwcmlzbTJfYmFwX3RpbWVvdXQ9MTAwMDsgICAgICAgIC8qIEJBUCB0aW1lb3V0ICovCi1pbnQJCXByaXNtMl9pcnFfZXZyZWFkX21heD0yMDsJLyogTWF4aW11bSBudW1iZXIgb2YKLQkJCQkJCSAqIGV2X3JlYWRzIChsb29wcykKLQkJCQkJCSAqIGluIGlycSBoYW5kbGVyCi0JCQkJCQkgKi8KLSNlbmRpZgogCiAjaWZkZWYgV0xBTl9JTkNMVURFX0RFQlVHCiBpbnQgcHJpc20yX2RlYnVnPTA7CkBAIC0xODgsMTMgKzEyNiw2IEBACiBtb2R1bGVfcGFyYW0oIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyggcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsICJyZXNldCBzZXR0bGUgdGltZSBpbiBtcyIpOwogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotbW9kdWxlX3BhcmFtKCBwcmlzbTJfYmFwX3RpbWVvdXQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHByaXNtMl9iYXBfdGltZW91dCwgIkJ1ZmZlckFjY2Vzc1BhdGggVGltZW91dCBpbiAxMCpuIHVzIik7Ci1tb2R1bGVfcGFyYW0oIHByaXNtMl9pcnFfZXZyZWFkX21heCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoIHByaXNtMl9pcnFfZXZyZWFkX21heCwgIk1heGltaW0gbnVtYmVyIG9mIGV2ZW50IHJlYWRzIGluIGludGVycnVwdCBoYW5kbGVyIik7Ci0jZW5kaWYKLQogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMjMxLDE3ICsxNjIsNiBAQAogc3RhdGljIHZvaWQJcHJpc20yc3RhX2luZl9wc3VzZXJjbnQoCiAJCQl3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50Ci1wcmlzbTJzdGFfcHJvY19yZWFkKAotCWNoYXIJKnBhZ2UsCi0JY2hhcgkqKnN0YXJ0LAotCW9mZl90CW9mZnNldCwKLQlpbnQJY291bnQsCi0JaW50CSplb2YsCi0Jdm9pZAkqZGF0YSk7Ci0jZW5kaWYKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCiAKQEAgLTI2Nyw3ICsxODcsNyBAQAogCWludCBjOwogCWZvciAoIGM9IDA7IGMgPCBuOyBjKyspIHsKIAkJaWYgKCAoYyAlIDE2KSA9PSAwICkgcHJpbnRrKEtFUk5fREVCVUciZG1wWyVkXTogIiwgYyk7Ci0JCXByaW50aygiJTAyeCAiLCAoKFVJTlQ4KilidWYpW2NdKTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodTgqKWJ1ZilbY10pOwogCQlpZiAoIChjICUgMTYpID09IDE1ICkgcHJpbnRrKCJcbiIpOwogCX0KIAlpZiAoIChjICUgMTYpICE9IDAgKSBwcmludGsoIlxuIik7CkBAIC0yOTksMTAgKzIxOSw2IEBACiB7CiAJREJGRU5URVI7CiAKLSNpZmRlZiBBTkNJRU5UX01PRFVMRV9DT0RFCi0JTU9EX0lOQ19VU0VfQ09VTlQ7Ci0jZW5kaWYKLQogCS8qIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIHRvIGRvIGFueXRoaW5nIGVsc2UuCiAJICogVGhlIHNldHVwIG9mIHRoZSBNQUMgc2hvdWxkIGJlIHN1YnNlcXVlbnRseSBjb21wbGV0ZWQgdmlhCiAJICogdGhlIG1sbWUgY29tbWFuZHMuCkBAIC0zNDEsMTAgKzI1Nyw2IEBACiB7CiAJREJGRU5URVI7CiAKLSNpZmRlZiBBTkNJRU5UX01PRFVMRV9DT0RFCi0JTU9EX0RFQ19VU0VfQ09VTlQ7Ci0jZW5kaWYKLQogCS8qIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIHRvIGRvIGFueXRoaW5nIGVsc2UuCiAJICogSGlnaGVyIGxheWVycyBrbm93IHdlJ3JlIG5vdCByZWFkeSBmcm9tIGRldi0+c3RhcnQ9PTAgYW5kCiAJICogZGV2LT50YnVzeT09MS4gIE91ciByeCBwYXRoIGtub3dzIHRvIG5vdCBwYXNzIHVwIHJlY2VpdmVkCkBAIC00NjMsMTAgKzM3NSw2IEBACiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1pYnNldCByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0KHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdCA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIHBvd2VybWdtdCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9wb3dlcm1nbXQod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJY2FzZSBESURtc2dfZG90MTFyZXFfc2NhbiA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIHNjYW4gcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfc2Nhbih3bGFuZGV2LCBtc2cpOwpAQCAtNDc1LDM0ICszODMsNiBAQAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBzY2FuX3Jlc3VsdHMgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfc2Nhbl9yZXN1bHRzKHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2pvaW4gOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBqb2luIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2pvaW4od2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgYXV0aGVudGljYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1dGhlbnRpY2F0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZGVhdXRoZW50aWNhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfZGVhdXRoZW50aWNhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhc3NvY2lhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXNzb2NpYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZWFzc29jaWF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZWFzc29jaWF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9kaXNhc3NvY2lhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGRpc2Fzc29jaWF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfcmVzZXQgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHJlc2V0IHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X3Jlc2V0KHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogCWNhc2UgRElEbXNnX2RvdDExcmVxX3N0YXJ0IDoKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBzdGFydCByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9zdGFydCh3bGFuZGV2LCBtc2cpOwpAQCAtNTEwLDQ2ICszOTAsMTAgQEAKIAkvKgogCSAqIFByaXNtMiBzcGVjaWZpYyBtZXNzYWdlcwogCSAqLwotCWNhc2UgRElEbXNnX3AycmVxX2pvaW4gOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBwMiBqb2luIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X3AyX2pvaW4od2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAgICAgICAgCWNhc2UgRElEbXNnX3AycmVxX3JlYWRwZGEgOgogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHJlYWRwZGEgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9yZWFkY2lzIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZWFkY2lzIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X3JlYWRjaXMod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXV4cG9ydF9zdGF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZCA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXV4cG9ydF9yZWFkIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhdXhwb3J0X3dyaXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfbG93X2xldmVsIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBsb3dfbGV2ZWwgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfbG93X2xldmVsKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmQgOgotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgdGVzdF9jb21tYW5kIHJlcXVlc3RcbiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByaXNtMm1nbXRfdGVzdF9jb21tYW5kKHdsYW5kZXYsIG1zZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElEbXNnX3AycmVxX21taV9yZWFkIDoKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIG1taV9yZWFkIHJlcXVlc3RcbiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByaXNtMm1nbXRfbW1pX3JlYWQod2xhbmRldiwgbXNnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlIDoKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIG1taV93cml0ZSByZXF1ZXN0XG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmlzbTJtZ210X21taV93cml0ZSh3bGFuZGV2LCBtc2cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwogCWNhc2UgRElEbXNnX3AycmVxX3JhbWRsX3N0YXRlIDoKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByYW1kbF9zdGF0ZSByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2LCBtc2cpOwpAQCAtNTY2LDE4ICs0MTAsNiBAQAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGZsYXNoZGxfd3JpdGUgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZSh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9kdW1wX3N0YXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBkdW1wX3N0YXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2R1bXBfc3RhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBjaGFubmVsX2luZm8gcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBjaGFubmVsX2luZm9fcmVzdWx0cyByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9jaGFubmVsX2luZm9fcmVzdWx0cyh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKIAkvKgogCSAqIExpbnV4IHNwZWNpZmljIG1lc3NhZ2VzCiAJICovCkBAIC02MDMsMTggKzQzNSwxMSBAQAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1dG9qb2luIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXYsIG1zZyk7CiAJCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2VuYWJsZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZW5hYmxlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2VuYWJsZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKIAljYXNlIERJRG1zZ19sbnhyZXFfY29tbXNxdWFsaXR5OiB7CiAJCXA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5X3QgKnF1YWxtc2c7CiAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgY29tbXNxdWFsaXR5IHJlcXVlc3RcbiIpOwogCi0JCWlmIChody0+YXApCi0JCQlicmVhazsKLQogCQlxdWFsbXNnID0gKHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5X3QqKSBtc2c7CiAKIAkJcXVhbG1zZy0+bGluay5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CkBAIC02NTksMTAgKzQ4NCwxMCBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1VSU5UMzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgaWZzdGF0ZSkKK3UzMiBwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBpZnN0YXRlKQogewogICAgICAgICBoZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSAoaGZhMzg0eF90ICopd2xhbmRldi0+cHJpdjsKLQlVSU5UMzIgCQkJcmVzdWx0OworCXUzMiAJCQlyZXN1bHQ7CiAJREJGRU5URVI7CiAKIAlyZXN1bHQgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKQEAgLTY3OSw5ICs1MDQsNiBAQAogCQkJICogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlK2RyaXZlciBzdWZmaWNpZW50bHkKIAkJCSAqIGZvciBmaXJtd2FyZSBsb2FkaW5nLgogCQkJICovCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCQkJcmVzdWx0PWhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotI2Vsc2UKIAkJCWlmICgocmVzdWx0PWhmYTM4NHhfZHJ2cl9zdGFydChodykpKSB7CiAJCQkJV0xBTl9MT0dfRVJST1IoCiAJCQkJCSJoZmEzODR4X2RydnJfc3RhcnQoKSBmYWlsZWQsIgpAQCAtNjkxLDcgKzUxMyw2IEBACiAJCQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7CiAJCQkJYnJlYWs7CiAJCQl9Ci0jZW5kaWYKIAkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfRldMT0FEOwogCQkJcmVzdWx0ID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7CiAJCQlicmVhazsKQEAgLTg0MSw4ICs2NjIsOCBAQAogewogCWludCAJCQlyZXN1bHQgPSAwOwogICAgICAgICBoZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSAoaGZhMzg0eF90ICopd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYgICAgICAgICAgICAgICAgICB0ZW1wOwotCVVJTlQ4CQkJc251bVtIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOXTsKKwl1MTYgICAgICAgICAgICAgICAgICB0ZW1wOworCXU4CQkJc251bVtIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOXTsKIAljaGFyCQkJcHN0clsoSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTiAqIDQpICsgMV07CiAKIAlEQkZFTlRFUjsKQEAgLTkwNywyMCArNzI4LDIwIEBACiAKIAkvKiBzdHJpcCBvdXQgdGhlICdzcGVjaWFsJyB2YXJpYW50IGJpdHMgKi8KIAlody0+bW1fbW9kcyA9IGh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmIChCSVQxNCB8IEJJVDE1KTsKLQlody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJj0gfigoVUlOVDE2KShCSVQxNCB8IEJJVDE1KSk7CisJaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKHUxNikoQklUMTQgfCBCSVQxNSkpOwogCiAJaWYgICggaHctPmlkZW50X3N0YV9mdy5pZCA9PSAweDFmICkgewotCQlody0+YXAgPSAwOwogCQlXTEFOX0xPR19JTkZPKAogCQkJImlkZW50OiBzdGEgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJCQlody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAogCQkJaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKIAl9IGVsc2UgewotCQlody0+YXAgPSAxOwogCQlXTEFOX0xPR19JTkZPKAogCQkJImlkZW50OiAgYXAgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCiAJCQlody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAogCQkJaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKKwkJV0xBTl9MT0dfRVJST1IoIlVuc3VwcG9ydGVkIFRlcnRpYXJ5IEFQIGZpcm1lYXJlIGxvYWRlZCFcbiIpOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBNb2RlbSBzdXBwbGllciAqLwpAQCAtMTE2OCw3ICs5ODksNyBAQAogCWludCByZXN1bHQgPSAwOwogCWhmYTM4NHhfdCAgICAgICAgICAgICAgICpodyA9IChoZmEzODR4X3QgKil3bGFuZGV2LT5wcml2OwogCi0JVUlOVDE2ICBwcm9taXNjOworCXUxNiAgcHJvbWlzYzsKIAogCURCRkVOVEVSOwogCkBAIC0xMTc2LDEwICs5OTcsNiBAQAogCWlmICggaHctPnN0YXRlICE9IEhGQTM4NHhfU1RBVEVfUlVOTklORyApCiAJCWdvdG8gZXhpdDsKIAotCS8qIElmIHdlJ3JlIGFuIEFQLCBkbyBub3RoaW5nIGhlcmUgKi8KLQlpZiAoaHctPmFwKQotCQlnb3RvIGV4aXQ7Ci0KIAlpZiAoIChkZXYtPmZsYWdzICYgKElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkgIT0gMCApCiAJCXByb21pc2MgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7CiAJZWxzZQpAQCAtMTI0Nyw5ICsxMDY0LDkgQEAKIHN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfdGFsbGllcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQogewogICAgICAgICBoZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSAoaGZhMzg0eF90ICopd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQkqc3JjMTY7Ci0JVUlOVDMyCQkJKmRzdDsKLQlVSU5UMzIJCQkqc3JjMzI7CisJdTE2CQkJKnNyYzE2OworCXUzMgkJCSpkc3Q7CisJdTMyCQkJKnNyYzMyOwogCWludAkJCWk7CiAJaW50CQkJY250OwogCkBAIC0xMjYwLDE1ICsxMDc3LDE1IEBACiAJKiogcmVjb3JkIGxlbmd0aCBvZiB0aGUgaW5mbyByZWNvcmQuCiAJKi8KIAotCWNudCA9IHNpemVvZihoZmEzODR4X0NvbW1UYWxsaWVzMzJfdCkgLyBzaXplb2YoVUlOVDMyKTsKKwljbnQgPSBzaXplb2YoaGZhMzg0eF9Db21tVGFsbGllczMyX3QpIC8gc2l6ZW9mKHUzMik7CiAJaWYgKGluZi0+ZnJhbWVsZW4gPiAyMikgewotCQlkc3QgICA9IChVSU5UMzIgKikgJmh3LT50YWxsaWVzOwotCQlzcmMzMiA9IChVSU5UMzIgKikgJmluZi0+aW5mby5jb21tdGFsbGllczMyOworCQlkc3QgICA9ICh1MzIgKikgJmh3LT50YWxsaWVzOworCQlzcmMzMiA9ICh1MzIgKikgJmluZi0+aW5mby5jb21tdGFsbGllczMyOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGRzdCsrLCBzcmMzMisrKQogCQkJKmRzdCArPSBoZmEzODR4Mmhvc3RfMzIoKnNyYzMyKTsKIAl9IGVsc2UgewotCQlkc3QgICA9IChVSU5UMzIgKikgJmh3LT50YWxsaWVzOwotCQlzcmMxNiA9IChVSU5UMTYgKikgJmluZi0+aW5mby5jb21tdGFsbGllczE2OworCQlkc3QgICA9ICh1MzIgKikgJmh3LT50YWxsaWVzOworCQlzcmMxNiA9ICh1MTYgKikgJmluZi0+aW5mby5jb21tdGFsbGllczE2OwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGRzdCsrLCBzcmMxNisrKQogCQkJKmRzdCArPSBoZmEzODR4Mmhvc3RfMTYoKnNyYzE2KTsKIAl9CkBAIC0xMzA4LDcgKzExMjUsNyBAQAogCURCRkVOVEVSOwogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgcmVzdWx0cywgZmlyc3QgaW4gYnl0ZXMsIHRoZW4gaW4gcmVzdWx0cyAqLwotCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAqIHNpemVvZihVSU5UMTYpKSAtCisJbmJzcyA9IChpbmYtPmZyYW1lbGVuICogc2l6ZW9mKHUxNikpIC0KIAkJc2l6ZW9mKGluZi0+aW5mb3R5cGUpIC0KIAkJc2l6ZW9mKGluZi0+aW5mby5zY2FucmVzdWx0LnNjYW5yZWFzb24pOwogCW5ic3MgLz0gc2l6ZW9mKGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90KTsKQEAgLTE1MDAsNyArMTMxNyw3IEBACiAKIAkJLyogRG9uJ3QgY2FsbCB0aGlzIGluIG1vbml0b3IgbW9kZSAqLwogCQlpZiAoIHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgKSB7Ci0JCQlVSU5UMTYJCQlwb3J0c3RhdHVzOworCQkJdTE2CQkJcG9ydHN0YXR1czsKIAogCQkJV0xBTl9MT0dfSU5GTygibGlua3N0YXR1cz1DT05ORUNURURcbiIpOwogCkBAIC0xODM2LDcgKzE2NTMsNyBAQAogCWhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QgIHJlYzsKIAogCWludCAgICBpLCBhZGRlZCwgcmVzdWx0LCBjbnQ7Ci0JVUlOVDggICphZGRyOworCXU4ICAqYWRkcjsKIAogCURCRkVOVEVSOwogCkBAIC0yMTYzLDcgKzE5ODAsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCiB7CiAJREJGRU5URVI7CiAKQEAgLTIxOTAsNyArMjAwNyw3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHN0YXR1cykKK3ZvaWQgcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlEQkZFTlRFUjsKIAlXTEFOX0xPR19ERUJVRyg0LCAiVHggQ29tcGxldGUsIHN0YXR1cz0weCUwNHhcbiIsIHN0YXR1cyk7CkBAIC0yMjQ3LDQ3ICsyMDY0LDEyIEBACiB7CiAJREJGRU5URVI7CiAKLQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAKIAlEQkZFWElUOwogCXJldHVybjsKIH0KIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCB8fCBXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3N1c3BlbmRfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0gICAgICAgCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0KLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQkvKiByZXNldCBoYXJkd2FyZSAqLwotCWlmICh3bGFuZGV2KSB7Ci0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJcDgwMjExX3N1c3BlbmQod2xhbmRldik7Ci0JfQotCi0JLy8gY2FsbCBhIG5ldGlmX2RldmljZV9kZXRhY2god2xhbmRldi0+bmV0ZGV2KSA/Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcmlzbTJzdGFfcmVzdW1lX3BjaSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0gICAgICAgCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0KLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpZiAod2xhbmRldikgewotCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0JCXA4MDIxMV9yZXN1bWUod2xhbmRldik7Ci0JfQotCi0gICAgICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0jZW5kaWYKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNyZWF0ZV93bGFuCiAqCkBAIC0yMzM0LDkgKzIxMTYsNiBAQAogCXdsYW5kZXYtPm9wZW4gPSBwcmlzbTJzdGFfb3BlbjsKIAl3bGFuZGV2LT5jbG9zZSA9IHByaXNtMnN0YV9jbG9zZTsKIAl3bGFuZGV2LT5yZXNldCA9IHByaXNtMnN0YV9yZXNldDsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXdsYW5kZXYtPm5zZF9wcm9jX3JlYWQgPSBwcmlzbTJzdGFfcHJvY19yZWFkOwotI2VuZGlmCiAJd2xhbmRldi0+dHhmcmFtZSA9IHByaXNtMnN0YV90eGZyYW1lOwogCXdsYW5kZXYtPm1sbWVyZXF1ZXN0ID0gcHJpc20yc3RhX21sbWVyZXF1ZXN0OwogCXdsYW5kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Q7CkBAIC0yMzUxLDc1ICsyMTMwLDYgQEAKIAlyZXR1cm4gd2xhbmRldjsKIH0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50Ci1wcmlzbTJzdGFfcHJvY19yZWFkKAotCWNoYXIJKnBhZ2UsCi0JY2hhcgkqKnN0YXJ0LAotCW9mZl90CW9mZnNldCwKLQlpbnQJY291bnQsCi0JaW50CSplb2YsCi0Jdm9pZAkqZGF0YSkKLXsKLQljaGFyCSAqcCA9IHBhZ2U7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBkYXRhOwotCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopIHdsYW5kZXYtPnByaXY7Ci0KLQlVSU5UMTYgaHd0eXBlID0gMDsKLQotCURCRkVOVEVSOwotCWlmIChvZmZzZXQgIT0gMCkgewotCQkqZW9mID0gMTsKLQkJZ290byBleGl0OwotCX0KLQotCS8vIFhYWCAweDAwMDEgZm9yIHByaXNtMi41LzMsIDB4MDAwMCBmb3IgcHJpc20yLgotCWh3dHlwZSA9IEJJVDA7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JaWYgKGh3LT5pc3JhbTE2KQotCQlod3R5cGUgfD0gQklUMTsKLSNlbmRpZgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCWh3dHlwZSB8PSBCSVQyOwotI2VuZGlmCi0KLSNkZWZpbmUgUFJJU00yX0NWU19JRCAiJElkOiBwcmlzbTJzdGEuYyAxODI2IDIwMDctMDMtMTkgMTU6Mzc6MDBaIHBpenphICQiCi0KLQlwICs9IHNwcmludGYocCwgIiMgJXMgdmVyc2lvbiAlcyAoJXMpICclcydcblxuIiwKLQkJICAgICBkZXZfaW5mbywKLQkJICAgICBXTEFOX1JFTEVBU0UsIFdMQU5fQlVJTERfREFURSwgUFJJU00yX0NWU19JRCk7Ci0KLQlwICs9IHNwcmludGYocCwgIiMgbmljIGgvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAotCQkgICAgIGh3LT5pZGVudF9uaWMuaWQsIGh3LT5pZGVudF9uaWMubWFqb3IsCi0JCSAgICAgaHctPmlkZW50X25pYy5taW5vciwgaHctPmlkZW50X25pYy52YXJpYW50KTsKLQotCXAgKz0gc3ByaW50ZihwLCAiIyBwcmkgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCi0JCSAgICAgaHctPmlkZW50X3ByaV9mdy5pZCwgaHctPmlkZW50X3ByaV9mdy5tYWpvciwKLQkJICAgICBody0+aWRlbnRfcHJpX2Z3Lm1pbm9yLCBody0+aWRlbnRfcHJpX2Z3LnZhcmlhbnQpOwotCi0JaWYgKGh3LT5pZGVudF9zdGFfZncuaWQgPT0gMHgxZikgewotCQlwICs9IHNwcmludGYocCwgIiMgc3RhIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAotCQkJICAgICBody0+aWRlbnRfc3RhX2Z3LmlkLCBody0+aWRlbnRfc3RhX2Z3Lm1ham9yLAotCQkJICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLCBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpOwotCX0gZWxzZSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiIyBhcCBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKLQl9Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JcCArPSBzcHJpbnRmKHAsICIjIGluaXRpYWwgbmljIGh3IHR5cGUsIG5lZWRlZCBmb3IgU1NGIHJhbWRsXG4iKTsKLQlwICs9IHNwcmludGYocCwgImluaXRuaWNodz0lMDR4XG4iLCBod3R5cGUpOwotI2VuZGlmCi0KLSBleGl0OgotCURCRkVYSVQ7Ci0JcmV0dXJuIChwIC0gcGFnZSk7Ci19Ci0jZW5kaWYKLQogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKIHsKIAloZmEzODR4X3QJCSpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgY29tbXNxdWFsX2JoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCkBAIC0wLDAgKzEsMzAyIEBACisjaW5jbHVkZSAiaGZhMzg0eF91c2IuYyIKKyNpbmNsdWRlICJwcmlzbTJtZ210LmMiCisjaW5jbHVkZSAicHJpc20ybWliLmMiCisjaW5jbHVkZSAicHJpc20yc3RhLmMiCisKKyNkZWZpbmUgUFJJU01fVVNCX0RFVklDRSh2aWQsIHBpZCwgbmFtZSkgXAorICAgICAgICAgICBVU0JfREVWSUNFKHZpZCwgcGlkKSwgIFwKKyAgICAgICAgICAgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpIG5hbWUKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9wcmlzbV90YmxbXSA9IHsKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0YmIsIDB4MDkyMiwgIklPRGF0YSBBaXJQb3J0IFdOLUIxMS9VU0JTIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDdhYSwgMHgwMDEyLCAiQ29yZWdhIFdpcmVsZXNzIExBTiBVU0IgU3RpY2stMTEiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwOWFhLCAweDM2NDIsICJQcmlzbTIueCAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4MDQwOCwgIkFjdGlvbnRlYyBQcmlzbTIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4MDQyMSwgIkFjdGlvbnRlYyBQcmlzbTIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDE5MTUsIDB4MjIzNiwgIkxpbmtzeXMgV1VTQjExdjMuMCAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMiwgIkxpbmtzeXMgV1VTQjExdjIuNSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA2NmIsIDB4MjIxMywgIkxpbmtzeXMgV1VTQjEydjEuMSAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA2N2MsIDB4MTAyMiwgIlNpZW1lbnMgU3BlZWRTdHJlYW0gMTAyMiAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0OWYsIDB4MDAzMywgIkNvbXBhcS9JbnRlbCBXMTAwIFBSTy9XaXJlbGVzcyAxMU1icHMgbXVsdGlwb3J0IFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDAxNiwgIk1lbGNvIFdMSS1VU0ItUzExIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwOGRlLCAweDdhMDEsICJQUklTTTI1IElFRUUgODAyLjExIE1pbmkgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg4MDg2LCAweDExMTEsICJJbnRlbCBQUk8vV2lyZWxlc3MgMjAxMUIgTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGQ4ZSwgMHg3YTAxLCAiUFJJU00yNSBJRUVFIDgwMi4xMSBNaW5pIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMDZlLCAiTWljcm9zb2Z0IE1ONTEwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDk2NywgMHgwMjA0LCAiQWNlciBXYXJwbGluayBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBjZGUsIDB4MDAwMiwgIlotQ29tIDcyNS83MjYgUHJpc20yLjUgVVNCL1VTQiBJbnRlZ3JhdGVkIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGNkZSwgMHgwMDA1LCAiWi1Db20gWGw3MzUgV2lyZWxlc3MgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDQxM2MsIDB4ODEwMCwgIkRlbGwgVHJ1ZU1vYmlsZSAxMTgwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGIzYiwgMHgxNjAxLCAiQUxMTkVUIDAxOTMgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MDIsICJaeVhFTCBaeUFJUiBCMjAwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGJhZiwgMHgwMGViLCAiVVNSb2JvdGljcyBVU1IxMTIwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDI3LCAiTWVsY28gV0xJLVVTQi1LUzExRyAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAorICAgICAgICB7UFJJU01fVVNCX0RFVklDRSgweDA0ZjEsIDB4MzAwOSwgIkpWQyBNUC1YUDcyNTAgQnVpbHRpbiBVU0IgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDg0NiwgMHg0MTEwLCAiTmV0R2VhciBNQTExMSIpfSwKKyAgICAgICAge1BSSVNNX1VTQl9ERVZJQ0UoMHgwM2YzLCAweDAwMjAsICJBZGFwdGVjIEFXTi04MDIwIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCisvLwl7UFJJU01fVVNCX0RFVklDRSgweDBhY2UsIDB4MTIwMSwgIlp5REFTIFpEMTIwMSBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDI4MjEsIDB4MzMwMCwgIkFTVVMtV0wxNDAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDM3MDAsICJEV0wtMTIyIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MjAwMSwgMHgzNzAyLCAiRFdMLTEyMCBSZXYgRiBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDUwYzIsIDB4NDAxMywgIkF2ZXJhdGVjIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyYzAyLCAweDE0ZWEsICJQbGFuZXggR1ctVVMxMUggV0xBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDEyNGEsIDB4MTY4YiwgIkFpcnZhc3QgUFJJU00zIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDMsICJULVNpbnVzIDExMSBVU0IgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MjgyMSwgMHgzMzAwLCAiSGF3a2luZyBIaWdoREIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwNDQsICJNZWxjbyBXTEktVVNCLUtCMTEgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDE2NjgsIDB4NjEwNiwgIlJPUEVYIEZyZWVMYW4gODAyLjExYiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDEyNGEsIDB4NDAxNywgIlBoZWVuZXQgV0wtNTAzSUEgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiYjIsIDB4MDMwMiwgIkFtYml0IE1pY3Jvc3lzdGVtcyBDb3JwLiIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDkwMTYsIDB4MTgyZCwgIlNpdGVjb20gV0wtMDIyIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNTQzLCAweDBmMDEsICJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpfSwKKwl7IC8qIHRlcm1pbmF0b3IgKi8gfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9wcmlzbV90YmwpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogcHJpc20yc3RhX3Byb2JlX3VzYgorKgorKiBQcm9iZSByb3V0aW5lIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbS4KKyoKKyogQXJndW1lbnRzOgorKglkZXYJCXB0ciB0byB0aGUgdXNiX2RldmljZSBzdHJ1Y3QKKyoJaWZudW0JCWludGVyZmFjZSBudW1iZXIgYmVpbmcgb2ZmZXJlZAorKgorKiBSZXR1cm5zOgorKglOVUxMCQktIHdlJ3JlIG5vdCBjbGFpbWluZyB0aGUgZGV2aWNlK2ludGVyZmFjZQorKglub24tTlVMTAktIHdlIGFyZSBjbGFpbWluZyB0aGUgZGV2aWNlK2ludGVyZmFjZSBhbmQKKyoJCQkgIHRoaXMgaXMgYSBwdHIgdG8gdGhlIGRhdGEgd2Ugd2FudCBiYWNrCisqCQkJICB3aGVuIGRpc2Nvbm5lY3QgaXMgY2FsbGVkLgorKgorKiBTaWRlIGVmZmVjdHM6CisqCisqIENhbGwgY29udGV4dDoKKyoJSSdtIG5vdCBzdXJlLCBhc3N1bWUgaXQncyBpbnRlcnJ1cHQuCisqCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgcHJpc20yc3RhX3Byb2JlX3VzYigKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCisJd2xhbmRldmljZV90CSp3bGFuZGV2ID0gTlVMTDsKKwloZmEzODR4X3QJKmh3ID0gTlVMTDsKKwlpbnQgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisKKwlEQkZFTlRFUjsKKworCWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKworCWlmICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpIHsKKwkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaHcgPSB3bGFuZGV2LT5wcml2OworCisJaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7CisJCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgaHcgZGF0YSAqLworCWhmYTM4NHhfY3JlYXRlKGh3LCBkZXYpOworCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKKworCS8qIFJlZ2lzdGVyIHRoZSB3bGFuZGV2LCB0aGlzIGdldHMgdXMgYSBuYW1lIGFuZCByZWdpc3RlcnMgdGhlCisJICogbGludXggbmV0ZGV2aWNlLgorCSAqLworCVNFVF9ORVRERVZfREVWKHdsYW5kZXYtPm5ldGRldiwgJihpbnRlcmZhY2UtPmRldikpOworCisJLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KKwlpZiAocHJpc20yX2RvcmVzZXQpIHsKKwkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCisJCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAorCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7CisJCQloZmEzODR4X2Rlc3Ryb3koaHcpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCVdMQU5fTE9HX0VSUk9SKAorCQkJCSIlczogaGZhMzg0eF9jb3JlcmVzZXQoKSBmYWlsZWQuXG4iLAorCQkJCWRldl9pbmZvKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJfQorCisJdXNiX2dldF9kZXYoZGV2KTsKKworCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOworCisgICAgICAgIGlmICggcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwICkgeworCQlXTEFOX0xPR19FUlJPUigiJXM6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZmFpbGVkOworICAgICAgICB9CisKKy8qIGVuYWJsZSB0aGUgY2FyZCAqLworCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9lbmFibGUpOworCisJZ290byBkb25lOworCisgZmFpbGVkOgorCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKKwlpZiAoaHcpCQlrZnJlZShodyk7CisJd2xhbmRldiA9IE5VTEw7CisKKyBkb25lOgorCURCRkVYSVQ7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgd2xhbmRldik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiCisqCisqIENhbGxlZCB3aGVuIGEgZGV2aWNlIHByZXZpb3VzbHkgY2xhaW1lZCBieSBwcm9iZSBpcyByZW1vdmVkCisqIGZyb20gdGhlIFVTQi4KKyoKKyogQXJndW1lbnRzOgorKglkZXYJCXB0ciB0byB0aGUgdXNiX2RldmljZSBzdHJ1Y3QKKyoJcHRyCQlwdHIgcmV0dXJuZWQgYnkgcHJvYmUoKSB3aGVuIHRoZSBkZXZpY2UKKyogICAgICAgICAgICAgICAgICAgICAgIHdhcyBjbGFpbWVkLgorKgorKiBSZXR1cm5zOgorKglOb3RoaW5nCisqCisqIFNpZGUgZWZmZWN0czoKKyoKKyogQ2FsbCBjb250ZXh0OgorKglwcm9jZXNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkCitwcmlzbTJzdGFfZGlzY29ubmVjdF91c2Ioc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OworCisgICAgICAgIERCRkVOVEVSOworCisJd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisJaWYgKCB3bGFuZGV2ICE9IE5VTEwgKSB7CisJCUxJU1RfSEVBRChjbGVhbmxpc3QpOworCQlzdHJ1Y3QgbGlzdF9oZWFkCSplbnRyeTsKKwkJc3RydWN0IGxpc3RfaGVhZAkqdGVtcDsKKwkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OworCisJCWlmICghaHcpCisJCQlnb3RvIGV4aXQ7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CisKKwkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLnJlYXBhYmxlLCAmY2xlYW5saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLmNvbXBsZXRpbmcsICZjbGVhbmxpc3QpOworCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEucGVuZGluZywgJmNsZWFubGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5hY3RpdmUsICZjbGVhbmxpc3QpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CisKKwkJLyogVGhlcmUncyBubyBoYXJkd2FyZSB0byBzaHV0ZG93biwgYnV0IHRoZSBkcml2ZXIKKwkJICogbWlnaHQgaGF2ZSBzb21lIHRhc2tzIG9yIHRhc2tsZXRzIHRoYXQgbXVzdCBiZQorCQkgKiBzdG9wcGVkIGJlZm9yZSB3ZSBjYW4gdGVhciBldmVyeXRoaW5nIGRvd24uCisJCSAqLworCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7CisKKwkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnRocm90dGxlKTsKKwkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnJlcXRpbWVyKTsKKwkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmaHctPnJlc3B0aW1lcik7CisKKwkJLyogVW5saW5rIGFsbCB0aGUgVVJCcy4gVGhpcyAicmVtb3ZlcyB0aGUgd2hlZWxzIgorCQkgKiBmcm9tIHRoZSBlbnRpcmUgQ1RMWCBoYW5kbGluZyBtZWNoYW5pc20uCisJCSAqLworCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOworCQl1c2Jfa2lsbF91cmIoJmh3LT50eF91cmIpOworCQl1c2Jfa2lsbF91cmIoJmh3LT5jdGx4X3VyYik7CisKKwkJdGFza2xldF9raWxsKCZody0+Y29tcGxldGlvbl9iaCk7CisJCXRhc2tsZXRfa2lsbCgmaHctPnJlYXBlcl9iaCk7CisKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCQkvKiBOb3cgd2UgY29tcGxldGUgYW55IG91dHN0YW5kaW5nIGNvbW1hbmRzCisJCSAqIGFuZCB0ZWxsIGV2ZXJ5b25lIHdobyBpcyB3YWl0aW5nIGZvciB0aGVpcgorCQkgKiByZXNwb25zZXMgdGhhdCB3ZSBoYXZlIHNodXQgZG93bi4KKwkJICovCisJCWxpc3RfZm9yX2VhY2goZW50cnksICZjbGVhbmxpc3QpIHsKKwkJCWhmYTM4NHhfdXNiY3RseF90CSpjdGx4OworCisJCQljdGx4ID0gbGlzdF9lbnRyeShlbnRyeSwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOworCQkJY29tcGxldGUoJmN0bHgtPmRvbmUpOworCQl9CisKKwkJLyogR2l2ZSBhbnkgb3V0c3RhbmRpbmcgc3luY2hyb25vdXMgY29tbWFuZHMKKwkJICogYSBjaGFuY2UgdG8gY29tcGxldGUuIEFsbCB0aGV5IG5lZWQgdG8gZG8KKwkJICogaXMgIndha2UgdXAiLCBzbyB0aGF0J3MgZWFzeS4KKwkJICogKEknZCBsaWtlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCByZWFsbHkuKQorCQkgKi8KKwkJbXNsZWVwKDEwMCk7CisKKwkJLyogTm93IGRlbGV0ZSB0aGUgQ1RMWHMsIGJlY2F1c2Ugbm8tb25lIGVsc2UgY2FuIG5vdy4gKi8KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0ZW1wLCAmY2xlYW5saXN0KSB7CisJCQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKworCQkJY3RseCA9IGxpc3RfZW50cnkoZW50cnksIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKKwkJCWtmcmVlKGN0bHgpOworCQl9CisKKwkJLyogVW5ob29rIHRoZSB3bGFuZGV2ICovCisJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKKwkJd2xhbl91bnNldHVwKHdsYW5kZXYpOworCisJCXVzYl9wdXRfZGV2KGh3LT51c2IpOworCisJCWhmYTM4NHhfZGVzdHJveShodyk7CisJCWtmcmVlKGh3KTsKKworCQlrZnJlZSh3bGFuZGV2KTsKKwl9CisKKyBleGl0OgorCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCURCRkVYSVQ7Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHByaXNtMl91c2JfZHJpdmVyID0geworCS5uYW1lID0gInByaXNtMl91c2IiLAorCS5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV91c2IsCisJLmRpc2Nvbm5lY3QgPSBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IsCisJLmlkX3RhYmxlID0gdXNiX3ByaXNtX3RibCwKKwkvKiBmb3BzLCBtaW5vcj8gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByaXNtMnVzYl9pbml0KHZvaWQpCit7CisgICAgICAgIERCRkVOVEVSOworCisJLyogVGhpcyBjYWxsIHdpbGwgcmVzdWx0IGluIGNhbGxzIHRvIHByaXNtMnN0YV9wcm9iZV91c2IuICovCisJcmV0dXJuIHVzYl9yZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOworCisJREJGRVhJVDsKK307CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJ1c2JfY2xlYW51cCh2b2lkKQoreworICAgICAgICBEQkZFTlRFUjsKKworCXVzYl9kZXJlZ2lzdGVyKCZwcmlzbTJfdXNiX2RyaXZlcik7CisKKwlEQkZFWElUOworfTsKKworbW9kdWxlX2luaXQocHJpc20ydXNiX2luaXQpOworbW9kdWxlX2V4aXQocHJpc20ydXNiX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVmODgyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIHNyYy9pbmNsdWRlL3dsYW4vdmVyc2lvbi5oCi0qCi0qCi0qIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIGxpbnV4LXdsYW4KLSoKLSogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwotKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0qCi0qICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCi0qICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKLSogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKLSogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKLSogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0qICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCi0qICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKLSogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcwotKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQotKiBtYWRlIGRpcmVjdGx5IHRvOgotKgotKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgotKiBpbmZvQGxpbnV4LXdsYW4uY29tCi0qIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKLSogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotI2lmbmRlZiBfV0xBTl9WRVJTSU9OX0gKLSNkZWZpbmUgX1dMQU5fVkVSU0lPTl9ICi0jaWZuZGVmIEtFUk5FTF9WRVJTSU9OCi0jZGVmaW5lIEtFUk5FTF9WRVJTSU9OKGEsYixjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQotI2VuZGlmCi0KLS8qIFdMQU5fSE9TVElGIChnZW5lcmFsbHkgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBkZXRlY3RlZCkgKi8KLSNkZWZpbmUgV0xBTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFdMQU5fUENNQ0lBICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBXTEFOX0lTQSAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgV0xBTl9QQ0kgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFdMQU5fVVNCICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBXTEFOX1BMWCAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgV0xBTl9TTEFWRSAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFdMQU5fUkVMRUFTRQkiMC4yLjgiCi0jZGVmaW5lIFdMQU5fUkVMRUFTRV9DT0RFIDB4MDAwMjA4Ci0jZGVmaW5lIFdMQU5fQlVJTERfREFURSAiVGh1IE9jdCAgMiAxMTowNDo0MiBQRFQgMjAwOCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy93bGFuX2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaAppbmRleCA1OWRmYThmLi44YjhhNTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy93bGFuX2NvbXBhdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3dsYW5fY29tcGF0LmgKQEAgLTQ5LDExNCArNDksNiBAQAogI2RlZmluZSBfV0xBTl9DT01QQVRfSAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyotLS0tLS0gRXN0YWJsaXNoIFBsYXRmb3JtIElkZW50aXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBLZXkgbWFjcm9zOiAqLwotLyogV0xBTl9DUFVfRkFNSUxZICovCi0JI2RlZmluZSBXTEFOX0l4ODYJCQkxCi0JI2RlZmluZSBXTEFOX1BQQwkJCTIKLQkjZGVmaW5lIFdMQU5fSXg5NgkJCTMKLQkjZGVmaW5lIFdMQU5fQVJNCQkJNAotCSNkZWZpbmUgV0xBTl9BTFBIQQkJCTUKLQkjZGVmaW5lIFdMQU5fTUlQUwkJCTYKLQkjZGVmaW5lIFdMQU5fSFBQQQkJCTcKLQkjZGVmaW5lIFdMQU5fU1BBUkMJCQk4Ci0JI2RlZmluZSBXTEFOX1NIICAgIAkJCTkKLQkjZGVmaW5lIFdMQU5feDg2XzY0ICAgICAgICAgICAgICAgICAgICAgMTAKLS8qIFdMQU5fU1lTQVJDSCAqLwotCSNkZWZpbmUgV0xBTl9QQ0FUCQkJMQotCSNkZWZpbmUgV0xBTl9NQlgJCQkyCi0JI2RlZmluZSBXTEFOX1JQWAkJCTMKLQkjZGVmaW5lIFdMQU5fTFdBUkNICQkJNAotCSNkZWZpbmUgV0xBTl9QTUFDCQkJNQotCSNkZWZpbmUgV0xBTl9TS0lGRgkJCTYKLQkjZGVmaW5lIFdMQU5fQklUU1kJCQk3Ci0JI2RlZmluZSBXTEFOX0FMUEhBQVJDSAkJCTcKLQkjZGVmaW5lIFdMQU5fTUlQU0FSQ0gJCQk5Ci0JI2RlZmluZSBXTEFOX0hQUEFBUkNICQkJMTAKLQkjZGVmaW5lIFdMQU5fU1BBUkNBUkNICQkJMTEKLQkjZGVmaW5lIFdMQU5fU0hBUkNIICAgCQkJMTIKLQotLyogTm90ZTogdGhlIFBMWCBIT1NUSUYgYWJvdmUgcmVmZXJzIHRvIHNvbWUgdmVuZG9ycyBpbXBsZW1lbnRhdGlvbnMgZm9yICovCi0vKiAgICAgICBQQ0kuICBJdCdzIGEgUExYIGNoaXAgdGhhdCBpcyBhIFBDSSB0byBQQ01DSUEgYWRhcHRlciwgYnV0IGl0ICAgKi8KLS8qICAgICAgIGlzbid0IGEgcmVhbCBQQ01DSUEgaG9zdCBpbnRlcmZhY2UgYWRhcHRlciBwcm92aWRpbmcgYWxsIHRoZSAgICAqLwotLyogICAgICAgY2FyZCZzb2NrZXQgc2VydmljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZiAoZGVmaW5lZChDT05GSUdfUFBDKSB8fCBkZWZpbmVkKENPTkZJR184eHgpIHx8IGRlZmluZWQoX19wb3dlcnBjX18pKQotI2lmbmRlZiBfX3BwY19fCi0jZGVmaW5lIF9fcHBjX18KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCi0KLSNpZm5kZWYgQVVUT0NPTkZfSU5DTFVERUQKLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX3g4Nl82NF9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX3g4Nl82NAotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX1BDQVQKLSNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pNjg2X18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fSXg4NgotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX1BDQVQKLSNlbGlmIGRlZmluZWQoX19wcGNfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9QUEMKLQkjaWYgZGVmaW5lZChDT05GSUdfTUJYKQotCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX01CWAotCSNlbGlmIGRlZmluZWQoQ09ORklHX1JQWExJVEUpCi0JCSNkZWZpbmUgV0xBTl9TWVNBUkNICVdMQU5fUlBYCi0JI2VsaWYgZGVmaW5lZChDT05GSUdfUlBYQ0xBU1NJQykKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9SUFgKLQkjZWxzZQotCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1BNQUMKLQkjZW5kaWYKLSNlbGlmIGRlZmluZWQoX19hcm1fXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9BUk0KLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9TS0lGRgotI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fQUxQSEEKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9BTFBIQUFSQ0gKLSNlbGlmIGRlZmluZWQoX19taXBzX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fTUlQUwotCSNkZWZpbmUgV0xBTl9TWVNBUkNICQlXTEFOX01JUFNBUkNICi0jZWxpZiBkZWZpbmVkKF9faHBwYV9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0hQUEEKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9IUFBBQVJDSAotI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCi0gICAgICAgICNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZICAgICAgICAgV0xBTl9TUEFSQwotICAgICAgICAjZGVmaW5lIFdMQU5fU1lTQVJDSCAgICAgICAgICAgIFdMQU5fU1BBUkMKLSNlbGlmIGRlZmluZWQoX19zaF9fKQotICAgICAgICAjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWSAgICAgICAgIFdMQU5fU0gKLSAgICAgICAgI2RlZmluZSBXTEFOX1NZU0FSQ0ggICAgICAgICAgICBXTEFOX1NIQVJDSAotICAgICAgICAjaWZuZGVmIF9fTElUVExFX0VORElBTl9fCi0gICAgICAgICNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX18KLSAgICAgICAgI2VuZGlmCi0jZWxzZQotCSNlcnJvciAiTm8gQ1BVIGlkZW50aWZpZWQhIgotI2VuZGlmCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0vKgotICAgU29tZSBiaWcgZW5kaWFuIG1hY2hpbmVzIGltcGxpY2l0bHkgZG8gYWxsIEkvTyBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLSAgIEluIHBhcnRpY3VsYXI6Ci0gICAgICAgICAgTGludXgvUFBDIG9uIFBvd2VyTWFjcyAoUENJKQotCSAgQXJtL0ludGVsIFhzY2FsZSAoUENJKQotCi0gICBUaGlzIG1heSBhbHNvIGFmZmVjdCBQTFggYm9hcmRzIGFuZCBvdGhlciBCRSAmfCBQUEMgcGxhdGZvcm1zOwotICAgYXMgbmV3IG9uZXMgYXJlIGRpc2NvdmVyZWQsIGFkZCB0aGVtIGJlbG93LgotKi8KLQotI2lmIGRlZmluZWQoV0xBTl9IT1NUSUYpCi0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLSNpZiAoKFdMQU5fU1lTQVJDSCA9PSBXTEFOX1NLSUZGKSB8fCAoV0xBTl9TWVNBUkNIID09IFdMQU5fUE1BQykgfHwgKFdMQU5fU1lTQVJDSCA9PSBXTEFOX1NQQVJDKSkKLSNkZWZpbmUgUkVWRVJTRV9FTkRJQU4KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIEJpdCBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCkBAIC0xOTMsMzAgKzg1LDYgQEAKICNkZWZpbmUgQklUMzAJMHg0MDAwMDAwMAogI2RlZmluZSBCSVQzMQkweDgwMDAwMDAwCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi10eXBlZGVmIHVfaW50OF90CVVJTlQ4OwotdHlwZWRlZiB1X2ludDE2X3QJVUlOVDE2OwotdHlwZWRlZiB1X2ludDMyX3QJVUlOVDMyOwotCi10eXBlZGVmIGludDhfdAkJSU5UODsKLXR5cGVkZWYgaW50MTZfdAkJSU5UMTY7Ci10eXBlZGVmIGludDMyX3QJCUlOVDMyOwotCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSU5UOwotdHlwZWRlZiBzaWduZWQgaW50ICAgICAgSU5UOwotCi10eXBlZGVmIHVfaW50NjRfdAlVSU5UNjQ7Ci10eXBlZGVmIGludDY0X3QJCUlOVDY0OwotCi0jZGVmaW5lIFVJTlQ4X01BWAkoMHhmZlVMKQotI2RlZmluZSBVSU5UMTZfTUFYCSgweGZmZmZVTCkKLSNkZWZpbmUgVUlOVDMyX01BWAkoMHhmZmZmZmZmZlVMKQotCi0jZGVmaW5lIElOVDhfTUFYCSgweDdmTCkKLSNkZWZpbmUgSU5UMTZfTUFYCSgweDdmZmZMKQotI2RlZmluZSBJTlQzMl9NQVgJKDB4N2ZmZmZmZmZMKQotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0tLS0gQ29tcGlsZXIgUG9ydGFiaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0yMzAsMjAgKzk4LDkgQEAKICNkZWZpbmUgV0xBTl9EQlZBUgl3bGFuX2RlYnVnCiAjZW5kaWYKIAotI2lmbmRlZiBLRVJORUxfVkVSU0lPTgotI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKLSNlbmRpZgorI2RlZmluZSBXTEFOX1JFTEVBU0UJIjAuMy4wLWxrbWwiCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSMgIGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOCkpCi0jICAgIGluY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KLSMgIGVsc2UKLSMgICAgaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KLSMgIGVuZGlmCi0jZWxpZiBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgUFJFRU1QVF9NQVNLICAoMHgwMDAwMDBGRlVMKQotIyAgZGVmaW5lIHByZWVtcHRfY291bnQoKSAoMFVMKQotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjZGVmaW5lIFdMQU5fTE9HX0VSUk9SKHgsYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICIlczogIiB4ICwgX19mdW5jX18gLCAjI2FyZ3MpOwogCkBAIC0yNTQsMjAgKzExMSwxNyBAQAogI2RlZmluZSBXTEFOX0xPR19JTkZPKGFyZ3MuLi4gKSBwcmludGsoS0VSTl9JTkZPIGFyZ3MpCiAKICNpZiBkZWZpbmVkKFdMQU5fSU5DTFVERV9ERUJVRykKLQkjZGVmaW5lIFdMQU5fQVNTRVJUKGMpIGlmICgoIShjKSkgJiYgV0xBTl9EQlZBUiA+PSAxKSB7IFwKLQkJV0xBTl9MT0dfREVCVUcoMSwgIkFzc2VydGlvbiBmYWlsdXJlIVxuIik7IH0KIAkjZGVmaW5lIFdMQU5fSEVYX0RVTVAoIGwsIHgsIHAsIG4pCWlmKCBXTEFOX0RCVkFSID49IChsKSApeyBcCiAJCWludCBfX2lfXzsgXAogCQlwcmludGsoS0VSTl9ERUJVRyB4ICI6Iik7IFwKIAkJZm9yKCBfX2lfXz0wOyBfX2lfXyA8IChuKTsgX19pX18rKykgXAotCQkJcHJpbnRrKCAiICUwMngiLCAoKFVJTlQ4KikocCkpW19faV9fXSk7IFwKKwkJCXByaW50ayggIiAlMDJ4IiwgKCh1OCopKHApKVtfX2lfX10pOyBcCiAJCXByaW50aygiXG4iKTsgfQogCSNkZWZpbmUgREJGRU5URVIgeyBpZiAoIFdMQU5fREJWQVIgPj0gNSApeyBXTEFOX0xPR19ERUJVRygzLCItLS0tPlxuIik7IH0gfQogCSNkZWZpbmUgREJGRVhJVCAgeyBpZiAoIFdMQU5fREJWQVIgPj0gNSApeyBXTEFOX0xPR19ERUJVRygzLCI8LS0tLVxuIik7IH0gfQogCiAJI2RlZmluZSBXTEFOX0xPR19ERUJVRyhsLHgsYXJncy4uLikgaWYgKCBXTEFOX0RCVkFSID49IChsKSkgcHJpbnRrKEtFUk5fREVCVUcgIiVzKCVsdSk6ICIgeCAsICBfX2Z1bmNfXywgKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSyksICMjYXJncyApOwogI2Vsc2UKLQkjZGVmaW5lIFdMQU5fQVNTRVJUKGMpCiAJI2RlZmluZSBXTEFOX0hFWF9EVU1QKCBsLCBzLCBwLCBuKQogCSNkZWZpbmUgREJGRU5URVIKIAkjZGVmaW5lIERCRkVYSVQKQEAgLTI3NSw0MTMgKzEyOSwxMSBAQAogCSNkZWZpbmUgV0xBTl9MT0dfREVCVUcobCwgcywgYXJncy4uLikKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBfX1NNUF9fCQkJMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCi0KLSNpZiAoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkgfHwgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTkpKSkKLSNkZWZpbmUgVVJCX09OTFlfQ0FMTEJBQ0sKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi0jZGVmaW5lIFBUX1JFR1MgICAgLCBzdHJ1Y3QgcHRfcmVncyAqcmVncwotI2Vsc2UKLSNkZWZpbmUgUFRfUkVHUwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDcpKQotIyAgZGVmaW5lIGRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoYSkgIGRlbF90aW1lcl9zeW5jKGEpCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDE3KSkKLSNkZWZpbmUgQ09ORklHX05FVExJTksJCTEKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jZGVmaW5lIGtmcmVlX3MoYSwgYikJa2ZyZWUoKGEpKQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwyLDE4KSkKLSNpZm5kZWYgaW5pdF93YWl0cXVldWVfaGVhZAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDAsMTYpKQotI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9oZWFkKHApICAoKihwKSA9IE5VTEwpCi0jZWxzZQotI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9oZWFkKHApICBpbml0X3dhaXRxdWV1ZShwKQotI2VuZGlmCi10eXBlZGVmIHN0cnVjdCB3YWl0X3F1ZXVlICp3YWl0X3F1ZXVlX2hlYWRfdDsKLXR5cGVkZWYgc3RydWN0IHdhaXRfcXVldWUgd2FpdF9xdWV1ZV90OwotI2RlZmluZSBzZXRfY3VycmVudF9zdGF0ZShiKSAgeyBjdXJyZW50LT5zdGF0ZSA9IChiKTsgbWIoKTsgfQotI2RlZmluZSBpbml0X3dhaXRxdWV1ZV9lbnRyeShhLCBiKSB7IChhKS0+dGFzayA9IGN1cnJlbnQ7IH0KLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKLS8vIHJldHZhbCA9PSAwOyBzaWduYWwgbWV0OyB3ZSdyZSBnb29kLgotLy8gcmV0dmFsIDwgMDsgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgotLy8gcmV0dmFsID4gMDsgdGltZWQgb3V0LgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkpICAvLyBmaXhtZT8KLQotI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB3YWl0X3F1ZXVlX3QgX193YWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZm9yICg7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCkgICAgOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZWxzZSAvLyAyLjIKLQotCi0jZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0cnVjdCB3YWl0X3F1ZXVlIF9fd2FpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fd2FpdC50YXNrID0gY3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGFkZF93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZW5kaWYgIC8vIHZlcnNpb24gPj0gMi40Ci0KLSNkZWZpbmUgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgdGltZW91dCkJICBcCi0oewkJCQkJCQkJCSAgXAotCWxvbmcgX19yZXQgPSB0aW1lb3V0OwkJCQkJCSAgXAotCWlmICghKGNvbmRpdGlvbikpCQkJCQkJICBcCi0JCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgX19yZXQpOyBcCi0JX19yZXQ7CQkJCQkJCQkgIFwKLX0pCi0KLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCi0jaWZkZWYgX0xJTlVYX0xJU1RfSAotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLSAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOwotICAgICAgICBsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZmlyc3QgPSBsaXN0LT5uZXh0OwotICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGFzdCA9IGxpc3QtPnByZXY7Ci0gICAgICBzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7Ci0KLSAgICAgIGZpcnN0LT5wcmV2ID0gaGVhZDsKLSAgICAgIGhlYWQtPm5leHQgPSBmaXJzdDsKLQotICAgICAgbGFzdC0+bmV4dCA9IGF0OwotICAgICAgYXQtPnByZXYgPSBsYXN0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0gICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOwotICAgICAgbGlzdF9hZGQobGlzdCwgaGVhZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3NwbGljZV9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0gICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotCWlmICghbGlzdF9lbXB0eShsaXN0KSkgewotCQlfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQpOwotCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKLQl9Ci19Ci0KLQotI2VuZGlmICAvLyBMSVNUX0gKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMSw5MCkpCi0jZGVmaW5lIHNwaW5fbG9jayhsKSAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2sobCkgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX2xvY2tfaXJxc2F2ZShsLGYpICBkbyB7IHNhdmVfZmxhZ3MoZik7IGNsaSgpOyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX3VubG9ja19pcnFyZXN0b3JlKGwsZikgZG8geyByZXN0b3JlX2ZsYWdzKGYpOyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX2xvY2tfaW5pdChzKSAgICAgICBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fdHJ5bG9jayhsKSAgICAgICAgICgxKQotdHlwZWRlZiBpbnQgc3BpbmxvY2tfdDsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkgLy8gWFhYID8/PwotI2RlZmluZSBzcGluX2xvY2tfYmggICAgICAgICBzcGluX2xvY2sKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpICAgICAgICgqKHZvbGF0aWxlIGNoYXIgKikoJih4KS0+bG9jaykgPD0gMCkKLSNlbHNlCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKGwpICAgICAgICgwKQotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjgpKQotI2RlZmluZSBfX3VzZXIKLSNkZWZpbmUgX19pb21lbQotI2VuZGlmCi0KLSNpZmRlZiBfTElOVVhfUFJPQ19GU19ICi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywyNSkpCi0KLWV4dGVybiBpbmxpbmUgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKLWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9wcm9jX3QgKnJlYWRfcHJvYywgdm9pZCAqZGF0YSkKLXsKLSAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIG1vZGUsIGJhc2UpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmVzLT5yZWFkX3Byb2MgPSByZWFkX3Byb2M7Ci0gICAgICAgIHJlcy0+ZGF0YSA9IGRhdGE7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMjkpKQotI2lmbmRlZiBwcm9jX21rZGlyCi0jZGVmaW5lIHByb2NfbWtkaXIobmFtZSwgcm9vdCkgY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgU19JRkRJUiwgcm9vdCkKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogX0xJTlVYX1BST0NfRlNfSCAqLwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLSNpZm5kZWYgSU5JVF9UUVVFVUUKLSNkZWZpbmUgUFJFUEFSRV9UUVVFVUUoX3RxLCBfcm91dGluZSwgX2RhdGEpICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChfdHEpLT5yb3V0aW5lID0gX3JvdXRpbmU7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoX3RxKS0+ZGF0YSA9IF9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0jZGVmaW5lIElOSVRfVFFVRVVFKF90cSwgX3JvdXRpbmUsIF9kYXRhKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmKF90cSktPmxpc3QpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKF90cSktPnN5bmMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIFBSRVBBUkVfVFFVRVVFKChfdHEpLCAoX3JvdXRpbmUpLCAoX2RhdGEpKTsgICAgIFwKLSAgICAgICAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAotICAgICAgICBjb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKLSAgICAgICAgKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKLSNlbmRpZgotCi0jaWZuZGVmIElOSVRfV09SSwotI2RlZmluZSB3b3JrX3N0cnVjdCB0cV9zdHJ1Y3QKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jZGVmaW5lIHNjaGVkdWxlX3dvcmsoYSkgICBxdWV1ZV90YXNrKGEsICZ0cV9zY2hlZHVsZXIpCi0jZWxzZQotI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICBzY2hlZHVsZV90YXNrKGEpCi0jZW5kaWYKLQotI2RlZmluZSBmbHVzaF9zY2hlZHVsZWRfd29yayAgZmx1c2hfc2NoZWR1bGVkX3Rhc2tzCi0jZGVmaW5lIElOSVRfV09SSzIoX3dxLCBfcm91dGluZSkgIElOSVRfVFFVRVVFKF93cSwgKHZvaWQgKCopKHZvaWQgKikpX3JvdXRpbmUsIF93cSkKLSNlbmRpZgotCi0jZWxzZSAvLyA+PSAyLjUga2VybmVsCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCi0jZGVmaW5lIElOSVRfV09SSzIoX3dxLCBfcm91dGluZSkJSU5JVF9XT1JLKF93cSwgKHZvaWQgKCopKHZvaWQgKikpX3JvdXRpbmUsIF93cSkKLSNlbHNlCi0jZGVmaW5lIElOSVRfV09SSzIoX3dxLCBfcm91dGluZSkJSU5JVF9XT1JLKF93cSwgX3JvdXRpbmUpCi0jZW5kaWYKLQotI2VuZGlmIC8vID49IDIuNSBrZXJuZWwKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpKQotdHlwZWRlZiBzdHJ1Y3QgZGV2aWNlIG5ldGRldmljZV90OwotI2VsaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCw0KSkKLXR5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UgbmV0ZGV2aWNlX3Q7Ci0jZWxzZQogI3VuZGVmIG5ldGRldmljZV90CiB0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OwotI2VuZGlmCiAKLSNpZmRlZiBXSVJFTEVTU19FWFQKLSNpZiAoV0lSRUxFU1NfRVhUIDwgMTMpCi1zdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCi17Ci0gICAgICAgIF9fdTE2ICAgICAgICAgICBjbWQ7ICAgICAgICAgICAgLyogV2lyZWxlc3MgRXh0ZW5zaW9uIGNvbW1hbmQgKi8KLSAgICAgICAgX191MTYgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiBNb3JlIHRvIGNvbWUgOy0pICovCi19OwotI2VuZGlmCi0jZW5kaWYKLQotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMSwxOCkpCi0jZGVmaW5lIE1PRFVMRV9QQVJNKGEsYikgICAgICAgIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jZGVmaW5lIE1PRFVMRV9BVVRIT1IoYSkgICAgICAgIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jZGVmaW5lIE1PRFVMRV9ERVNDUklQVElPTihhKSAgIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jZGVmaW5lIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKGEpIGV4dGVybiBpbnQgX19ib2d1c19kZWNsCi0jdW5kZWYgIEdFVF9VU0VfQ09VTlQKLSNkZWZpbmUgR0VUX1VTRV9DT1VOVChtKSAgICAgICAgbW9kX3VzZV9jb3VudF8KLSNlbmRpZgotCi0jaWZuZGVmIE1PRFVMRV9PV05FUgotI2RlZmluZSBNT0RVTEVfT1dORVIoYSkgICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBBTkNJRU5UX01PRFVMRV9DT0RFCi0jZW5kaWYKLQotI2lmbmRlZiBNT0RVTEVfTElDRU5TRQotI2RlZmluZSBNT0RVTEVfTElDRU5TRShtKSAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2VuZGlmCi0KLS8qIFRPRE86ICBEbyB3ZSBjYXJlIGFib3V0IHRoaXM/ICovCi0jaWZuZGVmIE1PRFVMRV9ERVZJQ0VfVEFCTEUKLSNkZWZpbmUgTU9EVUxFX0RFVklDRV9UQUJMRShmb28sYmFyKQotI2VuZGlmCi0KLSNkZWZpbmUgd2xhbl9taW51dGVzMnRpY2tzKGEpICgoYSkqKHdsYW5fdGlja3NfcGVyX3NlYyAqICA2MCkpCi0jZGVmaW5lIHdsYW5fc2Vjb25kczJ0aWNrcyhhKSAoKGEpKih3bGFuX3RpY2tzX3Blcl9zZWMpKQotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0NykpCi0jZGVmaW5lIE5FV19NT0RVTEVfQ09ERQotI2lmZGVmIEFOQ0lFTlRfTU9EVUxFX0NPREUKLSN1bmRlZiBBTkNJRU5UX01PRFVMRV9DT0RFCi0jZW5kaWYKLSNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjUpKQotI2RlZmluZSBtb2R1bGVfcGFyYW0obmFtZSwgdHlwZSwgcGVybSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZCAqX19jaGVja19leGlzdGVuY2VfIyNuYW1lKHZvaWQpIHsgcmV0dXJuICZuYW1lOyB9IFwKLSAgICAgICAgTU9EVUxFX1BBUk0obmFtZSwgX01PRFVMRV9QQVJNX1NUUklOR18gIyMgdHlwZSkKLQotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX2J5dGUgImIiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfc2hvcnQgImgiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfdXNob3J0ICJoIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX2ludCAiaSIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR191aW50ICJpIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX2xvbmcgImwiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfdWxvbmcgImwiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfYm9vbCAiaSIKLSNlbmRpZgotCi0vKiBsaW51eCA8IDIuNS42OSAqLwotI2lmbmRlZiBJUlFfTk9ORQotdHlwZWRlZiB2b2lkIGlycXJldHVybl90OwotI2RlZmluZSBJUlFfTk9ORQotI2RlZmluZSBJUlFfSEFORExFRAotI2RlZmluZSBJUlFfUkVUVkFMKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBpbl9hdG9taWMKLSNkZWZpbmUgaW5fYXRvbWljKCkgIDAKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCiAjZGVmaW5lIFVSQl9BU1lOQ19VTkxJTksgMAotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDcpKQotI2RlZmluZSBVUkJfQVNZTkNfVU5MSU5LICBVU0JfQVNZTkNfVU5MSU5LCi0jZGVmaW5lIHVzYl9maWxsX2J1bGtfdXJiICBGSUxMX0JVTEtfVVJCCi0jZGVmaW5lIHVzYl9raWxsX3VyYiAgdXNiX3VubGlua191cmIKLSNlbHNlCiAjZGVmaW5lIFVTQl9RVUVVRV9CVUxLIDAKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkpCi10eXBlZGVmIHUzMiBwbV9tZXNzYWdlX3Q7Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOSkpCi0jZGVmaW5lIGhvdHBsdWdfcGF0aCAgIi9ldGMvaG90cGx1Zy93bGFuLmFnZW50IgotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotI2RlZmluZSBmcmVlX25ldGRldih4KSAgICAgICBrZnJlZSh4KQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQotI2RlZmluZSBldGhfaGRyKHgpICAgICAgICAgICAoeCktPm1hYy5ldGhlcm5ldAotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2RlZmluZSBkZWxfdGltZXJfc3luYyhhKSAgICAgICBkZWxfdGltZXIoYSkKLSNlbmRpZgotCi0jaWZuZGVmIG1pZ2h0X3NsZWVwCi0jZGVmaW5lIG1pZ2h0X3NsZWVwKGEpICAgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLS8qIEFwcGFyZW50bHkgMi40LjIgZXRodG9vbCBpcyBxdWl0ZSBkaWZmZXJlbnQsIG1heWJlIG5ld2VyIHRvbz8gKi8KLSNpZiAoZGVmaW5lZChTSU9FVEhUT09MKSAmJiAhZGVmaW5lZChFVEhUT09MX0dEUlZJTkZPKSkKLSN1bmRlZiBTSU9FVEhUT09MCi0jZW5kaWYKLQotLy8gcGNtY2lhLWNzIHN0dWZmCi0jaWYgKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKSAmJiBcCi0gICAgICFkZWZpbmVkKHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcikpCi0jZGVmaW5lIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihoYW5kbGUsIHJlZykgXAotICAgICAgICBDYXJkU2VydmljZXMoQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBoYW5kbGUsIHJlZykKLSNkZWZpbmUgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChoYW5kbGUsIHJlZykgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVnaXN0ZXJDbGllbnQsIGhhbmRsZSwgcmVnKQotI2RlZmluZSBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQoaGFuZGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhEZXJlZ2lzdGVyQ2xpZW50LCBoYW5kbGUpCi0jZGVmaW5lIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoR2V0Rmlyc3RUdXBsZSwgaGFuZGxlLCB0dXBsZSkKLSNkZWZpbmUgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgdHVwbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldE5leHRUdXBsZSwgaGFuZGxlLCB0dXBsZSkKLSNkZWZpbmUgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldFR1cGxlRGF0YSwgaGFuZGxlLCB0dXBsZSkKLSNkZWZpbmUgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhQYXJzZVR1cGxlLCBoYW5kbGUsIHR1cGxlLCBwYXJzZSkKLSNkZWZpbmUgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCBjb25maWcpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldENvbmZpZ3VyYXRpb25JbmZvLCBoYW5kbGUsIGNvbmZpZykKLSNkZWZpbmUgcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlcXVlc3RJTywgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVxdWVzdElSUSwgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlcXVlc3RDb25maWd1cmF0aW9uLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihoYW5kbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlbGVhc2VDb25maWd1cmF0aW9uLCBoYW5kbGUpCi0jZGVmaW5lIHBjbWNpYV9yZWxlYXNlX2lvKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlSU8sIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVsZWFzZV9pcnEoaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlbGVhc2VJUlEsIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVsZWFzZV93aW5kb3cod2luKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlV2luZG93LCB3aW4pCi0jZGVmaW5lIHBjbWNpYV9nZXRfY2FyZF9zZXJ2aWNlc19pbmZvKGluZm8pIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldENhcmRTZXJ2aWNlc0luZm8sIGluZm8pCi0jZGVmaW5lIHBjbWNpYV9yZXBvcnRfZXJyb3IoaGFuZGxlLCBlcnIpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlcG9ydEVycm9yLCBoYW5kbGUsIGVycikKLSNlbmRpZgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyotLS0tLS0gSGFyZHdhcmUgUG9ydGFiaWxpdHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTY5MiwyMiArMTQ0LDYgQEAKICNkZWZpbmUgaG9zdDJpZWVlMTYobikJX19jcHVfdG9fbGUxNihuKQogI2RlZmluZSBob3N0MmllZWUzMihuKQlfX2NwdV90b19sZTMyKG4pCiAKLSNpZiAoV0xBTl9DUFVfRkFNSUxZICE9IFdMQU5fTUlQUykKLXR5cGVkZWYgVUlOVDMyIHBoeXNfdDsKLSNlbmRpZgotCi0jaWYgKFdMQU5fQ1BVX0ZBTUlMWSA9PSBXTEFOX1BQQykKLSAgICAgICAjZGVmaW5lIHdsYW5faW53KGEpICAgICAgICAgICAgICAgICAgICAgaW5fYmUxNigodW5zaWduZWQgc2hvcnQgKikoKGEpK19JT19CQVNFKSkKLSAgICAgICAjZGVmaW5lIHdsYW5faW53X2xlMTZfdG9fY3B1KGEpICAgICAgICAgaW53KChhKSkKLSAgICAgICAjZGVmaW5lIHdsYW5fb3V0dyh2LGEpICAgICAgICAgICAgICAgICAgb3V0X2JlMTYoKHVuc2lnbmVkIHNob3J0ICopKChhKStfSU9fQkFTRSksICh2KSkKLSAgICAgICAjZGVmaW5lIHdsYW5fb3V0d19jcHVfdG9fbGUxNih2LGEpICAgICAgb3V0dygodiksKGEpKQotI2Vsc2UKLSAgICAgICAjZGVmaW5lIHdsYW5faW53KGEpICAgICAgICAgICAgICAgICAgICAgaW53KChhKSkKLSAgICAgICAjZGVmaW5lIHdsYW5faW53X2xlMTZfdG9fY3B1KGEpICAgICAgICAgX19jcHVfdG9fbGUxNihpbncoKGEpKSkKLSAgICAgICAjZGVmaW5lIHdsYW5fb3V0dyh2LGEpICAgICAgICAgICAgICAgICAgb3V0dygodiksKGEpKQotICAgICAgICNkZWZpbmUgd2xhbl9vdXR3X2NwdV90b19sZTE2KHYsYSkgICAgICBvdXR3KF9fY3B1X3RvX2xlMTYoKHYpKSwoYSkpCi0jZW5kaWYKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tIEdlbmVyYWwgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwppbmRleCBmZTA3NDYyLi44MTcxY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6OwogCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwogCi0JaWYgKCFzdHJuY21wKGRldi0+YnVzX2lkLCAidGhlcm1hbF96b25lIiwgc2l6ZW9mICJ0aGVybWFsX3pvbmUiIC0gMSkpIHsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUoZGV2KSwgInRoZXJtYWxfem9uZSIsIHNpemVvZiAidGhlcm1hbF96b25lIiAtIDEpKSB7CiAJCXR6ID0gdG9fdGhlcm1hbF96b25lKGRldik7CiAJCWtmcmVlKHR6KTsKIAl9IGVsc2UgewpAQCAtNjMwLDcgKzYzMCw3IEBACiAJY2Rldi0+b3BzID0gb3BzOwogCWNkZXYtPmRldmljZS5jbGFzcyA9ICZ0aGVybWFsX2NsYXNzOwogCWNkZXYtPmRldmRhdGEgPSBkZXZkYXRhOwotCXNwcmludGYoY2Rldi0+ZGV2aWNlLmJ1c19pZCwgImNvb2xpbmdfZGV2aWNlJWQiLCBjZGV2LT5pZCk7CisJZGV2X3NldF9uYW1lKCZjZGV2LT5kZXZpY2UsICJjb29saW5nX2RldmljZSVkIiwgY2Rldi0+aWQpOwogCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmY2Rldi0+ZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CiAJCXJlbGVhc2VfaWRyKCZ0aGVybWFsX2NkZXZfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgY2Rldi0+aWQpOwpAQCAtNzY5LDcgKzc2OSw3IEBACiAJdHotPmRldmljZS5jbGFzcyA9ICZ0aGVybWFsX2NsYXNzOwogCXR6LT5kZXZkYXRhID0gZGV2ZGF0YTsKIAl0ei0+dHJpcHMgPSB0cmlwczsKLQlzcHJpbnRmKHR6LT5kZXZpY2UuYnVzX2lkLCAidGhlcm1hbF96b25lJWQiLCB0ei0+aWQpOworCWRldl9zZXRfbmFtZSgmdHotPmRldmljZSwgInRoZXJtYWxfem9uZSVkIiwgdHotPmlkKTsKIAlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJnR6LT5kZXZpY2UpOwogCWlmIChyZXN1bHQpIHsKIAkJcmVsZWFzZV9pZHIoJnRoZXJtYWxfdHpfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgdHotPmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpby5jIGIvZHJpdmVycy91aW8vdWlvLmMKaW5kZXggMmQyNDQwYy4uNGNhODVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvLmMKKysrIGIvZHJpdmVycy91aW8vdWlvLmMKQEAgLTM1LDYgKzM1LDcgQEAKIAlpbnQJCQl2bWFfY291bnQ7CiAJc3RydWN0IHVpb19pbmZvCQkqaW5mbzsKIAlzdHJ1Y3Qga29iamVjdAkJKm1hcF9kaXI7CisJc3RydWN0IGtvYmplY3QJCSpwb3J0aW9fZGlyOwogfTsKIAogc3RhdGljIGludCB1aW9fbWFqb3I7CkBAIC03NSwxNyArNzYsMTcgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgbWVtLT5hZGRyICYgflBBR0VfTUFTSyk7CiB9CiAKLXN0cnVjdCB1aW9fc3lzZnNfZW50cnkgeworc3RydWN0IG1hcF9zeXNmc19lbnRyeSB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwogCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgdWlvX21lbSAqLCBjaGFyICopOwogCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHVpb19tZW0gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwogfTsKIAotc3RhdGljIHN0cnVjdCB1aW9fc3lzZnNfZW50cnkgYWRkcl9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBtYXBfc3lzZnNfZW50cnkgYWRkcl9hdHRyaWJ1dGUgPQogCV9fQVRUUihhZGRyLCBTX0lSVUdPLCBtYXBfYWRkcl9zaG93LCBOVUxMKTsKLXN0YXRpYyBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IHNpemVfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5IHNpemVfYXR0cmlidXRlID0KIAlfX0FUVFIoc2l6ZSwgU19JUlVHTywgbWFwX3NpemVfc2hvdywgTlVMTCk7Ci1zdGF0aWMgc3RydWN0IHVpb19zeXNmc19lbnRyeSBvZmZzZXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5IG9mZnNldF9hdHRyaWJ1dGUgPQogCV9fQVRUUihvZmZzZXQsIFNfSVJVR08sIG1hcF9vZmZzZXRfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tdID0gewpAQCAtMTA2LDkgKzEwNyw5IEBACiB7CiAJc3RydWN0IHVpb19tYXAgKm1hcCA9IHRvX21hcChrb2JqKTsKIAlzdHJ1Y3QgdWlvX21lbSAqbWVtID0gbWFwLT5tZW07Ci0Jc3RydWN0IHVpb19zeXNmc19lbnRyeSAqZW50cnk7CisJc3RydWN0IG1hcF9zeXNmc19lbnRyeSAqZW50cnk7CiAKLQllbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5LCBhdHRyKTsKKwllbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5LCBhdHRyKTsKIAogCWlmICghZW50cnktPnNob3cpCiAJCXJldHVybiAtRUlPOwpAQCAtMTE2LDE2ICsxMTcsOTMgQEAKIAlyZXR1cm4gZW50cnktPnNob3cobWVtLCBidWYpOwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2ZzX29wcyB1aW9fc3lzZnNfb3BzID0geworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgbWFwX3N5c2ZzX29wcyA9IHsKIAkuc2hvdyA9IG1hcF90eXBlX3Nob3csCiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBtYXBfYXR0cl90eXBlID0gewogCS5yZWxlYXNlCT0gbWFwX3JlbGVhc2UsCi0JLnN5c2ZzX29wcwk9ICZ1aW9fc3lzZnNfb3BzLAorCS5zeXNmc19vcHMJPSAmbWFwX3N5c2ZzX29wcywKIAkuZGVmYXVsdF9hdHRycwk9IGF0dHJzLAogfTsKIAorc3RydWN0IHVpb19wb3J0aW8geworCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJc3RydWN0IHVpb19wb3J0ICpwb3J0OworfTsKKyNkZWZpbmUgdG9fcG9ydGlvKHBvcnRpbykgY29udGFpbmVyX29mKHBvcnRpbywgc3RydWN0IHVpb19wb3J0aW8sIGtvYmopCisKK3N0YXRpYyBzc2l6ZV90IHBvcnRpb19zdGFydF9zaG93KHN0cnVjdCB1aW9fcG9ydCAqcG9ydCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBwb3J0LT5zdGFydCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvcnRpb19zaXplX3Nob3coc3RydWN0IHVpb19wb3J0ICpwb3J0LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglbHhcbiIsIHBvcnQtPnNpemUpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fcG9ydHR5cGVfc2hvdyhzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQsIGNoYXIgKmJ1ZikKK3sKKwljb25zdCBjaGFyICpwb3J0dHlwZXNbXSA9IHsibm9uZSIsICJ4ODYiLCAiZ3BpbyIsICJvdGhlciJ9OworCisJaWYgKChwb3J0LT5wb3J0dHlwZSA8IDApIHx8IChwb3J0LT5wb3J0dHlwZSA+IFVJT19QT1JUX09USEVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJwb3J0XyVzXG4iLCBwb3J0dHlwZXNbcG9ydC0+cG9ydHR5cGVdKTsKK30KKworc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgdWlvX3BvcnQgKiwgY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCB1aW9fcG9ydCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cit9OworCitzdGF0aWMgc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSBwb3J0aW9fc3RhcnRfYXR0cmlidXRlID0KKwlfX0FUVFIoc3RhcnQsIFNfSVJVR08sIHBvcnRpb19zdGFydF9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5IHBvcnRpb19zaXplX2F0dHJpYnV0ZSA9CisJX19BVFRSKHNpemUsIFNfSVJVR08sIHBvcnRpb19zaXplX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgcG9ydGlvX3BvcnR0eXBlX2F0dHJpYnV0ZSA9CisJX19BVFRSKHBvcnR0eXBlLCBTX0lSVUdPLCBwb3J0aW9fcG9ydHR5cGVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwb3J0aW9fYXR0cnNbXSA9IHsKKwkmcG9ydGlvX3N0YXJ0X2F0dHJpYnV0ZS5hdHRyLAorCSZwb3J0aW9fc2l6ZV9hdHRyaWJ1dGUuYXR0ciwKKwkmcG9ydGlvX3BvcnR0eXBlX2F0dHJpYnV0ZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBwb3J0aW9fcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgdWlvX3BvcnRpbyAqcG9ydGlvID0gdG9fcG9ydGlvKGtvYmopOworCWtmcmVlKHBvcnRpbyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvcnRpb190eXBlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdWlvX3BvcnRpbyAqcG9ydGlvID0gdG9fcG9ydGlvKGtvYmopOworCXN0cnVjdCB1aW9fcG9ydCAqcG9ydCA9IHBvcnRpby0+cG9ydDsKKwlzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnksIGF0dHIpOworCisJaWYgKCFlbnRyeS0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gZW50cnktPnNob3cocG9ydCwgYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgcG9ydGlvX3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9IHBvcnRpb190eXBlX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBwb3J0aW9fYXR0cl90eXBlID0geworCS5yZWxlYXNlCT0gcG9ydGlvX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZwb3J0aW9fc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gcG9ydGlvX2F0dHJzLAorfTsKKwogc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMTc3LDEwICsyNTUsMTMgQEAKIHN0YXRpYyBpbnQgdWlvX2Rldl9hZGRfYXR0cmlidXRlcyhzdHJ1Y3QgdWlvX2RldmljZSAqaWRldikKIHsKIAlpbnQgcmV0OwotCWludCBtaTsKKwlpbnQgbWksIHBpOwogCWludCBtYXBfZm91bmQgPSAwOworCWludCBwb3J0aW9fZm91bmQgPSAwOwogCXN0cnVjdCB1aW9fbWVtICptZW07CiAJc3RydWN0IHVpb19tYXAgKm1hcDsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQ7CisJc3RydWN0IHVpb19wb3J0aW8gKnBvcnRpbzsKIAogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaWRldi0+ZGV2LT5rb2JqLCAmdWlvX2F0dHJfZ3JwKTsKIAlpZiAocmV0KQpAQCAtMTk1LDI1ICsyNzYsNTggQEAKIAkJCWlkZXYtPm1hcF9kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJtYXBzIiwKIAkJCQkJCQkmaWRldi0+ZGV2LT5rb2JqKTsKIAkJCWlmICghaWRldi0+bWFwX2RpcikKLQkJCQlnb3RvIGVycjsKKwkJCQlnb3RvIGVycl9tYXA7CiAJCX0KIAkJbWFwID0ga3phbGxvYyhzaXplb2YoKm1hcCksIEdGUF9LRVJORUwpOwogCQlpZiAoIW1hcCkKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfbWFwOwogCQlrb2JqZWN0X2luaXQoJm1hcC0+a29iaiwgJm1hcF9hdHRyX3R5cGUpOwogCQltYXAtPm1lbSA9IG1lbTsKIAkJbWVtLT5tYXAgPSBtYXA7CiAJCXJldCA9IGtvYmplY3RfYWRkKCZtYXAtPmtvYmosIGlkZXYtPm1hcF9kaXIsICJtYXAlZCIsIG1pKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfbWFwOwogCQlyZXQgPSBrb2JqZWN0X3VldmVudCgmbWFwLT5rb2JqLCBLT0JKX0FERCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX21hcDsKKwl9CisKKwlmb3IgKHBpID0gMDsgcGkgPCBNQVhfVUlPX1BPUlRfUkVHSU9OUzsgcGkrKykgeworCQlwb3J0ID0gJmlkZXYtPmluZm8tPnBvcnRbcGldOworCQlpZiAocG9ydC0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICghcG9ydGlvX2ZvdW5kKSB7CisJCQlwb3J0aW9fZm91bmQgPSAxOworCQkJaWRldi0+cG9ydGlvX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInBvcnRpbyIsCisJCQkJCQkJJmlkZXYtPmRldi0+a29iaik7CisJCQlpZiAoIWlkZXYtPnBvcnRpb19kaXIpCisJCQkJZ290byBlcnJfcG9ydGlvOworCQl9CisJCXBvcnRpbyA9IGt6YWxsb2Moc2l6ZW9mKCpwb3J0aW8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwb3J0aW8pCisJCQlnb3RvIGVycl9wb3J0aW87CisJCWtvYmplY3RfaW5pdCgmcG9ydGlvLT5rb2JqLCAmcG9ydGlvX2F0dHJfdHlwZSk7CisJCXBvcnRpby0+cG9ydCA9IHBvcnQ7CisJCXBvcnQtPnBvcnRpbyA9IHBvcnRpbzsKKwkJcmV0ID0ga29iamVjdF9hZGQoJnBvcnRpby0+a29iaiwgaWRldi0+cG9ydGlvX2RpciwKKwkJCQkJCQkicG9ydCVkIiwgcGkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcG9ydGlvOworCQlyZXQgPSBrb2JqZWN0X3VldmVudCgmcG9ydGlvLT5rb2JqLCBLT0JKX0FERCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9wb3J0aW87CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycjoKK2Vycl9wb3J0aW86CisJZm9yIChwaS0tOyBwaSA+PSAwOyBwaS0tKSB7CisJCXBvcnQgPSAmaWRldi0+aW5mby0+cG9ydFtwaV07CisJCXBvcnRpbyA9IHBvcnQtPnBvcnRpbzsKKwkJa29iamVjdF9wdXQoJnBvcnRpby0+a29iaik7CisJfQorCWtvYmplY3RfcHV0KGlkZXYtPnBvcnRpb19kaXIpOworZXJyX21hcDoKIAlmb3IgKG1pLS07IG1pPj0wOyBtaS0tKSB7CiAJCW1lbSA9ICZpZGV2LT5pbmZvLT5tZW1bbWldOwogCQltYXAgPSBtZW0tPm1hcDsKQEAgLTIyOCwxNSArMzQyLDI2IEBACiAKIHN0YXRpYyB2b2lkIHVpb19kZXZfZGVsX2F0dHJpYnV0ZXMoc3RydWN0IHVpb19kZXZpY2UgKmlkZXYpCiB7Ci0JaW50IG1pOworCWludCBpOwogCXN0cnVjdCB1aW9fbWVtICptZW07Ci0JZm9yIChtaSA9IDA7IG1pIDwgTUFYX1VJT19NQVBTOyBtaSsrKSB7Ci0JCW1lbSA9ICZpZGV2LT5pbmZvLT5tZW1bbWldOworCXN0cnVjdCB1aW9fcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVUlPX01BUFM7IGkrKykgeworCQltZW0gPSAmaWRldi0+aW5mby0+bWVtW2ldOwogCQlpZiAobWVtLT5zaXplID09IDApCiAJCQlicmVhazsKIAkJa29iamVjdF9wdXQoJm1lbS0+bWFwLT5rb2JqKTsKIAl9CiAJa29iamVjdF9wdXQoaWRldi0+bWFwX2Rpcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VJT19QT1JUX1JFR0lPTlM7IGkrKykgeworCQlwb3J0ID0gJmlkZXYtPmluZm8tPnBvcnRbaV07CisJCWlmIChwb3J0LT5zaXplID09IDApCisJCQlicmVhazsKKwkJa29iamVjdF9wdXQoJnBvcnQtPnBvcnRpby0+a29iaik7CisJfQorCWtvYmplY3RfcHV0KGlkZXYtPnBvcnRpb19kaXIpOworCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpZGV2LT5kZXYtPmtvYmosICZ1aW9fYXR0cl9ncnApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fY2lmLmMgYi9kcml2ZXJzL3Vpby91aW9fY2lmLmMKaW5kZXggNTczNzYwNi4uYzYwYjhmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX2NpZi5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19jaWYuYwpAQCAtNTcsOCArNTcsNyBAQAogCWluZm8tPm1lbVswXS5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CiAJaWYgKCFpbmZvLT5tZW1bMF0uYWRkcikKIAkJZ290byBvdXRfcmVsZWFzZTsKLQlpbmZvLT5tZW1bMF0uaW50ZXJuYWxfYWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwlpbmZvLT5tZW1bMF0uaW50ZXJuYWxfYWRkciA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDApOwogCWlmICghaW5mby0+bWVtWzBdLmludGVybmFsX2FkZHIpCiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jIGIvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKaW5kZXggMWY4MmM4My4uM2YwNjgxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKKysrIGIvZHJpdmVycy91aW8vdWlvX3BkcnZfZ2VuaXJxLmMKQEAgLTgxLDcgKzgxLDggQEAKIAkJZ290byBiYWQwOwogCX0KIAotCWlmICh1aW9pbmZvLT5oYW5kbGVyIHx8IHVpb2luZm8tPmlycWNvbnRyb2wgfHwgdWlvaW5mby0+aXJxX2ZsYWdzKSB7CisJaWYgKHVpb2luZm8tPmhhbmRsZXIgfHwgdWlvaW5mby0+aXJxY29udHJvbCB8fAorCSAgICB1aW9pbmZvLT5pcnFfZmxhZ3MgJiBJUlFGX1NIQVJFRCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBlcnJvclxuIik7CiAJCWdvdG8gYmFkMDsKIAl9CkBAIC0xMzIsNyArMTMzLDcgQEAKIAkgKiBJbnRlcnJ1cHQgc2hhcmluZyBpcyBub3Qgc3VwcG9ydGVkLgogCSAqLwogCi0JdWlvaW5mby0+aXJxX2ZsYWdzID0gSVJRRl9ESVNBQkxFRDsKKwl1aW9pbmZvLT5pcnFfZmxhZ3MgfD0gSVJRRl9ESVNBQkxFRDsKIAl1aW9pbmZvLT5oYW5kbGVyID0gdWlvX3BkcnZfZ2VuaXJxX2hhbmRsZXI7CiAJdWlvaW5mby0+aXJxY29udHJvbCA9IHVpb19wZHJ2X2dlbmlycV9pcnFjb250cm9sOwogCXVpb2luZm8tPnByaXYgPSBwcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggYmUxZmEwNy4uMzk5ZTE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAlyZXR1cm4gdXNiX3Jlc3VtZShkZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IHBtX29wcyB1c2JfZGV2aWNlX3BtX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyB1c2JfZGV2aWNlX3BtX29wcyA9IHsKIAkucHJlcGFyZSA9CXVzYl9kZXZfcHJlcGFyZSwKIAkuY29tcGxldGUgPQl1c2JfZGV2X2NvbXBsZXRlLAogCS5zdXNwZW5kID0JdXNiX2Rldl9zdXNwZW5kLApAQCAtMzAxLDcgKzMwMSw3IEBACiAKICNkZWZpbmUga3N1c3BlbmRfdXNiX2luaXQoKQkwCiAjZGVmaW5lIGtzdXNwZW5kX3VzYl9jbGVhbnVwKCkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIHVzYl9kZXZpY2VfcG1fb3BzCSgqKHN0cnVjdCBwbV9vcHMgKikwKQorI2RlZmluZSB1c2JfZGV2aWNlX3BtX29wcwkoKihzdHJ1Y3QgZGV2X3BtX29wcyAqKTApCiAKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwppbmRleCBhOGExZGU0Li4wYjJiYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwpAQCAtMTQ3NCw3ICsxNDc0LDcgQEAKIAkJLmVwMAk9ICZjb250cm9sbGVyLmVwWzBdLmVwLAogCQkubmFtZQk9IGRyaXZlcl9uYW1lLAogCQkuZGV2CT0gewotCQkJLmJ1c19pZCA9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZSA9ICJnYWRnZXQiLAogCQkJLnJlbGVhc2UgPSBub3BfcmVsZWFzZSwKIAkJfQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXRtZWxfdXNiYV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCmluZGV4IGFlMzBhYjEuLjY1YjAzZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jCkBAIC0xMDM0LDcgKzEwMzQsNyBAQAogCQkuaXNfZHVhbHNwZWVkCT0gMSwKIAkJLm5hbWUJCT0gImF0bWVsX3VzYmFfdWRjIiwKIAkJLmRldgk9IHsKLQkJCS5idXNfaWQJCT0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lCT0gImdhZGdldCIsCiAJCQkucmVsZWFzZQk9IG5vcF9yZWxlYXNlLAogCQl9LAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYwppbmRleCBiMzQwOGZmLi5mNDAyNzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKQEAgLTI1NDUsNyArMjU0NSw3IEBACiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYpOwogCi0Jc3RyY3B5KHVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LmJ1c19pZCwgImdhZGdldCIpOworCWRldl9zZXRfbmFtZSgmdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYsICJnYWRnZXQiKTsKIAogCXVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LnJlbGVhc2UgPSBxZV91ZGNfcmVsZWFzZTsKIAl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKaW5kZXggYzZlN2RmMC4uZDU1NGIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKQEAgLTE5ODEsNyArMTk4MSw3IEBACiAJCSAgIC5lcDAgPSAmbWVtb3J5LmVwWzBdLmVwLAogCQkgICAubmFtZSA9IGRyaXZlcl9uYW1lLAogCQkgICAuZGV2ID0gewotCQkJICAgLmJ1c19pZCA9ICJnYWRnZXQiLAorCQkJICAgLmluaXRfbmFtZSA9ICJnYWRnZXQiLAogCQkJICAgLnJlbGVhc2UgPSBub3BfcmVsZWFzZSwKIAkJCSAgIH0sCiAJCSAgIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwppbmRleCA4YzUwMjZiLi42OTdhMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAJCS5lcDAJCT0gJm1lbW9yeS5lcFswXS5lcCwKIAkJLm5hbWUJCT0gZHJpdmVyX25hbWUsCiAJCS5kZXYgPSB7Ci0JCQkuYnVzX2lkCQk9ICJnYWRnZXQiLAorCQkJLmluaXRfbmFtZQk9ICJnYWRnZXQiLAogCQkJLnJlbGVhc2UJPSBub3BfcmVsZWFzZSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKaW5kZXggOTQ0ZTRmZi4uNjUxMTBkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCkBAIC0yMTYyLDcgKzIxNjIsNyBAQAogCQkuZXAwCQk9ICZtZW1vcnkudWRjX3VzYl9lcFswXS51c2JfZXAsCiAJCS5uYW1lCQk9IGRyaXZlcl9uYW1lLAogCQkuZGV2ID0gewotCQkJLmJ1c19pZAkJPSAiZ2FkZ2V0IiwKKwkJCS5pbml0X25hbWUJPSAiZ2FkZ2V0IiwKIAkJfSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jCmluZGV4IDhkOGQ2NTEuLmM3ZTI1NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jCkBAIC0xNzI3LDcgKzE3MjcsNyBAQAogCQkuZXAwCQk9ICZtZW1vcnkuZXBbMF0uZXAsCiAJCS5uYW1lCQk9IGdhZGdldF9uYW1lLAogCQkuZGV2ID0gewotCQkJLmJ1c19pZAkJPSAiZ2FkZ2V0IiwKKwkJCS5pbml0X25hbWUJPSAiZ2FkZ2V0IiwKIAkJfSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwppbmRleCAyNDNlYTRhLi5kYjE2MTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKQEAgLTIwNTEsNyArMjA1MSw3IEBACiAKIAkvKiBWaXJ0dWFsaXplIG1taW8gcmVnaW9uICovCiAJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSByZWdfYWRkcjsKLQlwYXItPnJlZ2Jhc2UgPSBpb3JlbWFwKHJlZ19hZGRyLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKKwlwYXItPnJlZ2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMik7CiAJaWYgKCFwYXItPnJlZ2Jhc2UpCiAJCWdvdG8gZXJyX2ZyZWVfaW5mbzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwppbmRleCBmYWIwYmM4Li4wNjY0ZmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJbmV3X2JkLT5kZXYuY2xhc3MgPSBiYWNrbGlnaHRfY2xhc3M7CiAJbmV3X2JkLT5kZXYucGFyZW50ID0gcGFyZW50OwogCW5ld19iZC0+ZGV2LnJlbGVhc2UgPSBibF9kZXZpY2VfcmVsZWFzZTsKLQlzdHJsY3B5KG5ld19iZC0+ZGV2LmJ1c19pZCwgbmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZSgmbmV3X2JkLT5kZXYsIG5hbWUpOwogCWRldl9zZXRfZHJ2ZGF0YSgmbmV3X2JkLT5kZXYsIGRldmRhdGEpOwogCiAJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJm5ld19iZC0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKaW5kZXggNjgwZTU3Yi4uYjY0NDk0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogCW5ld19sZC0+ZGV2LmNsYXNzID0gbGNkX2NsYXNzOwogCW5ld19sZC0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAluZXdfbGQtPmRldi5yZWxlYXNlID0gbGNkX2RldmljZV9yZWxlYXNlOwotCXN0cmxjcHkobmV3X2xkLT5kZXYuYnVzX2lkLCBuYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZuZXdfbGQtPmRldiwgbmFtZSk7CiAJZGV2X3NldF9kcnZkYXRhKCZuZXdfbGQtPmRldiwgZGV2ZGF0YSk7CiAKIAlyYyA9IGRldmljZV9yZWdpc3RlcigmbmV3X2xkLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwppbmRleCA3ZDFiODE5Li5hOWIzYWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwpAQCAtMjU1LDcgKzI1NSw3IEBACiB7CiAKIAlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCAhPSBMQ0RfQlBQKSB7Ci0JCXByX2RlYnVnKCIlczogZGVwdGggbm90IHN1cHBvcnRlZDogJXUgQlBQXG4iLCBfX0ZVTkNUSU9OX18sCisJCXByX2RlYnVnKCIlczogZGVwdGggbm90IHN1cHBvcnRlZDogJXUgQlBQXG4iLCBfX2Z1bmNfXywKIAkJCSB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjY0LDcgKzI2NCw3IEBACiAJICAgIGluZm8tPnZhci54cmVzX3ZpcnR1YWwgIT0gdmFyLT54cmVzX3ZpcnR1YWwgfHwKIAkgICAgaW5mby0+dmFyLnlyZXNfdmlydHVhbCAhPSB2YXItPnlyZXNfdmlydHVhbCkgewogCQlwcl9kZWJ1ZygiJXM6IFJlc29sdXRpb24gbm90IHN1cHBvcnRlZDogWCV1IHggWSV1IFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIHZhci0+eHJlcywgdmFyLT55cmVzKTsKKwkJCSBfX2Z1bmNfXywgdmFyLT54cmVzLCB2YXItPnlyZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI3NCw3ICsyNzQsNyBAQAogCiAJaWYgKChpbmZvLT5maXgubGluZV9sZW5ndGggKiB2YXItPnlyZXNfdmlydHVhbCkgPiBpbmZvLT5maXguc21lbV9sZW4pIHsKIAkJcHJfZGVidWcoIiVzOiBNZW1vcnkgTGltaXQgcmVxdWVzdGVkIHlyZXNfdmlydHVhbCA9ICV1XG4iLAotCQkJIF9fRlVOQ1RJT05fXywgdmFyLT55cmVzX3ZpcnR1YWwpOworCQkJIF9fZnVuY19fLCB2YXItPnlyZXNfdmlydHVhbCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKaW5kZXggYzliMTkxMy4uYzdmZjNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlibHVlID4+PSA4OwogCXRyYW5zcCA+Pj0gODsKIAotCSgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9IGJlMzJfdG9fY3B1KHRyYW5zcCA8PCAyNCB8CisJKChfX2JlMzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gY3B1X3RvX2JlMzIodHJhbnNwIDw8IDI0IHwKIAkJcmVkIDw8IDAgfCBncmVlbiA8PCA4IHwgYmx1ZSA8PCAxNik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKaW5kZXggMzlkNWQ2NC4uN2E5ZTQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYwpAQCAtMTU4Myw4ICsxNTgzLDcgQEAKIAkJZ290byBmYWlsZWRfcmVsZWFzZTsKIAogCWNmYi0+ZGV2ID0gZGV2OwotCWNmYi0+cmVnaW9uID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJY2ZiLT5yZWdpb24gPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIWNmYi0+cmVnaW9uKQogCQlnb3RvIGZhaWxlZF9pb3JlbWFwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggM2M2NWIwZC4uNzU2ZWZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtNTEwLDYgKzUxMCwxMCBAQAogCQlmYl9sb2dvX2V4X251bSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmJfbG9nb19leF9udW07IGkrKykgeworCQlpZiAoZmJfbG9nb19leFtpXS5sb2dvLT50eXBlICE9IGZiX2xvZ28ubG9nby0+dHlwZSkgeworCQkJZmJfbG9nb19leFtpXS5sb2dvID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWhlaWdodCArPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKIAkJaWYgKGhlaWdodCA+IHlyZXMpIHsKIAkJCWhlaWdodCAtPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwppbmRleCBmODljM2NjLi5mZTViNTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCkBAIC05MTIsNiArOTEyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbGluZV9sZW5ndGg7CiAJc3RydWN0IGdiZV90aW1pbmdfaW5mbyB0aW1pbmc7CisJaW50IHJldDsKIAogCS8qIExpbWl0IGJwcCB0byA4LCAxNiwgYW5kIDMyICovCiAJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gOCkKQEAgLTkzMCw4ICs5MzEsMTAgQEAKIAogCXZhci0+Z3JheXNjYWxlID0gMDsJLyogTm8gZ3JheXNjYWxlIGZvciBub3cgKi8KIAotCWlmICgodmFyLT5waXhjbG9jayA9IGNvbXB1dGVfZ2JlX3RpbWluZyh2YXIsICZ0aW1pbmcpKSA8IDApCi0JCXJldHVybigtRUlOVkFMKTsKKwlyZXQgPSBjb21wdXRlX2diZV90aW1pbmcodmFyLCAmdGltaW5nKTsKKwl2YXItPnBpeGNsb2NrID0gcmV0OworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEFkanVzdCB2aXJ0dWFsIHJlc29sdXRpb24sIGlmIG5lY2Vzc2FyeSAqLwogCWlmICh2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCB8fCAoIXl3cmFwICYmICF5cGFuKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggYmIyMGEyMi4uNzUxZTQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTIxNyw4ICsyMTcsNyBAQAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsICJneDFmYiAodmlkZW8pIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwlwYXItPnZpZF9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFwYXItPnZpZF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKaW5kZXggZGUyYjhmOS4uNDg0MTE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCkBAIC0yNDIsMjMgKzI0MiwyMSBAQAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDMsICJneGZiICh2aWRlbyBwcm9jZXNzb3IpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMyksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpKTsKKwlwYXItPnZpZF9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMyk7CiAJaWYgKCFwYXItPnZpZF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDIsICJneGZiIChkaXNwbGF5IGNvbnRyb2xsZXIpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT5kY19yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihkZXYsIDIpKTsKKwlwYXItPmRjX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAyKTsKIAlpZiAoIXBhci0+ZGNfcmVncykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAxLCAiZ3hmYiAoZ3JhcGhpY3MgcHJvY2Vzc29yKSIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXBhci0+Z3BfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwlwYXItPmdwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAxKTsKIAogCWlmICghcGFyLT5ncF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2x4ZmJfY29yZS5jCmluZGV4IDJjZDliNzQuLmI5NjVlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYwpAQCAtMzc5LDIwICszNzksMTcgQEAKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+Z3BfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwlwYXItPmdwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAxKTsKIAogCWlmIChwYXItPmdwX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+ZGNfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMiksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDIpKTsKKwlwYXItPmRjX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAyKTsKIAogCWlmIChwYXItPmRjX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+dnBfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMyksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpKTsKKwlwYXItPnZwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAzKTsKIAogCWlmIChwYXItPnZwX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jIGIvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKaW5kZXggNTY0NTU3Ny4uODk2ZTUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKKysrIGIvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKQEAgLTY0OCw3ICs2NDgsNyBAQAogCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wc2V1ZG9fcGFsZXR0ZTsKIAogCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcmVnX3BoeXM7Ci0JcGFyLT5yZWdzID0gaW9yZW1hcChyZWdfcGh5cywgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJcGFyLT5yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCWlmICghcGFyLT5yZWdzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBtYXAgcmVnaXN0ZXJzXG4iKTsKIAkJZ290byBlcnJfZnJlZV9hbGw7CkBAIC02NTYsNyArNjU2LDcgQEAKIAogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZmJfcGh5czsKIAlpbmZvLT5maXguc21lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOwotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChmYl9waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAxKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBtYXAgZnJhbWVidWZmZXJcbiIpOwogCQlnb3RvIGVycl91bm1hcF9yZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX2FjY2VsLmMKaW5kZXggNzY3NjRlYS4uZjViZWRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jCkBAIC0zMDEsOCArMzAxLDEwIEBACiAJdTMyIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgZGVzdCwgcm9wID0gMCwgY29sb3IgPSAwOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0KSAKLQkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkgICAgcGFyLT5kZXB0aCA9PSA0KSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChwYXItPmRlcHRoID09IDEpIAogCQljb2xvciA9IHJlY3QtPmNvbG9yOwpAQCAtMzI3LDggKzMyOSwxMCBAQAogCXUzMiBzeCwgc3ksIGR4LCBkeSwgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHNyYywgZGVzdCwgeGRpcjsKIAogCWlmICghaW5mby0+dmFyLmFjY2VsX2ZsYWdzIHx8IHBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQIHx8Ci0JICAgIHBhci0+ZGVwdGggPT0gNCkKLQkJcmV0dXJuIGNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCSAgICBwYXItPmRlcHRoID09IDQpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlkeCA9IHJlZ2lvbi0+ZHggKiBwYXItPmRlcHRoOwogCXN4ID0gcmVnaW9uLT5zeCAqIHBhci0+ZGVwdGg7CkBAIC0zNjYsOCArMzcwLDEwIEBACiAJdTMyIGZnID0gMCwgYmcgPSAwLCBzaXplLCBkc3Q7CiAJCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0IHx8IGltYWdlLT5kZXB0aCAhPSAxKSAKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCSAgICBwYXItPmRlcHRoID09IDQgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCmluZGV4IGEwOWUyMzYuLjZkOGU1NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwpAQCAtMTQ5Myw4ICsxNDkzLDEwIEBACiAJREJHX01TRygiaW50ZWxmYl9maWxscmVjdFxuIik7CiAjZW5kaWYKIAotCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChyZWN0LT5yb3AgPT0gUk9QX0NPUFkpCiAJCXJvcCA9IFBBVF9ST1BfR1hDT1BZOwpAQCAtMTUyMSw4ICsxNTIzLDEwIEBACiAJREJHX01TRygiaW50ZWxmYl9jb3B5YXJlYVxuIik7CiAjZW5kaWYKIAotCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlpbnRlbGZiaHdfZG9fYml0Ymx0KGRpbmZvLCByZWdpb24tPnN4LCByZWdpb24tPnN5LCByZWdpb24tPmR4LAogCQkJICAgIHJlZ2lvbi0+ZHksIHJlZ2lvbi0+d2lkdGgsIHJlZ2lvbi0+aGVpZ2h0LApAQCAtMTU0MCw4ICsxNTQ0LDEwIEBACiAjZW5kaWYKIAogCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0Ci0JICAgIHx8IGltYWdlLT5kZXB0aCAhPSAxKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJICAgIHx8IGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGRpbmZvLT5kZXB0aCAhPSA4KSB7CiAJCWZnY29sb3IgPSBkaW5mby0+cHNldWRvX3BhbGV0dGVbaW1hZ2UtPmZnX2NvbG9yXTsKQEAgLTE1NTQsOCArMTU2MCwxMCBAQAogCWlmICghaW50ZWxmYmh3X2RvX2RyYXdnbHlwaChkaW5mbywgZmdjb2xvciwgYmdjb2xvciwgaW1hZ2UtPndpZHRoLAogCQkJCSAgICBpbWFnZS0+aGVpZ2h0LCBpbWFnZS0+ZGF0YSwKIAkJCQkgICAgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksCi0JCQkJICAgIGRpbmZvLT5waXRjaCwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJCSAgICBkaW5mby0+cGl0Y2gsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxmYl9jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmN1cnNvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IGQzYzNhZjUuLjE2MTg2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKIAkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDE3IDExNTJ4ODY0LTc1IFZFU0EgKi8KLQl7IE5VTEwsIDc1LCAxMTUzLCA4NjQsIDkyNTksIDI1NiwgNjQsIDMyLCAxLCAxMjgsIDMsCisJeyBOVUxMLCA3NSwgMTE1MiwgODY0LCA5MjU5LCAyNTYsIDY0LCAzMiwgMSwgMTI4LCAzLAogCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCiAJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKIAkvKiAxOCAxMjgweDk2MC02MCBWRVNBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKaW5kZXggYmZiODAyZC4uNTg4NTI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9uZW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwpAQCAtMTQ1Myw3ICsxNDUzLDggQEAKIAkJCSAqIGlzIGxlc3MgdGhhbiAxNiBiaXRzIHdpZGUuIFRoaXMgaXMgZHVlIHRvIGluc3VmZmljaWVudAogCQkJICogcGFkZGluZyB3aGVuIHdyaXRpbmcgdGhlIGltYWdlLiBXZSBuZWVkIHRvIGFkanVzdAogCQkJICogc3RydWN0IGZiX3BpeG1hcC4gTm90IHlldCBkb25lLiAqLwotCQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQlyZXR1cm47CiAJCX0KIAkJYmx0Q250bF9mbGFncyA9IE5FT19CQzBfU1JDX01PTk87CiAJfSBlbHNlIGlmIChpbWFnZS0+ZGVwdGggPT0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CkBAIC0xNDYxLDcgKzE0NjIsOCBAQAogCX0gZWxzZSB7CiAJCS8qIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiBpbWFnZQogCQkgKiBkZXB0aCBpcyBkaWZmZXJlbnQgZnJvbSBkaXNwbGF5ICovCi0JCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKIAl9CiAKIAlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2FjY2VsLmMKaW5kZXggZmE0ODIxYy4uYWQ2NDcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jCkBAIC0zMDAsOCArMzAwLDEwIEBACiAJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQogCQlyZXR1cm47CiAKLQlpZiAocGFyLT5sb2NrdXApCi0JCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwlpZiAocGFyLT5sb2NrdXApIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlOVkRtYVN0YXJ0KGluZm8sIHBhciwgQkxJVF9QT0lOVF9TUkMsIDMpOwogCU5WRG1hTmV4dChwYXIsIChyZWdpb24tPnN5IDw8IDE2KSB8IHJlZ2lvbi0+c3gpOwpAQCAtMzE5LDggKzMyMSwxMCBAQAogCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKIAkJcmV0dXJuOwogCi0JaWYgKHBhci0+bG9ja3VwKQotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCWlmIChwYXItPmxvY2t1cCkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCiAJCWNvbG9yID0gcmVjdC0+Y29sb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jIGIvZHJpdmVycy92aWRlby9vdXRwdXQuYwppbmRleCBmMmRmNTUxLi41ZTY0MzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMKQEAgLTk2LDcgKzk2LDcgQEAKIAluZXdfZGV2LT5wcm9wcyA9IG9wOwogCW5ld19kZXYtPmRldi5jbGFzcyA9ICZ2aWRlb19vdXRwdXRfY2xhc3M7CiAJbmV3X2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlzdHJsY3B5KG5ld19kZXYtPmRldi5idXNfaWQsbmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZSgmbmV3X2Rldi0+ZGV2LCBuYW1lKTsKIAlkZXZfc2V0X2RydmRhdGEoJm5ld19kZXYtPmRldiwgZGV2ZGF0YSk7CiAJcmV0X2NvZGUgPSBkZXZpY2VfcmVnaXN0ZXIoJm5ld19kZXYtPmRldik7CiAJaWYgKHJldF9jb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKaW5kZXggNjgwODlkMS4uNjY2NmY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwpAQCAtNTM5LDggKzUzOSwxMCBAQAogCQliZ3ggPSBwYXItPnBhbGV0dGVbaW1hZ2UtPmJnX2NvbG9yXTsKIAkJYnJlYWs7CiAJfQotCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkgewogCQlmZ3ggfD0gZmd4IDw8IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCmluZGV4IGY5NGFlODQuLmRjZDk4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCkBAIC0xNTksNiArMTU5LDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNNTAxX01FTUZfUEFORUw6CisJCWlmIChzaXplID4gaW5mLT5mYm1lbV9sZW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlwdHIgPSBpbmYtPmZibWVtX2xlbiAtIHNpemU7CiAJCWZiaSA9IGluZi0+ZmJbSEVBRF9DUlRdOwogCkBAIC0xNzIsOSArMTc1LDYgQEAKIAkJaWYgKGZiaSAmJiBwdHIgPCBmYmktPmZpeC5zbWVtX2xlbikKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWlmIChwdHIgPCAwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkJYnJlYWs7CiAKIAljYXNlIFNNNTAxX01FTUZfQ1JUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKaW5kZXggZTIxZmU1Yi4uMzdiNDMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCkBAIC04NzAsOCArODcwLDEwIEBACiAJdTMyIGNvbCA9IDAsIHJvcCA9IDA7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwlpZiAoIXZpYWZiX2FjY2VsKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKIAkJcmV0dXJuOwpAQCAtOTM3LDggKzkzOSwxMCBAQAogCiAJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfY29weWFyZWEhIVxuIik7CiAKLQlpZiAoIXZpYWZiX2FjY2VsKQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCQlyZXR1cm47CisJfQogCiAJaWYgKCFhcmVhLT53aWR0aCB8fCAhYXJlYS0+aGVpZ2h0KQogCQlyZXR1cm47CkBAIC05OTQsOCArOTk4LDEwIEBACiAJaW50IGk7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAl1ZGF0YSA9ICh1MzIgKikgaW1hZ2UtPmRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwppbmRleCAyNjVmZGYyLi5iZWY2YjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCkBAIC03MywxMCArNzMsNyBAQAogLyogQSBQQ0kgZGV2aWNlIGhhcyBpdCdzIG93biBzdHJ1Y3QgZGV2aWNlIGFuZCBzbyBkb2VzIGEgdmlydGlvIGRldmljZSBzbwogICogd2UgY3JlYXRlIGEgcGxhY2UgZm9yIHRoZSB2aXJ0aW8gZGV2aWNlcyB0byBzaG93IHVwIGluIHN5c2ZzLiAgSSB0aGluayBpdAogICogd291bGQgbWFrZSBtb3JlIHNlbnNlIGZvciB2aXJ0aW8gdG8gbm90IGluc2lzdCBvbiBoYXZpbmcgaXQncyBvd24gZGV2aWNlLiAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgdmlydGlvX3BjaV9yb290ID0gewotCS5wYXJlbnQJCT0gTlVMTCwKLQkuaW5pdF9uYW1lCT0gInZpcnRpby1wY2kiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp2aXJ0aW9fcGNpX3Jvb3Q7CiAKIC8qIENvbnZlcnQgYSBnZW5lcmljIHZpcnRpbyBkZXZpY2UgdG8gb3VyIHN0cnVjdHVyZSAqLwogc3RhdGljIHN0cnVjdCB2aXJ0aW9fcGNpX2RldmljZSAqdG9fdnBfZGV2aWNlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpAQCAtMzQzLDcgKzM0MCw3IEBACiAJaWYgKHZwX2RldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXZwX2Rldi0+dmRldi5kZXYucGFyZW50ID0gJnZpcnRpb19wY2lfcm9vdDsKKwl2cF9kZXYtPnZkZXYuZGV2LnBhcmVudCA9IHZpcnRpb19wY2lfcm9vdDsKIAl2cF9kZXYtPnZkZXYuZGV2LnJlbGVhc2UgPSB2aXJ0aW9fcGNpX3JlbGVhc2VfZGV2OwogCXZwX2Rldi0+dmRldi5jb25maWcgPSAmdmlydGlvX3BjaV9jb25maWdfb3BzOwogCXZwX2Rldi0+cGNpX2RldiA9IHBjaV9kZXY7CkBAIC00MzcsMTMgKzQzNCwxMyBAQAogewogCWludCBlcnI7CiAKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZpcnRpb19wY2lfcm9vdCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwl2aXJ0aW9fcGNpX3Jvb3QgPSByb290X2RldmljZV9yZWdpc3RlcigidmlydGlvLXBjaSIpOworCWlmIChJU19FUlIodmlydGlvX3BjaV9yb290KSkKKwkJcmV0dXJuIFBUUl9FUlIodmlydGlvX3BjaV9yb290KTsKIAogCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpcnRpb19wY2lfZHJpdmVyKTsKIAlpZiAoZXJyKQotCQlkZXZpY2VfdW5yZWdpc3RlcigmdmlydGlvX3BjaV9yb290KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00NTIsOCArNDQ5LDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19wY2lfZXhpdCh2b2lkKQogewotCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0aW9fcGNpX3Jvb3QpOwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGlvX3BjaV9kcml2ZXIpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIH0KIAogbW9kdWxlX2V4aXQodmlydGlvX3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCAzYjYxNWQ0Li5hY2M3ZTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIHN0cnVjdCBkZXZpY2UgdzFfbWFzdGVyX2RldmljZSA9IHsKIAkucGFyZW50ID0gTlVMTCwKIAkuYnVzID0gJncxX2J1c190eXBlLAotCS5idXNfaWQgPSAidzEgYnVzIG1hc3RlciIsCisJLmluaXRfbmFtZSA9ICJ3MSBidXMgbWFzdGVyIiwKIAkuZHJpdmVyID0gJncxX21hc3Rlcl9kcml2ZXIsCiAJLnJlbGVhc2UgPSAmdzFfbWFzdGVyX3JlbGVhc2UKIH07CkBAIC0yMTEsNyArMjExLDcgQEAKIHN0cnVjdCBkZXZpY2UgdzFfc2xhdmVfZGV2aWNlID0gewogCS5wYXJlbnQgPSBOVUxMLAogCS5idXMgPSAmdzFfYnVzX3R5cGUsCi0JLmJ1c19pZCA9ICJ3MSBidXMgc2xhdmUiLAorCS5pbml0X25hbWUgPSAidzEgYnVzIHNsYXZlIiwKIAkuZHJpdmVyID0gJncxX3NsYXZlX2RyaXZlciwKIAkucmVsZWFzZSA9ICZ3MV9zbGF2ZV9yZWxlYXNlCiB9OwpAQCAtNTczLDcgKzU3Myw3IEBACiAJfQogCiAJZGV2X2RiZyhkZXYsICJIb3RwbHVnIGV2ZW50IGZvciAlcyAlcywgYnVzX2lkPSVzLlxuIiwKLQkJCWV2ZW50X293bmVyLCBuYW1lLCBkZXYtPmJ1c19pZCk7CisJCQlldmVudF9vd25lciwgbmFtZSwgZGV2X25hbWUoZGV2KSk7CiAKIAlpZiAoZGV2LT5kcml2ZXIgIT0gJncxX3NsYXZlX2RyaXZlciB8fCAhc2wpCiAJCXJldHVybiAwOwpAQCAtNjA1LDggKzYwNSw3IEBACiAJc2wtPmRldi5idXMgPSAmdzFfYnVzX3R5cGU7CiAJc2wtPmRldi5yZWxlYXNlID0gJncxX3NsYXZlX3JlbGVhc2U7CiAKLQlzbnByaW50Zigmc2wtPmRldi5idXNfaWRbMF0sIHNpemVvZihzbC0+ZGV2LmJ1c19pZCksCi0JCSAiJTAyeC0lMDEybGx4IiwKKwlkZXZfc2V0X25hbWUoJnNsLT5kZXYsICIlMDJ4LSUwMTJsbHgiLAogCQkgKHVuc2lnbmVkIGludCkgc2wtPnJlZ19udW0uZmFtaWx5LAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2wtPnJlZ19udW0uaWQpOwogCXNucHJpbnRmKCZzbC0+bmFtZVswXSwgc2l6ZW9mKHNsLT5uYW1lKSwKQEAgLTYxNSwxMyArNjE0LDEzIEBACiAJCSAodW5zaWduZWQgbG9uZyBsb25nKSBzbC0+cmVnX251bS5pZCk7CiAKIAlkZXZfZGJnKCZzbC0+ZGV2LCAiJXM6IHJlZ2lzdGVyaW5nICVzIGFzICVwLlxuIiwgX19mdW5jX18sCi0JCSZzbC0+ZGV2LmJ1c19pZFswXSwgc2wpOworCQlkZXZfbmFtZSgmc2wtPmRldiksIHNsKTsKIAogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc2wtPmRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJEZXZpY2UgcmVnaXN0cmF0aW9uIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTYzMCw3ICs2MjksNyBAQAogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKLQkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQkJZGV2X25hbWUoJnNsLT5kZXYpLCBlcnIpOwogCQlnb3RvIG91dF91bnJlZzsKIAl9CiAKQEAgLTYzOSw3ICs2MzgsNyBAQAogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKLQkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQkJZGV2X25hbWUoJnNsLT5kZXYpLCBlcnIpOwogCQlnb3RvIG91dF9yZW0xOwogCX0KIApAQCAtNjQ4LDcgKzY0Nyw3IEBACiAJICAgICgoZXJyID0gc2wtPmZhbWlseS0+Zm9wcy0+YWRkX3NsYXZlKHNsKSkgPCAwKSkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJInN5c2ZzIGZpbGUgY3JlYXRpb24gZm9yIFslc10gZmFpbGVkLiBlcnI9JWRcbiIsCi0JCQlzbC0+ZGV2LmJ1c19pZCwgZXJyKTsKKwkJCWRldl9uYW1lKCZzbC0+ZGV2KSwgZXJyKTsKIAkJZ290byBvdXRfcmVtMjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW50LmMgYi9kcml2ZXJzL3cxL3cxX2ludC5jCmluZGV4IGEzYTU0NTYuLjRhNDZlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfaW50LmMKKysrIGIvZHJpdmVycy93MS93MV9pbnQuYwpAQCAtNzUsOCArNzUsNyBAQAogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCiAJbWVtY3B5KCZkZXYtPmRldiwgZGV2aWNlLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksCi0JCSAgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKIAlzbnByaW50ZihkZXYtPm5hbWUsIHNpemVvZihkZXYtPm5hbWUpLCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAKIAlkZXYtPmRyaXZlciA9IGRyaXZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwppbmRleCA3ZjI0YTk4Li5iMmEwMzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCkBAIC05OSwxNSArOTksMTUgQEAKIH0KIAogLyogZGV2aWNlLzx0eXBlPi88aWQ+ID0+IDx0eXBlPi08aWQ+ICovCi1zdGF0aWMgaW50IGZyb250ZW5kX2J1c19pZChjaGFyIGJ1c19pZFtCVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQorc3RhdGljIGludCBmcm9udGVuZF9idXNfaWQoY2hhciBidXNfaWRbWEVOX0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpCiB7CiAJbm9kZW5hbWUgPSBzdHJjaHIobm9kZW5hbWUsICcvJyk7Ci0JaWYgKCFub2RlbmFtZSB8fCBzdHJsZW4obm9kZW5hbWUgKyAxKSA+PSBCVVNfSURfU0laRSkgeworCWlmICghbm9kZW5hbWUgfHwgc3RybGVuKG5vZGVuYW1lICsgMSkgPj0gWEVOX0JVU19JRF9TSVpFKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlhFTkJVUzogYmFkIGZyb250ZW5kICVzXG4iLCBub2RlbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN0cmxjcHkoYnVzX2lkLCBub2RlbmFtZSArIDEsIEJVU19JRF9TSVpFKTsKKwlzdHJsY3B5KGJ1c19pZCwgbm9kZW5hbWUgKyAxLCBYRU5fQlVTX0lEX1NJWkUpOwogCWlmICghc3RyY2hyKGJ1c19pZCwgJy8nKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IGJ1c19pZCAlcyBubyBzbGFzaFxuIiwgYnVzX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NjAsNiArNDYwLDcgQEAKIAkJICAgICAgY29uc3QgY2hhciAqdHlwZSwKIAkJICAgICAgY29uc3QgY2hhciAqbm9kZW5hbWUpCiB7CisJY2hhciBkZXZuYW1lW1hFTl9CVVNfSURfU0laRV07CiAJaW50IGVycjsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGVuZGV2OwogCXNpemVfdCBzdHJpbmdsZW47CkBAIC00OTQsMTAgKzQ5NSwxMiBAQAogCXhlbmRldi0+ZGV2LmJ1cyA9ICZidXMtPmJ1czsKIAl4ZW5kZXYtPmRldi5yZWxlYXNlID0geGVuYnVzX2Rldl9yZWxlYXNlOwogCi0JZXJyID0gYnVzLT5nZXRfYnVzX2lkKHhlbmRldi0+ZGV2LmJ1c19pZCwgeGVuZGV2LT5ub2RlbmFtZSk7CisJZXJyID0gYnVzLT5nZXRfYnVzX2lkKGRldm5hbWUsIHhlbmRldi0+bm9kZW5hbWUpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKIAorCWRldl9zZXRfbmFtZSgmeGVuZGV2LT5kZXYsIGRldm5hbWUpOworCiAJLyogUmVnaXN0ZXIgd2l0aCBnZW5lcmljIGRldmljZSBmcmFtZXdvcmsuICovCiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ4ZW5kZXYtPmRldik7CiAJaWYgKGVycikKQEAgLTYxMSw3ICs2MTQsNyBAQAogewogCWludCBleGlzdHMsIHJvb3RsZW47CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldjsKLQljaGFyIHR5cGVbQlVTX0lEX1NJWkVdOworCWNoYXIgdHlwZVtYRU5fQlVTX0lEX1NJWkVdOwogCWNvbnN0IGNoYXIgKnAsICpyb290OwogCiAJaWYgKGNoYXJfY291bnQobm9kZSwgJy8nKSA8IDIpCkBAIC02MjUsOCArNjI4LDggQEAKIAogCS8qIGJhY2tlbmQvPHR5cGU+Ly4uLiBvciBkZXZpY2UvPHR5cGU+Ly4uLiAqLwogCXAgPSBzdHJjaHIobm9kZSwgJy8nKSArIDE7Ci0Jc25wcmludGYodHlwZSwgQlVTX0lEX1NJWkUsICIlLipzIiwgKGludClzdHJjc3BuKHAsICIvIiksIHApOwotCXR5cGVbQlVTX0lEX1NJWkUtMV0gPSAnXDAnOworCXNucHJpbnRmKHR5cGUsIFhFTl9CVVNfSURfU0laRSwgIiUuKnMiLCAoaW50KXN0cmNzcG4ocCwgIi8iKSwgcCk7CisJdHlwZVtYRU5fQlVTX0lEX1NJWkUtMV0gPSAnXDAnOwogCiAJcm9vdGxlbiA9IHN0cnNlcF9sZW4obm9kZSwgJy8nLCBidXMtPmxldmVscyk7CiAJaWYgKHJvb3RsZW4gPCAwKQpAQCAtNjc0LDcgKzY3Nyw3IEBACiAJCWVyciA9IGRydi0+c3VzcGVuZCh4ZGV2KTsKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAieGVuYnVzOiBzdXNwZW5kICVzIGZhaWxlZDogJWlcbiIsIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgInhlbmJ1czogc3VzcGVuZCAlcyBmYWlsZWQ6ICVpXG4iLCBkZXZfbmFtZShkZXYpLCBlcnIpOwogCXJldHVybiAwOwogfQogCkBAIC02OTUsNyArNjk4LDcgQEAKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAieGVuYnVzOiBzdXNwZW5kX2NhbmNlbCAlcyBmYWlsZWQ6ICVpXG4iLAotCQkgICAgICAgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICBkZXZfbmFtZShkZXYpLCBlcnIpOwogCXJldHVybiAwOwogfQogCkBAIC03MTcsNyArNzIwLDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXM6IHJlc3VtZSAodGFsa190b19vdGhlcmVuZCkgJXMgZmFpbGVkOiAlaVxuIiwKLQkJICAgICAgIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTcyOCw3ICs3MzEsNyBAQAogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgInhlbmJ1czogcmVzdW1lICVzIGZhaWxlZDogJWlcbiIsCi0JCQkgICAgICAgZGV2LT5idXNfaWQsIGVycik7CisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC03MzcsNyArNzQwLDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXNfcHJvYmU6IHJlc3VtZSAod2F0Y2hfb3RoZXJlbmQpICVzIGZhaWxlZDogIgotCQkgICAgICAgIiVkLlxuIiwgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICAiJWQuXG4iLCBkZXZfbmFtZShkZXYpLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCmluZGV4IGUwOWIxOTQuLjZjNWUzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAorKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKQEAgLTM0LDYgKzM0LDggQEAKICNpZm5kZWYgX1hFTkJVU19QUk9CRV9ICiAjZGVmaW5lIF9YRU5CVVNfUFJPQkVfSAogCisjZGVmaW5lIFhFTl9CVVNfSURfU0laRQkJCTIwCisKICNpZmRlZiBDT05GSUdfWEVOX0JBQ0tFTkQKIGV4dGVybiB2b2lkIHhlbmJ1c19iYWNrZW5kX3N1c3BlbmQoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CiBleHRlcm4gdm9pZCB4ZW5idXNfYmFja2VuZF9yZXN1bWUoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CkBAIC01Miw3ICs1NCw3IEBACiB7CiAJY2hhciAqcm9vdDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWxzOwotCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpOworCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKIAlpbnQgKCpwcm9iZSkoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGlyKTsKIAlzdHJ1Y3QgYnVzX3R5cGUgYnVzOwogfTsKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2RzcDU2ay9ib290c3RyYXAuYXNtIGIvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KaW5kZXggMTBkODkxOS4uYTQxMTA0NyAxMDA2NDQKLS0tIGEvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KKysrIGIvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20KQEAgLTUxLDE5ICs1MSwxOSBAQAogICAgICAgICA7IENvcHkgRFNQIHByb2dyYW0gY29udHJvbAogICAgICAgICBtb3ZlICAgICNyZWFsLHIwCiAgICAgICAgIG1vdmUgICAgI3VwbG9hZCxyMQotICAgICAgICBkbyAgICAgICN1cGxvYWRfZW5kLXVwbG9hZCw8X2NvcHkKLSAgICAgICAgbW92ZSAgICBQOihyMCkrLHgwCi0gICAgICAgIG1vdmUgICAgeDAsUDoocjEpKwotX2NvcHkgICBtb3ZlcCAgICM+NCxYOjw8TV9IQ1IKLSAgICAgICAgbW92ZXAgICAjPiRjMDAsWDo8PE1fSVBSCisgICAgICAgIGRvICAgICAgI3VwbG9hZF9lbmQtdXBsb2FkLF9jb3B5CisgICAgICAgIG1vdmVtICAgIFA6KHIwKSsseDAKKyAgICAgICAgbW92ZW0gICAgeDAsUDoocjEpKworX2NvcHkgICBtb3ZlcCAgICM0LFg6PDxNX0hDUgorICAgICAgICBtb3ZlcCAgICMkYzAwLFg6PDxNX0lQUgogICAgICAgICBhbmQgICAgICM8JGZlLG1yCiAgICAgICAgIGptcCAgICAgdXBsb2FkCiAKIHJlYWwKICAgICAgICAgb3JnICAgICBQOiQ3ZWE5CiB1cGxvYWQKLSAgICAgICAgbW92ZXAgICAjPjEsWDo8PE1fUEJDCi0gICAgICAgIG1vdmVwICAgIz4wLFg6PDxNX0JDUgorICAgICAgICBtb3ZlcCAgICMxLFg6PDxNX1BCQworICAgICAgICBtb3ZlcCAgICMwLFg6PDxNX0JDUgogCiBuZXh0ICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsQQpAQCAtODEsMTggKzgxLDE4IEBACiAgICAgICAgIGNtcCAgICAgeDAsQQogICAgICAgICBqZXEgICAgIGxvYWRfWQogCi1sb2FkX1AgIGRvICAgICAgeTAsX2xvYWQKK2xvYWRfUCAgZG8gICAgICB5MCxfbG9hZF9QCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsUDoocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKLWxvYWRfWCAgZG8gICAgICB5MCxfbG9hZAorX2xvYWRfUCBqbXAgICAgIG5leHQKK2xvYWRfWCAgZG8gICAgICB5MCxfbG9hZF9YCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsWDoocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKLWxvYWRfWSAgZG8gICAgICB5MCxfbG9hZAorX2xvYWRfWCBqbXAgICAgIG5leHQKK2xvYWRfWSAgZG8gICAgICB5MCxfbG9hZF9ZCiAgICAgICAgIGpjbHIgICAgIzAsWDo8PE1fSFNSLCoKICAgICAgICAgbW92ZXAgICBYOjw8TV9IUlgsWToocjApKwotX2xvYWQgICBqbXAgICAgIG5leHQKK19sb2FkX1kgam1wICAgICBuZXh0CiAKIHVwbG9hZF9lbmQKICAgICAgICAgZW5kCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBmOWI2ZTI5Li4zMjg4MzU4IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTcyMSw3ICs3MjEsMjAgQEAKIAogZW5kbWVudQogCi1tZW51ICJNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zIgorbWVudWNvbmZpZyBNSVNDX0ZJTEVTWVNURU1TCisJYm9vbCAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGdldCB0byBzZWUgb3B0aW9ucyBmb3IgdmFyaW91cyBtaXNjZWxsYW5lb3VzCisJICBmaWxlc3lzdGVtcywgc3VjaCBhcyBmaWxlc3lzdGVtcyB0aGF0IGNhbWUgZnJvbSBvdGhlcgorCSAgb3BlcmF0aW5nIHN5c3RlbXMuCisKKwkgIFRoaXMgb3B0aW9uIGFsb25lIGRvZXMgbm90IGFkZCBhbnkga2VybmVsIGNvZGUuCisKKwkgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQKKwkgIGRpc2FibGVkOyBpZiB1bnN1cmUsIHNheSBZIGhlcmUuCisKK2lmIE1JU0NfRklMRVNZU1RFTVMKIAogY29uZmlnIEFERlNfRlMKIAl0cmlzdGF0ZSAiQURGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgpAQCAtMTA5MSw3ICsxMTA0LDcgQEAKIAkgIFkgaGVyZS4gIFRoaXMgd2lsbCByZXN1bHQgaW4gX21hbnlfIGFkZGl0aW9uYWwgZGVidWdnaW5nIG1lc3NhZ2VzIHRvIGJlCiAJICB3cml0dGVuIHRvIHRoZSBzeXN0ZW0gbG9nLgogCi1lbmRtZW51CitlbmRpZiAjIE1JU0NfRklMRVNZU1RFTVMKIAogbWVudWNvbmZpZyBORVRXT1JLX0ZJTEVTWVNURU1TCiAJYm9vbCAiTmV0d29yayBGaWxlIFN5c3RlbXMiCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2F1dG9mc19pLmggYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKaW5kZXggZTBmMTZkYS4uYTc2ODAzMSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCisrKyBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaApAQCAtMjUsOCArMjUsNiBAQAogI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0lPQ19GSVJTVAkoQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OKQogI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0lPQ19DT1VOVAkoQVVUT0ZTX0lPQ19DT1VOVCAtIDExKQogCi0jZGVmaW5lIEFVVE9GU19UWVBFX1RSSUdHRVIJKEFVVE9GU19UWVBFX0RJUkVDVHxBVVRPRlNfVFlQRV9PRkZTRVQpCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYyBiL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMKaW5kZXggNjNiN2M3YS4uMDI1ZTEwNSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYworKysgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogLyoKICAqIENoZWNrIHNhbml0eSBvZiBwYXJhbWV0ZXIgY29udHJvbCBmaWVsZHMgYW5kIGlmIGEgcGF0aCBpcyBwcmVzZW50Ci0gKiBjaGVjayB0aGF0IGl0IGhhcyBhICIvIiBhbmQgaXMgdGVybWluYXRlZC4KKyAqIGNoZWNrIHRoYXQgaXQgaXMgdGVybWluYXRlZCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgb25lICIvIi4KICAqLwogc3RhdGljIGludCB2YWxpZGF0ZV9kZXZfaW9jdGwoaW50IGNtZCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQogewpAQCAtMTM4LDE1ICsxMzgsMTYgQEAKIAl9CiAKIAlpZiAocGFyYW0tPnNpemUgPiBzaXplb2YoKnBhcmFtKSkgewotCQllcnIgPSBjaGVja19uYW1lKHBhcmFtLT5wYXRoKTsKKwkJZXJyID0gaW52YWxpZF9zdHIocGFyYW0tPnBhdGgsCisJCQkJICh2b2lkICopICgoc2l6ZV90KSBwYXJhbSArIHBhcmFtLT5zaXplKSk7CiAJCWlmIChlcnIpIHsKLQkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKLQkJCQkgICAgY21kKTsKKwkJCUFVVE9GU19XQVJOKAorCQkJICAicGF0aCBzdHJpbmcgdGVybWluYXRvciBtaXNzaW5nIGZvciBjbWQoMHglMDh4KSIsCisJCQkgIGNtZCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWVyciA9IGludmFsaWRfc3RyKHBhcmFtLT5wYXRoLAotCQkJCSAodm9pZCAqKSAoKHNpemVfdCkgcGFyYW0gKyBwYXJhbS0+c2l6ZSkpOworCQllcnIgPSBjaGVja19uYW1lKHBhcmFtLT5wYXRoKTsKIAkJaWYgKGVycikgewogCQkJQVVUT0ZTX1dBUk4oImludmFsaWQgcGF0aCBzdXBwbGllZCBmb3IgY21kKDB4JTA4eCkiLAogCQkJCSAgICBjbWQpOwpAQCAtMTgwLDcgKzE4MSw3IEBACiAJCQkJICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKLQlwYXJhbS0+YXJnMSA9IHNiaS0+dmVyc2lvbjsKKwlwYXJhbS0+cHJvdG92ZXIudmVyc2lvbiA9IHNiaS0+dmVyc2lvbjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg5LDcgKzE5MCw3IEBACiAJCQkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAogCQkJCQlzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSBzYmktPnN1Yl92ZXJzaW9uOworCXBhcmFtLT5wcm90b3N1YnZlci5zdWJfdmVyc2lvbiA9IHNiaS0+c3ViX3ZlcnNpb247CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzNSwxMyArMzM2LDEzIEBACiAJaW50IGVyciwgZmQ7CiAKIAkvKiBwYXJhbS0+cGF0aCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgKi8KLQlpZiAoIXBhcmFtLT5hcmcxKQorCWlmICghcGFyYW0tPm9wZW5tb3VudC5kZXZpZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYXJhbS0+aW9jdGxmZCA9IC0xOwogCiAJcGF0aCA9IHBhcmFtLT5wYXRoOwotCWRldmlkID0gcGFyYW0tPmFyZzE7CisJZGV2aWQgPSBwYXJhbS0+b3Blbm1vdW50LmRldmlkOwogCiAJZXJyID0gMDsKIAlmZCA9IGF1dG9mc19kZXZfaW9jdGxfb3Blbl9tb3VudHBvaW50KHBhdGgsIGRldmlkKTsKQEAgLTM3Myw3ICszNzQsNyBAQAogewogCWF1dG9mc193cXRfdCB0b2tlbjsKIAotCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmFyZzE7CisJdG9rZW4gPSAoYXV0b2ZzX3dxdF90KSBwYXJhbS0+cmVhZHkudG9rZW47CiAJcmV0dXJuIGF1dG9mczRfd2FpdF9yZWxlYXNlKHNiaSwgdG9rZW4sIDApOwogfQogCkBAIC0zODgsOCArMzg5LDggQEAKIAlhdXRvZnNfd3F0X3QgdG9rZW47CiAJaW50IHN0YXR1czsKIAotCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmFyZzE7Ci0Jc3RhdHVzID0gcGFyYW0tPmFyZzIgPyBwYXJhbS0+YXJnMiA6IC1FTk9FTlQ7CisJdG9rZW4gPSAoYXV0b2ZzX3dxdF90KSBwYXJhbS0+ZmFpbC50b2tlbjsKKwlzdGF0dXMgPSBwYXJhbS0+ZmFpbC5zdGF0dXMgPyBwYXJhbS0+ZmFpbC5zdGF0dXMgOiAtRU5PRU5UOwogCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksIHRva2VuLCBzdGF0dXMpOwogfQogCkBAIC00MTIsMTAgKzQxMywxMCBAQAogCWludCBwaXBlZmQ7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAocGFyYW0tPmFyZzEgPT0gLTEpCisJaWYgKHBhcmFtLT5zZXRwaXBlZmQucGlwZWZkID09IC0xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBpcGVmZCA9IHBhcmFtLT5hcmcxOworCXBpcGVmZCA9IHBhcmFtLT5zZXRwaXBlZmQucGlwZWZkOwogCiAJbXV0ZXhfbG9jaygmc2JpLT53cV9tdXRleCk7CiAJaWYgKCFzYmktPmNhdGF0b25pYykgewpAQCAtNDU3LDggKzQ1OCw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0JdGltZW91dCA9IHBhcmFtLT5hcmcxOwotCXBhcmFtLT5hcmcxID0gc2JpLT5leHBfdGltZW91dCAvIEhaOworCXRpbWVvdXQgPSBwYXJhbS0+dGltZW91dC50aW1lb3V0OworCXBhcmFtLT50aW1lb3V0LnRpbWVvdXQgPSBzYmktPmV4cF90aW1lb3V0IC8gSFo7CiAJc2JpLT5leHBfdGltZW91dCA9IHRpbWVvdXQgKiBIWjsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4OSw3ICs0OTAsNyBAQAogCXBhdGggPSBwYXJhbS0+cGF0aDsKIAlkZXZpZCA9IHNiaS0+c2ItPnNfZGV2OwogCi0JcGFyYW0tPmFyZzEgPSBwYXJhbS0+YXJnMiA9IC0xOworCXBhcmFtLT5yZXF1ZXN0ZXIudWlkID0gcGFyYW0tPnJlcXVlc3Rlci5naWQgPSAtMTsKIAogCS8qIEdldCBuYW1laWRhdGEgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgKi8KIAllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOwpAQCAtNTA1LDggKzUwNiw4IEBACiAJCWVyciA9IDA7CiAJCWF1dG9mczRfZXhwaXJlX3dhaXQobmQucGF0aC5kZW50cnkpOwogCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7Ci0JCXBhcmFtLT5hcmcxID0gaW5vLT51aWQ7Ci0JCXBhcmFtLT5hcmcyID0gaW5vLT5naWQ7CisJCXBhcmFtLT5yZXF1ZXN0ZXIudWlkID0gaW5vLT51aWQ7CisJCXBhcmFtLT5yZXF1ZXN0ZXIuZ2lkID0gaW5vLT5naWQ7CiAJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCX0KIApAQCAtNTI5LDEwICs1MzAsMTAgQEAKIAlpbnQgZXJyID0gLUVBR0FJTjsKIAlpbnQgaG93OwogCi0JaG93ID0gcGFyYW0tPmFyZzE7CisJaG93ID0gcGFyYW0tPmV4cGlyZS5ob3c7CiAJbW50ID0gZnAtPmZfcGF0aC5tbnQ7CiAKLQlpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKKwlpZiAoYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpKQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9kaXJlY3Qoc2JpLT5zYiwgbW50LCBzYmksIGhvdyk7CiAJZWxzZQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzYmktPnNiLCBtbnQsIHNiaSwgaG93KTsKQEAgLTU2NSw5ICs1NjYsOSBAQAogCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAogCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKLQlwYXJhbS0+YXJnMSA9IDA7CisJcGFyYW0tPmFza3Vtb3VudC5tYXlfdW1vdW50ID0gMDsKIAlpZiAobWF5X3Vtb3VudChmcC0+Zl9wYXRoLm1udCkpCi0JCXBhcmFtLT5hcmcxID0gMTsKKwkJcGFyYW0tPmFza3Vtb3VudC5tYXlfdW1vdW50ID0gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjAwLDYgKzYwMSw3IEBACiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAljb25zdCBjaGFyICpwYXRoOwogCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBkZXZpZCwgbWFnaWM7CiAJaW50IGVyciA9IC1FTk9FTlQ7CiAKIAlpZiAocGFyYW0tPnNpemUgPD0gc2l6ZW9mKCpwYXJhbSkpIHsKQEAgLTYwOCwxMyArNjEwLDEzIEBACiAJfQogCiAJcGF0aCA9IHBhcmFtLT5wYXRoOwotCXR5cGUgPSBwYXJhbS0+YXJnMTsKKwl0eXBlID0gcGFyYW0tPmlzbW91bnRwb2ludC5pbi50eXBlOwogCi0JcGFyYW0tPmFyZzEgPSAwOwotCXBhcmFtLT5hcmcyID0gMDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5kZXZpZCA9IGRldmlkID0gMDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5tYWdpYyA9IG1hZ2ljID0gMDsKIAogCWlmICghZnAgfHwgcGFyYW0tPmlvY3RsZmQgPT0gLTEpIHsKLQkJaWYgKHR5cGUgPT0gQVVUT0ZTX1RZUEVfQU5ZKSB7CisJCWlmIChhdXRvZnNfdHlwZV9hbnkodHlwZSkpIHsKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAKIAkJCWVyciA9IHBhdGhfbG9va3VwKHBhdGgsIExPT0tVUF9GT0xMT1csICZuZCk7CkBAIC02MjIsNyArNjI0LDcgQEAKIAkJCQlnb3RvIG91dDsKIAogCQkJc2IgPSBuZC5wYXRoLmRlbnRyeS0+ZF9zYjsKLQkJCXBhcmFtLT5hcmcxID0gbmV3X2VuY29kZV9kZXYoc2ItPnNfZGV2KTsKKwkJCWRldmlkID0gbmV3X2VuY29kZV9kZXYoc2ItPnNfZGV2KTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vOwogCkBAIC02MzUsMzggKzYzNyw0MSBAQAogCQkJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAkJCWlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhuZC5wYXRoLmRlbnRyeSk7Ci0JCQlwYXJhbS0+YXJnMSA9IGF1dG9mczRfZ2V0X2Rldihpbm8tPnNiaSk7CisJCQlkZXZpZCA9IGF1dG9mczRfZ2V0X2Rldihpbm8tPnNiaSk7CiAJCX0KIAogCQllcnIgPSAwOwogCQlpZiAobmQucGF0aC5kZW50cnktPmRfaW5vZGUgJiYKIAkJICAgIG5kLnBhdGgubW50LT5tbnRfcm9vdCA9PSBuZC5wYXRoLmRlbnRyeSkgewogCQkJZXJyID0gMTsKLQkJCXBhcmFtLT5hcmcyID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfbWFnaWM7CisJCQltYWdpYyA9IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21hZ2ljOwogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X3QgZGV2aWQgPSBuZXdfZW5jb2RlX2RldihzYmktPnNiLT5zX2Rldik7CisJCWRldl90IGRldiA9IGF1dG9mczRfZ2V0X2RldihzYmkpOwogCiAJCWVyciA9IHBhdGhfbG9va3VwKHBhdGgsIExPT0tVUF9QQVJFTlQsICZuZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQllcnIgPSBhdXRvZnNfZGV2X2lvY3RsX2ZpbmRfc3VwZXIoJm5kLCBkZXZpZCk7CisJCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcigmbmQsIGRldik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9yZWxlYXNlOwogCi0JCXBhcmFtLT5hcmcxID0gYXV0b2ZzNF9nZXRfZGV2KHNiaSk7CisJCWRldmlkID0gZGV2OwogCiAJCWVyciA9IGhhdmVfc3VibW91bnRzKG5kLnBhdGguZGVudHJ5KTsKIAogCQlpZiAobmQucGF0aC5tbnQtPm1udF9tb3VudHBvaW50ICE9IG5kLnBhdGgubW50LT5tbnRfcm9vdCkgewogCQkJaWYgKGZvbGxvd19kb3duKCZuZC5wYXRoLm1udCwgJm5kLnBhdGguZGVudHJ5KSkgewogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQkJCQlwYXJhbS0+YXJnMiA9IGlub2RlLT5pX3NiLT5zX21hZ2ljOworCQkJCW1hZ2ljID0gaW5vZGUtPmlfc2ItPnNfbWFnaWM7CiAJCQl9CiAJCX0KIAl9CiAKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5kZXZpZCA9IGRldmlkOworCXBhcmFtLT5pc21vdW50cG9pbnQub3V0Lm1hZ2ljID0gbWFnaWM7CisKIG91dF9yZWxlYXNlOgogCXBhdGhfcHV0KCZuZC5wYXRoKTsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IDRiNmZiM2YuLmUzYmQ1MDcgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtNjMsNyArNjMsNyBAQAogCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRlbnRyeS0+ZF9zYik7CiAKIAkJLyogVGhpcyBpcyBhbiBhdXRvZnMgc3VibW91bnQsIHdlIGNhbid0IGV4cGlyZSBpdCAqLwotCQlpZiAoc2JpLT50eXBlID09IEFVVE9GU19UWVBFX0lORElSRUNUKQorCQlpZiAoYXV0b2ZzX3R5cGVfaW5kaXJlY3Qoc2JpLT50eXBlKSkKIAkJCWdvdG8gZG9uZTsKIAogCQkvKgpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJaWYgKGFyZyAmJiBnZXRfdXNlcihkb19ub3csIGFyZykpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKIAllbHNlCiAJCWRlbnRyeSA9IGF1dG9mczRfZXhwaXJlX2luZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5vZGUuYyBiL2ZzL2F1dG9mczQvaW5vZGUuYwppbmRleCBjZmMyM2U1Li43MTZlMTJiIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCkBAIC0xOTcsOSArMTk3LDkgQEAKIAlzZXFfcHJpbnRmKG0sICIsbWlucHJvdG89JWQiLCBzYmktPm1pbl9wcm90byk7CiAJc2VxX3ByaW50ZihtLCAiLG1heHByb3RvPSVkIiwgc2JpLT5tYXhfcHJvdG8pOwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX09GRlNFVCkKKwlpZiAoYXV0b2ZzX3R5cGVfb2Zmc2V0KHNiaS0+dHlwZSkpCiAJCXNlcV9wcmludGYobSwgIixvZmZzZXQiKTsKLQllbHNlIGlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9ESVJFQ1QpCisJZWxzZSBpZiAoYXV0b2ZzX3R5cGVfZGlyZWN0KHNiaS0+dHlwZSkpCiAJCXNlcV9wcmludGYobSwgIixkaXJlY3QiKTsKIAllbHNlCiAJCXNlcV9wcmludGYobSwgIixpbmRpcmVjdCIpOwpAQCAtMjg0LDEzICsyODQsMTMgQEAKIAkJCSptYXhwcm90byA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pbmRpcmVjdDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfSU5ESVJFQ1Q7CisJCQlzZXRfYXV0b2ZzX3R5cGVfaW5kaXJlY3QodHlwZSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGlyZWN0OgotCQkJKnR5cGUgPSBBVVRPRlNfVFlQRV9ESVJFQ1Q7CisJCQlzZXRfYXV0b2ZzX3R5cGVfZGlyZWN0KHR5cGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29mZnNldDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCQkJc2V0X2F1dG9mc190eXBlX29mZnNldCh0eXBlKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDE7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAlzYmktPnNiID0gczsKIAlzYmktPnZlcnNpb24gPSAwOwogCXNiaS0+c3ViX3ZlcnNpb24gPSAwOwotCXNiaS0+dHlwZSA9IEFVVE9GU19UWVBFX0lORElSRUNUOworCXNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCgmc2JpLT50eXBlKTsKIAlzYmktPm1pbl9wcm90byA9IDA7CiAJc2JpLT5tYXhfcHJvdG8gPSAwOwogCW11dGV4X2luaXQoJnNiaS0+d3FfbXV0ZXgpOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJfQogCiAJcm9vdF9pbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9yb290X29wZXJhdGlvbnM7Ci0Jcm9vdF9pbm9kZS0+aV9vcCA9IHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIgPworCXJvb3RfaW5vZGUtPmlfb3AgPSBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkgPwogCQkJJmF1dG9mczRfZGlyZWN0X3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA6CiAJCQkmYXV0b2ZzNF9pbmRpcmVjdF9yb290X2lub2RlX29wZXJhdGlvbnM7CiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvd2FpdHEuYyBiL2ZzL2F1dG9mczQvd2FpdHEuYwppbmRleCBlMDJjYzhhLi5lZWIyNDY4IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3dhaXRxLmMKKysrIGIvZnMvYXV0b2ZzNC93YWl0cS5jCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJICogaXMgdmVyeSBzaW1pbGFyIGZvciBpbmRpcmVjdCBtb3VudHMgZXhjZXB0IG9ubHkgZGVudHJ5cwogCQkgKiBpbiB0aGUgcm9vdCBvZiB0aGUgYXV0b2ZzIGZpbGUgc3lzdGVtIG1heSBiZSBuZWdhdGl2ZS4KIAkJICovCi0JCWlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKQorCQlpZiAoYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpKQogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCWVsc2UgaWYgKCFJU19ST09UKGRlbnRyeS0+ZF9wYXJlbnQpKQogCQkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBJZiB0aGlzIGlzIGEgZGlyZWN0IG1vdW50IHJlcXVlc3QgY3JlYXRlIGEgZHVtbXkgbmFtZSAqLwotCWlmIChJU19ST09UKGRlbnRyeSkgJiYgc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKKwlpZiAoSVNfUk9PVChkZW50cnkpICYmIGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJcXN0ci5sZW4gPSBzcHJpbnRmKG5hbWUsICIlcCIsIGRlbnRyeSk7CiAJZWxzZSB7CiAJCXFzdHIubGVuID0gYXV0b2ZzNF9nZXRwYXRoKHNiaSwgZGVudHJ5LCAmbmFtZSk7CkBAIC00MDYsMTEgKzQwNiwxMSBAQAogCQkJCXR5cGUgPSBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpOwogCQl9IGVsc2UgewogCQkJaWYgKG5vdGlmeSA9PSBORllfTU9VTlQpCi0JCQkJdHlwZSA9IChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKSA/CisJCQkJdHlwZSA9IGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSA/CiAJCQkJCWF1dG9mc19wdHlwZV9taXNzaW5nX2RpcmVjdCA6CiAJCQkJCSBhdXRvZnNfcHR5cGVfbWlzc2luZ19pbmRpcmVjdDsKIAkJCWVsc2UKLQkJCQl0eXBlID0gKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpID8KKwkJCQl0eXBlID0gYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpID8KIAkJCQkJYXV0b2ZzX3B0eXBlX2V4cGlyZV9kaXJlY3QgOgogCQkJCQlhdXRvZnNfcHR5cGVfZXhwaXJlX2luZGlyZWN0OwogCQl9CmRpZmYgLS1naXQgYS9mcy9iZnMvaW5vZGUuYyBiL2ZzL2Jmcy9pbm9kZS5jCmluZGV4IDBlZDU3YjUuLmNjNDA2MmQgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9pbm9kZS5jCisrKyBiL2ZzL2Jmcy9pbm9kZS5jCkBAIC0yMTMsNiArMjEzLDkgQEAKIHsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm8gPSBCRlNfU0Iocyk7CiAKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKwogCWJyZWxzZShpbmZvLT5zaV9zYmgpOwogCW11dGV4X2Rlc3Ryb3koJmluZm8tPmJmc19sb2NrKTsKIAlrZnJlZShpbmZvLT5zaV9pbWFwKTsKQEAgLTMyNyw2ICszMzAsNyBAQAogCXVuc2lnbmVkIGksIGltYXBfbGVuOwogCXN0cnVjdCBiZnNfc2JfaW5mbyAqaW5mbzsKIAlsb25nIHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBpX3NibG9jaywgaV9lYmxvY2ssIGlfZW9mZiwgc19zaXplOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQpAQCAtMzUwLDYgKzM1NCwxMiBAQAogCiAJcy0+c19tYWdpYyA9IEJGU19NQUdJQzsKIAlpbmZvLT5zaV9zYmggPSBiaDsKKworCWlmIChsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpID4gbGUzMl90b19jcHUoYmZzX3NiLT5zX2VuZCkpIHsKKwkJcHJpbnRmKCJTdXBlcmJsb2NrIGlzIGNvcnJ1cHRlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwogCWluZm8tPnNpX2xhc3RpID0gKGxlMzJfdG9fY3B1KGJmc19zYi0+c19zdGFydCkgLSBCRlNfQlNJWkUpIC8KIAkJCQkJc2l6ZW9mKHN0cnVjdCBiZnNfaW5vZGUpCiAJCQkJCSsgQkZTX1JPT1RfSU5PIC0gMTsKQEAgLTM4MCw2ICszOTAsMTggQEAKIAkJCS0gbGUzMl90b19jcHUoYmZzX3NiLT5zX3N0YXJ0KSkgPj4gQkZTX0JTSVpFX0JJVFM7CiAJaW5mby0+c2lfZnJlZWkgPSAwOwogCWluZm8tPnNpX2xmX2VibGsgPSAwOworCisJLyogY2FuIHdlIHJlYWQgdGhlIGxhc3QgYmxvY2s/ICovCisJYmggPSBzYl9icmVhZChzLCBpbmZvLT5zaV9ibG9ja3MgLSAxKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ZigiTGFzdCBibG9jayBub3QgYXZhaWxhYmxlOiAlbHVcbiIsIGluZm8tPnNpX2Jsb2NrcyAtIDEpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0ID0gLUVJTzsKKwkJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CisJCWdvdG8gb3V0OworCX0KKwlicmVsc2UoYmgpOworCiAJYmggPSBOVUxMOwogCWZvciAoaSA9IEJGU19ST09UX0lOTzsgaSA8PSBpbmZvLT5zaV9sYXN0aTsgaSsrKSB7CiAJCXN0cnVjdCBiZnNfaW5vZGUgKmRpOwpAQCAtMzk3LDYgKzQxOSwyOSBAQAogCiAJCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOwogCisJCS8qIHRlc3QgaWYgZmlsZXN5c3RlbSBpcyBub3QgY29ycnVwdGVkICovCisKKwkJaV9lb2ZmID0gbGUzMl90b19jcHUoZGktPmlfZW9mZnNldCk7CisJCWlfc2Jsb2NrID0gbGUzMl90b19jcHUoZGktPmlfc2Jsb2NrKTsKKwkJaV9lYmxvY2sgPSBsZTMyX3RvX2NwdShkaS0+aV9lYmxvY2spOworCQlzX3NpemUgPSBsZTMyX3RvX2NwdShiZnNfc2ItPnNfZW5kKTsKKworCQlpZiAoaV9zYmxvY2sgPiBpbmZvLT5zaV9ibG9ja3MgfHwKKwkJCWlfZWJsb2NrID4gaW5mby0+c2lfYmxvY2tzIHx8CisJCQlpX3NibG9jayA+IGlfZWJsb2NrIHx8CisJCQlpX2VvZmYgPiBzX3NpemUgfHwKKwkJCWlfc2Jsb2NrICogQkZTX0JTSVpFID4gaV9lb2ZmKSB7CisKKwkJCXByaW50ZigiSW5vZGUgMHglMDh4IGNvcnJ1cHRlZFxuIiwgaSk7CisKKwkJCWJyZWxzZShiaCk7CisJCQlzLT5zX3Jvb3QgPSBOVUxMOworCQkJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CisJCQlrZnJlZShpbmZvKTsKKwkJCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCiAJCWlmICghZGktPmlfaW5vKSB7CiAJCQlpbmZvLT5zaV9mcmVlaSsrOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwppbmRleCBlMTE1OGNiLi5jNGU4MzUzIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfbWlzYy5jCisrKyBiL2ZzL2JpbmZtdF9taXNjLmMKQEAgLTY0OSw3ICs2NDksNyBAQAogc3RhdGljIHNzaXplX3QKIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JY2hhciAqcyA9IGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiOworCWNoYXIgKnMgPSBlbmFibGVkID8gImVuYWJsZWRcbiIgOiAiZGlzYWJsZWRcbiI7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7CiB9CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDM0OWEyNmMuLmI5NTc3MTcgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCiAvKioKICAqIGxvb2t1cF9iZGV2ICAtIGxvb2t1cCBhIHN0cnVjdCBibG9ja19kZXZpY2UgYnkgbmFtZQotICogQHBhdGg6CXNwZWNpYWwgZmlsZSByZXByZXNlbnRpbmcgdGhlIGJsb2NrIGRldmljZQorICogQHBhdGhuYW1lOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKICAqCiAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGJsb2NrZGV2aWNlIGF0IEBwYXRobmFtZSBpbiB0aGUgY3VycmVudAogICogbmFtZXNwYWNlIGlmIHBvc3NpYmxlIGFuZCByZXR1cm4gaXQuICBSZXR1cm4gRVJSX1BUUihlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggYTEzZjA5Yi4uYzI2ZGE3OCAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTIwMjIsNyArMjAyMiw2IEBACiAJCQlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKIAkJCQl2bXRydW5jYXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKIAkJfQotCQlnb3RvIG91dDsKIAl9CiAKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCmluZGV4IDcwMDY5N2EuLjM4ZjcxMjIgMTAwNjQ0Ci0tLSBhL2ZzL2NoYXJfZGV2LmMKKysrIGIvZnMvY2hhcl9kZXYuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJY2QtPm1ham9yID0gbWFqb3I7CiAJY2QtPmJhc2VtaW5vciA9IGJhc2VtaW5vcjsKIAljZC0+bWlub3JjdCA9IG1pbm9yY3Q7Ci0Jc3RybmNweShjZC0+bmFtZSxuYW1lLCA2NCk7CisJc3RybGNweShjZC0+bmFtZSwgbmFtZSwgc2l6ZW9mKGNkLT5uYW1lKSk7CiAKIAlpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOwogCmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IGQxZWNlNzkuLjMwZjJmYWEgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xMTg3LDYgKzExODcsOSBAQAogCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoUkVBRCwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOwogCiBvdXQ6CisJaWYgKHJldCA+IDApCisJCWFkZF9yY2hhcihjdXJyZW50LCByZXQpOworCWluY19zeXNjcihjdXJyZW50KTsKIAlmcHV0KGZpbGUpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMjEwLDYgKzEyMTMsOSBAQAogCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoV1JJVEUsIGZpbGUsIHZlYywgdmxlbiwgJmZpbGUtPmZfcG9zKTsKIAogb3V0OgorCWlmIChyZXQgPiAwKQorCQlhZGRfd2NoYXIoY3VycmVudCwgcmV0KTsKKwlpbmNfc3lzY3coY3VycmVudCk7CiAJZnB1dChmaWxlKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwppbmRleCBhZjA1NThkLi5iNmQ0MzkwIDEwMDY0NAotLS0gYS9mcy9kaXJlY3QtaW8uYworKysgYi9mcy9kaXJlY3QtaW8uYwpAQCAtMTIwOSw2ICsxMjA5LDE5IEBACiAJcmV0dmFsID0gZGlyZWN0X2lvX3dvcmtlcihydywgaW9jYiwgaW5vZGUsIGlvdiwgb2Zmc2V0LAogCQkJCW5yX3NlZ3MsIGJsa2JpdHMsIGdldF9ibG9jaywgZW5kX2lvLCBkaW8pOwogCisJLyoKKwkgKiBJbiBjYXNlIG9mIGVycm9yIGV4dGVuZGluZyB3cml0ZSBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcKKwkgKiBibG9ja3Mgb3V0c2lkZSBpX3NpemUuIFRyaW0gdGhlc2Ugb2ZmIGFnYWluIGZvciBESU9fTE9DS0lORy4KKwkgKiBOT1RFOiBESU9fTk9fTE9DSy9ESU9fT1dOX0xPQ0sgY2FsbGVycyBoYXZlIHRvIGhhbmRsZSB0aGlzIGJ5CisJICogaXQncyBvd24gbWVhbmVyLgorCSAqLworCWlmICh1bmxpa2VseShyZXR2YWwgPCAwICYmIChydyAmIFdSSVRFKSkpIHsKKwkJbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCisJCWlmIChlbmQgPiBpc2l6ZSAmJiBkaW9fbG9ja190eXBlID09IERJT19MT0NLSU5HKQorCQkJdm10cnVuY2F0ZShpbm9kZSwgaXNpemUpOworCX0KKwogCWlmIChydyA9PSBSRUFEICYmIGRpb19sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCiAJCXJlbGVhc2VfaV9tdXRleCA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKaW5kZXggNjA0NjIzOS4uYzAxZTA0MyAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKKysrIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKQEAgLTE3NSw4ICsxNzUsOCBAQAogICoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvbiBlcnJvci4KICAqLwotc3RhdGljIGludCBlY3J5cHRmc19kZXJpdmVfaXYoY2hhciAqaXYsIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJICAgICAgbG9mZl90IG9mZnNldCkKK2ludCBlY3J5cHRmc19kZXJpdmVfaXYoY2hhciAqaXYsIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkgICAgICAgbG9mZl90IG9mZnNldCkKIHsKIAlpbnQgcmMgPSAwOwogCWNoYXIgZHN0W01ENV9ESUdFU1RfU0laRV07CkBAIC05MjQsNiArOTI0LDE1IEBACiAJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSOwogCWlmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQpCiAJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX1ZJRVdfQVNfRU5DUllQVEVEOworCWlmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykgeworCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19FTkNSWVBUX0ZJTEVOQU1FUzsKKwkJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCSAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSykKKwkJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLOworCQllbHNlIGlmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9GRUspCisJCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19FTkNGTl9VU0VfRkVLOworCX0KIH0KIAogc3RhdGljIGludCBlY3J5cHRmc19jb3B5X21vdW50X3dpZGVfc2lnc190b19pbm9kZV9zaWdzKApAQCAtMTA2MCw3ICsxMDY5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgZWNyeXB0ZnNfZmxhZ19tYXBfZWxlbSBlY3J5cHRmc19mbGFnX21hcFtdID0gewogCXsweDAwMDAwMDAxLCBFQ1JZUFRGU19FTkFCTEVfSE1BQ30sCiAJezB4MDAwMDAwMDIsIEVDUllQVEZTX0VOQ1JZUFRFRH0sCi0JezB4MDAwMDAwMDQsIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSfQorCXsweDAwMDAwMDA0LCBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUn0sCisJezB4MDAwMDAwMDgsIEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTfQogfTsKIAogLyoqCkBAIC0xMTQ5LDE5ICsxMTU5LDIwIEBACiAKIC8qKgogICogZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZwotICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdG9ncmFwaGljIGNvbnRleHQKKyAqIEBjaXBoZXJfbmFtZTogVGhlIHN0cmluZyBhbGlhcyBmb3IgdGhlIGNpcGhlcgorICogQGtleV9ieXRlczogTGVuZ3RoIG9mIGtleSBpbiBieXRlczsgdXNlZCBmb3IgQUVTIGNvZGUgc2VsZWN0aW9uCiAgKgogICogUmV0dXJucyB6ZXJvIG9uIG5vIG1hdGNoLCBvciB0aGUgY2lwaGVyIGNvZGUgb24gbWF0Y2gKICAqLwotdTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCkKK3U4IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoY2hhciAqY2lwaGVyX25hbWUsIHNpemVfdCBrZXlfYnl0ZXMpCiB7CiAJaW50IGk7CiAJdTggY29kZSA9IDA7CiAJc3RydWN0IGVjcnlwdGZzX2NpcGhlcl9jb2RlX3N0cl9tYXBfZWxlbSAqbWFwID0KIAkJZWNyeXB0ZnNfY2lwaGVyX2NvZGVfc3RyX21hcDsKIAotCWlmIChzdHJjbXAoY3J5cHRfc3RhdC0+Y2lwaGVyLCAiYWVzIikgPT0gMCkgewotCQlzd2l0Y2ggKGNyeXB0X3N0YXQtPmtleV9zaXplKSB7CisJaWYgKHN0cmNtcChjaXBoZXJfbmFtZSwgImFlcyIpID09IDApIHsKKwkJc3dpdGNoIChrZXlfYnl0ZXMpIHsKIAkJY2FzZSAxNjoKIAkJCWNvZGUgPSBSRkMyNDQwX0NJUEhFUl9BRVNfMTI4OwogCQkJYnJlYWs7CkBAIC0xMTczLDcgKzExODQsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWNyeXB0ZnNfY2lwaGVyX2NvZGVfc3RyX21hcCk7IGkrKykKLQkJCWlmIChzdHJjbXAoY3J5cHRfc3RhdC0+Y2lwaGVyLCBtYXBbaV0uY2lwaGVyX3N0cikgPT0gMCl7CisJCQlpZiAoc3RyY21wKGNpcGhlcl9uYW1lLCBtYXBbaV0uY2lwaGVyX3N0cikgPT0gMCkgewogCQkJCWNvZGUgPSBtYXBbaV0uY2lwaGVyX2NvZGU7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMjEyLDYgKzEyMjMsOCBAQAogCQkmKGVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZWNyeXB0ZnNfaW5vZGUpLT5jcnlwdF9zdGF0KTsKIAlpbnQgcmM7CiAKKwlpZiAoY3J5cHRfc3RhdC0+ZXh0ZW50X3NpemUgPT0gMCkKKwkJY3J5cHRfc3RhdC0+ZXh0ZW50X3NpemUgPSBFQ1JZUFRGU19ERUZBVUxUX0VYVEVOVF9TSVpFOwogCXJjID0gZWNyeXB0ZnNfcmVhZF9sb3dlcihkYXRhLCAwLCBjcnlwdF9zdGF0LT5leHRlbnRfc2l6ZSwKIAkJCQkgZWNyeXB0ZnNfaW5vZGUpOwogCWlmIChyYykgewpAQCAtMTIyMSw3ICsxMjM0LDYgQEAKIAl9CiAJaWYgKCFjb250YWluc19lY3J5cHRmc19tYXJrZXIoZGF0YSArIEVDUllQVEZTX0ZJTEVfU0laRV9CWVRFUykpIHsKIAkJcmMgPSAtRUlOVkFMOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIlZhbGlkIG1hcmtlciBub3QgZm91bmRcbiIpOwogCX0KIG91dDoKIAlyZXR1cm4gcmM7CkBAIC0xNjI4LDk1ICsxNjQwLDk1IEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lIC0gY29udmVydHMgYSBwbGFpbnRleHQgZmlsZSBuYW1lIHRvIGNpcGhlciB0ZXh0Ci0gKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0X3N0YXQgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBhbmVtIHRvIGVuY29kZQotICogQG5hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQotICogQGxlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0Ci0gKiBAZW5jb2RlZF9uYW1lOiBUaGUgZW5jeXB0ZWQgbmFtZQorICogZWNyeXB0ZnNfZW5jcnlwdF9maWxlbmFtZSAtIGVuY3J5cHQgZmlsZW5hbWUKICAqCi0gKiBFbmNyeXB0cyBhbmQgZW5jb2RlcyBhIGZpbGVuYW1lIGludG8gc29tZXRoaW5nIHRoYXQgY29uc3RpdHV0ZXMgYQotICogdmFsaWQgZmlsZW5hbWUgZm9yIGEgZmlsZXN5c3RlbSwgd2l0aCBwcmludGFibGUgY2hhcmFjdGVycy4KKyAqIENCQy1lbmNyeXB0cyB0aGUgZmlsZW5hbWUuIFdlIGRvIG5vdCB3YW50IHRvIGVuY3J5cHQgdGhlIHNhbWUKKyAqIGZpbGVuYW1lIHdpdGggdGhlIHNhbWUga2V5IGFuZCBJViwgd2hpY2ggbWF5IGhhcHBlbiB3aXRoIGhhcmQKKyAqIGxpbmtzLCBzbyB3ZSBwcmVwZW5kIHJhbmRvbSBiaXRzIHRvIGVhY2ggZmlsZW5hbWUuCiAgKgotICogV2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhIHByb3Blcmx5IGluaXRpYWxpemVkIGNyeXB0byBjb250ZXh0LAotICogcG9pbnRlZCB0byBieSBjcnlwdF9zdGF0LT50Zm0uCi0gKgotICogVE9ETzogSW1wbGVtZW50IGZpbGVuYW1lIGRlY29kaW5nIGFuZCBkZWNyeXB0aW9uIGhlcmUsIGluIHBsYWNlIG9mCi0gKiBtZW1jcHkuIFdlIGFyZSBrZWVwaW5nIHRoZSBmcmFtZXdvcmsgYXJvdW5kIGZvciBub3cgdG8gKDEpCi0gKiBmYWNpbGl0YXRlIHRlc3Rpbmcgb2YgdGhlIGNvbXBvbmVudHMgbmVlZGVkIHRvIGltcGxlbWVudCBmaWxlbmFtZQotICogZW5jcnlwdGlvbiBhbmQgKDIpIHRvIHByb3ZpZGUgYSBjb2RlIGJhc2UgZnJvbSB3aGljaCBvdGhlcgotICogZGV2ZWxvcGVycyBpbiB0aGUgY29tbXVuaXR5IGNhbiBlYXNpbHkgaW1wbGVtZW50IHRoaXMgZmVhdHVyZS4KLSAqCi0gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgZW5jb2RlZCBmaWxlbmFtZTsgbmVnYXRpdmUgaWYgZXJyb3IKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKICAqLwotaW50Ci1lY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwgY2hhciAqKmVuY29kZWRfbmFtZSkKK3N0YXRpYyBpbnQKK2VjcnlwdGZzX2VuY3J5cHRfZmlsZW5hbWUoc3RydWN0IGVjcnlwdGZzX2ZpbGVuYW1lICpmaWxlbmFtZSwKKwkJCSAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCQkgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0KQogewotCWludCBlcnJvciA9IDA7CisJaW50IHJjID0gMDsKIAotCSgqZW5jb2RlZF9uYW1lKSA9IGttYWxsb2MobGVuZ3RoICsgMiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoKmVuY29kZWRfbmFtZSkpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOworCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUgPSBOVUxMOworCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSA9IDA7CisJaWYgKChjcnlwdF9zdGF0ICYmIChjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkKKwkgICAgfHwgKG1vdW50X2NyeXB0X3N0YXQgJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSykpKSB7CisJCXNpemVfdCBwYWNrZXRfc2l6ZTsKKwkJc2l6ZV90IHJlbWFpbmluZ19ieXRlczsKKworCQlyYyA9IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoCisJCQlOVUxMLCBOVUxMLAorCQkJJmZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSwKKwkJCW1vdW50X2NyeXB0X3N0YXQsIE5VTEwsCisJCQlmaWxlbmFtZS0+ZmlsZW5hbWVfc2l6ZSk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBnZXQgcGFja2V0ICIKKwkJCSAgICAgICAic2l6ZSBmb3IgdGFnIDcyOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHJjKTsKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lID0KKwkJCWttYWxsb2MoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga21hbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlbWFpbmluZ19ieXRlcyA9IGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZTsKKwkJcmMgPSBlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0KGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUsCisJCQkJCQkgICZyZW1haW5pbmdfYnl0ZXMsCisJCQkJCQkgICZwYWNrZXRfc2l6ZSwKKwkJCQkJCSAgbW91bnRfY3J5cHRfc3RhdCwKKwkJCQkJCSAgZmlsZW5hbWUtPmZpbGVuYW1lLAorCQkJCQkJICBmaWxlbmFtZS0+ZmlsZW5hbWVfc2l6ZSk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSAiCisJCQkgICAgICAgInRhZyA3MCBwYWNrZXQ7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgcmMpOworCQkJa2ZyZWUoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSk7CisJCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lID0gTlVMTDsKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUgPSBwYWNrZXRfc2l6ZTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBzdXBwb3J0IGZvciByZXF1ZXN0ZWQgZmlsZW5hbWUgIgorCQkgICAgICAgImVuY3J5cHRpb24gbWV0aG9kIGluIHRoaXMgcmVsZWFzZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQotCS8qIFRPRE86IEZpbGVuYW1lIGVuY3J5cHRpb24gaXMgYSBzY2hlZHVsZWQgZmVhdHVyZSBmb3IgYQotCSAqIGZ1dHVyZSB2ZXJzaW9uIG9mIGVDcnlwdGZzLiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgb25seSBmb3IKLQkgKiB0aGUgcHVycG9zZSBvZiBwcm92aWRpbmcgYSBmcmFtZXdvcmsgZm9yIG90aGVyIGRldmVsb3BlcnMKLQkgKiB0byBlYXNpbHkgaW1wbGVtZW50IGZpbGVuYW1lIGVuY3J5cHRpb24uIEhpbnQ6IFJlcGxhY2UgdGhpcwotCSAqIG1lbWNweSgpIHdpdGggYSBjYWxsIHRvIGVuY3J5cHQgYW5kIGVuY29kZSB0aGUKLQkgKiBmaWxlbmFtZSwgdGhlIHNldCB0aGUgbGVuZ3RoIGFjY29yZGluZ2x5LiAqLwotCW1lbWNweSgodm9pZCAqKSgqZW5jb2RlZF9uYW1lKSwgKHZvaWQgKiluYW1lLCBsZW5ndGgpOwotCSgqZW5jb2RlZF9uYW1lKVtsZW5ndGhdID0gJ1wwJzsKLQllcnJvciA9IGxlbmd0aCArIDE7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiByYzsKIH0KIAotLyoqCi0gKiBlY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUgLSBjb252ZXJ0cyB0aGUgY2lwaGVyIHRleHQgbmFtZSB0byBwbGFpbnRleHQKLSAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRfc3RhdCBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCi0gKiBAbmFtZTogVGhlIGZpbGVuYW1lIGluIGNpcGhlciB0ZXh0Ci0gKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBjaXBoZXIgdGV4dCBuYW1lCi0gKiBAZGVjcnlwdGVkX25hbWU6IFRoZSBwbGFpbnRleHQgbmFtZQotICoKLSAqIERlY29kZXMgYW5kIGRlY3J5cHRzIHRoZSBmaWxlbmFtZS4KLSAqCi0gKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY3J5cHRvIGNvbnRleHQsCi0gKiBwb2ludGVkIHRvIGJ5IGNyeXB0X3N0YXQtPnRmbS4KLSAqCi0gKiBUT0RPOiBJbXBsZW1lbnQgZmlsZW5hbWUgZGVjb2RpbmcgYW5kIGRlY3J5cHRpb24gaGVyZSwgaW4gcGxhY2Ugb2YKLSAqIG1lbWNweS4gV2UgYXJlIGtlZXBpbmcgdGhlIGZyYW1ld29yayBhcm91bmQgZm9yIG5vdyB0byAoMSkKLSAqIGZhY2lsaXRhdGUgdGVzdGluZyBvZiB0aGUgY29tcG9uZW50cyBuZWVkZWQgdG8gaW1wbGVtZW50IGZpbGVuYW1lCi0gKiBlbmNyeXB0aW9uIGFuZCAoMikgdG8gcHJvdmlkZSBhIGNvZGUgYmFzZSBmcm9tIHdoaWNoIG90aGVyCi0gKiBkZXZlbG9wZXJzIGluIHRoZSBjb21tdW5pdHkgY2FuIGVhc2lseSBpbXBsZW1lbnQgdGhpcyBmZWF0dXJlLgotICoKLSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiBkZWNvZGVkIGZpbGVuYW1lOyBuZWdhdGl2ZSBpZiBlcnJvcgotICovCi1pbnQKLWVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBjaGFyICoqZGVjcnlwdGVkX25hbWUpCitzdGF0aWMgaW50IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUoY2hhciAqKmNvcGllZF9uYW1lLCBzaXplX3QgKmNvcGllZF9uYW1lX3NpemUsCisJCQkJICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKQogewotCWludCBlcnJvciA9IDA7CisJaW50IHJjID0gMDsKIAotCSgqZGVjcnlwdGVkX25hbWUpID0ga21hbGxvYyhsZW5ndGggKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoISgqZGVjcnlwdGVkX25hbWUpKSB7Ci0JCWVycm9yID0gLUVOT01FTTsKKwkoKmNvcGllZF9uYW1lKSA9IGttYWxsb2MoKG5hbWVfc2l6ZSArIDIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISgqY29waWVkX25hbWUpKSB7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCS8qIFRPRE86IEZpbGVuYW1lIGVuY3J5cHRpb24gaXMgYSBzY2hlZHVsZWQgZmVhdHVyZSBmb3IgYQotCSAqIGZ1dHVyZSB2ZXJzaW9uIG9mIGVDcnlwdGZzLiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgb25seSBmb3IKLQkgKiB0aGUgcHVycG9zZSBvZiBwcm92aWRpbmcgYSBmcmFtZXdvcmsgZm9yIG90aGVyIGRldmVsb3BlcnMKLQkgKiB0byBlYXNpbHkgaW1wbGVtZW50IGZpbGVuYW1lIGVuY3J5cHRpb24uIEhpbnQ6IFJlcGxhY2UgdGhpcwotCSAqIG1lbWNweSgpIHdpdGggYSBjYWxsIHRvIGRlY29kZSBhbmQgZGVjcnlwdCB0aGUKLQkgKiBmaWxlbmFtZSwgdGhlIHNldCB0aGUgbGVuZ3RoIGFjY29yZGluZ2x5LiAqLwotCW1lbWNweSgodm9pZCAqKSgqZGVjcnlwdGVkX25hbWUpLCAodm9pZCAqKW5hbWUsIGxlbmd0aCk7Ci0JKCpkZWNyeXB0ZWRfbmFtZSlbbGVuZ3RoICsgMV0gPSAnXDAnOwkvKiBPbmx5IGZvciBjb252ZW5pZW5jZQorCW1lbWNweSgodm9pZCAqKSgqY29waWVkX25hbWUpLCAodm9pZCAqKW5hbWUsIG5hbWVfc2l6ZSk7CisJKCpjb3BpZWRfbmFtZSlbKG5hbWVfc2l6ZSldID0gJ1wwJzsJLyogT25seSBmb3IgY29udmVuaWVuY2UKIAkJCQkJCSAqIGluIHByaW50aW5nIG91dCB0aGUKIAkJCQkJCSAqIHN0cmluZyBpbiBkZWJ1ZwogCQkJCQkJICogbWVzc2FnZXMgKi8KLQllcnJvciA9IGxlbmd0aDsKKwkoKmNvcGllZF9uYW1lX3NpemUpID0gKG5hbWVfc2l6ZSArIDEpOwogb3V0OgotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMTc0MCw3ICsxNzUyLDcgQEAKIAkqa2V5X3RmbSA9IE5VTEw7CiAJaWYgKCprZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9LRVlfQllURVMpIHsKIAkJcmMgPSAtRUlOVkFMOwotCQlwcmludGsoS0VSTl9FUlIgIlJlcXVlc3RlZCBrZXkgc2l6ZSBpcyBbJVpkXSBieXRlczsgbWF4aW11bSAiCisJCXByaW50ayhLRVJOX0VSUiAiUmVxdWVzdGVkIGtleSBzaXplIGlzIFslemRdIGJ5dGVzOyBtYXhpbXVtICIKIAkJICAgICAgImFsbG93YWJsZSBpcyBbJWRdXG4iLCAqa2V5X3NpemUsIEVDUllQVEZTX01BWF9LRVlfQllURVMpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNzY1LDcgKzE3NzcsNyBAQAogCWdldF9yYW5kb21fYnl0ZXMoZHVtbXlfa2V5LCAqa2V5X3NpemUpOwogCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoKmtleV90Zm0sIGR1bW15X2tleSwgKmtleV9zaXplKTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIHNldCBrZXkgb2Ygc2l6ZSBbJVpkXSBmb3IgIgorCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gc2V0IGtleSBvZiBzaXplIFslemRdIGZvciAiCiAJCSAgICAgICAiY2lwaGVyIFslc107IHJjID0gWyVkXVxuIiwgKmtleV9zaXplLCBjaXBoZXJfbmFtZSwgcmMpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMTkxMCwzICsxOTIyLDM0MSBAQAogCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CisKKy8qIDY0IGNoYXJhY3RlcnMgZm9ybWluZyBhIDYtYml0IHRhcmdldCBmaWVsZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzID0gKCItLjAxMjM0NTY3ODlBQkNEIgorCQkJCQkJICJFRkdISUpLTE1OT1BRUlNUIgorCQkJCQkJICJVVldYWVphYmNkZWZnaGlqIgorCQkJCQkJICJrbG1ub3BxcnN0dXZ3eHl6Iik7CisKKy8qIFdlIGNvdWxkIGVpdGhlciBvZmZzZXQgb24gZXZlcnkgcmV2ZXJzZSBtYXAgb3IganVzdCBwYWQgc29tZSAweDAwJ3MKKyAqIGF0IHRoZSBmcm9udCBoZXJlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmaWxlbmFtZV9yZXZfbWFwW10gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDE1ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAzMSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDM5ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgLyogNDcgKi8KKwkweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAvKiA1NSAqLworCTB4MEEsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDYzICovCisJMHgwMCwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwgMHgxMCwgMHgxMSwgMHgxMiwgLyogNzEgKi8KKwkweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAvKiA3OSAqLworCTB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIC8qIDg3ICovCisJMHgyMywgMHgyNCwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogOTUgKi8KKwkweDAwLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAvKiAxMDMgKi8KKwkweDJELCAweDJFLCAweDJGLCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAvKiAxMTEgKi8KKwkweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDNDLCAvKiAxMTkgKi8KKwkweDNELCAweDNFLCAweDNGCit9OworCisvKioKKyAqIGVjcnlwdGZzX2VuY29kZV9mb3JfZmlsZW5hbWUKKyAqIEBkc3Q6IERlc3RpbmF0aW9uIGxvY2F0aW9uIGZvciBlbmNvZGVkIGZpbGVuYW1lCisgKiBAZHN0X3NpemU6IFNpemUgb2YgdGhlIGVuY29kZWQgZmlsZW5hbWUgaW4gYnl0ZXMKKyAqIEBzcmM6IFNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGZpbGVuYW1lIHRvIGVuY29kZQorICogQHNyY19zaXplOiBTaXplIG9mIHRoZSBzb3VyY2UgaW4gYnl0ZXMKKyAqLwordm9pZCBlY3J5cHRmc19lbmNvZGVfZm9yX2ZpbGVuYW1lKHVuc2lnbmVkIGNoYXIgKmRzdCwgc2l6ZV90ICpkc3Rfc2l6ZSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnNyYywgc2l6ZV90IHNyY19zaXplKQoreworCXNpemVfdCBudW1fYmxvY2tzOworCXNpemVfdCBibG9ja19udW0gPSAwOworCXNpemVfdCBkc3Rfb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfYmxvY2tbM107CisKKwlpZiAoc3JjX3NpemUgPT0gMCkgeworCQkoKmRzdF9zaXplKSA9IDA7CisJCWdvdG8gb3V0OworCX0KKwludW1fYmxvY2tzID0gKHNyY19zaXplIC8gMyk7CisJaWYgKChzcmNfc2l6ZSAlIDMpID09IDApIHsKKwkJbWVtY3B5KGxhc3RfYmxvY2ssICgmc3JjW3NyY19zaXplIC0gM10pLCAzKTsKKwl9IGVsc2UgeworCQludW1fYmxvY2tzKys7CisJCWxhc3RfYmxvY2tbMl0gPSAweDAwOworCQlzd2l0Y2ggKHNyY19zaXplICUgMykgeworCQljYXNlIDE6CisJCQlsYXN0X2Jsb2NrWzBdID0gc3JjW3NyY19zaXplIC0gMV07CisJCQlsYXN0X2Jsb2NrWzFdID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlsYXN0X2Jsb2NrWzBdID0gc3JjW3NyY19zaXplIC0gMl07CisJCQlsYXN0X2Jsb2NrWzFdID0gc3JjW3NyY19zaXplIC0gMV07CisJCX0KKwl9CisJKCpkc3Rfc2l6ZSkgPSAobnVtX2Jsb2NrcyAqIDQpOworCWlmICghZHN0KQorCQlnb3RvIG91dDsKKwl3aGlsZSAoYmxvY2tfbnVtIDwgbnVtX2Jsb2NrcykgeworCQl1bnNpZ25lZCBjaGFyICpzcmNfYmxvY2s7CisJCXVuc2lnbmVkIGNoYXIgZHN0X2Jsb2NrWzRdOworCisJCWlmIChibG9ja19udW0gPT0gKG51bV9ibG9ja3MgLSAxKSkKKwkJCXNyY19ibG9jayA9IGxhc3RfYmxvY2s7CisJCWVsc2UKKwkJCXNyY19ibG9jayA9ICZzcmNbYmxvY2tfbnVtICogM107CisJCWRzdF9ibG9ja1swXSA9ICgoc3JjX2Jsb2NrWzBdID4+IDIpICYgMHgzRik7CisJCWRzdF9ibG9ja1sxXSA9ICgoKHNyY19ibG9ja1swXSA8PCA0KSAmIDB4MzApCisJCQkJfCAoKHNyY19ibG9ja1sxXSA+PiA0KSAmIDB4MEYpKTsKKwkJZHN0X2Jsb2NrWzJdID0gKCgoc3JjX2Jsb2NrWzFdIDw8IDIpICYgMHgzQykKKwkJCQl8ICgoc3JjX2Jsb2NrWzJdID4+IDYpICYgMHgwMykpOworCQlkc3RfYmxvY2tbM10gPSAoc3JjX2Jsb2NrWzJdICYgMHgzRik7CisJCWRzdFtkc3Rfb2Zmc2V0KytdID0gcG9ydGFibGVfZmlsZW5hbWVfY2hhcnNbZHN0X2Jsb2NrWzBdXTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbMV1dOworCQlkc3RbZHN0X29mZnNldCsrXSA9IHBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzW2RzdF9ibG9ja1syXV07CisJCWRzdFtkc3Rfb2Zmc2V0KytdID0gcG9ydGFibGVfZmlsZW5hbWVfY2hhcnNbZHN0X2Jsb2NrWzNdXTsKKwkJYmxvY2tfbnVtKys7CisJfQorb3V0OgorCXJldHVybjsKK30KKworLyoqCisgKiBlY3J5cHRmc19kZWNvZGVfZnJvbV9maWxlbmFtZQorICogQGRzdDogSWYgTlVMTCwgdGhpcyBmdW5jdGlvbiBvbmx5IHNldHMgQGRzdF9zaXplIGFuZCByZXR1cm5zLiBJZgorICogICAgICAgbm9uLU5VTEwsIHRoaXMgZnVuY3Rpb24gZGVjb2RlcyB0aGUgZW5jb2RlZCBvY3RldHMgaW4gQHNyYworICogICAgICAgaW50byB0aGUgbWVtb3J5IHRoYXQgQGRzdCBwb2ludHMgdG8uCisgKiBAZHN0X3NpemU6IFNldCB0byB0aGUgc2l6ZSBvZiB0aGUgZGVjb2RlZCBzdHJpbmcuCisgKiBAc3JjOiBUaGUgZW5jb2RlZCBzZXQgb2Ygb2N0ZXRzIHRvIGRlY29kZS4KKyAqIEBzcmNfc2l6ZTogVGhlIHNpemUgb2YgdGhlIGVuY29kZWQgc2V0IG9mIG9jdGV0cyB0byBkZWNvZGUuCisgKi8KK3N0YXRpYyB2b2lkCitlY3J5cHRmc19kZWNvZGVfZnJvbV9maWxlbmFtZSh1bnNpZ25lZCBjaGFyICpkc3QsIHNpemVfdCAqZHN0X3NpemUsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBzcmNfc2l6ZSkKK3sKKwl1OCBjdXJyZW50X2JpdF9vZmZzZXQgPSAwOworCXNpemVfdCBzcmNfYnl0ZV9vZmZzZXQgPSAwOworCXNpemVfdCBkc3RfYnl0ZV9vZmZzZXQgPSAwOworCisJaWYgKGRzdCA9PSBOVUxMKSB7CisJCS8qIE5vdCBleGFjdDsgY29uc2VydmF0aXZlbHkgbG9uZy4gRXZlcnkgYmxvY2sgb2YgNAorCQkgKiBlbmNvZGVkIGNoYXJhY3RlcnMgZGVjb2RlcyBpbnRvIGEgYmxvY2sgb2YgMworCQkgKiBkZWNvZGVkIGNoYXJhY3RlcnMuIFRoaXMgc2VnbWVudCBvZiBjb2RlIHByb3ZpZGVzCisJCSAqIHRoZSBjYWxsZXIgd2l0aCB0aGUgbWF4aW11bSBhbW91bnQgb2YgYWxsb2NhdGVkCisJCSAqIHNwYWNlIHRoYXQgQGRzdCB3aWxsIG5lZWQgdG8gcG9pbnQgdG8gaW4gYQorCQkgKiBzdWJzZXF1ZW50IGNhbGwuICovCisJCSgqZHN0X3NpemUpID0gKCgoc3JjX3NpemUgKyAxKSAqIDMpIC8gNCk7CisJCWdvdG8gb3V0OworCX0KKwl3aGlsZSAoc3JjX2J5dGVfb2Zmc2V0IDwgc3JjX3NpemUpIHsKKwkJdW5zaWduZWQgY2hhciBzcmNfYnl0ZSA9CisJCQkJZmlsZW5hbWVfcmV2X21hcFsoaW50KXNyY1tzcmNfYnl0ZV9vZmZzZXRdXTsKKworCQlzd2l0Y2ggKGN1cnJlbnRfYml0X29mZnNldCkgeworCQljYXNlIDA6CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0XSA9IChzcmNfYnl0ZSA8PCAyKTsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDY7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJZHN0W2RzdF9ieXRlX29mZnNldCsrXSB8PSAoc3JjX2J5dGUgPj4gNCk7CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0XSA9ICgoc3JjX2J5dGUgJiAweEYpCisJCQkJCQkgPDwgNCk7CisJCQljdXJyZW50X2JpdF9vZmZzZXQgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXQrK10gfD0gKHNyY19ieXRlID4+IDIpOworCQkJZHN0W2RzdF9ieXRlX29mZnNldF0gPSAoc3JjX2J5dGUgPDwgNik7CisJCQljdXJyZW50X2JpdF9vZmZzZXQgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXQrK10gfD0gKHNyY19ieXRlKTsKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gMDsKKwkJCWN1cnJlbnRfYml0X29mZnNldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlzcmNfYnl0ZV9vZmZzZXQrKzsKKwl9CisJKCpkc3Rfc2l6ZSkgPSBkc3RfYnl0ZV9vZmZzZXQ7CitvdXQ6CisJcmV0dXJuOworfQorCisvKioKKyAqIGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSAtIGNvbnZlcnRzIGEgcGxhaW50ZXh0IGZpbGUgbmFtZSB0byBjaXBoZXIgdGV4dAorICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdF9zdGF0IHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgYW5lbSB0byBlbmNvZGUKKyAqIEBuYW1lOiBUaGUgcGxhaW50ZXh0IG5hbWUKKyAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dAorICogQGVuY29kZWRfbmFtZTogVGhlIGVuY3lwdGVkIG5hbWUKKyAqCisgKiBFbmNyeXB0cyBhbmQgZW5jb2RlcyBhIGZpbGVuYW1lIGludG8gc29tZXRoaW5nIHRoYXQgY29uc3RpdHV0ZXMgYQorICogdmFsaWQgZmlsZW5hbWUgZm9yIGEgZmlsZXN5c3RlbSwgd2l0aCBwcmludGFibGUgY2hhcmFjdGVycy4KKyAqCisgKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQgY3J5cHRvIGNvbnRleHQsCisgKiBwb2ludGVkIHRvIGJ5IGNyeXB0X3N0YXQtPnRmbS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb24gb3RoZXJ3aXNlCisgKi8KK2ludCBlY3J5cHRmc19lbmNyeXB0X2FuZF9lbmNvZGVfZmlsZW5hbWUoCisJY2hhciAqKmVuY29kZWRfbmFtZSwKKwlzaXplX3QgKmVuY29kZWRfbmFtZV9zaXplLAorCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpCit7CisJc2l6ZV90IGVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZTsKKwlpbnQgcmMgPSAwOworCisJKCplbmNvZGVkX25hbWUpID0gTlVMTDsKKwkoKmVuY29kZWRfbmFtZV9zaXplKSA9IDA7CisJaWYgKChjcnlwdF9zdGF0ICYmIChjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTKSkKKwkgICAgfHwgKG1vdW50X2NyeXB0X3N0YXQgJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykpKSB7CisJCXN0cnVjdCBlY3J5cHRmc19maWxlbmFtZSAqZmlsZW5hbWU7CisKKwkJZmlsZW5hbWUgPSBremFsbG9jKHNpemVvZigqZmlsZW5hbWUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmaWxlbmFtZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCisJCQkgICAgICAgInRvIGt6YWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHNpemVvZigqZmlsZW5hbWUpKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVuYW1lLT5maWxlbmFtZSA9IChjaGFyICopbmFtZTsKKwkJZmlsZW5hbWUtPmZpbGVuYW1lX3NpemUgPSBuYW1lX3NpemU7CisJCXJjID0gZWNyeXB0ZnNfZW5jcnlwdF9maWxlbmFtZShmaWxlbmFtZSwgY3J5cHRfc3RhdCwKKwkJCQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZW5jcnlwdCAiCisJCQkgICAgICAgImZpbGVuYW1lOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCQlrZnJlZShmaWxlbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQllY3J5cHRmc19lbmNvZGVfZm9yX2ZpbGVuYW1lKAorCQkJTlVMTCwgJmVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZSwKKwkJCWZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUsCisJCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUpOworCQlpZiAoKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICYgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUspKQorCQkgICAgfHwgKG1vdW50X2NyeXB0X3N0YXQKKwkJCSYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJICAgICYgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkpCisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSA9CisJCQkJKEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFCisJCQkJICsgZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplKTsKKwkJZWxzZQorCQkJKCplbmNvZGVkX25hbWVfc2l6ZSkgPQorCQkJCShFQ1JZUFRGU19GRUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFCisJCQkJICsgZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplKTsKKwkJKCplbmNvZGVkX25hbWUpID0ga21hbGxvYygoKmVuY29kZWRfbmFtZV9zaXplKSArIDEsIEdGUF9LRVJORUwpOworCQlpZiAoISgqZW5jb2RlZF9uYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCisJCQkgICAgICAgInRvIGt6YWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkJICAgICAgICgqZW5jb2RlZF9uYW1lX3NpemUpKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWtmcmVlKGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUpOworCQkJa2ZyZWUoZmlsZW5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKChjcnlwdF9zdGF0ICYmIChjcnlwdF9zdGF0LT5mbGFncworCQkJCSAgICAmIEVDUllQVEZTX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkKKwkJICAgIHx8IChtb3VudF9jcnlwdF9zdGF0CisJCQkmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCSAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSykpKSB7CisJCQltZW1jcHkoKCplbmNvZGVkX25hbWUpLAorCQkJICAgICAgIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWCwKKwkJCSAgICAgICBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSk7CisJCQllY3J5cHRmc19lbmNvZGVfZm9yX2ZpbGVuYW1lKAorCQkJICAgICgoKmVuY29kZWRfbmFtZSkKKwkJCSAgICAgKyBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSksCisJCQkgICAgJmVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZSwKKwkJCSAgICBmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lLAorCQkJICAgIGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSk7CisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSA9CisJCQkJKEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFCisJCQkJICsgZW5jb2RlZF9uYW1lX25vX3ByZWZpeF9zaXplKTsKKwkJCSgqZW5jb2RlZF9uYW1lKVsoKmVuY29kZWRfbmFtZV9zaXplKV0gPSAnXDAnOworCQkJKCplbmNvZGVkX25hbWVfc2l6ZSkrKzsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVOT1RTVVBQOworCQl9CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNvZGUgIgorCQkJICAgICAgICJlbmNyeXB0ZWQgZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgcmMpOworCQkJa2ZyZWUoKCplbmNvZGVkX25hbWUpKTsKKwkJCSgqZW5jb2RlZF9uYW1lKSA9IE5VTEw7CisJCQkoKmVuY29kZWRfbmFtZV9zaXplKSA9IDA7CisJCX0KKwkJa2ZyZWUoZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSk7CisJCWtmcmVlKGZpbGVuYW1lKTsKKwl9IGVsc2UgeworCQlyYyA9IGVjcnlwdGZzX2NvcHlfZmlsZW5hbWUoZW5jb2RlZF9uYW1lLAorCQkJCQkgICAgZW5jb2RlZF9uYW1lX3NpemUsCisJCQkJCSAgICBuYW1lLCBuYW1lX3NpemUpOworCX0KK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lIC0gY29udmVydHMgdGhlIGVuY29kZWQgY2lwaGVyIHRleHQgbmFtZSB0byBkZWNvZGVkIHBsYWludGV4dAorICogQHBsYWludGV4dF9uYW1lOiBUaGUgcGxhaW50ZXh0IG5hbWUKKyAqIEBwbGFpbnRleHRfbmFtZV9zaXplOiBUaGUgcGxhaW50ZXh0IG5hbWUgc2l6ZQorICogQGVjcnlwdGZzX2Rpcl9kZW50cnk6IGVDcnlwdGZzIGRpcmVjdG9yeSBkZW50cnkKKyAqIEBuYW1lOiBUaGUgZmlsZW5hbWUgaW4gY2lwaGVyIHRleHQKKyAqIEBuYW1lX3NpemU6IFRoZSBjaXBoZXIgdGV4dCBuYW1lIHNpemUKKyAqCisgKiBEZWNyeXB0cyBhbmQgZGVjb2RlcyB0aGUgZmlsZW5hbWUuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIGVycm9yOyBub24temVybyBvdGhlcndpc2UKKyAqLworaW50IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZShjaGFyICoqcGxhaW50ZXh0X25hbWUsCisJCQkJCSBzaXplX3QgKnBsYWludGV4dF9uYW1lX3NpemUsCisJCQkJCSBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kaXJfZGVudHJ5LAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSkKK3sKKwljaGFyICpkZWNvZGVkX25hbWU7CisJc2l6ZV90IGRlY29kZWRfbmFtZV9zaXplOworCXNpemVfdCBwYWNrZXRfc2l6ZTsKKwlpbnQgcmMgPSAwOworCisJaWYgKChuYW1lX3NpemUgPiBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSkKKwkgICAgJiYgKHN0cm5jbXAobmFtZSwgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYLAorCQkJRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUpID09IDApKSB7CisJCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0KKwkJCSZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCisJCQkJZWNyeXB0ZnNfZGlyX2RlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CisJCWNvbnN0IGNoYXIgKm9yaWdfbmFtZSA9IG5hbWU7CisJCXNpemVfdCBvcmlnX25hbWVfc2l6ZSA9IG5hbWVfc2l6ZTsKKworCQluYW1lICs9IEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFOworCQluYW1lX3NpemUgLT0gRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkU7CisJCWVjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lKE5VTEwsICZkZWNvZGVkX25hbWVfc2l6ZSwKKwkJCQkJICAgICAgbmFtZSwgbmFtZV9zaXplKTsKKwkJZGVjb2RlZF9uYW1lID0ga21hbGxvYyhkZWNvZGVkX25hbWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGVjb2RlZF9uYW1lKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nICIKKwkJCSAgICAgICAidG8ga21hbGxvYyBbJXpkXSBieXRlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgZGVjb2RlZF9uYW1lX3NpemUpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWNyeXB0ZnNfZGVjb2RlX2Zyb21fZmlsZW5hbWUoZGVjb2RlZF9uYW1lLCAmZGVjb2RlZF9uYW1lX3NpemUsCisJCQkJCSAgICAgIG5hbWUsIG5hbWVfc2l6ZSk7CisJCXJjID0gZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldChwbGFpbnRleHRfbmFtZSwKKwkJCQkJCSAgcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJCSAgJnBhY2tldF9zaXplLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LAorCQkJCQkJICBkZWNvZGVkX25hbWUsCisJCQkJCQkgIGRlY29kZWRfbmFtZV9zaXplKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bGQgbm90IHBhcnNlIHRhZyA3MCBwYWNrZXQgIgorCQkJICAgICAgICJmcm9tIGZpbGVuYW1lOyBjb3B5aW5nIHRocm91Z2ggZmlsZW5hbWUgIgorCQkJICAgICAgICJhcy1pc1xuIiwgX19mdW5jX18pOworCQkJcmMgPSBlY3J5cHRmc19jb3B5X2ZpbGVuYW1lKHBsYWludGV4dF9uYW1lLAorCQkJCQkJICAgIHBsYWludGV4dF9uYW1lX3NpemUsCisJCQkJCQkgICAgb3JpZ19uYW1lLCBvcmlnX25hbWVfc2l6ZSk7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBlY3J5cHRmc19jb3B5X2ZpbGVuYW1lKHBsYWludGV4dF9uYW1lLAorCQkJCQkgICAgcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJICAgIG5hbWUsIG5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0OworCX0KK291dF9mcmVlOgorCWtmcmVlKGRlY29kZWRfbmFtZSk7CitvdXQ6CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmggYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAppbmRleCBhNzUwMjZkLi5jMTFmYzk1IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAorKysgYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaApAQCAtNTEsMTIgKzUxLDE2IEBACiAjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfWEFUVFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19NVUxUS0VZICAgICAgICAgICAgICAgMHgwMDAwMDAyMAogI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX0RFVk1JU0MgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfSE1BQyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19GSUxFTkFNRV9FTkNSWVBUSU9OICAgMHgwMDAwMDEwMAorI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX0dDTSAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCiAjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfTUFTSyAoRUNSWVBURlNfVkVSU0lPTklOR19QQVNTUEhSQVNFIFwKIAkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19QTEFJTlRFWFRfUEFTU1RIUk9VR0ggXAogCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX1BVQktFWSBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfWEFUVFIgXAogCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX01VTFRLRVkgXAotCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX0RFVk1JU0MpCisJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfREVWTUlTQyBcCisJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfRklMRU5BTUVfRU5DUllQVElPTikKICNkZWZpbmUgRUNSWVBURlNfTUFYX1BBU1NXT1JEX0xFTkdUSCA2NAogI2RlZmluZSBFQ1JZUFRGU19NQVhfUEFTU1BIUkFTRV9CWVRFUyBFQ1JZUFRGU19NQVhfUEFTU1dPUkRfTEVOR1RICiAjZGVmaW5lIEVDUllQVEZTX1NBTFRfU0laRSA4CkBAIC0xOTksNiArMjAzLDcgQEAKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9DSVBIRVIgImFlcyIKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9LRVlfQllURVMgMTYKICNkZWZpbmUgRUNSWVBURlNfREVGQVVMVF9IQVNIICJtZDUiCisjZGVmaW5lIEVDUllQVEZTX1RBR183MF9ESUdFU1QgRUNSWVBURlNfREVGQVVMVF9IQVNICiAjZGVmaW5lIEVDUllQVEZTX1RBR18xX1BBQ0tFVF9UWVBFIDB4MDEKICNkZWZpbmUgRUNSWVBURlNfVEFHXzNfUEFDS0VUX1RZUEUgMHg4QwogI2RlZmluZSBFQ1JZUFRGU19UQUdfMTFfUEFDS0VUX1RZUEUgMHhFRApAQCAtMjA2LDMwICsyMTEsNjQgQEAKICNkZWZpbmUgRUNSWVBURlNfVEFHXzY1X1BBQ0tFVF9UWVBFIDB4NDEKICNkZWZpbmUgRUNSWVBURlNfVEFHXzY2X1BBQ0tFVF9UWVBFIDB4NDIKICNkZWZpbmUgRUNSWVBURlNfVEFHXzY3X1BBQ0tFVF9UWVBFIDB4NDMKKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcwX1BBQ0tFVF9UWVBFIDB4NDYgLyogRk5FSy1lbmNyeXB0ZWQgZmlsZW5hbWUKKwkJCQkJICAqIGFzIGRlbnRyeSBuYW1lICovCisjZGVmaW5lIEVDUllQVEZTX1RBR183MV9QQUNLRVRfVFlQRSAweDQ3IC8qIEZORUstZW5jcnlwdGVkIGZpbGVuYW1lIGluCisJCQkJCSAgKiBtZXRhZGF0YSAqLworI2RlZmluZSBFQ1JZUFRGU19UQUdfNzJfUEFDS0VUX1RZUEUgMHg0OCAvKiBGRUstZW5jcnlwdGVkIGZpbGVuYW1lIGFzCisJCQkJCSAgKiBkZW50cnkgbmFtZSAqLworI2RlZmluZSBFQ1JZUFRGU19UQUdfNzNfUEFDS0VUX1RZUEUgMHg0OSAvKiBGRUstZW5jcnlwdGVkIGZpbGVuYW1lIGFzCisJCQkJCSAgKiBtZXRhZGF0YSAqLworLyogQ29uc3RyYWludDogRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTID49CisgKiBFQ1JZUFRGU19NQVhfSVZfQllURVMgKi8KKyNkZWZpbmUgRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTIDE2CisjZGVmaW5lIEVDUllQVEZTX05PTl9OVUxMIDB4NDIgLyogQSByZWFzb25hYmxlIHN1YnN0aXR1dGUgZm9yIE5VTEwgKi8KICNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFIDE2CisjZGVmaW5lIEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSBNRDVfRElHRVNUX1NJWkUKKyNkZWZpbmUgRUNSWVBURlNfRkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVggIkVDUllQVEZTX0ZFS19FTkNSWVBURUQuIgorI2RlZmluZSBFQ1JZUFRGU19GRUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFIDIzCisjZGVmaW5lIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWCAiRUNSWVBURlNfRk5FS19FTkNSWVBURUQuIgorI2RlZmluZSBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSAyNAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURURfREVOVFJZX05BTUVfTEVOICgxOCArIDEgKyA0ICsgMSArIDMyKQogCiBzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3NpZyB7CiAJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9zdGF0X2xpc3Q7CiAJY2hhciBrZXlzaWdbRUNSWVBURlNfU0lHX1NJWkVfSEVYXTsKIH07CiAKK3N0cnVjdCBlY3J5cHRmc19maWxlbmFtZSB7CisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9zdGF0X2xpc3Q7CisjZGVmaW5lIEVDUllQVEZTX0ZJTEVOQU1FX0NPTlRBSU5TX0RFQ1JZUFRFRCAweDAwMDAwMDAxCisJdTMyIGZsYWdzOworCXUzMiBzZXFfbm87CisJY2hhciAqZmlsZW5hbWU7CisJY2hhciAqZW5jcnlwdGVkX2ZpbGVuYW1lOworCXNpemVfdCBmaWxlbmFtZV9zaXplOworCXNpemVfdCBlbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZTsKKwljaGFyIGZuZWtfc2lnW0VDUllQVEZTX1NJR19TSVpFX0hFWF07CisJY2hhciBkZW50cnlfbmFtZVtFQ1JZUFRGU19FTkNSWVBURURfREVOVFJZX05BTUVfTEVOICsgMV07Cit9OworCiAvKioKICAqIFRoaXMgaXMgdGhlIHByaW1hcnkgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCBlYWNoIGVuY3J5cHRlZCBmaWxlLgogICoKICAqIFRPRE86IGNhY2hlIGFsaWduL3BhY2s/CiAgKi8KIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0IHsKLSNkZWZpbmUgRUNSWVBURlNfU1RSVUNUX0lOSVRJQUxJWkVEIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUNSWVBURlNfUE9MSUNZX0FQUExJRUQgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUNSWVBURlNfTkVXX0ZJTEUgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUNSWVBURlNfRU5DUllQVEVEICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUNSWVBURlNfU0VDVVJJVFlfV0FSTklORyAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUNSWVBURlNfRU5BQkxFX0hNQUMgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUNSWVBURlNfRU5DUllQVF9JVl9QQUdFUyAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUNSWVBURlNfS0VZX1ZBTElEICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFIgIDB4MDAwMDAxMDAKLSNkZWZpbmUgRUNSWVBURlNfVklFV19BU19FTkNSWVBURUQgIDB4MDAwMDAyMDAKLSNkZWZpbmUgRUNSWVBURlNfS0VZX1NFVCAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRUNSWVBURlNfU1RSVUNUX0lOSVRJQUxJWkVEICAgMHgwMDAwMDAwMQorI2RlZmluZSBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVDUllQVEZTX05FV19GSUxFICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUNSWVBURlNfRU5DUllQVEVEICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFQ1JZUFRGU19TRUNVUklUWV9XQVJOSU5HICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVDUllQVEZTX0VOQUJMRV9ITUFDICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUNSWVBURlNfRU5DUllQVF9JVl9QQUdFUyAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFQ1JZUFRGU19LRVlfVkFMSUQgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRUNSWVBURlNfVklFV19BU19FTkNSWVBURUQgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFQ1JZUFRGU19LRVlfU0VUICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRfRklMRU5BTUVTICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRUNSWVBURlNfRU5DRk5fVVNFX01PVU5UX0ZORUsgMHgwMDAwMTAwMAorI2RlZmluZSBFQ1JZUFRGU19FTkNGTl9VU0VfRkVLICAgICAgICAweDAwMDAyMDAwCiAJdTMyIGZsYWdzOwogCXVuc2lnbmVkIGludCBmaWxlX3ZlcnNpb247CiAJc2l6ZV90IGl2X2J5dGVzOwpAQCAtMzMyLDEzICszNzEsMjAgQEAKICNkZWZpbmUgRUNSWVBURlNfWEFUVFJfTUVUQURBVEFfRU5BQkxFRCAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBURURfVklFV19FTkFCTEVEICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lIEVDUllQVEZTX01PVU5UX0NSWVBUX1NUQVRfSU5JVElBTElaRUQgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUsgICAweDAwMDAwMDIwCisjZGVmaW5lIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfRkVLICAgICAgICAgIDB4MDAwMDAwNDAKIAl1MzIgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCBnbG9iYWxfYXV0aF90b2tfbGlzdDsKIAlzdHJ1Y3QgbXV0ZXggZ2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXg7CiAJc2l6ZV90IG51bV9nbG9iYWxfYXV0aF90b2tzOwogCXNpemVfdCBnbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemU7CisJc2l6ZV90IGdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXM7CiAJdW5zaWduZWQgY2hhciBnbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZVtFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRQogCQkJCQkJICsgMV07CisJdW5zaWduZWQgY2hhciBnbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZVsKKwkJRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUgKyAxXTsKKwljaGFyIGdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnW0VDUllQVEZTX1NJR19TSVpFX0hFWCArIDFdOwogfTsKIAogLyogc3VwZXJibG9jayBwcml2YXRlIGRhdGEuICovCkBAIC01NzEsMTMgKzYxNywyMiBAQAogaW50IGVjcnlwdGZzX2ludGVycG9zZShzdHJ1Y3QgZGVudHJ5ICpoaWRkZW5fZGVudHJ5LAogCQkgICAgICAgc3RydWN0IGRlbnRyeSAqdGhpc19kZW50cnksIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCSAgICAgICB1MzIgZmxhZ3MpOworaW50IGVjcnlwdGZzX2xvb2t1cF9hbmRfaW50ZXJwb3NlX2xvd2VyKHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJCQkJc3RydWN0IGlub2RlICplY3J5cHRmc19kaXJfaW5vZGUsCisJCQkJCXN0cnVjdCBuYW1laWRhdGEgKmVjcnlwdGZzX25kKTsKK2ludCBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUoY2hhciAqKmRlY3J5cHRlZF9uYW1lLAorCQkJCQkgc2l6ZV90ICpkZWNyeXB0ZWRfbmFtZV9zaXplLAorCQkJCQkgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5LAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSk7CiBpbnQgZWNyeXB0ZnNfZmlsbF96ZXJvcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG5ld19sZW5ndGgpOwotaW50IGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwKLQkJCSAgICAgY2hhciAqKmRlY3J5cHRlZF9uYW1lKTsKLWludCBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsCi0JCQkgICAgIGNoYXIgKiplbmNvZGVkX25hbWUpOworaW50IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgKKwljaGFyICoqZW5jb2RlZF9uYW1lLAorCXNpemVfdCAqZW5jb2RlZF9uYW1lX3NpemUsCisJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSk7CiBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19sb3dlcl9kZW50cnkoc3RydWN0IGRlbnRyeSAqdGhpc19kZW50cnkpOwogdm9pZCBlY3J5cHRmc19kdW1wX2hleChjaGFyICpkYXRhLCBpbnQgYnl0ZXMpOwogaW50IHZpcnRfdG9fc2NhdHRlcmxpc3QoY29uc3Qgdm9pZCAqYWRkciwgaW50IHNpemUsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCkBAIC01OTksNyArNjU0LDcgQEAKIAkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2lub2RlKTsKIGludCBlY3J5cHRmc19yZWFkX2FuZF92YWxpZGF0ZV94YXR0cl9yZWdpb24oY2hhciAqcGFnZV92aXJ0LAogCQkJCQkgICAgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5KTsKLXU4IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpOwordTggZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9ieXRlcyk7CiBpbnQgZWNyeXB0ZnNfY2lwaGVyX2NvZGVfdG9fc3RyaW5nKGNoYXIgKnN0ciwgdTggY2lwaGVyX2NvZGUpOwogdm9pZCBlY3J5cHRmc19zZXRfZGVmYXVsdF9zaXplcyhzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCk7CiBpbnQgZWNyeXB0ZnNfZ2VuZXJhdGVfa2V5X3BhY2tldF9zZXQoY2hhciAqZGVzdF9iYXNlLApAQCAtNjk0LDUgKzc0OSwxNyBAQAogCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udCwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQpOwogaW50IGVjcnlwdGZzX2luaXRfcGVyc2lzdGVudF9maWxlKHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSk7CitpbnQKK2VjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoY2hhciAqZGVzdCwgc2l6ZV90ICpyZW1haW5pbmdfYnl0ZXMsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lX3NpemUpOworaW50CitlY3J5cHRmc19wYXJzZV90YWdfNzBfcGFja2V0KGNoYXIgKipmaWxlbmFtZSwgc2l6ZV90ICpmaWxlbmFtZV9zaXplLAorCQkJICAgICBzaXplX3QgKnBhY2tldF9zaXplLAorCQkJICAgICBzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwkJCSAgICAgY2hhciAqZGF0YSwgc2l6ZV90IG1heF9wYWNrZXRfc2l6ZSk7CitpbnQgZWNyeXB0ZnNfZGVyaXZlX2l2KGNoYXIgKml2LCBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJICAgICAgIGxvZmZfdCBvZmZzZXQpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBFQ1JZUFRGU19LRVJORUxfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZmlsZS5jIGIvZnMvZWNyeXB0ZnMvZmlsZS5jCmluZGV4IDcxMzgzNDMuLjllOTQ0MDUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2ZpbGUuYworKysgYi9mcy9lY3J5cHRmcy9maWxlLmMKQEAgLTc3LDI3ICs3NywyNyBAQAogCiAvKiBJbnNwaXJlZCBieSBnZW5lcmljIGZpbGxkaXIgaW4gZnMvcmVhZGRpci5jICovCiBzdGF0aWMgaW50Ci1lY3J5cHRmc19maWxsZGlyKHZvaWQgKmRpcmVudCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGxvZmZfdCBvZmZzZXQsCi0JCSB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorZWNyeXB0ZnNfZmlsbGRpcih2b2lkICpkaXJlbnQsIGNvbnN0IGNoYXIgKmxvd2VyX25hbWUsIGludCBsb3dlcl9uYW1lbGVuLAorCQkgbG9mZl90IG9mZnNldCwgdTY0IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfZ2V0ZGVudHNfY2FsbGJhY2sgKmJ1ZiA9CiAJICAgIChzdHJ1Y3QgZWNyeXB0ZnNfZ2V0ZGVudHNfY2FsbGJhY2sgKilkaXJlbnQ7CisJc2l6ZV90IG5hbWVfc2l6ZTsKKwljaGFyICpuYW1lOwogCWludCByYzsKLQlpbnQgZGVjb2RlZF9sZW5ndGg7Ci0JY2hhciAqZGVjb2RlZF9uYW1lOwogCi0JY3J5cHRfc3RhdCA9IGVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKGJ1Zi0+ZGVudHJ5KS0+Y3J5cHRfc3RhdDsKIAlidWYtPmZpbGxkaXJfY2FsbGVkKys7Ci0JZGVjb2RlZF9sZW5ndGggPSBlY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwgbmFtZSwgbmFtZWxlbiwKLQkJCQkJCSAgJmRlY29kZWRfbmFtZSk7Ci0JaWYgKGRlY29kZWRfbGVuZ3RoIDwgMCkgewotCQlyYyA9IGRlY29kZWRfbGVuZ3RoOworCXJjID0gZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKCZuYW1lLCAmbmFtZV9zaXplLAorCQkJCQkJICBidWYtPmRlbnRyeSwgbG93ZXJfbmFtZSwKKwkJCQkJCSAgbG93ZXJfbmFtZWxlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZGVjb2RlIGFuZCBkZWNyeXB0ICIKKwkJICAgICAgICJmaWxlbmFtZSBbJXNdOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLCBsb3dlcl9uYW1lLAorCQkgICAgICAgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBidWYtPmZpbGxkaXIoYnVmLT5kaXJlbnQsIGRlY29kZWRfbmFtZSwgZGVjb2RlZF9sZW5ndGgsIG9mZnNldCwKLQkJCSAgaW5vLCBkX3R5cGUpOwotCWtmcmVlKGRlY29kZWRfbmFtZSk7CisJcmMgPSBidWYtPmZpbGxkaXIoYnVmLT5kaXJlbnQsIG5hbWUsIG5hbWVfc2l6ZSwgb2Zmc2V0LCBpbm8sIGRfdHlwZSk7CisJa2ZyZWUobmFtZSk7CiAJaWYgKHJjID49IDApCiAJCWJ1Zi0+ZW50cmllc193cml0dGVuKys7CiBvdXQ6CkBAIC0xMDYsOCArMTA2LDggQEAKIAogLyoqCiAgKiBlY3J5cHRmc19yZWFkZGlyCi0gKiBAZmlsZTogVGhlIGVjcnlwdGZzIGZpbGUgc3RydWN0Ci0gKiBAZGlyZW50OiBEaXJlY3RvcnkgZW50cnkKKyAqIEBmaWxlOiBUaGUgZUNyeXB0ZnMgZGlyZWN0b3J5IGZpbGUKKyAqIEBkaXJlbnQ6IERpcmVjdG9yeSBlbnRyeSBoYW5kbGUKICAqIEBmaWxsZGlyOiBUaGUgZmlsbGRpciBjYWxsYmFjayBmdW5jdGlvbgogICovCiBzdGF0aWMgaW50IGVjcnlwdGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCAwMTExOTA2Li41Njk3ODk5IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTUyLDggKzUyLDcgQEAKIC8qKgogICogZWNyeXB0ZnNfY3JlYXRlX3VuZGVybHlpbmdfZmlsZQogICogQGxvd2VyX2Rpcl9pbm9kZTogaW5vZGUgb2YgdGhlIHBhcmVudCBpbiB0aGUgbG93ZXIgZnMgb2YgdGhlIG5ldyBmaWxlCi0gKiBAbG93ZXJfZGVudHJ5OiBOZXcgZmlsZSdzIGRlbnRyeSBpbiB0aGUgbG93ZXIgZnMKLSAqIEBlY3J5cHRmc19kZW50cnk6IE5ldyBmaWxlJ3MgZGVudHJ5IGluIGVjcnlwdGZzCisgKiBAZGVudHJ5OiBOZXcgZmlsZSdzIGRlbnRyeQogICogQG1vZGU6IFRoZSBtb2RlIG9mIHRoZSBuZXcgZmlsZQogICogQG5kOiBuYW1laWRhdGEgb2YgZWNyeXB0ZnMnIHBhcmVudCdzIGRlbnRyeSAmIHZmc21vdW50CiAgKgpAQCAtMjI4LDggKzIyNyw3IEBACiB7CiAJaW50IHJjOwogCi0JLyogZWNyeXB0ZnNfZG9fY3JlYXRlKCkgY2FsbHMgZWNyeXB0ZnNfaW50ZXJwb3NlKCksIHdoaWNoIG9wZW5zCi0JICogdGhlIGNyeXB0X3N0YXQtPmxvd2VyX2ZpbGUgKHBlcnNpc3RlbnQgZmlsZSkgKi8KKwkvKiBlY3J5cHRmc19kb19jcmVhdGUoKSBjYWxscyBlY3J5cHRmc19pbnRlcnBvc2UoKSAqLwogCXJjID0gZWNyeXB0ZnNfZG9fY3JlYXRlKGRpcmVjdG9yeV9pbm9kZSwgZWNyeXB0ZnNfZGVudHJ5LCBtb2RlLCBuZCk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIGluIgpAQCAtMjQ0LDE0MSArMjQyLDkxIEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfbG9va3VwCi0gKiBAZGlyOiBpbm9kZQotICogQGRlbnRyeTogVGhlIGRlbnRyeQotICogQG5kOiBuYW1laWRhdGEsIG1heSBiZSBOVUxMCi0gKgotICogRmluZCBhIGZpbGUgb24gZGlzay4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gd2UnbGwgYWRkIGl0IHRvIHRoZQotICogZGVudHJ5IGNhY2hlIGFuZCBjb250aW51ZSBvbiB0byByZWFkIGl0IGZyb20gdGhlIGRpc2suCisgKiBlY3J5cHRmc19sb29rdXBfYW5kX2ludGVycG9zZV9sb3dlciAtIFBlcmZvcm0gYSBsb29rdXAKICAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoraW50IGVjcnlwdGZzX2xvb2t1cF9hbmRfaW50ZXJwb3NlX2xvd2VyKHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJCQkJc3RydWN0IGlub2RlICplY3J5cHRmc19kaXJfaW5vZGUsCisJCQkJCXN0cnVjdCBuYW1laWRhdGEgKmVjcnlwdGZzX25kKQogewotCWludCByYyA9IDA7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKLQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7Ci0JY2hhciAqZW5jb2RlZF9uYW1lOwotCWludCBlbmNvZGVkX25hbWVsZW47Ci0Jc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqbG93ZXJfaW5vZGU7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQ7CiAJY2hhciAqcGFnZV92aXJ0ID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlOwogCXU2NCBmaWxlX3NpemU7CisJaW50IHJjID0gMDsKIAotCWxvd2VyX2Rpcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5LT5kX3BhcmVudCk7Ci0JZGVudHJ5LT5kX29wID0gJmVjcnlwdGZzX2RvcHM7Ci0JaWYgKChkZW50cnktPmRfbmFtZS5sZW4gPT0gMSAmJiAhc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICIuIikpCi0JICAgIHx8IChkZW50cnktPmRfbmFtZS5sZW4gPT0gMgotCQkmJiAhc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICIuLiIpKSkgewotCQlkX2Ryb3AoZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCWVuY29kZWRfbmFtZWxlbiA9IGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LAotCQkJCQkJICAgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkJCSAgICZlbmNvZGVkX25hbWUpOwotCWlmIChlbmNvZGVkX25hbWVsZW4gPCAwKSB7Ci0JCXJjID0gZW5jb2RlZF9uYW1lbGVuOwotCQlkX2Ryb3AoZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiZW5jb2RlZF9uYW1lID0gWyVzXTsgZW5jb2RlZF9uYW1lbGVuICIKLQkJCSI9IFslZF1cbiIsIGVuY29kZWRfbmFtZSwgZW5jb2RlZF9uYW1lbGVuKTsKLQlsb3dlcl9kZW50cnkgPSBsb29rdXBfb25lX2xlbihlbmNvZGVkX25hbWUsIGxvd2VyX2Rpcl9kZW50cnksCi0JCQkJICAgICAgZW5jb2RlZF9uYW1lbGVuIC0gMSk7Ci0Ja2ZyZWUoZW5jb2RlZF9uYW1lKTsKLQlpZiAoSVNfRVJSKGxvd2VyX2RlbnRyeSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRVJSIGZyb20gbG93ZXJfZGVudHJ5XG4iKTsKLQkJcmMgPSBQVFJfRVJSKGxvd2VyX2RlbnRyeSk7Ci0JCWRfZHJvcChkZW50cnkpOwotCQlnb3RvIG91dDsKLQl9Ci0JbG93ZXJfbW50ID0gbW50Z2V0KGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5LT5kX3BhcmVudCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAibG93ZXJfZGVudHJ5ID0gWyVwXTsgbG93ZXJfZGVudHJ5LT4iCi0gICAgICAgCQkiZF9uYW1lLm5hbWUgPSBbJXNdXG4iLCBsb3dlcl9kZW50cnksCi0JCWxvd2VyX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWxvd2VyX2Rpcl9kZW50cnkgPSBsb3dlcl9kZW50cnktPmRfcGFyZW50OworCWxvd2VyX21udCA9IG1udGdldChlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KAorCQkJCSAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9wYXJlbnQpKTsKIAlsb3dlcl9pbm9kZSA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKLQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGVjcnlwdGZzX2Rpcl9pbm9kZSwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJQlVHX09OKCFhdG9taWNfcmVhZCgmbG93ZXJfZGVudHJ5LT5kX2NvdW50KSk7Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9wcml2YXRlKGRlbnRyeSwKKwllY3J5cHRmc19zZXRfZGVudHJ5X3ByaXZhdGUoZWNyeXB0ZnNfZGVudHJ5LAogCQkJCSAgICBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2RlbnRyeV9pbmZvX2NhY2hlLAogCQkJCQkJICAgICBHRlBfS0VSTkVMKSk7Ci0JaWYgKCFlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShkZW50cnkpKSB7CisJaWYgKCFlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShlY3J5cHRmc19kZW50cnkpKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCi0JCQkJInRvIGFsbG9jYXRlIGVjcnlwdGZzX2RlbnRyeV9pbmZvIHN0cnVjdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkgICAgICAgInRvIGFsbG9jYXRlIGVjcnlwdGZzX2RlbnRyeV9pbmZvIHN0cnVjdFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJZ290byBvdXRfZHB1dDsKIAl9Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcihkZW50cnksIGxvd2VyX2RlbnRyeSk7Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcl9tbnQoZGVudHJ5LCBsb3dlcl9tbnQpOworCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LCBsb3dlcl9kZW50cnkpOworCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXJfbW50KGVjcnlwdGZzX2RlbnRyeSwgbG93ZXJfbW50KTsKIAlpZiAoIWxvd2VyX2RlbnRyeS0+ZF9pbm9kZSkgewogCQkvKiBXZSB3YW50IHRvIGFkZCBiZWNhdXNlIHdlIGNvdWxkbid0IGZpbmQgaW4gbG93ZXIgKi8KLQkJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwkJZF9hZGQoZWNyeXB0ZnNfZGVudHJ5LCBOVUxMKTsKIAkJZ290byBvdXQ7CiAJfQotCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZGVudHJ5LCBkaXItPmlfc2IsCi0JCQkJRUNSWVBURlNfSU5URVJQT1NFX0ZMQUdfRF9BREQpOworCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZWNyeXB0ZnNfZGVudHJ5LAorCQkJCWVjcnlwdGZzX2Rpcl9pbm9kZS0+aV9zYiwgMSk7CiAJaWYgKHJjKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGludGVycG9zaW5nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW50ZXJwb3Npbmc7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoU19JU0RJUihsb3dlcl9pbm9kZS0+aV9tb2RlKSkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIklzIGEgZGlyZWN0b3J5OyByZXR1cm5pbmdcbiIpOworCWlmIChTX0lTRElSKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKFNfSVNMTksobG93ZXJfaW5vZGUtPmlfbW9kZSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJJcyBhIHN5bWxpbms7IHJldHVybmluZ1xuIik7CisJaWYgKFNfSVNMTksobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0OwotCX0KLQlpZiAoc3BlY2lhbF9maWxlKGxvd2VyX2lub2RlLT5pX21vZGUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiSXMgYSBzcGVjaWFsIGZpbGU7IHJldHVybmluZ1xuIik7CisJaWYgKHNwZWNpYWxfZmlsZShsb3dlcl9pbm9kZS0+aV9tb2RlKSkKIAkJZ290byBvdXQ7Ci0JfQotCWlmICghbmQpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJXZSBoYXZlIGEgTlVMTCBuZCwganVzdCBsZWF2ZSIKLQkJCQkiYXMgd2UgKnRoaW5rKiB3ZSBhcmUgYWJvdXQgdG8gdW5saW5rXG4iKTsKKwlpZiAoIWVjcnlwdGZzX25kKQogCQlnb3RvIG91dDsKLQl9CiAJLyogUmVsZWFzZWQgaW4gdGhpcyBmdW5jdGlvbiAqLwotCXBhZ2VfdmlydCA9IGttZW1fY2FjaGVfemFsbG9jKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLAotCQkJCSAgICAgIEdGUF9VU0VSKTsKKwlwYWdlX3ZpcnQgPSBrbWVtX2NhY2hlX3phbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwgR0ZQX1VTRVIpOwogCWlmICghcGFnZV92aXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBrbWVtX2NhY2hlX3phbGxvYygpIGEgcGFnZVxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKIAkJcmMgPSAtRU5PTUVNOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCi0JCQkJIkNhbm5vdCBlY3J5cHRmc19rbWFsbG9jIGEgcGFnZVxuIik7CiAJCWdvdG8gb3V0OwogCX0KLQljcnlwdF9zdGF0ID0gJmVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKS0+Y3J5cHRfc3RhdDsKLQlpZiAoIShjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEKSkKLQkJZWNyeXB0ZnNfc2V0X2RlZmF1bHRfc2l6ZXMoY3J5cHRfc3RhdCk7Ci0JaWYgKCFlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmxvd2VyX2ZpbGUpIHsKLQkJcmMgPSBlY3J5cHRmc19pbml0X3BlcnNpc3RlbnRfZmlsZShkZW50cnkpOworCWlmICghZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShlY3J5cHRmc19kZW50cnktPmRfaW5vZGUpLT5sb3dlcl9maWxlKSB7CisJCXJjID0gZWNyeXB0ZnNfaW5pdF9wZXJzaXN0ZW50X2ZpbGUoZWNyeXB0ZnNfZGVudHJ5KTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgogCQkJICAgICAgICJ0aGUgcGVyc2lzdGVudCBmaWxlIGZvciB0aGUgZGVudHJ5IHdpdGggbmFtZSAiCiAJCQkgICAgICAgIlslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCi0JCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOwotCQkJZ290byBvdXQ7CisJCQkgICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCQkJZ290byBvdXRfZnJlZV9rbWVtOwogCQl9CiAJfQogCXJjID0gZWNyeXB0ZnNfcmVhZF9hbmRfdmFsaWRhdGVfaGVhZGVyX3JlZ2lvbihwYWdlX3ZpcnQsCi0JCQkJCQkgICAgICBkZW50cnktPmRfaW5vZGUpOworCQkJCQkJICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocmMpIHsKLQkJcmMgPSBlY3J5cHRmc19yZWFkX2FuZF92YWxpZGF0ZV94YXR0cl9yZWdpb24ocGFnZV92aXJ0LCBkZW50cnkpOworCQlyYyA9IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX3hhdHRyX3JlZ2lvbihwYWdlX3ZpcnQsCisJCQkJCQkJICAgICBlY3J5cHRmc19kZW50cnkpOwogCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJWYWxpZCBtZXRhZGF0YSBub3QgZm91bmQgaW4gaGVhZGVyICIKLQkJCSAgICAgICAicmVnaW9uIG9yIHhhdHRyIHJlZ2lvbjsgdHJlYXRpbmcgZmlsZSBhcyAiCi0JCQkgICAgICAgInVuZW5jcnlwdGVkXG4iKTsKIAkJCXJjID0gMDsKLQkJCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwgcGFnZV92aXJ0KTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfZnJlZV9rbWVtOwogCQl9CiAJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSOwogCX0KIAltb3VudF9jcnlwdF9zdGF0ID0gJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKLQkJZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwkJZWNyeXB0ZnNfZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKIAlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBURURfVklFV19FTkFCTEVEKSB7CiAJCWlmIChjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSKQogCQkJZmlsZV9zaXplID0gKGNyeXB0X3N0YXQtPm51bV9oZWFkZXJfYnl0ZXNfYXRfZnJvbnQKQEAgLTM4OCwxNCArMzM2LDEwMyBAQAogCX0gZWxzZSB7CiAJCWZpbGVfc2l6ZSA9IGdldF91bmFsaWduZWRfYmU2NChwYWdlX3ZpcnQpOwogCX0KLQlpX3NpemVfd3JpdGUoZGVudHJ5LT5kX2lub2RlLCAobG9mZl90KWZpbGVfc2l6ZSk7CisJaV9zaXplX3dyaXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSwgKGxvZmZfdClmaWxlX3NpemUpOworb3V0X2ZyZWVfa21lbToKIAlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzIsIHBhZ2VfdmlydCk7CiAJZ290byBvdXQ7Ci0KIG91dF9kcHV0OgogCWRwdXQobG93ZXJfZGVudHJ5KTsKLQlkX2Ryb3AoZGVudHJ5KTsKKwlkX2Ryb3AoZWNyeXB0ZnNfZGVudHJ5KTsKIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfbG9va3VwCisgKiBAZWNyeXB0ZnNfZGlyX2lub2RlOiBUaGUgZUNyeXB0ZnMgZGlyZWN0b3J5IGlub2RlCisgKiBAZWNyeXB0ZnNfZGVudHJ5OiBUaGUgZUNyeXB0ZnMgZGVudHJ5IHRoYXQgd2UgYXJlIGxvb2tpbmcgdXAKKyAqIEBlY3J5cHRmc19uZDogbmFtZWlkYXRhOyBtYXkgYmUgTlVMTAorICoKKyAqIEZpbmQgYSBmaWxlIG9uIGRpc2suIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHdlJ2xsIGFkZCBpdCB0byB0aGUKKyAqIGRlbnRyeSBjYWNoZSBhbmQgY29udGludWUgb24gdG8gcmVhZCBpdCBmcm9tIHRoZSBkaXNrLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICplY3J5cHRmc19uZCkKK3sKKwljaGFyICplbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSA9IE5VTEw7CisJc2l6ZV90IGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lX3NpemU7CisJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOworCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0gTlVMTDsKKwlzdHJ1Y3QgZWNyeXB0ZnNfaW5vZGVfaW5mbyAqaW5vZGVfaW5mbzsKKwlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kaXJfZGVudHJ5LCAqbG93ZXJfZGVudHJ5OworCWludCByYyA9IDA7CisKKwllY3J5cHRmc19kZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKKwlpZiAoKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbiA9PSAxCisJICAgICAmJiAhc3RyY21wKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsICIuIikpCisJICAgIHx8IChlY3J5cHRmc19kZW50cnktPmRfbmFtZS5sZW4gPT0gMgorCQkmJiAhc3RyY21wKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsICIuLiIpKSkgeworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorCWxvd2VyX2Rpcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LT5kX3BhcmVudCk7CisJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICBsb3dlcl9kaXJfZGVudHJ5LAorCQkJCSAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKElTX0VSUihsb3dlcl9kZW50cnkpKSB7CisJCXJjID0gUFRSX0VSUihsb3dlcl9kZW50cnkpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsb29rdXBfb25lX2xlbigpIHJldHVybmVkIFslZF0gb24gIgorCQkgICAgICAgImxvd2VyX2RlbnRyeSA9IFslc11cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorCWlmIChsb3dlcl9kZW50cnktPmRfaW5vZGUpCisJCWdvdG8gbG9va3VwX2FuZF9pbnRlcnBvc2U7CisJaW5vZGVfaW5mbyA9ICBlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGlub2RlX2luZm8pIHsKKwkJY3J5cHRfc3RhdCA9ICZpbm9kZV9pbmZvLT5jcnlwdF9zdGF0OworCQkvKiBUT0RPOiBsb2NrIGZvciBjcnlwdF9zdGF0IGNvbXBhcmlzb24gKi8KKwkJaWYgKCEoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCkpCisJCQllY3J5cHRmc19zZXRfZGVmYXVsdF9zaXplcyhjcnlwdF9zdGF0KTsKKwl9CisJaWYgKGNyeXB0X3N0YXQpCisJCW1vdW50X2NyeXB0X3N0YXQgPSBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0OworCWVsc2UKKwkJbW91bnRfY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCisJCQllY3J5cHRmc19kZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCWlmICghKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMpKQorCSAgICAmJiAhKG1vdW50X2NyeXB0X3N0YXQgJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykpKQorCQlnb3RvIGxvb2t1cF9hbmRfaW50ZXJwb3NlOworCWRwdXQobG93ZXJfZGVudHJ5KTsKKwlyYyA9IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgKKwkJJmVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lLCAmZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWVfc2l6ZSwKKwkJY3J5cHRfc3RhdCwgbW91bnRfY3J5cHRfc3RhdCwgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0IGFuZCBlbmNvZGUgIgorCQkgICAgICAgImZpbGVuYW1lOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X2RfZHJvcDsKKwl9CisJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUsCisJCQkJICAgICAgbG93ZXJfZGlyX2RlbnRyeSwKKwkJCQkgICAgICBlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZV9zaXplIC0gMSk7CisJaWYgKElTX0VSUihsb3dlcl9kZW50cnkpKSB7CisJCXJjID0gUFRSX0VSUihsb3dlcl9kZW50cnkpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsb29rdXBfb25lX2xlbigpIHJldHVybmVkIFslZF0gb24gIgorCQkgICAgICAgImxvd2VyX2RlbnRyeSA9IFslc11cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lKTsKKwkJZ290byBvdXRfZF9kcm9wOworCX0KK2xvb2t1cF9hbmRfaW50ZXJwb3NlOgorCXJjID0gZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LCBsb3dlcl9kZW50cnksCisJCQkJCQkgY3J5cHRfc3RhdCwgZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCQkJIGVjcnlwdGZzX25kKTsKKwlnb3RvIG91dDsKK291dF9kX2Ryb3A6CisJZF9kcm9wKGVjcnlwdGZzX2RlbnRyeSk7CitvdXQ6CisJa2ZyZWUoZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUpOwogCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KIApAQCAtNDY2LDE5ICs1MDMsMjEgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKIAljaGFyICplbmNvZGVkX3N5bW5hbWU7Ci0JaW50IGVuY29kZWRfc3ltbGVuOwotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKKwlzaXplX3QgZW5jb2RlZF9zeW1sZW47CisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPSBOVUxMOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7CiAJZGdldChsb3dlcl9kZW50cnkpOwogCWxvd2VyX2Rpcl9kZW50cnkgPSBsb2NrX3BhcmVudChsb3dlcl9kZW50cnkpOwotCWVuY29kZWRfc3ltbGVuID0gZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lKGNyeXB0X3N0YXQsIHN5bW5hbWUsCi0JCQkJCQkgIHN0cmxlbihzeW1uYW1lKSwKLQkJCQkJCSAgJmVuY29kZWRfc3ltbmFtZSk7Ci0JaWYgKGVuY29kZWRfc3ltbGVuIDwgMCkgewotCQlyYyA9IGVuY29kZWRfc3ltbGVuOworCW1vdW50X2NyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKAorCQlkaXItPmlfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCXJjID0gZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKCZlbmNvZGVkX3N5bW5hbWUsCisJCQkJCQkgICZlbmNvZGVkX3N5bWxlbiwKKwkJCQkJCSAgTlVMTCwKKwkJCQkJCSAgbW91bnRfY3J5cHRfc3RhdCwgc3ltbmFtZSwKKwkJCQkJCSAgc3RybGVuKHN5bW5hbWUpKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0X2xvY2s7Ci0JfQogCXJjID0gdmZzX3N5bWxpbmsobG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSwgbG93ZXJfZGVudHJ5LAogCQkJIGVuY29kZWRfc3ltbmFtZSk7CiAJa2ZyZWUoZW5jb2RlZF9zeW1uYW1lKTsKQEAgLTYwMiw1MiArNjQxLDU0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWVjcnlwdGZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKiBidWYsIGludCBidWZzaXopCitlY3J5cHRmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWYsIGludCBidWZzaXopCiB7Ci0JaW50IHJjOwotCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKLQljaGFyICpkZWNvZGVkX25hbWU7CiAJY2hhciAqbG93ZXJfYnVmOwotCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OworCWNoYXIgKnBsYWludGV4dF9uYW1lOworCXNpemVfdCBwbGFpbnRleHRfbmFtZV9zaXplOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJaW50IHJjOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7CiAJaWYgKCFsb3dlcl9kZW50cnktPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rKSB7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQorCWNyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShkZW50cnktPmRfaW5vZGUpLT5jcnlwdF9zdGF0OwogCS8qIFJlbGVhc2VkIGluIHRoaXMgZnVuY3Rpb24gKi8KIAlsb3dlcl9idWYgPSBrbWFsbG9jKGJ1ZnNpeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxvd2VyX2J1ZiA9PSBOVUxMKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslZF0gYnl0ZXNcbiIsIF9fZnVuY19fLCBidWZzaXopOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAlvbGRfZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoZ2V0X2RzKCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2FsbGluZyByZWFkbGluayB3LyAiCi0JCQkibG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSA9IFslc11cbiIsCi0JCQlsb3dlcl9kZW50cnktPmRfbmFtZS5uYW1lKTsKIAlyYyA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmsobG93ZXJfZGVudHJ5LAogCQkJCQkJICAgKGNoYXIgX191c2VyICopbG93ZXJfYnVmLAogCQkJCQkJICAgYnVmc2l6KTsKIAlzZXRfZnMob2xkX2ZzKTsKIAlpZiAocmMgPj0gMCkgewotCQljcnlwdF9zdGF0ID0gTlVMTDsKLQkJcmMgPSBlY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwgbG93ZXJfYnVmLCByYywKLQkJCQkJICAgICAgJmRlY29kZWRfbmFtZSk7Ci0JCWlmIChyYyA9PSAtRU5PTUVNKQorCQlyYyA9IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZSgmcGxhaW50ZXh0X25hbWUsCisJCQkJCQkJICAmcGxhaW50ZXh0X25hbWVfc2l6ZSwKKwkJCQkJCQkgIGRlbnRyeSwgbG93ZXJfYnVmLAorCQkJCQkJCSAgcmMpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZGVjb2RlIGFuZCAiCisJCQkgICAgICAgImRlY3J5cHQgZmlsZW5hbWU7IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCisJCQkJcmMpOwogCQkJZ290byBvdXRfZnJlZV9sb3dlcl9idWY7Ci0JCWlmIChyYyA+IDApIHsKLQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ29weWluZyBbJWRdIGJ5dGVzICIKLQkJCQkJInRvIHVzZXJzcGFjZTogWyUqc11cbiIsIHJjLAotCQkJCQlkZWNvZGVkX25hbWUpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRlY29kZWRfbmFtZSwgcmMpKQotCQkJCXJjID0gLUVGQVVMVDsKIAkJfQotCQlrZnJlZShkZWNvZGVkX25hbWUpOwotCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsCi0JCQkJCWxvd2VyX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJjID0gY29weV90b191c2VyKGJ1ZiwgcGxhaW50ZXh0X25hbWUsIHBsYWludGV4dF9uYW1lX3NpemUpOworCQlpZiAocmMpCisJCQlyYyA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXJjID0gcGxhaW50ZXh0X25hbWVfc2l6ZTsKKwkJa2ZyZWUocGxhaW50ZXh0X25hbWUpOworCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsIGxvd2VyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJfQogb3V0X2ZyZWVfbG93ZXJfYnVmOgogCWtmcmVlKGxvd2VyX2J1Zik7CkBAIC02NjksOCArNzEwLDYgQEAKIAl9CiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKGdldF9kcygpKTsKLQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIkNhbGxpbmcgcmVhZGxpbmsgdy8gIgotCQkJImRlbnRyeS0+ZF9uYW1lLm5hbWUgPSBbJXNdXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAlyYyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmsoZGVudHJ5LCAoY2hhciBfX3VzZXIgKilidWYsIGxlbik7CiAJc2V0X2ZzKG9sZF9mcyk7CiAJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCmluZGV4IDBkNzEzYjYuLmZmNTM5NDIgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKKysrIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwpAQCAtMzU4LDcgKzM1OCw3IEBACiAJLyogdmVyaWZ5IHRoYXQgZXZlcnl0aGluZyB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgRkVLIHNpemUgaXMgcHJlc2VudCAqLwogCWlmIChtZXNzYWdlX2xlbiA8IDQpIHsKIAkJcmMgPSAtRUlPOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBpcyBbJVpkXTsgbWluaW11bSBhY2NlcHRhYmxlICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVzc2FnZV9sZW4gaXMgWyV6ZF07IG1pbmltdW0gYWNjZXB0YWJsZSAiCiAJCSAgICAgICAibWVzc2FnZSBsZW5ndGggaXMgWyVkXVxuIiwgX19mdW5jX18sIG1lc3NhZ2VfbGVuLCA0KTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzg1LDEzICszODUsMTMgQEAKIAlpICs9IGRhdGFfbGVuOwogCWlmIChtZXNzYWdlX2xlbiA8IChpICsga2V5X3JlYy0+ZW5jX2tleV9zaXplKSkgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIFslWmRdOyBtYXggbGVuIGlzIFslWmRdXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBbJXpkXTsgbWF4IGxlbiBpcyBbJXpkXVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBtZXNzYWdlX2xlbiwgKGkgKyBrZXlfcmVjLT5lbmNfa2V5X3NpemUpKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChrZXlfcmVjLT5lbmNfa2V5X3NpemUgPiBFQ1JZUFRGU19NQVhfRU5DUllQVEVEX0tFWV9CWVRFUykgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEVuY3J5cHRlZCBrZXlfc2l6ZSBbJVpkXSBsYXJnZXIgdGhhbiAiCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVuY3J5cHRlZCBrZXlfc2l6ZSBbJXpkXSBsYXJnZXIgdGhhbiAiCiAJCSAgICAgICAidGhlIG1heGltdW0ga2V5IHNpemUgWyVkXVxuIiwgX19mdW5jX18sCiAJCSAgICAgICBrZXlfcmVjLT5lbmNfa2V5X3NpemUsCiAJCSAgICAgICBFQ1JZUFRGU19NQVhfRU5DUllQVEVEX0tFWV9CWVRFUyk7CkBAIC00MDMsNiArNDAzLDU4MCBAQAogfQogCiBzdGF0aWMgaW50CitlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKAorCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKipnbG9iYWxfYXV0aF90b2ssCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsIGNoYXIgKnNpZykKK3sKKwlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICp3YWxrZXI7CisJaW50IHJjID0gMDsKKworCSgqZ2xvYmFsX2F1dGhfdG9rKSA9IE5VTEw7CisJbXV0ZXhfbG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2Fsa2VyLAorCQkJICAgICZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdCwKKwkJCSAgICBtb3VudF9jcnlwdF9zdGF0X2xpc3QpIHsKKwkJaWYgKG1lbWNtcCh3YWxrZXItPnNpZywgc2lnLCBFQ1JZUFRGU19TSUdfU0laRV9IRVgpID09IDApIHsKKwkJCSgqZ2xvYmFsX2F1dGhfdG9rKSA9IHdhbGtlcjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJjID0gLUVJTlZBTDsKK291dDoKKwltdXRleF91bmxvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnCisgKiBAYXV0aF90b2s6IFNldCB0byB0aGUgbWF0Y2hpbmcgYXV0aF90b2s7IE5VTEwgaWYgbm90IGZvdW5kCisgKiBAY3J5cHRfc3RhdDogaW5vZGUgY3J5cHRfc3RhdCBjcnlwdG8gY29udGV4dAorICogQHNpZzogU2lnIG9mIGF1dGhfdG9rIHRvIGZpbmQKKyAqCisgKiBGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBsb29rcyBhdCB0aGUgcmVnaXN0ZXJlZCBhdXRoX3RvaydzCisgKiBsaW5rZWQgb2ZmIHRoZSBtb3VudF9jcnlwdF9zdGF0LCBzbyBhbGwgdGhlIGF1dGhfdG9rcyB0aGF0IGNhbiBiZQorICogdXNlZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYXQgbW91bnQgdGltZS4gVGhpcyBmdW5jdGlvbiBjb3VsZAorICogcG90ZW50aWFsbHkgdHJ5IGEgbG90IGhhcmRlciB0byBmaW5kIGF1dGhfdG9rJ3MgKGUuZy4sIGJ5IGNhbGxpbmcKKyAqIG91dCB0byBlY3J5cHRmc2QgdG8gZHluYW1pY2FsbHkgcmV0cmlldmUgYW4gYXV0aF90b2sgb2JqZWN0KSBzbworICogdGhhdCBzdGF0aWMgcmVnaXN0cmF0aW9uIG9mIGF1dGhfdG9rJ3Mgd2lsbCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnMgemVybyBvbiBubyBlcnJvcjsgbm9uLXplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludAorZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAorCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqKmF1dGhfdG9rLAorCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCWNoYXIgKnNpZykKK3sKKwlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICpnbG9iYWxfYXV0aF90b2s7CisJaW50IHJjID0gMDsKKworCSgqYXV0aF90b2spID0gTlVMTDsKKwlpZiAoZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygmZ2xvYmFsX2F1dGhfdG9rLAorCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LCBzaWcpKSB7CisJCXN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleTsKKworCQlyYyA9IGVjcnlwdGZzX2tleXJpbmdfYXV0aF90b2tfZm9yX3NpZygmYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKKwkJCQkJCSAgICAgICBzaWcpOworCX0gZWxzZQorCQkoKmF1dGhfdG9rKSA9IGdsb2JhbF9hdXRoX3Rvay0+Z2xvYmFsX2F1dGhfdG9rOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3cml0ZV90YWdfNzBfcGFja2V0IGNhbiBnb2JibGUgYSBsb3Qgb2Ygc3RhY2sgc3BhY2UuIFdlIHN0dWZmIG1vc3QKKyAqIG9mIHRoZSBmdW5jdGlvbidzIHBhcmFtZXRlcnMgaW4gYSBrbWFsbG9jJ2Qgc3RydWN0IHRvIGhlbHAgcmVkdWNlCisgKiBlQ3J5cHRmcycgb3ZlcmFsbCBzdGFjayB1c2FnZS4KKyAqLworc3RydWN0IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgeworCXU4IGNpcGhlcl9jb2RlOworCXNpemVfdCBtYXhfcGFja2V0X3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplX2xlbjsKKwlzaXplX3QgYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXNpemVfdCBibG9ja19zaXplOworCXNpemVfdCBpOworCXNpemVfdCBqOworCXNpemVfdCBudW1fcmFuZF9ieXRlczsKKwlzdHJ1Y3QgbXV0ZXggKnRmbV9tdXRleDsKKwljaGFyICpibG9ja19hbGlnbmVkX2ZpbGVuYW1lOworCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2s7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHN0X3NnOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCWNoYXIgaXZbRUNSWVBURlNfTUFYX0lWX0JZVEVTXTsKKwljaGFyIGhhc2hbRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFXTsKKwljaGFyIHRtcF9oYXNoW0VDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRV07CisJc3RydWN0IGhhc2hfZGVzYyBoYXNoX2Rlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGhhc2hfc2c7Cit9OworCisvKioKKyAqIHdyaXRlX3RhZ183MF9wYWNrZXQgLSBXcml0ZSBlbmNyeXB0ZWQgZmlsZW5hbWUgKEVGTikgcGFja2V0IGFnYWluc3QgRk5FSworICogQGZpbGVuYW1lOiBOVUxMLXRlcm1pbmF0ZWQgZmlsZW5hbWUgc3RyaW5nCisgKgorICogVGhpcyBpcyB0aGUgc2ltcGxlc3QgbWVjaGFuaXNtIGZvciBhY2hpZXZpbmcgZmlsZW5hbWUgZW5jcnlwdGlvbiBpbgorICogZUNyeXB0ZnMuIEl0IGVuY3J5cHRzIHRoZSBnaXZlbiBmaWxlbmFtZSB3aXRoIHRoZSBtb3VudC13aWRlCisgKiBmaWxlbmFtZSBlbmNyeXB0aW9uIGtleSAoRk5FSykgYW5kIHN0b3JlcyBpdCBpbiBhIHBhY2tldCB0byBAZGVzdCwKKyAqIHdoaWNoIHRoZSBjYWxsZWUgd2lsbCBlbmNvZGUgYW5kIHdyaXRlIGRpcmVjdGx5IGludG8gdGhlIGRlbnRyeQorICogbmFtZS4KKyAqLworaW50CitlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0KGNoYXIgKmRlc3QsIHNpemVfdCAqcmVtYWluaW5nX2J5dGVzLAorCQkJICAgICBzaXplX3QgKnBhY2tldF9zaXplLAorCQkJICAgICBzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwkJCSAgICAgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplKQoreworCXN0cnVjdCBlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0X3NpbGx5X3N0YWNrICpzOworCWludCByYyA9IDA7CisKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgdHJ5aW5nIHRvIGttYWxsb2MgIgorCQkgICAgICAgIlslemRdIGJ5dGVzIG9mIGtlcm5lbCBtZW1vcnlcbiIsIF9fZnVuY19fLCBzaXplb2YoKnMpKTsKKwkJZ290byBvdXQ7CisJfQorCXMtPmRlc2MuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJKCpwYWNrZXRfc2l6ZSkgPSAwOworCXJjID0gZWNyeXB0ZnNfZ2V0X3RmbV9hbmRfbXV0ZXhfZm9yX2NpcGhlcl9uYW1lKAorCQkmcy0+ZGVzYy50Zm0sCisJCSZzLT50Zm1fbXV0ZXgsIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gZ2V0ICIKKwkJICAgICAgICJ0Zm0gYW5kIG11dGV4IGZvciBjaXBoZXIgbmFtZSBbJXNdOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwgcmMpOworCQlnb3RvIG91dDsKKwl9CisJbXV0ZXhfbG9jayhzLT50Zm1fbXV0ZXgpOworCXMtPmJsb2NrX3NpemUgPSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShzLT5kZXNjLnRmbSk7CisJLyogUGx1cyBvbmUgZm9yIHRoZSBcMCBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgcmFuZG9tIHByZWZpeAorCSAqIGFuZCB0aGUgcGxhaW50ZXh0IGZpbGVuYW1lICovCisJcy0+bnVtX3JhbmRfYnl0ZXMgPSAoRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTICsgMSk7CisJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gKHMtPm51bV9yYW5kX2J5dGVzICsgZmlsZW5hbWVfc2l6ZSk7CisJaWYgKChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgJSBzLT5ibG9ja19zaXplKSAhPSAwKSB7CisJCXMtPm51bV9yYW5kX2J5dGVzICs9IChzLT5ibG9ja19zaXplCisJCQkJICAgICAgLSAocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplCisJCQkJCSAlIHMtPmJsb2NrX3NpemUpKTsKKwkJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gKHMtPm51bV9yYW5kX2J5dGVzCisJCQkJCQkgICsgZmlsZW5hbWVfc2l6ZSk7CisJfQorCS8qIE9jdGV0IDA6IFRhZyA3MCBpZGVudGlmaWVyCisJICogT2N0ZXRzIDEtTjE6IFRhZyA3MCBwYWNrZXQgc2l6ZSAoaW5jbHVkZXMgY2lwaGVyIGlkZW50aWZpZXIKKwkgKiAgICAgICAgICAgICAgYW5kIGJsb2NrLWFsaWduZWQgZW5jcnlwdGVkIGZpbGVuYW1lIHNpemUpCisJICogT2N0ZXRzIE4xLU4yOiBGTkVLIHNpZyAoRUNSWVBURlNfU0lHX1NJWkUpCisJICogT2N0ZXQgTjItTjM6IENpcGhlciBpZGVudGlmaWVyICgxIG9jdGV0KQorCSAqIE9jdGV0cyBOMy1ONDogQmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUKKwkgKiAgLSBDb25zaXN0cyBvZiBhIG1pbmltdW0gbnVtYmVyIG9mIHJhbmRvbSBjaGFyYWN0ZXJzLCBhIFwwCisJICogICAgc2VwYXJhdG9yLCBhbmQgdGhlbiB0aGUgZmlsZW5hbWUgKi8KKwlzLT5tYXhfcGFja2V0X3NpemUgPSAoMSAgICAgICAgICAgICAgICAgICAvKiBUYWcgNzAgaWRlbnRpZmllciAqLworCQkJICAgICAgKyAzICAgICAgICAgICAgICAgICAvKiBNYXggVGFnIDcwIHBhY2tldCBzaXplICovCisJCQkgICAgICArIEVDUllQVEZTX1NJR19TSVpFIC8qIEZORUsgc2lnICovCisJCQkgICAgICArIDEgICAgICAgICAgICAgICAgIC8qIENpcGhlciBpZGVudGlmaWVyICovCisJCQkgICAgICArIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQkoKnBhY2tldF9zaXplKSA9IHMtPm1heF9wYWNrZXRfc2l6ZTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAocy0+bWF4X3BhY2tldF9zaXplID4gKCpyZW1haW5pbmdfYnl0ZXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXF1aXJlIFslemRdIGJ5dGVzIHRvIHdyaXRlOyBvbmx5ICIKKwkJICAgICAgICJbJXpkXSBhdmFpbGFibGVcbiIsIF9fZnVuY19fLCBzLT5tYXhfcGFja2V0X3NpemUsCisJCSAgICAgICAoKnJlbWFpbmluZ19ieXRlcykpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSA9IGt6YWxsb2Mocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBrZXJuZWwgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJremFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlzLT5pID0gMDsKKwlkZXN0W3MtPmkrK10gPSBFQ1JZUFRGU19UQUdfNzBfUEFDS0VUX1RZUEU7CisJcmMgPSBlY3J5cHRmc193cml0ZV9wYWNrZXRfbGVuZ3RoKCZkZXN0W3MtPmldLAorCQkJCQkgIChFQ1JZUFRGU19TSUdfU0laRQorCQkJCQkgICArIDEgLyogQ2lwaGVyIGNvZGUgKi8KKwkJCQkJICAgKyBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpLAorCQkJCQkgICZzLT5wYWNrZXRfc2l6ZV9sZW4pOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBnZW5lcmF0aW5nIHRhZyA3MCBwYWNrZXQgIgorCQkgICAgICAgImhlYWRlcjsgY2Fubm90IGdlbmVyYXRlIHBhY2tldCBsZW5ndGg7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pICs9IHMtPnBhY2tldF9zaXplX2xlbjsKKwllY3J5cHRmc19mcm9tX2hleCgmZGVzdFtzLT5pXSwKKwkJCSAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsCisJCQkgIEVDUllQVEZTX1NJR19TSVpFKTsKKwlzLT5pICs9IEVDUllQVEZTX1NJR19TSVpFOworCXMtPmNpcGhlcl9jb2RlID0gZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZygKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChzLT5jaXBoZXJfY29kZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZ2VuZXJhdGUgY29kZSBmb3IgIgorCQkgICAgICAgImNpcGhlciBbJXNdIHdpdGgga2V5IGJ5dGVzIFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCWRlc3Rbcy0+aSsrXSA9IHMtPmNpcGhlcl9jb2RlOworCXJjID0gZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAorCQkmcy0+YXV0aF90b2ssIG1vdW50X2NyeXB0X3N0YXQsCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBmaW5kIGF1dGggdG9rIGZvciAiCisJCSAgICAgICAiZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnLCByYyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwkvKiBUT0RPOiBTdXBwb3J0IG90aGVyIGtleSBtb2R1bGVzIHRoYW4gcGFzc3BocmFzZSBmb3IKKwkgKiBmaWxlbmFtZSBlbmNyeXB0aW9uICovCisJQlVHX09OKHMtPmF1dGhfdG9rLT50b2tlbl90eXBlICE9IEVDUllQVEZTX1BBU1NXT1JEKTsKKwlzZ19pbml0X29uZSgKKwkJJnMtPmhhc2hfc2csCisJCSh1OCAqKXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5X2J5dGVzKTsKKwlzLT5oYXNoX2Rlc2MuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJcy0+aGFzaF9kZXNjLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKEVDUllQVEZTX1RBR183MF9ESUdFU1QsIDAsCisJCQkJCSAgICAgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihzLT5oYXNoX2Rlc2MudGZtKSkgeworCQkJcmMgPSBQVFJfRVJSKHMtPmhhc2hfZGVzYy50Zm0pOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byAiCisJCQkgICAgICAgImFsbG9jYXRlIGhhc2ggY3J5cHRvIGNvbnRleHQ7IHJjID0gWyVkXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2hhc2hfaW5pdCgmcy0+aGFzaF9kZXNjKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEVycm9yIGluaXRpYWxpemluZyBjcnlwdG8gaGFzaDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF91cGRhdGUoCisJCSZzLT5oYXNoX2Rlc2MsICZzLT5oYXNoX3NnLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlfYnl0ZXMpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IgdXBkYXRpbmcgY3J5cHRvIGhhc2g7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2hhc2hfZmluYWwoJnMtPmhhc2hfZGVzYywgcy0+aGFzaCk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFcnJvciBmaW5hbGl6aW5nIGNyeXB0byBoYXNoOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlmb3IgKHMtPmogPSAwOyBzLT5qIDwgKHMtPm51bV9yYW5kX2J5dGVzIC0gMSk7IHMtPmorKykgeworCQlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lW3MtPmpdID0KKwkJCXMtPmhhc2hbKHMtPmogJSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpXTsKKwkJaWYgKChzLT5qICUgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKQorCQkgICAgPT0gKEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSAtIDEpKSB7CisJCQlzZ19pbml0X29uZSgmcy0+aGFzaF9zZywgKHU4ICopcy0+aGFzaCwKKwkJCQkgICAgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJCXJjID0gY3J5cHRvX2hhc2hfaW5pdCgmcy0+aGFzaF9kZXNjKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIGluaXRpYWxpemluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQlyYyA9IGNyeXB0b19oYXNoX3VwZGF0ZSgmcy0+aGFzaF9kZXNjLCAmcy0+aGFzaF9zZywKKwkJCQkJCUVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiVzOiBFcnJvciB1cGRhdGluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQlyYyA9IGNyeXB0b19oYXNoX2ZpbmFsKCZzLT5oYXNoX2Rlc2MsIHMtPnRtcF9oYXNoKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIGZpbmFsaXppbmcgY3J5cHRvIGhhc2g7ICIKKwkJCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCQkJfQorCQkJbWVtY3B5KHMtPmhhc2gsIHMtPnRtcF9oYXNoLAorCQkJICAgICAgIEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSk7CisJCX0KKwkJaWYgKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPT0gJ1wwJykKKwkJCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPSBFQ1JZUFRGU19OT05fTlVMTDsKKwl9CisJbWVtY3B5KCZzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lW3MtPm51bV9yYW5kX2J5dGVzXSwgZmlsZW5hbWUsCisJICAgICAgIGZpbGVuYW1lX3NpemUpOworCXJjID0gdmlydF90b19zY2F0dGVybGlzdChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5zcmNfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3QoJmRlc3Rbcy0+aV0sIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwKKwkJCQkgJnMtPmRzdF9zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZW5jcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwkvKiBUaGUgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgYmxvY2sgZWZmZWN0aXZlbHkgZG8gdGhlIGpvYgorCSAqIG9mIHRoZSBJViBoZXJlLCBzbyB3ZSBqdXN0IHVzZSAwJ3MgZm9yIHRoZSBJVi4gTm90ZSB0aGUKKwkgKiBjb25zdHJhaW50IHRoYXQgRUNSWVBURlNfRklMRU5BTUVfTUlOX1JBTkRPTV9QUkVQRU5EX0JZVEVTCisJICogPj0gRUNSWVBURlNfTUFYX0lWX0JZVEVTLiAqLworCW1lbXNldChzLT5pdiwgMCwgRUNSWVBURlNfTUFYX0lWX0JZVEVTKTsKKwlzLT5kZXNjLmluZm8gPSBzLT5pdjsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KAorCQlzLT5kZXNjLnRmbSwKKwkJcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHNldHRpbmcga2V5IGZvciBjcnlwdG8gY29udGV4dDsgIgorCQkgICAgICAgInJjID0gWyVkXS4gcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5XyIKKwkJICAgICAgICJlbmNyeXB0aW9uX2tleSA9IFsweCVwXTsgbW91bnRfY3J5cHRfc3RhdC0+IgorCQkgICAgICAgImdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPSBbJXpkXVxuIiwgX19mdW5jX18sCisJCSAgICAgICByYywKKwkJICAgICAgIHMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmcy0+ZGVzYywgJnMtPmRzdF9zZywgJnMtPnNyY19zZywKKwkJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZW5jcnlwdCBmaWxlbmFtZTsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcy0+aSArPSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJKCpwYWNrZXRfc2l6ZSkgPSBzLT5pOworCSgqcmVtYWluaW5nX2J5dGVzKSAtPSAoKnBhY2tldF9zaXplKTsKK291dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOgorCWNyeXB0b19mcmVlX2hhc2gocy0+aGFzaF9kZXNjLnRmbSk7CitvdXRfZnJlZV91bmxvY2s6CisJbWVtc2V0KHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUsIDAsIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJa2ZyZWUocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jayhzLT50Zm1fbXV0ZXgpOworb3V0OgorCWtmcmVlKHMpOworCXJldHVybiByYzsKK30KKworc3RydWN0IGVjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgeworCXU4IGNpcGhlcl9jb2RlOworCXNpemVfdCBtYXhfcGFja2V0X3NpemU7CisJc2l6ZV90IHBhY2tldF9zaXplX2xlbjsKKwlzaXplX3QgcGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXNpemVfdCBibG9ja19zaXplOworCXNpemVfdCBpOworCXN0cnVjdCBtdXRleCAqdGZtX211dGV4OworCWNoYXIgKmRlY3J5cHRlZF9maWxlbmFtZTsKKwlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rOworCXN0cnVjdCBzY2F0dGVybGlzdCBzcmNfc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGRzdF9zZzsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwljaGFyIGZuZWtfc2lnX2hleFtFQ1JZUFRGU19TSUdfU0laRV9IRVggKyAxXTsKKwljaGFyIGl2W0VDUllQVEZTX01BWF9JVl9CWVRFU107CisJY2hhciBjaXBoZXJfc3RyaW5nW0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFXTsKK307CisKKy8qKgorICogcGFyc2VfdGFnXzcwX3BhY2tldCAtIFBhcnNlIGFuZCBwcm9jZXNzIEZORUstZW5jcnlwdGVkIHBhc3NwaHJhc2UgcGFja2V0CisgKiBAZmlsZW5hbWU6IFRoaXMgZnVuY3Rpb24ga21hbGxvYydzIHRoZSBtZW1vcnkgZm9yIHRoZSBmaWxlbmFtZQorICogQGZpbGVuYW1lX3NpemU6IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHRvIHRoZSBhbW91bnQgb2YgbWVtb3J5CisgKiAgICAgICAgICAgICAgICAga21hbGxvYydkIGZvciB0aGUgZmlsZW5hbWUKKyAqIEBwYWNrZXRfc2l6ZTogVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgdG8gdGhlIHRoZSBudW1iZXIgb2Ygb2N0ZXRzCisgKiAgICAgICAgICAgICAgIGluIHRoZSBwYWNrZXQgcGFyc2VkCisgKiBAbW91bnRfY3J5cHRfc3RhdDogVGhlIG1vdW50LXdpZGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CisgKiBAZGF0YTogVGhlIG1lbW9yeSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSBzdGFydCBvZiB0aGUgdGFnIDcwCisgKiAgICAgICAgcGFja2V0CisgKiBAbWF4X3BhY2tldF9zaXplOiBUaGUgbWF4aW11bSBsZWdhbCBzaXplIG9mIHRoZSBwYWNrZXQgdG8gYmUgcGFyc2VkCisgKiAgICAgICAgICAgICAgICAgICBmcm9tIEBkYXRhCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG90aGVyd2lzZQorICovCitpbnQKK2VjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXQoY2hhciAqKmZpbGVuYW1lLCBzaXplX3QgKmZpbGVuYW1lX3NpemUsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpkYXRhLCBzaXplX3QgbWF4X3BhY2tldF9zaXplKQoreworCXN0cnVjdCBlY3J5cHRmc19wYXJzZV90YWdfNzBfcGFja2V0X3NpbGx5X3N0YWNrICpzOworCWludCByYyA9IDA7CisKKwkoKnBhY2tldF9zaXplKSA9IDA7CisJKCpmaWxlbmFtZV9zaXplKSA9IDA7CisJKCpmaWxlbmFtZSkgPSBOVUxMOworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCB0cnlpbmcgdG8ga21hbGxvYyAiCisJCSAgICAgICAiWyV6ZF0gYnl0ZXMgb2Yga2VybmVsIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqcykpOworCQlnb3RvIG91dDsKKwl9CisJcy0+ZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlpZiAobWF4X3BhY2tldF9zaXplIDwgKDEgKyAxICsgRUNSWVBURlNfU0lHX1NJWkUgKyAxICsgMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1heF9wYWNrZXRfc2l6ZSBpcyBbJXpkXTsgaXQgbXVzdCBiZSAiCisJCSAgICAgICAiYXQgbGVhc3QgWyVkXVxuIiwgX19mdW5jX18sIG1heF9wYWNrZXRfc2l6ZSwKKwkJCSgxICsgMSArIEVDUllQVEZTX1NJR19TSVpFICsgMSArIDEpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJLyogT2N0ZXQgMDogVGFnIDcwIGlkZW50aWZpZXIKKwkgKiBPY3RldHMgMS1OMTogVGFnIDcwIHBhY2tldCBzaXplIChpbmNsdWRlcyBjaXBoZXIgaWRlbnRpZmllcgorCSAqICAgICAgICAgICAgICBhbmQgYmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUgc2l6ZSkKKwkgKiBPY3RldHMgTjEtTjI6IEZORUsgc2lnIChFQ1JZUFRGU19TSUdfU0laRSkKKwkgKiBPY3RldCBOMi1OMzogQ2lwaGVyIGlkZW50aWZpZXIgKDEgb2N0ZXQpCisJICogT2N0ZXRzIE4zLU40OiBCbG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZQorCSAqICAtIENvbnNpc3RzIG9mIGEgbWluaW11bSBudW1iZXIgb2YgcmFuZG9tIG51bWJlcnMsIGEgXDAKKwkgKiAgICBzZXBhcmF0b3IsIGFuZCB0aGVuIHRoZSBmaWxlbmFtZSAqLworCWlmIChkYXRhWygqcGFja2V0X3NpemUpKytdICE9IEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBwYWNrZXQgdGFnIFsweCUuMnhdOyBtdXN0IGJlICIKKwkJICAgICAgICJ0YWcgWzB4JS4yeF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgZGF0YVsoKCpwYWNrZXRfc2l6ZSkgLSAxKV0sIEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gZWNyeXB0ZnNfcGFyc2VfcGFja2V0X2xlbmd0aCgmZGF0YVsoKnBhY2tldF9zaXplKV0sCisJCQkJCSAgJnMtPnBhcnNlZF90YWdfNzBfcGFja2V0X3NpemUsCisJCQkJCSAgJnMtPnBhY2tldF9zaXplX2xlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBwYXJzaW5nIHBhY2tldCBsZW5ndGg7ICIKKwkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+cGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZQorCQkJCQkgIC0gRUNSWVBURlNfU0lHX1NJWkUgLSAxKTsKKwlpZiAoKDEgKyBzLT5wYWNrZXRfc2l6ZV9sZW4gKyBzLT5wYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplKQorCSAgICA+IG1heF9wYWNrZXRfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWF4X3BhY2tldF9zaXplIGlzIFslemRdOyByZWFsIHBhY2tldCAiCisJCSAgICAgICAic2l6ZSBpcyBbJXpkXVxuIiwgX19mdW5jX18sIG1heF9wYWNrZXRfc2l6ZSwKKwkJICAgICAgICgxICsgcy0+cGFja2V0X3NpemVfbGVuICsgMQorCQkJKyBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJKCpwYWNrZXRfc2l6ZSkgKz0gcy0+cGFja2V0X3NpemVfbGVuOworCWVjcnlwdGZzX3RvX2hleChzLT5mbmVrX3NpZ19oZXgsICZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCUVDUllQVEZTX1NJR19TSVpFKTsKKwlzLT5mbmVrX3NpZ19oZXhbRUNSWVBURlNfU0lHX1NJWkVfSEVYXSA9ICdcMCc7CisJKCpwYWNrZXRfc2l6ZSkgKz0gRUNSWVBURlNfU0lHX1NJWkU7CisJcy0+Y2lwaGVyX2NvZGUgPSBkYXRhWygqcGFja2V0X3NpemUpKytdOworCXJjID0gZWNyeXB0ZnNfY2lwaGVyX2NvZGVfdG9fc3RyaW5nKHMtPmNpcGhlcl9zdHJpbmcsIHMtPmNpcGhlcl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENpcGhlciBjb2RlIFslZF0gaXMgaW52YWxpZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBzLT5jaXBoZXJfY29kZSk7CisJCWdvdG8gb3V0OworCX0KKwlyYyA9IGVjcnlwdGZzX2dldF90Zm1fYW5kX211dGV4X2Zvcl9jaXBoZXJfbmFtZSgmcy0+ZGVzYy50Zm0sCisJCQkJCQkJJnMtPnRmbV9tdXRleCwKKwkJCQkJCQlzLT5jaXBoZXJfc3RyaW5nKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gZ2V0ICIKKwkJICAgICAgICJ0Zm0gYW5kIG11dGV4IGZvciBjaXBoZXIgbmFtZSBbJXNdOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBzLT5jaXBoZXJfc3RyaW5nLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF9sb2NrKHMtPnRmbV9tdXRleCk7CisJcmMgPSB2aXJ0X3RvX3NjYXR0ZXJsaXN0KCZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLCAmcy0+c3JjX3NnLCAxKTsKKwlpZiAocmMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byAiCisJCSAgICAgICAiY29udmVydCBlbmNyeXB0ZWQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJKCpwYWNrZXRfc2l6ZSkgKz0gcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplOworCXMtPmRlY3J5cHRlZF9maWxlbmFtZSA9IGttYWxsb2Mocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPmRlY3J5cHRlZF9maWxlbmFtZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3Qocy0+ZGVjcnlwdGVkX2ZpbGVuYW1lLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5kc3Rfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGRlY3J5cHRlZCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7ICIKKwkJICAgICAgICJleHBlY3RlZCByYyA9IDE7IGdvdCByYyA9IFslZF0uICIKKwkJICAgICAgICJibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSBbJXpkXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBibG9jayBlZmZlY3RpdmVseSBkbyB0aGUgam9iIG9mCisJICogdGhlIElWIGhlcmUsIHNvIHdlIGp1c3QgdXNlIDAncyBmb3IgdGhlIElWLiBOb3RlIHRoZQorCSAqIGNvbnN0cmFpbnQgdGhhdCBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMKKwkgKiA+PSBFQ1JZUFRGU19NQVhfSVZfQllURVMuICovCisJbWVtc2V0KHMtPml2LCAwLCBFQ1JZUFRGU19NQVhfSVZfQllURVMpOworCXMtPmRlc2MuaW5mbyA9IHMtPml2OworCXJjID0gZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZzLT5hdXRoX3RvaywgbW91bnRfY3J5cHRfc3RhdCwKKwkJCQkJICAgIHMtPmZuZWtfc2lnX2hleCk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZmluZCBhdXRoIHRvayBmb3IgIgorCQkgICAgICAgImZuZWsgc2lnIFslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sIHMtPmZuZWtfc2lnX2hleCwKKwkJICAgICAgIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRPRE86IFN1cHBvcnQgb3RoZXIga2V5IG1vZHVsZXMgdGhhbiBwYXNzcGhyYXNlIGZvcgorCSAqIGZpbGVuYW1lIGVuY3J5cHRpb24gKi8KKwlCVUdfT04ocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoCisJCXMtPmRlc2MudGZtLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igc2V0dGluZyBrZXkgZm9yIGNyeXB0byBjb250ZXh0OyAiCisJCSAgICAgICAicmMgPSBbJWRdLiBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfIgorCQkgICAgICAgImVuY3J5cHRpb25fa2V5ID0gWzB4JXBdOyBtb3VudF9jcnlwdF9zdGF0LT4iCisJCSAgICAgICAiZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9IFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHJjLAorCQkgICAgICAgcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdF9pdigmcy0+ZGVzYywgJnMtPmRzdF9zZywgJnMtPnNyY19zZywKKwkJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBmaWxlbmFtZTsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkgPSAwOworCXdoaWxlIChzLT5kZWNyeXB0ZWRfZmlsZW5hbWVbcy0+aV0gIT0gJ1wwJworCSAgICAgICAmJiBzLT5pIDwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKQorCQlzLT5pKys7CisJaWYgKHMtPmkgPT0gcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHRhZyA3MCBwYWNrZXQ7IGNvdWxkIG5vdCAiCisJCSAgICAgICAiZmluZCB2YWxpZCBzZXBhcmF0b3IgYmV0d2VlbiByYW5kb20gY2hhcmFjdGVycyBhbmQgIgorCQkgICAgICAgInRoZSBmaWxlbmFtZVxuIiwgX19mdW5jX18pOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pKys7CisJKCpmaWxlbmFtZV9zaXplKSA9IChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgLSBzLT5pKTsKKwlpZiAoISgoKmZpbGVuYW1lX3NpemUpID4gMCAmJiAoKmZpbGVuYW1lX3NpemUgPCBQQVRIX01BWCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaWxlbmFtZSBzaXplIGlzIFslemRdLCB3aGljaCBpcyAiCisJCSAgICAgICAiaW52YWxpZFxuIiwgX19mdW5jX18sICgqZmlsZW5hbWVfc2l6ZSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwkoKmZpbGVuYW1lKSA9IGttYWxsb2MoKCgqZmlsZW5hbWVfc2l6ZSkgKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoKmZpbGVuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJrbWFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICgoKmZpbGVuYW1lX3NpemUpICsgMSkpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfdW5sb2NrOworCX0KKwltZW1jcHkoKCpmaWxlbmFtZSksICZzLT5kZWNyeXB0ZWRfZmlsZW5hbWVbcy0+aV0sICgqZmlsZW5hbWVfc2l6ZSkpOworCSgqZmlsZW5hbWUpWygqZmlsZW5hbWVfc2l6ZSldID0gJ1wwJzsKK291dF9mcmVlX3VubG9jazoKKwlrZnJlZShzLT5kZWNyeXB0ZWRfZmlsZW5hbWUpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2socy0+dGZtX211dGV4KTsKK291dDoKKwlpZiAocmMpIHsKKwkJKCpwYWNrZXRfc2l6ZSkgPSAwOworCQkoKmZpbGVuYW1lX3NpemUpID0gMDsKKwkJKCpmaWxlbmFtZSkgPSBOVUxMOworCX0KKwlrZnJlZShzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKIGVjcnlwdGZzX2dldF9hdXRoX3Rva19zaWcoY2hhciAqKnNpZywgc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaykKIHsKIAlpbnQgcmMgPSAwOwpAQCAtODk3LDMwICsxNDcxLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbmRfZ2xvYmFsX2F1dGhfdG9rX2Zvcl9zaWcoCi0Jc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqKmdsb2JhbF9hdXRoX3RvaywKLQlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwgY2hhciAqc2lnKQotewotCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKndhbGtlcjsKLQlpbnQgcmMgPSAwOwotCi0JKCpnbG9iYWxfYXV0aF90b2spID0gTlVMTDsKLQltdXRleF9sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWxrZXIsCi0JCQkgICAgJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0LAotCQkJICAgIG1vdW50X2NyeXB0X3N0YXRfbGlzdCkgewotCQlpZiAobWVtY21wKHdhbGtlci0+c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCkgPT0gMCkgewotCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JcmMgPSAtRUlOVkFMOwotb3V0OgotCW11dGV4X3VubG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQogLyoqCiAgKiBlY3J5cHRmc192ZXJpZnlfdmVyc2lvbgogICogQHZlcnNpb246IFRoZSB2ZXJzaW9uIG51bWJlciB0byBjb25maXJtCkBAIC05OTAsNDMgKzE1NDAsNiBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZwotICogQGF1dGhfdG9rOiBTZXQgdG8gdGhlIG1hdGNoaW5nIGF1dGhfdG9rOyBOVUxMIGlmIG5vdCBmb3VuZAotICogQGNyeXB0X3N0YXQ6IGlub2RlIGNyeXB0X3N0YXQgY3J5cHRvIGNvbnRleHQKLSAqIEBzaWc6IFNpZyBvZiBhdXRoX3RvayB0byBmaW5kCi0gKgotICogRm9yIG5vdywgdGhpcyBmdW5jdGlvbiBzaW1wbHkgbG9va3MgYXQgdGhlIHJlZ2lzdGVyZWQgYXV0aF90b2sncwotICogbGlua2VkIG9mZiB0aGUgbW91bnRfY3J5cHRfc3RhdCwgc28gYWxsIHRoZSBhdXRoX3Rva3MgdGhhdCBjYW4gYmUKLSAqIHVzZWQgbXVzdCBiZSByZWdpc3RlcmVkIGF0IG1vdW50IHRpbWUuIFRoaXMgZnVuY3Rpb24gY291bGQKLSAqIHBvdGVudGlhbGx5IHRyeSBhIGxvdCBoYXJkZXIgdG8gZmluZCBhdXRoX3RvaydzIChlLmcuLCBieSBjYWxsaW5nCi0gKiBvdXQgdG8gZWNyeXB0ZnNkIHRvIGR5bmFtaWNhbGx5IHJldHJpZXZlIGFuIGF1dGhfdG9rIG9iamVjdCkgc28KLSAqIHRoYXQgc3RhdGljIHJlZ2lzdHJhdGlvbiBvZiBhdXRoX3RvaydzIHdpbGwgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeS4KLSAqCi0gKiBSZXR1cm5zIHplcm8gb24gbm8gZXJyb3I7IG5vbi16ZXJvIG9uIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQKLWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygKLQlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKiphdXRoX3RvaywKLQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwgY2hhciAqc2lnKQotewotCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0KLQkJY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdDsKLQlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICpnbG9iYWxfYXV0aF90b2s7Ci0JaW50IHJjID0gMDsKLQotCSgqYXV0aF90b2spID0gTlVMTDsKLQlpZiAoZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygmZ2xvYmFsX2F1dGhfdG9rLAotCQkJCQkJICBtb3VudF9jcnlwdF9zdGF0LCBzaWcpKSB7Ci0JCXN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleTsKLQotCQlyYyA9IGVjcnlwdGZzX2tleXJpbmdfYXV0aF90b2tfZm9yX3NpZygmYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKLQkJCQkJCSAgICAgICBzaWcpOwotCX0gZWxzZQotCQkoKmF1dGhfdG9rKSA9IGdsb2JhbF9hdXRoX3Rvay0+Z2xvYmFsX2F1dGhfdG9rOwotCXJldHVybiByYzsKLX0KLQotLyoqCiAgKiBkZWNyeXB0X3Bhc3NwaHJhc2VfZW5jcnlwdGVkX3Nlc3Npb25fa2V5IC0gRGVjcnlwdCB0aGUgc2Vzc2lvbiBrZXkgd2l0aCB0aGUgZ2l2ZW4gYXV0aF90b2suCiAgKiBAYXV0aF90b2s6IFRoZSBwYXNzcGhyYXNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHVzZSB0byBlbmNyeXB0IHRoZSBGRUsKICAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CkBAIC0xMjU2LDcgKzE3NjksOCBAQAogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfd2lwZV9saXN0OwogCQl9Ci0JCWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygmbWF0Y2hpbmdfYXV0aF90b2ssIGNyeXB0X3N0YXQsCisJCWVjcnlwdGZzX2ZpbmRfYXV0aF90b2tfZm9yX3NpZygmbWF0Y2hpbmdfYXV0aF90b2ssCisJCQkJCSAgICAgICBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LAogCQkJCQkgICAgICAgY2FuZGlkYXRlX2F1dGhfdG9rX3NpZyk7CiAJCWlmIChtYXRjaGluZ19hdXRoX3RvaykgewogCQkJZm91bmRfYXV0aF90b2sgPSAxOwpAQCAtMTMzNiw3ICsxODUwLDkgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IHdyaXRlX3RhZ182Nl9wYWNrZXQoYXV0aF90b2stPnRva2VuLnByaXZhdGVfa2V5LnNpZ25hdHVyZSwKLQkJCQkgZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjcnlwdF9zdGF0KSwKKwkJCQkgZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZygKKwkJCQkJIGNyeXB0X3N0YXQtPmNpcGhlciwKKwkJCQkJIGNyeXB0X3N0YXQtPmtleV9zaXplKSwKIAkJCQkgY3J5cHRfc3RhdCwgJnBheWxvYWQsICZwYXlsb2FkX2xlbik7CiAJaWYgKHJjKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGdlbmVyYXRpbmcgdGFnIDY2IHBhY2tldFxuIik7CkBAIC0xNjk2LDcgKzIyMTIsOCBAQAogCWRlc3RbKCpwYWNrZXRfc2l6ZSkrK10gPSAweDA0OyAvKiB2ZXJzaW9uIDQgKi8KIAkvKiBUT0RPOiBCcmVhayBmcm9tIFJGQzI0NDAgc28gdGhhdCBhcmJpdHJhcnkgY2lwaGVycyBjYW4gYmUKIAkgKiBzcGVjaWZpZWQgd2l0aCBzdHJpbmdzICovCi0JY2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQpOworCWNpcGhlcl9jb2RlID0gZWNyeXB0ZnNfY29kZV9mb3JfY2lwaGVyX3N0cmluZyhjcnlwdF9zdGF0LT5jaXBoZXIsCisJCQkJCQkgICAgICBjcnlwdF9zdGF0LT5rZXlfc2l6ZSk7CiAJaWYgKGNpcGhlcl9jb2RlID09IDApIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIlVuYWJsZSB0byBnZW5lcmF0ZSBjb2RlIGZvciAiCiAJCQkJImNpcGhlciBbJXNdXG4iLCBjcnlwdF9zdGF0LT5jaXBoZXIpOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWFpbi5jIGIvZnMvZWNyeXB0ZnMvbWFpbi5jCmluZGV4IGZkNjMwNzEuLjc4OWNmMmUgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTIwNiw3ICsyMDYsOSBAQAogICAgICAgIGVjcnlwdGZzX29wdF9jaXBoZXIsIGVjcnlwdGZzX29wdF9lY3J5cHRmc19jaXBoZXIsCiAgICAgICAgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2tleV9ieXRlcywKICAgICAgICBlY3J5cHRmc19vcHRfcGFzc3Rocm91Z2gsIGVjcnlwdGZzX29wdF94YXR0cl9tZXRhZGF0YSwKLSAgICAgICBlY3J5cHRmc19vcHRfZW5jcnlwdGVkX3ZpZXcsIGVjcnlwdGZzX29wdF9lcnIgfTsKKyAgICAgICBlY3J5cHRmc19vcHRfZW5jcnlwdGVkX3ZpZXcsIGVjcnlwdGZzX29wdF9mbmVrX3NpZywKKyAgICAgICBlY3J5cHRmc19vcHRfZm5fY2lwaGVyLCBlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlcywKKyAgICAgICBlY3J5cHRmc19vcHRfZXJyIH07CiAKIHN0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKIAl7ZWNyeXB0ZnNfb3B0X3NpZywgInNpZz0lcyJ9LApAQCAtMjE3LDYgKzIxOSw5IEBACiAJe2VjcnlwdGZzX29wdF9wYXNzdGhyb3VnaCwgImVjcnlwdGZzX3Bhc3N0aHJvdWdoIn0sCiAJe2VjcnlwdGZzX29wdF94YXR0cl9tZXRhZGF0YSwgImVjcnlwdGZzX3hhdHRyX21ldGFkYXRhIn0sCiAJe2VjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgImVjcnlwdGZzX2VuY3J5cHRlZF92aWV3In0sCisJe2VjcnlwdGZzX29wdF9mbmVrX3NpZywgImVjcnlwdGZzX2ZuZWtfc2lnPSVzIn0sCisJe2VjcnlwdGZzX29wdF9mbl9jaXBoZXIsICJlY3J5cHRmc19mbl9jaXBoZXI9JXMifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMsICJlY3J5cHRmc19mbl9rZXlfYnl0ZXM9JXUifSwKIAl7ZWNyeXB0ZnNfb3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTI4MSw4ICsyODYsMTEgQEAKIAlpbnQgcmMgPSAwOwogCWludCBzaWdfc2V0ID0gMDsKIAlpbnQgY2lwaGVyX25hbWVfc2V0ID0gMDsKKwlpbnQgZm5fY2lwaGVyX25hbWVfc2V0ID0gMDsKIAlpbnQgY2lwaGVyX2tleV9ieXRlczsKIAlpbnQgY2lwaGVyX2tleV9ieXRlc19zZXQgPSAwOworCWludCBmbl9jaXBoZXJfa2V5X2J5dGVzOworCWludCBmbl9jaXBoZXJfa2V5X2J5dGVzX3NldCA9IDA7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQogCQkmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKHNiKS0+bW91bnRfY3J5cHRfc3RhdDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CkBAIC0yOTAsNyArMjk4LDEyIEBACiAJY2hhciAqc2lnX3NyYzsKIAljaGFyICpjaXBoZXJfbmFtZV9kc3Q7CiAJY2hhciAqY2lwaGVyX25hbWVfc3JjOworCWNoYXIgKmZuX2NpcGhlcl9uYW1lX2RzdDsKKwljaGFyICpmbl9jaXBoZXJfbmFtZV9zcmM7CisJY2hhciAqZm5la19kc3Q7CisJY2hhciAqZm5la19zcmM7CiAJY2hhciAqY2lwaGVyX2tleV9ieXRlc19zcmM7CisJY2hhciAqZm5fY2lwaGVyX2tleV9ieXRlc19zcmM7CiAKIAlpZiAoIW9wdGlvbnMpIHsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtMzIyLDEwICszMzUsNyBAQAogCQkJCWdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lOwogCQkJc3RybmNweShjaXBoZXJfbmFtZV9kc3QsIGNpcGhlcl9uYW1lX3NyYywKIAkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSk7Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywKLQkJCQkJIlRoZSBtb3VudF9jcnlwdF9zdGF0ICIKLQkJCQkJImdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lIHNldCB0bzogIgotCQkJCQkiWyVzXVxuIiwgY2lwaGVyX25hbWVfZHN0KTsKKwkJCWNpcGhlcl9uYW1lX2RzdFtFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRV0gPSAnXDAnOwogCQkJY2lwaGVyX25hbWVfc2V0ID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9lY3J5cHRmc19rZXlfYnl0ZXM6CkBAIC0zMzUsMTEgKzM0NSw2IEBACiAJCQkJCQkgICAmY2lwaGVyX2tleV9ieXRlc19zcmMsIDApOwogCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0KIAkJCQljaXBoZXJfa2V5X2J5dGVzOwotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsCi0JCQkJCSJUaGUgbW91bnRfY3J5cHRfc3RhdCAiCi0JCQkJCSJnbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgIgotCQkJCQkic2V0IHRvOiBbJWRdXG4iLCBtb3VudF9jcnlwdF9zdGF0LT4KLQkJCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplKTsKIAkJCWNpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9wYXNzdGhyb3VnaDoKQEAgLTM1NiwxMSArMzYxLDUxIEBACiAJCQltb3VudF9jcnlwdF9zdGF0LT5mbGFncyB8PQogCQkJCUVDUllQVEZTX0VOQ1JZUFRFRF9WSUVXX0VOQUJMRUQ7CiAJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5la19zaWc6CisJCQlmbmVrX3NyYyA9IGFyZ3NbMF0uZnJvbTsKKwkJCWZuZWtfZHN0ID0KKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZzsKKwkJCXN0cm5jcHkoZm5la19kc3QsIGZuZWtfc3JjLCBFQ1JZUFRGU19TSUdfU0laRV9IRVgpOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWdbCisJCQkJRUNSWVBURlNfU0lHX1NJWkVfSEVYXSA9ICdcMCc7CisJCQlyYyA9IGVjcnlwdGZzX2FkZF9nbG9iYWxfYXV0aF90b2soCisJCQkJbW91bnRfY3J5cHRfc3RhdCwKKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZyk7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgIgorCQkJCSAgICAgICAiZ2xvYmFsIGZuZWsgc2lnIFslc107IHJjID0gWyVkXVxuIiwKKwkJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsCisJCQkJICAgICAgIHJjKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW1vdW50X2NyeXB0X3N0YXQtPmZsYWdzIHw9CisJCQkJKEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUworCQkJCSB8IEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSyk7CisJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5fY2lwaGVyOgorCQkJZm5fY2lwaGVyX25hbWVfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5fY2lwaGVyX25hbWVfZHN0ID0KKwkJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZTsKKwkJCXN0cm5jcHkoZm5fY2lwaGVyX25hbWVfZHN0LCBmbl9jaXBoZXJfbmFtZV9zcmMsCisJCQkJRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUpOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWVbCisJCQkJRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkVdID0gJ1wwJzsKKwkJCWZuX2NpcGhlcl9uYW1lX3NldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlczoKKwkJCWZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5fY2lwaGVyX2tleV9ieXRlcyA9CisJCQkJKGludClzaW1wbGVfc3RydG9sKGZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjLAorCQkJCQkJICAgJmZuX2NpcGhlcl9rZXlfYnl0ZXNfc3JjLCAwKTsKKwkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPQorCQkJCWZuX2NpcGhlcl9rZXlfYnl0ZXM7CisJCQlmbl9jaXBoZXJfa2V5X2J5dGVzX3NldCA9IDE7CisJCQlicmVhazsKIAkJY2FzZSBlY3J5cHRmc19vcHRfZXJyOgogCQlkZWZhdWx0OgotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywKLQkJCQkJImVDcnlwdGZzOiB1bnJlY29nbml6ZWQgb3B0aW9uICclcydcbiIsCi0JCQkJCXApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogZUNyeXB0ZnM6IHVucmVjb2duaXplZCBvcHRpb24gWyVzXVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgcCk7CiAJCX0KIAl9CiAJaWYgKCFzaWdfc2V0KSB7CkBAIC0zNzQsMzMgKzQxOSw2MCBAQAogCQlpbnQgY2lwaGVyX25hbWVfbGVuID0gc3RybGVuKEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSKTsKIAogCQlCVUdfT04oY2lwaGVyX25hbWVfbGVuID49IEVDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFKTsKLQogCQlzdHJjcHkobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCiAJCSAgICAgICBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUik7CiAJfQotCWlmICghY2lwaGVyX2tleV9ieXRlc19zZXQpIHsKKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZm5fY2lwaGVyX25hbWVfc2V0KQorCQlzdHJjcHkobW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSk7CisJaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkKIAkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0gMDsKLQl9CisJaWYgKChtb3VudF9jcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykKKwkgICAgJiYgIWZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0KQorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzID0KKwkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZTsKIAltdXRleF9sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwogCWlmICghZWNyeXB0ZnNfdGZtX2V4aXN0cyhtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKLQkJCQkgTlVMTCkpCisJCQkJIE5VTEwpKSB7CiAJCXJjID0gZWNyeXB0ZnNfYWRkX25ld19rZXlfdGZtKAogCQkJTlVMTCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCiAJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUpOwotCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgY2lwaGVyIHdpdGggIgotCQkgICAgICAgIm5hbWUgPSBbJXNdIGFuZCBrZXkgc2l6ZSA9IFsldGRdOyByYyA9IFslZF1cbiIsCi0JCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKLQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplICIKKwkJCSAgICAgICAiY2lwaGVyIHdpdGggbmFtZSA9IFslc10gYW5kIGtleSBzaXplID0gWyV0ZF07ICIKKwkJCSAgICAgICAicmMgPSBbJWRdXG4iLAorCQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAorCQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwKKwkJCSAgICAgICByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZWNyeXB0ZnNfdGZtX2V4aXN0cygKKwkJICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLCBOVUxMKSkgeworCQlyYyA9IGVjcnlwdGZzX2FkZF9uZXdfa2V5X3RmbSgKKwkJCU5VTEwsIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLAorCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgorCQkJICAgICAgICJjaXBoZXIgd2l0aCBuYW1lID0gWyVzXSBhbmQga2V5IHNpemUgPSBbJXRkXTsgIgorCQkJICAgICAgICJyYyA9IFslZF1cbiIsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcywKKwkJCSAgICAgICByYyk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CiAJcmMgPSBlY3J5cHRmc19pbml0X2dsb2JhbF9hdXRoX3Rva3MobW91bnRfY3J5cHRfc3RhdCk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJPbmUgb3IgbW9yZSBnbG9iYWwgYXV0aCB0b2tzIGNvdWxkIG5vdCAiCiAJCSAgICAgICAicHJvcGVybHkgcmVnaXN0ZXI7IHJjID0gWyVkXVxuIiwgcmMpOwotCX0KIG91dDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCmluZGV4IDY5MTNmNzIuLjk2ZWY1MTQgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCisrKyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkoKmRhZW1vbikgPSBremFsbG9jKHNpemVvZigqKmRhZW1vbiksIEdGUF9LRVJORUwpOwogCWlmICghKCpkYWVtb24pKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslWmRdIGJ5dGVzIG9mICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslemRdIGJ5dGVzIG9mICIKIAkJICAgICAgICJHRlBfS0VSTkVMIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqKmRhZW1vbikpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MzUsNyArNDM1LDcgQEAKIAltc2dfY3R4LT5tc2cgPSBrbWFsbG9jKG1zZ19zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1zZ19jdHgtPm1zZykgewogCQlyYyA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBbJVpkXSBieXRlcyBvZiAiCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBbJXpkXSBieXRlcyBvZiAiCiAJCSAgICAgICAiR0ZQX0tFUk5FTCBtZW1vcnlcbiIsIF9fZnVuY19fLCBtc2dfc2l6ZSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL21pc2NkZXYuYyBiL2ZzL2VjcnlwdGZzL21pc2NkZXYuYwppbmRleCBlZmQ5NWEwLi5hNjdmZWE2IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9taXNjZGV2LmMKKysrIGIvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJaWYgKCFtc2dfY3R4LT5tc2cpIHsKIAkJCXJjID0gLUVOT01FTTsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgotCQkJICAgICAgICJ0byBrbWFsbG9jKCVaZCwgR0ZQX0tFUk5FTClcbiIsIF9fZnVuY19fLAorCQkJICAgICAgICJ0byBrbWFsbG9jKCV6ZCwgR0ZQX0tFUk5FTClcbiIsIF9fZnVuY19fLAogCQkJICAgICAgIChzaXplb2YoKm1zZ19jdHgtPm1zZykgKyBkYXRhX3NpemUpKTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQpAQCAtMzIyLDcgKzMyMiw3IEBACiAJaWYgKGNvdW50IDwgdG90YWxfbGVuZ3RoKSB7CiAJCXJjID0gMDsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE9ubHkgZ2l2ZW4gdXNlciBidWZmZXIgb2YgIgotCQkgICAgICAgInNpemUgWyVaZF0sIGJ1dCB3ZSBuZWVkIFslWmRdIHRvIHJlYWQgdGhlICIKKwkJICAgICAgICJzaXplIFslemRdLCBidXQgd2UgbmVlZCBbJXpkXSB0byByZWFkIHRoZSAiCiAJCSAgICAgICAicGVuZGluZyBtZXNzYWdlXG4iLCBfX2Z1bmNfXywgY291bnQsIHRvdGFsX2xlbmd0aCk7CiAJCWdvdG8gb3V0X3VubG9ja19tc2dfY3R4OwogCX0KQEAgLTM3Niw3ICszNzYsNyBAQAogCiAJaWYgKChzaXplb2YoKm1zZykgKyBtc2ctPmRhdGFfbGVuKSAhPSBkYXRhX3NpemUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IChzaXplb2YoKm1zZykgKyBtc2ctPmRhdGFfbGVuKSA9ICIKLQkJICAgICAgICJbJVpkXTsgZGF0YV9zaXplID0gWyVaZF0uIEludmFsaWQgcGFja2V0LlxuIiwgX19mdW5jX18sCisJCSAgICAgICAiWyV6ZF07IGRhdGFfc2l6ZSA9IFslemRdLiBJbnZhbGlkIHBhY2tldC5cbiIsIF9fZnVuY19fLAogCQkgICAgICAgKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pLCBkYXRhX3NpemUpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtNDIxLDcgKzQyMSw3IEBACiAJZGF0YSA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKLQkJICAgICAgICJrbWFsbG9jKFslWmRdLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sIGNvdW50KTsKKwkJICAgICAgICJrbWFsbG9jKFslemRdLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sIGNvdW50KTsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gY29weV9mcm9tX3VzZXIoZGF0YSwgYnVmLCBjb3VudCk7CkBAIC00MzYsOCArNDM2LDggQEAKIAljYXNlIEVDUllQVEZTX01TR19SRVNQT05TRToKIAkJaWYgKGNvdW50IDwgKDEgKyA0ICsgMSArIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSkpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWluaW11bSBhY2NlcHRhYmxlIHBhY2tldCAiCi0JCQkgICAgICAgInNpemUgaXMgWyVaZF0sIGJ1dCBhbW91bnQgb2YgZGF0YSB3cml0dGVuIGlzICIKLQkJCSAgICAgICAib25seSBbJVpkXS4gRGlzY2FyZGluZyByZXNwb25zZSBwYWNrZXQuXG4iLAorCQkJICAgICAgICJzaXplIGlzIFslemRdLCBidXQgYW1vdW50IG9mIGRhdGEgd3JpdHRlbiBpcyAiCisJCQkgICAgICAgIm9ubHkgWyV6ZF0uIERpc2NhcmRpbmcgcmVzcG9uc2UgcGFja2V0LlxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywKIAkJCSAgICAgICAoMSArIDQgKyAxICsgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19tZXNzYWdlKSksCiAJCQkgICAgICAgY291bnQpOwpAQCAtNDU1LDkgKzQ1NSw5IEBACiAJCX0KIAkJaSArPSBwYWNrZXRfc2l6ZV9sZW5ndGg7CiAJCWlmICgoMSArIDQgKyBwYWNrZXRfc2l6ZV9sZW5ndGggKyBwYWNrZXRfc2l6ZSkgIT0gY291bnQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAoMSArIHBhY2tldF9zaXplX2xlbmd0aChbJVpkXSkiCi0JCQkgICAgICAgIiArIHBhY2tldF9zaXplKFslWmRdKSkoWyVaZF0pICE9ICIKLQkJCSAgICAgICAiY291bnQoWyVaZF0pLiBJbnZhbGlkIHBhY2tldCBmb3JtYXQuXG4iLAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICgxICsgcGFja2V0X3NpemVfbGVuZ3RoKFslemRdKSIKKwkJCSAgICAgICAiICsgcGFja2V0X3NpemUoWyV6ZF0pKShbJXpkXSkgIT0gIgorCQkJICAgICAgICJjb3VudChbJXpkXSkuIEludmFsaWQgcGFja2V0IGZvcm1hdC5cbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHBhY2tldF9zaXplX2xlbmd0aCwgcGFja2V0X3NpemUsCiAJCQkgICAgICAgKDEgKyBwYWNrZXRfc2l6ZV9sZW5ndGggKyBwYWNrZXRfc2l6ZSksIGNvdW50KTsKIAkJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggOWMzM2Y1NC4uNzFhNmVmZSAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtMjMyLDEzICsyMzIsMTMgQEAKIAogc3RhdGljIGludCBfX2Jwcm1fbW1faW5pdChzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewotCWludCBlcnIgPSAtRU5PTUVNOworCWludCBlcnI7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBOVUxMOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gYnBybS0+bW07CiAKIAlicHJtLT52bWEgPSB2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bWEpCi0JCWdvdG8gZXJyOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJdm1hLT52bV9tbSA9IG1tOwpAQCAtMjUxLDI4ICsyNTEsMjAgQEAKIAkgKi8KIAl2bWEtPnZtX2VuZCA9IFNUQUNLX1RPUF9NQVg7CiAJdm1hLT52bV9zdGFydCA9IHZtYS0+dm1fZW5kIC0gUEFHRV9TSVpFOwotCiAJdm1hLT52bV9mbGFncyA9IFZNX1NUQUNLX0ZMQUdTOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gdm1fZ2V0X3BhZ2VfcHJvdCh2bWEtPnZtX2ZsYWdzKTsKIAllcnIgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpOwotCWlmIChlcnIpIHsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJaWYgKGVycikKIAkJZ290byBlcnI7Ci0JfQogCiAJbW0tPnN0YWNrX3ZtID0gbW0tPnRvdGFsX3ZtID0gMTsKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQogCWJwcm0tPnAgPSB2bWEtPnZtX2VuZCAtIHNpemVvZih2b2lkICopOwotCiAJcmV0dXJuIDA7Ci0KIGVycjoKLQlpZiAodm1hKSB7Ci0JCWJwcm0tPnZtYSA9IE5VTEw7Ci0JCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKLQl9Ci0KKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlicHJtLT52bWEgPSBOVUxMOworCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNjk0LDcgKzE2ODYsNyBAQAogCXJldHVybiAocmV0ID49IDIpID8gMiA6IHJldDsKIH0KIAotaW50IGRvX2NvcmVkdW1wKGxvbmcgc2lnbnIsIGludCBleGl0X2NvZGUsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3ZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGNvcmVfc3RhdGUgY29yZV9zdGF0ZTsKIAljaGFyIGNvcmVuYW1lW0NPUkVOQU1FX01BWF9TSVpFICsgMV07CkBAIC0xNzc4LDYgKzE3NzAsMTEgQEAKIAogIAlpZiAoaXNwaXBlKSB7CiAJCWhlbHBlcl9hcmd2ID0gYXJndl9zcGxpdChHRlBfS0VSTkVMLCBjb3JlbmFtZSsxLCAmaGVscGVyX2FyZ2MpOworCQlpZiAoIWhlbHBlcl9hcmd2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWdvdG8gZmFpbF91bmxvY2s7CisJCX0KIAkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBvcHRpb24gKi8KIAkJZGVsaW1pdCA9IHN0cmNocihjb3JlbmFtZSwgJyAnKTsKIAkJaWYgKGRlbGltaXQpCkBAIC0xODQ1LDUgKzE4NDIsNSBAQAogCXB1dF9jcmVkKGNyZWQpOwogCWNvcmVkdW1wX2ZpbmlzaChtbSk7CiBmYWlsOgotCXJldHVybiByZXR2YWw7CisJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBiMDUzN2M4Li42YzQ2YzY0IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTIyNSwxMSArMTIyNSwxMSBAQAogfSB3aGlsZSAoMCkKIAogI2lmZGVmIENPTkZJR19TTVAKLS8qIEVhY2ggQ1BVIGNhbiBhY2N1bXVsYXRlIEZCQ19CQVRDSCBibG9ja3MgaW4gdGhlaXIgbG9jYWwKKy8qIEVhY2ggQ1BVIGNhbiBhY2N1bXVsYXRlIHBlcmNwdV9jb3VudGVyX2JhdGNoIGJsb2NrcyBpbiB0aGVpciBsb2NhbAogICogY291bnRlcnMuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnJlZSBibG9ja3MgbW9yZQotICogdGhhbiBGQkNfQkFUQ0ggICogbnJfY3B1X2lkcy4gQWxzbyBhZGQgYSB3aW5kb3cgb2YgNCB0aW1lcy4KKyAqIHRoYW4gcGVyY3B1X2NvdW50ZXJfYmF0Y2ggICogbnJfY3B1X2lkcy4gQWxzbyBhZGQgYSB3aW5kb3cgb2YgNCB0aW1lcy4KICAqLwotI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLICg0ICogKEZCQ19CQVRDSCAqIG5yX2NwdV9pZHMpKQorI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLICg0ICogKHBlcmNwdV9jb3VudGVyX2JhdGNoICogbnJfY3B1X2lkcykpCiAjZWxzZQogI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLIDAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDY3MDJhNDkuLjk4ZDNmZTcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTI0OTgsNyArMjQ5OCw3IEBACiAJLyoKIAkgKiBzd2l0Y2ggdG8gbm9uIGRlbGFsbG9jIG1vZGUgaWYgd2UgYXJlIHJ1bm5pbmcgbG93CiAJICogb24gZnJlZSBibG9jay4gVGhlIGZyZWUgYmxvY2sgYWNjb3VudGluZyB2aWEgcGVyY3B1Ci0JICogY291bnRlcnMgY2FuIGdldCBzbGlnaHRseSB3cm9uZyB3aXRoIEZCQ19CQVRDSCBnZXR0aW5nCisJICogY291bnRlcnMgY2FuIGdldCBzbGlnaHRseSB3cm9uZyB3aXRoIHBlcmNwdV9jb3VudGVyX2JhdGNoIGdldHRpbmcKIAkgKiBhY2N1bXVsYXRlZCBvbiBlYWNoIENQVSB3aXRob3V0IHVwZGF0aW5nIGdsb2JhbCBjb3VudGVycwogCSAqIERlbGFsbG9jIG5lZWQgYW4gYWNjdXJhdGUgZnJlZSBibG9jayBhY2NvdW50aW5nLiBTbyBzd2l0Y2gKIAkgKiB0byBub24gZGVsYWxsb2Mgd2hlbiB3ZSBhcmUgbmVhciB0byBlcnJvciByYW5nZS4KZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggZDBmZjBiOC4uZTVlYWE2MiAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTQyMSw5ICs0MjEsNiBAQAogICogSWYgd2UncmUgYSBwZGxmdXNoIHRocmVhZCwgdGhlbiBpbXBsZW1lbnQgcGRmbHVzaCBjb2xsaXNpb24gYXZvaWRhbmNlCiAgKiBhZ2FpbnN0IHRoZSBlbnRpcmUgbGlzdC4KICAqCi0gKiBXQl9TWU5DX0hPTEQgaXMgYSBoYWNrIGZvciBzeXNfc3luYygpOiByZWF0dGFjaCB0aGUgaW5vZGUgdG8gc2ItPnNfZGlydHkgc28KLSAqIHRoYXQgaXQgY2FuIGJlIGxvY2F0ZWQgZm9yIHdhaXRpbmcgb24gaW4gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKCkuCi0gKgogICogSWYgYGJkaScgaXMgbm9uLXplcm8gdGhlbiB3ZSdyZSBiZWluZyBhc2tlZCB0byB3cml0ZWJhY2sgYSBzcGVjaWZpYyBxdWV1ZS4KICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBibG9ja2RldiBzdXBlcmJsb2NrJ3MgaW5vZGVzIGFyZSBiYWNrZWQgYnkKICAqIGEgdmFyaWV0eSBvZiBxdWV1ZXMsIHNvIGFsbCBpbm9kZXMgYXJlIHNlYXJjaGVkLiAgRm9yIG90aGVyIHN1cGVyYmxvY2tzLApAQCAtNDQzLDYgKzQ0MCw3IEBACiAJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CS8qIGxpdmVsb2NrIGF2b2lkYW5jZSAqLworCWludCBzeW5jID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEw7CiAKIAlzcGluX2xvY2soJmlub2RlX2xvY2spOwogCWlmICghd2JjLT5mb3Jfa3VwZGF0ZSB8fCBsaXN0X2VtcHR5KCZzYi0+c19pbykpCkBAIC00OTksMTAgKzQ5Nyw2IEBACiAJCV9faWdldChpbm9kZSk7CiAJCXBhZ2VzX3NraXBwZWQgPSB3YmMtPnBhZ2VzX3NraXBwZWQ7CiAJCV9fd3JpdGViYWNrX3NpbmdsZV9pbm9kZShpbm9kZSwgd2JjKTsKLQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfSE9MRCkgewotCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7Ci0JCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7Ci0JCX0KIAkJaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpKQogCQkJd3JpdGViYWNrX3JlbGVhc2UoYmRpKTsKIAkJaWYgKHdiYy0+cGFnZXNfc2tpcHBlZCAhPSBwYWdlc19za2lwcGVkKSB7CkBAIC01MjMsNyArNTE3LDQ5IEBACiAJCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfbW9yZV9pbykpCiAJCQl3YmMtPm1vcmVfaW8gPSAxOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlpZiAoc3luYykgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDsKKworCQkvKgorCQkgKiBEYXRhIGludGVncml0eSBzeW5jLiBNdXN0IHdhaXQgZm9yIGFsbCBwYWdlcyB1bmRlciB3cml0ZWJhY2ssCisJCSAqIGJlY2F1c2UgdGhlcmUgbWF5IGhhdmUgYmVlbiBwYWdlcyBkaXJ0aWVkIGJlZm9yZSBvdXIgc3luYworCQkgKiBjYWxsLCBidXQgd2hpY2ggaGFkIHdyaXRlb3V0IHN0YXJ0ZWQgYmVmb3JlIHdlIHdyaXRlIGl0IG91dC4KKwkJICogSW4gd2hpY2ggY2FzZSwgdGhlIGlub2RlIG1heSBub3QgYmUgb24gdGhlIGRpcnR5IGxpc3QsIGJ1dAorCQkgKiB3ZSBzdGlsbCBoYXZlIHRvIHdhaXQgZm9yIHRoYXQgd3JpdGVvdXQuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKKwkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCisJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfV0lMTF9GUkVFKSkKKwkJCQljb250aW51ZTsKKwkJCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQkJaWYgKG1hcHBpbmctPm5ycGFnZXMgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCV9faWdldChpbm9kZSk7CisJCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCQkvKgorCQkJICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUKKwkJCSAqIGJlZW4gcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKKwkJCSAqIGlub2RlX2xvY2suICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbgorCQkJICogYmUgaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0CisJCQkgKiB1bmRlciBpbm9kZV9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQKKwkJCSAqIGl0IGxhdGVyLgorCQkJICovCisJCQlpcHV0KG9sZF9pbm9kZSk7CisJCQlvbGRfaW5vZGUgPSBpbm9kZTsKKworCQkJZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaXB1dChvbGRfaW5vZGUpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKIAlyZXR1cm47CQkvKiBMZWF2ZSBhbnkgdW53cml0dGVuIGlub2RlcyBvbiBzX2lvICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX3N5bmNfc2JfaW5vZGVzKTsKQEAgLTU4OCw4ICs2MjQsNyBAQAogCiAvKgogICogd3JpdGViYWNrIGFuZCB3YWl0IHVwb24gdGhlIGZpbGVzeXN0ZW0ncyBkaXJ0eSBpbm9kZXMuICBUaGUgY2FsbGVyIHdpbGwKLSAqIGRvIHRoaXMgaW4gdHdvIHBhc3NlcyAtIG9uZSB0byB3cml0ZSwgYW5kIG9uZSB0byB3YWl0LiAgV0JfU1lOQ19IT0xEIGlzCi0gKiB1c2VkIHRvIHBhcmsgdGhlIHdyaXR0ZW4gaW5vZGVzIG9uIHNiLT5zX2RpcnR5IGZvciB0aGUgd2FpdCBwYXNzLgorICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuCiAgKgogICogQSBmaW5pdGUgbGltaXQgaXMgc2V0IG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuLgogICogVG8gcHJldmVudCBpbmZpbml0ZSBsaXZlbG9jayBvZiBzeXNfc3luYygpLgpAQCAtNjAwLDMyICs2MzUsMjMgQEAKIHZvaWQgc3luY19pbm9kZXNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKLQkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfSE9MRCwKKwkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0CT0gMCwKIAkJLnJhbmdlX2VuZAk9IExMT05HX01BWCwKIAl9OwotCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKLQl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKTsKIAotCXdiYy5ucl90b193cml0ZSA9IG5yX2RpcnR5ICsgbnJfdW5zdGFibGUgKwotCQkJKGlub2Rlc19zdGF0Lm5yX2lub2RlcyAtIGlub2Rlc19zdGF0Lm5yX3VudXNlZCkgKwotCQkJbnJfZGlydHkgKyBucl91bnN0YWJsZTsKLQl3YmMubnJfdG9fd3JpdGUgKz0gd2JjLm5yX3RvX3dyaXRlIC8gMjsJCS8qIEJpdCBtb3JlIGZvciBsdWNrICovCisJaWYgKCF3YWl0KSB7CisJCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKTsKKwkJdW5zaWduZWQgbG9uZyBucl91bnN0YWJsZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX1VOU1RBQkxFX05GUyk7CisKKwkJd2JjLm5yX3RvX3dyaXRlID0gbnJfZGlydHkgKyBucl91bnN0YWJsZSArCisJCQkoaW5vZGVzX3N0YXQubnJfaW5vZGVzIC0gaW5vZGVzX3N0YXQubnJfdW51c2VkKTsKKwl9IGVsc2UKKwkJd2JjLm5yX3RvX3dyaXRlID0gTE9OR19NQVg7IC8qIGRvZXNuJ3QgYWN0dWFsbHkgbWF0dGVyICovCisKIAlzeW5jX3NiX2lub2RlcyhzYiwgJndiYyk7CiB9CiAKLS8qCi0gKiBSYXRoZXIgbGFtZSBsaXZlbG9jayBhdm9pZGFuY2UuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9zYl9zeW5jaW5nKGludCB2YWwpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKLQlzcGluX2xvY2soJnNiX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShzYiwgJnN1cGVyX2Jsb2Nrcywgc19saXN0KQotCQlzYi0+c19zeW5jaW5nID0gdmFsOwotCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKLX0KLQogLyoqCiAgKiBzeW5jX2lub2RlcyAtIHdyaXRlcyBhbGwgaW5vZGVzIHRvIGRpc2sKICAqIEB3YWl0OiB3YWl0IGZvciBjb21wbGV0aW9uCkBAIC02NTIsOSArNjc4LDYgQEAKIAlzcGluX2xvY2soJnNiX2xvY2spOwogcmVzdGFydDoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpIHsKLQkJaWYgKHNiLT5zX3N5bmNpbmcpCi0JCQljb250aW51ZTsKLQkJc2ItPnNfc3luY2luZyA9IDE7CiAJCXNiLT5zX2NvdW50Kys7CiAJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOwpAQCAtNjcyLDEzICs2OTUsMTAgQEAKIAogdm9pZCBzeW5jX2lub2RlcyhpbnQgd2FpdCkKIHsKLQlzZXRfc2Jfc3luY2luZygwKTsKIAlfX3N5bmNfaW5vZGVzKDApOwogCi0JaWYgKHdhaXQpIHsKLQkJc2V0X3NiX3N5bmNpbmcoMCk7CisJaWYgKHdhaXQpCiAJCV9fc3luY19pbm9kZXMoMSk7Ci0JfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggNGYzY2FiMy4uOTljOTlkZiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTQ4LDExICs0OCwxMyBAQAogCXNpemVfdCBzaXplOwogCiAJaWYgKCEqcHBvcykgeworCQlsb25nIHZhbHVlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfY3RsX2ZpbGVfY29ubl9nZXQoZmlsZSk7CiAJCWlmICghZmMpCiAJCQlyZXR1cm4gMDsKIAotCQlmaWxlLT5wcml2YXRlX2RhdGE9KHZvaWQgKikobG9uZylhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJdmFsdWUgPSBhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKil2YWx1ZTsKIAkJZnVzZV9jb25uX3B1dChmYyk7CiAJfQogCXNpemUgPSBzcHJpbnRmKHRtcCwgIiVsZFxuIiwgKGxvbmcpZmlsZS0+cHJpdmF0ZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGV2LmMgYi9mcy9mdXNlL2Rldi5jCmluZGV4IGZiYTU3MTYuLmUwYzdhZGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGV2LmMKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMjY5LDcgKzI2OSw3IEBACiAgKiBDYWxsZWQgd2l0aCBmYy0+bG9jaywgdW5sb2NrcyBpdAogICovCiBzdGF0aWMgdm9pZCByZXF1ZXN0X2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOwogCXJlcS0+ZW5kID0gTlVMTDsKQEAgLTI5MywxMyArMjkzLDEzIEBACiAJd2FrZV91cCgmcmVxLT53YWl0cSk7CiAJaWYgKGVuZCkKIAkJZW5kKGZjLCByZXEpOwotCWVsc2UKLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCB3YWl0X2Fuc3dlcl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAogCQkJCSAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0dXJuOwpAQCAtMzE3LDcgKzMxNyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdF9hbnN3ZXIoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCWlmICghZmMtPm5vX2ludGVycnVwdCkgewogCQkvKiBBbnkgc2lnbmFsIG1heSBpbnRlcnJ1cHQgdGhpcyAqLwpAQCAtMzgwLDcgKzM4MSw3IEBACiAJfQogfQogCi12b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwpAQCAtMzk5LDggKzQwMCw4IEBACiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCi0JCQkJICAgICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorc3RhdGljIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJICAgIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+YmFja2dyb3VuZCA9IDE7CiAJZmMtPm51bV9iYWNrZ3JvdW5kKys7CkBAIC00MTQsMTEgKzQxNSwxMSBAQAogCWZsdXNoX2JnX3F1ZXVlKGZjKTsKIH0KIAotc3RhdGljIHZvaWQgcmVxdWVzdF9zZW5kX25vd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdGF0aWMgdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlmIChmYy0+Y29ubmVjdGVkKSB7Ci0JCXJlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCX0gZWxzZSB7CiAJCXJlcS0+b3V0LmguZXJyb3IgPSAtRU5PVENPTk47CkBAIC00MjYsMTYgKzQyNywxNiBAQAogCX0KIH0KIAotdm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDA7Ci0JcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CiB9CiAKLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwotCXJlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOwogfQogCiAvKgpAQCAtNDQzLDEwICs0NDQsMTEgQEAKICAqCiAgKiBmYy0+Y29ubmVjdGVkIG11c3QgaGF2ZSBiZWVuIGNoZWNrZWQgcHJldmlvdXNseQogICovCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5pc3JlcGx5ID0gMTsKLQlyZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOwogfQogCiAvKgpAQCAtNTM5LDggKzU0MSw4IEBACiAJCUJVR19PTighY3MtPm5yX3NlZ3MpOwogCQljcy0+c2VnbGVuID0gY3MtPmlvdlswXS5pb3ZfbGVuOwogCQljcy0+YWRkciA9ICh1bnNpZ25lZCBsb25nKSBjcy0+aW92WzBdLmlvdl9iYXNlOwotCQljcy0+aW92ICsrOwotCQljcy0+bnJfc2VncyAtLTsKKwkJY3MtPmlvdisrOworCQljcy0+bnJfc2Vncy0tOwogCX0KIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZXJyID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGNzLT5hZGRyLCAxLCBjcy0+d3JpdGUsIDAsCkBAIC01ODksOSArNTkxLDExIEBACiAJCWt1bm1hcF9hdG9taWMobWFwYWRkciwgS01fVVNFUjEpOwogCX0KIAl3aGlsZSAoY291bnQpIHsKLQkJaW50IGVycjsKLQkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQotCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFjcy0+bGVuKSB7CisJCQlpbnQgZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCWlmIChwYWdlKSB7CiAJCQl2b2lkICptYXBhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOwogCQkJdm9pZCAqYnVmID0gbWFwYWRkciArIG9mZnNldDsKQEAgLTYzMSw5ICs2MzUsMTEgQEAKIHN0YXRpYyBpbnQgZnVzZV9jb3B5X29uZShzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywgdm9pZCAqdmFsLCB1bnNpZ25lZCBzaXplKQogewogCXdoaWxlIChzaXplKSB7Ci0JCWludCBlcnI7Ci0JCWlmICghY3MtPmxlbiAmJiAoZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpKSkKLQkJCXJldHVybiBlcnI7CisJCWlmICghY3MtPmxlbikgeworCQkJaW50IGVyciA9IGZ1c2VfY29weV9maWxsKGNzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCQlmdXNlX2NvcHlfZG8oY3MsICZ2YWwsICZzaXplKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC02NjQsNiArNjcwLDggQEAKIAogLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3Rfd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTY5MSw3ICs2OTksNyBAQAogICovCiBzdGF0aWMgaW50IGZ1c2VfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQogewogCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CiAJc3RydWN0IGZ1c2VfaW5faGVhZGVyIGloOwpAQCAtODEzLDYgKzgyMSwzNCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9ub3RpZnlfcG9sbChzdHJ1Y3QgZnVzZV9jb25uICpmYywgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCBvdXRhcmc7CisJaW50IGVycjsKKworCWlmIChzaXplICE9IHNpemVvZihvdXRhcmcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZvdXRhcmcsIHNpemVvZihvdXRhcmcpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKGZjLCAmb3V0YXJnKTsKK30KKworc3RhdGljIGludCBmdXNlX25vdGlmeShzdHJ1Y3QgZnVzZV9jb25uICpmYywgZW51bSBmdXNlX25vdGlmeV9jb2RlIGNvZGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBGVVNFX05PVElGWV9QT0xMOgorCQlyZXR1cm4gZnVzZV9ub3RpZnlfcG9sbChmYywgc2l6ZSwgY3MpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiAvKiBMb29rIHVwIHJlcXVlc3Qgb24gcHJvY2Vzc2luZyBsaXN0IGJ5IHVuaXF1ZSBJRCAqLwogc3RhdGljIHN0cnVjdCBmdXNlX3JlcSAqcmVxdWVzdF9maW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQgdW5pcXVlKQogewpAQCAtODc2LDkgKzkxMiwyMyBAQAogCWVyciA9IGZ1c2VfY29weV9vbmUoJmNzLCAmb2gsIHNpemVvZihvaCkpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZpbmlzaDsKKwogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKCFvaC51bmlxdWUgfHwgb2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwIHx8Ci0JICAgIG9oLmxlbiAhPSBuYnl0ZXMpCisJaWYgKG9oLmxlbiAhPSBuYnl0ZXMpCisJCWdvdG8gZXJyX2ZpbmlzaDsKKworCS8qCisJICogWmVybyBvaC51bmlxdWUgaW5kaWNhdGVzIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBtZXNzYWdlCisJICogYW5kIGVycm9yIGNvbnRhaW5zIG5vdGlmaWNhdGlvbiBjb2RlLgorCSAqLworCWlmICghb2gudW5pcXVlKSB7CisJCWVyciA9IGZ1c2Vfbm90aWZ5KGZjLCBvaC5lcnJvciwgbmJ5dGVzIC0gc2l6ZW9mKG9oKSwgJmNzKTsKKwkJZnVzZV9jb3B5X2ZpbmlzaCgmY3MpOworCQlyZXR1cm4gZXJyID8gZXJyIDogbmJ5dGVzOworCX0KKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG9oLmVycm9yIDw9IC0xMDAwIHx8IG9oLmVycm9yID4gMCkKIAkJZ290byBlcnJfZmluaXNoOwogCiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CkBAIC05NjYsNiArMTAxNiw4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFuZCByZWFjcXVpcmVzIGZjLT5sb2NrCiAgKi8KIHN0YXRpYyB2b2lkIGVuZF9yZXF1ZXN0cyhzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwpAQCAtOTg4LDcgKzEwNDAsOCBAQAogICogbG9ja2VkKS4KICAqLwogc3RhdGljIHZvaWQgZW5kX2lvX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQotCV9fcmVsZWFzZXMoZmMtPmxvY2spIF9fYWNxdWlyZXMoZmMtPmxvY2spCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCXdoaWxlICghbGlzdF9lbXB0eSgmZmMtPmlvKSkgewogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9CkBAIC0xMDAyLDExICsxMDU1LDExIEBACiAJCXdha2VfdXAoJnJlcS0+d2FpdHEpOwogCQlpZiAoZW5kKSB7CiAJCQlyZXEtPmVuZCA9IE5VTEw7Ci0JCQkvKiBUaGUgZW5kIGZ1bmN0aW9uIHdpbGwgY29uc3VtZSB0aGlzIHJlZmVyZW5jZSAqLwogCQkJX19mdXNlX2dldF9yZXF1ZXN0KHJlcSk7CiAJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQkJd2FpdF9ldmVudChyZXEtPndhaXRxLCAhcmVxLT5sb2NrZWQpOwogCQkJZW5kKGZjLCByZXEpOworCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggOTViYzIyYi4uZmRmZjM0NiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0xODksNyArMTg5LDcgQEAKIAkJcGFyZW50ID0gZGdldF9wYXJlbnQoZW50cnkpOwogCQlmdXNlX2xvb2t1cF9pbml0KGZjLCByZXEsIGdldF9ub2RlX2lkKHBhcmVudC0+ZF9pbm9kZSksCiAJCQkJICZlbnRyeS0+ZF9uYW1lLCAmb3V0YXJnKTsKLQkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAkJZHB1dChwYXJlbnQpOwogCQllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQkJCWZpLT5ubG9va3VwICsrOworCQkJZmktPm5sb29rdXArKzsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CkBAIC0yODMsNyArMjgzLDcgQEAKIAlhdHRyX3ZlcnNpb24gPSBmdXNlX2dldF9hdHRyX3ZlcnNpb24oZmMpOwogCiAJZnVzZV9sb29rdXBfaW5pdChmYywgcmVxLCBub2RlaWQsIG5hbWUsIG91dGFyZyk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkvKiBaZXJvIG5vZGVpZCBpcyBzYW1lIGFzIC1FTk9FTlQsIGJ1dCB3aXRoIHZhbGlkIHRpbWVvdXQgKi8KQEAgLTM2OSw3ICszNjksNyBAQAogewogCWZ1c2VfcmVsZWFzZV9maWxsKGZmLCBub2RlaWQsIGZsYWdzLCBGVVNFX1JFTEVBU0UpOwogCWZmLT5yZXNlcnZlZF9yZXEtPmZvcmNlID0gMTsKLQlyZXF1ZXN0X3NlbmQoZmMsIGZmLT5yZXNlcnZlZF9yZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmZi0+cmVzZXJ2ZWRfcmVxKTsKIAlrZnJlZShmZik7CiB9CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAllcnIgPSAtRU5PTUVNOwotCWZmID0gZnVzZV9maWxlX2FsbG9jKCk7CisJZmYgPSBmdXNlX2ZpbGVfYWxsb2MoZmMpOwogCWlmICghZmYpCiAJCWdvdG8gb3V0X3B1dF9yZXF1ZXN0OwogCkBAIC00MzIsNyArNDMyLDcgQEAKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGVudHJ5OwogCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IHNpemVvZihvdXRvcGVuKTsKIAlyZXEtPm91dC5hcmdzWzFdLnZhbHVlID0gJm91dG9wZW47Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FTk9TWVMpCkBAIC01MDIsNyArNTAyLDcgQEAKIAllbHNlCiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVycikKQEAgLTYzMSwxNSArNjMxLDE3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPmRfaW5vZGU7CiAKLQkJLyogU2V0IG5saW5rIHRvIHplcm8gc28gdGhlIGlub2RlIGNhbiBiZSBjbGVhcmVkLCBpZgotICAgICAgICAgICAgICAgICAgIHRoZSBpbm9kZSBkb2VzIGhhdmUgbW9yZSBsaW5rcyB0aGlzIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0IGxvb2t1cC9nZXRhdHRyICovCisJCS8qCisJCSAqIFNldCBubGluayB0byB6ZXJvIHNvIHRoZSBpbm9kZSBjYW4gYmUgY2xlYXJlZCwgaWYgdGhlIGlub2RlCisJCSAqIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZSBkaXNjb3ZlcmVkIGF0IHRoZSBuZXh0CisJCSAqIGxvb2t1cC9nZXRhdHRyLgorCQkgKi8KIAkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CiAJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CkBAIC02NjIsNyArNjY0LDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKSB7CkBAIC02OTUsNyArNjk3LDcgQEAKIAlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBvbGRlbnQtPmRfbmFtZS5uYW1lOwogCXJlcS0+aW4uYXJnc1syXS5zaXplID0gbmV3ZW50LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSBuZXdlbnQtPmRfbmFtZS5uYW1lOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpIHsKQEAgLTgxMSw3ICs4MTMsNyBAQAogCWVsc2UKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewpAQCAtOTExLDcgKzkxMyw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0xMDMzLDcgKzEwMzUsNyBAQAogCXJlcS0+bnVtX3BhZ2VzID0gMTsKIAlyZXEtPnBhZ2VzWzBdID0gcGFnZTsKIAlmdXNlX3JlYWRfZmlsbChyZXEsIGZpbGUsIGlub2RlLCBmaWxlLT5mX3BvcywgUEFHRV9TSVpFLCBGVVNFX1JFQURESVIpOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAluYnl0ZXMgPSByZXEtPm91dC5hcmdzWzBdLnNpemU7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwpAQCAtMTA2Nyw3ICsxMDY5LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBQQUdFX1NJWkUgLSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBsaW5rOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAlpZiAocmVxLT5vdXQuaC5lcnJvcikgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxpbmspOwogCQlsaW5rID0gRVJSX1BUUihyZXEtPm91dC5oLmVycm9yKTsKQEAgLTEyNzMsNyArMTI3NSw3IEBACiAJZWxzZQogCQlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIpIHsKQEAgLTEzNjcsNyArMTM2OSw3IEBACiAJcmVxLT5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKIAlyZXEtPmluLmFyZ3NbMl0uc2l6ZSA9IHNpemU7CiAJcmVxLT5pbi5hcmdzWzJdLnZhbHVlID0gdmFsdWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTE0MTMsNyArMTQxNSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0NjMsNyArMTQ2NSw3IEBACiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCQlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKIAl9Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCXJldCA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemUgPyByZXEtPm91dC5hcmdzWzBdLnNpemUgOiBvdXRhcmcuc2l6ZTsKQEAgLTE0OTYsNyArMTQ5OCw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gbmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykgewpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA0YzllZTcwLi5lODE2MjY0IDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMzksMTQgKzM5LDE0IEBACiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKCpvdXRhcmdwKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gb3V0YXJncDsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IGZ1c2VfZmlsZSAqZnVzZV9maWxlX2FsbG9jKHZvaWQpCitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJZmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVzZV9maWxlKSwgR0ZQX0tFUk5FTCk7CkBAIC01OCw3ICs1OCwxMiBAQAogCQl9IGVsc2UgewogCQkJSU5JVF9MSVNUX0hFQUQoJmZmLT53cml0ZV9lbnRyeSk7CiAJCQlhdG9taWNfc2V0KCZmZi0+Y291bnQsIDApOworCQkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJCQlmZi0+a2ggPSArK2ZjLT5raGN0cjsKKwkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KKwkJUkJfQ0xFQVJfTk9ERSgmZmYtPnBvbGxlZF9ub2RlKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmYtPnBvbGxfd2FpdCk7CiAJfQogCXJldHVybiBmZjsKIH0KQEAgLTc5LDcgKzg0LDYgQEAKIHsKIAlkcHV0KHJlcS0+bWlzYy5yZWxlYXNlLmRlbnRyeSk7CiAJbW50cHV0KHJlcS0+bWlzYy5yZWxlYXNlLnZmc21vdW50KTsKLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2ZpbGVfcHV0KHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQpAQCAtODksNyArOTMsNyBAQAogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVxLT5taXNjLnJlbGVhc2UuZGVudHJ5LT5kX2lub2RlOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCQlyZXEtPmVuZCA9IGZ1c2VfcmVsZWFzZV9lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCQlrZnJlZShmZik7CiAJfQogfQpAQCAtMTA5LDYgKzExMyw3IEBACiAKIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpCiB7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRhcmc7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CiAJaW50IGVycjsKQEAgLTEyMSw3ICsxMjYsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlmZiA9IGZ1c2VfZmlsZV9hbGxvYygpOworCWZmID0gZnVzZV9maWxlX2FsbG9jKGZjKTsKIAlpZiAoIWZmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY3LDcgKzE3MiwxMSBAQAogCiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQlsaXN0X2RlbCgmZmYtPndyaXRlX2VudHJ5KTsKKwkJaWYgKCFSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKQorCQkJcmJfZXJhc2UoJmZmLT5wb2xsZWRfbm9kZSwgJmZjLT5wb2xsZWRfZmlsZXMpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZmZi0+cG9sbF93YWl0KTsKIAkJLyoKIAkJICogTm9ybWFsbHkgdGhpcyB3aWxsIHNlbmQgdGhlIFJFTEVBU0UgcmVxdWVzdCwKIAkJICogaG93ZXZlciBpZiBzb21lIGFzeW5jaHJvbm91cyBSRUFEIG9yIFdSSVRFIHJlcXVlc3RzCkBAIC0yODAsNyArMjg5LDcgQEAKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwogCXJlcS0+Zm9yY2UgPSAxOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CkBAIC0zNDQsNyArMzUzLDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTM5Niw3ICs0MDUsNyBAQAogCQlpbmFyZy0+cmVhZF9mbGFncyB8PSBGVVNFX1JFQURfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKIH0KIApAQCAtNDkzLDcgKzUwMiw2IEBACiAJfQogCWlmIChyZXEtPmZmKQogCQlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF9yZWFkcGFnZXMoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTA5LDEwICs1MTcsMTEgQEAKIAkJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJCXJlcS0+ZmYgPSBmdXNlX2ZpbGVfZ2V0KGZmKTsKIAkJcmVxLT5lbmQgPSBmdXNlX3JlYWRwYWdlc19lbmQ7Ci0JCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwogCX0gZWxzZSB7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcmVhZHBhZ2VzX2VuZChmYywgcmVxKTsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAl9CiB9CiAKQEAgLTU0Myw3ICs1NTIsNyBAQAogCQl9CiAJfQogCXJlcS0+cGFnZXNbcmVxLT5udW1fcGFnZXNdID0gcGFnZTsKLQlyZXEtPm51bV9wYWdlcyArKzsKKwlyZXEtPm51bV9wYWdlcysrOwogCXJldHVybiAwOwogfQogCkBAIC02MzYsNyArNjQ1LDcgQEAKIAkJaW5hcmctPndyaXRlX2ZsYWdzIHw9IEZVU0VfV1JJVEVfTE9DS09XTkVSOwogCQlpbmFyZy0+bG9ja19vd25lciA9IGZ1c2VfbG9ja19vd25lcl9pZChmYywgb3duZXIpOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0dXJuIHJlcS0+bWlzYy53cml0ZS5vdXQuc2l6ZTsKIH0KIApAQCAtMTA0Miw3ICsxMDUxLDYgQEAKIHsKIAlfX2ZyZWVfcGFnZShyZXEtPnBhZ2VzWzBdKTsKIAlmdXNlX2ZpbGVfcHV0KHJlcS0+ZmYpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2Vfd3JpdGVwYWdlX2ZpbmlzaChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCkBAIC0xMDYwLDYgKzEwNjgsOCBAQAogCiAvKiBDYWxsZWQgdW5kZXIgZmMtPmxvY2ssIG1heSByZWxlYXNlIGFuZCByZWFjcXVpcmUgaXQgKi8KIHN0YXRpYyB2b2lkIGZ1c2Vfc2VuZF93cml0ZXBhZ2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShyZXEtPmlub2RlKTsKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKHJlcS0+aW5vZGUpOwpAQCAtMTA3OSwxMyArMTA4OSwxNCBAQAogCiAJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBpbmFyZy0+c2l6ZTsKIAlmaS0+d3JpdGVjdHIrKzsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoZmMsIHJlcSk7CiAJcmV0dXJuOwogCiAgb3V0X2ZyZWU6CiAJZnVzZV93cml0ZXBhZ2VfZmluaXNoKGZjLCByZXEpOwogCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJZnVzZV93cml0ZXBhZ2VfZnJlZShmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogfQogCkBAIC0xMDk2LDYgKzExMDcsOCBAQAogICogQ2FsbGVkIHdpdGggZmMtPmxvY2sKICAqLwogdm9pZCBmdXNlX2ZsdXNoX3dyaXRlcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CkBAIC0xMzI1LDcgKzEzMzgsNyBAQAogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpCkBAIC0xMzU3LDcgKzEzNzAsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwogCiAJZnVzZV9sa19maWxsKHJlcSwgZmlsZSwgZmwsIG9wY29kZSwgcGlkLCBmbG9jayk7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJLyogbG9ja2luZyBpcyByZXN0YXJ0YWJsZSAqLwogCWlmIChlcnIgPT0gLUVJTlRSKQpAQCAtMTQzMyw3ICsxNDQ2LDcgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykKQEAgLTE0NzAsNiArMTQ4Myw0MDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW50IGZ1c2VfaW9jdGxfY29weV91c2VyKHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJdW5zaWduZWQgaW50IG5yX3NlZ3MsIHNpemVfdCBieXRlcywgYm9vbCB0b191c2VyKQoreworCXN0cnVjdCBpb3ZfaXRlciBpaTsKKwlpbnQgcGFnZV9pZHggPSAwOworCisJaWYgKCFieXRlcykKKwkJcmV0dXJuIDA7CisKKwlpb3ZfaXRlcl9pbml0KCZpaSwgaW92LCBucl9zZWdzLCBieXRlcywgMCk7CisKKwl3aGlsZSAoaW92X2l0ZXJfY291bnQoJmlpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BhZ2VfaWR4KytdOworCQlzaXplX3QgdG9kbyA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFLCBpb3ZfaXRlcl9jb3VudCgmaWkpKTsKKwkJdm9pZCAqa2FkZHIsICptYXA7CisKKwkJa2FkZHIgPSBtYXAgPSBrbWFwKHBhZ2UpOworCisJCXdoaWxlICh0b2RvKSB7CisJCQljaGFyIF9fdXNlciAqdWFkZHIgPSBpaS5pb3YtPmlvdl9iYXNlICsgaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBpb3ZfbGVuID0gaWkuaW92LT5pb3ZfbGVuIC0gaWkuaW92X29mZnNldDsKKwkJCXNpemVfdCBjb3B5ID0gbWluKHRvZG8sIGlvdl9sZW4pOworCQkJc2l6ZV90IGxlZnQ7CisKKwkJCWlmICghdG9fdXNlcikKKwkJCQlsZWZ0ID0gY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCBjb3B5KTsKKwkJCWVsc2UKKwkJCQlsZWZ0ID0gY29weV90b191c2VyKHVhZGRyLCBrYWRkciwgY29weSk7CisKKwkJCWlmICh1bmxpa2VseShsZWZ0KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGNvcHkpOworCQkJdG9kbyAtPSBjb3B5OworCQkJa2FkZHIgKz0gY29weTsKKwkJfQorCisJCWt1bm1hcChtYXApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogRm9yIGlvY3RscywgdGhlcmUgaXMgbm8gZ2VuZXJpYyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeQorICogbmVlZHMgdG8gYmUgcmVhZCBhbmQvb3Igd3JpdHRlbi4gIEZ1cnRoZXJtb3JlLCBpb2N0bHMgYXJlIGFsbG93ZWQKKyAqIHRvIGRlcmVmZXJlbmNlIHRoZSBwYXNzZWQgcG9pbnRlciwgc28gdGhlIHBhcmFtZXRlciByZXF1aXJlcyBkZWVwCisgKiBjb3B5aW5nIGJ1dCBGVVNFIGhhcyBubyBpZGVhIHdoYXRzb2V2ZXIgYWJvdXQgd2hhdCB0byBjb3B5IGluIG9yCisgKiBvdXQuCisgKgorICogVGhpcyBpcyBzb2x2ZWQgYnkgYWxsb3dpbmcgRlVTRSBzZXJ2ZXIgdG8gcmV0cnkgaW9jdGwgd2l0aAorICogbmVjZXNzYXJ5IGluL291dCBpb3ZlY3MuICBMZXQncyBhc3N1bWUgdGhlIGlvY3RsIGltcGxlbWVudGF0aW9uCisgKiBuZWVkcyB0byByZWFkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgorICoKKyAqIHN0cnVjdCBhIHsKKyAqCWNoYXIJKmJ1ZjsKKyAqCXNpemVfdAlidWZsZW47CisgKiB9CisgKgorICogT24gdGhlIGZpcnN0IGNhbGxvdXQgdG8gRlVTRSBzZXJ2ZXIsIGluYXJnLT5pbl9zaXplIGFuZAorICogaW5hcmctPm91dF9zaXplIHdpbGwgYmUgTlVMTDsgdGhlbiwgdGhlIHNlcnZlciBjb21wbGV0ZXMgdGhlIGlvY3RsCisgKiB3aXRoIEZVU0VfSU9DVExfUkVUUlkgc2V0IGluIG91dC0+ZmxhZ3MsIG91dC0+aW5faW92cyBzZXQgdG8gMSBhbmQKKyAqIHRoZSBhY3R1YWwgaW92IGFycmF5IHRvCisgKgorICogeyB7IC5pb3ZfYmFzZSA9IGluYXJnLmFyZywJLmlvdl9sZW4gPSBzaXplb2Yoc3RydWN0IGEpIH0gfQorICoKKyAqIHdoaWNoIHRlbGxzIEZVU0UgdG8gY29weSBpbiB0aGUgcmVxdWVzdGVkIGFyZWEgYW5kIHJldHJ5IHRoZSBpb2N0bC4KKyAqIE9uIHRoZSBzZWNvbmQgcm91bmQsIHRoZSBzZXJ2ZXIgaGFzIGFjY2VzcyB0byB0aGUgc3RydWN0dXJlIGFuZAorICogZnJvbSB0aGF0IGl0IGNhbiB0ZWxsIHdoYXQgdG8gbG9vayBmb3IgbmV4dCwgc28gb24gdGhlIGludm9jYXRpb24sCisgKiBpdCBzZXRzIEZVU0VfSU9DVExfUkVUUlksIG91dC0+aW5faW92cyB0byAyIGFuZCBpb3YgYXJyYXkgdG8KKyAqCisgKiB7IHsgLmlvdl9iYXNlID0gaW5hcmcuYXJnLAkuaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgYSkJfSwKKyAqICAgeyAuaW92X2Jhc2UgPSBhLmJ1ZiwJLmlvdl9sZW4gPSBhLmJ1ZmxlbgkJfSB9CisgKgorICogRlVTRSB3aWxsIGNvcHkgYm90aCBzdHJ1Y3QgYSBhbmQgdGhlIHBvaW50ZWQgYnVmZmVyIGZyb20gdGhlCisgKiBwcm9jZXNzIGRvaW5nIHRoZSBpb2N0bCBhbmQgcmV0cnkgaW9jdGwgd2l0aCBib3RoIHN0cnVjdCBhIGFuZCB0aGUKKyAqIGJ1ZmZlci4KKyAqCisgKiBUaGlzIHRpbWUsIEZVU0Ugc2VydmVyIGhhcyBldmVyeXRoaW5nIGl0IG5lZWRzIGFuZCBjb21wbGV0ZXMgaW9jdGwKKyAqIHdpdGhvdXQgRlVTRV9JT0NUTF9SRVRSWSB3aGljaCBmaW5pc2hlcyB0aGUgaW9jdGwgY2FsbC4KKyAqCisgKiBDb3B5aW5nIGRhdGEgb3V0IHdvcmtzIHRoZSBzYW1lIHdheS4KKyAqCisgKiBOb3RlIHRoYXQgaWYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQgaXMgY2xlYXIsIHRoZSBrZXJuZWwKKyAqIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZXMgaW4gYW5kIG91dCBpb3ZzIGJ5IGRlY29kaW5nIEBjbWQgd2l0aAorICogX0lPQ18qIG1hY3JvcyBhbmQgdGhlIHNlcnZlciBpcyBub3QgYWxsb3dlZCB0byByZXF1ZXN0IFJFVFJZLiAgVGhpcworICogbGltaXRzIGlvY3RsIGRhdGEgdHJhbnNmZXJzIHRvIHdlbGwtZm9ybWVkIGlvY3RscyBhbmQgaXMgdGhlIGZvcmNlZAorICogYmVoYXZpb3IgZm9yIGFsbCBGVVNFIHNlcnZlcnMuCisgKi8KK3N0YXRpYyBsb25nIGZ1c2VfZmlsZV9kb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX2lvY3RsX2luIGluYXJnID0geworCQkuZmggPSBmZi0+ZmgsCisJCS5jbWQgPSBjbWQsCisJCS5hcmcgPSBhcmcsCisJCS5mbGFncyA9IGZsYWdzCisJfTsKKwlzdHJ1Y3QgZnVzZV9pb2N0bF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqaW92X3BhZ2UgPSBOVUxMOworCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOworCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7CisJc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKKwlpbnQgZXJyOworCisJLyogYXNzdW1lIGFsbCB0aGUgaW92cyByZXR1cm5lZCBieSBjbGllbnQgYWx3YXlzIGZpdHMgaW4gYSBwYWdlICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW92ZWMpICogRlVTRV9JT0NUTF9NQVhfSU9WID4gUEFHRV9TSVpFKTsKKworCWlmICghZnVzZV9hbGxvd190YXNrKGZjLCBjdXJyZW50KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwllcnIgPSAtRUlPOworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJcGFnZXMgPSBremFsbG9jKHNpemVvZihwYWdlc1swXSkgKiBGVVNFX01BWF9QQUdFU19QRVJfUkVRLCBHRlBfS0VSTkVMKTsKKwlpb3ZfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlcyB8fCAhaW92X3BhZ2UpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiByZXN0cmljdGVkLCBpbml0aWFsaXplIElPIHBhcmFtZXRlcnMgYXMgZW5jb2RlZCBpbiBAY21kLgorCSAqIFJFVFJZIGZyb20gc2VydmVyIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCWlmICghKGZsYWdzICYgRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQpKSB7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gcGFnZV9hZGRyZXNzKGlvdl9wYWdlKTsKKworCQlpb3YtPmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYXJnOworCQlpb3YtPmlvdl9sZW4gPSBfSU9DX1NJWkUoY21kKTsKKworCQlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpIHsKKwkJCWluX2lvdiA9IGlvdjsKKwkJCWluX2lvdnMgPSAxOworCQl9CisKKwkJaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpIHsKKwkJCW91dF9pb3YgPSBpb3Y7CisJCQlvdXRfaW92cyA9IDE7CisJCX0KKwl9CisKKyByZXRyeToKKwlpbmFyZy5pbl9zaXplID0gaW5fc2l6ZSA9IGlvdl9sZW5ndGgoaW5faW92LCBpbl9pb3ZzKTsKKwlpbmFyZy5vdXRfc2l6ZSA9IG91dF9zaXplID0gaW92X2xlbmd0aChvdXRfaW92LCBvdXRfaW92cyk7CisKKwkvKgorCSAqIE91dCBkYXRhIGNhbiBiZSB1c2VkIGVpdGhlciBmb3IgYWN0dWFsIG91dCBkYXRhIG9yIGlvdnMsCisJICogbWFrZSBzdXJlIHRoZXJlIGFsd2F5cyBpcyBhdCBsZWFzdCBvbmUgcGFnZS4KKwkgKi8KKwlvdXRfc2l6ZSA9IG1heF90KHNpemVfdCwgb3V0X3NpemUsIFBBR0VfU0laRSk7CisJbWF4X3BhZ2VzID0gRElWX1JPVU5EX1VQKG1heChpbl9zaXplLCBvdXRfc2l6ZSksIFBBR0VfU0laRSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBidWZmZXIgcGFnZXMgYW5kIGluaXQgcmVxdWVzdCB3aXRoIHRoZW0gKi8KKwllcnIgPSAtRU5PTUVNOworCWlmIChtYXhfcGFnZXMgPiBGVVNFX01BWF9QQUdFU19QRVJfUkVRKQorCQlnb3RvIG91dDsKKwl3aGlsZSAobnVtX3BhZ2VzIDwgbWF4X3BhZ2VzKSB7CisJCXBhZ2VzW251bV9wYWdlc10gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNKTsKKwkJaWYgKCFwYWdlc1tudW1fcGFnZXNdKQorCQkJZ290byBvdXQ7CisJCW51bV9wYWdlcysrOworCX0KKworCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihyZXEpKSB7CisJCWVyciA9IFBUUl9FUlIocmVxKTsKKwkJcmVxID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweShyZXEtPnBhZ2VzLCBwYWdlcywgc2l6ZW9mKHJlcS0+cGFnZXNbMF0pICogbnVtX3BhZ2VzKTsKKwlyZXEtPm51bV9wYWdlcyA9IG51bV9wYWdlczsKKworCS8qIG9rYXksIGxldCdzIHNlbmQgaXQgdG8gdGhlIGNsaWVudCAqLworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lPQ1RMOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCWlmIChpbl9zaXplKSB7CisJCXJlcS0+aW4ubnVtYXJncysrOworCQlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGluX3NpemU7CisJCXJlcS0+aW4uYXJncGFnZXMgPSAxOworCisJCWVyciA9IGZ1c2VfaW9jdGxfY29weV91c2VyKHBhZ2VzLCBpbl9pb3YsIGluX2lvdnMsIGluX3NpemUsCisJCQkJCSAgIGZhbHNlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCXJlcS0+b3V0Lm51bWFyZ3MgPSAyOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcS0+b3V0LmFyZ3NbMV0uc2l6ZSA9IG91dF9zaXplOworCXJlcS0+b3V0LmFyZ3BhZ2VzID0gMTsKKwlyZXEtPm91dC5hcmd2YXIgPSAxOworCisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwl0cmFuc2ZlcnJlZCA9IHJlcS0+b3V0LmFyZ3NbMV0uc2l6ZTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCXJlcSA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBkaWQgaXQgYXNrIGZvciByZXRyeT8gKi8KKwlpZiAob3V0YXJnLmZsYWdzICYgRlVTRV9JT0NUTF9SRVRSWSkgeworCQljaGFyICp2YWRkcjsKKworCQkvKiBubyByZXRyeSBpZiBpbiByZXN0cmljdGVkIG1vZGUgKi8KKwkJZXJyID0gLUVJTzsKKwkJaWYgKCEoZmxhZ3MgJiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCkpCisJCQlnb3RvIG91dDsKKworCQlpbl9pb3ZzID0gb3V0YXJnLmluX2lvdnM7CisJCW91dF9pb3ZzID0gb3V0YXJnLm91dF9pb3ZzOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGluZ3MgYXJlIGluIGJvdW5kYXJ5LCBzZXBhcmF0ZSBjaGVja3MKKwkJICogYXJlIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVyZmxvdy4KKwkJICovCisJCWVyciA9IC1FTk9NRU07CisJCWlmIChpbl9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WIHx8CisJCSAgICBvdXRfaW92cyA+IEZVU0VfSU9DVExfTUFYX0lPViB8fAorCQkgICAgaW5faW92cyArIG91dF9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gLUVJTzsKKwkJaWYgKChpbl9pb3ZzICsgb3V0X2lvdnMpICogc2l6ZW9mKHN0cnVjdCBpb3ZlYykgIT0gdHJhbnNmZXJyZWQpCisJCQlnb3RvIG91dDsKKworCQkvKiBva2F5LCBjb3B5IGluIGlvdnMgYW5kIHJldHJ5ICovCisJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZXNbMF0sIEtNX1VTRVIwKTsKKwkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSksIHZhZGRyLCB0cmFuc2ZlcnJlZCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKKworCQlpbl9pb3YgPSBwYWdlX2FkZHJlc3MoaW92X3BhZ2UpOworCQlvdXRfaW92ID0gaW5faW92ICsgaW5faW92czsKKworCQlnb3RvIHJldHJ5OworCX0KKworCWVyciA9IC1FSU87CisJaWYgKHRyYW5zZmVycmVkID4gaW5hcmcub3V0X3NpemUpCisJCWdvdG8gb3V0OworCisJZXJyID0gZnVzZV9pb2N0bF9jb3B5X3VzZXIocGFnZXMsIG91dF9pb3YsIG91dF9pb3ZzLCB0cmFuc2ZlcnJlZCwgdHJ1ZSk7Cisgb3V0OgorCWlmIChyZXEpCisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGlvdl9wYWdlKQorCQlfX2ZyZWVfcGFnZShpb3ZfcGFnZSk7CisJd2hpbGUgKG51bV9wYWdlcykKKwkJX19mcmVlX3BhZ2UocGFnZXNbLS1udW1fcGFnZXNdKTsKKwlrZnJlZShwYWdlcyk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogb3V0YXJnLnJlc3VsdDsKK30KKworc3RhdGljIGxvbmcgZnVzZV9maWxlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIDApOworfQorCitzdGF0aWMgbG9uZyBmdXNlX2ZpbGVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBmdXNlX2ZpbGVfZG9faW9jdGwoZmlsZSwgY21kLCBhcmcsIEZVU0VfSU9DVExfQ09NUEFUKTsKK30KKworLyoKKyAqIEFsbCBmaWxlcyB3aGljaCBoYXZlIGJlZW4gcG9sbGVkIGFyZSBsaW5rZWQgdG8gUkIgdHJlZQorICogZnVzZV9jb25uLT5wb2xsZWRfZmlsZXMgd2hpY2ggaXMgaW5kZXhlZCBieSBraC4gIFdhbGsgdGhlIHRyZWUgYW5kCisgKiBmaW5kIHRoZSBtYXRjaGluZyBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqKmZ1c2VfZmluZF9wb2xsZWRfbm9kZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgdTY0IGtoLAorCQkJCQkgICAgICBzdHJ1Y3QgcmJfbm9kZSAqKnBhcmVudF9vdXQpCit7CisJc3RydWN0IHJiX25vZGUgKipsaW5rID0gJmZjLT5wb2xsZWRfZmlsZXMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbGFzdCA9IE5VTEw7CisKKwl3aGlsZSAoKmxpbmspIHsKKwkJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CisKKwkJbGFzdCA9ICpsaW5rOworCQlmZiA9IHJiX2VudHJ5KGxhc3QsIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKworCQlpZiAoa2ggPCBmZi0+a2gpCisJCQlsaW5rID0gJmxhc3QtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGtoID4gZmYtPmtoKQorCQkJbGluayA9ICZsYXN0LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJaWYgKHBhcmVudF9vdXQpCisJCSpwYXJlbnRfb3V0ID0gbGFzdDsKKwlyZXR1cm4gbGluazsKK30KKworLyoKKyAqIFRoZSBmaWxlIGlzIGFib3V0IHRvIGJlIHBvbGxlZC4gIE1ha2Ugc3VyZSBpdCdzIG9uIHRoZSBwb2xsZWRfZmlsZXMKKyAqIFJCIHRyZWUuICBOb3RlIHRoYXQgZmlsZXMgb25jZSBhZGRlZCB0byB0aGUgcG9sbGVkX2ZpbGVzIHRyZWUgYXJlCisgKiBub3QgcmVtb3ZlZCBiZWZvcmUgdGhlIGZpbGUgaXMgcmVsZWFzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSBmaWxlCisgKiBwb2xsZWQgb25jZSBpcyBsaWtlbHkgdG8gYmUgcG9sbGVkIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBmdXNlX3JlZ2lzdGVyX3BvbGxlZF9maWxlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQoreworCXNwaW5fbG9jaygmZmMtPmxvY2spOworCWlmIChSQl9FTVBUWV9OT0RFKCZmZi0+cG9sbGVkX25vZGUpKSB7CisJCXN0cnVjdCByYl9ub2RlICoqbGluaywgKnBhcmVudDsKKworCQlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBmZi0+a2gsICZwYXJlbnQpOworCQlCVUdfT04oKmxpbmspOworCQlyYl9saW5rX25vZGUoJmZmLT5wb2xsZWRfbm9kZSwgcGFyZW50LCBsaW5rKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZmZi0+cG9sbGVkX25vZGUsICZmYy0+cG9sbGVkX2ZpbGVzKTsKKwl9CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGZ1c2VfZmlsZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3BvbGxfaW4gaW5hcmcgPSB7IC5maCA9IGZmLT5maCwgLmtoID0gZmYtPmtoIH07CisJc3RydWN0IGZ1c2VfcG9sbF9vdXQgb3V0YXJnOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3BvbGwpCisJCXJldHVybiBERUZBVUxUX1BPTExNQVNLOworCisJcG9sbF93YWl0KGZpbGUsICZmZi0+cG9sbF93YWl0LCB3YWl0KTsKKworCS8qCisJICogQXNrIGZvciBub3RpZmljYXRpb24gaWZmIHRoZXJlJ3Mgc29tZW9uZSB3YWl0aW5nIGZvciBpdC4KKwkgKiBUaGUgY2xpZW50IG1heSBpZ25vcmUgdGhlIGZsYWcgYW5kIGFsd2F5cyBub3RpZnkuCisJICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmZmLT5wb2xsX3dhaXQpKSB7CisJCWluYXJnLmZsYWdzIHw9IEZVU0VfUE9MTF9TQ0hFRFVMRV9OT1RJRlk7CisJCWZ1c2VfcmVnaXN0ZXJfcG9sbGVkX2ZpbGUoZmMsIGZmKTsKKwl9CisKKwlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKworCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1BPTEw7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5vdXQubnVtYXJncyA9IDE7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCisJaWYgKCFlcnIpCisJCXJldHVybiBvdXRhcmcucmV2ZW50czsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3BvbGwgPSAxOworCQlyZXR1cm4gREVGQVVMVF9QT0xMTUFTSzsKKwl9CisJcmV0dXJuIFBPTExFUlI7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGZ1c2VfaGFuZGxlX25vdGlmeSgpIG9uIEZVU0VfTk9USUZZX1BPTEwgYW5kCisgKiB3YWtlcyB1cCB0aGUgcG9sbCB3YWl0ZXJzLgorICovCitpbnQgZnVzZV9ub3RpZnlfcG9sbF93YWtldXAoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkgICAgc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCAqb3V0YXJnKQoreworCXU2NCBraCA9IG91dGFyZy0+a2g7CisJc3RydWN0IHJiX25vZGUgKipsaW5rOworCisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisKKwlsaW5rID0gZnVzZV9maW5kX3BvbGxlZF9ub2RlKGZjLCBraCwgTlVMTCk7CisJaWYgKCpsaW5rKSB7CisJCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOworCisJCWZmID0gcmJfZW50cnkoKmxpbmssIHN0cnVjdCBmdXNlX2ZpbGUsIHBvbGxlZF9ub2RlKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJmZmLT5wb2xsX3dhaXQpOworCX0KKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZnVzZV9maWxlX2xsc2VlaywKIAkucmVhZAkJPSBkb19zeW5jX3JlYWQsCkBAIC0xNDg0LDYgKzE4OTcsOSBAQAogCS5sb2NrCQk9IGZ1c2VfZmlsZV9sb2NrLAogCS5mbG9jawkJPSBmdXNlX2ZpbGVfZmxvY2ssCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ1c2VfZmlsZV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gZnVzZV9maWxlX2NvbXBhdF9pb2N0bCwKKwkucG9sbAkJPSBmdXNlX2ZpbGVfcG9sbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9ucyA9IHsKQEAgLTE0OTYsNiArMTkxMiw5IEBACiAJLmZzeW5jCQk9IGZ1c2VfZnN5bmMsCiAJLmxvY2sJCT0gZnVzZV9maWxlX2xvY2ssCiAJLmZsb2NrCQk9IGZ1c2VfZmlsZV9mbG9jaywKKwkudW5sb2NrZWRfaW9jdGwJPSBmdXNlX2ZpbGVfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IGZ1c2VfZmlsZV9jb21wYXRfaW9jdGwsCisJLnBvbGwJCT0gZnVzZV9maWxlX3BvbGwsCiAJLyogbm8gbW1hcCBhbmQgc3BsaWNlX3JlYWQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IDM1YWNjZmQuLjVlNjRiODEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMTAwLDYgKzEwMiw5IEBACiAJLyoqIFJlcXVlc3QgcmVzZXJ2ZWQgZm9yIGZsdXNoIGFuZCByZWxlYXNlICovCiAJc3RydWN0IGZ1c2VfcmVxICpyZXNlcnZlZF9yZXE7CiAKKwkvKiogS2VybmVsIGZpbGUgaGFuZGxlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlICovCisJdTY0IGtoOworCiAJLyoqIEZpbGUgaGFuZGxlIHVzZWQgYnkgdXNlcnNwYWNlICovCiAJdTY0IGZoOwogCkBAIC0xMDgsNiArMTEzLDEyIEBACiAKIAkvKiogRW50cnkgb24gaW5vZGUncyB3cml0ZV9maWxlcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZV9lbnRyeTsKKworCS8qKiBSQiBub2RlIHRvIGJlIGxpbmtlZCBvbiBmdXNlX2Nvbm4tPnBvbGxlZF9maWxlcyAqLworCXN0cnVjdCByYl9ub2RlIHBvbGxlZF9ub2RlOworCisJLyoqIFdhaXQgcXVldWUgaGVhZCBmb3IgcG9sbCAqLworCXdhaXRfcXVldWVfaGVhZF90IHBvbGxfd2FpdDsKIH07CiAKIC8qKiBPbmUgaW5wdXQgYXJndW1lbnQgb2YgYSByZXF1ZXN0ICovCkBAIC0zMjIsNiArMzMzLDEyIEBACiAJLyoqIFRoZSBsaXN0IG9mIHJlcXVlc3RzIHVuZGVyIEkvTyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW87CiAKKwkvKiogVGhlIG5leHQgdW5pcXVlIGtlcm5lbCBmaWxlIGhhbmRsZSAqLworCXU2NCBraGN0cjsKKworCS8qKiByYnRyZWUgb2YgZnVzZV9maWxlcyB3YWl0aW5nIGZvciBwb2xsIGV2ZW50cyBpbmRleGVkIGJ5IHBoICovCisJc3RydWN0IHJiX3Jvb3QgcG9sbGVkX2ZpbGVzOworCiAJLyoqIE51bWJlciBvZiByZXF1ZXN0cyBjdXJyZW50bHkgaW4gdGhlIGJhY2tncm91bmQgKi8KIAl1bnNpZ25lZCBudW1fYmFja2dyb3VuZDsKIApAQCAtMzU1LDE5ICszNzIsMTkgQEAKIAkvKiogQ29ubmVjdGlvbiBmYWlsZWQgKHZlcnNpb24gbWlzbWF0Y2gpLiAgQ2Fubm90IHJhY2Ugd2l0aAogCSAgICBzZXR0aW5nIG90aGVyIGJpdGZpZWxkcyBzaW5jZSBpdCBpcyBvbmx5IHNldCBvbmNlIGluIElOSVQKIAkgICAgcmVwbHksIGJlZm9yZSBhbnkgb3RoZXIgcmVxdWVzdCwgYW5kIG5ldmVyIGNsZWFyZWQgKi8KLQl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKKwl1bnNpZ25lZCBjb25uX2Vycm9yOjE7CiAKIAkvKiogQ29ubmVjdGlvbiBzdWNjZXNzZnVsLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGNvbm5faW5pdCA6IDE7CisJdW5zaWduZWQgY29ubl9pbml0OjE7CiAKIAkvKiogRG8gcmVhZHBhZ2VzIGFzeW5jaHJvbm91c2x5PyAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGFzeW5jX3JlYWQgOiAxOworCXVuc2lnbmVkIGFzeW5jX3JlYWQ6MTsKIAogCS8qKiBEbyBub3Qgc2VuZCBzZXBhcmF0ZSBTRVRBVFRSIHJlcXVlc3QgYmVmb3JlIG9wZW4oT19UUlVOQykgICovCi0JdW5zaWduZWQgYXRvbWljX29fdHJ1bmMgOiAxOworCXVuc2lnbmVkIGF0b21pY19vX3RydW5jOjE7CiAKIAkvKiogRmlsZXN5c3RlbSBzdXBwb3J0cyBORlMgZXhwb3J0aW5nLiAgT25seSBzZXQgaW4gSU5JVCAqLwotCXVuc2lnbmVkIGV4cG9ydF9zdXBwb3J0IDogMTsKKwl1bnNpZ25lZCBleHBvcnRfc3VwcG9ydDoxOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGJpdGZpZWxkcyBhcmUgb25seSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzCkBAIC0zNzUsNDMgKzM5Miw0NiBAQAogCSAqLwogCiAJLyoqIElzIGZzeW5jIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19mc3luYyA6IDE7CisJdW5zaWduZWQgbm9fZnN5bmM6MTsKIAogCS8qKiBJcyBmc3luY2RpciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZnN5bmNkaXIgOiAxOworCXVuc2lnbmVkIG5vX2ZzeW5jZGlyOjE7CiAKIAkvKiogSXMgZmx1c2ggbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2ZsdXNoIDogMTsKKwl1bnNpZ25lZCBub19mbHVzaDoxOwogCiAJLyoqIElzIHNldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19zZXR4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fc2V0eGF0dHI6MTsKIAogCS8qKiBJcyBnZXR4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZ2V0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2dldHhhdHRyOjE7CiAKIAkvKiogSXMgbGlzdHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19saXN0eGF0dHIgOiAxOworCXVuc2lnbmVkIG5vX2xpc3R4YXR0cjoxOwogCiAJLyoqIElzIHJlbW92ZXhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19yZW1vdmV4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fcmVtb3ZleGF0dHI6MTsKIAogCS8qKiBBcmUgZmlsZSBsb2NraW5nIHByaW1pdGl2ZXMgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2xvY2sgOiAxOworCXVuc2lnbmVkIG5vX2xvY2s6MTsKIAogCS8qKiBJcyBhY2Nlc3Mgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2FjY2VzcyA6IDE7CisJdW5zaWduZWQgbm9fYWNjZXNzOjE7CiAKIAkvKiogSXMgY3JlYXRlIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19jcmVhdGUgOiAxOworCXVuc2lnbmVkIG5vX2NyZWF0ZToxOwogCiAJLyoqIElzIGludGVycnVwdCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9faW50ZXJydXB0IDogMTsKKwl1bnNpZ25lZCBub19pbnRlcnJ1cHQ6MTsKIAogCS8qKiBJcyBibWFwIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19ibWFwIDogMTsKKwl1bnNpZ25lZCBub19ibWFwOjE7CisKKwkvKiogSXMgcG9sbCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fcG9sbDoxOwogCiAJLyoqIERvIG11bHRpLXBhZ2UgY2FjaGVkIHdyaXRlcyAqLwotCXVuc2lnbmVkIGJpZ193cml0ZXMgOiAxOworCXVuc2lnbmVkIGJpZ193cml0ZXM6MTsKIAogCS8qKiBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gKi8KIAlhdG9taWNfdCBudW1fd2FpdGluZzsKQEAgLTQ0NSw2ICs0NjUsOSBAQAogCiAJLyoqIFZlcnNpb24gY291bnRlciBmb3IgYXR0cmlidXRlIGNoYW5nZXMgKi8KIAl1NjQgYXR0cl92ZXJzaW9uOworCisJLyoqIENhbGxlZCBvbiBmaW5hbCBwdXQgKi8KKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGZ1c2VfY29ubiAqKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtNDk5LDcgKzUyMiw3IEBACiAgKi8KIGludCBmdXNlX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgaXNkaXIpOwogCi1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Modm9pZCk7CitzdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Moc3RydWN0IGZ1c2VfY29ubiAqZmMpOwogdm9pZCBmdXNlX2ZpbGVfZnJlZShzdHJ1Y3QgZnVzZV9maWxlICpmZik7CiB2b2lkIGZ1c2VfZmluaXNoX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCBzdHJ1Y3QgZnVzZV9vcGVuX291dCAqb3V0YXJnKTsKQEAgLTUxOSw2ICs1NDIsMTIgQEAKIAkJICAgICAgaW50IGlzZGlyKTsKIAogLyoqCisgKiBOb3RpZnkgcG9sbCB3YWtldXAKKyAqLworaW50IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJICAgIHN0cnVjdCBmdXNlX25vdGlmeV9wb2xsX3dha2V1cF9vdXQgKm91dGFyZyk7CisKKy8qKgogICogSW5pdGlhbGl6ZSBmaWxlIG9wZXJhdGlvbnMgb24gYSByZWd1bGFyIGZpbGUKICAqLwogdm9pZCBmdXNlX2luaXRfZmlsZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTU5MywxOSArNjIyLDIwIEBACiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IChzeW5jaHJvbm91cykKICAqLwotdm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyoqCiAgKiBTZW5kIGEgcmVxdWVzdCB3aXRoIG5vIHJlcGx5CiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX25vcmVwbHkoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCi12b2lkIHJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyogQWJvcnQgYWxsIHJlcXVlc3RzICovCiB2b2lkIGZ1c2VfYWJvcnRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CkBAIC02MjMsNiArNjUzLDExIEBACiBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2Nvbm5fZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKIAogLyoqCisgKiBJbml0aWFsaXplIGZ1c2VfY29ubgorICovCitpbnQgZnVzZV9jb25uX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCisvKioKICAqIFJlbGVhc2UgcmVmZXJlbmNlIHRvIGZ1c2VfY29ubgogICovCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDJlOTlmMzQuLjQ3Yzk2ZmQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTM3LDEwICszNywxMCBAQAogCXVuc2lnbmVkIHJvb3Rtb2RlOwogCXVuc2lnbmVkIHVzZXJfaWQ7CiAJdW5zaWduZWQgZ3JvdXBfaWQ7Ci0JdW5zaWduZWQgZmRfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudCA6IDE7Ci0JdW5zaWduZWQgdXNlcl9pZF9wcmVzZW50IDogMTsKLQl1bnNpZ25lZCBncm91cF9pZF9wcmVzZW50IDogMTsKKwl1bnNpZ25lZCBmZF9wcmVzZW50OjE7CisJdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudDoxOworCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudDoxOworCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQ6MTsKIAl1bnNpZ25lZCBmbGFnczsKIAl1bnNpZ25lZCBtYXhfcmVhZDsKIAl1bnNpZ25lZCBibGtzaXplOwpAQCAtOTQsNyArOTQsNyBAQAogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2luKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKLQlyZXF1ZXN0X3NlbmRfbm9yZXBseShmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOwogfQogCiBzdGF0aWMgdm9pZCBmdXNlX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC0yNTAsNyArMjUwLDcgQEAKIAogCWZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCWZpLT5ubG9va3VwICsrOworCWZpLT5ubG9va3VwKys7CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCBhdHRyLCBhdHRyX3ZhbGlkLCBhdHRyX3ZlcnNpb24pOwogCkBAIC0yNjksNyArMjY5LDcgQEAKIAkJZmMtPmRlc3Ryb3lfcmVxID0gTlVMTDsKIAkJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfREVTVFJPWTsKIAkJcmVxLT5mb3JjZSA9IDE7Ci0JCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwkJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJfQogfQpAQCAtMzM0LDcgKzMzNCw3IEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0KIAkJZmMtPm1pbm9yIDwgNCA/IEZVU0VfQ09NUEFUX1NUQVRGU19TSVpFIDogc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJaWYgKCFlcnIpCiAJCWNvbnZlcnRfZnVzZV9zdGF0ZnMoYnVmLCAmb3V0YXJnLnN0KTsKQEAgLTQ2Miw2OCArNDYyLDY5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uICpuZXdfY29ubihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoraW50IGZ1c2VfY29ubl9pbml0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCWludCBlcnI7CiAKLQlmYyA9IGt6YWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOwotCWlmIChmYykgewotCQlzcGluX2xvY2tfaW5pdCgmZmMtPmxvY2spOwotCQltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7Ci0JCWF0b21pY19zZXQoJmZjLT5jb3VudCwgMSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPnJlc2VydmVkX3JlcV93YWl0cSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cGVuZGluZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+aW8pOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmludGVycnVwdHMpOwotCQlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKLQkJYXRvbWljX3NldCgmZmMtPm51bV93YWl0aW5nLCAwKTsKLQkJZmMtPmJkaS5yYV9wYWdlcyA9IChWTV9NQVhfUkVBREFIRUFEICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47Ci0JCS8qIGZ1c2UgZG9lcyBpdCdzIG93biB3cml0ZWJhY2sgYWNjb3VudGluZyAqLwotCQlmYy0+YmRpLmNhcGFiaWxpdGllcyA9IEJESV9DQVBfTk9fQUNDVF9XQjsKLQkJZmMtPmRldiA9IHNiLT5zX2RldjsKLQkJZXJyID0gYmRpX2luaXQoJmZjLT5iZGkpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9rZnJlZTsKLQkJaWYgKHNiLT5zX2JkZXYpIHsKLQkJCWVyciA9IGJkaV9yZWdpc3RlcigmZmMtPmJkaSwgTlVMTCwgIiV1OiV1LWZ1c2VibGsiLAotCQkJCQkgICBNQUpPUihmYy0+ZGV2KSwgTUlOT1IoZmMtPmRldikpOwotCQl9IGVsc2UgewotCQkJZXJyID0gYmRpX3JlZ2lzdGVyX2RldigmZmMtPmJkaSwgZmMtPmRldik7Ci0JCX0KLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7Ci0JCS8qCi0JCSAqIEZvciBhIHNpbmdsZSBmdXNlIGZpbGVzeXN0ZW0gdXNlIG1heCAxJSBvZiBkaXJ0eSArCi0JCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCi0JCSAqCi0JCSAqIFRoaXMgZ2l2ZXMgYWJvdXQgMU0gb2Ygd3JpdGUgYnVmZmVyIGZvciBtZW1vcnkgbWFwcyBvbiBhCi0JCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQotCQkgKiB0aGFuIGVub3VnaC4KLQkJICoKLQkJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bwotCQkgKgotCQkgKiAgICAvc3lzL2NsYXNzL2JkaS88YmRpPi9tYXhfcmF0aW8KLQkJICovCi0JCWJkaV9zZXRfbWF4X3JhdGlvKCZmYy0+YmRpLCAxKTsKLQkJZmMtPnJlcWN0ciA9IDA7Ci0JCWZjLT5ibG9ja2VkID0gMTsKLQkJZmMtPmF0dHJfdmVyc2lvbiA9IDE7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmZjLT5zY3JhbWJsZV9rZXksIHNpemVvZihmYy0+c2NyYW1ibGVfa2V5KSk7CisJbWVtc2V0KGZjLCAwLCBzaXplb2YoKmZjKSk7CisJc3Bpbl9sb2NrX2luaXQoJmZjLT5sb2NrKTsKKwltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7CisJYXRvbWljX3NldCgmZmMtPmNvdW50LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+d2FpdHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+cmVzZXJ2ZWRfcmVxX3dhaXRxKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPnBlbmRpbmcpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+cHJvY2Vzc2luZyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbnRlcnJ1cHRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmVudHJ5KTsKKwlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOworCWZjLT5iZGkucmFfcGFnZXMgPSAoVk1fTUFYX1JFQURBSEVBRCAqIDEwMjQpIC8gUEFHRV9DQUNIRV9TSVpFOworCWZjLT5iZGkudW5wbHVnX2lvX2ZuID0gZGVmYXVsdF91bnBsdWdfaW9fZm47CisJLyogZnVzZSBkb2VzIGl0J3Mgb3duIHdyaXRlYmFjayBhY2NvdW50aW5nICovCisJZmMtPmJkaS5jYXBhYmlsaXRpZXMgPSBCRElfQ0FQX05PX0FDQ1RfV0I7CisJZmMtPmtoY3RyID0gMDsKKwlmYy0+cG9sbGVkX2ZpbGVzID0gUkJfUk9PVDsKKwlmYy0+ZGV2ID0gc2ItPnNfZGV2OworCWVyciA9IGJkaV9pbml0KCZmYy0+YmRpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX211dGV4X2Rlc3Ryb3k7CisJaWYgKHNiLT5zX2JkZXYpIHsKKwkJZXJyID0gYmRpX3JlZ2lzdGVyKCZmYy0+YmRpLCBOVUxMLCAiJXU6JXUtZnVzZWJsayIsCisJCQkJICAgTUFKT1IoZmMtPmRldiksIE1JTk9SKGZjLT5kZXYpKTsKKwl9IGVsc2UgeworCQllcnIgPSBiZGlfcmVnaXN0ZXJfZGV2KCZmYy0+YmRpLCBmYy0+ZGV2KTsKIAl9Ci0JcmV0dXJuIGZjOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfYmRpX2Rlc3Ryb3k7CisJLyoKKwkgKiBGb3IgYSBzaW5nbGUgZnVzZSBmaWxlc3lzdGVtIHVzZSBtYXggMSUgb2YgZGlydHkgKworCSAqIHdyaXRlYmFjayB0aHJlc2hvbGQuCisJICoKKwkgKiBUaGlzIGdpdmVzIGFib3V0IDFNIG9mIHdyaXRlIGJ1ZmZlciBmb3IgbWVtb3J5IG1hcHMgb24gYQorCSAqIG1hY2hpbmUgd2l0aCAxRyBhbmQgMTAlIGRpcnR5X3JhdGlvLCB3aGljaCBzaG91bGQgYmUgbW9yZQorCSAqIHRoYW4gZW5vdWdoLgorCSAqCisJICogUHJpdmlsZWdlZCB1c2VycyBjYW4gcmFpc2UgaXQgYnkgd3JpdGluZyB0bworCSAqCisJICogICAgL3N5cy9jbGFzcy9iZGkvPGJkaT4vbWF4X3JhdGlvCisJICovCisJYmRpX3NldF9tYXhfcmF0aW8oJmZjLT5iZGksIDEpOworCWZjLT5yZXFjdHIgPSAwOworCWZjLT5ibG9ja2VkID0gMTsKKwlmYy0+YXR0cl92ZXJzaW9uID0gMTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZmYy0+c2NyYW1ibGVfa2V5LCBzaXplb2YoZmMtPnNjcmFtYmxlX2tleSkpOwogCi1lcnJvcl9iZGlfZGVzdHJveToKKwlyZXR1cm4gMDsKKworIGVycm9yX2JkaV9kZXN0cm95OgogCWJkaV9kZXN0cm95KCZmYy0+YmRpKTsKLWVycm9yX2tmcmVlOgorIGVycm9yX211dGV4X2Rlc3Ryb3k6CiAJbXV0ZXhfZGVzdHJveSgmZmMtPmluc3RfbXV0ZXgpOwotCWtmcmVlKGZjKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnVzZV9jb25uX2luaXQpOwogCiB2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CkBAIC01MzIsNyArNTMzLDcgQEAKIAkJCWZ1c2VfcmVxdWVzdF9mcmVlKGZjLT5kZXN0cm95X3JlcSk7CiAJCW11dGV4X2Rlc3Ryb3koJmZjLT5pbnN0X211dGV4KTsKIAkJYmRpX2Rlc3Ryb3koJmZjLT5iZGkpOwotCQlrZnJlZShmYyk7CisJCWZjLT5yZWxlYXNlKGZjKTsKIAl9CiB9CiAKQEAgLTU0Miw3ICs1NDMsNyBAQAogCXJldHVybiBmYzsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmZ1c2VfZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKIHsKIAlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CiAJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOwpAQCAtNTUzLDggKzU1NCw3IEBACiAJcmV0dXJuIGZ1c2VfaWdldChzYiwgMSwgMCwgJmF0dHIsIDAsIDApOwogfQogCi1zdHJ1Y3QgZnVzZV9pbm9kZV9oYW5kbGUKLXsKK3N0cnVjdCBmdXNlX2lub2RlX2hhbmRsZSB7CiAJdTY0IG5vZGVpZDsKIAl1MzIgZ2VuZXJhdGlvbjsKIH07CkBAIC03NjEsNyArNzYxLDYgQEAKIAkJZmMtPm1heF93cml0ZSA9IG1heF90KHVuc2lnbmVkLCA0MDk2LCBmYy0+bWF4X3dyaXRlKTsKIAkJZmMtPmNvbm5faW5pdCA9IDE7CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJZmMtPmJsb2NrZWQgPSAwOwogCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CiB9CkBAIC03ODcsNyArNzg2LDEyIEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX2luaXRfb3V0KTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJnJlcS0+bWlzYy5pbml0X291dDsKIAlyZXEtPmVuZCA9IHByb2Nlc3NfaW5pdF9yZXBseTsKLQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2ZyZWVfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlrZnJlZShmYyk7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC04MjgsMTAgKzgzMiwxNyBAQAogCWlmIChmaWxlLT5mX29wICE9ICZmdXNlX2Rldl9vcGVyYXRpb25zKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZjID0gbmV3X2Nvbm4oc2IpOworCWZjID0ga21hbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwllcnIgPSBmdXNlX2Nvbm5faW5pdChmYywgc2IpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZmMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZjLT5yZWxlYXNlID0gZnVzZV9mcmVlX2Nvbm47CiAJZmMtPmZsYWdzID0gZC5mbGFnczsKIAlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKIAlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOwpAQCAtODQxLDcgKzg1Miw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IGZjOwogCiAJZXJyID0gLUVOT01FTTsKLQlyb290ID0gZ2V0X3Jvb3RfaW5vZGUoc2IsIGQucm9vdG1vZGUpOworCXJvb3QgPSBmdXNlX2dldF9yb290X2lub2RlKHNiLCBkLnJvb3Rtb2RlKTsKIAlpZiAoIXJvb3QpCiAJCWdvdG8gZXJyOwogCkBAIC05NTIsNyArOTYzLDcgQEAKIAogc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZm9vOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmb287CiAKIAlpbm9kZV9pbml0X29uY2UoaW5vZGUpOwogfQpAQCAtMTAzMSw3ICsxMDQyLDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JcHJpbnRrKCJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKIAkgICAgICAgRlVTRV9LRVJORUxfVkVSU0lPTiwgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZnVzZV9jb25uX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZnMvaHVnZXRsYmZzL2lub2RlLmMgYi9mcy9odWdldGxiZnMvaW5vZGUuYwppbmRleCAwYWIwYzZmNS4uNjkwM2QzNyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTI1Miw2ICsyNTIsNyBAQAogCWZvciAoOzspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCXVuc2lnbmVkIGxvbmcgbnIsIHJldDsKKwkJaW50IHJhOwogCiAJCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCiAJCW5yID0gaHVnZV9wYWdlX3NpemUoaCk7CkBAIC0yNzQsMTYgKzI3NSwxOSBAQAogCQkJICovCiAJCQlyZXQgPSBsZW4gPCBuciA/IGxlbiA6IG5yOwogCQkJaWYgKGNsZWFyX3VzZXIoYnVmLCByZXQpKQotCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJcmEgPSAtRUZBVUxUOworCQkJZWxzZQorCQkJCXJhID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBXZSBoYXZlIHRoZSBwYWdlLCBjb3B5IGl0IHRvIHVzZXIgc3BhY2UgYnVmZmVyLgogCQkJICovCi0JCQlyZXQgPSBodWdldGxiZnNfcmVhZF9hY3RvcihwYWdlLCBvZmZzZXQsIGJ1ZiwgbGVuLCBucik7CisJCQlyYSA9IGh1Z2V0bGJmc19yZWFkX2FjdG9yKHBhZ2UsIG9mZnNldCwgYnVmLCBsZW4sIG5yKTsKKwkJCXJldCA9IHJhOwogCQl9Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChyYSA8IDApIHsKIAkJCWlmIChyZXR2YWwgPT0gMCkKLQkJCQlyZXR2YWwgPSByZXQ7CisJCQkJcmV0dmFsID0gcmE7CiAJCQlpZiAocGFnZSkKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IGJkNDhlNWUuLjdhNmU4YzIgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTEwLDggKzExMCw4IEBACiAKIC8qKgogICogaW5vZGVfaW5pdF9hbHdheXMgLSBwZXJmb3JtIGlub2RlIHN0cnVjdHVyZSBpbnRpYWxpc2F0aW9uCi0gKiBAc2IJCS0gc3VwZXJibG9jayBpbm9kZSBiZWxvbmdzIHRvLgotICogQGlub2RlCS0gaW5vZGUgdG8gaW5pdGlhbGlzZQorICogQHNiOiBzdXBlcmJsb2NrIGlub2RlIGJlbG9uZ3MgdG8KKyAqIEBpbm9kZTogaW5vZGUgdG8gaW5pdGlhbGlzZQogICoKICAqIFRoZXNlIGFyZSBpbml0aWFsaXphdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGRvbmUgb24gZXZlcnkgaW5vZGUKICAqIGFsbG9jYXRpb24gYXMgdGhlIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpc2VkIGJ5IHNsYWIgYWxsb2NhdGlvbi4KQEAgLTE2Niw3ICsxNjYsNyBAQAogCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CiAJbWFwcGluZy0+aG9zdCA9IGlub2RlOwogCW1hcHBpbmctPmZsYWdzID0gMDsKLQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfTU9WQUJMRSk7CiAJbWFwcGluZy0+YXNzb2NfbWFwcGluZyA9IE5VTEw7CiAJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CiAJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gMDsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCiAvKioKICAqIGlub2RlX2FkZF90b19saXN0cyAtIGFkZCBhIG5ldyBpbm9kZSB0byByZWxldmFudCBsaXN0cwotICogQHNiCQktIHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0by4KLSAqIEBpbm9kZQktIGlub2RlIHRvIG1hcmsgaW4gdXNlCisgKiBAc2I6IHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0bworICogQGlub2RlOiBpbm9kZSB0byBtYXJrIGluIHVzZQogICoKICAqIFdoZW4gYW4gaW5vZGUgaXMgYWxsb2NhdGVkIGl0IG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IsIGFkZGVkIHRvIHRoZSBpbiB1c2UKICAqIGxpc3QsIHRoZSBvd25pbmcgc3VwZXJibG9jayBhbmQgdGhlIGlub2RlIGhhc2guIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB1bmRlcgpAQCAtNjAxLDcgKzYwMSw3IEBACiAgKglAc2I6IHN1cGVyYmxvY2sKICAqCiAgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suIFRoZSBkZWZhdWx0IGdmcF9tYXNrCi0gKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUuCisgKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9NT1ZBQkxFLgogICoJSWYgSElHSE1FTSBwYWdlcyBhcmUgdW5zdWl0YWJsZSBvciBpdCBpcyBrbm93biB0aGF0IHBhZ2VzIGFsbG9jYXRlZAogICoJZm9yIHRoZSBwYWdlIGNhY2hlIGFyZSBub3QgcmVjbGFpbWFibGUgb3IgbWlncmF0YWJsZSwKICAqCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBzdWl0YWJsZSBmbGFncyBvbiB0aGUKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2Rpci5jIGIvZnMvbWluaXgvZGlyLmMKaW5kZXggZjcwNDMzOC4uZDQ5NDZjNCAxMDA2NDQKLS0tIGEvZnMvbWluaXgvZGlyLmMKKysrIGIvZnMvbWluaXgvZGlyLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCXJldHVybiAtRUlOVkFMOwogCiBnb3RfaXQ6Ci0JcG9zID0gKHBhZ2UtPmluZGV4ID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgcCAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJcG9zID0gcGFnZV9vZmZzZXQocGFnZSkgKyBwIC0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CiAJZXJyID0gX19taW5peF93cml0ZV9iZWdpbihOVUxMLCBwYWdlLT5tYXBwaW5nLCBwb3MsIHNiaS0+c19kaXJzaXplLAogCQkJCQlBT1BfRkxBR19VTklOVEVSUlVQVElCTEUsICZwYWdlLCBOVUxMKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvbXBhZ2UuYyBiL2ZzL21wYWdlLmMKaW5kZXggNTUyYjgwYi4uMTZjM2VmMyAxMDA2NDQKLS0tIGEvZnMvbXBhZ2UuYworKysgYi9mcy9tcGFnZS5jCkBAIC0yNDEsNyArMjQxLDYgQEAKIAkJCQlmaXJzdF9ob2xlID0gcGFnZV9ibG9jazsKIAkJCXBhZ2VfYmxvY2srKzsKIAkJCWJsb2NrX2luX2ZpbGUrKzsKLQkJCWNsZWFyX2J1ZmZlcl9tYXBwZWQobWFwX2JoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTMwOCw3ICszMDcsMTAgQEAKIAkJZ290byBhbGxvY19uZXc7CiAJfQogCi0JaWYgKGJ1ZmZlcl9ib3VuZGFyeShtYXBfYmgpIHx8IChmaXJzdF9ob2xlICE9IGJsb2Nrc19wZXJfcGFnZSkpCisJcmVsYXRpdmVfYmxvY2sgPSBibG9ja19pbl9maWxlIC0gKmZpcnN0X2xvZ2ljYWxfYmxvY2s7CisJbmJsb2NrcyA9IG1hcF9iaC0+Yl9zaXplID4+IGJsa2JpdHM7CisJaWYgKChidWZmZXJfYm91bmRhcnkobWFwX2JoKSAmJiByZWxhdGl2ZV9ibG9jayA9PSBuYmxvY2tzKSB8fAorCSAgICAoZmlyc3RfaG9sZSAhPSBibG9ja3NfcGVyX3BhZ2UpKQogCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFJFQUQsIGJpbyk7CiAJZWxzZQogCQkqbGFzdF9ibG9ja19pbl9iaW8gPSBibG9ja3NbYmxvY2tzX3Blcl9wYWdlIC0gMV07CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuYyBiL2ZzL25jcGZzL2dldG9wdC5jCmluZGV4IDMzNWIwMDMuLjBhZjMzNDkgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2dldG9wdC5jCisrKyBiL2ZzL25jcGZzL2dldG9wdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKglAb3B0czogYW4gYXJyYXkgb2YgJnN0cnVjdCBvcHRpb24gZW50cmllcyBjb250cm9sbGluZyBwYXJzZXIgb3BlcmF0aW9ucwogICoJQG9wdG9wdDogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIGN1cnJlbnQgb3B0aW9uCiAgKglAb3B0YXJnOiBvdXRwdXQ7IHdpbGwgY29udGFpbiB0aGUgdmFsdWUgKGlmIG9uZSBleGlzdHMpCi0gKglAZmxhZzogb3V0cHV0OyBtYXkgYmUgTlVMTDsgc2hvdWxkIHBvaW50IHRvIGEgbG9uZyBmb3Igb3InaW5nIGZsYWdzCiAgKglAdmFsdWU6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgaW50ZWdlciB2YWx1ZQogICoJCW9mIHRoZSBjdXJyZW50IGFyZ3VtZW50LgogICoKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA2ZDViMjEzLi41MTk4YWRhIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0zODQsOSArMzg0LDkgQEAKIAogCWRuYW1lID0gZGV2X25hbWUoZGRldik7CiAJaWYgKGlzZGlnaXQoZG5hbWVbc3RybGVuKGRuYW1lKSAtIDFdKSkKLQkJc25wcmludGYocGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzcCVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXNwJWQiLCBkbmFtZSwgcGFydG5vKTsKIAllbHNlCi0JCXNucHJpbnRmKHBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXMlZCIsIGRuYW1lLCBwYXJ0bm8pOwogCiAJZGV2aWNlX2luaXRpYWxpemUocGRldik7CiAJcGRldi0+Y2xhc3MgPSAmYmxvY2tfY2xhc3M7CkBAIC00NDcsMTYgKzQ0NywxMSBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOwogCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7Ci0JY2hhciAqczsKIAlpbnQgZXJyOwogCiAJZGRldi0+cGFyZW50ID0gZGlzay0+ZHJpdmVyZnNfZGV2OwogCi0Jc3RybGNweShkZGV2LT5idXNfaWQsIGRpc2stPmRpc2tfbmFtZSwgQlVTX0lEX1NJWkUpOwotCS8qIGV3d3cuLi4gc29tZSBvZiB0aGVzZSBidWdnZXJzIGhhdmUgLyBpbiB0aGUgbmFtZS4uLiAqLwotCXMgPSBzdHJjaHIoZGRldi0+YnVzX2lkLCAnLycpOwotCWlmIChzKQotCQkqcyA9ICchJzsKKwlkZXZfc2V0X25hbWUoZGRldiwgZGlzay0+ZGlza19uYW1lKTsKIAogCS8qIGRlbGF5IHVldmVudHMsIHVudGlsIHdlIHNjYW5uZWQgcGFydGl0aW9uIHRhYmxlICovCiAJZGRldi0+dWV2ZW50X3N1cHByZXNzID0gMTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCAzYThiZGQ3Li45NDA2Mzg0IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC0zOTYsNyArMzk2LDkgQEAKIAkJICAgIlByaXZhdGVfQ2xlYW46ICAlOGx1IGtCXG4iCiAJCSAgICJQcml2YXRlX0RpcnR5OiAgJThsdSBrQlxuIgogCQkgICAiUmVmZXJlbmNlZDogICAgICU4bHUga0JcbiIKLQkJICAgIlN3YXA6ICAgICAgICAgICAlOGx1IGtCXG4iLAorCQkgICAiU3dhcDogICAgICAgICAgICU4bHUga0JcbiIKKwkJICAgIktlcm5lbFBhZ2VTaXplOiAlOGx1IGtCXG4iCisJCSAgICJNTVVQYWdlU2l6ZTogICAgJThsdSBrQlxuIiwKIAkJICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gMTAsCiAJCSAgIG1zcy5yZXNpZGVudCA+PiAxMCwKIAkJICAgKHVuc2lnbmVkIGxvbmcpKG1zcy5wc3MgPj4gKDEwICsgUFNTX1NISUZUKSksCkBAIC00MDUsNyArNDA3LDkgQEAKIAkJICAgbXNzLnByaXZhdGVfY2xlYW4gPj4gMTAsCiAJCSAgIG1zcy5wcml2YXRlX2RpcnR5ID4+IDEwLAogCQkgICBtc3MucmVmZXJlbmNlZCA+PiAxMCwKLQkJICAgbXNzLnN3YXAgPj4gMTApOworCQkgICBtc3Muc3dhcCA+PiAxMCwKKwkJICAgdm1hX2tlcm5lbF9wYWdlc2l6ZSh2bWEpID4+IDEwLAorCQkgICB2bWFfbW11X3BhZ2VzaXplKHZtYSkgPj4gMTApOwogCiAJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgIC8qIHZtYSBpcyBjb3BpZWQgc3VjY2Vzc2Z1bGx5ICovCiAJCW0tPnZlcnNpb24gPSAodm1hICE9IGdldF9nYXRlX3ZtYSh0YXNrKSkgPyB2bWEtPnZtX3N0YXJ0IDogMDsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKaW5kZXggODdkZjUxZS4uMDhiOTFiZSAxMDA2NDQKLS0tIGEvZnMvc2VsZWN0LmMKKysrIGIvZnMvc2VsZWN0LmMKQEAgLTEwOSwxMSArMTA5LDExIEBACiB2b2lkIHBvbGxfaW5pdHdhaXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxKQogewogCWluaXRfcG9sbF9mdW5jcHRyKCZwd3EtPnB0LCBfX3BvbGx3YWl0KTsKKwlwd3EtPnBvbGxpbmdfdGFzayA9IGN1cnJlbnQ7CiAJcHdxLT5lcnJvciA9IDA7CiAJcHdxLT50YWJsZSA9IE5VTEw7CiAJcHdxLT5pbmxpbmVfaW5kZXggPSAwOwogfQotCiBFWFBPUlRfU1lNQk9MKHBvbGxfaW5pdHdhaXQpOwogCiBzdGF0aWMgdm9pZCBmcmVlX3BvbGxfZW50cnkoc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKmVudHJ5KQpAQCAtMTQyLDEyICsxNDIsMTAgQEAKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBvbGQpOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTChwb2xsX2ZyZWV3YWl0KTsKIAotc3RhdGljIHN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICpwb2xsX2dldF9lbnRyeShwb2xsX3RhYmxlICpfcCkKK3N0YXRpYyBzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqcG9sbF9nZXRfZW50cnkoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcCkKIHsKLQlzdHJ1Y3QgcG9sbF93cXVldWVzICpwID0gY29udGFpbmVyX29mKF9wLCBzdHJ1Y3QgcG9sbF93cXVldWVzLCBwdCk7CiAJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGUgPSBwLT50YWJsZTsKIAogCWlmIChwLT5pbmxpbmVfaW5kZXggPCBOX0lOTElORV9QT0xMX0VOVFJJRVMpCkBAIC0xNTksNyArMTU3LDYgQEAKIAkJbmV3X3RhYmxlID0gKHN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoIW5ld190YWJsZSkgewogCQkJcC0+ZXJyb3IgPSAtRU5PTUVNOwotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJbmV3X3RhYmxlLT5lbnRyeSA9IG5ld190YWJsZS0+ZW50cmllczsKQEAgLTE3MSwyMCArMTY4LDc1IEBACiAJcmV0dXJuIHRhYmxlLT5lbnRyeSsrOwogfQogCitzdGF0aWMgaW50IHBvbGx3YWtlKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EgPSB3YWl0LT5wcml2YXRlOworCURFQ0xBUkVfV0FJVFFVRVVFKGR1bW15X3dhaXQsIHB3cS0+cG9sbGluZ190YXNrKTsKKworCS8qCisJICogQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgd2FpdHF1ZXVlIGxvY2ssIExPQ0sKKwkgKiBkb2Vzbid0IGltcGx5IHdyaXRlIGJhcnJpZXIgYW5kIHRoZSB1c2VycyBleHBlY3Qgd3JpdGUKKwkgKiBiYXJyaWVyIHNlbWFudGljcyBvbiB3YWtldXAgZnVuY3Rpb25zLiAgVGhlIGZvbGxvd2luZworCSAqIHNtcF93bWIoKSBpcyBlcXVpdmFsZW50IHRvIHNtcF93bWIoKSBpbiB0cnlfdG9fd2FrZV91cCgpCisJICogYW5kIGlzIHBhaXJlZCB3aXRoIHNldF9tYigpIGluIHBvbGxfc2NoZWR1bGVfdGltZW91dC4KKwkgKi8KKwlzbXBfd21iKCk7CisJcHdxLT50cmlnZ2VyZWQgPSAxOworCisJLyoKKwkgKiBQZXJmb3JtIHRoZSBkZWZhdWx0IHdha2UgdXAgb3BlcmF0aW9uIHVzaW5nIGEgZHVtbXkKKwkgKiB3YWl0cXVldWUuCisJICoKKwkgKiBUT0RPOiBUaGlzIGlzIGhhY2t5IGJ1dCB0aGVyZSBjdXJyZW50bHkgaXMgbm8gaW50ZXJmYWNlIHRvCisJICogcGFzcyBpbiBAc3luYy4gIEBzeW5jIGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIGFuZCBvbmNlCisJICogdGhhdCBoYXBwZW5zLCB3YWtlX3VwX3Byb2Nlc3MoKSBjYW4gYmUgdXNlZCBkaXJlY3RseS4KKwkgKi8KKwlyZXR1cm4gZGVmYXVsdF93YWtlX2Z1bmN0aW9uKCZkdW1teV93YWl0LCBtb2RlLCBzeW5jLCBrZXkpOworfQorCiAvKiBBZGQgYSBuZXcgZW50cnkgKi8KIHN0YXRpYyB2b2lkIF9fcG9sbHdhaXQoc3RydWN0IGZpbGUgKmZpbHAsIHdhaXRfcXVldWVfaGVhZF90ICp3YWl0X2FkZHJlc3MsCiAJCQkJcG9sbF90YWJsZSAqcCkKIHsKLQlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqZW50cnkgPSBwb2xsX2dldF9lbnRyeShwKTsKKwlzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EgPSBjb250YWluZXJfb2YocCwgc3RydWN0IHBvbGxfd3F1ZXVlcywgcHQpOworCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICplbnRyeSA9IHBvbGxfZ2V0X2VudHJ5KHB3cSk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwogCWdldF9maWxlKGZpbHApOwogCWVudHJ5LT5maWxwID0gZmlscDsKIAllbnRyeS0+d2FpdF9hZGRyZXNzID0gd2FpdF9hZGRyZXNzOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZlbnRyeS0+d2FpdCwgY3VycmVudCk7CisJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmZW50cnktPndhaXQsIHBvbGx3YWtlKTsKKwllbnRyeS0+d2FpdC5wcml2YXRlID0gcHdxOwogCWFkZF93YWl0X3F1ZXVlKHdhaXRfYWRkcmVzcywgJmVudHJ5LT53YWl0KTsKIH0KIAoraW50IHBvbGxfc2NoZWR1bGVfdGltZW91dChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EsIGludCBzdGF0ZSwKKwkJCSAga3RpbWVfdCAqZXhwaXJlcywgdW5zaWduZWQgbG9uZyBzbGFjaykKK3sKKwlpbnQgcmMgPSAtRUlOVFI7CisKKwlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CisJaWYgKCFwd3EtPnRyaWdnZXJlZCkKKwkJcmMgPSBzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2UoZXhwaXJlcywgc2xhY2ssIEhSVElNRVJfTU9ERV9BQlMpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qCisJICogUHJlcGFyZSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgorCSAqCisJICogVGhlIGZvbGxvd2luZyBzZXRfbWIoKSBzZXJ2ZXMgdHdvIHB1cnBvc2VzLiAgRmlyc3QsIGl0J3MKKwkgKiB0aGUgY291bnRlcnBhcnQgcm1iIG9mIHRoZSB3bWIgaW4gcG9sbHdha2UoKSBzdWNoIHRoYXQgZGF0YQorCSAqIHdyaXR0ZW4gYmVmb3JlIHdha2UgdXAgaXMgYWx3YXlzIHZpc2libGUgYWZ0ZXIgd2FrZSB1cC4KKwkgKiBTZWNvbmQsIHRoZSBmdWxsIGJhcnJpZXIgZ3VhcmFudGVlcyB0aGF0IHRyaWdnZXJlZCBjbGVhcmluZworCSAqIGRvZXNuJ3QgcGFzcyBldmVudCBjaGVjayBvZiB0aGUgbmV4dCBpdGVyYXRpb24uICBOb3RlIHRoYXQKKwkgKiB0aGlzIHByb2JsZW0gZG9lc24ndCBleGlzdCBmb3IgdGhlIGZpcnN0IGl0ZXJhdGlvbiBhcworCSAqIGFkZF93YWl0X3F1ZXVlKCkgaGFzIGZ1bGwgYmFycmllciBzZW1hbnRpY3MuCisJICovCisJc2V0X21iKHB3cS0+dHJpZ2dlcmVkLCAwKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wocG9sbF9zY2hlZHVsZV90aW1lb3V0KTsKKwogLyoqCiAgKiBwb2xsX3NlbGVjdF9zZXRfdGltZW91dCAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCB0aGUgdGltZW91dCB2YWx1ZQogICogQHRvOgkJcG9pbnRlciB0byB0aW1lc3BlYyB2YXJpYWJsZSBmb3IgdGhlIGZpbmFsIHRpbWVvdXQKQEAgLTM0MCw4ICszOTIsNiBAQAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyAqcmlucCwgKnJvdXRwLCAqcmV4cCwgKmlucCwgKm91dHAsICpleHA7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQogCQlpbnAgPSBmZHMtPmluOyBvdXRwID0gZmRzLT5vdXQ7IGV4cCA9IGZkcy0+ZXg7CiAJCXJpbnAgPSBmZHMtPnJlc19pbjsgcm91dHAgPSBmZHMtPnJlc19vdXQ7IHJleHAgPSBmZHMtPnJlc19leDsKIApAQCAtNDExLDEwICs0NjEsMTAgQEAKIAkJCXRvID0gJmV4cGlyZTsKIAkJfQogCi0JCWlmICghc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlKHRvLCBzbGFjaywgSFJUSU1FUl9NT0RFX0FCUykpCisJCWlmICghcG9sbF9zY2hlZHVsZV90aW1lb3V0KCZ0YWJsZSwgVEFTS19JTlRFUlJVUFRJQkxFLAorCQkJCQkgICB0bywgc2xhY2spKQogCQkJdGltZWRfb3V0ID0gMTsKIAl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCiAJcG9sbF9mcmVld2FpdCgmdGFibGUpOwogCkBAIC02NjYsNyArNzE2LDYgQEAKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwb2xsX2xpc3QgKndhbGs7CiAKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJZm9yICh3YWxrID0gbGlzdDsgd2FsayAhPSBOVUxMOyB3YWxrID0gd2Fsay0+bmV4dCkgewogCQkJc3RydWN0IHBvbGxmZCAqIHBmZCwgKiBwZmRfZW5kOwogCkBAIC03MDksMTAgKzc1OCw5IEBACiAJCQl0byA9ICZleHBpcmU7CiAJCX0KIAotCQlpZiAoIXNjaGVkdWxlX2hydGltZW91dF9yYW5nZSh0bywgc2xhY2ssIEhSVElNRVJfTU9ERV9BQlMpKQorCQlpZiAoIXBvbGxfc2NoZWR1bGVfdGltZW91dCh3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsIHRvLCBzbGFjaykpCiAJCQl0aW1lZF9vdXQgPSAxOwogCX0KLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmV0dXJuIGNvdW50OwogfQogCmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggMDkyMWQ2ZC4uYWMwMmI1NiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAKIAlpZiAoZmxhZ3MgJiBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUpIHsKIAkJcmV0ID0gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgb2Zmc2V0LCBlbmRieXRlLAotCQkJCQkJV0JfU1lOQ19OT05FKTsKKwkJCQkJCVdCX1NZTkNfQUxMKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zdXBlci5jIGIvZnMvdWJpZnMvc3VwZXIuYwppbmRleCAwZDc1NjRiLi44OTU1NmVlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zdXBlci5jCisrKyBiL2ZzL3ViaWZzL3N1cGVyLmMKQEAgLTQzMiwxMiArNDMyLDE5IEBACiAJaW50IGksIGVycjsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IHNiLT5zX2ZzX2luZm87CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKLQkJLnN5bmNfbW9kZSAgID0gd2FpdCA/IFdCX1NZTkNfQUxMIDogV0JfU1lOQ19IT0xELAorCQkuc3luY19tb2RlICAgPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX05PTkUsCiAJCS5yYW5nZV9zdGFydCA9IDAsCiAJCS5yYW5nZV9lbmQgICA9IExMT05HX01BWCwKIAkJLm5yX3RvX3dyaXRlID0gTE9OR19NQVgsCiAJfTsKIAorCS8qCisJICogTm90ZSBieSBha3BtIGFib3V0IFdCX1NZTkNfTk9ORSB1c2VkIGFib3ZlOiB6ZXJvIEB3YWl0IGlzIGp1c3QgYW4KKwkgKiBhZHZpc29yeSB0aGluZyB0byBoZWxwIHRoZSBmaWxlIHN5c3RlbSBzaG92ZSBsb3RzIG9mIGRhdGEgaW50byB0aGUKKwkgKiBxdWV1ZXMuIElmIHNvbWUgZ2V0cyBtaXNzZWQgdGhlbiBpdCdsbCBiZSBwaWNrZWQgdXAgb24gdGhlIHNlY29uZAorCSAqICctPnN5bmNfZnMoKScgY2FsbCwgd2l0aCBub24temVybyBAd2FpdC4KKwkgKi8KKwogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQgYi9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkCmluZGV4IDBmODk1NmQuLjFmNDRlN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tZnJ2L0tidWlsZApAQCAtMywzICszLDQgQEAKIGhlYWRlci15ICs9IHJlZ2lzdGVycy5oCiAKIHVuaWZkZWYteSArPSB0ZXJtaW9zLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaAppbmRleCA0NmQ2OTZiLi4yOTZjMzVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCkBAIC0zNSwxMCArMzUsNiBAQAogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQl7IChpKSB9CiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsIGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLWZydi9ieXRlb3JkZXIuaAppbmRleCA0MTFiZWMzLi4xMTg3ZTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2J5dGVvcmRlci5oCkBAIC0xLDEzICsxLDcgQEAKICNpZm5kZWYgX0FTTV9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3N3YWIuaCBiL2luY2x1ZGUvYXNtLWZydi9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMzM5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9zd2FiLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfQVNNX1NXQUJfSAorI2RlZmluZSBfQVNNX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fU1dBQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCA4YWYyNzYzLi4zN2I4MmNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKQEAgLTI4LDYgKzI4LDE3IEBACiAjZGVmaW5lIEJVR0ZMQUdfV0FSTklORwkoMTw8MCkKICNlbmRpZgkvKiBDT05GSUdfR0VORVJJQ19CVUcgKi8KIAorLyoKKyAqIERvbid0IHVzZSBCVUcoKSBvciBCVUdfT04oKSB1bmxlc3MgdGhlcmUncyByZWFsbHkgbm8gd2F5IG91dDsgb25lCisgKiBleGFtcGxlIG1pZ2h0IGJlIGRldGVjdGluZyBkYXRhIHN0cnVjdHVyZSBjb3JydXB0aW9uIGluIHRoZSBtaWRkbGUKKyAqIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGNhbid0IGJlIGJhY2tlZCBvdXQgb2YuICBJZiB0aGUgKHN1YilzeXN0ZW0KKyAqIGNhbiBzb21laG93IGNvbnRpbnVlIG9wZXJhdGluZywgcGVyaGFwcyB3aXRoIHJlZHVjZWQgZnVuY3Rpb25hbGl0eSwKKyAqIGl0J3MgcHJvYmFibHkgbm90IEJVRy13b3J0aHkuCisgKgorICogSWYgeW91J3JlIHRlbXB0ZWQgdG8gQlVHKCksIHRoaW5rIGFnYWluOiAgaXMgY29tcGxldGVseSBnaXZpbmcgdXAKKyAqIHJlYWxseSB0aGUgKm9ubHkqIHNvbHV0aW9uPyAgVGhlcmUgYXJlIHVzdWFsbHkgYmV0dGVyIG9wdGlvbnMsIHdoZXJlCisgKiB1c2VycyBkb24ndCBuZWVkIHRvIHJlYm9vdCBBU0FQIGFuZCBjYW4gbW9zdGx5IHNodXQgZG93biBjbGVhbmx5LgorICovCiAjaWZuZGVmIEhBVkVfQVJDSF9CVUcKICNkZWZpbmUgQlVHKCkgZG8geyBcCiAJcHJpbnRrKCJCVUc6IGZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOyBcCkBAIC0zOSw2ICs1MCwxMiBAQAogI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseShjb25kaXRpb24pKSBCVUcoKTsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKy8qCisgKiBXQVJOKCksIFdBUk5fT04oKSwgV0FSTl9PTl9PTkNFLCBhbmQgc28gb24gY2FuIGJlIHVzZWQgdG8gcmVwb3J0CisgKiBzaWduaWZpY2FudCBpc3N1ZXMgdGhhdCBuZWVkIHByb21wdCBhdHRlbnRpb24gaWYgdGhleSBzaG91bGQgZXZlcgorICogYXBwZWFyIGF0IHJ1bnRpbWUuICBVc2UgdGhlIHZlcnNpb25zIHdpdGggcHJpbnRrIGZvcm1hdCBzdHJpbmdzCisgKiB0byBwcm92aWRlIGJldHRlciBkaWFnbm9zdGljcy4KKyAqLwogI2lmbmRlZiBfX1dBUk4KICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdm9pZCB3YXJuX3Nsb3dwYXRoKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9sb2NhbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9sb2NhbC5oCmluZGV4IDMzZDdkMDQuLmRiZDYxNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9BU01fR0VORVJJQ19MT0NBTF9ICiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaAppbmRleCAzNmZhMjg2Li40YzhkMGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKQEAgLTY5LDE1ICs2OSw4IEBACiB9KQogI2VuZGlmIC8qIENPTkZJR19GTEFUTUVNL0RJU0NPTlRJR01FTS9TUEFSU0VNRU0gKi8KIAotI2lmZGVmIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRQotc3RydWN0IHBhZ2U7Ci0vKiB0aGlzIGlzIHVzZWZ1bCB3aGVuIGlubGluZWQgcGZuX3RvX3BhZ2UgaXMgdG9vIGJpZyAqLwotZXh0ZXJuIHN0cnVjdCBwYWdlICpwZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHBmbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX3RvX3BmbihzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0jZWxzZQogI2RlZmluZSBwYWdlX3RvX3BmbiBfX3BhZ2VfdG9fcGZuCiAjZGVmaW5lIHBmbl90b19wYWdlIF9fcGZuX3RvX3BhZ2UKLSNlbmRpZiAvKiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UgKi8KIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZCBiL2luY2x1ZGUvYXNtLW0zMnIvS2J1aWxkCmluZGV4IGM2OGUxNjguLjI3YjEwOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvS2J1aWxkCkBAIC0xICsxLDIgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaAppbmRleCAzYTM4ZmZlLi4yZWVkMzBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmgKQEAgLTksNiArOSw3IEBACiAgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIEhpcm9rYXp1IFRha2F0YSA8dGFrYXRhIGF0IGxpbnV4LW0zMnIub3JnPgogICovCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKQEAgLTE3LDEzICsxOCw2IEBACiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLS8qCi0gKiBNYWtlIHN1cmUgZ2NjIGRvZXNuJ3QgdHJ5IHRvIGJlIGNsZXZlciBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kCi0gKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCi0gKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaAppbmRleCAxMGIyYzFkLi42MWZmOWNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvYnl0ZW9yZGVyLmgKQEAgLTEsMTIgKzEsNyBAQAogI2lmbmRlZiBfQVNNX00zMlJfQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9NMzJSX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKQogIyAgaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvc3dhYi5oIGIvaW5jbHVkZS9hc20tbTMyci9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NzNlMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvc3dhYi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9NMzJSX1NXQUJfSAorI2RlZmluZSBfQVNNX00zMlJfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9NMzJSX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQgYi9pbmNsdWRlL2FzbS1tNjhrL0tidWlsZAppbmRleCAxYTkyMmZhLi41MmZkOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL0tidWlsZApAQCAtMSwyICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiBoZWFkZXIteSArPSBjYWNoZWN0bC5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaAppbmRleCA0OTE1Mjk0Li5lYjBhYjlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fQVJDSF9NNjhLX0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9NNjhLX0FUT01JQ19fCiAKLQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpAQCAtMTMsNyArMTMsNiBAQAogICogV2UgZG8gbm90IGhhdmUgU01QIG02OGsgc3lzdGVtcywgc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhhdC4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IGludCBjb3VudGVyOyB9IGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaAppbmRleCBiMzU0YWNkLi4zMDA4NjY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYnl0ZW9yZGVyLmgKQEAgLTEsMTkgKzEsNyBAQAogI2lmbmRlZiBfTTY4S19CWVRFT1JERVJfSAogI2RlZmluZSBfTTY4S19CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4KLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCi17Ci0JX19hc21fXygicm9sdyAjOCwlMDsgc3dhcCAlMDsgcm9sdyAjOCwlMCIgOiAiPWQiICh2YWwpIDogIjAiICh2YWwpKTsKLQlyZXR1cm4gdmFsOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9NNjhLX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N3YWIuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjFlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N3YWIuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9NNjhLX1NXQUJfSAorI2RlZmluZSBfTTY4S19TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisJX19hc21fXygicm9sdyAjOCwlMDsgc3dhcCAlMDsgcm9sdyAjOCwlMCIgOiAiPWQiICh2YWwpIDogIjAiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmIC8qIF9NNjhLX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZAppbmRleCBjNjhlMTY4Li4yN2IxMDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZApAQCAtMSArMSwyIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKaW5kZXggMjdjOTY5MC4uYmMwNjQ4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F0b21pYy5oCkBAIC0yMCwxNSArMjAsNiBAQAogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi0vKgotICogTWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIgYW5kIG1vdmUgdGhpbmdzIGFyb3VuZAotICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAotICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludAljb3VudGVyOwotfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaAppbmRleCAzYzk5M2NjLi40NWIxOGRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnl0ZW9yZGVyLmgKQEAgLTEsNDYgKzEsNyBAQAotLyogTU4xMDMwMCBCeXRlLW9yZGVyIHByaW1pdGl2ZSBjb25zdHJ1Y3Rpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KICNpZm5kZWYgX0FTTV9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQotX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0JX191MzIgcmV0OwotCWFzbSgic3dhcCAlMSwlMCIgOiAiPXIiIChyZXQpIDogInIiICh4KSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCi1fX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgeCkKLXsKLQlfX3UxNiByZXQ7Ci0JYXNtKCJzd2FwaCAlMSwlMCIgOiAiPXIiIChyZXQpIDogInIiICh4KSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FiMzIoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fYXJjaF9fc3dhYjE2KHgpCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3N3YWIuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDRkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3N3YWIuaApAQCAtMCwwICsxLDQyIEBACisvKiBNTjEwMzAwIEJ5dGUtb3JkZXIgcHJpbWl0aXZlIGNvbnN0cnVjdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1NXQUJfSAorI2RlZmluZSBfQVNNX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK19fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKK3sKKwlfX3UzMiByZXQ7CisJYXNtKCJzd2FwICUxLCUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHgpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJX191MTYgcmV0OworCWFzbSgic3dhcGggJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOworCXJldHVybiByZXQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjZW5kaWYgLyogX0FTTV9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaAppbmRleCBiM2IyMzU0Li42N2FkNjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCkBAIC0xNCw4ICsxNCw3IEBACiAjZGVmaW5lIF9YVEVOU0FfQVRPTUlDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCAzOWRhNjY2Li5hMzMyM2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMTc5LDcgKzE3OSw2IEBACiB1bmlmZGVmLXkgKz0gYXV4dmVjLmgKIHVuaWZkZWYteSArPSBiaW5mbXRzLmgKIHVuaWZkZWYteSArPSBibGt0cmFjZV9hcGkuaAotdW5pZmRlZi15ICs9IGJ5dGVvcmRlci5oCiB1bmlmZGVmLXkgKz0gY2FwYWJpbGl0eS5oCiB1bmlmZGVmLXkgKz0gY2FwaS5oCiB1bmlmZGVmLXkgKz0gY2Npc3NfaW9jdGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oCmluZGV4IGY0ZDA1Y2MuLjkxYTc3MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpZm5kZWYgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKICNkZWZpbmUgX0xJTlVYX0FVVE9fREVWX0lPQ1RMX0gKIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgQVVUT0ZTX0RFVklDRV9OQU1FCQkiYXV0b2ZzIgpAQCAtMjUsNiArMjYsNjAgQEAKICAqIEFuIGlvY3RsIGludGVyZmFjZSBmb3IgYXV0b2ZzIG1vdW50IHBvaW50IGNvbnRyb2wuCiAgKi8KIAorc3RydWN0IGFyZ3NfcHJvdG92ZXIgeworCV9fdTMyCXZlcnNpb247Cit9OworCitzdHJ1Y3QgYXJnc19wcm90b3N1YnZlciB7CisJX191MzIJc3ViX3ZlcnNpb247Cit9OworCitzdHJ1Y3QgYXJnc19vcGVubW91bnQgeworCV9fdTMyCWRldmlkOworfTsKKworc3RydWN0IGFyZ3NfcmVhZHkgeworCV9fdTMyCXRva2VuOworfTsKKworc3RydWN0IGFyZ3NfZmFpbCB7CisJX191MzIJdG9rZW47CisJX19zMzIJc3RhdHVzOworfTsKKworc3RydWN0IGFyZ3Nfc2V0cGlwZWZkIHsKKwlfX3MzMglwaXBlZmQ7Cit9OworCitzdHJ1Y3QgYXJnc190aW1lb3V0IHsKKwlfX3U2NAl0aW1lb3V0OworfTsKKworc3RydWN0IGFyZ3NfcmVxdWVzdGVyIHsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworfTsKKworc3RydWN0IGFyZ3NfZXhwaXJlIHsKKwlfX3UzMglob3c7Cit9OworCitzdHJ1Y3QgYXJnc19hc2t1bW91bnQgeworCV9fdTMyCW1heV91bW91bnQ7Cit9OworCitzdHJ1Y3QgYXJnc19pc21vdW50cG9pbnQgeworCXVuaW9uIHsKKwkJc3RydWN0IGFyZ3NfaW4geworCQkJX191MzIJdHlwZTsKKwkJfSBpbjsKKwkJc3RydWN0IGFyZ3Nfb3V0IHsKKwkJCV9fdTMyCWRldmlkOworCQkJX191MzIJbWFnaWM7CisJCX0gb3V0OworCX07Cit9OworCiAvKgogICogQWxsIHRoZSBpb2N0bHMgdXNlIHRoaXMgc3RydWN0dXJlLgogICogV2hlbiBzZW5kaW5nIGEgcGF0aCBzaXplIG11c3QgYWNjb3VudCBmb3IgdGhlIHRvdGFsIGxlbmd0aApAQCAtMzksMjAgKzk0LDMyIEBACiAJCQkJICogaW5jbHVkaW5nIHRoaXMgc3RydWN0ICovCiAJX19zMzIgaW9jdGxmZDsJCS8qIGF1dG9tb3VudCBjb21tYW5kIGZkICovCiAKLQlfX3UzMiBhcmcxOwkJLyogQ29tbWFuZCBwYXJhbWV0ZXJzICovCi0JX191MzIgYXJnMjsKKwkvKiBDb21tYW5kIHBhcmFtZXRlcnMgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IGFyZ3NfcHJvdG92ZXIJCXByb3RvdmVyOworCQlzdHJ1Y3QgYXJnc19wcm90b3N1YnZlcgkJcHJvdG9zdWJ2ZXI7CisJCXN0cnVjdCBhcmdzX29wZW5tb3VudAkJb3Blbm1vdW50OworCQlzdHJ1Y3QgYXJnc19yZWFkeQkJcmVhZHk7CisJCXN0cnVjdCBhcmdzX2ZhaWwJCWZhaWw7CisJCXN0cnVjdCBhcmdzX3NldHBpcGVmZAkJc2V0cGlwZWZkOworCQlzdHJ1Y3QgYXJnc190aW1lb3V0CQl0aW1lb3V0OworCQlzdHJ1Y3QgYXJnc19yZXF1ZXN0ZXIJCXJlcXVlc3RlcjsKKwkJc3RydWN0IGFyZ3NfZXhwaXJlCQlleHBpcmU7CisJCXN0cnVjdCBhcmdzX2Fza3Vtb3VudAkJYXNrdW1vdW50OworCQlzdHJ1Y3QgYXJnc19pc21vdW50cG9pbnQJaXNtb3VudHBvaW50OworCX07CiAKIAljaGFyIHBhdGhbMF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hdXRvZnNfZGV2X2lvY3RsKHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICppbikKIHsKKwltZW1zZXQoaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCkpOwogCWluLT52ZXJfbWFqb3IgPSBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUFKT1I7CiAJaW4tPnZlcl9taW5vciA9IEFVVE9GU19ERVZfSU9DVExfVkVSU0lPTl9NSU5PUjsKIAlpbi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCk7CiAJaW4tPmlvY3RsZmQgPSAtMTsKLQlpbi0+YXJnMSA9IDA7Ci0JaW4tPmFyZzIgPSAwOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oIGIvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oCmluZGV4IDIyNTM3MTYuLjU1ZmE0NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV0b19mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKQEAgLTI5LDEwICsyOSw2NCBAQAogI2RlZmluZSBBVVRPRlNfRVhQX0lNTUVESUFURQkJMQogI2RlZmluZSBBVVRPRlNfRVhQX0xFQVZFUwkJMgogCi0jZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTB4MDAwMAotI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMHgwMDAxCi0jZGVmaW5lIEFVVE9GU19UWVBFX0RJUkVDVAkJMHgwMDAyCi0jZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJMHgwMDA0CisjZGVmaW5lIEFVVE9GU19UWVBFX0FOWQkJCTBVCisjZGVmaW5lIEFVVE9GU19UWVBFX0lORElSRUNUCQkxVQorI2RlZmluZSBBVVRPRlNfVFlQRV9ESVJFQ1QJCTJVCisjZGVmaW5lIEFVVE9GU19UWVBFX09GRlNFVAkJNFUKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9JTkRJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2luZGlyZWN0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9JTkRJUkVDVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfZGlyZWN0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0RJUkVDVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfRElSRUNUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9hdXRvZnNfdHlwZV9vZmZzZXQodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfb2Zmc2V0KHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV90cmlnZ2VyKHVuc2lnbmVkIGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA9PSBBVVRPRlNfVFlQRV9ESVJFQ1QgfHwgdHlwZSA9PSBBVVRPRlNfVFlQRV9PRkZTRVQpOworfQorCisvKgorICogVGhpcyBpc24ndCByZWFsbHkgYSB0eXBlIGFzIHdlIHVzZSBpdCB0byBzYXkgIm5vIHR5cGUgc2V0IiB0bworICogaW5kaWNhdGUgd2Ugd2FudCB0byBzZWFyY2ggZm9yICJhbnkiIG1vdW50IGluIHRoZQorICogYXV0b2ZzX2Rldl9pb2N0bF9pc21vdW50cG9pbnQoKSBkZXZpY2UgaW9jdGwgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfYW55KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX0FOWTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX2FueSh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfQU5ZKTsKK30KIAogLyogRGFlbW9uIG5vdGlmaWNhdGlvbiBwYWNrZXQgdHlwZXMgKi8KIGVudW0gYXV0b2ZzX25vdGlmeSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDZjYmZiZTIuLjc3YjRhOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEJJTlBSTV9CVUZfU0laRSAxMjgKIAogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNkZWZpbmUgQ09SRU5BTUVfTUFYX1NJWkUgMTI4CiAKQEAgLTEwNiw3ICsxMDcsNyBAQAogZXh0ZXJuIGludCBicHJtX21tX2luaXQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7CiBleHRlcm4gaW50IGNvcHlfc3RyaW5nc19rZXJuZWwoaW50IGFyZ2MsY2hhciAqKiBhcmd2LHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgaW5zdGFsbF9leGVjX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwotZXh0ZXJuIGludCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworZXh0ZXJuIHZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldyk7CiBleHRlcm4gdm9pZCBmcmVlX2Jwcm0oc3RydWN0IGxpbnV4X2JpbnBybSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjAwMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0jaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfSAotI2RlZmluZSBfTElOVVhfQllURU9SREVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhYi5oPgotCi0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotIyBlcnJvciBGaXggYXNtL2J5dGVvcmRlci5oIHRvIGRlZmluZSBvbmUgZW5kaWFubmVzcwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKF9fQklHX0VORElBTikKLSMgZXJyb3IgRml4IGFzbS9ieXRlb3JkZXIuaCB0byBkZWZpbmUgYXJjaCBlbmRpYW5uZXNzCi0jZW5kaWYKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotIyB1bmRlZiBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0Ci0jZW5kaWYKLQotI2lmZGVmIF9fQklHX0VORElBTgotIyB1bmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fQklHX0VORElBTiA0MzIxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0jIGRlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLSMgZGVmaW5lIF9fQklHX0VORElBTl9CSVRGSUVMRAotI2VuZGlmCi0KLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTE2KShfX2xlMTYpKHgpKQotIyBkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MzIpKF9fbGUzMikoeCkpCi0jIGRlZmluZSBfX2xlNjRfdG9fY3B1KHgpICgoX19mb3JjZSBfX3U2NCkoX19sZTY0KSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgKChfX2ZvcmNlIF9fbGUxNikoX191MTYpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fZm9yY2UgX19sZTMyKShfX3UzMikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX19mb3JjZSBfX2xlNjQpKF9fdTY0KSh4KSkKLQotIyBkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX19mb3JjZSBfX3UxNikoX19iZTE2KSh4KSkKLSMgZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgX19zd2FiMzIoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCi0jIGRlZmluZSBfX2JlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX2ZvcmNlIF9fdTY0KShfX2JlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fZm9yY2UgX19iZTE2KV9fc3dhYjE2KHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fZm9yY2UgX19iZTMyKV9fc3dhYjMyKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSAoKF9fZm9yY2UgX19iZTY0KV9fc3dhYjY0KHgpKQotI2VuZGlmCi0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTE2KShfX2JlMTYpKHgpKQotIyBkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCi0jIGRlZmluZSBfX2JlNjRfdG9fY3B1KHgpICgoX19mb3JjZSBfX3U2NCkoX19iZTY0KSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKChfX2ZvcmNlIF9fYmUxNikoX191MTYpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fZm9yY2UgX19iZTMyKShfX3UzMikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTY0KHgpICgoX19mb3JjZSBfX2JlNjQpKF9fdTY0KSh4KSkKLQotIyBkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX19mb3JjZSBfX3UxNikoX19sZTE2KSh4KSkKLSMgZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgX19zd2FiMzIoKF9fZm9yY2UgX191MzIpKF9fbGUzMikoeCkpCi0jIGRlZmluZSBfX2xlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX2ZvcmNlIF9fdTY0KShfX2xlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fZm9yY2UgX19sZTE2KV9fc3dhYjE2KHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fZm9yY2UgX19sZTMyKV9fc3dhYjMyKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fZm9yY2UgX19sZTY0KV9fc3dhYjY0KHgpKQotI2VuZGlmCi0KLS8qCi0gKiBUaGVzZSBoZWxwZXJzIGNvdWxkIGJlIHBoYXNlZCBvdXQgb3ZlciB0aW1lIGFzIHRoZSBiYXNlIHZlcnNpb24KLSAqIGhhbmRsZXMgY29uc3RhbnQgZm9sZGluZy4KLSAqLwotI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpIF9fY3B1X3RvX2JlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgX19jcHVfdG9fYmUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpIF9fYmUxNl90b19jcHUoeCkKLQotI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpIF9fbGUxNl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSBfX2xlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgX19sZTY0X3RvX2NwdSh4KQotI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpIF9fYmUxNl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgX19iZTY0X3RvX2NwdSh4KQotCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgX19jcHVfdG9fbGUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpIF9fY3B1X3RvX2xlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSBfX2NwdV90b19sZTY0KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgX19jcHVfdG9fYmUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpIF9fY3B1X3RvX2JlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSBfX2NwdV90b19iZTY0KHgpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xlMTZfdG9fY3B1cyhfX3UxNiAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWIxNnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2xlMTZzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19sZTMyX3RvX2NwdXMoX191MzIgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiMzJzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19sZTMycyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fbGU2NF90b19jcHVzKF9fdTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjY0cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fbGU2NHMoX191NjQgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2JlMTZfdG9fY3B1cyhfX3UxNiAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWIxNnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2JlMTZzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19iZTMyX3RvX2NwdXMoX191MzIgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiMzJzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19iZTMycyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYmU2NF90b19jcHVzKF9fdTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjY0cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fYmU2NHMoX191NjQgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19sZTE2X3RvX2NwdXAoY29uc3QgX19sZTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UxNikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjE2cCgoX19mb3JjZSBfX3UxNiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19sZTMyX3RvX2NwdXAoY29uc3QgX19sZTMyICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UzMikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjMycCgoX19mb3JjZSBfX3UzMiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19sZTY0X3RvX2NwdXAoY29uc3QgX19sZTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3U2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjY0cCgoX19mb3JjZSBfX3U2NCAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTE2IF9fY3B1X3RvX2xlMTZwKGNvbnN0IF9fdTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlMTYpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlMTYpX19zd2FiMTZwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTMyIF9fY3B1X3RvX2xlMzJwKGNvbnN0IF9fdTMyICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlMzIpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlMzIpX19zd2FiMzJwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTY0IF9fY3B1X3RvX2xlNjRwKGNvbnN0IF9fdTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlNjQpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlNjQpX19zd2FiNjRwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19iZTE2X3RvX2NwdXAoY29uc3QgX19iZTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UxNikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjE2cCgoX19mb3JjZSBfX3UxNiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19iZTMyX3RvX2NwdXAoY29uc3QgX19iZTMyICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UzMikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjMycCgoX19mb3JjZSBfX3UzMiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19iZTY0X3RvX2NwdXAoY29uc3QgX19iZTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3U2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjY0cCgoX19mb3JjZSBfX3U2NCAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTE2IF9fY3B1X3RvX2JlMTZwKGNvbnN0IF9fdTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlMTYpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMTYpX19zd2FiMTZwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyIF9fY3B1X3RvX2JlMzJwKGNvbnN0IF9fdTMyICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpX19zd2FiMzJwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTY0IF9fY3B1X3RvX2JlNjRwKGNvbnN0IF9fdTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpX19zd2FiNjRwKHApOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSMgZGVmaW5lIGxlMTZfdG9fY3B1IF9fbGUxNl90b19jcHUKLSMgZGVmaW5lIGxlMzJfdG9fY3B1IF9fbGUzMl90b19jcHUKLSMgZGVmaW5lIGxlNjRfdG9fY3B1IF9fbGU2NF90b19jcHUKLSMgZGVmaW5lIGJlMTZfdG9fY3B1IF9fYmUxNl90b19jcHUKLSMgZGVmaW5lIGJlMzJfdG9fY3B1IF9fYmUzMl90b19jcHUKLSMgZGVmaW5lIGJlNjRfdG9fY3B1IF9fYmU2NF90b19jcHUKLSMgZGVmaW5lIGNwdV90b19sZTE2IF9fY3B1X3RvX2xlMTYKLSMgZGVmaW5lIGNwdV90b19sZTMyIF9fY3B1X3RvX2xlMzIKLSMgZGVmaW5lIGNwdV90b19sZTY0IF9fY3B1X3RvX2xlNjQKLSMgZGVmaW5lIGNwdV90b19iZTE2IF9fY3B1X3RvX2JlMTYKLSMgZGVmaW5lIGNwdV90b19iZTMyIF9fY3B1X3RvX2JlMzIKLSMgZGVmaW5lIGNwdV90b19iZTY0IF9fY3B1X3RvX2JlNjQKLQotIyBkZWZpbmUgbGUxNl90b19jcHVwIF9fbGUxNl90b19jcHVwCi0jIGRlZmluZSBsZTMyX3RvX2NwdXAgX19sZTMyX3RvX2NwdXAKLSMgZGVmaW5lIGxlNjRfdG9fY3B1cCBfX2xlNjRfdG9fY3B1cAotIyBkZWZpbmUgYmUxNl90b19jcHVwIF9fYmUxNl90b19jcHVwCi0jIGRlZmluZSBiZTMyX3RvX2NwdXAgX19iZTMyX3RvX2NwdXAKLSMgZGVmaW5lIGJlNjRfdG9fY3B1cCBfX2JlNjRfdG9fY3B1cAotIyBkZWZpbmUgY3B1X3RvX2xlMTZwIF9fY3B1X3RvX2xlMTZwCi0jIGRlZmluZSBjcHVfdG9fbGUzMnAgX19jcHVfdG9fbGUzMnAKLSMgZGVmaW5lIGNwdV90b19sZTY0cCBfX2NwdV90b19sZTY0cAotIyBkZWZpbmUgY3B1X3RvX2JlMTZwIF9fY3B1X3RvX2JlMTZwCi0jIGRlZmluZSBjcHVfdG9fYmUzMnAgX19jcHVfdG9fYmUzMnAKLSMgZGVmaW5lIGNwdV90b19iZTY0cCBfX2NwdV90b19iZTY0cAotCi0jIGRlZmluZSBsZTE2X3RvX2NwdXMgX19sZTE2X3RvX2NwdXMKLSMgZGVmaW5lIGxlMzJfdG9fY3B1cyBfX2xlMzJfdG9fY3B1cwotIyBkZWZpbmUgbGU2NF90b19jcHVzIF9fbGU2NF90b19jcHVzCi0jIGRlZmluZSBiZTE2X3RvX2NwdXMgX19iZTE2X3RvX2NwdXMKLSMgZGVmaW5lIGJlMzJfdG9fY3B1cyBfX2JlMzJfdG9fY3B1cwotIyBkZWZpbmUgYmU2NF90b19jcHVzIF9fYmU2NF90b19jcHVzCi0jIGRlZmluZSBjcHVfdG9fbGUxNnMgX19jcHVfdG9fbGUxNnMKLSMgZGVmaW5lIGNwdV90b19sZTMycyBfX2NwdV90b19sZTMycwotIyBkZWZpbmUgY3B1X3RvX2xlNjRzIF9fY3B1X3RvX2xlNjRzCi0jIGRlZmluZSBjcHVfdG9fYmUxNnMgX19jcHVfdG9fYmUxNnMKLSMgZGVmaW5lIGNwdV90b19iZTMycyBfX2NwdV90b19iZTMycwotIyBkZWZpbmUgY3B1X3RvX2JlNjRzIF9fY3B1X3RvX2JlNjRzCi0KLS8qCi0gKiBUaGV5IGhhdmUgdG8gYmUgbWFjcm9zIGluIG9yZGVyIHRvIGRvIHRoZSBjb25zdGFudCBmb2xkaW5nCi0gKiBjb3JyZWN0bHkgLSBpZiB0aGUgYXJndW1lbnQgcGFzc2VkIGludG8gYSBpbmxpbmUgZnVuY3Rpb24KLSAqIGl0IGlzIG5vIGxvbmdlciBjb25zdGFudCBhY2NvcmRpbmcgdG8gZ2NjLi4KLSAqLwotIyB1bmRlZiBudG9obAotIyB1bmRlZiBudG9ocwotIyB1bmRlZiBodG9ubAotIyB1bmRlZiBodG9ucwotCi0jIGRlZmluZSBfX19odG9ubCh4KSBfX2NwdV90b19iZTMyKHgpCi0jIGRlZmluZSBfX19odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCi0jIGRlZmluZSBfX19udG9obCh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jIGRlZmluZSBfX19udG9ocyh4KSBfX2JlMTZfdG9fY3B1KHgpCi0KLSMgZGVmaW5lIGh0b25sKHgpIF9fX2h0b25sKHgpCi0jIGRlZmluZSBudG9obCh4KSBfX19udG9obCh4KQotIyBkZWZpbmUgaHRvbnMoeCkgX19faHRvbnMoeCkKLSMgZGVmaW5lIG50b2hzKHgpIF9fX250b2hzKHgpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsZTE2X2FkZF9jcHUoX19sZTE2ICp2YXIsIHUxNiB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxlMzJfYWRkX2NwdShfX2xlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGU2NF9hZGRfY3B1KF9fbGU2NCAqdmFyLCB1NjQgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fbGU2NChsZTY0X3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTE2X2FkZF9jcHUoX19iZTE2ICp2YXIsIHUxNiB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlMzJfYWRkX2NwdShfX2JlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmU2NF9hZGRfY3B1KF9fYmU2NCAqdmFyLCB1NjQgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9LYnVpbGQKaW5kZXggZmJhYTdmOS4uMzg0MzcyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL0tidWlsZApAQCAtMSw0ICsxLDIgQEAKIHVuaWZkZWYteSArPSBiaWdfZW5kaWFuLmgKIHVuaWZkZWYteSArPSBsaXR0bGVfZW5kaWFuLmgKLXVuaWZkZWYteSArPSBzd2FiLmgKLXVuaWZkZWYteSArPSBzd2FiYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKaW5kZXggMWNiYTNmMy4uM2M4MGZkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApAQCAtOSw4ICs5LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KIAogI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19mb3JjZSBfX2JlMzIpKF9fdTMyKSh4KSkKICNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSAoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKaW5kZXggY2VkYzFiNS4uODMxOTVmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApAQCAtOSw4ICs5LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KIAogI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19mb3JjZSBfX2JlMzIpX19fY29uc3RhbnRfc3dhYjMyKCh4KSkpCiAjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgX19fY29uc3RhbnRfc3dhYjMyKChfX2ZvcmNlIF9fYmUzMikoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjEzNGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKLSNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKLQotLyoKLSAqIGxpbnV4L2J5dGVvcmRlci9zd2FiLmgKLSAqIEJ5dGUtc3dhcHBpbmcsIGluZGVwZW5kZW50bHkgZnJvbSBDUFUgZW5kaWFubmVzcwotICoJc3dhYlhYW3BzXT8oZm9vKQotICoKLSAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEyMDUKLSAqICAgIHNlcGFyYXRlZCBzd2FiIGZ1bmN0aW9ucyBmcm9tIGNwdV90b19YWCwKLSAqICAgIHRvIGNsZWFuIHVwIHN1cHBvcnQgZm9yIGJpemFycmUtZW5kaWFuIGFyY2hpdGVjdHVyZXMuCi0gKgotICogVHJlbnQgUGllcGhvIDx4eXp6eUBzcGVha2Vhc3kub3JnPiAyMDA3MTE0Ci0gKiAgICBtYWtlIGNvbnN0YW50LWZvbGRpbmcgd29yaywgcHJvdmlkZSBDIHZlcnNpb25zIHRoYXQKLSAqICAgIGdjYyBjYW4gb3B0aW1pemUgYmV0dGVyLCBleHBsYWluIGRpZmZlcmVudCB2ZXJzaW9ucwotICoKLSAqIFNlZSBhc20taTM4Ni9ieXRlb3JkZXIuaCBhbmQgc3VjaGVzIGZvciBleGFtcGxlcyBvZiBob3cgdG8gcHJvdmlkZQotICogYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBvcHRpbWl6ZWQgdmVyc2lvbnMKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLS8qIEZ1bmN0aW9ucy9tYWNyb3MgZGVmaW5lZCwgdGhlcmUgYXJlIGEgbG90OgotICoKLSAqIF9fX3N3YWJYWAotICogICAgR2VuZXJpYyBDIHZlcnNpb25zIG9mIHRoZSBzd2FiIGZ1bmN0aW9ucy4KLSAqCi0gKiBfX19jb25zdGFudF9zd2FiWFgKLSAqICAgIEMgdmVyc2lvbnMgdGhhdCBnY2MgY2FuIGZvbGQgaW50byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB3aGVuCi0gKiAgICB0aGUgYXJndW1lbnQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi0gKgotICogX19hcmNoX19zd2FiWFhbc3BdPwotICogICAgQXJjaGl0ZWN0dXJlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBhbGwgdGhlIHN3YWIgZnVuY3Rpb25zCi0gKiAgICAoaW5jbHVkaW5nIHRoZSBzIGFuZCBwIHZlcnNpb25zKS4gIFRoZXNlIGNhbiBiZSBkZWZpbmVkIGluCi0gKiAgICBhc20tYXJjaC9ieXRlb3JkZXIuaC4gIEFueSB3aGljaCBhcmUgbm90LCBhcmUgZGVmaW5lZCBoZXJlLgotICogICAgX19hcmNoX19zd2FiWFhzKCkgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBfX2FyY2hfX3N3YWJYWHAoKSwgd2hpY2gKLSAqICAgIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgX19hcmNoX19zd2FiWFgoKSwgd2hpY2ggaXMgaW4gdHVybiBkZWZpbmVkCi0gKiAgICBpbiB0ZXJtcyBvZiBfX19zd2FiWFgoeCkuCi0gKiAgICBUaGVzZSBtdXN0IGJlIG1hY3Jvcy4gIFRoZXkgbWF5IGJlIHVuc2FmZSBmb3IgYXJndW1lbnRzIHdpdGgKLSAqICAgIHNpZGUtZWZmZWN0cy4KLSAqCi0gKiBfX2Zzd2FiWFgKLSAqICAgIElubGluZSBmdW5jdGlvbiB2ZXJzaW9ucyBvZiB0aGUgX19hcmNoX18gbWFjcm9zLiAgVGhlc2UgX2FyZV8gc2FmZQotICogICAgaWYgdGhlIGFyZ3VtZW50cyBoYXZlIHNpZGUtZWZmZWN0cy4gIE5vdGUgdGhlcmUgYXJlIG5vIHMgYW5kIHAKLSAqICAgIHZlcnNpb25zIG9mIHRoZXNlLgotICoKLSAqIF9fc3dhYlhYW3NiXQotICogICAgVGhlcmUgYXJlIHRoZSBvbmVzIHlvdSBzaG91bGQgYWN0dWFsbHkgdXNlLiAgVGhlIF9fc3dhYlhYIHZlcnNpb25zCi0gKiAgICB3aWxsIGJlIGEgY29uc3RhbnQgZ2l2ZW4gYSBjb25zdGFudCBhcmd1bWVudCBhbmQgdXNlIHRoZSBhcmNoCi0gKiAgICBzcGVjaWZpYyBjb2RlIChpZiBhbnkpIGZvciBub24tY29uc3RhbnQgYXJndW1lbnRzLiAgVGhlIHMgYW5kIHAKLSAqICAgIHZlcnNpb25zIGFsd2F5cyB1c2UgdGhlIGFyY2ggc3BlY2lmaWMgY29kZSAoY29uc3RhbnQgZm9sZGluZwotICogICAgZG9lc24ndCBhcHBseSkuICBUaGV5IGFyZSBzYWZlIHRvIHVzZSB3aXRoIGFyZ3VtZW50cyB3aXRoCi0gKiAgICBzaWRlLWVmZmVjdHMuCi0gKgotICogc3dhYlhYW3NiXQotICogICAgTmlja25hbWVzIGZvciBfX3N3YWJYWFtzYl0gdG8gdXNlIGluIHRoZSBrZXJuZWwuCi0gKi8KLQotLyogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCi0gKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX3N3YWIxNihfX3UxNiB4KQotewotCXJldHVybiB4PDw4IHwgeD4+ODsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fc3dhYjMyKF9fdTMyIHgpCi17Ci0JcmV0dXJuIHg8PDI0IHwgeD4+MjQgfAotCQkoeCAmIChfX3UzMikweDAwMDBmZjAwVUwpPDw4IHwKLQkJKHggJiAoX191MzIpMHgwMGZmMDAwMFVMKT4+ODsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19fc3dhYjY0KF9fdTY0IHgpCi17Ci0JcmV0dXJuIHg8PDU2IHwgeD4+NTYgfAotCQkoeCAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpPDw0MCB8Ci0JCSh4ICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCk8PDI0IHwKLQkJKHggJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKTw8IDggfAotCSAgICAgICAgKHggJiAoX191NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKT4+IDggfAotCQkoeCAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpPj4yNCB8Ci0JCSh4ICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCk+PjQwOwotfQotCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIxNih4KSBcCi0JKChfX3UxNikoIFwKLQkJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4MDBmZlUpIDw8IDgpIHwgXAotCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkgKSkKLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjMyKHgpIFwKLQkoKF9fdTMyKSggXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjY0KHgpIFwKLQkoKF9fdTY0KSggXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAotCSAgICAgICAgKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQotCi0vKgotICogcHJvdmlkZSBkZWZhdWx0cyB3aGVuIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gaXMgZGV0ZWN0ZWQKLSAqLwotI2lmbmRlZiBfX2FyY2hfX3N3YWIxNgotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX3N3YWIxNih4KQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjMyCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fc3dhYjMyKHgpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiNjQKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19zd2FiNjQoeCkKLSNlbmRpZgotCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjE2cAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2cCh4KSBfX2FyY2hfX3N3YWIxNigqKHgpKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjMycAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMycCh4KSBfX2FyY2hfX3N3YWIzMigqKHgpKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjY0cAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0cCh4KSBfX2FyY2hfX3N3YWI2NCgqKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgX19hcmNoX19zd2FiMTZzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMTZzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjE2cCh4KSkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiMzJzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMzJzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjMycCh4KSkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiNjRzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiNjRzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjY0cCh4KSkpCi0jZW5kaWYKLQotCi0vKgotICogQWxsb3cgY29uc3RhbnQgZm9sZGluZwotICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCi0jICBkZWZpbmUgX19zd2FiMTYoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UxNikoeCkpID8gXAotIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpIDogXAotIF9fZnN3YWIxNigoeCkpKQotIyAgZGVmaW5lIF9fc3dhYjMyKHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKLSBfX19jb25zdGFudF9zd2FiMzIoKHgpKSA6IFwKLSBfX2Zzd2FiMzIoKHgpKSkKLSMgIGRlZmluZSBfX3N3YWI2NCh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPyBcCi0gX19fY29uc3RhbnRfc3dhYjY0KCh4KSkgOiBcCi0gX19mc3dhYjY0KCh4KSkpCi0jZWxzZQotIyAgZGVmaW5lIF9fc3dhYjE2KHgpIF9fZnN3YWIxNih4KQotIyAgZGVmaW5lIF9fc3dhYjMyKHgpIF9fZnN3YWIzMih4KQotIyAgZGVmaW5lIF9fc3dhYjY0KHgpIF9fZnN3YWI2NCh4KQotI2VuZGlmIC8qIE9QVElNSVpFICovCi0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMTYoeCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoY29uc3QgX191MTYgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjE2cCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICphZGRyKQotewotCV9fYXJjaF9fc3dhYjE2cyhhZGRyKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2Zzd2FiMzIoX191MzIgeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMzIoeCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWIzMnAoY29uc3QgX191MzIgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjMycCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMzJzKF9fdTMyICphZGRyKQotewotCV9fYXJjaF9fc3dhYjMycyhhZGRyKTsKLX0KLQotI2lmZGVmIF9fQllURU9SREVSX0hBU19VNjRfXwotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2Zzd2FiNjQoX191NjQgeCkKLXsKLSMgIGlmZGVmIF9fU1dBQl82NF9USFJVXzMyX18KLQlfX3UzMiBoID0geCA+PiAzMjsKLSAgICAgICAgX191MzIgbCA9IHggJiAoKDFVTEw8PDMyKS0xKTsKLSAgICAgICAgcmV0dXJuICgoKF9fdTY0KV9fc3dhYjMyKGwpKSA8PCAzMikgfCAoKF9fdTY0KShfX3N3YWIzMihoKSkpOwotIyAgZWxzZQotCXJldHVybiBfX2FyY2hfX3N3YWI2NCh4KTsKLSMgIGVuZGlmCi19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX3N3YWI2NHAoY29uc3QgX191NjQgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjY0cCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiNjRzKF9fdTY0ICphZGRyKQotewotCV9fYXJjaF9fc3dhYjY0cyhhZGRyKTsKLX0KLSNlbmRpZiAvKiBfX0JZVEVPUkRFUl9IQVNfVTY0X18gKi8KLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLSNkZWZpbmUgc3dhYjE2IF9fc3dhYjE2Ci0jZGVmaW5lIHN3YWIzMiBfX3N3YWIzMgotI2RlZmluZSBzd2FiNjQgX19zd2FiNjQKLSNkZWZpbmUgc3dhYjE2cCBfX3N3YWIxNnAKLSNkZWZpbmUgc3dhYjMycCBfX3N3YWIzMnAKLSNkZWZpbmUgc3dhYjY0cCBfX3N3YWI2NHAKLSNkZWZpbmUgc3dhYjE2cyBfX3N3YWIxNnMKLSNkZWZpbmUgc3dhYjMycyBfX3N3YWIzMnMKLSNkZWZpbmUgc3dhYjY0cyBfX3N3YWI2NHMKLSNlbmRpZgotCi0jZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc4MGM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfQllURU9SREVSX1NXQUJCX0gKLSNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCQl9ICi0KLS8qCi0gKiBsaW51eC9ieXRlb3JkZXIvc3dhYmIuaAotICogU1dBcCBCeXRlcyBCaXphcnJlbHkKLSAqCXN3YUhIWFhbcHNdPyhmb28pCi0gKgotICogU3VwcG9ydCBmb3Igb2JOVVhJb3VzIHBkcC1lbmRpYW4gYW5kIG90aGVyIGJpemFycmUgYXJjaGl0ZWN0dXJlcy4KLSAqIFdpbGwgTGludXggZXZlciBydW4gb24gc3VjaCBhbmNpZW50IGJlYXN0cz8gaWYgbm90LCB0aGlzIGZpbGUKLSAqIHdpbGwgYmUgYnV0IGEgcHJvZ3JhbW1pbmcgcGVhcmwuIFN0aWxsLCBpdCdzIGEgcmVtaW5kZXIgdGhhdCB3ZQotICogc2hvdWxkbid0IGJlIG1ha2luZyB0b28gbWFueSBhc3N1bXB0aW9ucyB3aGVuIHRyeWluZyB0byBiZSBwb3J0YWJsZS4KLSAqCi0gKi8KLQotLyoKLSAqIE1lYW5pbmcgb2YgdGhlIG5hbWVzIEkgY2hvc2UgKHZheGxpbnV4IHBlb3BsZSBmZWVsIGZyZWUgdG8gY29ycmVjdCB0aGVtKToKLSAqIHN3YWh3MzIJc3dhcCAxNi1iaXQgaGFsZi13b3JkcyBpbiBhIDMyLWJpdCB3b3JkCi0gKiBzd2FoYjMyCXN3YXAgOC1iaXQgaGFsdmVzIG9mIGVhY2ggMTYtYml0IGhhbGYtd29yZCBpbiBhIDMyLWJpdCB3b3JkCi0gKgotICogTm8gNjQtYml0IHN1cHBvcnQgeWV0LiBJIGRvbid0IGtub3cgTlVYSSBjb252ZW50aW9ucyBmb3IgbG9uZyBsb25ncy4KLSAqIEkgZ3VhcmFudGVlIGl0IHdpbGwgYmUgYSBtZXNzIHdoZW4gaXQncyB0aGVyZSwgdGhvdWdoIDotPgotICogSXQgd2lsbCBiZSBldmVuIHdvcnNlIGlmIHRoZXJlIGFyZSBjb25mbGljdGluZyA2NC1iaXQgY29udmVudGlvbnMuCi0gKiBIb3BlZnVsbHksIG5vIG9uZSBldmVyIHVzZWQgNjQtYml0IG9iamVjdHMgb24gTlVYSSBtYWNoaW5lcy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNkZWZpbmUgX19fc3dhaHczMih4KSBcCi0oeyBcCi0JX191MzIgX194ID0gKHgpOyBcCi0JKChfX3UzMikoIFwKLQkJKCgoX191MzIpKF9feCkgJiAoX191MzIpMHgwMDAwZmZmZlVMKSA8PCAxNikgfCBcCi0JCSgoKF9fdTMyKShfX3gpICYgKF9fdTMyKTB4ZmZmZjAwMDBVTCkgPj4gMTYpICkpOyBcCi19KQotI2RlZmluZSBfX19zd2FoYjMyKHgpIFwKLSh7IFwKLQlfX3UzMiBfX3ggPSAoeCk7IFwKLQkoKF9fdTMyKSggXAotCQkoKChfX3UzMikoX194KSAmIChfX3UzMikweDAwZmYwMGZmVUwpIDw8IDgpIHwgXAotCQkoKChfX3UzMikoX194KSAmIChfX3UzMikweGZmMDBmZjAwVUwpID4+IDgpICkpOyBcCi19KQotCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWh3MzIoeCkgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZmZmVUwpIDw8IDE2KSB8IFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmZmZjAwMDBVTCkgPj4gMTYpICkpCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWhiMzIoeCkgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwZmYwMGZmVUwpIDw8IDgpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwZmYwMFVMKSA+PiA4KSApKQotCi0vKgotICogcHJvdmlkZSBkZWZhdWx0cyB3aGVuIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gaXMgZGV0ZWN0ZWQKLSAqLwotI2lmbmRlZiBfX2FyY2hfX3N3YWh3MzIKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWh3MzIoeCkgX19fc3dhaHczMih4KQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhaGIzMgotIyAgZGVmaW5lIF9fYXJjaF9fc3dhaGIzMih4KSBfX19zd2FoYjMyKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBfX2FyY2hfX3N3YWh3MzJwCi0jICBkZWZpbmUgX19hcmNoX19zd2FodzMycCh4KSBfX3N3YWh3MzIoKih4KSkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWhiMzJwCi0jICBkZWZpbmUgX19hcmNoX19zd2FoYjMycCh4KSBfX3N3YWhiMzIoKih4KSkKLSNlbmRpZgotCi0jaWZuZGVmIF9fYXJjaF9fc3dhaHczMnMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWh3MzJzKHgpIGRvIHsgKih4KSA9IF9fc3dhaHczMnAoKHgpKTsgfSB3aGlsZSAoMCkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWhiMzJzCi0jICBkZWZpbmUgX19hcmNoX19zd2FoYjMycyh4KSBkbyB7ICooeCkgPSBfX3N3YWhiMzJwKCh4KSk7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0vKgotICogQWxsb3cgY29uc3RhbnQgZm9sZGluZwotICovCi0jZGVmaW5lIF9fc3dhaHczMih4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTMyKSh4KSkgPyBcCi0gX19fc3dhaHczMigoeCkpIDogXAotIF9fZnN3YWh3MzIoKHgpKSkKLSNkZWZpbmUgX19zd2FoYjMyKHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKLSBfX19zd2FoYjMyKCh4KSkgOiBcCi0gX19mc3dhaGIzMigoeCkpKQotCi0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19mc3dhaHczMihfX3UzMiB4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWh3MzIoeCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19zd2FodzMycChfX3UzMiAqeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FodzMycCh4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fc3dhaHczMnMoX191MzIgKmFkZHIpCi17Ci0JX19hcmNoX19zd2FodzMycyhhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHgpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhaGIzMih4KTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX3N3YWhiMzJwKF9fdTMyICp4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWhiMzJwKHgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zd2FoYjMycyhfX3UzMiAqYWRkcikKLXsKLQlfX2FyY2hfX3N3YWhiMzJzKGFkZHIpOwotfQotCi0jaWZkZWYgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0vKgotICogTm90IHN1cHBvcnRlZCB5ZXQKLSAqLwotI2VuZGlmIC8qIF9fQllURU9SREVSX0hBU19VNjRfXyAqLwotCi0jZGVmaW5lIHN3YWh3MzIgX19zd2FodzMyCi0jZGVmaW5lIHN3YWhiMzIgX19zd2FoYjMyCi0jZGVmaW5lIHN3YWh3MzJwIF9fc3dhaHczMnAKLSNkZWZpbmUgc3dhaGIzMnAgX19zd2FoYjMycAotI2RlZmluZSBzd2FodzMycyBfX3N3YWh3MzJzCi0jZGVmaW5lIHN3YWhiMzJzIF9fc3dhaGIzMnMKLQotI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfU1dBQkJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCBlMjJmNDhjLi4wMmJkYjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtNTI5LDggKzUyOSwyMSBAQAogICoKICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHNldCBQRl9TVVBFUlBSSVYgb24gdGhlIHRhc2suCiAgKi8KLSNkZWZpbmUgaGFzX2NhcGFiaWxpdHkodCwgY2FwKSAoc2VjdXJpdHlfY2FwYWJsZSgodCksIChjYXApKSA9PSAwKQotI2RlZmluZSBoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0KHQsIGNhcCkgKHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdCgodCksIChjYXApKSA9PSAwKQorI2RlZmluZSBoYXNfY2FwYWJpbGl0eSh0LCBjYXApIChzZWN1cml0eV9yZWFsX2NhcGFibGUoKHQpLCAoY2FwKSkgPT0gMCkKKworLyoqCisgKiBoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0IC0gRGV0ZXJtaW5lIGlmIGEgdGFzayBoYXMgYSBzdXBlcmlvciBjYXBhYmlsaXR5IGF2YWlsYWJsZSAodW5hdWRpdGVkKQorICogQHQ6IFRoZSB0YXNrIGluIHF1ZXN0aW9uCisgKiBAY2FwOiBUaGUgY2FwYWJpbGl0eSB0byBiZSB0ZXN0ZWQgZm9yCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YXNrIGhhcyB0aGUgZ2l2ZW4gc3VwZXJpb3IgY2FwYWJpbGl0eQorICogY3VycmVudGx5IGluIGVmZmVjdCwgZmFsc2UgaWYgbm90LCBidXQgZG9uJ3Qgd3JpdGUgYW4gYXVkaXQgbWVzc2FnZSBmb3IgdGhlCisgKiBjaGVjay4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBzZXQgUEZfU1VQRVJQUklWIG9uIHRoZSB0YXNrLgorICovCisjZGVmaW5lIGhhc19jYXBhYmlsaXR5X25vYXVkaXQodCwgY2FwKSBcCisJKHNlY3VyaXR5X3JlYWxfY2FwYWJsZV9ub2F1ZGl0KCh0KSwgKGNhcCkpID09IDApCiAKIGV4dGVybiBpbnQgY2FwYWJsZShpbnQgY2FwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggMTE2NDk2My4uMDhiNzhjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC0zMjksMTMgKzMyOSw3IEBACiAJCQlzdHJ1Y3QgY2dyb3VwICpjZ3JwKTsKIAl2b2lkICgqcG9zdF9jbG9uZSkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKTsKIAl2b2lkICgqYmluZCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KTsKLQkvKgotCSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCB0aGUgdGFza19sb2NrIG9mIG1tLT5vd25lciBoZWxkCi0JICovCi0Jdm9pZCAoKm1tX293bmVyX2NoYW5nZWQpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKLQkJCQkJc3RydWN0IGNncm91cCAqb2xkLAotCQkJCQlzdHJ1Y3QgY2dyb3VwICpuZXcsCi0JCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKIAlpbnQgc3Vic3lzX2lkOwogCWludCBhY3RpdmU7CiAJaW50IGRpc2FibGVkOwpAQCAtNDAwLDkgKzM5NCw2IEBACiBpbnQgY2dyb3VwX3NjYW5fdGFza3Moc3RydWN0IGNncm91cF9zY2FubmVyICpzY2FuKTsKIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2soc3RydWN0IGNncm91cCAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAKLXZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwKLQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldyk7Ci0KICNlbHNlIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC00MjAsOSArNDExLDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3Moc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsCi0JCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcpIHt9Ci0KICNlbmRpZiAvKiAhQ09ORklHX0NHUk9VUFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaCBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKaW5kZXggOGU1NDBkMy4uNTFlYTJiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCkBAIC03OCw2ICs3OCw4IEBACiAKIGV4dGVybiB2b2lkIHJlYnVpbGRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKICNlbHNlIC8qICFDT05GSUdfQ1BVU0VUUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjcHVzZXRfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC0xNTksNiArMTYxLDEwIEBACiAJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoMSwgTlVMTCwgTlVMTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCiAjZW5kaWYgLyogIUNPTkZJR19DUFVTRVRTICovCiAKICNlbmRpZiAvKiBfTElOVVhfQ1BVU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDFhMzY4NmQuLjdkOWRhNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBCVVNfSURfU0laRQkJMjAKIAogc3RydWN0IGRldmljZTsKK3N0cnVjdCBkZXZpY2VfcHJpdmF0ZTsKIHN0cnVjdCBkZXZpY2VfZHJpdmVyOwogc3RydWN0IGRyaXZlcl9wcml2YXRlOwogc3RydWN0IGNsYXNzOwpAQCAtNjUsNyArNjYsNyBAQAogCWludCAoKnJlc3VtZV9lYXJseSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQlzdHJ1Y3QgcG1fZXh0X29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCiAJc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKnA7CiB9OwpAQCAtMTMzLDcgKzEzNCw3IEBACiAJaW50ICgqcmVzdW1lKSAoc3RydWN0IGRldmljZSAqZGV2KTsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCiAJc3RydWN0IGRyaXZlcl9wcml2YXRlICpwOwogfTsKQEAgLTE5OCw3ICsxOTksNyBAQAogCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQlzdHJ1Y3QgcG1fb3BzICpwbTsKKwlzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAJc3RydWN0IGNsYXNzX3ByaXZhdGUgKnA7CiB9OwogCkBAIC0yOTEsNyArMjkyLDcgQEAKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogfTsKIAogLyogaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KQEAgLTM2NSwxNyArMzY2LDE1IEBACiB9OwogCiBzdHJ1Y3QgZGV2aWNlIHsKLQlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2NoaWxkcmVuOwotCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX3BhcmVudDsJLyogbm9kZSBpbiBzaWJsaW5nIGxpc3QgKi8KLQlzdHJ1Y3Qga2xpc3Rfbm9kZQlrbm9kZV9kcml2ZXI7Ci0Jc3RydWN0IGtsaXN0X25vZGUJa25vZGVfYnVzOwogCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CiAKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUJKnA7CisKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogCWNoYXIJYnVzX2lkW0JVU19JRF9TSVpFXTsJLyogcG9zaXRpb24gb24gcGFyZW50IGJ1cyAqLworCXVuc2lnbmVkCQl1ZXZlbnRfc3VwcHJlc3M6MTsKIAljb25zdCBjaGFyCQkqaW5pdF9uYW1lOyAvKiBpbml0aWFsIG5hbWUgb2YgdGhlIGRldmljZSAqLwogCXN0cnVjdCBkZXZpY2VfdHlwZQkqdHlwZTsKLQl1bnNpZ25lZAkJdWV2ZW50X3N1cHByZXNzOjE7CiAKIAlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJLyogc2VtYXBob3JlIHRvIHN5bmNocm9uaXplIGNhbGxzIHRvCiAJCQkJCSAqIGl0cyBkcml2ZXIuCkBAIC00MDgsMTIgKzQwNywxMyBAQAogCS8qIGFyY2ggc3BlY2lmaWMgYWRkaXRpb25zICovCiAJc3RydWN0IGRldl9hcmNoZGF0YQlhcmNoZGF0YTsKIAorCWRldl90CQkJZGV2dDsJLyogZGV2X3QsIGNyZWF0ZXMgdGhlIHN5c2ZzICJkZXYiICovCisKIAlzcGlubG9ja190CQlkZXZyZXNfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldnJlc19oZWFkOwogCiAJc3RydWN0IGtsaXN0X25vZGUJa25vZGVfY2xhc3M7CiAJc3RydWN0IGNsYXNzCQkqY2xhc3M7Ci0JZGV2X3QJCQlkZXZ0OwkvKiBkZXZfdCwgY3JlYXRlcyB0aGUgc3lzZnMgImRldiIgKi8KIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCSoqZ3JvdXBzOwkvKiBvcHRpb25hbCBncm91cHMgKi8KIAogCXZvaWQJKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpAQCAtNDgzLDYgKzQ4MywxNyBAQAogZXh0ZXJuIGludCBkZXZpY2VfbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm5ld19wYXJlbnQpOwogCiAvKgorICogUm9vdCBkZXZpY2Ugb2JqZWN0cyBmb3IgZ3JvdXBpbmcgdW5kZXIgL3N5cy9kZXZpY2VzCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICpfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpyb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIFRISVNfTU9EVUxFKTsKK30KK2V4dGVybiB2b2lkIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcm9vdCk7CisKKy8qCiAgKiBNYW51YWwgYmluZGluZyBvZiBhIGRldmljZSB0byBkcml2ZXIuIFNlZSBkcml2ZXJzL2Jhc2UvYnVzLmMKICAqIGZvciBpbmZvcm1hdGlvbiBvbiB1c2UuCiAgKi8KQEAgLTU1MywxMyArNTY0LDEzIEBACiAjZGVmaW5lIGRldl9pbmZvKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCiAJZGV2X3ByaW50ayhLRVJOX0lORk8gLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRykKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCisJZGV2X3ByaW50ayhLRVJOX0RFQlVHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIC4uLikgZG8geyBcCiAJZHluYW1pY19kZXZfZGJnKGRldiwgZm9ybWF0LCAjI19fVkFfQVJHU19fKTsgXAogCX0gd2hpbGUgKDApCi0jZWxpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pCQlcCi0JZGV2X3ByaW50ayhLRVJOX0RFQlVHICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQogI2Vsc2UKICNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAogCSh7IGlmICgwKSBkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgZm9ybWF0LCAjI2FyZyk7IDA7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggZmI1OTY3My4uZDdlYmE3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMTEzMyw3ICsxMTMzLDYgQEAKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNfdW1vdW50OwogCXN0cnVjdCBtdXRleAkJc19sb2NrOwogCWludAkJCXNfY291bnQ7Ci0JaW50CQkJc19zeW5jaW5nOwogCWludAkJCXNfbmVlZF9zeW5jX2ZzOwogCWF0b21pY190CQlzX2FjdGl2ZTsKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggMzUwZmU5Ny4uMTYyZTVkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0yMCwyOSArMjAsMjcgQEAKICAqCiAgKiA3LjEwCiAgKiAgLSBhZGQgbm9uc2Vla2FibGUgb3BlbiBmbGFnCisgKgorICogNy4xMQorICogIC0gYWRkIElPQ1RMIG1lc3NhZ2UKKyAqICAtIGFkZCB1bnNvbGljaXRlZCBub3RpZmljYXRpb24gc3VwcG9ydAorICogIC0gYWRkIFBPTEwgbWVzc2FnZSBhbmQgTk9USUZZX1BPTEwgbm90aWZpY2F0aW9uCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRlVTRV9ICiAjZGVmaW5lIF9MSU5VWF9GVVNFX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoqIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCiAjZGVmaW5lIEZVU0VfS0VSTkVMX1ZFUlNJT04gNwogCiAvKiogTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiAxMAorI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDExCiAKIC8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLwogI2RlZmluZSBGVVNFX1JPT1RfSUQgMQogCi0vKiogVGhlIG1ham9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUFKT1IgTUlTQ19NQUpPUgotCi0vKiogVGhlIG1pbm9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUlOT1IgMjI5Ci0KIC8qIE1ha2Ugc3VyZSBhbGwgc3RydWN0dXJlcyBhcmUgcGFkZGVkIHRvIDY0Yml0IGJvdW5kYXJ5LCBzbyAzMmJpdAogICAgdXNlcnNwYWNlIHdvcmtzIHVuZGVyIDY0Yml0IGtlcm5lbHMgKi8KIApAQCAtMTUxLDYgKzE0OSwyOCBAQAogICovCiAjZGVmaW5lIEZVU0VfUkVBRF9MT0NLT1dORVIJKDEgPDwgMSkKIAorLyoqCisgKiBJb2N0bCBmbGFncworICoKKyAqIEZVU0VfSU9DVExfQ09NUEFUOiAzMmJpdCBjb21wYXQgaW9jdGwgb24gNjRiaXQgbWFjaGluZQorICogRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQ6IG5vdCByZXN0cmljdGVkIHRvIHdlbGwtZm9ybWVkIGlvY3RscywgcmV0cnkgYWxsb3dlZAorICogRlVTRV9JT0NUTF9SRVRSWTogcmV0cnkgd2l0aCBuZXcgaW92ZWNzCisgKgorICogRlVTRV9JT0NUTF9NQVhfSU9WOiBtYXhpbXVtIG9mIGluX2lvdmVjcyArIG91dF9pb3ZlY3MKKyAqLworI2RlZmluZSBGVVNFX0lPQ1RMX0NPTVBBVAkoMSA8PCAwKQorI2RlZmluZSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRAkoMSA8PCAxKQorI2RlZmluZSBGVVNFX0lPQ1RMX1JFVFJZCSgxIDw8IDIpCisKKyNkZWZpbmUgRlVTRV9JT0NUTF9NQVhfSU9WCTI1NgorCisvKioKKyAqIFBvbGwgZmxhZ3MKKyAqCisgKiBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZOiByZXF1ZXN0IHBvbGwgbm90aWZ5CisgKi8KKyNkZWZpbmUgRlVTRV9QT0xMX1NDSEVEVUxFX05PVElGWSAoMSA8PCAwKQorCiBlbnVtIGZ1c2Vfb3Bjb2RlIHsKIAlGVVNFX0xPT0tVUAkgICA9IDEsCiAJRlVTRV9GT1JHRVQJICAgPSAyLCAgLyogbm8gcmVwbHkgKi8KQEAgLTE4OCw2ICsyMDgsMTMgQEAKIAlGVVNFX0lOVEVSUlVQVCAgICAgPSAzNiwKIAlGVVNFX0JNQVAgICAgICAgICAgPSAzNywKIAlGVVNFX0RFU1RST1kgICAgICAgPSAzOCwKKwlGVVNFX0lPQ1RMICAgICAgICAgPSAzOSwKKwlGVVNFX1BPTEwgICAgICAgICAgPSA0MCwKK307CisKK2VudW0gZnVzZV9ub3RpZnlfY29kZSB7CisJRlVTRV9OT1RJRllfUE9MTCAgID0gMSwKKwlGVVNFX05PVElGWV9DT0RFX01BWCwKIH07CiAKIC8qIFRoZSByZWFkIGJ1ZmZlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCA4aywgYnV0IG1heSBiZSBtdWNoIGxhcmdlciAqLwpAQCAtMzg4LDYgKzQxNSwzOCBAQAogCV9fdTY0CWJsb2NrOwogfTsKIAorc3RydWN0IGZ1c2VfaW9jdGxfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCWNtZDsKKwlfX3U2NAlhcmc7CisJX191MzIJaW5fc2l6ZTsKKwlfX3UzMglvdXRfc2l6ZTsKK307CisKK3N0cnVjdCBmdXNlX2lvY3RsX291dCB7CisJX19zMzIJcmVzdWx0OworCV9fdTMyCWZsYWdzOworCV9fdTMyCWluX2lvdnM7CisJX191MzIJb3V0X2lvdnM7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlraDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMiAgIHBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX291dCB7CisJX191MzIJcmV2ZW50czsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCB7CisJX191NjQJa2g7Cit9OworCiBzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgewogCV9fdTMyCWxlbjsKIAlfX3UzMglvcGNvZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCBlODAwM2FmLi5kZDIwY2Q3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTY5LDEyICs2OSw2IEBACiAjZGVmaW5lIEdGUF9ISUdIVVNFUl9NT1ZBQkxFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKIAkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAogCQkJCSBfX0dGUF9NT1ZBQkxFKQotI2RlZmluZSBHRlBfTk9GU19QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX01PVkFCTEUpCi0jZGVmaW5lIEdGUF9VU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCi0JCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfTU9WQUJMRSkKLSNkZWZpbmUgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCi0JCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKLQkJCQkgX19HRlBfTU9WQUJMRSkKIAogI2lmZGVmIENPTkZJR19OVU1BCiAjZGVmaW5lIEdGUF9USElTTk9ERQkoX19HRlBfVEhJU05PREUgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ncGlvX2tleXMuaCBiL2luY2x1ZGUvbGludXgvZ3Bpb19rZXlzLmgKaW5kZXggZWM2ZWNkNy4uMTI4OWZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvX2tleXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dwaW9fa2V5cy5oCkBAIC0xNSw2ICsxNSw3IEBACiBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b25zOwogCWludCBuYnV0dG9uczsKKwl1bnNpZ25lZCBpbnQgcmVwOjE7CQkvKiBlbmFibGUgaW5wdXQgc3Vic3lzdGVtIGF1dG8gcmVwZWF0ICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggZTFjOGFmYy4uZjFkMmZiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKQEAgLTIzMyw2ICsyMzMsMTAgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpUEFHRV9TSVpFIDw8IGgtPm9yZGVyOwogfQogCitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFfa2VybmVsX3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBodWdlX3BhZ2VfbWFzayhzdHJ1Y3QgaHN0YXRlICpoKQogewogCXJldHVybiBoLT5tYXNrOwpAQCAtMjczLDYgKzI3Nyw4IEBACiAjZGVmaW5lIGhzdGF0ZV9pbm9kZShpKSBOVUxMCiAjZGVmaW5lIGh1Z2VfcGFnZV9zaXplKGgpIFBBR0VfU0laRQogI2RlZmluZSBodWdlX3BhZ2VfbWFzayhoKSBQQUdFX01BU0sKKyNkZWZpbmUgdm1hX2tlcm5lbF9wYWdlc2l6ZSh2KSBQQUdFX1NJWkUKKyNkZWZpbmUgdm1hX21tdV9wYWdlc2l6ZSh2KSBQQUdFX1NJWkUKICNkZWZpbmUgaHVnZV9wYWdlX29yZGVyKGgpIDAKICNkZWZpbmUgaHVnZV9wYWdlX3NoaWZ0KGgpIFBBR0VfU0hJRlQKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaCBiL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjM2MWZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHNjMjAwNy5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19MSU5VWF9JMkNfVFNDMjAwN19ICisjZGVmaW5lIF9fTElOVVhfSTJDX1RTQzIwMDdfSAorCisvKiBsaW51eC9pMmMvdHNjMjAwNy5oICovCisKK3N0cnVjdCB0c2MyMDA3X3BsYXRmb3JtX2RhdGEgeworCXUxNgltb2RlbDsJCQkJLyogMjAwNy4gKi8KKwl1MTYJeF9wbGF0ZV9vaG1zOworCisJaW50CSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOworCXZvaWQJKCpjbGVhcl9wZW5pcnEpKHZvaWQpOwkJLyogSWYgbmVlZGVkLCBjbGVhciAybmQgbGV2ZWwKKwkJCQkJCSAgIGludGVycnVwdCBzb3VyY2UgKi8KKwlpbnQJKCppbml0X3BsYXRmb3JtX2h3KSh2b2lkKTsKKwl2b2lkCSgqZXhpdF9wbGF0Zm9ybV9odykodm9pZCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaCBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaAppbmRleCBhOGY4NGMwLi44MTM3ZjY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCkBAIC0yMzQsNiArMjM0LDkgQEAKIAkvKiBncGlvLW4gc2hvdWxkIGNvbnRyb2wgVk1NQyhuKzEpIGlmIEJJVChuKSBpbiBtbWNfY2QgaXMgc2V0ICovCiAJdTgJCW1tY19jZDsKIAorCS8qIGlmIEJJVChOKSBpcyBzZXQsIG9yIFZNTUMobisxKSBpcyBsaW5rZWQsIGRlYm91bmNlIEdQSU8tTiAqLworCXUzMgkJZGVib3VuY2U7CisKIAkvKiBGb3IgZ3Bpby1OLCBiaXQgKDEgPDwgTikgaW4gInB1bGx1cHMiIGlzIHNldCBpZiB0aGF0IHB1bGx1cAogCSAqIHNob3VsZCBiZSBlbmFibGVkLiAgRWxzZSwgaWYgdGhhdCBiaXQgaXMgc2V0IGluICJwdWxsZG93bnMiLAogCSAqIHRoYXQgcHVsbGRvd24gaXMgZW5hYmxlZC4gIERvbid0IHdhc3RlIHBvd2VyIGJ5IGxldHRpbmcgYW55CkBAIC0zMDcsMTIgKzMxMCw2IEBACiAjZGVmaW5lIFRXTDQwMzBfVkFVWDNfREVWX0dSUAkJMHgxRgogI2RlZmluZSBUV0w0MDMwX1ZBVVgzX0RFRElDQVRFRAkJMHgyMgogCi0vKgotICogRXhwb3J0ZWQgVFdMNDAzMCBHUElPIEFQSXMKLSAqCi0gKiBXQVJOSU5HIC0tIHVzZSBzdGFuZGFyZCBHUElPIGFuZCBJUlEgY2FsbHMgaW5zdGVhZDsgdGhlc2Ugd2lsbCB2YW5pc2guCi0gKi8KLWludCB0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKGludCBncGlvLCBpbnQgZW5hYmxlKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUlkpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19UV0w0MDMwX0JDSV9CQVRURVJZX01PRFVMRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRlLmggYi9pbmNsdWRlL2xpbnV4L2lkZS5oCmluZGV4IGRiNWVmOGEuLjM2NDRmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZGUuaApAQCAtMzIsMTggKzMyLDE0IEBACiAjIGRlZmluZSBTVVBQT1JUX1ZMQl9TWU5DIDEKICNlbmRpZgogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJYnl0ZTsJLyogdXNlZCBldmVyeXdoZXJlICovCi0KIC8qCiAgKiBQcm9iYWJseSBub3Qgd2lzZSB0byBmaWRkbGUgd2l0aCB0aGVzZQogICovCisjZGVmaW5lIElERV9ERUZBVUxUX01BWF9GQUlMVVJFUwkxCiAjZGVmaW5lIEVSUk9SX01BWAk4CS8qIE1heCByZWFkL3dyaXRlIGVycm9ycyBwZXIgc2VjdG9yICovCiAjZGVmaW5lIEVSUk9SX1JFU0VUCTMJLyogUmVzZXQgY29udHJvbGxlciBldmVyeSA0dGggcmV0cnkgKi8KICNkZWZpbmUgRVJST1JfUkVDQUwJMQkvKiBSZWNhbGlicmF0ZSBldmVyeSAybmQgcmV0cnkgKi8KIAotI2RlZmluZSBIV0lGKGRyaXZlKQkJKChpZGVfaHdpZl90ICopKChkcml2ZSktPmh3aWYpKQotI2RlZmluZSBIV0dST1VQKGRyaXZlKQkJKChpZGVfaHdncm91cF90ICopKEhXSUYoZHJpdmUpLT5od2dyb3VwKSkKLQogLyoKICAqIERlZmluaXRpb25zIGZvciBhY2Nlc3NpbmcgSURFIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCiAgKi8KQEAgLTE4NSw5ICsxODEsNiBAQAogCXVuc2lnbmVkIGxvbmcJY29uZmlnOwogfSBod19yZWdzX3Q7CiAKLXZvaWQgaWRlX2luaXRfcG9ydF9kYXRhKHN0cnVjdCBod2lmX3MgKiwgdW5zaWduZWQgaW50KTsKLXZvaWQgaWRlX2luaXRfcG9ydF9odyhzdHJ1Y3QgaHdpZl9zICosIGh3X3JlZ3NfdCAqKTsKLQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9zdGRfaW5pdF9wb3J0cyhod19yZWdzX3QgKmh3LAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW9fYWRkciwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGN0bF9hZGRyKQpAQCAtNDMzLDE4ICs0MjYsMTQgQEAKIAlzdHJ1Y3QgaWRldGFwZV9iaCAqYmg7CiAJY2hhciAqYl9kYXRhOwogCi0JLyogaWRlc2NzaSBvbmx5IGZvciBub3cgKi8KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGludCBzZ19jbnQ7CiAKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZDsKLQl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci0KIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiB9OwogCiBzdHJ1Y3QgaWRlX2RldnNldDsKLXN0cnVjdCBpZGVfZHJpdmVyX3M7CitzdHJ1Y3QgaWRlX2RyaXZlcjsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKIHN0cnVjdCBpZGVfYWNwaV9kcml2ZV9saW5rOwpAQCAtNTg4LDcgKzU3Nyw2IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCiAKIAlzdHJ1Y3QgcmVxdWVzdAkJKnJxOwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgaWRlX2RyaXZlX3MgCSpuZXh0OwkvKiBjaXJjdWxhciBsaXN0IG9mIGh3Z3JvdXAgZHJpdmVzICovCiAJdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBleHRyYSBkcml2ZXIgZGF0YSAqLwogCXUxNgkJCSppZDsJLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLwogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwpAQCAtNjYyLDYgKzY1MCw4IEBACiAJaW50ICAoKnBjX2lvX2J1ZmZlcnMpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICosCiAJCQkgICAgICB1bnNpZ25lZCBpbnQsIGludCk7CiAKKwlpZGVfc3RhcnRzdG9wX3QgKCppcnFfaGFuZGxlcikoc3RydWN0IGlkZV9kcml2ZV9zICopOworCiAJdW5zaWduZWQgbG9uZyBhdGFwaV9mbGFnczsKIAogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcmVxdWVzdF9zZW5zZV9wYzsKQEAgLTY4NCw3ICs2NzQsNiBAQAogCXZvaWQJKCpleGVjX2NvbW1hbmQpKHN0cnVjdCBod2lmX3MgKiwgdTgpOwogCXU4CSgqcmVhZF9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiAJdTgJKCpyZWFkX2FsdHN0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKLQl1OAkoKnJlYWRfc2ZmX2RtYV9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiAKIAl2b2lkCSgqc2V0X2lycSkoc3RydWN0IGh3aWZfcyAqLCBpbnQpOwogCkBAIC03NDUsMTQgKzczNCwxNyBAQAogCWludAkoKmRtYV90ZXN0X2lycSkoc3RydWN0IGlkZV9kcml2ZV9zICopOwogCXZvaWQJKCpkbWFfbG9zdF9pcnEpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKIAl2b2lkCSgqZG1hX3RpbWVvdXQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCBvbmx5IHJlcXVpcmVkIHRvIGJlCisJICogaW1wbGVtZW50ZWQgZm9yIHRoZSBTRkYtODAzOGkgY29tcGF0aWJsZSBjb250cm9sbGVycy4KKwkgKi8KKwl1OAkoKmRtYV9zZmZfcmVhZF9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiB9OwogCiBzdHJ1Y3QgaWRlX2hvc3Q7CiAKIHR5cGVkZWYgc3RydWN0IGh3aWZfcyB7Ci0Jc3RydWN0IGh3aWZfcyAqbmV4dDsJCS8qIGZvciBsaW5rZWQtbGlzdCBpbiBpZGVfaHdncm91cF90ICovCiAJc3RydWN0IGh3aWZfcyAqbWF0ZTsJCS8qIG90aGVyIGh3aWYgZnJvbSBzYW1lIFBDSSBjaGlwICovCi0Jc3RydWN0IGh3Z3JvdXBfcyAqaHdncm91cDsJLyogYWN0dWFsbHkgKGlkZV9od2dyb3VwX3QgKikgKi8KIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CS8qIC9wcm9jL2lkZS8gZGlyZWN0b3J5IGVudHJ5ICovCiAKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3Q7CkBAIC03NjMsNyArNzU1LDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJc2F0YV9zY3JbU0FUQV9OUl9QT1JUU107CiAKLQlpZGVfZHJpdmVfdAlkcml2ZXNbTUFYX0RSSVZFU107CS8qIGRyaXZlIGluZm8gKi8KKwlpZGVfZHJpdmVfdAkqZGV2aWNlc1tNQVhfRFJJVkVTICsgMV07CiAKIAl1OCBtYWpvcjsJLyogb3VyIG1ham9yIG51bWJlciAqLwogCXU4IGluZGV4OwkvKiAwIGZvciBpZGUwOyAxIGZvciBpZGUxOyAuLi4gKi8KQEAgLTgyOSw3ICs4MjEsNyBAQAogCXVuc2lnbmVkCWV4dHJhX3BvcnRzOwkvKiBudW1iZXIgb2YgZXh0cmEgZG1hIHBvcnRzICovCiAKIAl1bnNpZ25lZAlwcmVzZW50ICAgIDogMTsJLyogdGhpcyBpbnRlcmZhY2UgZXhpc3RzICovCi0JdW5zaWduZWQJc2dfbWFwcGVkICA6IDE7CS8qIHNnX3RhYmxlIGFuZCBzZ19uZW50cyBhcmUgcmVhZHkgKi8KKwl1bnNpZ25lZAlidXN5CSAgIDogMTsgLyogc2VyaWFsaXplcyBkZXZpY2VzIG9uIGEgcG9ydCAqLwogCiAJc3RydWN0IGRldmljZQkJZ2VuZGV2OwogCXN0cnVjdCBkZXZpY2UJCSpwb3J0ZGV2OwpAQCAtODQxLDE5ICs4MzMsNDkgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVBQ1BJCiAJc3RydWN0IGlkZV9hY3BpX2h3aWZfbGluayAqYWNwaWRhdGE7CiAjZW5kaWYKKworCS8qIElSUSBoYW5kbGVyLCBpZiBhY3RpdmUgKi8KKwlpZGVfc3RhcnRzdG9wX3QJKCpoYW5kbGVyKShpZGVfZHJpdmVfdCAqKTsKKworCS8qIEJPT0w6IHBvbGxpbmcgYWN0aXZlICYgcG9sbF90aW1lb3V0IGZpZWxkIHZhbGlkICovCisJdW5zaWduZWQgaW50IHBvbGxpbmcgOiAxOworCisJLyogY3VycmVudCBkcml2ZSAqLworCWlkZV9kcml2ZV90ICpjdXJfZGV2OworCisJLyogY3VycmVudCByZXF1ZXN0ICovCisJc3RydWN0IHJlcXVlc3QgKnJxOworCisJLyogZmFpbHNhZmUgdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkvKiB0aW1lb3V0IHZhbHVlIGR1cmluZyBsb25nIHBvbGxzICovCisJdW5zaWduZWQgbG9uZyBwb2xsX3RpbWVvdXQ7CisJLyogcXVlcmllZCB1cG9uIHRpbWVvdXRzICovCisJaW50ICgqZXhwaXJ5KShpZGVfZHJpdmVfdCAqKTsKKworCWludCByZXFfZ2VuOworCWludCByZXFfZ2VuX3RpbWVyOworCisJc3BpbmxvY2tfdCBsb2NrOwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wIGlkZV9od2lmX3Q7CiAKICNkZWZpbmUgTUFYX0hPU1RfUE9SVFMgNAogCiBzdHJ1Y3QgaWRlX2hvc3QgewotCWlkZV9od2lmX3QJKnBvcnRzW01BWF9IT1NUX1BPUlRTXTsKKwlpZGVfaHdpZl90CSpwb3J0c1tNQVhfSE9TVF9QT1JUUyArIDFdOwogCXVuc2lnbmVkIGludAluX3BvcnRzOwogCXN0cnVjdCBkZXZpY2UJKmRldlsyXTsKIAl1bnNpZ25lZCBpbnQJKCppbml0X2NoaXBzZXQpKHN0cnVjdCBwY2lfZGV2ICopOwogCXVuc2lnbmVkIGxvbmcJaG9zdF9mbGFnczsKIAl2b2lkCQkqaG9zdF9wcml2OworCWlkZV9od2lmX3QJKmN1cl9wb3J0OwkvKiBmb3IgaG9zdHMgcmVxdWlyaW5nIHNlcmlhbGl6YXRpb24gKi8KKworCS8qIHVzZWQgZm9yIGhvc3RzIHJlcXVpcmluZyBzZXJpYWxpemF0aW9uICovCisJdm9sYXRpbGUgbG9uZwlob3N0X2J1c3k7CiB9OwogCisjZGVmaW5lIElERV9IT1NUX0JVU1kgMAorCiAvKgogICogIGludGVybmFsIGlkZSBpbnRlcnJ1cHQgaGFuZGxlciB0eXBlCiAgKi8KQEAgLTg2MywzOCArODg1LDYgQEAKIC8qIHVzZWQgYnkgaWRlLWNkLCBpZGUtZmxvcHB5LCBldGMuICovCiB0eXBlZGVmIHZvaWQgKHhmZXJfZnVuY190KShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgKiwgdW5zaWduZWQpOwogCi10eXBlZGVmIHN0cnVjdCBod2dyb3VwX3MgewotCQkvKiBpcnEgaGFuZGxlciwgaWYgYWN0aXZlICovCi0JaWRlX3N0YXJ0c3RvcF90CSgqaGFuZGxlcikoaWRlX2RyaXZlX3QgKik7Ci0KLQkJLyogQk9PTDogcHJvdGVjdHMgYWxsIGZpZWxkcyBiZWxvdyAqLwotCXZvbGF0aWxlIGludCBidXN5OwotCQkvKiBCT09MOiBwb2xsaW5nIGFjdGl2ZSAmIHBvbGxfdGltZW91dCBmaWVsZCB2YWxpZCAqLwotCXVuc2lnbmVkIGludCBwb2xsaW5nCTogMTsKLQotCQkvKiBjdXJyZW50IGRyaXZlICovCi0JaWRlX2RyaXZlX3QgKmRyaXZlOwotCQkvKiBwdHIgdG8gY3VycmVudCBod2lmIGluIGxpbmtlZC1saXN0ICovCi0JaWRlX2h3aWZfdCAqaHdpZjsKLQotCQkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJLyogZmFpbHNhZmUgdGltZXIgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQkJLyogdGltZW91dCB2YWx1ZSBkdXJpbmcgbG9uZyBwb2xscyAqLwotCXVuc2lnbmVkIGxvbmcgcG9sbF90aW1lb3V0OwotCQkvKiBxdWVyaWVkIHVwb24gdGltZW91dHMgKi8KLQlpbnQgKCpleHBpcnkpKGlkZV9kcml2ZV90ICopOwotCi0JaW50IHJlcV9nZW47Ci0JaW50IHJlcV9nZW5fdGltZXI7Ci0KLQlzcGlubG9ja190IGxvY2s7Ci19IGlkZV9od2dyb3VwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGlkZV9kcml2ZXJfcyBpZGVfZHJpdmVyX3Q7Ci0KIGV4dGVybiBzdHJ1Y3QgbXV0ZXggaWRlX3NldHRpbmdfbXR4OwogCiAvKgpAQCAtMTAyMCw4ICsxMDEwLDggQEAKIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKik7CiB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICopOwogdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICosIGlkZV9kcml2ZXJfdCAqKTsKLXZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOwordm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9kcml2ZXIgKik7Cit2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfZHJpdmVyICopOwogCiByZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2NhcGFjaXR5OwogcmVhZF9wcm9jX3QgcHJvY19pZGVfcmVhZF9nZW9tZXRyeTsKQEAgLTEwNDgsOCArMTAzOCwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKSB7IDsgfQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsCisJCQkJCSAgICBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICAgICAgc3RydWN0IGlkZV9kcml2ZXIgKmRyaXZlcikgeyA7IH0KICNkZWZpbmUgUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbikgcmV0dXJuIDA7CiAjZW5kaWYKIApAQCAtMTExOCwxMSArMTExMCwxMCBAQAogICogVGhlIGdlbmRyaXZlci5vd25lciBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHRoZSBtb2R1bGUgb3duZXIgb2YgdGhpcyBkcml2ZXIuCiAgKiBUaGUgZ2VuZHJpdmVyLm5hbWUgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiB0aGlzIGRyaXZlcgogICovCi1zdHJ1Y3QgaWRlX2RyaXZlcl9zIHsKK3N0cnVjdCBpZGVfZHJpdmVyIHsKIAljb25zdCBjaGFyCQkJKnZlcnNpb247CiAJaWRlX3N0YXJ0c3RvcF90CSgqZG9fcmVxdWVzdCkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgc2VjdG9yX3QpOwogCWludAkJKCplbmRfcmVxdWVzdCkoaWRlX2RyaXZlX3QgKiwgaW50LCBpbnQpOwotCWlkZV9zdGFydHN0b3BfdAkoKmVycm9yKShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHU4LCB1OCk7CiAJc3RydWN0IGRldmljZV9kcml2ZXIJZ2VuX2RyaXZlcjsKIAlpbnQJCSgqcHJvYmUpKGlkZV9kcml2ZV90ICopOwogCXZvaWQJCSgqcmVtb3ZlKShpZGVfZHJpdmVfdCAqKTsKQEAgLTExMzQsNyArMTEyNSw3IEBACiAjZW5kaWYKIH07CiAKLSNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcikKKyNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBpZGVfZHJpdmVyLCBnZW5fZHJpdmVyKQogCiBpbnQgaWRlX2RldmljZV9nZXQoaWRlX2RyaXZlX3QgKik7CiB2b2lkIGlkZV9kZXZpY2VfcHV0KGlkZV9kcml2ZV90ICopOwpAQCAtMTE2Niw5ICsxMTU3LDcgQEAKIAogdm9pZCBpZGVfcGFkX3RyYW5zZmVyKGlkZV9kcml2ZV90ICosIGludCwgaW50KTsKIAotaWRlX3N0YXJ0c3RvcF90IF9faWRlX2Vycm9yKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHU4LCB1OCk7Ci0KLWlkZV9zdGFydHN0b3BfdCBpZGVfZXJyb3IgKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCBieXRlIHN0YXQpOworaWRlX3N0YXJ0c3RvcF90IGlkZV9lcnJvcihpZGVfZHJpdmVfdCAqLCBjb25zdCBjaGFyICosIHU4KTsKIAogdm9pZCBpZGVfZml4X2RyaXZlaWQodTE2ICopOwogCkBAIC0xMTkyLDcgKzExODEsNiBAQAogdm9pZCBpZGVfZXhlY19jb21tYW5kKGlkZV9od2lmX3QgKiwgdTgpOwogdTggaWRlX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKik7CiB1OCBpZGVfcmVhZF9hbHRzdGF0dXMoaWRlX2h3aWZfdCAqKTsKLXU4IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKik7CiAKIHZvaWQgaWRlX3NldF9pcnEoaWRlX2h3aWZfdCAqLCBpbnQpOwogCkBAIC0xMjcyLDI2ICsxMjYwLDYgQEAKIAogZXh0ZXJuIHZvaWQgaWRlX3RpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBpZGVfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi1zdGF0aWMgaW5saW5lIGludCBpZGVfbG9ja19od2dyb3VwKGlkZV9od2dyb3VwX3QgKmh3Z3JvdXApCi17Ci0JaWYgKGh3Z3JvdXAtPmJ1c3kpCi0JCXJldHVybiAxOwotCi0JaHdncm91cC0+YnVzeSA9IDE7Ci0JLyogZm9yIGF0YXJpIG9ubHkgKi8KLQlpZGVfZ2V0X2xvY2soaWRlX2ludHIsIGh3Z3JvdXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfdW5sb2NrX2h3Z3JvdXAoaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKLXsKLQkvKiBmb3IgYXRhcmkgb25seSAqLwotCWlkZV9yZWxlYXNlX2xvY2soKTsKLQlod2dyb3VwLT5idXN5ID0gMDsKLX0KLQogZXh0ZXJuIHZvaWQgZG9faWRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIHZvaWQgaWRlX2luaXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqLCBpZGVfZHJpdmVfdCAqKTsKQEAgLTEzMjcsMTEgKzEyOTUsMTEgQEAKIH0KICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdF9zIHsKK3N0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdCB7CiAJdTgJcmVnOwkvKiBieXRlIHBjaSByZWcgaG9sZGluZyB0aGUgZW5hYmxlLWJpdCAqLwogCXU4CW1hc2s7CS8qIG1hc2sgdG8gaXNvbGF0ZSB0aGUgZW5hYmxlLWJpdCAqLwogCXU4CXZhbDsJLyogdmFsdWUgb2YgbWFza2VkIHJlZyB3aGVuICJlbmFibGVkIiAqLwotfSBpZGVfcGNpX2VuYWJsZWJpdF90OworfTsKIAogZW51bSB7CiAJLyogVXNlcyBJU0EgY29udHJvbCBwb3J0cyBub3QgUENJIG9uZXMuICovCkBAIC0xNDIwLDcgKzEzODgsOCBAQAogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMJKnBvcnRfb3BzOwogCWNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcwkqZG1hX29wczsKIAotCWlkZV9wY2lfZW5hYmxlYml0X3QJZW5hYmxlYml0c1syXTsKKwlzdHJ1Y3QgaWRlX3BjaV9lbmFibGViaXQJZW5hYmxlYml0c1syXTsKKwogCWh3aWZfY2hpcHNldF90CQljaGlwc2V0OwogCiAJdTE2CQkJbWF4X3NlY3RvcnM7CS8qIGlmIDwgdGhhbiB0aGUgZGVmYXVsdCBvbmUgKi8KQEAgLTE0OTIsNiArMTQ2MSw3IEBACiBleHRlcm4gdm9pZCBpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKik7Cit1OCBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICopOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBzZmZfZG1hX29wczsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBjb25maWdfZHJpdmVfZm9yX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUpIHsgcmV0dXJuIDA7IH0KQEAgLTE1MjksOSArMTQ5OSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX2FjcGlfc2V0X3N0YXRlKGlkZV9od2lmX3QgKmh3aWYsIGludCBvbikge30KICNlbmRpZgogCi12b2lkIGlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3VucmVnaXN0ZXIoaWRlX2h3aWZfdCAqKTsKLQogdm9pZCBpZGVfcmVnaXN0ZXJfcmVnaW9uKHN0cnVjdCBnZW5kaXNrICopOwogdm9pZCBpZGVfdW5yZWdpc3Rlcl9yZWdpb24oc3RydWN0IGdlbmRpc2sgKik7CiAKQEAgLTE2MTYsMjMgKzE1ODMsNiBAQAogCWlkZV9zZXRfcGlvKGRyaXZlLCAyNTUpOwogfQogCi1leHRlcm4gc3BpbmxvY2tfdCBpZGVfbG9jazsKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggaWRlX2NmZ19tdHg7Ci0vKgotICogU3RydWN0dXJlIGxvY2tpbmc6Ci0gKgotICogaWRlX2NmZ19tdHggYW5kIGh3Z3JvdXAtPmxvY2sgdG9nZXRoZXIgcHJvdGVjdCBjaGFuZ2VzIHRvCi0gKiBpZGVfaHdpZl90LT5uZXh0Ci0gKiBpZGVfZHJpdmVfdC0+bmV4dAotICoKLSAqIGlkZV9od2dyb3VwX3QtPmJ1c3k6IGh3Z3JvdXAtPmxvY2sKLSAqIGlkZV9od2dyb3VwX3QtPmh3aWY6IGh3Z3JvdXAtPmxvY2sKLSAqIGlkZV9od2lmX3QtPntod2dyb3VwLG1hdGV9OiBjb25zdGFudCwgbm8gbG9ja2luZwotICogaWRlX2RyaXZlX3QtPmh3aWY6IGNvbnN0YW50LCBubyBsb2NraW5nCi0gKi8KLQotI2RlZmluZSBsb2NhbF9pcnFfc2V0KGZsYWdzKQlkbyB7IGxvY2FsX3NhdmVfZmxhZ3MoKGZsYWdzKSk7IGxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOyB9IHdoaWxlICgwKQotCiBjaGFyICppZGVfbWVkaWFfc3RyaW5nKGlkZV9kcml2ZV90ICopOwogCiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaWRlX2Rldl9hdHRyc1tdOwpAQCAtMTY1MSw4ICsxNjAxLDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaWRlX2RyaXZlX3QgKmlkZV9nZXRfcGFpcl9kZXYoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpwZWVyID0gJmRyaXZlLT5od2lmLT5kcml2ZXNbKGRyaXZlLT5kbiBeIDEpICYgMV07CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBkcml2ZS0+aHdpZi0+ZGV2aWNlc1soZHJpdmUtPmRuIF4gMSkgJiAxXTsKIAogCXJldHVybiAocGVlci0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID8gcGVlciA6IE5VTEw7CiB9CisKKyNkZWZpbmUgaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRldiwgcG9ydCkgXAorCWZvciAoKGkpID0gMDsgKChkZXYpID0gKHBvcnQpLT5kZXZpY2VzW2ldKSB8fCAoaSkgPCBNQVhfRFJJVkVTOyAoaSkrKykKKworI2RlZmluZSBpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIHBvcnQsIGhvc3QpIFwKKwlmb3IgKChpKSA9IDA7ICgocG9ydCkgPSAoaG9zdCktPnBvcnRzW2ldKSB8fCAoaSkgPCBNQVhfSE9TVF9QT1JUUzsgKGkpKyspCisKICNlbmRpZiAvKiBfSURFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IDA3MDJjNGQuLjkxMjdmNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxbnIuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0yNTMsNyArMjUyLDggQEAKIAlCTE9DS19TT0ZUSVJRLAogCVRBU0tMRVRfU09GVElSUSwKIAlTQ0hFRF9TT0ZUSVJRLAotCVJDVV9TT0ZUSVJRLCAJLyogUHJlZmVyYWJsZSBSQ1Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbGFzdCBzb2Z0aXJxICovCisJSFJUSU1FUl9TT0ZUSVJRLAorCVJDVV9TT0ZUSVJRLAkvKiBQcmVmZXJhYmxlIFJDVSBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0IHNvZnRpcnEgKi8KIAogCU5SX1NPRlRJUlFTCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFuci5oIGIvaW5jbHVkZS9saW51eC9pcnFuci5oCmluZGV4IDU1MDRhNWMuLjg2YWY5MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxbnIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycW5yLmgKQEAgLTgsNyArOCwxMiBAQAogCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX0hBUkRJUlFTCiAjaW5jbHVkZSA8YXNtL2lycS5oPgotIyBkZWZpbmUgbnJfaXJxcwkJTlJfSVJRUworCisvKgorICogV3JhcHBlcnMgZm9yIG5vbi1nZW5pcnEgYXJjaGl0ZWN0dXJlczoKKyAqLworI2RlZmluZSBucl9pcnFzCQkJTlJfSVJRUworI2RlZmluZSBpcnFfdG9fZGVzYyhpcnEpCSgmaXJxX2Rlc2NbaXJxXSkKIAogIyBkZWZpbmUgZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKQkJXAogCWZvciAoaXJxID0gMDsgaXJxIDwgbnJfaXJxczsgaXJxKyspCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBjYTlmZjY0Li42YjhlMjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTQ4LDYgKzQ4LDEyIEBACiAjZGVmaW5lIEZJRUxEX1NJWkVPRih0LCBmKSAoc2l6ZW9mKCgodCopMCktPmYpKQogI2RlZmluZSBESVZfUk9VTkRfVVAobixkKSAoKChuKSArIChkKSAtIDEpIC8gKGQpKQogI2RlZmluZSByb3VuZHVwKHgsIHkpICgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKQorI2RlZmluZSBESVZfUk9VTkRfQ0xPU0VTVCh4LCBkaXZpc29yKSgJCQlcCit7CQkJCQkJCVwKKwl0eXBlb2YoZGl2aXNvcikgX19kaXZpc29yID0gZGl2aXNvcjsJCVwKKwkoKCh4KSArICgoX19kaXZpc29yKSAvIDIpKSAvIChfX2Rpdmlzb3IpKTsJXAorfQkJCQkJCQlcCispCiAKICNkZWZpbmUgX1JFVF9JUF8JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKQogI2RlZmluZSBfVEhJU19JUF8gICh7IF9fbGFiZWxfXyBfX2hlcmU7IF9faGVyZTogKHVuc2lnbmVkIGxvbmcpJiZfX2hlcmU7IH0pCkBAIC0zNDksMTMgKzM1NSwxMyBAQAogICAgICAgICBwcmludGsoS0VSTl9JTkZPIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogCiAvKiBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkcml2ZXIsIHBsZWFzZSB1c2UgZGV2X2RiZyBpbnN0ZWFkICovCi0jaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKQogI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgZG8geyBcCiAJZHluYW1pY19wcl9kZWJ1Zyhwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXyk7IFwKIAl9IHdoaWxlICgwKQotI2VsaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNlbHNlCiAjZGVmaW5lIHByX2RlYnVnKGZtdCwgLi4uKSBcCiAJKHsgaWYgKDApIHByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgMDsgfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2xpc3QuaCBiL2luY2x1ZGUvbGludXgva2xpc3QuaAppbmRleCA4ZWE5OGRiLi5kNWEyN2FmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rbGlzdC5oCkBAIC0xMyw3ICsxMyw2IEBACiAjZGVmaW5lIF9MSU5VWF9LTElTVF9ICiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC00MSw3ICs0MCw2IEBACiAJdm9pZAkJCSpuX2tsaXN0OwkvKiBuZXZlciBhY2Nlc3MgZGlyZWN0bHkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCW5fbm9kZTsKIAlzdHJ1Y3Qga3JlZgkJbl9yZWY7Ci0Jc3RydWN0IGNvbXBsZXRpb24Jbl9yZW1vdmVkOwogfTsKIAogZXh0ZXJuIHZvaWQga2xpc3RfYWRkX3RhaWwoc3RydWN0IGtsaXN0X25vZGUgKm4sIHN0cnVjdCBrbGlzdCAqayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaCBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCmluZGV4IDQ5N2IxZDEuLmQ2ZWExOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oCkBAIC02OSw5ICs2OSw2IEBACiAJLyogbGlzdCBvZiBrcHJvYmVzIGZvciBtdWx0aS1oYW5kbGVyIHN1cHBvcnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKLQkvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgaGFzIGJlZW4gcmVmIGNvdW50ZWQgKi8KLQl1bnNpZ25lZCBpbnQgbW9kX3JlZmNvdW50ZWQ7Ci0KIAkvKmNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBwcm9iZSB3YXMgdGVtcG9yYXJpbHkgZGlzYXJtZWQgKi8KIAl1bnNpZ25lZCBsb25nIG5taXNzZWQ7CiAKQEAgLTEwMyw4ICsxMDAsMTkgQEAKIAogCS8qIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uICovCiAJc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiBhaW5zbjsKKworCS8qIEluZGljYXRlcyB2YXJpb3VzIHN0YXR1cyBmbGFncy4gIFByb3RlY3RlZCBieSBrcHJvYmVfbXV0ZXguICovCisJdTMyIGZsYWdzOwogfTsKIAorLyogS3Byb2JlIHN0YXR1cyBmbGFncyAqLworI2RlZmluZSBLUFJPQkVfRkxBR19HT05FCTEgLyogYnJlYWtwb2ludCBoYXMgYWxyZWFkeSBnb25lICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9nb25lKHN0cnVjdCBrcHJvYmUgKnApCit7CisJcmV0dXJuIHAtPmZsYWdzICYgS1BST0JFX0ZMQUdfR09ORTsKK30KKwogLyoKICAqIFNwZWNpYWwgcHJvYmUgdHlwZSB0aGF0IHVzZXMgc2V0am1wLWxvbmdqbXAgdHlwZSB0cmlja3MgdG8gcmVzdW1lCiAgKiBleGVjdXRpb24gYXQgYSBzcGVjaWZpZWQgZW50cnkgd2l0aCBhIG1hdGNoaW5nIHByb3RvdHlwZSBjb3JyZXNwb25kaW5nCkBAIC0yMDEsNyArMjA5LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfS1BST0JFU19TQU5JVFlfVEVTVCAqLwogCi1leHRlcm4gc3RydWN0IG11dGV4IGtwcm9iZV9tdXRleDsKIGV4dGVybiBpbnQgYXJjaF9wcmVwYXJlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlicHMyLmggYi9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCmluZGV4IGFmYzQxMzMuLmI5NDUzNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlicHMyLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJwczIuaApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIFBTMl9SRVRfSUQJCTB4MDAKICNkZWZpbmUgUFMyX1JFVF9BQ0sJCTB4ZmEKICNkZWZpbmUgUFMyX1JFVF9OQUsJCTB4ZmUKKyNkZWZpbmUgUFMyX1JFVF9FUlIJCTB4ZmMKIAogI2RlZmluZSBQUzJfRkxBR19BQ0sJCTEJLyogV2FpdGluZyBmb3IgQUNLL05BSyAqLwogI2RlZmluZSBQUzJfRkxBR19DTUQJCTIJLyogV2FpdGluZyBmb3IgY29tbWFuZCB0byBmaW5pc2ggKi8KICNkZWZpbmUgUFMyX0ZMQUdfQ01EMQkJNAkvKiBXYWl0aW5nIGZvciB0aGUgZmlyc3QgYnl0ZSBvZiBjb21tYW5kIHJlc3BvbnNlICovCiAjZGVmaW5lIFBTMl9GTEFHX1dBSVRJRAkJOAkvKiBDb21tYW5kIGV4ZWNpdGluZyBpcyBHRVQgSUQgKi8KKyNkZWZpbmUgUFMyX0ZMQUdfTkFLCQkxNgkvKiBMYXN0IHRyYW5zbWlzc2lvbiB3YXMgTkFLZWQgKi8KIAogc3RydWN0IHBzMmRldiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmggYi9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCmluZGV4IDdkZjg0MzIuLjEyZDYyYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaApAQCAtNzUsNyArNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIJdGFibGVbMTI4XTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQorc3RhdGljIF9faW5saW5lX18gaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQogewogCXJldHVybiBjID49IDAgJiYgYyA8IHNpemVvZihtYXAtPnRhYmxlKSA/IG1hcC0+dGFibGVbY10gOiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKaW5kZXggMzZjODJjOS4uM2ZkYzEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCkBAIC03OSwxNCArNzksMTQgQEAKICNlbHNlCiBleHRlcm4gaW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotZXh0ZXJuIGludCByZWdpc3Rlcl9uZXdfbWVtb3J5KHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShpbnQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9tZW1vcnlfc2VjdGlvbihzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CiBleHRlcm4gaW50IG1lbW9yeV9kZXZfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgcmVtb3ZlX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKiwgaW50KTsKIGV4dGVybiBpbnQgbWVtb3J5X25vdGlmeSh1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqdik7CitleHRlcm4gc3RydWN0IG1lbW9yeV9ibG9jayAqZmluZF9tZW1vcnlfYmxvY2soc3RydWN0IG1lbV9zZWN0aW9uICopOwogI2RlZmluZSBDT05GSUdfTUVNX0JMT0NLX1NJWkUJKFBBR0VTX1BFUl9TRUNUSU9OPDxQQUdFX1NISUZUKQotCi0KK2VudW0gbWVtX2FkZF9jb250ZXh0IHsgQk9PVCwgSE9UUExVRyB9OwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UgKi8KIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCmluZGV4IDc2M2JhODEuLmQ5NWY3MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKQEAgLTcyLDcgKzcyLDcgQEAKIGV4dGVybiBpbnQgb2ZmbGluZV9wYWdlcyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIAogLyogcmVhc29uYWJseSBnZW5lcmljIGludGVyZmFjZSB0byBleHBhbmQgdGhlIHBoeXNpY2FsIHBhZ2VzIGluIGEgem9uZSAgKi8KLWV4dGVybiBpbnQgX19hZGRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorZXh0ZXJuIGludCBfX2FkZF9wYWdlcyhpbnQgbmlkLCBzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IF9fcmVtb3ZlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKaW5kZXggM2YzNDAwNS4uNTI3NjAyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKQEAgLTcsNiArNyw4IEBACiB0eXBlZGVmIHN0cnVjdCBwYWdlICpuZXdfcGFnZV90KHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqKTsKIAogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKyNkZWZpbmUgUEFHRV9NSUdSQVRJT04gMQorCiBleHRlcm4gaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpOwogZXh0ZXJuIGludCBtaWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwKIAkJCXN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwpAQCAtMjAsNiArMjIsOCBAQAogCQljb25zdCBub2RlbWFza190ICpmcm9tLCBjb25zdCBub2RlbWFza190ICp0bywKIAkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZWxzZQorI2RlZmluZSBQQUdFX01JR1JBVElPTiAwCisKIHN0YXRpYyBpbmxpbmUgaW50IHB1dGJhY2tfbHJ1X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAogCQl1bnNpZ25lZCBsb25nIHByaXZhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggMjY0MzNlYy4uYTgyMGY4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMsMzMgKzMsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogCi0jZGVmaW5lIFBTTU9VU0VfTUlOT1IgIDEKLSNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IgMgotI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUiAzCi0vKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUiA0CUZJWE1FIE9CU09MRVRFICovCi0jZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IgNQotI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IgNgotI2RlZmluZSBBUE9MTE9fTU9VU0VfTUlOT1IgNwotI2RlZmluZSBQQzExMFBBRF9NSU5PUiA5Ci0vKiNkZWZpbmUgQURCX01PVVNFX01JTk9SIDEwCUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIFBTTU9VU0VfTUlOT1IJCTEKKyNkZWZpbmUgTVNfQlVTTU9VU0VfTUlOT1IJMgorI2RlZmluZSBBVElYTF9CVVNNT1VTRV9NSU5PUgkzCisvKiNkZWZpbmUgQU1JR0FNT1VTRV9NSU5PUgk0CUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIEFUQVJJTU9VU0VfTUlOT1IJNQorI2RlZmluZSBTVU5fTU9VU0VfTUlOT1IJCTYKKyNkZWZpbmUgQVBPTExPX01PVVNFX01JTk9SCTcKKyNkZWZpbmUgUEMxMTBQQURfTUlOT1IJCTkKKy8qI2RlZmluZSBBREJfTU9VU0VfTUlOT1IJMTAJRklYTUUgT0JTT0xFVEUgKi8KICNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJCTEzMAkvKiBXYXRjaGRvZyB0aW1lciAgICAgKi8KICNkZWZpbmUgVEVNUF9NSU5PUgkJMTMxCS8qIFRlbXBlcmF0dXJlIFNlbnNvciAqLwotI2RlZmluZSBSVENfTUlOT1IgMTM1CisjZGVmaW5lIFJUQ19NSU5PUgkJMTM1CiAjZGVmaW5lIEVGSV9SVENfTUlOT1IJCTEzNgkvKiBFRkkgVGltZSBzZXJ2aWNlcyAqLwotI2RlZmluZSBTVU5fT1BFTlBST01fTUlOT1IgMTM5CisjZGVmaW5lIFNVTl9PUEVOUFJPTV9NSU5PUgkxMzkKICNkZWZpbmUgRE1BUElfTUlOT1IJCTE0MAkvKiBETUFQSSAqLwotI2RlZmluZSBOVlJBTV9NSU5PUiAxNDQKLSNkZWZpbmUgU0dJX01NVElNRVIgICAgICAgIDE1MworI2RlZmluZSBOVlJBTV9NSU5PUgkJMTQ0CisjZGVmaW5lIFNHSV9NTVRJTUVSCQkxNTMKICNkZWZpbmUgU1RPUkVfUVVFVUVfTUlOT1IJMTU1Ci0jZGVmaW5lIEkyT19NSU5PUiAxNjYKKyNkZWZpbmUgSTJPX01JTk9SCQkxNjYKICNkZWZpbmUgTUlDUk9DT0RFX01JTk9SCQkxODQKLSNkZWZpbmUgTVdBVkVfTUlOT1IJMjE5CQkvKiBBQ1AvTXdhdmUgTW9kZW0gKi8KLSNkZWZpbmUgTVBUX01JTk9SCTIyMAotI2RlZmluZSBNSVNDX0RZTkFNSUNfTUlOT1IgMjU1Ci0KLSNkZWZpbmUgVFVOX01JTk9SCSAgICAgMjAwCi0jZGVmaW5lCUhQRVRfTUlOT1IJICAgICAyMjgKLSNkZWZpbmUgS1ZNX01JTk9SICAgICAgICAgICAgMjMyCisjZGVmaW5lIFRVTl9NSU5PUgkJMjAwCisjZGVmaW5lIE1XQVZFX01JTk9SCQkyMTkJLyogQUNQL013YXZlIE1vZGVtICovCisjZGVmaW5lIE1QVF9NSU5PUgkJMjIwCisjZGVmaW5lIEhQRVRfTUlOT1IJCTIyOAorI2RlZmluZSBGVVNFX01JTk9SCQkyMjkKKyNkZWZpbmUgS1ZNX01JTk9SCQkyMzIKKyNkZWZpbmUgTUlTQ19EWU5BTUlDX01JTk9SCTI1NQogCiBzdHJ1Y3QgZGV2aWNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYWFhOGI4NC4uNGEzZDI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtNzE3LDYgKzcxNywxMSBAQAogCiAjZGVmaW5lIFZNX0ZBVUxUX0VSUk9SCShWTV9GQVVMVF9PT00gfCBWTV9GQVVMVF9TSUdCVVMpCiAKKy8qCisgKiBDYW4gYmUgY2FsbGVkIGJ5IHRoZSBwYWdlZmF1bHQgaGFuZGxlciB3aGVuIGl0IGdldHMgYSBWTV9GQVVMVF9PT00uCisgKi8KK2V4dGVybiB2b2lkIHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KHZvaWQpOworCiAjZGVmaW5lIG9mZnNldF9pbl9wYWdlKHApCSgodW5zaWduZWQgbG9uZykocCkgJiB+UEFHRV9NQVNLKQogCiBleHRlcm4gdm9pZCBzaG93X2ZyZWVfYXJlYXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCAzYmZlZDAxLi40ZjdlYTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTI5NCw5ICsyOTQsNiBAQAogCS8qIFRoZSBzaXplIG9mIHRoZSBleGVjdXRhYmxlIGNvZGUgaW4gZWFjaCBzZWN0aW9uLiAgKi8KIAl1bnNpZ25lZCBpbnQgaW5pdF90ZXh0X3NpemUsIGNvcmVfdGV4dF9zaXplOwogCi0JLyogVGhlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHVud2luZF9hZGRfdGFibGUuICovCi0Jdm9pZCAqdW53aW5kX2luZm87Ci0KIAkvKiBBcmNoLXNwZWNpZmljIG1vZHVsZSB2YWx1ZXMgKi8KIAlzdHJ1Y3QgbW9kX2FyY2hfc3BlY2lmaWMgYXJjaDsKIApAQCAtMzY4LDYgKzM2NSwxOCBAQAogc3RydWN0IG1vZHVsZSAqX19tb2R1bGVfdGV4dF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBpbnQgaXNfbW9kdWxlX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKTsKIAorc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9jb3JlKHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlIDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUgKyBtb2QtPmNvcmVfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2l0aGluX21vZHVsZV9pbml0KHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0IDw9IGFkZHIgJiYKKwkgICAgICAgYWRkciA8ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQgKyBtb2QtPmluaXRfc2l6ZTsKK30KKwogLyogUmV0dXJucyAwIGFuZCBmaWxscyBpbiB2YWx1ZSwgZGVmaW5lZCBhbmQgbmFtZWJ1Ziwgb3IgLUVSQU5HRSBpZgogICAgc3ltbnVtIG91dCBvZiByYW5nZS4gKi8KIGludCBtb2R1bGVfZ2V0X2thbGxzeW0odW5zaWduZWQgaW50IHN5bW51bSwgdW5zaWduZWQgbG9uZyAqdmFsdWUsIGNoYXIgKnR5cGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jb25jYXQuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCmluZGV4IGMwMmYzZDIuLmU4MGM2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCkBAIC0xMyw3ICsxMyw3IEBACiBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jb25jYXRfY3JlYXRlKAogICAgIHN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2W10sICAvKiBzdWJkZXZpY2VzIHRvIGNvbmNhdGVuYXRlICovCiAgICAgaW50IG51bV9kZXZzLCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJkZXZpY2VzICAgICAgKi8KLSAgICBjaGFyICpuYW1lKTsgICAgICAgICAgICAgICAgLyogbmFtZSBmb3IgdGhlIG5ldyBkZXZpY2UgICAqLworICAgIGNvbnN0IGNoYXIgKm5hbWUpOyAgICAgICAgICAvKiBuYW1lIGZvciB0aGUgbmV3IGRldmljZSAgICovCiAKIHZvaWQgbXRkX2NvbmNhdF9kZXN0cm95KHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ub2RlLmggYi9pbmNsdWRlL2xpbnV4L25vZGUuaAppbmRleCBiYzAwMWJjLi42ODFhNjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25vZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25vZGUuaApAQCAtMjYsNiArMjYsNyBAQAogCXN0cnVjdCBzeXNfZGV2aWNlCXN5c2RldjsKIH07CiAKK3N0cnVjdCBtZW1vcnlfYmxvY2s7CiBleHRlcm4gc3RydWN0IG5vZGUgbm9kZV9kZXZpY2VzW107CiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfbm9kZShzdHJ1Y3Qgbm9kZSAqLCBpbnQsIHN0cnVjdCBub2RlICopOwpAQCAtMzUsNiArMzYsOSBAQAogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9vbmVfbm9kZShpbnQgbmlkKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5pZCk7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5pZCk7CitleHRlcm4gaW50IHJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGUoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaywKKwkJCQkJCWludCBuaWQpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGVzKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGspOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX29uZV9ub2RlKGludCBuaWQpCiB7CkBAIC01Miw2ICs1NiwxNSBAQAogewogCXJldHVybiAwOwogfQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrLAorCQkJCQkJCWludCBuaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB1bnJlZ2lzdGVyX21lbV9zZWN0X3VuZGVyX25vZGVzKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGspCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogI2RlZmluZSB0b19ub2RlKHN5c19kZXZpY2UpIGNvbnRhaW5lcl9vZihzeXNfZGV2aWNlLCBzdHJ1Y3Qgbm9kZSwgc3lzZGV2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCBiMTJmOTNhLi4yMTlhNTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMjI4LDYgKzIyOCw3IEBACiBQQUdFRkxBRyhTd2FwQ2FjaGUsIHN3YXBjYWNoZSkKICNlbHNlCiBQQUdFRkxBR19GQUxTRShTd2FwQ2FjaGUpCisJU0VUUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpIENMRUFSUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19VTkVWSUNUQUJMRV9MUlUKQEAgLTM3MiwzMSArMzczLDIyIEBACiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJMAogI2VuZGlmCiAKLSNkZWZpbmUgUEFHRV9GTEFHUwkoMSA8PCBQR19scnUgICB8IDEgPDwgUEdfcHJpdmF0ZSAgIHwgMSA8PCBQR19sb2NrZWQgfCBcCi0JCQkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgXAotCQkJIDEgPDwgUEdfc2xhYiAgfCAxIDw8IFBHX3N3YXBjYWNoZSB8IDEgPDwgUEdfYWN0aXZlIHwgXAotCQkJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCi0KLS8qCi0gKiBGbGFncyBjaGVja2VkIGluIGJhZF9wYWdlKCkuICBQYWdlcyBvbiB0aGUgZnJlZSBsaXN0IHNob3VsZCBub3QgaGF2ZQotICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KLSAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NMRUFSX1dIRU5fQkFEIChQQUdFX0ZMQUdTIHwgXAotCQkxIDw8IFBHX3JlY2xhaW0gfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQotCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBmcmVlZC4gIFBhZ2VzIGJlaW5nIGZyZWVkIHNob3VsZCBub3QgaGF2ZQogICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgKFBBR0VfRkxBR1MgfCAxIDw8IFBHX3Jlc2VydmVkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgXAorCSgxIDw8IFBHX2xydSAgIHwgMSA8PCBQR19wcml2YXRlICAgfCAxIDw8IFBHX2xvY2tlZCB8IFwKKwkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKKwkgMSA8PCBQR19zbGFiICB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCisJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCiAKIC8qCiAgKiBGbGFncyBjaGVja2VkIHdoZW4gYSBwYWdlIGlzIHByZXBwZWQgZm9yIHJldHVybiBieSB0aGUgcGFnZSBhbGxvY2F0b3IuCi0gKiBQYWdlcyBiZWluZyBwcmVwcGVkIHNob3VsZCBub3QgaGF2ZSB0aGVzZSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSwgdGhlcmUKLSAqIGlzIGEgcHJvYmxlbS4KKyAqIFBhZ2VzIGJlaW5nIHByZXBwZWQgc2hvdWxkIG5vdCBoYXZlIGFueSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSBzZXQsCisgKiB0aGVyZSBoYXMgYmVlbiBhIGtlcm5lbCBidWcgb3Igc3RydWN0IHBhZ2UgY29ycnVwdGlvbi4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAgKFBBR0VfRkxBR1MgfCBcCi0JCTEgPDwgUEdfcmVzZXJ2ZWQgfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAJKCgxIDw8IE5SX1BBR0VGTEFHUykgLSAxKQogCiAjZW5kaWYgLyogIV9fR0VORVJBVElOR19CT1VORFNfSCAqLwogI2VuZGlmCS8qIFBBR0VfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdldmVjLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAppbmRleCBlOTBhMmNiLi43YjI4ODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaApAQCAtMjEsNyArMjEsNiBAQAogfTsKIAogdm9pZCBfX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7Ci12b2lkIF9fcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7CiB2b2lkIF9fcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKIHZvaWQgX19fX3BhZ2V2ZWNfbHJ1X2FkZChzdHJ1Y3QgcGFnZXZlYyAqcHZlYywgZW51bSBscnVfbGlzdCBscnUpOwogdm9pZCBwYWdldmVjX3N0cmlwKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKQEAgLTY5LDEyICs2OCw2IEBACiAJCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQlpZiAocGFnZXZlY19jb3VudChwdmVjKSkKLQkJX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHB2ZWMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKQogewogCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMDNiMGI4Yy4uNGJiMTU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00MjEsNyArNDIxLDYgQEAKIAlpbnQgICgqcmVzdW1lX2Vhcmx5KSAoc3RydWN0IHBjaV9kZXYgKmRldik7CiAJaW50ICAoKnJlc3VtZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwkgICAgICAgICAgICAgICAgLyogRGV2aWNlIHdva2VuIHVwICovCiAJdm9pZCAoKnNodXRkb3duKSAoc3RydWN0IHBjaV9kZXYgKmRldik7Ci0Jc3RydWN0IHBtX2V4dF9vcHMgKnBtOwogCXN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgKmVycl9oYW5kbGVyOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWRyaXZlcjsKIAlzdHJ1Y3QgcGNpX2R5bmlkcyBkeW5pZHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDIxOGM3M2IuLmQ1NDMzNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0xNjU4LDYgKzE2NTgsNyBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JPQ0tXRUxMCQkweDEyN0EKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lURQkJMHgxMjgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgxNzIJCTB4ODE3MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84MjExCQkweDgyMTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMgkJMHg4MjEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTMJCTB4ODIxMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCmluZGV4IDkwMDdjY2QuLmE3Njg0YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKQEAgLTI0LDE0ICsyNCwxOCBAQAogCXMzMiAqY291bnRlcnM7CiB9OwogCi0jaWYgTlJfQ1BVUyA+PSAxNgotI2RlZmluZSBGQkNfQkFUQ0gJKE5SX0NQVVMqMikKLSNlbHNlCi0jZGVmaW5lIEZCQ19CQVRDSAkoTlJfQ1BVUyo0KQotI2VuZGlmCitleHRlcm4gaW50IHBlcmNwdV9jb3VudGVyX2JhdGNoOwogCi1pbnQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7Ci1pbnQgcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpOworaW50IF9fcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCwKKwkJCSAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpOworCisjZGVmaW5lIHBlcmNwdV9jb3VudGVyX2luaXQoZmJjLCB2YWx1ZSkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IF9fa2V5OwkJCVwKKwkJCQkJCQkJCVwKKwkJX19wZXJjcHVfY291bnRlcl9pbml0KGZiYywgdmFsdWUsICZfX2tleSk7CQlcCisJfSkKKwogdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIHZvaWQgcGVyY3B1X2NvdW50ZXJfc2V0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKIHZvaWQgX19wZXJjcHVfY291bnRlcl9hZGQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQsIHMzMiBiYXRjaCk7CkBAIC0zOSw3ICs0Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9hZGQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCiB7Ci0JX19wZXJjcHVfY291bnRlcl9hZGQoZmJjLCBhbW91bnQsIEZCQ19CQVRDSCk7CisJX19wZXJjcHVfY291bnRlcl9hZGQoZmJjLCBhbW91bnQsIHBlcmNwdV9jb3VudGVyX2JhdGNoKTsKIH0KIAogc3RhdGljIGlubGluZSBzNjQgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQpAQCAtODUsOCArODksNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIHBlcmNwdV9jb3VudGVyX2luaXRfaXJxIHBlcmNwdV9jb3VudGVyX2luaXQKLQogc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAppbmRleCA0YjhjYzZhLi45YTM0MjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKQEAgLTU1LDcgKzU1LDYgQEAKIAlpbnQgKCpzdXNwZW5kX2xhdGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwotCXN0cnVjdCBwbV9leHRfb3BzICpwbTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggNDJkZTQwMC4uZGUyZTBhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDEsNyArNDEsNyBAQAogfSBwbV9tZXNzYWdlX3Q7CiAKIC8qKgotICogc3RydWN0IHBtX29wcyAtIGRldmljZSBQTSBjYWxsYmFja3MKKyAqIHN0cnVjdCBkZXZfcG1fb3BzIC0gZGV2aWNlIFBNIGNhbGxiYWNrcwogICoKICAqIFNldmVyYWwgZHJpdmVyIHBvd2VyIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBleHRlcm5hbGx5IHZpc2libGUsIGFmZmVjdGluZwogICogdGhlIHN0YXRlIG9mIHBlbmRpbmcgSS9PIHF1ZXVlcyBhbmQgKGZvciBkcml2ZXJzIHRoYXQgdG91Y2ggaGFyZHdhcmUpCkBAIC0xMjYsNDYgKzEyNiw2IEBACiAgKglPbiBtb3N0IHBsYXRmb3JtcywgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBhdmFpbGFiaWxpdHkgb2YKICAqCXJlc291cmNlcyBsaWtlIGNsb2NrcyBkdXJpbmcgQHJlc3RvcmUoKS4KICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcywgZXhjZXB0IGZvciBAY29tcGxldGUoKSwgcmV0dXJuIGVycm9yIGNvZGVzLgotICogSG93ZXZlciwgdGhlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZSgpLAotICogQHRoYXcoKSwgYW5kIEByZXN0b3JlKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lCi0gKiB0cmFuc2l0aW9uIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbgotICogdGhhdCBjYXNlcyBhcmUgb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nCi0gKiBwdXJwb3Nlcy4gIFN0aWxsLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMKLSAqIGZyb20gdGhlaXIgcmVzdW1lIG1ldGhvZHMgaW4gY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUKLSAqIGRldmljZSBiZWluZyBoYW5kbGVkIHJlZnVzZXMgdG8gcmVzdW1lIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0bwotICogbW9kaWZ5IHRoZSBQTSBjb3JlIGluIHRoZSBmdXR1cmUsIHNvIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlCi0gKiBkZXZpY2VzIHRoYXQgZmFpbGVkIHRvIHJlc3VtZSBhbmQgdGhlaXIgY2hpbGRyZW4uCi0gKgotICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKLSAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKLSAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgotICovCi0KLXN0cnVjdCBwbV9vcHMgewotCWludCAoKnByZXBhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKmZyZWV6ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCp0aGF3KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnBvd2Vyb2ZmKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnJlc3RvcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwbV9leHRfb3BzIC0gZXh0ZW5kZWQgZGV2aWNlIFBNIGNhbGxiYWNrcwotICoKLSAqIFNvbWUgZGV2aWNlcyByZXF1aXJlIGNlcnRhaW4gb3BlcmF0aW9ucyByZWxhdGVkIHRvIHN1c3BlbmQgYW5kIGhpYmVybmF0aW9uCi0gKiB0byBiZSBjYXJyaWVkIG91dCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaHVzLCAnc3RydWN0IHBtX2V4dF9vcHMnIGJlbG93Ci0gKiBpcyBkZWZpbmVkLCBhZGRpbmcgY2FsbGJhY2tzIHRvIGJlIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0bwotICogJ3N0cnVjdCBwbV9vcHMnLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGluY2x1ZGVkIGluICdzdHJ1Y3QgcG1fZXh0X29wcycgYXJlIGV4ZWN1dGVkIHdpdGgKLSAqIHRoZSBub25ib290IENQVXMgc3dpdGNoZWQgb2ZmIGFuZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgb24gdGhlIG9ubHkKLSAqIGZ1bmN0aW9uYWwgQ1BVLiAgVGhleSBhbHNvIGFyZSBleGVjdXRlZCB3aXRoIHRoZSBQTSBjb3JlIGxpc3Qgb2YgZGV2aWNlcwotICogbG9ja2VkLCBzbyB0aGV5IG11c3QgTk9UIHVucmVnaXN0ZXIgYW55IGRldmljZXMuCi0gKgogICogQHN1c3BlbmRfbm9pcnE6IENvbXBsZXRlIHRoZSBvcGVyYXRpb25zIG9mIC0+c3VzcGVuZCgpIGJ5IGNhcnJ5aW5nIG91dCBhbnkKICAqCWFjdGlvbnMgcmVxdWlyZWQgZm9yIHN1c3BlbmRpbmcgdGhlIGRldmljZSB0aGF0IG5lZWQgaW50ZXJydXB0cyB0byBiZQogICoJZGlzYWJsZWQKQEAgLTE5MCwxOCArMTUwLDMyIEBACiAgKglhY3Rpb25zIHJlcXVpcmVkIGZvciByZXN0b3JpbmcgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIGRldmljZSB0aGF0IG5lZWQKICAqCWludGVycnVwdHMgdG8gYmUgZGlzYWJsZWQKICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcyByZXR1cm4gZXJyb3IgY29kZXMsIGJ1dCB0aGUgZXJyb3IgY29kZXMgcmV0dXJuZWQKLSAqIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZV9ub2lycSgpLCBAdGhhd19ub2lycSgpLCBhbmQKLSAqIEByZXN0b3JlX25vaXJxKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24KLSAqIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZQotICogb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICogU3RpbGwsIGFzIHN0YXRlZCBhYm92ZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBkcml2ZXJzIG9ubHkgcmV0dXJuIGVycm9yCi0gKiBjb2RlcyBmcm9tIHRoZWlyIHJlc3VtZSBtZXRob2RzIGlmIHRoZSBkZXZpY2UgYmVpbmcgaGFuZGxlZCBmYWlscyB0byByZXN1bWUKLSAqIGFuZCBpcyBub3QgdXNhYmxlIGFueSBtb3JlLgorICogQWxsIG9mIHRoZSBhYm92ZSBjYWxsYmFja3MsIGV4Y2VwdCBmb3IgQGNvbXBsZXRlKCksIHJldHVybiBlcnJvciBjb2Rlcy4KKyAqIEhvd2V2ZXIsIHRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSB0aGUgcmVzdW1lIG9wZXJhdGlvbnMsIEByZXN1bWUoKSwKKyAqIEB0aGF3KCksIEByZXN0b3JlKCksIEByZXN1bWVfbm9pcnEoKSwgQHRoYXdfbm9pcnEoKSwgYW5kIEByZXN0b3JlX25vaXJxKCkgZG8KKyAqIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24gZHVyaW5nIHdoaWNoIHRoZXkgYXJlCisgKiByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZSBvbmx5IHByaW50ZWQgYnkgdGhlIFBNCisgKiBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgU3RpbGwsIGl0IGlzIHJlY29tbWVuZGVkCisgKiB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMgZnJvbSB0aGVpciByZXN1bWUgbWV0aG9kcyBpbiBjYXNlIG9mIGFuCisgKiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUgZGV2aWNlIGJlaW5nIGhhbmRsZWQgcmVmdXNlcyB0byByZXN1bWUKKyAqIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0byBtb2RpZnkgdGhlIFBNIGNvcmUgaW4gdGhlIGZ1dHVyZSwgc28KKyAqIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlIGRldmljZXMgdGhhdCBmYWlsZWQgdG8gcmVzdW1lIGFuZAorICogdGhlaXIgY2hpbGRyZW4uCisgKgorICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKKyAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKKyAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgogICovCiAKLXN0cnVjdCBwbV9leHRfb3BzIHsKLQlzdHJ1Y3QgcG1fb3BzIGJhc2U7CitzdHJ1Y3QgZGV2X3BtX29wcyB7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqY29tcGxldGUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZnJlZXplKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnRoYXcpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcG93ZXJvZmYpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcmVzdG9yZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpzdXNwZW5kX25vaXJxKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCAoKnJlc3VtZV9ub2lycSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpmcmVlemVfbm9pcnEpKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC0yNzgsNyArMjUyLDcgQEAKICNkZWZpbmUgUE1fRVZFTlRfU0xFRVAJCShQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfSElCRVJOQVRFKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1NVU1BFTkQJKFBNX0VWRU5UX1VTRVIgfCBQTV9FVkVOVF9TVVNQRU5EKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1JFU1VNRQkoUE1fRVZFTlRfVVNFUiB8IFBNX0VWRU5UX1JFU1VNRSkKLSNkZWZpbmUgUE1fRVZFTlRfUkVNT1RFX1dBS0VVUAkoUE1fRVZFTlRfUkVNT1RFIHwgUE1fRVZFTlRfUkVTVU1FKQorI2RlZmluZSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FCShQTV9FVkVOVF9SRU1PVEUgfCBQTV9FVkVOVF9SRVNVTUUpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fU1VTUEVORAkoUE1fRVZFTlRfQVVUTyB8IFBNX0VWRU5UX1NVU1BFTkQpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fUkVTVU1FCShQTV9FVkVOVF9BVVRPIHwgUE1fRVZFTlRfUkVTVU1FKQogCkBAIC0yOTEsMTUgKzI2NSwxNSBAQAogI2RlZmluZSBQTVNHX1RIQVcJKChzdHJ1Y3QgcG1fbWVzc2FnZSl7IC5ldmVudCA9IFBNX0VWRU5UX1RIQVcsIH0pCiAjZGVmaW5lIFBNU0dfUkVTVE9SRQkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfUkVTVE9SRSwgfSkKICNkZWZpbmUgUE1TR19SRUNPVkVSCSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9SRUNPVkVSLCB9KQotI2RlZmluZSBQTVNHX1VTRVJfU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX1VTRVJfU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzYWdlKSBcCiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfVVNFUl9SRVNVTUUsIH0pCi0jZGVmaW5lIFBNU0dfUkVNT1RFX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19SRU1PVEVfUkVTVU1FCSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FLCB9KQotI2RlZmluZSBQTVNHX0FVVE9fU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19BVVRPX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19BVVRPX1JFU1VNRQkJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfQVVUT19SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fUkVTVU1FLCB9KQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKaW5kZXggYmFkZDk4YS4uOGMyNGVmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTQ2LDkgKzQ2LDkgQEAKIH0KIAogc3RydWN0IHBvbGxfdGFibGVfZW50cnkgewotCXN0cnVjdCBmaWxlICogZmlscDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqIHdhaXRfYWRkcmVzczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzOwogfTsKIAogLyoKQEAgLTU2LDcgKzU2LDkgQEAKICAqLwogc3RydWN0IHBvbGxfd3F1ZXVlcyB7CiAJcG9sbF90YWJsZSBwdDsKLQlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICogdGFibGU7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb2xsaW5nX3Rhc2s7CisJaW50IHRyaWdnZXJlZDsKIAlpbnQgZXJyb3I7CiAJaW50IGlubGluZV9pbmRleDsKIAlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSBpbmxpbmVfZW50cmllc1tOX0lOTElORV9QT0xMX0VOVFJJRVNdOwpAQCAtNjQsNiArNjYsMTMgQEAKIAogZXh0ZXJuIHZvaWQgcG9sbF9pbml0d2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOwogZXh0ZXJuIHZvaWQgcG9sbF9mcmVld2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOworZXh0ZXJuIGludCBwb2xsX3NjaGVkdWxlX3RpbWVvdXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxLCBpbnQgc3RhdGUsCisJCQkJIGt0aW1lX3QgKmV4cGlyZXMsIHVuc2lnbmVkIGxvbmcgc2xhY2spOworCitzdGF0aWMgaW5saW5lIGludCBwb2xsX3NjaGVkdWxlKHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSwgaW50IHN0YXRlKQoreworCXJldHVybiBwb2xsX3NjaGVkdWxlX3RpbWVvdXQocHdxLCBzdGF0ZSwgTlVMTCwgMCk7Cit9CiAKIC8qCiAgKiBTY2FsZWFibGUgdmVyc2lvbiBvZiB0aGUgZmRfc2V0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IDExNjhmYmMuLjkyMTM0MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTIwNCwxOCArMjA0LDYgQEAKIAogZXh0ZXJuIHZvaWQgd2FrZW1lX2FmdGVyX3JjdShzdHJ1Y3QgcmN1X2hlYWQgICpoZWFkKTsKIAotI2RlZmluZSBzeW5jaHJvbml6ZV9yY3VfeHh4KG5hbWUsIGZ1bmMpIFwKLXZvaWQgbmFtZSh2b2lkKSBcCi17IFwKLQlzdHJ1Y3QgcmN1X3N5bmNocm9uaXplIHJjdTsgXAotCVwKLQlpbml0X2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsgXAotCS8qIFdpbGwgd2FrZSBtZSBhZnRlciBSQ1UgZmluaXNoZWQuICovIFwKLQlmdW5jKCZyY3UuaGVhZCwgd2FrZW1lX2FmdGVyX3JjdSk7IFwKLQkvKiBXYWl0IGZvciBpdC4gKi8gXAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsgXAotfQotCiAvKioKICAqIHN5bmNocm9uaXplX3NjaGVkIC0gYmxvY2sgdW50aWwgYWxsIENQVXMgaGF2ZSBleGl0ZWQgYW55IG5vbi1wcmVlbXB0aXZlCiAgKiBrZXJuZWwgY29kZSBzZXF1ZW5jZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jpb19kcnYuaCBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCmluZGV4IDMyYzA1NDcuLmM5M2E1OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCisrKyBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCkBAIC0zOTEsNyArMzkxLDYgQEAKICAqIHJpb19nZXRfaW5iX21lc3NhZ2UgLSBHZXQgQSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZQogICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBjb250YWluaW5nIHRoZSBpbmJvdW5kIG1haWxib3gKICAqIEBtYm94OiBUaGUgaW5ib3VuZCBtYWlsYm94IG51bWJlcgotICogQGJ1ZmZlcjogUG9pbnRlciB0byB0aGUgbWVzc2FnZSBidWZmZXIKICAqCiAgKiBHZXQgYSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggODlmMDU2NC4uYjM1YmMwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTYzLDE2ICs2MywxMyBAQAogdm9pZCBhbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIHZvaWQgX19hbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIAotZXh0ZXJuIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiB2b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpOwotCiAvKgogICogcm1hcCBpbnRlcmZhY2VzIGNhbGxlZCB3aGVuIGFkZGluZyBvciByZW1vdmluZyBwdGUgb2YgcGFnZQogICovCiB2b2lkIHBhZ2VfYWRkX2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIHBhZ2VfYWRkX25ld19hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBwYWdlX2FkZF9maWxlX3JtYXAoc3RydWN0IHBhZ2UgKik7Ci12b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwordm9pZCBwYWdlX3JlbW92ZV9ybWFwKHN0cnVjdCBwYWdlICopOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCiB2b2lkIHBhZ2VfZHVwX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDM4YTNmNGIuLjRjYWU5YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTM4Niw2ICszODYsOSBAQAogCQkobW0pLT5oaXdhdGVyX3ZtID0gKG1tKS0+dG90YWxfdm07CVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgZ2V0X21tX2hpd2F0ZXJfcnNzKG1tKQltYXgoKG1tKS0+aGl3YXRlcl9yc3MsIGdldF9tbV9yc3MobW0pKQorI2RlZmluZSBnZXRfbW1faGl3YXRlcl92bShtbSkJbWF4KChtbSktPmhpd2F0ZXJfdm0sIChtbSktPnRvdGFsX3ZtKQorCiBleHRlcm4gdm9pZCBzZXRfZHVtcGFibGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCB2YWx1ZSk7CiBleHRlcm4gaW50IGdldF9kdW1wYWJsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAKQEAgLTkxMiw3ICs5MTUsNiBAQAogCiBleHRlcm4gdm9pZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhpbnQgbmRvbXNfbmV3LCBzdHJ1Y3QgY3B1bWFzayAqZG9tc19uZXcsCiAJCQkJICAgIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHJfbmV3KTsKLWV4dGVybiBpbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAogLyogVGVzdCBhIGZsYWcgaW4gcGFyZW50IHNjaGVkIGRvbWFpbiAqLwogc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZF9wYXJlbnQoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBmbGFnKQpAQCAtMTcwNCwxNiArMTcwNiwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHdha2VfdXBfaWRsZV9jcHUoaW50IGNwdSkgeyB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbGF0ZW5jeTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc19yYXRlbGltaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9zaGFyZXNfdGhyZXNoOworI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2ZlYXR1cmVzOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9ucl9taWdyYXRlOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfc2hhcmVzX3JhdGVsaW1pdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc190aHJlc2g7CiAKIGludCBzY2hlZF9ucl9sYXRlbmN5X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGI5MmI1ZTQuLjFmMmFiNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTQ4LDcgKzQ4LDggQEAKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGFuZCBhcmUgdXNlZAogICogYXMgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzIGZ1bmN0aW9ucwogICovCi1leHRlcm4gaW50IGNhcF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwLCBpbnQgYXVkaXQpOworZXh0ZXJuIGludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCSAgICAgICBpbnQgY2FwLCBpbnQgYXVkaXQpOwogZXh0ZXJuIGludCBjYXBfc2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgdGltZXpvbmUgKnR6KTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV9tYXlfYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGludCBtb2RlKTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV90cmFjZW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KTsKQEAgLTEyNTEsOSArMTI1MiwxMiBAQAogICoJQHBlcm1pdHRlZCBjb250YWlucyB0aGUgcGVybWl0dGVkIGNhcGFiaWxpdHkgc2V0LgogICoJUmV0dXJuIDAgYW5kIHVwZGF0ZSBAbmV3IGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KICAqIEBjYXBhYmxlOgotICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5LgorICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5IGluIHRoZSBpbmRpY2F0ZWQKKyAqCWNyZWRlbnRpYWxzLgogICoJQHRzayBjb250YWlucyB0aGUgdGFza19zdHJ1Y3QgZm9yIHRoZSBwcm9jZXNzLgorICoJQGNyZWQgY29udGFpbnMgdGhlIGNyZWRlbnRpYWxzIHRvIHVzZS4KICAqCUBjYXAgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkgPGluY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oPi4KKyAqCUBhdWRpdDogV2hldGhlciB0byB3cml0ZSBhbiBhdWRpdCBtZXNzYWdlIG9yIG5vdAogICoJUmV0dXJuIDAgaWYgdGhlIGNhcGFiaWxpdHkgaXMgZ3JhbnRlZCBmb3IgQHRzay4KICAqIEBhY2N0OgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHByb2Nlc3MgYWNjb3VudGluZy4gIElmCkBAIC0xMzQ2LDcgKzEzNTAsOCBAQAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICplZmZlY3RpdmUsCiAJCSAgICAgICBjb25zdCBrZXJuZWxfY2FwX3QgKmluaGVyaXRhYmxlLAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICpwZXJtaXR0ZWQpOwotCWludCAoKmNhcGFibGUpIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KTsKKwlpbnQgKCpjYXBhYmxlKSAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJaW50IGNhcCwgaW50IGF1ZGl0KTsKIAlpbnQgKCphY2N0KSAoc3RydWN0IGZpbGUgKmZpbGUpOwogCWludCAoKnN5c2N0bCkgKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogCWludCAoKnF1b3RhY3RsKSAoaW50IGNtZHMsIGludCB0eXBlLCBpbnQgaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTYyOCw4ICsxNjMzLDkgQEAKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqZWZmZWN0aXZlLAogCQkgICAgY29uc3Qga2VybmVsX2NhcF90ICppbmhlcml0YWJsZSwKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqcGVybWl0dGVkKTsKLWludCBzZWN1cml0eV9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKLWludCBzZWN1cml0eV9jYXBhYmxlX25vYXVkaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApOworaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCk7CitpbnQgc2VjdXJpdHlfcmVhbF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCk7CiBpbnQgc2VjdXJpdHlfYWNjdChzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc2VjdXJpdHlfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogaW50IHNlY3VyaXR5X3F1b3RhY3RsKGludCBjbWRzLCBpbnQgdHlwZSwgaW50IGlkLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTE4MjYsMTQgKzE4MzIsMzEgQEAKIAlyZXR1cm4gY2FwX2NhcHNldChuZXcsIG9sZCwgZWZmZWN0aXZlLCBpbmhlcml0YWJsZSwgcGVybWl0dGVkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CisJcmV0dXJuIGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3JlYWxfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLCBTRUNVUklUWV9DQVBfQVVESVQpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3sKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLAorCQkJICAgICAgIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9hY2N0KHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IDI1NjQxZDkuLjFiY2IzNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTIxMyw1ICsyMTMsNiBAQAogI2RlZmluZSBTRVJJT19aSEVOSFVBCTB4MzYKICNkZWZpbmUgU0VSSU9fSU5FWElPCTB4MzcKICNkZWZpbmUgU0VSSU9fVE9VQ0hJVDIxMwkweDM3CisjZGVmaW5lIFNFUklPX1c4MDAxCTB4MzkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAxYTBmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2dwaW8uaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIF9fTElOVVhfU1BJX0dQSU9fSAorI2RlZmluZSBfX0xJTlVYX1NQSV9HUElPX0gKKworLyoKKyAqIEZvciBlYWNoIGJpdGJhbmdlZCBTUEkgYnVzLCBzZXQgdXAgYSBwbGF0Zm9ybV9kZXZpY2Ugbm9kZSB3aXRoOgorICogICAtIG5hbWUgInNwaV9ncGlvIgorICogICAtIGlkIHRoZSBzYW1lIGFzIHRoZSBTUEkgYnVzIG51bWJlciBpdCBpbXBsZW1lbnRzCisgKiAgIC0gZGV2LnBsYXRmb3JtIGRhdGEgcG9pbnRpbmcgdG8gYSBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQorICoKKyAqIE9yLCBzZWUgdGhlIGRyaXZlciBjb2RlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBzcGVlZHVwcyB0aGF0IGFyZQorICogcG9zc2libGUgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBpbmxpbmVkIGFjY2VzcyBmb3IgR1BJT3MgKG5vCisgKiBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIGlzIHVzZWQpLgorICoKKyAqIFVzZSBzcGlfYm9hcmRfaW5mbyB3aXRoIHRoZXNlIGJ1c3NlcyBpbiB0aGUgdXN1YWwgd2F5LCBiZWluZyBzdXJlCisgKiB0aGF0IHRoZSBjb250cm9sbGVyX2RhdGEgYmVpbmcgdGhlIEdQSU8gdXNlZCBmb3IgZWFjaCBkZXZpY2UncworICogY2hpcHNlbGVjdDoKKyAqCisgKglzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIC4uLiBbXSA9IHsKKyAqCS4uLgorICoJCS8vIHRoaXMgc2xhdmUgdXNlcyBHUElPIDQyIGZvciBpdHMgY2hpcHNlbGVjdAorICoJCS5jb250cm9sbGVyX2RhdGEgPSAodm9pZCAqKSA0MiwKKyAqCS4uLgorICoJCS8vIHRoaXMgb25lIHVzZXMgR1BJTyA4NiBmb3IgaXRzIGNoaXBzZWxlY3QKKyAqCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgODYsCisgKgkuLi4KKyAqCX07CisgKgorICogSWYgdGhlIGJpdGJhbmdlZCBidXMgaXMgbGF0ZXIgc3dpdGNoZWQgdG8gYSAibmF0aXZlIiBjb250cm9sbGVyLAorICogdGhhdCBwbGF0Zm9ybV9kZXZpY2UgYW5kIGNvbnRyb2xsZXJfZGF0YSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqLworCisvKioKKyAqIHN0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIC0gcGFyYW1ldGVyIGZvciBiaXRiYW5nZWQgU1BJIG1hc3RlcgorICogQHNjazogbnVtYmVyIG9mIHRoZSBHUElPIHVzZWQgZm9yIGNsb2NrIG91dHB1dAorICogQG1vc2k6IG51bWJlciBvZiB0aGUgR1BJTyB1c2VkIGZvciBNYXN0ZXIgT3V0cHV0LCBTbGF2ZSBJbiAoTU9TSSkgZGF0YQorICogQG1pc286IG51bWJlciBvZiB0aGUgR1BJTyB1c2VkIGZvciBNYXN0ZXIgSW5wdXQsIFNsYXZlIE91dHB1dCAoTUlTTykgZGF0YQorICogQG51bV9jaGlwc2VsZWN0OiBob3cgbWFueSBzbGF2ZXMgdG8gYWxsb3cKKyAqCisgKiBBbGwgR1BJTyBzaWduYWxzIHVzZWQgd2l0aCB0aGUgU1BJIGJ1cyBtYW5hZ2VkIHRocm91Z2ggdGhpcyBkcml2ZXIKKyAqIChjaGlwc2VsZWN0cywgTU9TSSwgTUlTTywgU0NLKSBtdXN0IGJlIGNvbmZpZ3VyZWQgYXMgR1BJT3MsIGluc3RlYWQKKyAqIG9mIHNvbWUgYWx0ZXJuYXRlIGZ1bmN0aW9uLgorICoKKyAqIEl0IGNhbiBiZSBjb252ZW5pZW50IHRvIHVzZSB0aGlzIGRyaXZlciB3aXRoIHBpbnMgdGhhdCBoYXZlIGFsdGVybmF0ZQorICogZnVuY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhICJuYXRpdmUiIFNQSSBjb250cm9sbGVyIGlmIGEgZHJpdmVyIGZvciB0aGF0CisgKiBjb250cm9sbGVyIGlzIG5vdCBhdmFpbGFibGUsIG9yIGlzIG1pc3NpbmcgaW1wb3J0YW50IGZ1bmN0aW9uYWxpdHkuCisgKgorICogT24gcGxhdGZvcm1zIHdoaWNoIGNhbiBkbyBzbywgY29uZmlndXJlIE1JU08gd2l0aCBhIHdlYWsgcHVsbHVwIHVubGVzcworICogdGhlcmUncyBhbiBleHRlcm5hbCBwdWxsdXAgb24gdGhhdCBzaWduYWwuICBUaGF0IHNhdmVzIHBvd2VyIGJ5IGF2b2lkaW5nCisgKiBmbG9hdGluZyBzaWduYWxzLiAgKEEgd2VhayBwdWxsZG93biB3b3VsZCBzYXZlIHBvd2VyIHRvbywgYnV0IG1hbnkKKyAqIGRyaXZlcnMgZXhwZWN0IHRvIHNlZSBhbGwtb25lcyBkYXRhIGFzIHRoZSBubyBzbGF2ZSAicmVzcG9uc2UiLikKKyAqLworc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkCXNjazsKKwl1bnNpZ25lZAltb3NpOworCXVuc2lnbmVkCW1pc287CisKKwl1MTYJCW51bV9jaGlwc2VsZWN0OworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfU1BJX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FiLmggYi9pbmNsdWRlL2xpbnV4L3N3YWIuaAppbmRleCBiYmVkMjc5Li5iZTUyODRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YWIuaApAQCAtOSwxNyArOSwxNyBAQAogICogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCiAgKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KICAqLwotI2RlZmluZSBfX2NvbnN0X3N3YWIxNih4KSAoKF9fdTE2KSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FiMTYoeCkgKChfX3UxNikoCQkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfAkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhYjMyKHgpICgoX191MzIpKAkJCQlcCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIzMih4KSAoKF9fdTMyKSgJCQkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfAkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSkpCiAKLSNkZWZpbmUgX19jb25zdF9zd2FiNjQoeCkgKChfX3U2NCkoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjY0KHgpICgoX191NjQpKAkJCQlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwJXAogCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8CVwKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfAlcCkBAIC0yOSwxMSArMjksMTEgQEAKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfAlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKSkKIAotI2RlZmluZSBfX2NvbnN0X3N3YWh3MzIoeCkgKChfX3UzMikoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhaHczMih4KSAoKF9fdTMyKSgJCQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmZmZVTCkgPDwgMTYpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZmZmMDAwMFVMKSA+PiAxNikpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhaGIzMih4KSAoKF9fdTMyKSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FoYjMyKHgpICgoX191MzIpKAkJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDBmZlVMKSA8PCA4KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMGZmMDBVTCkgPj4gOCkpKQogCkBAIC00Myw1MiArNDMsNTIgQEAKICAqIF9fX3N3YWIxNiwgX19fc3dhYjMyLCBfX19zd2FiNjQsIF9fX3N3YWh3MzIsIF9fX3N3YWhiMzIKICAqLwogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fc3dhYjE2KF9fdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FiMTYKIAlyZXR1cm4gX19hcmNoX3N3YWIxNih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiMTYodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjE2KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWIzMihfX3UzMiB2YWwpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19mc3dhYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhYjMyCiAJcmV0dXJuIF9fYXJjaF9zd2FiMzIodmFsKTsKICNlbHNlCi0JcmV0dXJuIF9fY29uc3Rfc3dhYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWIzMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX19zd2FiNjQoX191NjQgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB2YWwpCiB7CiAjaWZkZWYgX19hcmNoX3N3YWI2NAogCXJldHVybiBfX2FyY2hfc3dhYjY0KHZhbCk7CiAjZWxpZiBkZWZpbmVkKF9fU1dBQl82NF9USFJVXzMyX18pCiAJX191MzIgaCA9IHZhbCA+PiAzMjsKIAlfX3UzMiBsID0gdmFsICYgKCgxVUxMIDw8IDMyKSAtIDEpOwotCXJldHVybiAoKChfX3U2NClfX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fX3N3YWIzMihoKSkpOworCXJldHVybiAoKChfX3U2NClfX2Zzd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fZnN3YWIzMihoKSkpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiNjQodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjY0KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWh3MzIoX191MzIgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fZnN3YWh3MzIoX191MzIgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FodzMyCiAJcmV0dXJuIF9fYXJjaF9zd2FodzMyKHZhbCk7CiAjZWxzZQotCXJldHVybiBfX2NvbnN0X3N3YWh3MzIodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhaHczMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19zd2FoYjMyKF9fdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhaGIzMgogCXJldHVybiBfX2FyY2hfc3dhaGIzMih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FoYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWhiMzIodmFsKTsKICNlbmRpZgogfQogCkBAIC05OCw4ICs5OCw4IEBACiAgKi8KICNkZWZpbmUgX19zd2FiMTYoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MTYpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWIxNigoeCkpIDoJCQlcCi0JX19fc3dhYjE2KCh4KSkpCisJX19fY29uc3RhbnRfc3dhYjE2KHgpIDoJCQlcCisJX19mc3dhYjE2KHgpKQogCiAvKioKICAqIF9fc3dhYjMyIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMDcsOCArMTA3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWIzMih4KQkJCQlcCiAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAotCV9fY29uc3Rfc3dhYjMyKCh4KSkgOgkJCVwKLQlfX19zd2FiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FiMzIoeCkgOgkJCVwKKwlfX2Zzd2FiMzIoeCkpCiAKIC8qKgogICogX19zd2FiNjQgLSByZXR1cm4gYSBieXRlc3dhcHBlZCA2NC1iaXQgdmFsdWUKQEAgLTExNiw4ICsxMTYsOCBAQAogICovCiAjZGVmaW5lIF9fc3dhYjY0KHgpCQkJCVwKIAkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPwlcCi0JX19jb25zdF9zd2FiNjQoKHgpKSA6CQkJXAotCV9fX3N3YWI2NCgoeCkpKQorCV9fX2NvbnN0YW50X3N3YWI2NCh4KSA6CQkJXAorCV9fZnN3YWI2NCh4KSkKIAogLyoqCiAgKiBfX3N3YWh3MzIgLSByZXR1cm4gYSB3b3JkLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMjcsOCArMTI3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWh3MzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWh3MzIoKHgpKSA6CQkJXAotCV9fX3N3YWh3MzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FodzMyKHgpIDoJCVwKKwlfX2Zzd2FodzMyKHgpKQogCiAvKioKICAqIF9fc3dhaGIzMiAtIHJldHVybiBhIGhpZ2ggYW5kIGxvdyBieXRlLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMzgsOCArMTM4LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWhiMzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWhiMzIoKHgpKSA6CQkJXAotCV9fX3N3YWhiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FoYjMyKHgpIDoJCVwKKwlfX2Zzd2FoYjMyKHgpKQogCiAvKioKICAqIF9fc3dhYjE2cCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDE2LWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBhM2FmOTViLi45MWRlZTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTIwLDcgKzEyMCw5IEBACiBlbnVtIHsKIAlTV1BfVVNFRAk9ICgxIDw8IDApLAkvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovCiAJU1dQX1dSSVRFT0sJPSAoMSA8PCAxKSwJLyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwPwkqLwotCVNXUF9BQ1RJVkUJPSAoU1dQX1VTRUQgfCBTV1BfV1JJVEVPSyksCisJU1dQX0RJU0NBUkRBQkxFID0gKDEgPDwgMiksCS8qIGJsa2RldiBzdXBwb3J0cyBkaXNjYXJkICovCisJU1dQX0RJU0NBUkRJTkcJPSAoMSA8PCAzKSwJLyogbm93IGRpc2NhcmRpbmcgYSBmcmVlIGNsdXN0ZXIgKi8KKwlTV1BfU09MSURTVEFURQk9ICgxIDw8IDQpLAkvKiBibGtkZXYgc2Vla3MgYXJlIGNoZWFwICovCiAJCQkJCS8qIGFkZCBvdGhlcnMgaGVyZSBiZWZvcmUuLi4gKi8KIAlTV1BfU0NBTk5JTkcJPSAoMSA8PCA4KSwJLyogcmVmY291bnQgaW4gc2Nhbl9zd2FwX21hcCAqLwogfTsKQEAgLTEzNCwyMiArMTM2LDI0IEBACiAgKiBUaGUgaW4tbWVtb3J5IHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIHN3YXAgYXJlYXMuCiAgKi8KIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcHJpbzsJCQkvKiBzd2FwIHByaW9yaXR5ICovCisJaW50IG5leHQ7CQkJLyogbmV4dCBlbnRyeSBvbiBzd2FwIGxpc3QgKi8KIAlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBleHRlbnRfbGlzdDsKIAlzdHJ1Y3Qgc3dhcF9leHRlbnQgKmN1cnJfc3dhcF9leHRlbnQ7Ci0JdW5zaWduZWQgb2xkX2Jsb2NrX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgKiBzd2FwX21hcDsKKwl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXA7CiAJdW5zaWduZWQgaW50IGxvd2VzdF9iaXQ7CiAJdW5zaWduZWQgaW50IGhpZ2hlc3RfYml0OworCXVuc2lnbmVkIGludCBsb3dlc3RfYWxsb2M7CS8qIHdoaWxlIHByZXBhcmluZyBkaXNjYXJkIGNsdXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaGlnaGVzdF9hbGxvYzsJLyogd2hpbGUgcHJlcGFyaW5nIGRpc2NhcmQgY2x1c3RlciAqLwogCXVuc2lnbmVkIGludCBjbHVzdGVyX25leHQ7CiAJdW5zaWduZWQgaW50IGNsdXN0ZXJfbnI7CiAJdW5zaWduZWQgaW50IHBhZ2VzOwogCXVuc2lnbmVkIGludCBtYXg7CiAJdW5zaWduZWQgaW50IGludXNlX3BhZ2VzOwotCWludCBuZXh0OwkJCS8qIG5leHQgZW50cnkgb24gc3dhcCBsaXN0ICovCisJdW5zaWduZWQgaW50IG9sZF9ibG9ja19zaXplOwogfTsKIAogc3RydWN0IHN3YXBfbGlzdF90IHsKQEAgLTE2Myw3ICsxNjcsNiBAQAogLyogbGludXgvbW0vcGFnZV9hbGxvYy5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRvdGFscmVzZXJ2ZV9wYWdlczsKLWV4dGVybiBsb25nIG5yX3N3YXBfcGFnZXM7CiBleHRlcm4gdW5zaWduZWQgaW50IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcyh2b2lkKTsKIApAQCAtMTc0LDggKzE3Nyw2IEBACiAvKiBsaW51eC9tbS9zd2FwLmMgKi8KIGV4dGVybiB2b2lkIF9fbHJ1X2NhY2hlX2FkZChzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7CiBleHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2xydShzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7Ci1leHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqLAotCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBhY3RpdmF0ZV9wYWdlKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbWFya19wYWdlX2FjY2Vzc2VkKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbHJ1X2FkZF9kcmFpbih2b2lkKTsKQEAgLTI4MCw3ICsyODEsNyBAQAogZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlIHN3YXBwZXJfc3BhY2U7CiAjZGVmaW5lIHRvdGFsX3N3YXBjYWNoZV9wYWdlcyAgc3dhcHBlcl9zcGFjZS5ucnBhZ2VzCiBleHRlcm4gdm9pZCBzaG93X3N3YXBfY2FjaGVfaW5mbyh2b2lkKTsKLWV4dGVybiBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKiwgZ2ZwX3QpOworZXh0ZXJuIGludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiBpbnQgYWRkX3RvX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKiwgc3dwX2VudHJ5X3QsIGdmcF90KTsKIGV4dGVybiB2b2lkIF9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiB2b2lkIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKik7CkBAIC0yOTMsNiArMjk0LDcgQEAKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogCiAvKiBsaW51eC9tbS9zd2FwZmlsZS5jICovCitleHRlcm4gbG9uZyBucl9zd2FwX3BhZ2VzOwogZXh0ZXJuIGxvbmcgdG90YWxfc3dhcF9wYWdlczsKIGV4dGVybiB2b2lkIHNpX3N3YXBpbmZvKHN0cnVjdCBzeXNpbmZvICopOwogZXh0ZXJuIHN3cF9lbnRyeV90IGdldF9zd2FwX3BhZ2Uodm9pZCk7CkBAIC0zMDAsMTUgKzMwMiwxNCBAQAogZXh0ZXJuIGludCBzd2FwX2R1cGxpY2F0ZShzd3BfZW50cnlfdCk7CiBleHRlcm4gaW50IHZhbGlkX3N3YXBoYW5kbGVzKHN3cF9lbnRyeV90LCB1bnNpZ25lZCBsb25nICopOwogZXh0ZXJuIHZvaWQgc3dhcF9mcmVlKHN3cF9lbnRyeV90KTsKLWV4dGVybiB2b2lkIGZyZWVfc3dhcF9hbmRfY2FjaGUoc3dwX2VudHJ5X3QpOworZXh0ZXJuIGludCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90KTsKIGV4dGVybiBpbnQgc3dhcF90eXBlX29mKGRldl90LCBzZWN0b3JfdCwgc3RydWN0IGJsb2NrX2RldmljZSAqKik7CiBleHRlcm4gdW5zaWduZWQgaW50IGNvdW50X3N3YXBfcGFnZXMoaW50LCBpbnQpOwogZXh0ZXJuIHNlY3Rvcl90IG1hcF9zd2FwX3BhZ2Uoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiwgcGdvZmZfdCk7CiBleHRlcm4gc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQsIHBnb2ZmX3QpOwogZXh0ZXJuIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpnZXRfc3dhcF9pbmZvX3N0cnVjdCh1bnNpZ25lZCk7Ci1leHRlcm4gaW50IGNhbl9zaGFyZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKik7Ci1leHRlcm4gaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICopOwotZXh0ZXJuIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYoc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IHJldXNlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgdHJ5X3RvX2ZyZWVfc3dhcChzdHJ1Y3QgcGFnZSAqKTsKIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvOwogCiAvKiBsaW51eC9tbS90aHJhc2guYyAqLwpAQCAtMzM0LDcgKzMzNSw4IEBACiAKICNlbHNlIC8qIENPTkZJR19TV0FQICovCiAKLSNkZWZpbmUgdG90YWxfc3dhcF9wYWdlcwkJCTAKKyNkZWZpbmUgbnJfc3dhcF9wYWdlcwkJCQkwTAorI2RlZmluZSB0b3RhbF9zd2FwX3BhZ2VzCQkJMEwKICNkZWZpbmUgdG90YWxfc3dhcGNhY2hlX3BhZ2VzCQkJMFVMCiAKICNkZWZpbmUgc2lfc3dhcGluZm8odmFsKSBcCkBAIC0zNTAsMTQgKzM1Miw4IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90IHN3cCkKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3dhcF9kdXBsaWNhdGUoc3dwX2VudHJ5X3Qgc3dwKQotewotCXJldHVybiAwOwotfQorI2RlZmluZSBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cCkJaXNfbWlncmF0aW9uX2VudHJ5KHN3cCkKKyNkZWZpbmUgc3dhcF9kdXBsaWNhdGUoc3dwKQkJaXNfbWlncmF0aW9uX2VudHJ5KHN3cCkKIAogc3RhdGljIGlubGluZSB2b2lkIHN3YXBfZnJlZShzd3BfZW50cnlfdCBzd3ApCiB7CkBAIC0zNzQsNyArMzcwLDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLSNkZWZpbmUgY2FuX3NoYXJlX3N3YXBfcGFnZShwKQkJCShwYWdlX21hcGNvdW50KHApID09IDEpCitzdGF0aWMgaW5saW5lIGludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGlubGluZSBpbnQgYWRkX3RvX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN3cF9lbnRyeV90IGVudHJ5LAogCQkJCQkJCWdmcF90IGdmcF9tYXNrKQpAQCAtMzkwLDE0ICszODksOSBAQAogewogfQogCi0jZGVmaW5lIHN3YXBfdG9rZW5fZGVmYXVsdF90aW1lb3V0CQkwCisjZGVmaW5lIHJldXNlX3N3YXBfcGFnZShwYWdlKQkocGFnZV9tYXBjb3VudChwYWdlKSA9PSAxKQogCi1zdGF0aWMgaW5saW5lIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqcCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSBpbnQgdHJ5X3RvX2ZyZWVfc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKaW5kZXggMzI1YWYxZC4uZGVkZDNjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2lvdGxiLmgKQEAgLTI3LDcgKzI3LDggQEAKIGV4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBsb25nIG5zbGFicyk7CiBleHRlcm4gdm9pZCAqc3dpb3RsYl9hbGxvYyh1bnNpZ25lZCBvcmRlciwgdW5zaWduZWQgbG9uZyBuc2xhYnMpOwogCi1leHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHBoeXNfYWRkcl90IGFkZHJlc3MpOworZXh0ZXJuIGRtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2J1cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQkgICAgICBwaHlzX2FkZHJfdCBhZGRyZXNzKTsKIGV4dGVybiBwaHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKGRtYV9hZGRyX3QgYWRkcmVzcyk7CiAKIGV4dGVybiBpbnQgc3dpb3RsYl9hcmNoX3JhbmdlX25lZWRzX21hcHBpbmcodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGNlMzIxYWMuLmZiYmQyYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIGV4dGVybiBpbnQgdXBkYXRlX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjIG5vdyk7CiBleHRlcm4gaW50IG5vX3N5bmNfY21vc19jbG9jayBfX3JlYWRfbW9zdGx5Owogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOworZXh0ZXJuIGludCB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCk7CiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvdHlwZXMuaAppbmRleCAxMjFmMzQ5Li4zYjg2NGYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0xOTUsNiArMTk1LDE2IEBACiAKIHR5cGVkZWYgcGh5c19hZGRyX3QgcmVzb3VyY2Vfc2l6ZV90OwogCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgaW50IGNvdW50ZXI7Cit9IGF0b21pY190OworCisjaWZkZWYgQ09ORklHXzY0QklUCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgbG9uZyBjb3VudGVyOworfSBhdG9taWM2NF90OworI2VuZGlmCisKIHN0cnVjdCB1c3RhdCB7CiAJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOwogCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKaW5kZXggY2RmMzM4ZC4uYTBiYjZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKQEAgLTM4LDYgKzM4LDI0IEBACiAKICNkZWZpbmUgTUFYX1VJT19NQVBTCTUKIAorc3RydWN0IHVpb19wb3J0aW87CisKKy8qKgorICogc3RydWN0IHVpb19wb3J0IC0gZGVzY3JpcHRpb24gb2YgYSBVSU8gcG9ydCByZWdpb24KKyAqIEBzdGFydDoJCXN0YXJ0IG9mIHBvcnQgcmVnaW9uCisgKiBAc2l6ZToJCXNpemUgb2YgcG9ydCByZWdpb24KKyAqIEBwb3J0dHlwZToJCXR5cGUgb2YgcG9ydCAoc2VlIFVJT19QT1JUXyogYmVsb3cpCisgKiBAcG9ydGlvOgkJZm9yIHVzZSBieSB0aGUgVUlPIGNvcmUgb25seS4KKyAqLworc3RydWN0IHVpb19wb3J0IHsKKwl1bnNpZ25lZCBsb25nCQlzdGFydDsKKwl1bnNpZ25lZCBsb25nCQlzaXplOworCWludAkJCXBvcnR0eXBlOworCXN0cnVjdCB1aW9fcG9ydGlvCSpwb3J0aW87Cit9OworCisjZGVmaW5lIE1BWF9VSU9fUE9SVF9SRUdJT05TCTUKKwogc3RydWN0IHVpb19kZXZpY2U7CiAKIC8qKgpAQCAtNDYsNiArNjQsNyBAQAogICogQG5hbWU6CQlkZXZpY2UgbmFtZQogICogQHZlcnNpb246CQlkZXZpY2UgZHJpdmVyIHZlcnNpb24KICAqIEBtZW06CQlsaXN0IG9mIG1hcHBhYmxlIG1lbW9yeSByZWdpb25zLCBzaXplPT0wIGZvciBlbmQgb2YgbGlzdAorICogQHBvcnQ6CQlsaXN0IG9mIHBvcnQgcmVnaW9ucywgc2l6ZT09MCBmb3IgZW5kIG9mIGxpc3QKICAqIEBpcnE6CQlpbnRlcnJ1cHQgbnVtYmVyIG9yIFVJT19JUlFfQ1VTVE9NCiAgKiBAaXJxX2ZsYWdzOgkJZmxhZ3MgZm9yIHJlcXVlc3RfaXJxKCkKICAqIEBwcml2OgkJb3B0aW9uYWwgcHJpdmF0ZSBkYXRhCkBAIC01Nyw5ICs3NiwxMCBAQAogICovCiBzdHJ1Y3QgdWlvX2luZm8gewogCXN0cnVjdCB1aW9fZGV2aWNlCSp1aW9fZGV2OwotCWNoYXIJCQkqbmFtZTsKLQljaGFyCQkJKnZlcnNpb247CisJY29uc3QgY2hhcgkJKm5hbWU7CisJY29uc3QgY2hhcgkJKnZlcnNpb247CiAJc3RydWN0IHVpb19tZW0JCW1lbVtNQVhfVUlPX01BUFNdOworCXN0cnVjdCB1aW9fcG9ydAkJcG9ydFtNQVhfVUlPX1BPUlRfUkVHSU9OU107CiAJbG9uZwkJCWlycTsKIAl1bnNpZ25lZCBsb25nCQlpcnFfZmxhZ3M7CiAJdm9pZAkJCSpwcml2OwpAQCAtOTIsNCArMTEyLDEwIEBACiAjZGVmaW5lIFVJT19NRU1fTE9HSUNBTAkyCiAjZGVmaW5lIFVJT19NRU1fVklSVFVBTCAzCiAKKy8qIGRlZmluZXMgZm9yIHVpb19wb3J0LT5wb3J0dHlwZSAqLworI2RlZmluZSBVSU9fUE9SVF9OT05FCTAKKyNkZWZpbmUgVUlPX1BPUlRfWDg2CTEKKyNkZWZpbmUgVUlPX1BPUlRfR1BJTwkyCisjZGVmaW5lIFVJT19QT1JUX09USEVSCTMKKwogI2VuZGlmIC8qIF9MSU5VWF9VSU9fRFJJVkVSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oIGIvaW5jbHVkZS9saW51eC91bndpbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MDg2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfVU5XSU5EX0gKLSNkZWZpbmUgX0xJTlVYX1VOV0lORF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBOb3ZlbGwsIEluYy4KLSAqCUphbiBCZXVsaWNoIDxqYmV1bGljaEBub3ZlbGwuY29tPgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdQTC4KLSAqCi0gKiBBIHNpbXBsZSBBUEkgZm9yIHVud2luZGluZyBrZXJuZWwgc3RhY2tzLiAgVGhpcyBpcyB1c2VkIGZvcgotICogZGVidWdnaW5nIGFuZCBlcnJvciByZXBvcnRpbmcgcHVycG9zZXMuICBUaGUga2VybmVsIGRvZXNuJ3QgbmVlZAotICogZnVsbC1ibG93biBzdGFjayB1bndpbmRpbmcgd2l0aCBhbGwgdGhlIGJlbGxzIGFuZCB3aGlzdGxlcywgc28gdGhlcmUKLSAqIGlzIG5vdCBtdWNoIHBvaW50IGluIGltcGxlbWVudGluZyB0aGUgZnVsbCBEd2FyZjIgdW53aW5kIEFQSS4KLSAqLwotCi1zdHJ1Y3QgbW9kdWxlOwotCi1zdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8ge307Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfaW5pdCh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9zZXR1cCh2b2lkKSB7fQotCi0jaWZkZWYgQ09ORklHX01PRFVMRVMKLQotc3RhdGljIGlubGluZSB2b2lkICp1bndpbmRfYWRkX3RhYmxlKHN0cnVjdCBtb2R1bGUgKm1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0YWJsZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfcmVtb3ZlX3RhYmxlKHZvaWQgKmhhbmRsZSwgaW50IGluaXRfb25seSkKLXsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2Jsb2NrZWQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdW53aW5kX2luaXRfcnVubmluZyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbWxpbmthZ2UgaW50ICgqY2IpKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF90b191c2VyKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotI2VuZGlmIC8qIF9MSU5VWF9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCAzMDdiODg1Li41MDZlNzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtOTcsNiArOTcsMTAgQEAKIGV4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICphbGxvY192bV9hcmVhKHNpemVfdCBzaXplKTsKIGV4dGVybiB2b2lkIGZyZWVfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKTsKIAorLyogZm9yIC9kZXYva21lbSAqLworZXh0ZXJuIGxvbmcgdnJlYWQoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIHZ3cml0ZShjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworCiAvKgogICoJSW50ZXJuYWxzLiAgRG9udCd0IHVzZS4uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IGU1ODU2NTcuLjczMDBlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMzAsNyArMzAsNiBAQAogZW51bSB3cml0ZWJhY2tfc3luY19tb2RlcyB7CiAJV0JfU1lOQ19OT05FLAkvKiBEb24ndCB3YWl0IG9uIGFueXRoaW5nICovCiAJV0JfU1lOQ19BTEwsCS8qIFdhaXQgb24gZXZlcnkgbWFwcGluZyAqLwotCVdCX1NZTkNfSE9MRCwJLyogSG9sZCB0aGUgaW5vZGUgb24gc2JfZGlydHkgZm9yIHN5c19zeW5jKCkgKi8KIH07CiAKIC8qCkBAIC0xMDcsNyArMTA2LDkgQEAKIAogLyogVGhlc2UgYXJlIGV4cG9ydGVkIHRvIHN5c2N0bC4gKi8KIGV4dGVybiBpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpbzsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRpcnR5X2JhY2tncm91bmRfYnl0ZXM7CiBleHRlcm4gaW50IHZtX2RpcnR5X3JhdGlvOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1fZGlydHlfYnl0ZXM7CiBleHRlcm4gaW50IGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbDsKIGV4dGVybiBpbnQgZGlydHlfZXhwaXJlX2ludGVydmFsOwogZXh0ZXJuIGludCB2bV9oaWdobWVtX2lzX2RpcnR5YWJsZTsKQEAgLTExNiwxNyArMTE3LDI2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KHZvaWQpOwogCitleHRlcm4gaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKTsKIGV4dGVybiBpbnQgZGlydHlfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcyk7CiAKIHN0cnVjdCBjdGxfdGFibGU7CiBzdHJ1Y3QgZmlsZTsKIGludCBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCiAJCQkJICAgICAgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAotdm9pZCBnZXRfZGlydHlfbGltaXRzKGxvbmcgKnBiYWNrZ3JvdW5kLCBsb25nICpwZGlydHksIGxvbmcgKnBiZGlfZGlydHksCi0JCSBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKK3ZvaWQgZ2V0X2RpcnR5X2xpbWl0cyh1bnNpZ25lZCBsb25nICpwYmFja2dyb3VuZCwgdW5zaWduZWQgbG9uZyAqcGRpcnR5LAorCQkgICAgICB1bnNpZ25lZCBsb25nICpwYmRpX2RpcnR5LCBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKIAogdm9pZCBwYWdlX3dyaXRlYmFja19pbml0KHZvaWQpOwogdm9pZCBiYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCmluZGV4IDk5MDk3NzQuLmJlZGM3ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKQEAgLTEzMSw3ICsxMzEsOCBAQAogICovCiAKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKLWludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpOworaW50IGNpcHNvX3Y0X2RvaV9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIHZvaWQgY2lwc29fdjRfZG9pX2ZyZWUoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZik7CiBpbnQgY2lwc29fdjRfZG9pX3JlbW92ZSh1MzIgZG9pLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIHN0cnVjdCBjaXBzb192NF9kb2kgKmNpcHNvX3Y0X2RvaV9nZXRkZWYodTMyIGRvaSk7CkBAIC0xNDAsNyArMTQxLDggQEAKIAkJICAgICBpbnQgKCpjYWxsYmFjaykgKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsIHZvaWQgKmFyZyksCiAJICAgICAgICAgICAgIHZvaWQgKmNiX2FyZyk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKQorc3RhdGljIGlubGluZSBpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oIGIvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAppbmRleCAxN2M0NDJhLi43NDkwMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTM1MywxMyArMzU1LDM3IEBACiAvKgogICogTFNNIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9ucwogICovCi1pbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ191bmxibF9hZGRfbWFwKGNvbnN0IGNoYXIgKmRvbWFpbiwKK2ludCBuZXRsYmxfY2ZnX21hcF9kZWwoY29uc3QgY2hhciAqZG9tYWluLAorCQkgICAgICAgdTE2IGZhbWlseSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCSAgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgdTE2IGZhbWlseSwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCSAgICAgY29uc3Qgdm9pZCAqbWFzaywKIAkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7Ci1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXUzMiBzZWNpZCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwordm9pZCBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKHUzMiBkb2ksCiAJCQkgICAgICAgY29uc3QgY2hhciAqZG9tYWluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwotCiAvKgogICogTFNNIHNlY3VyaXR5IGF0dHJpYnV0ZSBvcGVyYXRpb25zCiAgKi8KQEAgLTQwMSwxOSArNDI3LDYyIEBACiB2b2lkIG5ldGxibF9jYWNoZV9pbnZhbGlkYXRlKHZvaWQpOwogaW50IG5ldGxibF9jYWNoZV9hZGQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKKworLyoKKyAqIFByb3RvY29sIGVuZ2luZSBvcGVyYXRpb25zCisgKi8KK3N0cnVjdCBhdWRpdF9idWZmZXIgKm5ldGxibF9hdWRpdF9zdGFydChpbnQgdHlwZSwKKwkJCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkgICAgIHUxNiBmYW1pbHksCisJCQkJICAgICBjb25zdCB2b2lkICphZGRyLAorCQkJCSAgICAgY29uc3Qgdm9pZCAqbWFzaywKIAkJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAoY29uc3QgY2hhciAqZG9tYWluLAorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkJICAgdTE2IGZhbWlseSwKKwkJCQkJICAgdm9pZCAqYWRkciwKKwkJCQkJICAgdm9pZCAqbWFzaywKIAkJCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCQkJICAgICAgY29uc3Qgdm9pZCAqbWFzaywKKwkJCQkJICAgICAgdTE2IGZhbWlseSwKKwkJCQkJICAgICAgdTMyIHNlY2lkLAorCQkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfZGVsKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKm1hc2ssCisJCQkJCSAgICAgIHUxNiBmYW1pbHksCisJCQkJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJCSBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSB2b2lkIG5ldGxibF9jZmdfY2lwc292NF9kZWwodTMyIGRvaSwKKwkJCQkJICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKHUzMiBkb2ksCiAJCQkJCSAgICAgY29uc3QgY2hhciAqZG9tYWluLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CkBAIC00OTUsNiArNTY0LDExIEBACiB7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpdF9idWZmZXIgKm5ldGxibF9hdWRpdF9zdGFydChpbnQgdHlwZSwKKwkJCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIE5VTEw7Cit9CiAjZW5kaWYgLyogQ09ORklHX05FVExBQkVMICovCiAKICNlbmRpZiAvKiBfTkVUTEFCRUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCmluZGV4IDdlZTJmNzAuLjRhZjEwODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKQEAgLTg1LDYgKzg1LDEwIEBACiAjZGVmaW5lIFNORF9TT0NfREFQTV9NVVgod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzKSBcCiB7CS5pZCA9IHNuZF9zb2NfZGFwbV9tdXgsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKIAkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSAxfQorI2RlZmluZSBTTkRfU09DX0RBUE1fVkFMVUVfTVVYKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4LCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgXAorCS5zaGlmdCA9IHdzaGlmdCwgLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIFwKKwkubnVtX2tjb250cm9scyA9IDF9CiAKIC8qIHBhdGggZG9tYWluIHdpdGggZXZlbnQgLSBldmVudCBoYW5kbGVyIG11c3QgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MgKi8KICNkZWZpbmUgU05EX1NPQ19EQVBNX1BHQV9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXApAQCAtMTcyLDYgKzE3NiwxMiBAQAogIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgXAogIAkucHV0ID0gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZSwgXAogICAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorI2RlZmluZSBTT0NfREFQTV9WQUxVRV9FTlVNKHhuYW1lLCB4ZW51bSkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLmdldCA9IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUsIFwKKwkucHV0ID0gc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KIAogLyogZGFwbSBzdHJlYW0gb3BlcmF0aW9ucyAqLwogI2RlZmluZSBTTkRfU09DX0RBUE1fU1RSRUFNX05PUAkJCTB4MApAQCAtMjE0LDYgKzIyNCwxMCBAQAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQpOwogaW50IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLApAQCAtMjQ3LDYgKzI2MSw3IEBACiAJc25kX3NvY19kYXBtX2lucHV0ID0gMCwJCS8qIGlucHV0IHBpbiAqLwogCXNuZF9zb2NfZGFwbV9vdXRwdXQsCQkvKiBvdXRwdXQgcGluICovCiAJc25kX3NvY19kYXBtX211eCwJCQkvKiBzZWxlY3RzIDEgYW5hbG9nIHNpZ25hbCBmcm9tIG1hbnkgaW5wdXRzICovCisJc25kX3NvY19kYXBtX3ZhbHVlX211eCwJCQkvKiBzZWxlY3RzIDEgYW5hbG9nIHNpZ25hbCBmcm9tIG1hbnkgaW5wdXRzICovCiAJc25kX3NvY19kYXBtX21peGVyLAkJCS8qIG1peGVzIHNldmVyYWwgYW5hbG9nIHNpZ25hbHMgdG9nZXRoZXIgKi8KIAlzbmRfc29jX2RhcG1fcGdhLAkJCS8qIHByb2dyYW1tYWJsZSBnYWluL2F0dGVudWF0aW9uICh2b2x1bWUpICovCiAJc25kX3NvY19kYXBtX2FkYywJCQkvKiBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLmggYi9pbmNsdWRlL3NvdW5kL3NvYy5oCmluZGV4IGY4NmU0NTUuLjliOTMwZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtOTQsMTEgKzk0LDIyIEBACiAJU09DX0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWF4LCB4dGV4dHMpCiAjZGVmaW5lIFNPQ19FTlVNX1NJTkdMRV9FWFQoeG1heCwgeHRleHRzKSBcCiB7CS5tYXggPSB4bWF4LCAudGV4dHMgPSB4dGV4dHMgfQorI2RlZmluZSBTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0X2wsIHhzaGlmdF9yLCB4bWFzaywgeG1heCwgeHRleHRzLCB4dmFsdWVzKSBcCit7CS5yZWcgPSB4cmVnLCAuc2hpZnRfbCA9IHhzaGlmdF9sLCAuc2hpZnRfciA9IHhzaGlmdF9yLCBcCisJLm1hc2sgPSB4bWFzaywgLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0cywgLnZhbHVlcyA9IHh2YWx1ZXN9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhtYXNrLCB4bWF4LCB4dGV4dHMsIHh2YWx1ZXMpIFwKKwlTT0NfVkFMVUVfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXNrLCB4bWF4LCB4dGV4dHMsIHh2YWx1ZXMpCiAjZGVmaW5lIFNPQ19FTlVNKHhuYW1lLCB4ZW51bSkgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSxcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fZW51bV9kb3VibGUsIFwKIAkuZ2V0ID0gc25kX3NvY19nZXRfZW51bV9kb3VibGUsIC5wdXQgPSBzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSwgXAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU0oeG5hbWUsIHhlbnVtKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5nZXQgPSBzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5wdXQgPSBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KICNkZWZpbmUgU09DX1NJTkdMRV9FWFQoeG5hbWUsIHhyZWcsIHhzaGlmdCwgeG1heCwgeGludmVydCxcCiAJIHhoYW5kbGVyX2dldCwgeGhhbmRsZXJfcHV0KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCkBAIC0yMDAsNiArMjExLDEyIEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK2ludCBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitpbnQgc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIGludCBzbmRfc29jX2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CiBpbnQgc25kX3NvY19pbmZvX3ZvbHN3X2V4dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKQEAgLTQwNiw2ICs0MjMsMTkgQEAKIAl2b2lkICpkYXBtOwogfTsKIAorLyogc2VtaSBlbnVtZXJhdGVkIGtjb250cm9sICovCitzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0geworCXVuc2lnbmVkIHNob3J0IHJlZzsKKwl1bnNpZ25lZCBzaG9ydCByZWcyOworCXVuc2lnbmVkIGNoYXIgc2hpZnRfbDsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0X3I7CisJdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwljb25zdCBjaGFyICoqdGV4dHM7CisJY29uc3QgdW5zaWduZWQgaW50ICp2YWx1ZXM7CisJdm9pZCAqZGFwbTsKK307CisKICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDUyODQ3ZWUuLmU3ODkzYjEgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTQyMywyNyArNDIzLDM3IEBACiAJYm9vbAogCiBjb25maWcgU1lTRlNfREVQUkVDQVRFRF9WMgotCWJvb2wgIkNyZWF0ZSBkZXByZWNhdGVkIHN5c2ZzIGZpbGVzIgorCWJvb2wgIkNyZWF0ZSBkZXByZWNhdGVkIHN5c2ZzIGxheW91dCBmb3Igb2xkZXIgdXNlcnNwYWNlIHRvb2xzIgogCWRlcGVuZHMgb24gU1lTRlMKIAlkZWZhdWx0IHkKIAlzZWxlY3QgU1lTRlNfREVQUkVDQVRFRAogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGNyZWF0ZXMgZGVwcmVjYXRlZCBzeW1saW5rcyBzdWNoIGFzIHRoZQotCSAgImRldmljZSItbGluaywgdGhlIDxzdWJzeXN0ZW0+OjxuYW1lPi1saW5rLCBhbmQgdGhlCi0JICAiYnVzIi1saW5rLiBJdCBtYXkgYWxzbyBhZGQgZGVwcmVjYXRlZCBrZXkgaW4gdGhlCi0JICB1ZXZlbnQgZW52aXJvbm1lbnQuCi0JICBOb25lIG9mIHRoZXNlIGZlYXR1cmVzIG9yIHZhbHVlcyBzaG91bGQgYmUgdXNlZCB0b2RheSwgYXMKLQkgIHRoZXkgZXhwb3J0IGRyaXZlciBjb3JlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdXNlcnNwYWNlCi0JICBvciBleHBvcnQgcHJvcGVydGllcyB3aGljaCBjYW4ndCBiZSBrZXB0IHN0YWJsZSBhY3Jvc3Mga2VybmVsCi0JICByZWxlYXNlcy4KKwkgIFRoaXMgb3B0aW9uIHN3aXRjaGVzIHRoZSBsYXlvdXQgb2Ygc3lzZnMgdG8gdGhlIGRlcHJlY2F0ZWQKKwkgIHZlcnNpb24uCiAKLQkgIElmIGVuYWJsZWQsIHRoaXMgb3B0aW9uIHdpbGwgYWxzbyBtb3ZlIGFueSBkZXZpY2Ugc3RydWN0dXJlcwotCSAgdGhhdCBiZWxvbmcgdG8gYSBjbGFzcywgYmFjayBpbnRvIHRoZSAvc3lzL2NsYXNzIGhpZXJhcmNoeSwgaW4KLQkgIG9yZGVyIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMgb2YgdWRldiBhbmQgc29tZSB1c2Vyc3BhY2UKLQkgIHByb2dyYW1zLgorCSAgVGhlIGN1cnJlbnQgc3lzZnMgbGF5b3V0IGZlYXR1cmVzIGEgdW5pZmllZCBkZXZpY2UgdHJlZSBhdAorCSAgL3N5cy9kZXZpY2VzLywgd2hpY2ggaXMgYWJsZSB0byBleHByZXNzIGEgaGllcmFyY2h5IGJldHdlZW4KKwkgIGNsYXNzIGRldmljZXMuIElmIHRoZSBkZXByZWNhdGVkIG9wdGlvbiBpcyBzZXQgdG8gWSwgdGhlCisJICB1bmlmaWVkIGRldmljZSB0cmVlIGlzIHNwbGl0IGludG8gYSBidXMgZGV2aWNlIHRyZWUgYXQKKwkgIC9zeXMvZGV2aWNlcy8gYW5kIHNldmVyYWwgaW5kaXZpZHVhbCBjbGFzcyBkZXZpY2UgdHJlZXMgYXQKKwkgIC9zeXMvY2xhc3MvLiBUaGUgY2xhc3MgYW5kIGJ1cyBkZXZpY2VzIHdpbGwgYmUgY29ubmVjdGVkIGJ5CisJICAiPHN1YnN5c3RlbT46PG5hbWU+IiBhbmQgdGhlICJkZXZpY2UiIGxpbmtzLiBUaGUgImJsb2NrIgorCSAgY2xhc3MgZGV2aWNlcywgd2lsbCBub3Qgc2hvdyB1cCBpbiAvc3lzL2NsYXNzL2Jsb2NrLy4gU29tZQorCSAgc3Vic3lzdGVtcyB3aWxsIHN1cHByZXNzIHRoZSBjcmVhdGlvbiBvZiBzb21lIGRldmljZXMgd2hpY2gKKwkgIGRlcGVuZCBvbiB0aGUgdW5pZmllZCBkZXZpY2UgdHJlZS4KIAotCSAgSWYgeW91IGFyZSB1c2luZyBhIGRpc3RybyB3aXRoIHRoZSBtb3N0IHJlY2VudCB1c2Vyc3BhY2UKLQkgIHBhY2thZ2VzLCBpdCBzaG91bGQgYmUgc2FmZSB0byBzYXkgTiBoZXJlLgorCSAgVGhpcyBvcHRpb24gaXMgbm90IGEgcHVyZSBjb21wYXRpYmlsaXR5IG9wdGlvbiB0aGF0IGNhbgorCSAgYmUgc2FmZWx5IGVuYWJsZWQgb24gbmV3ZXIgZGlzdHJpYnV0aW9ucy4gSXQgd2lsbCBjaGFuZ2UgdGhlCisJICBsYXlvdXQgb2Ygc3lzZnMgdG8gdGhlIG5vbi1leHRlbnNpYmxlIGRlcHJlY2F0ZWQgdmVyc2lvbiwKKwkgIGFuZCBkaXNhYmxlIHNvbWUgZmVhdHVyZXMsIHdoaWNoIGNhbiBub3QgYmUgZXhwb3J0ZWQgd2l0aG91dAorCSAgY29uZnVzaW5nIG9sZGVyIHVzZXJzcGFjZSB0b29scy4gU2luY2UgMjAwNy8yMDA4IGFsbCBtYWpvcgorCSAgZGlzdHJpYnV0aW9ucyBkbyBub3QgZW5hYmxlIHRoaXMgb3B0aW9uLCBhbmQgc2hpcCBubyB0b29scyB3aGljaAorCSAgZGVwZW5kIG9uIHRoZSBkZXByZWNhdGVkIGxheW91dCBvciB0aGlzIG9wdGlvbi4KKworCSAgSWYgeW91IGFyZSB1c2luZyBhIG5ldyBrZXJuZWwgb24gYW4gb2xkZXIgZGlzdHJpYnV0aW9uLCBvciB1c2UKKwkgIG9sZGVyIHVzZXJzcGFjZSB0b29scywgeW91IG1pZ2h0IG5lZWQgdG8gc2F5IFkgaGVyZS4gRG8gbm90IHNheSBZLAorCSAgaWYgdGhlIG9yaWdpbmFsIGtlcm5lbCwgdGhhdCBjYW1lIHdpdGggeW91ciBkaXN0cmlidXRpb24sIGhhcworCSAgdGhpcyBvcHRpb24gc2V0IHRvIE4uCiAKIGNvbmZpZyBQUk9DX1BJRF9DUFVTRVQKIAlib29sICJJbmNsdWRlIGxlZ2FjeSAvcHJvYy88cGlkPi9jcHVzZXQgZmlsZSIKQEAgLTgzOCwxMCArODQ4LDYgQEAKIAlib29sZWFuCiAJc2VsZWN0IFBMSVNUCiAKLWNvbmZpZyBUSU5ZX1NITUVNCi0JZGVmYXVsdCAhU0hNRU0KLQlib29sCi0KIGNvbmZpZyBCQVNFX1NNQUxMCiAJaW50CiAJZGVmYXVsdCAwIGlmIEJBU0VfRlVMTApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggZDA1NWIxOS4uNWVmY2E3MyAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0yMjAsMTAgKzIyMCwxMCBAQAogCiAJc3lzX2NoZGlyKCIvcm9vdCIpOwogCVJPT1RfREVWID0gY3VycmVudC0+ZnMtPnB3ZC5tbnQtPm1udF9zYi0+c19kZXY7Ci0JcHJpbnRrKCJWRlM6IE1vdW50ZWQgcm9vdCAoJXMgZmlsZXN5c3RlbSklcy5cbiIsCisJcHJpbnRrKCJWRlM6IE1vdW50ZWQgcm9vdCAoJXMgZmlsZXN5c3RlbSklcyBvbiBkZXZpY2UgJXU6JXUuXG4iLAogCSAgICAgICBjdXJyZW50LT5mcy0+cHdkLm1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWUsCiAJICAgICAgIGN1cnJlbnQtPmZzLT5wd2QubW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkgPwotCSAgICAgICAiIHJlYWRvbmx5IiA6ICIiKTsKKwkgICAgICAgIiByZWFkb25seSIgOiAiIiwgTUFKT1IoUk9PVF9ERVYpLCBNSU5PUihST09UX0RFVikpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19tZC5jIGIvaW5pdC9kb19tb3VudHNfbWQuYwppbmRleCBkNmRhNWNkLi5mZjk1ZTMxIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50c19tZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX21kLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogX19zZXR1cCgicmFpZD0iLCByYWlkX3NldHVwKTsKIF9fc2V0dXAoIm1kPSIsIG1kX3NldHVwKTsKIAotc3RhdGljIHZvaWQgYXV0b2RldGVjdF9yYWlkKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYXV0b2RldGVjdF9yYWlkKHZvaWQpCiB7CiAJaW50IGZkOwogCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGNkMTY4ZWIuLmI1YTg5MmMgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgotI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgpAQCAtMTA4LDcgKzEwNyw3IEBACiAKIGV4dGVybiB2b2lkIHRpbWVfaW5pdCh2b2lkKTsKIC8qIERlZmF1bHQgbGF0ZSB0aW1lIGluaXQgaXMgTlVMTC4gYXJjaHMgY2FuIG92ZXJyaWRlIHRoaXMgbGF0ZXIuICovCi12b2lkICgqbGF0ZV90aW1lX2luaXQpKHZvaWQpOwordm9pZCAoKl9faW5pdGRhdGEgbGF0ZV90aW1lX2luaXQpKHZvaWQpOwogZXh0ZXJuIHZvaWQgc29mdGlycV9pbml0KHZvaWQpOwogCiAvKiBVbnRvdWNoZWQgY29tbWFuZCBsaW5lIHNhdmVkIGJ5IGFyY2gtc3BlY2lmaWMgY29kZS4gKi8KQEAgLTQ0Nyw3ICs0NDYsNyBAQAogICogZ2NjLTMuNCBhY2NpZGVudGFsbHkgaW5saW5lcyB0aGlzIGZ1bmN0aW9uLCBzbyB1c2Ugbm9pbmxpbmUuCiAgKi8KIAotc3RhdGljIHZvaWQgbm9pbmxpbmUgX19pbml0X3JlZm9rIHJlc3RfaW5pdCh2b2lkKQorc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0X3JlZm9rIHJlc3RfaW5pdCh2b2lkKQogCV9fcmVsZWFzZXMoa2VybmVsX2xvY2spCiB7CiAJaW50IHBpZDsKQEAgLTUzNyw3ICs1MzYsNiBAQAogCSAqIE5lZWQgdG8gcnVuIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCB0byBpbml0aWFsaXplIHRoZQogCSAqIGxvY2tkZXAgaGFzaDoKIAkgKi8KLQl1bndpbmRfaW5pdCgpOwogCWxvY2tkZXBfaW5pdCgpOwogCWRlYnVnX29iamVjdHNfZWFybHlfaW5pdCgpOwogCWNncm91cF9pbml0X2Vhcmx5KCk7CkBAIC01NTksNyArNTU3LDYgQEAKIAlzZXR1cF9hcmNoKCZjb21tYW5kX2xpbmUpOwogCW1tX2luaXRfb3duZXIoJmluaXRfbW0sICZpbml0X3Rhc2spOwogCXNldHVwX2NvbW1hbmRfbGluZShjb21tYW5kX2xpbmUpOwotCXVud2luZF9zZXR1cCgpOwogCXNldHVwX3Blcl9jcHVfYXJlYXMoKTsKIAlzZXR1cF9ucl9jcHVfaWRzKCk7CiAJc21wX3ByZXBhcmVfYm9vdF9jcHUoKTsJLyogYXJjaC1zcGVjaWZpYyBib290LWNwdSBob29rcyAqLwpAQCAtNzg2LDcgKzc4Myw3IEBACiAvKiBUaGlzIGlzIGEgbm9uIF9faW5pdCBmdW5jdGlvbi4gRm9yY2UgaXQgdG8gYmUgbm9pbmxpbmUgb3RoZXJ3aXNlIGdjYwogICogbWFrZXMgaXQgaW5saW5lIHRvIGluaXQoKSBhbmQgaXQgYmVjb21lcyBwYXJ0IG9mIGluaXQudGV4dCBzZWN0aW9uCiAgKi8KLXN0YXRpYyBpbnQgbm9pbmxpbmUgaW5pdF9wb3N0KHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGluaXRfcG9zdCh2b2lkKQogewogCWZyZWVfaW5pdG1lbSgpOwogCXVubG9ja19rZXJuZWwoKTsKZGlmZiAtLWdpdCBhL2lwYy9pcGNfc3lzY3RsLmMgYi9pcGMvaXBjX3N5c2N0bC5jCmluZGV4IDBkZmViYzUuLjRhN2ExMmMgMTAwNjQ0Ci0tLSBhL2lwYy9pcGNfc3lzY3RsLmMKKysrIGIvaXBjL2lwY19zeXNjdGwuYwpAQCAtMjYsMjkgKzI2LDYgQEAKIAlyZXR1cm4gd2hpY2g7CiB9CiAKLS8qCi0gKiBSb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGZpbGUgImF1dG9fbXNnbW5pIiBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4KLSAqIHdyaXR0ZW4uCi0gKiBUd28gdmFsdWVzIGFyZSBhbGxvd2VkOgotICogMDogdW5yZWdpc3RlciBtc2dtbmkncyBjYWxsYmFjayByb3V0aW5lIGZyb20gdGhlIGlwYyBuYW1lc3BhY2Ugbm90aWZpZXIKLSAqICAgIGNoYWluLiBUaGlzIG1lYW5zIHRoYXQgbXNnbW5pIHdvbid0IGJlIHJlY29tcHV0ZWQgYW55bW9yZSB1cG9uIG1lbW9yeQotICogICAgYWRkL3JlbW92ZSBvciBpcGMgbmFtZXNwYWNlIGNyZWF0aW9uL3JlbW92YWwuCi0gKiAxOiByZWdpc3RlciBiYWNrIHRoZSBjYWxsYmFjayByb3V0aW5lLgotICovCi1zdGF0aWMgdm9pZCBpcGNfYXV0b19jYWxsYmFjayhpbnQgdmFsKQotewotCWlmICghdmFsKQotCQl1bnJlZ2lzdGVyX2lwY25zX25vdGlmaWVyKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIFJlLWVuYWJsZSBhdXRvbWF0aWMgcmVjb21wdXRpbmcgb25seSBpZiBub3QgYWxyZWFkeQotCQkgKiBlbmFibGVkLgotCQkgKi8KLQkJcmVjb21wdXRlX21zZ21uaShjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOwotCQljb25kX3JlZ2lzdGVyX2lwY25zX25vdGlmaWVyKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7Ci0JfQotfQotCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgcHJvY19pcGNfZG9pbnR2ZWMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKQEAgLTk0LDYgKzcxLDI5IEBACiAJCQkJCWxlbnAsIHBwb3MpOwogfQogCisvKgorICogUm91dGluZSB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBmaWxlICJhdXRvX21zZ21uaSIgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuCisgKiB3cml0dGVuLgorICogVHdvIHZhbHVlcyBhcmUgYWxsb3dlZDoKKyAqIDA6IHVucmVnaXN0ZXIgbXNnbW5pJ3MgY2FsbGJhY2sgcm91dGluZSBmcm9tIHRoZSBpcGMgbmFtZXNwYWNlIG5vdGlmaWVyCisgKiAgICBjaGFpbi4gVGhpcyBtZWFucyB0aGF0IG1zZ21uaSB3b24ndCBiZSByZWNvbXB1dGVkIGFueW1vcmUgdXBvbiBtZW1vcnkKKyAqICAgIGFkZC9yZW1vdmUgb3IgaXBjIG5hbWVzcGFjZSBjcmVhdGlvbi9yZW1vdmFsLgorICogMTogcmVnaXN0ZXIgYmFjayB0aGUgY2FsbGJhY2sgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgaXBjX2F1dG9fY2FsbGJhY2soaW50IHZhbCkKK3sKKwlpZiAoIXZhbCkKKwkJdW5yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOworCWVsc2UgeworCQkvKgorCQkgKiBSZS1lbmFibGUgYXV0b21hdGljIHJlY29tcHV0aW5nIG9ubHkgaWYgbm90IGFscmVhZHkKKwkJICogZW5hYmxlZC4KKwkJICovCisJCXJlY29tcHV0ZV9tc2dtbmkoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKKwkJY29uZF9yZWdpc3Rlcl9pcGNuc19ub3RpZmllcihjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOworCX0KK30KKwogc3RhdGljIGludCBwcm9jX2lwY2F1dG9fZG9pbnR2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggZmVhMGFkMy4uYzY4Y2QzZiAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtMTIxNiw3ICsxMjE2LDYgQEAKIAlpZiAodGltZW91dCAmJiBqaWZmaWVzX2xlZnQgPT0gMCkKIAkJZXJyb3IgPSAtRUFHQUlOOwogCWxpc3RfZGVsKCZxdWV1ZS5saXN0KTsKLQlnb3RvIG91dF91bmxvY2tfZnJlZTsKIAogb3V0X3VubG9ja19mcmVlOgogCXNlbV91bmxvY2soc21hKTsKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCA1N2RkNTAwLi5iMTI1YjU2IDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC03NSw3ICs3NSw3IEBACiAJbnMtPnNobV9jdGxhbGwgPSBTSE1BTEw7CiAJbnMtPnNobV9jdGxtbmkgPSBTSE1NTkk7CiAJbnMtPnNobV90b3QgPSAwOwotCWlwY19pbml0X2lkcygmbnMtPmlkc1tJUENfU0hNX0lEU10pOworCWlwY19pbml0X2lkcygmc2htX2lkcyhucykpOwogfQogCiAvKgpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCW1lbXNldCgmc2htaW5mbywwLHNpemVvZihzaG1pbmZvKSk7CisJCW1lbXNldCgmc2htaW5mbywgMCwgc2l6ZW9mKHNobWluZm8pKTsKIAkJc2htaW5mby5zaG1tbmkgPSBzaG1pbmZvLnNobXNlZyA9IG5zLT5zaG1fY3RsbW5pOwogCQlzaG1pbmZvLnNobW1heCA9IG5zLT5zaG1fY3RsbWF4OwogCQlzaG1pbmZvLnNobWFsbCA9IG5zLT5zaG1fY3RsYWxsOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCW1lbXNldCgmc2htX2luZm8sMCxzaXplb2Yoc2htX2luZm8pKTsKKwkJbWVtc2V0KCZzaG1faW5mbywgMCwgc2l6ZW9mKHNobV9pbmZvKSk7CiAJCWRvd25fcmVhZCgmc2htX2lkcyhucykucndfbXV0ZXgpOwogCQlzaG1faW5mby51c2VkX2lkcyA9IHNobV9pZHMobnMpLmluX3VzZTsKIAkJc2htX2dldF9zdGF0IChucywgJnNobV9pbmZvLnNobV9yc3MsICZzaG1faW5mby5zaG1fc3dwKTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQlzaG1faW5mby5zd2FwX3N1Y2Nlc3NlcyA9IDA7CiAJCWVyciA9IGlwY19nZXRfbWF4aWQoJnNobV9pZHMobnMpKTsKIAkJdXBfcmVhZCgmc2htX2lkcyhucykucndfbXV0ZXgpOwotCQlpZihjb3B5X3RvX3VzZXIgKGJ1ZiwgJnNobV9pbmZvLCBzaXplb2Yoc2htX2luZm8pKSkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnNobV9pbmZvLCBzaXplb2Yoc2htX2luZm8pKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC02OTIsMTEgKzY5Miw2IEBACiAJCXN0cnVjdCBzaG1pZDY0X2RzIHRidWY7CiAJCWludCByZXN1bHQ7CiAKLQkJaWYgKCFidWYpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCiAJCWlmIChjbWQgPT0gU0hNX1NUQVQpIHsKIAkJCXNocCA9IHNobV9sb2NrKG5zLCBzaG1pZCk7CiAJCQlpZiAoSVNfRVJSKHNocCkpIHsKQEAgLTcxMiw3ICs3MDcsNyBAQAogCQkJfQogCQkJcmVzdWx0ID0gMDsKIAkJfQotCQllcnI9LUVBQ0NFUzsKKwkJZXJyID0gLUVBQ0NFUzsKIAkJaWYgKGlwY3Blcm1zICgmc2hwLT5zaG1fcGVybSwgU19JUlVHTykpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCWVyciA9IHNlY3VyaXR5X3NobV9zaG1jdGwoc2hwLCBjbWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NhcGFiaWxpdHkuYyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKaW5kZXggYzU5OGQ5ZC4uNjg4OTI2ZSAxMDA2NDQKLS0tIGEva2VybmVsL2NhcGFiaWxpdHkuYworKysgYi9rZXJuZWwvY2FwYWJpbGl0eS5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKGhhc19jYXBhYmlsaXR5KGN1cnJlbnQsIGNhcCkpIHsKKwlpZiAoc2VjdXJpdHlfY2FwYWJsZShjYXApID09IDApIHsKIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1VQRVJQUklWOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggODdiYjAyNS4uZjIyMTQ0NiAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMTE2LDcgKzExNiw2IEBACiAgKiBiZSBjYWxsZWQuCiAgKi8KIHN0YXRpYyBpbnQgbmVlZF9mb3JrZXhpdF9jYWxsYmFjayBfX3JlYWRfbW9zdGx5Owotc3RhdGljIGludCBuZWVkX21tX293bmVyX2NhbGxiYWNrIF9fcmVhZF9tb3N0bHk7CiAKIC8qIGNvbnZlbmllbnQgdGVzdHMgZm9yIHRoZXNlIGJpdHMgKi8KIGlubGluZSBpbnQgY2dyb3VwX2lzX3JlbW92ZWQoY29uc3Qgc3RydWN0IGNncm91cCAqY2dycCkKQEAgLTI1MzksNyArMjUzOCw2IEBACiAJaW5pdF9jc3Nfc2V0LnN1YnN5c1tzcy0+c3Vic3lzX2lkXSA9IGR1bW15dG9wLT5zdWJzeXNbc3MtPnN1YnN5c19pZF07CiAKIAluZWVkX2ZvcmtleGl0X2NhbGxiYWNrIHw9IHNzLT5mb3JrIHx8IHNzLT5leGl0OwotCW5lZWRfbW1fb3duZXJfY2FsbGJhY2sgfD0gISFzcy0+bW1fb3duZXJfY2hhbmdlZDsKIAogCS8qIEF0IHN5c3RlbSBib290LCBiZWZvcmUgYWxsIHN1YnN5c3RlbXMgaGF2ZSBiZWVuCiAJICogcmVnaXN0ZXJlZCwgbm8gdGFza3MgaGF2ZSBiZWVuIGZvcmtlZCwgc28gd2UgZG9uJ3QKQEAgLTI3ODksMzcgKzI3ODcsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19NTV9PV05FUgotLyoqCi0gKiBjZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzIC0gcnVuIGNhbGxiYWNrcyB3aGVuIHRoZSBtbS0+b3duZXIgY2hhbmdlcwotICogQHA6IHRoZSBuZXcgb3duZXIKLSAqCi0gKiBDYWxsZWQgb24gZXZlcnkgY2hhbmdlIHRvIG1tLT5vd25lci4gbW1faW5pdF9vd25lcigpIGRvZXMgbm90Ci0gKiBpbnZva2UgdGhpcyByb3V0aW5lLCBzaW5jZSBpdCBhc3NpZ25zIHRoZSBtbS0+b3duZXIgdGhlIGZpcnN0IHRpbWUKLSAqIGFuZCBkb2VzIG5vdCBjaGFuZ2UgaXQuCi0gKgotICogVGhlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCB3aXRoIG1tYXBfc2VtIGhlbGQgaW4gcmVhZCBtb2RlLgotICovCi12b2lkIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3Moc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KQotewotCXN0cnVjdCBjZ3JvdXAgKm9sZGNncnAsICpuZXdjZ3JwID0gTlVMTDsKLQotCWlmIChuZWVkX21tX293bmVyX2NhbGxiYWNrKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MgPSBzdWJzeXNbaV07Ci0JCQlvbGRjZ3JwID0gdGFza19jZ3JvdXAob2xkLCBzcy0+c3Vic3lzX2lkKTsKLQkJCWlmIChuZXcpCi0JCQkJbmV3Y2dycCA9IHRhc2tfY2dyb3VwKG5ldywgc3MtPnN1YnN5c19pZCk7Ci0JCQlpZiAob2xkY2dycCA9PSBuZXdjZ3JwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHNzLT5tbV9vd25lcl9jaGFuZ2VkKQotCQkJCXNzLT5tbV9vd25lcl9jaGFuZ2VkKHNzLCBvbGRjZ3JwLCBuZXdjZ3JwLCBuZXcpOwotCQl9Ci0JfQotfQotI2VuZGlmIC8qIENPTkZJR19NTV9PV05FUiAqLwotCiAvKioKICAqIGNncm91cF9wb3N0X2ZvcmsgLSBjYWxsZWQgb24gYSBuZXcgdGFzayBhZnRlciBhZGRpbmcgaXQgdG8gdGhlIHRhc2sgbGlzdAogICogQGNoaWxkOiB0aGUgdGFzayBpbiBxdWVzdGlvbgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IGQ1MmUyZWMuLjQyZDU2NTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXgtdGltZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTIyOSw2ICsyMzAsNyBAQAogCQlpZiAoY29weV90b191c2VyKHRidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIGNvbXBhdF9qaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyk7CiB9CiAKQEAgLTg5NCw4ICs4OTYsOSBAQAogCiAJaWYgKHRsb2MpIHsKIAkJaWYgKHB1dF91c2VyKGksdGxvYykpCi0JCQlpID0gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIGk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCAzOWMxYTRjLi4zNDVhY2U1IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC0yNDAsNiArMjQwLDE3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGNhbGxiYWNrX211dGV4KTsKIAogLyoKKyAqIGNwdXNldF9idWZmZXJfbG9jayBwcm90ZWN0cyBib3RoIHRoZSBjcHVzZXRfbmFtZSBhbmQgY3B1c2V0X25vZGVsaXN0CisgKiBidWZmZXJzLiAgVGhleSBhcmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgdG8gcHJldmVudCB1c2luZyBleGNlc3Mgc3RhY2sKKyAqIHdoZW4gY2FsbGluZyBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoKS4KKyAqLworI2RlZmluZSBDUFVTRVRfTkFNRV9MRU4JCSgxMjgpCisjZGVmaW5lCUNQVVNFVF9OT0RFTElTVF9MRU4JKDI1NikKK3N0YXRpYyBjaGFyIGNwdXNldF9uYW1lW0NQVVNFVF9OQU1FX0xFTl07CitzdGF0aWMgY2hhciBjcHVzZXRfbm9kZWxpc3RbQ1BVU0VUX05PREVMSVNUX0xFTl07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNwdXNldF9idWZmZXJfbG9jayk7CisKKy8qCiAgKiBUaGlzIGlzIHVnbHksIGJ1dCBwcmVzZXJ2ZXMgdGhlIHVzZXJzcGFjZSBBUEkgZm9yIGV4aXN0aW5nIGNwdXNldAogICogdXNlcnMuIElmIHNvbWVvbmUgdHJpZXMgdG8gbW91bnQgdGhlICJjcHVzZXQiIGZpbGVzeXN0ZW0sIHdlCiAgKiBzaWxlbnRseSBzd2l0Y2ggaXQgdG8gbW91bnQgImNncm91cCIgaW5zdGVhZApAQCAtMjM1Niw2ICsyMzY3LDI5IEBACiAJcmV0dXJuIG5vZGVzX2ludGVyc2VjdHModHNrMS0+bWVtc19hbGxvd2VkLCB0c2syLT5tZW1zX2FsbG93ZWQpOwogfQogCisvKioKKyAqIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZCAtIHByaW50cyB0YXNrJ3MgY3B1c2V0IGFuZCBtZW1zX2FsbG93ZWQKKyAqIEB0YXNrOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgdGFzay4KKyAqCisgKiBEZXNjcmlwdGlvbjogUHJpbnRzIEB0YXNrJ3MgbmFtZSwgY3B1c2V0IG5hbWUsIGFuZCBjYWNoZWQgY29weSBvZiBpdHMKKyAqIG1lbXNfYWxsb3dlZCB0byB0aGUga2VybmVsIGxvZy4gIE11c3QgaG9sZCB0YXNrX2xvY2sodGFzaykgdG8gYWxsb3cKKyAqIGRlcmVmZXJlbmNpbmcgdGFza19jcyh0YXNrKS4KKyAqLwordm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gdGFza19jcyh0c2spLT5jc3MuY2dyb3VwLT5kZW50cnk7CisJc3Bpbl9sb2NrKCZjcHVzZXRfYnVmZmVyX2xvY2spOworCXNucHJpbnRmKGNwdXNldF9uYW1lLCBDUFVTRVRfTkFNRV9MRU4sCisJCSBkZW50cnkgPyAoY29uc3QgY2hhciAqKWRlbnRyeS0+ZF9uYW1lLm5hbWUgOiAiLyIpOworCW5vZGVsaXN0X3NjbnByaW50ZihjcHVzZXRfbm9kZWxpc3QsIENQVVNFVF9OT0RFTElTVF9MRU4sCisJCQkgICB0c2stPm1lbXNfYWxsb3dlZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY3B1c2V0PSVzIG1lbXNfYWxsb3dlZD0lc1xuIiwKKwkgICAgICAgdHNrLT5jb21tLCBjcHVzZXRfbmFtZSwgY3B1c2V0X25vZGVsaXN0KTsKKwlzcGluX3VubG9jaygmY3B1c2V0X2J1ZmZlcl9sb2NrKTsKK30KKwogLyoKICAqIENvbGxlY3Rpb24gb2YgbWVtb3J5X3ByZXNzdXJlIGlzIHN1cHByZXNzZWQgdW5sZXNzCiAgKiB0aGlzIGZsYWcgaXMgZW5hYmxlZCBieSB3cml0aW5nICIxIiB0byB0aGUgc3BlY2lhbApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS1jb2hlcmVudC5jIGIva2VybmVsL2RtYS1jb2hlcmVudC5jCmluZGV4IGYwMTNhMGMuLjAzODcwNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEtY29oZXJlbnQuYworKysgYi9rZXJuZWwvZG1hLWNvaGVyZW50LmMKQEAgLTEwOSwyMCArMTA5LDQwIEBACiBpbnQgZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzc2l6ZV90IHNpemUsCiAJCQkJICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHZvaWQgKipyZXQpCiB7Ci0Jc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldiA/IGRldi0+ZG1hX21lbSA6IE5VTEw7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbTsKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJaW50IHBhZ2VubzsKIAotCWlmIChtZW0pIHsKLQkJaW50IHBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLAotCQkJCQkJICAgICBvcmRlcik7Ci0JCWlmIChwYWdlID49IDApIHsKLQkJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOwotCQkJKnJldCA9IG1lbS0+dmlydF9iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7Ci0JCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7Ci0JCX0gZWxzZSBpZiAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfRVhDTFVTSVZFKQotCQkJKnJldCA9IE5VTEw7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCW1lbSA9IGRldi0+ZG1hX21lbTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIDA7CisJaWYgKHVubGlrZWx5KHNpemUgPiBtZW0tPnNpemUpKQorIAkJcmV0dXJuIDA7CisKKwlwYWdlbm8gPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLCBvcmRlcik7CisJaWYgKHBhZ2VubyA+PSAwKSB7CisJCS8qCisJCSAqIE1lbW9yeSB3YXMgZm91bmQgaW4gdGhlIHBlci1kZXZpY2UgYXJlbmEuCisJCSAqLworCQkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQkqcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7CisJfSBlbHNlIGlmIChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9FWENMVVNJVkUpIHsKKwkJLyoKKwkJICogVGhlIHBlci1kZXZpY2UgYXJlbmEgaXMgZXhoYXVzdGVkIGFuZCB3ZSBhcmUgbm90CisJCSAqIHBlcm1pdHRlZCB0byBmYWxsIGJhY2sgdG8gZ2VuZXJpYyBtZW1vcnkuCisJCSAqLworCQkqcmV0ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcGVyLWRldmljZSBhcmVuYSBpcyBleGhhdXN0ZWQgYW5kIHdlIGFyZQorCQkgKiBwZXJtaXR0ZWQgdG8gZmFsbCBiYWNrIHRvIGdlbmVyaWMgbWVtb3J5LgorCQkgKi8KKwkJIHJldHVybiAwOwogCX0KLQlyZXR1cm4gKG1lbSAhPSBOVUxMKTsKKwlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBjOWU1YTFjLi5jNzc0MGZhIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTY0MiwzNSArNjQyLDMxIEBACiAJLyoKIAkgKiBXZSBmb3VuZCBubyBvd25lciB5ZXQgbW1fdXNlcnMgPiAxOiB0aGlzIGltcGxpZXMgdGhhdCB3ZSBhcmUKIAkgKiBtb3N0IGxpa2VseSByYWNpbmcgd2l0aCBzd2Fwb2ZmICh0cnlfdG9fdW51c2UoKSkgb3IgL3Byb2Mgb3IKLQkgKiBwdHJhY2Ugb3IgcGFnZSBtaWdyYXRpb24gKGdldF90YXNrX21tKCkpLiAgTWFyayBvd25lciBhcyBOVUxMLAotCSAqIHNvIHRoYXQgc3Vic3lzdGVtcyBjYW4gdW5kZXJzdGFuZCB0aGUgY2FsbGJhY2sgYW5kIHRha2UgYWN0aW9uLgorCSAqIHB0cmFjZSBvciBwYWdlIG1pZ3JhdGlvbiAoZ2V0X3Rhc2tfbW0oKSkuICBNYXJrIG93bmVyIGFzIE5VTEwuCiAJICovCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQljZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKG1tLT5vd25lciwgTlVMTCk7CiAJbW0tPm93bmVyID0gTlVMTDsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm47CiAKIGFzc2lnbl9uZXdfb3duZXI6CiAJQlVHX09OKGMgPT0gcCk7CiAJZ2V0X3Rhc2tfc3RydWN0KGMpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCS8qCiAJICogVGhlIHRhc2tfbG9jayBwcm90ZWN0cyBjLT5tbSBmcm9tIGNoYW5naW5nLgogCSAqIFdlIGFsd2F5cyB3YW50IG1tLT5vd25lci0+bW0gPT0gbW0KIAkgKi8KIAl0YXNrX2xvY2soYyk7CisJLyoKKwkgKiBEZWxheSByZWFkX3VubG9jaygpIHRpbGwgd2UgaGF2ZSB0aGUgdGFza19sb2NrKCkKKwkgKiB0byBlbnN1cmUgdGhhdCBjIGRvZXMgbm90IHNsaXAgYXdheSB1bmRlcm5lYXRoIHVzCisJICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChjLT5tbSAhPSBtbSkgewogCQl0YXNrX3VubG9jayhjKTsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJCXB1dF90YXNrX3N0cnVjdChjKTsKIAkJZ290byByZXRyeTsKIAl9Ci0JY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhtbS0+b3duZXIsIGMpOwogCW1tLT5vd25lciA9IGM7CiAJdGFza191bmxvY2soYyk7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcHV0X3Rhc2tfc3RydWN0KGMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NTV9PV05FUiAqLwpAQCAtMTA1NSwxMCArMTA1MSw3IEBACiAJCQkJcHJlZW1wdF9jb3VudCgpKTsKIAogCWFjY3RfdXBkYXRlX2ludGVncmFscyh0c2spOwotCWlmICh0c2stPm1tKSB7Ci0JCXVwZGF0ZV9oaXdhdGVyX3Jzcyh0c2stPm1tKTsKLQkJdXBkYXRlX2hpd2F0ZXJfdm0odHNrLT5tbSk7Ci0JfQorCiAJZ3JvdXBfZGVhZCA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnRzay0+c2lnbmFsLT5saXZlKTsKIAlpZiAoZ3JvdXBfZGVhZCkgewogCQlocnRpbWVyX2NhbmNlbCgmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDNjYmYzMC4uN2I4ZjJhNyAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00MDAsNiArNDAwLDE4IEBACiAjZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV9tbShtbSkJKGttZW1fY2FjaGVfZnJlZShtbV9jYWNoZXAsIChtbSkpKQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X2R1bXBfZmlsdGVyID0gTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcmVkdW1wX2ZpbHRlcl9zZXR1cChjaGFyICpzKQoreworCWRlZmF1bHRfZHVtcF9maWx0ZXIgPQorCQkoc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCkgPDwgTU1GX0RVTVBfRklMVEVSX1NISUZUKSAmCisJCU1NRl9EVU1QX0ZJTFRFUl9NQVNLOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjb3JlZHVtcF9maWx0ZXI9IiwgY29yZWR1bXBfZmlsdGVyX3NldHVwKTsKKwogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqIG1tX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC00MDgsOCArNDIwLDcgQEAKIAlhdG9taWNfc2V0KCZtbS0+bW1fY291bnQsIDEpOwogCWluaXRfcndzZW0oJm1tLT5tbWFwX3NlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbWxpc3QpOwotCW1tLT5mbGFncyA9IChjdXJyZW50LT5tbSkgPyBjdXJyZW50LT5tbS0+ZmxhZ3MKLQkJCQkgIDogTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisJbW0tPmZsYWdzID0gKGN1cnJlbnQtPm1tKSA/IGN1cnJlbnQtPm1tLT5mbGFncyA6IGRlZmF1bHRfZHVtcF9maWx0ZXI7CiAJbW0tPmNvcmVfc3RhdGUgPSBOVUxMOwogCW1tLT5ucl9wdGVzID0gMDsKIAlzZXRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIDApOwpAQCAtNzU4LDcgKzc2OSw3IEBACiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWc7CiAKLQlpZiAoY2xvbmVfZmxhZ3MgJiAoQ0xPTkVfU0lHSEFORCB8IENMT05FX1RIUkVBRCkpIHsKKwlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TSUdIQU5EKSB7CiAJCWF0b21pY19pbmMoJmN1cnJlbnQtPnNpZ2hhbmQtPmNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA3YzZjYmFiLi4wMDJhYTE4IDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTcwLDggKzE3MCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBkcm9wX2Z1dGV4X2tleV9yZWZzKHVuaW9uIGZ1dGV4X2tleSAqa2V5KQogewotCWlmICgha2V5LT5ib3RoLnB0cikKKwlpZiAoIWtleS0+Ym90aC5wdHIpIHsKKwkJLyogSWYgd2UncmUgaGVyZSB0aGVuIHdlIHRyaWVkIHRvIHB1dCBhIGtleSB3ZSBmYWlsZWQgdG8gZ2V0ICovCisJCVdBUk5fT05fT05DRSgxKTsKIAkJcmV0dXJuOworCX0KIAogCXN3aXRjaCAoa2V5LT5ib3RoLm9mZnNldCAmIChGVVRfT0ZGX0lOT0RFfEZVVF9PRkZfTU1TSEFSRUQpKSB7CiAJY2FzZSBGVVRfT0ZGX0lOT0RFOgpAQCAtNzMwLDggKzczMyw4IEBACiAJfQogCiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKLW91dDoKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc1NSw3ICs3NTgsNyBAQAogCQlnb3RvIG91dDsKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZnNoYXJlZCwgJmtleTIpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9wdXRfa2V5MTsKIAogCWhiMSA9IGhhc2hfZnV0ZXgoJmtleTEpOwogCWhiMiA9IGhhc2hfZnV0ZXgoJmtleTIpOwpAQCAtNzc3LDEyICs3ODAsMTIgQEAKIAkJICogYnV0IHdlIG1pZ2h0IGdldCB0aGVtIGZyb20gcmFuZ2UgY2hlY2tpbmcKIAkJICovCiAJCXJldCA9IG9wX3JldDsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF9rZXlzOwogI2VuZGlmCiAKIAkJaWYgKHVubGlrZWx5KG9wX3JldCAhPSAtRUZBVUxUKSkgewogCQkJcmV0ID0gb3BfcmV0OwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9wdXRfa2V5czsKIAkJfQogCiAJCS8qCkBAIC03OTYsNyArNzk5LDcgQEAKIAkJCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkcjIsCiAJCQkJCQkgYXR0ZW1wdCk7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gb3V0X3B1dF9rZXlzOwogCQkJZ290byByZXRyeTsKIAkJfQogCkBAIC04MzQsMTAgKzgzNywxMSBAQAogCXNwaW5fdW5sb2NrKCZoYjEtPmxvY2spOwogCWlmIChoYjEgIT0gaGIyKQogCQlzcGluX3VubG9jaygmaGIyLT5sb2NrKTsKLW91dDoKK291dF9wdXRfa2V5czoKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKK291dF9wdXRfa2V5MToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKLQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg1NCwxMyArODU4LDEzIEBACiAJc3RydWN0IGZ1dGV4X3EgKnRoaXMsICpuZXh0OwogCWludCByZXQsIGRyb3BfY291bnQgPSAwOwogCi0gcmV0cnk6CityZXRyeToKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZnNoYXJlZCwgJmtleTEpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmc2hhcmVkLCAma2V5Mik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF9rZXkxOwogCiAJaGIxID0gaGFzaF9mdXRleCgma2V5MSk7CiAJaGIyID0gaGFzaF9mdXRleCgma2V5Mik7CkBAIC04ODIsNyArODg2LDcgQEAKIAkJCWlmICghcmV0KQogCQkJCWdvdG8gcmV0cnk7CiAKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dF9wdXRfa2V5czsKIAkJfQogCQlpZiAoY3VydmFsICE9ICpjbXB2YWwpIHsKIAkJCXJldCA9IC1FQUdBSU47CkBAIC05MjcsOSArOTMxLDExIEBACiAJd2hpbGUgKC0tZHJvcF9jb3VudCA+PSAwKQogCQlkcm9wX2Z1dGV4X2tleV9yZWZzKCZrZXkxKTsKIAotb3V0Ogorb3V0X3B1dF9rZXlzOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTIpOworb3V0X3B1dF9rZXkxOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTEpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5MCw3ICs5OTYsNyBAQAogCWludCByZXQgPSAwOwogCiAJLyogSW4gdGhlIGNvbW1vbiBjYXNlIHdlIGRvbid0IHRha2UgdGhlIHNwaW5sb2NrLCB3aGljaCBpcyBuaWNlLiAqLwotIHJldHJ5OgorcmV0cnk6CiAJbG9ja19wdHIgPSBxLT5sb2NrX3B0cjsKIAliYXJyaWVyKCk7CiAJaWYgKGxvY2tfcHRyICE9IE5VTEwpIHsKQEAgLTExNzIsMTEgKzExNzgsMTEgQEAKIAogCXEucGlfc3RhdGUgPSBOVUxMOwogCXEuYml0c2V0ID0gYml0c2V0OwotIHJldHJ5OgorcmV0cnk6CiAJcS5rZXkgPSBGVVRFWF9LRVlfSU5JVDsKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0X3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dDsKIAogCWhiID0gcXVldWVfbG9jaygmcSk7CiAKQEAgLTEyMDQsNiArMTIxMCw3IEBACiAKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKKwkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS5rZXkpOwogCiAJCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIApAQCAtMTIxMyw3ICsxMjIwLDcgQEAKIAl9CiAJcmV0ID0gLUVXT1VMREJMT0NLOwogCWlmICh1dmFsICE9IHZhbCkKLQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKIAogCS8qIE9ubHkgYWN0dWFsbHkgcXVldWUgaWYgKnVhZGRyIGNvbnRhaW5lZCB2YWwuICAqLwogCXF1ZXVlX21lKCZxLCBoYik7CkBAIC0xMzA1LDExICsxMzEyLDExIEBACiAJCXJldHVybiAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOwogCX0KIAotIG91dF91bmxvY2tfcmVsZWFzZV9zZW06CitvdXRfdW5sb2NrX3B1dF9rZXk6CiAJcXVldWVfdW5sb2NrKCZxLCBoYik7Ci0KLSBvdXRfcmVsZWFzZV9zZW06CiAJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS5rZXkpOworCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1OCwxNiArMTM2NSwxNiBAQAogCX0KIAogCXEucGlfc3RhdGUgPSBOVUxMOwotIHJldHJ5OgorcmV0cnk6CiAJcS5rZXkgPSBGVVRFWF9LRVlfSU5JVDsKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmc2hhcmVkLCAmcS5rZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0X3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dDsKIAotIHJldHJ5X3VubG9ja2VkOgorcmV0cnlfdW5sb2NrZWQ6CiAJaGIgPSBxdWV1ZV9sb2NrKCZxKTsKIAotIHJldHJ5X2xvY2tlZDoKK3JldHJ5X2xvY2tlZDoKIAlyZXQgPSBsb2NrX3Rha2VuID0gMDsKIAogCS8qCkBAIC0xMzg4LDE0ICsxMzk1LDE0IEBACiAJICovCiAJaWYgKHVubGlrZWx5KChjdXJ2YWwgJiBGVVRFWF9USURfTUFTSykgPT0gdGFza19waWRfdm5yKGN1cnJlbnQpKSkgewogCQlyZXQgPSAtRURFQURMSzsKLQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKIAl9CiAKIAkvKgogCSAqIFN1cnByaXNlIC0gd2UgZ290IHRoZSBsb2NrLiBKdXN0IHJldHVybiB0byB1c2Vyc3BhY2U6CiAJICovCiAJaWYgKHVubGlrZWx5KCFjdXJ2YWwpKQotCQlnb3RvIG91dF91bmxvY2tfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCiAJdXZhbCA9IGN1cnZhbDsKIApAQCAtMTQzMSw3ICsxNDM4LDcgQEAKIAkgKiBXZSB0b29rIHRoZSBsb2NrIGR1ZSB0byBvd25lciBkaWVkIHRha2Ugb3Zlci4KIAkgKi8KIAlpZiAodW5saWtlbHkobG9ja190YWtlbikpCi0JCWdvdG8gb3V0X3VubG9ja19yZWxlYXNlX3NlbTsKKwkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAKIAkvKgogCSAqIFdlIGRvbnQgaGF2ZSB0aGUgbG9jay4gTG9vayB1cCB0aGUgUEkgc3RhdGUgKG9yIGNyZWF0ZSBpdCBpZgpAQCAtMTQ3MCw3ICsxNDc3LDcgQEAKIAkJCQlnb3RvIHJldHJ5X2xvY2tlZDsKIAkJCX0KIAkJZGVmYXVsdDoKLQkJCWdvdG8gb3V0X3VubG9ja19yZWxlYXNlX3NlbTsKKwkJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCQl9CiAJfQogCkBAIC0xNTYxLDE2ICsxNTY4LDE3IEBACiAJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdG8tPnRpbWVyKTsKIAlyZXR1cm4gcmV0ICE9IC1FSU5UUiA/IHJldCA6IC1FUkVTVEFSVE5PSU5UUjsKIAotIG91dF91bmxvY2tfcmVsZWFzZV9zZW06CitvdXRfdW5sb2NrX3B1dF9rZXk6CiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CiAKLSBvdXRfcmVsZWFzZV9zZW06CitvdXRfcHV0X2tleToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CitvdXQ6CiAJaWYgKHRvKQogCQlkZXN0cm95X2hydGltZXJfb25fc3RhY2soJnRvLT50aW1lcik7CiAJcmV0dXJuIHJldDsKIAotIHVhZGRyX2ZhdWx0ZWQ6Cit1YWRkcl9mYXVsdGVkOgogCS8qCiAJICogV2UgaGF2ZSB0byByL3cgICooaW50IF9fdXNlciAqKXVhZGRyLCBhbmQgd2UgaGF2ZSB0byBtb2RpZnkgaXQKIAkgKiBhdG9taWNhbGx5LiAgVGhlcmVmb3JlLCBpZiB3ZSBjb250aW51ZSB0byBmYXVsdCBhZnRlciBnZXRfdXNlcigpCkBAIC0xNTgzLDcgKzE1OTEsNyBAQAogCWlmIChhdHRlbXB0KyspIHsKIAkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyLCBhdHRlbXB0KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3JlbGVhc2Vfc2VtOworCQkJZ290byBvdXRfcHV0X2tleTsKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKQEAgLTE2NzUsOSArMTY4Myw5IEBACiAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKLW91dDoKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkpOwogCitvdXQ6CiAJcmV0dXJuIHJldDsKIAogcGlfZmF1bHRlZDoKZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IGViMmJmZWYuLjE0NTViNzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtNjM0LDcgKzYzNCw2IEBACiB7CiB9CiAKLXN0YXRpYyB2b2lkIF9fcnVuX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKTsKIAogLyoKICAqIFdoZW4gSGlnaCByZXNvbHV0aW9uIHRpbWVycyBhcmUgYWN0aXZlLCB0cnkgdG8gcmVwcm9ncmFtLiBOb3RlLCB0aGF0IGluIGNhc2UKQEAgLTY0NiwxMyArNjQ1LDkgQEAKIAkJCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCiB7CiAJaWYgKGJhc2UtPmNwdV9iYXNlLT5ocmVzX2FjdGl2ZSAmJiBocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgYmFzZSkpIHsKLQkJLyoKLQkJICogWFhYOiByZWN1cnNpb24gY2hlY2s/Ci0JCSAqIGhydGltZXJfZm9yd2FyZCgpIHNob3VsZCByb3VuZCB1cCB3aXRoIHRpbWVyIGdyYW51bGFyaXR5Ci0JCSAqIHNvIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gaW5mIHJlY3Vyc2lvbiBoZXJlLAotCQkgKiBpdCBkb2Vzbid0IGRvIHRoYXQgdGhvdWdoCi0JCSAqLwotCQlfX3J1bl9ocnRpbWVyKHRpbWVyKTsKKwkJc3Bpbl91bmxvY2soJmJhc2UtPmNwdV9iYXNlLT5sb2NrKTsKKwkJcmFpc2Vfc29mdGlycV9pcnFvZmYoSFJUSU1FUl9TT0ZUSVJRKTsKKwkJc3Bpbl9sb2NrKCZiYXNlLT5jcHVfYmFzZS0+bG9jayk7CiAJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTcwNSwxMSArNzAwLDYgQEAKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfaHJlcyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9pbml0X3RpbWVyX2hyZXMoc3RydWN0IGhydGltZXIgKnRpbWVyKSB7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyICp0aW1lciwKLQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKLXsKLQlyZXR1cm4gMDsKLX0KIAogI2VuZGlmIC8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KIApAQCAtNzgwLDkgKzc3MCwxMSBAQAogICoKICAqIFRoZSB0aW1lciBpcyBpbnNlcnRlZCBpbiBleHBpcnkgb3JkZXIuIEluc2VydGlvbiBpbnRvIHRoZQogICogcmVkIGJsYWNrIHRyZWUgaXMgTyhsb2cobikpLiBNdXN0IGhvbGQgdGhlIGJhc2UgbG9jay4KKyAqCisgKiBSZXR1cm5zIDEgd2hlbiB0aGUgbmV3IHRpbWVyIGlzIHRoZSBsZWZ0bW9zdCB0aW1lciBpbiB0aGUgdHJlZS4KICAqLwotc3RhdGljIHZvaWQgZW5xdWV1ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwKLQkJCSAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlLCBpbnQgcmVwcm9ncmFtKQorc3RhdGljIGludCBlbnF1ZXVlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLAorCQkJICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmYmFzZS0+YWN0aXZlLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC04MTQsMjAgKzgwNiw4IEBACiAJICogSW5zZXJ0IHRoZSB0aW1lciB0byB0aGUgcmJ0cmVlIGFuZCBjaGVjayB3aGV0aGVyIGl0CiAJICogcmVwbGFjZXMgdGhlIGZpcnN0IHBlbmRpbmcgdGltZXIKIAkgKi8KLQlpZiAobGVmdG1vc3QpIHsKLQkJLyoKLQkJICogUmVwcm9ncmFtIHRoZSBjbG9jayBldmVudCBkZXZpY2UuIFdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkKLQkJICogZXhwaXJlZCBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtIGhhcyBlaXRoZXIgY2FsbGVkIHRoZQotCQkgKiBjYWxsYmFjayBvciBhZGRlZCBpdCB0byB0aGUgcGVuZGluZyBsaXN0IGFuZCByYWlzZWQgdGhlCi0JCSAqIHNvZnRpcnEuCi0JCSAqCi0JCSAqIFRoaXMgaXMgYSBOT1AgZm9yICFISUdIUkVTCi0JCSAqLwotCQlpZiAocmVwcm9ncmFtICYmIGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0odGltZXIsIGJhc2UpKQotCQkJcmV0dXJuOwotCisJaWYgKGxlZnRtb3N0KQogCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKLQl9CiAKIAlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOwogCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwpAQCAtODM2LDYgKzgxNiw4IEBACiAJICogc3RhdGUgb2YgYSBwb3NzaWJseSBydW5uaW5nIGNhbGxiYWNrLgogCSAqLwogCXRpbWVyLT5zdGF0ZSB8PSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEOworCisJcmV0dXJuIGxlZnRtb3N0OwogfQogCiAvKgpAQCAtOTEyLDcgKzg5NCw3IEBACiB7CiAJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgKm5ld19iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBsZWZ0bW9zdDsKIAogCWJhc2UgPSBsb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIApAQCAtOTQwLDEyICs5MjIsMTYgQEAKIAogCXRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIpOwogCisJbGVmdG1vc3QgPSBlbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwogCS8qCiAJICogT25seSBhbGxvdyByZXByb2dyYW1taW5nIGlmIHRoZSBuZXcgYmFzZSBpcyBvbiB0aGlzIENQVS4KIAkgKiAoaXQgbWlnaHQgc3RpbGwgYmUgb24gYW5vdGhlciBDUFUgaWYgdGhlIHRpbWVyIHdhcyBwZW5kaW5nKQorCSAqCisJICogWFhYIHNlbmRfcmVtb3RlX3NvZnRpcnEoKSA/CiAJICovCi0JZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwKLQkJCW5ld19iYXNlLT5jcHVfYmFzZSA9PSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKSk7CisJaWYgKGxlZnRtb3N0ICYmIG5ld19iYXNlLT5jcHVfYmFzZSA9PSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKSkKKwkJaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSh0aW1lciwgbmV3X2Jhc2UpOwogCiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIApAQCAtMTE1NywxMyArMTE0MywxMyBAQAogCXNwaW5fbG9jaygmY3B1X2Jhc2UtPmxvY2spOwogCiAJLyoKLQkgKiBOb3RlOiBXZSBjbGVhciB0aGUgQ0FMTEJBQ0sgYml0IGFmdGVyIGVucXVldWVfaHJ0aW1lciB0byBhdm9pZAotCSAqIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIGV2ZW50IGhhcmR3YXJlLiBUaGlzIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGlzCi0JICogZnVuY3Rpb24gYW55d2F5LgorCSAqIE5vdGU6IFdlIGNsZWFyIHRoZSBDQUxMQkFDSyBiaXQgYWZ0ZXIgZW5xdWV1ZV9ocnRpbWVyIGFuZAorCSAqIHdlIGRvIG5vdCByZXByb2dyYW1tIHRoZSBldmVudCBoYXJkd2FyZS4gSGFwcGVucyBlaXRoZXIgaW4KKwkgKiBocnRpbWVyX3N0YXJ0X3JhbmdlX25zKCkgb3IgaW4gaHJ0aW1lcl9pbnRlcnJ1cHQoKQogCSAqLwogCWlmIChyZXN0YXJ0ICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CiAJCUJVR19PTih0aW1lci0+c3RhdGUgIT0gSFJUSU1FUl9TVEFURV9DQUxMQkFDSyk7Ci0JCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSwgMCk7CisJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CiAJfQogCXRpbWVyLT5zdGF0ZSAmPSB+SFJUSU1FUl9TVEFURV9DQUxMQkFDSzsKIH0KQEAgLTEyNDMsNiArMTIyOSwyMiBAQAogCX0KIH0KIAorLyoKKyAqIGxvY2FsIHZlcnNpb24gb2YgaHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpIGNhbGxlZCB3aXRoIGludGVycnVwdHMKKyAqIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBfX2hydGltZXJfcGVla19haGVhZF90aW1lcnModm9pZCkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCisJaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpCisJCXJldHVybjsKKworCXRkID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKTsKKwlpZiAodGQgJiYgdGQtPmV2dGRldikKKwkJaHJ0aW1lcl9pbnRlcnJ1cHQodGQtPmV2dGRldik7Cit9CisKIC8qKgogICogaHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycyAtLSBydW4gc29mdC1leHBpcmVkIHRpbWVycyBub3cKICAqCkBAIC0xMjU0LDIwICsxMjU2LDIzIEBACiAgKi8KIHZvaWQgaHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycyh2b2lkKQogewotCXN0cnVjdCB0aWNrX2RldmljZSAqdGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghaHJ0aW1lcl9ocmVzX2FjdGl2ZSgpKQotCQlyZXR1cm47Ci0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdGQgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpOwotCWlmICh0ZCAmJiB0ZC0+ZXZ0ZGV2KQotCQlocnRpbWVyX2ludGVycnVwdCh0ZC0+ZXZ0ZGV2KTsKKwlfX2hydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfSElHSF9SRVNfVElNRVJTICovCitzdGF0aWMgdm9pZCBydW5faHJ0aW1lcl9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKCk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIF9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycyh2b2lkKSB7IH0KKworI2VuZGlmCS8qICFDT05GSUdfSElHSF9SRVNfVElNRVJTICovCiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aW1lciBzb2Z0aXJxIGV2ZXJ5IGppZmZ5LCBleHBpcmUgaHJ0aW1lcnM6CkBAIC0xNTEzLDM5ICsxNTE4LDM2IEBACiAJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIG9sZF9iYXNlLCBIUlRJTUVSX1NUQVRFX01JR1JBVEUsIDApOwogCQl0aW1lci0+YmFzZSA9IG5ld19iYXNlOwogCQkvKgotCQkgKiBFbnF1ZXVlIHRoZSB0aW1lcnMgb24gdGhlIG5ldyBjcHUsIGJ1dCBkbyBub3QgcmVwcm9ncmFtIAotCQkgKiB0aGUgdGltZXIgYXMgdGhhdCB3b3VsZCBlbmFibGUgYSBkZWFkbG9jayBiZXR3ZWVuCi0JCSAqIGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW1tKCkgcnVubmluZyB0aGUgdGltZXIgYW5kIHVzIHN0aWxsCi0JCSAqIGhvbGRpbmcgYSBuZXN0ZWQgYmFzZSBsb2NrLgotCQkgKgotCQkgKiBJbnN0ZWFkIHdlIHRpY2tsZSB0aGUgaHJ0aW1lciBpbnRlcnJ1cHQgYWZ0ZXIgdGhlIG1pZ3JhdGlvbgotCQkgKiBpcyBkb25lLCB3aGljaCB3aWxsIHJ1biBhbGwgZXhwaXJlZCB0aW1lcnMgYW5kIHJlLXByb2dyYW1tCi0JCSAqIHRoZSB0aW1lciBkZXZpY2UuCisJCSAqIEVucXVldWUgdGhlIHRpbWVycyBvbiB0aGUgbmV3IGNwdS4gVGhpcyBkb2VzIG5vdAorCQkgKiByZXByb2dyYW0gdGhlIGV2ZW50IGRldmljZSBpbiBjYXNlIHRoZSB0aW1lcgorCQkgKiBleHBpcmVzIGJlZm9yZSB0aGUgZWFybGllc3Qgb24gdGhpcyBDUFUsIGJ1dCB3ZSBydW4KKwkJICogaHJ0aW1lcl9pbnRlcnJ1cHQgYWZ0ZXIgd2UgbWlncmF0ZWQgZXZlcnl0aGluZyB0bworCQkgKiBzb3J0IG91dCBhbHJlYWR5IGV4cGlyZWQgdGltZXJzIGFuZCByZXByb2dyYW0gdGhlCisJCSAqIGV2ZW50IGRldmljZS4KIAkJICovCi0JCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIDApOworCQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKIAogCQkvKiBDbGVhciB0aGUgbWlncmF0aW9uIHN0YXRlIGJpdCAqLwogCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfTUlHUkFURTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbWlncmF0ZV9ocnRpbWVycyhpbnQgc2NwdSkKK3N0YXRpYyB2b2lkIG1pZ3JhdGVfaHJ0aW1lcnMoaW50IHNjcHUpCiB7CiAJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKm9sZF9iYXNlLCAqbmV3X2Jhc2U7Ci0JaW50IGRjcHUsIGk7CisJaW50IGk7CiAKIAlCVUdfT04oY3B1X29ubGluZShzY3B1KSk7Ci0Jb2xkX2Jhc2UgPSAmcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBzY3B1KTsKLQluZXdfYmFzZSA9ICZnZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKLQotCWRjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KIAl0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihzY3B1KTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJb2xkX2Jhc2UgPSAmcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBzY3B1KTsKKwluZXdfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCS8qCiAJICogVGhlIGNhbGxlciBpcyBnbG9iYWxseSBzZXJpYWxpemVkIGFuZCBub2JvZHkgZWxzZQogCSAqIHRha2VzIHR3byBsb2NrcyBhdCBvbmNlLCBkZWFkbG9jayBpcyBub3QgcG9zc2libGUuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmbmV3X2Jhc2UtPmxvY2spOworCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOwogCXNwaW5fbG9ja19uZXN0ZWQoJm9sZF9iYXNlLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKykgewpAQCAtMTU1NCwxNSArMTU1NiwxMSBAQAogCX0KIAogCXNwaW5fdW5sb2NrKCZvbGRfYmFzZS0+bG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZuZXdfYmFzZS0+bG9jayk7Ci0JcHV0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJc3Bpbl91bmxvY2soJm5ld19iYXNlLT5sb2NrKTsKIAotCXJldHVybiBkY3B1OwotfQotCi1zdGF0aWMgdm9pZCB0aWNrbGVfdGltZXJzKHZvaWQgKmFyZykKLXsKLQlocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKCk7CisJLyogQ2hlY2ssIGlmIHdlIGdvdCBleHBpcmVkIHdvcmsgdG8gZG8gKi8KKwlfX2hydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KQEAgLTE1ODMsMTEgKzE1ODEsOCBAQAogCWNhc2UgQ1BVX0RFQUQ6CiAJY2FzZSBDUFVfREVBRF9GUk9aRU46CiAJewotCQlpbnQgZGNwdTsKLQogCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwgJnNjcHUpOwotCQlkY3B1ID0gbWlncmF0ZV9ocnRpbWVycyhzY3B1KTsKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGRjcHUsIHRpY2tsZV90aW1lcnMsIE5VTEwsIDApOworCQltaWdyYXRlX2hydGltZXJzKHNjcHUpOwogCQlicmVhazsKIAl9CiAjZW5kaWYKQEAgLTE2MDgsNiArMTYwMyw5IEBACiAJaHJ0aW1lcl9jcHVfbm90aWZ5KCZocnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCiAJCQkgICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmhydGltZXJzX25iKTsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJb3Blbl9zb2Z0aXJxKEhSVElNRVJfU09GVElSUSwgcnVuX2hydGltZXJfc29mdGlycSk7CisjZW5kaWYKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCBiNDZkYmI5Li5hMjdhNWY2IDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTUxLDggKzUxLDggQEAKIAogLyoqCiAgKiByZXF1ZXN0X21vZHVsZSAtIHRyeSB0byBsb2FkIGEga2VybmVsIG1vZHVsZQotICogQGZtdDogICAgIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCi0gKiBAdmFyYXJnczogYXJndWVtZW50cyBhcyBzcGVjaWZpZWQgaW4gdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBmbXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCisgKiBALi4uOiBhcmd1bWVudHMgYXMgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQgc3RyaW5nCiAgKgogICogTG9hZCBhIG1vZHVsZSB1c2luZyB0aGUgdXNlciBtb2RlIG1vZHVsZSBsb2FkZXIuIFRoZSBmdW5jdGlvbiByZXR1cm5zCiAgKiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGZhaWx1cmUuIE5vdGUgdGhhdCBhCmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCA5ZjhhM2YyLi4xYjljYmRjIDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTY5LDcgKzY5LDcgQEAKIC8qIE5PVEU6IGNoYW5nZSB0aGlzIHZhbHVlIG9ubHkgd2l0aCBrcHJvYmVfbXV0ZXggaGVsZCAqLwogc3RhdGljIGJvb2wga3Byb2JlX2VuYWJsZWQ7CiAKLURFRklORV9NVVRFWChrcHJvYmVfbXV0ZXgpOwkJLyogUHJvdGVjdHMga3Byb2JlX3RhYmxlICovCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9tdXRleCk7CS8qIFByb3RlY3RzIGtwcm9iZV90YWJsZSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwga3Byb2JlX2luc3RhbmNlKSA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IHsKIAlzcGlubG9ja190IGxvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTExNSw2ICsxMTUsNyBAQAogCVNMT1RfVVNFRCA9IDIsCiB9OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9pbnNuX211dGV4KTsJLyogUHJvdGVjdHMga3Byb2JlX2luc25fcGFnZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBrcHJvYmVfaW5zbl9wYWdlczsKIHN0YXRpYyBpbnQga3Byb2JlX2dhcmJhZ2Vfc2xvdHM7CiBzdGF0aWMgaW50IGNvbGxlY3RfZ2FyYmFnZV9zbG90cyh2b2lkKTsKQEAgLTE0NCwxMCArMTQ1LDEwIEBACiB9CiAKIC8qKgotICogZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KKyAqIF9fZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KICAqIFdlIGFsbG9jYXRlIGFuIGV4ZWN1dGFibGUgcGFnZSBpZiB0aGVyZSdzIG5vIHJvb20gb24gZXhpc3Rpbmcgb25lcy4KICAqLwota3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQorc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKl9fZ2V0X2luc25fc2xvdCh2b2lkKQogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKQEAgLTE5Niw2ICsxOTcsMTUgQEAKIAlyZXR1cm4ga2lwLT5pbnNuczsKIH0KIAora3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQoreworCWtwcm9iZV9vcGNvZGVfdCAqcmV0OworCW11dGV4X2xvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXQgPSBfX2dldF9pbnNuX3Nsb3QoKTsKKwltdXRleF91bmxvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBSZXR1cm4gMSBpZiBhbGwgZ2FyYmFnZXMgYXJlIGNvbGxlY3RlZCwgb3RoZXJ3aXNlIDAuICovCiBzdGF0aWMgaW50IF9fa3Byb2JlcyBjb2xsZWN0X29uZV9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXAsIGludCBpZHgpCiB7CkBAIC0yMjYsOSArMjM2LDEzIEBACiB7CiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbmV4dDsKKwlpbnQgc2FmZXR5OwogCiAJLyogRW5zdXJlIG5vLW9uZSBpcyBwcmVlcG10ZWQgb24gdGhlIGdhcmJhZ2VzICovCi0JaWYgKGNoZWNrX3NhZmV0eSgpICE9IDApCisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CisJc2FmZXR5ID0gY2hlY2tfc2FmZXR5KCk7CisJbXV0ZXhfbG9jaygma3Byb2JlX2luc25fbXV0ZXgpOworCWlmIChzYWZldHkgIT0gMCkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpcCwgcG9zLCBuZXh0LCAma3Byb2JlX2luc25fcGFnZXMsIGhsaXN0KSB7CkBAIC0yNTEsNiArMjY1LDcgQEAKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CiAKKwltdXRleF9sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkoa2lwLCBwb3MsICZrcHJvYmVfaW5zbl9wYWdlcywgaGxpc3QpIHsKIAkJaWYgKGtpcC0+aW5zbnMgPD0gc2xvdCAmJgogCQkgICAgc2xvdCA8IGtpcC0+aW5zbnMgKyAoSU5TTlNfUEVSX1BBR0UgKiBNQVhfSU5TTl9TSVpFKSkgewpAQCAtMjY3LDYgKzI4Miw4IEBACiAKIAlpZiAoZGlydHkgJiYgKytrcHJvYmVfZ2FyYmFnZV9zbG90cyA+IElOU05TX1BFUl9QQUdFKQogCQljb2xsZWN0X2dhcmJhZ2Vfc2xvdHMoKTsKKworCW11dGV4X3VubG9jaygma3Byb2JlX2luc25fbXV0ZXgpOwogfQogI2VuZGlmCiAKQEAgLTMxMCw3ICszMjcsNyBAQAogCXN0cnVjdCBrcHJvYmUgKmtwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa3AsICZwLT5saXN0LCBsaXN0KSB7Ci0JCWlmIChrcC0+cHJlX2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wcmVfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUoa3ApKSB7CiAJCQlzZXRfa3Byb2JlX2luc3RhbmNlKGtwKTsKIAkJCWlmIChrcC0+cHJlX2hhbmRsZXIoa3AsIHJlZ3MpKQogCQkJCXJldHVybiAxOwpAQCAtMzI2LDcgKzM0Myw3IEBACiAJc3RydWN0IGtwcm9iZSAqa3A7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShrcCwgJnAtPmxpc3QsIGxpc3QpIHsKLQkJaWYgKGtwLT5wb3N0X2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKGtwKSkgewogCQkJc2V0X2twcm9iZV9pbnN0YW5jZShrcCk7CiAJCQlrcC0+cG9zdF9oYW5kbGVyKGtwLCByZWdzLCBmbGFncyk7CiAJCQlyZXNldF9rcHJvYmVfaW5zdGFuY2UoKTsKQEAgLTM5Myw3ICs0MTAsNyBAQAogCQlobGlzdF9hZGRfaGVhZCgmcmktPmhsaXN0LCBoZWFkKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCSBzdHJ1Y3QgaGxpc3RfaGVhZCAqKmhlYWQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CkBAIC00MDQsMTMgKzQyMSwxNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGtyZXRwcm9iZV90YWJsZV9sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga3JldHByb2JlX3RhYmxlX2xvY2sodW5zaWduZWQgbG9uZyBoYXNoLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF91bmxvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jazsKQEAgLTQxOSw3ICs0MzgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit2b2lkIF9fa3Byb2JlcyBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jayA9IGtyZXRwcm9iZV90YWJsZV9sb2NrX3B0cihoYXNoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhsaXN0X2xvY2ssICpmbGFncyk7CkBAIC01MjYsOSArNTQ1LDEwIEBACiAJYXAtPmFkZHIgPSBwLT5hZGRyOwogCWFwLT5wcmVfaGFuZGxlciA9IGFnZ3JfcHJlX2hhbmRsZXI7CiAJYXAtPmZhdWx0X2hhbmRsZXIgPSBhZ2dyX2ZhdWx0X2hhbmRsZXI7Ci0JaWYgKHAtPnBvc3RfaGFuZGxlcikKKwkvKiBXZSBkb24ndCBjYXJlIHRoZSBrcHJvYmUgd2hpY2ggaGFzIGdvbmUuICovCisJaWYgKHAtPnBvc3RfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5wb3N0X2hhbmRsZXIgPSBhZ2dyX3Bvc3RfaGFuZGxlcjsKLQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwlpZiAocC0+YnJlYWtfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5icmVha19oYW5kbGVyID0gYWdncl9icmVha19oYW5kbGVyOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5saXN0KTsKQEAgLTU0NywxNyArNTY3LDQxIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqYXA7CiAKKwlpZiAoa3Byb2JlX2dvbmUob2xkX3ApKSB7CisJCS8qCisJCSAqIEF0dGVtcHRpbmcgdG8gaW5zZXJ0IG5ldyBwcm9iZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0CisJCSAqIGhhZCBhIHByb2JlIGluIHRoZSBtb2R1bGUgdmFkZHIgYXJlYSB3aGljaCBhbHJlYWR5CisJCSAqIGZyZWVkLiBTbywgdGhlIGluc3RydWN0aW9uIHNsb3QgaGFzIGFscmVhZHkgYmVlbgorCQkgKiByZWxlYXNlZC4gV2UgbmVlZCBhIG5ldyBzbG90IGZvciB0aGUgbmV3IHByb2JlLgorCQkgKi8KKwkJcmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShvbGRfcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAlpZiAob2xkX3AtPnByZV9oYW5kbGVyID09IGFnZ3JfcHJlX2hhbmRsZXIpIHsKIAkJY29weV9rcHJvYmUob2xkX3AsIHApOwogCQlyZXQgPSBhZGRfbmV3X2twcm9iZShvbGRfcCwgcCk7CisJCWFwID0gb2xkX3A7CiAJfSBlbHNlIHsKIAkJYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXApCisJCWlmICghYXApIHsKKwkJCWlmIChrcHJvYmVfZ29uZShvbGRfcCkpCisJCQkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKIAkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCWFkZF9hZ2dyX2twcm9iZShhcCwgb2xkX3ApOwogCQljb3B5X2twcm9iZShhcCwgcCk7CiAJCXJldCA9IGFkZF9uZXdfa3Byb2JlKGFwLCBwKTsKIAl9CisJaWYgKGtwcm9iZV9nb25lKG9sZF9wKSkgeworCQkvKgorCQkgKiBJZiB0aGUgb2xkX3AgaGFzIGdvbmUsIGl0cyBicmVha3BvaW50IGhhcyBiZWVuIGRpc2FybWVkLgorCQkgKiBXZSBoYXZlIHRvIGFybSBpdCBhZ2FpbiBhZnRlciBwcmVwYXJpbmcgcmVhbCBrcHJvYmVzLgorCQkgKi8KKwkJYXAtPmZsYWdzICY9IH5LUFJPQkVfRkxBR19HT05FOworCQlpZiAoa3Byb2JlX2VuYWJsZWQpCisJCQlhcmNoX2FybV9rcHJvYmUoYXApOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDAsOCArNjQ0LDcgQEAKIAlyZXR1cm4gKGtwcm9iZV9vcGNvZGVfdCAqKSgoKGNoYXIgKilhZGRyKSArIHAtPm9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsCi0JdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqb2xkX3A7CkBAIC02MjAsMjggKzY2MywzMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwLT5tb2RfcmVmY291bnRlZCA9IDA7Ci0KKwlwLT5mbGFncyA9IDA7CiAJLyoKIAkgKiBDaGVjayBpZiBhcmUgd2UgcHJvYmluZyBhIG1vZHVsZS4KIAkgKi8KIAlwcm9iZWRfbW9kID0gX19tb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyKTsKIAlpZiAocHJvYmVkX21vZCkgewotCQlzdHJ1Y3QgbW9kdWxlICpjYWxsaW5nX21vZDsKLQkJY2FsbGluZ19tb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoY2FsbGVkX2Zyb20pOwogCQkvKgotCQkgKiBXZSBtdXN0IGFsbG93IG1vZHVsZXMgdG8gcHJvYmUgdGhlbXNlbGYgYW5kIGluIHRoaXMgY2FzZQotCQkgKiBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIG1vZHVsZSByZWZjb3VudCwgc28gYXMgdG8gYWxsb3cKLQkJICogdW5sb2FkaW5nIG9mIHNlbGYgcHJvYmluZyBtb2R1bGVzLgorCQkgKiBXZSBtdXN0IGhvbGQgYSByZWZjb3VudCBvZiB0aGUgcHJvYmVkIG1vZHVsZSB3aGlsZSB1cGRhdGluZworCQkgKiBpdHMgY29kZSB0byBwcm9oaWJpdCB1bmV4cGVjdGVkIHVubG9hZGluZy4KIAkJICovCi0JCWlmIChjYWxsaW5nX21vZCAmJiBjYWxsaW5nX21vZCAhPSBwcm9iZWRfbW9kKSB7Ci0JCQlpZiAodW5saWtlbHkoIXRyeV9tb2R1bGVfZ2V0KHByb2JlZF9tb2QpKSkgewotCQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlwLT5tb2RfcmVmY291bnRlZCA9IDE7Ci0JCX0gZWxzZQotCQkJcHJvYmVkX21vZCA9IE5VTEw7CisJCWlmICh1bmxpa2VseSghdHJ5X21vZHVsZV9nZXQocHJvYmVkX21vZCkpKSB7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIG1vZHVsZSBmcmVlZCAuaW5pdC50ZXh0LCB3ZSBjb3VsZG4ndCBpbnNlcnQKKwkJICoga3Byb2JlcyBpbiB0aGVyZS4KKwkJICovCisJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgcHJvYmVkX21vZCkgJiYKKwkJICAgIHByb2JlZF9tb2QtPnN0YXRlICE9IE1PRFVMRV9TVEFURV9DT01JTkcpIHsKKwkJCW1vZHVsZV9wdXQocHJvYmVkX21vZCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAJcHJlZW1wdF9lbmFibGUoKTsKIApAQCAtNjY4LDggKzcxMyw5IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCi0JaWYgKHJldCAmJiBwcm9iZWRfbW9kKQorCWlmIChwcm9iZWRfbW9kKQogCQltb2R1bGVfcHV0KHByb2JlZF9tb2QpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjk3LDE2ICs3NDMsMTYgQEAKIAkgICAgIGxpc3RfaXNfc2luZ3VsYXIoJm9sZF9wLT5saXN0KSkpIHsKIAkJLyoKIAkJICogT25seSBwcm9iZSBvbiB0aGUgaGFzaCBsaXN0LiBEaXNhcm0gb25seSBpZiBrcHJvYmVzIGFyZQotCQkgKiBlbmFibGVkIC0gb3RoZXJ3aXNlLCB0aGUgYnJlYWtwb2ludCB3b3VsZCBhbHJlYWR5IGhhdmUKLQkJICogYmVlbiByZW1vdmVkLiBXZSBzYXZlIG9uIGZsdXNoaW5nIGljYWNoZS4KKwkJICogZW5hYmxlZCBhbmQgbm90IGdvbmUgLSBvdGhlcndpc2UsIHRoZSBicmVha3BvaW50IHdvdWxkCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQuIFdlIHNhdmUgb24gZmx1c2hpbmcgaWNhY2hlLgogCQkgKi8KLQkJaWYgKGtwcm9iZV9lbmFibGVkKQorCQlpZiAoa3Byb2JlX2VuYWJsZWQgJiYgIWtwcm9iZV9nb25lKG9sZF9wKSkKIAkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJaGxpc3RfZGVsX3JjdSgmb2xkX3AtPmhsaXN0KTsKIAl9IGVsc2UgewotCQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJb2xkX3AtPmJyZWFrX2hhbmRsZXIgPSBOVUxMOwotCQlpZiAocC0+cG9zdF9oYW5kbGVyKSB7CisJCWlmIChwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaXN0X3AsICZvbGRfcC0+bGlzdCwgbGlzdCkgewogCQkJCWlmICgobGlzdF9wICE9IHApICYmIChsaXN0X3AtPnBvc3RfaGFuZGxlcikpCiAJCQkJCWdvdG8gbm9jbGVhbjsKQEAgLTcyMSwzOSArNzY3LDI3IEBACiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBfX3VucmVnaXN0ZXJfa3Byb2JlX2JvdHRvbShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKIAotCWlmIChwLT5tb2RfcmVmY291bnRlZCkgewotCQkvKgotCQkgKiBTaW5jZSB3ZSd2ZSBhbHJlYWR5IGluY3JlbWVudGVkIHJlZmNvdW50LAotCQkgKiB3ZSBkb24ndCBuZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbi4KLQkJICovCi0JCW1vZCA9IG1vZHVsZV90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpcC0+YWRkcik7Ci0JCWlmIChtb2QpCi0JCQltb2R1bGVfcHV0KG1vZCk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnAtPmxpc3QpIHx8IGxpc3RfaXNfc2luZ3VsYXIoJnAtPmxpc3QpKSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmcC0+bGlzdCkpIHsKLQkJCS8qICJwIiBpcyB0aGUgbGFzdCBjaGlsZCBvZiBhbiBhZ2dyX2twcm9iZSAqLwotCQkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmcC0+bGlzdCk7Ci0JCQlrZnJlZShvbGRfcCk7Ci0JCX0KKwlpZiAobGlzdF9lbXB0eSgmcC0+bGlzdCkpCiAJCWFyY2hfcmVtb3ZlX2twcm9iZShwKTsKKwllbHNlIGlmIChsaXN0X2lzX3Npbmd1bGFyKCZwLT5saXN0KSkgeworCQkvKiAicCIgaXMgdGhlIGxhc3QgY2hpbGQgb2YgYW4gYWdncl9rcHJvYmUgKi8KKwkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKKwkJa2ZyZWUob2xkX3ApOwogCX0KIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0pCiB7CiAJaW50IGksIHJldCA9IDA7CiAKIAlpZiAobnVtIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZShrcHNbaV0sIGNhbGxlZF9mcm9tKTsKKwkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKGtwc1tpXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJdW5yZWdpc3Rlcl9rcHJvYmVzKGtwcywgaSk7CkBAIC03NjMsMjYgKzc5NywxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBmb3Iga3Byb2JlLgotICovCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoJnAsIDEsCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVucmVnaXN0ZXJfa3Byb2JlcygmcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoa3BzLCBudW0sCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTgxMSw4ICs4MzAsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyllbnRyeTsKIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0pCiB7CiAJc3RydWN0IGpwcm9iZSAqanA7CiAJaW50IHJldCA9IDAsIGk7CkBAIC04MzAsNyArODQ4LDcgQEAKIAkJCS8qIFRvZG86IFZlcmlmeSBwcm9iZXBvaW50IGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgKi8KIAkJCWpwLT5rcC5wcmVfaGFuZGxlciA9IHNldGptcF9wcmVfaGFuZGxlcjsKIAkJCWpwLT5rcC5icmVha19oYW5kbGVyID0gbG9uZ2ptcF9icmVha19oYW5kbGVyOwotCQkJcmV0ID0gX19yZWdpc3Rlcl9rcHJvYmUoJmpwLT5rcCwgY2FsbGVkX2Zyb20pOworCQkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3ApOwogCQl9CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCkBAIC04NDMsOCArODYxLDcgQEAKIAogaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCiB7Ci0JcmV0dXJuIF9fcmVnaXN0ZXJfanByb2JlcygmanAsIDEsCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJcmV0dXJuIHJlZ2lzdGVyX2pwcm9iZXMoJmpwLCAxKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCkBAIC04NTIsMTIgKzg2OSw2IEBACiAJdW5yZWdpc3Rlcl9qcHJvYmVzKCZqcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2pwcm9iZXMoanBzLCBudW0sCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KIHZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQogewogCWludCBpOwpAQCAtOTIwLDggKzkzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICppbnN0OwpAQCAtOTY3LDIxICs5NzcsMjAgQEAKIAogCXJwLT5ubWlzc2VkID0gMDsKIAkvKiBFc3RhYmxpc2ggZnVuY3Rpb24gZW50cnkgcHJvYmUgcG9pbnQgKi8KLQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZSgmcnAtPmtwLCBjYWxsZWRfZnJvbSk7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZycC0+a3ApOwogCWlmIChyZXQgIT0gMCkKIAkJZnJlZV9ycF9pbnN0KHJwKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtLAotCXVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAogCWlmIChudW0gPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJldCA9IF9fcmVnaXN0ZXJfa3JldHByb2JlKHJwc1tpXSwgY2FsbGVkX2Zyb20pOworCQlyZXQgPSByZWdpc3Rlcl9rcmV0cHJvYmUocnBzW2ldKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChpID4gMCkKIAkJCQl1bnJlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBpKTsKQEAgLTk5MSwyMyArMTAwMCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMoJnJwLCAxLAotCQkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKCZycCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBudW0sCi0JCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTEwNTUsNiArMTA1Miw3MiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0tSRVRQUk9CRVMgKi8KIAorLyogU2V0IHRoZSBrcHJvYmUgZ29uZSBhbmQgcmVtb3ZlIGl0cyBpbnN0cnVjdGlvbiBidWZmZXIuICovCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga2lsbF9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlzdHJ1Y3Qga3Byb2JlICprcDsKKwlwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCWlmIChwLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgYW4gYWdncl9rcHJvYmUsIHdlIGhhdmUgdG8gbGlzdCBhbGwgdGhlCisJCSAqIGNoYWluZWQgcHJvYmVzIGFuZCBtYXJrIHRoZW0gR09ORS4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtwLCAmcC0+bGlzdCwgbGlzdCkKKwkJCWtwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCQlwLT5wb3N0X2hhbmRsZXIgPSBOVUxMOworCQlwLT5icmVha19oYW5kbGVyID0gTlVMTDsKKwl9CisJLyoKKwkgKiBIZXJlLCB3ZSBjYW4gcmVtb3ZlIGluc25fc2xvdCBzYWZlbHksIGJlY2F1c2Ugbm8gdGhyZWFkIGNhbGxzCisJICogdGhlIG9yaWdpbmFsIHByb2JlZCBmdW5jdGlvbiAod2hpY2ggd2lsbCBiZSBmcmVlZCBzb29uKSBhbnkgbW9yZS4KKwkgKi8KKwlhcmNoX3JlbW92ZV9rcHJvYmUocCk7Cit9CisKKy8qIE1vZHVsZSBub3RpZmllciBjYWxsIGJhY2ssIGNoZWNraW5nIGtwcm9iZXMgb24gdGhlIG1vZHVsZSAqLworc3RhdGljIGludCBfX2twcm9iZXMga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2QgPSBkYXRhOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBrcHJvYmUgKnA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGNoZWNrY29yZSA9ICh2YWwgPT0gTU9EVUxFX1NUQVRFX0dPSU5HKTsKKworCWlmICh2YWwgIT0gTU9EVUxFX1NUQVRFX0dPSU5HICYmIHZhbCAhPSBNT0RVTEVfU1RBVEVfTElWRSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyoKKwkgKiBXaGVuIE1PRFVMRV9TVEFURV9HT0lORyB3YXMgbm90aWZpZWQsIGJvdGggb2YgbW9kdWxlIC50ZXh0IGFuZAorCSAqIC5pbml0LnRleHQgc2VjdGlvbnMgd291bGQgYmUgZnJlZWQuIFdoZW4gTU9EVUxFX1NUQVRFX0xJVkUgd2FzCisJICogbm90aWZpZWQsIG9ubHkgLmluaXQudGV4dCBzZWN0aW9uIHdvdWxkIGJlIGZyZWVkLiBXZSBuZWVkIHRvCisJICogZGlzYWJsZSBrcHJvYmVzIHdoaWNoIGhhdmUgYmVlbiBpbnNlcnRlZCBpbiB0aGUgc2VjdGlvbnMuCisJICovCisJbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgeworCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQorCQkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdCgodW5zaWduZWQgbG9uZylwLT5hZGRyLCBtb2QpIHx8CisJCQkgICAgKGNoZWNrY29yZSAmJgorCQkJICAgICB3aXRoaW5fbW9kdWxlX2NvcmUoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgbW9kKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSB2YWRkciB0aGlzIHByb2JlIGlzIGluc3RhbGxlZCB3aWxsIHNvb24KKwkJCQkgKiBiZSB2ZnJlZWQgYnV5IG5vdCBzeW5jZWQgdG8gZGlzay4gSGVuY2UsCisJCQkJICogZGlzYXJtaW5nIHRoZSBicmVha3BvaW50IGlzbid0IG5lZWRlZC4KKwkJCQkgKi8KKwkJCQlraWxsX2twcm9iZShwKTsKKwkJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrcHJvYmVfbW9kdWxlX25iID0geworCS5ub3RpZmllcl9jYWxsID0ga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJaW50IGksIGVyciA9IDA7CkBAIC0xMTExLDYgKzExNzQsOSBAQAogCWVyciA9IGFyY2hfaW5pdF9rcHJvYmVzKCk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3Byb2JlX2V4Y2VwdGlvbnNfbmIpOworCWlmICghZXJyKQorCQllcnIgPSByZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIoJmtwcm9iZV9tb2R1bGVfbmIpOworCiAJa3Byb2Jlc19pbml0aWFsaXplZCA9IChlcnIgPT0gMCk7CiAKIAlpZiAoIWVycikKQEAgLTExMzEsMTAgKzExOTcsMTIgQEAKIAllbHNlCiAJCWtwcm9iZV90eXBlID0gImsiOwogCWlmIChzeW0pCi0JCXNlcV9wcmludGYocGksICIlcCAgJXMgICVzKzB4JXggICVzXG4iLCBwLT5hZGRyLCBrcHJvYmVfdHlwZSwKLQkJCXN5bSwgb2Zmc2V0LCAobW9kbmFtZSA/IG1vZG5hbWUgOiAiICIpKTsKKwkJc2VxX3ByaW50ZihwaSwgIiVwICAlcyAgJXMrMHgleCAgJXMgJXNcbiIsIHAtPmFkZHIsIGtwcm9iZV90eXBlLAorCQkJc3ltLCBvZmZzZXQsIChtb2RuYW1lID8gbW9kbmFtZSA6ICIgIiksCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiAJZWxzZQotCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcFxuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIpOworCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcCAlc1xuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIsCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyAqa3Byb2JlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGxvZmZfdCAqcG9zKQpAQCAtMTIxNSw3ICsxMjgzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQotCQkJYXJjaF9hcm1fa3Byb2JlKHApOworCQkJaWYgKCFrcHJvYmVfZ29uZShwKSkKKwkJCQlhcmNoX2FybV9rcHJvYmUocCk7CiAJfQogCiAJa3Byb2JlX2VuYWJsZWQgPSB0cnVlOwpAQCAtMTI0NCw3ICsxMzEzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkpCisJCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAwOGRkOGVkLi41MjhkZDc4IDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0yNCw3ICsyNCw3IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IFwKIAlfX0FUVFIoX25hbWUsIDA2NDQsIF9uYW1lIyNfc2hvdywgX25hbWUjI19zdG9yZSkKIAotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogLyogY3VycmVudCB1ZXZlbnQgc2VxdWVuY2UgbnVtYmVyICovCiBzdGF0aWMgc3NpemVfdCB1ZXZlbnRfc2VxbnVtX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEzNyw3ICsxMzcsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2tvYmopOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGtlcm5lbF9hdHRyc1tdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogCSZ1ZXZlbnRfc2VxbnVtX2F0dHIuYXR0ciwKIAkmdWV2ZW50X2hlbHBlcl9hdHRyLmF0dHIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBmNDdjY2U5Li40OTZkY2I1IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMTQ0OSw4ICsxNDQ4LDYgQEAKIAlyZW1vdmVfc2VjdF9hdHRycyhtb2QpOwogCW1vZF9rb2JqZWN0X3JlbW92ZShtb2QpOwogCi0JdW53aW5kX3JlbW92ZV90YWJsZShtb2QtPnVud2luZF9pbmZvLCAwKTsKLQogCS8qIEFyY2gtc3BlY2lmaWMgY2xlYW51cC4gKi8KIAltb2R1bGVfYXJjaF9jbGVhbnVwKG1vZCk7CiAKQEAgLTE4NjcsNyArMTg2NCw2IEBACiAJdW5zaWduZWQgaW50IHN5bWluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgc3RyaW5kZXggPSAwOwogCXVuc2lnbmVkIGludCBtb2RpbmRleCwgdmVyc2luZGV4LCBpbmZvaW5kZXgsIHBjcHVpbmRleDsKLQl1bnNpZ25lZCBpbnQgdW53aW5kZXggPSAwOwogCXVuc2lnbmVkIGludCBudW1fa3AsIG51bV9tY291bnQ7CiAJc3RydWN0IGtlcm5lbF9wYXJhbSAqa3A7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwpAQCAtMTk1Nyw5ICsxOTUzLDYgQEAKIAl2ZXJzaW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICJfX3ZlcnNpb25zIik7CiAJaW5mb2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiLm1vZGluZm8iKTsKIAlwY3B1aW5kZXggPSBmaW5kX3BjcHVzZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKLSNpZmRlZiBBUkNIX1VOV0lORF9TRUNUSU9OX05BTUUKLQl1bndpbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FKTsKLSNlbmRpZgogCiAJLyogRG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqLwogCXNlY2hkcnNbaW5mb2luZGV4XS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwpAQCAtMTk2OSw4ICsxOTYyLDYgQEAKIAlzZWNoZHJzW3N5bWluZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAJc2VjaGRyc1tzdHJpbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwogI2VuZGlmCi0JaWYgKHVud2luZGV4KQotCQlzZWNoZHJzW3Vud2luZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAKIAkvKiBDaGVjayBtb2R1bGUgc3RydWN0IHZlcnNpb24gbm93LCBiZWZvcmUgd2UgdHJ5IHRvIHVzZSBtb2R1bGUuICovCiAJaWYgKCFjaGVja19tb2RzdHJ1Y3RfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG1vZCkpIHsKQEAgLTIyNjcsMTEgKzIyNTgsNiBAQAogCWFkZF9zZWN0X2F0dHJzKG1vZCwgaGRyLT5lX3NobnVtLCBzZWNzdHJpbmdzLCBzZWNoZHJzKTsKIAlhZGRfbm90ZXNfYXR0cnMobW9kLCBoZHItPmVfc2hudW0sIHNlY3N0cmluZ3MsIHNlY2hkcnMpOwogCi0JLyogU2l6ZSBvZiBzZWN0aW9uIDAgaXMgMCwgc28gdGhpcyB3b3JrcyB3ZWxsIGlmIG5vIHVud2luZCBpbmZvLiAqLwotCW1vZC0+dW53aW5kX2luZm8gPSB1bndpbmRfYWRkX3RhYmxlKG1vZCwKLQkJCQkJICAgICh2b2lkICopc2VjaGRyc1t1bndpbmRleF0uc2hfYWRkciwKLQkJCQkJICAgIHNlY2hkcnNbdW53aW5kZXhdLnNoX3NpemUpOwotCiAJLyogR2V0IHJpZCBvZiB0ZW1wb3JhcnkgY29weSAqLwogCXZmcmVlKGhkcik7CiAKQEAgLTIzNjYsMTEgKzIzNTIsMTIgQEAKIAkvKiBOb3cgaXQncyBhIGZpcnN0IGNsYXNzIGNpdGl6ZW4hICBXYWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciBpdC4gKi8KIAltb2QtPnN0YXRlID0gTU9EVUxFX1NUQVRFX0xJVkU7CiAJd2FrZV91cCgmbW9kdWxlX3dxKTsKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZtb2R1bGVfbm90aWZ5X2xpc3QsCisJCQkJICAgICBNT0RVTEVfU1RBVEVfTElWRSwgbW9kKTsKIAogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7CiAJLyogRHJvcCBpbml0aWFsIHJlZmVyZW5jZS4gKi8KIAltb2R1bGVfcHV0KG1vZCk7Ci0JdW53aW5kX3JlbW92ZV90YWJsZShtb2QtPnVud2luZF9pbmZvLCAxKTsKIAltb2R1bGVfZnJlZShtb2QsIG1vZC0+bW9kdWxlX2luaXQpOwogCW1vZC0+bW9kdWxlX2luaXQgPSBOVUxMOwogCW1vZC0+aW5pdF9zaXplID0gMDsKQEAgLTI0MDUsNyArMjM5Miw3IEBACiAJdW5zaWduZWQgbG9uZyBuZXh0dmFsOwogCiAJLyogQXQgd29yc2UsIG5leHQgdmFsdWUgaXMgYXQgZW5kIG9mIG1vZHVsZSAqLwotCWlmICh3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfaW5pdCwgbW9kLT5pbml0X3NpemUpKQorCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoYWRkciwgbW9kKSkKIAkJbmV4dHZhbCA9ICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2luaXQrbW9kLT5pbml0X3RleHRfc2l6ZTsKIAllbHNlCiAJCW5leHR2YWwgPSAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlK21vZC0+Y29yZV90ZXh0X3NpemU7CkBAIC0yNDUzLDggKzI0NDAsOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKQotCQkgICAgfHwgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQlpZiAobW9kbmFtZSkKIAkJCQkqbW9kbmFtZSA9IG1vZC0+bmFtZTsKIAkJCXJldCA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsKQEAgLTI0NzYsOCArMjQ2Myw4IEBACiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtb2QsICZtb2R1bGVzLCBsaXN0KSB7Ci0JCWlmICh3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfaW5pdCwgbW9kLT5pbml0X3NpemUpIHx8Ci0JCSAgICB3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpKSB7CisJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoYWRkciwgbW9kKSB8fAorCQkgICAgd2l0aGluX21vZHVsZV9jb3JlKGFkZHIsIG1vZCkpIHsKIAkJCWNvbnN0IGNoYXIgKnN5bTsKIAogCQkJc3ltID0gZ2V0X2tzeW1ib2wobW9kLCBhZGRyLCBOVUxMLCBOVUxMKTsKQEAgLTI1MDAsOCArMjQ4Nyw4IEBACiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtb2QsICZtb2R1bGVzLCBsaXN0KSB7Ci0JCWlmICh3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfaW5pdCwgbW9kLT5pbml0X3NpemUpIHx8Ci0JCSAgICB3aXRoaW4oYWRkciwgbW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpKSB7CisJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoYWRkciwgbW9kKSB8fAorCQkgICAgd2l0aGluX21vZHVsZV9jb3JlKGFkZHIsIG1vZCkpIHsKIAkJCWNvbnN0IGNoYXIgKnN5bTsKIAogCQkJc3ltID0gZ2V0X2tzeW1ib2wobW9kLCBhZGRyLCBzaXplLCBvZmZzZXQpOwpAQCAtMjcyMCw3ICsyNzA3LDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJcmV0dXJuIDE7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYW5pYy5jIGIva2VybmVsL3BhbmljLmMKaW5kZXggMTNmMDYzNC4uMmEyZmYzNiAxMDA2NDQKLS0tIGEva2VybmVsL3BhbmljLmMKKysrIGIva2VybmVsL3BhbmljLmMKQEAgLTI5OSw2ICsyOTksOCBAQAogewogCWlmICghb29wc19pZCkKIAkJZ2V0X3JhbmRvbV9ieXRlcygmb29wc19pZCwgc2l6ZW9mKG9vcHNfaWQpKTsKKwllbHNlCisJCW9vcHNfaWQrKzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggNjEzZjE2OS4uMjM5OTg4OCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC02MTUsNyArNjE1LDcgQEAKIAkvKiB0aGlzIG1heSBmYWlsIGlmIHRoZSBSVEMgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgKi8KIAlzdGF0dXMgPSBydGNfcmVhZF90aW1lKHJ0YywgJmFsbS50aW1lKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoZXJyX3JlYWR0aW1lLCBydGMtPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCXByaW50ayhlcnJfcmVhZHRpbWUsIGRldl9uYW1lKCZydGMtPmRldiksIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJcnRjX3RtX3RvX3RpbWUoJmFsbS50aW1lLCAmbm93KTsKQEAgLTYyNiw3ICs2MjYsNyBAQAogCiAJc3RhdHVzID0gcnRjX3NldF9hbGFybShydGMsICZhbG0pOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhlcnJfd2FrZWFsYXJtLCBydGMtPmRldi5idXNfaWQsIHN0YXR1cyk7CisJCXByaW50ayhlcnJfd2FrZWFsYXJtLCBkZXZfbmFtZSgmcnRjLT5kZXYpLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC02NjAsNyArNjYwLDcgQEAKIAlpZiAoIWRldmljZV9tYXlfd2FrZXVwKGNhbmRpZGF0ZS0+ZGV2LnBhcmVudCkpCiAJCXJldHVybiAwOwogCi0JKihjaGFyICoqKW5hbWVfcHRyID0gZGV2LT5idXNfaWQ7CisJKihjb25zdCBjaGFyICoqKW5hbWVfcHRyID0gZGV2X25hbWUoZGV2KTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3Byb2ZpbGUuYyBiL2tlcm5lbC9wcm9maWxlLmMKaW5kZXggZDE4ZTJkMi4uNzg0OTMzYWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcm9maWxlLmMKKysrIGIva2VybmVsL3Byb2ZpbGUuYwpAQCAtNDQ1LDcgKzQ0NSw2IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIHN0YXRpYyBpbnQgcHJvZl9jcHVfbWFza19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCBhZDYzYWY4Li5kOTJhNzZhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtNzcsOCArNzcsMTUgQEAKICAqIHNlY3Rpb25zIGFyZSBkZWxpbWl0ZWQgYnkgcmN1X3JlYWRfbG9jaygpIGFuZCByY3VfcmVhZF91bmxvY2soKSwKICAqIGFuZCBtYXkgYmUgbmVzdGVkLgogICovCi12b2lkIHN5bmNocm9uaXplX3JjdSh2b2lkKTsJLyogTWFrZXMga2VybmVsLWRvYyB0b29scyBoYXBweSAqLwotc3luY2hyb25pemVfcmN1X3h4eChzeW5jaHJvbml6ZV9yY3UsIGNhbGxfcmN1KQordm9pZCBzeW5jaHJvbml6ZV9yY3Uodm9pZCkKK3sKKwlzdHJ1Y3QgcmN1X3N5bmNocm9uaXplIHJjdTsKKwlpbml0X2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsKKwkvKiBXaWxsIHdha2UgbWUgYWZ0ZXIgUkNVIGZpbmlzaGVkLiAqLworCWNhbGxfcmN1KCZyY3UuaGVhZCwgd2FrZW1lX2FmdGVyX3JjdSk7CisJLyogV2FpdCBmb3IgaXQuICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmcmN1LmNvbXBsZXRpb24pOworfQogRVhQT1JUX1NZTUJPTF9HUEwoc3luY2hyb25pemVfcmN1KTsKIAogc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpub3R1c2VkKQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXByZWVtcHQuYyBiL2tlcm5lbC9yY3VwcmVlbXB0LmMKaW5kZXggZjlkYzhmMy4uMzNjZmM1MCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXByZWVtcHQuYworKysgYi9rZXJuZWwvcmN1cHJlZW1wdC5jCkBAIC0xMTc3LDcgKzExNzcsMTYgQEAKICAqIGluIC1ydCB0aGlzIGRvZXMgLW5vdC0gbmVjZXNzYXJpbHkgcmVzdWx0IGluIGFsbCBjdXJyZW50bHkgZXhlY3V0aW5nCiAgKiBpbnRlcnJ1cHQgLWhhbmRsZXJzLSBoYXZpbmcgY29tcGxldGVkLgogICovCi1zeW5jaHJvbml6ZV9yY3VfeHh4KF9fc3luY2hyb25pemVfc2NoZWQsIGNhbGxfcmN1X3NjaGVkKQordm9pZCBfX3N5bmNocm9uaXplX3NjaGVkKHZvaWQpCit7CisJc3RydWN0IHJjdV9zeW5jaHJvbml6ZSByY3U7CisKKwlpbml0X2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsKKwkvKiBXaWxsIHdha2UgbWUgYWZ0ZXIgUkNVIGZpbmlzaGVkLiAqLworCWNhbGxfcmN1X3NjaGVkKCZyY3UuaGVhZCwgd2FrZW1lX2FmdGVyX3JjdSk7CisJLyogV2FpdCBmb3IgaXQuICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmcmN1LmNvbXBsZXRpb24pOworfQogRVhQT1JUX1NZTUJPTF9HUEwoX19zeW5jaHJvbml6ZV9zY2hlZCk7CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdXRvcnR1cmUuYwppbmRleCAzMjQ1YjQwLi4xY2ZmMjhkIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dG9ydHVyZS5jCisrKyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogI2VuZGlmCiBpbnQgcmN1dG9ydHVyZV9ydW5uYWJsZSA9IFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVDsKIAotI2RlZmluZSBGVUxMU1RPUF9TSUdOQUxFRCAxCS8qIEJhaWwgZHVlIHRvIHNpZ25hbC4gKi8KKyNkZWZpbmUgRlVMTFNUT1BfU0hVVERPV04gMQkvKiBCYWlsIGR1ZSB0byBzeXN0ZW0gc2h1dGRvd24vcGFuaWMuICovCiAjZGVmaW5lIEZVTExTVE9QX0NMRUFOVVAgIDIJLyogT3JkZXJseSBzaHV0ZG93bi4gKi8KIHN0YXRpYyBpbnQgZnVsbHN0b3A7CQkvKiBzdG9wIGdlbmVyYXRpbmcgY2FsbGJhY2tzIGF0IHRlc3QgZW5kLiAqLwogREVGSU5FX01VVEVYKGZ1bGxzdG9wX211dGV4KTsJLyogcHJvdGVjdCBmdWxsc3RvcCB0cmFuc2l0aW9ucyBhbmQgKi8KQEAgLTE1MSwxMiArMTUxLDEwIEBACiB7CiAJaWYgKGZ1bGxzdG9wKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKLQkJaWYgKCFBQ0NFU1NfT05DRShmdWxsc3RvcCkpCi0JCQlmdWxsc3RvcCA9IEZVTExTVE9QX1NJR05BTEVEOwotCQltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKLQl9CisJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOworCWlmICghZnVsbHN0b3ApCisJCWZ1bGxzdG9wID0gRlVMTFNUT1BfU0hVVERPV047CisJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCkBAIC02MjQsNyArNjIyLDcgQEAKIAkJcmN1X3N0dXR0ZXJfd2FpdCgpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWZ1bGxzdG9wKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0lHTkFMRUQpCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0hVVERPV04pCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpAQCAtNjQ5LDcgKzY0Nyw3IEBACiAJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOwogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RvcHBpbmciKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSUdOQUxFRCkKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSFVURE9XTikKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03NTksNyArNzU3LDcgQEAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0b3BwaW5nIik7CiAJaWYgKGlycXJlYWRlciAmJiBjdXJfb3BzLT5pcnFjYXBhYmxlKQogCQlkZWxfdGltZXJfc3luYygmdCk7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0lHTkFMRUQpCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0hVVERPV04pCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuYyBiL2tlcm5lbC9yY3V0cmVlLmMKaW5kZXggYTM0MmIwMy4uZjJkODYzOCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuYworKysgYi9rZXJuZWwvcmN1dHJlZS5jCkBAIC03OSw3ICs3OSwxMCBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9kYXRhLCByY3VfYmhfZGF0YSk7CiAKICNpZmRlZiBDT05GSUdfTk9fSFoKLURFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfZHludGlja3MsIHJjdV9keW50aWNrcyk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2R5bnRpY2tzLCByY3VfZHludGlja3MpID0geworCS5keW50aWNrc19uZXN0aW5nID0gMSwKKwkuZHludGlja3MgPSAxLAorfTsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAKIHN0YXRpYyBpbnQgYmxpbWl0ID0gMTA7CQkvKiBNYXhpbXVtIGNhbGxiYWNrcyBwZXIgc29mdGlycS4gKi8KQEAgLTU3Miw2ICs1NzUsNyBAQAogCS8qIFNwZWNpYWwtY2FzZSB0aGUgY29tbW9uIHNpbmdsZS1sZXZlbCBjYXNlLiAqLwogCWlmIChOVU1fUkNVX05PREVTID09IDEpIHsKIAkJcm5wLT5xc21hc2sgPSBybnAtPnFzbWFza2luaXQ7CisJCXJzcC0+c2lnbmFsZWQgPSBSQ1VfU0lHTkFMX0lOSVQ7IC8qIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSBPSy4gKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC0xMzc5LDEzICsxMzgzLDYgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IHJjdV9vbmxpbmVfY3B1KGludCBjcHUpCiB7Ci0jaWZkZWYgQ09ORklHX05PX0haCi0Jc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZwZXJfY3B1KHJjdV9keW50aWNrcywgY3B1KTsKLQotCXJkdHAtPmR5bnRpY2tzX25lc3RpbmcgPSAxOwotCXJkdHAtPmR5bnRpY2tzIHw9IDE7IAkvKiBuZWVkIGNvbnNlY3V0aXZlICNzIGV2ZW4gZm9yIGhvdHBsdWcuICovCi0JcmR0cC0+ZHludGlja3Nfbm1pID0gKHJkdHAtPmR5bnRpY2tzX25taSArIDEpICYgfjB4MTsKLSNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJcmN1X2luaXRfcGVyY3B1X2RhdGEoY3B1LCAmcmN1X3N0YXRlKTsKIAlyY3VfaW5pdF9wZXJjcHVfZGF0YShjcHUsICZyY3VfYmhfc3RhdGUpOwogCW9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNTQ1YzZmYy4uMmUzNTQ1ZiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTY5NTcsNyArNjk1Nyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBpbml0X3Jvb3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCwgYm9vbCBib290bWVtKQorc3RhdGljIGludCBfX2luaXRfcmVmb2sgaW5pdF9yb290ZG9tYWluKHN0cnVjdCByb290X2RvbWFpbiAqcmQsIGJvb2wgYm9vdG1lbSkKIHsKIAltZW1zZXQocmQsIDAsIHNpemVvZigqcmQpKTsKIApAQCAtNjk3MCw3ICs2OTcwLDcgQEAKIAl9CiAKIAlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+c3BhbiwgR0ZQX0tFUk5FTCkpCi0JCWdvdG8gZnJlZV9yZDsKKwkJZ290byBvdXQ7CiAJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPm9ubGluZSwgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZnJlZV9zcGFuOwogCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5ydG9fbWFzaywgR0ZQX0tFUk5FTCkpCkBAIC02OTg2LDggKzY5ODYsNyBAQAogCWZyZWVfY3B1bWFza192YXIocmQtPm9ubGluZSk7CiBmcmVlX3NwYW46CiAJZnJlZV9jcHVtYXNrX3ZhcihyZC0+c3Bhbik7Ci1mcmVlX3JkOgotCWtmcmVlKHJkKTsKK291dDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtNzk4Nyw3ICs3OTg2LDcgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKSB8fCBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCi1pbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQorc3RhdGljIHZvaWQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQogewogCWdldF9vbmxpbmVfY3B1cygpOwogCkBAIC03OTk2LDEzICs3OTk1LDEwIEBACiAKIAlyZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAlwdXRfb25saW5lX2NwdXMoKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBzY2hlZF9wb3dlcl9zYXZpbmdzX3N0b3JlKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgc210KQogewotCWludCByZXQ7CiAJdW5zaWduZWQgaW50IGxldmVsID0gMDsKIAogCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmbGV2ZWwpICE9IDEpCkBAIC04MDIzLDkgKzgwMTksOSBAQAogCWVsc2UKIAkJc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyA9IGxldmVsOwogCi0JcmV0ID0gYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucygpOworCWFyY2hfcmVpbml0X3NjaGVkX2RvbWFpbnMoKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKKwlyZXR1cm4gY291bnQ7CiB9CiAKICNpZmRlZiBDT05GSUdfU0NIRURfTUMKQEAgLTgwNjAsNyArODA1Niw3IEBACiAJCSAgIHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzX3N0b3JlKTsKICNlbmRpZgogCi1pbnQgc2NoZWRfY3JlYXRlX3N5c2ZzX3Bvd2VyX3NhdmluZ3NfZW50cmllcyhzdHJ1Y3Qgc3lzZGV2X2NsYXNzICpjbHMpCitpbnQgX19pbml0IHNjaGVkX2NyZWF0ZV9zeXNmc19wb3dlcl9zYXZpbmdzX2VudHJpZXMoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xzKQogewogCWludCBlcnIgPSAwOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY2xvY2suYyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCmluZGV4IGU4YWIwOTYuLmEwYjA4NTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jbG9jay5jCisrKyBiL2tlcm5lbC9zY2hlZF9jbG9jay5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCWNsb2NrID0gc2NkLT50aWNrX2d0b2QgKyBkZWx0YTsKIAltaW5fY2xvY2sgPSB3cmFwX21heChzY2QtPnRpY2tfZ3RvZCwgc2NkLT5jbG9jayk7Ci0JbWF4X2Nsb2NrID0gc2NkLT50aWNrX2d0b2QgKyBUSUNLX05TRUM7CisJbWF4X2Nsb2NrID0gd3JhcF9tYXgoc2NkLT5jbG9jaywgc2NkLT50aWNrX2d0b2QgKyBUSUNLX05TRUMpOwogCiAJY2xvY2sgPSB3cmFwX21heChjbG9jaywgbWluX2Nsb2NrKTsKIAljbG9jayA9IHdyYXBfbWluKGNsb2NrLCBtYXhfY2xvY2spOwpAQCAtMjI3LDYgKzIyNyw5IEBACiAgKi8KIHZvaWQgc2NoZWRfY2xvY2tfaWRsZV93YWtldXBfZXZlbnQodTY0IGRlbHRhX25zKQogeworCWlmICh0aW1la2VlcGluZ19zdXNwZW5kZWQpCisJCXJldHVybjsKKwogCXNjaGVkX2Nsb2NrX3RpY2soKTsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY3B1cHJpLmMgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmMKaW5kZXggMDE4YjdiZS4uMWUwMGJmYSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2NwdXByaS5jCisrKyBiL2tlcm5lbC9zY2hlZF9jcHVwcmkuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKgogICogUmV0dXJuczogLUVOT01FTSBpZiBtZW1vcnkgZmFpbHMuCiAgKi8KLWludCBjcHVwcmlfaW5pdChzdHJ1Y3QgY3B1cHJpICpjcCwgYm9vbCBib290bWVtKQoraW50IF9faW5pdF9yZWZvayBjcHVwcmlfaW5pdChzdHJ1Y3QgY3B1cHJpICpjcCwgYm9vbCBib290bWVtKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCA1NmMwZWZlLi5lMGMwYjRiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTM4NiwyMCArMzg2LDYgQEAKICNlbmRpZgogCiAvKgotICogZGVsdGEgKj0gUFt3IC8gcnddCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotY2FsY19kZWx0YV93ZWlnaHQodW5zaWduZWQgbG9uZyBkZWx0YSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci0JZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCWRlbHRhID0gY2FsY19kZWx0YV9taW5lKGRlbHRhLAotCQkJCXNlLT5sb2FkLndlaWdodCwgJmNmc19ycV9vZihzZSktPmxvYWQpOwotCX0KLQotCXJldHVybiBkZWx0YTsKLX0KLQotLyoKICAqIGRlbHRhIC89IHcKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCkBAIC00NDAsMTIgKzQyNiwyMCBAQAogICovCiBzdGF0aWMgdTY0IHNjaGVkX3NsaWNlKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0JdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nID0gY2ZzX3JxLT5ucl9ydW5uaW5nOworCXU2NCBzbGljZSA9IF9fc2NoZWRfcGVyaW9kKGNmc19ycS0+bnJfcnVubmluZyArICFzZS0+b25fcnEpOwogCi0JaWYgKHVubGlrZWx5KCFzZS0+b25fcnEpKQotCQlucl9ydW5uaW5nKys7CisJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7CisJCXN0cnVjdCBsb2FkX3dlaWdodCAqbG9hZCA9ICZjZnNfcnEtPmxvYWQ7CiAKLQlyZXR1cm4gY2FsY19kZWx0YV93ZWlnaHQoX19zY2hlZF9wZXJpb2QobnJfcnVubmluZyksIHNlKTsKKwkJaWYgKHVubGlrZWx5KCFzZS0+b25fcnEpKSB7CisJCQlzdHJ1Y3QgbG9hZF93ZWlnaHQgbHcgPSBjZnNfcnEtPmxvYWQ7CisKKwkJCXVwZGF0ZV9sb2FkX2FkZCgmbHcsIHNlLT5sb2FkLndlaWdodCk7CisJCQlsb2FkID0gJmx3OworCQl9CisJCXNsaWNlID0gY2FsY19kZWx0YV9taW5lKHNsaWNlLCBzZS0+bG9hZC53ZWlnaHQsIGxvYWQpOworCX0KKwlyZXR1cm4gc2xpY2U7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOGU5NTg1NS4uMzE1MmFjMyAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtODU4LDcgKzg1OCw4IEBACiAJCQlxLT5pbmZvLnNpX3NpZ25vID0gc2lnOwogCQkJcS0+aW5mby5zaV9lcnJubyA9IDA7CiAJCQlxLT5pbmZvLnNpX2NvZGUgPSBTSV9VU0VSOwotCQkJcS0+aW5mby5zaV9waWQgPSB0YXNrX3BpZF92bnIoY3VycmVudCk7CisJCQlxLT5pbmZvLnNpX3BpZCA9IHRhc2tfdGdpZF9ucl9ucyhjdXJyZW50LAorCQkJCQkJCXRhc2tfYWN0aXZlX3BpZF9ucyh0KSk7CiAJCQlxLT5pbmZvLnNpX3VpZCA9IGN1cnJlbnRfdWlkKCk7CiAJCQlicmVhazsKIAkJY2FzZSAodW5zaWduZWQgbG9uZykgU0VORF9TSUdfUFJJVjoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCBkMzU2ZDc5Li43NjNjM2MxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC05MjcsNiArOTI4LDcgQEAKIAkJaWYgKGNvcHlfdG9fdXNlcih0YnVmLCAmdG1wLCBzaXplb2Yoc3RydWN0IHRtcykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gKGxvbmcpIGppZmZpZXNfNjRfdG9fY2xvY2tfdChnZXRfamlmZmllc182NCgpKTsKIH0KIApAQCAtMTYyNyw2ICsxNjI5LDggQEAKIAl1dGltZSA9IHN0aW1lID0gY3B1dGltZV96ZXJvOwogCiAJaWYgKHdobyA9PSBSVVNBR0VfVEhSRUFEKSB7CisJCXV0aW1lID0gdGFza191dGltZShjdXJyZW50KTsKKwkJc3RpbWUgPSB0YXNrX3N0aW1lKGN1cnJlbnQpOwogCQlhY2N1bXVsYXRlX3RocmVhZF9ydXNhZ2UocCwgcik7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBmZjZkNDVjLi45MmY2ZTViIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC04NywxMCArODcsNiBAQAogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCAqLwogCiAvKiBDb25zdGFudHMgdXNlZCBmb3IgbWluaW11bSBhbmQgIG1heGltdW0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNKSB8fCBkZWZpbmVkKENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCkKLXN0YXRpYyBpbnQgb25lID0gMTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQCiBzdGF0aWMgaW50IHNpeHR5ID0gNjA7CiBzdGF0aWMgaW50IG5lZ19vbmUgPSAtMTsKQEAgLTEwMSw2ICs5Nyw3IEBACiAjZW5kaWYKIAogc3RhdGljIGludCB6ZXJvOworc3RhdGljIGludCBvbmUgPSAxOwogc3RhdGljIGludCBvbmVfaHVuZHJlZCA9IDEwMDsKIAogLyogdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwcm9jX2RvaW50dmVjX21pbm1heCBmb3IgW2ZzX11vdmVyZmxvdyBVSUQgYW5kIEdJRCAqLwpAQCAtOTUyLDEyICs5NDksMjIgQEAKIAkJLmRhdGEJCT0gJmRpcnR5X2JhY2tncm91bmRfcmF0aW8sCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGRpcnR5X2JhY2tncm91bmRfcmF0aW8pLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkucHJvY19oYW5kbGVyCT0gJmRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlciwKIAkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCiAJCS5leHRyYTEJCT0gJnplcm8sCiAJCS5leHRyYTIJCT0gJm9uZV9odW5kcmVkLAogCX0sCiAJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gImRpcnR5X2JhY2tncm91bmRfYnl0ZXMiLAorCQkuZGF0YQkJPSAmZGlydHlfYmFja2dyb3VuZF9ieXRlcywKKwkJLm1heGxlbgkJPSBzaXplb2YoZGlydHlfYmFja2dyb3VuZF9ieXRlcyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmZGlydHlfYmFja2dyb3VuZF9ieXRlc19oYW5kbGVyLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmb25lLAorCX0sCisJewogCQkuY3RsX25hbWUJPSBWTV9ESVJUWV9SQVRJTywKIAkJLnByb2NuYW1lCT0gImRpcnR5X3JhdGlvIiwKIAkJLmRhdGEJCT0gJnZtX2RpcnR5X3JhdGlvLApAQCAtOTY5LDYgKzk3NiwxNiBAQAogCQkuZXh0cmEyCQk9ICZvbmVfaHVuZHJlZCwKIAl9LAogCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJkaXJ0eV9ieXRlcyIsCisJCS5kYXRhCQk9ICZ2bV9kaXJ0eV9ieXRlcywKKwkJLm1heGxlbgkJPSBzaXplb2Yodm1fZGlydHlfYnl0ZXMpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmRpcnR5X2J5dGVzX2hhbmRsZXIsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZvbmUsCisJfSwKKwl7CiAJCS5wcm9jbmFtZQk9ICJkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzIiwKIAkJLmRhdGEJCT0gJmRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCwKIAkJLm1heGxlbgkJPSBzaXplb2YoZGlydHlfd3JpdGViYWNrX2ludGVydmFsKSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90ZXN0X2twcm9iZXMuYyBiL2tlcm5lbC90ZXN0X2twcm9iZXMuYwppbmRleCAwNmI2Mzk1Li40ZjEwNDUxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGVzdF9rcHJvYmVzLmMKKysrIGIva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jCkBAIC0yMiwyMSArMjIsMTEgQEAKIAogc3RhdGljIHUzMiByYW5kMSwgcHJlaF92YWwsIHBvc3RoX3ZhbCwganBoX3ZhbDsKIHN0YXRpYyBpbnQgZXJyb3JzLCBoYW5kbGVyX2Vycm9ycywgbnVtX3Rlc3RzOworc3RhdGljIHUzMiAoKnRhcmdldCkodTMyIHZhbHVlKTsKK3N0YXRpYyB1MzIgKCp0YXJnZXQyKSh1MzIgdmFsdWUpOwogCiBzdGF0aWMgbm9pbmxpbmUgdTMyIGtwcm9iZV90YXJnZXQodTMyIHZhbHVlKQogewotCS8qCi0JICogZ2NjIGlnbm9yZXMgbm9pbmxpbmUgb24gc29tZSBhcmNoaXRlY3R1cmVzIHVubGVzcyB3ZSBzdHVmZgotCSAqIHN1ZmZpY2llbnQgbGFyZCBpbnRvIHRoZSBmdW5jdGlvbi4gVGhlIGdldF9rcHJvYmUoKSBoZXJlIGlzCi0JICoganVzdCBmb3IgdGhhdC4KLQkgKgotCSAqIE5PVEU6IFdlIGFyZW4ndCBjb25jZXJuZWQgYWJvdXQgdGhlIGNvcnJlY3RuZXNzIG9mIGdldF9rcHJvYmUoKQotCSAqIGhlcmU7IGhlbmNlLCB0aGlzIGNhbGwgaXMgbmVpdGhlciB1bmRlciAhcHJlZW1wdCBub3Igd2l0aCB0aGUKLQkgKiBrcHJvYmVfbXV0ZXggaGVsZC4gVGhpcyBpcyBmaW5lKHRtKQotCSAqLwotCWlmIChnZXRfa3Byb2JlKCh2b2lkICopMHhkZWFkYmVlZikpCi0JCXByaW50ayhLRVJOX0lORk8gIktwcm9iZSBzbW9rZSB0ZXN0OiBwcm9iZSBvbiAweGRlYWRiZWVmIVxuIik7Ci0KIAlyZXR1cm4gKHZhbHVlIC8gZGl2X2ZhY3Rvcik7CiB9CiAKQEAgLTc0LDcgKzY0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBrcHJvYmVfdGFyZ2V0KHJhbmQxKTsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOwogCXVucmVnaXN0ZXJfa3Byb2JlKCZrcCk7CiAKIAlpZiAocHJlaF92YWwgPT0gMCkgewpAQCAtOTIsNiArODIsODQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIG5vaW5saW5lIHUzMiBrcHJvYmVfdGFyZ2V0Mih1MzIgdmFsdWUpCit7CisJcmV0dXJuICh2YWx1ZSAvIGRpdl9mYWN0b3IpICsgMTsKK30KKworc3RhdGljIGludCBrcF9wcmVfaGFuZGxlcjIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJlaF92YWwgPSAocmFuZDEgLyBkaXZfZmFjdG9yKSArIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGtwX3Bvc3RfaGFuZGxlcjIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYgKHByZWhfdmFsICE9IChyYW5kMSAvIGRpdl9mYWN0b3IpICsgMSkgeworCQloYW5kbGVyX2Vycm9ycysrOworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJpbmNvcnJlY3QgdmFsdWUgaW4gcG9zdF9oYW5kbGVyMlxuIik7CisJfQorCXBvc3RoX3ZhbCA9IHByZWhfdmFsICsgZGl2X2ZhY3RvcjsKK30KKworc3RhdGljIHN0cnVjdCBrcHJvYmUga3AyID0geworCS5zeW1ib2xfbmFtZSA9ICJrcHJvYmVfdGFyZ2V0MiIsCisJLnByZV9oYW5kbGVyID0ga3BfcHJlX2hhbmRsZXIyLAorCS5wb3N0X2hhbmRsZXIgPSBrcF9wb3N0X2hhbmRsZXIyCit9OworCitzdGF0aWMgaW50IHRlc3Rfa3Byb2Jlcyh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IGtwcm9iZSAqa3BzWzJdID0geyZrcCwgJmtwMn07CisKKwlrcC5hZGRyID0gMDsgLyogYWRkciBzaG91bGQgYmUgY2xlYXJkIGZvciByZXVzaW5nIGtwcm9iZS4gKi8KKwlyZXQgPSByZWdpc3Rlcl9rcHJvYmVzKGtwcywgMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkicmVnaXN0ZXJfa3Byb2JlcyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmVoX3ZhbCA9IDA7CisJcG9zdGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOworCisJaWYgKHByZWhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3Byb2JlIHByZV9oYW5kbGVyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCWlmIChwb3N0aF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcG9zdF9oYW5kbGVyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCXByZWhfdmFsID0gMDsKKwlwb3N0aF92YWwgPSAwOworCXJldCA9IHRhcmdldDIocmFuZDEpOworCisJaWYgKHByZWhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3Byb2JlIHByZV9oYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlpZiAocG9zdGhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3Byb2JlIHBvc3RfaGFuZGxlcjIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJdW5yZWdpc3Rlcl9rcHJvYmVzKGtwcywgMik7CisJcmV0dXJuIDA7CisKK30KKwogc3RhdGljIHUzMiBqX2twcm9iZV90YXJnZXQodTMyIHZhbHVlKQogewogCWlmICh2YWx1ZSAhPSByYW5kMSkgewpAQCAtMTIxLDcgKzE4OSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0ga3Byb2JlX3RhcmdldChyYW5kMSk7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKIAl1bnJlZ2lzdGVyX2pwcm9iZSgmanApOwogCWlmIChqcGhfdmFsID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKQEAgLTEzMiw2ICsyMDAsNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBqcHJvYmUganAyID0geworCS5lbnRyeSAgICAgICAgICA9IGpfa3Byb2JlX3RhcmdldCwKKwkua3Auc3ltYm9sX25hbWUgPSAia3Byb2JlX3RhcmdldDIiCit9OworCitzdGF0aWMgaW50IHRlc3RfanByb2Jlcyh2b2lkKQoreworCWludCByZXQ7CisJc3RydWN0IGpwcm9iZSAqanBzWzJdID0geyZqcCwgJmpwMn07CisKKwlqcC5rcC5hZGRyID0gMDsgLyogYWRkciBzaG91bGQgYmUgY2xlYXJkIGZvciByZXVzaW5nIGtwcm9iZS4gKi8KKwlyZXQgPSByZWdpc3Rlcl9qcHJvYmVzKGpwcywgMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkicmVnaXN0ZXJfanByb2JlcyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlqcGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOworCWlmIChqcGhfdmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkianByb2JlIGhhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJanBoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0MihyYW5kMSk7CisJaWYgKGpwaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJqcHJvYmUgaGFuZGxlcjIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCXVucmVnaXN0ZXJfanByb2JlcyhqcHMsIDIpOworCisJcmV0dXJuIDA7Cit9CiAjaWZkZWYgQ09ORklHX0tSRVRQUk9CRVMKIHN0YXRpYyB1MzIga3JwaF92YWw7CiAKQEAgLTE3Nyw3ICsyODIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGtwcm9iZV90YXJnZXQocmFuZDEpOworCXJldCA9IHRhcmdldChyYW5kMSk7CiAJdW5yZWdpc3Rlcl9rcmV0cHJvYmUoJnJwKTsKIAlpZiAoa3JwaF92YWwgIT0gcmFuZDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKQEAgLTE4NywxMiArMjkyLDcyIEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCByZXR1cm5faGFuZGxlcjIoc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgcmV0ID0gcmVnc19yZXR1cm5fdmFsdWUocmVncyk7CisKKwlpZiAocmV0ICE9IChyYW5kMSAvIGRpdl9mYWN0b3IpICsgMSkgeworCQloYW5kbGVyX2Vycm9ycysrOworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJpbmNvcnJlY3QgdmFsdWUgaW4ga3JldHByb2JlIGhhbmRsZXIyXG4iKTsKKwl9CisJaWYgKGtycGhfdmFsID09IDApIHsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkiY2FsbCB0byBrcmV0cHJvYmUgZW50cnkgaGFuZGxlciBmYWlsZWRcbiIpOworCX0KKworCWtycGhfdmFsID0gcmFuZDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3JldHByb2JlIHJwMiA9IHsKKwkuaGFuZGxlcgk9IHJldHVybl9oYW5kbGVyMiwKKwkuZW50cnlfaGFuZGxlciAgPSBlbnRyeV9oYW5kbGVyLAorCS5rcC5zeW1ib2xfbmFtZSA9ICJrcHJvYmVfdGFyZ2V0MiIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9rcmV0cHJvYmVzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qga3JldHByb2JlICpycHNbMl0gPSB7JnJwLCAmcnAyfTsKKworCXJwLmtwLmFkZHIgPSAwOyAvKiBhZGRyIHNob3VsZCBiZSBjbGVhcmQgZm9yIHJldXNpbmcga3Byb2JlLiAqLworCXJldCA9IHJlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJyZWdpc3Rlcl9rcmV0cHJvYmUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJa3JwaF92YWwgPSAwOworCXJldCA9IHRhcmdldChyYW5kMSk7CisJaWYgKGtycGhfdmFsICE9IHJhbmQxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtyZXRwcm9iZSBoYW5kbGVyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCWtycGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQyKHJhbmQxKTsKKwlpZiAoa3JwaF92YWwgIT0gcmFuZDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3JldHByb2JlIGhhbmRsZXIyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKwl1bnJlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCAyKTsKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfS1JFVFBST0JFUyAqLwogCiBpbnQgaW5pdF90ZXN0X3Byb2Jlcyh2b2lkKQogewogCWludCByZXQ7CiAKKwl0YXJnZXQgPSBrcHJvYmVfdGFyZ2V0OworCXRhcmdldDIgPSBrcHJvYmVfdGFyZ2V0MjsKKwogCWRvIHsKIAkJcmFuZDEgPSByYW5kb20zMigpOwogCX0gd2hpbGUgKHJhbmQxIDw9IGRpdl9mYWN0b3IpOwpAQCAtMjA0LDE1ICszNjksMzAgQEAKIAkJZXJyb3JzKys7CiAKIAludW1fdGVzdHMrKzsKKwlyZXQgPSB0ZXN0X2twcm9iZXMoKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyb3JzKys7CisKKwludW1fdGVzdHMrKzsKIAlyZXQgPSB0ZXN0X2pwcm9iZSgpOwogCWlmIChyZXQgPCAwKQogCQllcnJvcnMrKzsKIAorCW51bV90ZXN0cysrOworCXJldCA9IHRlc3RfanByb2JlcygpOworCWlmIChyZXQgPCAwKQorCQllcnJvcnMrKzsKKwogI2lmZGVmIENPTkZJR19LUkVUUFJPQkVTCiAJbnVtX3Rlc3RzKys7CiAJcmV0ID0gdGVzdF9rcmV0cHJvYmUoKTsKIAlpZiAocmV0IDwgMCkKIAkJZXJyb3JzKys7CisKKwludW1fdGVzdHMrKzsKKwlyZXQgPSB0ZXN0X2tyZXRwcm9iZXMoKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyb3JzKys7CiAjZW5kaWYgLyogQ09ORklHX0tSRVRQUk9CRVMgKi8KIAogCWlmIChlcnJvcnMpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCBkNjNhNDMzLi40ODg2ZTNjIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpAQCAtNjUsOCArNjYsOSBAQAogCiAJaWYgKHRsb2MpIHsKIAkJaWYgKHB1dF91c2VyKGksdGxvYykpCi0JCQlpID0gLUVGQVVMVDsKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KKwlmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuKCk7CiAJcmV0dXJuIGk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IGZhMDVlODguLjkwMGYxYjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtNDYsNiArNDYsOSBAQAogc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3NsZWVwX3RpbWU7CQkvKiBzZWNvbmRzICovCiAKKy8qIGZsYWcgZm9yIGlmIHRpbWVrZWVwaW5nIGlzIHN1c3BlbmRlZCAqLworaW50IF9fcmVhZF9tb3N0bHkgdGltZWtlZXBpbmdfc3VzcGVuZGVkOworCiBzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHh0aW1lX2NhY2hlIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHZvaWQgdXBkYXRlX3h0aW1lX2NhY2hlKHU2NCBuc2VjKQogewpAQCAtOTIsNiArOTUsOCBAQAogCXVuc2lnbmVkIGxvbmcgc2VxOwogCXM2NCBuc2VjczsKIAorCVdBUk5fT04odGltZWtlZXBpbmdfc3VzcGVuZGVkKTsKKwogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CiAKQEAgLTI5OSw4ICszMDQsNiBAQAogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CiAKLS8qIGZsYWcgZm9yIGlmIHRpbWVrZWVwaW5nIGlzIHN1c3BlbmRlZCAqLwotc3RhdGljIGludCB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAvKiB0aW1lIGluIHNlY29uZHMgd2hlbiBzdXNwZW5kIGJlZ2FuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCAyZGMwNmFiLi40M2Y4OTFiIDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC05Miw4ICs5Miw4IEBACiAJbW0gPSBnZXRfdGFza19tbShwKTsKIAlpZiAobW0pIHsKIAkJLyogYWRqdXN0IHRvIEtCIHVuaXQgKi8KLQkJc3RhdHMtPmhpd2F0ZXJfcnNzICAgPSBtbS0+aGl3YXRlcl9yc3MgKiBQQUdFX1NJWkUgLyBLQjsKLQkJc3RhdHMtPmhpd2F0ZXJfdm0gICAgPSBtbS0+aGl3YXRlcl92bSAqIFBBR0VfU0laRSAvIEtCOworCQlzdGF0cy0+aGl3YXRlcl9yc3MgICA9IGdldF9tbV9oaXdhdGVyX3JzcyhtbSkgKiBQQUdFX1NJWkUgLyBLQjsKKwkJc3RhdHMtPmhpd2F0ZXJfdm0gICAgPSBnZXRfbW1faGl3YXRlcl92bShtbSkgICogUEFHRV9TSVpFIC8gS0I7CiAJCW1tcHV0KG1tKTsKIAl9CiAJc3RhdHMtPnJlYWRfY2hhcgk9IHAtPmlvYWMucmNoYXI7CmRpZmYgLS1naXQgYS9saWIvYnVzdF9zcGlubG9ja3MuYyBiL2xpYi9idXN0X3NwaW5sb2Nrcy5jCmluZGV4IDQ4NmRhNjIuLjk2ODFkNTQgMTAwNjQ0Ci0tLSBhL2xpYi9idXN0X3NwaW5sb2Nrcy5jCisrKyBiL2xpYi9idXN0X3NwaW5sb2Nrcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKIAogdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgYnVzdF9zcGlubG9ja3MoaW50IHllcykKQEAgLTIyLDYgKzIzLDcgQEAKICNpZmRlZiBDT05GSUdfVlQKIAkJdW5ibGFua19zY3JlZW4oKTsKICNlbmRpZgorCQljb25zb2xlX3VuYmxhbmsoKTsKIAkJaWYgKC0tb29wc19pbl9wcm9ncmVzcyA9PSAwKQogCQkJd2FrZV91cF9rbG9nZCgpOwogCX0KZGlmZiAtLWdpdCBhL2xpYi9keW5hbWljX3ByaW50ay5jIGIvbGliL2R5bmFtaWNfcHJpbnRrLmMKaW5kZXggOGUzMDI5NS4uMTY1YTE5NyAxMDA2NDQKLS0tIGEvbGliL2R5bmFtaWNfcHJpbnRrLmMKKysrIGIvbGliL2R5bmFtaWNfcHJpbnRrLmMKQEAgLTI3Nyw0MCArMjc3LDM0IEBACiAJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX05PTkU7CiAJCQl9CiAJCQllcnIgPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKGVsZW0pIHsKLQkJCQlpZiAodmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAwKSkgewotCQkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkIHw9Ci0JCQkJCQkJKDFMTCA8PCBlbGVtLT5oYXNoMSk7Ci0JCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyIHw9Ci0JCQkJCQkJKDFMTCA8PCBlbGVtLT5oYXNoMik7Ci0JCQkJCWVsZW0tPmVuYWJsZSA9IDE7Ci0JCQkJCW51bV9lbmFibGVkKys7Ci0JCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9TT01FOwotCQkJCQllcnIgPSAwOwotCQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCQkgICAgICAgImRlYnVnZ2luZyBlbmFibGVkIGZvciBtb2R1bGUgJXNcbiIsCi0JCQkJCSAgICAgICBlbGVtLT5uYW1lKTsKLQkJCQl9IGVsc2UgaWYgKCF2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDEpKSB7Ci0JCQkJCWVsZW0tPmVuYWJsZSA9IDA7Ci0JCQkJCW51bV9lbmFibGVkLS07Ci0JCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gxLCB0cnVlKSkKLQkJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgJj0KKwkJfSBlbHNlIGlmIChlbGVtKSB7CisJCQlpZiAodmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAwKSkgeworCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgfD0gKDFMTCA8PCBlbGVtLT5oYXNoMSk7CisJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgfD0gKDFMTCA8PCBlbGVtLT5oYXNoMik7CisJCQkJZWxlbS0+ZW5hYmxlID0gMTsKKwkJCQludW1fZW5hYmxlZCsrOworCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9TT01FOworCQkJCWVyciA9IDA7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJImRlYnVnZ2luZyBlbmFibGVkIGZvciBtb2R1bGUgJXNcbiIsCisJCQkJCWVsZW0tPm5hbWUpOworCQkJfSBlbHNlIGlmICghdmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAxKSkgeworCQkJCWVsZW0tPmVuYWJsZSA9IDA7CisJCQkJbnVtX2VuYWJsZWQtLTsKKwkJCQlpZiAoZGlzYWJsZWRfaGFzaChlbGVtLT5oYXNoMSwgdHJ1ZSkpCisJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgJj0KIAkJCQkJCQl+KDFMTCA8PCBlbGVtLT5oYXNoMSk7Ci0JCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gyLCBmYWxzZSkpCi0JCQkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkMiAmPQorCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gyLCBmYWxzZSkpCisJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyICY9CiAJCQkJCQkJfigxTEwgPDwgZWxlbS0+aGFzaDIpOwotCQkJCQlpZiAobnVtX2VuYWJsZWQpCi0JCQkJCQlkeW5hbWljX2VuYWJsZWQgPQotCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9TT01FOwotCQkJCQllbHNlCi0JCQkJCQlkeW5hbWljX2VuYWJsZWQgPQotCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9OT05FOwotCQkJCQllcnIgPSAwOwotCQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCQkgICAgICAgImRlYnVnZ2luZyBkaXNhYmxlZCBmb3IgbW9kdWxlICIKLQkJCQkJICAgICAgICIlc1xuIiwgZWxlbS0+bmFtZSk7Ci0JCQkJfQorCQkJCWlmIChudW1fZW5hYmxlZCkKKwkJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7CisJCQkJZWxzZQorCQkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfTk9ORTsKKwkJCQllcnIgPSAwOworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSJkZWJ1Z2dpbmcgZGlzYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKKwkJCQkJZWxlbS0+bmFtZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9saWIvZmF1bHQtaW5qZWN0LmMgYi9saWIvZmF1bHQtaW5qZWN0LmMKaW5kZXggYTUwYTMxMS4uZjk3YWY1NWIgMTAwNjQ0Ci0tLSBhL2xpYi9mYXVsdC1pbmplY3QuYworKysgYi9saWIvZmF1bHQtaW5qZWN0LmMKQEAgLTYsNyArNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KZGlmZiAtLWdpdCBhL2xpYi9rbGlzdC5jIGIvbGliL2tsaXN0LmMKaW5kZXggYmJkZDMwMS4uNTczZDYwNiAxMDA2NDQKLS0tIGEvbGliL2tsaXN0LmMKKysrIGIvbGliL2tsaXN0LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogLyoKICAqIFVzZSB0aGUgbG93ZXN0IGJpdCBvZiBuX2tsaXN0IHRvIG1hcmsgZGVsZXRlZCBub2RlcyBhbmQgZXhjbHVkZQpAQCAtMTA4LDcgKzEwOSw2IEBACiBzdGF0aWMgdm9pZCBrbGlzdF9ub2RlX2luaXQoc3RydWN0IGtsaXN0ICprLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKIAlJTklUX0xJU1RfSEVBRCgmbi0+bl9ub2RlKTsKLQlpbml0X2NvbXBsZXRpb24oJm4tPm5fcmVtb3ZlZCk7CiAJa3JlZl9pbml0KCZuLT5uX3JlZik7CiAJa25vZGVfc2V0X2tsaXN0KG4sIGspOwogCWlmIChrLT5nZXQpCkBAIC0xNzEsMTMgKzE3MSwzNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfYWRkX2JlZm9yZSk7CiAKK3N0cnVjdCBrbGlzdF93YWl0ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb2Nlc3M7CisJaW50IHdva2VuOworfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhrbGlzdF9yZW1vdmVfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGtsaXN0X3JlbW92ZV93YWl0ZXJzKTsKKwogc3RhdGljIHZvaWQga2xpc3RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKKwlzdHJ1Y3Qga2xpc3Rfd2FpdGVyICp3YWl0ZXIsICp0bXA7CiAJc3RydWN0IGtsaXN0X25vZGUgKm4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGtsaXN0X25vZGUsIG5fcmVmKTsKIAogCVdBUk5fT04oIWtub2RlX2RlYWQobikpOwogCWxpc3RfZGVsKCZuLT5uX25vZGUpOwotCWNvbXBsZXRlKCZuLT5uX3JlbW92ZWQpOworCXNwaW5fbG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0ZXIsIHRtcCwgJmtsaXN0X3JlbW92ZV93YWl0ZXJzLCBsaXN0KSB7CisJCWlmICh3YWl0ZXItPm5vZGUgIT0gbikKKwkJCWNvbnRpbnVlOworCisJCXdhaXRlci0+d29rZW4gPSAxOworCQltYigpOworCQl3YWtlX3VwX3Byb2Nlc3Mod2FpdGVyLT5wcm9jZXNzKTsKKwkJbGlzdF9kZWwoJndhaXRlci0+bGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CiAJa25vZGVfc2V0X2tsaXN0KG4sIE5VTEwpOwogfQogCkBAIC0yMTcsOCArMjM4LDI0IEBACiAgKi8KIHZvaWQga2xpc3RfcmVtb3ZlKHN0cnVjdCBrbGlzdF9ub2RlICpuKQogeworCXN0cnVjdCBrbGlzdF93YWl0ZXIgd2FpdGVyOworCisJd2FpdGVyLm5vZGUgPSBuOworCXdhaXRlci5wcm9jZXNzID0gY3VycmVudDsKKwl3YWl0ZXIud29rZW4gPSAwOworCXNwaW5fbG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCWxpc3RfYWRkKCZ3YWl0ZXIubGlzdCwgJmtsaXN0X3JlbW92ZV93YWl0ZXJzKTsKKwlzcGluX3VubG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCiAJa2xpc3RfZGVsKG4pOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm4tPm5fcmVtb3ZlZCk7CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHdhaXRlci53b2tlbikKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9yZW1vdmUpOwogCmRpZmYgLS1naXQgYS9saWIva29iamVjdF91ZXZlbnQuYyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCmluZGV4IDNmOTE0NzIuLjMxODMyOGQgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkvKiBrZXlzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIgKi8KIAlpZiAoZW52cF9leHQpIHsKIAkJZm9yIChpID0gMDsgZW52cF9leHRbaV07IGkrKykgewotCQkJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCBlbnZwX2V4dFtpXSk7CisJCQlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICIlcyIsIGVudnBfZXh0W2ldKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBleGl0OwogCQl9CkBAIC0yMjUsOCArMjI1LDEwIEBACiAJCQl9CiAKIAkJCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSAxOwotCQkJbmV0bGlua19icm9hZGNhc3QodWV2ZW50X3NvY2ssIHNrYiwgMCwgMSwgR0ZQX0tFUk5FTCk7Ci0JCX0KKwkJCXJldHZhbCA9IG5ldGxpbmtfYnJvYWRjYXN0KHVldmVudF9zb2NrLCBza2IsIDAsIDEsCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJfSBlbHNlCisJCQlyZXR2YWwgPSAtRU5PTUVNOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCmluZGV4IGIyNTViOTMuLmFlYWE2ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfY291bnRlci5jCisrKyBiL2xpYi9wZXJjcHVfY291bnRlci5jCkBAIC05LDEwICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIExJU1RfSEVBRChwZXJjcHVfY291bnRlcnMpOwogc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY291bnRlcnNfbG9jayk7Ci0jZW5kaWYKIAogdm9pZCBwZXJjcHVfY291bnRlcl9zZXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCiB7CkBAIC02OCwxMSArNjYsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19wZXJjcHVfY291bnRlcl9zdW0pOwogCi1zdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHBlcmNwdV9jb3VudGVyX2lycXNhZmU7Ci0KLWludCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQoraW50IF9fcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCwKKwkJCSAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJmZiYy0+bG9jayk7CisJbG9ja2RlcF9zZXRfY2xhc3MoJmZiYy0+bG9jaywga2V5KTsKIAlmYmMtPmNvdW50ID0gYW1vdW50OwogCWZiYy0+Y291bnRlcnMgPSBhbGxvY19wZXJjcHUoczMyKTsKIAlpZiAoIWZiYy0+Y291bnRlcnMpCkBAIC04NCwxNyArODIsNyBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2luaXQpOwotCi1pbnQgcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoZmJjLCBhbW91bnQpOwotCWlmICghZXJyKQotCQlsb2NrZGVwX3NldF9jbGFzcygmZmJjLT5sb2NrLCAmcGVyY3B1X2NvdW50ZXJfaXJxc2FmZSk7Ci0JcmV0dXJuIGVycjsKLX0KK0VYUE9SVF9TWU1CT0woX19wZXJjcHVfY291bnRlcl9pbml0KTsKIAogdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQogewpAQCAtMTExLDEzICs5OSwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9kZXN0cm95KTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQoraW50IHBlcmNwdV9jb3VudGVyX2JhdGNoIF9fcmVhZF9tb3N0bHkgPSAzMjsKK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfYmF0Y2gpOworCitzdGF0aWMgdm9pZCBjb21wdXRlX2JhdGNoX3ZhbHVlKHZvaWQpCit7CisJaW50IG5yID0gbnVtX29ubGluZV9jcHVzKCk7CisKKwlwZXJjcHVfY291bnRlcl9iYXRjaCA9IG1heCgzMiwgbnIqMik7Cit9CisKIHN0YXRpYyBpbnQgX19jcHVpbml0IHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjOwogCisJY29tcHV0ZV9iYXRjaF92YWx1ZSgpOwogCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQpCiAJCXJldHVybiBOT1RJRllfT0s7CiAKQEAgLTEzNCwxMyArMTMzLDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiYy0+bG9jaywgZmxhZ3MpOwogCX0KIAltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBlcmNwdV9jb3VudGVyX3N0YXJ0dXAodm9pZCkKIHsKKwljb21wdXRlX2JhdGNoX3ZhbHVlKCk7CiAJaG90Y3B1X25vdGlmaWVyKHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjaywgMCk7CiAJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdChwZXJjcHVfY291bnRlcl9zdGFydHVwKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3ByaW9faGVhcC5jIGIvbGliL3ByaW9faGVhcC5jCmluZGV4IDQ3MTk0NGEuLmE3YWY2ZjggMTAwNjQ0Ci0tLSBhL2xpYi9wcmlvX2hlYXAuYworKysgYi9saWIvcHJpb19oZWFwLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogCWlmIChoZWFwLT5zaXplIDwgaGVhcC0+bWF4KSB7CiAJCS8qIEhlYXAgaW5zZXJ0aW9uICovCi0JCWludCBwb3MgPSBoZWFwLT5zaXplKys7CisJCXBvcyA9IGhlYXAtPnNpemUrKzsKIAkJd2hpbGUgKHBvcyA+IDAgJiYgaGVhcC0+Z3QocCwgcHRyc1socG9zLTEpLzJdKSkgewogCQkJcHRyc1twb3NdID0gcHRyc1socG9zLTEpLzJdOwogCQkJcG9zID0gKHBvcy0xKS8yOwpkaWZmIC0tZ2l0IGEvbGliL3Byb3BvcnRpb25zLmMgYi9saWIvcHJvcG9ydGlvbnMuYwppbmRleCA0ZjM4N2E2Li5kNTA3NDZhIDEwMDY0NAotLS0gYS9saWIvcHJvcG9ydGlvbnMuYworKysgYi9saWIvcHJvcG9ydGlvbnMuYwpAQCAtODMsMTEgKzgzLDExIEBACiAJcGQtPmluZGV4ID0gMDsKIAlwZC0+cGdbMF0uc2hpZnQgPSBzaGlmdDsKIAltdXRleF9pbml0KCZwZC0+bXV0ZXgpOwotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKCZwZC0+cGdbMF0uZXZlbnRzLCAwKTsKKwllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZwZC0+cGdbMF0uZXZlbnRzLCAwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKCZwZC0+cGdbMV0uZXZlbnRzLCAwKTsKKwllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZwZC0+cGdbMV0uZXZlbnRzLCAwKTsKIAlpZiAoZXJyKQogCQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZwZC0+cGdbMF0uZXZlbnRzKTsKIApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgKiB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSByZWZlcmVuY2VzLgogICovCiBzdGF0aWMgc3RydWN0IHByb3BfZ2xvYmFsICpwcm9wX2dldF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQpCitfX2FjcXVpcmVzKFJDVSkKIHsKIAlpbnQgaW5kZXg7CiAKQEAgLTE2MCw2ICsxNjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwcm9wX3B1dF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQsIHN0cnVjdCBwcm9wX2dsb2JhbCAqcGcpCitfX3JlbGVhc2VzKFJDVSkKIHsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTE5MSw3ICsxOTMsNyBAQAogCXNwaW5fbG9ja19pbml0KCZwbC0+bG9jayk7CiAJcGwtPnNoaWZ0ID0gMDsKIAlwbC0+cGVyaW9kID0gMDsKLQlyZXR1cm4gcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoJnBsLT5ldmVudHMsIDApOworCXJldHVybiBwZXJjcHVfY291bnRlcl9pbml0KCZwbC0+ZXZlbnRzLCAwKTsKIH0KIAogdm9pZCBwcm9wX2xvY2FsX2Rlc3Ryb3lfcGVyY3B1KHN0cnVjdCBwcm9wX2xvY2FsX3BlcmNwdSAqcGwpCmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCBiZTg2YjMyLi44ZDNmYjBiIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAlpbnQgbnI7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZXNbUkFESVhfVFJFRV9NQVhfUEFUSF07CiB9OwotREVGSU5FX1BFUl9DUFUoc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCwgcmFkaXhfdHJlZV9wcmVsb2FkcykgPSB7IDAsIH07CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCwgcmFkaXhfdHJlZV9wcmVsb2FkcykgPSB7IDAsIH07CiAKIHN0YXRpYyBpbmxpbmUgZ2ZwX3Qgcm9vdF9nZnBfbWFzayhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQogewpkaWZmIC0tZ2l0IGEvbGliL3N3aW90bGIuYyBiL2xpYi9zd2lvdGxiLmMKaW5kZXggN2Y1ZTIxYi4uMWY5OTFhYyAxMDA2NDQKLS0tIGEvbGliL3N3aW90bGIuYworKysgYi9saWIvc3dpb3RsYi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAwNC8wNy8uLiBhawkJQmV0dGVyIG92ZXJmbG93IGhhbmRsaW5nLiBBc3NvcnRlZCBmaXhlcy4KICAqIDA1LzA5LzEwIGxpbnZpbGxlCUFkZCBzdXBwb3J0IGZvciBzeW5jaW5nIHJhbmdlcywgc3VwcG9ydCBzeW5jaW5nIGZvcgogICoJCQlETUFfQklESVJFQ1RJT05BTCBtYXBwaW5ncywgbWlzY2VsbGFuZW91cyBjbGVhbnVwLgorICogMDgvMTIvMTEgYmVja3liCUFkZCBoaWdobWVtIHN1cHBvcnQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KQEAgLTIxLDggKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpAQCAtODgsMTAgKzkwLDcgQEAKICAqIFdlIG5lZWQgdG8gc2F2ZSBhd2F5IHRoZSBvcmlnaW5hbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gYSBtYXBwZWQgZW50cnkKICAqIGZvciB0aGUgc3luYyBvcGVyYXRpb25zLgogICovCi1zdGF0aWMgc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotfSAqaW9fdGxiX29yaWdfYWRkcjsKK3N0YXRpYyBwaHlzX2FkZHJfdCAqaW9fdGxiX29yaWdfYWRkcjsKIAogLyoKICAqIFByb3RlY3QgdGhlIGFib3ZlIGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgbWFwIGFuZCB1bm1hcCBjYWxscwpAQCAtMTI1LDcgKzEyNCw3IEBACiAJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BIHwgX19HRlBfTk9XQVJOLCBvcmRlcik7CiB9CiAKLWRtYV9hZGRyX3QgX193ZWFrIHN3aW90bGJfcGh5c190b19idXMocGh5c19hZGRyX3QgcGFkZHIpCitkbWFfYWRkcl90IF9fd2VhayBzd2lvdGxiX3BoeXNfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwYWRkcikKIHsKIAlyZXR1cm4gcGFkZHI7CiB9CkBAIC0xMzUsOSArMTM0LDEwIEBACiAJcmV0dXJuIGJhZGRyOwogfQogCi1zdGF0aWMgZG1hX2FkZHJfdCBzd2lvdGxiX3ZpcnRfdG9fYnVzKHZvbGF0aWxlIHZvaWQgKmFkZHJlc3MpCitzdGF0aWMgZG1hX2FkZHJfdCBzd2lvdGxiX3ZpcnRfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgICAgIHZvbGF0aWxlIHZvaWQgKmFkZHJlc3MpCiB7Ci0JcmV0dXJuIHN3aW90bGJfcGh5c190b19idXModmlydF90b19waHlzKGFkZHJlc3MpKTsKKwlyZXR1cm4gc3dpb3RsYl9waHlzX3RvX2J1cyhod2RldiwgdmlydF90b19waHlzKGFkZHJlc3MpKTsKIH0KIAogc3RhdGljIHZvaWQgKnN3aW90bGJfYnVzX3RvX3ZpcnQoZG1hX2FkZHJfdCBhZGRyZXNzKQpAQCAtMTUwLDM1ICsxNTAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl9zZ190b19idXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKLXsKLQlyZXR1cm4gc3dpb3RsYl9waHlzX3RvX2J1cyhwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHN3aW90bGJfcHJpbnRfaW5mbyh1bnNpZ25lZCBsb25nIGJ5dGVzKQogewogCXBoeXNfYWRkcl90IHBzdGFydCwgcGVuZDsKLQlkbWFfYWRkcl90IGJzdGFydCwgYmVuZDsKIAogCXBzdGFydCA9IHZpcnRfdG9fcGh5cyhpb190bGJfc3RhcnQpOwogCXBlbmQgPSB2aXJ0X3RvX3BoeXMoaW9fdGxiX2VuZCk7CiAKLQlic3RhcnQgPSBzd2lvdGxiX3BoeXNfdG9fYnVzKHBzdGFydCk7Ci0JYmVuZCA9IHN3aW90bGJfcGh5c190b19idXMocGVuZCk7Ci0KIAlwcmludGsoS0VSTl9JTkZPICJQbGFjaW5nICVsdU1CIHNvZnR3YXJlIElPIFRMQiBiZXR3ZWVuICVwIC0gJXBcbiIsCiAJICAgICAgIGJ5dGVzID4+IDIwLCBpb190bGJfc3RhcnQsIGlvX3RsYl9lbmQpOwotCWlmIChwc3RhcnQgIT0gYnN0YXJ0IHx8IHBlbmQgIT0gYmVuZCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAic29mdHdhcmUgSU8gVExCIGF0IHBoeXMgJSNsbHggLSAlI2xseCIKLQkJICAgICAgICIgYnVzICUjbGx4IC0gJSNsbHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBzdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVuZCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliZW5kKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gInNvZnR3YXJlIElPIFRMQiBhdCBwaHlzICUjbGx4IC0gJSNsbHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBzdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVuZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAic29mdHdhcmUgSU8gVExCIGF0IHBoeXMgJSNsbHggLSAlI2xseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwc3RhcnQsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGVuZCk7CiB9CiAKIC8qCkBAIC0yMTQsNyArMTk3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaW9fdGxiX25zbGFiczsgaSsrKQogIAkJaW9fdGxiX2xpc3RbaV0gPSBJT19UTEJfU0VHU0laRSAtIE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSk7CiAJaW9fdGxiX2luZGV4ID0gMDsKLQlpb190bGJfb3JpZ19hZGRyID0gYWxsb2NfYm9vdG1lbShpb190bGJfbnNsYWJzICogc2l6ZW9mKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkcikpOworCWlvX3RsYl9vcmlnX2FkZHIgPSBhbGxvY19ib290bWVtKGlvX3RsYl9uc2xhYnMgKiBzaXplb2YocGh5c19hZGRyX3QpKTsKIAogCS8qCiAJICogR2V0IHRoZSBvdmVyZmxvdyBlbWVyZ2VuY3kgYnVmZmVyCkBAIC0yODgsMTIgKzI3MSwxNCBAQAogIAkJaW9fdGxiX2xpc3RbaV0gPSBJT19UTEJfU0VHU0laRSAtIE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSk7CiAJaW9fdGxiX2luZGV4ID0gMDsKIAotCWlvX3RsYl9vcmlnX2FkZHIgPSAoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogc2l6ZW9mKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkcikpKTsKKwlpb190bGJfb3JpZ19hZGRyID0gKHBoeXNfYWRkcl90ICopCisJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKgorCQkJCQkgICBzaXplb2YocGh5c19hZGRyX3QpKSk7CiAJaWYgKCFpb190bGJfb3JpZ19hZGRyKQogCQlnb3RvIGNsZWFudXAzOwogCi0JbWVtc2V0KGlvX3RsYl9vcmlnX2FkZHIsIDAsIGlvX3RsYl9uc2xhYnMgKiBzaXplb2Yoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyKSk7CisJbWVtc2V0KGlvX3RsYl9vcmlnX2FkZHIsIDAsIGlvX3RsYl9uc2xhYnMgKiBzaXplb2YocGh5c19hZGRyX3QpKTsKIAogCS8qCiAJICogR2V0IHRoZSBvdmVyZmxvdyBlbWVyZ2VuY3kgYnVmZmVyCkBAIC0zMDgsOCArMjkzLDggQEAKIAlyZXR1cm4gMDsKIAogY2xlYW51cDQ6Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb190bGJfb3JpZ19hZGRyLCBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXIgKikpKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9vcmlnX2FkZHIsCisJCSAgIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSkpOwogCWlvX3RsYl9vcmlnX2FkZHIgPSBOVUxMOwogY2xlYW51cDM6CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb190bGJfbGlzdCwgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKgpAQCAtMzQwLDUxICszMjUsNDQgQEAKIAlyZXR1cm4gYWRkciA+PSBpb190bGJfc3RhcnQgJiYgYWRkciA8IGlvX3RsYl9lbmQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgc3dpb3RsYl9idXNfdG9fcGh5c19hZGRyKGNoYXIgKmRtYV9hZGRyKQorLyoKKyAqIEJvdW5jZTogY29weSB0aGUgc3dpb3RsYiBidWZmZXIgYmFjayB0byB0aGUgb3JpZ2luYWwgZG1hIGxvY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHN3aW90bGJfYm91bmNlKHBoeXNfYWRkcl90IHBoeXMsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlpbnQgaW5kZXggPSAoZG1hX2FkZHIgLSBpb190bGJfc3RhcnQpID4+IElPX1RMQl9TSElGVDsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyID0gaW9fdGxiX29yaWdfYWRkcltpbmRleF07Ci0JYnVmZmVyLm9mZnNldCArPSAobG9uZylkbWFfYWRkciAmICgoMSA8PCBJT19UTEJfU0hJRlQpIC0gMSk7Ci0JYnVmZmVyLnBhZ2UgKz0gYnVmZmVyLm9mZnNldCA+PiBQQUdFX1NISUZUOwotCWJ1ZmZlci5vZmZzZXQgJj0gUEFHRV9TSVpFIC0gMTsKLQlyZXR1cm4gYnVmZmVyOwotfQorCXVuc2lnbmVkIGxvbmcgcGZuID0gUEZOX0RPV04ocGh5cyk7CiAKLXN0YXRpYyB2b2lkCi1fX3N5bmNfc2luZ2xlKHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKLXsKLQlpZiAoUGFnZUhpZ2hNZW0oYnVmZmVyLnBhZ2UpKSB7Ci0JCXNpemVfdCBsZW4sIGJ5dGVzOwotCQljaGFyICpkZXYsICpob3N0LCAqa21wOworCWlmIChQYWdlSGlnaE1lbShwZm5fdG9fcGFnZShwZm4pKSkgeworCQkvKiBUaGUgYnVmZmVyIGRvZXMgbm90IGhhdmUgYSBtYXBwaW5nLiAgTWFwIGl0IGluIGFuZCBjb3B5ICovCisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwaHlzICYgflBBR0VfTUFTSzsKKwkJY2hhciAqYnVmZmVyOworCQl1bnNpZ25lZCBpbnQgc3ogPSAwOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCWxlbiA9IHNpemU7Ci0JCXdoaWxlIChsZW4gIT0gMCkgewotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJd2hpbGUgKHNpemUpIHsKKwkJCXN6ID0gbWluKFBBR0VfU0laRSAtIG9mZnNldCwgc2l6ZSk7CiAKLQkJCWJ5dGVzID0gbGVuOwotCQkJaWYgKChieXRlcyArIGJ1ZmZlci5vZmZzZXQpID4gUEFHRV9TSVpFKQotCQkJCWJ5dGVzID0gUEFHRV9TSVpFIC0gYnVmZmVyLm9mZnNldDsKLQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgLyogcHJvdGVjdHMgS01fQk9VTkNFX1JFQUQgKi8KLQkJCWttcCAgPSBrbWFwX2F0b21pYyhidWZmZXIucGFnZSwgS01fQk9VTkNFX1JFQUQpOwotCQkJZGV2ICA9IGRtYV9hZGRyICsgc2l6ZSAtIGxlbjsKLQkJCWhvc3QgPSBrbXAgKyBidWZmZXIub2Zmc2V0OwotCQkJaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCQkJbWVtY3B5KGhvc3QsIGRldiwgYnl0ZXMpOworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJYnVmZmVyID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UocGZuKSwKKwkJCQkJICAgICBLTV9CT1VOQ0VfUkVBRCk7CisJCQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpCisJCQkJbWVtY3B5KGRtYV9hZGRyLCBidWZmZXIgKyBvZmZzZXQsIHN6KTsKIAkJCWVsc2UKLQkJCQltZW1jcHkoZGV2LCBob3N0LCBieXRlcyk7Ci0JCQlrdW5tYXBfYXRvbWljKGttcCwgS01fQk9VTkNFX1JFQUQpOworCQkJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIGRtYV9hZGRyLCBzeik7CisJCQlrdW5tYXBfYXRvbWljKGJ1ZmZlciwgS01fQk9VTkNFX1JFQUQpOwogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJbGVuIC09IGJ5dGVzOwotCQkJYnVmZmVyLnBhZ2UrKzsKLQkJCWJ1ZmZlci5vZmZzZXQgPSAwOworCisJCQlzaXplIC09IHN6OworCQkJcGZuKys7CisJCQlkbWFfYWRkciArPSBzejsKKwkJCW9mZnNldCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQl2b2lkICp2ID0gcGFnZV9hZGRyZXNzKGJ1ZmZlci5wYWdlKSArIGJ1ZmZlci5vZmZzZXQ7Ci0KIAkJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQotCQkJbWVtY3B5KGRtYV9hZGRyLCB2LCBzaXplKTsKKwkJCW1lbWNweShkbWFfYWRkciwgcGh5c190b192aXJ0KHBoeXMpLCBzaXplKTsKIAkJZWxzZQotCQkJbWVtY3B5KHYsIGRtYV9hZGRyLCBzaXplKTsKKwkJCW1lbWNweShwaHlzX3RvX3ZpcnQocGh5cyksIGRtYV9hZGRyLCBzaXplKTsKIAl9CiB9CiAKQEAgLTM5Miw3ICszNzAsNyBAQAogICogQWxsb2NhdGVzIGJvdW5jZSBidWZmZXIgYW5kIHJldHVybnMgaXRzIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MuCiAgKi8KIHN0YXRpYyB2b2lkICoKLW1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQorbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgcGh5c19hZGRyX3QgcGh5cywgc2l6ZV90IHNpemUsIGludCBkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyICpkbWFfYWRkcjsKQEAgLTQwMiwxMCArMzgwLDkgQEAKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXRfc2xvdHM7CiAJdW5zaWduZWQgbG9uZyBtYXhfc2xvdHM7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIHNsb3RfYnVmOwogCiAJbWFzayA9IGRtYV9nZXRfc2VnX2JvdW5kYXJ5KGh3ZGV2KTsKLQlzdGFydF9kbWFfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaW9fdGxiX3N0YXJ0KSAmIG1hc2s7CisJc3RhcnRfZG1hX2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBpb190bGJfc3RhcnQpICYgbWFzazsKIAogCW9mZnNldF9zbG90cyA9IEFMSUdOKHN0YXJ0X2RtYV9hZGRyLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOwogCkBAIC00ODcsMTUgKzQ2NCwxMCBAQAogCSAqIFRoaXMgaXMgbmVlZGVkIHdoZW4gd2Ugc3luYyB0aGUgbWVtb3J5LiAgVGhlbiB3ZSBzeW5jIHRoZSBidWZmZXIgaWYKIAkgKiBuZWVkZWQuCiAJICovCi0Jc2xvdF9idWYgPSBidWZmZXI7Ci0JZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKSB7Ci0JCXNsb3RfYnVmLnBhZ2UgKz0gc2xvdF9idWYub2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0JCXNsb3RfYnVmLm9mZnNldCAmPSBQQUdFX1NJWkUgLSAxOwotCQlpb190bGJfb3JpZ19hZGRyW2luZGV4K2ldID0gc2xvdF9idWY7Ci0JCXNsb3RfYnVmLm9mZnNldCArPSAxIDw8IElPX1RMQl9TSElGVDsKLQl9CisJZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrKQorCQlpb190bGJfb3JpZ19hZGRyW2luZGV4K2ldID0gcGh5cyArIChpIDw8IElPX1RMQl9TSElGVCk7CiAJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkKLQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJc3dpb3RsYl9ib3VuY2UocGh5cywgZG1hX2FkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogCiAJcmV0dXJuIGRtYV9hZGRyOwogfQpAQCAtNTA5LDE3ICs0ODEsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpLCBjb3VudCwgbnNsb3RzID0gQUxJR04oc2l6ZSwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKIAlpbnQgaW5kZXggPSAoZG1hX2FkZHIgLSBpb190bGJfc3RhcnQpID4+IElPX1RMQl9TSElGVDsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyID0gc3dpb3RsYl9idXNfdG9fcGh5c19hZGRyKGRtYV9hZGRyKTsKKwlwaHlzX2FkZHJfdCBwaHlzID0gaW9fdGxiX29yaWdfYWRkcltpbmRleF07CiAKIAkvKgogCSAqIEZpcnN0LCBzeW5jIHRoZSBtZW1vcnkgYmVmb3JlIHVubWFwcGluZyB0aGUgZW50cnkKIAkgKi8KLQlpZiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8IChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQotCQkvKgotCQkgKiBib3VuY2UuLi4gY29weSB0aGUgZGF0YSBiYWNrIGludG8gdGhlIG9yaWdpbmFsIGJ1ZmZlciAqIGFuZAotCQkgKiBkZWxldGUgdGhlIGJvdW5jZSBidWZmZXIuCi0JCSAqLwotCQlfX3N5bmNfc2luZ2xlKGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKHBoeXMgJiYgKChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB8fCAoZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkpCisJCXN3aW90bGJfYm91bmNlKHBoeXMsIGRtYV9hZGRyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJLyoKIAkgKiBSZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgZnJlZSBsaXN0IGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcKQEAgLTU1MSwxOCArNTE5LDIxIEBACiBzeW5jX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLAogCSAgICBpbnQgZGlyLCBpbnQgdGFyZ2V0KQogewotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIgPSBzd2lvdGxiX2J1c190b19waHlzX2FkZHIoZG1hX2FkZHIpOworCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOworCXBoeXNfYWRkcl90IHBoeXMgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKKworCXBoeXMgKz0gKCh1bnNpZ25lZCBsb25nKWRtYV9hZGRyICYgKCgxIDw8IElPX1RMQl9TSElGVCkgLSAxKSk7CiAKIAlzd2l0Y2ggKHRhcmdldCkgewogCWNhc2UgU1lOQ19GT1JfQ1BVOgogCQlpZiAobGlrZWx5KGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkKLQkJCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCXN3aW90bGJfYm91bmNlKHBoeXMsIGRtYV9hZGRyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQllbHNlCiAJCQlCVUdfT04oZGlyICE9IERNQV9UT19ERVZJQ0UpOwogCQlicmVhazsKIAljYXNlIFNZTkNfRk9SX0RFVklDRToKIAkJaWYgKGxpa2VseShkaXIgPT0gRE1BX1RPX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQotCQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJCXN3aW90bGJfYm91bmNlKHBoeXMsIGRtYV9hZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIAkJZWxzZQogCQkJQlVHX09OKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpOwogCQlicmVhazsKQEAgLTU4NCw3ICs1NTUsOSBAQAogCQlkbWFfbWFzayA9IGh3ZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKIAogCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwotCWlmIChyZXQgJiYgIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfbWFzaywgc3dpb3RsYl92aXJ0X3RvX2J1cyhyZXQpLCBzaXplKSkgeworCWlmIChyZXQgJiYKKwkgICAgIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfbWFzaywgc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgcmV0KSwKKwkJCQkgICBzaXplKSkgewogCQkvKgogCQkgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpc24ndCByZWFjaGFibGUgYnkgdGhlIGRldmljZS4KIAkJICogRmFsbCBiYWNrIG9uIHN3aW90bGJfbWFwX3NpbmdsZSgpLgpAQCAtNTk5LDE2ICs1NzIsMTMgQEAKIAkJICogc3dpb3RsYl9tYXBfc2luZ2xlKCksIHdoaWNoIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbQogCQkgKiB0aGUgbG93ZXN0IGF2YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgogCQkgKi8KLQkJc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlcjsKLQkJYnVmZmVyLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoTlVMTCk7Ci0JCWJ1ZmZlci5vZmZzZXQgPSAwOwotCQlyZXQgPSBtYXBfc2luZ2xlKGh3ZGV2LCBidWZmZXIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCXJldCA9IG1hcF9zaW5nbGUoaHdkZXYsIDAsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJCWlmICghcmV0KQogCQkJcmV0dXJuIE5VTEw7CiAJfQogCiAJbWVtc2V0KHJldCwgMCwgc2l6ZSk7Ci0JZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKHJldCk7CisJZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCByZXQpOwogCiAJLyogQ29uZmlybSBhZGRyZXNzIGNhbiBiZSBETUEnZCBieSBkZXZpY2UgKi8KIAlpZiAoIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfbWFzaywgZGV2X2FkZHIsIHNpemUpKSB7CkBAIC02MjMsNiArNTkzLDcgQEAKIAkqZG1hX2hhbmRsZSA9IGRldl9hZGRyOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfYWxsb2NfY29oZXJlbnQpOwogCiB2b2lkCiBzd2lvdGxiX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKQEAgLTYzNSw2ICs2MDYsNyBAQAogCQkvKiBETUFfVE9fREVWSUNFIHRvIGF2b2lkIG1lbWNweSBpbiB1bm1hcF9zaW5nbGUgKi8KIAkJdW5tYXBfc2luZ2xlKGh3ZGV2LCB2YWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfZnJlZV9jb2hlcmVudCk7CiAKIHN0YXRpYyB2b2lkCiBzd2lvdGxiX2Z1bGwoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgaW50IGRpciwgaW50IGRvX3BhbmljKQpAQCAtNjQ3LDcgKzYxOSw3IEBACiAJICogdGhlIGRhbWFnZSwgb3IgcGFuaWMgd2hlbiB0aGUgdHJhbnNmZXIgaXMgdG9vIGJpZy4KIAkgKi8KIAlwcmludGsoS0VSTl9FUlIgIkRNQTogT3V0IG9mIFNXLUlPTU1VIHNwYWNlIGZvciAlenUgYnl0ZXMgYXQgIgotCSAgICAgICAiZGV2aWNlICVzXG4iLCBzaXplLCBkZXYgPyBkZXYtPmJ1c19pZCA6ICI/Iik7CisJICAgICAgICJkZXZpY2UgJXNcbiIsIHNpemUsIGRldiA/IGRldl9uYW1lKGRldikgOiAiPyIpOwogCiAJaWYgKHNpemUgPiBpb190bGJfb3ZlcmZsb3cgJiYgZG9fcGFuaWMpIHsKIAkJaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKQpAQCAtNjY4LDkgKzY0MCw4IEBACiBzd2lvdGxiX21hcF9zaW5nbGVfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCiAJCQkgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0JZG1hX2FkZHJfdCBkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMocHRyKTsKKwlkbWFfYWRkcl90IGRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgcHRyKTsKIAl2b2lkICptYXA7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlcjsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCS8qCkBAIC02ODUsMTUgKzY1NiwxMyBAQAogCS8qCiAJICogT2ggd2VsbCwgaGF2ZSB0byBhbGxvY2F0ZSBhbmQgbWFwIGEgYm91bmNlIGJ1ZmZlci4KIAkgKi8KLQlidWZmZXIucGFnZSAgID0gdmlydF90b19wYWdlKHB0cik7Ci0JYnVmZmVyLm9mZnNldCA9ICh1bnNpZ25lZCBsb25nKXB0ciAmIH5QQUdFX01BU0s7Ci0JbWFwID0gbWFwX3NpbmdsZShod2RldiwgYnVmZmVyLCBzaXplLCBkaXIpOworCW1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIHZpcnRfdG9fcGh5cyhwdHIpLCBzaXplLCBkaXIpOwogCWlmICghbWFwKSB7CiAJCXN3aW90bGJfZnVsbChod2Rldiwgc2l6ZSwgZGlyLCAxKTsKIAkJbWFwID0gaW9fdGxiX292ZXJmbG93X2J1ZmZlcjsKIAl9CiAKLQlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMobWFwKTsKKwlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIG1hcCk7CiAKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSBhZGRyZXNzIHJldHVybmVkIGlzIERNQSdibGUKQEAgLTcxMCw2ICs2NzksNyBAQAogewogCXJldHVybiBzd2lvdGxiX21hcF9zaW5nbGVfYXR0cnMoaHdkZXYsIHB0ciwgc2l6ZSwgZGlyLCBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2luZ2xlKTsKIAogLyoKICAqIFVubWFwIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbi4gIFRoZSBkbWFfYWRkciBhbmQgc2l6ZSBtdXN0CkBAIC03MzksNiArNzA5LDggQEAKIHsKIAlyZXR1cm4gc3dpb3RsYl91bm1hcF9zaW5nbGVfYXR0cnMoaHdkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFwX3NpbmdsZSk7CisKIC8qCiAgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24KICAqIGFmdGVyIGEgdHJhbnNmZXIuCkBAIC03NjgsNiArNzQwLDcgQEAKIHsKIAlzd2lvdGxiX3N5bmNfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwgZGlyLCBTWU5DX0ZPUl9DUFUpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUpOwogCiB2b2lkCiBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCkBAIC03NzUsNiArNzQ4LDcgQEAKIHsKIAlzd2lvdGxiX3N5bmNfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwgZGlyLCBTWU5DX0ZPUl9ERVZJQ0UpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpOwogCiAvKgogICogU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBhIHN1Yi1yYW5nZSBvZiB0aGUgbWFwcGluZy4KQEAgLTgwMCw2ICs3NzQsNyBAQAogCXN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2UoaHdkZXYsIGRldl9hZGRyLCBvZmZzZXQsIHNpemUsIGRpciwKIAkJCQkgIFNZTkNfRk9SX0NQVSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUpOwogCiB2b2lkCiBzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCkBAIC04MDgsOSArNzgzLDggQEAKIAlzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlKGh3ZGV2LCBkZXZfYWRkciwgb2Zmc2V0LCBzaXplLCBkaXIsCiAJCQkJICBTWU5DX0ZPUl9ERVZJQ0UpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKTsKIAotdm9pZCBzd2lvdGxiX3VubWFwX3NnX2F0dHJzKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwgaW50LAotCQkJICAgIHN0cnVjdCBkbWFfYXR0cnMgKik7CiAvKgogICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZyBtb2RlIGZvciBETUEuCiAgKiBUaGlzIGlzIHRoZSBzY2F0dGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBzd2lvdGxiX21hcF9zaW5nbGUKQEAgLTgzMiwyMCArODA2LDE4IEBACiAJCSAgICAgaW50IGRpciwgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyOwotCWRtYV9hZGRyX3QgZGV2X2FkZHI7CiAJaW50IGk7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlkZXZfYWRkciA9IHN3aW90bGJfc2dfdG9fYnVzKHNnKTsKLQkJaWYgKHJhbmdlX25lZWRzX21hcHBpbmcoc2dfdmlydChzZyksIHNnLT5sZW5ndGgpIHx8CisJCXZvaWQgKmFkZHIgPSBzZ192aXJ0KHNnKTsKKwkJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIGFkZHIpOworCisJCWlmIChyYW5nZV9uZWVkc19tYXBwaW5nKGFkZHIsIHNnLT5sZW5ndGgpIHx8CiAJCSAgICBhZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGRldl9hZGRyLCBzZy0+bGVuZ3RoKSkgewotCQkJdm9pZCAqbWFwOwotCQkJYnVmZmVyLnBhZ2UgICA9IHNnX3BhZ2Uoc2cpOwotCQkJYnVmZmVyLm9mZnNldCA9IHNnLT5vZmZzZXQ7Ci0JCQltYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCBidWZmZXIsIHNnLT5sZW5ndGgsIGRpcik7CisJCQl2b2lkICptYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCBzZ19waHlzKHNnKSwKKwkJCQkJICAgICAgIHNnLT5sZW5ndGgsIGRpcik7CiAJCQlpZiAoIW1hcCkgewogCQkJCS8qIERvbid0IHBhbmljIGhlcmUsIHdlIGV4cGVjdCBtYXBfc2cgdXNlcnMKIAkJCQkgICB0byBkbyBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICovCkBAIC04NTUsNyArODI3LDcgQEAKIAkJCQlzZ2xbMF0uZG1hX2xlbmd0aCA9IDA7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlzZy0+ZG1hX2FkZHJlc3MgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKG1hcCk7CisJCQlzZy0+ZG1hX2FkZHJlc3MgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBtYXApOwogCQl9IGVsc2UKIAkJCXNnLT5kbWFfYWRkcmVzcyA9IGRldl9hZGRyOwogCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CkBAIC04NzAsNiArODQyLDcgQEAKIHsKIAlyZXR1cm4gc3dpb3RsYl9tYXBfc2dfYXR0cnMoaHdkZXYsIHNnbCwgbmVsZW1zLCBkaXIsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zZyk7CiAKIC8qCiAgKiBVbm1hcCBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zLiAgQWdhaW4sIGNwdSByZWFkIHJ1bGVzCkBAIC04ODUsMTEgKzg1OCwxMSBAQAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKSB7Ci0JCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl9zZ190b19idXMoc2cpKQorCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHNnX3ZpcnQoc2cpKSkKIAkJCXVubWFwX3NpbmdsZShod2Rldiwgc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLAogCQkJCSAgICAgc2ctPmRtYV9sZW5ndGgsIGRpcik7CiAJCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCQlkbWFfbWFya19jbGVhbihzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVuZ3RoKTsKKwkJCWRtYV9tYXJrX2NsZWFuKHNnX3ZpcnQoc2cpLCBzZy0+ZG1hX2xlbmd0aCk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFwX3NnX2F0dHJzKTsKQEAgLTkwMCw2ICs4NzMsNyBAQAogewogCXJldHVybiBzd2lvdGxiX3VubWFwX3NnX2F0dHJzKGh3ZGV2LCBzZ2wsIG5lbGVtcywgZGlyLCBOVUxMKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zZyk7CiAKIC8qCiAgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zCkBAIC05MTgsMTEgKzg5MiwxMSBAQAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKSB7Ci0JCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl9zZ190b19idXMoc2cpKQorCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHNnX3ZpcnQoc2cpKSkKIAkJCXN5bmNfc2luZ2xlKGh3ZGV2LCBzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksCiAJCQkJICAgIHNnLT5kbWFfbGVuZ3RoLCBkaXIsIHRhcmdldCk7CiAJCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCQlkbWFfbWFya19jbGVhbihzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVuZ3RoKTsKKwkJCWRtYV9tYXJrX2NsZWFuKHNnX3ZpcnQoc2cpLCBzZy0+ZG1hX2xlbmd0aCk7CiAJfQogfQogCkBAIC05MzIsNiArOTA2LDcgQEAKIHsKIAlzd2lvdGxiX3N5bmNfc2coaHdkZXYsIHNnLCBuZWxlbXMsIGRpciwgU1lOQ19GT1JfQ1BVKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUpOwogCiB2b2lkCiBzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKQEAgLTkzOSwxMiArOTE0LDE0IEBACiB7CiAJc3dpb3RsYl9zeW5jX3NnKGh3ZGV2LCBzZywgbmVsZW1zLCBkaXIsIFNZTkNfRk9SX0RFVklDRSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKTsKIAogaW50CiBzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewotCXJldHVybiAoZG1hX2FkZHIgPT0gc3dpb3RsYl92aXJ0X3RvX2J1cyhpb190bGJfb3ZlcmZsb3dfYnVmZmVyKSk7CisJcmV0dXJuIChkbWFfYWRkciA9PSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBpb190bGJfb3ZlcmZsb3dfYnVmZmVyKSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IpOwogCiAvKgogICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGRldmljZSBETUEgYWRkcmVzcyBtYXNrIGNhbiBiZSBzdXBwb3J0ZWQKQEAgLTk1NSwyMCArOTMyLDYgQEAKIGludAogc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzaykKIHsKLQlyZXR1cm4gc3dpb3RsYl92aXJ0X3RvX2J1cyhpb190bGJfZW5kIC0gMSkgPD0gbWFzazsKKwlyZXR1cm4gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgaW9fdGxiX2VuZCAtIDEpIDw9IG1hc2s7CiB9Ci0KLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zZ19mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9hbGxvY19jb2hlcmVudCk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfZnJlZV9jb2hlcmVudCk7CiBFWFBPUlRfU1lNQk9MKHN3aW90bGJfZG1hX3N1cHBvcnRlZCk7CmRpZmYgLS1naXQgYS9saWIvdnNwcmludGYuYyBiL2xpYi92c3ByaW50Zi5jCmluZGV4IDk4ZDYzMjIuLjBmYmQwMTIgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC0xNzAsNiArMTcwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgJnRhaWwsIGJhc2UpOworCWlmICh0YWlsID09IGNwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKCp0YWlsID09ICdcMCcpIHx8CiAJCSgobGVuID09IChzaXplX3QpKHRhaWwgLSBjcCkgKyAxKSAmJiAoKnRhaWwgPT0gJ1xuJykpKSB7CiAJCSpyZXMgPSB2YWw7CkBAIC0yNDEsNiArMjQzLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bGwoY3AsICZ0YWlsLCBiYXNlKTsKKwlpZiAodGFpbCA9PSBjcCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAogCQkoKGxlbiA9PSAoc2l6ZV90KSh0YWlsIC0gY3ApICsgMSkgJiYgKCp0YWlsID09ICdcbicpKSkgewogCQkqcmVzID0gdmFsOwpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggNWI1NzkwZi4uYTViNzc4MSAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xODEsMTIgKzE4MSw2IEBACiAJICBleGFtcGxlIG9uIE5VTUEgc3lzdGVtcyB0byBwdXQgcGFnZXMgbmVhcmVyIHRvIHRoZSBwcm9jZXNzb3JzIGFjY2Vzc2luZwogCSAgdGhlIHBhZ2UuCiAKLWNvbmZpZyBSRVNPVVJDRVNfNjRCSVQKLQlib29sICI2NCBiaXQgTWVtb3J5IGFuZCBJTyByZXNvdXJjZXMgKEVYUEVSSU1FTlRBTCkiIGlmICghNjRCSVQgJiYgRVhQRVJJTUVOVEFMKQotCWRlZmF1bHQgNjRCSVQKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhbGxvd3MgbWVtb3J5IGFuZCBJTyByZXNvdXJjZXMgdG8gYmUgNjQgYml0LgotCiBjb25maWcgUEhZU19BRERSX1RfNjRCSVQKIAlkZWZfYm9vbCA2NEJJVCB8fCBBUkNIX1BIWVNfQUREUl9UXzY0QklUCiAKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggNTFjMjc3MC4uNzIyNTViZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiAKIG9iai15CQkJOj0gYm9vdG1lbS5vIGZpbGVtYXAubyBtZW1wb29sLm8gb29tX2tpbGwubyBmYWR2aXNlLm8gXAogCQkJICAgbWFjY2Vzcy5vIHBhZ2VfYWxsb2MubyBwYWdlLXdyaXRlYmFjay5vIHBkZmx1c2gubyBcCi0JCQkgICByZWFkYWhlYWQubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBcCisJCQkgICByZWFkYWhlYWQubyBzd2FwLm8gdHJ1bmNhdGUubyB2bXNjYW4ubyBzaG1lbS5vIFwKIAkJCSAgIHByaW9fdHJlZS5vIHV0aWwubyBtbXpvbmUubyB2bXN0YXQubyBiYWNraW5nLWRldi5vIFwKIAkJCSAgIHBhZ2VfaXNvbGF0aW9uLm8gbW1faW5pdC5vICQobW11LXkpCiAKQEAgLTIxLDkgKzIxLDcgQEAKIG9iai0kKENPTkZJR19OVU1BKSAJKz0gbWVtcG9saWN5Lm8KIG9iai0kKENPTkZJR19TUEFSU0VNRU0pCSs9IHNwYXJzZS5vCiBvYmotJChDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVApICs9IHNwYXJzZS12bWVtbWFwLm8KLW9iai0kKENPTkZJR19TSE1FTSkgKz0gc2htZW0ubwogb2JqLSQoQ09ORklHX1RNUEZTX1BPU0lYX0FDTCkgKz0gc2htZW1fYWNsLm8KLW9iai0kKENPTkZJR19USU5ZX1NITUVNKSArPSB0aW55LXNobWVtLm8KIG9iai0kKENPTkZJR19TTE9CKSArPSBzbG9iLm8KIG9iai0kKENPTkZJR19NTVVfTk9USUZJRVIpICs9IG1tdV9ub3RpZmllci5vCiBvYmotJChDT05GSUdfU0xBQikgKz0gc2xhYi5vCmRpZmYgLS1naXQgYS9tbS9iYWNraW5nLWRldi5jIGIvbW0vYmFja2luZy1kZXYuYwppbmRleCA4MDFjMDhiLi44ZTg1ODc0IDEwMDY0NAotLS0gYS9tbS9iYWNraW5nLWRldi5jCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTI0LDkgKzI0LDkgQEAKIHN0YXRpYyBpbnQgYmRpX2RlYnVnX3N0YXRzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtLT5wcml2YXRlOwotCWxvbmcgYmFja2dyb3VuZF90aHJlc2g7Ci0JbG9uZyBkaXJ0eV90aHJlc2g7Ci0JbG9uZyBiZGlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoOwogCiAJZ2V0X2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gsICZiZGlfdGhyZXNoLCBiZGkpOwogCkBAIC0yMjMsNyArMjIzLDcgQEAKIAliZGktPm1heF9wcm9wX2ZyYWMgPSBQUk9QX0ZSQUNfQkFTRTsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9CRElfU1RBVF9JVEVNUzsgaSsrKSB7Ci0JCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKCZiZGktPmJkaV9zdGF0W2ldLCAwKTsKKwkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmYmRpLT5iZGlfc3RhdFtpXSwgMCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycjsKIAl9CmRpZmYgLS1naXQgYS9tbS9ib290bWVtLmMgYi9tbS9ib290bWVtLmMKaW5kZXggYWM1YTg5MS4uNTFhMGNjZiAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtNDM1LDYgKzQzNSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmFsbGJhY2sgPSAwOwogCXVuc2lnbmVkIGxvbmcgbWluLCBtYXgsIHN0YXJ0LCBzaWR4LCBtaWR4LCBzdGVwOwogCisJYmRlYnVnKCJuaWQ9JXRkIHNpemU9JWx4IFslbHUgcGFnZXNdIGFsaWduPSVseCBnb2FsPSVseCBsaW1pdD0lbHhcbiIsCisJCWJkYXRhIC0gYm9vdG1lbV9ub2RlX2RhdGEsIHNpemUsIFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCwKKwkJYWxpZ24sIGdvYWwsIGxpbWl0KTsKKwogCUJVR19PTighc2l6ZSk7CiAJQlVHX09OKGFsaWduICYgKGFsaWduIC0gMSkpOwogCUJVR19PTihsaW1pdCAmJiBnb2FsICsgc2l6ZSA+IGxpbWl0KTsKQEAgLTQ0MiwxMCArNDQ2LDYgQEAKIAlpZiAoIWJkYXRhLT5ub2RlX2Jvb3RtZW1fbWFwKQogCQlyZXR1cm4gTlVMTDsKIAotCWJkZWJ1ZygibmlkPSV0ZCBzaXplPSVseCBbJWx1IHBhZ2VzXSBhbGlnbj0lbHggZ29hbD0lbHggbGltaXQ9JWx4XG4iLAotCQliZGF0YSAtIGJvb3RtZW1fbm9kZV9kYXRhLCBzaXplLCBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQsCi0JCWFsaWduLCBnb2FsLCBsaW1pdCk7Ci0KIAltaW4gPSBiZGF0YS0+bm9kZV9taW5fcGZuOwogCW1heCA9IGJkYXRhLT5ub2RlX2xvd19wZm47CiAKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBmNTc2OWI0Li4yZjU1YTFlIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CiAJCS5zeW5jX21vZGUgPSBzeW5jX21vZGUsCi0JCS5ucl90b193cml0ZSA9IG1hcHBpbmctPm5ycGFnZXMgKiAyLAorCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKIAkJLnJhbmdlX3N0YXJ0ID0gc3RhcnQsCiAJCS5yYW5nZV9lbmQgPSBlbmQsCiAJfTsKQEAgLTc0MSw3ICs3NDEsMTQgQEAKIAkJcGFnZSA9IF9fcGFnZV9jYWNoZV9hbGxvYyhnZnBfbWFzayk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiBOVUxMOwotCQllcnIgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIGdmcF9tYXNrKTsKKwkJLyoKKwkJICogV2Ugd2FudCBhIHJlZ3VsYXIga2VybmVsIG1lbW9yeSAobm90IGhpZ2htZW0gb3IgRE1BIGV0YykKKwkJICogYWxsb2NhdGlvbiBmb3IgdGhlIHJhZGl4IHRyZWUgbm9kZXMsIGJ1dCB3ZSBuZWVkIHRvIGhvbm91cgorCQkgKiB0aGUgY29udGV4dC1zcGVjaWZpYyByZXF1aXJlbWVudHMgdGhlIGNhbGxlciBoYXMgYXNrZWQgZm9yLgorCQkgKiBHRlBfUkVDTEFJTV9NQVNLIGNvbGxlY3RzIHRob3NlIHJlcXVpcmVtZW50cy4KKwkJICovCisJCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCShnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCXBhZ2UgPSBOVUxMOwpAQCAtOTUwLDcgKzk1Nyw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlwYWdlID0gX19wYWdlX2NhY2hlX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJiB+X19HRlBfRlMpOwotCWlmIChwYWdlICYmIGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAocGFnZSAmJiBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKSkgewogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBOVUxMOwogCX0KQEAgLTEzMTcsNyArMTMyNCw4IEBACiAJCQlnb3RvIG91dDsgLyogc2tpcCBhdGltZSAqLwogCQlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCQlpZiAocG9zIDwgc2l6ZSkgewotCQkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChtYXBwaW5nKTsKKwkJCXJldHZhbCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLAorCQkJCQlwb3MgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncykgLSAxKTsKIAkJCWlmICghcmV0dmFsKSB7CiAJCQkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhSRUFELCBpb2NiLAogCQkJCQkJCWlvdiwgcG9zLCBucl9zZWdzKTsKQEAgLTE1MzAsNyArMTUzOCw2IEBACiAJLyoKIAkgKiBGb3VuZCB0aGUgcGFnZSBhbmQgaGF2ZSBhIHJlZmVyZW5jZSBvbiBpdC4KIAkgKi8KLQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJcmEtPnByZXZfcG9zID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIHJldCB8IFZNX0ZBVUxUX0xPQ0tFRDsKQEAgLTIwNjAsMTggKzIwNjcsMTAgQEAKIAlpZiAoY291bnQgIT0gb2NvdW50KQogCQkqbnJfc2VncyA9IGlvdl9zaG9ydGVuKChzdHJ1Y3QgaW92ZWMgKilpb3YsICpucl9zZWdzLCBjb3VudCk7CiAKLQkvKgotCSAqIFVubWFwIGFsbCBtbWFwcGluZ3Mgb2YgdGhlIGZpbGUgdXAtZnJvbnQuCi0JICoKLQkgKiBUaGlzIHdpbGwgY2F1c2UgYW55IHB0ZSBkaXJ0eSBiaXRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUKLQkgKiBwYWdlZnJhbWVzIGZvciB0aGUgc3Vic2VxdWVudCBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KCkuCi0JICovCiAJd3JpdGVfbGVuID0gaW92X2xlbmd0aChpb3YsICpucl9zZWdzKTsKIAllbmQgPSAocG9zICsgd3JpdGVfbGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAobWFwcGluZ19tYXBwZWQobWFwcGluZykpCi0JCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgcG9zLCB3cml0ZV9sZW4sIDApOwogCi0Jd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQobWFwcGluZyk7CisJd3JpdHRlbiA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLCBwb3MgKyB3cml0ZV9sZW4gLSAxKTsKIAlpZiAod3JpdHRlbikKIAkJZ290byBvdXQ7CiAKQEAgLTIyOTEsNyArMjI5MCw4IEBACiAJICogdGhlIGZpbGUgZGF0YSBoZXJlLCB0byB0cnkgdG8gaG9ub3VyIE9fRElSRUNUIGV4cGVjdGF0aW9ucy4KIAkgKi8KIAlpZiAodW5saWtlbHkoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSAmJiB3cml0dGVuKQotCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCQlzdGF0dXMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsCisJCQkJCXBvcywgcG9zICsgd3JpdHRlbiAtIDEpOwogCiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggYjUxNjdkZi4uMGMwNDYxNSAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcF94aXAuYworKysgYi9tbS9maWxlbWFwX3hpcC5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJCS8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovCiAJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbigqcHRlKSk7CiAJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHJlc3MsIHB0ZSk7Ci0JCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAkJCUJVR19PTihwdGVfZGlydHkocHRldmFsKSk7CiAJCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKZGlmZiAtLWdpdCBhL21tL2ZyZW1hcC5jIGIvbW0vZnJlbWFwLmMKaW5kZXggN2QxMmNhNy4uNjJkNWJiZCAxMDA2NDQKLS0tIGEvbW0vZnJlbWFwLmMKKysrIGIvbW0vZnJlbWFwLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJaWYgKHBhZ2UpIHsKIAkJCWlmIChwdGVfZGlydHkocHRlKSkKIAkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQl1cGRhdGVfaGl3YXRlcl9yc3MobW0pOwogCQkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCA2MDU4YjUzLi42MThlOTgzIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0yMjAsNiArMjIwLDM1IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhZ2VzIGFsbG9jYXRlZCB3aGVuIGJhY2tpbmcgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogY2FzZXMgdGhpcyB3aWxsIGJlIHNhbWUgc2l6ZSBhcyB1c2VkIGJ5IHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdm1hX2tlcm5lbF9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaHN0YXRlICpoc3RhdGU7CisKKwlpZiAoIWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQorCQlyZXR1cm4gUEFHRV9TSVpFOworCisJaHN0YXRlID0gaHN0YXRlX3ZtYSh2bWEpOworCisJcmV0dXJuIDFVTCA8PCAoaHN0YXRlLT5vcmRlciArIFBBR0VfU0hJRlQpOworfQorCisvKgorICogUmV0dXJuIHRoZSBwYWdlIHNpemUgYmVpbmcgdXNlZCBieSB0aGUgTU1VIHRvIGJhY2sgYSBWTUEuIEluIHRoZSBtYWpvcml0eQorICogb2YgY2FzZXMsIHRoZSBwYWdlIHNpemUgdXNlZCBieSB0aGUga2VybmVsIG1hdGNoZXMgdGhlIE1NVSBzaXplLiBPbgorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSBpdCBkaWZmZXJzLCBhbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzCisgKiBmdW5jdGlvbiBpcyByZXF1aXJlZC4KKyAqLworI2lmbmRlZiB2bWFfbW11X3BhZ2VzaXplCit1bnNpZ25lZCBsb25nIHZtYV9tbXVfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHZtYV9rZXJuZWxfcGFnZXNpemUodm1hKTsKK30KKyNlbmRpZgorCisvKgogICogRmxhZ3MgZm9yIE1BUF9QUklWQVRFIHJlc2VydmF0aW9ucy4gIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJvdHRvbQogICogYml0cyBvZiB0aGUgcmVzZXJ2YXRpb24gbWFwIHBvaW50ZXIsIHdoaWNoIGFyZSBhbHdheXMgY2xlYXIgZHVlIHRvCiAgKiBhbGlnbm1lbnQuCkBAIC0zNzEsOCArNDAwLDEwIEBACiB7CiAJaW50IGk7CiAKLQlpZiAodW5saWtlbHkoc3ogPiBNQVhfT1JERVJfTlJfUEFHRVMpKQotCQlyZXR1cm4gY2xlYXJfZ2lnYW50aWNfcGFnZShwYWdlLCBhZGRyLCBzeik7CisJaWYgKHVubGlrZWx5KHN6ID4gTUFYX09SREVSX05SX1BBR0VTKSkgeworCQljbGVhcl9naWdhbnRpY19wYWdlKHBhZ2UsIGFkZHIsIHN6KTsKKwkJcmV0dXJuOworCX0KIAogCW1pZ2h0X3NsZWVwKCk7CiAJZm9yIChpID0gMDsgaSA8IHN6L1BBR0VfU0laRTsgaSsrKSB7CkBAIC00MDQsOCArNDM1LDEwIEBACiAJaW50IGk7CiAJc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKIAotCWlmICh1bmxpa2VseShwYWdlc19wZXJfaHVnZV9wYWdlKGgpID4gTUFYX09SREVSX05SX1BBR0VTKSkKLQkJcmV0dXJuIGNvcHlfZ2lnYW50aWNfcGFnZShkc3QsIHNyYywgYWRkciwgdm1hKTsKKwlpZiAodW5saWtlbHkocGFnZXNfcGVyX2h1Z2VfcGFnZShoKSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKKwkJY29weV9naWdhbnRpY19wYWdlKGRzdCwgc3JjLCBhZGRyLCB2bWEpOworCQlyZXR1cm47CisJfQogCiAJbWlnaHRfc2xlZXAoKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXNfcGVyX2h1Z2VfcGFnZShoKTsgaSsrKSB7CkBAIC05NzIsNyArMTAwNSw3IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKLV9fYXR0cmlidXRlX18oKHdlYWspKSBpbnQgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKK2ludCBfX3dlYWsgYWxsb2NfYm9vdG1lbV9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKIHsKIAlzdHJ1Y3QgaHVnZV9ib290bWVtX3BhZ2UgKm07CiAJaW50IG5yX25vZGVzID0gbm9kZXNfd2VpZ2h0KG5vZGVfb25saW5lX21hcCk7CkBAIC05OTEsOCArMTAyNCw3IEBACiAJCQkgKiBwdXRzIHRoZW0gaW50byB0aGUgbWVtX21hcCkuCiAJCQkgKi8KIAkJCW0gPSBhZGRyOwotCQkJaWYgKG0pCi0JCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gZm91bmQ7CiAJCX0KIAkJaHN0YXRlX25leHRfbm9kZShoKTsKIAkJbnJfbm9kZXMtLTsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDEzMzMzYmMuLjQ3ODIyM2IgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtNDksNiArNDksNyBAQAogLyoKICAqIGluIG1tL3BhZ2VfYWxsb2MuYwogICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm47CiBleHRlcm4gdm9pZCBfX2ZyZWVfcGFnZXNfYm9vdG1lbShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IG9yZGVyKTsKIAogLyoKQEAgLTI3NSw2ICsyNzYsNyBAQAogI2RlZmluZSBHVVBfRkxBR1NfV1JJVEUgICAgICAgICAgICAgICAgICAweDEKICNkZWZpbmUgR1VQX0ZMQUdTX0ZPUkNFICAgICAgICAgICAgICAgICAgMHgyCiAjZGVmaW5lIEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TIDB4NAorI2RlZmluZSBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEwgICAgICAgICAweDgKIAogaW50IF9fZ2V0X3VzZXJfcGFnZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGludCBsZW4sIGludCBmbGFncywKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCA4NjZkY2M3Li41MWVlOTY1IDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC03NzksNyArNzc5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1lbV9jZ3JvdXBfcmVzaXplX2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCiB7CiAKIAlpbnQgcmV0cnlfY291bnQgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggN2I5ZGI2NS4uM2Y4ZmEwNiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTUyLDYgKzUyLDkgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01OSw5ICs2Miw2IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLQogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpZm5kZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMKQEAgLTM3NSwxNSArMzc1LDY1IEBACiAgKgogICogVGhlIGNhbGxpbmcgZnVuY3Rpb24gbXVzdCBzdGlsbCBoYW5kbGUgdGhlIGVycm9yLgogICovCi1zdGF0aWMgdm9pZCBwcmludF9iYWRfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCBwdGUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIpCitzdGF0aWMgdm9pZCBwcmludF9iYWRfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgIHB0ZV90IHB0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcHJpbnRrKEtFUk5fRVJSICJCYWQgcHRlID0gJTA4bGx4LCBwcm9jZXNzID0gJXMsICIKLQkJCSJ2bV9mbGFncyA9ICVseCwgdmFkZHIgPSAlbHhcbiIsCi0JCShsb25nIGxvbmcpcHRlX3ZhbChwdGUpLAotCQkodm1hLT52bV9tbSA9PSBjdXJyZW50LT5tbSA/IGN1cnJlbnQtPmNvbW0gOiAiPz8/IiksCi0JCXZtYS0+dm1fZmxhZ3MsIHZhZGRyKTsKKwlwZ2RfdCAqcGdkID0gcGdkX29mZnNldCh2bWEtPnZtX21tLCBhZGRyKTsKKwlwdWRfdCAqcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJcGdvZmZfdCBpbmRleDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyByZXN1bWU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfc2hvd247CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbnJfdW5zaG93bjsKKworCS8qCisJICogQWxsb3cgYSBidXJzdCBvZiA2MCByZXBvcnRzLCB0aGVuIGtlZXAgcXVpZXQgZm9yIHRoYXQgbWludXRlOworCSAqIG9yIGFsbG93IGEgc3RlYWR5IGRyaXAgb2Ygb25lIHJlcG9ydCBwZXIgc2Vjb25kLgorCSAqLworCWlmIChucl9zaG93biA9PSA2MCkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcmVzdW1lKSkgeworCQkJbnJfdW5zaG93bisrOworCQkJcmV0dXJuOworCQl9CisJCWlmIChucl91bnNob3duKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJCSJCVUc6IEJhZCBwYWdlIG1hcDogJWx1IG1lc3NhZ2VzIHN1cHByZXNzZWRcbiIsCisJCQkJbnJfdW5zaG93bik7CisJCQlucl91bnNob3duID0gMDsKKwkJfQorCQlucl9zaG93biA9IDA7CisJfQorCWlmIChucl9zaG93bisrID09IDApCisJCXJlc3VtZSA9IGppZmZpZXMgKyA2MCAqIEhaOworCisJbWFwcGluZyA9IHZtYS0+dm1fZmlsZSA/IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nIDogTlVMTDsKKwlpbmRleCA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgYWRkcik7CisKKwlwcmludGsoS0VSTl9BTEVSVAorCQkiQlVHOiBCYWQgcGFnZSBtYXAgaW4gcHJvY2VzcyAlcyAgcHRlOiUwOGxseCBwbWQ6JTA4bGx4XG4iLAorCQljdXJyZW50LT5jb21tLAorCQkobG9uZyBsb25nKXB0ZV92YWwocHRlKSwgKGxvbmcgbG9uZylwbWRfdmFsKCpwbWQpKTsKKwlpZiAocGFnZSkgeworCQlwcmludGsoS0VSTl9BTEVSVAorCQkicGFnZTolcCBmbGFnczolcCBjb3VudDolZCBtYXBjb3VudDolZCBtYXBwaW5nOiVwIGluZGV4OiVseFxuIiwKKwkJcGFnZSwgKHZvaWQgKilwYWdlLT5mbGFncywgcGFnZV9jb3VudChwYWdlKSwKKwkJcGFnZV9tYXBjb3VudChwYWdlKSwgcGFnZS0+bWFwcGluZywgcGFnZS0+aW5kZXgpOworCX0KKwlwcmludGsoS0VSTl9BTEVSVAorCQkiYWRkcjolcCB2bV9mbGFnczolMDhseCBhbm9uX3ZtYTolcCBtYXBwaW5nOiVwIGluZGV4OiVseFxuIiwKKwkJKHZvaWQgKilhZGRyLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPmFub25fdm1hLCBtYXBwaW5nLCBpbmRleCk7CisJLyoKKwkgKiBDaG9vc2UgdGV4dCBiZWNhdXNlIGRhdGEgc3ltYm9scyBkZXBlbmQgb24gQ09ORklHX0tBTExTWU1TX0FMTD15CisJICovCisJaWYgKHZtYS0+dm1fb3BzKQorCQlwcmludF9zeW1ib2woS0VSTl9BTEVSVCAidm1hLT52bV9vcHMtPmZhdWx0OiAlc1xuIiwKKwkJCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX29wcy0+ZmF1bHQpOworCWlmICh2bWEtPnZtX2ZpbGUgJiYgdm1hLT52bV9maWxlLT5mX29wKQorCQlwcmludF9zeW1ib2woS0VSTl9BTEVSVCAidm1hLT52bV9maWxlLT5mX29wLT5tbWFwOiAlc1xuIiwKKwkJCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXApOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfQkFEX1BBR0UpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19jb3dfbWFwcGluZyh1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC00NDEsMjEgKzQ5MSwxOCBAQAogc3RydWN0IHBhZ2UgKnZtX25vcm1hbF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJcHRlX3QgcHRlKQogewotCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOwogCiAJaWYgKEhBVkVfUFRFX1NQRUNJQUwpIHsKLQkJaWYgKGxpa2VseSghcHRlX3NwZWNpYWwocHRlKSkpIHsKLQkJCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOwotCQkJcmV0dXJuIHB0ZV9wYWdlKHB0ZSk7Ci0JCX0KLQkJVk1fQlVHX09OKCEodm1hLT52bV9mbGFncyAmIChWTV9QRk5NQVAgfCBWTV9NSVhFRE1BUCkpKTsKKwkJaWYgKGxpa2VseSghcHRlX3NwZWNpYWwocHRlKSkpCisJCQlnb3RvIGNoZWNrX3BmbjsKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9QRk5NQVAgfCBWTV9NSVhFRE1BUCkpKQorCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZSwgTlVMTCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qICFIQVZFX1BURV9TUEVDSUFMIGNhc2UgZm9sbG93czogKi8KIAotCXBmbiA9IHB0ZV9wZm4ocHRlKTsKLQogCWlmICh1bmxpa2VseSh2bWEtPnZtX2ZsYWdzICYgKFZNX1BGTk1BUHxWTV9NSVhFRE1BUCkpKSB7CiAJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTUlYRURNQVApIHsKIAkJCWlmICghcGZuX3ZhbGlkKHBmbikpCkBAIC00NzEsMTEgKzUxOCwxNCBAQAogCQl9CiAJfQogCi0JVk1fQlVHX09OKCFwZm5fdmFsaWQocGZuKSk7CitjaGVja19wZm46CisJaWYgKHVubGlrZWx5KHBmbiA+IGhpZ2hlc3RfbWVtbWFwX3BmbikpIHsKKwkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZSwgTlVMTCk7CisJCXJldHVybiBOVUxMOworCX0KIAogCS8qCiAJICogTk9URSEgV2Ugc3RpbGwgaGF2ZSBQYWdlUmVzZXJ2ZWQoKSBwYWdlcyBpbiB0aGUgcGFnZSB0YWJsZXMuCi0JICoKIAkgKiBlZy4gVkRTTyBtYXBwaW5ncyBjYW4gY2F1c2UgdGhlbSB0byBleGlzdC4KIAkgKi8KIG91dDoKQEAgLTc2NywxMSArODE3LDE0IEBACiAJCQllbHNlIHsKIAkJCQlpZiAocHRlX2RpcnR5KHB0ZW50KSkKIAkJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0JCQkJaWYgKHB0ZV95b3VuZyhwdGVudCkpCi0JCQkJCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOworCQkJCWlmIChwdGVfeW91bmcocHRlbnQpICYmCisJCQkJICAgIGxpa2VseSghVk1fU2VxdWVudGlhbFJlYWRIaW50KHZtYSkpKQorCQkJCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJCQkJZmlsZV9yc3MtLTsKIAkJCX0KLQkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CisJCQlpZiAodW5saWtlbHkocGFnZV9tYXBjb3VudChwYWdlKSA8IDApKQorCQkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGVudCwgcGFnZSk7CiAJCQl0bGJfcmVtb3ZlX3BhZ2UodGxiLCBwYWdlKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03ODEsOCArODM0LDEyIEBACiAJCSAqLwogCQlpZiAodW5saWtlbHkoZGV0YWlscykpCiAJCQljb250aW51ZTsKLQkJaWYgKCFwdGVfZmlsZShwdGVudCkpCi0JCQlmcmVlX3N3YXBfYW5kX2NhY2hlKHB0ZV90b19zd3BfZW50cnkocHRlbnQpKTsKKwkJaWYgKHB0ZV9maWxlKHB0ZW50KSkgeworCQkJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX05PTkxJTkVBUikpKQorCQkJCXByaW50X2JhZF9wdGUodm1hLCBhZGRyLCBwdGVudCwgTlVMTCk7CisJCX0gZWxzZSBpZgorCQkgICh1bmxpa2VseSghZnJlZV9zd2FwX2FuZF9jYWNoZShwdGVfdG9fc3dwX2VudHJ5KHB0ZW50KSkpKQorCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZW50LCBOVUxMKTsKIAkJcHRlX2NsZWFyX25vdF9wcmVzZW50X2Z1bGwobW0sIGFkZHIsIHB0ZSwgdGxiLT5mdWxsbW0pOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgKGFkZHIgIT0gZW5kICYmICp6YXBfd29yayA+IDApKTsKIApAQCAtMTE1Myw2ICsxMjEwLDcgQEAKIAlpbnQgd3JpdGUgPSAhIShmbGFncyAmIEdVUF9GTEFHU19XUklURSk7CiAJaW50IGZvcmNlID0gISEoZmxhZ3MgJiBHVVBfRkxBR1NfRk9SQ0UpOwogCWludCBpZ25vcmUgPSAhIShmbGFncyAmIEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TKTsKKwlpbnQgaWdub3JlX3NpZ2tpbGwgPSAhIShmbGFncyAmIEdVUF9GTEFHU19JR05PUkVfU0lHS0lMTCk7CiAKIAlpZiAobGVuIDw9IDApCiAJCXJldHVybiAwOwpAQCAtMTIzMSwxMiArMTI4OSwxNSBAQAogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAkJCS8qCi0JCQkgKiBJZiB0c2sgaXMgb29taW5nLCBjdXQgb2ZmIGl0cyBhY2Nlc3MgdG8gbGFyZ2UgbWVtb3J5Ci0JCQkgKiBhbGxvY2F0aW9ucy4gSXQgaGFzIGEgcGVuZGluZyBTSUdLSUxMLCBidXQgaXQgY2FuJ3QKLQkJCSAqIGJlIHByb2Nlc3NlZCB1bnRpbCByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4KKwkJCSAqIElmIHdlIGhhdmUgYSBwZW5kaW5nIFNJR0tJTEwsIGRvbid0IGtlZXAgZmF1bHRpbmcKKwkJCSAqIHBhZ2VzIGFuZCBwb3RlbnRpYWxseSBhbGxvY2F0aW5nIG1lbW9yeSwgdW5sZXNzCisJCQkgKiBjdXJyZW50IGlzIGhhbmRsaW5nIG11bmxvY2stLWUuZy4sIG9uIGV4aXQuIEluCisJCQkgKiB0aGF0IGNhc2UsIHdlIGFyZSBub3QgYWxsb2NhdGluZyBtZW1vcnkuICBSYXRoZXIsCisJCQkgKiB3ZSdyZSBvbmx5IHVubG9ja2luZyBhbHJlYWR5IHJlc2lkZW50L21hcHBlZCBwYWdlcy4KIAkJCSAqLwotCQkJaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX01FTURJRSkpKQotCQkJCXJldHVybiBpID8gaSA6IC1FTk9NRU07CisJCQlpZiAodW5saWtlbHkoIWlnbm9yZV9zaWdraWxsICYmCisJCQkJCWZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSkKKwkJCQlyZXR1cm4gaSA/IGkgOiAtRVJFU1RBUlRTWVM7CiAKIAkJCWlmICh3cml0ZSkKIAkJCQlmb2xsX2ZsYWdzIHw9IEZPTExfV1JJVEU7CkBAIC0xMjYzLDkgKzEzMjQsMTUgQEAKIAkJCQkgKiBkb193cF9wYWdlIGhhcyBicm9rZW4gQ09XIHdoZW4gbmVjZXNzYXJ5LAogCQkJCSAqIGV2ZW4gaWYgbWF5YmVfbWt3cml0ZSBkZWNpZGVkIG5vdCB0byBzZXQKIAkJCQkgKiBwdGVfd3JpdGUuIFdlIGNhbiB0aHVzIHNhZmVseSBkbyBzdWJzZXF1ZW50Ci0JCQkJICogcGFnZSBsb29rdXBzIGFzIGlmIHRoZXkgd2VyZSByZWFkcy4KKwkJCQkgKiBwYWdlIGxvb2t1cHMgYXMgaWYgdGhleSB3ZXJlIHJlYWRzLiBCdXQgb25seQorCQkJCSAqIGRvIHNvIHdoZW4gbG9vcGluZyBmb3IgcHRlX3dyaXRlIGlzIGZ1dGlsZToKKwkJCQkgKiBpbiBzb21lIGNhc2VzIHVzZXJzcGFjZSBtYXkgYWxzbyBiZSB3YW50aW5nCisJCQkJICogdG8gd3JpdGUgdG8gdGhlIGdvdHRlbiB1c2VyIHBhZ2UsIHdoaWNoIGEKKwkJCQkgKiByZWFkIGZhdWx0IGhlcmUgbWlnaHQgcHJldmVudCAoYSByZWFkb25seQorCQkJCSAqIHBhZ2UgbWlnaHQgZ2V0IHJlQ09XZWQgYnkgdXNlcnNwYWNlIHdyaXRlKS4KIAkJCQkgKi8KLQkJCQlpZiAocmV0ICYgVk1fRkFVTFRfV1JJVEUpCisJCQkJaWYgKChyZXQgJiBWTV9GQVVMVF9XUklURSkgJiYKKwkJCQkgICAgISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQogCQkJCQlmb2xsX2ZsYWdzICY9IH5GT0xMX1dSSVRFOwogCiAJCQkJY29uZF9yZXNjaGVkKCk7CkBAIC0xNjQ0LDYgKzE3MTEsOCBAQAogCiAJQlVHX09OKHBtZF9odWdlKCpwbWQpKTsKIAorCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOworCiAJdG9rZW4gPSBwbWRfcGd0YWJsZSgqcG1kKTsKIAogCWRvIHsKQEAgLTE2NTIsNiArMTcyMSw4IEBACiAJCQlicmVhazsKIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAorCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOworCiAJaWYgKG1tICE9ICZpbml0X21tKQogCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZS0xLCBwdGwpOwogCXJldHVybiBlcnI7CkBAIC0xODM3LDEwICsxOTA4LDIxIEBACiAJICogbm90IGRpcnR5IGFjY291bnRhYmxlLgogCSAqLwogCWlmIChQYWdlQW5vbihvbGRfcGFnZSkpIHsKLQkJaWYgKHRyeWxvY2tfcGFnZShvbGRfcGFnZSkpIHsKLQkJCXJldXNlID0gY2FuX3NoYXJlX3N3YXBfcGFnZShvbGRfcGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJCWlmICghdHJ5bG9ja19wYWdlKG9sZF9wYWdlKSkgeworCQkJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOworCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCQkJbG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJCXBhZ2VfdGFibGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsCisJCQkJCQkJICZwdGwpOworCQkJaWYgKCFwdGVfc2FtZSgqcGFnZV90YWJsZSwgb3JpZ19wdGUpKSB7CisJCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisJCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOwogCQl9CisJCXJldXNlID0gcmV1c2Vfc3dhcF9wYWdlKG9sZF9wYWdlKTsKKwkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOwogCX0gZWxzZSBpZiAodW5saWtlbHkoKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEV8Vk1fU0hBUkVEKSkgPT0KIAkJCQkJKFZNX1dSSVRFfFZNX1NIQVJFRCkpKSB7CiAJCS8qCkBAIC0xOTQzLDExICsyMDI1LDcgQEAKIAkJICogdGhyZWFkIGRvaW5nIENPVy4KIAkJICovCiAJCXB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSk7Ci0JCVNldFBhZ2VTd2FwQmFja2VkKG5ld19wYWdlKTsKLQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUobmV3X3BhZ2UsIHZtYSk7CiAJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgYWRkcmVzcyk7Ci0KLS8vVE9ETzogIGlzIHRoaXMgc2FmZT8gIGRvX2Fub255bW91c19wYWdlKCkgZG9lcyBpdCB0aGlzIHdheS4KIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnkpOwogCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOwogCQlpZiAob2xkX3BhZ2UpIHsKQEAgLTE5NzMsNyArMjA1MSw3IEBACiAJCQkgKiBtYXBjb3VudCBpcyB2aXNpYmxlLiBTbyB0cmFuc2l0aXZlbHksIFRMQnMgdG8KIAkJCSAqIG9sZCBwYWdlIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgaXQgY2FuIGJlIHJldXNlZC4KIAkJCSAqLwotCQkJcGFnZV9yZW1vdmVfcm1hcChvbGRfcGFnZSwgdm1hKTsKKwkJCXBhZ2VfcmVtb3ZlX3JtYXAob2xkX3BhZ2UpOwogCQl9CiAKIAkJLyogRnJlZSB0aGUgb2xkIHBhZ2UuLiAqLwpAQCAtMjM3NCw3ICsyNDUyLDcgQEAKIAogCWluY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7CiAJcHRlID0gbWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQlpZiAod3JpdGVfYWNjZXNzICYmIGNhbl9zaGFyZV9zd2FwX3BhZ2UocGFnZSkpIHsKKwlpZiAod3JpdGVfYWNjZXNzICYmIHJldXNlX3N3YXBfcGFnZShwYWdlKSkgewogCQlwdGUgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KHB0ZSksIHZtYSk7CiAJCXdyaXRlX2FjY2VzcyA9IDA7CiAJfQpAQCAtMjM4NSw3ICsyNDYzLDcgQEAKIAogCXN3YXBfZnJlZShlbnRyeSk7CiAJaWYgKHZtX3N3YXBfZnVsbCgpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB8fCBQYWdlTWxvY2tlZChwYWdlKSkKLQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2UocGFnZSk7CisJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKIAlpZiAod3JpdGVfYWNjZXNzKSB7CkBAIC0yNDQyLDggKzI1MjAsNiBAQAogCWlmICghcHRlX25vbmUoKnBhZ2VfdGFibGUpKQogCQlnb3RvIHJlbGVhc2U7CiAJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShwYWdlLCB2bWEpOwogCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBlbnRyeSk7CiAKQEAgLTI1OTEsOCArMjY2Nyw2IEBACiAJCQllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwogCQlpZiAoYW5vbikgewogCQkJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQkJCVNldFBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUocGFnZSwgdm1hKTsKIAkJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAkJfSBlbHNlIHsKIAkJCWluY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CkBAIC0yNjAyLDcgKzI2NzYsNiBAQAogCQkJCWdldF9wYWdlKGRpcnR5X3BhZ2UpOwogCQkJfQogCQl9Ci0vL1RPRE86ICBpcyB0aGlzIHNhZmU/ICBkb19hbm9ueW1vdXNfcGFnZSgpIGRvZXMgaXQgdGhpcyB3YXkuCiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKIAogCQkvKiBubyBuZWVkIHRvIGludmFsaWRhdGU6IGEgbm90LXByZXNlbnQgcGFnZSB3b24ndCBiZSBjYWNoZWQgKi8KQEAgLTI2NjYsMTIgKzI3MzksMTEgQEAKIAlpZiAoIXB0ZV91bm1hcF9zYW1lKG1tLCBwbWQsIHBhZ2VfdGFibGUsIG9yaWdfcHRlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5saWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSB8fAotCQkJISh2bWEtPnZtX2ZsYWdzICYgVk1fQ0FOX05PTkxJTkVBUikpKSB7CisJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX05PTkxJTkVBUikpKSB7CiAJCS8qCiAJCSAqIFBhZ2UgdGFibGUgY29ycnVwdGVkOiBzaG93IHB0ZSBhbmQga2lsbCBwcm9jZXNzLgogCQkgKi8KLQkJcHJpbnRfYmFkX3B0ZSh2bWEsIG9yaWdfcHRlLCBhZGRyZXNzKTsKKwkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHJlc3MsIG9yaWdfcHRlLCBOVUxMKTsKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIAl9CiAKQEAgLTI5NTMsNyArMzAyNSw3IEBACiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHByb3QgPSAwOwotCXZvaWQgKm1hZGRyOworCXZvaWQgX19pb21lbSAqbWFkZHI7CiAJaW50IG9mZnNldCA9IGFkZHIgJiAoUEFHRV9TSVpFLTEpOwogCiAJaWYgKGZvbGxvd19waHlzKHZtYSwgYWRkciwgd3JpdGUsICZwcm90LCAmcGh5c19hZGRyKSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IGIxNzM3MTEuLmMwODNjZjUgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMjE2LDcgKzIxNiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19tZW1pbml0IF9fYWRkX3NlY3Rpb24oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4pCitzdGF0aWMgaW50IF9fbWVtaW5pdCBfX2FkZF9zZWN0aW9uKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLAorCQkJCQl1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuKQogewogCWludCBucl9wYWdlcyA9IFBBR0VTX1BFUl9TRUNUSU9OOwogCWludCByZXQ7CkBAIC0yMzQsNyArMjM1LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZWdpc3Rlcl9uZXdfbWVtb3J5KF9fcGZuX3RvX3NlY3Rpb24ocGh5c19zdGFydF9wZm4pKTsKKwlyZXR1cm4gcmVnaXN0ZXJfbmV3X21lbW9yeShuaWQsIF9fcGZuX3RvX3NlY3Rpb24ocGh5c19zdGFydF9wZm4pKTsKIH0KIAogI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUApAQCAtMjczLDggKzI3NCw4IEBACiAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgZGVjaWRpbmcgdGhlIHpvbmUgdG8gd2hpY2ggdG8KICAqIGFkZCB0aGUgbmV3IHBhZ2VzLgogICovCi1pbnQgX19yZWYgX19hZGRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4sCi0JCSB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoraW50IF9fcmVmIF9fYWRkX3BhZ2VzKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuLAorCQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAJaW50IGVyciA9IDA7CkBAIC0yODQsNyArMjg1LDcgQEAKIAllbmRfc2VjID0gcGZuX3RvX3NlY3Rpb25fbnIocGh5c19zdGFydF9wZm4gKyBucl9wYWdlcyAtIDEpOwogCiAJZm9yIChpID0gc3RhcnRfc2VjOyBpIDw9IGVuZF9zZWM7IGkrKykgewotCQllcnIgPSBfX2FkZF9zZWN0aW9uKHpvbmUsIGkgPDwgUEZOX1NFQ1RJT05fU0hJRlQpOworCQllcnIgPSBfX2FkZF9zZWN0aW9uKG5pZCwgem9uZSwgaSA8PCBQRk5fU0VDVElPTl9TSElGVCk7CiAKIAkJLyoKIAkJICogRUVYSVNUIGlzIGZpbmFsbHkgZGVhbHQgd2l0aCBieSBpb3Jlc291cmNlIGNvbGxpc2lvbgpAQCAtNjI2LDE1ICs2MjcsMTIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwYWdlICoKLWhvdHJlbW92ZV9taWdyYXRlX2FsbG9jKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJdW5zaWduZWQgbG9uZyBwcml2YXRlLAotCQkJaW50ICoqeCkKK2hvdHJlbW92ZV9taWdyYXRlX2FsbG9jKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsIGludCAqKngpCiB7Ci0JLyogVGhpcyBzaG91bGQgYmUgaW1wcm9vb29vb3ZlZCEhICovCi0JcmV0dXJuIGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRSk7CisJLyogVGhpcyBzaG91bGQgYmUgaW1wcm9vb29vdmVkISEgKi8KKwlyZXR1cm4gYWxsb2NfcGFnZShHRlBfSElHSFVTRVJfTU9WQUJMRSk7CiB9CiAKLQogI2RlZmluZSBOUl9PRkZMSU5FX0FUX09OQ0VfUEFHRVMJKDI1NikKIHN0YXRpYyBpbnQKIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCAyMTYzMWFiLi41NTM3Mzk4IDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0zMDAsMTIgKzMwMCwxMCBAQAogCSAqIE5vdyB3ZSBrbm93IHRoYXQgbm8gb25lIGVsc2UgaXMgbG9va2luZyBhdCB0aGUgcGFnZS4KIAkgKi8KIAlnZXRfcGFnZShuZXdwYWdlKTsJLyogYWRkIGNhY2hlIHJlZmVyZW5jZSAqLwotI2lmZGVmIENPTkZJR19TV0FQCiAJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJU2V0UGFnZVN3YXBDYWNoZShuZXdwYWdlKTsKIAkJc2V0X3BhZ2VfcHJpdmF0ZShuZXdwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkpOwogCX0KLSNlbmRpZgogCiAJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QocHNsb3QsIG5ld3BhZ2UpOwogCkBAIC0zNzMsOSArMzcxLDcgQEAKIAogCW1sb2NrX21pZ3JhdGVfcGFnZShuZXdwYWdlLCBwYWdlKTsKIAotI2lmZGVmIENPTkZJR19TV0FQCiAJQ2xlYXJQYWdlU3dhcENhY2hlKHBhZ2UpOwotI2VuZGlmCiAJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKIAlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCS8qIHBhZ2UtPm1hcHBpbmcgY29udGFpbnMgYSBmbGFnIGZvciBQYWdlQW5vbigpICovCkBAIC04NDgsMTIgKzg0NCw2IEBACiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQkvKgotCQkgKiBBIHZhbGlkIHBhZ2UgcG9pbnRlciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSBvZiB0aGUKLQkJICogcGFnZXMgdGhhdCB3aWxsIGJlIG1vdmVkLgotCQkgKi8KLQkJcHAtPnBhZ2UgPSBaRVJPX1BBR0UoMCk7Ci0KIAkJZXJyID0gLUVGQVVMVDsKIAkJdm1hID0gZmluZF92bWEobW0sIHBwLT5hZGRyKTsKIAkJaWYgKCF2bWEgfHwgIXZtYV9taWdyYXRhYmxlKHZtYSkpCkBAIC05MTksNDEgKzkwOSw0MyBAQAogCQkJIGNvbnN0IGludCBfX3VzZXIgKm5vZGVzLAogCQkJIGludCBfX3VzZXIgKnN0YXR1cywgaW50IGZsYWdzKQogewotCXN0cnVjdCBwYWdlX3RvX25vZGUgKnBtID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbTsKIAlub2RlbWFza190IHRhc2tfbm9kZXM7Ci0JaW50IGVyciA9IDA7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBjaHVua19ucl9wYWdlczsKKwl1bnNpZ25lZCBsb25nIGNodW5rX3N0YXJ0OworCWludCBlcnI7CiAKIAl0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTsKIAotCS8qIExpbWl0IG5yX3BhZ2VzIHNvIHRoYXQgdGhlIG11bHRpcGxpY2F0aW9uIG1heSBub3Qgb3ZlcmZsb3cgKi8KLQlpZiAobnJfcGFnZXMgPj0gVUxPTkdfTUFYIC8gc2l6ZW9mKHN0cnVjdCBwYWdlX3RvX25vZGUpIC0gMSkgewotCQllcnIgPSAtRTJCSUc7CisJZXJyID0gLUVOT01FTTsKKwlwbSA9IChzdHJ1Y3QgcGFnZV90b19ub2RlICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcG0pCiAJCWdvdG8gb3V0OwotCX0KLQotCXBtID0gdm1hbGxvYygobnJfcGFnZXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSk7Ci0JaWYgKCFwbSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KIAkvKgotCSAqIEdldCBwYXJhbWV0ZXJzIGZyb20gdXNlciBzcGFjZSBhbmQgaW5pdGlhbGl6ZSB0aGUgcG0KLQkgKiBhcnJheS4gUmV0dXJuIHZhcmlvdXMgZXJyb3JzIGlmIHRoZSB1c2VyIGRpZCBzb21ldGhpbmcgd3JvbmcuCisJICogU3RvcmUgYSBjaHVuayBvZiBwYWdlX3RvX25vZGUgYXJyYXkgaW4gYSBwYWdlLAorCSAqIGJ1dCBrZWVwIHRoZSBsYXN0IG9uZSBhcyBhIG1hcmtlcgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7Ci0JCWNvbnN0IHZvaWQgX191c2VyICpwOworCWNodW5rX25yX3BhZ2VzID0gKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSkgLSAxOwogCi0JCWVyciA9IC1FRkFVTFQ7Ci0JCWlmIChnZXRfdXNlcihwLCBwYWdlcyArIGkpKQotCQkJZ290byBvdXRfcG07CisJZm9yIChjaHVua19zdGFydCA9IDA7CisJICAgICBjaHVua19zdGFydCA8IG5yX3BhZ2VzOworCSAgICAgY2h1bmtfc3RhcnQgKz0gY2h1bmtfbnJfcGFnZXMpIHsKKwkJaW50IGo7CiAKLQkJcG1baV0uYWRkciA9ICh1bnNpZ25lZCBsb25nKXA7Ci0JCWlmIChub2RlcykgeworCQlpZiAoY2h1bmtfc3RhcnQgKyBjaHVua19ucl9wYWdlcyA+IG5yX3BhZ2VzKQorCQkJY2h1bmtfbnJfcGFnZXMgPSBucl9wYWdlcyAtIGNodW5rX3N0YXJ0OworCisJCS8qIGZpbGwgdGhlIGNodW5rIHBtIHdpdGggYWRkcnMgYW5kIG5vZGVzIGZyb20gdXNlci1zcGFjZSAqLworCQlmb3IgKGogPSAwOyBqIDwgY2h1bmtfbnJfcGFnZXM7IGorKykgeworCQkJY29uc3Qgdm9pZCBfX3VzZXIgKnA7CiAJCQlpbnQgbm9kZTsKIAotCQkJaWYgKGdldF91c2VyKG5vZGUsIG5vZGVzICsgaSkpCisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKGdldF91c2VyKHAsIHBhZ2VzICsgaiArIGNodW5rX3N0YXJ0KSkKKwkJCQlnb3RvIG91dF9wbTsKKwkJCXBtW2pdLmFkZHIgPSAodW5zaWduZWQgbG9uZykgcDsKKworCQkJaWYgKGdldF91c2VyKG5vZGUsIG5vZGVzICsgaiArIGNodW5rX3N0YXJ0KSkKIAkJCQlnb3RvIG91dF9wbTsKIAogCQkJZXJyID0gLUVOT0RFVjsKQEAgLTk2NCwyMiArOTU2LDI5IEBACiAJCQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgdGFza19ub2RlcykpCiAJCQkJZ290byBvdXRfcG07CiAKLQkJCXBtW2ldLm5vZGUgPSBub2RlOwotCQl9IGVsc2UKLQkJCXBtW2ldLm5vZGUgPSAwOwkvKiBhbnl0aGluZyB0byBub3QgbWF0Y2ggTUFYX05VTU5PREVTICovCi0JfQotCS8qIEVuZCBtYXJrZXIgKi8KLQlwbVtucl9wYWdlc10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKKwkJCXBtW2pdLm5vZGUgPSBub2RlOworCQl9CiAKLQllcnIgPSBkb19tb3ZlX3BhZ2VfdG9fbm9kZV9hcnJheShtbSwgcG0sIGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCk7Ci0JaWYgKGVyciA+PSAwKQorCQkvKiBFbmQgbWFya2VyIGZvciB0aGlzIGNodW5rICovCisJCXBtW2NodW5rX25yX3BhZ2VzXS5ub2RlID0gTUFYX05VTU5PREVTOworCisJCS8qIE1pZ3JhdGUgdGhpcyBjaHVuayAqLworCQllcnIgPSBkb19tb3ZlX3BhZ2VfdG9fbm9kZV9hcnJheShtbSwgcG0sCisJCQkJCQkgZmxhZ3MgJiBNUE9MX01GX01PVkVfQUxMKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9wbTsKKwogCQkvKiBSZXR1cm4gc3RhdHVzIGluZm9ybWF0aW9uICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKQotCQkJaWYgKHB1dF91c2VyKHBtW2ldLnN0YXR1cywgc3RhdHVzICsgaSkpCisJCWZvciAoaiA9IDA7IGogPCBjaHVua19ucl9wYWdlczsgaisrKQorCQkJaWYgKHB1dF91c2VyKHBtW2pdLnN0YXR1cywgc3RhdHVzICsgaiArIGNodW5rX3N0YXJ0KSkgewogCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXRfcG07CisJCQl9CisJfQorCWVyciA9IDA7CiAKIG91dF9wbToKLQl2ZnJlZShwbSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBtKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggMzAzNWE1Ni4uZTEyNTE1NiAxMDA2NDQKLS0tIGEvbW0vbWxvY2suYworKysgYi9tbS9tbG9jay5jCkBAIC0xNzMsMTIgKzE3MywxMyBAQAogCQkgIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSAhPSAwKSk7CiAKIAkvKgotCSAqIG1sb2NrOiAgIGRvbid0IHBhZ2UgcG9wdWxhdGUgaWYgcGFnZSBoYXMgUFJPVF9OT05FIHBlcm1pc3Npb24uCi0JICogbXVubG9jazogdGhlIHBhZ2VzIGFsd2F5cyBkbyBtdW5sb2NrIGFsdGhyb3VnaAotCSAqICAgICAgICAgIGl0cyBoYXMgUFJPVF9OT05FIHBlcm1pc3Npb24uCisJICogbWxvY2s6ICAgZG9uJ3QgcGFnZSBwb3B1bGF0ZSBpZiB2bWEgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgorCSAqIG11bmxvY2s6IGFsd2F5cyBkbyBtdW5sb2NrIGFsdGhvdWdoIHRoZSB2bWEgaGFzIFBST1RfTk9ORQorCSAqICAgICAgICAgIHBlcm1pc3Npb24sIG9yIFNJR0tJTEwgaXMgcGVuZGluZy4KIAkgKi8KIAlpZiAoIW1sb2NrKQotCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX0lHTk9SRV9WTUFfUEVSTUlTU0lPTlM7CisJCWd1cF9mbGFncyB8PSBHVVBfRkxBR1NfSUdOT1JFX1ZNQV9QRVJNSVNTSU9OUyB8CisJCQkgICAgIEdVUF9GTEFHU19JR05PUkVfU0lHS0lMTDsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCiAJCWd1cF9mbGFncyB8PSBHVVBfRkxBR1NfV1JJVEU7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggMmM3NzhmYy4uYTkxMGMwNDUgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCBfX3ZtYV9saW5rX2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBmaWxlICpmaWxlOwogCiAJZmlsZSA9IHZtYS0+dm1fZmlsZTsKIAlpZiAoZmlsZSkgewpAQCAtNDc0LDExICs0NzQsMTAgQEAKICAqIGluc2VydCB2bSBzdHJ1Y3R1cmUgaW50byBsaXN0IGFuZCByYnRyZWUgYW5kIGFub25fdm1hLAogICogYnV0IGl0IGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQgaW50byBwcmlvX3RyZWUgZWFybGllci4KICAqLwotc3RhdGljIHZvaWQKLV9faW5zZXJ0X3ZtX3N0cnVjdChzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3N0YXRpYyB2b2lkIF9faW5zZXJ0X3ZtX3N0cnVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICogX192bWEsICogcHJldjsKLQlzdHJ1Y3QgcmJfbm9kZSAqKiByYl9saW5rLCAqIHJiX3BhcmVudDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKl9fdm1hLCAqcHJldjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssICpyYl9wYXJlbnQ7CiAKIAlfX3ZtYSA9IGZpbmRfdm1hX3ByZXBhcmUobW0sIHZtYS0+dm1fc3RhcnQsJnByZXYsICZyYl9saW5rLCAmcmJfcGFyZW50KTsKIAlCVUdfT04oX192bWEgJiYgX192bWEtPnZtX3N0YXJ0IDwgdm1hLT52bV9lbmQpOwpAQCAtOTA4LDcgKzkwNyw3IEBACiAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBkb3duX3dyaXRlKGN1cnJlbnQtPm1tLT5tbWFwX3NlbSkuCiAgKi8KIAotdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAordW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKQEAgLTE0NjQsNyArMTQ2Myw3IEBACiBFWFBPUlRfU1lNQk9MKGdldF91bm1hcHBlZF9hcmVhKTsKIAogLyogTG9vayB1cCB0aGUgZmlyc3QgVk1BIHdoaWNoIHNhdGlzZmllcyAgYWRkciA8IHZtX2VuZCwgIE5VTEwgaWYgbm9uZS4gKi8KLXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGZpbmRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKIApAQCAtMTUwNyw3ICsxNTA2LDcgQEAKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnBwcmV2KQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTCwgKnByZXYgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICogcmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKIAlpZiAoIW1tKQogCQlnb3RvIG91dDsKIApAQCAtMTU0MSw3ICsxNTQwLDcgQEAKICAqIHVwZGF0ZSBhY2NvdW50aW5nLiBUaGlzIGlzIHNoYXJlZCB3aXRoIGJvdGggdGhlCiAgKiBncm93LXVwIGFuZCBncm93LWRvd24gY2FzZXMuCiAgKi8KLXN0YXRpYyBpbnQgYWNjdF9zdGFja19ncm93dGgoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZ3JvdykKK3N0YXRpYyBpbnQgYWNjdF9zdGFja19ncm93dGgoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBncm93KQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlzdHJ1Y3QgcmxpbWl0ICpybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltOwpAQCAtMjA5MSw2ICsyMDkwLDkgQEAKIAlhcmNoX2V4aXRfbW1hcChtbSk7CiAJbW11X25vdGlmaWVyX3JlbGVhc2UobW0pOwogCisJaWYgKCFtbS0+bW1hcCkJLyogQ2FuIGhhcHBlbiBpZiBkdXBfbW1hcCgpIHJlY2VpdmVkIGFuIE9PTSAqLworCQlyZXR1cm47CisKIAlpZiAobW0tPmxvY2tlZF92bSkgewogCQl2bWEgPSBtbS0+bW1hcDsKIAkJd2hpbGUgKHZtYSkgewpAQCAtMjEwMyw3ICsyMTA1LDcgQEAKIAlscnVfYWRkX2RyYWluKCk7CiAJZmx1c2hfY2FjaGVfbW0obW0pOwogCXRsYiA9IHRsYl9nYXRoZXJfbW11KG1tLCAxKTsKLQkvKiBEb24ndCB1cGRhdGVfaGl3YXRlcl9yc3MobW0pIGhlcmUsIGRvX2V4aXQgYWxyZWFkeSBkaWQgKi8KKwkvKiB1cGRhdGVfaGl3YXRlcl9yc3MobW0pIGhlcmU/IGJ1dCBub2JvZHkgc2hvdWxkIGJlIGxvb2tpbmcgKi8KIAkvKiBVc2UgLTEgaGVyZSB0byBlbnN1cmUgYWxsIFZNQXMgaW4gdGhlIG1tIGFyZSB1bm1hcHBlZCAqLwogCWVuZCA9IHVubWFwX3ZtYXMoJnRsYiwgdm1hLCAwLCAtMSwgJm5yX2FjY291bnRlZCwgTlVMTCk7CiAJdm1fdW5hY2N0X21lbW9yeShucl9hY2NvdW50ZWQpOwpkaWZmIC0tZ2l0IGEvbW0vbXByb3RlY3QuYyBiL21tL21wcm90ZWN0LmMKaW5kZXggY2ZiNGM0OC4uZDBmNmU3YyAxMDA2NDQKLS0tIGEvbW0vbXByb3RlY3QuYworKysgYi9tbS9tcHJvdGVjdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC01OSw4ICs2MCw3IEBACiAJCQkJcHRlbnQgPSBwdGVfbWt3cml0ZShwdGVudCk7CiAKIAkJCXB0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0KG1tLCBhZGRyLCBwdGUsIHB0ZW50KTsKLSNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCi0JCX0gZWxzZSBpZiAoIXB0ZV9maWxlKG9sZHB0ZSkpIHsKKwkJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTiAmJiAhcHRlX2ZpbGUob2xkcHRlKSkgewogCQkJc3dwX2VudHJ5X3QgZW50cnkgPSBwdGVfdG9fc3dwX2VudHJ5KG9sZHB0ZSk7CiAKIAkJCWlmIChpc193cml0ZV9taWdyYXRpb25fZW50cnkoZW50cnkpKSB7CkBAIC03Miw5ICs3Miw3IEBACiAJCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlLAogCQkJCQlzd3BfZW50cnlfdG9fcHRlKGVudHJ5KSk7CiAJCQl9Ci0jZW5kaWYKIAkJfQotCiAJfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CiAJYXJjaF9sZWF2ZV9sYXp5X21tdV9tb2RlKCk7CiAJcHRlX3VubWFwX3VubG9jayhwdGUgLSAxLCBwdGwpOwpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNTU4ZjlhZi4uNmI5ZTc1OCAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0zMSw3ICszMSw3IEBACiBpbnQgc3lzY3RsX3BhbmljX29uX29vbTsKIGludCBzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrOwogaW50IHN5c2N0bF9vb21fZHVtcF90YXNrczsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soem9uZV9zY2FuX211dGV4KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soem9uZV9zY2FuX2xvY2spOwogLyogI2RlZmluZSBERUJVRyAqLwogCiAvKioKQEAgLTM5Miw2ICszOTIsOSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBpbnZva2VkIG9vbS1raWxsZXI6ICIKIAkJCSJnZnBfbWFzaz0weCV4LCBvcmRlcj0lZCwgb29ta2lsbGFkaj0lZFxuIiwKIAkJCWN1cnJlbnQtPmNvbW0sIGdmcF9tYXNrLCBvcmRlciwgY3VycmVudC0+b29ta2lsbGFkaik7CisJCXRhc2tfbG9jayhjdXJyZW50KTsKKwkJY3B1c2V0X3ByaW50X3Rhc2tfbWVtc19hbGxvd2VkKGN1cnJlbnQpOworCQl0YXNrX3VubG9jayhjdXJyZW50KTsKIAkJZHVtcF9zdGFjaygpOwogCQlzaG93X21lbSgpOwogCQlpZiAoc3lzY3RsX29vbV9kdW1wX3Rhc2tzKQpAQCAtNDcwLDcgKzQ3Myw3IEBACiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJaW50IHJldCA9IDE7CiAKLQlzcGluX2xvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl9sb2NrKCZ6b25lX3NjYW5fbG9jayk7CiAJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgZ2ZwX3pvbmUoZ2ZwX21hc2spKSB7CiAJCWlmICh6b25lX2lzX29vbV9sb2NrZWQoem9uZSkpIHsKIAkJCXJldCA9IDA7CkBAIC00ODAsNyArNDgzLDcgQEAKIAogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Qoem9uZSwgeiwgem9uZWxpc3QsIGdmcF96b25lKGdmcF9tYXNrKSkgewogCQkvKgotCQkgKiBMb2NrIGVhY2ggem9uZSBpbiB0aGUgem9uZWxpc3QgdW5kZXIgem9uZV9zY2FuX211dGV4IHNvIGEKKwkJICogTG9jayBlYWNoIHpvbmUgaW4gdGhlIHpvbmVsaXN0IHVuZGVyIHpvbmVfc2Nhbl9sb2NrIHNvIGEKIAkJICogcGFyYWxsZWwgaW52b2NhdGlvbiBvZiB0cnlfc2V0X3pvbmVfb29tKCkgZG9lc24ndCBzdWNjZWVkCiAJCSAqIHdoZW4gaXQgc2hvdWxkbid0LgogCQkgKi8KQEAgLTQ4OCw3ICs0OTEsNyBAQAogCX0KIAogb3V0OgotCXNwaW5fdW5sb2NrKCZ6b25lX3NjYW5fbXV0ZXgpOworCXNwaW5fdW5sb2NrKCZ6b25lX3NjYW5fbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTAyLDExICs1MDUsNzQgQEAKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAotCXNwaW5fbG9jaygmem9uZV9zY2FuX211dGV4KTsKKwlzcGluX2xvY2soJnpvbmVfc2Nhbl9sb2NrKTsKIAlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBnZnBfem9uZShnZnBfbWFzaykpIHsKIAkJem9uZV9jbGVhcl9mbGFnKHpvbmUsIFpPTkVfT09NX0xPQ0tFRCk7CiAJfQotCXNwaW5fdW5sb2NrKCZ6b25lX3NjYW5fbXV0ZXgpOworCXNwaW5fdW5sb2NrKCZ6b25lX3NjYW5fbG9jayk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRhc2tsaXN0X2xvY2sgaGVsZCBmb3IgcmVhZC4KKyAqLworc3RhdGljIHZvaWQgX19vdXRfb2ZfbWVtb3J5KGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIpCit7CisJaWYgKHN5c2N0bF9vb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2spIHsKKwkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIDAsIE5VTEwsCisJCQkJIk91dCBvZiBtZW1vcnkgKG9vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykiKTsKKworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgcG9pbnRzOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisKK3JldHJ5OgorCQkvKgorCQkgKiBSYW1ibyBtb2RlOiBTaG9vdCBkb3duIGEgcHJvY2VzcyBhbmQgaG9wZSBpdCBzb2x2ZXMgd2hhdGV2ZXIKKwkJICogaXNzdWVzIHdlIG1heSBoYXZlLgorCQkgKi8KKwkJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygmcG9pbnRzLCBOVUxMKTsKKworCQlpZiAoUFRSX0VSUihwKSA9PSAtMVVMKQorCQkJcmV0dXJuOworCisJCS8qIEZvdW5kIG5vdGhpbmc/IT8hIEVpdGhlciB3ZSBoYW5nIGZvcmV2ZXIsIG9yIHdlIHBhbmljLiAqLworCQlpZiAoIXApIHsKKwkJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJCXBhbmljKCJPdXQgb2YgbWVtb3J5IGFuZCBubyBraWxsYWJsZSBwcm9jZXNzZXMuLi5cbiIpOworCQl9CisKKwkJaWYgKG9vbV9raWxsX3Byb2Nlc3MocCwgZ2ZwX21hc2ssIG9yZGVyLCBwb2ludHMsIE5VTEwsCisJCQkJICAgICAiT3V0IG9mIG1lbW9yeSIpKQorCQkJZ290byByZXRyeTsKKwl9Cit9CisKKy8qCisgKiBwYWdlZmF1bHQgaGFuZGxlciBjYWxscyBpbnRvIGhlcmUgYmVjYXVzZSBpdCBpcyBvdXQgb2YgbWVtb3J5IGJ1dAorICogZG9lc24ndCBrbm93IGV4YWN0bHkgaG93IG9yIHdoeS4KKyAqLwordm9pZCBwYWdlZmF1bHRfb3V0X29mX21lbW9yeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZnJlZWQgPSAwOworCisJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmb29tX25vdGlmeV9saXN0LCAwLCAmZnJlZWQpOworCWlmIChmcmVlZCA+IDApCisJCS8qIEdvdCBzb21lIG1lbW9yeSBiYWNrIGluIHRoZSBsYXN0IHNlY29uZC4gKi8KKwkJcmV0dXJuOworCisJaWYgKHN5c2N0bF9wYW5pY19vbl9vb20pCisJCXBhbmljKCJvdXQgb2YgbWVtb3J5IGZyb20gcGFnZSBmYXVsdC4gcGFuaWNfb25fb29tIGlzIHNlbGVjdGVkLlxuIik7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCV9fb3V0X29mX21lbW9yeSgwLCAwKTsgLyogdW5rbm93biBnZnBfbWFzayBhbmQgb3JkZXIgKi8KKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKKwkvKgorCSAqIEdpdmUgInAiIGEgZ29vZCBjaGFuY2Ugb2Yga2lsbGluZyBpdHNlbGYgYmVmb3JlIHdlCisJICogcmV0cnkgdG8gYWxsb2NhdGUgbWVtb3J5LgorCSAqLworCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSkKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiB9CiAKIC8qKgpAQCAtNTIyLDggKzU4OCw2IEBACiAgKi8KIHZvaWQgb3V0X29mX21lbW9yeShzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBnZnBfdCBnZnBfbWFzaywgaW50IG9yZGVyKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQl1bnNpZ25lZCBsb25nIHBvaW50cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmcmVlZCA9IDA7CiAJZW51bSBvb21fY29uc3RyYWludCBjb25zdHJhaW50OwogCkBAIC01NDQsNyArNjA4LDcgQEAKIAogCXN3aXRjaCAoY29uc3RyYWludCkgewogCWNhc2UgQ09OU1RSQUlOVF9NRU1PUllfUE9MSUNZOgotCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLCBOVUxMLAorCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgMCwgTlVMTCwKIAkJCQkiTm8gYXZhaWxhYmxlIG1lbW9yeSAoTVBPTF9CSU5EKSIpOwogCQlicmVhazsKIApAQCAtNTUzLDM1ICs2MTcsMTAgQEAKIAkJCXBhbmljKCJvdXQgb2YgbWVtb3J5LiBwYW5pY19vbl9vb20gaXMgc2VsZWN0ZWRcbiIpOwogCQkvKiBGYWxsLXRocm91Z2ggKi8KIAljYXNlIENPTlNUUkFJTlRfQ1BVU0VUOgotCQlpZiAoc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykgewotCQkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKLQkJCQkJIk91dCBvZiBtZW1vcnkgKG9vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykiKTsKLQkJCWJyZWFrOwotCQl9Ci1yZXRyeToKLQkJLyoKLQkJICogUmFtYm8gbW9kZTogU2hvb3QgZG93biBhIHByb2Nlc3MgYW5kIGhvcGUgaXQgc29sdmVzIHdoYXRldmVyCi0JCSAqIGlzc3VlcyB3ZSBtYXkgaGF2ZS4KLQkJICovCi0JCXAgPSBzZWxlY3RfYmFkX3Byb2Nlc3MoJnBvaW50cywgTlVMTCk7Ci0KLQkJaWYgKFBUUl9FUlIocCkgPT0gLTFVTCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIEZvdW5kIG5vdGhpbmc/IT8hIEVpdGhlciB3ZSBoYW5nIGZvcmV2ZXIsIG9yIHdlIHBhbmljLiAqLwotCQlpZiAoIXApIHsKLQkJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJCXBhbmljKCJPdXQgb2YgbWVtb3J5IGFuZCBubyBraWxsYWJsZSBwcm9jZXNzZXMuLi5cbiIpOwotCQl9Ci0KLQkJaWYgKG9vbV9raWxsX3Byb2Nlc3MocCwgZ2ZwX21hc2ssIG9yZGVyLCBwb2ludHMsIE5VTEwsCi0JCQkJICAgICAiT3V0IG9mIG1lbW9yeSIpKQotCQkJZ290byByZXRyeTsKLQorCQlfX291dF9vZl9tZW1vcnkoZ2ZwX21hc2ssIG9yZGVyKTsKIAkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IDI5NzBlMzUuLmI0OTNkYjcgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtNjksNiArNjksMTIgQEAKIGludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvID0gNTsKIAogLyoKKyAqIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgc3RhcnRzIGF0IDAgKGRpc2FibGVkKSBzbyB0aGF0IGl0IGlzIGEgZnVuY3Rpb24gb2YKKyAqIGRpcnR5X2JhY2tncm91bmRfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBtZW1vcnkKKyAqLwordW5zaWduZWQgbG9uZyBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzOworCisvKgogICogZnJlZSBoaWdobWVtIHdpbGwgbm90IGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdG90YWwgZnJlZSBtZW1vcnkKICAqIGZvciBjYWxjdWxhdGluZyBmcmVlIHJhdGlvcyBpZiB2bV9oaWdobWVtX2lzX2RpcnR5YWJsZSBpcyB0cnVlCiAgKi8KQEAgLTgwLDYgKzg2LDEyIEBACiBpbnQgdm1fZGlydHlfcmF0aW8gPSAxMDsKIAogLyoKKyAqIHZtX2RpcnR5X2J5dGVzIHN0YXJ0cyBhdCAwIChkaXNhYmxlZCkgc28gdGhhdCBpdCBpcyBhIGZ1bmN0aW9uIG9mCisgKiB2bV9kaXJ0eV9yYXRpbyAqIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIG1lbW9yeQorICovCit1bnNpZ25lZCBsb25nIHZtX2RpcnR5X2J5dGVzOworCisvKgogICogVGhlIGludGVydmFsIGJldHdlZW4gYGt1cGRhdGUnLXN0eWxlIHdyaXRlYmFja3MsIGluIGppZmZpZXMKICAqLwogaW50IGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCA9IDUgKiBIWjsKQEAgLTEzNSwyMyArMTQ3LDc1IEBACiB7CiAJdW5zaWduZWQgbG9uZyBkaXJ0eV90b3RhbDsKIAotCWRpcnR5X3RvdGFsID0gKHZtX2RpcnR5X3JhdGlvICogZGV0ZXJtaW5lX2RpcnR5YWJsZV9tZW1vcnkoKSkgLyAxMDA7CisJaWYgKHZtX2RpcnR5X2J5dGVzKQorCQlkaXJ0eV90b3RhbCA9IHZtX2RpcnR5X2J5dGVzIC8gUEFHRV9TSVpFOworCWVsc2UKKwkJZGlydHlfdG90YWwgPSAodm1fZGlydHlfcmF0aW8gKiBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSgpKSAvCisJCQkJMTAwOwogCXJldHVybiAyICsgaWxvZzIoZGlydHlfdG90YWwgLSAxKTsKIH0KIAogLyoKLSAqIHVwZGF0ZSB0aGUgcGVyaW9kIHdoZW4gdGhlIGRpcnR5IHJhdGlvIGNoYW5nZXMuCisgKiB1cGRhdGUgdGhlIHBlcmlvZCB3aGVuIHRoZSBkaXJ0eSB0aHJlc2hvbGQgY2hhbmdlcy4KICAqLworc3RhdGljIHZvaWQgdXBkYXRlX2NvbXBsZXRpb25fcGVyaW9kKHZvaWQpCit7CisJaW50IHNoaWZ0ID0gY2FsY19wZXJpb2Rfc2hpZnQoKTsKKwlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fY29tcGxldGlvbnMsIHNoaWZ0KTsKKwlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fZGlydGllcywgc2hpZnQpOworfQorCitpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpb19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyZXQgPT0gMCAmJiB3cml0ZSkKKwkJZGlydHlfYmFja2dyb3VuZF9ieXRlcyA9IDA7CisJcmV0dXJuIHJldDsKK30KKworaW50IGRpcnR5X2JhY2tncm91bmRfYnl0ZXNfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyZXQgPT0gMCAmJiB3cml0ZSkKKwkJZGlydHlfYmFja2dyb3VuZF9yYXRpbyA9IDA7CisJcmV0dXJuIHJldDsKK30KKwogaW50IGRpcnR5X3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKIAkJbG9mZl90ICpwcG9zKQogewogCWludCBvbGRfcmF0aW8gPSB2bV9kaXJ0eV9yYXRpbzsKLQlpbnQgcmV0ID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CiAJaWYgKHJldCA9PSAwICYmIHdyaXRlICYmIHZtX2RpcnR5X3JhdGlvICE9IG9sZF9yYXRpbykgewotCQlpbnQgc2hpZnQgPSBjYWxjX3BlcmlvZF9zaGlmdCgpOwotCQlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fY29tcGxldGlvbnMsIHNoaWZ0KTsKLQkJcHJvcF9jaGFuZ2Vfc2hpZnQoJnZtX2RpcnRpZXMsIHNoaWZ0KTsKKwkJdXBkYXRlX2NvbXBsZXRpb25fcGVyaW9kKCk7CisJCXZtX2RpcnR5X2J5dGVzID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitpbnQgZGlydHlfYnl0ZXNfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpCit7CisJaW50IG9sZF9ieXRlcyA9IHZtX2RpcnR5X2J5dGVzOworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAocmV0ID09IDAgJiYgd3JpdGUgJiYgdm1fZGlydHlfYnl0ZXMgIT0gb2xkX2J5dGVzKSB7CisJCXVwZGF0ZV9jb21wbGV0aW9uX3BlcmlvZCgpOworCQl2bV9kaXJ0eV9yYXRpbyA9IDA7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0zNjIsMjYgKzQyNiwzMiBAQAogfQogCiB2b2lkCi1nZXRfZGlydHlfbGltaXRzKGxvbmcgKnBiYWNrZ3JvdW5kLCBsb25nICpwZGlydHksIGxvbmcgKnBiZGlfZGlydHksCi0JCSBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQorZ2V0X2RpcnR5X2xpbWl0cyh1bnNpZ25lZCBsb25nICpwYmFja2dyb3VuZCwgdW5zaWduZWQgbG9uZyAqcGRpcnR5LAorCQkgdW5zaWduZWQgbG9uZyAqcGJkaV9kaXJ0eSwgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKIHsKLQlpbnQgYmFja2dyb3VuZF9yYXRpbzsJCS8qIFBlcmNlbnRhZ2VzICovCi0JaW50IGRpcnR5X3JhdGlvOwotCWxvbmcgYmFja2dyb3VuZDsKLQlsb25nIGRpcnR5OworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZDsKKwl1bnNpZ25lZCBsb25nIGRpcnR5OwogCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlX21lbW9yeSA9IGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAKLQlkaXJ0eV9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOwotCWlmIChkaXJ0eV9yYXRpbyA8IDUpCi0JCWRpcnR5X3JhdGlvID0gNTsKKwlpZiAodm1fZGlydHlfYnl0ZXMpCisJCWRpcnR5ID0gRElWX1JPVU5EX1VQKHZtX2RpcnR5X2J5dGVzLCBQQUdFX1NJWkUpOworCWVsc2UgeworCQlpbnQgZGlydHlfcmF0aW87CiAKLQliYWNrZ3JvdW5kX3JhdGlvID0gZGlydHlfYmFja2dyb3VuZF9yYXRpbzsKLQlpZiAoYmFja2dyb3VuZF9yYXRpbyA+PSBkaXJ0eV9yYXRpbykKLQkJYmFja2dyb3VuZF9yYXRpbyA9IGRpcnR5X3JhdGlvIC8gMjsKKwkJZGlydHlfcmF0aW8gPSB2bV9kaXJ0eV9yYXRpbzsKKwkJaWYgKGRpcnR5X3JhdGlvIDwgNSkKKwkJCWRpcnR5X3JhdGlvID0gNTsKKwkJZGlydHkgPSAoZGlydHlfcmF0aW8gKiBhdmFpbGFibGVfbWVtb3J5KSAvIDEwMDsKKwl9CiAKLQliYWNrZ3JvdW5kID0gKGJhY2tncm91bmRfcmF0aW8gKiBhdmFpbGFibGVfbWVtb3J5KSAvIDEwMDsKLQlkaXJ0eSA9IChkaXJ0eV9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOworCWlmIChkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzKQorCQliYWNrZ3JvdW5kID0gRElWX1JPVU5EX1VQKGRpcnR5X2JhY2tncm91bmRfYnl0ZXMsIFBBR0VfU0laRSk7CisJZWxzZQorCQliYWNrZ3JvdW5kID0gKGRpcnR5X2JhY2tncm91bmRfcmF0aW8gKiBhdmFpbGFibGVfbWVtb3J5KSAvIDEwMDsKKworCWlmIChiYWNrZ3JvdW5kID49IGRpcnR5KQorCQliYWNrZ3JvdW5kID0gZGlydHkgLyAyOwogCXRzayA9IGN1cnJlbnQ7CiAJaWYgKHRzay0+ZmxhZ3MgJiBQRl9MRVNTX1RIUk9UVExFIHx8IHJ0X3Rhc2sodHNrKSkgewogCQliYWNrZ3JvdW5kICs9IGJhY2tncm91bmQgLyA0OwpAQCAtNDIzLDkgKzQ5Myw5IEBACiB7CiAJbG9uZyBucl9yZWNsYWltYWJsZSwgYmRpX25yX3JlY2xhaW1hYmxlOwogCWxvbmcgbnJfd3JpdGViYWNrLCBiZGlfbnJfd3JpdGViYWNrOwotCWxvbmcgYmFja2dyb3VuZF90aHJlc2g7Ci0JbG9uZyBkaXJ0eV90aHJlc2g7Ci0JbG9uZyBiZGlfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiZGlfdGhyZXNoOwogCXVuc2lnbmVkIGxvbmcgcGFnZXNfd3JpdHRlbiA9IDA7CiAJdW5zaWduZWQgbG9uZyB3cml0ZV9jaHVuayA9IHN5bmNfd3JpdGViYWNrX3BhZ2VzKCk7CiAKQEAgLTU4MCw4ICs2NTAsOCBAQAogCiB2b2lkIHRocm90dGxlX3ZtX3dyaXRlb3V0KGdmcF90IGdmcF9tYXNrKQogewotCWxvbmcgYmFja2dyb3VuZF90aHJlc2g7Ci0JbG9uZyBkaXJ0eV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKIAogICAgICAgICBmb3IgKCA7IDsgKSB7CiAJCWdldF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoLCBOVUxMLCBOVUxMKTsKQEAgLTYyNCw4ICs2OTQsOCBAQAogCX07CiAKIAlmb3IgKCA7IDsgKSB7Ci0JCWxvbmcgYmFja2dyb3VuZF90aHJlc2g7Ci0JCWxvbmcgZGlydHlfdGhyZXNoOworCQl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCQl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKIAogCQlnZXRfZGlydHlfbGltaXRzKCZiYWNrZ3JvdW5kX3RocmVzaCwgJmRpcnR5X3RocmVzaCwgTlVMTCwgTlVMTCk7CiAJCWlmIChnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSArCkBAIC04NjgsOSArOTM4LDExIEBACiAJaW50IGRvbmUgPSAwOwogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJaW50IG5yX3BhZ2VzOworCXBnb2ZmX3QgdW5pbml0aWFsaXplZF92YXIod3JpdGViYWNrX2luZGV4KTsKIAlwZ29mZl90IGluZGV4OwogCXBnb2ZmX3QgZW5kOwkJLyogSW5jbHVzaXZlICovCi0JaW50IHNjYW5uZWQgPSAwOworCXBnb2ZmX3QgZG9uZV9pbmRleDsKKwlpbnQgY3ljbGVkOwogCWludCByYW5nZV93aG9sZSA9IDA7CiAJbG9uZyBucl90b193cml0ZSA9IHdiYy0+bnJfdG9fd3JpdGU7CiAKQEAgLTg4MSw4MyArOTUzLDEzNCBAQAogCiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIAlpZiAod2JjLT5yYW5nZV9jeWNsaWMpIHsKLQkJaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIFN0YXJ0IGZyb20gcHJldiBvZmZzZXQgKi8KKwkJd3JpdGViYWNrX2luZGV4ID0gbWFwcGluZy0+d3JpdGViYWNrX2luZGV4OyAvKiBwcmV2IG9mZnNldCAqLworCQlpbmRleCA9IHdyaXRlYmFja19pbmRleDsKKwkJaWYgKGluZGV4ID09IDApCisJCQljeWNsZWQgPSAxOworCQllbHNlCisJCQljeWNsZWQgPSAwOwogCQllbmQgPSAtMTsKIAl9IGVsc2UgewogCQlpbmRleCA9IHdiYy0+cmFuZ2Vfc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAkJZW5kID0gd2JjLT5yYW5nZV9lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAkJaWYgKHdiYy0+cmFuZ2Vfc3RhcnQgPT0gMCAmJiB3YmMtPnJhbmdlX2VuZCA9PSBMTE9OR19NQVgpCiAJCQlyYW5nZV93aG9sZSA9IDE7Ci0JCXNjYW5uZWQgPSAxOworCQljeWNsZWQgPSAxOyAvKiBpZ25vcmUgcmFuZ2VfY3ljbGljIHRlc3RzICovCiAJfQogcmV0cnk6Ci0Jd2hpbGUgKCFkb25lICYmIChpbmRleCA8PSBlbmQpICYmCi0JICAgICAgIChucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAotCQkJCQkgICAgICBQQUdFQ0FDSEVfVEFHX0RJUlRZLAotCQkJCQkgICAgICBtaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpKSkgewotCQl1bnNpZ25lZCBpOworCWRvbmVfaW5kZXggPSBpbmRleDsKKwl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkpIHsKKwkJaW50IGk7CiAKLQkJc2Nhbm5lZCA9IDE7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCisJCQkgICAgICBQQUdFQ0FDSEVfVEFHX0RJUlRZLAorCQkJICAgICAgbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUtMSkgKyAxKTsKKwkJaWYgKG5yX3BhZ2VzID09IDApCisJCQlicmVhazsKKwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwogCiAJCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCB3ZSBob2xkIG5laXRoZXIgbWFwcGluZy0+dHJlZV9sb2NrIG5vcgotCQkJICogbG9jayBvbiB0aGUgcGFnZSBpdHNlbGY6IHRoZSBwYWdlIG1heSBiZSB0cnVuY2F0ZWQgb3IKLQkJCSAqIGludmFsaWRhdGVkIChjaGFuZ2luZyBwYWdlLT5tYXBwaW5nIHRvIE5VTEwpLCBvciBldmVuCi0JCQkgKiBzd2l6emxlZCBiYWNrIGZyb20gc3dhcHBlcl9zcGFjZSB0byB0bXBmcyBmaWxlCi0JCQkgKiBtYXBwaW5nCisJCQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgcGFnZSBtYXkgYmUgdHJ1bmNhdGVkIG9yCisJCQkgKiBpbnZhbGlkYXRlZCAoY2hhbmdpbmcgcGFnZS0+bWFwcGluZyB0byBOVUxMKSwgb3IKKwkJCSAqIGV2ZW4gc3dpenpsZWQgYmFjayBmcm9tIHN3YXBwZXJfc3BhY2UgdG8gdG1wZnMgZmlsZQorCQkJICogbWFwcGluZy4gSG93ZXZlciwgcGFnZS0+aW5kZXggd2lsbCBub3QgY2hhbmdlCisJCQkgKiBiZWNhdXNlIHdlIGhhdmUgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuCiAJCQkgKi8KKwkJCWlmIChwYWdlLT5pbmRleCA+IGVuZCkgeworCQkJCS8qCisJCQkJICogY2FuJ3QgYmUgcmFuZ2VfY3ljbGljICgxc3QgcGFzcykgYmVjYXVzZQorCQkJCSAqIGVuZCA9PSAtMSBpbiB0aGF0IGNhc2UuCisJCQkJICovCisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRvbmVfaW5kZXggPSBwYWdlLT5pbmRleCArIDE7CisKIAkJCWxvY2tfcGFnZShwYWdlKTsKIAorCQkJLyoKKwkJCSAqIFBhZ2UgdHJ1bmNhdGVkIG9yIGludmFsaWRhdGVkLiBXZSBjYW4gZnJlZWx5IHNraXAgaXQKKwkJCSAqIHRoZW4sIGV2ZW4gZm9yIGRhdGEgaW50ZWdyaXR5IG9wZXJhdGlvbnM6IHRoZSBwYWdlCisJCQkgKiBoYXMgZGlzYXBwZWFyZWQgY29uY3VycmVudGx5LCBzbyB0aGVyZSBjb3VsZCBiZSBubworCQkJICogcmVhbCBleHBlY3RhdGlvbiBvZiB0aGlzIGRhdGEgaW50ZXJpdHkgb3BlcmF0aW9uCisJCQkgKiBldmVuIGlmIHRoZXJlIGlzIG5vdyBhIG5ldywgZGlydHkgcGFnZSBhdCB0aGUgc2FtZQorCQkJICogcGFnZWNhY2hlIGFkZHJlc3MuCisJCQkgKi8KIAkJCWlmICh1bmxpa2VseShwYWdlLT5tYXBwaW5nICE9IG1hcHBpbmcpKSB7Citjb250aW51ZV91bmxvY2s6CiAJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWlmICghd2JjLT5yYW5nZV9jeWNsaWMgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKLQkJCQlkb25lID0gMTsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQljb250aW51ZTsKKwkJCWlmICghUGFnZURpcnR5KHBhZ2UpKSB7CisJCQkJLyogc29tZW9uZSB3cm90ZSBpdCBmb3IgdXMgKi8KKwkJCQlnb3RvIGNvbnRpbnVlX3VubG9jazsKIAkJCX0KIAotCQkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSkKLQkJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCi0JCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSB8fAotCQkJICAgICFjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlKSkgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOworCQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKKwkJCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FKQorCQkJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkJCWVsc2UKKwkJCQkJZ290byBjb250aW51ZV91bmxvY2s7CiAJCQl9CiAKKwkJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJCWlmICghY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpCisJCQkJZ290byBjb250aW51ZV91bmxvY2s7CisKIAkJCXJldCA9ICgqd3JpdGVwYWdlKShwYWdlLCB3YmMsIGRhdGEpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlpZiAocmV0ID09IEFPUF9XUklURVBBR0VfQUNUSVZBVEUpIHsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCXJldCA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogZG9uZV9pbmRleCBpcyBzZXQgcGFzdCB0aGlzIHBhZ2UsCisJCQkJCSAqIHNvIG1lZGlhIGVycm9ycyB3aWxsIG5vdCBjaG9rZQorCQkJCQkgKiBiYWNrZ3JvdW5kIHdyaXRlb3V0IGZvciB0aGUgZW50aXJlCisJCQkJCSAqIGZpbGUuIFRoaXMgaGFzIGNvbnNlcXVlbmNlcyBmb3IKKwkJCQkJICogcmFuZ2VfY3ljbGljIHNlbWFudGljcyAoaWUuIGl0IG1heQorCQkJCQkgKiBub3QgYmUgc3VpdGFibGUgZm9yIGRhdGEgaW50ZWdyaXR5CisJCQkJCSAqIHdyaXRlb3V0KS4KKwkJCQkJICovCisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisgCQkJfQogCi0JCQlpZiAodW5saWtlbHkocmV0ID09IEFPUF9XUklURVBBR0VfQUNUSVZBVEUpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJcmV0ID0gMDsKKwkJCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUpIHsKKwkJCQl3YmMtPm5yX3RvX3dyaXRlLS07CisJCQkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkgeworCQkJCQlkb25lID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQotCQkJaWYgKHJldCB8fCAoLS1ucl90b193cml0ZSA8PSAwKSkKLQkJCQlkb25lID0gMTsKIAkJCWlmICh3YmMtPm5vbmJsb2NraW5nICYmIGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkgewogCQkJCXdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiA9IDE7CiAJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQotCWlmICghc2Nhbm5lZCAmJiAhZG9uZSkgeworCWlmICghY3ljbGVkKSB7CiAJCS8qCisJCSAqIHJhbmdlX2N5Y2xpYzoKIAkJICogV2UgaGl0IHRoZSBsYXN0IHBhZ2UgYW5kIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOiB3cmFwCiAJCSAqIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCiAJCSAqLwotCQlzY2FubmVkID0gMTsKKwkJY3ljbGVkID0gMTsKIAkJaW5kZXggPSAwOworCQllbmQgPSB3cml0ZWJhY2tfaW5kZXggLSAxOwogCQlnb3RvIHJldHJ5OwogCX0KIAlpZiAoIXdiYy0+bm9fbnJ3cml0ZV9pbmRleF91cGRhdGUpIHsKIAkJaWYgKHdiYy0+cmFuZ2VfY3ljbGljIHx8IChyYW5nZV93aG9sZSAmJiBucl90b193cml0ZSA+IDApKQotCQkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gaW5kZXg7CisJCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBkb25lX2luZGV4OwogCQl3YmMtPm5yX3RvX3dyaXRlID0gbnJfdG9fd3JpdGU7CiAJfQogCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggZDhhYzAxNC4uN2JmMjJlMCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtNjksNyArNjksNyBAQAogCiB1bnNpZ25lZCBsb25nIHRvdGFscmFtX3BhZ2VzIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIHRvdGFscmVzZXJ2ZV9wYWdlcyBfX3JlYWRfbW9zdGx5OwotbG9uZyBucl9zd2FwX3BhZ2VzOwordW5zaWduZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm4gX19yZWFkX21vc3RseTsKIGludCBwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb247CiAKICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEUKQEAgLTIyMywxOSArMjIzLDQxIEBACiAKIHN0YXRpYyB2b2lkIGJhZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXByaW50ayhLRVJOX0VNRVJHICJCYWQgcGFnZSBzdGF0ZSBpbiBwcm9jZXNzICclcydcbiIgS0VSTl9FTUVSRwotCQkicGFnZTolcCBmbGFnczoweCUwKmx4IG1hcHBpbmc6JXAgbWFwY291bnQ6JWQgY291bnQ6JWRcbiIsCi0JCWN1cnJlbnQtPmNvbW0sIHBhZ2UsIChpbnQpKDIqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwKLQkJKHVuc2lnbmVkIGxvbmcpcGFnZS0+ZmxhZ3MsIHBhZ2UtPm1hcHBpbmcsCi0JCXBhZ2VfbWFwY291bnQocGFnZSksIHBhZ2VfY291bnQocGFnZSkpOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc3VtZTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9zaG93bjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBucl91bnNob3duOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIlRyeWluZyB0byBmaXggaXQgdXAsIGJ1dCBhIHJlYm9vdCBpcyBuZWVkZWRcbiIKLQkJS0VSTl9FTUVSRyAiQmFja3RyYWNlOlxuIik7CisJLyoKKwkgKiBBbGxvdyBhIGJ1cnN0IG9mIDYwIHJlcG9ydHMsIHRoZW4ga2VlcCBxdWlldCBmb3IgdGhhdCBtaW51dGU7CisJICogb3IgYWxsb3cgYSBzdGVhZHkgZHJpcCBvZiBvbmUgcmVwb3J0IHBlciBzZWNvbmQuCisJICovCisJaWYgKG5yX3Nob3duID09IDYwKSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCByZXN1bWUpKSB7CisJCQlucl91bnNob3duKys7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobnJfdW5zaG93bikgeworCQkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJCSAgICAgICJCVUc6IEJhZCBwYWdlIHN0YXRlOiAlbHUgbWVzc2FnZXMgc3VwcHJlc3NlZFxuIiwKKwkJCQlucl91bnNob3duKTsKKwkJCW5yX3Vuc2hvd24gPSAwOworCQl9CisJCW5yX3Nob3duID0gMDsKKwl9CisJaWYgKG5yX3Nob3duKysgPT0gMCkKKwkJcmVzdW1lID0gamlmZmllcyArIDYwICogSFo7CisKKwlwcmludGsoS0VSTl9BTEVSVCAiQlVHOiBCYWQgcGFnZSBzdGF0ZSBpbiBwcm9jZXNzICVzICBwZm46JTA1bHhcbiIsCisJCWN1cnJlbnQtPmNvbW0sIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwlwcmludGsoS0VSTl9BTEVSVAorCQkicGFnZTolcCBmbGFnczolcCBjb3VudDolZCBtYXBjb3VudDolZCBtYXBwaW5nOiVwIGluZGV4OiVseFxuIiwKKwkJcGFnZSwgKHZvaWQgKilwYWdlLT5mbGFncywgcGFnZV9jb3VudChwYWdlKSwKKwkJcGFnZV9tYXBjb3VudChwYWdlKSwgcGFnZS0+bWFwcGluZywgcGFnZS0+aW5kZXgpOworCiAJZHVtcF9zdGFjaygpOwotCXBhZ2UtPmZsYWdzICY9IH5QQUdFX0ZMQUdTX0NMRUFSX1dIRU5fQkFEOwotCXNldF9wYWdlX2NvdW50KHBhZ2UsIDApOwotCXJlc2V0X3BhZ2VfbWFwY291bnQocGFnZSk7Ci0JcGFnZS0+bWFwcGluZyA9IE5VTEw7CitvdXQ6CisJLyogTGVhdmUgYmFkIGZpZWxkcyBmb3IgZGVidWcsIGV4Y2VwdCBQYWdlQnVkZHkgY291bGQgbWFrZSB0cm91YmxlICovCisJX19DbGVhclBhZ2VCdWRkeShwYWdlKTsKIAlhZGRfdGFpbnQoVEFJTlRfQkFEX1BBR0UpOwogfQogCkBAIC0yOTIsMjUgKzMxNCwzMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY29tcG91bmRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvcmRlcikKK3N0YXRpYyBpbnQgZGVzdHJveV9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9yZGVyKQogewogCWludCBpOwogCWludCBucl9wYWdlcyA9IDEgPDwgb3JkZXI7CisJaW50IGJhZCA9IDA7CiAKLQlpZiAodW5saWtlbHkoY29tcG91bmRfb3JkZXIocGFnZSkgIT0gb3JkZXIpKQorCWlmICh1bmxpa2VseShjb21wb3VuZF9vcmRlcihwYWdlKSAhPSBvcmRlcikgfHwKKwkgICAgdW5saWtlbHkoIVBhZ2VIZWFkKHBhZ2UpKSkgewogCQliYWRfcGFnZShwYWdlKTsKKwkJYmFkKys7CisJfQogCi0JaWYgKHVubGlrZWx5KCFQYWdlSGVhZChwYWdlKSkpCi0JCQliYWRfcGFnZShwYWdlKTsKIAlfX0NsZWFyUGFnZUhlYWQocGFnZSk7CisKIAlmb3IgKGkgPSAxOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcCA9IHBhZ2UgKyBpOwogCi0JCWlmICh1bmxpa2VseSghUGFnZVRhaWwocCkgfAotCQkJCShwLT5maXJzdF9wYWdlICE9IHBhZ2UpKSkKKwkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwKSB8IChwLT5maXJzdF9wYWdlICE9IHBhZ2UpKSkgewogCQkJYmFkX3BhZ2UocGFnZSk7CisJCQliYWQrKzsKKwkJfQogCQlfX0NsZWFyUGFnZVRhaWwocCk7CiAJfQorCisJcmV0dXJuIGJhZDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHByZXBfemVyb19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3JkZXIsIGdmcF90IGdmcF9mbGFncykKQEAgLTQzMCw3ICs0NTgsOCBAQAogCWludCBtaWdyYXRldHlwZSA9IGdldF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSk7CiAKIAlpZiAodW5saWtlbHkoUGFnZUNvbXBvdW5kKHBhZ2UpKSkKLQkJZGVzdHJveV9jb21wb3VuZF9wYWdlKHBhZ2UsIG9yZGVyKTsKKwkJaWYgKHVubGlrZWx5KGRlc3Ryb3lfY29tcG91bmRfcGFnZShwYWdlLCBvcmRlcikpKQorCQkJcmV0dXJuOwogCiAJcGFnZV9pZHggPSBwYWdlX3RvX3BmbihwYWdlKSAmICgoMSA8PCBNQVhfT1JERVIpIC0gMSk7CiAKQEAgLTQ2NywxOCArNDk2LDEzIEBACiAJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgfAogCQkocGFnZS0+bWFwcGluZyAhPSBOVUxMKSAgfAogCQkocGFnZV9jb3VudChwYWdlKSAhPSAwKSAgfAotCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUpKSkKKwkJKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9GUkVFKSkpIHsKIAkJYmFkX3BhZ2UocGFnZSk7Ci0JaWYgKFBhZ2VEaXJ0eShwYWdlKSkKLQkJX19DbGVhclBhZ2VEaXJ0eShwYWdlKTsKLQlpZiAoUGFnZVN3YXBCYWNrZWQocGFnZSkpCi0JCV9fQ2xlYXJQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQkvKgotCSAqIEZvciBub3csIHdlIHJlcG9ydCBpZiBQR19yZXNlcnZlZCB3YXMgZm91bmQgc2V0LCBidXQgZG8gbm90Ci0JICogY2xlYXIgaXQsIGFuZCBkbyBub3QgZnJlZSB0aGUgcGFnZS4gIEJ1dCB3ZSBzaGFsbCBzb29uIG5lZWQKLQkgKiB0byBkbyBtb3JlLCBmb3Igd2hlbiB0aGUgWkVST19QQUdFIGNvdW50IHdyYXBzIG5lZ2F0aXZlLgotCSAqLwotCXJldHVybiBQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVApCisJCXBhZ2UtPmZsYWdzICY9IH5QQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVA7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC01MjMsMTEgKzU0NywxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7Ci0JaW50IHJlc2VydmVkID0gMDsKKwlpbnQgYmFkID0gMDsKIAogCWZvciAoaSA9IDAgOyBpIDwgKDEgPDwgb3JkZXIpIDsgKytpKQotCQlyZXNlcnZlZCArPSBmcmVlX3BhZ2VzX2NoZWNrKHBhZ2UgKyBpKTsKLQlpZiAocmVzZXJ2ZWQpCisJCWJhZCArPSBmcmVlX3BhZ2VzX2NoZWNrKHBhZ2UgKyBpKTsKKwlpZiAoYmFkKQogCQlyZXR1cm47CiAKIAlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CkBAIC02MTIsMjMgKzYzNiwxMSBAQAogCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIHwKIAkJKHBhZ2UtPm1hcHBpbmcgIT0gTlVMTCkgIHwKIAkJKHBhZ2VfY291bnQocGFnZSkgIT0gMCkgIHwKLQkJKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9QUkVQKSkpCisJCShwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUCkpKSB7CiAJCWJhZF9wYWdlKHBhZ2UpOwotCi0JLyoKLQkgKiBGb3Igbm93LCB3ZSByZXBvcnQgaWYgUEdfcmVzZXJ2ZWQgd2FzIGZvdW5kIHNldCwgYnV0IGRvIG5vdAotCSAqIGNsZWFyIGl0LCBhbmQgZG8gbm90IGFsbG9jYXRlIHRoZSBwYWdlOiBhcyBhIHNhZmV0eSBuZXQuCi0JICovCi0JaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJcmV0dXJuIDE7CisJfQogCi0JcGFnZS0+ZmxhZ3MgJj0gfigxIDw8IFBHX3VwdG9kYXRlIHwgMSA8PCBQR19lcnJvciB8IDEgPDwgUEdfcmVjbGFpbSB8Ci0JCQkxIDw8IFBHX3JlZmVyZW5jZWQgfCAxIDw8IFBHX2FyY2hfMSB8Ci0JCQkxIDw8IFBHX293bmVyX3ByaXZfMSB8IDEgPDwgUEdfbWFwcGVkdG9kaXNrCi0jaWZkZWYgQ09ORklHX1VORVZJQ1RBQkxFX0xSVQotCQkJfCAxIDw8IFBHX21sb2NrZWQKLSNlbmRpZgotCQkJKTsKIAlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCXNldF9wYWdlX3JlZmNvdW50ZWQocGFnZSk7CiAKQEAgLTI2MDksNiArMjYyMSw5IEBACiAJdW5zaWduZWQgbG9uZyBwZm47CiAJc3RydWN0IHpvbmUgKno7CiAKKwlpZiAoaGlnaGVzdF9tZW1tYXBfcGZuIDwgZW5kX3BmbiAtIDEpCisJCWhpZ2hlc3RfbWVtbWFwX3BmbiA9IGVuZF9wZm4gLSAxOworCiAJeiA9ICZOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lc1t6b25lXTsKIAlmb3IgKHBmbiA9IHN0YXJ0X3BmbjsgcGZuIDwgZW5kX3BmbjsgcGZuKyspIHsKIAkJLyoKQEAgLTMzODEsMTAgKzMzOTYsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgdXNlbWFwc2l6ZSA9IHVzZW1hcF9zaXplKHpvbmVzaXplKTsKIAl6b25lLT5wYWdlYmxvY2tfZmxhZ3MgPSBOVUxMOwotCWlmICh1c2VtYXBzaXplKSB7CisJaWYgKHVzZW1hcHNpemUpCiAJCXpvbmUtPnBhZ2VibG9ja19mbGFncyA9IGFsbG9jX2Jvb3RtZW1fbm9kZShwZ2RhdCwgdXNlbWFwc2l6ZSk7Ci0JCW1lbXNldCh6b25lLT5wYWdlYmxvY2tfZmxhZ3MsIDAsIHVzZW1hcHNpemUpOwotCX0KIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBpbmxpbmUgc2V0dXBfdXNlbWFwKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCkBAIC0zNDY5LDkgKzM0ODIsMTAgQEAKIAkJCVBBR0VfQUxJR04oc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpID4+IFBBR0VfU0hJRlQ7CiAJCWlmIChyZWFsc2l6ZSA+PSBtZW1tYXBfcGFnZXMpIHsKIAkJCXJlYWxzaXplIC09IG1lbW1hcF9wYWdlczsKLQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJIiAgJXMgem9uZTogJWx1IHBhZ2VzIHVzZWQgZm9yIG1lbW1hcFxuIiwKLQkJCQl6b25lX25hbWVzW2pdLCBtZW1tYXBfcGFnZXMpOworCQkJaWYgKG1lbW1hcF9wYWdlcykKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiICAlcyB6b25lOiAlbHUgcGFnZXMgdXNlZCBmb3IgbWVtbWFwXG4iLAorCQkJCSAgICAgICB6b25lX25hbWVzW2pdLCBtZW1tYXBfcGFnZXMpOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkiICAlcyB6b25lOiAlbHUgcGFnZXMgZXhjZWVkcyByZWFsc2l6ZSAlbHVcbiIsCkBAIC00MzE2LDcgKzQzMzAsNyBAQAogICogICAgMVRCICAgICAxMDEgICAgICAgIDEwR0IKICAqICAgMTBUQiAgICAgMzIwICAgICAgICAzMkdCCiAgKi8KLXZvaWQgc2V0dXBfcGVyX3pvbmVfaW5hY3RpdmVfcmF0aW8odm9pZCkKK3N0YXRpYyB2b2lkIHNldHVwX3Blcl96b25lX2luYWN0aXZlX3JhdGlvKHZvaWQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKQEAgLTQ1NzMsMTkgKzQ1ODcsNiBAQAogCXJldHVybiB0YWJsZTsKIH0KIAotI2lmZGVmIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRQotc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXJldHVybiBfX3Bmbl90b19wYWdlKHBmbik7Ci19Ci11bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiBfX3BhZ2VfdG9fcGZuKHBhZ2UpOwotfQotRVhQT1JUX1NZTUJPTChwZm5fdG9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHBhZ2VfdG9fcGZuKTsKLSNlbmRpZiAvKiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UgKi8KLQogLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0b3JpbmcgYml0cyBhZmZlY3RpbmcgYSBibG9jayBvZiBwYWdlcyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpnZXRfcGFnZWJsb2NrX2JpdG1hcChzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQkJCQl1bnNpZ25lZCBsb25nIHBmbikKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IGFiMjdmZjcuLmQ2NTA3YTYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiB9CiAKIC8qIF9fYWxsb2NfYm9vdG1lbS4uLigpIGlzIHByb3RlY3RlZCBieSAhc2xhYl9hdmFpbGFibGUoKSAqLwotaW50IF9faW5pdF9yZWZvayBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgaW50IF9faW5pdF9yZWZvayBpbml0X3NlY3Rpb25fcGFnZV9jZ3JvdXAodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqYmFzZSwgKnBjOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jCmluZGV4IDA2NWM0NDguLmRjNmNlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaW8uYworKysgYi9tbS9wYWdlX2lvLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IHJldCA9IDAsIHJ3ID0gV1JJVEU7CiAKLQlpZiAocmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2UocGFnZSkpIHsKKwlpZiAodHJ5X3RvX2ZyZWVfc3dhcChwYWdlKSkgewogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTI1LDggKzEyNSw4IEBACiAJc3RydWN0IGJpbyAqYmlvOwogCWludCByZXQgPSAwOwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTihQYWdlVXB0b2RhdGUocGFnZSkpOwogCWJpbyA9IGdldF9zd2FwX2JpbyhHRlBfS0VSTkVMLCBwYWdlX3ByaXZhdGUocGFnZSksIHBhZ2UsCiAJCQkJZW5kX3N3YXBfYmlvX3JlYWQpOwogCWlmIChiaW8gPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDEwOTkzOTQuLmFjNGFmOGMgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTQ3LDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIApAQCAtMTkxLDcgKzE5MSw3IEBACiAgKiBHZXR0aW5nIGEgbG9jayBvbiBhIHN0YWJsZSBhbm9uX3ZtYSBmcm9tIGEgcGFnZSBvZmYgdGhlIExSVSBpcwogICogdHJpY2t5OiBwYWdlX2xvY2tfYW5vbl92bWEgcmVseSBvbiBSQ1UgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgcmFjZXMuCiAgKi8KLXN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWE7CiAJdW5zaWduZWQgbG9uZyBhbm9uX21hcHBpbmc7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBwYWdlX3VubG9ja19hbm9uX3ZtYShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQorc3RhdGljIHZvaWQgcGFnZV91bmxvY2tfYW5vbl92bWEoc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSkKIHsKIAlzcGluX3VubG9jaygmYW5vbl92bWEtPmxvY2spOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMzU5LDggKzM1OSwxNyBAQAogCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKLQlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKQotCQlyZWZlcmVuY2VkKys7CisJaWYgKHB0ZXBfY2xlYXJfZmx1c2hfeW91bmdfbm90aWZ5KHZtYSwgYWRkcmVzcywgcHRlKSkgeworCQkvKgorCQkgKiBEb24ndCB0cmVhdCBhIHJlZmVyZW5jZSB0aHJvdWdoIGEgc2VxdWVudGlhbGx5IHJlYWQKKwkJICogbWFwcGluZyBhcyBzdWNoLiAgSWYgdGhlIHBhZ2UgaGFzIGJlZW4gdXNlZCBpbgorCQkgKiBhbm90aGVyIG1hcHBpbmcsIHdlIHdpbGwgY2F0Y2ggaXQ7IGlmIHRoaXMgb3RoZXIKKwkJICogbWFwcGluZyBpcyBhbHJlYWR5IGdvbmUsIHRoZSB1bm1hcCBwYXRoIHdpbGwgaGF2ZQorCQkgKiBzZXQgUEdfcmVmZXJlbmNlZCBvciBhY3RpdmF0ZWQgdGhlIHBhZ2UuCisJCSAqLworCQlpZiAobGlrZWx5KCFWTV9TZXF1ZW50aWFsUmVhZEhpbnQodm1hKSkpCisJCQlyZWZlcmVuY2VkKys7CisJfQogCiAJLyogUHJldGVuZCB0aGUgcGFnZSBpcyByZWZlcmVuY2VkIGlmIHRoZSB0YXNrIGhhcyB0aGUKIAkgICBzd2FwIHRva2VuIGFuZCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcGFnZSBmYXVsdC4gKi8KQEAgLTY2MSw5ICs2NzAsMTQgQEAKIHZvaWQgcGFnZV9hZGRfbmV3X2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCUJVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKLQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDApOyAvKiBlbGV2YXRlIGNvdW50IGJ5IDEgKHN0YXJ0cyBhdCAtMSkgKi8KKwlWTV9CVUdfT04oYWRkcmVzcyA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkcmVzcyA+PSB2bWEtPnZtX2VuZCk7CisJU2V0UGFnZVN3YXBCYWNrZWQocGFnZSk7CisJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAwKTsgLyogaW5jcmVtZW50IGNvdW50IChzdGFydHMgYXQgLTEpICovCiAJX19wYWdlX3NldF9hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKKwlpZiAocGFnZV9ldmljdGFibGUocGFnZSwgdm1hKSkKKwkJbHJ1X2NhY2hlX2FkZF9scnUocGFnZSwgTFJVX0FDVElWRV9BTk9OKTsKKwllbHNlCisJCWFkZF9wYWdlX3RvX3VuZXZpY3RhYmxlX2xpc3QocGFnZSk7CiB9CiAKIC8qKgpAQCAtNjkzLDcgKzcwNyw2IEBACiAgKi8KIHZvaWQgcGFnZV9kdXBfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlCVUdfT04ocGFnZV9tYXBjb3VudChwYWdlKSA9PSAwKTsKIAlpZiAoUGFnZUFub24ocGFnZSkpCiAJCV9fcGFnZV9jaGVja19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAlhdG9taWNfaW5jKCZwYWdlLT5fbWFwY291bnQpOwpAQCAtNzAzLDI4ICs3MTYsMTIgQEAKIC8qKgogICogcGFnZV9yZW1vdmVfcm1hcCAtIHRha2UgZG93biBwdGUgbWFwcGluZyBmcm9tIGEgcGFnZQogICogQHBhZ2U6IHBhZ2UgdG8gcmVtb3ZlIG1hcHBpbmcgZnJvbQotICogQHZtYTogdGhlIHZtIGFyZWEgaW4gd2hpY2ggdGhlIG1hcHBpbmcgaXMgcmVtb3ZlZAogICoKICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcHRlIGxvY2suCiAgKi8KLXZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit2b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKGF0b21pY19hZGRfbmVnYXRpdmUoLTEsICZwYWdlLT5fbWFwY291bnQpKSB7Ci0JCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCkpIHsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiRWVlayEgcGFnZV9tYXBjb3VudChwYWdlKSB3ZW50IG5lZ2F0aXZlISAoJWQpXG4iLCBwYWdlX21hcGNvdW50KHBhZ2UpKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlIHBmbiA9ICVseFxuIiwgcGFnZV90b19wZm4ocGFnZSkpOwotCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UtPmZsYWdzID0gJWx4XG4iLCBwYWdlLT5mbGFncyk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+Y291bnQgPSAleFxuIiwgcGFnZV9jb3VudChwYWdlKSk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+bWFwcGluZyA9ICVwXG4iLCBwYWdlLT5tYXBwaW5nKTsKLQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX29wcyA9ICVzXG4iLCAodW5zaWduZWQgbG9uZyl2bWEtPnZtX29wcyk7Ci0JCQlpZiAodm1hLT52bV9vcHMpIHsKLQkJCQlwcmludF9zeW1ib2wgKEtFUk5fRU1FUkcgIiAgdm1hLT52bV9vcHMtPmZhdWx0ID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fb3BzLT5mYXVsdCk7Ci0JCQl9Ci0JCQlpZiAodm1hLT52bV9maWxlICYmIHZtYS0+dm1fZmlsZS0+Zl9vcCkKLQkJCQlwcmludF9zeW1ib2wgKEtFUk5fRU1FUkcgIiAgdm1hLT52bV9maWxlLT5mX29wLT5tbWFwID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCk7Ci0JCQlCVUcoKTsKLQkJfQotCiAJCS8qCiAJCSAqIE5vdyB0aGF0IHRoZSBsYXN0IHB0ZSBoYXMgZ29uZSwgczM5MCBtdXN0IHRyYW5zZmVyIGRpcnR5CiAJCSAqIGZsYWcgZnJvbSBzdG9yYWdlIGtleSB0byBzdHJ1Y3QgcGFnZS4gIFdlIGNhbiB1c3VhbGx5IHNraXAKQEAgLTgxOCw4ICs4MTUsNyBAQAogCQkJCXNwaW5fdW5sb2NrKCZtbWxpc3RfbG9jayk7CiAJCQl9CiAJCQlkZWNfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOwotI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTikgewogCQkJLyoKIAkJCSAqIFN0b3JlIHRoZSBwZm4gb2YgdGhlIHBhZ2UgaW4gYSBzcGVjaWFsIG1pZ3JhdGlvbgogCQkJICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvbgpAQCAtODI3LDIzICs4MjMsMTkgQEAKIAkJCSAqLwogCQkJQlVHX09OKCFtaWdyYXRpb24pOwogCQkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeShwYWdlLCBwdGVfd3JpdGUocHRldmFsKSk7Ci0jZW5kaWYKIAkJfQogCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHN3cF9lbnRyeV90b19wdGUoZW50cnkpKTsKIAkJQlVHX09OKHB0ZV9maWxlKCpwdGUpKTsKLQl9IGVsc2UKLSNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCi0JaWYgKG1pZ3JhdGlvbikgeworCX0gZWxzZSBpZiAoUEFHRV9NSUdSQVRJT04gJiYgbWlncmF0aW9uKSB7CiAJCS8qIEVzdGFibGlzaCBtaWdyYXRpb24gZW50cnkgZm9yIGEgZmlsZSBwYWdlICovCiAJCXN3cF9lbnRyeV90IGVudHJ5OwogCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLCBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KSk7CiAJfSBlbHNlCi0jZW5kaWYKIAkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAogCi0JcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCiBvdXRfdW5tYXA6CkBAIC05NTgsNyArOTUwLDcgQEAKIAkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQogCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAKLQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCWRlY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CiAJCSgqbWFwY291bnQpLS07CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCBmMWIwZDQ4Li41OTQxZjk4IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTE0LDMxICsxNCwzOSBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LCBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uIDxsa2NsQGxrY2wubmV0PgogICogQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgogICoKKyAqIHRpbnktc2htZW06CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CisgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OworCisjaWZkZWYgQ09ORklHX1NITUVNCiAvKgogICogVGhpcyB2aXJ0dWFsIG1lbW9yeSBmaWxlc3lzdGVtIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIHJhbWZzLiBJdAogICogZXh0ZW5kcyByYW1mcyBieSB0aGUgYWJpbGl0eSB0byB1c2Ugc3dhcCBhbmQgaG9ub3IgcmVzb3VyY2UgbGltaXRzCiAgKiB3aGljaCBtYWtlcyBpdCBhIGNvbXBsZXRlbHkgdXNhYmxlIGZpbGVzeXN0ZW0uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5lcmljX2FjbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTE0NDQsNyArMTQ1Miw2IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gKChlcnJvciA9PSAtRU5PTUVNKSA/IFZNX0ZBVUxUX09PTSA6IFZNX0ZBVUxUX1NJR0JVUyk7CiAKLQltYXJrX3BhZ2VfYWNjZXNzZWQodm1mLT5wYWdlKTsKIAlyZXR1cm4gcmV0IHwgVk1fRkFVTFRfTE9DS0VEOwogfQogCkBAIC0yNDg2LDcgKzI0OTMsNiBAQAogCS5nZXRfc2IJCT0gc2htZW1fZ2V0X3NiLAogCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCiB9Owotc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQogewpAQCAtMjUyNSw3ICsyNTMxLDUxIEBACiAJc2htX21udCA9IEVSUl9QVFIoZXJyb3IpOwogCXJldHVybiBlcnJvcjsKIH0KLW1vZHVsZV9pbml0KGluaXRfdG1wZnMpCisKKyNlbHNlIC8qICFDT05GSUdfU0hNRU0gKi8KKworLyoKKyAqIHRpbnktc2htZW06IHNpbXBsZSBzaG1lbWZzIGFuZCB0bXBmcyB1c2luZyByYW1mcyBjb2RlCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc21hbGwgc3lzdGVtIHdoZXJlIHRoZSBiZW5lZml0cyBvZiB0aGUgZnVsbAorICogc2htZW0gY29kZSAoc3dhcC1iYWNrZWQgYW5kIHJlc291cmNlLWxpbWl0ZWQpIGFyZSBvdXR3ZWlnaGVkIGJ5CisgKiB0aGVpciBjb21wbGV4aXR5LiBPbiBzeXN0ZW1zIHdpdGhvdXQgc3dhcCB0aGlzIGNvZGUgc2hvdWxkIGJlCisgKiBlZmZlY3RpdmVseSBlcXVpdmFsZW50LCBidXQgbXVjaCBsaWdodGVyIHdlaWdodC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gInRtcGZzIiwKKwkuZ2V0X3NiCQk9IHJhbWZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQoreworCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKSAhPSAwKTsKKworCXNobV9tbnQgPSBrZXJuX21vdW50KCZ0bXBmc19mc190eXBlKTsKKwlCVUdfT04oSVNfRVJSKHNobV9tbnQpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIHNobWVtX2ZpbGVfb3BlcmF0aW9ucyByYW1mc19maWxlX29wZXJhdGlvbnMKKyNkZWZpbmUgc2htZW1fdm1fb3BzIGdlbmVyaWNfZmlsZV92bV9vcHMKKyNkZWZpbmUgc2htZW1fZ2V0X2lub2RlIHJhbWZzX2dldF9pbm9kZQorI2RlZmluZSBzaG1lbV9hY2N0X3NpemUoYSwgYikgMAorI2RlZmluZSBzaG1lbV91bmFjY3Rfc2l6ZShhLCBiKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgU0hNRU1fTUFYX0JZVEVTIExMT05HX01BWAorCisjZW5kaWYgLyogQ09ORklHX1NITUVNICovCisKKy8qIGNvbW1vbiBjb2RlICovCiAKIC8qKgogICogc2htZW1fZmlsZV9zZXR1cCAtIGdldCBhbiB1bmxpbmtlZCBmaWxlIGxpdmluZyBpbiB0bXBmcwpAQCAtMjU2OSwxMiArMjYxOSwyMCBAQAogCWlmICghaW5vZGUpCiAJCWdvdG8gY2xvc2VfZmlsZTsKIAorI2lmZGVmIENPTkZJR19TSE1FTQogCVNITUVNX0koaW5vZGUpLT5mbGFncyA9IGZsYWdzICYgVk1fQUNDT1VOVDsKKyNlbmRpZgogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CiAJaW5vZGUtPmlfbmxpbmsgPSAwOwkvKiBJdCBpcyB1bmxpbmtlZCAqLwogCWluaXRfZmlsZShmaWxlLCBzaG1fbW50LCBkZW50cnksIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCwKLQkJCSZzaG1lbV9maWxlX29wZXJhdGlvbnMpOworCQkgICZzaG1lbV9maWxlX29wZXJhdGlvbnMpOworCisjaWZuZGVmIENPTkZJR19NTVUKKwllcnJvciA9IHJhbWZzX25vbW11X2V4cGFuZF9mb3JfbWFwcGluZyhpbm9kZSwgc2l6ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsb3NlX2ZpbGU7CisjZW5kaWYKIAlyZXR1cm4gZmlsZTsKIAogY2xvc2VfZmlsZToKQEAgLTI2MDYsMyArMjY2NCw1IEBACiAJdm1hLT52bV9vcHMgPSAmc2htZW1fdm1fb3BzOwogCXJldHVybiAwOwogfQorCittb2R1bGVfaW5pdChpbml0X3RtcGZzKQpkaWZmIC0tZ2l0IGEvbW0vc3dhcC5jIGIvbW0vc3dhcC5jCmluZGV4IGIxMzVlYzkuLmJhMmMwZTggMTAwNjQ0Ci0tLSBhL21tL3N3YXAuYworKysgYi9tbS9zd2FwLmMKQEAgLTI0NiwyNSArMjQ2LDYgQEAKIAlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIH0KIAotLyoqCi0gKiBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZQotICogQHBhZ2U6ICB0aGUgcGFnZSB0byBiZSBhZGRlZCB0byBMUlUKLSAqIEB2bWE6ICAgdm1hIGluIHdoaWNoIHBhZ2UgaXMgbWFwcGVkIGZvciBkZXRlcm1pbmluZyByZWNsYWltYWJpbGl0eQotICoKLSAqIHBsYWNlIEBwYWdlIG9uIGFjdGl2ZSBvciB1bmV2aWN0YWJsZSBMUlUgbGlzdCwgZGVwZW5kaW5nIG9uCi0gKiBwYWdlX2V2aWN0YWJsZSgpLiAgTm90ZSB0aGF0IGlmIHRoZSBwYWdlIGlzIG5vdCBldmljdGFibGUsCi0gKiBpdCBnb2VzIGRpcmVjdGx5IGJhY2sgb250byBpdCdzIHpvbmUncyB1bmV2aWN0YWJsZSBsaXN0LiAgSXQgZG9lcwotICogTk9UIHVzZSBhIHBlciBjcHUgcGFnZXZlYy4KLSAqLwotdm9pZCBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaWYgKHBhZ2VfZXZpY3RhYmxlKHBhZ2UsIHZtYSkpCi0JCWxydV9jYWNoZV9hZGRfbHJ1KHBhZ2UsIExSVV9BQ1RJVkUgKyBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpOwotCWVsc2UKLQkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKLX0KLQogLyoKICAqIERyYWluIHBhZ2VzIG91dCBvZiB0aGUgY3B1J3MgcGFnZXZlY3MuCiAgKiBFaXRoZXIgImNwdSIgaXMgdGhlIGN1cnJlbnQgQ1BVLCBhbmQgcHJlZW1wdGlvbiBoYXMgYWxyZWFkeSBiZWVuCkBAIC0zOTgsMjggKzM3OSw2IEBACiBFWFBPUlRfU1lNQk9MKF9fcGFnZXZlY19yZWxlYXNlKTsKIAogLyoKLSAqIHBhZ2V2ZWNfcmVsZWFzZSgpIGZvciBwYWdlcyB3aGljaCBhcmUga25vd24gdG8gbm90IGJlIG9uIHRoZSBMUlUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGlzZXMgdGhlIGNhbGxlcidzIHBhZ2V2ZWMuCi0gKi8KLXZvaWQgX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHN0cnVjdCBwYWdldmVjICpwdmVjKQotewotCWludCBpOwotCXN0cnVjdCBwYWdldmVjIHBhZ2VzX3RvX2ZyZWU7Ci0KLQlwYWdldmVjX2luaXQoJnBhZ2VzX3RvX2ZyZWUsIHB2ZWMtPmNvbGQpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KHB2ZWMpOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLT5wYWdlc1tpXTsKLQotCQlWTV9CVUdfT04oUGFnZUxSVShwYWdlKSk7Ci0JCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkKLQkJCXBhZ2V2ZWNfYWRkKCZwYWdlc190b19mcmVlLCBwYWdlKTsKLQl9Ci0JcGFnZXZlY19mcmVlKCZwYWdlc190b19mcmVlKTsKLQlwYWdldmVjX3JlaW5pdChwdmVjKTsKLX0KLQotLyoKICAqIEFkZCB0aGUgcGFzc2VkIHBhZ2VzIHRvIHRoZSBMUlUsIHRoZW4gZHJvcCB0aGUgY2FsbGVyJ3MgcmVmY291bnQKICAqIG9uIHRoZW0uICBSZWluaXRpYWxpc2VzIHRoZSBjYWxsZXIncyBwYWdldmVjLgogICovCkBAIC00OTUsOCArNDU0LDcgQEAKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLT5wYWdlc1tpXTsKIAogCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiB0cnlsb2NrX3BhZ2UocGFnZSkpIHsKLQkJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQotCQkJCXJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihwYWdlKTsKKwkJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCAzMzUzYzkwLi44MWM4MjVmIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC03MiwxMCArNzIsMTAgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwotCUJVR19PTihQYWdlU3dhcENhY2hlKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwotCUJVR19PTighUGFnZVN3YXBCYWNrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VTd2FwQ2FjaGUocGFnZSkpOworCVZNX0JVR19PTighUGFnZVN3YXBCYWNrZWQocGFnZSkpOworCiAJZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoZ2ZwX21hc2spOwogCWlmICghZXJyb3IpIHsKIAkJcGFnZV9jYWNoZV9nZXQocGFnZSk7CkBAIC0xMDgsMTAgKzEwOCw5IEBACiAgKi8KIHZvaWQgX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7Ci0JQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwogCiAJcmFkaXhfdHJlZV9kZWxldGUoJnN3YXBwZXJfc3BhY2UucGFnZV90cmVlLCBwYWdlX3ByaXZhdGUocGFnZSkpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CkBAIC0xMjksMTMgKzEyOCwxMyBAQAogICogQWxsb2NhdGUgc3dhcCBzcGFjZSBmb3IgdGhlIHBhZ2UgYW5kIGFkZCB0aGUgcGFnZSB0byB0aGUKICAqIHN3YXAgY2FjaGUuICBDYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcGFnZSBsb2NrLiAKICAqLwotaW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICogcGFnZSwgZ2ZwX3QgZ2ZwX21hc2spCitpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJc3dwX2VudHJ5X3QgZW50cnk7CiAJaW50IGVycjsKIAotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7Ci0JQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOwogCiAJZm9yICg7OykgewogCQllbnRyeSA9IGdldF9zd2FwX3BhZ2UoKTsKQEAgLTE1NCw3ICsxNTMsNyBAQAogCQkgKiBBZGQgaXQgdG8gdGhlIHN3YXAgY2FjaGUgYW5kIG1hcmsgaXQgZGlydHkKIAkJICovCiAJCWVyciA9IGFkZF90b19zd2FwX2NhY2hlKHBhZ2UsIGVudHJ5LAotCQkJCWdmcF9tYXNrfF9fR0ZQX05PTUVNQUxMT0N8X19HRlBfTk9XQVJOKTsKKwkJCQlfX0dGUF9ISUdIfF9fR0ZQX05PTUVNQUxMT0N8X19HRlBfTk9XQVJOKTsKIAogCQlzd2l0Y2ggKGVycikgewogCQljYXNlIDA6CQkJCS8qIFN1Y2Nlc3MgKi8KQEAgLTE5NiwxNCArMTk1LDE0IEBACiAgKiBJZiB3ZSBhcmUgdGhlIG9ubHkgdXNlciwgdGhlbiB0cnkgdG8gZnJlZSB1cCB0aGUgc3dhcCBjYWNoZS4gCiAgKiAKICAqIEl0cyBvayB0byBjaGVjayBmb3IgUGFnZVN3YXBDYWNoZSB3aXRob3V0IHRoZSBwYWdlIGxvY2sKLSAqIGhlcmUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVjaGVjayBhZ2FpbiBpbnNpZGUgCi0gKiBleGNsdXNpdmVfc3dhcF9wYWdlKCkgX3dpdGhfIHRoZSBsb2NrLiAKKyAqIGhlcmUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVjaGVjayBhZ2FpbiBpbnNpZGUKKyAqIHRyeV90b19mcmVlX3N3YXAoKSBfd2l0aF8gdGhlIGxvY2suCiAgKiAJCQkJCS0gTWFyY2VsbwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewotCQlyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShwYWdlKTsKKwlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiAhcGFnZV9tYXBwZWQocGFnZSkgJiYgdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDU0YTlmODcuLmVlYzVjYTcgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2htLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0zNSw2ICszNiw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dhcF9sb2NrKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfc3dhcGZpbGVzOworbG9uZyBucl9zd2FwX3BhZ2VzOwogbG9uZyB0b3RhbF9zd2FwX3BhZ2VzOwogc3RhdGljIGludCBzd2FwX292ZXJmbG93Owogc3RhdGljIGludCBsZWFzdF9wcmlvcml0eTsKQEAgLTgzLDE1ICs4NSw5NiBAQAogCXVwX3JlYWQoJnN3YXBfdW5wbHVnX3NlbSk7CiB9CiAKKy8qCisgKiBzd2Fwb24gdGVsbCBkZXZpY2UgdGhhdCBhbGwgdGhlIG9sZCBzd2FwIGNvbnRlbnRzIGNhbiBiZSBkaXNjYXJkZWQsCisgKiB0byBhbGxvdyB0aGUgc3dhcCBkZXZpY2UgdG8gb3B0aW1pemUgaXRzIHdlYXItbGV2ZWxsaW5nLgorICovCitzdGF0aWMgaW50IGRpc2NhcmRfc3dhcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCit7CisJc3RydWN0IHN3YXBfZXh0ZW50ICpzZTsKKwlpbnQgZXJyID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2UsICZzaS0+ZXh0ZW50X2xpc3QsIGxpc3QpIHsKKwkJc2VjdG9yX3Qgc3RhcnRfYmxvY2sgPSBzZS0+c3RhcnRfYmxvY2sgPDwgKFBBR0VfU0hJRlQgLSA5KTsKKwkJc2VjdG9yX3QgbnJfYmxvY2tzID0gKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDkpOworCisJCWlmIChzZS0+c3RhcnRfcGFnZSA9PSAwKSB7CisJCQkvKiBEbyBub3QgZGlzY2FyZCB0aGUgc3dhcCBoZWFkZXIgcGFnZSEgKi8KKwkJCXN0YXJ0X2Jsb2NrICs9IDEgPDwgKFBBR0VfU0hJRlQgLSA5KTsKKwkJCW5yX2Jsb2NrcyAtPSAxIDw8IChQQUdFX1NISUZUIC0gOSk7CisJCQlpZiAoIW5yX2Jsb2NrcykKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKHNpLT5iZGV2LCBzdGFydF9ibG9jaywKKwkJCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIGVycjsJCS8qIFRoYXQgd2lsbCBvZnRlbiBiZSAtRU9QTk9UU1VQUCAqLworfQorCisvKgorICogc3dhcCBhbGxvY2F0aW9uIHRlbGwgZGV2aWNlIHRoYXQgYSBjbHVzdGVyIG9mIHN3YXAgY2FuIG5vdyBiZSBkaXNjYXJkZWQsCisgKiB0byBhbGxvdyB0aGUgc3dhcCBkZXZpY2UgdG8gb3B0aW1pemUgaXRzIHdlYXItbGV2ZWxsaW5nLgorICovCitzdGF0aWMgdm9pZCBkaXNjYXJkX3N3YXBfY2x1c3RlcihzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksCisJCQkJIHBnb2ZmX3Qgc3RhcnRfcGFnZSwgcGdvZmZfdCBucl9wYWdlcykKK3sKKwlzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlID0gc2ktPmN1cnJfc3dhcF9leHRlbnQ7CisJaW50IGZvdW5kX2V4dGVudCA9IDA7CisKKwl3aGlsZSAobnJfcGFnZXMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisKKwkJaWYgKHNlLT5zdGFydF9wYWdlIDw9IHN0YXJ0X3BhZ2UgJiYKKwkJICAgIHN0YXJ0X3BhZ2UgPCBzZS0+c3RhcnRfcGFnZSArIHNlLT5ucl9wYWdlcykgeworCQkJcGdvZmZfdCBvZmZzZXQgPSBzdGFydF9wYWdlIC0gc2UtPnN0YXJ0X3BhZ2U7CisJCQlzZWN0b3JfdCBzdGFydF9ibG9jayA9IHNlLT5zdGFydF9ibG9jayArIG9mZnNldDsKKwkJCXNlY3Rvcl90IG5yX2Jsb2NrcyA9IHNlLT5ucl9wYWdlcyAtIG9mZnNldDsKKworCQkJaWYgKG5yX2Jsb2NrcyA+IG5yX3BhZ2VzKQorCQkJCW5yX2Jsb2NrcyA9IG5yX3BhZ2VzOworCQkJc3RhcnRfcGFnZSArPSBucl9ibG9ja3M7CisJCQlucl9wYWdlcyAtPSBucl9ibG9ja3M7CisKKwkJCWlmICghZm91bmRfZXh0ZW50KyspCisJCQkJc2ktPmN1cnJfc3dhcF9leHRlbnQgPSBzZTsKKworCQkJc3RhcnRfYmxvY2sgPDw9IFBBR0VfU0hJRlQgLSA5OworCQkJbnJfYmxvY2tzIDw8PSBQQUdFX1NISUZUIC0gOTsKKwkJCWlmIChibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCisJCQkJCQkJbnJfYmxvY2tzLCBHRlBfTk9JTykpCisJCQkJYnJlYWs7CisJCX0KKworCQlsaCA9IHNlLT5saXN0Lm5leHQ7CisJCWlmIChsaCA9PSAmc2ktPmV4dGVudF9saXN0KQorCQkJbGggPSBsaC0+bmV4dDsKKwkJc2UgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIGxpc3QpOworCX0KK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9kaXNjYXJkKHZvaWQgKndvcmQpCit7CisJc2NoZWR1bGUoKTsKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBTV0FQRklMRV9DTFVTVEVSCTI1NgogI2RlZmluZSBMQVRFTkNZX0xJTUlUCQkyNTYKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNjYW5fc3dhcF9tYXAoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogewotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2luX2NsdXN0ZXI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBsYXN0X2luX2NsdXN0ZXIgPSAwOwogCWludCBsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CisJaW50IGZvdW5kX2ZyZWVfY2x1c3RlciA9IDA7CiAKLQkvKiAKKwkvKgogCSAqIFdlIHRyeSB0byBjbHVzdGVyIHN3YXAgcGFnZXMgYnkgYWxsb2NhdGluZyB0aGVtIHNlcXVlbnRpYWxseQogCSAqIGluIHN3YXAuICBPbmNlIHdlJ3ZlIGFsbG9jYXRlZCBTV0FQRklMRV9DTFVTVEVSIHBhZ2VzIHRoaXMKIAkgKiB3YXksIGhvd2V2ZXIsIHdlIHJlc29ydCB0byBmaXJzdC1mcmVlIGFsbG9jYXRpb24sIHN0YXJ0aW5nCkBAIC05OSwxNiArMTgyLDQyIEBACiAJICogYWxsIG92ZXIgdGhlIGVudGlyZSBzd2FwIHBhcnRpdGlvbiwgc28gdGhhdCB3ZSByZWR1Y2UKIAkgKiBvdmVyYWxsIGRpc2sgc2VlayB0aW1lcyBiZXR3ZWVuIHN3YXAgcGFnZXMuICAtLSBzY3QKIAkgKiBCdXQgd2UgZG8gbm93IHRyeSB0byBmaW5kIGFuIGVtcHR5IGNsdXN0ZXIuICAtQW5kcmVhCisJICogQW5kIHdlIGxldCBzd2FwIHBhZ2VzIGdvIGFsbCBvdmVyIGFuIFNTRCBwYXJ0aXRpb24uICBIdWdoCiAJICovCiAKIAlzaS0+ZmxhZ3MgKz0gU1dQX1NDQU5OSU5HOwotCWlmICh1bmxpa2VseSghc2ktPmNsdXN0ZXJfbnIpKSB7Ci0JCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7Ci0JCWlmIChzaS0+cGFnZXMgLSBzaS0+aW51c2VfcGFnZXMgPCBTV0FQRklMRV9DTFVTVEVSKQotCQkJZ290byBsb3dlc3Q7CisJc2Nhbl9iYXNlID0gb2Zmc2V0ID0gc2ktPmNsdXN0ZXJfbmV4dDsKKworCWlmICh1bmxpa2VseSghc2ktPmNsdXN0ZXJfbnItLSkpIHsKKwkJaWYgKHNpLT5wYWdlcyAtIHNpLT5pbnVzZV9wYWdlcyA8IFNXQVBGSUxFX0NMVVNURVIpIHsKKwkJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQlnb3RvIGNoZWNrczsKKwkJfQorCQlpZiAoc2ktPmZsYWdzICYgU1dQX0RJU0NBUkRBQkxFKSB7CisJCQkvKgorCQkJICogU3RhcnQgcmFuZ2UgY2hlY2sgb24gcmFjaW5nIGFsbG9jYXRpb25zLCBpbiBjYXNlCisJCQkgKiB0aGV5IG92ZXJsYXAgdGhlIGNsdXN0ZXIgd2UgZXZlbnR1YWxseSBkZWNpZGUgb24KKwkJCSAqICh3ZSBzY2FuIHdpdGhvdXQgc3dhcF9sb2NrIHRvIGFsbG93IHByZWVtcHRpb24pLgorCQkJICogSXQncyBoYXJkbHkgY29uY2VpdmFibGUgdGhhdCBjbHVzdGVyX25yIGNvdWxkIGJlCisJCQkgKiB3cmFwcGVkIGR1cmluZyBvdXIgc2NhbiwgYnV0IGRvbid0IGRlcGVuZCBvbiBpdC4KKwkJCSAqLworCQkJaWYgKHNpLT5sb3dlc3RfYWxsb2MpCisJCQkJZ290byBjaGVja3M7CisJCQlzaS0+bG93ZXN0X2FsbG9jID0gc2ktPm1heDsKKwkJCXNpLT5oaWdoZXN0X2FsbG9jID0gMDsKKwkJfQogCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAotCQlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKKwkJLyoKKwkJICogSWYgc2VlayBpcyBleHBlbnNpdmUsIHN0YXJ0IHNlYXJjaGluZyBmb3IgbmV3IGNsdXN0ZXIgZnJvbQorCQkgKiBzdGFydCBvZiBwYXJ0aXRpb24sIHRvIG1pbmltaXplIHRoZSBzcGFuIG9mIGFsbG9jYXRlZCBzd2FwLgorCQkgKiBCdXQgaWYgc2VlayBpcyBjaGVhcCwgc2VhcmNoIGZyb20gb3VyIGN1cnJlbnQgcG9zaXRpb24sIHNvCisJCSAqIHRoYXQgc3dhcCBpcyBhbGxvY2F0ZWQgZnJvbSBhbGwgb3ZlciB0aGUgcGFydGl0aW9uOiBpZiB0aGUKKwkJICogRmxhc2ggVHJhbnNsYXRpb24gTGF5ZXIgb25seSByZW1hcHMgd2l0aGluIGxpbWl0ZWQgem9uZXMsCisJCSAqIHdlIGRvbid0IHdhbnQgdG8gd2VhciBvdXQgdGhlIGZpcnN0IHpvbmUgdG9vIHF1aWNrbHkuCisJCSAqLworCQlpZiAoIShzaS0+ZmxhZ3MgJiBTV1BfU09MSURTVEFURSkpCisJCQlzY2FuX2Jhc2UgPSBvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKIAkJbGFzdF9pbl9jbHVzdGVyID0gb2Zmc2V0ICsgU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CiAKIAkJLyogTG9jYXRlIHRoZSBmaXJzdCBlbXB0eSAodW5hbGlnbmVkKSBjbHVzdGVyICovCkBAIC0xMTcsNDMgKzIyNiwxMjQgQEAKIAkJCQlsYXN0X2luX2NsdXN0ZXIgPSBvZmZzZXQgKyBTV0FQRklMRV9DTFVTVEVSOwogCQkJZWxzZSBpZiAob2Zmc2V0ID09IGxhc3RfaW5fY2x1c3RlcikgewogCQkJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKLQkJCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0LVNXQVBGSUxFX0NMVVNURVIrMTsKLQkJCQlnb3RvIGNsdXN0ZXI7CisJCQkJb2Zmc2V0IC09IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQ7CisJCQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCQlmb3VuZF9mcmVlX2NsdXN0ZXIgPSAxOworCQkJCWdvdG8gY2hlY2tzOwogCQkJfQogCQkJaWYgKHVubGlrZWx5KC0tbGF0ZW5jeV9yYXRpb24gPCAwKSkgewogCQkJCWNvbmRfcmVzY2hlZCgpOwogCQkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKIAkJCX0KIAkJfQorCisJCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCQlsYXN0X2luX2NsdXN0ZXIgPSBvZmZzZXQgKyBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKworCQkvKiBMb2NhdGUgdGhlIGZpcnN0IGVtcHR5ICh1bmFsaWduZWQpIGNsdXN0ZXIgKi8KKwkJZm9yICg7IGxhc3RfaW5fY2x1c3RlciA8IHNjYW5fYmFzZTsgb2Zmc2V0KyspIHsKKwkJCWlmIChzaS0+c3dhcF9tYXBbb2Zmc2V0XSkKKwkJCQlsYXN0X2luX2NsdXN0ZXIgPSBvZmZzZXQgKyBTV0FQRklMRV9DTFVTVEVSOworCQkJZWxzZSBpZiAob2Zmc2V0ID09IGxhc3RfaW5fY2x1c3RlcikgeworCQkJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKKwkJCQlvZmZzZXQgLT0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldDsKKwkJCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJCWZvdW5kX2ZyZWVfY2x1c3RlciA9IDE7CisJCQkJZ290byBjaGVja3M7CisJCQl9CisJCQlpZiAodW5saWtlbHkoLS1sYXRlbmN5X3JhdGlvbiA8IDApKSB7CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOworCQkJfQorCQl9CisKKwkJb2Zmc2V0ID0gc2Nhbl9iYXNlOwogCQlzcGluX2xvY2soJnN3YXBfbG9jayk7Ci0JCWdvdG8gbG93ZXN0OworCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQlzaS0+bG93ZXN0X2FsbG9jID0gMDsKIAl9CiAKLQlzaS0+Y2x1c3Rlcl9uci0tOwotY2x1c3RlcjoKLQlvZmZzZXQgPSBzaS0+Y2x1c3Rlcl9uZXh0OwotCWlmIChvZmZzZXQgPiBzaS0+aGlnaGVzdF9iaXQpCi1sb3dlc3Q6CQlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKLWNoZWNrczoJaWYgKCEoc2ktPmZsYWdzICYgU1dQX1dSSVRFT0spKQorY2hlY2tzOgorCWlmICghKHNpLT5mbGFncyAmIFNXUF9XUklURU9LKSkKIAkJZ290byBub19wYWdlOwogCWlmICghc2ktPmhpZ2hlc3RfYml0KQogCQlnb3RvIG5vX3BhZ2U7Ci0JaWYgKCFzaS0+c3dhcF9tYXBbb2Zmc2V0XSkgewotCQlpZiAob2Zmc2V0ID09IHNpLT5sb3dlc3RfYml0KQotCQkJc2ktPmxvd2VzdF9iaXQrKzsKLQkJaWYgKG9mZnNldCA9PSBzaS0+aGlnaGVzdF9iaXQpCi0JCQlzaS0+aGlnaGVzdF9iaXQtLTsKLQkJc2ktPmludXNlX3BhZ2VzKys7Ci0JCWlmIChzaS0+aW51c2VfcGFnZXMgPT0gc2ktPnBhZ2VzKSB7Ci0JCQlzaS0+bG93ZXN0X2JpdCA9IHNpLT5tYXg7Ci0JCQlzaS0+aGlnaGVzdF9iaXQgPSAwOwotCQl9Ci0JCXNpLT5zd2FwX21hcFtvZmZzZXRdID0gMTsKLQkJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldCArIDE7Ci0JCXNpLT5mbGFncyAtPSBTV1BfU0NBTk5JTkc7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQorCWlmIChvZmZzZXQgPiBzaS0+aGlnaGVzdF9iaXQpCisJCXNjYW5fYmFzZSA9IG9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCWlmIChzaS0+c3dhcF9tYXBbb2Zmc2V0XSkKKwkJZ290byBzY2FuOwogCisJaWYgKG9mZnNldCA9PSBzaS0+bG93ZXN0X2JpdCkKKwkJc2ktPmxvd2VzdF9iaXQrKzsKKwlpZiAob2Zmc2V0ID09IHNpLT5oaWdoZXN0X2JpdCkKKwkJc2ktPmhpZ2hlc3RfYml0LS07CisJc2ktPmludXNlX3BhZ2VzKys7CisJaWYgKHNpLT5pbnVzZV9wYWdlcyA9PSBzaS0+cGFnZXMpIHsKKwkJc2ktPmxvd2VzdF9iaXQgPSBzaS0+bWF4OworCQlzaS0+aGlnaGVzdF9iaXQgPSAwOworCX0KKwlzaS0+c3dhcF9tYXBbb2Zmc2V0XSA9IDE7CisJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldCArIDE7CisJc2ktPmZsYWdzIC09IFNXUF9TQ0FOTklORzsKKworCWlmIChzaS0+bG93ZXN0X2FsbG9jKSB7CisJCS8qCisJCSAqIE9ubHkgc2V0IHdoZW4gU1dQX0RJU0NBUkRBQkxFLCBhbmQgdGhlcmUncyBhIHNjYW4KKwkJICogZm9yIGEgZnJlZSBjbHVzdGVyIGluIHByb2dyZXNzIG9yIGp1c3QgY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKGZvdW5kX2ZyZWVfY2x1c3RlcikgeworCQkJLyoKKwkJCSAqIFRvIG9wdGltaXplIHdlYXItbGV2ZWxsaW5nLCBkaXNjYXJkIHRoZQorCQkJICogb2xkIGRhdGEgb2YgdGhlIGNsdXN0ZXIsIHRha2luZyBjYXJlIG5vdCB0bworCQkJICogZGlzY2FyZCBhbnkgb2YgaXRzIHBhZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5CisJCQkgKiBiZWVuIGFsbG9jYXRlZCBieSByYWNpbmcgdGFza3MgKG9mZnNldCBoYXMKKwkJCSAqIGFscmVhZHkgc3RlcHBlZCBvdmVyIGFueSBhdCB0aGUgYmVnaW5uaW5nKS4KKwkJCSAqLworCQkJaWYgKG9mZnNldCA8IHNpLT5oaWdoZXN0X2FsbG9jICYmCisJCQkgICAgc2ktPmxvd2VzdF9hbGxvYyA8PSBsYXN0X2luX2NsdXN0ZXIpCisJCQkJbGFzdF9pbl9jbHVzdGVyID0gc2ktPmxvd2VzdF9hbGxvYyAtIDE7CisJCQlzaS0+ZmxhZ3MgfD0gU1dQX0RJU0NBUkRJTkc7CisJCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKKworCQkJaWYgKG9mZnNldCA8IGxhc3RfaW5fY2x1c3RlcikKKwkJCQlkaXNjYXJkX3N3YXBfY2x1c3RlcihzaSwgb2Zmc2V0LAorCQkJCQlsYXN0X2luX2NsdXN0ZXIgLSBvZmZzZXQgKyAxKTsKKworCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJc2ktPmxvd2VzdF9hbGxvYyA9IDA7CisJCQlzaS0+ZmxhZ3MgJj0gflNXUF9ESVNDQVJESU5HOworCisJCQlzbXBfbWIoKTsJLyogd2FrZV91cF9iaXQgYWR2aXNlcyB0aGlzICovCisJCQl3YWtlX3VwX2JpdCgmc2ktPmZsYWdzLCBpbG9nMihTV1BfRElTQ0FSRElORykpOworCisJCX0gZWxzZSBpZiAoc2ktPmZsYWdzICYgU1dQX0RJU0NBUkRJTkcpIHsKKwkJCS8qCisJCQkgKiBEZWxheSB1c2luZyBwYWdlcyBhbGxvY2F0ZWQgYnkgcmFjaW5nIHRhc2tzCisJCQkgKiB1bnRpbCB0aGUgd2hvbGUgZGlzY2FyZCBoYXMgYmVlbiBpc3N1ZWQuIFdlCisJCQkgKiBjb3VsZCBkZWZlciB0aGF0IGRlbGF5IHVudGlsIHN3YXBfd3JpdGVwYWdlLAorCQkJICogYnV0IGl0J3MgZWFzaWVyIHRvIGtlZXAgdGhpcyBzZWxmLWNvbnRhaW5lZC4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisJCQl3YWl0X29uX2JpdCgmc2ktPmZsYWdzLCBpbG9nMihTV1BfRElTQ0FSRElORyksCisJCQkJd2FpdF9mb3JfZGlzY2FyZCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vdGUgcGFnZXMgYWxsb2NhdGVkIGJ5IHJhY2luZyB0YXNrcyB3aGlsZQorCQkJICogc2NhbiBmb3IgYSBmcmVlIGNsdXN0ZXIgaXMgaW4gcHJvZ3Jlc3MsIHNvCisJCQkgKiB0aGF0IGl0cyBmaW5hbCBkaXNjYXJkIGNhbiBleGNsdWRlIHRoZW0uCisJCQkgKi8KKwkJCWlmIChvZmZzZXQgPCBzaS0+bG93ZXN0X2FsbG9jKQorCQkJCXNpLT5sb3dlc3RfYWxsb2MgPSBvZmZzZXQ7CisJCQlpZiAob2Zmc2V0ID4gc2ktPmhpZ2hlc3RfYWxsb2MpCisJCQkJc2ktPmhpZ2hlc3RfYWxsb2MgPSBvZmZzZXQ7CisJCX0KKwl9CisJcmV0dXJuIG9mZnNldDsKKworc2NhbjoKIAlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAl3aGlsZSAoKytvZmZzZXQgPD0gc2ktPmhpZ2hlc3RfYml0KSB7CiAJCWlmICghc2ktPnN3YXBfbWFwW29mZnNldF0pIHsKQEAgLTE2NSw4ICszNTUsMTggQEAKIAkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKIAkJfQogCX0KKwlvZmZzZXQgPSBzaS0+bG93ZXN0X2JpdDsKKwl3aGlsZSAoKytvZmZzZXQgPCBzY2FuX2Jhc2UpIHsKKwkJaWYgKCFzaS0+c3dhcF9tYXBbb2Zmc2V0XSkgeworCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJZ290byBjaGVja3M7CisJCX0KKwkJaWYgKHVubGlrZWx5KC0tbGF0ZW5jeV9yYXRpb24gPCAwKSkgeworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CisJCX0KKwl9CiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwotCWdvdG8gbG93ZXN0OwogCiBub19wYWdlOgogCXNpLT5mbGFncyAtPSBTV1BfU0NBTk5JTkc7CkBAIC0yNjgsNyArNDY4LDcgQEAKIAlwcmludGsoS0VSTl9FUlIgInN3YXBfZnJlZTogJXMlMDhseFxuIiwgQmFkX2ZpbGUsIGVudHJ5LnZhbCk7CiBvdXQ6CiAJcmV0dXJuIE5VTEw7Ci19CQorfQogCiBzdGF0aWMgaW50IHN3YXBfZW50cnlfZnJlZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CkBAIC0zMjYsOTcgKzUyNiw1OCBAQAogfQogCiAvKgotICogV2UgY2FuIHVzZSB0aGlzIHN3YXAgY2FjaGUgZW50cnkgZGlyZWN0bHkKLSAqIGlmIHRoZXJlIGFyZSBubyBvdGhlciByZWZlcmVuY2VzIHRvIGl0LgorICogV2UgY2FuIHdyaXRlIHRvIGFuIGFub24gcGFnZSB3aXRob3V0IENPVyBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgcmVmZXJlbmNlcworICogdG8gaXQuICBBbmQgYXMgYSBzaWRlLWVmZmVjdCwgZnJlZSB1cCBpdHMgc3dhcDogYmVjYXVzZSB0aGUgb2xkIGNvbnRlbnQKKyAqIG9uIGRpc2sgd2lsbCBuZXZlciBiZSByZWFkLCBhbmQgc2Vla2luZyBiYWNrIHRoZXJlIHRvIHdyaXRlIG5ldyBjb250ZW50CisgKiBsYXRlciB3b3VsZCBvbmx5IHdhc3RlIHRpbWUgYXdheSBmcm9tIGNsdXN0ZXJpbmcuCiAgKi8KLWludCBjYW5fc2hhcmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoraW50IHJldXNlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpbnQgY291bnQ7CiAKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJY291bnQgPSBwYWdlX21hcGNvdW50KHBhZ2UpOwotCWlmIChjb3VudCA8PSAxICYmIFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJaWYgKGNvdW50IDw9IDEgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgewogCQljb3VudCArPSBwYWdlX3N3YXBjb3VudChwYWdlKTsKKwkJaWYgKGNvdW50ID09IDEgJiYgIVBhZ2VXcml0ZWJhY2socGFnZSkpIHsKKwkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CisJCQlTZXRQYWdlRGlydHkocGFnZSk7CisJCX0KKwl9CiAJcmV0dXJuIGNvdW50ID09IDE7CiB9CiAKIC8qCi0gKiBXb3JrIG91dCBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHByb2Nlc3NlcyBzaGFyaW5nIHRoaXMKLSAqIHN3YXAgY2FjaGUgcGFnZS4gRnJlZSBpdCBpZiB5b3UgY2FuLiBSZXR1cm4gc3VjY2Vzcy4KKyAqIElmIHN3YXAgaXMgZ2V0dGluZyBmdWxsLCBvciBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtYXBwaW5ncyBvZiB0aGlzIHBhZ2UsCisgKiB0aGVuIHRyeV90b19mcmVlX3N3YXAgaXMgY2FsbGVkIHRvIGZyZWUgaXRzIHN3YXAgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBjb3VudCkKK2ludCB0cnlfdG9fZnJlZV9zd2FwKHN0cnVjdCBwYWdlICpwYWdlKQogewotCWludCByZXR2YWw7Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiBwOwotCXN3cF9lbnRyeV90IGVudHJ5OwotCi0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAKIAlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkpCiAJCXJldHVybiAwOwogCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQogCQlyZXR1cm4gMDsKLQlpZiAocGFnZV9jb3VudChwYWdlKSAhPSBjb3VudCkgLyogdXMgKyBjYWNoZSArIHB0ZXMgKi8KKwlpZiAocGFnZV9zd2FwY291bnQocGFnZSkpCiAJCXJldHVybiAwOwogCi0JZW50cnkudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpOwotCXAgPSBzd2FwX2luZm9fZ2V0KGVudHJ5KTsKLQlpZiAoIXApCi0JCXJldHVybiAwOwotCi0JLyogSXMgdGhlIG9ubHkgc3dhcCBjYWNoZSB1c2VyIHRoZSBjYWNoZSBpdHNlbGY/ICovCi0JcmV0dmFsID0gMDsKLQlpZiAocC0+c3dhcF9tYXBbc3dwX29mZnNldChlbnRyeSldID09IDEpIHsKLQkJLyogUmVjaGVjayB0aGUgcGFnZSBjb3VudCB3aXRoIHRoZSBzd2FwY2FjaGUgbG9jayBoZWxkLi4gKi8KLQkJc3Bpbl9sb2NrX2lycSgmc3dhcHBlcl9zcGFjZS50cmVlX2xvY2spOwotCQlpZiAoKHBhZ2VfY291bnQocGFnZSkgPT0gY291bnQpICYmICFQYWdlV3JpdGViYWNrKHBhZ2UpKSB7Ci0JCQlfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7Ci0JCQlTZXRQYWdlRGlydHkocGFnZSk7Ci0JCQlyZXR2YWwgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmc3dhcHBlcl9zcGFjZS50cmVlX2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKLQotCWlmIChyZXR2YWwpIHsKLQkJc3dhcF9mcmVlKGVudHJ5KTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBNb3N0IG9mIHRoZSB0aW1lIHRoZSBwYWdlIHNob3VsZCBoYXZlIHR3byByZWZlcmVuY2VzOiBvbmUgZm9yIHRoZQotICogcHJvY2VzcyBhbmQgb25lIGZvciB0aGUgc3dhcCBjYWNoZS4KLSAqLwotaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9jb3VudChwYWdlLCAyKTsKLX0KLQotLyoKLSAqIFRoZSBwYWdlb3V0IGNvZGUgaG9sZHMgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSBwYWdlLiAgVGhhdCByYWlzZXMKLSAqIHRoZSByZWZlcmVuY2UgY291bnQgdG8gdGVzdCBmb3IgdG8gMiBmb3IgYSBwYWdlIHRoYXQgaXMgb25seSBpbiB0aGUKLSAqIHN3YXAgY2FjaGUgcGx1cyAxIGZvciBlYWNoIHByb2Nlc3MgdGhhdCBtYXBzIHRoZSBwYWdlLgotICovCi1pbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9jb3VudChwYWdlLCAyICsgcGFnZV9tYXBjb3VudChwYWdlKSk7CisJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKKwlTZXRQYWdlRGlydHkocGFnZSk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCiAgKiBGcmVlIHRoZSBzd2FwIGVudHJ5IGxpa2UgYWJvdmUsIGJ1dCBhbHNvIHRyeSB0bwogICogZnJlZSB0aGUgcGFnZSBjYWNoZSBlbnRyeSBpZiBpdCBpcyB0aGUgbGFzdCB1c2VyLgogICovCi12b2lkIGZyZWVfc3dhcF9hbmRfY2FjaGUoc3dwX2VudHJ5X3QgZW50cnkpCitpbnQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBlbnRyeSkKIHsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7CisJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnA7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCiAJaWYgKGlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDE7CiAKIAlwID0gc3dhcF9pbmZvX2dldChlbnRyeSk7CiAJaWYgKHApIHsKQEAgLTQzMCwyMCArNTkxLDE5IEBACiAJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCX0KIAlpZiAocGFnZSkgewotCQlpbnQgb25lX3VzZXI7Ci0KLQkJQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLQkJb25lX3VzZXIgPSAocGFnZV9jb3VudChwYWdlKSA9PSAyKTsKLQkJLyogT25seSBjYWNoZSB1c2VyICgrdXMpLCBvciBzd2FwIHNwYWNlIGZ1bGw/IEZyZWUgaXQhICovCi0JCS8qIEFsc28gcmVjaGVjayBQYWdlU3dhcENhY2hlIGFmdGVyIHBhZ2UgaXMgbG9ja2VkIChhYm92ZSkgKi8KKwkJLyoKKwkJICogTm90IG1hcHBlZCBlbHNld2hlcmUsIG9yIHN3YXAgc3BhY2UgZnVsbD8gRnJlZSBpdCEKKwkJICogQWxzbyByZWNoZWNrIFBhZ2VTd2FwQ2FjaGUgbm93IHBhZ2UgaXMgbG9ja2VkIChhYm92ZSkuCisJCSAqLwogCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiAhUGFnZVdyaXRlYmFjayhwYWdlKSAmJgotCQkJCQkob25lX3VzZXIgfHwgdm1fc3dhcF9mdWxsKCkpKSB7CisJCQkJKCFwYWdlX21hcHBlZChwYWdlKSB8fCB2bV9zd2FwX2Z1bGwoKSkpIHsKIAkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAJCQlTZXRQYWdlRGlydHkocGFnZSk7CiAJCX0KIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CisJcmV0dXJuIHAgIT0gTlVMTDsKIH0KIAogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgpAQCAtNzc2LDEwICs5MzYsMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyogCisJCS8qCiAJCSAqIEdldCBhIHBhZ2UgZm9yIHRoZSBlbnRyeSwgdXNpbmcgdGhlIGV4aXN0aW5nIHN3YXAKIAkJICogY2FjaGUgcGFnZSBpZiB0aGVyZSBpcyBvbmUuICBPdGhlcndpc2UsIGdldCBhIGNsZWFuCi0JCSAqIHBhZ2UgYW5kIHJlYWQgdGhlIHN3YXAgaW50byBpdC4gCisJCSAqIHBhZ2UgYW5kIHJlYWQgdGhlIHN3YXAgaW50byBpdC4KIAkJICovCiAJCXN3YXBfbWFwID0gJnNpLT5zd2FwX21hcFtpXTsKIAkJZW50cnkgPSBzd3BfZW50cnkodHlwZSwgaSk7CkBAIC05MzAsNyArMTA5MCwxNiBAQAogCQkJbG9ja19wYWdlKHBhZ2UpOwogCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJfQotCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKworCQkvKgorCQkgKiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IGEgcmFjaW5nIHRhc2sgcmVtb3ZlZCB0aGlzIHBhZ2UgZnJvbQorCQkgKiBzd2FwIGNhY2hlIGp1c3QgYmVmb3JlIHdlIGFjcXVpcmVkIHRoZSBwYWdlIGxvY2sgYXQgdGhlIHRvcCwKKwkJICogb3Igd2hpbGUgd2UgZHJvcHBlZCBpdCBpbiB1bnVzZV9tbSgpLiAgVGhlIHBhZ2UgbWlnaHQgZXZlbgorCQkgKiBiZSBiYWNrIGluIHN3YXAgY2FjaGUgb24gYW5vdGhlciBzd2FwIGFyZWE6IHRoYXQgd2UgbXVzdCBub3QKKwkJICogZGVsZXRlLCBzaW5jZSBpdCBtYXkgbm90IGhhdmUgYmVlbiB3cml0dGVuIG91dCB0byBzd2FwIHlldC4KKwkJICovCisJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmCisJCSAgICBsaWtlbHkocGFnZV9wcml2YXRlKHBhZ2UpID09IGVudHJ5LnZhbCkpCiAJCQlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOwogCiAJCS8qCkBAIC0xMjAzLDI2ICsxMzcyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWYgMAkvKiBXZSBkb24ndCBuZWVkIHRoaXMgeWV0ICovCi0jaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KLWludCBwYWdlX3F1ZXVlX2Nvbmdlc3RlZChzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOwotCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsJLyogSXQgcGlucyB0aGUgc3dhcF9pbmZvX3N0cnVjdCAqLwotCi0JaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKLQkJc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKLQkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpczsKLQotCQlzaXMgPSBnZXRfc3dhcF9pbmZvX3N0cnVjdChzd3BfdHlwZShlbnRyeSkpOwotCQliZGkgPSBzaXMtPmJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JfSBlbHNlCi0JCWJkaSA9IHBhZ2UtPm1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87Ci0JcmV0dXJuIGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKTsKLX0KLSNlbmRpZgotCiBhc21saW5rYWdlIGxvbmcgc3lzX3N3YXBvZmYoY29uc3QgY2hhciBfX3VzZXIgKiBzcGVjaWFsZmlsZSkKIHsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHAgPSBOVUxMOwpAQCAtMTIzMyw3ICsxMzgyLDcgQEAKIAljaGFyICogcGF0aG5hbWU7CiAJaW50IGksIHR5cGUsIHByZXY7CiAJaW50IGVycjsKLQkKKwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIApAQCAtMTI1Myw3ICsxNDAyLDcgQEAKIAlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJZm9yICh0eXBlID0gc3dhcF9saXN0LmhlYWQ7IHR5cGUgPj0gMDsgdHlwZSA9IHN3YXBfaW5mb1t0eXBlXS5uZXh0KSB7CiAJCXAgPSBzd2FwX2luZm8gKyB0eXBlOwotCQlpZiAoKHAtPmZsYWdzICYgU1dQX0FDVElWRSkgPT0gU1dQX0FDVElWRSkgeworCQlpZiAocC0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykgewogCQkJaWYgKHAtPnN3YXBfZmlsZS0+Zl9tYXBwaW5nID09IG1hcHBpbmcpCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTE0MjYsMTIgKzE1NzUsMTIgQEAKIAlmaWxlID0gcHRyLT5zd2FwX2ZpbGU7CiAJbGVuID0gc2VxX3BhdGgoc3dhcCwgJmZpbGUtPmZfcGF0aCwgIiBcdFxuXFwiKTsKIAlzZXFfcHJpbnRmKHN3YXAsICIlKnMlc1x0JXVcdCV1XHQlZFxuIiwKLQkJICAgICAgIGxlbiA8IDQwID8gNDAgLSBsZW4gOiAxLCAiICIsCi0JCSAgICAgICBTX0lTQkxLKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgPworCQkJbGVuIDwgNDAgPyA0MCAtIGxlbiA6IDEsICIgIiwKKwkJCVNfSVNCTEsoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA/CiAJCQkJInBhcnRpdGlvbiIgOiAiZmlsZVx0IiwKLQkJICAgICAgIHB0ci0+cGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCi0JCSAgICAgICBwdHItPmludXNlX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApLAotCQkgICAgICAgcHRyLT5wcmlvKTsKKwkJCXB0ci0+cGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCisJCQlwdHItPmludXNlX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApLAorCQkJcHRyLT5wcmlvKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4NywxMiArMTYzNiwxMSBAQAogCWludCBpLCBwcmV2OwogCWludCBlcnJvcjsKIAl1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXIgPSBOVUxMOwotCWludCBzd2FwX2hlYWRlcl92ZXJzaW9uOwogCXVuc2lnbmVkIGludCBucl9nb29kX3BhZ2VzID0gMDsKIAlpbnQgbnJfZXh0ZW50cyA9IDA7CiAJc2VjdG9yX3Qgc3BhbjsKIAl1bnNpZ25lZCBsb25nIG1heHBhZ2VzID0gMTsKLQlpbnQgc3dhcGZpbGVzaXplOworCXVuc2lnbmVkIGxvbmcgc3dhcGZpbGVwYWdlczsKIAl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXAgPSBOVUxMOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKQEAgLTE1NzAsNyArMTcxOCw3IEBACiAJCWdvdG8gYmFkX3N3YXA7CiAJfQogCi0Jc3dhcGZpbGVzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfU0hJRlQ7CisJc3dhcGZpbGVwYWdlcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX1NISUZUOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBzd2FwIGhlYWRlci4KQEAgLTE1ODQsMTAxICsxNzMyLDg2IEBACiAJCWVycm9yID0gUFRSX0VSUihwYWdlKTsKIAkJZ290byBiYWRfc3dhcDsKIAl9Ci0Ja21hcChwYWdlKTsKLQlzd2FwX2hlYWRlciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlzd2FwX2hlYWRlciA9IGttYXAocGFnZSk7CiAKLQlpZiAoIW1lbWNtcCgiU1dBUC1TUEFDRSIsc3dhcF9oZWFkZXItPm1hZ2ljLm1hZ2ljLDEwKSkKLQkJc3dhcF9oZWFkZXJfdmVyc2lvbiA9IDE7Ci0JZWxzZSBpZiAoIW1lbWNtcCgiU1dBUFNQQUNFMiIsc3dhcF9oZWFkZXItPm1hZ2ljLm1hZ2ljLDEwKSkKLQkJc3dhcF9oZWFkZXJfdmVyc2lvbiA9IDI7Ci0JZWxzZSB7CisJaWYgKG1lbWNtcCgiU1dBUFNQQUNFMiIsIHN3YXBfaGVhZGVyLT5tYWdpYy5tYWdpYywgMTApKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGZpbmQgc3dhcC1zcGFjZSBzaWduYXR1cmVcbiIpOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3N3YXA7CiAJfQotCQotCXN3aXRjaCAoc3dhcF9oZWFkZXJfdmVyc2lvbikgewotCWNhc2UgMToKLQkJcHJpbnRrKEtFUk5fRVJSICJ2ZXJzaW9uIDAgc3dhcCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAiCi0JCQkiVXNlIG1rc3dhcCAtdjEgJXNcbiIsIG5hbWUpOworCisJLyogc3dhcCBwYXJ0aXRpb24gZW5kaWFuZXNzIGhhY2suLi4gKi8KKwlpZiAoc3dhYjMyKHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pID09IDEpIHsKKwkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbik7CisJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSk7CisJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzKTsKKwkJZm9yIChpID0gMDsgaSA8IHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzOyBpKyspCisJCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXSk7CisJfQorCS8qIENoZWNrIHRoZSBzd2FwIGhlYWRlcidzIHN1Yi12ZXJzaW9uICovCisJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24gIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiVW5hYmxlIHRvIGhhbmRsZSBzd2FwIGhlYWRlciB2ZXJzaW9uICVkXG4iLAorCQkgICAgICAgc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbik7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBiYWRfc3dhcDsKLQljYXNlIDI6Ci0JCS8qIHN3YXAgcGFydGl0aW9uIGVuZGlhbmVzcyBoYWNrLi4uICovCi0JCWlmIChzd2FiMzIoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbikgPT0gMSkgewotCQkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbik7Ci0JCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpOwotCQkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMpOwotCQkJZm9yIChpID0gMDsgaSA8IHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzOyBpKyspCi0JCQkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8uYmFkcGFnZXNbaV0pOwotCQl9Ci0JCS8qIENoZWNrIHRoZSBzd2FwIGhlYWRlcidzIHN1Yi12ZXJzaW9uIGFuZCB0aGUgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgIHRoZSBzd2FwIGZpbGUgYW5kIGJhZCBibG9jayBsaXN0cyAqLwotCQlpZiAoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbiAhPSAxKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIlVuYWJsZSB0byBoYW5kbGUgc3dhcCBoZWFkZXIgdmVyc2lvbiAlZFxuIiwKLQkJCSAgICAgICBzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKKwl9CisKKwlwLT5sb3dlc3RfYml0ICA9IDE7CisJcC0+Y2x1c3Rlcl9uZXh0ID0gMTsKKworCS8qCisJICogRmluZCBvdXQgaG93IG1hbnkgcGFnZXMgYXJlIGFsbG93ZWQgZm9yIGEgc2luZ2xlIHN3YXAKKwkgKiBkZXZpY2UuIFRoZXJlIGFyZSB0d28gbGltaXRpbmcgZmFjdG9yczogMSkgdGhlIG51bWJlciBvZgorCSAqIGJpdHMgZm9yIHRoZSBzd2FwIG9mZnNldCBpbiB0aGUgc3dwX2VudHJ5X3QgdHlwZSBhbmQKKwkgKiAyKSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGEgc3dhcCBwdGUgYXMgZGVmaW5lZCBieQorCSAqIHRoZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gSW4gb3JkZXIgdG8gZmluZCB0aGUKKwkgKiBsYXJnZXN0IHBvc3NpYmxlIGJpdCBtYXNrIGEgc3dhcCBlbnRyeSB3aXRoIHN3YXAgdHlwZSAwCisJICogYW5kIHN3YXAgb2Zmc2V0IH4wVUwgaXMgY3JlYXRlZCwgZW5jb2RlZCB0byBhIHN3YXAgcHRlLAorCSAqIGRlY29kZWQgdG8gYSBzd3BfZW50cnlfdCBhZ2FpbiBhbmQgZmluYWxseSB0aGUgc3dhcAorCSAqIG9mZnNldCBpcyBleHRyYWN0ZWQuIFRoaXMgd2lsbCBtYXNrIGFsbCB0aGUgYml0cyBmcm9tCisJICogdGhlIGluaXRpYWwgfjBVTCBtYXNrIHRoYXQgY2FuJ3QgYmUgZW5jb2RlZCBpbiBlaXRoZXIKKwkgKiB0aGUgc3dwX2VudHJ5X3Qgb3IgdGhlIGFyY2hpdGVjdHVyZSBkZWZpbml0aW9uIG9mIGEKKwkgKiBzd2FwIHB0ZS4KKwkgKi8KKwltYXhwYWdlcyA9IHN3cF9vZmZzZXQocHRlX3RvX3N3cF9lbnRyeSgKKwkJCXN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KDAsIH4wVUwpKSkpIC0gMTsKKwlpZiAobWF4cGFnZXMgPiBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpCisJCW1heHBhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlOworCXAtPmhpZ2hlc3RfYml0ID0gbWF4cGFnZXMgLSAxOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghbWF4cGFnZXMpCisJCWdvdG8gYmFkX3N3YXA7CisJaWYgKHN3YXBmaWxlcGFnZXMgJiYgbWF4cGFnZXMgPiBzd2FwZmlsZXBhZ2VzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcbiIpOworCQlnb3RvIGJhZF9zd2FwOworCX0KKwlpZiAoc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJZ290byBiYWRfc3dhcDsKKwlpZiAoc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgPiBNQVhfU1dBUF9CQURQQUdFUykKKwkJZ290byBiYWRfc3dhcDsKKworCS8qIE9LLCBzZXQgdXAgdGhlIHN3YXAgbWFwIGFuZCBhcHBseSB0aGUgYmFkIGJsb2NrIGxpc3QgKi8KKwlzd2FwX21hcCA9IHZtYWxsb2MobWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKKwlpZiAoIXN3YXBfbWFwKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBiYWRfc3dhcDsKKwl9CisKKwltZW1zZXQoc3dhcF9tYXAsIDAsIG1heHBhZ2VzICogc2l6ZW9mKHNob3J0KSk7CisJZm9yIChpID0gMDsgaSA8IHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzOyBpKyspIHsKKwkJaW50IHBhZ2VfbnIgPSBzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXTsKKwkJaWYgKHBhZ2VfbnIgPD0gMCB8fCBwYWdlX25yID49IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkgewogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJZ290byBiYWRfc3dhcDsKIAkJfQotCi0JCXAtPmxvd2VzdF9iaXQgID0gMTsKLQkJcC0+Y2x1c3Rlcl9uZXh0ID0gMTsKLQotCQkvKgotCQkgKiBGaW5kIG91dCBob3cgbWFueSBwYWdlcyBhcmUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgc3dhcAotCQkgKiBkZXZpY2UuIFRoZXJlIGFyZSB0d28gbGltaXRpbmcgZmFjdG9yczogMSkgdGhlIG51bWJlciBvZgotCQkgKiBiaXRzIGZvciB0aGUgc3dhcCBvZmZzZXQgaW4gdGhlIHN3cF9lbnRyeV90IHR5cGUgYW5kCi0JCSAqIDIpIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYSBzd2FwIHB0ZSBhcyBkZWZpbmVkIGJ5Ci0JCSAqIHRoZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gSW4gb3JkZXIgdG8gZmluZCB0aGUKLQkJICogbGFyZ2VzdCBwb3NzaWJsZSBiaXQgbWFzayBhIHN3YXAgZW50cnkgd2l0aCBzd2FwIHR5cGUgMAotCQkgKiBhbmQgc3dhcCBvZmZzZXQgfjBVTCBpcyBjcmVhdGVkLCBlbmNvZGVkIHRvIGEgc3dhcCBwdGUsCi0JCSAqIGRlY29kZWQgdG8gYSBzd3BfZW50cnlfdCBhZ2FpbiBhbmQgZmluYWxseSB0aGUgc3dhcAotCQkgKiBvZmZzZXQgaXMgZXh0cmFjdGVkLiBUaGlzIHdpbGwgbWFzayBhbGwgdGhlIGJpdHMgZnJvbQotCQkgKiB0aGUgaW5pdGlhbCB+MFVMIG1hc2sgdGhhdCBjYW4ndCBiZSBlbmNvZGVkIGluIGVpdGhlcgotCQkgKiB0aGUgc3dwX2VudHJ5X3Qgb3IgdGhlIGFyY2hpdGVjdHVyZSBkZWZpbml0aW9uIG9mIGEKLQkJICogc3dhcCBwdGUuCi0JCSAqLwotCQltYXhwYWdlcyA9IHN3cF9vZmZzZXQocHRlX3RvX3N3cF9lbnRyeShzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSgwLH4wVUwpKSkpIC0gMTsKLQkJaWYgKG1heHBhZ2VzID4gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKQotCQkJbWF4cGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2U7Ci0JCXAtPmhpZ2hlc3RfYml0ID0gbWF4cGFnZXMgLSAxOwotCi0JCWVycm9yID0gLUVJTlZBTDsKLQkJaWYgKCFtYXhwYWdlcykKLQkJCWdvdG8gYmFkX3N3YXA7Ci0JCWlmIChzd2FwZmlsZXNpemUgJiYgbWF4cGFnZXMgPiBzd2FwZmlsZXNpemUpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4iKTsKLQkJCWdvdG8gYmFkX3N3YXA7Ci0JCX0KLQkJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzICYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCQlnb3RvIGJhZF9zd2FwOwotCQlpZiAoc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgPiBNQVhfU1dBUF9CQURQQUdFUykKLQkJCWdvdG8gYmFkX3N3YXA7Ci0KLQkJLyogT0ssIHNldCB1cCB0aGUgc3dhcCBtYXAgYW5kIGFwcGx5IHRoZSBiYWQgYmxvY2sgbGlzdCAqLwotCQlzd2FwX21hcCA9IHZtYWxsb2MobWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKLQkJaWYgKCFzd2FwX21hcCkgewotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBiYWRfc3dhcDsKLQkJfQotCi0JCWVycm9yID0gMDsKLQkJbWVtc2V0KHN3YXBfbWFwLCAwLCBtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOwotCQlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykgewotCQkJaW50IHBhZ2VfbnIgPSBzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXTsKLQkJCWlmIChwYWdlX25yIDw9IDAgfHwgcGFnZV9uciA+PSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpCi0JCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJCXN3YXBfbWFwW3BhZ2VfbnJdID0gU1dBUF9NQVBfQkFEOwotCQl9Ci0JCW5yX2dvb2RfcGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UgLQotCQkJCXN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzIC0KLQkJCQkxIC8qIGhlYWRlciBwYWdlICovOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGJhZF9zd2FwOworCQlzd2FwX21hcFtwYWdlX25yXSA9IFNXQVBfTUFQX0JBRDsKIAl9CisJbnJfZ29vZF9wYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSAtCisJCQlzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAtCisJCQkxIC8qIGhlYWRlciBwYWdlICovOwogCiAJaWYgKG5yX2dvb2RfcGFnZXMpIHsKIAkJc3dhcF9tYXBbMF0gPSBTV0FQX01BUF9CQUQ7CkBAIC0xNjk3LDYgKzE4MzAsMTMgQEAKIAkJZ290byBiYWRfc3dhcDsKIAl9CiAKKwlpZiAoYmxrX3F1ZXVlX25vbnJvdChiZGV2X2dldF9xdWV1ZShwLT5iZGV2KSkpIHsKKwkJcC0+ZmxhZ3MgfD0gU1dQX1NPTElEU1RBVEU7CisJCXAtPmNsdXN0ZXJfbmV4dCA9IDEgKyAocmFuZG9tMzIoKSAlIHAtPmhpZ2hlc3RfYml0KTsKKwl9CisJaWYgKGRpc2NhcmRfc3dhcChwKSA9PSAwKQorCQlwLT5mbGFncyB8PSBTV1BfRElTQ0FSREFCTEU7CisKIAltdXRleF9sb2NrKCZzd2Fwb25fbXV0ZXgpOwogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAlpZiAoc3dhcF9mbGFncyAmIFNXQVBfRkxBR19QUkVGRVIpCkBAIC0xNzA1LDE0ICsxODQ1LDE2IEBACiAJZWxzZQogCQlwLT5wcmlvID0gLS1sZWFzdF9wcmlvcml0eTsKIAlwLT5zd2FwX21hcCA9IHN3YXBfbWFwOwotCXAtPmZsYWdzID0gU1dQX0FDVElWRTsKKwlwLT5mbGFncyB8PSBTV1BfV1JJVEVPSzsKIAlucl9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7CiAJdG90YWxfc3dhcF9wYWdlcyArPSBucl9nb29kX3BhZ2VzOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQWRkaW5nICV1ayBzd2FwIG9uICVzLiAgIgotCQkJIlByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrXG4iLAorCQkJIlByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrICVzJXNcbiIsCiAJCW5yX2dvb2RfcGFnZXM8PChQQUdFX1NISUZULTEwKSwgbmFtZSwgcC0+cHJpbywKLQkJbnJfZXh0ZW50cywgKHVuc2lnbmVkIGxvbmcgbG9uZylzcGFuPDwoUEFHRV9TSElGVC0xMCkpOworCQlucl9leHRlbnRzLCAodW5zaWduZWQgbG9uZyBsb25nKXNwYW48PChQQUdFX1NISUZULTEwKSwKKwkJKHAtPmZsYWdzICYgU1dQX1NPTElEU1RBVEUpID8gIlNTIiA6ICIiLAorCQkocC0+ZmxhZ3MgJiBTV1BfRElTQ0FSREFCTEUpID8gIkQiIDogIiIpOwogCiAJLyogaW5zZXJ0IHN3YXAgc3BhY2UgaW50byBzd2FwX2xpc3Q6ICovCiAJcHJldiA9IC0xOwpkaWZmIC0tZ2l0IGEvbW0vdGlueS1zaG1lbS5jIGIvbW0vdGlueS1zaG1lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY3ZDU3Li4wMDAwMDAwCi0tLSBhL21tL3Rpbnktc2htZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogdGlueS1zaG1lbS5jOiBzaW1wbGUgc2htZW1mcyBhbmQgdG1wZnMgdXNpbmcgcmFtZnMgY29kZQotICoKLSAqIE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPiBKYW51YXJ5LCAyMDA0Ci0gKiBkZXJpdmVkIGZyb20gbW0vc2htZW0uYyBhbmQgZnMvcmFtZnMvaW5vZGUuYwotICoKLSAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHNtYWxsIHN5c3RlbSB3aGVyZSB0aGUgYmVuZWZpdHMgb2YgdGhlIGZ1bGwKLSAqIHNobWVtIGNvZGUgKHN3YXAtYmFja2VkIGFuZCByZXNvdXJjZS1saW1pdGVkKSBhcmUgb3V0d2VpZ2hlZCBieQotICogdGhlaXIgY29tcGxleGl0eS4gT24gc3lzdGVtcyB3aXRob3V0IHN3YXAgdGhpcyBjb2RlIHNob3VsZCBiZQotICogZWZmZWN0aXZlbHkgZXF1aXZhbGVudCwgYnV0IG11Y2ggbGlnaHRlciB3ZWlnaHQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbWZzLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB0bXBmc19mc190eXBlID0gewotCS5uYW1lCQk9ICJ0bXBmcyIsCi0JLmdldF9zYgkJPSByYW1mc19nZXRfc2IsCi0JLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdG1wZnModm9pZCkKLXsKLQlCVUdfT04ocmVnaXN0ZXJfZmlsZXN5c3RlbSgmdG1wZnNfZnNfdHlwZSkgIT0gMCk7Ci0KLQlzaG1fbW50ID0ga2Vybl9tb3VudCgmdG1wZnNfZnNfdHlwZSk7Ci0JQlVHX09OKElTX0VSUihzaG1fbW50KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KGluaXRfdG1wZnMpCi0KLS8qKgotICogc2htZW1fZmlsZV9zZXR1cCAtIGdldCBhbiB1bmxpbmtlZCBmaWxlIGxpdmluZyBpbiB0bXBmcwotICogQG5hbWU6IG5hbWUgZm9yIGRlbnRyeSAodG8gYmUgc2VlbiBpbiAvcHJvYy88cGlkPi9tYXBzCi0gKiBAc2l6ZTogc2l6ZSB0byBiZSBzZXQgZm9yIHRoZSBmaWxlCi0gKiBAZmxhZ3M6IHZtX2ZsYWdzCi0gKi8KLXN0cnVjdCBmaWxlICpzaG1lbV9maWxlX3NldHVwKGNoYXIgKm5hbWUsIGxvZmZfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKnJvb3Q7Ci0Jc3RydWN0IHFzdHIgdGhpczsKLQotCWlmIChJU19FUlIoc2htX21udCkpCi0JCXJldHVybiAodm9pZCAqKXNobV9tbnQ7Ci0KLQllcnJvciA9IC1FTk9NRU07Ci0JdGhpcy5uYW1lID0gbmFtZTsKLQl0aGlzLmxlbiA9IHN0cmxlbihuYW1lKTsKLQl0aGlzLmhhc2ggPSAwOyAvKiB3aWxsIGdvICovCi0Jcm9vdCA9IHNobV9tbnQtPm1udF9yb290OwotCWRlbnRyeSA9IGRfYWxsb2Mocm9vdCwgJnRoaXMpOwotCWlmICghZGVudHJ5KQotCQlnb3RvIHB1dF9tZW1vcnk7Ci0KLQllcnJvciA9IC1FTkZJTEU7Ci0JZmlsZSA9IGdldF9lbXB0eV9maWxwKCk7Ci0JaWYgKCFmaWxlKQotCQlnb3RvIHB1dF9kZW50cnk7Ci0KLQllcnJvciA9IC1FTk9TUEM7Ci0JaW5vZGUgPSByYW1mc19nZXRfaW5vZGUocm9vdC0+ZF9zYiwgU19JRlJFRyB8IFNfSVJXWFVHTywgMCk7Ci0JaWYgKCFpbm9kZSkKLQkJZ290byBjbG9zZV9maWxlOwotCi0JZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQlpbm9kZS0+aV9zaXplID0gc2l6ZTsKLQlpbm9kZS0+aV9ubGluayA9IDA7CS8qIEl0IGlzIHVubGlua2VkICovCi0JaW5pdF9maWxlKGZpbGUsIHNobV9tbnQsIGRlbnRyeSwgRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFELAotCQkJJnJhbWZzX2ZpbGVfb3BlcmF0aW9ucyk7Ci0KLSNpZm5kZWYgQ09ORklHX01NVQotCWVycm9yID0gcmFtZnNfbm9tbXVfZXhwYW5kX2Zvcl9tYXBwaW5nKGlub2RlLCBzaXplKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gY2xvc2VfZmlsZTsKLSNlbmRpZgotCXJldHVybiBmaWxlOwotCi1jbG9zZV9maWxlOgotCXB1dF9maWxwKGZpbGUpOwotcHV0X2RlbnRyeToKLQlkcHV0KGRlbnRyeSk7Ci1wdXRfbWVtb3J5OgotCXJldHVybiBFUlJfUFRSKGVycm9yKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNobWVtX2ZpbGVfc2V0dXApOwotCi0vKioKLSAqIHNobWVtX3plcm9fc2V0dXAgLSBzZXR1cCBhIHNoYXJlZCBhbm9ueW1vdXMgbWFwcGluZwotICogQHZtYTogdGhlIHZtYSB0byBiZSBtbWFwcGVkIGlzIHByZXBhcmVkIGJ5IGRvX21tYXBfcGdvZmYKLSAqLwotaW50IHNobWVtX3plcm9fc2V0dXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0JbG9mZl90IHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0KLQlmaWxlID0gc2htZW1fZmlsZV9zZXR1cCgiZGV2L3plcm8iLCBzaXplLCB2bWEtPnZtX2ZsYWdzKTsKLQlpZiAoSVNfRVJSKGZpbGUpKQotCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKLQotCWlmICh2bWEtPnZtX2ZpbGUpCi0JCWZwdXQodm1hLT52bV9maWxlKTsKLQl2bWEtPnZtX2ZpbGUgPSBmaWxlOwotCXZtYS0+dm1fb3BzID0gJmdlbmVyaWNfZmlsZV92bV9vcHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgQ09ORklHX01NVQotdW5zaWduZWQgbG9uZyBzaG1lbV9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZ29mZiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXJldHVybiByYW1mc19ub21tdV9nZXRfdW5tYXBwZWRfYXJlYShmaWxlLCBhZGRyLCBsZW4sIHBnb2ZmLCBmbGFncyk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCA3NDY1ZjIyLi5jNWRiOWE3IDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0zODEsOCArMzgyLDkgQEAKIAkJCWdvdG8gcmV0cnk7CiAJCX0KIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInZtYXAgYWxsb2NhdGlvbiBmYWlsZWQ6ICIKLQkJCQkgInVzZSB2bWFsbG9jPTxzaXplPiB0byBpbmNyZWFzZSBzaXplLlxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJInZtYXAgYWxsb2NhdGlvbiBmb3Igc2l6ZSAlbHUgZmFpbGVkOiAiCisJCQkJInVzZSB2bWFsbG9jPTxzaXplPiB0byBpbmNyZWFzZSBzaXplLlxuIiwgc2l6ZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CiAJfQogCkBAIC00MzIsNiArNDM0LDI3IEBACiAJdnVubWFwX3BhZ2VfcmFuZ2UodmEtPnZhX3N0YXJ0LCB2YS0+dmFfZW5kKTsKIH0KIAorc3RhdGljIHZvaWQgdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCS8qCisJICogVW5tYXAgcGFnZSB0YWJsZXMgYW5kIGZvcmNlIGEgVExCIGZsdXNoIGltbWVkaWF0ZWx5IGlmCisJICogQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBzZXQuIFRoaXMgY2F0Y2hlcyB1c2UgYWZ0ZXIgZnJlZQorCSAqIGJ1Z3Mgc2ltaWxhcmx5IHRvIHRob3NlIGluIGxpbmVhciBrZXJuZWwgdmlydHVhbCBhZGRyZXNzCisJICogc3BhY2UgYWZ0ZXIgYSBwYWdlIGhhcyBiZWVuIGZyZWVkLgorCSAqCisJICogQWxsIHRoZSBsYXp5IGZyZWVpbmcgbG9naWMgaXMgc3RpbGwgcmV0YWluZWQsIGluIG9yZGVyIHRvCisJICogbWluaW1pc2UgaW50cnVzaXZlbmVzcyBvZiB0aGlzIGRlYnVnZ2luZyBmZWF0dXJlLgorCSAqCisJICogVGhpcyBpcyBnb2luZyB0byBiZSAqc2xvdyogKGxpbmVhciBrZXJuZWwgdmlydHVhbCBhZGRyZXNzCisJICogZGVidWdnaW5nIGRvZXNuJ3QgZG8gYSBicm9hZGNhc3QgVExCIGZsdXNoIHNvIGl0IGlzIGEgbG90CisJICogZmFzdGVyKS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJdnVubWFwX3BhZ2VfcmFuZ2Uoc3RhcnQsIGVuZCk7CisJZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKTsKKyNlbmRpZgorfQorCiAvKgogICogbGF6eV9tYXhfcGFnZXMgaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB3ZSBnYXRoZXIgdXAKICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHB1cmdlIHdpdGggYSBUTEIgZmx1c2guCkBAIC00NzIsNyArNDk1LDcgQEAKIHN0YXRpYyB2b2lkIF9fcHVyZ2Vfdm1hcF9hcmVhX2xhenkodW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmVuZCwKIAkJCQkJaW50IHN5bmMsIGludCBmb3JjZV9mbHVzaCkKIHsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHB1cmdlX2xvY2spOworCXN0YXRpYyBERUZJTkVfTVVURVgocHVyZ2VfbG9jayk7CiAJTElTVF9IRUFEKHZhbGlzdCk7CiAJc3RydWN0IHZtYXBfYXJlYSAqdmE7CiAJaW50IG5yID0gMDsKQEAgLTQ4MywxMCArNTA2LDEwIEBACiAJICogdGhlIGNhc2UgdGhhdCBpc24ndCBhY3R1YWxseSB1c2VkIGF0IHRoZSBtb21lbnQgYW55d2F5LgogCSAqLwogCWlmICghc3luYyAmJiAhZm9yY2VfZmx1c2gpIHsKLQkJaWYgKCFzcGluX3RyeWxvY2soJnB1cmdlX2xvY2spKQorCQlpZiAoIW11dGV4X3RyeWxvY2soJnB1cmdlX2xvY2spKQogCQkJcmV0dXJuOwogCX0gZWxzZQotCQlzcGluX2xvY2soJnB1cmdlX2xvY2spOworCQltdXRleF9sb2NrKCZwdXJnZV9sb2NrKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh2YSwgJnZtYXBfYXJlYV9saXN0LCBsaXN0KSB7CkBAIC01MTgsNyArNTQxLDcgQEAKIAkJCV9fZnJlZV92bWFwX2FyZWEodmEpOwogCQlzcGluX3VubG9jaygmdm1hcF9hcmVhX2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmcHVyZ2VfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwdXJnZV9sb2NrKTsKIH0KIAogLyoKQEAgLTkxMiw2ICs5MzUsNyBAQAogCUJVR19PTihhZGRyICYgKFBBR0VfU0laRS0xKSk7CiAKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChtZW0sIHNpemUpOworCXZtYXBfZGVidWdfZnJlZV9yYW5nZShhZGRyLCBhZGRyK3NpemUpOwogCiAJaWYgKGxpa2VseShjb3VudCA8PSBWTUFQX01BWF9BTExPQykpCiAJCXZiX2ZyZWUobWVtLCBzaXplKTsKQEAgLTExMjgsNiArMTE1Miw4IEBACiAJaWYgKHZhICYmIHZhLT5mbGFncyAmIFZNX1ZNX0FSRUEpIHsKIAkJc3RydWN0IHZtX3N0cnVjdCAqdm0gPSB2YS0+cHJpdmF0ZTsKIAkJc3RydWN0IHZtX3N0cnVjdCAqdG1wLCAqKnA7CisKKwkJdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKHZhLT52YV9zdGFydCwgdmEtPnZhX2VuZCk7CiAJCWZyZWVfdW5tYXBfdm1hcF9hcmVhKHZhKTsKIAkJdm0tPnNpemUgLT0gUEFHRV9TSVpFOwogCkBAIC0xMzc1LDcgKzE0MDEsOCBAQAogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CiAJdm9pZCAqcmV0OwogCi0JcmV0ID0gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwpOworCXJldCA9IF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNIHwgX19HRlBfWkVSTywKKwkJCSAgICAgUEFHRV9LRVJORUwsIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCWlmIChyZXQpIHsKIAkJYXJlYSA9IGZpbmRfdm1fYXJlYShyZXQpOwogCQlhcmVhLT5mbGFncyB8PSBWTV9VU0VSTUFQOwpAQCAtMTQyMCw3ICsxNDQ3LDggQEAKIAogdm9pZCAqdm1hbGxvY19leGVjKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTF9FWEVDKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMsCisJCQkgICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiBkZWZpbmVkKENPTkZJR19aT05FX0RNQTMyKQpAQCAtMTQ0MCw3ICsxNDY4LDggQEAKICAqLwogdm9pZCAqdm1hbGxvY18zMih1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfVk1BTExPQzMyLCBQQUdFX0tFUk5FTCk7CisJcmV0dXJuIF9fdm1hbGxvY19ub2RlKHNpemUsIEdGUF9WTUFMTE9DMzIsIFBBR0VfS0VSTkVMLAorCQkJICAgICAgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtYWxsb2NfMzIpOwogCkBAIC0xNDU2LDcgKzE0ODUsOCBAQAogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CiAJdm9pZCAqcmV0OwogCi0JcmV0ID0gX192bWFsbG9jKHNpemUsIEdGUF9WTUFMTE9DMzIgfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7CisJcmV0ID0gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX1ZNQUxMT0MzMiB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMLAorCQkJICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAlpZiAocmV0KSB7CiAJCWFyZWEgPSBmaW5kX3ZtX2FyZWEocmV0KTsKIAkJYXJlYS0+ZmxhZ3MgfD0gVk1fVVNFUk1BUDsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggZDE5NmY0Ni4uYjA3YzQ4YiAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTUyLDYgKzUyLDkgQEAKIAkvKiBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIHBhZ2VzIHRoYXQgd2VyZSBzY2FubmVkICovCiAJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkOwogCisJLyogTnVtYmVyIG9mIHBhZ2VzIGZyZWVkIHNvIGZhciBkdXJpbmcgYSBjYWxsIHRvIHNocmlua196b25lcygpICovCisJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7CisKIAkvKiBUaGlzIGNvbnRleHQncyBHRlAgbWFzayAqLwogCWdmcF90IGdmcF9tYXNrOwogCkBAIC02MTcsNyArNjIwLDYgQEAKIAkJCQkJcmVmZXJlbmNlZCAmJiBwYWdlX21hcHBpbmdfaW51c2UocGFnZSkpCiAJCQlnb3RvIGFjdGl2YXRlX2xvY2tlZDsKIAotI2lmZGVmIENPTkZJR19TV0FQCiAJCS8qCiAJCSAqIEFub255bW91cyBwcm9jZXNzIG1lbW9yeSBoYXMgYmFja2luZyBzdG9yZT8KIAkJICogVHJ5IHRvIGFsbG9jYXRlIGl0IHNvbWUgc3dhcCBzcGFjZSBoZXJlLgpAQCAtNjI1LDIwICs2MjcsMTAgQEAKIAkJaWYgKFBhZ2VBbm9uKHBhZ2UpICYmICFQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCQlpZiAoIShzYy0+Z2ZwX21hc2sgJiBfX0dGUF9JTykpCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKLQkJCXN3aXRjaCAodHJ5X3RvX211bmxvY2socGFnZSkpIHsKLQkJCWNhc2UgU1dBUF9GQUlMOgkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwotCQkJY2FzZSBTV0FQX0FHQUlOOgotCQkJCWdvdG8ga2VlcF9sb2NrZWQ7Ci0JCQljYXNlIFNXQVBfTUxPQ0s6Ci0JCQkJZ290byBjdWxsX21sb2NrZWQ7Ci0JCQljYXNlIFNXQVBfU1VDQ0VTUzoKLQkJCQk7IC8qIGZhbGwgdGhydSc7IGFkZCB0byBzd2FwIGNhY2hlICovCi0JCQl9Ci0JCQlpZiAoIWFkZF90b19zd2FwKHBhZ2UsIEdGUF9BVE9NSUMpKQorCQkJaWYgKCFhZGRfdG9fc3dhcChwYWdlKSkKIAkJCQlnb3RvIGFjdGl2YXRlX2xvY2tlZDsKIAkJCW1heV9lbnRlcl9mcyA9IDE7CiAJCX0KLSNlbmRpZiAvKiBDT05GSUdfU1dBUCAqLwogCiAJCW1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CiAKQEAgLTc1Miw2ICs3NDQsOCBAQAogCQljb250aW51ZTsKIAogY3VsbF9tbG9ja2VkOgorCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJCXRyeV90b19mcmVlX3N3YXAocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlwdXRiYWNrX2xydV9wYWdlKHBhZ2UpOwogCQljb250aW51ZTsKQEAgLTc1OSw3ICs3NTMsNyBAQAogYWN0aXZhdGVfbG9ja2VkOgogCQkvKiBOb3QgYSBjYW5kaWRhdGUgZm9yIHN3YXBwaW5nLCBzbyByZWNsYWltIHN3YXAgc3BhY2UuICovCiAJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmIHZtX3N3YXBfZnVsbCgpKQotCQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHBhZ2UpOworCQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJVk1fQlVHX09OKFBhZ2VBY3RpdmUocGFnZSkpOwogCQlTZXRQYWdlQWN0aXZlKHBhZ2UpOwogCQlwZ2FjdGl2YXRlKys7CkBAIC0xMTczLDExICsxMTY3LDYgQEAKIAkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OwogfQogCi1zdGF0aWMgaW5saW5lIGludCB6b25lX2lzX25lYXJfb29tKHN0cnVjdCB6b25lICp6b25lKQotewotCXJldHVybiB6b25lLT5wYWdlc19zY2FubmVkID49ICh6b25lX2xydV9wYWdlcyh6b25lKSAqIDMpOwotfQotCiAvKgogICogVGhpcyBtb3ZlcyBwYWdlcyBmcm9tIHRoZSBhY3RpdmUgbGlzdCB0byB0aGUgaW5hY3RpdmUgbGlzdC4KICAqCkBAIC0xMjQ4LDYgKzEyMzcsMTMgQEAKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJmxfaW5hY3RpdmUpOwogCX0KIAorCS8qCisJICogTW92ZSB0aGUgcGFnZXMgdG8gdGhlIFtmaWxlIG9yIGFub25dIGluYWN0aXZlIGxpc3QuCisJICovCisJcGFnZXZlY19pbml0KCZwdmVjLCAxKTsKKwlwZ21vdmVkID0gMDsKKwlscnUgPSBMUlVfQkFTRSArIGZpbGUgKiBMUlVfRklMRTsKKwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAkvKgogCSAqIENvdW50IHJlZmVyZW5jZWQgcGFnZXMgZnJvbSBjdXJyZW50bHkgdXNlZCBtYXBwaW5ncyBhcwpAQCAtMTI1NSwxNSArMTI1MSw5IEBACiAJICogVGhpcyBoZWxwcyBiYWxhbmNlIHNjYW4gcHJlc3N1cmUgYmV0d2VlbiBmaWxlIGFuZCBhbm9ueW1vdXMKIAkgKiBwYWdlcyBpbiBnZXRfc2Nhbl9yYXRpby4KIAkgKi8KLQl6b25lLT5yZWNlbnRfcm90YXRlZFshIWZpbGVdICs9IHBnbW92ZWQ7CisJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCisJCXpvbmUtPnJlY2VudF9yb3RhdGVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKIAotCS8qCi0JICogTW92ZSB0aGUgcGFnZXMgdG8gdGhlIFtmaWxlIG9yIGFub25dIGluYWN0aXZlIGxpc3QuCi0JICovCi0JcGFnZXZlY19pbml0KCZwdmVjLCAxKTsKLQotCXBnbW92ZWQgPSAwOwotCWxydSA9IExSVV9CQVNFICsgZmlsZSAqIExSVV9GSUxFOwogCXdoaWxlICghbGlzdF9lbXB0eSgmbF9pbmFjdGl2ZSkpIHsKIAkJcGFnZSA9IGxydV90b19wYWdlKCZsX2luYWN0aXZlKTsKIAkJcHJlZmV0Y2h3X3ByZXZfbHJ1X3BhZ2UocGFnZSwgJmxfaW5hY3RpdmUsIGZsYWdzKTsKQEAgLTEzMzYsMTIgKzEzMjYsNiBAQAogCXVuc2lnbmVkIGxvbmcgYW5vbl9wcmlvLCBmaWxlX3ByaW87CiAJdW5zaWduZWQgbG9uZyBhcCwgZnA7CiAKLQlhbm9uICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfQU5PTikgKwotCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfQU5PTik7Ci0JZmlsZSAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0ZJTEUpICsKLQkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0ZJTEUpOwotCWZyZWUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpOwotCiAJLyogSWYgd2UgaGF2ZSBubyBzd2FwIHNwYWNlLCBkbyBub3QgYm90aGVyIHNjYW5uaW5nIGFub24gcGFnZXMuICovCiAJaWYgKG5yX3N3YXBfcGFnZXMgPD0gMCkgewogCQlwZXJjZW50WzBdID0gMDsKQEAgLTEzNDksNiArMTMzMywxMiBAQAogCQlyZXR1cm47CiAJfQogCisJYW5vbiAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0FOT04pICsKKwkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04pOworCWZpbGUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9GSUxFKSArCisJCXpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9GSUxFKTsKKwlmcmVlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9GUkVFX1BBR0VTKTsKKwogCS8qIElmIHdlIGhhdmUgdmVyeSBmZXcgcGFnZSBjYWNoZSBwYWdlcywgZm9yY2Utc2NhbiBhbm9uIHBhZ2VzLiAqLwogCWlmICh1bmxpa2VseShmaWxlICsgZnJlZSA8PSB6b25lLT5wYWdlc19oaWdoKSkgewogCQlwZXJjZW50WzBdID0gMTAwOwpAQCAtMTQwOCwxNCArMTM5OCwxNSBAQAogLyoKICAqIFRoaXMgaXMgYSBiYXNpYyBwZXItem9uZSBwYWdlIGZyZWVyLiAgVXNlZCBieSBib3RoIGtzd2FwZCBhbmQgZGlyZWN0IHJlY2xhaW0uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNocmlua196b25lKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmUgKnpvbmUsCitzdGF0aWMgdm9pZCBzaHJpbmtfem9uZShpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lICp6b25lLAogCQkJCXN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCXVuc2lnbmVkIGxvbmcgbnJbTlJfTFJVX0xJU1RTXTsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW47Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGVyY2VudFsyXTsJLyogYW5vbiBAIDA7IGZpbGUgQCAxICovCiAJZW51bSBscnVfbGlzdCBsOworCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gc2MtPm5yX3JlY2xhaW1lZDsKKwl1bnNpZ25lZCBsb25nIHN3YXBfY2x1c3Rlcl9tYXggPSBzYy0+c3dhcF9jbHVzdGVyX21heDsKIAogCWdldF9zY2FuX3JhdGlvKHpvbmUsIHNjLCBwZXJjZW50KTsKIApAQCAtMTQzMSw3ICsxNDIyLDcgQEAKIAkJCX0KIAkJCXpvbmUtPmxydVtsXS5ucl9zY2FuICs9IHNjYW47CiAJCQlucltsXSA9IHpvbmUtPmxydVtsXS5ucl9zY2FuOwotCQkJaWYgKG5yW2xdID49IHNjLT5zd2FwX2NsdXN0ZXJfbWF4KQorCQkJaWYgKG5yW2xdID49IHN3YXBfY2x1c3Rlcl9tYXgpCiAJCQkJem9uZS0+bHJ1W2xdLm5yX3NjYW4gPSAwOwogCQkJZWxzZQogCQkJCW5yW2xdID0gMDsKQEAgLTE0NTAsMTYgKzE0NDEsMjggQEAKIAkJCQkJbnJbTFJVX0lOQUNUSVZFX0ZJTEVdKSB7CiAJCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobCkgewogCQkJaWYgKG5yW2xdKSB7Ci0JCQkJbnJfdG9fc2NhbiA9IG1pbihucltsXSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpc2MtPnN3YXBfY2x1c3Rlcl9tYXgpOworCQkJCW5yX3RvX3NjYW4gPSBtaW4obnJbbF0sIHN3YXBfY2x1c3Rlcl9tYXgpOwogCQkJCW5yW2xdIC09IG5yX3RvX3NjYW47CiAKIAkJCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX2xpc3QobCwgbnJfdG9fc2NhbiwKLQkJCQkJCQl6b25lLCBzYywgcHJpb3JpdHkpOworCQkJCQkJCSAgICB6b25lLCBzYywgcHJpb3JpdHkpOwogCQkJfQogCQl9CisJCS8qCisJCSAqIE9uIGxhcmdlIG1lbW9yeSBzeXN0ZW1zLCBzY2FuID4+IHByaW9yaXR5IGNhbiBiZWNvbWUKKwkJICogcmVhbGx5IGxhcmdlLiBUaGlzIGlzIGZpbmUgZm9yIHRoZSBzdGFydGluZyBwcmlvcml0eTsKKwkJICogd2Ugd2FudCB0byBwdXQgZXF1YWwgc2Nhbm5pbmcgcHJlc3N1cmUgb24gZWFjaCB6b25lLgorCQkgKiBIb3dldmVyLCBpZiB0aGUgVk0gaGFzIGEgaGFyZGVyIHRpbWUgb2YgZnJlZWluZyBwYWdlcywKKwkJICogd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMgcmVjbGFpbWluZyBwYWdlcywgdGhlIHRvdGFsCisJCSAqIGZyZWVpbmcgdGFyZ2V0IGNhbiBnZXQgdW5yZWFzb25hYmx5IGxhcmdlLgorCQkgKi8KKwkJaWYgKG5yX3JlY2xhaW1lZCA+IHN3YXBfY2x1c3Rlcl9tYXggJiYKKwkJCXByaW9yaXR5IDwgREVGX1BSSU9SSVRZICYmICFjdXJyZW50X2lzX2tzd2FwZCgpKQorCQkJYnJlYWs7CiAJfQogCisJc2MtPm5yX3JlY2xhaW1lZCA9IG5yX3JlY2xhaW1lZDsKKwogCS8qCiAJICogRXZlbiBpZiB3ZSBkaWQgbm90IHRyeSB0byBldmljdCBhbm9uIHBhZ2VzIGF0IGFsbCwgd2Ugd2FudCB0bwogCSAqIHJlYmFsYW5jZSB0aGUgYW5vbiBscnUgYWN0aXZlL2luYWN0aXZlIHJhdGlvLgpAQCAtMTQ3MCw3ICsxNDczLDYgQEAKIAkJc2hyaW5rX2FjdGl2ZV9saXN0KFNXQVBfQ0xVU1RFUl9NQVgsIHpvbmUsIHNjLCBwcmlvcml0eSwgMCk7CiAKIAl0aHJvdHRsZV92bV93cml0ZW91dChzYy0+Z2ZwX21hc2spOwotCXJldHVybiBucl9yZWNsYWltZWQ7CiB9CiAKIC8qCkBAIC0xNDg0LDE2ICsxNDg2LDEzIEBACiAgKiBiKSBUaGUgem9uZXMgbWF5IGJlIG92ZXIgcGFnZXNfaGlnaCBidXQgdGhleSBtdXN0IGdvICpvdmVyKiBwYWdlc19oaWdoIHRvCiAgKiAgICBzYXRpc2Z5IHRoZSBgaW5jcmVtZW50YWwgbWluJyB6b25lIGRlZmVuc2UgYWxnb3JpdGhtLgogICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWNsYWltZWQgcGFnZXMuCi0gKgogICogSWYgYSB6b25lIGlzIGRlZW1lZCB0byBiZSBmdWxsIG9mIHBpbm5lZCBwYWdlcyB0aGVuIGp1c3QgZ2l2ZSBpdCBhIGxpZ2h0CiAgKiBzY2FuIHRoZW4gZ2l2ZSB1cCBvbiBpdC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX3pvbmVzKGludCBwcmlvcml0eSwgc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwKK3N0YXRpYyB2b2lkIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCiAJCQkJCXN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogewogCWVudW0gem9uZV90eXBlIGhpZ2hfem9uZWlkeCA9IGdmcF96b25lKHNjLT5nZnBfbWFzayk7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCkBAIC0xNTI0LDEwICsxNTIzLDggQEAKIAkJCQkJCQlwcmlvcml0eSk7CiAJCX0KIAotCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKKwkJc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKIAl9Ci0KLQlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCiAvKgpAQCAtMTU1Miw3ICsxNTQ5LDYgQEAKIAlpbnQgcHJpb3JpdHk7CiAJdW5zaWduZWQgbG9uZyByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfc2Nhbm5lZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlID0gY3VycmVudC0+cmVjbGFpbV9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGxydV9wYWdlcyA9IDA7CiAJc3RydWN0IHpvbmVyZWYgKno7CkBAIC0xNTgwLDcgKzE1NzYsNyBAQAogCQlzYy0+bnJfc2Nhbm5lZCA9IDA7CiAJCWlmICghcHJpb3JpdHkpCiAJCQlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKLQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lcyhwcmlvcml0eSwgem9uZWxpc3QsIHNjKTsKKwkJc2hyaW5rX3pvbmVzKHByaW9yaXR5LCB6b25lbGlzdCwgc2MpOwogCQkvKgogCQkgKiBEb24ndCBzaHJpbmsgc2xhYnMgd2hlbiByZWNsYWltaW5nIG1lbW9yeSBmcm9tCiAJCSAqIG92ZXIgbGltaXQgY2dyb3VwcwpAQCAtMTU4OCwxMyArMTU4NCwxMyBAQAogCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgewogCQkJc2hyaW5rX3NsYWIoc2MtPm5yX3NjYW5uZWQsIHNjLT5nZnBfbWFzaywgbHJ1X3BhZ2VzKTsKIAkJCWlmIChyZWNsYWltX3N0YXRlKSB7Ci0JCQkJbnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOworCQkJCXNjLT5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CiAJCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOwogCQkJfQogCQl9CiAJCXRvdGFsX3NjYW5uZWQgKz0gc2MtPm5yX3NjYW5uZWQ7Ci0JCWlmIChucl9yZWNsYWltZWQgPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpIHsKLQkJCXJldCA9IG5yX3JlY2xhaW1lZDsKKwkJaWYgKHNjLT5ucl9yZWNsYWltZWQgPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpIHsKKwkJCXJldCA9IHNjLT5ucl9yZWNsYWltZWQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0xNjE3LDcgKzE2MTMsNyBAQAogCX0KIAkvKiB0b3AgcHJpb3JpdHkgc2hyaW5rX3pvbmVzIHN0aWxsIGhhZCBtb3JlIHRvIGRvPyBkb24ndCBPT00sIHRoZW4gKi8KIAlpZiAoIXNjLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBzY2FuX2dsb2JhbF9scnUoc2MpKQotCQlyZXQgPSBucl9yZWNsYWltZWQ7CisJCXJldCA9IHNjLT5ucl9yZWNsYWltZWQ7CiBvdXQ6CiAJLyoKIAkgKiBOb3cgdGhhdCB3ZSd2ZSBzY2FubmVkIGFsbCB0aGUgem9uZXMgYXQgdGhpcyBwcmlvcml0eSBsZXZlbCwgbm90ZQpAQCAtMTcxMiw3ICsxNzA4LDYgQEAKIAlpbnQgcHJpb3JpdHk7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FubmVkOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlID0gY3VycmVudC0+cmVjbGFpbV9zdGF0ZTsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewogCQkuZ2ZwX21hc2sgPSBHRlBfS0VSTkVMLApAQCAtMTczMSw3ICsxNzI2LDcgQEAKIAogbG9vcF9hZ2FpbjoKIAl0b3RhbF9zY2FubmVkID0gMDsKLQlucl9yZWNsYWltZWQgPSAwOworCXNjLm5yX3JlY2xhaW1lZCA9IDA7CiAJc2MubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZTsKIAljb3VudF92bV9ldmVudChQQUdFT1VUUlVOKTsKIApAQCAtMTgxNywxMSArMTgxMiwxMSBAQAogCQkJICovCiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCA4KnpvbmUtPnBhZ2VzX2hpZ2gsCiAJCQkJCQllbmRfem9uZSwgMCkpCi0JCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOworCQkJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOwogCQkJbnJfc2xhYiA9IHNocmlua19zbGFiKHNjLm5yX3NjYW5uZWQsIEdGUF9LRVJORUwsCiAJCQkJCQlscnVfcGFnZXMpOwotCQkJbnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOworCQkJc2MubnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOwogCQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOwogCQkJaWYgKHpvbmVfaXNfYWxsX3VucmVjbGFpbWFibGUoem9uZSkpCiAJCQkJY29udGludWU7CkBAIC0xODM1LDcgKzE4MzAsNyBAQAogCQkJICogZXZlbiBpbiBsYXB0b3AgbW9kZQogCQkJICovCiAJCQlpZiAodG90YWxfc2Nhbm5lZCA+IFNXQVBfQ0xVU1RFUl9NQVggKiAyICYmCi0JCQkgICAgdG90YWxfc2Nhbm5lZCA+IG5yX3JlY2xhaW1lZCArIG5yX3JlY2xhaW1lZCAvIDIpCisJCQkgICAgdG90YWxfc2Nhbm5lZCA+IHNjLm5yX3JlY2xhaW1lZCArIHNjLm5yX3JlY2xhaW1lZCAvIDIpCiAJCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAJCX0KIAkJaWYgKGFsbF96b25lc19vaykKQEAgLTE4NTMsNyArMTg0OCw3IEBACiAJCSAqIG1hdGNoZXMgdGhlIGRpcmVjdCByZWNsYWltIHBhdGggYmVoYXZpb3VyIGluIHRlcm1zIG9mIGltcGFjdAogCQkgKiBvbiB6b25lLT4qX3ByaW9yaXR5LgogCQkgKi8KLQkJaWYgKG5yX3JlY2xhaW1lZCA+PSBTV0FQX0NMVVNURVJfTUFYKQorCQlpZiAoc2MubnJfcmVjbGFpbWVkID49IFNXQVBfQ0xVU1RFUl9NQVgpCiAJCQlicmVhazsKIAl9CiBvdXQ6CkBAIC0xODcyLDEwICsxODY3LDI3IEBACiAKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCisJCS8qCisJCSAqIEZyYWdtZW50YXRpb24gbWF5IG1lYW4gdGhhdCB0aGUgc3lzdGVtIGNhbm5vdCBiZQorCQkgKiByZWJhbGFuY2VkIGZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zIGluIGFsbCB6b25lcy4KKwkJICogQXQgdGhpcyBwb2ludCwgaWYgbnJfcmVjbGFpbWVkIDwgU1dBUF9DTFVTVEVSX01BWCwKKwkJICogaXQgbWVhbnMgdGhlIHpvbmVzIGhhdmUgYmVlbiBmdWxseSBzY2FubmVkIGFuZCBhcmUgc3RpbGwKKwkJICogbm90IGJhbGFuY2VkLiBGb3IgaGlnaC1vcmRlciBhbGxvY2F0aW9ucywgdGhlcmUgaXMKKwkJICogbGl0dGxlIHBvaW50IHRyeWluZyBhbGwgb3ZlciBhZ2FpbiBhcyBrc3dhcGQgbWF5CisJCSAqIGluZmluaXRlIGxvb3AuCisJCSAqCisJCSAqIEluc3RlYWQsIHJlY2hlY2sgYWxsIHdhdGVybWFya3MgYXQgb3JkZXItMCBhcyB0aGV5CisJCSAqIGFyZSB0aGUgbW9zdCBpbXBvcnRhbnQuIElmIHdhdGVybWFya3MgYXJlIG9rLCBrc3dhcGQgd2lsbCBnbworCQkgKiBiYWNrIHRvIHNsZWVwLiBIaWdoLW9yZGVyIHVzZXJzIGNhbiBzdGlsbCBwZXJmb3JtIGRpcmVjdAorCQkgKiByZWNsYWltIGlmIHRoZXkgd2lzaC4KKwkJICovCisJCWlmIChzYy5ucl9yZWNsYWltZWQgPCBTV0FQX0NMVVNURVJfTUFYKQorCQkJb3JkZXIgPSBzYy5vcmRlciA9IDA7CisKIAkJZ290byBsb29wX2FnYWluOwogCX0KIAotCXJldHVybiBucl9yZWNsYWltZWQ7CisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZDsKIH0KIAogLyoKQEAgLTIyMjcsNyArMjIzOSw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKIAlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSByZWNsYWltX3N0YXRlOwogCWludCBwcmlvcml0eTsKLQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJc3RydWN0IHNjYW5fY29udHJvbCBzYyA9IHsKIAkJLm1heV93cml0ZXBhZ2UgPSAhISh6b25lX3JlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fV1JJVEUpLAogCQkubWF5X3N3YXAgPSAhISh6b25lX3JlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fU1dBUCksCkBAIC0yMjYwLDkgKzIyNzEsOSBAQAogCQlwcmlvcml0eSA9IFpPTkVfUkVDTEFJTV9QUklPUklUWTsKIAkJZG8gewogCQkJbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHpvbmUsIHByaW9yaXR5KTsKLQkJCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKKwkJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcHJpb3JpdHktLTsKLQkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CisJCX0gd2hpbGUgKHByaW9yaXR5ID49IDAgJiYgc2MubnJfcmVjbGFpbWVkIDwgbnJfcGFnZXMpOwogCX0KIAogCXNsYWJfcmVjbGFpbWFibGUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfU0xBQl9SRUNMQUlNQUJMRSk7CkBAIC0yMjg2LDEzICsyMjk3LDEzIEBACiAJCSAqIFVwZGF0ZSBucl9yZWNsYWltZWQgYnkgdGhlIG51bWJlciBvZiBzbGFiIHBhZ2VzIHdlCiAJCSAqIHJlY2xhaW1lZCBmcm9tIHRoaXMgem9uZS4KIAkJICovCi0JCW5yX3JlY2xhaW1lZCArPSBzbGFiX3JlY2xhaW1hYmxlIC0KKwkJc2MubnJfcmVjbGFpbWVkICs9IHNsYWJfcmVjbGFpbWFibGUgLQogCQkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1NMQUJfUkVDTEFJTUFCTEUpOwogCX0KIAogCXAtPnJlY2xhaW1fc3RhdGUgPSBOVUxMOwogCWN1cnJlbnQtPmZsYWdzICY9IH4oUEZfTUVNQUxMT0MgfCBQRl9TV0FQV1JJVEUpOwotCXJldHVybiBucl9yZWNsYWltZWQgPj0gbnJfcGFnZXM7CisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZCA+PSBucl9wYWdlczsKIH0KIAogaW50IHpvbmVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKQEAgLTI0NzIsNyArMjQ4Myw3IEBACiAgKiBiYWNrIG9udG8gQHpvbmUncyB1bmV2aWN0YWJsZSBsaXN0LgogICovCiAjZGVmaW5lIFNDQU5fVU5FVklDVEFCTEVfQkFUQ0hfU0laRSAxNlVMIC8qIGFyYml0cmFyeSBsb2NrIGhvbGQgYmF0Y2ggc2l6ZSAqLwotdm9pZCBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCitzdGF0aWMgdm9pZCBzY2FuX3pvbmVfdW5ldmljdGFibGVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbF91bmV2aWN0YWJsZSA9ICZ6b25lLT5scnVbTFJVX1VORVZJQ1RBQkxFXS5saXN0OwogCXVuc2lnbmVkIGxvbmcgc2NhbjsKQEAgLTI1MTQsNyArMjUyNSw3IEBACiAgKiB0aGF0IGhhcyBwb3NzaWJseS9wcm9iYWJseSBtYWRlIHNvbWUgcHJldmlvdXNseSB1bmV2aWN0YWJsZSBwYWdlcwogICogZXZpY3RhYmxlLgogICovCi12b2lkIHNjYW5fYWxsX3pvbmVzX3VuZXZpY3RhYmxlX3BhZ2VzKHZvaWQpCitzdGF0aWMgdm9pZCBzY2FuX2FsbF96b25lc191bmV2aWN0YWJsZV9wYWdlcyh2b2lkKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMgYi9uZXQvaXB2NC9jaXBzb19pcHY0LmMKaW5kZXggZTUyNzk5MC4uNmJiMjYzNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvY2lwc29faXB2NC5jCisrKyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgpAQCAtNDQ5LDYgKzQ1MCw3IEBACiAvKioKICAqIGNpcHNvX3Y0X2RvaV9hZGQgLSBBZGQgYSBuZXcgRE9JIHRvIHRoZSBDSVBTTyBwcm90b2NvbCBlbmdpbmUKICAqIEBkb2lfZGVmOiB0aGUgRE9JIHN0cnVjdHVyZQorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBUaGUgY2FsbGVyIGRlZmluZXMgYSBuZXcgRE9JIGZvciB1c2UgYnkgdGhlIENJUFNPIGVuZ2luZSBhbmQgY2FsbHMgdGhpcwpAQCAtNDU4LDUwICs0NjAsNzggQEAKICAqIHplcm8gb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpCitpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CisJaW50IHJldF92YWwgPSAtRUlOVkFMOwogCXUzMiBpdGVyOworCXUzMiBkb2k7CisJdTMyIGRvaV90eXBlOworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKKworCWRvaSA9IGRvaV9kZWYtPmRvaTsKKwlkb2lfdHlwZSA9IGRvaV9kZWYtPnR5cGU7CiAKIAlpZiAoZG9pX2RlZiA9PSBOVUxMIHx8IGRvaV9kZWYtPmRvaSA9PSBDSVBTT19WNF9ET0lfVU5LTk9XTikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gZG9pX2FkZF9yZXR1cm47CiAJZm9yIChpdGVyID0gMDsgaXRlciA8IENJUFNPX1Y0X1RBR19NQVhDTlQ7IGl0ZXIrKykgewogCQlzd2l0Y2ggKGRvaV9kZWYtPnRhZ3NbaXRlcl0pIHsKIAkJY2FzZSBDSVBTT19WNF9UQUdfUkJJVE1BUDoKIAkJCWJyZWFrOwogCQljYXNlIENJUFNPX1Y0X1RBR19SQU5HRToKLQkJCWlmIChkb2lfZGVmLT50eXBlICE9IENJUFNPX1Y0X01BUF9QQVNTKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfVEFHX0lOVkFMSUQ6Ci0JCQlpZiAoaXRlciA9PSAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX0VOVU06CiAJCQlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfUEFTUykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlnb3RvIGRvaV9hZGRfcmV0dXJuOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX0xPQ0FMOgogCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX0xPQ0FMKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWdvdG8gZG9pX2FkZF9yZXR1cm47CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfSU5WQUxJRDoKKwkJCWlmIChpdGVyID09IDApCisJCQkJZ290byBkb2lfYWRkX3JldHVybjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnb3RvIGRvaV9hZGRfcmV0dXJuOwogCQl9CiAJfQogCiAJYXRvbWljX3NldCgmZG9pX2RlZi0+cmVmY291bnQsIDEpOwogCiAJc3Bpbl9sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKLQlpZiAoY2lwc29fdjRfZG9pX3NlYXJjaChkb2lfZGVmLT5kb2kpICE9IE5VTEwpCi0JCWdvdG8gZG9pX2FkZF9mYWlsdXJlOworCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkgIT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJCXJldF92YWwgPSAtRUVYSVNUOworCQlnb3RvIGRvaV9hZGRfcmV0dXJuOworCX0KIAlsaXN0X2FkZF90YWlsX3JjdSgmZG9pX2RlZi0+bGlzdCwgJmNpcHNvX3Y0X2RvaV9saXN0KTsKIAlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CisJcmV0X3ZhbCA9IDA7CiAKLQlyZXR1cm4gMDsKK2RvaV9hZGRfcmV0dXJuOgorCWF1ZGl0X2J1ZiA9IG5ldGxibF9hdWRpdF9zdGFydChBVURJVF9NQUNfQ0lQU09WNF9BREQsIGF1ZGl0X2luZm8pOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICp0eXBlX3N0cjsKKwkJc3dpdGNoIChkb2lfdHlwZSkgeworCQljYXNlIENJUFNPX1Y0X01BUF9UUkFOUzoKKwkJCXR5cGVfc3RyID0gInRyYW5zIjsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgorCQkJdHlwZV9zdHIgPSAicGFzcyI7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9NQVBfTE9DQUw6CisJCQl0eXBlX3N0ciA9ICJsb2NhbCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXR5cGVfc3RyID0gIih1bmtub3duKSI7CisJCX0KKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKKwkJCQkgZG9pLCB0eXBlX3N0ciwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQogCi1kb2lfYWRkX2ZhaWx1cmU6Ci0Jc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCXJldHVybiAtRUVYSVNUOworCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKQEAgLTU1OSwyNSArNTg5LDM5IEBACiAgKi8KIGludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CisJaW50IHJldF92YWw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZjsKKwlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAKIAlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwogCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGRvaSk7CiAJaWYgKGRvaV9kZWYgPT0gTlVMTCkgewogCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JCXJldHVybiAtRU5PRU5UOworCQlyZXRfdmFsID0gLUVOT0VOVDsKKwkJZ290byBkb2lfcmVtb3ZlX3JldHVybjsKIAl9CiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkb2lfZGVmLT5yZWZjb3VudCkpIHsKIAkJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXRfdmFsID0gLUVCVVNZOworCQlnb3RvIGRvaV9yZW1vdmVfcmV0dXJuOwogCX0KIAlsaXN0X2RlbF9yY3UoJmRvaV9kZWYtPmxpc3QpOwogCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKIAogCWNpcHNvX3Y0X2NhY2hlX2ludmFsaWRhdGUoKTsKIAljYWxsX3JjdSgmZG9pX2RlZi0+cmN1LCBjaXBzb192NF9kb2lfZnJlZV9yY3UpOworCXJldF92YWwgPSAwOwogCi0JcmV0dXJuIDA7Citkb2lfcmVtb3ZlX3JldHVybjoKKwlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnQoQVVESVRfTUFDX0NJUFNPVjRfREVMLCBhdWRpdF9pbmZvKTsKKwlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IHJlcz0ldSIsCisJCQkJIGRvaSwgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQorCisJcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvaXVjdi5jIGIvbmV0L2l1Y3YvaXVjdi5jCmluZGV4IDAzMmY2MWUuLmEzNTI0MGYgMTAwNjQ0Ci0tLSBhL25ldC9pdWN2L2l1Y3YuYworKysgYi9uZXQvaXVjdi9pdWN2LmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogLyoKQEAgLTE2OTYsNyArMTY5NSw3IEBACiAJcmMgPSByZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKLQlpdWN2X3Jvb3QgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJpdWN2Iik7CisJaXVjdl9yb290ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoIml1Y3YiKTsKIAlpZiAoSVNfRVJSKGl1Y3Zfcm9vdCkpIHsKIAkJcmMgPSBQVFJfRVJSKGl1Y3Zfcm9vdCk7CiAJCWdvdG8gb3V0X2ludDsKQEAgLTE3NDAsNyArMTczOSw3IEBACiAJCWtmcmVlKGl1Y3ZfaXJxX2RhdGFbY3B1XSk7CiAJCWl1Y3ZfaXJxX2RhdGFbY3B1XSA9IE5VTEw7CiAJfQotCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoaXVjdl9yb290KTsKIG91dF9pbnQ6CiAJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiBvdXQ6CkBAIC0xNzcwLDcgKzE3NjksNyBAQAogCQlrZnJlZShpdWN2X2lycV9kYXRhW2NwdV0pOwogCQlpdWN2X2lycV9kYXRhW2NwdV0gPSBOVUxMOwogCX0KLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CiAJYnVzX3VucmVnaXN0ZXIoJml1Y3ZfYnVzKTsKIAl1bnJlZ2lzdGVyX2V4dGVybmFsX2ludGVycnVwdCgweDQwMDAsIGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKaW5kZXggZmZmMzJiNy4uYmYxYWIxYSAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogLyoqCiAgKiBuZXRsYmxfY2lwc292NF9hZGRfc3RkIC0gQWRkcyBhIENJUFNPIFY0IERPSSBkZWZpbml0aW9uCiAgKiBAaW5mbzogdGhlIEdlbmVyaWMgTkVUTElOSyBpbmZvIGJsb2NrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIENyZWF0ZSBhIG5ldyBDSVBTT19WNF9NQVBfVFJBTlMgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERApAQCAtMTM3LDcgKzEzOCw4IEBACiAgKiBub24temVybyBvbiBlcnJvci4KICAqCiAgKi8KLXN0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZChzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQorc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfc3RkKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsID0gLUVJTlZBTDsKIAlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmID0gTlVMTDsKQEAgLTMxNiw3ICszMTgsNyBAQAogCQkJfQogCX0KIAotCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYpOworCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYsIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCiAJCWdvdG8gYWRkX3N0ZF9mYWlsdXJlOwogCXJldHVybiAwOwpAQCAtMzMwLDYgKzMzMiw3IEBACiAvKioKICAqIG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzIC0gQWRkcyBhIENJUFNPIFY0IERPSSBkZWZpbml0aW9uCiAgKiBAaW5mbzogdGhlIEdlbmVyaWMgTkVUTElOSyBpbmZvIGJsb2NrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIENyZWF0ZSBhIG5ldyBDSVBTT19WNF9NQVBfUEFTUyBET0kgZGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gQUREIG1lc3NhZ2UKQEAgLTMzNyw3ICszNDAsOCBAQAogICogZXJyb3IuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitzdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmID0gTlVMTDsKQEAgLTM1NCw3ICszNTgsNyBAQAogCWlmIChyZXRfdmFsICE9IDApCiAJCWdvdG8gYWRkX3Bhc3NfZmFpbHVyZTsKIAotCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYpOworCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYsIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCiAJCWdvdG8gYWRkX3Bhc3NfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTM2Nyw2ICszNzEsNyBAQAogLyoqCiAgKiBuZXRsYmxfY2lwc292NF9hZGRfbG9jYWwgLSBBZGRzIGEgQ0lQU08gVjQgRE9JIGRlZmluaXRpb24KICAqIEBpbmZvOiB0aGUgR2VuZXJpYyBORVRMSU5LIGluZm8gYmxvY2sKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgogICogQ3JlYXRlIGEgbmV3IENJUFNPX1Y0X01BUF9MT0NBTCBET0kgZGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gQURECkBAIC0zNzQsNyArMzc5LDggQEAKICAqIG5vbi16ZXJvIG9uIGVycm9yLgogICoKICAqLwotc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfbG9jYWwoc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCisJCQkJICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CkBAIC0zOTEsNyArMzk3LDcgQEAKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9sb2NhbF9mYWlsdXJlOwogCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZik7CisJcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZiwgYXVkaXRfaW5mbyk7CiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBhZGRfbG9jYWxfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTQxNSw0OCArNDIxLDMxIEBACiAKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7Ci0JdTMyIHR5cGU7Ci0JdTMyIGRvaTsKIAljb25zdCBjaGFyICp0eXBlX3N0ciA9ICIodW5rbm93bikiOwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CiAKIAlpZiAoIWluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX0RPSV0gfHwKIAkgICAgIWluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX01UWVBFXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkb2kgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKTsKIAluZXRsYmxfbmV0bGlua19hdWRpdGluZm8oc2tiLCAmYXVkaXRfaW5mbyk7Ci0KLQl0eXBlID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfTVRZUEVdKTsKLQlzd2l0Y2ggKHR5cGUpIHsKKwlzd2l0Y2ggKG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX01UWVBFXSkpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9UUkFOUzoKIAkJdHlwZV9zdHIgPSAidHJhbnMiOwotCQlyZXRfdmFsID0gbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZChpbmZvKTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9zdGQoaW5mbywgJmF1ZGl0X2luZm8pOwogCQlicmVhazsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQl0eXBlX3N0ciA9ICJwYXNzIjsKLQkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzKGluZm8pOworCQlyZXRfdmFsID0gbmV0bGJsX2NpcHNvdjRfYWRkX3Bhc3MoaW5mbywgJmF1ZGl0X2luZm8pOwogCQlicmVhazsKIAljYXNlIENJUFNPX1Y0X01BUF9MT0NBTDoKIAkJdHlwZV9zdHIgPSAibG9jYWwiOwotCQlyZXRfdmFsID0gbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKGluZm8pOworCQlyZXRfdmFsID0gbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKGluZm8sICZhdWRpdF9pbmZvKTsKIAkJYnJlYWs7CiAJfQogCWlmIChyZXRfdmFsID09IDApCiAJCWF0b21pY19pbmMoJm5ldGxhYmVsX21nbXRfcHJvdG9jb3VudCk7CiAKLQlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0FERCwKLQkJCQkJICAgICAgJmF1ZGl0X2luZm8pOwotCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgewotCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAotCQkJCSBkb2ksCi0JCQkJIHR5cGVfc3RyLAotCQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKLQl9Ci0KIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtNzI1LDkgKzcxNCw3IEBACiBzdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X3JlbW92ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCByZXRfdmFsID0gLUVJTlZBTDsKLQl1MzIgZG9pID0gMDsKIAlzdHJ1Y3QgbmV0bGJsX2RvbWhzaF93YWxrX2FyZyBjYl9hcmc7Ci0Jc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOwogCXN0cnVjdCBuZXRsYmxfYXVkaXQgYXVkaXRfaW5mbzsKIAl1MzIgc2tpcF9ia3QgPSAwOwogCXUzMiBza2lwX2NoYWluID0gMDsKQEAgLTczNSwyOSArNzIyLDE3IEBACiAJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRvaSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX0RPSV0pOwogCW5ldGxibF9uZXRsaW5rX2F1ZGl0aW5mbyhza2IsICZhdWRpdF9pbmZvKTsKLQotCWNiX2FyZy5kb2kgPSBkb2k7CisJY2JfYXJnLmRvaSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX0RPSV0pOwogCWNiX2FyZy5hdWRpdF9pbmZvID0gJmF1ZGl0X2luZm87CiAJcmV0X3ZhbCA9IG5ldGxibF9kb21oc2hfd2Fsaygmc2tpcF9ia3QsICZza2lwX2NoYWluLAogCQkJCSAgICAgbmV0bGJsX2NpcHNvdjRfcmVtb3ZlX2NiLCAmY2JfYXJnKTsKIAlpZiAocmV0X3ZhbCA9PSAwIHx8IHJldF92YWwgPT0gLUVOT0VOVCkgewotCQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX3JlbW92ZShkb2ksICZhdWRpdF9pbmZvKTsKKwkJcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9yZW1vdmUoY2JfYXJnLmRvaSwgJmF1ZGl0X2luZm8pOwogCQlpZiAocmV0X3ZhbCA9PSAwKQogCQkJYXRvbWljX2RlYygmbmV0bGFiZWxfbWdtdF9wcm90b2NvdW50KTsKIAl9CiAKLQlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0RFTCwKLQkJCQkJICAgICAgJmF1ZGl0X2luZm8pOwotCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgewotCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCQkgIiBjaXBzb19kb2k9JXUgcmVzPSV1IiwKLQkJCQkgZG9pLAotCQkJCSByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKLQl9Ci0KIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKaW5kZXggNWZhZGYxMC4uN2ExMGJiZSAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCkBAIC00ODMsNiArNDgzLDczIEBACiB9CiAKIC8qKgorICogbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0IC0gUmVtb3ZlcyBhbiBhZGRyZXNzIHNlbGVjdG9yIGVudHJ5CisgKiBAZG9tYWluOiB0aGUgZG9tYWluCisgKiBAYWRkcjogSVB2NCBhZGRyZXNzCisgKiBAbWFzazogSVB2NCBhZGRyZXNzIG1hc2sKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBhbiBpbmRpdmlkdWFsIGFkZHJlc3Mgc2VsZWN0b3IgZnJvbSBhIGRvbWFpbiBtYXBwaW5nIGFuZCBwb3RlbnRpYWxseQorICogdGhlIGVudGlyZSBtYXBwaW5nIGlmIGl0IGlzIGVtcHR5LiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcworICogb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfZG9taHNoX3JlbW92ZV9hZjQoY29uc3QgY2hhciAqZG9tYWluLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKm1hc2ssCisJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeV9tYXA7CisJc3RydWN0IG5ldGxibF9hZjRsaXN0ICplbnRyeV9hZGRyOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKKyNlbmRpZiAvKiBJUHY2ICovCisJc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKmVudHJ5OworCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKGRvbWFpbikKKwkJZW50cnlfbWFwID0gbmV0bGJsX2RvbWhzaF9zZWFyY2goZG9tYWluKTsKKwllbHNlCisJCWVudHJ5X21hcCA9IG5ldGxibF9kb21oc2hfc2VhcmNoX2RlZihkb21haW4pOworCWlmIChlbnRyeV9tYXAgPT0gTlVMTCB8fCBlbnRyeV9tYXAtPnR5cGUgIT0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUKQorCQlnb3RvIHJlbW92ZV9hZjRfZmFpbHVyZTsKKworCXNwaW5fbG9jaygmbmV0bGJsX2RvbWhzaF9sb2NrKTsKKwllbnRyeV9hZGRyID0gbmV0bGJsX2FmNGxpc3RfcmVtb3ZlKGFkZHItPnNfYWRkciwgbWFzay0+c19hZGRyLAorCQkJCQkgICAmZW50cnlfbWFwLT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NCk7CisJc3Bpbl91bmxvY2soJm5ldGxibF9kb21oc2hfbG9jayk7CisKKwlpZiAoZW50cnlfYWRkciA9PSBOVUxMKQorCQlnb3RvIHJlbW92ZV9hZjRfZmFpbHVyZTsKKwluZXRsYmxfYWY0bGlzdF9mb3JlYWNoX3JjdShpdGVyNCwgJmVudHJ5X21hcC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDQpCisJCWdvdG8gcmVtb3ZlX2FmNF9zaW5nbGVfYWRkcjsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwgJmVudHJ5X21hcC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDYpCisJCWdvdG8gcmVtb3ZlX2FmNF9zaW5nbGVfYWRkcjsKKyNlbmRpZiAvKiBJUHY2ICovCisJLyogdGhlIGRvbWFpbiBtYXBwaW5nIGlzIGVtcHR5IHNvIHJlbW92ZSBpdCBmcm9tIHRoZSBtYXBwaW5nIHRhYmxlICovCisJbmV0bGJsX2RvbWhzaF9yZW1vdmVfZW50cnkoZW50cnlfbWFwLCBhdWRpdF9pbmZvKTsKKworcmVtb3ZlX2FmNF9zaW5nbGVfYWRkcjoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwkvKiB5aWNrLCB3ZSBjYW4ndCB1c2UgY2FsbF9yY3UgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSByY3UgaGVhZAorCSAqIHBvaW50ZXIgYnV0IGhvcGVmdWxseSB0aGlzIHNob3VsZCBiZSBhIHJhcmUgY2FzZSBzbyB0aGUgcGF1c2UKKwkgKiBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtICovCisJc3luY2hyb25pemVfcmN1KCk7CisJZW50cnkgPSBuZXRsYmxfZG9taHNoX2FkZHI0X2VudHJ5KGVudHJ5X2FkZHIpOworCWNpcHNvX3Y0X2RvaV9wdXRkZWYoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQpOworCWtmcmVlKGVudHJ5KTsKKwlyZXR1cm4gMDsKKworcmVtb3ZlX2FmNF9mYWlsdXJlOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAtRU5PRU5UOworfQorCisvKioKICAqIG5ldGxibF9kb21oc2hfcmVtb3ZlIC0gUmVtb3ZlcyBhbiBlbnRyeSBmcm9tIHRoZSBkb21haW4gaGFzaCB0YWJsZQogICogQGRvbWFpbjogdGhlIGRvbWFpbiB0byByZW1vdmUKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaCBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKaW5kZXggYmZjYjY3Ni4uMDI2MWRkYSAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCkBAIC05MCw2ICs5MCwxMCBAQAogCQkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfZW50cnkoc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeSwKIAkJCSAgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfZG9taHNoX3JlbW92ZV9hZjQoY29uc3QgY2hhciAqZG9tYWluLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKm1hc2ssCisJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfZGVmYXVsdChzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqbmV0bGJsX2RvbWhzaF9nZXRlbnRyeShjb25zdCBjaGFyICpkb21haW4pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKaW5kZXggYjMyZWNlYi4uZmQ5MjI5ZCAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCkBAIC0zMSw3ICszMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9uZXRsYWJlbC5oPgogI2luY2x1ZGUgPG5ldC9jaXBzb19pcHY0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgpAQCAtNDIsNiArNDUsNyBAQAogI2luY2x1ZGUgIm5ldGxhYmVsX2NpcHNvX3Y0LmgiCiAjaW5jbHVkZSAibmV0bGFiZWxfdXNlci5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX21nbXQuaCIKKyNpbmNsdWRlICJuZXRsYWJlbF9hZGRybGlzdC5oIgogCiAvKgogICogQ29uZmlndXJhdGlvbiBGdW5jdGlvbnMKQEAgLTUwLDYgKzU0LDkgQEAKIC8qKgogICogbmV0bGJsX2NmZ19tYXBfZGVsIC0gUmVtb3ZlIGEgTmV0TGFiZWwvTFNNIGRvbWFpbiBtYXBwaW5nCiAgKiBAZG9tYWluOiB0aGUgZG9tYWluIG1hcHBpbmcgdG8gcmVtb3ZlCisgKiBAZmFtaWx5OiBhZGRyZXNzIGZhbWlseQorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtNTgsMTQgKzY1LDMyIEBACiAgKiB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBuZXRsYmxfY2ZnX21hcF9kZWwoY29uc3QgY2hhciAqZG9tYWluLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoraW50IG5ldGxibF9jZmdfbWFwX2RlbChjb25zdCBjaGFyICpkb21haW4sCisJCSAgICAgICB1MTYgZmFtaWx5LAorCQkgICAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJICAgICAgIGNvbnN0IHZvaWQgKm1hc2ssCisJCSAgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewotCXJldHVybiBuZXRsYmxfZG9taHNoX3JlbW92ZShkb21haW4sIGF1ZGl0X2luZm8pOworCWlmIChhZGRyID09IE5VTEwgJiYgbWFzayA9PSBOVUxMKSB7CisJCXJldHVybiBuZXRsYmxfZG9taHNoX3JlbW92ZShkb21haW4sIGF1ZGl0X2luZm8pOworCX0gZWxzZSBpZiAoYWRkciAhPSBOVUxMICYmIG1hc2sgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0KGRvbWFpbiwgYWRkciwgbWFzaywKKwkJCQkJCQlhdWRpdF9pbmZvKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRVBGTk9TVVBQT1JUOworCQl9CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKLSAqIG5ldGxibF9jZmdfdW5sYmxfYWRkX21hcCAtIEFkZCBhbiB1bmxhYmVsZWQgTmV0TGFiZWwvTFNNIGRvbWFpbiBtYXBwaW5nCisgKiBuZXRsYmxfY2ZnX3VubGJsX21hcF9hZGQgLSBBZGQgYSBuZXcgdW5sYWJlbGVkIG1hcHBpbmcKICAqIEBkb21haW46IHRoZSBkb21haW4gbWFwcGluZyB0byBhZGQKKyAqIEBmYW1pbHk6IGFkZHJlc3MgZmFtaWx5CisgKiBAYWRkcjogSVAgYWRkcmVzcworICogQG1hc2s6IElQIGFkZHJlc3MgbWFzawogICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CkBAIC03NCwxMSArOTksMTkgQEAKICAqIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwotaW50IG5ldGxibF9jZmdfdW5sYmxfYWRkX21hcChjb25zdCBjaGFyICpkb21haW4sCitpbnQgbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgdTE2IGZhbWlseSwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCSAgICAgY29uc3Qgdm9pZCAqbWFzaywKIAkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FTk9NRU07CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeTsKKwlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHJfbWFwICphZGRybWFwID0gTlVMTDsKKwlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqbWFwNCA9IE5VTEw7CisJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDYgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyNCwgKm1hc2s0OworCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjYsICptYXNrNjsKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCkBAIC04Niw0OSArMTE5LDIyNSBAQAogCWlmIChkb21haW4gIT0gTlVMTCkgewogCQllbnRyeS0+ZG9tYWluID0ga3N0cmR1cChkb21haW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoZW50cnktPmRvbWFpbiA9PSBOVUxMKQotCQkJZ290byBjZmdfdW5sYmxfYWRkX21hcF9mYWlsdXJlOworCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOwogCX0KLQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCisJaWYgKGFkZHIgPT0gTlVMTCAmJiBtYXNrID09IE5VTEwpCisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ7CisJZWxzZSBpZiAoYWRkciAhPSBOVUxMICYmIG1hc2sgIT0gTlVMTCkgeworCQlhZGRybWFwID0ga3phbGxvYyhzaXplb2YoKmFkZHJtYXApLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGFkZHJtYXAgPT0gTlVMTCkKKwkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJSU5JVF9MSVNUX0hFQUQoJmFkZHJtYXAtPmxpc3Q0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmFkZHJtYXAtPmxpc3Q2KTsKKworCQlzd2l0Y2ggKGZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlhZGRyNCA9IGFkZHI7CisJCQltYXNrNCA9IG1hc2s7CisJCQltYXA0ID0ga3phbGxvYyhzaXplb2YoKm1hcDQpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChtYXA0ID09IE5VTEwpCisJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJbWFwNC0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCQkJbWFwNC0+bGlzdC5hZGRyID0gYWRkcjQtPnNfYWRkciAmIG1hc2s0LT5zX2FkZHI7CisJCQltYXA0LT5saXN0Lm1hc2sgPSBtYXNrNC0+c19hZGRyOworCQkJbWFwNC0+bGlzdC52YWxpZCA9IDE7CisJCQlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZtYXA0LT5saXN0LAorCQkJCQkJICAgICAmYWRkcm1hcC0+bGlzdDQpOworCQkJaWYgKHJldF92YWwgIT0gMCkKKwkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCWFkZHI2ID0gYWRkcjsKKwkJCW1hc2s2ID0gbWFzazsKKwkJCW1hcDYgPSBremFsbG9jKHNpemVvZigqbWFwNiksIEdGUF9BVE9NSUMpOworCQkJaWYgKG1hcDQgPT0gTlVMTCkKKwkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCQltYXA2LT50eXBlID0gTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ7CisJCQlpcHY2X2FkZHJfY29weSgmbWFwNi0+bGlzdC5hZGRyLCBhZGRyNik7CisJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzBdICY9IG1hc2s2LT5zNl9hZGRyMzJbMF07CisJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzFdICY9IG1hc2s2LT5zNl9hZGRyMzJbMV07CisJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzJdICY9IG1hc2s2LT5zNl9hZGRyMzJbMl07CisJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzNdICY9IG1hc2s2LT5zNl9hZGRyMzJbM107CisJCQlpcHY2X2FkZHJfY29weSgmbWFwNi0+bGlzdC5tYXNrLCBtYXNrNik7CisJCQltYXA2LT5saXN0LnZhbGlkID0gMTsKKwkJCXJldF92YWwgPSBuZXRsYmxfYWY0bGlzdF9hZGQoJm1hcDQtPmxpc3QsCisJCQkJCQkgICAgICZhZGRybWFwLT5saXN0NCk7CisJCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJYnJlYWs7CisJCX0KKworCQllbnRyeS0+dHlwZV9kZWYuYWRkcnNlbCA9IGFkZHJtYXA7CisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUOworCX0gZWxzZSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJfQogCiAJcmV0X3ZhbCA9IG5ldGxibF9kb21oc2hfYWRkKGVudHJ5LCBhdWRpdF9pbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQotCQlnb3RvIGNmZ191bmxibF9hZGRfbWFwX2ZhaWx1cmU7CisJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKIAogCXJldHVybiAwOwogCi1jZmdfdW5sYmxfYWRkX21hcF9mYWlsdXJlOgorY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZToKIAlpZiAoZW50cnkgIT0gTlVMTCkKIAkJa2ZyZWUoZW50cnktPmRvbWFpbik7CiAJa2ZyZWUoZW50cnkpOworCWtmcmVlKGFkZHJtYXApOworCWtmcmVlKG1hcDQpOworCWtmcmVlKG1hcDYpOwogCXJldHVybiByZXRfdmFsOwogfQogCisKIC8qKgotICogbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAgLSBBZGQgYSBuZXcgQ0lQU092NCBET0kgZGVmaW5pdGlvbiBhbmQgbWFwcGluZwotICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgotICogQGRvbWFpbjogdGhlIGRvbWFpbiBtYXBwaW5nIHRvIGFkZAorICogbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfYWRkIC0gQWRkcyBhIG5ldyBzdGF0aWMgbGFiZWwKKyAqIEBuZXQ6IG5ldHdvcmsgbmFtZXNwYWNlCisgKiBAZGV2X25hbWU6IGludGVyZmFjZSBuYW1lCisgKiBAYWRkcjogSVAgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHN0cnVjdCBpbls2XV9hZGRyKQorICogQG1hc2s6IGFkZHJlc3MgbWFzayBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHN0cnVjdCBpbls2XV9hZGRyKQorICogQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKKyAqIEBzZWNpZDogTFNNIHNlY2lkIHZhbHVlIGZvciB0aGUgZW50cnkKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgotICogQWRkIGEgbmV3IENJUFNPdjQgRE9JIGRlZmluaXRpb24gYW5kIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZyBmb3IgdGhpcwotICogbmV3IERPSSBkZWZpbml0aW9uIHRvIHRoZSBOZXRMYWJlbCBzdWJzeXN0ZW0uICBBIEBkb21haW4gdmFsdWUgb2YgTlVMTCBhZGRzCi0gKiBhIG5ldyBkZWZhdWx0IGRvbWFpbiBtYXBwaW5nLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbgotICogZmFpbHVyZS4KKyAqIEFkZHMgYSBuZXcgTmV0TGFiZWwgc3RhdGljIGxhYmVsIHRvIGJlIHVzZWQgd2hlbiBwcm90b2NvbCBwcm92aWRlZCBsYWJlbHMKKyAqIGFyZSBub3QgcHJlc2VudCBvbiBpbmNvbWluZyB0cmFmZmljLiAgSWYgQGRldl9uYW1lIGlzIE5VTEwgdGhlbiB0aGUgZGVmYXVsdAorICogaW50ZXJmYWNlIHdpbGwgYmUgdXNlZC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkX21hcChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAoraW50IG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJY29uc3Qgdm9pZCAqYWRkciwKKwkJCQljb25zdCB2b2lkICptYXNrLAorCQkJCXUxNiBmYW1pbHksCisJCQkJdTMyIHNlY2lkLAorCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJdTMyIGFkZHJfbGVuOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUEZOT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIG5ldGxibF91bmxoc2hfYWRkKG5ldCwKKwkJCQkgZGV2X25hbWUsIGFkZHIsIG1hc2ssIGFkZHJfbGVuLAorCQkJCSBzZWNpZCwgYXVkaXRfaW5mbyk7Cit9CisKKy8qKgorICogbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfZGVsIC0gUmVtb3ZlcyBhbiBleGlzdGluZyBzdGF0aWMgbGFiZWwKKyAqIEBuZXQ6IG5ldHdvcmsgbmFtZXNwYWNlCisgKiBAZGV2X25hbWU6IGludGVyZmFjZSBuYW1lCisgKiBAYWRkcjogSVAgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHN0cnVjdCBpbls2XV9hZGRyKQorICogQG1hc2s6IGFkZHJlc3MgbWFzayBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHN0cnVjdCBpbls2XV9hZGRyKQorICogQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKKyAqIEBzZWNpZDogTFNNIHNlY2lkIHZhbHVlIGZvciB0aGUgZW50cnkKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVtb3ZlcyBhbiBleGlzdGluZyBOZXRMYWJlbCBzdGF0aWMgbGFiZWwgdXNlZCB3aGVuIHByb3RvY29sIHByb3ZpZGVkIGxhYmVscworICogYXJlIG5vdCBwcmVzZW50IG9uIGluY29taW5nIHRyYWZmaWMuICBJZiBAZGV2X25hbWUgaXMgTlVMTCB0aGVuIHRoZSBkZWZhdWx0CisgKiBpbnRlcmZhY2Ugd2lsbCBiZSB1c2VkLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2RlbChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJY29uc3Qgdm9pZCAqYWRkciwKKwkJCQljb25zdCB2b2lkICptYXNrLAorCQkJCXUxNiBmYW1pbHksCisJCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwl1MzIgYWRkcl9sZW47CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKKwl9CisKKwlyZXR1cm4gbmV0bGJsX3VubGhzaF9yZW1vdmUobmV0LAorCQkJCSAgICBkZXZfbmFtZSwgYWRkciwgbWFzaywgYWRkcl9sZW4sCisJCQkJICAgIGF1ZGl0X2luZm8pOworfQorCisvKioKKyAqIG5ldGxibF9jZmdfY2lwc292NF9hZGQgLSBBZGQgYSBuZXcgQ0lQU092NCBET0kgZGVmaW5pdGlvbgorICogQGRvaV9kZWY6IENJUFNPIERPSSBkZWZpbml0aW9uCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFkZCBhIG5ldyBDSVBTTyBET0kgZGVmaW5pdGlvbiBhcyBkZWZpbmVkIGJ5IEBkb2lfZGVmLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYsIGF1ZGl0X2luZm8pOworfQorCisvKioKKyAqIG5ldGxibF9jZmdfY2lwc292NF9kZWwgLSBSZW1vdmUgYW4gZXhpc3RpbmcgQ0lQU092NCBET0kgZGVmaW5pdGlvbgorICogQGRvaTogQ0lQU08gRE9JCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZSBhbiBleGlzdGluZyBDSVBTTyBET0kgZGVmaW5pdGlvbiBtYXRjaGluZyBAZG9pLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3ZvaWQgbmV0bGJsX2NmZ19jaXBzb3Y0X2RlbCh1MzIgZG9pLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCWNpcHNvX3Y0X2RvaV9yZW1vdmUoZG9pLCBhdWRpdF9pbmZvKTsKK30KKworLyoqCisgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZCAtIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBtYXBwaW5nCisgKiBAZG9pOiB0aGUgQ0lQU08gRE9JCisgKiBAZG9tYWluOiB0aGUgZG9tYWluIG1hcHBpbmcgdG8gYWRkCisgKiBAYWRkcjogSVAgYWRkcmVzcworICogQG1hc2s6IElQIGFkZHJlc3MgbWFzaworICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBBZGQgYSBuZXcgTmV0TGFiZWwvTFNNIGRvbWFpbiBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gQ0lQU08gRE9JIHRvIHRoZSBOZXRMYWJlbAorICogc3Vic3lzdGVtLiAgQSBAZG9tYWluIHZhbHVlIG9mIE5VTEwgYWRkcyBhIG5ldyBkZWZhdWx0IGRvbWFpbiBtYXBwaW5nLgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKHUzMiBkb2ksCiAJCQkgICAgICAgY29uc3QgY2hhciAqZG9tYWluLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAogCQkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWwgPSAtRU5PTUVNOwotCXUzMiBkb2k7Ci0JdTMyIGRvaV90eXBlOworCXN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWY7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeTsKLQljb25zdCBjaGFyICp0eXBlX3N0cjsKLQlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CisJc3RydWN0IG5ldGxibF9kb21hZGRyX21hcCAqYWRkcm1hcCA9IE5VTEw7CisJc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKmFkZHJpbmZvID0gTlVMTDsKIAotCWRvaSA9IGRvaV9kZWYtPmRvaTsKLQlkb2lfdHlwZSA9IGRvaV9kZWYtPnR5cGU7CisJZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKKwlpZiAoZG9pX2RlZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCkBAIC0xMzYsNTYgKzM0NSw1MiBAQAogCWlmIChkb21haW4gIT0gTlVMTCkgewogCQllbnRyeS0+ZG9tYWluID0ga3N0cmR1cChkb21haW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoZW50cnktPmRvbWFpbiA9PSBOVUxMKQotCQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmU7CisJCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKIAl9CiAKLQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfZmFpbHVyZV9yZW1vdmVfZG9pOwotCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9DSVBTT1Y0OwotCWVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0ID0gY2lwc29fdjRfZG9pX2dldGRlZihkb2kpOwotCWlmIChlbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9PSBOVUxMKSB7Ci0JCXJldF92YWwgPSAtRU5PRU5UOwotCQlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfZmFpbHVyZV9yZW1vdmVfZG9pOworCWlmIChhZGRyID09IE5VTEwgJiYgbWFzayA9PSBOVUxMKSB7CisJCWVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0ID0gZG9pX2RlZjsKKwkJZW50cnktPnR5cGUgPSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ7CisJfSBlbHNlIGlmIChhZGRyICE9IE5VTEwgJiYgbWFzayAhPSBOVUxMKSB7CisJCWFkZHJtYXAgPSBremFsbG9jKHNpemVvZigqYWRkcm1hcCksIEdGUF9BVE9NSUMpOworCQlpZiAoYWRkcm1hcCA9PSBOVUxMKQorCQkJZ290byBjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0NCk7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0Nik7CisKKwkJYWRkcmluZm8gPSBremFsbG9jKHNpemVvZigqYWRkcmluZm8pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGFkZHJpbmZvID09IE5VTEwpCisJCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKKwkJYWRkcmluZm8tPnR5cGVfZGVmLmNpcHNvdjQgPSBkb2lfZGVmOworCQlhZGRyaW5mby0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKKwkJYWRkcmluZm8tPmxpc3QuYWRkciA9IGFkZHItPnNfYWRkciAmIG1hc2stPnNfYWRkcjsKKwkJYWRkcmluZm8tPmxpc3QubWFzayA9IG1hc2stPnNfYWRkcjsKKwkJYWRkcmluZm8tPmxpc3QudmFsaWQgPSAxOworCQlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZhZGRyaW5mby0+bGlzdCwgJmFkZHJtYXAtPmxpc3Q0KTsKKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCWdvdG8gY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOworCisJCWVudHJ5LT50eXBlX2RlZi5hZGRyc2VsID0gYWRkcm1hcDsKKwkJZW50cnktPnR5cGUgPSBORVRMQkxfTkxUWVBFX0FERFJTRUxFQ1Q7CisJfSBlbHNlIHsKKwkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCWdvdG8gY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOwogCX0KKwogCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX2FkZChlbnRyeSwgYXVkaXRfaW5mbyk7CiAJaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVsZWFzZV9kb2k7CisJCWdvdG8gY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOwogCi1jZmdfY2lwc292NF9hZGRfbWFwX3JldHVybjoKLQlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0FERCwKLQkJCQkJICAgICAgYXVkaXRfaW5mbyk7Ci0JaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7Ci0JCXN3aXRjaCAoZG9pX3R5cGUpIHsKLQkJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6Ci0JCQl0eXBlX3N0ciA9ICJ0cmFucyI7Ci0JCQlicmVhazsKLQkJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKLQkJCXR5cGVfc3RyID0gInBhc3MiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX0xPQ0FMOgotCQkJdHlwZV9zdHIgPSAibG9jYWwiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0eXBlX3N0ciA9ICIodW5rbm93bikiOwotCQl9Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJCSAiIGNpcHNvX2RvaT0ldSBjaXBzb190eXBlPSVzIHJlcz0ldSIsCi0JCQkJIGRvaSwgdHlwZV9zdHIsIHJldF92YWwgPT0gMCA/IDEgOiAwKTsKLQkJYXVkaXRfbG9nX2VuZChhdWRpdF9idWYpOwotCX0KKwlyZXR1cm4gMDsKIAotCXJldHVybiByZXRfdmFsOwotCi1jZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVsZWFzZV9kb2k6CitjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU6CiAJY2lwc29fdjRfZG9pX3B1dGRlZihkb2lfZGVmKTsKLWNmZ19jaXBzb3Y0X2FkZF9tYXBfZmFpbHVyZV9yZW1vdmVfZG9pOgotCWNpcHNvX3Y0X2RvaV9yZW1vdmUoZG9pLCBhdWRpdF9pbmZvKTsKLWNmZ19jaXBzb3Y0X2FkZF9tYXBfZmFpbHVyZToKIAlpZiAoZW50cnkgIT0gTlVMTCkKIAkJa2ZyZWUoZW50cnktPmRvbWFpbik7CiAJa2ZyZWUoZW50cnkpOwotCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9yZXR1cm47CisJa2ZyZWUoYWRkcm1hcCk7CisJa2ZyZWUoYWRkcmluZm8pOworCXJldHVybiByZXRfdmFsOwogfQogCiAvKgpAQCAtNjkxLDYgKzg5NiwyOCBAQAogfQogCiAvKgorICogUHJvdG9jb2wgRW5naW5lIEZ1bmN0aW9ucworICovCisKKy8qKgorICogbmV0bGJsX2F1ZGl0X3N0YXJ0IC0gU3RhcnQgYW4gYXVkaXQgbWVzc2FnZQorICogQHR5cGU6IGF1ZGl0IG1lc3NhZ2UgdHlwZQorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBTdGFydCBhbiBhdWRpdCBtZXNzYWdlIHVzaW5nIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBAdHlwZSBhbmQgZmlsbCB0aGUgYXVkaXQKKyAqIG1lc3NhZ2Ugd2l0aCBzb21lIGZpZWxkcyBjb21tb24gdG8gYWxsIE5ldExhYmVsIGF1ZGl0IG1lc3NhZ2VzLiAgVGhpcworICogZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwcm90b2NvbCBlbmdpbmVzLCBub3QgTFNNcy4gIFJldHVybnMgYQorICogcG9pbnRlciB0byB0aGUgYXVkaXQgYnVmZmVyIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0cnVjdCBhdWRpdF9idWZmZXIgKm5ldGxibF9hdWRpdF9zdGFydChpbnQgdHlwZSwKKwkJCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm4gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbih0eXBlLCBhdWRpdF9pbmZvKTsKK30KKworLyoKICAqIFNldHVwIEZ1bmN0aW9ucwogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwppbmRleCA4YzAzMDgwLi5mM2M1YzY4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCkBAIC00NTAsMTMgKzQ1MCwxMyBAQAogICogc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF91bmxoc2hfYWRkKHN0cnVjdCBuZXQgKm5ldCwKLQkJCSAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkgICAgIGNvbnN0IHZvaWQgKmFkZHIsCi0JCQkgICAgIGNvbnN0IHZvaWQgKm1hc2ssCi0JCQkgICAgIHUzMiBhZGRyX2xlbiwKLQkJCSAgICAgdTMyIHNlY2lkLAotCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoraW50IG5ldGxibF91bmxoc2hfYWRkKHN0cnVjdCBuZXQgKm5ldCwKKwkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCSAgICAgIGNvbnN0IHZvaWQgKm1hc2ssCisJCSAgICAgIHUzMiBhZGRyX2xlbiwKKwkJICAgICAgdTMyIHNlY2lkLAorCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsOwogCWludCBpZmluZGV4OwpAQCAtNzIwLDEyICs3MjAsMTIgQEAKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLXN0YXRpYyBpbnQgbmV0bGJsX3VubGhzaF9yZW1vdmUoc3RydWN0IG5ldCAqbmV0LAotCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCWNvbnN0IHZvaWQgKmFkZHIsCi0JCQkJY29uc3Qgdm9pZCAqbWFzaywKLQkJCQl1MzIgYWRkcl9sZW4sCi0JCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK2ludCBuZXRsYmxfdW5saHNoX3JlbW92ZShzdHJ1Y3QgbmV0ICpuZXQsCisJCQkgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkgY29uc3Qgdm9pZCAqYWRkciwKKwkJCSBjb25zdCB2b2lkICptYXNrLAorCQkJIHUzMiBhZGRyX2xlbiwKKwkJCSBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmgKaW5kZXggMDZiMTMwMS4uN2FiYTYzNSAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuaApAQCAtMjIxLDYgKzIyMSwyMSBAQAogLyogR2VuZXJhbCBVbmxhYmVsZWQgaW5pdCBmdW5jdGlvbiAqLwogaW50IG5ldGxibF91bmxhYmVsX2luaXQodTMyIHNpemUpOwogCisvKiBTdGF0aWMvRmFsbGJhY2sgbGFiZWwgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK2ludCBuZXRsYmxfdW5saHNoX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICB1MzIgYWRkcl9sZW4sCisJCSAgICAgIHUzMiBzZWNpZCwKKwkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX3VubGhzaF9yZW1vdmUoc3RydWN0IG5ldCAqbmV0LAorCQkJIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgY29uc3Qgdm9pZCAqbWFzaywKKwkJCSB1MzIgYWRkcl9sZW4sCisJCQkgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CisKIC8qIFByb2Nlc3MgVW5sYWJlbGVkIGluY29taW5nIG5ldHdvcmsgcGFja2V0cyAqLwogaW50IG5ldGxibF91bmxhYmVsX2dldGF0dHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgIHUxNiBmYW1pbHksCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Zpcm13YXJlX2NsYXNzL2Zpcm13YXJlX3NhbXBsZV9kcml2ZXIuYyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCmluZGV4IDExMTE0ZjMuLjIxOWEyOTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCisrKyBiL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJICAgICAgICIgcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkXG4iKTsKIH0KIAotc3RhdGljIGludCBzYW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2FtcGxlX2luaXQodm9pZCkKIHsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZ2hvc3RfZGV2aWNlKTsKIAkvKiBzaW5jZSB0aGVyZSBpcyBubyByZWFsIGhhcmR3YXJlIGluc2VydGlvbiBJIGp1c3QgY2FsbCB0aGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYyBiL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYwppbmRleCAwOGQwZDNmLi44ZDliNTVhIDEwMDY0NAotLS0gYS9zYW1wbGVzL2tvYmplY3Qva29iamVjdC1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpleGFtcGxlX2tvYmo7CiAKLXN0YXRpYyBpbnQgZXhhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBleGFtcGxlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlrb2JqZWN0X3B1dChleGFtcGxlX2tvYmopOwogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jIGIvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jCmluZGV4IDczOTVjMGIuLjQ1YjdkNTYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva29iamVjdC9rc2V0LWV4YW1wbGUuYworKysgYi9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCWtvYmplY3RfcHV0KCZmb28tPmtvYmopOwogfQogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJLyoKIAkgKiBDcmVhdGUgYSBrc2V0IHdpdGggdGhlIG5hbWUgb2YgImtzZXRfZXhhbXBsZSIsCkBAIC0yNjQsNyArMjY0LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHZvaWQgZXhhbXBsZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhhbXBsZV9leGl0KHZvaWQpCiB7CiAJZGVzdHJveV9mb29fb2JqKGJhel9vYmopOwogCWRlc3Ryb3lfZm9vX29iaihiYXJfb2JqKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvbWFya2Vycy9tYXJrZXItZXhhbXBsZS5jIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKaW5kZXggZTkwZGM1ZC4uZTljZDljMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAkub3BlbiA9IG15X29wZW4sCiB9OwogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQgImV4YW1wbGUgaW5pdFxuIik7CiAJcGVudHJ5X2V4YW1wbGUgPSBwcm9jX2NyZWF0ZSgibWFya2VyLWV4YW1wbGUiLCAwNDQ0LCBOVUxMLCAmbWFya19vcHMpOwpAQCAtMzksNyArMzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9BTEVSVCAiZXhhbXBsZSBleGl0XG4iKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgibWFya2VyLWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYwppbmRleCBlM2E5NjQ4Li45ZTYwZWI2IDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRXZlbnQgQiBpcyBlbmNvdW50ZXJlZFxuIik7CiB9CiAKLWludCBfX2luaXQgdHBfc2FtcGxlX3RyYWNlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIApAQCAtNDIsNyArNDIsNyBAQAogCiBtb2R1bGVfaW5pdCh0cF9zYW1wbGVfdHJhY2VfaW5pdCk7CiAKLXZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBfc2FtcGxlX3RyYWNlX2V4aXQodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3RyYWNlX3N1YnN5c19ldmVudGIocHJvYmVfc3Vic3lzX2V2ZW50Yik7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlMi5jCmluZGV4IDY4NWE1YWMuLmJlMmE5NjAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZTIuYwpAQCAtMTgsNyArMTgsNyBAQAogCQlpbm9kZS0+aV9pbm8pOwogfQogCi1pbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB0cF9zYW1wbGVfdHJhY2VfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKQEAgLTMwLDcgKzMwLDcgQEAKIAogbW9kdWxlX2luaXQodHBfc2FtcGxlX3RyYWNlX2luaXQpOwogCi12b2lkIF9fZXhpdCB0cF9zYW1wbGVfdHJhY2VfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl90cmFjZV9zdWJzeXNfZXZlbnQocHJvYmVfc3Vic3lzX2V2ZW50KTsKIAl0cmFjZXBvaW50X3N5bmNocm9uaXplX3VucmVnaXN0ZXIoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYwppbmRleCAwMGQxNjk3Li42OGQ1ZGMwIDEwMDY0NAotLS0gYS9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtc2FtcGxlLmMKKysrIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jCkBAIC0zMiw3ICszMiw3IEBACiAJLm9wZW4gPSBteV9vcGVuLAogfTsKIAotc3RhdGljIGludCBleGFtcGxlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGV4YW1wbGVfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGluaXRcbiIpOwogCXBlbnRyeV9leGFtcGxlID0gcHJvY19jcmVhdGUoInRyYWNlcG9pbnQtZXhhbXBsZSIsIDA0NDQsIE5VTEwsCkBAIC00Miw3ICs0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4YW1wbGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV4YW1wbGVfZXhpdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGV4aXRcbiIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFjZXBvaW50LWV4YW1wbGUiLCBOVUxMKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCBmODhiYjNlLi43YmVkNGVkIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0xLDcgKzEsOCBAQAogIyEvdXNyL2Jpbi9wZXJsIC13CiAjIChjKSAyMDAxLCBEYXZlIEpvbmVzLiA8ZGF2ZWpAcmVkaGF0LmNvbT4gKHRoZSBmaWxlIGhhbmRsaW5nIGJpdCkKICMgKGMpIDIwMDUsIEpvZWwgU2Nob3BwIDxqc2Nob3BwQGF1c3Rpbi5pYm0uY29tPiAodGhlIHVnbHkgYml0KQotIyAoYykgMjAwNywgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUsIGV0YykKKyMgKGMpIDIwMDcsMjAwOCwgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUpCisjIChjKSAyMDA4LCBBbmR5IFdoaXRjcm9mdCA8YXB3QGNhbm9uaWNhbC5jb20+CiAjIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMgogCiB1c2Ugc3RyaWN0OwpAQCAtOSw3ICsxMCw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMjQnOworbXkgJFYgPSAnMC4yNic7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTY4LDcgKzY5LDkgQEAKIG15ICRkYmdfdHlwZSA9IDA7CiBteSAkZGJnX2F0dHIgPSAwOwogZm9yIG15ICRrZXkgKGtleXMgJWRlYnVnKSB7Ci0JZXZhbCAiXCR7ZGJnXyRrZXl9ID0gJyRkZWJ1Z3ska2V5fSc7IgorCSMjIG5vIGNyaXRpYworCWV2YWwgIlwke2RiZ18ka2V5fSA9ICckZGVidWd7JGtleX0nOyI7CisJZGllICIkQCIgaWYgKCRAKTsKIH0KIAogaWYgKCR0ZXJzZSkgewpAQCAtMTE2LDcgKzExOSw4IEBACiAJCQlfXyg/Om1lbXxjcHV8ZGV2fCkoPzppbml0ZGF0YXxpbml0KXwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZHwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXB8Ci0JCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wCisJCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wfAorCQkJX193ZWFrCiAJCSAgfXg7CiBvdXIgJE1vZGlmaWVyOwogb3VyICRJbmxpbmUJPSBxcntpbmxpbmV8X19hbHdheXNfaW5saW5lfG5vaW5saW5lfTsKQEAgLTEyNSw2ICsxMjksNyBAQAogCiBvdXIgJENvbnN0YW50CT0gcXJ7KD86WzAtOV0rfDB4WzAtOWEtZkEtRl0rKVtVTF0qfTsKIG91ciAkQXNzaWdubWVudAk9IHFyeyg/OlwqXD18Lz18JT18XCs9fC09fDw8PXw+Pj18Jj18XF49fFx8PXw9KX07CitvdXIgJENvbXBhcmUgICAgPSBxcns8PXw+PXw9PXwhPXw8fD59Owogb3VyICRPcGVyYXRvcnMJPSBxcnsKIAkJCTw9fD49fD09fCE9fAogCQkJPT58LT58PDx8Pj58PHw+fCF8fnwKQEAgLTE5MCw3ICsxOTUsNyBAQAogCQkgIH14OwogCSRUeXBlCT0gcXJ7CiAJCQkkTm9ucHRyVHlwZQotCQkJKD86XHMqXCorXHMqY29uc3R8XHMqXCorfCg/OlxzKlxbXHMqXF0pKyk/CisJCQkoPzpbXHNcKl0rXHMqY29uc3R8W1xzXCpdK3woPzpccypcW1xzKlxdKSspPwogCQkJKD86XHMrJElubGluZXxccyskTW9kaWZpZXIpKgogCQkgIH14OwogCSREZWNsYXJlCT0gcXJ7KD86JFN0b3JhZ2VccyspPyRUeXBlfTsKQEAgLTIwMyw5ICsyMDgsOSBAQAogbXkgQGRlcF9mdW5jdGlvbnMgPSAoKTsKIG15ICRyZW1vdmFsID0gIkRvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCI7CiBpZiAoJHRyZWUgJiYgLWYgIiRyb290LyRyZW1vdmFsIikgewotCW9wZW4oUkVNT1ZFLCAiPCRyb290LyRyZW1vdmFsIikgfHwKKwlvcGVuKG15ICRSRU1PVkUsICc8JywgIiRyb290LyRyZW1vdmFsIikgfHwKIAkJCQlkaWUgIiRQOiAkcmVtb3ZhbDogb3BlbiBmYWlsZWQgLSAkIVxuIjsKLQl3aGlsZSAoPFJFTU9WRT4pIHsKKwl3aGlsZSAoPCRSRU1PVkU+KSB7CiAJCWlmICgvXkNoZWNrOlxzKyguKlxTKS8pIHsKIAkJCWZvciBteSAkZW50cnkgKHNwbGl0KC9bLCBdKy8sICQxKSkgewogCQkJCWlmICgkZW50cnkgPX4gbUBpbmNsdWRlLyguKilAKSB7CkBAIC0yMTcsMTcgKzIyMiwyMSBAQAogCQkJfQogCQl9CiAJfQorCWNsb3NlKCRSRU1PVkUpOwogfQogCiBteSBAcmF3bGluZXMgPSAoKTsKIG15IEBsaW5lcyA9ICgpOwogbXkgJHZuYW1lOwogZm9yIG15ICRmaWxlbmFtZSAoQEFSR1YpIHsKKwlteSAkRklMRTsKIAlpZiAoJGZpbGUpIHsKLQkJb3BlbihGSUxFLCAiZGlmZiAtdSAvZGV2L251bGwgJGZpbGVuYW1lfCIpIHx8CisJCW9wZW4oJEZJTEUsICctfCcsICJkaWZmIC11IC9kZXYvbnVsbCAkZmlsZW5hbWUiKSB8fAogCQkJZGllICIkUDogJGZpbGVuYW1lOiBkaWZmIGZhaWxlZCAtICQhXG4iOworCX0gZWxzaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKKwkJb3BlbigkRklMRSwgJzwmU1RESU4nKTsKIAl9IGVsc2UgewotCQlvcGVuKEZJTEUsICI8JGZpbGVuYW1lIikgfHwKKwkJb3BlbigkRklMRSwgJzwnLCAiJGZpbGVuYW1lIikgfHwKIAkJCWRpZSAiJFA6ICRmaWxlbmFtZTogb3BlbiBmYWlsZWQgLSAkIVxuIjsKIAl9CiAJaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKQEAgLTIzNSwxMSArMjQ0LDExIEBACiAJfSBlbHNlIHsKIAkJJHZuYW1lID0gJGZpbGVuYW1lOwogCX0KLQl3aGlsZSAoPEZJTEU+KSB7CisJd2hpbGUgKDwkRklMRT4pIHsKIAkJY2hvbXA7CiAJCXB1c2goQHJhd2xpbmVzLCAkXyk7CiAJfQotCWNsb3NlKEZJTEUpOworCWNsb3NlKCRGSUxFKTsKIAlpZiAoIXByb2Nlc3MoJGZpbGVuYW1lKSkgewogCQkkZXhpdCA9IDE7CiAJfQpAQCAtMzY2LDcgKzM3NSw3IEBACiAJCQl9CiAJCX0KIAotCQkjcHJpbnQgIlNROiRzYW5pdGlzZV9xdW90ZVxuIjsKKwkJI3ByaW50ICJjPCRjPiBTUTwkc2FuaXRpc2VfcXVvdGU+XG4iOwogCQlpZiAoJG9mZiAhPSAwICYmICRzYW5pdGlzZV9xdW90ZSBlcSAnKi8nICYmICRjIG5lICJcdCIpIHsKIAkJCXN1YnN0cigkcmVzLCAkb2ZmLCAxLCAkOyk7CiAJCX0gZWxzaWYgKCRvZmYgIT0gMCAmJiAkc2FuaXRpc2VfcXVvdGUgJiYgJGMgbmUgIlx0IikgewpAQCAtNDAyLDYgKzQxMSw3IEBACiAKIAlteSAkdHlwZSA9ICcnOwogCW15ICRsZXZlbCA9IDA7CisJbXkgQHN0YWNrID0gKFskdHlwZSwgJGxldmVsXSk7CiAJbXkgJHA7CiAJbXkgJGM7CiAJbXkgJGxlbiA9IDA7CkBAIC00MzMsNiArNDQzLDE2IEBACiAJCSRyZW1haW5kZXIgPSBzdWJzdHIoJGJsaywgJG9mZik7CiAKIAkJI3dhcm4gIkNTQjogYzwkYz4gdHlwZTwkdHlwZT4gbGV2ZWw8JGxldmVsPiByZW1haW5kZXI8JHJlbWFpbmRlcj4gY29mZl9zZXQ8JGNvZmZfc2V0PlxuIjsKKworCQkjIEhhbmRsZSBuZXN0ZWQgI2lmLyNlbHNlLgorCQlpZiAoJHJlbWFpbmRlciA9fiAvXiNccyooPzppZm5kZWZ8aWZkZWZ8aWYpXHMvKSB7CisJCQlwdXNoKEBzdGFjaywgWyAkdHlwZSwgJGxldmVsIF0pOworCQl9IGVsc2lmICgkcmVtYWluZGVyID1+IC9eI1xzKig/OmVsc2V8ZWxpZilcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7JHN0YWNrWyQjc3RhY2sgLSAxXX07CisJCX0gZWxzaWYgKCRyZW1haW5kZXIgPX4gL14jXHMqZW5kaWZcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7cG9wKEBzdGFjayl9OworCQl9CisKIAkJIyBTdGF0ZW1lbnQgZW5kcyBhdCB0aGUgJzsnIG9yIGEgY2xvc2UgJ30nIGF0IHRoZQogCQkjIG91dGVybW9zdCBsZXZlbC4KIAkJaWYgKCRsZXZlbCA9PSAwICYmICRjIGVxICc7JykgewpAQCAtNTc5LDExICs1OTksMjIgQEAKIAlteSBAcmVzID0gKCk7CiAKIAlteSAkbGV2ZWwgPSAwOworCW15IEBzdGFjayA9ICgkbGV2ZWwpOwogCWZvciAoJGxpbmUgPSAkc3RhcnQ7ICRyZW1haW4gPiAwOyAkbGluZSsrKSB7CiAJCW5leHQgaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14tLyk7CiAJCSRyZW1haW4tLTsKIAogCQkkYmxrIC49ICRyYXdsaW5lc1skbGluZV07CisKKwkJIyBIYW5kbGUgbmVzdGVkICNpZi8jZWxzZS4KKwkJaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14uXHMqI1xzKig/OmlmbmRlZnxpZmRlZnxpZilccy8pIHsKKwkJCXB1c2goQHN0YWNrLCAkbGV2ZWwpOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyooPzplbHNlfGVsaWYpXGIvKSB7CisJCQkkbGV2ZWwgPSAkc3RhY2tbJCNzdGFjayAtIDFdOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyplbmRpZlxiLykgeworCQkJJGxldmVsID0gcG9wKEBzdGFjayk7CisJCX0KKwogCQlmb3JlYWNoIG15ICRjIChzcGxpdCgvLywgJHJhd2xpbmVzWyRsaW5lXSkpIHsKIAkJCSMjcHJpbnQgIkM8JGM+TDwkbGV2ZWw+PCRvcGVuJGNsb3NlPk88JG9mZj5cbiI7CiAJCQlpZiAoJG9mZiA+IDApIHsKQEAgLTg0MywxMSArODc0LDExIEBACiAJCQkkdHlwZSA9ICdWJzsKIAkJCSRhdl9wZW5kaW5nID0gJ1YnOwogCi0JCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50XHMqKTovKSB7Ci0JCQlpZiAoJHR5cGUgZXEgJ0UnKSB7Ci0JCQkJJGF2X3BlbmRfY29sb24gPSAnTCc7Ci0JCQl9IGVsc2lmICgkdHlwZSBlcSAnVCcpIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXigkSWRlbnRccyopOig/OlxzKlxkK1xzKigsfD18OykpPy8pIHsKKwkJCWlmIChkZWZpbmVkICQyICYmICR0eXBlIGVxICdDJyB8fCAkdHlwZSBlcSAnVCcpIHsKIAkJCQkkYXZfcGVuZF9jb2xvbiA9ICdCJzsKKwkJCX0gZWxzaWYgKCR0eXBlIGVxICdFJykgeworCQkJCSRhdl9wZW5kX2NvbG9uID0gJ0wnOwogCQkJfQogCQkJcHJpbnQgIklERU5UX0NPTE9OKCQxLCR0eXBlPiRhdl9wZW5kX2NvbG9uKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ1YnOwpAQCAtODY1LDYgKzg5NiwxMCBAQAogCQkJJHR5cGUgPSAnRSc7CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAorCQl9IGVsc2lmICgkY3VyID1+L14oLCkvKSB7CisJCQlwcmludCAiQ09NTUEoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOworCQkJJHR5cGUgPSAnQyc7CisKIAkJfSBlbHNpZiAoJGN1ciA9fiAvXihcPykvbykgewogCQkJcHJpbnQgIlFVRVNUSU9OKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwpAQCAtODgwLDcgKzkxNSw3IEBACiAJCQl9CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKDt8XFspL28pIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXihcWykvbykgewogCQkJcHJpbnQgIkNMT1NFKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCkBAIC0xMDUxLDYgKzEwODYsNyBAQAogCW15ICRpbl9jb21tZW50ID0gMDsKIAlteSAkY29tbWVudF9lZGdlID0gMDsKIAlteSAkZmlyc3RfbGluZSA9IDA7CisJbXkgJHAxX3ByZWZpeCA9ICcnOwogCiAJbXkgJHByZXZfdmFsdWVzID0gJ0UnOwogCkBAIC0xMDk3LDkgKzExMzMsMTIgQEAKIAkJCQkJICRyYXdsaW5lc1skbG4gLSAxXSA9fiAvXi0vKTsKIAkJCQkkY250LS07CiAJCQkJI3ByaW50ICJSQVc8JHJhd2xpbmVzWyRsbiAtIDFdPlxuIjsKLQkJCQkoJGVkZ2UpID0gKGRlZmluZWQgJHJhd2xpbmVzWyRsbiAtIDFdICYmCi0JCQkJCSRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUApOwotCQkJCWxhc3QgaWYgKGRlZmluZWQgJGVkZ2UpOworCQkJCWxhc3QgaWYgKCFkZWZpbmVkICRyYXdsaW5lc1skbG4gLSAxXSk7CisJCQkJaWYgKCRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUAgJiYKKwkJCQkgICAgJHJhd2xpbmVzWyRsbiAtIDFdICF+IG1AIlteIl0qKD86L1wqfFwqLylbXiJdKiJAKSB7CisJCQkJCSgkZWRnZSkgPSAkMTsKKwkJCQkJbGFzdDsKKwkJCQl9CiAJCQl9CiAJCQlpZiAoZGVmaW5lZCAkZWRnZSAmJiAkZWRnZSBlcSAnKi8nKSB7CiAJCQkJJGluX2NvbW1lbnQgPSAxOwpAQCAtMTEwOSw3ICsxMTQ4LDcgQEAKIAkJCSMgaXMgdGhlIHN0YXJ0IG9mIGEgZGlmZiBibG9jayBhbmQgdGhpcyBsaW5lIHN0YXJ0cwogCQkJIyAnIConIHRoZW4gaXQgaXMgdmVyeSBsaWtlbHkgYSBjb21tZW50LgogCQkJaWYgKCFkZWZpbmVkICRlZGdlICYmCi0JCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyogXCooPzpcc3wkKUApCisJCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyooPzpcKlwqK3wgXCopKD86XHN8JClAKQogCQkJewogCQkJCSRpbl9jb21tZW50ID0gMTsKIAkJCX0KQEAgLTExOTYsNyArMTIzNSwxMiBAQAogCQkjIGV4dHJhY3QgdGhlIGZpbGVuYW1lIGFzIGl0IHBhc3NlcwogCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKLQkJCSRyZWFsZmlsZSA9fiBzQF5bXi9dKi9AQDsKKwkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOworCisJCQkkcDFfcHJlZml4ID0gJDE7CisJCQlpZiAoJHRyZWUgJiYgJHAxX3ByZWZpeCBuZSAnJyAmJiAtZSAiJHJvb3QvJHAxX3ByZWZpeCIpIHsKKwkJCQlXQVJOKCJwYXRjaCBwcmVmaXggJyRwMV9wcmVmaXgnIGV4aXN0cywgYXBwZWFycyB0byBiZSBhIC1wMCBwYXRjaFxuIik7CisJCQl9CiAKIAkJCWlmICgkcmVhbGZpbGUgPX4gbUBeaW5jbHVkZS9hc20vQCkgewogCQkJCUVSUk9SKCJkbyBub3QgbW9kaWZ5IGZpbGVzIGluIGluY2x1ZGUvYXNtLCBjaGFuZ2UgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzIGluIGluY2x1ZGUvYXNtLTxhcmNoaXRlY3R1cmU+XG4iIC4gIiRoZXJlJHJhd2xpbmVcbiIpOwpAQCAtMTMzNiw3ICsxMzgwLDcgQEAKIAkJCX0KIAogCQkJIyBhbnkgKGZvbyAuLi4gKikgaXMgYSBwb2ludGVyIGNhc3QsIGFuZCBmb28gaXMgYSB0eXBlCi0JCQl3aGlsZSAoJHMgPX4gL1woKCRJZGVudCkoPzpccyskU3BhcnNlKSpccypcKitccypcKS9zZykgeworCQkJd2hpbGUgKCRzID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqW1xzXCpdK1xzKlwpL3NnKSB7CiAJCQkJcG9zc2libGUoJDEsICJDOiIgLiAkcyk7CiAJCQl9CiAKQEAgLTE1OTQsNyArMTYzOCw3IEBACiAJCQkJJGhlcmVjdXJyKTsKIAkJfQogIyBjaGVjayBmb3Igc3RhdGljIGluaXRpYWxpc2Vycy4KLQkJaWYgKCRsaW5lID1+IC9ccypzdGF0aWNccy4qPVxzKigwfE5VTEx8ZmFsc2UpXHMqOy8pIHsKKwkJaWYgKCRsaW5lID1+IC9cYnN0YXRpY1xzLio9XHMqKDB8TlVMTHxmYWxzZSlccyo7LykgewogCQkJRVJST1IoImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CkBAIC0xNjAyLDcgKzE2NDYsNyBAQAogIyBjaGVjayBmb3IgbmV3IHR5cGVkZWZzLCBvbmx5IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHNwYXJzZSBhbm5vdGF0aW9ucwogIyBtYWtlIHNlbnNlLgogCQlpZiAoJGxpbmUgPX4gL1xidHlwZWRlZlxzLyAmJgotCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgorCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMqXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrJElkZW50XHMqXCgvICYmCiAJCSAgICAkbGluZSAhfiAvXGIkdHlwZVR5cGVkZWZzXGIvICYmCiAJCSAgICAkbGluZSAhfiAvXGJfX2JpdHdpc2UoPzpfX3wpXGIvKSB7CkBAIC0xNjEwLDIxICsxNjU0LDM5IEBACiAJCX0KIAogIyAqIGdvZXMgb24gdmFyaWFibGUgbm90IG9uIHR5cGUKLQkJaWYgKCRsaW5lID1+IG17XCgkTm9ucHRyVHlwZShcKispKD86XHMrY29uc3QpP1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCSMgKGNoYXIqWyBjb25zdF0pCisJCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXHMqXCpbXHNcKl0qKD86JE1vZGlmaWVyXHMqKSopXCl9KSB7CisJCQlteSAoJGZyb20sICR0bykgPSAoJDEsICQxKTsKIAotCQl9IGVsc2lmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyAkMSApXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQogCi0JCX0gZWxzaWYgKCRsaW5lID1+IG17XGIkTm9ucHRyVHlwZShcKispKD86XHMrKD86JEF0dHJpYnV0ZXwkU3BhcnNlKSk/XHMrW0EtWmEtelxkX10rfSkgewotCQkJRVJST1IoIlwiZm9vJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCQkjcHJpbnQgImZyb208JGZyb20+IHRvPCR0bz5cbiI7CisJCQlpZiAoJGZyb20gbmUgJHRvKSB7CisJCQkJRVJST1IoIlwiKGZvbyRmcm9tKVwiIHNob3VsZCBiZSBcIihmb28kdG8pXCJcbiIgLiAgJGhlcmVjdXJyKTsKKwkJCX0KKwkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlKFxzKlwqW1xzXCpdKig/OiRNb2RpZmllclxzKik/KSgkSWRlbnQpfSkgeworCQkJbXkgKCRmcm9tLCAkdG8sICRpZGVudCkgPSAoJDEsICQxLCAkMik7CiAKLQkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlXHMrKFwqKykoPyFccysoPzokQXR0cmlidXRlfCRTcGFyc2UpKVxzK1tBLVphLXpcZF9dK30pIHsKLQkJCUVSUk9SKCJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQorCQkJIyBNb2RpZmllcnMgc2hvdWxkIGhhdmUgc3BhY2VzLgorCQkJJHRvID1+IHMvKFxiJE1vZGlmaWVyJCkvJDEgLzsKKworCQkJI3ByaW50ICJmcm9tPCRmcm9tPiB0bzwkdG8+XG4iOworCQkJaWYgKCRmcm9tIG5lICR0bykgeworCQkJCUVSUk9SKCJcImZvbyR7ZnJvbX1iYXJcIiBzaG91bGQgYmUgXCJmb28ke3RvfWJhclwiXG4iIC4gICRoZXJlY3Vycik7CisJCQl9CiAJCX0KIAogIyAjIG5vIEJVRygpIG9yIEJVR19PTigpCkBAIC0xNzU5LDcgKzE4MjEsNyBAQAogCQkJCQkkYyA9ICdDJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14kOy8pOwogCQkJCQkkYyA9ICdCJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14oXCl8XF18OykvKTsKIAkJCQkJJGMgPSAnTycgaWYgKCRlbGVtZW50c1skbiArIDJdIGVxICcnKTsKLQkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9ccypcXCQvKTsKKwkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9eXHMqXFwkLyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJJGMgPSAnRSc7CiAJCQkJfQpAQCAtMTk1MCw5ICsyMDEyLDkgQEAKIAkJCW15ICRzcGFjaW5nID0gJDE7CiAJCQlteSAkdmFsdWUgPSAkMjsKIAotCQkJIyBGbGF0dGVuIGFueSBwYXJlbnRoZXNlcyBhbmQgYnJhY2VzCisJCQkjIEZsYXR0ZW4gYW55IHBhcmVudGhlc2VzCiAJCQkkdmFsdWUgPX4gcy9cKVwoL1wpIFwoL2c7Ci0JCQl3aGlsZSAoJHZhbHVlID1+IHMvXChbXlwoXCldKlwpLzEvKSB7CisJCQl3aGlsZSAoJHZhbHVlICF+IC8oPzokSWRlbnR8LT8kQ29uc3RhbnQpXHMqJENvbXBhcmVccyooPzokSWRlbnR8LT8kQ29uc3RhbnQpLyAmJiAkdmFsdWUgPX4gcy9cKFteXChcKV0qXCkvMS8pIHsKIAkJCX0KIAogCQkJaWYgKCR2YWx1ZSA9fiAvXig/OiRJZGVudHwtPyRDb25zdGFudCkkLykgewpAQCAtMTk5Miw3ICsyMDU0LDcgQEAKIAkJICAgICRsaW5lID1+IC9cYig/OmlmfHdoaWxlfGZvcilccypcKC8gJiYgJGxpbmUgIX4gL14uXHMqIy8pIHsKIAkJCW15ICgkcywgJGMpID0gKCRzdGF0LCAkY29uZCk7CiAKLQkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi8pIHsKKwkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi9zKSB7CiAJCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCkBAIC0yMTY3LDkgKzIyMjksMTAgQEAKIAkJCQlNT0RVTEVfUEFSQU1fREVTQ3wKIAkJCQlERUNMQVJFX1BFUl9DUFV8CiAJCQkJREVGSU5FX1BFUl9DUFV8Ci0JCQkJX190eXBlb2ZfX1woCisJCQkJX190eXBlb2ZfX1wofAorCQkJCVwuJElkZW50XHMqPVxzKgogCQkJfXg7Ci0JCQkjcHJpbnQgIlJFU1Q8JHJlc3Q+XG4iOworCQkJI3ByaW50ICJSRVNUPCRyZXN0PiBkc3RhdDwkZHN0YXQ+XG4iOwogCQkJaWYgKCRyZXN0IG5lICcnKSB7CiAJCQkJaWYgKCRyZXN0ICF+IC93aGlsZVxzKlwoLyAmJgogCQkJCSAgICAkZHN0YXQgIX4gLyRleGNlcHRpb25zLykKQEAgLTIxODksNiArMjI1MiwxNSBAQAogCQkJfQogCQl9CiAKKyMgbWFrZSBzdXJlIHN5bWJvbHMgYXJlIGFsd2F5cyB3cmFwcGVkIHdpdGggVk1MSU5VWF9TWU1CT0woKSAuLi4KKyMgYWxsIGFzc2lnbm1lbnRzIG1heSBoYXZlIG9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgd2l0aCBhbiBhc3NpZ25tZW50OgorIwkuCisjCUFMSUdOKC4uLikKKyMJVk1MSU5VWF9TWU1CT0woLi4uKQorCQlpZiAoJHJlYWxmaWxlIGVxICd2bWxpbnV4Lmxkcy5oJyAmJiAkbGluZSA9fiAvKD86KD86XnxccykkSWRlbnRccyo9fD1ccyokSWRlbnQoPzpcc3wkKSkvKSB7CisJCQlXQVJOKCJ2bWxpbnV4Lmxkcy5oIG5lZWRzIFZNTElOVVhfU1lNQk9MKCkgYXJvdW5kIEMtdmlzaWJsZSBzeW1ib2xzXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGNoZWNrIGZvciByZWR1bmRhbnQgYnJhY2luZyByb3VuZCBpZiBldGMKIAkJaWYgKCRsaW5lID1+IC8oXi4qKVxiaWZcYi8gJiYgJDEgIX4gL2Vsc2VccyokLykgewogCQkJbXkgKCRsZXZlbCwgJGVuZGxuLCBAY2h1bmtzKSA9CkBAIC0yNDQzLDYgKzI1MTUsMTEgQEAKIAkJaWYgKCRsaW5lID1+IC9eLlxzKl9faW5pdGNhbGxccypcKC8pIHsKIAkJCVdBUk4oInBsZWFzZSB1c2UgZGV2aWNlX2luaXRjYWxsKCkgaW5zdGVhZCBvZiBfX2luaXRjYWxsKClcbiIgLiAkaGVyZWN1cnIpOwogCQl9CisjIGNoZWNrIGZvciBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zLCBlbnN1cmUgdGhleSBhcmUgY29uc3QuCisJCWlmICgkbGluZSA9fiAvXGJzdHJ1Y3RccytmaWxlX29wZXJhdGlvbnNcYi8gJiYKKwkJICAgICRsaW5lICF+IC9cYmNvbnN0XGIvKSB7CisJCQlXQVJOKCJzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNob3VsZCBub3JtYWxseSBiZSBjb25zdFxuIiAuICRoZXJlY3Vycik7CisJCX0KIAogIyB1c2Ugb2YgTlJfQ1BVUyBpcyB1c3VhbGx5IHdyb25nCiAjIGlnbm9yZSBkZWZpbml0aW9ucyBvZiBOUl9DUFVTIGFuZCB1c2FnZSB0byBkZWZpbmUgYXJyYXlzIGFzIGxpa2VseSByaWdodApAQCAtMjQ2Niw2ICsyNTQzLDE1IEBACiAJCQkJbGFzdDsKIAkJCX0KIAkJfQorCisjIHdoaW5lIG1pZ2h0bHkgYWJvdXQgaW5fYXRvbWljCisJCWlmICgkbGluZSA9fiAvXGJpbl9hdG9taWNccypcKC8pIHsKKwkJCWlmICgkcmVhbGZpbGUgPX4gbUBeZHJpdmVycy9AKSB7CisJCQkJRVJST1IoImRvIG5vdCB1c2UgaW5fYXRvbWljIGluIGRyaXZlcnNcbiIgLiAkaGVyZWN1cnIpOworCQkJfSBlbHNlIHsKKwkJCQlXQVJOKCJ1c2Ugb2YgaW5fYXRvbWljKCkgaXMgaW5jb3JyZWN0IG91dHNpZGUgY29yZSBrZXJuZWwgY29kZVxuIiAuICRoZXJlY3Vycik7CisJCQl9CisJCX0KIAl9CiAKIAkjIElmIHdlIGhhdmUgbm8gaW5wdXQgYXQgYWxsLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0IG9uCmRpZmYgLS1naXQgYS9zY3JpcHRzL21hcmt1cF9vb3BzLnBsIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbApAQCAtMCwwICsxLDE2MiBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgQ29weXJpZ2h0IDIwMDgsIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwKKyMKKyMgVGhpcyBwcm9ncmFtIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisjCisjIEF1dGhvcnM6CisjIAlBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisKKworbXkgJHZtbGludXhfbmFtZSA9ICRBUkdWWzBdOworCisjCisjIFN0ZXAgMTogUGFyc2UgdGhlIG9vcHMgdG8gZmluZCB0aGUgRUlQIHZhbHVlCisjCisKK215ICR0YXJnZXQgPSAiMCI7Cit3aGlsZSAoPFNURElOPikgeworCWlmICgkXyA9fiAvRUlQOiAwMDYwOlxbXDwoW2EtejAtOV0rKVw+XF0vKSB7CisJCSR0YXJnZXQgPSAkMTsKKwl9Cit9CisKK2lmICgkdGFyZ2V0ID1+IC9eZjgvKSB7CisJcHJpbnQgIlRoaXMgc2NyaXB0IGRvZXMgbm90IHdvcmsgb24gbW9kdWxlcyAuLi4gXG4iOworCWV4aXQ7Cit9CisKK2lmICgkdGFyZ2V0IGVxICIwIikgeworCXByaW50ICJObyBvb3BzIGZvdW5kIVxuIjsKKwlwcmludCAiVXNhZ2U6IFxuIjsKKwlwcmludCAiICAgIGRtZXNnIHwgcGVybCBzY3JpcHRzL21hcmt1cF9vb3BzLnBsIHZtbGludXhcbiI7CisJZXhpdDsKK30KKworbXkgJGNvdW50ZXIgPSAwOworbXkgJHN0YXRlICAgPSAwOworbXkgJGNlbnRlciAgPSAwOworbXkgQGxpbmVzOworCitzdWIgSW5SYW5nZSB7CisJbXkgKCRhZGRyZXNzLCAkdGFyZ2V0KSA9IEBfOworCW15ICRhZCA9ICIweCIuJGFkZHJlc3M7CisJbXkgJHRhID0gIjB4Ii4kdGFyZ2V0OworCW15ICRkZWx0YSA9IGhleCgkYWQpIC0gaGV4KCR0YSk7CisKKwlpZiAoKCRkZWx0YSA+IC00MDk2KSAmJiAoJGRlbHRhIDwgNDA5NikpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworIyBmaXJzdCwgcGFyc2UgdGhlIGlucHV0IGludG8gdGhlIGxpbmVzIGFycmF5LCBidXQgdG8ga2VlcCBzaXplIGRvd24sCisjIHdlIG9ubHkgZG8gdGhpcyBmb3IgNEtiIGFyb3VuZCB0aGUgc3dlZXQgc3BvdAorCitteSAkZmlsZW5hbWU7CisKK29wZW4oRklMRSwgIm9iamR1bXAgLWRTICR2bWxpbnV4X25hbWUgfCIpIHx8IGRpZSAiQ2Fubm90IHN0YXJ0IG9iamR1bXAiOworCit3aGlsZSAoPEZJTEU+KSB7CisJbXkgJGxpbmUgPSAkXzsKKwljaG9tcCgkbGluZSk7CisJaWYgKCRzdGF0ZSA9PSAwKSB7CisJCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCQlpZiAoSW5SYW5nZSgkMSwgJHRhcmdldCkpIHsKKwkJCQkkc3RhdGUgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKCRsaW5lID1+IC9eKFthLWYwLTldW2EtZjAtOV1bYS1mMC05XVthLWYwLTldW2EtZjAtOV1bYS1mMC05XSspXDovKSB7CisJCQlteSAkdmFsID0gJDE7CisJCQlpZiAoIUluUmFuZ2UoJHZhbCwgJHRhcmdldCkpIHsKKwkJCQlsYXN0OworCQkJfQorCQkJaWYgKCR2YWwgZXEgJHRhcmdldCkgeworCQkJCSRjZW50ZXIgPSAkY291bnRlcjsKKwkJCX0KKwkJfQorCQkkbGluZXNbJGNvdW50ZXJdID0gJGxpbmU7CisKKwkJJGNvdW50ZXIgPSAkY291bnRlciArIDE7CisJfQorfQorCitjbG9zZShGSUxFKTsKKworaWYgKCRjb3VudGVyID09IDApIHsKKwlwcmludCAiTm8gbWF0Y2hpbmcgY29kZSBmb3VuZCBcbiI7CisJZXhpdDsKK30KKworaWYgKCRjZW50ZXIgPT0gMCkgeworCXByaW50ICJObyBtYXRjaGluZyBjb2RlIGZvdW5kIFxuIjsKKwlleGl0OworfQorCitteSAkc3RhcnQ7CitteSAkZmluaXNoOworbXkgJGNvZGVsaW5lcyA9IDA7CitteSAkYmluYXJ5bGluZXMgPSAwOworIyBub3cgd2UgZ28gdXAgYW5kIGRvd24gaW4gdGhlIGFycmF5IHRvIGZpbmQgaG93IG11Y2ggd2Ugd2FudCB0byBwcmludAorCiskc3RhcnQgPSAkY2VudGVyOworCit3aGlsZSAoJHN0YXJ0ID4gMSkgeworCSRzdGFydCA9ICRzdGFydCAtIDE7CisJbXkgJGxpbmUgPSAkbGluZXNbJHN0YXJ0XTsKKwlpZiAoJGxpbmUgPX4gL14oW2EtZjAtOV0rKVw6LykgeworCQkkYmluYXJ5bGluZXMgPSAkYmluYXJ5bGluZXMgKyAxOworCX0gZWxzZSB7CisJCSRjb2RlbGluZXMgPSAkY29kZWxpbmVzICsgMTsKKwl9CisJaWYgKCRjb2RlbGluZXMgPiAxMCkgeworCQlsYXN0OworCX0KKwlpZiAoJGJpbmFyeWxpbmVzID4gMjApIHsKKwkJbGFzdDsKKwl9Cit9CisKKworJGZpbmlzaCA9ICRjZW50ZXI7CiskY29kZWxpbmVzID0gMDsKKyRiaW5hcnlsaW5lcyA9IDA7Cit3aGlsZSAoJGZpbmlzaCA8ICRjb3VudGVyKSB7CisJJGZpbmlzaCA9ICRmaW5pc2ggKyAxOworCW15ICRsaW5lID0gJGxpbmVzWyRmaW5pc2hdOworCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCSRiaW5hcnlsaW5lcyA9ICRiaW5hcnlsaW5lcyArIDE7CisJfSBlbHNlIHsKKwkJJGNvZGVsaW5lcyA9ICRjb2RlbGluZXMgKyAxOworCX0KKwlpZiAoJGNvZGVsaW5lcyA+IDEwKSB7CisJCWxhc3Q7CisJfQorCWlmICgkYmluYXJ5bGluZXMgPiAyMCkgeworCQlsYXN0OworCX0KK30KKworCitteSAkaTsKKworbXkgJGZ1bGx0ZXh0ID0gIiI7CiskaSA9ICRzdGFydDsKK3doaWxlICgkaSA8ICRmaW5pc2gpIHsKKwlpZiAoJGkgPT0gJGNlbnRlcikgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAiKiRsaW5lc1skaV0gICAgIDwtLS0tLSBmYXVsdGluZyBpbnN0cnVjdGlvblxuIjsKKwl9IGVsc2UgeworCQkkZnVsbHRleHQgPSAkZnVsbHRleHQgLiAgIiAkbGluZXNbJGldXG4iOworCX0KKwkkaSA9ICRpICsxOworfQorCitwcmludCAkZnVsbHRleHQ7CisKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKaW5kZXggNjlmYzk5NS4uN2NkNjFhNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvY29tbW9uY2FwLmMKKysrIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKQEAgLTQ1LDI2ICs0NSwyMiBAQAogLyoqCiAgKiBjYXBfY2FwYWJsZSAtIERldGVybWluZSB3aGV0aGVyIGEgdGFzayBoYXMgYSBwYXJ0aWN1bGFyIGVmZmVjdGl2ZSBjYXBhYmlsaXR5CiAgKiBAdHNrOiBUaGUgdGFzayB0byBxdWVyeQorICogQGNyZWQ6IFRoZSBjcmVkZW50aWFscyB0byB1c2UKICAqIEBjYXA6IFRoZSBjYXBhYmlsaXR5IHRvIGNoZWNrIGZvcgogICogQGF1ZGl0OiBXaGV0aGVyIHRvIHdyaXRlIGFuIGF1ZGl0IG1lc3NhZ2Ugb3Igbm90CiAgKgogICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vbWluYXRlZCB0YXNrIGhhcyB0aGUgc3BlY2lmaWVkIGNhcGFiaWxpdHkgYW1vbmdzdAogICogaXRzIGVmZmVjdGl2ZSBzZXQsIHJldHVybmluZyAwIGlmIGl0IGRvZXMsIC12ZSBpZiBpdCBkb2VzIG5vdC4KICAqCi0gKiBOT1RFIFdFTEw6IGNhcF9jYXBhYmxlKCkgY2Fubm90IGJlIHVzZWQgbGlrZSB0aGUga2VybmVsJ3MgY2FwYWJsZSgpCi0gKiBmdW5jdGlvbi4gIFRoYXQgaXMsIGl0IGhhcyB0aGUgcmV2ZXJzZSBzZW1hbnRpY3M6IGNhcF9jYXBhYmxlKCkgcmV0dXJucyAwCi0gKiB3aGVuIGEgdGFzayBoYXMgYSBjYXBhYmlsaXR5LCBidXQgdGhlIGtlcm5lbCdzIGNhcGFibGUoKSByZXR1cm5zIDEgZm9yIHRoaXMKLSAqIGNhc2UuCisgKiBOT1RFIFdFTEw6IGNhcF9oYXNfY2FwYWJpbGl0eSgpIGNhbm5vdCBiZSB1c2VkIGxpa2UgdGhlIGtlcm5lbCdzIGNhcGFibGUoKQorICogYW5kIGhhc19jYXBhYmlsaXR5KCkgZnVuY3Rpb25zLiAgVGhhdCBpcywgaXQgaGFzIHRoZSByZXZlcnNlIHNlbWFudGljczoKKyAqIGNhcF9oYXNfY2FwYWJpbGl0eSgpIHJldHVybnMgMCB3aGVuIGEgdGFzayBoYXMgYSBjYXBhYmlsaXR5LCBidXQgdGhlCisgKiBrZXJuZWwncyBjYXBhYmxlKCkgYW5kIGhhc19jYXBhYmlsaXR5KCkgcmV0dXJucyAxIGZvciB0aGlzIGNhc2UuCiAgKi8KLWludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KQoraW50IGNhcF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwgaW50IGNhcCwKKwkJaW50IGF1ZGl0KQogewotCV9fdTMyIGNhcF9yYWlzZWQ7Ci0KLQkvKiBEZXJpdmVkIGZyb20gaW5jbHVkZS9saW51eC9zY2hlZC5oOmNhcGFibGUuICovCi0JcmN1X3JlYWRfbG9jaygpOwotCWNhcF9yYWlzZWQgPSBjYXBfcmFpc2VkKF9fdGFza19jcmVkKHRzayktPmNhcF9lZmZlY3RpdmUsIGNhcCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGNhcF9yYWlzZWQgPyAwIDogLUVQRVJNOworCXJldHVybiBjYXBfcmFpc2VkKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCkgPyAwIDogLUVQRVJNOwogfQogCiAvKioKQEAgLTE2MCw3ICsxNTYsOCBAQAogCS8qIHRoZXkgYXJlIHNvIGxpbWl0ZWQgdW5sZXNzIHRoZSBjdXJyZW50IHRhc2sgaGFzIHRoZSBDQVBfU0VUUENBUAogCSAqIGNhcGFiaWxpdHkKIAkgKi8KLQlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgQ0FQX1NFVFBDQVAsIFNFQ1VSSVRZX0NBUF9BVURJVCkgPT0gMCkKKwlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9TRVRQQ0FQLAorCQkJU0VDVVJJVFlfQ0FQX0FVRElUKSA9PSAwKQogCQlyZXR1cm4gMDsKICNlbmRpZgogCXJldHVybiAxOwpAQCAtODY5LDcgKzg2Niw4IEBACiAJCSAgICAgJiAobmV3LT5zZWN1cmViaXRzIF4gYXJnMikpCQkJLypbMV0qLwogCQkgICAgfHwgKChuZXctPnNlY3VyZWJpdHMgJiBTRUNVUkVfQUxMX0xPQ0tTICYgfmFyZzIpKQkvKlsyXSovCiAJCSAgICB8fCAoYXJnMiAmIH4oU0VDVVJFX0FMTF9MT0NLUyB8IFNFQ1VSRV9BTExfQklUUykpCS8qWzNdKi8KLQkJICAgIHx8IChjYXBfY2FwYWJsZShjdXJyZW50LCBDQVBfU0VUUENBUCwgU0VDVVJJVFlfQ0FQX0FVRElUKSAhPSAwKSAvKls0XSovCisJCSAgICB8fCAoY2FwX2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9TRVRQQ0FQLAorCQkJCSAgICBTRUNVUklUWV9DQVBfQVVESVQpICE9IDApCQkvKls0XSovCiAJCQkvKgogCQkJICogWzFdIG5vIGNoYW5naW5nIG9mIGJpdHMgdGhhdCBhcmUgbG9ja2VkCiAJCQkgKiBbMl0gbm8gdW5sb2NraW5nIG9mIGxvY2tzCkBAIC05NTAsNyArOTQ4LDggQEAKIHsKIAlpbnQgY2FwX3N5c19hZG1pbiA9IDA7CiAKLQlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgQ0FQX1NZU19BRE1JTiwgU0VDVVJJVFlfQ0FQX05PQVVESVQpID09IDApCisJaWYgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfU1lTX0FETUlOLAorCQkJU0VDVVJJVFlfQ0FQX05PQVVESVQpID09IDApCiAJCWNhcF9zeXNfYWRtaW4gPSAxOwogCXJldHVybiBfX3ZtX2Vub3VnaF9tZW1vcnkobW0sIHBhZ2VzLCBjYXBfc3lzX2FkbWluKTsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCmluZGV4IDY2ODg3NjUuLjA5Nzk2NzkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwpAQCAtMTI5NCw3ICsxMjk0LDcgQEAKIAogCWNhc2UgS0VZQ1RMX0dFVF9TRUNVUklUWToKIAkJcmV0dXJuIGtleWN0bF9nZXRfc2VjdXJpdHkoKGtleV9zZXJpYWxfdCkgYXJnMiwKLQkJCQkJICAgKGNoYXIgKikgYXJnMywKKwkJCQkJICAgKGNoYXIgX191c2VyICopIGFyZzMsCiAJCQkJCSAgIChzaXplX3QpIGFyZzQpOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDY3OGQ0ZDAuLmMzNTg2YzAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtMTU0LDE0ICsxNTQsMzIgQEAKIAkJCQkgICAgZWZmZWN0aXZlLCBpbmhlcml0YWJsZSwgcGVybWl0dGVkKTsKIH0KIAotaW50IHNlY3VyaXR5X2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApCitpbnQgc2VjdXJpdHlfY2FwYWJsZShpbnQgY2FwKQogewotCXJldHVybiBzZWN1cml0eV9vcHMtPmNhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CisJcmV0dXJuIHNlY3VyaXR5X29wcy0+Y2FwYWJsZShjdXJyZW50LCBjdXJyZW50X2NyZWQoKSwgY2FwLAorCQkJCSAgICAgU0VDVVJJVFlfQ0FQX0FVRElUKTsKIH0KIAotaW50IHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+Y2FwYWJsZSh0c2ssIGNhcCwgU0VDVVJJVFlfQ0FQX05PQVVESVQpOworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOworCWludCByZXQ7CisKKwljcmVkID0gZ2V0X3Rhc2tfY3JlZCh0c2spOworCXJldCA9IHNlY3VyaXR5X29wcy0+Y2FwYWJsZSh0c2ssIGNyZWQsIGNhcCwgU0VDVVJJVFlfQ0FQX0FVRElUKTsKKwlwdXRfY3JlZChjcmVkKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc2VjdXJpdHlfcmVhbF9jYXBhYmxlX25vYXVkaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApCit7CisJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CisJaW50IHJldDsKKworCWNyZWQgPSBnZXRfdGFza19jcmVkKHRzayk7CisJcmV0ID0gc2VjdXJpdHlfb3BzLT5jYXBhYmxlKHRzaywgY3JlZCwgY2FwLCBTRUNVUklUWV9DQVBfTk9BVURJVCk7CisJcHV0X2NyZWQoY3JlZCk7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IHNlY3VyaXR5X2FjY3Qoc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKaW5kZXggMjYzMDFkZC4uYmNhMWI3NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCisrKyBiL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZwpAQCAtOTQsMzMgKzk0LDYgQEAKIAogCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgMS4KIAotY29uZmlnIFNFQ1VSSVRZX1NFTElOVVhfRU5BQkxFX1NFQ01BUktfREVGQVVMVAotCWJvb2wgIk5TQSBTRUxpbnV4IGVuYWJsZSBuZXcgc2VjbWFyayBuZXR3b3JrIGNvbnRyb2xzIGJ5IGRlZmF1bHQiCi0JZGVwZW5kcyBvbiBTRUNVUklUWV9TRUxJTlVYCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBuZXcgc2VjbWFyay1iYXNlZCBuZXR3b3JrCi0JICBjb250cm9scyB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIElmIG5vdCwgdGhlIG9sZCBpbnRlcm5hbAotCSAgcGVyLXBhY2tldCBjb250cm9scyB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgcHJlc2VydmluZwotCSAgb2xkIGJlaGF2aW9yLgotCi0JICBJZiB5b3UgZW5hYmxlIHRoZSBuZXcgY29udHJvbHMsIHlvdSB3aWxsIG5lZWQgdXBkYXRlZAotCSAgU0VMaW51eCB1c2Vyc3BhY2UgbGlicmFyaWVzLCB0b29scyBhbmQgcG9saWN5LiAgVHlwaWNhbGx5LAotCSAgeW91ciBkaXN0cmlidXRpb24gd2lsbCBwcm92aWRlIHRoZXNlIGFuZCBlbmFibGUgdGhlIG5ldyBjb250cm9scwotCSAgaW4gdGhlIGtlcm5lbCB0aGV5IGFsc28gZGlzdHJpYnV0ZS4KLQotCSAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGF0IGJvb3Qgd2l0aCB0aGUKLQkgIHNlbGludXhfY29tcGF0X25ldCBwYXJhbWV0ZXIsIGFuZCBhZnRlciBib290IHZpYQotCSAgL3NlbGludXgvY29tcGF0X25ldC4gIFNlZSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAotCSAgZm9yIGRldGFpbHMgb24gdGhpcyBwYXJhbWV0ZXIuCi0KLQkgIElmIHlvdSBlbmFibGUgdGhlIG5ldyBuZXR3b3JrIGNvbnRyb2xzLCB5b3Ugd2lsbCBsaWtlbHkKLQkgIGFsc28gcmVxdWlyZSB0aGUgU0VDTUFSSyBhbmQgQ09OTlNFQ01BUksgdGFyZ2V0cywgYXMKLQkgIHdlbGwgYXMgYW55IGNvbm50cmFjayBoZWxwZXJzIGZvciBwcm90b2NvbHMgd2hpY2ggeW91Ci0JICB3aXNoIHRvIGNvbnRyb2wuCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlIHdoYXQgdG8gZG8gaGVyZSwgc2VsZWN0IE4uCi0KIGNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCiAJYm9vbCAiTlNBIFNFTGludXggbWF4aW11bSBzdXBwb3J0ZWQgcG9saWN5IGZvcm1hdCB2ZXJzaW9uIgogCWRlcGVuZHMgb24gU0VDVVJJVFlfU0VMSU5VWApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggZDQzYmQ2Yi4uZWI0MWY0MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC01MywxOCArNTMsMjAgQEAKICN1bmRlZiBTXwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF2X2luaGVyaXQgYXZfaW5oZXJpdFtdID0gewotI2RlZmluZSBTXyhjLCBpLCBiKSB7IGMsIGNvbW1vbl8jI2kjI19wZXJtX3RvX3N0cmluZywgYiB9LAorI2RlZmluZSBTXyhjLCBpLCBiKSB7CS50Y2xhc3MgPSBjLFwKKwkJCS5jb21tb25fcHRzID0gY29tbW9uXyMjaSMjX3Blcm1fdG9fc3RyaW5nLFwKKwkJCS5jb21tb25fYmFzZSA9ICBiIH0sCiAjaW5jbHVkZSAiYXZfaW5oZXJpdC5oIgogI3VuZGVmIFNfCiB9OwogCiBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHNlbGludXhfY2xhc3NfcGVybSA9IHsKLQlhdl9wZXJtX3RvX3N0cmluZywKLQlBUlJBWV9TSVpFKGF2X3Blcm1fdG9fc3RyaW5nKSwKLQljbGFzc190b19zdHJpbmcsCi0JQVJSQVlfU0laRShjbGFzc190b19zdHJpbmcpLAotCWF2X2luaGVyaXQsCi0JQVJSQVlfU0laRShhdl9pbmhlcml0KQorCS5hdl9wZXJtX3RvX3N0cmluZyA9IGF2X3Blcm1fdG9fc3RyaW5nLAorCS5hdl9wdHNfbGVuID0gQVJSQVlfU0laRShhdl9wZXJtX3RvX3N0cmluZyksCisJLmNsYXNzX3RvX3N0cmluZyA9IGNsYXNzX3RvX3N0cmluZywKKwkuY3RzX2xlbiA9IEFSUkFZX1NJWkUoY2xhc3NfdG9fc3RyaW5nKSwKKwkuYXZfaW5oZXJpdCA9IGF2X2luaGVyaXQsCisJLmF2X2luaGVyaXRfbGVuID0gQVJSQVlfU0laRShhdl9pbmhlcml0KQogfTsKIAogI2RlZmluZSBBVkNfQ0FDSEVfU0xPVFMJCQk1MTIKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCBkYmVhYTc4Li4wMDgxNTk3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xNDMzLDEyICsxNDMzLDEzIEBACiAKIC8qIENoZWNrIHdoZXRoZXIgYSB0YXNrIGlzIGFsbG93ZWQgdG8gdXNlIGEgY2FwYWJpbGl0eS4gKi8KIHN0YXRpYyBpbnQgdGFza19oYXNfY2FwYWJpbGl0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwKIAkJCSAgICAgICBpbnQgY2FwLCBpbnQgYXVkaXQpCiB7CiAJc3RydWN0IGF2Y19hdWRpdF9kYXRhIGFkOwogCXN0cnVjdCBhdl9kZWNpc2lvbiBhdmQ7CiAJdTE2IHNjbGFzczsKLQl1MzIgc2lkID0gdGFza19zaWQodHNrKTsKKwl1MzIgc2lkID0gY3JlZF9zaWQoY3JlZCk7CiAJdTMyIGF2ID0gQ0FQX1RPX01BU0soY2FwKTsKIAlpbnQgcmM7CiAKQEAgLTE4NjUsMTUgKzE4NjYsMTYgQEAKIAlyZXR1cm4gY3JlZF9oYXNfcGVybShvbGQsIG5ldywgUFJPQ0VTU19fU0VUQ0FQKTsKIH0KIAotc3RhdGljIGludCBzZWxpbnV4X2NhcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXAsIGludCBhdWRpdCkKK3N0YXRpYyBpbnQgc2VsaW51eF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwKKwkJCSAgIGludCBjYXAsIGludCBhdWRpdCkKIHsKIAlpbnQgcmM7CiAKLQlyYyA9IHNlY29uZGFyeV9vcHMtPmNhcGFibGUodHNrLCBjYXAsIGF1ZGl0KTsKKwlyYyA9IHNlY29uZGFyeV9vcHMtPmNhcGFibGUodHNrLCBjcmVkLCBjYXAsIGF1ZGl0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJldHVybiB0YXNrX2hhc19jYXBhYmlsaXR5KHRzaywgY2FwLCBhdWRpdCk7CisJcmV0dXJuIHRhc2tfaGFzX2NhcGFiaWxpdHkodHNrLCBjcmVkLCBjYXAsIGF1ZGl0KTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3N5c2N0bF9nZXRfc2lkKGN0bF90YWJsZSAqdGFibGUsIHUxNiB0Y2xhc3MsIHUzMiAqc2lkKQpAQCAtMjAzNyw3ICsyMDM5LDggQEAKIHsKIAlpbnQgcmMsIGNhcF9zeXNfYWRtaW4gPSAwOwogCi0JcmMgPSBzZWxpbnV4X2NhcGFibGUoY3VycmVudCwgQ0FQX1NZU19BRE1JTiwgU0VDVVJJVFlfQ0FQX05PQVVESVQpOworCXJjID0gc2VsaW51eF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfU1lTX0FETUlOLAorCQkJICAgICBTRUNVUklUWV9DQVBfTk9BVURJVCk7CiAJaWYgKHJjID09IDApCiAJCWNhcF9zeXNfYWRtaW4gPSAxOwogCkBAIC0yODgwLDcgKzI4ODMsOCBAQAogCSAqIGFuZCBsYWNrIG9mIHBlcm1pc3Npb24ganVzdCBtZWFucyB0aGF0IHdlIGZhbGwgYmFjayB0byB0aGUKIAkgKiBpbi1jb3JlIGNvbnRleHQgdmFsdWUsIG5vdCBhIGRlbmlhbC4KIAkgKi8KLQllcnJvciA9IHNlbGludXhfY2FwYWJsZShjdXJyZW50LCBDQVBfTUFDX0FETUlOLCBTRUNVUklUWV9DQVBfTk9BVURJVCk7CisJZXJyb3IgPSBzZWxpbnV4X2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9NQUNfQURNSU4sCisJCQkJU0VDVVJJVFlfQ0FQX05PQVVESVQpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHRfZm9yY2UoaXNlYy0+c2lkLCAmY29udGV4dCwKIAkJCQkJCSAgICAgICZzaXplKTsKQEAgLTQxODUsNyArNDE4OSw3IEBACiBzdGF0aWMgaW50IHNlbGludXhfc29ja19yY3Zfc2tiX2NvbXBhdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIHUxNiBmYW1pbHkpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNrLT5za19zZWN1cml0eTsKIAl1MzIgcGVlcl9zaWQ7CiAJdTMyIHNrX3NpZCA9IHNrc2VjLT5zaWQ7CkBAIC00MjAyLDcgKzQyMDYsNyBAQAogCWlmIChzZWxpbnV4X2NvbXBhdF9uZXQpCiAJCWVyciA9IHNlbGludXhfc29ja19yY3Zfc2tiX2lwdGFibGVzX2NvbXBhdChzaywgc2tiLCAmYWQsCiAJCQkJCQkJICAgZmFtaWx5LCBhZGRycCk7Ci0JZWxzZQorCWVsc2UgaWYgKHNlbGludXhfc2VjbWFya19lbmFibGVkKCkpCiAJCWVyciA9IGF2Y19oYXNfcGVybShza19zaWQsIHNrYi0+c2VjbWFyaywgU0VDQ0xBU1NfUEFDS0VULAogCQkJCSAgIFBBQ0tFVF9fUkVDViwgJmFkKTsKIAlpZiAoZXJyKQpAQCAtNDcwNSw3ICs0NzA5LDcgQEAKIAkJaWYgKHNlbGludXhfaXBfcG9zdHJvdXRlX2lwdGFibGVzX2NvbXBhdChza2ItPnNrLCBpZmluZGV4LAogCQkJCQkJCSAmYWQsIGZhbWlseSwgYWRkcnApKQogCQkJcmV0dXJuIE5GX0RST1A7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHNlbGludXhfc2VjbWFya19lbmFibGVkKCkpIHsKIAkJaWYgKGF2Y19oYXNfcGVybShza3NlYy0+c2lkLCBza2ItPnNlY21hcmssCiAJCQkJIFNFQ0NMQVNTX1BBQ0tFVCwgUEFDS0VUX19TRU5ELCAmYWQpKQogCQkJcmV0dXJuIE5GX0RST1A7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmgKaW5kZXggYzBkMzE0ZC4uYmIxZWM4MCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaApAQCAtMTcsMTYgKzE3LDE2IEBACiB9OwogCiBzdHJ1Y3QgYXZfaW5oZXJpdCB7Ci0JdTE2IHRjbGFzczsKIAljb25zdCBjaGFyICoqY29tbW9uX3B0czsKIAl1MzIgY29tbW9uX2Jhc2U7CisJdTE2IHRjbGFzczsKIH07CiAKIHN0cnVjdCBzZWxpbnV4X2NsYXNzX3Blcm0gewogCWNvbnN0IHN0cnVjdCBhdl9wZXJtX3RvX3N0cmluZyAqYXZfcGVybV90b19zdHJpbmc7CiAJdTMyIGF2X3B0c19sZW47Ci0JY29uc3QgY2hhciAqKmNsYXNzX3RvX3N0cmluZzsKIAl1MzIgY3RzX2xlbjsKKwljb25zdCBjaGFyICoqY2xhc3NfdG9fc3RyaW5nOwogCWNvbnN0IHN0cnVjdCBhdl9pbmhlcml0ICphdl9pbmhlcml0OwogCXUzMiBhdl9pbmhlcml0X2xlbjsKIH07CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwppbmRleCA4ZjYxMmM4Li4wMWVjNmQyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKQEAgLTQ3LDEzICs0Nyw3IEBACiAKIHVuc2lnbmVkIGludCBzZWxpbnV4X2NoZWNrcmVxcHJvdCA9IENPTkZJR19TRUNVUklUWV9TRUxJTlVYX0NIRUNLUkVRUFJPVF9WQUxVRTsKIAotI2lmZGVmIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX0VOQUJMRV9TRUNNQVJLX0RFRkFVTFQKLSNkZWZpbmUgU0VMSU5VWF9DT01QQVRfTkVUX1ZBTFVFIDAKLSNlbHNlCi0jZGVmaW5lIFNFTElOVVhfQ09NUEFUX05FVF9WQUxVRSAxCi0jZW5kaWYKLQotaW50IHNlbGludXhfY29tcGF0X25ldCA9IFNFTElOVVhfQ09NUEFUX05FVF9WQUxVRTsKK2ludCBzZWxpbnV4X2NvbXBhdF9uZXQgPSAwOwogCiBzdGF0aWMgaW50IF9faW5pdCBjaGVja3JlcXByb3Rfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtNDk0LDcgKzQ4OCwxMyBAQAogCWlmIChzc2NhbmYocGFnZSwgIiVkIiwgJm5ld192YWx1ZSkgIT0gMSkKIAkJZ290byBvdXQ7CiAKLQlzZWxpbnV4X2NvbXBhdF9uZXQgPSBuZXdfdmFsdWUgPyAxIDogMDsKKwlpZiAobmV3X3ZhbHVlKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkgICAgICAgIlNFTGludXg6IGNvbXBhdF9uZXQgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBzZWNtYXJrIgorCQkgICAgICAgIiBpbnN0ZWFkXG4iKTsKKwkJc2VsaW51eF9jb21wYXRfbmV0ID0gMTsKKwl9IGVsc2UKKwkJc2VsaW51eF9jb21wYXRfbmV0ID0gMDsKIAlsZW5ndGggPSBjb3VudDsKIG91dDoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb250ZXh0LmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbnRleHQuaAppbmRleCA2NThjMmJkLi5kOWRkN2EyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbnRleHQuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbnRleHQuaApAQCAtMjcsOSArMjcsOSBAQAogCXUzMiB1c2VyOwogCXUzMiByb2xlOwogCXUzMiB0eXBlOworCXUzMiBsZW47ICAgICAgICAvKiBsZW5ndGggb2Ygc3RyaW5nIGluIGJ5dGVzICovCiAJc3RydWN0IG1sc19yYW5nZSByYW5nZTsKIAljaGFyICpzdHI7CS8qIHN0cmluZyByZXByZXNlbnRhdGlvbiBpZiBjb250ZXh0IGNhbm5vdCBiZSBtYXBwZWQuICovCi0JdTMyIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBzdHJpbmcgaW4gYnl0ZXMgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbHNfY29udGV4dF9pbml0KHN0cnVjdCBjb250ZXh0ICpjKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggMzFkY2U1NS4uYjc5NTgyZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPG5ldC9uZXRsYWJlbC5oPgogCiAvKgpAQCAtMzksNiArNDAsNyBAQAogc3RydWN0IHNvY2tldF9zbWFjayB7CiAJY2hhcgkJKnNta19vdXQ7CQkJLyogb3V0Ym91bmQgbGFiZWwgKi8KIAljaGFyCQkqc21rX2luOwkJCS8qIGluYm91bmQgbGFiZWwgKi8KKwlpbnQJCXNta19sYWJlbGVkOwkJCS8qIGxhYmVsIHNjaGVtZSAqLwogCWNoYXIJCXNta19wYWNrZXRbU01LX0xBQkVMTEVOXTsJLyogVENQIHBlZXIgbGFiZWwgKi8KIH07CiAKQEAgLTgwLDYgKzgyLDE2IEBACiB9OwogCiAvKgorICogQW4gZW50cnkgaW4gdGhlIHRhYmxlIGlkZW50aWZ5aW5nIGhvc3RzLgorICovCitzdHJ1Y3Qgc21rX25ldGxibGFkZHIgeworCXN0cnVjdCBzbWtfbmV0bGJsYWRkcgkqc21rX25leHQ7CisJc3RydWN0IHNvY2thZGRyX2luCXNta19ob3N0OwkvKiBuZXR3b3JrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW5fYWRkcgkJc21rX21hc2s7CS8qIG5ldHdvcmsgbWFzayAqLworCWNoYXIJCQkqc21rX2xhYmVsOwkvKiBsYWJlbCAqLworfTsKKworLyoKICAqIFRoaXMgaXMgdGhlIHJlcG9zaXRvcnkgZm9yIGxhYmVscyBzZWVuIHNvIHRoYXQgaXQgaXMKICAqIG5vdCBuZWNlc3NhcnkgdG8ga2VlcCBhbGxvY2F0aW5nIHRpbnkgY2h1bmNrcyBvZiBtZW1vcnkKICAqIGFuZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZC4KQEAgLTEyNyw2ICsxMzksMjAgQEAKICNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQT1VUCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUE9VVAogCiAvKgorICogSG93IGNvbW11bmljYXRpb25zIG9uIHRoaXMgc29ja2V0IGFyZSB0cmVhdGVkLgorICogVXN1YWxseSBpdCdzIGRldGVybWluZWQgYnkgdGhlIHVuZGVybHlpbmcgbmV0bGFiZWwgY29kZQorICogYnV0IHRoZXJlIGFyZSBjZXJ0YWluIGNhc2VzLCBpbmNsdWRpbmcgc2luZ2xlIGxhYmVsIGhvc3RzCisgKiBhbmQgcG90ZW50aWFsbHkgc2luZ2xlIGxhYmVsIGludGVyZmFjZXMgZm9yIHdoaWNoIHRoZQorICogdHJlYXRtZW50IGNhbiBub3QgYmUga25vd24gaW4gYWR2YW5jZS4KKyAqCisgKiBUaGUgcG9zc2liaWxpdHkgb2YgYWRkaXRpb25hbCBsYWJlbGluZyBzY2hlbWVzIGJlaW5nCisgKiBpbnRyb2R1Y2VkIGluIHRoZSBmdXR1cmUgZXhpc3RzIGFzIHdlbGwuCisgKi8KKyNkZWZpbmUgU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVAkwCisjZGVmaW5lIFNNQUNLX0NJUFNPX1NPQ0tFVAkxCisKKy8qCisgKiBzbWFja2ZzIG1hZ2ljIG51bWJlcgogICogc21hY2tmcyBtYWNpYyBudW1iZXIKICAqLwogI2RlZmluZSBTTUFDS19NQUdJQwkweDQzNDE1ZDUzIC8qICJTTUFDIiAqLwpAQCAtMTQxLDYgKzE2Nyw3IEBACiAgKiBDSVBTTyBkZWZhdWx0cy4KICAqLwogI2RlZmluZSBTTUFDS19DSVBTT19ET0lfREVGQVVMVAkJMwkvKiBIaXN0b3JpY2FsICovCisjZGVmaW5lIFNNQUNLX0NJUFNPX0RPSV9JTlZBTElECQktMQkvKiBOb3QgYSBET0kgKi8KICNkZWZpbmUgU01BQ0tfQ0lQU09fRElSRUNUX0RFRkFVTFQJMjUwCS8qIEFyYml0cmFyeSAqLwogI2RlZmluZSBTTUFDS19DSVBTT19NQVhDQVRWQUwJCTYzCS8qIEJpZ2dlciBnZXRzIGhhcmRlciAqLwogI2RlZmluZSBTTUFDS19DSVBTT19NQVhMRVZFTCAgICAgICAgICAgIDI1NSAgICAgLyogQ0lQU08gMi4yIHN0YW5kYXJkICovCkBAIC0xNzYsNyArMjAzLDYgQEAKICAqIFNoYXJlZCBkYXRhLgogICovCiBleHRlcm4gaW50IHNtYWNrX2NpcHNvX2RpcmVjdDsKLWV4dGVybiBpbnQgc21hY2tfbmV0X25sdHlwZTsKIGV4dGVybiBjaGFyICpzbWFja19uZXRfYW1iaWVudDsKIGV4dGVybiBjaGFyICpzbWFja19vbmx5Y2FwOwogCkBAIC0xODYsOSArMjEyLDEwIEBACiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX2h1aDsKIGV4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25faW52YWxpZDsKIGV4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fc3RhcjsKLWV4dGVybiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fdW5zZXQ7CitleHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX3dlYjsKIAogZXh0ZXJuIHN0cnVjdCBzbWtfbGlzdF9lbnRyeSAqc21hY2tfbGlzdDsKK2V4dGVybiBzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNtYWNrX25ldGxibGFkZHJzOwogZXh0ZXJuIHN0cnVjdCBzZWN1cml0eV9vcGVyYXRpb25zIHNtYWNrX29wczsKIAogLyoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKaW5kZXggMjQ3Y2VjMy4uMmUwYjgzZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKQEAgLTE1LDE1ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJzbWFjay5oIgogCi1zdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fdW5zZXQgPSB7Ci0JLnNta19uZXh0CT0gTlVMTCwKLQkuc21rX2tub3duCT0gIlVOU0VUIiwKLQkuc21rX3NlY2lkCT0gMSwKLQkuc21rX2NpcHNvCT0gTlVMTCwKLX07Ci0KIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl9odWggPSB7Ci0JLnNta19uZXh0CT0gJnNtYWNrX2tub3duX3Vuc2V0LAorCS5zbWtfbmV4dAk9IE5VTEwsCiAJLnNta19rbm93bgk9ICI/IiwKIAkuc21rX3NlY2lkCT0gMiwKIAkuc21rX2NpcHNvCT0gTlVMTCwKQEAgLTU3LDcgKzUwLDE0IEBACiAJLnNta19jaXBzbwk9IE5VTEwsCiB9OwogCi1zdHJ1Y3Qgc21hY2tfa25vd24gKnNtYWNrX2tub3duID0gJnNtYWNrX2tub3duX2ludmFsaWQ7CitzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25fd2ViID0geworCS5zbWtfbmV4dAk9ICZzbWFja19rbm93bl9pbnZhbGlkLAorCS5zbWtfa25vd24JPSAiQCIsCisJLnNta19zZWNpZAk9IDcsCisJLnNta19jaXBzbwk9IE5VTEwsCit9OworCitzdHJ1Y3Qgc21hY2tfa25vd24gKnNtYWNrX2tub3duID0gJnNtYWNrX2tub3duX3dlYjsKIAogLyoKICAqIFRoZSBpbml0aWFsIHZhbHVlIG5lZWRzIHRvIGJlIGJpZ2dlciB0aGFuIGFueSBvZiB0aGUKQEAgLTk5LDYgKzk5LDE2IEBACiAJICAgIHN0cmNtcChzdWJqZWN0X2xhYmVsLCBzbWFja19rbm93bl9zdGFyLnNta19rbm93bikgPT0gMCkKIAkJcmV0dXJuIC1FQUNDRVM7CiAJLyoKKwkgKiBBbiBpbnRlcm5ldCBvYmplY3QgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSBzdWJqZWN0LgorCSAqIFRhc2tzIGNhbm5vdCBiZSBhc3NpZ25lZCB0aGUgaW50ZXJuZXQgbGFiZWwuCisJICogQW4gaW50ZXJuZXQgc3ViamVjdCBjYW4gYWNjZXNzIGFueSBvYmplY3QuCisJICovCisJaWYgKG9iamVjdF9sYWJlbCA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duIHx8CisJICAgIHN1YmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fd2ViLnNta19rbm93biB8fAorCSAgICBzdHJjbXAob2JqZWN0X2xhYmVsLCBzbWFja19rbm93bl93ZWIuc21rX2tub3duKSA9PSAwIHx8CisJICAgIHN0cmNtcChzdWJqZWN0X2xhYmVsLCBzbWFja19rbm93bl93ZWIuc21rX2tub3duKSA9PSAwKQorCQlyZXR1cm4gMDsKKwkvKgogCSAqIEEgc3RhciBvYmplY3QgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSBzdWJqZWN0LgogCSAqLwogCWlmIChvYmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd24gfHwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKaW5kZXggODQ4MjEyZi4uMDI3OGJjMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKQEAgLTEyNzcsNiArMTI3Nyw3IEBACiAKIAlzc3AtPnNta19pbiA9IGNzcDsKIAlzc3AtPnNta19vdXQgPSBjc3A7CisJc3NwLT5zbWtfbGFiZWxlZCA9IFNNQUNLX0NJUFNPX1NPQ0tFVDsKIAlzc3AtPnNta19wYWNrZXRbMF0gPSAnXDAnOwogCiAJc2stPnNrX3NlY3VyaXR5ID0gc3NwOwpAQCAtMTM0MSw0NSArMTM0Miw2OSBAQAogCXN0cnVjdCBzbWFja19jaXBzbyBjaXBzbzsKIAlpbnQgcmM7CiAKLQlzd2l0Y2ggKHNtYWNrX25ldF9ubHR5cGUpIHsKLQljYXNlIE5FVExCTF9OTFRZUEVfQ0lQU09WNDoKLQkJbmxzcC0+ZG9tYWluID0gc21hY2s7Ci0JCW5sc3AtPmZsYWdzID0gTkVUTEJMX1NFQ0FUVFJfRE9NQUlOIHwgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTDsKKwlubHNwLT5kb21haW4gPSBzbWFjazsKKwlubHNwLT5mbGFncyA9IE5FVExCTF9TRUNBVFRSX0RPTUFJTiB8IE5FVExCTF9TRUNBVFRSX01MU19MVkw7CiAKLQkJcmMgPSBzbWFja190b19jaXBzbyhzbWFjaywgJmNpcHNvKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCW5sc3AtPmF0dHIubWxzLmx2bCA9IGNpcHNvLnNta19sZXZlbDsKLQkJCXNtYWNrX3NldF9jYXRzZXQoY2lwc28uc21rX2NhdHNldCwgbmxzcCk7Ci0JCX0gZWxzZSB7Ci0JCQlubHNwLT5hdHRyLm1scy5sdmwgPSBzbWFja19jaXBzb19kaXJlY3Q7Ci0JCQlzbWFja19zZXRfY2F0c2V0KHNtYWNrLCBubHNwKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwlyYyA9IHNtYWNrX3RvX2NpcHNvKHNtYWNrLCAmY2lwc28pOworCWlmIChyYyA9PSAwKSB7CisJCW5sc3AtPmF0dHIubWxzLmx2bCA9IGNpcHNvLnNta19sZXZlbDsKKwkJc21hY2tfc2V0X2NhdHNldChjaXBzby5zbWtfY2F0c2V0LCBubHNwKTsKKwl9IGVsc2UgeworCQlubHNwLT5hdHRyLm1scy5sdmwgPSBzbWFja19jaXBzb19kaXJlY3Q7CisJCXNtYWNrX3NldF9jYXRzZXQoc21hY2ssIG5sc3ApOwogCX0KIH0KIAogLyoqCiAgKiBzbWFja19uZXRsYWJlbCAtIFNldCB0aGUgc2VjYXR0ciBvbiBhIHNvY2tldAogICogQHNrOiB0aGUgc29ja2V0CisgKiBAbGFiZWxlZDogc29ja2V0IGxhYmVsIHNjaGVtZQogICoKICAqIENvbnZlcnQgdGhlIG91dGJvdW5kIHNtYWNrIHZhbHVlIChzbWtfb3V0KSB0byBhCiAgKiBzZWNhdHRyIGFuZCBhdHRhY2ggaXQgdG8gdGhlIHNvY2tldC4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhbiBlcnJvciBjb2RlCiAgKi8KLXN0YXRpYyBpbnQgc21hY2tfbmV0bGFiZWwoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIGludCBzbWFja19uZXRsYWJlbChzdHJ1Y3Qgc29jayAqc2ssIGludCBsYWJlbGVkKQogewogCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcDsKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7Ci0JaW50IHJjOworCWludCByYyA9IDA7CiAKIAlzc3AgPSBzay0+c2tfc2VjdXJpdHk7Ci0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0Jc21hY2tfdG9fc2VjYXR0cihzc3AtPnNta19vdXQsICZzZWNhdHRyKTsKLQlyYyA9IG5ldGxibF9zb2NrX3NldGF0dHIoc2ssICZzZWNhdHRyKTsKLQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKwkvKgorCSAqIFVzdWFsbHkgdGhlIG5ldGxhYmVsIGNvZGUgd2lsbCBoYW5kbGUgY2hhbmdpbmcgdGhlCisJICogcGFja2V0IGxhYmVsaW5nIGJhc2VkIG9uIHRoZSBsYWJlbC4KKwkgKiBUaGUgY2FzZSBvZiBhIHNpbmdsZSBsYWJlbCBob3N0IGlzIGRpZmZlcmVudCwgYmVjYXVzZQorCSAqIGEgc2luZ2xlIGxhYmVsIGhvc3Qgc2hvdWxkIG5ldmVyIGdldCBhIGxhYmVsZWQgcGFja2V0CisJICogZXZlbiB0aG91Z2ggdGhlIGxhYmVsIGlzIHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2V0CisJICogbGFiZWwuCisJICovCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWJoX2xvY2tfc29ja19uZXN0ZWQoc2spOworCisJaWYgKHNzcC0+c21rX291dCA9PSBzbWFja19uZXRfYW1iaWVudCB8fAorCSAgICBsYWJlbGVkID09IFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQpCisJCW5ldGxibF9zb2NrX2RlbGF0dHIoc2spOworCWVsc2UgeworCQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKKwkJc21hY2tfdG9fc2VjYXR0cihzc3AtPnNta19vdXQsICZzZWNhdHRyKTsKKwkJcmMgPSBuZXRsYmxfc29ja19zZXRhdHRyKHNrLCAmc2VjYXR0cik7CisJCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCX0KKworCWJoX3VubG9ja19zb2NrKHNrKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwkvKgorCSAqIFJlbWVtYmVyIHRoZSBsYWJlbCBzY2hlbWUgdXNlZCBzbyB0aGF0IGl0IGlzIG5vdAorCSAqIG5lY2Vzc2FyeSB0byBkbyB0aGUgbmV0bGFiZWwgc2V0dGluZyBpZiBpdCBoYXMgbm90CisJICogY2hhbmdlZCB0aGUgbmV4dCB0aW1lIHRocm91Z2guCisJICoKKwkgKiBUaGUgLUVERVNUQUREUlJFUSBjYXNlIGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGVyZSdzCisJICogYSBzaW5nbGUgbGV2ZWwgaG9zdCBpbnZvbHZlZC4KKwkgKi8KKwlpZiAocmMgPT0gMCkKKwkJc3NwLT5zbWtfbGFiZWxlZCA9IGxhYmVsZWQ7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xNDMyLDcgKzE0NTcsNyBAQAogCQlzc3AtPnNta19pbiA9IHNwOwogCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9TTUFDS19JUE9VVCkgPT0gMCkgewogCQlzc3AtPnNta19vdXQgPSBzcDsKLQkJcmMgPSBzbWFja19uZXRsYWJlbChzb2NrLT5zayk7CisJCXJjID0gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7CiAJCWlmIChyYyAhPSAwKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAogCQkJICAgICAgIF9fZnVuY19fLCAtcmMpOwpAQCAtMTQ2Miw3ICsxNDg3LDEwOCBAQAogCS8qCiAJICogU2V0IHRoZSBvdXRib3VuZCBuZXRsYmwuCiAJICovCi0JcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrKTsKKwlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7Cit9CisKKworLyoqCisgKiBzbWFja19ob3N0X2xhYmVsIC0gY2hlY2sgaG9zdCBiYXNlZCByZXN0cmljdGlvbnMKKyAqIEBzaXA6IHRoZSBvYmplY3QgZW5kCisgKgorICogbG9va3MgZm9yIGhvc3QgYmFzZWQgYWNjZXNzIHJlc3RyaWN0aW9ucworICoKKyAqIFRoaXMgdmVyc2lvbiB3aWxsIG9ubHkgYmUgYXBwcm9wcmlhdGUgZm9yIHJlYWxseSBzbWFsbAorICogc2V0cyBvZiBzaW5nbGUgbGFiZWwgaG9zdHMuIEJlY2F1c2Ugb2YgdGhlIG1hc2tpbmcKKyAqIGl0IGNhbm5vdCBzaG9ydGN1dCBvdXQgb24gdGhlIGZpcnN0IG1hdGNoLiBUaGVyZSBhcmUKKyAqIG51bWVyaW91cyB3YXlzIHRvIGFkZHJlc3MgdGhlIHByb2JsZW0sIGJ1dCBub25lIG9mIHRoZW0KKyAqIGhhdmUgYmVlbiBhcHBsaWVkIGhlcmUuCisgKgorICogUmV0dXJucyB0aGUgbGFiZWwgb2YgdGhlIGZhciBlbmQgb3IgTlVMTCBpZiBpdCdzIG5vdCBzcGVjaWFsLgorICovCitzdGF0aWMgY2hhciAqc21hY2tfaG9zdF9sYWJlbChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpcCkKK3sKKwlzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKnNucDsKKwljaGFyICpiZXN0bGFiZWwgPSBOVUxMOworCXN0cnVjdCBpbl9hZGRyICpzaWFwID0gJnNpcC0+c2luX2FkZHI7CisJc3RydWN0IGluX2FkZHIgKmxpYXA7CisJc3RydWN0IGluX2FkZHIgKm1pYXA7CisJc3RydWN0IGluX2FkZHIgYmVzdG1hc2s7CisKKwlpZiAoc2lhcC0+c19hZGRyID09IDApCisJCXJldHVybiBOVUxMOworCisJYmVzdG1hc2suc19hZGRyID0gMDsKKworCWZvciAoc25wID0gc21hY2tfbmV0bGJsYWRkcnM7IHNucCAhPSBOVUxMOyBzbnAgPSBzbnAtPnNta19uZXh0KSB7CisJCWxpYXAgPSAmc25wLT5zbWtfaG9zdC5zaW5fYWRkcjsKKwkJbWlhcCA9ICZzbnAtPnNta19tYXNrOworCQkvKgorCQkgKiBJZiB0aGUgYWRkcmVzc2VzIG1hdGNoIGFmdGVyIGFwcGx5aW5nIHRoZSBsaXN0IGVudHJ5IG1hc2sKKwkJICogdGhlIGVudHJ5IG1hdGNoZXMgdGhlIGFkZHJlc3MuIElmIGl0IGRvZXNuJ3QgbW92ZSBhbG9uZyB0bworCQkgKiB0aGUgbmV4dCBlbnRyeS4KKwkJICovCisJCWlmICgobGlhcC0+c19hZGRyICYgbWlhcC0+c19hZGRyKSAhPQorCQkgICAgKHNpYXAtPnNfYWRkciAmIG1pYXAtPnNfYWRkcikpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgdGhlIGxpc3QgZW50cnkgbWFzayBpZGVudGlmaWVzIGEgc2luZ2xlIGFkZHJlc3MKKwkJICogaXQgY2FuJ3QgZ2V0IGFueSBtb3JlIHNwZWNpZmljLgorCQkgKi8KKwkJaWYgKG1pYXAtPnNfYWRkciA9PSAweGZmZmZmZmZmKQorCQkJcmV0dXJuIHNucC0+c21rX2xhYmVsOworCQkvKgorCQkgKiBJZiB0aGUgbGlzdCBlbnRyeSBtYXNrIGlzIGxlc3Mgc3BlY2lmaWMgdGhhbiB0aGUgYmVzdAorCQkgKiBhbHJlYWR5IGZvdW5kIHRoaXMgZW50cnkgaXMgdW5pbnRlcmVzdGluZy4KKwkJICovCisJCWlmICgobWlhcC0+c19hZGRyIHwgYmVzdG1hc2suc19hZGRyKSA9PSBiZXN0bWFzay5zX2FkZHIpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogVGhpcyBpcyBiZXR0ZXIgdGhhbiBhbnkgZW50cnkgZm91bmQgc28gZmFyLgorCQkgKi8KKwkJYmVzdG1hc2suc19hZGRyID0gbWlhcC0+c19hZGRyOworCQliZXN0bGFiZWwgPSBzbnAtPnNta19sYWJlbDsKKwl9CisKKwlyZXR1cm4gYmVzdGxhYmVsOworfQorCisvKioKKyAqIHNtYWNrX3NvY2tldF9jb25uZWN0IC0gY29ubmVjdCBhY2Nlc3MgY2hlY2sKKyAqIEBzb2NrOiB0aGUgc29ja2V0CisgKiBAc2FwOiB0aGUgb3RoZXIgZW5kCisgKiBAYWRkcmxlbjogc2l6ZSBvZiBzYXAKKyAqCisgKiBWZXJpZmllcyB0aGF0IGEgY29ubmVjdGlvbiBtYXkgYmUgcG9zc2libGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYW5kIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgc21hY2tfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJaW50IGFkZHJsZW4pCit7CisJc3RydWN0IHNvY2tldF9zbWFjayAqc3NwID0gc29jay0+c2stPnNrX3NlY3VyaXR5OworCWNoYXIgKmhvc3RzcDsKKwlpbnQgcmM7CisKKwlpZiAoc29jay0+c2sgPT0gTlVMTCB8fCBzb2NrLT5zay0+c2tfZmFtaWx5ICE9IFBGX0lORVQpCisJCXJldHVybiAwOworCisJaWYgKGFkZHJsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlob3N0c3AgPSBzbWFja19ob3N0X2xhYmVsKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXApOworCWlmIChob3N0c3AgPT0gTlVMTCkgeworCQlpZiAoc3NwLT5zbWtfbGFiZWxlZCAhPSBTTUFDS19DSVBTT19TT0NLRVQpCisJCQlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7CisJCXJldHVybiAwOworCX0KKworCXJjID0gc21rX2FjY2Vzcyhzc3AtPnNta19vdXQsIGhvc3RzcCwgTUFZX1dSSVRFKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHNzcC0+c21rX2xhYmVsZWQgIT0gU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVCkKKwkJcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19VTkxBQkVMRURfU09DS0VUKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yMTAxLDggKzIyMjcsMTQgQEAKIAlpZiAobmV3c21hY2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIE5vIHByb2Nlc3MgaXMgZXZlciBhbGxvd2VkIHRoZSB3ZWIgKCJAIikgbGFiZWwuCisJICovCisJaWYgKG5ld3NtYWNrID09IHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24pCisJCXJldHVybiAtRVBFUk07CisKIAluZXcgPSBwcmVwYXJlX2NyZWRzKCk7Ci0JaWYgKCFuZXcpCisJaWYgKG5ldyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAluZXctPnNlY3VyaXR5ID0gbmV3c21hY2s7CiAJY29tbWl0X2NyZWRzKG5ldyk7CkBAIC0yMTQ0LDYgKzIyNzYsNDkgQEAKIH0KIAogLyoqCisgKiBzbWFja19zb2NrZXRfc2VuZG1zZyAtIFNtYWNrIGNoZWNrIGJhc2VkIG9uIGRlc3RpbmF0aW9uIGhvc3QKKyAqIEBzb2NrOiB0aGUgc29ja2V0CisgKiBAbXNnaGRyOiB0aGUgbWVzc2FnZQorICogQHNpemU6IHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlCisgKgorICogUmV0dXJuIDAgaWYgdGhlIGN1cnJlbnQgc3ViamVjdCBjYW4gd3JpdGUgdG8gdGhlIGRlc3RpbmF0aW9uCisgKiBob3N0LiBUaGlzIGlzIG9ubHkgYSBxdWVzdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gaXMgYSBzaW5nbGUKKyAqIGxhYmVsIGhvc3QuCisgKi8KK3N0YXRpYyBpbnQgc21hY2tfc29ja2V0X3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJCWludCBzaXplKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2lwID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBtc2ctPm1zZ19uYW1lOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwljaGFyICpob3N0c3A7CisJaW50IHJjOworCisJLyoKKwkgKiBQZXJmZWN0bHkgcmVhc29uYWJsZSBmb3IgdGhpcyB0byBiZSBOVUxMCisJICovCisJaWYgKHNpcCA9PSBOVUxMIHx8IHNpcC0+c2luX2ZhbWlseSAhPSBQRl9JTkVUKQorCQlyZXR1cm4gMDsKKworCWhvc3RzcCA9IHNtYWNrX2hvc3RfbGFiZWwoc2lwKTsKKwlpZiAoaG9zdHNwID09IE5VTEwpIHsKKwkJaWYgKHNzcC0+c21rX2xhYmVsZWQgIT0gU01BQ0tfQ0lQU09fU09DS0VUKQorCQkJcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IHNta19hY2Nlc3Moc3NwLT5zbWtfb3V0LCBob3N0c3AsIE1BWV9XUklURSk7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKworCWlmIChzc3AtPnNta19sYWJlbGVkICE9IFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQpCisJCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVCk7CisKKwlyZXR1cm4gMDsKKworfQorCisKKy8qKgogICogc21hY2tfZnJvbV9zZWNhdHRyIC0gQ29udmVydCBhIG5ldGxhYmVsIGF0dHIubWxzLmx2bC9hdHRyLm1scy5jYXQKICAqIAlwYWlyIHRvIHNtYWNrCiAgKiBAc2FwOiBuZXRsYWJlbCBzZWNhdHRyCkBAIC0yMTU0LDQ0ICsyMzI5LDY2IEBACiBzdGF0aWMgdm9pZCBzbWFja19mcm9tX3NlY2F0dHIoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2FwLCBjaGFyICpzaXApCiB7CiAJY2hhciBzbWFja1tTTUtfTEFCRUxMRU5dOworCWNoYXIgKnNwOwogCWludCBwY2F0OwogCi0JaWYgKChzYXAtPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTCkgPT0gMCkgeworCWlmICgoc2FwLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpICE9IDApIHsKIAkJLyoKKwkJICogTG9va3MgbGlrZSBhIENJUFNPIHBhY2tldC4KIAkJICogSWYgdGhlcmUgYXJlIGZsYWdzIGJ1dCBubyBsZXZlbCBuZXRsYWJlbCBpc24ndAogCQkgKiBiZWhhdmluZyB0aGUgd2F5IHdlIGV4cGVjdCBpdCB0by4KIAkJICoKKwkJICogR2V0IHRoZSBjYXRlZ29yaWVzLCBpZiBhbnkKIAkJICogV2l0aG91dCBndWlkYW5jZSByZWdhcmRpbmcgdGhlIHNtYWNrIHZhbHVlCiAJCSAqIGZvciB0aGUgcGFja2V0IGZhbGwgYmFjayBvbiB0aGUgbmV0d29yawogCQkgKiBhbWJpZW50IHZhbHVlLgogCQkgKi8KLQkJc3RybmNweShzaXAsIHNtYWNrX25ldF9hbWJpZW50LCBTTUtfTUFYTEVOKTsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIEdldCB0aGUgY2F0ZWdvcmllcywgaWYgYW55Ci0JICovCi0JbWVtc2V0KHNtYWNrLCAnXDAnLCBTTUtfTEFCRUxMRU4pOwotCWlmICgoc2FwLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19DQVQpICE9IDApCi0JCWZvciAocGNhdCA9IC0xOzspIHsKLQkJCXBjYXQgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzYXAtPmF0dHIubWxzLmNhdCwKLQkJCQkJCQkgIHBjYXQgKyAxKTsKLQkJCWlmIChwY2F0IDwgMCkKLQkJCQlicmVhazsKLQkJCXNtYWNrX2NhdHNldF9iaXQocGNhdCwgc21hY2spOworCQltZW1zZXQoc21hY2ssICdcMCcsIFNNS19MQUJFTExFTik7CisJCWlmICgoc2FwLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19DQVQpICE9IDApCisJCQlmb3IgKHBjYXQgPSAtMTs7KSB7CisJCQkJcGNhdCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKAorCQkJCQlzYXAtPmF0dHIubWxzLmNhdCwgcGNhdCArIDEpOworCQkJCWlmIChwY2F0IDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJc21hY2tfY2F0c2V0X2JpdChwY2F0LCBzbWFjayk7CisJCQl9CisJCS8qCisJCSAqIElmIGl0IGlzIENJUFNPIHVzaW5nIHNtYWNrIGRpcmVjdCBtYXBwaW5nCisJCSAqIHdlIGFyZSBhbHJlYWR5IGRvbmUuIFdlZUhlZS4KKwkJICovCisJCWlmIChzYXAtPmF0dHIubWxzLmx2bCA9PSBzbWFja19jaXBzb19kaXJlY3QpIHsKKwkJCW1lbWNweShzaXAsIHNtYWNrLCBTTUtfTUFYTEVOKTsKKwkJCXJldHVybjsKIAkJfQotCS8qCi0JICogSWYgaXQgaXMgQ0lQU08gdXNpbmcgc21hY2sgZGlyZWN0IG1hcHBpbmcKLQkgKiB3ZSBhcmUgYWxyZWFkeSBkb25lLiBXZWVIZWUuCi0JICovCi0JaWYgKHNhcC0+YXR0ci5tbHMubHZsID09IHNtYWNrX2NpcHNvX2RpcmVjdCkgewotCQltZW1jcHkoc2lwLCBzbWFjaywgU01LX01BWExFTik7CisJCS8qCisJCSAqIExvb2sgaXQgdXAgaW4gdGhlIHN1cHBsaWVkIHRhYmxlIGlmIGl0IGlzIG5vdAorCQkgKiBhIGRpcmVjdCBtYXBwaW5nLgorCQkgKi8KKwkJc21hY2tfZnJvbV9jaXBzbyhzYXAtPmF0dHIubWxzLmx2bCwgc21hY2ssIHNpcCk7CisJCXJldHVybjsKKwl9CisJaWYgKChzYXAtPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfU0VDSUQpICE9IDApIHsKKwkJLyoKKwkJICogTG9va3MgbGlrZSBhIGZhbGxiYWNrLCB3aGljaCBnaXZlcyB1cyBhIHNlY2lkLgorCQkgKi8KKwkJc3AgPSBzbWFja19mcm9tX3NlY2lkKHNhcC0+YXR0ci5zZWNpZCk7CisJCS8qCisJCSAqIFRoaXMgaGFzIGdvdCB0byBiZSBhIGJ1ZyBiZWNhdXNlIGl0IGlzCisJCSAqIGltcG9zc2libGUgdG8gc3BlY2lmeSBhIGZhbGxiYWNrIHdpdGhvdXQKKwkJICogc3BlY2lmeWluZyB0aGUgbGFiZWwsIHdoaWNoIHdpbGwgZW5zdXJlCisJCSAqIGl0IGhhcyBhIHNlY2lkLCBhbmQgdGhlIG9ubHkgd2F5IHRvIGdldCBhCisJCSAqIHNlY2lkIGlzIGZyb20gYSBmYWxsYmFjay4KKwkJICovCisJCUJVR19PTihzcCA9PSBOVUxMKTsKKwkJc3RybmNweShzaXAsIHNwLCBTTUtfTUFYTEVOKTsKIAkJcmV0dXJuOwogCX0KIAkvKgotCSAqIExvb2sgaXQgdXAgaW4gdGhlIHN1cHBsaWVkIHRhYmxlIGlmIGl0IGlzIG5vdCBhIGRpcmVjdCBtYXBwaW5nLgorCSAqIFdpdGhvdXQgZ3VpZGFuY2UgcmVnYXJkaW5nIHRoZSBzbWFjayB2YWx1ZQorCSAqIGZvciB0aGUgcGFja2V0IGZhbGwgYmFjayBvbiB0aGUgbmV0d29yaworCSAqIGFtYmllbnQgdmFsdWUuCiAJICovCi0Jc21hY2tfZnJvbV9jaXBzbyhzYXAtPmF0dHIubWxzLmx2bCwgc21hY2ssIHNpcCk7CisJc3RybmNweShzaXAsIHNtYWNrX25ldF9hbWJpZW50LCBTTUtfTUFYTEVOKTsKIAlyZXR1cm47CiB9CiAKQEAgLTIyMDcsNiArMjQwNCw3IEBACiAJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOwogCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNrLT5za19zZWN1cml0eTsKIAljaGFyIHNtYWNrW1NNS19MQUJFTExFTl07CisJY2hhciAqY3NwOwogCWludCByYzsKIAogCWlmIChzay0+c2tfZmFtaWx5ICE9IFBGX0lORVQgJiYgc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUNikKQEAgLTIyMTUsMjEgKzI0MTMsMjQgQEAKIAkvKgogCSAqIFRyYW5zbGF0ZSB3aGF0IG5ldGxhYmVsIGdhdmUgdXMuCiAJICovCi0JbWVtc2V0KHNtYWNrLCAnXDAnLCBTTUtfTEFCRUxMRU4pOwogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOworCiAJcmMgPSBuZXRsYmxfc2tidWZmX2dldGF0dHIoc2tiLCBzay0+c2tfZmFtaWx5LCAmc2VjYXR0cik7Ci0JaWYgKHJjID09IDApCisJaWYgKHJjID09IDApIHsKIAkJc21hY2tfZnJvbV9zZWNhdHRyKCZzZWNhdHRyLCBzbWFjayk7Ci0JZWxzZQotCQlzdHJuY3B5KHNtYWNrLCBzbWFja19uZXRfYW1iaWVudCwgU01LX01BWExFTik7CisJCWNzcCA9IHNtYWNrOworCX0gZWxzZQorCQljc3AgPSBzbWFja19uZXRfYW1iaWVudDsKKwogCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCiAJLyoKIAkgKiBSZWNlaXZpbmcgYSBwYWNrZXQgcmVxdWlyZXMgdGhhdCB0aGUgb3RoZXIgZW5kCiAJICogYmUgYWJsZSB0byB3cml0ZSBoZXJlLiBSZWFkIGFjY2VzcyBpcyBub3QgcmVxdWlyZWQuCiAJICogVGhpcyBpcyB0aGUgc2ltcGxpc3QgcG9zc2libGUgc2VjdXJpdHkgbW9kZWwKIAkgKiBmb3IgbmV0d29ya2luZy4KIAkgKi8KLQlyYyA9IHNta19hY2Nlc3Moc21hY2ssIHNzcC0+c21rX2luLCBNQVlfV1JJVEUpOworCXJjID0gc21rX2FjY2Vzcyhjc3AsIHNzcC0+c21rX2luLCBNQVlfV1JJVEUpOwogCWlmIChyYyAhPSAwKQogCQluZXRsYmxfc2tidWZmX2Vycihza2IsIHJjLCAwKTsKIAlyZXR1cm4gcmM7CkBAIC0yMjk4LDcgKzI0OTksNiBAQAogCS8qCiAJICogVHJhbnNsYXRlIHdoYXQgbmV0bGFiZWwgZ2F2ZSB1cy4KIAkgKi8KLQltZW1zZXQoc21hY2ssICdcMCcsIFNNS19MQUJFTExFTik7CiAJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CiAJcmMgPSBuZXRsYmxfc2tidWZmX2dldGF0dHIoc2tiLCBmYW1pbHksICZzZWNhdHRyKTsKIAlpZiAocmMgPT0gMCkKQEAgLTIzNDEsNyArMjU0MSw3IEBACiAJc3NwLT5zbWtfaW4gPSBzc3AtPnNta19vdXQgPSBjdXJyZW50X3NlY3VyaXR5KCk7CiAJc3NwLT5zbWtfcGFja2V0WzBdID0gJ1wwJzsKIAotCXJjID0gc21hY2tfbmV0bGFiZWwoc2spOworCXJjID0gc21hY2tfbmV0bGFiZWwoc2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7CiAJaWYgKHJjICE9IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNtYWNrOiBcIiVzXCIgbmV0bGJsIGVycm9yICVkLlxuIiwKIAkJICAgICAgIF9fZnVuY19fLCAtcmMpOwpAQCAtMjM2Nyw3ICsyNTY3LDYgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JbWVtc2V0KHNtYWNrLCAnXDAnLCBTTUtfTEFCRUxMRU4pOwogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNrYl9zZWNhdHRyKTsKIAlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsIHNrLT5za19mYW1pbHksICZza2Jfc2VjYXR0cik7CiAJaWYgKHJjID09IDApCkBAIC0yNzMyLDYgKzI5MzEsOCBAQAogCS51bml4X21heV9zZW5kID0gCQlzbWFja191bml4X21heV9zZW5kLAogCiAJLnNvY2tldF9wb3N0X2NyZWF0ZSA9IAkJc21hY2tfc29ja2V0X3Bvc3RfY3JlYXRlLAorCS5zb2NrZXRfY29ubmVjdCA9CQlzbWFja19zb2NrZXRfY29ubmVjdCwKKwkuc29ja2V0X3NlbmRtc2cgPQkJc21hY2tfc29ja2V0X3NlbmRtc2csCiAJLnNvY2tldF9zb2NrX3Jjdl9za2IgPSAJCXNtYWNrX3NvY2tldF9zb2NrX3Jjdl9za2IsCiAJLnNvY2tldF9nZXRwZWVyc2VjX3N0cmVhbSA9CXNtYWNrX3NvY2tldF9nZXRwZWVyc2VjX3N0cmVhbSwKIAkuc29ja2V0X2dldHBlZXJzZWNfZGdyYW0gPQlzbWFja19zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbSwKQEAgLTI3ODMsNyArMjk4NCw2IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIGxvY2tzCiAJICovCi0Jc3Bpbl9sb2NrX2luaXQoJnNtYWNrX2tub3duX3Vuc2V0LnNta19jaXBzb2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzbWFja19rbm93bl9odWguc21rX2NpcHNvbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnNtYWNrX2tub3duX2hhdC5zbWtfY2lwc29sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc21hY2tfa25vd25fc3Rhci5zbWtfY2lwc29sb2NrKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwppbmRleCAyNDdkYzllLi5iZjEwN2EzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRsYWJlbC5oPgogI2luY2x1ZGUgPG5ldC9jaXBzb19pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIAlTTUtfRE9JCQk9IDUsCS8qIENJUFNPIERPSSAqLwogCVNNS19ESVJFQ1QJPSA2LAkvKiBDSVBTTyBsZXZlbCBpbmRpY2F0aW5nIGRpcmVjdCBsYWJlbCAqLwogCVNNS19BTUJJRU5UCT0gNywJLyogaW50ZXJuZXQgYW1iaWVudCBsYWJlbCAqLwotCVNNS19OTFRZUEUJPSA4LAkvKiBsYWJlbCBzY2hlbWUgdG8gdXNlIGJ5IGRlZmF1bHQgKi8KKwlTTUtfTkVUTEJMQUREUgk9IDgsCS8qIHNpbmdsZSBsYWJlbCBob3N0cyAqLwogCVNNS19PTkxZQ0FQCT0gOSwJLyogdGhlIG9ubHkgImNhcGFibGUiIGxhYmVsICovCiB9OwogCkBAIC00OCw2ICs0OSw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKHNtYWNrX2xpc3RfbG9jayk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHNtYWNrX2NpcHNvX2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChzbWFja19hbWJpZW50X2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChzbWtfbmV0bGJsYWRkcl9sb2NrKTsKIAogLyoKICAqIFRoaXMgaXMgdGhlICJhbWJpZW50IiBsYWJlbCBmb3IgbmV0d29yayB0cmFmZmljLgpAQCAtNTcsMTIgKzU5LDYgQEAKIGNoYXIgKnNtYWNrX25ldF9hbWJpZW50ID0gc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duOwogCiAvKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBwYWNrZXQgbWFya2luZyBzY2hlbWUgZm9yIG5ldHdvcmsgdHJhZmZpYy4KLSAqIEl0IGNhbiBiZSByZXNldCB2aWEgc21hY2tmcy9ubHR5cGUKLSAqLwotaW50IHNtYWNrX25ldF9ubHR5cGUgPSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ7Ci0KLS8qCiAgKiBUaGlzIGlzIHRoZSBsZXZlbCBpbiBhIENJUFNPIGhlYWRlciB0aGF0IGluZGljYXRlcyBhCiAgKiBzbWFjayBsYWJlbCBpcyBjb250YWluZWQgZGlyZWN0bHkgaW4gdGhlIGNhdGVnb3J5IHNldC4KICAqIEl0IGNhbiBiZSByZXNldCB2aWEgc21hY2tmcy9kaXJlY3QKQEAgLTc5LDYgKzc1LDEzIEBACiAgKi8KIGNoYXIgKnNtYWNrX29ubHljYXA7CiAKKy8qCisgKiBDZXJ0YWluIElQIGFkZHJlc3NlcyBtYXkgYmUgZGVzaWduYXRlZCBhcyBzaW5nbGUgbGFiZWwgaG9zdHMuCisgKiBQYWNrZXRzIGFyZSBzZW50IHRoZXJlIHVubGFiZWxlZCwgYnV0IG9ubHkgZnJvbSB0YXNrcyB0aGF0CisgKiBjYW4gd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBsYWJlbC4KKyAqLworc3RydWN0IHNta19uZXRsYmxhZGRyICpzbWFja19uZXRsYmxhZGRyczsKKwogc3RhdGljIGludCBzbWtfY2lwc29fZG9pX3ZhbHVlID0gU01BQ0tfQ0lQU09fRE9JX0RFRkFVTFQ7CiBzdHJ1Y3Qgc21rX2xpc3RfZW50cnkgKnNtYWNrX2xpc3Q7CiAKQEAgLTEwNCw2ICsxMDcsMjQgQEAKICNkZWZpbmUgU01LX0FDQ0VTU0xFTiAoc2l6ZW9mKFNNS19BQ0NFU1MpIC0gMSkKICNkZWZpbmUgU01LX0xPQURMRU4gICAoU01LX0xBQkVMTEVOICsgU01LX0xBQkVMTEVOICsgU01LX0FDQ0VTU0xFTikKIAorLyoqCisgKiBzbWtfbmV0bGFiZWxfYXVkaXRfc2V0IC0gZmlsbCBhIG5ldGxibF9hdWRpdCBzdHJ1Y3QKKyAqIEBuYXA6IHN0cnVjdHVyZSB0byBmaWxsCisgKi8KK3N0YXRpYyB2b2lkIHNta19uZXRsYWJlbF9hdWRpdF9zZXQoc3RydWN0IG5ldGxibF9hdWRpdCAqbmFwKQoreworCW5hcC0+bG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7CisJbmFwLT5zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOworCW5hcC0+c2VjaWQgPSBzbWFja190b19zZWNpZChjdXJyZW50X3NlY3VyaXR5KCkpOworfQorCisvKgorICogVmFsdWVzIGZvciBwYXJzaW5nIHNpbmdsZSBsYWJlbCBob3N0IHJ1bGVzCisgKiAiMS4yLjMuNCBYIgorICogIjE5Mi4xNjguMTM4LjEyOS8zMiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2dyIKKyAqLworI2RlZmluZSBTTUtfTkVUTEJMQUREUk1JTgk5CisjZGVmaW5lIFNNS19ORVRMQkxBRERSTUFYCTQyCiAKIC8qCiAgKiBTZXFfZmlsZSByZWFkIG9wZXJhdGlvbnMgZm9yIC9zbWFjay9sb2FkCkBAIC0zNDQsMTMgKzM2NSwxMSBAQAogewogCWludCByYzsKIAlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lwOwotCXN0cnVjdCBuZXRsYmxfYXVkaXQgYXVkaXRfaW5mbzsKKwlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IG5haTsKIAotCWF1ZGl0X2luZm8ubG9naW51aWQgPSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZXNzaW9uaWQgPSBhdWRpdF9nZXRfc2Vzc2lvbmlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2VjaWQgPSBzbWFja190b19zZWNpZChjdXJyZW50X3NlY3VyaXR5KCkpOworCXNta19uZXRsYWJlbF9hdWRpdF9zZXQoJm5haSk7CiAKLQlyYyA9IG5ldGxibF9jZmdfbWFwX2RlbChOVUxMLCAmYXVkaXRfaW5mbyk7CisJcmMgPSBuZXRsYmxfY2ZnX21hcF9kZWwoTlVMTCwgUEZfSU5FVCwgTlVMTCwgTlVMTCwgJm5haSk7CiAJaWYgKHJjICE9IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIHJlbW92ZSByYyA9ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CkBAIC0zNjUsMTEgKzM4NCwxOSBAQAogCWZvciAocmMgPSAxOyByYyA8IENJUFNPX1Y0X1RBR19NQVhDTlQ7IHJjKyspCiAJCWRvaXAtPnRhZ3NbcmNdID0gQ0lQU09fVjRfVEFHX0lOVkFMSUQ7CiAKLQlyYyA9IG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwKGRvaXAsIE5VTEwsICZhdWRpdF9pbmZvKTsKKwlyYyA9IG5ldGxibF9jZmdfY2lwc292NF9hZGQoZG9pcCwgJm5haSk7CiAJaWYgKHJjICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgYWRkIHJjID0gJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIGNpcHNvIGFkZCByYyA9ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CiAJCWtmcmVlKGRvaXApOworCQlyZXR1cm47CisJfQorCXJjID0gbmV0bGJsX2NmZ19jaXBzb3Y0X21hcF9hZGQoZG9pcC0+ZG9pLCBOVUxMLCBOVUxMLCBOVUxMLCAmbmFpKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCBtYXAgYWRkIHJjID0gJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKKwkJa2ZyZWUoZG9pcCk7CisJCXJldHVybjsKIAl9CiB9CiAKQEAgLTM3OSwyMCArNDA2LDE5IEBACiBzdGF0aWMgdm9pZCBzbWtfdW5sYmxfYW1iaWVudChjaGFyICpvbGRhbWJpZW50KQogewogCWludCByYzsKLQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CisJc3RydWN0IG5ldGxibF9hdWRpdCBuYWk7CiAKLQlhdWRpdF9pbmZvLmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlY2lkID0gc21hY2tfdG9fc2VjaWQoY3VycmVudF9zZWN1cml0eSgpKTsKKwlzbWtfbmV0bGFiZWxfYXVkaXRfc2V0KCZuYWkpOwogCiAJaWYgKG9sZGFtYmllbnQgIT0gTlVMTCkgewotCQlyYyA9IG5ldGxibF9jZmdfbWFwX2RlbChvbGRhbWJpZW50LCAmYXVkaXRfaW5mbyk7CisJCXJjID0gbmV0bGJsX2NmZ19tYXBfZGVsKG9sZGFtYmllbnQsIFBGX0lORVQsIE5VTEwsIE5VTEwsICZuYWkpOwogCQlpZiAocmMgIT0gMCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIHJlbW92ZSByYyA9ICVkXG4iLAogCQkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwogCX0KIAotCXJjID0gbmV0bGJsX2NmZ191bmxibF9hZGRfbWFwKHNtYWNrX25ldF9hbWJpZW50LCAmYXVkaXRfaW5mbyk7CisJcmMgPSBuZXRsYmxfY2ZnX3VubGJsX21hcF9hZGQoc21hY2tfbmV0X2FtYmllbnQsIFBGX0lORVQsCisJCQkJICAgICAgTlVMTCwgTlVMTCwgJm5haSk7CiAJaWYgKHJjICE9IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIGFkZCByYyA9ICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CkBAIC02MDMsNiArNjI5LDIwMSBAQAogCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAogfTsKIAorLyoKKyAqIFNlcV9maWxlIHJlYWQgb3BlcmF0aW9ucyBmb3IgL3NtYWNrL25ldGxhYmVsCisgKi8KKworc3RhdGljIHZvaWQgKm5ldGxibGFkZHJfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCit7CisJaWYgKCpwb3MgPT0gU0VRX1JFQURfRklOSVNIRUQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHNtYWNrX25ldGxibGFkZHJzOworfQorCitzdGF0aWMgdm9pZCAqbmV0bGJsYWRkcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twID0gKChzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKikgdiktPnNta19uZXh0OworCisJaWYgKHNrcCA9PSBOVUxMKQorCQkqcG9zID0gU0VRX1JFQURfRklOSVNIRUQ7CisKKwlyZXR1cm4gc2twOworfQorLyoKKyNkZWZpbmUgQkVNQVNLCTB4ODAwMDAwMDAKKyovCisjZGVmaW5lIEJFTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIEJFQklUUwkoc2l6ZW9mKF9fYmUzMikgKiA4KQorCisvKgorICogUHJpbnQgaG9zdC9sYWJlbCBwYWlycworICovCitzdGF0aWMgaW50IG5ldGxibGFkZHJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twID0gKHN0cnVjdCBzbWtfbmV0bGJsYWRkciAqKSB2OworCXVuc2lnbmVkIGNoYXIgKmhwID0gKGNoYXIgKikgJnNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyOworCV9fYmUzMiBiZWJpdHM7CisJaW50IG1hc2tuID0gMDsKKworCWZvciAoYmViaXRzID0gQkVNQVNLOyBiZWJpdHMgIT0gMDsgbWFza24rKywgYmViaXRzIDw8PSAxKQorCQlpZiAoKHNrcC0+c21rX21hc2suc19hZGRyICYgYmViaXRzKSA9PSAwKQorCQkJYnJlYWs7CisKKwlzZXFfcHJpbnRmKHMsICIldS4ldS4ldS4ldS8lZCAlc1xuIiwKKwkJaHBbMF0sIGhwWzFdLCBocFsyXSwgaHBbM10sIG1hc2tuLCBza3AtPnNta19sYWJlbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0bGJsYWRkcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJLyogTm8tb3AgKi8KK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBuZXRsYmxhZGRyX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gbmV0bGJsYWRkcl9zZXFfc3RhcnQsCisJLnN0b3AgID0gbmV0bGJsYWRkcl9zZXFfc3RvcCwKKwkubmV4dCAgPSBuZXRsYmxhZGRyX3NlcV9uZXh0LAorCS5zaG93ICA9IG5ldGxibGFkZHJfc2VxX3Nob3csCit9OworCisvKioKKyAqIHNta19vcGVuX25ldGxibGFkZHIgLSBvcGVuKCkgZm9yIC9zbWFjay9uZXRsYWJlbAorICogQGlub2RlOiBpbm9kZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGZpbGUKKyAqIEBmaWxlOiAibmV0bGFiZWwiIGZpbGUgcG9pbnRlcgorICoKKyAqIENvbm5lY3Qgb3VyIG5ldGxibGFkZHJfc2VxXyogb3BlcmF0aW9ucyB3aXRoIC9zbWFjay9uZXRsYWJlbAorICogZmlsZV9vcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgc21rX29wZW5fbmV0bGJsYWRkcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm5ldGxibGFkZHJfc2VxX29wcyk7Cit9CisKKy8qKgorICogc21rX3dyaXRlX25ldGxibGFkZHIgLSB3cml0ZSgpIGZvciAvc21hY2svbmV0bGFiZWwKKyAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCisgKiBAYnVmOiB3aGVyZSB0byBnZXQgdGhlIGRhdGEgZnJvbQorICogQGNvdW50OiBieXRlcyBzZW50CisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBBY2NlcHRzIG9ubHkgb25lIG5ldGxibGFkZHIgcGVyIHdyaXRlIGNhbGwuCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta193cml0ZV9uZXRsYmxhZGRyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twOworCXN0cnVjdCBzb2NrYWRkcl9pbiBuZXduYW1lOworCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKKwljaGFyICpzcDsKKwljaGFyIGRhdGFbU01LX05FVExCTEFERFJNQVhdOworCWNoYXIgKmhvc3QgPSAoY2hhciAqKSZuZXduYW1lLnNpbl9hZGRyLnNfYWRkcjsKKwlpbnQgcmM7CisJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOworCXN0cnVjdCBpbl9hZGRyIG1hc2s7CisJdW5zaWduZWQgaW50IG07CisJX19iZTMyIGJlYml0cyA9IEJFTUFTSzsKKwlfX2JlMzIgbnNhOworCisJLyoKKwkgKiBNdXN0IGhhdmUgcHJpdmlsZWdlLgorCSAqIE5vIHBhcnRpYWwgd3JpdGVzLgorCSAqIEVub3VnaCBkYXRhIG11c3QgYmUgcHJlc2VudC4KKwkgKiAiPGFkZHIvbWFzaywgYXMgYS5iLmMuZC9lPjxzcGFjZT48bGFiZWw+IgorCSAqICI8YWRkciwgYXMgYS5iLmMuZD48c3BhY2U+PGxhYmVsPiIKKwkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3VudCA8IFNNS19ORVRMQkxBRERSTUlOIHx8IGNvdW50ID4gU01LX05FVExCTEFERFJNQVgpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRhdGFbY291bnRdID0gJ1wwJzsKKworCXJjID0gc3NjYW5mKGRhdGEsICIlaGhkLiVoaGQuJWhoZC4laGhkLyVkICVzIiwKKwkJJmhvc3RbMF0sICZob3N0WzFdLCAmaG9zdFsyXSwgJmhvc3RbM10sICZtLCBzbWFjayk7CisJaWYgKHJjICE9IDYpIHsKKwkJcmMgPSBzc2NhbmYoZGF0YSwgIiVoaGQuJWhoZC4laGhkLiVoaGQgJXMiLAorCQkJJmhvc3RbMF0sICZob3N0WzFdLCAmaG9zdFsyXSwgJmhvc3RbM10sIHNtYWNrKTsKKwkJaWYgKHJjICE9IDUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbSA9IEJFQklUUzsKKwl9CisJaWYgKG0gPiBCRUJJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3AgPSBzbWtfaW1wb3J0KHNtYWNrLCAwKTsKKwlpZiAoc3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKG1hc2suc19hZGRyID0gMDsgbSA+IDA7IG0tLSkgeworCQltYXNrLnNfYWRkciB8PSBiZWJpdHM7CisJCWJlYml0cyA8PD0gMTsKKwl9CisJLyoKKwkgKiBPbmx5IGFsbG93IG9uZSB3cml0ZXIgYXQgYSB0aW1lLiBXcml0ZXMgc2hvdWxkIGJlCisJICogcXVpdGUgcmFyZSBhbmQgc21hbGwgaW4gYW55IGNhc2UuCisJICovCisJbXV0ZXhfbG9jaygmc21rX25ldGxibGFkZHJfbG9jayk7CisKKwluc2EgPSBuZXduYW1lLnNpbl9hZGRyLnNfYWRkcjsKKwlmb3IgKHNrcCA9IHNtYWNrX25ldGxibGFkZHJzOyBza3AgIT0gTlVMTDsgc2twID0gc2twLT5zbWtfbmV4dCkKKwkJaWYgKHNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyID09IG5zYSAmJgorCQkgICAgc2twLT5zbWtfbWFzay5zX2FkZHIgPT0gbWFzay5zX2FkZHIpCisJCQlicmVhazsKKworCXNta19uZXRsYWJlbF9hdWRpdF9zZXQoJmF1ZGl0X2luZm8pOworCisJaWYgKHNrcCA9PSBOVUxMKSB7CisJCXNrcCA9IGt6YWxsb2Moc2l6ZW9mKCpza3ApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNrcCA9PSBOVUxMKQorCQkJcmMgPSAtRU5PTUVNOworCQllbHNlIHsKKwkJCXJjID0gMDsKKwkJCXNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyID0gbmV3bmFtZS5zaW5fYWRkci5zX2FkZHI7CisJCQlza3AtPnNta19tYXNrLnNfYWRkciA9IG1hc2suc19hZGRyOworCQkJc2twLT5zbWtfbmV4dCA9IHNtYWNrX25ldGxibGFkZHJzOworCQkJc2twLT5zbWtfbGFiZWwgPSBzcDsKKwkJCXNtYWNrX25ldGxibGFkZHJzID0gc2twOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoJmluaXRfbmV0LCBOVUxMLAorCQkJJnNrcC0+c21rX2hvc3Quc2luX2FkZHIsICZza3AtPnNta19tYXNrLAorCQkJUEZfSU5FVCwgJmF1ZGl0X2luZm8pOworCQlza3AtPnNta19sYWJlbCA9IHNwOworCX0KKworCS8qCisJICogTm93IHRlbGwgbmV0bGFiZWwgYWJvdXQgdGhlIHNpbmdsZSBsYWJlbCBuYXR1cmUgb2YKKwkgKiB0aGlzIGhvc3Qgc28gdGhhdCBpbmNvbWluZyBwYWNrZXRzIGdldCBsYWJlbGVkLgorCSAqLworCisJaWYgKHJjID09IDApCisJCXJjID0gbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfYWRkKCZpbml0X25ldCwgTlVMTCwKKwkJCSZza3AtPnNta19ob3N0LnNpbl9hZGRyLCAmc2twLT5zbWtfbWFzaywgUEZfSU5FVCwKKwkJCXNtYWNrX3RvX3NlY2lkKHNrcC0+c21rX2xhYmVsKSwgJmF1ZGl0X2luZm8pOworCisJaWYgKHJjID09IDApCisJCXJjID0gY291bnQ7CisKKwltdXRleF91bmxvY2soJnNta19uZXRsYmxhZGRyX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWtfbmV0bGJsYWRkcl9vcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gc21rX29wZW5fbmV0bGJsYWRkciwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLndyaXRlCQk9IHNta193cml0ZV9uZXRsYmxhZGRyLAorCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAorfTsKKwogLyoqCiAgKiBzbWtfcmVhZF9kb2kgLSByZWFkKCkgZm9yIC9zbWFjay9kb2kKICAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCkBAIC04OTEsMTEwICsxMTEyLDYgQEAKIAkud3JpdGUJCT0gc21rX3dyaXRlX29ubHljYXAsCiB9OwogCi1zdHJ1Y3Qgb3B0aW9uX25hbWVzIHsKLQlpbnQJb19udW1iZXI7Ci0JY2hhcgkqb19uYW1lOwotCWNoYXIJKm9fYWxpYXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbl9uYW1lcyBuZXRsYmxfY2hvaWNlc1tdID0gewotCXsgTkVUTEJMX05MVFlQRV9SSVBTTywKLQkJTkVUTEJMX05MVFlQRV9SSVBTT19OQU1FLAkicmlwc28iIH0sCi0JeyBORVRMQkxfTkxUWVBFX0NJUFNPVjQsCi0JCU5FVExCTF9OTFRZUEVfQ0lQU09WNF9OQU1FLAkiY2lwc292NCIgfSwKLQl7IE5FVExCTF9OTFRZUEVfQ0lQU09WNCwKLQkJTkVUTEJMX05MVFlQRV9DSVBTT1Y0X05BTUUsCSJjaXBzbyIgfSwKLQl7IE5FVExCTF9OTFRZUEVfQ0lQU09WNiwKLQkJTkVUTEJMX05MVFlQRV9DSVBTT1Y2X05BTUUsCSJjaXBzb3Y2IiB9LAotCXsgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQsCi0JCU5FVExCTF9OTFRZUEVfVU5MQUJFTEVEX05BTUUsCSJ1bmxhYmVsZWQiIH0sCi19OwotCi0vKioKLSAqIHNta19yZWFkX25sdHlwZSAtIHJlYWQoKSBmb3IgL3NtYWNrL25sdHlwZQotICogQGZpbHA6IGZpbGUgcG9pbnRlciwgbm90IGFjdHVhbGx5IHVzZWQKLSAqIEBidWY6IHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0Ci0gKiBAY291bnQ6IG1heGltdW0gdG8gc2VuZCBhbG9uZwotICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0Ci0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQotICovCi1zdGF0aWMgc3NpemVfdCBzbWtfcmVhZF9ubHR5cGUoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBib3VuZFs0MF07Ci0Jc3NpemVfdCByYzsKLQlpbnQgaTsKLQotCWlmIChjb3VudCA8IFNNS19MQUJFTExFTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKnBwb3MgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlzcHJpbnRmKGJvdW5kLCAidW5rbm93biIpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmV0bGJsX2Nob2ljZXMpOyBpKyspCi0JCWlmIChzbWFja19uZXRfbmx0eXBlID09IG5ldGxibF9jaG9pY2VzW2ldLm9fbnVtYmVyKSB7Ci0JCQlzcHJpbnRmKGJvdW5kLCAiJXMiLCBuZXRsYmxfY2hvaWNlc1tpXS5vX25hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCXJjID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYm91bmQsIHN0cmxlbihib3VuZCkpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIHNta193cml0ZV9ubHR5cGUgLSB3cml0ZSgpIGZvciAvc21hY2svbmx0eXBlCi0gKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZAotICogQGJ1Zjogd2hlcmUgdG8gZ2V0IHRoZSBkYXRhIGZyb20KLSAqIEBjb3VudDogYnl0ZXMgc2VudAotICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0Ci0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQotICovCi1zdGF0aWMgc3NpemVfdCBzbWtfd3JpdGVfbmx0eXBlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgYm91bmRbNDBdOwotCWNoYXIgKmNwOwotCWludCBpOwotCi0JaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGNvdW50ID49IDQwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihib3VuZCwgYnVmLCBjb3VudCkgIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlib3VuZFtjb3VudF0gPSAnXDAnOwotCWNwID0gc3RyY2hyKGJvdW5kLCAnICcpOwotCWlmIChjcCAhPSBOVUxMKQotCQkqY3AgPSAnXDAnOwotCWNwID0gc3RyY2hyKGJvdW5kLCAnXG4nKTsKLQlpZiAoY3AgIT0gTlVMTCkKLQkJKmNwID0gJ1wwJzsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldGxibF9jaG9pY2VzKTsgaSsrKQotCQlpZiAoc3RyY21wKGJvdW5kLCBuZXRsYmxfY2hvaWNlc1tpXS5vX25hbWUpID09IDAgfHwKLQkJICAgIHN0cmNtcChib3VuZCwgbmV0bGJsX2Nob2ljZXNbaV0ub19hbGlhcykgPT0gMCkgewotCQkJc21hY2tfbmV0X25sdHlwZSA9IG5ldGxibF9jaG9pY2VzW2ldLm9fbnVtYmVyOwotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JLyoKLQkgKiBOb3QgYSB2YWxpZCBjaG9pY2UuCi0JICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNta19ubHR5cGVfb3BzID0gewotCS5yZWFkCQk9IHNta19yZWFkX25sdHlwZSwKLQkud3JpdGUJCT0gc21rX3dyaXRlX25sdHlwZSwKLX07Ci0KIC8qKgogICogc21rX2ZpbGxfc3VwZXIgLSBmaWxsIHRoZSAvc21hY2tmcyBzdXBlcmJsb2NrCiAgKiBAc2I6IHRoZSBlbXB0eSBzdXBlcmJsb2NrCkBAIC0xMDIxLDggKzExMzgsOCBAQAogCQkJeyJkaXJlY3QiLCAmc21rX2RpcmVjdF9vcHMsIFNfSVJVR098U19JV1VTUn0sCiAJCVtTTUtfQU1CSUVOVF0JPQogCQkJeyJhbWJpZW50IiwgJnNta19hbWJpZW50X29wcywgU19JUlVHT3xTX0lXVVNSfSwKLQkJW1NNS19OTFRZUEVdCT0KLQkJCXsibmx0eXBlIiwgJnNta19ubHR5cGVfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAorCQlbU01LX05FVExCTEFERFJdID0KKwkJCXsibmV0bGFiZWwiLCAmc21rX25ldGxibGFkZHJfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQlbU01LX09OTFlDQVBdCT0KIAkJCXsib25seWNhcCIsICZzbWtfb25seWNhcF9vcHMsIFNfSVJVR098U19JV1VTUn0sCiAJCS8qIGxhc3Qgb25lICovIHsiIn0KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYwppbmRleCBlZjY1MzllLi4zNWFmZDBjIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCkBAIC0zMjEsMTAgKzMyMSw2IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIDAsICJBQzk3IiwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCiAJaWYgKGNwdV9pc19weGEyNXgoKSB8fCBjcHVfaXNfcHhhMjd4KCkpIHsKIAkJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKIAkJcHhhX2dwaW9fbW9kZShHUElPMzBfU0RBVEFfT1VUX0FDOTdfTUQpOwpAQCAtMzM5LDcgKzMzNSw3IEBACiAJCWlmIChJU19FUlIoYWM5N2NvbmZfY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihhYzk3Y29uZl9jbGspOwogCQkJYWM5N2NvbmZfY2xrID0gTlVMTDsKLQkJCWdvdG8gZXJyX2lycTsKKwkJCWdvdG8gZXJyX2NvbmY7CiAJCX0KIAl9CiAKQEAgLTM0NywxOSArMzQzLDMwIEBACiAJaWYgKElTX0VSUihhYzk3X2NsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihhYzk3X2Nsayk7CiAJCWFjOTdfY2xrID0gTlVMTDsKLQkJZ290byBlcnJfaXJxOworCQlnb3RvIGVycl9jbGs7CiAJfQogCi0JcmV0dXJuIGNsa19lbmFibGUoYWM5N19jbGspOworCXJldCA9IGNsa19lbmFibGUoYWM5N19jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsazI7CisKKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfQUM5NywgcHhhMnh4X2FjOTdfaXJxLCBJUlFGX0RJU0FCTEVELCAiQUM5NyIsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pcnE7CisKKwlyZXR1cm4gMDsKIAogZXJyX2lycToKIAlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CitlcnJfY2xrMjoKKwljbGtfcHV0KGFjOTdfY2xrKTsKKwlhYzk3X2NsayA9IE5VTEw7CitlcnJfY2xrOgogCWlmIChhYzk3Y29uZl9jbGspIHsKIAkJY2xrX3B1dChhYzk3Y29uZl9jbGspOwogCQlhYzk3Y29uZl9jbGsgPSBOVUxMOwogCX0KLQlmcmVlX2lycShJUlFfQUM5NywgTlVMTCk7Ci1lcnI6CitlcnJfY29uZjoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfaHdfcHJvYmUpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IDQ0YTY5YmIuLjc4NzJhMDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTE1Miw2ICsxNTIsMTAgQEAKIAl9CiAJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOwogCWZpbGUtPmZfb3AgPSBmb3BzX2dldChtcHRyLT5mX29wcyk7CisJaWYgKGZpbGUtPmZfb3AgPT0gTlVMTCkgeworCQlmaWxlLT5mX29wID0gb2xkX2ZvcHM7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlpZiAoZmlsZS0+Zl9vcC0+b3BlbikKIAkJZXJyID0gZmlsZS0+Zl9vcC0+b3Blbihpbm9kZSwgZmlsZSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL3NhbTlnMjBfd204NzMxLmMgYi9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYwppbmRleCAxZmI1OWE5Li42ZWEwNGJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYwpAQCAtMjIxLDggKzIyMSw4IEBACiAJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CiAKIAkvKiBub3QgY29ubmVjdGVkICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUkxJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxMSU5FSU4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTElORUlOIik7CiAKIAkvKiBhbHdheXMgY29ubmVjdGVkICovCiAJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJJbnQgTWljIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKaW5kZXggYzQxMjg5Yi4uZDBlMGQ2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwpAQCAtMSwzICsxLDEzIEBACisjIEhlbHBlciB0byByZXNvbHZlIGlzc3VlcyB3aXRoIGNvbmZpZ3MgdGhhdCBoYXZlIFNQSSBlbmFibGVkIGJ1dCBJMkMKKyMgbW9kdWxhciwgbWVhbmluZyB3ZSBjYW4ndCBidWlsZCB0aGUgY29kZWMgZHJpdmVyIGluIHdpdGggSTJDIHN1cHBvcnQuCisjIFdlIHVzZSBhbiBvcmRlcmVkIGxpc3Qgb2YgY29uZGl0aW9uYWwgZGVmYXVsdHMgdG8gcGljayB0aGUgYXBwcm9wcmlhdGUKKyMgc2V0dGluZyAtIFNQSSBjYW4ndCBiZSBtb2R1bGFyIHNvIHRoYXQgY2FzZSBkb2Vzbid0IG5lZWQgdG8gYmUgY292ZXJlZC4KK2NvbmZpZyBTTkRfU09DX0kyQ19BTkRfU1BJCisJdHJpc3RhdGUKKwlkZWZhdWx0IG0gaWYgSTJDPW0KKwlkZWZhdWx0IHkgaWYgSTJDPXkKKwlkZWZhdWx0IHkgaWYgU1BJX01BU1RFUj15CisKIGNvbmZpZyBTTkRfU09DX0FMTF9DT0RFQ1MKIAl0cmlzdGF0ZSAiQnVpbGQgYWxsIEFTb0MgQ09ERUMgZHJpdmVycyIKIAlzZWxlY3QgU05EX1NPQ19BQzk3X0NPREVDIGlmIFNORF9TT0NfQUM5N19CVVMKQEAgLTE0LDEyICsyNCwxMiBAQAogCXNlbGVjdCBTTkRfU09DX1VEQTEzNFgKIAlzZWxlY3QgU05EX1NPQ19VREExMzgwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODM1MCBpZiBNRkRfV004MzUwCi0Jc2VsZWN0IFNORF9TT0NfV004NTEwIGlmIChJMkMgfHwgU1BJX01BU1RFUikKKwlzZWxlY3QgU05EX1NPQ19XTTg1MTAgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODU4MCBpZiBJMkMKLQlzZWxlY3QgU05EX1NPQ19XTTg3MjggaWYgKEkyQyB8fCBTUElfTUFTVEVSKQotCXNlbGVjdCBTTkRfU09DX1dNODczMSBpZiAoSTJDIHx8IFNQSV9NQVNURVIpCi0Jc2VsZWN0IFNORF9TT0NfV004NzUwIGlmIChJMkMgfHwgU1BJX01BU1RFUikKLQlzZWxlY3QgU05EX1NPQ19XTTg3NTMgaWYgKEkyQyB8fCBTUElfTUFTVEVSKQorCXNlbGVjdCBTTkRfU09DX1dNODcyOCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfV004NzMxIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19XTTg3NTAgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1dNODc1MyBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004OTAwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODkwMyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTg5NzEgaWYgSTJDCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCmluZGV4IDMxZTQ0ZTMuLmZkMGYzMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCkBAIC0xOTIsMzkgKzE5Miw1MSBAQAogCiAvKiBFYXJwaWVjZSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfZWFycGllY2VfdGV4dHNbXSA9Ci0JCXsiT2ZmIiwgIkRBQ0wxIiwgIkRBQ0wyIiwgIkludmFsaWQiLCAiREFDUjEifTsKKwkJeyJPZmYiLCAiREFDTDEiLCAiREFDTDIiLCAiREFDUjEifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2VhcnBpZWNlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19FQVJfQ1RMLCAxLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2VhcnBpZWNlX3ZhbHVlc1tdID0KKwkJezB4MCwgMHgxLCAweDIsIDB4NH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9lYXJwaWVjZV9lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfRUFSX0NUTCwgMSwgMHg3LAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX2VhcnBpZWNlX3RleHRzKSwKLQkJCXR3bDQwMzBfZWFycGllY2VfdGV4dHMpOworCQkJdHdsNDAzMF9lYXJwaWVjZV90ZXh0cywKKwkJCXR3bDQwMzBfZWFycGllY2VfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9lYXJwaWVjZV9jb250cm9sID0KLVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9lYXJwaWVjZV9lbnVtKTsKK1NPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9lYXJwaWVjZV9lbnVtKTsKIAogLyogUHJlRHJpdmUgTGVmdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfcHJlZHJpdmVsX3RleHRzW10gPQotCQl7Ik9mZiIsICJEQUNMMSIsICJEQUNMMiIsICJJbnZhbGlkIiwgIkRBQ1IyIn07CisJCXsiT2ZmIiwgIkRBQ0wxIiwgIkRBQ0wyIiwgIkRBQ1IyIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9wcmVkcml2ZWxfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1BSRURMX0NUTCwgMSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9wcmVkcml2ZWxfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4MiwgMHg0fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfdmFsdWVfZW51bSB0d2w0MDMwX3ByZWRyaXZlbF9lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfUFJFRExfQ1RMLCAxLCAweDcsCiAJCQlBUlJBWV9TSVpFKHR3bDQwMzBfcHJlZHJpdmVsX3RleHRzKSwKLQkJCXR3bDQwMzBfcHJlZHJpdmVsX3RleHRzKTsKKwkJCXR3bDQwMzBfcHJlZHJpdmVsX3RleHRzLAorCQkJdHdsNDAzMF9wcmVkcml2ZWxfdmFsdWVzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9wcmVkcml2ZWxfY29udHJvbCA9Ci1TT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfcHJlZHJpdmVsX2VudW0pOworU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ByZWRyaXZlbF9lbnVtKTsKIAogLyogUHJlRHJpdmUgUmlnaHQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX3ByZWRyaXZlcl90ZXh0c1tdID0KLQkJeyJPZmYiLCAiREFDUjEiLCAiREFDUjIiLCAiSW52YWxpZCIsICJEQUNMMiJ9OworCQl7Ik9mZiIsICJEQUNSMSIsICJEQUNSMiIsICJEQUNMMiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcHJlZHJpdmVyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19QUkVEUl9DVEwsIDEsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR3bDQwMzBfcHJlZHJpdmVyX3ZhbHVlc1tdID0KKwkJezB4MCwgMHgxLCAweDIsIDB4NH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9wcmVkcml2ZXJfZW51bSA9CisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1BSRURSX0NUTCwgMSwgMHg3LAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX3ByZWRyaXZlcl90ZXh0cyksCi0JCQl0d2w0MDMwX3ByZWRyaXZlcl90ZXh0cyk7CisJCQl0d2w0MDMwX3ByZWRyaXZlcl90ZXh0cywKKwkJCXR3bDQwMzBfcHJlZHJpdmVyX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fcHJlZHJpdmVyX2NvbnRyb2wgPQotU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ByZWRyaXZlcl9lbnVtKTsKK1NPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9wcmVkcml2ZXJfZW51bSk7CiAKIC8qIEhlYWRzZXQgTGVmdCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfaHNvbF90ZXh0c1tdID0KQEAgLTMwMCwyOCArMzEyLDM1IEBACiAKIC8qIExlZnQgYW5hbG9nIG1pY3JvcGhvbmUgc2VsZWN0aW9uICovCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9hbmFsb2dsbWljX3RleHRzW10gPQotCQl7Ik9mZiIsICJNYWluIG1pYyIsICJIZWFkc2V0IG1pYyIsICJJbnZhbGlkIiwgIkFVWEwiLAotCQkgIkludmFsaWQiLCAiSW52YWxpZCIsICJJbnZhbGlkIiwgIkNhcmtpdCBtaWMifTsKKwkJeyJPZmYiLCAiTWFpbiBtaWMiLCAiSGVhZHNldCBtaWMiLCAiQVVYTCIsICJDYXJraXQgbWljIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9hbmFsb2dsbWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BTkFNSUNMLCAwLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2FuYWxvZ2xtaWNfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4MiwgMHg0LCAweDh9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfYW5hbG9nbG1pY19lbnVtID0KKwlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfQU5BTUlDTCwgMCwgMHhmLAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX2FuYWxvZ2xtaWNfdGV4dHMpLAotCQkJdHdsNDAzMF9hbmFsb2dsbWljX3RleHRzKTsKKwkJCXR3bDQwMzBfYW5hbG9nbG1pY190ZXh0cywKKwkJCXR3bDQwMzBfYW5hbG9nbG1pY192YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX2FuYWxvZ2xtaWNfY29udHJvbCA9Ci1TT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfYW5hbG9nbG1pY19lbnVtKTsKK1NPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9hbmFsb2dsbWljX2VudW0pOwogCiAvKiBSaWdodCBhbmFsb2cgbWljcm9waG9uZSBzZWxlY3Rpb24gKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2FuYWxvZ3JtaWNfdGV4dHNbXSA9Ci0JCXsiT2ZmIiwgIlN1YiBtaWMiLCAiSW52YWxpZCIsICJJbnZhbGlkIiwgIkFVWFIifTsKKwkJeyJPZmYiLCAiU3ViIG1pYyIsICJBVVhSIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9hbmFsb2dybWljX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BTkFNSUNSLCAwLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2FuYWxvZ3JtaWNfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4NH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9hbmFsb2dybWljX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BTkFNSUNSLCAwLCAweDUsCiAJCQlBUlJBWV9TSVpFKHR3bDQwMzBfYW5hbG9ncm1pY190ZXh0cyksCi0JCQl0d2w0MDMwX2FuYWxvZ3JtaWNfdGV4dHMpOworCQkJdHdsNDAzMF9hbmFsb2dybWljX3RleHRzLAorCQkJdHdsNDAzMF9hbmFsb2dybWljX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fYW5hbG9ncm1pY19jb250cm9sID0KLVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9hbmFsb2dybWljX2VudW0pOworU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX2FuYWxvZ3JtaWNfZW51bSk7CiAKIC8qIFRYMSBML1IgQW5hbG9nL0RpZ2l0YWwgbWljcm9waG9uZSBzZWxlY3Rpb24gKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX21pY3BhdGh0eDFfdGV4dHNbXSA9CkBAIC0zNDcsMjggKzM2Niw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX21pY3BhdGh0eDJfY29udHJvbCA9CiBTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfbWljcGF0aHR4Ml9lbnVtKTsKIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZmlsdGVycyBvdXQgdGhlIG5vbiB2YWxpZCBtdXggc2V0dGluZ3MsIG5hbWVkIGFzICJJbnZhbGlkIgotICogaW4gdGhlIGVudW0gdGV4dHMuCi0gKiBKdXN0IHJlZnVzZSB0byBzZXQgYW4gaW52YWxpZCBtdXggbW9kZS4KLSAqLwotc3RhdGljIGludCB0d2w0MDMwX2VudW1fZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHZhbDsKLQotCXZhbCA9IHctPnZhbHVlID4+IGUtPnNoaWZ0X2w7Ci0JaWYgKCFzdHJjbXAoIkludmFsaWQiLCBlLT50ZXh0c1t2YWxdKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIE1VWCBzZXR0aW5nIG9uIDB4JTAyeCAoJWQpXG4iLAotCQkJZS0+cmVnLCB2YWwpOwotCQlyZXQgPSAtMTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG1pY3BhdGhfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKQEAgLTczNywxNiArNzM0LDEzIEBACiAKIAkvKiBPdXRwdXQgTVVYIGNvbnRyb2xzICovCiAJLyogRWFycGllY2UgKi8KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkVhcnBpZWNlIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR3bDQwMzBfZGFwbV9lYXJwaWVjZV9jb250cm9sLCB0d2w0MDMwX2VudW1fZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUkVHKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJFYXJwaWVjZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZ0d2w0MDMwX2RhcG1fZWFycGllY2VfY29udHJvbCksCiAJLyogUHJlRHJpdkwvUiAqLwotCVNORF9TT0NfREFQTV9NVVhfRSgiUHJlZHJpdmVMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR3bDQwMzBfZGFwbV9wcmVkcml2ZWxfY29udHJvbCwgdHdsNDAzMF9lbnVtX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1JFRyksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJQcmVkcml2ZVIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlcl9jb250cm9sLCB0d2w0MDMwX2VudW1fZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUkVHKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJQcmVkcml2ZUwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlbF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJQcmVkcml2ZVIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlcl9jb250cm9sKSwKIAkvKiBIZWFkc2V0TC9SICovCiAJU05EX1NPQ19EQVBNX01VWCgiSGVhZHNldEwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkmdHdsNDAzMF9kYXBtX2hzb2xfY29udHJvbCksCkBAIC03ODksMTIgKzc4MywxMCBAQAogCQlTTkRfU09DX0RBUE1fUE9TVF9SRUcpLAogCiAJLyogQW5hbG9nIGlucHV0IG11eGVzIHdpdGggcG93ZXIgc3dpdGNoIGZvciB0aGUgcGh5c2ljYWwgQURDTC9SICovCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwKLQkJVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAzLCAwLCAmdHdsNDAzMF9kYXBtX2FuYWxvZ2xtaWNfY29udHJvbCwKLQkJdHdsNDAzMF9lbnVtX2V2ZW50LCBTTkRfU09DX0RBUE1fUFJFX1JFRyksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBbmFsb2cgUmlnaHQgQ2FwdHVyZSBSb3V0ZSIsCi0JCVRXTDQwMzBfUkVHX0FWQURDX0NUTCwgMSwgMCwgJnR3bDQwMzBfZGFwbV9hbmFsb2dybWljX2NvbnRyb2wsCi0JCXR3bDQwMzBfZW51bV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpLAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgoIkFuYWxvZyBMZWZ0IENhcHR1cmUgUm91dGUiLAorCQlUV0w0MDMwX1JFR19BVkFEQ19DVEwsIDMsIDAsICZ0d2w0MDMwX2RhcG1fYW5hbG9nbG1pY19jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJBbmFsb2cgUmlnaHQgQ2FwdHVyZSBSb3V0ZSIsCisJCVRXTDQwMzBfUkVHX0FWQURDX0NUTCwgMSwgMCwgJnR3bDQwMzBfZGFwbV9hbmFsb2dybWljX2NvbnRyb2wpLAogCiAJU05EX1NPQ19EQVBNX1BHQSgiQW5hbG9nIExlZnQgQW1wbGlmaWVyIiwKIAkJVFdMNDAzMF9SRUdfQU5BTUlDTCwgNCwgMCwgTlVMTCwgMCksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYwppbmRleCAwMWI5NDhiLi41NDg1MWYzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImRhdmluY2ktaTJzLmgiCiAKLSNkZWZpbmUgRVZNX0NPREVDX0NMT0NLIDIyNTc5MjAwCiAKICNkZWZpbmUgQVVESU9fRk9STUFUIChTTkRfU09DX0RBSUZNVF9EU1BfQiB8IFwKIAkJU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSB8IFNORF9TT0NfREFJRk1UX0lCX05GKQpAQCAtMzcsNiArMzYsMjEgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7CiAJaW50IHJldCA9IDA7CisJdW5zaWduZWQgc3lzY2xrOworCisJLyogQVNQMSBvbiBETTM1NSBFVk0gaXMgY2xvY2tlZCBieSBhbiBleHRlcm5hbCBvc2NpbGxhdG9yICovCisJaWYgKG1hY2hpbmVfaXNfZGF2aW5jaV9kbTM1NV9ldm0oKSkKKwkJc3lzY2xrID0gMjcwMDAwMDA7CisKKwkvKiBBU1AwIGluIERNNjQ0NiBFVk0gaXMgY2xvY2tlZCBieSBVNTUsIGFzIGNvbmZpZ3VyZWQgYnkKKwkgKiBib2FyZC1kbTY0NHgtZXZtLmMgdXNpbmcgR1BJT3MgZnJvbSBVMTguICBUaGVyZSBhcmUgc2l4CisJICogb3B0aW9uczsgaGVyZSB3ZSAia25vdyIgd2UgdXNlIGEgNDggS0h6IHNhbXBsZSByYXRlLgorCSAqLworCWVsc2UgaWYgKG1hY2hpbmVfaXNfZGF2aW5jaV9ldm0oKSkKKwkJc3lzY2xrID0gMTIyODgwMDA7CisKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIEFVRElPX0ZPUk1BVCk7CkBAIC00OSw4ICs2Myw3IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBzZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCBFVk1fQ09ERUNfQ0xPQ0ssCi0JCQkJCSAgICBTTkRfU09DX0NMT0NLX09VVCk7CisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIHN5c2NsaywgU05EX1NPQ19DTE9DS19PVVQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwppbmRleCBhN2IxZDc3Li40ZjdmMDQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKQEAgLTEwLDYgKzEwLDcgQEAKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIE5va2lhIE44MTAiCiAJZGVwZW5kcyBvbiBTTkRfT01BUF9TT0MgJiYgTUFDSF9OT0tJQV9OODEwCiAJc2VsZWN0IFNORF9PTUFQX1NPQ19NQ0JTUAorCXNlbGVjdCBPTUFQX01VWAogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzNYCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBOb2tpYSBOODEwLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDNwYW5kb3JhLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwppbmRleCBiZDkxNTk0Li5mY2MyZjVkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwpAQCAtMTgwLDYgKzE4MCwxOSBAQAogewogCWludCByZXQ7CiAKKwkvKiBBbGwgVFdMNDAzMCBvdXRwdXQgcGlucyBhcmUgZmxvYXRpbmcgKi8KKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiT1VUTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVRSIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkVBUlBJRUNFIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBSRURSSVZFTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJQUkVEUklWRVIiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSFNPTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIU09SIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVEwiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQ0FSS0lUUiIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIRkwiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSEZSIiksCisKIAlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBvbWFwM3BhbmRvcmFfaW5fZGFwbV93aWRnZXRzLAogCQkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2luX2RhcG1fd2lkZ2V0cykpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCBmNzNjMTM0Li42Y2JlN2U4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtMTU4NSw2ICsxNTg1LDExMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wdXRfZW51bV9kb3VibGUpOwogCiAvKioKKyAqIHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgaW5mbyBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgYSBkb3VibGUgc2VtaSBlbnVtZXJhdGVkCisgKiBtaXhlciBjb250cm9sLgorICoKKyAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCisgKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGUtPnNoaWZ0X2wgPT0gZS0+c2hpZnRfciA/IDEgOiAyOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gZS0+bWF4OworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiBlLT5tYXggLSAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gZS0+bWF4IC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJZS0+dGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCisgKiBzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZSAtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0IGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQgbWl4ZXIuCisgKgorICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKKyAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCByZWdfdmFsLCB2YWwsIG11eDsKKworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGUtPnJlZyk7CisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQorCQkJYnJlYWs7CisJfQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtdXg7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKKwkJCQlicmVhazsKKwkJfQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gbXV4OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlIC0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBwdXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZCBtaXhlci4KKyAqCisgKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQorICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKKwltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKKwkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCiAgKiBzbmRfc29jX2luZm9fZW51bV9leHQgLSBleHRlcm5hbCBlbnVtZXJhdGVkIHNpbmdsZSBtaXhlciBpbmZvIGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKICAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCmluZGV4IDZjNzljYTYuLmFkMGQ4MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCkBAIC01MywxMyArNTMsMTUgQEAKIC8qIGRhcG0gcG93ZXIgc2VxdWVuY2VzIC0gbWFrZSB0aGlzIHBlciBjb2RlYyBpbiB0aGUgZnV0dXJlICovCiBzdGF0aWMgaW50IGRhcG1fdXBfc2VxW10gPSB7CiAJc25kX3NvY19kYXBtX3ByZSwgc25kX3NvY19kYXBtX21pY2JpYXMsIHNuZF9zb2NfZGFwbV9taWMsCi0Jc25kX3NvY19kYXBtX211eCwgc25kX3NvY19kYXBtX2RhYywgc25kX3NvY19kYXBtX21peGVyLCBzbmRfc29jX2RhcG1fcGdhLAotCXNuZF9zb2NfZGFwbV9hZGMsIHNuZF9zb2NfZGFwbV9ocCwgc25kX3NvY19kYXBtX3Nwaywgc25kX3NvY19kYXBtX3Bvc3QKKwlzbmRfc29jX2RhcG1fbXV4LCBzbmRfc29jX2RhcG1fdmFsdWVfbXV4LCBzbmRfc29jX2RhcG1fZGFjLAorCXNuZF9zb2NfZGFwbV9taXhlciwgc25kX3NvY19kYXBtX3BnYSwgc25kX3NvY19kYXBtX2FkYywgc25kX3NvY19kYXBtX2hwLAorCXNuZF9zb2NfZGFwbV9zcGssIHNuZF9zb2NfZGFwbV9wb3N0CiB9Owogc3RhdGljIGludCBkYXBtX2Rvd25fc2VxW10gPSB7CiAJc25kX3NvY19kYXBtX3ByZSwgc25kX3NvY19kYXBtX2FkYywgc25kX3NvY19kYXBtX2hwLCBzbmRfc29jX2RhcG1fc3BrLAogCXNuZF9zb2NfZGFwbV9wZ2EsIHNuZF9zb2NfZGFwbV9taXhlciwgc25kX3NvY19kYXBtX2RhYywgc25kX3NvY19kYXBtX21pYywKLQlzbmRfc29jX2RhcG1fbWljYmlhcywgc25kX3NvY19kYXBtX211eCwgc25kX3NvY19kYXBtX3Bvc3QKKwlzbmRfc29jX2RhcG1fbWljYmlhcywgc25kX3NvY19kYXBtX211eCwgc25kX3NvY19kYXBtX3ZhbHVlX211eCwKKwlzbmRfc29jX2RhcG1fcG9zdAogfTsKIAogc3RhdGljIGludCBkYXBtX3N0YXR1cyA9IDE7CkBAIC0xMzQsNiArMTM2LDI1IEBACiAJCX0KIAl9CiAJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OiB7CisJCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCXctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlOworCQlpbnQgdmFsLCBpdGVtOworCisJCXZhbCA9IHNuZF9zb2NfcmVhZCh3LT5jb2RlYywgZS0+cmVnKTsKKwkJdmFsID0gKHZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBlLT5tYXg7IGl0ZW0rKykgeworCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbaXRlbV0pCisJCQkJYnJlYWs7CisJCX0KKworCQlwLT5jb25uZWN0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGUtPm1heDsgaSsrKSB7CisJCQlpZiAoIShzdHJjbXAocC0+bmFtZSwgZS0+dGV4dHNbaV0pKSAmJiBpdGVtID09IGkpCisJCQkJcC0+Y29ubmVjdCA9IDE7CisJCX0KKwl9CisJYnJlYWs7CiAJLyogZG9lcyBub3QgZWZmZWN0IHJvdXRpbmcgLSBhbHdheXMgY29ubmVjdGVkICovCiAJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgogCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKQEAgLTE3OSw2ICsyMDAsMzAgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorLyogY29ubmVjdCB2YWx1ZV9tdXggd2lkZ2V0IHRvIGl0J3MgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCitzdGF0aWMgaW50IGRhcG1fY29ubmVjdF92YWx1ZV9tdXgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzcmMsIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkZXN0LAorCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aCwgY29uc3QgY2hhciAqY29udHJvbF9uYW1lLAorCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbCkKK3sKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlLT5tYXg7IGkrKykgeworCQlpZiAoIShzdHJjbXAoY29udHJvbF9uYW1lLCBlLT50ZXh0c1tpXSkpKSB7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmNvZGVjLT5kYXBtX3BhdGhzKTsKKwkJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NpbmssICZkZXN0LT5zb3VyY2VzKTsKKwkJCWxpc3RfYWRkKCZwYXRoLT5saXN0X3NvdXJjZSwgJnNyYy0+c2lua3MpOworCQkJcGF0aC0+bmFtZSA9IChjaGFyICopZS0+dGV4dHNbaV07CisJCQlkYXBtX3NldF9wYXRoX3N0YXR1cyhkZXN0LCBwYXRoLCAwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIC8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0J3MgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCiBzdGF0aWMgaW50IGRhcG1fY29ubmVjdF9taXhlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNyYywgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRlc3QsCkBAIC02NTMsNiArNjk4LDcgQEAKIAkJY2FzZSBzbmRfc29jX2RhcG1fdm1pZDoKIAkJCWNvbnRpbnVlOwogCQljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CisJCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgogCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgpAQCAtNzI4LDYgKzc3NCw0NSBAQAogCXJldHVybiAwOwogfQogCisvKiB0ZXN0IGFuZCB1cGRhdGUgdGhlIHBvd2VyIHN0YXR1cyBvZiBhIHZhbHVlX211eCB3aWRnZXQgKi8KK3N0YXRpYyBpbnQgZGFwbV92YWx1ZV9tdXhfdXBkYXRlX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCisJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgbWFzaywKKwkJCQkgaW50IG11eCwgaW50IHZhbCwgc3RydWN0IHNvY192YWx1ZV9lbnVtICplKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKHdpZGdldC0+aWQgIT0gc25kX3NvY19kYXBtX3ZhbHVlX211eCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXNuZF9zb2NfdGVzdF9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBmaW5kIGRhcG0gd2lkZ2V0IHBhdGggYXNzb2Mgd2l0aCBrY29udHJvbCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+Y29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpIHsKKwkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQorCQkJY29udGludWU7CisKKwkJaWYgKCFwYXRoLT5uYW1lIHx8ICFlLT50ZXh0c1ttdXhdKQorCQkJY29udGludWU7CisKKwkJZm91bmQgPSAxOworCQkvKiB3ZSBub3cgbmVlZCB0byBtYXRjaCB0aGUgc3RyaW5nIGluIHRoZSBlbnVtIHRvIHRoZSBwYXRoICovCisJCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1ttdXhdKSkpCisJCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KKwkJZWxzZQorCQkJcGF0aC0+Y29ubmVjdCA9IDA7IC8qIG9sZCBjb25uZWN0aW9uIG11c3QgYmUKKwkJCQkJICAgICAgcG93ZXJlZCBkb3duICovCisJfQorCisJaWYgKGZvdW5kKSB7CisJCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJCWR1bXBfZGFwbSh3aWRnZXQtPmNvZGVjLCAibXV4IHBvd2VyIHVwZGF0ZSIpOworCX0KKworCXJldHVybiAwOworfQorCiAvKiB0ZXN0IGFuZCB1cGRhdGUgdGhlIHBvd2VyIHN0YXR1cyBvZiBhIG1peGVyIG9yIHN3aXRjaCB3aWRnZXQgKi8KIHN0YXRpYyBpbnQgZGFwbV9taXhlcl91cGRhdGVfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCwKIAkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IHJlZywKQEAgLTk2NSw2ICsxMDUwLDEyIEBACiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gZXJyOwogCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CisJCXJldCA9IGRhcG1fY29ubmVjdF92YWx1ZV9tdXgoY29kZWMsIHdzb3VyY2UsIHdzaW5rLCBwYXRoLAorCQkJY29udHJvbCwgJndzaW5rLT5rY29udHJvbHNbMF0pOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGVycjsKKwkJYnJlYWs7CiAJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgogCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgogCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbWl4ZXIoY29kZWMsIHdzb3VyY2UsIHdzaW5rLCBwYXRoLCBjb250cm9sKTsKQEAgLTEwNDcsNiArMTEzOCw3IEBACiAJCQlkYXBtX25ld19taXhlcihjb2RlYywgdyk7CiAJCQlicmVhazsKIAkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCQlkYXBtX25ld19tdXgoY29kZWMsIHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKQEAgLTEyNzQsNiArMTM2NiwxMDUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUpOwogCiAvKioKKyAqIHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUgLSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgZ2V0CisgKgkJCQkJY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGNvbnRyb2wuCisgKgorICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKKyAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCByZWdfdmFsLCB2YWwsIG11eDsKKworCXJlZ192YWwgPSBzbmRfc29jX3JlYWQod2lkZ2V0LT5jb2RlYywgZS0+cmVnKTsKKwl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7CisJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCisJCQlicmVhazsKKwl9CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG11eDsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKKwkJZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7CisJCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQorCQkJCWJyZWFrOworCQl9CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSBtdXg7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCisgKiBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlIC0gZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHNldAorICoJCQkJCWNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBjb250cm9sLgorICoKKyAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCisgKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQorCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgdmFsLCBtdXg7CisJdW5zaWduZWQgc2hvcnQgbWFzazsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwl2YWwgPSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXV0gPDwgZS0+c2hpZnRfbDsKKwltYXNrID0gZS0+bWFzayA8PCBlLT5zaGlmdF9sOworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSBlLT52YWx1ZXNbdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXV0gPDwgZS0+c2hpZnRfcjsKKwkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CisJfQorCisJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOworCXdpZGdldC0+dmFsdWUgPSB2YWw7CisJZGFwbV92YWx1ZV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsIG1hc2ssIG11eCwgdmFsLCBlKTsKKwlpZiAod2lkZ2V0LT5ldmVudCkgeworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUkVHKSB7CisJCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwKKwkJCQlrY29udHJvbCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisJCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BPU1RfUkVHKQorCQkJcmV0ID0gd2lkZ2V0LT5ldmVudCh3aWRnZXQsCisJCQkJa2NvbnRyb2wsIFNORF9TT0NfREFQTV9QT1NUX1JFRyk7CisJfSBlbHNlCisJCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKICAqIHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbCAtIGNyZWF0ZSBuZXcgZGFwbSBjb250cm9sCiAgKiBAY29kZWM6IGF1ZGlvIGNvZGVjCiAgKiBAd2lkZ2V0OiB3aWRnZXQgdGVtcGxhdGUK